ZGlmZiAtLWdpdCBhL0NSRURJVFMgYi9DUkVESVRTCmluZGV4IDZiZDhhYjguLmQ3MTQwMzAgMTAwNjQ0Ci0tLSBhL0NSRURJVFMKKysrIGIvQ1JFRElUUwpAQCAtMzE3LDYgKzMxNywxMiBAQAogUzogU2VhdHRsZSwgV2FzaGluZ3RvbiA5ODEyNi0yMDEwCiBTOiBVU0EKIAorTjogSm9oYW5uZXMgQmVyZworRTogam9oYW5uZXNAc2lwc29sdXRpb25zLm5ldAorVzogaHR0cDovL2pvaGFubmVzLnNpcHNvbHV0aW9ucy5uZXQvCitQOiAxMDI0RC85QUI3OENBNSBBRDAyIDAxNzYgNEUyOSBDMTM3IDFERjYgMDhEMiBGQzQ0IENGODYgOUFCNyA4Q0E1CitEOiBwb3dlcnBjICYgODAyLjExIGhhY2tlcgorCiBOOiBTdGVwaGVuIFIuIHZhbiBkZW4gQmVyZyAoQUtBIEJ1R2xlc3MpCiBFOiBiZXJnQHBvb2wuaW5mb3JtYXRpay5yd3RoLWFhY2hlbi5kZQogRDogR2VuZXJhbCBrZXJuZWwsIGdjYywgYW5kIGxpYmMgaGFja2VyCkBAIC0yMjg2LDE0ICsyMjkyLDE0IEBACiBTOiBHZXJtYW55CiAKIE46IEFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbwotRTogYWNtZUBtYW5kcml2YS5jb20KIEU6IGFjbWVAZ2hvc3Rwcm90b2NvbHMubmV0CitFOiBhcm5hbGRvLm1lbG9AZ21haWwuY29tCitFOiBhY21lQHJlZGhhdC5jb20KIFc6IGh0dHA6Ly9vb3BzLmdob3N0cHJvdG9jb2xzLm5ldDo4MS9ibG9nLwogUDogMTAyNEQvOTIyNERGMDEgRDVERiBFM0JCIEUzQzggQkNCQiBGOEFEICA4NDFBIEI2QUIgNDY4MSA5MjI0IERGMDEKIEQ6IElQWCwgTExDLCBEQ0NQLCBjeWMyeCwgd2wzNTAxX2NzLCBuZXQvIGhhY2tzCi1TOiBNYW5kcml2YQotUzogUi4gVG9jYW50aW5zLCA4OSAtIENyaXN0byBSZWkKLVM6IDgwMDUwLTQzMCAtIEN1cml0aWJhIC0gUGFyYW7hCitTOiBSLiBCcmFz7WxpbyBJdGliZXLqLCA0MjcwLzEwMTAgLSDBZ3VhIFZlcmRlCitTOiA4MDI0MC0wNjAgLSBDdXJpdGliYSAtIFBhcmFu4QogUzogQnJhemlsCiAKIE46IEthcnN0ZW4gTWVya2VyCkBAIC0zMjk1LDYgKzMzMDEsMTQgQEAKIFM6IEJlYXZlcnRvbiwgT3JlZ29uIDk3MDA1CiBTOiBVU0EKIAorTjogTGkgWWFuZworRTogbGVvbGlAZnJlZXNjYWxlLmNvbQorRDogRnJlZXNjYWxlIEhpZ2hzcGVlZCBVU0IgZGV2aWNlIGRyaXZlcgorRDogRnJlZXNjYWxlIFFFIFNvQyBzdXBwb3J0IGFuZCBFdGhlcm5ldCBkcml2ZXIKK1M6IEItMTIwNiBKaW5nbWFvIEd1b2ppZ29uZ3l1CitTOiAxNiBCYWxpcWlhbyBOYW5qaWUsIEJlaWppbmcgMTAxMTAwCitTOiBQZW9wbGUncyBSZXB1bGljIG9mIENoaW5hCisKIE46IE1hcmNlbG8gVG9zYXR0aQogRTogbWFyY2Vsb0BrdmFjay5vcmcKIEQ6IHYyLjQga2VybmVsIG1haW50YWluZXIKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXVzYiBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXVzYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTkzN2FkCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1idXMtdXNiCkBAIC0wLDAgKzEsNDEgQEAKK1doYXQ6CQkvc3lzL2J1cy91c2IvZGV2aWNlcy8uLi4vcG93ZXIvYXV0b3N1c3BlbmQKK0RhdGU6CQlNYXJjaCAyMDA3CitLZXJuZWxWZXJzaW9uOgkyLjYuMjEKK0NvbnRhY3Q6CUFsYW4gU3Rlcm4gPHN0ZXJuQHJvd2xhbmQuaGFydmFyZC5lZHU+CitEZXNjcmlwdGlvbjoKKwkJRWFjaCBVU0IgZGV2aWNlIGRpcmVjdG9yeSB3aWxsIGNvbnRhaW4gYSBmaWxlIG5hbWVkCisJCXBvd2VyL2F1dG9zdXNwZW5kLiAgVGhpcyBmaWxlIGhvbGRzIHRoZSB0aW1lIChpbiBzZWNvbmRzKQorCQl0aGUgZGV2aWNlIG11c3QgYmUgaWRsZSBiZWZvcmUgaXQgd2lsbCBiZSBhdXRvc3VzcGVuZGVkLgorCQkwIG1lYW5zIHRoZSBkZXZpY2Ugd2lsbCBiZSBhdXRvc3VzcGVuZGVkIGFzIHNvb24gYXMKKwkJcG9zc2libGUuICBOZWdhdGl2ZSB2YWx1ZXMgd2lsbCBwcmV2ZW50IHRoZSBkZXZpY2UgZnJvbQorCQliZWluZyBhdXRvc3VzcGVuZGVkIGF0IGFsbCwgYW5kIHdyaXRpbmcgYSBuZWdhdGl2ZSB2YWx1ZQorCQl3aWxsIHJlc3VtZSB0aGUgZGV2aWNlIGlmIGl0IGlzIGFscmVhZHkgc3VzcGVuZGVkLgorCisJCVRoZSBhdXRvc3VzcGVuZCBkZWxheSBmb3IgbmV3bHktY3JlYXRlZCBkZXZpY2VzIGlzIHNldCB0bworCQl0aGUgdmFsdWUgb2YgdGhlIHVzYmNvcmUuYXV0b3N1c3BlbmQgbW9kdWxlIHBhcmFtZXRlci4KKworV2hhdDoJCS9zeXMvYnVzL3VzYi9kZXZpY2VzLy4uLi9wb3dlci9sZXZlbAorRGF0ZToJCU1hcmNoIDIwMDcKK0tlcm5lbFZlcnNpb246CTIuNi4yMQorQ29udGFjdDoJQWxhbiBTdGVybiA8c3Rlcm5Acm93bGFuZC5oYXJ2YXJkLmVkdT4KK0Rlc2NyaXB0aW9uOgorCQlFYWNoIFVTQiBkZXZpY2UgZGlyZWN0b3J5IHdpbGwgY29udGFpbiBhIGZpbGUgbmFtZWQKKwkJcG93ZXIvbGV2ZWwuICBUaGlzIGZpbGUgaG9sZHMgYSBwb3dlci1sZXZlbCBzZXR0aW5nIGZvcgorCQl0aGUgZGV2aWNlLCBvbmUgb2YgIm9uIiwgImF1dG8iLCBvciAic3VzcGVuZCIuCisKKwkJIm9uIiBtZWFucyB0aGF0IHRoZSBkZXZpY2UgaXMgbm90IGFsbG93ZWQgdG8gYXV0b3N1c3BlbmQsCisJCWFsdGhvdWdoIG5vcm1hbCBzdXNwZW5kcyBmb3Igc3lzdGVtIHNsZWVwIHdpbGwgc3RpbGwKKwkJYmUgaG9ub3JlZC4gICJhdXRvIiBtZWFucyB0aGUgZGV2aWNlIHdpbGwgYXV0b3N1c3BlbmQKKwkJYW5kIGF1dG9yZXN1bWUgaW4gdGhlIHVzdWFsIG1hbm5lciwgYWNjb3JkaW5nIHRvIHRoZQorCQljYXBhYmlsaXRpZXMgb2YgaXRzIGRyaXZlci4gICJzdXNwZW5kIiBtZWFucyB0aGUgZGV2aWNlCisJCWlzIGZvcmNlZCBpbnRvIGEgc3VzcGVuZGVkIHN0YXRlIGFuZCBpdCB3aWxsIG5vdCBhdXRvcmVzdW1lCisJCWluIHJlc3BvbnNlIHRvIEkvTyByZXF1ZXN0cy4gIEhvd2V2ZXIgcmVtb3RlLXdha2V1cCByZXF1ZXN0cworCQlmcm9tIHRoZSBkZXZpY2UgbWF5IHN0aWxsIGJlIGVuYWJsZWQgKHRoZSByZW1vdGUtd2FrZXVwCisJCXNldHRpbmcgaXMgY29udHJvbGxlZCBzZXBhcmF0ZWx5IGJ5IHRoZSBwb3dlci93YWtldXAKKwkJYXR0cmlidXRlKS4KKworCQlEdXJpbmcgbm9ybWFsIHVzZSwgZGV2aWNlcyBzaG91bGQgYmUgbGVmdCBpbiB0aGUgImF1dG8iCisJCWxldmVsLiAgVGhlIG90aGVyIGxldmVscyBhcmUgbWVhbnQgZm9yIGFkbWluaXN0cmF0aXZlIHVzZXMuCisJCUlmIHlvdSB3YW50IHRvIHN1c3BlbmQgYSBkZXZpY2UgaW1tZWRpYXRlbHkgYnV0IGxlYXZlIGl0CisJCWZyZWUgdG8gd2FrZSB1cCBpbiByZXNwb25zZSB0byBJL08gcmVxdWVzdHMsIHlvdSBzaG91bGQKKwkJd3JpdGUgIjAiIHRvIHBvd2VyL2F1dG9zdXNwZW5kLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2tlcm5lbC1hcGkudG1wbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9rZXJuZWwtYXBpLnRtcGwKaW5kZXggMGJiOTAyMy4uYjYxZGZjNyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2tlcm5lbC1hcGkudG1wbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2sva2VybmVsLWFwaS50bXBsCkBAIC0yMzYsNiArMjM2LDEyIEBACiAhRW5ldC9jb3JlL2Rldi5jCiAhRW5ldC9ldGhlcm5ldC9ldGguYwogIUlpbmNsdWRlL2xpbnV4L2V0aGVyZGV2aWNlLmgKKyFFZHJpdmVycy9uZXQvcGh5L3BoeS5jCishSWRyaXZlcnMvbmV0L3BoeS9waHkuYworIUVkcml2ZXJzL25ldC9waHkvcGh5X2RldmljZS5jCishSWRyaXZlcnMvbmV0L3BoeS9waHlfZGV2aWNlLmMKKyFFZHJpdmVycy9uZXQvcGh5L21kaW9fYnVzLmMKKyFJZHJpdmVycy9uZXQvcGh5L21kaW9fYnVzLmMKIDwhLS0gRklYTUU6IFJlbW92ZWQgZm9yIG5vdyBzaW5jZSBubyBzdHJ1Y3R1cmVkIGNvbW1lbnRzIGluIHNvdXJjZQogWCFFbmV0L2NvcmUvd2lyZWxlc3MuYwogLS0+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHQgYi9Eb2N1bWVudGF0aW9uL2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHQKaW5kZXggMTliNGM5Ni4uMWE5ZTYwMCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9mZWF0dXJlLXJlbW92YWwtc2NoZWR1bGUudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZmVhdHVyZS1yZW1vdmFsLXNjaGVkdWxlLnR4dApAQCAtNiw2ICs2LDE4IEBACiAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCitXaGF0OglWNEwyIFZJRElPQ19HX01QRUdDT01QIGFuZCBWSURJT0NfU19NUEVHQ09NUAorV2hlbjoJT2N0b2JlciAyMDA3CitXaHk6CUJyb2tlbiBhdHRlbXB0IHRvIHNldCBNUEVHIGNvbXByZXNzaW9uIHBhcmFtZXRlcnMuIFRoZXNlIGlvY3RscyBhcmUKKwlub3QgYWJsZSB0byBpbXBsZW1lbnQgdGhlIHdpZGUgdmFyaWV0eSBvZiBwYXJhbWV0ZXJzIHRoYXQgY2FuIGJlIHNldAorCWJ5IGhhcmR3YXJlIE1QRUcgZW5jb2RlcnMuIEEgbmV3IE1QRUcgY29udHJvbCBtZWNoYW5pc20gd2FzIGNyZWF0ZWQKKwlpbiBrZXJuZWwgMi42LjE4IHRoYXQgcmVwbGFjZXMgdGhlc2UgaW9jdGxzLiBTZWUgdGhlIFY0TDIgc3BlY2lmaWNhdGlvbgorCShzZWN0aW9uIDEuOTogRXh0ZW5kZWQgY29udHJvbHMpIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoaXMgdG9waWMuCitXaG86CUhhbnMgVmVya3VpbCA8aHZlcmt1aWxAeHM0YWxsLm5sPiBhbmQKKwlNYXVybyBDYXJ2YWxobyBDaGVoYWIgPG1jaGVoYWJAaW5mcmFkZWFkLm9yZz4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKIFdoYXQ6CS9zeXMvZGV2aWNlcy8uLi4vcG93ZXIvc3RhdGUKIAlkZXYtPnBvd2VyLnBvd2VyX3N0YXRlCiAJZHBtX3J1bnRpbWVfe3N1c3BlbmQscmVzdW1lKSgpCkBAIC0xMzQsMTUgKzE0Niw2IEBACiAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1XaGF0Ogltb3VudC91bW91bnQgdWV2ZW50cwotV2hlbjoJRmVicnVhcnkgMjAwNwotV2h5OglUaGVzZSBldmVudHMgYXJlIG5vdCBjb3JyZWN0LCBhbmQgZG8gbm90IHByb3Blcmx5IGxldCB1c2Vyc3BhY2Uga25vdwotCXdoZW4gYSBmaWxlIHN5c3RlbSBoYXMgYmVlbiBtb3VudGVkIG9yIHVubW91bnRlZC4gIFVzZXJzcGFjZSBzaG91bGQKLQlwb2xsIHRoZSAvcHJvYy9tb3VudHMgZmlsZSBpbnN0ZWFkIHRvIGRldGVjdCB0aGlzIHByb3Blcmx5LgotV2hvOglHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdraEBzdXNlLmRlPgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQogV2hhdDoJVVNCIGRyaXZlciBBUEkgbW92ZXMgdG8gRVhQT1JUX1NZTUJPTF9HUEwKIFdoZW46CUZlYnJ1YXJ5IDIwMDgKIEZpbGVzOglpbmNsdWRlL2xpbnV4L3VzYi5oLCBkcml2ZXJzL3VzYi9jb3JlL2RyaXZlci5jCkBAIC0yMTEsMTUgKzIxNCw2IEBACiAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1XaGF0OglJUHY0IG9ubHkgY29ubmVjdGlvbiB0cmFja2luZy9OQVQvaGVscGVycwotV2hlbjoJMi42LjIyCi1XaHk6CVRoZSBuZXcgbGF5ZXIgMyBpbmRlcGVuZGFudCBjb25uZWN0aW9uIHRyYWNraW5nIHJlcGxhY2VzIHRoZSBvbGQKLQlJUHY0IG9ubHkgdmVyc2lvbi4gQWZ0ZXIgc29tZSBzdGFiaWxpemF0aW9uIG9mIHRoZSBuZXcgY29kZSB0aGUKLQlvbGQgb25lIHdpbGwgYmUgcmVtb3ZlZC4KLVdobzoJUGF0cmljayBNY0hhcmR5IDxrYWJlckB0cmFzaC5uZXQ+Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCiBXaGF0OglBQ1BJIGhvb2tzIChYODZfU1BFRURTVEVQX0NFTlRSSU5PX0FDUEkpIGluIHNwZWVkc3RlcC1jZW50cmlubyBkcml2ZXIKIFdoZW46CURlY2VtYmVyIDIwMDYKIFdoeToJU3BlZWRzdGVwLWNlbnRyaW5vIGRyaXZlciB3aXRoIEFDUEkgaG9va3MgYW5kIGFjcGktY3B1ZnJlcSBkcml2ZXIgYXJlCkBAIC0yOTQsMTggKzI4OCw2IEBACiAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1XaGF0OglXaXJlbGVzcyBleHRlbnNpb25zIG92ZXIgbmV0bGluayAoQ09ORklHX05FVF9XSVJFTEVTU19SVE5FVExJTkspCi1XaGVuOgl3aXRoIHRoZSBtZXJnZSBvZiB3aXJlbGVzcy1kZXYsIDIuNi4yMiBvciBsYXRlcgotV2h5OglUaGUgb3B0aW9uL2NvZGUgaXMKLQkgKiBub3QgZW5hYmxlZCBvbiBtb3N0IGtlcm5lbHMKLQkgKiBub3QgcmVxdWlyZWQgYnkgYW55IHVzZXJzcGFjZSB0b29scyAoZXhjZXB0IGFuIGV4cGVyaW1lbnRhbCBvbmUsCi0JICAgYW5kIGV2ZW4gdGhlcmUgb25seSBmb3Igc29tZSBwYXJ0cywgb3RoZXJzIHVzZSBpb2N0bCkKLQkgKiBwb2ludGxlc3Mgc2luY2Ugd2V4dCBpcyBubyBsb25nZXIgZXZvbHZpbmcgYW5kIHRoZSBpb2N0bAotCSAgIGludGVyZmFjZSBuZWVkcyB0byBiZSBrZXB0Ci1XaG86CUpvaGFubmVzIEJlcmcgPGpvaGFubmVzQHNpcHNvbHV0aW9ucy5uZXQ+Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCiBXaGF0OglpOHh4X3RjbyB3YXRjaGRvZyBkcml2ZXIKIFdoZW46CWluIDIuNi4yMgogV2h5Ogl0aGUgaTh4eF90Y28gd2F0Y2hkb2cgZHJpdmVyIGhhcyBiZWVuIHJlcGxhY2VkIGJ5IHRoZSBpVENPX3dkdApAQCAtMzEzLDMgKzI5NSwzOSBAQAogV2hvOglXaW0gVmFuIFNlYnJvZWNrIDx3aW1AaWd1YW5hLmJlPgogCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworV2hhdDoJTXVsdGlwYXRoIGNhY2hlZCByb3V0aW5nIHN1cHBvcnQgaW4gaXB2NAorV2hlbjoJaW4gMi42LjIzCitXaHk6CUNvZGUgd2FzIG1lcmdlZCwgdGhlbiBzdWJtaXR0ZXIgaW1tZWRpYXRlbHkgZGlzYXBwZWFyZWQgbGVhdmluZworCXVzIHdpdGggbm8gbWFpbnRhaW5lciBhbmQgbG90cyBvZiBidWdzLiAgVGhlIGNvZGUgc2hvdWxkIG5vdCBoYXZlCisJYmVlbiBtZXJnZWQgaW4gdGhlIGZpcnN0IHBsYWNlLCBhbmQgbWFueSBhc3BlY3RzIG9mIGl0J3MKKwlpbXBsZW1lbnRhdGlvbiBhcmUgYmxvY2tpbmcgbW9yZSBjcml0aWNhbCBjb3JlIG5ldHdvcmtpbmcKKwlkZXZlbG9wbWVudC4gIEl0J3MgbWFya2VkIEVYUEVSSU1FTlRBTCBhbmQgbm8gZGlzdHJpYnV0aW9uCisJZW5hYmxlcyBpdCBiZWNhdXNlIGl0IGNhdXNlIG9ic2N1cmUgY3Jhc2hlcyBkdWUgdG8gdW5maXhhYmxlIGJ1Z3MKKwkoaW50ZXJmYWNlcyBkb24ndCByZXR1cm4gZXJyb3JzIHNvIG1lbW9yeSBhbGxvY2F0aW9uIGNhbid0IGJlCisJaGFuZGxlZCwgY2FsbGluZyBjb250ZXh0cyBvZiB0aGVzZSBpbnRlcmZhY2VzIG1ha2UgaGFuZGxpbmcKKwllcnJvcnMgaW1wb3NzaWJsZSB0b28gYmVjYXVzZSB0aGV5IGdldCBjYWxsZWQgYWZ0ZXIgd2UndmUKKwl0b3RhbGx5IGNvbW1pdGVkIHRvIGNyZWF0aW5nIGEgcm91dGUgb2JqZWN0LCBmb3IgZXhhbXBsZSkuCisJVGhpcyBwcm9ibGVtIGhhcyBleGlzdGVkIGZvciB5ZWFycyBhbmQgbm8gZm9yd2FyZCBwcm9ncmVzcworCWhhcyBldmVyIGJlZW4gbWFkZSwgYW5kIG5vYm9keSBzdGVwcyB1cCB0byB0cnkgYW5kIHNhbHZhZ2UKKwl0aGlzIGNvZGUsIHNvIHdlJ3JlIGdvaW5nIHRvIGZpbmFsbHkganVzdCBnZXQgcmlkIG9mIGl0LgorV2hvOglEYXZpZCBTLiBNaWxsZXIgPGRhdmVtQGRhdmVtbG9mdC5uZXQ+CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitXaGF0OglyZWFkX2Rldl9jaGFycygpLCByZWFkX2NvbmZfZGF0YXssX2xwbX0oKSAoczM5MCBjb21tb24gSS9PIGxheWVyKQorV2hlbjoJRGVjZW1iZXIgMjAwNworV2h5OglUaGVzZSBmdW5jdGlvbnMgYXJlIGEgbGVmdG92ZXIgZnJvbSAyLjQgdGltZXMuIFRoZXkgaGF2ZSBzZXZlcmFsCisJcHJvYmxlbXM6CisJLSBEdXBsaWNhdGlvbiBvZiBjaGVja3MgdGhhdCBhcmUgZG9uZSBpbiB0aGUgZGV2aWNlIGRyaXZlcidzCisJICBpbnRlcnJ1cHQgaGFuZGxlcgorCS0gY29tbW9uIEkvTyBsYXllciBjYW4ndCBkbyBkZXZpY2Ugc3BlY2lmaWMgZXJyb3IgcmVjb3ZlcnkKKwktIGRldmljZSBkcml2ZXIgY2FuJ3QgYmUgbm90aWZpZWQgZm9yIGNvbmRpdGlvbnMgaGFwcGVuaW5nIGR1cmluZworCSAgZXhlY3V0aW9uIG9mIHRoZSBmdW5jdGlvbgorCURldmljZSBkcml2ZXJzIHNob3VsZCBpc3N1ZSB0aGUgcmVhZCBkZXZpY2UgY2hhcmFjdGVyaXN0aWNzIGFuZCByZWFkCisJY29uZmlndXJhdGlvbiBkYXRhIGNjd3MgYW5kIGRvIHRoZSBhcHByb3ByaWF0ZSBlcnJvciBoYW5kbGluZworCXRoZW1zZWx2ZXMuCitXaG86CUNvcm5lbGlhIEh1Y2sgPGNvcm5lbGlhLmh1Y2tAZGUuaWJtLmNvbT4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvYWZzLnR4dCBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvYWZzLnR4dAppbmRleCAyZjQyMzdkLi4xMmFkNmM3IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2Fmcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9hZnMudHh0CkBAIC0xLDMxICsxLDgyIEBACisJCQkgICAgID09PT09PT09PT09PT09PT09PT09CiAJCQkgICAgIGtBRlM6IEFGUyBGSUxFU1lTVEVNCiAJCQkgICAgID09PT09PT09PT09PT09PT09PT09CiAKLUFCT1VUCitDb250ZW50czoKKworIC0gT3ZlcnZpZXcuCisgLSBVc2FnZS4KKyAtIE1vdW50cG9pbnRzLgorIC0gUHJvYyBmaWxlc3lzdGVtLgorIC0gVGhlIGNlbGwgZGF0YWJhc2UuCisgLSBTZWN1cml0eS4KKyAtIEV4YW1wbGVzLgorCisKKz09PT09PT09CitPVkVSVklFVworPT09PT09PT0KKworVGhpcyBmaWxlc3lzdGVtIHByb3ZpZGVzIGEgZmFpcmx5IHNpbXBsZSBzZWN1cmUgQUZTIGZpbGVzeXN0ZW0gZHJpdmVyLiBJdCBpcwordW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGRvZXMgbm90IHlldCBwcm92aWRlIHRoZSBmdWxsIGZlYXR1cmUgc2V0LiAgVGhlIGZlYXR1cmVzCitpdCBkb2VzIHN1cHBvcnQgaW5jbHVkZToKKworICgqKSBTZWN1cml0eSAoY3VycmVudGx5IG9ubHkgQUZTIGthc2VydmVyIGFuZCBLZXJiZXJvc0lWIHRpY2tldHMpLgorCisgKCopIEZpbGUgcmVhZGluZy4KKworICgqKSBBdXRvbW91bnRpbmcuCisKK0l0IGRvZXMgbm90IHlldCBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgQUZTIGZlYXR1cmVzOgorCisgKCopIFdyaXRlIHN1cHBvcnQuCisKKyAoKikgTG9jYWwgY2FjaGluZy4KKworICgqKSBwaW9jdGwoKSBzeXN0ZW0gY2FsbC4KKworCis9PT09PT09PT09PQorQ09NUElMQVRJT04KKz09PT09PT09PT09CisKK1RoZSBmaWxlc3lzdGVtIHNob3VsZCBiZSBlbmFibGVkIGJ5IHR1cm5pbmcgb24gdGhlIGtlcm5lbCBjb25maWd1cmF0aW9uCitvcHRpb25zOgorCisJQ09ORklHX0FGX1JYUlBDCQktIFRoZSBSeFJQQyBwcm90b2NvbCB0cmFuc3BvcnQKKwlDT05GSUdfUlhLQUQJCS0gVGhlIFJ4UlBDIEtlcmJlcm9zIHNlY3VyaXR5IGhhbmRsZXIKKwlDT05GSUdfQUZTCQktIFRoZSBBRlMgZmlsZXN5c3RlbQorCitBZGRpdGlvbmFsbHksIHRoZSBmb2xsb3dpbmcgY2FuIGJlIHR1cm5lZCBvbiB0byBhaWQgZGVidWdnaW5nOgorCisJQ09ORklHX0FGX1JYUlBDX0RFQlVHCS0gUGVybWl0IEFGX1JYUlBDIGRlYnVnZ2luZyB0byBiZSBlbmFibGVkCisJQ09ORklHX0FGU19ERUJVRwktIFBlcm1pdCBBRlMgZGVidWdnaW5nIHRvIGJlIGVuYWJsZWQKKworVGhleSBwZXJtaXQgdGhlIGRlYnVnZ2luZyBtZXNzYWdlcyB0byBiZSB0dXJuZWQgb24gZHluYW1pY2FsbHkgYnkgbWFuaXB1bGF0aW5nCit0aGUgbWFza3MgaW4gdGhlIGZvbGxvd2luZyBmaWxlczoKKworCS9zeXMvbW9kdWxlL2FmX3J4cnBjL3BhcmFtZXRlcnMvZGVidWcKKwkvc3lzL21vZHVsZS9hZnMvcGFyYW1ldGVycy9kZWJ1ZworCisKID09PT09Ci0KLVRoaXMgZmlsZXN5c3RlbSBwcm92aWRlcyBhIGZhaXJseSBzaW1wbGUgQUZTIGZpbGVzeXN0ZW0gZHJpdmVyLiBJdCBpcyB1bmRlcgotZGV2ZWxvcG1lbnQgYW5kIG9ubHkgcHJvdmlkZXMgdmVyeSBiYXNpYyBmYWNpbGl0aWVzLiBJdCBkb2VzIG5vdCB5ZXQgc3VwcG9ydAotdGhlIGZvbGxvd2luZyBBRlMgZmVhdHVyZXM6Ci0KLQkoKikgV3JpdGUgc3VwcG9ydC4KLQkoKikgQ29tbXVuaWNhdGlvbnMgc2VjdXJpdHkuCi0JKCopIExvY2FsIGNhY2hpbmcuCi0JKCopIHBpb2N0bCgpIHN5c3RlbSBjYWxsLgotCSgqKSBBdXRvbWF0aWMgbW91bnRpbmcgb2YgZW1iZWRkZWQgbW91bnRwb2ludHMuCi0KLQogVVNBR0UKID09PT09CiAKIFdoZW4gaW5zZXJ0aW5nIHRoZSBkcml2ZXIgbW9kdWxlcyB0aGUgcm9vdCBjZWxsIG11c3QgYmUgc3BlY2lmaWVkIGFsb25nIHdpdGggYQogbGlzdCBvZiB2b2x1bWUgbG9jYXRpb24gc2VydmVyIElQIGFkZHJlc3NlczoKIAotCWluc21vZCByeHJwYy5vCisJaW5zbW9kIGFmX3J4cnBjLm8KKwlpbnNtb2QgcnhrYWQubwogCWluc21vZCBrYWZzLm8gcm9vdGNlbGw9Y2FtYnJpZGdlLnJlZGhhdC5jb206MTcyLjE2LjE4LjczOjE3Mi4xNi4xOC45MQogCi1UaGUgZmlyc3QgbW9kdWxlIGlzIGEgZHJpdmVyIGZvciB0aGUgUnhSUEMgcmVtb3RlIG9wZXJhdGlvbiBwcm90b2NvbCwgYW5kIHRoZQotc2Vjb25kIGlzIHRoZSBhY3R1YWwgZmlsZXN5c3RlbSBkcml2ZXIgZm9yIHRoZSBBRlMgZmlsZXN5c3RlbS4KK1RoZSBmaXJzdCBtb2R1bGUgaXMgdGhlIEFGX1JYUlBDIG5ldHdvcmsgcHJvdG9jb2wgZHJpdmVyLiAgVGhpcyBwcm92aWRlcyB0aGUKK1J4UlBDIHJlbW90ZSBvcGVyYXRpb24gcHJvdG9jb2wgYW5kIG1heSBhbHNvIGJlIGFjY2Vzc2VkIGZyb20gdXNlcnNwYWNlLiAgU2VlOgorCisJRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3J4cnBjLnR4dAorCitUaGUgc2Vjb25kIG1vZHVsZSBpcyB0aGUga2VyYmVyb3MgUnhSUEMgc2VjdXJpdHkgZHJpdmVyLCBhbmQgdGhlIHRoaXJkIG1vZHVsZQoraXMgdGhlIGFjdHVhbCBmaWxlc3lzdGVtIGRyaXZlciBmb3IgdGhlIEFGUyBmaWxlc3lzdGVtLgogCiBPbmNlIHRoZSBtb2R1bGUgaGFzIGJlZW4gbG9hZGVkLCBtb3JlIG1vZHVsZXMgY2FuIGJlIGFkZGVkIGJ5IHRoZSBmb2xsb3dpbmcKIHByb2NlZHVyZToKQEAgLTMzLDcgKzg0LDcgQEAKIAllY2hvIGFkZCBncmFuZC5jZW50cmFsLm9yZyAxOC43LjE0Ljg4OjEyOC4yLjE5MS4yMjQgPi9wcm9jL2ZzL2Fmcy9jZWxscwogCiBXaGVyZSB0aGUgcGFyYW1ldGVycyB0byB0aGUgImFkZCIgY29tbWFuZCBhcmUgdGhlIG5hbWUgb2YgYSBjZWxsIGFuZCBhIGxpc3Qgb2YKLXZvbHVtZSBsb2NhdGlvbiBzZXJ2ZXJzIHdpdGhpbiB0aGF0IGNlbGwuCit2b2x1bWUgbG9jYXRpb24gc2VydmVycyB3aXRoaW4gdGhhdCBjZWxsLCB3aXRoIHRoZSBsYXR0ZXIgc2VwYXJhdGVkIGJ5IGNvbG9ucy4KIAogRmlsZXN5c3RlbXMgY2FuIGJlIG1vdW50ZWQgYW55d2hlcmUgYnkgY29tbWFuZHMgc2ltaWxhciB0byB0aGUgZm9sbG93aW5nOgogCkBAIC00MiwxMSArOTMsNiBAQAogCW1vdW50IC10IGFmcyAiI3Jvb3QuYWZzLiIgL2FmcwogCW1vdW50IC10IGFmcyAiI3Jvb3QuY2VsbC4iIC9hZnMvY2FtYnJpZGdlCiAKLSAgTkI6IFdoZW4gdXNpbmcgdGhpcyBvbiBMaW51eCAyLjQsIHRoZSBtb3VudCBjb21tYW5kIGhhcyB0byBiZSBkaWZmZXJlbnQsCi0gICAgICBzaW5jZSB0aGUgZmlsZXN5c3RlbSBkb2Vzbid0IGhhdmUgYWNjZXNzIHRvIHRoZSBkZXZpY2UgbmFtZSBhcmd1bWVudDoKLQotCW1vdW50IC10IGFmcyBub25lIC9hZnMgLW92b2w9IiNyb290LmFmcy4iCi0KIFdoZXJlIHRoZSBpbml0aWFsIGNoYXJhY3RlciBpcyBlaXRoZXIgYSBoYXNoIG9yIGEgcGVyY2VudCBzeW1ib2wgZGVwZW5kaW5nIG9uCiB3aGV0aGVyIHlvdSBkZWZpbml0ZWx5IHdhbnQgYSBSL1cgdm9sdW1lIChoYXNoKSBvciB3aGV0aGVyIHlvdSdkIHByZWZlciBhIFIvTwogdm9sdW1lLCBidXQgYXJlIHdpbGxpbmcgdG8gdXNlIGEgUi9XIHZvbHVtZSBpbnN0ZWFkIChwZXJjZW50KS4KQEAgLTYwLDU1ICsxMDYsNjYgQEAKIEFkZGl0aW9uYWwgY2VsbHMgY2FuIGJlIGFkZGVkIHRocm91Z2ggL3Byb2MgKHNlZSBsYXRlciBzZWN0aW9uKS4KIAogCis9PT09PT09PT09PQogTU9VTlRQT0lOVFMKID09PT09PT09PT09CiAKLUFGUyBoYXMgYSBjb25jZXB0IG9mIG1vdW50cG9pbnRzLiBUaGVzZSBhcmUgc3BlY2lhbGx5IGZvcm1hdHRlZCBzeW1ib2xpYyBsaW5rcwotKG9mIHRoZSBzYW1lIGZvcm0gYXMgdGhlICJkZXZpY2UgbmFtZSIgcGFzc2VkIHRvIG1vdW50KS4ga0FGUyBwcmVzZW50cyB0aGVzZQotdG8gdGhlIHVzZXIgYXMgZGlyZWN0b3JpZXMgdGhhdCBoYXZlIHNwZWNpYWwgcHJvcGVydGllczoKK0FGUyBoYXMgYSBjb25jZXB0IG9mIG1vdW50cG9pbnRzLiBJbiBBRlMgdGVybXMsIHRoZXNlIGFyZSBzcGVjaWFsbHkgZm9ybWF0dGVkCitzeW1ib2xpYyBsaW5rcyAob2YgdGhlIHNhbWUgZm9ybSBhcyB0aGUgImRldmljZSBuYW1lIiBwYXNzZWQgdG8gbW91bnQpLiAga0FGUworcHJlc2VudHMgdGhlc2UgdG8gdGhlIHVzZXIgYXMgZGlyZWN0b3JpZXMgdGhhdCBoYXZlIGEgZm9sbG93LWxpbmsgY2FwYWJpbGl0eQorKGllOiBzeW1ib2xpYyBsaW5rIHNlbWFudGljcykuICBJZiBhbnlvbmUgYXR0ZW1wdHMgdG8gYWNjZXNzIHRoZW0sIHRoZXkgd2lsbAorYXV0b21hdGljYWxseSBjYXVzZSB0aGUgdGFyZ2V0IHZvbHVtZSB0byBiZSBtb3VudGVkIChpZiBwb3NzaWJsZSkgb24gdGhhdCBzaXRlLgogCi0gICgqKSBUaGV5IGNhbm5vdCBiZSBsaXN0ZWQuIFJ1bm5pbmcgYSBwcm9ncmFtIGxpa2UgImxzIiBvbiB0aGVtIHdpbGwgaW5jdXIgYW4KLSAgICAgIEVSRU1PVEUgZXJyb3IgKE9iamVjdCBpcyByZW1vdGUpLgorQXV0b21hdGljYWxseSBtb3VudGVkIGZpbGVzeXN0ZW1zIHdpbGwgYmUgYXV0b21hdGljYWxseSB1bm1vdW50ZWQgYXBwcm94aW1hdGVseQordHdlbnR5IG1pbnV0ZXMgYWZ0ZXIgdGhleSB3ZXJlIGxhc3QgdXNlZC4gIEFsdGVybmF0aXZlbHkgdGhleSBjYW4gYmUgdW5tb3VudGVkCitkaXJlY3RseSB3aXRoIHRoZSB1bW91bnQoKSBzeXN0ZW0gY2FsbC4KIAotICAoKikgT3RoZXIgb2JqZWN0cyBjYW4ndCBiZSBsb29rZWQgdXAgaW5zaWRlIG9mIHRoZW0uIFRoaXMgYWxzbyBpbmN1cnMgYW4KLSAgICAgIEVSRU1PVEUgZXJyb3IuCitNYW51YWxseSB1bm1vdW50aW5nIGFuIEFGUyB2b2x1bWUgd2lsbCBjYXVzZSBhbnkgaWRsZSBzdWJtb3VudHMgdXBvbiBpdCB0byBiZQorY3VsbGVkIGZpcnN0LiAgSWYgYWxsIGFyZSBjdWxsZWQsIHRoZW4gdGhlIHJlcXVlc3RlZCB2b2x1bWUgd2lsbCBhbHNvIGJlCit1bm1vdW50ZWQsIG90aGVyd2lzZSBlcnJvciBFQlVTWSB3aWxsIGJlIHJldHVybmVkLgogCi0gICgqKSBUaGV5IGNhbiBiZSBxdWVyaWVkIHdpdGggdGhlIHJlYWRsaW5rKCkgc3lzdGVtIGNhbGwsIHdoaWNoIHdpbGwgcmV0dXJuCi0gICAgICB0aGUgbmFtZSBvZiB0aGUgbW91bnRwb2ludCB0byB3aGljaCB0aGV5IHBvaW50LiBUaGUgInJlYWRsaW5rIiBwcm9ncmFtCi0gICAgICB3aWxsIGFsc28gd29yay4KK1RoaXMgY2FuIGJlIHVzZWQgYnkgdGhlIGFkbWluaXN0cmF0b3IgdG8gYXR0ZW1wdCB0byB1bm1vdW50IHRoZSB3aG9sZSBBRlMgdHJlZQorbW91bnRlZCBvbiAvYWZzIGluIG9uZSBnbyBieSBkb2luZzoKIAotICAoKikgVGhleSBjYW4gYmUgbW91bnRlZCBvbiAod2hpY2ggc3ltYm9saWMgbGlua3MgY2FuJ3QpLgorCXVtb3VudCAvYWZzCiAKIAorPT09PT09PT09PT09PT09CiBQUk9DIEZJTEVTWVNURU0KID09PT09PT09PT09PT09PQogCi1UaGUgcnhycGMgbW9kdWxlIGNyZWF0ZXMgYSBudW1iZXIgb2YgZmlsZXMgaW4gdmFyaW91cyBwbGFjZXMgaW4gdGhlIC9wcm9jCi1maWxlc3lzdGVtOgotCi0gICgqKSBGaXJzdGx5LCBzb21lIGluZm9ybWF0aW9uIGZpbGVzIGFyZSBtYWRlIGF2YWlsYWJsZSBpbiBhIGRpcmVjdG9yeSBjYWxsZWQKLSAgICAgICIvcHJvYy9uZXQvcnhycGMvIi4gVGhlc2UgbGlzdCB0aGUgZXh0YW50IHRyYW5zcG9ydCBlbmRwb2ludCwgcGVlciwKLSAgICAgIGNvbm5lY3Rpb24gYW5kIGNhbGwgcmVjb3Jkcy4KLQotICAoKikgU2Vjb25kbHksIHNvbWUgY29udHJvbCBmaWxlcyBhcmUgbWFkZSBhdmFpbGFibGUgaW4gYSBkaXJlY3RvcnkgY2FsbGVkCi0gICAgICAiL3Byb2Mvc3lzL3J4cnBjLyIuIEN1cnJlbnRseSwgYWxsIHRoZXNlIGZpbGVzIGNhbiBiZSB1c2VkIGZvciBpcyB0bwotICAgICAgdHVybiBvbiB2YXJpb3VzIGxldmVscyBvZiB0cmFjaW5nLgotCiBUaGUgQUZTIG1vZHVsZXMgY3JlYXRlcyBhICIvcHJvYy9mcy9hZnMvIiBkaXJlY3RvcnkgYW5kIHBvcHVsYXRlcyBpdDoKIAotICAoKikgQSAiY2VsbHMiIGZpbGUgdGhhdCBsaXN0cyBjZWxscyBjdXJyZW50bHkga25vd24gdG8gdGhlIGFmcyBtb2R1bGUuCisgICgqKSBBICJjZWxscyIgZmlsZSB0aGF0IGxpc3RzIGNlbGxzIGN1cnJlbnRseSBrbm93biB0byB0aGUgYWZzIG1vZHVsZSBhbmQKKyAgICAgIHRoZWlyIHVzYWdlIGNvdW50czoKKworCVtyb290QGFuZHJvbWVkYSB+XSMgY2F0IC9wcm9jL2ZzL2Fmcy9jZWxscworCVVTRSBOQU1FCisJICAzIGNhbWJyaWRnZS5yZWRoYXQuY29tCiAKICAgKCopIEEgZGlyZWN0b3J5IHBlciBjZWxsIHRoYXQgY29udGFpbnMgZmlsZXMgdGhhdCBsaXN0IHZvbHVtZSBsb2NhdGlvbgogICAgICAgc2VydmVycywgdm9sdW1lcywgYW5kIGFjdGl2ZSBzZXJ2ZXJzIGtub3duIHdpdGhpbiB0aGF0IGNlbGwuCiAKKwlbcm9vdEBhbmRyb21lZGEgfl0jIGNhdCAvcHJvYy9mcy9hZnMvY2FtYnJpZGdlLnJlZGhhdC5jb20vc2VydmVycworCVVTRSBBRERSICAgICAgICAgICAgU1RBVEUKKwkgIDQgMTcyLjE2LjE4LjkxICAgICAgICAwCisJW3Jvb3RAYW5kcm9tZWRhIH5dIyBjYXQgL3Byb2MvZnMvYWZzL2NhbWJyaWRnZS5yZWRoYXQuY29tL3Zsc2VydmVycworCUFERFJFU1MKKwkxNzIuMTYuMTguOTEKKwlbcm9vdEBhbmRyb21lZGEgfl0jIGNhdCAvcHJvYy9mcy9hZnMvY2FtYnJpZGdlLnJlZGhhdC5jb20vdm9sdW1lcworCVVTRSBTVFQgVkxJRFswXSAgVkxJRFsxXSAgVkxJRFsyXSAgTkFNRQorCSAgMSBWYWwgMjAwMDAwMDAgMjAwMDAwMDEgMjAwMDAwMDIgcm9vdC5hZnMKIAorCis9PT09PT09PT09PT09PT09PQogVEhFIENFTEwgREFUQUJBU0UKID09PT09PT09PT09PT09PT09CiAKLVRoZSBmaWxlc3lzdGVtIG1haW50YWlucyBhbiBpbnRlcm5hbCBkYXRhYmFzZSBvZiBhbGwgdGhlIGNlbGxzIGl0IGtub3dzIGFuZAotdGhlIElQIGFkZHJlc3NlcyBvZiB0aGUgdm9sdW1lIGxvY2F0aW9uIHNlcnZlcnMgZm9yIHRob3NlIGNlbGxzLiBUaGUgY2VsbCB0bwotd2hpY2ggdGhlIGNvbXB1dGVyIGJlbG9uZ3MgaXMgYWRkZWQgdG8gdGhlIGRhdGFiYXNlIHdoZW4gaW5zbW9kIGlzIHBlcmZvcm1lZAotYnkgdGhlICJyb290Y2VsbD0iIGFyZ3VtZW50LgorVGhlIGZpbGVzeXN0ZW0gbWFpbnRhaW5zIGFuIGludGVybmFsIGRhdGFiYXNlIG9mIGFsbCB0aGUgY2VsbHMgaXQga25vd3MgYW5kIHRoZQorSVAgYWRkcmVzc2VzIG9mIHRoZSB2b2x1bWUgbG9jYXRpb24gc2VydmVycyBmb3IgdGhvc2UgY2VsbHMuICBUaGUgY2VsbCB0byB3aGljaAordGhlIHN5c3RlbSBiZWxvbmdzIGlzIGFkZGVkIHRvIHRoZSBkYXRhYmFzZSB3aGVuIGluc21vZCBpcyBwZXJmb3JtZWQgYnkgdGhlCisicm9vdGNlbGw9IiBhcmd1bWVudCBvciwgaWYgY29tcGlsZWQgaW4sIHVzaW5nIGEgImthZnMucm9vdGNlbGw9IiBhcmd1bWVudCBvbgordGhlIGtlcm5lbCBjb21tYW5kIGxpbmUuCiAKIEZ1cnRoZXIgY2VsbHMgY2FuIGJlIGFkZGVkIGJ5IGNvbW1hbmRzIHNpbWlsYXIgdG8gdGhlIGZvbGxvd2luZzoKIApAQCAtMTE4LDIwICsxNzUsNjUgQEAKIE5vIG90aGVyIGNlbGwgZGF0YWJhc2Ugb3BlcmF0aW9ucyBhcmUgYXZhaWxhYmxlIGF0IHRoaXMgdGltZS4KIAogCis9PT09PT09PQorU0VDVVJJVFkKKz09PT09PT09CisKK1NlY3VyZSBvcGVyYXRpb25zIGFyZSBpbml0aWF0ZWQgYnkgYWNxdWlyaW5nIGEga2V5IHVzaW5nIHRoZSBrbG9nIHByb2dyYW0uICBBCit2ZXJ5IHByaW1pdGl2ZSBrbG9nIHByb2dyYW0gaXMgYXZhaWxhYmxlIGF0OgorCisJaHR0cDovL3Blb3BsZS5yZWRoYXQuY29tL35kaG93ZWxscy9yeHJwYy9rbG9nLmMKKworVGhpcyBzaG91bGQgYmUgY29tcGlsZWQgYnk6CisKKwltYWtlIGtsb2cgTERMSUJTPSItbGNyeXB0byAtbGNyeXB0IC1sa3JiNCAtbGtleXV0aWxzIgorCitBbmQgdGhlbiBydW4gYXM6CisKKwkuL2tsb2cKKworQXNzdW1pbmcgaXQncyBzdWNjZXNzZnVsLCB0aGlzIGFkZHMgYSBrZXkgb2YgdHlwZSBSeFJQQywgbmFtZWQgZm9yIHRoZSBzZXJ2aWNlCithbmQgY2VsbCwgZWc6ICJhZnNAPGNlbGxuYW1lPiIuICBUaGlzIGNhbiBiZSB2aWV3ZWQgd2l0aCB0aGUga2V5Y3RsIHByb2dyYW0gb3IKK2J5IGNhdCdpbmcgL3Byb2Mva2V5czoKKworCVtyb290QGFuZHJvbWVkYSB+XSMga2V5Y3RsIHNob3cKKwlTZXNzaW9uIEtleXJpbmcKKwkgICAgICAgLTMgLS1hbHN3cnYgICAgICAwICAgICAwICBrZXlyaW5nOiBfc2VzLjMyNjgKKwkJMiAtLWFsc3dydiAgICAgIDAgICAgIDAgICBcXyBrZXlyaW5nOiBfdWlkLjAKKwkxMTE0MTY1NTMgLS1hbHMtLXYgICAgICAwICAgICAwICAgXF8gcnhycGM6IGFmc0BDQU1CUklER0UuUkVESEFULkNPTQorCitDdXJyZW50bHkgdGhlIHVzZXJuYW1lLCByZWFsbSwgcGFzc3dvcmQgYW5kIHByb3Bvc2VkIHRpY2tldCBsaWZldGltZSBhcmUKK2NvbXBpbGVkIGluIHRvIHRoZSBwcm9ncmFtLgorCitJdCBpcyBub3QgcmVxdWlyZWQgdG8gYWNxdWlyZSBhIGtleSBiZWZvcmUgdXNpbmcgQUZTIGZhY2lsaXRpZXMsIGJ1dCBpZiBvbmUgaXMKK25vdCBhY3F1aXJlZCB0aGVuIGFsbCBvcGVyYXRpb25zIHdpbGwgYmUgZ292ZXJuZWQgYnkgdGhlIGFub255bW91cyB1c2VyIHBhcnRzCitvZiB0aGUgQUNMcy4KKworSWYgYSBrZXkgaXMgYWNxdWlyZWQsIHRoZW4gYWxsIEFGUyBvcGVyYXRpb25zLCBpbmNsdWRpbmcgbW91bnRzIGFuZCBhdXRvbW91bnRzLAorbWFkZSBieSBhIHBvc3Nlc3NvciBvZiB0aGF0IGtleSB3aWxsIGJlIHNlY3VyZWQgd2l0aCB0aGF0IGtleS4KKworSWYgYSBmaWxlIGlzIG9wZW5lZCB3aXRoIGEgcGFydGljdWxhciBrZXkgYW5kIHRoZW4gdGhlIGZpbGUgZGVzY3JpcHRvciBpcworcGFzc2VkIHRvIGEgcHJvY2VzcyB0aGF0IGRvZXNuJ3QgaGF2ZSB0aGF0IGtleSAocGVyaGFwcyBvdmVyIGFuIEFGX1VOSVgKK3NvY2tldCksIHRoZW4gdGhlIG9wZXJhdGlvbnMgb24gdGhlIGZpbGUgd2lsbCBiZSBtYWRlIHdpdGgga2V5IHRoYXQgd2FzIHVzZWQgdG8KK29wZW4gdGhlIGZpbGUuCisKKworPT09PT09PT0KIEVYQU1QTEVTCiA9PT09PT09PQogCi1IZXJlJ3Mgd2hhdCBJIHVzZSB0byB0ZXN0IHRoaXMuIFNvbWUgb2YgdGhlIG5hbWVzIGFuZCBJUCBhZGRyZXNzZXMgYXJlIGxvY2FsCi10byBteSBpbnRlcm5hbCBETlMuIE15ICJyb290LmFmcyIgcGFydGl0aW9uIGhhcyBhIG1vdW50IHBvaW50IHdpdGhpbiBpdCBmb3IKK0hlcmUncyB3aGF0IEkgdXNlIHRvIHRlc3QgdGhpcy4gIFNvbWUgb2YgdGhlIG5hbWVzIGFuZCBJUCBhZGRyZXNzZXMgYXJlIGxvY2FsCit0byBteSBpbnRlcm5hbCBETlMuICBNeSAicm9vdC5hZnMiIHBhcnRpdGlvbiBoYXMgYSBtb3VudCBwb2ludCB3aXRoaW4gaXQgZm9yCiBzb21lIHB1YmxpYyB2b2x1bWVzIHZvbHVtZXMuCiAKLWluc21vZCAtUyAvdG1wL3J4cnBjLm8gCi1pbnNtb2QgLVMgL3RtcC9rYWZzLm8gcm9vdGNlbGw9Y2FtYnJpZGdlLnJlZGhhdC5jb206MTcyLjE2LjE4LjczOjE3Mi4xNi4xOC45MQoraW5zbW9kIC90bXAvcnhycGMubworaW5zbW9kIC90bXAvcnhrYWQubworaW5zbW9kIC90bXAva2Fmcy5vIHJvb3RjZWxsPWNhbWJyaWRnZS5yZWRoYXQuY29tOjE3Mi4xNi4xOC45MQogCiBtb3VudCAtdCBhZnMgXCVyb290LmFmcy4gL2FmcwogbW91bnQgLXQgYWZzIFwlY2FtYnJpZGdlLnJlZGhhdC5jb206cm9vdC5jZWxsLiAvYWZzL2NhbWJyaWRnZS5yZWRoYXQuY29tLwogCi1lY2hvIGFkZCBncmFuZC5jZW50cmFsLm9yZyAxOC43LjE0Ljg4OjEyOC4yLjE5MS4yMjQgPiAvcHJvYy9mcy9hZnMvY2VsbHMgCitlY2hvIGFkZCBncmFuZC5jZW50cmFsLm9yZyAxOC43LjE0Ljg4OjEyOC4yLjE5MS4yMjQgPiAvcHJvYy9mcy9hZnMvY2VsbHMKIG1vdW50IC10IGFmcyAiI2dyYW5kLmNlbnRyYWwub3JnOnJvb3QuY2VsbC4iIC9hZnMvZ3JhbmQuY2VudHJhbC5vcmcvCiBtb3VudCAtdCBhZnMgIiNncmFuZC5jZW50cmFsLm9yZzpyb290LmFyY2hpdmUuIiAvYWZzL2dyYW5kLmNlbnRyYWwub3JnL2FyY2hpdmUKIG1vdW50IC10IGFmcyAiI2dyYW5kLmNlbnRyYWwub3JnOnJvb3QuY29udHJpYi4iIC9hZnMvZ3JhbmQuY2VudHJhbC5vcmcvY29udHJpYgpAQCAtMTQxLDE1ICsyNDMsNyBAQAogbW91bnQgLXQgYWZzICIjZ3JhbmQuY2VudHJhbC5vcmc6cm9vdC5zb2Z0d2FyZS4iIC9hZnMvZ3JhbmQuY2VudHJhbC5vcmcvc29mdHdhcmUKIG1vdW50IC10IGFmcyAiI2dyYW5kLmNlbnRyYWwub3JnOnJvb3QudXNlci4iIC9hZnMvZ3JhbmQuY2VudHJhbC5vcmcvdXNlcgogCi11bW91bnQgL2Fmcy9ncmFuZC5jZW50cmFsLm9yZy91c2VyCi11bW91bnQgL2Fmcy9ncmFuZC5jZW50cmFsLm9yZy9zb2Z0d2FyZQotdW1vdW50IC9hZnMvZ3JhbmQuY2VudHJhbC5vcmcvc2VydmljZQotdW1vdW50IC9hZnMvZ3JhbmQuY2VudHJhbC5vcmcvcHJvamVjdAotdW1vdW50IC9hZnMvZ3JhbmQuY2VudHJhbC5vcmcvZG9jCi11bW91bnQgL2Fmcy9ncmFuZC5jZW50cmFsLm9yZy9jb250cmliCi11bW91bnQgL2Fmcy9ncmFuZC5jZW50cmFsLm9yZy9hcmNoaXZlCi11bW91bnQgL2Fmcy9ncmFuZC5jZW50cmFsLm9yZwotdW1vdW50IC9hZnMvY2FtYnJpZGdlLnJlZGhhdC5jb20KIHVtb3VudCAvYWZzCiBybW1vZCBrYWZzCitybW1vZCByeGthZAogcm1tb2QgcnhycGMKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvcHJvYy50eHQgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3Byb2MudHh0CmluZGV4IDU0ODRhYjUuLjdhYWYwOWIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvcHJvYy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9wcm9jLnR4dApAQCAtMTQyMSw2ICsxNDIxLDE1IEBACiBiZSBkcm9wcGVkLiAgVGhlICBkZWZhdWx0ICBzZXR0aW5ncyAgbGltaXQgIHdhcm5pbmcgbWVzc2FnZXMgdG8gb25lIGV2ZXJ5IGZpdmUKIHNlY29uZHMuCiAKK3dhcm5pbmdzCistLS0tLS0tLQorCitUaGlzIGNvbnRyb2xzIGNvbnNvbGUgbWVzc2FnZXMgZnJvbSB0aGUgbmV0d29ya2luZyBzdGFjayB0aGF0IGNhbiBvY2N1ciBiZWNhdXNlCitvZiBwcm9ibGVtcyBvbiB0aGUgbmV0d29yayBsaWtlIGR1cGxpY2F0ZSBhZGRyZXNzIG9yIGJhZCBjaGVja3N1bXMuIE5vcm1hbGx5LAordGhpcyBzaG91bGQgYmUgZW5hYmxlZCwgYnV0IGlmIHRoZSBwcm9ibGVtIHBlcnNpc3RzIHRoZSBtZXNzYWdlcyBjYW4gYmUKK2Rpc2FibGVkLgorCisKIG5ldGRldl9tYXhfYmFja2xvZwogLS0tLS0tLS0tLS0tLS0tLS0tCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaW5maW5pYmFuZC91c2VyX21hZC50eHQgYi9Eb2N1bWVudGF0aW9uL2luZmluaWJhbmQvdXNlcl9tYWQudHh0CmluZGV4IDc1MGZlNWUuLjhlYzU0YjkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaW5maW5pYmFuZC91c2VyX21hZC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9pbmZpbmliYW5kL3VzZXJfbWFkLnR4dApAQCAtOTEsNiArOTEsMTQgQEAKIAlpZiAocmV0ICE9IHNpemVvZiAqbWFkICsgbWFkX2xlbmd0aCkKIAkJcGVycm9yKCJ3cml0ZSIpOwogCitUcmFuc2FjdGlvbiBJRHMKKworICBVc2VycyBvZiB0aGUgdW1hZCBkZXZpY2VzIGNhbiB1c2UgdGhlIGxvd2VyIDMyIGJpdHMgb2YgdGhlCisgIHRyYW5zYWN0aW9uIElEIGZpZWxkICh0aGF0IGlzLCB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgaGFsZiBvZiB0aGUKKyAgZmllbGQgaW4gbmV0d29yayBieXRlIG9yZGVyKSBpbiBNQURzIGJlaW5nIHNlbnQgdG8gbWF0Y2gKKyAgcmVxdWVzdC9yZXNwb25zZSBwYWlycy4gIFRoZSB1cHBlciAzMiBiaXRzIGFyZSByZXNlcnZlZCBmb3IgdXNlIGJ5CisgIHRoZSBrZXJuZWwgYW5kIHdpbGwgYmUgb3ZlcndyaXR0ZW4gYmVmb3JlIGEgTUFEIGlzIHNlbnQuCisKIFNldHRpbmcgSXNTTSBDYXBhYmlsaXR5IEJpdAogCiAgIFRvIHNldCB0aGUgSXNTTSBjYXBhYmlsaXR5IGJpdCBmb3IgYSBwb3J0LCBzaW1wbHkgb3BlbiB0aGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24va2VybmVsLXBhcmFtZXRlcnMudHh0IGIvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQKaW5kZXggMTI1MzNhOS4uODRjM2JkMCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQKQEAgLTE4MSwxOSArMTgxLDQxIEBACiAJCQl0aGF0IHJlcXVpcmUgYSB0aW1lciBvdmVycmlkZSwgYnV0IGRvbid0IGhhdmUKIAkJCUhQRVQKIAotCWFjcGlfZGJnX2xheWVyPQlbSFcsQUNQSV0KKwlhY3BpLmRlYnVnX2xheWVyPQlbSFcsQUNQSV0KIAkJCUZvcm1hdDogPGludD4KIAkJCUVhY2ggYml0IG9mIHRoZSA8aW50PiBpbmRpY2F0ZXMgYW4gQUNQSSBkZWJ1ZyBsYXllciwKIAkJCTE6IGVuYWJsZSwgMDogZGlzYWJsZS4gSXQgaXMgdXNlZnVsIGZvciBib290IHRpbWUKIAkJCWRlYnVnZ2luZy4gQWZ0ZXIgc3lzdGVtIGhhcyBib290ZWQgdXAsIGl0IGNhbiBiZSBzZXQKLQkJCXZpYSAvcHJvYy9hY3BpL2RlYnVnX2xheWVyLgorCQkJdmlhIC9zeXMvbW9kdWxlL2FjcGkvcGFyYW1ldGVycy9kZWJ1Z19sYXllci4KKwkJCUNPTkZJR19BQ1BJX0RFQlVHIG11c3QgYmUgZW5hYmxlZCBmb3IgdGhpcyB0byBwcm9kdWNlIGFueSBvdXRwdXQuCisJCQlBdmFpbGFibGUgYml0cyAoYWRkIHRoZSBudW1iZXJzIHRvZ2V0aGVyKSB0byBlbmFibGUgZGVidWcgb3V0cHV0CisJCQlmb3Igc3BlY2lmaWMgcGFydHMgb2YgdGhlIEFDUEkgc3Vic3lzdGVtOgorCQkJMHgwMSB1dGlsaXRpZXMgMHgwMiBoYXJkd2FyZSAweDA0IGV2ZW50cyAweDA4IHRhYmxlcworCQkJMHgxMCBuYW1lc3BhY2UgMHgyMCBwYXJzZXIgMHg0MCBkaXNwYXRjaGVyCisJCQkweDgwIGV4ZWN1dGVyIDB4MTAwIHJlc291cmNlcyAweDIwMCBhY3BpY2EgZGVidWdnZXIKKwkJCTB4NDAwIG9zIHNlcnZpY2VzIDB4ODAwIGFjcGljYSBkaXNhc3NlbWJsZXIuCisJCQlUaGUgbnVtYmVyIGNhbiBiZSBpbiBkZWNpbWFsIG9yIHByZWZpeGVkIHdpdGggMHggaW4gaGV4LgorCQkJV2FybmluZzogTWFueSBvZiB0aGVzZSBvcHRpb25zIGNhbiBwcm9kdWNlIGEgbG90IG9mCisJCQlvdXRwdXQgYW5kIG1ha2UgeW91ciBzeXN0ZW0gdW51c2FibGUuIEJlIHZlcnkgY2FyZWZ1bC4KIAotCWFjcGlfZGJnX2xldmVsPQlbSFcsQUNQSV0KKwlhY3BpLmRlYnVnX2xldmVsPQlbSFcsQUNQSV0KIAkJCUZvcm1hdDogPGludD4KIAkJCUVhY2ggYml0IG9mIHRoZSA8aW50PiBpbmRpY2F0ZXMgYW4gQUNQSSBkZWJ1ZyBsZXZlbCwKIAkJCTE6IGVuYWJsZSwgMDogZGlzYWJsZS4gSXQgaXMgdXNlZnVsIGZvciBib290IHRpbWUKIAkJCWRlYnVnZ2luZy4gQWZ0ZXIgc3lzdGVtIGhhcyBib290ZWQgdXAsIGl0IGNhbiBiZSBzZXQKLQkJCXZpYSAvcHJvYy9hY3BpL2RlYnVnX2xldmVsLgorCQkJdmlhIC9zeXMvbW9kdWxlL2FjcGkvcGFyYW1ldGVycy9kZWJ1Z19sZXZlbC4KKwkJCUNPTkZJR19BQ1BJX0RFQlVHIG11c3QgYmUgZW5hYmxlZCBmb3IgdGhpcyB0byBwcm9kdWNlIGFueSBvdXRwdXQuCisJCQlBdmFpbGFibGUgYml0cyAoYWRkIHRoZSBudW1iZXJzIHRvZ2V0aGVyKSB0byBlbmFibGUgZGlmZmVyZW50CisJCQlkZWJ1ZyBvdXRwdXQgbGV2ZWxzIG9mIHRoZSBBQ1BJIHN1YnN5c3RlbToKKwkJCTB4MDEgZXJyb3IgMHgwMiB3YXJuIDB4MDQgaW5pdCAweDA4IGRlYnVnIG9iamVjdAorCQkJMHgxMCBpbmZvIDB4MjAgaW5pdCBuYW1lcyAweDQwIHBhcnNlIDB4ODAgbG9hZAorCQkJMHgxMDAgZGlzcGF0Y2ggMHgyMDAgZXhlY3V0ZSAweDQwMCBuYW1lcyAweDgwMCBvcGVyYXRpb24gcmVnaW9uCisJCQkweDEwMDAgYmZpZWxkIDB4MjAwMCB0YWJsZXMgMHg0MDAwIHZhbHVlcyAweDgwMDAgb2JqZWN0cworCQkJMHgxMDAwMCByZXNvdXJjZXMgMHgyMDAwMCB1c2VyIHJlcXVlc3RzIDB4NDAwMDAgcGFja2FnZS4KKwkJCVRoZSBudW1iZXIgY2FuIGJlIGluIGRlY2ltYWwgb3IgcHJlZml4ZWQgd2l0aCAweCBpbiBoZXguCisJCQlXYXJuaW5nOiBNYW55IG9mIHRoZXNlIG9wdGlvbnMgY2FuIHByb2R1Y2UgYSBsb3Qgb2YKKwkJCW91dHB1dCBhbmQgbWFrZSB5b3VyIHN5c3RlbSB1bnVzYWJsZS4gQmUgdmVyeSBjYXJlZnVsLgorCiAKIAlhY3BpX2Zha2VfZWNkdAlbSFcsQUNQSV0gV29ya2Fyb3VuZCBmYWlsdXJlIGR1ZSB0byBCSU9TIGxhY2tpbmcgRUNEVAogCkBAIC0xNzkyLDcgKzE4MTQsNyBAQAogCQkJZm9yIG5ld2x5LWRldGVjdGVkIFVTQiBkZXZpY2VzIChkZWZhdWx0IDIpLiAgVGhpcwogCQkJaXMgdGhlIHRpbWUgcmVxdWlyZWQgYmVmb3JlIGFuIGlkbGUgZGV2aWNlIHdpbGwgYmUKIAkJCWF1dG9zdXNwZW5kZWQuICBEZXZpY2VzIGZvciB3aGljaCB0aGUgZGVsYXkgaXMgc2V0Ci0JCQl0byAwIHdvbid0IGJlIGF1dG9zdXNwZW5kZWQgYXQgYWxsLgorCQkJdG8gYSBuZWdhdGl2ZSB2YWx1ZSB3b24ndCBiZSBhdXRvc3VzcGVuZGVkIGF0IGFsbC4KIAogCXVzYmhpZC5tb3VzZXBvbGw9CiAJCQlbVVNCSElEXSBUaGUgaW50ZXJ2YWwgd2hpY2ggbWljZSBhcmUgdG8gYmUgcG9sbGVkIGF0LgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9rZXlzLnR4dCBiL0RvY3VtZW50YXRpb24va2V5cy50eHQKaW5kZXggNjBjNjY1ZC4uODFkOWFhMCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9rZXlzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2tleXMudHh0CkBAIC04NTksNiArODU5LDE4IEBACiAJdm9pZCB1bnJlZ2lzdGVyX2tleV90eXBlKHN0cnVjdCBrZXlfdHlwZSAqdHlwZSk7CiAKIAorVW5kZXIgc29tZSBjaXJjdW1zdGFuY2VzLCBpdCBtYXkgYmUgZGVzaXJhYmxlIHRvIGRlc2lyYWJsZSB0byBkZWFsIHdpdGggYQorYnVuZGxlIG9mIGtleXMuICBUaGUgZmFjaWxpdHkgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBrZXlyaW5nIHR5cGUgZm9yIG1hbmFnaW5nCitzdWNoIGEgYnVuZGxlOgorCisJc3RydWN0IGtleV90eXBlIGtleV90eXBlX2tleXJpbmc7CisKK1RoaXMgY2FuIGJlIHVzZWQgd2l0aCBhIGZ1bmN0aW9uIHN1Y2ggYXMgcmVxdWVzdF9rZXkoKSB0byBmaW5kIGEgc3BlY2lmaWMKK2tleXJpbmcgaW4gYSBwcm9jZXNzJ3Mga2V5cmluZ3MuICBBIGtleXJpbmcgdGh1cyBmb3VuZCBjYW4gdGhlbiBiZSBzZWFyY2hlZAord2l0aCBrZXlyaW5nX3NlYXJjaCgpLiAgTm90ZSB0aGF0IGl0IGlzIG5vdCBwb3NzaWJsZSB0byB1c2UgcmVxdWVzdF9rZXkoKSB0bworc2VhcmNoIGEgc3BlY2lmaWMga2V5cmluZywgc28gdXNpbmcga2V5cmluZ3MgaW4gdGhpcyB3YXkgaXMgb2YgbGltaXRlZCB1dGlsaXR5LgorCisKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiBOT1RFUyBPTiBBQ0NFU1NJTkcgUEFZTE9BRCBDT05URU5UUwogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9iY200M3h4LnR4dCBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9iY200M3h4LnR4dAppbmRleCAyODU0MWQyLi5hMTM2NzIxIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvYmNtNDN4eC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2JjbTQzeHgudHh0CkBAIC0yLDM1ICsyLDg4IEBACiAJCQlCQ000M3h4IExpbnV4IERyaXZlciBQcm9qZWN0CiAJCQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLUFib3V0IHRoaXMgc29mdHdhcmUKLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVGhlIGdvYWwgb2YgdGhpcyBwcm9qZWN0IGlzIHRvIGRldmVsb3AgYSBsaW51eCBkcml2ZXIgZm9yIEJyb2FkY29tCi1CQ000M3h4IGNoaXBzLCBiYXNlZCBvbiB0aGUgc3BlY2lmaWNhdGlvbiBhdCAKLWh0dHA6Ly9iY20tc3BlY3Muc2lwc29sdXRpb25zLm5ldC8KLQotVGhlIHByb2plY3QgcGFnZSBpcyBodHRwOi8vYmNtNDN4eC5iZXJsaW9zLmRlLwotCi0KLVJlcXVpcmVtZW50cworSW50cm9kdWN0aW9uCiAtLS0tLS0tLS0tLS0KIAotMSkJTGludXggS2VybmVsIDIuNi4xNiBvciBsYXRlcgotCWh0dHA6Ly93d3cua2VybmVsLm9yZy8KK01hbnkgb2YgdGhlIHdpcmVsZXNzIGRldmljZXMgZm91bmQgaW4gbW9kZXJuIG5vdGVib29rIGNvbXB1dGVycyBhcmUKK2Jhc2VkIG9uIHRoZSB3aXJlbGVzcyBjaGlwcyBwcm9kdWNlZCBieSBCcm9hZGNvbS4gVGhlc2UgZGV2aWNlcyBoYXZlCitiZWVuIGEgcHJvYmxlbSBmb3IgTGludXggdXNlcnMgYXMgdGhlcmUgaXMgbm8gb3Blbi1zb3VyY2UgZHJpdmVyCithdmFpbGFibGUuIEluIGFkZGl0aW9uLCBCcm9hZGNvbSBoYXMgbm90IHJlbGVhc2VkIHNwZWNpZmljYXRpb25zCitmb3IgdGhlIGRldmljZSwgYW5kIGRyaXZlciBhdmFpbGFiaWxpdHkgaGFzIGJlZW4gbGltaXRlZCB0byB0aGUKK2JpbmFyeS1vbmx5IGZvcm0gdXNlZCBpbiB0aGUgR1BMIHZlcnNpb25zIG9mIEFQIGhhcmR3YXJlIHN1Y2ggYXMgdGhlCitMaW5rc3lzIFdSVDU0RywgYW5kIHRoZSBXaW5kb3dzIGFuZCBPUyBYIGRyaXZlcnMuICBCZWZvcmUgdGhpcyBwcm9qZWN0CitiZWdhbiwgdGhlIG9ubHkgd2F5IHRvIHVzZSB0aGVzZSBkZXZpY2VzIHdlcmUgdG8gdXNlIHRoZSBXaW5kb3dzIG9yCitPUyBYIGRyaXZlcnMgd2l0aCBlaXRoZXIgdGhlIExpbnV4YW50IG9yIG5kaXN3cmFwcGVyIG1vZHVsZXMuIFRoZXJlCitpcyBhIHN0cm9uZyBwZW5hbHR5IGlmIHRoaXMgbWV0aG9kIGlzIHVzZWQgYXMgbG9hZGluZyB0aGUgYmluYXJ5LW9ubHkKK21vZHVsZSAidGFpbnRzIiB0aGUga2VybmVsLCBhbmQgbm8ga2VybmVsIGRldmVsb3BlciB3aWxsIGhlbHAgZGlhZ25vc2UKK2FueSBrZXJuZWwgcHJvYmxlbXMuCiAKLQlZb3UgbWF5IHdhbnQgdG8gY29uZmlndXJlIHlvdXIga2VybmVsIHdpdGg6CitEZXZlbG9wbWVudAorLS0tLS0tLS0tLS0KIAotCUNPTkZJR19ERUJVR19GUyAob3B0aW9uYWwpOgotCQktPiBLZXJuZWwgaGFja2luZwotCQkgIC0+IERlYnVnIEZpbGVzeXN0ZW0KK1RoaXMgZHJpdmVyIGhhcyBiZWVuIGRldmVsb3BlZCB1c2luZworYSBjbGVhbi1yb29tIHRlY2huaXF1ZSB0aGF0IGlzIGRlc2NyaWJlZCBhdAoraHR0cDovL2JjbS1zcGVjcy5zaXBzb2x1dGlvbnMubmV0L1JldmVyc2VFbmdpbmVlcmluZ1Byb2Nlc3MuIEZvciBsZWdhbAorcmVhc29ucywgbm9uZSBvZiB0aGUgY2xlYW4tcm9vbSBjcmV3IHdvcmtzIG9uIHRoZSBvbiB0aGUgTGludXggZHJpdmVyLAorYW5kIG5vbmUgb2YgdGhlIExpbnV4IGRldmVsb3BlcnMgc2VlcyBhbnl0aGluZyBidXQgdGhlIHNwZWNpZmljYXRpb25zLAord2hpY2ggYXJlIHRoZSB1bHRpbWF0ZSBwcm9kdWN0IG9mIHRoZSByZXZlcnNlLWVuZ2luZWVyaW5nIGdyb3VwLgogCi0yKQlTb2Z0TUFDIElFRUUgODAyLjExIE5ldHdvcmtpbmcgU3RhY2sgZXh0ZW5zaW9uIGFuZCBwYXRjaGVkIGllZWU4MDIxMQotCW1vZHVsZXM6Ci0JaHR0cDovL3NvZnRtYWMuc2lwc29sdXRpb25zLm5ldC8KK1NvZnR3YXJlCistLS0tLS0tLQogCi0zKQlGaXJtd2FyZSBGaWxlcworU2luY2UgdGhlIHJlbGVhc2Ugb2YgdGhlIDIuNi4xNyBrZXJuZWwsIHRoZSBiY200M3h4IGRyaXZlciBoYXMgYmVlbgorZGlzdHJpYnV0ZWQgd2l0aCB0aGUga2VybmVsIHNvdXJjZSwgYW5kIGlzIHByZWJ1aWx0IGluIG1vc3QsIGlmIG5vdAorYWxsLCBkaXN0cmlidXRpb25zLiAgVGhlcmUgaXMsIGhvd2V2ZXIsIGFkZGl0aW9uYWwgc29mdHdhcmUgdGhhdCBpcworcmVxdWlyZWQuIFRoZSBmaXJtd2FyZSB1c2VkIGJ5IHRoZSBjaGlwIGlzIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkKK29mIEJyb2FkY29tIGFuZCB0aGV5IGhhdmUgbm90IGdpdmVuIHRoZSBiY200M3h4IHRlYW0gcmVkaXN0cmlidXRpb24KK3JpZ2h0cyB0byB0aGlzIGZpcm13YXJlLiAgU2luY2Ugd2UgY2Fubm90IGxlZ2FsbHkgcmVkaXN0cmlidXRlCit0aGUgZmlyd21hcmUgd2UgY2Fubm90IGluY2x1ZGUgaXQgd2l0aCB0aGUgZHJpdmVyLiBGdXJ0aGVybW9yZSwgaXQKK2Nhbm5vdCBiZSBwbGFjZWQgaW4gdGhlIGRvd25sb2FkYWJsZSBhcmNoaXZlcyBvZiBhbnkgZGlzdHJpYnV0aW5nCitvcmdhbml6YXRpb247IHRoZXJlZm9yZSwgdGhlIHVzZXIgaXMgcmVzcG9uc2libGUgZm9yIG9idGFpbmluZyB0aGUKK2Zpcm13YXJlIGFuZCBwbGFjaW5nIGl0IGluIHRoZSBhcHByb3ByaWF0ZSBsb2NhdGlvbiBzbyB0aGF0IHRoZSBkcml2ZXIKK2NhbiBmaW5kIGl0IHdoZW4gaW5pdGlhbGl6aW5nLgogCi0JUGxlYXNlIHRyeSBmd2N1dHRlci4gRndjdXR0ZXIgY2FuIGV4dHJhY3QgdGhlIGZpcm13YXJlIGZyb20gdmFyaW91cyAKLQliaW5hcnkgZHJpdmVyIGZpbGVzLiBJdCBzdXBwb3J0cyBkcml2ZXIgZmlsZXMgZnJvbSBXaW5kb3dzLCBNYWNPUyBhbmQgCi0JTGludXguIFlvdSBjYW4gZ2V0IGZ3Y3V0dGVyIGZyb20gaHR0cDovL2JjbTQzeHguYmVybGlvcy5kZS8uCi0JQWxzbywgZndjdXR0ZXIgY29tZXMgd2l0aCBhIFJFQURNRSBmaWxlIGZvciBmdXJ0aGVyIGluc3RydWN0aW9ucy4KK1RvIGhlbHAgd2l0aCB0aGlzIHByb2Nlc3MsIHRoZSBiY200M3h4IGRldmVsb3BlcnMgcHJvdmlkZSBhIHNlcGFyYXRlCitwcm9ncmFtIG5hbWVkIGJjbTQzeHgtZndjdXR0ZXIgdG8gImN1dCIgdGhlIGZpcm13YXJlIG91dCBvZiBhCitXaW5kb3dzIG9yIE9TIFggZHJpdmVyIGFuZCB3cml0ZSB0aGUgZXh0cmFjdGVkIGZpbGVzIHRvIHRoZSBwcm9wZXIKK2xvY2F0aW9uLiBUaGlzIHByb2dyYW0gaXMgdXN1YWxseSBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb247Citob3dldmVyLCBpdCBtYXkgYmUgZG93bmxvYWRlZCBmcm9tCisKK2h0dHA6Ly9kZXZlbG9wZXIuYmVybGlvcy5kZS9wcm9qZWN0L3Nob3dmaWxlcy5waHA/Z3JvdXBfaWQ9NDU0NworCitUaGUgZmlybXdhcmUgaXMgYXZhaWxhYmxlIGluIHR3byB2ZXJzaW9ucy4gVjMgZmlybXdhcmUgaXMgdXNlZCB3aXRoCit0aGUgaW4ta2VybmVsIGJjbTQzeHggZHJpdmVyIHRoYXQgdXNlcyBhIHNvZnR3YXJlIE1BQyBsYXllciBjYWxsZWQKK1NvZnRNQUMsIGFuZCB3aWxsIGhhdmUgYSBtaWNyb2NvZGUgcmV2aXNpb24gb2YgMHgxMjcgb3Igc21hbGxlci4gVGhlCitWNCBmaXJtd2FyZSBpcyB1c2VkIGJ5IGFuIG91dC1vZi1rZXJuZWwgZHJpdmVyIGVtcGxveWluZyBhIHZhcmlhdGlvbiBvZgordGhlIERldmljZXNjYXBlIE1BQyBsYXllciBrbm93biBhcyBkODAyMTEuIE9uY2UgYmNtNDN4eC1kODAyMTEgcmVhY2hlcworYSBzYXRpc2ZhY3RvcnkgbGV2ZWwgb2YgZGV2ZWxvcG1lbnQsIGl0IHdpbGwgcmVwbGFjZSBiY200M3h4LXNvZnRtYWMKK2luIHRoZSBrZXJuZWwgYXMgaXQgaXMgbXVjaCBtb3JlIGZsZXhpYmxlIGFuZCBwb3dlcmZ1bC4KKworQSBzb3VyY2UgZm9yIHRoZSBsYXRlc3QgVjMgZmlybXdhcmUgaXMKKworaHR0cDovL2Rvd25sb2Fkcy5vcGVud3J0Lm9yZy9zb3VyY2VzL3dsX2Fwc3RhLTMuMTMwLjIwLjAubworCitPbmNlIHRoaXMgZmlsZSBpcyBkb3dubG9hZGVkLCB0aGUgY29tbWFuZAorJ2JjbTQzeHgtZndjdXR0ZXIgLXcgPGRpcj4gPGZpbGVuYW1lPicKK3dpbGwgZXh0cmFjdCB0aGUgbWljcm9jb2RlIGFuZCB3cml0ZSBpdCB0byBkaXJlY3RvcnkKKzxkaXI+LiBUaGUgY29ycmVjdCBkaXJlY3Rvcnkgd2lsbCBkZXBlbmQgb24geW91ciBkaXN0cmlidXRpb247Citob3dldmVyLCBtb3N0IHVzZSAnL2xpYi9maXJtd2FyZScuIE9uY2UgdGhpcyBzdGVwIGlzIGNvbXBsZXRlZCwKK3RoZSBiY20zeHggZHJpdmVyIHNob3VsZCBsb2FkIHdoZW4gdGhlIHN5c3RlbSBpcyBib290ZWQuIFRvIHNlZQorYW55IG1lc3NhZ2VzIHJlbGF0aW5nIHRvIHRoZSBkcml2ZXIsIGlzc3VlIHRoZSBjb21tYW5kICdkbWVzZyB8CitncmVwIGJjbTQzeHgnIGZyb20gYSB0ZXJtaW5hbCB3aW5kb3cuIElmIHRoZXJlIGFyZSBhbnkgcHJvYmxlbXMsCitwbGVhc2Ugc2VuZCB0aGF0IG91dHB1dCB0byBCY200M3h4LWRldkBsaXN0cy5iZXJsaW9zLmRlLgorCitBbHRob3VnaCB0aGUgZHJpdmVyIGhhcyBiZWVuIGluLWtlcm5lbCBzaW5jZSAyLjYuMTcsIHRoZSBlYXJsaWVzdAordmVyc2lvbiBpcyBxdWl0ZSBsaW1pdGVkIGluIGl0cyBjYXBhYmlsaXR5LiBQYXRjaGVzIHRoYXQgaW5jbHVkZQorYWxsIGZlYXR1cmVzIG9mIGxhdGVyIHZlcnNpb25zIGFyZSBhdmFpbGFibGUgZm9yIHRoZSBzdGFibGUga2VybmVsCit2ZXJzaW9ucyBmcm9tIDIuNi4xOC4gVGhlc2Ugd2lsbCBiZSBuZWVkZWQgaWYgeW91IHVzZSBhIEJDTTQzMTgsCitvciBhIFBDSSBFeHByZXNzIHZlcnNpb24gKEJDTTQzMTEgYW5kIEJDTTQzMTIpLiBJbiBhZGRpdGlvbiwgaWYgeW91CitoYXZlIGFuIGVhcmx5IEJDTTQzMDYgYW5kIG1vcmUgdGhhbiAxIEdCIFJBTSwgeW91ciBrZXJuZWwgd2lsbCBuZWVkCit0byBiZSBwYXRjaGVkLglUaGVzZSBwYXRjaGVzLCB3aGljaCBhcmUgYmVpbmcgdXBkYXRlZCByZWd1bGFybHksCithcmUgYXZhaWxhYmxlIGF0IGZ0cDovL2x3ZmluZ2VyLmR5bmFsaWFzLm9yZy9wYXRjaGVzLiBMb29rIGZvcgorY29tYmluZWRfMi42LllZLnBhdGNoLiBPZiBjb3Vyc2UgeW91IHdpbGwgbmVlZCBrZXJuZWwgc291cmNlIGRvd25sb2FkZWQKK2Zyb20ga2VybmVsLm9yZywgb3IgdGhlIHNvdXJjZSBmcm9tIHlvdXIgZGlzdHJpYnV0aW9uLgorCitJZiB5b3UgYnVpbGQgeW91ciBvd24ga2VybmVsLCBwbGVhc2UgZW5hYmxlIENPTkZJR19CQ000M1hYX0RFQlVHCithbmQgQ09ORklHX0lFRUU4MDIxMV9TT0ZUTUFDX0RFQlVHLiBUaGUgbG9nIGluZm9ybWF0aW9uIHByb3ZpZGVkIGlzCitlc3NlbnRpYWwgZm9yIHNvbHZpbmcgYW55IHByb2JsZW1zLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2JvbmRpbmcudHh0IGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2JvbmRpbmcudHh0CmluZGV4IGRlODA5ZTUuLjFkYTU2NjYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9ib25kaW5nLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvYm9uZGluZy50eHQKQEAgLTkyMCw0MCArOTIwLDkgQEAKIGRvY3VtZW50ZWQgYWJvdmUuCiAKIAlUbyBjcmVhdGUgbXVsdGlwbGUgYm9uZGluZyBkZXZpY2VzIHdpdGggZGlmZmVyaW5nIG9wdGlvbnMsIGl0Ci1pcyBuZWNlc3NhcnkgdG8gbG9hZCB0aGUgYm9uZGluZyBkcml2ZXIgbXVsdGlwbGUgdGltZXMuICBOb3RlIHRoYXQKLWN1cnJlbnQgdmVyc2lvbnMgb2YgdGhlIHN5c2NvbmZpZyBuZXR3b3JrIGluaXRpYWxpemF0aW9uIHNjcmlwdHMKLWhhbmRsZSB0aGlzIGF1dG9tYXRpY2FsbHk7IGlmIHlvdXIgZGlzdHJvIHVzZXMgdGhlc2Ugc2NyaXB0cywgbm8KLXNwZWNpYWwgYWN0aW9uIGlzIG5lZWRlZC4gIFNlZSB0aGUgc2VjdGlvbiBDb25maWd1cmluZyBCb25kaW5nCi1EZXZpY2VzLCBhYm92ZSwgaWYgeW91J3JlIG5vdCBzdXJlIGFib3V0IHlvdXIgbmV0d29yayBpbml0aWFsaXphdGlvbgotc2NyaXB0cy4KK2lzIG5lY2Vzc2FyeSB0byB1c2UgYm9uZGluZyBwYXJhbWV0ZXJzIGV4cG9ydGVkIGJ5IHN5c2ZzLCBkb2N1bWVudGVkCitpbiB0aGUgc2VjdGlvbiBiZWxvdy4KIAotCVRvIGxvYWQgbXVsdGlwbGUgaW5zdGFuY2VzIG9mIHRoZSBtb2R1bGUsIGl0IGlzIG5lY2Vzc2FyeSB0bwotc3BlY2lmeSBhIGRpZmZlcmVudCBuYW1lIGZvciBlYWNoIGluc3RhbmNlICh0aGUgbW9kdWxlIGxvYWRpbmcgc3lzdGVtCi1yZXF1aXJlcyB0aGF0IGV2ZXJ5IGxvYWRlZCBtb2R1bGUsIGV2ZW4gbXVsdGlwbGUgaW5zdGFuY2VzIG9mIHRoZSBzYW1lCi1tb2R1bGUsIGhhdmUgYSB1bmlxdWUgbmFtZSkuICBUaGlzIGlzIGFjY29tcGxpc2hlZCBieSBzdXBwbHlpbmcKLW11bHRpcGxlIHNldHMgb2YgYm9uZGluZyBvcHRpb25zIGluIC9ldGMvbW9kcHJvYmUuY29uZiwgZm9yIGV4YW1wbGU6Ci0JCi1hbGlhcyBib25kMCBib25kaW5nCi1vcHRpb25zIGJvbmQwIC1vIGJvbmQwIG1vZGU9YmFsYW5jZS1yciBtaWltb249MTAwCi0KLWFsaWFzIGJvbmQxIGJvbmRpbmcKLW9wdGlvbnMgYm9uZDEgLW8gYm9uZDEgbW9kZT1iYWxhbmNlLWFsYiBtaWltb249NTAKLQotCXdpbGwgbG9hZCB0aGUgYm9uZGluZyBtb2R1bGUgdHdvIHRpbWVzLiAgVGhlIGZpcnN0IGluc3RhbmNlIGlzCi1uYW1lZCAiYm9uZDAiIGFuZCBjcmVhdGVzIHRoZSBib25kMCBkZXZpY2UgaW4gYmFsYW5jZS1yciBtb2RlIHdpdGggYW4KLW1paW1vbiBvZiAxMDAuICBUaGUgc2Vjb25kIGluc3RhbmNlIGlzIG5hbWVkICJib25kMSIgYW5kIGNyZWF0ZXMgdGhlCi1ib25kMSBkZXZpY2UgaW4gYmFsYW5jZS1hbGIgbW9kZSB3aXRoIGFuIG1paW1vbiBvZiA1MC4KLQotCUluIHNvbWUgY2lyY3Vtc3RhbmNlcyAodHlwaWNhbGx5IHdpdGggb2xkZXIgZGlzdHJpYnV0aW9ucyksCi10aGUgYWJvdmUgZG9lcyBub3Qgd29yaywgYW5kIHRoZSBzZWNvbmQgYm9uZGluZyBpbnN0YW5jZSBuZXZlciBzZWVzCi1pdHMgb3B0aW9ucy4gIEluIHRoYXQgY2FzZSwgdGhlIHNlY29uZCBvcHRpb25zIGxpbmUgY2FuIGJlIHN1YnN0aXR1dGVkCi1hcyBmb2xsb3dzOgotCi1pbnN0YWxsIGJvbmQxIC9zYmluL21vZHByb2JlIC0taWdub3JlLWluc3RhbGwgYm9uZGluZyAtbyBib25kMSBcCi0JbW9kZT1iYWxhbmNlLWFsYiBtaWltb249NTAKLQotCVRoaXMgbWF5IGJlIHJlcGVhdGVkIGFueSBudW1iZXIgb2YgdGltZXMsIHNwZWNpZnlpbmcgYSBuZXcgYW5kCi11bmlxdWUgbmFtZSBpbiBwbGFjZSBvZiBib25kMSBmb3IgZWFjaCBzdWJzZXF1ZW50IGluc3RhbmNlLgogCiAzLjQgQ29uZmlndXJpbmcgQm9uZGluZyBNYW51YWxseSB2aWEgU3lzZnMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2RjY3AudHh0IGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2RjY3AudHh0CmluZGV4IDM4NzQ4MmUuLjQ1MDRjYzUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9kY2NwLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZGNjcC50eHQKQEAgLTU3LDYgKzU3LDE2IEBACiAJY292ZXJhZ2UgdmFsdWUgYXJlIGFsc28gYWNjZXB0YWJsZS4gVGhlIGhpZ2hlciB0aGUgbnVtYmVyLCB0aGUgbW9yZQogCXJlc3RyaWN0aXZlIHRoaXMgc2V0dGluZyAoc2VlIFtSRkMgNDM0MCwgc2VjLiA5LjIuMV0pLgogCitUaGUgZm9sbG93aW5nIHR3byBvcHRpb25zIGFwcGx5IHRvIENDSUQgMyBleGNsdXNpdmVseSBhbmQgYXJlIGdldHNvY2tvcHQoKS1vbmx5LgorSW4gZWl0aGVyIGNhc2UsIGEgVEZSQyBpbmZvIHN0cnVjdCAoZGVmaW5lZCBpbiA8bGludXgvdGZyYy5oPikgaXMgcmV0dXJuZWQuCitEQ0NQX1NPQ0tPUFRfQ0NJRF9SWF9JTkZPCisJUmV0dXJucyBhIGBzdHJ1Y3QgdGZyY19yeF9pbmZvJyBpbiBvcHR2YWw7IHRoZSBidWZmZXIgZm9yIG9wdHZhbCBhbmQKKwlvcHRsZW4gbXVzdCBiZSBzZXQgdG8gYXQgbGVhc3Qgc2l6ZW9mKHN0cnVjdCB0ZnJjX3J4X2luZm8pLgorRENDUF9TT0NLT1BUX0NDSURfVFhfSU5GTworCVJldHVybnMgYSBgc3RydWN0IHRmcmNfdHhfaW5mbycgaW4gb3B0dmFsOyB0aGUgYnVmZmVyIGZvciBvcHR2YWwgYW5kCisJb3B0bGVuIG11c3QgYmUgc2V0IHRvIGF0IGxlYXN0IHNpemVvZihzdHJ1Y3QgdGZyY190eF9pbmZvKS4KKworCiBTeXNjdGwgdmFyaWFibGVzCiA9PT09PT09PT09PT09PT09CiBTZXZlcmFsIERDQ1AgZGVmYXVsdCBwYXJhbWV0ZXJzIGNhbiBiZSBtYW5hZ2VkIGJ5IHRoZSBmb2xsb3dpbmcgc3lzY3RscwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2lwLXN5c2N0bC50eHQgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvaXAtc3lzY3RsLnR4dAppbmRleCA3MDJkMWQ4Li5hZjZhNjNhIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvaXAtc3lzY3RsLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvaXAtc3lzY3RsLnR4dApAQCAtMTc5LDExICsxNzksMzEgQEAKIAliZWNhdXNlIHRoZXkgZWF0IG1heGltdW0gMS41SyBvZiBtZW1vcnksIGJ1dCB0aGV5IHRlbmQKIAl0byBsaXZlIGxvbmdlci4JQ2YuIHRjcF9tYXhfb3JwaGFucy4KIAotdGNwX2ZydG8gLSBCT09MRUFOCit0Y3BfZnJ0byAtIElOVEVHRVIKIAlFbmFibGVzIEYtUlRPLCBhbiBlbmhhbmNlZCByZWNvdmVyeSBhbGdvcml0aG0gZm9yIFRDUCByZXRyYW5zbWlzc2lvbgogCXRpbWVvdXRzLiAgSXQgaXMgcGFydGljdWxhcmx5IGJlbmVmaWNpYWwgaW4gd2lyZWxlc3MgZW52aXJvbm1lbnRzCiAJd2hlcmUgcGFja2V0IGxvc3MgaXMgdHlwaWNhbGx5IGR1ZSB0byByYW5kb20gcmFkaW8gaW50ZXJmZXJlbmNlCi0JcmF0aGVyIHRoYW4gaW50ZXJtZWRpYXRlIHJvdXRlciBjb25nZXN0aW9uLgorCXJhdGhlciB0aGFuIGludGVybWVkaWF0ZSByb3V0ZXIgY29uZ2VzdGlvbi4gSWYgc2V0IHRvIDEsIGJhc2ljCisJdmVyc2lvbiBpcyBlbmFibGVkLiAyIGVuYWJsZXMgU0FDSyBlbmhhbmNlZCBGLVJUTywgd2hpY2ggaXMKKwlFWFBFUklNRU5UQUwuIFRoZSBiYXNpYyB2ZXJzaW9uIGNhbiBiZSB1c2VkIGFsc28gd2hlbiBTQUNLIGlzCisJZW5hYmxlZCBmb3IgYSBmbG93IHRocm91Z2ggdGNwX3NhY2sgc3lzY3RsLgorCit0Y3BfZnJ0b19yZXNwb25zZSAtIElOVEVHRVIKKwlXaGVuIEYtUlRPIGhhcyBkZXRlY3RlZCB0aGF0IGEgVENQIHJldHJhbnNtaXNzaW9uIHRpbWVvdXQgd2FzCisJc3B1cmlvdXMgKGkuZSwgdGhlIHRpbWVvdXQgd291bGQgaGF2ZSBiZWVuIGF2b2lkZWQgaGFkIFRDUCBzZXQgYQorCWxvbmdlciByZXRyYW5zbWlzc2lvbiB0aW1lb3V0KSwgVENQIGhhcyBzZXZlcmFsIG9wdGlvbnMgd2hhdCB0byBkbworCW5leHQuIFBvc3NpYmxlIHZhbHVlcyBhcmU6CisJCTAgUmF0ZSBoYWx2aW5nIGJhc2VkOyBhIHNtb290aCBhbmQgY29uc2VydmF0aXZlIHJlc3BvbnNlLAorCQkgIHJlc3VsdHMgaW4gaGFsdmVkIGN3bmQgYW5kIHNzdGhyZXNoIGFmdGVyIG9uZSBSVFQKKwkJMSBWZXJ5IGNvbnNlcnZhdGl2ZSByZXNwb25zZTsgbm90IHJlY29tbWVuZGVkIGJlY2F1c2UgZXZlbgorCQkgIHRob3VnaCBiZWluZyB2YWxpZCwgaXQgaW50ZXJhY3RzIHBvb3JseSB3aXRoIHRoZSByZXN0IG9mCisJCSAgTGludXggVENQLCBoYWx2ZXMgY3duZCBhbmQgc3N0aHJlc2ggaW1tZWRpYXRlbHkKKwkJMiBBZ2dyZXNzaXZlIHJlc3BvbnNlOyB1bmRvZXMgY29uZ2VzdGlvbiBjb250cm9sIG1lYXN1cmVzCisJCSAgdGhhdCBhcmUgbm93IGtub3duIHRvIGJlIHVubmVjZXNzYXJ5IChpZ25vcmluZyB0aGUKKwkJICBwb3NzaWJpbGl0eSBvZiBhIGxvc3QgcmV0cmFuc21pc3Npb24gdGhhdCB3b3VsZCByZXF1aXJlCisJCSAgVENQIHRvIGJlIG1vcmUgY2F1dGlvdXMpLCBjd25kIGFuZCBzc3RocmVzaCBhcmUgcmVzdG9yZWQKKwkJICB0byB0aGUgdmFsdWVzIHByaW9yIHRpbWVvdXQKKwlEZWZhdWx0OiAwIChyYXRlIGhhbHZpbmcgYmFzZWQpCiAKIHRjcF9rZWVwYWxpdmVfdGltZSAtIElOVEVHRVIKIAlIb3cgb2Z0ZW4gVENQIHNlbmRzIG91dCBrZWVwYWxpdmUgbWVzc2FnZXMgd2hlbiBrZWVwYWxpdmUgaXMgZW5hYmxlZC4KQEAgLTk5NSw3ICsxMDE1LDEyIEBACiAJRGVmYXVsdDogMQogCiBicmlkZ2UtbmYtZmlsdGVyLXZsYW4tdGFnZ2VkIC0gQk9PTEVBTgotCTEgOiBwYXNzIGJyaWRnZWQgdmxhbi10YWdnZWQgQVJQL0lQIHRyYWZmaWMgdG8gYXJwdGFibGVzL2lwdGFibGVzLgorCTEgOiBwYXNzIGJyaWRnZWQgdmxhbi10YWdnZWQgQVJQL0lQL0lQdjYgdHJhZmZpYyB0byB7YXJwLGlwLGlwNn10YWJsZXMuCisJMCA6IGRpc2FibGUgdGhpcy4KKwlEZWZhdWx0OiAxCisKK2JyaWRnZS1uZi1maWx0ZXItcHBwb2UtdGFnZ2VkIC0gQk9PTEVBTgorCTEgOiBwYXNzIGJyaWRnZWQgcHBwb2UtdGFnZ2VkIElQL0lQdjYgdHJhZmZpYyB0byB7aXAsaXA2fXRhYmxlcy4KIAkwIDogZGlzYWJsZSB0aGlzLgogCURlZmF1bHQ6IDEKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3J4cnBjLnR4dCBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9yeHJwYy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FlMjMxYgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9yeHJwYy50eHQKQEAgLTAsMCArMSw4NTkgQEAKKwkJCSAgICA9PT09PT09PT09PT09PT09PT09PT09CisJCQkgICAgUnhSUEMgTkVUV09SSyBQUk9UT0NPTAorCQkJICAgID09PT09PT09PT09PT09PT09PT09PT0KKworVGhlIFJ4UlBDIHByb3RvY29sIGRyaXZlciBwcm92aWRlcyBhIHJlbGlhYmxlIHR3by1waGFzZSB0cmFuc3BvcnQgb24gdG9wIG9mIFVEUAordGhhdCBjYW4gYmUgdXNlZCB0byBwZXJmb3JtIFJ4UlBDIHJlbW90ZSBvcGVyYXRpb25zLiAgVGhpcyBpcyBkb25lIG92ZXIgc29ja2V0cworb2YgQUZfUlhSUEMgZmFtaWx5LCB1c2luZyBzZW5kbXNnKCkgYW5kIHJlY3Ztc2coKSB3aXRoIGNvbnRyb2wgZGF0YSB0byBzZW5kIGFuZAorcmVjZWl2ZSBkYXRhLCBhYm9ydHMgYW5kIGVycm9ycy4KKworQ29udGVudHMgb2YgdGhpcyBkb2N1bWVudDoKKworICgqKSBPdmVydmlldy4KKworICgqKSBSeFJQQyBwcm90b2NvbCBzdW1tYXJ5LgorCisgKCopIEFGX1JYUlBDIGRyaXZlciBtb2RlbC4KKworICgqKSBDb250cm9sIG1lc3NhZ2VzLgorCisgKCopIFNvY2tldCBvcHRpb25zLgorCisgKCopIFNlY3VyaXR5LgorCisgKCopIEV4YW1wbGUgY2xpZW50IHVzYWdlLgorCisgKCopIEV4YW1wbGUgc2VydmVyIHVzYWdlLgorCisgKCopIEFGX1JYUlBDIGtlcm5lbCBpbnRlcmZhY2UuCisKKworPT09PT09PT0KK09WRVJWSUVXCis9PT09PT09PQorCitSeFJQQyBpcyBhIHR3by1sYXllciBwcm90b2NvbC4gIFRoZXJlIGlzIGEgc2Vzc2lvbiBsYXllciB3aGljaCBwcm92aWRlcworcmVsaWFibGUgdmlydHVhbCBjb25uZWN0aW9ucyB1c2luZyBVRFAgb3ZlciBJUHY0IChvciBJUHY2KSBhcyB0aGUgdHJhbnNwb3J0CitsYXllciwgYnV0IGltcGxlbWVudHMgYSByZWFsIG5ldHdvcmsgcHJvdG9jb2w7IGFuZCB0aGVyZSdzIHRoZSBwcmVzZW50YXRpb24KK2xheWVyIHdoaWNoIHJlbmRlcnMgc3RydWN0dXJlZCBkYXRhIHRvIGJpbmFyeSBibG9icyBhbmQgYmFjayBhZ2FpbiB1c2luZyBYRFIKKyhhcyBkb2VzIFN1blJQQyk6CisKKwkJKy0tLS0tLS0tLS0tLS0rCisJCXwgQXBwbGljYXRpb24gfAorCQkrLS0tLS0tLS0tLS0tLSsKKwkJfCAgICAgWERSICAgICB8CQlQcmVzZW50YXRpb24KKwkJKy0tLS0tLS0tLS0tLS0rCisJCXwgICAgUnhSUEMgICAgfAkJU2Vzc2lvbgorCQkrLS0tLS0tLS0tLS0tLSsKKwkJfCAgICAgVURQICAgICB8CQlUcmFuc3BvcnQKKwkJKy0tLS0tLS0tLS0tLS0rCisKKworQUZfUlhSUEMgcHJvdmlkZXM6CisKKyAoMSkgUGFydCBvZiBhbiBSeFJQQyBmYWNpbGl0eSBmb3IgYm90aCBrZXJuZWwgYW5kIHVzZXJzcGFjZSBhcHBsaWNhdGlvbnMgYnkKKyAgICAgbWFraW5nIHRoZSBzZXNzaW9uIHBhcnQgb2YgaXQgYSBMaW51eCBuZXR3b3JrIHByb3RvY29sIChBRl9SWFJQQykuCisKKyAoMikgQSB0d28tcGhhc2UgcHJvdG9jb2wuICBUaGUgY2xpZW50IHRyYW5zbWl0cyBhIGJsb2IgKHRoZSByZXF1ZXN0KSBhbmQgdGhlbgorICAgICByZWNlaXZlcyBhIGJsb2IgKHRoZSByZXBseSksIGFuZCB0aGUgc2VydmVyIHJlY2VpdmVzIHRoZSByZXF1ZXN0IGFuZCB0aGVuCisgICAgIHRyYW5zbWl0cyB0aGUgcmVwbHkuCisKKyAoMykgUmV0ZW50aW9uIG9mIHRoZSByZXVzYWJsZSBiaXRzIG9mIHRoZSB0cmFuc3BvcnQgc3lzdGVtIHNldCB1cCBmb3Igb25lIGNhbGwKKyAgICAgdG8gc3BlZWQgdXAgc3Vic2VxdWVudCBjYWxscy4KKworICg0KSBBIHNlY3VyZSBwcm90b2NvbCwgdXNpbmcgdGhlIExpbnV4IGtlcm5lbCdzIGtleSByZXRlbnRpb24gZmFjaWxpdHkgdG8KKyAgICAgbWFuYWdlIHNlY3VyaXR5IG9uIHRoZSBjbGllbnQgZW5kLiAgVGhlIHNlcnZlciBlbmQgbXVzdCBvZiBuZWNlc3NpdHkgYmUKKyAgICAgbW9yZSBhY3RpdmUgaW4gc2VjdXJpdHkgbmVnb3RpYXRpb25zLgorCitBRl9SWFJQQyBkb2VzIG5vdCBwcm92aWRlIFhEUiBtYXJzaGFsbGluZy9wcmVzZW50YXRpb24gZmFjaWxpdGllcy4gIFRoYXQgaXMKK2xlZnQgdG8gdGhlIGFwcGxpY2F0aW9uLiAgQUZfUlhSUEMgb25seSBkZWFscyBpbiBibG9icy4gIEV2ZW4gdGhlIG9wZXJhdGlvbiBJRAoraXMganVzdCB0aGUgZmlyc3QgZm91ciBieXRlcyBvZiB0aGUgcmVxdWVzdCBibG9iLCBhbmQgYXMgc3VjaCBpcyBiZXlvbmQgdGhlCitrZXJuZWwncyBpbnRlcmVzdC4KKworCitTb2NrZXRzIG9mIEFGX1JYUlBDIGZhbWlseSBhcmU6CisKKyAoMSkgY3JlYXRlZCBhcyB0eXBlIFNPQ0tfREdSQU07CisKKyAoMikgcHJvdmlkZWQgd2l0aCBhIHByb3RvY29sIG9mIHRoZSB0eXBlIG9mIHVuZGVybHlpbmcgdHJhbnNwb3J0IHRoZXkncmUgZ29pbmcKKyAgICAgdG8gdXNlIC0gY3VycmVudGx5IG9ubHkgUEZfSU5FVCBpcyBzdXBwb3J0ZWQuCisKKworVGhlIEFuZHJldyBGaWxlIFN5c3RlbSAoQUZTKSBpcyBhbiBleGFtcGxlIG9mIGFuIGFwcGxpY2F0aW9uIHRoYXQgdXNlcyB0aGlzIGFuZAordGhhdCBoYXMgYm90aCBrZXJuZWwgKGZpbGVzeXN0ZW0pIGFuZCB1c2Vyc3BhY2UgKHV0aWxpdHkpIGNvbXBvbmVudHMuCisKKworPT09PT09PT09PT09PT09PT09PT09PQorUlhSUEMgUFJPVE9DT0wgU1VNTUFSWQorPT09PT09PT09PT09PT09PT09PT09PQorCitBbiBvdmVydmlldyBvZiB0aGUgUnhSUEMgcHJvdG9jb2w6CisKKyAoKikgUnhSUEMgc2l0cyBvbiB0b3Agb2YgYW5vdGhlciBuZXR3b3JraW5nIHByb3RvY29sIChVRFAgaXMgdGhlIG9ubHkgb3B0aW9uCisgICAgIGN1cnJlbnRseSksIGFuZCB1c2VzIHRoaXMgdG8gcHJvdmlkZSBuZXR3b3JrIHRyYW5zcG9ydC4gIFVEUCBwb3J0cywgZm9yCisgICAgIGV4YW1wbGUsIHByb3ZpZGUgdHJhbnNwb3J0IGVuZHBvaW50cy4KKworICgqKSBSeFJQQyBzdXBwb3J0cyBtdWx0aXBsZSB2aXJ0dWFsICJjb25uZWN0aW9ucyIgZnJvbSBhbnkgZ2l2ZW4gdHJhbnNwb3J0CisgICAgIGVuZHBvaW50LCB0aHVzIGFsbG93aW5nIHRoZSBlbmRwb2ludHMgdG8gYmUgc2hhcmVkLCBldmVuIHRvIHRoZSBzYW1lCisgICAgIHJlbW90ZSBlbmRwb2ludC4KKworICgqKSBFYWNoIGNvbm5lY3Rpb24gZ29lcyB0byBhIHBhcnRpY3VsYXIgInNlcnZpY2UiLiAgQSBjb25uZWN0aW9uIG1heSBub3QgZ28KKyAgICAgdG8gbXVsdGlwbGUgc2VydmljZXMuICBBIHNlcnZpY2UgbWF5IGJlIGNvbnNpZGVyZWQgdGhlIFJ4UlBDIGVxdWl2YWxlbnQgb2YKKyAgICAgYSBwb3J0IG51bWJlci4gIEFGX1JYUlBDIHBlcm1pdHMgbXVsdGlwbGUgc2VydmljZXMgdG8gc2hhcmUgYW4gZW5kcG9pbnQuCisKKyAoKikgQ2xpZW50LW9yaWdpbmF0aW5nIHBhY2tldHMgYXJlIG1hcmtlZCwgdGh1cyBhIHRyYW5zcG9ydCBlbmRwb2ludCBjYW4gYmUKKyAgICAgc2hhcmVkIGJldHdlZW4gY2xpZW50IGFuZCBzZXJ2ZXIgY29ubmVjdGlvbnMgKGNvbm5lY3Rpb25zIGhhdmUgYQorICAgICBkaXJlY3Rpb24pLgorCisgKCopIFVwIHRvIGEgYmlsbGlvbiBjb25uZWN0aW9ucyBtYXkgYmUgc3VwcG9ydGVkIGNvbmN1cnJlbnRseSBiZXR3ZWVuIG9uZQorICAgICBsb2NhbCB0cmFuc3BvcnQgZW5kcG9pbnQgYW5kIG9uZSBzZXJ2aWNlIG9uIG9uZSByZW1vdGUgZW5kcG9pbnQuICBBbiBSeFJQQworICAgICBjb25uZWN0aW9uIGlzIGRlc2NyaWJlZCBieSBzZXZlbiBudW1iZXJzOgorCisJTG9jYWwgYWRkcmVzcwl9CisJTG9jYWwgcG9ydAl9IFRyYW5zcG9ydCAoVURQKSBhZGRyZXNzCisJUmVtb3RlIGFkZHJlc3MJfQorCVJlbW90ZSBwb3J0CX0KKwlEaXJlY3Rpb24KKwlDb25uZWN0aW9uIElECisJU2VydmljZSBJRAorCisgKCopIEVhY2ggUnhSUEMgb3BlcmF0aW9uIGlzIGEgImNhbGwiLiAgQSBjb25uZWN0aW9uIG1heSBtYWtlIHVwIHRvIGZvdXIKKyAgICAgYmlsbGlvbiBjYWxscywgYnV0IG9ubHkgdXAgdG8gZm91ciBjYWxscyBtYXkgYmUgaW4gcHJvZ3Jlc3Mgb24gYQorICAgICBjb25uZWN0aW9uIGF0IGFueSBvbmUgdGltZS4KKworICgqKSBDYWxscyBhcmUgdHdvLXBoYXNlIGFuZCBhc3ltbWV0cmljOiB0aGUgY2xpZW50IHNlbmRzIGl0cyByZXF1ZXN0IGRhdGEsCisgICAgIHdoaWNoIHRoZSBzZXJ2aWNlIHJlY2VpdmVzOyB0aGVuIHRoZSBzZXJ2aWNlIHRyYW5zbWl0cyB0aGUgcmVwbHkgZGF0YQorICAgICB3aGljaCB0aGUgY2xpZW50IHJlY2VpdmVzLgorCisgKCopIFRoZSBkYXRhIGJsb2JzIGFyZSBvZiBpbmRlZmluaXRlIHNpemUsIHRoZSBlbmQgb2YgYSBwaGFzZSBpcyBtYXJrZWQgd2l0aCBhCisgICAgIGZsYWcgaW4gdGhlIHBhY2tldC4gIFRoZSBudW1iZXIgb2YgcGFja2V0cyBvZiBkYXRhIG1ha2luZyB1cCBvbmUgYmxvYiBtYXkKKyAgICAgbm90IGV4Y2VlZCA0IGJpbGxpb24sIGhvd2V2ZXIsIGFzIHRoaXMgd291bGQgY2F1c2UgdGhlIHNlcXVlbmNlIG51bWJlciB0bworICAgICB3cmFwLgorCisgKCopIFRoZSBmaXJzdCBmb3VyIGJ5dGVzIG9mIHRoZSByZXF1ZXN0IGRhdGEgYXJlIHRoZSBzZXJ2aWNlIG9wZXJhdGlvbiBJRC4KKworICgqKSBTZWN1cml0eSBpcyBuZWdvdGlhdGVkIG9uIGEgcGVyLWNvbm5lY3Rpb24gYmFzaXMuICBUaGUgY29ubmVjdGlvbiBpcworICAgICBpbml0aWF0ZWQgYnkgdGhlIGZpcnN0IGRhdGEgcGFja2V0IG9uIGl0IGFycml2aW5nLiAgSWYgc2VjdXJpdHkgaXMKKyAgICAgcmVxdWVzdGVkLCB0aGUgc2VydmVyIHRoZW4gaXNzdWVzIGEgImNoYWxsZW5nZSIgYW5kIHRoZW4gdGhlIGNsaWVudAorICAgICByZXBsaWVzIHdpdGggYSAicmVzcG9uc2UiLiAgSWYgdGhlIHJlc3BvbnNlIGlzIHN1Y2Nlc3NmdWwsIHRoZSBzZWN1cml0eSBpcworICAgICBzZXQgZm9yIHRoZSBsaWZldGltZSBvZiB0aGF0IGNvbm5lY3Rpb24sIGFuZCBhbGwgc3Vic2VxdWVudCBjYWxscyBtYWRlCisgICAgIHVwb24gaXQgdXNlIHRoYXQgc2FtZSBzZWN1cml0eS4gIEluIHRoZSBldmVudCB0aGF0IHRoZSBzZXJ2ZXIgbGV0cyBhCisgICAgIGNvbm5lY3Rpb24gbGFwc2UgYmVmb3JlIHRoZSBjbGllbnQsIHRoZSBzZWN1cml0eSB3aWxsIGJlIHJlbmVnb3RpYXRlZCBpZgorICAgICB0aGUgY2xpZW50IHVzZXMgdGhlIGNvbm5lY3Rpb24gYWdhaW4uCisKKyAoKikgQ2FsbHMgdXNlIEFDSyBwYWNrZXRzIHRvIGhhbmRsZSByZWxpYWJpbGl0eS4gIERhdGEgcGFja2V0cyBhcmUgYWxzbworICAgICBleHBsaWNpdGx5IHNlcXVlbmNlZCBwZXIgY2FsbC4KKworICgqKSBUaGVyZSBhcmUgdHdvIHR5cGVzIG9mIHBvc2l0aXZlIGFja25vd2xlZGdlbWVudDogaGFyZC1BQ0tzIGFuZCBzb2Z0LUFDS3MuCisgICAgIEEgaGFyZC1BQ0sgaW5kaWNhdGVzIHRvIHRoZSBmYXIgc2lkZSB0aGF0IGFsbCB0aGUgZGF0YSByZWNlaXZlZCB0byBhIHBvaW50CisgICAgIGhhcyBiZWVuIHJlY2VpdmVkIGFuZCBwcm9jZXNzZWQ7IGEgc29mdC1BQ0sgaW5kaWNhdGVzIHRoYXQgdGhlIGRhdGEgaGFzCisgICAgIGJlZW4gcmVjZWl2ZWQgYnV0IG1heSB5ZXQgYmUgZGlzY2FyZGVkIGFuZCByZS1yZXF1ZXN0ZWQuICBUaGUgc2VuZGVyIG1heQorICAgICBub3QgZGlzY2FyZCBhbnkgdHJhbnNtaXR0YWJsZSBwYWNrZXRzIHVudGlsIHRoZXkndmUgYmVlbiBoYXJkLUFDSydkLgorCisgKCopIFJlY2VwdGlvbiBvZiBhIHJlcGx5IGRhdGEgcGFja2V0IGltcGxpY2l0bHkgaGFyZC1BQ0sncyBhbGwgdGhlIGRhdGEKKyAgICAgcGFja2V0cyB0aGF0IG1ha2UgdXAgdGhlIHJlcXVlc3QuCisKKyAoKikgQW4gY2FsbCBpcyBjb21wbGV0ZSB3aGVuIHRoZSByZXF1ZXN0IGhhcyBiZWVuIHNlbnQsIHRoZSByZXBseSBoYXMgYmVlbgorICAgICByZWNlaXZlZCBhbmQgdGhlIGZpbmFsIGhhcmQtQUNLIG9uIHRoZSBsYXN0IHBhY2tldCBvZiB0aGUgcmVwbHkgaGFzCisgICAgIHJlYWNoZWQgdGhlIHNlcnZlci4KKworICgqKSBBbiBjYWxsIG1heSBiZSBhYm9ydGVkIGJ5IGVpdGhlciBlbmQgYXQgYW55IHRpbWUgdXAgdG8gaXRzIGNvbXBsZXRpb24uCisKKworPT09PT09PT09PT09PT09PT09PT09CitBRl9SWFJQQyBEUklWRVIgTU9ERUwKKz09PT09PT09PT09PT09PT09PT09PQorCitBYm91dCB0aGUgQUZfUlhSUEMgZHJpdmVyOgorCisgKCopIFRoZSBBRl9SWFJQQyBwcm90b2NvbCB0cmFuc3BhcmVudGx5IHVzZXMgaW50ZXJuYWwgc29ja2V0cyBvZiB0aGUgdHJhbnNwb3J0CisgICAgIHByb3RvY29sIHRvIHJlcHJlc2VudCB0cmFuc3BvcnQgZW5kcG9pbnRzLgorCisgKCopIEFGX1JYUlBDIHNvY2tldHMgbWFwIG9udG8gUnhSUEMgY29ubmVjdGlvbiBidW5kbGVzLiAgQWN0dWFsIFJ4UlBDCisgICAgIGNvbm5lY3Rpb25zIGFyZSBoYW5kbGVkIHRyYW5zcGFyZW50bHkuICBPbmUgY2xpZW50IHNvY2tldCBtYXkgYmUgdXNlZCB0bworICAgICBtYWtlIG11bHRpcGxlIHNpbXVsdGFuZW91cyBjYWxscyB0byB0aGUgc2FtZSBzZXJ2aWNlLiAgT25lIHNlcnZlciBzb2NrZXQKKyAgICAgbWF5IGhhbmRsZSBjYWxscyBmcm9tIG1hbnkgY2xpZW50cy4KKworICgqKSBBZGRpdGlvbmFsIHBhcmFsbGVsIGNsaWVudCBjb25uZWN0aW9ucyB3aWxsIGJlIGluaXRpYXRlZCB0byBzdXBwb3J0IGV4dHJhCisgICAgIGNvbmN1cnJlbnQgY2FsbHMsIHVwIHRvIGEgdHVuYWJsZSBsaW1pdC4KKworICgqKSBFYWNoIGNvbm5lY3Rpb24gaXMgcmV0YWluZWQgZm9yIGEgY2VydGFpbiBhbW91bnQgb2YgdGltZSBbdHVuYWJsZV0gYWZ0ZXIKKyAgICAgdGhlIGxhc3QgY2FsbCBjdXJyZW50bHkgdXNpbmcgaXQgaGFzIGNvbXBsZXRlZCBpbiBjYXNlIGEgbmV3IGNhbGwgaXMgbWFkZQorICAgICB0aGF0IGNvdWxkIHJldXNlIGl0LgorCisgKCopIEVhY2ggaW50ZXJuYWwgVURQIHNvY2tldCBpcyByZXRhaW5lZCBbdHVuYWJsZV0gZm9yIGEgY2VydGFpbiBhbW91bnQgb2YKKyAgICAgdGltZSBbdHVuYWJsZV0gYWZ0ZXIgdGhlIGxhc3QgY29ubmVjdGlvbiB1c2luZyBpdCBkaXNjYXJkZWQsIGluIGNhc2UgYSBuZXcKKyAgICAgY29ubmVjdGlvbiBpcyBtYWRlIHRoYXQgY291bGQgdXNlIGl0LgorCisgKCopIEEgY2xpZW50LXNpZGUgY29ubmVjdGlvbiBpcyBvbmx5IHNoYXJlZCBiZXR3ZWVuIGNhbGxzIGlmIHRoZXkgaGF2ZSBoYXZlCisgICAgIHRoZSBzYW1lIGtleSBzdHJ1Y3QgZGVzY3JpYmluZyB0aGVpciBzZWN1cml0eSAoYW5kIGFzc3VtaW5nIHRoZSBjYWxscworICAgICB3b3VsZCBvdGhlcndpc2Ugc2hhcmUgdGhlIGNvbm5lY3Rpb24pLiAgTm9uLXNlY3VyZWQgY2FsbHMgd291bGQgYWxzbyBiZQorICAgICBhYmxlIHRvIHNoYXJlIGNvbm5lY3Rpb25zIHdpdGggZWFjaCBvdGhlci4KKworICgqKSBBIHNlcnZlci1zaWRlIGNvbm5lY3Rpb24gaXMgc2hhcmVkIGlmIHRoZSBjbGllbnQgc2F5cyBpdCBpcy4KKworICgqKSBBQ0snaW5nIGlzIGhhbmRsZWQgYnkgdGhlIHByb3RvY29sIGRyaXZlciBhdXRvbWF0aWNhbGx5LCBpbmNsdWRpbmcgcGluZworICAgICByZXBseWluZy4KKworICgqKSBTT19LRUVQQUxJVkUgYXV0b21hdGljYWxseSBwaW5ncyB0aGUgb3RoZXIgc2lkZSB0byBrZWVwIHRoZSBjb25uZWN0aW9uCisgICAgIGFsaXZlIFtUT0RPXS4KKworICgqKSBJZiBhbiBJQ01QIGVycm9yIGlzIHJlY2VpdmVkLCBhbGwgY2FsbHMgYWZmZWN0ZWQgYnkgdGhhdCBlcnJvciB3aWxsIGJlCisgICAgIGFib3J0ZWQgd2l0aCBhbiBhcHByb3ByaWF0ZSBuZXR3b3JrIGVycm9yIHBhc3NlZCB0aHJvdWdoIHJlY3Ztc2coKS4KKworCitJbnRlcmFjdGlvbiB3aXRoIHRoZSB1c2VyIG9mIHRoZSBSeFJQQyBzb2NrZXQ6CisKKyAoKikgQSBzb2NrZXQgaXMgbWFkZSBpbnRvIGEgc2VydmVyIHNvY2tldCBieSBiaW5kaW5nIGFuIGFkZHJlc3Mgd2l0aCBhCisgICAgIG5vbi16ZXJvIHNlcnZpY2UgSUQuCisKKyAoKikgSW4gdGhlIGNsaWVudCwgc2VuZGluZyBhIHJlcXVlc3QgaXMgYWNoaWV2ZWQgd2l0aCBvbmUgb3IgbW9yZSBzZW5kbXNncywKKyAgICAgZm9sbG93ZWQgYnkgdGhlIHJlcGx5IGJlaW5nIHJlY2VpdmVkIHdpdGggb25lIG9yIG1vcmUgcmVjdm1zZ3MuCisKKyAoKikgVGhlIGZpcnN0IHNlbmRtc2cgZm9yIGEgcmVxdWVzdCB0byBiZSBzZW50IGZyb20gYSBjbGllbnQgY29udGFpbnMgYSB0YWcgdG8KKyAgICAgYmUgdXNlZCBpbiBhbGwgb3RoZXIgc2VuZG1zZ3Mgb3IgcmVjdm1zZ3MgYXNzb2NpYXRlZCB3aXRoIHRoYXQgY2FsbC4gIFRoZQorICAgICB0YWcgaXMgY2FycmllZCBpbiB0aGUgY29udHJvbCBkYXRhLgorCisgKCopIGNvbm5lY3QoKSBpcyB1c2VkIHRvIHN1cHBseSBhIGRlZmF1bHQgZGVzdGluYXRpb24gYWRkcmVzcyBmb3IgYSBjbGllbnQKKyAgICAgc29ja2V0LiAgVGhpcyBtYXkgYmUgb3ZlcnJpZGRlbiBieSBzdXBwbHlpbmcgYW4gYWx0ZXJuYXRlIGFkZHJlc3MgdG8gdGhlCisgICAgIGZpcnN0IHNlbmRtc2coKSBvZiBhIGNhbGwgKHN0cnVjdCBtc2doZHI6Om1zZ19uYW1lKS4KKworICgqKSBJZiBjb25uZWN0KCkgaXMgY2FsbGVkIG9uIGFuIHVuYm91bmQgY2xpZW50LCBhIHJhbmRvbSBsb2NhbCBwb3J0IHdpbGwKKyAgICAgYm91bmQgYmVmb3JlIHRoZSBvcGVyYXRpb24gdGFrZXMgcGxhY2UuCisKKyAoKikgQSBzZXJ2ZXIgc29ja2V0IG1heSBhbHNvIGJlIHVzZWQgdG8gbWFrZSBjbGllbnQgY2FsbHMuICBUbyBkbyB0aGlzLCB0aGUKKyAgICAgZmlyc3Qgc2VuZG1zZygpIG9mIHRoZSBjYWxsIG11c3Qgc3BlY2lmeSB0aGUgdGFyZ2V0IGFkZHJlc3MuICBUaGUgc2VydmVyJ3MKKyAgICAgdHJhbnNwb3J0IGVuZHBvaW50IGlzIHVzZWQgdG8gc2VuZCB0aGUgcGFja2V0cy4KKworICgqKSBPbmNlIHRoZSBhcHBsaWNhdGlvbiBoYXMgcmVjZWl2ZWQgdGhlIGxhc3QgbWVzc2FnZSBhc3NvY2lhdGVkIHdpdGggYSBjYWxsLAorICAgICB0aGUgdGFnIGlzIGd1YXJhbnRlZWQgbm90IHRvIGJlIHNlZW4gYWdhaW4sIGFuZCBzbyBpdCBjYW4gYmUgdXNlZCB0byBwaW4KKyAgICAgY2xpZW50IHJlc291cmNlcy4gIEEgbmV3IGNhbGwgY2FuIHRoZW4gYmUgaW5pdGlhdGVkIHdpdGggdGhlIHNhbWUgdGFnCisgICAgIHdpdGhvdXQgZmVhciBvZiBpbnRlcmZlcmVuY2UuCisKKyAoKikgSW4gdGhlIHNlcnZlciwgYSByZXF1ZXN0IGlzIHJlY2VpdmVkIHdpdGggb25lIG9yIG1vcmUgcmVjdm1zZ3MsIHRoZW4gdGhlCisgICAgIHRoZSByZXBseSBpcyB0cmFuc21pdHRlZCB3aXRoIG9uZSBvciBtb3JlIHNlbmRtc2dzLCBhbmQgdGhlbiB0aGUgZmluYWwgQUNLCisgICAgIGlzIHJlY2VpdmVkIHdpdGggYSBsYXN0IHJlY3Ztc2cuCisKKyAoKikgV2hlbiBzZW5kaW5nIGRhdGEgZm9yIGEgY2FsbCwgc2VuZG1zZyBpcyBnaXZlbiBNU0dfTU9SRSBpZiB0aGVyZSdzIG1vcmUKKyAgICAgZGF0YSB0byBjb21lIG9uIHRoYXQgY2FsbC4KKworICgqKSBXaGVuIHJlY2VpdmluZyBkYXRhIGZvciBhIGNhbGwsIHJlY3Ztc2cgZmxhZ3MgTVNHX01PUkUgaWYgdGhlcmUncyBtb3JlCisgICAgIGRhdGEgdG8gY29tZSBmb3IgdGhhdCBjYWxsLgorCisgKCopIFdoZW4gcmVjZWl2aW5nIGRhdGEgb3IgbWVzc2FnZXMgZm9yIGEgY2FsbCwgTVNHX0VPUiBpcyBmbGFnZ2VkIGJ5IHJlY3Ztc2cKKyAgICAgdG8gaW5kaWNhdGUgdGhlIHRlcm1pbmFsIG1lc3NhZ2UgZm9yIHRoYXQgY2FsbC4KKworICgqKSBBIGNhbGwgbWF5IGJlIGFib3J0ZWQgYnkgYWRkaW5nIGFuIGFib3J0IGNvbnRyb2wgbWVzc2FnZSB0byB0aGUgY29udHJvbAorICAgICBkYXRhLiAgSXNzdWluZyBhbiBhYm9ydCB0ZXJtaW5hdGVzIHRoZSBrZXJuZWwncyB1c2Ugb2YgdGhhdCBjYWxsJ3MgdGFnLgorICAgICBBbnkgbWVzc2FnZXMgd2FpdGluZyBpbiB0aGUgcmVjZWl2ZSBxdWV1ZSBmb3IgdGhhdCBjYWxsIHdpbGwgYmUgZGlzY2FyZGVkLgorCisgKCopIEFib3J0cywgYnVzeSBub3RpZmljYXRpb25zIGFuZCBjaGFsbGVuZ2UgcGFja2V0cyBhcmUgZGVsaXZlcmVkIGJ5IHJlY3Ztc2csCisgICAgIGFuZCBjb250cm9sIGRhdGEgbWVzc2FnZXMgd2lsbCBiZSBzZXQgdG8gaW5kaWNhdGUgdGhlIGNvbnRleHQuICBSZWNlaXZpbmcKKyAgICAgYW4gYWJvcnQgb3IgYSBidXN5IG1lc3NhZ2UgdGVybWluYXRlcyB0aGUga2VybmVsJ3MgdXNlIG9mIHRoYXQgY2FsbCdzIHRhZy4KKworICgqKSBUaGUgY29udHJvbCBkYXRhIHBhcnQgb2YgdGhlIG1zZ2hkciBzdHJ1Y3QgaXMgdXNlZCBmb3IgYSBudW1iZXIgb2YgdGhpbmdzOgorCisgICAgICgqKSBUaGUgdGFnIG9mIHRoZSBpbnRlbmRlZCBvciBhZmZlY3RlZCBjYWxsLgorCisgICAgICgqKSBTZW5kaW5nIG9yIHJlY2VpdmluZyBlcnJvcnMsIGFib3J0cyBhbmQgYnVzeSBub3RpZmljYXRpb25zLgorCisgICAgICgqKSBOb3RpZmljYXRpb25zIG9mIGluY29taW5nIGNhbGxzLgorCisgICAgICgqKSBTZW5kaW5nIGRlYnVnIHJlcXVlc3RzIGFuZCByZWNlaXZpbmcgZGVidWcgcmVwbGllcyBbVE9ET10uCisKKyAoKikgV2hlbiB0aGUga2VybmVsIGhhcyByZWNlaXZlZCBhbmQgc2V0IHVwIGFuIGluY29taW5nIGNhbGwsIGl0IHNlbmRzIGEKKyAgICAgbWVzc2FnZSB0byBzZXJ2ZXIgYXBwbGljYXRpb24gdG8gbGV0IGl0IGtub3cgdGhlcmUncyBhIG5ldyBjYWxsIGF3YWl0aW5nCisgICAgIGl0cyBhY2NlcHRhbmNlIFtyZWN2bXNnIHJlcG9ydHMgYSBzcGVjaWFsIGNvbnRyb2wgbWVzc2FnZV0uICBUaGUgc2VydmVyCisgICAgIGFwcGxpY2F0aW9uIHRoZW4gdXNlcyBzZW5kbXNnIHRvIGFzc2lnbiBhIHRhZyB0byB0aGUgbmV3IGNhbGwuICBPbmNlIHRoYXQKKyAgICAgaXMgZG9uZSwgdGhlIGZpcnN0IHBhcnQgb2YgdGhlIHJlcXVlc3QgZGF0YSB3aWxsIGJlIGRlbGl2ZXJlZCBieSByZWN2bXNnLgorCisgKCopIFRoZSBzZXJ2ZXIgYXBwbGljYXRpb24gaGFzIHRvIHByb3ZpZGUgdGhlIHNlcnZlciBzb2NrZXQgd2l0aCBhIGtleXJpbmcgb2YKKyAgICAgc2VjcmV0IGtleXMgY29ycmVzcG9uZGluZyB0byB0aGUgc2VjdXJpdHkgdHlwZXMgaXQgcGVybWl0cy4gIFdoZW4gYSBzZWN1cmUKKyAgICAgY29ubmVjdGlvbiBpcyBiZWluZyBzZXQgdXAsIHRoZSBrZXJuZWwgbG9va3MgdXAgdGhlIGFwcHJvcHJpYXRlIHNlY3JldCBrZXkKKyAgICAgaW4gdGhlIGtleXJpbmcgYW5kIHRoZW4gc2VuZHMgYSBjaGFsbGVuZ2UgcGFja2V0IHRvIHRoZSBjbGllbnQgYW5kCisgICAgIHJlY2VpdmVzIGEgcmVzcG9uc2UgcGFja2V0LiAgVGhlIGtlcm5lbCB0aGVuIGNoZWNrcyB0aGUgYXV0aG9yaXNhdGlvbiBvZgorICAgICB0aGUgcGFja2V0IGFuZCBlaXRoZXIgYWJvcnRzIHRoZSBjb25uZWN0aW9uIG9yIHNldHMgdXAgdGhlIHNlY3VyaXR5LgorCisgKCopIFRoZSBuYW1lIG9mIHRoZSBrZXkgYSBjbGllbnQgd2lsbCB1c2UgdG8gc2VjdXJlIGl0cyBjb21tdW5pY2F0aW9ucyBpcworICAgICBub21pbmF0ZWQgYnkgYSBzb2NrZXQgb3B0aW9uLgorCisKK05vdGVzIG9uIHJlY3Ztc2c6CisKKyAoKikgSWYgdGhlcmUncyBhIHNlcXVlbmNlIG9mIGRhdGEgbWVzc2FnZXMgYmVsb25naW5nIHRvIGEgcGFydGljdWxhciBjYWxsIG9uCisgICAgIHRoZSByZWNlaXZlIHF1ZXVlLCB0aGVuIHJlY3Ztc2cgd2lsbCBrZWVwIHdvcmtpbmcgdGhyb3VnaCB0aGVtIHVudGlsOgorCisgICAgIChhKSBpdCBtZWV0cyB0aGUgZW5kIG9mIHRoYXQgY2FsbCdzIHJlY2VpdmVkIGRhdGEsCisKKyAgICAgKGIpIGl0IG1lZXRzIGEgbm9uLWRhdGEgbWVzc2FnZSwKKworICAgICAoYykgaXQgbWVldHMgYSBtZXNzYWdlIGJlbG9uZ2luZyB0byBhIGRpZmZlcmVudCBjYWxsLCBvcgorCisgICAgIChkKSBpdCBmaWxscyB0aGUgdXNlciBidWZmZXIuCisKKyAgICAgSWYgcmVjdm1zZyBpcyBjYWxsZWQgaW4gYmxvY2tpbmcgbW9kZSwgaXQgd2lsbCBrZWVwIHNsZWVwaW5nLCBhd2FpdGluZyB0aGUKKyAgICAgcmVjZXB0aW9uIG9mIGZ1cnRoZXIgZGF0YSwgdW50aWwgb25lIG9mIHRoZSBhYm92ZSBmb3VyIGNvbmRpdGlvbnMgaXMgbWV0LgorCisgKDIpIE1TR19QRUVLIG9wZXJhdGVzIHNpbWlsYXJseSwgYnV0IHdpbGwgcmV0dXJuIGltbWVkaWF0ZWx5IGlmIGl0IGhhcyBwdXQgYW55CisgICAgIGRhdGEgaW4gdGhlIGJ1ZmZlciByYXRoZXIgdGhhbiBzbGVlcGluZyB1bnRpbCBpdCBjYW4gZmlsbCB0aGUgYnVmZmVyLgorCisgKDMpIElmIGEgZGF0YSBtZXNzYWdlIGlzIG9ubHkgcGFydGlhbGx5IGNvbnN1bWVkIGluIGZpbGxpbmcgYSB1c2VyIGJ1ZmZlciwKKyAgICAgdGhlbiB0aGUgcmVtYWluZGVyIG9mIHRoYXQgbWVzc2FnZSB3aWxsIGJlIGxlZnQgb24gdGhlIGZyb250IG9mIHRoZSBxdWV1ZQorICAgICBmb3IgdGhlIG5leHQgdGFrZXIuICBNU0dfVFJVTkMgd2lsbCBuZXZlciBiZSBmbGFnZ2VkLgorCisgKDQpIElmIHRoZXJlIGlzIG1vcmUgZGF0YSB0byBiZSBoYWQgb24gYSBjYWxsIChpdCBoYXNuJ3QgY29waWVkIHRoZSBsYXN0IGJ5dGUKKyAgICAgb2YgdGhlIGxhc3QgZGF0YSBtZXNzYWdlIGluIHRoYXQgcGhhc2UgeWV0KSwgdGhlbiBNU0dfTU9SRSB3aWxsIGJlCisgICAgIGZsYWdnZWQuCisKKworPT09PT09PT09PT09PT09PQorQ09OVFJPTCBNRVNTQUdFUworPT09PT09PT09PT09PT09PQorCitBRl9SWFJQQyBtYWtlcyB1c2Ugb2YgY29udHJvbCBtZXNzYWdlcyBpbiBzZW5kbXNnKCkgYW5kIHJlY3Ztc2coKSB0byBtdWx0aXBsZXgKK2NhbGxzLCB0byBpbnZva2UgY2VydGFpbiBhY3Rpb25zIGFuZCB0byByZXBvcnQgY2VydGFpbiBjb25kaXRpb25zLiAgVGhlc2UgYXJlOgorCisJTUVTU0FHRSBJRAkJU1JUIERBVEEJTUVBTklORworCT09PT09PT09PT09PT09PT09PT09PT09CT09PSA9PT09PT09PT09PQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJUlhSUENfVVNFUl9DQUxMX0lECXNyLSBVc2VyIElECUFwcCdzIGNhbGwgc3BlY2lmaWVyCisJUlhSUENfQUJPUlQJCXNydCBBYm9ydCBjb2RlCUFib3J0IGNvZGUgdG8gaXNzdWUvcmVjZWl2ZWQKKwlSWFJQQ19BQ0sJCS1ydCBuL2EJCUZpbmFsIEFDSyByZWNlaXZlZAorCVJYUlBDX05FVF9FUlJPUgkJLXJ0IGVycm9yIG51bQlOZXR3b3JrIGVycm9yIG9uIGNhbGwKKwlSWFJQQ19CVVNZCQktcnQgbi9hCQlDYWxsIHJlamVjdGVkIChzZXJ2ZXIgYnVzeSkKKwlSWFJQQ19MT0NBTF9FUlJPUgktcnQgZXJyb3IgbnVtCUxvY2FsIGVycm9yIGVuY291bnRlcmVkCisJUlhSUENfTkVXX0NBTEwJCS1yLSBuL2EJCU5ldyBjYWxsIHJlY2VpdmVkCisJUlhSUENfQUNDRVBUCQlzLS0gbi9hCQlBY2NlcHQgbmV3IGNhbGwKKworCShTUlQgPSB1c2FibGUgaW4gU2VuZG1zZyAvIGRlbGl2ZXJlZCBieSBSZWN2bXNnIC8gVGVybWluYWwgbWVzc2FnZSkKKworICgqKSBSWFJQQ19VU0VSX0NBTExfSUQKKworICAgICBUaGlzIGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhlIGFwcGxpY2F0aW9uJ3MgY2FsbCBJRC4gIEl0J3MgYW4gdW5zaWduZWQgbG9uZworICAgICB0aGF0IHRoZSBhcHAgc3BlY2lmaWVzIGluIHRoZSBjbGllbnQgYnkgYXR0YWNoaW5nIGl0IHRvIHRoZSBmaXJzdCBkYXRhCisgICAgIG1lc3NhZ2Ugb3IgaW4gdGhlIHNlcnZlciBieSBwYXNzaW5nIGl0IGluIGFzc29jaWF0aW9uIHdpdGggYW4gUlhSUENfQUNDRVBUCisgICAgIG1lc3NhZ2UuICByZWN2bXNnKCkgcGFzc2VzIGl0IGluIGNvbmp1bmN0aW9uIHdpdGggYWxsIG1lc3NhZ2VzIGV4Y2VwdAorICAgICB0aG9zZSBvZiB0aGUgUlhSUENfTkVXX0NBTEwgbWVzc2FnZS4KKworICgqKSBSWFJQQ19BQk9SVAorCisgICAgIFRoaXMgaXMgY2FuIGJlIHVzZWQgYnkgYW4gYXBwbGljYXRpb24gdG8gYWJvcnQgYSBjYWxsIGJ5IHBhc3NpbmcgaXQgdG8KKyAgICAgc2VuZG1zZywgb3IgaXQgY2FuIGJlIGRlbGl2ZXJlZCBieSByZWN2bXNnIHRvIGluZGljYXRlIGEgcmVtb3RlIGFib3J0IHdhcworICAgICByZWNlaXZlZC4gIEVpdGhlciB3YXksIGl0IG11c3QgYmUgYXNzb2NpYXRlZCB3aXRoIGFuIFJYUlBDX1VTRVJfQ0FMTF9JRCB0bworICAgICBzcGVjaWZ5IHRoZSBjYWxsIGFmZmVjdGVkLiAgSWYgYW4gYWJvcnQgaXMgYmVpbmcgc2VudCwgdGhlbiBlcnJvciBFQkFEU0xUCisgICAgIHdpbGwgYmUgcmV0dXJuZWQgaWYgdGhlcmUgaXMgbm8gY2FsbCB3aXRoIHRoYXQgdXNlciBJRC4KKworICgqKSBSWFJQQ19BQ0sKKworICAgICBUaGlzIGlzIGRlbGl2ZXJlZCB0byBhIHNlcnZlciBhcHBsaWNhdGlvbiB0byBpbmRpY2F0ZSB0aGF0IHRoZSBmaW5hbCBBQ0sKKyAgICAgb2YgYSBjYWxsIHdhcyByZWNlaXZlZCBmcm9tIHRoZSBjbGllbnQuICBJdCB3aWxsIGJlIGFzc29jaWF0ZWQgd2l0aCBhbgorICAgICBSWFJQQ19VU0VSX0NBTExfSUQgdG8gaW5kaWNhdGUgdGhlIGNhbGwgdGhhdCdzIG5vdyBjb21wbGV0ZS4KKworICgqKSBSWFJQQ19ORVRfRVJST1IKKworICAgICBUaGlzIGlzIGRlbGl2ZXJlZCB0byBhbiBhcHBsaWNhdGlvbiB0byBpbmRpY2F0ZSB0aGF0IGFuIElDTVAgZXJyb3IgbWVzc2FnZQorICAgICB3YXMgZW5jb3VudGVyZWQgaW4gdGhlIHByb2Nlc3Mgb2YgdHJ5aW5nIHRvIHRhbGsgdG8gdGhlIHBlZXIuICBBbgorICAgICBlcnJuby1jbGFzcyBpbnRlZ2VyIHZhbHVlIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGNvbnRyb2wgbWVzc2FnZSBkYXRhCisgICAgIGluZGljYXRpbmcgdGhlIHByb2JsZW0sIGFuZCBhbiBSWFJQQ19VU0VSX0NBTExfSUQgd2lsbCBpbmRpY2F0ZSB0aGUgY2FsbAorICAgICBhZmZlY3RlZC4KKworICgqKSBSWFJQQ19CVVNZCisKKyAgICAgVGhpcyBpcyBkZWxpdmVyZWQgdG8gYSBjbGllbnQgYXBwbGljYXRpb24gdG8gaW5kaWNhdGUgdGhhdCBhIGNhbGwgd2FzCisgICAgIHJlamVjdGVkIGJ5IHRoZSBzZXJ2ZXIgZHVlIHRvIHRoZSBzZXJ2ZXIgYmVpbmcgYnVzeS4gIEl0IHdpbGwgYmUKKyAgICAgYXNzb2NpYXRlZCB3aXRoIGFuIFJYUlBDX1VTRVJfQ0FMTF9JRCB0byBpbmRpY2F0ZSB0aGUgcmVqZWN0ZWQgY2FsbC4KKworICgqKSBSWFJQQ19MT0NBTF9FUlJPUgorCisgICAgIFRoaXMgaXMgZGVsaXZlcmVkIHRvIGFuIGFwcGxpY2F0aW9uIHRvIGluZGljYXRlIHRoYXQgYSBsb2NhbCBlcnJvciB3YXMKKyAgICAgZW5jb3VudGVyZWQgYW5kIHRoYXQgYSBjYWxsIGhhcyBiZWVuIGFib3J0ZWQgYmVjYXVzZSBvZiBpdC4gIEFuCisgICAgIGVycm5vLWNsYXNzIGludGVnZXIgdmFsdWUgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgY29udHJvbCBtZXNzYWdlIGRhdGEKKyAgICAgaW5kaWNhdGluZyB0aGUgcHJvYmxlbSwgYW5kIGFuIFJYUlBDX1VTRVJfQ0FMTF9JRCB3aWxsIGluZGljYXRlIHRoZSBjYWxsCisgICAgIGFmZmVjdGVkLgorCisgKCopIFJYUlBDX05FV19DQUxMCisKKyAgICAgVGhpcyBpcyBkZWxpdmVyZWQgdG8gaW5kaWNhdGUgdG8gYSBzZXJ2ZXIgYXBwbGljYXRpb24gdGhhdCBhIG5ldyBjYWxsIGhhcworICAgICBhcnJpdmVkIGFuZCBpcyBhd2FpdGluZyBhY2NlcHRhbmNlLiAgTm8gdXNlciBJRCBpcyBhc3NvY2lhdGVkIHdpdGggdGhpcywKKyAgICAgYXMgYSB1c2VyIElEIG11c3Qgc3Vic2VxdWVudGx5IGJlIGFzc2lnbmVkIGJ5IGRvaW5nIGFuIFJYUlBDX0FDQ0VQVC4KKworICgqKSBSWFJQQ19BQ0NFUFQKKworICAgICBUaGlzIGlzIHVzZWQgYnkgYSBzZXJ2ZXIgYXBwbGljYXRpb24gdG8gYXR0ZW1wdCB0byBhY2NlcHQgYSBjYWxsIGFuZAorICAgICBhc3NpZ24gaXQgYSB1c2VyIElELiAgSXQgc2hvdWxkIGJlIGFzc29jaWF0ZWQgd2l0aCBhbiBSWFJQQ19VU0VSX0NBTExfSUQKKyAgICAgdG8gaW5kaWNhdGUgdGhlIHVzZXIgSUQgdG8gYmUgYXNzaWduZWQuICBJZiB0aGVyZSBpcyBubyBjYWxsIHRvIGJlCisgICAgIGFjY2VwdGVkIChpdCBtYXkgaGF2ZSB0aW1lZCBvdXQsIGJlZW4gYWJvcnRlZCwgZXRjLiksIHRoZW4gc2VuZG1zZyB3aWxsCisgICAgIHJldHVybiBlcnJvciBFTk9EQVRBLiAgSWYgdGhlIHVzZXIgSUQgaXMgYWxyZWFkeSBpbiB1c2UgYnkgYW5vdGhlciBjYWxsLAorICAgICB0aGVuIGVycm9yIEVCQURTTFQgd2lsbCBiZSByZXR1cm5lZC4KKworCis9PT09PT09PT09PT09PQorU09DS0VUIE9QVElPTlMKKz09PT09PT09PT09PT09CisKK0FGX1JYUlBDIHNvY2tldHMgc3VwcG9ydCBhIGZldyBzb2NrZXQgb3B0aW9ucyBhdCB0aGUgU09MX1JYUlBDIGxldmVsOgorCisgKCopIFJYUlBDX1NFQ1VSSVRZX0tFWQorCisgICAgIFRoaXMgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUga2V5IHRvIGJlIHVzZWQuICBUaGUga2V5IGlzCisgICAgIGV4dHJhY3RlZCBmcm9tIHRoZSBjYWxsaW5nIHByb2Nlc3MncyBrZXlyaW5ncyB3aXRoIHJlcXVlc3Rfa2V5KCkgYW5kCisgICAgIHNob3VsZCBiZSBvZiAicnhycGMiIHR5cGUuCisKKyAgICAgVGhlIG9wdHZhbCBwb2ludGVyIHBvaW50cyB0byB0aGUgZGVzY3JpcHRpb24gc3RyaW5nLCBhbmQgb3B0bGVuIGluZGljYXRlcworICAgICBob3cgbG9uZyB0aGUgc3RyaW5nIGlzLCB3aXRob3V0IHRoZSBOVUwgdGVybWluYXRvci4KKworICgqKSBSWFJQQ19TRUNVUklUWV9LRVlSSU5HCisKKyAgICAgU2ltaWxhciB0byBhYm92ZSBidXQgc3BlY2lmaWVzIGEga2V5cmluZyBvZiBzZXJ2ZXIgc2VjcmV0IGtleXMgdG8gdXNlIChrZXkKKyAgICAgdHlwZSAia2V5cmluZyIpLiAgU2VlIHRoZSAiU2VjdXJpdHkiIHNlY3Rpb24uCisKKyAoKikgUlhSUENfRVhDTFVTSVZFX0NPTk5FQ1RJT04KKworICAgICBUaGlzIGlzIHVzZWQgdG8gcmVxdWVzdCB0aGF0IG5ldyBjb25uZWN0aW9ucyBzaG91bGQgYmUgdXNlZCBmb3IgZWFjaCBjYWxsCisgICAgIG1hZGUgc3Vic2VxdWVudGx5IG9uIHRoaXMgc29ja2V0LiAgb3B0dmFsIHNob3VsZCBiZSBOVUxMIGFuZCBvcHRsZW4gMC4KKworICgqKSBSWFJQQ19NSU5fU0VDVVJJVFlfTEVWRUwKKworICAgICBUaGlzIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgbWluaW11bSBzZWN1cml0eSBsZXZlbCByZXF1aXJlZCBmb3IgY2FsbHMgb24KKyAgICAgdGhpcyBzb2NrZXQuICBvcHR2YWwgbXVzdCBwb2ludCB0byBhbiBpbnQgY29udGFpbmluZyBvbmUgb2YgdGhlIGZvbGxvd2luZworICAgICB2YWx1ZXM6CisKKyAgICAgKGEpIFJYUlBDX1NFQ1VSSVRZX1BMQUlOCisKKwkgRW5jcnlwdGVkIGNoZWNrc3VtIG9ubHkuCisKKyAgICAgKGIpIFJYUlBDX1NFQ1VSSVRZX0FVVEgKKworCSBFbmNyeXB0ZWQgY2hlY2tzdW0gcGx1cyBwYWNrZXQgcGFkZGVkIGFuZCBmaXJzdCBlaWdodCBieXRlcyBvZiBwYWNrZXQKKwkgZW5jcnlwdGVkIC0gd2hpY2ggaW5jbHVkZXMgdGhlIGFjdHVhbCBwYWNrZXQgbGVuZ3RoLgorCisgICAgIChjKSBSWFJQQ19TRUNVUklUWV9FTkNSWVBURUQKKworCSBFbmNyeXB0ZWQgY2hlY2tzdW0gcGx1cyBlbnRpcmUgcGFja2V0IHBhZGRlZCBhbmQgZW5jcnlwdGVkLCBpbmNsdWRpbmcKKwkgYWN0dWFsIHBhY2tldCBsZW5ndGguCisKKworPT09PT09PT0KK1NFQ1VSSVRZCis9PT09PT09PQorCitDdXJyZW50bHksIG9ubHkgdGhlIGtlcmJlcm9zIDQgZXF1aXZhbGVudCBwcm90b2NvbCBoYXMgYmVlbiBpbXBsZW1lbnRlZAorKHNlY3VyaXR5IGluZGV4IDIgLSByeGthZCkuICBUaGlzIHJlcXVpcmVzIHRoZSByeGthZCBtb2R1bGUgdG8gYmUgbG9hZGVkIGFuZCwKK29uIHRoZSBjbGllbnQsIHRpY2tldHMgb2YgdGhlIGFwcHJvcHJpYXRlIHR5cGUgdG8gYmUgb2J0YWluZWQgZnJvbSB0aGUgQUZTCitrYXNlcnZlciBvciB0aGUga2VyYmVyb3Mgc2VydmVyIGFuZCBpbnN0YWxsZWQgYXMgInJ4cnBjIiB0eXBlIGtleXMuICBUaGlzIGlzCitub3JtYWxseSBkb25lIHVzaW5nIHRoZSBrbG9nIHByb2dyYW0uICBBbiBleGFtcGxlIHNpbXBsZSBrbG9nIHByb2dyYW0gY2FuIGJlCitmb3VuZCBhdDoKKworCWh0dHA6Ly9wZW9wbGUucmVkaGF0LmNvbS9+ZGhvd2VsbHMvcnhycGMva2xvZy5jCisKK1RoZSBwYXlsb2FkIHByb3ZpZGVkIHRvIGFkZF9rZXkoKSBvbiB0aGUgY2xpZW50IHNob3VsZCBiZSBvZiB0aGUgZm9sbG93aW5nCitmb3JtOgorCisJc3RydWN0IHJ4cnBjX2tleV9zZWMyX3YxIHsKKwkJdWludDE2X3QJc2VjdXJpdHlfaW5kZXg7CS8qIDIgKi8KKwkJdWludDE2X3QJdGlja2V0X2xlbmd0aDsJLyogbGVuZ3RoIG9mIHRpY2tldFtdICovCisJCXVpbnQzMl90CWV4cGlyeTsJCS8qIHRpbWUgYXQgd2hpY2ggZXhwaXJlcyAqLworCQl1aW50OF90CQlrdm5vOwkJLyoga2V5IHZlcnNpb24gbnVtYmVyICovCisJCXVpbnQ4X3QJCV9fcGFkWzNdOworCQl1aW50OF90CQlzZXNzaW9uX2tleVs4XTsJLyogREVTIHNlc3Npb24ga2V5ICovCisJCXVpbnQ4X3QJCXRpY2tldFswXTsJLyogdGhlIGVuY3J5cHRlZCB0aWNrZXQgKi8KKwl9OworCitXaGVyZSB0aGUgdGlja2V0IGJsb2IgaXMganVzdCBhcHBlbmRlZCB0byB0aGUgYWJvdmUgc3RydWN0dXJlLgorCisKK0ZvciB0aGUgc2VydmVyLCBrZXlzIG9mIHR5cGUgInJ4cnBjX3MiIG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdG8gdGhlIHNlcnZlci4KK1RoZXkgaGF2ZSBhIGRlc2NyaXB0aW9uIG9mICI8c2VydmljZUlEPjo8c2VjdXJpdHlJbmRleD4iIChlZzogIjUyOjIiIGZvciBhbgorcnhrYWQga2V5IGZvciB0aGUgQUZTIFZMIHNlcnZpY2UpLiAgV2hlbiBzdWNoIGEga2V5IGlzIGNyZWF0ZWQsIGl0IHNob3VsZCBiZQorZ2l2ZW4gdGhlIHNlcnZlcidzIHNlY3JldCBrZXkgYXMgdGhlIGluc3RhbnRpYXRpb24gZGF0YSAoc2VlIHRoZSBleGFtcGxlCitiZWxvdykuCisKKwlhZGRfa2V5KCJyeHJwY19zIiwgIjUyOjIiLCBzZWNyZXRfa2V5LCA4LCBrZXlyaW5nKTsKKworQSBrZXlyaW5nIGlzIHBhc3NlZCB0byB0aGUgc2VydmVyIHNvY2tldCBieSBuYW1pbmcgaXQgaW4gYSBzb2Nrb3B0LiAgVGhlIHNlcnZlcgorc29ja2V0IHRoZW4gbG9va3MgdGhlIHNlcnZlciBzZWNyZXQga2V5cyB1cCBpbiB0aGlzIGtleXJpbmcgd2hlbiBzZWN1cmUKK2luY29taW5nIGNvbm5lY3Rpb25zIGFyZSBtYWRlLiAgVGhpcyBjYW4gYmUgc2VlbiBpbiBhbiBleGFtcGxlIHByb2dyYW0gdGhhdCBjYW4KK2JlIGZvdW5kIGF0OgorCisJaHR0cDovL3Blb3BsZS5yZWRoYXQuY29tL35kaG93ZWxscy9yeHJwYy9saXN0ZW4uYworCisKKz09PT09PT09PT09PT09PT09PT09CitFWEFNUExFIENMSUVOVCBVU0FHRQorPT09PT09PT09PT09PT09PT09PT0KKworQSBjbGllbnQgd291bGQgaXNzdWUgYW4gb3BlcmF0aW9uIGJ5OgorCisgKDEpIEFuIFJ4UlBDIHNvY2tldCBpcyBzZXQgdXAgYnk6CisKKwljbGllbnQgPSBzb2NrZXQoQUZfUlhSUEMsIFNPQ0tfREdSQU0sIFBGX0lORVQpOworCisgICAgIFdoZXJlIHRoZSB0aGlyZCBwYXJhbWV0ZXIgaW5kaWNhdGVzIHRoZSBwcm90b2NvbCBmYW1pbHkgb2YgdGhlIHRyYW5zcG9ydAorICAgICBzb2NrZXQgdXNlZCAtIHVzdWFsbHkgSVB2NCBidXQgaXQgY2FuIGFsc28gYmUgSVB2NiBbVE9ET10uCisKKyAoMikgQSBsb2NhbCBhZGRyZXNzIGNhbiBvcHRpb25hbGx5IGJlIGJvdW5kOgorCisJc3RydWN0IHNvY2thZGRyX3J4cnBjIHNyeCA9IHsKKwkJLnNyeF9mYW1pbHkJPSBBRl9SWFJQQywKKwkJLnNyeF9zZXJ2aWNlCT0gMCwgIC8qIHdlJ3JlIGEgY2xpZW50ICovCisJCS50cmFuc3BvcnRfdHlwZQk9IFNPQ0tfREdSQU0sCS8qIHR5cGUgb2YgdHJhbnNwb3J0IHNvY2tldCAqLworCQkudHJhbnNwb3J0LnNpbl9mYW1pbHkJPSBBRl9JTkVULAorCQkudHJhbnNwb3J0LnNpbl9wb3J0CT0gaHRvbnMoNzAwMCksIC8qIEFGUyBjYWxsYmFjayAqLworCQkudHJhbnNwb3J0LnNpbl9hZGRyZXNzCT0gMCwgIC8qIGFsbCBsb2NhbCBpbnRlcmZhY2VzICovCisJfTsKKwliaW5kKGNsaWVudCwgJnNyeCwgc2l6ZW9mKHNyeCkpOworCisgICAgIFRoaXMgc3BlY2lmaWVzIHRoZSBsb2NhbCBVRFAgcG9ydCB0byBiZSB1c2VkLiAgSWYgbm90IGdpdmVuLCBhIHJhbmRvbQorICAgICBub24tcHJpdmlsZWdlZCBwb3J0IHdpbGwgYmUgdXNlZC4gIEEgVURQIHBvcnQgbWF5IGJlIHNoYXJlZCBiZXR3ZWVuCisgICAgIHNldmVyYWwgdW5yZWxhdGVkIFJ4UlBDIHNvY2tldHMuICBTZWN1cml0eSBpcyBoYW5kbGVkIG9uIGEgYmFzaXMgb2YKKyAgICAgcGVyLVJ4UlBDIHZpcnR1YWwgY29ubmVjdGlvbi4KKworICgzKSBUaGUgc2VjdXJpdHkgaXMgc2V0OgorCisJY29uc3QgY2hhciAqa2V5ID0gIkFGUzpjYW1icmlkZ2UucmVkaGF0LmNvbSI7CisJc2V0c29ja29wdChjbGllbnQsIFNPTF9SWFJQQywgUlhSUENfU0VDVVJJVFlfS0VZLCBrZXksIHN0cmxlbihrZXkpKTsKKworICAgICBUaGlzIGlzc3VlcyBhIHJlcXVlc3Rfa2V5KCkgdG8gZ2V0IHRoZSBrZXkgcmVwcmVzZW50aW5nIHRoZSBzZWN1cml0eQorICAgICBjb250ZXh0LiAgVGhlIG1pbmltdW0gc2VjdXJpdHkgbGV2ZWwgY2FuIGJlIHNldDoKKworCXVuc2lnbmVkIGludCBzZWMgPSBSWFJQQ19TRUNVUklUWV9FTkNSWVBURUQ7CisJc2V0c29ja29wdChjbGllbnQsIFNPTF9SWFJQQywgUlhSUENfTUlOX1NFQ1VSSVRZX0xFVkVMLAorCQkgICAmc2VjLCBzaXplb2Yoc2VjKSk7CisKKyAoNCkgVGhlIHNlcnZlciB0byBiZSBjb250YWN0ZWQgY2FuIHRoZW4gYmUgc3BlY2lmaWVkIChhbHRlcm5hdGl2ZWx5IHRoaXMgY2FuCisgICAgIGJlIGRvbmUgdGhyb3VnaCBzZW5kbXNnKToKKworCXN0cnVjdCBzb2NrYWRkcl9yeHJwYyBzcnggPSB7CisJCS5zcnhfZmFtaWx5CT0gQUZfUlhSUEMsCisJCS5zcnhfc2VydmljZQk9IFZMX1NFUlZJQ0VfSUQsCisJCS50cmFuc3BvcnRfdHlwZQk9IFNPQ0tfREdSQU0sCS8qIHR5cGUgb2YgdHJhbnNwb3J0IHNvY2tldCAqLworCQkudHJhbnNwb3J0LnNpbl9mYW1pbHkJPSBBRl9JTkVULAorCQkudHJhbnNwb3J0LnNpbl9wb3J0CT0gaHRvbnMoNzAwNSksIC8qIEFGUyB2b2x1bWUgbWFuYWdlciAqLworCQkudHJhbnNwb3J0LnNpbl9hZGRyZXNzCT0gLi4uLAorCX07CisJY29ubmVjdChjbGllbnQsICZzcngsIHNpemVvZihzcngpKTsKKworICg1KSBUaGUgcmVxdWVzdCBkYXRhIHNob3VsZCB0aGVuIGJlIHBvc3RlZCB0byB0aGUgc2VydmVyIHNvY2tldCB1c2luZyBhIHNlcmllcworICAgICBvZiBzZW5kbXNnKCkgY2FsbHMsIGVhY2ggd2l0aCB0aGUgZm9sbG93aW5nIGNvbnRyb2wgbWVzc2FnZSBhdHRhY2hlZDoKKworCVJYUlBDX1VTRVJfQ0FMTF9JRAktIHNwZWNpZmllcyB0aGUgdXNlciBJRCBmb3IgdGhpcyBjYWxsCisKKyAgICAgTVNHX01PUkUgc2hvdWxkIGJlIHNldCBpbiBtc2doZHI6Om1zZ19mbGFncyBvbiBhbGwgYnV0IHRoZSBsYXN0IHBhcnQgb2YKKyAgICAgdGhlIHJlcXVlc3QuICBNdWx0aXBsZSByZXF1ZXN0cyBtYXkgYmUgbWFkZSBzaW11bHRhbmVvdXNseS4KKworICAgICBJZiBhIGNhbGwgaXMgaW50ZW5kZWQgdG8gZ28gdG8gYSBkZXN0aW5hdGlvbiBvdGhlciB0aGVuIHRoZSBkZWZhdWx0CisgICAgIHNwZWNpZmllZCB0aHJvdWdoIGNvbm5lY3QoKSwgdGhlbiBtc2doZHI6Om1zZ19uYW1lIHNob3VsZCBiZSBzZXQgb24gdGhlCisgICAgIGZpcnN0IHJlcXVlc3QgbWVzc2FnZSBvZiB0aGF0IGNhbGwuCisKKyAoNikgVGhlIHJlcGx5IGRhdGEgd2lsbCB0aGVuIGJlIHBvc3RlZCB0byB0aGUgc2VydmVyIHNvY2tldCBmb3IgcmVjdm1zZygpIHRvCisgICAgIHBpY2sgdXAuICBNU0dfTU9SRSB3aWxsIGJlIGZsYWdnZWQgYnkgcmVjdm1zZygpIGlmIHRoZXJlJ3MgbW9yZSByZXBseSBkYXRhCisgICAgIGZvciBhIHBhcnRpY3VsYXIgY2FsbCB0byBiZSByZWFkLiAgTVNHX0VPUiB3aWxsIGJlIHNldCBvbiB0aGUgdGVybWluYWwKKyAgICAgcmVhZCBmb3IgYSBjYWxsLgorCisgICAgIEFsbCBkYXRhIHdpbGwgYmUgZGVsaXZlcmVkIHdpdGggdGhlIGZvbGxvd2luZyBjb250cm9sIG1lc3NhZ2UgYXR0YWNoZWQ6CisKKwlSWFJQQ19VU0VSX0NBTExfSUQJLSBzcGVjaWZpZXMgdGhlIHVzZXIgSUQgZm9yIHRoaXMgY2FsbAorCisgICAgIElmIGFuIGFib3J0IG9yIGVycm9yIG9jY3VycmVkLCB0aGlzIHdpbGwgYmUgcmV0dXJuZWQgaW4gdGhlIGNvbnRyb2wgZGF0YQorICAgICBidWZmZXIgaW5zdGVhZCwgYW5kIE1TR19FT1Igd2lsbCBiZSBmbGFnZ2VkIHRvIGluZGljYXRlIHRoZSBlbmQgb2YgdGhhdAorICAgICBjYWxsLgorCisKKz09PT09PT09PT09PT09PT09PT09CitFWEFNUExFIFNFUlZFUiBVU0FHRQorPT09PT09PT09PT09PT09PT09PT0KKworQSBzZXJ2ZXIgd291bGQgYmUgc2V0IHVwIHRvIGFjY2VwdCBvcGVyYXRpb25zIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyOgorCisgKDEpIEFuIFJ4UlBDIHNvY2tldCBpcyBjcmVhdGVkIGJ5OgorCisJc2VydmVyID0gc29ja2V0KEFGX1JYUlBDLCBTT0NLX0RHUkFNLCBQRl9JTkVUKTsKKworICAgICBXaGVyZSB0aGUgdGhpcmQgcGFyYW1ldGVyIGluZGljYXRlcyB0aGUgYWRkcmVzcyB0eXBlIG9mIHRoZSB0cmFuc3BvcnQKKyAgICAgc29ja2V0IHVzZWQgLSB1c3VhbGx5IElQdjQuCisKKyAoMikgU2VjdXJpdHkgaXMgc2V0IHVwIGlmIGRlc2lyZWQgYnkgZ2l2aW5nIHRoZSBzb2NrZXQgYSBrZXlyaW5nIHdpdGggc2VydmVyCisgICAgIHNlY3JldCBrZXlzIGluIGl0OgorCisJa2V5cmluZyA9IGFkZF9rZXkoImtleXJpbmciLCAiQUZTa2V5cyIsIE5VTEwsIDAsCisJCQkgIEtFWV9TUEVDX1BST0NFU1NfS0VZUklORyk7CisKKwljb25zdCBjaGFyIHNlY3JldF9rZXlbOF0gPSB7CisJCTB4YTcsIDB4ODMsIDB4OGEsIDB4Y2IsIDB4YzcsIDB4ODMsIDB4ZWMsIDB4OTQgfTsKKwlhZGRfa2V5KCJyeHJwY19zIiwgIjUyOjIiLCBzZWNyZXRfa2V5LCA4LCBrZXlyaW5nKTsKKworCXNldHNvY2tvcHQoc2VydmVyLCBTT0xfUlhSUEMsIFJYUlBDX1NFQ1VSSVRZX0tFWVJJTkcsICJBRlNrZXlzIiwgNyk7CisKKyAgICAgVGhlIGtleXJpbmcgY2FuIGJlIG1hbmlwdWxhdGVkIGFmdGVyIGl0IGhhcyBiZWVuIGdpdmVuIHRvIHRoZSBzb2NrZXQuIFRoaXMKKyAgICAgcGVybWl0cyB0aGUgc2VydmVyIHRvIGFkZCBtb3JlIGtleXMsIHJlcGxhY2Uga2V5cywgZXRjLiB3aGlsc3QgaXQgaXMgbGl2ZS4KKworICgyKSBBIGxvY2FsIGFkZHJlc3MgbXVzdCB0aGVuIGJlIGJvdW5kOgorCisJc3RydWN0IHNvY2thZGRyX3J4cnBjIHNyeCA9IHsKKwkJLnNyeF9mYW1pbHkJPSBBRl9SWFJQQywKKwkJLnNyeF9zZXJ2aWNlCT0gVkxfU0VSVklDRV9JRCwgLyogUnhSUEMgc2VydmljZSBJRCAqLworCQkudHJhbnNwb3J0X3R5cGUJPSBTT0NLX0RHUkFNLAkvKiB0eXBlIG9mIHRyYW5zcG9ydCBzb2NrZXQgKi8KKwkJLnRyYW5zcG9ydC5zaW5fZmFtaWx5CT0gQUZfSU5FVCwKKwkJLnRyYW5zcG9ydC5zaW5fcG9ydAk9IGh0b25zKDcwMDApLCAvKiBBRlMgY2FsbGJhY2sgKi8KKwkJLnRyYW5zcG9ydC5zaW5fYWRkcmVzcwk9IDAsICAvKiBhbGwgbG9jYWwgaW50ZXJmYWNlcyAqLworCX07CisJYmluZChzZXJ2ZXIsICZzcngsIHNpemVvZihzcngpKTsKKworICgzKSBUaGUgc2VydmVyIGlzIHRoZW4gc2V0IHRvIGxpc3RlbiBvdXQgZm9yIGluY29taW5nIGNhbGxzOgorCisJbGlzdGVuKHNlcnZlciwgMTAwKTsKKworICg0KSBUaGUga2VybmVsIG5vdGlmaWVzIHRoZSBzZXJ2ZXIgb2YgcGVuZGluZyBpbmNvbWluZyBjb25uZWN0aW9ucyBieSBzZW5kaW5nCisgICAgIGl0IGEgbWVzc2FnZSBmb3IgZWFjaC4gIFRoaXMgaXMgcmVjZWl2ZWQgd2l0aCByZWN2bXNnKCkgb24gdGhlIHNlcnZlcgorICAgICBzb2NrZXQuICBJdCBoYXMgbm8gZGF0YSwgYW5kIGhhcyBhIHNpbmdsZSBkYXRhbGVzcyBjb250cm9sIG1lc3NhZ2UKKyAgICAgYXR0YWNoZWQ6CisKKwlSWFJQQ19ORVdfQ0FMTAorCisgICAgIFRoZSBhZGRyZXNzIHRoYXQgY2FuIGJlIHBhc3NlZCBiYWNrIGJ5IHJlY3Ztc2coKSBhdCB0aGlzIHBvaW50IHNob3VsZCBiZQorICAgICBpZ25vcmVkIHNpbmNlIHRoZSBjYWxsIGZvciB3aGljaCB0aGUgbWVzc2FnZSB3YXMgcG9zdGVkIG1heSBoYXZlIGdvbmUgYnkKKyAgICAgdGhlIHRpbWUgaXQgaXMgYWNjZXB0ZWQgLSBpbiB3aGljaCBjYXNlIHRoZSBmaXJzdCBjYWxsIHN0aWxsIG9uIHRoZSBxdWV1ZQorICAgICB3aWxsIGJlIGFjY2VwdGVkLgorCisgKDUpIFRoZSBzZXJ2ZXIgdGhlbiBhY2NlcHRzIHRoZSBuZXcgY2FsbCBieSBpc3N1aW5nIGEgc2VuZG1zZygpIHdpdGggdHdvCisgICAgIHBpZWNlcyBvZiBjb250cm9sIGRhdGEgYW5kIG5vIGFjdHVhbCBkYXRhOgorCisJUlhSUENfQUNDRVBUCQktIGluZGljYXRlIGNvbm5lY3Rpb24gYWNjZXB0YW5jZQorCVJYUlBDX1VTRVJfQ0FMTF9JRAktIHNwZWNpZnkgdXNlciBJRCBmb3IgdGhpcyBjYWxsCisKKyAoNikgVGhlIGZpcnN0IHJlcXVlc3QgZGF0YSBwYWNrZXQgd2lsbCB0aGVuIGJlIHBvc3RlZCB0byB0aGUgc2VydmVyIHNvY2tldCBmb3IKKyAgICAgcmVjdm1zZygpIHRvIHBpY2sgdXAuICBBdCB0aGF0IHBvaW50LCB0aGUgUnhSUEMgYWRkcmVzcyBmb3IgdGhlIGNhbGwgY2FuCisgICAgIGJlIHJlYWQgZnJvbSB0aGUgYWRkcmVzcyBmaWVsZHMgaW4gdGhlIG1zZ2hkciBzdHJ1Y3QuCisKKyAgICAgU3Vic2VxdWVudCByZXF1ZXN0IGRhdGEgd2lsbCBiZSBwb3N0ZWQgdG8gdGhlIHNlcnZlciBzb2NrZXQgZm9yIHJlY3Ztc2coKQorICAgICB0byBjb2xsZWN0IGFzIGl0IGFycml2ZXMuICBBbGwgYnV0IHRoZSBsYXN0IHBpZWNlIG9mIHRoZSByZXF1ZXN0IGRhdGEgd2lsbAorICAgICBiZSBkZWxpdmVyZWQgd2l0aCBNU0dfTU9SRSBmbGFnZ2VkLgorCisgICAgIEFsbCBkYXRhIHdpbGwgYmUgZGVsaXZlcmVkIHdpdGggdGhlIGZvbGxvd2luZyBjb250cm9sIG1lc3NhZ2UgYXR0YWNoZWQ6CisKKwlSWFJQQ19VU0VSX0NBTExfSUQJLSBzcGVjaWZpZXMgdGhlIHVzZXIgSUQgZm9yIHRoaXMgY2FsbAorCisgKDgpIFRoZSByZXBseSBkYXRhIHNob3VsZCB0aGVuIGJlIHBvc3RlZCB0byB0aGUgc2VydmVyIHNvY2tldCB1c2luZyBhIHNlcmllcworICAgICBvZiBzZW5kbXNnKCkgY2FsbHMsIGVhY2ggd2l0aCB0aGUgZm9sbG93aW5nIGNvbnRyb2wgbWVzc2FnZXMgYXR0YWNoZWQ6CisKKwlSWFJQQ19VU0VSX0NBTExfSUQJLSBzcGVjaWZpZXMgdGhlIHVzZXIgSUQgZm9yIHRoaXMgY2FsbAorCisgICAgIE1TR19NT1JFIHNob3VsZCBiZSBzZXQgaW4gbXNnaGRyOjptc2dfZmxhZ3Mgb24gYWxsIGJ1dCB0aGUgbGFzdCBtZXNzYWdlCisgICAgIGZvciBhIHBhcnRpY3VsYXIgY2FsbC4KKworICg5KSBUaGUgZmluYWwgQUNLIGZyb20gdGhlIGNsaWVudCB3aWxsIGJlIHBvc3RlZCBmb3IgcmV0cmlldmFsIGJ5IHJlY3Ztc2coKQorICAgICB3aGVuIGl0IGlzIHJlY2VpdmVkLiAgSXQgd2lsbCB0YWtlIHRoZSBmb3JtIG9mIGEgZGF0YWxlc3MgbWVzc2FnZSB3aXRoIHR3bworICAgICBjb250cm9sIG1lc3NhZ2VzIGF0dGFjaGVkOgorCisJUlhSUENfVVNFUl9DQUxMX0lECS0gc3BlY2lmaWVzIHRoZSB1c2VyIElEIGZvciB0aGlzIGNhbGwKKwlSWFJQQ19BQ0sJCS0gaW5kaWNhdGVzIGZpbmFsIEFDSyAobm8gZGF0YSkKKworICAgICBNU0dfRU9SIHdpbGwgYmUgZmxhZ2dlZCB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgaXMgdGhlIGZpbmFsIG1lc3NhZ2UgZm9yCisgICAgIHRoaXMgY2FsbC4KKworKDEwKSBVcCB0byB0aGUgcG9pbnQgdGhlIGZpbmFsIHBhY2tldCBvZiByZXBseSBkYXRhIGlzIHNlbnQsIHRoZSBjYWxsIGNhbiBiZQorICAgICBhYm9ydGVkIGJ5IGNhbGxpbmcgc2VuZG1zZygpIHdpdGggYSBkYXRhbGVzcyBtZXNzYWdlIHdpdGggdGhlIGZvbGxvd2luZworICAgICBjb250cm9sIG1lc3NhZ2VzIGF0dGFjaGVkOgorCisJUlhSUENfVVNFUl9DQUxMX0lECS0gc3BlY2lmaWVzIHRoZSB1c2VyIElEIGZvciB0aGlzIGNhbGwKKwlSWFJQQ19BQk9SVAkJLSBpbmRpY2F0ZXMgYWJvcnQgY29kZSAoNCBieXRlIGRhdGEpCisKKyAgICAgQW55IHBhY2tldHMgd2FpdGluZyBpbiB0aGUgc29ja2V0J3MgcmVjZWl2ZSBxdWV1ZSB3aWxsIGJlIGRpc2NhcmRlZCBpZgorICAgICB0aGlzIGlzIGlzc3VlZC4KKworTm90ZSB0aGF0IGFsbCB0aGUgY29tbXVuaWNhdGlvbnMgZm9yIGEgcGFydGljdWxhciBzZXJ2aWNlIHRha2UgcGxhY2UgdGhyb3VnaAordGhlIG9uZSBzZXJ2ZXIgc29ja2V0LCB1c2luZyBjb250cm9sIG1lc3NhZ2VzIG9uIHNlbmRtc2coKSBhbmQgcmVjdm1zZygpIHRvCitkZXRlcm1pbmUgdGhlIGNhbGwgYWZmZWN0ZWQuCisKKworPT09PT09PT09PT09PT09PT09PT09PT09PQorQUZfUlhSUEMgS0VSTkVMIElOVEVSRkFDRQorPT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGUgQUZfUlhSUEMgbW9kdWxlIGFsc28gcHJvdmlkZXMgYW4gaW50ZXJmYWNlIGZvciB1c2UgYnkgaW4ta2VybmVsIHV0aWxpdGllcworc3VjaCBhcyB0aGUgQUZTIGZpbGVzeXN0ZW0uICBUaGlzIHBlcm1pdHMgc3VjaCBhIHV0aWxpdHkgdG86CisKKyAoMSkgVXNlIGRpZmZlcmVudCBrZXlzIGRpcmVjdGx5IG9uIGluZGl2aWR1YWwgY2xpZW50IGNhbGxzIG9uIG9uZSBzb2NrZXQKKyAgICAgcmF0aGVyIHRoYW4gaGF2aW5nIHRvIG9wZW4gYSB3aG9sZSBzbGV3IG9mIHNvY2tldHMsIG9uZSBmb3IgZWFjaCBrZXkgaXQKKyAgICAgbWlnaHQgd2FudCB0byB1c2UuCisKKyAoMikgQXZvaWQgaGF2aW5nIFJ4UlBDIGNhbGwgcmVxdWVzdF9rZXkoKSBhdCB0aGUgcG9pbnQgb2YgaXNzdWUgb2YgYSBjYWxsIG9yCisgICAgIG9wZW5pbmcgb2YgYSBzb2NrZXQuICBJbnN0ZWFkIHRoZSB1dGlsaXR5IGlzIHJlc3BvbnNpYmxlIGZvciByZXF1ZXN0aW5nIGEKKyAgICAga2V5IGF0IHRoZSBhcHByb3ByaWF0ZSBwb2ludC4gIEFGUywgZm9yIGluc3RhbmNlLCB3b3VsZCBkbyB0aGlzIGR1cmluZyBWRlMKKyAgICAgb3BlcmF0aW9ucyBzdWNoIGFzIG9wZW4oKSBvciB1bmxpbmsoKS4gIFRoZSBrZXkgaXMgdGhlbiBoYW5kZWQgdGhyb3VnaAorICAgICB3aGVuIHRoZSBjYWxsIGlzIGluaXRpYXRlZC4KKworICgzKSBSZXF1ZXN0IHRoZSB1c2Ugb2Ygc29tZXRoaW5nIG90aGVyIHRoYW4gR0ZQX0tFUk5FTCB0byBhbGxvY2F0ZSBtZW1vcnkuCisKKyAoNCkgQXZvaWQgdGhlIG92ZXJoZWFkIG9mIHVzaW5nIHRoZSByZWN2bXNnKCkgY2FsbC4gIFJ4UlBDIG1lc3NhZ2VzIGNhbiBiZQorICAgICBpbnRlcmNlcHRlZCBiZWZvcmUgdGhleSBnZXQgcHV0IGludG8gdGhlIHNvY2tldCBSeCBxdWV1ZSBhbmQgdGhlIHNvY2tldAorICAgICBidWZmZXJzIG1hbmlwdWxhdGVkIGRpcmVjdGx5LgorCitUbyB1c2UgdGhlIFJ4UlBDIGZhY2lsaXR5LCBhIGtlcm5lbCB1dGlsaXR5IG11c3Qgc3RpbGwgb3BlbiBhbiBBRl9SWFJQQyBzb2NrZXQsCitiaW5kIGFuIGFkZGVzcyBhcyBhcHByb3ByaWF0ZSBhbmQgbGlzdGVuIGlmIGl0J3MgdG8gYmUgYSBzZXJ2ZXIgc29ja2V0LCBidXQKK3RoZW4gaXQgcGFzc2VzIHRoaXMgdG8gdGhlIGtlcm5lbCBpbnRlcmZhY2UgZnVuY3Rpb25zLgorCitUaGUga2VybmVsIGludGVyZmFjZSBmdW5jdGlvbnMgYXJlIGFzIGZvbGxvd3M6CisKKyAoKikgQmVnaW4gYSBuZXcgY2xpZW50IGNhbGwuCisKKwlzdHJ1Y3QgcnhycGNfY2FsbCAqCisJcnhycGNfa2VybmVsX2JlZ2luX2NhbGwoc3RydWN0IHNvY2tldCAqc29jaywKKwkJCQlzdHJ1Y3Qgc29ja2FkZHJfcnhycGMgKnNyeCwKKwkJCQlzdHJ1Y3Qga2V5ICprZXksCisJCQkJdW5zaWduZWQgbG9uZyB1c2VyX2NhbGxfSUQsCisJCQkJZ2ZwX3QgZ2ZwKTsKKworICAgICBUaGlzIGFsbG9jYXRlcyB0aGUgaW5mcmFzdHJ1Y3R1cmUgdG8gbWFrZSBhIG5ldyBSeFJQQyBjYWxsIGFuZCBhc3NpZ25zCisgICAgIGNhbGwgYW5kIGNvbm5lY3Rpb24gbnVtYmVycy4gIFRoZSBjYWxsIHdpbGwgYmUgbWFkZSBvbiB0aGUgVURQIHBvcnQgdGhhdAorICAgICB0aGUgc29ja2V0IGlzIGJvdW5kIHRvLiAgVGhlIGNhbGwgd2lsbCBnbyB0byB0aGUgZGVzdGluYXRpb24gYWRkcmVzcyBvZiBhCisgICAgIGNvbm5lY3RlZCBjbGllbnQgc29ja2V0IHVubGVzcyBhbiBhbHRlcm5hdGl2ZSBpcyBzdXBwbGllZCAoc3J4IGlzCisgICAgIG5vbi1OVUxMKS4KKworICAgICBJZiBhIGtleSBpcyBzdXBwbGllZCB0aGVuIHRoaXMgd2lsbCBiZSB1c2VkIHRvIHNlY3VyZSB0aGUgY2FsbCBpbnN0ZWFkIG9mCisgICAgIHRoZSBrZXkgYm91bmQgdG8gdGhlIHNvY2tldCB3aXRoIHRoZSBSWFJQQ19TRUNVUklUWV9LRVkgc29ja29wdC4gIENhbGxzCisgICAgIHNlY3VyZWQgaW4gdGhpcyB3YXkgd2lsbCBzdGlsbCBzaGFyZSBjb25uZWN0aW9ucyBpZiBhdCBhbGwgcG9zc2libGUuCisKKyAgICAgVGhlIHVzZXJfY2FsbF9JRCBpcyBlcXVpdmFsZW50IHRvIHRoYXQgc3VwcGxpZWQgdG8gc2VuZG1zZygpIGluIHRoZQorICAgICBjb250cm9sIGRhdGEgYnVmZmVyLiAgSXQgaXMgZW50aXJlbHkgZmVhc2libGUgdG8gdXNlIHRoaXMgdG8gcG9pbnQgdG8gYQorICAgICBrZXJuZWwgZGF0YSBzdHJ1Y3R1cmUuCisKKyAgICAgSWYgdGhpcyBmdW5jdGlvbiBpcyBzdWNjZXNzZnVsLCBhbiBvcGFxdWUgcmVmZXJlbmNlIHRvIHRoZSBSeFJQQyBjYWxsIGlzCisgICAgIHJldHVybmVkLiAgVGhlIGNhbGxlciBub3cgaG9sZHMgYSByZWZlcmVuY2Ugb24gdGhpcyBhbmQgaXQgbXVzdCBiZQorICAgICBwcm9wZXJseSBlbmRlZC4KKworICgqKSBFbmQgYSBjbGllbnQgY2FsbC4KKworCXZvaWQgcnhycGNfa2VybmVsX2VuZF9jYWxsKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKTsKKworICAgICBUaGlzIGlzIHVzZWQgdG8gZW5kIGEgcHJldmlvdXNseSBiZWd1biBjYWxsLiAgVGhlIHVzZXJfY2FsbF9JRCBpcyBleHB1bmdlZAorICAgICBmcm9tIEFGX1JYUlBDJ3Mga25vd2xlZGdlIGFuZCB3aWxsIG5vdCBiZSBzZWVuIGFnYWluIGluIGFzc29jaWF0aW9uIHdpdGgKKyAgICAgdGhlIHNwZWNpZmllZCBjYWxsLgorCisgKCopIFNlbmQgZGF0YSB0aHJvdWdoIGEgY2FsbC4KKworCWludCByeHJwY19rZXJuZWxfc2VuZF9kYXRhKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLCBzdHJ1Y3QgbXNnaGRyICptc2csCisJCQkJICAgc2l6ZV90IGxlbik7CisKKyAgICAgVGhpcyBpcyB1c2VkIHRvIHN1cHBseSBlaXRoZXIgdGhlIHJlcXVlc3QgcGFydCBvZiBhIGNsaWVudCBjYWxsIG9yIHRoZQorICAgICByZXBseSBwYXJ0IG9mIGEgc2VydmVyIGNhbGwuICBtc2cubXNnX2lvdmxlbiBhbmQgbXNnLm1zZ19pb3Ygc3BlY2lmeSB0aGUKKyAgICAgZGF0YSBidWZmZXJzIHRvIGJlIHVzZWQuICBtc2dfaW92IG1heSBub3QgYmUgTlVMTCBhbmQgbXVzdCBwb2ludAorICAgICBleGNsdXNpdmVseSB0byBpbi1rZXJuZWwgdmlydHVhbCBhZGRyZXNzZXMuICBtc2cubXNnX2ZsYWdzIG1heSBiZSBnaXZlbgorICAgICBNU0dfTU9SRSBpZiB0aGVyZSB3aWxsIGJlIHN1YnNlcXVlbnQgZGF0YSBzZW5kcyBmb3IgdGhpcyBjYWxsLgorCisgICAgIFRoZSBtc2cgbXVzdCBub3Qgc3BlY2lmeSBhIGRlc3RpbmF0aW9uIGFkZHJlc3MsIGNvbnRyb2wgZGF0YSBvciBhbnkgZmxhZ3MKKyAgICAgb3RoZXIgdGhhbiBNU0dfTU9SRS4gIGxlbiBpcyB0aGUgdG90YWwgYW1vdW50IG9mIGRhdGEgdG8gdHJhbnNtaXQuCisKKyAoKikgQWJvcnQgYSBjYWxsLgorCisJdm9pZCByeHJwY19rZXJuZWxfYWJvcnRfY2FsbChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwgdTMyIGFib3J0X2NvZGUpOworCisgICAgIFRoaXMgaXMgdXNlZCB0byBhYm9ydCBhIGNhbGwgaWYgaXQncyBzdGlsbCBpbiBhbiBhYm9ydGFibGUgc3RhdGUuICBUaGUKKyAgICAgYWJvcnQgY29kZSBzcGVjaWZpZWQgd2lsbCBiZSBwbGFjZWQgaW4gdGhlIEFCT1JUIG1lc3NhZ2Ugc2VudC4KKworICgqKSBJbnRlcmNlcHQgcmVjZWl2ZWQgUnhSUEMgbWVzc2FnZXMuCisKKwl0eXBlZGVmIHZvaWQgKCpyeHJwY19pbnRlcmNlcHRvcl90KShzdHJ1Y3Qgc29jayAqc2ssCisJCQkJCSAgICB1bnNpZ25lZCBsb25nIHVzZXJfY2FsbF9JRCwKKwkJCQkJICAgIHN0cnVjdCBza19idWZmICpza2IpOworCisJdm9pZAorCXJ4cnBjX2tlcm5lbF9pbnRlcmNlcHRfcnhfbWVzc2FnZXMoc3RydWN0IHNvY2tldCAqc29jaywKKwkJCQkJICAgcnhycGNfaW50ZXJjZXB0b3JfdCBpbnRlcmNlcHRvcik7CisKKyAgICAgVGhpcyBpbnN0YWxscyBhbiBpbnRlcmNlcHRvciBmdW5jdGlvbiBvbiB0aGUgc3BlY2lmaWVkIEFGX1JYUlBDIHNvY2tldC4KKyAgICAgQWxsIG1lc3NhZ2VzIHRoYXQgd291bGQgb3RoZXJ3aXNlIHdpbmQgdXAgaW4gdGhlIHNvY2tldCdzIFJ4IHF1ZXVlIGFyZQorICAgICB0aGVuIGRpdmVydGVkIHRvIHRoaXMgZnVuY3Rpb24uICBOb3RlIHRoYXQgY2FyZSBtdXN0IGJlIHRha2VuIHRvIHByb2Nlc3MKKyAgICAgdGhlIG1lc3NhZ2VzIGluIHRoZSByaWdodCBvcmRlciB0byBtYWludGFpbiBEQVRBIG1lc3NhZ2Ugc2VxdWVudGlhbGl0eS4KKworICAgICBUaGUgaW50ZXJjZXB0b3IgZnVuY3Rpb24gaXRzZWxmIGlzIHByb3ZpZGVkIHdpdGggdGhlIGFkZHJlc3Mgb2YgdGhlIHNvY2tldAorICAgICBhbmQgaGFuZGxpbmcgdGhlIGluY29taW5nIG1lc3NhZ2UsIHRoZSBJRCBhc3NpZ25lZCBieSB0aGUga2VybmVsIHV0aWxpdHkKKyAgICAgdG8gdGhlIGNhbGwgYW5kIHRoZSBzb2NrZXQgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIG1lc3NhZ2UuCisKKyAgICAgVGhlIHNrYi0+bWFyayBmaWVsZCBpbmRpY2F0ZXMgdGhlIHR5cGUgb2YgbWVzc2FnZToKKworCU1BUksJCQkJTUVBTklORworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJUlhSUENfU0tCX01BUktfREFUQQkJRGF0YSBtZXNzYWdlCisJUlhSUENfU0tCX01BUktfRklOQUxfQUNLCUZpbmFsIEFDSyByZWNlaXZlZCBmb3IgYW4gaW5jb21pbmcgY2FsbAorCVJYUlBDX1NLQl9NQVJLX0JVU1kJCUNsaWVudCBjYWxsIHJlamVjdGVkIGFzIHNlcnZlciBidXN5CisJUlhSUENfU0tCX01BUktfUkVNT1RFX0FCT1JUCUNhbGwgYWJvcnRlZCBieSBwZWVyCisJUlhSUENfU0tCX01BUktfTkVUX0VSUk9SCU5ldHdvcmsgZXJyb3IgZGV0ZWN0ZWQKKwlSWFJQQ19TS0JfTUFSS19MT0NBTF9FUlJPUglMb2NhbCBlcnJvciBlbmNvdW50ZXJlZAorCVJYUlBDX1NLQl9NQVJLX05FV19DQUxMCQlOZXcgaW5jb21pbmcgY2FsbCBhd2FpdGluZyBhY2NlcHRhbmNlCisKKyAgICAgVGhlIHJlbW90ZSBhYm9ydCBtZXNzYWdlIGNhbiBiZSBwcm9iZWQgd2l0aCByeHJwY19rZXJuZWxfZ2V0X2Fib3J0X2NvZGUoKS4KKyAgICAgVGhlIHR3byBlcnJvciBtZXNzYWdlcyBjYW4gYmUgcHJvYmVkIHdpdGggcnhycGNfa2VybmVsX2dldF9lcnJvcl9udW1iZXIoKS4KKyAgICAgQSBuZXcgY2FsbCBjYW4gYmUgYWNjZXB0ZWQgd2l0aCByeHJwY19rZXJuZWxfYWNjZXB0X2NhbGwoKS4KKworICAgICBEYXRhIG1lc3NhZ2VzIGNhbiBoYXZlIHRoZWlyIGNvbnRlbnRzIGV4dHJhY3RlZCB3aXRoIHRoZSB1c3VhbCBidW5jaCBvZgorICAgICBzb2NrZXQgYnVmZmVyIG1hbmlwdWxhdGlvbiBmdW5jdGlvbnMuICBBIGRhdGEgbWVzc2FnZSBjYW4gYmUgZGV0ZXJtaW5lZCB0bworICAgICBiZSB0aGUgbGFzdCBvbmUgaW4gYSBzZXF1ZW5jZSB3aXRoIHJ4cnBjX2tlcm5lbF9pc19kYXRhX2xhc3QoKS4gIFdoZW4gYQorICAgICBkYXRhIG1lc3NhZ2UgaGFzIGJlZW4gdXNlZCB1cCwgcnhycGNfa2VybmVsX2RhdGFfZGVsaXZlcmVkKCkgc2hvdWxkIGJlCisgICAgIGNhbGxlZCBvbiBpdC4uCisKKyAgICAgTm9uLWRhdGEgbWVzc2FnZXMgc2hvdWxkIGJlIGhhbmRsZWQgdG8gcnhycGNfa2VybmVsX2ZyZWVfc2tiKCkgdG8gZGlzcG9zZQorICAgICBvZi4gIEl0IGlzIHBvc3NpYmxlIHRvIGdldCBleHRyYSByZWZzIG9uIGFsbCB0eXBlcyBvZiBtZXNzYWdlIGZvciBsYXRlcgorICAgICBmcmVlaW5nLCBidXQgdGhpcyBtYXkgcGluIHRoZSBzdGF0ZSBvZiBhIGNhbGwgdW50aWwgdGhlIG1lc3NhZ2UgaXMgZmluYWxseQorICAgICBmcmVlZC4KKworICgqKSBBY2NlcHQgYW4gaW5jb21pbmcgY2FsbC4KKworCXN0cnVjdCByeHJwY19jYWxsICoKKwlyeHJwY19rZXJuZWxfYWNjZXB0X2NhbGwoc3RydWN0IHNvY2tldCAqc29jaywKKwkJCQkgdW5zaWduZWQgbG9uZyB1c2VyX2NhbGxfSUQpOworCisgICAgIFRoaXMgaXMgdXNlZCB0byBhY2NlcHQgYW4gaW5jb21pbmcgY2FsbCBhbmQgdG8gYXNzaWduIGl0IGEgY2FsbCBJRC4gIFRoaXMKKyAgICAgZnVuY3Rpb24gaXMgc2ltaWxhciB0byByeHJwY19rZXJuZWxfYmVnaW5fY2FsbCgpIGFuZCBjYWxscyBhY2NlcHRlZCBtdXN0CisgICAgIGJlIGVuZGVkIGluIHRoZSBzYW1lIHdheS4KKworICAgICBJZiB0aGlzIGZ1bmN0aW9uIGlzIHN1Y2Nlc3NmdWwsIGFuIG9wYXF1ZSByZWZlcmVuY2UgdG8gdGhlIFJ4UlBDIGNhbGwgaXMKKyAgICAgcmV0dXJuZWQuICBUaGUgY2FsbGVyIG5vdyBob2xkcyBhIHJlZmVyZW5jZSBvbiB0aGlzIGFuZCBpdCBtdXN0IGJlCisgICAgIHByb3Blcmx5IGVuZGVkLgorCisgKCopIFJlamVjdCBhbiBpbmNvbWluZyBjYWxsLgorCisJaW50IHJ4cnBjX2tlcm5lbF9yZWplY3RfY2FsbChzdHJ1Y3Qgc29ja2V0ICpzb2NrKTsKKworICAgICBUaGlzIGlzIHVzZWQgdG8gcmVqZWN0IHRoZSBmaXJzdCBpbmNvbWluZyBjYWxsIG9uIHRoZSBzb2NrZXQncyBxdWV1ZSB3aXRoCisgICAgIGEgQlVTWSBtZXNzYWdlLiAgLUVOT0RBVEEgaXMgcmV0dXJuZWQgaWYgdGhlcmUgd2VyZSBubyBpbmNvbWluZyBjYWxscy4KKyAgICAgT3RoZXIgZXJyb3JzIG1heSBiZSByZXR1cm5lZCBpZiB0aGUgY2FsbCBoYWQgYmVlbiBhYm9ydGVkICgtRUNPTk5BQk9SVEVEKQorICAgICBvciBoYWQgdGltZWQgb3V0ICgtRVRJTUUpLgorCisgKCopIFJlY29yZCB0aGUgZGVsaXZlcnkgb2YgYSBkYXRhIG1lc3NhZ2UgYW5kIGZyZWUgaXQuCisKKwl2b2lkIHJ4cnBjX2tlcm5lbF9kYXRhX2RlbGl2ZXJlZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKKworICAgICBUaGlzIGlzIHVzZWQgdG8gcmVjb3JkIGEgZGF0YSBtZXNzYWdlIGFzIGhhdmluZyBiZWVuIGRlbGl2ZXJlZCBhbmQgdG8KKyAgICAgdXBkYXRlIHRoZSBBQ0sgc3RhdGUgZm9yIHRoZSBjYWxsLiAgVGhlIHNvY2tldCBidWZmZXIgd2lsbCBiZSBmcmVlZC4KKworICgqKSBGcmVlIGEgbWVzc2FnZS4KKworCXZvaWQgcnhycGNfa2VybmVsX2ZyZWVfc2tiKHN0cnVjdCBza19idWZmICpza2IpOworCisgICAgIFRoaXMgaXMgdXNlZCB0byBmcmVlIGEgbm9uLURBVEEgc29ja2V0IGJ1ZmZlciBpbnRlcmNlcHRlZCBmcm9tIGFuIEFGX1JYUlBDCisgICAgIHNvY2tldC4KKworICgqKSBEZXRlcm1pbmUgaWYgYSBkYXRhIG1lc3NhZ2UgaXMgdGhlIGxhc3Qgb25lIG9uIGEgY2FsbC4KKworCWJvb2wgcnhycGNfa2VybmVsX2lzX2RhdGFfbGFzdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKKworICAgICBUaGlzIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIGEgc29ja2V0IGJ1ZmZlciBob2xkcyB0aGUgbGFzdCBkYXRhIG1lc3NhZ2UKKyAgICAgdG8gYmUgcmVjZWl2ZWQgZm9yIGEgY2FsbCAodHJ1ZSB3aWxsIGJlIHJldHVybmVkIGlmIGl0IGRvZXMsIGZhbHNlCisgICAgIGlmIG5vdCkuCisKKyAgICAgVGhlIGRhdGEgbWVzc2FnZSB3aWxsIGJlIHBhcnQgb2YgdGhlIHJlcGx5IG9uIGEgY2xpZW50IGNhbGwgYW5kIHRoZQorICAgICByZXF1ZXN0IG9uIGFuIGluY29taW5nIGNhbGwuICBJbiB0aGUgbGF0dGVyIGNhc2UgdGhlcmUgd2lsbCBiZSBtb3JlCisgICAgIG1lc3NhZ2VzLCBidXQgaW4gdGhlIGZvcm1lciBjYXNlIHRoZXJlIHdpbGwgbm90LgorCisgKCopIEdldCB0aGUgYWJvcnQgY29kZSBmcm9tIGFuIGFib3J0IG1lc3NhZ2UuCisKKwl1MzIgcnhycGNfa2VybmVsX2dldF9hYm9ydF9jb2RlKHN0cnVjdCBza19idWZmICpza2IpOworCisgICAgIFRoaXMgaXMgdXNlZCB0byBleHRyYWN0IHRoZSBhYm9ydCBjb2RlIGZyb20gYSByZW1vdGUgYWJvcnQgbWVzc2FnZS4KKworICgqKSBHZXQgdGhlIGVycm9yIG51bWJlciBmcm9tIGEgbG9jYWwgb3IgbmV0d29yayBlcnJvciBtZXNzYWdlLgorCisJaW50IHJ4cnBjX2tlcm5lbF9nZXRfZXJyb3JfbnVtYmVyKHN0cnVjdCBza19idWZmICpza2IpOworCisgICAgIFRoaXMgaXMgdXNlZCB0byBleHRyYWN0IHRoZSBlcnJvciBudW1iZXIgZnJvbSBhIG1lc3NhZ2UgaW5kaWNhdGluZyBlaXRoZXIKKyAgICAgYSBsb2NhbCBlcnJvciBvY2N1cnJlZCBvciBhIG5ldHdvcmsgZXJyb3Igb2NjdXJyZWQuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvd2FuLXJvdXRlci50eHQgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvd2FuLXJvdXRlci50eHQKaW5kZXggNjUzOTc4ZC4uMDdkZDZkOSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3dhbi1yb3V0ZXIudHh0CisrKyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy93YW4tcm91dGVyLnR4dApAQCAtMjUwLDcgKzI1MCw2IEBACiAJc2RsYWRydi5oCVNETEEgc3VwcG9ydCBtb2R1bGUgQVBJIGRlZmluaXRpb25zCiAJc2RsYXNmbS5oCVNETEEgZmlybXdhcmUgbW9kdWxlIGRlZmluaXRpb25zCiAJaWZfd2FucGlwZS5oCVdBTlBJUEUgU29ja2V0IGRlZmluaXRpb25zCi0JaWZfd2FucGlwZV9jb21tb24uaAlXQU5QSVBFIFNvY2tldC9Ecml2ZXIgY29tbW9uIGRlZmluaXRpb25zLgogCXNkbGFwY2kuaAlXQU5QSVBFIFBDSSBkZWZpbml0aW9ucwogCQogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3Bvd2VyL2ludGVyZmFjZS50eHQgYi9Eb2N1bWVudGF0aW9uL3Bvd2VyL2ludGVyZmFjZS50eHQKaW5kZXggNzQzMTFkNy4uOGM1YjQxYiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9wb3dlci9pbnRlcmZhY2UudHh0CisrKyBiL0RvY3VtZW50YXRpb24vcG93ZXIvaW50ZXJmYWNlLnR4dApAQCAtMTgsMTcgKzE4LDEwIEBACiAKIAogL3N5cy9wb3dlci9kaXNrIGNvbnRyb2xzIHRoZSBvcGVyYXRpbmcgbW9kZSBvZiB0aGUgc3VzcGVuZC10by1kaXNrCi1tZWNoYW5pc20uIFN1c3BlbmQtdG8tZGlzayBjYW4gYmUgaGFuZGxlZCBpbiBzZXZlcmFsIHdheXMuIFRoZQotZ3JlYXRlc3QgZGlzdGluY3Rpb24gaXMgd2hvIHdyaXRlcyBtZW1vcnkgdG8gZGlzayAtIHRoZSBmaXJtd2FyZSBvcgotdGhlIGtlcm5lbC4gSWYgdGhlIGZpcm13YXJlIGRvZXMgaXQsIHdlIGFzc3VtZSB0aGF0IGl0IGFsc28gaGFuZGxlcwotc3VzcGVuZGluZyB0aGUgc3lzdGVtLiAKLQotSWYgdGhlIGtlcm5lbCBkb2VzIGl0LCB0aGVuIHdlIGhhdmUgdGhyZWUgb3B0aW9ucyBmb3IgcHV0dGluZyB0aGUgc3lzdGVtCi10byBzbGVlcCAtIHVzaW5nIHRoZSBwbGF0Zm9ybSBkcml2ZXIgKGUuZy4gQUNQSSBvciBvdGhlciBQTQotcmVnaXN0ZXJzKSwgcG93ZXJpbmcgb2ZmIHRoZSBzeXN0ZW0gb3IgcmVib290aW5nIHRoZSBzeXN0ZW0gKGZvcgotdGVzdGluZykuIFRoZSBzeXN0ZW0gd2lsbCBzdXBwb3J0IGVpdGhlciAnZmlybXdhcmUnIG9yICdwbGF0Zm9ybScsIGFuZAotdGhhdCBpcyBrbm93biBhIHByaW9yaS4gQnV0LCB0aGUgdXNlciBtYXkgY2hvb3NlICdzaHV0ZG93bicgb3IKLSdyZWJvb3QnIGFzIGFsdGVybmF0aXZlcy4gCittZWNoYW5pc20uIFN1c3BlbmQtdG8tZGlzayBjYW4gYmUgaGFuZGxlZCBpbiBzZXZlcmFsIHdheXMuIFdlIGhhdmUgYQorZmV3IG9wdGlvbnMgZm9yIHB1dHRpbmcgdGhlIHN5c3RlbSB0byBzbGVlcCAtIHVzaW5nIHRoZSBwbGF0Zm9ybSBkcml2ZXIKKyhlLmcuIEFDUEkgb3Igb3RoZXIgcG1fb3BzKSwgcG93ZXJpbmcgb2ZmIHRoZSBzeXN0ZW0gb3IgcmVib290aW5nIHRoZQorc3lzdGVtIChmb3IgdGVzdGluZykuCiAKIEFkZGl0aW9uYWxseSwgL3N5cy9wb3dlci9kaXNrIGNhbiBiZSB1c2VkIHRvIHR1cm4gb24gb25lIG9mIHRoZSB0d28gdGVzdGluZwogbW9kZXMgb2YgdGhlIHN1c3BlbmQtdG8tZGlzayBtZWNoYW5pc206ICd0ZXN0cHJvYycgb3IgJ3Rlc3QnLiAgSWYgdGhlCkBAIC00NCwxNiArMzcsMTIgQEAKIFJlYWRpbmcgZnJvbSB0aGlzIGZpbGUgd2lsbCBkaXNwbGF5IHdoYXQgdGhlIG1vZGUgaXMgY3VycmVudGx5IHNldAogdG8uIFdyaXRpbmcgdG8gdGhpcyBmaWxlIHdpbGwgYWNjZXB0IG9uZSBvZgogCi0gICAgICAgJ2Zpcm13YXJlJwotICAgICAgICdwbGF0Zm9ybScKKyAgICAgICAncGxhdGZvcm0nIChvbmx5IGlmIHRoZSBwbGF0Zm9ybSBzdXBwb3J0cyBpdCkKICAgICAgICAnc2h1dGRvd24nCiAgICAgICAgJ3JlYm9vdCcKICAgICAgICAndGVzdHByb2MnCiAgICAgICAgJ3Rlc3QnCiAKLUl0IHdpbGwgb25seSBjaGFuZ2UgdG8gJ2Zpcm13YXJlJyBvciAncGxhdGZvcm0nIGlmIHRoZSBzeXN0ZW0gc3VwcG9ydHMKLWl0LiAKLQogL3N5cy9wb3dlci9pbWFnZV9zaXplIGNvbnRyb2xzIHRoZSBzaXplIG9mIHRoZSBpbWFnZSBjcmVhdGVkIGJ5CiB0aGUgc3VzcGVuZC10by1kaXNrIG1lY2hhbmlzbS4gIEl0IGNhbiBiZSB3cml0dGVuIGEgc3RyaW5nCiByZXByZXNlbnRpbmcgYSBub24tbmVnYXRpdmUgaW50ZWdlciB0aGF0IHdpbGwgYmUgdXNlZCBhcyBhbiB1cHBlcgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9wb3dlci9zdGF0ZXMudHh0IGIvRG9jdW1lbnRhdGlvbi9wb3dlci9zdGF0ZXMudHh0CmluZGV4IDA5MzFhMzMuLjM0ODAwY2MgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vcG93ZXIvc3RhdGVzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3Bvd2VyL3N0YXRlcy50eHQKQEAgLTYyLDE3ICs2MiwxOCBAQAogaW5jb252ZW5pZW5jZSwgdGhpcyBtZXRob2QgcmVxdWlyZXMgbWluaW1hbCB3b3JrIGJ5IHRoZSBrZXJuZWwsIHNpbmNlCiB0aGUgZmlybXdhcmUgd2lsbCBhbHNvIGhhbmRsZSByZXN0b3JpbmcgbWVtb3J5IGNvbnRlbnRzIG9uIHJlc3VtZS4gCiAKLUlmIHRoZSBrZXJuZWwgaXMgcmVzcG9uc2libGUgZm9yIHBlcnNpc3RlbnRseSBzYXZpbmcgc3RhdGUsIGEgbWVjaGFuaXNtCi1jYWxsZWQgJ3N3c3VzcCcgKFN3YXAgU3VzcGVuZCkgaXMgdXNlZCB0byB3cml0ZSBtZW1vcnkgY29udGVudHMgdG8KLWZyZWUgc3dhcCBzcGFjZS4gc3dzdXNwIGhhcyBzb21lIHJlc3RyaWN0aXZlIHJlcXVpcmVtZW50cywgYnV0IHNob3VsZAotd29yayBpbiBtb3N0IGNhc2VzLiBTb21lLCBhbGJlaXQgb3V0ZGF0ZWQsIGRvY3VtZW50YXRpb24gY2FuIGJlIGZvdW5kCi1pbiBEb2N1bWVudGF0aW9uL3Bvd2VyL3N3c3VzcC50eHQuIAorRm9yIHN1c3BlbmQtdG8tZGlzaywgYSBtZWNoYW5pc20gY2FsbGVkIHN3c3VzcCBjYWxsZWQgJ3N3c3VzcCcgKFN3YXAKK1N1c3BlbmQpIGlzIHVzZWQgdG8gd3JpdGUgbWVtb3J5IGNvbnRlbnRzIHRvIGZyZWUgc3dhcCBzcGFjZS4KK3N3c3VzcCBoYXMgc29tZSByZXN0cmljdGl2ZSByZXF1aXJlbWVudHMsIGJ1dCBzaG91bGQgd29yayBpbiBtb3N0CitjYXNlcy4gU29tZSwgYWxiZWl0IG91dGRhdGVkLCBkb2N1bWVudGF0aW9uIGNhbiBiZSBmb3VuZCBpbgorRG9jdW1lbnRhdGlvbi9wb3dlci9zd3N1c3AudHh0LiBBbHRlcm5hdGl2ZWx5LCB1c2Vyc3BhY2UgY2FuIGRvIG1vc3QKK29mIHRoZSBhY3R1YWwgc3VzcGVuZCB0byBkaXNrIHdvcmssIHNlZSB1c2VybGFuZC1zd3N1c3AudHh0LgogCiBPbmNlIG1lbW9yeSBzdGF0ZSBpcyB3cml0dGVuIHRvIGRpc2ssIHRoZSBzeXN0ZW0gbWF5IGVpdGhlciBlbnRlciBhCiBsb3ctcG93ZXIgc3RhdGUgKGxpa2UgQUNQSSBTNCksIG9yIGl0IG1heSBzaW1wbHkgcG93ZXIgZG93bi4gUG93ZXJpbmcKIGRvd24gb2ZmZXJzIGdyZWF0ZXIgc2F2aW5ncywgYW5kIGFsbG93cyB0aGlzIG1lY2hhbmlzbSB0byB3b3JrIG9uIGFueQogc3lzdGVtLiBIb3dldmVyLCBlbnRlcmluZyBhIHJlYWwgbG93LXBvd2VyIHN0YXRlIGFsbG93cyB0aGUgdXNlciB0bwotdHJpZ2dlciB3YWtlIHVwIGV2ZW50cyAoZS5nLiBwcmVzc2luZyBhIGtleSBvciBvcGVuaW5nIGEgbGFwdG9wIGxpZCkuIAordHJpZ2dlciB3YWtlIHVwIGV2ZW50cyAoZS5nLiBwcmVzc2luZyBhIGtleSBvciBvcGVuaW5nIGEgbGFwdG9wIGxpZCkuCiAKIEEgdHJhbnNpdGlvbiBmcm9tIFN1c3BlbmQtdG8tRGlzayB0byB0aGUgT24gc3RhdGUgc2hvdWxkIHRha2UgYWJvdXQgMzAKIHNlY29uZHMsIHRob3VnaCBpdCdzIHR5cGljYWxseSBhIGJpdCBtb3JlIHdpdGggdGhlIGN1cnJlbnQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcG93ZXIvc3dzdXNwLnR4dCBiL0RvY3VtZW50YXRpb24vcG93ZXIvc3dzdXNwLnR4dAppbmRleCAwNzYxZmY2Li5jNTViZDUwIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3Bvd2VyL3N3c3VzcC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9wb3dlci9zd3N1c3AudHh0CkBAIC0xNTYsOCArMTU2LDcgQEAKIGJlIHZlcnkgY2FyZWZ1bCkuCiAKIAotUTogV2hhdCBpcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuICJwbGF0Zm9ybSIsICJzaHV0ZG93biIgYW5kCi0iZmlybXdhcmUiIGluIC9zeXMvcG93ZXIvZGlzaz8KK1E6IFdoYXQgaXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiAicGxhdGZvcm0iIGFuZCAic2h1dGRvd24iPwogCiBBOgogCkBAIC0xNjYsMTEgKzE2NSw4IEBACiBwbGF0Zm9ybTogc2F2ZSBzdGF0ZSBpbiBsaW51eCwgdGhlbiB0ZWxsIGJpb3MgdG8gcG93ZXJkb3duIGFuZCBibGluawogICAgICAgICAgICJzdXNwZW5kZWQgbGVkIgogCi1maXJtd2FyZTogdGVsbCBiaW9zIHRvIHNhdmUgc3RhdGUgaXRzZWxmIFtuZWVkcyBCSU9TLXNwZWNpZmljIHN1c3BlbmQKLQkgIHBhcnRpdGlvbiwgYW5kIGhhcyB2ZXJ5IGxpdHRsZSB0byBkbyB3aXRoIHN3c3VzcF0KLQotInBsYXRmb3JtIiBpcyBhY3R1YWxseSByaWdodCB0aGluZyB0byBkbywgYnV0ICJzaHV0ZG93biIgaXMgbW9zdAotcmVsaWFibGUuCisicGxhdGZvcm0iIGlzIGFjdHVhbGx5IHJpZ2h0IHRoaW5nIHRvIGRvIHdoZXJlIHN1cHBvcnRlZCwgYnV0Cisic2h1dGRvd24iIGlzIG1vc3QgcmVsaWFibGUgKGV4Y2VwdCBvbiBBQ1BJIHN5c3RlbXMpLgogCiBROiBJIGRvIG5vdCB1bmRlcnN0YW5kIHdoeSB5b3UgaGF2ZSBzdWNoIHN0cm9uZyBvYmplY3Rpb25zIHRvIGlkZWEgb2YKIHNlbGVjdGl2ZSBzdXNwZW5kLgpAQCAtMzg4LDggKzM4NCw4IEBACiBtb2RlcyBsaWtlICJzdXNwZW5kLXRvLVJBTSIgb3IgInN0YW5kYnkiLiAgKERvbid0IHdyaXRlICJkaXNrIiB0byB0aGUKIC9zeXMvcG93ZXIvc3RhdGUgZmlsZTsgd3JpdGUgInN0YW5kYnkiIG9yICJtZW0iLikgIFdlJ3ZlIG5vdCBzZWVuIGFueQogaGFyZHdhcmUgdGhhdCBjYW4gdXNlIHRoZXNlIG1vZGVzIHRocm91Z2ggc29mdHdhcmUgc3VzcGVuZCwgYWx0aG91Z2ggaW4KLXRoZW9yeSBzb21lIHN5c3RlbXMgbWlnaHQgc3VwcG9ydCAicGxhdGZvcm0iIG9yICJmaXJtd2FyZSIgbW9kZXMgdGhhdAotd29uJ3QgYnJlYWsgdGhlIFVTQiBjb25uZWN0aW9ucy4KK3RoZW9yeSBzb21lIHN5c3RlbXMgbWlnaHQgc3VwcG9ydCAicGxhdGZvcm0iIG1vZGVzIHRoYXQgd29uJ3QgYnJlYWsgdGhlCitVU0IgY29ubmVjdGlvbnMuCiAKIFJlbWVtYmVyIHRoYXQgaXQncyBhbHdheXMgYSBiYWQgaWRlYSB0byB1bnBsdWcgYSBkaXNrIGRyaXZlIGNvbnRhaW5pbmcgYQogbW91bnRlZCBmaWxlc3lzdGVtLiAgVGhhdCdzIHRydWUgZXZlbiB3aGVuIHlvdXIgc3lzdGVtIGlzIGFzbGVlcCEgIFRoZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9wb3dlcnBjL2Jvb3Rpbmctd2l0aG91dC1vZi50eHQgYi9Eb2N1bWVudGF0aW9uL3Bvd2VycGMvYm9vdGluZy13aXRob3V0LW9mLnR4dAppbmRleCBiNDEzOTdkLi4wMzNhM2YzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3Bvd2VycGMvYm9vdGluZy13aXRob3V0LW9mLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3Bvd2VycGMvYm9vdGluZy13aXRob3V0LW9mLnR4dApAQCAtMzksNyArMzksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHByb3BlcnR5IGRhdGEuIFRoZSBvbGQgc3R5bGUgdmFyaWFibGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWdubWVudCB3b3VsZCBtYWtlIGl0IGltcG9zc2libGUgdG8gZG8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzaW1wbGUiIGluc2VydGlvbiBvZiBwcm9wZXJ0aWVzIHVzaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vdmUgKHRoYW5rcyBNaWx0b24gZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1tb3ZlICh0aGFua3MgTWlsdG9uIGZvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWNpbmcpLiBVcGRhdGVkIGtlcm5lbCBwYXRjaCBhcyB3ZWxsCiAJCQkgLSBDb3JyZWN0IGEgZmV3IG1vcmUgYWxpZ25tZW50IGNvbnN0cmFpbnRzCiAJCQkgLSBBZGQgYSBjaGFwdGVyIGFib3V0IHRoZSBkZXZpY2UtdHJlZQpAQCAtNTUsNyArNTUsNyBAQAogCiAgVG9EbzoKIAktIEFkZCBzb21lIGRlZmluaXRpb25zIG9mIGludGVycnVwdCB0cmVlIChzaW1wbGUvY29tcGxleCkKLQktIEFkZCBzb21lIGRlZmluaXRpb25zIGZvciBwY2kgaG9zdCBicmlkZ2VzCisJLSBBZGQgc29tZSBkZWZpbml0aW9ucyBmb3IgUENJIGhvc3QgYnJpZGdlcwogCS0gQWRkIHNvbWUgY29tbW9uIGFkZHJlc3MgZm9ybWF0IGV4YW1wbGVzCiAJLSBBZGQgZGVmaW5pdGlvbnMgZm9yIHN0YW5kYXJkIHByb3BlcnRpZXMgYW5kICJjb21wYXRpYmxlIgogCSAgbmFtZXMgZm9yIGNlbGxzIHRoYXQgYXJlIG5vdCBhbHJlYWR5IGRlZmluZWQgYnkgdGhlIGV4aXN0aW5nCkBAIC0xMTQsNyArMTE0LDcgQEAKICAgICAgICAgZm9ydGggd29yZHMgaXNuJ3QgcmVxdWlyZWQpLCB5b3UgY2FuIGVudGVyIHRoZSBrZXJuZWwgd2l0aDoKIAogICAgICAgICAgICAgICByNSA6IE9GIGNhbGxiYWNrIHBvaW50ZXIgYXMgZGVmaW5lZCBieSBJRUVFIDEyNzUKLSAgICAgICAgICAgICAgYmluZGluZ3MgdG8gcG93ZXJwYy4gT25seSB0aGUgMzIgYml0IGNsaWVudCBpbnRlcmZhY2UKKyAgICAgICAgICAgICAgYmluZGluZ3MgdG8gcG93ZXJwYy4gT25seSB0aGUgMzItYml0IGNsaWVudCBpbnRlcmZhY2UKICAgICAgICAgICAgICAgaXMgY3VycmVudGx5IHN1cHBvcnRlZAogCiAgICAgICAgICAgICAgIHIzLCByNCA6IGFkZHJlc3MgJiBsZW5ndGggb2YgYW4gaW5pdHJkIGlmIGFueSBvciAwCkBAIC0xOTQsNyArMTk0LDcgQEAKICAgZm9yIHRoaXMgaXMgdG8ga2VlcCBrZXJuZWxzIG9uIGVtYmVkZGVkIHN5c3RlbXMgc21hbGwgYW5kIGVmZmljaWVudDsKICAgcGFydCBvZiB0aGlzIGlzIGR1ZSB0byB0aGUgZmFjdCB0aGUgY29kZSBpcyBhbHJlYWR5IHRoYXQgd2F5LiBJbiB0aGUKICAgZnV0dXJlLCBhIGtlcm5lbCBtYXkgc3VwcG9ydCBtdWx0aXBsZSBwbGF0Zm9ybXMsIGJ1dCBvbmx5IGlmIHRoZQotICBwbGF0Zm9ybXMgZmVhdHVyZSB0aGUgc2FtZSBjb3JlIGFyY2hpdGVjdGlyZS4gIEEgc2luZ2xlIGtlcm5lbCBidWlsZAorICBwbGF0Zm9ybXMgZmVhdHVyZSB0aGUgc2FtZSBjb3JlIGFyY2hpdGVjdHVyZS4gIEEgc2luZ2xlIGtlcm5lbCBidWlsZAogICBjYW5ub3Qgc3VwcG9ydCBib3RoIGNvbmZpZ3VyYXRpb25zIHdpdGggQm9vayBFIGFuZCBjb25maWd1cmF0aW9ucwogICB3aXRoIGNsYXNzaWMgUG93ZXJwYyBhcmNoaXRlY3R1cmVzLgogCkBAIC0yMTUsNyArMjE1LDcgQEAKICAgZW5hYmxlIGFub3RoZXIgY29uZmlnIG9wdGlvbiB0byBzZWxlY3QgdGhlIHNwZWNpZmljIGJvYXJkCiAgIHN1cHBvcnRlZC4KIAotTk9URTogSWYgYmVuIGRvZXNuJ3QgbWVyZ2UgdGhlIHNldHVwIGZpbGVzLCBtYXkgbmVlZCB0byBjaGFuZ2UgdGhpcyB0bworTk9URTogSWYgQmVuIGRvZXNuJ3QgbWVyZ2UgdGhlIHNldHVwIGZpbGVzLCBtYXkgbmVlZCB0byBjaGFuZ2UgdGhpcyB0bwogcG9pbnQgdG8gc2V0dXBfMzIuYwogCiAKQEAgLTI1Niw3ICsyNTYsNyBAQAogICAgICAgICB1MzIgICAgIG9mZl9kdF9zdHJ1Y3Q7ICAgICAgICAgIC8qIG9mZnNldCB0byBzdHJ1Y3R1cmUgKi8KICAgICAgICAgdTMyICAgICBvZmZfZHRfc3RyaW5nczsgICAgICAgICAvKiBvZmZzZXQgdG8gc3RyaW5ncyAqLwogICAgICAgICB1MzIgICAgIG9mZl9tZW1fcnN2bWFwOyAgICAgICAgIC8qIG9mZnNldCB0byBtZW1vcnkgcmVzZXJ2ZSBtYXAKLSovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgdTMyICAgICB2ZXJzaW9uOyAgICAgICAgICAgICAgICAvKiBmb3JtYXQgdmVyc2lvbiAqLwogICAgICAgICB1MzIgICAgIGxhc3RfY29tcF92ZXJzaW9uOyAgICAgIC8qIGxhc3QgY29tcGF0aWJsZSB2ZXJzaW9uICovCiAKQEAgLTI2NSw2ICsyNjUsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3Rpbmcgb24gKi8KICAgICAgICAgLyogdmVyc2lvbiAzIGZpZWxkcyBiZWxvdyAqLwogICAgICAgICB1MzIgICAgIHNpemVfZHRfc3RyaW5nczsgICAgICAgIC8qIHNpemUgb2YgdGhlIHN0cmluZ3MgYmxvY2sgKi8KKworICAgICAgICAvKiB2ZXJzaW9uIDE3IGZpZWxkcyBiZWxvdyAqLworICAgICAgICB1MzIJc2l6ZV9kdF9zdHJ1Y3Q7CQkvKiBzaXplIG9mIHRoZSBEVCBzdHJ1Y3R1cmUgYmxvY2sgKi8KIH07CiAKICAgIEFsb25nIHdpdGggdGhlIGNvbnN0YW50czoKQEAgLTI3Myw3ICsyNzYsNyBAQAogI2RlZmluZSBPRl9EVF9IRUFERVIgICAgICAgICAgICAweGQwMGRmZWVkICAgICAgLyogNDogdmVyc2lvbiwKIAkJCQkJCSAgIDQ6IHRvdGFsIHNpemUgKi8KICNkZWZpbmUgT0ZfRFRfQkVHSU5fTk9ERSAgICAgICAgMHgxICAgICAgICAgICAgIC8qIFN0YXJ0IG5vZGU6IGZ1bGwgbmFtZQotKi8KKwkJCQkJCSAgICovCiAjZGVmaW5lIE9GX0RUX0VORF9OT0RFICAgICAgICAgIDB4MiAgICAgICAgICAgICAvKiBFbmQgbm9kZSAqLwogI2RlZmluZSBPRl9EVF9QUk9QICAgICAgICAgICAgICAweDMgICAgICAgICAgICAgLyogUHJvcGVydHk6IG5hbWUgb2ZmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwgY29udGVudCAqLwpAQCAtMzEwLDkgKzMxMyw4IEBACiAgICAtIG9mZl9tZW1fcnN2bWFwCiAKICAgICAgVGhpcyBpcyBhbiBvZmZzZXQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBoZWFkZXIgdG8gdGhlIHN0YXJ0Ci0gICAgIG9mIHRoZSByZXNlcnZlZCBtZW1vcnkgbWFwLiBUaGlzIG1hcCBpcyBhIGxpc3Qgb2YgcGFpcnMgb2YgNjQKKyAgICAgb2YgdGhlIHJlc2VydmVkIG1lbW9yeSBtYXAuIFRoaXMgbWFwIGlzIGEgbGlzdCBvZiBwYWlycyBvZiA2NC0KICAgICAgYml0IGludGVnZXJzLiBFYWNoIHBhaXIgaXMgYSBwaHlzaWNhbCBhZGRyZXNzIGFuZCBhIHNpemUuIFRoZQotCiAgICAgIGxpc3QgaXMgdGVybWluYXRlZCBieSBhbiBlbnRyeSBvZiBzaXplIDAuIFRoaXMgbWFwIHByb3ZpZGVzIHRoZQogICAgICBrZXJuZWwgd2l0aCBhIGxpc3Qgb2YgcGh5c2ljYWwgbWVtb3J5IGFyZWFzIHRoYXQgYXJlICJyZXNlcnZlZCIKICAgICAgYW5kIHRodXMgbm90IHRvIGJlIHVzZWQgZm9yIG1lbW9yeSBhbGxvY2F0aW9ucywgZXNwZWNpYWxseSBkdXJpbmcKQEAgLTMyNSw3ICszMjcsNyBAQAogICAgICBjb250YWluIF9hdCBsZWFzdF8gdGhpcyBEVCBibG9jayBpdHNlbGYgKGhlYWRlcix0b3RhbF9zaXplKS4gSWYKICAgICAgeW91IGFyZSBwYXNzaW5nIGFuIGluaXRyZCB0byB0aGUga2VybmVsLCB5b3Ugc2hvdWxkIHJlc2VydmUgaXQgYXMKICAgICAgd2VsbC4gWW91IGRvIG5vdCBuZWVkIHRvIHJlc2VydmUgdGhlIGtlcm5lbCBpbWFnZSBpdHNlbGYuIFRoZSBtYXAKLSAgICAgc2hvdWxkIGJlIDY0IGJpdCBhbGlnbmVkLgorICAgICBzaG91bGQgYmUgNjQtYml0IGFsaWduZWQuCiAKICAgIC0gdmVyc2lvbgogCkBAIC0zMzUsMTAgKzMzNywxMyBAQAogICAgICB0byByZWFsbG9jYXRlIGl0IGVhc2lseSBhdCBib290IGFuZCBmcmVlIHVwIHRoZSB1bnVzZWQgZmxhdHRlbmVkCiAgICAgIHN0cnVjdHVyZSBhZnRlciBleHBhbnNpb24uIFZlcnNpb24gMTYgaW50cm9kdWNlcyBhIG5ldyBtb3JlCiAgICAgICJjb21wYWN0IiBmb3JtYXQgZm9yIHRoZSB0cmVlIGl0c2VsZiB0aGF0IGlzIGhvd2V2ZXIgbm90IGJhY2t3YXJkCi0gICAgIGNvbXBhdGlibGUuIFlvdSBzaG91bGQgYWx3YXlzIGdlbmVyYXRlIGEgc3RydWN0dXJlIG9mIHRoZSBoaWdoZXN0Ci0gICAgIHZlcnNpb24gZGVmaW5lZCBhdCB0aGUgdGltZSBvZiB5b3VyIGltcGxlbWVudGF0aW9uLiBDdXJyZW50bHkKLSAgICAgdGhhdCBpcyB2ZXJzaW9uIDE2LCB1bmxlc3MgeW91IGV4cGxpY2l0bHkgYWltIGF0IGJlaW5nIGJhY2t3YXJkCi0gICAgIGNvbXBhdGlibGUuCisgICAgIGNvbXBhdGlibGUuIFZlcnNpb24gMTcgYWRkcyBhbiBhZGRpdGlvbmFsIGZpZWxkLCBzaXplX2R0X3N0cnVjdCwKKyAgICAgYWxsb3dpbmcgaXQgdG8gYmUgcmVhbGxvY2F0ZWQgb3IgbW92ZWQgbW9yZSBlYXNpbHkgKHRoaXMgaXMKKyAgICAgcGFydGljdWxhcmx5IHVzZWZ1bCBmb3IgYm9vdGxvYWRlcnMgd2hpY2ggbmVlZCB0byBtYWtlCisgICAgIGFkanVzdG1lbnRzIHRvIGEgZGV2aWNlIHRyZWUgYmFzZWQgb24gcHJvYmVkIGluZm9ybWF0aW9uKS4gWW91CisgICAgIHNob3VsZCBhbHdheXMgZ2VuZXJhdGUgYSBzdHJ1Y3R1cmUgb2YgdGhlIGhpZ2hlc3QgdmVyc2lvbiBkZWZpbmVkCisgICAgIGF0IHRoZSB0aW1lIG9mIHlvdXIgaW1wbGVtZW50YXRpb24uIEN1cnJlbnRseSB0aGF0IGlzIHZlcnNpb24gMTcsCisgICAgIHVubGVzcyB5b3UgZXhwbGljaXRseSBhaW0gYXQgYmVpbmcgYmFja3dhcmQgY29tcGF0aWJsZS4KIAogICAgLSBsYXN0X2NvbXBfdmVyc2lvbgogCkBAIC0zNDcsNyArMzUyLDcgQEAKICAgICAgaXMgYmFja3dhcmQgY29tcGF0aWJsZSB3aXRoIHZlcnNpb24gMSAodGhhdCBpcywgYSBrZXJuZWwgYnVpbGQKICAgICAgZm9yIHZlcnNpb24gMSB3aWxsIGJlIGFibGUgdG8gYm9vdCB3aXRoIGEgdmVyc2lvbiAyIGZvcm1hdCkuIFlvdQogICAgICBzaG91bGQgcHV0IGEgMSBpbiB0aGlzIGZpZWxkIGlmIHlvdSBnZW5lcmF0ZSBhIGRldmljZSB0cmVlIG9mCi0gICAgIHZlcnNpb24gMSB0byAzLCBvciAweDEwIGlmIHlvdSBnZW5lcmF0ZSBhIHRyZWUgb2YgdmVyc2lvbiAweDEwCisgICAgIHZlcnNpb24gMSB0byAzLCBvciAxNiBpZiB5b3UgZ2VuZXJhdGUgYSB0cmVlIG9mIHZlcnNpb24gMTYgb3IgMTcKICAgICAgdXNpbmcgdGhlIG5ldyB1bml0IG5hbWUgZm9ybWF0LgogCiAgICAtIGJvb3RfY3B1aWRfcGh5cwpAQCAtMzYwLDYgKzM2NSwxNyBAQAogICAgICBwb2ludCAoc2VlIGZ1cnRoZXIgY2hhcHRlcnMgZm9yIG1vcmUgaW5mb3JtYXRpb25zIG9uIHRoZSByZXF1aXJlZAogICAgICBkZXZpY2UtdHJlZSBjb250ZW50cykKIAorICAgLSBzaXplX2R0X3N0cmluZ3MKKworICAgICBUaGlzIGZpZWxkIG9ubHkgZXhpc3RzIG9uIHZlcnNpb24gMyBhbmQgbGF0ZXIgaGVhZGVycy4gIEl0CisgICAgIGdpdmVzIHRoZSBzaXplIG9mIHRoZSAic3RyaW5ncyIgc2VjdGlvbiBvZiB0aGUgZGV2aWNlIHRyZWUgKHdoaWNoCisgICAgIHN0YXJ0cyBhdCB0aGUgb2Zmc2V0IGdpdmVuIGJ5IG9mZl9kdF9zdHJpbmdzKS4KKworICAgLSBzaXplX2R0X3N0cnVjdAorCisgICAgIFRoaXMgZmllbGQgb25seSBleGlzdHMgb24gdmVyc2lvbiAxNyBhbmQgbGF0ZXIgaGVhZGVycy4gIEl0IGdpdmVzCisgICAgIHRoZSBzaXplIG9mIHRoZSAic3RydWN0dXJlIiBzZWN0aW9uIG9mIHRoZSBkZXZpY2UgdHJlZSAod2hpY2gKKyAgICAgc3RhcnRzIGF0IHRoZSBvZmZzZXQgZ2l2ZW4gYnkgb2ZmX2R0X3N0cnVjdCkuCiAKICAgIFNvIHRoZSB0eXBpY2FsIGxheW91dCBvZiBhIERUIGJsb2NrICh0aG91Z2ggdGhlIHZhcmlvdXMgcGFydHMgZG9uJ3QKICAgIG5lZWQgdG8gYmUgaW4gdGhhdCBvcmRlcikgbG9va3MgbGlrZSB0aGlzIChhZGRyZXNzZXMgZ28gZnJvbSB0b3AgdG8KQEAgLTQxNyw3ICs0MzMsNyBAQAogQSBub2RlIGhhcyAyIG5hbWVzLiBUaGUgYWN0dWFsIG5vZGUgbmFtZSBpcyBnZW5lcmFsbHkgY29udGFpbmVkIGluIGEKIHByb3BlcnR5IG9mIHR5cGUgIm5hbWUiIGluIHRoZSBub2RlIHByb3BlcnR5IGxpc3Qgd2hvc2UgdmFsdWUgaXMgYQogemVybyB0ZXJtaW5hdGVkIHN0cmluZyBhbmQgaXMgbWFuZGF0b3J5IGZvciB2ZXJzaW9uIDEgdG8gMyBvZiB0aGUKLWZvcm1hdCBkZWZpbml0aW9uIChhcyBpdCBpcyBpbiBPcGVuIEZpcm13YXJlKS4gVmVyc2lvbiAweDEwIG1ha2VzIGl0Citmb3JtYXQgZGVmaW5pdGlvbiAoYXMgaXQgaXMgaW4gT3BlbiBGaXJtd2FyZSkuIFZlcnNpb24gMTYgbWFrZXMgaXQKIG9wdGlvbmFsIGFzIGl0IGNhbiBnZW5lcmF0ZSBpdCBmcm9tIHRoZSB1bml0IG5hbWUgZGVmaW5lZCBiZWxvdy4KIAogVGhlcmUgaXMgYWxzbyBhICJ1bml0IG5hbWUiIHRoYXQgaXMgdXNlZCB0byBkaWZmZXJlbnRpYXRlIG5vZGVzIHdpdGgKQEAgLTQ2MSw3ICs0NzcsNyBAQAogaW50ZXJydXB0IHRyZWUgd2hpY2ggd2lsbCBiZSBkZXNjcmliZWQgaW4gYSBmdXJ0aGVyIHZlcnNpb24gb2YgdGhpcwogZG9jdW1lbnQuCiAKLVRoaXMgImxpbnV4LCBwaGFuZGxlIiBwcm9wZXJ0eSBpcyBhIDMyIGJpdCB2YWx1ZSB0aGF0IHVuaXF1ZWx5CitUaGlzICJsaW51eCwgcGhhbmRsZSIgcHJvcGVydHkgaXMgYSAzMi1iaXQgdmFsdWUgdGhhdCB1bmlxdWVseQogaWRlbnRpZmllcyBhIG5vZGUuIFlvdSBhcmUgZnJlZSB0byB1c2Ugd2hhdGV2ZXIgdmFsdWVzIG9yIHN5c3RlbSBvZgogdmFsdWVzLCBpbnRlcm5hbCBwb2ludGVycywgb3Igd2hhdGV2ZXIgdG8gZ2VuZXJhdGUgdGhlc2UsIHRoZSBvbmx5CiByZXF1aXJlbWVudCBpcyB0aGF0IGV2ZXJ5IG5vZGUgZm9yIHdoaWNoIHlvdSBwcm92aWRlIHRoYXQgcHJvcGVydHkgaGFzCkBAIC00NzEsNyArNDg3LDcgQEAKIGRlc2lnbmF0ZXMgYSBub2RlIGZvbGxvd2VkIGJ5IHRoZSBub2RlIHVuaXQgbmFtZS4gUHJvcGVydGllcyBhcmUKIHByZXNlbnRlZCB3aXRoIHRoZWlyIG5hbWUgZm9sbG93ZWQgYnkgdGhlaXIgY29udGVudC4gImNvbnRlbnQiCiByZXByZXNlbnRzIGFuIEFTQ0lJIHN0cmluZyAoemVybyB0ZXJtaW5hdGVkKSB2YWx1ZSwgd2hpbGUgPGNvbnRlbnQ+Ci1yZXByZXNlbnRzIGEgMzIgYml0IGhleGFkZWNpbWFsIHZhbHVlLiBUaGUgdmFyaW91cyBub2RlcyBpbiB0aGlzCityZXByZXNlbnRzIGEgMzItYml0IGhleGFkZWNpbWFsIHZhbHVlLiBUaGUgdmFyaW91cyBub2RlcyBpbiB0aGlzCiBleGFtcGxlIHdpbGwgYmUgZGlzY3Vzc2VkIGluIGEgbGF0ZXIgY2hhcHRlci4gQXQgdGhpcyBwb2ludCwgaXQgaXMKIG9ubHkgbWVhbnQgdG8gZ2l2ZSB5b3UgYSBpZGVhIG9mIHdoYXQgYSBkZXZpY2UtdHJlZSBsb29rcyBsaWtlLiBJIGhhdmUKIHB1cnBvc2VmdWxseSBrZXB0IHRoZSAibmFtZSIgYW5kICJsaW51eCxwaGFuZGxlIiBwcm9wZXJ0aWVzIHdoaWNoCkBAIC01NDMsMTUgKzU1OSwxNSBAQAogICAgICAqIFthbGlnbiBnYXAgdG8gbmV4dCA0IGJ5dGVzIGJvdW5kYXJ5XQogICAgICAqIGZvciBlYWNoIHByb3BlcnR5OgogICAgICAgICAqIHRva2VuIE9GX0RUX1BST1AgKHRoYXQgaXMgMHgwMDAwMDAwMykKLSAgICAgICAgKiAzMiBiaXQgdmFsdWUgb2YgcHJvcGVydHkgdmFsdWUgc2l6ZSBpbiBieXRlcyAob3IgMCBvZiBubwotICAgICAqIHZhbHVlKQotICAgICAgICAqIDMyIGJpdCB2YWx1ZSBvZiBvZmZzZXQgaW4gc3RyaW5nIGJsb2NrIG9mIHByb3BlcnR5IG5hbWUKKyAgICAgICAgKiAzMi1iaXQgdmFsdWUgb2YgcHJvcGVydHkgdmFsdWUgc2l6ZSBpbiBieXRlcyAob3IgMCBpZiBubworICAgICAgICAgIHZhbHVlKQorICAgICAgICAqIDMyLWJpdCB2YWx1ZSBvZiBvZmZzZXQgaW4gc3RyaW5nIGJsb2NrIG9mIHByb3BlcnR5IG5hbWUKICAgICAgICAgKiBwcm9wZXJ0eSB2YWx1ZSBkYXRhIGlmIGFueQogICAgICAgICAqIFthbGlnbiBnYXAgdG8gbmV4dCA0IGJ5dGVzIGJvdW5kYXJ5XQogICAgICAqIFtjaGlsZCBub2RlcyBpZiBhbnldCiAgICAgICogdG9rZW4gT0ZfRFRfRU5EX05PREUgKHRoYXQgaXMgMHgwMDAwMDAwMikKIAotU28gdGhlIG5vZGUgY29udGVudCBjYW4gYmUgc3VtbWFyaXNlZCBhcyBhIHN0YXJ0IHRva2VuLCBhIGZ1bGwgcGF0aCwKK1NvIHRoZSBub2RlIGNvbnRlbnQgY2FuIGJlIHN1bW1hcml6ZWQgYXMgYSBzdGFydCB0b2tlbiwgYSBmdWxsIHBhdGgsCiBhIGxpc3Qgb2YgcHJvcGVydGllcywgYSBsaXN0IG9mIGNoaWxkIG5vZGVzLCBhbmQgYW4gZW5kIHRva2VuLiBFdmVyeQogY2hpbGQgbm9kZSBpcyBhIGZ1bGwgbm9kZSBzdHJ1Y3R1cmUgaXRzZWxmIGFzIGRlZmluZWQgYWJvdmUuCiAKQEAgLTU4Myw3ICs1OTksNyBAQAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBUaGUgZ2VuZXJhbCBydWxlIGlzIGRvY3VtZW50ZWQgaW4gdGhlIHZhcmlvdXMgT3BlbiBGaXJtd2FyZQotZG9jdW1lbnRhdGlvbnMuIElmIHlvdSBjaG9zZSB0byBkZXNjcmliZSBhIGJ1cyB3aXRoIHRoZSBkZXZpY2UtdHJlZQorZG9jdW1lbnRhdGlvbnMuIElmIHlvdSBjaG9vc2UgdG8gZGVzY3JpYmUgYSBidXMgd2l0aCB0aGUgZGV2aWNlLXRyZWUKIGFuZCB0aGVyZSBleGlzdCBhbiBPRiBidXMgYmluZGluZywgdGhlbiB5b3Ugc2hvdWxkIGZvbGxvdyB0aGUKIHNwZWNpZmljYXRpb24uIEhvd2V2ZXIsIHRoZSBrZXJuZWwgZG9lcyBub3QgcmVxdWlyZSBldmVyeSBzaW5nbGUKIGRldmljZSBvciBidXMgdG8gYmUgZGVzY3JpYmVkIGJ5IHRoZSBkZXZpY2UgdHJlZS4KQEAgLTU5Niw5ICs2MTIsOSBAQAogb24gdGhlIHByb2Nlc3NvciBidXMuCiAKIFRob3NlIDIgcHJvcGVydGllcyBkZWZpbmUgJ2NlbGxzJyBmb3IgcmVwcmVzZW50aW5nIGFuIGFkZHJlc3MgYW5kIGEKLXNpemUuIEEgImNlbGwiIGlzIGEgMzIgYml0IG51bWJlci4gRm9yIGV4YW1wbGUsIGlmIGJvdGggY29udGFpbiAyCitzaXplLiBBICJjZWxsIiBpcyBhIDMyLWJpdCBudW1iZXIuIEZvciBleGFtcGxlLCBpZiBib3RoIGNvbnRhaW4gMgogbGlrZSB0aGUgZXhhbXBsZSB0cmVlIGdpdmVuIGFib3ZlLCB0aGVuIGFuIGFkZHJlc3MgYW5kIGEgc2l6ZSBhcmUgYm90aAotY29tcG9zZWQgb2YgMiBjZWxscywgYW5kIGVhY2ggaXMgYSA2NCBiaXQgbnVtYmVyIChjZWxscyBhcmUKK2NvbXBvc2VkIG9mIDIgY2VsbHMsIGFuZCBlYWNoIGlzIGEgNjQtYml0IG51bWJlciAoY2VsbHMgYXJlCiBjb25jYXRlbmF0ZWQgYW5kIGV4cGVjdGVkIHRvIGJlIGluIGJpZyBlbmRpYW4gZm9ybWF0KS4gQW5vdGhlciBleGFtcGxlCiBpcyB0aGUgd2F5IEFwcGxlIGZpcm13YXJlIGRlZmluZXMgdGhlbSwgd2l0aCAyIGNlbGxzIGZvciBhbiBhZGRyZXNzCiBhbmQgb25lIGNlbGwgZm9yIGEgc2l6ZS4gIE1vc3QgMzItYml0IGltcGxlbWVudGF0aW9ucyBzaG91bGQgZGVmaW5lCkBAIC02MzIsNyArNjQ4LDcgQEAKIAogVGhlICJyZWciIHByb3BlcnR5IG9ubHkgZGVmaW5lcyBhZGRyZXNzZXMgYW5kIHNpemVzIChpZiAjc2l6ZS1jZWxscwogaXMgbm9uLTApIHdpdGhpbiBhIGdpdmVuIGJ1cy4gSW4gb3JkZXIgdG8gdHJhbnNsYXRlIGFkZHJlc3NlcyB1cHdhcmQKLSh0aGF0IGlzIGludG8gcGFyZW50IGJ1cyBhZGRyZXNzZXMsIGFuZCBwb3NzaWJseSBpbnRvIGNwdSBwaHlzaWNhbAorKHRoYXQgaXMgaW50byBwYXJlbnQgYnVzIGFkZHJlc3NlcywgYW5kIHBvc3NpYmx5IGludG8gQ1BVIHBoeXNpY2FsCiBhZGRyZXNzZXMpLCBhbGwgYnVzc2VzIG11c3QgY29udGFpbiBhICJyYW5nZXMiIHByb3BlcnR5LiBJZiB0aGUKICJyYW5nZXMiIHByb3BlcnR5IGlzIG1pc3NpbmcgYXQgYSBnaXZlbiBsZXZlbCwgaXQncyBhc3N1bWVkIHRoYXQKIHRyYW5zbGF0aW9uIGlzbid0IHBvc3NpYmxlLiBUaGUgZm9ybWF0IG9mIHRoZSAicmFuZ2VzIiBwcm9wZXJ0eSBmb3IgYQpAQCAtNjQ4LDkgKzY2NCw5IEBACiBQQ0k8LT5JU0EgYnJpZGdlLCB0aGF0IHdvdWxkIGJlIGEgUENJIGFkZHJlc3MuIEl0IGRlZmluZXMgdGhlIGJhc2UKIGFkZHJlc3MgaW4gdGhlIHBhcmVudCBidXMgd2hlcmUgdGhlIGJlZ2lubmluZyBvZiB0aGF0IHJhbmdlIGlzIG1hcHBlZC4KIAotRm9yIGEgbmV3IDY0IGJpdCBwb3dlcnBjIGJvYXJkLCBJIHJlY29tbWVuZCBlaXRoZXIgdGhlIDIvMiBmb3JtYXQgb3IKK0ZvciBhIG5ldyA2NC1iaXQgcG93ZXJwYyBib2FyZCwgSSByZWNvbW1lbmQgZWl0aGVyIHRoZSAyLzIgZm9ybWF0IG9yCiBBcHBsZSdzIDIvMSBmb3JtYXQgd2hpY2ggaXMgc2xpZ2h0bHkgbW9yZSBjb21wYWN0IHNpbmNlIHNpemVzIHVzdWFsbHkKLWZpdCBpbiBhIHNpbmdsZSAzMiBiaXQgd29yZC4gICBOZXcgMzIgYml0IHBvd2VycGMgYm9hcmRzIHNob3VsZCB1c2UgYQorZml0IGluIGEgc2luZ2xlIDMyLWJpdCB3b3JkLiAgIE5ldyAzMi1iaXQgcG93ZXJwYyBib2FyZHMgc2hvdWxkIHVzZSBhCiAxLzEgZm9ybWF0LCB1bmxlc3MgdGhlIHByb2Nlc3NvciBzdXBwb3J0cyBwaHlzaWNhbCBhZGRyZXNzZXMgZ3JlYXRlcgogdGhhbiAzMi1iaXRzLCBpbiB3aGljaCBjYXNlIGEgMi8xIGZvcm1hdCBpcyByZWNvbW1lbmRlZC4KIApAQCAtNzY0LDcgKzc4MCw3IEBACiAgIFJlcXVpcmVkIHByb3BlcnRpZXM6CiAKICAgICAtIGRldmljZV90eXBlIDogaGFzIHRvIGJlICJjcHUiCi0gICAgLSByZWcgOiBUaGlzIGlzIHRoZSBwaHlzaWNhbCBjcHUgbnVtYmVyLCBpdCdzIGEgc2luZ2xlIDMyIGJpdCBjZWxsCisgICAgLSByZWcgOiBUaGlzIGlzIHRoZSBwaHlzaWNhbCBDUFUgbnVtYmVyLCBpdCdzIGEgc2luZ2xlIDMyLWJpdCBjZWxsCiAgICAgICBhbmQgaXMgYWxzbyB1c2VkIGFzLWlzIGFzIHRoZSB1bml0IG51bWJlciBmb3IgY29uc3RydWN0aW5nIHRoZQogICAgICAgdW5pdCBuYW1lIGluIHRoZSBmdWxsIHBhdGguIEZvciBleGFtcGxlLCB3aXRoIDIgQ1BVcywgeW91IHdvdWxkCiAgICAgICBoYXZlIHRoZSBmdWxsIHBhdGg6CkBAIC03ODUsNyArODAxLDcgQEAKICAgICAgIHRoZSBrZXJuZWwgdGltZWJhc2UvZGVjcmVtZW50ZXIgY2FsaWJyYXRpb24gYmFzZWQgb24gdGhpcwogICAgICAgdmFsdWUuCiAgICAgLSBjbG9jay1mcmVxdWVuY3kgOiBhIGNlbGwgaW5kaWNhdGluZyB0aGUgQ1BVIGNvcmUgY2xvY2sgZnJlcXVlbmN5Ci0gICAgICBpbiBIei4gQSBuZXcgcHJvcGVydHkgd2lsbCBiZSBkZWZpbmVkIGZvciA2NCBiaXQgdmFsdWVzLCBidXQgaWYKKyAgICAgIGluIEh6LiBBIG5ldyBwcm9wZXJ0eSB3aWxsIGJlIGRlZmluZWQgZm9yIDY0LWJpdCB2YWx1ZXMsIGJ1dCBpZgogICAgICAgeW91ciBmcmVxdWVuY3kgaXMgPCA0R2h6LCBvbmUgY2VsbCBpcyBlbm91Z2guIEhlcmUgYXMgd2VsbCBhcwogICAgICAgZm9yIHRoZSBhYm92ZSwgdGhlIGNvbW1vbiBjb2RlIGRvZXNuJ3QgdXNlIHRoYXQgcHJvcGVydHksIGJ1dAogICAgICAgeW91IGFyZSB3ZWxjb21lIHRvIHJlLXVzZSB0aGUgcFNlcmllcyBvciBNYXBsZSBvbmUuIEEgZnV0dXJlCkBAIC04MzIsOCArODQ4LDcgQEAKIAogICBUaGlzIG5vZGUgaXMgYSBiaXQgInNwZWNpYWwiLiBOb3JtYWxseSwgdGhhdCdzIHdoZXJlIG9wZW4gZmlybXdhcmUKICAgcHV0cyBzb21lIHZhcmlhYmxlIGVudmlyb25tZW50IGluZm9ybWF0aW9uLCBsaWtlIHRoZSBhcmd1bWVudHMsIG9yCi0gIHBoYW5kbGUgcG9pbnRlcnMgdG8gbm9kZXMgbGlrZSB0aGUgbWFpbiBpbnRlcnJ1cHQgY29udHJvbGxlciwgb3IgdGhlCi0gIGRlZmF1bHQgaW5wdXQvb3V0cHV0IGRldmljZXMuCisgIHRoZSBkZWZhdWx0IGlucHV0L291dHB1dCBkZXZpY2VzLgogCiAgIFRoaXMgc3BlY2lmaWNhdGlvbiBtYWtlcyBhIGZldyBvZiB0aGVzZSBtYW5kYXRvcnksIGJ1dCBhbHNvIGRlZmluZXMKICAgc29tZSBsaW51eC1zcGVjaWZpYyBwcm9wZXJ0aWVzIHRoYXQgd291bGQgYmUgbm9ybWFsbHkgY29uc3RydWN0ZWQgYnkKQEAgLTg1MywxNCArODY4LDE0IEBACiAgICAgICB0aGF0IHRoZSBrZXJuZWwgdHJpZXMgdG8gZmluZCBvdXQgdGhlIGRlZmF1bHQgY29uc29sZSBhbmQgaGFzCiAgICAgICBrbm93bGVkZ2Ugb2YgdmFyaW91cyB0eXBlcyBsaWtlIDgyNTAgc2VyaWFsIHBvcnRzLiBZb3UgbWF5IHdhbnQKICAgICAgIHRvIGV4dGVuZCB0aGlzIGZ1bmN0aW9uIHRvIGFkZCB5b3VyIG93bi4KLSAgICAtIGludGVycnVwdC1jb250cm9sbGVyIDogVGhpcyBpcyBvbmUgY2VsbCBjb250YWluaW5nIGEgcGhhbmRsZQotICAgICAgdmFsdWUgdGhhdCBtYXRjaGVzIHRoZSAibGludXgscGhhbmRsZSIgcHJvcGVydHkgb2YgeW91ciBtYWluCi0gICAgICBpbnRlcnJ1cHQgY29udHJvbGxlciBub2RlLiBNYXkgYmUgdXNlZCBmb3IgaW50ZXJydXB0IHJvdXRpbmcuCi0KIAogICBOb3RlIHRoYXQgdS1ib290IGNyZWF0ZXMgYW5kIGZpbGxzIGluIHRoZSBjaG9zZW4gbm9kZSBmb3IgcGxhdGZvcm1zCiAgIHRoYXQgdXNlIGl0LgogCisgIChOb3RlOiBhIHByYWN0aWNlIHRoYXQgaXMgbm93IG9ic29sZXRlIHdhcyB0byBpbmNsdWRlIGEgcHJvcGVydHkKKyAgdW5kZXIgL2Nob3NlbiBjYWxsZWQgaW50ZXJydXB0LWNvbnRyb2xsZXIgd2hpY2ggaGFkIGEgcGhhbmRsZSB2YWx1ZQorICB0aGF0IHBvaW50ZWQgdG8gdGhlIG1haW4gaW50ZXJydXB0IGNvbnRyb2xsZXIpCisKICAgZikgdGhlIC9zb2M8U09DbmFtZT4gbm9kZQogCiAgIFRoaXMgbm9kZSBpcyB1c2VkIHRvIHJlcHJlc2VudCBhIHN5c3RlbS1vbi1hLWNoaXAgKFNPQykgYW5kIG11c3QgYmUKQEAgLTkwOCw4ICs5MjMsNyBAQAogICBUaGUgU09DIG5vZGUgbWF5IGNvbnRhaW4gY2hpbGQgbm9kZXMgZm9yIGVhY2ggU09DIGRldmljZSB0aGF0IHRoZQogICBwbGF0Zm9ybSB1c2VzLiAgTm9kZXMgc2hvdWxkIG5vdCBiZSBjcmVhdGVkIGZvciBkZXZpY2VzIHdoaWNoIGV4aXN0CiAgIG9uIHRoZSBTT0MgYnV0IGFyZSBub3QgdXNlZCBieSBhIHBhcnRpY3VsYXIgcGxhdGZvcm0uIFNlZSBjaGFwdGVyIFZJCi0gIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGhvdyB0byBzcGVjaWZ5IGRldmljZXMgdGhhdCBhcmUgcGFydCBvZiBhbgotU09DLgorICBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBob3cgdG8gc3BlY2lmeSBkZXZpY2VzIHRoYXQgYXJlIHBhcnQgb2YgYSBTT0MuCiAKICAgRXhhbXBsZSBTT0Mgbm9kZSBmb3IgdGhlIE1QQzg1NDA6CiAKQEAgLTk3Miw3ICs5ODYsNyBAQAogICAgICAgICBbLW8gb3V0cHV0LWZpbGVuYW1lXSBbLVYgb3V0cHV0X3ZlcnNpb25dIGlucHV0X2ZpbGVuYW1lCiAKIAotVGhlICJvdXRwdXRfdmVyc2lvbiIgZGVmaW5lcyB3aGF0IHZlcnNpbyBvZiB0aGUgImJsb2IiIGZvcm1hdCB3aWxsIGJlCitUaGUgIm91dHB1dF92ZXJzaW9uIiBkZWZpbmVzIHdoYXQgdmVyc2lvbiBvZiB0aGUgImJsb2IiIGZvcm1hdCB3aWxsIGJlCiBnZW5lcmF0ZWQuIFN1cHBvcnRlZCB2ZXJzaW9ucyBhcmUgMSwyLDMgYW5kIDE2LiBUaGUgZGVmYXVsdCBpcwogY3VycmVudGx5IHZlcnNpb24gMyBidXQgdGhhdCBtYXkgY2hhbmdlIGluIHRoZSBmdXR1cmUgdG8gdmVyc2lvbiAxNi4KIApAQCAtOTk0LDEyICsxMDA4LDEyIEBACiAJCQkJICovCiAKICAgcHJvcGVydHkyID0gPDEyMzRhYmNkPjsJLyogZGVmaW5lIGEgcHJvcGVydHkgY29udGFpbmluZyBhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG51bWVyaWNhbCAzMiBiaXRzIHZhbHVlIChoZXhhZGVjaW1hbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogbnVtZXJpY2FsIDMyLWJpdCB2YWx1ZSAoaGV4YWRlY2ltYWwpCiAJCQkJICovCiAKICAgcHJvcGVydHkzID0gPDEyMzQ1Njc4IDEyMzQ1Njc4IGRlYWRiZWVmPjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGVmaW5lIGEgcHJvcGVydHkgY29udGFpbmluZyAzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG51bWVyaWNhbCAzMiBiaXRzIHZhbHVlcyAoY2VsbHMpIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG51bWVyaWNhbCAzMi1iaXQgdmFsdWVzIChjZWxscykgaW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogaGV4YWRlY2ltYWwKIAkJCQkgKi8KICAgcHJvcGVydHk0ID0gWzBhIDBiIDBjIDBkIGRlIGVhIGFkIGJlIGVmXTsKQEAgLTEwNjgsNyArMTA4Miw3IEBACiAgICAgaXRzIHVzYWdlIGluIGVhcmx5X2luaXRfZGV2dHJlZSgpLCBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgdmFyaW91cwogICAgIGVhcmx5X2luaXRfZHRfc2Nhbl8qKCkgY2FsbGJhY2tzLiBUaGF0IGNvZGUgY2FuIGJlIHJlLXVzZWQgaW4gYQogICAgIEdQTCBib290bG9hZGVyLCBhbmQgYXMgdGhlIGF1dGhvciBvZiB0aGF0IGNvZGUsIEkgd291bGQgYmUgaGFwcHkKLSAgICB0byBkaXNjdXNzIHBvc3NpYmxlIGZyZWUgbGljZW5jaW5nIHRvIGFueSB2ZW5kb3Igd2hvIHdpc2hlcyB0bworICAgIHRvIGRpc2N1c3MgcG9zc2libGUgZnJlZSBsaWNlbnNpbmcgdG8gYW55IHZlbmRvciB3aG8gd2lzaGVzIHRvCiAgICAgaW50ZWdyYXRlIGFsbCBvciBwYXJ0IG9mIHRoaXMgY29kZSBpbnRvIGEgbm9uLUdQTCBib290bG9hZGVyLgogCiAKQEAgLTEwNzcsNyArMTA5MSw3IEBACiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAogTWFueSBjb21wYW5pZXMgYXJlIG5vdyBzdGFydGluZyB0byBkZXZlbG9wIHN5c3RlbS1vbi1hLWNoaXAKLXByb2Nlc3NvcnMsIHdoZXJlIHRoZSBwcm9jZXNzb3IgY29yZSAoY3B1KSBhbmQgbWFueSBwZXJpcGhlcmFsIGRldmljZXMKK3Byb2Nlc3NvcnMsIHdoZXJlIHRoZSBwcm9jZXNzb3IgY29yZSAoQ1BVKSBhbmQgbWFueSBwZXJpcGhlcmFsIGRldmljZXMKIGV4aXN0IG9uIGEgc2luZ2xlIHBpZWNlIG9mIHNpbGljb24uICBGb3IgdGhlc2UgU09DcywgYW4gU09DIG5vZGUKIHNob3VsZCBiZSB1c2VkIHRoYXQgZGVmaW5lcyBjaGlsZCBub2RlcyBmb3IgdGhlIGRldmljZXMgdGhhdCBtYWtlCiB1cCB0aGUgU09DLiBXaGlsZSBwbGF0Zm9ybXMgYXJlIG5vdCByZXF1aXJlZCB0byB1c2UgdGhpcyBtb2RlbCBpbgpAQCAtMTEwOSw0MiArMTEyMyw3IEBACiBNUEM4NTQwLgogCiAKLTIpIFNwZWNpZnlpbmcgaW50ZXJydXB0IGluZm9ybWF0aW9uIGZvciBTT0MgZGV2aWNlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUVhY2ggZGV2aWNlIHRoYXQgaXMgcGFydCBvZiBhbiBTT0MgYW5kIHdoaWNoIGdlbmVyYXRlcyBpbnRlcnJ1cHRzCi1zaG91bGQgaGF2ZSB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6Ci0KLQktIGludGVycnVwdC1wYXJlbnQgOiBjb250YWlucyB0aGUgcGhhbmRsZSBvZiB0aGUgaW50ZXJydXB0Ci0gICAgICAgICAgY29udHJvbGxlciB3aGljaCBoYW5kbGVzIGludGVycnVwdHMgZm9yIHRoaXMgZGV2aWNlCi0JLSBpbnRlcnJ1cHRzIDogYSBsaXN0IG9mIHR1cGxlcyByZXByZXNlbnRpbmcgdGhlIGludGVycnVwdAotICAgICAgICAgIG51bWJlciBhbmQgdGhlIGludGVycnVwdCBzZW5zZSBhbmQgbGV2ZWwgZm9yIGVhY2ggaW50ZXJydXB0Ci0gICAgICAgICAgZm9yIHRoaXMgZGV2aWNlLgotCi1UaGlzIGluZm9ybWF0aW9uIGlzIHVzZWQgYnkgdGhlIGtlcm5lbCB0byBidWlsZCB0aGUgaW50ZXJydXB0IHRhYmxlCi1mb3IgdGhlIGludGVycnVwdCBjb250cm9sbGVycyBpbiB0aGUgc3lzdGVtLgotCi1TZW5zZSBhbmQgbGV2ZWwgaW5mb3JtYXRpb24gc2hvdWxkIGJlIGVuY29kZWQgYXMgZm9sbG93czoKLQotICAgRGV2aWNlcyBjb25uZWN0ZWQgdG8gb3BlblBJQy1jb21wYXRpYmxlIGNvbnRyb2xsZXJzIHNob3VsZCBlbmNvZGUKLSAgIHNlbnNlIGFuZCBwb2xhcml0eSBhcyBmb2xsb3dzOgotCi0JMCA9IGxvdyB0byBoaWdoIGVkZ2Ugc2Vuc2l0aXZlIHR5cGUgZW5hYmxlZAotCTEgPSBhY3RpdmUgbG93IGxldmVsIHNlbnNpdGl2ZSB0eXBlIGVuYWJsZWQKLQkyID0gYWN0aXZlIGhpZ2ggbGV2ZWwgc2Vuc2l0aXZlIHR5cGUgZW5hYmxlZAotCTMgPSBoaWdoIHRvIGxvdyBlZGdlIHNlbnNpdGl2ZSB0eXBlIGVuYWJsZWQKLQotICAgSVNBIFBJQyBpbnRlcnJ1cHQgY29udHJvbGxlcnMgc2hvdWxkIGFkaGVyZSB0byB0aGUgSVNBIFBJQwotICAgZW5jb2RpbmdzIGxpc3RlZCBiZWxvdzoKLQotCTAgPSAgYWN0aXZlIGxvdyBsZXZlbCBzZW5zaXRpdmUgdHlwZSBlbmFibGVkCi0JMSA9ICBhY3RpdmUgaGlnaCBsZXZlbCBzZW5zaXRpdmUgdHlwZSBlbmFibGVkCi0JMiA9ICBoaWdoIHRvIGxvdyBlZGdlIHNlbnNpdGl2ZSB0eXBlIGVuYWJsZWQKLQkzID0gIGxvdyB0byBoaWdoIGVkZ2Ugc2Vuc2l0aXZlIHR5cGUgZW5hYmxlZAotCi0KLQotMykgUmVwcmVzZW50aW5nIGRldmljZXMgd2l0aG91dCBhIGN1cnJlbnQgT0Ygc3BlY2lmaWNhdGlvbgorMikgUmVwcmVzZW50aW5nIGRldmljZXMgd2l0aG91dCBhIGN1cnJlbnQgT0Ygc3BlY2lmaWNhdGlvbgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBDdXJyZW50bHksIHRoZXJlIGFyZSBtYW55IGRldmljZXMgb24gU09DcyB0aGF0IGRvIG5vdCBoYXZlIGEgc3RhbmRhcmQKQEAgLTEyMDEsNiArMTE4MCwxMyBAQAogICAgIC0gcGh5LWhhbmRsZSA6IFRoZSBwaGFuZGxlIGZvciB0aGUgUEhZIGNvbm5lY3RlZCB0byB0aGlzIGV0aGVybmV0CiAgICAgICBjb250cm9sbGVyLgogCisgIFJlY29tbWVuZGVkIHByb3BlcnRpZXM6CisKKyAgICAtIGxpbnV4LG5ldHdvcmstaW5kZXggOiBUaGlzIGlzIHRoZSBpbnRlbmRlZCAiaW5kZXgiIG9mIHRoaXMKKyAgICAgIG5ldHdvcmsgZGV2aWNlLiAgVGhpcyBpcyB1c2VkIGJ5IHRoZSBib290d3JhcHBlciB0byBpbnRlcnByZXQKKyAgICAgIE1BQyBhZGRyZXNzZXMgcGFzc2VkIGJ5IHRoZSBmaXJtd2FyZSB3aGVuIG5vIGluZm9ybWF0aW9uIG90aGVyCisgICAgICB0aGFuIGluZGljZXMgaXMgYXZhaWxhYmxlIHRvIGFzc29jaWF0ZSBhbiBhZGRyZXNzIHdpdGggYSBkZXZpY2UuCisKICAgRXhhbXBsZToKIAogCWV0aGVybmV0QDI0MDAwIHsKQEAgLTEzMTIsMTAgKzEyOTgsMTAgQEAKICAgIGFuZCBhZGRpdGlvbnMgOiAgCiAKICAgIFJlcXVpcmVkIHByb3BlcnRpZXMgOgotICAgIC0gY29tcGF0aWJsZSA6IFNob3VsZCBiZSAiZnNsLXVzYjItbXBoIiBmb3IgbXVsdGkgcG9ydCBob3N0IHVzYgotICAgICAgY29udHJvbGxlcnMsIG9yICJmc2wtdXNiMi1kciIgZm9yIGR1YWwgcm9sZSB1c2IgY29udHJvbGxlcnMKLSAgICAtIHBoeV90eXBlIDogRm9yIG11bHRpIHBvcnQgaG9zdCB1c2IgY29udHJvbGxlcnMsIHNob3VsZCBiZSBvbmUgb2YKLSAgICAgICJ1bHBpIiwgb3IgInNlcmlhbCIuIEZvciBkdWFsIHJvbGUgdXNiIGNvbnRyb2xsZXJzLCBzaG91bGQgYmUKKyAgICAtIGNvbXBhdGlibGUgOiBTaG91bGQgYmUgImZzbC11c2IyLW1waCIgZm9yIG11bHRpIHBvcnQgaG9zdCBVU0IKKyAgICAgIGNvbnRyb2xsZXJzLCBvciAiZnNsLXVzYjItZHIiIGZvciBkdWFsIHJvbGUgVVNCIGNvbnRyb2xsZXJzCisgICAgLSBwaHlfdHlwZSA6IEZvciBtdWx0aSBwb3J0IGhvc3QgVVNCIGNvbnRyb2xsZXJzLCBzaG91bGQgYmUgb25lIG9mCisgICAgICAidWxwaSIsIG9yICJzZXJpYWwiLiBGb3IgZHVhbCByb2xlIFVTQiBjb250cm9sbGVycywgc2hvdWxkIGJlCiAgICAgICBvbmUgb2YgInVscGkiLCAidXRtaSIsICJ1dG1pX3dpZGUiLCBvciAic2VyaWFsIi4KICAgICAtIHJlZyA6IE9mZnNldCBhbmQgbGVuZ3RoIG9mIHRoZSByZWdpc3RlciBzZXQgZm9yIHRoZSBkZXZpY2UKICAgICAtIHBvcnQwIDogYm9vbGVhbjsgaWYgZGVmaW5lZCwgaW5kaWNhdGVzIHBvcnQwIGlzIGNvbm5lY3RlZCBmb3IKQEAgLTEzMzksNyArMTMyNSw3IEBACiAgICAgLSBpbnRlcnJ1cHQtcGFyZW50IDogdGhlIHBoYW5kbGUgZm9yIHRoZSBpbnRlcnJ1cHQgY29udHJvbGxlciB0aGF0CiAgICAgICBzZXJ2aWNlcyBpbnRlcnJ1cHRzIGZvciB0aGlzIGRldmljZS4KIAotICAgRXhhbXBsZSBtdWx0aSBwb3J0IGhvc3QgdXNiIGNvbnRyb2xsZXIgZGV2aWNlIG5vZGUgOiAKKyAgIEV4YW1wbGUgbXVsdGkgcG9ydCBob3N0IFVTQiBjb250cm9sbGVyIGRldmljZSBub2RlIDoKIAl1c2JAMjIwMDAgewogCSAgICAgICAgZGV2aWNlX3R5cGUgPSAidXNiIjsKIAkJY29tcGF0aWJsZSA9ICJmc2wtdXNiMi1tcGgiOwpAQCAtMTM1Myw3ICsxMzM5LDcgQEAKIAkJcG9ydDE7CiAJfTsKIAotICAgRXhhbXBsZSBkdWFsIHJvbGUgdXNiIGNvbnRyb2xsZXIgZGV2aWNlIG5vZGUgOiAKKyAgIEV4YW1wbGUgZHVhbCByb2xlIFVTQiBjb250cm9sbGVyIGRldmljZSBub2RlIDoKIAl1c2JAMjMwMDAgewogCQlkZXZpY2VfdHlwZSA9ICJ1c2IiOwogCQljb21wYXRpYmxlID0gImZzbC11c2IyLWRyIjsKQEAgLTEzODcsNyArMTM3Myw3IEBACiAgICAgLSBjaGFubmVsLWZpZm8tbGVuIDogQW4gaW50ZWdlciByZXByZXNlbnRpbmcgdGhlIG51bWJlciBvZgogICAgICAgZGVzY3JpcHRvciBwb2ludGVycyBlYWNoIGNoYW5uZWwgZmV0Y2ggZmlmbyBjYW4gaG9sZC4KICAgICAtIGV4ZWMtdW5pdHMtbWFzayA6IFRoZSBiaXRtYXNrIHJlcHJlc2VudGluZyB3aGF0IGV4ZWN1dGlvbiB1bml0cwotICAgICAgKEVVcykgYXJlIGF2YWlsYWJsZS4gSXQncyBhIHNpbmdsZSAzMiBiaXQgY2VsbC4gRVUgaW5mb3JtYXRpb24KKyAgICAgIChFVXMpIGFyZSBhdmFpbGFibGUuIEl0J3MgYSBzaW5nbGUgMzItYml0IGNlbGwuIEVVIGluZm9ybWF0aW9uCiAgICAgICBzaG91bGQgYmUgZW5jb2RlZCBmb2xsb3dpbmcgdGhlIFNFQydzIERlc2NyaXB0b3IgSGVhZGVyIER3b3JkCiAgICAgICBFVV9TRUwwIGZpZWxkIGRvY3VtZW50YXRpb24sIGkuZS4gYXMgZm9sbG93czoKIApAQCAtMTQwMyw3ICsxMzg5LDcgQEAKICAgICAgIGJpdHMgOCB0aHJvdWdoIDMxIGFyZSByZXNlcnZlZCBmb3IgZnV0dXJlIFNFQyBFVXMuCiAKICAgICAtIGRlc2NyaXB0b3ItdHlwZXMtbWFzayA6IFRoZSBiaXRtYXNrIHJlcHJlc2VudGluZyB3aGF0IGRlc2NyaXB0b3JzCi0gICAgICBhcmUgYXZhaWxhYmxlLiBJdCdzIGEgc2luZ2xlIDMyIGJpdCBjZWxsLiBEZXNjcmlwdG9yIHR5cGUKKyAgICAgIGFyZSBhdmFpbGFibGUuIEl0J3MgYSBzaW5nbGUgMzItYml0IGNlbGwuIERlc2NyaXB0b3IgdHlwZQogICAgICAgaW5mb3JtYXRpb24gc2hvdWxkIGJlIGVuY29kZWQgZm9sbG93aW5nIHRoZSBTRUMncyBEZXNjcmlwdG9yCiAgICAgICBIZWFkZXIgRHdvcmQgREVTQ19UWVBFIGZpZWxkIGRvY3VtZW50YXRpb24sIGkuZS4gYXMgZm9sbG93czoKIApAQCAtMTQ5Miw3ICsxNDc4LDcgQEAKICAgIFJlcXVpcmVkIHByb3BlcnRpZXM6CiAgICAtIGRldmljZV90eXBlIDogc2hvdWxkIGJlICJzcGkiLgogICAgLSBjb21wYXRpYmxlIDogc2hvdWxkIGJlICJmc2xfc3BpIi4KLSAgIC0gbW9kZSA6IHRoZSBzcGkgb3BlcmF0aW9uIG1vZGUsIGl0IGNhbiBiZSAiY3B1IiBvciAicWUiLgorICAgLSBtb2RlIDogdGhlIFNQSSBvcGVyYXRpb24gbW9kZSwgaXQgY2FuIGJlICJjcHUiIG9yICJxZSIuCiAgICAtIHJlZyA6IE9mZnNldCBhbmQgbGVuZ3RoIG9mIHRoZSByZWdpc3RlciBzZXQgZm9yIHRoZSBkZXZpY2UKICAgIC0gaW50ZXJydXB0cyA6IDxhIGI+IHdoZXJlIGEgaXMgdGhlIGludGVycnVwdCBudW1iZXIgYW5kIGIgaXMgYQogICAgICBmaWVsZCB0aGF0IHJlcHJlc2VudHMgYW4gZW5jb2Rpbmcgb2YgdGhlIHNlbnNlIGFuZCBsZXZlbApAQCAtMTU2OSw2ICsxNTU1LDEyIEBACiAgICAtIG1hYy1hZGRyZXNzIDogbGlzdCBvZiBieXRlcyByZXByZXNlbnRpbmcgdGhlIGV0aGVybmV0IGFkZHJlc3MuCiAgICAtIHBoeS1oYW5kbGUgOiBUaGUgcGhhbmRsZSBmb3IgdGhlIFBIWSBjb25uZWN0ZWQgdG8gdGhpcyBjb250cm9sbGVyLgogCisgICBSZWNvbW1lbmRlZCBwcm9wZXJ0aWVzOgorICAgLSBsaW51eCxuZXR3b3JrLWluZGV4IDogVGhpcyBpcyB0aGUgaW50ZW5kZWQgImluZGV4IiBvZiB0aGlzCisgICAgIG5ldHdvcmsgZGV2aWNlLiAgVGhpcyBpcyB1c2VkIGJ5IHRoZSBib290d3JhcHBlciB0byBpbnRlcnByZXQKKyAgICAgTUFDIGFkZHJlc3NlcyBwYXNzZWQgYnkgdGhlIGZpcm13YXJlIHdoZW4gbm8gaW5mb3JtYXRpb24gb3RoZXIKKyAgICAgdGhhbiBpbmRpY2VzIGlzIGF2YWlsYWJsZSB0byBhc3NvY2lhdGUgYW4gYWRkcmVzcyB3aXRoIGEgZGV2aWNlLgorCiAgICBFeGFtcGxlOgogCXVjY0AyMDAwIHsKIAkJZGV2aWNlX3R5cGUgPSAibmV0d29yayI7CkBAIC0xNzEyLDcgKzE3MDQsNyBAQAogICAgICAtIHBhcnRpdGlvbnMgOiBTZXZlcmFsIHBhaXJzIG9mIDMyLWJpdCB2YWx1ZXMgd2hlcmUgdGhlIGZpcnN0IHZhbHVlIGlzCiAgICAgICAgcGFydGl0aW9uJ3Mgb2Zmc2V0IGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBkZXZpY2UgYW5kIHRoZSBzZWNvbmQgb25lIGlzCiAgICAgICAgcGFydGl0aW9uIHNpemUgaW4gYnl0ZXMgd2l0aCBMU0IgdXNlZCB0byBzaWduaWZ5IGEgcmVhZCBvbmx5Ci0gICAgICAgcGFydGl0aW9uIChzbywgdGhlIHBhcml0aW9uIHNpemUgc2hvdWxkIGFsd2F5cyBiZSBhbiBldmVuIG51bWJlcikuCisgICAgICAgcGFydGl0aW9uIChzbywgdGhlIHBhcnRpdGlvbiBzaXplIHNob3VsZCBhbHdheXMgYmUgYW4gZXZlbiBudW1iZXIpLgogICAgICAtIHBhcnRpdGlvbi1uYW1lcyA6IFRoZSBsaXN0IG9mIGNvbmNhdGVuYXRlZCB6ZXJvIHRlcm1pbmF0ZWQgc3RyaW5ncwogICAgICAgIHJlcHJlc2VudGluZyB0aGUgcGFydGl0aW9uIG5hbWVzLgogICAgICAtIHByb2JlLXR5cGUgOiBUaGUgdHlwZSBvZiBwcm9iZSB3aGljaCBzaG91bGQgYmUgZG9uZSBmb3IgdGhlIGNoaXAKQEAgLTE3MzMsNiArMTcyNSw5MiBAQAogCiAgICBNb3JlIGRldmljZXMgd2lsbCBiZSBkZWZpbmVkIGFzIHRoaXMgc3BlYyBtYXR1cmVzLgogCitWSUkgLSBTcGVjaWZ5aW5nIGludGVycnVwdCBpbmZvcm1hdGlvbiBmb3IgZGV2aWNlcworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZSBkZXZpY2UgdHJlZSByZXByZXNlbnRzIHRoZSBidXNzZXMgYW5kIGRldmljZXMgb2YgYSBoYXJkd2FyZQorc3lzdGVtIGluIGEgZm9ybSBzaW1pbGFyIHRvIHRoZSBwaHlzaWNhbCBidXMgdG9wb2xvZ3kgb2YgdGhlCitoYXJkd2FyZS4KKworSW4gYWRkaXRpb24sIGEgbG9naWNhbCAnaW50ZXJydXB0IHRyZWUnIGV4aXN0cyB3aGljaCByZXByZXNlbnRzIHRoZQoraGllcmFyY2h5IGFuZCByb3V0aW5nIG9mIGludGVycnVwdHMgaW4gdGhlIGhhcmR3YXJlLgorCitUaGUgaW50ZXJydXB0IHRyZWUgbW9kZWwgaXMgZnVsbHkgZGVzY3JpYmVkIGluIHRoZQorZG9jdW1lbnQgIk9wZW4gRmlybXdhcmUgUmVjb21tZW5kZWQgUHJhY3RpY2U6IEludGVycnVwdAorTWFwcGluZyBWZXJzaW9uIDAuOSIuICBUaGUgZG9jdW1lbnQgaXMgYXZhaWxhYmxlIGF0OgorPGh0dHA6Ly9wbGF5Z3JvdW5kLnN1bi5jb20vMTI3NS9wcmFjdGljZT4uCisKKzEpIGludGVycnVwdHMgcHJvcGVydHkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRGV2aWNlcyB0aGF0IGdlbmVyYXRlIGludGVycnVwdHMgdG8gYSBzaW5nbGUgaW50ZXJydXB0IGNvbnRyb2xsZXIKK3Nob3VsZCB1c2UgdGhlIGNvbnZlbnRpb25hbCBPRiByZXByZXNlbnRhdGlvbiBkZXNjcmliZWQgaW4gdGhlCitPRiBpbnRlcnJ1cHQgbWFwcGluZyBkb2N1bWVudGF0aW9uLgorCitFYWNoIGRldmljZSB3aGljaCBnZW5lcmF0ZXMgaW50ZXJydXB0cyBtdXN0IGhhdmUgYW4gJ2ludGVycnVwdCcKK3Byb3BlcnR5LiAgVGhlIGludGVycnVwdCBwcm9wZXJ0eSB2YWx1ZSBpcyBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mCitvZiAnaW50ZXJydXB0IHNwZWNpZmllcicgdmFsdWVzIHdoaWNoIGRlc2NyaWJlIHRoZSBpbnRlcnJ1cHQgb3IKK2ludGVycnVwdHMgZm9yIHRoZSBkZXZpY2UuCisKK1RoZSBlbmNvZGluZyBvZiBhbiBpbnRlcnJ1cHQgc3BlY2lmaWVyIGlzIGRldGVybWluZWQgYnkgdGhlCitpbnRlcnJ1cHQgZG9tYWluIGluIHdoaWNoIHRoZSBkZXZpY2UgaXMgbG9jYXRlZCBpbiB0aGUKK2ludGVycnVwdCB0cmVlLiAgVGhlIHJvb3Qgb2YgYW4gaW50ZXJydXB0IGRvbWFpbiBzcGVjaWZpZXMgaW4KK2l0cyAjaW50ZXJydXB0LWNlbGxzIHByb3BlcnR5IHRoZSBudW1iZXIgb2YgMzItYml0IGNlbGxzCityZXF1aXJlZCB0byBlbmNvZGUgYW4gaW50ZXJydXB0IHNwZWNpZmllci4gIFNlZSB0aGUgT0YgaW50ZXJydXB0CittYXBwaW5nIGRvY3VtZW50YXRpb24gZm9yIGEgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgZG9tYWlucy4KKworRm9yIGV4YW1wbGUsIHRoZSBiaW5kaW5nIGZvciB0aGUgT3BlblBJQyBpbnRlcnJ1cHQgY29udHJvbGxlcgorc3BlY2lmaWVzICBhbiAjaW50ZXJydXB0LWNlbGxzIHZhbHVlIG9mIDIgdG8gZW5jb2RlIHRoZSBpbnRlcnJ1cHQKK251bWJlciBhbmQgbGV2ZWwvc2Vuc2UgaW5mb3JtYXRpb24uIEFsbCBpbnRlcnJ1cHQgY2hpbGRyZW4gaW4gYW4KK09wZW5QSUMgaW50ZXJydXB0IGRvbWFpbiB1c2UgMiBjZWxscyBwZXIgaW50ZXJydXB0IGluIHRoZWlyIGludGVycnVwdHMKK3Byb3BlcnR5LgorCitUaGUgUENJIGJ1cyBiaW5kaW5nIHNwZWNpZmllcyBhICNpbnRlcnJ1cHQtY2VsbCB2YWx1ZSBvZiAxIHRvIGVuY29kZQord2hpY2ggaW50ZXJydXB0IHBpbiAoSU5UQSxJTlRCLElOVEMsSU5URCkgaXMgdXNlZC4KKworMikgaW50ZXJydXB0LXBhcmVudCBwcm9wZXJ0eQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgaW50ZXJydXB0LXBhcmVudCBwcm9wZXJ0eSBpcyBzcGVjaWZpZWQgdG8gZGVmaW5lIGFuIGV4cGxpY2l0CitsaW5rIGJldHdlZW4gYSBkZXZpY2Ugbm9kZSBhbmQgaXRzIGludGVycnVwdCBwYXJlbnQgaW4KK3RoZSBpbnRlcnJ1cHQgdHJlZS4gIFRoZSB2YWx1ZSBvZiBpbnRlcnJ1cHQtcGFyZW50IGlzIHRoZQorcGhhbmRsZSBvZiB0aGUgcGFyZW50IG5vZGUuCisKK0lmIHRoZSBpbnRlcnJ1cHQtcGFyZW50IHByb3BlcnR5IGlzIG5vdCBkZWZpbmVkIGZvciBhIG5vZGUsIGl0J3MKK2ludGVycnVwdCBwYXJlbnQgaXMgYXNzdW1lZCB0byBiZSBhbiBhbmNlc3RvciBpbiB0aGUgbm9kZSdzCitfZGV2aWNlIHRyZWVfIGhpZXJhcmNoeS4KKworMykgT3BlblBJQyBJbnRlcnJ1cHQgQ29udHJvbGxlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK09wZW5QSUMgaW50ZXJydXB0IGNvbnRyb2xsZXJzIHJlcXVpcmUgMiBjZWxscyB0byBlbmNvZGUKK2ludGVycnVwdCBpbmZvcm1hdGlvbi4gIFRoZSBmaXJzdCBjZWxsIGRlZmluZXMgdGhlIGludGVycnVwdAorbnVtYmVyLiAgVGhlIHNlY29uZCBjZWxsIGRlZmluZXMgdGhlIHNlbnNlIGFuZCBsZXZlbAoraW5mb3JtYXRpb24uCisKK1NlbnNlIGFuZCBsZXZlbCBpbmZvcm1hdGlvbiBzaG91bGQgYmUgZW5jb2RlZCBhcyBmb2xsb3dzOgorCisJMCA9IGxvdyB0byBoaWdoIGVkZ2Ugc2Vuc2l0aXZlIHR5cGUgZW5hYmxlZAorCTEgPSBhY3RpdmUgbG93IGxldmVsIHNlbnNpdGl2ZSB0eXBlIGVuYWJsZWQKKwkyID0gYWN0aXZlIGhpZ2ggbGV2ZWwgc2Vuc2l0aXZlIHR5cGUgZW5hYmxlZAorCTMgPSBoaWdoIHRvIGxvdyBlZGdlIHNlbnNpdGl2ZSB0eXBlIGVuYWJsZWQKKworNCkgSVNBIEludGVycnVwdCBDb250cm9sbGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJU0EgUElDIGludGVycnVwdCBjb250cm9sbGVycyByZXF1aXJlIDIgY2VsbHMgdG8gZW5jb2RlCitpbnRlcnJ1cHQgaW5mb3JtYXRpb24uICBUaGUgZmlyc3QgY2VsbCBkZWZpbmVzIHRoZSBpbnRlcnJ1cHQKK251bWJlci4gIFRoZSBzZWNvbmQgY2VsbCBkZWZpbmVzIHRoZSBzZW5zZSBhbmQgbGV2ZWwKK2luZm9ybWF0aW9uLgorCitJU0EgUElDIGludGVycnVwdCBjb250cm9sbGVycyBzaG91bGQgYWRoZXJlIHRvIHRoZSBJU0EgUElDCitlbmNvZGluZ3MgbGlzdGVkIGJlbG93OgorCisJMCA9ICBhY3RpdmUgbG93IGxldmVsIHNlbnNpdGl2ZSB0eXBlIGVuYWJsZWQKKwkxID0gIGFjdGl2ZSBoaWdoIGxldmVsIHNlbnNpdGl2ZSB0eXBlIGVuYWJsZWQKKwkyID0gIGhpZ2ggdG8gbG93IGVkZ2Ugc2Vuc2l0aXZlIHR5cGUgZW5hYmxlZAorCTMgPSAgbG93IHRvIGhpZ2ggZWRnZSBzZW5zaXRpdmUgdHlwZSBlbmFibGVkCisKIAogQXBwZW5kaXggQSAtIFNhbXBsZSBTT0Mgbm9kZSBmb3IgTVBDODU0MAogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zMzkwL2NyeXB0by9jcnlwdG8tQVBJLnR4dCBiL0RvY3VtZW50YXRpb24vczM5MC9jcnlwdG8vY3J5cHRvLUFQSS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxYWU2Y2EuLjAwMDAwMDAKLS0tIGEvRG9jdW1lbnRhdGlvbi9zMzkwL2NyeXB0by9jcnlwdG8tQVBJLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLWNyeXB0by1BUEkgc3VwcG9ydCBmb3Igejk5MCBNZXNzYWdlIFNlY3VyaXR5IEFzc2lzdCAoTVNBKSBpbnN0cnVjdGlvbnMKLX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLQotQVVUSE9SOglUaG9tYXMgU3BhdHppZXIgKHRzcGF0QGRlLmlibS5jb20pCi0KLQotMS4gSW50cm9kdWN0aW9uIGNyeXB0by1BUEkKLX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci1TZWUgRG9jdW1lbnRhdGlvbi9jcnlwdG8vYXBpLWludHJvLnR4dCBmb3IgYW4gaW50cm9kdWN0aW9uL2Rlc2NyaXB0aW9uIG9mIHRoZQota2VybmVsIGNyeXB0byBBUEkuCi1BY2NvcmRpbmcgdG8gYXBpLWludHJvLnR4dCBzdXBwb3J0IGZvciB6OTkwIGNyeXB0byBpbnN0cnVjdGlvbnMgaGFzIGJlZW4gYWRkZWQKLWluIHRoZSBhbGdvcml0aG0gYXBpIGxheWVyIG9mIHRoZSBjcnlwdG8gQVBJLiBTZXZlcmFsIGZpbGVzIGNvbnRhaW5pbmcgejk5MAotb3B0aW1pemVkIGltcGxlbWVudGF0aW9ucyBvZiBjcnlwdG8gYWxnb3JpdGhtcyBhcmUgcGxhY2VkIGluIHRoZQotYXJjaC9zMzkwL2NyeXB0byBkaXJlY3RvcnkuCi0KLQotMi4gUHJvYmluZyBmb3IgYXZhaWxhYmlsaXR5IG9mIE1TQQotfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotSXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIHVzZSBLZXJuZWxzIHdpdGggdGhlIHo5OTAgY3J5cHRvIGltcGxlbWVudGF0aW9ucyBib3RoCi1vbiBtYWNoaW5lcyB3aXRoIE1TQSBhdmFpbGFibGUgYW5kIG9uIHRob3NlIHdpdGhvdXQgTVNBIChwcmUgejk5MCBvciB6OTkwCi13aXRob3V0IE1TQSkuIFRoZXJlZm9yZSBhIHNpbXBsZSBwcm9iaW5nIG1lY2hhbmlzbSBoYXMgYmVlbiBpbXBsZW1lbnRlZDoKLUluIHRoZSBpbml0IGZ1bmN0aW9uIG9mIGVhY2ggY3J5cHRvIG1vZHVsZSB0aGUgYXZhaWxhYmlsaXR5IG9mIE1TQSBhbmQgb2YgdGhlCi1yZXNwZWN0aXZlIGNyeXB0byBhbGdvcml0aG0gaW4gcGFydGljdWxhciB3aWxsIGJlIHRlc3RlZC4gSWYgdGhlIGFsZ29yaXRobSBpcwotYXZhaWxhYmxlIHRoZSBtb2R1bGUgd2lsbCBsb2FkIGFuZCByZWdpc3RlciBpdHMgYWxnb3JpdGhtIHdpdGggdGhlIGNyeXB0byBBUEkuCi0KLUlmIHRoZSByZXNwZWN0aXZlIGNyeXB0byBhbGdvcml0aG0gaXMgbm90IGF2YWlsYWJsZSwgdGhlIGluaXQgZnVuY3Rpb24gd2lsbAotcmV0dXJuIC1FTk9TWVMuIEluIHRoYXQgY2FzZSBhIGZhbGxiYWNrIHRvIHRoZSBzdGFuZGFyZCBzb2Z0d2FyZSBpbXBsZW1lbnRhdGlvbgotb2YgdGhlIGNyeXB0byBhbGdvcml0aG0gbXVzdCBiZSB0YWtlbiAoIC0+IHRoZSBzdGFuZGFyZCBjcnlwdG8gbW9kdWxlcyBhcmUKLWFsc28gYnVpbHQgd2hlbiBjb21waWxpbmcgdGhlIGtlcm5lbCkuCi0KLQotMy4gRW5zdXJpbmcgejk5MCBjcnlwdG8gbW9kdWxlIHByZWZlcmVuY2UKLX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci1JZiB6OTkwIGNyeXB0byBpbnN0cnVjdGlvbnMgYXJlIGF2YWlsYWJsZSB0aGUgb3B0aW1pemVkIG1vZHVsZXMgc2hvdWxkIGJlCi1wcmVmZXJyZWQgaW5zdGVhZCBvZiBzdGFuZGFyZCBtb2R1bGVzLgotCi0zLjEuIGNvbXBpbGVkLWluIG1vZHVsZXMKLX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotRm9yIGNvbXBpbGVkLWluIG1vZHVsZXMgaXQgaGFzIHRvIGJlIGVuc3VyZWQgdGhhdCB0aGUgejk5MCBtb2R1bGVzIGFyZSBsaW5rZWQKLWJlZm9yZSB0aGUgc3RhbmRhcmQgY3J5cHRvIG1vZHVsZXMuIFRoZW4sIG9uIHN5c3RlbSBzdGFydHVwIHRoZSBpbml0IGZ1bmN0aW9ucwotb2Ygejk5MCBjcnlwdG8gbW9kdWxlcyB3aWxsIGJlIGNhbGxlZCBmaXJzdCBhbmQgcXVlcnkgZm9yIGF2YWlsYWJpbGl0eSBvZiB6OTkwCi1jcnlwdG8gaW5zdHJ1Y3Rpb25zLiBJZiBpbnN0cnVjdGlvbiBpcyBhdmFpbGFibGUsIHRoZSB6OTkwIG1vZHVsZSB3aWxsIHJlZ2lzdGVyCi1pdHMgY3J5cHRvIGFsZ29yaXRobSBpbXBsZW1lbnRhdGlvbiAtPiB0aGUgbG9hZCBvZiB0aGUgc3RhbmRhcmQgbW9kdWxlIHdpbGwgZmFpbAotc2luY2UgdGhlIGFsZ29yaXRobSBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQuCi1JZiB6OTkwIGNyeXB0byBpbnN0cnVjdGlvbiBpcyBub3QgYXZhaWxhYmxlIHRoZSBsb2FkIG9mIHRoZSB6OTkwIG1vZHVsZSB3aWxsCi1mYWlsIC0+IHRoZSBzdGFuZGFyZCBtb2R1bGUgd2lsbCBsb2FkIGFuZCByZWdpc3RlciBpdHMgYWxnb3JpdGhtLgotCi0zLjIuIGR5bmFtaWMgbW9kdWxlcwotfn5+fn5+fn5+fn5+fn5+fn5+fn4KLUEgc3lzdGVtIGFkbWluaXN0cmF0b3IgaGFzIHRvIHRha2UgY2FyZSBvZiBnaXZpbmcgcHJlZmVyZW5jZSB0byB6OTkwIGNyeXB0bwotbW9kdWxlcy4gSWYgTVNBIGlzIGF2YWlsYWJsZSBhcHByb3ByaWF0ZSBsaW5lcyBoYXZlIHRvIGJlIGFkZGVkIHRvCi0vZXRjL21vZHByb2JlLmNvbmYuCi0KLUV4YW1wbGU6CXo5OTAgY3J5cHRvIGluc3RydWN0aW9uIGZvciBTSEExIGFsZ29yaXRobSBpcyBhdmFpbGFibGUKLQotCQlhZGQgdGhlIGZvbGxvd2luZyBsaW5lIHRvIC9ldGMvbW9kcHJvYmUuY29uZiAoYXNzdW1pbmcgdGhlCi0JCXo5OTAgY3J5cHRvIG1vZHVsZXMgZm9yIFNIQTEgaXMgY2FsbGVkIHNoYTFfejk5MCk6Ci0KLQkJYWxpYXMgc2hhMSBzaGExX3o5OTAKLQotCQktPiB3aGVuIHRoZSBzaGExIGFsZ29yaXRobSBpcyByZXF1ZXN0ZWQgdGhyb3VnaCB0aGUgY3J5cHRvIEFQSQotCQkod2hpY2ggaGFzIGEgbW9kdWxlIGF1dG9sb2FkZXIpIHRoZSB6OTkwIG1vZHVsZSB3aWxsIGJlIGxvYWRlZC4KLQotVEJEOglhIHVzZXJzcGFjZSBtb2R1bGUgcHJvYmluZyBtZWNoYW5pc20KLQlzb21ldGhpbmcgbGlrZSAncHJvYmUgc2hhMSBzaGExX3o5OTAgc2hhMScgaW4gbW9kcHJvYmUuY29uZgotCS0+IHRyeSBtb2R1bGUgc2hhMV96OTkwLCBpZiBpdCBmYWlscyB0byBsb2FkIHN0YW5kYXJkIG1vZHVsZSBzaGExCi0JdGhlICdwcm9iZScgc3RhdGVtZW50IGlzIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkIGluIG1vZHByb2JlLmNvbmYKLQotCi00LiBDdXJyZW50bHkgaW1wbGVtZW50ZWQgejk5MCBjcnlwdG8gYWxnb3JpdGhtcwotfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLVRoZSBmb2xsb3dpbmcgY3J5cHRvIGFsZ29yaXRobXMgd2l0aCB6OTkwIE1TQSBzdXBwb3J0IGFyZSBjdXJyZW50bHkgaW1wbGVtZW50ZWQuCi1UaGUgbmFtZSBvZiBlYWNoIGFsZ29yaXRobSB1bmRlciB3aGljaCBpdCBpcyByZWdpc3RlcmVkIGluIGNyeXB0byBBUEkgYW5kIHRoZQotbmFtZSBvZiB0aGUgcmVzcGVjdGl2ZSBtb2R1bGUgaXMgZ2l2ZW4gaW4gc3F1YXJlIGJyYWNrZXRzLgotCi0tIFNIQTEgRGlnZXN0IEFsZ29yaXRobSBbc2hhMSAtPiBzaGExX3o5OTBdCi0tIERFUyBFbmNyeXB0L0RlY3J5cHQgQWxnb3JpdGhtICg2NGJpdCBrZXkpIFtkZXMgLT4gZGVzX3o5OTBdCi0tIFRyaXBsZSBERVMgRW5jcnlwdC9EZWNyeXB0IEFsZ29yaXRobSAoMTI4Yml0IGtleSkgW2RlczNfZWRlMTI4IC0+IGRlc196OTkwXQotLSBUcmlwbGUgREVTIEVuY3J5cHQvRGVjcnlwdCBBbGdvcml0aG0gKDE5MmJpdCBrZXkpIFtkZXMzX2VkZSAtPiBkZXNfejk5MF0KLQotSW4gb3JkZXIgdG8gbG9hZCwgZm9yIGV4YW1wbGUsIHRoZSBzaGExX3o5OTAgbW9kdWxlIHdoZW4gdGhlIHNoYTEgYWxnb3JpdGhtIGlzCi1yZXF1ZXN0ZWQgKHNlZSAzLjIuKSBhZGQgJ2FsaWFzIHNoYTEgc2hhMV96OTkwJyB0byAvZXRjL21vZHByb2JlLmNvbmYuCi0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vczM5MC96ZmNwZHVtcC50eHQgYi9Eb2N1bWVudGF0aW9uL3MzOTAvemZjcGR1bXAudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNDVkMjcKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3MzOTAvemZjcGR1bXAudHh0CkBAIC0wLDAgKzEsODcgQEAKK3MzOTAgU0NTSSBkdW1wIHRvb2wgKHpmY3BkdW1wKQorCitTeXN0ZW0geiBtYWNoaW5lcyAoejkwMCBvciBoaWdoZXIpIHByb3ZpZGUgaGFyZHdhcmUgc3VwcG9ydCBmb3IgY3JlYXRpbmcgc3lzdGVtCitkdW1wcyBvbiBTQ1NJIGRpc2tzLiBUaGUgZHVtcCBwcm9jZXNzIGlzIGluaXRpYXRlZCBieSBib290aW5nIGEgZHVtcCB0b29sLCB3aGljaAoraGFzIHRvIGNyZWF0ZSBhIGR1bXAgb2YgdGhlIGN1cnJlbnQgKHByb2JhYmx5IGNyYXNoZWQpIExpbnV4IGltYWdlLiBJbiBvcmRlciB0bworbm90IG92ZXJ3cml0ZSBtZW1vcnkgb2YgdGhlIGNyYXNoZWQgTGludXggd2l0aCBkYXRhIG9mIHRoZSBkdW1wIHRvb2wsIHRoZQoraGFyZHdhcmUgc2F2ZXMgc29tZSBtZW1vcnkgcGx1cyB0aGUgcmVnaXN0ZXIgc2V0cyBvZiB0aGUgYm9vdCBjcHUgYmVmb3JlIHRoZQorZHVtcCB0b29sIGlzIGxvYWRlZC4gVGhlcmUgZXhpc3RzIGFuIFNDTFAgaGFyZHdhcmUgaW50ZXJmYWNlIHRvIG9idGFpbiB0aGUgc2F2ZWQKK21lbW9yeSBhZnRlcndhcmRzLiBDdXJyZW50bHkgMzIgTUIgYXJlIHNhdmVkLgorCitUaGlzIHpmY3BkdW1wIGltcGxlbWVudGF0aW9uIGNvbnNpc3RzIG9mIGEgTGludXggZHVtcCBrZXJuZWwgdG9nZXRoZXIgd2l0aAorYSB1c2Vyc3BhY2UgZHVtcCB0b29sLCB3aGljaCBhcmUgbG9hZGVkIHRvZ2V0aGVyIGludG8gdGhlIHNhdmVkIG1lbW9yeSByZWdpb24KK2JlbG93IDMyIE1CLiB6ZmNwZHVtcCBpcyBpbnN0YWxsZWQgb24gYSBTQ1NJIGRpc2sgdXNpbmcgemlwbCAoYXMgY29udGFpbmVkIGluCit0aGUgczM5MC10b29scyBwYWNrYWdlKSB0byBtYWtlIHRoZSBkZXZpY2UgYm9vdGFibGUuIFRoZSBvcGVyYXRvciBvZiBhIExpbnV4CitzeXN0ZW0gY2FuIHRoZW4gdHJpZ2dlciBhIFNDU0kgZHVtcCBieSBib290aW5nIHRoZSBTQ1NJIGRpc2ssIHdoZXJlIHpmY3BkdW1wCityZXNpZGVzIG9uLgorCitUaGUga2VybmVsIHBhcnQgb2YgemZjcGR1bXAgaXMgaW1wbGVtZW50ZWQgYXMgYSBkZWJ1Z2ZzIGZpbGUgdW5kZXIgInpjb3JlL21lbSIsCit3aGljaCBleHBvcnRzIG1lbW9yeSBhbmQgcmVnaXN0ZXJzIG9mIHRoZSBjcmFzaGVkIExpbnV4IGluIGFuIHMzOTAKK3N0YW5kYWxvbmUgZHVtcCBmb3JtYXQuIEl0IGNhbiBiZSB1c2VkIGluIHRoZSBzYW1lIHdheSBhcyBlLmcuIC9kZXYvbWVtLiBUaGUKK2R1bXAgZm9ybWF0IGRlZmluZXMgYSA0SyBoZWFkZXIgZm9sbG93ZWQgYnkgcGxhaW4gdW5jb21wcmVzc2VkIG1lbW9yeS4gVGhlCityZWdpc3RlciBzZXRzIGFyZSBzdG9yZWQgaW4gdGhlIHByZWZpeCBwYWdlcyBvZiB0aGUgcmVzcGVjdGl2ZSBjcHVzLiBUbyBidWlsZCBhCitkdW1wIGVuYWJsZWQga2VybmVsIHdpdGggdGhlIHpjb3JlIGRyaXZlciwgdGhlIGtlcm5lbCBjb25maWcgb3B0aW9uCitDT05GSUdfWkZDUERVTVAgaGFzIHRvIGJlIHNldC4gV2hlbiByZWFkaW5nIGZyb20gInpjb3JlL21lbSIsIHRoZSBwYXJ0IG9mCittZW1vcnksIHdoaWNoIGhhcyBiZWVuIHNhdmVkIGJ5IGhhcmR3YXJlIGlzIHJlYWQgYnkgdGhlIGRyaXZlciB2aWEgdGhlIFNDTFAKK2hhcmR3YXJlIGludGVyZmFjZS4gVGhlIHNlY29uZCBwYXJ0IGlzIGp1c3QgY29waWVkIGZyb20gdGhlIG5vbiBvdmVyd3JpdHRlbiByZWFsCittZW1vcnkuCisKK1RoZSB1c2Vyc3BhY2UgYXBwbGljYXRpb24gb2YgemZjcGR1bXAgY2FuIHJlc2lkZSBlLmcuIGluIGFuIGludGl0cmFtZnMgb3IgYW4KK2luaXRyZC4gSXQgcmVhZHMgZnJvbSB6Y29yZS9tZW0gYW5kIHdyaXRlcyB0aGUgc3lzdGVtIGR1bXAgdG8gYSBmaWxlIG9uIGEKK1NDU0kgZGlzay4KKworVG8gYnVpbGQgYSB6ZmNwZHVtcCBrZXJuZWwgdXNlIHRoZSBmb2xsb3dpbmcgc2V0dGluZ3MgaW4geW91ciBrZXJuZWwKK2NvbmZpZ3VyYXRpb246CisgKiBDT05GSUdfWkZDUERVTVA9eQorICogRW5hYmxlIFpGQ1AgZHJpdmVyCisgKiBFbmFibGUgU0NTSSBkcml2ZXIKKyAqIEVuYWJsZSBleHQyIGFuZCBleHQzIGZpbGVzeXN0ZW1zCisgKiBEaXNhYmxlIGFzIG1hbnkgZmVhdHVyZXMgYXMgcG9zc2libGUgdG8ga2VlcCB0aGUga2VybmVsIHNtYWxsLgorICAgRS5nLiBuZXR3b3JrIHN1cHBvcnQgaXMgbm90IG5lZWRlZCBhdCBhbGwuCisKK1RvIHVzZSB0aGUgemZjcGR1bXAgdXNlcnNwYWNlIGFwcGxpY2F0aW9uIGluIGFuIGluaXRyYW1mcyB5b3UgaGF2ZSB0byBkbyB0aGUKK2ZvbGxvd2luZzoKKworICogQ29weSB0aGUgemZjcGR1bXAgZXhlY3V0YWJsZSBzb21ld2hlcmUgaW50byB5b3VyIExpbnV4IHRyZWUuCisgICBFLmcuIHRvICJhcmNoL3MzOTAvYm9vdC96ZmNwZHVtcC4gSWYgeW91IGRvIG5vdCB3YW50IHRvIGluY2x1ZGUKKyAgIHNoYXJlZCBsaWJyYXJpZXMsIGNvbXBpbGUgdGhlIHRvb2wgd2l0aCB0aGUgIi1zdGF0aWMiIGdjYyBvcHRpb24uCisgKiBJZiB5b3Ugd2FudCB0byBpbmNsdWRlIGUyZnNjaywgYWRkIGl0IHRvIHlvdXIgc291cmNlIHRyZWUsIHRvby4gVGhlIHpmY3BkdW1wCisgICBhcHBsaWNhdGlvbiBhdHRlbXB0cyB0byBzdGFydCAvc2Jpbi9lMmZzY2sgZnJvbSB0aGUgcmFtZGlzay4KKyAqIFVzZSBhbiBpbml0cmFtZnMgY29uZmlnIGZpbGUgbGlrZSB0aGUgZm9sbG93aW5nOgorCisgICBkaXIgL2RldiA3NTUgMCAwCisgICBub2QgL2Rldi9jb25zb2xlIDY0NCAwIDAgYyA1IDEKKyAgIG5vZCAvZGV2L251bGwgNjQ0IDAgMCBjIDEgMworICAgbm9kIC9kZXYvc2RhMSA2NDQgMCAwIGIgOCAxCisgICBub2QgL2Rldi9zZGEyIDY0NCAwIDAgYiA4IDIKKyAgIG5vZCAvZGV2L3NkYTMgNjQ0IDAgMCBiIDggMworICAgbm9kIC9kZXYvc2RhNCA2NDQgMCAwIGIgOCA0CisgICBub2QgL2Rldi9zZGE1IDY0NCAwIDAgYiA4IDUKKyAgIG5vZCAvZGV2L3NkYTYgNjQ0IDAgMCBiIDggNgorICAgbm9kIC9kZXYvc2RhNyA2NDQgMCAwIGIgOCA3CisgICBub2QgL2Rldi9zZGE4IDY0NCAwIDAgYiA4IDgKKyAgIG5vZCAvZGV2L3NkYTkgNjQ0IDAgMCBiIDggOQorICAgbm9kIC9kZXYvc2RhMTAgNjQ0IDAgMCBiIDggMTAKKyAgIG5vZCAvZGV2L3NkYTExIDY0NCAwIDAgYiA4IDExCisgICBub2QgL2Rldi9zZGExMiA2NDQgMCAwIGIgOCAxMgorICAgbm9kIC9kZXYvc2RhMTMgNjQ0IDAgMCBiIDggMTMKKyAgIG5vZCAvZGV2L3NkYTE0IDY0NCAwIDAgYiA4IDE0CisgICBub2QgL2Rldi9zZGExNSA2NDQgMCAwIGIgOCAxNQorICAgZmlsZSAvaW5pdCBhcmNoL3MzOTAvYm9vdC96ZmNwZHVtcCA3NTUgMCAwCisgICBmaWxlIC9zYmluL2UyZnNjayBhcmNoL3MzOTAvYm9vdC9lMmZzY2sgNzU1IDAgMAorICAgZGlyIC9wcm9jIDc1NSAwIDAKKyAgIGRpciAvc3lzIDc1NSAwIDAKKyAgIGRpciAvbW50IDc1NSAwIDAKKyAgIGRpciAvc2JpbiA3NTUgMCAwCisKKyAqIElzc3VlICJtYWtlIGltYWdlIiB0byBidWlsZCB0aGUgemZjcGR1bXAgaW1hZ2Ugd2l0aCBpbml0cmFtZnMuCisKK0luIGEgTGludXggZGlzdHJpYnV0aW9uIHRoZSB6ZmNwZHVtcCBlbmFibGVkIGtlcm5lbCBpbWFnZSBtdXN0IGJlIGNvcGllZCB0bworL3Vzci9zaGFyZS96ZmNwZHVtcC96ZmNwZHVtcC5pbWFnZSwgd2hlcmUgdGhlIHMzOTAgemlwbCB0b29sIGlzIGxvb2tpbmcgZm9yIHRoZQorZHVtcCBrZXJuZWwgd2hlbiBwcmVwYXJpbmcgYSBTQ1NJIGR1bXAgZGlzay4KKworSWYgeW91IHVzZSBhIHJhbWRpc2sgY29weSBpdCB0byAiL3Vzci9zaGFyZS96ZmNwZHVtcC96ZmNwZHVtcC5yZCIuCisKK0ZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGhvdyB0byB1c2UgemZjcGR1bXAgcmVmZXIgdG8gdGhlIHMzOTAgJ1VzaW5nIHRoZSBEdW1wCitUb29scyBib29rJywgd2hpY2ggaXMgYXZhaWxhYmxlIGZyb20KK2h0dHA6Ly93d3cuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9saW51eC9saW51eDM5MC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc29ueS1sYXB0b3AudHh0IGIvRG9jdW1lbnRhdGlvbi9zb255LWxhcHRvcC50eHQKaW5kZXggZGZkMjZkZi4uN2E1YzFhOCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zb255LWxhcHRvcC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9zb255LWxhcHRvcC50eHQKQEAgLTMsMTIgKzMsMTggQEAKIAlDb3B5cmlnaHQgKEMpIDIwMDQtIDIwMDUgU3RlbGlhbiBQb3AgPHN0ZWxpYW5AcG9waWVzLm5ldD4KIAlDb3B5cmlnaHQgKEMpIDIwMDcgTWF0dGlhIERvbmdpbGkgPG1hbGF0dGlhQGxpbnV4Lml0PgogCi1UaGlzIG1pbmktZHJpdmVyIGRyaXZlcyB0aGUgU05DIGRldmljZSBwcmVzZW50IGluIHRoZSBBQ1BJIEJJT1Mgb2YKLXRoZSBTb255IFZhaW8gbGFwdG9wcy4KK1RoaXMgbWluaS1kcml2ZXIgZHJpdmVzIHRoZSBTTkMgYW5kIFNQSUMgZGV2aWNlIHByZXNlbnQgaW4gdGhlIEFDUEkgQklPUyBvZiB0aGUKK1NvbnkgVmFpbyBsYXB0b3BzLiBUaGlzIGRyaXZlciBtaXhlcyBib3RoIGRldmljZXMgZnVuY3Rpb25zIHVuZGVyIHRoZSBzYW1lCisoaG9wZWZ1bGx5IGNvbnNpc3RlbnQpIGludGVyZmFjZS4gVGhpcyBhbHNvIG1lYW5zIHRoYXQgdGhlIHNvbnlwaSBkcml2ZXIgaXMKK29ic29sZXRlZCBieSBzb255LWxhcHRvcCBub3cuCiAKLUl0IGdpdmVzIGFjY2VzcyB0byBzb21lIGV4dHJhIGxhcHRvcCBmdW5jdGlvbmFsaXRpZXMuIEluIGl0cyBjdXJyZW50Ci1mb3JtLCB0aGlzIGRyaXZlciBsZXQgdGhlIHVzZXIgc2V0IG9yIHF1ZXJ5IHRoZSBzY3JlZW4gYnJpZ2h0bmVzcwotdGhyb3VnaCB0aGUgYmFja2xpZ2h0IHN1YnN5c3RlbSBhbmQgcmVtb3ZlL2FwcGx5IHBvd2VyIHRvIHNvbWUgZGV2aWNlcy4KK0ZuIGtleXMgKGhvdGtleXMpOgorLS0tLS0tLS0tLS0tLS0tLS0tCitTb21lIG1vZGVscyByZXBvcnQgaG90a2V5cyB0aHJvdWdoIHRoZSBTTkMgb3IgU1BJQyBkZXZpY2VzLCBzdWNoIGV2ZW50cyBhcmUKK3JlcG9ydGVkIGJvdGggdGhyb3VnaCB0aGUgQUNQSSBzdWJzeXN0ZW0gYXMgYWNwaSBldmVudHMgYW5kIHRocm91Z2ggdGhlIElOUFVUCitzdWJzeXN0ZW0uIFNlZSB0aGUgbG9ncyBvZiBhY3BpZCBvciAvcHJvYy9hY3BpL2V2ZW50IGFuZAorL3Byb2MvYnVzL2lucHV0L2RldmljZXMgdG8gZmluZCBvdXQgd2hhdCB0aG9zZSBldmVudHMgYXJlIGFuZCB3aGljaCBpbnB1dAorZGV2aWNlcyBhcmUgY3JlYXRlZCBieSB0aGUgZHJpdmVyLgogCiBCYWNrbGlnaHQgY29udHJvbDoKIC0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMzksNiArNDUsOCBAQAogCWF1ZGlvcG93ZXIJCXBvd2VyIG9uL29mZiB0aGUgaW50ZXJuYWwgc291bmQgY2FyZAogCWxhbnBvd2VyCQlwb3dlciBvbi9vZmYgdGhlIGludGVybmFsIGV0aGVybmV0IGNhcmQKIAkJCQkob25seSBpbiBkZWJ1ZyBtb2RlKQorCWJsdWV0b290aHBvd2VyCQlwb3dlciBvbi9vZmYgdGhlIGludGVybmFsIGJsdWV0b290aCBkZXZpY2UKKwlmYW5zcGVlZAkJZ2V0L3NldCB0aGUgZmFuIHNwZWVkCiAKIE5vdGUgdGhhdCBzb21lIGZpbGVzIG1heSBiZSBtaXNzaW5nIGlmIHRoZXkgYXJlIG5vdCBzdXBwb3J0ZWQKIGJ5IHlvdXIgcGFydGljdWxhciBsYXB0b3AgbW9kZWwuCkBAIC03Niw5ICs4NCw5IEBACiBjdXJyZW50IG9uZXMgZm91bmQgb24gc2V2ZXJhbCBWYWlvIG1vZGVscyksIGFuIGVudHJ5IHVuZGVyCiAvc3lzL2RldmljZXMvcGxhdGZvcm0vc29ueS1sYXB0b3AsIGp1c3QgbGlrZSB0aGUgJ2NkcG93ZXInIG9uZS4KIFlvdSBjYW4gY3JlYXRlIG90aGVyIGVudHJpZXMgY29ycmVzcG9uZGluZyB0byB5b3VyIG93biBsYXB0b3AgbWV0aG9kcyBieQotZnVydGhlciBlZGl0aW5nIHRoZSBzb3VyY2UgKHNlZSB0aGUgJ3NvbnlfYWNwaV92YWx1ZXMnIHRhYmxlLCBhbmQgYWRkIGEgbmV3CitmdXJ0aGVyIGVkaXRpbmcgdGhlIHNvdXJjZSAoc2VlIHRoZSAnc29ueV9uY192YWx1ZXMnIHRhYmxlLCBhbmQgYWRkIGEgbmV3CiBlbnRyeSB0byB0aGlzIHRhYmxlIHdpdGggeW91ciBnZXQvc2V0IG1ldGhvZCBuYW1lcyB1c2luZyB0aGUKLUhBTkRMRV9OQU1FUyBtYWNybykuCitTTkNfSEFORExFX05BTUVTIG1hY3JvKS4KIAogWW91ciBtaXNzaW9uLCBzaG91bGQgeW91IGFjY2VwdCBpdCwgaXMgdG8gdHJ5IGZpbmRpbmcgb3V0IHdoYXQKIHRob3NlIGVudHJpZXMgYXJlIGZvciwgYnkgcmVhZGluZy93cml0aW5nIHJhbmRvbSB2YWx1ZXMgZnJvbS90byB0aG9zZQpAQCAtODcsNiArOTUsOSBAQAogU2hvdWxkIHlvdSBmaW5kIGFueXRoaW5nIGludGVyZXN0aW5nLCBwbGVhc2UgcmVwb3J0IGl0IGJhY2sgdG8gbWUsCiBJIHdpbGwgbm90IGRpc2F2b3cgYWxsIGtub3dsZWRnZSBvZiB5b3VyIGFjdGlvbnMgOikKIAorU2VlIGFsc28gaHR0cDovL3d3dy5saW51eC5pdC9+bWFsYXR0aWEvd2lraS9pbmRleC5waHAvU29ueV9kcml2ZXJzIGZvciBvdGhlcgordXNlZnVsIGluZm8uCisKIEJ1Z3MvTGltaXRhdGlvbnM6CiAtLS0tLS0tLS0tLS0tLS0tLQogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2libS1hY3BpLnR4dCBiL0RvY3VtZW50YXRpb24vdGhpbmtwYWQtYWNwaS50eHQKc2ltaWxhcml0eSBpbmRleCA2MCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9pYm0tYWNwaS50eHQKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vdGhpbmtwYWQtYWNwaS50eHQKaW5kZXggMDEzMmQzNi4uMmQ0ODAzMyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9pYm0tYWNwaS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi90aGlua3BhZC1hY3BpLnR4dApAQCAtMSwxNiArMSwyMiBAQAotCQkgICAgSUJNIFRoaW5rUGFkIEFDUEkgRXh0cmFzIERyaXZlcgorCQkgICAgIFRoaW5rUGFkIEFDUEkgRXh0cmFzIERyaXZlcgogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAwLjEyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAxNyBBdWd1c3QgMjAwNQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMC4xNAorICAgICAgICAgICAgICAgICAgICAgICAgICBBcHJpbCAyMXN0LCAyMDA3CiAKICAgICAgICAgICAgICAgIEJvcmlzbGF2IERlaWFub3YgPGJvcmlzbGF2QHVzZXJzLnNmLm5ldD4KKwkgICAgIEhlbnJpcXVlIGRlIE1vcmFlcyBIb2xzY2h1aCA8aG1oQGhtaC5lbmcuYnI+CiAJCSAgICAgIGh0dHA6Ly9pYm0tYWNwaS5zZi5uZXQvCiAKIAotVGhpcyBpcyBhIExpbnV4IEFDUEkgZHJpdmVyIGZvciB0aGUgSUJNIFRoaW5rUGFkIGxhcHRvcHMuIEl0IHN1cHBvcnRzCi12YXJpb3VzIGZlYXR1cmVzIG9mIHRoZXNlIGxhcHRvcHMgd2hpY2ggYXJlIGFjY2Vzc2libGUgdGhyb3VnaCB0aGUKLUFDUEkgZnJhbWV3b3JrIGJ1dCBub3Qgb3RoZXJ3aXNlIHN1cHBvcnRlZCBieSB0aGUgZ2VuZXJpYyBMaW51eCBBQ1BJCi1kcml2ZXJzLgorVGhpcyBpcyBhIExpbnV4IGRyaXZlciBmb3IgdGhlIElCTSBhbmQgTGVub3ZvIFRoaW5rUGFkIGxhcHRvcHMuIEl0CitzdXBwb3J0cyB2YXJpb3VzIGZlYXR1cmVzIG9mIHRoZXNlIGxhcHRvcHMgd2hpY2ggYXJlIGFjY2Vzc2libGUKK3Rocm91Z2ggdGhlIEFDUEkgYW5kIEFDUEkgRUMgZnJhbWV3b3JrLCBidXQgbm90IG90aGVyd2lzZSBmdWxseQorc3VwcG9ydGVkIGJ5IHRoZSBnZW5lcmljIExpbnV4IEFDUEkgZHJpdmVycy4KKworVGhpcyBkcml2ZXIgdXNlZCB0byBiZSBuYW1lZCBpYm0tYWNwaSB1bnRpbCBrZXJuZWwgMi42LjIxIGFuZCByZWxlYXNlCiswLjEzLTIwMDcwMzE0LiAgSXQgdXNlZCB0byBiZSBpbiB0aGUgZHJpdmVycy9hY3BpIHRyZWUsIGJ1dCBpdCB3YXMKK21vdmVkIHRvIHRoZSBkcml2ZXJzL21pc2MgdHJlZSBhbmQgcmVuYW1lZCB0byB0aGlua3BhZC1hY3BpIGZvciBrZXJuZWwKKzIuNi4yMiwgYW5kIHJlbGVhc2UgMC4xNC4KIAogCiBTdGF0dXMKQEAgLTIxLDcgKzI3LDcgQEAKIAogCS0gRm4ga2V5IGNvbWJpbmF0aW9ucwogCS0gQmx1ZXRvb3RoIGVuYWJsZSBhbmQgZGlzYWJsZQotCS0gdmlkZW8gb3V0cHV0IHN3aXRjaGluZywgZXhwYW5zaW9uIGNvbnRyb2wJCisJLSB2aWRlbyBvdXRwdXQgc3dpdGNoaW5nLCBleHBhbnNpb24gY29udHJvbAogCS0gVGhpbmtMaWdodCBvbiBhbmQgb2ZmCiAJLSBsaW1pdGVkIGRvY2tpbmcgYW5kIHVuZG9ja2luZwogCS0gVWx0cmFCYXkgZWplY3QKQEAgLTMyLDcgKzM4LDcgQEAKIAktIEV4cGVyaW1lbnRhbDogZW1iZWRkZWQgY29udHJvbGxlciByZWdpc3RlciBkdW1wCiAJLSBMQ0QgYnJpZ2h0bmVzcyBjb250cm9sCiAJLSBWb2x1bWUgY29udHJvbAotCS0gRXhwZXJpbWVudGFsOiBmYW4gc3BlZWQsIGZhbiBlbmFibGUvZGlzYWJsZQorCS0gRmFuIGNvbnRyb2wgYW5kIG1vbml0b3Jpbmc6IGZhbiBzcGVlZCwgZmFuIGVuYWJsZS9kaXNhYmxlCiAJLSBFeHBlcmltZW50YWw6IFdBTiBlbmFibGUgYW5kIGRpc2FibGUKIAogQSBjb21wYXRpYmlsaXR5IHRhYmxlIGJ5IG1vZGVsIGFuZCBmZWF0dXJlIGlzIG1haW50YWluZWQgb24gdGhlIHdlYgpAQCAtNDIsNiArNDgsOCBAQAogCiAJLSBUaGlua1BhZCBtb2RlbCBuYW1lCiAJLSBhIGNvcHkgb2YgeW91ciBEU0RULCBmcm9tIC9wcm9jL2FjcGkvZHNkdAorCS0gYSBjb3B5IG9mIHRoZSBvdXRwdXQgb2YgZG1pZGVjb2RlLCB3aXRoIHNlcmlhbCBudW1iZXJzCisJICBhbmQgVVVJRHMgbWFza2VkIG9mZgogCS0gd2hpY2ggZHJpdmVyIGZlYXR1cmVzIHdvcmsgYW5kIHdoaWNoIGRvbid0CiAJLSB0aGUgb2JzZXJ2ZWQgYmVoYXZpb3Igb2Ygbm9uLXdvcmtpbmcgZmVhdHVyZXMKIApAQCAtNTIsMjUgKzYwLDg1IEBACiAtLS0tLS0tLS0tLS0KIAogSWYgeW91IGFyZSBjb21waWxpbmcgdGhpcyBkcml2ZXIgYXMgaW5jbHVkZWQgaW4gdGhlIExpbnV4IGtlcm5lbAotc291cmNlcywgc2ltcGx5IGVuYWJsZSB0aGUgQ09ORklHX0FDUElfSUJNIG9wdGlvbiAoUG93ZXIgTWFuYWdlbWVudCAvCi1BQ1BJIC8gSUJNIFRoaW5rUGFkIExhcHRvcCBFeHRyYXMpLgorc291cmNlcywgc2ltcGx5IGVuYWJsZSB0aGUgQ09ORklHX1RISU5LUEFEX0FDUEkgb3B0aW9uLCBhbmQgb3B0aW9uYWxseQorZW5hYmxlIHRoZSBDT05GSUdfVEhJTktQQURfQUNQSV9CQVkgb3B0aW9uIGlmIHlvdSB3YW50IHRoZQordGhpbmtwYWQtc3BlY2lmaWMgYmF5IGZ1bmN0aW9uYWxpdHkuCiAKIEZlYXR1cmVzCiAtLS0tLS0tLQogCi1UaGUgZHJpdmVyIGNyZWF0ZXMgdGhlIC9wcm9jL2FjcGkvaWJtIGRpcmVjdG9yeS4gVGhlcmUgaXMgYSBmaWxlIHVuZGVyCi10aGF0IGRpcmVjdG9yeSBmb3IgZWFjaCBmZWF0dXJlIGRlc2NyaWJlZCBiZWxvdy4gTm90ZSB0aGF0IHdoaWxlIHRoZQotZHJpdmVyIGlzIHN0aWxsIGluIHRoZSBhbHBoYSBzdGFnZSwgdGhlIGV4YWN0IHByb2MgZmlsZSBmb3JtYXQgYW5kCi1jb21tYW5kcyBzdXBwb3J0ZWQgYnkgdGhlIHZhcmlvdXMgZmVhdHVyZXMgaXMgZ3VhcmFudGVlZCB0byBjaGFuZ2UKLWZyZXF1ZW50bHkuCitUaGUgZHJpdmVyIGV4cG9ydHMgdHdvIGRpZmZlcmVudCBpbnRlcmZhY2VzIHRvIHVzZXJzcGFjZSwgd2hpY2ggY2FuIGJlCit1c2VkIHRvIGFjY2VzcyB0aGUgZmVhdHVyZXMgaXQgcHJvdmlkZXMuICBPbmUgaXMgYSBsZWdhY3kgcHJvY2ZzLWJhc2VkCitpbnRlcmZhY2UsIHdoaWNoIHdpbGwgYmUgcmVtb3ZlZCBhdCBzb21lIHRpbWUgaW4gdGhlIGRpc3RhbnQgZnV0dXJlLgorVGhlIG90aGVyIGlzIGEgbmV3IHN5c2ZzLWJhc2VkIGludGVyZmFjZSB3aGljaCBpcyBub3QgY29tcGxldGUgeWV0LgogCi1Ecml2ZXIgdmVyc2lvbiAtLSAvcHJvYy9hY3BpL2libS9kcml2ZXIKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVGhlIHByb2NmcyBpbnRlcmZhY2UgY3JlYXRlcyB0aGUgL3Byb2MvYWNwaS9pYm0gZGlyZWN0b3J5LiAgVGhlcmUgaXMgYQorZmlsZSB1bmRlciB0aGF0IGRpcmVjdG9yeSBmb3IgZWFjaCBmZWF0dXJlIGl0IHN1cHBvcnRzLiAgVGhlIHByb2NmcworaW50ZXJmYWNlIGlzIG1vc3RseSBmcm96ZW4sIGFuZCB3aWxsIGNoYW5nZSB2ZXJ5IGxpdHRsZSBpZiBhdCBhbGw6IGl0Cit3aWxsIG5vdCBiZSBleHRlbmRlZCB0byBhZGQgYW55IG5ldyBmdW5jdGlvbmFsaXR5IGluIHRoZSBkcml2ZXIsIGluc3RlYWQKK2FsbCBuZXcgZnVuY3Rpb25hbGl0eSB3aWxsIGJlIGltcGxlbWVudGVkIG9uIHRoZSBzeXNmcyBpbnRlcmZhY2UuCisKK1RoZSBzeXNmcyBpbnRlcmZhY2UgdHJpZXMgdG8gYmxlbmQgaW4gdGhlIGdlbmVyaWMgTGludXggc3lzZnMgc3Vic3lzdGVtcworYW5kIGNsYXNzZXMgYXMgbXVjaCBhcyBwb3NzaWJsZS4gIFNpbmNlIHNvbWUgb2YgdGhlc2Ugc3Vic3lzdGVtcyBhcmUgbm90Cit5ZXQgcmVhZHkgb3Igc3RhYmlsaXplZCwgaXQgaXMgZXhwZWN0ZWQgdGhhdCB0aGlzIGludGVyZmFjZSB3aWxsIGNoYW5nZSwKK2FuZCBhbnkgYW5kIGFsbCB1c2Vyc3BhY2UgcHJvZ3JhbXMgbXVzdCBkZWFsIHdpdGggaXQuCisKKworTm90ZXMgYWJvdXQgdGhlIHN5c2ZzIGludGVyZmFjZToKKworVW5saWtlIHdoYXQgd2FzIGRvbmUgd2l0aCB0aGUgcHJvY2ZzIGludGVyZmFjZSwgY29ycmVjdG5lc3Mgd2hlbiB0YWxraW5nCit0byB0aGUgc3lzZnMgaW50ZXJmYWNlcyB3aWxsIGJlIGVuZm9yY2VkLCBhcyB3aWxsIGNvcnJlY3RuZXNzIGluIHRoZQordGhpbmtwYWQtYWNwaSdzIGltcGxlbWVudGF0aW9uIG9mIHN5c2ZzIGludGVyZmFjZXMuCisKK0Fsc28sIGFueSBidWdzIGluIHRoZSB0aGlua3BhZC1hY3BpIHN5c2ZzIGRyaXZlciBjb2RlIG9yIGluIHRoZQordGhpbmtwYWQtYWNwaSdzIGltcGxlbWVudGF0aW9uIG9mIHRoZSBzeXNmcyBpbnRlcmZhY2VzIHdpbGwgYmUgZml4ZWQgZm9yCittYXhpbXVtIGNvcnJlY3RuZXNzLCBldmVuIGlmIHRoYXQgbWVhbnMgY2hhbmdpbmcgYW4gaW50ZXJmYWNlIGluCitub24tY29tcGF0aWJsZSB3YXlzLiAgQXMgdGhlc2UgaW50ZXJmYWNlcyBtYXR1cmUgYm90aCBpbiB0aGUga2VybmVsIGFuZAoraW4gdGhpbmtwYWQtYWNwaSwgc3VjaCBjaGFuZ2VzIHNob3VsZCBiZWNvbWUgcXVpdGUgcmFyZS4KKworQXBwbGljYXRpb25zIGludGVyZmFjaW5nIHRvIHRoZSB0aGlua3BhZC1hY3BpIHN5c2ZzIGludGVyZmFjZXMgbXVzdAorZm9sbG93IGFsbCBzeXNmcyBndWlkZWxpbmVzIGFuZCBjb3JyZWN0bHkgcHJvY2VzcyBhbGwgZXJyb3JzICh0aGUgc3lzZnMKK2ludGVyZmFjZSBtYWtlcyBleHRlbnNpdmUgdXNlIG9mIGVycm9ycykuICBGaWxlIGRlc2NyaXB0b3JzIGFuZCBvcGVuIC8KK2Nsb3NlIG9wZXJhdGlvbnMgdG8gdGhlIHN5c2ZzIGlub2RlcyBtdXN0IGFsc28gYmUgcHJvcGVybHkgaW1wbGVtZW50ZWQuCisKK1RoZSB2ZXJzaW9uIG9mIHRoaW5rcGFkLWFjcGkncyBzeXNmcyBpbnRlcmZhY2UgaXMgZXhwb3J0ZWQgYnkgdGhlIGRyaXZlcgorYXMgYSBkcml2ZXIgYXR0cmlidXRlIChzZWUgYmVsb3cpLgorCitTeXNmcyBkcml2ZXIgYXR0cmlidXRlcyBhcmUgb24gdGhlIGRyaXZlcidzIHN5c2ZzIGF0dHJpYnV0ZSBzcGFjZSwKK2ZvciAyLjYuMjAgdGhpcyBpcyAvc3lzL2J1cy9wbGF0Zm9ybS9kcml2ZXJzL3RoaW5rcGFkLWFjcGkvLgorCitTeXNmcyBkZXZpY2UgYXR0cmlidXRlcyBhcmUgb24gdGhlIGRyaXZlcidzIHN5c2ZzIGF0dHJpYnV0ZSBzcGFjZSwKK2ZvciAyLjYuMjAgdGhpcyBpcyAvc3lzL2RldmljZXMvcGxhdGZvcm0vdGhpbmtwYWQtYWNwaS8uCisKK0RyaXZlciB2ZXJzaW9uCistLS0tLS0tLS0tLS0tLQorCitwcm9jZnM6IC9wcm9jL2FjcGkvaWJtL2RyaXZlcgorc3lzZnMgZHJpdmVyIGF0dHJpYnV0ZTogdmVyc2lvbgogCiBUaGUgZHJpdmVyIG5hbWUgYW5kIHZlcnNpb24uIE5vIGNvbW1hbmRzIGNhbiBiZSB3cml0dGVuIHRvIHRoaXMgZmlsZS4KIAotSG90IGtleXMgLS0gL3Byb2MvYWNwaS9pYm0vaG90a2V5Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1N5c2ZzIGludGVyZmFjZSB2ZXJzaW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzeXNmcyBkcml2ZXIgYXR0cmlidXRlOiBpbnRlcmZhY2VfdmVyc2lvbgorCitWZXJzaW9uIG9mIHRoZSB0aGlua3BhZC1hY3BpIHN5c2ZzIGludGVyZmFjZSwgYXMgYW4gdW5zaWduZWQgbG9uZworKG91dHB1dCBpbiBoZXggZm9ybWF0OiAweEFBQUFCQkNDKSwgd2hlcmU6CisJQUFBQSAtIG1ham9yIHJldmlzaW9uCisJQkIgLSBtaW5vciByZXZpc2lvbgorCUNDIC0gYnVnZml4IHJldmlzaW9uCisKK1RoZSBzeXNmcyBpbnRlcmZhY2UgdmVyc2lvbiBjaGFuZ2Vsb2cgZm9yIHRoZSBkcml2ZXIgY2FuIGJlIGZvdW5kIGF0IHRoZQorZW5kIG9mIHRoaXMgZG9jdW1lbnQuICBDaGFuZ2VzIHRvIHRoZSBzeXNmcyBpbnRlcmZhY2UgZG9uZSBieSB0aGUga2VybmVsCitzdWJzeXN0ZW1zIGFyZSBub3QgZG9jdW1lbnRlZCBoZXJlLCBub3IgYXJlIHRoZXkgdHJhY2tlZCBieSB0aGlzCithdHRyaWJ1dGUuCisKK0hvdCBrZXlzCistLS0tLS0tLQorCitwcm9jZnM6IC9wcm9jL2FjcGkvaWJtL2hvdGtleQorc3lzZnMgZGV2aWNlIGF0dHJpYnV0ZTogaG90a2V5LyoKIAogV2l0aG91dCB0aGlzIGRyaXZlciwgb25seSB0aGUgRm4tRjQga2V5IChzbGVlcCBidXR0b24pIGdlbmVyYXRlcyBhbgogQUNQSSBldmVudC4gV2l0aCB0aGUgZHJpdmVyIGxvYWRlZCwgdGhlIGhvdGtleSBmZWF0dXJlIGVuYWJsZWQgYW5kIHRoZQpAQCAtODQsMTUgKzE1Miw2IEBACiBhZGRpdGlvbiwgdGhlIGxpZCBtaWNyb3N3aXRjaCBhbmQgc29tZSBkb2NraW5nIHN0YXRpb24gYnV0dG9ucyBtYXkKIGFsc28gZ2VuZXJhdGUgc3VjaCBldmVudHMuCiAKLVRoZSBmb2xsb3dpbmcgY29tbWFuZHMgY2FuIGJlIHdyaXR0ZW4gdG8gdGhpcyBmaWxlOgotCi0JZWNobyBlbmFibGUgPiAvcHJvYy9hY3BpL2libS9ob3RrZXkgLS0gZW5hYmxlIHRoZSBob3Qga2V5cyBmZWF0dXJlCi0JZWNobyBkaXNhYmxlID4gL3Byb2MvYWNwaS9pYm0vaG90a2V5IC0tIGRpc2FibGUgdGhlIGhvdCBrZXlzIGZlYXR1cmUKLQllY2hvIDB4ZmZmZiA+IC9wcm9jL2FjcGkvaWJtL2hvdGtleSAtLSBlbmFibGUgYWxsIHBvc3NpYmxlIGhvdCBrZXlzCi0JZWNobyAweDAwMDAgPiAvcHJvYy9hY3BpL2libS9ob3RrZXkgLS0gZGlzYWJsZSBhbGwgcG9zc2libGUgaG90IGtleXMKLQkuLi4gYW55IG90aGVyIDQtaGV4LWRpZ2l0IG1hc2sgLi4uCi0JZWNobyByZXNldCA+IC9wcm9jL2FjcGkvaWJtL2hvdGtleSAtLSByZXN0b3JlIHRoZSBvcmlnaW5hbCBtYXNrCi0KIFRoZSBiaXQgbWFzayBhbGxvd3Mgc29tZSBjb250cm9sIG92ZXIgd2hpY2ggaG90IGtleXMgZ2VuZXJhdGUgQUNQSQogZXZlbnRzLiBOb3QgYWxsIGJpdHMgaW4gdGhlIG1hc2sgY2FuIGJlIG1vZGlmaWVkLiBOb3QgYWxsIGJpdHMgdGhhdAogY2FuIGJlIG1vZGlmaWVkIGRvIGFueXRoaW5nLiBOb3QgYWxsIGhvdCBrZXlzIGNhbiBiZSBpbmRpdmlkdWFsbHkKQEAgLTEyNCwxNSArMTgzLDc3IEBACiBiZSB1c2VkIHRocm91Z2ggdGhlICJUaGlua1BhZCBCdXR0b25zIiB1dGlsaXR5LCBzZWUKIGh0dHA6Ly93d3cubm9uZ251Lm9yZy90cGIvCiAKLUJsdWV0b290aCAtLSAvcHJvYy9hY3BpL2libS9ibHVldG9vdGgKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3Byb2NmcyBub3RlczoKIAotVGhpcyBmZWF0dXJlIHNob3dzIHRoZSBwcmVzZW5jZSBhbmQgY3VycmVudCBzdGF0ZSBvZiBhIEJsdWV0b290aAotZGV2aWNlLiBJZiBCbHVldG9vdGggaXMgaW5zdGFsbGVkLCB0aGUgZm9sbG93aW5nIGNvbW1hbmRzIGNhbiBiZSB1c2VkOgorVGhlIGZvbGxvd2luZyBjb21tYW5kcyBjYW4gYmUgd3JpdHRlbiB0byB0aGUgL3Byb2MvYWNwaS9pYm0vaG90a2V5IGZpbGU6CisKKwllY2hvIGVuYWJsZSA+IC9wcm9jL2FjcGkvaWJtL2hvdGtleSAtLSBlbmFibGUgdGhlIGhvdCBrZXlzIGZlYXR1cmUKKwllY2hvIGRpc2FibGUgPiAvcHJvYy9hY3BpL2libS9ob3RrZXkgLS0gZGlzYWJsZSB0aGUgaG90IGtleXMgZmVhdHVyZQorCWVjaG8gMHhmZmZmID4gL3Byb2MvYWNwaS9pYm0vaG90a2V5IC0tIGVuYWJsZSBhbGwgcG9zc2libGUgaG90IGtleXMKKwllY2hvIDB4MDAwMCA+IC9wcm9jL2FjcGkvaWJtL2hvdGtleSAtLSBkaXNhYmxlIGFsbCBwb3NzaWJsZSBob3Qga2V5cworCS4uLiBhbnkgb3RoZXIgNC1oZXgtZGlnaXQgbWFzayAuLi4KKwllY2hvIHJlc2V0ID4gL3Byb2MvYWNwaS9pYm0vaG90a2V5IC0tIHJlc3RvcmUgdGhlIG9yaWdpbmFsIG1hc2sKKworc3lzZnMgbm90ZXM6CisKKwlUaGUgaG90IGtleXMgYXR0cmlidXRlcyBhcmUgaW4gYSBob3RrZXkvIHN1YmRpcmVjdG9yeSBvZmYgdGhlCisJdGhpbmtwYWQgZGV2aWNlLgorCisJYmlvc19lbmFibGVkOgorCQlSZXR1cm5zIHRoZSBzdGF0dXMgb2YgdGhlIGhvdCBrZXlzIGZlYXR1cmUgd2hlbgorCQl0aGlua3BhZC1hY3BpIHdhcyBsb2FkZWQuICBVcG9uIG1vZHVsZSB1bmxvYWQsIHRoZSBob3QKKwkJa2V5IGZlYXR1cmUgc3RhdHVzIHdpbGwgYmUgcmVzdG9yZWQgdG8gdGhpcyB2YWx1ZS4KKworCQkwOiBob3Qga2V5cyB3ZXJlIGRpc2FibGVkCisJCTE6IGhvdCBrZXlzIHdlcmUgZW5hYmxlZAorCisJYmlvc19tYXNrOgorCQlSZXR1cm5zIHRoZSBob3Qga2V5cyBtYXNrIHdoZW4gdGhpbmtwYWQtYWNwaSB3YXMgbG9hZGVkLgorCQlVcG9uIG1vZHVsZSB1bmxvYWQsIHRoZSBob3Qga2V5cyBtYXNrIHdpbGwgYmUgcmVzdG9yZWQKKwkJdG8gdGhpcyB2YWx1ZS4KKworCWVuYWJsZToKKwkJRW5hYmxlcy9kaXNhYmxlcyB0aGUgaG90IGtleXMgZmVhdHVyZSwgYW5kIHJlcG9ydHMKKwkJY3VycmVudCBzdGF0dXMgb2YgdGhlIGhvdCBrZXlzIGZlYXR1cmUuCisKKwkJMDogZGlzYWJsZXMgdGhlIGhvdCBrZXlzIGZlYXR1cmUgLyBmZWF0dXJlIGRpc2FibGVkCisJCTE6IGVuYWJsZXMgdGhlIGhvdCBrZXlzIGZlYXR1cmUgLyBmZWF0dXJlIGVuYWJsZWQKKworCW1hc2s6CisJCWJpdCBtYXNrIHRvIGVuYWJsZSBBQ1BJIGV2ZW50IGdlbmVyYXRpb24gZm9yIGVhY2ggaG90CisJCWtleSAoc2VlIGFib3ZlKS4gIFJldHVybnMgdGhlIGN1cnJlbnQgc3RhdHVzIG9mIHRoZSBob3QKKwkJa2V5cyBtYXNrLCBhbmQgYWxsb3dzIG9uZSB0byBtb2RpZnkgaXQuCisKKworQmx1ZXRvb3RoCistLS0tLS0tLS0KKworcHJvY2ZzOiAvcHJvYy9hY3BpL2libS9ibHVldG9vdGgKK3N5c2ZzIGRldmljZSBhdHRyaWJ1dGU6IGJsdWV0b290aC9lbmFibGUKKworVGhpcyBmZWF0dXJlIHNob3dzIHRoZSBwcmVzZW5jZSBhbmQgY3VycmVudCBzdGF0ZSBvZiBhIFRoaW5rUGFkCitCbHVldG9vdGggZGV2aWNlIGluIHRoZSBpbnRlcm5hbCBUaGlua1BhZCBDREMgc2xvdC4KKworUHJvY2ZzIG5vdGVzOgorCitJZiBCbHVldG9vdGggaXMgaW5zdGFsbGVkLCB0aGUgZm9sbG93aW5nIGNvbW1hbmRzIGNhbiBiZSB1c2VkOgogCiAJZWNobyBlbmFibGUgPiAvcHJvYy9hY3BpL2libS9ibHVldG9vdGgKIAllY2hvIGRpc2FibGUgPiAvcHJvYy9hY3BpL2libS9ibHVldG9vdGgKIAorU3lzZnMgbm90ZXM6CisKKwlJZiB0aGUgQmx1ZXRvb3RoIENEQyBjYXJkIGlzIGluc3RhbGxlZCwgaXQgY2FuIGJlIGVuYWJsZWQgLworCWRpc2FibGVkIHRocm91Z2ggdGhlICJibHVldG9vdGgvZW5hYmxlIiB0aGlua3BhZC1hY3BpIGRldmljZQorCWF0dHJpYnV0ZSwgYW5kIGl0cyBjdXJyZW50IHN0YXR1cyBjYW4gYWxzbyBiZSBxdWVyaWVkLgorCisJZW5hYmxlOgorCQkwOiBkaXNhYmxlcyBCbHVldG9vdGggLyBCbHVldG9vdGggaXMgZGlzYWJsZWQKKwkJMTogZW5hYmxlcyBCbHVldG9vdGggLyBCbHVldG9vdGggaXMgZW5hYmxlZC4KKworCU5vdGU6IHRoaXMgaW50ZXJmYWNlIHdpbGwgYmUgcHJvYmFibHkgYmUgc3VwZXJzZWVkZWQgYnkgdGhlCisJZ2VuZXJpYyByZmtpbGwgY2xhc3MuCisKIFZpZGVvIG91dHB1dCBjb250cm9sIC0tIC9wcm9jL2FjcGkvaWJtL3ZpZGVvCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC0yMDksNyArMzMwLDcgQEAKIGJvb3RlZCB3aGlsZSBub3QgaW4gdGhlIGRvY2ssIHRoZSBmb2xsb3dpbmcgbWVzc2FnZSBpcyBzaG93biBpbiB0aGUKIGxvZ3M6CiAKLQlNYXIgMTcgMDE6NDI6MzQgYWVybyBrZXJuZWw6IGlibV9hY3BpOiBkb2NrIGRldmljZSBub3QgcHJlc2VudAorCU1hciAxNyAwMTo0MjozNCBhZXJvIGtlcm5lbDogdGhpbmtwYWRfYWNwaTogZG9jayBkZXZpY2Ugbm90IHByZXNlbnQKIAogSW4gdGhpcyBjYXNlLCBubyBkb2NrLXJlbGF0ZWQgZXZlbnRzIGFyZSBnZW5lcmF0ZWQgYnV0IHRoZSBkb2NrIGFuZAogdW5kb2NrIGNvbW1hbmRzIGRlc2NyaWJlZCBiZWxvdyBzdGlsbCB3b3JrLiBUaGV5IGNhbiBiZSBleGVjdXRlZApAQCAtMjY5LDcgKzM5MCw3IEBACiBpbiB0aGUgTGludXggQUNQSSBmcmFtZXdvcmsuIElmIHRoZSBsYXB0b3Agd2FzIGJvb3RlZCB3aXRob3V0IHRoZQogVWx0cmFCYXksIHRoZSBmb2xsb3dpbmcgbWVzc2FnZSBpcyBzaG93biBpbiB0aGUgbG9nczoKIAotCU1hciAxNyAwMTo0MjozNCBhZXJvIGtlcm5lbDogaWJtX2FjcGk6IGJheSBkZXZpY2Ugbm90IHByZXNlbnQKKwlNYXIgMTcgMDE6NDI6MzQgYWVybyBrZXJuZWw6IHRoaW5rcGFkX2FjcGk6IGJheSBkZXZpY2Ugbm90IHByZXNlbnQKIAogSW4gdGhpcyBjYXNlLCBubyBiYXktcmVsYXRlZCBldmVudHMgYXJlIGdlbmVyYXRlZCBidXQgdGhlIGVqZWN0CiBjb21tYW5kIGRlc2NyaWJlZCBiZWxvdyBzdGlsbCB3b3Jrcy4gSXQgY2FuIGJlIGV4ZWN1dGVkIG1hbnVhbGx5IG9yCkBAIC0zMTMsMjMgKzQzNCwxOSBAQAogTm90ZTogdGhlIFVsdHJhQmF5IGVqZWN0IHN1cHBvcnQgb24gdGhlIDYwMGUveCwgQTIycCBhbmQgQTN4IGlzCiBFWFBFUklNRU5UQUwgYW5kIG1heSBub3Qgd29yayBhcyBleHBlY3RlZC4gVVNFIFdJVEggQ0FVVElPTiEKIAotQ01PUyBjb250cm9sIC0tIC9wcm9jL2FjcGkvaWJtL2Ntb3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitDTU9TIGNvbnRyb2wKKy0tLS0tLS0tLS0tLQorCitwcm9jZnM6IC9wcm9jL2FjcGkvaWJtL2Ntb3MKK3N5c2ZzIGRldmljZSBhdHRyaWJ1dGU6IGNtb3NfY29tbWFuZAogCiBUaGlzIGZlYXR1cmUgaXMgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBBQ1BJIGZpcm13YXJlIHRvIGNvbnRyb2wgdGhlCiBUaGlua0xpZ2h0IG9uIG1vc3QgbmV3ZXIgVGhpbmtQYWQgbW9kZWxzLiBJdCBtYXkgYWxzbyBjb250cm9sIExDRAogYnJpZ2h0bmVzcywgc291bmRzIHZvbHVtZSBhbmQgbW9yZSwgYnV0IG9ubHkgb24gc29tZSBtb2RlbHMuCiAKLVRoZSBjb21tYW5kcyBhcmUgbm9uLW5lZ2F0aXZlIGludGVnZXIgbnVtYmVyczoKLQotCWVjaG8gMCA+L3Byb2MvYWNwaS9pYm0vY21vcwotCWVjaG8gMSA+L3Byb2MvYWNwaS9pYm0vY21vcwotCWVjaG8gMiA+L3Byb2MvYWNwaS9pYm0vY21vcwotCS4uLgotCi1UaGUgcmFuZ2Ugb2YgdmFsaWQgbnVtYmVycyBpcyAwIHRvIDIxLCBidXQgbm90IGFsbCBoYXZlIGFuIGVmZmVjdCBhbmQKLXRoZSBiZWhhdmlvciB2YXJpZXMgZnJvbSBtb2RlbCB0byBtb2RlbC4gSGVyZSBpcyB0aGUgYmVoYXZpb3Igb24gdGhlCi1YNDAgKHRwYiBpcyB0aGUgVGhpbmtQYWQgQnV0dG9ucyB1dGlsaXR5KToKK1RoZSByYW5nZSBvZiB2YWxpZCBjbW9zIGNvbW1hbmQgbnVtYmVycyBpcyAwIHRvIDIxLCBidXQgbm90IGFsbCBoYXZlIGFuCitlZmZlY3QgYW5kIHRoZSBiZWhhdmlvciB2YXJpZXMgZnJvbSBtb2RlbCB0byBtb2RlbC4gIEhlcmUgaXMgdGhlIGJlaGF2aW9yCitvbiB0aGUgWDQwICh0cGIgaXMgdGhlIFRoaW5rUGFkIEJ1dHRvbnMgdXRpbGl0eSk6CiAKIAkwIC0gbm8gZWZmZWN0IGJ1dCB0cGIgcmVwb3J0cyAiVm9sdW1lIGRvd24iCiAJMSAtIG5vIGVmZmVjdCBidXQgdHBiIHJlcG9ydHMgIlZvbHVtZSB1cCIKQEAgLTM0Miw2ICs0NTksOSBAQAogCTEzIC0gVGhpbmtMaWdodCBvZmYKIAkxNCAtIG5vIGVmZmVjdCBidXQgdHBiIHJlcG9ydHMgVGhpbmtMaWdodCBzdGF0dXMgY2hhbmdlCiAKK1RoZSBjbW9zIGNvbW1hbmQgaW50ZXJmYWNlIGlzIHByb25lIHRvIGZpcm13YXJlIHNwbGl0LWJyYWluIHByb2JsZW1zLCBhcworaW4gbmV3ZXIgVGhpbmtQYWRzIGl0IGlzIGp1c3QgYSBjb21wYXRpYmlsaXR5IGxheWVyLgorCiBMRUQgY29udHJvbCAtLSAvcHJvYy9hY3BpL2libS9sZWQKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC0zOTMsMTcgKzUxMywxNyBAQAogCTE2IC0gb25lIG1lZGl1bS1waXRjaGVkIGJlZXAgcmVwZWF0aW5nIGNvbnN0YW50bHksIHN0b3Agd2l0aCAxNwogCTE3IC0gc3RvcCAxNgogCi1UZW1wZXJhdHVyZSBzZW5zb3JzIC0tIC9wcm9jL2FjcGkvaWJtL3RoZXJtYWwKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVGVtcGVyYXR1cmUgc2Vuc29ycworLS0tLS0tLS0tLS0tLS0tLS0tLQorCitwcm9jZnM6IC9wcm9jL2FjcGkvaWJtL3RoZXJtYWwKK3N5c2ZzIGRldmljZSBhdHRyaWJ1dGVzOiAoaHdtb24pIHRlbXAqX2lucHV0CiAKIE1vc3QgVGhpbmtQYWRzIGluY2x1ZGUgc2l4IG9yIG1vcmUgc2VwYXJhdGUgdGVtcGVyYXR1cmUgc2Vuc29ycyBidXQKIG9ubHkgZXhwb3NlIHRoZSBDUFUgdGVtcGVyYXR1cmUgdGhyb3VnaCB0aGUgc3RhbmRhcmQgQUNQSSBtZXRob2RzLgogVGhpcyBmZWF0dXJlIHNob3dzIHJlYWRpbmdzIGZyb20gdXAgdG8gZWlnaHQgZGlmZmVyZW50IHNlbnNvcnMgb24gb2xkZXIKIFRoaW5rUGFkcywgYW5kIGl0IGhhcyBleHBlcmltZW50YWwgc3VwcG9ydCBmb3IgdXAgdG8gc2l4dGVlbiBkaWZmZXJlbnQKLXNlbnNvcnMgb24gbmV3ZXIgVGhpbmtQYWRzLiAgUmVhZGluZ3MgZnJvbSBzZW5zb3JzIHRoYXQgYXJlIG5vdCBhdmFpbGFibGUKLXJldHVybiAtMTI4LgotCi1ObyBjb21tYW5kcyBjYW4gYmUgd3JpdHRlbiB0byB0aGlzIGZpbGUuCitzZW5zb3JzIG9uIG5ld2VyIFRoaW5rUGFkcy4KIAogRVhQRVJJTUVOVEFMOiBUaGUgMTYtc2Vuc29ycyBmZWF0dXJlIGlzIG1hcmtlZCBFWFBFUklNRU5UQUwgYmVjYXVzZSB0aGUKIGltcGxlbWVudGF0aW9uIGRpcmVjdGx5IGFjY2Vzc2VzIGhhcmR3YXJlIHJlZ2lzdGVycyBhbmQgbWF5IG5vdCB3b3JrIGFzCkBAIC00NjAsNiArNTgwLDIwIEBACiA4OiAgQmF5IEJhdHRlcnk6IHNlY29uZGFyeSBzZW5zb3IKIAogCitQcm9jZnMgbm90ZXM6CisJUmVhZGluZ3MgZnJvbSBzZW5zb3JzIHRoYXQgYXJlIG5vdCBhdmFpbGFibGUgcmV0dXJuIC0xMjguCisJTm8gY29tbWFuZHMgY2FuIGJlIHdyaXR0ZW4gdG8gdGhpcyBmaWxlLgorCitTeXNmcyBub3RlczoKKwlTZW5zb3JzIHRoYXQgYXJlIG5vdCBhdmFpbGFibGUgcmV0dXJuIHRoZSBFTlhJTyBlcnJvci4gIFRoaXMKKwlzdGF0dXMgbWF5IGNoYW5nZSBhdCBydW50aW1lLCBhcyB0aGVyZSBhcmUgaG90cGx1ZyB0aGVybWFsCisJc2Vuc29ycywgbGlrZSB0aG9zZSBpbnNpZGUgdGhlIGJhdHRlcmllcyBhbmQgZG9ja3MuCisKKwl0aGlua3BhZC1hY3BpIHRoZXJtYWwgc2Vuc29ycyBhcmUgcmVwb3J0ZWQgdGhyb3VnaCB0aGUgaHdtb24KKwlzdWJzeXN0ZW0sIGFuZCBmb2xsb3cgYWxsIG9mIHRoZSBod21vbiBndWlkZWxpbmVzIGF0CisJRG9jdW1lbnRhdGlvbi9od21vbi4KKworCiBFWFBFUklNRU5UQUw6IEVtYmVkZGVkIGNvbnRyb2xsZXIgcmVnaXN0ZXIgZHVtcCAtLSAvcHJvYy9hY3BpL2libS9lY2R1bXAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC00NzIsNyArNjA2LDcgQEAKIHJlZ2lzdGVycy4gVmFsdWVzIHdoaWNoIGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoZSByZWdpc3RlcnMKIHdlcmUgZHVtcGVkIGFyZSBtYXJrZWQgd2l0aCBhIHN0YXI6CiAKLVtyb290QHg0MCBpYm0tYWNwaV0jIGNhdCAvcHJvYy9hY3BpL2libS9lY2R1bXAgCitbcm9vdEB4NDAgaWJtLWFjcGldIyBjYXQgL3Byb2MvYWNwaS9pYm0vZWNkdW1wCiBFQyAgICAgICArMDAgKzAxICswMiArMDMgKzA0ICswNSArMDYgKzA3ICswOCArMDkgKzBhICswYiArMGMgKzBkICswZSArMGYKIEVDIDB4MDA6ICBhNyAgNDcgIDg3ICAwMSAgZmUgIDk2ICAwMCAgMDggIDAxICAwMCAgY2IgIDAwICAwMCAgMDAgIDQwICAwMAogRUMgMHgxMDogIDAwICAwMCAgZmYgIGZmICBmNCAgM2MgIDg3ICAwOSAgMDEgIGZmICA0MiAgMDEgIGZmICBmZiAgMGQgIDAwCkBAIC01MDMsNyArNjM3LDcgQEAKIHRoZSBmYW4gc3BlZWQgZmx1Y3R1YXRlcyBhIGJpdC4gVGhlIHRoaXJkIHdpbGwgKGhvcGVmdWxseSkgbWFyayB0aGUKIGZhbiByZWdpc3RlciB3aXRoIGEgc3RhcjoKIAotW3Jvb3RAeDQwIGlibS1hY3BpXSMgY2F0IC9wcm9jL2FjcGkvaWJtL2VjZHVtcCAKK1tyb290QHg0MCBpYm0tYWNwaV0jIGNhdCAvcHJvYy9hY3BpL2libS9lY2R1bXAKIEVDICAgICAgICswMCArMDEgKzAyICswMyArMDQgKzA1ICswNiArMDcgKzA4ICswOSArMGEgKzBiICswYyArMGQgKzBlICswZgogRUMgMHgwMDogIGE3ICA0NyAgODcgIDAxICBmZSAgOTYgIDAwICAwOCAgMDEgIDAwICBjYiAgMDAgIDAwICAwMCAgNDAgIDAwCiBFQyAweDEwOiAgMDAgIDAwICBmZiAgZmYgIGY0ICAzYyAgODcgIDA5ICAwMSAgZmYgIDQyICAwMSAgZmYgIGZmICAwZCAgMDAKQEAgLTUzMywxOSArNjY3LDU5IEBACiB3aXRoIHRoaXMsIGRvIHNlbmQgbWUgeW91ciByZXN1bHRzIChpbmNsdWRpbmcgc29tZSBjb21wbGV0ZSBkdW1wcyB3aXRoCiBhIGRlc2NyaXB0aW9uIG9mIHRoZSBjb25kaXRpb25zIHdoZW4gdGhleSB3ZXJlIHRha2VuLikKIAotTENEIGJyaWdodG5lc3MgY29udHJvbCAtLSAvcHJvYy9hY3BpL2libS9icmlnaHRuZXNzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xDRCBicmlnaHRuZXNzIGNvbnRyb2wKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworcHJvY2ZzOiAvcHJvYy9hY3BpL2libS9icmlnaHRuZXNzCitzeXNmcyBiYWNrbGlnaHQgZGV2aWNlICJ0aGlua3BhZF9zY3JlZW4iCiAKIFRoaXMgZmVhdHVyZSBhbGxvd3Mgc29mdHdhcmUgY29udHJvbCBvZiB0aGUgTENEIGJyaWdodG5lc3Mgb24gVGhpbmtQYWQKLW1vZGVscyB3aGljaCBkb24ndCBoYXZlIGEgaGFyZHdhcmUgYnJpZ2h0bmVzcyBzbGlkZXIuIFRoZSBhdmFpbGFibGUKLWNvbW1hbmRzIGFyZToKK21vZGVscyB3aGljaCBkb24ndCBoYXZlIGEgaGFyZHdhcmUgYnJpZ2h0bmVzcyBzbGlkZXIuCisKK0l0IGhhcyBzb21lIGxpbWl0YXRpb25zOiB0aGUgTENEIGJhY2tsaWdodCBjYW5ub3QgYmUgYWN0dWFsbHkgdHVybmVkIG9uIG9yIG9mZgorYnkgdGhpcyBpbnRlcmZhY2UsIGFuZCBpbiBtYW55IFRoaW5rUGFkIG1vZGVscywgdGhlICJkaW0gd2hpbGUgb24gYmF0dGVyeSIKK2Z1bmN0aW9uYWxpdHkgd2lsbCBiZSBlbmFibGVkIGJ5IHRoZSBCSU9TIHdoZW4gdGhpcyBpbnRlcmZhY2UgaXMgdXNlZCwgYW5kCitjYW5ub3QgYmUgY29udHJvbGxlZC4KKworVGhlIGJhY2tsaWdodCBjb250cm9sIGhhcyBlaWdodCBsZXZlbHMsIHJhbmdpbmcgZnJvbSAwIHRvIDcuICBTb21lIG9mIHRoZQorbGV2ZWxzIG1heSBub3QgYmUgZGlzdGluY3QuCisKK1Byb2NmcyBub3RlczoKKworCVRoZSBhdmFpbGFibGUgY29tbWFuZHMgYXJlOgogCiAJZWNobyB1cCAgID4vcHJvYy9hY3BpL2libS9icmlnaHRuZXNzCiAJZWNobyBkb3duID4vcHJvYy9hY3BpL2libS9icmlnaHRuZXNzCiAJZWNobyAnbGV2ZWwgPGxldmVsPicgPi9wcm9jL2FjcGkvaWJtL2JyaWdodG5lc3MKIAotVGhlIDxsZXZlbD4gbnVtYmVyIHJhbmdlIGlzIDAgdG8gNywgYWx0aG91Z2ggbm90IGFsbCBvZiB0aGVtIG1heSBiZQotZGlzdGluY3QuIFRoZSBjdXJyZW50IGJyaWdodG5lc3MgbGV2ZWwgaXMgc2hvd24gaW4gdGhlIGZpbGUuCitTeXNmcyBub3RlczoKKworVGhlIGludGVyZmFjZSBpcyBpbXBsZW1lbnRlZCB0aHJvdWdoIHRoZSBiYWNrbGlnaHQgc3lzZnMgY2xhc3MsIHdoaWNoIGlzIHBvb3JseQorZG9jdW1lbnRlZCBhdCB0aGlzIHRpbWUuCisKK0xvY2F0ZSB0aGUgdGhpbmtwYWRfc2NyZWVuIGRldmljZSB1bmRlciAvc3lzL2NsYXNzL2JhY2tsaWdodCwgYW5kIGluc2lkZSBpdAordGhlcmUgd2lsbCBiZSB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6CisKKwltYXhfYnJpZ2h0bmVzczoKKwkJUmVhZHMgdGhlIG1heGltdW0gYnJpZ2h0bmVzcyB0aGUgaGFyZHdhcmUgY2FuIGJlIHNldCB0by4KKwkJVGhlIG1pbmltdW0gaXMgYWx3YXlzIHplcm8uCisKKwlhY3R1YWxfYnJpZ2h0bmVzczoKKwkJUmVhZHMgd2hhdCBicmlnaHRuZXNzIHRoZSBzY3JlZW4gaXMgc2V0IHRvIGF0IHRoaXMgaW5zdGFudC4KKworCWJyaWdodG5lc3M6CisJCVdyaXRlcyByZXF1ZXN0IHRoZSBkcml2ZXIgdG8gY2hhbmdlIGJyaWdodG5lc3MgdG8gdGhlIGdpdmVuCisJCXZhbHVlLiAgUmVhZHMgd2lsbCB0ZWxsIHlvdSB3aGF0IGJyaWdodG5lc3MgdGhlIGRyaXZlciBpcyB0cnlpbmcKKwkJdG8gc2V0IHRoZSBkaXNwbGF5IHRvIHdoZW4gInBvd2VyIiBpcyBzZXQgdG8gemVybyBhbmQgdGhlIGRpc3BsYXkKKwkJaGFzIG5vdCBiZWVuIGRpbW1lZCBieSBhIGtlcm5lbCBwb3dlciBtYW5hZ2VtZW50IGV2ZW50LgorCisJcG93ZXI6CisJCXBvd2VyIG1hbmFnZW1lbnQgbW9kZSwgd2hlcmUgMCBpcyAiZGlzcGxheSBvbiIsIGFuZCAxIHRvIDMgd2lsbAorCQlkaW0gdGhlIGRpc3BsYXkgYmFja2xpZ2h0IHRvIGJyaWdodG5lc3MgbGV2ZWwgMCBiZWNhdXNlCisJCXRoaW5rcGFkLWFjcGkgY2Fubm90IHJlYWxseSB0dXJuIHRoZSBiYWNrbGlnaHQgb2ZmLiAgS2VybmVsCisJCXBvd2VyIG1hbmFnZW1lbnQgZXZlbnRzIGNhbiB0ZW1wb3JhcmlseSBpbmNyZWFzZSB0aGUgY3VycmVudAorCQlwb3dlciBtYW5hZ2VtZW50IGxldmVsLCBpLmUuIHRoZXkgY2FuIGRpbSB0aGUgZGlzcGxheS4KKwogCiBWb2x1bWUgY29udHJvbCAtLSAvcHJvYy9hY3BpL2libS92b2x1bWUKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNTYzLDQxICs3MzcsNDIgQEAKIHVwIG9yIGRvd24gY29tbWFuZCAodGhlIGxldmVsIGNvbW1hbmQgd2lsbCBub3QgdW5tdXRlIHRoZSB2b2x1bWUpLgogVGhlIGN1cnJlbnQgdm9sdW1lIGxldmVsIGFuZCBtdXRlIHN0YXRlIGlzIHNob3duIGluIHRoZSBmaWxlLgogCi1FWFBFUklNRU5UQUw6IGZhbiBzcGVlZCwgZmFuIGVuYWJsZS9kaXNhYmxlIC0tIC9wcm9jL2FjcGkvaWJtL2ZhbgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0ZhbiBjb250cm9sIGFuZCBtb25pdG9yaW5nOiBmYW4gc3BlZWQsIGZhbiBlbmFibGUvZGlzYWJsZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLVRoaXMgZmVhdHVyZSBpcyBtYXJrZWQgRVhQRVJJTUVOVEFMIGJlY2F1c2UgdGhlIGltcGxlbWVudGF0aW9uCi1kaXJlY3RseSBhY2Nlc3NlcyBoYXJkd2FyZSByZWdpc3RlcnMgYW5kIG1heSBub3Qgd29yayBhcyBleHBlY3RlZC4gVVNFCi1XSVRIIENBVVRJT04hIFRvIHVzZSB0aGlzIGZlYXR1cmUsIHlvdSBuZWVkIHRvIHN1cHBseSB0aGUKLWV4cGVyaW1lbnRhbD0xIHBhcmFtZXRlciB3aGVuIGxvYWRpbmcgdGhlIG1vZHVsZS4KK3Byb2NmczogL3Byb2MvYWNwaS9pYm0vZmFuCitzeXNmcyBkZXZpY2UgYXR0cmlidXRlczogKGh3bW9uKSBmYW5faW5wdXQsIHB3bTEsIHB3bTFfZW5hYmxlCisKK05PVEUgTk9URSBOT1RFOiBmYW4gY29udHJvbCBvcGVyYXRpb25zIGFyZSBkaXNhYmxlZCBieSBkZWZhdWx0IGZvcgorc2FmZXR5IHJlYXNvbnMuICBUbyBlbmFibGUgdGhlbSwgdGhlIG1vZHVsZSBwYXJhbWV0ZXIgImZhbl9jb250cm9sPTEiCittdXN0IGJlIGdpdmVuIHRvIHRoaW5rcGFkLWFjcGkuCiAKIFRoaXMgZmVhdHVyZSBhdHRlbXB0cyB0byBzaG93IHRoZSBjdXJyZW50IGZhbiBzcGVlZCwgY29udHJvbCBtb2RlIGFuZAogb3RoZXIgZmFuIGRhdGEgdGhhdCBtaWdodCBiZSBhdmFpbGFibGUuICBUaGUgc3BlZWQgaXMgcmVhZCBkaXJlY3RseQogZnJvbSB0aGUgaGFyZHdhcmUgcmVnaXN0ZXJzIG9mIHRoZSBlbWJlZGRlZCBjb250cm9sbGVyLiAgVGhpcyBpcyBrbm93bgotdG8gd29yayBvbiBsYXRlciBSLCBUIGFuZCBYIHNlcmllcyBUaGlua1BhZHMgYnV0IG1heSBzaG93IGEgYm9ndXMKK3RvIHdvcmsgb24gbGF0ZXIgUiwgVCwgWCBhbmQgWiBzZXJpZXMgVGhpbmtQYWRzIGJ1dCBtYXkgc2hvdyBhIGJvZ3VzCiB2YWx1ZSBvbiBvdGhlciBtb2RlbHMuCiAKLU1vc3QgVGhpbmtQYWQgZmFucyB3b3JrIGluICJsZXZlbHMiLiAgTGV2ZWwgMCBzdG9wcyB0aGUgZmFuLiAgVGhlIGhpZ2hlcgotdGhlIGxldmVsLCB0aGUgaGlnaGVyIHRoZSBmYW4gc3BlZWQsIGFsdGhvdWdoIGFkamFjZW50IGxldmVscyBvZnRlbiBtYXAKLXRvIHRoZSBzYW1lIGZhbiBzcGVlZC4gIDcgaXMgdGhlIGhpZ2hlc3QgbGV2ZWwsIHdoZXJlIHRoZSBmYW4gcmVhY2hlcwotdGhlIG1heGltdW0gcmVjb21tZW5kZWQgc3BlZWQuICBMZXZlbCAiYXV0byIgbWVhbnMgdGhlIEVDIGNoYW5nZXMgdGhlCi1mYW4gbGV2ZWwgYWNjb3JkaW5nIHRvIHNvbWUgaW50ZXJuYWwgYWxnb3JpdGhtLCB1c3VhbGx5IGJhc2VkIG9uCi1yZWFkaW5ncyBmcm9tIHRoZSB0aGVybWFsIHNlbnNvcnMuICBMZXZlbCAiZGlzZW5nYWdlZCIgbWVhbnMgdGhlIEVDCi1kaXNhYmxlcyB0aGUgc3BlZWQtbG9ja2VkIGNsb3NlZC1sb29wIGZhbiBjb250cm9sLCBhbmQgZHJpdmVzIHRoZSBmYW4gYXMKLWZhc3QgYXMgaXQgY2FuIGdvLCB3aGljaCBtaWdodCBleGNlZWQgaGFyZHdhcmUgbGltaXRzLCBzbyB1c2UgdGhpcyBsZXZlbAotd2l0aCBjYXV0aW9uLgorRmFuIGxldmVsczoKIAotVGhlIGZhbiB1c3VhbGx5IHJhbXBzIHVwIG9yIGRvd24gc2xvd2x5IGZyb20gb25lIHNwZWVkIHRvIGFub3RoZXIsCi1hbmQgaXQgaXMgbm9ybWFsIGZvciB0aGUgRUMgdG8gdGFrZSBzZXZlcmFsIHNlY29uZHMgdG8gcmVhY3QgdG8gZmFuCi1jb21tYW5kcy4KK01vc3QgVGhpbmtQYWQgZmFucyB3b3JrIGluICJsZXZlbHMiIGF0IHRoZSBmaXJtd2FyZSBpbnRlcmZhY2UuICBMZXZlbCAwCitzdG9wcyB0aGUgZmFuLiAgVGhlIGhpZ2hlciB0aGUgbGV2ZWwsIHRoZSBoaWdoZXIgdGhlIGZhbiBzcGVlZCwgYWx0aG91Z2gKK2FkamFjZW50IGxldmVscyBvZnRlbiBtYXAgdG8gdGhlIHNhbWUgZmFuIHNwZWVkLiAgNyBpcyB0aGUgaGlnaGVzdAorbGV2ZWwsIHdoZXJlIHRoZSBmYW4gcmVhY2hlcyB0aGUgbWF4aW11bSByZWNvbW1lbmRlZCBzcGVlZC4KIAotVGhlIGZhbiBtYXkgYmUgZW5hYmxlZCBvciBkaXNhYmxlZCB3aXRoIHRoZSBmb2xsb3dpbmcgY29tbWFuZHM6CitMZXZlbCAiYXV0byIgbWVhbnMgdGhlIEVDIGNoYW5nZXMgdGhlIGZhbiBsZXZlbCBhY2NvcmRpbmcgdG8gc29tZQoraW50ZXJuYWwgYWxnb3JpdGhtLCB1c3VhbGx5IGJhc2VkIG9uIHJlYWRpbmdzIGZyb20gdGhlIHRoZXJtYWwgc2Vuc29ycy4KIAotCWVjaG8gZW5hYmxlICA+L3Byb2MvYWNwaS9pYm0vZmFuCi0JZWNobyBkaXNhYmxlID4vcHJvYy9hY3BpL2libS9mYW4KK1RoZXJlIGlzIGFsc28gYSAiZnVsbC1zcGVlZCIgbGV2ZWwsIGFsc28ga25vd24gYXMgImRpc2VuZ2FnZWQiIGxldmVsLgorSW4gdGhpcyBsZXZlbCwgdGhlIEVDIGRpc2FibGVzIHRoZSBzcGVlZC1sb2NrZWQgY2xvc2VkLWxvb3AgZmFuIGNvbnRyb2wsCithbmQgZHJpdmVzIHRoZSBmYW4gYXMgZmFzdCBhcyBpdCBjYW4gZ28sIHdoaWNoIG1pZ2h0IGV4Y2VlZCBoYXJkd2FyZQorbGltaXRzLCBzbyB1c2UgdGhpcyBsZXZlbCB3aXRoIGNhdXRpb24uCiAKLVBsYWNpbmcgYSBmYW4gb24gbGV2ZWwgMCBpcyB0aGUgc2FtZSBhcyBkaXNhYmxpbmcgaXQuICBFbmFibGluZyBhIGZhbgotd2lsbCB0cnkgdG8gcGxhY2UgaXQgaW4gYSBzYWZlIGxldmVsIGlmIGl0IGlzIHRvbyBzbG93IG9yIGRpc2FibGVkLgorVGhlIGZhbiB1c3VhbGx5IHJhbXBzIHVwIG9yIGRvd24gc2xvd2x5IGZyb20gb25lIHNwZWVkIHRvIGFub3RoZXIsIGFuZAoraXQgaXMgbm9ybWFsIGZvciB0aGUgRUMgdG8gdGFrZSBzZXZlcmFsIHNlY29uZHMgdG8gcmVhY3QgdG8gZmFuCitjb21tYW5kcy4gIFRoZSBmdWxsLXNwZWVkIGxldmVsIG1heSB0YWtlIHVwIHRvIHR3byBtaW51dGVzIHRvIHJhbXAgdXAgdG8KK21heGltdW0gc3BlZWQsIGFuZCBpbiBzb21lIFRoaW5rUGFkcywgdGhlIHRhY2hvbWV0ZXIgcmVhZGluZ3MgZ28gc3RhbGUKK3doaWxlIHRoZSBFQyBpcyB0cmFuc2l0aW9uaW5nIHRvIHRoZSBmdWxsLXNwZWVkIGxldmVsLgogCiBXQVJOSU5HIFdBUk5JTkcgV0FSTklORzogZG8gbm90IGxlYXZlIHRoZSBmYW4gZGlzYWJsZWQgdW5sZXNzIHlvdSBhcmUKIG1vbml0b3JpbmcgYWxsIG9mIHRoZSB0ZW1wZXJhdHVyZSBzZW5zb3IgcmVhZGluZ3MgYW5kIHlvdSBhcmUgcmVhZHkgdG8KQEAgLTYxNSw0NiArNzkwLDE0NiBAQAogSEREIHRlbXBlcmF0dXJlIGRyb3BzIHRvIDQxIGRlZ3JlZXMuICBUaGVzZSB0aHJlc2hvbGRzIGNhbm5vdAogY3VycmVudGx5IGJlIGNvbnRyb2xsZWQuCiAKLVRoZSBmYW4gbGV2ZWwgY2FuIGJlIGNvbnRyb2xsZWQgd2l0aCB0aGUgY29tbWFuZDoKLQotCWVjaG8gJ2xldmVsIDxsZXZlbD4nID4gL3Byb2MvYWNwaS9pYm0vdGhlcm1hbAotCi1XaGVyZSA8bGV2ZWw+IGlzIGFuIGludGVnZXIgZnJvbSAwIHRvIDcsIG9yIG9uZSBvZiB0aGUgd29yZHMgImF1dG8iCi1vciAiZGlzZW5nYWdlZCIgKHdpdGhvdXQgdGhlIHF1b3RlcykuICBOb3QgYWxsIFRoaW5rUGFkcyBzdXBwb3J0IHRoZQotImF1dG8iIGFuZCAiZGlzZW5nYWdlZCIgbGV2ZWxzLgotCi1PbiB0aGUgWDMxIGFuZCBYNDAgKGFuZCBPTkxZIG9uIHRob3NlIG1vZGVscyksIHRoZSBmYW4gc3BlZWQgY2FuIGJlCi1jb250cm9sbGVkIHRvIGEgY2VydGFpbiBkZWdyZWUuIE9uY2UgdGhlIGZhbiBpcyBydW5uaW5nLCBpdCBjYW4gYmUKLWZvcmNlZCB0byBydW4gZmFzdGVyIG9yIHNsb3dlciB3aXRoIHRoZSBmb2xsb3dpbmcgY29tbWFuZDoKLQotCWVjaG8gJ3NwZWVkIDxzcGVlZD4nID4gL3Byb2MvYWNwaS9pYm0vdGhlcm1hbAotCi1UaGUgc3VzdGFpbmFibGUgcmFuZ2Ugb2YgZmFuIHNwZWVkcyBvbiB0aGUgWDQwIGFwcGVhcnMgdG8gYmUgZnJvbQotYWJvdXQgMzcwMCB0byBhYm91dCA3MzUwLiBWYWx1ZXMgb3V0c2lkZSB0aGlzIHJhbmdlIGVpdGhlciBkbyBub3QgaGF2ZQotYW55IGVmZmVjdCBvciB0aGUgZmFuIHNwZWVkIGV2ZW50dWFsbHkgc2V0dGxlcyBzb21ld2hlcmUgaW4gdGhhdAotcmFuZ2UuIFRoZSBmYW4gY2Fubm90IGJlIHN0b3BwZWQgb3Igc3RhcnRlZCB3aXRoIHRoaXMgY29tbWFuZC4KLQogVGhlIFRoaW5rUGFkJ3MgQUNQSSBEU0RUIGNvZGUgd2lsbCByZXByb2dyYW0gdGhlIGZhbiBvbiBpdHMgb3duIHdoZW4KIGNlcnRhaW4gY29uZGl0aW9ucyBhcmUgbWV0LiAgSXQgd2lsbCBvdmVycmlkZSBhbnkgZmFuIHByb2dyYW1taW5nIGRvbmUKLXRocm91Z2ggaWJtLWFjcGkuCit0aHJvdWdoIHRoaW5rcGFkLWFjcGkuCiAKLUVYUEVSSU1FTlRBTDogV0FOIC0tIC9wcm9jL2FjcGkvaWJtL3dhbgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUaGUgdGhpbmtwYWQtYWNwaSBrZXJuZWwgZHJpdmVyIGNhbiBiZSBwcm9ncmFtbWVkIHRvIHJldmVydCB0aGUgZmFuCitsZXZlbCB0byBhIHNhZmUgc2V0dGluZyBpZiB1c2Vyc3BhY2UgZG9lcyBub3QgaXNzdWUgb25lIG9mIHRoZSBwcm9jZnMKK2ZhbiBjb21tYW5kczogImVuYWJsZSIsICJkaXNhYmxlIiwgImxldmVsIiBvciAid2F0Y2hkb2ciLCBvciBpZiB0aGVyZQorYXJlIG5vIHdyaXRlcyB0byBwd20xX2VuYWJsZSAob3IgdG8gcHdtMSAqaWYgYW5kIG9ubHkgaWYqIHB3bTFfZW5hYmxlIGlzCitzZXQgdG8gMSwgbWFudWFsIG1vZGUpIHdpdGhpbiBhIGNvbmZpZ3VyYWJsZSBhbW91bnQgb2YgdGltZSBvZiB1cCB0bworMTIwIHNlY29uZHMuICBUaGlzIGZ1bmN0aW9uYWxpdHkgaXMgY2FsbGVkIGZhbiBzYWZldHkgd2F0Y2hkb2cuCisKK05vdGUgdGhhdCB0aGUgd2F0Y2hkb2cgdGltZXIgc3RvcHMgYWZ0ZXIgaXQgZW5hYmxlcyB0aGUgZmFuLiAgSXQgd2lsbCBiZQorcmVhcm1lZCBhZ2FpbiBhdXRvbWF0aWNhbGx5ICh1c2luZyB0aGUgc2FtZSBpbnRlcnZhbCkgd2hlbiBvbmUgb2YgdGhlCithYm92ZSBtZW50aW9uZWQgZmFuIGNvbW1hbmRzIGlzIHJlY2VpdmVkLiAgVGhlIGZhbiB3YXRjaGRvZyBpcywKK3RoZXJlZm9yZSwgbm90IHN1aXRhYmxlIHRvIHByb3RlY3QgYWdhaW5zdCBmYW4gbW9kZSBjaGFuZ2VzIG1hZGUgdGhyb3VnaAorbWVhbnMgb3RoZXIgdGhhbiB0aGUgImVuYWJsZSIsICJkaXNhYmxlIiwgYW5kICJsZXZlbCIgcHJvY2ZzIGZhbgorY29tbWFuZHMsIG9yIHRoZSBod21vbiBmYW4gY29udHJvbCBzeXNmcyBpbnRlcmZhY2UuCisKK1Byb2NmcyBub3RlczoKKworVGhlIGZhbiBtYXkgYmUgZW5hYmxlZCBvciBkaXNhYmxlZCB3aXRoIHRoZSBmb2xsb3dpbmcgY29tbWFuZHM6CisKKwllY2hvIGVuYWJsZSAgPi9wcm9jL2FjcGkvaWJtL2ZhbgorCWVjaG8gZGlzYWJsZSA+L3Byb2MvYWNwaS9pYm0vZmFuCisKK1BsYWNpbmcgYSBmYW4gb24gbGV2ZWwgMCBpcyB0aGUgc2FtZSBhcyBkaXNhYmxpbmcgaXQuICBFbmFibGluZyBhIGZhbgord2lsbCB0cnkgdG8gcGxhY2UgaXQgaW4gYSBzYWZlIGxldmVsIGlmIGl0IGlzIHRvbyBzbG93IG9yIGRpc2FibGVkLgorCitUaGUgZmFuIGxldmVsIGNhbiBiZSBjb250cm9sbGVkIHdpdGggdGhlIGNvbW1hbmQ6CisKKwllY2hvICdsZXZlbCA8bGV2ZWw+JyA+IC9wcm9jL2FjcGkvaWJtL2ZhbgorCitXaGVyZSA8bGV2ZWw+IGlzIGFuIGludGVnZXIgZnJvbSAwIHRvIDcsIG9yIG9uZSBvZiB0aGUgd29yZHMgImF1dG8iIG9yCisiZnVsbC1zcGVlZCIgKHdpdGhvdXQgdGhlIHF1b3RlcykuICBOb3QgYWxsIFRoaW5rUGFkcyBzdXBwb3J0IHRoZSAiYXV0byIKK2FuZCAiZnVsbC1zcGVlZCIgbGV2ZWxzLiAgVGhlIGRyaXZlciBhY2NlcHRzICJkaXNlbmdhZ2VkIiBhcyBhbiBhbGlhcyBmb3IKKyJmdWxsLXNwZWVkIiwgYW5kIHJlcG9ydHMgaXQgYXMgImRpc2VuZ2FnZWQiIGZvciBiYWNrd2FyZHMKK2NvbXBhdGliaWxpdHkuCisKK09uIHRoZSBYMzEgYW5kIFg0MCAoYW5kIE9OTFkgb24gdGhvc2UgbW9kZWxzKSwgdGhlIGZhbiBzcGVlZCBjYW4gYmUKK2NvbnRyb2xsZWQgdG8gYSBjZXJ0YWluIGRlZ3JlZS4gIE9uY2UgdGhlIGZhbiBpcyBydW5uaW5nLCBpdCBjYW4gYmUKK2ZvcmNlZCB0byBydW4gZmFzdGVyIG9yIHNsb3dlciB3aXRoIHRoZSBmb2xsb3dpbmcgY29tbWFuZDoKKworCWVjaG8gJ3NwZWVkIDxzcGVlZD4nID4gL3Byb2MvYWNwaS9pYm0vZmFuCisKK1RoZSBzdXN0YWluYWJsZSByYW5nZSBvZiBmYW4gc3BlZWRzIG9uIHRoZSBYNDAgYXBwZWFycyB0byBiZSBmcm9tIGFib3V0CiszNzAwIHRvIGFib3V0IDczNTAuIFZhbHVlcyBvdXRzaWRlIHRoaXMgcmFuZ2UgZWl0aGVyIGRvIG5vdCBoYXZlIGFueQorZWZmZWN0IG9yIHRoZSBmYW4gc3BlZWQgZXZlbnR1YWxseSBzZXR0bGVzIHNvbWV3aGVyZSBpbiB0aGF0IHJhbmdlLiAgVGhlCitmYW4gY2Fubm90IGJlIHN0b3BwZWQgb3Igc3RhcnRlZCB3aXRoIHRoaXMgY29tbWFuZC4gIFRoaXMgZnVuY3Rpb25hbGl0eQoraXMgaW5jb21wbGV0ZSwgYW5kIG5vdCBhdmFpbGFibGUgdGhyb3VnaCB0aGUgc3lzZnMgaW50ZXJmYWNlLgorCitUbyBwcm9ncmFtIHRoZSBzYWZldHkgd2F0Y2hkb2csIHVzZSB0aGUgIndhdGNoZG9nIiBjb21tYW5kLgorCisJZWNobyAnd2F0Y2hkb2cgPGludGVydmFsIGluIHNlY29uZHM+JyA+IC9wcm9jL2FjcGkvaWJtL2ZhbgorCitJZiB5b3Ugd2FudCB0byBkaXNhYmxlIHRoZSB3YXRjaGRvZywgdXNlIDAgYXMgdGhlIGludGVydmFsLgorCitTeXNmcyBub3RlczoKKworVGhlIHN5c2ZzIGludGVyZmFjZSBmb2xsb3dzIHRoZSBod21vbiBzdWJzeXN0ZW0gZ3VpZGVsaW5lcyBmb3IgdGhlIG1vc3QKK3BhcnQsIGFuZCB0aGUgZXhjZXB0aW9uIGlzIHRoZSBmYW4gc2FmZXR5IHdhdGNoZG9nLgorCitXcml0ZXMgdG8gYW55IG9mIHRoZSBzeXNmcyBhdHRyaWJ1dGVzIG1heSByZXR1cm4gdGhlIEVJTlZBTCBlcnJvciBpZgordGhhdCBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBpbiBhIGdpdmVuIFRoaW5rUGFkIG9yIGlmIHRoZSBwYXJhbWV0ZXIKK2lzIG91dC1vZi1ib3VuZHMsIGFuZCBFUEVSTSBpZiBpdCBpcyBmb3JiaWRkZW4uICBUaGV5IG1heSBhbHNvIHJldHVybgorRUlOVFIgKGludGVycnVwdGVkIHN5c3RlbSBjYWxsKSwgYW5kIEVJTyAoSS9PIGVycm9yIHdoaWxlIHRyeWluZyB0byB0YWxrCit0byB0aGUgZmlybXdhcmUpLgorCitGZWF0dXJlcyBub3QgeWV0IGltcGxlbWVudGVkIGJ5IHRoZSBkcml2ZXIgcmV0dXJuIEVOT1NZUy4KKworaHdtb24gZGV2aWNlIGF0dHJpYnV0ZSBwd20xX2VuYWJsZToKKwkwOiBQV00gb2ZmbGluZSAoZmFuIGlzIHNldCB0byBmdWxsLXNwZWVkIG1vZGUpCisJMTogTWFudWFsIFBXTSBjb250cm9sICh1c2UgcHdtMSB0byBzZXQgZmFuIGxldmVsKQorCTI6IEhhcmR3YXJlIFBXTSBjb250cm9sIChFQyAiYXV0byIgbW9kZSkKKwkzOiByZXNlcnZlZCAoU29mdHdhcmUgUFdNIGNvbnRyb2wsIG5vdCBpbXBsZW1lbnRlZCB5ZXQpCisKKwlNb2RlcyAwIGFuZCAyIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IGFsbCBUaGlua1BhZHMsIGFuZCB0aGUKKwlkcml2ZXIgaXMgbm90IGFsd2F5cyBhYmxlIHRvIGRldGVjdCB0aGlzLiAgSWYgaXQgZG9lcyBrbm93IGEKKwltb2RlIGlzIHVuc3VwcG9ydGVkLCBpdCB3aWxsIHJldHVybiAtRUlOVkFMLgorCitod21vbiBkZXZpY2UgYXR0cmlidXRlIHB3bTE6CisJRmFuIGxldmVsLCBzY2FsZWQgZnJvbSB0aGUgZmlybXdhcmUgdmFsdWVzIG9mIDAtNyB0byB0aGUgaHdtb24KKwlzY2FsZSBvZiAwLTI1NS4gIDAgbWVhbnMgZmFuIHN0b3BwZWQsIDI1NSBtZWFucyBoaWdoZXN0IG5vcm1hbAorCXNwZWVkIChsZXZlbCA3KS4KKworCVRoaXMgYXR0cmlidXRlIG9ubHkgY29tbWFuZHMgdGhlIGZhbiBpZiBwbXcxX2VuYWJsZSBpcyBzZXQgdG8gMQorCShtYW51YWwgUFdNIGNvbnRyb2wpLgorCitod21vbiBkZXZpY2UgYXR0cmlidXRlIGZhbjFfaW5wdXQ6CisJRmFuIHRhY2hvbWV0ZXIgcmVhZGluZywgaW4gUlBNLiAgTWF5IGdvIHN0YWxlIG9uIGNlcnRhaW4KKwlUaGlua1BhZHMgd2hpbGUgdGhlIEVDIHRyYW5zaXRpb25zIHRoZSBQV00gdG8gb2ZmbGluZSBtb2RlLAorCXdoaWNoIGNhbiB0YWtlIHVwIHRvIHR3byBtaW51dGVzLiAgTWF5IHJldHVybiBydWJiaXNoIG9uIG9sZGVyCisJVGhpbmtQYWRzLgorCitkcml2ZXIgYXR0cmlidXRlIGZhbl93YXRjaGRvZzoKKwlGYW4gc2FmZXR5IHdhdGNoZG9nIHRpbWVyIGludGVydmFsLCBpbiBzZWNvbmRzLiAgTWluaW11bSBpcworCTEgc2Vjb25kLCBtYXhpbXVtIGlzIDEyMCBzZWNvbmRzLiAgMCBkaXNhYmxlcyB0aGUgd2F0Y2hkb2cuCisKK1RvIHN0b3AgdGhlIGZhbjogc2V0IHB3bTEgdG8gemVybywgYW5kIHB3bTFfZW5hYmxlIHRvIDEuCisKK1RvIHN0YXJ0IHRoZSBmYW4gaW4gYSBzYWZlIG1vZGU6IHNldCBwd20xX2VuYWJsZSB0byAyLiAgSWYgdGhhdCBmYWlscword2l0aCBFSU5WQUwsIHRyeSB0byBzZXQgcHdtMV9lbmFibGUgdG8gMSBhbmQgcHdtMSB0byBhdCBsZWFzdCAxMjggKDI1NQord291bGQgYmUgdGhlIHNhZmVzdCBjaG9pY2UsIHRob3VnaCkuCisKKworRVhQRVJJTUVOVEFMOiBXQU4KKy0tLS0tLS0tLS0tLS0tLS0tCisKK3Byb2NmczogL3Byb2MvYWNwaS9pYm0vd2FuCitzeXNmcyBkZXZpY2UgYXR0cmlidXRlOiB3d2FuL2VuYWJsZQogCiBUaGlzIGZlYXR1cmUgaXMgbWFya2VkIEVYUEVSSU1FTlRBTCBiZWNhdXNlIHRoZSBpbXBsZW1lbnRhdGlvbgogZGlyZWN0bHkgYWNjZXNzZXMgaGFyZHdhcmUgcmVnaXN0ZXJzIGFuZCBtYXkgbm90IHdvcmsgYXMgZXhwZWN0ZWQuIFVTRQogV0lUSCBDQVVUSU9OISBUbyB1c2UgdGhpcyBmZWF0dXJlLCB5b3UgbmVlZCB0byBzdXBwbHkgdGhlCiBleHBlcmltZW50YWw9MSBwYXJhbWV0ZXIgd2hlbiBsb2FkaW5nIHRoZSBtb2R1bGUuCiAKLVRoaXMgZmVhdHVyZSBzaG93cyB0aGUgcHJlc2VuY2UgYW5kIGN1cnJlbnQgc3RhdGUgb2YgYSBXQU4gKFNpZXJyYQotV2lyZWxlc3MgRVYtRE8pIGRldmljZS4gSWYgV0FOIGlzIGluc3RhbGxlZCwgdGhlIGZvbGxvd2luZyBjb21tYW5kcyBjYW4KLWJlIHVzZWQ6CitUaGlzIGZlYXR1cmUgc2hvd3MgdGhlIHByZXNlbmNlIGFuZCBjdXJyZW50IHN0YXRlIG9mIGEgVy1XQU4gKFNpZXJyYQorV2lyZWxlc3MgRVYtRE8pIGRldmljZS4KKworSXQgd2FzIHRlc3RlZCBvbiBhIExlbm92byBUaGlua3BhZCBYNjAuIEl0IHNob3VsZCBwcm9iYWJseSB3b3JrIG9uIG90aGVyCitUaGlua3BhZCBtb2RlbHMgd2hpY2ggY29tZSB3aXRoIHRoaXMgbW9kdWxlIGluc3RhbGxlZC4KKworUHJvY2ZzIG5vdGVzOgorCitJZiB0aGUgVy1XQU4gY2FyZCBpcyBpbnN0YWxsZWQsIHRoZSBmb2xsb3dpbmcgY29tbWFuZHMgY2FuIGJlIHVzZWQ6CiAKIAllY2hvIGVuYWJsZSA+IC9wcm9jL2FjcGkvaWJtL3dhbgogCWVjaG8gZGlzYWJsZSA+IC9wcm9jL2FjcGkvaWJtL3dhbgogCi1JdCB3YXMgdGVzdGVkIG9uIGEgTGVub3ZvIFRoaW5rcGFkIFg2MC4gSXQgc2hvdWxkIHByb2JhYmx5IHdvcmsgb24gb3RoZXIKLVRoaW5rcGFkIG1vZGVscyB3aGljaCBjb21lIHdpdGggdGhpcyBtb2R1bGUgaW5zdGFsbGVkLgorU3lzZnMgbm90ZXM6CisKKwlJZiB0aGUgVy1XQU4gY2FyZCBpcyBpbnN0YWxsZWQsIGl0IGNhbiBiZSBlbmFibGVkIC8KKwlkaXNhYmxlZCB0aHJvdWdoIHRoZSAid3dhbi9lbmFibGUiIHRoaW5rcGFkLWFjcGkgZGV2aWNlCisJYXR0cmlidXRlLCBhbmQgaXRzIGN1cnJlbnQgc3RhdHVzIGNhbiBhbHNvIGJlIHF1ZXJpZWQuCisKKwllbmFibGU6CisJCTA6IGRpc2FibGVzIFdXQU4gY2FyZCAvIFdXQU4gY2FyZCBpcyBkaXNhYmxlZAorCQkxOiBlbmFibGVzIFdXQU4gY2FyZCAvIFdXQU4gY2FyZCBpcyBlbmFibGVkLgorCisJTm90ZTogdGhpcyBpbnRlcmZhY2Ugd2lsbCBiZSBwcm9iYWJseSBiZSBzdXBlcnNlZWRlZCBieSB0aGUKKwlnZW5lcmljIHJma2lsbCBjbGFzcy4KIAogTXVsdGlwbGUgQ29tbWFuZHMsIE1vZHVsZSBQYXJhbWV0ZXJzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTY2NSw2NCArOTQwLDQyIEBACiAJZWNobyBlbmFibGUsMHhmZmZmID4gL3Byb2MvYWNwaS9pYm0vaG90a2V5CiAJZWNobyBsY2RfZGlzYWJsZSxjcnRfZW5hYmxlID4gL3Byb2MvYWNwaS9pYm0vdmlkZW8KIAotQ29tbWFuZHMgY2FuIGFsc28gYmUgc3BlY2lmaWVkIHdoZW4gbG9hZGluZyB0aGUgaWJtX2FjcGkgbW9kdWxlLCBmb3IKLWV4YW1wbGU6CitDb21tYW5kcyBjYW4gYWxzbyBiZSBzcGVjaWZpZWQgd2hlbiBsb2FkaW5nIHRoZSB0aGlua3BhZC1hY3BpIG1vZHVsZSwKK2ZvciBleGFtcGxlOgogCi0JbW9kcHJvYmUgaWJtX2FjcGkgaG90a2V5PWVuYWJsZSwweGZmZmYgdmlkZW89YXV0b19kaXNhYmxlCisJbW9kcHJvYmUgdGhpbmtwYWRfYWNwaSBob3RrZXk9ZW5hYmxlLDB4ZmZmZiB2aWRlbz1hdXRvX2Rpc2FibGUKIAotVGhlIGlibS1hY3BpIGtlcm5lbCBkcml2ZXIgY2FuIGJlIHByb2dyYW1tZWQgdG8gcmV2ZXJ0IHRoZSBmYW4gbGV2ZWwKLXRvIGEgc2FmZSBzZXR0aW5nIGlmIHVzZXJzcGFjZSBkb2VzIG5vdCBpc3N1ZSBvbmUgb2YgdGhlIGZhbiBjb21tYW5kczoKLSJlbmFibGUiLCAiZGlzYWJsZSIsICJsZXZlbCIgb3IgIndhdGNoZG9nIiB3aXRoaW4gYSBjb25maWd1cmFibGUKLWFtbW91bnQgb2YgdGltZS4gIFRvIGRvIHRoaXMsIHVzZSB0aGUgIndhdGNoZG9nIiBjb21tYW5kLgorRW5hYmxpbmcgZGVidWdnaW5nIG91dHB1dAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0JZWNobyAnd2F0Y2hkb2cgPGludGVydmFsPicgPiAvcHJvYy9hY3BpL2libS9mYW4KK1RoZSBtb2R1bGUgdGFrZXMgYSBkZWJ1ZyBwYXJhbWF0ZXIgd2hpY2ggY2FuIGJlIHVzZWQgdG8gc2VsZWN0aXZlbHkKK2VuYWJsZSB2YXJpb3VzIGNsYXNzZXMgb2YgZGVidWdnaW5nIG91dHB1dCwgZm9yIGV4YW1wbGU6CiAKLUludGVydmFsIGlzIHRoZSBhbW1vdW50IG9mIHRpbWUgaW4gc2Vjb25kcyB0byB3YWl0IGZvciBvbmUgb2YgdGhlCi1hYm92ZSBtZW50aW9uZWQgZmFuIGNvbW1hbmRzIGJlZm9yZSByZXNldGluZyB0aGUgZmFuIGxldmVsIHRvIGEgc2FmZQotb25lLiAgSWYgc2V0IHRvIHplcm8sIHRoZSB3YXRjaGRvZyBpcyBkaXNhYmxlZCAoZGVmYXVsdCkuICBXaGVuIHRoZQotd2F0Y2hkb2cgdGltZXIgcnVucyBvdXQsIGl0IGRvZXMgdGhlIGV4YWN0IGVxdWl2YWxlbnQgb2YgdGhlICJlbmFibGUiCi1mYW4gY29tbWFuZC4KKwkgbW9kcHJvYmUgaWJtX2FjcGkgZGVidWc9MHhmZmZmCiAKLU5vdGUgdGhhdCB0aGUgd2F0Y2hkb2cgdGltZXIgc3RvcHMgYWZ0ZXIgaXQgZW5hYmxlcyB0aGUgZmFuLiAgSXQgd2lsbAotYmUgcmVhcm1lZCBhZ2FpbiBhdXRvbWF0aWNhbGx5ICh1c2luZyB0aGUgc2FtZSBpbnRlcnZhbCkgd2hlbiBvbmUgb2YKLXRoZSBhYm92ZSBtZW50aW9uZWQgZmFuIGNvbW1hbmRzIGlzIHJlY2VpdmVkLiAgVGhlIGZhbiB3YXRjaGRvZyBpcywKLXRoZXJlZm9yZSwgbm90IHN1aXRhYmxlIHRvIHByb3RlY3QgYWdhaW5zdCBmYW4gbW9kZSBjaGFuZ2VzIG1hZGUKLXRocm91Z2ggbWVhbnMgb3RoZXIgdGhhbiB0aGUgImVuYWJsZSIsICJkaXNhYmxlIiwgYW5kICJsZXZlbCIgZmFuCi1jb21tYW5kcy4KK3dpbGwgZW5hYmxlIGFsbCBkZWJ1Z2dpbmcgb3V0cHV0IGNsYXNzZXMuICBJdCB0YWtlcyBhIGJpdG1hc2ssIHNvCit0byBlbmFibGUgbW9yZSB0aGFuIG9uZSBvdXRwdXQgY2xhc3MsIGp1c3QgYWRkIHRoZWlyIHZhbHVlcy4KKworCURlYnVnIGJpdG1hc2sJCURlc2NyaXB0aW9uCisJMHgwMDAxCQkJSW5pdGlhbGl6YXRpb24gYW5kIHByb2JpbmcKKwkweDAwMDIJCQlSZW1vdmFsCisKK1RoZXJlIGlzIGFsc28gYSBrZXJuZWwgYnVpbGQgb3B0aW9uIHRvIGVuYWJsZSBtb3JlIGRlYnVnZ2luZworaW5mb3JtYXRpb24sIHdoaWNoIG1heSBiZSBuZWNlc3NhcnkgdG8gZGVidWcgZHJpdmVyIHByb2JsZW1zLgorCitUaGUgbGV2ZWwgb2YgZGVidWdnaW5nIGluZm9ybWF0aW9uIG91dHB1dCBieSB0aGUgZHJpdmVyIGNhbiBiZSBjaGFuZ2VkCithdCBydW50aW1lIHRocm91Z2ggc3lzZnMsIHVzaW5nIHRoZSBkcml2ZXIgYXR0cmlidXRlIGRlYnVnX2xldmVsLiAgVGhlCithdHRyaWJ1dGUgdGFrZXMgdGhlIHNhbWUgYml0bWFzayBhcyB0aGUgZGVidWcgbW9kdWxlIHBhcmFtZXRlciBhYm92ZS4KKworRm9yY2UgbG9hZGluZyBvZiBtb2R1bGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lmIHRoaW5rcGFkLWFjcGkgcmVmdXNlcyB0byBkZXRlY3QgeW91ciBUaGlua1BhZCwgeW91IGNhbiB0cnkgdG8gc3BlY2lmeQordGhlIG1vZHVsZSBwYXJhbWV0ZXIgZm9yY2VfbG9hZD0xLiAgUmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoaXMgd29ya3Mgb3IKK25vdCwgcGxlYXNlIGNvbnRhY3QgaWJtLWFjcGktZGV2ZWxAbGlzdHMuc291cmNlZm9yZ2UubmV0IHdpdGggYSByZXBvcnQuCiAKIAotRXhhbXBsZSBDb25maWd1cmF0aW9uCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1N5c2ZzIGludGVyZmFjZSBjaGFuZ2Vsb2c6CiAKLVRoZSBBQ1BJIHN1cHBvcnQgaW4gdGhlIGtlcm5lbCBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGluIGNvbmp1bmN0aW9uCi13aXRoIGEgdXNlci1zcGFjZSBkYWVtb24sIGFjcGlkLiBUaGUgY29uZmlndXJhdGlvbiBmaWxlcyBmb3IgdGhpcwotZGFlbW9uIGNvbnRyb2wgd2hhdCBhY3Rpb25zIGFyZSB0YWtlbiBpbiByZXNwb25zZSB0byB2YXJpb3VzIEFDUEkKLWV2ZW50cy4gQW4gZXhhbXBsZSBzZXQgb2YgY29uZmlndXJhdGlvbiBmaWxlcyBhcmUgaW5jbHVkZWQgaW4gdGhlCi1jb25maWcvIGRpcmVjdG9yeSBvZiB0aGUgdGFyYmFsbCBwYWNrYWdlIGF2YWlsYWJsZSBvbiB0aGUgd2ViCi1zaXRlLiBOb3RlIHRoYXQgdGhlc2UgYXJlIHByb3ZpZGVkIGZvciBpbGx1c3RyYXRpb24gcHVycG9zZXMgb25seSBhbmQKLW1heSBuZWVkIHRvIGJlIGFkYXB0ZWQgdG8geW91ciBwYXJ0aWN1bGFyIHNldHVwLgotCi1UaGUgZm9sbG93aW5nIHV0aWxpdHkgc2NyaXB0cyBhcmUgdXNlZCBieSB0aGUgZXhhbXBsZSBhY3Rpb24KLXNjcmlwdHMgKGluY2x1ZGVkIHdpdGggaWJtLWFjcGkgZm9yIGNvbXBsZXRlbmVzcyk6Ci0KLQkvdXNyL2xvY2FsL3NiaW4vaWRlY3RsIC0tIGZyb20gdGhlIGhkcGFybSBzb3VyY2UgZGlzdHJpYnV0aW9uLAotCQlzZWUgaHR0cDovL3d3dy5pYmlibGlvLm9yZy9wdWIvTGludXgvc3lzdGVtL2hhcmR3YXJlCi0JL3Vzci9sb2NhbC9zYmluL2xhcHRvcF9tb2RlIC0tIGZyb20gdGhlIExpbnV4IGtlcm5lbCBzb3VyY2UKLQkJZGlzdHJpYnV0aW9uLCBzZWUgRG9jdW1lbnRhdGlvbi9sYXB0b3AtbW9kZS50eHQKLQkvc2Jpbi9zZXJ2aWNlIC0tIGNvbWVzIHdpdGggUmVkaGF0L0ZlZG9yYSBkaXN0cmlidXRpb25zCi0JL3Vzci9zYmluL2hpYmVybmF0ZSAtLSBmcm9tIHRoZSBTb2Z0d2FyZSBTdXNwZW5kIDIgZGlzdHJpYnV0aW9uLAotCQlzZWUgaHR0cDovL3NvZnR3YXJlc3VzcGVuZC5iZXJsaW9zLmRlLwotCi1Ub2FuIFQgTmd1eWVuIDxudHRAcGh5c2ljcy51Y2xhLmVkdT4gbm90ZXMgdGhhdCBTdXNlIHVzZXMgdGhlCi1wb3dlcnNhdmUgcHJvZ3JhbSB0byBzdXNwZW5kICgncG93ZXJzYXZlIC0tc3VzcGVuZC10by1yYW0nKSBvcgotaGliZXJuYXRlICgncG93ZXJzYXZlIC0tc3VzcGVuZC10by1kaXNrJykuIFRoaXMgbWVhbnMgdGhhdCB0aGUKLWhpYmVybmF0ZSBzY3JpcHQgaXMgbm90IG5lZWRlZCBvbiB0aGF0IGRpc3RyaWJ1dGlvbi4KLQotSGVucmlrIEJyaXggQW5kZXJzZW4gPGJyaXhAZ2VudG9vLm9yZz4gaGFzIHdyaXR0ZW4gYSBHZW50b28gQUNQSSBldmVudAotaGFuZGxlciBzY3JpcHQgZm9yIHRoZSBYMzEuIFlvdSBjYW4gZ2V0IHRoZSBsYXRlc3QgdmVyc2lvbiBmcm9tCi1odHRwOi8vZGV2LmdlbnRvby5vcmcvfmJyaXgvZmlsZXMveDMxLnNoCi0KLURhdmlkIFNjaHdlaWtlcnQgPGR3c0BlZS5ldGguY2g+IGhhcyB3cml0dGVuIGFuIGFsdGVybmF0aXZlIGJsYW5rLnNoCi1zY3JpcHQgd2hpY2ggd29ya3Mgb24gRGViaWFuIHN5c3RlbXMuIFRoaXMgc2NyaXB0cyBoYXMgbm93IGJlZW4KLWV4dGVuZGVkIHRvIGFsc28gd29yayBvbiBGZWRvcmEgc3lzdGVtcyBhbmQgaW5jbHVkZWQgYXMgdGhlIGRlZmF1bHQKLWJsYW5rLnNoIGluIHRoZSBkaXN0cmlidXRpb24uCisweDAwMDEwMDoJSW5pdGlhbCBzeXNmcyBzdXBwb3J0LCBhcyBhIHNpbmdsZSBwbGF0Zm9ybSBkcml2ZXIgYW5kCisJCWRldmljZS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdXNiL3VzYm1vbi50eHQgYi9Eb2N1bWVudGF0aW9uL3VzYi91c2Jtb24udHh0CmluZGV4IDBmNjgwOGEuLjUzYWU4NjZhIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3VzYi91c2Jtb24udHh0CisrKyBiL0RvY3VtZW50YXRpb24vdXNiL3VzYm1vbi50eHQKQEAgLTE2LDcgKzE2LDcgQEAKIAogVW5saWtlIHRoZSBwYWNrZXQgc29ja2V0LCB1c2Jtb24gaGFzIGFuIGludGVyZmFjZSB3aGljaCBwcm92aWRlcyB0cmFjZXMKIGluIGEgdGV4dCBmb3JtYXQuIFRoaXMgaXMgdXNlZCBmb3IgdHdvIHB1cnBvc2VzLiBGaXJzdCwgaXQgc2VydmVzIGFzIGEKLWNvbW1vbiB0cmFjZSBleGNoYW5nZSBmb3JtYXQgZm9yIHRvb2xzIHdoaWxlIG1vc3Qgc29waGlzdGljYXRlZCBmb3JtYXRzCitjb21tb24gdHJhY2UgZXhjaGFuZ2UgZm9ybWF0IGZvciB0b29scyB3aGlsZSBtb3JlIHNvcGhpc3RpY2F0ZWQgZm9ybWF0cwogYXJlIGZpbmFsaXplZC4gU2Vjb25kLCBodW1hbnMgY2FuIHJlYWQgaXQgaW4gY2FzZSB0b29scyBhcmUgbm90IGF2YWlsYWJsZS4KIAogVG8gY29sbGVjdCBhIHJhdyB0ZXh0IHRyYWNlLCBleGVjdXRlIGZvbGxvd2luZyBzdGVwcy4KQEAgLTM0LDcgKzM0LDcgQEAKIFZlcmlmeSB0aGF0IGJ1cyBzb2NrZXRzIGFyZSBwcmVzZW50LgogCiAjIGxzIC9zeXMva2VybmVsL2RlYnVnL3VzYm1vbgotMXMgIDF0ICAycyAgMnQgIDNzICAzdCAgNHMgIDR0CisxcyAgMXQgIDF1ICAycyAgMnQgIDJ1ICAzcyAgM3QgIDN1ICA0cyAgNHQgIDR1CiAjCiAKIDIuIEZpbmQgd2hpY2ggYnVzIGNvbm5lY3RzIHRvIHRoZSBkZXNpcmVkIGRldmljZQpAQCAtNTQsNyArNTQsNyBAQAogCiAzLiBTdGFydCAnY2F0JwogCi0jIGNhdCAvc3lzL2tlcm5lbC9kZWJ1Zy91c2Jtb24vM3QgPiAvdG1wLzEubW9uLm91dAorIyBjYXQgL3N5cy9rZXJuZWwvZGVidWcvdXNibW9uLzN1ID4gL3RtcC8xLm1vbi5vdXQKIAogVGhpcyBwcm9jZXNzIHdpbGwgYmUgcmVhZGluZyB1bnRpbCBraWxsZWQuIE5hdHVyYWxseSwgdGhlIG91dHB1dCBjYW4gYmUKIHJlZGlyZWN0ZWQgdG8gYSBkZXNpcmFibGUgbG9jYXRpb24uIFRoaXMgaXMgcHJlZmVycmVkLCBiZWNhdXNlIGl0IGlzIGdvaW5nCkBAIC03NSw0NiArNzUsODAgQEAKIAogKiBSYXcgdGV4dCBkYXRhIGZvcm1hdAogCi1UaGUgJzF0JyB0eXBlIGRhdGEgY29uc2lzdHMgb2YgYSBzdHJlYW0gb2YgZXZlbnRzLCBzdWNoIGFzIFVSQiBzdWJtaXNzaW9uLAorVHdvIGZvcm1hdHMgYXJlIHN1cHBvcnRlZCBjdXJyZW50bHk6IHRoZSBvcmlnaW5hbCwgb3IgJzF0JyBmb3JtYXQsIGFuZAordGhlICcxdScgZm9ybWF0LiBUaGUgJzF0JyBmb3JtYXQgaXMgZGVwcmVjYXRlZCBpbiBrZXJuZWwgMi42LjIxLiBUaGUgJzF1JworZm9ybWF0IGFkZHMgYSBmZXcgZmllbGRzLCBzdWNoIGFzIElTTyBmcmFtZSBkZXNjcmlwdG9ycywgaW50ZXJ2YWwsIGV0Yy4KK0l0IHByb2R1Y2VzIHNsaWdodGx5IGxvbmdlciBsaW5lcywgYnV0IG90aGVyd2lzZSBpcyBhIHBlcmZlY3Qgc3VwZXJzZXQKK29mICcxdCcgZm9ybWF0LgorCitJZiBpdCBpcyBkZXNpcmVkIHRvIHJlY29nbml6ZSBvbmUgZnJvbSB0aGUgb3RoZXIgaW4gYSBwcm9ncmFtLCBsb29rIGF0IHRoZQorImFkZHJlc3MiIHdvcmQgKHNlZSBiZWxvdyksIHdoZXJlICcxdScgZm9ybWF0IGFkZHMgYSBidXMgbnVtYmVyLiBJZiAyIGNvbG9ucworYXJlIHByZXNlbnQsIGl0J3MgdGhlICcxdCcgZm9ybWF0LCBvdGhlcndpc2UgJzF1Jy4KKworQW55IHRleHQgZm9ybWF0IGRhdGEgY29uc2lzdHMgb2YgYSBzdHJlYW0gb2YgZXZlbnRzLCBzdWNoIGFzIFVSQiBzdWJtaXNzaW9uLAogVVJCIGNhbGxiYWNrLCBzdWJtaXNzaW9uIGVycm9yLiBFdmVyeSBldmVudCBpcyBhIHRleHQgbGluZSwgd2hpY2ggY29uc2lzdHMKIG9mIHdoaXRlc3BhY2Ugc2VwYXJhdGVkIHdvcmRzLiBUaGUgbnVtYmVyIG9yIHBvc2l0aW9uIG9mIHdvcmRzIG1heSBkZXBlbmQKIG9uIHRoZSBldmVudCB0eXBlLCBidXQgdGhlcmUgaXMgYSBzZXQgb2Ygd29yZHMsIGNvbW1vbiBmb3IgYWxsIHR5cGVzLgogCiBIZXJlIGlzIHRoZSBsaXN0IG9mIHdvcmRzLCBmcm9tIGxlZnQgdG8gcmlnaHQ6CisKIC0gVVJCIFRhZy4gVGhpcyBpcyB1c2VkIHRvIGlkZW50aWZ5IFVSQnMgaXMgbm9ybWFsbHkgYSBrZXJuZWwgbW9kZSBhZGRyZXNzCiAgb2YgdGhlIFVSQiBzdHJ1Y3R1cmUgaW4gaGV4YWRlY2ltYWwuCisKIC0gVGltZXN0YW1wIGluIG1pY3Jvc2Vjb25kcywgYSBkZWNpbWFsIG51bWJlci4gVGhlIHRpbWVzdGFtcCdzIHJlc29sdXRpb24KICAgZGVwZW5kcyBvbiBhdmFpbGFibGUgY2xvY2ssIGFuZCBzbyBpdCBjYW4gYmUgbXVjaCB3b3JzZSB0aGFuIGEgbWljcm9zZWNvbmQKICAgKGlmIHRoZSBpbXBsZW1lbnRhdGlvbiB1c2VzIGppZmZpZXMsIGZvciBleGFtcGxlKS4KKwogLSBFdmVudCBUeXBlLiBUaGlzIHR5cGUgcmVmZXJzIHRvIHRoZSBmb3JtYXQgb2YgdGhlIGV2ZW50LCBub3QgVVJCIHR5cGUuCiAgIEF2YWlsYWJsZSB0eXBlcyBhcmU6IFMgLSBzdWJtaXNzaW9uLCBDIC0gY2FsbGJhY2ssIEUgLSBzdWJtaXNzaW9uIGVycm9yLgotLSAiUGlwZSIuIFRoZSBwaXBlIGNvbmNlcHQgaXMgZGVwcmVjYXRlZC4gVGhpcyBpcyBhIGNvbXBvc2l0ZSB3b3JkLCB1c2VkIHRvCi0gIGJlIGRlcml2ZWQgZnJvbSBpbmZvcm1hdGlvbiBpbiBwaXBlcy4gSXQgY29uc2lzdHMgb2YgdGhyZWUgZmllbGRzLCBzZXBhcmF0ZWQKLSAgYnkgY29sb25zOiBVUkIgdHlwZSBhbmQgZGlyZWN0aW9uLCBEZXZpY2UgYWRkcmVzcywgRW5kcG9pbnQgbnVtYmVyLgorCistICJBZGRyZXNzIiB3b3JkIChmb3JtZXJseSBhICJwaXBlIikuIEl0IGNvbnNpc3RzIG9mIGZvdXIgZmllbGRzLCBzZXBhcmF0ZWQgYnkKKyAgY29sb25zOiBVUkIgdHlwZSBhbmQgZGlyZWN0aW9uLCBCdXMgbnVtYmVyLCBEZXZpY2UgYWRkcmVzcywgRW5kcG9pbnQgbnVtYmVyLgogICBUeXBlIGFuZCBkaXJlY3Rpb24gYXJlIGVuY29kZWQgd2l0aCB0d28gYnl0ZXMgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXI6CiAgICAgQ2kgQ28gICBDb250cm9sIGlucHV0IGFuZCBvdXRwdXQKICAgICBaaSBabyAgIElzb2Nocm9ub3VzIGlucHV0IGFuZCBvdXRwdXQKICAgICBJaSBJbyAgIEludGVycnVwdCBpbnB1dCBhbmQgb3V0cHV0CiAgICAgQmkgQm8gICBCdWxrIGlucHV0IGFuZCBvdXRwdXQKLSAgRGV2aWNlIGFkZHJlc3MgYW5kIEVuZHBvaW50IG51bWJlciBhcmUgMy1kaWdpdCBhbmQgMi1kaWdpdCAocmVzcGVjdGl2ZWx5KQotICBkZWNpbWFsIG51bWJlcnMsIHdpdGggbGVhZGluZyB6ZXJvZXMuCi0tIFVSQiBTdGF0dXMuIEluIG1vc3QgY2FzZXMsIHRoaXMgZmllbGQgY29udGFpbnMgYSBudW1iZXIsIHNvbWV0aW1lcyBuZWdhdGl2ZSwKLSAgd2hpY2ggcmVwcmVzZW50cyBhICJzdGF0dXMiIGZpZWxkIG9mIHRoZSBVUkIuIFRoaXMgZmllbGQgbWFrZXMgbm8gc2Vuc2UgZm9yCi0gIHN1Ym1pc3Npb25zLCBidXQgaXMgcHJlc2VudCBhbnl3YXkgdG8gaGVscCBzY3JpcHRzIHdpdGggcGFyc2luZy4gV2hlbiBhbgotICBlcnJvciBvY2N1cnMsIHRoZSBmaWVsZCBjb250YWlucyB0aGUgZXJyb3IgY29kZS4gSW4gY2FzZSBvZiBhIHN1Ym1pc3Npb24gb2YKLSAgYSBDb250cm9sIHBhY2tldCwgdGhpcyBmaWVsZCBjb250YWlucyBhIFNldHVwIFRhZyBpbnN0ZWFkIG9mIGFuIGVycm9yIGNvZGUuCi0gIEl0IGlzIGVhc3kgdG8gdGVsbCB3aGV0aGVyIHRoZSBTZXR1cCBUYWcgaXMgcHJlc2VudCBiZWNhdXNlIGl0IGlzIG5ldmVyIGEKLSAgbnVtYmVyLiBUaHVzIGlmIHNjcmlwdHMgZmluZCBhIG51bWJlciBpbiB0aGlzIGZpZWxkLCB0aGV5IHByb2NlZWQgdG8gcmVhZAotICBEYXRhIExlbmd0aC4gSWYgdGhleSBmaW5kIHNvbWV0aGluZyBlbHNlLCBsaWtlIGEgbGV0dGVyLCB0aGV5IHJlYWQgdGhlIHNldHVwCi0gIHBhY2tldCBiZWZvcmUgcmVhZGluZyB0aGUgRGF0YSBMZW5ndGguCisgIEJ1cyBudW1iZXIsIERldmljZSBhZGRyZXNzLCBhbmQgRW5kcG9pbnQgYXJlIGRlY2ltYWwgbnVtYmVycywgYnV0IHRoZXkgbWF5CisgIGhhdmUgbGVhZGluZyB6ZXJvcywgZm9yIHRoZSBzYWtlIG9mIGh1bWFuIHJlYWRlcnMuCisKKy0gVVJCIFN0YXR1cyB3b3JkLiBUaGlzIGlzIGVpdGhlciBhIGxldHRlciwgb3Igc2V2ZXJhbCBudW1iZXJzIHNlcGFyYXRlZAorICBieSBjb2xvbnM6IFVSQiBzdGF0dXMsIGludGVydmFsLCBzdGFydCBmcmFtZSwgYW5kIGVycm9yIGNvdW50LiBVbmxpa2UgdGhlCisgICJhZGRyZXNzIiB3b3JkLCBhbGwgZmllbGRzIHNhdmUgdGhlIHN0YXR1cyBhcmUgb3B0aW9uYWwuIEludGVydmFsIGlzIHByaW50ZWQKKyAgb25seSBmb3IgaW50ZXJydXB0IGFuZCBpc29jaHJvbm91cyBVUkJzLiBTdGFydCBmcmFtZSBpcyBwcmludGVkIG9ubHkgZm9yCisgIGlzb2Nocm9ub3VzIFVSQnMuIEVycm9yIGNvdW50IGlzIHByaW50ZWQgb25seSBmb3IgaXNvY2hyb25vdXMgY2FsbGJhY2sKKyAgZXZlbnRzLgorCisgIFRoZSBzdGF0dXMgZmllbGQgaXMgYSBkZWNpbWFsIG51bWJlciwgc29tZXRpbWVzIG5lZ2F0aXZlLCB3aGljaCByZXByZXNlbnRzCisgIGEgInN0YXR1cyIgZmllbGQgb2YgdGhlIFVSQi4gVGhpcyBmaWVsZCBtYWtlcyBubyBzZW5zZSBmb3Igc3VibWlzc2lvbnMsIGJ1dAorICBpcyBwcmVzZW50IGFueXdheSB0byBoZWxwIHNjcmlwdHMgd2l0aCBwYXJzaW5nLiBXaGVuIGFuIGVycm9yIG9jY3VycywgdGhlCisgIGZpZWxkIGNvbnRhaW5zIHRoZSBlcnJvciBjb2RlLgorCisgIEluIGNhc2Ugb2YgYSBzdWJtaXNzaW9uIG9mIGEgQ29udHJvbCBwYWNrZXQsIHRoaXMgZmllbGQgY29udGFpbnMgYSBTZXR1cCBUYWcKKyAgaW5zdGVhZCBvZiBhbiBncm91cCBvZiBudW1iZXJzLiBJdCBpcyBlYXN5IHRvIHRlbGwgd2hldGhlciB0aGUgU2V0dXAgVGFnIGlzCisgIHByZXNlbnQgYmVjYXVzZSBpdCBpcyBuZXZlciBhIG51bWJlci4gVGh1cyBpZiBzY3JpcHRzIGZpbmQgYSBzZXQgb2YgbnVtYmVycworICBpbiB0aGlzIHdvcmQsIHRoZXkgcHJvY2VlZCB0byByZWFkIERhdGEgTGVuZ3RoIChleGNlcHQgZm9yIGlzb2Nocm9ub3VzIFVSQnMpLgorICBJZiB0aGV5IGZpbmQgc29tZXRoaW5nIGVsc2UsIGxpa2UgYSBsZXR0ZXIsIHRoZXkgcmVhZCB0aGUgc2V0dXAgcGFja2V0IGJlZm9yZQorICByZWFkaW5nIHRoZSBEYXRhIExlbmd0aCBvciBpc29jaHJvbm91cyBkZXNjcmlwdG9ycy4KKwogLSBTZXR1cCBwYWNrZXQsIGlmIHByZXNlbnQsIGNvbnNpc3RzIG9mIDUgd29yZHM6IG9uZSBvZiBlYWNoIGZvciBibVJlcXVlc3RUeXBlLAogICBiUmVxdWVzdCwgd1ZhbHVlLCB3SW5kZXgsIHdMZW5ndGgsIGFzIHNwZWNpZmllZCBieSB0aGUgVVNCIFNwZWNpZmljYXRpb24gMi4wLgogICBUaGVzZSB3b3JkcyBhcmUgc2FmZSB0byBkZWNvZGUgaWYgU2V0dXAgVGFnIHdhcyAncycuIE90aGVyd2lzZSwgdGhlIHNldHVwCiAgIHBhY2tldCB3YXMgcHJlc2VudCwgYnV0IG5vdCBjYXB0dXJlZCwgYW5kIHRoZSBmaWVsZHMgY29udGFpbiBmaWxsZXIuCisKKy0gTnVtYmVyIG9mIGlzb2Nocm9ub3VzIGZyYW1lIGRlc2NyaXB0b3JzIGFuZCBkZXNjcmlwdG9ycyB0aGVtc2VsdmVzLgorICBJZiBhbiBJc29jaHJvbm91cyB0cmFuc2ZlciBldmVudCBoYXMgYSBzZXQgb2YgZGVzY3JpcHRvcnMsIGEgdG90YWwgbnVtYmVyCisgIG9mIHRoZW0gaW4gYW4gVVJCIGlzIHByaW50ZWQgZmlyc3QsIHRoZW4gYSB3b3JkIHBlciBkZXNjcmlwdG9yLCB1cCB0byBhCisgIHRvdGFsIG9mIDUuIFRoZSB3b3JkIGNvbnNpc3RzIG9mIDMgY29sb24tc2VwYXJhdGVkIGRlY2ltYWwgbnVtYmVycyBmb3IKKyAgc3RhdHVzLCBvZmZzZXQsIGFuZCBsZW5ndGggcmVzcGVjdGl2ZWx5LiBGb3Igc3VibWlzc2lvbnMsIGluaXRpYWwgbGVuZ3RoCisgIGlzIHJlcG9ydGVkLiBGb3IgY2FsbGJhY2tzLCBhY3R1YWwgbGVuZ3RoIGlzIHJlcG9ydGVkLgorCiAtIERhdGEgTGVuZ3RoLiBGb3Igc3VibWlzc2lvbnMsIHRoaXMgaXMgdGhlIHJlcXVlc3RlZCBsZW5ndGguIEZvciBjYWxsYmFja3MsCiAgIHRoaXMgaXMgdGhlIGFjdHVhbCBsZW5ndGguCisKIC0gRGF0YSB0YWcuIFRoZSB1c2Jtb24gbWF5IG5vdCBhbHdheXMgY2FwdHVyZSBkYXRhLCBldmVuIGlmIGxlbmd0aCBpcyBub256ZXJvLgogICBUaGUgZGF0YSB3b3JkcyBhcmUgcHJlc2VudCBvbmx5IGlmIHRoaXMgdGFnIGlzICc9Jy4KKwogLSBEYXRhIHdvcmRzIGZvbGxvdywgaW4gYmlnIGVuZGlhbiBoZXhhZGVjaW1hbCBmb3JtYXQuIE5vdGljZSB0aGF0IHRoZXkgYXJlCiAgIG5vdCBtYWNoaW5lIHdvcmRzLCBidXQgcmVhbGx5IGp1c3QgYSBieXRlIHN0cmVhbSBzcGxpdCBpbnRvIHdvcmRzIHRvIG1ha2UKICAgaXQgZWFzaWVyIHRvIHJlYWQuIFRodXMsIHRoZSBsYXN0IHdvcmQgbWF5IGNvbnRhaW4gZnJvbSBvbmUgdG8gZm91ciBieXRlcy4KQEAgLTE1MywyMCArMTg3LDE4IEBACiAJfQogfQogCi1UaGlzIGZvcm1hdCBtYXkgYmUgY2hhbmdlZCBpbiB0aGUgZnV0dXJlLgotCiBFeGFtcGxlczoKIAogQW4gaW5wdXQgY29udHJvbCB0cmFuc2ZlciB0byBnZXQgYSBwb3J0IHN0YXR1cy4KIAotZDVlYTg5YTAgMzU3NTkxNDU1NSBTIENpOjAwMTowMCBzIGEzIDAwIDAwMDAgMDAwMyAwMDA0IDQgPAotZDVlYTg5YTAgMzU3NTkxNDU2MCBDIENpOjAwMTowMCAwIDQgPSAwMTA1MDAwMAorZDVlYTg5YTAgMzU3NTkxNDU1NSBTIENpOjE6MDAxOjAgcyBhMyAwMCAwMDAwIDAwMDMgMDAwNCA0IDwKK2Q1ZWE4OWEwIDM1NzU5MTQ1NjAgQyBDaToxOjAwMTowIDAgNCA9IDAxMDUwMDAwCiAKIEFuIG91dHB1dCBidWxrIHRyYW5zZmVyIHRvIHNlbmQgYSBTQ1NJIGNvbW1hbmQgMHg1RSBpbiBhIDMxLWJ5dGUgQnVsayB3cmFwcGVyCiB0byBhIHN0b3JhZ2UgZGV2aWNlIGF0IGFkZHJlc3MgNToKIAotZGQ2NWYwZTggNDEyODM3OTc1MiBTIEJvOjAwNTowMiAtMTE1IDMxID0gNTU1MzQyNDMgNWUwMDAwMDAgMDAwMDAwMDAgMDAwMDA2MDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwCi1kZDY1ZjBlOCA0MTI4Mzc5ODA4IEMgQm86MDA1OjAyIDAgMzEgPgorZGQ2NWYwZTggNDEyODM3OTc1MiBTIEJvOjE6MDA1OjIgLTExNSAzMSA9IDU1NTM0MjQzIDVlMDAwMDAwIDAwMDAwMDAwIDAwMDAwNjAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMAorZGQ2NWYwZTggNDEyODM3OTgwOCBDIEJvOjE6MDA1OjIgMCAzMSA+CiAKICogUmF3IGJpbmFyeSBmb3JtYXQgYW5kIEFQSQogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULmJ0dHYgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULmJ0dHYKaW5kZXggZmMyZmU5Yi4uYjYwNjM5MSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5idHR2CisrKyBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1QuYnR0dgpAQCAtMTQzLDMgKzE0Myw1IEBACiAxNDIgLT4gU2FicmVudCBUVi1GTSAoYnR0diB2ZXJzaW9uKQogMTQzIC0+IEhhdXBwYXVnZSBJbXBhY3RWQ0IgKGJ0ODc4KSAgICAgICAgICAgICAgICAgICAgICAgICBbMDA3MDoxM2ViXQogMTQ0IC0+IE1hZ2ljVFYKKzE0NSAtPiBTU0FJIFNlY3VyaXR5IFZpZGVvIEludGVyZmFjZSAgICAgICAgICAgICAgICAgICAgICAgWzQxNDk6NTM1M10KKzE0NiAtPiBTU0FJIFVsdHJhc291bmQgVmlkZW8gSW50ZXJmYWNlICAgICAgICAgICAgICAgICAgICAgWzQxNGE6NTM1M10KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1QuY3g4OCBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1QuY3g4OAppbmRleCA2MmUzMmI0Li42MGY4MzhiIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULmN4ODgKKysrIGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5jeDg4CkBAIC0zNyw3ICszNyw3IEBACiAgMzYgLT4gQVZlclRWIDMwMyAoTTEyNikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsxNDYxOjAwMGFdCiAgMzcgLT4gSGF1cHBhdWdlIE5vdmEtUy1QbHVzIERWQi1TICAgICAgICAgICAgICAgICAgICAgICAgIFswMDcwOjkyMDEsMDA3MDo5MjAyXQogIDM4IC0+IEhhdXBwYXVnZSBOb3ZhLVNFMiBEVkItUyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMDA3MDo5MjAwXQotIDM5IC0+IEtXb3JsZCBEVkItUyAxMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMTdkZTowOGIyXQorIDM5IC0+IEtXb3JsZCBEVkItUyAxMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMTdkZTowOGIyLDE0MjE6MDM0MV0KICA0MCAtPiBIYXVwcGF1Z2UgV2luVFYtSFZSMTEwMCBEVkItVC9IeWJyaWQgICAgICAgICAgICAgICAgWzAwNzA6OTQwMCwwMDcwOjk0MDJdCiAgNDEgLT4gSGF1cHBhdWdlIFdpblRWLUhWUjExMDAgRFZCLVQvSHlicmlkIChMb3cgUHJvZmlsZSkgIFswMDcwOjk4MDAsMDA3MDo5ODAyXQogIDQyIC0+IGRpZ2l0YWxub3cgRE5UViBMaXZlISBEVkItVCBQcm8gICAgICAgICAgICAgICAgICAgICBbMTgyMjowMDI1LDE4MjI6MDAxOV0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1QuaXZ0diBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1QuaXZ0dgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGQ3NmEwCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5pdnR2CkBAIC0wLDAgKzEsMTggQEAKKyAxIC0+IEhhdXBwYXVnZSBXaW5UViBQVlItMjUwCisgMiAtPiBIYXVwcGF1Z2UgV2luVFYgUFZSLTM1MAorIDMgLT4gSGF1cHBhdWdlIFdpblRWIFBWUi0xNTAgb3IgUFZSLTUwMAorIDQgLT4gQVZlck1lZGlhIE0xNzkgCQkJCVsxNDYxOmEzY2UsMTQ2MTphM2NmXQorIDUgLT4gWXVhbiBNUEc2MDAvS3Vyb3V0b3NoaWtvdSBpVFZDMTYtU1RWTFAgCVsxMmFiOmZmZjMsMTJhYjpmZmZmXQorIDYgLT4gWXVhbiBNUEcxNjAvS3Vyb3V0b3NoaWtvdSBpVFZDMTUtU1RWTFAgCVsxMmFiOjAwMDAsMTBmYzo0MGEwXQorIDcgLT4gWXVhbiBQRzYwMC9EaWFtb25kTU0gUFZSLTU1MCAJCVtmZjkyOjAwNzAsZmZhYjowNjAwXQorIDggLT4gQWRhcHRlYyBBVkMtMjQxMCAJCQkJWzkwMDU6MDA5M10KKyA5IC0+IEFkYXB0ZWMgQVZDLTIwMTAgCQkJCVs5MDA1OjAwOTJdCisxMCAtPiBOQUdBU0UgVFJBTlNHRUFSIDUwMDBUViAJCQlbMTQ2MTpiZmZmXQorMTEgLT4gQU9wZW4gVkEyMDAwTUFYLVNUTjYgCQkJWzAwMDA6ZmY1Zl0KKzEyIC0+IFlVQU4gTVBHNjAwR1IvS3Vyb3V0b3NoaWtvdSBDWDIzNDE2R1lDLVNUVkxQIFsxMmFiOjA2MDAsZmJhYjowNjAwLDExNTQ6MDUyM10KKzEzIC0+IEkvTyBEYXRhIEdWLU1WUC9SWCAJCQlbMTBmYzpkMDFlLDEwZmM6ZDAzOCwxMGZjOmQwMzldCisxNCAtPiBJL08gRGF0YSBHVi1NVlAvUlgyRSAJCQlbMTBmYzpkMDI1XQorMTUgLT4gR09UVklFVyBQQ0kgRFZEIChwYXJ0aWFsIHN1cHBvcnQgb25seSkgCVsxMmFiOjA2MDBdCisxNiAtPiBHT1RWSUVXIFBDSSBEVkQyIERlbHV4ZSAJCQlbZmZhYzowNjAwXQorMTcgLT4gWXVhbiBNUEM2MjIgCQkJCVtmZjAxOmQ5OThdCisxOCAtPiBEaWdpdGFsIENvd2JveSBEQ1QtTVRWUDEgCQkJWzE0NjE6YmZmZl0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1Quc2FhNzEzNCBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1Quc2FhNzEzNAppbmRleCBhMTIyNDZhLi5kN2JiMmUyIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULnNhYTcxMzQKKysrIGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5zYWE3MTM0CkBAIC01Myw3ICs1Myw3IEBACiAgNTIgLT4gQXZlck1lZGlhIEF2ZXJUVi8zMDUgICAgICAgICAgICAgICAgICAgICBbMTQ2MToyMTA4XQogIDUzIC0+IEFTVVMgVFYtRk0gNzEzNSAgICAgICAgICAgICAgICAgICAgICAgICAgWzEwNDM6NDg0NV0KICA1NCAtPiBMaWZlVmlldyBGbHlUViBQbGF0aW51bSBGTSAvIEdvbGQgICAgICAgIFs1MTY4OjAyMTQsMTQ4OTowMjE0LDUxNjg6MDMwNF0KLSA1NSAtPiBMaWZlVmlldyBGbHlEVkItVCBEVU8gICAgICAgICAgICAgICAgICAgIFs1MTY4OjAzMDZdCisgNTUgLT4gTGlmZVZpZXcgRmx5RFZCLVQgRFVPIC8gTVNJIFRWQG55d2hlcmUgRHVvIFs1MTY4OjAzMDYsNEU0MjowMzA2XQogIDU2IC0+IEF2ZXJtZWRpYSBBVmVyVFYgMzA3ICAgICAgICAgICAgICAgICAgICAgWzE0NjE6YTcwYV0KICA1NyAtPiBBdmVybWVkaWEgQVZlclRWIEdPIDAwNyBGTSAgICAgICAgICAgICAgIFsxNDYxOmYzMWZdCiAgNTggLT4gQURTIFRlY2ggSW5zdGFudCBUViAoc2FhNzEzNSkgICAgICAgICAgICBbMTQyMTowMzUwLDE0MjE6MDM1MSwxNDIxOjAzNzAsMTQyMToxMzcwXQpAQCAtNzYsNyArNzYsNyBAQAogIDc1IC0+IEFWZXJNZWRpYSBBVmVyVFZIRCBNQ0UgQTE4MCAgICAgICAgICAgICAgWzE0NjE6MTA0NF0KICA3NiAtPiBTS05ldCBNb25zdGVyVFYgTW9iaWxlICAgICAgICAgICAgICAgICAgIFsxMTMxOjRlZTldCiAgNzcgLT4gUGlubmFjbGUgUENUViA0MGkvNTBpLzExMGkgKHNhYTcxMzMpICAgICBbMTFiZDowMDJlXQotIDc4IC0+IEFTVVNUZUsgUDcxMzEgRHVhbCAgICAgICAgICAgICAgICAgICAgICAgWzEwNDM6NDg2MiwxMDQzOjQ4NzZdCisgNzggLT4gQVNVU1RlSyBQNzEzMSBEdWFsICAgICAgICAgICAgICAgICAgICAgICBbMTA0Mzo0ODYyLDEwNDM6NDg1N10KICA3OSAtPiBTZWRuYS9NdWNoVFYgUEMgVFYgQ2FyZGJ1cyBUVi9SYWRpbyAoSVRPMjUgUmV2OjJCKQogIDgwIC0+IEFTVVMgRGlnaW1hdHJpeCBUViAgICAgICAgICAgICAgICAgICAgICAgWzEwNDM6MDIxMF0KICA4MSAtPiBQaGlsaXBzIFRpZ2VyIHJlZmVyZW5jZSBkZXNpZ24gICAgICAgICAgIFsxMTMxOjIwMThdCkBAIC0xMDcsMyArMTA3LDcgQEAKIDEwNiAtPiBFbmNvcmUgRU5MVFYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsxMTMxOjIzNDIsMTEzMToyMzQxLDMwMTY6MjM0NF0KIDEwNyAtPiBFbmNvcmUgRU5MVFYtRk0gICAgICAgICAgICAgICAgICAgICAgICAgIFsxMTMxOjIzMGZdCiAxMDggLT4gVGVycmF0ZWMgQ2luZXJneSBIVCBQQ0kgICAgICAgICAgICAgICAgICBbMTUzYjoxMTc1XQorMTA5IC0+IFBoaWxpcHMgVGlnZXIgLSBTIFJlZmVyZW5jZSBkZXNpZ24KKzExMCAtPiBBdmVybWVkaWEgTTEwMiAgICAgICAgICAgICAgICAgICAgICAgICAgIFsxNDYxOmYzMWVdCisxMTEgLT4gQVNVUyBQNzEzMSA0ODcxICAgICAgICAgICAgICAgICAgICAgICAgICBbMTA0Mzo0ODcxXQorMTEyIC0+IEFTVVNUZUsgUDcxMzEgSHlicmlkICAgICAgICAgICAgICAgICAgICAgWzEwNDM6NDg3Nl0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1QudXNidmlzaW9uIGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC51c2J2aXNpb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q2ODUwZQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1QudXNidmlzaW9uCkBAIC0wLDAgKzEsNjQgQEAKKyAgMCAtPiBYYW5ib28gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMGE2ZjowNDAwXQorICAxIC0+IEJlbGtpbiBVU0IgVmlkZW9CdXMgSUkgQWRhcHRlciAgICAgICAgICAgICAgICAgICAgICAgICAgIFswNTBkOjAxMDZdCisgIDIgLT4gQmVsa2luIENvbXBvbmVudHMgVVNCIFZpZGVvQnVzICAgICAgICAgICAgICAgICAgICAgICAgICAgWzA1MGQ6MDIwN10KKyAgMyAtPiBCZWxraW4gVVNCIFZpZGVvQnVzIElJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMDUwZDowMjA4XQorICA0IC0+IGVjaG9GWCBJbnRlclZpZXcgTGl0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFswNTcxOjAwMDJdCisgIDUgLT4gVVNCR2VhciBVU0JHLVYxIHJlc3AuIEhBTUEgVVNCICAgICAgICAgICAgICAgICAgICAgICAgICAgWzA1NzM6MDAwM10KKyAgNiAtPiBELUxpbmsgVjEwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMDU3MzowNDAwXQorICA3IC0+IFgxMCBVU0IgQ2FtZXJhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFswNTczOjIwMDBdCisgIDggLT4gSGF1cHBhdWdlIFdpblRWIFVTQiBMaXZlIChQQUwgQi9HKSAgICAgICAgICAgICAgICAgICAgICAgWzA1NzM6MmQwMF0KKyAgOSAtPiBIYXVwcGF1Z2UgV2luVFYgVVNCIExpdmUgUHJvIChOVFNDIE0vTikgICAgICAgICAgICAgICAgICBbMDU3MzoyZDAxXQorIDEwIC0+IFpvcmFuIENvLiBQTUQgKE5vZ2F0ZWNoKSBBVi1ncmFiYmVyIE1hbmhhdHRhbiAgICAgICAgICAgIFswNTczOjIxMDFdCisgMTEgLT4gTm9nYXRlY2ggVVNCLVRWIChOVFNDKSBGTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzA1NzM6NDEwMF0KKyAxMiAtPiBQTlkgVVNCLVRWIChOVFNDKSBGTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMDU3Mzo0MTEwXQorIDEzIC0+IFBpeGVsVmlldyBQbGF5VHYtVVNCIFBSTyAoUEFMKSBGTSAgICAgICAgICAgICAgICAgICAgICAgIFswNTczOjQ0NTBdCisgMTQgLT4gWlRWIFpULTcyMSAyLjRHSHogVVNCIEEvViBSZWNlaXZlciAgICAgICAgICAgICAgICAgICAgICAgWzA1NzM6NDU1MF0KKyAxNSAtPiBIYXVwcGF1Z2UgV2luVFYgVVNCIChOVFNDIE0vTikgICAgICAgICAgICAgICAgICAgICAgICAgICBbMDU3Mzo0ZDAwXQorIDE2IC0+IEhhdXBwYXVnZSBXaW5UViBVU0IgKFBBTCBCL0cpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFswNTczOjRkMDFdCisgMTcgLT4gSGF1cHBhdWdlIFdpblRWIFVTQiAoUEFMIEkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzA1NzM6NGQwMl0KKyAxOCAtPiBIYXVwcGF1Z2UgV2luVFYgVVNCIChQQUwvU0VDQU0gTCkgICAgICAgICAgICAgICAgICAgICAgICBbMDU3Mzo0ZDAzXQorIDE5IC0+IEhhdXBwYXVnZSBXaW5UViBVU0IgKFBBTCBEL0spICAgICAgICAgICAgICAgICAgICAgICAgICAgIFswNTczOjRkMDRdCisgMjAgLT4gSGF1cHBhdWdlIFdpblRWIFVTQiAoTlRTQyBGTSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzA1NzM6NGQxMF0KKyAyMSAtPiBIYXVwcGF1Z2UgV2luVFYgVVNCIChQQUwgQi9HIEZNKSAgICAgICAgICAgICAgICAgICAgICAgICBbMDU3Mzo0ZDExXQorIDIyIC0+IEhhdXBwYXVnZSBXaW5UViBVU0IgKFBBTCBJIEZNKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFswNTczOjRkMTJdCisgMjMgLT4gSGF1cHBhdWdlIFdpblRWIFVTQiAoUEFMIEQvSyBGTSkgICAgICAgICAgICAgICAgICAgICAgICAgWzA1NzM6NGQxNF0KKyAyNCAtPiBIYXVwcGF1Z2UgV2luVFYgVVNCIFBybyAoTlRTQyBNL04pICAgICAgICAgICAgICAgICAgICAgICBbMDU3Mzo0ZDJhXQorIDI1IC0+IEhhdXBwYXVnZSBXaW5UViBVU0IgUHJvIChOVFNDIE0vTikgVjIgICAgICAgICAgICAgICAgICAgIFswNTczOjRkMmJdCisgMjYgLT4gSGF1cHBhdWdlIFdpblRWIFVTQiBQcm8gKFBBTC9TRUNBTSBCL0cvSS9EL0svTCkgICAgICAgICAgWzA1NzM6NGQyY10KKyAyNyAtPiBIYXVwcGF1Z2UgV2luVFYgVVNCIFBybyAoTlRTQyBNL04pIFYzICAgICAgICAgICAgICAgICAgICBbMDU3Mzo0ZDIwXQorIDI4IC0+IEhhdXBwYXVnZSBXaW5UViBVU0IgUHJvIChQQUwgQi9HKSAgICAgICAgICAgICAgICAgICAgICAgIFswNTczOjRkMjFdCisgMjkgLT4gSGF1cHBhdWdlIFdpblRWIFVTQiBQcm8gKFBBTCBJKSAgICAgICAgICAgICAgICAgICAgICAgICAgWzA1NzM6NGQyMl0KKyAzMCAtPiBIYXVwcGF1Z2UgV2luVFYgVVNCIFBybyAoUEFML1NFQ0FNIEwpICAgICAgICAgICAgICAgICAgICBbMDU3Mzo0ZDIzXQorIDMxIC0+IEhhdXBwYXVnZSBXaW5UViBVU0IgUHJvIChQQUwgRC9LKSAgICAgICAgICAgICAgICAgICAgICAgIFswNTczOjRkMjRdCisgMzIgLT4gSGF1cHBhdWdlIFdpblRWIFVTQiBQcm8gKFBBTC9TRUNBTSBCR0RLL0kvTCkgICAgICAgICAgICAgWzA1NzM6NGQyNV0KKyAzMyAtPiBIYXVwcGF1Z2UgV2luVFYgVVNCIFBybyAoUEFML1NFQ0FNIEJHREsvSS9MKSBWMiAgICAgICAgICBbMDU3Mzo0ZDI2XQorIDM0IC0+IEhhdXBwYXVnZSBXaW5UViBVU0IgUHJvIChQQUwgQi9HKSBWMiAgICAgICAgICAgICAgICAgICAgIFswNTczOjRkMjddCisgMzUgLT4gSGF1cHBhdWdlIFdpblRWIFVTQiBQcm8gKFBBTCBCL0csRC9LKSAgICAgICAgICAgICAgICAgICAgWzA1NzM6NGQyOF0KKyAzNiAtPiBIYXVwcGF1Z2UgV2luVFYgVVNCIFBybyAoUEFMIEksRC9LKSAgICAgICAgICAgICAgICAgICAgICBbMDU3Mzo0ZDI5XQorIDM3IC0+IEhhdXBwYXVnZSBXaW5UViBVU0IgUHJvIChOVFNDIE0vTiBGTSkgICAgICAgICAgICAgICAgICAgIFswNTczOjRkMzBdCisgMzggLT4gSGF1cHBhdWdlIFdpblRWIFVTQiBQcm8gKFBBTCBCL0cgRk0pICAgICAgICAgICAgICAgICAgICAgWzA1NzM6NGQzMV0KKyAzOSAtPiBIYXVwcGF1Z2UgV2luVFYgVVNCIFBybyAoUEFMIEkgRk0pICAgICAgICAgICAgICAgICAgICAgICBbMDU3Mzo0ZDMyXQorIDQwIC0+IEhhdXBwYXVnZSBXaW5UViBVU0IgUHJvIChQQUwgRC9LIEZNKSAgICAgICAgICAgICAgICAgICAgIFswNTczOjRkMzRdCisgNDEgLT4gSGF1cHBhdWdlIFdpblRWIFVTQiBQcm8gKFRlbWljIFBBTC9TRUNBTSBCL0cvSS9EL0svTCBGTSkgWzA1NzM6NGQzNV0KKyA0MiAtPiBIYXVwcGF1Z2UgV2luVFYgVVNCIFBybyAoVGVtaWMgUEFMIEIvRyBGTSkgICAgICAgICAgICAgICBbMDU3Mzo0ZDM2XQorIDQzIC0+IEhhdXBwYXVnZSBXaW5UViBVU0IgUHJvIChQQUwvU0VDQU0gQi9HL0kvRC9LL0wgRk0pICAgICAgIFswNTczOjRkMzddCisgNDQgLT4gSGF1cHBhdWdlIFdpblRWIFVTQiBQcm8gKE5UU0MgTS9OIEZNKSBWMiAgICAgICAgICAgICAgICAgWzA1NzM6NGQzOF0KKyA0NSAtPiBDYW10ZWwgVGVjaG5vbG9neSBVU0IgVFYgR2VuaWUgUHJvIEZNIE1vZGVsIFRWQjMzMCAgICAgICBbMDc2ODowMDA2XQorIDQ2IC0+IERpZ2l0YWwgVmlkZW8gQ3JlYXRvciBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFswN2QwOjAwMDFdCisgNDcgLT4gR2xvYmFsIFZpbGxhZ2UgR1YtMDA3IChOVFNDKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzA3ZDA6MDAwMl0KKyA0OCAtPiBEYXp6bGUgRnVzaW9uIE1vZGVsIERWQy01MCBSZXYgMSAoTlRTQykgICAgICAgICAgICAgICAgICBbMDdkMDowMDAzXQorIDQ5IC0+IERhenpsZSBGdXNpb24gTW9kZWwgRFZDLTgwIFJldiAxIChQQUwpICAgICAgICAgICAgICAgICAgIFswN2QwOjAwMDRdCisgNTAgLT4gRGF6emxlIEZ1c2lvbiBNb2RlbCBEVkMtOTAgUmV2IDEgKFNFQ0FNKSAgICAgICAgICAgICAgICAgWzA3ZDA6MDAwNV0KKyA1MSAtPiBFc2thcGUgTGFicyBNeVRWMkdvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMDdmODo5MTA0XQorIDUyIC0+IFBpbm5hY2xlIFN0dWRpbyBQQ1RWIFVTQiAoUEFMKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFsyMzA0OjAxMGRdCisgNTMgLT4gUGlubmFjbGUgU3R1ZGlvIFBDVFYgVVNCIChTRUNBTSkgICAgICAgICAgICAgICAgICAgICAgICAgWzIzMDQ6MDEwOV0KKyA1NCAtPiBQaW5uYWNsZSBTdHVkaW8gUENUViBVU0IgKFBBTCkgRk0gICAgICAgICAgICAgICAgICAgICAgICBbMjMwNDowMTEwXQorIDU1IC0+IE1pcm8gUENUViBVU0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsyMzA0OjAxMTFdCisgNTYgLT4gUGlubmFjbGUgU3R1ZGlvIFBDVFYgVVNCIChOVFNDKSBGTSAgICAgICAgICAgICAgICAgICAgICAgWzIzMDQ6MDExMl0KKyA1NyAtPiBQaW5uYWNsZSBTdHVkaW8gUENUViBVU0IgKFBBTCkgRk0gVjIgICAgICAgICAgICAgICAgICAgICBbMjMwNDowMjEwXQorIDU4IC0+IFBpbm5hY2xlIFN0dWRpbyBQQ1RWIFVTQiAoTlRTQykgRk0gVjIgICAgICAgICAgICAgICAgICAgIFsyMzA0OjAyMTJdCisgNTkgLT4gUGlubmFjbGUgU3R1ZGlvIFBDVFYgVVNCIChQQUwpIEZNIFYzICAgICAgICAgICAgICAgICAgICAgWzIzMDQ6MDIxNF0KKyA2MCAtPiBQaW5uYWNsZSBTdHVkaW8gTGlueCBWaWRlbyBpbnB1dCBjYWJsZSAoTlRTQykgICAgICAgICAgICBbMjMwNDowMzAwXQorIDYxIC0+IFBpbm5hY2xlIFN0dWRpbyBMaW54IFZpZGVvIGlucHV0IGNhYmxlIChQQUwpICAgICAgICAgICAgIFsyMzA0OjAzMDFdCisgNjIgLT4gUGlubmFjbGUgUENUViBCdW5nZWUgVVNCIChQQUwpIEZNICAgICAgICAgICAgICAgICAgICAgICAgWzIzMDQ6MDQxOV0KKyA2MyAtPiBIYXVwcGF1Z2UgV2luVHYtVVNCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMjQwMDo0MjAwXQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9SRUFETUUuaXZ0diBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvUkVBRE1FLml2dHYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNkZjIyYwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvUkVBRE1FLml2dHYKQEAgLTAsMCArMSwxODcgQEAKKworaXZ0diByZWxlYXNlIG5vdGVzCis9PT09PT09PT09PT09PT09PT0KKworVGhpcyBpcyBhIHY0bDIgZGV2aWNlIGRyaXZlciBmb3IgdGhlIENvbmV4YW50IGN4MjM0MTUvNiBNUEVHIGVuY29kZXIvZGVjb2Rlci4KK1RoZSBjeDIzNDE1IGNhbiBkbyBib3RoIGVuY29kaW5nIGFuZCBkZWNvZGluZywgdGhlIGN4MjM0MTYgY2FuIG9ubHkgZG8gTVBFRworZW5jb2RpbmcuIEN1cnJlbnRseSB0aGUgb25seSBjYXJkIGZlYXR1cmluZyBmdWxsIGRlY29kaW5nIHN1cHBvcnQgaXMgdGhlCitIYXVwcGF1Z2UgUFZSLTM1MC4KKworTk9URTogdGhpcyBkcml2ZXIgcmVxdWlyZXMgdGhlIGxhdGVzdCBlbmNvZGVyIGZpcm13YXJlICh2ZXJzaW9uIDIuMDYuMDM5LCBzaXplCiszNzY4MzYgYnl0ZXMpLiBHZXQgdGhlIGZpcm13YXJlIGZyb20gaGVyZToKKworaHR0cDovL2RsLml2dHZkcml2ZXIub3JnL2l2dHYvZmlybXdhcmUvZmlybXdhcmUudGFyLmd6CisKK05PVEU6ICdub3JtYWwnIFRWIGFwcGxpY2F0aW9ucyBkbyBub3Qgd29yayB3aXRoIHRoaXMgZHJpdmVyLCB5b3UgbmVlZAorYW4gYXBwbGljYXRpb24gdGhhdCBjYW4gaGFuZGxlIE1QRUcgaW5wdXQgc3VjaCBhcyBtcGxheWVyLCB4aW5lLCBNeXRoVFYsCitldGMuCisKK1RoZSBwcmltYXJ5IGdvYWwgb2YgdGhlIElWVFYgcHJvamVjdCBpcyB0byBwcm92aWRlIGEgImNsZWFuIHJvb20iIExpbnV4CitPcGVuIFNvdXJjZSBkcml2ZXIgaW1wbGVtZW50YXRpb24gZm9yIHZpZGVvIGNhcHR1cmUgY2FyZHMgYmFzZWQgb24gdGhlCitpQ29tcHJlc3Npb24gaVRWQzE1IG9yIENvbmV4YW50IENYMjM0MTUvQ1gyMzQxNiBNUEVHIENvZGVjLgorCitGZWF0dXJlczoKKyAqIEhhcmR3YXJlIG1wZWcyIGNhcHR1cmUgb2YgYnJvYWRjYXN0IHZpZGVvIChhbmQgc291bmQpIHZpYSB0aGUgdHVuZXIgb3IKKyAgIFMtVmlkZW8vQ29tcG9zaXRlIGFuZCBhdWRpbyBsaW5lLWluLgorICogSGFyZHdhcmUgbXBlZzIgY2FwdHVyZSBvZiBGTSByYWRpbyB3aGVyZSBoYXJkd2FyZSBzdXBwb3J0IGV4aXN0cworICogU3VwcG9ydHMgTlRTQywgUEFMLCBTRUNBTSB3aXRoIHN0ZXJlbyBzb3VuZAorICogU3VwcG9ydHMgU0FQIGFuZCBiaWxpbmd1YWwgdHJhbnNtaXNzaW9ucy4KKyAqIFN1cHBvcnRzIHJhdyBWQkkgKGNsb3NlZCBjYXB0aW9ucyBhbmQgdGVsZXRleHQpLgorICogU3VwcG9ydHMgc2xpY2VkIFZCSSAoY2xvc2VkIGNhcHRpb25zIGFuZCB0ZWxldGV4dCkgYW5kIGlzIGFibGUgdG8gaW5zZXJ0CisgICB0aGlzIGludG8gdGhlIGNhcHR1cmVkIE1QRUcgc3RyZWFtLgorICogU3VwcG9ydHMgcmF3IFlVViBhbmQgUENNIGlucHV0LgorCitBZGRpdGlvbmFsIGZlYXR1cmVzIGZvciB0aGUgUFZSLTM1MCAoQ1gyMzQxNSBiYXNlZCk6CisgKiBQcm92aWRlcyBoYXJkd2FyZSBtcGVnMiBwbGF5YmFjaworICogUHJvdmlkZXMgY29tcHJlaGVuc2l2ZSBPU0QgKE9uIFNjcmVlbiBEaXNwbGF5OiBpZS4gZ3JhcGhpY3Mgb3ZlcmxheWluZyB0aGUKKyAgIHZpZGVvIHNpZ25hbCkKKyAqIFByb3ZpZGVzIGEgZnJhbWVidWZmZXIgKGFsbG93aW5nIFggYXBwbGljYXRpb25zIHRvIGFwcGVhciBvbiB0aGUgdmlkZW8KKyAgIGRldmljZSkgKHRoaXMgZnJhbWVidWZmZXIgaXMgbm90IHlldCBwYXJ0IG9mIHRoZSBrZXJuZWwuIEluIHRoZSBtZWFudGltZSBpdAorICAgaXMgYXZhaWxhYmxlIGZyb20gd3d3Lml2dHZkcml2ZXIub3JnKS4KKyAqIFN1cHBvcnRzIHJhdyBZVVYgb3V0cHV0LgorCitJTVBPUlRBTlQ6IEluIGNhc2Ugb2YgcHJvYmxlbXMgZmlyc3QgcmVhZCB0aGlzIHBhZ2U6CisJICAgaHR0cDovL3d3dy5pdnR2ZHJpdmVyLm9yZy9pbmRleC5waHAvVHJvdWJsZXNob290aW5nCisKK1NlZSBhbHNvOgorCitIb21lcGFnZSArIFdpa2kKK2h0dHA6Ly93d3cuaXZ0dmRyaXZlci5vcmcKKworSVJDCitpcmM6Ly9pcmMuZnJlZW5vZGUubmV0L2l2dHYtZGV2CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRGV2aWNlcworPT09PT09PQorCitBIG1heGltdW0gb2YgMTIgaXZ0diBib2FyZHMgYXJlIGFsbG93ZWQgYXQgdGhlIG1vbWVudC4KKworQ2FyZHMgdGhhdCBkb24ndCBoYXZlIGEgdmlkZW8gb3V0cHV0IGNhcGFiaWxpdHkgKGkuZS4gbm9uIFBWUjM1MCBjYXJkcykKK2xhY2sgdGhlIHZiaTgsIHZiaTE2LCB2aWRlbzE2IGFuZCB2aWRlbzQ4IGRldmljZXMuIFRoZXkgYWxzbyBkbyBub3QKK3N1cHBvcnQgdGhlIGZyYW1lYnVmZmVyIGRldmljZSAvZGV2L2ZieCBmb3IgT1NELgorCitUaGUgcmFkaW8wIGRldmljZSBtYXkgb3IgbWF5IG5vdCBiZSBwcmVzZW50LCBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUKK2NhcmQgaGFzIGEgcmFkaW8gdHVuZXIgb3Igbm90LgorCitIZXJlIGlzIGEgbGlzdCBvZiB0aGUgYmFzZSB2NGwgZGV2aWNlczoKK2Nydy1ydy0tLS0gICAgMSByb290ICAgICB2aWRlbyAgICAgODEsICAgMCBKdW4gMTkgMjI6MjIgL2Rldi92aWRlbzAKK2Nydy1ydy0tLS0gICAgMSByb290ICAgICB2aWRlbyAgICAgODEsICAxNiBKdW4gMTkgMjI6MjIgL2Rldi92aWRlbzE2CitjcnctcnctLS0tICAgIDEgcm9vdCAgICAgdmlkZW8gICAgIDgxLCAgMjQgSnVuIDE5IDIyOjIyIC9kZXYvdmlkZW8yNAorY3J3LXJ3LS0tLSAgICAxIHJvb3QgICAgIHZpZGVvICAgICA4MSwgIDMyIEp1biAxOSAyMjoyMiAvZGV2L3ZpZGVvMzIKK2Nydy1ydy0tLS0gICAgMSByb290ICAgICB2aWRlbyAgICAgODEsICA0OCBKdW4gMTkgMjI6MjIgL2Rldi92aWRlbzQ4CitjcnctcnctLS0tICAgIDEgcm9vdCAgICAgdmlkZW8gICAgIDgxLCAgNjQgSnVuIDE5IDIyOjIyIC9kZXYvcmFkaW8wCitjcnctcnctLS0tICAgIDEgcm9vdCAgICAgdmlkZW8gICAgIDgxLCAyMjQgSnVuIDE5IDIyOjIyIC9kZXYvdmJpMAorY3J3LXJ3LS0tLSAgICAxIHJvb3QgICAgIHZpZGVvICAgICA4MSwgMjI4IEp1biAxOSAyMjoyMiAvZGV2L3ZiaTgKK2Nydy1ydy0tLS0gICAgMSByb290ICAgICB2aWRlbyAgICAgODEsIDIzMiBKdW4gMTkgMjI6MjIgL2Rldi92YmkxNgorCitCYXNlIGRldmljZXMKKz09PT09PT09PT09PQorCitGb3IgZXZlcnkgZXh0cmEgY2FyZCB5b3UgaGF2ZSB0aGUgbnVtYmVycyBpbmNyZWFzZWQgYnkgb25lLiBGb3IgZXhhbXBsZSwKKy9kZXYvdmlkZW8wIGlzIGxpc3RlZCBhcyB0aGUgJ2Jhc2UnIGVuY29kaW5nIGNhcHR1cmUgZGV2aWNlIHNvIHdlIGhhdmU6CisKKyAvZGV2L3ZpZGVvMCAgaXMgdGhlIGVuY29kaW5nIGNhcHR1cmUgZGV2aWNlIGZvciB0aGUgZmlyc3QgY2FyZCAoY2FyZCAwKQorIC9kZXYvdmlkZW8xICBpcyB0aGUgZW5jb2RpbmcgY2FwdHVyZSBkZXZpY2UgZm9yIHRoZSBzZWNvbmQgY2FyZCAoY2FyZCAxKQorIC9kZXYvdmlkZW8yICBpcyB0aGUgZW5jb2RpbmcgY2FwdHVyZSBkZXZpY2UgZm9yIHRoZSB0aGlyZCBjYXJkIChjYXJkIDIpCisKK05vdGUgdGhhdCBpZiB0aGUgZmlyc3QgY2FyZCBkb2Vzbid0IGhhdmUgYSBmZWF0dXJlIChlZyBubyBkZWNvZGVyLCBzbyBubwordmlkZW8xNiwgdGhlIHNlY29uZCBjYXJkIHdpbGwgc3RpbGwgdXNlIHZpZGVvMTcuIFRoZSBzaW1wbGUgcnVsZSBpcyAnYWRkCit0aGUgY2FyZCBudW1iZXIgdG8gdGhlIGJhc2UgZGV2aWNlIG51bWJlcicuIElmIHlvdSBoYXZlIG90aGVyIGNhcHR1cmUKK2NhcmRzIChlLmcuIFdpblRWIFBDSSkgdGhhdCBhcmUgZGV0ZWN0ZWQgZmlyc3QsIHRoZW4geW91IGhhdmUgdG8gdGVsbAordGhlIGl2dHYgbW9kdWxlIGFib3V0IGl0IHNvIHRoYXQgaXQgd2lsbCBzdGFydCBjb3VudGluZyBhdCAxIChvciAyLCBvcgord2hhdGV2ZXIpLiBPdGhlcndpc2UgdGhlIGRldmljZSBudW1iZXJzIGNhbiBnZXQgY29uZnVzaW5nLiBUaGUgaXZ0dgorJ2l2dHZfZmlyc3RfbWlub3InIG1vZHVsZSBvcHRpb24gY2FuIGJlIHVzZWQgZm9yIHRoYXQuCisKKworL2Rldi92aWRlbzAKK1RoZSBlbmNvZGluZyBjYXB0dXJlIGRldmljZShzKS4KK1JlYWQtb25seS4KKworUmVhZGluZyBmcm9tIHRoaXMgZGV2aWNlIGdldHMgeW91IHRoZSBNUEVHMS8yIHByb2dyYW0gc3RyZWFtLgorRXhhbXBsZToKKworY2F0IC9kZXYvdmlkZW8wID4gbXkubXBnICh5b3UgbmVlZCB0byBoaXQgY3RybC1jIHRvIGV4aXQpCisKKworL2Rldi92aWRlbzE2CitUaGUgZGVjb2RlciBvdXRwdXQgZGV2aWNlKHMpCitXcml0ZS1vbmx5LiBPbmx5IHByZXNlbnQgaWYgdGhlIE1QRUcgZGVjb2RlciAoaS5lLiBDWDIzNDE1KSBleGlzdHMuCisKK0FuIG1wZWcyIHN0cmVhbSBzZW50IHRvIHRoaXMgZGV2aWNlIHdpbGwgYXBwZWFyIG9uIHRoZSBzZWxlY3RlZCB2aWRlbworZGlzcGxheSwgYXVkaW8gd2lsbCBhcHBlYXIgb24gdGhlIGxpbmUtb3V0L2F1ZGlvIG91dC4gIEl0IGlzIG9ubHkKK2F2YWlsYWJsZSBmb3IgY2FyZHMgdGhhdCBzdXBwb3J0IHZpZGVvIG91dC4gRXhhbXBsZToKKworY2F0IG15Lm1wZyA+L2Rldi92aWRlbzE2CisKKworL2Rldi92aWRlbzI0CitUaGUgcmF3IGF1ZGlvIGNhcHR1cmUgZGV2aWNlKHMpLgorUmVhZC1vbmx5CisKK1RoZSByYXcgYXVkaW8gUENNIHN0ZXJlbyBzdHJlYW0gZnJvbSB0aGUgY3VycmVudGx5IHNlbGVjdGVkCit0dW5lciBvciBhdWRpbyBsaW5lLWluLiAgUmVhZGluZyBmcm9tIHRoaXMgZGV2aWNlIHJlc3VsdHMgaW4gYSByYXcKKyhzaWduZWQgMTYgYml0IExpdHRsZSBFbmRpYW4sIDQ4MDAwIEh6LCBzdGVyZW8gcGNtKSBjYXB0dXJlLgorVGhpcyBkZXZpY2Ugb25seSBjYXB0dXJlcyBhdWRpby4gVGhpcyBzaG91bGQgYmUgcmVwbGFjZWQgYnkgYW4gQUxTQQorZGV2aWNlIGluIHRoZSBmdXR1cmUuCitOb3RlIHRoYXQgdGhlcmUgaXMgbm8gY29ycmVzcG9uZGluZyByYXcgYXVkaW8gb3V0cHV0IGRldmljZSwgdGhpcyBpcworbm90IHN1cHBvcnRlZCBpbiB0aGUgZGVjb2RlciBmaXJtd2FyZS4KKworCisvZGV2L3ZpZGVvMzIKK1RoZSByYXcgdmlkZW8gY2FwdHVyZSBkZXZpY2UocykKK1JlYWQtb25seQorCitUaGUgcmF3IFlVViB2aWRlbyBvdXRwdXQgZnJvbSB0aGUgY3VycmVudCB2aWRlbyBpbnB1dC4gVGhlIFlVViBmb3JtYXQKK2lzIG5vbi1zdGFuZGFyZCAoVjRMMl9QSVhfRk1UX0hNMTIpLgorCitOb3RlIHRoYXQgdGhlIFlVViBhbmQgUENNIHN0cmVhbXMgYXJlIG5vdCBzeW5jaHJvbml6ZWQsIHNvIHRoZXkgYXJlIG9mCitsaW1pdGVkIHVzZS4KKworCisvZGV2L3ZpZGVvNDgKK1RoZSByYXcgdmlkZW8gZGlzcGxheSBkZXZpY2UocykKK1dyaXRlLW9ubHkuIE9ubHkgcHJlc2VudCBpZiB0aGUgTVBFRyBkZWNvZGVyIChpLmUuIENYMjM0MTUpIGV4aXN0cy4KKworV3JpdGVzIGEgWVVWIHN0cmVhbSB0byB0aGUgZGVjb2RlciBvZiB0aGUgY2FyZC4KKworCisvZGV2L3JhZGlvMAorVGhlIHJhZGlvIHR1bmVyIGRldmljZShzKQorQ2Fubm90IGJlIHJlYWQgb3Igd3JpdHRlbi4KKworVXNlZCB0byBlbmFibGUgdGhlIHJhZGlvIHR1bmVyIGFuZCB0dW5lIHRvIGEgZnJlcXVlbmN5LiBZb3UgY2Fubm90CityZWFkIG9yIHdyaXRlIGF1ZGlvIHN0cmVhbXMgd2l0aCB0aGlzIGRldmljZS4gIE9uY2UgeW91IHVzZSB0aGlzCitkZXZpY2UgdG8gdHVuZSB0aGUgcmFkaW8sIHVzZSAvZGV2L3ZpZGVvMjQgdG8gcmVhZCB0aGUgcmF3IHBjbSBzdHJlYW0KK29yIC9kZXYvdmlkZW8wIHRvIGdldCBhbiBtcGVnMiBzdHJlYW0gd2l0aCBibGFjayB2aWRlby4KKworCisvZGV2L3ZiaTAKK1RoZSAndmVydGljYWwgYmxhbmsgaW50ZXJ2YWwnIChUZWxldGV4dCwgQ0MsIFdTUyBldGMpIGNhcHR1cmUgZGV2aWNlKHMpCitSZWFkLW9ubHkKKworQ2FwdHVyZXMgdGhlIHJhdyAob3Igc2xpY2VkKSB2aWRlbyBkYXRhIHNlbnQgZHVyaW5nIHRoZSBWZXJ0aWNhbCBCbGFuaworSW50ZXJ2YWwuIFRoaXMgZGF0YSBpcyB1c2VkIHRvIGVuY29kZSB0ZWxldGV4dCwgY2xvc2VkIGNhcHRpb25zLCBWUFMsCit3aWRlc2NyZWVuIHNpZ25hbGxpbmcsIGVsZWN0cm9uaWMgcHJvZ3JhbSBndWlkZSBpbmZvcm1hdGlvbiwgYW5kIG90aGVyCitzZXJ2aWNlcy4KKworCisvZGV2L3ZiaTgKK1Byb2Nlc3NlZCB2YmkgZmVlZGJhY2sgZGV2aWNlKHMpCitSZWFkLW9ubHkuIE9ubHkgcHJlc2VudCBpZiB0aGUgTVBFRyBkZWNvZGVyIChpLmUuIENYMjM0MTUpIGV4aXN0cy4KKworVGhlIHNsaWNlZCBWQkkgZGF0YSBlbWJlZGRlZCBpbiBhbiBNUEVHIHN0cmVhbSBpcyByZXByb2R1Y2VkIG9uIHRoaXMKK2RldmljZS4gU28gd2hpbGUgcGxheWluZyBiYWNrIGEgcmVjb3JkaW5nIG9uIC9kZXYvdmlkZW8xNiwgeW91IGNhbgorcmVhZCB0aGUgZW1iZWRkZWQgVkJJIGRhdGEgZnJvbSAvZGV2L3ZiaTguCisKKworL2Rldi92YmkxNgorVGhlIHZiaSAnZGlzcGxheScgZGV2aWNlKHMpCitXcml0ZS1vbmx5LiBPbmx5IHByZXNlbnQgaWYgdGhlIE1QRUcgZGVjb2RlciAoaS5lLiBDWDIzNDE1KSBleGlzdHMuCisKK0NhbiBiZSB1c2VkIHRvIHNlbmQgc2xpY2VkIFZCSSBkYXRhIHRvIHRoZSB2aWRlby1vdXQgY29ubmVjdG9yLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSGFucyBWZXJrdWlsIDxodmVya3VpbEB4czRhbGwubmw+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L2N4MjM0MXgvZnctZGVjb2Rlci1yZWdzLnR4dCBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvY3gyMzQxeC9mdy1kZWNvZGVyLXJlZ3MudHh0CmluZGV4IGRiMjM2NmMuLmNmNTJjOGYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvY3gyMzQxeC9mdy1kZWNvZGVyLXJlZ3MudHh0CisrKyBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvY3gyMzQxeC9mdy1kZWNvZGVyLXJlZ3MudHh0CkBAIC02MjQsMTEgKzYyNCwxMSBAQAogMkEwMAogICAgICAgYml0cyAwOjIKIAlvc2QgY29sb3VyIG1vZGUKKwkgIDAwMCA9IDggYml0IGluZGV4ZWQKIAkgIDAwMSA9IDE2IGJpdCAoNTY1KQogCSAgMDEwID0gMTUgYml0ICg1NTUpCiAJICAwMTEgPSAxMiBiaXQgKDQ0NCkKIAkgIDEwMCA9IDMyIGJpdCAoODg4OCkKLQkgIDEwMSA9IDggYml0IGluZGV4ZWQKIAogICAgICAgYml0cyA0OjUKIAlvc2QgZGlzcGxheSBicHAKQEAgLTY3Niw5ICs2NzYsMTEgQEAKICAgICAgY29tcGxldGVseSB0cmFuc3BhcmVudC4gV2hlbiB1c2luZyA1NjUsIDU1NSBvciA0NDQgY29sb3VyIG1vZGVzLCB0aGUKICAgICAgY29sb3VyIGtleSBpcyBhbHdheXMgMTYgYml0cyB3aWRlLiBUaGUgY29sb3VyIHRvIGtleSBvbiBpcyBzZXQgaW4gUmVnIDJBMTguCiAKLSAgICAgTG9jYWwgYWxwaGEgaXMgYSBwZXItcGl4ZWwgMjU2IHN0ZXAgdHJhbnNwYXJlbmN5LCB3aXRoIDAgYmVpbmcgdHJhbnNwYXJlbnQKLSAgICAgYW5kIDI1NSBiZWluZyBzb2xpZC4gVGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBpbiAzMiBiaXQgJiA4IGJpdCBpbmRleGVkCi0gICAgIGNvbG91ciBtb2Rlcy4KKyAgICAgTG9jYWwgYWxwaGEgd29ya3MgZGlmZmVyZW50bHkgZGVwZW5kaW5nIG9uIHRoZSBjb2xvdXIgbW9kZS4gRm9yIDMyYnBwICYgOAorICAgICBiaXQgaW5kZXhlZCwgbG9jYWwgYWxwaGEgaXMgYSBwZXItcGl4ZWwgMjU2IHN0ZXAgdHJhbnNwYXJlbmN5LCB3aXRoIDAgYmVpbmcKKyAgICAgdHJhbnNwYXJlbnQgYW5kIDI1NSBiZWluZyBzb2xpZC4gRm9yIHRoZSAxNmJwcCBtb2RlcyA1NTUgJiA0NDQsIHRoZSB1bnVzZWQKKyAgICAgYml0KHMpIGFjdCBhcyBhIHNpbXBsZSB0cmFuc3BhcmVuY3kgc3dpdGNoLCB3aXRoIDAgYmVpbmcgc29saWQgJiAxIGJlaW5nCisgICAgIGZ1bGx5IHRyYW5zcGFyZW50LiBUaGVyZSBpcyBubyBsb2NhbCBhbHBoYSBzdXBwb3J0IGZvciAxNmJpdCA1NjUuCiAKICAgICAgR2xvYmFsIGFscGhhIGlzIGEgMjU2IHN0ZXAgdHJhbnNwYXJlbmN5IHRoYXQgYXBwbGllcyB0byB0aGUgZW50aXJlIG9zZCwKICAgICAgd2l0aCAwIGJlaW5nIHRyYW5zcGFyZW50ICYgMjU1IGJlaW5nIHNvbGlkLgpAQCAtODExLDUgKzgxMyw1IEBACiAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLXYwLjMgLSAyIEZlYnJ1YXJ5IDIwMDcgLSBJYW4gQXJtc3Ryb25nIChpYW5AaWFybXN0LmRlbW9uLmNvLnVrKQordjAuNCAtIDEyIE1hcmNoIDIwMDcgLSBJYW4gQXJtc3Ryb25nIChpYW5AaWFybXN0LmRlbW9uLmNvLnVrKQogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L2N4MjM0MXgvZnctZW5jb2Rlci1hcGkudHh0IGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9jeDIzNDF4L2Z3LWVuY29kZXItYXBpLnR4dAppbmRleCAyNDIxMDRjLi41ZGQzMTA5IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L2N4MjM0MXgvZnctZW5jb2Rlci1hcGkudHh0CisrKyBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvY3gyMzQxeC9mdy1lbmNvZGVyLWFwaS50eHQKQEAgLTY2MywxMiArNjYzLDEzIEBACiAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotTmFtZSAJQ1gyMzQxWF9FTkNfVU5LTk9XTgorTmFtZSAJQ1gyMzQxWF9FTkNfU0VUX1ZFUlRfQ1JPUF9MSU5FCiBFbnVtIAkyMTkvMHhEQgogRGVzY3JpcHRpb24KLQlVbmtub3duIEFQSSwgaXQncyB1c2VkIGJ5IEhhdXBwYXVnZSB0aG91Z2guCisJU29tZXRoaW5nIHRvIGRvIHdpdGggJ1ZlcnRpY2FsIENyb3AgTGluZScKIFBhcmFtWzBdCi0JMCBUaGlzIGlzIHRoZSB2YWx1ZSBIYXVwcGF1Z2UgdXNlcywgVW5rbm93biB3aGF0IGl0IG1lYW5zLgorCUlmIHNhYTcxMTQgYW5kIHJhdyBWQkkgY2FwdHVyZSBhbmQgNjAgSHosIHRoZW4gc2V0IHRvIDEwMDAxLgorCUVsc2UgMC4KIAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC02ODIsMTEgKzY4Myw5IEBACiAJQ29tbWFuZCBudW1iZXI6CiAJIDE9c2V0IGluaXRpYWwgU0NSIHZhbHVlIHdoZW4gc3RhcnRpbmcgZW5jb2RpbmcgKHdvcmtzKS4KIAkgMj1zZXQgcXVhbGl0eSBtb2RlIChhcHBhcmVudGx5IHNvbWUgdGVzdCBzZXR0aW5nKS4KLQkgMz1zZXR1cCBhZHZhbmNlZCBWSU0gcHJvdGVjdGlvbiBoYW5kbGluZyAoc3VwcG9zZWRseSBvbmx5IGZvciB0aGUgY3gyMzQxNgotCSAgIGZvciByYXcgWVVWKS4KLQkgICBBY3R1YWxseSBpdCBsb29rcyBsaWtlIHRoaXMgc2hvdWxkIGJlIDAgZm9yIHNhYTcxMTQvNSBiYXNlZCBjYXJkIGFuZCAxCi0JICAgZm9yIGN4MjU4NDAgYmFzZWQgY2FyZHMuCi0JIDQ9Z2VuZXJhdGUgYXJ0aWZpY2lhbCBQVFMgdGltZXN0YW1wcworCSAzPXNldHVwIGFkdmFuY2VkIFZJTSBwcm90ZWN0aW9uIGhhbmRsaW5nLgorCSAgIEFsd2F5cyAxIGZvciB0aGUgY3gyMzQxNiBhbmQgMCBmb3IgY3gyMzQxNS4KKwkgND1nZW5lcmF0ZSBEVkQgY29tcGF0aWJsZSBQVFMgdGltZXN0YW1wcwogCSA1PVVTQiBmbHVzaCBtb2RlCiAJIDY9c29tZXRoaW5nIHRvIGRvIHdpdGggdGhlIHF1YW50aXphdGlvbiBtYXRyaXgKIAkgNz1zZXQgbmF2aWdhdGlvbiBwYWNrIGluc2VydGlvbiBmb3IgRFZEOiBhZGRzIDB4YmYgKHByaXZhdGUgc3RyZWFtIDIpCkBAIC02OTgsNyArNjk3LDkgQEAKIAkgOT1zZXQgaGlzdG9yeSBwYXJhbWV0ZXJzIG9mIHRoZSB2aWRlbyBpbnB1dCBtb2R1bGUKIAkxMD1zZXQgaW5wdXQgZmllbGQgb3JkZXIgb2YgVklNCiAJMTE9c2V0IHF1YW50aXphdGlvbiBtYXRyaXgKLQkxMj1yZXNldCBhdWRpbyBpbnRlcmZhY2UKKwkxMj1yZXNldCBhdWRpbyBpbnRlcmZhY2UgYWZ0ZXIgY2hhbm5lbCBjaGFuZ2Ugb3IgaW5wdXQgc3dpdGNoIChoYXMgbm8gYXJndW1lbnQpLgorCSAgIE5lZWRlZCBmb3IgdGhlIGN4MjU4NHgsIG5vdCBuZWVkZWQgZm9yIHRoZSBtc3B4NHh4LCBidXQgaXQgZG9lc24ndCBzZWVtIHRvCisJICAgZG8gYW55IGhhcm0gY2FsbGluZyBpdCByZWdhcmRsZXNzLgogCTEzPXNldCBhdWRpbyB2b2x1bWUgZGVsYXkKIAkxND1zZXQgYXVkaW8gZGVsYXkKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9jeDIzNDF4L2Z3LW9zZC1hcGkudHh0IGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9jeDIzNDF4L2Z3LW9zZC1hcGkudHh0CmluZGV4IDBhNjAyZjMuLjg5YzQ2MDEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvY3gyMzQxeC9mdy1vc2QtYXBpLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L2N4MjM0MXgvZnctb3NkLWFwaS50eHQKQEAgLTIxLDcgKzIxLDExIEBACiBEZXNjcmlwdGlvbgogCVF1ZXJ5IE9TRCBmb3JtYXQKIFJlc3VsdFswXQotCTA9OGJpdCBpbmRleCwgND1BbHBoYVJHQiA4Ojg6ODo4CisJMD04Yml0IGluZGV4CisJMT0xNmJpdCBSR0IgNTo2OjUKKwkyPTE2Yml0IEFSR0IgMTo1OjU6NQorCTM9MTZiaXQgQVJHQiAxOjQ6NDo0CisJND0zMmJpdCBBUkdCIDg6ODo4OjgKIAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC0zMCw3ICszNCwxMSBAQAogRGVzY3JpcHRpb24KIAlBc3NpZ24gcGl4ZWwgZm9ybWF0CiBQYXJhbVswXQotCTA9OGJpdCBpbmRleCwgND1BbHBoYVJHQiA4Ojg6ODo4CisJMD04Yml0IGluZGV4CisJMT0xNmJpdCBSR0IgNTo2OjUKKwkyPTE2Yml0IEFSR0IgMTo1OjU6NQorCTM9MTZiaXQgQVJHQiAxOjQ6NDo0CisJND0zMmJpdCBBUkdCIDg6ODo4OjgKIAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L21leWUudHh0IGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9tZXllLnR4dAppbmRleCBlY2IzNDE2Li41ZTUxYzU5IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L21leWUudHh0CisrKyBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvbWV5ZS50eHQKQEAgLTUsMTAgKzUsOSBAQAogCUNvcHlyaWdodCAoQykgMjAwMCBBbmRyZXcgVHJpZGdlbGwgPHRyaWRnZUBzYW1iYS5vcmc+CiAKIFRoaXMgZHJpdmVyIGVuYWJsZSB0aGUgdXNlIG9mIHZpZGVvNGxpbnV4IGNvbXBhdGlibGUgYXBwbGljYXRpb25zIHdpdGggdGhlCi1Nb3Rpb24gRXllIGNhbWVyYS4gVGhpcyBkcml2ZXIgcmVxdWlyZXMgdGhlICJTb255IFZhaW8gUHJvZ3JhbW1hYmxlIEkvTwotQ29udHJvbCBEZXZpY2UiIGRyaXZlciAod2hpY2ggY2FuIGJlIGZvdW5kIGluIHRoZSAiQ2hhcmFjdGVyIGRyaXZlcnMiCi1zZWN0aW9uIG9mIHRoZSBrZXJuZWwgY29uZmlndXJhdGlvbiB1dGlsaXR5KSB0byBiZSBjb21waWxlZCBhbmQgaW5zdGFsbGVkCi0odXNpbmcgaXRzICJjYW1lcmE9MSIgcGFyYW1ldGVyKS4KK01vdGlvbiBFeWUgY2FtZXJhLiBUaGlzIGRyaXZlciByZXF1aXJlcyB0aGUgIlNvbnkgTGFwdG9wIEV4dHJhcyIgZHJpdmVyICh3aGljaAorY2FuIGJlIGZvdW5kIGluIHRoZSAiTWlzYyBkZXZpY2VzIiBzZWN0aW9uIG9mIHRoZSBrZXJuZWwgY29uZmlndXJhdGlvbiB1dGlsaXR5KQordG8gYmUgY29tcGlsZWQgYW5kIGluc3RhbGxlZCAodXNpbmcgaXRzICJjYW1lcmE9MSIgcGFyYW1ldGVyKS4KIAogSXQgY2FuIGRvIGF0IG1heGltdW0gMzAgZnBzIEAgMzIweDI0MCBvciAxNSBmcHMgQCA2NDB4NDgwLgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L3NuOWMxMDIudHh0IGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9zbjljMTAyLnR4dAppbmRleCAyOTEzZGEzLi41ZmUwYWQ3IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L3NuOWMxMDIudHh0CisrKyBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvc245YzEwMi50eHQKQEAgLTI1LDcgKzI1LDcgQEAKIAogMS4gQ29weXJpZ2h0CiA9PT09PT09PT09PT0KLUNvcHlyaWdodCAoQykgMjAwNC0yMDA2IGJ5IEx1Y2EgUmlzb2xpYSA8bHVjYS5yaXNvbGlhQHN0dWRpby51bmliby5pdD4KK0NvcHlyaWdodCAoQykgMjAwNC0yMDA3IGJ5IEx1Y2EgUmlzb2xpYSA8bHVjYS5yaXNvbGlhQHN0dWRpby51bmliby5pdD4KIAogCiAyLiBEaXNjbGFpbWVyCkBAIC0yMTYsMTAgKzIxNiwxMCBAQAogCQkxID0gY3JpdGljYWwgZXJyb3JzCiAJCTIgPSBzaWduaWZpY2FudCBpbmZvcm1hdGlvbnMKIAkJMyA9IG1vcmUgdmVyYm9zZSBtZXNzYWdlcwotCQlMZXZlbCAzIGlzIHVzZWZ1bCBmb3IgdGVzdGluZyBvbmx5LCB3aGVuIG9ubHkgb25lIGRldmljZQotCQlpcyB1c2VkLiBJdCBhbHNvIHNob3dzIHNvbWUgbW9yZSBpbmZvcm1hdGlvbnMgYWJvdXQgdGhlCi0JCWhhcmR3YXJlIGJlaW5nIGRldGVjdGVkLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgY2hhbmdlZCBhdAotCQlydW50aW1lIHRoYW5rcyB0byB0aGUgL3N5cyBmaWxlc3lzdGVtIGludGVyZmFjZS4KKwkJTGV2ZWwgMyBpcyB1c2VmdWwgZm9yIHRlc3Rpbmcgb25seS4gSXQgYWxzbyBzaG93cyBzb21lIG1vcmUKKwkJaW5mb3JtYXRpb25zIGFib3V0IHRoZSBoYXJkd2FyZSBiZWluZyBkZXRlY3RlZC4KKwkJVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGNoYW5nZWQgYXQgcnVudGltZSB0aGFua3MgdG8gdGhlIC9zeXMKKwkJZmlsZXN5c3RlbSBpbnRlcmZhY2UuCiBEZWZhdWx0OiAgICAgICAgMgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC0yMzUsNyArMjM1LDcgQEAKIGNoYW5uZWwncyBnYWluIGJ5IHdyaXRpbmcgdGhlIGRlc2lyZWQgdmFsdWUgdG8gaXQuIFRoZSB2YWx1ZSBtYXkgcmFuZ2UgZnJvbSAwCiB0byAxNSBmb3IgdGhlIFNOOUMxMDEgb3IgU045QzEwMiBicmlkZ2VzLCBmcm9tIDAgdG8gMTI3IGZvciB0aGUgU045QzEwMywKIFNOOUMxMDUgYW5kIFNOOUMxMjAgYnJpZGdlcy4KLVNpbWlsYXJseSwgb25seSBmb3IgdGhlIFNOOUMxMDMsIFNOOUMxMDUgYW5kIFNOOTEyMCBjb250cm9sbGVycywgYmx1ZSBhbmQgcmVkCitTaW1pbGFybHksIG9ubHkgZm9yIHRoZSBTTjlDMTAzLCBTTjlDMTA1IGFuZCBTTjlDMTIwIGNvbnRyb2xsZXJzLCBibHVlIGFuZCByZWQKIGdhaW4gY29udHJvbCBmaWxlcyBhcmUgYXZhaWxhYmxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeSwgZm9yIHdoaWNoIGFjY2VwdGVkCiB2YWx1ZXMgbWF5IHJhbmdlIGZyb20gMCB0byAxMjcuCiAKQEAgLTQwMiwzOCArNDAyLDQ5IEBACiAweDBjNDUgICAgIDB4NjBiYwogMHgwYzQ1ICAgICAweDYwYmUKIDB4MGM0NSAgICAgMHg2MGMwCisweDBjNDUgICAgIDB4NjBjMgogMHgwYzQ1ICAgICAweDYwYzgKIDB4MGM0NSAgICAgMHg2MGNjCiAweDBjNDUgICAgIDB4NjBlYQogMHgwYzQ1ICAgICAweDYwZWMKKzB4MGM0NSAgICAgMHg2MGVmCiAweDBjNDUgICAgIDB4NjBmYQogMHgwYzQ1ICAgICAweDYwZmIKIDB4MGM0NSAgICAgMHg2MGZjCiAweDBjNDUgICAgIDB4NjBmZQorMHgwYzQ1ICAgICAweDYxMDIKKzB4MGM0NSAgICAgMHg2MTA4CisweDBjNDUgICAgIDB4NjEwZgogMHgwYzQ1ICAgICAweDYxMzAKKzB4MGM0NSAgICAgMHg2MTM4CiAweDBjNDUgICAgIDB4NjEzYQogMHgwYzQ1ICAgICAweDYxM2IKIDB4MGM0NSAgICAgMHg2MTNjCiAweDBjNDUgICAgIDB4NjEzZQogCiBUaGUgbGlzdCBhYm92ZSBkb2VzIG5vdCBpbXBseSB0aGF0IGFsbCB0aG9zZSBkZXZpY2VzIHdvcmsgd2l0aCB0aGlzIGRyaXZlcjogdXAKLXVudGlsIG5vdyBvbmx5IHRoZSBvbmVzIHRoYXQgYXNzZW1ibGUgdGhlIGZvbGxvd2luZyBpbWFnZSBzZW5zb3JzIGFyZQotc3VwcG9ydGVkOyBrZXJuZWwgbWVzc2FnZXMgd2lsbCBhbHdheXMgdGVsbCB5b3Ugd2hldGhlciB0aGlzIGlzIHRoZSBjYXNlIChzZWUKLSJNb2R1bGUgbG9hZGluZyIgcGFyYWdyYXBoKToKK3VudGlsIG5vdyBvbmx5IHRoZSBvbmVzIHRoYXQgYXNzZW1ibGUgdGhlIGZvbGxvd2luZyBwYWlycyBvZiBTTjlDMXh4IGJyaWRnZXMKK2FuZCBpbWFnZSBzZW5zb3JzIGFyZSBzdXBwb3J0ZWQ7IGtlcm5lbCBtZXNzYWdlcyB3aWxsIGFsd2F5cyB0ZWxsIHlvdSB3aGV0aGVyCit0aGlzIGlzIHRoZSBjYXNlIChzZWUgIk1vZHVsZSBsb2FkaW5nIiBwYXJhZ3JhcGgpOgogCi1Nb2RlbCAgICAgICBNYW51ZmFjdHVyZXIKLS0tLS0tICAgICAgIC0tLS0tLS0tLS0tLQotSFY3MTMxRCAgICAgSHluaXggU2VtaWNvbmR1Y3RvciwgSW5jLgotTUktMDM0MyAgICAgTWljcm9uIFRlY2hub2xvZ3ksIEluYy4KLU9WNzYzMCAgICAgIE9tbmlWaXNpb24gVGVjaG5vbG9naWVzLCBJbmMuCi1PVjc2NjAgICAgICBPbW5pVmlzaW9uIFRlY2hub2xvZ2llcywgSW5jLgotUEFTMTA2QiAgICAgUGl4QXJ0IEltYWdpbmcsIEluYy4KLVBBUzIwMkJDQSAgIFBpeEFydCBJbWFnaW5nLCBJbmMuCi1QQVMyMDJCQ0IgICBQaXhBcnQgSW1hZ2luZywgSW5jLgotVEFTNTExMEMxQiAgVGFpd2FuIEFkdmFuY2VkIFNlbnNvciBDb3Jwb3JhdGlvbgotVEFTNTEzMEQxQiAgVGFpd2FuIEFkdmFuY2VkIFNlbnNvciBDb3Jwb3JhdGlvbgorSW1hZ2Ugc2Vuc29yIC8gU045QzF4eCBicmlkZ2UgICAgICB8IFNOOUMxMFsxMl0gIFNOOUMxMDMgIFNOOUMxMDUgIFNOOUMxMjAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0hWNzEzMUQgICAgSHluaXggU2VtaWNvbmR1Y3RvciAgICAgfCBZZXMgICAgICAgICBObyAgICAgICBObyAgICAgICBObworSFY3MTMxUiAgICBIeW5peCBTZW1pY29uZHVjdG9yICAgICB8IE5vICAgICAgICAgIFllcyAgICAgIFllcyAgICAgIFllcworTUktMDM0MyAgICBNaWNyb24gVGVjaG5vbG9neSAgICAgICB8IFllcyAgICAgICAgIE5vICAgICAgIE5vICAgICAgIE5vCitNSS0wMzYwICAgIE1pY3JvbiBUZWNobm9sb2d5ICAgICAgIHwgTm8gICAgICAgICAgWWVzICAgICAgTm8gICAgICAgTm8KK09WNzYzMCAgICAgT21uaVZpc2lvbiBUZWNobm9sb2dpZXMgfCBZZXMgICAgICAgICBZZXMgICAgICBObyAgICAgICBObworT1Y3NjYwICAgICBPbW5pVmlzaW9uIFRlY2hub2xvZ2llcyB8IE5vICAgICAgICAgIE5vICAgICAgIFllcyAgICAgIFllcworUEFTMTA2QiAgICBQaXhBcnQgSW1hZ2luZyAgICAgICAgICB8IFllcyAgICAgICAgIE5vICAgICAgIE5vICAgICAgIE5vCitQQVMyMDJCICAgIFBpeEFydCBJbWFnaW5nICAgICAgICAgIHwgWWVzICAgICAgICAgWWVzICAgICAgTm8gICAgICAgTm8KK1RBUzUxMTBDMUIgVGFpd2FuIEFkdmFuY2VkIFNlbnNvciAgfCBZZXMgICAgICAgICBObyAgICAgICBObyAgICAgICBObworVEFTNTExMEQgICBUYWl3YW4gQWR2YW5jZWQgU2Vuc29yICB8IFllcyAgICAgICAgIE5vICAgICAgIE5vICAgICAgIE5vCitUQVM1MTMwRDFCIFRhaXdhbiBBZHZhbmNlZCBTZW5zb3IgIHwgWWVzICAgICAgICAgTm8gICAgICAgTm8gICAgICAgTm8KIAotU29tZSBvZiB0aGUgYXZhaWxhYmxlIGNvbnRyb2wgc2V0dGluZ3Mgb2YgZWFjaCBpbWFnZSBzZW5zb3IgYXJlIHN1cHBvcnRlZAorIlllcyIgbWVhbnMgdGhhdCB0aGUgcGFpciBpcyBzdXBwb3J0ZWQgYnkgdGhlIGRyaXZlciwgd2hpbGUgIk5vIiBtZWFucyB0aGF0IHRoZQorcGFpciBkb2VzIG5vdCBleGlzdCBvciBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBkcml2ZXIuCisKK09ubHkgc29tZSBvZiB0aGUgYXZhaWxhYmxlIGNvbnRyb2wgc2V0dGluZ3Mgb2YgZWFjaCBpbWFnZSBzZW5zb3IgYXJlIHN1cHBvcnRlZAogdGhyb3VnaCB0aGUgVjRMMiBpbnRlcmZhY2UuCiAKIERvbmF0aW9ucyBvZiBuZXcgbW9kZWxzIGZvciBmdXJ0aGVyIHRlc3RpbmcgYW5kIHN1cHBvcnQgd291bGQgYmUgbXVjaApAQCAtNDgyLDggKzQ5Myw4IEBACiBmb3JtYXRzIG92ZXIgdGhlIFVTQjogZWl0aGVyIG5hdGl2ZSAiU2VxdWVudGlhbCBSR0IgQmF5ZXIiIG9yIGNvbXByZXNzZWQuCiBUaGUgY29tcHJlc3Npb24gaXMgdXNlZCB0byBhY2hpZXZlIGhpZ2ggZnJhbWUgcmF0ZXMuIFdpdGggcmVnYXJkIHRvIHRoZQogU045QzEwMSwgU045QzEwMiBhbmQgU045QzEwMywgdGhlIGNvbXByZXNzaW9uIGlzIGJhc2VkIG9uIHRoZSBIdWZmbWFuIGVuY29kaW5nCi1hbGdvcml0aG0gZGVzY3JpYmVkIGJlbG93LCB3aGlsZSB0aGUgU045QzEwNSBhbmQgU045QzEyMCB0aGUgY29tcHJlc3Npb24gaXMKLWJhc2VkIG9uIHRoZSBKUEVHIHN0YW5kYXJkLgorYWxnb3JpdGhtIGRlc2NyaWJlZCBiZWxvdywgd2hpbGUgd2l0aCByZWdhcmQgdG8gdGhlIFNOOUMxMDUgYW5kIFNOOUMxMjAgdGhlCitjb21wcmVzc2lvbiBpcyBiYXNlZCBvbiB0aGUgSlBFRyBzdGFuZGFyZC4KIFRoZSBjdXJyZW50IHZpZGVvIGZvcm1hdCBtYXkgYmUgc2VsZWN0ZWQgb3IgcXVlcmllZCBmcm9tIHRoZSB1c2VyIGFwcGxpY2F0aW9uCiBieSBjYWxsaW5nIHRoZSBWSURJT0NfU19GTVQgb3IgVklESU9DX0dfRk1UIGlvY3RsJ3MsIGFzIGRlc2NyaWJlZCBpbiB0aGUgVjRMMgogQVBJIHNwZWNpZmljYXRpb25zLgpAQCAtNTczLDQgKzU4NCw1IEBACiAtIE1penVubyBUYWthZnVtaSBmb3IgdGhlIGRvbmF0aW9uIG9mIGEgd2ViY2FtOwogLSBhbiAiYW5vbnltb3VzIiBkb25hdG9yICh3aG8gZGlkbid0IHdhbnQgaGlzIG5hbWUgdG8gYmUgcmV2ZWFsZWQpIGZvciB0aGUKICAgZG9uYXRpb24gb2YgYSB3ZWJjYW0uCi0tIGFuIGFub255bW91cyBkb25hdG9yIGZvciB0aGUgZG9uYXRpb24gb2YgZm91ciB3ZWJjYW1zLgorLSBhbiBhbm9ueW1vdXMgZG9uYXRvciBmb3IgdGhlIGRvbmF0aW9uIG9mIGZvdXIgd2ViY2FtcyBhbmQgdHdvIGJvYXJkcyB3aXRoIHRlbgorICBpbWFnZSBzZW5zb3JzLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC96cjM2NHh4LnR4dCBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvenIzNjR4eC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc2OTkyZAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvenIzNjR4eC50eHQKQEAgLTAsMCArMSw2NSBAQAorWm9yYW4gMzY0eHggYmFzZWQgVVNCIHdlYmNhbSBtb2R1bGUgdmVyc2lvbiAwLjcyCitzaXRlOiBodHRwOi8vcm95YWxlLnplcmV6by5jb20venIzNjR4eC8KK21haWw6IHJveWFsZUB6ZXJlem8uY29tCisKK2ludHJvZHVjdGlvbjoKK1RoaXMgYnJpbmdzIHN1cHBvcnQgdW5kZXIgTGludXggZm9yIHRoZSBBaXB0ZWsgUG9ja2V0RFYgMzMwMCBpbiB3ZWJjYW0gbW9kZS4KK0lmIHlvdSBqdXN0IHdhbnQgdG8gZ2V0IG9uIHlvdXIgUEMgdGhlIHBpY3R1cmVzIGFuZCBtb3ZpZXMgb24gdGhlIGNhbWVyYSwgeW91IHNob3VsZCB1c2UgdGhlIHVzYi1zdG9yYWdlIG1vZHVsZSBpbnN0ZWFkLgorVGhlIGRyaXZlciB3b3JrcyB3aXRoIHNldmVyYWwgb3RoZXIgY2FtZXJhcyBpbiB3ZWJjYW0gbW9kZSAoc2VlIHRoZSBsaXN0IGJlbG93KS4KK01heWJlIHRoaXMgY29kZSBjYW4gd29yayBmb3Igb3RoZXIgSlBFRy9VU0IgY2FtcyBiYXNlZCBvbiB0aGUgQ29hY2ggY2hpcHMgZnJvbSBab3Jhbj8KK1Bvc3NpYmxlIGNoaXBzZXRzIGFyZSA6IFpSMzY0MzAgKFpSMzY0MzBCR0MpIGFuZCBtYXliZSBaUjM2NDMxLCBaUjM2NDQwLCBaUjM2NDQyLi4uCitZb3UgY2FuIHRyeSB0aGUgZXhwZXJpZW5jZSBjaGFuZ2luZyB0aGUgdmVuZG9yL3Byb2R1Y3QgSUQgdmFsdWVzIChsb29rIGF0IHRoZSBzb3VyY2UgY29kZSkuCitZb3UgY2FuIGdldCB0aGVzZSB2YWx1ZXMgYnkgbG9va2luZyBhdCAvdmFyL2xvZy9tZXNzYWdlcyB3aGVuIHlvdSBwbHVnIHlvdXIgY2FtZXJhLCBvciBieSB0eXBpbmcgOiBjYXQgL3Byb2MvYnVzL3VzYi9kZXZpY2VzLgorSWYgeW91IG1hbmFnZSB0byB1c2UgeW91ciBjYW0gd2l0aCB0aGlzIGNvZGUsIHlvdSBjYW4gc2VuZCBtZSBhIG1haWwgKHJveWFsZUB6ZXJlem8uY29tKSB3aXRoIHRoZSBuYW1lIG9mIHlvdXIgY2FtIGFuZCBhIHBhdGNoIGlmIG5lZWRlZC4KK1RoaXMgaXMgYSBiZXRhIHJlbGVhc2Ugb2YgdGhlIGRyaXZlci4KK1NpbmNlIHZlcnNpb24gMC43MCwgdGhpcyBkcml2ZXIgaXMgb25seSBjb21wYXRpYmxlIHdpdGggVjRMMiBBUEkgYW5kIDIuNi54IGtlcm5lbHMuCitJZiB5b3UgbmVlZCBWNEwxIG9yIDIuNHgga2VybmVscyBzdXBwb3J0LCBwbGVhc2UgdXNlIGFuIG9sZGVyIHZlcnNpb24sIGJ1dCB0aGUgY29kZSBpcyBub3QgbWFpbnRhaW5lZCBhbnltb3JlLgorR29vZCBsdWNrIQorCitpbnN0YWxsOgorSW4gb3JkZXIgdG8gdXNlIHRoaXMgZHJpdmVyLCB5b3UgbXVzdCBjb21waWxlIGl0IHdpdGggeW91ciBrZXJuZWwuCitMb2NhdGlvbjogRGV2aWNlIERyaXZlcnMgLT4gTXVsdGltZWRpYSBkZXZpY2VzIC0+IFZpZGVvIEZvciBMaW51eCAtPiBWaWRlbyBDYXB0dXJlIEFkYXB0ZXJzIC0+IFY0TCBVU0IgZGV2aWNlcworCit1c2FnZToKK21vZHByb2JlIHpyMzY0eHggZGVidWc9WCBtb2RlPVkKKyAtIGRlYnVnICAgICAgOiBzZXQgdG8gMSB0byBlbmFibGUgdmVyYm9zZSBkZWJ1ZyBtZXNzYWdlcworIC0gbW9kZSAgICAgICA6IDAgPSAzMjB4MjQwLCAxID0gMTYweDEyMCwgMiA9IDY0MHg0ODAKK1lvdSBjYW4gdGhlbiB1c2UgdGhlIGNhbWVyYSB3aXRoIFY0TDIgY29tcGF0aWJsZSBhcHBsaWNhdGlvbnMsIGZvciBleGFtcGxlIEVraWdhLgorVG8gY2FwdHVyZSBhIHNpbmdsZSBpbWFnZSwgdHJ5IHRoaXM6IGRkIGlmPS9kZXYvdmlkZW8wIG9mPXRlc3QuanBnIGJzPTEgY291bnQ9MQorCitsaW5rcyA6CitodHRwOi8vbXhoYWFyZC5mcmVlLmZyLyAoc3VwcG9ydCBmb3IgbWFueSBvdGhlcnMgY2FtcyBpbmNsdWRpbmcgc29tZSBBaXB0ZWsgUG9ja2V0RFYpCitodHRwOi8vd3d3Lmhhcm13YWwubmwvcGNjYW04ODAvICh0aGlzIHByb2plY3QgYWxzbyBzdXBwb3J0cyBjYW1lcmFzIGJhc2VkIG9uIHRoaXMgY2hpcHNldCkKKworc3VwcG9ydGVkIGRldmljZXM6CistLS0tLS0gIC0tLS0tLS0gIC0tLS0tLS0tLS0tICAgICAtLS0tLQorVmVuZG9yICBQcm9kdWN0ICBEaXN0cmlidXRvciAgICAgTW9kZWwKKy0tLS0tLSAgLS0tLS0tLSAgLS0tLS0tLS0tLS0gICAgIC0tLS0tCisweDA4Y2EgIDB4MDEwOSAgIEFpcHRlayAgICAgICAgICBQb2NrZXREViAzMzAwCisweDA4Y2EgIDB4MDEwOSAgIE1heGVsbCAgICAgICAgICBNYXhjYW0gUFJPIERWMworMHgwNDFlICAweDQwMjQgICBDcmVhdGl2ZSAgICAgICAgUEMtQ0FNIDg4MAorMHgwZDY0ICAweDAxMDggICBBaXB0ZWsgICAgICAgICAgRmlkZWxpdHkgMzIwMAorMHgwZDY0ICAweDAxMDggICBQcmFrdGljYSAgICAgICAgRENaIDEuMyBTCisweDBkNjQgIDB4MDEwOCAgIEdlbml1cyAgICAgICAgICBEaWdpdGFsIENhbWVyYSAoPykKKzB4MGQ2NCAgMHgwMTA4ICAgRFhHIFRlY2hub2xvZ3kgIEZhc2hpb24gQ2FtCisweDA1NDYgIDB4MzE4NyAgIFBvbGFyb2lkICAgICAgICBpT04gMjMwCisweDBkNjQgIDB4MzEwOCAgIFByYWt0aWNhICAgICAgICBFeGFrdGEgREMgMjIwMAorMHgwZDY0ICAweDMxMDggICBHZW5pdXMgICAgICAgICAgRy1TaG90IEQyMTEKKzB4MDU5NSAgMHg0MzQzICAgQ29uY29yZCAgICAgICAgIEV5ZS1RIER1byAxMzAwCisweDA1OTUgIDB4NDM0MyAgIENvbmNvcmQgICAgICAgICBFeWUtUSBEdW8gMjAwMAorMHgwNTk1ICAweDQzNDMgICBGdWppZmlsbSAgICAgICAgRVgtMTAKKzB4MDU5NSAgMHg0MzQzICAgUmljb2ggICAgICAgICAgIFJEQy02MDAwCisweDA1OTUgIDB4NDM0MyAgIERpZ2l0cmV4ICAgICAgICBEU0MgMTMwMAorMHgwNTk1ICAweDQzNDMgICBGaXJzdGxpbmUgICAgICAgRkRDIDIwMDAKKzB4MGJiMCAgMHg1MDBkICAgQ29uY29yZCAgICAgICAgIEV5ZVEgR28gV2lyZWxlc3MKKzB4MGZlYiAgMHgyMDA0ICAgQ1JTIEVsZWN0cm9uaWMgIDMuMyBEaWdpdGFsIENhbWVyYQorMHgwZmViICAweDIwMDQgICBQYWNrYXJkIEJlbGwgICAgRFNDLTMwMAorMHgwNTVmICAweGI1MDAgICBNdXN0ZWsgICAgICAgICAgTURDIDMwMDAKKzB4MDhjYSAgMHgyMDYyICAgQWlwdGVrICAgICAgICAgIFBvY2tldERWIDU3MDAKKzB4MDUyYiAgMHgxYTE4ICAgQ2hpcGhlYWQgICAgICAgIE1lZ2FwaXggVjEyCisweDA0YzggIDB4MDcyOSAgIEtvbmljYSAgICAgICAgICBSZXZpbyAyCisweDA0ZjIgIDB4YTIwOCAgIENyZWF0aXZlICAgICAgICBQQy1DQU0gODUwCisweDA3ODQgIDB4MDA0MCAgIFRyYXZlbGVyICAgICAgICBTbGltbGluZSBYNQorMHgwNmQ2ICAweDAwMzQgICBUcnVzdCAgICAgICAgICAgUG93ZXJjQG0gNzUwCisweDBhMTcgIDB4MDA2MiAgIFBlbnRheCAgICAgICAgICBPcHRpbyA1MEwKKwpkaWZmIC0tZ2l0IGEvTUFJTlRBSU5FUlMgYi9NQUlOVEFJTkVSUwppbmRleCAyNzc4NzdhLi5hZjFjNzkyIDEwMDY0NAotLS0gYS9NQUlOVEFJTkVSUworKysgYi9NQUlOVEFJTkVSUwpAQCAtNTUsNyArNTUsNyBAQAogCiA4LglIYXBweSBoYWNraW5nLgogCi0gCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBNYWludGFpbmVycyBMaXN0ICh0cnkgdG8gbG9vayBmb3IgbW9zdCBwcmVjaXNlIGFyZWFzIGZpcnN0KQogCkBAIC0zODQsNyArMzg0LDcgQEAKIAogQVBQTEVUQUxLIE5FVFdPUksgTEFZRVIKIFA6CUFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbwotTToJYWNtZUBjb25lY3RpdmEuY29tLmJyCitNOglhY21lQGdob3N0cHJvdG9jb2xzLm5ldAogUzoJTWFpbnRhaW5lZAogCiBBUkMgRlJBTUVCVUZGRVIgRFJJVkVSCkBAIC02NTYsNiArNjU2LDcgQEAKIEFUTUVMIFdJUkVMRVNTIERSSVZFUgogUDoJU2ltb24gS2VsbGV5CiBNOglzaW1vbkB0aGVrZWxsZXlzLm9yZy51aworTDoJbGludXgtd2lyZWxlc3NAdmdlci5rZXJuZWwub3JnCiBXOglodHRwOi8vd3d3LnRoZWtlbGxleXMub3JnLnVrL2F0bWVsCiBXOglodHRwOi8vYXRtZWx3bGFuZHJpdmVyLnNvdXJjZWZvcmdlLm5ldC8KIFM6CU1haW50YWluZWQKQEAgLTcxMSw2ICs3MTIsNyBAQAogTToJTGFycnkuRmluZ2VyQGx3ZmluZ2VyLm5ldAogUDoJU3RlZmFubyBCcml2aW8KIE06CXN0M0ByaXNldXAubmV0CitMOglsaW51eC13aXJlbGVzc0B2Z2VyLmtlcm5lbC5vcmcKIFc6CWh0dHA6Ly9iY200M3h4LmJlcmxpb3MuZGUvCiBTOglNYWludGFpbmVkCiAKQEAgLTg3MSw2ICs4NzMsMTIgQEAKIFQ6CWdpdCBrZXJuZWwub3JnOi9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvbWNoZWhhYi92NGwtZHZiLmdpdAogUzoJTWFpbnRhaW5lZAogCitDQUZFIENNT1MgSU5URUdSQVRFRCBDQU1FUkEgQ09OVFJPTExFUiBEUklWRVIKK1A6ICAgCUpvbmF0aGFuIENvcmJldAorTToJY29yYmV0QGx3bi5uZXQKK0w6CXZpZGVvNGxpbnV4LWxpc3RAcmVkaGF0LmNvbQorUzoJTWFpbnRhaW5lZAorCiBDQUxHQVJZIHg4Ni02NCBJT01NVQogUDoJTXVsaSBCZW4tWWVodWRhCiBNOgltdWxpQGlsLmlibS5jb20KQEAgLTg5Miw2ICs5MDAsMTIgQEAKIEw6CWxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmcKIFM6CU1haW50YWluZWQKIAorQ0ZHODAyMTEgYW5kIE5MODAyMTEKK1A6CUpvaGFubmVzIEJlcmcKK006CWpvaGFubmVzQHNpcHNvbHV0aW9ucy5uZXQKK0w6CWxpbnV4LXdpcmVsZXNzQHZnZXIua2VybmVsLm9yZworUzoJTWFpbnRhaW5lZAorCiBDT01NT04gSU5URVJORVQgRklMRSBTWVNURU0gKENJRlMpCiBQOglTdGV2ZSBGcmVuY2gKIE06CXNmcmVuY2hAc2FtYmEub3JnCkBAIC04OTksNyArOTEzLDcgQEAKIEw6CXNhbWJhLXRlY2huaWNhbEBsaXN0cy5zYW1iYS5vcmcKIFc6CWh0dHA6Ly91czEuc2FtYmEub3JnL3NhbWJhL0xpbnV4X0NJRlNfY2xpZW50Lmh0bWwKIFQ6CWdpdCBrZXJuZWwub3JnOi9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvc2ZyZW5jaC9jaWZzLTIuNi5naXQKLVM6CVN1cHBvcnRlZAkKK1M6CVN1cHBvcnRlZAogCiBDT05GSUdGUwogUDoJSm9lbCBCZWNrZXIKQEAgLTk2Nyw2ICs5ODEsMTEgQEAKIFc6CWh0dHA6Ly93d3cud2l0dHNlbmQuY29tL2NvbXB1dG9uZS5odG1sCiBTOglNYWludGFpbmVkCiAKK0NPTkVYQU5UIEFDQ0VTU1JVTk5FUiBVU0IgRFJJVkVSCitQOglTaW1vbiBBcmxvdHQKK006CWN4YWNydUBmaXJlLmxwMC5ldQorUzoJTWFpbnRhaW5lZAorCiBDT1NBL1NSUCBTWU5DIFNFUklBTCBEUklWRVIKIFA6CUphbiAiWWVueWEiIEthc3ByemFrCiBNOglrYXNAZmkubXVuaS5jegpAQCAtMTAzNCw5ICsxMDUzLDggQEAKIAogQ1lDTEFERVMgMlggU1lOQyBDQVJEIERSSVZFUgogUDoJQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvCi1NOglhY21lQGNvbmVjdGl2YS5jb20uYnIKLVc6CWh0dHA6Ly9hZHZvZ2F0by5vcmcvcGVyc29uL2FjbWUKLUw6CWN5Y3N5bi1kZXZlbEBiYXphci5jb25lY3RpdmEuY29tLmJyCitNOglhY21lQGdob3N0cHJvdG9jb2xzLm5ldAorVzoJaHR0cDovL29vcHMuZ2hvc3Rwcm90b2NvbHMubmV0OjgxL2Jsb2cKIFM6CU1haW50YWluZWQKIAogQ1lDTEFERVMgQVNZTkMgTVVYIERSSVZFUgpAQCAtMTA3Nyw3ICsxMDk1LDcgQEAKIAogRENDUCBQUk9UT0NPTAogUDoJQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvCi1NOglhY21lQG1hbmRyaXZhLmNvbQorTToJYWNtZUBnaG9zdHByb3RvY29scy5uZXQKIEw6CWRjY3BAdmdlci5rZXJuZWwub3JnCiBXOglodHRwOi8vbGludXgtbmV0Lm9zZGwub3JnL2luZGV4LnBocC9EQ0NQCiBTOglNYWludGFpbmVkCkBAIC0xMzc2LDYgKzEzOTQsMTMgQEAKIEw6CW5ldGRldkB2Z2VyLmtlcm5lbC5vcmcKIFM6CU1haW50YWluZWQKIAorRlJFRVNDQUxFIEhJR0hTUEVFRCBVU0IgREVWSUNFIERSSVZFUgorUDoJTGkgWWFuZworTToJbGVvbGlAZnJlZXNjYWxlLmNvbQorTDoJbGludXgtdXNiLWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldAorTDoJbGludXhwcGMtZW1iZWRkZWRAb3psYWJzLm9yZworUzoJTWFpbnRhaW5lZAorCiBGSUxFIExPQ0tJTkcgKGZsb2NrKCkgYW5kIGZjbnRsKCkvbG9ja2YoKSkKIFA6CU1hdHRoZXcgV2lsY294CiBNOgltYXR0aGV3QHdpbC5jeApAQCAtMTU0MiwyMyArMTU2NywyNCBAQAogTToJY2hpcmFnLmthbnRoYXJpYUBocC5jb20KIEw6CWlzc19zdG9yYWdlZGV2QGhwLmNvbQogUzoJTWFpbnRhaW5lZAotIAorCiBIRVdMRVRULVBBQ0tBUkQgU01BUlQyIFJBSUQgRFJJVkVSCiBQOglDaGlyYWcgS2FudGhhcmlhCiBNOgljaGlyYWcua2FudGhhcmlhQGhwLmNvbQogTDoJaXNzX3N0b3JhZ2VkZXZAaHAuY29tCiBTOglNYWludGFpbmVkCi0gCisKIEhFV0xFVFQtUEFDS0FSRCBTTUFSVCBDSVNTIFJBSUQgRFJJVkVSIChjY2lzcykKIFA6CU1pa2UgTWlsbGVyCiBNOgltaWtlLm1pbGxlckBocC5jb20KIEw6CWlzc19zdG9yYWdlZGV2QGhwLmNvbQogUzoJU3VwcG9ydGVkCi0gCisKIEhPU1QgQVAgRFJJVkVSCiBQOglKb3VuaSBNYWxpbmVuCi1NOglqa21hbGluZUBjYy5odXQuZmkKLUw6CWhvc3RhcEBzaG1vby5jb20KK006CWpAdzEuZmkKK0w6CWhvc3RhcEBzaG1vby5jb20gKHN1YnNjcmliZXJzLW9ubHkpCitMOglsaW51eC13aXJlbGVzc0B2Z2VyLmtlcm5lbC5vcmcKIFc6CWh0dHA6Ly9ob3N0YXAuZXBpdGVzdC5maS8KIFM6CU1haW50YWluZWQKIApAQCAtMTYzMiwxNSArMTY1OCw2IEBACiBUOglnaXQga2VybmVsLm9yZzovcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L2FlZ2wvbGludXgtMi42LmdpdAogUzoJTWFpbnRhaW5lZAogCi1JQk0gQUNQSSBFWFRSQVMgRFJJVkVSCi1QOglIZW5yaXF1ZSBkZSBNb3JhZXMgSG9sc2NodWgKLU06CWlibS1hY3BpQGhtaC5lbmcuYnIKLUw6CWlibS1hY3BpLWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldAotVzoJaHR0cDovL2libS1hY3BpLnNvdXJjZWZvcmdlLm5ldAotVzoJaHR0cDovL3RoaW5rd2lraS5vcmcvd2lraS9JYm0tYWNwaQotVDoJZ2l0IHJlcG8ub3IuY3ovbGludXgtMi42L2xpbnV4LWFjcGktMi42L2libS1hY3BpLTIuNi5naXQKLVM6CU1haW50YWluZWQKLQogU04tSUE2NCAoSXRhbml1bSkgU1VCLVBMQVRGT1JNCiBQOglKZXMgU29yZW5zZW4KIE06CWplc0BzZ2kuY29tCkBAIC0xNjY1LDcgKzE2ODIsNyBAQAogUDoJRGF2ZSBKZWZmZXJ5CiBNOglpcHNsaW51eEBhZGFwdGVjLmNvbQogVzoJaHR0cDovL3d3dy5kZXZlbG9wZXIuaWJtLmNvbS93ZWxjb21lL25ldGZpbml0eS9zZXJ2ZXJhaWQuaHRtbAotUzoJU3VwcG9ydGVkIAorUzoJU3VwcG9ydGVkCiAKIElERSBTVUJTWVNURU0KIFA6CUJhcnRsb21pZWogWm9sbmllcmtpZXdpY3oKQEAgLTE3OTQsNiArMTgxMSw3IEBACiBNOglqZWZmcmV5LnQua2lyc2hlckBpbnRlbC5jb20KIFA6CUF1a2UgS29rCiBNOglhdWtlLWphbi5oLmtva0BpbnRlbC5jb20KK0w6CWUxMDAwLWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldAogVzoJaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9lMTAwMC8KIFM6CVN1cHBvcnRlZAogCkBAIC0xODA4LDYgKzE4MjYsNyBAQAogTToJamVmZnJleS50LmtpcnNoZXJAaW50ZWwuY29tCiBQOglBdWtlIEtvawogTToJYXVrZS1qYW4uaC5rb2tAaW50ZWwuY29tCitMOgllMTAwMC1kZXZlbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQKIFc6CWh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvZTEwMDAvCiBTOglTdXBwb3J0ZWQKIApAQCAtMTgyMiw2ICsxODQxLDcgQEAKIE06CWplc3NlLmJyYW5kZWJ1cmdAaW50ZWwuY29tCiBQOglBdWtlIEtvawogTToJYXVrZS1qYW4uaC5rb2tAaW50ZWwuY29tCitMOgllMTAwMC1kZXZlbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQKIFc6CWh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvZTEwMDAvCiBTOglTdXBwb3J0ZWQKIApAQCAtMTgzMCw2ICsxODUwLDcgQEAKIE06CXlpLnpodUBpbnRlbC5jb20KIFA6CUphbWVzIEtldHJlbm9zCiBNOglqa2V0cmVub0BsaW51eC5pbnRlbC5jb20KK0w6CWxpbnV4LXdpcmVsZXNzQHZnZXIua2VybmVsLm9yZwogTDoJaXB3MjEwMC1kZXZlbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQKIEw6CWh0dHA6Ly9saXN0cy5zb3VyY2Vmb3JnZS5uZXQvbWFpbG1hbi9saXN0aW5mby9pcHcyMTAwLWRldmVsCiBXOglodHRwOi8vaXB3MjEwMC5zb3VyY2Vmb3JnZS5uZXQKQEAgLTE4NDAsNiArMTg2MSw3IEBACiBNOgl5aS56aHVAaW50ZWwuY29tCiBQOglKYW1lcyBLZXRyZW5vcwogTToJamtldHJlbm9AbGludXguaW50ZWwuY29tCitMOglsaW51eC13aXJlbGVzc0B2Z2VyLmtlcm5lbC5vcmcKIEw6CWlwdzIxMDAtZGV2ZWxAbGlzdHMuc291cmNlZm9yZ2UubmV0CiBMOglodHRwOi8vbGlzdHMuc291cmNlZm9yZ2UubmV0L21haWxtYW4vbGlzdGluZm8vaXB3MjEwMC1kZXZlbAogVzoJaHR0cDovL2lwdzIyMDAuc291cmNlZm9yZ2UubmV0CkBAIC0xODcxLDcgKzE4OTMsNyBAQAogCiBJUFggTkVUV09SSyBMQVlFUgogUDoJQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvCi1NOglhY21lQGNvbmVjdGl2YS5jb20uYnIKK006CWFjbWVAZ2hvc3Rwcm90b2NvbHMubmV0CiBMOgluZXRkZXZAdmdlci5rZXJuZWwub3JnCiBTOglNYWludGFpbmVkCiAKQEAgLTE5NjUsNyArMTk4Nyw3IEBACiBQOglTYW0gUmF2bmJvcmcKIE06CXNhbUByYXZuYm9yZy5vcmcKIFQ6CWdpdCBrZXJuZWwub3JnOi9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvc2FtL2tidWlsZC5naXQKLVM6CU1haW50YWluZWQgCitTOglNYWludGFpbmVkCiAKIEtFUk5FTCBKQU5JVE9SUwogUDoJU2V2ZXJhbApAQCAtMjEwOCw3ICsyMTMwLDcgQEAKIAogTExDICg4MDIuMikKIFA6CUFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbwotTToJYWNtZUBjb25lY3RpdmEuY29tLmJyCitNOglhY21lQGdob3N0cHJvdG9jb2xzLm5ldAogUzoJTWFpbnRhaW5lZAogCiBMSU5VWCBGT1IgNjRCSVQgUE9XRVJQQwpAQCAtMjE0NSw3ICsyMTY3LDcgQEAKIExPR0lDQUwgRElTSyBNQU5BR0VSIFNVUFBPUlQgKExETSwgV2luZG93cyAyMDAwL1hQIER5bmFtaWMgRGlza3MpCiBQOglSaWNoYXJkIFJ1c3NvbiAoRmxhdENhcCkKIE06CWxkbUBmbGF0Y2FwLm9yZwotTDoJbGRtLWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldAkKK0w6CWxkbS1kZXZlbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQKIFc6CWh0dHA6Ly9sZG0uc291cmNlZm9yZ2UubmV0CiBTOglNYWludGFpbmVkCiAKQEAgLTIyMzYsNiArMjI1OCwxNCBAQAogVDoJZ2l0IGdpdDovL2dpdC5pbmZyYWRlYWQub3JnL210ZC0yLjYuZ2l0CiBTOglNYWludGFpbmVkCiAKK1VOU09SVEVEIEJMT0NLIElNQUdFUyAoVUJJKQorUDoJQXJ0ZW0gQml0eXV0c2tpeQorTToJZGVkZWtpbmRAaW5mcmFkZWFkLm9yZworVzoJaHR0cDovL3d3dy5saW51eC1tdGQuaW5mcmFkZWFkLm9yZy8KK0w6CWxpbnV4LW10ZEBsaXN0cy5pbmZyYWRlYWQub3JnCitUOglnaXQgZ2l0Oi8vZ2l0LmluZnJhZGVhZC5vcmcvdWJpLTIuNi5naXQKK1M6CU1haW50YWluZWQKKwogTUlDUk9URUsgWDYgU0NBTk5FUgogUDoJT2xpdmVyIE5ldWt1bQogTToJb2xpdmVyQG5ldWt1bS5uYW1lCkBAIC0yNDczLDYgKzI1MDMsMTkgQEAKIEw6CWxpbnV4LWZiZGV2LWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldCAoc3Vic2NyaWJlcnMtb25seSkKIFM6CU1haW50YWluZWQKIAorTkVURVJJT04gKFMySU8pIFhmcmFtZSAxMEdiRSBEUklWRVIKK1A6CVJhbWtyaXNobmEgVmVwYQorTToJcmFtLnZlcGFAbmV0ZXJpb24uY29tCitQOglSYXN0YXB1ciBTYW50b3NoCitNOglzYW50b3NoLnJhc3RhcHVyQG5ldGVyaW9uLmNvbQorUDoJU2l2YWt1bWFyIFN1YnJhbWFuaQorTToJc2l2YWt1bWFyLnN1YnJhbWFuaUBuZXRlcmlvbi5jb20KK1A6CVNyZWVuaXZhc2EgSG9ubnVyCitNOglzcmVlbml2YXNhLmhvbm51ckBuZXRlcmlvbi5jb20KK0w6CW5ldGRldkB2Z2VyLmtlcm5lbC5vcmcKK1c6CWh0dHA6Ly90cmFjLm5ldGVyaW9uLmNvbS9jZ2ktYmluL3RyYWMuY2dpL3dpa2kvVGl0bGVJbmRleD9hbm9ueW1vdXMKK1M6CVN1cHBvcnRlZAorCiBPUEVOQ09SRVMgSTJDIEJVUyBEUklWRVIKIFA6CVBldGVyIEtvcnNnYWFyZAogTToJamFjbWV0QHN1bnNpdGUuZGsKQEAgLTI0ODYsMTMgKzI1MjksMTMgQEAKIE06CWt1cnQuaGFja2VsQG9yYWNsZS5jb20KIEw6CW9jZnMyLWRldmVsQG9zcy5vcmFjbGUuY29tCiBXOglodHRwOi8vb3NzLm9yYWNsZS5jb20vcHJvamVjdHMvb2NmczIvCi1TOglTdXBwb3J0ZWQJCitTOglTdXBwb3J0ZWQKIAogT0xZTVBJQyBORVRXT1JLIERSSVZFUgogUDoJUGV0ZXIgRGUgU2hyaWp2ZXIKIE06CXAyQGFjZS51bHlzc2lzLnN0dWRlbnQua3VsZXV2ZW4uYWMuYmUKIFA6CU1pa2UgUGhpbGxpcHMKLU06CW1pa2VwQGxpbnV4dHIubmV0IAorTToJbWlrZXBAbGludXh0ci5uZXQKIEw6CW5ldGRldkB2Z2VyLmtlcm5lbC5vcmcKIEw6CWxpbnV4LXRyQGxpbnV4dHIubmV0CiBXOglodHRwOi8vd3d3LmxpbnV4dHIubmV0CkBAIC0yNTA4LDYgKzI1NTEsMTIgQEAKIE06CWxhZm9yZ2VAZ251bW9ua3Mub3JnCiBTOglNYWludGFpbmVkCiAKK09NTklWSVNJT04gT1Y3NjcwIFNFTlNPUiBEUklWRVIKK1A6ICAgCUpvbmF0aGFuIENvcmJldAorTToJY29yYmV0QGx3bi5uZXQKK0w6CXZpZGVvNGxpbnV4LWxpc3RAcmVkaGF0LmNvbQorUzoJTWFpbnRhaW5lZAorCiBPTlNUUkVBTSBTQ1NJIFRBUEUgRFJJVkVSCiBQOglXaWxsZW0gUmllZGUKIE06CW9zc3RAcmllZGUub3JnCkBAIC0yNTMyLDYgKzI1ODEsNyBAQAogTToJcHJvc2tpQGdudS5vcmcKIFA6CURhdmlkIEdpYnNvbgogTToJaGVybWVzQGdpYnNvbi5kcm9wYmVhci5pZC5hdQorTDoJbGludXgtd2lyZWxlc3NAdmdlci5rZXJuZWwub3JnCiBMOglvcmlub2NvLXVzZXJzQGxpc3RzLnNvdXJjZWZvcmdlLm5ldAogTDoJb3Jpbm9jby1kZXZlbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQKIFc6CWh0dHA6Ly93d3cubm9uZ251Lm9yZy9vcmlub2NvLwpAQCAtMjcxMSw3ICsyNzYxLDcgQEAKIFBSSVNNNTQgV0lSRUxFU1MgRFJJVkVSCiBQOglQcmlzbTU0IERldmVsb3BtZW50IFRlYW0KIE06CWRldmVsb3BlcnNAaXNsc20ub3JnCi1MOgluZXRkZXZAdmdlci5rZXJuZWwub3JnCitMOglsaW51eC13aXJlbGVzc0B2Z2VyLmtlcm5lbC5vcmcKIFc6CWh0dHA6Ly9wcmlzbTU0Lm9yZwogUzoJTWFpbnRhaW5lZAogCkBAIC0yNzgyLDcgKzI4MzIsNyBAQAogUkFZTElOSy9XRUJHRUFSIDgwMi4xMSBXSVJFTEVTUyBMQU4gRFJJVkVSCiBQOglDb3JleSBUaG9tYXMKIE06CWNvcmV5QHdvcmxkLnN0ZC5jb20KLUw6CWxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmcKK0w6CWxpbnV4LXdpcmVsZXNzQHZnZXIua2VybmVsLm9yZwogUzoJTWFpbnRhaW5lZAogCiBSQU5ET00gTlVNQkVSIERSSVZFUgpAQCAtMjk2MSw4ICszMDExLDEwIEBACiBNOglzZHNAdHljaG8ubnNhLmdvdgogUDoJSmFtZXMgTW9ycmlzCiBNOglqbW9ycmlzQG5hbWVpLm9yZworUDoJRXJpYyBQYXJpcworTToJZXBhcmlzQHBhcmlzcGxhY2Uub3JnCiBMOglsaW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnIChrZXJuZWwgaXNzdWVzKQotTDogCXNlbGludXhAdHljaG8ubnNhLmdvdiAoZ2VuZXJhbCBkaXNjdXNzaW9uKQorTDogCXNlbGludXhAdHljaG8ubnNhLmdvdiAoc3Vic2NyaWJlcnMtb25seSwgZ2VuZXJhbCBkaXNjdXNzaW9uKQogVzoJaHR0cDovL3d3dy5uc2EuZ292L3NlbGludXgKIFM6CVN1cHBvcnRlZAogCkBAIC0zMDI0LDcgKzMwNzYsNyBAQAogUDoJVGhvbWFzIFdpbmlzY2hob2ZlcgogTToJdGhvbWFzQHdpbmlzY2hob2Zlci5uZXQKIFc6CWh0dHA6Ly93d3cud2luaXNjaGhvZmVyLm5ldC9saW51eHNpc3ZnYS5zaHRtbAotUzoJTWFpbnRhaW5lZAkKK1M6CU1haW50YWluZWQKIAogU0lTIFVTQjJWR0EgRFJJVkVSCiBQOglUaG9tYXMgV2luaXNjaGhvZmVyCkBAIC0zMDQ1LDcgKzMwOTcsNyBAQAogUDoJRGFuaWVsIERyYWtlCiBNOglkc2RAZ2VudG9vLm9yZwogVzoJaHR0cDovL3NvZnRtYWMuc2lwc29sdXRpb25zLm5ldC8KLUw6CW5ldGRldkB2Z2VyLmtlcm5lbC5vcmcKK0w6CWxpbnV4LXdpcmVsZXNzQHZnZXIua2VybmVsLm9yZwogUzoJTWFpbnRhaW5lZAogCiBTT0ZUV0FSRSBSQUlEIChNdWx0aXBsZSBEaXNrcykgU1VQUE9SVApAQCAtMzEyMSw2ICszMTczLDE1IEBACiBNOgljaHJpc0B6YW5rZWwubmV0CiBTOglNYWludGFpbmVkCiAKK1RISU5LUEFEIEFDUEkgRVhUUkFTIERSSVZFUgorUDoJSGVucmlxdWUgZGUgTW9yYWVzIEhvbHNjaHVoCitNOglpYm0tYWNwaUBobWguZW5nLmJyCitMOglpYm0tYWNwaS1kZXZlbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQKK1c6CWh0dHA6Ly9pYm0tYWNwaS5zb3VyY2Vmb3JnZS5uZXQKK1c6CWh0dHA6Ly90aGlua3dpa2kub3JnL3dpa2kvSWJtLWFjcGkKK1Q6CWdpdCByZXBvLm9yLmN6L2xpbnV4LTIuNi9saW51eC1hY3BpLTIuNi9pYm0tYWNwaS0yLjYuZ2l0CitTOglNYWludGFpbmVkCisKIFVsdHJhU1BBUkMgKHNwYXJjNjQpOgogUDoJRGF2aWQgUy4gTWlsbGVyCiBNOglkYXZlbUBkYXZlbWxvZnQubmV0CkBAIC0zNTczLDcgKzM2MzQsNyBAQAogVzoJaHR0cDovL3d3dy5jb25uZWN0dGVjaC5jb20KIFM6CVN1cHBvcnRlZAogCi1VU0IgU045QzEweCBEUklWRVIKK1VTQiBTTjlDMXh4IERSSVZFUgogUDoJTHVjYSBSaXNvbGlhCiBNOglsdWNhLnJpc29saWFAc3R1ZGlvLnVuaWJvLml0CiBMOglsaW51eC11c2ItZGV2ZWxAbGlzdHMuc291cmNlZm9yZ2UubmV0CkBAIC0zNjI4LDYgKzM2ODksMTQgQEAKIFc6CWh0dHA6Ly9saW51eC1sYzEwMDAyMC5zb3VyY2Vmb3JnZS5uZXQKIFM6CU1haW50YWluZWQKIAorVVNCIFpSMzY0WFggRFJJVkVSCitQOglBbnRvaW5lIEphY3F1ZXQKK006CXJveWFsZUB6ZXJlem8uY29tCitMOglsaW51eC11c2ItZGV2ZWxAbGlzdHMuc291cmNlZm9yZ2UubmV0CitMOgl2aWRlbzRsaW51eC1saXN0QHJlZGhhdC5jb20KK1c6CWh0dHA6Ly9yb3lhbGUuemVyZXpvLmNvbS96cjM2NHh4LworUzoJTWFpbnRhaW5lZAorCiBVU0VSLU1PREUgTElOVVgKIFA6CUplZmYgRGlrZQogTToJamRpa2VAa2FyYXlhLmNvbQpAQCAtMzYzNSw3ICszNzA0LDcgQEAKIEw6CXVzZXItbW9kZS1saW51eC11c2VyQGxpc3RzLnNvdXJjZWZvcmdlLm5ldAogVzoJaHR0cDovL3VzZXItbW9kZS1saW51eC5zb3VyY2Vmb3JnZS5uZXQKIFM6CU1haW50YWluZWQKLQkKKwogRkFUL1ZGQVQvTVNET1MgRklMRVNZU1RFTToKIFA6CU9HQVdBIEhpcm9mdW1pCiBNOgloaXJvZnVtaUBtYWlsLnBhcmtuZXQuY28uanAKQEAgLTM3NTAsNiArMzgxOSw3IEBACiBXQVZFTEFOIE5FVFdPUksgRFJJVkVSICYgV0lSRUxFU1MgRVhURU5TSU9OUwogUDoJSmVhbiBUb3VycmlsaGVzCiBNOglqdEBocGwuaHAuY29tCitMOglsaW51eC13aXJlbGVzc0B2Z2VyLmtlcm5lbC5vcmcKIFc6CWh0dHA6Ly93d3cuaHBsLmhwLmNvbS9wZXJzb25hbC9KZWFuX1RvdXJyaWxoZXMvTGludXgvCiBTOglNYWludGFpbmVkCiAKQEAgLTM3NjYsOCArMzgzNiw5IEBACiAKIFdMMzUwMSBXSVJFTEVTUyBQQ01DSUEgQ0FSRCBEUklWRVIKIFA6CUFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbwotTToJYWNtZUBjb25lY3RpdmEuY29tLmJyCi1XOglodHRwOi8vYWR2b2dhdG8ub3JnL3BlcnNvbi9hY21lCitNOglhY21lQGdob3N0cHJvdG9jb2xzLm5ldAorTDoJbGludXgtd2lyZWxlc3NAdmdlci5rZXJuZWwub3JnCitXOglodHRwOi8vb29wcy5naG9zdHByb3RvY29scy5uZXQ6ODEvYmxvZwogUzoJTWFpbnRhaW5lZAogCiBYLjI1IE5FVFdPUksgTEFZRVIKQEAgLTM4MzAsNiArMzkwMSw3IEBACiBQOglVbHJpY2ggS3VuaXR6CiBNOglrdW5lQGRlaW5lLXRhbGVyLmRlCiBXOglodHRwOi8vemQxMjExLmF0aC5jeC93aWtpL0RyaXZlclJld3JpdGUKK0w6CWxpbnV4LXdpcmVsZXNzQHZnZXIua2VybmVsLm9yZwogTDoJemQxMjExLWRldnNAbGlzdHMuc291cmNlZm9yZ2UubmV0IChzdWJzY3JpYmVycy1vbmx5KQogUzoJTWFpbnRhaW5lZAogCmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2xpYi9NYWtlZmlsZSBiL2FyY2gvYWxwaGEvbGliL01ha2VmaWxlCmluZGV4IDIxY2Y2MjQuLmVhMDk4ZjMgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEvbGliL01ha2VmaWxlCisrKyBiL2FyY2gvYWxwaGEvbGliL01ha2VmaWxlCkBAIC0zNiw3ICszNiw2IEBACiAJJChldjYteSljc3VtX2lwdjZfbWFnaWMubyBcCiAJJChldjYteSljbGVhcl9wYWdlLm8gXAogCSQoZXY2LXkpY29weV9wYWdlLm8gXAotCXN0cmNhc2VjbXAubyBcCiAJZnByZWcubyBcCiAJY2FsbGJhY2tfc3JtLm8gc3JtX3B1dHMubyBzcm1fcHJpbnRrLm8KIApkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9saWIvc3RyY2FzZWNtcC5jIGIvYXJjaC9hbHBoYS9saWIvc3RyY2FzZWNtcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTU3YTIxLi4wMDAwMDAwCi0tLSBhL2FyY2gvYWxwaGEvbGliL3N0cmNhc2VjbXAuYworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qCi0gKiAgbGludXgvYXJjaC9hbHBoYS9saWIvc3RyY2FzZWNtcC5jCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotCi0KLS8qIFdlIGhhbmRsZSBub3RoaW5nIGhlcmUgZXhjZXB0IHRoZSBDIGxvY2FsZS4gIFNpbmNlIHRoaXMgaXMgdXNlZCBpbgotICAgb25seSBvbmUgcGxhY2UsIG9uIHN0cmluZ3Mga25vd24gdG8gY29udGFpbiBvbmx5IDcgYml0IEFTQ0lJLCB0aGlzCi0gICBpcyBvay4gICovCi0KLWludCBzdHJjYXNlY21wKGNvbnN0IGNoYXIgKmEsIGNvbnN0IGNoYXIgKmIpCi17Ci0JaW50IGNhLCBjYjsKLQotCWRvIHsKLQkJY2EgPSAqYSsrICYgMHhmZjsKLQkJY2IgPSAqYisrICYgMHhmZjsKLQkJaWYgKGNhID49ICdBJyAmJiBjYSA8PSAnWicpCi0JCQljYSArPSAnYScgLSAnQSc7Ci0JCWlmIChjYiA+PSAnQScgJiYgY2IgPD0gJ1onKQotCQkJY2IgKz0gJ2EnIC0gJ0EnOwotCX0gd2hpbGUgKGNhID09IGNiICYmIGNhICE9ICdcMCcpOwotCi0JcmV0dXJuIGNhIC0gY2I7Ci19CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb21tb24vc2hhcnBzbF9wbS5jIGIvYXJjaC9hcm0vY29tbW9uL3NoYXJwc2xfcG0uYwppbmRleCBhOWJjNWI1Li41OTcyZGYyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb21tb24vc2hhcnBzbF9wbS5jCisrKyBiL2FyY2gvYXJtL2NvbW1vbi9zaGFycHNsX3BtLmMKQEAgLTc2NiwxMCArNzY2LDEwIEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcG1fb3BzIHNoYXJwc2xfcG1fb3BzID0gewotCS5wbV9kaXNrX21vZGUJPSBQTV9ESVNLX0ZJUk1XQVJFLAogCS5wcmVwYXJlCT0gcHhhX3BtX3ByZXBhcmUsCiAJLmVudGVyCQk9IGNvcmdpX3B4YV9wbV9lbnRlciwKIAkuZmluaXNoCQk9IHB4YV9wbV9maW5pc2gsCisJLnZhbGlkCQk9IHBtX3ZhbGlkX29ubHlfbWVtLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgc2hhcnBzbF9wbV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL3BtLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvcG0uYwppbmRleCBiNDliZmRhLi5mZjhkYjI5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvcG0uYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvcG0uYwpAQCAtMjAxLDcgKzIwMSw2IEBACiAKIAogc3RhdGljIHN0cnVjdCBwbV9vcHMgYXQ5MV9wbV9vcHMgPXsKLQkucG1fZGlza19tb2RlCT0gMCwKIAkudmFsaWQJCT0gYXQ5MV9wbV92YWxpZF9zdGF0ZSwKIAkucHJlcGFyZQk9IGF0OTFfcG1fcHJlcGFyZSwKIAkuZW50ZXIJCT0gYXQ5MV9wbV9lbnRlciwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvcG0uYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvcG0uYwppbmRleCA0OWVmZTkwLi4wMzgzYWIzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL3BtLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9wbS5jCkBAIC02OTgsMTAgKzY5OCwxMCBAQAogCiAKIHN0YXRpYyBzdHJ1Y3QgcG1fb3BzIG9tYXBfcG1fb3BzID17Ci0JLnBtX2Rpc2tfbW9kZQk9IDAsCiAJLnByZXBhcmUJPSBvbWFwX3BtX3ByZXBhcmUsCiAJLmVudGVyCQk9IG9tYXBfcG1fZW50ZXIsCiAJLmZpbmlzaAkJPSBvbWFwX3BtX2ZpbmlzaCwKKwkudmFsaWQJCT0gcG1fdmFsaWRfb25seV9tZW0sCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBvbWFwX3BtX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvcG0uYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvcG0uYwppbmRleCBkN2VlZTk5Li42ZjRhNTQzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL3BtLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9wbS5jCkBAIC0zNzAsMTAgKzM3MCwxMCBAQAogfQogCiBzdGF0aWMgc3RydWN0IHBtX29wcyBvbWFwX3BtX29wcyA9IHsKLQkucG1fZGlza19tb2RlCT0gMCwKIAkucHJlcGFyZQk9IG9tYXAyX3BtX3ByZXBhcmUsCiAJLmVudGVyCQk9IG9tYXAyX3BtX2VudGVyLAogCS5maW5pc2gJCT0gb21hcDJfcG1fZmluaXNoLAorCS52YWxpZAkJPSBwbV92YWxpZF9vbmx5X21lbSwKIH07CiAKIGludCBfX2luaXQgb21hcDJfcG1faW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1wbng0MDA4L3BtLmMgYi9hcmNoL2FybS9tYWNoLXBueDQwMDgvcG0uYwppbmRleCAzNjQ5Y2QzLi4yYTEzN2YzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXBueDQwMDgvcG0uYworKysgYi9hcmNoL2FybS9tYWNoLXBueDQwMDgvcG0uYwpAQCAtMTA3LDUwICsxMDcsMTkgQEAKIAljYXNlIFBNX1NVU1BFTkRfTUVNOgogCQlwbng0MDA4X3N1c3BlbmQoKTsKIAkJYnJlYWs7Ci0JY2FzZSBQTV9TVVNQRU5EX0RJU0s6Ci0JCXJldHVybiAtRU5PVFNVUFA7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCXJldHVybiAwOwogfQogCi0vKgotICogQ2FsbGVkIGFmdGVyIHByb2Nlc3NlcyBhcmUgZnJvemVuLCBidXQgYmVmb3JlIHdlIHNodXQgZG93biBkZXZpY2VzLgotICovCi1zdGF0aWMgaW50IHBueDQwMDhfcG1fcHJlcGFyZShzdXNwZW5kX3N0YXRlX3Qgc3RhdGUpCitzdGF0aWMgaW50IHBueDQwMDhfcG1fdmFsaWQoc3VzcGVuZF9zdGF0ZV90IHN0YXRlKQogewotCXN3aXRjaCAoc3RhdGUpIHsKLQljYXNlIFBNX1NVU1BFTkRfU1RBTkRCWToKLQljYXNlIFBNX1NVU1BFTkRfTUVNOgotCQlicmVhazsKLQotCWNhc2UgUE1fU1VTUEVORF9ESVNLOgotCQlyZXR1cm4gLUVOT1RTVVBQOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRUlOVkFMOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIDA7CisJcmV0dXJuIChzdGF0ZSA9PSBQTV9TVVNQRU5EX1NUQU5EQlkpIHx8CisJICAgICAgIChzdGF0ZSA9PSBQTV9TVVNQRU5EX01FTSk7CiB9CiAKLS8qCi0gKiBDYWxsZWQgYWZ0ZXIgZGV2aWNlcyBhcmUgcmUtc2V0dXAsIGJ1dCBiZWZvcmUgcHJvY2Vzc2VzIGFyZSB0aGF3ZWQuCi0gKi8KLXN0YXRpYyBpbnQgcG54NDAwOF9wbV9maW5pc2goc3VzcGVuZF9zdGF0ZV90IHN0YXRlKQotewotCXJldHVybiAwOwotfQotCi0vKgotICogU2V0IHRvIFBNX0RJU0tfRklSTVdBUkUgc28gd2UgY2FuIHF1aWNrbHkgdmV0byBzdXNwZW5kLXRvLWRpc2suCi0gKi8KIHN0YXRpYyBzdHJ1Y3QgcG1fb3BzIHBueDQwMDhfcG1fb3BzID0gewotCS5wcmVwYXJlID0gcG54NDAwOF9wbV9wcmVwYXJlLAogCS5lbnRlciA9IHBueDQwMDhfcG1fZW50ZXIsCi0JLmZpbmlzaCA9IHBueDQwMDhfcG1fZmluaXNoLAorCS52YWxpZCA9IHBueDQwMDhfcG1fdmFsaWQsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBwbng0MDA4X3BtX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL3BtLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9wbS5jCmluZGV4IGI0ZDgyNzYuLjZiZjE1YWUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL3BtLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvcG0uYwpAQCAtMjIzLDE0ICsyMjMsMTEgQEAKIAogRVhQT1JUX1NZTUJPTF9HUEwocHhhX3BtX2ZpbmlzaCk7CiAKLS8qCi0gKiBTZXQgdG8gUE1fRElTS19GSVJNV0FSRSBzbyB3ZSBjYW4gcXVpY2tseSB2ZXRvIHN1c3BlbmQtdG8tZGlzay4KLSAqLwogc3RhdGljIHN0cnVjdCBwbV9vcHMgcHhhX3BtX29wcyA9IHsKLQkucG1fZGlza19tb2RlCT0gUE1fRElTS19GSVJNV0FSRSwKIAkucHJlcGFyZQk9IHB4YV9wbV9wcmVwYXJlLAogCS5lbnRlcgkJPSBweGFfcG1fZW50ZXIsCiAJLmZpbmlzaAkJPSBweGFfcG1fZmluaXNoLAorCS52YWxpZAkJPSBwbV92YWxpZF9vbmx5X21lbSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IHB4YV9wbV9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9wbS5jIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvcG0uYwppbmRleCA3ODZjODUzLi5kNjc0Y2YzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9wbS5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL3BtLmMKQEAgLTU5LDkgKzU5LDYgQEAKIAl1bnNpZ25lZCBsb25nIGdwaW8sIHNsZWVwX3NhdmVbU0xFRVBfU0FWRV9TSVpFXTsKIAlzdHJ1Y3QgdGltZXNwZWMgZGVsdGEsIHJ0YzsKIAotCWlmIChzdGF0ZSAhPSBQTV9TVVNQRU5EX01FTSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KIAkvKiBwcmVzZXJ2ZSBjdXJyZW50IHRpbWUgKi8KIAlydGMudHZfc2VjID0gUkNOUjsKIAlydGMudHZfbnNlYyA9IDA7CkBAIC0xMzQsMTIgKzEzMSw5IEBACiAJcmV0dXJuIHZpcnRfdG9fcGh5cyhzcCk7CiB9CiAKLS8qCi0gKiBTZXQgdG8gUE1fRElTS19GSVJNV0FSRSBzbyB3ZSBjYW4gcXVpY2tseSB2ZXRvIHN1c3BlbmQtdG8tZGlzay4KLSAqLwogc3RhdGljIHN0cnVjdCBwbV9vcHMgc2ExMXgwX3BtX29wcyA9IHsKLQkucG1fZGlza19tb2RlCT0gUE1fRElTS19GSVJNV0FSRSwKIAkuZW50ZXIJCT0gc2ExMXgwX3BtX2VudGVyLAorCS52YWxpZAkJPSBwbV92YWxpZF9vbmx5X21lbSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IHNhMTF4MF9wbV9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvcG0uYyBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9wbS5jCmluZGV4IGVjZjY4ZDYuLmM2YjAzZjggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9wbS5jCisrKyBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9wbS5jCkBAIC01MTEsMTEgKzUxMSw2IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWlmIChzdGF0ZSAhPSBQTV9TVVNQRU5EX01FTSkgewotCQlwcmludGsoS0VSTl9FUlIgUEZYICJlcnJvcjogb25seSBQTV9TVVNQRU5EX01FTSBzdXBwb3J0ZWRcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KIAkvKiBjaGVjayBpZiB3ZSBoYXZlIGFueXRoaW5nIHRvIHdha2UtdXAgd2l0aC4uLiBiYWQgdGhpbmdzIHNlZW0KIAkgKiB0byBoYXBwZW4gaWYgeW91IHN1c3BlbmQgd2l0aCBubyB3YWtldXAgKHN5c3RlbSB3aWxsIG9mdGVuCiAJICogcmVxdWlyZSBhIGZ1bGwgcG93ZXItY3ljbGUpCkBAIC02MTcsMzAgKzYxMiw5IEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qCi0gKiBDYWxsZWQgYWZ0ZXIgcHJvY2Vzc2VzIGFyZSBmcm96ZW4sIGJ1dCBiZWZvcmUgd2Ugc2h1dCBkb3duIGRldmljZXMuCi0gKi8KLXN0YXRpYyBpbnQgczNjMjQxMF9wbV9wcmVwYXJlKHN1c3BlbmRfc3RhdGVfdCBzdGF0ZSkKLXsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIENhbGxlZCBhZnRlciBkZXZpY2VzIGFyZSByZS1zZXR1cCwgYnV0IGJlZm9yZSBwcm9jZXNzZXMgYXJlIHRoYXdlZC4KLSAqLwotc3RhdGljIGludCBzM2MyNDEwX3BtX2ZpbmlzaChzdXNwZW5kX3N0YXRlX3Qgc3RhdGUpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBTZXQgdG8gUE1fRElTS19GSVJNV0FSRSBzbyB3ZSBjYW4gcXVpY2tseSB2ZXRvIHN1c3BlbmQtdG8tZGlzay4KLSAqLwogc3RhdGljIHN0cnVjdCBwbV9vcHMgczNjMjQxMF9wbV9vcHMgPSB7Ci0JLnBtX2Rpc2tfbW9kZQk9IFBNX0RJU0tfRklSTVdBUkUsCi0JLnByZXBhcmUJPSBzM2MyNDEwX3BtX3ByZXBhcmUsCiAJLmVudGVyCQk9IHMzYzI0MTBfcG1fZW50ZXIsCi0JLmZpbmlzaAkJPSBzM2MyNDEwX3BtX2ZpbmlzaCwKKwkudmFsaWQJCT0gcG1fdmFsaWRfb25seV9tZW0sCiB9OwogCiAvKiBzM2MyNDEwX3BtX2luaXQKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvS2NvbmZpZyBiL2FyY2gvYXZyMzIvS2NvbmZpZwppbmRleCBjZTQwMTNhLi4zZWM3NjU4IDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL0tjb25maWcKKysrIGIvYXJjaC9hdnIzMi9LY29uZmlnCkBAIC01Nyw5ICs1Nyw2IEBACiAJYm9vbAogCWRlZmF1bHQgbgogCi1jb25maWcgR0VORVJJQ19CVVNUX1NQSU5MT0NLCi0JYm9vbAotCiBjb25maWcgR0VORVJJQ19IV0VJR0hUCiAJYm9vbAogCWRlZmF1bHQgeQpAQCAtNjgsNiArNjUsMTEgQEAKIAlib29sCiAJZGVmYXVsdCB5CiAKK2NvbmZpZyBHRU5FUklDX0JVRworCWJvb2wKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEJVRworCiBzb3VyY2UgImluaXQvS2NvbmZpZyIKIAogbWVudSAiU3lzdGVtIFR5cGUgYW5kIGZlYXR1cmVzIgpAQCAtMTA2LDYgKzEwOCw5IEBACiBjb25maWcgQk9BUkRfQVRTVEsxMDAwCiAJYm9vbCAiQVRTVEsxMDAwIGV2YWx1YXRpb24gYm9hcmQiCiAJc2VsZWN0IEJPQVJEX0FUU1RLMTAwMiBpZiBDUFVfQVQzMkFQNzAwMAorCitjb25maWcgQk9BUkRfQVROR1cxMDAKKwlib29sICJBVE5HVzEwMCBOZXR3b3JrIEdhdGV3YXkiCiBlbmRjaG9pY2UKIAogY2hvaWNlCkBAIC0xMTYsNiArMTIxLDggQEAKIAlib29sICJVLUJvb3QgKG9yIHNpbWlsYXIpIGJvb3Rsb2FkZXIiCiBlbmRjaG9pY2UKIAorc291cmNlICJhcmNoL2F2cjMyL21hY2gtYXQzMmFwL0tjb25maWciCisKIGNvbmZpZyBMT0FEX0FERFJFU1MKIAloZXgKIAlkZWZhdWx0IDB4MTAwMDAwMDAgaWYgTE9BREVSX1VfQk9PVD15ICYmIENQVV9BVDMyQVA3MDAwPXkKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvTWFrZWZpbGUgYi9hcmNoL2F2cjMyL01ha2VmaWxlCmluZGV4IDdiODQyZTkuLjYxMTVmYzEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvTWFrZWZpbGUKKysrIGIvYXJjaC9hdnIzMi9NYWtlZmlsZQpAQCAtMjcsNiArMjcsNyBAQAogaGVhZC15CQkJCQkrPSBhcmNoL2F2cjMyL2tlcm5lbC9oZWFkLm8KIGNvcmUtJChDT05GSUdfUExBVEZPUk1fQVQzMkFQKQkJKz0gYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC8KIGNvcmUtJChDT05GSUdfQk9BUkRfQVRTVEsxMDAwKQkJKz0gYXJjaC9hdnIzMi9ib2FyZHMvYXRzdGsxMDAwLworY29yZS0kKENPTkZJR19CT0FSRF9BVE5HVzEwMCkJCSs9IGFyY2gvYXZyMzIvYm9hcmRzL2F0bmd3MTAwLwogY29yZS0kKENPTkZJR19MT0FERVJfVV9CT09UKQkJKz0gYXJjaC9hdnIzMi9ib290L3UtYm9vdC8KIGNvcmUteQkJCQkJKz0gYXJjaC9hdnIzMi9rZXJuZWwvCiBjb3JlLXkJCQkJCSs9IGFyY2gvYXZyMzIvbW0vCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2JvYXJkcy9hdG5ndzEwMC9NYWtlZmlsZSBiL2FyY2gvYXZyMzIvYm9hcmRzL2F0bmd3MTAwL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3NDBhYTEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2F2cjMyL2JvYXJkcy9hdG5ndzEwMC9NYWtlZmlsZQpAQCAtMCwwICsxIEBACitvYmoteQkJCQkrPSBzZXR1cC5vIGZsYXNoLm8KZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvYm9hcmRzL2F0bmd3MTAwL2ZsYXNoLmMgYi9hcmNoL2F2cjMyL2JvYXJkcy9hdG5ndzEwMC9mbGFzaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5YjMyYTgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2F2cjMyL2JvYXJkcy9hdG5ndzEwMC9mbGFzaC5jCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKiBBVE5HVzEwMCBib2FyZC1zcGVjaWZpYyBmbGFzaCBpbml0aWFsaXphdGlvbgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA2IEF0bWVsIENvcnBvcmF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvcGh5c21hcC5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvc21jLmg+CisKK3N0YXRpYyBzdHJ1Y3Qgc21jX2NvbmZpZyBmbGFzaF9jb25maWcgX19pbml0ZGF0YSA9IHsKKwkubmNzX3JlYWRfc2V0dXAJCT0gMCwKKwkubnJkX3NldHVwCQk9IDQwLAorCS5uY3Nfd3JpdGVfc2V0dXAJPSAwLAorCS5ud2Vfc2V0dXAJCT0gMTAsCisKKwkubmNzX3JlYWRfcHVsc2UJCT0gODAsCisJLm5yZF9wdWxzZQkJPSA0MCwKKwkubmNzX3dyaXRlX3B1bHNlCT0gNjUsCisJLm53ZV9wdWxzZQkJPSA1NSwKKworCS5yZWFkX2N5Y2xlCQk9IDEyMCwKKwkud3JpdGVfY3ljbGUJCT0gMTIwLAorCisJLmJ1c193aWR0aAkJPSAyLAorCS5ucmRfY29udHJvbGxlZAkJPSAxLAorCS5ud2VfY29udHJvbGxlZAkJPSAxLAorCS5ieXRlX3dyaXRlCQk9IDEsCit9OworCitzdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gZmxhc2hfcGFydHNbXSA9IHsKKwl7CisJCS5uYW1lICAgICAgICAgICA9ICJ1LWJvb3QiLAorCQkub2Zmc2V0ICAgICAgICAgPSAweDAwMDAwMDAwLAorCQkuc2l6ZSAgICAgICAgICAgPSAweDAwMDIwMDAwLCAgICAgICAgICAgLyogMTI4IEtpQiAqLworCQkubWFza19mbGFncyAgICAgPSBNVERfV1JJVEVBQkxFLAorCX0sCisJeworCQkubmFtZSAgICAgICAgICAgPSAicm9vdCIsCisJCS5vZmZzZXQgICAgICAgICA9IDB4MDAwMjAwMDAsCisJCS5zaXplICAgICAgICAgICA9IDB4MDA3ZDAwMDAsCisJfSwKKwl7CisJCS5uYW1lICAgICAgICAgICA9ICJlbnYiLAorCQkub2Zmc2V0ICAgICAgICAgPSAweDAwN2YwMDAwLAorCQkuc2l6ZSAgICAgICAgICAgPSAweDAwMDEwMDAwLAorCQkubWFza19mbGFncyAgICAgPSBNVERfV1JJVEVBQkxFLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBoeXNtYXBfZmxhc2hfZGF0YSBmbGFzaF9kYXRhID0geworCS53aWR0aAkJPSAyLAorCS5ucl9wYXJ0cwk9IEFSUkFZX1NJWkUoZmxhc2hfcGFydHMpLAorCS5wYXJ0cwkJPSBmbGFzaF9wYXJ0cywKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgZmxhc2hfcmVzb3VyY2UgPSB7CisJLnN0YXJ0CQk9IDB4MDAwMDAwMDAsCisJLmVuZAkJPSAweDAwN2ZmZmZmLAorCS5mbGFncwkJPSBJT1JFU09VUkNFX01FTSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGZsYXNoX2RldmljZSA9IHsKKwkubmFtZQkJPSAicGh5c21hcC1mbGFzaCIsCisJLmlkCQk9IDAsCisJLnJlc291cmNlCT0gJmZsYXNoX3Jlc291cmNlLAorCS5udW1fcmVzb3VyY2VzCT0gMSwKKwkuZGV2CQk9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAmZmxhc2hfZGF0YSwKKwl9LAorfTsKKworLyogVGhpcyBuZWVkcyB0byBiZSBjYWxsZWQgYWZ0ZXIgdGhlIFNNQyBoYXMgYmVlbiBpbml0aWFsaXplZCAqLworc3RhdGljIGludCBfX2luaXQgYXRuZ3cxMDBfZmxhc2hfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwlyZXQgPSBzbWNfc2V0X2NvbmZpZ3VyYXRpb24oMCwgJmZsYXNoX2NvbmZpZyk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhdG5ndzEwMDogZmFpbGVkIHRvIHNldCBOT1IgZmxhc2ggdGltaW5nXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmZsYXNoX2RldmljZSk7CisKKwlyZXR1cm4gMDsKK30KK2RldmljZV9pbml0Y2FsbChhdG5ndzEwMF9mbGFzaF9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvYm9hcmRzL2F0bmd3MTAwL3NldHVwLmMgYi9hcmNoL2F2cjMyL2JvYXJkcy9hdG5ndzEwMC9zZXR1cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliYzM3ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2F2cjMyL2JvYXJkcy9hdG5ndzEwMC9zZXR1cC5jCkBAIC0wLDAgKzEsMTI0IEBACisvKgorICogQm9hcmQtc3BlY2lmaWMgc2V0dXAgY29kZSBmb3IgdGhlIEFUTkdXMTAwIE5ldHdvcmsgR2F0ZXdheQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA2IEF0bWVsIENvcnBvcmF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvYXQzMmFwNzAwMC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2JvYXJkLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvaW5pdC5oPgorCisvKiBJbml0aWFsaXplZCBieSBib290bG9hZGVyLXNwZWNpZmljIHN0YXJ0dXAgY29kZS4gKi8KK3N0cnVjdCB0YWcgKmJvb3Rsb2FkZXJfdGFncyBfX2luaXRkYXRhOworCitzdHJ1Y3QgZXRoX2FkZHIgeworCXU4IGFkZHJbNl07Cit9Oworc3RhdGljIHN0cnVjdCBldGhfYWRkciBfX2luaXRkYXRhIGh3X2FkZHJbMl07CitzdGF0aWMgc3RydWN0IGV0aF9wbGF0Zm9ybV9kYXRhIF9faW5pdGRhdGEgZXRoX2RhdGFbMl07CisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2JvYXJkX2luZm8gc3BpMF9ib2FyZF9pbmZvW10gX19pbml0ZGF0YSA9IHsKKwl7CisJCS5tb2RhbGlhcwk9ICJtdGRfZGF0YWZsYXNoIiwKKwkJLm1heF9zcGVlZF9oegk9IDEwMDAwMDAwLAorCQkuY2hpcF9zZWxlY3QJPSAwLAorCX0sCit9OworCisvKgorICogVGhlIG5leHQgdHdvIGZ1bmN0aW9ucyBzaG91bGQgZ28gYXdheSBhcyB0aGUgYm9vdCBsb2FkZXIgaXMKKyAqIHN1cHBvc2VkIHRvIGluaXRpYWxpemUgdGhlIG1hY2IgYWRkcmVzcyByZWdpc3RlcnMgd2l0aCBhIHZhbGlkCisgKiBldGhlcm5ldCBhZGRyZXNzLiBCdXQgd2UgbmVlZCB0byBrZWVwIGl0IGFyb3VuZCBmb3IgYSB3aGlsZSB1bnRpbAorICogd2UgY2FuIGJlIHJlYXNvbmFibHkgc3VyZSB0aGUgYm9vdCBsb2FkZXIgZG9lcyB0aGlzLgorICoKKyAqIFRoZSBwaHlfaWQgaXMgaWdub3JlZCBhcyB0aGUgZHJpdmVyIHdpbGwgcHJvYmUgZm9yIGl0LgorICovCitzdGF0aWMgaW50IF9faW5pdCBwYXJzZV90YWdfZXRoZXJuZXQoc3RydWN0IHRhZyAqdGFnKQoreworCWludCBpOworCisJaSA9IHRhZy0+dS5ldGhlcm5ldC5tYWNfaW5kZXg7CisJaWYgKGkgPCBBUlJBWV9TSVpFKGh3X2FkZHIpKQorCQltZW1jcHkoaHdfYWRkcltpXS5hZGRyLCB0YWctPnUuZXRoZXJuZXQuaHdfYWRkcmVzcywKKwkJICAgICAgIHNpemVvZihod19hZGRyW2ldLmFkZHIpKTsKKworCXJldHVybiAwOworfQorX190YWd0YWJsZShBVEFHX0VUSEVSTkVULCBwYXJzZV90YWdfZXRoZXJuZXQpOworCitzdGF0aWMgdm9pZCBfX2luaXQgc2V0X2h3X2FkZHIoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJY29uc3QgdTggKmFkZHI7CisJdm9pZCBfX2lvbWVtICpyZWdzOworCXN0cnVjdCBjbGsgKnBjbGs7CisKKwlpZiAoIXJlcykKKwkJcmV0dXJuOworCWlmIChwZGV2LT5pZCA+PSBBUlJBWV9TSVpFKGh3X2FkZHIpKQorCQlyZXR1cm47CisKKwlhZGRyID0gaHdfYWRkcltwZGV2LT5pZF0uYWRkcjsKKwlpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIoYWRkcikpCisJCXJldHVybjsKKworCS8qCisJICogU2luY2UgdGhpcyBpcyBib2FyZC1zcGVjaWZpYyBjb2RlLCB3ZSdsbCBjaGVhdCBhbmQgdXNlIHRoZQorCSAqIHBoeXNpY2FsIGFkZHJlc3MgZGlyZWN0bHkgYXMgd2UgaGFwcGVuIHRvIGtub3cgdGhhdCBpdCdzCisJICogdGhlIHNhbWUgYXMgdGhlIHZpcnR1YWwgYWRkcmVzcy4KKwkgKi8KKwlyZWdzID0gKHZvaWQgX19pb21lbSBfX2ZvcmNlICopcmVzLT5zdGFydDsKKwlwY2xrID0gY2xrX2dldCgmcGRldi0+ZGV2LCAicGNsayIpOworCWlmICghcGNsaykKKwkJcmV0dXJuOworCisJY2xrX2VuYWJsZShwY2xrKTsKKwlfX3Jhd193cml0ZWwoKGFkZHJbM10gPDwgMjQpIHwgKGFkZHJbMl0gPDwgMTYpCisJCSAgICAgfCAoYWRkclsxXSA8PCA4KSB8IGFkZHJbMF0sIHJlZ3MgKyAweDk4KTsKKwlfX3Jhd193cml0ZWwoKGFkZHJbNV0gPDwgOCkgfCBhZGRyWzRdLCByZWdzICsgMHg5Yyk7CisJY2xrX2Rpc2FibGUocGNsayk7CisJY2xrX3B1dChwY2xrKTsKK30KKworc3RydWN0IHBsYXRmb3JtX2RldmljZSAqYXQzMl91c2FydF9tYXBbMV07Cit1bnNpZ25lZCBpbnQgYXQzMl9ucl91c2FydHMgPSAxOworCit2b2lkIF9faW5pdCBzZXR1cF9ib2FyZCh2b2lkKQoreworCWF0MzJfbWFwX3VzYXJ0KDEsIDApOwkvKiBVU0FSVCAxOiAvZGV2L3R0eVMwLCBEQjkgKi8KKwlhdDMyX3NldHVwX3NlcmlhbF9jb25zb2xlKDApOworfQorCitzdGF0aWMgaW50IF9faW5pdCBhdG5ndzEwMF9pbml0KHZvaWQpCit7CisJLyoKKwkgKiBBVE5HVzEwMCB1c2VzIDE2LWJpdCBTRFJBTSBpbnRlcmZhY2UsIHNvIHdlIGRvbid0IG5lZWQgdG8KKwkgKiByZXNlcnZlIGFueSBwaW5zIGZvciBpdC4KKwkgKi8KKworCWF0MzJfYWRkX3N5c3RlbV9kZXZpY2VzKCk7CisKKwlhdDMyX2FkZF9kZXZpY2VfdXNhcnQoMCk7CisKKwlzZXRfaHdfYWRkcihhdDMyX2FkZF9kZXZpY2VfZXRoKDAsICZldGhfZGF0YVswXSkpOworCXNldF9od19hZGRyKGF0MzJfYWRkX2RldmljZV9ldGgoMSwgJmV0aF9kYXRhWzFdKSk7CisKKwlhdDMyX2FkZF9kZXZpY2Vfc3BpKDAsIHNwaTBfYm9hcmRfaW5mbywgQVJSQVlfU0laRShzcGkwX2JvYXJkX2luZm8pKTsKKworCXJldHVybiAwOworfQorcG9zdGNvcmVfaW5pdGNhbGwoYXRuZ3cxMDBfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2JvYXJkcy9hdHN0azEwMDAvYXRzdGsxMDAyLmMgYi9hcmNoL2F2cjMyL2JvYXJkcy9hdHN0azEwMDAvYXRzdGsxMDAyLmMKaW5kZXggNTk3NDc2OC4uYWJlNmNhMiAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9ib2FyZHMvYXRzdGsxMDAwL2F0c3RrMTAwMi5jCisrKyBiL2FyY2gvYXZyMzIvYm9hcmRzL2F0c3RrMTAwMC9hdHN0azEwMDIuYwpAQCAtMzMsNyArMzMsNyBAQAogc3RhdGljIHN0cnVjdCBldGhfYWRkciBfX2luaXRkYXRhIGh3X2FkZHJbMl07CiAKIHN0YXRpYyBzdHJ1Y3QgZXRoX3BsYXRmb3JtX2RhdGEgX19pbml0ZGF0YSBldGhfZGF0YVsyXTsKLWV4dGVybiBzdHJ1Y3QgbGNkY19wbGF0Zm9ybV9kYXRhIGF0c3RrMTAwMF9mYjBfZGF0YTsKK3N0YXRpYyBzdHJ1Y3QgbGNkY19wbGF0Zm9ybV9kYXRhIGF0c3RrMTAwMF9mYjBfZGF0YTsKIAogc3RhdGljIHN0cnVjdCBzcGlfYm9hcmRfaW5mbyBzcGkwX2JvYXJkX2luZm9bXSBfX2luaXRkYXRhID0gewogCXsKQEAgLTE0OCw2ICsxNDgsOCBAQAogCXNldF9od19hZGRyKGF0MzJfYWRkX2RldmljZV9ldGgoMCwgJmV0aF9kYXRhWzBdKSk7CiAKIAlhdDMyX2FkZF9kZXZpY2Vfc3BpKDAsIHNwaTBfYm9hcmRfaW5mbywgQVJSQVlfU0laRShzcGkwX2JvYXJkX2luZm8pKTsKKwlhdHN0azEwMDBfZmIwX2RhdGEuZmJtZW1fc3RhcnQgPSBmYm1lbV9zdGFydDsKKwlhdHN0azEwMDBfZmIwX2RhdGEuZmJtZW1fc2l6ZSA9IGZibWVtX3NpemU7CiAJYXQzMl9hZGRfZGV2aWNlX2xjZGMoMCwgJmF0c3RrMTAwMF9mYjBfZGF0YSk7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvYm9hcmRzL2F0c3RrMTAwMC9zZXR1cC5jIGIvYXJjaC9hdnIzMi9ib2FyZHMvYXRzdGsxMDAwL3NldHVwLmMKaW5kZXggMjcyYzAxMS4uMmJjNGI4OCAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9ib2FyZHMvYXRzdGsxMDAwL3NldHVwLmMKKysrIGIvYXJjaC9hdnIzMi9ib2FyZHMvYXRzdGsxMDAwL3NldHVwLmMKQEAgLTE4LDMzICsxOCwzIEBACiAKIC8qIEluaXRpYWxpemVkIGJ5IGJvb3Rsb2FkZXItc3BlY2lmaWMgc3RhcnR1cCBjb2RlLiAqLwogc3RydWN0IHRhZyAqYm9vdGxvYWRlcl90YWdzIF9faW5pdGRhdGE7Ci0KLXN0cnVjdCBsY2RjX3BsYXRmb3JtX2RhdGEgX19pbml0ZGF0YSBhdHN0azEwMDBfZmIwX2RhdGE7Ci0KLXZvaWQgX19pbml0IGJvYXJkX3NldHVwX2ZibWVtKHVuc2lnbmVkIGxvbmcgZmJtZW1fc3RhcnQsCi0JCQkgICAgICB1bnNpZ25lZCBsb25nIGZibWVtX3NpemUpCi17Ci0JaWYgKCFmYm1lbV9zaXplKQotCQlyZXR1cm47Ci0KLQlpZiAoIWZibWVtX3N0YXJ0KSB7Ci0JCXZvaWQgKmZibWVtOwotCi0JCWZibWVtID0gYWxsb2NfYm9vdG1lbV9sb3dfcGFnZXMoZmJtZW1fc2l6ZSk7Ci0JCWZibWVtX3N0YXJ0ID0gX19wYShmYm1lbSk7Ci0JfSBlbHNlIHsKLQkJcGdfZGF0YV90ICpwZ2RhdDsKLQotCQlmb3JfZWFjaF9vbmxpbmVfcGdkYXQocGdkYXQpIHsKLQkJCWlmIChmYm1lbV9zdGFydCA+PSBwZ2RhdC0+YmRhdGEtPm5vZGVfYm9vdF9zdGFydAotCQkJICAgICYmIGZibWVtX3N0YXJ0IDw9IHBnZGF0LT5iZGF0YS0+bm9kZV9sb3dfcGZuKQotCQkJCXJlc2VydmVfYm9vdG1lbV9ub2RlKHBnZGF0LCBmYm1lbV9zdGFydCwKLQkJCQkJCSAgICAgZmJtZW1fc2l6ZSk7Ci0JCX0KLQl9Ci0KLQlwcmludGsoIiVsdUtpQiBmcmFtZWJ1ZmZlciBtZW1vcnkgYXQgYWRkcmVzcyAweCUwOGx4XG4iLAotCSAgICAgICBmYm1lbV9zaXplID4+IDEwLCBmYm1lbV9zdGFydCk7Ci0JYXRzdGsxMDAwX2ZiMF9kYXRhLmZibWVtX3N0YXJ0ID0gZmJtZW1fc3RhcnQ7Ci0JYXRzdGsxMDAwX2ZiMF9kYXRhLmZibWVtX3NpemUgPSBmYm1lbV9zaXplOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9jb25maWdzL2F0bmd3MTAwX2RlZmNvbmZpZyBiL2FyY2gvYXZyMzIvY29uZmlncy9hdG5ndzEwMF9kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI1NGZmYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXZyMzIvY29uZmlncy9hdG5ndzEwMF9kZWZjb25maWcKQEAgLTAsMCArMSwxMDg1IEBACisjCisjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjEtcmM2CisjIFRodSBBcHIgMTIgMTY6MzU6MDcgMjAwNworIworQ09ORklHX0FWUjMyPXkKK0NPTkZJR19HRU5FUklDX0dQSU89eQorQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQorQ09ORklHX0hBUkRJUlFTX1NXX1JFU0VORD15CitDT05GSUdfR0VORVJJQ19JUlFfUFJPQkU9eQorQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQorQ09ORklHX0dFTkVSSUNfVElNRT15CisjIENPTkZJR19BUkNIX0hBU19JTE9HMl9VMzIgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTY0IGlzIG5vdCBzZXQKK0NPTkZJR19HRU5FUklDX0hXRUlHSFQ9eQorQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKK0NPTkZJR19HRU5FUklDX0JVRz15CitDT05GSUdfREVGQ09ORklHX0xJU1Q9Ii9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgorCisjCisjIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucworIworQ09ORklHX0VYUEVSSU1FTlRBTD15CitDT05GSUdfQlJPS0VOX09OX1NNUD15CitDT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCisKKyMKKyMgR2VuZXJhbCBzZXR1cAorIworQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgorIyBDT05GSUdfTE9DQUxWRVJTSU9OX0FVVE8gaXMgbm90IHNldAorQ09ORklHX1NXQVA9eQorQ09ORklHX1NZU1ZJUEM9eQorIyBDT05GSUdfSVBDX05TIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNWSVBDX1NZU0NUTD15CitDT05GSUdfUE9TSVhfTVFVRVVFPXkKK0NPTkZJR19CU0RfUFJPQ0VTU19BQ0NUPXkKK0NPTkZJR19CU0RfUFJPQ0VTU19BQ0NUX1YzPXkKKyMgQ09ORklHX1RBU0tTVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19VVFNfTlMgaXMgbm90IHNldAorIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAorIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAorQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQ9eQorIyBDT05GSUdfUkVMQVkgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKK0NPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCitDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQorQ09ORklHX1NZU0NUTD15CitDT05GSUdfRU1CRURERUQ9eQorIyBDT05GSUdfU1lTQ1RMX1NZU0NBTEwgaXMgbm90IHNldAorQ09ORklHX0tBTExTWU1TPXkKKyMgQ09ORklHX0tBTExTWU1TX0FMTCBpcyBub3Qgc2V0CisjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKK0NPTkZJR19IT1RQTFVHPXkKK0NPTkZJR19QUklOVEs9eQorQ09ORklHX0JVRz15CitDT05GSUdfRUxGX0NPUkU9eQorIyBDT05GSUdfQkFTRV9GVUxMIGlzIG5vdCBzZXQKK0NPTkZJR19GVVRFWD15CitDT05GSUdfRVBPTEw9eQorQ09ORklHX1NITUVNPXkKK0NPTkZJR19TTEFCPXkKK0NPTkZJR19WTV9FVkVOVF9DT1VOVEVSUz15CitDT05GSUdfUlRfTVVURVhFUz15CisjIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX1NNQUxMPTEKKyMgQ09ORklHX1NMT0IgaXMgbm90IHNldAorCisjCisjIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0CisjCitDT05GSUdfTU9EVUxFUz15CitDT05GSUdfTU9EVUxFX1VOTE9BRD15CitDT05GSUdfTU9EVUxFX0ZPUkNFX1VOTE9BRD15CisjIENPTkZJR19NT0RWRVJTSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAorQ09ORklHX0tNT0Q9eQorCisjCisjIEJsb2NrIGxheWVyCisjCitDT05GSUdfQkxPQ0s9eQorIyBDT05GSUdfTEJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAorIyBDT05GSUdfTFNGIGlzIG5vdCBzZXQKKworIworIyBJTyBTY2hlZHVsZXJzCisjCitDT05GSUdfSU9TQ0hFRF9OT09QPXkKKyMgQ09ORklHX0lPU0NIRURfQVMgaXMgbm90IHNldAorIyBDT05GSUdfSU9TQ0hFRF9ERUFETElORSBpcyBub3Qgc2V0CitDT05GSUdfSU9TQ0hFRF9DRlE9eQorIyBDT05GSUdfREVGQVVMVF9BUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX0RFQURMSU5FIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX0NGUT15CisjIENPTkZJR19ERUZBVUxUX05PT1AgaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfSU9TQ0hFRD0iY2ZxIgorCisjCisjIFN5c3RlbSBUeXBlIGFuZCBmZWF0dXJlcworIworQ09ORklHX1NVQkFSQ0hfQVZSMzJCPXkKK0NPTkZJR19NTVU9eQorQ09ORklHX1BFUkZPUk1BTkNFX0NPVU5URVJTPXkKK0NPTkZJR19QTEFURk9STV9BVDMyQVA9eQorQ09ORklHX0NQVV9BVDMyQVA3MDAwPXkKKyMgQ09ORklHX0JPQVJEX0FUU1RLMTAwMCBpcyBub3Qgc2V0CitDT05GSUdfQk9BUkRfQVROR1cxMDA9eQorQ09ORklHX0xPQURFUl9VX0JPT1Q9eQorCisjCisjIEF0bWVsIEFWUjMyIEFQIG9wdGlvbnMKKyMKKyMgQ09ORklHX0FQNzAwMF8zMl9CSVRfU01DIGlzIG5vdCBzZXQKK0NPTkZJR19BUDcwMDBfMTZfQklUX1NNQz15CisjIENPTkZJR19BUDcwMDBfOF9CSVRfU01DIGlzIG5vdCBzZXQKK0NPTkZJR19MT0FEX0FERFJFU1M9MHgxMDAwMDAwMAorQ09ORklHX0VOVFJZX0FERFJFU1M9MHg5MDAwMDAwMAorQ09ORklHX1BIWVNfT0ZGU0VUPTB4MTAwMDAwMDAKK0NPTkZJR19QUkVFTVBUX05PTkU9eQorIyBDT05GSUdfUFJFRU1QVF9WT0xVTlRBUlkgaXMgbm90IHNldAorIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CisjIENPTkZJR19IQVZFX0FSQ0hfQk9PVE1FTV9OT0RFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSEFWRV9NRU1PUllfUFJFU0VOVCBpcyBub3Qgc2V0CisjIENPTkZJR19ORUVEX05PREVfTUVNTUFQX1NJWkUgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfRkxBVE1FTV9FTkFCTEU9eQorIyBDT05GSUdfQVJDSF9ESVNDT05USUdNRU1fRU5BQkxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU1BBUlNFTUVNX0VOQUJMRSBpcyBub3Qgc2V0CitDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CitDT05GSUdfRkxBVE1FTV9NQU5VQUw9eQorIyBDT05GSUdfRElTQ09OVElHTUVNX01BTlVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19TUEFSU0VNRU1fTUFOVUFMIGlzIG5vdCBzZXQKK0NPTkZJR19GTEFUTUVNPXkKK0NPTkZJR19GTEFUX05PREVfTUVNX01BUD15CisjIENPTkZJR19TUEFSU0VNRU1fU1RBVElDIGlzIG5vdCBzZXQKK0NPTkZJR19TUExJVF9QVExPQ0tfQ1BVUz00CisjIENPTkZJR19SRVNPVVJDRVNfNjRCSVQgaXMgbm90IHNldAorQ09ORklHX1pPTkVfRE1BX0ZMQUc9MAorIyBDT05GSUdfT1dORVJTSElQX1RSQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0haXzEwMCBpcyBub3Qgc2V0CitDT05GSUdfSFpfMjUwPXkKKyMgQ09ORklHX0haXzMwMCBpcyBub3Qgc2V0CisjIENPTkZJR19IWl8xMDAwIGlzIG5vdCBzZXQKK0NPTkZJR19IWj0yNTAKK0NPTkZJR19DTURMSU5FPSIiCisKKyMKKyMgQnVzIG9wdGlvbnMKKyMKKworIworIyBQQ0NBUkQgKFBDTUNJQS9DYXJkQnVzKSBzdXBwb3J0CisjCisjIENPTkZJR19QQ0NBUkQgaXMgbm90IHNldAorCisjCisjIEV4ZWN1dGFibGUgZmlsZSBmb3JtYXRzCisjCitDT05GSUdfQklORk1UX0VMRj15CisjIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29ya2luZworIworQ09ORklHX05FVD15CisKKyMKKyMgTmV0d29ya2luZyBvcHRpb25zCisjCisjIENPTkZJR19ORVRERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfUEFDS0VUPXkKK0NPTkZJR19QQUNLRVRfTU1BUD15CitDT05GSUdfVU5JWD15CitDT05GSUdfWEZSTT15CitDT05GSUdfWEZSTV9VU0VSPXkKKyMgQ09ORklHX1hGUk1fU1VCX1BPTElDWSBpcyBub3Qgc2V0CisjIENPTkZJR19YRlJNX01JR1JBVEUgaXMgbm90IHNldAorQ09ORklHX05FVF9LRVk9eQorIyBDT05GSUdfTkVUX0tFWV9NSUdSQVRFIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUPXkKK0NPTkZJR19JUF9NVUxUSUNBU1Q9eQorQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUj15CitDT05GSUdfQVNLX0lQX0ZJQl9IQVNIPXkKKyMgQ09ORklHX0lQX0ZJQl9UUklFIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9GSUJfSEFTSD15CisjIENPTkZJR19JUF9NVUxUSVBMRV9UQUJMRVMgaXMgbm90IHNldAorIyBDT05GSUdfSVBfUk9VVEVfTVVMVElQQVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1JPVVRFX1ZFUkJPU0UgaXMgbm90IHNldAorQ09ORklHX0lQX1BOUD15CitDT05GSUdfSVBfUE5QX0RIQ1A9eQorIyBDT05GSUdfSVBfUE5QX0JPT1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1BOUF9SQVJQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUEdSRSBpcyBub3Qgc2V0CitDT05GSUdfSVBfTVJPVVRFPXkKK0NPTkZJR19JUF9QSU1TTV9WMT15CisjIENPTkZJR19JUF9QSU1TTV9WMiBpcyBub3Qgc2V0CisjIENPTkZJR19BUlBEIGlzIG5vdCBzZXQKK0NPTkZJR19TWU5fQ09PS0lFUz15CitDT05GSUdfSU5FVF9BSD15CitDT05GSUdfSU5FVF9FU1A9eQorQ09ORklHX0lORVRfSVBDT01QPXkKK0NPTkZJR19JTkVUX1hGUk1fVFVOTkVMPXkKK0NPTkZJR19JTkVUX1RVTk5FTD15CitDT05GSUdfSU5FVF9YRlJNX01PREVfVFJBTlNQT1JUPXkKK0NPTkZJR19JTkVUX1hGUk1fTU9ERV9UVU5ORUw9eQorQ09ORklHX0lORVRfWEZSTV9NT0RFX0JFRVQ9eQorQ09ORklHX0lORVRfRElBRz15CitDT05GSUdfSU5FVF9UQ1BfRElBRz15CisjIENPTkZJR19UQ1BfQ09OR19BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfVENQX0NPTkdfQ1VCSUM9eQorQ09ORklHX0RFRkFVTFRfVENQX0NPTkc9ImN1YmljIgorIyBDT05GSUdfVENQX01ENVNJRyBpcyBub3Qgc2V0CisKKyMKKyMgSVA6IFZpcnR1YWwgU2VydmVyIENvbmZpZ3VyYXRpb24KKyMKKyMgQ09ORklHX0lQX1ZTIGlzIG5vdCBzZXQKK0NPTkZJR19JUFY2PXkKKyMgQ09ORklHX0lQVjZfUFJJVkFDWSBpcyBub3Qgc2V0CisjIENPTkZJR19JUFY2X1JPVVRFUl9QUkVGIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUNl9BSD15CitDT05GSUdfSU5FVDZfRVNQPXkKK0NPTkZJR19JTkVUNl9JUENPTVA9eQorIyBDT05GSUdfSVBWNl9NSVA2IGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUNl9YRlJNX1RVTk5FTD15CitDT05GSUdfSU5FVDZfVFVOTkVMPXkKK0NPTkZJR19JTkVUNl9YRlJNX01PREVfVFJBTlNQT1JUPXkKK0NPTkZJR19JTkVUNl9YRlJNX01PREVfVFVOTkVMPXkKK0NPTkZJR19JTkVUNl9YRlJNX01PREVfQkVFVD15CisjIENPTkZJR19JTkVUNl9YRlJNX01PREVfUk9VVEVPUFRJTUlaQVRJT04gaXMgbm90IHNldAorQ09ORklHX0lQVjZfU0lUPXkKKyMgQ09ORklHX0lQVjZfVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVjZfTVVMVElQTEVfVEFCTEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFdPUktfU0VDTUFSSyBpcyBub3Qgc2V0CitDT05GSUdfTkVURklMVEVSPXkKKyMgQ09ORklHX05FVEZJTFRFUl9ERUJVRyBpcyBub3Qgc2V0CisKKyMKKyMgQ29yZSBOZXRmaWx0ZXIgQ29uZmlndXJhdGlvbgorIworIyBDT05GSUdfTkVURklMVEVSX05FVExJTksgaXMgbm90IHNldAorQ09ORklHX05GX0NPTk5UUkFDS19FTkFCTEVEPW0KK0NPTkZJR19ORl9DT05OVFJBQ0tfU1VQUE9SVD15CisjIENPTkZJR19JUF9ORl9DT05OVFJBQ0tfU1VQUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfTkZfQ09OTlRSQUNLPW0KK0NPTkZJR19ORl9DVF9BQ0NUPXkKK0NPTkZJR19ORl9DT05OVFJBQ0tfTUFSSz15CisjIENPTkZJR19ORl9DT05OVFJBQ0tfRVZFTlRTIGlzIG5vdCBzZXQKK0NPTkZJR19ORl9DVF9QUk9UT19HUkU9bQorIyBDT05GSUdfTkZfQ1RfUFJPVE9fU0NUUCBpcyBub3Qgc2V0CitDT05GSUdfTkZfQ09OTlRSQUNLX0FNQU5EQT1tCitDT05GSUdfTkZfQ09OTlRSQUNLX0ZUUD1tCitDT05GSUdfTkZfQ09OTlRSQUNLX0gzMjM9bQorQ09ORklHX05GX0NPTk5UUkFDS19JUkM9bQorQ09ORklHX05GX0NPTk5UUkFDS19ORVRCSU9TX05TPW0KK0NPTkZJR19ORl9DT05OVFJBQ0tfUFBUUD1tCitDT05GSUdfTkZfQ09OTlRSQUNLX1NBTkU9bQorQ09ORklHX05GX0NPTk5UUkFDS19TSVA9bQorQ09ORklHX05GX0NPTk5UUkFDS19URlRQPW0KK0NPTkZJR19ORVRGSUxURVJfWFRBQkxFUz15CitDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9DTEFTU0lGWT1tCisjIENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0NPTk5NQVJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfRFNDUCBpcyBub3Qgc2V0CitDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9NQVJLPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX05GUVVFVUU9bQorQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfTkZMT0c9bQorIyBDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9OT1RSQUNLIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX1RDUE1TUz1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0NPTU1FTlQ9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9DT05OQllURVM9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9DT05OTUFSSz1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0NPTk5UUkFDSz1tCisjIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfRENDUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfRFNDUCBpcyBub3Qgc2V0CitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0VTUD1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0hFTFBFUj1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0xFTkdUSD1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0xJTUlUPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTUFDPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTUFSSz1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1BPTElDWT1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX01VTFRJUE9SVD1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1BLVFRZUEU9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9RVU9UQT1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1JFQUxNPW0KKyMgQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9TQ1RQIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfU1RBVEU9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9TVEFUSVNUSUM9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9TVFJJTkc9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9UQ1BNU1M9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9IQVNITElNSVQ9bQorCisjCisjIElQOiBOZXRmaWx0ZXIgQ29uZmlndXJhdGlvbgorIworQ09ORklHX05GX0NPTk5UUkFDS19JUFY0PW0KK0NPTkZJR19ORl9DT05OVFJBQ0tfUFJPQ19DT01QQVQ9eQorIyBDT05GSUdfSVBfTkZfUVVFVUUgaXMgbm90IHNldAorQ09ORklHX0lQX05GX0lQVEFCTEVTPW0KK0NPTkZJR19JUF9ORl9NQVRDSF9JUFJBTkdFPW0KK0NPTkZJR19JUF9ORl9NQVRDSF9UT1M9bQorQ09ORklHX0lQX05GX01BVENIX1JFQ0VOVD1tCitDT05GSUdfSVBfTkZfTUFUQ0hfRUNOPW0KK0NPTkZJR19JUF9ORl9NQVRDSF9BSD1tCitDT05GSUdfSVBfTkZfTUFUQ0hfVFRMPW0KK0NPTkZJR19JUF9ORl9NQVRDSF9PV05FUj1tCitDT05GSUdfSVBfTkZfTUFUQ0hfQUREUlRZUEU9bQorQ09ORklHX0lQX05GX0ZJTFRFUj1tCitDT05GSUdfSVBfTkZfVEFSR0VUX1JFSkVDVD1tCitDT05GSUdfSVBfTkZfVEFSR0VUX0xPRz1tCisjIENPTkZJR19JUF9ORl9UQVJHRVRfVUxPRyBpcyBub3Qgc2V0CitDT05GSUdfTkZfTkFUPW0KK0NPTkZJR19ORl9OQVRfTkVFREVEPXkKK0NPTkZJR19JUF9ORl9UQVJHRVRfTUFTUVVFUkFERT1tCitDT05GSUdfSVBfTkZfVEFSR0VUX1JFRElSRUNUPW0KK0NPTkZJR19JUF9ORl9UQVJHRVRfTkVUTUFQPW0KK0NPTkZJR19JUF9ORl9UQVJHRVRfU0FNRT1tCitDT05GSUdfTkZfTkFUX1NOTVBfQkFTSUM9bQorQ09ORklHX05GX05BVF9QUk9UT19HUkU9bQorQ09ORklHX05GX05BVF9GVFA9bQorQ09ORklHX05GX05BVF9JUkM9bQorQ09ORklHX05GX05BVF9URlRQPW0KK0NPTkZJR19ORl9OQVRfQU1BTkRBPW0KK0NPTkZJR19ORl9OQVRfUFBUUD1tCitDT05GSUdfTkZfTkFUX0gzMjM9bQorQ09ORklHX05GX05BVF9TSVA9bQorQ09ORklHX0lQX05GX01BTkdMRT1tCitDT05GSUdfSVBfTkZfVEFSR0VUX1RPUz1tCitDT05GSUdfSVBfTkZfVEFSR0VUX0VDTj1tCitDT05GSUdfSVBfTkZfVEFSR0VUX1RUTD1tCitDT05GSUdfSVBfTkZfVEFSR0VUX0NMVVNURVJJUD1tCitDT05GSUdfSVBfTkZfUkFXPW0KK0NPTkZJR19JUF9ORl9BUlBUQUJMRVM9bQorQ09ORklHX0lQX05GX0FSUEZJTFRFUj1tCitDT05GSUdfSVBfTkZfQVJQX01BTkdMRT1tCisKKyMKKyMgSVB2NjogTmV0ZmlsdGVyIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKKyMKK0NPTkZJR19ORl9DT05OVFJBQ0tfSVBWNj1tCitDT05GSUdfSVA2X05GX1FVRVVFPW0KK0NPTkZJR19JUDZfTkZfSVBUQUJMRVM9bQorQ09ORklHX0lQNl9ORl9NQVRDSF9SVD1tCitDT05GSUdfSVA2X05GX01BVENIX09QVFM9bQorQ09ORklHX0lQNl9ORl9NQVRDSF9GUkFHPW0KK0NPTkZJR19JUDZfTkZfTUFUQ0hfSEw9bQorQ09ORklHX0lQNl9ORl9NQVRDSF9PV05FUj1tCitDT05GSUdfSVA2X05GX01BVENIX0lQVjZIRUFERVI9bQorQ09ORklHX0lQNl9ORl9NQVRDSF9BSD1tCitDT05GSUdfSVA2X05GX01BVENIX01IPW0KK0NPTkZJR19JUDZfTkZfTUFUQ0hfRVVJNjQ9bQorQ09ORklHX0lQNl9ORl9GSUxURVI9bQorQ09ORklHX0lQNl9ORl9UQVJHRVRfTE9HPW0KK0NPTkZJR19JUDZfTkZfVEFSR0VUX1JFSkVDVD1tCitDT05GSUdfSVA2X05GX01BTkdMRT1tCitDT05GSUdfSVA2X05GX1RBUkdFVF9ITD1tCitDT05GSUdfSVA2X05GX1JBVz1tCisKKyMKKyMgRENDUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19JUF9EQ0NQIGlzIG5vdCBzZXQKKworIworIyBTQ1RQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKKyMKKyMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAorCisjCisjIFRJUEMgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQorIworIyBDT05GSUdfVElQQyBpcyBub3Qgc2V0CisjIENPTkZJR19BVE0gaXMgbm90IHNldAorIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKK0NPTkZJR19WTEFOXzgwMjFRPW0KKyMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQWCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0CisjIENPTkZJR19YMjUgaXMgbm90IHNldAorIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0CisjIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAorIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0CisKKyMKKyMgUW9TIGFuZC9vciBmYWlyIHF1ZXVlaW5nCisjCisjIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAorQ09ORklHX05FVF9DTFNfUk9VVEU9eQorCisjCisjIE5ldHdvcmsgdGVzdGluZworIworIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CisjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lFRUU4MDIxMSBpcyBub3Qgc2V0CisKKyMKKyMgRGV2aWNlIERyaXZlcnMKKyMKKworIworIyBHZW5lcmljIERyaXZlciBPcHRpb25zCisjCitDT05GSUdfU1RBTkRBTE9ORT15CisjIENPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19EUklWRVIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfREVWUkVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU19IWVBFUlZJU09SIGlzIG5vdCBzZXQKKworIworIyBDb25uZWN0b3IgLSB1bmlmaWVkIHVzZXJzcGFjZSA8LT4ga2VybmVsc3BhY2UgbGlua2VyCisjCisjIENPTkZJR19DT05ORUNUT1IgaXMgbm90IHNldAorCisjCisjIE1lbW9yeSBUZWNobm9sb2d5IERldmljZXMgKE1URCkKKyMKK0NPTkZJR19NVEQ9eQorIyBDT05GSUdfTVREX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DT05DQVQgaXMgbm90IHNldAorQ09ORklHX01URF9QQVJUSVRJT05TPXkKKyMgQ09ORklHX01URF9SRURCT09UX1BBUlRTIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ01ETElORV9QQVJUUz15CisKKyMKKyMgVXNlciBNb2R1bGVzIEFuZCBUcmFuc2xhdGlvbiBMYXllcnMKKyMKK0NPTkZJR19NVERfQ0hBUj15CitDT05GSUdfTVREX0JMS0RFVlM9eQorQ09ORklHX01URF9CTE9DSz15CisjIENPTkZJR19GVEwgaXMgbm90IHNldAorIyBDT05GSUdfTkZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19SRkRfRlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NTRkRDIGlzIG5vdCBzZXQKKworIworIyBSQU0vUk9NL0ZsYXNoIGNoaXAgZHJpdmVycworIworQ09ORklHX01URF9DRkk9eQorIyBDT05GSUdfTVREX0pFREVDUFJPQkUgaXMgbm90IHNldAorQ09ORklHX01URF9HRU5fUFJPQkU9eQorIyBDT05GSUdfTVREX0NGSV9BRFZfT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8yPXkKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfND15CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfOCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMTYgaXMgbm90IHNldAorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzMyIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0kxPXkKK0NPTkZJR19NVERfQ0ZJX0kyPXkKKyMgQ09ORklHX01URF9DRklfSTQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NGSV9JOCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0lOVEVMRVhUIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0FNRFNURD15CisjIENPTkZJR19NVERfQ0ZJX1NUQUEgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfVVRJTD15CisjIENPTkZJR19NVERfUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ST00gaXMgbm90IHNldAorIyBDT05GSUdfTVREX0FCU0VOVCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfT0JTT0xFVEVfQ0hJUFMgaXMgbm90IHNldAorCisjCisjIE1hcHBpbmcgZHJpdmVycyBmb3IgY2hpcCBhY2Nlc3MKKyMKKyMgQ09ORklHX01URF9DT01QTEVYX01BUFBJTkdTIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfUEhZU01BUD15CitDT05GSUdfTVREX1BIWVNNQVBfU1RBUlQ9MHg4MDAwMDAwMAorQ09ORklHX01URF9QSFlTTUFQX0xFTj0weDAKK0NPTkZJR19NVERfUEhZU01BUF9CQU5LV0lEVEg9MgorIyBDT05GSUdfTVREX1BMQVRSQU0gaXMgbm90IHNldAorCisjCisjIFNlbGYtY29udGFpbmVkIE1URCBkZXZpY2UgZHJpdmVycworIworQ09ORklHX01URF9EQVRBRkxBU0g9eQorIyBDT05GSUdfTVREX00yNVA4MCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfU0xSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX1BIUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NVERSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX0JMT0NLMk1URCBpcyBub3Qgc2V0CisKKyMKKyMgRGlzay1Pbi1DaGlwIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19NVERfRE9DMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfRE9DMjAwMSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfRE9DMjAwMVBMVVMgaXMgbm90IHNldAorCisjCisjIE5BTkQgRmxhc2ggRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX01URF9OQU5EIGlzIG5vdCBzZXQKKworIworIyBPbmVOQU5EIEZsYXNoIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19NVERfT05FTkFORCBpcyBub3Qgc2V0CisKKyMKKyMgUGFyYWxsZWwgcG9ydCBzdXBwb3J0CisjCisjIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKKworIworIyBQbHVnIGFuZCBQbGF5IHN1cHBvcnQKKyMKKyMgQ09ORklHX1BOUEFDUEkgaXMgbm90IHNldAorCisjCisjIEJsb2NrIGRldmljZXMKKyMKKyMgQ09ORklHX0JMS19ERVZfQ09XX0NPTU1PTiBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9MT09QPW0KKyMgQ09ORklHX0JMS19ERVZfQ1JZUFRPTE9PUCBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9OQkQ9bQorQ09ORklHX0JMS19ERVZfUkFNPW0KK0NPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgorQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9NDA5NgorQ09ORklHX0JMS19ERVZfUkFNX0JMT0NLU0laRT0xMDI0CisjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CisKKyMKKyMgTWlzYyBkZXZpY2VzCisjCisKKyMKKyMgQVRBL0FUQVBJL01GTS9STEwgc3VwcG9ydAorIworIyBDT05GSUdfSURFIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19SQUlEX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0kgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ORVRMSU5LIGlzIG5vdCBzZXQKKworIworIyBTZXJpYWwgQVRBIChwcm9kKSBhbmQgUGFyYWxsZWwgQVRBIChleHBlcmltZW50YWwpIGRyaXZlcnMKKyMKKyMgQ09ORklHX0FUQSBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGktZGV2aWNlIHN1cHBvcnQgKFJBSUQgYW5kIExWTSkKKyMKKyMgQ09ORklHX01EIGlzIG5vdCBzZXQKKworIworIyBGdXNpb24gTVBUIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19GVVNJT04gaXMgbm90IHNldAorCisjCisjIElFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQKKyMKKworIworIyBJMk8gZGV2aWNlIHN1cHBvcnQKKyMKKworIworIyBOZXR3b3JrIGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfTkVUREVWSUNFUz15CisjIENPTkZJR19EVU1NWSBpcyBub3Qgc2V0CisjIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qgc2V0CitDT05GSUdfVFVOPW0KKworIworIyBQSFkgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BIWUxJQiBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwIG9yIDEwME1iaXQpCisjCitDT05GSUdfTkVUX0VUSEVSTkVUPXkKK0NPTkZJR19NSUk9eQorQ09ORklHX01BQ0I9eQorCisjCisjIEV0aGVybmV0ICgxMDAwIE1iaXQpCisjCisKKyMKKyMgRXRoZXJuZXQgKDEwMDAwIE1iaXQpCisjCisKKyMKKyMgVG9rZW4gUmluZyBkZXZpY2VzCisjCisKKyMKKyMgV2lyZWxlc3MgTEFOIChub24taGFtcmFkaW8pCisjCisjIENPTkZJR19ORVRfUkFESU8gaXMgbm90IHNldAorCisjCisjIFdhbiBpbnRlcmZhY2VzCisjCisjIENPTkZJR19XQU4gaXMgbm90IHNldAorQ09ORklHX1BQUD1tCisjIENPTkZJR19QUFBfTVVMVElMSU5LIGlzIG5vdCBzZXQKK0NPTkZJR19QUFBfRklMVEVSPXkKK0NPTkZJR19QUFBfQVNZTkM9bQorIyBDT05GSUdfUFBQX1NZTkNfVFRZIGlzIG5vdCBzZXQKK0NPTkZJR19QUFBfREVGTEFURT1tCitDT05GSUdfUFBQX0JTRENPTVA9bQorQ09ORklHX1BQUF9NUFBFPW0KK0NPTkZJR19QUFBPRT1tCisjIENPTkZJR19TTElQIGlzIG5vdCBzZXQKK0NPTkZJR19TTEhDPW0KKyMgQ09ORklHX1NIQVBFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRDT05TT0xFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0CisKKyMKKyMgSVNETiBzdWJzeXN0ZW0KKyMKKyMgQ09ORklHX0lTRE4gaXMgbm90IHNldAorCisjCisjIFRlbGVwaG9ueSBTdXBwb3J0CisjCisjIENPTkZJR19QSE9ORSBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0lOUFVUIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBJL08gcG9ydHMKKyMKKyMgQ09ORklHX1NFUklPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKKworIworIyBDaGFyYWN0ZXIgZGV2aWNlcworIworIyBDT05GSUdfVlQgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKKworIworIyBTZXJpYWwgZHJpdmVycworIworIyBDT05GSUdfU0VSSUFMXzgyNTAgaXMgbm90IHNldAorCisjCisjIE5vbi04MjUwIHNlcmlhbCBwb3J0IHN1cHBvcnQKKyMKK0NPTkZJR19TRVJJQUxfQVRNRUw9eQorQ09ORklHX1NFUklBTF9BVE1FTF9DT05TT0xFPXkKKyMgQ09ORklHX1NFUklBTF9BVE1FTF9UVFlBVCBpcyBub3Qgc2V0CitDT05GSUdfU0VSSUFMX0NPUkU9eQorQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQorQ09ORklHX1VOSVg5OF9QVFlTPXkKKyMgQ09ORklHX0xFR0FDWV9QVFlTIGlzIG5vdCBzZXQKKworIworIyBJUE1JCisjCisjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAorCisjCisjIFdhdGNoZG9nIENhcmRzCisjCisjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CisjIENPTkZJR19IV19SQU5ET00gaXMgbm90IHNldAorIyBDT05GSUdfUlRDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dFTl9SVEMgaXMgbm90IHNldAorIyBDT05GSUdfRFRMSyBpcyBub3Qgc2V0CisjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CisjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKKworIworIyBUUE0gZGV2aWNlcworIworIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CisKKyMKKyMgSTJDIHN1cHBvcnQKKyMKKyMgQ09ORklHX0kyQyBpcyBub3Qgc2V0CisKKyMKKyMgU1BJIHN1cHBvcnQKKyMKK0NPTkZJR19TUEk9eQorIyBDT05GSUdfU1BJX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19TUElfTUFTVEVSPXkKKworIworIyBTUEkgTWFzdGVyIENvbnRyb2xsZXIgRHJpdmVycworIworQ09ORklHX1NQSV9BVE1FTD15CisjIENPTkZJR19TUElfQklUQkFORyBpcyBub3Qgc2V0CisKKyMKKyMgU1BJIFByb3RvY29sIE1hc3RlcnMKKyMKKyMgQ09ORklHX1NQSV9BVDI1IGlzIG5vdCBzZXQKKworIworIyBEYWxsYXMncyAxLXdpcmUgYnVzCisjCisjIENPTkZJR19XMSBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgTW9uaXRvcmluZyBzdXBwb3J0CisjCisjIENPTkZJR19IV01PTiBpcyBub3Qgc2V0CisjIENPTkZJR19IV01PTl9WSUQgaXMgbm90IHNldAorCisjCisjIE11bHRpZnVuY3Rpb24gZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX01GRF9TTTUwMSBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGltZWRpYSBkZXZpY2VzCisjCisjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAorCisjCisjIERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIERldmljZXMKKyMKKyMgQ09ORklHX0RWQiBpcyBub3Qgc2V0CisKKyMKKyMgR3JhcGhpY3Mgc3VwcG9ydAorIworIyBDT05GSUdfQkFDS0xJR0hUX0xDRF9TVVBQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKKworIworIyBTb3VuZAorIworIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAorCisjCisjIFVTQiBzdXBwb3J0CisjCisjIENPTkZJR19VU0JfQVJDSF9IQVNfSENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BUkNIX0hBU19PSENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BUkNIX0hBU19FSENJIGlzIG5vdCBzZXQKKworIworIyBOT1RFOiBVU0JfU1RPUkFHRSBlbmFibGVzIFNDU0ksIGFuZCAnU0NTSSBkaXNrIHN1cHBvcnQnCisjCisKKyMKKyMgVVNCIEdhZGdldCBTdXBwb3J0CisjCisjIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKKworIworIyBNTUMvU0QgQ2FyZCBzdXBwb3J0CisjCisjIENPTkZJR19NTUMgaXMgbm90IHNldAorCisjCisjIExFRCBkZXZpY2VzCisjCisjIENPTkZJR19ORVdfTEVEUyBpcyBub3Qgc2V0CisKKyMKKyMgTEVEIGRyaXZlcnMKKyMKKworIworIyBMRUQgVHJpZ2dlcnMKKyMKKworIworIyBJbmZpbmlCYW5kIHN1cHBvcnQKKyMKKworIworIyBFREFDIC0gZXJyb3IgZGV0ZWN0aW9uIGFuZCByZXBvcnRpbmcgKFJBUykgKEVYUEVSSU1FTlRBTCkKKyMKKworIworIyBSZWFsIFRpbWUgQ2xvY2sKKyMKKyMgQ09ORklHX1JUQ19DTEFTUyBpcyBub3Qgc2V0CisKKyMKKyMgRE1BIEVuZ2luZSBzdXBwb3J0CisjCisjIENPTkZJR19ETUFfRU5HSU5FIGlzIG5vdCBzZXQKKworIworIyBETUEgQ2xpZW50cworIworCisjCisjIERNQSBEZXZpY2VzCisjCisKKyMKKyMgQXV4aWxpYXJ5IERpc3BsYXkgc3VwcG9ydAorIworCisjCisjIFZpcnR1YWxpemF0aW9uCisjCisKKyMKKyMgRmlsZSBzeXN0ZW1zCisjCitDT05GSUdfRVhUMl9GUz15CisjIENPTkZJR19FWFQyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDJfRlNfWElQIGlzIG5vdCBzZXQKK0NPTkZJR19FWFQzX0ZTPXkKKyMgQ09ORklHX0VYVDNfRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfRVhUNERFVl9GUyBpcyBub3Qgc2V0CitDT05GSUdfSkJEPXkKKyMgQ09ORklHX0pCRF9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19HRlMyX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX09DRlMyX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOT1RJRlkgaXMgbm90IHNldAorIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAorIyBDT05GSUdfRE5PVElGWSBpcyBub3Qgc2V0CisjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0CitDT05GSUdfRlVTRV9GUz1tCisKKyMKKyMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VREZfRlMgaXMgbm90IHNldAorCisjCisjIERPUy9GQVQvTlQgRmlsZXN5c3RlbXMKKyMKK0NPTkZJR19GQVRfRlM9bQorQ09ORklHX01TRE9TX0ZTPW0KK0NPTkZJR19WRkFUX0ZTPW0KK0NPTkZJR19GQVRfREVGQVVMVF9DT0RFUEFHRT04NTAKK0NPTkZJR19GQVRfREVGQVVMVF9JT0NIQVJTRVQ9Imlzbzg4NTktMSIKKyMgQ09ORklHX05URlNfRlMgaXMgbm90IHNldAorCisjCisjIFBzZXVkbyBmaWxlc3lzdGVtcworIworQ09ORklHX1BST0NfRlM9eQorIyBDT05GSUdfUFJPQ19LQ09SRSBpcyBub3Qgc2V0CitDT05GSUdfUFJPQ19TWVNDVEw9eQorQ09ORklHX1NZU0ZTPXkKK0NPTkZJR19UTVBGUz15CisjIENPTkZJR19UTVBGU19QT1NJWF9BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKK0NPTkZJR19SQU1GUz15CitDT05GSUdfQ09ORklHRlNfRlM9eQorCisjCisjIE1pc2NlbGxhbmVvdXMgZmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0FERlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTUExVU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAorQ09ORklHX0pGRlMyX0ZTPXkKK0NPTkZJR19KRkZTMl9GU19ERUJVRz0wCitDT05GSUdfSkZGUzJfRlNfV1JJVEVCVUZGRVI9eQorIyBDT05GSUdfSkZGUzJfU1VNTUFSWSBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTMl9GU19YQVRUUiBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTMl9DT01QUkVTU0lPTl9PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19KRkZTMl9aTElCPXkKK0NPTkZJR19KRkZTMl9SVElNRT15CisjIENPTkZJR19KRkZTMl9SVUJJTiBpcyBub3Qgc2V0CisjIENPTkZJR19DUkFNRlMgaXMgbm90IHNldAorIyBDT05GSUdfVlhGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IUEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayBGaWxlIFN5c3RlbXMKKyMKK0NPTkZJR19ORlNfRlM9eQorQ09ORklHX05GU19WMz15CisjIENPTkZJR19ORlNfVjNfQUNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU19WNCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNfRElSRUNUSU8gaXMgbm90IHNldAorIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0CitDT05GSUdfUk9PVF9ORlM9eQorQ09ORklHX0xPQ0tEPXkKK0NPTkZJR19MT0NLRF9WND15CitDT05GSUdfTkZTX0NPTU1PTj15CitDT05GSUdfU1VOUlBDPXkKKyMgQ09ORklHX1JQQ1NFQ19HU1NfS1JCNSBpcyBub3Qgc2V0CisjIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKK0NPTkZJR19TTUJfRlM9bQorIyBDT05GSUdfU01CX05MU19ERUZBVUxUIGlzIG5vdCBzZXQKK0NPTkZJR19DSUZTPW0KKyMgQ09ORklHX0NJRlNfU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfQ0lGU19XRUFLX1BXX0hBU0ggaXMgbm90IHNldAorIyBDT05GSUdfQ0lGU19YQVRUUiBpcyBub3Qgc2V0CisjIENPTkZJR19DSUZTX0RFQlVHMiBpcyBub3Qgc2V0CisjIENPTkZJR19DSUZTX0VYUEVSSU1FTlRBTCBpcyBub3Qgc2V0CisjIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfOVBfRlMgaXMgbm90IHNldAorCisjCisjIFBhcnRpdGlvbiBUeXBlcworIworIyBDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19NU0RPU19QQVJUSVRJT049eQorCisjCisjIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CisjCitDT05GSUdfTkxTPXkKK0NPTkZJR19OTFNfREVGQVVMVD0iaXNvODg1OS0xIgorIyBDT05GSUdfTkxTX0NPREVQQUdFXzQzNyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfNzM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV83NzUgaXMgbm90IHNldAorQ09ORklHX05MU19DT0RFUEFHRV84NTA9eQorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1MiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODU1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYxIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY5IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85MzYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzk1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85NDkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg3NCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV84IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUxIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19BU0NJSSBpcyBub3Qgc2V0CitDT05GSUdfTkxTX0lTTzg4NTlfMT15CisjIENPTkZJR19OTFNfSVNPODg1OV8yIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV81IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV85IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzEzIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzE0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzE1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19LT0k4X1IgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0tPSThfVSBpcyBub3Qgc2V0CitDT05GSUdfTkxTX1VURjg9eQorCisjCisjIERpc3RyaWJ1dGVkIExvY2sgTWFuYWdlcgorIworIyBDT05GSUdfRExNIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgaGFja2luZworIworQ09ORklHX1RSQUNFX0lSUUZMQUdTX1NVUFBPUlQ9eQorIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAorQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLPXkKK0NPTkZJR19NQUdJQ19TWVNSUT15CisjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19LRVJORUw9eQorIyBDT05GSUdfREVCVUdfU0hJUlEgaXMgbm90IHNldAorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKK0NPTkZJR19ERVRFQ1RfU09GVExPQ0tVUD15CisjIENPTkZJR19TQ0hFRFNUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJTUVSX1NUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NMQUIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfUlRfTVVURVhFUyBpcyBub3Qgc2V0CisjIENPTkZJR19SVF9NVVRFWF9URVNURVIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1BJTkxPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTVVURVhFUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DS19TTEVFUCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19MT0NLSU5HX0FQSV9TRUxGVEVTVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfS09CSkVDVCBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfQlVHVkVSQk9TRT15CisjIENPTkZJR19ERUJVR19JTkZPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1ZNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xJU1QgaXMgbm90IHNldAorQ09ORklHX0ZSQU1FX1BPSU5URVI9eQorIyBDT05GSUdfRk9SQ0VEX0lOTElOSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JDVV9UT1JUVVJFX1RFU1QgaXMgbm90IHNldAorIyBDT05GSUdfRkFVTFRfSU5KRUNUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tQUk9CRVMgaXMgbm90IHNldAorCisjCisjIFNlY3VyaXR5IG9wdGlvbnMKKyMKKyMgQ09ORklHX0tFWVMgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAorCisjCisjIENyeXB0b2dyYXBoaWMgb3B0aW9ucworIworQ09ORklHX0NSWVBUTz15CitDT05GSUdfQ1JZUFRPX0FMR0FQST15CitDT05GSUdfQ1JZUFRPX0JMS0NJUEhFUj15CitDT05GSUdfQ1JZUFRPX0hBU0g9eQorQ09ORklHX0NSWVBUT19NQU5BR0VSPXkKK0NPTkZJR19DUllQVE9fSE1BQz15CisjIENPTkZJR19DUllQVE9fWENCQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTlVMTCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTUQ0IGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fTUQ1PXkKK0NPTkZJR19DUllQVE9fU0hBMT15CisjIENPTkZJR19DUllQVE9fU0hBMjU2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TSEE1MTIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1dQNTEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19UR1IxOTIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0dGMTI4TVVMIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fRUNCPW0KK0NPTkZJR19DUllQVE9fQ0JDPXkKK0NPTkZJR19DUllQVE9fUENCQz1tCisjIENPTkZJR19DUllQVE9fTFJXIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fREVTPXkKKyMgQ09ORklHX0NSWVBUT19GQ1JZUFQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0JMT1dGSVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19UV09GSVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TRVJQRU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BRVMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NBU1Q1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQVNUNiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEVBIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fQVJDND1tCisjIENPTkZJR19DUllQVE9fS0hBWkFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BTlVCSVMgaXMgbm90IHNldAorQ09ORklHX0NSWVBUT19ERUZMQVRFPXkKKyMgQ09ORklHX0NSWVBUT19NSUNIQUVMX01JQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ1JDMzJDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQU1FTExJQSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEVTVCBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgY3J5cHRvIGRldmljZXMKKyMKKworIworIyBMaWJyYXJ5IHJvdXRpbmVzCisjCitDT05GSUdfQklUUkVWRVJTRT15CitDT05GSUdfQ1JDX0NDSVRUPW0KKyMgQ09ORklHX0NSQzE2IGlzIG5vdCBzZXQKK0NPTkZJR19DUkMzMj15CisjIENPTkZJR19MSUJDUkMzMkMgaXMgbm90IHNldAorQ09ORklHX1pMSUJfSU5GTEFURT15CitDT05GSUdfWkxJQl9ERUZMQVRFPXkKK0NPTkZJR19URVhUU0VBUkNIPXkKK0NPTkZJR19URVhUU0VBUkNIX0tNUD1tCitDT05GSUdfVEVYVFNFQVJDSF9CTT1tCitDT05GSUdfVEVYVFNFQVJDSF9GU009bQorQ09ORklHX1BMSVNUPXkKK0NPTkZJR19IQVNfSU9NRU09eQorQ09ORklHX0hBU19JT1BPUlQ9eQpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9rZXJuZWwvY3B1LmMgYi9hcmNoL2F2cjMyL2tlcm5lbC9jcHUuYwppbmRleCAyZTcyZmQyLi4yNzE0Y2Y2IDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2tlcm5lbC9jcHUuYworKysgYi9hcmNoL2F2cjMyL2tlcm5lbC9jcHUuYwpAQCAtMjA5LDE2ICsyMDksMTcgQEAKIHZvaWQgX19pbml0IHNldHVwX3Byb2Nlc3Nvcih2b2lkKQogewogCXVuc2lnbmVkIGxvbmcgY29uZmlnMCwgY29uZmlnMTsKKwl1bnNpZ25lZCBsb25nIGZlYXR1cmVzOwogCXVuc2lnbmVkIGNwdV9pZCwgY3B1X3JldiwgYXJjaF9pZCwgYXJjaF9yZXYsIG1tdV90eXBlOwogCXVuc2lnbmVkIHRtcDsKIAotCWNvbmZpZzAgPSBzeXNyZWdfcmVhZChDT05GSUcwKTsgLyogMHgwMDAwMDEzZTsgKi8KLQljb25maWcxID0gc3lzcmVnX3JlYWQoQ09ORklHMSk7IC8qIDB4MDFmNjg5YTI7ICovCi0JY3B1X2lkID0gY29uZmlnMCA+PiAyNDsKLQljcHVfcmV2ID0gKGNvbmZpZzAgPj4gMTYpICYgMHhmZjsKLQlhcmNoX2lkID0gKGNvbmZpZzAgPj4gMTMpICYgMHgwNzsKLQlhcmNoX3JldiA9IChjb25maWcwID4+IDEwKSAmIDB4MDc7Ci0JbW11X3R5cGUgPSAoY29uZmlnMCA+PiA3KSAmIDB4MDM7CisJY29uZmlnMCA9IHN5c3JlZ19yZWFkKENPTkZJRzApOworCWNvbmZpZzEgPSBzeXNyZWdfcmVhZChDT05GSUcxKTsKKwljcHVfaWQgPSBTWVNSRUdfQkZFWFQoUFJPQ0VTU09SSUQsIGNvbmZpZzApOworCWNwdV9yZXYgPSBTWVNSRUdfQkZFWFQoUFJPQ0VTU09SUkVWSVNJT04sIGNvbmZpZzApOworCWFyY2hfaWQgPSBTWVNSRUdfQkZFWFQoQVQsIGNvbmZpZzApOworCWFyY2hfcmV2ID0gU1lTUkVHX0JGRVhUKEFSLCBjb25maWcwKTsKKwltbXVfdHlwZSA9IFNZU1JFR19CRkVYVChNTVVULCBjb25maWcwKTsKIAogCWJvb3RfY3B1X2RhdGEuYXJjaF90eXBlID0gYXJjaF9pZDsKIAlib290X2NwdV9kYXRhLmNwdV90eXBlID0gY3B1X2lkOwpAQCAtMjI2LDE2ICsyMjcsMTYgQEAKIAlib290X2NwdV9kYXRhLmNwdV9yZXZpc2lvbiA9IGNwdV9yZXY7CiAJYm9vdF9jcHVfZGF0YS50bGJfY29uZmlnID0gbW11X3R5cGU7CiAKLQl0bXAgPSAoY29uZmlnMSA+PiAxMykgJiAweDA3OworCXRtcCA9IFNZU1JFR19CRkVYVChJTFNaLCBjb25maWcxKTsKIAlpZiAodG1wKSB7Ci0JCWJvb3RfY3B1X2RhdGEuaWNhY2hlLndheXMgPSAxIDw8ICgoY29uZmlnMSA+PiAxMCkgJiAweDA3KTsKLQkJYm9vdF9jcHVfZGF0YS5pY2FjaGUuc2V0cyA9IDEgPDwgKChjb25maWcxID4+IDE2KSAmIDB4MGYpOworCQlib290X2NwdV9kYXRhLmljYWNoZS53YXlzID0gMSA8PCBTWVNSRUdfQkZFWFQoSUFTUywgY29uZmlnMSk7CisJCWJvb3RfY3B1X2RhdGEuaWNhY2hlLnNldHMgPSAxIDw8IFNZU1JFR19CRkVYVChJU0VULCBjb25maWcxKTsKIAkJYm9vdF9jcHVfZGF0YS5pY2FjaGUubGluZXN6ID0gMSA8PCAodG1wICsgMSk7CiAJfQotCXRtcCA9IChjb25maWcxID4+IDMpICYgMHgwNzsKKwl0bXAgPSBTWVNSRUdfQkZFWFQoRExTWiwgY29uZmlnMSk7CiAJaWYgKHRtcCkgewotCQlib290X2NwdV9kYXRhLmRjYWNoZS53YXlzID0gMSA8PCAoY29uZmlnMSAmIDB4MDcpOwotCQlib290X2NwdV9kYXRhLmRjYWNoZS5zZXRzID0gMSA8PCAoKGNvbmZpZzEgPj4gNikgJiAweDBmKTsKKwkJYm9vdF9jcHVfZGF0YS5kY2FjaGUud2F5cyA9IDEgPDwgU1lTUkVHX0JGRVhUKERBU1MsIGNvbmZpZzEpOworCQlib290X2NwdV9kYXRhLmRjYWNoZS5zZXRzID0gMSA8PCBTWVNSRUdfQkZFWFQoRFNFVCwgY29uZmlnMSk7CiAJCWJvb3RfY3B1X2RhdGEuZGNhY2hlLmxpbmVzeiA9IDEgPDwgKHRtcCArIDEpOwogCX0KIApAQCAtMjUwLDE2ICsyNTEsMzkgQEAKIAkJY3B1X25hbWVzW2NwdV9pZF0sIGNwdV9pZCwgY3B1X3JldiwKIAkJYXJjaF9uYW1lc1thcmNoX2lkXSwgYXJjaF9yZXYpOwogCXByaW50ayAoIkNQVTogTU1VIGNvbmZpZ3VyYXRpb246ICVzXG4iLCBtbXVfdHlwZXNbbW11X3R5cGVdKTsKKwogCXByaW50ayAoIkNQVTogZmVhdHVyZXM6Iik7Ci0JaWYgKGNvbmZpZzAgJiAoMSA8PCA2KSkKLQkJcHJpbnRrKCIgZnB1Iik7Ci0JaWYgKGNvbmZpZzAgJiAoMSA8PCA1KSkKLQkJcHJpbnRrKCIgamF2YSIpOwotCWlmIChjb25maWcwICYgKDEgPDwgNCkpCi0JCXByaW50aygiIHBlcmZjdHIiKTsKLQlpZiAoY29uZmlnMCAmICgxIDw8IDMpKQorCWZlYXR1cmVzID0gMDsKKwlpZiAoY29uZmlnMCAmIFNZU1JFR19CSVQoQ09ORklHMF9SKSkgeworCQlmZWF0dXJlcyB8PSBBVlIzMl9GRUFUVVJFX1JNVzsKKwkJcHJpbnRrKCIgcm13Iik7CisJfQorCWlmIChjb25maWcwICYgU1lTUkVHX0JJVChDT05GSUcwX0QpKSB7CisJCWZlYXR1cmVzIHw9IEFWUjMyX0ZFQVRVUkVfRFNQOworCQlwcmludGsoIiBkc3AiKTsKKwl9CisJaWYgKGNvbmZpZzAgJiBTWVNSRUdfQklUKENPTkZJRzBfUykpIHsKKwkJZmVhdHVyZXMgfD0gQVZSMzJfRkVBVFVSRV9TSU1EOworCQlwcmludGsoIiBzaW1kIik7CisJfQorCWlmIChjb25maWcwICYgU1lTUkVHX0JJVChDT05GSUcwX08pKSB7CisJCWZlYXR1cmVzIHw9IEFWUjMyX0ZFQVRVUkVfT0NEOwogCQlwcmludGsoIiBvY2QiKTsKKwl9CisJaWYgKGNvbmZpZzAgJiBTWVNSRUdfQklUKENPTkZJRzBfUCkpIHsKKwkJZmVhdHVyZXMgfD0gQVZSMzJfRkVBVFVSRV9QQ1RSOworCQlwcmludGsoIiBwZXJmY3RyIik7CisJfQorCWlmIChjb25maWcwICYgU1lTUkVHX0JJVChDT05GSUcwX0opKSB7CisJCWZlYXR1cmVzIHw9IEFWUjMyX0ZFQVRVUkVfSkFWQTsKKwkJcHJpbnRrKCIgamF2YSIpOworCX0KKwlpZiAoY29uZmlnMCAmIFNZU1JFR19CSVQoQ09ORklHMF9GKSkgeworCQlmZWF0dXJlcyB8PSBBVlIzMl9GRUFUVVJFX0ZQVTsKKwkJcHJpbnRrKCIgZnB1Iik7CisJfQogCXByaW50aygiXG4iKTsKKwlib290X2NwdV9kYXRhLmZlYXR1cmVzID0gZmVhdHVyZXM7CiB9CiAKICNpZmRlZiBDT05GSUdfUFJPQ19GUwpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9rZXJuZWwvZW50cnktYXZyMzJiLlMgYi9hcmNoL2F2cjMyL2tlcm5lbC9lbnRyeS1hdnIzMmIuUwppbmRleCBlZWI2Njc5Li40MjY1N2YxIDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2tlcm5lbC9lbnRyeS1hdnIzMmIuUworKysgYi9hcmNoL2F2cjMyL2tlcm5lbC9lbnRyeS1hdnIzMmIuUwpAQCAtMTAwLDU1ICsxMDAsNDkgQEAKIAogCS5nbG9iYWwJdGxiX21pc3NfY29tbW9uCiB0bGJfbWlzc19jb21tb246Ci0JbWZzcglyMCwgU1lTUkVHX1BUQlIKLQltZnNyCXIxLCBTWVNSRUdfVExCRUFSCisJbWZzcglyMCwgU1lTUkVHX1RMQkVBUgorCW1mc3IJcjEsIFNZU1JFR19QVEJSCiAKIAkvKiBJcyBpdCB0aGUgdm1hbGxvYyBzcGFjZT8gKi8KLQlibGQJcjEsIDMxCisJYmxkCXIwLCAzMQogCWJyY3MJaGFuZGxlX3ZtYWxsb2NfbWlzcwogCiAJLyogRmlyc3QgbGV2ZWwgbG9va3VwICovCiBwZ3RibF9sb29rdXA6Ci0JbHNyCXIyLCByMSwgUEdESVJfU0hJRlQKLQlsZC53CXIwLCByMFtyMiA8PCAyXQotCWJsZAlyMCwgX1BBR0VfQklUX1BSRVNFTlQKKwlsc3IJcjIsIHIwLCBQR0RJUl9TSElGVAorCWxkLncJcjMsIHIxW3IyIDw8IDJdCisJYmZleHR1CXIxLCByMCwgUEFHRV9TSElGVCwgUEdESVJfU0hJRlQgLSBQQUdFX1NISUZUCisJYmxkCXIzLCBfUEFHRV9CSVRfUFJFU0VOVAogCWJyY2MJcGFnZV90YWJsZV9ub3RfcHJlc2VudAogCi0JLyogVE9ETzogQ2hlY2sgYWNjZXNzIHJpZ2h0cyBvbiBwYWdlIHRhYmxlIGlmIG5lY2Vzc2FyeSAqLwotCiAJLyogVHJhbnNsYXRlIHRvIHZpcnR1YWwgYWRkcmVzcyBpbiBQMS4gKi8KLQlhbmRsCXIwLCAweGYwMDAKLQlzYnIJcjAsIDMxCisJYW5kbAlyMywgMHhmMDAwCisJc2JyCXIzLCAzMQogCiAJLyogU2Vjb25kIGxldmVsIGxvb2t1cCAqLwotCWxzbAlyMSwgKDMyIC0gUEdESVJfU0hJRlQpCi0JbHNyCXIxLCAoMzIgLSBQR0RJUl9TSElGVCkgKyBQQUdFX1NISUZUCi0JYWRkCXIyLCByMCwgcjEgPDwgMgotCWxkLncJcjEsIHIyWzBdCi0JYmxkCXIxLCBfUEFHRV9CSVRfUFJFU0VOVAorCWxkLncJcjIsIHIzW3IxIDw8IDJdCisJbWZzcglyMCwgU1lTUkVHX1RMQkFSTE8KKwlibGQJcjIsIF9QQUdFX0JJVF9QUkVTRU5UCiAJYnJjYwlwYWdlX25vdF9wcmVzZW50CiAKIAkvKiBNYXJrIHRoZSBwYWdlIGFzIGFjY2Vzc2VkICovCi0Jc2JyCXIxLCBfUEFHRV9CSVRfQUNDRVNTRUQKLQlzdC53CXIyWzBdLCByMQorCXNicglyMiwgX1BBR0VfQklUX0FDQ0VTU0VECisJc3QudwlyM1tyMSA8PCAyXSwgcjIKIAogCS8qIERyb3Agc29mdHdhcmUgZmxhZ3MgKi8KLQlhbmRsCXIxLCBfUEFHRV9GTEFHU19IQVJEV0FSRV9NQVNLICYgMHhmZmZmCi0JbXRzcglTWVNSRUdfVExCRUxPLCByMQorCWFuZGwJcjIsIF9QQUdFX0ZMQUdTX0hBUkRXQVJFX01BU0sgJiAweGZmZmYKKwltdHNyCVNZU1JFR19UTEJFTE8sIHIyCiAKIAkvKiBGaWd1cmUgb3V0IHdoaWNoIGVudHJ5IHdlIHdhbnQgdG8gcmVwbGFjZSAqLwotCW1mc3IJcjAsIFNZU1JFR19UTEJBUkxPCisJbWZzcglyMSwgU1lTUkVHX01NVUNSCiAJY2x6CXIyLCByMAogCWJyY2MJMWYKLQltb3YJcjEsIC0xCQkJLyogQWxsIGVudHJpZXMgaGF2ZSBiZWVuIGFjY2Vzc2VkLCAqLwotCW10c3IJU1lTUkVHX1RMQkFSTE8sIHIxCS8qIHNvIHJlc2V0IFRMQkFSICovCi0JbW92CXIyLCAwCQkJLyogYW5kIHN0YXJ0IGF0IDAgKi8KLTE6CW1mc3IJcjEsIFNZU1JFR19NTVVDUgotCWxzbAlyMiwgMTQKLQlhbmRsCXIxLCAweDNmZmYsIENPSAotCW9yCXIxLCByMgotCW10c3IJU1lTUkVHX01NVUNSLCByMQorCW1vdglyMywgLTEJCQkvKiBBbGwgZW50cmllcyBoYXZlIGJlZW4gYWNjZXNzZWQsICovCisJbW92CXIyLCAwCQkJLyogc28gc3RhcnQgYXQgMCAqLworCW10c3IJU1lTUkVHX1RMQkFSTE8sIHIzCS8qIGFuZCByZXNldCBUTEJBUiAqLwogCisxOgliZmlucwlyMSwgcjIsIFNZU1JFR19EUlBfT0ZGU0VULCBTWVNSRUdfRFJQX1NJWkUKKwltdHNyCVNZU1JFR19NTVVDUiwgcjEKIAl0bGJ3CiAKIAl0bGJtaXNzX3Jlc3RvcmUKQEAgLTE1Niw4ICsxNTAsOCBAQAogCiBoYW5kbGVfdm1hbGxvY19taXNzOgogCS8qIFNpbXBseSBkbyB0aGUgbG9va3VwIGluIGluaXQncyBwYWdlIHRhYmxlICovCi0JbW92CXIwLCBsbyhzd2FwcGVyX3BnX2RpcikKLQlvcmgJcjAsIGhpKHN3YXBwZXJfcGdfZGlyKQorCW1vdglyMSwgbG8oc3dhcHBlcl9wZ19kaXIpCisJb3JoCXIxLCBoaShzd2FwcGVyX3BnX2RpcikKIAlyam1wCXBndGJsX2xvb2t1cAogCiAKQEAgLTM0MCwxMiArMzM0LDM0IEBACiBkb19ubWlfbGw6CiAJc3ViCXNwLCA0CiAJc3RtdHMJLS1zcCwgcjAtbHIKLQkvKiBGSVhNRTogTWFrZSBzdXJlIFJBUl9OTUkgYW5kIFJTUl9OTUkgYXJlIHB1c2hlZCBpbnN0ZWFkIG9mICpfRVggKi8KLQlyY2FsbAlzYXZlX2Z1bGxfY29udGV4dF9leAorCW1mc3IJcjksIFNZU1JFR19SU1JfTk1JCisJbWZzcglyOCwgU1lTUkVHX1JBUl9OTUkKKwliZmV4dHUJcjAsIHI5LCBNT0RFX1NISUZULCAzCisJYnJuZQkyZgorCisxOglwdXNobQlyOCwgcjkJLyogUEMgYW5kIFNSICovCiAJbWZzcglyMTIsIFNZU1JFR19FQ1IKIAltb3YJcjExLCBzcAogCXJjYWxsCWRvX25taQotCXJqbXAJYmFkX3JldHVybgorCXBvcG0JcjgtcjkKKwltdHNyCVNZU1JFR19SQVJfTk1JLCByOAorCXRzdAlyMCwgcjAKKwltdHNyCVNZU1JFR19SU1JfTk1JLCByOQorCWJybmUJM2YKKworCWxkbXRzCXNwKyssIHIwLWxyCisJc3ViCXNwLCAtNAkJLyogc2tpcCByMTJfb3JpZyAqLworCXJldGUKKworMjoJc3ViCXIxMCwgc3AsIC0oRlJBTUVfU0laRV9GVUxMIC0gUkVHX0xSKQorCXN0ZHNwCXNwWzRdLCByMTAJLyogcmVwbGFjZSBzYXZlZCBTUCAqLworCXJqbXAJMWIKKworMzoJcG9wbQlscgorCXN1YglzcCwgLTQJCS8qIHNraXAgc3AgKi8KKwlwb3BtCXIwLXIxMgorCXN1YglzcCwgLTQJCS8qIHNraXAgcjEyX29yaWcgKi8KKwlyZXRlCiAKIGhhbmRsZV9hZGRyZXNzX2ZhdWx0OgogCXN1YglzcCwgNApAQCAtNjMwLDkgKzY0NiwxMiBAQAogCXJjYWxsCWRvX0lSUQogCiAJbGRkc3AJcjQsIHNwW1JFR19TUl0KLQlhbmRoCXI0LCAoTU9ERV9NQVNLID4+IDE2KSwgQ09ICisJYmZleHR1CXI0LCByNCwgU1lTUkVHX00wX09GRlNFVCwgMworCWNwLncJcjQsIE1PREVfU1VQRVJWSVNPUiA+PiBTWVNSRUdfTTBfT0ZGU0VUCisJYnJlcQkyZgorCWNwLncJcjQsIE1PREVfVVNFUiA+PiBTWVNSRUdfTTBfT0ZGU0VUCiAjaWZkZWYgQ09ORklHX1BSRUVNUFQKLQlicm5lCTJmCisJYnJuZQkzZgogI2Vsc2UKIAlicm5lCTFmCiAjZW5kaWYKQEAgLTY0OSw5ICs2NjgsMTggQEAKIAlzdWIJc3AsIC00CQkvKiBpZ25vcmUgcjEyX29yaWcgKi8KIAlyZXRlCiAKKzI6CWdldF90aHJlYWRfaW5mbwlyMAorCWxkLncJcjEsIHIwW1RJX2ZsYWdzXQorCWJsZAlyMSwgVElGX0NQVV9HT0lOR19UT19TTEVFUAogI2lmZGVmIENPTkZJR19QUkVFTVBUCi0yOgotCWdldF90aHJlYWRfaW5mbwlyMAorCWJyY2MJM2YKKyNlbHNlCisJYnJjYwkxYgorI2VuZGlmCisJc3ViCXIxLCBwYywgLiAtIGNwdV9pZGxlX3NraXBfc2xlZXAKKwlzdGRzcAlzcFtSRUdfUENdLCByMQorI2lmZGVmIENPTkZJR19QUkVFTVBUCiszOglnZXRfdGhyZWFkX2luZm8gcjAKIAlsZC53CXIyLCByMFtUSV9wcmVlbXB0X2NvdW50XQogCWNwLncJcjIsIDAKIAlicm5lCTFiCkBAIC02NjIsMTIgKzY5MCwzMiBAQAogCWJsZAlyNCwgU1lTUkVHX0dNX09GRlNFVAogCWJyY3MJMWIKIAlyY2FsbAlwcmVlbXB0X3NjaGVkdWxlX2lycQotCXJqbXAJMWIKICNlbmRpZgorCXJqbXAJMWIKIAkuZW5kbQogCiAJLnNlY3Rpb24gLmlycS50ZXh0LCJheCIsQHByb2diaXRzCiAKKy5nbG9iYWwgY3B1X2lkbGVfc2xlZXAKK2NwdV9pZGxlX3NsZWVwOgorCW1hc2tfaW50ZXJydXB0cworCWdldF90aHJlYWRfaW5mbyByOAorCWxkLncJcjksIHI4W1RJX2ZsYWdzXQorCWJsZAlyOSwgVElGX05FRURfUkVTQ0hFRAorCWJyY3MJY3B1X2lkbGVfZW5hYmxlX2ludF9hbmRfZXhpdAorCXNicglyOSwgVElGX0NQVV9HT0lOR19UT19TTEVFUAorCXN0LncJcjhbVElfZmxhZ3NdLCByOQorCXVubWFza19pbnRlcnJ1cHRzCisJc2xlZXAgMAorY3B1X2lkbGVfc2tpcF9zbGVlcDoKKwltYXNrX2ludGVycnVwdHMKKwlsZC53CXI5LCByOFtUSV9mbGFnc10KKwljYnIJcjksIFRJRl9DUFVfR09JTkdfVE9fU0xFRVAKKwlzdC53CXI4W1RJX2ZsYWdzXSwgcjkKK2NwdV9pZGxlX2VuYWJsZV9pbnRfYW5kX2V4aXQ6CisJdW5tYXNrX2ludGVycnVwdHMKKwlyZXRhbAlyMTIKKwogCS5nbG9iYWwJaXJxX2xldmVsMAogCS5nbG9iYWwJaXJxX2xldmVsMQogCS5nbG9iYWwJaXJxX2xldmVsMgpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9rZXJuZWwvbW9kdWxlLmMgYi9hcmNoL2F2cjMyL2tlcm5lbC9tb2R1bGUuYwppbmRleCBiNTk5ZWFlLi4xMTY3ZmU5YyAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9rZXJuZWwvbW9kdWxlLmMKKysrIGIvYXJjaC9hdnIzMi9rZXJuZWwvbW9kdWxlLmMKQEAgLTEyLDEwICsxMiwxMSBAQAogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L21vZHVsZWxvYWRlci5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2J1Zy5oPgogI2luY2x1ZGUgPGxpbnV4L2VsZi5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZWxvYWRlci5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KIAogdm9pZCAqbW9kdWxlX2FsbG9jKHVuc2lnbmVkIGxvbmcgc2l6ZSkKQEAgLTMxNSwxMCArMzE2LDEwIEBACiAJdmZyZWUobW9kdWxlLT5hcmNoLnN5bWluZm8pOwogCW1vZHVsZS0+YXJjaC5zeW1pbmZvID0gTlVMTDsKIAotCXJldHVybiAwOworCXJldHVybiBtb2R1bGVfYnVnX2ZpbmFsaXplKGhkciwgc2VjaGRycywgbW9kdWxlKTsKIH0KIAogdm9pZCBtb2R1bGVfYXJjaF9jbGVhbnVwKHN0cnVjdCBtb2R1bGUgKm1vZHVsZSkKIHsKLQorCW1vZHVsZV9idWdfY2xlYW51cChtb2R1bGUpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9hdnIzMi9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IDBiNDMyNTkuLjRlNDE4MWUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL2F2cjMyL2tlcm5lbC9wcm9jZXNzLmMKQEAgLTExLDYgKzExLDcgQEAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgogI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KIAogI2luY2x1ZGUgPGFzbS9zeXNyZWcuaD4KQEAgLTE5LDYgKzIwLDggQEAKIHZvaWQgKCpwbV9wb3dlcl9vZmYpKHZvaWQpID0gTlVMTDsKIEVYUE9SVF9TWU1CT0wocG1fcG93ZXJfb2ZmKTsKIAorZXh0ZXJuIHZvaWQgY3B1X2lkbGVfc2xlZXAodm9pZCk7CisKIC8qCiAgKiBUaGlzIGZpbGUgaGFuZGxlcyB0aGUgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBwYXJ0cyBvZiBwcm9jZXNzIGhhbmRsaW5nLi4KICAqLwpAQCAtMjcsOSArMzAsOCBAQAogewogCS8qIGVuZGxlc3MgaWRsZSBsb29wIHdpdGggbm8gcHJpb3JpdHkgYXQgYWxsICovCiAJd2hpbGUgKDEpIHsKLQkJLyogVE9ETzogRW50ZXIgc2xlZXAgbW9kZSAqLwogCQl3aGlsZSAoIW5lZWRfcmVzY2hlZCgpKQotCQkJY3B1X3JlbGF4KCk7CisJCQljcHVfaWRsZV9zbGVlcCgpOwogCQlwcmVlbXB0X2VuYWJsZV9ub19yZXNjaGVkKCk7CiAJCXNjaGVkdWxlKCk7CiAJCXByZWVtcHRfZGlzYWJsZSgpOwpAQCAtMTE0LDM5ICsxMTYsMTc4IEBACiAJLyogZG8gbm90aGluZyAqLwogfQogCitzdGF0aWMgdm9pZCBkdW1wX21lbShjb25zdCBjaGFyICpzdHIsIGNvbnN0IGNoYXIgKmxvZ19sdmwsCisJCSAgICAgdW5zaWduZWQgbG9uZyBib3R0b20sIHVuc2lnbmVkIGxvbmcgdG9wKQoreworCXVuc2lnbmVkIGxvbmcgcDsKKwlpbnQgaTsKKworCXByaW50aygiJXMlcygweCUwOGx4IHRvIDB4JTA4bHgpXG4iLCBsb2dfbHZsLCBzdHIsIGJvdHRvbSwgdG9wKTsKKworCWZvciAocCA9IGJvdHRvbSAmIH4zMTsgcCA8IHRvcDsgKSB7CisJCXByaW50aygiJXMlMDRseDogIiwgbG9nX2x2bCwgcCAmIDB4ZmZmZik7CisKKwkJZm9yIChpID0gMDsgaSA8IDg7IGkrKywgcCArPSA0KSB7CisJCQl1bnNpZ25lZCBpbnQgdmFsOworCisJCQlpZiAocCA8IGJvdHRvbSB8fCBwID49IHRvcCkKKwkJCQlwcmludGsoIiAgICAgICAgICIpOworCQkJZWxzZSB7CisJCQkJaWYgKF9fZ2V0X3VzZXIodmFsLCAodW5zaWduZWQgaW50IF9fdXNlciAqKXApKSB7CisJCQkJCXByaW50aygiXG4iKTsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCQkJCXByaW50aygiJTA4eCAiLCB2YWwpOworCQkJfQorCQl9CisJCXByaW50aygiXG4iKTsKKwl9CisKK291dDoKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHZhbGlkX3N0YWNrX3B0cihzdHJ1Y3QgdGhyZWFkX2luZm8gKnRpbmZvLCB1bnNpZ25lZCBsb25nIHApCit7CisJcmV0dXJuIChwID4gKHVuc2lnbmVkIGxvbmcpdGluZm8pCisJCSYmIChwIDwgKHVuc2lnbmVkIGxvbmcpdGluZm8gKyBUSFJFQURfU0laRSAtIDMpOworfQorCisjaWZkZWYgQ09ORklHX0ZSQU1FX1BPSU5URVIKK3N0YXRpYyB2b2lkIHNob3dfdHJhY2VfbG9nX2x2bChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgdW5zaWduZWQgbG9uZyAqc3AsCisJCQkgICAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGNvbnN0IGNoYXIgKmxvZ19sdmwpCit7CisJdW5zaWduZWQgbG9uZyBsciwgZnA7CisJc3RydWN0IHRocmVhZF9pbmZvICp0aW5mbzsKKworCWlmIChyZWdzKQorCQlmcCA9IHJlZ3MtPnI3OworCWVsc2UgaWYgKHRzayA9PSBjdXJyZW50KQorCQlhc20oIm1vdiAlMCwgcjciIDogIj1yIihmcCkpOworCWVsc2UKKwkJZnAgPSB0c2stPnRocmVhZC5jcHVfY29udGV4dC5yNzsKKworCS8qCisJICogV2FsayB0aGUgc3RhY2sgYXMgbG9uZyBhcyB0aGUgZnJhbWUgcG9pbnRlciAoYSkgaXMgd2l0aGluCisJICogdGhlIGtlcm5lbCBzdGFjayBvZiB0aGUgdGFzaywgYW5kIChiKSBpdCBkb2Vzbid0IG1vdmUKKwkgKiBkb3dud2FyZHMuCisJICovCisJdGluZm8gPSB0YXNrX3RocmVhZF9pbmZvKHRzayk7CisJcHJpbnRrKCIlc0NhbGwgdHJhY2U6XG4iLCBsb2dfbHZsKTsKKwl3aGlsZSAodmFsaWRfc3RhY2tfcHRyKHRpbmZvLCBmcCkpIHsKKwkJdW5zaWduZWQgbG9uZyBuZXdfZnA7CisKKwkJbHIgPSAqKHVuc2lnbmVkIGxvbmcgKilmcDsKKyNpZmRlZiBDT05GSUdfS0FMTFNZTVMKKwkJcHJpbnRrKCIlcyBbPCUwOGx4Pl0gIiwgbG9nX2x2bCwgbHIpOworI2Vsc2UKKwkJcHJpbnRrKCIgWzwlMDhseD5dICIsIGxyKTsKKyNlbmRpZgorCQlwcmludF9zeW1ib2woIiVzXG4iLCBscik7CisKKwkJbmV3X2ZwID0gKih1bnNpZ25lZCBsb25nICopKGZwICsgNCk7CisJCWlmIChuZXdfZnAgPD0gZnApCisJCQlicmVhazsKKwkJZnAgPSBuZXdfZnA7CisJfQorCXByaW50aygiXG4iKTsKK30KKyNlbHNlCitzdGF0aWMgdm9pZCBzaG93X3RyYWNlX2xvZ19sdmwoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHVuc2lnbmVkIGxvbmcgKnNwLAorCQkJICAgICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzLCBjb25zdCBjaGFyICpsb2dfbHZsKQoreworCXVuc2lnbmVkIGxvbmcgYWRkcjsKKworCXByaW50aygiJXNDYWxsIHRyYWNlOlxuIiwgbG9nX2x2bCk7CisKKwl3aGlsZSAoIWtzdGFja19lbmQoc3ApKSB7CisJCWFkZHIgPSAqc3ArKzsKKwkJaWYgKGtlcm5lbF90ZXh0X2FkZHJlc3MoYWRkcikpIHsKKyNpZmRlZiBDT05GSUdfS0FMTFNZTVMKKwkJCXByaW50aygiJXMgWzwlMDhseD5dICIsIGxvZ19sdmwsIGFkZHIpOworI2Vsc2UKKwkJCXByaW50aygiIFs8JTA4bHg+XSAiLCBhZGRyKTsKKyNlbmRpZgorCQkJcHJpbnRfc3ltYm9sKCIlc1xuIiwgYWRkcik7CisJCX0KKwl9CisJcHJpbnRrKCJcbiIpOworfQorI2VuZGlmCisKK3ZvaWQgc2hvd19zdGFja19sb2dfbHZsKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCB1bnNpZ25lZCBsb25nIHNwLAorCQkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGNvbnN0IGNoYXIgKmxvZ19sdmwpCit7CisJc3RydWN0IHRocmVhZF9pbmZvICp0aW5mbzsKKworCWlmIChzcCA9PSAwKSB7CisJCWlmICh0c2spCisJCQlzcCA9IHRzay0+dGhyZWFkLmNwdV9jb250ZXh0LmtzcDsKKwkJZWxzZQorCQkJc3AgPSAodW5zaWduZWQgbG9uZykmdGluZm87CisJfQorCWlmICghdHNrKQorCQl0c2sgPSBjdXJyZW50OworCisJdGluZm8gPSB0YXNrX3RocmVhZF9pbmZvKHRzayk7CisKKwlpZiAodmFsaWRfc3RhY2tfcHRyKHRpbmZvLCBzcCkpIHsKKwkJZHVtcF9tZW0oIlN0YWNrOiAiLCBsb2dfbHZsLCBzcCwKKwkJCSBUSFJFQURfU0laRSArICh1bnNpZ25lZCBsb25nKXRpbmZvKTsKKwkJc2hvd190cmFjZV9sb2dfbHZsKHRzaywgKHVuc2lnbmVkIGxvbmcgKilzcCwgcmVncywgbG9nX2x2bCk7CisJfQorfQorCit2b2lkIHNob3dfc3RhY2soc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHVuc2lnbmVkIGxvbmcgKnN0YWNrKQoreworCXNob3dfc3RhY2tfbG9nX2x2bCh0c2ssICh1bnNpZ25lZCBsb25nKXN0YWNrLCBOVUxMLCAiIik7Cit9CisKK3ZvaWQgZHVtcF9zdGFjayh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgc3RhY2s7CisKKwlzaG93X3RyYWNlX2xvZ19sdmwoY3VycmVudCwgJnN0YWNrLCBOVUxMLCAiIik7Cit9CitFWFBPUlRfU1lNQk9MKGR1bXBfc3RhY2spOworCiBzdGF0aWMgY29uc3QgY2hhciAqY3B1X21vZGVzW10gPSB7CiAJIkFwcGxpY2F0aW9uIiwgIlN1cGVydmlzb3IiLCAiSW50ZXJydXB0IGxldmVsIDAiLCAiSW50ZXJydXB0IGxldmVsIDEiLAogCSJJbnRlcnJ1cHQgbGV2ZWwgMiIsICJJbnRlcnJ1cHQgbGV2ZWwgMyIsICJFeGNlcHRpb24iLCAiTk1JIgogfTsKIAotdm9pZCBzaG93X3JlZ3Moc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit2b2lkIHNob3dfcmVnc19sb2dfbHZsKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBjb25zdCBjaGFyICpsb2dfbHZsKQogewogCXVuc2lnbmVkIGxvbmcgc3AgPSByZWdzLT5zcDsKIAl1bnNpZ25lZCBsb25nIGxyID0gcmVncy0+bHI7CiAJdW5zaWduZWQgbG9uZyBtb2RlID0gKHJlZ3MtPnNyICYgTU9ERV9NQVNLKSA+PiBNT0RFX1NISUZUOwogCi0JaWYgKCF1c2VyX21vZGUocmVncykpCisJaWYgKCF1c2VyX21vZGUocmVncykpIHsKIAkJc3AgPSAodW5zaWduZWQgbG9uZylyZWdzICsgRlJBTUVfU0laRV9GVUxMOwogCi0JcHJpbnRfc3ltYm9sKCJQQyBpcyBhdCAlc1xuIiwgaW5zdHJ1Y3Rpb25fcG9pbnRlcihyZWdzKSk7Ci0JcHJpbnRfc3ltYm9sKCJMUiBpcyBhdCAlc1xuIiwgbHIpOwotCXByaW50aygicGMgOiBbPCUwOGx4Pl0gICAgbHIgOiBbPCUwOGx4Pl0gICAgJXNcbiIKLQkgICAgICAgInNwIDogJTA4bHggIHIxMjogJTA4bHggIHIxMTogJTA4bHhcbiIsCi0JICAgICAgIGluc3RydWN0aW9uX3BvaW50ZXIocmVncyksCi0JICAgICAgIGxyLCBwcmludF90YWludGVkKCksIHNwLCByZWdzLT5yMTIsIHJlZ3MtPnIxMSk7Ci0JcHJpbnRrKCJyMTA6ICUwOGx4ICByOSA6ICUwOGx4ICByOCA6ICUwOGx4XG4iLAotCSAgICAgICByZWdzLT5yMTAsIHJlZ3MtPnI5LCByZWdzLT5yOCk7Ci0JcHJpbnRrKCJyNyA6ICUwOGx4ICByNiA6ICUwOGx4ICByNSA6ICUwOGx4ICByNCA6ICUwOGx4XG4iLAotCSAgICAgICByZWdzLT5yNywgcmVncy0+cjYsIHJlZ3MtPnI1LCByZWdzLT5yNCk7Ci0JcHJpbnRrKCJyMyA6ICUwOGx4ICByMiA6ICUwOGx4ICByMSA6ICUwOGx4ICByMCA6ICUwOGx4XG4iLAotCSAgICAgICByZWdzLT5yMywgcmVncy0+cjIsIHJlZ3MtPnIxLCByZWdzLT5yMCk7Ci0JcHJpbnRrKCJGbGFnczogJWMlYyVjJWMlY1xuIiwKKwkJcHJpbnRrKCIlcyIsIGxvZ19sdmwpOworCQlwcmludF9zeW1ib2woIlBDIGlzIGF0ICVzXG4iLCBpbnN0cnVjdGlvbl9wb2ludGVyKHJlZ3MpKTsKKwkJcHJpbnRrKCIlcyIsIGxvZ19sdmwpOworCQlwcmludF9zeW1ib2woIkxSIGlzIGF0ICVzXG4iLCBscik7CisJfQorCisJcHJpbnRrKCIlc3BjIDogWzwlMDhseD5dICAgIGxyIDogWzwlMDhseD5dICAgICVzXG4iCisJICAgICAgICIlc3NwIDogJTA4bHggIHIxMjogJTA4bHggIHIxMTogJTA4bHhcbiIsCisJICAgICAgIGxvZ19sdmwsIGluc3RydWN0aW9uX3BvaW50ZXIocmVncyksIGxyLCBwcmludF90YWludGVkKCksCisJICAgICAgIGxvZ19sdmwsIHNwLCByZWdzLT5yMTIsIHJlZ3MtPnIxMSk7CisJcHJpbnRrKCIlc3IxMDogJTA4bHggIHI5IDogJTA4bHggIHI4IDogJTA4bHhcbiIsCisJICAgICAgIGxvZ19sdmwsIHJlZ3MtPnIxMCwgcmVncy0+cjksIHJlZ3MtPnI4KTsKKwlwcmludGsoIiVzcjcgOiAlMDhseCAgcjYgOiAlMDhseCAgcjUgOiAlMDhseCAgcjQgOiAlMDhseFxuIiwKKwkgICAgICAgbG9nX2x2bCwgcmVncy0+cjcsIHJlZ3MtPnI2LCByZWdzLT5yNSwgcmVncy0+cjQpOworCXByaW50aygiJXNyMyA6ICUwOGx4ICByMiA6ICUwOGx4ICByMSA6ICUwOGx4ICByMCA6ICUwOGx4XG4iLAorCSAgICAgICBsb2dfbHZsLCByZWdzLT5yMywgcmVncy0+cjIsIHJlZ3MtPnIxLCByZWdzLT5yMCk7CisJcHJpbnRrKCIlc0ZsYWdzOiAlYyVjJWMlYyVjXG4iLCBsb2dfbHZsLAogCSAgICAgICByZWdzLT5zciAmIFNSX1EgPyAnUScgOiAncScsCiAJICAgICAgIHJlZ3MtPnNyICYgU1JfViA/ICdWJyA6ICd2JywKIAkgICAgICAgcmVncy0+c3IgJiBTUl9OID8gJ04nIDogJ24nLAogCSAgICAgICByZWdzLT5zciAmIFNSX1ogPyAnWicgOiAneicsCiAJICAgICAgIHJlZ3MtPnNyICYgU1JfQyA/ICdDJyA6ICdjJyk7Ci0JcHJpbnRrKCJNb2RlIGJpdHM6ICVjJWMlYyVjJWMlYyVjJWMlY1xuIiwKKwlwcmludGsoIiVzTW9kZSBiaXRzOiAlYyVjJWMlYyVjJWMlYyVjJWNcbiIsIGxvZ19sdmwsCiAJICAgICAgIHJlZ3MtPnNyICYgU1JfSCA/ICdIJyA6ICdoJywKIAkgICAgICAgcmVncy0+c3IgJiBTUl9SID8gJ1InIDogJ3InLAogCSAgICAgICByZWdzLT5zciAmIFNSX0ogPyAnSicgOiAnaicsCkBAIC0xNTYsOSArMjk3LDIxIEBACiAJICAgICAgIHJlZ3MtPnNyICYgU1JfSTFNID8gJzEnIDogJy4nLAogCSAgICAgICByZWdzLT5zciAmIFNSX0kwTSA/ICcwJyA6ICcuJywKIAkgICAgICAgcmVncy0+c3IgJiBTUl9HTSA/ICdHJyA6ICdnJyk7Ci0JcHJpbnRrKCJDUFUgTW9kZTogJXNcbiIsIGNwdV9tb2Rlc1ttb2RlXSk7CisJcHJpbnRrKCIlc0NQVSBNb2RlOiAlc1xuIiwgbG9nX2x2bCwgY3B1X21vZGVzW21vZGVdKTsKKwlwcmludGsoIiVzUHJvY2VzczogJXMgWyVkXSAodGFzazogJXAgdGhyZWFkOiAlcClcbiIsCisJICAgICAgIGxvZ19sdmwsIGN1cnJlbnQtPmNvbW0sIGN1cnJlbnQtPnBpZCwgY3VycmVudCwKKwkgICAgICAgdGFza190aHJlYWRfaW5mbyhjdXJyZW50KSk7Cit9CiAKLQlzaG93X3RyYWNlKE5VTEwsICh1bnNpZ25lZCBsb25nICopc3AsIHJlZ3MpOwordm9pZCBzaG93X3JlZ3Moc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdW5zaWduZWQgbG9uZyBzcCA9IHJlZ3MtPnNwOworCisJaWYgKCF1c2VyX21vZGUocmVncykpCisJCXNwID0gKHVuc2lnbmVkIGxvbmcpcmVncyArIEZSQU1FX1NJWkVfRlVMTDsKKworCXNob3dfcmVnc19sb2dfbHZsKHJlZ3MsICIiKTsKKwlzaG93X3RyYWNlX2xvZ19sdmwoY3VycmVudCwgKHVuc2lnbmVkIGxvbmcgKilzcCwgcmVncywgIiIpOwogfQogRVhQT1JUX1NZTUJPTChzaG93X3JlZ3MpOwogCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9hdnIzMi9rZXJuZWwvc2V0dXAuYwppbmRleCBhMWE3YzNjLi5iMjc5ZDY2IDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvYXZyMzIva2VybmVsL3NldHVwLmMKQEAgLTgsMTIgKzgsMTQgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0cmQuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wZm4uaD4KICNpbmNsdWRlIDxsaW51eC9yb290X2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpAQCAtMzAsMTMgKzMyLDYgQEAKIGV4dGVybiBpbnQgcm9vdF9tb3VudGZsYWdzOwogCiAvKgotICogQm9vdGxvYWRlci1wcm92aWRlZCBpbmZvcm1hdGlvbiBhYm91dCBwaHlzaWNhbCBtZW1vcnkKLSAqLwotc3RydWN0IHRhZ19tZW1fcmFuZ2UgKm1lbV9waHlzOwotc3RydWN0IHRhZ19tZW1fcmFuZ2UgKm1lbV9yZXNlcnZlZDsKLXN0cnVjdCB0YWdfbWVtX3JhbmdlICptZW1fcmFtZGlzazsKLQotLyoKICAqIEluaXRpYWxpemUgbG9vcHNfcGVyX2ppZmZ5IGFzIDUwMDAwMDAgKDUwME1JUFMpLgogICogQmV0dGVyIG1ha2UgaXQgdG9vIGxhcmdlIHRoYW4gdG9vIHNtYWxsLi4uCiAgKi8KQEAgLTQ4LDQ4ICs0MywxOTMgQEAKIHN0YXRpYyBjaGFyIF9faW5pdGRhdGEgY29tbWFuZF9saW5lW0NPTU1BTkRfTElORV9TSVpFXTsKIAogLyoKLSAqIFNob3VsZCBiZSBtb3JlIHRoYW4gZW5vdWdoLCBidXQgaWYgeW91IGhhdmUgYSBfcmVhbGx5XyBjb21wbGV4Ci0gKiBzZXR1cCwgeW91IG1pZ2h0IG5lZWQgdG8gaW5jcmVhc2UgdGhlIHNpemUgb2YgdGhpcy4uLgotICovCi1zdGF0aWMgc3RydWN0IHRhZ19tZW1fcmFuZ2UgX19pbml0ZGF0YSBtZW1fcmFuZ2VfY2FjaGVbMzJdOwotc3RhdGljIHVuc2lnbmVkIG1lbV9yYW5nZV9uZXh0X2ZyZWU7Ci0KLS8qCiAgKiBTdGFuZGFyZCBtZW1vcnkgcmVzb3VyY2VzCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgbWVtX3Jlc1tdID0gewotCXsKLQkJLm5hbWUJPSAiS2VybmVsIGNvZGUiLAotCQkuc3RhcnQJPSAwLAotCQkuZW5kCT0gMCwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0KLQl9LAotCXsKLQkJLm5hbWUJPSAiS2VybmVsIGRhdGEiLAotCQkuc3RhcnQJPSAwLAotCQkuZW5kCT0gMCwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgX19pbml0ZGF0YSBrZXJuZWxfZGF0YSA9IHsKKwkubmFtZQk9ICJLZXJuZWwgZGF0YSIsCisJLnN0YXJ0CT0gMCwKKwkuZW5kCT0gMCwKKwkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKK307CitzdGF0aWMgc3RydWN0IHJlc291cmNlIF9faW5pdGRhdGEga2VybmVsX2NvZGUgPSB7CisJLm5hbWUJPSAiS2VybmVsIGNvZGUiLAorCS5zdGFydAk9IDAsCisJLmVuZAk9IDAsCisJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJLnNpYmxpbmcgPSAma2VybmVsX2RhdGEsCiB9OwogCi0jZGVmaW5lIGtlcm5lbF9jb2RlCW1lbV9yZXNbMF0KLSNkZWZpbmUga2VybmVsX2RhdGEJbWVtX3Jlc1sxXQorLyoKKyAqIEF2YWlsYWJsZSBzeXN0ZW0gUkFNIGFuZCByZXNlcnZlZCByZWdpb25zIGFzIHNpbmdseSBsaW5rZWQKKyAqIGxpc3RzLiBUaGVzZSBsaXN0cyBhcmUgdHJhdmVyc2VkIHVzaW5nIHRoZSBzaWJsaW5nIHBvaW50ZXIgaW4KKyAqIHN0cnVjdCByZXNvdXJjZSBhbmQgYXJlIGtlcHQgc29ydGVkIGF0IGFsbCB0aW1lcy4KKyAqLworc3RhdGljIHN0cnVjdCByZXNvdXJjZSAqX19pbml0ZGF0YSBzeXN0ZW1fcmFtOworc3RhdGljIHN0cnVjdCByZXNvdXJjZSAqX19pbml0ZGF0YSByZXNlcnZlZCA9ICZrZXJuZWxfY29kZTsKKworLyoKKyAqIFdlIG5lZWQgdG8gYWxsb2NhdGUgdGhlc2UgYmVmb3JlIHRoZSBib290bWVtIGFsbG9jYXRvciBpcyB1cCBhbmQKKyAqIHJ1bm5pbmcsIHNvIHdlIG5lZWQgdGhpcyAiY2FjaGUiLiAzMiBlbnRyaWVzIGFyZSBwcm9iYWJseSBlbm91Z2gKKyAqIGZvciBhbGwgYnV0IHRoZSBtb3N0IGluc2FuZWx5IGNvbXBsZXggc3lzdGVtcy4KKyAqLworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBfX2luaXRkYXRhIHJlc19jYWNoZVszMl07CitzdGF0aWMgdW5zaWduZWQgaW50IF9faW5pdGRhdGEgcmVzX2NhY2hlX25leHRfZnJlZTsKKworc3RhdGljIHZvaWQgX19pbml0IHJlc291cmNlX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgKm1lbSwgKnJlczsKKwlzdHJ1Y3QgcmVzb3VyY2UgKm5ldzsKKworCWtlcm5lbF9jb2RlLnN0YXJ0ID0gX19wYShpbml0X21tLnN0YXJ0X2NvZGUpOworCisJZm9yIChtZW0gPSBzeXN0ZW1fcmFtOyBtZW07IG1lbSA9IG1lbS0+c2libGluZykgeworCQluZXcgPSBhbGxvY19ib290bWVtX2xvdyhzaXplb2Yoc3RydWN0IHJlc291cmNlKSk7CisJCW1lbWNweShuZXcsIG1lbSwgc2l6ZW9mKHN0cnVjdCByZXNvdXJjZSkpOworCisJCW5ldy0+c2libGluZyA9IE5VTEw7CisJCWlmIChyZXF1ZXN0X3Jlc291cmNlKCZpb21lbV9yZXNvdXJjZSwgbmV3KSkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkJhZCBSQU0gcmVzb3VyY2UgJTA4eC0lMDh4XG4iLAorCQkJICAgICAgIG1lbS0+c3RhcnQsIG1lbS0+ZW5kKTsKKwl9CisKKwlmb3IgKHJlcyA9IHJlc2VydmVkOyByZXM7IHJlcyA9IHJlcy0+c2libGluZykgeworCQluZXcgPSBhbGxvY19ib290bWVtX2xvdyhzaXplb2Yoc3RydWN0IHJlc291cmNlKSk7CisJCW1lbWNweShuZXcsIHJlcywgc2l6ZW9mKHN0cnVjdCByZXNvdXJjZSkpOworCisJCW5ldy0+c2libGluZyA9IE5VTEw7CisJCWlmIChpbnNlcnRfcmVzb3VyY2UoJmlvbWVtX3Jlc291cmNlLCBuZXcpKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJICAgICAgICJCYWQgcmVzZXJ2ZWQgcmVzb3VyY2UgJXMgKCUwOHgtJTA4eClcbiIsCisJCQkgICAgICAgcmVzLT5uYW1lLCByZXMtPnN0YXJ0LCByZXMtPmVuZCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBfX2luaXQKK2FkZF9waHlzaWNhbF9tZW1vcnkocmVzb3VyY2Vfc2l6ZV90IHN0YXJ0LCByZXNvdXJjZV9zaXplX3QgZW5kKQoreworCXN0cnVjdCByZXNvdXJjZSAqbmV3LCAqbmV4dCwgKipwcHJldjsKKworCWZvciAocHByZXYgPSAmc3lzdGVtX3JhbSwgbmV4dCA9IHN5c3RlbV9yYW07IG5leHQ7CisJICAgICBwcHJldiA9ICZuZXh0LT5zaWJsaW5nLCBuZXh0ID0gbmV4dC0+c2libGluZykgeworCQlpZiAoZW5kIDwgbmV4dC0+c3RhcnQpCisJCQlicmVhazsKKwkJaWYgKHN0YXJ0IDw9IG5leHQtPmVuZCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJICAgICAgICJXYXJuaW5nOiBQaHlzaWNhbCBtZW1vcnkgbWFwIGlzIGJyb2tlblxuIik7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgIldhcm5pbmc6ICUwOHgtJTA4eCBvdmVybGFwcyAlMDh4LSUwOHhcbiIsCisJCQkgICAgICAgc3RhcnQsIGVuZCwgbmV4dC0+c3RhcnQsIG5leHQtPmVuZCk7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwlpZiAocmVzX2NhY2hlX25leHRfZnJlZSA+PSBBUlJBWV9TSVpFKHJlc19jYWNoZSkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgIldhcm5pbmc6IEZhaWxlZCB0byBhZGQgcGh5c2ljYWwgbWVtb3J5ICUwOHgtJTA4eFxuIiwKKwkJICAgICAgIHN0YXJ0LCBlbmQpOworCQlyZXR1cm47CisJfQorCisJbmV3ID0gJnJlc19jYWNoZVtyZXNfY2FjaGVfbmV4dF9mcmVlKytdOworCW5ldy0+c3RhcnQgPSBzdGFydDsKKwluZXctPmVuZCA9IGVuZDsKKwluZXctPm5hbWUgPSAiU3lzdGVtIFJBTSI7CisJbmV3LT5mbGFncyA9IElPUkVTT1VSQ0VfTUVNOworCisJKnBwcmV2ID0gbmV3OworfQorCitzdGF0aWMgaW50IF9faW5pdAorYWRkX3Jlc2VydmVkX3JlZ2lvbihyZXNvdXJjZV9zaXplX3Qgc3RhcnQsIHJlc291cmNlX3NpemVfdCBlbmQsCisJCSAgICBjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCByZXNvdXJjZSAqbmV3LCAqbmV4dCwgKipwcHJldjsKKworCWlmIChlbmQgPCBzdGFydCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAocmVzX2NhY2hlX25leHRfZnJlZSA+PSBBUlJBWV9TSVpFKHJlc19jYWNoZSkpCisJCXJldHVybiAtRU5PTUVNOworCisJZm9yIChwcHJldiA9ICZyZXNlcnZlZCwgbmV4dCA9IHJlc2VydmVkOyBuZXh0OworCSAgICAgcHByZXYgPSAmbmV4dC0+c2libGluZywgbmV4dCA9IG5leHQtPnNpYmxpbmcpIHsKKwkJaWYgKGVuZCA8IG5leHQtPnN0YXJ0KQorCQkJYnJlYWs7CisJCWlmIChzdGFydCA8PSBuZXh0LT5lbmQpCisJCQlyZXR1cm4gLUVCVVNZOworCX0KKworCW5ldyA9ICZyZXNfY2FjaGVbcmVzX2NhY2hlX25leHRfZnJlZSsrXTsKKwluZXctPnN0YXJ0ID0gc3RhcnQ7CisJbmV3LT5lbmQgPSBlbmQ7CisJbmV3LT5uYW1lID0gbmFtZTsKKwluZXctPmZsYWdzID0gSU9SRVNPVVJDRV9NRU07CisKKwkqcHByZXYgPSBuZXc7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgX19pbml0CitmaW5kX2ZyZWVfcmVnaW9uKGNvbnN0IHN0cnVjdCByZXNvdXJjZSAqbWVtLCByZXNvdXJjZV9zaXplX3Qgc2l6ZSwKKwkJIHJlc291cmNlX3NpemVfdCBhbGlnbikKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwl1bnNpZ25lZCBsb25nIHRhcmdldDsKKworCXRhcmdldCA9IEFMSUdOKG1lbS0+c3RhcnQsIGFsaWduKTsKKwlmb3IgKHJlcyA9IHJlc2VydmVkOyByZXM7IHJlcyA9IHJlcy0+c2libGluZykgeworCQlpZiAoKHRhcmdldCArIHNpemUpIDw9IHJlcy0+c3RhcnQpCisJCQlicmVhazsKKwkJaWYgKHRhcmdldCA8PSByZXMtPmVuZCkKKwkJCXRhcmdldCA9IEFMSUdOKHJlcy0+ZW5kICsgMSwgYWxpZ24pOworCX0KKworCWlmICgodGFyZ2V0ICsgc2l6ZSkgPiAobWVtLT5lbmQgKyAxKSkKKwkJcmV0dXJuIG1lbS0+ZW5kICsgMTsKKworCXJldHVybiB0YXJnZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0CithbGxvY19yZXNlcnZlZF9yZWdpb24ocmVzb3VyY2Vfc2l6ZV90ICpzdGFydCwgcmVzb3VyY2Vfc2l6ZV90IHNpemUsCisJCSAgICAgIHJlc291cmNlX3NpemVfdCBhbGlnbiwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgKm1lbTsKKwlyZXNvdXJjZV9zaXplX3QgdGFyZ2V0OworCWludCByZXQ7CisKKwlmb3IgKG1lbSA9IHN5c3RlbV9yYW07IG1lbTsgbWVtID0gbWVtLT5zaWJsaW5nKSB7CisJCXRhcmdldCA9IGZpbmRfZnJlZV9yZWdpb24obWVtLCBzaXplLCBhbGlnbik7CisJCWlmICh0YXJnZXQgPD0gbWVtLT5lbmQpIHsKKwkJCXJldCA9IGFkZF9yZXNlcnZlZF9yZWdpb24odGFyZ2V0LCB0YXJnZXQgKyBzaXplIC0gMSwKKwkJCQkJCSAgbmFtZSk7CisJCQlpZiAoIXJldCkKKwkJCQkqc3RhcnQgPSB0YXJnZXQ7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJcmV0dXJuIC1FTk9NRU07Cit9CiAKIC8qCiAgKiBFYXJseSBmcmFtZWJ1ZmZlciBhbGxvY2F0aW9uLiBXb3JrcyBhcyBmb2xsb3dzOgogICogICAtIElmIGZibWVtX3NpemUgaXMgemVybywgbm90aGluZyB3aWxsIGJlIGFsbG9jYXRlZCBvciByZXNlcnZlZC4KICAqICAgLSBJZiBmYm1lbV9zdGFydCBpcyB6ZXJvIHdoZW4gc2V0dXBfYm9vdG1lbSgpIGlzIGNhbGxlZCwKLSAqICAgICBmYm1lbV9zaXplIGJ5dGVzIHdpbGwgYmUgYWxsb2NhdGVkIGZyb20gdGhlIGJvb3RtZW0gYWxsb2NhdG9yLgorICogICAgIGEgYmxvY2sgb2YgZmJtZW1fc2l6ZSBieXRlcyB3aWxsIGJlIHJlc2VydmVkIGJlZm9yZSBib290bWVtCisgKiAgICAgaW5pdGlhbGl6YXRpb24uIEl0IHdpbGwgYmUgYWxpZ25lZCB0byB0aGUgbGFyZ2VzdCBwYWdlIHNpemUKKyAqICAgICB0aGF0IGZibWVtX3NpemUgaXMgYSBtdWx0aXBsZSBvZi4KICAqICAgLSBJZiBmYm1lbV9zdGFydCBpcyBub256ZXJvLCBhbiBhcmVhIG9mIHNpemUgZmJtZW1fc2l6ZSB3aWxsIGJlCi0gKiAgICAgcmVzZXJ2ZWQgYXQgdGhlIHBoeXNpY2FsIGFkZHJlc3MgZmJtZW1fc3RhcnQgaWYgbmVjZXNzYXJ5LiBJZgotICogICAgIHRoZSBhcmVhIGlzbid0IGluIGEgbWVtb3J5IHJlZ2lvbiBrbm93biB0byB0aGUga2VybmVsLCBpdCB3aWxsCi0gKiAgICAgYmUgbGVmdCBhbG9uZS4KKyAqICAgICByZXNlcnZlZCBhdCB0aGUgcGh5c2ljYWwgYWRkcmVzcyBmYm1lbV9zdGFydCBpZiBwb3NzaWJsZS4gSWYKKyAqICAgICBpdCBjb2xsaWRlcyB3aXRoIG90aGVyIHJlc2VydmVkIG1lbW9yeSwgYSBkaWZmZXJlbnQgYmxvY2sgb2YKKyAqICAgICBzYW1lIHNpemUgd2lsbCBiZSBhbGxvY2F0ZWQsIGp1c3QgYXMgaWYgZmJtZW1fc3RhcnQgd2FzIHplcm8uCiAgKgogICogQm9hcmQtc3BlY2lmaWMgY29kZSBtYXkgdXNlIHRoZXNlIHZhcmlhYmxlcyB0byBzZXQgdXAgcGxhdGZvcm0gZGF0YQogICogZm9yIHRoZSBmcmFtZWJ1ZmZlciBkcml2ZXIgaWYgZmJtZW1fc2l6ZSBpcyBub256ZXJvLgogICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBfX2luaXRkYXRhIGZibWVtX3N0YXJ0Owotc3RhdGljIHVuc2lnbmVkIGxvbmcgX19pbml0ZGF0YSBmYm1lbV9zaXplOworcmVzb3VyY2Vfc2l6ZV90IF9faW5pdGRhdGEgZmJtZW1fc3RhcnQ7CityZXNvdXJjZV9zaXplX3QgX19pbml0ZGF0YSBmYm1lbV9zaXplOwogCiAvKgogICogImZibWVtPXh4eFtrS21NXSIgYWxsb2NhdGVzIHRoZSBzcGVjaWZpZWQgYW1vdW50IG9mIGJvb3QgbWVtb3J5IGZvcgpAQCAtMTAzLDQ5ICsyNDMsNDMgQEAKICAqLwogc3RhdGljIGludCBfX2luaXQgZWFybHlfcGFyc2VfZmJtZW0oY2hhciAqcCkKIHsKKwlpbnQgcmV0OworCXVuc2lnbmVkIGxvbmcgYWxpZ247CisKIAlmYm1lbV9zaXplID0gbWVtcGFyc2UocCwgJnApOwotCWlmICgqcCA9PSAnQCcpCisJaWYgKCpwID09ICdAJykgewogCQlmYm1lbV9zdGFydCA9IG1lbXBhcnNlKHAsICZwKTsKKwkJcmV0ID0gYWRkX3Jlc2VydmVkX3JlZ2lvbihmYm1lbV9zdGFydCwKKwkJCQkJICBmYm1lbV9zdGFydCArIGZibWVtX3NpemUgLSAxLAorCQkJCQkgICJGcmFtZWJ1ZmZlciIpOworCQlpZiAocmV0KSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgIkZhaWxlZCB0byByZXNlcnZlIGZyYW1lYnVmZmVyIG1lbW9yeVxuIik7CisJCQlmYm1lbV9zdGFydCA9IDA7CisJCX0KKwl9CisKKwlpZiAoIWZibWVtX3N0YXJ0KSB7CisJCWlmICgoZmJtZW1fc2l6ZSAmIDB4MDAwZmZmZmZVTCkgPT0gMCkKKwkJCWFsaWduID0gMHgxMDAwMDA7CS8qIDEgTWlCICovCisJCWVsc2UgaWYgKChmYm1lbV9zaXplICYgMHgwMDAwZmZmZlVMKSA9PSAwKQorCQkJYWxpZ24gPSAweDEwMDAwOwkvKiA2NCBLaUIgKi8KKwkJZWxzZQorCQkJYWxpZ24gPSAweDEwMDA7CQkvKiA0IEtpQiAqLworCisJCXJldCA9IGFsbG9jX3Jlc2VydmVkX3JlZ2lvbigmZmJtZW1fc3RhcnQsIGZibWVtX3NpemUsCisJCQkJCSAgICBhbGlnbiwgIkZyYW1lYnVmZmVyIik7CisJCWlmIChyZXQpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSAgICAgICAiRmFpbGVkIHRvIGFsbG9jYXRlIGZyYW1lYnVmZmVyIG1lbW9yeVxuIik7CisJCQlmYm1lbV9zaXplID0gMDsKKwkJfQorCX0KKwogCXJldHVybiAwOwogfQogZWFybHlfcGFyYW0oImZibWVtIiwgZWFybHlfcGFyc2VfZmJtZW0pOwogCi1zdGF0aWMgaW5saW5lIHZvaWQgX19pbml0IHJlc291cmNlX2luaXQodm9pZCkKLXsKLQlzdHJ1Y3QgdGFnX21lbV9yYW5nZSAqcmVnaW9uOwotCi0Ja2VybmVsX2NvZGUuc3RhcnQgPSBfX3BhKGluaXRfbW0uc3RhcnRfY29kZSk7Ci0Ja2VybmVsX2NvZGUuZW5kID0gX19wYShpbml0X21tLmVuZF9jb2RlIC0gMSk7Ci0Ja2VybmVsX2RhdGEuc3RhcnQgPSBfX3BhKGluaXRfbW0uZW5kX2NvZGUpOwotCWtlcm5lbF9kYXRhLmVuZCA9IF9fcGEoaW5pdF9tbS5icmsgLSAxKTsKLQotCWZvciAocmVnaW9uID0gbWVtX3BoeXM7IHJlZ2lvbjsgcmVnaW9uID0gcmVnaW9uLT5uZXh0KSB7Ci0JCXN0cnVjdCByZXNvdXJjZSAqcmVzOwotCQl1bnNpZ25lZCBsb25nIHBoeXNfc3RhcnQsIHBoeXNfZW5kOwotCi0JCWlmIChyZWdpb24tPnNpemUgPT0gMCkKLQkJCWNvbnRpbnVlOwotCi0JCXBoeXNfc3RhcnQgPSByZWdpb24tPmFkZHI7Ci0JCXBoeXNfZW5kID0gcGh5c19zdGFydCArIHJlZ2lvbi0+c2l6ZSAtIDE7Ci0KLQkJcmVzID0gYWxsb2NfYm9vdG1lbV9sb3coc2l6ZW9mKCpyZXMpKTsKLQkJcmVzLT5uYW1lID0gIlN5c3RlbSBSQU0iOwotCQlyZXMtPnN0YXJ0ID0gcGh5c19zdGFydDsKLQkJcmVzLT5lbmQgPSBwaHlzX2VuZDsKLQkJcmVzLT5mbGFncyA9IElPUkVTT1VSQ0VfTUVNIHwgSU9SRVNPVVJDRV9CVVNZOwotCi0JCXJlcXVlc3RfcmVzb3VyY2UgKCZpb21lbV9yZXNvdXJjZSwgcmVzKTsKLQotCQlpZiAoa2VybmVsX2NvZGUuc3RhcnQgPj0gcmVzLT5zdGFydCAmJgotCQkgICAga2VybmVsX2NvZGUuZW5kIDw9IHJlcy0+ZW5kKQotCQkJcmVxdWVzdF9yZXNvdXJjZSAocmVzLCAma2VybmVsX2NvZGUpOwotCQlpZiAoa2VybmVsX2RhdGEuc3RhcnQgPj0gcmVzLT5zdGFydCAmJgotCQkgICAga2VybmVsX2RhdGEuZW5kIDw9IHJlcy0+ZW5kKQotCQkJcmVxdWVzdF9yZXNvdXJjZSAocmVzLCAma2VybmVsX2RhdGEpOwotCX0KLX0KLQogc3RhdGljIGludCBfX2luaXQgcGFyc2VfdGFnX2NvcmUoc3RydWN0IHRhZyAqdGFnKQogewogCWlmICh0YWctPmhkci5zaXplID4gMikgewpAQCAtMTU3LDExICsyOTEsOSBAQAogfQogX190YWd0YWJsZShBVEFHX0NPUkUsIHBhcnNlX3RhZ19jb3JlKTsKIAotc3RhdGljIGludCBfX2luaXQgcGFyc2VfdGFnX21lbV9yYW5nZShzdHJ1Y3QgdGFnICp0YWcsCi0JCQkJICAgICAgc3RydWN0IHRhZ19tZW1fcmFuZ2UgKipyb290KQorc3RhdGljIGludCBfX2luaXQgcGFyc2VfdGFnX21lbShzdHJ1Y3QgdGFnICp0YWcpCiB7Ci0Jc3RydWN0IHRhZ19tZW1fcmFuZ2UgKmN1ciwgKipwcHJldjsKLQlzdHJ1Y3QgdGFnX21lbV9yYW5nZSAqbmV3OworCXVuc2lnbmVkIGxvbmcgc3RhcnQsIGVuZDsKIAogCS8qCiAJICogSWdub3JlIHplcm8tc2l6ZWQgZW50cmllcy4gSWYgd2UncmUgcnVubmluZyBzdGFuZGFsb25lLCB0aGUKQEAgLTE3MSwzNCArMzAzLDUzIEBACiAJaWYgKHRhZy0+dS5tZW1fcmFuZ2Uuc2l6ZSA9PSAwKQogCQlyZXR1cm4gMDsKIAotCS8qCi0JICogQ29weSB0aGUgZGF0YSBzbyB0aGUgYm9vdG1lbSBpbml0IGNvZGUgZG9lc24ndCBuZWVkIHRvIGNhcmUKLQkgKiBhYm91dCBpdC4KLQkgKi8KLQlpZiAobWVtX3JhbmdlX25leHRfZnJlZSA+PSBBUlJBWV9TSVpFKG1lbV9yYW5nZV9jYWNoZSkpCi0JCXBhbmljKCJQaHlzaWNhbCBtZW1vcnkgbWFwIHRvbyBjb21wbGV4IVxuIik7CisJc3RhcnQgPSB0YWctPnUubWVtX3JhbmdlLmFkZHI7CisJZW5kID0gdGFnLT51Lm1lbV9yYW5nZS5hZGRyICsgdGFnLT51Lm1lbV9yYW5nZS5zaXplIC0gMTsKIAotCW5ldyA9ICZtZW1fcmFuZ2VfY2FjaGVbbWVtX3JhbmdlX25leHRfZnJlZSsrXTsKLQkqbmV3ID0gdGFnLT51Lm1lbV9yYW5nZTsKKwlhZGRfcGh5c2ljYWxfbWVtb3J5KHN0YXJ0LCBlbmQpOworCXJldHVybiAwOworfQorX190YWd0YWJsZShBVEFHX01FTSwgcGFyc2VfdGFnX21lbSk7CiAKLQlwcHJldiA9IHJvb3Q7Ci0JY3VyID0gKnJvb3Q7Ci0Jd2hpbGUgKGN1cikgewotCQlwcHJldiA9ICZjdXItPm5leHQ7Ci0JCWN1ciA9IGN1ci0+bmV4dDsKK3N0YXRpYyBpbnQgX19pbml0IHBhcnNlX3RhZ19yZGltZyhzdHJ1Y3QgdGFnICp0YWcpCit7CisjaWZkZWYgQ09ORklHX0lOSVRSRAorCXN0cnVjdCB0YWdfbWVtX3JhbmdlICptZW0gPSAmdGFnLT51Lm1lbV9yYW5nZTsKKwlpbnQgcmV0OworCisJaWYgKGluaXRyZF9zdGFydCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiV2FybmluZzogT25seSB0aGUgZmlyc3QgaW5pdHJkIGltYWdlIHdpbGwgYmUgdXNlZFxuIik7CisJCXJldHVybiAwOwogCX0KIAotCSpwcHJldiA9IG5ldzsKLQluZXctPm5leHQgPSBOVUxMOworCXJldCA9IGFkZF9yZXNlcnZlZF9yZWdpb24obWVtLT5zdGFydCwgbWVtLT5zdGFydCArIG1lbS0+c2l6ZSAtIDEsCisJCQkJICAiaW5pdHJkIik7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiV2FybmluZzogRmFpbGVkIHRvIHJlc2VydmUgaW5pdHJkIG1lbW9yeVxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJaW5pdHJkX3N0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpX192YShtZW0tPmFkZHIpOworCWluaXRyZF9lbmQgPSBpbml0cmRfc3RhcnQgKyBtZW0tPnNpemU7CisjZWxzZQorCXByaW50ayhLRVJOX1dBUk5JTkcgIlJBTSBkaXNrIGltYWdlIHByZXNlbnQsIGJ1dCAiCisJICAgICAgICJubyBpbml0cmQgc3VwcG9ydCBpbiBrZXJuZWwsIGlnbm9yaW5nXG4iKTsKKyNlbmRpZgogCiAJcmV0dXJuIDA7CiB9CitfX3RhZ3RhYmxlKEFUQUdfUkRJTUcsIHBhcnNlX3RhZ19yZGltZyk7CiAKLXN0YXRpYyBpbnQgX19pbml0IHBhcnNlX3RhZ19tZW0oc3RydWN0IHRhZyAqdGFnKQorc3RhdGljIGludCBfX2luaXQgcGFyc2VfdGFnX3JzdmRfbWVtKHN0cnVjdCB0YWcgKnRhZykKIHsKLQlyZXR1cm4gcGFyc2VfdGFnX21lbV9yYW5nZSh0YWcsICZtZW1fcGh5cyk7CisJc3RydWN0IHRhZ19tZW1fcmFuZ2UgKm1lbSA9ICZ0YWctPnUubWVtX3JhbmdlOworCisJcmV0dXJuIGFkZF9yZXNlcnZlZF9yZWdpb24obWVtLT5hZGRyLCBtZW0tPmFkZHIgKyBtZW0tPnNpemUgLSAxLAorCQkJCSAgICJSZXNlcnZlZCIpOwogfQotX190YWd0YWJsZShBVEFHX01FTSwgcGFyc2VfdGFnX21lbSk7CitfX3RhZ3RhYmxlKEFUQUdfUlNWRF9NRU0sIHBhcnNlX3RhZ19yc3ZkX21lbSk7CiAKIHN0YXRpYyBpbnQgX19pbml0IHBhcnNlX3RhZ19jbWRsaW5lKHN0cnVjdCB0YWcgKnRhZykKIHsKQEAgLTIwNywxMiArMzU4LDYgQEAKIH0KIF9fdGFndGFibGUoQVRBR19DTURMSU5FLCBwYXJzZV90YWdfY21kbGluZSk7CiAKLXN0YXRpYyBpbnQgX19pbml0IHBhcnNlX3RhZ19yZGltZyhzdHJ1Y3QgdGFnICp0YWcpCi17Ci0JcmV0dXJuIHBhcnNlX3RhZ19tZW1fcmFuZ2UodGFnLCAmbWVtX3JhbWRpc2spOwotfQotX190YWd0YWJsZShBVEFHX1JESU1HLCBwYXJzZV90YWdfcmRpbWcpOwotCiBzdGF0aWMgaW50IF9faW5pdCBwYXJzZV90YWdfY2xvY2soc3RydWN0IHRhZyAqdGFnKQogewogCS8qCkBAIC0yMjMsMTIgKzM2OCw2IEBACiB9CiBfX3RhZ3RhYmxlKEFUQUdfQ0xPQ0ssIHBhcnNlX3RhZ19jbG9jayk7CiAKLXN0YXRpYyBpbnQgX19pbml0IHBhcnNlX3RhZ19yc3ZkX21lbShzdHJ1Y3QgdGFnICp0YWcpCi17Ci0JcmV0dXJuIHBhcnNlX3RhZ19tZW1fcmFuZ2UodGFnLCAmbWVtX3Jlc2VydmVkKTsKLX0KLV9fdGFndGFibGUoQVRBR19SU1ZEX01FTSwgcGFyc2VfdGFnX3JzdmRfbWVtKTsKLQogLyoKICAqIFNjYW4gdGhlIHRhZyB0YWJsZSBmb3IgdGhpcyB0YWcsIGFuZCBjYWxsIGl0cyBwYXJzZSBmdW5jdGlvbi4gVGhlCiAgKiB0YWcgdGFibGUgaXMgYnVpbHQgYnkgdGhlIGxpbmtlciBmcm9tIGFsbCB0aGUgX190YWd0YWJsZQpAQCAtMjYwLDEwICszOTksMTM3IEBACiAJCQkgICAgICAgdC0+aGRyLnRhZyk7CiB9CiAKKy8qCisgKiBGaW5kIGEgZnJlZSBtZW1vcnkgcmVnaW9uIGxhcmdlIGVub3VnaCBmb3Igc3RvcmluZyB0aGUKKyAqIGJvb3RtZW0gYml0bWFwLgorICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBfX2luaXQKK2ZpbmRfYm9vdG1hcF9wZm4oY29uc3Qgc3RydWN0IHJlc291cmNlICptZW0pCit7CisJdW5zaWduZWQgbG9uZyBib290bWFwX3BhZ2VzLCBib290bWFwX2xlbjsKKwl1bnNpZ25lZCBsb25nIG5vZGVfcGFnZXMgPSBQRk5fVVAobWVtLT5lbmQgLSBtZW0tPnN0YXJ0ICsgMSk7CisJdW5zaWduZWQgbG9uZyBib290bWFwX3N0YXJ0OworCisJYm9vdG1hcF9wYWdlcyA9IGJvb3RtZW1fYm9vdG1hcF9wYWdlcyhub2RlX3BhZ2VzKTsKKwlib290bWFwX2xlbiA9IGJvb3RtYXBfcGFnZXMgPDwgUEFHRV9TSElGVDsKKworCS8qCisJICogRmluZCBhIGxhcmdlIGVub3VnaCByZWdpb24gd2l0aG91dCByZXNlcnZlZCBwYWdlcyBmb3IKKwkgKiBzdG9yaW5nIHRoZSBib290bWVtIGJpdG1hcC4gV2UgY2FuIHRha2UgYWR2YW50YWdlIG9mIHRoZQorCSAqIGZhY3QgdGhhdCBhbGwgbGlzdHMgaGF2ZSBiZWVuIHNvcnRlZC4KKwkgKgorCSAqIFdlIGhhdmUgdG8gY2hlY2sgdGhhdCB3ZSBkb24ndCBjb2xsaWRlIHdpdGggYW55IHJlc2VydmVkCisJICogcmVnaW9ucywgd2hpY2ggaW5jbHVkZXMgdGhlIGtlcm5lbCBpbWFnZSBhbmQgYW55IFJBTURJU0sKKwkgKiBpbWFnZXMuCisJICovCisJYm9vdG1hcF9zdGFydCA9IGZpbmRfZnJlZV9yZWdpb24obWVtLCBib290bWFwX2xlbiwgUEFHRV9TSVpFKTsKKworCXJldHVybiBib290bWFwX3N0YXJ0ID4+IFBBR0VfU0hJRlQ7Cit9CisKKyNkZWZpbmUgTUFYX0xPV01FTQlISUdITUVNX1NUQVJUCisjZGVmaW5lIE1BWF9MT1dNRU1fUEZOCVBGTl9ET1dOKE1BWF9MT1dNRU0pCisKK3N0YXRpYyB2b2lkIF9faW5pdCBzZXR1cF9ib290bWVtKHZvaWQpCit7CisJdW5zaWduZWQgYm9vdG1hcF9zaXplOworCXVuc2lnbmVkIGxvbmcgZmlyc3RfcGZuLCBib290bWFwX3BmbiwgcGFnZXM7CisJdW5zaWduZWQgbG9uZyBtYXhfcGZuLCBtYXhfbG93X3BmbjsKKwl1bnNpZ25lZCBub2RlID0gMDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKworCXByaW50ayhLRVJOX0lORk8gIlBoeXNpY2FsIG1lbW9yeTpcbiIpOworCWZvciAocmVzID0gc3lzdGVtX3JhbTsgcmVzOyByZXMgPSByZXMtPnNpYmxpbmcpCisJCXByaW50aygiICAlMDh4LSUwOHhcbiIsIHJlcy0+c3RhcnQsIHJlcy0+ZW5kKTsKKwlwcmludGsoS0VSTl9JTkZPICJSZXNlcnZlZCBtZW1vcnk6XG4iKTsKKwlmb3IgKHJlcyA9IHJlc2VydmVkOyByZXM7IHJlcyA9IHJlcy0+c2libGluZykKKwkJcHJpbnRrKCIgICUwOHgtJTA4eDogJXNcbiIsCisJCSAgICAgICByZXMtPnN0YXJ0LCByZXMtPmVuZCwgcmVzLT5uYW1lKTsKKworCW5vZGVzX2NsZWFyKG5vZGVfb25saW5lX21hcCk7CisKKwlpZiAoc3lzdGVtX3JhbS0+c2libGluZykKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiT25seSB1c2luZyBmaXJzdCBtZW1vcnkgYmFua1xuIik7CisKKwlmb3IgKHJlcyA9IHN5c3RlbV9yYW07IHJlczsgcmVzID0gTlVMTCkgeworCQlmaXJzdF9wZm4gPSBQRk5fVVAocmVzLT5zdGFydCk7CisJCW1heF9sb3dfcGZuID0gbWF4X3BmbiA9IFBGTl9ET1dOKHJlcy0+ZW5kICsgMSk7CisJCWJvb3RtYXBfcGZuID0gZmluZF9ib290bWFwX3BmbihyZXMpOworCQlpZiAoYm9vdG1hcF9wZm4gPiBtYXhfcGZuKQorCQkJcGFuaWMoIk5vIHNwYWNlIGZvciBib290bWVtIGJpdG1hcCFcbiIpOworCisJCWlmIChtYXhfbG93X3BmbiA+IE1BWF9MT1dNRU1fUEZOKSB7CisJCQltYXhfbG93X3BmbiA9IE1BWF9MT1dNRU1fUEZOOworI2lmbmRlZiBDT05GSUdfSElHSE1FTQorCQkJLyoKKwkJCSAqIExvd21lbSBpcyBtZW1vcnkgdGhhdCBjYW4gYmUgYWRkcmVzc2VkCisJCQkgKiBkaXJlY3RseSB0aHJvdWdoIFAxL1AyCisJCQkgKi8KKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSAgICAgICAiTm9kZSAldTogT25seSAlbGQgTWlCIG9mIG1lbW9yeSB3aWxsIGJlIHVzZWQuXG4iLAorCQkJICAgICAgIG5vZGUsIE1BWF9MT1dNRU0gPj4gMjApOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiVXNlIGEgSElHSE1FTSBlbmFibGVkIGtlcm5lbC5cbiIpOworI2Vsc2UKKyNlcnJvciBISUdITUVNIGlzIG5vdCBzdXBwb3J0ZWQgYnkgQVZSMzIgeWV0CisjZW5kaWYKKwkJfQorCisJCS8qIEluaXRpYWxpemUgdGhlIGJvb3QtdGltZSBhbGxvY2F0b3Igd2l0aCBsb3cgbWVtb3J5IG9ubHkuICovCisJCWJvb3RtYXBfc2l6ZSA9IGluaXRfYm9vdG1lbV9ub2RlKE5PREVfREFUQShub2RlKSwgYm9vdG1hcF9wZm4sCisJCQkJCQkgZmlyc3RfcGZuLCBtYXhfbG93X3Bmbik7CisKKwkJLyoKKwkJICogUmVnaXN0ZXIgZnVsbHkgYXZhaWxhYmxlIFJBTSBwYWdlcyB3aXRoIHRoZSBib290bWVtCisJCSAqIGFsbG9jYXRvci4KKwkJICovCisJCXBhZ2VzID0gbWF4X2xvd19wZm4gLSBmaXJzdF9wZm47CisJCWZyZWVfYm9vdG1lbV9ub2RlIChOT0RFX0RBVEEobm9kZSksIFBGTl9QSFlTKGZpcnN0X3BmbiksCisJCQkJICAgUEZOX1BIWVMocGFnZXMpKTsKKworCQkvKiBSZXNlcnZlIHNwYWNlIGZvciB0aGUgYm9vdG1lbSBiaXRtYXAuLi4gKi8KKwkJcmVzZXJ2ZV9ib290bWVtX25vZGUoTk9ERV9EQVRBKG5vZGUpLAorCQkJCSAgICAgUEZOX1BIWVMoYm9vdG1hcF9wZm4pLAorCQkJCSAgICAgYm9vdG1hcF9zaXplKTsKKworCQkvKiAuLi5hbmQgYW55IG90aGVyIHJlc2VydmVkIHJlZ2lvbnMuICovCisJCWZvciAocmVzID0gcmVzZXJ2ZWQ7IHJlczsgcmVzID0gcmVzLT5zaWJsaW5nKSB7CisJCQlpZiAocmVzLT5zdGFydCA+IFBGTl9QSFlTKG1heF9wZm4pKQorCQkJCWJyZWFrOworCisJCQkvKgorCQkJICogcmVzb3VyY2VfaW5pdCB3aWxsIGNvbXBsYWluIGFib3V0IHBhcnRpYWwKKwkJCSAqIG92ZXJsYXBzLCBzbyB3ZSdsbCBqdXN0IGlnbm9yZSBzdWNoCisJCQkgKiByZXNvdXJjZXMgZm9yIG5vdy4KKwkJCSAqLworCQkJaWYgKHJlcy0+c3RhcnQgPj0gUEZOX1BIWVMoZmlyc3RfcGZuKQorCQkJICAgICYmIHJlcy0+ZW5kIDwgUEZOX1BIWVMobWF4X3BmbikpCisJCQkJcmVzZXJ2ZV9ib290bWVtX25vZGUoCisJCQkJCU5PREVfREFUQShub2RlKSwgcmVzLT5zdGFydCwKKwkJCQkJcmVzLT5lbmQgLSByZXMtPnN0YXJ0ICsgMSk7CisJCX0KKworCQlub2RlX3NldF9vbmxpbmUobm9kZSk7CisJfQorfQorCiB2b2lkIF9faW5pdCBzZXR1cF9hcmNoIChjaGFyICoqY21kbGluZV9wKQogewogCXN0cnVjdCBjbGsgKmNwdV9jbGs7CiAKKwlpbml0X21tLnN0YXJ0X2NvZGUgPSAodW5zaWduZWQgbG9uZylfdGV4dDsKKwlpbml0X21tLmVuZF9jb2RlID0gKHVuc2lnbmVkIGxvbmcpX2V0ZXh0OworCWluaXRfbW0uZW5kX2RhdGEgPSAodW5zaWduZWQgbG9uZylfZWRhdGE7CisJaW5pdF9tbS5icmsgPSAodW5zaWduZWQgbG9uZylfZW5kOworCisJLyoKKwkgKiBJbmNsdWRlIC5pbml0IHNlY3Rpb24gdG8gbWFrZSBhbGxvY2F0aW9ucyBlYXNpZXIuIEl0IHdpbGwKKwkgKiBiZSByZW1vdmVkIGJlZm9yZSB0aGUgcmVzb3VyY2UgaXMgYWN0dWFsbHkgcmVxdWVzdGVkLgorCSAqLworCWtlcm5lbF9jb2RlLnN0YXJ0ID0gX19wYShfX2luaXRfYmVnaW4pOworCWtlcm5lbF9jb2RlLmVuZCA9IF9fcGEoaW5pdF9tbS5lbmRfY29kZSAtIDEpOworCWtlcm5lbF9kYXRhLnN0YXJ0ID0gX19wYShpbml0X21tLmVuZF9jb2RlKTsKKwlrZXJuZWxfZGF0YS5lbmQgPSBfX3BhKGluaXRfbW0uYnJrIC0gMSk7CisKIAlwYXJzZV90YWdzKGJvb3Rsb2FkZXJfdGFncyk7CiAKIAlzZXR1cF9wcm9jZXNzb3IoKTsKQEAgLTI4OSwyNCArNTU1LDE2IEBACiAJCSAgICAgICAoKGNwdV9oeiArIDUwMCkgLyAxMDAwKSAlIDEwMDApOwogCX0KIAotCWluaXRfbW0uc3RhcnRfY29kZSA9ICh1bnNpZ25lZCBsb25nKSAmX3RleHQ7Ci0JaW5pdF9tbS5lbmRfY29kZSA9ICh1bnNpZ25lZCBsb25nKSAmX2V0ZXh0OwotCWluaXRfbW0uZW5kX2RhdGEgPSAodW5zaWduZWQgbG9uZykgJl9lZGF0YTsKLQlpbml0X21tLmJyayA9ICh1bnNpZ25lZCBsb25nKSAmX2VuZDsKLQogCXN0cmxjcHkoY29tbWFuZF9saW5lLCBib290X2NvbW1hbmRfbGluZSwgQ09NTUFORF9MSU5FX1NJWkUpOwogCSpjbWRsaW5lX3AgPSBjb21tYW5kX2xpbmU7CiAJcGFyc2VfZWFybHlfcGFyYW0oKTsKIAogCXNldHVwX2Jvb3RtZW0oKTsKIAotCWJvYXJkX3NldHVwX2ZibWVtKGZibWVtX3N0YXJ0LCBmYm1lbV9zaXplKTsKLQogI2lmZGVmIENPTkZJR19WVAogCWNvbnN3aXRjaHAgPSAmZHVtbXlfY29uOwogI2VuZGlmCiAKIAlwYWdpbmdfaW5pdCgpOwotCiAJcmVzb3VyY2VfaW5pdCgpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9rZXJuZWwvdGltZS5jIGIvYXJjaC9hdnIzMi9rZXJuZWwvdGltZS5jCmluZGV4IGMxMDgzM2YuLjcwMTRhMzUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIva2VybmVsL3RpbWUuYworKysgYi9hcmNoL2F2cjMyL2tlcm5lbC90aW1lLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDYgQXRtZWwgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA3IEF0bWVsIENvcnBvcmF0aW9uCiAgKgogICogQmFzZWQgb24gTUlQUyBpbXBsZW1lbnRhdGlvbiBhcmNoL21pcHMva2VybmVsL3RpbWUuYwogICogICBDb3B5cmlnaHQgMjAwMSBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KQEAgLTIwLDE4ICsyMCwyNSBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAKICNpbmNsdWRlIDxhc20vZGl2NjQuaD4KICNpbmNsdWRlIDxhc20vc3lzcmVnLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+CiAKLXN0YXRpYyBjeWNsZV90IHJlYWRfY3ljbGVfY291bnQodm9pZCkKKy8qIGhvdyBtYW55IGNvdW50ZXIgY3ljbGVzIGluIGEgamlmZnk/ICovCitzdGF0aWMgdTMyIGN5Y2xlc19wZXJfamlmZnk7CisKKy8qIHRoZSBjb3VudCB2YWx1ZSBmb3IgdGhlIG5leHQgdGltZXIgaW50ZXJydXB0ICovCitzdGF0aWMgdTMyIGV4cGlyZWxvOworCitjeWNsZV90IF9fd2VhayByZWFkX2N5Y2xlX2NvdW50KHZvaWQpCiB7CiAJcmV0dXJuIChjeWNsZV90KXN5c3JlZ19yZWFkKENPVU5UKTsKIH0KIAotc3RhdGljIHN0cnVjdCBjbG9ja3NvdXJjZSBjbG9ja3NvdXJjZV9hdnIzMiA9IHsKK3N0cnVjdCBjbG9ja3NvdXJjZSBfX3dlYWsgY2xvY2tzb3VyY2VfYXZyMzIgPSB7CiAJLm5hbWUJCT0gImF2cjMyIiwKIAkucmF0aW5nCQk9IDM1MCwKIAkucmVhZAkJPSByZWFkX2N5Y2xlX2NvdW50LApAQCAtNDAsMTIgKzQ3LDIwIEBACiAJLmZsYWdzCQk9IENMT0NLX1NPVVJDRV9JU19DT05USU5VT1VTLAogfTsKIAoraXJxcmV0dXJuX3QgX193ZWFrIHRpbWVyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpOworCitzdHJ1Y3QgaXJxYWN0aW9uIHRpbWVyX2lycWFjdGlvbiA9IHsKKwkuaGFuZGxlcgk9IHRpbWVyX2ludGVycnVwdCwKKwkuZmxhZ3MJCT0gSVJRRl9ESVNBQkxFRCwKKwkubmFtZQkJPSAidGltZXIiLAorfTsKKwogLyoKICAqIEJ5IGRlZmF1bHQgd2UgcHJvdmlkZSB0aGUgbnVsbCBSVEMgb3BzCiAgKi8KIHN0YXRpYyB1bnNpZ25lZCBsb25nIG51bGxfcnRjX2dldF90aW1lKHZvaWQpCiB7Ci0JcmV0dXJuIG1rdGltZSgyMDA0LCAxLCAxLCAwLCAwLCAwKTsKKwlyZXR1cm4gbWt0aW1lKDIwMDcsIDEsIDEsIDAsIDAsIDApOwogfQogCiBzdGF0aWMgaW50IG51bGxfcnRjX3NldF90aW1lKHVuc2lnbmVkIGxvbmcgc2VjKQpAQCAtNTYsMjMgKzcxLDE0IEBACiBzdGF0aWMgdW5zaWduZWQgbG9uZyAoKnJ0Y19nZXRfdGltZSkodm9pZCkgPSBudWxsX3J0Y19nZXRfdGltZTsKIHN0YXRpYyBpbnQgKCpydGNfc2V0X3RpbWUpKHVuc2lnbmVkIGxvbmcpID0gbnVsbF9ydGNfc2V0X3RpbWU7CiAKLS8qIGhvdyBtYW55IGNvdW50ZXIgY3ljbGVzIGluIGEgamlmZnk/ICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBjeWNsZXNfcGVyX2ppZmZ5OwotCi0vKiBjeWNsZSBjb3VudGVyIHZhbHVlIGF0IHRoZSBwcmV2aW91cyB0aW1lciBpbnRlcnJ1cHQgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgdGltZXJoaSwgdGltZXJsbzsKLQotLyogdGhlIGNvdW50IHZhbHVlIGZvciB0aGUgbmV4dCB0aW1lciBpbnRlcnJ1cHQgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgZXhwaXJlbG87Ci0KIHN0YXRpYyB2b2lkIGF2cjMyX3RpbWVyX2Fjayh2b2lkKQogewotCXVuc2lnbmVkIGludCBjb3VudDsKKwl1MzIgY291bnQ7CiAKIAkvKiBBY2sgdGhpcyB0aW1lciBpbnRlcnJ1cHQgYW5kIHNldCB0aGUgbmV4dCBvbmUgKi8KIAlleHBpcmVsbyArPSBjeWNsZXNfcGVyX2ppZmZ5OworCS8qIHNldHRpbmcgQ09NUEFSRSB0byAwIHN0b3BzIHRoZSBDT1VOVC1DT01QQVJFICovCiAJaWYgKGV4cGlyZWxvID09IDApIHsKLQkJcHJpbnRrKEtFUk5fREVCVUcgImV4cGlyZWxvID09IDBcbiIpOwogCQlzeXNyZWdfd3JpdGUoQ09NUEFSRSwgZXhwaXJlbG8gKyAxKTsKIAl9IGVsc2UgewogCQlzeXNyZWdfd3JpdGUoQ09NUEFSRSwgZXhwaXJlbG8pOwpAQCAtODYsMjcgKzkyLDU2IEBACiAJfQogfQogCi1zdGF0aWMgdW5zaWduZWQgaW50IGF2cjMyX2hwdF9yZWFkKHZvaWQpCitpbnQgX193ZWFrIGF2cjMyX2hwdF9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIHN5c3JlZ19yZWFkKENPVU5UKTsKKwlpbnQgcmV0OworCXVuc2lnbmVkIGxvbmcgbXVsdCwgc2hpZnQsIGNvdW50X2h6OworCisJY291bnRfaHogPSBjbGtfZ2V0X3JhdGUoYm9vdF9jcHVfZGF0YS5jbGspOworCXNoaWZ0ID0gY2xvY2tzb3VyY2VfYXZyMzIuc2hpZnQ7CisJbXVsdCA9IGNsb2Nrc291cmNlX2h6Mm11bHQoY291bnRfaHosIHNoaWZ0KTsKKwljbG9ja3NvdXJjZV9hdnIzMi5tdWx0ID0gbXVsdDsKKworCXsKKwkJdTY0IHRtcDsKKworCQl0bXAgPSBUSUNLX05TRUM7CisJCXRtcCA8PD0gc2hpZnQ7CisJCXRtcCArPSBtdWx0IC8gMjsKKwkJZG9fZGl2KHRtcCwgbXVsdCk7CisKKwkJY3ljbGVzX3Blcl9qaWZmeSA9IHRtcDsKKwl9CisKKwlyZXQgPSBzZXR1cF9pcnEoMCwgJnRpbWVyX2lycWFjdGlvbik7CisJaWYgKHJldCkgeworCQlwcl9kZWJ1ZygidGltZXI6IGNvdWxkIG5vdCByZXF1ZXN0IElSUSAwOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAidGltZXI6IEFUMzJBUCBDT1VOVC1DT01QQVJFIGF0IGlycSAwLCAiCisJCQkiJWx1LiUwM2x1IE1IelxuIiwKKwkJCSgoY291bnRfaHogKyA1MDApIC8gMTAwMCkgLyAxMDAwLAorCQkJKChjb3VudF9oeiArIDUwMCkgLyAxMDAwKSAlIDEwMDApOworCisJcmV0dXJuIDA7CiB9CiAKIC8qCiAgKiBUYWtlbiBmcm9tIE1JUFMgYzBfaHB0X3RpbWVyX2luaXQoKS4KICAqCi0gKiBXaHkgaXMgaXQgc28gY29tcGxpY2F0ZWQsIGFuZCB3aGF0IGlzICJjb3VudCI/ICBNeSBhc3N1bXB0aW9uIGlzCi0gKiB0aGF0IGBjb3VudCcgc3BlY2lmaWVzIHRoZSAicmVmZXJlbmNlIGN5Y2xlIiwgaS5lLiB0aGUgY3ljbGUgc2luY2UKLSAqIHJlc2V0IHRoYXQgc2hvdWxkIG1lYW4gInplcm8iLiBUaGUgcmVhc29uIENPVU5UIGlzIHdyaXR0ZW4gdHdpY2UgaXMKLSAqIHByb2JhYmx5IHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCBnZXQgYW55IHRpbWVyIGludGVycnVwdHMgd2hpbGUgd2UKLSAqIGFyZSBtZXNzaW5nIHdpdGggdGhlIGNvdW50ZXIuCisgKiBUaGUgcmVhc29uIENPVU5UIGlzIHdyaXR0ZW4gdHdpY2UgaXMgcHJvYmFibHkgdG8gbWFrZSBzdXJlIHdlIGRvbid0IGdldCBhbnkKKyAqIHRpbWVyIGludGVycnVwdHMgd2hpbGUgd2UgYXJlIG1lc3Npbmcgd2l0aCB0aGUgY291bnRlci4KICAqLwotc3RhdGljIHZvaWQgYXZyMzJfaHB0X2luaXQodW5zaWduZWQgaW50IGNvdW50KQoraW50IF9fd2VhayBhdnIzMl9ocHRfc3RhcnQodm9pZCkKIHsKLQljb3VudCA9IHN5c3JlZ19yZWFkKENPVU5UKSAtIGNvdW50OworCXUzMiBjb3VudCA9IHN5c3JlZ19yZWFkKENPVU5UKTsKIAlleHBpcmVsbyA9IChjb3VudCAvIGN5Y2xlc19wZXJfamlmZnkgKyAxKSAqIGN5Y2xlc19wZXJfamlmZnk7CiAJc3lzcmVnX3dyaXRlKENPVU5ULCBleHBpcmVsbyAtIGN5Y2xlc19wZXJfamlmZnkpOwogCXN5c3JlZ193cml0ZShDT01QQVJFLCBleHBpcmVsbyk7CiAJc3lzcmVnX3dyaXRlKENPVU5ULCBjb3VudCk7CisKKwlyZXR1cm4gMDsKIH0KIAogLyoKQEAgLTExNSwyNiArMTUwLDE4IEBACiAgKgogICogSW4gVVAgbW9kZSwgaXQgaXMgaW52b2tlZCBmcm9tIHRoZSAoZ2xvYmFsKSB0aW1lcl9pbnRlcnJ1cHQuCiAgKi8KLXN0YXRpYyB2b2lkIGxvY2FsX3RpbWVyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit2b2lkIGxvY2FsX3RpbWVyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7CiAJaWYgKGN1cnJlbnQtPnBpZCkKIAkJcHJvZmlsZV90aWNrKENQVV9QUk9GSUxJTkcpOwogCXVwZGF0ZV9wcm9jZXNzX3RpbWVzKHVzZXJfbW9kZShnZXRfaXJxX3JlZ3MoKSkpOwogfQogCi1zdGF0aWMgaXJxcmV0dXJuX3QKLXRpbWVyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCitpcnFyZXR1cm5fdCBfX3dlYWsgdGltZXJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKLQl1bnNpZ25lZCBpbnQgY291bnQ7Ci0KIAkvKiBhY2sgdGltZXIgaW50ZXJydXB0IGFuZCB0cnkgdG8gc2V0IG5leHQgaW50ZXJydXB0ICovCi0JY291bnQgPSBhdnIzMl9ocHRfcmVhZCgpOwogCWF2cjMyX3RpbWVyX2FjaygpOwogCi0JLyogVXBkYXRlIHRpbWVyaGkvdGltZXJsbyBmb3IgaW50cmEtamlmZnkgY2FsaWJyYXRpb24gKi8KLQl0aW1lcmhpICs9IGNvdW50IDwgdGltZXJsbzsJLyogV3JhcCBhcm91bmQgKi8KLQl0aW1lcmxvID0gY291bnQ7Ci0KIAkvKgogCSAqIENhbGwgdGhlIGdlbmVyaWMgdGltZXIgaW50ZXJydXB0IGhhbmRsZXIKIAkgKi8KQEAgLTE1Myw2MCArMTgwLDM3IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi1zdGF0aWMgc3RydWN0IGlycWFjdGlvbiB0aW1lcl9pcnFhY3Rpb24gPSB7Ci0JLmhhbmRsZXIJPSB0aW1lcl9pbnRlcnJ1cHQsCi0JLmZsYWdzCQk9IElSUUZfRElTQUJMRUQsCi0JLm5hbWUJCT0gInRpbWVyIiwKLX07Ci0KIHZvaWQgX19pbml0IHRpbWVfaW5pdCh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgbXVsdCwgc2hpZnQsIGNvdW50X2h6OwogCWludCByZXQ7CiAKKwkvKgorCSAqIE1ha2Ugc3VyZSB3ZSBkb24ndCBnZXQgYW55IENPTVBBUkUgaW50ZXJydXB0cyBiZWZvcmUgd2UgY2FuCisJICogaGFuZGxlIHRoZW0uCisJICovCisJc3lzcmVnX3dyaXRlKENPTVBBUkUsIDApOworCiAJeHRpbWUudHZfc2VjID0gcnRjX2dldF90aW1lKCk7CiAJeHRpbWUudHZfbnNlYyA9IDA7CiAKIAlzZXRfbm9ybWFsaXplZF90aW1lc3BlYygmd2FsbF90b19tb25vdG9uaWMsCiAJCQkJLXh0aW1lLnR2X3NlYywgLXh0aW1lLnR2X25zZWMpOwogCi0JcHJpbnRrKCJCZWZvcmUgdGltZV9pbml0OiBjb3VudD0lMDhseCwgY29tcGFyZT0lMDhseFxuIiwKLQkgICAgICAgKHVuc2lnbmVkIGxvbmcpc3lzcmVnX3JlYWQoQ09VTlQpLAotCSAgICAgICAodW5zaWduZWQgbG9uZylzeXNyZWdfcmVhZChDT01QQVJFKSk7Ci0KLQljb3VudF9oeiA9IGNsa19nZXRfcmF0ZShib290X2NwdV9kYXRhLmNsayk7Ci0Jc2hpZnQgPSBjbG9ja3NvdXJjZV9hdnIzMi5zaGlmdDsKLQltdWx0ID0gY2xvY2tzb3VyY2VfaHoybXVsdChjb3VudF9oeiwgc2hpZnQpOwotCWNsb2Nrc291cmNlX2F2cjMyLm11bHQgPSBtdWx0OwotCi0JcHJpbnRrKCJDeWNsZSBjb3VudGVyOiBtdWx0PSVsdSwgc2hpZnQ9JWx1XG4iLCBtdWx0LCBzaGlmdCk7Ci0KLQl7Ci0JCXU2NCB0bXA7Ci0KLQkJdG1wID0gVElDS19OU0VDOwotCQl0bXAgPDw9IHNoaWZ0OwotCQl0bXAgKz0gbXVsdCAvIDI7Ci0JCWRvX2Rpdih0bXAsIG11bHQpOwotCi0JCWN5Y2xlc19wZXJfamlmZnkgPSB0bXA7CisJcmV0ID0gYXZyMzJfaHB0X2luaXQoKTsKKwlpZiAocmV0KSB7CisJCXByX2RlYnVnKCJ0aW1lcjogZmFpbGVkIHNldHVwOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuOwogCX0KIAotCS8qIFRoaXMgc2V0cyB1cCB0aGUgaGlnaCBwcmVjaXNpb24gdGltZXIgZm9yIHRoZSBmaXJzdCBpbnRlcnJ1cHQuICovCi0JYXZyMzJfaHB0X2luaXQoYXZyMzJfaHB0X3JlYWQoKSk7Ci0KLQlwcmludGsoIkFmdGVyIHRpbWVfaW5pdDogY291bnQ9JTA4bHgsIGNvbXBhcmU9JTA4bHhcbiIsCi0JICAgICAgICh1bnNpZ25lZCBsb25nKXN5c3JlZ19yZWFkKENPVU5UKSwKLQkgICAgICAgKHVuc2lnbmVkIGxvbmcpc3lzcmVnX3JlYWQoQ09NUEFSRSkpOwotCiAJcmV0ID0gY2xvY2tzb3VyY2VfcmVnaXN0ZXIoJmNsb2Nrc291cmNlX2F2cjMyKTsKIAlpZiAocmV0KQotCQlwcmludGsoS0VSTl9FUlIKLQkJICAgICAgICJ0aW1lcjogY291bGQgbm90IHJlZ2lzdGVyIGNsb2Nrc291cmNlOiAlZFxuIiwgcmV0KTsKKwkJcHJfZGVidWcoInRpbWVyOiBjb3VsZCBub3QgcmVnaXN0ZXIgY2xvY2tzb3VyY2U6ICVkXG4iLCByZXQpOwogCi0JcmV0ID0gc2V0dXBfaXJxKDAsICZ0aW1lcl9pcnFhY3Rpb24pOwotCWlmIChyZXQpCi0JCXByaW50aygidGltZXI6IGNvdWxkIG5vdCByZXF1ZXN0IElSUSAwOiAlZFxuIiwgcmV0KTsKKwlyZXQgPSBhdnIzMl9ocHRfc3RhcnQoKTsKKwlpZiAocmV0KSB7CisJCXByX2RlYnVnKCJ0aW1lcjogZmFpbGVkIHN0YXJ0aW5nOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuOworCX0KIH0KIAogc3RhdGljIHN0cnVjdCBzeXNkZXZfY2xhc3MgdGltZXJfY2xhc3MgPSB7CmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9hdnIzMi9rZXJuZWwvdHJhcHMuYwppbmRleCBhZGMwMWExLi40ZjAzODJkIDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gvYXZyMzIva2VybmVsL3RyYXBzLmMKQEAgLTUsMTU4ICs1LDI1IEBACiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KLSN1bmRlZiBERUJVRwotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisKKyNpbmNsdWRlIDxsaW51eC9idWcuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2FsbHN5bXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogCi0jaW5jbHVkZSA8YXNtL3RyYXBzLmg+Ci0jaW5jbHVkZSA8YXNtL3N5c3JlZy5oPgogI2luY2x1ZGUgPGFzbS9hZGRyc3BhY2UuaD4KLSNpbmNsdWRlIDxhc20vb2NkLmg+CiAjaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KLQotc3RhdGljIHZvaWQgZHVtcF9tZW0oY29uc3QgY2hhciAqc3RyLCB1bnNpZ25lZCBsb25nIGJvdHRvbSwgdW5zaWduZWQgbG9uZyB0b3ApCi17Ci0JdW5zaWduZWQgbG9uZyBwOwotCWludCBpOwotCi0JcHJpbnRrKCIlcygweCUwOGx4IHRvIDB4JTA4bHgpXG4iLCBzdHIsIGJvdHRvbSwgdG9wKTsKLQotCWZvciAocCA9IGJvdHRvbSAmIH4zMTsgcCA8IHRvcDsgKSB7Ci0JCXByaW50aygiJTA0bHg6ICIsIHAgJiAweGZmZmYpOwotCi0JCWZvciAoaSA9IDA7IGkgPCA4OyBpKyssIHAgKz0gNCkgewotCQkJdW5zaWduZWQgaW50IHZhbDsKLQotCQkJaWYgKHAgPCBib3R0b20gfHwgcCA+PSB0b3ApCi0JCQkJcHJpbnRrKCIgICAgICAgICAiKTsKLQkJCWVsc2UgewotCQkJCWlmIChfX2dldF91c2VyKHZhbCwgKHVuc2lnbmVkIGludCBfX3VzZXIgKilwKSkgewotCQkJCQlwcmludGsoIlxuIik7Ci0JCQkJCWdvdG8gb3V0OwotCQkJCX0KLQkJCQlwcmludGsoIiUwOHggIiwgdmFsKTsKLQkJCX0KLQkJfQotCQlwcmludGsoIlxuIik7Ci0JfQotCi1vdXQ6Ci0JcmV0dXJuOwotfQotCi1zdGF0aWMgaW5saW5lIGludCB2YWxpZF9zdGFja19wdHIoc3RydWN0IHRocmVhZF9pbmZvICp0aW5mbywgdW5zaWduZWQgbG9uZyBwKQotewotCXJldHVybiAocCA+ICh1bnNpZ25lZCBsb25nKXRpbmZvKQotCQkmJiAocCA8ICh1bnNpZ25lZCBsb25nKXRpbmZvICsgVEhSRUFEX1NJWkUgLSAzKTsKLX0KLQotI2lmZGVmIENPTkZJR19GUkFNRV9QT0lOVEVSCi1zdGF0aWMgaW5saW5lIHZvaWQgX19zaG93X3RyYWNlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCB1bnNpZ25lZCBsb25nICpzcCwKLQkJCQlzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQl1bnNpZ25lZCBsb25nIGxyLCBmcDsKLQlzdHJ1Y3QgdGhyZWFkX2luZm8gKnRpbmZvOwotCi0JdGluZm8gPSAoc3RydWN0IHRocmVhZF9pbmZvICopCi0JCSgodW5zaWduZWQgbG9uZylzcCAmIH4oVEhSRUFEX1NJWkUgLSAxKSk7Ci0KLQlpZiAocmVncykKLQkJZnAgPSByZWdzLT5yNzsKLQllbHNlIGlmICh0c2sgPT0gY3VycmVudCkKLQkJYXNtKCJtb3YgJTAsIHI3IiA6ICI9ciIoZnApKTsKLQllbHNlCi0JCWZwID0gdHNrLT50aHJlYWQuY3B1X2NvbnRleHQucjc7Ci0KLQkvKgotCSAqIFdhbGsgdGhlIHN0YWNrIGFzIGxvbmcgYXMgdGhlIGZyYW1lIHBvaW50ZXIgKGEpIGlzIHdpdGhpbgotCSAqIHRoZSBrZXJuZWwgc3RhY2sgb2YgdGhlIHRhc2ssIGFuZCAoYikgaXQgZG9lc24ndCBtb3ZlCi0JICogZG93bndhcmRzLgotCSAqLwotCXdoaWxlICh2YWxpZF9zdGFja19wdHIodGluZm8sIGZwKSkgewotCQl1bnNpZ25lZCBsb25nIG5ld19mcDsKLQotCQlsciA9ICoodW5zaWduZWQgbG9uZyAqKWZwOwotCQlwcmludGsoIiBbPCUwOGx4Pl0gIiwgbHIpOwotCQlwcmludF9zeW1ib2woIiVzXG4iLCBscik7Ci0KLQkJbmV3X2ZwID0gKih1bnNpZ25lZCBsb25nICopKGZwICsgNCk7Ci0JCWlmIChuZXdfZnAgPD0gZnApCi0JCQlicmVhazsKLQkJZnAgPSBuZXdfZnA7Ci0JfQotCXByaW50aygiXG4iKTsKLX0KLSNlbHNlCi1zdGF0aWMgaW5saW5lIHZvaWQgX19zaG93X3RyYWNlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCB1bnNpZ25lZCBsb25nICpzcCwKLQkJCQlzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQl1bnNpZ25lZCBsb25nIGFkZHI7Ci0KLQl3aGlsZSAoIWtzdGFja19lbmQoc3ApKSB7Ci0JCWFkZHIgPSAqc3ArKzsKLQkJaWYgKGtlcm5lbF90ZXh0X2FkZHJlc3MoYWRkcikpIHsKLQkJCXByaW50aygiIFs8JTA4bHg+XSAiLCBhZGRyKTsKLQkJCXByaW50X3N5bWJvbCgiJXNcbiIsIGFkZHIpOwotCQl9Ci0JfQotfQotI2VuZGlmCi0KLXZvaWQgc2hvd190cmFjZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgdW5zaWduZWQgbG9uZyAqc3AsCi0JCSAgICAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQlpZiAocmVncyAmJgotCSAgICAoKChyZWdzLT5zciAmIE1PREVfTUFTSykgPT0gTU9ERV9FWENFUFRJT04pIHx8Ci0JICAgICAoKHJlZ3MtPnNyICYgTU9ERV9NQVNLKSA9PSBNT0RFX1VTRVIpKSkKLQkJcmV0dXJuOwotCi0JcHJpbnRrICgiQ2FsbCB0cmFjZToiKTsKLSNpZmRlZiBDT05GSUdfS0FMTFNZTVMKLQlwcmludGsoIlxuIik7Ci0jZW5kaWYKLQotCV9fc2hvd190cmFjZSh0c2ssIHNwLCByZWdzKTsKLQlwcmludGsoIlxuIik7Ci19Ci0KLXZvaWQgc2hvd19zdGFjayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgdW5zaWduZWQgbG9uZyAqc3ApCi17Ci0JdW5zaWduZWQgbG9uZyBzdGFjazsKLQotCWlmICghdHNrKQotCQl0c2sgPSBjdXJyZW50OwotCWlmIChzcCA9PSAwKSB7Ci0JCWlmICh0c2sgPT0gY3VycmVudCkgewotCQkJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyAqcmVhbF9zcCBfX2FzbV9fKCJzcCIpOwotCQkJc3AgPSByZWFsX3NwOwotCQl9IGVsc2UgewotCQkJc3AgPSAodW5zaWduZWQgbG9uZyAqKXRzay0+dGhyZWFkLmNwdV9jb250ZXh0LmtzcDsKLQkJfQotCX0KLQotCXN0YWNrID0gKHVuc2lnbmVkIGxvbmcpc3A7Ci0JZHVtcF9tZW0oIlN0YWNrOiAiLCBzdGFjaywKLQkJIFRIUkVBRF9TSVpFICsgKHVuc2lnbmVkIGxvbmcpdHNrLT50aHJlYWRfaW5mbyk7Ci0Jc2hvd190cmFjZSh0c2ssIHNwLCBOVUxMKTsKLX0KLQotdm9pZCBkdW1wX3N0YWNrKHZvaWQpCi17Ci0Jc2hvd19zdGFjayhOVUxMLCBOVUxMKTsKLX0KLUVYUE9SVF9TWU1CT0woZHVtcF9zdGFjayk7CisjaW5jbHVkZSA8YXNtL29jZC5oPgorI2luY2x1ZGUgPGFzbS9zeXNyZWcuaD4KKyNpbmNsdWRlIDxhc20vdHJhcHMuaD4KIAogQVRPTUlDX05PVElGSUVSX0hFQUQoYXZyMzJfZGllX2NoYWluKTsKIAogaW50IHJlZ2lzdGVyX2RpZV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKQogewotCXByX2RlYnVnKCJyZWdpc3Rlcl9kaWVfbm90aWZpZXI6ICVwXG4iLCBuYik7Ci0KIAlyZXR1cm4gYXRvbWljX25vdGlmaWVyX2NoYWluX3JlZ2lzdGVyKCZhdnIzMl9kaWVfY2hhaW4sIG5iKTsKIH0KIEVYUE9SVF9TWU1CT0wocmVnaXN0ZXJfZGllX25vdGlmaWVyKTsKQEAgLTE2OSw5MyArMzYsMTAzIEBACiAKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soZGllX2xvY2spOwogCi12b2lkIF9fZGllKGNvbnN0IGNoYXIgKnN0ciwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGxvbmcgZXJyLAotCSAgIGNvbnN0IGNoYXIgKmZpbGUsIGNvbnN0IGNoYXIgKmZ1bmMsIHVuc2lnbmVkIGxvbmcgbGluZSkKK3ZvaWQgTk9SRVRfVFlQRSBkaWUoY29uc3QgY2hhciAqc3RyLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywgbG9uZyBlcnIpCiB7Ci0Jc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OwogCXN0YXRpYyBpbnQgZGllX2NvdW50ZXI7CiAKIAljb25zb2xlX3ZlcmJvc2UoKTsKIAlzcGluX2xvY2tfaXJxKCZkaWVfbG9jayk7CiAJYnVzdF9zcGlubG9ja3MoMSk7CiAKLQlwcmludGsoS0VSTl9BTEVSVCAiJXMiLCBzdHIpOwotCWlmIChmaWxlICYmIGZ1bmMpCi0JCXByaW50aygiIGluICVzOiVzLCBsaW5lICVsZCIsIGZpbGUsIGZ1bmMsIGxpbmUpOwotCXByaW50aygiWyMlZF06XG4iLCArK2RpZV9jb3VudGVyKTsKLQlwcmludF9tb2R1bGVzKCk7Ci0Jc2hvd19yZWdzKHJlZ3MpOwotCXByaW50aygiUHJvY2VzcyAlcyAocGlkOiAlZCwgc3RhY2sgbGltaXQgPSAweCVwKVxuIiwKLQkgICAgICAgdHNrLT5jb21tLCB0c2stPnBpZCwgdHNrLT50aHJlYWRfaW5mbyArIDEpOwotCi0JaWYgKCF1c2VyX21vZGUocmVncykgfHwgaW5faW50ZXJydXB0KCkpIHsKLQkJZHVtcF9tZW0oIlN0YWNrOiAiLCByZWdzLT5zcCwKLQkJCSBUSFJFQURfU0laRSArICh1bnNpZ25lZCBsb25nKXRzay0+dGhyZWFkX2luZm8pOworCXByaW50ayhLRVJOX0FMRVJUICJPb3BzOiAlcywgc2lnOiAlbGQgWyMlZF1cbiIgS0VSTl9FTUVSRywKKwkgICAgICAgc3RyLCBlcnIsICsrZGllX2NvdW50ZXIpOworI2lmZGVmIENPTkZJR19QUkVFTVBUCisJcHJpbnRrKCJQUkVFTVBUICIpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0ZSQU1FX1BPSU5URVIKKwlwcmludGsoIkZSQU1FX1BPSU5URVIgIik7CisjZW5kaWYKKwlpZiAoY3VycmVudF9jcHVfZGF0YS5mZWF0dXJlcyAmIEFWUjMyX0ZFQVRVUkVfT0NEKSB7CisJCXVuc2lnbmVkIGxvbmcgZGlkID0gX19tZmRyKERCR1JFR19ESUQpOworCQlwcmludGsoImNoaXA6IDB4JTAzbHg6MHglMDRseCByZXYgJWx1XG4iLAorCQkgICAgICAgKGRpZCA+PiAxKSAmIDB4N2ZmLAorCQkgICAgICAgKGRpZCA+PiAxMikgJiAweDdmZmYsCisJCSAgICAgICAoZGlkID4+IDI4KSAmIDB4Zik7CisJfSBlbHNlIHsKKwkJcHJpbnRrKCJjcHU6IGFyY2ggJXUgciV1IC8gY29yZSAldSByJXVcbiIsCisJCSAgICAgICBjdXJyZW50X2NwdV9kYXRhLmFyY2hfdHlwZSwKKwkJICAgICAgIGN1cnJlbnRfY3B1X2RhdGEuYXJjaF9yZXZpc2lvbiwKKwkJICAgICAgIGN1cnJlbnRfY3B1X2RhdGEuY3B1X3R5cGUsCisJCSAgICAgICBjdXJyZW50X2NwdV9kYXRhLmNwdV9yZXZpc2lvbik7CiAJfQogCisJcHJpbnRfbW9kdWxlcygpOworCXNob3dfcmVnc19sb2dfbHZsKHJlZ3MsIEtFUk5fRU1FUkcpOworCXNob3dfc3RhY2tfbG9nX2x2bChjdXJyZW50LCByZWdzLT5zcCwgcmVncywgS0VSTl9FTUVSRyk7CiAJYnVzdF9zcGlubG9ja3MoMCk7CiAJc3Bpbl91bmxvY2tfaXJxKCZkaWVfbG9jayk7Ci0JZG9fZXhpdChTSUdTRUdWKTsKKworCWlmIChpbl9pbnRlcnJ1cHQoKSkKKwkJcGFuaWMoIkZhdGFsIGV4Y2VwdGlvbiBpbiBpbnRlcnJ1cHQiKTsKKworCWlmIChwYW5pY19vbl9vb3BzKQorCQlwYW5pYygiRmF0YWwgZXhjZXB0aW9uIik7CisKKwlkb19leGl0KGVycik7CiB9CiAKLXZvaWQgX19kaWVfaWZfa2VybmVsKGNvbnN0IGNoYXIgKnN0ciwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGxvbmcgZXJyLAotCQkgICAgIGNvbnN0IGNoYXIgKmZpbGUsIGNvbnN0IGNoYXIgKmZ1bmMsIHVuc2lnbmVkIGxvbmcgbGluZSkKK3ZvaWQgX2V4Y2VwdGlvbihsb25nIHNpZ25yLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IGNvZGUsCisJCXVuc2lnbmVkIGxvbmcgYWRkcikKIHsKKwlzaWdpbmZvX3QgaW5mbzsKKwogCWlmICghdXNlcl9tb2RlKHJlZ3MpKQotCQlfX2RpZShzdHIsIHJlZ3MsIGVyciwgZmlsZSwgZnVuYywgbGluZSk7CisJCWRpZSgiVW5oYW5kbGVkIGV4Y2VwdGlvbiBpbiBrZXJuZWwgbW9kZSIsIHJlZ3MsIHNpZ25yKTsKKworCW1lbXNldCgmaW5mbywgMCwgc2l6ZW9mKGluZm8pKTsKKwlpbmZvLnNpX3NpZ25vID0gc2lnbnI7CisJaW5mby5zaV9jb2RlID0gY29kZTsKKwlpbmZvLnNpX2FkZHIgPSAodm9pZCBfX3VzZXIgKilhZGRyOworCWZvcmNlX3NpZ19pbmZvKHNpZ25yLCAmaW5mbywgY3VycmVudCk7CisKKwkvKgorCSAqIEluaXQgZ2V0cyBubyBzaWduYWxzIHRoYXQgaXQgZG9lc24ndCBoYXZlIGEgaGFuZGxlciBmb3IuCisJICogVGhhdCdzIGFsbCB2ZXJ5IHdlbGwsIGJ1dCBpZiBpdCBoYXMgY2F1c2VkIGEgc3luY2hyb25vdXMKKwkgKiBleGNlcHRpb24gYW5kIHdlIGlnbm9yZSB0aGUgcmVzdWx0aW5nIHNpZ25hbCwgaXQgd2lsbCBqdXN0CisJICogZ2VuZXJhdGUgdGhlIHNhbWUgZXhjZXB0aW9uIG92ZXIgYW5kIG92ZXIgYWdhaW4gYW5kIHdlIGdldAorCSAqIG5vd2hlcmUuICBCZXR0ZXIgdG8ga2lsbCBpdCBhbmQgbGV0IHRoZSBrZXJuZWwgcGFuaWMuCisJICovCisJaWYgKGlzX2luaXQoY3VycmVudCkpIHsKKwkJX19zaWdoYW5kbGVyX3QgaGFuZGxlcjsKKworCQlzcGluX2xvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKwkJaGFuZGxlciA9IGN1cnJlbnQtPnNpZ2hhbmQtPmFjdGlvbltzaWduci0xXS5zYS5zYV9oYW5kbGVyOworCQlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCQlpZiAoaGFuZGxlciA9PSBTSUdfREZMKSB7CisJCQkvKiBpbml0IGhhcyBnZW5lcmF0ZWQgYSBzeW5jaHJvbm91cyBleGNlcHRpb24KKwkJCSAgIGFuZCBpdCBkb2Vzbid0IGhhdmUgYSBoYW5kbGVyIGZvciB0aGUgc2lnbmFsICovCisJCQlwcmludGsoS0VSTl9DUklUICJpbml0IGhhcyBnZW5lcmF0ZWQgc2lnbmFsICVsZCAiCisJCQkgICAgICAgImJ1dCBoYXMgbm8gaGFuZGxlciBmb3IgaXRcbiIsIHNpZ25yKTsKKwkJCWRvX2V4aXQoc2lnbnIpOworCQl9CisJfQogfQogCiBhc21saW5rYWdlIHZvaWQgZG9fbm1pKHVuc2lnbmVkIGxvbmcgZWNyLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLSNpZmRlZiBDT05GSUdfU1VCQVJDSF9BVlIzMkIKLQkvKgotCSAqIFRoZSBleGNlcHRpb24gZW50cnkgYWx3YXlzIHNhdmVzIFJTUl9FWC4gRm9yIE5NSSwgdGhpcyBpcwotCSAqIHdyb25nOyBpdCBzaG91bGQgYmUgUlNSX05NSQotCSAqLwotCXJlZ3MtPnNyID0gc3lzcmVnX3JlYWQoUlNSX05NSSk7Ci0jZW5kaWYKLQotCXByaW50aygiTk1JIHRha2VuISEhIVxuIik7Ci0JZGllKCJOTUkiLCByZWdzLCBlY3IpOwotCUJVRygpOworCXByaW50ayhLRVJOX0FMRVJUICJHb3QgTm9uLU1hc2thYmxlIEludGVycnVwdCwgZHVtcGluZyByZWdzXG4iKTsKKwlzaG93X3JlZ3NfbG9nX2x2bChyZWdzLCBLRVJOX0FMRVJUKTsKKwlzaG93X3N0YWNrX2xvZ19sdmwoY3VycmVudCwgcmVncy0+c3AsIHJlZ3MsIEtFUk5fQUxFUlQpOwogfQogCiBhc21saW5rYWdlIHZvaWQgZG9fY3JpdGljYWxfZXhjZXB0aW9uKHVuc2lnbmVkIGxvbmcgZWNyLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLQlwcmludGsoIlVuYWJsZSB0byBoYW5kbGUgY3JpdGljYWwgZXhjZXB0aW9uICVsdSBhdCBwYyA9ICUwOGx4IVxuIiwKLQkgICAgICAgZWNyLCByZWdzLT5wYyk7Ci0JZGllKCJPb3BzIiwgcmVncywgZWNyKTsKLQlCVUcoKTsKKwlkaWUoIkNyaXRpY2FsIGV4Y2VwdGlvbiIsIHJlZ3MsIFNJR0tJTEwpOwogfQogCiBhc21saW5rYWdlIHZvaWQgZG9fYWRkcmVzc19leGNlcHRpb24odW5zaWduZWQgbG9uZyBlY3IsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCXNpZ2luZm9fdCBpbmZvOwotCi0JZGllX2lmX2tlcm5lbCgiT29wczogQWRkcmVzcyBleGNlcHRpb24gaW4ga2VybmVsIG1vZGUiLCByZWdzLCBlY3IpOwotCi0jaWZkZWYgREVCVUcKLQlpZiAoZWNyID09IEVDUl9BRERSX0FMSUdOX1gpCi0JCXByX2RlYnVnKCJJbnN0cnVjdGlvbiBBZGRyZXNzIEV4Y2VwdGlvbiBhdCBwYyA9ICUwOGx4XG4iLAotCQkJIHJlZ3MtPnBjKTsKLQllbHNlIGlmIChlY3IgPT0gRUNSX0FERFJfQUxJR05fUikKLQkJcHJfZGVidWcoIkRhdGEgQWRkcmVzcyBFeGNlcHRpb24gKFJlYWQpIGF0IHBjID0gJTA4bHhcbiIsCi0JCQkgcmVncy0+cGMpOwotCWVsc2UgaWYgKGVjciA9PSBFQ1JfQUREUl9BTElHTl9XKQotCQlwcl9kZWJ1ZygiRGF0YSBBZGRyZXNzIEV4Y2VwdGlvbiAoV3JpdGUpIGF0IHBjID0gJTA4bHhcbiIsCi0JCQkgcmVncy0+cGMpOwotCWVsc2UKLQkJQlVHKCk7Ci0KLQlzaG93X3JlZ3MocmVncyk7Ci0jZW5kaWYKLQotCWluZm8uc2lfc2lnbm8gPSBTSUdCVVM7Ci0JaW5mby5zaV9lcnJubyA9IDA7Ci0JaW5mby5zaV9jb2RlID0gQlVTX0FEUkFMTjsKLQlpbmZvLnNpX2FkZHIgPSAodm9pZCBfX3VzZXIgKilyZWdzLT5wYzsKLQotCWZvcmNlX3NpZ19pbmZvKFNJR0JVUywgJmluZm8sIGN1cnJlbnQpOworCV9leGNlcHRpb24oU0lHQlVTLCByZWdzLCBCVVNfQURSQUxOLCByZWdzLT5wYyk7CiB9CiAKIC8qIFRoaXMgd2F5IG9mIGhhbmRsaW5nIHVuZGVmaW5lZCBpbnN0cnVjdGlvbnMgaXMgc3RvbGVuIGZyb20gQVJNICovCkBAIC0yODAsNyArMTU3LDggQEAKIHsKIAlpbnQgY29wX25yOwogCXUzMiBjcHVjcjsKLQlpZiAoIChpbnNuICYgMHhmZGYwMDAwMCkgPT0gMHhmMTkwMDAwMCApCisKKwlpZiAoKGluc24gJiAweGZkZjAwMDAwKSA9PSAweGYxOTAwMDAwKQogCQkvKiBMREMwICovCiAJCWNvcF9uciA9IDA7CiAJZWxzZQpAQCAtMjkyLDEzNiArMTcwLDkxIEBACiAJc3lzcmVnX3dyaXRlKENQVUNSLCBjcHVjcik7CiAKIAljcHVjciA9IHN5c3JlZ19yZWFkKENQVUNSKTsKLQlpZiAoICEoY3B1Y3IgJiAoMSA8PCAoMjQgKyBjb3BfbnIpKSkgKXsKLQkJcHJpbnRrKCJDb3Byb2Nlc3NvciAjJWkgbm90IGZvdW5kIVxuIiwgY29wX25yKTsKLQkJcmV0dXJuIC0xOwotCX0KKwlpZiAoIShjcHVjciAmICgxIDw8ICgyNCArIGNvcF9ucikpKSkKKwkJcmV0dXJuIC1FTk9ERVY7CiAKIAlyZXR1cm4gMDsKIH0KIAotI2lmZGVmIENPTkZJR19CVUcKLSNpZmRlZiBDT05GSUdfREVCVUdfQlVHVkVSQk9TRQotc3RhdGljIGlubGluZSB2b2lkIGRvX2J1Z192ZXJib3NlKHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1MzIgaW5zbikKK2ludCBpc192YWxpZF9idWdhZGRyKHVuc2lnbmVkIGxvbmcgcGMpCiB7Ci0JY2hhciAqZmlsZTsKLQl1MTYgbGluZTsKLQljaGFyIGM7CisJdW5zaWduZWQgc2hvcnQgb3Bjb2RlOwogCi0JaWYgKF9fZ2V0X3VzZXIobGluZSwgKHUxNiBfX3VzZXIgKikocmVncy0+cGMgKyAyKSkpCi0JCXJldHVybjsKLQlpZiAoX19nZXRfdXNlcihmaWxlLCAoY2hhciAqIF9fdXNlciAqKShyZWdzLT5wYyArIDQpKQotCSAgICB8fCAodW5zaWduZWQgbG9uZylmaWxlIDwgUEFHRV9PRkZTRVQKLQkgICAgfHwgX19nZXRfdXNlcihjLCBmaWxlKSkKLQkJZmlsZSA9ICI8YmFkIGZpbGVuYW1lPiI7CisJaWYgKHBjIDwgUEFHRV9PRkZTRVQpCisJCXJldHVybiAwOworCWlmIChwcm9iZV9rZXJuZWxfYWRkcmVzcygodTE2ICopcGMsIG9wY29kZSkpCisJCXJldHVybiAwOwogCi0JcHJpbnRrKEtFUk5fQUxFUlQgImtlcm5lbCBCVUcgYXQgJXM6JWQhXG4iLCBmaWxlLCBsaW5lKTsKKwlyZXR1cm4gb3Bjb2RlID09IEFWUjMyX0JVR19PUENPREU7CiB9Ci0jZWxzZQotc3RhdGljIGlubGluZSB2b2lkIGRvX2J1Z192ZXJib3NlKHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1MzIgaW5zbikKLXsKLQotfQotI2VuZGlmCi0jZW5kaWYKIAogYXNtbGlua2FnZSB2b2lkIGRvX2lsbGVnYWxfb3Bjb2RlKHVuc2lnbmVkIGxvbmcgZWNyLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAl1MzIgaW5zbjsKIAlzdHJ1Y3QgdW5kZWZfaG9vayAqaG9vazsKLQlzaWdpbmZvX3QgaW5mbzsKIAl2b2lkIF9fdXNlciAqcGM7CisJbG9uZyBjb2RlOwogCi0JaWYgKCF1c2VyX21vZGUocmVncykpCi0JCWdvdG8ga2VybmVsX3RyYXA7CisJaWYgKCF1c2VyX21vZGUocmVncykgJiYgKGVjciA9PSBFQ1JfSUxMRUdBTF9PUENPREUpKSB7CisJCWVudW0gYnVnX3RyYXBfdHlwZSB0eXBlOworCisJCXR5cGUgPSByZXBvcnRfYnVnKHJlZ3MtPnBjKTsKKwkJc3dpdGNoICh0eXBlKSB7CisJCWNhc2UgQlVHX1RSQVBfVFlQRV9OT05FOgorCQkJYnJlYWs7CisJCWNhc2UgQlVHX1RSQVBfVFlQRV9XQVJOOgorCQkJcmVncy0+cGMgKz0gMjsKKwkJCXJldHVybjsKKwkJY2FzZSBCVUdfVFJBUF9UWVBFX0JVRzoKKwkJCWRpZSgiS2VybmVsIEJVRyIsIHJlZ3MsIFNJR0tJTEwpOworCQl9CisJfQogCiAJbG9jYWxfaXJxX2VuYWJsZSgpOwogCi0JcGMgPSAodm9pZCBfX3VzZXIgKilpbnN0cnVjdGlvbl9wb2ludGVyKHJlZ3MpOwotCWlmIChfX2dldF91c2VyKGluc24sICh1MzIgX191c2VyICopcGMpKQotCQlnb3RvIGludmFsaWRfYXJlYTsKKwlpZiAodXNlcl9tb2RlKHJlZ3MpKSB7CisJCXBjID0gKHZvaWQgX191c2VyICopaW5zdHJ1Y3Rpb25fcG9pbnRlcihyZWdzKTsKKwkJaWYgKGdldF91c2VyKGluc24sICh1MzIgX191c2VyICopcGMpKQorCQkJZ290byBpbnZhbGlkX2FyZWE7CiAKLSAgICAgICAgaWYgKGVjciA9PSBFQ1JfQ09QUk9DX0FCU0VOVCkgewotCQlpZiAoZG9fY29wX2Fic2VudChpbnNuKSA9PSAwKQorCQlpZiAoZWNyID09IEVDUl9DT1BST0NfQUJTRU5UICYmICFkb19jb3BfYWJzZW50KGluc24pKQogCQkJcmV0dXJuOwotICAgICAgICB9CiAKLQlzcGluX2xvY2tfaXJxKCZ1bmRlZl9sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGhvb2ssICZ1bmRlZl9ob29rLCBub2RlKSB7Ci0JCWlmICgoaW5zbiAmIGhvb2stPmluc25fbWFzaykgPT0gaG9vay0+aW5zbl92YWwpIHsKLQkJCWlmIChob29rLT5mbihyZWdzLCBpbnNuKSA9PSAwKSB7Ci0JCQkJc3Bpbl91bmxvY2tfaXJxKCZ1bmRlZl9sb2NrKTsKLQkJCQlyZXR1cm47CisJCXNwaW5fbG9ja19pcnEoJnVuZGVmX2xvY2spOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGhvb2ssICZ1bmRlZl9ob29rLCBub2RlKSB7CisJCQlpZiAoKGluc24gJiBob29rLT5pbnNuX21hc2spID09IGhvb2stPmluc25fdmFsKSB7CisJCQkJaWYgKGhvb2stPmZuKHJlZ3MsIGluc24pID09IDApIHsKKwkJCQkJc3Bpbl91bmxvY2tfaXJxKCZ1bmRlZl9sb2NrKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KIAkJCX0KIAkJfQorCQlzcGluX3VubG9ja19pcnEoJnVuZGVmX2xvY2spOwogCX0KLQlzcGluX3VubG9ja19pcnEoJnVuZGVmX2xvY2spOwogCi1pbnZhbGlkX2FyZWE6Ci0KLSNpZmRlZiBERUJVRwotCXByaW50aygiSWxsZWdhbCBpbnN0cnVjdGlvbiBhdCBwYyA9ICUwOGx4XG4iLCByZWdzLT5wYyk7Ci0JaWYgKHJlZ3MtPnBjIDwgVEFTS19TSVpFKSB7Ci0JCXVuc2lnbmVkIGxvbmcgcHRiciwgcGdkLCBwdGUsICpwOwotCi0JCXB0YnIgPSBzeXNyZWdfcmVhZChQVEJSKTsKLQkJcCA9ICh1bnNpZ25lZCBsb25nICopcHRicjsKLQkJcGdkID0gcFtyZWdzLT5wYyA+PiAyMl07Ci0JCXAgPSAodW5zaWduZWQgbG9uZyAqKSgocGdkICYgMHgxZmZmZjAwMCkgfCAweDgwMDAwMDAwKTsKLQkJcHRlID0gcFsocmVncy0+cGMgPj4gMTIpICYgMHgzZmZdOwotCQlwcmludGsoInBhZ2UgdGFibGU6IDB4JTA4bHggLT4gMHglMDhseCAtPiAweCUwOGx4XG4iLCBwdGJyLCBwZ2QsIHB0ZSk7Ci0JfQotI2VuZGlmCi0KLQlpbmZvLnNpX3NpZ25vID0gU0lHSUxMOwotCWluZm8uc2lfZXJybm8gPSAwOwotCWluZm8uc2lfYWRkciA9ICh2b2lkIF9fdXNlciAqKXJlZ3MtPnBjOwogCXN3aXRjaCAoZWNyKSB7Ci0JY2FzZSBFQ1JfSUxMRUdBTF9PUENPREU6Ci0JY2FzZSBFQ1JfVU5JTVBMX0lOU1RSVUNUSU9OOgotCQlpbmZvLnNpX2NvZGUgPSBJTExfSUxMT1BDOwotCQlicmVhazsKIAljYXNlIEVDUl9QUklWSUxFR0VfVklPTEFUSU9OOgotCQlpbmZvLnNpX2NvZGUgPSBJTExfUFJWT1BDOworCQljb2RlID0gSUxMX1BSVk9QQzsKIAkJYnJlYWs7CiAJY2FzZSBFQ1JfQ09QUk9DX0FCU0VOVDoKLQkJaW5mby5zaV9jb2RlID0gSUxMX0NPUFJPQzsKKwkJY29kZSA9IElMTF9DT1BST0M7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCUJVRygpOworCQljb2RlID0gSUxMX0lMTE9QQzsKKwkJYnJlYWs7CiAJfQogCi0JZm9yY2Vfc2lnX2luZm8oU0lHSUxMLCAmaW5mbywgY3VycmVudCk7CisJX2V4Y2VwdGlvbihTSUdJTEwsIHJlZ3MsIGNvZGUsIHJlZ3MtPnBjKTsKIAlyZXR1cm47CiAKLWtlcm5lbF90cmFwOgotI2lmZGVmIENPTkZJR19CVUcKLQlpZiAoX19rZXJuZWxfdGV4dF9hZGRyZXNzKGluc3RydWN0aW9uX3BvaW50ZXIocmVncykpKSB7Ci0JCWluc24gPSAqKHUxNiAqKWluc3RydWN0aW9uX3BvaW50ZXIocmVncyk7Ci0JCWlmIChpbnNuID09IEFWUjMyX0JVR19PUENPREUpIHsKLQkJCWRvX2J1Z192ZXJib3NlKHJlZ3MsIGluc24pOwotCQkJZGllKCJLZXJuZWwgQlVHIiwgcmVncywgMCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0jZW5kaWYKLQotCWRpZSgiT29wczogSWxsZWdhbCBpbnN0cnVjdGlvbiBpbiBrZXJuZWwgY29kZSIsIHJlZ3MsIGVjcik7CitpbnZhbGlkX2FyZWE6CisJX2V4Y2VwdGlvbihTSUdTRUdWLCByZWdzLCBTRUdWX01BUEVSUiwgcmVncy0+cGMpOwogfQogCiBhc21saW5rYWdlIHZvaWQgZG9fZnBlKHVuc2lnbmVkIGxvbmcgZWNyLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLQlzaWdpbmZvX3QgaW5mbzsKLQotCXByaW50aygiRmxvYXRpbmctcG9pbnQgZXhjZXB0aW9uIGF0IHBjID0gJTA4bHhcbiIsIHJlZ3MtPnBjKTsKLQotCS8qIFdlIGhhdmUgbm8gRlBVLi4uICovCi0JaW5mby5zaV9zaWdubyA9IFNJR0lMTDsKLQlpbmZvLnNpX2Vycm5vID0gMDsKLQlpbmZvLnNpX2FkZHIgPSAodm9pZCBfX3VzZXIgKilyZWdzLT5wYzsKLQlpbmZvLnNpX2NvZGUgPSBJTExfQ09QUk9DOwotCi0JZm9yY2Vfc2lnX2luZm8oU0lHSUxMLCAmaW5mbywgY3VycmVudCk7CisJLyogV2UgaGF2ZSBubyBGUFUgeWV0ICovCisJX2V4Y2VwdGlvbihTSUdJTEwsIHJlZ3MsIElMTF9DT1BST0MsIHJlZ3MtPnBjKTsKIH0KIAogCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2tlcm5lbC92bWxpbnV4Lmxkcy5jIGIvYXJjaC9hdnIzMi9rZXJuZWwvdm1saW51eC5sZHMuYwppbmRleCBlZjEzYjdjNy4uN2FkMjBjZiAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9rZXJuZWwvdm1saW51eC5sZHMuYworKysgYi9hcmNoL2F2cjMyL2tlcm5lbC92bWxpbnV4Lmxkcy5jCkBAIC0yNiw2ICsyNiwxMiBAQAogCQkJX3Npbml0dGV4dCA9IC47CiAJCQkqKC50ZXh0LnJlc2V0KQogCQkJKiguaW5pdC50ZXh0KQorCQkJLyoKKwkJCSAqIC5leGl0LnRleHQgaXMgZGlzY2FyZGVkIGF0IHJ1bnRpbWUsIG5vdAorCQkJICogbGluayB0aW1lLCB0byBkZWFsIHdpdGggcmVmZXJlbmNlcyBmcm9tCisJCQkgKiBfX2J1Z190YWJsZQorCQkJICovCisJCQkqKC5leGl0LnRleHQpCiAJCQlfZWluaXR0ZXh0ID0gLjsKIAkJLiA9IEFMSUdOKDQpOwogCQlfX3RhZ3RhYmxlX2JlZ2luID0gLjsKQEAgLTg2LDYgKzkyLDggQEAKIAkJX19zdG9wX19fZXhfdGFibGUgPSAuOwogCX0KIAorCUJVR19UQUJMRQorCiAJUk9EQVRBCiAKIAkuID0gQUxJR04oODE5Mik7CkBAIC0xMjYsNyArMTM0LDYgQEAKIAkgKiB0aHJvd24gYXdheSwgYXMgY2xlYW51cCBjb2RlIGlzIG5ldmVyIGNhbGxlZCB1bmxlc3MgaXQncyBhIG1vZHVsZS4KIAkgKi8KIAkvRElTQ0FSRC8gICAgICAgCTogewotCQkqKC5leGl0LnRleHQpCiAJCSooLmV4aXQuZGF0YSkKIAkJKiguZXhpdGNhbGwuZXhpdCkKIAl9CmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL0tjb25maWcgYi9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWIzMDc4MwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvS2NvbmZpZwpAQCAtMCwwICsxLDMxIEBACitpZiBQTEFURk9STV9BVDMyQVAKKworbWVudSAiQXRtZWwgQVZSMzIgQVAgb3B0aW9ucyIKKworY2hvaWNlCisJcHJvbXB0ICJBVDMyQVA3MDAwIHN0YXRpYyBtZW1vcnkgYnVzIHdpZHRoIgorCWRlcGVuZHMgb24gQ1BVX0FUMzJBUDcwMDAKKwlkZWZhdWx0IEFQNzAwMF8xNl9CSVRfU01DCisJaGVscAorCSAgRGVmaW5lIHRoZSB3aWR0aCBvZiB0aGUgQVA3MDAwIGV4dGVybmFsIHN0YXRpYyBtZW1vcnkgaW50ZXJmYWNlLgorCSAgVGhpcyBpcyB1c2VkIHRvIGRldGVybWluZSBob3cgdG8gbWFuZ2xlIHRoZSBhZGRyZXNzIGFuZC9vciBkYXRhCisJICB3aGVuIGRvaW5nIGxpdHRsZS1lbmRpYW4gcG9ydCBhY2Nlc3MuCisKKwkgIFRoZSBjdXJyZW50IGNvZGUgY2FuIG9ubHkgc3VwcG9ydCBhIHNpbmdsZSBleHRlcm5hbCBtZW1vcnkgYnVzCisJICB3aWR0aCBmb3IgYWxsIGNoaXAgc2VsZWN0cywgZXhjbHVkaW5nIHRoZSBmbGFzaCAod2hpY2ggaXMgdXNpbmcKKwkgIHJhdyBhY2Nlc3MgYW5kIGlzIHRodXMgbm90IGFmZmVjdGVkIGJ5IGFueSBvZiB0aGlzLikKKworY29uZmlnIEFQNzAwMF8zMl9CSVRfU01DCisJYm9vbCAiMzIgYml0IgorCitjb25maWcgQVA3MDAwXzE2X0JJVF9TTUMKKwlib29sICIxNiBiaXQiCisKK2NvbmZpZyBBUDcwMDBfOF9CSVRfU01DCisJYm9vbCAiOCBiaXQiCisKK2VuZGNob2ljZQorCitlbmRtZW51CisKK2VuZGlmICMgUExBVEZPUk1fQVQzMkFQCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL01ha2VmaWxlIGIvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9NYWtlZmlsZQppbmRleCBiMjFiZWE5Li5mMWQzOTU3IDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL01ha2VmaWxlCisrKyBiL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvTWFrZWZpbGUKQEAgLTEsMiArMSwzIEBACiBvYmoteQkJCQkrPSBhdDMyYXAubyBjbG9jay5vIGludGMubyBleHRpbnQubyBwaW8ubyBoc21jLm8KIG9iai0kKENPTkZJR19DUFVfQVQzMkFQNzAwMCkJKz0gYXQzMmFwNzAwMC5vCitvYmotJChDT05GSUdfQ1BVX0FUMzJBUDcwMDApCSs9IHRpbWUtdGMubwpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9hdDMyYXA3MDAwLmMgYi9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2F0MzJhcDcwMDAuYwppbmRleCA0NzI3MDNmLi41NmRiNDViIDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2F0MzJhcDcwMDAuYworKysgYi9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2F0MzJhcDcwMDAuYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPGFzbS9hcmNoL3NtLmg+CiAKICNpbmNsdWRlICJjbG9jay5oIgorI2luY2x1ZGUgImhtYXRyaXguaCIKICNpbmNsdWRlICJwaW8uaCIKICNpbmNsdWRlICJzbS5oIgogCkBAIC00MTYsNyArNDE3LDE1IEBACiAJLnJlc291cmNlCT0gc21fcmVzb3VyY2UsCiAJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHNtX3Jlc291cmNlKSwKIH07Ci1ERVZfQ0xLKHBjbGssIGF0MzJfc20sIHBiYiwgMCk7CitzdGF0aWMgc3RydWN0IGNsayBhdDMyX3NtX3BjbGsgPSB7CisJLm5hbWUJCT0gInBjbGsiLAorCS5kZXYJCT0gJmF0MzJfc21fZGV2aWNlLmRldiwKKwkucGFyZW50CQk9ICZwYmJfY2xrLAorCS5tb2RlCQk9IHBiYl9jbGtfbW9kZSwKKwkuZ2V0X3JhdGUJPSBwYmJfY2xrX2dldF9yYXRlLAorCS51c2VycwkJPSAxLAorCS5pbmRleAkJPSAwLAorfTsKIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBpbnRjMF9yZXNvdXJjZVtdID0gewogCVBCTUVNKDB4ZmZmMDA0MDApLApAQCAtNDQyLDYgKzQ1MSw3IEBACiAJLm1vZGUJCT0gaHNiX2Nsa19tb2RlLAogCS5nZXRfcmF0ZQk9IGhzYl9jbGtfZ2V0X3JhdGUsCiAJLnVzZXJzCQk9IDEsCisJLmluZGV4CQk9IDMsCiB9OwogCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIHNtYzBfcmVzb3VyY2VbXSA9IHsKQEAgLTQ2Nyw2ICs0NzcsNTcgQEAKIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBITUFUUklYCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc3RydWN0IGNsayBobWF0cml4X2NsayA9IHsKKwkubmFtZQkJPSAiaG1hdHJpeF9jbGsiLAorCS5wYXJlbnQJCT0gJnBiYl9jbGssCisJLm1vZGUJCT0gcGJiX2Nsa19tb2RlLAorCS5nZXRfcmF0ZQk9IHBiYl9jbGtfZ2V0X3JhdGUsCisJLmluZGV4CQk9IDIsCisJLnVzZXJzCQk9IDEsCit9OworI2RlZmluZSBITUFUUklYX0JBU0UJKCh2b2lkIF9faW9tZW0gKikweGZmZjAwODAwKQorCisjZGVmaW5lIGhtYXRyaXhfcmVhZGwocmVnKQkJCQkJXAorCV9fcmF3X3JlYWRsKChITUFUUklYX0JBU0UpICsgSE1BVFJJWF8jI3JlZykKKyNkZWZpbmUgaG1hdHJpeF93cml0ZWwocmVnLHZhbHVlKQkJCQlcCisJX19yYXdfd3JpdGVsKCh2YWx1ZSksIChITUFUUklYX0JBU0UpICsgSE1BVFJJWF8jI3JlZykKKworLyoKKyAqIFNldCBiaXRzIGluIHRoZSBITUFUUklYIFNwZWNpYWwgRnVuY3Rpb24gUmVnaXN0ZXIgKFNGUikgdXNlZCBieSB0aGUKKyAqIEV4dGVybmFsIEJ1cyBJbnRlcmZhY2UgKEVCSSkuIFRoaXMgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIHNwZWNpYWwKKyAqIGZlYXR1cmVzIGxpa2UgQ29tcGFjdEZsYXNoIHN1cHBvcnQsIE5BTkQgRmxhc2ggc3VwcG9ydCwgZXRjLiBvbgorICogY2VydGFpbiBjaGlwc2VsZWN0cy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHNldF9lYmlfc2ZyX2JpdHModTMyIG1hc2spCit7CisJdTMyIHNmcjsKKworCWNsa19lbmFibGUoJmhtYXRyaXhfY2xrKTsKKwlzZnIgPSBobWF0cml4X3JlYWRsKFNGUjQpOworCXNmciB8PSBtYXNrOworCWhtYXRyaXhfd3JpdGVsKFNGUjQsIHNmcik7CisJY2xrX2Rpc2FibGUoJmhtYXRyaXhfY2xrKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBTeXN0ZW0gVGltZXIvQ291bnRlciAoVEMpCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBhdDMyX3N5c3RjMF9yZXNvdXJjZVtdID0geworCVBCTUVNKDB4ZmZmMDBjMDApLAorCUlSUSgyMiksCit9Oworc3RydWN0IHBsYXRmb3JtX2RldmljZSBhdDMyX3N5c3RjMF9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInN5c3RjIiwKKwkuaWQJCT0gMCwKKwkucmVzb3VyY2UJPSBhdDMyX3N5c3RjMF9yZXNvdXJjZSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoYXQzMl9zeXN0YzBfcmVzb3VyY2UpLAorfTsKK0RFVl9DTEsocGNsaywgYXQzMl9zeXN0YzAsIHBiYiwgMyk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiAgUElPCiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCkBAIC01MTQsNiArNTc1LDggQEAKIAlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnNtYzBfZGV2aWNlKTsKIAlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnBkY19kZXZpY2UpOwogCisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZhdDMyX3N5c3RjMF9kZXZpY2UpOworCiAJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZwaW8wX2RldmljZSk7CiAJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZwaW8xX2RldmljZSk7CiAJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZwaW8yX2RldmljZSk7CkBAIC05NTAsNiArMTAxMyw3IEBACiAJJnBiYl9jbGssCiAJJmF0MzJfc21fcGNsaywKIAkmYXQzMl9pbnRjMF9wY2xrLAorCSZobWF0cml4X2NsaywKIAkmZWJpX2NsaywKIAkmaHJhbWNfY2xrLAogCSZzbWMwX3BjbGssCkBAIC05NjIsNiArMTAyNiw3IEBACiAJJnBpbzJfbWNrLAogCSZwaW8zX21jaywKIAkmcGlvNF9tY2ssCisJJmF0MzJfc3lzdGMwX3BjbGssCiAJJmF0bWVsX3VzYXJ0MF91c2FydCwKIAkmYXRtZWxfdXNhcnQxX3VzYXJ0LAogCSZhdG1lbF91c2FydDJfdXNhcnQsCkBAIC0xMDI0LDYgKzEwODksOSBAQAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGF0MzJfY2xvY2tfbGlzdCk7IGkrKykgewogCQlzdHJ1Y3QgY2xrICpjbGsgPSBhdDMyX2Nsb2NrX2xpc3RbaV07CiAKKwkJaWYgKGNsay0+dXNlcnMgPT0gMCkKKwkJCWNvbnRpbnVlOworCiAJCWlmIChjbGstPm1vZGUgPT0gJmNwdV9jbGtfbW9kZSkKIAkJCWNwdV9tYXNrIHw9IDEgPDwgY2xrLT5pbmRleDsKIAkJZWxzZSBpZiAoY2xrLT5tb2RlID09ICZoc2JfY2xrX21vZGUpCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2htYXRyaXguaCBiL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvaG1hdHJpeC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMGJmYjYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2htYXRyaXguaApAQCAtMCwwICsxLDE4MiBAQAorLyoKKyAqIFJlZ2lzdGVyIGRlZmluaXRpb25zIGZvciBIaWdoLVNwZWVkIEJ1cyBNYXRyaXgKKyAqLworI2lmbmRlZiBfX0hNQVRSSVhfSAorI2RlZmluZSBfX0hNQVRSSVhfSAorCisvKiBITUFUUklYIHJlZ2lzdGVyIG9mZnNldHMgKi8KKyNkZWZpbmUgSE1BVFJJWF9NQ0ZHMAkJCQkweDAwMDAKKyNkZWZpbmUgSE1BVFJJWF9NQ0ZHMQkJCQkweDAwMDQKKyNkZWZpbmUgSE1BVFJJWF9NQ0ZHMgkJCQkweDAwMDgKKyNkZWZpbmUgSE1BVFJJWF9NQ0ZHMwkJCQkweDAwMGMKKyNkZWZpbmUgSE1BVFJJWF9NQ0ZHNAkJCQkweDAwMTAKKyNkZWZpbmUgSE1BVFJJWF9NQ0ZHNQkJCQkweDAwMTQKKyNkZWZpbmUgSE1BVFJJWF9NQ0ZHNgkJCQkweDAwMTgKKyNkZWZpbmUgSE1BVFJJWF9NQ0ZHNwkJCQkweDAwMWMKKyNkZWZpbmUgSE1BVFJJWF9NQ0ZHOAkJCQkweDAwMjAKKyNkZWZpbmUgSE1BVFJJWF9NQ0ZHOQkJCQkweDAwMjQKKyNkZWZpbmUgSE1BVFJJWF9NQ0ZHMTAJCQkJMHgwMDI4CisjZGVmaW5lIEhNQVRSSVhfTUNGRzExCQkJCTB4MDAyYworI2RlZmluZSBITUFUUklYX01DRkcxMgkJCQkweDAwMzAKKyNkZWZpbmUgSE1BVFJJWF9NQ0ZHMTMJCQkJMHgwMDM0CisjZGVmaW5lIEhNQVRSSVhfTUNGRzE0CQkJCTB4MDAzOAorI2RlZmluZSBITUFUUklYX01DRkcxNQkJCQkweDAwM2MKKyNkZWZpbmUgSE1BVFJJWF9TQ0ZHMAkJCQkweDAwNDAKKyNkZWZpbmUgSE1BVFJJWF9TQ0ZHMQkJCQkweDAwNDQKKyNkZWZpbmUgSE1BVFJJWF9TQ0ZHMgkJCQkweDAwNDgKKyNkZWZpbmUgSE1BVFJJWF9TQ0ZHMwkJCQkweDAwNGMKKyNkZWZpbmUgSE1BVFJJWF9TQ0ZHNAkJCQkweDAwNTAKKyNkZWZpbmUgSE1BVFJJWF9TQ0ZHNQkJCQkweDAwNTQKKyNkZWZpbmUgSE1BVFJJWF9TQ0ZHNgkJCQkweDAwNTgKKyNkZWZpbmUgSE1BVFJJWF9TQ0ZHNwkJCQkweDAwNWMKKyNkZWZpbmUgSE1BVFJJWF9TQ0ZHOAkJCQkweDAwNjAKKyNkZWZpbmUgSE1BVFJJWF9TQ0ZHOQkJCQkweDAwNjQKKyNkZWZpbmUgSE1BVFJJWF9TQ0ZHMTAJCQkJMHgwMDY4CisjZGVmaW5lIEhNQVRSSVhfU0NGRzExCQkJCTB4MDA2YworI2RlZmluZSBITUFUUklYX1NDRkcxMgkJCQkweDAwNzAKKyNkZWZpbmUgSE1BVFJJWF9TQ0ZHMTMJCQkJMHgwMDc0CisjZGVmaW5lIEhNQVRSSVhfU0NGRzE0CQkJCTB4MDA3OAorI2RlZmluZSBITUFUUklYX1NDRkcxNQkJCQkweDAwN2MKKyNkZWZpbmUgSE1BVFJJWF9QUkFTMAkJCQkweDAwODAKKyNkZWZpbmUgSE1BVFJJWF9QUkJTMAkJCQkweDAwODQKKyNkZWZpbmUgSE1BVFJJWF9QUkFTMQkJCQkweDAwODgKKyNkZWZpbmUgSE1BVFJJWF9QUkJTMQkJCQkweDAwOGMKKyNkZWZpbmUgSE1BVFJJWF9QUkFTMgkJCQkweDAwOTAKKyNkZWZpbmUgSE1BVFJJWF9QUkJTMgkJCQkweDAwOTQKKyNkZWZpbmUgSE1BVFJJWF9QUkFTMwkJCQkweDAwOTgKKyNkZWZpbmUgSE1BVFJJWF9QUkJTMwkJCQkweDAwOWMKKyNkZWZpbmUgSE1BVFJJWF9QUkFTNAkJCQkweDAwYTAKKyNkZWZpbmUgSE1BVFJJWF9QUkJTNAkJCQkweDAwYTQKKyNkZWZpbmUgSE1BVFJJWF9QUkFTNQkJCQkweDAwYTgKKyNkZWZpbmUgSE1BVFJJWF9QUkJTNQkJCQkweDAwYWMKKyNkZWZpbmUgSE1BVFJJWF9QUkFTNgkJCQkweDAwYjAKKyNkZWZpbmUgSE1BVFJJWF9QUkJTNgkJCQkweDAwYjQKKyNkZWZpbmUgSE1BVFJJWF9QUkFTNwkJCQkweDAwYjgKKyNkZWZpbmUgSE1BVFJJWF9QUkJTNwkJCQkweDAwYmMKKyNkZWZpbmUgSE1BVFJJWF9QUkFTOAkJCQkweDAwYzAKKyNkZWZpbmUgSE1BVFJJWF9QUkJTOAkJCQkweDAwYzQKKyNkZWZpbmUgSE1BVFJJWF9QUkFTOQkJCQkweDAwYzgKKyNkZWZpbmUgSE1BVFJJWF9QUkJTOQkJCQkweDAwY2MKKyNkZWZpbmUgSE1BVFJJWF9QUkFTMTAJCQkJMHgwMGQwCisjZGVmaW5lIEhNQVRSSVhfUFJCUzEwCQkJCTB4MDBkNAorI2RlZmluZSBITUFUUklYX1BSQVMxMQkJCQkweDAwZDgKKyNkZWZpbmUgSE1BVFJJWF9QUkJTMTEJCQkJMHgwMGRjCisjZGVmaW5lIEhNQVRSSVhfUFJBUzEyCQkJCTB4MDBlMAorI2RlZmluZSBITUFUUklYX1BSQlMxMgkJCQkweDAwZTQKKyNkZWZpbmUgSE1BVFJJWF9QUkFTMTMJCQkJMHgwMGU4CisjZGVmaW5lIEhNQVRSSVhfUFJCUzEzCQkJCTB4MDBlYworI2RlZmluZSBITUFUUklYX1BSQVMxNAkJCQkweDAwZjAKKyNkZWZpbmUgSE1BVFJJWF9QUkJTMTQJCQkJMHgwMGY0CisjZGVmaW5lIEhNQVRSSVhfUFJBUzE1CQkJCTB4MDBmOAorI2RlZmluZSBITUFUUklYX1BSQlMxNQkJCQkweDAwZmMKKyNkZWZpbmUgSE1BVFJJWF9NUkNSCQkJCTB4MDEwMAorI2RlZmluZSBITUFUUklYX1NGUjAJCQkJMHgwMTEwCisjZGVmaW5lIEhNQVRSSVhfU0ZSMQkJCQkweDAxMTQKKyNkZWZpbmUgSE1BVFJJWF9TRlIyCQkJCTB4MDExOAorI2RlZmluZSBITUFUUklYX1NGUjMJCQkJMHgwMTFjCisjZGVmaW5lIEhNQVRSSVhfU0ZSNAkJCQkweDAxMjAKKyNkZWZpbmUgSE1BVFJJWF9TRlI1CQkJCTB4MDEyNAorI2RlZmluZSBITUFUUklYX1NGUjYJCQkJMHgwMTI4CisjZGVmaW5lIEhNQVRSSVhfU0ZSNwkJCQkweDAxMmMKKyNkZWZpbmUgSE1BVFJJWF9TRlI4CQkJCTB4MDEzMAorI2RlZmluZSBITUFUUklYX1NGUjkJCQkJMHgwMTM0CisjZGVmaW5lIEhNQVRSSVhfU0ZSMTAJCQkJMHgwMTM4CisjZGVmaW5lIEhNQVRSSVhfU0ZSMTEJCQkJMHgwMTNjCisjZGVmaW5lIEhNQVRSSVhfU0ZSMTIJCQkJMHgwMTQwCisjZGVmaW5lIEhNQVRSSVhfU0ZSMTMJCQkJMHgwMTQ0CisjZGVmaW5lIEhNQVRSSVhfU0ZSMTQJCQkJMHgwMTQ4CisjZGVmaW5lIEhNQVRSSVhfU0ZSMTUJCQkJMHgwMTRjCisKKy8qIEJpdGZpZWxkcyBpbiBNQ0ZHeCAqLworI2RlZmluZSBITUFUUklYX1VMQlRfT0ZGU0VUCQkJMAorI2RlZmluZSBITUFUUklYX1VMQlRfU0laRQkJCTMKKworLyogQml0ZmllbGRzIGluIFNDRkd4ICovCisjZGVmaW5lIEhNQVRSSVhfU0xPVF9DWUNMRV9PRkZTRVQJCTAKKyNkZWZpbmUgSE1BVFJJWF9TTE9UX0NZQ0xFX1NJWkUJCQk4CisjZGVmaW5lIEhNQVRSSVhfREVGTVNUUl9UWVBFX09GRlNFVAkJMTYKKyNkZWZpbmUgSE1BVFJJWF9ERUZNU1RSX1RZUEVfU0laRQkJMgorI2RlZmluZSBITUFUUklYX0ZJWEVEX0RFRk1TVFJfT0ZGU0VUCQkxOAorI2RlZmluZSBITUFUUklYX0ZJWEVEX0RFRk1TVFJfU0laRQkJNAorI2RlZmluZSBITUFUUklYX0FSQlRfT0ZGU0VUCQkJMjQKKyNkZWZpbmUgSE1BVFJJWF9BUkJUX1NJWkUJCQkyCisKKy8qIEJpdGZpZWxkcyBpbiBQUkFTeCAqLworI2RlZmluZSBITUFUUklYX00wUFJfT0ZGU0VUCQkJMAorI2RlZmluZSBITUFUUklYX00wUFJfU0laRQkJCTQKKyNkZWZpbmUgSE1BVFJJWF9NMVBSX09GRlNFVAkJCTQKKyNkZWZpbmUgSE1BVFJJWF9NMVBSX1NJWkUJCQk0CisjZGVmaW5lIEhNQVRSSVhfTTJQUl9PRkZTRVQJCQk4CisjZGVmaW5lIEhNQVRSSVhfTTJQUl9TSVpFCQkJNAorI2RlZmluZSBITUFUUklYX00zUFJfT0ZGU0VUCQkJMTIKKyNkZWZpbmUgSE1BVFJJWF9NM1BSX1NJWkUJCQk0CisjZGVmaW5lIEhNQVRSSVhfTTRQUl9PRkZTRVQJCQkxNgorI2RlZmluZSBITUFUUklYX000UFJfU0laRQkJCTQKKyNkZWZpbmUgSE1BVFJJWF9NNVBSX09GRlNFVAkJCTIwCisjZGVmaW5lIEhNQVRSSVhfTTVQUl9TSVpFCQkJNAorI2RlZmluZSBITUFUUklYX002UFJfT0ZGU0VUCQkJMjQKKyNkZWZpbmUgSE1BVFJJWF9NNlBSX1NJWkUJCQk0CisjZGVmaW5lIEhNQVRSSVhfTTdQUl9PRkZTRVQJCQkyOAorI2RlZmluZSBITUFUUklYX003UFJfU0laRQkJCTQKKworLyogQml0ZmllbGRzIGluIFBSQlN4ICovCisjZGVmaW5lIEhNQVRSSVhfTThQUl9PRkZTRVQJCQkwCisjZGVmaW5lIEhNQVRSSVhfTThQUl9TSVpFCQkJNAorI2RlZmluZSBITUFUUklYX005UFJfT0ZGU0VUCQkJNAorI2RlZmluZSBITUFUUklYX005UFJfU0laRQkJCTQKKyNkZWZpbmUgSE1BVFJJWF9NMTBQUl9PRkZTRVQJCQk4CisjZGVmaW5lIEhNQVRSSVhfTTEwUFJfU0laRQkJCTQKKyNkZWZpbmUgSE1BVFJJWF9NMTFQUl9PRkZTRVQJCQkxMgorI2RlZmluZSBITUFUUklYX00xMVBSX1NJWkUJCQk0CisjZGVmaW5lIEhNQVRSSVhfTTEyUFJfT0ZGU0VUCQkJMTYKKyNkZWZpbmUgSE1BVFJJWF9NMTJQUl9TSVpFCQkJNAorI2RlZmluZSBITUFUUklYX00xM1BSX09GRlNFVAkJCTIwCisjZGVmaW5lIEhNQVRSSVhfTTEzUFJfU0laRQkJCTQKKyNkZWZpbmUgSE1BVFJJWF9NMTRQUl9PRkZTRVQJCQkyNAorI2RlZmluZSBITUFUUklYX00xNFBSX1NJWkUJCQk0CisjZGVmaW5lIEhNQVRSSVhfTTE1UFJfT0ZGU0VUCQkJMjgKKyNkZWZpbmUgSE1BVFJJWF9NMTVQUl9TSVpFCQkJNAorCisvKiBCaXRmaWVsZHMgaW4gU0ZSNCAqLworI2RlZmluZSBITUFUUklYX0NTMUFfT0ZGU0VUCQkJMQorI2RlZmluZSBITUFUUklYX0NTMUFfU0laRQkJCTEKKyNkZWZpbmUgSE1BVFJJWF9DUzNBX09GRlNFVAkJCTMKKyNkZWZpbmUgSE1BVFJJWF9DUzNBX1NJWkUJCQkxCisjZGVmaW5lIEhNQVRSSVhfQ1M0QV9PRkZTRVQJCQk0CisjZGVmaW5lIEhNQVRSSVhfQ1M0QV9TSVpFCQkJMQorI2RlZmluZSBITUFUUklYX0NTNUFfT0ZGU0VUCQkJNQorI2RlZmluZSBITUFUUklYX0NTNUFfU0laRQkJCTEKKyNkZWZpbmUgSE1BVFJJWF9EQlBVQ19PRkZTRVQJCQk4CisjZGVmaW5lIEhNQVRSSVhfREJQVUNfU0laRQkJCTEKKworLyogQ29uc3RhbnRzIGZvciBVTEJUICovCisjZGVmaW5lIEhNQVRSSVhfVUxCVF9JTkZJTklURQkJCTAKKyNkZWZpbmUgSE1BVFJJWF9VTEJUX1NJTkdMRQkJCTEKKyNkZWZpbmUgSE1BVFJJWF9VTEJUX0ZPVVJfQkVBVAkJCTIKKyNkZWZpbmUgSE1BVFJJWF9VTEJUX0VJR0hUX0JFQVQJCQkzCisjZGVmaW5lIEhNQVRSSVhfVUxCVF9TSVhURUVOX0JFQVQJCTQKKworLyogQ29uc3RhbnRzIGZvciBERUZNU1RSX1RZUEUgKi8KKyNkZWZpbmUgSE1BVFJJWF9ERUZNU1RSX1RZUEVfTk9fREVGQVVMVAkJMAorI2RlZmluZSBITUFUUklYX0RFRk1TVFJfVFlQRV9MQVNUX0RFRkFVTFQJMQorI2RlZmluZSBITUFUUklYX0RFRk1TVFJfVFlQRV9GSVhFRF9ERUZBVUxUCTIKKworLyogQ29uc3RhbnRzIGZvciBBUkJUICovCisjZGVmaW5lIEhNQVRSSVhfQVJCVF9ST1VORF9ST0JJTgkJMAorI2RlZmluZSBITUFUUklYX0FSQlRfRklYRURfUFJJT1JJVFkJCTEKKworLyogQml0IG1hbmlwdWxhdGlvbiBtYWNyb3MgKi8KKyNkZWZpbmUgSE1BVFJJWF9CSVQobmFtZSkJCQkJCVwKKwkoMSA8PCBITUFUUklYXyMjbmFtZSMjX09GRlNFVCkKKyNkZWZpbmUgSE1BVFJJWF9CRihuYW1lLHZhbHVlKQkJCQkJXAorCSgoKHZhbHVlKSAmICgoMSA8PCBITUFUUklYXyMjbmFtZSMjX1NJWkUpIC0gMSkpCQlcCisJIDw8IEhNQVRSSVhfIyNuYW1lIyNfT0ZGU0VUKQorI2RlZmluZSBITUFUUklYX0JGRVhUKG5hbWUsdmFsdWUpCQkJCVwKKwkoKCh2YWx1ZSkgPj4gSE1BVFJJWF8jI25hbWUjI19PRkZTRVQpCQkJXAorCSAmICgoMSA8PCBITUFUUklYXyMjbmFtZSMjX1NJWkUpIC0gMSkpCisjZGVmaW5lIEhNQVRSSVhfQkZJTlMobmFtZSx2YWx1ZSxvbGQpCQkJCVwKKwkoKChvbGQpICYgfigoKDEgPDwgSE1BVFJJWF8jI25hbWUjI19TSVpFKSAtIDEpCQlcCisJCSAgICA8PCBITUFUUklYXyMjbmFtZSMjX09GRlNFVCkpCQlcCisJIHwgSE1BVFJJWF9CRihuYW1lLHZhbHVlKSkKKworI2VuZGlmIC8qIF9fSE1BVFJJWF9IICovCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2hzbWMuYyBiL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvaHNtYy5jCmluZGV4IDc2OTE3MjEuLjVlMjJhNzUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvaHNtYy5jCisrKyBiL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvaHNtYy5jCkBAIC03NSwxMiArNzUsMzUgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJc3dpdGNoIChjb25maWctPm53YWl0X21vZGUpIHsKKwljYXNlIDA6CisJCW1vZGUgfD0gSFNNQ19CRihFWE5XX01PREUsIEhTTUNfRVhOV19NT0RFX0RJU0FCTEVEKTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQltb2RlIHw9IEhTTUNfQkYoRVhOV19NT0RFLCBIU01DX0VYTldfTU9ERV9SRVNFUlZFRCk7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJbW9kZSB8PSBIU01DX0JGKEVYTldfTU9ERSwgSFNNQ19FWE5XX01PREVfRlJPWkVOKTsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQltb2RlIHw9IEhTTUNfQkYoRVhOV19NT0RFLCBIU01DX0VYTldfTU9ERV9SRUFEWSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChjb25maWctPnRkZl9jeWNsZXMpIHsKKwkJbW9kZSB8PSBIU01DX0JGKFRERl9DWUNMRVMsIGNvbmZpZy0+dGRmX2N5Y2xlcyk7CisJfQorCiAJaWYgKGNvbmZpZy0+bnJkX2NvbnRyb2xsZWQpCiAJCW1vZGUgfD0gSFNNQ19CSVQoUkVBRF9NT0RFKTsKIAlpZiAoY29uZmlnLT5ud2VfY29udHJvbGxlZCkKIAkJbW9kZSB8PSBIU01DX0JJVChXUklURV9NT0RFKTsKIAlpZiAoY29uZmlnLT5ieXRlX3dyaXRlKQogCQltb2RlIHw9IEhTTUNfQklUKEJBVCk7CisJaWYgKGNvbmZpZy0+dGRmX21vZGUpCisJCW1vZGUgfD0gSFNNQ19CSVQoVERGX01PREUpOwogCiAJcHJfZGVidWcoInNtYyBjcyVkOiBzZXR1cC8lMDh4IHB1bHNlLyUwOHggY3ljbGUvJTA4eCBtb2RlLyUwOHhcbiIsCiAJCSBjcywgc2V0dXAsIHB1bHNlLCBjeWNsZSwgbW9kZSk7CmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL3RpbWUtdGMuYyBiL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvdGltZS10Yy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzMDcwYmQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL3RpbWUtdGMuYwpAQCAtMCwwICsxLDIxOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA3IEF0bWVsIENvcnBvcmF0aW9uCisgKgorICogQmFzZWQgb24gTUlQUyBpbXBsZW1lbnRhdGlvbiBhcmNoL21pcHMva2VybmVsL3RpbWUuYworICogICBDb3B5cmlnaHQgMjAwMSBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9jbG9ja3NvdXJjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKworI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgorI2luY2x1ZGUgPGFzbS9zeXNyZWcuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL3RpbWUuaD4KKworLyogaG93IG1hbnkgY291bnRlciBjeWNsZXMgaW4gYSBqaWZmeT8gKi8KK3N0YXRpYyB1MzIgY3ljbGVzX3Blcl9qaWZmeTsKKworLyogdGhlIGNvdW50IHZhbHVlIGZvciB0aGUgbmV4dCB0aW1lciBpbnRlcnJ1cHQgKi8KK3N0YXRpYyB1MzIgZXhwaXJlbG87CisKKy8qIHRoZSBJL08gcmVnaXN0ZXJzIG9mIHRoZSBUQyBtb2R1bGUgKi8KK3N0YXRpYyB2b2lkIF9faW9tZW0gKmlvcmVnczsKKworY3ljbGVfdCByZWFkX2N5Y2xlX2NvdW50KHZvaWQpCit7CisJcmV0dXJuIChjeWNsZV90KXRpbWVyX3JlYWQoaW9yZWdzLCAwLCBDVik7Cit9CisKK3N0cnVjdCBjbG9ja3NvdXJjZSBjbG9ja3NvdXJjZV9hdnIzMiA9IHsKKwkubmFtZQkJPSAiYXZyMzIiLAorCS5yYXRpbmcJCT0gMzQyLAorCS5yZWFkCQk9IHJlYWRfY3ljbGVfY291bnQsCisJLm1hc2sJCT0gQ0xPQ0tTT1VSQ0VfTUFTSygxNiksCisJLnNoaWZ0CQk9IDE2LAorCS5mbGFncwkJPSBDTE9DS19TT1VSQ0VfSVNfQ09OVElOVU9VUywKK307CisKK3N0YXRpYyB2b2lkIGF2cjMyX3RpbWVyX2Fjayh2b2lkKQoreworCXUxNiBjb3VudCA9IGV4cGlyZWxvOworCisJLyogQWNrIHRoaXMgdGltZXIgaW50ZXJydXB0IGFuZCBzZXQgdGhlIG5leHQgb25lLCB1c2UgYSB1MTYKKwkgKiB2YXJpYWJsZSBzbyBpdCB3aWxsIHdyYXAgYXJvdW5kIGNvcnJlY3RseSAqLworCWNvdW50ICs9IGN5Y2xlc19wZXJfamlmZnk7CisJZXhwaXJlbG8gPSBjb3VudDsKKwl0aW1lcl93cml0ZShpb3JlZ3MsIDAsIFJDLCBleHBpcmVsbyk7CisKKwkvKiBDaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBtaXNzZWQgYW55IHRpbWVyIGludGVycnVwdHMgKi8KKwljb3VudCA9IHRpbWVyX3JlYWQoaW9yZWdzLCAwLCBDVik7CisJaWYgKChjb3VudCAtIGV4cGlyZWxvKSA8IDB4N2ZmZikgeworCQlleHBpcmVsbyA9IGNvdW50ICsgY3ljbGVzX3Blcl9qaWZmeTsKKwkJdGltZXJfd3JpdGUoaW9yZWdzLCAwLCBSQywgZXhwaXJlbG8pOworCX0KK30KKwordTMyIGF2cjMyX2hwdF9yZWFkKHZvaWQpCit7CisJcmV0dXJuIHRpbWVyX3JlYWQoaW9yZWdzLCAwLCBDVik7Cit9CisKK3N0YXRpYyBpbnQgYXZyMzJfdGltZXJfY2FsY19kaXZfYW5kX3NldF9qaWZmaWVzKHN0cnVjdCBjbGsgKnBjbGspCit7CisJdW5zaWduZWQgaW50IGN5Y2xlc19tYXggPSAoY2xvY2tzb3VyY2VfYXZyMzIubWFzayArIDEpIC8gMjsKKwl1bnNpZ25lZCBpbnQgZGl2c1tdID0geyA0LCA4LCAxNiwgMzIgfTsKKwlpbnQgZGl2c19zaXplID0gc2l6ZW9mKGRpdnMpIC8gc2l6ZW9mKCpkaXZzKTsKKwlpbnQgaSA9IDA7CisJdW5zaWduZWQgbG9uZyBjb3VudF9oejsKKwl1bnNpZ25lZCBsb25nIHNoaWZ0OworCXVuc2lnbmVkIGxvbmcgbXVsdDsKKwlpbnQgY2xvY2tfZGl2ID0gLTE7CisJdTY0IHRtcDsKKworCXNoaWZ0ID0gY2xvY2tzb3VyY2VfYXZyMzIuc2hpZnQ7CisKKwlkbyB7CisJCWNvdW50X2h6ID0gY2xrX2dldF9yYXRlKHBjbGspIC8gZGl2c1tpXTsKKwkJbXVsdCA9IGNsb2Nrc291cmNlX2h6Mm11bHQoY291bnRfaHosIHNoaWZ0KTsKKwkJY2xvY2tzb3VyY2VfYXZyMzIubXVsdCA9IG11bHQ7CisKKwkJdG1wID0gVElDS19OU0VDOworCQl0bXAgPDw9IHNoaWZ0OworCQl0bXAgKz0gbXVsdCAvIDI7CisJCWRvX2Rpdih0bXAsIG11bHQpOworCisJCWN5Y2xlc19wZXJfamlmZnkgPSB0bXA7CisJfSB3aGlsZSAoY3ljbGVzX3Blcl9qaWZmeSA+IGN5Y2xlc19tYXggJiYgKytpIDwgZGl2c19zaXplKTsKKworCWNsb2NrX2RpdiA9IGkgKyAxOworCisJaWYgKGNsb2NrX2RpdiA+IGRpdnNfc2l6ZSkgeworCQlwcl9kZWJ1ZygidGltZXI6IGNvdWxkIG5vdCBjYWxjdWxhdGUgY2xvY2sgZGl2aWRlclxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCS8qIFNldCB0aGUgY2xvY2sgZGl2aWRlciAqLworCXRpbWVyX3dyaXRlKGlvcmVncywgMCwgQ01SLCBUSU1FUl9CRihDTVJfVENDTEtTLCBjbG9ja19kaXYpKTsKKworCXJldHVybiAwOworfQorCitpbnQgYXZyMzJfaHB0X2luaXQodW5zaWduZWQgaW50IGNvdW50KQoreworCXN0cnVjdCByZXNvdXJjZSAqcmVnczsKKwlzdHJ1Y3QgY2xrICpwY2xrOworCWludCBpcnEgPSAtMTsKKwlpbnQgcmV0ID0gMDsKKworCXJldCA9IC1FTlhJTzsKKworCWlycSA9IHBsYXRmb3JtX2dldF9pcnEoJmF0MzJfc3lzdGMwX2RldmljZSwgMCk7CisJaWYgKGlycSA8IDApIHsKKwkJcHJfZGVidWcoInRpbWVyOiBjb3VsZCBub3QgZ2V0IGlycVxuIik7CisJCWdvdG8gb3V0X2Vycm9yOworCX0KKworCXBjbGsgPSBjbGtfZ2V0KCZhdDMyX3N5c3RjMF9kZXZpY2UuZGV2LCAicGNsayIpOworCWlmIChJU19FUlIocGNsaykpIHsKKwkJcHJfZGVidWcoInRpbWVyOiBjb3VsZCBub3QgZ2V0IGNsazogJWxkXG4iLCBQVFJfRVJSKHBjbGspKTsKKwkJZ290byBvdXRfZXJyb3I7CisJfQorCWNsa19lbmFibGUocGNsayk7CisKKwlyZWdzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKCZhdDMyX3N5c3RjMF9kZXZpY2UsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIXJlZ3MpIHsKKwkJcHJfZGVidWcoInRpbWVyOiBjb3VsZCBub3QgZ2V0IHJlc291cmNlXG4iKTsKKwkJZ290byBvdXRfZXJyb3JfY2xrOworCX0KKworCWlvcmVncyA9IGlvcmVtYXAocmVncy0+c3RhcnQsIHJlZ3MtPmVuZCAtIHJlZ3MtPnN0YXJ0ICsgMSk7CisJaWYgKCFpb3JlZ3MpIHsKKwkJcHJfZGVidWcoInRpbWVyOiBjb3VsZCBub3QgZ2V0IGlvcmVnc1xuIik7CisJCWdvdG8gb3V0X2Vycm9yX2NsazsKKwl9CisKKwlyZXQgPSBhdnIzMl90aW1lcl9jYWxjX2Rpdl9hbmRfc2V0X2ppZmZpZXMocGNsayk7CisJaWYgKHJldCkKKwkJZ290byBvdXRfZXJyb3JfaW87CisKKwlyZXQgPSBzZXR1cF9pcnEoaXJxLCAmdGltZXJfaXJxYWN0aW9uKTsKKwlpZiAocmV0KSB7CisJCXByX2RlYnVnKCJ0aW1lcjogY291bGQgbm90IHJlcXVlc3QgaXJxICVkOiAlZFxuIiwKKwkJCQlpcnEsIHJldCk7CisJCWdvdG8gb3V0X2Vycm9yX2lvOworCX0KKworCWV4cGlyZWxvID0gKHRpbWVyX3JlYWQoaW9yZWdzLCAwLCBDVikgLyBjeWNsZXNfcGVyX2ppZmZ5ICsgMSkKKwkJKiBjeWNsZXNfcGVyX2ppZmZ5OworCisJLyogRW5hYmxlIGNsb2NrIGFuZCBpbnRlcnJ1cHRzIG9uIFJDIGNvbXBhcmUgKi8KKwl0aW1lcl93cml0ZShpb3JlZ3MsIDAsIENDUiwgVElNRVJfQklUKENDUl9DTEtFTikpOworCXRpbWVyX3dyaXRlKGlvcmVncywgMCwgSUVSLCBUSU1FUl9CSVQoSUVSX0NQQ1MpKTsKKwkvKiBTZXQgY3ljbGVzIHRvIGZpcnN0IGludGVycnVwdCAqLworCXRpbWVyX3dyaXRlKGlvcmVncywgMCwgIFJDLCBleHBpcmVsbyk7CisKKwlwcmludGsoS0VSTl9JTkZPICJ0aW1lcjogQVQzMkFQIHN5c3RlbSB0aW1lci9jb3VudGVyIGF0IDB4JXAgaXJxICVkXG4iLAorCQkJaW9yZWdzLCBpcnEpOworCisJcmV0dXJuIDA7CisKK291dF9lcnJvcl9pbzoKKwlpb3VubWFwKGlvcmVncyk7CitvdXRfZXJyb3JfY2xrOgorCWNsa19wdXQocGNsayk7CitvdXRfZXJyb3I6CisJcmV0dXJuIHJldDsKK30KKworaW50IGF2cjMyX2hwdF9zdGFydCh2b2lkKQoreworCXRpbWVyX3dyaXRlKGlvcmVncywgMCwgQ0NSLCBUSU1FUl9CSVQoQ0NSX1NXVFJHKSk7CisJcmV0dXJuIDA7Cit9CisKK2lycXJldHVybl90IHRpbWVyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJdW5zaWduZWQgaW50IHNyID0gdGltZXJfcmVhZChpb3JlZ3MsIDAsIFNSKTsKKworCWlmIChzciAmIFRJTUVSX0JJVChTUl9DUENTKSkgeworCQkvKiBhY2sgdGltZXIgaW50ZXJydXB0IGFuZCB0cnkgdG8gc2V0IG5leHQgaW50ZXJydXB0ICovCisJCWF2cjMyX3RpbWVyX2FjaygpOworCisJCS8qCisJCSAqIENhbGwgdGhlIGdlbmVyaWMgdGltZXIgaW50ZXJydXB0IGhhbmRsZXIKKwkJICovCisJCXdyaXRlX3NlcWxvY2soJnh0aW1lX2xvY2spOworCQlkb190aW1lcigxKTsKKwkJd3JpdGVfc2VxdW5sb2NrKCZ4dGltZV9sb2NrKTsKKworCQkvKgorCQkgKiBJbiBVUCBtb2RlLCB3ZSBjYWxsIGxvY2FsX3RpbWVyX2ludGVycnVwdCgpIHRvIGRvIHByb2ZpbGluZworCQkgKiBhbmQgcHJvY2VzcyBhY2NvdW50aW5nLgorCQkgKgorCQkgKiBTTVAgaXMgbm90IHN1cHBvcnRlZCB5ZXQuCisJCSAqLworCQlsb2NhbF90aW1lcl9pbnRlcnJ1cHQoaXJxLCBkZXZfaWQpOworCisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwlyZXR1cm4gSVJRX05PTkU7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL21tL2ZhdWx0LmMgYi9hcmNoL2F2cjMyL21tL2ZhdWx0LmMKaW5kZXggNjc4NTU3Mi4uMTQ2ZWJkYiAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9tbS9mYXVsdC5jCisrKyBiL2FyY2gvYXZyMzIvbW0vZmF1bHQuYwpAQCAtMTYsMjYgKzE2LDggQEAKICNpbmNsdWRlIDxhc20va2RlYnVnLmg+CiAjaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+CiAjaW5jbHVkZSA8YXNtL3N5c3JlZy5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3RsYi5oPgotCi0jaWZkZWYgREVCVUcKLXN0YXRpYyB2b2lkIGR1bXBfY29kZSh1bnNpZ25lZCBsb25nIHBjKQotewotCWNoYXIgKnAgPSAoY2hhciAqKXBjOwotCWNoYXIgdmFsOwotCWludCBpOwotCi0KLQlwcmludGsoS0VSTl9ERUJVRyAiQ29kZToiKTsKLQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgewotCQlpZiAoX19nZXRfdXNlcih2YWwsIHAgKyBpKSkKLQkJCWJyZWFrOwotCQlwcmludGsoIiAlMDJ4IiwgdmFsKTsKLQl9Ci0JcHJpbnRrKCJcbiIpOwotfQotI2VuZGlmCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAogI2lmZGVmIENPTkZJR19LUFJPQkVTCiBBVE9NSUNfTk9USUZJRVJfSEVBRChub3RpZnlfcGFnZV9mYXVsdF9jaGFpbik7CkBAIC02OCwxNyArNTAsMTkgQEAKIH0KICNlbmRpZgogCitpbnQgZXhjZXB0aW9uX3RyYWNlID0gMTsKKwogLyoKICAqIFRoaXMgcm91dGluZSBoYW5kbGVzIHBhZ2UgZmF1bHRzLiBJdCBkZXRlcm1pbmVzIHRoZSBhZGRyZXNzIGFuZCB0aGUKICAqIHByb2JsZW0sIGFuZCB0aGVuIHBhc3NlcyBpdCBvZmYgdG8gb25lIG9mIHRoZSBhcHByb3ByaWF0ZSByb3V0aW5lcy4KICAqCiAgKiBlY3IgaXMgdGhlIEV4Y2VwdGlvbiBDYXVzZSBSZWdpc3Rlci4gUG9zc2libGUgdmFsdWVzIGFyZToKLSAqICAgNTogIFBhZ2Ugbm90IGZvdW5kIChpbnN0cnVjdGlvbiBhY2Nlc3MpCiAgKiAgIDY6ICBQcm90ZWN0aW9uIGZhdWx0IChpbnN0cnVjdGlvbiBhY2Nlc3MpCi0gKiAgIDEyOiBQYWdlIG5vdCBmb3VuZCAocmVhZCBhY2Nlc3MpCi0gKiAgIDEzOiBQYWdlIG5vdCBmb3VuZCAod3JpdGUgYWNjZXNzKQotICogICAxNDogUHJvdGVjdGlvbiBmYXVsdCAocmVhZCBhY2Nlc3MpCi0gKiAgIDE1OiBQcm90ZWN0aW9uIGZhdWx0ICh3cml0ZSBhY2Nlc3MpCisgKiAgIDE1OiBQcm90ZWN0aW9uIGZhdWx0IChyZWFkIGFjY2VzcykKKyAqICAgMTY6IFByb3RlY3Rpb24gZmF1bHQgKHdyaXRlIGFjY2VzcykKKyAqICAgMjA6IFBhZ2Ugbm90IGZvdW5kIChpbnN0cnVjdGlvbiBhY2Nlc3MpCisgKiAgIDI0OiBQYWdlIG5vdCBmb3VuZCAocmVhZCBhY2Nlc3MpCisgKiAgIDI4OiBQYWdlIG5vdCBmb3VuZCAod3JpdGUgYWNjZXNzKQogICovCiBhc21saW5rYWdlIHZvaWQgZG9fcGFnZV9mYXVsdCh1bnNpZ25lZCBsb25nIGVjciwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CkBAIC04OCw3ICs3Miw5IEBACiAJY29uc3Qgc3RydWN0IGV4Y2VwdGlvbl90YWJsZV9lbnRyeSAqZml4dXA7CiAJdW5zaWduZWQgbG9uZyBhZGRyZXNzOwogCXVuc2lnbmVkIGxvbmcgcGFnZTsKLQlpbnQgd3JpdGVhY2Nlc3MgPSAwOworCWludCB3cml0ZWFjY2VzczsKKwlsb25nIHNpZ25yOworCWludCBjb2RlOwogCiAJaWYgKG5vdGlmeV9wYWdlX2ZhdWx0KERJRV9QQUdFX0ZBVUxULCByZWdzLAogCQkJICAgICAgZWNyLCBTSUdTRUdWKSA9PSBOT1RJRllfU1RPUCkKQEAgLTk5LDYgKzg1LDkgQEAKIAl0c2sgPSBjdXJyZW50OwogCW1tID0gdHNrLT5tbTsKIAorCXNpZ25yID0gU0lHU0VHVjsKKwljb2RlID0gU0VHVl9NQVBFUlI7CisKIAkvKgogCSAqIElmIHdlJ3JlIGluIGFuIGludGVycnVwdCBvciBoYXZlIG5vIHVzZXIgY29udGV4dCwgd2UgbXVzdAogCSAqIG5vdCB0YWtlIHRoZSBmYXVsdC4uLgpAQCAtMTI1LDcgKzExNCw5IEBACiAJICogY2FuIGhhbmRsZSBpdC4uLgogCSAqLwogZ29vZF9hcmVhOgotCS8vcHJfZGVidWcoImdvb2QgYXJlYTogdm1fZmxhZ3MgPSAweCVseFxuIiwgdm1hLT52bV9mbGFncyk7CisJY29kZSA9IFNFR1ZfQUNDRVJSOworCXdyaXRlYWNjZXNzID0gMDsKKwogCXN3aXRjaCAoZWNyKSB7CiAJY2FzZSBFQ1JfUFJPVEVDVElPTl9YOgogCWNhc2UgRUNSX1RMQl9NSVNTX1g6CkBAIC0xNzYsNDYgKzE2NywyNCBAQAogCSAqIG1hcC4gRml4IGl0LCBidXQgY2hlY2sgaWYgaXQncyBrZXJuZWwgb3IgdXNlciBmaXJzdC4uLgogCSAqLwogYmFkX2FyZWE6Ci0JcHJfZGVidWcoIkJhZCBhcmVhIFslczoldV06IGFkZHIgJTA4bHgsIGVjciAlbHVcbiIsCi0JCSB0c2stPmNvbW0sIHRzay0+cGlkLCBhZGRyZXNzLCBlY3IpOwotCiAJdXBfcmVhZCgmbW0tPm1tYXBfc2VtKTsKIAogCWlmICh1c2VyX21vZGUocmVncykpIHsKLQkJLyogSG1tLi4ud2UgaGF2ZSB0byBwYXNzIGFkZHJlc3MgYW5kIGVjciBzb21laG93Li4uICovCi0JCS8qIHRzay0+dGhyZWFkLmFkZHJlc3MgPSBhZGRyZXNzOwotCQkgICB0c2stPnRocmVhZC5lcnJvcl9jb2RlID0gZWNyOyAqLwotI2lmZGVmIERFQlVHCi0JCXNob3dfcmVncyhyZWdzKTsKLQkJZHVtcF9jb2RlKHJlZ3MtPnBjKTsKLQotCQlwYWdlID0gc3lzcmVnX3JlYWQoUFRCUik7Ci0JCXByaW50aygicHRiciA9ICUwOGx4IiwgcGFnZSk7Ci0JCWlmIChwYWdlKSB7Ci0JCQlwYWdlID0gKCh1bnNpZ25lZCBsb25nICopcGFnZSlbYWRkcmVzcyA+PiAyMl07Ci0JCQlwcmludGsoIiBwZ2QgPSAlMDhseCIsIHBhZ2UpOwotCQkJaWYgKHBhZ2UgJiBfUEFHRV9QUkVTRU5UKSB7Ci0JCQkJcGFnZSAmPSBQQUdFX01BU0s7Ci0JCQkJYWRkcmVzcyAmPSAweDAwM2ZmMDAwOwotCQkJCXBhZ2UgPSAoKHVuc2lnbmVkIGxvbmcgKilfX3ZhKHBhZ2UpKVthZGRyZXNzID4+IFBBR0VfU0hJRlRdOwotCQkJCXByaW50aygiIHB0ZSA9ICUwOGx4XG4iLCBwYWdlKTsKLQkJCX0KLQkJfQotI2VuZGlmCi0JCXByX2RlYnVnKCJTZW5kaW5nIFNJR1NFR1YgdG8gUElEICVkLi4uXG4iLAotCQkJdHNrLT5waWQpOwotCQlmb3JjZV9zaWcoU0lHU0VHViwgdHNrKTsKKwkJaWYgKGV4Y2VwdGlvbl90cmFjZSkKKwkJCXByaW50aygiJXMlc1slZF06IHNlZ2ZhdWx0IGF0ICUwOGx4IHBjICUwOGx4ICIKKwkJCSAgICAgICAic3AgJTA4bHggZWNyICVsdVxuIiwKKwkJCSAgICAgICBpc19pbml0KHRzaykgPyBLRVJOX0VNRVJHIDogS0VSTl9JTkZPLAorCQkJICAgICAgIHRzay0+Y29tbSwgdHNrLT5waWQsIGFkZHJlc3MsIHJlZ3MtPnBjLAorCQkJICAgICAgIHJlZ3MtPnNwLCBlY3IpOworCQlfZXhjZXB0aW9uKFNJR1NFR1YsIHJlZ3MsIGNvZGUsIGFkZHJlc3MpOwogCQlyZXR1cm47CiAJfQogCiBub19jb250ZXh0OgotCXByX2RlYnVnKCJObyBjb250ZXh0XG4iKTsKLQogCS8qIEFyZSB3ZSBwcmVwYXJlZCB0byBoYW5kbGUgdGhpcyBrZXJuZWwgZmF1bHQ/ICovCiAJZml4dXAgPSBzZWFyY2hfZXhjZXB0aW9uX3RhYmxlcyhyZWdzLT5wYyk7CiAJaWYgKGZpeHVwKSB7CiAJCXJlZ3MtPnBjID0gZml4dXAtPmZpeHVwOwotCQlwcl9kZWJ1ZygiRm91bmQgZml4dXAgYXQgJTA4bHhcbiIsIGZpeHVwLT5maXh1cCk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTIzMCw3ICsxOTksNiBAQAogCQlwcmludGsoS0VSTl9BTEVSVAogCQkgICAgICAgIlVuYWJsZSB0byBoYW5kbGUga2VybmVsIHBhZ2luZyByZXF1ZXN0Iik7CiAJcHJpbnRrKCIgYXQgdmlydHVhbCBhZGRyZXNzICUwOGx4XG4iLCBhZGRyZXNzKTsKLQlwcmludGsoS0VSTl9BTEVSVCAicGMgPSAlMDhseFxuIiwgcmVncy0+cGMpOwogCiAJcGFnZSA9IHN5c3JlZ19yZWFkKFBUQlIpOwogCXByaW50ayhLRVJOX0FMRVJUICJwdGJyID0gJTA4bHgiLCBwYWdlKTsKQEAgLTI0MSwyMCArMjA5LDIwIEBACiAJCQlwYWdlICY9IFBBR0VfTUFTSzsKIAkJCWFkZHJlc3MgJj0gMHgwMDNmZjAwMDsKIAkJCXBhZ2UgPSAoKHVuc2lnbmVkIGxvbmcgKilfX3ZhKHBhZ2UpKVthZGRyZXNzID4+IFBBR0VfU0hJRlRdOwotCQkJcHJpbnRrKCIgcHRlID0gJTA4bHhcbiIsIHBhZ2UpOworCQkJcHJpbnRrKCIgcHRlID0gJTA4bHgiLCBwYWdlKTsKIAkJfQogCX0KLQlkaWUoIlxuT29wcyIsIHJlZ3MsIGVjcik7Ci0JZG9fZXhpdChTSUdLSUxMKTsKKwlwcmludGsoIlxuIik7CisJZGllKCJLZXJuZWwgYWNjZXNzIG9mIGJhZCBhcmVhIiwgcmVncywgc2lnbnIpOworCXJldHVybjsKIAogCS8qCiAJICogV2UgcmFuIG91dCBvZiBtZW1vcnksIG9yIHNvbWUgb3RoZXIgdGhpbmcgaGFwcGVuZWQgdG8gdXMKIAkgKiB0aGF0IG1hZGUgdXMgdW5hYmxlIHRvIGhhbmRsZSB0aGUgcGFnZSBmYXVsdCBncmFjZWZ1bGx5LgogCSAqLwogb3V0X29mX21lbW9yeToKLQlwcmludGsoIk91dCBvZiBtZW1vcnlcbiIpOwogCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7Ci0JaWYgKGN1cnJlbnQtPnBpZCA9PSAxKSB7CisJaWYgKGlzX2luaXQoY3VycmVudCkpIHsKIAkJeWllbGQoKTsKIAkJZG93bl9yZWFkKCZtbS0+bW1hcF9zZW0pOwogCQlnb3RvIHN1cnZpdmU7CkBAIC0yNjcsMjEgKzIzNSwyMCBAQAogZG9fc2lnYnVzOgogCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7CiAKLQkvKgotCSAqIFNlbmQgYSBzaWdidXMsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB3ZSB3ZXJlIGluIGtlcm5lbCBvcgotCSAqIHVzZXIgbW9kZS4KLQkgKi8KLQkvKiBhZGRyZXNzLCBlcnJvcl9jb2RlLCB0cmFwX25vLCAuLi4gKi8KLSNpZmRlZiBERUJVRwotCXNob3dfcmVncyhyZWdzKTsKLQlkdW1wX2NvZGUocmVncy0+cGMpOwotI2VuZGlmCi0JcHJfZGVidWcoIlNlbmRpbmcgU0lHQlVTIHRvIFBJRCAlZC4uLlxuIiwgdHNrLT5waWQpOwotCWZvcmNlX3NpZyhTSUdCVVMsIHRzayk7Ci0KIAkvKiBLZXJuZWwgbW9kZT8gSGFuZGxlIGV4Y2VwdGlvbnMgb3IgZGllICovCisJc2lnbnIgPSBTSUdCVVM7CisJY29kZSA9IEJVU19BRFJFUlI7CiAJaWYgKCF1c2VyX21vZGUocmVncykpCiAJCWdvdG8gbm9fY29udGV4dDsKKworCWlmIChleGNlcHRpb25fdHJhY2UpCisJCXByaW50aygiJXMlc1slZF06IGJ1cyBlcnJvciBhdCAlMDhseCBwYyAlMDhseCAiCisJCSAgICAgICAic3AgJTA4bHggZWNyICVsdVxuIiwKKwkJICAgICAgIGlzX2luaXQodHNrKSA/IEtFUk5fRU1FUkcgOiBLRVJOX0lORk8sCisJCSAgICAgICB0c2stPmNvbW0sIHRzay0+cGlkLCBhZGRyZXNzLCByZWdzLT5wYywKKwkJICAgICAgIHJlZ3MtPnNwLCBlY3IpOworCisJX2V4Y2VwdGlvbihTSUdCVVMsIHJlZ3MsIEJVU19BRFJFUlIsIGFkZHJlc3MpOwogfQogCiBhc21saW5rYWdlIHZvaWQgZG9fYnVzX2Vycm9yKHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IHdyaXRlX2FjY2VzcywKQEAgLTI5Miw4ICsyNTksNyBAQAogCSAgICAgICBhZGRyLCB3cml0ZV9hY2Nlc3MgPyAid3JpdGUiIDogInJlYWQiKTsKIAlwcmludGsoS0VSTl9JTkZPICJEVExCIGR1bXA6XG4iKTsKIAlkdW1wX2R0bGIoKTsKLQlkaWUoIkJ1cyBFcnJvciIsIHJlZ3MsIHdyaXRlX2FjY2Vzcyk7Ci0JZG9fZXhpdChTSUdLSUxMKTsKKwlkaWUoIkJ1cyBFcnJvciIsIHJlZ3MsIFNJR0tJTEwpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9tbS9pbml0LmMgYi9hcmNoL2F2cjMyL21tL2luaXQuYwppbmRleCA3MGRhNjg5Li44MmNmNzA4IDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL21tL2luaXQuYworKysgYi9hcmNoL2F2cjMyL21tL2luaXQuYwpAQCAtMTAsMTEgKzEwLDkgQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3N3YXAuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdHJkLmg+CiAjaW5jbHVkZSA8bGludXgvbW16b25lLmg+CiAjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KLSNpbmNsdWRlIDxsaW51eC9wZm4uaD4KICNpbmNsdWRlIDxsaW51eC9ub2RlbWFzay5oPgogCiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KQEAgLTc4LDI0MiArNzYsNiBAQAogCXByaW50ayAoIiVkIHBhZ2VzIHN3YXAgY2FjaGVkXG4iLCBjYWNoZWQpOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgcHJpbnRfbWVtb3J5X21hcChjb25zdCBjaGFyICp3aGF0LAotCQkJCSAgICBzdHJ1Y3QgdGFnX21lbV9yYW5nZSAqbWVtKQotewotCXByaW50ayAoIiVzOlxuIiwgd2hhdCk7Ci0JZm9yICg7IG1lbTsgbWVtID0gbWVtLT5uZXh0KSB7Ci0JCXByaW50ayAoIiAgJTA4bHggLSAlMDhseFxuIiwKLQkJCSh1bnNpZ25lZCBsb25nKW1lbS0+YWRkciwKLQkJCSh1bnNpZ25lZCBsb25nKShtZW0tPmFkZHIgKyBtZW0tPnNpemUpKTsKLQl9Ci19Ci0KLSNkZWZpbmUgTUFYX0xPV01FTQlISUdITUVNX1NUQVJUCi0jZGVmaW5lIE1BWF9MT1dNRU1fUEZOCVBGTl9ET1dOKE1BWF9MT1dNRU0pCi0KLS8qCi0gKiBTb3J0IGEgbGlzdCBvZiBtZW1vcnkgcmVnaW9ucyBpbi1wbGFjZSBieSBhc2NlbmRpbmcgYWRkcmVzcy4KLSAqCi0gKiBXZSdyZSB1c2luZyBidWJibGUgc29ydCBiZWNhdXNlIHdlIG9ubHkgaGF2ZSBzaW5nbHkgbGlua2VkIGxpc3RzCi0gKiB3aXRoIGZldyBlbGVtZW50cy4KLSAqLwotc3RhdGljIHZvaWQgX19pbml0IHNvcnRfbWVtX2xpc3Qoc3RydWN0IHRhZ19tZW1fcmFuZ2UgKipwbWVtKQotewotCWludCBkb25lOwotCXN0cnVjdCB0YWdfbWVtX3JhbmdlICoqYSwgKipiOwotCi0JaWYgKCEqcG1lbSkKLQkJcmV0dXJuOwotCi0JZG8gewotCQlkb25lID0gMTsKLQkJYSA9IHBtZW0sIGIgPSAmKCpwbWVtKS0+bmV4dDsKLQkJd2hpbGUgKCpiKSB7Ci0JCQlpZiAoKCphKS0+YWRkciA+ICgqYiktPmFkZHIpIHsKLQkJCQlzdHJ1Y3QgdGFnX21lbV9yYW5nZSAqdG1wOwotCQkJCXRtcCA9ICgqYiktPm5leHQ7Ci0JCQkJKCpiKS0+bmV4dCA9ICphOwotCQkJCSphID0gKmI7Ci0JCQkJKmIgPSB0bXA7Ci0JCQkJZG9uZSA9IDA7Ci0JCQl9Ci0JCQlhID0gJigqYSktPm5leHQ7Ci0JCQliID0gJigqYSktPm5leHQ7Ci0JCX0KLQl9IHdoaWxlICghZG9uZSk7Ci19Ci0KLS8qCi0gKiBGaW5kIGEgZnJlZSBtZW1vcnkgcmVnaW9uIGxhcmdlIGVub3VnaCBmb3Igc3RvcmluZyB0aGUKLSAqIGJvb3RtZW0gYml0bWFwLgotICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBfX2luaXQKLWZpbmRfYm9vdG1hcF9wZm4oY29uc3Qgc3RydWN0IHRhZ19tZW1fcmFuZ2UgKm1lbSkKLXsKLQl1bnNpZ25lZCBsb25nIGJvb3RtYXBfcGFnZXMsIGJvb3RtYXBfbGVuOwotCXVuc2lnbmVkIGxvbmcgbm9kZV9wYWdlcyA9IFBGTl9VUChtZW0tPnNpemUpOwotCXVuc2lnbmVkIGxvbmcgYm9vdG1hcF9hZGRyID0gbWVtLT5hZGRyOwotCXN0cnVjdCB0YWdfbWVtX3JhbmdlICpyZXNlcnZlZCA9IG1lbV9yZXNlcnZlZDsKLQlzdHJ1Y3QgdGFnX21lbV9yYW5nZSAqcmFtZGlzayA9IG1lbV9yYW1kaXNrOwotCXVuc2lnbmVkIGxvbmcga2Vybl9zdGFydCA9IHZpcnRfdG9fcGh5cyhfc3RleHQpOwotCXVuc2lnbmVkIGxvbmcga2Vybl9lbmQgPSB2aXJ0X3RvX3BoeXMoX2VuZCk7Ci0KLQlib290bWFwX3BhZ2VzID0gYm9vdG1lbV9ib290bWFwX3BhZ2VzKG5vZGVfcGFnZXMpOwotCWJvb3RtYXBfbGVuID0gYm9vdG1hcF9wYWdlcyA8PCBQQUdFX1NISUZUOwotCi0JLyoKLQkgKiBGaW5kIGEgbGFyZ2UgZW5vdWdoIHJlZ2lvbiB3aXRob3V0IHJlc2VydmVkIHBhZ2VzIGZvcgotCSAqIHN0b3JpbmcgdGhlIGJvb3RtZW0gYml0bWFwLiBXZSBjYW4gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlCi0JICogZmFjdCB0aGF0IGFsbCBsaXN0cyBoYXZlIGJlZW4gc29ydGVkLgotCSAqCi0JICogV2UgaGF2ZSB0byBjaGVjayBleHBsaWNpdGx5IHJlc2VydmVkIHJlZ2lvbnMgYXMgd2VsbCBhcyB0aGUKLQkgKiBrZXJuZWwgaW1hZ2UgYW5kIGFueSBSQU1ESVNLIGltYWdlcy4uLgotCSAqCi0JICogT2gsIGFuZCB3ZSBoYXZlIHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCBvdmVyd3JpdGUgdGhlIHRhZ2xpc3QKLQkgKiBzaW5jZSB3ZSdyZSBnb2luZyB0byB1c2UgaXQgdW50aWwgdGhlIGJvb3RtZW0gYWxsb2NhdG9yIGlzCi0JICogZnVsbHkgdXAgYW5kIHJ1bm5pbmcuCi0JICovCi0Jd2hpbGUgKDEpIHsKLQkJaWYgKChib290bWFwX2FkZHIgPCBrZXJuX2VuZCkgJiYKLQkJICAgICgoYm9vdG1hcF9hZGRyICsgYm9vdG1hcF9sZW4pID4ga2Vybl9zdGFydCkpCi0JCQlib290bWFwX2FkZHIgPSBrZXJuX2VuZDsKLQotCQl3aGlsZSAocmVzZXJ2ZWQgJiYKLQkJICAgICAgIChib290bWFwX2FkZHIgPj0gKHJlc2VydmVkLT5hZGRyICsgcmVzZXJ2ZWQtPnNpemUpKSkKLQkJCXJlc2VydmVkID0gcmVzZXJ2ZWQtPm5leHQ7Ci0KLQkJaWYgKHJlc2VydmVkICYmCi0JCSAgICAoKGJvb3RtYXBfYWRkciArIGJvb3RtYXBfbGVuKSA+PSByZXNlcnZlZC0+YWRkcikpIHsKLQkJCWJvb3RtYXBfYWRkciA9IHJlc2VydmVkLT5hZGRyICsgcmVzZXJ2ZWQtPnNpemU7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCXdoaWxlIChyYW1kaXNrICYmCi0JCSAgICAgICAoYm9vdG1hcF9hZGRyID49IChyYW1kaXNrLT5hZGRyICsgcmFtZGlzay0+c2l6ZSkpKQotCQkJcmFtZGlzayA9IHJhbWRpc2stPm5leHQ7Ci0KLQkJaWYgKCFyYW1kaXNrIHx8Ci0JCSAgICAoKGJvb3RtYXBfYWRkciArIGJvb3RtYXBfbGVuKSA8IHJhbWRpc2stPmFkZHIpKQotCQkJYnJlYWs7Ci0KLQkJYm9vdG1hcF9hZGRyID0gcmFtZGlzay0+YWRkciArIHJhbWRpc2stPnNpemU7Ci0JfQotCi0JaWYgKChQRk5fVVAoYm9vdG1hcF9hZGRyKSArIGJvb3RtYXBfbGVuKSA+PSAobWVtLT5hZGRyICsgbWVtLT5zaXplKSkKLQkJcmV0dXJuIH4wVUw7Ci0KLQlyZXR1cm4gUEZOX1VQKGJvb3RtYXBfYWRkcik7Ci19Ci0KLXZvaWQgX19pbml0IHNldHVwX2Jvb3RtZW0odm9pZCkKLXsKLQl1bnNpZ25lZCBib290bWFwX3NpemU7Ci0JdW5zaWduZWQgbG9uZyBmaXJzdF9wZm4sIGJvb3RtYXBfcGZuLCBwYWdlczsKLQl1bnNpZ25lZCBsb25nIG1heF9wZm4sIG1heF9sb3dfcGZuOwotCXVuc2lnbmVkIGxvbmcga2Vybl9zdGFydCA9IHZpcnRfdG9fcGh5cyhfc3RleHQpOwotCXVuc2lnbmVkIGxvbmcga2Vybl9lbmQgPSB2aXJ0X3RvX3BoeXMoX2VuZCk7Ci0JdW5zaWduZWQgbm9kZSA9IDA7Ci0Jc3RydWN0IHRhZ19tZW1fcmFuZ2UgKmJhbmssICpyZXM7Ci0KLQlzb3J0X21lbV9saXN0KCZtZW1fcGh5cyk7Ci0Jc29ydF9tZW1fbGlzdCgmbWVtX3Jlc2VydmVkKTsKLQotCXByaW50X21lbW9yeV9tYXAoIlBoeXNpY2FsIG1lbW9yeSIsIG1lbV9waHlzKTsKLQlwcmludF9tZW1vcnlfbWFwKCJSZXNlcnZlZCBtZW1vcnkiLCBtZW1fcmVzZXJ2ZWQpOwotCi0Jbm9kZXNfY2xlYXIobm9kZV9vbmxpbmVfbWFwKTsKLQotCWlmIChtZW1fcmFtZGlzaykgewotI2lmZGVmIENPTkZJR19CTEtfREVWX0lOSVRSRAotCQlpbml0cmRfc3RhcnQgPSAodW5zaWduZWQgbG9uZylfX3ZhKG1lbV9yYW1kaXNrLT5hZGRyKTsKLQkJaW5pdHJkX2VuZCA9IGluaXRyZF9zdGFydCArIG1lbV9yYW1kaXNrLT5zaXplOwotCi0JCXByaW50X21lbW9yeV9tYXAoIlJBTURJU0sgaW1hZ2VzIiwgbWVtX3JhbWRpc2spOwotCQlpZiAobWVtX3JhbWRpc2stPm5leHQpCi0JCQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCQkgICAgICAgIldhcm5pbmc6IE9ubHkgdGhlIGZpcnN0IFJBTURJU0sgaW1hZ2UgIgotCQkJICAgICAgICJ3aWxsIGJlIHVzZWRcbiIpOwotCQlzb3J0X21lbV9saXN0KCZtZW1fcmFtZGlzayk7Ci0jZWxzZQotCQlwcmludGsoS0VSTl9XQVJOSU5HICJSQU0gZGlzayBpbWFnZSBwcmVzZW50LCBidXQgIgotCQkgICAgICAgIm5vIGluaXRyZCBzdXBwb3J0IGluIGtlcm5lbCFcbiIpOwotI2VuZGlmCi0JfQotCi0JaWYgKG1lbV9waHlzLT5uZXh0KQotCQlwcmludGsoS0VSTl9XQVJOSU5HICJPbmx5IHVzaW5nIGZpcnN0IG1lbW9yeSBiYW5rXG4iKTsKLQotCWZvciAoYmFuayA9IG1lbV9waHlzOyBiYW5rOyBiYW5rID0gTlVMTCkgewotCQlmaXJzdF9wZm4gPSBQRk5fVVAoYmFuay0+YWRkcik7Ci0JCW1heF9sb3dfcGZuID0gbWF4X3BmbiA9IFBGTl9ET1dOKGJhbmstPmFkZHIgKyBiYW5rLT5zaXplKTsKLQkJYm9vdG1hcF9wZm4gPSBmaW5kX2Jvb3RtYXBfcGZuKGJhbmspOwotCQlpZiAoYm9vdG1hcF9wZm4gPiBtYXhfcGZuKQotCQkJcGFuaWMoIk5vIHNwYWNlIGZvciBib290bWVtIGJpdG1hcCFcbiIpOwotCi0JCWlmIChtYXhfbG93X3BmbiA+IE1BWF9MT1dNRU1fUEZOKSB7Ci0JCQltYXhfbG93X3BmbiA9IE1BWF9MT1dNRU1fUEZOOwotI2lmbmRlZiBDT05GSUdfSElHSE1FTQotCQkJLyoKLQkJCSAqIExvd21lbSBpcyBtZW1vcnkgdGhhdCBjYW4gYmUgYWRkcmVzc2VkCi0JCQkgKiBkaXJlY3RseSB0aHJvdWdoIFAxL1AyCi0JCQkgKi8KLQkJCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJCSAgICAgICAiTm9kZSAldTogT25seSAlbGQgTWlCIG9mIG1lbW9yeSB3aWxsIGJlIHVzZWQuXG4iLAotCQkJICAgICAgIG5vZGUsIE1BWF9MT1dNRU0gPj4gMjApOwotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiVXNlIGEgSElHSE1FTSBlbmFibGVkIGtlcm5lbC5cbiIpOwotI2Vsc2UKLSNlcnJvciBISUdITUVNIGlzIG5vdCBzdXBwb3J0ZWQgYnkgQVZSMzIgeWV0Ci0jZW5kaWYKLQkJfQotCi0JCS8qIEluaXRpYWxpemUgdGhlIGJvb3QtdGltZSBhbGxvY2F0b3Igd2l0aCBsb3cgbWVtb3J5IG9ubHkuICovCi0JCWJvb3RtYXBfc2l6ZSA9IGluaXRfYm9vdG1lbV9ub2RlKE5PREVfREFUQShub2RlKSwgYm9vdG1hcF9wZm4sCi0JCQkJCQkgZmlyc3RfcGZuLCBtYXhfbG93X3Bmbik7Ci0KLQkJcHJpbnRrKCJOb2RlICV1OiBiZGF0YSA9ICVwLCBiZGF0YS0+bm9kZV9ib290bWVtX21hcCA9ICVwXG4iLAotCQkgICAgICAgbm9kZSwgTk9ERV9EQVRBKG5vZGUpLT5iZGF0YSwKLQkJICAgICAgIE5PREVfREFUQShub2RlKS0+YmRhdGEtPm5vZGVfYm9vdG1lbV9tYXApOwotCi0JCS8qCi0JCSAqIFJlZ2lzdGVyIGZ1bGx5IGF2YWlsYWJsZSBSQU0gcGFnZXMgd2l0aCB0aGUgYm9vdG1lbQotCQkgKiBhbGxvY2F0b3IuCi0JCSAqLwotCQlwYWdlcyA9IG1heF9sb3dfcGZuIC0gZmlyc3RfcGZuOwotCQlmcmVlX2Jvb3RtZW1fbm9kZSAoTk9ERV9EQVRBKG5vZGUpLCBQRk5fUEhZUyhmaXJzdF9wZm4pLAotCQkJCSAgIFBGTl9QSFlTKHBhZ2VzKSk7Ci0KLQkJLyoKLQkJICogUmVzZXJ2ZSBzcGFjZSBmb3IgdGhlIGtlcm5lbCBpbWFnZSAoaWYgcHJlc2VudCBpbgotCQkgKiB0aGlzIG5vZGUpLi4uCi0JCSAqLwotCQlpZiAoKGtlcm5fc3RhcnQgPj0gUEZOX1BIWVMoZmlyc3RfcGZuKSkgJiYKLQkJICAgIChrZXJuX3N0YXJ0IDwgUEZOX1BIWVMobWF4X3BmbikpKSB7Ci0JCQlwcmludGsoIk5vZGUgJXU6IEtlcm5lbCBpbWFnZSAlMDhseCAtICUwOGx4XG4iLAotCQkJICAgICAgIG5vZGUsIGtlcm5fc3RhcnQsIGtlcm5fZW5kKTsKLQkJCXJlc2VydmVfYm9vdG1lbV9ub2RlKE5PREVfREFUQShub2RlKSwga2Vybl9zdGFydCwKLQkJCQkJICAgICBrZXJuX2VuZCAtIGtlcm5fc3RhcnQpOwotCQl9Ci0KLQkJLyogLi4udGhlIGJvb3RtZW0gYml0bWFwLi4uICovCi0JCXJlc2VydmVfYm9vdG1lbV9ub2RlKE5PREVfREFUQShub2RlKSwKLQkJCQkgICAgIFBGTl9QSFlTKGJvb3RtYXBfcGZuKSwKLQkJCQkgICAgIGJvb3RtYXBfc2l6ZSk7Ci0KLQkJLyogLi4uYW55IFJBTURJU0sgaW1hZ2VzLi4uICovCi0JCWZvciAocmVzID0gbWVtX3JhbWRpc2s7IHJlczsgcmVzID0gcmVzLT5uZXh0KSB7Ci0JCQlpZiAocmVzLT5hZGRyID4gUEZOX1BIWVMobWF4X3BmbikpCi0JCQkJYnJlYWs7Ci0KLQkJCWlmIChyZXMtPmFkZHIgPj0gUEZOX1BIWVMoZmlyc3RfcGZuKSkgewotCQkJCXByaW50aygiTm9kZSAldTogUkFNRElTSyAlMDhseCAtICUwOGx4XG4iLAotCQkJCSAgICAgICBub2RlLAotCQkJCSAgICAgICAodW5zaWduZWQgbG9uZylyZXMtPmFkZHIsCi0JCQkJICAgICAgICh1bnNpZ25lZCBsb25nKShyZXMtPmFkZHIgKyByZXMtPnNpemUpKTsKLQkJCQlyZXNlcnZlX2Jvb3RtZW1fbm9kZShOT0RFX0RBVEEobm9kZSksCi0JCQkJCQkgICAgIHJlcy0+YWRkciwgcmVzLT5zaXplKTsKLQkJCX0KLQkJfQotCi0JCS8qIC4uLmFuZCBhbnkgb3RoZXIgcmVzZXJ2ZWQgcmVnaW9ucy4gKi8KLQkJZm9yIChyZXMgPSBtZW1fcmVzZXJ2ZWQ7IHJlczsgcmVzID0gcmVzLT5uZXh0KSB7Ci0JCQlpZiAocmVzLT5hZGRyID4gUEZOX1BIWVMobWF4X3BmbikpCi0JCQkJYnJlYWs7Ci0KLQkJCWlmIChyZXMtPmFkZHIgPj0gUEZOX1BIWVMoZmlyc3RfcGZuKSkgewotCQkJCXByaW50aygiTm9kZSAldTogUmVzZXJ2ZWQgJTA4bHggLSAlMDhseFxuIiwKLQkJCQkgICAgICAgbm9kZSwKLQkJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpcmVzLT5hZGRyLAotCQkJCSAgICAgICAodW5zaWduZWQgbG9uZykocmVzLT5hZGRyICsgcmVzLT5zaXplKSk7Ci0JCQkJcmVzZXJ2ZV9ib290bWVtX25vZGUoTk9ERV9EQVRBKG5vZGUpLAotCQkJCQkJICAgICByZXMtPmFkZHIsIHJlcy0+c2l6ZSk7Ci0JCQl9Ci0JCX0KLQotCQlub2RlX3NldF9vbmxpbmUobm9kZSk7Ci0JfQotfQotCiAvKgogICogcGFnaW5nX2luaXQoKSBzZXRzIHVwIHRoZSBwYWdlIHRhYmxlcwogICoKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9kZWZjb25maWcgYi9hcmNoL2kzODYvZGVmY29uZmlnCmluZGV4IGY0ZWZkNjYuLmM5NjkxMWMgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9kZWZjb25maWcKKysrIGIvYXJjaC9pMzg2L2RlZmNvbmZpZwpAQCAtNjkyLDcgKzY5Miw2IEBACiBDT05GSUdfU0FUQV9WSUE9eQogIyBDT05GSUdfU0FUQV9WSVRFU1NFIGlzIG5vdCBzZXQKICMgQ09ORklHX1NBVEFfSU5JQzE2MlggaXMgbm90IHNldAotQ09ORklHX1NBVEFfSU5URUxfQ09NQklORUQ9eQogQ09ORklHX1NBVEFfQUNQST15CiAjIENPTkZJR19QQVRBX0FMSSBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX0FNRCBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2FjcGkvZWFybHlxdWlyay5jIGIvYXJjaC9pMzg2L2tlcm5lbC9hY3BpL2Vhcmx5cXVpcmsuYwppbmRleCBhN2QyMmQ5Li44ZjdlZmQzIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2FjcGkvZWFybHlxdWlyay5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS9lYXJseXF1aXJrLmMKQEAgLTIzLDEwICsyMywxMyBAQAogc3RhdGljIGludCBfX2luaXQgY2hlY2tfYnJpZGdlKGludCB2ZW5kb3IsIGludCBkZXZpY2UpCiB7CiAjaWZkZWYgQ09ORklHX0FDUEkKKwlzdGF0aWMgaW50IHdhcm5lZDsKIAkvKiBBY2NvcmRpbmcgdG8gTnZpZGlhIGFsbCB0aW1lciBvdmVycmlkZXMgYXJlIGJvZ3VzIHVubGVzcyBIUEVUCiAJICAgaXMgZW5hYmxlZC4gKi8KIAlpZiAoIWFjcGlfdXNlX3RpbWVyX292ZXJyaWRlICYmIHZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX05WSURJQSkgewotCQlpZiAoYWNwaV90YWJsZV9wYXJzZShBQ1BJX1NJR19IUEVULCBudmlkaWFfaHBldF9jaGVjaykpIHsKKwkJaWYgKCF3YXJuZWQgJiYgYWNwaV90YWJsZV9wYXJzZShBQ1BJX1NJR19IUEVULAorCQkJCQkJbnZpZGlhX2hwZXRfY2hlY2spKSB7CisJCQl3YXJuZWQgPSAxOwogCQkJYWNwaV9za2lwX3RpbWVyX292ZXJyaWRlID0gMTsKIAkJCSAgcHJpbnRrKEtFUk5fSU5GTyAiTnZpZGlhIGJvYXJkICIKICAgICAgICAgICAgICAgICAgICAgICAgImRldGVjdGVkLiBJZ25vcmluZyBBQ1BJICIKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9ocC9zaW0vc2ltZXRoLmMgYi9hcmNoL2lhNjQvaHAvc2ltL3NpbWV0aC5jCmluZGV4IDQyNGU5MjUuLmYyNjA3N2EgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9ocC9zaW0vc2ltZXRoLmMKKysrIGIvYXJjaC9pYTY0L2hwL3NpbS9zaW1ldGguYwpAQCAtNDI3LDcgKzQyNyw2IEBACiAJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IG1lbW9yeSBzcXVlZXplLiBkcm9wcGluZyBwYWNrZXQuXG4iLCBkZXYtPm5hbWUpOwogCQlyZXR1cm4gTlVMTDsKIAl9Ci0JbnNrYi0+ZGV2ID0gZGV2OwogCiAJc2tiX3Jlc2VydmUobnNrYiwgMik7CS8qIEFsaWduIElQIG9uIDE2IGJ5dGUgYm91bmRhcmllcyAqLwogCkBAIC00NzQsNyArNDczLDcgQEAKIAkJICogWFhYIEZpeCBtZQogCQkgKiBTaG91bGQgcmVhbGx5IGRvIGEgY3N1bStjb3B5IGhlcmUKIAkJICovCi0JCW1lbWNweShza2ItPmRhdGEsIGZyYW1lLCBsZW4pOworCQlza2JfY29weV90b19saW5lYXJfZGF0YShza2IsIGZyYW1lLCBsZW4pOwogI2VuZGlmCiAJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CiAKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9saWIvY3N1bV9wYXJ0aWFsX2NvcHkuYyBiL2FyY2gvaWE2NC9saWIvY3N1bV9wYXJ0aWFsX2NvcHkuYwppbmRleCA1MDNkZmU2Li4xMThkYWY1IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvbGliL2NzdW1fcGFydGlhbF9jb3B5LmMKKysrIGIvYXJjaC9pYTY0L2xpYi9jc3VtX3BhcnRpYWxfY29weS5jCkBAIC0xMjgsNiArMTI4LDggQEAKIAlyZXR1cm4gKF9fZm9yY2UgX193c3VtKXJlc3VsdDsKIH0KIAorRVhQT1JUX1NZTUJPTChjc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIpOworCiBfX3dzdW0KIGNzdW1fcGFydGlhbF9jb3B5X25vY2hlY2soY29uc3Qgdm9pZCAqc3JjLCB2b2lkICpkc3QsIGludCBsZW4sIF9fd3N1bSBzdW0pCiB7CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvc24va2VybmVsL3hwbmV0LmMgYi9hcmNoL2lhNjQvc24va2VybmVsL3hwbmV0LmMKaW5kZXggYzgxNzNkYi4uNTQxOWFjYiAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3NuL2tlcm5lbC94cG5ldC5jCisrKyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwveHBuZXQuYwpAQCAtMjMzLDcgKzIzMyw3IEBACiAJCQkiJWx1KVxuIiwgc2tiLT5kYXRhLCAmbXNnLT5kYXRhLAogCQkJKHNpemVfdCkgbXNnLT5lbWJlZGRlZF9ieXRlcyk7CiAKLQkJbWVtY3B5KHNrYi0+ZGF0YSwgJm1zZy0+ZGF0YSwgKHNpemVfdCkgbXNnLT5lbWJlZGRlZF9ieXRlcyk7CisJCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhKHNrYiwgJm1zZy0+ZGF0YSwgKHNpemVfdCltc2ctPmVtYmVkZGVkX2J5dGVzKTsKIAl9IGVsc2UgewogCQlkZXZfZGJnKHhwbmV0LCAidHJhbnNmZXJyaW5nIGJ1ZmZlciB0byB0aGUgc2tiLT5kYXRhIGFyZWE7XG5cdCIKIAkJCSJidGVfY29weSgweCVwLCAweCVwLCAlaHUpXG4iLCAodm9pZCAqKW1zZy0+YnVmX3BhLApAQCAtMjY0LDE3ICsyNjQsMTYgQEAKIAogCWRldl9kYmcoeHBuZXQsICI8c2tiLT5oZWFkPTB4JXAgc2tiLT5kYXRhPTB4JXAgc2tiLT50YWlsPTB4JXAgIgogCQkic2tiLT5lbmQ9MHglcCBza2ItPmxlbj0lZFxuIiwgKHZvaWQgKikgc2tiLT5oZWFkLAotCQkodm9pZCAqKSBza2ItPmRhdGEsICh2b2lkICopIHNrYi0+dGFpbCwgKHZvaWQgKikgc2tiLT5lbmQsCisJCSh2b2lkICopc2tiLT5kYXRhLCBza2JfdGFpbF9wb2ludGVyKHNrYiksIHNrYl9lbmRfcG9pbnRlcihza2IpLAogCQlza2ItPmxlbik7CiAKLQlza2ItPmRldiA9IHhwbmV0X2RldmljZTsKIAlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCB4cG5ldF9kZXZpY2UpOwogCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CiAKIAlkZXZfZGJnKHhwbmV0LCAicGFzc2luZyBza2IgdG8gbmV0d29yayBsYXllcjsgXG5cdHNrYi0+aGVhZD0weCVwICIKIAkJInNrYi0+ZGF0YT0weCVwIHNrYi0+dGFpbD0weCVwIHNrYi0+ZW5kPTB4JXAgc2tiLT5sZW49JWRcbiIsCi0JCSh2b2lkICopIHNrYi0+aGVhZCwgKHZvaWQgKikgc2tiLT5kYXRhLCAodm9pZCAqKSBza2ItPnRhaWwsCi0JCSh2b2lkICopIHNrYi0+ZW5kLCBza2ItPmxlbik7CisJCSh2b2lkICopc2tiLT5oZWFkLCAodm9pZCAqKXNrYi0+ZGF0YSwgc2tiX3RhaWxfcG9pbnRlcihza2IpLAorCQlza2JfZW5kX3BvaW50ZXIoc2tiKSwgc2tiLT5sZW4pOwogCiAKIAl4cG5ldF9kZXZpY2UtPmxhc3RfcnggPSBqaWZmaWVzOwpAQCAtNDc2LDcgKzQ3NSw3IEBACiAKIAlkZXZfZGJnKHhwbmV0LCAiPnNrYi0+aGVhZD0weCVwIHNrYi0+ZGF0YT0weCVwIHNrYi0+dGFpbD0weCVwICIKIAkJInNrYi0+ZW5kPTB4JXAgc2tiLT5sZW49JWRcbiIsICh2b2lkICopIHNrYi0+aGVhZCwKLQkJKHZvaWQgKikgc2tiLT5kYXRhLCAodm9pZCAqKSBza2ItPnRhaWwsICh2b2lkICopIHNrYi0+ZW5kLAorCQkodm9pZCAqKXNrYi0+ZGF0YSwgc2tiX3RhaWxfcG9pbnRlcihza2IpLCBza2JfZW5kX3BvaW50ZXIoc2tiKSwKIAkJc2tiLT5sZW4pOwogCiAKQEAgLTQ5OCw3ICs0OTcsNyBAQAogCiAJLyogZ2V0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpcnN0IGNhY2hlbGluZSBhbmQgZW5kIG9mIGxhc3QgKi8KIAlzdGFydF9hZGRyID0gKCh1NjQpIHNrYi0+ZGF0YSAmIH4oTDFfQ0FDSEVfQllURVMgLSAxKSk7Ci0JZW5kX2FkZHIgPSBMMV9DQUNIRV9BTElHTigodTY0KSBza2ItPnRhaWwpOworCWVuZF9hZGRyID0gTDFfQ0FDSEVfQUxJR04oKHU2NClza2JfdGFpbF9wb2ludGVyKHNrYikpOwogCiAJLyogY2FsY3VsYXRlIGhvdyBtYW55IGJ5dGVzIHRvIGVtYmVkIGluIHRoZSBYUEMgbWVzc2FnZSAqLwogCWVtYmVkZGVkX2J5dGVzID0gMDsKQEAgLTU2NywxNCArNTY2LDE1IEBACiAJCQltc2ctPnZlcnNpb24gPSBYUE5FVF9WRVJTSU9OX0VNQkVEOwogCQkJZGV2X2RiZyh4cG5ldCwgImNhbGxpbmcgbWVtY3B5KDB4JXAsIDB4JXAsIDB4JWx4KVxuIiwKIAkJCQkmbXNnLT5kYXRhLCBza2ItPmRhdGEsIChzaXplX3QpIGVtYmVkZGVkX2J5dGVzKTsKLQkJCW1lbWNweSgmbXNnLT5kYXRhLCBza2ItPmRhdGEsIChzaXplX3QpIGVtYmVkZGVkX2J5dGVzKTsKKwkJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCAmbXNnLT5kYXRhLAorCQkJCQkJICAoc2l6ZV90KWVtYmVkZGVkX2J5dGVzKTsKIAkJfSBlbHNlIHsKIAkJCW1zZy0+dmVyc2lvbiA9IFhQTkVUX1ZFUlNJT047CiAJCX0KIAkJbXNnLT5tYWdpYyA9IFhQTkVUX01BR0lDOwogCQltc2ctPnNpemUgPSBlbmRfYWRkciAtIHN0YXJ0X2FkZHI7CiAJCW1zZy0+bGVhZGluX2lnbm9yZSA9ICh1NjQpIHNrYi0+ZGF0YSAtIHN0YXJ0X2FkZHI7Ci0JCW1zZy0+dGFpbG91dF9pZ25vcmUgPSBlbmRfYWRkciAtICh1NjQpIHNrYi0+dGFpbDsKKwkJbXNnLT50YWlsb3V0X2lnbm9yZSA9IGVuZF9hZGRyIC0gKHU2NClza2JfdGFpbF9wb2ludGVyKHNrYik7CiAJCW1zZy0+YnVmX3BhID0gX19wYShzdGFydF9hZGRyKTsKIAogCQlkZXZfZGJnKHhwbmV0LCAic2VuZGluZyBYUEMgbWVzc2FnZSB0byAlZDolZFxubXNnLT5idWZfcGE9IgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL0tjb25maWcgYi9hcmNoL21pcHMvS2NvbmZpZwppbmRleCBjNzhiMTQzLi4xMzBkODI1IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvS2NvbmZpZworKysgYi9hcmNoL21pcHMvS2NvbmZpZwpAQCAtMTAsNyArMTAsNiBAQAogCiBjb25maWcgWk9ORV9ETUEKIAlib29sCi0JZGVmYXVsdCB5CiAKIGNob2ljZQogCXByb21wdCAiU3lzdGVtIHR5cGUiCkBAIC0xNjUsNyArMTY0LDcgQEAKIAlzZWxlY3QgSFdfSEFTX1BDSQogCXNlbGVjdCBJODI1OQogCXNlbGVjdCBJUlFfQ1BVCi0Jc2VsZWN0IE1JUFNfR1Q2NDExMQorCXNlbGVjdCBQQ0lfR1Q2NFhYWF9QQ0kwCiAJc2VsZWN0IFNZU19IQVNfQ1BVX05FVkFEQQogCXNlbGVjdCBTWVNfSEFTX0VBUkxZX1BSSU5USwogCXNlbGVjdCBTWVNfU1VQUE9SVFNfMzJCSVRfS0VSTkVMCkBAIC0yMDcsNyArMjA2LDcgQEAKIAlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAogCXNlbGVjdCBETUFfTk9OQ09IRVJFTlQKIAlzZWxlY3QgSFdfSEFTX1BDSQotCXNlbGVjdCBNSVBTX0dUNjQxMjAKKwlzZWxlY3QgUENJX0dUNjRYWFhfUENJMAogCXNlbGVjdCBTWVNfSEFTX0NQVV9SNTAwMAogCXNlbGVjdCBTWVNfU1VQUE9SVFNfMzJCSVRfS0VSTkVMCiAJc2VsZWN0IFNZU19TVVBQT1JUU182NEJJVF9LRVJORUwKQEAgLTI0NSw3ICsyNDQsNyBAQAogCXNlbGVjdCBETUFfTk9OQ09IRVJFTlQKIAlzZWxlY3QgU1lTX0hBU19FQVJMWV9QUklOVEsKIAlzZWxlY3QgSFdfSEFTX1BDSQotCXNlbGVjdCBNSVBTX0dUNjQxMjAKKwlzZWxlY3QgUENJX0dUNjRYWFhfUENJMAogCXNlbGVjdCBNSVBTX05JTEU0CiAJc2VsZWN0IFI1MDAwX0NQVV9TQ0FDSEUKIAlzZWxlY3QgU1lTX0hBU19DUFVfUjUwMDAKQEAgLTI2Myw3ICsyNjIsNyBAQAogCXNlbGVjdCBIV19IQVNfUENJCiAJc2VsZWN0IE1JUFNfQk9BUkRTX0dFTgogCXNlbGVjdCBNSVBTX0JPTklUTzY0Ci0Jc2VsZWN0IE1JUFNfR1Q2NDEyMAorCXNlbGVjdCBQQ0lfR1Q2NFhYWF9QQ0kwCiAJc2VsZWN0IE1JUFNfTVNDCiAJc2VsZWN0IFJNNzAwMF9DUFVfU0NBQ0hFCiAJc2VsZWN0IFNXQVBfSU9fU1BBQ0UKQEAgLTI5Niw3ICsyOTUsNyBAQAogCXNlbGVjdCBNSVBTX0JPQVJEU19HRU4KIAlzZWxlY3QgTUlQU19CT05JVE82NAogCXNlbGVjdCBNSVBTX0NQVV9TQ0FDSEUKLQlzZWxlY3QgTUlQU19HVDY0MTIwCisJc2VsZWN0IFBDSV9HVDY0WFhYX1BDSTAKIAlzZWxlY3QgTUlQU19NU0MKIAlzZWxlY3QgU1dBUF9JT19TUEFDRQogCXNlbGVjdCBTWVNfSEFTX0NQVV9NSVBTMzJfUjEKQEAgLTM0MCw3ICszMzksNyBAQAogCXNlbGVjdCBCT09UX0VMRjMyCiAJc2VsZWN0IERNQV9OT05DT0hFUkVOVAogCXNlbGVjdCBIV19IQVNfUENJCi0Jc2VsZWN0IE1JUFNfR1Q2NDEyMAorCXNlbGVjdCBQQ0lfR1Q2NFhYWF9QQ0kwCiAJc2VsZWN0IFNXQVBfSU9fU1BBQ0UKIAlzZWxlY3QgU1lTX0hBU19DUFVfTUlQUzMyX1IxCiAJc2VsZWN0IFNZU19IQVNfQ1BVX01JUFMzMl9SMgpAQCAtMzk4LDcgKzM5Nyw3IEBACiAJc2VsZWN0IEhXX0hBU19QQ0kKIAlzZWxlY3QgSVJRX0NQVQogCXNlbGVjdCBJUlFfQ1BVX1JNN0sKLQlzZWxlY3QgTUlQU19HVDY0MTIwCisJc2VsZWN0IFBDSV9HVDY0WFhYX1BDSTAKIAlzZWxlY3QgUk03MDAwX0NQVV9TQ0FDSEUKIAlzZWxlY3QgU1dBUF9JT19TUEFDRQogCXNlbGVjdCBTWVNfSEFTX0NQVV9STTcwMDAKQEAgLTUwMSwxMCArNTAwLDggQEAKIAkgIGV0aGVyIHBvcnQgVVNCLCBBQzk3LCBQQ0ksIGV0Yy4KIAogY29uZmlnIE1BQ0hfVlI0MVhYCi0JYm9vbCAiTkVDIFZSNDFYWC1iYXNlZCBtYWNoaW5lcyIKKwlib29sICJORUMgVlI0MTAwIHNlcmllcyBiYXNlZCBtYWNoaW5lcyIKIAlzZWxlY3QgU1lTX0hBU19DUFVfVlI0MVhYCi0Jc2VsZWN0IFNZU19TVVBQT1JUU18zMkJJVF9LRVJORUwKLQlzZWxlY3QgU1lTX1NVUFBPUlRTXzY0QklUX0tFUk5FTCBpZiBFWFBFUklNRU5UQUwKIAlzZWxlY3QgR0VORVJJQ19IQVJESVJRU19OT19fRE9fSVJRCiAKIGNvbmZpZyBQTUNfWU9TRU1JVEUKQEAgLTc3OSw2ICs3NzYsNyBAQAogCXNlbGVjdCBTWVNfU1VQUE9SVFNfTElUVExFX0VORElBTgogCXNlbGVjdCBTWVNfU1VQUE9SVFNfQklHX0VORElBTgogCXNlbGVjdCBUT1NISUJBX0JPQVJEUworCXNlbGVjdCBHRU5FUklDX0hBUkRJUlFTX05PX19ET19JUlEKIAogY29uZmlnIFRPU0hJQkFfUkJUWDQ5MjcKIAlib29sICJUb3NoaWJhIFRCVFg0OVsyM103IGJvYXJkIgpAQCAtOTIyLDYgKzkyMCw3IEBACiAKIGNvbmZpZyBHRU5FUklDX0lTQV9ETUEKIAlib29sCisJc2VsZWN0IFpPTkVfRE1BCiAKIGNvbmZpZyBJODI1OQogCWJvb2wKQEAgLTk0NSw2ICs5NDQsNyBAQAogCiBjb25maWcgR0VORVJJQ19JU0FfRE1BX1NVUFBPUlRfQlJPS0VOCiAJYm9vbAorCXNlbGVjdCBaT05FX0RNQQogCiAjCiAjIEVuZGlhbmVzcyBzZWxlY3Rpb24uICBTdWZmaWNpZW50bHkgb2JzY3VyZSBzbyBtYW55IHVzZXJzIGRvbid0IGtub3cgd2hhdCB0bwpAQCAtOTk5LDEwICs5OTksNyBAQAogY29uZmlnIE1JUFNfQk9BUkRTX0dFTgogCWJvb2wKIAotY29uZmlnIE1JUFNfR1Q2NDExMQotCWJvb2wKLQotY29uZmlnIE1JUFNfR1Q2NDEyMAorY29uZmlnIFBDSV9HVDY0WFhYX1BDSTAKIAlib29sCiAKIGNvbmZpZyBNSVBTX1RYMzkyNwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL01ha2VmaWxlIGIvYXJjaC9taXBzL01ha2VmaWxlCmluZGV4IDkyYmNhNmEuLmYyZjc0MmQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9NYWtlZmlsZQorKysgYi9hcmNoL21pcHMvTWFrZWZpbGUKQEAgLTUzMCwyNSArNTMwLDI5IEBACiBsb2FkLSQoQ09ORklHX1NHSV9JUDMyKQkJKz0gMHhmZmZmZmZmZjgwMDA0MDAwCiAKICMKLSMgU2lieXRlIFNCMTI1MCBTT0MKKyMgU2lieXRlIFNCMTI1MC9CQ00xNDgwIFNPQwogIwogIyBUaGlzIGlzIGEgTElCIHNvIHRoYXQgaXQgbGlua3MgYXQgdGhlIGVuZCwgYW5kIGluaXRjYWxscyBhcmUgbGF0ZXIKICMgdGhlIHNlcXVlbmNlOyBidXQgaXQgaXMgYnVpbHQgYXMgYW4gb2JqZWN0IHNvIHRoYXQgbW9kdWxlcyBkb24ndCBnZXQKICMgcmVtb3ZlZCAoYXMgaGFwcGVucywgZXZlbiBpZiB0aGV5IGhhdmUgX19pbml0Y2FsbC9tb2R1bGVfaW5pdCkKICMKIGNvcmUtJChDT05GSUdfU0lCWVRFX0JDTTExMlgpCSs9IGFyY2gvbWlwcy9zaWJ5dGUvc2IxMjUwLworY29yZS0kKENPTkZJR19TSUJZVEVfQkNNMTEyWCkJKz0gYXJjaC9taXBzL3NpYnl0ZS9jb21tb24vCiBjZmxhZ3MtJChDT05GSUdfU0lCWVRFX0JDTTExMlgpCSs9IC1JaW5jbHVkZS9hc20tbWlwcy9tYWNoLXNpYnl0ZSBcCiAJCQktRFNJQllURV9IRFJfRkVBVFVSRVM9U0lCWVRFX0hEUl9GTUFTS18xMjUwXzExMnhfQUxMCiAKIGNvcmUtJChDT05GSUdfU0lCWVRFX1NCMTI1MCkJKz0gYXJjaC9taXBzL3NpYnl0ZS9zYjEyNTAvCitjb3JlLSQoQ09ORklHX1NJQllURV9TQjEyNTApCSs9IGFyY2gvbWlwcy9zaWJ5dGUvY29tbW9uLwogY2ZsYWdzLSQoQ09ORklHX1NJQllURV9TQjEyNTApCSs9IC1JaW5jbHVkZS9hc20tbWlwcy9tYWNoLXNpYnl0ZSBcCiAJCQktRFNJQllURV9IRFJfRkVBVFVSRVM9U0lCWVRFX0hEUl9GTUFTS18xMjUwXzExMnhfQUxMCiAKIGNvcmUtJChDT05GSUdfU0lCWVRFX0JDTTF4NTUpCSs9IGFyY2gvbWlwcy9zaWJ5dGUvYmNtMTQ4MC8KK2NvcmUtJChDT05GSUdfU0lCWVRFX0JDTTF4NTUpCSs9IGFyY2gvbWlwcy9zaWJ5dGUvY29tbW9uLwogY2ZsYWdzLSQoQ09ORklHX1NJQllURV9CQ00xeDU1KQkrPSAtSWluY2x1ZGUvYXNtLW1pcHMvbWFjaC1zaWJ5dGUgXAogCQkJLURTSUJZVEVfSERSX0ZFQVRVUkVTPVNJQllURV9IRFJfRk1BU0tfMTQ4MF9BTEwKIAogY29yZS0kKENPTkZJR19TSUJZVEVfQkNNMXg4MCkJKz0gYXJjaC9taXBzL3NpYnl0ZS9iY20xNDgwLworY29yZS0kKENPTkZJR19TSUJZVEVfQkNNMXg4MCkJKz0gYXJjaC9taXBzL3NpYnl0ZS9jb21tb24vCiBjZmxhZ3MtJChDT05GSUdfU0lCWVRFX0JDTTF4ODApCSs9IC1JaW5jbHVkZS9hc20tbWlwcy9tYWNoLXNpYnl0ZSBcCiAJCQktRFNJQllURV9IRFJfRkVBVFVSRVM9U0lCWVRFX0hEUl9GTUFTS18xNDgwX0FMTAogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYmFzbGVyL2V4Y2l0ZS9leGNpdGVfc2V0dXAuYyBiL2FyY2gvbWlwcy9iYXNsZXIvZXhjaXRlL2V4Y2l0ZV9zZXR1cC5jCmluZGV4IDQyZjBlZGEuLjJmMGU0YzAgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9iYXNsZXIvZXhjaXRlL2V4Y2l0ZV9zZXR1cC5jCisrKyBiL2FyY2gvbWlwcy9iYXNsZXIvZXhjaXRlL2V4Y2l0ZV9zZXR1cC5jCkBAIC02Myw3ICs2Myw3IEBACiB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKiBjb25zdCB0aXRhbl9iYXNlID0gKHZvaWQgKikgKEVYQ0lURV9BRERSX1RJVEFOKTsKIAogLyogUHJvdGVjdCBhY2Nlc3MgdG8gc2hhcmVkIEdQSSByZWdpc3RlcnMgKi8KLXNwaW5sb2NrX3QgdGl0YW5fbG9jayA9IFNQSU5fTE9DS19VTkxPQ0tFRDsKK0RFRklORV9TUElOTE9DSyh0aXRhbl9sb2NrKTsKIGludCB0aXRhbl9pcnFmbGFnczsKIAogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29iYWx0L01ha2VmaWxlIGIvYXJjaC9taXBzL2NvYmFsdC9NYWtlZmlsZQppbmRleCBiMzZkZDhmLi5kZTAxN2MxIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29iYWx0L01ha2VmaWxlCisrKyBiL2FyY2gvbWlwcy9jb2JhbHQvTWFrZWZpbGUKQEAgLTQsNSArNCw2IEBACiAKIG9iai15CSA6PSBpcnEubyByZXNldC5vIHNldHVwLm8KIAorb2JqLSQoQ09ORklHX1BDSSkJCSs9IHBjaS5vCiBvYmotJChDT05GSUdfRUFSTFlfUFJJTlRLKQkrPSBjb25zb2xlLm8KIG9iai0kKENPTkZJR19NVERfUEhZU01BUCkJKz0gbXRkLm8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb2JhbHQvY29uc29sZS5jIGIvYXJjaC9taXBzL2NvYmFsdC9jb25zb2xlLmMKaW5kZXggY2E1NmI0MS4uMDQ4NWQ1MSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2NvYmFsdC9jb25zb2xlLmMKKysrIGIvYXJjaC9taXBzL2NvYmFsdC9jb25zb2xlLmMKQEAgLTEsMTMgKzEsMTEgQEAKIC8qCiAgKiAoQykgUC4gSG9ydG9uIDIwMDYKICAqLwotCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfcmVnLmg+CisKICNpbmNsdWRlIDxhc20vYWRkcnNwYWNlLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gtY29iYWx0L2NvYmFsdC5oPgorCisjaW5jbHVkZSA8Y29iYWx0Lmg+CiAKIHZvaWQgcHJvbV9wdXRjaGFyKGNoYXIgYykKIHsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb2JhbHQvaXJxLmMgYi9hcmNoL21pcHMvY29iYWx0L2lycS5jCmluZGV4IGZlOTNiODQuLjk1MGFkMWUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb2JhbHQvaXJxLmMKKysrIGIvYXJjaC9taXBzL2NvYmFsdC9pcnEuYwpAQCAtMTcsNyArMTcsNyBAQAogI2luY2x1ZGUgPGFzbS9pcnFfY3B1Lmg+CiAjaW5jbHVkZSA8YXNtL2d0NjQxMjAuaD4KIAotI2luY2x1ZGUgPGFzbS9tYWNoLWNvYmFsdC9jb2JhbHQuaD4KKyNpbmNsdWRlIDxjb2JhbHQuaD4KIAogLyoKICAqIFdlIGhhdmUgdHdvIHR5cGVzIG9mIGludGVycnVwdHMgdGhhdCB3ZSBoYW5kbGUsIG9uZXMgdGhhdCBjb21lIGluIHRocm91Z2gKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb2JhbHQvcGNpLmMgYi9hcmNoL21pcHMvY29iYWx0L3BjaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5MTAyN2YKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvY29iYWx0L3BjaS5jCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBSZWdpc3RlciBQQ0kgY29udHJvbGxlci4KKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDIwMDQsIDA1IGJ5IFJhbGYgQmFlY2hsZSAocmFsZkBsaW51eC1taXBzLm9yZykKKyAqIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiwgMjAwMyBieSBMaWFtIERhdmllcyAobGRhdmllc0BhZ2lsZS50dikKKyAqCisgKi8KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisKKyNpbmNsdWRlIDxhc20vZ3Q2NDEyMC5oPgorCitleHRlcm4gc3RydWN0IHBjaV9vcHMgZ3Q2NHh4eF9wY2kwX29wczsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBjb2JhbHRfbWVtX3Jlc291cmNlID0geworCS5zdGFydAk9IEdUX0RFRl9QQ0kwX01FTTBfQkFTRSwKKwkuZW5kCT0gR1RfREVGX1BDSTBfTUVNMF9CQVNFICsgR1RfREVGX1BDSTBfTUVNMF9TSVpFIC0gMSwKKwkubmFtZQk9ICJQQ0kgbWVtb3J5IiwKKwkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgY29iYWx0X2lvX3Jlc291cmNlID0geworCS5zdGFydAk9IDB4MTAwMCwKKwkuZW5kCT0gR1RfREVGX1BDSTBfSU9fU0laRSAtIDEsCisJLm5hbWUJPSAiUENJIEkvTyIsCisJLmZsYWdzCT0gSU9SRVNPVVJDRV9JTywKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgY29iYWx0X3BjaV9jb250cm9sbGVyID0geworCS5wY2lfb3BzCT0gJmd0NjR4eHhfcGNpMF9vcHMsCisJLm1lbV9yZXNvdXJjZQk9ICZjb2JhbHRfbWVtX3Jlc291cmNlLAorCS5pb19yZXNvdXJjZQk9ICZjb2JhbHRfaW9fcmVzb3VyY2UsCisJLmlvX29mZnNldAk9IDAgLSBHVF9ERUZfUENJMF9JT19CQVNFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgY29iYWx0X3BjaV9pbml0KHZvaWQpCit7CisJcmVnaXN0ZXJfcGNpX2NvbnRyb2xsZXIoJmNvYmFsdF9wY2lfY29udHJvbGxlcik7CisKKwlyZXR1cm4gMDsKK30KKworYXJjaF9pbml0Y2FsbChjb2JhbHRfcGNpX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvYmFsdC9yZXNldC5jIGIvYXJjaC9taXBzL2NvYmFsdC9yZXNldC5jCmluZGV4IDc1M2RmY2MuLjQzY2NhMjEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb2JhbHQvcmVzZXQuYworKysgYi9hcmNoL21pcHMvY29iYWx0L3Jlc2V0LmMKQEAgLTgsMTUgKzgsMTIgQEAKICAqIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBieSBSYWxmIEJhZWNobGUKICAqIENvcHlyaWdodCAoQykgMjAwMSBieSBMaWFtIERhdmllcyAobGRhdmllc0BhZ2lsZS50dikKICAqLwotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKwogI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxhc20vcmVib290Lmg+Ci0jaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotI2luY2x1ZGUgPGFzbS9taXBzcmVncy5oPgotI2luY2x1ZGUgPGFzbS9tYWNoLWNvYmFsdC9jb2JhbHQuaD4KKworI2luY2x1ZGUgPGNvYmFsdC5oPgogCiB2b2lkIGNvYmFsdF9tYWNoaW5lX2hhbHQodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb2JhbHQvc2V0dXAuYyBiL2FyY2gvbWlwcy9jb2JhbHQvc2V0dXAuYwppbmRleCA4OGQzNGYxLi5kMGRkODE3IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29iYWx0L3NldHVwLmMKKysrIGIvYXJjaC9taXBzL2NvYmFsdC9zZXR1cC5jCkBAIC0xOSwxMiArMTksMTAgQEAKICNpbmNsdWRlIDxhc20vYm9vdGluZm8uaD4KICNpbmNsdWRlIDxhc20vdGltZS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9pcnEuaD4KLSNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8YXNtL3JlYm9vdC5oPgogI2luY2x1ZGUgPGFzbS9ndDY0MTIwLmg+CiAKLSNpbmNsdWRlIDxhc20vbWFjaC1jb2JhbHQvY29iYWx0Lmg+CisjaW5jbHVkZSA8Y29iYWx0Lmg+CiAKIGV4dGVybiB2b2lkIGNvYmFsdF9tYWNoaW5lX3Jlc3RhcnQoY2hhciAqY29tbWFuZCk7CiBleHRlcm4gdm9pZCBjb2JhbHRfbWFjaGluZV9oYWx0KHZvaWQpOwpAQCAtNjMsMjIgKzYxLDYgQEAKIAlHVF9XUklURShHVF9JTlRSTUFTS19PRlMsIEdUX0lOVFJfVDBFWFBfTVNLIHwgR1RfUkVBRChHVF9JTlRSTUFTS19PRlMpKTsKIH0KIAotZXh0ZXJuIHN0cnVjdCBwY2lfb3BzIGd0NjQxMTFfcGNpX29wczsKLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBjb2JhbHRfbWVtX3Jlc291cmNlID0gewotCS5zdGFydAk9IEdUX0RFRl9QQ0kwX01FTTBfQkFTRSwKLQkuZW5kCT0gR1RfREVGX1BDSTBfTUVNMF9CQVNFICsgR1RfREVGX1BDSTBfTUVNMF9TSVpFIC0gMSwKLQkubmFtZQk9ICJQQ0kgbWVtb3J5IiwKLQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTQotfTsKLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBjb2JhbHRfaW9fcmVzb3VyY2UgPSB7Ci0JLnN0YXJ0CT0gMHgxMDAwLAotCS5lbmQJPSAweGZmZmYsCi0JLm5hbWUJPSAiUENJIEkvTyIsCi0JLmZsYWdzCT0gSU9SRVNPVVJDRV9JTwotfTsKLQogLyoKICAqIENvYmFsdCBkb2Vzbid0IGhhdmUgUFMvMiBrZXlib2FyZC9tb3VzZSBpbnRlcmZhY2VzLAogICoga2V5Ym9hcmQgY29ubnRyb2xsZXIgaXMgbmV2ZXIgdXNlZC4KQEAgLTExMSwxNCArOTMsNiBAQAogCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IHBjaV9jb250cm9sbGVyIGNvYmFsdF9wY2lfY29udHJvbGxlciA9IHsKLQkucGNpX29wcwk9ICZndDY0MTExX3BjaV9vcHMsCi0JLm1lbV9yZXNvdXJjZQk9ICZjb2JhbHRfbWVtX3Jlc291cmNlLAotCS5tZW1fb2Zmc2V0CT0gMCwKLQkuaW9fcmVzb3VyY2UJPSAmY29iYWx0X2lvX3Jlc291cmNlLAotCS5pb19vZmZzZXQJPSAwIC0gR1RfREVGX1BDSTBfSU9fQkFTRSwKLX07Ci0KIHZvaWQgX19pbml0IHBsYXRfbWVtX3NldHVwKHZvaWQpCiB7CiAJc3RhdGljIHN0cnVjdCB1YXJ0X3BvcnQgdWFydDsKQEAgLTE0NiwxMCArMTIwLDYgQEAKIAogCXByaW50aygiQ29iYWx0IGJvYXJkIElEOiAlZFxuIiwgY29iYWx0X2JvYXJkX2lkKTsKIAotI2lmZGVmIENPTkZJR19QQ0kKLQlyZWdpc3Rlcl9wY2lfY29udHJvbGxlcigmY29iYWx0X3BjaV9jb250cm9sbGVyKTsKLSNlbmRpZgotCiAJaWYgKGNvYmFsdF9ib2FyZF9pZCA+IENPQkFMVF9CUkRfSURfUkFRMSkgewogI2lmZGVmIENPTkZJR19TRVJJQUxfODI1MAogCQl1YXJ0LmxpbmUJPSAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3Mvam1yMzkyN19kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy9qbXIzOTI3X2RlZmNvbmZpZwppbmRleCAyMWEwOTQ3Li4wNjhlNDhlIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29uZmlncy9qbXIzOTI3X2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy9qbXIzOTI3X2RlZmNvbmZpZwpAQCAtMSw3ICsxLDcgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yMAotIyBUdWUgRmViIDIwIDIxOjQ3OjM0IDIwMDcKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yMS1yYzMKKyMgVGh1IE1hciAxNSAwMDo0MDo0MCAyMDA3CiAjCiBDT05GSUdfTUlQUz15CiAKQEAgLTcwLDcgKzcwLDcgQEAKIENPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CiBDT05GSUdfR0VORVJJQ19USU1FPXkKIENPTkZJR19TQ0hFRF9OT19OT19PTUlUX0ZSQU1FX1BPSU5URVI9eQotIyBDT05GSUdfR0VORVJJQ19IQVJESVJRU19OT19fRE9fSVJRIGlzIG5vdCBzZXQKK0NPTkZJR19HRU5FUklDX0hBUkRJUlFTX05PX19ET19JUlE9eQogQ09ORklHX0RNQV9OT05DT0hFUkVOVD15CiBDT05GSUdfRE1BX05FRURfUENJX01BUF9TVEFURT15CiBDT05GSUdfQ1BVX0JJR19FTkRJQU49eQpAQCAtMTM4LDEyICsxMzgsMTIgQEAKICMgQ09ORklHX0haXzQ4IGlzIG5vdCBzZXQKICMgQ09ORklHX0haXzEwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19IWl8xMjggaXMgbm90IHNldAotIyBDT05GSUdfSFpfMjUwIGlzIG5vdCBzZXQKK0NPTkZJR19IWl8yNTA9eQogIyBDT05GSUdfSFpfMjU2IGlzIG5vdCBzZXQKLUNPTkZJR19IWl8xMDAwPXkKKyMgQ09ORklHX0haXzEwMDAgaXMgbm90IHNldAogIyBDT05GSUdfSFpfMTAyNCBpcyBub3Qgc2V0CiBDT05GSUdfU1lTX1NVUFBPUlRTX0FSQklUX0haPXkKLUNPTkZJR19IWj0xMDAwCitDT05GSUdfSFo9MjUwCiBDT05GSUdfUFJFRU1QVF9OT05FPXkKICMgQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZIGlzIG5vdCBzZXQKICMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldApAQCAtMTc1LDE0ICsxNzUsMTUgQEAKICMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKICMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKIENPTkZJR19TWVNGU19ERVBSRUNBVEVEPXkKLUNPTkZJR19SRUxBWT15CisjIENPTkZJR19SRUxBWSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lOSVRSRCBpcyBub3Qgc2V0CiAjIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRSBpcyBub3Qgc2V0CiBDT05GSUdfU1lTQ1RMPXkKIENPTkZJR19FTUJFRERFRD15CiBDT05GSUdfU1lTQ1RMX1NZU0NBTEw9eQogQ09ORklHX0tBTExTWU1TPXkKICMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAotQ09ORklHX0hPVFBMVUc9eQorIyBDT05GSUdfSE9UUExVRyBpcyBub3Qgc2V0CiBDT05GSUdfUFJJTlRLPXkKIENPTkZJR19CVUc9eQogQ09ORklHX0VMRl9DT1JFPXkKQEAgLTIxNywxMSArMjE4LDExIEBACiBDT05GSUdfSU9TQ0hFRF9BUz15CiBDT05GSUdfSU9TQ0hFRF9ERUFETElORT15CiBDT05GSUdfSU9TQ0hFRF9DRlE9eQotQ09ORklHX0RFRkFVTFRfQVM9eQorIyBDT05GSUdfREVGQVVMVF9BUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUZBVUxUX0RFQURMSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFRkFVTFRfQ0ZRIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX0NGUT15CiAjIENPTkZJR19ERUZBVUxUX05PT1AgaXMgbm90IHNldAotQ09ORklHX0RFRkFVTFRfSU9TQ0hFRD0iYW50aWNpcGF0b3J5IgorQ09ORklHX0RFRkFVTFRfSU9TQ0hFRD0iY2ZxIgogCiAjCiAjIEJ1cyBvcHRpb25zIChQQ0ksIFBDTUNJQSwgRUlTQSwgSVNBLCBUQykKQEAgLTIzMywxMiArMjM0LDEwIEBACiAjCiAjIFBDQ0FSRCAoUENNQ0lBL0NhcmRCdXMpIHN1cHBvcnQKICMKLSMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0CiAKICMKICMgUENJIEhvdHBsdWcgU3VwcG9ydAogIwotIyBDT05GSUdfSE9UUExVR19QQ0kgaXMgbm90IHNldAogCiAjCiAjIEV4ZWN1dGFibGUgZmlsZSBmb3JtYXRzCkBAIC0yNTAsMTAgKzI0OSw3IEBACiAjCiAjIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucwogIwotQ09ORklHX1BNPXkKLSMgQ09ORklHX1BNX0xFR0FDWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QTV9ERUJVRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19QTV9TWVNGU19ERVBSRUNBVEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BNIGlzIG5vdCBzZXQKIAogIwogIyBOZXR3b3JraW5nCkBAIC0yNjcsMTIgKzI2Myw3IEBACiBDT05GSUdfUEFDS0VUPXkKICMgQ09ORklHX1BBQ0tFVF9NTUFQIGlzIG5vdCBzZXQKIENPTkZJR19VTklYPXkKLUNPTkZJR19YRlJNPXkKLUNPTkZJR19YRlJNX1VTRVI9eQotIyBDT05GSUdfWEZSTV9TVUJfUE9MSUNZIGlzIG5vdCBzZXQKLUNPTkZJR19YRlJNX01JR1JBVEU9eQotQ09ORklHX05FVF9LRVk9eQotQ09ORklHX05FVF9LRVlfTUlHUkFURT15CisjIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKIENPTkZJR19JTkVUPXkKICMgQ09ORklHX0lQX01VTFRJQ0FTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVIgaXMgbm90IHNldApAQCAtMjkwLDE5ICsyODEsMTggQEAKICMgQ09ORklHX0lORVRfSVBDT01QIGlzIG5vdCBzZXQKICMgQ09ORklHX0lORVRfWEZSTV9UVU5ORUwgaXMgbm90IHNldAogIyBDT05GSUdfSU5FVF9UVU5ORUwgaXMgbm90IHNldAotQ09ORklHX0lORVRfWEZSTV9NT0RFX1RSQU5TUE9SVD15Ci1DT05GSUdfSU5FVF9YRlJNX01PREVfVFVOTkVMPXkKLUNPTkZJR19JTkVUX1hGUk1fTU9ERV9CRUVUPXkKLUNPTkZJR19JTkVUX0RJQUc9eQotQ09ORklHX0lORVRfVENQX0RJQUc9eQorIyBDT05GSUdfSU5FVF9YRlJNX01PREVfVFJBTlNQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfWEZSTV9NT0RFX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1hGUk1fTU9ERV9CRUVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfRElBRyBpcyBub3Qgc2V0CiAjIENPTkZJR19UQ1BfQ09OR19BRFZBTkNFRCBpcyBub3Qgc2V0CiBDT05GSUdfVENQX0NPTkdfQ1VCSUM9eQogQ09ORklHX0RFRkFVTFRfVENQX0NPTkc9ImN1YmljIgotQ09ORklHX1RDUF9NRDVTSUc9eQorIyBDT05GSUdfVENQX01ENVNJRyBpcyBub3Qgc2V0CiAjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKICMgQ09ORklHX0lORVQ2X1hGUk1fVFVOTkVMIGlzIG5vdCBzZXQKICMgQ09ORklHX0lORVQ2X1RVTk5FTCBpcyBub3Qgc2V0Ci1DT05GSUdfTkVUV09SS19TRUNNQVJLPXkKKyMgQ09ORklHX05FVFdPUktfU0VDTUFSSyBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAogCiAjCkBAIC0zNDMsMTMgKzMzMyw3IEBACiAjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CiAjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKICMgQ09ORklHX0JUIGlzIG5vdCBzZXQKLUNPTkZJR19JRUVFODAyMTE9eQotIyBDT05GSUdfSUVFRTgwMjExX0RFQlVHIGlzIG5vdCBzZXQKLUNPTkZJR19JRUVFODAyMTFfQ1JZUFRfV0VQPXkKLUNPTkZJR19JRUVFODAyMTFfQ1JZUFRfQ0NNUD15Ci1DT05GSUdfSUVFRTgwMjExX1NPRlRNQUM9eQotIyBDT05GSUdfSUVFRTgwMjExX1NPRlRNQUNfREVCVUcgaXMgbm90IHNldAotQ09ORklHX1dJUkVMRVNTX0VYVD15CisjIENPTkZJR19JRUVFODAyMTEgaXMgbm90IHNldAogCiAjCiAjIERldmljZSBEcml2ZXJzCkBAIC0zNjAsMTQgKzM0NCwxMiBAQAogIwogQ09ORklHX1NUQU5EQUxPTkU9eQogQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQotQ09ORklHX0ZXX0xPQURFUj15CiAjIENPTkZJR19TWVNfSFlQRVJWSVNPUiBpcyBub3Qgc2V0CiAKICMKICMgQ29ubmVjdG9yIC0gdW5pZmllZCB1c2Vyc3BhY2UgPC0+IGtlcm5lbHNwYWNlIGxpbmtlcgogIwotQ09ORklHX0NPTk5FQ1RPUj15Ci1DT05GSUdfUFJPQ19FVkVOVFM9eQorIyBDT05GSUdfQ09OTkVDVE9SIGlzIG5vdCBzZXQKIAogIwogIyBNZW1vcnkgVGVjaG5vbG9neSBEZXZpY2VzIChNVEQpCkBAIC0zOTYsMTYgKzM3OCwxMyBAQAogIyBDT05GSUdfQkxLX0RFVl9OQkQgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9TWDggaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9SQU0gaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9JTklUUkQgaXMgbm90IHNldAotQ09ORklHX0NEUk9NX1BLVENEVkQ9eQotQ09ORklHX0NEUk9NX1BLVENEVkRfQlVGRkVSUz04Ci0jIENPTkZJR19DRFJPTV9QS1RDRFZEX1dDQUNIRSBpcyBub3Qgc2V0Ci1DT05GSUdfQVRBX09WRVJfRVRIPXkKKyMgQ09ORklHX0NEUk9NX1BLVENEVkQgaXMgbm90IHNldAorIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKIAogIwogIyBNaXNjIGRldmljZXMKICMKLUNPTkZJR19TR0lfSU9DND15CisjIENPTkZJR19TR0lfSU9DNCBpcyBub3Qgc2V0CiAjIENPTkZJR19USUZNX0NPUkUgaXMgbm90IHNldAogCiAjCkBAIC00MTYsNyArMzk1LDcgQEAKICMKICMgU0NTSSBkZXZpY2Ugc3VwcG9ydAogIwotQ09ORklHX1JBSURfQVRUUlM9eQorIyBDT05GSUdfUkFJRF9BVFRSUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfTkVUTElOSyBpcyBub3Qgc2V0CiAKQEAgLTQ2MiwyNiArNDQxLDEzIEBACiAjCiAjIFBIWSBkZXZpY2Ugc3VwcG9ydAogIwotQ09ORklHX1BIWUxJQj15Ci0KLSMKLSMgTUlJIFBIWSBkZXZpY2UgZHJpdmVycwotIwotQ09ORklHX01BUlZFTExfUEhZPXkKLUNPTkZJR19EQVZJQ09NX1BIWT15Ci1DT05GSUdfUVNFTUlfUEhZPXkKLUNPTkZJR19MWFRfUEhZPXkKLUNPTkZJR19DSUNBREFfUEhZPXkKLUNPTkZJR19WSVRFU1NFX1BIWT15Ci1DT05GSUdfU01TQ19QSFk9eQotIyBDT05GSUdfQlJPQURDT01fUEhZIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZJWEVEX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19QSFlMSUIgaXMgbm90IHNldAogCiAjCiAjIEV0aGVybmV0ICgxMCBvciAxMDBNYml0KQogIwogQ09ORklHX05FVF9FVEhFUk5FVD15Ci0jIENPTkZJR19NSUkgaXMgbm90IHNldAorQ09ORklHX01JST15CiAjIENPTkZJR19IQVBQWU1FQUwgaXMgbm90IHNldAogIyBDT05GSUdfU1VOR0VNIGlzIG5vdCBzZXQKICMgQ09ORklHX0NBU1NJTkkgaXMgbm90IHNldApAQCAtNDkzLDcgKzQ1OSwyNyBAQAogIwogIyBDT05GSUdfTkVUX1RVTElQIGlzIG5vdCBzZXQKICMgQ09ORklHX0hQMTAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9QQ0kgaXMgbm90IHNldAorQ09ORklHX05FVF9QQ0k9eQorIyBDT05GSUdfUENORVQzMiBpcyBub3Qgc2V0CisjIENPTkZJR19BTUQ4MTExX0VUSCBpcyBub3Qgc2V0CisjIENPTkZJR19BREFQVEVDX1NUQVJGSVJFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0I0NCBpcyBub3Qgc2V0CisjIENPTkZJR19GT1JDRURFVEggaXMgbm90IHNldAorQ09ORklHX1RDMzU4MTU9eQorIyBDT05GSUdfREdSUyBpcyBub3Qgc2V0CisjIENPTkZJR19FRVBSTzEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19FMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQUxOWCBpcyBub3Qgc2V0CisjIENPTkZJR19OQVRTRU1JIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FMktfUENJIGlzIG5vdCBzZXQKKyMgQ09ORklHXzgxMzlDUCBpcyBub3Qgc2V0CisjIENPTkZJR184MTM5VE9PIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NJUzkwMCBpcyBub3Qgc2V0CisjIENPTkZJR19FUElDMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NVTkRBTkNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RMQU4gaXMgbm90IHNldAorIyBDT05GSUdfVklBX1JISU5FIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDOTIwMzEgaXMgbm90IHNldAogCiAjCiAjIEV0aGVybmV0ICgxMDAwIE1iaXQpCkBAIC01MDksMjAgKzQ5NSwyMSBAQAogIyBDT05GSUdfU0tHRSBpcyBub3Qgc2V0CiAjIENPTkZJR19TS1kyIGlzIG5vdCBzZXQKICMgQ09ORklHX1NLOThMSU4gaXMgbm90IHNldAorIyBDT05GSUdfVklBX1ZFTE9DSVRZIGlzIG5vdCBzZXQKICMgQ09ORklHX1RJR09OMyBpcyBub3Qgc2V0CiAjIENPTkZJR19CTlgyIGlzIG5vdCBzZXQKLUNPTkZJR19RTEEzWFhYPXkKKyMgQ09ORklHX1FMQTNYWFggaXMgbm90IHNldAogIyBDT05GSUdfQVRMMSBpcyBub3Qgc2V0CiAKICMKICMgRXRoZXJuZXQgKDEwMDAwIE1iaXQpCiAjCiAjIENPTkZJR19DSEVMU0lPX1QxIGlzIG5vdCBzZXQKLUNPTkZJR19DSEVMU0lPX1QzPXkKKyMgQ09ORklHX0NIRUxTSU9fVDMgaXMgbm90IHNldAogIyBDT05GSUdfSVhHQiBpcyBub3Qgc2V0CiAjIENPTkZJR19TMklPIGlzIG5vdCBzZXQKICMgQ09ORklHX01ZUkkxMEdFIGlzIG5vdCBzZXQKLUNPTkZJR19ORVRYRU5fTklDPXkKKyMgQ09ORklHX05FVFhFTl9OSUMgaXMgbm90IHNldAogCiAjCiAjIFRva2VuIFJpbmcgZGV2aWNlcwpAQCAtNTY2LDEwICs1NTMsNyBAQAogIwogIyBVc2VybGFuZCBpbnRlcmZhY2VzCiAjCi1DT05GSUdfSU5QVVRfTU9VU0VERVY9eQotQ09ORklHX0lOUFVUX01PVVNFREVWX1BTQVVYPXkKLUNPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWD0xMDI0Ci1DT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1k9NzY4CisjIENPTkZJR19JTlBVVF9NT1VTRURFViBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9KT1lERVYgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfVFNERVYgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfRVZERVYgaXMgbm90IHNldApAQCAtNTg3LDIxICs1NzEsMTMgQEAKICMKICMgSGFyZHdhcmUgSS9PIHBvcnRzCiAjCi1DT05GSUdfU0VSSU89eQotIyBDT05GSUdfU0VSSU9fSTgwNDIgaXMgbm90IHNldAotQ09ORklHX1NFUklPX1NFUlBPUlQ9eQotIyBDT05GSUdfU0VSSU9fUENJUFMyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFUklPX0xJQlBTMiBpcyBub3Qgc2V0Ci1DT05GSUdfU0VSSU9fUkFXPXkKKyMgQ09ORklHX1NFUklPIGlzIG5vdCBzZXQKICMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKIAogIwogIyBDaGFyYWN0ZXIgZGV2aWNlcwogIwotQ09ORklHX1ZUPXkKLUNPTkZJR19WVF9DT05TT0xFPXkKLUNPTkZJR19IV19DT05TT0xFPXkKLUNPTkZJR19WVF9IV19DT05TT0xFX0JJTkRJTkc9eQorIyBDT05GSUdfVlQgaXMgbm90IHNldAogQ09ORklHX1NFUklBTF9OT05TVEFOREFSRD15CiAjIENPTkZJR19DT01QVVRPTkUgaXMgbm90IHNldAogIyBDT05GSUdfUk9DS0VUUE9SVCBpcyBub3Qgc2V0CkBAIC02MDksNyArNTg1LDcgQEAKICMgQ09ORklHX0RJR0lFUENBIGlzIG5vdCBzZXQKICMgQ09ORklHX01PWEFfSU5URUxMSU8gaXMgbm90IHNldAogIyBDT05GSUdfTU9YQV9TTUFSVElPIGlzIG5vdCBzZXQKLUNPTkZJR19NT1hBX1NNQVJUSU9fTkVXPXkKKyMgQ09ORklHX01PWEFfU01BUlRJT19ORVcgaXMgbm90IHNldAogIyBDT05GSUdfSVNJIGlzIG5vdCBzZXQKICMgQ09ORklHX1NZTkNMSU5LTVAgaXMgbm90IHNldAogIyBDT05GSUdfU1lOQ0xJTktfR1QgaXMgbm90IHNldApAQCAtNjI5LDExICs2MDUsMTIgQEAKICMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydAogIwogQ09ORklHX1NFUklBTF9DT1JFPXkKK0NPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKIENPTkZJR19TRVJJQUxfVFhYOT15CiBDT05GSUdfSEFTX1RYWDlfU0VSSUFMPXkKIENPTkZJR19TRVJJQUxfVFhYOV9OUl9VQVJUUz02Ci0jIENPTkZJR19TRVJJQUxfVFhYOV9DT05TT0xFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFUklBTF9UWFg5X1NURFNFUklBTCBpcyBub3Qgc2V0CitDT05GSUdfU0VSSUFMX1RYWDlfQ09OU09MRT15CitDT05GSUdfU0VSSUFMX1RYWDlfU1REU0VSSUFMPXkKICMgQ09ORklHX1NFUklBTF9KU00gaXMgbm90IHNldAogIyBDT05GSUdfVU5JWDk4X1BUWVMgaXMgbm90IHNldAogQ09ORklHX0xFR0FDWV9QVFlTPXkKQEAgLTY4NSw2ICs2NjIsMTEgQEAKICMgQ09ORklHX0hXTU9OX1ZJRCBpcyBub3Qgc2V0CiAKICMKKyMgTXVsdGlmdW5jdGlvbiBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfTUZEX1NNNTAxIGlzIG5vdCBzZXQKKworIwogIyBNdWx0aW1lZGlhIGRldmljZXMKICMKICMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0CkBAIC02OTcsNTEgKzY3OSw4IEBACiAjCiAjIEdyYXBoaWNzIHN1cHBvcnQKICMKLSMgQ09ORklHX0ZJUk1XQVJFX0VESUQgaXMgbm90IHNldAotQ09ORklHX0ZCPXkKLSMgQ09ORklHX0ZCX0NGQl9GSUxMUkVDVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9DRkJfQ09QWUFSRUEgaXMgbm90IHNldAotIyBDT05GSUdfRkJfQ0ZCX0lNQUdFQkxJVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9TVkdBTElCIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX01BQ01PREVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX0JBQ0tMSUdIVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9NT0RFX0hFTFBFUlMgaXMgbm90IHNldAotIyBDT05GSUdfRkJfVElMRUJMSVRUSU5HIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX0NJUlJVUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9QTTIgaXMgbm90IHNldAotIyBDT05GSUdfRkJfQ1lCRVIyMDAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX0FTSUxJQU5UIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX0lNU1RUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX1MxRDEzWFhYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX05WSURJQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9SSVZBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX01BVFJPWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9SQURFT04gaXMgbm90IHNldAotIyBDT05GSUdfRkJfQVRZMTI4IGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX0FUWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9TMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9TQVZBR0UgaXMgbm90IHNldAotIyBDT05GSUdfRkJfU0lTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX05FT01BR0lDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX0tZUk8gaXMgbm90IHNldAotIyBDT05GSUdfRkJfM0RGWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9WT09ET08xIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX1NNSVZHWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9UUklERU5UIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX1ZJUlRVQUwgaXMgbm90IHNldAotCi0jCi0jIENvbnNvbGUgZGlzcGxheSBkcml2ZXIgc3VwcG9ydAotIwotIyBDT05GSUdfVkdBX0NPTlNPTEUgaXMgbm90IHNldAotQ09ORklHX0RVTU1ZX0NPTlNPTEU9eQotIyBDT05GSUdfRlJBTUVCVUZGRVJfQ09OU09MRSBpcyBub3Qgc2V0Ci0KLSMKLSMgTG9nbyBjb25maWd1cmF0aW9uCi0jCi0jIENPTkZJR19MT0dPIGlzIG5vdCBzZXQKICMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19GQiBpcyBub3Qgc2V0CiAKICMKICMgU291bmQKQEAgLTg2NCw3ICs4MDMsNyBAQAogQ09ORklHX0ROT1RJRlk9eQogIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAotQ09ORklHX0ZVU0VfRlM9eQorIyBDT05GSUdfRlVTRV9GUyBpcyBub3Qgc2V0CiAKICMKICMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcwpAQCAtODg5LDE0ICs4MjgsMTMgQEAKICMgQ09ORklHX1RNUEZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0hVR0VUTEJfUEFHRSBpcyBub3Qgc2V0CiBDT05GSUdfUkFNRlM9eQotQ09ORklHX0NPTkZJR0ZTX0ZTPXkKKyMgQ09ORklHX0NPTkZJR0ZTX0ZTIGlzIG5vdCBzZXQKIAogIwogIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCiAjCiAjIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfRUNSWVBUX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0hGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19IRlNQTFVTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0JFRlNfRlMgaXMgbm90IHNldApAQCAtOTQ0LDEwICs4ODIsNyBAQAogIwogIyBEaXN0cmlidXRlZCBMb2NrIE1hbmFnZXIKICMKLUNPTkZJR19ETE09eQotQ09ORklHX0RMTV9UQ1A9eQotIyBDT05GSUdfRExNX1NDVFAgaXMgbm90IHNldAotIyBDT05GSUdfRExNX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RMTSBpcyBub3Qgc2V0CiAKICMKICMgUHJvZmlsaW5nIHN1cHBvcnQKQEAgLTk3Miw2NSArOTA3LDIyIEBACiAjCiAjIFNlY3VyaXR5IG9wdGlvbnMKICMKLUNPTkZJR19LRVlTPXkKLUNPTkZJR19LRVlTX0RFQlVHX1BST0NfS0VZUz15CisjIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKIAogIwogIyBDcnlwdG9ncmFwaGljIG9wdGlvbnMKICMKLUNPTkZJR19DUllQVE89eQotQ09ORklHX0NSWVBUT19BTEdBUEk9eQotQ09ORklHX0NSWVBUT19CTEtDSVBIRVI9eQotQ09ORklHX0NSWVBUT19IQVNIPXkKLUNPTkZJR19DUllQVE9fTUFOQUdFUj15Ci1DT05GSUdfQ1JZUFRPX0hNQUM9eQotQ09ORklHX0NSWVBUT19YQ0JDPXkKLUNPTkZJR19DUllQVE9fTlVMTD15Ci1DT05GSUdfQ1JZUFRPX01END15Ci1DT05GSUdfQ1JZUFRPX01ENT15Ci1DT05GSUdfQ1JZUFRPX1NIQTE9eQotQ09ORklHX0NSWVBUT19TSEEyNTY9eQotQ09ORklHX0NSWVBUT19TSEE1MTI9eQotQ09ORklHX0NSWVBUT19XUDUxMj15Ci1DT05GSUdfQ1JZUFRPX1RHUjE5Mj15Ci1DT05GSUdfQ1JZUFRPX0dGMTI4TVVMPXkKLUNPTkZJR19DUllQVE9fRUNCPXkKLUNPTkZJR19DUllQVE9fQ0JDPXkKLUNPTkZJR19DUllQVE9fUENCQz15Ci1DT05GSUdfQ1JZUFRPX0xSVz15Ci1DT05GSUdfQ1JZUFRPX0RFUz15Ci1DT05GSUdfQ1JZUFRPX0ZDUllQVD15Ci1DT05GSUdfQ1JZUFRPX0JMT1dGSVNIPXkKLUNPTkZJR19DUllQVE9fVFdPRklTSD15Ci1DT05GSUdfQ1JZUFRPX1RXT0ZJU0hfQ09NTU9OPXkKLUNPTkZJR19DUllQVE9fU0VSUEVOVD15Ci1DT05GSUdfQ1JZUFRPX0FFUz15Ci1DT05GSUdfQ1JZUFRPX0NBU1Q1PXkKLUNPTkZJR19DUllQVE9fQ0FTVDY9eQotQ09ORklHX0NSWVBUT19URUE9eQotQ09ORklHX0NSWVBUT19BUkM0PXkKLUNPTkZJR19DUllQVE9fS0hBWkFEPXkKLUNPTkZJR19DUllQVE9fQU5VQklTPXkKLUNPTkZJR19DUllQVE9fREVGTEFURT15Ci1DT05GSUdfQ1JZUFRPX01JQ0hBRUxfTUlDPXkKLUNPTkZJR19DUllQVE9fQ1JDMzJDPXkKLUNPTkZJR19DUllQVE9fQ0FNRUxMSUE9eQotCi0jCi0jIEhhcmR3YXJlIGNyeXB0byBkZXZpY2VzCi0jCisjIENPTkZJR19DUllQVE8gaXMgbm90IHNldAogCiAjCiAjIExpYnJhcnkgcm91dGluZXMKICMKIENPTkZJR19CSVRSRVZFUlNFPXkKICMgQ09ORklHX0NSQ19DQ0lUVCBpcyBub3Qgc2V0Ci1DT05GSUdfQ1JDMTY9eQorIyBDT05GSUdfQ1JDMTYgaXMgbm90IHNldAogQ09ORklHX0NSQzMyPXkKLUNPTkZJR19MSUJDUkMzMkM9eQotQ09ORklHX1pMSUJfSU5GTEFURT15Ci1DT05GSUdfWkxJQl9ERUZMQVRFPXkKKyMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0CiBDT05GSUdfUExJU1Q9eQogQ09ORklHX0hBU19JT01FTT15CiBDT05GSUdfSEFTX0lPUE9SVD15CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29uZmlncy9wbng4NTUwLXYycGNpX2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL3BueDg1NTAtdjJwY2lfZGVmY29uZmlnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDZjMmQ3Li4wMDAwMDAwCi0tLSBhL2FyY2gvbWlwcy9jb25maWdzL3BueDg1NTAtdjJwY2lfZGVmY29uZmlnCisrKyAvZGV2L251bGwKQEAgLTEsMTU0MCArMCwwIEBACi0jCi0jIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjAKLSMgVHVlIEZlYiAyMCAyMTo0NzozOSAyMDA3Ci0jCi1DT05GSUdfTUlQUz15Ci0KLSMKLSMgTWFjaGluZSBzZWxlY3Rpb24KLSMKLUNPTkZJR19aT05FX0RNQT15Ci0jIENPTkZJR19NSVBTX01UWDEgaXMgbm90IHNldAotIyBDT05GSUdfTUlQU19CT1NQT1JVUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSVBTX1BCMTAwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSVBTX1BCMTEwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSVBTX1BCMTUwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSVBTX1BCMTU1MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSVBTX1BCMTIwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSVBTX0RCMTAwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSVBTX0RCMTEwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSVBTX0RCMTUwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSVBTX0RCMTU1MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSVBTX0RCMTIwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSVBTX01JUkFHRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CQVNMRVJfRVhDSVRFIGlzIG5vdCBzZXQKLSMgQ09ORklHX01JUFNfQ09CQUxUIGlzIG5vdCBzZXQKLSMgQ09ORklHX01BQ0hfREVDU1RBVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSVBTX0VWNjQxMjAgaXMgbm90IHNldAotIyBDT05GSUdfTUFDSF9KQVpaIGlzIG5vdCBzZXQKLSMgQ09ORklHX0xBU0FUIGlzIG5vdCBzZXQKLSMgQ09ORklHX01JUFNfQVRMQVMgaXMgbm90IHNldAotIyBDT05GSUdfTUlQU19NQUxUQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSVBTX1NFQUQgaXMgbm90IHNldAotIyBDT05GSUdfV1JfUFBNQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSVBTX1NJTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NT01FTkNPX0pBR1VBUl9BVFggaXMgbm90IHNldAotIyBDT05GSUdfTU9NRU5DT19PQ0VMT1QgaXMgbm90IHNldAotIyBDT05GSUdfTU9NRU5DT19PQ0VMT1RfMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NT01FTkNPX09DRUxPVF9DIGlzIG5vdCBzZXQKLSMgQ09ORklHX01PTUVOQ09fT0NFTE9UX0cgaXMgbm90IHNldAotIyBDT05GSUdfTUlQU19YWFMxNTAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BOWDg1NTBfSkJTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BOWDg1NTBfU1RCODEwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0REQjU0NzcgaXMgbm90IHNldAotIyBDT05GSUdfTUFDSF9WUjQxWFggaXMgbm90IHNldAotIyBDT05GSUdfUE1DX1lPU0VNSVRFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1FFTVUgaXMgbm90IHNldAotIyBDT05GSUdfTUFSS0VJTlMgaXMgbm90IHNldAotIyBDT05GSUdfU0dJX0lQMjIgaXMgbm90IHNldAotIyBDT05GSUdfU0dJX0lQMjcgaXMgbm90IHNldAotIyBDT05GSUdfU0dJX0lQMzIgaXMgbm90IHNldAotIyBDT05GSUdfU0lCWVRFX0JJR1NVUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSUJZVEVfU1dBUk0gaXMgbm90IHNldAotIyBDT05GSUdfU0lCWVRFX1NFTlRPU0EgaXMgbm90IHNldAotIyBDT05GSUdfU0lCWVRFX1JIT05FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NJQllURV9DQVJNRUwgaXMgbm90IHNldAotIyBDT05GSUdfU0lCWVRFX1BUU1dBUk0gaXMgbm90IHNldAotIyBDT05GSUdfU0lCWVRFX0xJVFRMRVNVUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSUJZVEVfQ1JISU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NJQllURV9DUkhPTkUgaXMgbm90IHNldAotIyBDT05GSUdfU05JX1JNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RPU0hJQkFfSk1SMzkyNyBpcyBub3Qgc2V0Ci0jIENPTkZJR19UT1NISUJBX1JCVFg0OTI3IGlzIG5vdCBzZXQKLSMgQ09ORklHX1RPU0hJQkFfUkJUWDQ5MzggaXMgbm90IHNldAotQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQotIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTMyIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1U2NCBpcyBub3Qgc2V0Ci1DT05GSUdfR0VORVJJQ19GSU5EX05FWFRfQklUPXkKLUNPTkZJR19HRU5FUklDX0hXRUlHSFQ9eQotQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKLUNPTkZJR19HRU5FUklDX1RJTUU9eQotQ09ORklHX1NDSEVEX05PX05PX09NSVRfRlJBTUVfUE9JTlRFUj15Ci1DT05GSUdfR0VORVJJQ19IQVJESVJRU19OT19fRE9fSVJRPXkKLUNPTkZJR19ETUFfTk9OQ09IRVJFTlQ9eQotQ09ORklHX0RNQV9ORUVEX1BDSV9NQVBfU1RBVEU9eQotIyBDT05GSUdfQ1BVX0JJR19FTkRJQU4gaXMgbm90IHNldAotQ09ORklHX0NQVV9MSVRUTEVfRU5ESUFOPXkKLUNPTkZJR19TWVNfU1VQUE9SVFNfTElUVExFX0VORElBTj15Ci1DT05GSUdfUE5YODU1MD15Ci1DT05GSUdfU09DX1BOWDg1NTA9eQotQ09ORklHX01JUFNfTDFfQ0FDSEVfU0hJRlQ9NQotCi0jCi0jIENQVSBzZWxlY3Rpb24KLSMKLUNPTkZJR19DUFVfTUlQUzMyX1IxPXkKLSMgQ09ORklHX0NQVV9NSVBTMzJfUjIgaXMgbm90IHNldAotIyBDT05GSUdfQ1BVX01JUFM2NF9SMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfTUlQUzY0X1IyIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9SMzAwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfVFgzOVhYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9WUjQxWFggaXMgbm90IHNldAotIyBDT05GSUdfQ1BVX1I0MzAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9SNFgwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfVFg0OVhYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9SNTAwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfUjU0MzIgaXMgbm90IHNldAotIyBDT05GSUdfQ1BVX1I2MDAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9ORVZBREEgaXMgbm90IHNldAotIyBDT05GSUdfQ1BVX1I4MDAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9SMTAwMDAgaXMgbm90IHNldAotIyBDT05GSUdfQ1BVX1JNNzAwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfUk05MDAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9TQjEgaXMgbm90IHNldAotQ09ORklHX1NZU19IQVNfQ1BVX01JUFMzMl9SMT15Ci1DT05GSUdfQ1BVX01JUFMzMj15Ci1DT05GSUdfQ1BVX01JUFNSMT15Ci1DT05GSUdfU1lTX1NVUFBPUlRTXzMyQklUX0tFUk5FTD15Ci1DT05GSUdfQ1BVX1NVUFBPUlRTXzMyQklUX0tFUk5FTD15Ci0KLSMKLSMgS2VybmVsIHR5cGUKLSMKLUNPTkZJR18zMkJJVD15Ci0jIENPTkZJR182NEJJVCBpcyBub3Qgc2V0Ci1DT05GSUdfUEFHRV9TSVpFXzRLQj15Ci0jIENPTkZJR19QQUdFX1NJWkVfOEtCIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BBR0VfU0laRV8xNktCIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BBR0VfU0laRV82NEtCIGlzIG5vdCBzZXQKLUNPTkZJR19DUFVfSEFTX1BSRUZFVENIPXkKLUNPTkZJR19NSVBTX01UX0RJU0FCTEVEPXkKLSMgQ09ORklHX01JUFNfTVRfU01QIGlzIG5vdCBzZXQKLSMgQ09ORklHX01JUFNfTVRfU01UQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSVBTX1ZQRV9MT0FERVIgaXMgbm90IHNldAotIyBDT05GSUdfNjRCSVRfUEhZU19BRERSIGlzIG5vdCBzZXQKLUNPTkZJR19DUFVfSEFTX0xMU0M9eQotQ09ORklHX0NQVV9IQVNfU1lOQz15Ci1DT05GSUdfR0VORVJJQ19IQVJESVJRUz15Ci1DT05GSUdfR0VORVJJQ19JUlFfUFJPQkU9eQotQ09ORklHX0NQVV9TVVBQT1JUU19ISUdITUVNPXkKLUNPTkZJR19BUkNIX0ZMQVRNRU1fRU5BQkxFPXkKLUNPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKLUNPTkZJR19GTEFUTUVNX01BTlVBTD15Ci0jIENPTkZJR19ESVNDT05USUdNRU1fTUFOVUFMIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NQQVJTRU1FTV9NQU5VQUwgaXMgbm90IHNldAotQ09ORklHX0ZMQVRNRU09eQotQ09ORklHX0ZMQVRfTk9ERV9NRU1fTUFQPXkKLSMgQ09ORklHX1NQQVJTRU1FTV9TVEFUSUMgaXMgbm90IHNldAotQ09ORklHX1NQTElUX1BUTE9DS19DUFVTPTQKLSMgQ09ORklHX1JFU09VUkNFU182NEJJVCBpcyBub3Qgc2V0Ci1DT05GSUdfWk9ORV9ETUFfRkxBRz0xCi0jIENPTkZJR19IWl80OCBpcyBub3Qgc2V0Ci0jIENPTkZJR19IWl8xMDAgaXMgbm90IHNldAotIyBDT05GSUdfSFpfMTI4IGlzIG5vdCBzZXQKLUNPTkZJR19IWl8yNTA9eQotIyBDT05GSUdfSFpfMjU2IGlzIG5vdCBzZXQKLSMgQ09ORklHX0haXzEwMDAgaXMgbm90IHNldAotIyBDT05GSUdfSFpfMTAyNCBpcyBub3Qgc2V0Ci1DT05GSUdfU1lTX1NVUFBPUlRTX0FSQklUX0haPXkKLUNPTkZJR19IWj0yNTAKLUNPTkZJR19QUkVFTVBUX05PTkU9eQotIyBDT05GSUdfUFJFRU1QVF9WT0xVTlRBUlkgaXMgbm90IHNldAotIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19LRVhFQyBpcyBub3Qgc2V0Ci1DT05GSUdfTE9DS0RFUF9TVVBQT1JUPXkKLUNPTkZJR19TVEFDS1RSQUNFX1NVUFBPUlQ9eQotQ09ORklHX0RFRkNPTkZJR19MSVNUPSIvbGliL21vZHVsZXMvJFVOQU1FX1JFTEVBU0UvLmNvbmZpZyIKLQotIwotIyBDb2RlIG1hdHVyaXR5IGxldmVsIG9wdGlvbnMKLSMKLUNPTkZJR19FWFBFUklNRU5UQUw9eQotQ09ORklHX0JST0tFTl9PTl9TTVA9eQotQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgotCi0jCi0jIEdlbmVyYWwgc2V0dXAKLSMKLUNPTkZJR19MT0NBTFZFUlNJT049IiIKLUNPTkZJR19MT0NBTFZFUlNJT05fQVVUTz15Ci1DT05GSUdfU1dBUD15Ci1DT05GSUdfU1lTVklQQz15Ci0jIENPTkZJR19JUENfTlMgaXMgbm90IHNldAotQ09ORklHX1NZU1ZJUENfU1lTQ1RMPXkKLSMgQ09ORklHX1BPU0lYX01RVUVVRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RBU0tTVEFUUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VVFNfTlMgaXMgbm90IHNldAotIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAotQ09ORklHX0lLQ09ORklHPXkKLUNPTkZJR19JS0NPTkZJR19QUk9DPXkKLUNPTkZJR19TWVNGU19ERVBSRUNBVEVEPXkKLSMgQ09ORklHX1JFTEFZIGlzIG5vdCBzZXQKLUNPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCi0jIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRSBpcyBub3Qgc2V0Ci1DT05GSUdfU1lTQ1RMPXkKLUNPTkZJR19FTUJFRERFRD15Ci0jIENPTkZJR19TWVNDVExfU1lTQ0FMTCBpcyBub3Qgc2V0Ci1DT05GSUdfS0FMTFNZTVM9eQotIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0Ci1DT05GSUdfSE9UUExVRz15Ci1DT05GSUdfUFJJTlRLPXkKLUNPTkZJR19CVUc9eQotQ09ORklHX0VMRl9DT1JFPXkKLUNPTkZJR19CQVNFX0ZVTEw9eQotQ09ORklHX0ZVVEVYPXkKLUNPTkZJR19FUE9MTD15Ci1DT05GSUdfU0hNRU09eQotQ09ORklHX1NMQUI9eQotQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKLUNPTkZJR19SVF9NVVRFWEVTPXkKLSMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAotQ09ORklHX0JBU0VfU01BTEw9MAotIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0Ci0KLSMKLSMgTG9hZGFibGUgbW9kdWxlIHN1cHBvcnQKLSMKLUNPTkZJR19NT0RVTEVTPXkKLSMgQ09ORklHX01PRFVMRV9VTkxPQUQgaXMgbm90IHNldAotIyBDT05GSUdfTU9EVkVSU0lPTlMgaXMgbm90IHNldAotIyBDT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMIGlzIG5vdCBzZXQKLUNPTkZJR19LTU9EPXkKLQotIwotIyBCbG9jayBsYXllcgotIwotQ09ORklHX0JMT0NLPXkKLSMgQ09ORklHX0xCRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0xTRiBpcyBub3Qgc2V0Ci0KLSMKLSMgSU8gU2NoZWR1bGVycwotIwotQ09ORklHX0lPU0NIRURfTk9PUD15Ci1DT05GSUdfSU9TQ0hFRF9BUz15Ci1DT05GSUdfSU9TQ0hFRF9ERUFETElORT15Ci1DT05GSUdfSU9TQ0hFRF9DRlE9eQotQ09ORklHX0RFRkFVTFRfQVM9eQotIyBDT05GSUdfREVGQVVMVF9ERUFETElORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUZBVUxUX0NGUSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUZBVUxUX05PT1AgaXMgbm90IHNldAotQ09ORklHX0RFRkFVTFRfSU9TQ0hFRD0iYW50aWNpcGF0b3J5IgotCi0jCi0jIEJ1cyBvcHRpb25zIChQQ0ksIFBDTUNJQSwgRUlTQSwgSVNBLCBUQykKLSMKLUNPTkZJR19IV19IQVNfUENJPXkKLUNPTkZJR19QQ0k9eQotQ09ORklHX01NVT15Ci0KLSMKLSMgUENDQVJEIChQQ01DSUEvQ2FyZEJ1cykgc3VwcG9ydAotIwotIyBDT05GSUdfUENDQVJEIGlzIG5vdCBzZXQKLQotIwotIyBQQ0kgSG90cGx1ZyBTdXBwb3J0Ci0jCi0jIENPTkZJR19IT1RQTFVHX1BDSSBpcyBub3Qgc2V0Ci0KLSMKLSMgRXhlY3V0YWJsZSBmaWxlIGZvcm1hdHMKLSMKLUNPTkZJR19CSU5GTVRfRUxGPXkKLSMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKLUNPTkZJR19UUkFEX1NJR05BTFM9eQotCi0jCi0jIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucwotIwotQ09ORklHX1BNPXkKLSMgQ09ORklHX1BNX0xFR0FDWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QTV9ERUJVRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19QTV9TWVNGU19ERVBSRUNBVEVEIGlzIG5vdCBzZXQKLQotIwotIyBOZXR3b3JraW5nCi0jCi1DT05GSUdfTkVUPXkKLQotIwotIyBOZXR3b3JraW5nIG9wdGlvbnMKLSMKLSMgQ09ORklHX05FVERFQlVHIGlzIG5vdCBzZXQKLUNPTkZJR19QQUNLRVQ9eQotIyBDT05GSUdfUEFDS0VUX01NQVAgaXMgbm90IHNldAotQ09ORklHX1VOSVg9eQotQ09ORklHX1hGUk09eQotIyBDT05GSUdfWEZSTV9VU0VSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1hGUk1fU1VCX1BPTElDWSBpcyBub3Qgc2V0Ci1DT05GSUdfWEZSTV9NSUdSQVRFPXkKLSMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAotQ09ORklHX0lORVQ9eQotIyBDT05GSUdfSVBfTVVMVElDQVNUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0Ci1DT05GSUdfSVBfRklCX0hBU0g9eQotQ09ORklHX0lQX1BOUD15Ci0jIENPTkZJR19JUF9QTlBfREhDUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUF9QTlBfQk9PVFAgaXMgbm90IHNldAotIyBDT05GSUdfSVBfUE5QX1JBUlAgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSUEQgaXMgbm90IHNldAotIyBDT05GSUdfU1lOX0NPT0tJRVMgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9BSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX0VTUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX0lQQ09NUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX1hGUk1fVFVOTkVMIGlzIG5vdCBzZXQKLUNPTkZJR19JTkVUX1RVTk5FTD1tCi1DT05GSUdfSU5FVF9YRlJNX01PREVfVFJBTlNQT1JUPXkKLUNPTkZJR19JTkVUX1hGUk1fTU9ERV9UVU5ORUw9eQotQ09ORklHX0lORVRfWEZSTV9NT0RFX0JFRVQ9eQotQ09ORklHX0lORVRfRElBRz15Ci1DT05GSUdfSU5FVF9UQ1BfRElBRz15Ci0jIENPTkZJR19UQ1BfQ09OR19BRFZBTkNFRCBpcyBub3Qgc2V0Ci1DT05GSUdfVENQX0NPTkdfQ1VCSUM9eQotQ09ORklHX0RFRkFVTFRfVENQX0NPTkc9ImN1YmljIgotQ09ORklHX1RDUF9NRDVTSUc9eQotCi0jCi0jIElQOiBWaXJ0dWFsIFNlcnZlciBDb25maWd1cmF0aW9uCi0jCi0jIENPTkZJR19JUF9WUyBpcyBub3Qgc2V0Ci1DT05GSUdfSVBWNj1tCi0jIENPTkZJR19JUFY2X1BSSVZBQ1kgaXMgbm90IHNldAotQ09ORklHX0lQVjZfUk9VVEVSX1BSRUY9eQotQ09ORklHX0lQVjZfUk9VVEVfSU5GTz15Ci0jIENPTkZJR19JTkVUNl9BSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUNl9FU1AgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVDZfSVBDT01QIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQVjZfTUlQNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUNl9YRlJNX1RVTk5FTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUNl9UVU5ORUwgaXMgbm90IHNldAotQ09ORklHX0lORVQ2X1hGUk1fTU9ERV9UUkFOU1BPUlQ9bQotQ09ORklHX0lORVQ2X1hGUk1fTU9ERV9UVU5ORUw9bQotQ09ORklHX0lORVQ2X1hGUk1fTU9ERV9CRUVUPW0KLSMgQ09ORklHX0lORVQ2X1hGUk1fTU9ERV9ST1VURU9QVElNSVpBVElPTiBpcyBub3Qgc2V0Ci1DT05GSUdfSVBWNl9TSVQ9bQotIyBDT05GSUdfSVBWNl9UVU5ORUwgaXMgbm90IHNldAotIyBDT05GSUdfSVBWNl9NVUxUSVBMRV9UQUJMRVMgaXMgbm90IHNldAotIyBDT05GSUdfTkVUV09SS19TRUNNQVJLIGlzIG5vdCBzZXQKLUNPTkZJR19ORVRGSUxURVI9eQotIyBDT05GSUdfTkVURklMVEVSX0RFQlVHIGlzIG5vdCBzZXQKLQotIwotIyBDb3JlIE5ldGZpbHRlciBDb25maWd1cmF0aW9uCi0jCi0jIENPTkZJR19ORVRGSUxURVJfTkVUTElOSyBpcyBub3Qgc2V0Ci1DT05GSUdfTkZfQ09OTlRSQUNLX0VOQUJMRUQ9bQotQ09ORklHX05GX0NPTk5UUkFDS19TVVBQT1JUPXkKLSMgQ09ORklHX0lQX05GX0NPTk5UUkFDS19TVVBQT1JUIGlzIG5vdCBzZXQKLUNPTkZJR19ORl9DT05OVFJBQ0s9bQotQ09ORklHX05GX0NUX0FDQ1Q9eQotQ09ORklHX05GX0NPTk5UUkFDS19NQVJLPXkKLUNPTkZJR19ORl9DT05OVFJBQ0tfRVZFTlRTPXkKLUNPTkZJR19ORl9DVF9QUk9UT19HUkU9bQotQ09ORklHX05GX0NUX1BST1RPX1NDVFA9bQotQ09ORklHX05GX0NPTk5UUkFDS19BTUFOREE9bQotQ09ORklHX05GX0NPTk5UUkFDS19GVFA9bQotQ09ORklHX05GX0NPTk5UUkFDS19IMzIzPW0KLUNPTkZJR19ORl9DT05OVFJBQ0tfSVJDPW0KLSMgQ09ORklHX05GX0NPTk5UUkFDS19ORVRCSU9TX05TIGlzIG5vdCBzZXQKLUNPTkZJR19ORl9DT05OVFJBQ0tfUFBUUD1tCi1DT05GSUdfTkZfQ09OTlRSQUNLX1NBTkU9bQotQ09ORklHX05GX0NPTk5UUkFDS19TSVA9bQotQ09ORklHX05GX0NPTk5UUkFDS19URlRQPW0KLUNPTkZJR19ORVRGSUxURVJfWFRBQkxFUz1tCi1DT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9DTEFTU0lGWT1tCi1DT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9NQVJLPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX05GUVVFVUU9bQotQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfTkZMT0c9bQotQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfVENQTVNTPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfQ09NTUVOVD1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX0NPTk5CWVRFUz1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX0NPTk5NQVJLPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfQ09OTlRSQUNLPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfRENDUD1tCi0jIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfRFNDUCBpcyBub3Qgc2V0Ci1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX0VTUD1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX0hFTFBFUj1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX0xFTkdUSD1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX0xJTUlUPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTUFDPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTUFSSz1tCi0jIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUE9MSUNZIGlzIG5vdCBzZXQKLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTVVMVElQT1JUPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUEtUVFlQRT1tCi0jIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUVVPVEEgaXMgbm90IHNldAotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9SRUFMTT1tCi1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX1NDVFA9bQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9TVEFURT1tCi0jIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfU1RBVElTVElDIGlzIG5vdCBzZXQKLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfU1RSSU5HPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfVENQTVNTPW0KLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfSEFTSExJTUlUPW0KLQotIwotIyBJUDogTmV0ZmlsdGVyIENvbmZpZ3VyYXRpb24KLSMKLUNPTkZJR19ORl9DT05OVFJBQ0tfSVBWND1tCi1DT05GSUdfTkZfQ09OTlRSQUNLX1BST0NfQ09NUEFUPXkKLSMgQ09ORklHX0lQX05GX1FVRVVFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX05GX0lQVEFCTEVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX05GX0FSUFRBQkxFUyBpcyBub3Qgc2V0Ci0KLSMKLSMgSVB2NjogTmV0ZmlsdGVyIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKLSMKLUNPTkZJR19ORl9DT05OVFJBQ0tfSVBWNj1tCi0jIENPTkZJR19JUDZfTkZfUVVFVUUgaXMgbm90IHNldAotIyBDT05GSUdfSVA2X05GX0lQVEFCTEVTIGlzIG5vdCBzZXQKLQotIwotIyBEQ0NQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKLSMKLSMgQ09ORklHX0lQX0RDQ1AgaXMgbm90IHNldAotCi0jCi0jIFNDVFAgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQotIwotIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0Ci0KLSMKLSMgVElQQyBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCi0jCi0jIENPTkZJR19USVBDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FUTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CUklER0UgaXMgbm90IHNldAotIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUNORVQgaXMgbm90IHNldAotIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUFggaXMgbm90IHNldAotIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAotIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKLSMgQ09ORklHX0xBUEIgaXMgbm90IHNldAotIyBDT05GSUdfRUNPTkVUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1dBTl9ST1VURVIgaXMgbm90IHNldAotCi0jCi0jIFFvUyBhbmQvb3IgZmFpciBxdWV1ZWluZwotIwotIyBDT05GSUdfTkVUX1NDSEVEIGlzIG5vdCBzZXQKLUNPTkZJR19ORVRfQ0xTX1JPVVRFPXkKLQotIwotIyBOZXR3b3JrIHRlc3RpbmcKLSMKLSMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAotIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAotIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JRUVFODAyMTEgaXMgbm90IHNldAotCi0jCi0jIERldmljZSBEcml2ZXJzCi0jCi0KLSMKLSMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucwotIwotQ09ORklHX1NUQU5EQUxPTkU9eQotQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQotQ09ORklHX0ZXX0xPQURFUj15Ci0jIENPTkZJR19TWVNfSFlQRVJWSVNPUiBpcyBub3Qgc2V0Ci0KLSMKLSMgQ29ubmVjdG9yIC0gdW5pZmllZCB1c2Vyc3BhY2UgPC0+IGtlcm5lbHNwYWNlIGxpbmtlcgotIwotIyBDT05GSUdfQ09OTkVDVE9SIGlzIG5vdCBzZXQKLQotIwotIyBNZW1vcnkgVGVjaG5vbG9neSBEZXZpY2VzIChNVEQpCi0jCi0jIENPTkZJR19NVEQgaXMgbm90IHNldAotCi0jCi0jIFBhcmFsbGVsIHBvcnQgc3VwcG9ydAotIwotIyBDT05GSUdfUEFSUE9SVCBpcyBub3Qgc2V0Ci0KLSMKLSMgUGx1ZyBhbmQgUGxheSBzdXBwb3J0Ci0jCi0jIENPTkZJR19QTlBBQ1BJIGlzIG5vdCBzZXQKLQotIwotIyBCbG9jayBkZXZpY2VzCi0jCi0jIENPTkZJR19CTEtfQ1BRX0RBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19DUFFfQ0lTU19EQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0RBQzk2MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX1VNRU0gaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9DT1dfQ09NTU9OIGlzIG5vdCBzZXQKLUNPTkZJR19CTEtfREVWX0xPT1A9eQotIyBDT05GSUdfQkxLX0RFVl9DUllQVE9MT09QIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfTkJEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfU1g4IGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfVUIgaXMgbm90IHNldAotQ09ORklHX0JMS19ERVZfUkFNPXkKLUNPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgotQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9ODE5MgotQ09ORklHX0JMS19ERVZfUkFNX0JMT0NLU0laRT0xMDI0Ci1DT05GSUdfQkxLX0RFVl9JTklUUkQ9eQotIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAotCi0jCi0jIE1pc2MgZGV2aWNlcwotIwotQ09ORklHX1NHSV9JT0M0PW0KLSMgQ09ORklHX1RJRk1fQ09SRSBpcyBub3Qgc2V0Ci0KLSMKLSMgQVRBL0FUQVBJL01GTS9STEwgc3VwcG9ydAotIwotQ09ORklHX0lERT15Ci1DT05GSUdfSURFX01BWF9IV0lGUz00Ci1DT05GSUdfQkxLX0RFVl9JREU9eQotCi0jCi0jIFBsZWFzZSBzZWUgRG9jdW1lbnRhdGlvbi9pZGUudHh0IGZvciBoZWxwL2luZm8gb24gSURFIGRyaXZlcwotIwotIyBDT05GSUdfQkxLX0RFVl9JREVfU0FUQSBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9JREVESVNLPXkKLUNPTkZJR19JREVESVNLX01VTFRJX01PREU9eQotIyBDT05GSUdfQkxLX0RFVl9JREVDRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0lERVRBUEUgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9JREVGTE9QUFkgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9JREVTQ1NJIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lERV9UQVNLX0lPQ1RMIGlzIG5vdCBzZXQKLQotIwotIyBJREUgY2hpcHNldCBzdXBwb3J0L2J1Z2ZpeGVzCi0jCi1DT05GSUdfSURFX0dFTkVSSUM9eQotQ09ORklHX0JMS19ERVZfSURFUENJPXkKLUNPTkZJR19JREVQQ0lfU0hBUkVfSVJRPXkKLSMgQ09ORklHX0JMS19ERVZfT0ZGQk9BUkQgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9HRU5FUklDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfT1BUSTYyMSBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9JREVETUFfUENJPXkKLSMgQ09ORklHX0JMS19ERVZfSURFRE1BX0ZPUkNFRCBpcyBub3Qgc2V0Ci1DT05GSUdfSURFRE1BX1BDSV9BVVRPPXkKLSMgQ09ORklHX0lERURNQV9PTkxZRElTSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0FFQzYyWFggaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9BTEkxNVgzIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfQU1ENzRYWCBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9DTUQ2NFg9eQotIyBDT05GSUdfQkxLX0RFVl9UUklGTEVYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfQ1k4MkM2OTMgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9DUzU1MjAgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9DUzU1MzAgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9IUFQzNFggaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9IUFQzNjYgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9KTUlDUk9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfU0MxMjAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfUElJWCBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9JVDgyMTM9bQotIyBDT05GSUdfQkxLX0RFVl9JVDgyMVggaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9OUzg3NDE1IGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfUERDMjAyWFhfT0xEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfUERDMjAyWFhfTkVXIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfU1ZXS1MgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9TSUlNQUdFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfU0xDOTBFNjYgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9UUk0yOTAgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9WSUE4MkNYWFggaXMgbm90IHNldAotQ09ORklHX0JMS19ERVZfVEM4NkMwMDE9bQotIyBDT05GSUdfSURFX0FSTSBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9JREVETUE9eQotIyBDT05GSUdfSURFRE1BX0lWQiBpcyBub3Qgc2V0Ci1DT05GSUdfSURFRE1BX0FVVE89eQotIyBDT05GSUdfQkxLX0RFVl9IRCBpcyBub3Qgc2V0Ci0KLSMKLSMgU0NTSSBkZXZpY2Ugc3VwcG9ydAotIwotIyBDT05GSUdfUkFJRF9BVFRSUyBpcyBub3Qgc2V0Ci1DT05GSUdfU0NTST15Ci1DT05GSUdfU0NTSV9UR1Q9bQotQ09ORklHX1NDU0lfTkVUTElOSz15Ci1DT05GSUdfU0NTSV9QUk9DX0ZTPXkKLQotIwotIyBTQ1NJIHN1cHBvcnQgdHlwZSAoZGlzaywgdGFwZSwgQ0QtUk9NKQotIwotQ09ORklHX0JMS19ERVZfU0Q9eQotIyBDT05GSUdfQ0hSX0RFVl9TVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DSFJfREVWX09TU1QgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9TUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DSFJfREVWX1NHIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NIUl9ERVZfU0NIIGlzIG5vdCBzZXQKLQotIwotIyBTb21lIFNDU0kgZGV2aWNlcyAoZS5nLiBDRCBqdWtlYm94KSBzdXBwb3J0IG11bHRpcGxlIExVTnMKLSMKLSMgQ09ORklHX1NDU0lfTVVMVElfTFVOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfQ09OU1RBTlRTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfTE9HR0lORyBpcyBub3Qgc2V0Ci1DT05GSUdfU0NTSV9TQ0FOX0FTWU5DPXkKLQotIwotIyBTQ1NJIFRyYW5zcG9ydHMKLSMKLUNPTkZJR19TQ1NJX1NQSV9BVFRSUz1tCi1DT05GSUdfU0NTSV9GQ19BVFRSUz15Ci1DT05GSUdfU0NTSV9JU0NTSV9BVFRSUz1tCi0jIENPTkZJR19TQ1NJX1NBU19BVFRSUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX1NBU19MSUJTQVMgaXMgbm90IHNldAotCi0jCi0jIFNDU0kgbG93LWxldmVsIGRyaXZlcnMKLSMKLUNPTkZJR19JU0NTSV9UQ1A9bQotIyBDT05GSUdfQkxLX0RFVl8zV19YWFhYX1JBSUQgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV8zV185WFhYIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfQUNBUkQgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9BQUNSQUlEIGlzIG5vdCBzZXQKLUNPTkZJR19TQ1NJX0FJQzdYWFg9bQotQ09ORklHX0FJQzdYWFhfQ01EU19QRVJfREVWSUNFPTMyCi1DT05GSUdfQUlDN1hYWF9SRVNFVF9ERUxBWV9NUz0xNTAwMAotIyBDT05GSUdfQUlDN1hYWF9ERUJVR19FTkFCTEUgaXMgbm90IHNldAotQ09ORklHX0FJQzdYWFhfREVCVUdfTUFTSz0wCi0jIENPTkZJR19BSUM3WFhYX1JFR19QUkVUVFlfUFJJTlQgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9BSUM3WFhYX09MRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0FJQzc5WFggaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9BSUM5NFhYIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfRFBUX0kyTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0FSQ01TUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRUdBUkFJRF9ORVdHRU4gaXMgbm90IHNldAotIyBDT05GSUdfTUVHQVJBSURfTEVHQUNZIGlzIG5vdCBzZXQKLSMgQ09ORklHX01FR0FSQUlEX1NBUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0hQVElPUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0RNWDMxOTFEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfRlVUVVJFX0RPTUFJTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0lQUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0lOSVRJTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0lOSUExMDAgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9TVEVYIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfU1lNNTNDOFhYXzIgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9RTE9HSUNfMTI4MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX1FMQV9GQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX1FMQV9JU0NTSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0xQRkMgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9EQzM5NXggaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9EQzM5MFQgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9OU1AzMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0RFQlVHIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfU1JQIGlzIG5vdCBzZXQKLQotIwotIyBTZXJpYWwgQVRBIChwcm9kKSBhbmQgUGFyYWxsZWwgQVRBIChleHBlcmltZW50YWwpIGRyaXZlcnMKLSMKLSMgQ09ORklHX0FUQSBpcyBub3Qgc2V0Ci0KLSMKLSMgTXVsdGktZGV2aWNlIHN1cHBvcnQgKFJBSUQgYW5kIExWTSkKLSMKLSMgQ09ORklHX01EIGlzIG5vdCBzZXQKLQotIwotIyBGdXNpb24gTVBUIGRldmljZSBzdXBwb3J0Ci0jCi0jIENPTkZJR19GVVNJT04gaXMgbm90IHNldAotIyBDT05GSUdfRlVTSU9OX1NQSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19GVVNJT05fRkMgaXMgbm90IHNldAotIyBDT05GSUdfRlVTSU9OX1NBUyBpcyBub3Qgc2V0Ci0KLSMKLSMgSUVFRSAxMzk0IChGaXJlV2lyZSkgc3VwcG9ydAotIwotIyBDT05GSUdfSUVFRTEzOTQgaXMgbm90IHNldAotCi0jCi0jIEkyTyBkZXZpY2Ugc3VwcG9ydAotIwotIyBDT05GSUdfSTJPIGlzIG5vdCBzZXQKLQotIwotIyBOZXR3b3JrIGRldmljZSBzdXBwb3J0Ci0jCi1DT05GSUdfTkVUREVWSUNFUz15Ci0jIENPTkZJR19EVU1NWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qgc2V0Ci1DT05GSUdfVFVOPW0KLQotIwotIyBBUkNuZXQgZGV2aWNlcwotIwotIyBDT05GSUdfQVJDTkVUIGlzIG5vdCBzZXQKLQotIwotIyBQSFkgZGV2aWNlIHN1cHBvcnQKLSMKLSMgQ09ORklHX1BIWUxJQiBpcyBub3Qgc2V0Ci0KLSMKLSMgRXRoZXJuZXQgKDEwIG9yIDEwME1iaXQpCi0jCi1DT05GSUdfTkVUX0VUSEVSTkVUPXkKLUNPTkZJR19NSUk9eQotIyBDT05GSUdfSEFQUFlNRUFMIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NVTkdFTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DQVNTSU5JIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9WRU5ET1JfM0NPTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ETTkwMDAgaXMgbm90IHNldAotCi0jCi0jIFR1bGlwIGZhbWlseSBuZXR3b3JrIGRldmljZSBzdXBwb3J0Ci0jCi0jIENPTkZJR19ORVRfVFVMSVAgaXMgbm90IHNldAotIyBDT05GSUdfSFAxMDAgaXMgbm90IHNldAotQ09ORklHX05FVF9QQ0k9eQotIyBDT05GSUdfUENORVQzMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19BTUQ4MTExX0VUSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BREFQVEVDX1NUQVJGSVJFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0I0NCBpcyBub3Qgc2V0Ci0jIENPTkZJR19GT1JDRURFVEggaXMgbm90IHNldAotIyBDT05GSUdfREdSUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19FRVBSTzEwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19FMTAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZFQUxOWCBpcyBub3Qgc2V0Ci1DT05GSUdfTkFUU0VNST15Ci0jIENPTkZJR19ORTJLX1BDSSBpcyBub3Qgc2V0Ci0jIENPTkZJR184MTM5Q1AgaXMgbm90IHNldAotQ09ORklHXzgxMzlUT089eQotIyBDT05GSUdfODEzOVRPT19QSU8gaXMgbm90IHNldAotIyBDT05GSUdfODEzOVRPT19UVU5FX1RXSVNURVIgaXMgbm90IHNldAotIyBDT05GSUdfODEzOVRPT184MTI5IGlzIG5vdCBzZXQKLSMgQ09ORklHXzgxMzlfT0xEX1JYX1JFU0VUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NJUzkwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19FUElDMTAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NVTkRBTkNFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RMQU4gaXMgbm90IHNldAotIyBDT05GSUdfVklBX1JISU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDOTIwMzEgaXMgbm90IHNldAotCi0jCi0jIEV0aGVybmV0ICgxMDAwIE1iaXQpCi0jCi0jIENPTkZJR19BQ0VOSUMgaXMgbm90IHNldAotIyBDT05GSUdfREwySyBpcyBub3Qgc2V0Ci0jIENPTkZJR19FMTAwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19OUzgzODIwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hBTUFDSEkgaXMgbm90IHNldAotIyBDT05GSUdfWUVMTE9XRklOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1I4MTY5IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NJUzE5MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TS0dFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NLWTIgaXMgbm90IHNldAotIyBDT05GSUdfU0s5OExJTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19WSUFfVkVMT0NJVFkgaXMgbm90IHNldAotIyBDT05GSUdfVElHT04zIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JOWDIgaXMgbm90IHNldAotIyBDT05GSUdfUUxBM1hYWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVEwxIGlzIG5vdCBzZXQKLQotIwotIyBFdGhlcm5ldCAoMTAwMDAgTWJpdCkKLSMKLSMgQ09ORklHX0NIRUxTSU9fVDEgaXMgbm90IHNldAotQ09ORklHX0NIRUxTSU9fVDM9bQotIyBDT05GSUdfSVhHQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TMklPIGlzIG5vdCBzZXQKLSMgQ09ORklHX01ZUkkxMEdFIGlzIG5vdCBzZXQKLUNPTkZJR19ORVRYRU5fTklDPW0KLQotIwotIyBUb2tlbiBSaW5nIGRldmljZXMKLSMKLSMgQ09ORklHX1RSIGlzIG5vdCBzZXQKLQotIwotIyBXaXJlbGVzcyBMQU4gKG5vbi1oYW1yYWRpbykKLSMKLSMgQ09ORklHX05FVF9SQURJTyBpcyBub3Qgc2V0Ci0KLSMKLSMgV2FuIGludGVyZmFjZXMKLSMKLSMgQ09ORklHX1dBTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19GRERJIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hJUFBJIGlzIG5vdCBzZXQKLUNPTkZJR19QUFA9bQotIyBDT05GSUdfUFBQX01VTFRJTElOSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUFBfRklMVEVSIGlzIG5vdCBzZXQKLUNPTkZJR19QUFBfQVNZTkM9bQotQ09ORklHX1BQUF9TWU5DX1RUWT1tCi1DT05GSUdfUFBQX0RFRkxBVEU9bQotIyBDT05GSUdfUFBQX0JTRENPTVAgaXMgbm90IHNldAotQ09ORklHX1BQUF9NUFBFPW0KLSMgQ09ORklHX1BQUE9FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NMSVAgaXMgbm90IHNldAotQ09ORklHX1NMSEM9bQotIyBDT05GSUdfTkVUX0ZDIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIQVBFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRDT05TT0xFIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgSVNETiBzdWJzeXN0ZW0KLSMKLSMgQ09ORklHX0lTRE4gaXMgbm90IHNldAotCi0jCi0jIFRlbGVwaG9ueSBTdXBwb3J0Ci0jCi0jIENPTkZJR19QSE9ORSBpcyBub3Qgc2V0Ci0KLSMKLSMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKLSMKLUNPTkZJR19JTlBVVD15Ci0jIENPTkZJR19JTlBVVF9GRl9NRU1MRVNTIGlzIG5vdCBzZXQKLQotIwotIyBVc2VybGFuZCBpbnRlcmZhY2VzCi0jCi1DT05GSUdfSU5QVVRfTU9VU0VERVY9eQotQ09ORklHX0lOUFVUX01PVVNFREVWX1BTQVVYPXkKLUNPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWD0xMDI0Ci1DT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1k9NzY4Ci0jIENPTkZJR19JTlBVVF9KT1lERVYgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfVFNERVYgaXMgbm90IHNldAotQ09ORklHX0lOUFVUX0VWREVWPW0KLSMgQ09ORklHX0lOUFVUX0VWQlVHIGlzIG5vdCBzZXQKLQotIwotIyBJbnB1dCBEZXZpY2UgRHJpdmVycwotIwotQ09ORklHX0lOUFVUX0tFWUJPQVJEPXkKLUNPTkZJR19LRVlCT0FSRF9BVEtCRD15Ci0jIENPTkZJR19LRVlCT0FSRF9TVU5LQkQgaXMgbm90IHNldAotIyBDT05GSUdfS0VZQk9BUkRfTEtLQkQgaXMgbm90IHNldAotIyBDT05GSUdfS0VZQk9BUkRfWFRLQkQgaXMgbm90IHNldAotIyBDT05GSUdfS0VZQk9BUkRfTkVXVE9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX0tFWUJPQVJEX1NUT1dBV0FZIGlzIG5vdCBzZXQKLUNPTkZJR19JTlBVVF9NT1VTRT15Ci1DT05GSUdfTU9VU0VfUFMyPXkKLSMgQ09ORklHX01PVVNFX1NFUklBTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NT1VTRV9WU1hYWEFBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldAotCi0jCi0jIEhhcmR3YXJlIEkvTyBwb3J0cwotIwotQ09ORklHX1NFUklPPXkKLUNPTkZJR19TRVJJT19JODA0Mj15Ci1DT05GSUdfU0VSSU9fU0VSUE9SVD15Ci0jIENPTkZJR19TRVJJT19QQ0lQUzIgaXMgbm90IHNldAotQ09ORklHX1NFUklPX0xJQlBTMj15Ci0jIENPTkZJR19TRVJJT19SQVcgaXMgbm90IHNldAotIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAotCi0jCi0jIENoYXJhY3RlciBkZXZpY2VzCi0jCi1DT05GSUdfVlQ9eQotIyBDT05GSUdfVlRfQ09OU09MRSBpcyBub3Qgc2V0Ci1DT05GSUdfSFdfQ09OU09MRT15Ci0jIENPTkZJR19WVF9IV19DT05TT0xFX0JJTkRJTkcgaXMgbm90IHNldAotQ09ORklHX1NFUklBTF9OT05TVEFOREFSRD15Ci0jIENPTkZJR19DT01QVVRPTkUgaXMgbm90IHNldAotIyBDT05GSUdfUk9DS0VUUE9SVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DWUNMQURFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ESUdJRVBDQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NT1hBX0lOVEVMTElPIGlzIG5vdCBzZXQKLSMgQ09ORklHX01PWEFfU01BUlRJTyBpcyBub3Qgc2V0Ci1DT05GSUdfTU9YQV9TTUFSVElPX05FVz1tCi0jIENPTkZJR19JU0kgaXMgbm90IHNldAotIyBDT05GSUdfU1lOQ0xJTktNUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TWU5DTElOS19HVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19OX0hETEMgaXMgbm90IHNldAotIyBDT05GSUdfUklTQ09NOCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TUEVDSUFMSVggaXMgbm90IHNldAotIyBDT05GSUdfU1ggaXMgbm90IHNldAotIyBDT05GSUdfUklPIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NUQUxEUlYgaXMgbm90IHNldAotCi0jCi0jIFNlcmlhbCBkcml2ZXJzCi0jCi0jIENPTkZJR19TRVJJQUxfODI1MCBpcyBub3Qgc2V0Ci0KLSMKLSMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydAotIwotQ09ORklHX1NFUklBTF9QTlg4WFhYPXkKLUNPTkZJR19TRVJJQUxfUE5YOFhYWF9DT05TT0xFPXkKLUNPTkZJR19TRVJJQUxfQ09SRT15Ci1DT05GSUdfU0VSSUFMX0NPUkVfQ09OU09MRT15Ci0jIENPTkZJR19TRVJJQUxfSlNNIGlzIG5vdCBzZXQKLUNPTkZJR19VTklYOThfUFRZUz15Ci1DT05GSUdfTEVHQUNZX1BUWVM9eQotQ09ORklHX0xFR0FDWV9QVFlfQ09VTlQ9MjU2Ci0KLSMKLSMgSVBNSQotIwotIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKLQotIwotIyBXYXRjaGRvZyBDYXJkcwotIwotIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAotQ09ORklHX0hXX1JBTkRPTT15Ci0jIENPTkZJR19SVEMgaXMgbm90IHNldAotIyBDT05GSUdfR0VOX1JUQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19EVExLIGlzIG5vdCBzZXQKLSMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKLSMgQ09ORklHX0FQUExJQ09NIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RSTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKLQotIwotIyBUUE0gZGV2aWNlcwotIwotIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0Ci0KLSMKLSMgSTJDIHN1cHBvcnQKLSMKLUNPTkZJR19JMkM9bQotQ09ORklHX0kyQ19DSEFSREVWPW0KLQotIwotIyBJMkMgQWxnb3JpdGhtcwotIwotQ09ORklHX0kyQ19BTEdPQklUPW0KLSMgQ09ORklHX0kyQ19BTEdPUENGIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19BTEdPUENBIGlzIG5vdCBzZXQKLQotIwotIyBJMkMgSGFyZHdhcmUgQnVzIHN1cHBvcnQKLSMKLSMgQ09ORklHX0kyQ19BTEkxNTM1IGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19BTEkxNTYzIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19BTEkxNVgzIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19BTUQ3NTYgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX0FNRDgxMTEgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX0k4MDEgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX0k4MTAgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1BJSVg0IGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19ORk9SQ0UyIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19PQ09SRVMgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1BBUlBPUlRfTElHSFQgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1BBU0VNSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfUFJPU0FWQUdFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19TQVZBR0U0IGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19TSVM1NTk1IGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19TSVM2MzAgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1NJUzk2WCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfU1RVQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfVklBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19WSUFQUk8gaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1ZPT0RPTzMgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1BDQV9JU0EgaXMgbm90IHNldAotCi0jCi0jIE1pc2NlbGxhbmVvdXMgSTJDIENoaXAgc3VwcG9ydAotIwotIyBDT05GSUdfU0VOU09SU19EUzEzMzcgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19EUzEzNzQgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19FRVBST00gaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19QQ0Y4NTc0IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfUENBOTUzOSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1BDRjg1OTEgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19NQVg2ODc1IGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19ERUJVR19DT1JFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19ERUJVR19BTEdPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19ERUJVR19CVVMgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX0RFQlVHX0NISVAgaXMgbm90IHNldAotCi0jCi0jIFNQSSBzdXBwb3J0Ci0jCi0jIENPTkZJR19TUEkgaXMgbm90IHNldAotIyBDT05GSUdfU1BJX01BU1RFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgRGFsbGFzJ3MgMS13aXJlIGJ1cwotIwotIyBDT05GSUdfVzEgaXMgbm90IHNldAotCi0jCi0jIEhhcmR3YXJlIE1vbml0b3Jpbmcgc3VwcG9ydAotIwotQ09ORklHX0hXTU9OPXkKLSMgQ09ORklHX0hXTU9OX1ZJRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0FCSVRVR1VSVSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0FETTEwMjEgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19BRE0xMDI1IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfQURNMTAyNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0FETTEwMjkgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19BRE0xMDMxIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfQURNOTI0MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0FTQjEwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0FUWFAxIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfRFMxNjIxIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfRjcxODA1RiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0ZTQ0hFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0ZTQ1BPUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0dMNTE4U00gaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19HTDUyMFNNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfSVQ4NyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0xNNjMgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19MTTc1IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfTE03NyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0xNNzggaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19MTTgwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfTE04MyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0xNODUgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19MTTg3IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfTE05MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0xNOTIgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19NQVgxNjE5IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfUEM4NzM2MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1BDODc0MjcgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19TSVM1NTk1IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfU01TQzQ3TTEgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19TTVNDNDdNMTkyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfU01TQzQ3QjM5NyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1ZJQTY4NkEgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19WVDEyMTEgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19WVDgyMzEgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19XODM3ODFEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfVzgzNzkxRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1c4Mzc5MkQgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19XODM3OTMgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19XODNMNzg1VFMgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19XODM2MjdIRiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1c4MzYyN0VIRiBpcyBub3Qgc2V0Ci0jIENPTkZJR19IV01PTl9ERUJVR19DSElQIGlzIG5vdCBzZXQKLQotIwotIyBNdWx0aW1lZGlhIGRldmljZXMKLSMKLSMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0Ci0KLSMKLSMgRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgRGV2aWNlcwotIwotIyBDT05GSUdfRFZCIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9EQUJVU0IgaXMgbm90IHNldAotCi0jCi0jIEdyYXBoaWNzIHN1cHBvcnQKLSMKLUNPTkZJR19GSVJNV0FSRV9FRElEPXkKLUNPTkZJR19GQj15Ci0jIENPTkZJR19GQl9EREMgaXMgbm90IHNldAotIyBDT05GSUdfRkJfQ0ZCX0ZJTExSRUNUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX0NGQl9DT1BZQVJFQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9DRkJfSU1BR0VCTElUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX1NWR0FMSUIgaXMgbm90IHNldAotIyBDT05GSUdfRkJfTUFDTU9ERVMgaXMgbm90IHNldAotIyBDT05GSUdfRkJfQkFDS0xJR0hUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX01PREVfSEVMUEVSUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9USUxFQkxJVFRJTkcgaXMgbm90IHNldAotIyBDT05GSUdfRkJfQ0lSUlVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX1BNMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9DWUJFUjIwMDAgaXMgbm90IHNldAotIyBDT05GSUdfRkJfQVNJTElBTlQgaXMgbm90IHNldAotIyBDT05GSUdfRkJfSU1TVFQgaXMgbm90IHNldAotIyBDT05GSUdfRkJfUzFEMTNYWFggaXMgbm90IHNldAotIyBDT05GSUdfRkJfTlZJRElBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX1JJVkEgaXMgbm90IHNldAotIyBDT05GSUdfRkJfTUFUUk9YIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX1JBREVPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9BVFkxMjggaXMgbm90IHNldAotIyBDT05GSUdfRkJfQVRZIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX1MzIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX1NBVkFHRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9TSVMgaXMgbm90IHNldAotIyBDT05GSUdfRkJfTkVPTUFHSUMgaXMgbm90IHNldAotIyBDT05GSUdfRkJfS1lSTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl8zREZYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX1ZPT0RPTzEgaXMgbm90IHNldAotIyBDT05GSUdfRkJfU01JVkdYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX1RSSURFTlQgaXMgbm90IHNldAotIyBDT05GSUdfRkJfVklSVFVBTCBpcyBub3Qgc2V0Ci0KLSMKLSMgQ29uc29sZSBkaXNwbGF5IGRyaXZlciBzdXBwb3J0Ci0jCi0jIENPTkZJR19WR0FfQ09OU09MRSBpcyBub3Qgc2V0Ci1DT05GSUdfRFVNTVlfQ09OU09MRT15Ci0jIENPTkZJR19GUkFNRUJVRkZFUl9DT05TT0xFIGlzIG5vdCBzZXQKLQotIwotIyBMb2dvIGNvbmZpZ3VyYXRpb24KLSMKLSMgQ09ORklHX0xPR08gaXMgbm90IHNldAotIyBDT05GSUdfQkFDS0xJR0hUX0xDRF9TVVBQT1JUIGlzIG5vdCBzZXQKLQotIwotIyBTb3VuZAotIwotIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAotCi0jCi0jIEhJRCBEZXZpY2VzCi0jCi1DT05GSUdfSElEPXkKLSMgQ09ORklHX0hJRF9ERUJVRyBpcyBub3Qgc2V0Ci0KLSMKLSMgVVNCIHN1cHBvcnQKLSMKLUNPTkZJR19VU0JfQVJDSF9IQVNfSENEPXkKLUNPTkZJR19VU0JfQVJDSF9IQVNfT0hDST15Ci1DT05GSUdfVVNCX0FSQ0hfSEFTX0VIQ0k9eQotQ09ORklHX1VTQj15Ci0jIENPTkZJR19VU0JfREVCVUcgaXMgbm90IHNldAotCi0jCi0jIE1pc2NlbGxhbmVvdXMgVVNCIG9wdGlvbnMKLSMKLUNPTkZJR19VU0JfREVWSUNFRlM9eQotIyBDT05GSUdfVVNCX0RZTkFNSUNfTUlOT1JTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9TVVNQRU5EIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9PVEcgaXMgbm90IHNldAotCi0jCi0jIFVTQiBIb3N0IENvbnRyb2xsZXIgRHJpdmVycwotIwotIyBDT05GSUdfVVNCX0VIQ0lfSENEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9JU1AxMTZYX0hDRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfT0hDSV9IQ0QgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1VIQ0lfSENEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9TTDgxMV9IQ0QgaXMgbm90IHNldAotCi0jCi0jIFVTQiBEZXZpY2UgQ2xhc3MgZHJpdmVycwotIwotIyBDT05GSUdfVVNCX0FDTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfUFJJTlRFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgTk9URTogVVNCX1NUT1JBR0UgZW5hYmxlcyBTQ1NJLCBhbmQgJ1NDU0kgZGlzayBzdXBwb3J0JwotIwotCi0jCi0jIG1heSBhbHNvIGJlIG5lZWRlZDsgc2VlIFVTQl9TVE9SQUdFIEhlbHAgZm9yIG1vcmUgaW5mb3JtYXRpb24KLSMKLUNPTkZJR19VU0JfU1RPUkFHRT15Ci0jIENPTkZJR19VU0JfU1RPUkFHRV9ERUJVRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfU1RPUkFHRV9EQVRBRkFCIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9TVE9SQUdFX0ZSRUVDT00gaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1NUT1JBR0VfSVNEMjAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9TVE9SQUdFX0RQQ00gaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1NUT1JBR0VfVVNCQVQgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1NUT1JBR0VfU0REUjA5IGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9TVE9SQUdFX1NERFI1NSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfU1RPUkFHRV9KVU1QU0hPVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfU1RPUkFHRV9BTEFVREEgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1NUT1JBR0VfS0FSTUEgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0xJQlVTVUFMIGlzIG5vdCBzZXQKLQotIwotIyBVU0IgSW5wdXQgRGV2aWNlcwotIwotQ09ORklHX1VTQl9ISUQ9eQotIyBDT05GSUdfVVNCX0hJRElOUFVUX1BPV0VSQk9PSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ISURfRkYgaXMgbm90IHNldAotQ09ORklHX1VTQl9ISURERVY9eQotIyBDT05GSUdfVVNCX0FJUFRFSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfV0FDT00gaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0FDRUNBRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfS0JUQUIgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1BPV0VSTUFURSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfVE9VQ0hTQ1JFRU4gaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1lFQUxJTksgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1hQQUQgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0FUSV9SRU1PVEUgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0FUSV9SRU1PVEUyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9LRVlTUEFOX1JFTU9URSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfQVBQTEVUT1VDSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfR1RDTyBpcyBub3Qgc2V0Ci0KLSMKLSMgVVNCIEltYWdpbmcgZGV2aWNlcwotIwotIyBDT05GSUdfVVNCX01EQzgwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfTUlDUk9URUsgaXMgbm90IHNldAotCi0jCi0jIFVTQiBOZXR3b3JrIEFkYXB0ZXJzCi0jCi0jIENPTkZJR19VU0JfQ0FUQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfS0FXRVRIIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9QRUdBU1VTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9SVEw4MTUwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9VU0JORVRfTUlJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9VU0JORVQgaXMgbm90IHNldAotQ09ORklHX1VTQl9NT049eQotCi0jCi0jIFVTQiBwb3J0IGRyaXZlcnMKLSMKLQotIwotIyBVU0IgU2VyaWFsIENvbnZlcnRlciBzdXBwb3J0Ci0jCi0jIENPTkZJR19VU0JfU0VSSUFMIGlzIG5vdCBzZXQKLQotIwotIyBVU0IgTWlzY2VsbGFuZW91cyBkcml2ZXJzCi0jCi0jIENPTkZJR19VU0JfRU1JNjIgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0VNSTI2IGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9BRFVUVVggaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0FVRVJTV0FMRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfUklPNTAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9MRUdPVE9XRVIgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0xDRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfQkVSUllfQ0hBUkdFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9MRUQgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0NZUFJFU1NfQ1k3QzYzIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9DWVRIRVJNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9QSElER0VUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9JRE1PVVNFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9GVERJX0VMQU4gaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0FQUExFRElTUExBWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfTEQgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1RSQU5DRVZJQlJBVE9SIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9URVNUIGlzIG5vdCBzZXQKLQotIwotIyBVU0IgRFNMIG1vZGVtIHN1cHBvcnQKLSMKLQotIwotIyBVU0IgR2FkZ2V0IFN1cHBvcnQKLSMKLSMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldAotCi0jCi0jIE1NQy9TRCBDYXJkIHN1cHBvcnQKLSMKLSMgQ09ORklHX01NQyBpcyBub3Qgc2V0Ci0KLSMKLSMgTEVEIGRldmljZXMKLSMKLSMgQ09ORklHX05FV19MRURTIGlzIG5vdCBzZXQKLQotIwotIyBMRUQgZHJpdmVycwotIwotCi0jCi0jIExFRCBUcmlnZ2VycwotIwotCi0jCi0jIEluZmluaUJhbmQgc3VwcG9ydAotIwotIyBDT05GSUdfSU5GSU5JQkFORCBpcyBub3Qgc2V0Ci0KLSMKLSMgRURBQyAtIGVycm9yIGRldGVjdGlvbiBhbmQgcmVwb3J0aW5nIChSQVMpIChFWFBFUklNRU5UQUwpCi0jCi0KLSMKLSMgUmVhbCBUaW1lIENsb2NrCi0jCi0jIENPTkZJR19SVENfQ0xBU1MgaXMgbm90IHNldAotCi0jCi0jIERNQSBFbmdpbmUgc3VwcG9ydAotIwotIyBDT05GSUdfRE1BX0VOR0lORSBpcyBub3Qgc2V0Ci0KLSMKLSMgRE1BIENsaWVudHMKLSMKLQotIwotIyBETUEgRGV2aWNlcwotIwotCi0jCi0jIEF1eGlsaWFyeSBEaXNwbGF5IHN1cHBvcnQKLSMKLQotIwotIyBWaXJ0dWFsaXphdGlvbgotIwotCi0jCi0jIEZpbGUgc3lzdGVtcwotIwotQ09ORklHX0VYVDJfRlM9eQotIyBDT05GSUdfRVhUMl9GU19YQVRUUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19FWFQyX0ZTX1hJUCBpcyBub3Qgc2V0Ci1DT05GSUdfRVhUM19GUz15Ci1DT05GSUdfRVhUM19GU19YQVRUUj15Ci0jIENPTkZJR19FWFQzX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19FWFQzX0ZTX1NFQ1VSSVRZIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VYVDRERVZfRlMgaXMgbm90IHNldAotQ09ORklHX0pCRD15Ci0jIENPTkZJR19KQkRfREVCVUcgaXMgbm90IHNldAotQ09ORklHX0ZTX01CQ0FDSEU9eQotIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0Ci1DT05GSUdfWEZTX0ZTPW0KLSMgQ09ORklHX1hGU19RVU9UQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19YRlNfU0VDVVJJVFkgaXMgbm90IHNldAotIyBDT05GSUdfWEZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19YRlNfUlQgaXMgbm90IHNldAotIyBDT05GSUdfR0ZTMl9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19PQ0ZTMl9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0Ci1DT05GSUdfSU5PVElGWT15Ci1DT05GSUdfSU5PVElGWV9VU0VSPXkKLSMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKLUNPTkZJR19ETk9USUZZPXkKLUNPTkZJR19BVVRPRlNfRlM9eQotQ09ORklHX0FVVE9GUzRfRlM9eQotIyBDT05GSUdfRlVTRV9GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcwotIwotIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VREZfRlMgaXMgbm90IHNldAotCi0jCi0jIERPUy9GQVQvTlQgRmlsZXN5c3RlbXMKLSMKLUNPTkZJR19GQVRfRlM9eQotQ09ORklHX01TRE9TX0ZTPXkKLUNPTkZJR19WRkFUX0ZTPXkKLUNPTkZJR19GQVRfREVGQVVMVF9DT0RFUEFHRT00MzcKLUNPTkZJR19GQVRfREVGQVVMVF9JT0NIQVJTRVQ9Imlzbzg4NTktMSIKLSMgQ09ORklHX05URlNfRlMgaXMgbm90IHNldAotCi0jCi0jIFBzZXVkbyBmaWxlc3lzdGVtcwotIwotQ09ORklHX1BST0NfRlM9eQotIyBDT05GSUdfUFJPQ19LQ09SRSBpcyBub3Qgc2V0Ci1DT05GSUdfUFJPQ19TWVNDVEw9eQotQ09ORklHX1NZU0ZTPXkKLUNPTkZJR19UTVBGUz15Ci0jIENPTkZJR19UTVBGU19QT1NJWF9BQ0wgaXMgbm90IHNldAotIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKLUNPTkZJR19SQU1GUz15Ci1DT05GSUdfQ09ORklHRlNfRlM9bQotCi0jCi0jIE1pc2NlbGxhbmVvdXMgZmlsZXN5c3RlbXMKLSMKLSMgQ09ORklHX0FERlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQUZGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19IRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSEZTUExVU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAotQ09ORklHX0NSQU1GUz15Ci0jIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAotIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKLQotIwotIyBOZXR3b3JrIEZpbGUgU3lzdGVtcwotIwotQ09ORklHX05GU19GUz15Ci1DT05GSUdfTkZTX1YzPXkKLSMgQ09ORklHX05GU19WM19BQ0wgaXMgbm90IHNldAotIyBDT05GSUdfTkZTX1Y0IGlzIG5vdCBzZXQKLSMgQ09ORklHX05GU19ESVJFQ1RJTyBpcyBub3Qgc2V0Ci1DT05GSUdfTkZTRD1tCi0jIENPTkZJR19ORlNEX1YzIGlzIG5vdCBzZXQKLSMgQ09ORklHX05GU0RfVENQIGlzIG5vdCBzZXQKLUNPTkZJR19ST09UX05GUz15Ci1DT05GSUdfTE9DS0Q9eQotQ09ORklHX0xPQ0tEX1Y0PXkKLUNPTkZJR19FWFBPUlRGUz1tCi1DT05GSUdfTkZTX0NPTU1PTj15Ci1DT05GSUdfU1VOUlBDPXkKLSMgQ09ORklHX1JQQ1NFQ19HU1NfS1JCNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKLUNPTkZJR19TTUJfRlM9bQotIyBDT05GSUdfU01CX05MU19ERUZBVUxUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NJRlMgaXMgbm90IHNldAotIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHXzlQX0ZTIGlzIG5vdCBzZXQKLQotIwotIyBQYXJ0aXRpb24gVHlwZXMKLSMKLSMgQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRCBpcyBub3Qgc2V0Ci1DT05GSUdfTVNET1NfUEFSVElUSU9OPXkKLQotIwotIyBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAotIwotQ09ORklHX05MUz15Ci1DT05GSUdfTkxTX0RFRkFVTFQ9Imlzbzg4NTktMSIKLSMgQ09ORklHX05MU19DT0RFUEFHRV80MzcgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzczNyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfNzc1IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV84NTAgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1MiBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfODU1IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV84NTcgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfODYxIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV84NjIgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfODY0IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV84NjUgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NiBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfODY5IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV85MzYgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzk1MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfOTMyIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV85NDkgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg3NCBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfSVNPODg1OV84IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUwIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUxIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19BU0NJSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfSVNPODg1OV8xIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19JU084ODU5XzIgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0lTTzg4NTlfMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfSVNPODg1OV80IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19JU084ODU5XzUgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0lTTzg4NTlfNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfSVNPODg1OV83IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19JU084ODU5XzkgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0lTTzg4NTlfMTMgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0lTTzg4NTlfMTQgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0lTTzg4NTlfMTUgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0tPSThfUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfS09JOF9VIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19VVEY4IGlzIG5vdCBzZXQKLQotIwotIyBEaXN0cmlidXRlZCBMb2NrIE1hbmFnZXIKLSMKLUNPTkZJR19ETE09bQotQ09ORklHX0RMTV9UQ1A9eQotIyBDT05GSUdfRExNX1NDVFAgaXMgbm90IHNldAotIyBDT05GSUdfRExNX0RFQlVHIGlzIG5vdCBzZXQKLQotIwotIyBQcm9maWxpbmcgc3VwcG9ydAotIwotIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKLQotIwotIyBLZXJuZWwgaGFja2luZwotIwotQ09ORklHX1RSQUNFX0lSUUZMQUdTX1NVUFBPUlQ9eQotIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAotQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLPXkKLSMgQ09ORklHX01BR0lDX1NZU1JRIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VOVVNFRF9TWU1CT0xTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfS0VSTkVMIGlzIG5vdCBzZXQKLUNPTkZJR19MT0dfQlVGX1NISUZUPTE0Ci1DT05GSUdfQ1JPU1NDT01QSUxFPXkKLUNPTkZJR19DTURMSU5FPSIiCi1DT05GSUdfU1lTX1NVUFBPUlRTX0tHREI9eQotCi0jCi0jIFNlY3VyaXR5IG9wdGlvbnMKLSMKLSMgQ09ORklHX0tFWVMgaXMgbm90IHNldAotIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAotCi0jCi0jIENyeXB0b2dyYXBoaWMgb3B0aW9ucwotIwotQ09ORklHX0NSWVBUTz15Ci1DT05GSUdfQ1JZUFRPX0FMR0FQST15Ci1DT05GSUdfQ1JZUFRPX0JMS0NJUEhFUj1tCi1DT05GSUdfQ1JZUFRPX0hBU0g9bQotQ09ORklHX0NSWVBUT19NQU5BR0VSPW0KLSMgQ09ORklHX0NSWVBUT19ITUFDIGlzIG5vdCBzZXQKLUNPTkZJR19DUllQVE9fWENCQz1tCi0jIENPTkZJR19DUllQVE9fTlVMTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fTUQ0IGlzIG5vdCBzZXQKLUNPTkZJR19DUllQVE9fTUQ1PXkKLUNPTkZJR19DUllQVE9fU0hBMT1tCi0jIENPTkZJR19DUllQVE9fU0hBMjU2IGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19TSEE1MTIgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1dQNTEyIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19UR1IxOTIgaXMgbm90IHNldAotQ09ORklHX0NSWVBUT19HRjEyOE1VTD1tCi1DT05GSUdfQ1JZUFRPX0VDQj1tCi1DT05GSUdfQ1JZUFRPX0NCQz1tCi1DT05GSUdfQ1JZUFRPX1BDQkM9bQotQ09ORklHX0NSWVBUT19MUlc9bQotIyBDT05GSUdfQ1JZUFRPX0RFUyBpcyBub3Qgc2V0Ci1DT05GSUdfQ1JZUFRPX0ZDUllQVD1tCi0jIENPTkZJR19DUllQVE9fQkxPV0ZJU0ggaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1RXT0ZJU0ggaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1NFUlBFTlQgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0FFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fQ0FTVDUgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0NBU1Q2IGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19URUEgaXMgbm90IHNldAotQ09ORklHX0NSWVBUT19BUkM0PW0KLSMgQ09ORklHX0NSWVBUT19LSEFaQUQgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0FOVUJJUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fREVGTEFURSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fTUlDSEFFTF9NSUMgaXMgbm90IHNldAotQ09ORklHX0NSWVBUT19DUkMzMkM9bQotQ09ORklHX0NSWVBUT19DQU1FTExJQT1tCi0jIENPTkZJR19DUllQVE9fVEVTVCBpcyBub3Qgc2V0Ci0KLSMKLSMgSGFyZHdhcmUgY3J5cHRvIGRldmljZXMKLSMKLQotIwotIyBMaWJyYXJ5IHJvdXRpbmVzCi0jCi1DT05GSUdfQklUUkVWRVJTRT15Ci1DT05GSUdfQ1JDX0NDSVRUPW0KLSMgQ09ORklHX0NSQzE2IGlzIG5vdCBzZXQKLUNPTkZJR19DUkMzMj15Ci1DT05GSUdfTElCQ1JDMzJDPW0KLUNPTkZJR19aTElCX0lORkxBVEU9eQotQ09ORklHX1pMSUJfREVGTEFURT1tCi1DT05GSUdfVEVYVFNFQVJDSD15Ci1DT05GSUdfVEVYVFNFQVJDSF9LTVA9bQotQ09ORklHX1RFWFRTRUFSQ0hfQk09bQotQ09ORklHX1RFWFRTRUFSQ0hfRlNNPW0KLUNPTkZJR19QTElTVD15Ci1DT05GSUdfSEFTX0lPTUVNPXkKLUNPTkZJR19IQVNfSU9QT1JUPXkKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9ndDY0MTIwL3dycHBtYy9wY2kuYyBiL2FyY2gvbWlwcy9ndDY0MTIwL3dycHBtYy9wY2kuYwppbmRleCAyZmJlOTM0Li4wZDUyODliIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvZ3Q2NDEyMC93cnBwbWMvcGNpLmMKKysrIGIvYXJjaC9taXBzL2d0NjQxMjAvd3JwcG1jL3BjaS5jCkBAIC0xMyw3ICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8YXNtL2d0NjQxMjAuaD4KIAotZXh0ZXJuIHN0cnVjdCBwY2lfb3BzIGd0NjQxMjBfcGNpX29wczsKK2V4dGVybiBzdHJ1Y3QgcGNpX29wcyBndDY0eHh4X3BjaTBfb3BzOwogCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIHBjaTBfaW9fcmVzb3VyY2UgPSB7CiAJLm5hbWUgID0gInBjaV8wIGlvIiwKQEAgLTMwLDcgKzMwLDcgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgaG9zZV8wID0gewotCS5wY2lfb3BzCT0gJmd0NjQxMjBfcGNpX29wcywKKwkucGNpX29wcwk9ICZndDY0eHh4X3BjaTBfb3BzLAogCS5pb19yZXNvdXJjZQk9ICZwY2kwX2lvX3Jlc291cmNlLAogCS5tZW1fcmVzb3VyY2UJPSAmcGNpMF9tZW1fcmVzb3VyY2UsCiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2ptcjM5MjcvY29tbW9uL3Byb20uYyBiL2FyY2gvbWlwcy9qbXIzOTI3L2NvbW1vbi9wcm9tLmMKaW5kZXggYWE0ODFiNy4uNTM5ODgxMyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2ptcjM5MjcvY29tbW9uL3Byb20uYworKysgYi9hcmNoL21pcHMvam1yMzkyNy9jb21tb24vcHJvbS5jCkBAIC00MSwxNiArNDEsNiBAQAogCiAjaW5jbHVkZSA8YXNtL2Jvb3RpbmZvLmg+CiAKLWV4dGVybiBpbnQgcHJvbV9hcmdjOwotZXh0ZXJuIGNoYXIgKipwcm9tX2FyZ3YsICoqcHJvbV9lbnZwOwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIGNoYXIgKm5hbWU7Ci0vKiAgICBjaGFyICp2YWw7ICovCi19dF9lbnZfdmFyOwotCi0KIGNoYXIgKiBfX2luaXQgcHJvbV9nZXRjbWRsaW5lKHZvaWQpCiB7CiAJcmV0dXJuICYoYXJjc19jbWRsaW5lWzBdKTsKQEAgLTYwLDYgKzUwLDggQEAKIHsKIAljaGFyICpjcDsKIAlpbnQgYWN0cjsKKwlpbnQgcHJvbV9hcmdjID0gZndfYXJnMDsKKwljaGFyICoqcHJvbV9hcmd2ID0gKGNoYXIgKiopIGZ3X2FyZzE7CiAKIAlhY3RyID0gMTsgLyogQWx3YXlzIGlnbm9yZSBhcmd2WzBdICovCiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9qbXIzOTI3L2NvbW1vbi9wdXRzLmMgYi9hcmNoL21pcHMvam1yMzkyNy9jb21tb24vcHV0cy5jCmluZGV4IDFjMWNhZDkuLmM2MTFhYjQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9qbXIzOTI3L2NvbW1vbi9wdXRzLmMKKysrIGIvYXJjaC9taXBzL2ptcjM5MjcvY29tbW9uL3B1dHMuYwpAQCAtMzIsMTM3ICszMiwyOSBAQAogICogIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGFzbS9qbXIzOTI3L3R4eDkyNy5oPgogI2luY2x1ZGUgPGFzbS9qbXIzOTI3L3R4MzkyNy5oPgotI2luY2x1ZGUgPGFzbS9qbXIzOTI3L2ptcjM5MjcuaD4KIAogI2RlZmluZSBUSU1FT1VUICAgICAgIDB4ZmZmZmZmCi0jZGVmaW5lIFNMT1dfRE9XTgotCi1zdGF0aWMgY29uc3QgY2hhciBkaWdpdHNbMTZdID0gIjAxMjM0NTY3ODlhYmNkZWYiOwotCi0jaWZkZWYgU0xPV19ET1dOCi0jZGVmaW5lIHNsb3dfZG93bigpIHsgaW50IGs7IGZvciAoaz0wOyBrPDEwMDAwOyBrKyspOyB9Ci0jZWxzZQotI2RlZmluZSBzbG93X2Rvd24oKQotI2VuZGlmCiAKIHZvaWQKLXB1dGNoKGNvbnN0IHVuc2lnbmVkIGNoYXIgYykKK3Byb21fcHV0Y2hhcihjaGFyIGMpCiB7CiAgICAgICAgIGludCBpID0gMDsKIAogICAgICAgICBkbyB7Ci0gICAgICAgICAgICBzbG93X2Rvd24oKTsKICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgIGlmIChpPlRJTUVPVVQpIHsKKyAgICAgICAgICAgIGlmIChpPlRJTUVPVVQpCiAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9CiAgICAgICAgIH0gd2hpbGUgKCEodHgzOTI3X3Npb3B0cigxKS0+Y2lzciAmIFRYeDkyN19TSUNJU1JfVFhBTFMpKTsKIAl0eDM5Mjdfc2lvcHRyKDEpLT50ZmlmbyA9IGM7CiAJcmV0dXJuOwogfQogCi11bnNpZ25lZCBjaGFyIGdldGNoKHZvaWQpCi17Ci0gICAgICAgIGludCBpID0gMDsKLQlpbnQgZGljcjsKLQljaGFyIGM7Ci0KLQkvKiBkaWFibGUgUlggaW50LiAqLwotCWRpY3IgPSB0eDM5Mjdfc2lvcHRyKDEpLT5kaWNyOwotCXR4MzkyN19zaW9wdHIoMSktPmRpY3IgPSAwOwotCi0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIHNsb3dfZG93bigpOwotICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgaWYgKGk+VElNRU9VVCkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9IHdoaWxlICh0eDM5Mjdfc2lvcHRyKDEpLT5kaXNyICYgVFh4OTI3X1NJRElTUl9VVkFMSUQpCi0JCTsKLQljID0gdHgzOTI3X3Npb3B0cigxKS0+cmZpZm87Ci0KLQkvKiBjbGVhciBSWCBpbnQuIHN0YXR1cyAqLwotCXR4MzkyN19zaW9wdHIoMSktPmRpc3IgJj0gflRYeDkyN19TSURJU1JfUkRJUzsKLQkvKiBlbmFibGUgUlggaW50LiAqLwotCXR4MzkyN19zaW9wdHIoMSktPmRpY3IgPSBkaWNyOwotCi0JcmV0dXJuIGM7Ci19CiB2b2lkCi1kb19qbXIzOTI3X2xlZF9zZXQoY2hhciBuKQorcHV0cyhjb25zdCBjaGFyICpjcCkKIHsKLSAgICAvKiBhbmQgd2l0aCBjdXJyZW50IGxlZHMgKi8KLSAgICBqbXIzOTI3X2xlZF9hbmRfc2V0KG4pOwotfQotCi12b2lkCi1wdXRzKHVuc2lnbmVkIGNoYXIgKmNwKQotewotICAgIGludCBpID0gMDsKLQotICAgIHdoaWxlICgqY3ApIHsKLSAgICAgICAgZG8gewotICAgICAgICAgICAgc2xvd19kb3duKCk7Ci0gICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICBpZiAoaT5USU1FT1VUKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gd2hpbGUgKCEodHgzOTI3X3Npb3B0cigxKS0+Y2lzciAmIFRYeDkyN19TSUNJU1JfVFhBTFMpKTsKLQl0eDM5Mjdfc2lvcHRyKDEpLT50ZmlmbyA9ICpjcCsrOwotICAgIH0KLSAgICBwdXRjaCgnXHInKTsKLSAgICBwdXRjaCgnXG4nKTsKLX0KLQotdm9pZAotZnB1dHModW5zaWduZWQgY2hhciAqY3ApCi17Ci0gICAgaW50IGkgPSAwOwotCi0gICAgd2hpbGUgKCpjcCkgewotICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgc2xvd19kb3duKCk7Ci0gICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICBpZiAoaT5USU1FT1VUKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gd2hpbGUgKCEodHgzOTI3X3Npb3B0cigxKS0+Y2lzciAmIFRYeDkyN19TSUNJU1JfVFhBTFMpKTsKLQl0eDM5Mjdfc2lvcHRyKDEpLT50ZmlmbyA9ICpjcCsrOwotICAgIH0KLX0KLQotCi12b2lkCi1wdXQ2NCh1aW50NjRfdCB1bCkKLXsKLSAgICBpbnQgY250OwotICAgIHVuc2lnbmVkIGNoOwotCi0gICAgY250ID0gMTY7ICAgICAgICAgICAgLyogMTYgbmliYmxlcyBpbiBhIDY0IGJpdCBsb25nICovCi0gICAgcHV0Y2goJzAnKTsKLSAgICBwdXRjaCgneCcpOwotICAgIGRvIHsKLSAgICAgICAgY250LS07Ci0gICAgICAgIGNoID0gKHVuc2lnbmVkIGNoYXIpKHVsID4+IGNudCAqIDQpICYgMHgwRjsKLSAgICAgICAgICAgICAgICBwdXRjaChkaWdpdHNbY2hdKTsKLSAgICB9IHdoaWxlIChjbnQgPiAwKTsKLX0KLQotdm9pZAotcHV0MzIodW5zaWduZWQgdSkKLXsKLSAgICBpbnQgY250OwotICAgIHVuc2lnbmVkIGNoOwotCi0gICAgY250ID0gODsgICAgICAgICAgICAvKiA4IG5pYmJsZXMgaW4gYSAzMiBiaXQgbG9uZyAqLwotICAgIHB1dGNoKCcwJyk7Ci0gICAgcHV0Y2goJ3gnKTsKLSAgICBkbyB7Ci0gICAgICAgIGNudC0tOwotICAgICAgICBjaCA9ICh1bnNpZ25lZCBjaGFyKSh1ID4+IGNudCAqIDQpICYgMHgwRjsKLSAgICAgICAgICAgICAgICBwdXRjaChkaWdpdHNbY2hdKTsKLSAgICB9IHdoaWxlIChjbnQgPiAwKTsKKyAgICB3aGlsZSAoKmNwKQorCXByb21fcHV0Y2hhcigqY3ArKyk7CisgICAgcHJvbV9wdXRjaGFyKCdccicpOworICAgIHByb21fcHV0Y2hhcignXG4nKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9qbXIzOTI3L3JiaG1hMzEwMC9NYWtlZmlsZSBiL2FyY2gvbWlwcy9qbXIzOTI3L3JiaG1hMzEwMC9NYWtlZmlsZQppbmRleCAxOGZlOWE4Li44ZDAwYmE0IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvam1yMzkyNy9yYmhtYTMxMDAvTWFrZWZpbGUKKysrIGIvYXJjaC9taXBzL2ptcjM5MjcvcmJobWEzMTAwL01ha2VmaWxlCkBAIC0zLDUgKzMsNCBAQAogIwogCiBvYmoteQkgCQkJKz0gaW5pdC5vIGlycS5vIHNldHVwLm8KLW9iai0kKENPTkZJR19SVU5USU1FX0RFQlVHKSAJKz0gZGVidWcubwogb2JqLSQoQ09ORklHX0tHREIpCQkrPSBrZ2RiX2lvLm8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9qbXIzOTI3L3JiaG1hMzEwMC9pbml0LmMgYi9hcmNoL21pcHMvam1yMzkyNy9yYmhtYTMxMDAvaW5pdC5jCmluZGV4IGE1NWNiNDUuLjkxNjlmYWIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9qbXIzOTI3L3JiaG1hMzEwMC9pbml0LmMKKysrIGIvYXJjaC9taXBzL2ptcjM5MjcvcmJobWEzMTAwL2luaXQuYwpAQCAtMjgsMjAgKzI4LDEwIEBACiAgKiAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiAgKi8KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KLQotI2luY2x1ZGUgPGFzbS9hZGRyc3BhY2UuaD4KICNpbmNsdWRlIDxhc20vYm9vdGluZm8uaD4KLSNpbmNsdWRlIDxhc20vbWlwc3JlZ3MuaD4KICNpbmNsdWRlIDxhc20vam1yMzkyNy9qbXIzOTI3Lmg+CiAKLWludCBwcm9tX2FyZ2M7Ci1jaGFyICoqcHJvbV9hcmd2LCAqKnByb21fZW52cDsKIGV4dGVybiB2b2lkICBfX2luaXQgcHJvbV9pbml0X2NtZGxpbmUodm9pZCk7Ci1leHRlcm4gY2hhciAqcHJvbV9nZXRlbnYoY2hhciAqZW52bmFtZSk7Ci11bnNpZ25lZCBsb25nIG1pcHNfbm9mcHUgPSAwOwogCiBjb25zdCBjaGFyICpnZXRfc3lzdGVtX3R5cGUodm9pZCkKIHsKQEAgLTUyLDcgKzQyLDcgQEAKIAk7CiB9CiAKLWV4dGVybiB2b2lkIHB1dHModW5zaWduZWQgY2hhciAqY3ApOworZXh0ZXJuIHZvaWQgcHV0cyhjb25zdCBjaGFyICpjcCk7CiAKIHZvaWQgX19pbml0IHByb21faW5pdCh2b2lkKQogewpAQCAtNjEsMTAgKzUxLDYgQEAKIAlpZiAoKHR4MzkyN19jY2ZncHRyLT5jY2ZnICYgVFgzOTI3X0NDRkdfVExCT0ZGKSA9PSAwKQogCQlwdXRzKCJXYXJuaW5nOiBUWDM5MjcgVExCIG9mZlxuIik7CiAjZW5kaWYKLQlwcm9tX2FyZ2MgPSBmd19hcmcwOwotCXByb21fYXJndiA9IChjaGFyICoqKSBmd19hcmcxOwotCXByb21fZW52cCA9IChjaGFyICoqKSBmd19hcmcyOwotCiAJbWlwc19tYWNoZ3JvdXAgPSBNQUNIX0dST1VQX1RPU0hJQkE7CiAKICNpZmRlZiBDT05GSUdfVE9TSElCQV9KTVIzOTI3CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvam1yMzkyNy9yYmhtYTMxMDAvaXJxLmMgYi9hcmNoL21pcHMvam1yMzkyNy9yYmhtYTMxMDAvaXJxLmMKaW5kZXggN2QyYzIwMy4uMTE4N2I0NCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2ptcjM5MjcvcmJobWEzMTAwL2lycS5jCisrKyBiL2FyY2gvbWlwcy9qbXIzOTI3L3JiaG1hMzEwMC9pcnEuYwpAQCAtMzAsNTMgKzMwLDIxIEBACiAgKiAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiAgKi8KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L2lycS5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgotI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgotI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAKLSNpbmNsdWRlIDxhc20vaXJxX3JlZ3MuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vbWlwc3JlZ3MuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAKLSNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgotI2luY2x1ZGUgPGFzbS9qbXIzOTI3L2lycS5oPgotI2luY2x1ZGUgPGFzbS9kZWJ1Zy5oPgogI2luY2x1ZGUgPGFzbS9qbXIzOTI3L2ptcjM5MjcuaD4KIAogI2lmIEpNUjM5MjdfSVJRX0VORCA+IE5SX0lSUVMKICNlcnJvciBKTVIzOTI3X0lSUV9FTkQgPiBOUl9JUlFTCiAjZW5kaWYKIAotc3RydWN0IHRiX2lycV9zcGFjZSogdGJfaXJxX3NwYWNlczsKLQotc3RhdGljIGludCBqbXIzOTI3X2lycV9iYXNlID0gLTE7Ci0KLSNpZmRlZiBDT05GSUdfUENJCi1zdGF0aWMgaW50IGptcjM5MjdfZ2VuX2lhY2sodm9pZCkKLXsKLQkvKiBnZW5lcmF0ZSBBQ0sgY3ljbGUgKi8KLSNpZmRlZiBfX0JJR19FTkRJQU4KLQlyZXR1cm4gKHR4MzkyN19wY2ljcHRyLT5paWFkcCA+PiAyNCkgJiAweGZmOwotI2Vsc2UKLQlyZXR1cm4gdHgzOTI3X3BjaWNwdHItPmlpYWRwICYgMHhmZjsKLSNlbmRpZgotfQotI2VuZGlmCi0KICNkZWZpbmUgaXJjX2RsZXZlbAkwCiAjZGVmaW5lIGlyY19lbGV2ZWwJMQogCkBAIC04Nyw4OSArNTUsMjQgQEAKIAk2LCA2LCA2CQkJLyogVE1SICovCiB9OwogCi1zdGF0aWMgdm9pZCBqbXIzOTI3X2lycV9kaXNhYmxlKHVuc2lnbmVkIGludCBpcnFfbnIpOwotc3RhdGljIHZvaWQgam1yMzkyN19pcnFfZW5hYmxlKHVuc2lnbmVkIGludCBpcnFfbnIpOwotCi1zdGF0aWMgdm9pZCBqbXIzOTI3X2lycV9hY2sodW5zaWduZWQgaW50IGlycSkKLXsKLQlpZiAoaXJxID09IEpNUjM5MjdfSVJRX0lSQ19UTVIwKQotCQlqbXIzOTI3X3RtcnB0ci0+dGlzciA9IDA7ICAgICAgIC8qIGFjayBpbnRlcnJ1cHQgKi8KLQotCWptcjM5MjdfaXJxX2Rpc2FibGUoaXJxKTsKLX0KLQotc3RhdGljIHZvaWQgam1yMzkyN19pcnFfZW5kKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JaWYgKCEoaXJxX2Rlc2NbaXJxXS5zdGF0dXMgJiAoSVJRX0RJU0FCTEVEIHwgSVJRX0lOUFJPR1JFU1MpKSkKLQkJam1yMzkyN19pcnFfZW5hYmxlKGlycSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGptcjM5MjdfaXJxX2Rpc2FibGUodW5zaWduZWQgaW50IGlycV9ucikKLXsKLQlzdHJ1Y3QgdGJfaXJxX3NwYWNlKiBzcDsKLQotCWZvciAoc3AgPSB0Yl9pcnFfc3BhY2VzOyBzcDsgc3AgPSBzcC0+bmV4dCkgewotCQlpZiAoc3AtPnN0YXJ0X2lycW5vIDw9IGlycV9uciAmJgotCQkgICAgaXJxX25yIDwgc3AtPnN0YXJ0X2lycW5vICsgc3AtPm5yX2lycXMpIHsKLQkJCWlmIChzcC0+bWFza19mdW5jKQotCQkJCXNwLT5tYXNrX2Z1bmMoaXJxX25yIC0gc3AtPnN0YXJ0X2lycW5vLAotCQkJCQkgICAgICBzcC0+c3BhY2VfaWQpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGptcjM5MjdfaXJxX2VuYWJsZSh1bnNpZ25lZCBpbnQgaXJxX25yKQotewotCXN0cnVjdCB0Yl9pcnFfc3BhY2UqIHNwOwotCi0JZm9yIChzcCA9IHRiX2lycV9zcGFjZXM7IHNwOyBzcCA9IHNwLT5uZXh0KSB7Ci0JCWlmIChzcC0+c3RhcnRfaXJxbm8gPD0gaXJxX25yICYmCi0JCSAgICBpcnFfbnIgPCBzcC0+c3RhcnRfaXJxbm8gKyBzcC0+bnJfaXJxcykgewotCQkJaWYgKHNwLT51bm1hc2tfZnVuYykKLQkJCQlzcC0+dW5tYXNrX2Z1bmMoaXJxX25yIC0gc3AtPnN0YXJ0X2lycW5vLAotCQkJCQkJc3AtPnNwYWNlX2lkKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotfQotCiAvKgogICogQ1AwX1NUQVRVUyBpcyBhIHRocmVhZCdzIHJlc291cmNlIChzYXZlZC9yZXN0b3JlZCBvbiBjb250ZXh0IHN3aXRjaCkuCi0gKiBTbyBkaXNhYmxlX2lycS9lbmFibGVfaXJxIE1VU1QgaGFuZGxlIElPQy9JU0FDL0lSQyByZWdpc3RlcnMuCisgKiBTbyBkaXNhYmxlX2lycS9lbmFibGVfaXJxIE1VU1QgaGFuZGxlIElPQy9JUkMgcmVnaXN0ZXJzLgogICovCi1zdGF0aWMgdm9pZCBtYXNrX2lycV9pc2FjKGludCBpcnFfbnIsIGludCBzcGFjZV9pZCkKK3N0YXRpYyB2b2lkIG1hc2tfaXJxX2lvYyh1bnNpZ25lZCBpbnQgaXJxKQogewogCS8qIDA6IG1hc2sgKi8KLQl1bnNpZ25lZCBjaGFyIGltYXNrID0KLQkJam1yMzkyN19pc2FjX3JlZ19pbihKTVIzOTI3X0lTQUNfSU5UTV9BRERSKTsKLQl1bnNpZ25lZCBpbnQgYml0ICA9IDEgPDwgaXJxX25yOwotCWptcjM5MjdfaXNhY19yZWdfb3V0KGltYXNrICYgfmJpdCwgSk1SMzkyN19JU0FDX0lOVE1fQUREUik7Ci0JLyogZmx1c2ggd3JpdGUgYnVmZmVyICovCi0JKHZvaWQpam1yMzkyN19pb2NfcmVnX2luKEpNUjM5MjdfSU9DX1JFVl9BRERSKTsKLX0KLXN0YXRpYyB2b2lkIHVubWFza19pcnFfaXNhYyhpbnQgaXJxX25yLCBpbnQgc3BhY2VfaWQpCi17Ci0JLyogMDogbWFzayAqLwotCXVuc2lnbmVkIGNoYXIgaW1hc2sgPSBqbXIzOTI3X2lzYWNfcmVnX2luKEpNUjM5MjdfSVNBQ19JTlRNX0FERFIpOwotCXVuc2lnbmVkIGludCBiaXQgID0gMSA8PCBpcnFfbnI7Ci0Jam1yMzkyN19pc2FjX3JlZ19vdXQoaW1hc2sgfCBiaXQsIEpNUjM5MjdfSVNBQ19JTlRNX0FERFIpOwotCS8qIGZsdXNoIHdyaXRlIGJ1ZmZlciAqLwotCSh2b2lkKWptcjM5MjdfaW9jX3JlZ19pbihKTVIzOTI3X0lPQ19SRVZfQUREUik7Ci19Ci0KLXN0YXRpYyB2b2lkIG1hc2tfaXJxX2lvYyhpbnQgaXJxX25yLCBpbnQgc3BhY2VfaWQpCi17Ci0JLyogMDogbWFzayAqLworCXVuc2lnbmVkIGludCBpcnFfbnIgPSBpcnEgLSBKTVIzOTI3X0lSUV9JT0M7CiAJdW5zaWduZWQgY2hhciBpbWFzayA9IGptcjM5MjdfaW9jX3JlZ19pbihKTVIzOTI3X0lPQ19JTlRNX0FERFIpOwogCXVuc2lnbmVkIGludCBiaXQgPSAxIDw8IGlycV9ucjsKIAlqbXIzOTI3X2lvY19yZWdfb3V0KGltYXNrICYgfmJpdCwgSk1SMzkyN19JT0NfSU5UTV9BRERSKTsKIAkvKiBmbHVzaCB3cml0ZSBidWZmZXIgKi8KIAkodm9pZClqbXIzOTI3X2lvY19yZWdfaW4oSk1SMzkyN19JT0NfUkVWX0FERFIpOwogfQotc3RhdGljIHZvaWQgdW5tYXNrX2lycV9pb2MoaW50IGlycV9uciwgaW50IHNwYWNlX2lkKQorc3RhdGljIHZvaWQgdW5tYXNrX2lycV9pb2ModW5zaWduZWQgaW50IGlycSkKIHsKIAkvKiAwOiBtYXNrICovCisJdW5zaWduZWQgaW50IGlycV9uciA9IGlycSAtIEpNUjM5MjdfSVJRX0lPQzsKIAl1bnNpZ25lZCBjaGFyIGltYXNrID0gam1yMzkyN19pb2NfcmVnX2luKEpNUjM5MjdfSU9DX0lOVE1fQUREUik7CiAJdW5zaWduZWQgaW50IGJpdCA9IDEgPDwgaXJxX25yOwogCWptcjM5MjdfaW9jX3JlZ19vdXQoaW1hc2sgfCBiaXQsIEpNUjM5MjdfSU9DX0lOVE1fQUREUik7CkBAIC0xNzcsOCArODAsOSBAQAogCSh2b2lkKWptcjM5MjdfaW9jX3JlZ19pbihKTVIzOTI3X0lPQ19SRVZfQUREUik7CiB9CiAKLXN0YXRpYyB2b2lkIG1hc2tfaXJxX2lyYyhpbnQgaXJxX25yLCBpbnQgc3BhY2VfaWQpCitzdGF0aWMgdm9pZCBtYXNrX2lycV9pcmModW5zaWduZWQgaW50IGlycSkKIHsKKwl1bnNpZ25lZCBpbnQgaXJxX25yID0gaXJxIC0gSk1SMzkyN19JUlFfSVJDOwogCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKmlscnAgPSAmdHgzOTI3X2lyY3B0ci0+aWxyW2lycV9uciAvIDJdOwogCWlmIChpcnFfbnIgJiAxKQogCQkqaWxycCA9ICgqaWxycCAmIDB4MDBmZikgfCAoaXJjX2RsZXZlbCA8PCA4KTsKQEAgLTE5MSw4ICs5NSw5IEBACiAJKHZvaWQpdHgzOTI3X2lyY3B0ci0+c3NyOwogfQogCi1zdGF0aWMgdm9pZCB1bm1hc2tfaXJxX2lyYyhpbnQgaXJxX25yLCBpbnQgc3BhY2VfaWQpCitzdGF0aWMgdm9pZCB1bm1hc2tfaXJxX2lyYyh1bnNpZ25lZCBpbnQgaXJxKQogeworCXVuc2lnbmVkIGludCBpcnFfbnIgPSBpcnEgLSBKTVIzOTI3X0lSUV9JUkM7CiAJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqaWxycCA9ICZ0eDM5MjdfaXJjcHRyLT5pbHJbaXJxX25yIC8gMl07CiAJaWYgKGlycV9uciAmIDEpCiAJCSppbHJwID0gKCppbHJwICYgMHgwMGZmKSB8IChpcmNfbGV2ZWxbaXJxX25yXSA8PCA4KTsKQEAgLTIwMyw5OCArMTA4LDE0IEBACiAJdHgzOTI3X2lyY3B0ci0+aW1yID0gaXJjX2VsZXZlbDsKIH0KIAotc3RydWN0IHRiX2lycV9zcGFjZSBqbXIzOTI3X2lzYWNfaXJxc3BhY2UgPSB7Ci0JLm5leHQgPSBOVUxMLAotCS5zdGFydF9pcnFubyA9IEpNUjM5MjdfSVJRX0lTQUMsCi0JbnJfaXJxcyA6IEpNUjM5MjdfTlJfSVJRX0lTQUMsCi0JLm1hc2tfZnVuYyA9IG1hc2tfaXJxX2lzYWMsCi0JLnVubWFza19mdW5jID0gdW5tYXNrX2lycV9pc2FjLAotCS5uYW1lID0gIklTQUMiLAotCS5zcGFjZV9pZCA9IDAsCi0JY2FuX3NoYXJlIDogMAotfTsKLXN0cnVjdCB0Yl9pcnFfc3BhY2Ugam1yMzkyN19pb2NfaXJxc3BhY2UgPSB7Ci0JLm5leHQgPSBOVUxMLAotCS5zdGFydF9pcnFubyA9IEpNUjM5MjdfSVJRX0lPQywKLQlucl9pcnFzIDogSk1SMzkyN19OUl9JUlFfSU9DLAotCS5tYXNrX2Z1bmMgPSBtYXNrX2lycV9pb2MsCi0JLnVubWFza19mdW5jID0gdW5tYXNrX2lycV9pb2MsCi0JLm5hbWUgPSAiSU9DIiwKLQkuc3BhY2VfaWQgPSAwLAotCWNhbl9zaGFyZSA6IDEKLX07Ci0KLXN0cnVjdCB0Yl9pcnFfc3BhY2Ugam1yMzkyN19pcmNfaXJxc3BhY2UgPSB7Ci0JLm5leHQJCT0gTlVMTCwKLQkuc3RhcnRfaXJxbm8JPSBKTVIzOTI3X0lSUV9JUkMsCi0JLm5yX2lycXMJPSBKTVIzOTI3X05SX0lSUV9JUkMsCi0JLm1hc2tfZnVuYwk9IG1hc2tfaXJxX2lyYywKLQkudW5tYXNrX2Z1bmMJPSB1bm1hc2tfaXJxX2lyYywKLQkubmFtZQkJPSAib24tY2hpcCIsCi0JLnNwYWNlX2lkCT0gMCwKLQkuY2FuX3NoYXJlCT0gMAotfTsKLQotCi0jaWZkZWYgQ09ORklHX1RYX0JSQU5DSF9MSUtFTFlfQlVHX1dPUktBUk9VTkQKLXN0YXRpYyBpbnQgdHhfYnJhbmNoX2xpa2VseV9idWdfY291bnQgPSAwOwotc3RhdGljIGludCBoYXZlX3R4X2JyYW5jaF9saWtlbHlfYnVnID0gMDsKLQotc3RhdGljIHZvaWQgdHhfYnJhbmNoX2xpa2VseV9idWdfZml4dXAodm9pZCkKLXsKLQlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IGdldF9pcnFfcmVncygpOwotCi0JLyogVFgzOS80OS1CVUc6IFVuZGVyIHRoaXMgY29uZGl0aW9uLCB0aGUgaW5zbiBpbiBkZWxheSBzbG90Ci0gICAgICAgICAgIG9mIHRoZSBicmFuY2ggbGlrZWx5IGluc24gaXMgZXhlY3V0ZWQgKG5vdCBudWxsaWZpZWQpIGV2ZW4KLSAgICAgICAgICAgdGhlIGJyYW5jaCBjb25kaXRpb24gaXMgZmFsc2UuICovCi0JaWYgKCFoYXZlX3R4X2JyYW5jaF9saWtlbHlfYnVnKQotCQlyZXR1cm47Ci0JaWYgKChyZWdzLT5jcDBfZXBjICYgMHhmZmYpID09IDB4ZmZjICYmCi0JICAgIEtTRUdYKHJlZ3MtPmNwMF9lcGMpICE9IEtTRUcwICYmCi0JICAgIEtTRUdYKHJlZ3MtPmNwMF9lcGMpICE9IEtTRUcxKSB7Ci0JCXVuc2lnbmVkIGludCBpbnNuID0gKih1bnNpZ25lZCBpbnQqKShyZWdzLT5jcDBfZXBjIC0gNCk7Ci0JCS8qIGJlcWwsYm5lbCxibGV6bCxiZ3R6bCAqLwotCQkvKiBibHR6bCxiZ2V6bCxibGV6YWxsLGJnZXphbGwgKi8KLQkJLyogYmN6ZmwsIGJjenRsICovCi0JCWlmICgoaW5zbiAmIDB4ZjAwMDAwMDApID09IDB4NTAwMDAwMDAgfHwKLQkJICAgIChpbnNuICYgMHhmYzBlMDAwMCkgPT0gMHgwNDAyMDAwMCB8fAotCQkgICAgKGluc24gJiAweGYzZmUwMDAwKSA9PSAweDQxMDIwMDAwKSB7Ci0JCQlyZWdzLT5jcDBfZXBjIC09IDQ7Ci0JCQl0eF9icmFuY2hfbGlrZWx5X2J1Z19jb3VudCsrOwotCQkJcHJpbnRrKEtFUk5fSU5GTwotCQkJICAgICAgICJmaXggYnJhbmNoLWxpa2VyeSBidWcgaW4gJXMgKGluc24gJTA4eClcbiIsCi0JCQkgICAgICAgY3VycmVudC0+Y29tbSwgaW5zbik7Ci0JCX0KLQl9Ci19Ci0jZW5kaWYKLQotc3RhdGljIHZvaWQgam1yMzkyN19zcHVyaW91cyh2b2lkKQotewotCXN0cnVjdCBwdF9yZWdzICogcmVncyA9IGdldF9pcnFfcmVncygpOwotCi0jaWZkZWYgQ09ORklHX1RYX0JSQU5DSF9MSUtFTFlfQlVHX1dPUktBUk9VTkQKLQl0eF9icmFuY2hfbGlrZWx5X2J1Z19maXh1cCgpOwotI2VuZGlmCi0JcHJpbnRrKEtFUk5fV0FSTklORyAic3B1cmlvdXMgaW50ZXJydXB0IChjYXVzZSAweCVseCwgcGMgMHglbHgsIHJhIDB4JWx4KS5cbiIsCi0JICAgICAgIHJlZ3MtPmNwMF9jYXVzZSwgcmVncy0+Y3AwX2VwYywgcmVncy0+cmVnc1szMV0pOwotfQotCiBhc21saW5rYWdlIHZvaWQgcGxhdF9pcnFfZGlzcGF0Y2godm9pZCkKIHsKLQlzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MgPSBnZXRfaXJxX3JlZ3MoKTsKKwl1bnNpZ25lZCBsb25nIGNwMF9jYXVzZSA9IHJlYWRfYzBfY2F1c2UoKTsKIAlpbnQgaXJxOwogCi0jaWZkZWYgQ09ORklHX1RYX0JSQU5DSF9MSUtFTFlfQlVHX1dPUktBUk9VTkQKLQl0eF9icmFuY2hfbGlrZWx5X2J1Z19maXh1cCgpOwotI2VuZGlmCi0JaWYgKChyZWdzLT5jcDBfY2F1c2UgJiBDQVVTRUZfSVA3KSA9PSAwKSB7Ci0jaWYgMAotCQlqbXIzOTI3X3NwdXJpb3VzKCk7Ci0jZW5kaWYKKwlpZiAoKGNwMF9jYXVzZSAmIENBVVNFRl9JUDcpID09IDApCiAJCXJldHVybjsKLQl9Ci0JaXJxID0gKHJlZ3MtPmNwMF9jYXVzZSA+PiBDQVVTRUJfSVAyKSAmIDB4MGY7CisJaXJxID0gKGNwMF9jYXVzZSA+PiBDQVVTRUJfSVAyKSAmIDB4MGY7CiAKIAlkb19JUlEoaXJxICsgSk1SMzkyN19JUlFfSVJDKTsKIH0KQEAgLTMxNywzNSArMTM4LDYgQEAKIAlqbXIzOTI3X2lvY19pbnRlcnJ1cHQsIDAsIENQVV9NQVNLX05PTkUsICJJT0MiLCBOVUxMLCBOVUxMLAogfTsKIAotc3RhdGljIGlycXJldHVybl90IGptcjM5MjdfaXNhY19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQotewotCXVuc2lnbmVkIGNoYXIgaXN0YXQgPSBqbXIzOTI3X2lzYWNfcmVnX2luKEpNUjM5MjdfSVNBQ19JTlRTMl9BRERSKTsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBKTVIzOTI3X05SX0lSUV9JU0FDOyBpKyspIHsKLQkJaWYgKGlzdGF0ICYgKDEgPDwgaSkpIHsKLQkJCWlycSA9IEpNUjM5MjdfSVJRX0lTQUMgKyBpOwotCQkJZG9fSVJRKGlycSk7Ci0JCX0KLQl9Ci0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi1zdGF0aWMgc3RydWN0IGlycWFjdGlvbiBpc2FjX2FjdGlvbiA9IHsKLQlqbXIzOTI3X2lzYWNfaW50ZXJydXB0LCAwLCBDUFVfTUFTS19OT05FLCAiSVNBQyIsIE5VTEwsIE5VTEwsCi19OwotCi0KLXN0YXRpYyBpcnFyZXR1cm5fdCBqbXIzOTI3X2lzYWVycl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQotewotCXByaW50ayhLRVJOX1dBUk5JTkcgIklTQSBlcnJvciBpbnRlcnJ1cHQgKGlycSAweCV4KS5cbiIsIGlycSk7Ci0KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci1zdGF0aWMgc3RydWN0IGlycWFjdGlvbiBpc2FlcnJfYWN0aW9uID0gewotCWptcjM5MjdfaXNhZXJyX2ludGVycnVwdCwgMCwgQ1BVX01BU0tfTk9ORSwgIklTQSBlcnJvciIsIE5VTEwsIE5VTEwsCi19OwotCiBzdGF0aWMgaXJxcmV0dXJuX3Qgam1yMzkyN19wY2llcnJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKIAlwcmludGsoS0VSTl9XQVJOSU5HICJQQ0kgZXJyb3IgaW50ZXJydXB0IChpcnEgMHgleCkuXG4iLCBpcnEpOwpAQCAtMzU4LDU0ICsxNTAsMTkgQEAKIAlqbXIzOTI3X3BjaWVycl9pbnRlcnJ1cHQsIDAsIENQVV9NQVNLX05PTkUsICJQQ0kgZXJyb3IiLCBOVUxMLCBOVUxMLAogfTsKIAotaW50IGptcjM5MjdfZXRoZXIxX2lycSA9IDA7Ci0KLXZvaWQgam1yMzkyN19pcnFfaW5pdCh1MzIgaXJxX2Jhc2UpOworc3RhdGljIHZvaWQgX19pbml0IGptcjM5MjdfaXJxX2luaXQodm9pZCk7CiAKIHZvaWQgX19pbml0IGFyY2hfaW5pdF9pcnEodm9pZCkKIHsKLQkvKiBsb29rIGZvciBpbyBib2FyZCdzIHByZXNlbmNlICovCi0JaW50IGhhdmVfaXNhYyA9IGptcjM5MjdfaGF2ZV9pc2FjKCk7Ci0KIAkvKiBOb3csIGludGVycnVwdCBjb250cm9sIGRpc2FibGVkLCAqLwogCS8qIGFsbCBJUkMgaW50ZXJydXB0cyBhcmUgbWFza2VkLCAqLwogCS8qIGFsbCBJUkMgaW50ZXJydXB0IG1vZGUgYXJlIExvdyBBY3RpdmUuICovCiAKLQlpZiAoaGF2ZV9pc2FjKSB7Ci0KLQkJLyogRVRIRVIxIChORTIwMDAgY29tcGF0aWJsZSAxME0tRXRoZXIpIHBhcmFtZXRlciBzZXR1cCAqLwotCQkvKiB0ZW1wb3JhcnkgZW5hYmxlIGludGVycnVwdCBjb250cm9sICovCi0JCXR4MzkyN19pcmNwdHItPmNlciA9IDE7Ci0JCS8qIEVUSEVSMSBJbnQuIElzIEhpZ2gtQWN0aXZlLiAqLwotCQlpZiAodHgzOTI3X2lyY3B0ci0+c3NyICYgKDEgPDwgMCkpCi0JCQlqbXIzOTI3X2V0aGVyMV9pcnEgPSBKTVIzOTI3X0lSUV9JUkNfSU5UMDsKLSNpZiAwCS8qIElOVDMgbWF5IGJlIGFzc2VydGVkIGJ5IGV0aGVyMCAoZXZlbiBhZnRlciByZWJvb3QuLi4pICovCi0JCWVsc2UgaWYgKHR4MzkyN19pcmNwdHItPnNzciAmICgxIDw8IDMpKQotCQkJam1yMzkyN19ldGhlcjFfaXJxID0gSk1SMzkyN19JUlFfSVJDX0lOVDM7Ci0jZW5kaWYKLQkJLyogZGlzYWJsZSBpbnRlcnJ1cHQgY29udHJvbCAqLwotCQl0eDM5MjdfaXJjcHRyLT5jZXIgPSAwOwotCi0JCS8qIEV0aGVyMTogSGlnaCBBY3RpdmUgKi8KLQkJaWYgKGptcjM5MjdfZXRoZXIxX2lycSkgewotCQkJaW50IGV0aGVyMV9pcmMgPSBqbXIzOTI3X2V0aGVyMV9pcnEgLSBKTVIzOTI3X0lSUV9JUkM7Ci0JCQl0eDM5MjdfaXJjcHRyLT5jcltldGhlcjFfaXJjIC8gOF0gfD0KLQkJCQlUWDM5MjdfSVJDUl9ISUdIIDw8ICgoZXRoZXIxX2lyYyAlIDgpICogMik7Ci0JCX0KLQl9Ci0KIAkvKiBtYXNrIGFsbCBJT0MgaW50ZXJydXB0cyAqLwogCWptcjM5MjdfaW9jX3JlZ19vdXQoMCwgSk1SMzkyN19JT0NfSU5UTV9BRERSKTsKIAkvKiBzZXR1cCBJT0MgaW50ZXJydXB0IG1vZGUgKFNPRlQ6SGlnaCBBY3RpdmUsIE90aGVyczpMb3cgQWN0aXZlKSAqLwogCWptcjM5MjdfaW9jX3JlZ19vdXQoSk1SMzkyN19JT0NfSU5URl9TT0ZULCBKTVIzOTI3X0lPQ19JTlRQX0FERFIpOwogCi0JaWYgKGhhdmVfaXNhYykgewotCQkvKiBtYXNrIGFsbCBJU0FDIGludGVycnVwdHMgKi8KLQkJam1yMzkyN19pc2FjX3JlZ19vdXQoMCwgSk1SMzkyN19JU0FDX0lOVE1fQUREUik7Ci0JCS8qIHNldHVwIElTQUMgaW50ZXJydXB0IG1vZGUgKElTQUlSUTMsSVNBSVJRNTpMb3cgQWN0aXZlID8/PykgKi8KLQkJam1yMzkyN19pc2FjX3JlZ19vdXQoSk1SMzkyN19JU0FDX0lOVEZfSVJRM3xKTVIzOTI3X0lTQUNfSU5URl9JUlE1LCBKTVIzOTI3X0lTQUNfSU5UUF9BRERSKTsKLQl9Ci0KIAkvKiBjbGVhciBQQ0kgU29mdCBpbnRlcnJ1cHRzICovCiAJam1yMzkyN19pb2NfcmVnX291dCgwLCBKTVIzOTI3X0lPQ19JTlRTMV9BRERSKTsKIAkvKiBjbGVhciBQQ0kgUmVzZXQgaW50ZXJydXB0cyAqLwpAQCAtNDE1LDIxICsxNzIsMTEgQEAKIAl0eDM5MjdfaXJjcHRyLT5jZXIgPSBUWDM5MjdfSVJDRVJfSUNFOwogCXR4MzkyN19pcmNwdHItPmltciA9IGlyY19lbGV2ZWw7CiAKLQlqbXIzOTI3X2lycV9pbml0KE5SX0lTQV9JUlFTKTsKLQotCS8qIHNldHVwIGlycSBzcGFjZSAqLwotCWFkZF90Yl9pcnFfc3BhY2UoJmptcjM5MjdfaXNhY19pcnFzcGFjZSk7Ci0JYWRkX3RiX2lycV9zcGFjZSgmam1yMzkyN19pb2NfaXJxc3BhY2UpOwotCWFkZF90Yl9pcnFfc3BhY2UoJmptcjM5MjdfaXJjX2lycXNwYWNlKTsKKwlqbXIzOTI3X2lycV9pbml0KCk7CiAKIAkvKiBzZXR1cCBJT0MgaW50ZXJydXB0IDEgKFBDSSwgTU9ERU0pICovCiAJc2V0dXBfaXJxKEpNUjM5MjdfSVJRX0lPQ0lOVCwgJmlvY19hY3Rpb24pOwogCi0JaWYgKGhhdmVfaXNhYykgewotCQlzZXR1cF9pcnEoSk1SMzkyN19JUlFfSVNBQ0lOVCwgJmlzYWNfYWN0aW9uKTsKLQkJc2V0dXBfaXJxKEpNUjM5MjdfSVJRX0lTQUNfSVNBRVIsICZpc2FlcnJfYWN0aW9uKTsKLQl9Ci0KICNpZmRlZiBDT05GSUdfUENJCiAJc2V0dXBfaXJxKEpNUjM5MjdfSVJRX0lSQ19QQ0ksICZwY2llcnJfYWN0aW9uKTsKICNlbmRpZgpAQCAtNDM4LDIxICsxODUsMjggQEAKIAlzZXRfYzBfc3RhdHVzKFNUMF9JTSk7CS8qIElFIGJpdCBpcyBzdGlsbCAwLiAqLwogfQogCi1zdGF0aWMgc3RydWN0IGlycV9jaGlwIGptcjM5MjdfaXJxX2NvbnRyb2xsZXIgPSB7Ci0JLm5hbWUgPSAiam1yMzkyN19pcnEiLAotCS5hY2sgPSBqbXIzOTI3X2lycV9hY2ssCi0JLm1hc2sgPSBqbXIzOTI3X2lycV9kaXNhYmxlLAotCS5tYXNrX2FjayA9IGptcjM5MjdfaXJxX2FjaywKLQkudW5tYXNrID0gam1yMzkyN19pcnFfZW5hYmxlLAotCS5lbmQgPSBqbXIzOTI3X2lycV9lbmQsCitzdGF0aWMgc3RydWN0IGlycV9jaGlwIGptcjM5MjdfaXJxX2lvYyA9IHsKKwkubmFtZSA9ICJqbXIzOTI3X2lvYyIsCisJLmFjayA9IG1hc2tfaXJxX2lvYywKKwkubWFzayA9IG1hc2tfaXJxX2lvYywKKwkubWFza19hY2sgPSBtYXNrX2lycV9pb2MsCisJLnVubWFzayA9IHVubWFza19pcnFfaW9jLAogfTsKIAotdm9pZCBqbXIzOTI3X2lycV9pbml0KHUzMiBpcnFfYmFzZSkKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgam1yMzkyN19pcnFfaXJjID0geworCS5uYW1lID0gImptcjM5MjdfaXJjIiwKKwkuYWNrID0gbWFza19pcnFfaXJjLAorCS5tYXNrID0gbWFza19pcnFfaXJjLAorCS5tYXNrX2FjayA9IG1hc2tfaXJxX2lyYywKKwkudW5tYXNrID0gdW5tYXNrX2lycV9pcmMsCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgam1yMzkyN19pcnFfaW5pdCh2b2lkKQogewogCXUzMiBpOwogCi0JZm9yIChpPSBpcnFfYmFzZTsgaTwgaXJxX2Jhc2UgKyBKTVIzOTI3X05SX0lSUV9JUkMgKyBKTVIzOTI3X05SX0lSUV9JT0M7IGkrKykKLQkJc2V0X2lycV9jaGlwKGksICZqbXIzOTI3X2lycV9jb250cm9sbGVyKTsKLQotCWptcjM5MjdfaXJxX2Jhc2UgPSBpcnFfYmFzZTsKKwlmb3IgKGkgPSBKTVIzOTI3X0lSUV9JUkM7IGkgPCBKTVIzOTI3X0lSUV9JUkMgKyBKTVIzOTI3X05SX0lSUV9JUkM7IGkrKykKKwkJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyKGksICZqbXIzOTI3X2lycV9pcmMsIGhhbmRsZV9sZXZlbF9pcnEpOworCWZvciAoaSA9IEpNUjM5MjdfSVJRX0lPQzsgaSA8IEpNUjM5MjdfSVJRX0lPQyArIEpNUjM5MjdfTlJfSVJRX0lPQzsgaSsrKQorCQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXIoaSwgJmptcjM5MjdfaXJxX2lvYywgaGFuZGxlX2xldmVsX2lycSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvam1yMzkyNy9yYmhtYTMxMDAva2dkYl9pby5jIGIvYXJjaC9taXBzL2ptcjM5MjcvcmJobWEzMTAwL2tnZGJfaW8uYwppbmRleCAyNjlhNDJkLi4yNjA0ZjJjIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvam1yMzkyNy9yYmhtYTMxMDAva2dkYl9pby5jCisrKyBiL2FyY2gvbWlwcy9qbXIzOTI3L3JiaG1hMzEwMC9rZ2RiX2lvLmMKQEAgLTMxLDIzICszMSwxMiBAQAogICogIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGFzbS9qbXIzOTI3L3R4eDkyNy5oPgotI2luY2x1ZGUgPGFzbS9qbXIzOTI3L3R4MzkyNy5oPgogI2luY2x1ZGUgPGFzbS9qbXIzOTI3L2ptcjM5MjcuaD4KIAogI2RlZmluZSBUSU1FT1VUICAgICAgIDB4ZmZmZmZmCi0jZGVmaW5lIFNMT1dfRE9XTgotCi1zdGF0aWMgY29uc3QgY2hhciBkaWdpdHNbMTZdID0gIjAxMjM0NTY3ODlhYmNkZWYiOwotCi0jaWZkZWYgU0xPV19ET1dOCi0jZGVmaW5lIHNsb3dfZG93bigpIHsgaW50IGs7IGZvciAoaz0wOyBrPDEwMDAwOyBrKyspOyB9Ci0jZWxzZQotI2RlZmluZSBzbG93X2Rvd24oKQotI2VuZGlmCiAKIHN0YXRpYyBpbnQgcmVtb3RlRGVidWdJbml0aWFsaXplZCA9IDA7CitzdGF0aWMgdm9pZCBkZWJ1Z0luaXQoaW50IGJhdWQpCiAKIGludCBwdXREZWJ1Z0NoYXIodW5zaWduZWQgY2hhciBjKQogewpAQCAtMTAzLDIwICs5Miw4IEBACiAJcmV0dXJuIGM7CiB9CiAKLXZvaWQgZGVidWdJbml0KGludCBiYXVkKQorc3RhdGljIHZvaWQgZGVidWdJbml0KGludCBiYXVkKQogewotCS8qCi0Jdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBsY3I7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBkaWNyOwotCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgZGlzcjsKLQl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIGNpc3I7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBmY3I7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBmbGNyOwotCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgYmdyOwotCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgdGZpZm87Ci0Jdm9sYXRpbGUgdW5zaWduZWQgbG9uZyByZmlmbzsKLQkqLwotCiAJdHgzOTI3X3Npb3B0cigwKS0+bGNyID0gMHgwMjA7CiAJdHgzOTI3X3Npb3B0cigwKS0+ZGljciA9IDA7CiAJdHgzOTI3X3Npb3B0cigwKS0+ZGlzciA9IDB4NDEwMDsKQEAgLTEyNSwzMSArMTAyLDQgQEAKIAl0eDM5Mjdfc2lvcHRyKDApLT5mbGNyID0gMHgwMjsKIAl0eDM5Mjdfc2lvcHRyKDApLT5iZ3IgPSAoKEpNUjM5MjdfQkFTRV9CQVVEICsgYmF1ZCAvIDIpIC8gYmF1ZCkgfAogCQlUWHg5MjdfU0lCR1JfQkNMS19UMDsKLSNpZiAwCi0JLyoKLQkgKiBSZXNldCB0aGUgVUFSVC4KLQkgKi8KLQl0eDM5Mjdfc2lvcHRyKDApLT5mY3IgPSBUWHg5MjdfU0lGQ1JfU1dSU1Q7Ci0Jd2hpbGUgKHR4MzkyN19zaW9wdHIoMCktPmZjciAmIFRYeDkyN19TSUZDUl9TV1JTVCkKLQkJOwotCi0JLyoKLQkgKiBhbmQgc2V0IHRoZSBzcGVlZCBvZiB0aGUgc2VyaWFsIHBvcnQKLQkgKiAoY3VycmVudGx5IGhhcmR3aXJlZCB0byA5NjAwIDhOMQotCSAqLwotCi0JdHgzOTI3X3Npb3B0cigwKS0+bGNyID0gVFh4OTI3X1NJTENSX1VNT0RFXzhCSVQgfAotCQlUWHg5MjdfU0lMQ1JfVVNCTF8xQklUIHwKLQkJVFh4OTI3X1NJTENSX1NDU19JTUNMS19CRzsKLQl0eDM5Mjdfc2lvcHRyKDApLT5iZ3IgPQotCQkoKEpNUjM5MjdfQkFTRV9CQVVEICsgYmF1ZCAvIDIpIC8gYmF1ZCkgfAotCQlUWHg5MjdfU0lCR1JfQkNMS19UMDsKLQotCS8qIEhXIFJUUy9DVFMgY29udHJvbCAqLwotCWlmIChzZXItPmZsYWdzICYgQVNZTkNfSEFWRV9DVFNfTElORSkKLQkJdHgzOTI3X3Npb3B0cigwKS0+ZmxjciA9IFRYeDkyN19TSUZMQ1JfUkNTIHwgVFh4OTI3X1NJRkxDUl9URVMgfAotCQkJVFh4OTI3X1NJRkxDUl9SVFNUTF9NQVggLyogMTUgKi87Ci0JLyogRW5hYmxlIFJYL1RYICovCi0JdHgzOTI3X3Npb3B0cigwKS0+ZmxjciAmPSB+KFRYeDkyN19TSUZMQ1JfUlNERSB8IFRYeDkyN19TSUZMQ1JfVFNERSk7Ci0jZW5kaWYKIH0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9qbXIzOTI3L3JiaG1hMzEwMC9zZXR1cC5jIGIvYXJjaC9taXBzL2ptcjM5MjcvcmJobWEzMTAwL3NldHVwLmMKaW5kZXggZmM1MjNiZC4uZDFlZjI4OTUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9qbXIzOTI3L3JiaG1hMzEwMC9zZXR1cC5jCisrKyBiL2FyY2gvbWlwcy9qbXIzOTI3L3JiaG1hMzEwMC9zZXR1cC5jCkBAIC01NCw4NyArNTQsMTggQEAKIAogI2luY2x1ZGUgPGFzbS9hZGRyc3BhY2UuaD4KICNpbmNsdWRlIDxhc20vdGltZS5oPgotI2luY2x1ZGUgPGFzbS9iY2FjaGUuaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL3JlYm9vdC5oPgotI2luY2x1ZGUgPGFzbS9nZGItc3R1Yi5oPgogI2luY2x1ZGUgPGFzbS9qbXIzOTI3L2ptcjM5MjcuaD4KICNpbmNsdWRlIDxhc20vbWlwc3JlZ3MuaD4KLSNpbmNsdWRlIDxhc20vdHJhcHMuaD4KIAotZXh0ZXJuIHZvaWQgcHV0cyh1bnNpZ25lZCBjaGFyICpjcCk7CitleHRlcm4gdm9pZCBwdXRzKGNvbnN0IGNoYXIgKmNwKTsKIAogLyogVGljayBUaW1lciBkaXZpZGVyICovCiAjZGVmaW5lIEpNUjM5MjdfVElNRVJfQ0NECTAJLyogMS8yICovCiAjZGVmaW5lIEpNUjM5MjdfVElNRVJfQ0xLCShKTVIzOTI3X0lNQ0xLIC8gKDIgPDwgSk1SMzkyN19USU1FUl9DQ0QpKQogCi11bnNpZ25lZCBjaGFyIGxlZF9zdGF0ZSA9IDB4ZjsKLQotc3RydWN0IHsKLSAgICBzdHJ1Y3QgcmVzb3VyY2UgcmFtMDsKLSAgICBzdHJ1Y3QgcmVzb3VyY2UgcmFtMTsKLSAgICBzdHJ1Y3QgcmVzb3VyY2UgcGNpbWVtOwotICAgIHN0cnVjdCByZXNvdXJjZSBpb2I7Ci0gICAgc3RydWN0IHJlc291cmNlIGlvYzsKLSAgICBzdHJ1Y3QgcmVzb3VyY2UgcGNpaW87Ci0gICAgc3RydWN0IHJlc291cmNlIGpteTEzOTQ7Ci0gICAgc3RydWN0IHJlc291cmNlIHJvbTE7Ci0gICAgc3RydWN0IHJlc291cmNlIHJvbTA7Ci0gICAgc3RydWN0IHJlc291cmNlIHNpbzA7Ci0gICAgc3RydWN0IHJlc291cmNlIHNpbzE7Ci19IGptcjM5MjdfcmVzb3VyY2VzID0gewotCXsKLQkJLnN0YXJ0CT0gMCwKLQkJLmVuZAk9IDB4MDFGRkZGRkYsCi0JCS5uYW1lCT0gIlJBTTAiLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTQotCX0sIHsKLQkJLnN0YXJ0CT0gMHgwMjAwMDAwMCwKLQkJLmVuZAk9IDB4MDNGRkZGRkYsCi0JCS5uYW1lCT0gIlJBTTEiLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTQotCX0sIHsKLQkJLnN0YXJ0CT0gMHgwODAwMDAwMCwKLQkJLmVuZAk9IDB4MDdGRkZGRkYsCi0JCS5uYW1lCT0gIlBDSU1FTSIsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNCi0JfSwgewotCQkuc3RhcnQJPSAweDEwMDAwMDAwLAotCQkuZW5kCT0gMHgxM0ZGRkZGRiwKLQkJLm5hbWUJPSAiSU9CIgotCX0sIHsKLQkJLnN0YXJ0CT0gMHgxNDAwMDAwMCwKLQkJLmVuZAk9IDB4MTRGRkZGRkYsCi0JCS5uYW1lCT0gIklPQyIKLQl9LCB7Ci0JCS5zdGFydAk9IDB4MTUwMDAwMDAsCi0JCS5lbmQJPSAweDE1RkZGRkZGLAotCQkubmFtZQk9ICJQQ0lJTyIKLQl9LCB7Ci0JCS5zdGFydAk9IDB4MUQwMDAwMDAsCi0JCS5lbmQJPSAweDFEM0ZGRkZGLAotCQkubmFtZQk9ICJKTVkxMzk0IgotCX0sIHsKLQkJLnN0YXJ0CT0gMHgxRTAwMDAwMCwKLQkJLmVuZAk9IDB4MUUzRkZGRkYsCi0JCS5uYW1lCT0gIlJPTTEiCi0JfSwgewotCQkuc3RhcnQJPSAweDFGQzAwMDAwLAotCQkuZW5kCT0gMHgxRkZGRkZGRiwKLQkJLm5hbWUJPSAiUk9NMCIKLQl9LCB7Ci0JCS5zdGFydAk9IDB4RkZGRUYzMDAsCi0JCS5lbmQJPSAweEZGRkVGM0ZGLAotCQkubmFtZQk9ICJTSU8wIgotCX0sIHsKLQkJLnN0YXJ0CT0gMHhGRkZFRjQwMCwKLQkJLmVuZAk9IDB4RkZGRUY0RkYsCi0JCS5uYW1lCT0gIlNJTzEiCi0JfSwKLX07Ci0KIC8qIGRvbid0IGVuYWJsZSAtIHNlZSBlcnJhdGEgKi8KLWludCBqbXIzOTI3X2NjZmdfdG9lb24gPSAwOworc3RhdGljIGludCBqbXIzOTI3X2NjZmdfdG9lb247CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBkb19yZXNldCh2b2lkKQogewpAQCAtMTczLDkgKzEwNCwxNSBAQAogCXJldHVybiBqaWZmaWVzICogKEpNUjM5MjdfVElNRVJfQ0xLIC8gSFopICsgam1yMzkyN190bXJwdHItPnRycjsKIH0KIAorc3RhdGljIHZvaWQgam1yMzkyN190aW1lcl9hY2sodm9pZCkKK3sKKwlqbXIzOTI3X3RtcnB0ci0+dGlzciA9IDA7ICAgICAgIC8qIGFjayBpbnRlcnJ1cHQgKi8KK30KKwogc3RhdGljIHZvaWQgX19pbml0IGptcjM5MjdfdGltZV9pbml0KHZvaWQpCiB7CiAJY2xvY2tzb3VyY2VfbWlwcy5yZWFkID0gam1yMzkyN19ocHRfcmVhZDsKKwltaXBzX3RpbWVyX2FjayA9IGptcjM5MjdfdGltZXJfYWNrOwogCW1pcHNfaHB0X2ZyZXF1ZW5jeSA9IEpNUjM5MjdfVElNRVJfQ0xLOwogfQogCkBAIC0xOTAsOSArMTI3LDYgQEAKIAlzZXR1cF9pcnEoSk1SMzkyN19JUlFfVElDSywgaXJxKTsKIH0KIAotI2RlZmluZSBVU0VDU19QRVJfSklGRlkgKDEwMDAwMDAvSFopCi0KLS8vI3VuZGVmIERPX1dSSVRFX1RIUk9VR0gKICNkZWZpbmUgRE9fV1JJVEVfVEhST1VHSAogI2RlZmluZSBET19FTkFCTEVfQ0FDSEUKIApAQCAtMjI0LDEyICsxNTgsNiBAQAogCS8qIFJlYm9vdCBvbiBwYW5pYyAqLwogCXBhbmljX3RpbWVvdXQgPSAxODA7CiAKLQl7Ci0JCXVuc2lnbmVkIGludCBjb25mOwotCQljb25mID0gcmVhZF9jMF9jb25mKCk7Ci0JfQotCi0jaWYgMQogCS8qIGNhY2hlIHNldHVwICovCiAJewogCQl1bnNpZ25lZCBpbnQgY29uZjsKQEAgLTI1NiwxNiArMTg0LDE0IEBACiAJCXdyaXRlX2MwX2NvbmYoY29uZik7CiAJCXdyaXRlX2MwX2NhY2hlKDApOwogCX0KLSNlbmRpZgogCiAJLyogaW5pdGlhbGl6ZSBib2FyZCAqLwogCWptcjM5MjdfYm9hcmRfaW5pdCgpOwogCiAJYXJncHRyID0gcHJvbV9nZXRjbWRsaW5lKCk7CiAKLQlpZiAoKGFyZ3B0ciA9IHN0cnN0cihhcmdwdHIsICJ0b2VvbiIpKSAhPSBOVUxMKSB7Ci0JCQlqbXIzOTI3X2NjZmdfdG9lb24gPSAxOwotCX0KKwlpZiAoKGFyZ3B0ciA9IHN0cnN0cihhcmdwdHIsICJ0b2VvbiIpKSAhPSBOVUxMKQorCQlqbXIzOTI3X2NjZmdfdG9lb24gPSAxOwogCWFyZ3B0ciA9IHByb21fZ2V0Y21kbGluZSgpOwogCWlmICgoYXJncHRyID0gc3Ryc3RyKGFyZ3B0ciwgImlwPSIpKSA9PSBOVUxMKSB7CiAJCWFyZ3B0ciA9IHByb21fZ2V0Y21kbGluZSgpOwpAQCAtMjgxLDcgKzIwNyw3IEBACiAJCQltZW1zZXQoJnJlcSwgMCwgc2l6ZW9mKHJlcSkpOwogCQkJcmVxLmxpbmUgPSBpOwogCQkJcmVxLmlvdHlwZSA9IFVQSU9fTUVNOwotCQkJcmVxLm1lbWJhc2UgPSAoY2hhciAqKVRYMzkyN19TSU9fUkVHKGkpOworCQkJcmVxLm1lbWJhc2UgPSAodW5zaWduZWQgY2hhciBfX2lvbWVtICopVFgzOTI3X1NJT19SRUcoaSk7CiAJCQlyZXEubWFwYmFzZSA9IFRYMzkyN19TSU9fUkVHKGkpOwogCQkJcmVxLmlycSA9IGkgPT0gMCA/CiAJCQkJSk1SMzkyN19JUlFfSVJDX1NJTzAgOiBKTVIzOTI3X0lSUV9JUkNfU0lPMTsKQEAgLTMwMyw2NSArMjI5LDMzIEBACiAKIHN0YXRpYyB2b2lkIHR4MzkyN19zZXR1cCh2b2lkKTsKIAotI2lmZGVmIENPTkZJR19QQ0kKLXVuc2lnbmVkIGxvbmcgbWlwc19wY2lfaW9fYmFzZTsKLXVuc2lnbmVkIGxvbmcgbWlwc19wY2lfaW9fc2l6ZTsKLXVuc2lnbmVkIGxvbmcgbWlwc19wY2lfbWVtX2Jhc2U7Ci11bnNpZ25lZCBsb25nIG1pcHNfcGNpX21lbV9zaXplOwotLyogZm9yIGxlZ2FjeSBJL08sIFBDSSBJL08gUENJIEJ1cyBhZGRyZXNzIG11c3QgYmUgMCAqLwotdW5zaWduZWQgbG9uZyBtaXBzX3BjaV9pb19wY2lhZGRyID0gMDsKLSNlbmRpZgotCiBzdGF0aWMgdm9pZCBfX2luaXQgam1yMzkyN19ib2FyZF9pbml0KHZvaWQpCiB7Ci0JY2hhciAqYXJncHRyOwotCi0jaWZkZWYgQ09ORklHX1BDSQotCW1pcHNfcGNpX2lvX2Jhc2UgPSBKTVIzOTI3X1BDSUlPOwotCW1pcHNfcGNpX2lvX3NpemUgPSBKTVIzOTI3X1BDSUlPX1NJWkU7Ci0JbWlwc19wY2lfbWVtX2Jhc2UgPSBKTVIzOTI3X1BDSU1FTTsKLQltaXBzX3BjaV9tZW1fc2l6ZSA9IEpNUjM5MjdfUENJTUVNX1NJWkU7Ci0jZW5kaWYKLQogCXR4MzkyN19zZXR1cCgpOwogCi0JaWYgKGptcjM5MjdfaGF2ZV9pc2FjKCkpIHsKLQotI2lmZGVmIENPTkZJR19GQl9FMTM1NQotCQlhcmdwdHIgPSBwcm9tX2dldGNtZGxpbmUoKTsKLQkJaWYgKChhcmdwdHIgPSBzdHJzdHIoYXJncHRyLCAidmlkZW89IikpID09IE5VTEwpIHsKLQkJCWFyZ3B0ciA9IHByb21fZ2V0Y21kbGluZSgpOwotCQkJc3RyY2F0KGFyZ3B0ciwgIiB2aWRlbz1lMTM1NWZiOmNydDE2aCIpOwotCQl9Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19CTEtfREVWX0lERQotCQkvKiBvdmVycmlkZXMgUENJLUlERSAqLwotI2VuZGlmCi0JfQotCiAJLyogU0lPMCBEVFIgb24gKi8KIAlqbXIzOTI3X2lvY19yZWdfb3V0KDAsIEpNUjM5MjdfSU9DX0RUUl9BRERSKTsKIAogCWptcjM5MjdfbGVkX3NldCgwKTsKIAotCi0JaWYgKGptcjM5MjdfaGF2ZV9pc2FjKCkpCi0JCWptcjM5MjdfaW9fbGVkX3NldCgwKTsKIAlwcmludGsoIkpNUi1UWDM5MjcgKFJldiAlZCkgLS0tIElPQyhSZXYgJWQpIERJUFNXOiVkLCVkLCVkLCVkXG4iLAogCSAgICAgICBqbXIzOTI3X2lvY19yZWdfaW4oSk1SMzkyN19JT0NfQlJFVl9BRERSKSAmIEpNUjM5MjdfUkVWX01BU0ssCiAJICAgICAgIGptcjM5MjdfaW9jX3JlZ19pbihKTVIzOTI3X0lPQ19SRVZfQUREUikgJiBKTVIzOTI3X1JFVl9NQVNLLAogCSAgICAgICBqbXIzOTI3X2RpcHN3MSgpLCBqbXIzOTI3X2RpcHN3MigpLAogCSAgICAgICBqbXIzOTI3X2RpcHN3MygpLCBqbXIzOTI3X2RpcHN3NCgpKTsKLQlpZiAoam1yMzkyN19oYXZlX2lzYWMoKSkKLQkJcHJpbnRrKCJKTUktMzkyN0lPMiAtLS0gSVNBQyhSZXYgJWQpIERJUFNXOiUwMXhcbiIsCi0JCSAgICAgICBqbXIzOTI3X2lzYWNfcmVnX2luKEpNUjM5MjdfSVNBQ19SRVZfQUREUikgJiBKTVIzOTI3X1JFVl9NQVNLLAotCQkgICAgICAgam1yMzkyN19pb19kaXBzdygpKTsKIH0KIAotdm9pZCBfX2luaXQgdHgzOTI3X3NldHVwKHZvaWQpCitzdGF0aWMgdm9pZCBfX2luaXQgdHgzOTI3X3NldHVwKHZvaWQpCiB7CiAJaW50IGk7CisjaWZkZWYgQ09ORklHX1BDSQorCXVuc2lnbmVkIGxvbmcgbWlwc19wY2lfaW9fYmFzZSA9IEpNUjM5MjdfUENJSU87CisJdW5zaWduZWQgbG9uZyBtaXBzX3BjaV9pb19zaXplID0gSk1SMzkyN19QQ0lJT19TSVpFOworCXVuc2lnbmVkIGxvbmcgbWlwc19wY2lfbWVtX2Jhc2UgPSBKTVIzOTI3X1BDSU1FTTsKKwl1bnNpZ25lZCBsb25nIG1pcHNfcGNpX21lbV9zaXplID0gSk1SMzkyN19QQ0lNRU1fU0laRTsKKwkvKiBmb3IgbGVnYWN5IEkvTywgUENJIEkvTyBQQ0kgQnVzIGFkZHJlc3MgbXVzdCBiZSAwICovCisJdW5zaWduZWQgbG9uZyBtaXBzX3BjaV9pb19wY2lhZGRyID0gMDsKKyNlbmRpZgogCiAJLyogU0RSQU1DIGFyZSBjb25maWd1cmVkIGJ5IFBST00gKi8KIApAQCAtNDc1LDEwICszNjksOCBAQAogCQl0eDM5MjdfcGNpY3B0ci0+bWJhcyA9IH4obWlwc19wY2lfbWVtX3NpemUgLSAxKTsKIAkJdHgzOTI3X3BjaWNwdHItPm1iYSA9IDA7CiAJCXR4MzkyN19wY2ljcHRyLT50bGJtbWEgPSAwOwotI2lmbmRlZiBKTVIzOTI3X0lOSVRfSU5ESVJFQ1RfUENJCiAJCS8qIEVuYWJsZSBEaXJlY3QgbWFwcGluZyBBZGRyZXNzIFNwYWNlIERlY29kZXIgKi8KIAkJdHgzOTI3X3BjaWNwdHItPmxiYyB8PSBUWDM5MjdfUENJQ19MQkNfSUxNREUgfCBUWDM5MjdfUENJQ19MQkNfSUxJREU7Ci0jZW5kaWYKIAogCQkvKiBDbGVhciBBbGwgTG9jYWwgQnVzIFN0YXR1cyAqLwogCQl0eDM5MjdfcGNpY3B0ci0+bGJzdGF0ID0gVFgzOTI3X1BDSUNfTEJJTV9BTEw7CkBAIC00OTEsMjIgKzM4MywxNSBAQAogCiAJCS8qIFBDSUMgSW50ID0+IElSQyBJUlExMCAqLwogCQl0eDM5MjdfcGNpY3B0ci0+aWwgPSBUWDM5MjdfSVJfUENJOwotI2lmIDEKIAkJLyogVGFyZ2V0IENvbnRyb2wgKHBlciBlcnJhdGEpICovCiAJCXR4MzkyN19wY2ljcHRyLT50YyA9IFRYMzkyN19QQ0lDX1RDX09GOEUgfCBUWDM5MjdfUENJQ19UQ19JRjhFOwotI2VuZGlmCiAKIAkJLyogRW5hYmxlIEJ1cyBBcmJpdGVyICovCi0jaWYgMAotCQl0eDM5MjdfcGNpY3B0ci0+cmVxX3RyYWNlID0gMHg3MzczNzM3MzsKLSNlbmRpZgogCQl0eDM5MjdfcGNpY3B0ci0+cGJhcG1jID0gVFgzOTI3X1BDSUNfUEJBUE1DX1BCQUVOOwogCiAJCXR4MzkyN19wY2ljcHRyLT5wY2ljbWQgPSBQQ0lfQ09NTUFORF9NQVNURVIgfAogCQkJUENJX0NPTU1BTkRfTUVNT1JZIHwKLSNpZiAxCiAJCQlQQ0lfQ09NTUFORF9JTyB8Ci0jZW5kaWYKIAkJCVBDSV9DT01NQU5EX1BBUklUWSB8IFBDSV9DT01NQU5EX1NFUlI7CiAJfQogI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KQEAgLTU1NSw4ICs0NDAsNiBAQAogCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKIAl9OwogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldjsKLQlpZiAoIWptcjM5MjdfaGF2ZV9udnJhbSgpKQotCQlyZXR1cm4gLUVOT0RFVjsKIAlkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKCJkczE3NDIiLCAtMSwgJnJlcywgMSk7CiAJcmV0dXJuIElTX0VSUihkZXYpID8gUFRSX0VSUihkZXYpIDogMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvYXNtLW9mZnNldHMuYyBiL2FyY2gvbWlwcy9rZXJuZWwvYXNtLW9mZnNldHMuYwppbmRleCAyMjJkZTQ2Li43NjFhNzc5IDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL2FzbS1vZmZzZXRzLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9hc20tb2Zmc2V0cy5jCkBAIC0xMDIsNyArMTAyLDYgQEAKIAlvZmZzZXQoIiNkZWZpbmUgVElfQUREUl9MSU1JVCAgICAgICIsIHN0cnVjdCB0aHJlYWRfaW5mbywgYWRkcl9saW1pdCk7CiAJb2Zmc2V0KCIjZGVmaW5lIFRJX1JFU1RBUlRfQkxPQ0sgICAiLCBzdHJ1Y3QgdGhyZWFkX2luZm8sIHJlc3RhcnRfYmxvY2spOwogCW9mZnNldCgiI2RlZmluZSBUSV9SRUdTICAgICAgICAgICAgIiwgc3RydWN0IHRocmVhZF9pbmZvLCByZWdzKTsKLQljb25zdGFudCgiI2RlZmluZSBfVEhSRUFEX1NJWkVfT1JERVIgIiwgVEhSRUFEX1NJWkVfT1JERVIpOwogCWNvbnN0YW50KCIjZGVmaW5lIF9USFJFQURfU0laRSAgICAgICAiLCBUSFJFQURfU0laRSk7CiAJY29uc3RhbnQoIiNkZWZpbmUgX1RIUkVBRF9NQVNLICAgICAgICIsIFRIUkVBRF9NQVNLKTsKIAlsaW5lZmVlZDsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvaTgyNTkuYyBiL2FyY2gvbWlwcy9rZXJuZWwvaTgyNTkuYwppbmRleCA5Yzc5NzAzLi4yMzQ1MTYwIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL2k4MjU5LmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9pODI1OS5jCkBAIC0zMjgsOCArMzI4LDggQEAKIHsKIAlpbnQgaTsKIAotCXJlcXVlc3RfcmVzb3VyY2UoJmlvcG9ydF9yZXNvdXJjZSwgJnBpYzFfaW9fcmVzb3VyY2UpOwotCXJlcXVlc3RfcmVzb3VyY2UoJmlvcG9ydF9yZXNvdXJjZSwgJnBpYzJfaW9fcmVzb3VyY2UpOworCWluc2VydF9yZXNvdXJjZSgmaW9wb3J0X3Jlc291cmNlLCAmcGljMV9pb19yZXNvdXJjZSk7CisJaW5zZXJ0X3Jlc291cmNlKCZpb3BvcnRfcmVzb3VyY2UsICZwaWMyX2lvX3Jlc291cmNlKTsKIAogCWluaXRfODI1OUEoMCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwva3NwZC5jIGIvYXJjaC9taXBzL2tlcm5lbC9rc3BkLmMKaW5kZXggMjllYWRkNC4uYzY1ODAwMSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9rc3BkLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9rc3BkLmMKQEAgLTE3LDYgKzE3LDcgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CiAjaW5jbHVkZSA8bGludXgvZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CkBAIC0xOTgsNyArMTk5LDYgQEAKIAlpbnQgY21kOwogCiAJY2hhciAqdmN3ZDsKLQltbV9zZWdtZW50X3Qgb2xkX2ZzOwogCWludCBzaXplOwogCiAJcmV0LnJldHZhbCA9IC0xOwpAQCAtMjQxLDggKzI0MSw2IEBACiAgCQlpZiAoKHJldC5yZXR2YWwgPSBzcF9zeXNjYWxsKF9fTlJfZ2V0dGltZW9mZGF5LCAoaW50KSZ0diwKICAJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkmdHosIDAsMCkpID09IDApCiAJCXJldC5yZXR2YWwgPSB0di50dl9zZWM7Ci0KLQkJcmV0LmVycm5vID0gZXJybm87CiAJCWJyZWFrOwogCiAgCWNhc2UgTVRTUF9TWVNDQUxMX0VYSVQ6CkBAIC0yNzksNyArMjc3LDYgQEAKIAkJaWYgKGNtZCA+PSAwKSB7CiAJCQlyZXQucmV0dmFsID0gc3Bfc3lzY2FsbChjbWQsIGdlbmVyaWMuYXJnMCwgZ2VuZXJpYy5hcmcxLAogCQkJICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJpYy5hcmcyLCBnZW5lcmljLmFyZzMpOwotCQkJcmV0LmVycm5vID0gZXJybm87CiAJCX0gZWxzZQogIAkJCXByaW50ayhLRVJOX1dBUk5JTkcKIAkJCSAgICAgICAiS1NQRDogVW5rbm93biBTUCBzeXNjYWxsIG51bWJlciAlZFxuIiwgc2MuY21kKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvcnRseC5jIGIvYXJjaC9taXBzL2tlcm5lbC9ydGx4LmMKaW5kZXggZTZlMzA0Ny4uYmZjOGNhMSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9ydGx4LmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9ydGx4LmMKQEAgLTI4OSw3ICsyODksNyBAQAogCXJldHVybiB3cml0ZV9zcGFjZWZyZWUoY2hhbi0+cnRfcmVhZCwgY2hhbi0+cnRfd3JpdGUsIGNoYW4tPmJ1ZmZlcl9zaXplKTsKIH0KIAotc3NpemVfdCBydGx4X3JlYWQoaW50IGluZGV4LCB2b2lkIF9fdXNlciAqYnVmZiwgc2l6ZV90IGNvdW50LCBpbnQgdXNlcikKK3NzaXplX3QgcnRseF9yZWFkKGludCBpbmRleCwgdm9pZCBfX3VzZXIgKmJ1ZmYsIHNpemVfdCBjb3VudCkKIHsKIAlzaXplX3QgbHhfd3JpdGUsIGZsID0gMEw7CiAJc3RydWN0IHJ0bHhfY2hhbm5lbCAqbHg7CkBAIC0zMzEsOSArMzMxLDEwIEBACiAJcmV0dXJuIGNvdW50OwogfQogCi1zc2l6ZV90IHJ0bHhfd3JpdGUoaW50IGluZGV4LCBjb25zdCB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQsIGludCB1c2VyKQorc3NpemVfdCBydGx4X3dyaXRlKGludCBpbmRleCwgY29uc3Qgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50KQogewogCXN0cnVjdCBydGx4X2NoYW5uZWwgKnJ0OworCXVuc2lnbmVkIGxvbmcgZmFpbGVkOwogCXNpemVfdCBydF9yZWFkOwogCXNpemVfdCBmbDsKIApAQCAtMzYzLDcgKzM2NCw3IEBACiAJfQogCiBvdXQ6Ci0JY291bnQgLT0gY2FpbGVkOworCWNvdW50IC09IGZhaWxlZDsKIAogCXNtcF93bWIoKTsKIAlydC0+cnRfd3JpdGUgPSAocnQtPnJ0X3dyaXRlICsgY291bnQpICUgcnQtPmJ1ZmZlcl9zaXplOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21pcHMtYm9hcmRzL2dlbmVyaWMvZGlzcGxheS5jIGIvYXJjaC9taXBzL21pcHMtYm9hcmRzL2dlbmVyaWMvZGlzcGxheS5jCmluZGV4IGY2NTM5NDYuLjU0OGRiZTUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9taXBzLWJvYXJkcy9nZW5lcmljL2Rpc3BsYXkuYworKysgYi9hcmNoL21pcHMvbWlwcy1ib2FyZHMvZ2VuZXJpYy9kaXNwbGF5LmMKQEAgLTI0LDE2ICsyNCwxNiBAQAogCiB2b2lkIG1pcHNfZGlzcGxheV9tZXNzYWdlKGNvbnN0IGNoYXIgKnN0cikKIHsKLQlzdGF0aWMgdm9sYXRpbGUgdW5zaWduZWQgaW50ICpkaXNwbGF5ID0gTlVMTDsKKwlzdGF0aWMgdW5zaWduZWQgaW50IF9faW9tZW0gKmRpc3BsYXkgPSBOVUxMOwogCWludCBpOwogCiAJaWYgKHVubGlrZWx5KGRpc3BsYXkgPT0gTlVMTCkpCi0JCWRpc3BsYXkgPSAodm9sYXRpbGUgdW5zaWduZWQgaW50ICopaW9yZW1hcChBU0NJSV9ESVNQTEFZX1BPU19CQVNFLCAxNipzaXplb2YoaW50KSk7CisJCWRpc3BsYXkgPSBpb3JlbWFwKEFTQ0lJX0RJU1BMQVlfUE9TX0JBU0UsIDE2KnNpemVvZihpbnQpKTsKIAogCWZvciAoaSA9IDA7IGkgPD0gMTQ7IGk9aSsyKSB7CiAJICAgICAgICAgaWYgKCpzdHIpCi0JCSAgICAgICAgIGRpc3BsYXlbaV0gPSAqc3RyKys7CisJCSAgICAgICAgIHdyaXRlbCgqc3RyKyssIGRpc3BsYXkgKyBpKTsKIAkJIGVsc2UKLQkJICAgICAgICAgZGlzcGxheVtpXSA9ICcgJzsKKwkJICAgICAgICAgd3JpdGVsKCcgJywgZGlzcGxheSArIGkpOwogCX0KIH0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9taXBzLWJvYXJkcy9nZW5lcmljL3BjaS5jIGIvYXJjaC9taXBzL21pcHMtYm9hcmRzL2dlbmVyaWMvcGNpLmMKaW5kZXggMzE5MmExNC4uZjk4ZDYwZiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21pcHMtYm9hcmRzL2dlbmVyaWMvcGNpLmMKKysrIGIvYXJjaC9taXBzL21pcHMtYm9hcmRzL2dlbmVyaWMvcGNpLmMKQEAgLTY1LDcgKzY1LDcgQEAKIH07CiAKIGV4dGVybiBzdHJ1Y3QgcGNpX29wcyBib25pdG82NF9wY2lfb3BzOwotZXh0ZXJuIHN0cnVjdCBwY2lfb3BzIGd0NjQxMjBfcGNpX29wczsKK2V4dGVybiBzdHJ1Y3QgcGNpX29wcyBndDY0eHh4X3BjaTBfb3BzOwogZXh0ZXJuIHN0cnVjdCBwY2lfb3BzIG1zY19wY2lfb3BzOwogCiBzdGF0aWMgc3RydWN0IHBjaV9jb250cm9sbGVyIGJvbml0bzY0X2NvbnRyb2xsZXIgPSB7CkBAIC03Niw3ICs3Niw3IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHBjaV9jb250cm9sbGVyIGd0NjQxMjBfY29udHJvbGxlciA9IHsKLQkucGNpX29wcwk9ICZndDY0MTIwX3BjaV9vcHMsCisJLnBjaV9vcHMJPSAmZ3Q2NHh4eF9wY2kwX29wcywKIAkuaW9fcmVzb3VyY2UJPSAmZ3Q2NDEyMF9pb19yZXNvdXJjZSwKIAkubWVtX3Jlc291cmNlCT0gJmd0NjQxMjBfbWVtX3Jlc291cmNlLAogfTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9taXBzLWJvYXJkcy9nZW5lcmljL3Jlc2V0LmMgYi9hcmNoL21pcHMvbWlwcy1ib2FyZHMvZ2VuZXJpYy9yZXNldC5jCmluZGV4IDA5OTZiYTMuLjdhMWJiNTEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9taXBzLWJvYXJkcy9nZW5lcmljL3Jlc2V0LmMKKysrIGIvYXJjaC9taXBzL21pcHMtYm9hcmRzL2dlbmVyaWMvcmVzZXQuYwpAQCAtMzksMjQgKzM5LDI0IEBACiAKIHN0YXRpYyB2b2lkIG1pcHNfbWFjaGluZV9yZXN0YXJ0KGNoYXIgKmNvbW1hbmQpCiB7Ci0gICAgICAgIHZvbGF0aWxlIHVuc2lnbmVkIGludCAqc29mdHJlc19yZWcgPSAodW5zaWduZWQgaW50ICopaW9yZW1hcCAoU09GVFJFU19SRUcsIHNpemVvZih1bnNpZ25lZCBpbnQpKTsKKwl1bnNpZ25lZCBpbnQgX19pb21lbSAqc29mdHJlc19yZWcgPSBpb3JlbWFwKFNPRlRSRVNfUkVHLCBzaXplb2YodW5zaWduZWQgaW50KSk7CiAKLQkqc29mdHJlc19yZWcgPSBHT1JFU0VUOworCXdyaXRldyhHT1JFU0VULCBzb2Z0cmVzX3JlZyk7CiB9CiAKIHN0YXRpYyB2b2lkIG1pcHNfbWFjaGluZV9oYWx0KHZvaWQpCiB7Ci0gICAgICAgIHZvbGF0aWxlIHVuc2lnbmVkIGludCAqc29mdHJlc19yZWcgPSAodW5zaWduZWQgaW50ICopaW9yZW1hcCAoU09GVFJFU19SRUcsIHNpemVvZih1bnNpZ25lZCBpbnQpKTsKKyAgICAgICAgdW5zaWduZWQgaW50IF9faW9tZW0gKnNvZnRyZXNfcmVnID0gaW9yZW1hcChTT0ZUUkVTX1JFRywgc2l6ZW9mKHVuc2lnbmVkIGludCkpOwogCi0JKnNvZnRyZXNfcmVnID0gR09SRVNFVDsKKwl3cml0ZXcoR09SRVNFVCwgc29mdHJlc19yZWcpOwogfQogCiAjaWYgZGVmaW5lZChDT05GSUdfTUlQU19BVExBUykKIHN0YXRpYyB2b2lkIGF0bGFzX21hY2hpbmVfcG93ZXJfb2ZmKHZvaWQpCiB7Ci0gICAgICAgIHZvbGF0aWxlIHVuc2lnbmVkIGludCAqcHN1c3RieV9yZWcgPSAodW5zaWduZWQgaW50ICopaW9yZW1hcChBVExBU19QU1VTVEJZX1JFRywgc2l6ZW9mKHVuc2lnbmVkIGludCkpOworCXVuc2lnbmVkIGludCBfX2lvbWVtICpwc3VzdGJ5X3JlZyA9IGlvcmVtYXAoQVRMQVNfUFNVU1RCWV9SRUcsIHNpemVvZih1bnNpZ25lZCBpbnQpKTsKIAotCSpwc3VzdGJ5X3JlZyA9IEFUTEFTX0dPU1RCWTsKKwl3cml0ZXcoQVRMQVNfR09TVEJZLCBwc3VzdGJ5X3JlZyk7CiB9CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21pcHMtYm9hcmRzL21hbHRhL21hbHRhX2ludC5jIGIvYXJjaC9taXBzL21pcHMtYm9hcmRzL21hbHRhL21hbHRhX2ludC5jCmluZGV4IDNjMjA2YmIuLjgzZDc2MDIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9taXBzLWJvYXJkcy9tYWx0YS9tYWx0YV9pbnQuYworKysgYi9hcmNoL21pcHMvbWlwcy1ib2FyZHMvbWFsdGEvbWFsdGFfaW50LmMKQEAgLTQyLDggKzQyLDYgQEAKICNpbmNsdWRlIDxhc20vbWlwcy1ib2FyZHMvbXNjMDFfcGNpLmg+CiAjaW5jbHVkZSA8YXNtL21zYzAxX2ljLmg+CiAKLWV4dGVybiB2b2lkIG1pcHNfdGltZXJfaW50ZXJydXB0KHZvaWQpOwotCiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKG1pcHNfaXJxX2xvY2spOwogCiBzdGF0aWMgaW5saW5lIGludCBtaXBzX3BjaWJpb3NfaWFjayh2b2lkKQpAQCAtODUsNyArODMsNyBAQAogCQlkdW1teSA9IEJPTklUT19QQ0lNQVBfQ0ZHOwogCQlpb2IoKTsgICAgLyogc3luYyAqLwogCi0JCWlycSA9ICoodm9sYXRpbGUgdTMyICopKF9wY2ljdHJsX2Jvbml0b19wY2ljZmcpOworCQlpcnEgPSByZWFkbCgodTMyICopX3BjaWN0cmxfYm9uaXRvX3BjaWNmZyk7CiAJCWlvYigpOyAgICAvKiBzeW5jICovCiAJCWlycSAmPSAweGZmOwogCQlCT05JVE9fUENJTUFQX0NGRyA9IDA7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbWlwcy1ib2FyZHMvbWFsdGEvbWFsdGFfc2V0dXAuYyBiL2FyY2gvbWlwcy9taXBzLWJvYXJkcy9tYWx0YS9tYWx0YV9zZXR1cC5jCmluZGV4IDU2ZWE3NjYuLjc4NzM5MzIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9taXBzLWJvYXJkcy9tYWx0YS9tYWx0YV9zZXR1cC5jCisrKyBiL2FyY2gvbWlwcy9taXBzLWJvYXJkcy9tYWx0YS9tYWx0YV9zZXR1cC5jCkBAIC0xNDUsNyArMTQ1LDggQEAKICNpZmRlZiBDT05GSUdfQkxLX0RFVl9JREUKIAkvKiBDaGVjayBQQ0kgY2xvY2sgKi8KIAl7Ci0JCWludCBqbXByID0gKCooKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKWlvcmVtYXAoTUFMVEFfSk1QUlNfUkVHLCBzaXplb2YodW5zaWduZWQgaW50KSkpID4+IDIpICYgMHgwNzsKKwkJdW5zaWduZWQgaW50IF9faW9tZW0gKmptcHJfcCA9ICh1bnNpZ25lZCBpbnQgKikgaW9yZW1hcChNQUxUQV9KTVBSU19SRUcsIHNpemVvZih1bnNpZ25lZCBpbnQpKTsKKwkJaW50IGptcHIgPSAocmVhZHcoam1wcl9wKSA+PiAyKSAmIDB4MDc7CiAJCXN0YXRpYyBjb25zdCBpbnQgcGNpY2xvY2tzW10gX19pbml0ZGF0YSA9IHsKIAkJCTMzLCAyMCwgMjUsIDMwLCAxMiwgMTYsIDM3LCAxMAogCQl9OwpAQCAtMTc5LDcgKzE4MCw2IEBACiAJfTsKICNlbmRpZgogI2VuZGlmCi0KIAltaXBzX3JlYm9vdF9zZXR1cCgpOwogCiAJYm9hcmRfdGltZV9pbml0ID0gbWlwc190aW1lX2luaXQ7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbWlwcy1ib2FyZHMvc2ltL01ha2VmaWxlIGIvYXJjaC9taXBzL21pcHMtYm9hcmRzL3NpbS9NYWtlZmlsZQppbmRleCA2YWVlYmM5Li5kYzBiZmRhIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbWlwcy1ib2FyZHMvc2ltL01ha2VmaWxlCisrKyBiL2FyY2gvbWlwcy9taXBzLWJvYXJkcy9zaW0vTWFrZWZpbGUKQEAgLTE3LDcgKzE3LDggQEAKICMgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgogIwogCi1vYmoteSA6PSBzaW1fc2V0dXAubyBzaW1fbWVtLm8gc2ltX3RpbWUubyBzaW1faW50Lm8gc2ltX2NtZGxpbmUubworb2JqLXkgOj0gc2ltX3BsYXRmb3JtLm8gc2ltX3NldHVwLm8gc2ltX21lbS5vIHNpbV90aW1lLm8gc2ltX2ludC5vIFwKKwkgc2ltX2NtZGxpbmUubwogCiBvYmotJChDT05GSUdfRUFSTFlfUFJJTlRLKSArPSBzaW1fY29uc29sZS5vCiBvYmotJChDT05GSUdfU01QKSArPSBzaW1fc21wLm8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9taXBzLWJvYXJkcy9zaW0vc2ltX3BsYXRmb3JtLmMgYi9hcmNoL21pcHMvbWlwcy1ib2FyZHMvc2ltL3NpbV9wbGF0Zm9ybS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzMjEwYTgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvbWlwcy1ib2FyZHMvc2ltL3NpbV9wbGF0Zm9ybS5jCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgYnkgUmFsZiBCYWVjaGxlIChyYWxmQGxpbnV4LW1pcHMub3JnKQorICovCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKK3N0YXRpYyBjaGFyIG1pcHNuZXRfc3RyaW5nW10gPSAibWlwc25ldCI7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGV0aDFfZGV2aWNlID0geworCS5uYW1lCQk9IG1pcHNuZXRfc3RyaW5nLAorCS5pZAkJPSAwLAorfTsKKworLyoKKyAqIENyZWF0ZSBhIHBsYXRmb3JtIGRldmljZSBmb3IgdGhlIEdQSSBwb3J0IHRoYXQgcmVjZWl2ZXMgdGhlCisgKiBpbWFnZSBkYXRhIGZyb20gdGhlIGVtYmVkZGVkIGNhbWVyYS4KKyAqLworc3RhdGljIGludCBfX2luaXQgbWlwc25ldF9kZXZpbml0KHZvaWQpCit7CisJaW50IGVycjsKKworCWVyciA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmZXRoMV9kZXZpY2UpOworCWlmIChlcnIpCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHJlZ2lzdHJhdGlvbiBmYWlsZWRcbiIsIG1pcHNuZXRfc3RyaW5nKTsKKworCXJldHVybiBlcnI7Cit9CisKK2RldmljZV9pbml0Y2FsbChtaXBzbmV0X2RldmluaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21tL2NhY2hlLmMgYi9hcmNoL21pcHMvbW0vY2FjaGUuYwppbmRleCA0ZThmMWI2Li5hYmY5OWIxIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbW0vY2FjaGUuYworKysgYi9hcmNoL21pcHMvbW0vY2FjaGUuYwpAQCAtOTYsNyArOTYsNyBAQAogCiAJCWthZGRyID0ga21hcF9jb2hlcmVudChwYWdlLCB2bWFkZHIpOwogCQlmbHVzaF9kYXRhX2NhY2hlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpa2FkZHIpOwotCQlrdW5tYXBfY29oZXJlbnQoa2FkZHIpOworCQlrdW5tYXBfY29oZXJlbnQoKTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tbS9pbml0LmMgYi9hcmNoL21pcHMvbW0vaW5pdC5jCmluZGV4IGU5OTUxYzBlLi4yZDFjMmMwIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbW0vaW5pdC5jCisrKyBiL2FyY2gvbWlwcy9tbS9pbml0LmMKQEAgLTE3Nyw3ICsxNzcsNyBAQAogCiAjZGVmaW5lIFVOSVFVRV9FTlRSWUhJKGlkeCkgKENLU0VHMCArICgoaWR4KSA8PCAoUEFHRV9TSElGVCArIDEpKSkKIAotdm9pZCBrdW5tYXBfY29oZXJlbnQoc3RydWN0IHBhZ2UgKnBhZ2UpCit2b2lkIGt1bm1hcF9jb2hlcmVudCh2b2lkKQogewogI2lmbmRlZiBDT05GSUdfTUlQU19NVF9TTVRDCiAJdW5zaWduZWQgaW50IHdpcmVkOwpAQCAtMjEwLDcgKzIxMCw3IEBACiAJaWYgKGNwdV9oYXNfZGNfYWxpYXNlcykgewogCQl2ZnJvbSA9IGttYXBfY29oZXJlbnQoZnJvbSwgdmFkZHIpOwogCQljb3B5X3BhZ2UodnRvLCB2ZnJvbSk7Ci0JCWt1bm1hcF9jb2hlcmVudChmcm9tKTsKKwkJa3VubWFwX2NvaGVyZW50KCk7CiAJfSBlbHNlIHsKIAkJdmZyb20gPSBrbWFwX2F0b21pYyhmcm9tLCBLTV9VU0VSMCk7CiAJCWNvcHlfcGFnZSh2dG8sIHZmcm9tKTsKQEAgLTIzMyw3ICsyMzMsNyBAQAogCWlmIChjcHVfaGFzX2RjX2FsaWFzZXMpIHsKIAkJdm9pZCAqdnRvID0ga21hcF9jb2hlcmVudChwYWdlLCB2YWRkcikgKyAodmFkZHIgJiB+UEFHRV9NQVNLKTsKIAkJbWVtY3B5KHZ0bywgc3JjLCBsZW4pOwotCQlrdW5tYXBfY29oZXJlbnQocGFnZSk7CisJCWt1bm1hcF9jb2hlcmVudCgpOwogCX0gZWxzZQogCQltZW1jcHkoZHN0LCBzcmMsIGxlbik7CiAJaWYgKCh2bWEtPnZtX2ZsYWdzICYgVk1fRVhFQykgJiYgIWNwdV9oYXNfaWNfZmlsbHNfZl9kYykKQEAgLTI1MCw3ICsyNTAsNyBAQAogCQl2b2lkICp2ZnJvbSA9CiAJCQlrbWFwX2NvaGVyZW50KHBhZ2UsIHZhZGRyKSArICh2YWRkciAmIH5QQUdFX01BU0spOwogCQltZW1jcHkoZHN0LCB2ZnJvbSwgbGVuKTsKLQkJa3VubWFwX2NvaGVyZW50KHBhZ2UpOworCQlrdW5tYXBfY29oZXJlbnQoKTsKIAl9IGVsc2UKIAkJbWVtY3B5KGRzdCwgc3JjLCBsZW4pOwogfQpAQCAtMzUxLDE4ICszNTEsMTUgQEAKICNlbmRpZgogCWttYXBfY29oZXJlbnRfaW5pdCgpOwogCi0jaWZkZWYgQ09ORklHX0lTQQotCWlmIChtYXhfbG93X3BmbiA+PSBNQVhfRE1BX1BGTikKLQkJaWYgKG1pbl9sb3dfcGZuID49IE1BWF9ETUFfUEZOKSB7Ci0JCQl6b25lc19zaXplW1pPTkVfRE1BXSA9IDA7Ci0JCQl6b25lc19zaXplW1pPTkVfTk9STUFMXSA9IG1heF9sb3dfcGZuIC0gbWluX2xvd19wZm47Ci0JCX0gZWxzZSB7Ci0JCQl6b25lc19zaXplW1pPTkVfRE1BXSA9IE1BWF9ETUFfUEZOIC0gbWluX2xvd19wZm47Ci0JCQl6b25lc19zaXplW1pPTkVfTk9STUFMXSA9IG1heF9sb3dfcGZuIC0gTUFYX0RNQV9QRk47Ci0JCX0KKyNpZmRlZiBDT05GSUdfWk9ORV9ETUEKKwlpZiAobWluX2xvd19wZm4gPCBNQVhfRE1BX1BGTiAmJiBNQVhfRE1BX1BGTiA8PSBtYXhfbG93X3BmbikgeworCQl6b25lc19zaXplW1pPTkVfRE1BXSA9IE1BWF9ETUFfUEZOIC0gbWluX2xvd19wZm47CisJCXpvbmVzX3NpemVbWk9ORV9OT1JNQUxdID0gbWF4X2xvd19wZm4gLSBNQVhfRE1BX1BGTjsKKwl9IGVsc2UgaWYgKG1heF9sb3dfcGZuIDwgTUFYX0RNQV9QRk4pCisJCXpvbmVzX3NpemVbWk9ORV9ETUFdID0gbWF4X2xvd19wZm4gLSBtaW5fbG93X3BmbjsKIAllbHNlCiAjZW5kaWYKLQl6b25lc19zaXplW1pPTkVfRE1BXSA9IG1heF9sb3dfcGZuIC0gbWluX2xvd19wZm47CisJem9uZXNfc2l6ZVtaT05FX05PUk1BTF0gPSBtYXhfbG93X3BmbiAtIG1pbl9sb3dfcGZuOwogCiAjaWZkZWYgQ09ORklHX0hJR0hNRU0KIAl6b25lc19zaXplW1pPTkVfSElHSE1FTV0gPSBoaWdoZW5kX3BmbiAtIGhpZ2hzdGFydF9wZm47CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcGNpL01ha2VmaWxlIGIvYXJjaC9taXBzL3BjaS9NYWtlZmlsZQppbmRleCBiZjg1OTk1Li5kZjQ4N2MwIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvcGNpL01ha2VmaWxlCisrKyBiL2FyY2gvbWlwcy9wY2kvTWFrZWZpbGUKQEAgLTgsOCArOCw3IEBACiAjIFBDSSBidXMgaG9zdCBicmlkZ2Ugc3BlY2lmaWMgY29kZQogIwogb2JqLSQoQ09ORklHX01JUFNfQk9OSVRPNjQpCSs9IG9wcy1ib25pdG82NC5vCi1vYmotJChDT05GSUdfTUlQU19HVDY0MTExKQkrPSBvcHMtZ3Q2NDExMS5vCi1vYmotJChDT05GSUdfTUlQU19HVDY0MTIwKQkrPSBvcHMtZ3Q2NDEyMC5vCitvYmotJChDT05GSUdfUENJX0dUNjRYWFhfUENJMCkJKz0gb3BzLWd0NjR4eHhfcGNpMC5vCiBvYmotJChDT05GSUdfUENJX01BUlZFTEwpCSs9IG9wcy1tYXJ2ZWxsLm8KIG9iai0kKENPTkZJR19NSVBTX01TQykJCSs9IG9wcy1tc2Mubwogb2JqLSQoQ09ORklHX01JUFNfTklMRTQpCSs9IG9wcy1uaWxlNC5vCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcGNpL2ZpeHVwLWptcjM5MjcuYyBiL2FyY2gvbWlwcy9wY2kvZml4dXAtam1yMzkyNy5jCmluZGV4IDZlNzJkMjEuLjczZDE4NTAgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9wY2kvZml4dXAtam1yMzkyNy5jCisrKyBiL2FyY2gvbWlwcy9wY2kvZml4dXAtam1yMzkyNy5jCkBAIC0yOSw3ICsyOSw2IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KIAogI2luY2x1ZGUgPGFzbS9qbXIzOTI3L2ptcjM5MjcuaD4KQEAgLTgxLDE0ICs4MCw4IEBACiAKIAkvKiBDaGVjayBPbkJvYXJkIEV0aGVybmV0IChJRFNFTD1BMjQsIERldk51PTEzKSAqLwogCWlmIChkZXYtPmJ1cy0+cGFyZW50ID09IE5VTEwgJiYKLQkgICAgc2xvdCA9PSBUWDM5MjdfUENJQ19JRFNFTF9BRF9UT19TTE9UKDI0KSkgewotCQlleHRlcm4gaW50IGptcjM5MjdfZXRoZXIxX2lycTsKLQkJLyogY2hlY2sgdGhpcyBpcnEgbGluZSB3YXMgcmVzZXJ2ZWQgZm9yIGV0aGVyMSAqLwotCQlpZiAoam1yMzkyN19ldGhlcjFfaXJxICE9IEpNUjM5MjdfSVJRX0VUSEVSMCkKLQkJCWlycSA9IEpNUjM5MjdfSVJRX0VUSEVSMDsKLQkJZWxzZQotCQkJaXJxID0gMDsJLyogZGlzYWJsZSAqLwotCX0KKwkgICAgc2xvdCA9PSBUWDM5MjdfUENJQ19JRFNFTF9BRF9UT19TTE9UKDI0KSkKKwkJaXJxID0gSk1SMzkyN19JUlFfRVRIRVIwOwogCXJldHVybiBpcnE7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9wY2kvb3BzLWd0NjQxMTEuYyBiL2FyY2gvbWlwcy9wY2kvb3BzLWd0NjQxMTEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNkMzk5MS4uMDAwMDAwMAotLS0gYS9hcmNoL21pcHMvcGNpL29wcy1ndDY0MTExLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoKLSAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCi0gKiBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NywgMjAwMiBieSBSYWxmIEJhZWNobGUKLSAqIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiwgMjAwMyBieSBMaWFtIERhdmllcyAobGRhdmllc0BhZ2lsZS50dikKLSAqLwotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotCi0jaW5jbHVkZSA8YXNtL3BjaS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9ndDY0MTIwLmg+Ci0KLSNpbmNsdWRlIDxhc20vbWFjaC1jb2JhbHQvY29iYWx0Lmg+Ci0KLS8qCi0gKiBEZXZpY2UgMzEgb24gdGhlIEdUNjQxMTEgaXMgdXNlZCB0byBnZW5lcmF0ZSBQQ0kgc3BlY2lhbAotICogY3ljbGVzLCBzbyB3ZSBzaG91bGRuJ3QgZXhwZWN0ZWQgdG8gZmluZCBhIGRldmljZSB0aGVyZSAuLi4KLSAqLwotc3RhdGljIGlubGluZSBpbnQgcGNpX3JhbmdlX2NrKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbikKLXsKLQlpZiAoYnVzLT5udW1iZXIgPT0gMCAmJiBQQ0lfU0xPVChkZXZmbikgPCAzMSkKLQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4gLTE7Ci19Ci0KLXN0YXRpYyBpbnQgZ3Q2NDExMV9wY2lfcmVhZF9jb25maWcoc3RydWN0IHBjaV9idXMgKmJ1cywgdW5zaWduZWQgaW50IGRldmZuLAotCWludCB3aGVyZSwgaW50IHNpemUsIHUzMiAqIHZhbCkKLXsKLQlpZiAocGNpX3JhbmdlX2NrKGJ1cywgZGV2Zm4pKQotCQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOwotCi0Jc3dpdGNoIChzaXplKSB7Ci0JY2FzZSA0OgotCQlQQ0lfQ0ZHX1NFVChkZXZmbiwgd2hlcmUpOwotCQkqdmFsID0gR1RfUkVBRChHVF9QQ0kwX0NGR0RBVEFfT0ZTKTsKLQkJcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKLQotCWNhc2UgMjoKLQkJUENJX0NGR19TRVQoZGV2Zm4sICh3aGVyZSAmIH4weDMpKTsKLQkJKnZhbCA9IEdUX1JFQUQoR1RfUENJMF9DRkdEQVRBX09GUykKLQkJICAgID4+ICgod2hlcmUgJiAzKSAqIDgpOwotCQlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOwotCi0JY2FzZSAxOgotCQlQQ0lfQ0ZHX1NFVChkZXZmbiwgKHdoZXJlICYgfjB4MykpOwotCQkqdmFsID0gR1RfUkVBRChHVF9QQ0kwX0NGR0RBVEFfT0ZTKQotCQkgICAgPj4gKCh3aGVyZSAmIDMpICogOCk7Ci0JCXJldHVybiBQQ0lCSU9TX1NVQ0NFU1NGVUw7Ci0JfQotCi0JcmV0dXJuIFBDSUJJT1NfQkFEX1JFR0lTVEVSX05VTUJFUjsKLX0KLQotc3RhdGljIGludCBndDY0MTExX3BjaV93cml0ZV9jb25maWcoc3RydWN0IHBjaV9idXMgKmJ1cywgdW5zaWduZWQgaW50IGRldmZuLAotCWludCB3aGVyZSwgaW50IHNpemUsIHUzMiB2YWwpCi17Ci0JdTMyIHRtcDsKLQotCWlmIChwY2lfcmFuZ2VfY2soYnVzLCBkZXZmbikpCi0JCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7Ci0KLQlzd2l0Y2ggKHNpemUpIHsKLQljYXNlIDQ6Ci0JCVBDSV9DRkdfU0VUKGRldmZuLCB3aGVyZSk7Ci0JCUdUX1dSSVRFKEdUX1BDSTBfQ0ZHREFUQV9PRlMsIHZhbCk7Ci0KLQkJcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKLQotCWNhc2UgMjoKLQkJUENJX0NGR19TRVQoZGV2Zm4sICh3aGVyZSAmIH4weDMpKTsKLQkJdG1wID0gR1RfUkVBRChHVF9QQ0kwX0NGR0RBVEFfT0ZTKTsKLQkJdG1wICY9IH4oMHhmZmZmIDw8ICgod2hlcmUgJiAweDMpICogOCkpOwotCQl0bXAgfD0gKHZhbCA8PCAoKHdoZXJlICYgMHgzKSAqIDgpKTsKLQkJR1RfV1JJVEUoR1RfUENJMF9DRkdEQVRBX09GUywgdG1wKTsKLQotCQlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOwotCi0JY2FzZSAxOgotCQlQQ0lfQ0ZHX1NFVChkZXZmbiwgKHdoZXJlICYgfjB4MykpOwotCQl0bXAgPSBHVF9SRUFEKEdUX1BDSTBfQ0ZHREFUQV9PRlMpOwotCQl0bXAgJj0gfigweGZmIDw8ICgod2hlcmUgJiAweDMpICogOCkpOwotCQl0bXAgfD0gKHZhbCA8PCAoKHdoZXJlICYgMHgzKSAqIDgpKTsKLQkJR1RfV1JJVEUoR1RfUENJMF9DRkdEQVRBX09GUywgdG1wKTsKLQotCQlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOwotCX0KLQotCXJldHVybiBQQ0lCSU9TX0JBRF9SRUdJU1RFUl9OVU1CRVI7Ci19Ci0KLXN0cnVjdCBwY2lfb3BzIGd0NjQxMTFfcGNpX29wcyA9IHsKLQkucmVhZCA9IGd0NjQxMTFfcGNpX3JlYWRfY29uZmlnLAotCS53cml0ZSA9IGd0NjQxMTFfcGNpX3dyaXRlX2NvbmZpZywKLX07CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcGNpL29wcy1ndDY0MTIwLmMgYi9hcmNoL21pcHMvcGNpL29wcy1ndDY0eHh4X3BjaTAuYwpzaW1pbGFyaXR5IGluZGV4IDgwJQpyZW5hbWUgZnJvbSBhcmNoL21pcHMvcGNpL29wcy1ndDY0MTIwLmMKcmVuYW1lIHRvIGFyY2gvbWlwcy9wY2kvb3BzLWd0NjR4eHhfcGNpMC5jCmluZGV4IDYzMzU4NDRkLi4zZDg5NmM1IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvcGNpL29wcy1ndDY0MTIwLmMKKysrIGIvYXJjaC9taXBzL3BjaS9vcHMtZ3Q2NHh4eF9wY2kwLmMKQEAgLTM5LDggKzM5LDggQEAKICNkZWZpbmUgUENJX0NGR19UWVBFMV9ERVZfU0hGICAgICAgICAgICAxMQogI2RlZmluZSBQQ0lfQ0ZHX1RZUEUxX0JVU19TSEYgICAgICAgICAgIDE2CiAKLXN0YXRpYyBpbnQgZ3Q2NDEyMF9wY2liaW9zX2NvbmZpZ19hY2Nlc3ModW5zaWduZWQgY2hhciBhY2Nlc3NfdHlwZSwKLQlzdHJ1Y3QgcGNpX2J1cyAqYnVzLCB1bnNpZ25lZCBpbnQgZGV2Zm4sIGludCB3aGVyZSwgdTMyICogZGF0YSkKK3N0YXRpYyBpbnQgZ3Q2NHh4eF9wY2kwX3BjaWJpb3NfY29uZmlnX2FjY2Vzcyh1bnNpZ25lZCBjaGFyIGFjY2Vzc190eXBlLAorCQlzdHJ1Y3QgcGNpX2J1cyAqYnVzLCB1bnNpZ25lZCBpbnQgZGV2Zm4sIGludCB3aGVyZSwgdTMyICogZGF0YSkKIHsKIAl1bnNpZ25lZCBjaGFyIGJ1c251bSA9IGJ1cy0+bnVtYmVyOwogCXUzMiBpbnRyOwpAQCAtMTAwLDEzICsxMDAsMTMgQEAKICAqIFdlIGNhbid0IGFkZHJlc3MgOCBhbmQgMTYgYml0IHdvcmRzIGRpcmVjdGx5LiAgSW5zdGVhZCB3ZSBoYXZlIHRvCiAgKiByZWFkL3dyaXRlIGEgMzJiaXQgd29yZCBhbmQgbWFzay9tb2RpZnkgdGhlIGRhdGEgd2UgYWN0dWFsbHkgd2FudC4KICAqLwotc3RhdGljIGludCBndDY0MTIwX3BjaWJpb3NfcmVhZChzdHJ1Y3QgcGNpX2J1cyAqYnVzLCB1bnNpZ25lZCBpbnQgZGV2Zm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aGVyZSwgaW50IHNpemUsIHUzMiAqIHZhbCkKK3N0YXRpYyBpbnQgZ3Q2NHh4eF9wY2kwX3BjaWJpb3NfcmVhZChzdHJ1Y3QgcGNpX2J1cyAqYnVzLCB1bnNpZ25lZCBpbnQgZGV2Zm4sCisJCWludCB3aGVyZSwgaW50IHNpemUsIHUzMiAqIHZhbCkKIHsKIAl1MzIgZGF0YSA9IDA7CiAKLQlpZiAoZ3Q2NDEyMF9wY2liaW9zX2NvbmZpZ19hY2Nlc3MoUENJX0FDQ0VTU19SRUFELCBidXMsIGRldmZuLCB3aGVyZSwKLQkJCQkgICAgICAgICAgJmRhdGEpKQorCWlmIChndDY0eHh4X3BjaTBfcGNpYmlvc19jb25maWdfYWNjZXNzKFBDSV9BQ0NFU1NfUkVBRCwgYnVzLCBkZXZmbiwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSwgJmRhdGEpKQogCQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOwogCiAJaWYgKHNpemUgPT0gMSkKQEAgLTExOSwxNiArMTE5LDE2IEBACiAJcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKIH0KIAotc3RhdGljIGludCBndDY0MTIwX3BjaWJpb3Nfd3JpdGUoc3RydWN0IHBjaV9idXMgKmJ1cywgdW5zaWduZWQgaW50IGRldmZuLAotCQkJICAgICAgaW50IHdoZXJlLCBpbnQgc2l6ZSwgdTMyIHZhbCkKK3N0YXRpYyBpbnQgZ3Q2NHh4eF9wY2kwX3BjaWJpb3Nfd3JpdGUoc3RydWN0IHBjaV9idXMgKmJ1cywgdW5zaWduZWQgaW50IGRldmZuLAorCQlpbnQgd2hlcmUsIGludCBzaXplLCB1MzIgdmFsKQogewogCXUzMiBkYXRhID0gMDsKIAogCWlmIChzaXplID09IDQpCiAJCWRhdGEgPSB2YWw7CiAJZWxzZSB7Ci0JCWlmIChndDY0MTIwX3BjaWJpb3NfY29uZmlnX2FjY2VzcyhQQ0lfQUNDRVNTX1JFQUQsIGJ1cywgZGV2Zm4sCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSwgJmRhdGEpKQorCQlpZiAoZ3Q2NHh4eF9wY2kwX3BjaWJpb3NfY29uZmlnX2FjY2VzcyhQQ0lfQUNDRVNTX1JFQUQsIGJ1cywKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2Zm4sIHdoZXJlLCAmZGF0YSkpCiAJCQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOwogCiAJCWlmIChzaXplID09IDEpCkBAIC0xMzksMTQgKzEzOSwxNCBAQAogCQkJCSh2YWwgPDwgKCh3aGVyZSAmIDMpIDw8IDMpKTsKIAl9CiAKLQlpZiAoZ3Q2NDEyMF9wY2liaW9zX2NvbmZpZ19hY2Nlc3MoUENJX0FDQ0VTU19XUklURSwgYnVzLCBkZXZmbiwgd2hlcmUsCi0JCQkJICAgICAgICZkYXRhKSkKKwlpZiAoZ3Q2NHh4eF9wY2kwX3BjaWJpb3NfY29uZmlnX2FjY2VzcyhQQ0lfQUNDRVNTX1dSSVRFLCBidXMsIGRldmZuLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlLCAmZGF0YSkpCiAJCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7CiAKIAlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOwogfQogCi1zdHJ1Y3QgcGNpX29wcyBndDY0MTIwX3BjaV9vcHMgPSB7Ci0JLnJlYWQgPSBndDY0MTIwX3BjaWJpb3NfcmVhZCwKLQkud3JpdGUgPSBndDY0MTIwX3BjaWJpb3Nfd3JpdGUKK3N0cnVjdCBwY2lfb3BzIGd0NjR4eHhfcGNpMF9vcHMgPSB7CisJLnJlYWQJPSBndDY0eHh4X3BjaTBfcGNpYmlvc19yZWFkLAorCS53cml0ZQk9IGd0NjR4eHhfcGNpMF9wY2liaW9zX3dyaXRlCiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3BjaS9vcHMtdHgzOTI3LmMgYi9hcmNoL21pcHMvcGNpL29wcy10eDM5MjcuYwppbmRleCA0MjUzMGEwLi5hYTY5OGJkIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvcGNpL29wcy10eDM5MjcuYworKysgYi9hcmNoL21pcHMvcGNpL29wcy10eDM5MjcuYwpAQCAtNDAsNyArNDAsNiBAQAogCiAjaW5jbHVkZSA8YXNtL2FkZHJzcGFjZS5oPgogI2luY2x1ZGUgPGFzbS9qbXIzOTI3L2ptcjM5MjcuaD4KLSNpbmNsdWRlIDxhc20vZGVidWcuaD4KIAogc3RhdGljIGlubGluZSBpbnQgbWthZGRyKHVuc2lnbmVkIGNoYXIgYnVzLCB1bnNpZ25lZCBjaGFyIGRldl9mbiwKIAl1bnNpZ25lZCBjaGFyIHdoZXJlKQpAQCAtMTMwLDIzNCArMTI5LDMgQEAKIAlqbXIzOTI3X3BjaV9yZWFkX2NvbmZpZywKIAlqbXIzOTI3X3BjaV93cml0ZV9jb25maWcsCiB9OwotCi0KLSNpZm5kZWYgSk1SMzkyN19JTklUX0lORElSRUNUX1BDSQotCi1pbmxpbmUgdW5zaWduZWQgbG9uZyB0Y19yZWFkbCh2b2xhdGlsZSBfX3UzMiAqIGFkZHIpCi17Ci0JcmV0dXJuIHJlYWRsKGFkZHIpOwotfQotCi1pbmxpbmUgdm9pZCB0Y193cml0ZWwodW5zaWduZWQgbG9uZyBkYXRhLCB2b2xhdGlsZSBfX3UzMiAqIGFkZHIpCi17Ci0Jd3JpdGVsKGRhdGEsIGFkZHIpOwotfQotI2Vsc2UKLQotdW5zaWduZWQgbG9uZyB0Y19yZWFkbCh2b2xhdGlsZSBfX3UzMiAqIGFkZHIpCi17Ci0JdW5zaWduZWQgbG9uZyB2YWw7Ci0KLQkqKHZvbGF0aWxlIHUzMiAqKSAodW5zaWduZWQgbG9uZykgJiB0eDM5MjdfcGNpY3B0ci0+aXBjaWFkZHIgPQotCSAgICAodW5zaWduZWQgbG9uZykgQ1BIWVNBRERSKGFkZHIpOwotCSoodm9sYXRpbGUgdTMyICopICh1bnNpZ25lZCBsb25nKSAmIHR4MzkyN19wY2ljcHRyLT5pcGNpYmUgPQotCSAgICAoUENJX0lQQ0lCRV9JQ01EX01FTVJFQUQgPDwgUENJX0lQQ0lCRV9JQ01EX1NISUZUKSB8Ci0JICAgIFBDSV9JUENJQkVfSUJFX0xPTkc7Ci0Jd2hpbGUgKCEodHgzOTI3X3BjaWNwdHItPmlzdGF0ICYgUENJX0lTVEFUX0lESUNDKSk7Ci0JdmFsID0KLQkgICAgbGUzMl90b19jcHUoKih2b2xhdGlsZSB1MzIgKikgKHVuc2lnbmVkIGxvbmcpICYgdHgzOTI3X3BjaWNwdHItPgotCQkJaXBjaWRhdGEpOwotCS8qIGNsZWFyIGJ5IHNldHRpbmcgKi8KLQl0eDM5MjdfcGNpY3B0ci0+aXN0YXQgfD0gUENJX0lTVEFUX0lESUNDOwotCXJldHVybiB2YWw7Ci19Ci0KLXZvaWQgdGNfd3JpdGVsKHVuc2lnbmVkIGxvbmcgZGF0YSwgdm9sYXRpbGUgX191MzIgKiBhZGRyKQotewotCSoodm9sYXRpbGUgdTMyICopICh1bnNpZ25lZCBsb25nKSAmIHR4MzkyN19wY2ljcHRyLT5pcGNpZGF0YSA9Ci0JICAgIGNwdV90b19sZTMyKGRhdGEpOwotCSoodm9sYXRpbGUgdTMyICopICh1bnNpZ25lZCBsb25nKSAmIHR4MzkyN19wY2ljcHRyLT5pcGNpYWRkciA9Ci0JICAgICh1bnNpZ25lZCBsb25nKSBDUEhZU0FERFIoYWRkcik7Ci0JKih2b2xhdGlsZSB1MzIgKikgKHVuc2lnbmVkIGxvbmcpICYgdHgzOTI3X3BjaWNwdHItPmlwY2liZSA9Ci0JICAgIChQQ0lfSVBDSUJFX0lDTURfTUVNV1JJVEUgPDwgUENJX0lQQ0lCRV9JQ01EX1NISUZUKSB8Ci0JICAgIFBDSV9JUENJQkVfSUJFX0xPTkc7Ci0Jd2hpbGUgKCEodHgzOTI3X3BjaWNwdHItPmlzdGF0ICYgUENJX0lTVEFUX0lESUNDKSk7Ci0JLyogY2xlYXIgYnkgc2V0dGluZyAqLwotCXR4MzkyN19wY2ljcHRyLT5pc3RhdCB8PSBQQ0lfSVNUQVRfSURJQ0M7Ci19Ci0KLXVuc2lnbmVkIGNoYXIgdHhfaW9pbmIodW5zaWduZWQgY2hhciAqYWRkcikKLXsKLQl1bnNpZ25lZCBsb25nIHZhbDsKLQlfX3UzMiBpb2FkZHI7Ci0JaW50IG9mZnNldDsKLQlpbnQgYnl0ZTsKLQotCWlvYWRkciA9ICh1bnNpZ25lZCBsb25nKSBhZGRyOwotCW9mZnNldCA9IGlvYWRkciAmIDB4MzsKLQlieXRlID0gMHhmICYgfig4ID4+IG9mZnNldCk7Ci0KLQkqKHZvbGF0aWxlIHUzMiAqKSAodW5zaWduZWQgbG9uZykgJiB0eDM5MjdfcGNpY3B0ci0+aXBjaWFkZHIgPQotCSAgICAodW5zaWduZWQgbG9uZykgaW9hZGRyOwotCSoodm9sYXRpbGUgdTMyICopICh1bnNpZ25lZCBsb25nKSAmIHR4MzkyN19wY2ljcHRyLT5pcGNpYmUgPQotCSAgICAoUENJX0lQQ0lCRV9JQ01EX0lPUkVBRCA8PCBQQ0lfSVBDSUJFX0lDTURfU0hJRlQpIHwgYnl0ZTsKLQl3aGlsZSAoISh0eDM5MjdfcGNpY3B0ci0+aXN0YXQgJiBQQ0lfSVNUQVRfSURJQ0MpKTsKLQl2YWwgPQotCSAgICBsZTMyX3RvX2NwdSgqKHZvbGF0aWxlIHUzMiAqKSAodW5zaWduZWQgbG9uZykgJiB0eDM5MjdfcGNpY3B0ci0+Ci0JCQlpcGNpZGF0YSk7Ci0JdmFsID0gdmFsICYgMHhmZjsKLQkvKiBjbGVhciBieSBzZXR0aW5nICovCi0JdHgzOTI3X3BjaWNwdHItPmlzdGF0IHw9IFBDSV9JU1RBVF9JRElDQzsKLQlyZXR1cm4gdmFsOwotfQotCi12b2lkIHR4X2lvb3V0Yih1bnNpZ25lZCBsb25nIGRhdGEsIHVuc2lnbmVkIGNoYXIgKmFkZHIpCi17Ci0JX191MzIgaW9hZGRyOwotCWludCBvZmZzZXQ7Ci0JaW50IGJ5dGU7Ci0KLQlkYXRhID0gZGF0YSB8IChkYXRhIDw8IDgpIHwgKGRhdGEgPDwgMTYpIHwgKGRhdGEgPDwgMjQpOwotCWlvYWRkciA9ICh1bnNpZ25lZCBsb25nKSBhZGRyOwotCW9mZnNldCA9IGlvYWRkciAmIDB4MzsKLQlieXRlID0gMHhmICYgfig4ID4+IG9mZnNldCk7Ci0KLQkqKHZvbGF0aWxlIHUzMiAqKSAodW5zaWduZWQgbG9uZykgJiB0eDM5MjdfcGNpY3B0ci0+aXBjaWRhdGEgPSBkYXRhOwotCSoodm9sYXRpbGUgdTMyICopICh1bnNpZ25lZCBsb25nKSAmIHR4MzkyN19wY2ljcHRyLT5pcGNpYWRkciA9Ci0JICAgICh1bnNpZ25lZCBsb25nKSBpb2FkZHI7Ci0JKih2b2xhdGlsZSB1MzIgKikgKHVuc2lnbmVkIGxvbmcpICYgdHgzOTI3X3BjaWNwdHItPmlwY2liZSA9Ci0JICAgIChQQ0lfSVBDSUJFX0lDTURfSU9XUklURSA8PCBQQ0lfSVBDSUJFX0lDTURfU0hJRlQpIHwgYnl0ZTsKLQl3aGlsZSAoISh0eDM5MjdfcGNpY3B0ci0+aXN0YXQgJiBQQ0lfSVNUQVRfSURJQ0MpKTsKLQkvKiBjbGVhciBieSBzZXR0aW5nICovCi0JdHgzOTI3X3BjaWNwdHItPmlzdGF0IHw9IFBDSV9JU1RBVF9JRElDQzsKLX0KLQotdW5zaWduZWQgc2hvcnQgdHhfaW9pbncodW5zaWduZWQgc2hvcnQgKmFkZHIpCi17Ci0JdW5zaWduZWQgbG9uZyB2YWw7Ci0JX191MzIgaW9hZGRyOwotCWludCBvZmZzZXQ7Ci0JaW50IGJ5dGU7Ci0KLQlpb2FkZHIgPSAodW5zaWduZWQgbG9uZykgYWRkcjsKLQlvZmZzZXQgPSBpb2FkZHIgJiAweDI7Ci0JYnl0ZSA9IDMgPDwgb2Zmc2V0OwotCi0JKih2b2xhdGlsZSB1MzIgKikgKHVuc2lnbmVkIGxvbmcpICYgdHgzOTI3X3BjaWNwdHItPmlwY2lhZGRyID0KLQkgICAgKHVuc2lnbmVkIGxvbmcpIGlvYWRkcjsKLQkqKHZvbGF0aWxlIHUzMiAqKSAodW5zaWduZWQgbG9uZykgJiB0eDM5MjdfcGNpY3B0ci0+aXBjaWJlID0KLQkgICAgKFBDSV9JUENJQkVfSUNNRF9JT1JFQUQgPDwgUENJX0lQQ0lCRV9JQ01EX1NISUZUKSB8IGJ5dGU7Ci0Jd2hpbGUgKCEodHgzOTI3X3BjaWNwdHItPmlzdGF0ICYgUENJX0lTVEFUX0lESUNDKSk7Ci0JdmFsID0KLQkgICAgbGUzMl90b19jcHUoKih2b2xhdGlsZSB1MzIgKikgKHVuc2lnbmVkIGxvbmcpICYgdHgzOTI3X3BjaWNwdHItPgotCQkJaXBjaWRhdGEpOwotCXZhbCA9IHZhbCAmIDB4ZmZmZjsKLQkvKiBjbGVhciBieSBzZXR0aW5nICovCi0JdHgzOTI3X3BjaWNwdHItPmlzdGF0IHw9IFBDSV9JU1RBVF9JRElDQzsKLQlyZXR1cm4gdmFsOwotCi19Ci0KLXZvaWQgdHhfaW9vdXR3KHVuc2lnbmVkIGxvbmcgZGF0YSwgdW5zaWduZWQgc2hvcnQgKmFkZHIpCi17Ci0JX191MzIgaW9hZGRyOwotCWludCBvZmZzZXQ7Ci0JaW50IGJ5dGU7Ci0KLQlkYXRhID0gZGF0YSB8IChkYXRhIDw8IDE2KTsKLQlpb2FkZHIgPSAodW5zaWduZWQgbG9uZykgYWRkcjsKLQlvZmZzZXQgPSBpb2FkZHIgJiAweDI7Ci0JYnl0ZSA9IDMgPDwgb2Zmc2V0OwotCi0JKih2b2xhdGlsZSB1MzIgKikgKHVuc2lnbmVkIGxvbmcpICYgdHgzOTI3X3BjaWNwdHItPmlwY2lkYXRhID0gZGF0YTsKLQkqKHZvbGF0aWxlIHUzMiAqKSAodW5zaWduZWQgbG9uZykgJiB0eDM5MjdfcGNpY3B0ci0+aXBjaWFkZHIgPQotCSAgICAodW5zaWduZWQgbG9uZykgaW9hZGRyOwotCSoodm9sYXRpbGUgdTMyICopICh1bnNpZ25lZCBsb25nKSAmIHR4MzkyN19wY2ljcHRyLT5pcGNpYmUgPQotCSAgICAoUENJX0lQQ0lCRV9JQ01EX0lPV1JJVEUgPDwgUENJX0lQQ0lCRV9JQ01EX1NISUZUKSB8IGJ5dGU7Ci0Jd2hpbGUgKCEodHgzOTI3X3BjaWNwdHItPmlzdGF0ICYgUENJX0lTVEFUX0lESUNDKSk7Ci0JLyogY2xlYXIgYnkgc2V0dGluZyAqLwotCXR4MzkyN19wY2ljcHRyLT5pc3RhdCB8PSBQQ0lfSVNUQVRfSURJQ0M7Ci19Ci0KLXVuc2lnbmVkIGxvbmcgdHhfaW9pbmwodW5zaWduZWQgaW50ICphZGRyKQotewotCXVuc2lnbmVkIGxvbmcgdmFsOwotCV9fdTMyIGlvYWRkcjsKLQotCWlvYWRkciA9ICh1bnNpZ25lZCBsb25nKSBhZGRyOwotCSoodm9sYXRpbGUgdTMyICopICh1bnNpZ25lZCBsb25nKSAmIHR4MzkyN19wY2ljcHRyLT5pcGNpYWRkciA9Ci0JICAgICh1bnNpZ25lZCBsb25nKSBpb2FkZHI7Ci0JKih2b2xhdGlsZSB1MzIgKikgKHVuc2lnbmVkIGxvbmcpICYgdHgzOTI3X3BjaWNwdHItPmlwY2liZSA9Ci0JICAgIChQQ0lfSVBDSUJFX0lDTURfSU9SRUFEIDw8IFBDSV9JUENJQkVfSUNNRF9TSElGVCkgfAotCSAgICBQQ0lfSVBDSUJFX0lCRV9MT05HOwotCXdoaWxlICghKHR4MzkyN19wY2ljcHRyLT5pc3RhdCAmIFBDSV9JU1RBVF9JRElDQykpOwotCXZhbCA9Ci0JICAgIGxlMzJfdG9fY3B1KCoodm9sYXRpbGUgdTMyICopICh1bnNpZ25lZCBsb25nKSAmIHR4MzkyN19wY2ljcHRyLT4KLQkJCWlwY2lkYXRhKTsKLQkvKiBjbGVhciBieSBzZXR0aW5nICovCi0JdHgzOTI3X3BjaWNwdHItPmlzdGF0IHw9IFBDSV9JU1RBVF9JRElDQzsKLQlyZXR1cm4gdmFsOwotfQotCi12b2lkIHR4X2lvb3V0bCh1bnNpZ25lZCBsb25nIGRhdGEsIHVuc2lnbmVkIGludCAqYWRkcikKLXsKLQlfX3UzMiBpb2FkZHI7Ci0KLQlpb2FkZHIgPSAodW5zaWduZWQgbG9uZykgYWRkcjsKLQkqKHZvbGF0aWxlIHUzMiAqKSAodW5zaWduZWQgbG9uZykgJiB0eDM5MjdfcGNpY3B0ci0+aXBjaWRhdGEgPQotCSAgICBjcHVfdG9fbGUzMihkYXRhKTsKLQkqKHZvbGF0aWxlIHUzMiAqKSAodW5zaWduZWQgbG9uZykgJiB0eDM5MjdfcGNpY3B0ci0+aXBjaWFkZHIgPQotCSAgICAodW5zaWduZWQgbG9uZykgaW9hZGRyOwotCSoodm9sYXRpbGUgdTMyICopICh1bnNpZ25lZCBsb25nKSAmIHR4MzkyN19wY2ljcHRyLT5pcGNpYmUgPQotCSAgICAoUENJX0lQQ0lCRV9JQ01EX0lPV1JJVEUgPDwgUENJX0lQQ0lCRV9JQ01EX1NISUZUKSB8Ci0JICAgIFBDSV9JUENJQkVfSUJFX0xPTkc7Ci0Jd2hpbGUgKCEodHgzOTI3X3BjaWNwdHItPmlzdGF0ICYgUENJX0lTVEFUX0lESUNDKSk7Ci0JLyogY2xlYXIgYnkgc2V0dGluZyAqLwotCXR4MzkyN19wY2ljcHRyLT5pc3RhdCB8PSBQQ0lfSVNUQVRfSURJQ0M7Ci19Ci0KLXZvaWQgdHhfaW5zYnl0ZSh1bnNpZ25lZCBjaGFyICphZGRyLCB2b2lkICpidWZmZXIsIHVuc2lnbmVkIGludCBjb3VudCkKLXsKLQl1bnNpZ25lZCBjaGFyICpwdHIgPSAodW5zaWduZWQgY2hhciAqKSBidWZmZXI7Ci0KLQl3aGlsZSAoY291bnQtLSkgewotCQkqcHRyKysgPSB0eF9pb2luYihhZGRyKTsKLQl9Ci19Ci0KLXZvaWQgdHhfaW5zd29yZCh1bnNpZ25lZCBzaG9ydCAqYWRkciwgdm9pZCAqYnVmZmVyLCB1bnNpZ25lZCBpbnQgY291bnQpCi17Ci0JdW5zaWduZWQgc2hvcnQgKnB0ciA9ICh1bnNpZ25lZCBzaG9ydCAqKSBidWZmZXI7Ci0KLQl3aGlsZSAoY291bnQtLSkgewotCQkqcHRyKysgPSB0eF9pb2ludyhhZGRyKTsKLQl9Ci19Ci0KLXZvaWQgdHhfaW5zbG9uZyh1bnNpZ25lZCBpbnQgKmFkZHIsIHZvaWQgKmJ1ZmZlciwgdW5zaWduZWQgaW50IGNvdW50KQotewotCXVuc2lnbmVkIGxvbmcgKnB0ciA9ICh1bnNpZ25lZCBsb25nICopIGJ1ZmZlcjsKLQotCXdoaWxlIChjb3VudC0tKSB7Ci0JCSpwdHIrKyA9IHR4X2lvaW5sKGFkZHIpOwotCX0KLX0KLQotdm9pZCB0eF9vdXRzYnl0ZSh1bnNpZ25lZCBjaGFyICphZGRyLCB2b2lkICpidWZmZXIsIHVuc2lnbmVkIGludCBjb3VudCkKLXsKLQl1bnNpZ25lZCBjaGFyICpwdHIgPSAodW5zaWduZWQgY2hhciAqKSBidWZmZXI7Ci0KLQl3aGlsZSAoY291bnQtLSkgewotCQl0eF9pb291dGIoKnB0cisrLCBhZGRyKTsKLQl9Ci19Ci0KLXZvaWQgdHhfb3V0c3dvcmQodW5zaWduZWQgc2hvcnQgKmFkZHIsIHZvaWQgKmJ1ZmZlciwgdW5zaWduZWQgaW50IGNvdW50KQotewotCXVuc2lnbmVkIHNob3J0ICpwdHIgPSAodW5zaWduZWQgc2hvcnQgKikgYnVmZmVyOwotCi0Jd2hpbGUgKGNvdW50LS0pIHsKLQkJdHhfaW9vdXR3KCpwdHIrKywgYWRkcik7Ci0JfQotfQotCi12b2lkIHR4X291dHNsb25nKHVuc2lnbmVkIGludCAqYWRkciwgdm9pZCAqYnVmZmVyLCB1bnNpZ25lZCBpbnQgY291bnQpCi17Ci0JdW5zaWduZWQgbG9uZyAqcHRyID0gKHVuc2lnbmVkIGxvbmcgKikgYnVmZmVyOwotCi0Jd2hpbGUgKGNvdW50LS0pIHsKLQkJdHhfaW9vdXRsKCpwdHIrKywgYWRkcik7Ci0JfQotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcGNpL3BjaS1sYXNhdC5jIGIvYXJjaC9taXBzL3BjaS9wY2ktbGFzYXQuYwppbmRleCA4OGZiMTkxLi45ODU3ODRhIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvcGNpL3BjaS1sYXNhdC5jCisrKyBiL2FyY2gvbWlwcy9wY2kvcGNpLWxhc2F0LmMKQEAgLTEyLDcgKzEyLDcgQEAKICNpbmNsdWRlIDxhc20vYm9vdGluZm8uaD4KIAogZXh0ZXJuIHN0cnVjdCBwY2lfb3BzIG5pbGU0X3BjaV9vcHM7Ci1leHRlcm4gc3RydWN0IHBjaV9vcHMgZ3Q2NDEyMF9wY2lfb3BzOworZXh0ZXJuIHN0cnVjdCBwY2lfb3BzIGd0NjR4eHhfcGNpMF9vcHM7CiBzdGF0aWMgc3RydWN0IHJlc291cmNlIGxhc2F0X3BjaV9tZW1fcmVzb3VyY2UgPSB7CiAJLm5hbWUJPSAiTEFTQVQgUENJIE1FTSIsCiAJLnN0YXJ0CT0gMHgxODAwMDAwMCwKQEAgLTM4LDcgKzM4LDcgQEAKIAogCXN3aXRjaCAobWlwc19tYWNodHlwZSkgewogCWNhc2UgTUFDSF9MQVNBVF8xMDA6Ci0gICAgICAgICAgICAgICAgbGFzYXRfcGNpX2NvbnRyb2xsZXIucGNpX29wcyA9ICZndDY0MTIwX3BjaV9vcHM7CisgICAgICAgICAgICAgICAgbGFzYXRfcGNpX2NvbnRyb2xsZXIucGNpX29wcyA9ICZndDY0eHh4X3BjaTBfb3BzOwogICAgICAgICAgICAgICAgIGJyZWFrOwogCWNhc2UgTUFDSF9MQVNBVF8yMDA6CiAgICAgICAgICAgICAgICAgbGFzYXRfcGNpX2NvbnRyb2xsZXIucGNpX29wcyA9ICZuaWxlNF9wY2lfb3BzOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3BjaS9wY2ktb2NlbG90LmMgYi9hcmNoL21pcHMvcGNpL3BjaS1vY2Vsb3QuYwppbmRleCAyYjk0OTVkLi43Zjk0ZjI2IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvcGNpL3BjaS1vY2Vsb3QuYworKysgYi9hcmNoL21pcHMvcGNpL3BjaS1vY2Vsb3QuYwpAQCAtODEsNyArODEsNyBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBwY2lfY29udHJvbGxlciBvY2Vsb3RfcGNpX2NvbnRyb2xsZXIgPSB7Ci0JLnBjaV9vcHMJPSBndDY0MTIwX3BjaV9vcHM7CisJLnBjaV9vcHMJPSBndDY0eHh4X3BjaTBfb3BzOwogCS5tZW1fcmVzb3VyY2UJPSAmb2NlbG90X21lbV9yZXNvdXJjZTsKIAkuaW9fcmVzb3VyY2UJPSAmb2NlbG90X2lvX3Jlc291cmNlOwogfTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9wY2kvcGNpLmMgYi9hcmNoL21pcHMvcGNpL3BjaS5jCmluZGV4IGRlN2NmYzUuLjgxMDgyMzEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9wY2kvcGNpLmMKKysrIGIvYXJjaC9taXBzL3BjaS9wY2kuYwpAQCAtNzcsNiArNzcsMTMgQEAKIAogdm9pZCBfX2luaXQgcmVnaXN0ZXJfcGNpX2NvbnRyb2xsZXIoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlKQogeworCWlmIChyZXF1ZXN0X3Jlc291cmNlKCZpb21lbV9yZXNvdXJjZSwgaG9zZS0+bWVtX3Jlc291cmNlKSA8IDApCisJCWdvdG8gb3V0OworCWlmIChyZXF1ZXN0X3Jlc291cmNlKCZpb3BvcnRfcmVzb3VyY2UsIGhvc2UtPmlvX3Jlc291cmNlKSA8IDApIHsKKwkJcmVsZWFzZV9yZXNvdXJjZShob3NlLT5tZW1fcmVzb3VyY2UpOworCQlnb3RvIG91dDsKKwl9CisKIAkqaG9zZV90YWlsID0gaG9zZTsKIAlob3NlX3RhaWwgPSAmaG9zZS0+bmV4dDsKIApAQCAtODcsNiArOTQsMTEgQEAKIAkJcHJpbnRrKEtFUk5fV0FSTklORwogCQkgICAgICAgInJlZ2lzdGVyaW5nIFBDSSBjb250cm9sbGVyIHdpdGggaW9fbWFwX2Jhc2UgdW5zZXRcbiIpOwogCX0KKwlyZXR1cm47CisKK291dDoKKwlwcmludGsoS0VSTl9XQVJOSU5HCisJICAgICAgICJTa2lwcGluZyBQQ0kgYnVzIHNjYW4gZHVlIHRvIHJlc291cmNlIGNvbmZsaWN0XG4iKTsKIH0KIAogLyogTW9zdCBNSVBTIHN5c3RlbXMgaGF2ZSBzdHJhaWdodC1mb3J3YXJkIHN3aXp6bGluZyBuZWVkcy4gICovCkBAIC0xMjEsMTEgKzEzMyw2IEBACiAJLyogU2NhbiBhbGwgb2YgdGhlIHJlY29yZGVkIFBDSSBjb250cm9sbGVycy4gICovCiAJZm9yIChuZXh0X2J1c25vID0gMCwgaG9zZSA9IGhvc2VfaGVhZDsgaG9zZTsgaG9zZSA9IGhvc2UtPm5leHQpIHsKIAotCQlpZiAocmVxdWVzdF9yZXNvdXJjZSgmaW9tZW1fcmVzb3VyY2UsIGhvc2UtPm1lbV9yZXNvdXJjZSkgPCAwKQotCQkJZ290byBvdXQ7Ci0JCWlmIChyZXF1ZXN0X3Jlc291cmNlKCZpb3BvcnRfcmVzb3VyY2UsIGhvc2UtPmlvX3Jlc291cmNlKSA8IDApCi0JCQlnb3RvIG91dF9mcmVlX21lbV9yZXNvdXJjZTsKLQogCQlpZiAoIWhvc2UtPmlvbW11KQogCQkJUENJX0RNQV9CVVNfSVNfUEhZUyA9IDE7CiAKQEAgLTE0NCwxNCArMTUxLDYgQEAKIAkJCQluZWVkX2RvbWFpbl9pbmZvID0gMTsKIAkJCX0KIAkJfQotCQljb250aW51ZTsKLQotb3V0X2ZyZWVfbWVtX3Jlc291cmNlOgotCQlyZWxlYXNlX3Jlc291cmNlKGhvc2UtPm1lbV9yZXNvdXJjZSk7Ci0KLW91dDoKLQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkgICAgICAgIlNraXBwaW5nIFBDSSBidXMgc2NhbiBkdWUgdG8gcmVzb3VyY2UgY29uZmxpY3RcbiIpOwogCX0KIAogCWlmICghcGNpX3Byb2JlX29ubHkpCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvc2dpLWlwMjIvaXAyMi1udnJhbS5jIGIvYXJjaC9taXBzL3NnaS1pcDIyL2lwMjItbnZyYW0uYwppbmRleCBmZDI5ZmQ0Li5lMTlkNjBkIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvc2dpLWlwMjIvaXAyMi1udnJhbS5jCisrKyBiL2FyY2gvbWlwcy9zZ2ktaXAyMi9pcDIyLW52cmFtLmMKQEAgLTUyLDggKzUyLDcgQEAKICAqIG5hdGlvbmFsIHNlbWljb25kdWN0b3IgbnYgcmFtIGNoaXAgdGhlIG9wIGNvZGUgaXMgMyBiaXRzIGFuZAogICogdGhlIGFkZHJlc3MgaXMgNi84IGJpdHMuCiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBlZXByb21fY21kKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqY3RybCwgdW5zaWduZWQgY21kLAotCQkJICAgICAgdW5zaWduZWQgcmVnKQorc3RhdGljIGlubGluZSB2b2lkIGVlcHJvbV9jbWQodW5zaWduZWQgaW50ICpjdHJsLCB1bnNpZ25lZCBjbWQsIHVuc2lnbmVkIHJlZykKIHsKIAl1bnNpZ25lZCBzaG9ydCBzZXJfY21kOwogCWludCBpOwpAQCAtNjEsMzMgKzYwLDM0IEBACiAJc2VyX2NtZCA9IGNtZCB8IChyZWcgPDwgKDE2IC0gQklUU19JTl9DT01NQU5EKSk7CiAJZm9yIChpID0gMDsgaSA8IEJJVFNfSU5fQ09NTUFORDsgaSsrKSB7CiAJCWlmIChzZXJfY21kICYgKDE8PDE1KSkJLyogaWYgaGlnaCBvcmRlciBiaXQgc2V0ICovCi0JCQkqY3RybCB8PSBFRVBST01fREFUTzsKKwkJCXdyaXRlbChyZWFkbChjdHJsKSB8IEVFUFJPTV9EQVRPLCBjdHJsKTsKIAkJZWxzZQotCQkJKmN0cmwgJj0gfkVFUFJPTV9EQVRPOwotCQkqY3RybCAmPSB+RUVQUk9NX0VDTEs7Ci0JCSpjdHJsIHw9IEVFUFJPTV9FQ0xLOworCQkJd3JpdGVsKHJlYWRsKGN0cmwpICYgfkVFUFJPTV9EQVRPLCBjdHJsKTsKKwkJd3JpdGVsKHJlYWRsKGN0cmwpICYgfkVFUFJPTV9FQ0xLLCBjdHJsKTsKKwkJd3JpdGVsKHJlYWRsKGN0cmwpIHwgRUVQUk9NX0VDTEssIGN0cmwpOwogCQlzZXJfY21kIDw8PSAxOwogCX0KLQkqY3RybCAmPSB+RUVQUk9NX0RBVE87CS8qIHNlZSBkYXRhIHNoZWV0IHRpbWluZyBkaWFncmFtICovCisJLyogc2VlIGRhdGEgc2hlZXQgdGltaW5nIGRpYWdyYW0gKi8KKwl3cml0ZWwocmVhZGwoY3RybCkgJiB+RUVQUk9NX0RBVE8sIGN0cmwpOwogfQogCi11bnNpZ25lZCBzaG9ydCBpcDIyX2VlcHJvbV9yZWFkKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqY3RybCwgaW50IHJlZykKK3Vuc2lnbmVkIHNob3J0IGlwMjJfZWVwcm9tX3JlYWQodW5zaWduZWQgaW50ICpjdHJsLCBpbnQgcmVnKQogewogCXVuc2lnbmVkIHNob3J0IHJlcyA9IDA7CiAJaW50IGk7CiAKLQkqY3RybCAmPSB+RUVQUk9NX0VQUk9UOworCXdyaXRlbChyZWFkbChjdHJsKSAmIH5FRVBST01fRVBST1QsIGN0cmwpOwogCWVlcHJvbV9jc19vbihjdHJsKTsKIAllZXByb21fY21kKGN0cmwsIEVFUFJPTV9SRUFELCByZWcpOwogCiAJLyogY2xvY2sgdGhlIGRhdGEgb3VmIG9mIHNlcmlhbCBtZW0gKi8KIAlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgewotCQkqY3RybCAmPSB+RUVQUk9NX0VDTEs7CisJCXdyaXRlbChyZWFkbChjdHJsKSAmIH5FRVBST01fRUNMSywgY3RybCk7CiAJCWRlbGF5KCk7Ci0JCSpjdHJsIHw9IEVFUFJPTV9FQ0xLOworCQl3cml0ZWwocmVhZGwoY3RybCkgfCBFRVBST01fRUNMSywgY3RybCk7CiAJCWRlbGF5KCk7CiAJCXJlcyA8PD0gMTsKLQkJaWYgKCpjdHJsICYgRUVQUk9NX0RBVEkpCisJCWlmIChyZWFkbChjdHJsKSAmIEVFUFJPTV9EQVRJKQogCQkJcmVzIHw9IDE7CiAJfQogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvc2dpLWlwMjIvaXAyMi10aW1lLmMgYi9hcmNoL21pcHMvc2dpLWlwMjIvaXAyMi10aW1lLmMKaW5kZXggMjA1NTU0Ny4uOGU4OGE0NCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3NnaS1pcDIyL2lwMjItdGltZS5jCisrKyBiL2FyY2gvbWlwcy9zZ2ktaXAyMi9pcDIyLXRpbWUuYwpAQCAtOTQsNyArOTQsNyBAQAogc3RhdGljIHVuc2lnbmVkIGxvbmcgZG9zYW1wbGUodm9pZCkKIHsKIAl1MzIgY3QwLCBjdDE7Ci0Jdm9sYXRpbGUgdTggbXNiLCBsc2I7CisJdTggbXNiLCBsc2I7CiAKIAkvKiBTdGFydCB0aGUgY291bnRlci4gKi8KIAlzZ2ludC0+dGN3b3JkID0gKFNHSU5UX1RDV09SRF9DTlQyIHwgU0dJTlRfVENXT1JEX0NBTEwgfApAQCAtMTA3LDIxICsxMDcsMjEgQEAKIAogCS8qIExhdGNoIGFuZCBzcGluIHVudGlsIHRvcCBieXRlIG9mIGNvdW50ZXIyIGlzIHplcm8gKi8KIAlkbyB7Ci0JCXNnaW50LT50Y3dvcmQgPSBTR0lOVF9UQ1dPUkRfQ05UMiB8IFNHSU5UX1RDV09SRF9DTEFUOwotCQlsc2IgPSBzZ2ludC0+dGNudDI7Ci0JCW1zYiA9IHNnaW50LT50Y250MjsKKwkJd3JpdGViKFNHSU5UX1RDV09SRF9DTlQyIHwgU0dJTlRfVENXT1JEX0NMQVQsICZzZ2ludC0+dGN3b3JkKTsKKwkJbHNiID0gcmVhZGIoJnNnaW50LT50Y250Mik7CisJCW1zYiA9IHJlYWRiKCZzZ2ludC0+dGNudDIpOwogCQljdDEgPSByZWFkX2MwX2NvdW50KCk7CiAJfSB3aGlsZSAobXNiKTsKIAogCS8qIFN0b3AgdGhlIGNvdW50ZXIuICovCi0Jc2dpbnQtPnRjd29yZCA9IChTR0lOVF9UQ1dPUkRfQ05UMiB8IFNHSU5UX1RDV09SRF9DQUxMIHwKLQkJCSBTR0lOVF9UQ1dPUkRfTVNXU1QpOworCXdyaXRlYihzZ2ludC0+dGN3b3JkLCAoU0dJTlRfVENXT1JEX0NOVDIgfCBTR0lOVF9UQ1dPUkRfQ0FMTCB8CisJCQkgICAgICAgU0dJTlRfVENXT1JEX01TV1NUKSk7CiAJLyoKIAkgKiBSZXR1cm4gdGhlIGRpZmZlcmVuY2UsIHRoaXMgaXMgaG93IGZhciB0aGUgcjRrIGNvdW50ZXIgaW5jcmVtZW50cwogCSAqIGZvciBldmVyeSAxL0haIHNlY29uZHMuIFdlIHJvdW5kIG9mZiB0aGUgbmVhcmVzdCAxIE1IeiBvZiBtYXN0ZXIKIAkgKiBjbG9jayAoPSAxMDAwMDAwIC8gSFogLyAyKS4KIAkgKi8KLQkvKnJldHVybiAoY3QxIC0gY3QwICsgKDUwMDAwMC9IWi8yKSkgLyAoNTAwMDAwL0haKSAqICg1MDAwMDAvSFopOyovCisKIAlyZXR1cm4gKGN0MSAtIGN0MCkgLyAoNTAwMDAwL0haKSAqICg1MDAwMDAvSFopOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvc2lieXRlL0tjb25maWcgYi9hcmNoL21pcHMvc2lieXRlL0tjb25maWcKaW5kZXggYmRmMjRhNy4uZTZiMDAzZSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3NpYnl0ZS9LY29uZmlnCisrKyBiL2FyY2gvbWlwcy9zaWJ5dGUvS2NvbmZpZwpAQCAtMiw2ICsyLDcgQEAKIAlib29sCiAJc2VsZWN0IEhXX0hBU19QQ0kKIAlzZWxlY3QgU0lCWVRFX0VOQUJMRV9MRFRfSUZfUENJCisJc2VsZWN0IFNJQllURV9IQVNfWkJVU19QUk9GSUxJTkcKIAlzZWxlY3QgU0lCWVRFX1NCMXh4eF9TT0MKIAlzZWxlY3QgU1lTX1NVUFBPUlRTX1NNUAogCkBAIC0zNCw2ICszNSw3IEBACiBjb25maWcgU0lCWVRFX0JDTTF4ODAKIAlib29sCiAJc2VsZWN0IEhXX0hBU19QQ0kKKwlzZWxlY3QgU0lCWVRFX0hBU19aQlVTX1BST0ZJTElORwogCXNlbGVjdCBTSUJZVEVfU0IxeHh4X1NPQwogCXNlbGVjdCBTWVNfU1VQUE9SVFNfU01QCiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9zaWJ5dGUvY29tbW9uL01ha2VmaWxlIGIvYXJjaC9taXBzL3NpYnl0ZS9jb21tb24vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGEwNmE0ZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9zaWJ5dGUvY29tbW9uL01ha2VmaWxlCkBAIC0wLDAgKzEsNSBAQAorb2JqLXkgOj0KKworb2JqLSQoQ09ORklHX1NJQllURV9UQlBST0YpCQkrPSBzYl90YnByb2YubworCitFWFRSQV9BRkxBR1MgOj0gJChDRkxBR1MpCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvc2lieXRlL3NiMTI1MC9iY20xMjUwX3RicHJvZi5jIGIvYXJjaC9taXBzL3NpYnl0ZS9jb21tb24vc2JfdGJwcm9mLmMKc2ltaWxhcml0eSBpbmRleCA4MCUKcmVuYW1lIGZyb20gYXJjaC9taXBzL3NpYnl0ZS9zYjEyNTAvYmNtMTI1MF90YnByb2YuYwpyZW5hbWUgdG8gYXJjaC9taXBzL3NpYnl0ZS9jb21tb24vc2JfdGJwcm9mLmMKaW5kZXggZWEwY2ExMy4uNGZjZGFhOCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3NpYnl0ZS9zYjEyNTAvYmNtMTI1MF90YnByb2YuYworKysgYi9hcmNoL21pcHMvc2lieXRlL2NvbW1vbi9zYl90YnByb2YuYwpAQCAtMzEsMTQgKzMxLDI5IEBACiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KLQogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9zaWJ5dGUvc2IxMjUwLmg+CisKKyNpZiBkZWZpbmVkKENPTkZJR19TSUJZVEVfQkNNMXg1NSkgfHwgZGVmaW5lZChDT05GSUdfU0lCWVRFX0JDTTF4ODApCisjaW5jbHVkZSA8YXNtL3NpYnl0ZS9iY20xNDgwX3JlZ3MuaD4KKyNpbmNsdWRlIDxhc20vc2lieXRlL2JjbTE0ODBfc2NkLmg+CisjaW5jbHVkZSA8YXNtL3NpYnl0ZS9iY20xNDgwX2ludC5oPgorI2VsaWYgZGVmaW5lZChDT05GSUdfU0lCWVRFX1NCMTI1MCkgfHwgZGVmaW5lZChDT05GSUdfU0lCWVRFX0JDTTExMlgpCiAjaW5jbHVkZSA8YXNtL3NpYnl0ZS9zYjEyNTBfcmVncy5oPgogI2luY2x1ZGUgPGFzbS9zaWJ5dGUvc2IxMjUwX3NjZC5oPgogI2luY2x1ZGUgPGFzbS9zaWJ5dGUvc2IxMjUwX2ludC5oPgorI2Vsc2UKKyNlcnJvciBpbnZhbGlkIFNpQnl0ZSBVQVJUIGNvbmZpZ3VhdGlvbgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TSUJZVEVfQkNNMXg1NSkgfHwgZGVmaW5lZChDT05GSUdfU0lCWVRFX0JDTTF4ODApCisjdW5kZWYgS19JTlRfVFJBQ0VfRlJFRVpFCisjZGVmaW5lIEtfSU5UX1RSQUNFX0ZSRUVaRSBLX0JDTTE0ODBfSU5UX1RSQUNFX0ZSRUVaRQorI3VuZGVmIEtfSU5UX1BFUkZfQ05UCisjZGVmaW5lIEtfSU5UX1BFUkZfQ05UIEtfQkNNMTQ4MF9JTlRfUEVSRl9DTlQKKyNlbmRpZgorCiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKQEAgLTExOCw3ICsxMzMsNyBAQAogCQkJOiAvKiBpbnB1dHMgKi8gXAogCQkJOiAvKiBtb2RpZmllcyAqLyAiJDgiICkKIAotI2RlZmluZSBERVZOQU1FICJiY20xMjUwX3RicHJvZiIKKyNkZWZpbmUgREVWTkFNRSAic2JfdGJwcm9mIgogCiAjZGVmaW5lIFRCX0ZVTEwgKHNicC5uZXh0X3RiX3NhbXBsZSA9PSBNQVhfVEJfU0FNUExFUykKIApAQCAtMTMyLDYgKzE0Nyw3IEBACiAgKiBvdmVyZmxvdy4KICAqCiAgKiBXZSBtYXAgdGhlIGludGVycnVwdCBmb3IgdHJhY2VfYnVmZmVyX2ZyZWV6ZSB0byBoYW5kbGUgaXQgb24gQ1BVIDAuCisgKgogICovCiAKIHN0YXRpYyB1NjQgdGJfcGVyaW9kOwpAQCAtMTQzLDI1ICsxNTksMzYgQEAKIAl1NjQgdGJfb3B0aW9ucyA9IE1fU0NEX1RSQUNFX0NGR19GUkVFWkVfRlVMTDsKIAogCS8qCi0JICogR2VuZXJhdGUgYW4gU0NEX1BFUkZDTlQgaW50ZXJydXB0IGluIFRCX1BFUklPRCBaY2xrcyB0byB0cmlnZ2VyCi0JICpzdGFydCBvZiB0cmFjZS4gIFhYWCB2YXJ5IHNhbXBsaW5nIHBlcmlvZAorCSAqIEdlbmVyYXRlIGFuIFNDRF9QRVJGQ05UIGludGVycnVwdCBpbiBUQl9QRVJJT0QgWmNsa3MgdG8KKwkgKiB0cmlnZ2VyIHN0YXJ0IG9mIHRyYWNlLiAgWFhYIHZhcnkgc2FtcGxpbmcgcGVyaW9kCiAJICovCiAJX19yYXdfd3JpdGVxKDAsIElPQUREUihBX1NDRF9QRVJGX0NOVF8xKSk7CiAJc2NkcGVyZmNudCA9IF9fcmF3X3JlYWRxKElPQUREUihBX1NDRF9QRVJGX0NOVF9DRkcpKTsKIAogCS8qCi0JICogVW5mb3J0dW5hdGVseSwgaW4gUGFzcyAyIHdlIG11c3QgY2xlYXIgYWxsIGNvdW50ZXJzIHRvIGtub2NrIGRvd24gYQotCSAqIHByZXZpb3VzIGludGVycnVwdCByZXF1ZXN0LiAgVGhpcyBtZWFucyB0aGF0IGJ1cyBwcm9maWxpbmcgcmVxdWlyZXMKLQkgKiBBTEwgb2YgdGhlIFNDRCBwZXJmIGNvdW50ZXJzLgorCSAqIFVuZm9ydHVuYXRlbHksIGluIFBhc3MgMiB3ZSBtdXN0IGNsZWFyIGFsbCBjb3VudGVycyB0byBrbm9jayBkb3duCisJICogYSBwcmV2aW91cyBpbnRlcnJ1cHQgcmVxdWVzdC4gIFRoaXMgbWVhbnMgdGhhdCBidXMgcHJvZmlsaW5nCisJICogcmVxdWlyZXMgQUxMIG9mIHRoZSBTQ0QgcGVyZiBjb3VudGVycy4KIAkgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19TSUJZVEVfQkNNMXg1NSkgfHwgZGVmaW5lZChDT05GSUdfU0lCWVRFX0JDTTF4ODApCisJX19yYXdfd3JpdGVxKChzY2RwZXJmY250ICYgfk1fU1BDX0NGR19TUkMxKSB8CisJCQkJCQkvKiBrZWVwIGNvdW50ZXJzIDAsMiwzLDQsNSw2LDcgYXMgaXMgKi8KKwkJICAgICBWX1NQQ19DRkdfU1JDMSgxKSwJCS8qIGNvdW50ZXIgMSBjb3VudHMgY3ljbGVzICovCisJCSAgICAgSU9BRERSKEFfQkNNMTQ4MF9TQ0RfUEVSRl9DTlRfQ0ZHMCkpOworCV9fcmF3X3dyaXRlcSgKKwkJICAgICBNX1NQQ19DRkdfRU5BQkxFIHwJCS8qIGVuYWJsZSBjb3VudGluZyAqLworCQkgICAgIE1fU1BDX0NGR19DTEVBUiB8CQkvKiBjbGVhciBhbGwgY291bnRlcnMgKi8KKwkJICAgICBWX1NQQ19DRkdfU1JDMSgxKSwJCS8qIGNvdW50ZXIgMSBjb3VudHMgY3ljbGVzICovCisJCSAgICAgSU9BRERSKEFfQkNNMTQ4MF9TQ0RfUEVSRl9DTlRfQ0ZHMSkpOworI2Vsc2UKIAlfX3Jhd193cml0ZXEoKHNjZHBlcmZjbnQgJiB+TV9TUENfQ0ZHX1NSQzEpIHwKIAkJCQkJCS8qIGtlZXAgY291bnRlcnMgMCwyLDMgYXMgaXMgKi8KIAkJICAgICBNX1NQQ19DRkdfRU5BQkxFIHwJCS8qIGVuYWJsZSBjb3VudGluZyAqLwogCQkgICAgIE1fU1BDX0NGR19DTEVBUiB8CQkvKiBjbGVhciBhbGwgY291bnRlcnMgKi8KIAkJICAgICBWX1NQQ19DRkdfU1JDMSgxKSwJCS8qIGNvdW50ZXIgMSBjb3VudHMgY3ljbGVzICovCiAJCSAgICAgSU9BRERSKEFfU0NEX1BFUkZfQ05UX0NGRykpOworI2VuZGlmCiAJX19yYXdfd3JpdGVxKG5leHQsIElPQUREUihBX1NDRF9QRVJGX0NOVF8xKSk7Ci0KIAkvKiBSZXNldCB0aGUgdHJhY2UgYnVmZmVyICovCiAJX19yYXdfd3JpdGVxKE1fU0NEX1RSQUNFX0NGR19SRVNFVCwgSU9BRERSKEFfU0NEX1RSQUNFX0NGRykpOwogI2lmIDAgJiYgZGVmaW5lZChNX1NDRF9UUkFDRV9DRkdfRk9SQ0VDTlQpCkBAIC0xOTAsMzggKzIxNywzNyBAQAogCQkJLyogU3Vic2NyaXB0cyBkZWNyZWFzZSB0byBwdXQgYnVuZGxlIGluIHRoZSBvcmRlciAqLwogCQkJLyogICB0MCBsbywgdDAgaGksIHQxIGxvLCB0MSBoaSwgdDIgbG8sIHQyIGhpICovCiAJCQlwW2kgLSAxXSA9IF9fcmF3X3JlYWRxKElPQUREUihBX1NDRF9UUkFDRV9SRUFEKSk7Ci0JCQkJCQkJCS8qIHJlYWQgdDIgaGkgKi8KKwkJCS8qIHJlYWQgdDIgaGkgKi8KIAkJCXBbaSAtIDJdID0gX19yYXdfcmVhZHEoSU9BRERSKEFfU0NEX1RSQUNFX1JFQUQpKTsKLQkJCQkJCQkJLyogcmVhZCB0MiBsbyAqLworCQkJLyogcmVhZCB0MiBsbyAqLwogCQkJcFtpIC0gM10gPSBfX3Jhd19yZWFkcShJT0FERFIoQV9TQ0RfVFJBQ0VfUkVBRCkpOwotCQkJCQkJCQkvKiByZWFkIHQxIGhpICovCisJCQkvKiByZWFkIHQxIGhpICovCiAJCQlwW2kgLSA0XSA9IF9fcmF3X3JlYWRxKElPQUREUihBX1NDRF9UUkFDRV9SRUFEKSk7Ci0JCQkJCQkJCS8qIHJlYWQgdDEgbG8gKi8KKwkJCS8qIHJlYWQgdDEgbG8gKi8KIAkJCXBbaSAtIDVdID0gX19yYXdfcmVhZHEoSU9BRERSKEFfU0NEX1RSQUNFX1JFQUQpKTsKLQkJCQkJCQkJLyogcmVhZCB0MCBoaSAqLworCQkJLyogcmVhZCB0MCBoaSAqLwogCQkJcFtpIC0gNl0gPSBfX3Jhd19yZWFkcShJT0FERFIoQV9TQ0RfVFJBQ0VfUkVBRCkpOwotCQkJCQkJCQkvKiByZWFkIHQwIGxvICovCisJCQkvKiByZWFkIHQwIGxvICovCiAJCX0KIAkJaWYgKCFzYnAudGJfZW5hYmxlKSB7CiAJCQlwcl9kZWJ1ZyhERVZOQU1FICI6IHRiX2ludHIgc2h1dGRvd25cbiIpOwogCQkJX19yYXdfd3JpdGVxKE1fU0NEX1RSQUNFX0NGR19SRVNFVCwKIAkJCQkgICAgIElPQUREUihBX1NDRF9UUkFDRV9DRkcpKTsKIAkJCXNicC50Yl9hcm1lZCA9IDA7Ci0JCQl3YWtlX3VwKCZzYnAudGJfc3luYyk7CisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnNicC50Yl9zeW5jKTsKIAkJfSBlbHNlIHsKLQkJCWFybV90YigpOwkvKiBrbm9jayBkb3duIGN1cnJlbnQgaW50ZXJydXB0IGFuZCBnZXQgYW5vdGhlciBvbmUgbGF0ZXIgKi8KKwkJCS8qIGtub2NrIGRvd24gY3VycmVudCBpbnRlcnJ1cHQgYW5kIGdldCBhbm90aGVyIG9uZSBsYXRlciAqLworCQkJYXJtX3RiKCk7CiAJCX0KIAl9IGVsc2UgewogCQkvKiBObyBtb3JlIHRyYWNlIGJ1ZmZlciBzYW1wbGVzICovCiAJCXByX2RlYnVnKERFVk5BTUUgIjogdGJfaW50ciBmdWxsXG4iKTsKIAkJX19yYXdfd3JpdGVxKE1fU0NEX1RSQUNFX0NGR19SRVNFVCwgSU9BRERSKEFfU0NEX1RSQUNFX0NGRykpOwogCQlzYnAudGJfYXJtZWQgPSAwOwotCQlpZiAoIXNicC50Yl9lbmFibGUpIHsKLQkJCXdha2VfdXAoJnNicC50Yl9zeW5jKTsKLQkJfQotCQl3YWtlX3VwKCZzYnAudGJfcmVhZCk7CisJCWlmICghc2JwLnRiX2VuYWJsZSkKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmc2JwLnRiX3N5bmMpOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnNicC50Yl9yZWFkKTsKIAl9Ci0KIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKQEAgLTI1MCw4ICsyNzYsOCBAQAogCXNicC5uZXh0X3RiX3NhbXBsZSA9IDA7CiAJZmlscC0+Zl9wb3MgPSAwOwogCi0JZXJyID0gcmVxdWVzdF9pcnEoS19JTlRfVFJBQ0VfRlJFRVpFLCBzYnByb2ZfdGJfaW50ciwgMCwKLQkgICAgICAgICAgICAgICAgREVWTkFNRSAiIHRyYWNlIGZyZWV6ZSIsICZzYnApOworCWVyciA9IHJlcXVlc3RfaXJxIChLX0lOVF9UUkFDRV9GUkVFWkUsIHNicHJvZl90Yl9pbnRyLCAwLAorCQkJICAgREVWTkFNRSAiIHRyYWNlIGZyZWV6ZSIsICZzYnApOwogCWlmIChlcnIpCiAJCXJldHVybiAtRUJVU1k7CiAKQEAgLTI2MywyMyArMjg5LDI5IEBACiAJCSAgICAgSU9BRERSKEFfU0NEX1BFUkZfQ05UX0NGRykpOwogCiAJLyoKLQkgKiBXZSBncmFiIHRoaXMgaW50ZXJydXB0IHRvIHByZXZlbnQgb3RoZXJzIGZyb20gdHJ5aW5nIHRvIHVzZSBpdCwgZXZlbgotCSAqIHRob3VnaCB3ZSBkb24ndCB3YW50IHRvIHNlcnZpY2UgdGhlIGludGVycnVwdHMgKHRoZXkgb25seSBmZWVkIGludG8KLQkgKiB0aGUgdHJhY2Utb24taW50ZXJydXB0IG1lY2hhbmlzbSkKKwkgKiBXZSBncmFiIHRoaXMgaW50ZXJydXB0IHRvIHByZXZlbnQgb3RoZXJzIGZyb20gdHJ5aW5nIHRvIHVzZQorICAgICAgICAgKiBpdCwgZXZlbiB0aG91Z2ggd2UgZG9uJ3Qgd2FudCB0byBzZXJ2aWNlIHRoZSBpbnRlcnJ1cHRzCisgICAgICAgICAqICh0aGV5IG9ubHkgZmVlZCBpbnRvIHRoZSB0cmFjZS1vbi1pbnRlcnJ1cHQgbWVjaGFuaXNtKQogCSAqLwotCWVyciA9IHJlcXVlc3RfaXJxKEtfSU5UX1BFUkZfQ05ULCBzYnByb2ZfcGNfaW50ciwgMCwKLQkgICAgICAgICAgICAgICAgREVWTkFNRSAiIHNjZCBwZXJmY250IiwgJnNicCk7Ci0JaWYgKGVycikKLQkJZ290byBvdXRfZnJlZV9pcnE7CisJaWYgKHJlcXVlc3RfaXJxKEtfSU5UX1BFUkZfQ05ULCBzYnByb2ZfcGNfaW50ciwgMCwgREVWTkFNRSAiIHNjZCBwZXJmY250IiwgJnNicCkpIHsKKwkJZnJlZV9pcnEoS19JTlRfVFJBQ0VfRlJFRVpFLCAmc2JwKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CiAKIAkvKgotCSAqIEkgbmVlZCB0aGUgY29yZSB0byBtYXNrIHRoZXNlLCBidXQgdGhlIGludGVycnVwdCBtYXBwZXIgdG8gcGFzcyB0aGVtCi0JICogdGhyb3VnaC4gIEkgYW0gZXhwbG9pdGluZyBteSBrbm93bGVkZ2UgdGhhdCBjcDBfc3RhdHVzIG1hc2tzIG91dAotCSAqIElQWzVdLiBrcncKKwkgKiBJIG5lZWQgdGhlIGNvcmUgdG8gbWFzayB0aGVzZSwgYnV0IHRoZSBpbnRlcnJ1cHQgbWFwcGVyIHRvCisJICogIHBhc3MgdGhlbSB0aHJvdWdoLiAgSSBhbSBleHBsb2l0aW5nIG15IGtub3dsZWRnZSB0aGF0CisJICogIGNwMF9zdGF0dXMgbWFza3Mgb3V0IElQWzVdLiBrcncKIAkgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19TSUJZVEVfQkNNMXg1NSkgfHwgZGVmaW5lZChDT05GSUdfU0lCWVRFX0JDTTF4ODApCisJX19yYXdfd3JpdGVxKEtfQkNNMTQ4MF9JTlRfTUFQX0kzLAorCQkgICAgIElPQUREUihBX0JDTTE0ODBfSU1SX1JFR0lTVEVSKDAsIFJfQkNNMTQ4MF9JTVJfSU5URVJSVVBUX01BUF9CQVNFX0wpICsKKwkJCSAgICAoKEtfQkNNMTQ4MF9JTlRfUEVSRl9DTlQgJiAweDNmKSA8PCAzKSkpOworI2Vsc2UKIAlfX3Jhd193cml0ZXEoS19JTlRfTUFQX0kzLAogCQkgICAgIElPQUREUihBX0lNUl9SRUdJU1RFUigwLCBSX0lNUl9JTlRFUlJVUFRfTUFQX0JBU0UpICsKIAkJCSAgICAoS19JTlRfUEVSRl9DTlQgPDwgMykpKTsKKyNlbmRpZgogCiAJLyogSW5pdGlhbGl6ZSBhZGRyZXNzIHRyYXBzICovCiAJX19yYXdfd3JpdGVxKDAsIElPQUREUihBX0FERFJfVFJBUF9VUF8wKSk7CkBAIC0yOTgsNyArMzMwLDcgQEAKIAlfX3Jhd193cml0ZXEoMCwgSU9BRERSKEFfQUREUl9UUkFQX0NGR18zKSk7CiAKIAkvKiBJbml0aWFsaXplIFRyYWNlIEV2ZW50IDAtNyAqLwotCS8qCQkJCXdoZW4gaW50ZXJydXB0ICovCisJLyoJCQkJd2hlbiBpbnRlcnJ1cHQgICovCiAJX19yYXdfd3JpdGVxKE1fU0NEX1RSRVZUX0lOVEVSUlVQVCwgSU9BRERSKEFfU0NEX1RSQUNFX0VWRU5UXzApKTsKIAlfX3Jhd193cml0ZXEoMCwgSU9BRERSKEFfU0NEX1RSQUNFX0VWRU5UXzEpKTsKIAlfX3Jhd193cml0ZXEoMCwgSU9BRERSKEFfU0NEX1RSQUNFX0VWRU5UXzIpKTsKQEAgLTMyNCwyNCArMzU2LDIzIEBACiAJX19yYXdfd3JpdGVxKDAsIElPQUREUihBX1NDRF9UUkFDRV9TRVFVRU5DRV83KSk7CiAKIAkvKiBOb3cgaW5kaWNhdGUgdGhlIFBFUkZfQ05UIGludGVycnVwdCBhcyBhIHRyYWNlLXJlbGV2YW50IGludGVycnVwdCAqLworI2lmIGRlZmluZWQoQ09ORklHX1NJQllURV9CQ00xeDU1KSB8fCBkZWZpbmVkKENPTkZJR19TSUJZVEVfQkNNMXg4MCkKKwlfX3Jhd193cml0ZXEoMVVMTCA8PCAoS19CQ00xNDgwX0lOVF9QRVJGX0NOVCAmIDB4M2YpLAorCQkgICAgIElPQUREUihBX0JDTTE0ODBfSU1SX1JFR0lTVEVSKDAsIFJfQkNNMTQ4MF9JTVJfSU5URVJSVVBUX1RSQUNFX0wpKSk7CisjZWxzZQogCV9fcmF3X3dyaXRlcSgxVUxMIDw8IEtfSU5UX1BFUkZfQ05ULAogCQkgICAgIElPQUREUihBX0lNUl9SRUdJU1RFUigwLCBSX0lNUl9JTlRFUlJVUFRfVFJBQ0UpKSk7Ci0KKyNlbmRpZgogCWFybV90YigpOwogCiAJcHJfZGVidWcoREVWTkFNRSAiOiBkb25lIHN0YXJ0aW5nXG4iKTsKIAogCXJldHVybiAwOwotCi1vdXRfZnJlZV9pcnE6Ci0JZnJlZV9pcnEoS19JTlRfVFJBQ0VfRlJFRVpFLCAmc2JwKTsKLQotCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyBpbnQgc2Jwcm9mX3picHJvZl9zdG9wKHZvaWQpCiB7Ci0JaW50IGVycjsKKwlpbnQgZXJyID0gMDsKIAogCXByX2RlYnVnKERFVk5BTUUgIjogc3RvcHBpbmdcbiIpOwogCkBAIC0zNjUsNyArMzk2LDcgQEAKIAogCXByX2RlYnVnKERFVk5BTUUgIjogZG9uZSBzdG9wcGluZ1xuIik7CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgaW50IHNicHJvZl90Yl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQpAQCAtMzgwLDExICs0MTEsOSBAQAogCQlyZXR1cm4gLUVCVVNZOwogCiAJbWVtc2V0KCZzYnAsIDAsIHNpemVvZihzdHJ1Y3Qgc2Jwcm9mX3RiKSk7Ci0KIAlzYnAuc2Jwcm9mX3RiYnVmID0gdm1hbGxvYyhNQVhfVEJTQU1QTEVfQllURVMpOwogCWlmICghc2JwLnNicHJvZl90YmJ1ZikKIAkJcmV0dXJuIC1FTk9NRU07Ci0KIAltZW1zZXQoc2JwLnNicHJvZl90YmJ1ZiwgMCwgTUFYX1RCU0FNUExFX0JZVEVTKTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzYnAudGJfc3luYyk7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmc2JwLnRiX3JlYWQpOwpAQCAtMzk3LDggKzQyNiw5IEBACiAKIHN0YXRpYyBpbnQgc2Jwcm9mX3RiX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCiB7Ci0JaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKKwlpbnQgbWlub3I7CiAKKwltaW5vciA9IGltaW5vcihpbm9kZSk7CiAJaWYgKG1pbm9yICE9IDAgfHwgIXNicC5vcGVuKQogCQlyZXR1cm4gLUVOT0RFVjsKIApAQCAtNDE5LDEwICs0NDksMTAgQEAKIAkJCSAgICAgIHNpemVfdCBzaXplLCBsb2ZmX3QgKm9mZnApCiB7CiAJaW50IGN1cl9zYW1wbGUsIHNhbXBsZV9vZmYsIGN1cl9jb3VudCwgc2FtcGxlX2xlZnQ7Ci0JbG9uZyAgY3VyX29mZiA9ICpvZmZwOwotCWNoYXIgKmRlc3QgICAgPQkgYnVmOwotCWludCAgIGNvdW50ICAgPQkgMDsKIAljaGFyICpzcmM7CisJaW50ICAgY291bnQgICA9CSAwOworCWNoYXIgKmRlc3QgICAgPQkgYnVmOworCWxvbmcgIGN1cl9vZmYgPSAqb2ZmcDsKIAogCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgYnVmLCBzaXplKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CkBAIC00NDUsNyArNDc1LDYgQEAKIAkJCW11dGV4X3VubG9jaygmc2JwLmxvY2spOwogCQkJcmV0dXJuIGVycjsKIAkJfQotCiAJCXByX2RlYnVnKERFVk5BTUUgIjogcmVhZCBmcm9tIHNhbXBsZSAlZCwgJWQgYnl0ZXNcbiIsCiAJCSAgICAgICAgIGN1cl9zYW1wbGUsIGN1cl9jb3VudCk7CiAJCXNpemUgLT0gY3VyX2NvdW50OwpAQCAtNDYxLDQ1ICs0OTAsNDYgQEAKIAkJZGVzdCArPSBjdXJfY291bnQ7CiAJCWNvdW50ICs9IGN1cl9jb3VudDsKIAl9Ci0KIAkqb2ZmcCA9IGN1cl9vZmY7CiAJbXV0ZXhfdW5sb2NrKCZzYnAubG9jayk7CiAKIAlyZXR1cm4gY291bnQ7CiB9CiAKLXN0YXRpYyBsb25nIHNicHJvZl90Yl9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNvbW1hbmQsCi0JdW5zaWduZWQgbG9uZyBhcmcpCitzdGF0aWMgbG9uZyBzYnByb2ZfdGJfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsCisJCQkgICAgdW5zaWduZWQgaW50IGNvbW1hbmQsCisJCQkgICAgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JaW50IGVycm9yID0gMDsKKwlpbnQgZXJyID0gMDsKIAogCXN3aXRjaCAoY29tbWFuZCkgewogCWNhc2UgU0JQUk9GX1pCU1RBUlQ6CiAJCW11dGV4X2xvY2soJnNicC5sb2NrKTsKLQkJZXJyb3IgPSBzYnByb2ZfemJwcm9mX3N0YXJ0KGZpbHApOworCQllcnIgPSBzYnByb2ZfemJwcm9mX3N0YXJ0KGZpbHApOwogCQltdXRleF91bmxvY2soJnNicC5sb2NrKTsKIAkJYnJlYWs7CiAKIAljYXNlIFNCUFJPRl9aQlNUT1A6CiAJCW11dGV4X2xvY2soJnNicC5sb2NrKTsKLQkJZXJyb3IgPSBzYnByb2ZfemJwcm9mX3N0b3AoKTsKKwkJZXJyID0gc2Jwcm9mX3picHJvZl9zdG9wKCk7CiAJCW11dGV4X3VubG9jaygmc2JwLmxvY2spOwogCQlicmVhazsKIAotCWNhc2UgU0JQUk9GX1pCV0FJVEZVTEw6Ci0JCWVycm9yID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHNicC50Yl9yZWFkLCBUQl9GVUxMKTsKLQkJaWYgKGVycm9yKQorCWNhc2UgU0JQUk9GX1pCV0FJVEZVTEw6IHsKKwkJZXJyID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHNicC50Yl9yZWFkLCBUQl9GVUxMKTsKKwkJaWYgKGVycikKIAkJCWJyZWFrOwogCi0JCWVycm9yID0gcHV0X3VzZXIoVEJfRlVMTCwgKGludCAqKSBhcmcpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCWVycm9yID0gLUVJTlZBTDsKKwkJZXJyID0gcHV0X3VzZXIoVEJfRlVMTCwgKGludCAqKSBhcmcpOwogCQlicmVhazsKIAl9CiAKLQlyZXR1cm4gZXJyb3I7CisJZGVmYXVsdDoKKwkJZXJyID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc2Jwcm9mX3RiX2ZvcHMgPSB7CkBAIC01NDQsOCArNTc0LDggQEAKIAogCXNicC5vcGVuID0gMDsKIAl0Yl9wZXJpb2QgPSB6YmJ1c19taHogKiAxMDAwMExMOwotCXByX2luZm8oREVWTkFNRSAiOiBpbml0aWFsaXplZCAtIHRiX3BlcmlvZCA9ICVsbGRcbiIsIHRiX3BlcmlvZCk7Ci0KKwlwcl9pbmZvKERFVk5BTUUgIjogaW5pdGlhbGl6ZWQgLSB0Yl9wZXJpb2QgPSAlbGxkXG4iLAorCQkobG9uZyBsb25nKSB0Yl9wZXJpb2QpOwogCXJldHVybiAwOwogCiBvdXRfY2xhc3M6CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvc2lieXRlL3NiMTI1MC9NYWtlZmlsZSBiL2FyY2gvbWlwcy9zaWJ5dGUvc2IxMjUwL01ha2VmaWxlCmluZGV4IDA0YzBmMWEuLmRmNjYyYzYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9zaWJ5dGUvc2IxMjUwL01ha2VmaWxlCisrKyBiL2FyY2gvbWlwcy9zaWJ5dGUvc2IxMjUwL01ha2VmaWxlCkBAIC0xLDYgKzEsNSBAQAogb2JqLXkgOj0gc2V0dXAubyBpcnEubyB0aW1lLm8KIAogb2JqLSQoQ09ORklHX1NNUCkJCQkrPSBzbXAubwotb2JqLSQoQ09ORklHX1NJQllURV9UQlBST0YpCQkrPSBiY20xMjUwX3RicHJvZi5vCiBvYmotJChDT05GSUdfU0lCWVRFX1NUQU5EQUxPTkUpCQkrPSBwcm9tLm8KIG9iai0kKENPTkZJR19TSUJZVEVfQlVTX1dBVENIRVIpCSs9IGJ1c193YXRjaGVyLm8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9zbmkvcGNpbXQuYyBiL2FyY2gvbWlwcy9zbmkvcGNpbXQuYwppbmRleCA4ZTg1OTNiLi45ZWUyMDhkIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvc25pL3BjaW10LmMKKysrIGIvYXJjaC9taXBzL3NuaS9wY2ltdC5jCkBAIC05MSw3ICs5MSw3IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIHNuaV9pb19yZXNvdXJjZSA9IHsKLQkuc3RhcnQJPSAweDAwMDAxMDAwVUwsCisJLnN0YXJ0CT0gMHgwMDAwMDAwMFVMLAogCS5lbmQJPSAweDAzYmZmZmZmVUwsCiAJLm5hbWUJPSAiUENJTVQgSU8gTUVNIiwKIAkuZmxhZ3MJPSBJT1JFU09VUkNFX0lPLApAQCAtMTMyLDEwNyArMTMyLDE5IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIHNuaV9tZW1fcmVzb3VyY2UgPSB7Ci0JLnN0YXJ0CT0gMHgxMDAwMDAwMFVMLAotCS5lbmQJPSAweGZmZmZmZmZmVUwsCisJLnN0YXJ0CT0gMHgxODAwMDAwMFVMLAorCS5lbmQJPSAweDFmYmZmZmZmVUwsCiAJLm5hbWUJPSAiUENJTVQgUENJIE1FTSIsCiAJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0KIH07CiAKLS8qCi0gKiBUaGUgUk0yMDAvUk0zMDAgaGFzIGEgZmV3IGhvbGVzIGluIGl0J3MgUENJL0VJU0EgbWVtb3J5IGFkZHJlc3Mgc3BhY2UgdXNlZAotICogZm9yIG90aGVyIHB1cnBvc2VzLiAgQmUgcGFyYW5vaWQgYW5kIGFsbG9jYXRlIGFsbCBvZiB0aGUgYmVmb3JlIHRoZSBQQ0kKLSAqIGNvZGUgZ2V0cyBhIGNoYW5jZSB0byB0byBtYXAgYW55dGhpbmcgZWxzZSB0aGVyZSAuLi4KLSAqCi0gKiBUaGlzIGxlYXZlcyB0aGUgZm9sbG93aW5nIGFyZWFzIGF2YWlsYWJsZToKLSAqCi0gKiAweDEwMDAwMDAwIC0gMHgxMDA5ZmZmZiAoNjQwa0IpIFBDSS9FSVNBL0lTQSBCdXMgTWVtb3J5Ci0gKiAweDEwMTAwMDAwIC0gMHgxM2ZmZmZmZiAoIDE1TUIpIFBDSS9FSVNBL0lTQSBCdXMgTWVtb3J5Ci0gKiAweDE4MDAwMDAwIC0gMHgxZmJmZmZmZiAoMTI0TUIpIFBDSS9FSVNBIEJ1cyBNZW1vcnkKLSAqIDB4MWZmMDgwMDAgLSAweDFmZmVmZmZmICg4MTZrQikgUENJL0VJU0EgQnVzIE1lbW9yeQotICogMHhhMDAwMDAwMCAtIDB4ZmZmZmZmZmYgKDEuNUdCKSBQQ0kvRUlTQSBCdXMgTWVtb3J5Ci0gKi8KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgcGNpbXRfbWVtX3Jlc291cmNlc1tdID0gewotCXsKLQkJLnN0YXJ0CT0gMHgxMDBhMDAwMCwKLQkJLmVuZAk9IDB4MTAwYmZmZmYsCi0JCS5uYW1lCT0gIlZpZGVvIFJBTSBhcmVhIiwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9CVVNZCi0JfSwgewotCQkuc3RhcnQJPSAweDEwMGMwMDAwLAotCQkuZW5kCT0gMHgxMDBmZmZmZiwKLQkJLm5hbWUJPSAiSVNBIFJlc2VydmVkIiwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9CVVNZCi0JfSwgewotCQkuc3RhcnQJPSAweDE0MDAwMDAwLAotCQkuZW5kCT0gMHgxN2JmZmZmZiwKLQkJLm5hbWUJPSAiUENJIElPIiwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9CVVNZCi0JfSwgewotCQkuc3RhcnQJPSAweDE3YzAwMDAwLAotCQkuZW5kCT0gMHgxN2ZmZmZmZiwKLQkJLm5hbWUJPSAiQ2FjaGUgUmVwbGFjZW1lbnQgQXJlYSIsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfQlVTWQotCX0sIHsKLQkJLnN0YXJ0CT0gMHgxYTAwMDAwMCwKLQkJLmVuZAk9IDB4MWEwMDAwMDMsCi0JCS5uYW1lCT0gIlBDSSBJTlQgQWNrbm93bGVkZ2UiLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0JVU1kKLQl9LCB7Ci0JCS5zdGFydAk9IDB4MWZjMDAwMDAsCi0JCS5lbmQJPSAweDFmYzdmZmZmLAotCQkubmFtZQk9ICJCb290IFBST00iLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0JVU1kKLQl9LCB7Ci0JCS5zdGFydAk9IDB4MWZjODAwMDAsCi0JCS5lbmQJPSAweDFmY2ZmZmZmLAotCQkubmFtZQk9ICJEaWFnIFBST00iLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0JVU1kKLQl9LCB7Ci0JCS5zdGFydAk9IDB4MWZkMDAwMDAsCi0JCS5lbmQJPSAweDFmZGZmZmZmLAotCQkubmFtZQk9ICJYLUJ1cyIsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfQlVTWQotCX0sIHsKLQkJLnN0YXJ0CT0gMHgxZmUwMDAwMCwKLQkJLmVuZAk9IDB4MWZlZmZmZmYsCi0JCS5uYW1lCT0gIkJJT1MgbWFwIiwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9CVVNZCi0JfSwgewotCQkuc3RhcnQJPSAweDFmZjAwMDAwLAotCQkuZW5kCT0gMHgxZmY3ZmZmZiwKLQkJLm5hbWUJPSAiTlZSQU0gLyBFRVBST00iLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0JVU1kKLQl9LCB7Ci0JCS5zdGFydAk9IDB4MWZmZjAwMDAsCi0JCS5lbmQJPSAweDFmZmZlZmZmLAotCQkubmFtZQk9ICJBU0lDIFBDSSIsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfQlVTWQotCX0sIHsKLQkJLnN0YXJ0CT0gMHgxZmZmZjAwMCwKLQkJLmVuZAk9IDB4MWZmZmZmZmYsCi0JCS5uYW1lCT0gIk1QIEFnZW50IiwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9CVVNZCi0JfSwgewotCQkuc3RhcnQJPSAweDIwMDAwMDAwLAotCQkuZW5kCT0gMHg5ZmZmZmZmZiwKLQkJLm5hbWUJPSAiTWFpbiBNZW1vcnkiLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0JVU1kKLQl9Ci19OwotCiBzdGF0aWMgdm9pZCBfX2luaXQgc25pX3BjaW10X3Jlc291cmNlX2luaXQodm9pZCkKIHsKIAlpbnQgaTsKIAogCS8qIHJlcXVlc3QgSS9PIHNwYWNlIGZvciBkZXZpY2VzIHVzZWQgb24gYWxsIGlbMzQ1XTg2IFBDcyAqLwogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBjaW10X2lvX3Jlc291cmNlcyk7IGkrKykKLQkJcmVxdWVzdF9yZXNvdXJjZSgmaW9wb3J0X3Jlc291cmNlLCBwY2ltdF9pb19yZXNvdXJjZXMgKyBpKTsKLQotCS8qIHJlcXVlc3QgbWVtIHNwYWNlIGZvciBwY2ltdC1zcGVjaWZpYyBkZXZpY2VzICovCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocGNpbXRfbWVtX3Jlc291cmNlcyk7IGkrKykKLQkJcmVxdWVzdF9yZXNvdXJjZSgmc25pX21lbV9yZXNvdXJjZSwgcGNpbXRfbWVtX3Jlc291cmNlcyArIGkpOwotCi0JaW9wb3J0X3Jlc291cmNlLmVuZCA9IHNuaV9pb19yZXNvdXJjZS5lbmQ7CisJCXJlcXVlc3RfcmVzb3VyY2UoJnNuaV9pb19yZXNvdXJjZSwgcGNpbXRfaW9fcmVzb3VyY2VzICsgaSk7CiB9CiAKIGV4dGVybiBzdHJ1Y3QgcGNpX29wcyBzbmlfcGNpbXRfb3BzOwpAQCAtMjQwLDkgKzE1MiwxMCBAQAogc3RhdGljIHN0cnVjdCBwY2lfY29udHJvbGxlciBzbmlfY29udHJvbGxlciA9IHsKIAkucGNpX29wcwk9ICZzbmlfcGNpbXRfb3BzLAogCS5tZW1fcmVzb3VyY2UJPSAmc25pX21lbV9yZXNvdXJjZSwKLQkubWVtX29mZnNldAk9IDB4MTAwMDAwMDBVTCwKKwkubWVtX29mZnNldAk9IDB4MDAwMDAwMDBVTCwKIAkuaW9fcmVzb3VyY2UJPSAmc25pX2lvX3Jlc291cmNlLAotCS5pb19vZmZzZXQJPSAweDAwMDAwMDAwVUwKKwkuaW9fb2Zmc2V0CT0gMHgwMDAwMDAwMFVMLAorCS5pb19tYXBfYmFzZSAgICA9IFNOSV9QT1JUX0JBU0UKIH07CiAKIHN0YXRpYyB2b2lkIGVuYWJsZV9wY2ltdF9pcnEodW5zaWduZWQgaW50IGlycSkKQEAgLTM2MywxNSArMjc2LDE3IEBACiAKIHZvaWQgc25pX3BjaW10X2luaXQodm9pZCkKIHsKLQlzbmlfcGNpbXRfcmVzb3VyY2VfaW5pdCgpOwogCXNuaV9wY2ltdF9kZXRlY3QoKTsKIAlzbmlfcGNpbXRfc2NfaW5pdCgpOwogCXJ0Y19taXBzX2dldF90aW1lID0gbWMxNDY4MThfZ2V0X2Ntb3NfdGltZTsKIAlydGNfbWlwc19zZXRfdGltZSA9IG1jMTQ2ODE4X3NldF9ydGNfbW1zczsKIAlib2FyZF90aW1lX2luaXQgPSBzbmlfY3B1X3RpbWVfaW5pdDsKKwlpb3BvcnRfcmVzb3VyY2UuZW5kID0gc25pX2lvX3Jlc291cmNlLmVuZDsKICNpZmRlZiBDT05GSUdfUENJCisJUENJQklPU19NSU5fSU8gPSAweDkwMDA7CiAJcmVnaXN0ZXJfcGNpX2NvbnRyb2xsZXIoJnNuaV9jb250cm9sbGVyKTsKICNlbmRpZgorCXNuaV9wY2ltdF9yZXNvdXJjZV9pbml0KCk7CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IHNuaXJtX3BjaW10X3NldHVwX2RldmluaXQodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9zbmkvcGNpdC5jIGIvYXJjaC9taXBzL3NuaS9wY2l0LmMKaW5kZXggMWRmYzNmMC4uMDBkMTUxZiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3NuaS9wY2l0LmMKKysrIGIvYXJjaC9taXBzL3NuaS9wY2l0LmMKQEAgLTQzLDcgKzQzLDcgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdF9zZXJpYWw4MjUwX3BvcnQgcGNpdF9jcGx1c19kYXRhW10gPSB7Ci0JUE9SVCgweDNmOCwgNCksCisJUE9SVCgweDNmOCwgMCksCiAJUE9SVCgweDJmOCwgMyksCiAJUE9SVCgweDNlOCwgNCksCiAJUE9SVCgweDJlOCwgMyksCkBAIC01OSw5ICs1OSw5IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIHNuaV9pb19yZXNvdXJjZSA9IHsKLQkuc3RhcnQJPSAweDAwMDAxMDAwVUwsCisJLnN0YXJ0CT0gMHgwMDAwMDAwMFVMLAogCS5lbmQJPSAweDAzYmZmZmZmVUwsCi0JLm5hbWUJPSAiUENJVCBJTyBNRU0iLAorCS5uYW1lCT0gIlBDSVQgSU8iLAogCS5mbGFncwk9IElPUkVTT1VSQ0VfSU8sCiB9OwogCkBAIC05Miw2ICs5MiwxMSBAQAogCQkubmFtZQk9ICJkbWEyIiwKIAkJLmZsYWdzCT0gSU9SRVNPVVJDRV9CVVNZCiAJfSwgeworCQkuc3RhcnQJPSAgMHhjZjgsCisJCS5lbmQJPSAweGNmYiwKKwkJLm5hbWUJPSAiUENJIGNvbmZpZyBhZGRyIiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9CVVNZCisJfSwgewogCQkuc3RhcnQJPSAgMHhjZmMsCiAJCS5lbmQJPSAweGNmZiwKIAkJLm5hbWUJPSAiUENJIGNvbmZpZyBkYXRhIiwKQEAgLTEwMCwxMDcgKzEwNSwxOSBAQAogfTsKIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzbmlfbWVtX3Jlc291cmNlID0gewotCS5zdGFydAk9IDB4MTAwMDAwMDBVTCwKLQkuZW5kCT0gMHhmZmZmZmZmZlVMLAorCS5zdGFydAk9IDB4MTgwMDAwMDBVTCwKKwkuZW5kCT0gMHgxZmJmZmZmZlVMLAogCS5uYW1lCT0gIlBDSVQgUENJIE1FTSIsCiAJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0KIH07CiAKLS8qCi0gKiBUaGUgUk0yMDAvUk0zMDAgaGFzIGEgZmV3IGhvbGVzIGluIGl0J3MgUENJL0VJU0EgbWVtb3J5IGFkZHJlc3Mgc3BhY2UgdXNlZAotICogZm9yIG90aGVyIHB1cnBvc2VzLiAgQmUgcGFyYW5vaWQgYW5kIGFsbG9jYXRlIGFsbCBvZiB0aGUgYmVmb3JlIHRoZSBQQ0kKLSAqIGNvZGUgZ2V0cyBhIGNoYW5jZSB0byB0byBtYXAgYW55dGhpbmcgZWxzZSB0aGVyZSAuLi4KLSAqCi0gKiBUaGlzIGxlYXZlcyB0aGUgZm9sbG93aW5nIGFyZWFzIGF2YWlsYWJsZToKLSAqCi0gKiAweDEwMDAwMDAwIC0gMHgxMDA5ZmZmZiAoNjQwa0IpIFBDSS9FSVNBL0lTQSBCdXMgTWVtb3J5Ci0gKiAweDEwMTAwMDAwIC0gMHgxM2ZmZmZmZiAoIDE1TUIpIFBDSS9FSVNBL0lTQSBCdXMgTWVtb3J5Ci0gKiAweDE4MDAwMDAwIC0gMHgxZmJmZmZmZiAoMTI0TUIpIFBDSS9FSVNBIEJ1cyBNZW1vcnkKLSAqIDB4MWZmMDgwMDAgLSAweDFmZmVmZmZmICg4MTZrQikgUENJL0VJU0EgQnVzIE1lbW9yeQotICogMHhhMDAwMDAwMCAtIDB4ZmZmZmZmZmYgKDEuNUdCKSBQQ0kvRUlTQSBCdXMgTWVtb3J5Ci0gKi8KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgcGNpdF9tZW1fcmVzb3VyY2VzW10gPSB7Ci0JewotCQkuc3RhcnQJPSAweDE0MDAwMDAwLAotCQkuZW5kCT0gMHgxN2JmZmZmZiwKLQkJLm5hbWUJPSAiUENJIElPIiwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9CVVNZCi0JfSwgewotCQkuc3RhcnQJPSAweDE3YzAwMDAwLAotCQkuZW5kCT0gMHgxN2ZmZmZmZiwKLQkJLm5hbWUJPSAiQ2FjaGUgUmVwbGFjZW1lbnQgQXJlYSIsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfQlVTWQotCX0sIHsKLQkJLnN0YXJ0CT0gMHgxODBhMDAwMCwKLQkJLmVuZAk9IDB4MTgwYmZmZmYsCi0JCS5uYW1lCT0gIlZpZGVvIFJBTSBhcmVhIiwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9CVVNZCi0JfSwgewotCQkuc3RhcnQJPSAweDE4MGMwMDAwLAotCQkuZW5kCT0gMHgxODBmZmZmZiwKLQkJLm5hbWUJPSAiSVNBIFJlc2VydmVkIiwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9CVVNZCi0JfSwgewotCQkuc3RhcnQJPSAweDE5MDAwMDAwLAotCQkuZW5kCT0gMHgxZmJmZmZmZiwKLQkJLm5hbWUJPSAiUENJIE1FTSIsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfQlVTWQotCX0sIHsKLQkJLnN0YXJ0CT0gMHgxZmMwMDAwMCwKLQkJLmVuZAk9IDB4MWZjN2ZmZmYsCi0JCS5uYW1lCT0gIkJvb3QgUFJPTSIsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfQlVTWQotCX0sIHsKLQkJLnN0YXJ0CT0gMHgxZmM4MDAwMCwKLQkJLmVuZAk9IDB4MWZjZmZmZmYsCi0JCS5uYW1lCT0gIkRpYWcgUFJPTSIsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfQlVTWQotCX0sIHsKLQkJLnN0YXJ0CT0gMHgxZmQwMDAwMCwKLQkJLmVuZAk9IDB4MWZkZmZmZmYsCi0JCS5uYW1lCT0gIlgtQnVzIiwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9CVVNZCi0JfSwgewotCQkuc3RhcnQJPSAweDFmZTAwMDAwLAotCQkuZW5kCT0gMHgxZmVmZmZmZiwKLQkJLm5hbWUJPSAiQklPUyBtYXAiLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0JVU1kKLQl9LCB7Ci0JCS5zdGFydAk9IDB4MWZmMDAwMDAsCi0JCS5lbmQJPSAweDFmZjdmZmZmLAotCQkubmFtZQk9ICJOVlJBTSAvIEVFUFJPTSIsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfQlVTWQotCX0sIHsKLQkJLnN0YXJ0CT0gMHgxZmZmMDAwMCwKLQkJLmVuZAk9IDB4MWZmZmVmZmYsCi0JCS5uYW1lCT0gIk1BVUkgQVNJQyIsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfQlVTWQotCX0sIHsKLQkJLnN0YXJ0CT0gMHgxZmZmZjAwMCwKLQkJLmVuZAk9IDB4MWZmZmZmZmYsCi0JCS5uYW1lCT0gIk1QIEFnZW50IiwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9CVVNZCi0JfSwgewotCQkuc3RhcnQJPSAweDIwMDAwMDAwLAotCQkuZW5kCT0gMHg5ZmZmZmZmZiwKLQkJLm5hbWUJPSAiTWFpbiBNZW1vcnkiLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0JVU1kKLQl9Ci19OwotCiBzdGF0aWMgdm9pZCBfX2luaXQgc25pX3BjaXRfcmVzb3VyY2VfaW5pdCh2b2lkKQogewogCWludCBpOwogCiAJLyogcmVxdWVzdCBJL08gc3BhY2UgZm9yIGRldmljZXMgdXNlZCBvbiBhbGwgaVszNDVdODYgUENzICovCiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocGNpdF9pb19yZXNvdXJjZXMpOyBpKyspCi0JCXJlcXVlc3RfcmVzb3VyY2UoJmlvcG9ydF9yZXNvdXJjZSwgcGNpdF9pb19yZXNvdXJjZXMgKyBpKTsKLQotCS8qIHJlcXVlc3QgbWVtIHNwYWNlIGZvciBwY2ltdC1zcGVjaWZpYyBkZXZpY2VzICovCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocGNpdF9tZW1fcmVzb3VyY2VzKTsgaSsrKQotCQlyZXF1ZXN0X3Jlc291cmNlKCZzbmlfbWVtX3Jlc291cmNlLCBwY2l0X21lbV9yZXNvdXJjZXMgKyBpKTsKLQotCWlvcG9ydF9yZXNvdXJjZS5lbmQgPSBzbmlfaW9fcmVzb3VyY2UuZW5kOworCQlyZXF1ZXN0X3Jlc291cmNlKCZzbmlfaW9fcmVzb3VyY2UsIHBjaXRfaW9fcmVzb3VyY2VzICsgaSk7CiB9CiAKIApAQCAtMjA5LDkgKzEyNiwxMCBAQAogc3RhdGljIHN0cnVjdCBwY2lfY29udHJvbGxlciBzbmlfcGNpdF9jb250cm9sbGVyID0gewogCS5wY2lfb3BzCT0gJnNuaV9wY2l0X29wcywKIAkubWVtX3Jlc291cmNlCT0gJnNuaV9tZW1fcmVzb3VyY2UsCi0JLm1lbV9vZmZzZXQJPSAweDEwMDAwMDAwVUwsCisJLm1lbV9vZmZzZXQJPSAweDAwMDAwMDAwVUwsCiAJLmlvX3Jlc291cmNlCT0gJnNuaV9pb19yZXNvdXJjZSwKLQkuaW9fb2Zmc2V0CT0gMHgwMDAwMDAwMFVMCisJLmlvX29mZnNldAk9IDB4MDAwMDAwMDBVTCwKKwkuaW9fbWFwX2Jhc2UgICAgPSBTTklfUE9SVF9CQVNFCiB9OwogCiBzdGF0aWMgdm9pZCBlbmFibGVfcGNpdF9pcnEodW5zaWduZWQgaW50IGlycSkKQEAgLTI2Miw3ICsxODAsNyBAQAogCWludCBpcnE7CiAKIAljbGVhcl9jMF9zdGF0dXMoSUVfSVJRMCk7Ci0JaXJxID0gZmZzKChwZW5kaW5nID4+IDE2KSAmIDB4N2YpOworCWlycSA9IGZmcygocGVuZGluZyA+PiAxNikgJiAweDNmKTsKIAogCWlmIChsaWtlbHkoaXJxID4gMCkpCiAJCWRvX0lSUSAoaXJxICsgU05JX1BDSVRfSU5UX1NUQVJUIC0gMSk7CkBAIC0yODksNiArMjA3LDggQEAKIAogCWlmIChwZW5kaW5nICYgQ19JUlEwKQogCQlwY2l0X2h3aW50MCgpOworCWVsc2UgaWYgKHBlbmRpbmcgJiBDX0lSUTEpCisJCWRvX0lSUSAoTUlQU19DUFVfSVJRX0JBU0UgKyAzKTsKIAllbHNlIGlmIChwZW5kaW5nICYgQ19JUlEyKQogCQlkb19JUlEgKE1JUFNfQ1BVX0lSUV9CQVNFICsgNCk7CiAJZWxzZSBpZiAocGVuZGluZyAmIENfSVJRMykKQEAgLTMxNywyMSArMjM3LDIzIEBACiAJbWlwc19jcHVfaXJxX2luaXQoKTsKIAlmb3IgKGkgPSBTTklfUENJVF9JTlRfU1RBUlQ7IGkgPD0gU05JX1BDSVRfSU5UX0VORDsgaSsrKQogCQlzZXRfaXJxX2NoaXAoaSwgJnBjaXRfaXJxX3R5cGUpOwotCSoodm9sYXRpbGUgdTMyICopU05JX1BDSVRfSU5UX1JFRyA9IDA7CisJKih2b2xhdGlsZSB1MzIgKilTTklfUENJVF9JTlRfUkVHID0gMHg0MDAwMDAwMDsKIAlzbmlfaHdpbnQgPSBzbmlfcGNpdF9od2ludF9jcGx1czsKIAljaGFuZ2VfYzBfc3RhdHVzKFNUMF9JTSwgSUVfSVJRMCk7Ci0Jc2V0dXBfaXJxIChTTklfUENJVF9JTlRfU1RBUlQgKyA2LCAmc25pX2lzYV9pcnEpOworCXNldHVwX2lycSAoTUlQU19DUFVfSVJRX0JBU0UgKyAzLCAmc25pX2lzYV9pcnEpOwogfQogCiB2b2lkIHNuaV9wY2l0X2luaXQodm9pZCkKIHsKLQlzbmlfcGNpdF9yZXNvdXJjZV9pbml0KCk7CiAJcnRjX21pcHNfZ2V0X3RpbWUgPSBtYzE0NjgxOF9nZXRfY21vc190aW1lOwogCXJ0Y19taXBzX3NldF90aW1lID0gbWMxNDY4MThfc2V0X3J0Y19tbXNzOwogCWJvYXJkX3RpbWVfaW5pdCA9IHNuaV9jcHVfdGltZV9pbml0OworCWlvcG9ydF9yZXNvdXJjZS5lbmQgPSBzbmlfaW9fcmVzb3VyY2UuZW5kOwogI2lmZGVmIENPTkZJR19QQ0kKKwlQQ0lCSU9TX01JTl9JTyA9IDB4OTAwMDsKIAlyZWdpc3Rlcl9wY2lfY29udHJvbGxlcigmc25pX3BjaXRfY29udHJvbGxlcik7CiAjZW5kaWYKKwlzbmlfcGNpdF9yZXNvdXJjZV9pbml0KCk7CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IHNuaXJtX3BjaXRfc2V0dXBfZGV2aW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3ZyNDF4eC9LY29uZmlnIGIvYXJjaC9taXBzL3ZyNDF4eC9LY29uZmlnCmluZGV4IDkyZjQxZjYuLjhmNGQzZTcgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy92cjQxeHgvS2NvbmZpZworKysgYi9hcmNoL21pcHMvdnI0MXh4L0tjb25maWcKQEAgLTEsNiArMSwxMCBAQAotY29uZmlnIENBU0lPX0U1NQotCWJvb2wgIlN1cHBvcnQgZm9yIENBU0lPIENBU1NJT1BFSUEgRS0xMC8xNS81NS82NSIKK2Nob2ljZQorCXByb21wdCAiTWFjaGluZSB0eXBlIgogCWRlcGVuZHMgb24gTUFDSF9WUjQxWFgKKwlkZWZhdWx0IFRBTkJBQ19UQjAyMlgKKworY29uZmlnIENBU0lPX0U1NQorCWJvb2wgIkNBU0lPIENBU1NJT1BFSUEgRS0xMC8xNS81NS82NSIKIAlzZWxlY3QgRE1BX05PTkNPSEVSRU5UCiAJc2VsZWN0IElSUV9DUFUKIAlzZWxlY3QgSVNBCkBAIC04LDggKzEyLDcgQEAKIAlzZWxlY3QgU1lTX1NVUFBPUlRTX0xJVFRMRV9FTkRJQU4KIAogY29uZmlnIElCTV9XT1JLUEFECi0JYm9vbCAiU3VwcG9ydCBmb3IgSUJNIFdvcmtQYWQgejUwIgotCWRlcGVuZHMgb24gTUFDSF9WUjQxWFgKKwlib29sICJJQk0gV29ya1BhZCB6NTAiCiAJc2VsZWN0IERNQV9OT05DT0hFUkVOVAogCXNlbGVjdCBJUlFfQ1BVCiAJc2VsZWN0IElTQQpAQCAtMTcsMjYgKzIwLDE4IEBACiAJc2VsZWN0IFNZU19TVVBQT1JUU19MSVRUTEVfRU5ESUFOCiAKIGNvbmZpZyBORUNfQ01CVlI0MTMzCi0JYm9vbCAiU3VwcG9ydCBmb3IgTkVDIENNQi1WUjQxMzMiCi0JZGVwZW5kcyBvbiBNQUNIX1ZSNDFYWAorCWJvb2wgIk5FQyBDTUItVlI0MTMzIgogCXNlbGVjdCBETUFfTk9OQ09IRVJFTlQKIAlzZWxlY3QgSVJRX0NQVQogCXNlbGVjdCBIV19IQVNfUENJCiAJc2VsZWN0IFNZU19TVVBQT1JUU18zMkJJVF9LRVJORUwKIAlzZWxlY3QgU1lTX1NVUFBPUlRTX0xJVFRMRV9FTkRJQU4KIAotY29uZmlnIFJPQ0tIT1BQRVIKLQlib29sICJTdXBwb3J0IGZvciBSb2NraG9wcGVyIGJhc2Vib2FyZCIKLQlkZXBlbmRzIG9uIE5FQ19DTUJWUjQxMzMKLQlzZWxlY3QgSTgyNTkKLQlzZWxlY3QgSEFWRV9TVERfUENfU0VSSUFMX1BPUlQKLQogY29uZmlnIFRBTkJBQ19UQjAyMlgKLQlib29sICJTdXBwb3J0IGZvciBUQU5CQUMgVlI0MTMxIG11bHRpY2hpcCBtb2R1bGUgYW5kIFRBTkJBQyBWUjQxMzFESU1NIgotCWRlcGVuZHMgb24gTUFDSF9WUjQxWFgKKwlib29sICJUQU5CQUMgVlI0MTMxIG11bHRpY2hpcCBtb2R1bGUgYW5kIFRBTkJBQyBWUjQxMzFESU1NIgogCXNlbGVjdCBETUFfTk9OQ09IRVJFTlQKLQlzZWxlY3QgSFdfSEFTX1BDSQogCXNlbGVjdCBJUlFfQ1BVCisJc2VsZWN0IEhXX0hBU19QQ0kKIAlzZWxlY3QgU1lTX1NVUFBPUlRTXzMyQklUX0tFUk5FTAogCXNlbGVjdCBTWVNfU1VQUE9SVFNfTElUVExFX0VORElBTgogCWhlbHAKQEAgLTQ2LDQwICs0MSw2NSBAQAogCSAgUGxlYXNlIHJlZmVyIHRvIDxodHRwOi8vd3d3LnRhbmJhYy5jby5qcC8+CiAJICBhYm91dCBWUjQxMzEgbXVsdGljaGlwIG1vZHVsZSBhbmQgVlI0MTMxRElNTS4KIAotY29uZmlnIFRBTkJBQ19UQjAyMjYKLQlib29sICJTdXBwb3J0IGZvciBUQU5CQUMgTWJhc2UoVEIwMjI2KSIKK2NvbmZpZyBWSUNUT1JfTVBDMzBYCisJYm9vbCAiVmljdG9yIE1QLUMzMDMvMzA0IgorCXNlbGVjdCBETUFfTk9OQ09IRVJFTlQKKwlzZWxlY3QgSVJRX0NQVQorCXNlbGVjdCBIV19IQVNfUENJCisJc2VsZWN0IFBDSV9WUjQxWFgKKwlzZWxlY3QgU1lTX1NVUFBPUlRTXzMyQklUX0tFUk5FTAorCXNlbGVjdCBTWVNfU1VQUE9SVFNfTElUVExFX0VORElBTgorCitjb25maWcgWkFPX0NBUENFTExBCisJYm9vbCAiWkFPIE5ldHdvcmtzIENhcGNlbGxhIgorCXNlbGVjdCBETUFfTk9OQ09IRVJFTlQKKwlzZWxlY3QgSVJRX0NQVQorCXNlbGVjdCBIV19IQVNfUENJCisJc2VsZWN0IFBDSV9WUjQxWFgKKwlzZWxlY3QgU1lTX1NVUFBPUlRTXzMyQklUX0tFUk5FTAorCXNlbGVjdCBTWVNfU1VQUE9SVFNfTElUVExFX0VORElBTgorCitlbmRjaG9pY2UKKworY29uZmlnIFJPQ0tIT1BQRVIKKwlib29sICJTdXBwb3J0IGZvciBSb2NraG9wcGVyIGJhc2UgYm9hcmQiCisJZGVwZW5kcyBvbiBORUNfQ01CVlI0MTMzCisJc2VsZWN0IFBDSV9WUjQxWFgKKwlzZWxlY3QgSTgyNTkKKwlzZWxlY3QgSEFWRV9TVERfUENfU0VSSUFMX1BPUlQKKworY2hvaWNlCisJcHJvbXB0ICJCYXNlIGJvYXJkIHR5cGUiCiAJZGVwZW5kcyBvbiBUQU5CQUNfVEIwMjJYCisJZGVmYXVsdCBUQU5CQUNfVEIwMjg3CisKK2NvbmZpZyBUQU5CQUNfVEIwMjE5CisJYm9vbCAiVEFOQkFDIERJTU0gRXZhbHVhdGlvbiBLaXQoVEIwMjE5KSIKIAlzZWxlY3QgR1BJT19WUjQxWFgKKwlzZWxlY3QgUENJX1ZSNDFYWAorCWhlbHAKKwkgIFRoZSBUQU5CQUMgRElNTSBFdmFsdWF0aW9uIEtpdChUQjAyMTkpIGlzIGEgTUlQUy1iYXNlZCBwbGF0Zm9ybQorCSAgbWFudWZhY3R1cmVkIGJ5IFRBTkJBQy4KKwkgIFBsZWFzZSByZWZlciB0byA8aHR0cDovL3d3dy50YW5iYWMuY28uanAvPiBhYm91dCBESU1NIEV2YWx1YXRpb24gS2l0LgorCitjb25maWcgVEFOQkFDX1RCMDIyNgorCWJvb2wgIlRBTkJBQyBNYmFzZShUQjAyMjYpIgorCXNlbGVjdCBHUElPX1ZSNDFYWAorCXNlbGVjdCBQQ0lfVlI0MVhYCiAJaGVscAogCSAgVGhlIFRBTkJBQyBNYmFzZShUQjAyMjYpIGlzIGEgTUlQUy1iYXNlZCBwbGF0Zm9ybQogCSAgbWFudWZhY3R1cmVkIGJ5IFRBTkJBQy4KIAkgIFBsZWFzZSByZWZlciB0byA8aHR0cDovL3d3dy50YW5iYWMuY28uanAvPiBhYm91dCBNYmFzZS4KIAogY29uZmlnIFRBTkJBQ19UQjAyODcKLQlib29sICJTdXBwb3J0IGZvciBUQU5CQUMgTWluaS1JVFggRElNTSBiYXNlKFRCMDI4NykiCi0JZGVwZW5kcyBvbiBUQU5CQUNfVEIwMjJYCisJYm9vbCAiVEFOQkFDIE1pbmktSVRYIERJTU0gYmFzZShUQjAyODcpIgorCXNlbGVjdCBQQ0lfVlI0MVhYCiAJaGVscAogCSAgVGhlIFRBTkJBQyBNaW5pLUlUWCBESU1NIGJhc2UoVEIwMjg3KSBpcyBhIE1JUFMtYmFzZWQgcGxhdGZvcm0KIAkgIG1hbnVmYWN0dXJlZCBieSBUQU5CQUMuCiAJICBQbGVhc2UgcmVmZXIgdG8gPGh0dHA6Ly93d3cudGFuYmFjLmNvLmpwLz4gYWJvdXQgTWluaS1JVFggRElNTSBiYXNlLgogCi1jb25maWcgVklDVE9SX01QQzMwWAotCWJvb2wgIlN1cHBvcnQgZm9yIFZpY3RvciBNUC1DMzAzLzMwNCIKLQlkZXBlbmRzIG9uIE1BQ0hfVlI0MVhYCi0Jc2VsZWN0IERNQV9OT05DT0hFUkVOVAotCXNlbGVjdCBIV19IQVNfUENJCi0Jc2VsZWN0IElSUV9DUFUKLQlzZWxlY3QgU1lTX1NVUFBPUlRTXzMyQklUX0tFUk5FTAotCXNlbGVjdCBTWVNfU1VQUE9SVFNfTElUVExFX0VORElBTgotCi1jb25maWcgWkFPX0NBUENFTExBCi0JYm9vbCAiU3VwcG9ydCBmb3IgWkFPIE5ldHdvcmtzIENhcGNlbGxhIgotCWRlcGVuZHMgb24gTUFDSF9WUjQxWFgKLQlzZWxlY3QgRE1BX05PTkNPSEVSRU5UCi0Jc2VsZWN0IEhXX0hBU19QQ0kKLQlzZWxlY3QgSVJRX0NQVQotCXNlbGVjdCBTWVNfU1VQUE9SVFNfMzJCSVRfS0VSTkVMCi0Jc2VsZWN0IFNZU19TVVBQT1JUU19MSVRUTEVfRU5ESUFOCitlbmRjaG9pY2UKIAogY29uZmlnIFBDSV9WUjQxWFgKIAlib29sICJBZGQgUENJIGNvbnRyb2wgdW5pdCBzdXBwb3J0IG9mIE5FQyBWUjQxMDAgc2VyaWVzIgpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2MvY29uZmlncy9jMzAwMF9kZWZjb25maWcgYi9hcmNoL3BhcmlzYy9jb25maWdzL2MzMDAwX2RlZmNvbmZpZwppbmRleCA3ODI5MDZiLi5lYjJmOWEzIDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9jb25maWdzL2MzMDAwX2RlZmNvbmZpZworKysgYi9hcmNoL3BhcmlzYy9jb25maWdzL2MzMDAwX2RlZmNvbmZpZwpAQCAtNDM1LDcgKzQzNSw2IEBACiAjIENPTkZJR19TQ1NJX1NBVEFfVUxJIGlzIG5vdCBzZXQKIENPTkZJR19TQ1NJX1NBVEFfVklBPW0KICMgQ09ORklHX1NDU0lfU0FUQV9WSVRFU1NFIGlzIG5vdCBzZXQKLUNPTkZJR19TQ1NJX1NBVEFfSU5URUxfQ09NQklORUQ9eQogIyBDT05GSUdfU0NTSV9ETVgzMTkxRCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0ZVVFVSRV9ET01BSU4gaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9JUFMgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL0tjb25maWcgYi9hcmNoL3Bvd2VycGMvS2NvbmZpZwppbmRleCA2ZGZiZDUyLi5hNTRhOWEyZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL0tjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL0tjb25maWcKQEAgLTExLDYgKzExLDExIEBACiAJICBUaGlzIG9wdGlvbiBzZWxlY3RzIHdoZXRoZXIgYSAzMi1iaXQgb3IgYSA2NC1iaXQga2VybmVsCiAJICB3aWxsIGJlIGJ1aWx0LgogCitjb25maWcgUFBDX1BNX05FRURTX1JUQ19MSUIKKwlib29sCisJc2VsZWN0IFJUQ19MSUIKKwlkZWZhdWx0IHkgaWYgUE0KKwogY29uZmlnIFBQQzMyCiAJYm9vbAogCWRlZmF1bHQgeSBpZiAhUFBDNjQKQEAgLTg5LDcgKzk0LDcgQEAKIAogY29uZmlnIEFSQ0hfTUFZX0hBVkVfUENfRkRDCiAJYm9vbAotCWRlZmF1bHQgeQorCWRlZmF1bHQgIVBQQ19QU0VSSUVTIHx8IFBDSQogCiBjb25maWcgUFBDX09GCiAJZGVmX2Jvb2wgeQpAQCAtMTU3LDE3ICsxNjIsMjAgQEAKIAlzZWxlY3QgRlNMX1NPQwogCXNlbGVjdCA4M3h4CiAJc2VsZWN0IFBQQ19GUFUKKwlzZWxlY3QgV0FOVF9ERVZJQ0VfVFJFRQogCiBjb25maWcgUFBDXzg1eHgKIAlib29sICJGcmVlc2NhbGUgODV4eCIKIAlzZWxlY3QgRTUwMAogCXNlbGVjdCBGU0xfU09DCiAJc2VsZWN0IDg1eHgKKwlzZWxlY3QgV0FOVF9ERVZJQ0VfVFJFRQogCiBjb25maWcgUFBDXzg2eHgKIAlib29sICJGcmVlc2NhbGUgODZ4eCIKIAlzZWxlY3QgNnh4CiAJc2VsZWN0IEZTTF9TT0MKKwlzZWxlY3QgRlNMX1BDSUUKIAlzZWxlY3QgUFBDX0ZQVQogCXNlbGVjdCBBTFRJVkVDCiAJaGVscApAQCAtMTg2LDcgKzE5NCw2IEBACiAJYm9vbCAiQU1DQyA0NHgiCiAJc2VsZWN0IFBQQ19EQ1JfTkFUSVZFCiAKLQogY29uZmlnIEUyMDAKIAlib29sICJGcmVlc2NhbGUgZTIwMCIKIApAQCAtMzY3LDM5NCArMzc0LDcgQEAKIAogc291cmNlICJpbml0L0tjb25maWciCiAKLW1lbnUgIlBsYXRmb3JtIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBQUEM2NCB8fCBDTEFTU0lDMzIKLQotY2hvaWNlCi0JcHJvbXB0ICJNYWNoaW5lIHR5cGUiCi0JZGVmYXVsdCBQUENfTVVMVElQTEFURk9STQotCi1jb25maWcgUFBDX01VTFRJUExBVEZPUk0KLQlib29sICJHZW5lcmljIGRlc2t0b3Avc2VydmVyL2xhcHRvcCIKLQloZWxwCi0JICBTZWxlY3QgdGhpcyBvcHRpb24gaWYgY29uZmlndXJpbmcgZm9yIGFuIElCTSBwU2VyaWVzIG9yCi0JICBSUy82MDAwIG1hY2hpbmUsIGFuIEFwcGxlIG1hY2hpbmUsIG9yIGEgUFJlUCwgQ0hSUCwKLQkgIE1hcGxlIG9yIENlbGwtYmFzZWQgbWFjaGluZS4KLQotY29uZmlnIEVNQkVEREVENnh4Ci0JYm9vbCAiRW1iZWRkZWQgNnh4Lzd4eC83eHh4LWJhc2VkIGJvYXJkIgotCWRlcGVuZHMgb24gUFBDMzIgJiYgKEJST0tFTnx8QlJPS0VOX09OX1NNUCkKLQotY29uZmlnIEFQVVMKLQlib29sICJBbWlnYS1BUFVTIgotCWRlcGVuZHMgb24gUFBDMzIgJiYgQlJPS0VOCi0JaGVscAotCSAgU2VsZWN0IEFQVVMgaWYgY29uZmlndXJpbmcgZm9yIGEgUG93ZXJVUCBBbWlnYS4KLQkgIE1vcmUgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlIGF0OgotCSAgPGh0dHA6Ly9saW51eC1hcHVzLnNvdXJjZWZvcmdlLm5ldC8+LgotZW5kY2hvaWNlCi0KLWNvbmZpZyBRVUlDQ19FTkdJTkUKLQlib29sCi0JZGVwZW5kcyBvbiBQUENfTVBDODM2eCB8fCBQUENfTVBDODMyeAotCWRlZmF1bHQgeQotCWhlbHAKLQkgIFRoZSBRVUlDQyBFbmdpbmUgKFFFKSBpcyBhIG5ldyBnZW5lcmF0aW9uIG9mIGNvbW11bmljYXRpb25zCi0JICBjb3Byb2Nlc3NvcnMgb24gRnJlZXNjYWxlIGVtYmVkZGVkIENQVXMgKGFraW4gdG8gQ1BNIGluIG9sZGVyIGNoaXBzKS4KLQkgIFNlbGVjdGluZyB0aGlzIG9wdGlvbiBtZWFucyB0aGF0IHlvdSB3aXNoIHRvIGJ1aWxkIGEga2VybmVsCi0JICBmb3IgYSBtYWNoaW5lIHdpdGggYSBRRSBjb3Byb2Nlc3Nvci4KLQotY29uZmlnIFBQQ19QU0VSSUVTCi0JZGVwZW5kcyBvbiBQUENfTVVMVElQTEFURk9STSAmJiBQUEM2NAotCWJvb2wgIklCTSBwU2VyaWVzICYgbmV3IChQT1dFUjUtYmFzZWQpIGlTZXJpZXMiCi0Jc2VsZWN0IE1QSUMKLQlzZWxlY3QgUFBDX0k4MjU5Ci0Jc2VsZWN0IFBQQ19SVEFTCi0Jc2VsZWN0IFJUQVNfRVJST1JfTE9HR0lORwotCXNlbGVjdCBQUENfVURCR18xNjU1MAotCXNlbGVjdCBQUENfTkFUSVZFCi0JZGVmYXVsdCB5Ci0KLWNvbmZpZyBQUENfSVNFUklFUwotCWJvb2wgIklCTSBMZWdhY3kgaVNlcmllcyIKLQlkZXBlbmRzIG9uIFBQQ19NVUxUSVBMQVRGT1JNICYmIFBQQzY0Ci0Jc2VsZWN0IFBQQ19JTkRJUkVDVF9JTwotCi1jb25maWcgUFBDX0NIUlAKLQlib29sICJDb21tb24gSGFyZHdhcmUgUmVmZXJlbmNlIFBsYXRmb3JtIChDSFJQKSBiYXNlZCBtYWNoaW5lcyIKLQlkZXBlbmRzIG9uIFBQQ19NVUxUSVBMQVRGT1JNICYmIFBQQzMyCi0Jc2VsZWN0IE1QSUMKLQlzZWxlY3QgUFBDX0k4MjU5Ci0Jc2VsZWN0IFBQQ19JTkRJUkVDVF9QQ0kKLQlzZWxlY3QgUFBDX1JUQVMKLQlzZWxlY3QgUFBDX01QQzEwNgotCXNlbGVjdCBQUENfVURCR18xNjU1MAotCXNlbGVjdCBQUENfTkFUSVZFCi0JZGVmYXVsdCB5Ci0KLWNvbmZpZyBQUENfTVBDNTJ4eAotCWJvb2wKLQlkZWZhdWx0IG4KLQotY29uZmlnIFBQQ19NUEM1MjAwCi0JYm9vbAotCXNlbGVjdCBQUENfTVBDNTJ4eAotCWRlZmF1bHQgbgotCi1jb25maWcgUFBDX01QQzUyMDBfQlVHRklYCi0JYm9vbCAiTVBDNTIwMCAoTDI1UikgYnVnZml4IHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBQUENfTVBDNTIwMAotCWRlZmF1bHQgbgotCWhlbHAKLQkgIEVuYWJsZSB3b3JrYXJvdW5kcyBmb3Igb3JpZ2luYWwgTVBDNTIwMCBlcnJhdGEuICBUaGlzIGlzIG5vdCByZXF1aXJlZAotCSAgZm9yIE1QQzUyMDBCIGJhc2VkIGJvYXJkcy4KLQotCSAgSXQgaXMgc2FmZSB0byBzYXkgJ1knIGhlcmUKLQotY29uZmlnIFBQQ19FRklLQQotCWJvb2wgImJQbGFuIEVmaWthIDVrMi4gTVBDNTIwMEIgYmFzZWQgY29tcHV0ZXIiCi0JZGVwZW5kcyBvbiBQUENfTVVMVElQTEFURk9STSAmJiBQUEMzMgotCXNlbGVjdCBQUENfUlRBUwotCXNlbGVjdCBSVEFTX1BST0MKLQlzZWxlY3QgUFBDX01QQzUyeHgKLQlzZWxlY3QgUFBDX05BVElWRQotCWRlZmF1bHQgbgotCi1jb25maWcgUFBDX0xJVEU1MjAwCi0JYm9vbCAiRnJlZXNjYWxlIExpdGU1MjAwIEV2YWwgQm9hcmQiCi0JZGVwZW5kcyBvbiBQUENfTVVMVElQTEFURk9STSAmJiBQUEMzMgotCXNlbGVjdCBQUENfTVBDNTIwMAotCWRlZmF1bHQgbgotCi1jb25maWcgUFBDX1BNQUMKLQlib29sICJBcHBsZSBQb3dlck1hYyBiYXNlZCBtYWNoaW5lcyIKLQlkZXBlbmRzIG9uIFBQQ19NVUxUSVBMQVRGT1JNCi0Jc2VsZWN0IE1QSUMKLQlzZWxlY3QgUFBDX0lORElSRUNUX1BDSSBpZiBQUEMzMgotCXNlbGVjdCBQUENfTVBDMTA2IGlmIFBQQzMyCi0Jc2VsZWN0IFBQQ19OQVRJVkUKLQlkZWZhdWx0IHkKLQotY29uZmlnIFBQQ19QTUFDNjQKLQlib29sCi0JZGVwZW5kcyBvbiBQUENfUE1BQyAmJiBQT1dFUjQKLQlzZWxlY3QgTVBJQwotCXNlbGVjdCBVM19EQVJUCi0Jc2VsZWN0IE1QSUNfQlJPS0VOX1UzCi0Jc2VsZWN0IEdFTkVSSUNfVEJTWU5DCi0Jc2VsZWN0IFBQQ185NzBfTkFQCi0JZGVmYXVsdCB5Ci0KLWNvbmZpZyBQUENfUFJFUAotCWJvb2wgIlBvd2VyUEMgUmVmZXJlbmNlIFBsYXRmb3JtIChQUmVQKSBiYXNlZCBtYWNoaW5lcyIKLQlkZXBlbmRzIG9uIFBQQ19NVUxUSVBMQVRGT1JNICYmIFBQQzMyICYmIEJST0tFTgotCXNlbGVjdCBNUElDCi0Jc2VsZWN0IFBQQ19JODI1OQotCXNlbGVjdCBQUENfSU5ESVJFQ1RfUENJCi0Jc2VsZWN0IFBQQ19VREJHXzE2NTUwCi0Jc2VsZWN0IFBQQ19OQVRJVkUKLQlkZWZhdWx0IG4KLQotY29uZmlnIFBQQ19NQVBMRQotCWRlcGVuZHMgb24gUFBDX01VTFRJUExBVEZPUk0gJiYgUFBDNjQKLQlib29sICJNYXBsZSA5NzBGWCBFdmFsdWF0aW9uIEJvYXJkIgotCXNlbGVjdCBNUElDCi0Jc2VsZWN0IFUzX0RBUlQKLQlzZWxlY3QgTVBJQ19CUk9LRU5fVTMKLQlzZWxlY3QgR0VORVJJQ19UQlNZTkMKLQlzZWxlY3QgUFBDX1VEQkdfMTY1NTAKLQlzZWxlY3QgUFBDXzk3MF9OQVAKLQlzZWxlY3QgUFBDX05BVElWRQotCXNlbGVjdCBQUENfUlRBUwotCXNlbGVjdCBNTUlPX05WUkFNCi0Jc2VsZWN0IEFUQV9OT05TVEFOREFSRCBpZiBBVEEKLQlkZWZhdWx0IG4KLQloZWxwCi0gICAgICAgICAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgTWFwbGUgOTcwRlggRXZhbHVhdGlvbiBCb2FyZC4KLQkgIEZvciBtb3JlIGluZm9ybWF0aW9uLCByZWZlciB0byA8aHR0cDovL3d3dy45NzBldmFsLmNvbT4KLQotY29uZmlnIFBQQ19QQVNFTUkKLQlkZXBlbmRzIG9uIFBQQ19NVUxUSVBMQVRGT1JNICYmIFBQQzY0Ci0JYm9vbCAiUEEgU2VtaSBTb0MtYmFzZWQgcGxhdGZvcm1zIgotCWRlZmF1bHQgbgotCXNlbGVjdCBNUElDCi0Jc2VsZWN0IFBQQ19VREJHXzE2NTUwCi0Jc2VsZWN0IEdFTkVSSUNfVEJTWU5DCi0Jc2VsZWN0IFBQQ19OQVRJVkUKLQloZWxwCi0JICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIFBBIFNlbWkncyBQV1JmaWNpZW50IGxpbmUKLQkgIG9mIFNvQyBwcm9jZXNzb3JzLCBpbmNsdWRpbmcgUEE2VC0xNjgyTQotCi1jb25maWcgUFBDX0NFTEwKLQlib29sCi0JZGVmYXVsdCBuCi0KLWNvbmZpZyBQUENfQ0VMTF9OQVRJVkUKLQlib29sCi0Jc2VsZWN0IFBQQ19DRUxMCi0Jc2VsZWN0IFBQQ19EQ1JfTU1JTwotCXNlbGVjdCBQUENfT0ZfUExBVEZPUk1fUENJCi0Jc2VsZWN0IFBQQ19JTkRJUkVDVF9JTwotCXNlbGVjdCBQUENfTkFUSVZFCi0Jc2VsZWN0IE1QSUMKLQlkZWZhdWx0IG4KLQotY29uZmlnIFBQQ19JQk1fQ0VMTF9CTEFERQotCWJvb2wgIklCTSBDZWxsIEJsYWRlIgotCWRlcGVuZHMgb24gUFBDX01VTFRJUExBVEZPUk0gJiYgUFBDNjQKLQlzZWxlY3QgUFBDX0NFTExfTkFUSVZFCi0Jc2VsZWN0IFBQQ19SVEFTCi0Jc2VsZWN0IE1NSU9fTlZSQU0KLQlzZWxlY3QgUFBDX1VEQkdfMTY1NTAKLQlzZWxlY3QgVURCR19SVEFTX0NPTlNPTEUKLQotY29uZmlnIFBQQ19QUzMKLQlib29sICJTb255IFBTMyAoaW5jb21wbGV0ZSkiCi0JZGVwZW5kcyBvbiBQUENfTVVMVElQTEFURk9STSAmJiBQUEM2NAotCXNlbGVjdCBQUENfQ0VMTAotCXNlbGVjdCBVU0JfQVJDSF9IQVNfT0hDSQotCXNlbGVjdCBVU0JfT0hDSV9MSVRUTEVfRU5ESUFOCi0Jc2VsZWN0IFVTQl9PSENJX0JJR19FTkRJQU5fTU1JTwotCXNlbGVjdCBVU0JfQVJDSF9IQVNfRUhDSQotCXNlbGVjdCBVU0JfRUhDSV9CSUdfRU5ESUFOX01NSU8KLQloZWxwCi0JICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBTb255IFBTMyBnYW1lIGNvbnNvbGUKLQkgIGFuZCBvdGhlciBwbGF0Zm9ybXMgdXNpbmcgdGhlIFBTMyBoeXBlcnZpc29yLgotCSAgU3VwcG9ydCBmb3IgdGhpcyBwbGF0Zm9ybSBpcyBub3QgeWV0IGNvbXBsZXRlLCBzbwotCSAgZW5hYmxpbmcgdGhpcyB3aWxsIG5vdCByZXN1bHQgaW4gYSBib290YWJsZSBrZXJuZWwgb24gYQotCSAgUFMzIHN5c3RlbS4KLQotY29uZmlnIFBQQ19DRUxMRUIKLQlib29sICJUb3NoaWJhJ3MgQ2VsbCBSZWZlcmVuY2UgU2V0ICdDZWxsZWInIEFyY2hpdGVjdHVyZSIKLQlkZXBlbmRzIG9uIFBQQ19NVUxUSVBMQVRGT1JNICYmIFBQQzY0Ci0Jc2VsZWN0IFBQQ19DRUxMCi0Jc2VsZWN0IFBQQ19PRl9QTEFURk9STV9QQ0kKLQlzZWxlY3QgSEFTX1RYWDlfU0VSSUFMCi0Jc2VsZWN0IFBQQ19VREJHX0JFQVQKLQlzZWxlY3QgVVNCX09IQ0lfQklHX0VORElBTl9NTUlPCi0Jc2VsZWN0IFVTQl9FSENJX0JJR19FTkRJQU5fTU1JTwotCi1jb25maWcgUFBDX05BVElWRQotCWJvb2wKLQlkZXBlbmRzIG9uIFBQQ19NVUxUSVBMQVRGT1JNCi0JaGVscAotCSAgU3VwcG9ydCBmb3IgcnVubmluZyBuYXRpdmVseSBvbiB0aGUgaGFyZHdhcmUsIGkuZS4gd2l0aG91dAotCSAgYSBoeXBlcnZpc29yLiBUaGlzIG9wdGlvbiBpcyBub3QgdXNlci1zZWxlY3RhYmxlIGJ1dCBzaG91bGQKLQkgIGJlIHNlbGVjdGVkIGJ5IGFsbCBwbGF0Zm9ybXMgdGhhdCBuZWVkIGl0LgotCi1jb25maWcgVURCR19SVEFTX0NPTlNPTEUKLQlib29sICJSVEFTIGJhc2VkIGRlYnVnIGNvbnNvbGUiCi0JZGVwZW5kcyBvbiBQUENfUlRBUwotCWRlZmF1bHQgbgotCi1jb25maWcgUFBDX1VEQkdfQkVBVAotCWJvb2wgIkJFQVQgYmFzZWQgZGVidWcgY29uc29sZSIKLQlkZXBlbmRzIG9uIFBQQ19DRUxMRUIKLQlkZWZhdWx0IG4KLQotY29uZmlnIFhJQ1MKLQlkZXBlbmRzIG9uIFBQQ19QU0VSSUVTCi0JYm9vbAotCWRlZmF1bHQgeQotCi1jb25maWcgVTNfREFSVAotCWJvb2wgCi0JZGVwZW5kcyBvbiBQUENfTVVMVElQTEFURk9STSAmJiBQUEM2NAotCWRlZmF1bHQgbgotCi1jb25maWcgUFBDX1JUQVMKLQlib29sCi0JZGVmYXVsdCBuCi0KLWNvbmZpZyBSVEFTX0VSUk9SX0xPR0dJTkcKLQlib29sCi0JZGVwZW5kcyBvbiBQUENfUlRBUwotCWRlZmF1bHQgbgotCi1jb25maWcgUlRBU19QUk9DCi0JYm9vbCAiUHJvYyBpbnRlcmZhY2UgdG8gUlRBUyIKLQlkZXBlbmRzIG9uIFBQQ19SVEFTCi0JZGVmYXVsdCB5Ci0KLWNvbmZpZyBSVEFTX0ZMQVNICi0JdHJpc3RhdGUgIkZpcm13YXJlIGZsYXNoIGludGVyZmFjZSIKLQlkZXBlbmRzIG9uIFBQQzY0ICYmIFJUQVNfUFJPQwotCi1jb25maWcgUFBDX1BNSQotCXRyaXN0YXRlICJTdXBwb3J0IGZvciBQTUkiCi0JZGVwZW5kcyBQUENfSUJNX0NFTExfQkxBREUKLQloZWxwCi0JICBQTUkgKFBsYXRmb3JtIE1hbmFnZW1lbnQgSW50ZXJydXB0KSBpcyBhIHdheSB0bwotCSAgY29tbXVuaWNhdGUgd2l0aCB0aGUgQk1DIChCYXNlYm9hcmQgTWFuZ2VtZW50IENvbnRyb2xsZXIpLgotCSAgSXQgaXMgdXNlZCBpbiBzb21lIElCTSBDZWxsIGJsYWRlcy4KLQlkZWZhdWx0IG0KLQotY29uZmlnIE1NSU9fTlZSQU0KLQlib29sCi0JZGVmYXVsdCBuCi0KLWNvbmZpZyBNUElDX0JST0tFTl9VMwotCWJvb2wKLQlkZXBlbmRzIG9uIFBQQ19NQVBMRQotCWRlZmF1bHQgeQotCi1jb25maWcgSUJNVklPCi0JZGVwZW5kcyBvbiBQUENfUFNFUklFUyB8fCBQUENfSVNFUklFUwotCWJvb2wKLQlkZWZhdWx0IHkKLQotY29uZmlnIElCTUVCVVMKLQlkZXBlbmRzIG9uIFBQQ19QU0VSSUVTCi0JYm9vbCAiU3VwcG9ydCBmb3IgR1ggYnVzIGJhc2VkIGFkYXB0ZXJzIgotCWhlbHAKLQkgIEJ1cyBkZXZpY2UgZHJpdmVyIGZvciBHWCBidXMgYmFzZWQgYWRhcHRlcnMuCi0KLWNvbmZpZyBQUENfTVBDMTA2Ci0JYm9vbAotCWRlZmF1bHQgbgotCi1jb25maWcgUFBDXzk3MF9OQVAKLQlib29sCi0JZGVmYXVsdCBuCi0KLWNvbmZpZyBQUENfSU5ESVJFQ1RfSU8KLQlib29sCi0Jc2VsZWN0IEdFTkVSSUNfSU9NQVAKLQlkZWZhdWx0IG4KLQotY29uZmlnIEdFTkVSSUNfSU9NQVAKLQlib29sCi0JZGVmYXVsdCBuCi0KLXNvdXJjZSAiZHJpdmVycy9jcHVmcmVxL0tjb25maWciCi0KLWNvbmZpZyBDUFVfRlJFUV9QTUFDCi0JYm9vbCAiU3VwcG9ydCBmb3IgQXBwbGUgUG93ZXJCb29rcyIKLQlkZXBlbmRzIG9uIENQVV9GUkVRICYmIEFEQl9QTVUgJiYgUFBDMzIKLQlzZWxlY3QgQ1BVX0ZSRVFfVEFCTEUKLQloZWxwCi0JICBUaGlzIGFkZHMgc3VwcG9ydCBmb3IgZnJlcXVlbmN5IHN3aXRjaGluZyBvbiBBcHBsZSBQb3dlckJvb2tzLAotCSAgdGhpcyBjdXJyZW50bHkgaW5jbHVkZXMgc29tZSBtb2RlbHMgb2YgaUJvb2sgJiBUaXRhbml1bQotCSAgUG93ZXJCb29rLgotCi1jb25maWcgQ1BVX0ZSRVFfUE1BQzY0Ci0JYm9vbCAiU3VwcG9ydCBmb3Igc29tZSBBcHBsZSBHNXMiCi0JZGVwZW5kcyBvbiBDUFVfRlJFUSAmJiBQUEM2NAotCXNlbGVjdCBDUFVfRlJFUV9UQUJMRQotCWhlbHAKLQkgIFRoaXMgYWRkcyBzdXBwb3J0IGZvciBmcmVxdWVuY3kgc3dpdGNoaW5nIG9uIEFwcGxlIGlNYWMgRzUsCi0JICBhbmQgc29tZSBvZiB0aGUgbW9yZSByZWNlbnQgZGVza3RvcCBHNSBtYWNoaW5lcyBhcyB3ZWxsLgotCi1jb25maWcgUFBDNjAxX1NZTkNfRklYCi0JYm9vbCAiV29ya2Fyb3VuZHMgZm9yIFBQQzYwMSBidWdzIgotCWRlcGVuZHMgb24gNnh4ICYmIChQUENfUFJFUCB8fCBQUENfUE1BQykKLQloZWxwCi0JICBTb21lIHZlcnNpb25zIG9mIHRoZSBQUEM2MDEgKHRoZSBmaXJzdCBQb3dlclBDIGNoaXApIGhhdmUgYnVncyB3aGljaAotCSAgbWVhbiB0aGF0IGV4dHJhIHN5bmNocm9uaXphdGlvbiBpbnN0cnVjdGlvbnMgYXJlIHJlcXVpcmVkIG5lYXIKLQkgIGNlcnRhaW4gaW5zdHJ1Y3Rpb25zLCB0eXBpY2FsbHkgdGhvc2UgdGhhdCBtYWtlIG1ham9yIGNoYW5nZXMgdG8gdGhlCi0JICBDUFUgc3RhdGUuICBUaGVzZSBleHRyYSBpbnN0cnVjdGlvbnMgcmVkdWNlIHBlcmZvcm1hbmNlIHNsaWdodGx5LgotCSAgSWYgeW91IHNheSBOIGhlcmUsIHRoZXNlIGV4dHJhIGluc3RydWN0aW9ucyB3aWxsIG5vdCBiZSBpbmNsdWRlZCwKLQkgIHJlc3VsdGluZyBpbiBhIGtlcm5lbCB3aGljaCB3aWxsIHJ1biBmYXN0ZXIgYnV0IG1heSBub3QgcnVuIGF0IGFsbAotCSAgb24gc29tZSBzeXN0ZW1zIHdpdGggdGhlIFBQQzYwMSBjaGlwLgotCi0JICBJZiBpbiBkb3VidCwgc2F5IFkgaGVyZS4KLQotY29uZmlnIFRBVQotCWJvb2wgIk9uLWNoaXAgQ1BVIHRlbXBlcmF0dXJlIHNlbnNvciBzdXBwb3J0IgotCWRlcGVuZHMgb24gNnh4Ci0JaGVscAotCSAgRzMgYW5kIEc0IHByb2Nlc3NvcnMgaGF2ZSBhbiBvbi1jaGlwIHRlbXBlcmF0dXJlIHNlbnNvciBjYWxsZWQgdGhlCi0JICAnVGhlcm1hbCBBc3Npc3QgVW5pdCAoVEFVKScsIHdoaWNoLCBpbiB0aGVvcnksIGNhbiBtZWFzdXJlIHRoZSBvbi1kaWUKLQkgIHRlbXBlcmF0dXJlIHdpdGhpbiAyLTQgZGVncmVlcyBDZWxzaXVzLiBUaGlzIG9wdGlvbiBzaG93cyB0aGUgY3VycmVudAotCSAgb24tZGllIHRlbXBlcmF0dXJlIGluIC9wcm9jL2NwdWluZm8gaWYgdGhlIGNwdSBzdXBwb3J0cyBpdC4KLQotCSAgVW5mb3J0dW5hdGVseSwgb24gc29tZSBjaGlwIHJldmlzaW9ucywgdGhpcyBzZW5zb3IgaXMgdmVyeSBpbmFjY3VyYXRlCi0JICBhbmQgaW4gbWFueSBjYXNlcywgZG9lcyBub3Qgd29yayBhdCBhbGwsIHNvIGRvbid0IGFzc3VtZSB0aGUgY3B1Ci0JICB0ZW1wIGlzIGFjdHVhbGx5IHdoYXQgL3Byb2MvY3B1aW5mbyBzYXlzIGl0IGlzLgotCi1jb25maWcgVEFVX0lOVAotCWJvb2wgIkludGVycnVwdCBkcml2ZW4gVEFVIGRyaXZlciAoREFOR0VST1VTKSIKLQlkZXBlbmRzIG9uIFRBVQotCS0tLWhlbHAtLS0KLQkgIFRoZSBUQVUgc3VwcG9ydHMgYW4gaW50ZXJydXB0IGRyaXZlbiBtb2RlIHdoaWNoIGNhdXNlcyBhbiBpbnRlcnJ1cHQKLQkgIHdoZW5ldmVyIHRoZSB0ZW1wZXJhdHVyZSBnb2VzIG91dCBvZiByYW5nZS4gVGhpcyBpcyB0aGUgZmFzdGVzdCB3YXkKLQkgIHRvIGdldCBub3RpZmllZCB0aGUgdGVtcCBoYXMgZXhjZWVkZWQgYSByYW5nZS4gV2l0aCB0aGlzIG9wdGlvbiBvZmYsCi0JICBhIHRpbWVyIGlzIHVzZWQgdG8gcmUtY2hlY2sgdGhlIHRlbXBlcmF0dXJlIHBlcmlvZGljYWxseS4KLQotCSAgSG93ZXZlciwgb24gc29tZSBjcHVzIGl0IGFwcGVhcnMgdGhhdCB0aGUgVEFVIGludGVycnVwdCBoYXJkd2FyZQotCSAgaXMgYnVnZ3kgYW5kIGNhbiBjYXVzZSBhIHNpdHVhdGlvbiB3aGljaCB3b3VsZCBsZWFkIHVuZXhwbGFpbmVkIGhhcmQKLQkgIGxvY2t1cHMuCi0KLQkgIFVubGVzcyB5b3UgYXJlIGV4dGVuZGluZyB0aGUgVEFVIGRyaXZlciwgb3IgZW5qb3kga2VybmVsL2hhcmR3YXJlCi0JICBkZWJ1Z2dpbmcsIGxlYXZlIHRoaXMgb3B0aW9uIG9mZi4KLQotY29uZmlnIFRBVV9BVkVSQUdFCi0JYm9vbCAiQXZlcmFnZSBoaWdoIGFuZCBsb3cgdGVtcCIKLQlkZXBlbmRzIG9uIFRBVQotCS0tLWhlbHAtLS0KLQkgIFRoZSBUQVUgaGFyZHdhcmUgY2FuIGNvbXBhcmUgdGhlIHRlbXBlcmF0dXJlIHRvIGFuIHVwcGVyIGFuZCBsb3dlcgotCSAgYm91bmQuICBUaGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0byBzaG93IGJvdGggdGhlIHVwcGVyIGFuZCBsb3dlcgotCSAgYm91bmQgaW4gL3Byb2MvY3B1aW5mby4gSWYgdGhlIHJhbmdlIGlzIGxhcmdlLCB0aGUgdGVtcGVyYXR1cmUgaXMKLQkgIGVpdGhlciBjaGFuZ2luZyBhIGxvdCwgb3IgdGhlIFRBVSBoYXJkd2FyZSBpcyBicm9rZW4gKGxpa2VseSBvbiBzb21lCi0JICBHNCdzKS4gSWYgdGhlIHJhbmdlIGlzIHNtYWxsIChhcm91bmQgNCBkZWdyZWVzKSwgdGhlIHRlbXBlcmF0dXJlIGlzCi0JICByZWxhdGl2ZWx5IHN0YWJsZS4gIElmIHlvdSBzYXkgWSBoZXJlLCBhIHNpbmdsZSB0ZW1wZXJhdHVyZSB2YWx1ZSwKLQkgIGhhbGZ3YXkgYmV0d2VlbiB0aGUgdXBwZXIgYW5kIGxvd2VyIGJvdW5kcywgd2lsbCBiZSByZXBvcnRlZCBpbgotCSAgL3Byb2MvY3B1aW5mby4KLQotCSAgSWYgaW4gZG91YnQsIHNheSBOIGhlcmUuCi0KLWVuZG1lbnUKLQotc291cmNlIGFyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvS2NvbmZpZwotc291cmNlIGFyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNHh4L0tjb25maWcKLXNvdXJjZSBhcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgyeHgvS2NvbmZpZwotc291cmNlIGFyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9LY29uZmlnCi1zb3VyY2UgYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L0tjb25maWcKLXNvdXJjZSBhcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg2eHgvS2NvbmZpZwotc291cmNlIGFyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvOHh4L0tjb25maWcKLXNvdXJjZSBhcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvS2NvbmZpZwotc291cmNlIGFyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL0tjb25maWcKLXNvdXJjZSBhcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9LY29uZmlnCitzb3VyY2UgImFyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvS2NvbmZpZyIKIAogbWVudSAiS2VybmVsIG9wdGlvbnMiCiAKQEAgLTgzNywxNSArNDU3LDYgQEAKIAogCSAgRG9uJ3QgY2hhbmdlIHRoaXMgdW5sZXNzIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZy4KIAotY29uZmlnIEVNQkVEREVEQk9PVAotCWJvb2wKLQlkZXBlbmRzIG9uIDh4eCB8fCA4MjYwCi0JZGVmYXVsdCB5Ci0KLWNvbmZpZyBQQ19LRVlCT0FSRAotCWJvb2wgIlBDIFBTLzIgc3R5bGUgS2V5Ym9hcmQiCi0JZGVwZW5kcyBvbiA0eHggfHwgQ1BNMgotCiBjb25maWcgUFBDQlVHX05WUkFNCiAJYm9vbCAiRW5hYmxlIHJlYWRpbmcgUFBDQlVHIE5WUkFNIGR1cmluZyBib290IiBpZiBQUExVUyB8fCBMT1BFQwogCWRlZmF1bHQgeSBpZiBQUENfUFJFUApAQCAtODU5LDggKzQ3MCw2IEBACiAJICBDUFUuICBHZW5lcmFsbHkgc2F5aW5nIFkgaXMgc2FmZSwgYWx0aG91Z2ggc29tZSBwcm9ibGVtcyBoYXZlIGJlZW4KIAkgIHJlcG9ydGVkIHdpdGggU01QIFBvd2VyIE1hY2ludG9zaGVzIHdpdGggdGhpcyBvcHRpb24gZW5hYmxlZC4KIAotc291cmNlICJhcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvS2NvbmZpZyIKLQogY29uZmlnIE5VTUEKIAlib29sICJOVU1BIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBQUEM2NApAQCAtOTEwLDEwICs1MTksMTAgQEAKIAlkZXBlbmRzIG9uIFBQQzY0CiAJaGVscAogCSAgVGhpcyBvcHRpb24gY2hhbmdlcyB0aGUga2VybmVsIGxvZ2ljYWwgcGFnZSBzaXplIHRvIDY0ay4gT24gbWFjaGluZXMKLSAgICAgICAgICB3aXRob3V0IHByb2Nlc3NvciBzdXBwb3J0IGZvciA2NGsgcGFnZXMsIHRoZSBrZXJuZWwgd2lsbCBzaW11bGF0ZQotICAgICAgICAgIHRoZW0gYnkgbG9hZGluZyBlYWNoIGluZGl2aWR1YWwgNGsgcGFnZSBvbiBkZW1hbmQgdHJhbnNwYXJlbnRseSwKLSAgICAgICAgICB3aGlsZSBvbiBoYXJkd2FyZSB3aXRoIHN1Y2ggc3VwcG9ydCwgaXQgd2lsbCBiZSB1c2VkIHRvIG1hcAotICAgICAgICAgIG5vcm1hbCBhcHBsaWNhdGlvbiBwYWdlcy4KKwkgIHdpdGhvdXQgcHJvY2Vzc29yIHN1cHBvcnQgZm9yIDY0ayBwYWdlcywgdGhlIGtlcm5lbCB3aWxsIHNpbXVsYXRlCisJICB0aGVtIGJ5IGxvYWRpbmcgZWFjaCBpbmRpdmlkdWFsIDRrIHBhZ2Ugb24gZGVtYW5kIHRyYW5zcGFyZW50bHksCisJICB3aGlsZSBvbiBoYXJkd2FyZSB3aXRoIHN1Y2ggc3VwcG9ydCwgaXQgd2lsbCBiZSB1c2VkIHRvIG1hcAorCSAgbm9ybWFsIGFwcGxpY2F0aW9uIHBhZ2VzLgogCiBjb25maWcgU0NIRURfU01UCiAJYm9vbCAiU01UIChIeXBlcnRocmVhZGluZykgc2NoZWR1bGVyIHN1cHBvcnQiCkBAIC05MzEsOCArNTQwLDYgQEAKIAkgIGFuIGltYWdlIG9mIHRoZSBkZXZpY2UgdHJlZSB0aGF0IHRoZSBrZXJuZWwgY29waWVzIGZyb20gT3BlbgogCSAgRmlybXdhcmUgb3Igb3RoZXIgYm9vdCBmaXJtd2FyZS4gSWYgdW5zdXJlLCBzYXkgWSBoZXJlLgogCi1zb3VyY2UgImFyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHJlcC9LY29uZmlnIgotCiBjb25maWcgQ01ETElORV9CT09MCiAJYm9vbCAiRGVmYXVsdCBib290bG9hZGVyIGtlcm5lbCBhcmd1bWVudHMiCiAKQEAgLTk2Nyw2ICs1NzQsMjkgQEAKIAogCSAgSWYgdW5zdXJlLCBzYXkgWS4gT25seSBlbWJlZGRlZCBzaG91bGQgc2F5IE4gaGVyZS4KIAorY29uZmlnIFdBTlRfREVWSUNFX1RSRUUKKwlib29sCisJZGVmYXVsdCBuCisKK2NvbmZpZyBERVZJQ0VfVFJFRQorCXN0cmluZyAiU3RhdGljIGRldmljZSB0cmVlIHNvdXJjZSBmaWxlIgorCWRlcGVuZHMgb24gV0FOVF9ERVZJQ0VfVFJFRQorCWhlbHAKKwkgIFRoaXMgc3BlY2lmaWVzIHRoZSBkZXZpY2UgdHJlZSBzb3VyY2UgKC5kdHMpIGZpbGUgdG8gYmUKKwkgIGNvbXBpbGVkIGFuZCBpbmNsdWRlZCB3aGVuIGJ1aWxkaW5nIHRoZSBib290d3JhcHBlci4gIElmIGEKKwkgIHJlbGF0aXZlIGZpbGVuYW1lIGlzIGdpdmVuLCB0aGVuIGl0IHdpbGwgYmUgcmVsYXRpdmUgdG8KKwkgIGFyY2gvcG93ZXJwYy9ib290L2R0cy4gIElmIHlvdSBhcmUgbm90IHVzaW5nIHRoZSBib290d3JhcHBlciwKKwkgIG9yIGRvIG5vdCBuZWVkIHRvIGJ1aWxkIGEgZHRzIGludG8gdGhlIGJvb3R3cmFwcGVyLCB0aGlzCisJICBmaWVsZCBpcyBpZ25vcmVkLgorCisJICBGb3IgZXhhbXBsZSwgdGhpcyBpcyByZXF1aXJlZCB3aGVuIGJ1aWxkaW5nIGEgY3VJbWFnZSB0YXJnZXQKKwkgIGZvciBhbiBvbGRlciBVLUJvb3QsIHdoaWNoIGNhbm5vdCBwYXNzIGEgZGV2aWNlIHRyZWUgaXRzZWxmLgorCSAgU3VjaCBhIGtlcm5lbCB3aWxsIG5vdCB3b3JrIHdpdGggYSBuZXdlciBVLUJvb3QgdGhhdCB0cmllcyB0bworCSAgcGFzcyBhIGRldmljZSB0cmVlICh1bmxlc3MgeW91IHRlbGwgaXQgbm90IHRvKS4gIElmIHlvdXIgVS1Cb290CisJICBkb2VzIG5vdCBtZW50aW9uIGEgZGV2aWNlIHRyZWUgaW4gImhlbHAgYm9vdG0iLCB0aGVuIHVzZSB0aGUKKwkgIGN1SW1hZ2UgdGFyZ2V0IGFuZCBzcGVjaWZ5IGEgZGV2aWNlIHRyZWUgaGVyZS4gIE90aGVyd2lzZSwgdXNlCisJICB0aGUgdUltYWdlIHRhcmdldCBhbmQgbGVhdmUgdGhpcyBmaWVsZCBibGFuay4KKwogZW5kbWVudQogCiBjb25maWcgSVNBX0RNQV9BUEkKQEAgLTk5NSwyNCArNjI1LDE3IEBACiAJZGVwZW5kcyBvbiBQUEM2NCB8fCBQT1dFUjQgfHwgNnh4ICYmICFDUE0yCiAJZGVmYXVsdCB5CiAKLWNvbmZpZyBNUElDCi0JYm9vbAotCWRlZmF1bHQgbgotCi1jb25maWcgTVBJQ19XRUlSRAotCWJvb2wKLQlkZWZhdWx0IG4KLQotY29uZmlnIFBQQ19JODI1OQotCWJvb2wKLQlkZWZhdWx0IG4KLQogY29uZmlnIFBQQ19JTkRJUkVDVF9QQ0kKIAlib29sCiAJZGVwZW5kcyBvbiBQQ0kKIAlkZWZhdWx0IHkgaWYgNDB4IHx8IDQ0eAogCWRlZmF1bHQgbgogCitjb25maWcgUFBDX0lORElSRUNUX1BDSV9CRQorCWJvb2wKKwlkZXBlbmRzIFBQQ19JTkRJUkVDVF9QQ0kKKwlkZWZhdWx0IG4KKwogY29uZmlnIEVJU0EKIAlib29sCiAKQEAgLTEwMjIsMTMgKzY0NSwxOCBAQAogY29uZmlnIEZTTF9TT0MKIAlib29sCiAKK2NvbmZpZyBGU0xfUENJRQorCWJvb2wKKwlkZXBlbmRzIG9uIFBQQ184Nnh4CisKICMgWWVzIE1DQSBSUy82MDAwcyBleGlzdCBidXQgTGludXgtUFBDIGRvZXMgbm90IGN1cnJlbnRseSBzdXBwb3J0IGFueQogY29uZmlnIE1DQQogCWJvb2wKIAogY29uZmlnIFBDSQogCWJvb2wgIlBDSSBzdXBwb3J0IiBpZiA0MHggfHwgQ1BNMiB8fCBQUENfODN4eCB8fCBQUENfODV4eCB8fCBQUENfODZ4eCBcCi0JCXx8IFBQQ19NUEM1Mnh4IHx8IChFTUJFRERFRCAmJiBQUENfSVNFUklFUykgfHwgTVBDNzQ0OEhQQzIgfHwgUFBDX1BTMworCQl8fCBQUENfTVBDNTJ4eCB8fCAoRU1CRURERUQgJiYgKFBQQ19QU0VSSUVTIHx8IFBQQ19JU0VSSUVTKSkgXAorCQl8fCBNUEM3NDQ4SFBDMiB8fCBQUENfUFMzCiAJZGVmYXVsdCB5IGlmICE0MHggJiYgIUNQTTIgJiYgITh4eCAmJiAhQVBVUyAmJiAhUFBDXzgzeHggXAogCQkmJiAhUFBDXzg1eHggJiYgIVBQQ184Nnh4CiAJZGVmYXVsdCBQQ0lfUEVSTUVESUEgaWYgITR4eCAmJiAhQ1BNMiAmJiAhOHh4ICYmIEFQVVMKQEAgLTEyMjgsMTIgKzg1NiwxMCBAQAogCiBzb3VyY2UgImFyY2gvcG93ZXJwYy9zeXNkZXYvcWVfbGliL0tjb25maWciCiAKLXNvdXJjZSAiYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL0tjb25maWciCi0KIHNvdXJjZSAibGliL0tjb25maWciCiAKIG1lbnUgIkluc3RydW1lbnRhdGlvbiBTdXBwb3J0IgotICAgICAgICBkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCiAKIHNvdXJjZSAiYXJjaC9wb3dlcnBjL29wcm9maWxlL0tjb25maWciCiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9LY29uZmlnLmRlYnVnIGIvYXJjaC9wb3dlcnBjL0tjb25maWcuZGVidWcKaW5kZXggZDM5ZDEzMy4uODZhYTM3NCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL0tjb25maWcuZGVidWcKKysrIGIvYXJjaC9wb3dlcnBjL0tjb25maWcuZGVidWcKQEAgLTE4LDYgKzE4LDE1IEBACiAKIAkgIFRoaXMgb3B0aW9uIHdpbGwgc2xvdyBkb3duIHByb2Nlc3MgY3JlYXRpb24gc29tZXdoYXQuCiAKK2NvbmZpZyBERUJVR19QQUdFQUxMT0MKKyAgICAgICAgYm9vbCAiRGVidWcgcGFnZSBtZW1vcnkgYWxsb2NhdGlvbnMiCisgICAgICAgIGRlcGVuZHMgb24gREVCVUdfS0VSTkVMICYmICFTT0ZUV0FSRV9TVVNQRU5ECisgICAgICAgIGhlbHAKKyAgICAgICAgICBVbm1hcCBwYWdlcyBmcm9tIHRoZSBrZXJuZWwgbGluZWFyIG1hcHBpbmcgYWZ0ZXIgZnJlZV9wYWdlcygpLgorICAgICAgICAgIFRoaXMgcmVzdWx0cyBpbiBhIGxhcmdlIHNsb3dkb3duLCBidXQgaGVscHMgdG8gZmluZCBjZXJ0YWluIHR5cGVzCisgICAgICAgICAgb2YgbWVtb3J5IGNvcnJ1cHRpb25zLgorCisKIGNvbmZpZyBIQ0FMTF9TVEFUUwogCWJvb2wgIkh5cGVydmlzb3IgY2FsbCBpbnN0cnVtZW50YXRpb24iCiAJZGVwZW5kcyBvbiBQUENfUFNFUklFUyAmJiBERUJVR19GUwpAQCAtMTMyLDggKzE0MSw3IEBACiAKIGNvbmZpZyBTRVJJQUxfVEVYVF9ERUJVRwogCWJvb2wgIlN1cHBvcnQgZm9yIGVhcmx5IGJvb3QgdGV4dHMgb3ZlciBzZXJpYWwgcG9ydCIKLQlkZXBlbmRzIG9uIDR4eCB8fCBMT1BFQyB8fCBNVjY0WDYwIHx8IFBQTFVTIHx8IFBSUE1DODAwIHx8IFwKLQkJUFBDX0dFTjU1MCB8fCBQUENfTVBDNTJ4eAorCWRlcGVuZHMgb24gNHh4CiAKIGNvbmZpZyBQUENfRUFSTFlfREVCVUcKIAlib29sICJFYXJseSBkZWJ1Z2dpbmcgKGRhbmdlcm91cykiCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvTWFrZWZpbGUKaW5kZXggYTAwZmU3Mi4uNzk0OTkyMCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9NYWtlZmlsZQpAQCAtMTAyLDkgKzEwMiw5IEBACiAjIGtlcm5lbCBjb25zaWRlcmFibHkuCiBDRkxBR1MgKz0gJChjYWxsIGNjLW9wdGlvbiwtZnVuaXQtYXQtYS10aW1lKQogCi1pZm5kZWYgQ09ORklHX0ZTTF9CT09LRQotQ0ZMQUdTCQkrPSAtbXN0cmluZwotZW5kaWYKKyMgTmV2ZXIgdXNlIHN0cmluZyBsb2FkL3N0b3JlIGluc3RydWN0aW9ucyBhcyB0aGV5IGFyZQorIyBvZnRlbiBzbG93IHdoZW4gdGhleSBhcmUgaW1wbGVtZW50ZWQgYXQgYWxsCitDRkxBR1MJCSs9IC1tbm8tc3RyaW5nCiAKIGlmZXEgKCQoQ09ORklHXzZ4eCkseSkKIENGTEFHUwkJKz0gLW1jcHU9cG93ZXJwYwpAQCAtMTQ4LDcgKzE0OCw3IEBACiAKIENQUEZMQUdTX3ZtbGludXgubGRzCTo9IC1VcG93ZXJwYwogCi1CT09UX1RBUkdFVFMgPSB6SW1hZ2UgekltYWdlLmluaXRyZCB1SW1hZ2UKK0JPT1RfVEFSR0VUUyA9IHpJbWFnZSB6SW1hZ2UuaW5pdHJkIHVJbWFnZSBjdUltYWdlCiAKIFBIT05ZICs9ICQoQk9PVF9UQVJHRVRTKQogCkBAIC0xNjYsNiArMTY2LDkgQEAKICAgQGVjaG8gJyAgKl9kZWZjb25maWcgICAgIC0gU2VsZWN0IGRlZmF1bHQgY29uZmlnIGZyb20gYXJjaC8kKEFSQ0gpL2NvbmZpZ3MnCiBlbmRlZgogCitpbnN0YWxsOgorCSQoUSkkKE1BS0UpICQoYnVpbGQpPSQoYm9vdCkgQk9PVElNQUdFPSQoS0JVSUxEX0lNQUdFKSBpbnN0YWxsCisKIGFyY2hjbGVhbjoKIAkkKFEpJChNQUtFKSAkKGNsZWFuKT0kKGJvb3QpCiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290Ly5naXRpZ25vcmUgYi9hcmNoL3Bvd2VycGMvYm9vdC8uZ2l0aWdub3JlCmluZGV4IDA3MzRiMmYuLmVlYzdhZjcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290Ly5naXRpZ25vcmUKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvLmdpdGlnbm9yZQpAQCAtMTgsNiArMTgsOSBAQAoga2VybmVsLXZtbGludXguc3RyaXAuZ3oKIG1rdHJlZQogdUltYWdlCitjdUltYWdlCitjdUltYWdlLmJpbi5negorY3VJbWFnZS5lbGYKIHpJbWFnZQogekltYWdlLmNocnAKIHpJbWFnZS5jb2ZmCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9ib290L01ha2VmaWxlCmluZGV4IGRjNzc5NDAuLjM3MTY1OTQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L01ha2VmaWxlCkBAIC00MCwxMCArNDAsMTEgQEAKICQoYWRkcHJlZml4ICQob2JqKS8sJCh6bGliKSBtYWluLm8pOiAkKGFkZHByZWZpeCAkKG9iaikvLCQoemxpYmxpbnV4aGVhZGVyKSkgXAogCQkkKGFkZHByZWZpeCAkKG9iaikvLCQoemxpYmhlYWRlcikpCiAKLXNyYy13bGliIDo9IHN0cmluZy5TIHN0ZGlvLmMgbWFpbi5jIGZsYXRkZXZ0cmVlLmMgZmxhdGRldnRyZWVfbWlzYy5jIFwKLQkJbnMxNjU1MC5jIHNlcmlhbC5jIHNpbXBsZV9hbGxvYy5jIGRpdjY0LlMgdXRpbC5TICQoemxpYikKLXNyYy1wbGF0IDo9IG9mLmMKLXNyYy1ib290IDo9IGNydDAuUyAkKHNyYy13bGliKSAkKHNyYy1wbGF0KSBlbXB0eS5jCitzcmMtd2xpYiA6PSBzdHJpbmcuUyBjcnQwLlMgc3RkaW8uYyBtYWluLmMgZmxhdGRldnRyZWUuYyBmbGF0ZGV2dHJlZV9taXNjLmMgXAorCQluczE2NTUwLmMgc2VyaWFsLmMgc2ltcGxlX2FsbG9jLmMgZGl2NjQuUyB1dGlsLlMgXAorCQlndW56aXBfdXRpbC5jIGVsZl91dGlsLmMgJCh6bGliKSBkZXZ0cmVlLmMKK3NyYy1wbGF0IDo9IG9mLmMgY3Vib290LTgzeHguYyBjdWJvb3QtODV4eC5jCitzcmMtYm9vdCA6PSAkKHNyYy13bGliKSAkKHNyYy1wbGF0KSBlbXB0eS5jCiAKIHNyYy1ib290IDo9ICQoYWRkcHJlZml4ICQob2JqKS8sICQoc3JjLWJvb3QpKQogb2JqLWJvb3QgOj0gJChhZGRzdWZmaXggLm8sICQoYmFzZW5hbWUgJChzcmMtYm9vdCkpKQpAQCAtNzUsNyArNzYsNyBAQAogCUBjcCAkPCAkQAogCiBjbGVhbi1maWxlcyA6PSAkKHpsaWIpICQoemxpYmhlYWRlcikgJCh6bGlibGludXhoZWFkZXIpIFwKLQkJZW1wdHkuYyB6SW1hZ2UgekltYWdlLmNvZmYubGRzIHpJbWFnZS5sZHMgekltYWdlLnNhbmRwb2ludAorCQllbXB0eS5jIHpJbWFnZS5jb2ZmLmxkcyB6SW1hZ2UubGRzCiAKIHF1aWV0X2NtZF9ib290Y2MgPSBCT09UQ0MgICRACiAgICAgICBjbWRfYm9vdGNjID0gJChDUk9TUzMyQ0MpIC1XcCwtTUQsJChkZXBmaWxlKSAkKEJPT1RDRkxBR1MpIC1jIC1vICRAICQ8CkBAIC04NCwyMyArODUsMjUgQEAKICAgICAgIGNtZF9ib290YXMgPSAkKENST1NTMzJDQykgLVdwLC1NRCwkKGRlcGZpbGUpICQoQk9PVEFGTEFHUykgLWMgLW8gJEAgJDwKIAogcXVpZXRfY21kX2Jvb3RhciA9IEJPT1RBUiAgJEAKLSAgICAgIGNtZF9ib290YXIgPSAkKENST1NTMzJBUikgLWNyICRALiQkJCQgJF47IG12ICRALiQkJCQgJEAKKyAgICAgIGNtZF9ib290YXIgPSAkKENST1NTMzJBUikgLWNyICRALiQkJCQgJChmaWx0ZXItb3V0IEZPUkNFLCReKTsgbXYgJEAuJCQkJCAkQAogCi0kKHBhdHN1YnN0ICUuYywlLm8sICQoZmlsdGVyICUuYywgJChzcmMtYm9vdCkpKTogJS5vOiAlLmMKKyQocGF0c3Vic3QgJS5jLCUubywgJChmaWx0ZXIgJS5jLCAkKHNyYy1ib290KSkpOiAlLm86ICUuYyBGT1JDRQogCSQoY2FsbCBpZl9jaGFuZ2VkX2RlcCxib290Y2MpCi0kKHBhdHN1YnN0ICUuUywlLm8sICQoZmlsdGVyICUuUywgJChzcmMtYm9vdCkpKTogJS5vOiAlLlMKKyQocGF0c3Vic3QgJS5TLCUubywgJChmaWx0ZXIgJS5TLCAkKHNyYy1ib290KSkpOiAlLm86ICUuUyBGT1JDRQogCSQoY2FsbCBpZl9jaGFuZ2VkX2RlcCxib290YXMpCiAKLSQob2JqKS93cmFwcGVyLmE6ICQob2JqLXdsaWIpCi0JJChjYWxsIGNtZCxib290YXIpCiskKG9iaikvd3JhcHBlci5hOiAkKG9iai13bGliKSBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkLGJvb3RhcikKIAogaG9zdHByb2dzLXkJOj0gYWRkbm90ZSBhZGRSYW1EaXNrIGhhY2stY29mZiBta3RyZWUKIAotZXh0cmEteQkJOj0gJChvYmopL2NydDAubyAkKG9iaikvd3JhcHBlci5hICQob2JqLXBsYXQpICQob2JqKS9lbXB0eS5vIFwKK3RhcmdldHMJCSs9ICQocGF0c3Vic3QgJChvYmopLyUsJSwkKG9iai1ib290KSB3cmFwcGVyLmEpCitleHRyYS15CQk6PSAkKG9iaikvd3JhcHBlci5hICQob2JqLXBsYXQpICQob2JqKS9lbXB0eS5vIFwKIAkJICAgJChvYmopL3pJbWFnZS5sZHMgJChvYmopL3pJbWFnZS5jb2ZmLmxkcwogCiB3cmFwcGVyCQk6PSQoc3JjdHJlZSkvJChzcmMpL3dyYXBwZXIKLXdyYXBwZXJiaXRzCTo9ICQoZXh0cmEteSkgJChhZGRwcmVmaXggJChvYmopLyxhZGRub3RlIGhhY2stY29mZiBta3RyZWUpCit3cmFwcGVyYml0cwk6PSAkKGV4dHJhLXkpICQoYWRkcHJlZml4ICQob2JqKS8sYWRkbm90ZSBoYWNrLWNvZmYgbWt0cmVlKSBcCisJCQkkKHdyYXBwZXIpIEZPUkNFCiAKICMjIyMjIyMjIyMjIyMKICMgQml0cyBmb3IgYnVpbGRpbmcgdmFyaW91cyBmbGF2b3VycyBvZiB6SW1hZ2UKQEAgLTExMyw1MCArMTE2LDEwIEBACiBlbmRpZgogZW5kaWYKIAorIyBhcmdzICh0byBpZl9jaGFuZ2VkKTogMSA9ICh0aGlzIHJ1bGUpLCAyID0gcGxhdGZvcm0sIDMgPSBkdHMgND1kdGIgNT1pbml0cmQKIHF1aWV0X2NtZF93cmFwCT0gV1JBUCAgICAkQAotICAgICAgY21kX3dyYXAJPSQoQ09ORklHX1NIRUxMKSAkKHdyYXBwZXIpIC1jIC1vICRAIC1wICQyICQoQ1JPU1NXUkFQKSB2bWxpbnV4Ci1xdWlldF9jbWRfd3JhcF9pbml0cmQgPSBXUkFQICAgICRACi0gICAgICBjbWRfd3JhcF9pbml0cmQgPSQoQ09ORklHX1NIRUxMKSAkKHdyYXBwZXIpIC1jIC1vICRAIC1wICQyICQoQ1JPU1NXUkFQKSBcCi0JCQkJLWkgJChvYmopL3JhbWRpc2suaW1hZ2UuZ3ogdm1saW51eAotCi0kKG9iaikvekltYWdlLmNocnA6IHZtbGludXggJCh3cmFwcGVyYml0cykKLQkkKGNhbGwgY21kLHdyYXAsY2hycCkKLQotJChvYmopL3pJbWFnZS5pbml0cmQuY2hycDogdm1saW51eCAkKHdyYXBwZXJiaXRzKQotCSQoY2FsbCBjbWQsd3JhcF9pbml0cmQsY2hycCkKLQotJChvYmopL3pJbWFnZS5wc2VyaWVzOgl2bWxpbnV4ICQod3JhcHBlcmJpdHMpCi0JJChjYWxsIGNtZCx3cmFwLHBzZXJpZXMpCi0KLSQob2JqKS96SW1hZ2UuaW5pdHJkLnBzZXJpZXM6IHZtbGludXggJCh3cmFwcGVyYml0cykKLQkkKGNhbGwgY21kLHdyYXBfaW5pdHJkLHBzZXJpZXMpCi0KLSQob2JqKS96SW1hZ2UucG1hYzogdm1saW51eCAkKHdyYXBwZXJiaXRzKQotCSQoY2FsbCBjbWQsd3JhcCxwbWFjKQotCi0kKG9iaikvekltYWdlLmluaXRyZC5wbWFjOiB2bWxpbnV4ICQod3JhcHBlcmJpdHMpCi0JJChjYWxsIGNtZCx3cmFwX2luaXRyZCxwbWFjKQotCi0kKG9iaikvekltYWdlLmNvZmY6IHZtbGludXggJCh3cmFwcGVyYml0cykKLQkkKGNhbGwgY21kLHdyYXAscG1hY2NvZmYpCi0KLSQob2JqKS96SW1hZ2UuaW5pdHJkLmNvZmY6IHZtbGludXggJCh3cmFwcGVyYml0cykKLQkkKGNhbGwgY21kLHdyYXBfaW5pdHJkLHBtYWNjb2ZmKQotCi0kKG9iaikvekltYWdlLm1pYm9vdDogdm1saW51eCAkKHdyYXBwZXJiaXRzKQotCSQoY2FsbCBjbWQsd3JhcCxtaWJvb3QpCi0KLSQob2JqKS96SW1hZ2UuaW5pdHJkLm1pYm9vdDogdm1saW51eCAkKHdyYXBwZXJiaXRzKQotCSQoY2FsbCBjbWQsd3JhcF9pbml0cmQsbWlib290KQotCi0kKG9iaikvekltYWdlLnBzMzogdm1saW51eAotCSQoU1RSSVApIC1zIC1SIC5jb21tZW50ICQ8IC1vICRACi0KLSQob2JqKS96SW1hZ2UuaW5pdHJkLnBzMzogdm1saW51eAotCUBlY2hvICIgIFdBUk5JTkcgekltYWdlLmluaXRyZC5wczMgbm90IHN1cHBvcnRlZCAoeWV0KSIKLQotJChvYmopL3VJbWFnZTogdm1saW51eCAkKHdyYXBwZXJiaXRzKQotCSQoY2FsbCBjbWQsd3JhcCx1Ym9vdCkKKyAgICAgIGNtZF93cmFwCT0kKENPTkZJR19TSEVMTCkgJCh3cmFwcGVyKSAtYyAtbyAkQCAtcCAkMiAkKENST1NTV1JBUCkgXAorCQkkKGlmICQzLCAtcyAkMykkKGlmICQ0LCAtZCAkNCkkKGlmICQ1LCAtaSAkNSkgdm1saW51eAogCiBpbWFnZS0kKENPTkZJR19QUENfUFNFUklFUykJCSs9IHpJbWFnZS5wc2VyaWVzCiBpbWFnZS0kKENPTkZJR19QUENfTUFQTEUpCQkrPSB6SW1hZ2UucHNlcmllcwpAQCAtMTY2LDcgKzEyOSw3IEBACiBpbWFnZS0kKENPTkZJR19QUENfQ0hSUCkJCSs9IHpJbWFnZS5jaHJwCiBpbWFnZS0kKENPTkZJR19QUENfRUZJS0EpCQkrPSB6SW1hZ2UuY2hycAogaW1hZ2UtJChDT05GSUdfUFBDX1BNQUMpCQkrPSB6SW1hZ2UucG1hYwotaW1hZ2UtJChDT05GSUdfREVGQVVMVF9VSU1BR0UpCQkrPSB1SW1hZ2UKK2ltYWdlLSQoQ09ORklHX0RFRkFVTFRfVUlNQUdFKQkJKz0gdUltYWdlIGN1SW1hZ2UKIAogIyBGb3IgMzItYml0IHBvd2VybWFjcywgYnVpbGQgdGhlIENPRkYgYW5kIG1pYm9vdCBpbWFnZXMKICMgYXMgd2VsbCBhcyB0aGUgRUxGIGltYWdlcy4KQEAgLTE3NCwxNiArMTM3LDU1IEBACiBpbWFnZS0kKENPTkZJR19QUENfUE1BQykJKz0gekltYWdlLmNvZmYgekltYWdlLm1pYm9vdAogZW5kaWYKIAoraW5pdHJkLSAgOj0gJChwYXRzdWJzdCB6SW1hZ2UlLCB6SW1hZ2UuaW5pdHJkJSwgJChpbWFnZS1uKSAkKGltYWdlLSkpCiBpbml0cmQteSA6PSAkKHBhdHN1YnN0IHpJbWFnZSUsIHpJbWFnZS5pbml0cmQlLCAkKGltYWdlLXkpKQoraW5pdHJkLXkgOj0gJChmaWx0ZXItb3V0ICQoaW1hZ2UteSksICQoaW5pdHJkLXkpKQordGFyZ2V0cwkrPSAkKGltYWdlLXkpICQoaW5pdHJkLXkpCisKKyQoYWRkcHJlZml4ICQob2JqKS8sICQoaW5pdHJkLXkpKTogJChvYmopL3JhbWRpc2suaW1hZ2UuZ3oKKworIyBEb24ndCBwdXQgdGhlIHJhbWRpc2sgb24gdGhlIHBhdHRlcm4gcnVsZTsgd2hlbiBpdHMgbWlzc2luZyBtYWtlIHdpbGwgdHJ5CisjIHRoZSBwYXR0ZXJuIHJ1bGUgd2l0aCBsZXNzIGRlcGVuZGVuY2llcyB0aGF0IGFsc28gbWF0Y2hlcyAoZXZlbiB3aXRoIHRoZQorIyBoYXJkIGRlcGVuZGVuY3kgbGlzdGVkKS4KKyQob2JqKS96SW1hZ2UuaW5pdHJkLiU6IHZtbGludXggJCh3cmFwcGVyYml0cykKKwkkKGNhbGwgaWZfY2hhbmdlZCx3cmFwLCQqLCwsJChvYmopL3JhbWRpc2suaW1hZ2UuZ3opCisKKyQob2JqKS96SW1hZ2UuJTogdm1saW51eCAkKHdyYXBwZXJiaXRzKQorCSQoY2FsbCBpZl9jaGFuZ2VkLHdyYXAsJCopCisKKyQob2JqKS96SW1hZ2UucHMzOiB2bWxpbnV4CisJJChTVFJJUCkgLXMgLVIgLmNvbW1lbnQgJDwgLW8gJEAKKworJChvYmopL3pJbWFnZS5pbml0cmQucHMzOiB2bWxpbnV4CisJQGVjaG8gIiAgV0FSTklORyB6SW1hZ2UuaW5pdHJkLnBzMyBub3Qgc3VwcG9ydGVkICh5ZXQpIgorCiskKG9iaikvdUltYWdlOiB2bWxpbnV4ICQod3JhcHBlcmJpdHMpCisJJChjYWxsIGlmX2NoYW5nZWQsd3JhcCx1Ym9vdCkKKworY3Vib290LXBsYXQtJChDT05GSUdfODN4eCkgKz0gODN4eAorY3Vib290LXBsYXQtJChDT05GSUdfODV4eCkgKz0gODV4eAorY3Vib290LXBsYXQteSArPSB1bmtub3duLXBsYXRmb3JtCisKK2R0cyA9ICQoaWYgJChzaGVsbCBlY2hvICQoQ09ORklHX0RFVklDRV9UUkVFKSB8IGdyZXAgJ14vJyksXAorICAgICAgICwkKHNyY3RyZWUpLyQoc3JjKS9kdHMvKSQoQ09ORklHX0RFVklDRV9UUkVFKQorCiskKG9iaikvY3VJbWFnZTogdm1saW51eCAkKHdyYXBwZXJiaXRzKQorCSQoY2FsbCBpZl9jaGFuZ2VkLHdyYXAsY3Vib290LSQod29yZCAxLCQoY3Vib290LXBsYXQteSkpLCQoZHRzKSkKIAogJChvYmopL3pJbWFnZToJCSQoYWRkcHJlZml4ICQob2JqKS8sICQoaW1hZ2UteSkpCiAJQHJtIC1mICRAOyBsbiAkPCAkQAogJChvYmopL3pJbWFnZS5pbml0cmQ6CSQoYWRkcHJlZml4ICQob2JqKS8sICQoaW5pdHJkLXkpKQogCUBybSAtZiAkQDsgbG4gJDwgJEAKIAotaW5zdGFsbDogJChDT05GSUdVUkUpICQoaW1hZ2UteSkKK2luc3RhbGw6ICQoQ09ORklHVVJFKSAkKGFkZHByZWZpeCAkKG9iaikvLCAkKGltYWdlLXkpKQogCXNoIC14ICQoc3JjdHJlZSkvJChzcmMpL2luc3RhbGwuc2ggIiQoS0VSTkVMUkVMRUFTRSkiIHZtbGludXggU3lzdGVtLm1hcCAiJChJTlNUQUxMX1BBVEgpIiAkPAogCi1jbGVhbi1maWxlcyArPSAkKGFkZHByZWZpeCAkKG9ianRyZWUpLywgJChvYmotYm9vdCkgdm1saW51eC5zdHJpcC5neikKLWNsZWFuLWZpbGVzICs9ICQoYWRkcHJlZml4ICQob2JqdHJlZSkvLCAkKG9iai1ib290KSB2bWxpbnV4LmJpbi5neikKLWNsZWFuLWZpbGVzICs9ICQoaW1hZ2UtKQorIyBhbnl0aGluZyBub3QgaW4gJCh0YXJnZXRzKQorY2xlYW4tZmlsZXMgKz0gJChpbWFnZS0pICQoaW5pdHJkLSkgekltYWdlIHpJbWFnZS5pbml0cmQgXAorICAgICAgICAgICAgICAgY3VJbWFnZS5lbGYgY3VJbWFnZS5iaW4uZ3oKKworIyBjbGVhbiB1cCBmaWxlcyBjYWNoZWQgYnkgd3JhcHBlcgorY2xlYW4ta2VybmVsIDo9IHZtbGludXguc3RyaXAgdm1saW51eC5iaW4KK2NsZWFuLWtlcm5lbCArPSAkKGFkZHN1ZmZpeCAuZ3osJChjbGVhbi1rZXJuZWwpKQorIyBJZiBub3QgYWJzb2x1dGUgY2xlYW4tZmlsZXMgYXJlIHJlbGF0aXZlIHRvICQob2JqKS4KK2NsZWFuLWZpbGVzICs9ICQoYWRkcHJlZml4ICQob2JqdHJlZSkvLCAkKGNsZWFuLWtlcm5lbCkpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9jcnQwLlMgYi9hcmNoL3Bvd2VycGMvYm9vdC9jcnQwLlMKaW5kZXggNzBlNjViMS4uNWE0MjE1YyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvY3J0MC5TCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2NydDAuUwpAQCAtMTYsOCArMTYsMTEgQEAKIF96aW1hZ2Vfc3RhcnRfb3BkOgogCS5sb25nCV96aW1hZ2Vfc3RhcnQsIDAsIDAsIDAKIAorCS53ZWFrCV96aW1hZ2Vfc3RhcnQKIAkuZ2xvYmwJX3ppbWFnZV9zdGFydAogX3ppbWFnZV9zdGFydDoKKwkuZ2xvYmwJX3ppbWFnZV9zdGFydF9saWIKK196aW1hZ2Vfc3RhcnRfbGliOgogCS8qIFdvcmsgb3V0IHRoZSBvZmZzZXQgYmV0d2VlbiB0aGUgYWRkcmVzcyB3ZSB3ZXJlIGxpbmtlZCBhdAogCSAgIGFuZCB0aGUgYWRkcmVzcyB3aGVyZSB3ZSdyZSBydW5uaW5nLiAqLwogCWJsCTFmCkBAIC00NCw3ICs0Nyw3IEBACiAJYWRkaQlyOSxyOSw0CiAJYmRuegkyYgogCi0JLyogRG8gYSBjYWNoZSBmbHVzaCBmb3Igb3VyIHRleHQsIGluIGNhc2UgT0YgZGlkbid0ICovCisJLyogRG8gYSBjYWNoZSBmbHVzaCBmb3Igb3VyIHRleHQsIGluIGNhc2UgdGhlIGxvYWRlciBkaWRuJ3QgKi8KIDM6CWxpcwlyOSxfc3RhcnRAaGEKIAlhZGRpCXI5LHI5LF9zdGFydEBsCiAJYWRkCXI5LHIwLHI5CkBAIC01OSw2ICs2MiwzNCBAQAogCXN5bmMKIAlpc3luYwogCi0JbXIJcjYscjEKLQliCXN0YXJ0CisJLyogQ2xlYXIgdGhlIEJTUyAqLworCWxpcwlyOSxfX2Jzc19zdGFydEBoYQorCWFkZGkJcjkscjksX19ic3Nfc3RhcnRAbAorCWFkZAlyOSxyMCxyOQorCWxpcwlyOCxfZW5kQGhhCisJYWRkaQlyOCxyOCxfZW5kQGwKKwlhZGQJcjgscjAscjgKKwlsaQlyMTAsMAorNToJc3R3CXIxMCwwKHI5KQorCWFkZGkJcjkscjksNAorCWNtcGx3CWNyMCxyOSxyOAorCWJsdAk1YgogCisJLyogUG9zc2libHkgc2V0IHVwIGEgY3VzdG9tIHN0YWNrICovCisud2VhawlfcGxhdGZvcm1fc3RhY2tfdG9wCisJbGlzCXI4LF9wbGF0Zm9ybV9zdGFja190b3BAaGEKKwlhZGRpCXI4LHI4LF9wbGF0Zm9ybV9zdGFja190b3BAbAorCWNtcHdpCXI4LDAKKwliZXEJNmYKKwlhZGQJcjgscjAscjgKKwlsd3oJcjEsMChyOCkKKwlhZGQJcjEscjAscjEKKwlsaQlyMCwwCisJc3R3dQlyMCwtMTYocjEpCS8qIGVzdGFibGlzaCBhIHN0YWNrIGZyYW1lICovCis2OgorCisJLyogQ2FsbCBwbGF0Zm9ybV9pbml0KCkgKi8KKwlibAlwbGF0Zm9ybV9pbml0CisKKwkvKiBDYWxsIHN0YXJ0ICovCisJYglzdGFydApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvY3Vib290LTgzeHguYyBiL2FyY2gvcG93ZXJwYy9ib290L2N1Ym9vdC04M3h4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNiYzIwYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2N1Ym9vdC04M3h4LmMKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIE9sZCBVLWJvb3QgY29tcGF0aWJpbGl0eSBmb3IgODN4eAorICoKKyAqIEF1dGhvcjogU2NvdHQgV29vZCA8c2NvdHR3b29kQGZyZWVzY2FsZS5jb20+CisgKgorICogQ29weXJpZ2h0IChjKSAyMDA3IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSAib3BzLmgiCisjaW5jbHVkZSAic3RkaW8uaCIKKworI2RlZmluZSBUQVJHRVRfODN4eAorI2luY2x1ZGUgInBwY2Jvb3QuaCIKKworc3RhdGljIGJkX3QgYmQ7CitleHRlcm4gY2hhciBfZW5kW107CitleHRlcm4gY2hhciBfZHRiX3N0YXJ0W10sIF9kdGJfZW5kW107CisKK3N0YXRpYyB2b2lkIHBsYXRmb3JtX2ZpeHVwcyh2b2lkKQoreworCXZvaWQgKnNvYzsKKworCWR0X2ZpeHVwX21lbW9yeShiZC5iaV9tZW1zdGFydCwgYmQuYmlfbWVtc2l6ZSk7CisJZHRfZml4dXBfbWFjX2FkZHJlc3NlcyhiZC5iaV9lbmV0YWRkciwgYmQuYmlfZW5ldDFhZGRyKTsKKwlkdF9maXh1cF9jcHVfY2xvY2tzKGJkLmJpX2ludGZyZXEsIGJkLmJpX2J1c2ZyZXEgLyA0LCBiZC5iaV9idXNmcmVxKTsKKworCS8qIFVuZm9ydHVuYXRlbHksIHRoZSBzcGVjaWZpYyBtb2RlbCBudW1iZXIgaXMgZW5jb2RlZCBpbiB0aGUKKwkgKiBzb2Mgbm9kZSBuYW1lIGluIGV4aXN0aW5nIGR0cyBmaWxlcyAtLSBvbmNlIHRoYXQgaXMgZml4ZWQsCisJICogdGhpcyBjYW4gZG8gYSBzaW1wbGUgcGF0aCBsb29rdXAuCisJICovCisJc29jID0gZmluZF9ub2RlX2J5X2RldnR5cGUoTlVMTCwgInNvYyIpOworCWlmIChzb2MpIHsKKwkJdm9pZCAqc2VyaWFsID0gTlVMTDsKKworCQlzZXRwcm9wKHNvYywgImJ1cy1mcmVxdWVuY3kiLCAmYmQuYmlfYnVzZnJlcSwKKwkJICAgICAgICBzaXplb2YoYmQuYmlfYnVzZnJlcSkpOworCisJCXdoaWxlICgoc2VyaWFsID0gZmluZF9ub2RlX2J5X2RldnR5cGUoc2VyaWFsLCAic2VyaWFsIikpKSB7CisJCQlpZiAoZ2V0X3BhcmVudChzZXJpYWwpICE9IHNvYykKKwkJCQljb250aW51ZTsKKworCQkJc2V0cHJvcChzZXJpYWwsICJjbG9jay1mcmVxdWVuY3kiLCAmYmQuYmlfYnVzZnJlcSwKKwkJCSAgICAgICAgc2l6ZW9mKGJkLmJpX2J1c2ZyZXEpKTsKKwkJfQorCX0KK30KKwordm9pZCBwbGF0Zm9ybV9pbml0KHVuc2lnbmVkIGxvbmcgcjMsIHVuc2lnbmVkIGxvbmcgcjQsIHVuc2lnbmVkIGxvbmcgcjUsCisgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyByNiwgdW5zaWduZWQgbG9uZyByNykKK3sKKwl1bnNpZ25lZCBsb25nIGVuZF9vZl9yYW0gPSBiZC5iaV9tZW1zdGFydCArIGJkLmJpX21lbXNpemU7CisJdW5zaWduZWQgbG9uZyBhdmFpbF9yYW0gPSBlbmRfb2ZfcmFtIC0gKHVuc2lnbmVkIGxvbmcpX2VuZDsKKworCW1lbWNweSgmYmQsIChiZF90ICopcjMsIHNpemVvZihiZCkpOworCWxvYWRlcl9pbmZvLmluaXRyZF9hZGRyID0gcjQ7CisJbG9hZGVyX2luZm8uaW5pdHJkX3NpemUgPSByNCA/IHI1IDogMDsKKwlsb2FkZXJfaW5mby5jbWRsaW5lID0gKGNoYXIgKilyNjsKKwlsb2FkZXJfaW5mby5jbWRsaW5lX2xlbiA9IHI3IC0gcjY7CisKKwlzaW1wbGVfYWxsb2NfaW5pdChfZW5kLCBhdmFpbF9yYW0gLSAxMDI0KjEwMjQsIDMyLCA2NCk7CisJZnRfaW5pdChfZHRiX3N0YXJ0LCBfZHRiX2VuZCAtIF9kdGJfc3RhcnQsIDMyKTsKKwlzZXJpYWxfY29uc29sZV9pbml0KCk7CisJcGxhdGZvcm1fb3BzLmZpeHVwcyA9IHBsYXRmb3JtX2ZpeHVwczsKK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2N1Ym9vdC04NXh4LmMgYi9hcmNoL3Bvd2VycGMvYm9vdC9jdWJvb3QtODV4eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4OGJhMDAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9jdWJvb3QtODV4eC5jCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBPbGQgVS1ib290IGNvbXBhdGliaWxpdHkgZm9yIDg1eHgKKyAqCisgKiBBdXRob3I6IFNjb3R0IFdvb2QgPHNjb3R0d29vZEBmcmVlc2NhbGUuY29tPgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNyBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgIm9wcy5oIgorI2luY2x1ZGUgInN0ZGlvLmgiCisKKyNkZWZpbmUgVEFSR0VUXzg1eHgKKyNpbmNsdWRlICJwcGNib290LmgiCisKK3N0YXRpYyBiZF90IGJkOworZXh0ZXJuIGNoYXIgX2VuZFtdOworZXh0ZXJuIGNoYXIgX2R0Yl9zdGFydFtdLCBfZHRiX2VuZFtdOworCitzdGF0aWMgdm9pZCBwbGF0Zm9ybV9maXh1cHModm9pZCkKK3sKKwl2b2lkICpzb2M7CisKKwlkdF9maXh1cF9tZW1vcnkoYmQuYmlfbWVtc3RhcnQsIGJkLmJpX21lbXNpemUpOworCWR0X2ZpeHVwX21hY19hZGRyZXNzZXMoYmQuYmlfZW5ldGFkZHIsIGJkLmJpX2VuZXQxYWRkciwKKwkgICAgICAgICAgICAgICAgICAgICAgIGJkLmJpX2VuZXQyYWRkcik7CisJZHRfZml4dXBfY3B1X2Nsb2NrcyhiZC5iaV9pbnRmcmVxLCBiZC5iaV9idXNmcmVxIC8gOCwgYmQuYmlfYnVzZnJlcSk7CisKKwkvKiBVbmZvcnR1bmF0ZWx5LCB0aGUgc3BlY2lmaWMgbW9kZWwgbnVtYmVyIGlzIGVuY29kZWQgaW4gdGhlCisJICogc29jIG5vZGUgbmFtZSBpbiBleGlzdGluZyBkdHMgZmlsZXMgLS0gb25jZSB0aGF0IGlzIGZpeGVkLAorCSAqIHRoaXMgY2FuIGRvIGEgc2ltcGxlIHBhdGggbG9va3VwLgorCSAqLworCXNvYyA9IGZpbmRfbm9kZV9ieV9kZXZ0eXBlKE5VTEwsICJzb2MiKTsKKwlpZiAoc29jKSB7CisJCXZvaWQgKnNlcmlhbCA9IE5VTEw7CisKKwkJc2V0cHJvcChzb2MsICJidXMtZnJlcXVlbmN5IiwgJmJkLmJpX2J1c2ZyZXEsCisJCSAgICAgICAgc2l6ZW9mKGJkLmJpX2J1c2ZyZXEpKTsKKworCQl3aGlsZSAoKHNlcmlhbCA9IGZpbmRfbm9kZV9ieV9kZXZ0eXBlKHNlcmlhbCwgInNlcmlhbCIpKSkgeworCQkJaWYgKGdldF9wYXJlbnQoc2VyaWFsKSAhPSBzb2MpCisJCQkJY29udGludWU7CisKKwkJCXNldHByb3Aoc2VyaWFsLCAiY2xvY2stZnJlcXVlbmN5IiwgJmJkLmJpX2J1c2ZyZXEsCisJCQkgICAgICAgIHNpemVvZihiZC5iaV9idXNmcmVxKSk7CisJCX0KKwl9Cit9CisKK3ZvaWQgcGxhdGZvcm1faW5pdCh1bnNpZ25lZCBsb25nIHIzLCB1bnNpZ25lZCBsb25nIHI0LCB1bnNpZ25lZCBsb25nIHI1LAorICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgcjYsIHVuc2lnbmVkIGxvbmcgcjcpCit7CisJdW5zaWduZWQgbG9uZyBlbmRfb2ZfcmFtID0gYmQuYmlfbWVtc3RhcnQgKyBiZC5iaV9tZW1zaXplOworCXVuc2lnbmVkIGxvbmcgYXZhaWxfcmFtID0gZW5kX29mX3JhbSAtICh1bnNpZ25lZCBsb25nKV9lbmQ7CisKKwltZW1jcHkoJmJkLCAoYmRfdCAqKXIzLCBzaXplb2YoYmQpKTsKKwlsb2FkZXJfaW5mby5pbml0cmRfYWRkciA9IHI0OworCWxvYWRlcl9pbmZvLmluaXRyZF9zaXplID0gcjQgPyByNSA6IDA7CisJbG9hZGVyX2luZm8uY21kbGluZSA9IChjaGFyICopcjY7CisJbG9hZGVyX2luZm8uY21kbGluZV9sZW4gPSByNyAtIHI2OworCisJc2ltcGxlX2FsbG9jX2luaXQoX2VuZCwgYXZhaWxfcmFtIC0gMTAyNCoxMDI0LCAzMiwgNjQpOworCWZ0X2luaXQoX2R0Yl9zdGFydCwgX2R0Yl9lbmQgLSBfZHRiX3N0YXJ0LCAzMik7CisJc2VyaWFsX2NvbnNvbGVfaW5pdCgpOworCXBsYXRmb3JtX29wcy5maXh1cHMgPSBwbGF0Zm9ybV9maXh1cHM7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kZXZ0cmVlLmMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kZXZ0cmVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk5NTE1NQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2RldnRyZWUuYwpAQCAtMCwwICsxLDMwNyBAQAorLyoKKyAqIGRldnRyZWUuYyAtIGNvbnZlbmllbmNlIGZ1bmN0aW9ucyBmb3IgZGV2aWNlIHRyZWUgbWFuaXB1bGF0aW9uCisgKiBDb3B5cmlnaHQgMjAwNyBEYXZpZCBHaWJzb24sIElCTSBDb3Jwb3JhdGlvbi4KKyAqIENvcHlyaWdodCAoYykgMjAwNyBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICoKKyAqIEF1dGhvcnM6IERhdmlkIEdpYnNvbiA8ZGF2aWRAZ2lic29uLmRyb3BiZWFyLmlkLmF1PgorICoJICAgIFNjb3R0IFdvb2QgPHNjb3R0d29vZEBmcmVlc2NhbGUuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlICJ0eXBlcy5oIgorI2luY2x1ZGUgInN0cmluZy5oIgorI2luY2x1ZGUgInN0ZGlvLmgiCisjaW5jbHVkZSAib3BzLmgiCisKK3ZvaWQgZHRfZml4dXBfbWVtb3J5KHU2NCBzdGFydCwgdTY0IHNpemUpCit7CisJdm9pZCAqcm9vdCwgKm1lbW9yeTsKKwlpbnQgbmFkZHIsIG5zaXplLCBpOworCXUzMiBtZW1yZWdbNF07CisKKwlyb290ID0gZmluZGRldmljZSgiLyIpOworCWlmIChnZXRwcm9wKHJvb3QsICIjYWRkcmVzcy1jZWxscyIsICZuYWRkciwgc2l6ZW9mKG5hZGRyKSkgPCAwKQorCQluYWRkciA9IDI7CisJaWYgKG5hZGRyIDwgMSB8fCBuYWRkciA+IDIpCisJCWZhdGFsKCJDYW4ndCBjb3BlIHdpdGggI2FkZHJlc3MtY2VsbHMgPT0gJWQgaW4gL1xuXHIiLCBuYWRkcik7CisKKwlpZiAoZ2V0cHJvcChyb290LCAiI3NpemUtY2VsbHMiLCAmbnNpemUsIHNpemVvZihuc2l6ZSkpIDwgMCkKKwkJbnNpemUgPSAxOworCWlmIChuc2l6ZSA8IDEgfHwgbnNpemUgPiAyKQorCQlmYXRhbCgiQ2FuJ3QgY29wZSB3aXRoICNzaXplLWNlbGxzID09ICVkIGluIC9cblxyIiwgbnNpemUpOworCisJaSA9IDA7CisJaWYgKG5hZGRyID09IDIpCisJCW1lbXJlZ1tpKytdID0gc3RhcnQgPj4gMzI7CisJbWVtcmVnW2krK10gPSBzdGFydCAmIDB4ZmZmZmZmZmY7CisJaWYgKG5zaXplID09IDIpCisJCW1lbXJlZ1tpKytdID0gc2l6ZSA+PiAzMjsKKwltZW1yZWdbaSsrXSA9IHNpemUgJiAweGZmZmZmZmZmOworCisJbWVtb3J5ID0gZmluZGRldmljZSgiL21lbW9yeSIpOworCWlmICghIG1lbW9yeSkgeworCQltZW1vcnkgPSBjcmVhdGVfbm9kZShOVUxMLCAibWVtb3J5Iik7CisJCXNldHByb3Bfc3RyKG1lbW9yeSwgImRldmljZV90eXBlIiwgIm1lbW9yeSIpOworCX0KKworCXByaW50ZigiTWVtb3J5IDwtIDwweCV4IiwgbWVtcmVnWzBdKTsKKwlmb3IgKGkgPSAxOyBpIDwgKG5hZGRyICsgbnNpemUpOyBpKyspCisJCXByaW50ZigiIDB4JXgiLCBtZW1yZWdbaV0pOworCXByaW50ZigiPiAoJWxkTUIpXG5cciIsICh1bnNpZ25lZCBsb25nKShzaXplID4+IDIwKSk7CisKKwlzZXRwcm9wKG1lbW9yeSwgInJlZyIsIG1lbXJlZywgKG5hZGRyICsgbnNpemUpKnNpemVvZih1MzIpKTsKK30KKworI2RlZmluZSBNSFooeCkJKCh4ICsgNTAwMDAwKSAvIDEwMDAwMDApCisKK3ZvaWQgZHRfZml4dXBfY3B1X2Nsb2Nrcyh1MzIgY3B1LCB1MzIgdGIsIHUzMiBidXMpCit7CisJdm9pZCAqZGV2cCA9IE5VTEw7CisKKwlwcmludGYoIkNQVSBjbG9jay1mcmVxdWVuY3kgPC0gMHgleCAoJWRNSHopXG5cciIsIGNwdSwgTUhaKGNwdSkpOworCXByaW50ZigiQ1BVIHRpbWViYXNlLWZyZXF1ZW5jeSA8LSAweCV4ICglZE1IeilcblxyIiwgdGIsIE1IWih0YikpOworCWlmIChidXMgPiAwKQorCQlwcmludGYoIkNQVSBidXMtZnJlcXVlbmN5IDwtIDB4JXggKCVkTUh6KVxuXHIiLCBidXMsIE1IWihidXMpKTsKKworCXdoaWxlICgoZGV2cCA9IGZpbmRfbm9kZV9ieV9kZXZ0eXBlKGRldnAsICJjcHUiKSkpIHsKKwkJc2V0cHJvcF92YWwoZGV2cCwgImNsb2NrLWZyZXF1ZW5jeSIsIGNwdSk7CisJCXNldHByb3BfdmFsKGRldnAsICJ0aW1lYmFzZS1mcmVxdWVuY3kiLCB0Yik7CisJCWlmIChidXMgPiAwKQorCQkJc2V0cHJvcF92YWwoZGV2cCwgImJ1cy1mcmVxdWVuY3kiLCBidXMpOworCX0KK30KKwordm9pZCBkdF9maXh1cF9jbG9jayhjb25zdCBjaGFyICpwYXRoLCB1MzIgZnJlcSkKK3sKKwl2b2lkICpkZXZwID0gZmluZGRldmljZShwYXRoKTsKKworCWlmIChkZXZwKSB7CisJCXByaW50ZigiJXM6IGNsb2NrLWZyZXF1ZW5jeSA8LSAleCAoJWRNSHopXG5cciIsIHBhdGgsIGZyZXEsIE1IWihmcmVxKSk7CisJCXNldHByb3BfdmFsKGRldnAsICJjbG9jay1mcmVxdWVuY3kiLCBmcmVxKTsKKwl9Cit9CisKK3ZvaWQgX19kdF9maXh1cF9tYWNfYWRkcmVzc2VzKHUzMiBzdGFydGluZGV4LCAuLi4pCit7CisJdmFfbGlzdCBhcDsKKwl1MzIgaW5kZXggPSBzdGFydGluZGV4OworCXZvaWQgKmRldnA7CisJY29uc3QgdTggKmFkZHI7CisKKwl2YV9zdGFydChhcCwgc3RhcnRpbmRleCk7CisJd2hpbGUgKChhZGRyID0gdmFfYXJnKGFwLCBjb25zdCB1OCAqKSkpIHsKKwkJZGV2cCA9IGZpbmRfbm9kZV9ieV9wcm9wX3ZhbHVlKE5VTEwsICJsaW51eCxuZXR3b3JrLWluZGV4IiwKKwkJCQkJICAgICAgICh2b2lkKikmaW5kZXgsIHNpemVvZihpbmRleCkpOworCisJCXByaW50ZigiRU5FVCVkOiBsb2NhbC1tYWMtYWRkcmVzcyA8LSIKKwkJICAgICAgICIgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcblxyIiwgaW5kZXgsCisJCSAgICAgICBhZGRyWzBdLCBhZGRyWzFdLCBhZGRyWzJdLCBhZGRyWzNdLCBhZGRyWzRdLCBhZGRyWzVdKTsKKworCQlpZiAoZGV2cCkKKwkJCXNldHByb3AoZGV2cCwgImxvY2FsLW1hYy1hZGRyZXNzIiwgYWRkciwgNik7CisKKwkJaW5kZXgrKzsKKwl9CisJdmFfZW5kKGFwKTsKK30KKworI2RlZmluZSBNQVhfQUREUl9DRUxMUyA0CisjZGVmaW5lIE1BWF9SQU5HRVMgOAorCitzdGF0aWMgdm9pZCBnZXRfcmVnX2Zvcm1hdCh2b2lkICpub2RlLCB1MzIgKm5hZGRyLCB1MzIgKm5zaXplKQoreworCWlmIChnZXRwcm9wKG5vZGUsICIjYWRkcmVzcy1jZWxscyIsIG5hZGRyLCA0KSAhPSA0KQorCQkqbmFkZHIgPSAyOworCWlmIChnZXRwcm9wKG5vZGUsICIjc2l6ZS1jZWxscyIsIG5zaXplLCA0KSAhPSA0KQorCQkqbnNpemUgPSAxOworfQorCitzdGF0aWMgdm9pZCBjb3B5X3ZhbCh1MzIgKmRlc3QsIHUzMiAqc3JjLCBpbnQgbmFkZHIpCit7CisJaW50IHBhZCA9IE1BWF9BRERSX0NFTExTIC0gbmFkZHI7CisKKwltZW1zZXQoZGVzdCwgMCwgcGFkICogNCk7CisJbWVtY3B5KGRlc3QgKyBwYWQsIHNyYywgbmFkZHIgKiA0KTsKK30KKworc3RhdGljIGludCBzdWJfcmVnKHUzMiAqcmVnLCB1MzIgKnN1YikKK3sKKwlpbnQgaSwgYm9ycm93ID0gMDsKKworCWZvciAoaSA9IE1BWF9BRERSX0NFTExTIC0gMTsgaSA+PSAwOyBpLS0pIHsKKwkJaW50IHByZXZfYm9ycm93ID0gYm9ycm93OworCQlib3Jyb3cgPSByZWdbaV0gPCBzdWJbaV0gKyBwcmV2X2JvcnJvdzsKKwkJcmVnW2ldIC09IHN1YltpXSArIHByZXZfYm9ycm93OworCX0KKworCXJldHVybiAhYm9ycm93OworfQorCitzdGF0aWMgaW50IGFkZF9yZWcodTMyICpyZWcsIHUzMiAqYWRkLCBpbnQgbmFkZHIpCit7CisJaW50IGksIGNhcnJ5ID0gMDsKKworCWZvciAoaSA9IE1BWF9BRERSX0NFTExTIC0gMTsgaSA+PSBNQVhfQUREUl9DRUxMUyAtIG5hZGRyOyBpLS0pIHsKKwkJdTY0IHRtcCA9ICh1NjQpcmVnW2ldICsgYWRkW2ldICsgY2Fycnk7CisJCWNhcnJ5ID0gdG1wID4+IDMyOworCQlyZWdbaV0gPSAodTMyKXRtcDsKKwl9CisKKwlyZXR1cm4gIWNhcnJ5OworfQorCisvKiBJdCBpcyBhc3N1bWVkIHRoYXQgaWYgdGhlIGZpcnN0IGJ5dGUgb2YgcmVnIGZpdHMgaW4gYQorICogcmFuZ2UsIHRoZW4gdGhlIHdob2xlIHJlZyBibG9jayBmaXRzLgorICovCitzdGF0aWMgaW50IGNvbXBhcmVfcmVnKHUzMiAqcmVnLCB1MzIgKnJhbmdlLCB1MzIgKnJhbmdlc2l6ZSkKK3sKKwlpbnQgaTsKKwl1MzIgZW5kOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9BRERSX0NFTExTOyBpKyspIHsKKwkJaWYgKHJlZ1tpXSA8IHJhbmdlW2ldKQorCQkJcmV0dXJuIDA7CisJCWlmIChyZWdbaV0gPiByYW5nZVtpXSkKKwkJCWJyZWFrOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBNQVhfQUREUl9DRUxMUzsgaSsrKSB7CisJCWVuZCA9IHJhbmdlW2ldICsgcmFuZ2VzaXplW2ldOworCisJCWlmIChyZWdbaV0gPCBlbmQpCisJCQlicmVhazsKKwkJaWYgKHJlZ1tpXSA+IGVuZCkKKwkJCXJldHVybiAwOworCX0KKworCXJldHVybiByZWdbaV0gIT0gZW5kOworfQorCisvKiByZWcgbXVzdCBiZSBNQVhfQUREUl9DRUxMUyAqLworc3RhdGljIGludCBmaW5kX3JhbmdlKHUzMiAqcmVnLCB1MzIgKnJhbmdlcywgaW50IG5yZWdhZGRyLAorICAgICAgICAgICAgICAgICAgICAgIGludCBuYWRkciwgaW50IG5zaXplLCBpbnQgYnVmbGVuKQoreworCWludCBucmFuZ2UgPSBucmVnYWRkciArIG5hZGRyICsgbnNpemU7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpICsgbnJhbmdlIDw9IGJ1ZmxlbjsgaSArPSBucmFuZ2UpIHsKKwkJdTMyIHJhbmdlX2FkZHJbTUFYX0FERFJfQ0VMTFNdOworCQl1MzIgcmFuZ2Vfc2l6ZVtNQVhfQUREUl9DRUxMU107CisKKwkJY29weV92YWwocmFuZ2VfYWRkciwgcmFuZ2VzICsgaSwgbmFkZHIpOworCQljb3B5X3ZhbChyYW5nZV9zaXplLCByYW5nZXMgKyBpICsgbnJlZ2FkZHIgKyBuYWRkciwgbnNpemUpOworCisJCWlmIChjb21wYXJlX3JlZyhyZWcsIHJhbmdlX2FkZHIsIHJhbmdlX3NpemUpKQorCQkJcmV0dXJuIGk7CisJfQorCisJcmV0dXJuIC0xOworfQorCisvKiBDdXJyZW50bHkgb25seSBnZW5lcmljIGJ1c2VzIHdpdGhvdXQgc3BlY2lhbCBlbmNvZGluZ3MgYXJlIHN1cHBvcnRlZC4KKyAqIEluIHBhcnRpY3VsYXIsIFBDSSBpcyBub3Qgc3VwcG9ydGVkLiAgQWxzbywgb25seSB0aGUgYmVnaW5uaW5nIG9mIHRoZQorICogcmVnIGJsb2NrIGlzIHRyYWNrZWQ7IHNpemUgaXMgaWdub3JlZCBleGNlcHQgaW4gcmFuZ2VzLgorICovCitzdGF0aWMgdTMyIGR0X3hsYXRlX2J1ZltNQVhfQUREUl9DRUxMUyAqIE1BWF9SQU5HRVMgKiAzXTsKKworc3RhdGljIGludCBkdF94bGF0ZSh2b2lkICpub2RlLCBpbnQgcmVzLCBpbnQgcmVnbGVuLCB1bnNpZ25lZCBsb25nICphZGRyLAorCQl1bnNpZ25lZCBsb25nICpzaXplKQoreworCXUzMiBsYXN0X2FkZHJbTUFYX0FERFJfQ0VMTFNdOworCXUzMiB0aGlzX2FkZHJbTUFYX0FERFJfQ0VMTFNdOworCXZvaWQgKnBhcmVudDsKKwl1NjQgcmV0X2FkZHIsIHJldF9zaXplOworCXUzMiBuYWRkciwgbnNpemUsIHByZXZfbmFkZHI7CisJaW50IGJ1Zmxlbiwgb2Zmc2V0OworCisJcGFyZW50ID0gZ2V0X3BhcmVudChub2RlKTsKKwlpZiAoIXBhcmVudCkKKwkJcmV0dXJuIDA7CisKKwlnZXRfcmVnX2Zvcm1hdChwYXJlbnQsICZuYWRkciwgJm5zaXplKTsKKworCWlmIChuc2l6ZSA+IDIpCisJCXJldHVybiAwOworCisJb2Zmc2V0ID0gKG5hZGRyICsgbnNpemUpICogcmVzOworCisJaWYgKHJlZ2xlbiA8IG9mZnNldCArIG5hZGRyICsgbnNpemUgfHwKKwkgICAgc2l6ZW9mKGR0X3hsYXRlX2J1ZikgPCBvZmZzZXQgKyBuYWRkciArIG5zaXplKQorCQlyZXR1cm4gMDsKKworCWNvcHlfdmFsKGxhc3RfYWRkciwgZHRfeGxhdGVfYnVmICsgb2Zmc2V0LCBuYWRkcik7CisKKwlyZXRfc2l6ZSA9IGR0X3hsYXRlX2J1ZltvZmZzZXQgKyBuYWRkcl07CisJaWYgKG5zaXplID09IDIpIHsKKwkJcmV0X3NpemUgPDw9IDMyOworCQlyZXRfc2l6ZSB8PSBkdF94bGF0ZV9idWZbb2Zmc2V0ICsgbmFkZHIgKyAxXTsKKwl9CisKKwl3aGlsZSAoKG5vZGUgPSBnZXRfcGFyZW50KG5vZGUpKSkgeworCQlwcmV2X25hZGRyID0gbmFkZHI7CisKKwkJZ2V0X3JlZ19mb3JtYXQobm9kZSwgJm5hZGRyLCAmbnNpemUpOworCisJCWJ1ZmxlbiA9IGdldHByb3Aobm9kZSwgInJhbmdlcyIsIGR0X3hsYXRlX2J1ZiwKKwkJCQlzaXplb2YoZHRfeGxhdGVfYnVmKSk7CisJCWlmIChidWZsZW4gPCAwKQorCQkJY29udGludWU7CisJCWlmIChidWZsZW4gPiBzaXplb2YoZHRfeGxhdGVfYnVmKSkKKwkJCXJldHVybiAwOworCisJCW9mZnNldCA9IGZpbmRfcmFuZ2UobGFzdF9hZGRyLCBkdF94bGF0ZV9idWYsIHByZXZfbmFkZHIsCisJCSAgICAgICAgICAgICAgICAgICAgbmFkZHIsIG5zaXplLCBidWZsZW4gLyA0KTsKKworCQlpZiAob2Zmc2V0IDwgMCkKKwkJCXJldHVybiAwOworCisJCWNvcHlfdmFsKHRoaXNfYWRkciwgZHRfeGxhdGVfYnVmICsgb2Zmc2V0LCBwcmV2X25hZGRyKTsKKworCQlpZiAoIXN1Yl9yZWcobGFzdF9hZGRyLCB0aGlzX2FkZHIpKQorCQkJcmV0dXJuIDA7CisKKwkJY29weV92YWwodGhpc19hZGRyLCBkdF94bGF0ZV9idWYgKyBvZmZzZXQgKyBwcmV2X25hZGRyLCBuYWRkcik7CisKKwkJaWYgKCFhZGRfcmVnKGxhc3RfYWRkciwgdGhpc19hZGRyLCBuYWRkcikpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAobmFkZHIgPiAyKQorCQlyZXR1cm4gMDsKKworCXJldF9hZGRyID0gKCh1NjQpbGFzdF9hZGRyWzJdIDw8IDMyKSB8IGxhc3RfYWRkclszXTsKKworCWlmIChzaXplb2Yodm9pZCAqKSA9PSA0ICYmCisJICAgIChyZXRfYWRkciA+PSAweDEwMDAwMDAwMFVMTCB8fCByZXRfc2l6ZSA+IDB4MTAwMDAwMDAwVUxMIHx8CisJICAgICByZXRfYWRkciArIHJldF9zaXplID4gMHgxMDAwMDAwMDBVTEwpKQorCQlyZXR1cm4gMDsKKworCSphZGRyID0gcmV0X2FkZHI7CisJaWYgKHNpemUpCisJCSpzaXplID0gcmV0X3NpemU7CisKKwlyZXR1cm4gMTsKK30KKworaW50IGR0X3hsYXRlX3JlZyh2b2lkICpub2RlLCBpbnQgcmVzLCB1bnNpZ25lZCBsb25nICphZGRyLCB1bnNpZ25lZCBsb25nICpzaXplKQoreworCWludCByZWdsZW47CisKKwlyZWdsZW4gPSBnZXRwcm9wKG5vZGUsICJyZWciLCBkdF94bGF0ZV9idWYsIHNpemVvZihkdF94bGF0ZV9idWYpKSAvIDQ7CisJcmV0dXJuIGR0X3hsYXRlKG5vZGUsIHJlcywgcmVnbGVuLCBhZGRyLCBzaXplKTsKK30KKworaW50IGR0X3hsYXRlX2FkZHIodm9pZCAqbm9kZSwgdTMyICpidWYsIGludCBidWZsZW4sIHVuc2lnbmVkIGxvbmcgKnhsYXRlZF9hZGRyKQoreworCisJaWYgKGJ1ZmxlbiA+IHNpemVvZihkdF94bGF0ZV9idWYpKQorCQlyZXR1cm4gMDsKKworCW1lbWNweShkdF94bGF0ZV9idWYsIGJ1ZiwgYnVmbGVuKTsKKwlyZXR1cm4gZHRfeGxhdGUobm9kZSwgMCwgYnVmbGVuIC8gNCwgeGxhdGVkX2FkZHIsIE5VTEwpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2t1cm9ib3hIRC5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMva3Vyb2JveEhELmR0cwppbmRleCBiODk3OTE4Li4xNTdkYzk4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMva3Vyb2JveEhELmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMva3Vyb2JveEhELmR0cwpAQCAtMjksNyArMjksNiBAQAogCiAJY3B1cyB7CiAJCWxpbnV4LHBoYW5kbGUgPSA8MjAwMD47Ci0JCSNjcHVzID0gPDE+OwogCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKIAkJI3NpemUtY2VsbHMgPSA8MD47CiAKQEAgLTEyNiwxNyArMTI1LDE3IEBACiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPDQ0MDA+OwogCQkJaW50ZXJydXB0LW1hcC1tYXNrID0gPGY4MDAgMCAwIDc+OwogCQkJaW50ZXJydXB0LW1hcCA9IDwKLQkJCQkvKiBJRFNFTCAweDExIC0gSVJRMCBFVEggKi8KKwkJCQkvKiBJRFNFTCAxMSAtIElSUTAgRVRIICovCiAJCQkJNTgwMCAwIDAgMSA0NDAwIDAgMQogCQkJCTU4MDAgMCAwIDIgNDQwMCAxIDEKIAkJCQk1ODAwIDAgMCAzIDQ0MDAgMiAxCiAJCQkJNTgwMCAwIDAgNCA0NDAwIDMgMQotCQkJCS8qIElEU0VMIDB4MTIgLSBJUlExIElERTAgKi8KKwkJCQkvKiBJRFNFTCAxMiAtIElSUTEgSURFMCAqLwogCQkJCTYwMDAgMCAwIDEgNDQwMCAxIDEKIAkJCQk2MDAwIDAgMCAyIDQ0MDAgMiAxCiAJCQkJNjAwMCAwIDAgMyA0NDAwIDMgMQogCQkJCTYwMDAgMCAwIDQgNDQwMCAwIDEKLQkJCQkvKiBJRFNFTCAweDE0IC0gSVJRMyBVU0IyLjAgKi8KKwkJCQkvKiBJRFNFTCAxNCAtIElSUTMgVVNCMi4wICovCiAJCQkJNzAwMCAwIDAgMSA0NDAwIDMgMQogCQkJCTcwMDAgMCAwIDIgNDQwMCAzIDEKIAkJCQk3MDAwIDAgMCAzIDQ0MDAgMyAxCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMva3Vyb2JveEhHLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9rdXJvYm94SEcuZHRzCmluZGV4IDc1MzEwMjcuLjkxOWViMjkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9rdXJvYm94SEcuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9rdXJvYm94SEcuZHRzCkBAIC0yOSw3ICsyOSw2IEBACiAKIAljcHVzIHsKIAkJbGludXgscGhhbmRsZSA9IDwyMDAwPjsKLQkJI2NwdXMgPSA8MT47CiAJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwogCQkjc2l6ZS1jZWxscyA9IDwwPjsKIApAQCAtMTI2LDE3ICsxMjUsMTcgQEAKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8NDQwMD47CiAJCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8ZjgwMCAwIDAgNz47CiAJCQlpbnRlcnJ1cHQtbWFwID0gPAotCQkJCS8qIElEU0VMIDB4MTEgLSBJUlEwIEVUSCAqLworCQkJCS8qIElEU0VMIDExIC0gSVJRMCBFVEggKi8KIAkJCQk1ODAwIDAgMCAxIDQ0MDAgMCAxCiAJCQkJNTgwMCAwIDAgMiA0NDAwIDEgMQogCQkJCTU4MDAgMCAwIDMgNDQwMCAyIDEKIAkJCQk1ODAwIDAgMCA0IDQ0MDAgMyAxCi0JCQkJLyogSURTRUwgMHgxMiAtIElSUTEgSURFMCAqLworCQkJCS8qIElEU0VMIDEyIC0gSVJRMSBJREUwICovCiAJCQkJNjAwMCAwIDAgMSA0NDAwIDEgMQogCQkJCTYwMDAgMCAwIDIgNDQwMCAyIDEKIAkJCQk2MDAwIDAgMCAzIDQ0MDAgMyAxCiAJCQkJNjAwMCAwIDAgNCA0NDAwIDAgMQotCQkJCS8qIElEU0VMIDB4MTQgLSBJUlEzIFVTQjIuMCAqLworCQkJCS8qIElEU0VMIDE0IC0gSVJRMyBVU0IyLjAgKi8KIAkJCQk3MDAwIDAgMCAxIDQ0MDAgMyAxCiAJCQkJNzAwMCAwIDAgMiA0NDAwIDMgMQogCQkJCTcwMDAgMCAwIDMgNDQwMCAzIDEKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9saXRlNTIwMC5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbGl0ZTUyMDAuZHRzCmluZGV4IGMwMzEwM2MuLmJhNTRjNmIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9saXRlNTIwMC5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2xpdGU1MjAwLmR0cwpAQCAtMjQsNyArMjQsNiBAQAogCSNzaXplLWNlbGxzID0gPDE+OwogCiAJY3B1cyB7Ci0JCSNjcHVzID0gPDE+OwogCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKIAkJI3NpemUtY2VsbHMgPSA8MD47CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9saXRlNTIwMGIuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2xpdGU1MjAwYi5kdHMKaW5kZXggMzg3NWNhOS4uMmUwMDMwOCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2xpdGU1MjAwYi5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2xpdGU1MjAwYi5kdHMKQEAgLTI0LDcgKzI0LDYgQEAKIAkjc2l6ZS1jZWxscyA9IDwxPjsKIAogCWNwdXMgewotCQkjY3B1cyA9IDwxPjsKIAkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CiAJCSNzaXplLWNlbGxzID0gPDA+OwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjNzQ0OGhwYzIuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzc0NDhocGMyLmR0cwppbmRleCA0MWQwNzIwYy4uNmZhMzc1NCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzc0NDhocGMyLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjNzQ0OGhwYzIuZHRzCkBAIC0xOSw3ICsxOSw2IEBACiAJbGludXgscGhhbmRsZSA9IDwxMDA+OwogCiAJY3B1cyB7Ci0JCSNjcHVzID0gPDE+OwogCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKIAkJI3NpemUtY2VsbHMgPTwwPjsKIAkJbGludXgscGhhbmRsZSA9IDwyMDA+OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgyNzJhZHMuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgyNzJhZHMuZHRzCmluZGV4IDI2MGIyZTQuLjQyM2VlZGMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MjcyYWRzLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODI3MmFkcy5kdHMKQEAgLTE3LDcgKzE3LDYgQEAKICAgICAgICBsaW51eCxwaGFuZGxlID0gPDEwMD47CiAKICAgICAgICBjcHVzIHsKLSAgICAgICAgICAgICAgICNjcHVzID0gPDE+OwogICAgICAgICAgICAgICAgI2FkZHJlc3MtY2VsbHMgPSA8MT47CiAgICAgICAgICAgICAgICAjc2l6ZS1jZWxscyA9IDwwPjsKICAgICAgICAgICAgICAgIGxpbnV4LHBoYW5kbGUgPSA8MjAwPjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzEzZXJkYi5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODMxM2VyZGIuZHRzCmluZGV4IDZkNzIxOTAuLmExNTMzY2MgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzEzZXJkYi5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzMTNlcmRiLmR0cwpAQCAtMTYsNyArMTYsNiBAQAogCSNzaXplLWNlbGxzID0gPDE+OwogCiAJY3B1cyB7Ci0JCSNjcHVzID0gPDE+OwogCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKIAkJI3NpemUtY2VsbHMgPSA8MD47CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzJ4X21kcy5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODMyeF9tZHMuZHRzCmluZGV4IDA2YjMxMDYuLmM3OTg0OTEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzJ4X21kcy5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzMnhfbWRzLmR0cwpAQCAtMTYsNyArMTYsNiBAQAogCSNzaXplLWNlbGxzID0gPDE+OwogCiAJY3B1cyB7Ci0JCSNjcHVzID0gPDE+OwogCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKIAkJI3NpemUtY2VsbHMgPSA8MD47CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzJ4X3JkYi5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODMyeF9yZGIuZHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1NWJjZWQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODMyeF9yZGIuZHRzCkBAIC0wLDAgKzEsMjkxIEBACisvKgorICogTVBDODMyeCBSREIgRGV2aWNlIFRyZWUgU291cmNlCisgKgorICogQ29weXJpZ2h0IDIwMDcgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworLyB7CisJbW9kZWwgPSAiTVBDODMyM0VSREIiOworCWNvbXBhdGlibGUgPSAiTVBDODMyM0VSREIiLCAiTVBDODMyeFJEQiIsICJNUEM4M3h4UkRCIjsKKwkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkjc2l6ZS1jZWxscyA9IDwxPjsKKworCWNwdXMgeworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MD47CisKKwkJUG93ZXJQQyw4MzIzQDAgeworCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKKwkJCXJlZyA9IDwwPjsKKwkJCWQtY2FjaGUtbGluZS1zaXplID0gPDIwPjsJLy8gMzIgYnl0ZXMKKwkJCWktY2FjaGUtbGluZS1zaXplID0gPDIwPjsJLy8gMzIgYnl0ZXMKKwkJCWQtY2FjaGUtc2l6ZSA9IDw0MDAwPjsJCS8vIEwxLCAxNksKKwkJCWktY2FjaGUtc2l6ZSA9IDw0MDAwPjsJCS8vIEwxLCAxNksKKwkJCXRpbWViYXNlLWZyZXF1ZW5jeSA9IDwwPjsKKwkJCWJ1cy1mcmVxdWVuY3kgPSA8MD47CisJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CisJCQkzMi1iaXQ7CisJCX07CisJfTsKKworCW1lbW9yeSB7CisJCWRldmljZV90eXBlID0gIm1lbW9yeSI7CisJCXJlZyA9IDwwMDAwMDAwMCAwNDAwMDAwMD47CisJfTsKKworCXNvYzgzMjNAZTAwMDAwMDAgeworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MT47CisJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47CisJCWRldmljZV90eXBlID0gInNvYyI7CisJCXJhbmdlcyA9IDwwIGUwMDAwMDAwIDAwMTAwMDAwPjsKKwkJcmVnID0gPGUwMDAwMDAwIDAwMDAwMjAwPjsKKwkJYnVzLWZyZXF1ZW5jeSA9IDwwPjsKKworCQl3ZHRAMjAwIHsKKwkJCWRldmljZV90eXBlID0gIndhdGNoZG9nIjsKKwkJCWNvbXBhdGlibGUgPSAibXBjODN4eF93ZHQiOworCQkJcmVnID0gPDIwMCAxMDA+OworCQl9OworCisJCWkyY0AzMDAwIHsKKwkJCWRldmljZV90eXBlID0gImkyYyI7CisJCQljb21wYXRpYmxlID0gImZzbC1pMmMiOworCQkJcmVnID0gPDMwMDAgMTAwPjsKKwkJCWludGVycnVwdHMgPSA8ZSA4PjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8JnBpYz47CisJCQlkZnNycjsKKwkJfTsKKworCQlzZXJpYWxANDUwMCB7CisJCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOworCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKKwkJCXJlZyA9IDw0NTAwIDEwMD47CisJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CisJCQlpbnRlcnJ1cHRzID0gPDkgOD47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZwaWM+OworCQl9OworCisJCXNlcmlhbEA0NjAwIHsKKwkJCWRldmljZV90eXBlID0gInNlcmlhbCI7CisJCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOworCQkJcmVnID0gPDQ2MDAgMTAwPjsKKwkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKKwkJCWludGVycnVwdHMgPSA8YSA4PjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8JnBpYz47CisJCX07CisKKwkJY3J5cHRvQDMwMDAwIHsKKwkJCWRldmljZV90eXBlID0gImNyeXB0byI7CisJCQltb2RlbCA9ICJTRUMyIjsKKwkJCWNvbXBhdGlibGUgPSAidGFsaXRvcyI7CisJCQlyZWcgPSA8MzAwMDAgNzAwMD47CisJCQlpbnRlcnJ1cHRzID0gPGIgOD47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZwaWM+OworCQkJLyogUmV2LiAyLjIgKi8KKwkJCW51bS1jaGFubmVscyA9IDwxPjsKKwkJCWNoYW5uZWwtZmlmby1sZW4gPSA8MTg+OworCQkJZXhlYy11bml0cy1tYXNrID0gPDAwMDAwMDRjPjsKKwkJCWRlc2NyaXB0b3ItdHlwZXMtbWFzayA9IDwwMTIyMDAzZj47CisJCX07CisKKwkJcGNpQDg1MDAgeworCQkJaW50ZXJydXB0LW1hcC1tYXNrID0gPGY4MDAgMCAwIDc+OworCQkJaW50ZXJydXB0LW1hcCA9IDwKKwkJCQkJLyogSURTRUwgMHgxMCBBRDE2IChVU0IpICovCisJCQkJCSA4MDAwIDAgMCAxICZwaWMgMTEgOAorCisJCQkJCS8qIElEU0VMIDB4MTEgQUQxNyAoTWluaTEpKi8KKwkJCQkJIDg4MDAgMCAwIDEgJnBpYyAxMiA4CisJCQkJCSA4ODAwIDAgMCAyICZwaWMgMTMgOAorCQkJCQkgODgwMCAwIDAgMyAmcGljIDE0IDgKKwkJCQkJIDg4MDAgMCAwIDQgJnBpYyAzMCA4CisKKwkJCQkJLyogSURTRUwgMHgxMiBBRDE4IChQQ0kvTWluaTIpICovCisJCQkJCSA5MDAwIDAgMCAxICZwaWMgMTMgOAorCQkJCQkgOTAwMCAwIDAgMiAmcGljIDE0IDgKKwkJCQkJIDkwMDAgMCAwIDMgJnBpYyAzMCA4CisJCQkJCSA5MDAwIDAgMCA0ICZwaWMgMTEgOD47CisKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8JnBpYz47CisJCQlpbnRlcnJ1cHRzID0gPDQyIDg+OworCQkJYnVzLXJhbmdlID0gPDAgMD47CisJCQlyYW5nZXMgPSA8NDIwMDAwMDAgMCA4MDAwMDAwMCA4MDAwMDAwMCAwIDEwMDAwMDAwCisJCQkgICAgICAgICAgMDIwMDAwMDAgMCA5MDAwMDAwMCA5MDAwMDAwMCAwIDEwMDAwMDAwCisJCQkgICAgICAgICAgMDEwMDAwMDAgMCBkMDAwMDAwMCBkMDAwMDAwMCAwIDA0MDAwMDAwPjsKKwkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKKwkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwyPjsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCQkJcmVnID0gPDg1MDAgMTAwPjsKKwkJCWNvbXBhdGlibGUgPSAiODN4eCI7CisJCQlkZXZpY2VfdHlwZSA9ICJwY2kiOworCQl9OworCisJCXBpYzpwaWNANzAwIHsKKwkJCWludGVycnVwdC1jb250cm9sbGVyOworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MD47CisJCQkjaW50ZXJydXB0LWNlbGxzID0gPDI+OworCQkJcmVnID0gPDcwMCAxMDA+OworCQkJYnVpbHQtaW47CisJCQlkZXZpY2VfdHlwZSA9ICJpcGljIjsKKwkJfTsKKworCQlwYXJfaW9AMTQwMCB7CisJCQlyZWcgPSA8MTQwMCAxMDA+OworCQkJZGV2aWNlX3R5cGUgPSAicGFyX2lvIjsKKwkJCW51bS1wb3J0cyA9IDw3PjsKKworCQkJdWNjMnBpbzp1Y2NfcGluQDAyIHsKKwkJCQlwaW8tbWFwID0gPAorCQkJLyogcG9ydCAgcGluICBkaXIgIG9wZW5fZHJhaW4gIGFzc2lnbm1lbnQgIGhhc19pcnEgKi8KKwkJCQkJMyAgNCAgMyAgMCAgMiAgMCAJLyogTURJTyAqLworCQkJCQkzICA1ICAxICAwICAyICAwIAkvKiBNREMgKi8KKwkJCQkJMyAxNSAgMiAgMCAgMSAgMCAJLyogUlhfQ0xLIChDTEsxNikgKi8KKwkJCQkJMyAxNyAgMiAgMCAgMSAgMCAJLyogVFhfQ0xLIChDTEszKSAqLworCQkJCQkwIDEyICAxICAwICAxICAwIAkvKiBUeEQwICovCisJCQkJCTAgMTMgIDEgIDAgIDEgIDAgCS8qIFR4RDEgKi8KKwkJCQkJMCAxNCAgMSAgMCAgMSAgMCAJLyogVHhEMiAqLworCQkJCQkwIDE1ICAxICAwICAxICAwIAkvKiBUeEQzICovCisJCQkJCTAgMTYgIDIgIDAgIDEgIDAgCS8qIFJ4RDAgKi8KKwkJCQkJMCAxNyAgMiAgMCAgMSAgMCAJLyogUnhEMSAqLworCQkJCQkwIDE4ICAyICAwICAxICAwIAkvKiBSeEQyICovCisJCQkJCTAgMTkgIDIgIDAgIDEgIDAgCS8qIFJ4RDMgKi8KKwkJCQkJMCAxYSAgMiAgMCAgMSAgMCAJLyogUlhfRVIgKi8KKwkJCQkJMCAxYiAgMSAgMCAgMSAgMCAJLyogVFhfRVIgKi8KKwkJCQkJMCAxYyAgMiAgMCAgMSAgMCAJLyogUlhfRFYgKi8KKwkJCQkJMCAxZCAgMiAgMCAgMSAgMCAJLyogQ09MICovCisJCQkJCTAgMWUgIDEgIDAgIDEgIDAgCS8qIFRYX0VOICovCisJCQkJCTAgMWYgIDIgIDAgIDEgIDA+OyAgICAgIC8qIENSUyAqLworCQkJfTsKKwkJCXVjYzNwaW86dWNjX3BpbkAwMyB7CisJCQkJcGlvLW1hcCA9IDwKKwkJCS8qIHBvcnQgIHBpbiAgZGlyICBvcGVuX2RyYWluICBhc3NpZ25tZW50ICBoYXNfaXJxICovCisJCQkJCTAgIGQgIDIgIDAgIDEgIDAgCS8qIFJYX0NMSyAoQ0xLOSkgKi8KKwkJCQkJMyAxOCAgMiAgMCAgMSAgMCAJLyogVFhfQ0xLIChDTEsxMCkgKi8KKwkJCQkJMSAgMCAgMSAgMCAgMSAgMCAJLyogVHhEMCAqLworCQkJCQkxICAxICAxICAwICAxICAwIAkvKiBUeEQxICovCisJCQkJCTEgIDIgIDEgIDAgIDEgIDAgCS8qIFR4RDIgKi8KKwkJCQkJMSAgMyAgMSAgMCAgMSAgMCAJLyogVHhEMyAqLworCQkJCQkxICA0ICAyICAwICAxICAwIAkvKiBSeEQwICovCisJCQkJCTEgIDUgIDIgIDAgIDEgIDAgCS8qIFJ4RDEgKi8KKwkJCQkJMSAgNiAgMiAgMCAgMSAgMCAJLyogUnhEMiAqLworCQkJCQkxICA3ICAyICAwICAxICAwIAkvKiBSeEQzICovCisJCQkJCTEgIDggIDIgIDAgIDEgIDAgCS8qIFJYX0VSICovCisJCQkJCTEgIDkgIDEgIDAgIDEgIDAgCS8qIFRYX0VSICovCisJCQkJCTEgIGEgIDIgIDAgIDEgIDAgCS8qIFJYX0RWICovCisJCQkJCTEgIGIgIDIgIDAgIDEgIDAgCS8qIENPTCAqLworCQkJCQkxICBjICAxICAwICAxICAwIAkvKiBUWF9FTiAqLworCQkJCQkxICBkICAyICAwICAxICAwPjsgICAgICAvKiBDUlMgKi8KKwkJCX07CisJCX07CisJfTsKKworCXFlQGUwMTAwMDAwIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDE+OworCQlkZXZpY2VfdHlwZSA9ICJxZSI7CisJCW1vZGVsID0gIlFFIjsKKwkJcmFuZ2VzID0gPDAgZTAxMDAwMDAgMDAxMDAwMDA+OworCQlyZWcgPSA8ZTAxMDAwMDAgNDgwPjsKKwkJYnJnLWZyZXF1ZW5jeSA9IDwwPjsKKwkJYnVzLWZyZXF1ZW5jeSA9IDxCQ0QzRDgwPjsKKworCQltdXJhbUAxMDAwMCB7CisJCQlkZXZpY2VfdHlwZSA9ICJtdXJhbSI7CisJCQlyYW5nZXMgPSA8MCAwMDAxMDAwMCAwMDAwNDAwMD47CisKKwkJCWRhdGEtb25seUAwIHsKKwkJCQlyZWcgPSA8MCA0MDAwPjsKKwkJCX07CisJCX07CisKKwkJc3BpQDRjMCB7CisJCQlkZXZpY2VfdHlwZSA9ICJzcGkiOworCQkJY29tcGF0aWJsZSA9ICJmc2xfc3BpIjsKKwkJCXJlZyA9IDw0YzAgNDA+OworCQkJaW50ZXJydXB0cyA9IDwyPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8JnFlaWM+OworCQkJbW9kZSA9ICJjcHUiOworCQl9OworCisJCXNwaUA1MDAgeworCQkJZGV2aWNlX3R5cGUgPSAic3BpIjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsX3NwaSI7CisJCQlyZWcgPSA8NTAwIDQwPjsKKwkJCWludGVycnVwdHMgPSA8MT47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZxZWljPjsKKwkJCW1vZGUgPSAiY3B1IjsKKwkJfTsKKworCQl1Y2NAMzAwMCB7CisJCQlkZXZpY2VfdHlwZSA9ICJuZXR3b3JrIjsKKwkJCWNvbXBhdGlibGUgPSAidWNjX2dldGgiOworCQkJbW9kZWwgPSAiVUNDIjsKKwkJCWRldmljZS1pZCA9IDwyPjsKKwkJCXJlZyA9IDwzMDAwIDIwMD47CisJCQlpbnRlcnJ1cHRzID0gPDIxPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8JnFlaWM+OworCQkJbWFjLWFkZHJlc3MgPSBbIDAwIDA0IDlmIGVmIDAzIDAyIF07CisJCQlyeC1jbG9jayA9IDwyMD47CisJCQl0eC1jbG9jayA9IDwxMz47CisJCQlwaHktaGFuZGxlID0gPCZwaHkwMD47CisJCQlwaW8taGFuZGxlID0gPCZ1Y2MycGlvPjsKKwkJfTsKKworCQl1Y2NAMjIwMCB7CisJCQlkZXZpY2VfdHlwZSA9ICJuZXR3b3JrIjsKKwkJCWNvbXBhdGlibGUgPSAidWNjX2dldGgiOworCQkJbW9kZWwgPSAiVUNDIjsKKwkJCWRldmljZS1pZCA9IDwzPjsKKwkJCXJlZyA9IDwyMjAwIDIwMD47CisJCQlpbnRlcnJ1cHRzID0gPDIyPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8JnFlaWM+OworCQkJbWFjLWFkZHJlc3MgPSBbIDAwIDA0IDlmIGVmIDAzIDAxIF07CisJCQlyeC1jbG9jayA9IDwxOT47CisJCQl0eC1jbG9jayA9IDwxYT47CisJCQlwaHktaGFuZGxlID0gPCZwaHkwND47CisJCQlwaW8taGFuZGxlID0gPCZ1Y2MzcGlvPjsKKwkJfTsKKworCQltZGlvQDMxMjAgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCXJlZyA9IDwzMTIwIDE4PjsKKwkJCWRldmljZV90eXBlID0gIm1kaW8iOworCQkJY29tcGF0aWJsZSA9ICJ1Y2NfZ2V0aF9waHkiOworCisJCQlwaHkwMDpldGhlcm5ldC1waHlAMDAgeworCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JnBpYz47CisJCQkJaW50ZXJydXB0cyA9IDwwPjsKKwkJCQlyZWcgPSA8MD47CisJCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKKwkJCQlpbnRlcmZhY2UgPSA8Mz47IC8vRU5FVF8xMDBfTUlJCisJCQl9OworCQkJcGh5MDQ6ZXRoZXJuZXQtcGh5QDA0IHsKKwkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZwaWM+OworCQkJCWludGVycnVwdHMgPSA8MD47CisJCQkJcmVnID0gPDQ+OworCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CisJCQkJaW50ZXJmYWNlID0gPDM+OworCQkJfTsKKwkJfTsKKworCQlxZWljOnFlaWNAODAgeworCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCQlkZXZpY2VfdHlwZSA9ICJxZWljIjsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDA+OworCQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkJCXJlZyA9IDw4MCA4MD47CisJCQlidWlsdC1pbjsKKwkJCWJpZy1lbmRpYW47CisJCQlpbnRlcnJ1cHRzID0gPDIwIDggMjEgOD47IC8vaGlnaDozMiBsb3c6MzMKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8JnBpYz47CisJCX07CisJfTsKK307CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODM0OWVtaXR4LmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzQ5ZW1pdHguZHRzCmluZGV4IDYxYjU1MGIuLmRiMGQwMDMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzQ5ZW1pdHguZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzQ5ZW1pdHguZHRzCkBAIC0xNSw3ICsxNSw2IEBACiAJI3NpemUtY2VsbHMgPSA8MT47CiAKIAljcHVzIHsKLQkJI2NwdXMgPSA8MT47CiAJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwogCQkjc2l6ZS1jZWxscyA9IDwwPjsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzNDllbWl0eGdwLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzQ5ZW1pdHhncC5kdHMKaW5kZXggYjJlMWE1ZS4uZjYzNjUyOCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzNDllbWl0eGdwLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODM0OWVtaXR4Z3AuZHRzCkBAIC0xNSw3ICsxNSw2IEBACiAJI3NpemUtY2VsbHMgPSA8MT47CiAKIAljcHVzIHsKLQkJI2NwdXMgPSA8MT47CiAJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwogCQkjc2l6ZS1jZWxscyA9IDwwPjsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzNHhfbWRzLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzR4X21kcy5kdHMKaW5kZXggZTRiNDNjMi4uMDdiY2M1MSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzNHhfbWRzLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODM0eF9tZHMuZHRzCkBAIC0xNiw3ICsxNiw2IEBACiAJI3NpemUtY2VsbHMgPSA8MT47CiAKIAljcHVzIHsKLQkJI2NwdXMgPSA8MT47CiAJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwogCQkjc2l6ZS1jZWxscyA9IDwwPjsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzNnhfbWRzLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzZ4X21kcy5kdHMKaW5kZXggNGZlNDVjMC4uN2Y1NzhlYiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzNnhfbWRzLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODM2eF9tZHMuZHRzCkBAIC0yMSw3ICsyMSw2IEBACiAJI3NpemUtY2VsbHMgPSA8MT47CiAKIAljcHVzIHsKLQkJI2NwdXMgPSA8MT47CiAJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwogCQkjc2l6ZS1jZWxscyA9IDwwPjsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NDBhZHMuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NDBhZHMuZHRzCmluZGV4IDNjMDkxN2YuLmYyNjFkNjQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTQwYWRzLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU0MGFkcy5kdHMKQEAgLTE3LDcgKzE3LDYgQEAKIAkjc2l6ZS1jZWxscyA9IDwxPjsKIAogCWNwdXMgewotCQkjY3B1cyA9IDwxPjsKIAkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CiAJCSNzaXplLWNlbGxzID0gPDA+OwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU0MWNkcy5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU0MWNkcy5kdHMKaW5kZXggMmExYWU3Ni4uNWZkY2I2OSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NDFjZHMuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTQxY2RzLmR0cwpAQCAtMTcsNyArMTcsNiBAQAogCSNzaXplLWNlbGxzID0gPDE+OwogCiAJY3B1cyB7Ci0JCSNjcHVzID0gPDE+OwogCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKIAkJI3NpemUtY2VsbHMgPSA8MD47CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTQ0ZHMuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NDRkcy5kdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIwODQ2MAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTQ0ZHMuZHRzCkBAIC0wLDAgKzEsMTM2IEBACisvKgorICogTVBDODU0NCBEUyBEZXZpY2UgVHJlZSBTb3VyY2UKKyAqCisgKiBDb3B5cmlnaHQgMjAwNyBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisvIHsKKwltb2RlbCA9ICJNUEM4NTQ0RFMiOworCWNvbXBhdGlibGUgPSAiTVBDODU0NERTIiwgIk1QQzg1eHhEUyI7CisJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJI3NpemUtY2VsbHMgPSA8MT47CisKKwljcHVzIHsKKwkJI2NwdXMgPSA8MT47CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwwPjsKKworCQlQb3dlclBDLDg1NDRAMCB7CisJCQlkZXZpY2VfdHlwZSA9ICJjcHUiOworCQkJcmVnID0gPDA+OworCQkJZC1jYWNoZS1saW5lLXNpemUgPSA8MjA+OwkvLyAzMiBieXRlcworCQkJaS1jYWNoZS1saW5lLXNpemUgPSA8MjA+OwkvLyAzMiBieXRlcworCQkJZC1jYWNoZS1zaXplID0gPDgwMDA+OwkJLy8gTDEsIDMySworCQkJaS1jYWNoZS1zaXplID0gPDgwMDA+OwkJLy8gTDEsIDMySworCQkJdGltZWJhc2UtZnJlcXVlbmN5ID0gPDA+OworCQkJYnVzLWZyZXF1ZW5jeSA9IDwwPjsKKwkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKKwkJCTMyLWJpdDsKKwkJfTsKKwl9OworCisJbWVtb3J5IHsKKwkJZGV2aWNlX3R5cGUgPSAibWVtb3J5IjsKKwkJcmVnID0gPDAwMDAwMDAwIDAwMDAwMDAwPjsJLy8gRmlsbGVkIGJ5IFUtQm9vdAorCX07CisKKwlzb2M4NTQ0QGUwMDAwMDAwIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDE+OworCQkjaW50ZXJydXB0LWNlbGxzID0gPDI+OworCQlkZXZpY2VfdHlwZSA9ICJzb2MiOworCQlyYW5nZXMgPSA8MCBlMDAwMDAwMCAwMDEwMDAwMD47CisJCXJlZyA9IDxlMDAwMDAwMCAwMDEwMDAwMD47CS8vIENDU1JCQVIgMU0KKwkJYnVzLWZyZXF1ZW5jeSA9IDwwPjsJCS8vIEZpbGxlZCBvdXQgYnkgdWJvb3QuCisKKwkJaTJjQDMwMDAgeworCQkJZGV2aWNlX3R5cGUgPSAiaTJjIjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLWkyYyI7CisJCQlyZWcgPSA8MzAwMCAxMDA+OworCQkJaW50ZXJydXB0cyA9IDwxYiAyPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJZGZzcnI7CisJCX07CisKKwkJbWRpb0AyNDUyMCB7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJZGV2aWNlX3R5cGUgPSAibWRpbyI7CisJCQljb21wYXRpYmxlID0gImdpYW5mYXIiOworCQkJcmVnID0gPDI0NTIwIDIwPjsKKwkJCXBoeTA6IGV0aGVybmV0LXBoeUAwIHsKKwkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDNhIDE+OworCQkJCXJlZyA9IDwwPjsKKwkJCQlkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOworCQkJfTsKKwkJCXBoeTE6IGV0aGVybmV0LXBoeUAxIHsKKwkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDNhIDE+OworCQkJCXJlZyA9IDwxPjsKKwkJCQlkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOworCQkJfTsKKwkJfTsKKworCQlldGhlcm5ldEAyNDAwMCB7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJZGV2aWNlX3R5cGUgPSAibmV0d29yayI7CisJCQltb2RlbCA9ICJUU0VDIjsKKwkJCWNvbXBhdGlibGUgPSAiZ2lhbmZhciI7CisJCQlyZWcgPSA8MjQwMDAgMTAwMD47CisJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKKwkJCWludGVycnVwdHMgPSA8ZCAyIGUgMiAxMiAyPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJcGh5LWhhbmRsZSA9IDwmcGh5MD47CisJCX07CisKKwkJZXRoZXJuZXRAMjYwMDAgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCWRldmljZV90eXBlID0gIm5ldHdvcmsiOworCQkJbW9kZWwgPSAiVFNFQyI7CisJCQljb21wYXRpYmxlID0gImdpYW5mYXIiOworCQkJcmVnID0gPDI2MDAwIDEwMDA+OworCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CisJCQlpbnRlcnJ1cHRzID0gPGYgMiAxMCAyIDExIDI+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCQlwaHktaGFuZGxlID0gPCZwaHkxPjsKKwkJfTsKKworCQlzZXJpYWxANDUwMCB7CisJCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOworCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKKwkJCXJlZyA9IDw0NTAwIDEwMD47CisJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CisJCQlpbnRlcnJ1cHRzID0gPDFhIDI+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCX07CisKKwkJc2VyaWFsQDQ2MDAgeworCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKKwkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CisJCQlyZWcgPSA8NDYwMCAxMDA+OworCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OworCQkJaW50ZXJydXB0cyA9IDwxYSAyPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQl9OworCisJCW1waWM6IHBpY0A0MDAwMCB7CisJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CisJCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDA+OworCQkJI2ludGVycnVwdC1jZWxscyA9IDwyPjsKKwkJCXJlZyA9IDw0MDAwMCA0MDAwMD47CisJCQlidWlsdC1pbjsKKwkJCWNvbXBhdGlibGUgPSAiY2hycCxvcGVuLXBpYyI7CisJCQlkZXZpY2VfdHlwZSA9ICJvcGVuLXBpYyI7CisJCQliaWctZW5kaWFuOworCQl9OworCX07Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NDhjZHMuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NDhjZHMuZHRzCmluZGV4IDdlYjVkODEuLmIyYjIyMDAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTQ4Y2RzLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU0OGNkcy5kdHMKQEAgLTE3LDcgKzE3LDYgQEAKIAkjc2l6ZS1jZWxscyA9IDwxPjsKIAogCWNwdXMgewotCQkjY3B1cyA9IDwxPjsKIAkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CiAJCSNzaXplLWNlbGxzID0gPDA+OwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU1NWNkcy5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU1NWNkcy5kdHMKaW5kZXggNWY5YzEwMi4uNjhhNDc5NSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NTVjZHMuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTU1Y2RzLmR0cwpAQCAtMTcsNyArMTcsNiBAQAogCSNzaXplLWNlbGxzID0gPDE+OwogCiAJY3B1cyB7Ci0JCSNjcHVzID0gPDE+OwogCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKIAkJI3NpemUtY2VsbHMgPSA8MD47CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTYwYWRzLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTYwYWRzLmR0cwppbmRleCAxMDUwMjYzLi4xZjJhZmU5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU2MGFkcy5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NjBhZHMuZHRzCkBAIC0xNyw3ICsxNyw2IEBACiAJI3NpemUtY2VsbHMgPSA8MT47CiAKIAljcHVzIHsKLQkJI2NwdXMgPSA8MT47CiAJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwogCQkjc2l6ZS1jZWxscyA9IDwwPjsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NjhtZHMuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NjhtZHMuZHRzCmluZGV4IGJmNDlkOGMuLjczNjFiMzYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTY4bWRzLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU2OG1kcy5kdHMKQEAgLTIxLDcgKzIxLDYgQEAKIAkjc2l6ZS1jZWxscyA9IDwxPjsKIAogCWNwdXMgewotCQkjY3B1cyA9IDwxPjsKIAkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CiAJCSNzaXplLWNlbGxzID0gPDA+OwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODY0MV9ocGNuLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NjQxX2hwY24uZHRzCmluZGV4IDhhNDk5NWEuLjI2MGIyNjQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NjQxX2hwY24uZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NjQxX2hwY24uZHRzCkBAIC0xNyw3ICsxNyw2IEBACiAJI3NpemUtY2VsbHMgPSA8MT47CiAKIAljcHVzIHsKLQkJI2NwdXMgPSA8Mj47CiAJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwogCQkjc2l6ZS1jZWxscyA9IDwwPjsKIApAQCAtMzAwLDYgKzI5OSwzMCBAQAogCQkJfTsKIAogCQl9OworCisJCXBjaUA5MDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiODZ4eCI7CisJCQlkZXZpY2VfdHlwZSA9ICJwY2kiOworCQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDI+OworCQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CisJCQlyZWcgPSA8OTAwMCAxMDAwPjsKKwkJCWJ1cy1yYW5nZSA9IDwwIGZmPjsKKwkJCXJhbmdlcyA9IDwwMjAwMDAwMCAwIGEwMDAwMDAwIGEwMDAwMDAwIDAgMjAwMDAwMDAKKwkJCQkgIDAxMDAwMDAwIDAgMDAwMDAwMDAgZTMwMDAwMDAgMCAwMDEwMDAwMD47CisJCQljbG9jay1mcmVxdWVuY3kgPSA8MWZjYTA1NT47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKwkJCWludGVycnVwdHMgPSA8MTkgMj47CisJCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8ZjgwMCAwIDAgNz47CisJCQlpbnRlcnJ1cHQtbWFwID0gPAorCQkJCS8qIElEU0VMIDB4MCAqLworCQkJCTAwMDAgMCAwIDEgJm1waWMgNDQgMQorCQkJCTAwMDAgMCAwIDIgJm1waWMgNDUgMQorCQkJCTAwMDAgMCAwIDMgJm1waWMgNDYgMQorCQkJCTAwMDAgMCAwIDQgJm1waWMgNDcgMQorCQkJCT47CisJCX07CisKIAkJbXBpYzogcGljQDQwMDAwIHsKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKIAkJCWludGVycnVwdC1jb250cm9sbGVyOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg2NmFkcy5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODY2YWRzLmR0cwppbmRleCAyYjU2YjVkLi5jMGQwNmZkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODY2YWRzLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODY2YWRzLmR0cwpAQCAtMTgsNyArMTgsNiBAQAogCWxpbnV4LHBoYW5kbGUgPSA8MTAwPjsKIAogCWNwdXMgewotCQkjY3B1cyA9IDwxPjsKIAkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CiAJCSNzaXplLWNlbGxzID0gPDA+OwogCQlsaW51eCxwaGFuZGxlID0gPDIwMD47CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODg1YWRzLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4ODVhZHMuZHRzCmluZGV4IGZhZWNkMDguLjExMGJmNjEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4ODVhZHMuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4ODVhZHMuZHRzCkBAIC0xOCw3ICsxOCw2IEBACiAJbGludXgscGhhbmRsZSA9IDwxMDA+OwogCiAJY3B1cyB7Ci0JCSNjcHVzID0gPDE+OwogCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKIAkJI3NpemUtY2VsbHMgPSA8MD47CiAJCWxpbnV4LHBoYW5kbGUgPSA8MjAwPjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2VsZi5oIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZWxmLmgKaW5kZXggZDQ4MjhmYy4uMTk0MWJjNSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZWxmLmgKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZWxmLmgKQEAgLTE0Niw0ICsxNDYsMTIgQEAKICNkZWZpbmUgRUxGT1NBQklfTk9ORQkwCiAjZGVmaW5lIEVMRk9TQUJJX0xJTlVYCTMKIAorc3RydWN0IGVsZl9pbmZvIHsKKwl1bnNpZ25lZCBsb25nIGxvYWRzaXplOworCXVuc2lnbmVkIGxvbmcgbWVtc2l6ZTsKKwl1bnNpZ25lZCBsb25nIGVsZm9mZnNldDsKK307CitpbnQgcGFyc2VfZWxmNjQodm9pZCAqaGRyLCBzdHJ1Y3QgZWxmX2luZm8gKmluZm8pOworaW50IHBhcnNlX2VsZjMyKHZvaWQgKmhkciwgc3RydWN0IGVsZl9pbmZvICppbmZvKTsKKwogI2VuZGlmCQkJCS8qIF9QUENfQk9PVF9FTEZfSF8gKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2VsZl91dGlsLmMgYi9hcmNoL3Bvd2VycGMvYm9vdC9lbGZfdXRpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0NTRhYTQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9lbGZfdXRpbC5jCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIFBhdWwgTWFja2VycmFzIDE5OTcuCisgKgorICogVXBkYXRlcyBmb3IgUFBDNjQgYnkgVG9kZCBJbmdsZXR0LCBEYXZlIEVuZ2VicmV0c2VuICYgUGV0ZXIgQmVyZ25lci4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSAiZWxmLmgiCisjaW5jbHVkZSAicGFnZS5oIgorI2luY2x1ZGUgInN0cmluZy5oIgorI2luY2x1ZGUgInN0ZGlvLmgiCisKK2ludCBwYXJzZV9lbGY2NCh2b2lkICpoZHIsIHN0cnVjdCBlbGZfaW5mbyAqaW5mbykKK3sKKwlFbGY2NF9FaGRyICplbGY2NCA9IGhkcjsKKwlFbGY2NF9QaGRyICplbGY2NHBoOworCXVuc2lnbmVkIGludCBpOworCisJaWYgKCEoZWxmNjQtPmVfaWRlbnRbRUlfTUFHMF0gID09IEVMRk1BRzAJJiYKKwkgICAgICBlbGY2NC0+ZV9pZGVudFtFSV9NQUcxXSAgPT0gRUxGTUFHMQkmJgorCSAgICAgIGVsZjY0LT5lX2lkZW50W0VJX01BRzJdICA9PSBFTEZNQUcyCSYmCisJICAgICAgZWxmNjQtPmVfaWRlbnRbRUlfTUFHM10gID09IEVMRk1BRzMJJiYKKwkgICAgICBlbGY2NC0+ZV9pZGVudFtFSV9DTEFTU10gPT0gRUxGQ0xBU1M2NAkmJgorCSAgICAgIGVsZjY0LT5lX2lkZW50W0VJX0RBVEFdICA9PSBFTEZEQVRBMk1TQgkmJgorCSAgICAgIGVsZjY0LT5lX3R5cGUgICAgICAgICAgICA9PSBFVF9FWEVDCSYmCisJICAgICAgZWxmNjQtPmVfbWFjaGluZSAgICAgICAgID09IEVNX1BQQzY0KSkKKwkJcmV0dXJuIDA7CisKKwllbGY2NHBoID0gKEVsZjY0X1BoZHIgKikoKHVuc2lnbmVkIGxvbmcpZWxmNjQgKworCQkJCSAodW5zaWduZWQgbG9uZyllbGY2NC0+ZV9waG9mZik7CisJZm9yIChpID0gMDsgaSA8ICh1bnNpZ25lZCBpbnQpZWxmNjQtPmVfcGhudW07IGkrKywgZWxmNjRwaCsrKQorCQlpZiAoZWxmNjRwaC0+cF90eXBlID09IFBUX0xPQUQpCisJCQlicmVhazsKKwlpZiAoaSA+PSAodW5zaWduZWQgaW50KWVsZjY0LT5lX3BobnVtKQorCQlyZXR1cm4gMDsKKworCWluZm8tPmxvYWRzaXplID0gKHVuc2lnbmVkIGxvbmcpZWxmNjRwaC0+cF9maWxlc3o7CisJaW5mby0+bWVtc2l6ZSA9ICh1bnNpZ25lZCBsb25nKWVsZjY0cGgtPnBfbWVtc3o7CisJaW5mby0+ZWxmb2Zmc2V0ID0gKHVuc2lnbmVkIGxvbmcpZWxmNjRwaC0+cF9vZmZzZXQ7CisKKwlyZXR1cm4gMTsKK30KKworaW50IHBhcnNlX2VsZjMyKHZvaWQgKmhkciwgc3RydWN0IGVsZl9pbmZvICppbmZvKQoreworCUVsZjMyX0VoZHIgKmVsZjMyID0gaGRyOworCUVsZjMyX1BoZHIgKmVsZjMycGg7CisJdW5zaWduZWQgaW50IGk7CisKKwlpZiAoIShlbGYzMi0+ZV9pZGVudFtFSV9NQUcwXSAgPT0gRUxGTUFHMAkmJgorCSAgICAgIGVsZjMyLT5lX2lkZW50W0VJX01BRzFdICA9PSBFTEZNQUcxCSYmCisJICAgICAgZWxmMzItPmVfaWRlbnRbRUlfTUFHMl0gID09IEVMRk1BRzIJJiYKKwkgICAgICBlbGYzMi0+ZV9pZGVudFtFSV9NQUczXSAgPT0gRUxGTUFHMwkmJgorCSAgICAgIGVsZjMyLT5lX2lkZW50W0VJX0NMQVNTXSA9PSBFTEZDTEFTUzMyCSYmCisJICAgICAgZWxmMzItPmVfaWRlbnRbRUlfREFUQV0gID09IEVMRkRBVEEyTVNCCSYmCisJICAgICAgZWxmMzItPmVfdHlwZSAgICAgICAgICAgID09IEVUX0VYRUMJJiYKKwkgICAgICBlbGYzMi0+ZV9tYWNoaW5lICAgICAgICAgPT0gRU1fUFBDKSkKKwkJcmV0dXJuIDA7CisKKwllbGYzMnBoID0gKEVsZjMyX1BoZHIgKikgKCh1bnNpZ25lZCBsb25nKWVsZjMyICsgZWxmMzItPmVfcGhvZmYpOworCWZvciAoaSA9IDA7IGkgPCBlbGYzMi0+ZV9waG51bTsgaSsrLCBlbGYzMnBoKyspCisJCWlmIChlbGYzMnBoLT5wX3R5cGUgPT0gUFRfTE9BRCkKKwkJCWJyZWFrOworCWlmIChpID49IGVsZjMyLT5lX3BobnVtKQorCQlyZXR1cm4gMDsKKworCWluZm8tPmxvYWRzaXplID0gZWxmMzJwaC0+cF9maWxlc3o7CisJaW5mby0+bWVtc2l6ZSA9IGVsZjMycGgtPnBfbWVtc3o7CisJaW5mby0+ZWxmb2Zmc2V0ID0gZWxmMzJwaC0+cF9vZmZzZXQ7CisJcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9mbGF0ZGV2dHJlZS5jIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZmxhdGRldnRyZWUuYwppbmRleCBjNzZjMTk0Li5kMDBmYmQ5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9mbGF0ZGV2dHJlZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2ZsYXRkZXZ0cmVlLmMKQEAgLTI5LDEyICsyOSwyMCBAQAogCiAjZGVmaW5lIF9BTElHTih4LCBhbCkJKCgoeCkgKyAoYWwpIC0gMSkgJiB+KChhbCkgLSAxKSkKIAorc3RhdGljIGNoYXIgKmZ0X3Jvb3Rfbm9kZShzdHJ1Y3QgZnRfY3h0ICpjeHQpCit7CisJcmV0dXJuIGN4dC0+cmduW0ZUX1NUUlVDVF0uc3RhcnQ7Cit9CisKIC8qIFJvdXRpbmVzIGZvciBrZWVwaW5nIG5vZGUgcHRycyByZXR1cm5lZCBieSBmdF9maW5kX2RldmljZSBjdXJyZW50ICovCiAvKiBGaXJzdCBlbnRyeSBub3QgdXNlZCBiL2MgaXQgd291bGQgcmV0dXJuIDAgYW5kIGJlIHRha2VuIGFzIE5VTEwvZXJyb3IgKi8KLXN0YXRpYyB2b2lkICpmdF9ub2RlX2FkZChzdHJ1Y3QgZnRfY3h0ICpjeHQsIGNoYXIgKm5vZGUpCitzdGF0aWMgdm9pZCAqZnRfZ2V0X3BoYW5kbGUoc3RydWN0IGZ0X2N4dCAqY3h0LCBjaGFyICpub2RlKQogewogCXVuc2lnbmVkIGludCBpOwogCisJaWYgKCFub2RlKQorCQlyZXR1cm4gTlVMTDsKKwogCWZvciAoaSA9IDE7IGkgPCBjeHQtPm5vZGVzX3VzZWQ7IGkrKykJLyogYWxyZWFkeSB0aGVyZT8gKi8KIAkJaWYgKGN4dC0+bm9kZV90YmxbaV0gPT0gbm9kZSkKIAkJCXJldHVybiAodm9pZCAqKWk7CkBAIC0yMzgsNyArMjQ2LDcgQEAKIAkJCWlmIChyZ24gPT0gRlRfU1RSVUNUKQogCQkJCWZ0X25vZGVfdXBkYXRlX2JlZm9yZShjeHQsIHAsIC1uZXh0cmEpOwogCQl9Ci0JCSpwIC09IG5leHRyYTsKKwkJKnBwIC09IG5leHRyYTsKIAkJY3h0LT5yZ25bcmduXS5zdGFydCAtPSBuZXh0cmE7CiAJCWN4dC0+cmduW3Jnbl0uc2l6ZSArPSBuZXh0cmE7CiAJCXJldHVybiAxOwpAQCAtMjUzLDggKzI2MSwxNCBAQAogCWNoYXIgKnN0ciwgKm5leHQ7CiAJZW51bSBmdF9yZ25faWQgcjsKIAotCWlmICghY3h0LT5pc29yZGVyZWQgJiYgIWZ0X3Jlb3JkZXIoY3h0LCBuZXh0cmEpKQotCQlyZXR1cm4gMDsKKwlpZiAoIWN4dC0+aXNvcmRlcmVkKSB7CisJCXVuc2lnbmVkIGxvbmcgcmduX29mZiA9ICpwcCAtIGN4dC0+cmduW3Jnbl0uc3RhcnQ7CisKKwkJaWYgKCFmdF9yZW9yZGVyKGN4dCwgbmV4dHJhKSkKKwkJCXJldHVybiAwOworCisJCSpwcCA9IGN4dC0+cmduW3Jnbl0uc3RhcnQgKyByZ25fb2ZmOworCX0KIAlpZiAoZnRfc2h1ZmZsZShjeHQsIHBwLCByZ24sIG5leHRyYSkpCiAJCXJldHVybiAxOwogCkBAIC00MTUsNyArNDI5LDcgQEAKIHsKIAlpbnQgb2ZmLCBsZW47CiAKLQlvZmYgPSBsb29rdXBfc3RyaW5nKGN4dCwgbmFtZSk7CisJb2ZmID0gbWFwX3N0cmluZyhjeHQsIG5hbWUpOwogCWlmIChvZmYgPT0gTk9fU1RSSU5HKQogCQlyZXR1cm4gLTE7CiAKQEAgLTU5MCw3ICs2MDQsNyBAQAogCiB2b2lkIGZ0X2JlZ2luX3RyZWUoc3RydWN0IGZ0X2N4dCAqY3h0KQogewotCWN4dC0+cCA9IGN4dC0+cmduW0ZUX1NUUlVDVF0uc3RhcnQ7CisJY3h0LT5wID0gZnRfcm9vdF9ub2RlKGN4dCk7CiB9CiAKIHZvaWQgZnRfZW5kX3RyZWUoc3RydWN0IGZ0X2N4dCAqY3h0KQpAQCAtNjM2LDggKzY1MCwyMSBAQAogCS8qIHJlcXVpcmUgYWJzb2x1dGUgcGF0aCAqLwogCWlmIChzcmNoX3BhdGhbMF0gIT0gJy8nKQogCQlyZXR1cm4gTlVMTDsKLQlub2RlID0gZnRfZmluZF9kZXNjZW5kZW50KGN4dCwgY3h0LT5yZ25bRlRfU1RSVUNUXS5zdGFydCwgc3JjaF9wYXRoKTsKLQlyZXR1cm4gZnRfbm9kZV9hZGQoY3h0LCBub2RlKTsKKwlub2RlID0gZnRfZmluZF9kZXNjZW5kZW50KGN4dCwgZnRfcm9vdF9ub2RlKGN4dCksIHNyY2hfcGF0aCk7CisJcmV0dXJuIGZ0X2dldF9waGFuZGxlKGN4dCwgbm9kZSk7Cit9CisKK3ZvaWQgKmZ0X2ZpbmRfZGV2aWNlX3JlbChzdHJ1Y3QgZnRfY3h0ICpjeHQsIGNvbnN0IHZvaWQgKnRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzcmNoX3BhdGgpCit7CisJY2hhciAqbm9kZTsKKworCW5vZGUgPSBmdF9ub2RlX3BoMm5vZGUoY3h0LCB0b3ApOworCWlmIChub2RlID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJbm9kZSA9IGZ0X2ZpbmRfZGVzY2VuZGVudChjeHQsIG5vZGUsIHNyY2hfcGF0aCk7CisJcmV0dXJuIGZ0X2dldF9waGFuZGxlKGN4dCwgbm9kZSk7CiB9CiAKIHZvaWQgKmZ0X2ZpbmRfZGVzY2VuZGVudChzdHJ1Y3QgZnRfY3h0ICpjeHQsIHZvaWQgKnRvcCwgY29uc3QgY2hhciAqc3JjaF9wYXRoKQpAQCAtNzAxLDIzICs3MjgsMTggQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotdm9pZCAqZnRfZ2V0X3BhcmVudChzdHJ1Y3QgZnRfY3h0ICpjeHQsIGNvbnN0IHZvaWQgKnBoYW5kbGUpCit2b2lkICpfX2Z0X2dldF9wYXJlbnQoc3RydWN0IGZ0X2N4dCAqY3h0LCB2b2lkICpub2RlKQogewotCXZvaWQgKm5vZGU7CiAJaW50IGQ7CiAJc3RydWN0IGZ0X2F0b20gYXRvbTsKIAljaGFyICpwOwogCi0Jbm9kZSA9IGZ0X25vZGVfcGgybm9kZShjeHQsIHBoYW5kbGUpOwotCWlmIChub2RlID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCiAJZm9yIChkID0gMDsgY3h0LT5nZW5lYWxvZ3lbZF0gIT0gTlVMTDsgKytkKQogCQlpZiAoY3h0LT5nZW5lYWxvZ3lbZF0gPT0gbm9kZSkKLQkJCXJldHVybiBjeHQtPmdlbmVhbG9neVtkID4gMCA/IGQgLSAxIDogMF07CisJCQlyZXR1cm4gZCA+IDAgPyBjeHQtPmdlbmVhbG9neVtkIC0gMV0gOiBOVUxMOwogCiAJLyogaGF2ZSB0byBkbyBpdCB0aGUgaGFyZCB3YXkuLi4gKi8KLQlwID0gY3h0LT5yZ25bRlRfU1RSVUNUXS5zdGFydDsKKwlwID0gZnRfcm9vdF9ub2RlKGN4dCk7CiAJZCA9IDA7CiAJd2hpbGUgKChwID0gZnRfbmV4dChjeHQsIHAsICZhdG9tKSkgIT0gTlVMTCkgewogCQlzd2l0Y2ggKGF0b20udGFnKSB7CkBAIC03MjYsNyArNzQ4LDcgQEAKIAkJCWlmIChub2RlID09IGF0b20uZGF0YSkgewogCQkJCS8qIGZvdW5kIGl0ICovCiAJCQkJY3h0LT5nZW5lYWxvZ3lbZCArIDFdID0gTlVMTDsKLQkJCQlyZXR1cm4gZCA+IDAgPyBjeHQtPmdlbmVhbG9neVtkIC0gMV0gOiBub2RlOworCQkJCXJldHVybiBkID4gMCA/IGN4dC0+Z2VuZWFsb2d5W2QgLSAxXSA6IE5VTEw7CiAJCQl9CiAJCQkrK2Q7CiAJCQlicmVhazsKQEAgLTczOCw0MSArNzYwLDEzMSBAQAogCXJldHVybiBOVUxMOwogfQogCi1pbnQgZnRfZ2V0X3Byb3Aoc3RydWN0IGZ0X2N4dCAqY3h0LCBjb25zdCB2b2lkICpwaGFuZGxlLCBjb25zdCBjaGFyICpwcm9wbmFtZSwKLQkJdm9pZCAqYnVmLCBjb25zdCB1bnNpZ25lZCBpbnQgYnVmbGVuKQordm9pZCAqZnRfZ2V0X3BhcmVudChzdHJ1Y3QgZnRfY3h0ICpjeHQsIGNvbnN0IHZvaWQgKnBoYW5kbGUpCit7CisJdm9pZCAqbm9kZSA9IGZ0X25vZGVfcGgybm9kZShjeHQsIHBoYW5kbGUpOworCWlmIChub2RlID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJbm9kZSA9IF9fZnRfZ2V0X3BhcmVudChjeHQsIG5vZGUpOworCXJldHVybiBmdF9nZXRfcGhhbmRsZShjeHQsIG5vZGUpOworfQorCitzdGF0aWMgY29uc3Qgdm9pZCAqX19mdF9nZXRfcHJvcChzdHJ1Y3QgZnRfY3h0ICpjeHQsIHZvaWQgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwcm9wbmFtZSwgdW5zaWduZWQgaW50ICpsZW4pCiB7CiAJc3RydWN0IGZ0X2F0b20gYXRvbTsKLQl2b2lkICpub2RlOwotCWNoYXIgKnA7Ci0JaW50IGRlcHRoOwotCXVuc2lnbmVkIGludCBzaXplOworCWludCBkZXB0aCA9IDA7CiAKLQlub2RlID0gZnRfbm9kZV9waDJub2RlKGN4dCwgcGhhbmRsZSk7Ci0JaWYgKG5vZGUgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCi0JZGVwdGggPSAwOwotCXAgPSAoY2hhciAqKW5vZGU7Ci0KLQl3aGlsZSAoKHAgPSBmdF9uZXh0KGN4dCwgcCwgJmF0b20pKSAhPSBOVUxMKSB7CisJd2hpbGUgKChub2RlID0gZnRfbmV4dChjeHQsIG5vZGUsICZhdG9tKSkgIT0gTlVMTCkgewogCQlzd2l0Y2ggKGF0b20udGFnKSB7CiAJCWNhc2UgT0ZfRFRfQkVHSU5fTk9ERToKIAkJCSsrZGVwdGg7CiAJCQlicmVhazsKKwogCQljYXNlIE9GX0RUX1BST1A6Ci0JCQlpZiAoKGRlcHRoICE9IDEpIHx8IHN0cmNtcChhdG9tLm5hbWUsIHByb3BuYW1lKSkKKwkJCWlmIChkZXB0aCAhPSAxIHx8IHN0cmNtcChhdG9tLm5hbWUsIHByb3BuYW1lKSkKIAkJCQlicmVhazsKLQkJCXNpemUgPSBtaW4oYXRvbS5zaXplLCBidWZsZW4pOwotCQkJbWVtY3B5KGJ1ZiwgYXRvbS5kYXRhLCBzaXplKTsKLQkJCXJldHVybiBhdG9tLnNpemU7CisKKwkJCWlmIChsZW4pCisJCQkJKmxlbiA9IGF0b20uc2l6ZTsKKworCQkJcmV0dXJuIGF0b20uZGF0YTsKKwogCQljYXNlIE9GX0RUX0VORF9OT0RFOgogCQkJaWYgKC0tZGVwdGggPD0gMCkKLQkJCQlyZXR1cm4gLTE7CisJCQkJcmV0dXJuIE5VTEw7CiAJCX0KIAl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworaW50IGZ0X2dldF9wcm9wKHN0cnVjdCBmdF9jeHQgKmN4dCwgY29uc3Qgdm9pZCAqcGhhbmRsZSwgY29uc3QgY2hhciAqcHJvcG5hbWUsCisJCXZvaWQgKmJ1ZiwgY29uc3QgdW5zaWduZWQgaW50IGJ1ZmxlbikKK3sKKwljb25zdCB2b2lkICpkYXRhOworCXVuc2lnbmVkIGludCBzaXplOworCisJdm9pZCAqbm9kZSA9IGZ0X25vZGVfcGgybm9kZShjeHQsIHBoYW5kbGUpOworCWlmICghbm9kZSkKKwkJcmV0dXJuIC0xOworCisJZGF0YSA9IF9fZnRfZ2V0X3Byb3AoY3h0LCBub2RlLCBwcm9wbmFtZSwgJnNpemUpOworCWlmIChkYXRhKSB7CisJCXVuc2lnbmVkIGludCBjbGlwcGVkX3NpemUgPSBtaW4oc2l6ZSwgYnVmbGVuKTsKKwkJbWVtY3B5KGJ1ZiwgZGF0YSwgY2xpcHBlZF9zaXplKTsKKwkJcmV0dXJuIHNpemU7CisJfQorCiAJcmV0dXJuIC0xOwogfQogCit2b2lkICpfX2Z0X2ZpbmRfbm9kZV9ieV9wcm9wX3ZhbHVlKHN0cnVjdCBmdF9jeHQgKmN4dCwgdm9pZCAqcHJldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcHJvcG5hbWUsIGNvbnN0IGNoYXIgKnByb3B2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBwcm9wbGVuKQoreworCXN0cnVjdCBmdF9hdG9tIGF0b207CisJY2hhciAqcCA9IGZ0X3Jvb3Rfbm9kZShjeHQpOworCWNoYXIgKm5leHQ7CisJaW50IHBhc3RfcHJldiA9IHByZXYgPyAwIDogMTsKKwlpbnQgZGVwdGggPSAtMTsKKworCXdoaWxlICgobmV4dCA9IGZ0X25leHQoY3h0LCBwLCAmYXRvbSkpICE9IE5VTEwpIHsKKwkJY29uc3Qgdm9pZCAqZGF0YTsKKwkJdW5zaWduZWQgaW50IHNpemU7CisKKwkJc3dpdGNoIChhdG9tLnRhZykgeworCQljYXNlIE9GX0RUX0JFR0lOX05PREU6CisJCQlkZXB0aCsrOworCisJCQlpZiAocHJldiA9PSBwKSB7CisJCQkJcGFzdF9wcmV2ID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJaWYgKCFwYXN0X3ByZXYgfHwgZGVwdGggPCAxKQorCQkJCWJyZWFrOworCisJCQlkYXRhID0gX19mdF9nZXRfcHJvcChjeHQsIHAsIHByb3BuYW1lLCAmc2l6ZSk7CisJCQlpZiAoIWRhdGEgfHwgc2l6ZSAhPSBwcm9wbGVuKQorCQkJCWJyZWFrOworCQkJaWYgKG1lbWNtcChkYXRhLCBwcm9wdmFsLCBzaXplKSkKKwkJCQlicmVhazsKKworCQkJcmV0dXJuIHA7CisKKwkJY2FzZSBPRl9EVF9FTkRfTk9ERToKKwkJCWlmIChkZXB0aC0tID09IDApCisJCQkJcmV0dXJuIE5VTEw7CisKKwkJCWJyZWFrOworCQl9CisKKwkJcCA9IG5leHQ7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgKmZ0X2ZpbmRfbm9kZV9ieV9wcm9wX3ZhbHVlKHN0cnVjdCBmdF9jeHQgKmN4dCwgY29uc3Qgdm9pZCAqcHJldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnByb3BuYW1lLCBjb25zdCBjaGFyICpwcm9wdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHByb3BsZW4pCit7CisJdm9pZCAqbm9kZSA9IE5VTEw7CisKKwlpZiAocHJldikgeworCQlub2RlID0gZnRfbm9kZV9waDJub2RlKGN4dCwgcHJldik7CisKKwkJaWYgKCFub2RlKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCisJbm9kZSA9IF9fZnRfZmluZF9ub2RlX2J5X3Byb3BfdmFsdWUoY3h0LCBub2RlLCBwcm9wbmFtZSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wdmFsLCBwcm9wbGVuKTsKKwlyZXR1cm4gZnRfZ2V0X3BoYW5kbGUoY3h0LCBub2RlKTsKK30KKwogaW50IGZ0X3NldF9wcm9wKHN0cnVjdCBmdF9jeHQgKmN4dCwgY29uc3Qgdm9pZCAqcGhhbmRsZSwgY29uc3QgY2hhciAqcHJvcG5hbWUsCiAJCWNvbnN0IHZvaWQgKmJ1ZiwgY29uc3QgdW5zaWduZWQgaW50IGJ1ZmxlbikKIHsKQEAgLTg0OSwxOSArOTYxLDI2IEBACiAJcmV0dXJuIC0xOwogfQogCi12b2lkICpmdF9jcmVhdGVfbm9kZShzdHJ1Y3QgZnRfY3h0ICpjeHQsIGNvbnN0IHZvaWQgKnBhcmVudCwgY29uc3QgY2hhciAqcGF0aCkKK3ZvaWQgKmZ0X2NyZWF0ZV9ub2RlKHN0cnVjdCBmdF9jeHQgKmN4dCwgY29uc3Qgdm9pZCAqcGFyZW50LCBjb25zdCBjaGFyICpuYW1lKQogewogCXN0cnVjdCBmdF9hdG9tIGF0b207CiAJY2hhciAqcCwgKm5leHQ7CiAJaW50IGRlcHRoID0gMDsKIAotCXAgPSBjeHQtPnJnbltGVF9TVFJVQ1RdLnN0YXJ0OworCWlmIChwYXJlbnQpIHsKKwkJcCA9IGZ0X25vZGVfcGgybm9kZShjeHQsIHBhcmVudCk7CisJCWlmICghcCkKKwkJCXJldHVybiBOVUxMOworCX0gZWxzZSB7CisJCXAgPSBmdF9yb290X25vZGUoY3h0KTsKKwl9CisKIAl3aGlsZSAoKG5leHQgPSBmdF9uZXh0KGN4dCwgcCwgJmF0b20pKSAhPSBOVUxMKSB7CiAJCXN3aXRjaCAoYXRvbS50YWcpIHsKIAkJY2FzZSBPRl9EVF9CRUdJTl9OT0RFOgogCQkJKytkZXB0aDsKLQkJCWlmIChkZXB0aCA9PSAxICYmIHN0cmNtcChhdG9tLm5hbWUsIHBhdGgpID09IDApCi0JCQkJLyogZHVwbGljYXRlIG5vZGUgcGF0aCwgcmV0dXJuIGVycm9yICovCisJCQlpZiAoZGVwdGggPT0gMSAmJiBzdHJjbXAoYXRvbS5uYW1lLCBuYW1lKSA9PSAwKQorCQkJCS8qIGR1cGxpY2F0ZSBub2RlIG5hbWUsIHJldHVybiBlcnJvciAqLwogCQkJCXJldHVybiBOVUxMOwogCQkJYnJlYWs7CiAJCWNhc2UgT0ZfRFRfRU5EX05PREU6CkBAIC04NzAsNyArOTg5LDcgQEAKIAkJCQlicmVhazsKIAkJCS8qIGVuZCBvZiBub2RlLCBpbnNlcnQgaGVyZSAqLwogCQkJY3h0LT5wID0gcDsKLQkJCWZ0X2JlZ2luX25vZGUoY3h0LCBwYXRoKTsKKwkJCWZ0X2JlZ2luX25vZGUoY3h0LCBuYW1lKTsKIAkJCWZ0X2VuZF9ub2RlKGN4dCk7CiAJCQlyZXR1cm4gcDsKIAkJfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZmxhdGRldnRyZWUuaCBiL2FyY2gvcG93ZXJwYy9ib290L2ZsYXRkZXZ0cmVlLmgKaW5kZXggYjljZDlmNi4uY2IyNjMyNSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZmxhdGRldnRyZWUuaAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9mbGF0ZGV2dHJlZS5oCkBAIC05NywxMCArOTcsMTcgQEAKIHZvaWQgZnRfZHVtcF9ibG9iKGNvbnN0IHZvaWQgKmJwaHApOwogdm9pZCBmdF9tZXJnZV9ibG9iKHN0cnVjdCBmdF9jeHQgKmN4dCwgdm9pZCAqYmxvYik7CiB2b2lkICpmdF9maW5kX2RldmljZShzdHJ1Y3QgZnRfY3h0ICpjeHQsIGNvbnN0IGNoYXIgKnNyY2hfcGF0aCk7Cit2b2lkICpmdF9maW5kX2RldmljZV9yZWwoc3RydWN0IGZ0X2N4dCAqY3h0LCBjb25zdCB2b2lkICp0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc3JjaF9wYXRoKTsKIHZvaWQgKmZ0X2ZpbmRfZGVzY2VuZGVudChzdHJ1Y3QgZnRfY3h0ICpjeHQsIHZvaWQgKnRvcCwgY29uc3QgY2hhciAqc3JjaF9wYXRoKTsKIGludCBmdF9nZXRfcHJvcChzdHJ1Y3QgZnRfY3h0ICpjeHQsIGNvbnN0IHZvaWQgKnBoYW5kbGUsIGNvbnN0IGNoYXIgKnByb3BuYW1lLAogCQl2b2lkICpidWYsIGNvbnN0IHVuc2lnbmVkIGludCBidWZsZW4pOwogaW50IGZ0X3NldF9wcm9wKHN0cnVjdCBmdF9jeHQgKmN4dCwgY29uc3Qgdm9pZCAqcGhhbmRsZSwgY29uc3QgY2hhciAqcHJvcG5hbWUsCiAJCWNvbnN0IHZvaWQgKmJ1ZiwgY29uc3QgdW5zaWduZWQgaW50IGJ1Zmxlbik7Cit2b2lkICpmdF9nZXRfcGFyZW50KHN0cnVjdCBmdF9jeHQgKmN4dCwgY29uc3Qgdm9pZCAqcGhhbmRsZSk7Cit2b2lkICpmdF9maW5kX25vZGVfYnlfcHJvcF92YWx1ZShzdHJ1Y3QgZnRfY3h0ICpjeHQsIGNvbnN0IHZvaWQgKnByZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwcm9wbmFtZSwgY29uc3QgY2hhciAqcHJvcHZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcm9wbGVuKTsKK3ZvaWQgKmZ0X2NyZWF0ZV9ub2RlKHN0cnVjdCBmdF9jeHQgKmN4dCwgY29uc3Qgdm9pZCAqcGFyZW50LCBjb25zdCBjaGFyICpuYW1lKTsKIAogI2VuZGlmIC8qIEZMQVRERVZUUkVFX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2ZsYXRkZXZ0cmVlX21pc2MuYyBiL2FyY2gvcG93ZXJwYy9ib290L2ZsYXRkZXZ0cmVlX21pc2MuYwppbmRleCAwNGRhMzhmLi40MzQxZTY1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9mbGF0ZGV2dHJlZV9taXNjLmMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZmxhdGRldnRyZWVfbWlzYy5jCkBAIC0xNiwyNCArMTYsNDMgQEAKIAogc3RhdGljIHN0cnVjdCBmdF9jeHQgY3h0OwogCi1zdGF0aWMgdm9pZCAqZnRfZmluZGRldmljZShjb25zdCBjaGFyICpuYW1lKQorc3RhdGljIHZvaWQgKmZkdG1fZmluZGRldmljZShjb25zdCBjaGFyICpuYW1lKQogewogCXJldHVybiBmdF9maW5kX2RldmljZSgmY3h0LCBuYW1lKTsKIH0KIAotc3RhdGljIGludCBmdF9nZXRwcm9wKGNvbnN0IHZvaWQgKnBoYW5kbGUsIGNvbnN0IGNoYXIgKnByb3BuYW1lLCB2b2lkICpidWYsCi0JCWNvbnN0IGludCBidWZsZW4pCitzdGF0aWMgaW50IGZkdG1fZ2V0cHJvcChjb25zdCB2b2lkICpwaGFuZGxlLCBjb25zdCBjaGFyICpwcm9wbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZiwgY29uc3QgaW50IGJ1ZmxlbikKIHsKIAlyZXR1cm4gZnRfZ2V0X3Byb3AoJmN4dCwgcGhhbmRsZSwgcHJvcG5hbWUsIGJ1ZiwgYnVmbGVuKTsKIH0KIAotc3RhdGljIGludCBmdF9zZXRwcm9wKGNvbnN0IHZvaWQgKnBoYW5kbGUsIGNvbnN0IGNoYXIgKnByb3BuYW1lLAotCQljb25zdCB2b2lkICpidWYsIGNvbnN0IGludCBidWZsZW4pCitzdGF0aWMgaW50IGZkdG1fc2V0cHJvcChjb25zdCB2b2lkICpwaGFuZGxlLCBjb25zdCBjaGFyICpwcm9wbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmJ1ZiwgY29uc3QgaW50IGJ1ZmxlbikKIHsKIAlyZXR1cm4gZnRfc2V0X3Byb3AoJmN4dCwgcGhhbmRsZSwgcHJvcG5hbWUsIGJ1ZiwgYnVmbGVuKTsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgZnRfZmluYWxpemUodm9pZCkKK3N0YXRpYyB2b2lkICpmZHRtX2dldF9wYXJlbnQoY29uc3Qgdm9pZCAqcGhhbmRsZSkKK3sKKwlyZXR1cm4gZnRfZ2V0X3BhcmVudCgmY3h0LCBwaGFuZGxlKTsKK30KKworc3RhdGljIHZvaWQgKmZkdG1fY3JlYXRlX25vZGUoY29uc3Qgdm9pZCAqcGhhbmRsZSwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlyZXR1cm4gZnRfY3JlYXRlX25vZGUoJmN4dCwgcGhhbmRsZSwgbmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkICpmZHRtX2ZpbmRfbm9kZV9ieV9wcm9wX3ZhbHVlKGNvbnN0IHZvaWQgKnByZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwcm9wbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnByb3B2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJvcGxlbikKK3sKKwlyZXR1cm4gZnRfZmluZF9ub2RlX2J5X3Byb3BfdmFsdWUoJmN4dCwgcHJldiwgcHJvcG5hbWUsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3B2YWwsIHByb3BsZW4pOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBmZHRtX2ZpbmFsaXplKHZvaWQpCiB7CiAJZnRfZW5kX3RyZWUoJmN4dCk7CiAJcmV0dXJuICh1bnNpZ25lZCBsb25nKWN4dC5icGg7CkBAIC00MSwxMCArNjAsMTMgQEAKIAogaW50IGZ0X2luaXQodm9pZCAqZHRfYmxvYiwgdW5zaWduZWQgaW50IG1heF9zaXplLCB1bnNpZ25lZCBpbnQgbWF4X2ZpbmRfZGV2aWNlKQogewotCWR0X29wcy5maW5kZGV2aWNlID0gZnRfZmluZGRldmljZTsKLQlkdF9vcHMuZ2V0cHJvcCA9IGZ0X2dldHByb3A7Ci0JZHRfb3BzLnNldHByb3AgPSBmdF9zZXRwcm9wOwotCWR0X29wcy5maW5hbGl6ZSA9IGZ0X2ZpbmFsaXplOworCWR0X29wcy5maW5kZGV2aWNlID0gZmR0bV9maW5kZGV2aWNlOworCWR0X29wcy5nZXRwcm9wID0gZmR0bV9nZXRwcm9wOworCWR0X29wcy5zZXRwcm9wID0gZmR0bV9zZXRwcm9wOworCWR0X29wcy5nZXRfcGFyZW50ID0gZmR0bV9nZXRfcGFyZW50OworCWR0X29wcy5jcmVhdGVfbm9kZSA9IGZkdG1fY3JlYXRlX25vZGU7CisJZHRfb3BzLmZpbmRfbm9kZV9ieV9wcm9wX3ZhbHVlID0gZmR0bV9maW5kX25vZGVfYnlfcHJvcF92YWx1ZTsKKwlkdF9vcHMuZmluYWxpemUgPSBmZHRtX2ZpbmFsaXplOwogCiAJcmV0dXJuIGZ0X29wZW4oJmN4dCwgZHRfYmxvYiwgbWF4X3NpemUsIG1heF9maW5kX2RldmljZSwKIAkJCXBsYXRmb3JtX29wcy5yZWFsbG9jKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2d1bnppcF91dGlsLmMgYi9hcmNoL3Bvd2VycGMvYm9vdC9ndW56aXBfdXRpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmOGFiMDcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9ndW56aXBfdXRpbC5jCkBAIC0wLDAgKzEsMjA2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDcgRGF2aWQgR2lic29uLCBJQk0gQ29ycG9yYXRpb24uCisgKiBCYXNlZCBvbiBlYXJsaWVyIHdvcmssIENvcHlyaWdodCAoQykgUGF1bCBNYWNrZXJyYXMgMTk5Ny4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlICJzdHJpbmcuaCIKKyNpbmNsdWRlICJzdGRpby5oIgorI2luY2x1ZGUgIm9wcy5oIgorI2luY2x1ZGUgImd1bnppcF91dGlsLmgiCisKKyNkZWZpbmUgSEVBRF9DUkMJMgorI2RlZmluZSBFWFRSQV9GSUVMRAk0CisjZGVmaW5lIE9SSUdfTkFNRQk4CisjZGVmaW5lIENPTU1FTlQJCTB4MTAKKyNkZWZpbmUgUkVTRVJWRUQJMHhlMAorCisvKioKKyAqIGd1bnppcF9zdGFydCAtIHByZXBhcmUgdG8gZGVjb21wcmVzcyBnemlwIGRhdGEKKyAqIEBzdGF0ZTogICAgIGRlY29tcHJlc3NvciBzdGF0ZSBzdHJ1Y3R1cmUgdG8gYmUgaW5pdGlhbGl6ZWQKKyAqIEBzcmM6ICAgICAgIGJ1ZmZlciBjb250YWluaW5nIGd6aXAgY29tcHJlc3NlZCBvciB1bmNvbXByZXNzZWQgZGF0YQorICogQHNyY2xlbjogICAgc2l6ZSBpbiBieXRlcyBvZiB0aGUgYnVmZmVyIGF0IHNyYworICoKKyAqIElmIHRoZSBidWZmZXIgYXQgQHNyYyBjb250YWlucyBhIGd6aXAgaGVhZGVyLCB0aGlzIGZ1bmN0aW9uCisgKiBpbml0aWFsaXplcyB6bGliIHRvIGRlY29tcHJlc3MgdGhlIGRhdGEsIHN0b3JpbmcgdGhlIGRlY29tcHJlc3Npb24KKyAqIHN0YXRlIGluIEBzdGF0ZS4gIFRoZSBvdGhlciBmdW5jdGlvbnMgaW4gdGhpcyBmaWxlIGNhbiB0aGVuIGJlIHVzZWQKKyAqIHRvIGRlY29tcHJlc3MgZGF0YSBmcm9tIHRoZSBnemlwcGVkIHN0cmVhbS4KKyAqCisgKiBJZiB0aGUgYnVmZmVyIGF0IEBzcmMgZG9lcyBub3QgY29udGFpbiBhIGd6aXAgaGVhZGVyLCBpdCBpcyBhc3N1bWVkCisgKiB0byBjb250YWluIHVuY29tcHJlc3NlZCBkYXRhLiAgVGhlIGJ1ZmZlciBpbmZvcm1hdGlvbiBpcyByZWNvcmRlZAorICogaW4gQHN0YXRlIGFuZCB0aGUgb3RoZXIgZnVuY3Rpb25zIGluIHRoaXMgZmlsZSB3aWxsIHNpbXBseSBjb3B5CisgKiBkYXRhIGZyb20gdGhlIHVuY29tcHJlc3NlZCBkYXRhIHN0cmVhbSBhdCBAc3JjLgorICoKKyAqIEFueSBlcnJvcnMsIHN1Y2ggYXMgYmFkIGNvbXByZXNzZWQgZGF0YSwgY2F1c2UgYW4gZXJyb3IgdG8gYmUKKyAqIHByaW50ZWQgYW4gdGhlIHBsYXRmb3JtJ3MgZXhpdCgpIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZC4KKyAqLwordm9pZCBndW56aXBfc3RhcnQoc3RydWN0IGd1bnppcF9zdGF0ZSAqc3RhdGUsIHZvaWQgKnNyYywgaW50IHNyY2xlbikKK3sKKwljaGFyICpoZHIgPSBzcmM7CisJaW50IGhkcmxlbiA9IDA7CisKKwltZW1zZXQoc3RhdGUsIDAsIHNpemVvZigqc3RhdGUpKTsKKworCS8qIENoZWNrIGZvciBnemlwIG1hZ2ljIG51bWJlciAqLworCWlmICgoaGRyWzBdID09IDB4MWYpICYmIChoZHJbMV0gPT0gMHg4YikpIHsKKwkJLyogZ3ppcCBkYXRhLCBpbml0aWFsaXplIHpsaWIgcGFyYW1ldGVycyAqLworCQlpbnQgciwgZmxhZ3M7CisKKwkJc3RhdGUtPnMud29ya3NwYWNlID0gc3RhdGUtPnNjcmF0Y2g7CisJCWlmICh6bGliX2luZmxhdGVfd29ya3NwYWNlc2l6ZSgpID4gc2l6ZW9mKHN0YXRlLT5zY3JhdGNoKSkKKwkJCWZhdGFsKCJpbnN1ZmZpY2llbnQgc2NyYXRjaCBzcGFjZSBmb3IgZ3VuemlwXG5cciIpOworCisJCS8qIHNraXAgaGVhZGVyICovCisJCWhkcmxlbiA9IDEwOworCQlmbGFncyA9IGhkclszXTsKKwkJaWYgKGhkclsyXSAhPSBaX0RFRkxBVEVEIHx8IChmbGFncyAmIFJFU0VSVkVEKSAhPSAwKQorCQkJZmF0YWwoImJhZCBnemlwcGVkIGRhdGFcblxyIik7CisJCWlmICgoZmxhZ3MgJiBFWFRSQV9GSUVMRCkgIT0gMCkKKwkJCWhkcmxlbiA9IDEyICsgaGRyWzEwXSArIChoZHJbMTFdIDw8IDgpOworCQlpZiAoKGZsYWdzICYgT1JJR19OQU1FKSAhPSAwKQorCQkJd2hpbGUgKGhkcltoZHJsZW4rK10gIT0gMCkKKwkJCQk7CisJCWlmICgoZmxhZ3MgJiBDT01NRU5UKSAhPSAwKQorCQkJd2hpbGUgKGhkcltoZHJsZW4rK10gIT0gMCkKKwkJCQk7CisJCWlmICgoZmxhZ3MgJiBIRUFEX0NSQykgIT0gMCkKKwkJCWhkcmxlbiArPSAyOworCQlpZiAoaGRybGVuID49IHNyY2xlbikKKwkJCWZhdGFsKCJndW56aXBfc3RhcnQ6IHJhbiBvdXQgb2YgZGF0YSBpbiBoZWFkZXJcblxyIik7CisKKwkJciA9IHpsaWJfaW5mbGF0ZUluaXQyKCZzdGF0ZS0+cywgLU1BWF9XQklUUyk7CisJCWlmIChyICE9IFpfT0spCisJCQlmYXRhbCgiaW5mbGF0ZUluaXQyIHJldHVybmVkICVkXG5cciIsIHIpOworCX0KKworCXN0YXRlLT5zLm5leHRfaW4gPSBzcmMgKyBoZHJsZW47CisJc3RhdGUtPnMuYXZhaWxfaW4gPSBzcmNsZW4gLSBoZHJsZW47Cit9CisKKy8qKgorICogZ3VuemlwX3BhcnRpYWwgLSBleHRyYWN0IGJ5dGVzIGZyb20gYSBnemlwIGRhdGEgc3RyZWFtCisgKiBAc3RhdGU6ICAgICBnemlwIHN0YXRlIHN0cnVjdHVyZSBwcmV2aW91c2x5IGluaXRpYWxpemVkIGJ5IGd1bnppcF9zdGFydCgpCisgKiBAZHN0OiAgICAgICBidWZmZXIgdG8gc3RvcmUgZXh0cmFjdGVkIGRhdGEKKyAqIEBkc3RsZW46ICAgIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIGV4dHJhY3QKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGV4dHJhY3RzIGF0IG1vc3QgQGRzdGxlbiBieXRlcyBmcm9tIHRoZSBkYXRhIHN0cmVhbQorICogcHJldmlvdXNseSBhc3NvY2lhdGVkIHdpdGggQHN0YXRlIGJ5IGd1bnppcF9zdGFydCgpLCBkZWNvbXByZXNzaW5nCisgKiBpZiBuZWNlc3NhcnkuICBFeGFjdGx5IEBkc3RsZW4gYnl0ZXMgYXJlIGV4dHJhY3RlZCB1bmxlc3MgdGhlIGRhdGEKKyAqIHN0cmVhbSBkb2Vzbid0IGNvbnRhaW4gZW5vdWdoIGJ5dGVzLCBpbiB3aGljaCBjYXNlIHRoZSBlbnRpcmUKKyAqIHJlbWFpbmRlciBvZiB0aGUgc3RyZWFtIGlzIGRlY29tcHJlc3NlZC4KKyAqCisgKiBSZXR1cm5zIHRoZSBhY3R1YWwgbnVtYmVyIG9mIGJ5dGVzIGV4dHJhY3RlZC4gIElmIGFueSBlcnJvcnMgb2NjdXIsCisgKiBzdWNoIGFzIGEgY29ycnVwdGVkIGNvbXByZXNzZWQgc3RyZWFtLCBhbiBlcnJvciBpcyBwcmludGVkIGFuIHRoZQorICogcGxhdGZvcm0ncyBleGl0KCkgZnVuY3Rpb24gaXMgY2FsbGVkLgorICovCitpbnQgZ3VuemlwX3BhcnRpYWwoc3RydWN0IGd1bnppcF9zdGF0ZSAqc3RhdGUsIHZvaWQgKmRzdCwgaW50IGRzdGxlbikKK3sKKwlpbnQgbGVuOworCisJaWYgKHN0YXRlLT5zLndvcmtzcGFjZSkgeworCQkvKiBndW56aXBwaW5nICovCisJCWludCByOworCisJCXN0YXRlLT5zLm5leHRfb3V0ID0gZHN0OworCQlzdGF0ZS0+cy5hdmFpbF9vdXQgPSBkc3RsZW47CisJCXIgPSB6bGliX2luZmxhdGUoJnN0YXRlLT5zLCBaX0ZVTExfRkxVU0gpOworCQlpZiAociAhPSBaX09LICYmIHIgIT0gWl9TVFJFQU1fRU5EKQorCQkJZmF0YWwoImluZmxhdGUgcmV0dXJuZWQgJWQgbXNnOiAlc1xuXHIiLCByLCBzdGF0ZS0+cy5tc2cpOworCQlsZW4gPSBzdGF0ZS0+cy5uZXh0X291dCAtICh1bnNpZ25lZCBjaGFyICopZHN0OworCX0gZWxzZSB7CisJCS8qIHVuY29tcHJlc3NlZCBpbWFnZSAqLworCQlsZW4gPSBtaW4oc3RhdGUtPnMuYXZhaWxfaW4sICh1bnNpZ25lZClkc3RsZW4pOworCQltZW1jcHkoZHN0LCBzdGF0ZS0+cy5uZXh0X2luLCBsZW4pOworCQlzdGF0ZS0+cy5uZXh0X2luICs9IGxlbjsKKwkJc3RhdGUtPnMuYXZhaWxfaW4gLT0gbGVuOworCX0KKwlyZXR1cm4gbGVuOworfQorCisvKioKKyAqIGd1bnppcF9leGFjdGx5IC0gZXh0cmFjdCBhIGZpeGVkIG51bWJlciBvZiBieXRlcyBmcm9tIGEgZ3ppcCBkYXRhIHN0cmVhbQorICogQHN0YXRlOiAgICAgZ3ppcCBzdGF0ZSBzdHJ1Y3R1cmUgcHJldmlvdXNseSBpbml0aWFsaXplZCBieSBndW56aXBfc3RhcnQoKQorICogQGRzdDogICAgICAgYnVmZmVyIHRvIHN0b3JlIGV4dHJhY3RlZCBkYXRhCisgKiBAZHN0bGVuOiAgICBudW1iZXIgb2YgYnl0ZXMgdG8gZXh0cmFjdAorICoKKyAqIFRoaXMgZnVuY3Rpb24gZXh0cmFjdHMgZXhhY3RseSBAZHN0bGVuIGJ5dGVzIGZyb20gdGhlIGRhdGEgc3RyZWFtCisgKiBwcmV2aW91c2x5IGFzc29jaWF0ZWQgd2l0aCBAc3RhdGUgYnkgZ3VuemlwX3N0YXJ0KCksIGRlY29tcHJlc3NpbmcKKyAqIGlmIG5lY2Vzc2FyeS4KKyAqCisgKiBJZiB0aGVyZSBhcmUgbGVzcyBAZHN0bGVuIGJ5dGVzIGF2YWlsYWJsZSBpbiB0aGUgZGF0YSBzdHJlYW0sIG9yIGlmCisgKiBhbnkgb3RoZXIgZXJyb3JzIG9jY3VyLCBzdWNoIGFzIGEgY29ycnVwdGVkIGNvbXByZXNzZWQgc3RyZWFtLCBhbgorICogZXJyb3IgaXMgcHJpbnRlZCBhbiB0aGUgcGxhdGZvcm0ncyBleGl0KCkgZnVuY3Rpb24gaXMgY2FsbGVkLgorICovCit2b2lkIGd1bnppcF9leGFjdGx5KHN0cnVjdCBndW56aXBfc3RhdGUgKnN0YXRlLCB2b2lkICpkc3QsIGludCBkc3RsZW4pCit7CisJaW50IGxlbjsKKworCWxlbiAgPSBndW56aXBfcGFydGlhbChzdGF0ZSwgZHN0LCBkc3RsZW4pOworCWlmIChsZW4gPCBkc3RsZW4pCisJCWZhdGFsKCJcblxyZ3VuemlwX2V4YWN0bHk6IHJhbiBvdXQgb2YgZGF0YSEiCisJCQkJIiBXYW50ZWQgJWQsIGdvdCAlZC5cblxyIiwgZHN0bGVuLCBsZW4pOworfQorCisvKioKKyAqIGd1bnppcF9kaXNjYXJkIC0gZGlzY2FyZCBieXRlcyBmcm9tIGEgZ3ppcCBkYXRhIHN0cmVhbQorICogQHN0YXRlOiAgICAgZ3ppcCBzdGF0ZSBzdHJ1Y3R1cmUgcHJldmlvdXNseSBpbml0aWFsaXplZCBieSBndW56aXBfc3RhcnQoKQorICogQGxlbjogICAgICAgbnVtYmVyIG9mIGJ5dGVzIHRvIGRpc2NhcmQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGV4dHJhY3RzLCB0aGVuIGRpc2NhcmRzIGV4YWN0bHkgQGxlbiBieXRlcyBmcm9tIHRoZQorICogZGF0YSBzdHJlYW0gcHJldmlvdXNseSBhc3NvY2lhdGVkIHdpdGggQHN0YXRlIGJ5IGd1bnppcF9zdGFydCgpLgorICogU3Vic2VxdWVudCBndW56aXBfcGFydGlhbCgpLCBndW56aXBfZXhhY3RseSgpIG9yIGd1bnppcF9maW5pc2goKQorICogY2FsbHMgd2lsbCBleHRyYWN0IHRoZSBkYXRhIGZvbGxvd2luZyB0aGUgZGlzY2FyZGVkIGJ5dGVzIGluIHRoZQorICogZGF0YSBzdHJlYW0uCisgKgorICogSWYgdGhlcmUgYXJlIGxlc3MgQGxlbiBieXRlcyBhdmFpbGFibGUgaW4gdGhlIGRhdGEgc3RyZWFtLCBvciBpZgorICogYW55IG90aGVyIGVycm9ycyBvY2N1ciwgc3VjaCBhcyBhIGNvcnJ1cHRlZCBjb21wcmVzc2VkIHN0cmVhbSwgYW4KKyAqIGVycm9yIGlzIHByaW50ZWQgYW4gdGhlIHBsYXRmb3JtJ3MgZXhpdCgpIGZ1bmN0aW9uIGlzIGNhbGxlZC4KKyAqLwordm9pZCBndW56aXBfZGlzY2FyZChzdHJ1Y3QgZ3VuemlwX3N0YXRlICpzdGF0ZSwgaW50IGxlbikKK3sKKwlzdGF0aWMgY2hhciBkaXNjYXJkX2J1ZlsxMjhdOworCisJd2hpbGUgKGxlbiA+IHNpemVvZihkaXNjYXJkX2J1ZikpIHsKKwkJZ3VuemlwX2V4YWN0bHkoc3RhdGUsIGRpc2NhcmRfYnVmLCBzaXplb2YoZGlzY2FyZF9idWYpKTsKKwkJbGVuIC09IHNpemVvZihkaXNjYXJkX2J1Zik7CisJfQorCisJaWYgKGxlbiA+IDApCisJCWd1bnppcF9leGFjdGx5KHN0YXRlLCBkaXNjYXJkX2J1ZiwgbGVuKTsKK30KKworLyoqCisgKiBndW56aXBfZmluaXNoIC0gZXh0cmFjdCBhbGwgcmVtYWluaW5nIGJ5dGVzIGZyb20gYSBnemlwIGRhdGEgc3RyZWFtCisgKiBAc3RhdGU6ICAgICBnemlwIHN0YXRlIHN0cnVjdHVyZSBwcmV2aW91c2x5IGluaXRpYWxpemVkIGJ5IGd1bnppcF9zdGFydCgpCisgKiBAZHN0OiAgICAgICBidWZmZXIgdG8gc3RvcmUgZXh0cmFjdGVkIGRhdGEKKyAqIEBkc3RsZW46ICAgIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIGV4dHJhY3QKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGV4dHJhY3RzIGFsbCByZW1haW5pbmcgZGF0YSwgb3IgYXQgbW9zdCBAZHN0bGVuCisgKiBieXRlcywgZnJvbSB0aGUgc3RyZWFtIHByZXZpb3VzbHkgYXNzb2NpYXRlZCB3aXRoIEBzdGF0ZSBieQorICogZ3VuemlwX3N0YXJ0KCkuICB6bGliIGlzIHRoZW4gc2h1dCBkb3duLCBzbyBpdCBpcyBhbiBlcnJvciB0byB1c2UKKyAqIGFueSBvZiB0aGUgZnVuY3Rpb25zIGluIHRoaXMgZmlsZSBvbiBAc3RhdGUgdW50aWwgaXQgaXMKKyAqIHJlLWluaXRpYWxpemVkIHdpdGggYW5vdGhlciBjYWxsIHRvIGd1bnppcF9zdGFydCgpLgorICoKKyAqIElmIGFueSBlcnJvcnMgb2NjdXIsIHN1Y2ggYXMgYSBjb3JydXB0ZWQgY29tcHJlc3NlZCBzdHJlYW0sIGFuCisgKiBlcnJvciBpcyBwcmludGVkIGFuIHRoZSBwbGF0Zm9ybSdzIGV4aXQoKSBmdW5jdGlvbiBpcyBjYWxsZWQuCisgKi8KK2ludCBndW56aXBfZmluaXNoKHN0cnVjdCBndW56aXBfc3RhdGUgKnN0YXRlLCB2b2lkICpkc3QsIGludCBkc3RsZW4pCit7CisJaW50IGxlbjsKKworCWlmIChzdGF0ZS0+cy53b3Jrc3BhY2UpIHsKKwkJbGVuID0gZ3VuemlwX3BhcnRpYWwoc3RhdGUsIGRzdCwgZHN0bGVuKTsKKwkJemxpYl9pbmZsYXRlRW5kKCZzdGF0ZS0+cyk7CisJfSBlbHNlIHsKKwkJLyogdW5jb21wcmVzc2VkIGltYWdlICovCisJCWxlbiA9IG1pbihzdGF0ZS0+cy5hdmFpbF9pbiwgKHVuc2lnbmVkKWRzdGxlbik7CisJCW1lbWNweShkc3QsIHN0YXRlLT5zLm5leHRfaW4sIGxlbik7CisJfQorCisJcmV0dXJuIGxlbjsKK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2d1bnppcF91dGlsLmggYi9hcmNoL3Bvd2VycGMvYm9vdC9ndW56aXBfdXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzZGZhNmUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9ndW56aXBfdXRpbC5oCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBEZWNvbXByZXNzaW9uIGNvbnZlbmllbmNlIGZ1bmN0aW9ucworICoKKyAqIENvcHlyaWdodCAyMDA3IERhdmlkIEdpYnNvbiwgSUJNIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIuICBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueQorICogd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICovCisjaWZuZGVmIF9QUENfQk9PVF9HVU5aSVBfVVRJTF9IXworI2RlZmluZSBfUFBDX0JPT1RfR1VOWklQX1VUSUxfSF8KKworI2luY2x1ZGUgInpsaWIuaCIKKworLyoKKyAqIFRoZXNlIGZ1bmN0aW9ucyBhcmUgZGVzaWduZWQgdG8gbWFrZSBsaWZlIGVhc3kgZm9yIGRlY29tcHJlc3NpbmcKKyAqIGtlcm5lbCBpbWFnZXMsIGluaXRyZCBpbWFnZXMgb3IgYW55IG90aGVyIGd6aXAgY29tcHJlc3NlZCBpbWFnZSwKKyAqIHBhcnRpY3VsYXJseSBpZiBpdHMgdXNlZnVsIHRvIGRlY29tcHJlc3MgcGFydCBvZiB0aGUgaW1hZ2UgKGUuZy4gdG8KKyAqIGV4YW1pbmUgaGVhZGVycykgYmVmb3JlIGRlY29tcHJlc3NpbmcgdGhlIHJlbWFpbmRlci4KKyAqCisgKiBUbyB1c2U6CisgKiAgICAgLSBkZWNsYXJlIGEgZ3VuemlwX3N0YXRlIHN0cnVjdHVyZQorICogICAgIC0gdXNlIGd1bnppcF9zdGFydCgpIHRvIGluaXRpYWxpemUgdGhlIHN0YXRlLCBhc3NvY2lhdGluZyBpdAorICogICAgICAgd2l0aCBhIHN0cmVhbSBvZiBjb21wcmVzc2VkIGRhdGEKKyAqICAgICAtIHVzZSBndW56aXBfcGFydGlhbCgpLCBndW56aXBfZXhhY3RseSgpIGFuZCBndW56aXBfZGlzY2FyZCgpCisgKiAgICAgICBpbiBhbnkgY29tYmluYXRpb24gdG8gZXh0cmFjdCBwaWVjZXMgb2YgZGF0YSBmcm9tIHRoZSBzdHJlYW0KKyAqICAgICAtIEZpbmFsbHkgdXNlIGd1bnppcF9maW5pc2goKSB0byBleHRyYWN0IHRoZSB0YWlsIG9mIHRoZQorICogICAgICAgY29tcHJlc3NlZCBzdHJlYW0gYW5kIHdpbmQgdXAgemxpYgorICovCisKKy8qIHNjcmF0Y2ggc3BhY2UgZm9yIGd1bnppcDsgNDY5MTIgaXMgZnJvbSB6bGliX2luZmxhdGVfd29ya3NwYWNlc2l6ZSgpICovCisjZGVmaW5lIEdVTlpJUF9TQ1JBVENIX1NJWkUJNDY5MTIKKworc3RydWN0IGd1bnppcF9zdGF0ZSB7CisJel9zdHJlYW0gczsKKwljaGFyIHNjcmF0Y2hbNDY5MTJdOworfTsKKwordm9pZCBndW56aXBfc3RhcnQoc3RydWN0IGd1bnppcF9zdGF0ZSAqc3RhdGUsIHZvaWQgKnNyYywgaW50IHNyY2xlbik7CitpbnQgZ3VuemlwX3BhcnRpYWwoc3RydWN0IGd1bnppcF9zdGF0ZSAqc3RhdGUsIHZvaWQgKmRzdCwgaW50IGRzdGxlbik7Cit2b2lkIGd1bnppcF9leGFjdGx5KHN0cnVjdCBndW56aXBfc3RhdGUgKnN0YXRlLCB2b2lkICpkc3QsIGludCBsZW4pOwordm9pZCBndW56aXBfZGlzY2FyZChzdHJ1Y3QgZ3VuemlwX3N0YXRlICpzdGF0ZSwgaW50IGxlbik7CitpbnQgZ3VuemlwX2ZpbmlzaChzdHJ1Y3QgZ3VuemlwX3N0YXRlICpzdGF0ZSwgdm9pZCAqZHN0LCBpbnQgbGVuKTsKKworI2VuZGlmIC8qIF9QUENfQk9PVF9HVU5aSVBfVVRJTF9IXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvbWFpbi5jIGIvYXJjaC9wb3dlcnBjL2Jvb3QvbWFpbi5jCmluZGV4IDZmNmI1MGQuLjU2YjU2YTggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L21haW4uYworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9tYWluLmMKQEAgLTE0LDExICsxNCwxMCBAQAogI2luY2x1ZGUgInBhZ2UuaCIKICNpbmNsdWRlICJzdHJpbmcuaCIKICNpbmNsdWRlICJzdGRpby5oIgotI2luY2x1ZGUgInpsaWIuaCIKICNpbmNsdWRlICJvcHMuaCIKKyNpbmNsdWRlICJndW56aXBfdXRpbC5oIgogI2luY2x1ZGUgImZsYXRkZXZ0cmVlLmgiCi0KLWV4dGVybiB2b2lkIGZsdXNoX2NhY2hlKHZvaWQgKiwgdW5zaWduZWQgbG9uZyk7CisjaW5jbHVkZSAicmVnLmgiCiAKIGV4dGVybiBjaGFyIF9zdGFydFtdOwogZXh0ZXJuIGNoYXIgX19ic3Nfc3RhcnRbXTsKQEAgLTMwLDMwNCArMjksMTczIEBACiBleHRlcm4gY2hhciBfZHRiX3N0YXJ0W107CiBleHRlcm4gY2hhciBfZHRiX2VuZFtdOwogCitzdGF0aWMgc3RydWN0IGd1bnppcF9zdGF0ZSBnenN0YXRlOworCiBzdHJ1Y3QgYWRkcl9yYW5nZSB7Ci0JdW5zaWduZWQgbG9uZyBhZGRyOworCXZvaWQgKmFkZHI7CiAJdW5zaWduZWQgbG9uZyBzaXplOwotCXVuc2lnbmVkIGxvbmcgbWVtc2l6ZTsKIH07Ci1zdGF0aWMgc3RydWN0IGFkZHJfcmFuZ2Ugdm1saW51eDsKLXN0YXRpYyBzdHJ1Y3QgYWRkcl9yYW5nZSB2bWxpbnV6Owotc3RhdGljIHN0cnVjdCBhZGRyX3JhbmdlIGluaXRyZDsKLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgZWxmb2Zmc2V0Owotc3RhdGljIGludCBpc182NGJpdDsKLQotLyogc2NyYXRjaCBzcGFjZSBmb3IgZ3VuemlwOyA0NjkxMiBpcyBmcm9tIHpsaWJfaW5mbGF0ZV93b3Jrc3BhY2VzaXplKCkgKi8KLXN0YXRpYyBjaGFyIHNjcmF0Y2hbNDY5MTJdOwotc3RhdGljIGNoYXIgZWxmaGVhZGVyWzI1Nl07CiAKIHR5cGVkZWYgdm9pZCAoKmtlcm5lbF9lbnRyeV90KSh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCB2b2lkICopOwogCiAjdW5kZWYgREVCVUcKIAotI2RlZmluZSBIRUFEX0NSQwkyCi0jZGVmaW5lIEVYVFJBX0ZJRUxECTQKLSNkZWZpbmUgT1JJR19OQU1FCTgKLSNkZWZpbmUgQ09NTUVOVAkJMHgxMAotI2RlZmluZSBSRVNFUlZFRAkweGUwCi0KLXN0YXRpYyB2b2lkIGd1bnppcCh2b2lkICpkc3QsIGludCBkc3RsZW4sIHVuc2lnbmVkIGNoYXIgKnNyYywgaW50ICpsZW5wKQorc3RhdGljIHN0cnVjdCBhZGRyX3JhbmdlIHByZXBfa2VybmVsKHZvaWQpCiB7Ci0Jel9zdHJlYW0gczsKLQlpbnQgciwgaSwgZmxhZ3M7Ci0KLQkvKiBza2lwIGhlYWRlciAqLwotCWkgPSAxMDsKLQlmbGFncyA9IHNyY1szXTsKLQlpZiAoc3JjWzJdICE9IFpfREVGTEFURUQgfHwgKGZsYWdzICYgUkVTRVJWRUQpICE9IDApIHsKLQkJcHJpbnRmKCJiYWQgZ3ppcHBlZCBkYXRhXG5cciIpOwotCQlleGl0KCk7Ci0JfQotCWlmICgoZmxhZ3MgJiBFWFRSQV9GSUVMRCkgIT0gMCkKLQkJaSA9IDEyICsgc3JjWzEwXSArIChzcmNbMTFdIDw8IDgpOwotCWlmICgoZmxhZ3MgJiBPUklHX05BTUUpICE9IDApCi0JCXdoaWxlIChzcmNbaSsrXSAhPSAwKQotCQkJOwotCWlmICgoZmxhZ3MgJiBDT01NRU5UKSAhPSAwKQotCQl3aGlsZSAoc3JjW2krK10gIT0gMCkKLQkJCTsKLQlpZiAoKGZsYWdzICYgSEVBRF9DUkMpICE9IDApCi0JCWkgKz0gMjsKLQlpZiAoaSA+PSAqbGVucCkgewotCQlwcmludGYoImd1bnppcDogcmFuIG91dCBvZiBkYXRhIGluIGhlYWRlclxuXHIiKTsKLQkJZXhpdCgpOwotCX0KLQotCWlmICh6bGliX2luZmxhdGVfd29ya3NwYWNlc2l6ZSgpID4gc2l6ZW9mKHNjcmF0Y2gpKSB7Ci0JCXByaW50ZigiZ3VuemlwIG5lZWRzIG1vcmUgbWVtXG4iKTsKLQkJZXhpdCgpOwotCX0KLQltZW1zZXQoJnMsIDAsIHNpemVvZihzKSk7Ci0Jcy53b3Jrc3BhY2UgPSBzY3JhdGNoOwotCXIgPSB6bGliX2luZmxhdGVJbml0MigmcywgLU1BWF9XQklUUyk7Ci0JaWYgKHIgIT0gWl9PSykgewotCQlwcmludGYoImluZmxhdGVJbml0MiByZXR1cm5lZCAlZFxuXHIiLCByKTsKLQkJZXhpdCgpOwotCX0KLQlzLm5leHRfaW4gPSBzcmMgKyBpOwotCXMuYXZhaWxfaW4gPSAqbGVucCAtIGk7Ci0Jcy5uZXh0X291dCA9IGRzdDsKLQlzLmF2YWlsX291dCA9IGRzdGxlbjsKLQlyID0gemxpYl9pbmZsYXRlKCZzLCBaX0ZVTExfRkxVU0gpOwotCWlmIChyICE9IFpfT0sgJiYgciAhPSBaX1NUUkVBTV9FTkQpIHsKLQkJcHJpbnRmKCJpbmZsYXRlIHJldHVybmVkICVkIG1zZzogJXNcblxyIiwgciwgcy5tc2cpOwotCQlleGl0KCk7Ci0JfQotCSpsZW5wID0gcy5uZXh0X291dCAtICh1bnNpZ25lZCBjaGFyICopIGRzdDsKLQl6bGliX2luZmxhdGVFbmQoJnMpOwotfQotCi1zdGF0aWMgaW50IGlzX2VsZjY0KHZvaWQgKmhkcikKLXsKLQlFbGY2NF9FaGRyICplbGY2NCA9IGhkcjsKLQlFbGY2NF9QaGRyICplbGY2NHBoOwotCXVuc2lnbmVkIGludCBpOwotCi0JaWYgKCEoZWxmNjQtPmVfaWRlbnRbRUlfTUFHMF0gID09IEVMRk1BRzAJJiYKLQkgICAgICBlbGY2NC0+ZV9pZGVudFtFSV9NQUcxXSAgPT0gRUxGTUFHMQkmJgotCSAgICAgIGVsZjY0LT5lX2lkZW50W0VJX01BRzJdICA9PSBFTEZNQUcyCSYmCi0JICAgICAgZWxmNjQtPmVfaWRlbnRbRUlfTUFHM10gID09IEVMRk1BRzMJJiYKLQkgICAgICBlbGY2NC0+ZV9pZGVudFtFSV9DTEFTU10gPT0gRUxGQ0xBU1M2NAkmJgotCSAgICAgIGVsZjY0LT5lX2lkZW50W0VJX0RBVEFdICA9PSBFTEZEQVRBMk1TQgkmJgotCSAgICAgIGVsZjY0LT5lX3R5cGUgICAgICAgICAgICA9PSBFVF9FWEVDCSYmCi0JICAgICAgZWxmNjQtPmVfbWFjaGluZSAgICAgICAgID09IEVNX1BQQzY0KSkKLQkJcmV0dXJuIDA7Ci0KLQllbGY2NHBoID0gKEVsZjY0X1BoZHIgKikoKHVuc2lnbmVkIGxvbmcpZWxmNjQgKwotCQkJCSAodW5zaWduZWQgbG9uZyllbGY2NC0+ZV9waG9mZik7Ci0JZm9yIChpID0gMDsgaSA8ICh1bnNpZ25lZCBpbnQpZWxmNjQtPmVfcGhudW07IGkrKywgZWxmNjRwaCsrKQotCQlpZiAoZWxmNjRwaC0+cF90eXBlID09IFBUX0xPQUQpCi0JCQlicmVhazsKLQlpZiAoaSA+PSAodW5zaWduZWQgaW50KWVsZjY0LT5lX3BobnVtKQotCQlyZXR1cm4gMDsKLQotCWVsZm9mZnNldCA9ICh1bnNpZ25lZCBsb25nKWVsZjY0cGgtPnBfb2Zmc2V0OwotCXZtbGludXguc2l6ZSA9ICh1bnNpZ25lZCBsb25nKWVsZjY0cGgtPnBfZmlsZXN6ICsgZWxmb2Zmc2V0OwotCXZtbGludXgubWVtc2l6ZSA9ICh1bnNpZ25lZCBsb25nKWVsZjY0cGgtPnBfbWVtc3ogKyBlbGZvZmZzZXQ7Ci0KLQlpc182NGJpdCA9IDE7Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgaXNfZWxmMzIodm9pZCAqaGRyKQotewotCUVsZjMyX0VoZHIgKmVsZjMyID0gaGRyOwotCUVsZjMyX1BoZHIgKmVsZjMycGg7Ci0JdW5zaWduZWQgaW50IGk7Ci0KLQlpZiAoIShlbGYzMi0+ZV9pZGVudFtFSV9NQUcwXSAgPT0gRUxGTUFHMAkmJgotCSAgICAgIGVsZjMyLT5lX2lkZW50W0VJX01BRzFdICA9PSBFTEZNQUcxCSYmCi0JICAgICAgZWxmMzItPmVfaWRlbnRbRUlfTUFHMl0gID09IEVMRk1BRzIJJiYKLQkgICAgICBlbGYzMi0+ZV9pZGVudFtFSV9NQUczXSAgPT0gRUxGTUFHMwkmJgotCSAgICAgIGVsZjMyLT5lX2lkZW50W0VJX0NMQVNTXSA9PSBFTEZDTEFTUzMyCSYmCi0JICAgICAgZWxmMzItPmVfaWRlbnRbRUlfREFUQV0gID09IEVMRkRBVEEyTVNCCSYmCi0JICAgICAgZWxmMzItPmVfdHlwZSAgICAgICAgICAgID09IEVUX0VYRUMJJiYKLQkgICAgICBlbGYzMi0+ZV9tYWNoaW5lICAgICAgICAgPT0gRU1fUFBDKSkKLQkJcmV0dXJuIDA7Ci0KLQllbGYzMiA9IChFbGYzMl9FaGRyICopZWxmaGVhZGVyOwotCWVsZjMycGggPSAoRWxmMzJfUGhkciAqKSAoKHVuc2lnbmVkIGxvbmcpZWxmMzIgKyBlbGYzMi0+ZV9waG9mZik7Ci0JZm9yIChpID0gMDsgaSA8IGVsZjMyLT5lX3BobnVtOyBpKyssIGVsZjMycGgrKykKLQkJaWYgKGVsZjMycGgtPnBfdHlwZSA9PSBQVF9MT0FEKQotCQkJYnJlYWs7Ci0JaWYgKGkgPj0gZWxmMzItPmVfcGhudW0pCi0JCXJldHVybiAwOwotCi0JZWxmb2Zmc2V0ID0gZWxmMzJwaC0+cF9vZmZzZXQ7Ci0Jdm1saW51eC5zaXplID0gZWxmMzJwaC0+cF9maWxlc3ogKyBlbGYzMnBoLT5wX29mZnNldDsKLQl2bWxpbnV4Lm1lbXNpemUgPSBlbGYzMnBoLT5wX21lbXN6ICsgZWxmMzJwaC0+cF9vZmZzZXQ7Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB2b2lkIHByZXBfa2VybmVsKHVuc2lnbmVkIGxvbmcgYTEsIHVuc2lnbmVkIGxvbmcgYTIpCi17CisJY2hhciBlbGZoZWFkZXJbMjU2XTsKKwl2b2lkICp2bWxpbnV6X2FkZHIgPSBfdm1saW51eF9zdGFydDsKKwl1bnNpZ25lZCBsb25nIHZtbGludXpfc2l6ZSA9IF92bWxpbnV4X2VuZCAtIF92bWxpbnV4X3N0YXJ0OworCXZvaWQgKmFkZHIgPSAwOworCXN0cnVjdCBlbGZfaW5mbyBlaTsKIAlpbnQgbGVuOwogCi0Jdm1saW51ei5hZGRyID0gKHVuc2lnbmVkIGxvbmcpX3ZtbGludXhfc3RhcnQ7Ci0Jdm1saW51ei5zaXplID0gKHVuc2lnbmVkIGxvbmcpKF92bWxpbnV4X2VuZCAtIF92bWxpbnV4X3N0YXJ0KTsKLQogCS8qIGd1bnppcCB0aGUgRUxGIGhlYWRlciBvZiB0aGUga2VybmVsICovCi0JaWYgKCoodW5zaWduZWQgc2hvcnQgKil2bWxpbnV6LmFkZHIgPT0gMHgxZjhiKSB7Ci0JCWxlbiA9IHZtbGludXouc2l6ZTsKLQkJZ3VuemlwKGVsZmhlYWRlciwgc2l6ZW9mKGVsZmhlYWRlciksCi0JCQkJKHVuc2lnbmVkIGNoYXIgKil2bWxpbnV6LmFkZHIsICZsZW4pOwotCX0gZWxzZQotCQltZW1jcHkoZWxmaGVhZGVyLCAoY29uc3Qgdm9pZCAqKXZtbGludXouYWRkciwKLQkJICAgICAgIHNpemVvZihlbGZoZWFkZXIpKTsKKwlndW56aXBfc3RhcnQoJmd6c3RhdGUsIHZtbGludXpfYWRkciwgdm1saW51el9zaXplKTsKKwlndW56aXBfZXhhY3RseSgmZ3pzdGF0ZSwgZWxmaGVhZGVyLCBzaXplb2YoZWxmaGVhZGVyKSk7CiAKLQlpZiAoIWlzX2VsZjY0KGVsZmhlYWRlcikgJiYgIWlzX2VsZjMyKGVsZmhlYWRlcikpIHsKLQkJcHJpbnRmKCJFcnJvcjogbm90IGEgdmFsaWQgUFBDMzIgb3IgUFBDNjQgRUxGIGZpbGUhXG5cciIpOwotCQlleGl0KCk7Ci0JfQorCWlmICghcGFyc2VfZWxmNjQoZWxmaGVhZGVyLCAmZWkpICYmICFwYXJzZV9lbGYzMihlbGZoZWFkZXIsICZlaSkpCisJCWZhdGFsKCJFcnJvcjogbm90IGEgdmFsaWQgUFBDMzIgb3IgUFBDNjQgRUxGIGZpbGUhXG5cciIpOworCiAJaWYgKHBsYXRmb3JtX29wcy5pbWFnZV9oZHIpCiAJCXBsYXRmb3JtX29wcy5pbWFnZV9oZHIoZWxmaGVhZGVyKTsKIAotCS8qIFdlIG5lZWQgdG8gYWxsb2MgdGhlIG1lbXNpemUgcGx1cyB0aGUgZmlsZSBvZmZzZXQgc2luY2UgZ3ppcAotCSAqIHdpbGwgZXhwYW5kIHRoZSBoZWFkZXIgKGZpbGUgb2Zmc2V0KSwgdGhlbiB0aGUga2VybmVsLCB0aGVuCi0JICogcG9zc2libGUgcnViYmlzaCB3ZSBkb24ndCBjYXJlIGFib3V0LiBCdXQgdGhlIGtlcm5lbCBic3MgbXVzdAotCSAqIGJlIGNsYWltZWQgKGl0IHdpbGwgYmUgemVybydkIGJ5IHRoZSBrZXJuZWwgaXRzZWxmKQorCS8qIFdlIG5lZWQgdG8gYWxsb2MgdGhlIG1lbXNpemU6IGd6aXAgd2lsbCBleHBhbmQgdGhlIGtlcm5lbAorCSAqIHRleHQvZGF0YSwgdGhlbiBwb3NzaWJsZSBydWJiaXNoIHdlIGRvbid0IGNhcmUgYWJvdXQuIEJ1dAorCSAqIHRoZSBrZXJuZWwgYnNzIG11c3QgYmUgY2xhaW1lZCAoaXQgd2lsbCBiZSB6ZXJvJ2QgYnkgdGhlCisJICoga2VybmVsIGl0c2VsZikKIAkgKi8KLQlwcmludGYoIkFsbG9jYXRpbmcgMHglbHggYnl0ZXMgZm9yIGtlcm5lbCAuLi5cblxyIiwgdm1saW51eC5tZW1zaXplKTsKLQl2bWxpbnV4LmFkZHIgPSAodW5zaWduZWQgbG9uZyltYWxsb2Modm1saW51eC5tZW1zaXplKTsKLQlpZiAodm1saW51eC5hZGRyID09IDApIHsKLQkJcHJpbnRmKCJDYW4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGtlcm5lbCBpbWFnZSAhXG5cciIpOwotCQlleGl0KCk7CisJcHJpbnRmKCJBbGxvY2F0aW5nIDB4JWx4IGJ5dGVzIGZvciBrZXJuZWwgLi4uXG5cciIsIGVpLm1lbXNpemUpOworCisJaWYgKHBsYXRmb3JtX29wcy52bWxpbnV4X2FsbG9jKSB7CisJCWFkZHIgPSBwbGF0Zm9ybV9vcHMudm1saW51eF9hbGxvYyhlaS5tZW1zaXplKTsKKwl9IGVsc2UgeworCQlpZiAoKHVuc2lnbmVkIGxvbmcpX3N0YXJ0IDwgZWkubWVtc2l6ZSkKKwkJCWZhdGFsKCJJbnN1ZmZpY2llbnQgbWVtb3J5IGZvciBrZXJuZWwgYXQgYWRkcmVzcyAwISIKKwkJCSAgICAgICAiIChfc3RhcnQ9JXApXG5cciIsIF9zdGFydCk7CiAJfQogCisJLyogRmluYWxseSwgZ3VuemlwIHRoZSBrZXJuZWwgKi8KKwlwcmludGYoImd1bnppcHBpbmcgKDB4JXAgPC0gMHglcDoweCVwKS4uLiIsIGFkZHIsCisJICAgICAgIHZtbGludXpfYWRkciwgdm1saW51el9hZGRyK3ZtbGludXpfc2l6ZSk7CisJLyogZGlzY2FyZCB1cCB0byB0aGUgYWN0dWFsIGxvYWQgZGF0YSAqLworCWd1bnppcF9kaXNjYXJkKCZnenN0YXRlLCBlaS5lbGZvZmZzZXQgLSBzaXplb2YoZWxmaGVhZGVyKSk7CisJbGVuID0gZ3VuemlwX2ZpbmlzaCgmZ3pzdGF0ZSwgYWRkciwgZWkubG9hZHNpemUpOworCWlmIChsZW4gIT0gZWkubG9hZHNpemUpCisJCWZhdGFsKCJyYW4gb3V0IG9mIGRhdGEhICBvbmx5IGdvdCAweCV4IG9mIDB4JWx4IGJ5dGVzLlxuXHIiLAorCQkJCWxlbiwgZWkubG9hZHNpemUpOworCXByaW50ZigiZG9uZSAweCV4IGJ5dGVzXG5cciIsIGxlbik7CisKKwlmbHVzaF9jYWNoZShhZGRyLCBlaS5sb2Fkc2l6ZSk7CisKKwlyZXR1cm4gKHN0cnVjdCBhZGRyX3JhbmdlKXthZGRyLCBlaS5tZW1zaXplfTsKK30KKworc3RhdGljIHN0cnVjdCBhZGRyX3JhbmdlIHByZXBfaW5pdHJkKHN0cnVjdCBhZGRyX3JhbmdlIHZtbGludXgsIHZvaWQgKmNob3NlbiwKKwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgaW5pdHJkX2FkZHIsCisJCQkJICAgICB1bnNpZ25lZCBsb25nIGluaXRyZF9zaXplKQoreworCS8qIElmIHdlIGhhdmUgYW4gaW1hZ2UgYXR0YWNoZWQgdG8gdXMsIGl0IG92ZXJyaWRlcyBhbnl0aGluZworCSAqIHN1cHBsaWVkIGJ5IHRoZSBsb2FkZXIuICovCisJaWYgKF9pbml0cmRfZW5kID4gX2luaXRyZF9zdGFydCkgeworCQlwcmludGYoIkF0dGFjaGVkIGluaXRyZCBpbWFnZSBhdCAweCVwLTB4JXBcblxyIiwKKwkJICAgICAgIF9pbml0cmRfc3RhcnQsIF9pbml0cmRfZW5kKTsKKwkJaW5pdHJkX2FkZHIgPSAodW5zaWduZWQgbG9uZylfaW5pdHJkX3N0YXJ0OworCQlpbml0cmRfc2l6ZSA9IF9pbml0cmRfZW5kIC0gX2luaXRyZF9zdGFydDsKKwl9IGVsc2UgaWYgKGluaXRyZF9zaXplID4gMCkgeworCQlwcmludGYoIlVzaW5nIGxvYWRlciBzdXBwbGllZCByYW1kaXNrIGF0IDB4JWx4LTB4JWx4XG5cciIsCisJCSAgICAgICBpbml0cmRfYWRkciwgaW5pdHJkX2FkZHIgKyBpbml0cmRfc2l6ZSk7CisJfQorCisJLyogSWYgdGhlcmUncyBubyBpbml0cmQgYXQgYWxsLCB3ZSdyZSBkb25lICovCisJaWYgKCEgaW5pdHJkX3NpemUpCisJCXJldHVybiAoc3RydWN0IGFkZHJfcmFuZ2UpezAsIDB9OworCiAJLyoKLQkgKiBOb3cgZmluZCB0aGUgaW5pdHJkCi0JICoKLQkgKiBGaXJzdCBzZWUgaWYgd2UgaGF2ZSBhbiBpbWFnZSBhdHRhY2hlZCB0byB1cy4gIElmIHNvCi0JICogYWxsb2NhdGUgbWVtb3J5IGZvciBpdCBhbmQgY29weSBpdCB0aGVyZS4KKwkgKiBJZiB0aGUgaW5pdHJkIGlzIHRvbyBsb3cgaXQgd2lsbCBiZSBjbG9iYmVyZWQgd2hlbiB0aGUKKwkgKiBrZXJuZWwgcmVsb2NhdGVzIHRvIGl0cyBmaW5hbCBsb2NhdGlvbi4gIEluIHRoaXMgY2FzZSwKKwkgKiBhbGxvY2F0ZSBhIHNhZmVyIHBsYWNlIGFuZCBtb3ZlIGl0LgogCSAqLwotCWluaXRyZC5zaXplID0gKHVuc2lnbmVkIGxvbmcpKF9pbml0cmRfZW5kIC0gX2luaXRyZF9zdGFydCk7Ci0JaW5pdHJkLm1lbXNpemUgPSBpbml0cmQuc2l6ZTsKLQlpZiAoaW5pdHJkLnNpemUgPiAwKSB7CisJaWYgKGluaXRyZF9hZGRyIDwgdm1saW51eC5zaXplKSB7CisJCXZvaWQgKm9sZF9hZGRyID0gKHZvaWQgKilpbml0cmRfYWRkcjsKKwogCQlwcmludGYoIkFsbG9jYXRpbmcgMHglbHggYnl0ZXMgZm9yIGluaXRyZCAuLi5cblxyIiwKLQkJICAgICAgIGluaXRyZC5zaXplKTsKLQkJaW5pdHJkLmFkZHIgPSAodW5zaWduZWQgbG9uZyltYWxsb2MoKHUzMilpbml0cmQuc2l6ZSk7Ci0JCWlmIChpbml0cmQuYWRkciA9PSAwKSB7Ci0JCQlwcmludGYoIkNhbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgaW5pdGlhbCAiCi0JCQkJCSJyYW1kaXNrICFcblxyIik7Ci0JCQlleGl0KCk7Ci0JCX0KLQkJcHJpbnRmKCJpbml0aWFsIHJhbWRpc2sgbW92aW5nIDB4JWx4IDwtIDB4JWx4ICIKLQkJCSIoMHglbHggYnl0ZXMpXG5cciIsIGluaXRyZC5hZGRyLAotCQkJKHVuc2lnbmVkIGxvbmcpX2luaXRyZF9zdGFydCwgaW5pdHJkLnNpemUpOwotCQltZW1tb3ZlKCh2b2lkICopaW5pdHJkLmFkZHIsICh2b2lkICopX2luaXRyZF9zdGFydCwKLQkJCWluaXRyZC5zaXplKTsKLQkJcHJpbnRmKCJpbml0cmQgaGVhZDogMHglbHhcblxyIiwKLQkJCQkqKCh1bnNpZ25lZCBsb25nICopaW5pdHJkLmFkZHIpKTsKLQl9IGVsc2UgaWYgKGEyICE9IDApIHsKLQkJLyogT3RoZXJ3aXNlLCBzZWUgaWYgeWFib290IG9yIGFub3RoZXIgbG9hZGVyIGdhdmUgdXMgYW4gaW5pdHJkICovCi0JCWluaXRyZC5hZGRyID0gYTE7Ci0JCWluaXRyZC5tZW1zaXplID0gaW5pdHJkLnNpemUgPSBhMjsKLQkJcHJpbnRmKCJVc2luZyBsb2FkZXIgc3VwcGxpZWQgaW5pdHJkIGF0IDB4JWx4ICgweCVseCBieXRlcylcblxyIiwKLQkJICAgICAgIGluaXRyZC5hZGRyLCBpbml0cmQuc2l6ZSk7CisJCSAgICAgICBpbml0cmRfc2l6ZSk7CisJCWluaXRyZF9hZGRyID0gKHVuc2lnbmVkIGxvbmcpbWFsbG9jKGluaXRyZF9zaXplKTsKKwkJaWYgKCEgaW5pdHJkX2FkZHIpCisJCQlmYXRhbCgiQ2FuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciBpbml0aWFsICIKKwkJCSAgICAgICAicmFtZGlzayAhXG5cciIpOworCQlwcmludGYoIlJlbG9jYXRpbmcgaW5pdHJkIDB4JWx4IDwtIDB4JXAgKDB4JWx4IGJ5dGVzKVxuXHIiLAorCQkgICAgICAgaW5pdHJkX2FkZHIsIG9sZF9hZGRyLCBpbml0cmRfc2l6ZSk7CisJCW1lbW1vdmUoKHZvaWQgKilpbml0cmRfYWRkciwgb2xkX2FkZHIsIGluaXRyZF9zaXplKTsKIAl9CiAKLQkvKiBFdmVudHVhbGx5IGd1bnppcCB0aGUga2VybmVsICovCi0JaWYgKCoodW5zaWduZWQgc2hvcnQgKil2bWxpbnV6LmFkZHIgPT0gMHgxZjhiKSB7Ci0JCXByaW50ZigiZ3VuemlwcGluZyAoMHglbHggPC0gMHglbHg6MHglMGx4KS4uLiIsCi0JCSAgICAgICB2bWxpbnV4LmFkZHIsIHZtbGludXouYWRkciwgdm1saW51ei5hZGRyK3ZtbGludXouc2l6ZSk7Ci0JCWxlbiA9IHZtbGludXouc2l6ZTsKLQkJZ3VuemlwKCh2b2lkICopdm1saW51eC5hZGRyLCB2bWxpbnV4Lm1lbXNpemUsCi0JCQkodW5zaWduZWQgY2hhciAqKXZtbGludXouYWRkciwgJmxlbik7Ci0JCXByaW50ZigiZG9uZSAweCVseCBieXRlc1xuXHIiLCBsZW4pOwotCX0gZWxzZSB7Ci0JCW1lbW1vdmUoKHZvaWQgKil2bWxpbnV4LmFkZHIsKHZvaWQgKil2bWxpbnV6LmFkZHIsCi0JCQl2bWxpbnV6LnNpemUpOwotCX0KKwlwcmludGYoImluaXRyZCBoZWFkOiAweCVseFxuXHIiLCAqKCh1bnNpZ25lZCBsb25nICopaW5pdHJkX2FkZHIpKTsKIAotCS8qIFNraXAgb3ZlciB0aGUgRUxGIGhlYWRlciAqLwotI2lmZGVmIERFQlVHCi0JcHJpbnRmKCIuLi4gc2tpcHBpbmcgMHglbHggYnl0ZXMgb2YgRUxGIGhlYWRlclxuXHIiLAotCQkJZWxmb2Zmc2V0KTsKLSNlbmRpZgotCXZtbGludXguYWRkciArPSBlbGZvZmZzZXQ7CisJLyogVGVsbCB0aGUga2VybmVsIGluaXRyZCBhZGRyZXNzIHZpYSBkZXZpY2UgdHJlZSAqLworCXNldHByb3BfdmFsKGNob3NlbiwgImxpbnV4LGluaXRyZC1zdGFydCIsICh1MzIpKGluaXRyZF9hZGRyKSk7CisJc2V0cHJvcF92YWwoY2hvc2VuLCAibGludXgsaW5pdHJkLWVuZCIsICh1MzIpKGluaXRyZF9hZGRyK2luaXRyZF9zaXplKSk7CiAKLQlmbHVzaF9jYWNoZSgodm9pZCAqKXZtbGludXguYWRkciwgdm1saW51eC5zaXplKTsKKwlyZXR1cm4gKHN0cnVjdCBhZGRyX3JhbmdlKXsodm9pZCAqKWluaXRyZF9hZGRyLCBpbml0cmRfc2l6ZX07CiB9CiAKIC8qIEEgYnVmZmVyIHRoYXQgbWF5IGJlIGVkaXRlZCBieSB0b29scyBvcGVyYXRpbmcgb24gYSB6SW1hZ2UgYmluYXJ5IHNvIGFzIHRvCiAgKiBlZGl0IHRoZSBjb21tYW5kIGxpbmUgcGFzc2VkIHRvIHZtbGludXggKGJ5IHNldHRpbmcgL2Nob3Nlbi9ib290YXJncykuCiAgKiBUaGUgYnVmZmVyIGlzIHB1dCBpbiBpdCdzIG93biBzZWN0aW9uIHNvIHRoYXQgdG9vbHMgbWF5IGxvY2F0ZSBpdCBlYXNpZXIuCiAgKi8KLXN0YXRpYyBjaGFyIGJ1aWx0aW5fY21kbGluZVtDT01NQU5EX0xJTkVfU0laRV0KK3N0YXRpYyBjaGFyIGNtZGxpbmVbQ09NTUFORF9MSU5FX1NJWkVdCiAJX19hdHRyaWJ1dGVfXygoX19zZWN0aW9uX18oIl9fYnVpbHRpbl9jbWRsaW5lIikpKTsKIAotc3RhdGljIHZvaWQgZ2V0X2NtZGxpbmUoY2hhciAqYnVmLCBpbnQgc2l6ZSkKK3N0YXRpYyB2b2lkIHByZXBfY21kbGluZSh2b2lkICpjaG9zZW4pCiB7Ci0Jdm9pZCAqZGV2cDsKLQlpbnQgbGVuID0gc3RybGVuKGJ1aWx0aW5fY21kbGluZSk7CisJaWYgKGNtZGxpbmVbMF0gPT0gJ1wwJykKKwkJZ2V0cHJvcChjaG9zZW4sICJib290YXJncyIsIGNtZGxpbmUsIENPTU1BTkRfTElORV9TSVpFLTEpOwogCi0JYnVmWzBdID0gJ1wwJzsKKwlwcmludGYoIlxuXHJMaW51eC9Qb3dlclBDIGxvYWQ6ICVzIiwgY21kbGluZSk7CisJLyogSWYgcG9zc2libGUsIGVkaXQgdGhlIGNvbW1hbmQgbGluZSAqLworCWlmIChjb25zb2xlX29wcy5lZGl0X2NtZGxpbmUpCisJCWNvbnNvbGVfb3BzLmVkaXRfY21kbGluZShjbWRsaW5lLCBDT01NQU5EX0xJTkVfU0laRSk7CisJcHJpbnRmKCJcblxyIik7CiAKLQlpZiAobGVuID4gMCkgeyAvKiBidWlsdGluX2NtZGxpbmUgb3ZlcnJpZGVzIGR0J3MgL2Nob3Nlbi9ib290YXJncyAqLwotCQlsZW4gPSBtaW4obGVuLCBzaXplLTEpOwotCQlzdHJuY3B5KGJ1ZiwgYnVpbHRpbl9jbWRsaW5lLCBsZW4pOwotCQlidWZbbGVuXSA9ICdcMCc7Ci0JfQotCWVsc2UgaWYgKChkZXZwID0gZmluZGRldmljZSgiL2Nob3NlbiIpKSkKLQkJZ2V0cHJvcChkZXZwLCAiYm9vdGFyZ3MiLCBidWYsIHNpemUpOwotfQotCi1zdGF0aWMgdm9pZCBzZXRfY21kbGluZShjaGFyICpidWYpCi17Ci0Jdm9pZCAqZGV2cDsKLQotCWlmICgoZGV2cCA9IGZpbmRkZXZpY2UoIi9jaG9zZW4iKSkpCi0JCXNldHByb3AoZGV2cCwgImJvb3RhcmdzIiwgYnVmLCBzdHJsZW4oYnVmKSArIDEpOworCS8qIFB1dCB0aGUgY29tbWFuZCBsaW5lIGJhY2sgaW50byB0aGUgZGV2dHJlZSBmb3IgdGhlIGtlcm5lbCAqLworCXNldHByb3Bfc3RyKGNob3NlbiwgImJvb3RhcmdzIiwgY21kbGluZSk7CiB9CiAKIHN0cnVjdCBwbGF0Zm9ybV9vcHMgcGxhdGZvcm1fb3BzOwogc3RydWN0IGR0X29wcyBkdF9vcHM7CiBzdHJ1Y3QgY29uc29sZV9vcHMgY29uc29sZV9vcHM7CitzdHJ1Y3QgbG9hZGVyX2luZm8gbG9hZGVyX2luZm87CiAKLXZvaWQgc3RhcnQodW5zaWduZWQgbG9uZyBhMSwgdW5zaWduZWQgbG9uZyBhMiwgdm9pZCAqcHJvbXB0ciwgdm9pZCAqc3ApCit2b2lkIHN0YXJ0KHZvaWQpCiB7CisJc3RydWN0IGFkZHJfcmFuZ2Ugdm1saW51eCwgaW5pdHJkOwogCWtlcm5lbF9lbnRyeV90IGtlbnRyeTsKLQljaGFyIGNtZGxpbmVbQ09NTUFORF9MSU5FX1NJWkVdOwogCXVuc2lnbmVkIGxvbmcgZnRfYWRkciA9IDA7CisJdm9pZCAqY2hvc2VuOwogCi0JbWVtc2V0KF9fYnNzX3N0YXJ0LCAwLCBfZW5kIC0gX19ic3Nfc3RhcnQpOwotCW1lbXNldCgmcGxhdGZvcm1fb3BzLCAwLCBzaXplb2YocGxhdGZvcm1fb3BzKSk7Ci0JbWVtc2V0KCZkdF9vcHMsIDAsIHNpemVvZihkdF9vcHMpKTsKLQltZW1zZXQoJmNvbnNvbGVfb3BzLCAwLCBzaXplb2YoY29uc29sZV9vcHMpKTsKKwkvKiBEbyB0aGlzIGZpcnN0LCBiZWNhdXNlIG1hbGxvYygpIGNvdWxkIGNsb2JiZXIgdGhlIGxvYWRlcidzCisJICogY29tbWFuZCBsaW5lLiAgT25seSB1c2UgdGhlIGxvYWRlciBjb21tYW5kIGxpbmUgaWYgYQorCSAqIGJ1aWx0LWluIGNvbW1hbmQgbGluZSB3YXNuJ3Qgc2V0IGJ5IGFuIGV4dGVybmFsIHRvb2wgKi8KKwlpZiAoKGxvYWRlcl9pbmZvLmNtZGxpbmVfbGVuID4gMCkgJiYgKGNtZGxpbmVbMF0gPT0gJ1wwJykpCisJCW1lbW1vdmUoY21kbGluZSwgbG9hZGVyX2luZm8uY21kbGluZSwKKwkJCW1pbihsb2FkZXJfaW5mby5jbWRsaW5lX2xlbiwgQ09NTUFORF9MSU5FX1NJWkUtMSkpOwogCi0JaWYgKHBsYXRmb3JtX2luaXQocHJvbXB0ciwgX2R0Yl9zdGFydCwgX2R0Yl9lbmQpKQotCQlleGl0KCk7CiAJaWYgKGNvbnNvbGVfb3BzLm9wZW4gJiYgKGNvbnNvbGVfb3BzLm9wZW4oKSA8IDApKQogCQlleGl0KCk7CiAJaWYgKHBsYXRmb3JtX29wcy5maXh1cHMpCiAJCXBsYXRmb3JtX29wcy5maXh1cHMoKTsKIAogCXByaW50ZigiXG5ccnpJbWFnZSBzdGFydGluZzogbG9hZGVkIGF0IDB4JXAgKHNwOiAweCVwKVxuXHIiLAotCSAgICAgICBfc3RhcnQsIHNwKTsKKwkgICAgICAgX3N0YXJ0LCBnZXRfc3AoKSk7CiAKLQlwcmVwX2tlcm5lbChhMSwgYTIpOworCS8qIEVuc3VyZSB0aGF0IHRoZSBkZXZpY2UgdHJlZSBoYXMgYSAvY2hvc2VuIG5vZGUgKi8KKwljaG9zZW4gPSBmaW5kZGV2aWNlKCIvY2hvc2VuIik7CisJaWYgKCFjaG9zZW4pCisJCWNob3NlbiA9IGNyZWF0ZV9ub2RlKE5VTEwsICJjaG9zZW4iKTsKIAotCS8qIElmIGNtZGxpbmUgY2FtZSBmcm9tIHppbWFnZSB3cmFwcGVyIG9yIGlmIHdlIGNhbiBlZGl0IHRoZSBvbmUKLQkgKiBpbiB0aGUgZHQsIHByaW50IGl0IG91dCBhbmQgZWRpdCBpdCwgaWYgcG9zc2libGUuCi0JICovCi0JaWYgKChzdHJsZW4oYnVpbHRpbl9jbWRsaW5lKSA+IDApIHx8IGNvbnNvbGVfb3BzLmVkaXRfY21kbGluZSkgewotCQlnZXRfY21kbGluZShjbWRsaW5lLCBDT01NQU5EX0xJTkVfU0laRSk7Ci0JCXByaW50ZigiXG5cckxpbnV4L1Bvd2VyUEMgbG9hZDogJXMiLCBjbWRsaW5lKTsKLQkJaWYgKGNvbnNvbGVfb3BzLmVkaXRfY21kbGluZSkKLQkJCWNvbnNvbGVfb3BzLmVkaXRfY21kbGluZShjbWRsaW5lLCBDT01NQU5EX0xJTkVfU0laRSk7Ci0JCXByaW50ZigiXG5cciIpOwotCQlzZXRfY21kbGluZShjbWRsaW5lKTsKLQl9CisJdm1saW51eCA9IHByZXBfa2VybmVsKCk7CisJaW5pdHJkID0gcHJlcF9pbml0cmQodm1saW51eCwgY2hvc2VuLAorCQkJICAgICBsb2FkZXJfaW5mby5pbml0cmRfYWRkciwgbG9hZGVyX2luZm8uaW5pdHJkX3NpemUpOworCXByZXBfY21kbGluZShjaG9zZW4pOwogCiAJcHJpbnRmKCJGaW5hbGl6aW5nIGRldmljZSB0cmVlLi4uIik7CiAJaWYgKGR0X29wcy5maW5hbGl6ZSkKQEAgLTMzNSw3ICsyMDMsNyBAQAogCWlmIChmdF9hZGRyKQogCQlwcmludGYoIiBmbGF0IHRyZWUgYXQgMHglbHhcblxyIiwgZnRfYWRkcik7CiAJZWxzZQotCQlwcmludGYoIiB1c2luZyBPRiB0cmVlIChwcm9tcHRyPSVwKVxuXHIiLCBwcm9tcHRyKTsKKwkJcHJpbnRmKCIgdXNpbmcgT0YgdHJlZSAocHJvbXB0cj0lcClcblxyIiwgbG9hZGVyX2luZm8ucHJvbXB0cik7CiAKIAlpZiAoY29uc29sZV9vcHMuY2xvc2UpCiAJCWNvbnNvbGVfb3BzLmNsb3NlKCk7CkBAIC0zNDQsMTAgKzIxMiw5IEBACiAJaWYgKGZ0X2FkZHIpCiAJCWtlbnRyeShmdF9hZGRyLCAwLCBOVUxMKTsKIAllbHNlCi0JCS8qIFhYWCBpbml0cmQgYWRkci9zaXplIHNob3VsZCBiZSBwYXNzZWQgaW4gcHJvcGVydGllcyAqLwotCQlrZW50cnkoaW5pdHJkLmFkZHIsIGluaXRyZC5zaXplLCBwcm9tcHRyKTsKKwkJa2VudHJ5KCh1bnNpZ25lZCBsb25nKWluaXRyZC5hZGRyLCBpbml0cmQuc2l6ZSwKKwkJICAgICAgIGxvYWRlcl9pbmZvLnByb21wdHIpOwogCi0JLyogY29uc29sZSBjbG9zZWQgc28gcHJpbnRmIGJlbG93IG1heSBub3Qgd29yayAqLwotCXByaW50ZigiRXJyb3I6IExpbnV4IGtlcm5lbCByZXR1cm5lZCB0byB6SW1hZ2UgYm9vdCB3cmFwcGVyIVxuXHIiKTsKLQlleGl0KCk7CisJLyogY29uc29sZSBjbG9zZWQgc28gcHJpbnRmIGluIGZhdGFsIGJlbG93IG1heSBub3Qgd29yayAqLworCWZhdGFsKCJFcnJvcjogTGludXgga2VybmVsIHJldHVybmVkIHRvIHpJbWFnZSBib290IHdyYXBwZXIhXG5cciIpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvbnMxNjU1MC5jIGIvYXJjaC9wb3dlcnBjL2Jvb3QvbnMxNjU1MC5jCmluZGV4IDFmZmU3MmUuLmY4ZjFiMmYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L25zMTY1NTAuYworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9uczE2NTUwLmMKQEAgLTU1LDEwICs1NSwxNSBAQAogaW50IG5zMTY1NTBfY29uc29sZV9pbml0KHZvaWQgKmRldnAsIHN0cnVjdCBzZXJpYWxfY29uc29sZV9kYXRhICpzY2RwKQogewogCWludCBuOworCXVuc2lnbmVkIGxvbmcgcmVnX3BoeXM7CiAKIAluID0gZ2V0cHJvcChkZXZwLCAidmlydHVhbC1yZWciLCAmcmVnX2Jhc2UsIHNpemVvZihyZWdfYmFzZSkpOwotCWlmIChuICE9IHNpemVvZihyZWdfYmFzZSkpCi0JCXJldHVybiAtMTsKKwlpZiAobiAhPSBzaXplb2YocmVnX2Jhc2UpKSB7CisJCWlmICghZHRfeGxhdGVfcmVnKGRldnAsIDAsICZyZWdfcGh5cywgTlVMTCkpCisJCQlyZXR1cm4gLTE7CisKKwkJcmVnX2Jhc2UgPSAodm9pZCAqKXJlZ19waHlzOworCX0KIAogCW4gPSBnZXRwcm9wKGRldnAsICJyZWctc2hpZnQiLCAmcmVnX3NoaWZ0LCBzaXplb2YocmVnX3NoaWZ0KSk7CiAJaWYgKG4gIT0gc2l6ZW9mKHJlZ19zaGlmdCkpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9vZi5jIGIvYXJjaC9wb3dlcnBjL2Jvb3Qvb2YuYwppbmRleCAwMTgyZjM4Li5kMTZlZTNlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9vZi5jCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L29mLmMKQEAgLTE3Myw3ICsxNzMsNyBAQAogCXJldHVybiAodm9pZCAqKSB2aXJ0OwogfQogCi1zdGF0aWMgdm9pZCAqb2ZfdHJ5X2NsYWltKHUzMiBzaXplKQorc3RhdGljIHZvaWQgKm9mX3RyeV9jbGFpbSh1bnNpZ25lZCBsb25nIHNpemUpCiB7CiAJdW5zaWduZWQgbG9uZyBhZGRyID0gMDsKIApAQCAtMjA4LDYgKzIwOCwxNiBAQAogCX0KIH0KIAorc3RhdGljIHZvaWQgKm9mX3ZtbGludXhfYWxsb2ModW5zaWduZWQgbG9uZyBzaXplKQoreworCXZvaWQgKnAgPSBtYWxsb2Moc2l6ZSk7CisKKwlpZiAoIXApCisJCWZhdGFsKCJDYW4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGtlcm5lbCBpbWFnZSFcblxyIik7CisKKwlyZXR1cm4gcDsKK30KKwogc3RhdGljIHZvaWQgb2ZfZXhpdCh2b2lkKQogewogCWNhbGxfcHJvbSgiZXhpdCIsIDAsIDApOwpAQCAtMjU2LDExICsyNjYsMTIgQEAKIAljYWxsX3Byb20oIndyaXRlIiwgMywgMSwgb2Zfc3Rkb3V0X2hhbmRsZSwgYnVmLCBsZW4pOwogfQogCi1pbnQgcGxhdGZvcm1faW5pdCh2b2lkICpwcm9tcHRyLCBjaGFyICpkdF9ibG9iX3N0YXJ0LCBjaGFyICpkdF9ibG9iX2VuZCkKK3ZvaWQgcGxhdGZvcm1faW5pdCh1bnNpZ25lZCBsb25nIGExLCB1bnNpZ25lZCBsb25nIGEyLCB2b2lkICpwcm9tcHRyKQogewogCXBsYXRmb3JtX29wcy5pbWFnZV9oZHIgPSBvZl9pbWFnZV9oZHI7CiAJcGxhdGZvcm1fb3BzLm1hbGxvYyA9IG9mX3RyeV9jbGFpbTsKIAlwbGF0Zm9ybV9vcHMuZXhpdCA9IG9mX2V4aXQ7CisJcGxhdGZvcm1fb3BzLnZtbGludXhfYWxsb2MgPSBvZl92bWxpbnV4X2FsbG9jOwogCiAJZHRfb3BzLmZpbmRkZXZpY2UgPSBvZl9maW5kZGV2aWNlOwogCWR0X29wcy5nZXRwcm9wID0gb2ZfZ2V0cHJvcDsKQEAgLTI3MCw1ICsyODEsOSBAQAogCWNvbnNvbGVfb3BzLndyaXRlID0gb2ZfY29uc29sZV93cml0ZTsKIAogCXByb20gPSAoaW50ICgqKSh2b2lkICopKXByb21wdHI7Ci0JcmV0dXJuIDA7CisJbG9hZGVyX2luZm8ucHJvbXB0ciA9IHByb21wdHI7CisJaWYgKGExICYmIGEyICYmIGEyICE9IDB4ZGVhZGJlZWYpIHsKKwkJbG9hZGVyX2luZm8uaW5pdHJkX2FkZHIgPSBhMTsKKwkJbG9hZGVyX2luZm8uaW5pdHJkX3NpemUgPSBhMjsKKwl9CiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9vcHMuaCBiL2FyY2gvcG93ZXJwYy9ib290L29wcy5oCmluZGV4IDhhYmI2NTEuLjczYmQ0N2EgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L29wcy5oCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L29wcy5oCkBAIC0xMSw3ICsxMSw5IEBACiAjaWZuZGVmIF9QUENfQk9PVF9PUFNfSF8KICNkZWZpbmUgX1BQQ19CT09UX09QU19IXwogCisjaW5jbHVkZSA8c3RkZGVmLmg+CiAjaW5jbHVkZSAidHlwZXMuaCIKKyNpbmNsdWRlICJzdHJpbmcuaCIKIAogI2RlZmluZQlDT01NQU5EX0xJTkVfU0laRQk1MTIKICNkZWZpbmUJTUFYX1BBVEhfTEVOCQkyNTYKQEAgLTIxLDEwICsyMywxMSBAQAogc3RydWN0IHBsYXRmb3JtX29wcyB7CiAJdm9pZAkoKmZpeHVwcykodm9pZCk7CiAJdm9pZAkoKmltYWdlX2hkcikoY29uc3Qgdm9pZCAqKTsKLQl2b2lkICoJKCptYWxsb2MpKHUzMiBzaXplKTsKKwl2b2lkICoJKCptYWxsb2MpKHVuc2lnbmVkIGxvbmcgc2l6ZSk7CiAJdm9pZAkoKmZyZWUpKHZvaWQgKnB0cik7CiAJdm9pZCAqCSgqcmVhbGxvYykodm9pZCAqcHRyLCB1bnNpZ25lZCBsb25nIHNpemUpOwogCXZvaWQJKCpleGl0KSh2b2lkKTsKKwl2b2lkICoJKCp2bWxpbnV4X2FsbG9jKSh1bnNpZ25lZCBsb25nIHNpemUpOwogfTsKIGV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fb3BzIHBsYXRmb3JtX29wczsKIApAQCAtMzUsNiArMzgsMTIgQEAKIAkJCWNvbnN0IGludCBidWZsZW4pOwogCWludAkoKnNldHByb3ApKGNvbnN0IHZvaWQgKnBoYW5kbGUsIGNvbnN0IGNoYXIgKm5hbWUsCiAJCQljb25zdCB2b2lkICpidWYsIGNvbnN0IGludCBidWZsZW4pOworCXZvaWQgKigqZ2V0X3BhcmVudCkoY29uc3Qgdm9pZCAqcGhhbmRsZSk7CisJLyogVGhlIG5vZGUgbXVzdCBub3QgYWxyZWFkeSBleGlzdC4gKi8KKwl2b2lkICooKmNyZWF0ZV9ub2RlKShjb25zdCB2b2lkICpwYXJlbnQsIGNvbnN0IGNoYXIgKm5hbWUpOworCXZvaWQgKigqZmluZF9ub2RlX2J5X3Byb3BfdmFsdWUpKGNvbnN0IHZvaWQgKnByZXYsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcHJvcG5hbWUsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcHJvcHZhbCwgaW50IHByb3BsZW4pOwogCXVuc2lnbmVkIGxvbmcgKCpmaW5hbGl6ZSkodm9pZCk7CiB9OwogZXh0ZXJuIHN0cnVjdCBkdF9vcHMgZHRfb3BzOwpAQCAtNTgsMTMgKzY3LDIzIEBACiAJdm9pZAkJKCpjbG9zZSkodm9pZCk7CiB9OwogCi1pbnQgcGxhdGZvcm1faW5pdCh2b2lkICpwcm9tcHRyLCBjaGFyICpkdF9ibG9iX3N0YXJ0LCBjaGFyICpkdF9ibG9iX2VuZCk7CitzdHJ1Y3QgbG9hZGVyX2luZm8geworCXZvaWQgKnByb21wdHI7CisJdW5zaWduZWQgbG9uZyBpbml0cmRfYWRkciwgaW5pdHJkX3NpemU7CisJY2hhciAqY21kbGluZTsKKwlpbnQgY21kbGluZV9sZW47Cit9OworZXh0ZXJuIHN0cnVjdCBsb2FkZXJfaW5mbyBsb2FkZXJfaW5mbzsKKwordm9pZCBzdGFydCh2b2lkKTsKIGludCBmdF9pbml0KHZvaWQgKmR0X2Jsb2IsIHVuc2lnbmVkIGludCBtYXhfc2l6ZSwgdW5zaWduZWQgaW50IG1heF9maW5kX2RldmljZSk7CiBpbnQgc2VyaWFsX2NvbnNvbGVfaW5pdCh2b2lkKTsKIGludCBuczE2NTUwX2NvbnNvbGVfaW5pdCh2b2lkICpkZXZwLCBzdHJ1Y3Qgc2VyaWFsX2NvbnNvbGVfZGF0YSAqc2NkcCk7Ci12b2lkICpzaW1wbGVfYWxsb2NfaW5pdChjaGFyICpiYXNlLCB1MzIgaGVhcF9zaXplLCB1MzIgZ3JhbnVsYXJpdHksCi0JCXUzMiBtYXhfYWxsb2NzKTsKLQordm9pZCAqc2ltcGxlX2FsbG9jX2luaXQoY2hhciAqYmFzZSwgdW5zaWduZWQgbG9uZyBoZWFwX3NpemUsCisJCQl1bnNpZ25lZCBsb25nIGdyYW51bGFyaXR5LCB1bnNpZ25lZCBsb25nIG1heF9hbGxvY3MpOworZXh0ZXJuIHZvaWQgZmx1c2hfY2FjaGUodm9pZCAqLCB1bnNpZ25lZCBsb25nKTsKK2ludCBkdF94bGF0ZV9yZWcodm9pZCAqbm9kZSwgaW50IHJlcywgdW5zaWduZWQgbG9uZyAqYWRkciwgdW5zaWduZWQgbG9uZyAqc2l6ZSk7CitpbnQgZHRfeGxhdGVfYWRkcih2b2lkICpub2RlLCB1MzIgKmJ1ZiwgaW50IGJ1ZmxlbiwgdW5zaWduZWQgbG9uZyAqeGxhdGVkX2FkZHIpOwogCiBzdGF0aWMgaW5saW5lIHZvaWQgKmZpbmRkZXZpY2UoY29uc3QgY2hhciAqbmFtZSkKIHsKQEAgLTc2LDEyICs5NSw3NiBAQAogCXJldHVybiAoZHRfb3BzLmdldHByb3ApID8gZHRfb3BzLmdldHByb3AoZGV2cCwgbmFtZSwgYnVmLCBidWZsZW4pIDogLTE7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHNldHByb3Aodm9pZCAqZGV2cCwgY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqYnVmLCBpbnQgYnVmbGVuKQorc3RhdGljIGlubGluZSBpbnQgc2V0cHJvcCh2b2lkICpkZXZwLCBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpidWYsIGludCBidWZsZW4pCiB7CiAJcmV0dXJuIChkdF9vcHMuc2V0cHJvcCkgPyBkdF9vcHMuc2V0cHJvcChkZXZwLCBuYW1lLCBidWYsIGJ1ZmxlbikgOiAtMTsKIH0KKyNkZWZpbmUgc2V0cHJvcF92YWwoZGV2cCwgbmFtZSwgdmFsKSBcCisJZG8geyBcCisJCXR5cGVvZih2YWwpIHggPSAodmFsKTsgXAorCQlzZXRwcm9wKChkZXZwKSwgKG5hbWUpLCAmeCwgc2l6ZW9mKHgpKTsgXAorCX0gd2hpbGUgKDApCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCAqbWFsbG9jKHUzMiBzaXplKQorc3RhdGljIGlubGluZSBpbnQgc2V0cHJvcF9zdHIodm9pZCAqZGV2cCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqYnVmKQoreworCWlmIChkdF9vcHMuc2V0cHJvcCkKKwkJcmV0dXJuIGR0X29wcy5zZXRwcm9wKGRldnAsIG5hbWUsIGJ1Ziwgc3RybGVuKGJ1ZikgKyAxKTsKKworCXJldHVybiAtMTsKK30KKworc3RhdGljIGlubGluZSB2b2lkICpnZXRfcGFyZW50KGNvbnN0IGNoYXIgKmRldnApCit7CisJcmV0dXJuIGR0X29wcy5nZXRfcGFyZW50ID8gZHRfb3BzLmdldF9wYXJlbnQoZGV2cCkgOiBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgKmNyZWF0ZV9ub2RlKGNvbnN0IHZvaWQgKnBhcmVudCwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlyZXR1cm4gZHRfb3BzLmNyZWF0ZV9ub2RlID8gZHRfb3BzLmNyZWF0ZV9ub2RlKHBhcmVudCwgbmFtZSkgOiBOVUxMOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqZmluZF9ub2RlX2J5X3Byb3BfdmFsdWUoY29uc3Qgdm9pZCAqcHJldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcHJvcG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnByb3B2YWwsIGludCBwcm9wbGVuKQoreworCWlmIChkdF9vcHMuZmluZF9ub2RlX2J5X3Byb3BfdmFsdWUpCisJCXJldHVybiBkdF9vcHMuZmluZF9ub2RlX2J5X3Byb3BfdmFsdWUocHJldiwgcHJvcG5hbWUsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHZhbCwgcHJvcGxlbik7CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGlubGluZSB2b2lkICpmaW5kX25vZGVfYnlfcHJvcF92YWx1ZV9zdHIoY29uc3Qgdm9pZCAqcHJldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnByb3BuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcHJvcHZhbCkKK3sKKwlyZXR1cm4gZmluZF9ub2RlX2J5X3Byb3BfdmFsdWUocHJldiwgcHJvcG5hbWUsIHByb3B2YWwsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbihwcm9wdmFsKSArIDEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgKmZpbmRfbm9kZV9ieV9kZXZ0eXBlKGNvbnN0IHZvaWQgKnByZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJcmV0dXJuIGZpbmRfbm9kZV9ieV9wcm9wX3ZhbHVlX3N0cihwcmV2LCAiZGV2aWNlX3R5cGUiLCB0eXBlKTsKK30KKwordm9pZCBkdF9maXh1cF9tZW1vcnkodTY0IHN0YXJ0LCB1NjQgc2l6ZSk7Cit2b2lkIGR0X2ZpeHVwX2NwdV9jbG9ja3ModTMyIGNwdWZyZXEsIHUzMiB0YmZyZXEsIHUzMiBidXNmcmVxKTsKK3ZvaWQgZHRfZml4dXBfY2xvY2soY29uc3QgY2hhciAqcGF0aCwgdTMyIGZyZXEpOwordm9pZCBfX2R0X2ZpeHVwX21hY19hZGRyZXNzZXModTMyIHN0YXJ0aW5kZXgsIC4uLik7CisjZGVmaW5lIGR0X2ZpeHVwX21hY19hZGRyZXNzZXMoLi4uKSBcCisJX19kdF9maXh1cF9tYWNfYWRkcmVzc2VzKDAsIF9fVkFfQVJHU19fLCBOVUxMKQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqZmluZF9ub2RlX2J5X2xpbnV4cGhhbmRsZShjb25zdCB1MzIgbGludXhwaGFuZGxlKQoreworCXJldHVybiBmaW5kX25vZGVfYnlfcHJvcF92YWx1ZShOVUxMLCAibGludXgscGhhbmRsZSIsCisJCQkoY2hhciAqKSZsaW51eHBoYW5kbGUsIHNpemVvZih1MzIpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkICptYWxsb2ModW5zaWduZWQgbG9uZyBzaXplKQogewogCXJldHVybiAocGxhdGZvcm1fb3BzLm1hbGxvYykgPyBwbGF0Zm9ybV9vcHMubWFsbG9jKHNpemUpIDogTlVMTDsKIH0KQEAgLTk4LDUgKzE4MSwxMSBAQAogCQlwbGF0Zm9ybV9vcHMuZXhpdCgpOwogCWZvcig7Oyk7CiB9CisjZGVmaW5lIGZhdGFsKGFyZ3MuLi4pIHsgcHJpbnRmKGFyZ3MpOyBleGl0KCk7IH0KKworCisjZGVmaW5lIEJTU19TVEFDSyhzaXplKSBcCisJc3RhdGljIGNoYXIgX2Jzc19zdGFja1tzaXplXTsgXAorCXZvaWQgKl9wbGF0Zm9ybV9zdGFja190b3AgPSBfYnNzX3N0YWNrICsgc2l6ZW9mKF9ic3Nfc3RhY2spOwogCiAjZW5kaWYgLyogX1BQQ19CT09UX09QU19IXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvcHBjYm9vdC5oIGIvYXJjaC9wb3dlcnBjL2Jvb3QvcHBjYm9vdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyOTBmZjIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9wcGNib290LmgKQEAgLTAsMCArMSwxMDggQEAKKy8qCisgKiBUaGlzIGludGVyZmFjZSBpcyB1c2VkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggb2xkIFUtYm9vdHMgKk9OTFkqLgorICogUGxlYXNlIGRvIG5vdCBpbWl0YXRlIG9yIGV4dGVuZCB0aGlzLgorICovCisKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDEKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2lmbmRlZiBfX1BQQ0JPT1RfSF9fCisjZGVmaW5lIF9fUFBDQk9PVF9IX18KKworLyoKKyAqIEJvYXJkIGluZm9ybWF0aW9uIHBhc3NlZCB0byBrZXJuZWwgZnJvbSBQUENCb290CisgKgorICogaW5jbHVkZS9hc20tcHBjL3BwY2Jvb3QuaAorICovCisKKyNpbmNsdWRlICJ0eXBlcy5oIgorCit0eXBlZGVmIHN0cnVjdCBiZF9pbmZvIHsKKwl1bnNpZ25lZCBsb25nCWJpX21lbXN0YXJ0OwkvKiBzdGFydCBvZiBEUkFNIG1lbW9yeSAqLworCXVuc2lnbmVkIGxvbmcJYmlfbWVtc2l6ZTsJLyogc2l6ZQkgb2YgRFJBTSBtZW1vcnkgaW4gYnl0ZXMgKi8KKwl1bnNpZ25lZCBsb25nCWJpX2ZsYXNoc3RhcnQ7CS8qIHN0YXJ0IG9mIEZMQVNIIG1lbW9yeSAqLworCXVuc2lnbmVkIGxvbmcJYmlfZmxhc2hzaXplOwkvKiBzaXplCSBvZiBGTEFTSCBtZW1vcnkgKi8KKwl1bnNpZ25lZCBsb25nCWJpX2ZsYXNob2Zmc2V0OyAvKiByZXNlcnZlZCBhcmVhIGZvciBzdGFydHVwIG1vbml0b3IgKi8KKwl1bnNpZ25lZCBsb25nCWJpX3NyYW1zdGFydDsJLyogc3RhcnQgb2YgU1JBTSBtZW1vcnkgKi8KKwl1bnNpZ25lZCBsb25nCWJpX3NyYW1zaXplOwkvKiBzaXplCSBvZiBTUkFNIG1lbW9yeSAqLworI2lmIGRlZmluZWQoVEFSR0VUXzh4eCkgfHwgZGVmaW5lZChUQVJHRVRfQ1BNMikgfHwgZGVmaW5lZChUQVJHRVRfODV4eCkgfHxcCisJZGVmaW5lZChUQVJHRVRfODN4eCkKKwl1bnNpZ25lZCBsb25nCWJpX2ltbXJfYmFzZTsJLyogYmFzZSBvZiBJTU1SIHJlZ2lzdGVyICovCisjZW5kaWYKKyNpZiBkZWZpbmVkKFRBUkdFVF9QUENfTVBDNTJ4eCkKKwl1bnNpZ25lZCBsb25nICAgYmlfbWJhcl9iYXNlOyAgIC8qIGJhc2Ugb2YgaW50ZXJuYWwgcmVnaXN0ZXJzICovCisjZW5kaWYKKwl1bnNpZ25lZCBsb25nCWJpX2Jvb3RmbGFnczsJLyogYm9vdCAvIHJlYm9vdCBmbGFnIChmb3IgTHlueE9TKSAqLworCXVuc2lnbmVkIGxvbmcJYmlfaXBfYWRkcjsJLyogSVAgQWRkcmVzcyAqLworCXVuc2lnbmVkIGNoYXIJYmlfZW5ldGFkZHJbNl07CS8qIEV0aGVybmV0IGFkZHJlc3MgKi8KKwl1bnNpZ25lZCBzaG9ydAliaV9ldGhzcGVlZDsJLyogRXRoZXJuZXQgc3BlZWQgaW4gTWJwcyAqLworCXVuc2lnbmVkIGxvbmcJYmlfaW50ZnJlcTsJLyogSW50ZXJuYWwgRnJlcSwgaW4gTUh6ICovCisJdW5zaWduZWQgbG9uZwliaV9idXNmcmVxOwkvKiBCdXMgRnJlcSwgaW4gTUh6ICovCisjaWYgZGVmaW5lZChUQVJHRVRfQ1BNMikKKwl1bnNpZ25lZCBsb25nCWJpX2NwbWZyZXE7CS8qIENQTV9DTEsgRnJlcSwgaW4gTUh6ICovCisJdW5zaWduZWQgbG9uZwliaV9icmdmcmVxOwkvKiBCUkdfQ0xLIEZyZXEsIGluIE1IeiAqLworCXVuc2lnbmVkIGxvbmcJYmlfc2NjZnJlcTsJLyogU0NDX0NMSyBGcmVxLCBpbiBNSHogKi8KKwl1bnNpZ25lZCBsb25nCWJpX3ZjbzsJCS8qIFZDTyBPdXQgZnJvbSBQTEwsIGluIE1IeiAqLworI2VuZGlmCisjaWYgZGVmaW5lZChUQVJHRVRfUFBDX01QQzUyeHgpCisJdW5zaWduZWQgbG9uZyAgIGJpX2lwYmZyZXE7ICAgICAvKiBJUEIgQnVzIEZyZXEsIGluIE1IeiAqLworCXVuc2lnbmVkIGxvbmcgICBiaV9wY2lmcmVxOyAgICAgLyogUENJIEJ1cyBGcmVxLCBpbiBNSHogKi8KKyNlbmRpZgorCXVuc2lnbmVkIGxvbmcJYmlfYmF1ZHJhdGU7CS8qIENvbnNvbGUgQmF1ZHJhdGUgKi8KKyNpZiBkZWZpbmVkKFRBUkdFVF80eHgpCisJdW5zaWduZWQgY2hhcgliaV9zX3ZlcnNpb25bNF07CS8qIFZlcnNpb24gb2YgdGhpcyBzdHJ1Y3R1cmUgKi8KKwl1bnNpZ25lZCBjaGFyCWJpX3JfdmVyc2lvblszMl07CS8qIFZlcnNpb24gb2YgdGhlIFJPTSAoSUJNKSAqLworCXVuc2lnbmVkIGludAliaV9wcm9jZnJlcTsJLyogQ1BVIChJbnRlcm5hbCkgRnJlcSwgaW4gSHogKi8KKwl1bnNpZ25lZCBpbnQJYmlfcGxiX2J1c2ZyZXE7CS8qIFBMQiBCdXMgc3BlZWQsIGluIEh6ICovCisJdW5zaWduZWQgaW50CWJpX3BjaV9idXNmcmVxOwkvKiBQQ0kgQnVzIHNwZWVkLCBpbiBIeiAqLworCXVuc2lnbmVkIGNoYXIJYmlfcGNpX2VuZXRhZGRyWzZdOwkvKiBQQ0kgRXRoZXJuZXQgTUFDIGFkZHJlc3MgKi8KKyNlbmRpZgorI2lmIGRlZmluZWQoVEFSR0VUX0hZTU9EKQorCWh5bW9kX2NvbmZfdAliaV9oeW1vZF9jb25mOwkvKiBoeW1vZCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uICovCisjZW5kaWYKKyNpZiBkZWZpbmVkKFRBUkdFVF9FVkI2NDI2MCkgfHwgZGVmaW5lZChUQVJHRVRfNDA1RVApIHx8IGRlZmluZWQoVEFSR0VUXzQ0eCkgfHwgXAorCWRlZmluZWQoVEFSR0VUXzg1eHgpIHx8CWRlZmluZWQoVEFSR0VUXzgzeHgpCisJLyogc2Vjb25kIG9uYm9hcmQgZXRoZXJuZXQgcG9ydCAqLworCXVuc2lnbmVkIGNoYXIJYmlfZW5ldDFhZGRyWzZdOworI2RlZmluZSBIQVZFX0VORVQxQUREUgorI2VuZGlmCisjaWYgZGVmaW5lZChUQVJHRVRfRVZCNjQyNjApIHx8IGRlZmluZWQoVEFSR0VUXzQ0MEdYKSB8fCBkZWZpbmVkKFRBUkdFVF84NXh4KQorCS8qIHRoaXJkIG9uYm9hcmQgZXRoZXJuZXQgcG9ydHMgKi8KKwl1bnNpZ25lZCBjaGFyCWJpX2VuZXQyYWRkcls2XTsKKyNkZWZpbmUgSEFWRV9FTkVUMkFERFIKKyNlbmRpZgorI2lmIGRlZmluZWQoVEFSR0VUXzQ0MEdYKQorCS8qIGZvdXJ0aCBvbmJvYXJkIGV0aGVybmV0IHBvcnRzICovCisJdW5zaWduZWQgY2hhcgliaV9lbmV0M2FkZHJbNl07CisjZGVmaW5lIEhBVkVfRU5FVDNBRERSCisjZW5kaWYKKyNpZiBkZWZpbmVkKFRBUkdFVF80eHgpCisJdW5zaWduZWQgaW50CWJpX29wYmZyZXE7CQkvKiBPQiBjbG9jayBpbiBIeiAqLworCWludAkJYmlfaWljX2Zhc3RbMl07CQkvKiBVc2UgZmFzdCBpMmMgbW9kZSAqLworI2VuZGlmCisjaWYgZGVmaW5lZChUQVJHRVRfNDQwR1gpCisJaW50CQliaV9waHludW1bNF07CQkvKiBwaHkgbWFwcGluZyAqLworCWludAkJYmlfcGh5bW9kZVs0XTsJCS8qIHBoeSBtb2RlICovCisjZW5kaWYKK30gYmRfdDsKKworI2RlZmluZSBiaV90YmZyZXEJYmlfaW50ZnJlcQorCisjZW5kaWYJLyogX19QUENCT09UX0hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvcmVnLmggYi9hcmNoL3Bvd2VycGMvYm9vdC9yZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2NkOWVlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvcmVnLmgKQEAgLTAsMCArMSwyMiBAQAorI2lmbmRlZiBfUFBDX0JPT1RfUkVHX0gKKyNkZWZpbmUgX1BQQ19CT09UX1JFR19ICisvKgorICogQ29weXJpZ2h0IDIwMDcgRGF2dWQgR2lic29uLCBJQk0gQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCitzdGF0aWMgaW5saW5lIHUzMiBtZnB2cih2b2lkKQoreworCXUzMiBwdnI7CisJYXNtIHZvbGF0aWxlICgibWZwdnIJJTAiIDogIj1yIihwdnIpKTsKKwlyZXR1cm4gcHZyOworfQorCityZWdpc3RlciB2b2lkICpfX3N0YWNrX3BvaW50ZXIgYXNtKCJyMSIpOworI2RlZmluZSBnZXRfc3AoKQkoX19zdGFja19wb2ludGVyKQorCisjZW5kaWYJLyogX1BQQ19CT09UX1JFR19IICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9zaW1wbGVfYWxsb2MuYyBiL2FyY2gvcG93ZXJwYy9ib290L3NpbXBsZV9hbGxvYy5jCmluZGV4IGNmZTNhNzUuLjY1ZWMxMzUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L3NpbXBsZV9hbGxvYy5jCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L3NpbXBsZV9hbGxvYy5jCkBAIC0xOSwyNCArMTksMjQgQEAKICNkZWZpbmUJRU5UUllfSU5fVVNFCTB4MDIKIAogc3RhdGljIHN0cnVjdCBhbGxvY19pbmZvIHsKLQl1MzIJZmxhZ3M7Ci0JdTMyCWJhc2U7Ci0JdTMyCXNpemU7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKwl1bnNpZ25lZCBsb25nCWJhc2U7CisJdW5zaWduZWQgbG9uZwlzaXplOwogfSAqYWxsb2NfdGJsOwogCi1zdGF0aWMgdTMyIHRibF9lbnRyaWVzOwotc3RhdGljIHUzMiBhbGxvY19taW47Ci1zdGF0aWMgdTMyIG5leHRfYmFzZTsKLXN0YXRpYyB1MzIgc3BhY2VfbGVmdDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHRibF9lbnRyaWVzOworc3RhdGljIHVuc2lnbmVkIGxvbmcgYWxsb2NfbWluOworc3RhdGljIHVuc2lnbmVkIGxvbmcgbmV4dF9iYXNlOworc3RhdGljIHVuc2lnbmVkIGxvbmcgc3BhY2VfbGVmdDsKIAogLyoKICAqIEZpcnN0IHRpbWUgYW4gZW50cnkgaXMgdXNlZCwgaXRzIGJhc2UgYW5kIHNpemUgYXJlIHNldC4KICAqIEFuIGVudHJ5IGNhbiBiZSBmcmVlZCBhbmQgcmUtbWFsbG9jJ2QgYnV0IGl0cyBiYXNlICYgc2l6ZSBkb24ndCBjaGFuZ2UuCiAgKiBTaG91bGQgYmUgc21hcnQgZW5vdWdoIGZvciBuZWVkcyBvZiBib290d3JhcHBlci4KICAqLwotc3RhdGljIHZvaWQgKnNpbXBsZV9tYWxsb2ModTMyIHNpemUpCitzdGF0aWMgdm9pZCAqc2ltcGxlX21hbGxvYyh1bnNpZ25lZCBsb25nIHNpemUpCiB7Ci0JdTMyIGk7CisJdW5zaWduZWQgbG9uZyBpOwogCXN0cnVjdCBhbGxvY19pbmZvICpwID0gYWxsb2NfdGJsOwogCiAJaWYgKHNpemUgPT0gMCkKQEAgLTY3LDEzICs2NywxNCBAQAogCiBzdGF0aWMgc3RydWN0IGFsbG9jX2luZm8gKnNpbXBsZV9maW5kX2VudHJ5KHZvaWQgKnB0cikKIHsKLQl1MzIgaTsKKwl1bnNpZ25lZCBsb25nIGk7CiAJc3RydWN0IGFsbG9jX2luZm8gKnAgPSBhbGxvY190Ymw7CiAKIAlmb3IgKGk9MDsgaTx0YmxfZW50cmllczsgaSsrLHArKykgewogCQlpZiAoIShwLT5mbGFncyAmIEVOVFJZX0JFRU5fVVNFRCkpCiAJCQlicmVhazsKLQkJaWYgKChwLT5mbGFncyAmIEVOVFJZX0lOX1VTRSkgJiYgKHAtPmJhc2UgPT0gKHUzMilwdHIpKQorCQlpZiAoKHAtPmZsYWdzICYgRU5UUllfSU5fVVNFKSAmJgorCQkgICAgKHAtPmJhc2UgPT0gKHVuc2lnbmVkIGxvbmcpcHRyKSkKIAkJCXJldHVybiBwOwogCX0KIAlyZXR1cm4gTlVMTDsKQEAgLTEyMiwxMCArMTIzLDEwIEBACiAgKiBSZXR1cm5zIGFkZHIgb2YgZmlyc3QgYnl0ZSBhZnRlciBoZWFwIHNvIGNhbGxlciBjYW4gc2VlIGlmIGl0IHRvb2sKICAqIHRvbyBtdWNoIHNwYWNlLiAgSWYgc28sIGNoYW5nZSBhcmdzICYgdHJ5IGFnYWluLgogICovCi12b2lkICpzaW1wbGVfYWxsb2NfaW5pdChjaGFyICpiYXNlLCB1MzIgaGVhcF9zaXplLCB1MzIgZ3JhbnVsYXJpdHksCi0JCXUzMiBtYXhfYWxsb2NzKQordm9pZCAqc2ltcGxlX2FsbG9jX2luaXQoY2hhciAqYmFzZSwgdW5zaWduZWQgbG9uZyBoZWFwX3NpemUsCisJCQl1bnNpZ25lZCBsb25nIGdyYW51bGFyaXR5LCB1bnNpZ25lZCBsb25nIG1heF9hbGxvY3MpCiB7Ci0JdTMyIGhlYXBfYmFzZSwgdGJsX3NpemU7CisJdW5zaWduZWQgbG9uZyBoZWFwX2Jhc2UsIHRibF9zaXplOwogCiAJaGVhcF9zaXplID0gX0FMSUdOX1VQKGhlYXBfc2l6ZSwgZ3JhbnVsYXJpdHkpOwogCWFsbG9jX21pbiA9IGdyYW51bGFyaXR5OwpAQCAtMTM2LDcgKzEzNyw3IEBACiAJYWxsb2NfdGJsID0gKHN0cnVjdCBhbGxvY19pbmZvICopX0FMSUdOX1VQKCh1bnNpZ25lZCBsb25nKWJhc2UsIDgpOwogCW1lbXNldChhbGxvY190YmwsIDAsIHRibF9zaXplKTsKIAotCWhlYXBfYmFzZSA9IF9BTElHTl9VUCgodTMyKWFsbG9jX3RibCArIHRibF9zaXplLCBhbGxvY19taW4pOworCWhlYXBfYmFzZSA9IF9BTElHTl9VUCgodW5zaWduZWQgbG9uZylhbGxvY190YmwgKyB0Ymxfc2l6ZSwgYWxsb2NfbWluKTsKIAogCW5leHRfYmFzZSA9IGhlYXBfYmFzZTsKIAlzcGFjZV9sZWZ0ID0gaGVhcF9zaXplOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3Qvc3RkaW8uaCBiL2FyY2gvcG93ZXJwYy9ib290L3N0ZGlvLmgKaW5kZXggNzNiOGE5MS4uYWRmZmM1OCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3Qvc3RkaW8uaAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9zdGRpby5oCkBAIC03LDExICs3LDEyIEBACiAjZGVmaW5lCUVJTlZBTAkJMjIJLyogSW52YWxpZCBhcmd1bWVudCAqLwogI2RlZmluZSBFTk9TUEMJCTI4CS8qIE5vIHNwYWNlIGxlZnQgb24gZGV2aWNlICovCiAKLWV4dGVybiBpbnQgcHJpbnRmKGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKK2V4dGVybiBpbnQgcHJpbnRmKGNvbnN0IGNoYXIgKmZtdCwgLi4uKSBfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLCAxLCAyKSkpOwogCiAjZGVmaW5lIGZwcmludGYoZm10LCBhcmdzLi4uKQlwcmludGYoYXJncykKIAotZXh0ZXJuIGludCBzcHJpbnRmKGNoYXIgKmJ1ZiwgY29uc3QgY2hhciAqZm10LCAuLi4pOworZXh0ZXJuIGludCBzcHJpbnRmKGNoYXIgKmJ1ZiwgY29uc3QgY2hhciAqZm10LCAuLi4pCisJX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwgMiwgMykpKTsKIAogZXh0ZXJuIGludCB2c3ByaW50ZihjaGFyICpidWYsIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcmdzKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3Qvd3JhcHBlciBiL2FyY2gvcG93ZXJwYy9ib290L3dyYXBwZXIKaW5kZXggMDI0ZTRkNC4uNWNlZGQ5MCAxMDA3NTUKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3Qvd3JhcHBlcgorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC93cmFwcGVyCkBAIC0yOSw2ICsyOSw3IEBACiBkdGI9CiBkdHM9CiBjYWNoZWl0PQorZ3ppcD0uZ3oKIAogIyBjcm9zcy1jb21waWxhdGlvbiBwcmVmaXgKIENST1NTPQpAQCAtNDIsNyArNDMsNyBAQAogdXNhZ2UoKSB7CiAgICAgZWNobyAnVXNhZ2U6IHdyYXBwZXIgWy1vIG91dHB1dF0gWy1wIHBsYXRmb3JtXSBbLWkgaW5pdHJkXScgPiYyCiAgICAgZWNobyAnICAgICAgIFstZCBkZXZ0cmVlXSBbLXMgdHJlZS5kdHNdIFstY10gWy1DIGNyb3NzLXByZWZpeF0nID4mMgotICAgIGVjaG8gJyAgICAgICBbLUQgZGF0YWRpcl0gWy1XIHdvcmtpbmdkaXJdIFt2bWxpbnV4XScgPiYyCisgICAgZWNobyAnICAgICAgIFstRCBkYXRhZGlyXSBbLVcgd29ya2luZ2Rpcl0gWy0tbm8tZ3ppcF0gW3ZtbGludXhdJyA+JjIKICAgICBleGl0IDEKIH0KIApAQCAtOTEsNiArOTIsOSBAQAogCVsgIiQjIiAtZ3QgMCBdIHx8IHVzYWdlCiAJdG1wZGlyPSIkMSIKIAk7OworICAgIC0tbm8tZ3ppcCkKKyAgICAgICAgZ3ppcD0KKyAgICAgICAgOzsKICAgICAtPykKIAl1c2FnZQogCTs7CkBAIC0xMzcsMzEgKzE0MSw0NCBAQAogICAgIGtzZWN0aW9uPWltYWdlCiAgICAgaXNlY3Rpb249aW5pdHJkCiAgICAgOzsKK2N1Ym9vdCopCisgICAgZ3ppcD0KKyAgICA7OwogZXNhYwogCiB2bXo9IiR0bXBkaXIvYGJhc2VuYW1lIFwiJGtlcm5lbFwiYC4kZXh0IgotaWYgWyAteiAiJGNhY2hlaXQiIC1vICEgLWYgIiR2bXouZ3oiIC1vICIkdm16Lmd6IiAtb3QgIiRrZXJuZWwiIF07IHRoZW4KK2lmIFsgLXogIiRjYWNoZWl0IiAtbyAhIC1mICIkdm16JGd6aXAiIC1vICIkdm16JGd6aXAiIC1vdCAiJGtlcm5lbCIgXTsgdGhlbgogICAgICR7Q1JPU1N9b2JqY29weSAkb2JqZmxhZ3MgIiRrZXJuZWwiICIkdm16LiQkIgotICAgIGd6aXAgLWYgLTkgIiR2bXouJCQiCisKKyAgICBpZiBbIC1uICIkZ3ppcCIgXTsgdGhlbgorICAgICAgICBnemlwIC1mIC05ICIkdm16LiQkIgorICAgIGZpCisKICAgICBpZiBbIC1uICIkY2FjaGVpdCIgXTsgdGhlbgotCW12IC1mICIkdm16LiQkLmd6IiAiJHZtei5neiIKKwltdiAtZiAiJHZtei4kJCRnemlwIiAiJHZteiRnemlwIgogICAgIGVsc2UKIAl2bXo9IiR2bXouJCQiCiAgICAgZmkKIGZpCiAKK3Ztej0iJHZteiRnemlwIgorCiBjYXNlICIkcGxhdGZvcm0iIGluCi11Ym9vdCkKLSAgICBybSAtZiAiJG9maWxlIgordWJvb3R8Y3Vib290KikKICAgICB2ZXJzaW9uPWAke0NST1NTfXN0cmluZ3MgIiRrZXJuZWwiIHwgZ3JlcCAnXkxpbnV4IHZlcnNpb24gWy0wLTkuXScgfCBcCiAJY3V0IC1kJyAnIC1mM2AKICAgICBpZiBbIC1uICIkdmVyc2lvbiIgXTsgdGhlbgogCXZlcnNpb249Ii1uIExpbnV4LSR2ZXJzaW9uIgogICAgIGZpCitlc2FjCisKK2Nhc2UgIiRwbGF0Zm9ybSIgaW4KK3Vib290KQorICAgIHJtIC1mICIkb2ZpbGUiCiAgICAgbWtpbWFnZSAtQSBwcGMgLU8gbGludXggLVQga2VybmVsIC1DIGd6aXAgLWEgMDAwMDAwMDAgLWUgMDAwMDAwMDAgXAotCSR2ZXJzaW9uIC1kICIkdm16Lmd6IiAiJG9maWxlIgorCSR2ZXJzaW9uIC1kICIkdm16IiAiJG9maWxlIgogICAgIGlmIFsgLXogIiRjYWNoZWl0IiBdOyB0aGVuCi0Jcm0gLWYgJHZtei5negorCXJtIC1mICIkdm16IgogICAgIGZpCiAgICAgZXhpdCAwCiAgICAgOzsKQEAgLTE3Myw5ICsxOTAsOSBAQAogCS0tc2V0LXNlY3Rpb24tZmxhZ3M9JDM9Y29udGVudHMsYWxsb2MsbG9hZCxyZWFkb25seSxkYXRhCiB9CiAKLWFkZHNlYyAkdG1wICIkdm16Lmd6IiAka3NlY3Rpb24gJG9iamVjdC9lbXB0eS5vCithZGRzZWMgJHRtcCAiJHZteiIgJGtzZWN0aW9uICRvYmplY3QvZW1wdHkubwogaWYgWyAteiAiJGNhY2hlaXQiIF07IHRoZW4KLSAgICBybSAtZiAiJHZtei5neiIKKyAgICBybSAtZiAiJHZteiIKIGZpCiAKIGlmIFsgLW4gIiRpbml0cmQiIF07IHRoZW4KQEAgLTE5MSw3ICsyMDgsNyBAQAogCiBpZiBbICIkcGxhdGZvcm0iICE9ICJtaWJvb3QiIF07IHRoZW4KICAgICAke0NST1NTfWxkIC1tIGVsZjMycHBjIC1UICRsZHMgLW8gIiRvZmlsZSIgXAotCSRvYmplY3QvY3J0MC5vICRwbGF0Zm9ybW8gJHRtcCAkb2JqZWN0L3dyYXBwZXIuYQorCSRwbGF0Zm9ybW8gJHRtcCAkb2JqZWN0L3dyYXBwZXIuYQogICAgIHJtICR0bXAKIGZpCiAKQEAgLTIwMSw3ICsyMTgsMTkgQEAKICAgICAkb2JqZWN0L2FkZG5vdGUgIiRvZmlsZSIKICAgICA7OwogcG1hY2NvZmYpCi0gICAgJHtDUk9TU31vYmpjb3B5IC1PIGFpeGNvZmYtcnM2MDAwIC0tc2V0LXN0YXJ0IDB4NTAwMDAwICIkb2ZpbGUiCisgICAgZW50cnk9YG9iamR1bXAgLWYgIiRvZmlsZSIgfCBncmVwICdec3RhcnQgYWRkcmVzcyAnIHwgXAorCWN1dCAtZCcgJyAtZjNgCisgICAgJHtDUk9TU31vYmpjb3B5IC1PIGFpeGNvZmYtcnM2MDAwIC0tc2V0LXN0YXJ0ICIkZW50cnkiICIkb2ZpbGUiCiAgICAgJG9iamVjdC9oYWNrLWNvZmYgIiRvZmlsZSIKICAgICA7OworY3Vib290KikKKyAgICBiYXNlPWAke0NST1NTfW5tICIkb2ZpbGUiIHwgZ3JlcCAnIF9zdGFydCQnIHwgY3V0IC1kJyAnIC1mMWAKKyAgICBlbnRyeT1gJHtDUk9TU31vYmpkdW1wIC1mICIkb2ZpbGUiIHwgZ3JlcCAnXnN0YXJ0IGFkZHJlc3MgJyB8IFwKKyAgICAgICAgICAgY3V0IC1kJyAnIC1mM2AKKyAgICBtdiAiJG9maWxlIiAiJG9maWxlIi5lbGYKKyAgICAke0NST1NTfW9iamNvcHkgLU8gYmluYXJ5ICIkb2ZpbGUiLmVsZiAiJG9maWxlIi5iaW4KKyAgICBnemlwIC1mIC05ICIkb2ZpbGUiLmJpbgorICAgIG1raW1hZ2UgLUEgcHBjIC1PIGxpbnV4IC1UIGtlcm5lbCAtQyBnemlwIC1hICIkYmFzZSIgLWUgIiRlbnRyeSIgXAorICAgICAgICAgICAgJHZlcnNpb24gLWQgIiRvZmlsZSIuYmluLmd6ICIkb2ZpbGUiCisgICAgOzsKIGVzYWMKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L3pJbWFnZS5jb2ZmLmxkcy5TIGIvYXJjaC9wb3dlcnBjL2Jvb3QvekltYWdlLmNvZmYubGRzLlMKaW5kZXggYTM2MDkwNS4uZmU4N2E5MCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvekltYWdlLmNvZmYubGRzLlMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvekltYWdlLmNvZmYubGRzLlMKQEAgLTEsNSArMSw2IEBACiBPVVRQVVRfQVJDSChwb3dlcnBjOmNvbW1vbikKLUVOVFJZKF9zdGFydCkKK0VOVFJZKF96aW1hZ2Vfc3RhcnRfb3BkKQorRVhURVJOKF96aW1hZ2Vfc3RhcnRfb3BkKQogU0VDVElPTlMKIHsKICAgLiA9ICg1KjEwMjQqMTAyNCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC96SW1hZ2UubGRzLlMgYi9hcmNoL3Bvd2VycGMvYm9vdC96SW1hZ2UubGRzLlMKaW5kZXggNGJlM2M2NC4uZjZlMzgwZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvekltYWdlLmxkcy5TCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L3pJbWFnZS5sZHMuUwpAQCAtMSw1ICsxLDYgQEAKIE9VVFBVVF9BUkNIKHBvd2VycGM6Y29tbW9uKQogRU5UUlkoX3ppbWFnZV9zdGFydCkKK0VYVEVSTihfemltYWdlX3N0YXJ0KQogU0VDVElPTlMKIHsKICAgLiA9ICg0KjEwMjQqMTAyNCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy9jZWxsX2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL2NlbGxfZGVmY29uZmlnCmluZGV4IGNmN2UzMTYuLjYwNjFlNWYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9jb25maWdzL2NlbGxfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL2NlbGxfZGVmY29uZmlnCkBAIC0xLDcgKzEsNyBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjIxLXJjMwotIyBGcmkgTWFyICA5IDIzOjM0OjUzIDIwMDcKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yMS1yYzYKKyMgTW9uIEFwciAyMyAyMDo0Njo0OCAyMDA3CiAjCiBDT05GSUdfUFBDNjQ9eQogQ09ORklHXzY0QklUPXkKQEAgLTEzOSwxMSArMTM5LDMxIEBACiAjIENPTkZJR19QUENfUE1BQyBpcyBub3Qgc2V0CiAjIENPTkZJR19QUENfTUFQTEUgaXMgbm90IHNldAogIyBDT05GSUdfUFBDX1BBU0VNSSBpcyBub3Qgc2V0CitDT05GSUdfUFBDX0NFTExFQj15CitDT05GSUdfUFBDX1BTMz15CisKKyMKKyMgUFMzIFBsYXRmb3JtIE9wdGlvbnMKKyMKKyMgQ09ORklHX1BTM19BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfUFMzX0hUQUJfU0laRT0yMAorIyBDT05GSUdfUFMzX0RZTkFNSUNfRE1BIGlzIG5vdCBzZXQKK0NPTkZJR19QUzNfVVNFX0xQQVJfQUREUj15CitDT05GSUdfUFMzX1ZVQVJUPXkKK0NPTkZJR19QUzNfUFMzQVY9eQorQ09ORklHX1BTM19TWVNfTUFOQUdFUj15CiBDT05GSUdfUFBDX0NFTEw9eQogQ09ORklHX1BQQ19DRUxMX05BVElWRT15CiBDT05GSUdfUFBDX0lCTV9DRUxMX0JMQURFPXkKLUNPTkZJR19QUENfUFMzPXkKLUNPTkZJR19QUENfQ0VMTEVCPXkKKworIworIyBDZWxsIEJyb2FkYmFuZCBFbmdpbmUgb3B0aW9ucworIworQ09ORklHX1NQVV9GUz1tCitDT05GSUdfU1BVX0JBU0U9eQorQ09ORklHX0NCRV9SQVM9eQorQ09ORklHX0NCRV9USEVSTT1tCitDT05GSUdfQ0JFX0NQVUZSRVE9bQogQ09ORklHX1BQQ19OQVRJVkU9eQogQ09ORklHX1VEQkdfUlRBU19DT05TT0xFPXkKIENPTkZJR19QUENfVURCR19CRUFUPXkKQEAgLTE3NSwyNiArMTk1LDYgQEAKIENPTkZJR19NUElDPXkKIAogIwotIyBDZWxsIEJyb2FkYmFuZCBFbmdpbmUgb3B0aW9ucwotIwotQ09ORklHX1NQVV9GUz1tCi1DT05GSUdfU1BVX0JBU0U9eQotQ09ORklHX0NCRV9SQVM9eQotQ09ORklHX0NCRV9USEVSTT1tCi1DT05GSUdfQ0JFX0NQVUZSRVE9bQotCi0jCi0jIFBTMyBQbGF0Zm9ybSBPcHRpb25zCi0jCi0jIENPTkZJR19QUzNfQURWQU5DRUQgaXMgbm90IHNldAotQ09ORklHX1BTM19IVEFCX1NJWkU9MjAKLSMgQ09ORklHX1BTM19EWU5BTUlDX0RNQSBpcyBub3Qgc2V0Ci1DT05GSUdfUFMzX1VTRV9MUEFSX0FERFI9eQotQ09ORklHX1BTM19WVUFSVD15Ci1DT05GSUdfUFMzX1BTM0FWPXkKLUNPTkZJR19QUzNfU1lTX01BTkFHRVI9eQotCi0jCiAjIEtlcm5lbCBvcHRpb25zCiAjCiAjIENPTkZJR19IWl8xMDAgaXMgbm90IHNldApAQCAtNTM0LDcgKzUzNCw2IEBACiAjIENPTkZJR19CTEtfREVWX09QVEk2MjEgaXMgbm90IHNldAogQ09ORklHX0JMS19ERVZfSURFRE1BX1BDST15CiAjIENPTkZJR19CTEtfREVWX0lERURNQV9GT1JDRUQgaXMgbm90IHNldAotQ09ORklHX0lERURNQV9QQ0lfQVVUTz15CiAjIENPTkZJR19JREVETUFfT05MWURJU0sgaXMgbm90IHNldAogQ09ORklHX0JMS19ERVZfQUVDNjJYWD15CiAjIENPTkZJR19CTEtfREVWX0FMSTE1WDMgaXMgbm90IHNldApAQCAtNTYxLDExICs1NjAsMTAgQEAKICMgQ09ORklHX0JMS19ERVZfVFJNMjkwIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfVklBODJDWFhYIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfVEM4NkMwMDEgaXMgbm90IHNldAotQ09ORklHX0JMS19ERVZfSURFX0NFTExFQj15CitDT05GSUdfQkxLX0RFVl9DRUxMRUI9eQogIyBDT05GSUdfSURFX0FSTSBpcyBub3Qgc2V0CiBDT05GSUdfQkxLX0RFVl9JREVETUE9eQogIyBDT05GSUdfSURFRE1BX0lWQiBpcyBub3Qgc2V0Ci1DT05GSUdfSURFRE1BX0FVVE89eQogIyBDT05GSUdfQkxLX0RFVl9IRCBpcyBub3Qgc2V0CiAKICMKQEAgLTkzNyw3ICs5MzUsNyBAQAogIyBDT05GSUdfTEVHQUNZX1BUWVMgaXMgbm90IHNldAogQ09ORklHX0hWQ19EUklWRVI9eQogQ09ORklHX0hWQ19SVEFTPXkKLSMgQ09ORklHX0hWQ19CRUFUIGlzIG5vdCBzZXQKK0NPTkZJR19IVkNfQkVBVD15CiAKICMKICMgSVBNSQpAQCAtMTQ4Miw2ICsxNDgwLDggQEAKICMgRGlzdHJpYnV0ZWQgTG9jayBNYW5hZ2VyCiAjCiAjIENPTkZJR19ETE0gaXMgbm90IHNldAorIyBDT05GSUdfVUNDX1NMT1cgaXMgbm90IHNldAorIyBDT05GSUdfVUNDX0ZBU1QgaXMgbm90IHNldAogCiAjCiAjIExpYnJhcnkgcm91dGluZXMKQEAgLTE1NDAsNiArMTU0MCw3IEBACiAjIENPTkZJR19GQVVMVF9JTkpFQ1RJT04gaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfU1RBQ0tPVkVSRkxPVyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19TVEFDS19VU0FHRSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19QQUdFQUxMT0MgaXMgbm90IHNldAogQ09ORklHX0RFQlVHR0VSPXkKIENPTkZJR19YTU9OPXkKIENPTkZJR19YTU9OX0RFRkFVTFQ9eQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvZzVfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvZzVfZGVmY29uZmlnCmluZGV4IDc3MjQ4NDcuLjNjY2YxOWQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9jb25maWdzL2c1X2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9nNV9kZWZjb25maWcKQEAgLTE0Myw3ICsxNDMsNyBAQAogQ09ORklHX1UzX0RBUlQ9eQogIyBDT05GSUdfUFBDX1JUQVMgaXMgbm90IHNldAogIyBDT05GSUdfTU1JT19OVlJBTSBpcyBub3Qgc2V0Ci1DT05GSUdfTVBJQ19CUk9LRU5fVTM9eQorQ09ORklHX01QSUNfVTNfSFRfSVJRUz15CiAjIENPTkZJR19QUENfTVBDMTA2IGlzIG5vdCBzZXQKIENPTkZJR19QUENfOTcwX05BUD15CiAjIENPTkZJR19QUENfSU5ESVJFQ1RfSU8gaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvbWFwbGVfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvbWFwbGVfZGVmY29uZmlnCmluZGV4IGRlOTdmMmYuLjE1MzY2ZjAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9jb25maWdzL21hcGxlX2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9tYXBsZV9kZWZjb25maWcKQEAgLTE0Niw3ICsxNDYsNyBAQAogQ09ORklHX1JUQVNfUFJPQz15CiAjIENPTkZJR19SVEFTX0ZMQVNIIGlzIG5vdCBzZXQKICMgQ09ORklHX01NSU9fTlZSQU0gaXMgbm90IHNldAotQ09ORklHX01QSUNfQlJPS0VOX1UzPXkKK0NPTkZJR19NUElDX1UzX0hUX0lSUVM9eQogIyBDT05GSUdfUFBDX01QQzEwNiBpcyBub3Qgc2V0CiBDT05GSUdfUFBDXzk3MF9OQVA9eQogIyBDT05GSUdfUFBDX0lORElSRUNUX0lPIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzL21wYzgzMnhfcmRiX2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL21wYzgzMnhfcmRiX2RlZmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmZjMGE4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvbXBjODMyeF9yZGJfZGVmY29uZmlnCkBAIC0wLDAgKzEsMTI5MiBAQAorIworIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjIxLXJjMworIyBNb24gTWFyIDEyIDE3OjMyOjE5IDIwMDcKKyMKKyMgQ09ORklHX1BQQzY0IGlzIG5vdCBzZXQKK0NPTkZJR19QUEMzMj15CitDT05GSUdfUFBDX01FUkdFPXkKK0NPTkZJR19NTVU9eQorQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQorQ09ORklHX0lSUV9QRVJfQ1BVPXkKK0NPTkZJR19SV1NFTV9YQ0hHQUREX0FMR09SSVRITT15CitDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTMyPXkKK0NPTkZJR19HRU5FUklDX0hXRUlHSFQ9eQorQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKK0NPTkZJR19HRU5FUklDX0ZJTkRfTkVYVF9CSVQ9eQorQ09ORklHX1BQQz15CitDT05GSUdfRUFSTFlfUFJJTlRLPXkKK0NPTkZJR19HRU5FUklDX05WUkFNPXkKK0NPTkZJR19TQ0hFRF9OT19OT19PTUlUX0ZSQU1FX1BPSU5URVI9eQorQ09ORklHX0FSQ0hfTUFZX0hBVkVfUENfRkRDPXkKK0NPTkZJR19QUENfT0Y9eQorQ09ORklHX1BQQ19VREJHXzE2NTUwPXkKKyMgQ09ORklHX0dFTkVSSUNfVEJTWU5DIGlzIG5vdCBzZXQKK0NPTkZJR19BVURJVF9BUkNIPXkKK0NPTkZJR19HRU5FUklDX0JVRz15CitDT05GSUdfREVGQVVMVF9VSU1BR0U9eQorCisjCisjIFByb2Nlc3NvciBzdXBwb3J0CisjCisjIENPTkZJR19DTEFTU0lDMzIgaXMgbm90IHNldAorIyBDT05GSUdfUFBDXzgyeHggaXMgbm90IHNldAorQ09ORklHX1BQQ184M3h4PXkKKyMgQ09ORklHX1BQQ184NXh4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ184Nnh4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ184eHggaXMgbm90IHNldAorIyBDT05GSUdfNDB4IGlzIG5vdCBzZXQKKyMgQ09ORklHXzQ0eCBpcyBub3Qgc2V0CisjIENPTkZJR19FMjAwIGlzIG5vdCBzZXQKK0NPTkZJR182eHg9eQorQ09ORklHXzgzeHg9eQorQ09ORklHX1BQQ19GUFU9eQorIyBDT05GSUdfUFBDX0RDUl9OQVRJVkUgaXMgbm90IHNldAorIyBDT05GSUdfUFBDX0RDUl9NTUlPIGlzIG5vdCBzZXQKK0NPTkZJR19QUENfU1REX01NVT15CitDT05GSUdfUFBDX1NURF9NTVVfMzI9eQorIyBDT05GSUdfU01QIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZDT05GSUdfTElTVD0iL2xpYi9tb2R1bGVzLyRVTkFNRV9SRUxFQVNFLy5jb25maWciCisKKyMKKyMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCisjCitDT05GSUdfRVhQRVJJTUVOVEFMPXkKK0NPTkZJR19CUk9LRU5fT05fU01QPXkKK0NPTkZJR19JTklUX0VOVl9BUkdfTElNSVQ9MzIKKworIworIyBHZW5lcmFsIHNldHVwCisjCitDT05GSUdfTE9DQUxWRVJTSU9OPSIiCitDT05GSUdfTE9DQUxWRVJTSU9OX0FVVE89eQorQ09ORklHX1NXQVA9eQorQ09ORklHX1NZU1ZJUEM9eQorIyBDT05GSUdfSVBDX05TIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNWSVBDX1NZU0NUTD15CisjIENPTkZJR19QT1NJWF9NUVVFVUUgaXMgbm90IHNldAorIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0CisjIENPTkZJR19UQVNLU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfVVRTX05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNGU19ERVBSRUNBVEVEPXkKKyMgQ09ORklHX1JFTEFZIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0lOSVRSRD15CitDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgorIyBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkUgaXMgbm90IHNldAorQ09ORklHX1NZU0NUTD15CitDT05GSUdfRU1CRURERUQ9eQorQ09ORklHX1NZU0NUTF9TWVNDQUxMPXkKKyMgQ09ORklHX0tBTExTWU1TIGlzIG5vdCBzZXQKK0NPTkZJR19IT1RQTFVHPXkKK0NPTkZJR19QUklOVEs9eQorQ09ORklHX0JVRz15CitDT05GSUdfRUxGX0NPUkU9eQorQ09ORklHX0JBU0VfRlVMTD15CitDT05GSUdfRlVURVg9eQorIyBDT05GSUdfRVBPTEwgaXMgbm90IHNldAorQ09ORklHX1NITUVNPXkKK0NPTkZJR19TTEFCPXkKK0NPTkZJR19WTV9FVkVOVF9DT1VOVEVSUz15CitDT05GSUdfUlRfTVVURVhFUz15CisjIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX1NNQUxMPTAKKyMgQ09ORklHX1NMT0IgaXMgbm90IHNldAorCisjCisjIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0CisjCitDT05GSUdfTU9EVUxFUz15CitDT05GSUdfTU9EVUxFX1VOTE9BRD15CisjIENPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRFZFUlNJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CisjIENPTkZJR19LTU9EIGlzIG5vdCBzZXQKKworIworIyBCbG9jayBsYXllcgorIworQ09ORklHX0JMT0NLPXkKKyMgQ09ORklHX0xCRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xTRiBpcyBub3Qgc2V0CisKKyMKKyMgSU8gU2NoZWR1bGVycworIworQ09ORklHX0lPU0NIRURfTk9PUD15CitDT05GSUdfSU9TQ0hFRF9BUz15CitDT05GSUdfSU9TQ0hFRF9ERUFETElORT15CitDT05GSUdfSU9TQ0hFRF9DRlE9eQorQ09ORklHX0RFRkFVTFRfQVM9eQorIyBDT05GSUdfREVGQVVMVF9ERUFETElORSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX0NGUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX05PT1AgaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfSU9TQ0hFRD0iYW50aWNpcGF0b3J5IgorQ09ORklHX1FVSUNDX0VOR0lORT15CitDT05GSUdfUFBDX0dFTjU1MD15CisjIENPTkZJR19XQU5UX0VBUkxZX1NFUklBTCBpcyBub3Qgc2V0CisKKyMKKyMgUGxhdGZvcm0gc3VwcG9ydAorIworIyBDT05GSUdfTVBDODMxM19SREIgaXMgbm90IHNldAorIyBDT05GSUdfTVBDODMyeF9NRFMgaXMgbm90IHNldAorQ09ORklHX01QQzgzMnhfUkRCPXkKKyMgQ09ORklHX01QQzgzNHhfTURTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01QQzgzNHhfSVRYIGlzIG5vdCBzZXQKKyMgQ09ORklHX01QQzgzNnhfTURTIGlzIG5vdCBzZXQKK0NPTkZJR19QUENfTVBDODMyeD15CisjIENPTkZJR19NUElDIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgb3B0aW9ucworIworIyBDT05GSUdfSElHSE1FTSBpcyBub3Qgc2V0CisjIENPTkZJR19IWl8xMDAgaXMgbm90IHNldAorQ09ORklHX0haXzI1MD15CisjIENPTkZJR19IWl8zMDAgaXMgbm90IHNldAorIyBDT05GSUdfSFpfMTAwMCBpcyBub3Qgc2V0CitDT05GSUdfSFo9MjUwCitDT05GSUdfUFJFRU1QVF9OT05FPXkKKyMgQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAorQ09ORklHX0JJTkZNVF9FTEY9eQorIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAorQ09ORklHX01BVEhfRU1VTEFUSU9OPXkKK0NPTkZJR19BUkNIX0VOQUJMRV9NRU1PUllfSE9UUExVRz15CitDT05GSUdfQVJDSF9GTEFUTUVNX0VOQUJMRT15CitDT05GSUdfQVJDSF9QT1BVTEFURVNfTk9ERV9NQVA9eQorQ09ORklHX1NFTEVDVF9NRU1PUllfTU9ERUw9eQorQ09ORklHX0ZMQVRNRU1fTUFOVUFMPXkKKyMgQ09ORklHX0RJU0NPTlRJR01FTV9NQU5VQUwgaXMgbm90IHNldAorIyBDT05GSUdfU1BBUlNFTUVNX01BTlVBTCBpcyBub3Qgc2V0CitDT05GSUdfRkxBVE1FTT15CitDT05GSUdfRkxBVF9OT0RFX01FTV9NQVA9eQorIyBDT05GSUdfU1BBUlNFTUVNX1NUQVRJQyBpcyBub3Qgc2V0CitDT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NAorIyBDT05GSUdfUkVTT1VSQ0VTXzY0QklUIGlzIG5vdCBzZXQKK0NPTkZJR19aT05FX0RNQV9GTEFHPTEKK0NPTkZJR19QUk9DX0RFVklDRVRSRUU9eQorIyBDT05GSUdfQ01ETElORV9CT09MIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BNIGlzIG5vdCBzZXQKK0NPTkZJR19TRUNDT01QPXkKK0NPTkZJR19JU0FfRE1BX0FQST15CisKKyMKKyMgQnVzIG9wdGlvbnMKKyMKK0NPTkZJR19aT05FX0RNQT15CitDT05GSUdfR0VORVJJQ19JU0FfRE1BPXkKKyMgQ09ORklHX01QSUNfV0VJUkQgaXMgbm90IHNldAorIyBDT05GSUdfUFBDX0k4MjU5IGlzIG5vdCBzZXQKK0NPTkZJR19QUENfSU5ESVJFQ1RfUENJPXkKK0NPTkZJR19GU0xfU09DPXkKK0NPTkZJR19QQ0k9eQorQ09ORklHX1BDSV9ET01BSU5TPXkKKyMgQ09ORklHX1BDSUVQT1JUQlVTIGlzIG5vdCBzZXQKKworIworIyBQQ0NBUkQgKFBDTUNJQS9DYXJkQnVzKSBzdXBwb3J0CisjCisjIENPTkZJR19QQ0NBUkQgaXMgbm90IHNldAorCisjCisjIFBDSSBIb3RwbHVnIFN1cHBvcnQKKyMKKyMgQ09ORklHX0hPVFBMVUdfUENJIGlzIG5vdCBzZXQKKworIworIyBBZHZhbmNlZCBzZXR1cAorIworIyBDT05GSUdfQURWQU5DRURfT1BUSU9OUyBpcyBub3Qgc2V0CisKKyMKKyMgRGVmYXVsdCBzZXR0aW5ncyBmb3IgYWR2YW5jZWQgY29uZmlndXJhdGlvbiBvcHRpb25zIGFyZSB1c2VkCisjCitDT05GSUdfSElHSE1FTV9TVEFSVD0weGZlMDAwMDAwCitDT05GSUdfTE9XTUVNX1NJWkU9MHgzMDAwMDAwMAorQ09ORklHX0tFUk5FTF9TVEFSVD0weGMwMDAwMDAwCitDT05GSUdfVEFTS19TSVpFPTB4ODAwMDAwMDAKK0NPTkZJR19CT09UX0xPQUQ9MHgwMDgwMDAwMAorCisjCisjIE5ldHdvcmtpbmcKKyMKK0NPTkZJR19ORVQ9eQorCisjCisjIE5ldHdvcmtpbmcgb3B0aW9ucworIworIyBDT05GSUdfTkVUREVCVUcgaXMgbm90IHNldAorQ09ORklHX1BBQ0tFVD15CisjIENPTkZJR19QQUNLRVRfTU1BUCBpcyBub3Qgc2V0CitDT05GSUdfVU5JWD15CitDT05GSUdfWEZSTT15CisjIENPTkZJR19YRlJNX1VTRVIgaXMgbm90IHNldAorIyBDT05GSUdfWEZSTV9TVUJfUE9MSUNZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hGUk1fTUlHUkFURSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUPXkKK0NPTkZJR19JUF9NVUxUSUNBU1Q9eQorIyBDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9GSUJfSEFTSD15CitDT05GSUdfSVBfUE5QPXkKK0NPTkZJR19JUF9QTlBfREhDUD15CitDT05GSUdfSVBfUE5QX0JPT1RQPXkKKyMgQ09ORklHX0lQX1BOUF9SQVJQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUEdSRSBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9NUk9VVEUgaXMgbm90IHNldAorIyBDT05GSUdfQVJQRCBpcyBub3Qgc2V0CitDT05GSUdfU1lOX0NPT0tJRVM9eQorIyBDT05GSUdfSU5FVF9BSCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0VTUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0lQQ09NUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1hGUk1fVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUX1hGUk1fTU9ERV9UUkFOU1BPUlQ9eQorQ09ORklHX0lORVRfWEZSTV9NT0RFX1RVTk5FTD15CitDT05GSUdfSU5FVF9YRlJNX01PREVfQkVFVD15CitDT05GSUdfSU5FVF9ESUFHPXkKK0NPTkZJR19JTkVUX1RDUF9ESUFHPXkKKyMgQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19UQ1BfQ09OR19DVUJJQz15CitDT05GSUdfREVGQVVMVF9UQ1BfQ09ORz0iY3ViaWMiCisjIENPTkZJR19UQ1BfTUQ1U0lHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVDZfWEZSTV9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVDZfVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFdPUktfU0VDTUFSSyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAorCisjCisjIERDQ1AgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQorIworIyBDT05GSUdfSVBfRENDUCBpcyBub3Qgc2V0CisKKyMKKyMgU0NUUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKKworIworIyBUSVBDIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKKyMKKyMgQ09ORklHX1RJUEMgaXMgbm90IHNldAorIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQWCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0CisjIENPTkZJR19YMjUgaXMgbm90IHNldAorIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0CisjIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAorIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0CisKKyMKKyMgUW9TIGFuZC9vciBmYWlyIHF1ZXVlaW5nCisjCisjIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgdGVzdGluZworIworIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CisjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lFRUU4MDIxMSBpcyBub3Qgc2V0CisKKyMKKyMgRGV2aWNlIERyaXZlcnMKKyMKKworIworIyBHZW5lcmljIERyaXZlciBPcHRpb25zCisjCitDT05GSUdfU1RBTkRBTE9ORT15CitDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15CisjIENPTkZJR19GV19MT0FERVIgaXMgbm90IHNldAorIyBDT05GSUdfU1lTX0hZUEVSVklTT1IgaXMgbm90IHNldAorCisjCisjIENvbm5lY3RvciAtIHVuaWZpZWQgdXNlcnNwYWNlIDwtPiBrZXJuZWxzcGFjZSBsaW5rZXIKKyMKKyMgQ09ORklHX0NPTk5FQ1RPUiBpcyBub3Qgc2V0CisKKyMKKyMgTWVtb3J5IFRlY2hub2xvZ3kgRGV2aWNlcyAoTVREKQorIworIyBDT05GSUdfTVREIGlzIG5vdCBzZXQKKworIworIyBQYXJhbGxlbCBwb3J0IHN1cHBvcnQKKyMKKyMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAorCisjCisjIFBsdWcgYW5kIFBsYXkgc3VwcG9ydAorIworIyBDT05GSUdfUE5QQUNQSSBpcyBub3Qgc2V0CisKKyMKKyMgQmxvY2sgZGV2aWNlcworIworIyBDT05GSUdfQkxLX0RFVl9GRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfQ1BRX0RBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19DUFFfQ0lTU19EQSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0RBQzk2MCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1VNRU0gaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9DT1dfQ09NTU9OIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0xPT1A9eQorIyBDT05GSUdfQkxLX0RFVl9DUllQVE9MT09QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTkJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfU1g4IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfVUIgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfUkFNPXkKK0NPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgorQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9MzI3NjgKK0NPTkZJR19CTEtfREVWX1JBTV9CTE9DS1NJWkU9MTAyNAorIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAorCisjCisjIE1pc2MgZGV2aWNlcworIworIyBDT05GSUdfU0dJX0lPQzQgaXMgbm90IHNldAorIyBDT05GSUdfVElGTV9DT1JFIGlzIG5vdCBzZXQKKworIworIyBBVEEvQVRBUEkvTUZNL1JMTCBzdXBwb3J0CisjCisjIENPTkZJR19JREUgaXMgbm90IHNldAorCisjCisjIFNDU0kgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1JBSURfQVRUUlMgaXMgbm90IHNldAorQ09ORklHX1NDU0k9eQorIyBDT05GSUdfU0NTSV9UR1QgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ORVRMSU5LIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJX1BST0NfRlM9eQorCisjCisjIFNDU0kgc3VwcG9ydCB0eXBlIChkaXNrLCB0YXBlLCBDRC1ST00pCisjCitDT05GSUdfQkxLX0RFVl9TRD15CisjIENPTkZJR19DSFJfREVWX1NUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NIUl9ERVZfT1NTVCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1NSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NIUl9ERVZfU0cgaXMgbm90IHNldAorIyBDT05GSUdfQ0hSX0RFVl9TQ0ggaXMgbm90IHNldAorCisjCisjIFNvbWUgU0NTSSBkZXZpY2VzIChlLmcuIENEIGp1a2Vib3gpIHN1cHBvcnQgbXVsdGlwbGUgTFVOcworIworIyBDT05GSUdfU0NTSV9NVUxUSV9MVU4gaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9DT05TVEFOVFMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9MT0dHSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU0NBTl9BU1lOQyBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBUcmFuc3BvcnRzCisjCisjIENPTkZJR19TQ1NJX1NQSV9BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0ZDX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSVNDU0lfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TQVNfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TQVNfTElCU0FTIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIGxvdy1sZXZlbCBkcml2ZXJzCisjCisjIENPTkZJR19JU0NTSV9UQ1AgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl8zV19YWFhYX1JBSUQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV8zV185WFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUNBUkQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BQUNSQUlEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUlDN1hYWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FJQzdYWFhfT0xEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUlDNzlYWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FJQzk0WFggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9EUFRfSTJPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQVJDTVNSIGlzIG5vdCBzZXQKKyMgQ09ORklHX01FR0FSQUlEX05FV0dFTiBpcyBub3Qgc2V0CisjIENPTkZJR19NRUdBUkFJRF9MRUdBQ1kgaXMgbm90IHNldAorIyBDT05GSUdfTUVHQVJBSURfU0FTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSFBUSU9QIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQlVTTE9HSUMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ETVgzMTkxRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0VBVEEgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9GVVRVUkVfRE9NQUlOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfR0RUSCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0lQUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0lOSVRJTyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0lOSUExMDAgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TVEVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU1lNNTNDOFhYXzIgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9RTE9HSUNfMTI4MCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1FMQV9GQyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1FMQV9JU0NTSSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0xQRkMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9EQzM5NXggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9EQzM5MFQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9OU1AzMiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU1JQIGlzIG5vdCBzZXQKKworIworIyBTZXJpYWwgQVRBIChwcm9kKSBhbmQgUGFyYWxsZWwgQVRBIChleHBlcmltZW50YWwpIGRyaXZlcnMKKyMKKyMgQ09ORklHX0FUQSBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGktZGV2aWNlIHN1cHBvcnQgKFJBSUQgYW5kIExWTSkKKyMKKyMgQ09ORklHX01EIGlzIG5vdCBzZXQKKworIworIyBGdXNpb24gTVBUIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19GVVNJT04gaXMgbm90IHNldAorIyBDT05GSUdfRlVTSU9OX1NQSSBpcyBub3Qgc2V0CisjIENPTkZJR19GVVNJT05fRkMgaXMgbm90IHNldAorIyBDT05GSUdfRlVTSU9OX1NBUyBpcyBub3Qgc2V0CisKKyMKKyMgSUVFRSAxMzk0IChGaXJlV2lyZSkgc3VwcG9ydAorIworIyBDT05GSUdfSUVFRTEzOTQgaXMgbm90IHNldAorCisjCisjIEkyTyBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfSTJPIGlzIG5vdCBzZXQKKworIworIyBNYWNpbnRvc2ggZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX01BQ19FTVVNT1VTRUJUTiBpcyBub3Qgc2V0CisjIENPTkZJR19XSU5ERkFSTSBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayBkZXZpY2Ugc3VwcG9ydAorIworQ09ORklHX05FVERFVklDRVM9eQorIyBDT05GSUdfRFVNTVkgaXMgbm90IHNldAorIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CisjIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAorIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKKworIworIyBBUkNuZXQgZGV2aWNlcworIworIyBDT05GSUdfQVJDTkVUIGlzIG5vdCBzZXQKKworIworIyBQSFkgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BIWUxJQiBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwIG9yIDEwME1iaXQpCisjCitDT05GSUdfTkVUX0VUSEVSTkVUPXkKK0NPTkZJR19NSUk9eQorIyBDT05GSUdfSEFQUFlNRUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NVTkdFTSBpcyBub3Qgc2V0CisjIENPTkZJR19DQVNTSU5JIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfM0NPTSBpcyBub3Qgc2V0CisKKyMKKyMgVHVsaXAgZmFtaWx5IG5ldHdvcmsgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX05FVF9UVUxJUCBpcyBub3Qgc2V0CisjIENPTkZJR19IUDEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfUENJIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAwMCBNYml0KQorIworIyBDT05GSUdfQUNFTklDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RMMksgaXMgbm90IHNldAorQ09ORklHX0UxMDAwPXkKKyMgQ09ORklHX0UxMDAwX05BUEkgaXMgbm90IHNldAorIyBDT05GSUdfRTEwMDBfRElTQUJMRV9QQUNLRVRfU1BMSVQgaXMgbm90IHNldAorIyBDT05GSUdfTlM4MzgyMCBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1BQ0hJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1lFTExPV0ZJTiBpcyBub3Qgc2V0CisjIENPTkZJR19SODE2OSBpcyBub3Qgc2V0CisjIENPTkZJR19TSVMxOTAgaXMgbm90IHNldAorIyBDT05GSUdfU0tHRSBpcyBub3Qgc2V0CisjIENPTkZJR19TS1kyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NLOThMSU4gaXMgbm90IHNldAorIyBDT05GSUdfVElHT04zIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JOWDIgaXMgbm90IHNldAorIyBDT05GSUdfR0lBTkZBUiBpcyBub3Qgc2V0CitDT05GSUdfVUNDX0dFVEg9eQorQ09ORklHX1VHRVRIX05BUEk9eQorIyBDT05GSUdfVUdFVEhfTUFHSUNfUEFDS0VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VHRVRIX0ZJTFRFUklORyBpcyBub3Qgc2V0CisjIENPTkZJR19VR0VUSF9UWF9PTl9ERU1PTkQgaXMgbm90IHNldAorIyBDT05GSUdfUUxBM1hYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEwxIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAwMDAgTWJpdCkKKyMKKyMgQ09ORklHX0NIRUxTSU9fVDEgaXMgbm90IHNldAorIyBDT05GSUdfQ0hFTFNJT19UMyBpcyBub3Qgc2V0CisjIENPTkZJR19JWEdCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1MySU8gaXMgbm90IHNldAorIyBDT05GSUdfTVlSSTEwR0UgaXMgbm90IHNldAorIyBDT05GSUdfTkVUWEVOX05JQyBpcyBub3Qgc2V0CisKKyMKKyMgVG9rZW4gUmluZyBkZXZpY2VzCisjCisjIENPTkZJR19UUiBpcyBub3Qgc2V0CisKKyMKKyMgV2lyZWxlc3MgTEFOIChub24taGFtcmFkaW8pCisjCisjIENPTkZJR19ORVRfUkFESU8gaXMgbm90IHNldAorCisjCisjIFdhbiBpbnRlcmZhY2VzCisjCisjIENPTkZJR19XQU4gaXMgbm90IHNldAorIyBDT05GSUdfRkRESSBpcyBub3Qgc2V0CisjIENPTkZJR19ISVBQSSBpcyBub3Qgc2V0CisjIENPTkZJR19QUFAgaXMgbm90IHNldAorIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfRkMgaXMgbm90IHNldAorIyBDT05GSUdfU0hBUEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVENPTlNPTEUgaXMgbm90IHNldAorIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKKworIworIyBJU0ROIHN1YnN5c3RlbQorIworIyBDT05GSUdfSVNETiBpcyBub3Qgc2V0CisKKyMKKyMgVGVsZXBob255IFN1cHBvcnQKKyMKKyMgQ09ORklHX1BIT05FIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydAorIworQ09ORklHX0lOUFVUPXkKKyMgQ09ORklHX0lOUFVUX0ZGX01FTUxFU1MgaXMgbm90IHNldAorCisjCisjIFVzZXJsYW5kIGludGVyZmFjZXMKKyMKKyMgQ09ORklHX0lOUFVUX01PVVNFREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0pPWURFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UU0RFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkRFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkJVRyBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX0lOUFVUX0tFWUJPQVJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01PVVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIEkvTyBwb3J0cworIworIyBDT05GSUdfU0VSSU8gaXMgbm90IHNldAorIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAorCisjCisjIENoYXJhY3RlciBkZXZpY2VzCisjCisjIENPTkZJR19WVCBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAorCisjCisjIFNlcmlhbCBkcml2ZXJzCisjCitDT05GSUdfU0VSSUFMXzgyNTA9eQorQ09ORklHX1NFUklBTF84MjUwX0NPTlNPTEU9eQorQ09ORklHX1NFUklBTF84MjUwX1BDST15CitDT05GSUdfU0VSSUFMXzgyNTBfTlJfVUFSVFM9NAorQ09ORklHX1NFUklBTF84MjUwX1JVTlRJTUVfVUFSVFM9NAorIyBDT05GSUdfU0VSSUFMXzgyNTBfRVhURU5ERUQgaXMgbm90IHNldAorCisjCisjIE5vbi04MjUwIHNlcmlhbCBwb3J0IHN1cHBvcnQKKyMKKyMgQ09ORklHX1NFUklBTF9VQVJUTElURSBpcyBub3Qgc2V0CitDT05GSUdfU0VSSUFMX0NPUkU9eQorQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQorIyBDT05GSUdfU0VSSUFMX0pTTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJQUxfT0ZfUExBVEZPUk0gaXMgbm90IHNldAorQ09ORklHX1VOSVg5OF9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0yNTYKKworIworIyBJUE1JCisjCisjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAorCisjCisjIFdhdGNoZG9nIENhcmRzCisjCitDT05GSUdfV0FUQ0hET0c9eQorIyBDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQgaXMgbm90IHNldAorCisjCisjIFdhdGNoZG9nIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19TT0ZUX1dBVENIRE9HIGlzIG5vdCBzZXQKK0NPTkZJR184M3h4X1dEVD15CisKKyMKKyMgUENJLWJhc2VkIFdhdGNoZG9nIENhcmRzCisjCisjIENPTkZJR19QQ0lQQ1dBVENIRE9HIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dEVFBDSSBpcyBub3Qgc2V0CisKKyMKKyMgVVNCLWJhc2VkIFdhdGNoZG9nIENhcmRzCisjCisjIENPTkZJR19VU0JQQ1dBVENIRE9HIGlzIG5vdCBzZXQKK0NPTkZJR19IV19SQU5ET009eQorIyBDT05GSUdfTlZSQU0gaXMgbm90IHNldAorQ09ORklHX0dFTl9SVEM9eQorIyBDT05GSUdfR0VOX1JUQ19YIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RUTEsgaXMgbm90IHNldAorIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAorIyBDT05GSUdfQVBQTElDT00gaXMgbm90IHNldAorIyBDT05GSUdfQUdQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RSTSBpcyBub3Qgc2V0CisjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKKworIworIyBUUE0gZGV2aWNlcworIworIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CisKKyMKKyMgSTJDIHN1cHBvcnQKKyMKK0NPTkZJR19JMkM9eQorQ09ORklHX0kyQ19DSEFSREVWPXkKKworIworIyBJMkMgQWxnb3JpdGhtcworIworIyBDT05GSUdfSTJDX0FMR09CSVQgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FMR09QQ0YgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FMR09QQ0EgaXMgbm90IHNldAorCisjCisjIEkyQyBIYXJkd2FyZSBCdXMgc3VwcG9ydAorIworIyBDT05GSUdfSTJDX0FMSTE1MzUgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FMSTE1NjMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FMSTE1WDMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FNRDc1NiBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQU1EODExMSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfSTgwMSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfSTgxMCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfUElJWDQgaXMgbm90IHNldAorQ09ORklHX0kyQ19NUEM9eQorIyBDT05GSUdfSTJDX05GT1JDRTIgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX09DT1JFUyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfUEFSUE9SVF9MSUdIVCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfUEFTRU1JIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19QUk9TQVZBR0UgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NBVkFHRTQgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NJUzU1OTUgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NJUzYzMCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU0lTOTZYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TVFVCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19WSUEgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1ZJQVBSTyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfVk9PRE9PMyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfUENBX0lTQSBpcyBub3Qgc2V0CisKKyMKKyMgTWlzY2VsbGFuZW91cyBJMkMgQ2hpcCBzdXBwb3J0CisjCisjIENPTkZJR19TRU5TT1JTX0RTMTMzNyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0RTMTM3NCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0VFUFJPTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDRjg1NzQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0E5NTM5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUENGODU5MSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX000MVQwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX01BWDY4NzUgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0FMR08gaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0JVUyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQ0hJUCBpcyBub3Qgc2V0CisKKyMKKyMgU1BJIHN1cHBvcnQKKyMKKyMgQ09ORklHX1NQSSBpcyBub3Qgc2V0CisjIENPTkZJR19TUElfTUFTVEVSIGlzIG5vdCBzZXQKKworIworIyBEYWxsYXMncyAxLXdpcmUgYnVzCisjCisjIENPTkZJR19XMSBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgTW9uaXRvcmluZyBzdXBwb3J0CisjCitDT05GSUdfSFdNT049eQorIyBDT05GSUdfSFdNT05fVklEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQUJJVFVHVVJVIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAyMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTEwMjUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDI2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAyOSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTEwMzEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE05MjQwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQVNCMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQVRYUDEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19EUzE2MjEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19GNzE4MDVGIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRlNDSEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRlNDUE9TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfR0w1MThTTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0dMNTIwU00gaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19JVDg3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE02MyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNNzUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTc3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE03OCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNODAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTgzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE04NSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNODcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTkwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE05MiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX01BWDE2MTkgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQzg3MzYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUEM4NzQyNyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1NJUzU1OTUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19TTVNDNDdNMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1NNU0M0N00xOTIgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19TTVNDNDdCMzk3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVklBNjg2QSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1ZUMTIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1ZUODIzMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4Mzc4MUQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM3OTFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNzkyRCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4Mzc5MyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4M0w3ODVUUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4MzYyN0hGIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNjI3RUhGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hXTU9OX0RFQlVHX0NISVAgaXMgbm90IHNldAorCisjCisjIE11bHRpZnVuY3Rpb24gZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX01GRF9TTTUwMSBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGltZWRpYSBkZXZpY2VzCisjCisjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAorCisjCisjIERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIERldmljZXMKKyMKKyMgQ09ORklHX0RWQiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfREFCVVNCIGlzIG5vdCBzZXQKKworIworIyBHcmFwaGljcyBzdXBwb3J0CisjCisjIENPTkZJR19CQUNLTElHSFRfTENEX1NVUFBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfRkIgaXMgbm90IHNldAorIyBDT05GSUdfRkJfSUJNX0dYVDQ1MDAgaXMgbm90IHNldAorCisjCisjIFNvdW5kCisjCisjIENPTkZJR19TT1VORCBpcyBub3Qgc2V0CisKKyMKKyMgSElEIERldmljZXMKKyMKK0NPTkZJR19ISUQ9eQorIyBDT05GSUdfSElEX0RFQlVHIGlzIG5vdCBzZXQKKworIworIyBVU0Igc3VwcG9ydAorIworQ09ORklHX1VTQl9BUkNIX0hBU19IQ0Q9eQorQ09ORklHX1VTQl9BUkNIX0hBU19PSENJPXkKK0NPTkZJR19VU0JfQVJDSF9IQVNfRUhDST15CitDT05GSUdfVVNCPXkKKyMgQ09ORklHX1VTQl9ERUJVRyBpcyBub3Qgc2V0CisKKyMKKyMgTWlzY2VsbGFuZW91cyBVU0Igb3B0aW9ucworIworQ09ORklHX1VTQl9ERVZJQ0VGUz15CisjIENPTkZJR19VU0JfRFlOQU1JQ19NSU5PUlMgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX09URyBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIEhvc3QgQ29udHJvbGxlciBEcml2ZXJzCisjCitDT05GSUdfVVNCX0VIQ0lfSENEPXkKKyMgQ09ORklHX1VTQl9FSENJX1NQTElUX0lTTyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfRUhDSV9ST09UX0hVQl9UVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfRUhDSV9UVF9ORVdTQ0hFRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfRUhDSV9CSUdfRU5ESUFOX01NSU8gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0lTUDExNlhfSENEIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfT0hDSV9IQ0Q9eQorQ09ORklHX1VTQl9PSENJX0hDRF9QUENfT0Y9eQorQ09ORklHX1VTQl9PSENJX0hDRF9QUENfT0ZfQkU9eQorIyBDT05GSUdfVVNCX09IQ0lfSENEX1BQQ19PRl9MRSBpcyBub3Qgc2V0CitDT05GSUdfVVNCX09IQ0lfSENEX1BDST15CitDT05GSUdfVVNCX09IQ0lfQklHX0VORElBTl9ERVNDPXkKK0NPTkZJR19VU0JfT0hDSV9CSUdfRU5ESUFOX01NSU89eQorQ09ORklHX1VTQl9PSENJX0xJVFRMRV9FTkRJQU49eQorIyBDT05GSUdfVVNCX1VIQ0lfSENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TTDgxMV9IQ0QgaXMgbm90IHNldAorCisjCisjIFVTQiBEZXZpY2UgQ2xhc3MgZHJpdmVycworIworIyBDT05GSUdfVVNCX0FDTSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUFJJTlRFUiBpcyBub3Qgc2V0CisKKyMKKyMgTk9URTogVVNCX1NUT1JBR0UgZW5hYmxlcyBTQ1NJLCBhbmQgJ1NDU0kgZGlzayBzdXBwb3J0JworIworCisjCisjIG1heSBhbHNvIGJlIG5lZWRlZDsgc2VlIFVTQl9TVE9SQUdFIEhlbHAgZm9yIG1vcmUgaW5mb3JtYXRpb24KKyMKK0NPTkZJR19VU0JfU1RPUkFHRT15CisjIENPTkZJR19VU0JfU1RPUkFHRV9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9EQVRBRkFCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0ZSRUVDT00gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfRFBDTSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9VU0JBVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9TRERSMDkgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfU0REUjU1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0pVTVBTSE9UIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0FMQVVEQSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9LQVJNQSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTElCVVNVQUwgaXMgbm90IHNldAorCisjCisjIFVTQiBJbnB1dCBEZXZpY2VzCisjCisjIENPTkZJR19VU0JfSElEIGlzIG5vdCBzZXQKKworIworIyBVU0IgSElEIEJvb3QgUHJvdG9jb2wgZHJpdmVycworIworIyBDT05GSUdfVVNCX0tCRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTU9VU0UgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FJUFRFSyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfV0FDT00gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FDRUNBRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfS0JUQUIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1BPV0VSTUFURSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfVE9VQ0hTQ1JFRU4gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1lFQUxJTksgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1hQQUQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FUSV9SRU1PVEUgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FUSV9SRU1PVEUyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9LRVlTUEFOX1JFTU9URSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQVBQTEVUT1VDSCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR1RDTyBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIEltYWdpbmcgZGV2aWNlcworIworIyBDT05GSUdfVVNCX01EQzgwMCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTUlDUk9URUsgaXMgbm90IHNldAorCisjCisjIFVTQiBOZXR3b3JrIEFkYXB0ZXJzCisjCisjIENPTkZJR19VU0JfQ0FUQyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfS0FXRVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9QRUdBU1VTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9SVEw4MTUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9VU0JORVRfTUlJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9VU0JORVQgaXMgbm90IHNldAorQ09ORklHX1VTQl9NT049eQorCisjCisjIFVTQiBwb3J0IGRyaXZlcnMKKyMKKworIworIyBVU0IgU2VyaWFsIENvbnZlcnRlciBzdXBwb3J0CisjCisjIENPTkZJR19VU0JfU0VSSUFMIGlzIG5vdCBzZXQKKworIworIyBVU0IgTWlzY2VsbGFuZW91cyBkcml2ZXJzCisjCisjIENPTkZJR19VU0JfRU1JNjIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0VNSTI2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BRFVUVVggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FVRVJTV0FMRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUklPNTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MRUdPVE9XRVIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0xDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQkVSUllfQ0hBUkdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MRUQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0NZUFJFU1NfQ1k3QzYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9DWVRIRVJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9QSElER0VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JRE1PVVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9GVERJX0VMQU4gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FQUExFRElTUExBWSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0lTVVNCVkdBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfVFJBTkNFVklCUkFUT1IgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0lPV0FSUklPUiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfVEVTVCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIERTTCBtb2RlbSBzdXBwb3J0CisjCisKKyMKKyMgVVNCIEdhZGdldCBTdXBwb3J0CisjCisjIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKKworIworIyBNTUMvU0QgQ2FyZCBzdXBwb3J0CisjCisjIENPTkZJR19NTUMgaXMgbm90IHNldAorCisjCisjIExFRCBkZXZpY2VzCisjCisjIENPTkZJR19ORVdfTEVEUyBpcyBub3Qgc2V0CisKKyMKKyMgTEVEIGRyaXZlcnMKKyMKKworIworIyBMRUQgVHJpZ2dlcnMKKyMKKworIworIyBJbmZpbmlCYW5kIHN1cHBvcnQKKyMKKyMgQ09ORklHX0lORklOSUJBTkQgaXMgbm90IHNldAorCisjCisjIEVEQUMgLSBlcnJvciBkZXRlY3Rpb24gYW5kIHJlcG9ydGluZyAoUkFTKSAoRVhQRVJJTUVOVEFMKQorIworCisjCisjIFJlYWwgVGltZSBDbG9jaworIworIyBDT05GSUdfUlRDX0NMQVNTIGlzIG5vdCBzZXQKKworIworIyBETUEgRW5naW5lIHN1cHBvcnQKKyMKKyMgQ09ORklHX0RNQV9FTkdJTkUgaXMgbm90IHNldAorCisjCisjIERNQSBDbGllbnRzCisjCisKKyMKKyMgRE1BIERldmljZXMKKyMKKworIworIyBBdXhpbGlhcnkgRGlzcGxheSBzdXBwb3J0CisjCisKKyMKKyMgVmlydHVhbGl6YXRpb24KKyMKKworIworIyBGaWxlIHN5c3RlbXMKKyMKK0NPTkZJR19FWFQyX0ZTPXkKKyMgQ09ORklHX0VYVDJfRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfRVhUMl9GU19YSVAgaXMgbm90IHNldAorQ09ORklHX0VYVDNfRlM9eQorQ09ORklHX0VYVDNfRlNfWEFUVFI9eQorIyBDT05GSUdfRVhUM19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfRVhUM19GU19TRUNVUklUWSBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQ0REVWX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19KQkQ9eQorIyBDT05GSUdfSkJEX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19GU19NQkNBQ0hFPXkKKyMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dGUzJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfT0NGUzJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorQ09ORklHX0lOT1RJRlk9eQorQ09ORklHX0lOT1RJRllfVVNFUj15CisjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0CitDT05GSUdfRE5PVElGWT15CisjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GVVNFX0ZTIGlzIG5vdCBzZXQKKworIworIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VERl9GUyBpcyBub3Qgc2V0CisKKyMKKyMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcworIworQ09ORklHX0ZBVF9GUz15CitDT05GSUdfTVNET1NfRlM9eQorQ09ORklHX1ZGQVRfRlM9eQorQ09ORklHX0ZBVF9ERUZBVUxUX0NPREVQQUdFPTQzNworQ09ORklHX0ZBVF9ERUZBVUxUX0lPQ0hBUlNFVD0iaXNvODg1OS0xIgorIyBDT05GSUdfTlRGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUHNldWRvIGZpbGVzeXN0ZW1zCisjCitDT05GSUdfUFJPQ19GUz15CitDT05GSUdfUFJPQ19LQ09SRT15CitDT05GSUdfUFJPQ19TWVNDVEw9eQorQ09ORklHX1NZU0ZTPXkKK0NPTkZJR19UTVBGUz15CisjIENPTkZJR19UTVBGU19QT1NJWF9BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKK0NPTkZJR19SQU1GUz15CisjIENPTkZJR19DT05GSUdGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgTWlzY2VsbGFuZW91cyBmaWxlc3lzdGVtcworIworIyBDT05GSUdfQURGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNQTFVTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JFRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUkFNRlMgaXMgbm90IHNldAorIyBDT05GSUdfVlhGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IUEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayBGaWxlIFN5c3RlbXMKKyMKK0NPTkZJR19ORlNfRlM9eQorQ09ORklHX05GU19WMz15CisjIENPTkZJR19ORlNfVjNfQUNMIGlzIG5vdCBzZXQKK0NPTkZJR19ORlNfVjQ9eQorIyBDT05GSUdfTkZTX0RJUkVDVElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU0QgaXMgbm90IHNldAorQ09ORklHX1JPT1RfTkZTPXkKK0NPTkZJR19MT0NLRD15CitDT05GSUdfTE9DS0RfVjQ9eQorQ09ORklHX05GU19DT01NT049eQorQ09ORklHX1NVTlJQQz15CitDT05GSUdfU1VOUlBDX0dTUz15CitDT05GSUdfUlBDU0VDX0dTU19LUkI1PXkKKyMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAorIyBDT05GSUdfU01CX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NJRlMgaXMgbm90IHNldAorIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHXzlQX0ZTIGlzIG5vdCBzZXQKKworIworIyBQYXJ0aXRpb24gVHlwZXMKKyMKK0NPTkZJR19QQVJUSVRJT05fQURWQU5DRUQ9eQorIyBDT05GSUdfQUNPUk5fUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX09TRl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfQU1JR0FfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQVJJX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNfUEFSVElUSU9OIGlzIG5vdCBzZXQKK0NPTkZJR19NU0RPU19QQVJUSVRJT049eQorIyBDT05GSUdfQlNEX0RJU0tMQUJFTCBpcyBub3Qgc2V0CisjIENPTkZJR19NSU5JWF9TVUJQQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfU09MQVJJU19YODZfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VOSVhXQVJFX0RJU0tMQUJFTCBpcyBub3Qgc2V0CitDT05GSUdfTERNX1BBUlRJVElPTj15CisjIENPTkZJR19MRE1fREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfU0dJX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19VTFRSSVhfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NVTl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfS0FSTUFfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VGSV9QQVJUSVRJT04gaXMgbm90IHNldAorCisjCisjIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CisjCitDT05GSUdfTkxTPXkKK0NPTkZJR19OTFNfREVGQVVMVD0iaXNvODg1OS0xIgorQ09ORklHX05MU19DT0RFUEFHRV80Mzc9eQorIyBDT05GSUdfTkxTX0NPREVQQUdFXzczNyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfNzc1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1MiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODU1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYxIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY5IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85MzYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzk1MCBpcyBub3Qgc2V0CitDT05GSUdfTkxTX0NPREVQQUdFXzkzMj15CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTQ5IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NzQgaXMgbm90IHNldAorQ09ORklHX05MU19JU084ODU5Xzg9eQorIyBDT05GSUdfTkxTX0NPREVQQUdFXzEyNTAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzEyNTEgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0FTQ0lJIGlzIG5vdCBzZXQKK0NPTkZJR19OTFNfSVNPODg1OV8xPXkKKyMgQ09ORklHX05MU19JU084ODU5XzIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV80IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV83IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0tPSThfUiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfS09JOF9VIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19VVEY4IGlzIG5vdCBzZXQKKworIworIyBEaXN0cmlidXRlZCBMb2NrIE1hbmFnZXIKKyMKKyMgQ09ORklHX0RMTSBpcyBub3Qgc2V0CisKKyMKKyMgUUUgT3B0aW9ucworIworQ09ORklHX1VDQ19TTE9XPXkKK0NPTkZJR19VQ0NfRkFTVD15CitDT05GSUdfVUNDPXkKKworIworIyBMaWJyYXJ5IHJvdXRpbmVzCisjCitDT05GSUdfQklUUkVWRVJTRT15CisjIENPTkZJR19DUkNfQ0NJVFQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDMTYgaXMgbm90IHNldAorQ09ORklHX0NSQzMyPXkKKyMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0CitDT05GSUdfUExJU1Q9eQorQ09ORklHX0hBU19JT01FTT15CitDT05GSUdfSEFTX0lPUE9SVD15CisKKyMKKyMgSW5zdHJ1bWVudGF0aW9uIFN1cHBvcnQKKyMKKyMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0CisKKyMKKyMgS2VybmVsIGhhY2tpbmcKKyMKKyMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKK0NPTkZJR19FTkFCTEVfTVVTVF9DSEVDSz15CisjIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0CisjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0tFUk5FTCBpcyBub3Qgc2V0CitDT05GSUdfTE9HX0JVRl9TSElGVD0xNAorIyBDT05GSUdfREVCVUdfQlVHVkVSQk9TRSBpcyBub3Qgc2V0CisjIENPTkZJR19CT09UWF9URVhUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklBTF9URVhUX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19FQVJMWV9ERUJVRyBpcyBub3Qgc2V0CisKKyMKKyMgU2VjdXJpdHkgb3B0aW9ucworIworIyBDT05GSUdfS0VZUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNVUklUWSBpcyBub3Qgc2V0CisKKyMKKyMgQ3J5cHRvZ3JhcGhpYyBvcHRpb25zCisjCitDT05GSUdfQ1JZUFRPPXkKK0NPTkZJR19DUllQVE9fQUxHQVBJPXkKK0NPTkZJR19DUllQVE9fQkxLQ0lQSEVSPXkKK0NPTkZJR19DUllQVE9fTUFOQUdFUj15CisjIENPTkZJR19DUllQVE9fSE1BQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fWENCQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTlVMTCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTUQ0IGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fTUQ1PXkKKyMgQ09ORklHX0NSWVBUT19TSEExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TSEEyNTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTUxMiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fV1A1MTIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RHUjE5MiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fR0YxMjhNVUwgaXMgbm90IHNldAorQ09ORklHX0NSWVBUT19FQ0I9bQorQ09ORklHX0NSWVBUT19DQkM9eQorQ09ORklHX0NSWVBUT19QQ0JDPW0KKyMgQ09ORklHX0NSWVBUT19MUlcgaXMgbm90IHNldAorQ09ORklHX0NSWVBUT19ERVM9eQorIyBDT05GSUdfQ1JZUFRPX0ZDUllQVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQkxPV0ZJU0ggaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RXT0ZJU0ggaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NFUlBFTlQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0FFUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ0FTVDUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NBU1Q2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19URUEgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0FSQzQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0tIQVpBRCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQU5VQklTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19ERUZMQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19NSUNIQUVMX01JQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ1JDMzJDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQU1FTExJQSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEVTVCBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgY3J5cHRvIGRldmljZXMKKyMKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzL21wYzg1NDRfZHNfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvbXBjODU0NF9kc19kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU2MzUxMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL21wYzg1NDRfZHNfZGVmY29uZmlnCkBAIC0wLDAgKzEsMTA3NyBAQAorIworIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjIxLXJjMworIyBNb24gTWFyIDE5IDE3OjE4OjQ5IDIwMDcKKyMKKyMgQ09ORklHX1BQQzY0IGlzIG5vdCBzZXQKK0NPTkZJR19QUEMzMj15CitDT05GSUdfUFBDX01FUkdFPXkKK0NPTkZJR19NTVU9eQorQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQorQ09ORklHX0lSUV9QRVJfQ1BVPXkKK0NPTkZJR19SV1NFTV9YQ0hHQUREX0FMR09SSVRITT15CitDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTMyPXkKK0NPTkZJR19HRU5FUklDX0hXRUlHSFQ9eQorQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKK0NPTkZJR19HRU5FUklDX0ZJTkRfTkVYVF9CSVQ9eQorQ09ORklHX1BQQz15CitDT05GSUdfRUFSTFlfUFJJTlRLPXkKK0NPTkZJR19HRU5FUklDX05WUkFNPXkKK0NPTkZJR19TQ0hFRF9OT19OT19PTUlUX0ZSQU1FX1BPSU5URVI9eQorQ09ORklHX0FSQ0hfTUFZX0hBVkVfUENfRkRDPXkKK0NPTkZJR19QUENfT0Y9eQorQ09ORklHX1BQQ19VREJHXzE2NTUwPXkKKyMgQ09ORklHX0dFTkVSSUNfVEJTWU5DIGlzIG5vdCBzZXQKK0NPTkZJR19BVURJVF9BUkNIPXkKK0NPTkZJR19HRU5FUklDX0JVRz15CitDT05GSUdfREVGQVVMVF9VSU1BR0U9eQorCisjCisjIFByb2Nlc3NvciBzdXBwb3J0CisjCisjIENPTkZJR19DTEFTU0lDMzIgaXMgbm90IHNldAorIyBDT05GSUdfUFBDXzgyeHggaXMgbm90IHNldAorIyBDT05GSUdfUFBDXzgzeHggaXMgbm90IHNldAorQ09ORklHX1BQQ184NXh4PXkKKyMgQ09ORklHX1BQQ184Nnh4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ184eHggaXMgbm90IHNldAorIyBDT05GSUdfNDB4IGlzIG5vdCBzZXQKKyMgQ09ORklHXzQ0eCBpcyBub3Qgc2V0CisjIENPTkZJR19FMjAwIGlzIG5vdCBzZXQKK0NPTkZJR184NXh4PXkKK0NPTkZJR19FNTAwPXkKKyMgQ09ORklHX1BQQ19EQ1JfTkFUSVZFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19EQ1JfTU1JTyBpcyBub3Qgc2V0CitDT05GSUdfQk9PS0U9eQorQ09ORklHX0ZTTF9CT09LRT15CisjIENPTkZJR19QSFlTXzY0QklUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQRSBpcyBub3Qgc2V0CitDT05GSUdfREVGQ09ORklHX0xJU1Q9Ii9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgorCisjCisjIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucworIworQ09ORklHX0VYUEVSSU1FTlRBTD15CitDT05GSUdfQlJPS0VOX09OX1NNUD15CitDT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCisKKyMKKyMgR2VuZXJhbCBzZXR1cAorIworQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgorQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPPXkKK0NPTkZJR19TV0FQPXkKK0NPTkZJR19TWVNWSVBDPXkKK0NPTkZJR19JUENfTlM9eQorQ09ORklHX1NZU1ZJUENfU1lTQ1RMPXkKK0NPTkZJR19QT1NJWF9NUVVFVUU9eQorQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1Q9eQorIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVF9WMyBpcyBub3Qgc2V0CisjIENPTkZJR19UQVNLU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfVVRTX05TIGlzIG5vdCBzZXQKK0NPTkZJR19BVURJVD15CisjIENPTkZJR19BVURJVFNZU0NBTEwgaXMgbm90IHNldAorQ09ORklHX0lLQ09ORklHPXkKK0NPTkZJR19JS0NPTkZJR19QUk9DPXkKK0NPTkZJR19TWVNGU19ERVBSRUNBVEVEPXkKKyMgQ09ORklHX1JFTEFZIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0lOSVRSRD15CitDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgorIyBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkUgaXMgbm90IHNldAorQ09ORklHX1NZU0NUTD15CitDT05GSUdfRU1CRURERUQ9eQorQ09ORklHX1NZU0NUTF9TWVNDQUxMPXkKK0NPTkZJR19LQUxMU1lNUz15CitDT05GSUdfS0FMTFNZTVNfQUxMPXkKKyMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAorIyBDT05GSUdfSE9UUExVRyBpcyBub3Qgc2V0CitDT05GSUdfUFJJTlRLPXkKK0NPTkZJR19CVUc9eQorQ09ORklHX0VMRl9DT1JFPXkKK0NPTkZJR19CQVNFX0ZVTEw9eQorQ09ORklHX0ZVVEVYPXkKK0NPTkZJR19FUE9MTD15CitDT05GSUdfU0hNRU09eQorQ09ORklHX1NMQUI9eQorQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKK0NPTkZJR19SVF9NVVRFWEVTPXkKKyMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAorQ09ORklHX0JBU0VfU01BTEw9MAorIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CisKKyMKKyMgTG9hZGFibGUgbW9kdWxlIHN1cHBvcnQKKyMKK0NPTkZJR19NT0RVTEVTPXkKK0NPTkZJR19NT0RVTEVfVU5MT0FEPXkKK0NPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEPXkKK0NPTkZJR19NT0RWRVJTSU9OUz15CisjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAorQ09ORklHX0tNT0Q9eQorCisjCisjIEJsb2NrIGxheWVyCisjCitDT05GSUdfQkxPQ0s9eQorQ09ORklHX0xCRD15CisjIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xTRiBpcyBub3Qgc2V0CisKKyMKKyMgSU8gU2NoZWR1bGVycworIworQ09ORklHX0lPU0NIRURfTk9PUD15CitDT05GSUdfSU9TQ0hFRF9BUz15CitDT05GSUdfSU9TQ0hFRF9ERUFETElORT15CitDT05GSUdfSU9TQ0hFRF9DRlE9eQorIyBDT05GSUdfREVGQVVMVF9BUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX0RFQURMSU5FIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX0NGUT15CisjIENPTkZJR19ERUZBVUxUX05PT1AgaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfSU9TQ0hFRD0iY2ZxIgorIyBDT05GSUdfV0FOVF9FQVJMWV9TRVJJQUwgaXMgbm90IHNldAorCisjCisjIFBsYXRmb3JtIHN1cHBvcnQKKyMKKyMgQ09ORklHX01QQzg1NDBfQURTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01QQzg1NjBfQURTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01QQzg1eHhfQ0RTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01QQzg1eHhfTURTIGlzIG5vdCBzZXQKK0NPTkZJR19NUEM4NTQ0X0RTPXkKK0NPTkZJR19NUEM4NXh4PXkKK0NPTkZJR19QUENfSU5ESVJFQ1RfUENJX0JFPXkKK0NPTkZJR19NUElDPXkKKworIworIyBLZXJuZWwgb3B0aW9ucworIworQ09ORklHX0hJR0hNRU09eQorIyBDT05GSUdfSFpfMTAwIGlzIG5vdCBzZXQKK0NPTkZJR19IWl8yNTA9eQorIyBDT05GSUdfSFpfMzAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0haXzEwMDAgaXMgbm90IHNldAorQ09ORklHX0haPTI1MAorQ09ORklHX1BSRUVNUFRfTk9ORT15CisjIENPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWSBpcyBub3Qgc2V0CisjIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKK0NPTkZJR19CSU5GTVRfRUxGPXkKK0NPTkZJR19CSU5GTVRfTUlTQz1tCitDT05GSUdfTUFUSF9FTVVMQVRJT049eQorQ09ORklHX0FSQ0hfRU5BQkxFX01FTU9SWV9IT1RQTFVHPXkKK0NPTkZJR19BUkNIX0ZMQVRNRU1fRU5BQkxFPXkKK0NPTkZJR19BUkNIX1BPUFVMQVRFU19OT0RFX01BUD15CitDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CitDT05GSUdfRkxBVE1FTV9NQU5VQUw9eQorIyBDT05GSUdfRElTQ09OVElHTUVNX01BTlVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19TUEFSU0VNRU1fTUFOVUFMIGlzIG5vdCBzZXQKK0NPTkZJR19GTEFUTUVNPXkKK0NPTkZJR19GTEFUX05PREVfTUVNX01BUD15CisjIENPTkZJR19TUEFSU0VNRU1fU1RBVElDIGlzIG5vdCBzZXQKK0NPTkZJR19TUExJVF9QVExPQ0tfQ1BVUz00CisjIENPTkZJR19SRVNPVVJDRVNfNjRCSVQgaXMgbm90IHNldAorQ09ORklHX1pPTkVfRE1BX0ZMQUc9MQorQ09ORklHX1BST0NfREVWSUNFVFJFRT15CitDT05GSUdfQ01ETElORV9CT09MPXkKK0NPTkZJR19DTURMSU5FPSJyb290PS9kZXYvc2RhMyBydyBjb25zb2xlPXR0eVMwLDExNTIwMCIKKyMgQ09ORklHX1BNIGlzIG5vdCBzZXQKK0NPTkZJR19TRUNDT01QPXkKK0NPTkZJR19JU0FfRE1BX0FQST15CisKKyMKKyMgQnVzIG9wdGlvbnMKKyMKK0NPTkZJR19aT05FX0RNQT15CisjIENPTkZJR19NUElDX1dFSVJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19JODI1OSBpcyBub3Qgc2V0CitDT05GSUdfUFBDX0lORElSRUNUX1BDST15CitDT05GSUdfRlNMX1NPQz15CisjIENPTkZJR19QQ0kgaXMgbm90IHNldAorIyBDT05GSUdfUENJX0RPTUFJTlMgaXMgbm90IHNldAorCisjCisjIFBDQ0FSRCAoUENNQ0lBL0NhcmRCdXMpIHN1cHBvcnQKKyMKKworIworIyBQQ0kgSG90cGx1ZyBTdXBwb3J0CisjCisKKyMKKyMgQWR2YW5jZWQgc2V0dXAKKyMKKyMgQ09ORklHX0FEVkFOQ0VEX09QVElPTlMgaXMgbm90IHNldAorCisjCisjIERlZmF1bHQgc2V0dGluZ3MgZm9yIGFkdmFuY2VkIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhcmUgdXNlZAorIworQ09ORklHX0hJR0hNRU1fU1RBUlQ9MHhmZTAwMDAwMAorQ09ORklHX0xPV01FTV9TSVpFPTB4MzAwMDAwMDAKK0NPTkZJR19LRVJORUxfU1RBUlQ9MHhjMDAwMDAwMAorQ09ORklHX1RBU0tfU0laRT0weDgwMDAwMDAwCitDT05GSUdfQk9PVF9MT0FEPTB4MDA4MDAwMDAKKworIworIyBOZXR3b3JraW5nCisjCitDT05GSUdfTkVUPXkKKworIworIyBOZXR3b3JraW5nIG9wdGlvbnMKKyMKKyMgQ09ORklHX05FVERFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19QQUNLRVQ9eQorIyBDT05GSUdfUEFDS0VUX01NQVAgaXMgbm90IHNldAorQ09ORklHX1VOSVg9eQorQ09ORklHX1hGUk09eQorQ09ORklHX1hGUk1fVVNFUj1tCisjIENPTkZJR19YRlJNX1NVQl9QT0xJQ1kgaXMgbm90IHNldAorIyBDT05GSUdfWEZSTV9NSUdSQVRFIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRfS0VZPW0KKyMgQ09ORklHX05FVF9LRVlfTUlHUkFURSBpcyBub3Qgc2V0CitDT05GSUdfSU5FVD15CitDT05GSUdfSVBfTVVMVElDQVNUPXkKK0NPTkZJR19JUF9BRFZBTkNFRF9ST1VURVI9eQorQ09ORklHX0FTS19JUF9GSUJfSEFTSD15CisjIENPTkZJR19JUF9GSUJfVFJJRSBpcyBub3Qgc2V0CitDT05GSUdfSVBfRklCX0hBU0g9eQorQ09ORklHX0lQX01VTFRJUExFX1RBQkxFUz15CitDT05GSUdfSVBfUk9VVEVfTVVMVElQQVRIPXkKKyMgQ09ORklHX0lQX1JPVVRFX01VTFRJUEFUSF9DQUNIRUQgaXMgbm90IHNldAorQ09ORklHX0lQX1JPVVRFX1ZFUkJPU0U9eQorQ09ORklHX0lQX1BOUD15CitDT05GSUdfSVBfUE5QX0RIQ1A9eQorQ09ORklHX0lQX1BOUF9CT09UUD15CitDT05GSUdfSVBfUE5QX1JBUlA9eQorQ09ORklHX05FVF9JUElQPXkKK0NPTkZJR19ORVRfSVBHUkU9eQorQ09ORklHX05FVF9JUEdSRV9CUk9BRENBU1Q9eQorQ09ORklHX0lQX01ST1VURT15CitDT05GSUdfSVBfUElNU01fVjE9eQorQ09ORklHX0lQX1BJTVNNX1YyPXkKK0NPTkZJR19BUlBEPXkKKyMgQ09ORklHX1NZTl9DT09LSUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfQUggaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9FU1AgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9JUENPTVAgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9YRlJNX1RVTk5FTCBpcyBub3Qgc2V0CitDT05GSUdfSU5FVF9UVU5ORUw9eQorIyBDT05GSUdfSU5FVF9YRlJNX01PREVfVFJBTlNQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfWEZSTV9NT0RFX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1hGUk1fTU9ERV9CRUVUIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUX0RJQUc9eQorQ09ORklHX0lORVRfVENQX0RJQUc9eQorIyBDT05GSUdfVENQX0NPTkdfQURWQU5DRUQgaXMgbm90IHNldAorQ09ORklHX1RDUF9DT05HX0NVQklDPXkKK0NPTkZJR19ERUZBVUxUX1RDUF9DT05HPSJjdWJpYyIKKyMgQ09ORklHX1RDUF9NRDVTSUcgaXMgbm90IHNldAorIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUNl9YRlJNX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUNl9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUV09SS19TRUNNQVJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CisKKyMKKyMgRENDUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19JUF9EQ0NQIGlzIG5vdCBzZXQKKworIworIyBTQ1RQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKKyMKK0NPTkZJR19JUF9TQ1RQPW0KKyMgQ09ORklHX1NDVFBfREJHX01TRyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1RQX0RCR19PQkpDTlQgaXMgbm90IHNldAorIyBDT05GSUdfU0NUUF9ITUFDX05PTkUgaXMgbm90IHNldAorIyBDT05GSUdfU0NUUF9ITUFDX1NIQTEgaXMgbm90IHNldAorQ09ORklHX1NDVFBfSE1BQ19NRDU9eQorCisjCisjIFRJUEMgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQorIworIyBDT05GSUdfVElQQyBpcyBub3Qgc2V0CisjIENPTkZJR19BVE0gaXMgbm90IHNldAorIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZMQU5fODAyMVEgaXMgbm90IHNldAorIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xMQzIgaXMgbm90IHNldAorIyBDT05GSUdfSVBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQUxLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1gyNSBpcyBub3Qgc2V0CisjIENPTkZJR19MQVBCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKKworIworIyBRb1MgYW5kL29yIGZhaXIgcXVldWVpbmcKKyMKKyMgQ09ORklHX05FVF9TQ0hFRCBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayB0ZXN0aW5nCisjCisjIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSREEgaXMgbm90IHNldAorIyBDT05GSUdfQlQgaXMgbm90IHNldAorIyBDT05GSUdfSUVFRTgwMjExIGlzIG5vdCBzZXQKK0NPTkZJR19GSUJfUlVMRVM9eQorCisjCisjIERldmljZSBEcml2ZXJzCisjCisKKyMKKyMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucworIworQ09ORklHX1NUQU5EQUxPTkU9eQorQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQorIyBDT05GSUdfREVCVUdfRFJJVkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0RFVlJFUyBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNfSFlQRVJWSVNPUiBpcyBub3Qgc2V0CisKKyMKKyMgQ29ubmVjdG9yIC0gdW5pZmllZCB1c2Vyc3BhY2UgPC0+IGtlcm5lbHNwYWNlIGxpbmtlcgorIworIyBDT05GSUdfQ09OTkVDVE9SIGlzIG5vdCBzZXQKKworIworIyBNZW1vcnkgVGVjaG5vbG9neSBEZXZpY2VzIChNVEQpCisjCisjIENPTkZJR19NVEQgaXMgbm90IHNldAorCisjCisjIFBhcmFsbGVsIHBvcnQgc3VwcG9ydAorIworIyBDT05GSUdfUEFSUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgUGx1ZyBhbmQgUGxheSBzdXBwb3J0CisjCisjIENPTkZJR19QTlBBQ1BJIGlzIG5vdCBzZXQKKworIworIyBCbG9jayBkZXZpY2VzCisjCisjIENPTkZJR19CTEtfREVWX0ZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQ09XX0NPTU1PTiBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9MT09QPXkKKyMgQ09ORklHX0JMS19ERVZfQ1JZUFRPTE9PUCBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9OQkQ9eQorQ09ORklHX0JMS19ERVZfUkFNPXkKK0NPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0yCitDT05GSUdfQkxLX0RFVl9SQU1fU0laRT0xNjM4NAorQ09ORklHX0JMS19ERVZfUkFNX0JMT0NLU0laRT0xMDI0CisjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CisKKyMKKyMgTWlzYyBkZXZpY2VzCisjCisKKyMKKyMgQVRBL0FUQVBJL01GTS9STEwgc3VwcG9ydAorIworIyBDT05GSUdfSURFIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19SQUlEX0FUVFJTIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJPXkKKyMgQ09ORklHX1NDU0lfVEdUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTkVUTElOSyBpcyBub3Qgc2V0CitDT05GSUdfU0NTSV9QUk9DX0ZTPXkKKworIworIyBTQ1NJIHN1cHBvcnQgdHlwZSAoZGlzaywgdGFwZSwgQ0QtUk9NKQorIworQ09ORklHX0JMS19ERVZfU0Q9eQorQ09ORklHX0NIUl9ERVZfU1Q9eQorIyBDT05GSUdfQ0hSX0RFVl9PU1NUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfU1IgaXMgbm90IHNldAorQ09ORklHX0NIUl9ERVZfU0c9eQorIyBDT05GSUdfQ0hSX0RFVl9TQ0ggaXMgbm90IHNldAorCisjCisjIFNvbWUgU0NTSSBkZXZpY2VzIChlLmcuIENEIGp1a2Vib3gpIHN1cHBvcnQgbXVsdGlwbGUgTFVOcworIworQ09ORklHX1NDU0lfTVVMVElfTFVOPXkKKyMgQ09ORklHX1NDU0lfQ09OU1RBTlRTIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJX0xPR0dJTkc9eQorIyBDT05GSUdfU0NTSV9TQ0FOX0FTWU5DIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIFRyYW5zcG9ydHMKKyMKKyMgQ09ORklHX1NDU0lfU1BJX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfRkNfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JU0NTSV9BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NBU19BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NBU19MSUJTQVMgaXMgbm90IHNldAorCisjCisjIFNDU0kgbG93LWxldmVsIGRyaXZlcnMKKyMKKyMgQ09ORklHX0lTQ1NJX1RDUCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RFQlVHIGlzIG5vdCBzZXQKKworIworIyBTZXJpYWwgQVRBIChwcm9kKSBhbmQgUGFyYWxsZWwgQVRBIChleHBlcmltZW50YWwpIGRyaXZlcnMKKyMKK0NPTkZJR19BVEE9eQorIyBDT05GSUdfQVRBX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfUExBVEZPUk0gaXMgbm90IHNldAorCisjCisjIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCisjCisjIENPTkZJR19NRCBpcyBub3Qgc2V0CisKKyMKKyMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfRlVTSU9OIGlzIG5vdCBzZXQKKworIworIyBJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0CisjCisKKyMKKyMgSTJPIGRldmljZSBzdXBwb3J0CisjCisKKyMKKyMgTWFjaW50b3NoIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19NQUNfRU1VTU9VU0VCVE4gaXMgbm90IHNldAorIyBDT05GSUdfV0lOREZBUk0gaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19ORVRERVZJQ0VTPXkKKyMgQ09ORklHX0RVTU1ZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAorIyBDT05GSUdfRVFVQUxJWkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RVTiBpcyBub3Qgc2V0CisKKyMKKyMgUEhZIGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfUEhZTElCPXkKKworIworIyBNSUkgUEhZIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19NQVJWRUxMX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19EQVZJQ09NX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19RU0VNSV9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfTFhUX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19DSUNBREFfUEhZIGlzIG5vdCBzZXQKK0NPTkZJR19WSVRFU1NFX1BIWT15CisjIENPTkZJR19TTVNDX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19CUk9BRENPTV9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfRklYRURfUEhZIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAgb3IgMTAwTWJpdCkKKyMKK0NPTkZJR19ORVRfRVRIRVJORVQ9eQorQ09ORklHX01JST15CisKKyMKKyMgRXRoZXJuZXQgKDEwMDAgTWJpdCkKKyMKK0NPTkZJR19HSUFORkFSPXkKK0NPTkZJR19HRkFSX05BUEk9eQorCisjCisjIEV0aGVybmV0ICgxMDAwMCBNYml0KQorIworCisjCisjIFRva2VuIFJpbmcgZGV2aWNlcworIworCisjCisjIFdpcmVsZXNzIExBTiAobm9uLWhhbXJhZGlvKQorIworIyBDT05GSUdfTkVUX1JBRElPIGlzIG5vdCBzZXQKKworIworIyBXYW4gaW50ZXJmYWNlcworIworIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQUCBpcyBub3Qgc2V0CisjIENPTkZJR19TTElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIQVBFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRDT05TT0xFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0CisKKyMKKyMgSVNETiBzdWJzeXN0ZW0KKyMKKyMgQ09ORklHX0lTRE4gaXMgbm90IHNldAorCisjCisjIFRlbGVwaG9ueSBTdXBwb3J0CisjCisjIENPTkZJR19QSE9ORSBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19JTlBVVD15CisjIENPTkZJR19JTlBVVF9GRl9NRU1MRVNTIGlzIG5vdCBzZXQKKworIworIyBVc2VybGFuZCBpbnRlcmZhY2VzCisjCisjIENPTkZJR19JTlBVVF9NT1VTRURFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9KT1lERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVFNERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfRVZERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfRVZCVUcgaXMgbm90IHNldAorCisjCisjIElucHV0IERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19JTlBVVF9LRVlCT0FSRCBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NT1VTRSBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UT1VDSFNDUkVFTiBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NSVNDIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBJL08gcG9ydHMKKyMKK0NPTkZJR19TRVJJTz15CitDT05GSUdfU0VSSU9fSTgwNDI9eQorQ09ORklHX1NFUklPX1NFUlBPUlQ9eQorQ09ORklHX1NFUklPX0xJQlBTMj15CisjIENPTkZJR19TRVJJT19SQVcgaXMgbm90IHNldAorIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAorCisjCisjIENoYXJhY3RlciBkZXZpY2VzCisjCitDT05GSUdfVlQ9eQorQ09ORklHX1ZUX0NPTlNPTEU9eQorQ09ORklHX0hXX0NPTlNPTEU9eQorIyBDT05GSUdfVlRfSFdfQ09OU09MRV9CSU5ESU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CisKKyMKKyMgU2VyaWFsIGRyaXZlcnMKKyMKK0NPTkZJR19TRVJJQUxfODI1MD15CitDT05GSUdfU0VSSUFMXzgyNTBfQ09OU09MRT15CitDT05GSUdfU0VSSUFMXzgyNTBfTlJfVUFSVFM9NAorQ09ORklHX1NFUklBTF84MjUwX1JVTlRJTUVfVUFSVFM9NAorIyBDT05GSUdfU0VSSUFMXzgyNTBfRVhURU5ERUQgaXMgbm90IHNldAorCisjCisjIE5vbi04MjUwIHNlcmlhbCBwb3J0IHN1cHBvcnQKKyMKKyMgQ09ORklHX1NFUklBTF9VQVJUTElURSBpcyBub3Qgc2V0CitDT05GSUdfU0VSSUFMX0NPUkU9eQorQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQorIyBDT05GSUdfU0VSSUFMX09GX1BMQVRGT1JNIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYOThfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWVM9eQorQ09ORklHX0xFR0FDWV9QVFlfQ09VTlQ9MjU2CisKKyMKKyMgSVBNSQorIworIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKKworIworIyBXYXRjaGRvZyBDYXJkcworIworIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAorIyBDT05GSUdfSFdfUkFORE9NIGlzIG5vdCBzZXQKK0NPTkZJR19OVlJBTT15CitDT05GSUdfR0VOX1JUQz15CitDT05GSUdfR0VOX1JUQ19YPXkKKyMgQ09ORklHX0RUTEsgaXMgbm90IHNldAorIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAorIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0CisKKyMKKyMgVFBNIGRldmljZXMKKyMKKyMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAorCisjCisjIEkyQyBzdXBwb3J0CisjCisjIENPTkZJR19JMkMgaXMgbm90IHNldAorCisjCisjIFNQSSBzdXBwb3J0CisjCisjIENPTkZJR19TUEkgaXMgbm90IHNldAorIyBDT05GSUdfU1BJX01BU1RFUiBpcyBub3Qgc2V0CisKKyMKKyMgRGFsbGFzJ3MgMS13aXJlIGJ1cworIworIyBDT05GSUdfVzEgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIE1vbml0b3Jpbmcgc3VwcG9ydAorIworIyBDT05GSUdfSFdNT04gaXMgbm90IHNldAorIyBDT05GSUdfSFdNT05fVklEIGlzIG5vdCBzZXQKKworIworIyBNdWx0aWZ1bmN0aW9uIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19NRkRfU001MDEgaXMgbm90IHNldAorCisjCisjIE11bHRpbWVkaWEgZGV2aWNlcworIworIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKKworIworIyBEaWdpdGFsIFZpZGVvIEJyb2FkY2FzdGluZyBEZXZpY2VzCisjCitDT05GSUdfRFZCPXkKK0NPTkZJR19EVkJfQ09SRT1tCisjIENPTkZJR19EVkJfQ09SRV9BVFRBQ0ggaXMgbm90IHNldAorCisjCisjIFN1cHBvcnRlZCBEVkIgRnJvbnRlbmRzCisjCisKKyMKKyMgQ3VzdG9taXNlIERWQiBGcm9udGVuZHMKKyMKKyMgQ09ORklHX0RWQl9GRV9DVVNUT01JU0UgaXMgbm90IHNldAorCisjCisjIERWQi1TIChzYXRlbGxpdGUpIGZyb250ZW5kcworIworCisjCisjIERWQi1UICh0ZXJyZXN0cmlhbCkgZnJvbnRlbmRzCisjCisKKyMKKyMgRFZCLUMgKGNhYmxlKSBmcm9udGVuZHMKKyMKKworIworIyBBVFNDIChOb3J0aCBBbWVyaWNhbi9Lb3JlYW4gVGVycmVzdHJpYWwvQ2FibGUgRFRWKSBmcm9udGVuZHMKKyMKKworIworIyBUdW5lcnMvUExMIHN1cHBvcnQKKyMKKworIworIyBNaXNjZWxsYW5lb3VzIGRldmljZXMKKyMKKworIworIyBHcmFwaGljcyBzdXBwb3J0CisjCisjIENPTkZJR19CQUNLTElHSFRfTENEX1NVUFBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfRkIgaXMgbm90IHNldAorIyBDT05GSUdfRkJfSUJNX0dYVDQ1MDAgaXMgbm90IHNldAorCisjCisjIENvbnNvbGUgZGlzcGxheSBkcml2ZXIgc3VwcG9ydAorIworIyBDT05GSUdfVkdBX0NPTlNPTEUgaXMgbm90IHNldAorQ09ORklHX0RVTU1ZX0NPTlNPTEU9eQorCisjCisjIFNvdW5kCisjCisjIENPTkZJR19TT1VORCBpcyBub3Qgc2V0CisKKyMKKyMgSElEIERldmljZXMKKyMKK0NPTkZJR19ISUQ9eQorIyBDT05GSUdfSElEX0RFQlVHIGlzIG5vdCBzZXQKKworIworIyBVU0Igc3VwcG9ydAorIworIyBDT05GSUdfVVNCX0FSQ0hfSEFTX0hDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQVJDSF9IQVNfT0hDSSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQVJDSF9IQVNfRUhDSSBpcyBub3Qgc2V0CisKKyMKKyMgTk9URTogVVNCX1NUT1JBR0UgZW5hYmxlcyBTQ1NJLCBhbmQgJ1NDU0kgZGlzayBzdXBwb3J0JworIworCisjCisjIFVTQiBHYWRnZXQgU3VwcG9ydAorIworIyBDT05GSUdfVVNCX0dBREdFVCBpcyBub3Qgc2V0CisKKyMKKyMgTU1DL1NEIENhcmQgc3VwcG9ydAorIworIyBDT05GSUdfTU1DIGlzIG5vdCBzZXQKKworIworIyBMRUQgZGV2aWNlcworIworIyBDT05GSUdfTkVXX0xFRFMgaXMgbm90IHNldAorCisjCisjIExFRCBkcml2ZXJzCisjCisKKyMKKyMgTEVEIFRyaWdnZXJzCisjCisKKyMKKyMgSW5maW5pQmFuZCBzdXBwb3J0CisjCisKKyMKKyMgRURBQyAtIGVycm9yIGRldGVjdGlvbiBhbmQgcmVwb3J0aW5nIChSQVMpIChFWFBFUklNRU5UQUwpCisjCisKKyMKKyMgUmVhbCBUaW1lIENsb2NrCisjCitDT05GSUdfUlRDX0xJQj15CitDT05GSUdfUlRDX0NMQVNTPXkKK0NPTkZJR19SVENfSENUT1NZUz15CitDT05GSUdfUlRDX0hDVE9TWVNfREVWSUNFPSJydGMwIgorIyBDT05GSUdfUlRDX0RFQlVHIGlzIG5vdCBzZXQKKworIworIyBSVEMgaW50ZXJmYWNlcworIworQ09ORklHX1JUQ19JTlRGX1NZU0ZTPXkKK0NPTkZJR19SVENfSU5URl9QUk9DPXkKK0NPTkZJR19SVENfSU5URl9ERVY9eQorIyBDT05GSUdfUlRDX0lOVEZfREVWX1VJRV9FTVVMIGlzIG5vdCBzZXQKKworIworIyBSVEMgZHJpdmVycworIworIyBDT05GSUdfUlRDX0RSVl9EUzE1NTMgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzE3NDIgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NNDhUODYgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9URVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfVjMwMjAgaXMgbm90IHNldAorCisjCisjIERNQSBFbmdpbmUgc3VwcG9ydAorIworIyBDT05GSUdfRE1BX0VOR0lORSBpcyBub3Qgc2V0CisKKyMKKyMgRE1BIENsaWVudHMKKyMKKworIworIyBETUEgRGV2aWNlcworIworCisjCisjIEF1eGlsaWFyeSBEaXNwbGF5IHN1cHBvcnQKKyMKKworIworIyBWaXJ0dWFsaXphdGlvbgorIworCisjCisjIEZpbGUgc3lzdGVtcworIworQ09ORklHX0VYVDJfRlM9eQorIyBDT05GSUdfRVhUMl9GU19YQVRUUiBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQyX0ZTX1hJUCBpcyBub3Qgc2V0CitDT05GSUdfRVhUM19GUz15CitDT05GSUdfRVhUM19GU19YQVRUUj15CisjIENPTkZJR19FWFQzX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQzX0ZTX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDRERVZfRlMgaXMgbm90IHNldAorQ09ORklHX0pCRD15CisjIENPTkZJR19KQkRfREVCVUcgaXMgbm90IHNldAorQ09ORklHX0ZTX01CQ0FDSEU9eQorIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CisjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfR0ZTMl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19PQ0ZTMl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CitDT05GSUdfSU5PVElGWT15CitDT05GSUdfSU5PVElGWV9VU0VSPXkKKyMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKK0NPTkZJR19ETk9USUZZPXkKKyMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BVVRPRlM0X0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0VfRlMgaXMgbm90IHNldAorCisjCisjIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKKyMKK0NPTkZJR19JU085NjYwX0ZTPW0KK0NPTkZJR19KT0xJRVQ9eQorQ09ORklHX1pJU09GUz15CitDT05GSUdfVURGX0ZTPW0KK0NPTkZJR19VREZfTkxTPXkKKworIworIyBET1MvRkFUL05UIEZpbGVzeXN0ZW1zCisjCitDT05GSUdfRkFUX0ZTPXkKK0NPTkZJR19NU0RPU19GUz1tCitDT05GSUdfVkZBVF9GUz15CitDT05GSUdfRkFUX0RFRkFVTFRfQ09ERVBBR0U9NDM3CitDT05GSUdfRkFUX0RFRkFVTFRfSU9DSEFSU0VUPSJpc284ODU5LTEiCitDT05GSUdfTlRGU19GUz15CisjIENPTkZJR19OVEZTX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX05URlNfUlcgaXMgbm90IHNldAorCisjCisjIFBzZXVkbyBmaWxlc3lzdGVtcworIworQ09ORklHX1BST0NfRlM9eQorQ09ORklHX1BST0NfS0NPUkU9eQorQ09ORklHX1BST0NfU1lTQ1RMPXkKK0NPTkZJR19TWVNGUz15CitDT05GSUdfVE1QRlM9eQorIyBDT05GSUdfVE1QRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVR0VUTEJfUEFHRSBpcyBub3Qgc2V0CitDT05GSUdfUkFNRlM9eQorIyBDT05GSUdfQ09ORklHRlNfRlMgaXMgbm90IHNldAorCisjCisjIE1pc2NlbGxhbmVvdXMgZmlsZXN5c3RlbXMKKyMKK0NPTkZJR19BREZTX0ZTPW0KKyMgQ09ORklHX0FERlNfRlNfUlcgaXMgbm90IHNldAorQ09ORklHX0FGRlNfRlM9bQorQ09ORklHX0hGU19GUz1tCitDT05GSUdfSEZTUExVU19GUz1tCitDT05GSUdfQkVGU19GUz1tCisjIENPTkZJR19CRUZTX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19CRlNfRlM9bQorQ09ORklHX0VGU19GUz1tCitDT05GSUdfQ1JBTUZTPXkKK0NPTkZJR19WWEZTX0ZTPW0KK0NPTkZJR19IUEZTX0ZTPW0KK0NPTkZJR19RTlg0RlNfRlM9bQorQ09ORklHX1NZU1ZfRlM9bQorQ09ORklHX1VGU19GUz1tCisjIENPTkZJR19VRlNfRlNfV1JJVEUgaXMgbm90IHNldAorIyBDT05GSUdfVUZTX0RFQlVHIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIEZpbGUgU3lzdGVtcworIworQ09ORklHX05GU19GUz15CitDT05GSUdfTkZTX1YzPXkKKyMgQ09ORklHX05GU19WM19BQ0wgaXMgbm90IHNldAorQ09ORklHX05GU19WND15CisjIENPTkZJR19ORlNfRElSRUNUSU8gaXMgbm90IHNldAorIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0CitDT05GSUdfUk9PVF9ORlM9eQorQ09ORklHX0xPQ0tEPXkKK0NPTkZJR19MT0NLRF9WND15CitDT05GSUdfTkZTX0NPTU1PTj15CitDT05GSUdfU1VOUlBDPXkKK0NPTkZJR19TVU5SUENfR1NTPXkKK0NPTkZJR19SUENTRUNfR1NTX0tSQjU9eQorIyBDT05GSUdfUlBDU0VDX0dTU19TUEtNMyBpcyBub3Qgc2V0CisjIENPTkZJR19TTUJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ0lGUyBpcyBub3Qgc2V0CisjIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfOVBfRlMgaXMgbm90IHNldAorCisjCisjIFBhcnRpdGlvbiBUeXBlcworIworQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRD15CisjIENPTkZJR19BQ09STl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfT1NGX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19BTUlHQV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfQVRBUklfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ19QQVJUSVRJT04gaXMgbm90IHNldAorQ09ORklHX01TRE9TX1BBUlRJVElPTj15CisjIENPTkZJR19CU0RfRElTS0xBQkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JTklYX1NVQlBBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19TT0xBUklTX1g4Nl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfVU5JWFdBUkVfRElTS0xBQkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xETV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfU0dJX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19VTFRSSVhfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NVTl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfS0FSTUFfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VGSV9QQVJUSVRJT04gaXMgbm90IHNldAorCisjCisjIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CisjCitDT05GSUdfTkxTPXkKK0NPTkZJR19OTFNfREVGQVVMVD0iaXNvODg1OS0xIgorIyBDT05GSUdfTkxTX0NPREVQQUdFXzQzNyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfNzM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV83NzUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODUyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1NyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjEgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzkzNiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85MzIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzk0OSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzggaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzEyNTAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzEyNTEgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0FTQ0lJIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzEgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8zIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV82IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfOSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xMyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xNCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xNSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfS09JOF9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19LT0k4X1UgaXMgbm90IHNldAorQ09ORklHX05MU19VVEY4PW0KKworIworIyBEaXN0cmlidXRlZCBMb2NrIE1hbmFnZXIKKyMKKyMgQ09ORklHX0RMTSBpcyBub3Qgc2V0CisKKyMKKyMgTGlicmFyeSByb3V0aW5lcworIworQ09ORklHX0JJVFJFVkVSU0U9eQorIyBDT05GSUdfQ1JDX0NDSVRUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQzE2IGlzIG5vdCBzZXQKK0NPTkZJR19DUkMzMj15CitDT05GSUdfTElCQ1JDMzJDPW0KK0NPTkZJR19aTElCX0lORkxBVEU9eQorQ09ORklHX1BMSVNUPXkKK0NPTkZJR19IQVNfSU9NRU09eQorQ09ORklHX0hBU19JT1BPUlQ9eQorCisjCisjIEluc3RydW1lbnRhdGlvbiBTdXBwb3J0CisjCisjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBoYWNraW5nCisjCisjIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0CitDT05GSUdfRU5BQkxFX01VU1RfQ0hFQ0s9eQorIyBDT05GSUdfTUFHSUNfU1lTUlEgaXMgbm90IHNldAorIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfS0VSTkVMPXkKKyMgQ09ORklHX0RFQlVHX1NISVJRIGlzIG5vdCBzZXQKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE0CitDT05GSUdfREVURUNUX1NPRlRMT0NLVVA9eQorIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19USU1FUl9TVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TTEFCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1JUX01VVEVYRVMgaXMgbm90IHNldAorIyBDT05GSUdfUlRfTVVURVhfVEVTVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX01VVEVYRVMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1BJTkxPQ0tfU0xFRVAgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTE9DS0lOR19BUElfU0VMRlRFU1RTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0tPQkpFQ1QgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfSElHSE1FTSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19CVUdWRVJCT1NFIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19JTkZPPXkKKyMgQ09ORklHX0RFQlVHX1ZNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xJU1QgaXMgbm90IHNldAorQ09ORklHX0ZPUkNFRF9JTkxJTklORz15CisjIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZBVUxUX0lOSkVDVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TVEFDS09WRVJGTE9XIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NUQUNLX1VTQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHR0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JESV9TV0lUQ0ggaXMgbm90IHNldAorIyBDT05GSUdfQk9PVFhfVEVYVCBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfRUFSTFlfREVCVUcgaXMgbm90IHNldAorCisjCisjIFNlY3VyaXR5IG9wdGlvbnMKKyMKKyMgQ09ORklHX0tFWVMgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAorCisjCisjIENyeXB0b2dyYXBoaWMgb3B0aW9ucworIworQ09ORklHX0NSWVBUTz15CitDT05GSUdfQ1JZUFRPX0FMR0FQST15CitDT05GSUdfQ1JZUFRPX0JMS0NJUEhFUj15CitDT05GSUdfQ1JZUFRPX0hBU0g9eQorQ09ORklHX0NSWVBUT19NQU5BR0VSPXkKK0NPTkZJR19DUllQVE9fSE1BQz15CisjIENPTkZJR19DUllQVE9fWENCQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTlVMTCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTUQ0IGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fTUQ1PXkKKyMgQ09ORklHX0NSWVBUT19TSEExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TSEEyNTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTUxMiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fV1A1MTIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RHUjE5MiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fR0YxMjhNVUwgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0VDQiBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX0NCQz15CitDT05GSUdfQ1JZUFRPX1BDQkM9bQorIyBDT05GSUdfQ1JZUFRPX0xSVyBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX0RFUz15CisjIENPTkZJR19DUllQVE9fRkNSWVBUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19CTE9XRklTSCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVFdPRklTSCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VSUEVOVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQVNUNSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ0FTVDYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RFQSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQVJDNCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fS0hBWkFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BTlVCSVMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0RFRkxBVEUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01JQ0hBRUxfTUlDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DUkMzMkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NBTUVMTElBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19URVNUIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBjcnlwdG8gZGV2aWNlcworIwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvcHBjNjRfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvcHBjNjRfZGVmY29uZmlnCmluZGV4IGE4ZGEwYWUuLjEyNmI5ZjggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9jb25maWdzL3BwYzY0X2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9wcGM2NF9kZWZjb25maWcKQEAgLTE1Miw3ICsxNTIsNyBAQAogQ09ORklHX1JUQVNfUFJPQz15CiBDT05GSUdfUlRBU19GTEFTSD1tCiBDT05GSUdfTU1JT19OVlJBTT15Ci1DT05GSUdfTVBJQ19CUk9LRU5fVTM9eQorQ09ORklHX01QSUNfVTNfSFRfSVJRUz15CiBDT05GSUdfSUJNVklPPXkKICMgQ09ORklHX0lCTUVCVVMgaXMgbm90IHNldAogIyBDT05GSUdfUFBDX01QQzEwNiBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9NYWtlZmlsZQppbmRleCA4MTIwZDQyLi5lMGZhODBlYyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9NYWtlZmlsZQorKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL01ha2VmaWxlCkBAIC0yNSw4ICsyNSw4IEBACiBvYmotJChDT05GSUdfUFBDX09GKQkJKz0gb2ZfZGV2aWNlLm8gb2ZfcGxhdGZvcm0ubyBwcm9tX3BhcnNlLm8KIHByb2Nmcy0kKENPTkZJR19QUEM2NCkJCTo9IHByb2NfcHBjNjQubwogb2JqLSQoQ09ORklHX1BST0NfRlMpCQkrPSAkKHByb2Nmcy15KQotcnRhc3BjaS0kKENPTkZJR19QUEM2NCkJCTo9IHJ0YXNfcGNpLm8KLW9iai0kKENPTkZJR19QUENfUlRBUykJCSs9IHJ0YXMubyBydGFzLXJ0Yy5vICQocnRhc3BjaS15KQorcnRhc3BjaS0kKENPTkZJR19QUEM2NCktJChDT05GSUdfUENJKQk6PSBydGFzX3BjaS5vCitvYmotJChDT05GSUdfUFBDX1JUQVMpCQkrPSBydGFzLm8gcnRhcy1ydGMubyAkKHJ0YXNwY2kteS15KQogb2JqLSQoQ09ORklHX1JUQVNfRkxBU0gpCSs9IHJ0YXNfZmxhc2gubwogb2JqLSQoQ09ORklHX1JUQVNfUFJPQykJCSs9IHJ0YXMtcHJvYy5vCiBvYmotJChDT05GSUdfTFBBUkNGRykJCSs9IGxwYXJjZmcubwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9hbGlnbi5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9hbGlnbi5jCmluZGV4IDQ3MzRiNWQuLjVjOWZmN2YgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvYWxpZ24uYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2FsaWduLmMKQEAgLTI0MSw3ICsyNDEsNyBAQAogCWlmICh1c2VyX21vZGUocmVncykgJiYgIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHAsIHNpemUpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAlmb3IgKGkgPSAwOyBpIDwgc2l6ZSAvIHNpemVvZihsb25nKTsgKytpKQotCQlpZiAoX19wdXRfdXNlcigwLCBwK2kpKQorCQlpZiAoX19wdXRfdXNlcl9pbmF0b21pYygwLCBwK2kpKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJcmV0dXJuIDE7CiB9CkBAIC0yODgsNyArMjg4LDggQEAKIAkJfSBlbHNlIHsKIAkJCXVuc2lnbmVkIGxvbmcgcGMgPSByZWdzLT5uaXAgXiAoc3dpeiAmIDQpOwogCi0JCQlpZiAoX19nZXRfdXNlcihpbnN0ciwgKHVuc2lnbmVkIGludCBfX3VzZXIgKilwYykpCisJCQlpZiAoX19nZXRfdXNlcl9pbmF0b21pYyhpbnN0ciwKKwkJCQkJCSh1bnNpZ25lZCBpbnQgX191c2VyICopcGMpKQogCQkJCXJldHVybiAtRUZBVUxUOwogCQkJaWYgKHN3aXogPT0gMCAmJiAoZmxhZ3MgJiBTVykpCiAJCQkJaW5zdHIgPSBjcHVfdG9fbGUzMihpbnN0cik7CkBAIC0zMjQsMjcgKzMyNSwzMSBAQAogCQkJICAgICAgICgobmIwICsgMykgLyA0KSAqIHNpemVvZih1bnNpZ25lZCBsb25nKSk7CiAKIAkJZm9yIChpID0gMDsgaSA8IG5iOyArK2ksICsrcCkKLQkJCWlmIChfX2dldF91c2VyKFJFR19CWVRFKHJwdHIsIGkgXiBic3dpeiksIFNXSVpfUFRSKHApKSkKKwkJCWlmIChfX2dldF91c2VyX2luYXRvbWljKFJFR19CWVRFKHJwdHIsIGkgXiBic3dpeiksCisJCQkJCQlTV0laX1BUUihwKSkpCiAJCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCWlmIChuYjAgPiAwKSB7CiAJCQlycHRyID0gJnJlZ3MtPmdwclswXTsKIAkJCWFkZHIgKz0gbmI7CiAJCQlmb3IgKGkgPSAwOyBpIDwgbmIwOyArK2ksICsrcCkKLQkJCQlpZiAoX19nZXRfdXNlcihSRUdfQllURShycHRyLCBpIF4gYnN3aXopLAotCQkJCQkgICAgICAgU1dJWl9QVFIocCkpKQorCQkJCWlmIChfX2dldF91c2VyX2luYXRvbWljKFJFR19CWVRFKHJwdHIsCisJCQkJCQkJCSBpIF4gYnN3aXopLAorCQkJCQkJCVNXSVpfUFRSKHApKSkKIAkJCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCX0KIAogCX0gZWxzZSB7CiAJCWZvciAoaSA9IDA7IGkgPCBuYjsgKytpLCArK3ApCi0JCQlpZiAoX19wdXRfdXNlcihSRUdfQllURShycHRyLCBpIF4gYnN3aXopLCBTV0laX1BUUihwKSkpCisJCQlpZiAoX19wdXRfdXNlcl9pbmF0b21pYyhSRUdfQllURShycHRyLCBpIF4gYnN3aXopLAorCQkJCQkJU1dJWl9QVFIocCkpKQogCQkJCXJldHVybiAtRUZBVUxUOwogCQlpZiAobmIwID4gMCkgewogCQkJcnB0ciA9ICZyZWdzLT5ncHJbMF07CiAJCQlhZGRyICs9IG5iOwogCQkJZm9yIChpID0gMDsgaSA8IG5iMDsgKytpLCArK3ApCi0JCQkJaWYgKF9fcHV0X3VzZXIoUkVHX0JZVEUocnB0ciwgaSBeIGJzd2l6KSwKLQkJCQkJICAgICAgIFNXSVpfUFRSKHApKSkKKwkJCQlpZiAoX19wdXRfdXNlcl9pbmF0b21pYyhSRUdfQllURShycHRyLAorCQkJCQkJCQkgaSBeIGJzd2l6KSwKKwkJCQkJCQlTV0laX1BUUihwKSkpCiAJCQkJCXJldHVybiAtRUZBVUxUOwogCQl9CiAJfQpAQCAtMzk4LDcgKzQwMyw4IEBACiAKIAkJaWYgKGNwdV9oYXNfZmVhdHVyZShDUFVfRlRSX1BQQ19MRSkgJiYgKHJlZ3MtPm1zciAmIE1TUl9MRSkpCiAJCQlwYyBePSA0OwotCQlpZiAodW5saWtlbHkoX19nZXRfdXNlcihpbnN0ciwgKHVuc2lnbmVkIGludCBfX3VzZXIgKilwYykpKQorCQlpZiAodW5saWtlbHkoX19nZXRfdXNlcl9pbmF0b21pYyhpbnN0ciwKKwkJCQkJCSAodW5zaWduZWQgaW50IF9fdXNlciAqKXBjKSkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAkJaWYgKGNwdV9oYXNfZmVhdHVyZShDUFVfRlRSX1JFQUxfTEUpICYmIChyZWdzLT5tc3IgJiBNU1JfTEUpKQogCQkJaW5zdHIgPSBjcHVfdG9fbGUzMihpbnN0cik7CkBAIC00NzQsMTYgKzQ4MCwxNiBAQAogCQlwID0gKHVuc2lnbmVkIGxvbmcpIGFkZHI7CiAJCXN3aXRjaCAobmIpIHsKIAkJY2FzZSA4OgotCQkJcmV0IHw9IF9fZ2V0X3VzZXIoZGF0YS52WzBdLCBTV0laX1BUUihwKyspKTsKLQkJCXJldCB8PSBfX2dldF91c2VyKGRhdGEudlsxXSwgU1dJWl9QVFIocCsrKSk7Ci0JCQlyZXQgfD0gX19nZXRfdXNlcihkYXRhLnZbMl0sIFNXSVpfUFRSKHArKykpOwotCQkJcmV0IHw9IF9fZ2V0X3VzZXIoZGF0YS52WzNdLCBTV0laX1BUUihwKyspKTsKKwkJCXJldCB8PSBfX2dldF91c2VyX2luYXRvbWljKGRhdGEudlswXSwgU1dJWl9QVFIocCsrKSk7CisJCQlyZXQgfD0gX19nZXRfdXNlcl9pbmF0b21pYyhkYXRhLnZbMV0sIFNXSVpfUFRSKHArKykpOworCQkJcmV0IHw9IF9fZ2V0X3VzZXJfaW5hdG9taWMoZGF0YS52WzJdLCBTV0laX1BUUihwKyspKTsKKwkJCXJldCB8PSBfX2dldF91c2VyX2luYXRvbWljKGRhdGEudlszXSwgU1dJWl9QVFIocCsrKSk7CiAJCWNhc2UgNDoKLQkJCXJldCB8PSBfX2dldF91c2VyKGRhdGEudls0XSwgU1dJWl9QVFIocCsrKSk7Ci0JCQlyZXQgfD0gX19nZXRfdXNlcihkYXRhLnZbNV0sIFNXSVpfUFRSKHArKykpOworCQkJcmV0IHw9IF9fZ2V0X3VzZXJfaW5hdG9taWMoZGF0YS52WzRdLCBTV0laX1BUUihwKyspKTsKKwkJCXJldCB8PSBfX2dldF91c2VyX2luYXRvbWljKGRhdGEudls1XSwgU1dJWl9QVFIocCsrKSk7CiAJCWNhc2UgMjoKLQkJCXJldCB8PSBfX2dldF91c2VyKGRhdGEudls2XSwgU1dJWl9QVFIocCsrKSk7Ci0JCQlyZXQgfD0gX19nZXRfdXNlcihkYXRhLnZbN10sIFNXSVpfUFRSKHArKykpOworCQkJcmV0IHw9IF9fZ2V0X3VzZXJfaW5hdG9taWMoZGF0YS52WzZdLCBTV0laX1BUUihwKyspKTsKKwkJCXJldCB8PSBfX2dldF91c2VyX2luYXRvbWljKGRhdGEudls3XSwgU1dJWl9QVFIocCsrKSk7CiAJCQlpZiAodW5saWtlbHkocmV0KSkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKIAkJfQpAQCAtNTUxLDE2ICs1NTcsMTYgQEAKIAkJcCA9ICh1bnNpZ25lZCBsb25nKSBhZGRyOwogCQlzd2l0Y2ggKG5iKSB7CiAJCWNhc2UgODoKLQkJCXJldCB8PSBfX3B1dF91c2VyKGRhdGEudlswXSwgU1dJWl9QVFIocCsrKSk7Ci0JCQlyZXQgfD0gX19wdXRfdXNlcihkYXRhLnZbMV0sIFNXSVpfUFRSKHArKykpOwotCQkJcmV0IHw9IF9fcHV0X3VzZXIoZGF0YS52WzJdLCBTV0laX1BUUihwKyspKTsKLQkJCXJldCB8PSBfX3B1dF91c2VyKGRhdGEudlszXSwgU1dJWl9QVFIocCsrKSk7CisJCQlyZXQgfD0gX19wdXRfdXNlcl9pbmF0b21pYyhkYXRhLnZbMF0sIFNXSVpfUFRSKHArKykpOworCQkJcmV0IHw9IF9fcHV0X3VzZXJfaW5hdG9taWMoZGF0YS52WzFdLCBTV0laX1BUUihwKyspKTsKKwkJCXJldCB8PSBfX3B1dF91c2VyX2luYXRvbWljKGRhdGEudlsyXSwgU1dJWl9QVFIocCsrKSk7CisJCQlyZXQgfD0gX19wdXRfdXNlcl9pbmF0b21pYyhkYXRhLnZbM10sIFNXSVpfUFRSKHArKykpOwogCQljYXNlIDQ6Ci0JCQlyZXQgfD0gX19wdXRfdXNlcihkYXRhLnZbNF0sIFNXSVpfUFRSKHArKykpOwotCQkJcmV0IHw9IF9fcHV0X3VzZXIoZGF0YS52WzVdLCBTV0laX1BUUihwKyspKTsKKwkJCXJldCB8PSBfX3B1dF91c2VyX2luYXRvbWljKGRhdGEudls0XSwgU1dJWl9QVFIocCsrKSk7CisJCQlyZXQgfD0gX19wdXRfdXNlcl9pbmF0b21pYyhkYXRhLnZbNV0sIFNXSVpfUFRSKHArKykpOwogCQljYXNlIDI6Ci0JCQlyZXQgfD0gX19wdXRfdXNlcihkYXRhLnZbNl0sIFNXSVpfUFRSKHArKykpOwotCQkJcmV0IHw9IF9fcHV0X3VzZXIoZGF0YS52WzddLCBTV0laX1BUUihwKyspKTsKKwkJCXJldCB8PSBfX3B1dF91c2VyX2luYXRvbWljKGRhdGEudls2XSwgU1dJWl9QVFIocCsrKSk7CisJCQlyZXQgfD0gX19wdXRfdXNlcl9pbmF0b21pYyhkYXRhLnZbN10sIFNXSVpfUFRSKHArKykpOwogCQl9CiAJCWlmICh1bmxpa2VseShyZXQpKQogCQkJcmV0dXJuIC1FRkFVTFQ7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2FzbS1vZmZzZXRzLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2FzbS1vZmZzZXRzLmMKaW5kZXggMDMwZDMwMC4uMGM1MTUwYyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9hc20tb2Zmc2V0cy5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvYXNtLW9mZnNldHMuYwpAQCAtNzcsNyArNzcsNiBAQAogCURFRklORShLU1BfVlNJRCwgb2Zmc2V0b2Yoc3RydWN0IHRocmVhZF9zdHJ1Y3QsIGtzcF92c2lkKSk7CiAjZWxzZSAvKiBDT05GSUdfUFBDNjQgKi8KIAlERUZJTkUoUEdESVIsIG9mZnNldG9mKHN0cnVjdCB0aHJlYWRfc3RydWN0LCBwZ2RpcikpOwotCURFRklORShMQVNUX1NZU0NBTEwsIG9mZnNldG9mKHN0cnVjdCB0aHJlYWRfc3RydWN0LCBsYXN0X3N5c2NhbGwpKTsKICNpZiBkZWZpbmVkKENPTkZJR180eHgpIHx8IGRlZmluZWQoQ09ORklHX0JPT0tFKQogCURFRklORShUSFJFQURfREJDUjAsIG9mZnNldG9mKHN0cnVjdCB0aHJlYWRfc3RydWN0LCBkYmNyMCkpOwogCURFRklORShQVF9QVFJBQ0VELCBQVF9QVFJBQ0VEKTsKQEAgLTE0MCw2ICsxMzksNyBAQAogCURFRklORShQQUNBX1NZU1RFTV9USU1FLCBvZmZzZXRvZihzdHJ1Y3QgcGFjYV9zdHJ1Y3QsIHN5c3RlbV90aW1lKSk7CiAJREVGSU5FKFBBQ0FfU0xCU0hBRE9XUFRSLCBvZmZzZXRvZihzdHJ1Y3QgcGFjYV9zdHJ1Y3QsIHNsYl9zaGFkb3dfcHRyKSk7CiAJREVGSU5FKFBBQ0FfREFUQV9PRkZTRVQsIG9mZnNldG9mKHN0cnVjdCBwYWNhX3N0cnVjdCwgZGF0YV9vZmZzZXQpKTsKKwlERUZJTkUoUEFDQV9UUkFQX1NBVkUsIG9mZnNldG9mKHN0cnVjdCBwYWNhX3N0cnVjdCwgdHJhcF9zYXZlKSk7CiAKIAlERUZJTkUoU0xCU0hBRE9XX1NUQUNLVlNJRCwKIAkgICAgICAgb2Zmc2V0b2Yoc3RydWN0IHNsYl9zaGFkb3csIHNhdmVfYXJlYVtTTEJfTlVNX0JPTFRFRCAtIDFdLnZzaWQpKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvYnRleHQuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvYnRleHQuYwppbmRleCAzNjc4OTk3Li5lN2I2ODQ2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2J0ZXh0LmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9idGV4dC5jCkBAIC0xNjEsMzMgKzE2MSwzMyBAQAogCXVuc2lnbmVkIGxvbmcgYWRkcmVzcyA9IDA7CiAJY29uc3QgdTMyICpwcm9wOwogCi0JcHJvcCA9IGdldF9wcm9wZXJ0eShucCwgImxpbnV4LGJvb3R4LXdpZHRoIiwgTlVMTCk7CisJcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShucCwgImxpbnV4LGJvb3R4LXdpZHRoIiwgTlVMTCk7CiAJaWYgKHByb3AgPT0gTlVMTCkKLQkJcHJvcCA9IGdldF9wcm9wZXJ0eShucCwgIndpZHRoIiwgTlVMTCk7CisJCXByb3AgPSBvZl9nZXRfcHJvcGVydHkobnAsICJ3aWR0aCIsIE5VTEwpOwogCWlmIChwcm9wID09IE5VTEwpCiAJCXJldHVybiAtRUlOVkFMOwogCXdpZHRoID0gKnByb3A7Ci0JcHJvcCA9IGdldF9wcm9wZXJ0eShucCwgImxpbnV4LGJvb3R4LWhlaWdodCIsIE5VTEwpOworCXByb3AgPSBvZl9nZXRfcHJvcGVydHkobnAsICJsaW51eCxib290eC1oZWlnaHQiLCBOVUxMKTsKIAlpZiAocHJvcCA9PSBOVUxMKQotCQlwcm9wID0gZ2V0X3Byb3BlcnR5KG5wLCAiaGVpZ2h0IiwgTlVMTCk7CisJCXByb3AgPSBvZl9nZXRfcHJvcGVydHkobnAsICJoZWlnaHQiLCBOVUxMKTsKIAlpZiAocHJvcCA9PSBOVUxMKQogCQlyZXR1cm4gLUVJTlZBTDsKIAloZWlnaHQgPSAqcHJvcDsKLQlwcm9wID0gZ2V0X3Byb3BlcnR5KG5wLCAibGludXgsYm9vdHgtZGVwdGgiLCBOVUxMKTsKKwlwcm9wID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAibGludXgsYm9vdHgtZGVwdGgiLCBOVUxMKTsKIAlpZiAocHJvcCA9PSBOVUxMKQotCQlwcm9wID0gZ2V0X3Byb3BlcnR5KG5wLCAiZGVwdGgiLCBOVUxMKTsKKwkJcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShucCwgImRlcHRoIiwgTlVMTCk7CiAJaWYgKHByb3AgPT0gTlVMTCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJZGVwdGggPSAqcHJvcDsKIAlwaXRjaCA9IHdpZHRoICogKChkZXB0aCArIDcpIC8gOCk7Ci0JcHJvcCA9IGdldF9wcm9wZXJ0eShucCwgImxpbnV4LGJvb3R4LWxpbmVieXRlcyIsIE5VTEwpOworCXByb3AgPSBvZl9nZXRfcHJvcGVydHkobnAsICJsaW51eCxib290eC1saW5lYnl0ZXMiLCBOVUxMKTsKIAlpZiAocHJvcCA9PSBOVUxMKQotCQlwcm9wID0gZ2V0X3Byb3BlcnR5KG5wLCAibGluZWJ5dGVzIiwgTlVMTCk7CisJCXByb3AgPSBvZl9nZXRfcHJvcGVydHkobnAsICJsaW5lYnl0ZXMiLCBOVUxMKTsKIAlpZiAocHJvcCAmJiAqcHJvcCAhPSAweGZmZmZmZmZmdSkKIAkJcGl0Y2ggPSAqcHJvcDsKIAlpZiAocGl0Y2ggPT0gMSkKIAkJcGl0Y2ggPSAweDEwMDA7Ci0JcHJvcCA9IGdldF9wcm9wZXJ0eShucCwgImFkZHJlc3MiLCBOVUxMKTsKKwlwcm9wID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAiYWRkcmVzcyIsIE5VTEwpOwogCWlmIChwcm9wKQogCQlhZGRyZXNzID0gKnByb3A7CiAKQEAgLTIxOSw3ICsyMTksNyBAQAogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBOVUxMOyAKIAlpbnQgcmMgPSAtRU5PREVWOwogCi0JbmFtZSA9IGdldF9wcm9wZXJ0eShvZl9jaG9zZW4sICJsaW51eCxzdGRvdXQtcGF0aCIsIE5VTEwpOworCW5hbWUgPSBvZl9nZXRfcHJvcGVydHkob2ZfY2hvc2VuLCAibGludXgsc3Rkb3V0LXBhdGgiLCBOVUxMKTsKIAlpZiAobmFtZSAhPSBOVUxMKSB7CiAJCW5wID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgobmFtZSk7CiAJCWlmIChucCAhPSBOVUxMKSB7CkBAIC0yMzYsNyArMjM2LDcgQEAKIAkJcmV0dXJuIHJjOwogCiAJZm9yIChucCA9IE5VTEw7IChucCA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKG5wLCAiZGlzcGxheSIpKTspIHsKLQkJaWYgKGdldF9wcm9wZXJ0eShucCwgImxpbnV4LG9wZW5lZCIsIE5VTEwpKSB7CisJCWlmIChvZl9nZXRfcHJvcGVydHkobnAsICJsaW51eCxvcGVuZWQiLCBOVUxMKSkgewogCQkJcHJpbnRrKCJ0cnlpbmcgJXMgLi4uXG4iLCBucC0+ZnVsbF9uYW1lKTsKIAkJCXJjID0gYnRleHRfaW5pdGlhbGl6ZShucCk7CiAJCQlwcmludGsoInJlc3VsdDogJWRcbiIsIHJjKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvY3B1X3NldHVwX3BhNnQuUyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvY3B1X3NldHVwX3BhNnQuUwppbmRleCA0MDQ3YmUyLi5kNjJjYjljIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2NwdV9zZXR1cF9wYTZ0LlMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcHVfc2V0dXBfcGE2dC5TCkBAIC0zNCw3ICszNCw3IEBACiAJYmVxbHIKIAogCW1mc3ByCXIwLFNQUk5fSElENQotCW9yaQlyMCxyMCwweDMwCisJb3JpCXIwLHIwLDB4MzgKIAltdHNwcglTUFJOX0hJRDUscjAKIAogCW1mc3ByCXIwLFNQUk5fTFBDUgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcHV0YWJsZS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcHV0YWJsZS5jCmluZGV4IGU0MDA2ZGMuLjljYjI0ZDIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvY3B1dGFibGUuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2NwdXRhYmxlLmMKQEAgLTM4OSw2ICszODksOCBAQAogCQkucG1jX3R5cGUJCT0gUFBDX1BNQ19QQTZULAogCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1X3BhNnQsCiAJCS5jcHVfcmVzdG9yZQkJPSBfX3Jlc3RvcmVfY3B1X3BhNnQsCisJCS5vcHJvZmlsZV9jcHVfdHlwZQk9ICJwcGM2NC9wYTZ0IiwKKwkJLm9wcm9maWxlX3R5cGUJCT0gUFBDX09QUk9GSUxFX1BBNlQsCiAJCS5wbGF0Zm9ybQkJPSAicGE2dCIsCiAJfSwKIAl7CS8qIGRlZmF1bHQgbWF0Y2ggKi8KQEAgLTU1OCw2ICs1NjAsMTggQEAKIAkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV83NTBjeCwKIAkJLnBsYXRmb3JtCQk9ICJwcGM3NTAiLAogCX0sCisJewkvKiA3NTBDTCAqLworCQkucHZyX21hc2sJCT0gMHhmZmZmZjBmMCwKKwkJLnB2cl92YWx1ZQkJPSAweDAwMDg3MDEwLAorCQkuY3B1X25hbWUJCT0gIjc1MENMIiwKKwkJLmNwdV9mZWF0dXJlcwkJPSBDUFVfRlRSU183NTBDTCwKKwkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVIgfCBQUENfRkVBVFVSRV9QUENfTEUsCisJCS5pY2FjaGVfYnNpemUJCT0gMzIsCisJCS5kY2FjaGVfYnNpemUJCT0gMzIsCisJCS5udW1fcG1jcwkJPSA0LAorCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1Xzc1MCwKKwkJLnBsYXRmb3JtCQk9ICJwcGM3NTAiLAorCX0sCiAJewkvKiA3NDUvNzU1ICovCiAJCS5wdnJfbWFzawkJPSAweGZmZmZmMDAwLAogCQkucHZyX3ZhbHVlCQk9IDB4MDAwODMwMDAsCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2VudHJ5XzMyLlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2VudHJ5XzMyLlMKaW5kZXggYzAzZTgyOS4uYzI5ZDE2NSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9lbnRyeV8zMi5TCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvZW50cnlfMzIuUwpAQCAtMTkxLDcgKzE5MSw2IEBACiAwOgogCiBfR0xPQkFMKERvU3lzY2FsbCkKLQlzdHcJcjAsVEhSRUFEK0xBU1RfU1lTQ0FMTChyMikKIAlzdHcJcjMsT1JJR19HUFIzKHIxKQogCWxpCXIxMiwwCiAJc3R3CXIxMixSRVNVTFQocjEpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2hlYWRfNjQuUyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF82NC5TCmluZGV4IDk3Y2VkY2Q2Li4xMTExZmNlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2hlYWRfNjQuUworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2hlYWRfNjQuUwpAQCAtMjc4LDggKzI3OCwxMiBAQAogCWJlcS0JMWY7CQkJCQkJCSAgIFwKIAlsZAlyMSxQQUNBS1NBVkUocjEzKTsJLyoga2VybmVsIHN0YWNrIHRvIHVzZQkJKi8gXAogMToJY21wZGkJY3IxLHIxLDA7CQkvKiBjaGVjayBpZiByMSBpcyBpbiB1c2Vyc3BhY2UJKi8gXAotCWJnZS0JY3IxLGJhZF9zdGFjazsJCS8qIGFib3J0IGlmIGl0IGlzCQkqLyBcCi0Jc3RkCXI5LF9DQ1IocjEpOwkJLyogc2F2ZSBDUiBpbiBzdGFja2ZyYW1lCSovIFwKKwliZ2UtCWNyMSwyZjsJCQkvKiBhYm9ydCBpZiBpdCBpcwkJKi8gXAorCWIJM2Y7CQkJCQkJCSAgIFwKKzI6CWxpCXIxLChuKTsJCQkvKiB3aWxsIGJlIHJlbG9hZGVkIGxhdGVyCSovIFwKKwlzdGgJcjEsUEFDQV9UUkFQX1NBVkUocjEzKTsJCQkJCSAgIFwKKwliCWJhZF9zdGFjazsJCQkJCQkgICBcCiszOglzdGQJcjksX0NDUihyMSk7CQkvKiBzYXZlIENSIGluIHN0YWNrZnJhbWUJKi8gXAogCXN0ZAlyMTEsX05JUChyMSk7CQkvKiBzYXZlIFNSUjAgaW4gc3RhY2tmcmFtZQkqLyBcCiAJc3RkCXIxMixfTVNSKHIxKTsJCS8qIHNhdmUgU1JSMSBpbiBzdGFja2ZyYW1lCSovIFwKIAlzdGQJcjEwLDAocjEpOwkJLyogbWFrZSBzdGFjayBjaGFpbiBwb2ludGVyCSovIFwKQEAgLTk0MCw2ICs5NDQsOCBAQAogCVNBVkVfMkdQUlMoNyxyMSkKIAlTQVZFXzEwR1BSUygxMixyMSkKIAlTQVZFXzEwR1BSUygyMixyMSkKKwlsaHoJcjEyLFBBQ0FfVFJBUF9TQVZFKHIxMykKKwlzdGQJcjEyLF9UUkFQKHIxKQogCWFkZGkJcjExLHIxLElOVF9GUkFNRV9TSVpFCiAJc3RkCXIxMSwwKHIxKQogCWxpCXIxMiwwCkBAIC0xNTU1LDcgKzE1NjEsNiBAQAogCQogCS8qIHR1cm4gb24gNjQtYml0IG1vZGUgKi8KIAlibAkuZW5hYmxlXzY0Yl9tb2RlCi0JaXN5bmMKIAogCS8qIFNldCB1cCBhIHBhY2EgdmFsdWUgZm9yIHRoaXMgcHJvY2Vzc29yLiBTaW5jZSB3ZSBoYXZlIHRoZQogCSAqIHBoeXNpY2FsIGNwdSBpZCBpbiByMjQsIHdlIG5lZWQgdG8gc2VhcmNoIHRoZSBwYWNhcyB0byBmaW5kCkBAIC0xNzM1LDEwICsxNzQwLDYgQEAKIAkvKiBXZSBuZXZlciByZXR1cm4gKi8KIAl0cmFwCiAKLS8qCi0gKiBBdCB0aGlzIHBvaW50LCByMyBjb250YWlucyB0aGUgcGh5c2ljYWwgYWRkcmVzcyB3ZSBhcmUgcnVubmluZyBhdCwKLSAqIHJldHVybmVkIGJ5IHByb21faW5pdCgpCi0gKi8KIF9TVEFUSUMoX19hZnRlcl9wcm9tX3N0YXJ0KQogCiAvKgpAQCAtMTg1MSw3ICsxODUyLDYgQEAKIF9HTE9CQUwocG1hY19zZWNvbmRhcnlfc3RhcnQpCiAJLyogdHVybiBvbiA2NC1iaXQgbW9kZSAqLwogCWJsCS5lbmFibGVfNjRiX21vZGUKLQlpc3luYwogCiAJLyogQ29weSBzb21lIENQVSBzZXR0aW5ncyBmcm9tIENQVSAwICovCiAJYmwJLl9fcmVzdG9yZV9jcHVfcHBjOTcwCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2libWVidXMuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaWJtZWJ1cy5jCmluZGV4IDgyYmQyZjEuLjlhOGM5YWYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaWJtZWJ1cy5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaWJtZWJ1cy5jCkBAIC0yLDM2ICsyLDM3IEBACiAgKiBJQk0gUG93ZXJQQyBJQk0gZUJ1cyBJbmZyYXN0cnVjdHVyZSBTdXBwb3J0LgogICoKICAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24KKyAqICBKb2FjaGltIEZlbmtlcyA8ZmVua2VzQGRlLmlibS5jb20+CiAgKiAgSGVpa28gSiBTY2hpY2sgPHNjaGlja2hqQGRlLmlibS5jb20+Ci0gKiAgICAKKyAqCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKLSAqIFRoaXMgc291cmNlIGNvZGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgYSBkdWFsIGxpY2Vuc2Ugb2YgR1BMIHYyLjAgYW5kIE9wZW5JQiAKLSAqIEJTRC4gCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIGEgZHVhbCBsaWNlbnNlIG9mIEdQTCB2Mi4wIGFuZCBPcGVuSUIKKyAqIEJTRC4KICAqCiAgKiBPcGVuSUIgQlNEIExpY2Vuc2UKICAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgCi0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgogICoKLSAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyAKLSAqIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcworICogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCiAgKgotICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCAKLSAqIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gCisgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCiAgKiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi0gKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIAorICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgogICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiAKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSAKLSAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSAKLSAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKICAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgogICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIKLSAqIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIAotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgCisgKiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogICovCiAKQEAgLTQzLDE5ICs0NCwxOSBAQAogI2luY2x1ZGUgPGFzbS9pYm1lYnVzLmg+CiAjaW5jbHVkZSA8YXNtL2Fic19hZGRyLmg+CiAKLXN0YXRpYyBzdHJ1Y3QgaWJtZWJ1c19kZXYgaWJtZWJ1c19idXNfZGV2aWNlID0geyAvKiBmYWtlICJwYXJlbnQiIGRldmljZSAqLwotCS5uYW1lID0gaWJtZWJ1c19idXNfZGV2aWNlLm9mZGV2LmRldi5idXNfaWQsCi0JLm9mZGV2LmRldi5idXNfaWQgPSAiaWJtZWJ1cyIsCi0JLm9mZGV2LmRldi5idXMgICAgPSAmaWJtZWJ1c19idXNfdHlwZSwKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlIGlibWVidXNfYnVzX2RldmljZSA9IHsgLyogZmFrZSAicGFyZW50IiBkZXZpY2UgKi8KKwkuYnVzX2lkID0gImlibWVidXMiLAogfTsKIAorc3RydWN0IGJ1c190eXBlIGlibWVidXNfYnVzX3R5cGU7CisKIHN0YXRpYyB2b2lkICppYm1lYnVzX2FsbG9jX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQkgICAgc2l6ZV90IHNpemUsCiAJCQkJICAgIGRtYV9hZGRyX3QgKmRtYV9oYW5kbGUsCiAJCQkJICAgIGdmcF90IGZsYWcpCiB7CiAJdm9pZCAqbWVtOwotCQorCiAJbWVtID0ga21hbGxvYyhzaXplLCBmbGFnKTsKIAkqZG1hX2hhbmRsZSA9IChkbWFfYWRkcl90KW1lbTsKIApAQCAtNjMsNyArNjQsNyBAQAogfQogCiBzdGF0aWMgdm9pZCBpYm1lYnVzX2ZyZWVfY29oZXJlbnQoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCSAgc2l6ZV90IHNpemUsIHZvaWQgKnZhZGRyLCAKKwkJCQkgIHNpemVfdCBzaXplLCB2b2lkICp2YWRkciwKIAkJCQkgIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSkKIHsKIAlrZnJlZSh2YWRkcik7CkBAIC03OSw3ICs4MCw3IEBACiAKIHN0YXRpYyB2b2lkIGlibWVidXNfdW5tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQkgZG1hX2FkZHJfdCBkbWFfYWRkciwKLQkJCQkgc2l6ZV90IHNpemUsIAorCQkJCSBzaXplX3Qgc2l6ZSwKIAkJCQkgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQogewogCXJldHVybjsKQEAgLTkwLDEzICs5MSwxMyBAQAogCQkJICBpbnQgbmVudHMsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKIHsKIAlpbnQgaTsKLQkKKwogCWZvciAoaSA9IDA7IGkgPCBuZW50czsgaSsrKSB7Ci0JCXNnW2ldLmRtYV9hZGRyZXNzID0gKGRtYV9hZGRyX3QpcGFnZV9hZGRyZXNzKHNnW2ldLnBhZ2UpIAorCQlzZ1tpXS5kbWFfYWRkcmVzcyA9IChkbWFfYWRkcl90KXBhZ2VfYWRkcmVzcyhzZ1tpXS5wYWdlKQogCQkJKyBzZ1tpXS5vZmZzZXQ7CiAJCXNnW2ldLmRtYV9sZW5ndGggPSBzZ1tpXS5sZW5ndGg7CiAJfQotCQorCiAJcmV0dXJuIG5lbnRzOwogfQogCkBAIC0xMjgsMTUgKzEyOSwxNSBAQAogCXN0cnVjdCBpYm1lYnVzX2RyaXZlciAqaWJtZWJ1c2RydiA9IHRvX2libWVidXNfZHJpdmVyKGRldi0+ZHJpdmVyKTsKIAljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICppZDsKIAlpbnQgZXJyb3IgPSAtRU5PREVWOwotCQorCiAJaWYgKCFpYm1lYnVzZHJ2LT5wcm9iZSkKIAkJcmV0dXJuIGVycm9yOwotCQorCiAJaWQgPSBvZl9tYXRjaF9kZXZpY2UoaWJtZWJ1c2Rydi0+aWRfdGFibGUsICZpYm1lYnVzZGV2LT5vZmRldik7CiAJaWYgKGlkKSB7CiAJCWVycm9yID0gaWJtZWJ1c2Rydi0+cHJvYmUoaWJtZWJ1c2RldiwgaWQpOwogCX0KLQkKKwogCXJldHVybiBlcnJvcjsKIH0KIApAQCAtMTQ0LDExICsxNDUsMTEgQEAKIHsKIAlzdHJ1Y3QgaWJtZWJ1c19kZXYgKmlibWVidXNkZXYgICAgPSB0b19pYm1lYnVzX2RldihkZXYpOwogCXN0cnVjdCBpYm1lYnVzX2RyaXZlciAqaWJtZWJ1c2RydiA9IHRvX2libWVidXNfZHJpdmVyKGRldi0+ZHJpdmVyKTsKLQkKKwogCWlmIChpYm1lYnVzZHJ2LT5yZW1vdmUpIHsKIAkJcmV0dXJuIGlibWVidXNkcnYtPnJlbW92ZShpYm1lYnVzZGV2KTsKIAl9Ci0JCisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTU4LDIxICsxNTksMTIgQEAKIAlrZnJlZSh0b19pYm1lYnVzX2RldihkZXYpKTsKIH0KIAotc3RhdGljIHNzaXplX3QgaWJtZWJ1c2Rldl9zaG93X25hbWUoc3RydWN0IGRldmljZSAqZGV2LCAKLQkJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwgdG9faWJtZWJ1c19kZXYoZGV2KS0+bmFtZSk7Ci19Ci1zdGF0aWMgREVWSUNFX0FUVFIobmFtZSwgU19JUlVTUiB8IFNfSVJHUlAgfCBTX0lST1RILCBpYm1lYnVzZGV2X3Nob3dfbmFtZSwgCi0JCSAgIE5VTEwpOwotCi1zdGF0aWMgc3RydWN0IGlibWVidXNfZGV2KiBfX2RldmluaXQgaWJtZWJ1c19yZWdpc3Rlcl9kZXZpY2VfY29tbW9uKAorc3RhdGljIGludCBfX2RldmluaXQgaWJtZWJ1c19yZWdpc3Rlcl9kZXZpY2VfY29tbW9uKAogCXN0cnVjdCBpYm1lYnVzX2RldiAqZGV2LCBjb25zdCBjaGFyICpuYW1lKQogewogCWludCBlcnIgPSAwOwogCi0JZGV2LT5uYW1lID0gbmFtZTsKLQlkZXYtPm9mZGV2LmRldi5wYXJlbnQgID0gJmlibWVidXNfYnVzX2RldmljZS5vZmRldi5kZXY7CisJZGV2LT5vZmRldi5kZXYucGFyZW50ICA9ICZpYm1lYnVzX2J1c19kZXZpY2U7CiAJZGV2LT5vZmRldi5kZXYuYnVzICAgICA9ICZpYm1lYnVzX2J1c190eXBlOwogCWRldi0+b2ZkZXYuZGV2LnJlbGVhc2UgPSBpYm1lYnVzX2Rldl9yZWxlYXNlOwogCkBAIC0xODEsMTcgKzE3MywxNSBAQAogCWRldi0+b2ZkZXYuZGV2LmFyY2hkYXRhLm51bWFfbm9kZSA9IG9mX25vZGVfdG9fbmlkKGRldi0+b2ZkZXYubm9kZSk7CiAKIAkvKiBBbiBpYm1lYnVzZGV2IGlzIGJhc2VkIG9uIGEgb2ZfZGV2aWNlLiBXZSBoYXZlIHRvIGNoYW5nZSB0aGUKLQkgKiBidXMgdHlwZSB0byB1c2Ugb3VyIG93biBETUEgbWFwcGluZyBvcGVyYXRpb25zLiAKLQkgKi8gICAgICAgCisJICogYnVzIHR5cGUgdG8gdXNlIG91ciBvd24gRE1BIG1hcHBpbmcgb3BlcmF0aW9ucy4KKwkgKi8KIAlpZiAoKGVyciA9IG9mX2RldmljZV9yZWdpc3RlcigmZGV2LT5vZmRldikpICE9IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogZmFpbGVkIHRvIHJlZ2lzdGVyIGRldmljZSAoJWQpLlxuIiwKIAkJICAgICAgIF9fRlVOQ1RJT05fXywgZXJyKTsKLQkJcmV0dXJuIE5VTEw7CisJCXJldHVybiAtRU5PREVWOwogCX0KLQkKLQlkZXZpY2VfY3JlYXRlX2ZpbGUoJmRldi0+b2ZkZXYuZGV2LCAmZGV2X2F0dHJfbmFtZSk7Ci0JCi0JcmV0dXJuIGRldjsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgc3RydWN0IGlibWVidXNfZGV2KiBfX2RldmluaXQgaWJtZWJ1c19yZWdpc3Rlcl9kZXZpY2Vfbm9kZSgKQEAgLTIwMSwzNSArMTkxLDM1IEBACiAJY29uc3QgY2hhciAqbG9jX2NvZGU7CiAJaW50IGxlbmd0aDsKIAotCWxvY19jb2RlID0gZ2V0X3Byb3BlcnR5KGRuLCAiaWJtLGxvYy1jb2RlIiwgTlVMTCk7CisJbG9jX2NvZGUgPSBvZl9nZXRfcHJvcGVydHkoZG4sICJpYm0sbG9jLWNvZGUiLCBOVUxMKTsKIAlpZiAoIWxvY19jb2RlKSB7CiAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IG5vZGUgJXMgbWlzc2luZyAnaWJtLGxvYy1jb2RlJ1xuIiwKIAkJICAgICAgIF9fRlVOQ1RJT05fXywgZG4tPm5hbWUgPyBkbi0+bmFtZSA6ICI8dW5rbm93bj4iKTsKLQkJcmV0dXJuIE5VTEw7CisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwogICAgICAgICB9Ci0JCisKIAlpZiAoc3RybGVuKGxvY19jb2RlKSA9PSAwKSB7CiAJICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICIlczogJ2libSxsb2MtY29kZScgaXMgaW52YWxpZFxuIiwKIAkJICAgICAgIF9fRlVOQ1RJT05fXyk7Ci0JCXJldHVybiBOVUxMOworCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIAl9CiAKIAlkZXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaWJtZWJ1c19kZXYpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWRldikgewotCQlyZXR1cm4gTlVMTDsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAJfQogCiAJZGV2LT5vZmRldi5ub2RlID0gb2Zfbm9kZV9nZXQoZG4pOwotICAgICAgIAorCiAJbGVuZ3RoID0gc3RybGVuKGxvY19jb2RlKTsKLQltZW1jcHkoZGV2LT5vZmRldi5kZXYuYnVzX2lkLCBsb2NfY29kZSAKLQkJKyAobGVuZ3RoIC0gbWluKGxlbmd0aCwgQlVTX0lEX1NJWkUgLSAxKSksIAorCW1lbWNweShkZXYtPm9mZGV2LmRldi5idXNfaWQsIGxvY19jb2RlCisJCSsgKGxlbmd0aCAtIG1pbihsZW5ndGgsIEJVU19JRF9TSVpFIC0gMSkpLAogCQltaW4obGVuZ3RoLCBCVVNfSURfU0laRSAtIDEpKTsKIAogCS8qIFJlZ2lzdGVyIHdpdGggZ2VuZXJpYyBkZXZpY2UgZnJhbWV3b3JrLiAqLwotCWlmIChpYm1lYnVzX3JlZ2lzdGVyX2RldmljZV9jb21tb24oZGV2LCBkbi0+bmFtZSkgPT0gTlVMTCkgeworCWlmIChpYm1lYnVzX3JlZ2lzdGVyX2RldmljZV9jb21tb24oZGV2LCBkbi0+bmFtZSkgIT0gMCkgewogCQlrZnJlZShkZXYpOwotCQlyZXR1cm4gTlVMTDsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT0RFVik7CiAJfQogCiAJcmV0dXJuIGRldjsKQEAgLTIzOCwxNyArMjI4LDE2IEBACiBzdGF0aWMgdm9pZCBpYm1lYnVzX3Byb2JlX29mX25vZGVzKGNoYXIqIG5hbWUpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpkbiA9IE5VTEw7Ci0JCisKIAl3aGlsZSAoKGRuID0gb2ZfZmluZF9ub2RlX2J5X25hbWUoZG4sIG5hbWUpKSkgewotCQlpZiAoaWJtZWJ1c19yZWdpc3Rlcl9kZXZpY2Vfbm9kZShkbikgPT0gTlVMTCkgeworCQlpZiAoSVNfRVJSKGlibWVidXNfcmVnaXN0ZXJfZGV2aWNlX25vZGUoZG4pKSkgewogCQkJb2Zfbm9kZV9wdXQoZG4pOwotCQkJCiAJCQlyZXR1cm47CiAJCX0KIAl9Ci0JCisKIAlvZl9ub2RlX3B1dChkbik7Ci0JCisKIAlyZXR1cm47CiB9CiAKQEAgLTI2MiwxNyArMjUxLDIxIEBACiAJcmV0dXJuOwogfQogCi1zdGF0aWMgaW50IGlibWVidXNfbWF0Y2hfaGVscGVyKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKK3N0YXRpYyBpbnQgaWJtZWJ1c19tYXRjaF9uYW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKIHsKLQlpZiAoc3RyY21wKChjaGFyKilkYXRhLCB0b19pYm1lYnVzX2RldihkZXYpLT5uYW1lKSA9PSAwKQorCWNvbnN0IHN0cnVjdCBpYm1lYnVzX2RldiAqZWJ1c19kZXYgPSB0b19pYm1lYnVzX2RldihkZXYpOworCWNvbnN0IGNoYXIgKm5hbWU7CisKKwluYW1lID0gb2ZfZ2V0X3Byb3BlcnR5KGVidXNfZGV2LT5vZmRldi5ub2RlLCAibmFtZSIsIE5VTEwpOworCisJaWYgKG5hbWUgJiYgKHN0cmNtcChkYXRhLCBuYW1lKSA9PSAwKSkKIAkJcmV0dXJuIDE7Ci0JCisKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBpYm1lYnVzX3VucmVnaXN0ZXJfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfbmFtZSk7CiAJb2ZfZGV2aWNlX3VucmVnaXN0ZXIodG9fb2ZfZGV2aWNlKGRldikpOwogCiAJcmV0dXJuIDA7CkBAIC0yODEsMTcgKzI3NCwxNiBAQAogc3RhdGljIHZvaWQgaWJtZWJ1c19yZW1vdmVfZGV2aWNlc19ieV9pZChzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICppZHQpCiB7CiAJc3RydWN0IGRldmljZSAqZGV2OwotCQorCiAJd2hpbGUgKHN0cmxlbihpZHQtPm5hbWUpID4gMCkgewotCQl3aGlsZSAoKGRldiA9IGJ1c19maW5kX2RldmljZSgmaWJtZWJ1c19idXNfdHlwZSwgTlVMTCwgCisJCXdoaWxlICgoZGV2ID0gYnVzX2ZpbmRfZGV2aWNlKCZpYm1lYnVzX2J1c190eXBlLCBOVUxMLAogCQkJCQkgICAgICAodm9pZCopaWR0LT5uYW1lLAotCQkJCQkgICAgICBpYm1lYnVzX21hdGNoX2hlbHBlcikpKSB7CisJCQkJCSAgICAgIGlibWVidXNfbWF0Y2hfbmFtZSkpKSB7CiAJCQlpYm1lYnVzX3VucmVnaXN0ZXJfZGV2aWNlKGRldik7CiAJCX0KIAkJaWR0Kys7Ci0JCQogCX0KLQkKKwogCXJldHVybjsKIH0KIApAQCAtMzA3LDMwICsyOTksMzMgQEAKIAlpZiAoKGVyciA9IGRyaXZlcl9yZWdpc3RlcigmZHJ2LT5kcml2ZXIpICE9IDApKQogCQlyZXR1cm4gZXJyOwogCisJLyogcmVtb3ZlIGFsbCBzdXBwb3J0ZWQgZGV2aWNlcyBmaXJzdCwgaW4gY2FzZSBzb21lb25lCisJICogcHJvYmVkIHRoZW0gbWFudWFsbHkgYmVmb3JlIHJlZ2lzdGVyaW5nIHRoZSBkcml2ZXIgKi8KKwlpYm1lYnVzX3JlbW92ZV9kZXZpY2VzX2J5X2lkKGRydi0+aWRfdGFibGUpOwogCWlibWVidXNfYWRkX2RldmljZXNfYnlfaWQoZHJ2LT5pZF90YWJsZSk7Ci0JCisKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0woaWJtZWJ1c19yZWdpc3Rlcl9kcml2ZXIpOwogCiB2b2lkIGlibWVidXNfdW5yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IGlibWVidXNfZHJpdmVyICpkcnYpCi17CQorewogCWRyaXZlcl91bnJlZ2lzdGVyKCZkcnYtPmRyaXZlcik7CiAJaWJtZWJ1c19yZW1vdmVfZGV2aWNlc19ieV9pZChkcnYtPmlkX3RhYmxlKTsKIH0KIEVYUE9SVF9TWU1CT0woaWJtZWJ1c191bnJlZ2lzdGVyX2RyaXZlcik7CiAKIGludCBpYm1lYnVzX3JlcXVlc3RfaXJxKHN0cnVjdCBpYm1lYnVzX2RldiAqZGV2LAotCQkJdTMyIGlzdCwgCisJCQl1MzIgaXN0LAogCQkJaXJxX2hhbmRsZXJfdCBoYW5kbGVyLAogCQkJdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3MsIGNvbnN0IGNoYXIgKiBkZXZuYW1lLAogCQkJdm9pZCAqZGV2X2lkKQogewogCXVuc2lnbmVkIGludCBpcnEgPSBpcnFfY3JlYXRlX21hcHBpbmcoTlVMTCwgaXN0KTsKLQkKKwogCWlmIChpcnEgPT0gTk9fSVJRKQogCQlyZXR1cm4gLUVJTlZBTDsKLQkKKwogCXJldHVybiByZXF1ZXN0X2lycShpcnEsIGhhbmRsZXIsCiAJCQkgICBpcnFfZmxhZ3MsIGRldm5hbWUsIGRldl9pZCk7CiB9CkBAIC0zMzksNTYgKzMzNCwxNjMgQEAKIHZvaWQgaWJtZWJ1c19mcmVlX2lycShzdHJ1Y3QgaWJtZWJ1c19kZXYgKmRldiwgdTMyIGlzdCwgdm9pZCAqZGV2X2lkKQogewogCXVuc2lnbmVkIGludCBpcnEgPSBpcnFfZmluZF9tYXBwaW5nKE5VTEwsIGlzdCk7Ci0JCisKIAlmcmVlX2lycShpcnEsIGRldl9pZCk7CiB9CiBFWFBPUlRfU1lNQk9MKGlibWVidXNfZnJlZV9pcnEpOwogCiBzdGF0aWMgaW50IGlibWVidXNfYnVzX21hdGNoKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9kcml2ZXIgKmRydikKLXsJCit7CiAJY29uc3Qgc3RydWN0IGlibWVidXNfZGV2ICplYnVzX2RldiA9IHRvX2libWVidXNfZGV2KGRldik7CiAJc3RydWN0IGlibWVidXNfZHJpdmVyICplYnVzX2RydiAgICA9IHRvX2libWVidXNfZHJpdmVyKGRydik7CiAJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqaWRzICAgICA9IGVidXNfZHJ2LT5pZF90YWJsZTsKIAljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICpmb3VuZF9pZDsKLQkKKwogCWlmICghaWRzKQogCQlyZXR1cm4gMDsKLQkKKwogCWZvdW5kX2lkID0gb2ZfbWF0Y2hfZGV2aWNlKGlkcywgJmVidXNfZGV2LT5vZmRldik7CiAJaWYgKGZvdW5kX2lkKQogCQlyZXR1cm4gMTsKLQkKKwogCXJldHVybiAwOwogfQogCitzdGF0aWMgc3NpemVfdCBuYW1lX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGlibWVidXNfZGV2ICplYnVzX2RldiA9IHRvX2libWVidXNfZGV2KGRldik7CisJY29uc3QgY2hhciAqbmFtZSA9IG9mX2dldF9wcm9wZXJ0eShlYnVzX2Rldi0+b2ZkZXYubm9kZSwgIm5hbWUiLCBOVUxMKTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwgbmFtZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBpYm1lYnVzX2Rldl9hdHRyc1tdID0geworCV9fQVRUUl9STyhuYW1lKSwKKwlfX0FUVFJfTlVMTAorfTsKKworc3RhdGljIGludCBpYm1lYnVzX21hdGNoX3BhdGgoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQoreworCWludCByYzsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuID0KKwkJb2Zfbm9kZV9nZXQodG9faWJtZWJ1c19kZXYoZGV2KS0+b2ZkZXYubm9kZSk7CisKKwlyYyA9IChkbi0+ZnVsbF9uYW1lICYmIChzdHJjYXNlY21wKChjaGFyKilkYXRhLCBkbi0+ZnVsbF9uYW1lKSA9PSAwKSk7CisKKwlvZl9ub2RlX3B1dChkbik7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgY2hhciAqaWJtZWJ1c19jaG9tcChjb25zdCBjaGFyICppbiwgc2l6ZV90IGNvdW50KQoreworCWNoYXIgKm91dCA9IChjaGFyKilrbWFsbG9jKGNvdW50ICsgMSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFvdXQpCisJCXJldHVybiBOVUxMOworCisJbWVtY3B5KG91dCwgaW4sIGNvdW50KTsKKwlvdXRbY291bnRdID0gJ1wwJzsKKwlpZiAob3V0W2NvdW50IC0gMV0gPT0gJ1xuJykKKwkJb3V0W2NvdW50IC0gMV0gPSAnXDAnOworCisJcmV0dXJuIG91dDsKK30KKworc3RhdGljIHNzaXplX3QgaWJtZWJ1c19zdG9yZV9wcm9iZShzdHJ1Y3QgYnVzX3R5cGUgKmJ1cywKKwkJCQkgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuID0gTlVMTDsKKwlzdHJ1Y3QgaWJtZWJ1c19kZXYgKmRldjsKKwljaGFyICpwYXRoOworCXNzaXplX3QgcmM7CisKKwlwYXRoID0gaWJtZWJ1c19jaG9tcChidWYsIGNvdW50KTsKKwlpZiAoIXBhdGgpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKGJ1c19maW5kX2RldmljZSgmaWJtZWJ1c19idXNfdHlwZSwgTlVMTCwgcGF0aCwKKwkJCSAgICAgaWJtZWJ1c19tYXRjaF9wYXRoKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogJXMgaGFzIGFscmVhZHkgYmVlbiBwcm9iZWRcbiIsCisJCSAgICAgICBfX0ZVTkNUSU9OX18sIHBhdGgpOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCWlmICgoZG4gPSBvZl9maW5kX25vZGVfYnlfcGF0aChwYXRoKSkpIHsKKwkJZGV2ID0gaWJtZWJ1c19yZWdpc3Rlcl9kZXZpY2Vfbm9kZShkbik7CisJCW9mX25vZGVfcHV0KGRuKTsKKwkJcmMgPSBJU19FUlIoZGV2KSA/IFBUUl9FUlIoZGV2KSA6IGNvdW50OworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBubyBzdWNoIGRldmljZSBub2RlOiAlc1xuIiwKKwkJICAgICAgIF9fRlVOQ1RJT05fXywgcGF0aCk7CisJCXJjID0gLUVOT0RFVjsKKwl9CisKK291dDoKKwlrZnJlZShwYXRoKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGlibWVidXNfc3RvcmVfcmVtb3ZlKHN0cnVjdCBidXNfdHlwZSAqYnVzLAorCQkJCSAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJY2hhciAqcGF0aDsKKworCXBhdGggPSBpYm1lYnVzX2Nob21wKGJ1ZiwgY291bnQpOworCWlmICghcGF0aCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoKGRldiA9IGJ1c19maW5kX2RldmljZSgmaWJtZWJ1c19idXNfdHlwZSwgTlVMTCwgcGF0aCwKKwkJCQkgICBpYm1lYnVzX21hdGNoX3BhdGgpKSkgeworCQlpYm1lYnVzX3VucmVnaXN0ZXJfZGV2aWNlKGRldik7CisKKwkJa2ZyZWUocGF0aCk7CisJCXJldHVybiBjb3VudDsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogJXMgbm90IG9uIHRoZSBidXNcbiIsCisJCSAgICAgICBfX0ZVTkNUSU9OX18sIHBhdGgpOworCisJCWtmcmVlKHBhdGgpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYnVzX2F0dHJpYnV0ZSBpYm1lYnVzX2J1c19hdHRyc1tdID0geworCV9fQVRUUihwcm9iZSwgU19JV1VTUiwgTlVMTCwgaWJtZWJ1c19zdG9yZV9wcm9iZSksCisJX19BVFRSKHJlbW92ZSwgU19JV1VTUiwgTlVMTCwgaWJtZWJ1c19zdG9yZV9yZW1vdmUpLAorCV9fQVRUUl9OVUxMCit9OworCiBzdHJ1Y3QgYnVzX3R5cGUgaWJtZWJ1c19idXNfdHlwZSA9IHsKLQkubmFtZSA9ICJpYm1lYnVzIiwKLQkubWF0Y2ggPSBpYm1lYnVzX2J1c19tYXRjaCwKKwkubmFtZSAgICAgID0gImlibWVidXMiLAorCS5tYXRjaCAgICAgPSBpYm1lYnVzX2J1c19tYXRjaCwKKwkuZGV2X2F0dHJzID0gaWJtZWJ1c19kZXZfYXR0cnMsCisJLmJ1c19hdHRycyA9IGlibWVidXNfYnVzX2F0dHJzCiB9OwogRVhQT1JUX1NZTUJPTChpYm1lYnVzX2J1c190eXBlKTsKIAogc3RhdGljIGludCBfX2luaXQgaWJtZWJ1c19idXNfaW5pdCh2b2lkKQogewogCWludCBlcnI7Ci0JCisKIAlwcmludGsoS0VSTl9JTkZPICJJQk0gZUJ1cyBEZXZpY2UgRHJpdmVyXG4iKTsKLQkKKwogCWVyciA9IGJ1c19yZWdpc3RlcigmaWJtZWJ1c19idXNfdHlwZSk7CiAJaWYgKGVycikgewogCQlwcmludGsoS0VSTl9FUlIgIjolczogZmFpbGVkIHRvIHJlZ2lzdGVyIElCTSBlQnVzLlxuIiwKIAkJICAgICAgIF9fRlVOQ1RJT05fXyk7CiAJCXJldHVybiBlcnI7CiAJfQotCQotCWVyciA9IGRldmljZV9yZWdpc3RlcigmaWJtZWJ1c19idXNfZGV2aWNlLm9mZGV2LmRldik7CisKKwllcnIgPSBkZXZpY2VfcmVnaXN0ZXIoJmlibWVidXNfYnVzX2RldmljZSk7CiAJaWYgKGVycikgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogZGV2aWNlX3JlZ2lzdGVyIHJldHVybmVkICVpXG4iLCAKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGRldmljZV9yZWdpc3RlciByZXR1cm5lZCAlaVxuIiwKIAkJICAgICAgIF9fRlVOQ1RJT05fXywgZXJyKTsKIAkJYnVzX3VucmVnaXN0ZXIoJmlibWVidXNfYnVzX3R5cGUpOwogCiAJCXJldHVybiBlcnI7CiAJfQotCQorCiAJcmV0dXJuIDA7CiB9CiBfX2luaXRjYWxsKGlibWVidXNfYnVzX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9pb21tdS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9pb21tdS5jCmluZGV4IDk1ZWRhZDQuLmMwOGNlY2EgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaW9tbXUuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2lvbW11LmMKQEAgLTQ3LDYgKzQ3LDggQEAKIHN0YXRpYyBpbnQgbm92bWVyZ2UgPSAxOwogI2VuZGlmCiAKK3N0YXRpYyBpbnQgcHJvdGVjdDRnYiA9IDE7CisKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBpb21tdV9udW1fcGFnZXModW5zaWduZWQgbG9uZyB2YWRkciwKIAkJCQkJICAgIHVuc2lnbmVkIGxvbmcgc2xlbikKIHsKQEAgLTU4LDYgKzYwLDE2IEBACiAJcmV0dXJuIG5wYWdlczsKIH0KIAorc3RhdGljIGludCBfX2luaXQgc2V0dXBfcHJvdGVjdDRnYihjaGFyICpzdHIpCit7CisJaWYgKHN0cmNtcChzdHIsICJvbiIpID09IDApCisJCXByb3RlY3Q0Z2IgPSAxOworCWVsc2UgaWYgKHN0cmNtcChzdHIsICJvZmYiKSA9PSAwKQorCQlwcm90ZWN0NGdiID0gMDsKKworCXJldHVybiAxOworfQorCiBzdGF0aWMgaW50IF9faW5pdCBzZXR1cF9pb21tdShjaGFyICpzdHIpCiB7CiAJaWYgKCFzdHJjbXAoc3RyLCAibm92bWVyZ2UiKSkKQEAgLTY3LDYgKzc5LDcgQEAKIAlyZXR1cm4gMTsKIH0KIAorX19zZXR1cCgicHJvdGVjdDRnYj0iLCBzZXR1cF9wcm90ZWN0NGdiKTsKIF9fc2V0dXAoImlvbW11PSIsIHNldHVwX2lvbW11KTsKIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgaW9tbXVfcmFuZ2VfYWxsb2Moc3RydWN0IGlvbW11X3RhYmxlICp0YmwsCkBAIC00MjksNiArNDQyLDkgQEAKIHN0cnVjdCBpb21tdV90YWJsZSAqaW9tbXVfaW5pdF90YWJsZShzdHJ1Y3QgaW9tbXVfdGFibGUgKnRibCwgaW50IG5pZCkKIHsKIAl1bnNpZ25lZCBsb25nIHN6OworCXVuc2lnbmVkIGxvbmcgc3RhcnRfaW5kZXgsIGVuZF9pbmRleDsKKwl1bnNpZ25lZCBsb25nIGVudHJpZXNfcGVyXzRnOworCXVuc2lnbmVkIGxvbmcgaW5kZXg7CiAJc3RhdGljIGludCB3ZWxjb21lZCA9IDA7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAKQEAgLTQ1MCw3ICs0NjYsNyBAQAogCiAjaWZkZWYgQ09ORklHX0NSQVNIX0RVTVAKIAlpZiAocHBjX21kLnRjZV9nZXQpIHsKLQkJdW5zaWduZWQgbG9uZyBpbmRleCwgdGNldmFsOworCQl1bnNpZ25lZCBsb25nIHRjZXZhbDsKIAkJdW5zaWduZWQgbG9uZyB0Y2Vjb3VudCA9IDA7CiAKIAkJLyoKQEAgLTQ4MCw2ICs0OTYsMjMgQEAKIAlwcGNfbWQudGNlX2ZyZWUodGJsLCB0YmwtPml0X29mZnNldCwgdGJsLT5pdF9zaXplKTsKICNlbmRpZgogCisJLyoKKwkgKiBETUEgY2Fubm90IGNyb3NzIDQgR0IgYm91bmRhcnkuICBNYXJrIGxhc3QgZW50cnkgb2YgZWFjaCA0CisJICogR0IgY2h1bmsgYXMgcmVzZXJ2ZWQuCisJICovCisJaWYgKHByb3RlY3Q0Z2IpIHsKKwkJZW50cmllc19wZXJfNGcgPSAweDEwMDAwMDAwMGwgPj4gSU9NTVVfUEFHRV9TSElGVDsKKworCQkvKiBNYXJrIHRoZSBsYXN0IGJpdCBiZWZvcmUgYSA0R0IgYm91bmRhcnkgYXMgdXNlZCAqLworCQlzdGFydF9pbmRleCA9IHRibC0+aXRfb2Zmc2V0IHwgKGVudHJpZXNfcGVyXzRnIC0gMSk7CisJCXN0YXJ0X2luZGV4IC09IHRibC0+aXRfb2Zmc2V0OworCisJCWVuZF9pbmRleCA9IHRibC0+aXRfc2l6ZTsKKworCQlmb3IgKGluZGV4ID0gc3RhcnRfaW5kZXg7IGluZGV4IDwgZW5kX2luZGV4IC0gMTsgaW5kZXggKz0gZW50cmllc19wZXJfNGcpCisJCQlfX3NldF9iaXQoaW5kZXgsIHRibC0+aXRfbWFwKTsKKwl9CisKIAlpZiAoIXdlbGNvbWVkKSB7CiAJCXByaW50ayhLRVJOX0lORk8gIklPTU1VIHRhYmxlIGluaXRpYWxpemVkLCB2aXJ0dWFsIG1lcmdpbmcgJXNcbiIsCiAJCSAgICAgICBub3ZtZXJnZSA/ICJkaXNhYmxlZCIgOiAiZW5hYmxlZCIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9pcnEuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaXJxLmMKaW5kZXggMTAwOTMwOC4uNmM4M2ZlMiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9pcnEuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2lycS5jCkBAIC0zOTQsNyArMzk0LDcgQEAKICNpZmRlZiBDT05GSUdfUFBDX01FUkdFCiAKIHN0YXRpYyBMSVNUX0hFQUQoaXJxX2hvc3RzKTsKLXN0YXRpYyBzcGlubG9ja190IGlycV9iaWdfbG9jayA9IFNQSU5fTE9DS19VTkxPQ0tFRDsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soaXJxX2JpZ19sb2NrKTsKIHN0YXRpYyBERUZJTkVfUEVSX0NQVSh1bnNpZ25lZCBpbnQsIGlycV9yYWRpeF9yZWFkZXIpOwogc3RhdGljIHVuc2lnbmVkIGludCBpcnFfcmFkaXhfd3JpdGVyOwogc3RydWN0IGlycV9tYXBfZW50cnkgaXJxX21hcFtOUl9JUlFTXTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwva3Byb2Jlcy5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9rcHJvYmVzLmMKaW5kZXggZGQyODg2Zi4uZWY2NDdlNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9rcHJvYmVzLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9rcHJvYmVzLmMKQEAgLTU5LDEyICs1OSwxNCBAQAogCX0KIAogCWlmICghcmV0KSB7Ci0JCW1lbWNweShwLT5haW5zbi5pbnNuLCBwLT5hZGRyLCBNQVhfSU5TTl9TSVpFICogc2l6ZW9mKGtwcm9iZV9vcGNvZGVfdCkpOworCQltZW1jcHkocC0+YWluc24uaW5zbiwgcC0+YWRkciwKKwkJCQlNQVhfSU5TTl9TSVpFICogc2l6ZW9mKGtwcm9iZV9vcGNvZGVfdCkpOwogCQlwLT5vcGNvZGUgPSAqcC0+YWRkcjsKIAkJZmx1c2hfaWNhY2hlX3JhbmdlKCh1bnNpZ25lZCBsb25nKXAtPmFpbnNuLmluc24sCiAJCQkodW5zaWduZWQgbG9uZylwLT5haW5zbi5pbnNuICsgc2l6ZW9mKGtwcm9iZV9vcGNvZGVfdCkpOwogCX0KIAorCXAtPmFpbnNuLmJvb3N0YWJsZSA9IDA7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMjMyLDYgKzIzNCwzOCBAQAogCQlyZXR1cm4gMTsKIAogc3NfcHJvYmU6CisJaWYgKHAtPmFpbnNuLmJvb3N0YWJsZSA+PSAwKSB7CisJCXVuc2lnbmVkIGludCBpbnNuID0gKnAtPmFpbnNuLmluc247CisKKwkJLyogcmVncy0+bmlwIGlzIGFsc28gYWRqdXN0ZWQgaWYgZW11bGF0ZV9zdGVwIHJldHVybnMgMSAqLworCQlyZXQgPSBlbXVsYXRlX3N0ZXAocmVncywgaW5zbik7CisJCWlmIChyZXQgPiAwKSB7CisJCQkvKgorCQkJICogT25jZSB0aGlzIGluc3RydWN0aW9uIGhhcyBiZWVuIGJvb3N0ZWQKKwkJCSAqIHN1Y2Nlc3NmdWxseSwgc2V0IHRoZSBib29zdGFibGUgZmxhZworCQkJICovCisJCQlpZiAodW5saWtlbHkocC0+YWluc24uYm9vc3RhYmxlID09IDApKQorCQkJCXAtPmFpbnNuLmJvb3N0YWJsZSA9IDE7CisKKwkJCWlmIChwLT5wb3N0X2hhbmRsZXIpCisJCQkJcC0+cG9zdF9oYW5kbGVyKHAsIHJlZ3MsIDApOworCisJCQlrY2ItPmtwcm9iZV9zdGF0dXMgPSBLUFJPQkVfSElUX1NTRE9ORTsKKwkJCXJlc2V0X2N1cnJlbnRfa3Byb2JlKCk7CisJCQlwcmVlbXB0X2VuYWJsZV9ub19yZXNjaGVkKCk7CisJCQlyZXR1cm4gMTsKKwkJfSBlbHNlIGlmIChyZXQgPCAwKSB7CisJCQkvKgorCQkJICogV2UgZG9uJ3QgYWxsb3cga3Byb2JlcyBvbiBtdG1zcihkKS9yZmkoZCksIGV0Yy4KKwkJCSAqIFNvLCB3ZSBzaG91bGQgbmV2ZXIgZ2V0IGhlcmUuLi4gYnV0LCBpdHMgc3RpbGwKKwkJCSAqIGdvb2QgdG8gY2F0Y2ggdGhlbSwganVzdCBpbiBjYXNlLi4uCisJCQkgKi8KKwkJCXByaW50aygiQ2FuJ3Qgc3RlcCBvbiBpbnN0cnVjdGlvbiAleFxuIiwgaW5zbik7CisJCQlCVUcoKTsKKwkJfSBlbHNlIGlmIChyZXQgPT0gMCkKKwkJCS8qIFRoaXMgaW5zdHJ1Y3Rpb24gY2FuJ3QgYmUgYm9vc3RlZCAqLworCQkJcC0+YWluc24uYm9vc3RhYmxlID0gLTE7CisJfQogCXByZXBhcmVfc2luZ2xlc3RlcChwLCByZWdzKTsKIAlrY2ItPmtwcm9iZV9zdGF0dXMgPSBLUFJPQkVfSElUX1NTOwogCXJldHVybiAxOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9sZWdhY3lfc2VyaWFsLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2xlZ2FjeV9zZXJpYWwuYwppbmRleCAzMjVmNDkwLi42M2RkMmMzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2xlZ2FjeV9zZXJpYWwuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2xlZ2FjeV9zZXJpYWwuYwpAQCAtNDQsMTIgKzQ0LDEyIEBACiAJaW50IGluZGV4OwogCiAJLyogZ2V0IGNsb2NrIGZyZXEuIGlmIHByZXNlbnQgKi8KLQljbGsgPSBnZXRfcHJvcGVydHkobnAsICJjbG9jay1mcmVxdWVuY3kiLCBOVUxMKTsKKwljbGsgPSBvZl9nZXRfcHJvcGVydHkobnAsICJjbG9jay1mcmVxdWVuY3kiLCBOVUxMKTsKIAlpZiAoY2xrICYmICpjbGspCiAJCWNsb2NrID0gKmNsazsKIAogCS8qIGdldCBkZWZhdWx0IHNwZWVkIGlmIHByZXNlbnQgKi8KLQlzcGQgPSBnZXRfcHJvcGVydHkobnAsICJjdXJyZW50LXNwZWVkIiwgTlVMTCk7CisJc3BkID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAiY3VycmVudC1zcGVlZCIsIE5VTEwpOwogCiAJLyogSWYgd2UgaGF2ZSBhIGxvY2F0aW9uIGluZGV4LCB0aGVuIHRyeSB0byB1c2UgaXQgKi8KIAlpZiAod2FudF9pbmRleCA+PSAwICYmIHdhbnRfaW5kZXggPCBNQVhfTEVHQUNZX1NFUklBTF9QT1JUUykKQEAgLTEyMSwxMSArMTIxLDExIEBACiAJLyogV2Ugb25seSBzdXBwb3J0IHBvcnRzIHRoYXQgaGF2ZSBhIGNsb2NrIGZyZXF1ZW5jeSBwcm9wZXJseQogCSAqIGVuY29kZWQgaW4gdGhlIGRldmljZS10cmVlLgogCSAqLwotCWlmIChnZXRfcHJvcGVydHkobnAsICJjbG9jay1mcmVxdWVuY3kiLCBOVUxMKSA9PSBOVUxMKQorCWlmIChvZl9nZXRfcHJvcGVydHkobnAsICJjbG9jay1mcmVxdWVuY3kiLCBOVUxMKSA9PSBOVUxMKQogCQlyZXR1cm4gLTE7CiAKIAkvKiBpZiBydGFzIHVzZXMgdGhpcyBkZXZpY2UsIGRvbid0IHRyeSB0byB1c2UgaXQgYXMgd2VsbCAqLwotCWlmIChnZXRfcHJvcGVydHkobnAsICJ1c2VkLWJ5LXJ0YXMiLCBOVUxMKSAhPSBOVUxMKQorCWlmIChvZl9nZXRfcHJvcGVydHkobnAsICJ1c2VkLWJ5LXJ0YXMiLCBOVUxMKSAhPSBOVUxMKQogCQlyZXR1cm4gLTE7CiAKIAkvKiBHZXQgdGhlIGFkZHJlc3MgKi8KQEAgLTE1Nyw3ICsxNTcsNyBAQAogCURCRygiIC0+IGFkZF9sZWdhY3lfaXNhX3BvcnQoJXMpXG4iLCBucC0+ZnVsbF9uYW1lKTsKIAogCS8qIEdldCB0aGUgSVNBIHBvcnQgbnVtYmVyICovCi0JcmVnID0gZ2V0X3Byb3BlcnR5KG5wLCAicmVnIiwgTlVMTCk7CisJcmVnID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAicmVnIiwgTlVMTCk7CiAJaWYgKHJlZyA9PSBOVUxMKQogCQlyZXR1cm4gLTE7CiAKQEAgLTE2OCw3ICsxNjgsNyBAQAogCS8qIE5vdyBsb29rIGZvciBhbiAiaWJtLGFpeC1sb2MiIHByb3BlcnR5IHRoYXQgZ2l2ZXMgdXMgb3JkZXJpbmcKIAkgKiBpZiBhbnkuLi4KIAkgKi8KLQl0eXBlcCA9IGdldF9wcm9wZXJ0eShucCwgImlibSxhaXgtbG9jIiwgTlVMTCk7CisJdHlwZXAgPSBvZl9nZXRfcHJvcGVydHkobnAsICJpYm0sYWl4LWxvYyIsIE5VTEwpOwogCiAJLyogSWYgd2UgaGF2ZSBhIGxvY2F0aW9uIGluZGV4LCB0aGVuIHVzZSBpdCAqLwogCWlmICh0eXBlcCAmJiAqdHlwZXAgPT0gJ1MnKQpAQCAtMjA2LDcgKzIwNiw3IEBACiAJICogY29tcGF0aWJsZSBVQVJUcyBvbiBQQ0kgbmVlZCBhbGwgc29ydCBvZiBxdWlya3MgKHBvcnQgb2Zmc2V0cwogCSAqIGV0Yy4uLikgdGhhdCB0aGlzIGNvZGUgZG9lc24ndCBrbm93IGFib3V0CiAJICovCi0JaWYgKGdldF9wcm9wZXJ0eShucCwgImNsb2NrLWZyZXF1ZW5jeSIsIE5VTEwpID09IE5VTEwpCisJaWYgKG9mX2dldF9wcm9wZXJ0eShucCwgImNsb2NrLWZyZXF1ZW5jeSIsIE5VTEwpID09IE5VTEwpCiAJCXJldHVybiAtMTsKIAogCS8qIEdldCB0aGUgUENJIGFkZHJlc3MuIEFzc3VtZSBCQVIgMCAqLwpAQCAtMjMyLDcgKzIzMiw3IEBACiAJICogd2UgZ2V0IHRvIHRoZWlyICJyZWciIHByb3BlcnR5CiAJICovCiAJaWYgKG5wICE9IHBjaV9kZXYpIHsKLQkJY29uc3QgdTMyICpyZWcgPSBnZXRfcHJvcGVydHkobnAsICJyZWciLCBOVUxMKTsKKwkJY29uc3QgdTMyICpyZWcgPSBvZl9nZXRfcHJvcGVydHkobnAsICJyZWciLCBOVUxMKTsKIAkJaWYgKHJlZyAmJiAoKnJlZyA8IDQpKQogCQkJaW5kZXggPSBsaW5kZXggPSAqcmVnOwogCX0KQEAgLTI5Niw3ICsyOTYsNyBAQAogCURCRygiIC0+IGZpbmRfbGVnYWN5X3NlcmlhbF9wb3J0KClcbiIpOwogCiAJLyogTm93IGZpbmQgb3V0IGlmIG9uZSBvZiB0aGVzZSBpcyBvdXQgZmlybXdhcmUgY29uc29sZSAqLwotCXBhdGggPSBnZXRfcHJvcGVydHkob2ZfY2hvc2VuLCAibGludXgsc3Rkb3V0LXBhdGgiLCBOVUxMKTsKKwlwYXRoID0gb2ZfZ2V0X3Byb3BlcnR5KG9mX2Nob3NlbiwgImxpbnV4LHN0ZG91dC1wYXRoIiwgTlVMTCk7CiAJaWYgKHBhdGggIT0gTlVMTCkgewogCQlzdGRvdXQgPSBvZl9maW5kX25vZGVfYnlfcGF0aChwYXRoKTsKIAkJaWYgKHN0ZG91dCkKQEAgLTUyOSw3ICs1MjksNyBAQAogCX0KIAkvKiBXZSBhcmUgZ2V0dGluZyBhIHdlaXJkIHBoYW5kbGUgZnJvbSBPRiAuLi4gKi8KIAkvKiAuLi4gU28gdXNlIHRoZSBmdWxsIHBhdGggaW5zdGVhZCAqLwotCW5hbWUgPSBnZXRfcHJvcGVydHkob2ZfY2hvc2VuLCAibGludXgsc3Rkb3V0LXBhdGgiLCBOVUxMKTsKKwluYW1lID0gb2ZfZ2V0X3Byb3BlcnR5KG9mX2Nob3NlbiwgImxpbnV4LHN0ZG91dC1wYXRoIiwgTlVMTCk7CiAJaWYgKG5hbWUgPT0gTlVMTCkgewogCQlEQkcoIiBubyBsaW51eCxzdGRvdXQtcGF0aCAhXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CkBAIC01NDEsMTIgKzU0MSwxMiBAQAogCX0KIAlEQkcoInN0ZG91dCBpcyAlc1xuIiwgcHJvbV9zdGRvdXQtPmZ1bGxfbmFtZSk7CiAKLQluYW1lID0gZ2V0X3Byb3BlcnR5KHByb21fc3Rkb3V0LCAibmFtZSIsIE5VTEwpOworCW5hbWUgPSBvZl9nZXRfcHJvcGVydHkocHJvbV9zdGRvdXQsICJuYW1lIiwgTlVMTCk7CiAJaWYgKCFuYW1lKSB7CiAJCURCRygiIHN0ZG91dCBwYWNrYWdlIGhhcyBubyBuYW1lICFcbiIpOwogCQlnb3RvIG5vdF9mb3VuZDsKIAl9Ci0Jc3BkID0gZ2V0X3Byb3BlcnR5KHByb21fc3Rkb3V0LCAiY3VycmVudC1zcGVlZCIsIE5VTEwpOworCXNwZCA9IG9mX2dldF9wcm9wZXJ0eShwcm9tX3N0ZG91dCwgImN1cnJlbnQtc3BlZWQiLCBOVUxMKTsKIAlpZiAoc3BkKQogCQlzcGVlZCA9ICpzcGQ7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvbHBhcmNmZy5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9scGFyY2ZnLmMKaW5kZXggODk0ODZiNi4uYzQ5MmNlZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9scGFyY2ZnLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9scGFyY2ZnLmMKQEAgLTEzMCwzMCArMTMwLDMxIEBACiAvKgogICogTWV0aG9kcyB1c2VkIHRvIGZldGNoIExQQVIgZGF0YSB3aGVuIHJ1bm5pbmcgb24gYSBwU2VyaWVzIHBsYXRmb3JtLgogICovCi0vKiBmaW5kIGEgYmV0dGVyIHBsYWNlIGZvciB0aGlzIGZ1bmN0aW9uLi4uICovCiBzdGF0aWMgdm9pZCBsb2dfcGxwYXJfaGNhbGxfcmV0dXJuKHVuc2lnbmVkIGxvbmcgcmMsIGNoYXIgKnRhZykKIHsKLQlpZiAocmMgPT0gMCkJCS8qIHN1Y2Nlc3MsIHJldHVybiAqLworCXN3aXRjaChyYykgeworCWNhc2UgMDoKIAkJcmV0dXJuOwotLyogY2hlY2sgZm9yIG51bGwgdGFnID8gKi8KLQlpZiAocmMgPT0gSF9IQVJEV0FSRSkKLQkJcHJpbnRrKEtFUk5fSU5GTwotCQkgICAgICAgInBscGFyLWhjYWxsICglcykgZmFpbGVkIHdpdGggaGFyZHdhcmUgZmF1bHRcbiIsIHRhZyk7Ci0JZWxzZSBpZiAocmMgPT0gSF9GVU5DVElPTikKLQkJcHJpbnRrKEtFUk5fSU5GTwotCQkgICAgICAgInBscGFyLWhjYWxsICglcykgZmFpbGVkOyBmdW5jdGlvbiBub3QgYWxsb3dlZFxuIiwgdGFnKTsKLQllbHNlIGlmIChyYyA9PSBIX0FVVEhPUklUWSkKLQkJcHJpbnRrKEtFUk5fSU5GTwotCQkgICAgICAgInBscGFyLWhjYWxsICglcykgZmFpbGVkOyBub3QgYXV0aG9yaXplZCB0byB0aGlzIgotCQkgICAgICAgIiBmdW5jdGlvblxuIiwgdGFnKTsKLQllbHNlIGlmIChyYyA9PSBIX1BBUkFNRVRFUikKLQkJcHJpbnRrKEtFUk5fSU5GTyAicGxwYXItaGNhbGwgKCVzKSBmYWlsZWQ7IEJhZCBwYXJhbWV0ZXIocylcbiIsCi0JCSAgICAgICB0YWcpOwotCWVsc2UKLQkJcHJpbnRrKEtFUk5fSU5GTwotCQkgICAgICAgInBscGFyLWhjYWxsICglcykgZmFpbGVkIHdpdGggdW5leHBlY3RlZCByYygweCVseClcbiIsCi0JCSAgICAgICB0YWcsIHJjKTsKLQorCWNhc2UgSF9IQVJEV0FSRToKKwkJcHJpbnRrKEtFUk5fSU5GTyAicGxwYXItaGNhbGwgKCVzKSAiCisJCQkJIkhhcmR3YXJlIGZhdWx0XG4iLCB0YWcpOworCQlyZXR1cm47CisJY2FzZSBIX0ZVTkNUSU9OOgorCQlwcmludGsoS0VSTl9JTkZPICJwbHBhci1oY2FsbCAoJXMpICIKKwkJCQkiRnVuY3Rpb24gbm90IGFsbG93ZWRcbiIsIHRhZyk7CisJCXJldHVybjsKKwljYXNlIEhfQVVUSE9SSVRZOgorCQlwcmludGsoS0VSTl9JTkZPICJwbHBhci1oY2FsbCAoJXMpICIKKwkJCQkiTm90IGF1dGhvcml6ZWQgdG8gdGhpcyBmdW5jdGlvblxuIiwgdGFnKTsKKwkJcmV0dXJuOworCWNhc2UgSF9QQVJBTUVURVI6CisJCXByaW50ayhLRVJOX0lORk8gInBscGFyLWhjYWxsICglcykgIgorCQkJCSJCYWQgcGFyYW1ldGVyKHMpXG4iLHRhZyk7CisJCXJldHVybjsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9JTkZPICJwbHBhci1oY2FsbCAoJXMpICIKKwkJCQkiVW5leHBlY3RlZCByYygweCVseClcbiIsIHRhZywgcmMpOworCX0KIH0KIAogLyoKQEAgLTMyMSwxNSArMzIyLDE2IEBACiAJc3RydWN0IGRldmljZV9ub2RlICpydGFzX25vZGU7CiAJY29uc3QgaW50ICpscmRycCA9IE5VTEw7CiAKLQlydGFzX25vZGUgPSBmaW5kX3BhdGhfZGV2aWNlKCIvcnRhcyIpOworCXJ0YXNfbm9kZSA9IG9mX2ZpbmRfbm9kZV9ieV9wYXRoKCIvcnRhcyIpOwogCWlmIChydGFzX25vZGUpCi0JCWxyZHJwID0gZ2V0X3Byb3BlcnR5KHJ0YXNfbm9kZSwgImlibSxscmRyLWNhcGFjaXR5IiwgTlVMTCk7CisJCWxyZHJwID0gb2ZfZ2V0X3Byb3BlcnR5KHJ0YXNfbm9kZSwgImlibSxscmRyLWNhcGFjaXR5IiwgTlVMTCk7CiAKIAlpZiAobHJkcnAgPT0gTlVMTCkgewogCQlwYXJ0aXRpb25fcG90ZW50aWFsX3Byb2Nlc3NvcnMgPSB2ZHNvX2RhdGEtPnByb2Nlc3NvckNvdW50OwogCX0gZWxzZSB7CiAJCXBhcnRpdGlvbl9wb3RlbnRpYWxfcHJvY2Vzc29ycyA9ICoobHJkcnAgKyA0KTsKIAl9CisJb2Zfbm9kZV9wdXQocnRhc19ub2RlKTsKIAogCXBhcnRpdGlvbl9hY3RpdmVfcHJvY2Vzc29ycyA9IGxwYXJjZmdfY291bnRfYWN0aXZlX3Byb2Nlc3NvcnMoKTsKIApAQCAtNTM3LDI1ICs1MzksMjcgQEAKIAogCXNlcV9wcmludGYobSwgIiVzICVzIFxuIiwgTU9EVUxFX05BTUUsIE1PRFVMRV9WRVJTKTsKIAotCXJvb3RkbiA9IGZpbmRfcGF0aF9kZXZpY2UoIi8iKTsKKwlyb290ZG4gPSBvZl9maW5kX25vZGVfYnlfcGF0aCgiLyIpOwogCWlmIChyb290ZG4pIHsKLQkJdG1wID0gZ2V0X3Byb3BlcnR5KHJvb3RkbiwgIm1vZGVsIiwgTlVMTCk7CisJCXRtcCA9IG9mX2dldF9wcm9wZXJ0eShyb290ZG4sICJtb2RlbCIsIE5VTEwpOwogCQlpZiAodG1wKSB7CiAJCQltb2RlbCA9IHRtcDsKIAkJCS8qIFNraXAgIklCTSwiIC0gc2VlIHBsYXRmb3Jtcy9pc2VyaWVzL2R0LmMgKi8KIAkJCWlmIChmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0lTRVJJRVMpKQogCQkJCW1vZGVsICs9IDQ7CiAJCX0KLQkJdG1wID0gZ2V0X3Byb3BlcnR5KHJvb3RkbiwgInN5c3RlbS1pZCIsIE5VTEwpOworCQl0bXAgPSBvZl9nZXRfcHJvcGVydHkocm9vdGRuLCAic3lzdGVtLWlkIiwgTlVMTCk7CiAJCWlmICh0bXApIHsKIAkJCXN5c3RlbV9pZCA9IHRtcDsKIAkJCS8qIFNraXAgIklCTSwiIC0gc2VlIHBsYXRmb3Jtcy9pc2VyaWVzL2R0LmMgKi8KIAkJCWlmIChmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0lTRVJJRVMpKQogCQkJCXN5c3RlbV9pZCArPSA0OwogCQl9Ci0JCWxwX2luZGV4X3B0ciA9IGdldF9wcm9wZXJ0eShyb290ZG4sICJpYm0scGFydGl0aW9uLW5vIiwgTlVMTCk7CisJCWxwX2luZGV4X3B0ciA9IG9mX2dldF9wcm9wZXJ0eShyb290ZG4sICJpYm0scGFydGl0aW9uLW5vIiwKKwkJCQkJTlVMTCk7CiAJCWlmIChscF9pbmRleF9wdHIpCiAJCQlscF9pbmRleCA9ICpscF9pbmRleF9wdHI7CisJCW9mX25vZGVfcHV0KHJvb3Rkbik7CiAJfQogCXNlcV9wcmludGYobSwgInNlcmlhbF9udW1iZXI9JXNcbiIsIHN5c3RlbV9pZCk7CiAJc2VxX3ByaW50ZihtLCAic3lzdGVtX3R5cGU9JXNcbiIsIG1vZGVsKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvbWFjaGluZV9rZXhlY182NC5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9tYWNoaW5lX2tleGVjXzY0LmMKaW5kZXggYTI0YjA5Yy4uNzA0Mzc1YiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9tYWNoaW5lX2tleGVjXzY0LmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9tYWNoaW5lX2tleGVjXzY0LmMKQEAgLTcyLDggKzcyLDggQEAKIAkvKiBXZSBhbHNvIHNob3VsZCBub3Qgb3ZlcndyaXRlIHRoZSB0Y2UgdGFibGVzICovCiAJZm9yIChub2RlID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUoTlVMTCwgInBjaSIpOyBub2RlICE9IE5VTEw7CiAJCQlub2RlID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUobm9kZSwgInBjaSIpKSB7Ci0JCWJhc2VwID0gZ2V0X3Byb3BlcnR5KG5vZGUsICJsaW51eCx0Y2UtYmFzZSIsIE5VTEwpOwotCQlzaXplcCA9IGdldF9wcm9wZXJ0eShub2RlLCAibGludXgsdGNlLXNpemUiLCBOVUxMKTsKKwkJYmFzZXAgPSBvZl9nZXRfcHJvcGVydHkobm9kZSwgImxpbnV4LHRjZS1iYXNlIiwgTlVMTCk7CisJCXNpemVwID0gb2ZfZ2V0X3Byb3BlcnR5KG5vZGUsICJsaW51eCx0Y2Utc2l6ZSIsIE5VTEwpOwogCQlpZiAoYmFzZXAgPT0gTlVMTCB8fCBzaXplcCA9PSBOVUxMKQogCQkJY29udGludWU7CiAKQEAgLTI5NCwxOSArMjk0LDE5IEBACiBzdGF0aWMgc3RydWN0IHByb3BlcnR5IGh0YWJfYmFzZV9wcm9wID0gewogCS5uYW1lID0gImxpbnV4LGh0YWItYmFzZSIsCiAJLmxlbmd0aCA9IHNpemVvZih1bnNpZ25lZCBsb25nKSwKLQkudmFsdWUgPSAodW5zaWduZWQgY2hhciAqKSZodGFiX2Jhc2UsCisJLnZhbHVlID0gJmh0YWJfYmFzZSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcHJvcGVydHkgaHRhYl9zaXplX3Byb3AgPSB7CiAJLm5hbWUgPSAibGludXgsaHRhYi1zaXplIiwKIAkubGVuZ3RoID0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpLAotCS52YWx1ZSA9ICh1bnNpZ25lZCBjaGFyICopJmh0YWJfc2l6ZV9ieXRlcywKKwkudmFsdWUgPSAmaHRhYl9zaXplX2J5dGVzLAogfTsKIAogc3RhdGljIHN0cnVjdCBwcm9wZXJ0eSBrZXJuZWxfZW5kX3Byb3AgPSB7CiAJLm5hbWUgPSAibGludXgsa2VybmVsLWVuZCIsCiAJLmxlbmd0aCA9IHNpemVvZih1bnNpZ25lZCBsb25nKSwKLQkudmFsdWUgPSAodW5zaWduZWQgY2hhciAqKSZrZXJuZWxfZW5kLAorCS52YWx1ZSA9ICZrZXJuZWxfZW5kLAogfTsKIAogc3RhdGljIHZvaWQgX19pbml0IGV4cG9ydF9odGFiX3ZhbHVlcyh2b2lkKQpAQCAtMzM1LDcgKzMzNSw3IEBACiBzdGF0aWMgc3RydWN0IHByb3BlcnR5IGNyYXNoa19iYXNlX3Byb3AgPSB7CiAJLm5hbWUgPSAibGludXgsY3Jhc2hrZXJuZWwtYmFzZSIsCiAJLmxlbmd0aCA9IHNpemVvZih1bnNpZ25lZCBsb25nKSwKLQkudmFsdWUgPSAodW5zaWduZWQgY2hhciAqKSZjcmFzaGtfcmVzLnN0YXJ0LAorCS52YWx1ZSA9ICZjcmFzaGtfcmVzLnN0YXJ0LAogfTsKIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgY3Jhc2hrX3NpemU7CkBAIC0zNDMsNyArMzQzLDcgQEAKIHN0YXRpYyBzdHJ1Y3QgcHJvcGVydHkgY3Jhc2hrX3NpemVfcHJvcCA9IHsKIAkubmFtZSA9ICJsaW51eCxjcmFzaGtlcm5lbC1zaXplIiwKIAkubGVuZ3RoID0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpLAotCS52YWx1ZSA9ICh1bnNpZ25lZCBjaGFyICopJmNyYXNoa19zaXplLAorCS52YWx1ZSA9ICZjcmFzaGtfc2l6ZSwKIH07CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBleHBvcnRfY3Jhc2hrX3ZhbHVlcyh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9taXNjXzMyLlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL21pc2NfMzIuUwppbmRleCA0MTJiZWEzLi45OGRlY2Y4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL21pc2NfMzIuUworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL21pc2NfMzIuUwpAQCAtNzM0LDEwICs3MzQsNiBAQAogCXN1YglyMyxyMyxyNAogCWJscgogCi1fR0xPQkFMKF9nZXRfU1ApCi0JbXIJcjMscjEJCS8qIENsb3NlIGVub3VnaCAqLwotCWJscgotCiAvKgogICogQ3JlYXRlIGEga2VybmVsIHRocmVhZAogICogICBrZXJuZWxfdGhyZWFkKGZuLCBhcmcsIGZsYWdzKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9vZl9kZXZpY2UuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvb2ZfZGV2aWNlLmMKaW5kZXggZTkyMTUxNC4uMGM4ZWE3NiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9vZl9kZXZpY2UuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL29mX2RldmljZS5jCkBAIC0xMjAsNiArMTIwLDExNyBAQAogfQogCiAKK3N0YXRpYyBzc2l6ZV90IG9mX2RldmljZV9nZXRfbW9kYWxpYXMoc3RydWN0IG9mX2RldmljZSAqb2ZkZXYsCisJCQkJCWNoYXIgKnN0ciwgc3NpemVfdCBsZW4pCit7CisJY29uc3QgY2hhciAqY29tcGF0OworCWludCBjcGxlbiwgaTsKKwlzc2l6ZV90IHRzaXplLCBjc2l6ZSwgcmVwZW5kOworCisJLyogTmFtZSAmIFR5cGUgKi8KKwljc2l6ZSA9IHNucHJpbnRmKHN0ciwgbGVuLCAib2Y6TiVzVCVzIiwKKwkJCQlvZmRldi0+bm9kZS0+bmFtZSwgb2ZkZXYtPm5vZGUtPnR5cGUpOworCisJLyogR2V0IGNvbXBhdGlibGUgcHJvcGVydHkgaWYgYW55ICovCisJY29tcGF0ID0gb2ZfZ2V0X3Byb3BlcnR5KG9mZGV2LT5ub2RlLCAiY29tcGF0aWJsZSIsICZjcGxlbik7CisJaWYgKCFjb21wYXQpCisJCXJldHVybiBjc2l6ZTsKKworCS8qIEZpbmQgdHJ1ZSBlbmQgKHdlIHRvbGVyYXRlIG11bHRpcGxlIFwwIGF0IHRoZSBlbmQgKi8KKwlmb3IgKGk9KGNwbGVuLTEpOyBpPj0wICYmICFjb21wYXRbaV07IGktLSkKKwkJY3BsZW4tLTsKKwlpZiAoIWNwbGVuKQorCQlyZXR1cm4gY3NpemU7CisJY3BsZW4rKzsKKworCS8qIENoZWNrIHNwYWNlIChuZWVkIGNwbGVuKzEgY2hhcnMgaW5jbHVkaW5nIGZpbmFsIFwwKSAqLworCXRzaXplID0gY3NpemUgKyBjcGxlbjsKKwlyZXBlbmQgPSB0c2l6ZTsKKworCWlmIChjc2l6ZT49bGVuKQkJLyogQCB0aGUgbGltaXQsIGFsbCBpcyBhbHJlYWR5IGZpbGxlZCAqLworCQlyZXR1cm4gdHNpemU7CisKKwlpZiAodHNpemU+PWxlbikgewkJLyogbGltaXQgY29tcGF0IGxpc3QgKi8KKwkJY3BsZW4gPSBsZW4tY3NpemUtMTsKKwkJcmVwZW5kID0gbGVuOworCX0KKworCS8qIENvcHkgYW5kIGRvIGNoYXIgcmVwbGFjZW1lbnQgKi8KKwltZW1jcHkoJnN0cltjc2l6ZSsxXSwgY29tcGF0LCBjcGxlbik7CisJZm9yIChpPWNzaXplOyBpPHJlcGVuZDsgaSsrKSB7CisJCWNoYXIgYyA9IHN0cltpXTsKKwkJaWYgKGM9PSdcMCcpCisJCQlzdHJbaV0gPSAnQyc7CisJCWVsc2UgaWYgKGM9PScgJykKKwkJCXN0cltpXSA9ICdfJzsKKwl9CisKKwlyZXR1cm4gdHNpemU7Cit9CisKK2ludCBvZl9kZXZpY2VfdWV2ZW50KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJY2hhciAqKmVudnAsIGludCBudW1fZW52cCwgY2hhciAqYnVmZmVyLCBpbnQgYnVmZmVyX3NpemUpCit7CisJc3RydWN0IG9mX2RldmljZSAqb2ZkZXY7CisJY29uc3QgY2hhciAqY29tcGF0OworCWludCBpID0gMCwgbGVuZ3RoID0gMCwgc2VlbiA9IDAsIGNwbGVuLCBzbDsKKworCWlmICghZGV2KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCW9mZGV2ID0gdG9fb2ZfZGV2aWNlKGRldik7CisKKwlpZiAoYWRkX3VldmVudF92YXIoZW52cCwgbnVtX2VudnAsICZpLAorCQkJICAgYnVmZmVyLCBidWZmZXJfc2l6ZSwgJmxlbmd0aCwKKwkJCSAgICJPRl9OQU1FPSVzIiwgb2ZkZXYtPm5vZGUtPm5hbWUpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChhZGRfdWV2ZW50X3ZhcihlbnZwLCBudW1fZW52cCwgJmksCisJCQkgICBidWZmZXIsIGJ1ZmZlcl9zaXplLCAmbGVuZ3RoLAorCQkJICAgIk9GX1RZUEU9JXMiLCBvZmRldi0+bm9kZS0+dHlwZSkpCisJCXJldHVybiAtRU5PTUVNOworCisgICAgICAgIC8qIFNpbmNlIHRoZSBjb21wYXRpYmxlIGZpZWxkIGNhbiBjb250YWluIHByZXR0eSBtdWNoIGFueXRoaW5nCisgICAgICAgICAqIGl0J3Mgbm90IHJlYWxseSBsZWdhbCB0byBzcGxpdCBpdCBvdXQgd2l0aCBjb21tYXMuIFdlIHNwbGl0IGl0CisgICAgICAgICAqIHVwIHVzaW5nIGEgbnVtYmVyIG9mIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbnN0ZWFkLiAqLworCisJY29tcGF0ID0gb2ZfZ2V0X3Byb3BlcnR5KG9mZGV2LT5ub2RlLCAiY29tcGF0aWJsZSIsICZjcGxlbik7CisJd2hpbGUgKGNvbXBhdCAmJiAqY29tcGF0ICYmIGNwbGVuID4gMCkgeworCQlpZiAoYWRkX3VldmVudF92YXIoZW52cCwgbnVtX2VudnAsICZpLAorCQkJCSAgIGJ1ZmZlciwgYnVmZmVyX3NpemUsICZsZW5ndGgsCisJCQkJICAgIk9GX0NPTVBBVElCTEVfJWQ9JXMiLCBzZWVuLCBjb21wYXQpKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJc2wgPSBzdHJsZW4gKGNvbXBhdCkgKyAxOworCQljb21wYXQgKz0gc2w7CisJCWNwbGVuIC09IHNsOworCQlzZWVuKys7CisJfQorCisJaWYgKGFkZF91ZXZlbnRfdmFyKGVudnAsIG51bV9lbnZwLCAmaSwKKwkJCSAgIGJ1ZmZlciwgYnVmZmVyX3NpemUsICZsZW5ndGgsCisJCQkgICAiT0ZfQ09NUEFUSUJMRV9OPSVkIiwgc2VlbikpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogbW9kYWxpYXMgaXMgdHJpY2tpZXIsIHdlIGFkZCBpdCBpbiAyIHN0ZXBzICovCisJaWYgKGFkZF91ZXZlbnRfdmFyKGVudnAsIG51bV9lbnZwLCAmaSwKKwkJCSAgIGJ1ZmZlciwgYnVmZmVyX3NpemUsICZsZW5ndGgsCisJCQkgICAiTU9EQUxJQVM9IikpCisJCXJldHVybiAtRU5PTUVNOworCisJc2wgPSBvZl9kZXZpY2VfZ2V0X21vZGFsaWFzKG9mZGV2LCAmYnVmZmVyW2xlbmd0aC0xXSwKKwkJCQkJYnVmZmVyX3NpemUtbGVuZ3RoKTsKKwlpZiAoc2wgPj0gKGJ1ZmZlcl9zaXplLWxlbmd0aCkpCisJCXJldHVybiAtRU5PTUVNOworCisJbGVuZ3RoICs9IHNsOworCisJZW52cFtpXSA9IE5VTEw7CisKKwlyZXR1cm4gMDsKK30KKworCiBFWFBPUlRfU1lNQk9MKG9mX21hdGNoX25vZGUpOwogRVhQT1JUX1NZTUJPTChvZl9tYXRjaF9kZXZpY2UpOwogRVhQT1JUX1NZTUJPTChvZl9kZXZpY2VfcmVnaXN0ZXIpOwpAQCAtMTI3LDMgKzIzOCw0IEBACiBFWFBPUlRfU1lNQk9MKG9mX2Rldl9nZXQpOwogRVhQT1JUX1NZTUJPTChvZl9kZXZfcHV0KTsKIEVYUE9SVF9TWU1CT0wob2ZfcmVsZWFzZV9kZXYpOworRVhQT1JUX1NZTUJPTChvZl9kZXZpY2VfdWV2ZW50KTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvb2ZfcGxhdGZvcm0uYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvb2ZfcGxhdGZvcm0uYwppbmRleCBiNzM0NTE3Li45MDhlZDc5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL29mX3BsYXRmb3JtLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9vZl9wbGF0Zm9ybS5jCkBAIC0xMzMsNiArMTMzLDcgQEAKIHN0cnVjdCBidXNfdHlwZSBvZl9wbGF0Zm9ybV9idXNfdHlwZSA9IHsKICAgICAgICAubmFtZQk9ICJvZl9wbGF0Zm9ybSIsCiAgICAgICAgLm1hdGNoCT0gb2ZfcGxhdGZvcm1fYnVzX21hdGNoLAorICAgICAgIC51ZXZlbnQJPSBvZl9kZXZpY2VfdWV2ZW50LAogICAgICAgIC5wcm9iZQk9IG9mX3BsYXRmb3JtX2RldmljZV9wcm9iZSwKICAgICAgICAucmVtb3ZlCT0gb2ZfcGxhdGZvcm1fZGV2aWNlX3JlbW92ZSwKICAgICAgICAuc3VzcGVuZAk9IG9mX3BsYXRmb3JtX2RldmljZV9zdXNwZW5kLApAQCAtMTc3LDcgKzE3OCw3IEBACiAJICogYW5kICdEJyBmb3IgTU1JTyBEQ1JzLgogCSAqLwogI2lmZGVmIENPTkZJR19QUENfRENSCi0JcmVnID0gZ2V0X3Byb3BlcnR5KG5vZGUsICJkY3ItcmVnIiwgTlVMTCk7CisJcmVnID0gb2ZfZ2V0X3Byb3BlcnR5KG5vZGUsICJkY3ItcmVnIiwgTlVMTCk7CiAJaWYgKHJlZykgewogI2lmZGVmIENPTkZJR19QUENfRENSX05BVElWRQogCQlzbnByaW50ZihuYW1lLCBCVVNfSURfU0laRSwgImQleC4lcyIsCkBAIC0xOTcsNyArMTk4LDcgQEAKIAkvKgogCSAqIEZvciBNTUlPLCBnZXQgdGhlIHBoeXNpY2FsIGFkZHJlc3MKIAkgKi8KLQlyZWcgPSBnZXRfcHJvcGVydHkobm9kZSwgInJlZyIsIE5VTEwpOworCXJlZyA9IG9mX2dldF9wcm9wZXJ0eShub2RlLCAicmVnIiwgTlVMTCk7CiAJaWYgKHJlZykgewogCQlhZGRyID0gb2ZfdHJhbnNsYXRlX2FkZHJlc3Mobm9kZSwgcmVnKTsKIAkJaWYgKGFkZHIgIT0gT0ZfQkFEX0FERFIpIHsKQEAgLTQ3NSw5ICs0NzYsNiBAQAogICAgICAgIC5uYW1lID0gIm9mLXBjaSIsCiAgICAgICAgLm1hdGNoX3RhYmxlID0gb2ZfcGNpX3BoYl9pZHMsCiAgICAgICAgLnByb2JlID0gb2ZfcGNpX3BoYl9wcm9iZSwKLSAgICAgICAuZHJpdmVyID0gewotCSAgICAgICAubXVsdGl0aHJlYWRfcHJvYmUgPSAxLAotICAgICAgIH0sCiB9OwogCiBzdGF0aWMgX19pbml0IGludCBvZl9wY2lfcGhiX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpXzMyLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3BjaV8zMi5jCmluZGV4IGQ4ZWYyZTEuLmYwMjI4NjIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpXzMyLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfMzIuYwpAQCAtNjM3LDcgKzYzNyw3IEBACiAKIAlpZiAocGNpX2J1cyA+PSBwY2lfYnVzX2NvdW50KQogCQlyZXR1cm47Ci0JYnVzX3JhbmdlID0gZ2V0X3Byb3BlcnR5KG5vZGUsICJidXMtcmFuZ2UiLCAmbGVuKTsKKwlidXNfcmFuZ2UgPSBvZl9nZXRfcHJvcGVydHkobm9kZSwgImJ1cy1yYW5nZSIsICZsZW4pOwogCWlmIChidXNfcmFuZ2UgPT0gTlVMTCB8fCBsZW4gPCAyICogc2l6ZW9mKGludCkpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiQ2FuJ3QgZ2V0IGJ1cy1yYW5nZSBmb3IgJXMsICIKIAkJICAgICAgICJhc3N1bWluZyBpdCBzdGFydHMgYXQgMFxuIiwgbm9kZS0+ZnVsbF9uYW1lKTsKQEAgLTY0OSwxNyArNjQ5LDIwIEBACiAJCXN0cnVjdCBwY2lfZGV2KiBkZXY7CiAJCWNvbnN0IHVuc2lnbmVkIGludCAqY2xhc3NfY29kZSwgKnJlZzsKIAkKLQkJY2xhc3NfY29kZSA9IGdldF9wcm9wZXJ0eShub2RlLCAiY2xhc3MtY29kZSIsIE5VTEwpOworCQljbGFzc19jb2RlID0gb2ZfZ2V0X3Byb3BlcnR5KG5vZGUsICJjbGFzcy1jb2RlIiwgTlVMTCk7CiAJCWlmICghY2xhc3NfY29kZSB8fCAoKCpjbGFzc19jb2RlID4+IDgpICE9IFBDSV9DTEFTU19CUklER0VfUENJICYmCiAJCQkoKmNsYXNzX2NvZGUgPj4gOCkgIT0gUENJX0NMQVNTX0JSSURHRV9DQVJEQlVTKSkKIAkJCWNvbnRpbnVlOwotCQlyZWcgPSBnZXRfcHJvcGVydHkobm9kZSwgInJlZyIsIE5VTEwpOworCQlyZWcgPSBvZl9nZXRfcHJvcGVydHkobm9kZSwgInJlZyIsIE5VTEwpOwogCQlpZiAoIXJlZykKIAkJCWNvbnRpbnVlOwotCQlkZXYgPSBwY2lfZmluZF9zbG90KHBjaV9idXMsICgocmVnWzBdID4+IDgpICYgMHhmZikpOwotCQlpZiAoIWRldiB8fCAhZGV2LT5zdWJvcmRpbmF0ZSkKKwkJZGV2ID0gcGNpX2dldF9idXNfYW5kX3Nsb3QocGNpX2J1cywgKChyZWdbMF0gPj4gOCkgJiAweGZmKSk7CisJCWlmICghZGV2IHx8ICFkZXYtPnN1Ym9yZGluYXRlKSB7CisJCQlwY2lfZGV2X3B1dChkZXYpOwogCQkJY29udGludWU7CisJCX0KIAkJbWFrZV9vbmVfbm9kZV9tYXAobm9kZSwgZGV2LT5zdWJvcmRpbmF0ZS0+bnVtYmVyKTsKKwkJcGNpX2Rldl9wdXQoZGV2KTsKIAl9CiB9CiAJCkBAIC02NjksNiArNjcyLDcgQEAKIAlpbnQgaTsKIAlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIqIGhvc2U7CiAJc3RydWN0IHByb3BlcnR5ICptYXBfcHJvcDsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuOwogCiAJcGNpX3RvX09GX2J1c19tYXAgPSBrbWFsbG9jKHBjaV9idXNfY291bnQsIEdGUF9LRVJORUwpOwogCWlmICghcGNpX3RvX09GX2J1c19tYXApIHsKQEAgLTY5MCwxMiArNjk0LDEzIEBACiAJCQljb250aW51ZTsKIAkJbWFrZV9vbmVfbm9kZV9tYXAobm9kZSwgaG9zZS0+Zmlyc3RfYnVzbm8pOwogCX0KLQltYXBfcHJvcCA9IG9mX2ZpbmRfcHJvcGVydHkoZmluZF9wYXRoX2RldmljZSgiLyIpLAotCQkJInBjaS1PRi1idXMtbWFwIiwgTlVMTCk7CisJZG4gPSBvZl9maW5kX25vZGVfYnlfcGF0aCgiLyIpOworCW1hcF9wcm9wID0gb2ZfZmluZF9wcm9wZXJ0eShkbiwgInBjaS1PRi1idXMtbWFwIiwgTlVMTCk7CiAJaWYgKG1hcF9wcm9wKSB7CiAJCUJVR19PTihwY2lfYnVzX2NvdW50ID4gbWFwX3Byb3AtPmxlbmd0aCk7CiAJCW1lbWNweShtYXBfcHJvcC0+dmFsdWUsIHBjaV90b19PRl9idXNfbWFwLCBwY2lfYnVzX2NvdW50KTsKIAl9CisJb2Zfbm9kZV9wdXQoZG4pOwogI2lmZGVmIERFQlVHCiAJcHJpbnRrKCJQQ0ktPk9GIGJ1cyBtYXA6XG4iKTsKIAlmb3IgKGk9MDsgaTxwY2lfYnVzX2NvdW50OyBpKyspIHsKQEAgLTcyNCw3ICs3MjksNyBAQAogCQkgKiBhIGZha2Ugcm9vdCBmb3IgYWxsIGZ1bmN0aW9ucyBvZiBhIG11bHRpLWZ1bmN0aW9uIGRldmljZSwKIAkJICogd2UgZ28gZG93biB0aGVtIGFzIHdlbGwuCiAJCSAqLwotCQljbGFzc19jb2RlID0gZ2V0X3Byb3BlcnR5KG5vZGUsICJjbGFzcy1jb2RlIiwgTlVMTCk7CisJCWNsYXNzX2NvZGUgPSBvZl9nZXRfcHJvcGVydHkobm9kZSwgImNsYXNzLWNvZGUiLCBOVUxMKTsKIAkJaWYgKCghY2xhc3NfY29kZSB8fCAoKCpjbGFzc19jb2RlID4+IDgpICE9IFBDSV9DTEFTU19CUklER0VfUENJICYmCiAJCQkoKmNsYXNzX2NvZGUgPj4gOCkgIT0gUENJX0NMQVNTX0JSSURHRV9DQVJEQlVTKSkgJiYKIAkJCXN0cmNtcChub2RlLT5uYW1lLCAibXVsdGlmdW5jLWRldmljZSIpKQpAQCAtNzQ0LDcgKzc0OSw3IEBACiAJdW5zaWduZWQgaW50IHBzaXplOwogCiAJd2hpbGUgKChucCA9IG9mX2dldF9uZXh0X2NoaWxkKHBhcmVudCwgbnApKSAhPSBOVUxMKSB7Ci0JCXJlZyA9IGdldF9wcm9wZXJ0eShucCwgInJlZyIsICZwc2l6ZSk7CisJCXJlZyA9IG9mX2dldF9wcm9wZXJ0eShucCwgInJlZyIsICZwc2l6ZSk7CiAJCWlmIChyZWcgPT0gTlVMTCB8fCBwc2l6ZSA8IDQpCiAJCQljb250aW51ZTsKIAkJaWYgKCgocmVnWzBdID4+IDgpICYgMHhmZikgPT0gZGV2Zm4pCkBAIC04NTksNyArODY0LDcgQEAKIAlpZiAoIXNjYW5fT0ZfcGNpX2NoaWxkcygoKHN0cnVjdCBkZXZpY2Vfbm9kZSopaG9zZS0+YXJjaF9kYXRhKS0+Y2hpbGQsCiAJCQlmaW5kX09GX3BjaV9kZXZpY2VfZmlsdGVyLCAodm9pZCAqKW5vZGUpKQogCQlyZXR1cm4gLUVOT0RFVjsKLQlyZWcgPSBnZXRfcHJvcGVydHkobm9kZSwgInJlZyIsIE5VTEwpOworCXJlZyA9IG9mX2dldF9wcm9wZXJ0eShub2RlLCAicmVnIiwgTlVMTCk7CiAJaWYgKCFyZWcpCiAJCXJldHVybiAtRU5PREVWOwogCSpidXMgPSAocmVnWzBdID4+IDE2KSAmIDB4ZmY7CkBAIC04OTUsMTQgKzkwMCwxNCBAQAogCWludCBybGVuID0gMCwgb3JpZ19ybGVuOwogCWludCBtZW1ubyA9IDA7CiAJc3RydWN0IHJlc291cmNlICpyZXM7Ci0JaW50IG5wLCBuYSA9IHByb21fbl9hZGRyX2NlbGxzKGRldik7CisJaW50IG5wLCBuYSA9IG9mX25fYWRkcl9jZWxscyhkZXYpOwogCW5wID0gbmEgKyA1OwogCiAJLyogRmlyc3Qgd2UgdHJ5IHRvIG1lcmdlIHJhbmdlcyB0byBmaXggYSBwcm9ibGVtIHdpdGggc29tZSBwbWFjcwogCSAqIHRoYXQgY2FuIGhhdmUgbW9yZSB0aGFuIDMgcmFuZ2VzLCBmb3J0dW5hdGVseSB1c2luZyBjb250aWd1b3VzCiAJICogYWRkcmVzc2VzIC0tIEJlbkgKIAkgKi8KLQlkdF9yYW5nZXMgPSBnZXRfcHJvcGVydHkoZGV2LCAicmFuZ2VzIiwgJnJsZW4pOworCWR0X3JhbmdlcyA9IG9mX2dldF9wcm9wZXJ0eShkZXYsICJyYW5nZXMiLCAmcmxlbik7CiAJaWYgKCFkdF9yYW5nZXMpCiAJCXJldHVybjsKIAkvKiBTYW5pdHkgY2hlY2ssIHRob3VnaCBob3BlZnVsbHkgdGhhdCBuZXZlciBoYXBwZW5zICovCkBAIC0xMDA2LDE0ICsxMDExLDE5IEBACiBwY2lfY3JlYXRlX09GX2J1c19tYXAodm9pZCkKIHsKIAlzdHJ1Y3QgcHJvcGVydHkqIG9mX3Byb3A7Ci0JCisJc3RydWN0IGRldmljZV9ub2RlICpkbjsKKwogCW9mX3Byb3AgPSAoc3RydWN0IHByb3BlcnR5KikgYWxsb2NfYm9vdG1lbShzaXplb2Yoc3RydWN0IHByb3BlcnR5KSArIDI1Nik7Ci0JaWYgKG9mX3Byb3AgJiYgZmluZF9wYXRoX2RldmljZSgiLyIpKSB7CisJaWYgKCFvZl9wcm9wKQorCQlyZXR1cm47CisJZG4gPSBvZl9maW5kX25vZGVfYnlfcGF0aCgiLyIpOworCWlmIChkbikgewogCQltZW1zZXQob2ZfcHJvcCwgLTEsIHNpemVvZihzdHJ1Y3QgcHJvcGVydHkpICsgMjU2KTsKIAkJb2ZfcHJvcC0+bmFtZSA9ICJwY2ktT0YtYnVzLW1hcCI7CiAJCW9mX3Byb3AtPmxlbmd0aCA9IDI1NjsKLQkJb2ZfcHJvcC0+dmFsdWUgPSAodW5zaWduZWQgY2hhciAqKSZvZl9wcm9wWzFdOwotCQlwcm9tX2FkZF9wcm9wZXJ0eShmaW5kX3BhdGhfZGV2aWNlKCIvIiksIG9mX3Byb3ApOworCQlvZl9wcm9wLT52YWx1ZSA9ICZvZl9wcm9wWzFdOworCQlwcm9tX2FkZF9wcm9wZXJ0eShkbiwgb2ZfcHJvcCk7CisJCW9mX25vZGVfcHV0KGRuKTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpXzY0LmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3BjaV82NC5jCmluZGV4IDdlOTdkNzEuLjYwZDdkNGIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpXzY0LmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfNjQuYwpAQCAtNjEsOCArNjEsNyBAQAogCiBMSVNUX0hFQUQoaG9zZV9saXN0KTsKIAotc3RydWN0IGRtYV9tYXBwaW5nX29wcyAqcGNpX2RtYV9vcHM7Ci1FWFBPUlRfU1lNQk9MKHBjaV9kbWFfb3BzKTsKK3N0YXRpYyBzdHJ1Y3QgZG1hX21hcHBpbmdfb3BzICpwY2lfZG1hX29wczsKIAogaW50IGdsb2JhbF9waGJfbnVtYmVyOwkJLyogR2xvYmFsIHBoYiBjb3VudGVyICovCiAKQEAgLTcwLDYgKzY5LDE3IEBACiBzdHJ1Y3QgcGNpX2RldiAqcHBjNjRfaXNhYnJpZGdlX2RldiA9IE5VTEw7CiBFWFBPUlRfU1lNQk9MX0dQTChwcGM2NF9pc2FicmlkZ2VfZGV2KTsKIAordm9pZCBzZXRfcGNpX2RtYV9vcHMoc3RydWN0IGRtYV9tYXBwaW5nX29wcyAqZG1hX29wcykKK3sKKwlwY2lfZG1hX29wcyA9IGRtYV9vcHM7Cit9CisKK3N0cnVjdCBkbWFfbWFwcGluZ19vcHMgKmdldF9wY2lfZG1hX29wcyh2b2lkKQoreworCXJldHVybiBwY2lfZG1hX29wczsKK30KK0VYUE9SVF9TWU1CT0woZ2V0X3BjaV9kbWFfb3BzKTsKKwogc3RhdGljIHZvaWQgZml4dXBfYnJva2VuX3BjbmV0MzIoc3RydWN0IHBjaV9kZXYqIGRldikKIHsKIAlpZiAoKGRldi0+Y2xhc3M+PjggPT0gUENJX0NMQVNTX05FVFdPUktfRVRIRVJORVQpKSB7CkBAIC0yNTgsNyArMjY4LDcgQEAKIAljb25zdCB1MzIgKnByb3A7CiAJaW50IGxlbjsKIAotCXByb3AgPSBnZXRfcHJvcGVydHkobnAsIG5hbWUsICZsZW4pOworCXByb3AgPSBvZl9nZXRfcHJvcGVydHkobnAsIG5hbWUsICZsZW4pOwogCWlmIChwcm9wICYmIGxlbiA+PSA0KQogCQlyZXR1cm4gKnByb3A7CiAJcmV0dXJuIGRlZjsKQEAgLTI5MSw3ICszMDEsNyBAQAogCXUzMiBpOwogCWludCBwcm9wbGVuOwogCi0JYWRkcnMgPSBnZXRfcHJvcGVydHkobm9kZSwgImFzc2lnbmVkLWFkZHJlc3NlcyIsICZwcm9wbGVuKTsKKwlhZGRycyA9IG9mX2dldF9wcm9wZXJ0eShub2RlLCAiYXNzaWduZWQtYWRkcmVzc2VzIiwgJnByb3BsZW4pOwogCWlmICghYWRkcnMpCiAJCXJldHVybjsKIAlEQkcoIiAgICBwYXJzZSBhZGRyZXNzZXMgKCVkIGJ5dGVzKSBAICVwXG4iLCBwcm9wbGVuLCBhZGRycyk7CkBAIC0zMzMsNyArMzQzLDcgQEAKIAlkZXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcGNpX2RldiksIEdGUF9LRVJORUwpOwogCWlmICghZGV2KQogCQlyZXR1cm4gTlVMTDsKLQl0eXBlID0gZ2V0X3Byb3BlcnR5KG5vZGUsICJkZXZpY2VfdHlwZSIsIE5VTEwpOworCXR5cGUgPSBvZl9nZXRfcHJvcGVydHkobm9kZSwgImRldmljZV90eXBlIiwgTlVMTCk7CiAJaWYgKHR5cGUgPT0gTlVMTCkKIAkJdHlwZSA9ICIiOwogCkBAIC0zOTcsNyArNDA3LDcgQEAKIAogCXdoaWxlICgoY2hpbGQgPSBvZl9nZXRfbmV4dF9jaGlsZChub2RlLCBjaGlsZCkpICE9IE5VTEwpIHsKIAkJREJHKCIgICogJXNcbiIsIGNoaWxkLT5mdWxsX25hbWUpOwotCQlyZWcgPSBnZXRfcHJvcGVydHkoY2hpbGQsICJyZWciLCAmcmVnbGVuKTsKKwkJcmVnID0gb2ZfZ2V0X3Byb3BlcnR5KGNoaWxkLCAicmVnIiwgJnJlZ2xlbik7CiAJCWlmIChyZWcgPT0gTlVMTCB8fCByZWdsZW4gPCAyMCkKIAkJCWNvbnRpbnVlOwogCQlkZXZmbiA9IChyZWdbMF0gPj4gOCkgJiAweGZmOwpAQCAtNDMwLDEzICs0NDAsMTMgQEAKIAlEQkcoIm9mX3NjYW5fcGNpX2JyaWRnZSglcylcbiIsIG5vZGUtPmZ1bGxfbmFtZSk7CiAKIAkvKiBwYXJzZSBidXMtcmFuZ2UgcHJvcGVydHkgKi8KLQlidXNyYW5nZSA9IGdldF9wcm9wZXJ0eShub2RlLCAiYnVzLXJhbmdlIiwgJmxlbik7CisJYnVzcmFuZ2UgPSBvZl9nZXRfcHJvcGVydHkobm9kZSwgImJ1cy1yYW5nZSIsICZsZW4pOwogCWlmIChidXNyYW5nZSA9PSBOVUxMIHx8IGxlbiAhPSA4KSB7CiAJCXByaW50ayhLRVJOX0RFQlVHICJDYW4ndCBnZXQgYnVzLXJhbmdlIGZvciBQQ0ktUENJIGJyaWRnZSAlc1xuIiwKIAkJICAgICAgIG5vZGUtPmZ1bGxfbmFtZSk7CiAJCXJldHVybjsKIAl9Ci0JcmFuZ2VzID0gZ2V0X3Byb3BlcnR5KG5vZGUsICJyYW5nZXMiLCAmbGVuKTsKKwlyYW5nZXMgPSBvZl9nZXRfcHJvcGVydHkobm9kZSwgInJhbmdlcyIsICZsZW4pOwogCWlmIChyYW5nZXMgPT0gTlVMTCkgewogCQlwcmludGsoS0VSTl9ERUJVRyAiQ2FuJ3QgZ2V0IHJhbmdlcyBmb3IgUENJLVBDSSBicmlkZ2UgJXNcbiIsCiAJCSAgICAgICBub2RlLT5mdWxsX25hbWUpOwpAQCAtOTAwLDcgKzkxMCw3IEBACiAJdW5zaWduZWQgaW50IHNpemU7CiAJaW50IHJsZW4gPSAwOwogCi0JcmFuZ2UgPSBnZXRfcHJvcGVydHkoaXNhX25vZGUsICJyYW5nZXMiLCAmcmxlbik7CisJcmFuZ2UgPSBvZl9nZXRfcHJvcGVydHkoaXNhX25vZGUsICJyYW5nZXMiLCAmcmxlbik7CiAJaWYgKHJhbmdlID09IE5VTEwgfHwgKHJsZW4gPCBzaXplb2Yoc3RydWN0IGlzYV9yYW5nZSkpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAibm8gSVNBIHJhbmdlcyBvciB1bmV4cGVjdGVkIGlzYSByYW5nZSBzaXplLCIKIAkJICAgICAgICJtYXBwaW5nIDY0a1xuIik7CkBAIC05NDcsNyArOTU3LDcgQEAKIAlpbnQgcmxlbiA9IDA7CiAJaW50IG1lbW5vID0gMDsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKLQlpbnQgbnAsIG5hID0gcHJvbV9uX2FkZHJfY2VsbHMoZGV2KTsKKwlpbnQgbnAsIG5hID0gb2Zfbl9hZGRyX2NlbGxzKGRldik7CiAJdW5zaWduZWQgbG9uZyBwY2lfYWRkciwgY3B1X3BoeXNfYWRkcjsKIAogCW5wID0gbmEgKyA1OwpAQCAtOTYwLDcgKzk3MCw3IEBACiAJICoJCQkoc2l6ZSBkZXBlbmRpbmcgb24gZGV2LT5uX2FkZHJfY2VsbHMpCiAJICogICBjZWxscyA0KzUgb3IgNSs2Ogl0aGUgc2l6ZSBvZiB0aGUgcmFuZ2UKIAkgKi8KLQlyYW5nZXMgPSBnZXRfcHJvcGVydHkoZGV2LCAicmFuZ2VzIiwgJnJsZW4pOworCXJhbmdlcyA9IG9mX2dldF9wcm9wZXJ0eShkZXYsICJyYW5nZXMiLCAmcmxlbik7CiAJaWYgKHJhbmdlcyA9PSBOVUxMKQogCQlyZXR1cm47CiAJaG9zZS0+aW9fYmFzZV9waHlzID0gMDsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpX2RuLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3BjaV9kbi5jCmluZGV4IDY4ZGYwMTguLmQ3ZDM2ZGYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpX2RuLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfZG4uYwpAQCAtNDAsNyArNDAsOCBAQAogc3RhdGljIHZvaWQgKiBfX2RldmluaXQgdXBkYXRlX2RuX3BjaV9pbmZvKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZG4sIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IHBjaV9jb250cm9sbGVyICpwaGIgPSBkYXRhOwotCWNvbnN0IGludCAqdHlwZSA9IGdldF9wcm9wZXJ0eShkbiwgImlibSxwY2ktY29uZmlnLXNwYWNlLXR5cGUiLCBOVUxMKTsKKwljb25zdCBpbnQgKnR5cGUgPQorCQlvZl9nZXRfcHJvcGVydHkoZG4sICJpYm0scGNpLWNvbmZpZy1zcGFjZS10eXBlIiwgTlVMTCk7CiAJY29uc3QgdTMyICpyZWdzOwogCXN0cnVjdCBwY2lfZG4gKnBkbjsKIApAQCAtNTQsMTQgKzU1LDE0IEBACiAJZG4tPmRhdGEgPSBwZG47CiAJcGRuLT5ub2RlID0gZG47CiAJcGRuLT5waGIgPSBwaGI7Ci0JcmVncyA9IGdldF9wcm9wZXJ0eShkbiwgInJlZyIsIE5VTEwpOworCXJlZ3MgPSBvZl9nZXRfcHJvcGVydHkoZG4sICJyZWciLCBOVUxMKTsKIAlpZiAocmVncykgewogCQkvKiBGaXJzdCByZWdpc3RlciBlbnRyeSBpcyBhZGRyICgwMEJCU1MwMCkgICovCiAJCXBkbi0+YnVzbm8gPSAocmVnc1swXSA+PiAxNikgJiAweGZmOwogCQlwZG4tPmRldmZuID0gKHJlZ3NbMF0gPj4gOCkgJiAweGZmOwogCX0KIAlpZiAoZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9JU0VSSUVTKSkgewotCQljb25zdCB1MzIgKmJ1c3AgPSBnZXRfcHJvcGVydHkoZG4sICJsaW51eCxzdWJidXMiLCBOVUxMKTsKKwkJY29uc3QgdTMyICpidXNwID0gb2ZfZ2V0X3Byb3BlcnR5KGRuLCAibGludXgsc3ViYnVzIiwgTlVMTCk7CiAJCWlmIChidXNwKQogCQkJcGRuLT5idXNzdWJubyA9ICpidXNwOwogCX0KQEAgLTEwMCw3ICsxMDEsNyBAQAogCQl1MzIgY2xhc3M7CiAKIAkJbmV4dGRuID0gTlVMTDsKLQkJY2xhc3NwID0gZ2V0X3Byb3BlcnR5KGRuLCAiY2xhc3MtY29kZSIsIE5VTEwpOworCQljbGFzc3AgPSBvZl9nZXRfcHJvcGVydHkoZG4sICJjbGFzcy1jb2RlIiwgTlVMTCk7CiAJCWNsYXNzID0gY2xhc3NwID8gKmNsYXNzcCA6IDA7CiAKIAkJaWYgKHByZSAmJiAoKHJldCA9IHByZShkbiwgZGF0YSkpICE9IE5VTEwpKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcGNfa3N5bXMuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHBjX2tzeW1zLmMKaW5kZXggZWNlZTU5Ni4uZmYyNTJhYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcGNfa3N5bXMuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3BwY19rc3ltcy5jCkBAIC0yMCw3ICsyMCw2IEBACiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL2lkZS5oPgogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KICNpbmNsdWRlIDxhc20vY2hlY2tzdW0uaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgpAQCAtODQsOCArODMsNiBAQAogRVhQT1JUX1NZTUJPTChzdHJjYXQpOwogRVhQT1JUX1NZTUJPTChzdHJsZW4pOwogRVhQT1JUX1NZTUJPTChzdHJjbXApOwotRVhQT1JUX1NZTUJPTChzdHJjYXNlY21wKTsKLUVYUE9SVF9TWU1CT0woc3RybmNhc2VjbXApOwogCiBFWFBPUlRfU1lNQk9MKGNzdW1fcGFydGlhbCk7CiBFWFBPUlRfU1lNQk9MKGNzdW1fcGFydGlhbF9jb3B5X2dlbmVyaWMpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Byb2Nlc3MuYwppbmRleCBlNTNiMjk4Li5lNTA5YWFlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Byb2Nlc3MuYwpAQCAtMzA1LDkgKzMwNSw3IEBACiAJCXNldF9kYWJyKG5ldy0+dGhyZWFkLmRhYnIpOwogCQlfX2dldF9jcHVfdmFyKGN1cnJlbnRfZGFicikgPSBuZXctPnRocmVhZC5kYWJyOwogCX0KLQotCWZsdXNoX3RsYl9wZW5kaW5nKCk7Ci0jZW5kaWYKKyNlbmRpZiAvKiBDT05GSUdfUFBDNjQgKi8KIAogCW5ld190aHJlYWQgPSAmbmV3LT50aHJlYWQ7CiAJb2xkX3RocmVhZCA9ICZjdXJyZW50LT50aHJlYWQ7CkBAIC00MDIsMTEgKzQwMCwxMSBAQAogfQogCiAjaWZkZWYgQ09ORklHX1BQQzY0Ci0jZGVmaW5lIFJFRwkJIiUwMTZsWCIKKyNkZWZpbmUgUkVHCQkiJTAxNmx4IgogI2RlZmluZSBSRUdTX1BFUl9MSU5FCTQKICNkZWZpbmUgTEFTVF9WT0xBVElMRQkxMwogI2Vsc2UKLSNkZWZpbmUgUkVHCQkiJTA4bFgiCisjZGVmaW5lIFJFRwkJIiUwOGx4IgogI2RlZmluZSBSRUdTX1BFUl9MSU5FCTgKICNkZWZpbmUgTEFTVF9WT0xBVElMRQkxMgogI2VuZGlmCkBAIC00MjEsNyArNDE5LDcgQEAKIAkgICAgICAgcmVncywgcmVncy0+dHJhcCwgcHJpbnRfdGFpbnRlZCgpLCBpbml0X3V0c25hbWUoKS0+cmVsZWFzZSk7CiAJcHJpbnRrKCJNU1I6ICJSRUciICIsIHJlZ3MtPm1zcik7CiAJcHJpbnRiaXRzKHJlZ3MtPm1zciwgbXNyX2JpdHMpOwotCXByaW50aygiICBDUjogJTA4bFggIFhFUjogJTA4bFhcbiIsIHJlZ3MtPmNjciwgcmVncy0+eGVyKTsKKwlwcmludGsoIiAgQ1I6ICUwOGx4ICBYRVI6ICUwOGx4XG4iLCByZWdzLT5jY3IsIHJlZ3MtPnhlcik7CiAJdHJhcCA9IFRSQVAocmVncyk7CiAJaWYgKHRyYXAgPT0gMHgzMDAgfHwgdHJhcCA9PSAweDYwMCkKIAkJcHJpbnRrKCJEQVI6ICJSRUciLCBEU0lTUjogIlJFRyJcbiIsIHJlZ3MtPmRhciwgcmVncy0+ZHNpc3IpOwpAQCAtNTcyLDcgKzU3MCw2IEBACiAJa3JlZ3MtPm5pcCA9ICooKHVuc2lnbmVkIGxvbmcgKilyZXRfZnJvbV9mb3JrKTsKICNlbHNlCiAJa3JlZ3MtPm5pcCA9ICh1bnNpZ25lZCBsb25nKXJldF9mcm9tX2Zvcms7Ci0JcC0+dGhyZWFkLmxhc3Rfc3lzY2FsbCA9IC0xOwogI2VuZGlmCiAKIAlyZXR1cm4gMDsKQEAgLTgyMyw2ICs4MjAsMzUgQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKKyNpZmRlZiBDT05GSUdfSVJRU1RBQ0tTCitzdGF0aWMgaW5saW5lIGludCB2YWxpZF9pcnFfc3RhY2sodW5zaWduZWQgbG9uZyBzcCwgc3RydWN0IHRhc2tfc3RydWN0ICpwLAorCQkJCSAgdW5zaWduZWQgbG9uZyBuYnl0ZXMpCit7CisJdW5zaWduZWQgbG9uZyBzdGFja19wYWdlOworCXVuc2lnbmVkIGxvbmcgY3B1ID0gdGFza19jcHUocCk7CisKKwkvKgorCSAqIEF2b2lkIGNyYXNoaW5nIGlmIHRoZSBzdGFjayBoYXMgb3ZlcmZsb3dlZCBhbmQgY29ycnVwdGVkCisJICogdGFza19jcHUocCksIHdoaWNoIGlzIGluIHRoZSB0aHJlYWRfaW5mbyBzdHJ1Y3QuCisJICovCisJaWYgKGNwdSA8IE5SX0NQVVMgJiYgY3B1X3Bvc3NpYmxlKGNwdSkpIHsKKwkJc3RhY2tfcGFnZSA9ICh1bnNpZ25lZCBsb25nKSBoYXJkaXJxX2N0eFtjcHVdOworCQlpZiAoc3AgPj0gc3RhY2tfcGFnZSArIHNpemVvZihzdHJ1Y3QgdGhyZWFkX3N0cnVjdCkKKwkJICAgICYmIHNwIDw9IHN0YWNrX3BhZ2UgKyBUSFJFQURfU0laRSAtIG5ieXRlcykKKwkJCXJldHVybiAxOworCisJCXN0YWNrX3BhZ2UgPSAodW5zaWduZWQgbG9uZykgc29mdGlycV9jdHhbY3B1XTsKKwkJaWYgKHNwID49IHN0YWNrX3BhZ2UgKyBzaXplb2Yoc3RydWN0IHRocmVhZF9zdHJ1Y3QpCisJCSAgICAmJiBzcCA8PSBzdGFja19wYWdlICsgVEhSRUFEX1NJWkUgLSBuYnl0ZXMpCisJCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKyNlbHNlCisjZGVmaW5lIHZhbGlkX2lycV9zdGFjayhzcCwgcCwgbmIpCTAKKyNlbmRpZiAvKiBDT05GSUdfSVJRU1RBQ0tTICovCisKIGludCB2YWxpZGF0ZV9zcCh1bnNpZ25lZCBsb25nIHNwLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsCiAJCSAgICAgICB1bnNpZ25lZCBsb25nIG5ieXRlcykKIHsKQEAgLTgzMiwxOSArODU4LDcgQEAKIAkgICAgJiYgc3AgPD0gc3RhY2tfcGFnZSArIFRIUkVBRF9TSVpFIC0gbmJ5dGVzKQogCQlyZXR1cm4gMTsKIAotI2lmZGVmIENPTkZJR19JUlFTVEFDS1MKLQlzdGFja19wYWdlID0gKHVuc2lnbmVkIGxvbmcpIGhhcmRpcnFfY3R4W3Rhc2tfY3B1KHApXTsKLQlpZiAoc3AgPj0gc3RhY2tfcGFnZSArIHNpemVvZihzdHJ1Y3QgdGhyZWFkX3N0cnVjdCkKLQkgICAgJiYgc3AgPD0gc3RhY2tfcGFnZSArIFRIUkVBRF9TSVpFIC0gbmJ5dGVzKQotCQlyZXR1cm4gMTsKLQotCXN0YWNrX3BhZ2UgPSAodW5zaWduZWQgbG9uZykgc29mdGlycV9jdHhbdGFza19jcHUocCldOwotCWlmIChzcCA+PSBzdGFja19wYWdlICsgc2l6ZW9mKHN0cnVjdCB0aHJlYWRfc3RydWN0KQotCSAgICAmJiBzcCA8PSBzdGFja19wYWdlICsgVEhSRUFEX1NJWkUgLSBuYnl0ZXMpCi0JCXJldHVybiAxOwotI2VuZGlmCi0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gdmFsaWRfaXJxX3N0YWNrKHNwLCBwLCBuYnl0ZXMpOwogfQogCiAjaWZkZWYgQ09ORklHX1BQQzY0CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3Byb20uYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbS5jCmluZGV4IDhkNTJiMjMuLmNhZWY1NTUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbS5jCkBAIC0zOTAsMTggKzM5MCwxOSBAQAogCQlpZiAoYWxsbmV4dHBwKSB7CiAJCQlwcC0+bmFtZSA9ICJuYW1lIjsKIAkJCXBwLT5sZW5ndGggPSBzejsKLQkJCXBwLT52YWx1ZSA9ICh1bnNpZ25lZCBjaGFyICopKHBwICsgMSk7CisJCQlwcC0+dmFsdWUgPSBwcCArIDE7CiAJCQkqcHJldl9wcCA9IHBwOwogCQkJcHJldl9wcCA9ICZwcC0+bmV4dDsKIAkJCW1lbWNweShwcC0+dmFsdWUsIHBzLCBzeiAtIDEpOwogCQkJKChjaGFyICopcHAtPnZhbHVlKVtzeiAtIDFdID0gMDsKLQkJCURCRygiZml4ZWQgdXAgbmFtZSBmb3IgJXMgLT4gJXNcbiIsIHBhdGhwLCBwcC0+dmFsdWUpOworCQkJREJHKCJmaXhlZCB1cCBuYW1lIGZvciAlcyAtPiAlc1xuIiwgcGF0aHAsCisJCQkJKGNoYXIgKilwcC0+dmFsdWUpOwogCQl9CiAJfQogCWlmIChhbGxuZXh0cHApIHsKIAkJKnByZXZfcHAgPSBOVUxMOwotCQlucC0+bmFtZSA9IGdldF9wcm9wZXJ0eShucCwgIm5hbWUiLCBOVUxMKTsKLQkJbnAtPnR5cGUgPSBnZXRfcHJvcGVydHkobnAsICJkZXZpY2VfdHlwZSIsIE5VTEwpOworCQlucC0+bmFtZSA9IG9mX2dldF9wcm9wZXJ0eShucCwgIm5hbWUiLCBOVUxMKTsKKwkJbnAtPnR5cGUgPSBvZl9nZXRfcHJvcGVydHkobnAsICJkZXZpY2VfdHlwZSIsIE5VTEwpOwogCiAJCWlmICghbnAtPm5hbWUpCiAJCQlucC0+bmFtZSA9ICI8TlVMTD4iOwpAQCAtNzE5LDYgKzcyMCw3IEBACiAJCQkJCSAgICBjb25zdCBjaGFyICp1bmFtZSwgaW50IGRlcHRoLCB2b2lkICpkYXRhKQogewogCXVuc2lnbmVkIGxvbmcgKmxwcm9wOworCXUzMiAqcHJvcDsKIAl1bnNpZ25lZCBsb25nIGw7CiAJY2hhciAqcDsKIApAQCAtNzYwLDYgKzc2MiwyMiBAQAogICAgICAgICAgICAgICAgY3Jhc2hrX3Jlcy5lbmQgPSBjcmFzaGtfcmVzLnN0YXJ0ICsgKmxwcm9wIC0gMTsKICNlbmRpZgogCisjaWZkZWYgQ09ORklHX0JMS19ERVZfSU5JVFJECisJREJHKCJMb29raW5nIGZvciBpbml0cmQgcHJvcGVydGllcy4uLiAiKTsKKwlwcm9wID0gb2ZfZ2V0X2ZsYXRfZHRfcHJvcChub2RlLCAibGludXgsaW5pdHJkLXN0YXJ0IiwgJmwpOworCWlmIChwcm9wKSB7CisJCWluaXRyZF9zdGFydCA9ICh1bnNpZ25lZCBsb25nKV9fdmEob2ZfcmVhZF91bG9uZyhwcm9wLCBsLzQpKTsKKwkJcHJvcCA9IG9mX2dldF9mbGF0X2R0X3Byb3Aobm9kZSwgImxpbnV4LGluaXRyZC1lbmQiLCAmbCk7CisJCWlmIChwcm9wKSB7CisJCQlpbml0cmRfZW5kID0gKHVuc2lnbmVkIGxvbmcpX192YShvZl9yZWFkX3Vsb25nKHByb3AsIGwvNCkpOworCQkJaW5pdHJkX2JlbG93X3N0YXJ0X29rID0gMTsKKwkJfSBlbHNlIHsKKwkJCWluaXRyZF9zdGFydCA9IDA7CisJCX0KKwl9CisJREJHKCJpbml0cmRfc3RhcnQ9MHglbHggIGluaXRyZF9lbmQ9MHglbHhcbiIsIGluaXRyZF9zdGFydCwgaW5pdHJkX2VuZCk7CisjZW5kaWYgLyogQ09ORklHX0JMS19ERVZfSU5JVFJEICovCisKIAkvKiBSZXRyZWl2ZSBjb21tYW5kIGxpbmUgKi8KICAJcCA9IG9mX2dldF9mbGF0X2R0X3Byb3Aobm9kZSwgImJvb3RhcmdzIiwgJmwpOwogCWlmIChwICE9IE5VTEwgJiYgbCA+IDApCkBAIC05MjYsNiArOTQ0LDEyIEBACiAJc2VsZl9zaXplID0gaW5pdGlhbF9ib290X3BhcmFtcy0+dG90YWxzaXplOwogCWxtYl9yZXNlcnZlKHNlbGZfYmFzZSwgc2VsZl9zaXplKTsKIAorI2lmZGVmIENPTkZJR19CTEtfREVWX0lOSVRSRAorCS8qIHRoZW4gcmVzZXJ2ZSB0aGUgaW5pdHJkLCBpZiBhbnkgKi8KKwlpZiAoaW5pdHJkX3N0YXJ0ICYmIChpbml0cmRfZW5kID4gaW5pdHJkX3N0YXJ0KSkKKwkJbG1iX3Jlc2VydmUoX19wYShpbml0cmRfc3RhcnQpLCBpbml0cmRfZW5kIC0gaW5pdHJkX3N0YXJ0KTsKKyNlbmRpZiAvKiBDT05GSUdfQkxLX0RFVl9JTklUUkQgKi8KKwogI2lmZGVmIENPTkZJR19QUEMzMgogCS8qIAogCSAqIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSB3ZSBtaWdodCBiZSBib290aW5nIGZyb20gYW4gb2xkIGtleGVjCkBAIC05NTQsOSArOTc4LDYgQEAKIAkJc2l6ZSA9ICoocmVzZXJ2ZV9tYXArKyk7CiAJCWlmIChzaXplID09IDApCiAJCQlicmVhazsKLQkJLyogc2tpcCBpZiB0aGUgcmVzZXJ2YXRpb24gaXMgZm9yIHRoZSBibG9iICovCi0JCWlmIChiYXNlID09IHNlbGZfYmFzZSAmJiBzaXplID09IHNlbGZfc2l6ZSkKLQkJCWNvbnRpbnVlOwogCQlEQkcoInJlc2VydmluZzogJWxseCAtPiAlbGx4XG4iLCBiYXNlLCBzaXplKTsKIAkJbG1iX3Jlc2VydmUoYmFzZSwgc2l6ZSk7CiAJfQpAQCAtMTAyMSwxMDIgKzEwNDIsNDYgQEAKIAogI3VuZGVmIHByaW50awogCi1pbnQKLXByb21fbl9hZGRyX2NlbGxzKHN0cnVjdCBkZXZpY2Vfbm9kZSogbnApCitpbnQgb2Zfbl9hZGRyX2NlbGxzKHN0cnVjdCBkZXZpY2Vfbm9kZSogbnApCiB7CiAJY29uc3QgaW50ICppcDsKIAlkbyB7CiAJCWlmIChucC0+cGFyZW50KQogCQkJbnAgPSBucC0+cGFyZW50OwotCQlpcCA9IGdldF9wcm9wZXJ0eShucCwgIiNhZGRyZXNzLWNlbGxzIiwgTlVMTCk7CisJCWlwID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAiI2FkZHJlc3MtY2VsbHMiLCBOVUxMKTsKIAkJaWYgKGlwICE9IE5VTEwpCiAJCQlyZXR1cm4gKmlwOwogCX0gd2hpbGUgKG5wLT5wYXJlbnQpOwogCS8qIE5vICNhZGRyZXNzLWNlbGxzIHByb3BlcnR5IGZvciB0aGUgcm9vdCBub2RlLCBkZWZhdWx0IHRvIDEgKi8KIAlyZXR1cm4gMTsKIH0KLUVYUE9SVF9TWU1CT0wocHJvbV9uX2FkZHJfY2VsbHMpOworRVhQT1JUX1NZTUJPTChvZl9uX2FkZHJfY2VsbHMpOwogCi1pbnQKLXByb21fbl9zaXplX2NlbGxzKHN0cnVjdCBkZXZpY2Vfbm9kZSogbnApCitpbnQgb2Zfbl9zaXplX2NlbGxzKHN0cnVjdCBkZXZpY2Vfbm9kZSogbnApCiB7CiAJY29uc3QgaW50KiBpcDsKIAlkbyB7CiAJCWlmIChucC0+cGFyZW50KQogCQkJbnAgPSBucC0+cGFyZW50OwotCQlpcCA9IGdldF9wcm9wZXJ0eShucCwgIiNzaXplLWNlbGxzIiwgTlVMTCk7CisJCWlwID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAiI3NpemUtY2VsbHMiLCBOVUxMKTsKIAkJaWYgKGlwICE9IE5VTEwpCiAJCQlyZXR1cm4gKmlwOwogCX0gd2hpbGUgKG5wLT5wYXJlbnQpOwogCS8qIE5vICNzaXplLWNlbGxzIHByb3BlcnR5IGZvciB0aGUgcm9vdCBub2RlLCBkZWZhdWx0IHRvIDEgKi8KIAlyZXR1cm4gMTsKIH0KLUVYUE9SVF9TWU1CT0wocHJvbV9uX3NpemVfY2VsbHMpOwotCi0vKioKLSAqIENvbnN0cnVjdCBhbmQgcmV0dXJuIGEgbGlzdCBvZiB0aGUgZGV2aWNlX25vZGVzIHdpdGggYSBnaXZlbiBuYW1lLgotICovCi1zdHJ1Y3QgZGV2aWNlX25vZGUgKmZpbmRfZGV2aWNlcyhjb25zdCBjaGFyICpuYW1lKQotewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqaGVhZCwgKipwcmV2cCwgKm5wOwotCi0JcHJldnAgPSAmaGVhZDsKLQlmb3IgKG5wID0gYWxsbm9kZXM7IG5wICE9IDA7IG5wID0gbnAtPmFsbG5leHQpIHsKLQkJaWYgKG5wLT5uYW1lICE9IDAgJiYgc3RyY2FzZWNtcChucC0+bmFtZSwgbmFtZSkgPT0gMCkgewotCQkJKnByZXZwID0gbnA7Ci0JCQlwcmV2cCA9ICZucC0+bmV4dDsKLQkJfQotCX0KLQkqcHJldnAgPSBOVUxMOwotCXJldHVybiBoZWFkOwotfQotRVhQT1JUX1NZTUJPTChmaW5kX2RldmljZXMpOwotCi0vKioKLSAqIENvbnN0cnVjdCBhbmQgcmV0dXJuIGEgbGlzdCBvZiB0aGUgZGV2aWNlX25vZGVzIHdpdGggYSBnaXZlbiB0eXBlLgotICovCi1zdHJ1Y3QgZGV2aWNlX25vZGUgKmZpbmRfdHlwZV9kZXZpY2VzKGNvbnN0IGNoYXIgKnR5cGUpCi17Ci0Jc3RydWN0IGRldmljZV9ub2RlICpoZWFkLCAqKnByZXZwLCAqbnA7Ci0KLQlwcmV2cCA9ICZoZWFkOwotCWZvciAobnAgPSBhbGxub2RlczsgbnAgIT0gMDsgbnAgPSBucC0+YWxsbmV4dCkgewotCQlpZiAobnAtPnR5cGUgIT0gMCAmJiBzdHJjYXNlY21wKG5wLT50eXBlLCB0eXBlKSA9PSAwKSB7Ci0JCQkqcHJldnAgPSBucDsKLQkJCXByZXZwID0gJm5wLT5uZXh0OwotCQl9Ci0JfQotCSpwcmV2cCA9IE5VTEw7Ci0JcmV0dXJuIGhlYWQ7Ci19Ci1FWFBPUlRfU1lNQk9MKGZpbmRfdHlwZV9kZXZpY2VzKTsKLQotLyoqCi0gKiBSZXR1cm5zIGFsbCBub2RlcyBsaW5rZWQgdG9nZXRoZXIKLSAqLwotc3RydWN0IGRldmljZV9ub2RlICpmaW5kX2FsbF9ub2Rlcyh2b2lkKQotewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqaGVhZCwgKipwcmV2cCwgKm5wOwotCi0JcHJldnAgPSAmaGVhZDsKLQlmb3IgKG5wID0gYWxsbm9kZXM7IG5wICE9IDA7IG5wID0gbnAtPmFsbG5leHQpIHsKLQkJKnByZXZwID0gbnA7Ci0JCXByZXZwID0gJm5wLT5uZXh0OwotCX0KLQkqcHJldnAgPSBOVUxMOwotCXJldHVybiBoZWFkOwotfQotRVhQT1JUX1NZTUJPTChmaW5kX2FsbF9ub2Rlcyk7CitFWFBPUlRfU1lNQk9MKG9mX25fc2l6ZV9jZWxscyk7CiAKIC8qKiBDaGVja3MgaWYgdGhlIGdpdmVuICJjb21wYXQiIHN0cmluZyBtYXRjaGVzIG9uZSBvZiB0aGUgc3RyaW5ncyBpbgogICogdGhlIGRldmljZSdzICJjb21wYXRpYmxlIiBwcm9wZXJ0eQogICovCi1pbnQgZGV2aWNlX2lzX2NvbXBhdGlibGUoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpkZXZpY2UsIGNvbnN0IGNoYXIgKmNvbXBhdCkKK2ludCBvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldmljZSwKKwkJY29uc3QgY2hhciAqY29tcGF0KQogewogCWNvbnN0IGNoYXIqIGNwOwogCWludCBjcGxlbiwgbDsKIAotCWNwID0gZ2V0X3Byb3BlcnR5KGRldmljZSwgImNvbXBhdGlibGUiLCAmY3BsZW4pOworCWNwID0gb2ZfZ2V0X3Byb3BlcnR5KGRldmljZSwgImNvbXBhdGlibGUiLCAmY3BsZW4pOwogCWlmIChjcCA9PSBOVUxMKQogCQlyZXR1cm4gMDsKIAl3aGlsZSAoY3BsZW4gPiAwKSB7CkBAIC0xMTI5LDcgKzEwOTQsNyBAQAogCiAJcmV0dXJuIDA7CiB9Ci1FWFBPUlRfU1lNQk9MKGRldmljZV9pc19jb21wYXRpYmxlKTsKK0VYUE9SVF9TWU1CT0wob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUpOwogCiAKIC8qKgpAQCAtMTE0Myw1MSArMTEwOCwxMyBAQAogCiAJcm9vdCA9IG9mX2ZpbmRfbm9kZV9ieV9wYXRoKCIvIik7CiAJaWYgKHJvb3QpIHsKLQkJcmMgPSBkZXZpY2VfaXNfY29tcGF0aWJsZShyb290LCBjb21wYXQpOworCQlyYyA9IG9mX2RldmljZV9pc19jb21wYXRpYmxlKHJvb3QsIGNvbXBhdCk7CiAJCW9mX25vZGVfcHV0KHJvb3QpOwogCX0KIAlyZXR1cm4gcmM7CiB9CiBFWFBPUlRfU1lNQk9MKG1hY2hpbmVfaXNfY29tcGF0aWJsZSk7CiAKLS8qKgotICogQ29uc3RydWN0IGFuZCByZXR1cm4gYSBsaXN0IG9mIHRoZSBkZXZpY2Vfbm9kZXMgd2l0aCBhIGdpdmVuIHR5cGUKLSAqIGFuZCBjb21wYXRpYmxlIHByb3BlcnR5LgotICovCi1zdHJ1Y3QgZGV2aWNlX25vZGUgKmZpbmRfY29tcGF0aWJsZV9kZXZpY2VzKGNvbnN0IGNoYXIgKnR5cGUsCi0JCQkJCSAgICBjb25zdCBjaGFyICpjb21wYXQpCi17Ci0Jc3RydWN0IGRldmljZV9ub2RlICpoZWFkLCAqKnByZXZwLCAqbnA7Ci0KLQlwcmV2cCA9ICZoZWFkOwotCWZvciAobnAgPSBhbGxub2RlczsgbnAgIT0gMDsgbnAgPSBucC0+YWxsbmV4dCkgewotCQlpZiAodHlwZSAhPSBOVUxMCi0JCSAgICAmJiAhKG5wLT50eXBlICE9IDAgJiYgc3RyY2FzZWNtcChucC0+dHlwZSwgdHlwZSkgPT0gMCkpCi0JCQljb250aW51ZTsKLQkJaWYgKGRldmljZV9pc19jb21wYXRpYmxlKG5wLCBjb21wYXQpKSB7Ci0JCQkqcHJldnAgPSBucDsKLQkJCXByZXZwID0gJm5wLT5uZXh0OwotCQl9Ci0JfQotCSpwcmV2cCA9IE5VTEw7Ci0JcmV0dXJuIGhlYWQ7Ci19Ci1FWFBPUlRfU1lNQk9MKGZpbmRfY29tcGF0aWJsZV9kZXZpY2VzKTsKLQotLyoqCi0gKiBGaW5kIHRoZSBkZXZpY2Vfbm9kZSB3aXRoIGEgZ2l2ZW4gZnVsbF9uYW1lLgotICovCi1zdHJ1Y3QgZGV2aWNlX25vZGUgKmZpbmRfcGF0aF9kZXZpY2UoY29uc3QgY2hhciAqcGF0aCkKLXsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwotCi0JZm9yIChucCA9IGFsbG5vZGVzOyBucCAhPSAwOyBucCA9IG5wLT5hbGxuZXh0KQotCQlpZiAobnAtPmZ1bGxfbmFtZSAhPSAwICYmIHN0cmNhc2VjbXAobnAtPmZ1bGxfbmFtZSwgcGF0aCkgPT0gMCkKLQkJCXJldHVybiBucDsKLQlyZXR1cm4gTlVMTDsKLX0KLUVYUE9SVF9TWU1CT0woZmluZF9wYXRoX2RldmljZSk7Ci0KIC8qKioqKioqCiAgKgogICogTmV3IGltcGxlbWVudGF0aW9uIG9mIHRoZSBPRiAiZmluZCIgQVBJcywgcmV0dXJuIGEgcmVmY291bnRlZApAQCAtMTI4MCw3ICsxMjA3LDcgQEAKIAkJaWYgKHR5cGUgIT0gTlVMTAogCQkgICAgJiYgIShucC0+dHlwZSAhPSAwICYmIHN0cmNhc2VjbXAobnAtPnR5cGUsIHR5cGUpID09IDApKQogCQkJY29udGludWU7Ci0JCWlmIChkZXZpY2VfaXNfY29tcGF0aWJsZShucCwgY29tcGF0aWJsZSkgJiYgb2Zfbm9kZV9nZXQobnApKQorCQlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsIGNvbXBhdGlibGUpICYmIG9mX25vZGVfZ2V0KG5wKSkKIAkJCWJyZWFrOwogCX0KIAlvZl9ub2RlX3B1dChmcm9tKTsKQEAgLTE1MjcsOCArMTQ1NCw4IEBACiAJaW50IGVyciA9IDA7CiAJY29uc3QgcGhhbmRsZSAqaWJtX3BoYW5kbGU7CiAKLQlub2RlLT5uYW1lID0gZ2V0X3Byb3BlcnR5KG5vZGUsICJuYW1lIiwgTlVMTCk7Ci0Jbm9kZS0+dHlwZSA9IGdldF9wcm9wZXJ0eShub2RlLCAiZGV2aWNlX3R5cGUiLCBOVUxMKTsKKwlub2RlLT5uYW1lID0gb2ZfZ2V0X3Byb3BlcnR5KG5vZGUsICJuYW1lIiwgTlVMTCk7CisJbm9kZS0+dHlwZSA9IG9mX2dldF9wcm9wZXJ0eShub2RlLCAiZGV2aWNlX3R5cGUiLCBOVUxMKTsKIAogCWlmICghcGFyZW50KSB7CiAJCWVyciA9IC1FTk9ERVY7CkBAIC0xNTQyLDcgKzE0NjksNyBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAogCS8qIGZpeCB1cCBuZXcgbm9kZSdzIGxpbnV4X3BoYW5kbGUgZmllbGQgKi8KLQlpZiAoKGlibV9waGFuZGxlID0gZ2V0X3Byb3BlcnR5KG5vZGUsICJpYm0scGhhbmRsZSIsIE5VTEwpKSkKKwlpZiAoKGlibV9waGFuZGxlID0gb2ZfZ2V0X3Byb3BlcnR5KG5vZGUsICJpYm0scGhhbmRsZSIsIE5VTEwpKSkKIAkJbm9kZS0+bGludXhfcGhhbmRsZSA9ICppYm1fcGhhbmRsZTsKIAogb3V0OgpAQCAtMTYwNSwxMyArMTUzMiwxMyBAQAogICogRmluZCBhIHByb3BlcnR5IHdpdGggYSBnaXZlbiBuYW1lIGZvciBhIGdpdmVuIG5vZGUKICAqIGFuZCByZXR1cm4gdGhlIHZhbHVlLgogICovCi1jb25zdCB2b2lkICpnZXRfcHJvcGVydHkoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpucCwgY29uc3QgY2hhciAqbmFtZSwKK2NvbnN0IHZvaWQgKm9mX2dldF9wcm9wZXJ0eShjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCBjb25zdCBjaGFyICpuYW1lLAogCQkJIGludCAqbGVucCkKIHsKIAlzdHJ1Y3QgcHJvcGVydHkgKnBwID0gb2ZfZmluZF9wcm9wZXJ0eShucCxuYW1lLGxlbnApOwogCXJldHVybiBwcCA/IHBwLT52YWx1ZSA6IE5VTEw7CiB9Ci1FWFBPUlRfU1lNQk9MKGdldF9wcm9wZXJ0eSk7CitFWFBPUlRfU1lNQk9MKG9mX2dldF9wcm9wZXJ0eSk7CiAKIC8qCiAgKiBBZGQgYSBwcm9wZXJ0eSB0byBhIG5vZGUKQEAgLTE3NDIsMTAgKzE2NjksMTAgQEAKIAkJLyogQ2hlY2sgZm9yIGlibSxwcGMtaW50ZXJydXB0LXNlcnZlciNzLiBJZiBpdCBkb2Vzbid0IGV4aXN0CiAJCSAqIGZhbGxiYWNrIHRvICJyZWciIHByb3BlcnR5IGFuZCBhc3N1bWUgbm8gdGhyZWFkcwogCQkgKi8KLQkJaW50c2VydiA9IGdldF9wcm9wZXJ0eShucCwgImlibSxwcGMtaW50ZXJydXB0LXNlcnZlciNzIiwKKwkJaW50c2VydiA9IG9mX2dldF9wcm9wZXJ0eShucCwgImlibSxwcGMtaW50ZXJydXB0LXNlcnZlciNzIiwKIAkJCQkmcGxlbik7CiAJCWlmIChpbnRzZXJ2ID09IE5VTEwpIHsKLQkJCWNvbnN0IHUzMiAqcmVnID0gZ2V0X3Byb3BlcnR5KG5wLCAicmVnIiwgTlVMTCk7CisJCQljb25zdCB1MzIgKnJlZyA9IG9mX2dldF9wcm9wZXJ0eShucCwgInJlZyIsIE5VTEwpOwogCQkJaWYgKHJlZyA9PSBOVUxMKQogCQkJCWNvbnRpbnVlOwogCQkJaWYgKCpyZWcgPT0gaGFyZGlkKSB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3Byb21faW5pdC5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tX2luaXQuYwppbmRleCA0ZmI1OTM4Li5lMjdkOWQxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3Byb21faW5pdC5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbV9pbml0LmMKQEAgLTIwMzUsMzkgKzIwMzUsNTAgQEAKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1BQQ19DSFJQCi0vKiBQZWdhc29zIGFuZCBCcmlRIGxhY2tzIHRoZSAicmFuZ2VzIiBwcm9wZXJ0eSBpbiB0aGUgaXNhIG5vZGUgKi8KKy8qCisgKiBQZWdhc29zIGFuZCBCcmlRIGxhY2tzIHRoZSAicmFuZ2VzIiBwcm9wZXJ0eSBpbiB0aGUgaXNhIG5vZGUKKyAqIFBlZ2Fzb3MgbmVlZHMgZGVjaW1hbCBJUlEgMTQvMTUsIG5vdCBoZXhhZGVjaW1hbAorICovCiBzdGF0aWMgdm9pZCBfX2luaXQgZml4dXBfZGV2aWNlX3RyZWVfY2hycCh2b2lkKQogewotCXBoYW5kbGUgaXNhOwotCXUzMiBpc2FfcmFuZ2VzWzZdOworCXBoYW5kbGUgcGg7CisJdTMyIHByb3BbNl07CiAJdTMyIHJsb2MgPSAweDAxMDA2MDAwOyAvKiBJTyBzcGFjZTsgUENJIGRldmljZSA9IDEyICovCiAJY2hhciAqbmFtZTsKIAlpbnQgcmM7CiAKIAluYW1lID0gIi9wY2lAODAwMDAwMDAvaXNhQGMiOwotCWlzYSA9IGNhbGxfcHJvbSgiZmluZGRldmljZSIsIDEsIDEsIEFERFIobmFtZSkpOwotCWlmICghUEhBTkRMRV9WQUxJRChpc2EpKSB7CisJcGggPSBjYWxsX3Byb20oImZpbmRkZXZpY2UiLCAxLCAxLCBBRERSKG5hbWUpKTsKKwlpZiAoIVBIQU5ETEVfVkFMSUQocGgpKSB7CiAJCW5hbWUgPSAiL3BjaUBmZjUwMDAwMC9pc2FANiI7Ci0JCWlzYSA9IGNhbGxfcHJvbSgiZmluZGRldmljZSIsIDEsIDEsIEFERFIobmFtZSkpOworCQlwaCA9IGNhbGxfcHJvbSgiZmluZGRldmljZSIsIDEsIDEsIEFERFIobmFtZSkpOwogCQlybG9jID0gMHgwMTAwMzAwMDsgLyogSU8gc3BhY2U7IFBDSSBkZXZpY2UgPSA2ICovCiAJfQotCWlmICghUEhBTkRMRV9WQUxJRChpc2EpKQotCQlyZXR1cm47CisJaWYgKFBIQU5ETEVfVkFMSUQocGgpKSB7CisJCXJjID0gcHJvbV9nZXRwcm9wbGVuKHBoLCAicmFuZ2VzIik7CisJCWlmIChyYyA9PSAwIHx8IHJjID09IFBST01fRVJST1IpIHsKKwkJCXByb21fcHJpbnRmKCJGaXhpbmcgdXAgbWlzc2luZyBJU0EgcmFuZ2Ugb24gUGVnYXNvcy4uLlxuIik7CiAKLQlyYyA9IHByb21fZ2V0cHJvcGxlbihpc2EsICJyYW5nZXMiKTsKLQlpZiAocmMgIT0gMCAmJiByYyAhPSBQUk9NX0VSUk9SKQotCQlyZXR1cm47CisJCQlwcm9wWzBdID0gMHgxOworCQkJcHJvcFsxXSA9IDB4MDsKKwkJCXByb3BbMl0gPSBybG9jOworCQkJcHJvcFszXSA9IDB4MDsKKwkJCXByb3BbNF0gPSAweDA7CisJCQlwcm9wWzVdID0gMHgwMDAxMDAwMDsKKwkJCXByb21fc2V0cHJvcChwaCwgbmFtZSwgInJhbmdlcyIsIHByb3AsIHNpemVvZihwcm9wKSk7CisJCX0KKwl9CiAKLQlwcm9tX3ByaW50ZigiRml4aW5nIHVwIG1pc3NpbmcgSVNBIHJhbmdlIG9uIFBlZ2Fzb3MuLi5cbiIpOwotCi0JaXNhX3Jhbmdlc1swXSA9IDB4MTsKLQlpc2FfcmFuZ2VzWzFdID0gMHgwOwotCWlzYV9yYW5nZXNbMl0gPSBybG9jOwotCWlzYV9yYW5nZXNbM10gPSAweDA7Ci0JaXNhX3Jhbmdlc1s0XSA9IDB4MDsKLQlpc2FfcmFuZ2VzWzVdID0gMHgwMDAxMDAwMDsKLQlwcm9tX3NldHByb3AoaXNhLCBuYW1lLCAicmFuZ2VzIiwKLQkJCWlzYV9yYW5nZXMsIHNpemVvZihpc2FfcmFuZ2VzKSk7CisJbmFtZSA9ICIvcGNpQDgwMDAwMDAwL2lkZUBDLDEiOworCXBoID0gY2FsbF9wcm9tKCJmaW5kZGV2aWNlIiwgMSwgMSwgQUREUihuYW1lKSk7CisJaWYgKFBIQU5ETEVfVkFMSUQocGgpKSB7CisJCXByb21fcHJpbnRmKCJGaXhpbmcgdXAgSURFIGludGVycnVwdCBvbiBQZWdhc29zLi4uXG4iKTsKKwkJcHJvcFswXSA9IDE0OworCQlwcm9wWzFdID0gMHgwOworCQlwcm9wWzJdID0gMTU7CisJCXByb3BbM10gPSAweDA7CisJCXByb21fc2V0cHJvcChwaCwgbmFtZSwgImludGVycnVwdHMiLCBwcm9wLCA0KnNpemVvZih1MzIpKTsKKwl9CiB9CiAjZWxzZQogI2RlZmluZSBmaXh1cF9kZXZpY2VfdHJlZV9jaHJwKCkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbV9wYXJzZS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tX3BhcnNlLmMKaW5kZXggOTFiNDQzYy4uYWE0MGE1MyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tX3BhcnNlLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tX3BhcnNlLmMKQEAgLTY4LDkgKzY4LDkgQEAKIAkJCQkgICAgICAgaW50ICphZGRyYywgaW50ICpzaXplYykKIHsKIAlpZiAoYWRkcmMpCi0JCSphZGRyYyA9IHByb21fbl9hZGRyX2NlbGxzKGRldik7CisJCSphZGRyYyA9IG9mX25fYWRkcl9jZWxscyhkZXYpOwogCWlmIChzaXplYykKLQkJKnNpemVjID0gcHJvbV9uX3NpemVfY2VsbHMoZGV2KTsKKwkJKnNpemVjID0gb2Zfbl9zaXplX2NlbGxzKGRldik7CiB9CiAKIHN0YXRpYyB1NjQgb2ZfYnVzX2RlZmF1bHRfbWFwKHUzMiAqYWRkciwgY29uc3QgdTMyICpyYW5nZSwKQEAgLTE5Niw3ICsxOTYsNyBAQAogCQlyZXR1cm4gTlVMTDsKIAogCS8qIEdldCAicmVnIiBvciAiYXNzaWduZWQtYWRkcmVzc2VzIiBwcm9wZXJ0eSAqLwotCXByb3AgPSBnZXRfcHJvcGVydHkoZGV2LCBidXMtPmFkZHJlc3NlcywgJnBzaXplKTsKKwlwcm9wID0gb2ZfZ2V0X3Byb3BlcnR5KGRldiwgYnVzLT5hZGRyZXNzZXMsICZwc2l6ZSk7CiAJaWYgKHByb3AgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAJcHNpemUgLz0gNDsKQEAgLTQzOCw3ICs0MzgsNyBAQAogCSAqIHRvIHRyYW5zbGF0ZSBhZGRyZXNzZXMgdGhhdCBhcmVuJ3Qgc3VwcG9zZWQgdG8gYmUgdHJhbnNsYXRlZCBpbgogCSAqIHRoZSBmaXJzdCBwbGFjZS4gLS1CZW5ILgogCSAqLwotCXJhbmdlcyA9IGdldF9wcm9wZXJ0eShwYXJlbnQsICJyYW5nZXMiLCAmcmxlbik7CisJcmFuZ2VzID0gb2ZfZ2V0X3Byb3BlcnR5KHBhcmVudCwgInJhbmdlcyIsICZybGVuKTsKIAlpZiAocmFuZ2VzID09IE5VTEwgfHwgcmxlbiA9PSAwKSB7CiAJCW9mZnNldCA9IG9mX3JlYWRfbnVtYmVyKGFkZHIsIG5hKTsKIAkJbWVtc2V0KGFkZHIsIDAsIHBuYSAqIDQpOwpAQCAtNTc4LDcgKzU3OCw3IEBACiAJCXJldHVybiBOVUxMOwogCiAJLyogR2V0ICJyZWciIG9yICJhc3NpZ25lZC1hZGRyZXNzZXMiIHByb3BlcnR5ICovCi0JcHJvcCA9IGdldF9wcm9wZXJ0eShkZXYsIGJ1cy0+YWRkcmVzc2VzLCAmcHNpemUpOworCXByb3AgPSBvZl9nZXRfcHJvcGVydHkoZGV2LCBidXMtPmFkZHJlc3NlcywgJnBzaXplKTsKIAlpZiAocHJvcCA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKIAlwc2l6ZSAvPSA0OwpAQCAtNjUwLDE3ICs2NTAsMTcgQEAKIAkvKiBidXNubyBpcyBhbHdheXMgb25lIGNlbGwgKi8KIAkqYnVzbm8gPSAqKGRtYV93aW5kb3crKyk7CiAKLQlwcm9wID0gZ2V0X3Byb3BlcnR5KGRuLCAiaWJtLCNkbWEtYWRkcmVzcy1jZWxscyIsIE5VTEwpOworCXByb3AgPSBvZl9nZXRfcHJvcGVydHkoZG4sICJpYm0sI2RtYS1hZGRyZXNzLWNlbGxzIiwgTlVMTCk7CiAJaWYgKCFwcm9wKQotCQlwcm9wID0gZ2V0X3Byb3BlcnR5KGRuLCAiI2FkZHJlc3MtY2VsbHMiLCBOVUxMKTsKKwkJcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShkbiwgIiNhZGRyZXNzLWNlbGxzIiwgTlVMTCk7CiAKLQljZWxscyA9IHByb3AgPyAqKHUzMiAqKXByb3AgOiBwcm9tX25fYWRkcl9jZWxscyhkbik7CisJY2VsbHMgPSBwcm9wID8gKih1MzIgKilwcm9wIDogb2Zfbl9hZGRyX2NlbGxzKGRuKTsKIAkqcGh5cyA9IG9mX3JlYWRfbnVtYmVyKGRtYV93aW5kb3csIGNlbGxzKTsKIAogCWRtYV93aW5kb3cgKz0gY2VsbHM7CiAKLQlwcm9wID0gZ2V0X3Byb3BlcnR5KGRuLCAiaWJtLCNkbWEtc2l6ZS1jZWxscyIsIE5VTEwpOwotCWNlbGxzID0gcHJvcCA/ICoodTMyICopcHJvcCA6IHByb21fbl9zaXplX2NlbGxzKGRuKTsKKwlwcm9wID0gb2ZfZ2V0X3Byb3BlcnR5KGRuLCAiaWJtLCNkbWEtc2l6ZS1jZWxscyIsIE5VTEwpOworCWNlbGxzID0gcHJvcCA/ICoodTMyICopcHJvcCA6IG9mX25fc2l6ZV9jZWxscyhkbik7CiAJKnNpemUgPSBvZl9yZWFkX251bWJlcihkbWFfd2luZG93LCBjZWxscyk7CiB9CiAKQEAgLTY4MCw3ICs2ODAsNyBAQAogCQlyZXR1cm4gTlVMTDsKIAogCWRvIHsKLQkJcGFycCA9IGdldF9wcm9wZXJ0eShjaGlsZCwgImludGVycnVwdC1wYXJlbnQiLCBOVUxMKTsKKwkJcGFycCA9IG9mX2dldF9wcm9wZXJ0eShjaGlsZCwgImludGVycnVwdC1wYXJlbnQiLCBOVUxMKTsKIAkJaWYgKHBhcnAgPT0gTlVMTCkKIAkJCXAgPSBvZl9nZXRfcGFyZW50KGNoaWxkKTsKIAkJZWxzZSB7CkBAIC02OTEsNyArNjkxLDcgQEAKIAkJfQogCQlvZl9ub2RlX3B1dChjaGlsZCk7CiAJCWNoaWxkID0gcDsKLQl9IHdoaWxlIChwICYmIGdldF9wcm9wZXJ0eShwLCAiI2ludGVycnVwdC1jZWxscyIsIE5VTEwpID09IE5VTEwpOworCX0gd2hpbGUgKHAgJiYgb2ZfZ2V0X3Byb3BlcnR5KHAsICIjaW50ZXJydXB0LWNlbGxzIiwgTlVMTCkgPT0gTlVMTCk7CiAKIAlyZXR1cm4gcDsKIH0KQEAgLTcxNiw3ICs3MTYsNyBAQAogCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwogCiAJCWZvcihucCA9IE5VTEw7IChucCA9IG9mX2ZpbmRfYWxsX25vZGVzKG5wKSkgIT0gTlVMTDspIHsKLQkJCWlmIChnZXRfcHJvcGVydHkobnAsICJpbnRlcnJ1cHQtY29udHJvbGxlciIsIE5VTEwpCisJCQlpZiAob2ZfZ2V0X3Byb3BlcnR5KG5wLCAiaW50ZXJydXB0LWNvbnRyb2xsZXIiLCBOVUxMKQogCQkJICAgID09IE5VTEwpCiAJCQkJY29udGludWU7CiAJCQkvKiBTa2lwIC9jaG9zZW4vaW50ZXJydXB0LWNvbnRyb2xsZXIgKi8KQEAgLTc1NSw3ICs3NTUsNyBAQAogCSAqIGlzIG5vbmUsIHdlIGFyZSBuaWNlIGFuZCBqdXN0IHdhbGsgdXAgdGhlIHRyZWUKIAkgKi8KIAlkbyB7Ci0JCXRtcCA9IGdldF9wcm9wZXJ0eShpcGFyLCAiI2ludGVycnVwdC1jZWxscyIsIE5VTEwpOworCQl0bXAgPSBvZl9nZXRfcHJvcGVydHkoaXBhciwgIiNpbnRlcnJ1cHQtY2VsbHMiLCBOVUxMKTsKIAkJaWYgKHRtcCAhPSBOVUxMKSB7CiAJCQlpbnRzaXplID0gKnRtcDsKIAkJCWJyZWFrOwpAQCAtNzc5LDcgKzc3OSw3IEBACiAJICovCiAJb2xkID0gb2Zfbm9kZV9nZXQoaXBhcik7CiAJZG8gewotCQl0bXAgPSBnZXRfcHJvcGVydHkob2xkLCAiI2FkZHJlc3MtY2VsbHMiLCBOVUxMKTsKKwkJdG1wID0gb2ZfZ2V0X3Byb3BlcnR5KG9sZCwgIiNhZGRyZXNzLWNlbGxzIiwgTlVMTCk7CiAJCXRub2RlID0gb2ZfZ2V0X3BhcmVudChvbGQpOwogCQlvZl9ub2RlX3B1dChvbGQpOwogCQlvbGQgPSB0bm9kZTsKQEAgLTc5NSw3ICs3OTUsOCBAQAogCQkvKiBOb3cgY2hlY2sgaWYgY3Vyc29yIGlzIGFuIGludGVycnVwdC1jb250cm9sbGVyIGFuZCBpZiBpdCBpcwogCQkgKiB0aGVuIHdlIGFyZSBkb25lCiAJCSAqLwotCQlpZiAoZ2V0X3Byb3BlcnR5KGlwYXIsICJpbnRlcnJ1cHQtY29udHJvbGxlciIsIE5VTEwpICE9IE5VTEwpIHsKKwkJaWYgKG9mX2dldF9wcm9wZXJ0eShpcGFyLCAiaW50ZXJydXB0LWNvbnRyb2xsZXIiLCBOVUxMKSAhPQorCQkJCU5VTEwpIHsKIAkJCURCRygiIC0+IGdvdCBpdCAhXG4iKTsKIAkJCW1lbWNweShvdXRfaXJxLT5zcGVjaWZpZXIsIGludHNwZWMsCiAJCQkgICAgICAgaW50c2l6ZSAqIHNpemVvZih1MzIpKTsKQEAgLTgwNiw3ICs4MDcsNyBAQAogCQl9CiAKIAkJLyogTm93IGxvb2sgZm9yIGFuIGludGVycnVwdC1tYXAgKi8KLQkJaW1hcCA9IGdldF9wcm9wZXJ0eShpcGFyLCAiaW50ZXJydXB0LW1hcCIsICZpbWFwbGVuKTsKKwkJaW1hcCA9IG9mX2dldF9wcm9wZXJ0eShpcGFyLCAiaW50ZXJydXB0LW1hcCIsICZpbWFwbGVuKTsKIAkJLyogTm8gaW50ZXJydXB0IG1hcCwgY2hlY2sgZm9yIGFuIGludGVycnVwdCBwYXJlbnQgKi8KIAkJaWYgKGltYXAgPT0gTlVMTCkgewogCQkJREJHKCIgLT4gbm8gbWFwLCBnZXR0aW5nIHBhcmVudFxuIik7CkBAIC04MTYsNyArODE3LDcgQEAKIAkJaW1hcGxlbiAvPSBzaXplb2YodTMyKTsKIAogCQkvKiBMb29rIGZvciBhIG1hc2sgKi8KLQkJaW1hc2sgPSBnZXRfcHJvcGVydHkoaXBhciwgImludGVycnVwdC1tYXAtbWFzayIsIE5VTEwpOworCQlpbWFzayA9IG9mX2dldF9wcm9wZXJ0eShpcGFyLCAiaW50ZXJydXB0LW1hcC1tYXNrIiwgTlVMTCk7CiAKIAkJLyogSWYgd2Ugd2VyZSBwYXNzZWQgbm8gInJlZyIgcHJvcGVydHkgYW5kIHdlIGF0dGVtcHQgdG8gcGFyc2UKIAkJICogYW4gaW50ZXJydXB0LW1hcCwgdGhlbiAjYWRkcmVzcy1jZWxscyBtdXN0IGJlIDAuCkBAIC04NjMsMTUgKzg2NCwxMyBAQAogCQkJLyogR2V0ICNpbnRlcnJ1cHQtY2VsbHMgYW5kICNhZGRyZXNzLWNlbGxzIG9mIG5ldwogCQkJICogcGFyZW50CiAJCQkgKi8KLQkJCXRtcCA9IGdldF9wcm9wZXJ0eShuZXdwYXIsICIjaW50ZXJydXB0LWNlbGxzIiwKLQkJCQkJCSAgTlVMTCk7CisJCQl0bXAgPSBvZl9nZXRfcHJvcGVydHkobmV3cGFyLCAiI2ludGVycnVwdC1jZWxscyIsIE5VTEwpOwogCQkJaWYgKHRtcCA9PSBOVUxMKSB7CiAJCQkJREJHKCIgLT4gcGFyZW50IGxhY2tzICNpbnRlcnJ1cHQtY2VsbHMgIVxuIik7CiAJCQkJZ290byBmYWlsOwogCQkJfQogCQkJbmV3aW50c2l6ZSA9ICp0bXA7Ci0JCQl0bXAgPSBnZXRfcHJvcGVydHkobmV3cGFyLCAiI2FkZHJlc3MtY2VsbHMiLAotCQkJCQkJICBOVUxMKTsKKwkJCXRtcCA9IG9mX2dldF9wcm9wZXJ0eShuZXdwYXIsICIjYWRkcmVzcy1jZWxscyIsIE5VTEwpOwogCQkJbmV3YWRkcnNpemUgPSAodG1wID09IE5VTEwpID8gMCA6ICp0bXA7CiAKIAkJCURCRygiIC0+IG5ld2ludHNpemU9JWQsIG5ld2FkZHJzaXplPSVkXG4iLApAQCAtOTI4LDcgKzkyNyw3IEBACiAJICogZXZlcnl0aGluZyB0b2dldGhlciBvbiB0aGVzZSkKIAkgKi8KIAl3aGlsZSAoZGV2aWNlKSB7Ci0JCWludHMgPSBnZXRfcHJvcGVydHkoZGV2aWNlLCAiQUFQTCxpbnRlcnJ1cHRzIiwgJmludGxlbik7CisJCWludHMgPSBvZl9nZXRfcHJvcGVydHkoZGV2aWNlLCAiQUFQTCxpbnRlcnJ1cHRzIiwgJmludGxlbik7CiAJCWlmIChpbnRzICE9IE5VTEwpCiAJCQlicmVhazsKIAkJZGV2aWNlID0gZGV2aWNlLT5wYXJlbnQ7CkBAIC05NzAsMTMgKzk2OSwxMyBAQAogCQlyZXR1cm4gb2ZfaXJxX21hcF9vbGR3b3JsZChkZXZpY2UsIGluZGV4LCBvdXRfaXJxKTsKIAogCS8qIEdldCB0aGUgaW50ZXJydXB0cyBwcm9wZXJ0eSAqLwotCWludHNwZWMgPSBnZXRfcHJvcGVydHkoZGV2aWNlLCAiaW50ZXJydXB0cyIsICZpbnRsZW4pOworCWludHNwZWMgPSBvZl9nZXRfcHJvcGVydHkoZGV2aWNlLCAiaW50ZXJydXB0cyIsICZpbnRsZW4pOwogCWlmIChpbnRzcGVjID09IE5VTEwpCiAJCXJldHVybiAtRUlOVkFMOwogCWludGxlbiAvPSBzaXplb2YodTMyKTsKIAogCS8qIEdldCB0aGUgcmVnIHByb3BlcnR5IChpZiBhbnkpICovCi0JYWRkciA9IGdldF9wcm9wZXJ0eShkZXZpY2UsICJyZWciLCBOVUxMKTsKKwlhZGRyID0gb2ZfZ2V0X3Byb3BlcnR5KGRldmljZSwgInJlZyIsIE5VTEwpOwogCiAJLyogTG9vayBmb3IgdGhlIGludGVycnVwdCBwYXJlbnQuICovCiAJcCA9IG9mX2lycV9maW5kX3BhcmVudChkZXZpY2UpOwpAQCAtOTg0LDcgKzk4Myw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJLyogR2V0IHNpemUgb2YgaW50ZXJydXB0IHNwZWNpZmllciAqLwotCXRtcCA9IGdldF9wcm9wZXJ0eShwLCAiI2ludGVycnVwdC1jZWxscyIsIE5VTEwpOworCXRtcCA9IG9mX2dldF9wcm9wZXJ0eShwLCAiI2ludGVycnVwdC1jZWxscyIsIE5VTEwpOwogCWlmICh0bXAgPT0gTlVMTCkgewogCQlvZl9ub2RlX3B1dChwKTsKIAkJcmV0dXJuIC1FSU5WQUw7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3J0YXMtcHJvYy5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9ydGFzLXByb2MuYwppbmRleCA2Y2JmMmFlLi4xOTBiN2VkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3J0YXMtcHJvYy5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcnRhcy1wcm9jLmMKQEAgLTQ1MCw3ICs0NTAsNyBAQAogCQlpbnQgbGxlbiwgb2ZmczsKIAogCQlzcHJpbnRmIChyc3RyLCBTRU5TT1JfUFJFRklYIiUwNGQiLCBwLT50b2tlbik7Ci0JCWxvYyA9IGdldF9wcm9wZXJ0eShydGFzX25vZGUsIHJzdHIsICZsbGVuKTsKKwkJbG9jID0gb2ZfZ2V0X3Byb3BlcnR5KHJ0YXNfbm9kZSwgcnN0ciwgJmxsZW4pOwogCiAJCS8qIEEgc2Vuc29yIG1heSBoYXZlIG11bHRpcGxlIGluc3RhbmNlcyAqLwogCQlmb3IgKGogPSAwLCBvZmZzID0gMDsgaiA8PSBwLT5xdWFudDsgaisrKSB7CkBAIC00NzcsNyArNDc3LDcgQEAKIAljb25zdCB1bnNpZ25lZCBpbnQgKnV0bXA7CiAJaW50IGxlbiwgaTsKIAotCXV0bXAgPSBnZXRfcHJvcGVydHkocnRhc19ub2RlLCAicnRhcy1zZW5zb3JzIiwgJmxlbik7CisJdXRtcCA9IG9mX2dldF9wcm9wZXJ0eShydGFzX25vZGUsICJydGFzLXNlbnNvcnMiLCAmbGVuKTsKIAlpZiAodXRtcCA9PSBOVUxMKSB7CiAJCXByaW50ayAoS0VSTl9FUlIgImVycm9yOiBjb3VsZCBub3QgZ2V0IHJ0YXMtc2Vuc29yc1xuIik7CiAJCXJldHVybiAxOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9ydGFzLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3J0YXMuYwppbmRleCA5ZDA3MzVhLi4yMTQ3ODA3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3J0YXMuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3J0YXMuYwpAQCAtMTkyLDE4ICsxOTIsMTkgQEAKIAogCWlmIChkaXNwbGF5X3dpZHRoID09IDApIHsKIAkJZGlzcGxheV93aWR0aCA9IDB4MTA7Ci0JCWlmICgocm9vdCA9IGZpbmRfcGF0aF9kZXZpY2UoIi9ydGFzIikpKSB7Ci0JCQlpZiAoKHAgPSBnZXRfcHJvcGVydHkocm9vdCwKKwkJaWYgKChyb290ID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgoIi9ydGFzIikpKSB7CisJCQlpZiAoKHAgPSBvZl9nZXRfcHJvcGVydHkocm9vdCwKIAkJCQkJImlibSxkaXNwbGF5LWxpbmUtbGVuZ3RoIiwgTlVMTCkpKQogCQkJCWRpc3BsYXlfd2lkdGggPSAqcDsKLQkJCWlmICgocCA9IGdldF9wcm9wZXJ0eShyb290LAorCQkJaWYgKChwID0gb2ZfZ2V0X3Byb3BlcnR5KHJvb3QsCiAJCQkJCSJpYm0sZm9ybS1mZWVkIiwgTlVMTCkpKQogCQkJCWZvcm1fZmVlZCA9ICpwOwotCQkJaWYgKChwID0gZ2V0X3Byb3BlcnR5KHJvb3QsCisJCQlpZiAoKHAgPSBvZl9nZXRfcHJvcGVydHkocm9vdCwKIAkJCQkJImlibSxkaXNwbGF5LW51bWJlci1vZi1saW5lcyIsIE5VTEwpKSkKIAkJCQlkaXNwbGF5X2xpbmVzID0gKnA7Ci0JCQlyb3dfd2lkdGggPSBnZXRfcHJvcGVydHkocm9vdCwKKwkJCXJvd193aWR0aCA9IG9mX2dldF9wcm9wZXJ0eShyb290LAogCQkJCQkiaWJtLGRpc3BsYXktdHJ1bmNhdGlvbi1sZW5ndGgiLCBOVUxMKTsKKwkJCW9mX25vZGVfcHV0KHJvb3QpOwogCQl9CiAJCWRpc3BsYXlfY2hhcmFjdGVyID0gcnRhc190b2tlbigiZGlzcGxheS1jaGFyYWN0ZXIiKTsKIAkJc2V0X2luZGljYXRvciA9IHJ0YXNfdG9rZW4oInNldC1pbmRpY2F0b3IiKTsKQEAgLTI5OCw3ICsyOTksNyBAQAogCWNvbnN0IGludCAqdG9rcDsKIAlpZiAocnRhcy5kZXYgPT0gTlVMTCkKIAkJcmV0dXJuIFJUQVNfVU5LTk9XTl9TRVJWSUNFOwotCXRva3AgPSBnZXRfcHJvcGVydHkocnRhcy5kZXYsIHNlcnZpY2UsIE5VTEwpOworCXRva3AgPSBvZl9nZXRfcHJvcGVydHkocnRhcy5kZXYsIHNlcnZpY2UsIE5VTEwpOwogCXJldHVybiB0b2twID8gKnRva3AgOiBSVEFTX1VOS05PV05fU0VSVklDRTsKIH0KIEVYUE9SVF9TWU1CT0wocnRhc190b2tlbik7CkBAIC04MzIsMTIgKzgzMywxMiBAQAogCWlmIChydGFzLmRldikgewogCQljb25zdCB1MzIgKmJhc2VwLCAqZW50cnlwLCAqc2l6ZXA7CiAKLQkJYmFzZXAgPSBnZXRfcHJvcGVydHkocnRhcy5kZXYsICJsaW51eCxydGFzLWJhc2UiLCBOVUxMKTsKLQkJc2l6ZXAgPSBnZXRfcHJvcGVydHkocnRhcy5kZXYsICJydGFzLXNpemUiLCBOVUxMKTsKKwkJYmFzZXAgPSBvZl9nZXRfcHJvcGVydHkocnRhcy5kZXYsICJsaW51eCxydGFzLWJhc2UiLCBOVUxMKTsKKwkJc2l6ZXAgPSBvZl9nZXRfcHJvcGVydHkocnRhcy5kZXYsICJydGFzLXNpemUiLCBOVUxMKTsKIAkJaWYgKGJhc2VwICE9IE5VTEwgJiYgc2l6ZXAgIT0gTlVMTCkgewogCQkJcnRhcy5iYXNlID0gKmJhc2VwOwogCQkJcnRhcy5zaXplID0gKnNpemVwOwotCQkJZW50cnlwID0gZ2V0X3Byb3BlcnR5KHJ0YXMuZGV2LAorCQkJZW50cnlwID0gb2ZfZ2V0X3Byb3BlcnR5KHJ0YXMuZGV2LAogCQkJCQkibGludXgscnRhcy1lbnRyeSIsIE5VTEwpOwogCQkJaWYgKGVudHJ5cCA9PSBOVUxMKSAvKiBVZ2ggKi8KIAkJCQlydGFzLmVudHJ5ID0gcnRhcy5iYXNlOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9ydGFzX3BjaS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9ydGFzX3BjaS5jCmluZGV4IGFjZTlmNGMuLmYyMjg2ODIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcnRhc19wY2kuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3J0YXNfcGNpLmMKQEAgLTYwLDcgKzYwLDcgQEAKIHsKICAgICAgICAgY29uc3QgY2hhciAqc3RhdHVzOwogCi0gICAgICAgIHN0YXR1cyA9IGdldF9wcm9wZXJ0eShkbiwgInN0YXR1cyIsIE5VTEwpOworICAgICAgICBzdGF0dXMgPSBvZl9nZXRfcHJvcGVydHkoZG4sICJzdGF0dXMiLCBOVUxMKTsKIAogICAgICAgICBpZiAoIXN0YXR1cykKICAgICAgICAgICAgICAgICByZXR1cm4gMTsKQEAgLTE3Nyw3ICsxNzcsNyBAQAogCiBpbnQgaXNfcHl0aG9uKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2KQogewotCWNvbnN0IGNoYXIgKm1vZGVsID0gZ2V0X3Byb3BlcnR5KGRldiwgIm1vZGVsIiwgTlVMTCk7CisJY29uc3QgY2hhciAqbW9kZWwgPSBvZl9nZXRfcHJvcGVydHkoZGV2LCAibW9kZWwiLCBOVUxMKTsKIAogCWlmIChtb2RlbCAmJiBzdHJzdHIobW9kZWwsICJQeXRob24iKSkKIAkJcmV0dXJuIDE7CkBAIC0yNDcsNyArMjQ3LDcgQEAKIAljb25zdCBpbnQgKmJ1c19yYW5nZTsKIAl1bnNpZ25lZCBpbnQgbGVuOwogCi0JYnVzX3JhbmdlID0gZ2V0X3Byb3BlcnR5KGRldiwgImJ1cy1yYW5nZSIsICZsZW4pOworCWJ1c19yYW5nZSA9IG9mX2dldF9wcm9wZXJ0eShkZXYsICJidXMtcmFuZ2UiLCAmbGVuKTsKIAlpZiAoYnVzX3JhbmdlID09IE5VTEwgfHwgbGVuIDwgMiAqIHNpemVvZihpbnQpKSB7CiAJCXJldHVybiAxOwogIAl9CkBAIC0yNzQsNyArMjc0LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotdW5zaWduZWQgbG9uZyBfX2luaXQgZmluZF9hbmRfaW5pdF9waGJzKHZvaWQpCit2b2lkIF9faW5pdCBmaW5kX2FuZF9pbml0X3BoYnModm9pZCkKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGU7CiAJc3RydWN0IHBjaV9jb250cm9sbGVyICpwaGI7CkBAIC0zMDksMTggKzMwOSwxNiBAQAogCWlmIChvZl9jaG9zZW4pIHsKIAkJY29uc3QgaW50ICpwcm9wOwogCi0JCXByb3AgPSBnZXRfcHJvcGVydHkob2ZfY2hvc2VuLAorCQlwcm9wID0gb2ZfZ2V0X3Byb3BlcnR5KG9mX2Nob3NlbiwKIAkJCQkibGludXgscGNpLXByb2JlLW9ubHkiLCBOVUxMKTsKIAkJaWYgKHByb3ApCiAJCQlwY2lfcHJvYmVfb25seSA9ICpwcm9wOwogCi0JCXByb3AgPSBnZXRfcHJvcGVydHkob2ZfY2hvc2VuLAorCQlwcm9wID0gb2ZfZ2V0X3Byb3BlcnR5KG9mX2Nob3NlbiwKIAkJCQkibGludXgscGNpLWFzc2lnbi1hbGwtYnVzZXMiLCBOVUxMKTsKIAkJaWYgKHByb3ApCiAJCQlwY2lfYXNzaWduX2FsbF9idXNlcyA9ICpwcm9wOwogCX0KLQotCXJldHVybiAwOwogfQogCiAvKiBSUEEtc3BlY2lmaWMgYml0cyBmb3IgcmVtb3ZpbmcgUEhCcyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cC1jb21tb24uYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2V0dXAtY29tbW9uLmMKaW5kZXggODljZmFmNC4uMzcwODAzNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cC1jb21tb24uYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwLWNvbW1vbi5jCkBAIC0yMSw3ICsyMSw2IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0cmQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9pZGUuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KQEAgLTMwNCwyNiArMzAzLDggQEAKIHZvaWQgX19pbml0IGNoZWNrX2Zvcl9pbml0cmQodm9pZCkKIHsKICNpZmRlZiBDT05GSUdfQkxLX0RFVl9JTklUUkQKLQljb25zdCB1bnNpZ25lZCBpbnQgKnByb3A7Ci0JaW50IGxlbjsKLQotCURCRygiIC0+IGNoZWNrX2Zvcl9pbml0cmQoKVxuIik7Ci0KLQlpZiAob2ZfY2hvc2VuKSB7Ci0JCXByb3AgPSBnZXRfcHJvcGVydHkob2ZfY2hvc2VuLCAibGludXgsaW5pdHJkLXN0YXJ0IiwgJmxlbik7Ci0JCWlmIChwcm9wICE9IE5VTEwpIHsKLQkJCWluaXRyZF9zdGFydCA9ICh1bnNpZ25lZCBsb25nKQotCQkJCV9fdmEob2ZfcmVhZF91bG9uZyhwcm9wLCBsZW4gLyA0KSk7Ci0JCQlwcm9wID0gZ2V0X3Byb3BlcnR5KG9mX2Nob3NlbiwKLQkJCQkJImxpbnV4LGluaXRyZC1lbmQiLCAmbGVuKTsKLQkJCWlmIChwcm9wICE9IE5VTEwpIHsKLQkJCQlpbml0cmRfZW5kID0gKHVuc2lnbmVkIGxvbmcpCi0JCQkJCV9fdmEob2ZfcmVhZF91bG9uZyhwcm9wLCBsZW4gLyA0KSk7Ci0JCQkJaW5pdHJkX2JlbG93X3N0YXJ0X29rID0gMTsKLQkJCX0gZWxzZQotCQkJCWluaXRyZF9zdGFydCA9IDA7Ci0JCX0KLQl9CisJREJHKCIgLT4gY2hlY2tfZm9yX2luaXRyZCgpICBpbml0cmRfc3RhcnQ9MHglbHggIGluaXRyZF9lbmQ9MHglbHhcbiIsCisJICAgIGluaXRyZF9zdGFydCwgaW5pdHJkX2VuZCk7CiAKIAkvKiBJZiB3ZSB3ZXJlIHBhc3NlZCBhbiBpbml0cmQsIHNldCB0aGUgUk9PVF9ERVYgcHJvcGVybHkgaWYgdGhlIHZhbHVlcwogCSAqIGxvb2sgc2Vuc2libGUuIElmIG5vdCwgY2xlYXIgaW5pdHJkIHJlZmVyZW5jZS4KQEAgLTM3MSwxMSArMzUyLDEyIEBACiAJCWNvbnN0IGludCAqaW50c2VydjsKIAkJaW50IGosIGxlbiA9IHNpemVvZih1MzIpLCBudGhyZWFkcyA9IDE7CiAKLQkJaW50c2VydiA9IGdldF9wcm9wZXJ0eShkbiwgImlibSxwcGMtaW50ZXJydXB0LXNlcnZlciNzIiwgJmxlbik7CisJCWludHNlcnYgPSBvZl9nZXRfcHJvcGVydHkoZG4sICJpYm0scHBjLWludGVycnVwdC1zZXJ2ZXIjcyIsCisJCQkJJmxlbik7CiAJCWlmIChpbnRzZXJ2KQogCQkJbnRocmVhZHMgPSBsZW4gLyBzaXplb2YoaW50KTsKIAkJZWxzZSB7Ci0JCQlpbnRzZXJ2ID0gZ2V0X3Byb3BlcnR5KGRuLCAicmVnIiwgTlVMTCk7CisJCQlpbnRzZXJ2ID0gb2ZfZ2V0X3Byb3BlcnR5KGRuLCAicmVnIiwgTlVMTCk7CiAJCQlpZiAoIWludHNlcnYpCiAJCQkJaW50c2VydiA9ICZjcHU7CS8qIGFzc3VtZSBsb2dpY2FsID09IHBoeXMgKi8KIAkJfQpAQCAtMzk4LDEwICszODAsMTAgQEAKIAkJaW50IG51bV9hZGRyX2NlbGwsIG51bV9zaXplX2NlbGwsIG1heGNwdXM7CiAJCWNvbnN0IHVuc2lnbmVkIGludCAqaXJlZzsKIAotCQludW1fYWRkcl9jZWxsID0gcHJvbV9uX2FkZHJfY2VsbHMoZG4pOwotCQludW1fc2l6ZV9jZWxsID0gcHJvbV9uX3NpemVfY2VsbHMoZG4pOworCQludW1fYWRkcl9jZWxsID0gb2Zfbl9hZGRyX2NlbGxzKGRuKTsKKwkJbnVtX3NpemVfY2VsbCA9IG9mX25fc2l6ZV9jZWxscyhkbik7CiAKLQkJaXJlZyA9IGdldF9wcm9wZXJ0eShkbiwgImlibSxscmRyLWNhcGFjaXR5IiwgTlVMTCk7CisJCWlyZWcgPSBvZl9nZXRfcHJvcGVydHkoZG4sICJpYm0sbHJkci1jYXBhY2l0eSIsIE5VTEwpOwogCiAJCWlmICghaXJlZykKIAkJCWdvdG8gb3V0OwpAQCAtNDk2LDExICs0NzgsMzkgQEAKIAlwcmludGsoS0VSTl9JTkZPICJVc2luZyAlcyBtYWNoaW5lIGRlc2NyaXB0aW9uXG4iLCBwcGNfbWQubmFtZSk7CiB9CiAKKy8qIE1hdGNoIGEgY2xhc3Mgb2YgYm9hcmRzLCBub3QgYSBzcGVjaWZpYyBkZXZpY2UgY29uZmlndXJhdGlvbi4gKi8KIGludCBjaGVja19sZWdhY3lfaW9wb3J0KHVuc2lnbmVkIGxvbmcgYmFzZV9wb3J0KQogewotCWlmIChwcGNfbWQuY2hlY2tfbGVnYWN5X2lvcG9ydCA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gcHBjX21kLmNoZWNrX2xlZ2FjeV9pb3BvcnQoYmFzZV9wb3J0KTsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKnBhcmVudCwgKm5wID0gTlVMTDsKKwlpbnQgcmV0ID0gLUVOT0RFVjsKKworCXN3aXRjaChiYXNlX3BvcnQpIHsKKwljYXNlIEk4MDQyX0RBVEFfUkVHOgorCQlucCA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKE5VTEwsICI4MDQyIik7CisJCWJyZWFrOworCWNhc2UgRkRDX0JBU0U6IC8qIEZEQzEgKi8KKwkJbnAgPSBvZl9maW5kX25vZGVfYnlfdHlwZShOVUxMLCAiZmRjIik7CisJCWJyZWFrOworI2lmZGVmIENPTkZJR19QUENfUFJFUAorCWNhc2UgX1BJRFhSOgorCWNhc2UgX1BOUFdSUDoKKwljYXNlIFBOUEJJT1NfQkFTRToKKwkJLyogaW1wbGVtZW50IG1lICovCisjZW5kaWYKKwlkZWZhdWx0OgorCQkvKiBpcG1pIGlzIHN1cHBvc2VkIHRvIGZhaWwgaGVyZSAqLworCQlicmVhazsKKwl9CisJaWYgKCFucCkKKwkJcmV0dXJuIHJldDsKKwlwYXJlbnQgPSBvZl9nZXRfcGFyZW50KG5wKTsKKwlpZiAocGFyZW50KSB7CisJCWlmIChzdHJjbXAocGFyZW50LT50eXBlLCAiaXNhIikgPT0gMCkKKwkJCXJldCA9IDA7CisJCW9mX25vZGVfcHV0KHBhcmVudCk7CisJfQorCW9mX25vZGVfcHV0KG5wKTsKKwlyZXR1cm4gcmV0OwogfQogRVhQT1JUX1NZTUJPTChjaGVja19sZWdhY3lfaW9wb3J0KTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cF8zMi5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cF8zMi5jCmluZGV4IDQ0YTZhM2MuLjM1ZjhmNDQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2V0dXBfMzIuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwXzMyLmMKQEAgLTkyLDcgKzkyLDggQEAKIAogCS8qIEZpcnN0IHplcm8gdGhlIEJTUyAtLSB1c2UgbWVtc2V0X2lvLCBzb21lIHBsYXRmb3JtcyBkb24ndCBoYXZlCiAJICogY2FjaGVzIG9uIHlldCAqLwotCW1lbXNldF9pbygodm9pZCBfX2lvbWVtICopUFRSUkVMT0MoJl9fYnNzX3N0YXJ0KSwgMCwgX2VuZCAtIF9fYnNzX3N0YXJ0KTsKKwltZW1zZXRfaW8oKHZvaWQgX19pb21lbSAqKVBUUlJFTE9DKCZfX2Jzc19zdGFydCksIDAsCisJCQlfX2Jzc19zdG9wIC0gX19ic3Nfc3RhcnQpOwogCiAJLyoKIAkgKiBJZGVudGlmeSB0aGUgQ1BVIHR5cGUgYW5kIGZpeCB1cCBjb2RlIHNlY3Rpb25zCkBAIC0xOTUsMTggKzE5NiwyMiBAQAogCiAjZW5kaWYgLyogQ09ORklHX05WUkFNICovCiAKLXN0YXRpYyBzdHJ1Y3QgY3B1IGNwdV9kZXZpY2VzW05SX0NQVVNdOworc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBjcHUsIGNwdV9kZXZpY2VzKTsKIAogaW50IF9faW5pdCBwcGNfaW5pdCh2b2lkKQogewotCWludCBpOworCWludCBjcHU7CiAKIAkvKiBjbGVhciB0aGUgcHJvZ3Jlc3MgbGluZSAqLwotCWlmICggcHBjX21kLnByb2dyZXNzICkgcHBjX21kLnByb2dyZXNzKCIgICAgICAgICAgICAgIiwgMHhmZmZmKTsKKwlpZiAocHBjX21kLnByb2dyZXNzKQorCQlwcGNfbWQucHJvZ3Jlc3MoIiAgICAgICAgICAgICAiLCAweGZmZmYpOwogCiAJLyogcmVnaXN0ZXIgQ1BVIGRldmljZXMgKi8KLQlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkKLQkJcmVnaXN0ZXJfY3B1KCZjcHVfZGV2aWNlc1tpXSwgaSk7CisJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgeworCQlzdHJ1Y3QgY3B1ICpjID0gJnBlcl9jcHUoY3B1X2RldmljZXMsIGNwdSk7CisJCWMtPmhvdHBsdWdnYWJsZSA9IDE7CisJCXJlZ2lzdGVyX2NwdShjLCBjcHUpOworCX0KIAogCS8qIGNhbGwgcGxhdGZvcm0gaW5pdCAqLwogCWlmIChwcGNfbWQuaW5pdCAhPSBOVUxMKSB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwXzY0LmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwXzY0LmMKaW5kZXggMzczM2RlMy4uMjIwODNjZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cF82NC5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2V0dXBfNjQuYwpAQCAtMjAsNyArMjAsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdHJkLmg+Ci0jaW5jbHVkZSA8bGludXgvaWRlLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CkBAIC0xMTAsNyArMTA5LDcgQEAKIAlkbiA9IG9mX2ZpbmRfbm9kZV9ieV9wYXRoKCIvb3B0aW9ucyIpOwogCiAJaWYgKGRuKSB7Ci0JCXNtdF9vcHRpb24gPSBnZXRfcHJvcGVydHkoZG4sICJpYm0sc210LWVuYWJsZWQiLCBOVUxMKTsKKwkJc210X29wdGlvbiA9IG9mX2dldF9wcm9wZXJ0eShkbiwgImlibSxzbXQtZW5hYmxlZCIsIE5VTEwpOwogCiAgICAgICAgICAgICAgICAgaWYgKHNtdF9vcHRpb24pIHsKIAkJCWlmICghc3RyY21wKHNtdF9vcHRpb24sICJvbiIpKQpAQCAtMzA1LDEwICszMDQsMTAgQEAKIAogCQkJc2l6ZSA9IDA7CiAJCQlsc2l6ZSA9IGN1cl9jcHVfc3BlYy0+ZGNhY2hlX2JzaXplOwotCQkJc2l6ZXAgPSBnZXRfcHJvcGVydHkobnAsICJkLWNhY2hlLXNpemUiLCBOVUxMKTsKKwkJCXNpemVwID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAiZC1jYWNoZS1zaXplIiwgTlVMTCk7CiAJCQlpZiAoc2l6ZXAgIT0gTlVMTCkKIAkJCQlzaXplID0gKnNpemVwOwotCQkJbHNpemVwID0gZ2V0X3Byb3BlcnR5KG5wLCBkYywgTlVMTCk7CisJCQlsc2l6ZXAgPSBvZl9nZXRfcHJvcGVydHkobnAsIGRjLCBOVUxMKTsKIAkJCWlmIChsc2l6ZXAgIT0gTlVMTCkKIAkJCQlsc2l6ZSA9ICpsc2l6ZXA7CiAJCQlpZiAoc2l6ZXAgPT0gMCB8fCBsc2l6ZXAgPT0gMCkKQEAgLTMyMiwxMCArMzIxLDEwIEBACiAKIAkJCXNpemUgPSAwOwogCQkJbHNpemUgPSBjdXJfY3B1X3NwZWMtPmljYWNoZV9ic2l6ZTsKLQkJCXNpemVwID0gZ2V0X3Byb3BlcnR5KG5wLCAiaS1jYWNoZS1zaXplIiwgTlVMTCk7CisJCQlzaXplcCA9IG9mX2dldF9wcm9wZXJ0eShucCwgImktY2FjaGUtc2l6ZSIsIE5VTEwpOwogCQkJaWYgKHNpemVwICE9IE5VTEwpCiAJCQkJc2l6ZSA9ICpzaXplcDsKLQkJCWxzaXplcCA9IGdldF9wcm9wZXJ0eShucCwgaWMsIE5VTEwpOworCQkJbHNpemVwID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCBpYywgTlVMTCk7CiAJCQlpZiAobHNpemVwICE9IE5VTEwpCiAJCQkJbHNpemUgPSAqbHNpemVwOwogCQkJaWYgKHNpemVwID09IDAgfHwgbHNpemVwID09IDApCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3NtcC5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zbXAuYwppbmRleCA5MjRkNjkyLi5kOGU1MDNiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3NtcC5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc21wLmMKQEAgLTQyOCwxMCArNDI4LDYgQEAKIAlzbXBfd21iKCk7CiAJd2hpbGUgKF9fZ2V0X2NwdV92YXIoY3B1X3N0YXRlKSAhPSBDUFVfVVBfUFJFUEFSRSkKIAkJY3B1X3JlbGF4KCk7Ci0KLSNpZmRlZiBDT05GSUdfUFBDNjQKLQlmbHVzaF90bGJfcGVuZGluZygpOwotI2VuZGlmCiAJY3B1X3NldChjcHUsIGNwdV9vbmxpbmVfbWFwKTsKIAlsb2NhbF9pcnFfZW5hYmxlKCk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3N5c19wcGMzMi5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zeXNfcHBjMzIuYwppbmRleCA2NzNlOGQ5Li4wNDcyNDZhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3N5c19wcGMzMi5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc3lzX3BwYzMyLmMKQEAgLTUzLDEwICs1Myw2IEBACiAjaW5jbHVkZSA8YXNtL3BwYy1wY2kuaD4KICNpbmNsdWRlIDxhc20vc3lzY2FsbHMuaD4KIAotLyogcmVhZGRpciAmIGdldGRlbnRzICovCi0jZGVmaW5lIE5BTUVfT0ZGU0VUKGRlKSAoKGludCkgKChkZSktPmRfbmFtZSAtIChjaGFyIF9fdXNlciAqKSAoZGUpKSkKLSNkZWZpbmUgUk9VTkRfVVAoeCkgKCgoeCkrc2l6ZW9mKHUzMiktMSkgJiB+KHNpemVvZih1MzIpLTEpKQotCiBzdHJ1Y3Qgb2xkX2xpbnV4X2RpcmVudDMyIHsKIAl1MzIJCWRfaW5vOwogCXUzMgkJZF9vZmZzZXQ7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3N5c2ZzLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3N5c2ZzLmMKaW5kZXggZDU3ODE4YS4uOTMzZTIxNCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zeXNmcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc3lzZnMuYwpAQCAtNjYsMTYgKzY2LDE3IEBACiAJaWYgKCFjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9TTVQpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCW9wdGlvbnMgPSBmaW5kX3BhdGhfZGV2aWNlKCIvb3B0aW9ucyIpOworCW9wdGlvbnMgPSBvZl9maW5kX25vZGVfYnlfcGF0aCgiL29wdGlvbnMiKTsKIAlpZiAoIW9wdGlvbnMpCiAJCXJldHVybiAtRU5PREVWOwogCi0JdmFsID0gZ2V0X3Byb3BlcnR5KG9wdGlvbnMsICJpYm0sc210LXNub296ZS1kZWxheSIsIE5VTEwpOworCXZhbCA9IG9mX2dldF9wcm9wZXJ0eShvcHRpb25zLCAiaWJtLHNtdC1zbm9vemUtZGVsYXkiLCBOVUxMKTsKIAlpZiAoIXNtdF9zbm9vemVfY21kbGluZSAmJiB2YWwpIHsKIAkJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkKIAkJCXBlcl9jcHUoc210X3Nub296ZV9kZWxheSwgY3B1KSA9ICp2YWw7CiAJfQogCisJb2Zfbm9kZV9wdXQob3B0aW9ucyk7CiAJcmV0dXJuIDA7CiB9CiBfX2luaXRjYWxsKHNtdF9zZXR1cCk7CkBAIC0xODksMTIgKzE5MCwxMiBAQAogU1lTRlNfUE1DU0VUVVAoc3B1cnIsIFNQUk5fU1BVUlIpOwogU1lTRlNfUE1DU0VUVVAoZHNjciwgU1BSTl9EU0NSKTsKIAotU1lTRlNfUE1DU0VUVVAocGE2dF9wbWMwLCBQQTZUX1NQUk5fUE1DMCk7Ci1TWVNGU19QTUNTRVRVUChwYTZ0X3BtYzEsIFBBNlRfU1BSTl9QTUMxKTsKLVNZU0ZTX1BNQ1NFVFVQKHBhNnRfcG1jMiwgUEE2VF9TUFJOX1BNQzIpOwotU1lTRlNfUE1DU0VUVVAocGE2dF9wbWMzLCBQQTZUX1NQUk5fUE1DMyk7Ci1TWVNGU19QTUNTRVRVUChwYTZ0X3BtYzQsIFBBNlRfU1BSTl9QTUM0KTsKLVNZU0ZTX1BNQ1NFVFVQKHBhNnRfcG1jNSwgUEE2VF9TUFJOX1BNQzUpOworU1lTRlNfUE1DU0VUVVAocGE2dF9wbWMwLCBTUFJOX1BBNlRfUE1DMCk7CitTWVNGU19QTUNTRVRVUChwYTZ0X3BtYzEsIFNQUk5fUEE2VF9QTUMxKTsKK1NZU0ZTX1BNQ1NFVFVQKHBhNnRfcG1jMiwgU1BSTl9QQTZUX1BNQzIpOworU1lTRlNfUE1DU0VUVVAocGE2dF9wbWMzLCBTUFJOX1BBNlRfUE1DMyk7CitTWVNGU19QTUNTRVRVUChwYTZ0X3BtYzQsIFNQUk5fUEE2VF9QTUM0KTsKK1NZU0ZTX1BNQ1NFVFVQKHBhNnRfcG1jNSwgU1BSTl9QQTZUX1BNQzUpOwogCiAKIHN0YXRpYyBTWVNERVZfQVRUUihtbWNyYSwgMDYwMCwgc2hvd19tbWNyYSwgc3RvcmVfbW1jcmEpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC90aW1lLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3RpbWUuYwppbmRleCBmNmYwYzZiLi43Y2VkZWY4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3RpbWUuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3RpbWUuYwpAQCAtODM0LDcgKzgzNCw3IEBACiAJY3B1ID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUoTlVMTCwgImNwdSIpOwogCiAJaWYgKGNwdSkgewotCQlmcCA9IGdldF9wcm9wZXJ0eShjcHUsIG5hbWUsIE5VTEwpOworCQlmcCA9IG9mX2dldF9wcm9wZXJ0eShjcHUsIG5hbWUsIE5VTEwpOwogCQlpZiAoZnApIHsKIAkJCWZvdW5kID0gMTsKIAkJCSp2YWwgPSBvZl9yZWFkX3Vsb25nKGZwLCBjZWxscyk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3RyYXBzLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3RyYXBzLmMKaW5kZXggMTc3MjRmYi4uZjc4NjIyMiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdHJhcHMuYwpAQCAtOTAsMjEgKzkwLDExIEBACiAgKiBUcmFwICYgRXhjZXB0aW9uIHN1cHBvcnQKICAqLwogCi1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKGRpZV9sb2NrKTsKLQotaW50IGRpZShjb25zdCBjaGFyICpzdHIsIHN0cnVjdCBwdF9yZWdzICpyZWdzLCBsb25nIGVycikKLXsKLQlzdGF0aWMgaW50IGRpZV9jb3VudGVyOwotCi0JaWYgKGRlYnVnZ2VyKHJlZ3MpKQotCQlyZXR1cm4gMTsKLQotCWNvbnNvbGVfdmVyYm9zZSgpOwotCXNwaW5fbG9ja19pcnEoJmRpZV9sb2NrKTsKLQlidXN0X3NwaW5sb2NrcygxKTsKICNpZmRlZiBDT05GSUdfUE1BQ19CQUNLTElHSFQKK3N0YXRpYyB2b2lkIHBtYWNfYmFja2xpZ2h0X3VuYmxhbmsodm9pZCkKK3sKIAltdXRleF9sb2NrKCZwbWFjX2JhY2tsaWdodF9tdXRleCk7Ci0JaWYgKG1hY2hpbmVfaXMocG93ZXJtYWMpICYmIHBtYWNfYmFja2xpZ2h0KSB7CisJaWYgKHBtYWNfYmFja2xpZ2h0KSB7CiAJCXN0cnVjdCBiYWNrbGlnaHRfcHJvcGVydGllcyAqcHJvcHM7CiAKIAkJcHJvcHMgPSAmcG1hY19iYWNrbGlnaHQtPnByb3BzOwpAQCAtMTEzLDI2ICsxMDMsNjcgQEAKIAkJYmFja2xpZ2h0X3VwZGF0ZV9zdGF0dXMocG1hY19iYWNrbGlnaHQpOwogCX0KIAltdXRleF91bmxvY2soJnBtYWNfYmFja2xpZ2h0X211dGV4KTsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgcG1hY19iYWNrbGlnaHRfdW5ibGFuayh2b2lkKSB7IH0KICNlbmRpZgotCXByaW50aygiT29wczogJXMsIHNpZzogJWxkIFsjJWRdXG4iLCBzdHIsIGVyciwgKytkaWVfY291bnRlcik7CisKK2ludCBkaWUoY29uc3QgY2hhciAqc3RyLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywgbG9uZyBlcnIpCit7CisJc3RhdGljIHN0cnVjdCB7CisJCXNwaW5sb2NrX3QgbG9jazsKKwkJdTMyIGxvY2tfb3duZXI7CisJCWludCBsb2NrX293bmVyX2RlcHRoOworCX0gZGllID0geworCQkubG9jayA9CQkJX19TUElOX0xPQ0tfVU5MT0NLRUQoZGllLmxvY2spLAorCQkubG9ja19vd25lciA9CQktMSwKKwkJLmxvY2tfb3duZXJfZGVwdGggPQkwCisJfTsKKwlzdGF0aWMgaW50IGRpZV9jb3VudGVyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoZGVidWdnZXIocmVncykpCisJCXJldHVybiAxOworCisJb29wc19lbnRlcigpOworCisJaWYgKGRpZS5sb2NrX293bmVyICE9IHJhd19zbXBfcHJvY2Vzc29yX2lkKCkpIHsKKwkJY29uc29sZV92ZXJib3NlKCk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZkaWUubG9jaywgZmxhZ3MpOworCQlkaWUubG9ja19vd25lciA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwkJZGllLmxvY2tfb3duZXJfZGVwdGggPSAwOworCQlidXN0X3NwaW5sb2NrcygxKTsKKwkJaWYgKG1hY2hpbmVfaXMocG93ZXJtYWMpKQorCQkJcG1hY19iYWNrbGlnaHRfdW5ibGFuaygpOworCX0gZWxzZSB7CisJCWxvY2FsX3NhdmVfZmxhZ3MoZmxhZ3MpOworCX0KKworCWlmICgrK2RpZS5sb2NrX293bmVyX2RlcHRoIDwgMykgeworCQlwcmludGsoIk9vcHM6ICVzLCBzaWc6ICVsZCBbIyVkXVxuIiwgc3RyLCBlcnIsICsrZGllX2NvdW50ZXIpOwogI2lmZGVmIENPTkZJR19QUkVFTVBUCi0JcHJpbnRrKCJQUkVFTVBUICIpOworCQlwcmludGsoIlBSRUVNUFQgIik7CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfU01QCi0JcHJpbnRrKCJTTVAgTlJfQ1BVUz0lZCAiLCBOUl9DUFVTKTsKKwkJcHJpbnRrKCJTTVAgTlJfQ1BVUz0lZCAiLCBOUl9DUFVTKTsKICNlbmRpZgogI2lmZGVmIENPTkZJR19ERUJVR19QQUdFQUxMT0MKLQlwcmludGsoIkRFQlVHX1BBR0VBTExPQyAiKTsKKwkJcHJpbnRrKCJERUJVR19QQUdFQUxMT0MgIik7CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfTlVNQQotCXByaW50aygiTlVNQSAiKTsKKwkJcHJpbnRrKCJOVU1BICIpOwogI2VuZGlmCi0JcHJpbnRrKCIlc1xuIiwgcHBjX21kLm5hbWUgPyAiIiA6IHBwY19tZC5uYW1lKTsKKwkJcHJpbnRrKCIlc1xuIiwgcHBjX21kLm5hbWUgPyBwcGNfbWQubmFtZSA6ICIiKTsKIAotCXByaW50X21vZHVsZXMoKTsKLQlzaG93X3JlZ3MocmVncyk7CisJCXByaW50X21vZHVsZXMoKTsKKwkJc2hvd19yZWdzKHJlZ3MpOworCX0gZWxzZSB7CisJCXByaW50aygiUmVjdXJzaXZlIGRpZSgpIGZhaWx1cmUsIG91dHB1dCBzdXBwcmVzc2VkXG4iKTsKKwl9CisKIAlidXN0X3NwaW5sb2NrcygwKTsKLQlzcGluX3VubG9ja19pcnEoJmRpZV9sb2NrKTsKKwlkaWUubG9ja19vd25lciA9IC0xOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRpZS5sb2NrLCBmbGFncyk7CiAKIAlpZiAoa2V4ZWNfc2hvdWxkX2NyYXNoKGN1cnJlbnQpIHx8CiAJCWtleGVjX3NyX2FjdGl2YXRlZChzbXBfcHJvY2Vzc29yX2lkKCkpKQpAQCAtMTQ1LDYgKzE3Niw3IEBACiAJaWYgKHBhbmljX29uX29vcHMpCiAJCXBhbmljKCJGYXRhbCBleGNlcHRpb24iKTsKIAorCW9vcHNfZXhpdCgpOwogCWRvX2V4aXQoZXJyKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC92aW8uYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdmlvLmMKaW5kZXggMjk2OGZmZS4uOWVhZWZhYyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC92aW8uYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Zpby5jCkBAIC04MSw3ICs4MSw3IEBACiAJCXN0cnVjdCBpb21tdV90YWJsZSAqdGJsOwogCQl1bnNpZ25lZCBsb25nIG9mZnNldCwgc2l6ZTsKIAotCQlkbWFfd2luZG93ID0gZ2V0X3Byb3BlcnR5KGRldi0+ZGV2LmFyY2hkYXRhLm9mX25vZGUsCisJCWRtYV93aW5kb3cgPSBvZl9nZXRfcHJvcGVydHkoZGV2LT5kZXYuYXJjaGRhdGEub2Zfbm9kZSwKIAkJCQkJICAiaWJtLG15LWRtYS13aW5kb3ciLCBOVUxMKTsKIAkJaWYgKCFkbWFfd2luZG93KQogCQkJcmV0dXJuIE5VTEw7CkBAIC0yMjYsNyArMjI2LDcgQEAKIAkJcmV0dXJuIE5VTEw7CiAJfQogCi0JdW5pdF9hZGRyZXNzID0gZ2V0X3Byb3BlcnR5KG9mX25vZGUsICJyZWciLCBOVUxMKTsKKwl1bml0X2FkZHJlc3MgPSBvZl9nZXRfcHJvcGVydHkob2Zfbm9kZSwgInJlZyIsIE5VTEwpOwogCWlmICh1bml0X2FkZHJlc3MgPT0gTlVMTCkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogbm9kZSAlcyBtaXNzaW5nICdyZWcnXG4iLAogCQkJCV9fRlVOQ1RJT05fXywKQEAgLTI0Niw3ICsyNDYsNyBAQAogCXZpb2Rldi0+dHlwZSA9IG9mX25vZGUtPnR5cGU7CiAJdmlvZGV2LT51bml0X2FkZHJlc3MgPSAqdW5pdF9hZGRyZXNzOwogCWlmIChmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0lTRVJJRVMpKSB7Ci0JCXVuaXRfYWRkcmVzcyA9IGdldF9wcm9wZXJ0eShvZl9ub2RlLAorCQl1bml0X2FkZHJlc3MgPSBvZl9nZXRfcHJvcGVydHkob2Zfbm9kZSwKIAkJCQkibGludXgsdW5pdF9hZGRyZXNzIiwgTlVMTCk7CiAJCWlmICh1bml0X2FkZHJlc3MgIT0gTlVMTCkKIAkJCXZpb2Rldi0+dW5pdF9hZGRyZXNzID0gKnVuaXRfYWRkcmVzczsKQEAgLTMwOCw3ICszMDgsNyBAQAogCQlyZXR1cm4gZXJyOwogCX0KIAotCW5vZGVfdnJvb3QgPSBmaW5kX2RldmljZXMoInZkZXZpY2UiKTsKKwlub2RlX3Zyb290ID0gb2ZfZmluZF9ub2RlX2J5X25hbWUoTlVMTCwgInZkZXZpY2UiKTsKIAlpZiAobm9kZV92cm9vdCkgewogCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX25vZGU7CiAKQEAgLTMyMiw2ICszMjIsNyBAQAogCQkJCQlfX0ZVTkNUSU9OX18sIG9mX25vZGUpOwogCQkJdmlvX3JlZ2lzdGVyX2RldmljZV9ub2RlKG9mX25vZGUpOwogCQl9CisJCW9mX25vZGVfcHV0KG5vZGVfdnJvb3QpOwogCX0KIAogCXJldHVybiAwOwpAQCAtMzc3LDcgKzM3OCw3IEBACiAJZG4gPSBkZXYtPmFyY2hkYXRhLm9mX25vZGU7CiAJaWYgKCFkbikKIAkJcmV0dXJuIC1FTk9ERVY7Ci0JY3AgPSBnZXRfcHJvcGVydHkoZG4sICJjb21wYXRpYmxlIiwgJmxlbmd0aCk7CisJY3AgPSBvZl9nZXRfcHJvcGVydHkoZG4sICJjb21wYXRpYmxlIiwgJmxlbmd0aCk7CiAJaWYgKCFjcCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKQEAgLTQwNiwxMiArNDA3LDEyIEBACiAgKiBAd2hpY2g6CVRoZSBwcm9wZXJ0eS9hdHRyaWJ1dGUgdG8gYmUgZXh0cmFjdGVkLgogICogQGxlbmd0aDoJUG9pbnRlciB0byBsZW5ndGggb2YgcmV0dXJuZWQgZGF0YSBzaXplICh1bnVzZWQgaWYgTlVMTCkuCiAgKgotICogQ2FsbHMgcHJvbS5jJ3MgZ2V0X3Byb3BlcnR5KCkgdG8gcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUKKyAqIENhbGxzIHByb20uYydzIG9mX2dldF9wcm9wZXJ0eSgpIHRvIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlCiAgKiBhdHRyaWJ1dGUgc3BlY2lmaWVkIGJ5IEB3aGljaAogKi8KIGNvbnN0IHZvaWQgKnZpb19nZXRfYXR0cmlidXRlKHN0cnVjdCB2aW9fZGV2ICp2ZGV2LCBjaGFyICp3aGljaCwgaW50ICpsZW5ndGgpCiB7Ci0JcmV0dXJuIGdldF9wcm9wZXJ0eSh2ZGV2LT5kZXYuYXJjaGRhdGEub2Zfbm9kZSwgd2hpY2gsIGxlbmd0aCk7CisJcmV0dXJuIG9mX2dldF9wcm9wZXJ0eSh2ZGV2LT5kZXYuYXJjaGRhdGEub2Zfbm9kZSwgd2hpY2gsIGxlbmd0aCk7CiB9CiBFWFBPUlRfU1lNQk9MKHZpb19nZXRfYXR0cmlidXRlKTsKIApAQCAtNDQzLDcgKzQ0NCw3IEBACiAJY2hhciBrb2JqX25hbWVbQlVTX0lEX1NJWkVdOwogCiAJLyogY29uc3RydWN0IHRoZSBrb2JqZWN0IG5hbWUgZnJvbSB0aGUgZGV2aWNlIG5vZGUgKi8KLQl1bml0X2FkZHJlc3MgPSBnZXRfcHJvcGVydHkodm5vZGUsICJyZWciLCBOVUxMKTsKKwl1bml0X2FkZHJlc3MgPSBvZl9nZXRfcHJvcGVydHkodm5vZGUsICJyZWciLCBOVUxMKTsKIAlpZiAoIXVuaXRfYWRkcmVzcykKIAkJcmV0dXJuIE5VTEw7CiAJc25wcmludGYoa29ial9uYW1lLCBCVVNfSURfU0laRSwgIiV4IiwgKnVuaXRfYWRkcmVzcyk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbGliL01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL2xpYi9NYWtlZmlsZQppbmRleCA0YjFiYTQ5Li40NTAyNThkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbGliL01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9saWIvTWFrZWZpbGUKQEAgLTcsMTMgKzcsMTIgQEAKIGVuZGlmCiAKIGlmZXEgKCQoQ09ORklHX1BQQ19NRVJHRSkseSkKLW9iai15CQkJOj0gc3RyaW5nLm8gc3RyY2FzZS5vCitvYmoteQkJCTo9IHN0cmluZy5vCiBvYmotJChDT05GSUdfUFBDMzIpCSs9IGRpdjY0Lm8gY29weV8zMi5vIGNoZWNrc3VtXzMyLm8KIGVuZGlmCiAKIG9iai0kKENPTkZJR19QUEM2NCkJKz0gY2hlY2tzdW1fNjQubyBjb3B5cGFnZV82NC5vIGNvcHl1c2VyXzY0Lm8gXAotCQkJICAgbWVtY3B5XzY0Lm8gdXNlcmNvcHlfNjQubyBtZW1fNjQubyBzdHJpbmcubyBcCi0JCQkgICBzdHJjYXNlLm8KKwkJCSAgIG1lbWNweV82NC5vIHVzZXJjb3B5XzY0Lm8gbWVtXzY0Lm8gc3RyaW5nLm8KIG9iai0kKENPTkZJR19RVUlDQ19FTkdJTkUpICs9IHJoZWFwLm8KIG9iai0kKENPTkZJR19YTU9OKQkrPSBzc3RlcC5vCiBvYmotJChDT05GSUdfS1BST0JFUykJKz0gc3N0ZXAubwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2xpYi9jb3B5dXNlcl82NC5TIGIvYXJjaC9wb3dlcnBjL2xpYi9jb3B5dXNlcl82NC5TCmluZGV4IGE2YjU0Y2IuLjI1ZWM1MzcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9saWIvY29weXVzZXJfNjQuUworKysgYi9hcmNoL3Bvd2VycGMvbGliL2NvcHl1c2VyXzY0LlMKQEAgLTI0LDcgKzI0LDcgQEAKIAlkY2J0CTAscjQKIAliZXEJLkxjb3B5X3BhZ2VfNEsKIAlhbmRpLglyNixyNiw3Ci0JbXRjcmYJMHgwMSxyNQorCVBQQ19NVE9DUkYJMHgwMSxyNQogCWJsdAljcjEsLkxzaG9ydF9jb3B5CiAJYm5lCS5MZHN0X3VuYWxpZ25lZAogLkxkc3RfYWxpZ25lZDoKQEAgLTEzNSw3ICsxMzUsNyBAQAogCWIJLkxkb190YWlsCiAKIC5MZHN0X3VuYWxpZ25lZDoKLQltdGNyZgkweDAxLHI2CQkvKiBwdXQgI2J5dGVzIHRvIDhCIGJkcnkgaW50byBjcjcgKi8KKwlQUENfTVRPQ1JGCTB4MDEscjYJCS8qIHB1dCAjYnl0ZXMgdG8gOEIgYmRyeSBpbnRvIGNyNyAqLwogCXN1YmYJcjUscjYscjUKIAlsaQlyNywwCiAJY21wbGRpCXIxLHI1LDE2CkBAIC0xNTAsNyArMTUwLDcgQEAKIDI6CWJmCWNyNyo0KzEsM2YKIDM3Oglsd3p4CXIwLHI3LHI0CiA4MzoJc3R3eAlyMCxyNyxyMwotMzoJbXRjcmYJMHgwMSxyNQorMzoJUFBDX01UT0NSRgkweDAxLHI1CiAJYWRkCXI0LHI2LHI0CiAJYWRkCXIzLHI2LHIzCiAJYgkuTGRzdF9hbGlnbmVkCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbGliL2xvY2tzLmMgYi9hcmNoL3Bvd2VycGMvbGliL2xvY2tzLmMKaW5kZXggODBiNDgyYy4uNzlkMGZhMyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2xpYi9sb2Nrcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9saWIvbG9ja3MuYwpAQCAtNDMsOSArNDMsMTEgQEAKIAlpZiAoZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9JU0VSSUVTKSkKIAkJSHZDYWxsMihIdkNhbGxCYXNlWWllbGRQcm9jZXNzb3IsIEh2Q2FsbF9ZaWVsZFRvUHJvYywKIAkJCSgodTY0KWhvbGRlcl9jcHUgPDwgMzIpIHwgeWllbGRfY291bnQpOworI2lmZGVmIENPTkZJR19QUENfU1BMUEFSCiAJZWxzZQogCQlwbHBhcl9oY2FsbF9ub3JldHMoSF9DT05GRVIsCiAJCQlnZXRfaGFyZF9zbXBfcHJvY2Vzc29yX2lkKGhvbGRlcl9jcHUpLCB5aWVsZF9jb3VudCk7CisjZW5kaWYKIH0KIAogLyoKQEAgLTcyLDkgKzc0LDExIEBACiAJaWYgKGZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfSVNFUklFUykpCiAJCUh2Q2FsbDIoSHZDYWxsQmFzZVlpZWxkUHJvY2Vzc29yLCBIdkNhbGxfWWllbGRUb1Byb2MsCiAJCQkoKHU2NClob2xkZXJfY3B1IDw8IDMyKSB8IHlpZWxkX2NvdW50KTsKKyNpZmRlZiBDT05GSUdfUFBDX1NQTFBBUgogCWVsc2UKIAkJcGxwYXJfaGNhbGxfbm9yZXRzKEhfQ09ORkVSLAogCQkJZ2V0X2hhcmRfc21wX3Byb2Nlc3Nvcl9pZChob2xkZXJfY3B1KSwgeWllbGRfY291bnQpOworI2VuZGlmCiB9CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2xpYi9tZW1fNjQuUyBiL2FyY2gvcG93ZXJwYy9saWIvbWVtXzY0LlMKaW5kZXggNjhkZjIwMi4uMTFjZTA0NSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2xpYi9tZW1fNjQuUworKysgYi9hcmNoL3Bvd2VycGMvbGliL21lbV82NC5TCkBAIC0xOSw3ICsxOSw3IEBACiAJcmx3aW1pCXI0LHI0LDE2LDAsMTUKIAljbXBsdwljcjEscjUscjAJCS8qIGRvIHdlIGdldCB0aGF0IGZhcj8gKi8KIAlybGRpbWkJcjQscjQsMzIsMAotCW10Y3JmCTEscjAKKwlQUENfTVRPQ1JGCTEscjAKIAltcglyNixyMwogCWJsdAljcjEsOGYKIAliZXErCTNmCQkJLyogaWYgYWxyZWFkeSA4LWJ5dGUgYWxpZ25lZCAqLwpAQCAtNDksNyArNDksNyBAQAogCWJkbnoJNGIKIDU6CXNyd2kuCXIwLHI1LDMKIAljbHJsd2kJcjUscjUsMjkKLQltdGNyZgkxLHIwCisJUFBDX01UT0NSRgkxLHIwCiAJYmVxCThmCiAJYmYJMjksNmYKIAlzdGQJcjQsMChyNikKQEAgLTY1LDcgKzY1LDcgQEAKIAlzdGQJcjQsMChyNikKIAlhZGRpCXI2LHI2LDgKIDg6CWNtcHdpCXI1LDAKLQltdGNyZgkxLHI1CisJUFBDX01UT0NSRgkxLHI1CiAJYmVxbHIrCiAJYmYJMjksOWYKIAlzdHcJcjQsMChyNikKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9saWIvbWVtY3B5XzY0LlMgYi9hcmNoL3Bvd2VycGMvbGliL21lbWNweV82NC5TCmluZGV4IDcxNzNiYTkuLjNmMTMxMTIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9saWIvbWVtY3B5XzY0LlMKKysrIGIvYXJjaC9wb3dlcnBjL2xpYi9tZW1jcHlfNjQuUwpAQCAtMTIsNyArMTIsNyBAQAogCS5hbGlnbgk3CiBfR0xPQkFMKG1lbWNweSkKIAlzdGQJcjMsNDgocjEpCS8qIHNhdmUgZGVzdGluYXRpb24gcG9pbnRlciBmb3IgcmV0dXJuIHZhbHVlICovCi0JbXRjcmYJMHgwMSxyNQorCVBQQ19NVE9DUkYJMHgwMSxyNQogCWNtcGxkaQljcjEscjUsMTYKIAluZWcJcjYscjMJCSMgTFMgMyBiaXRzID0gIyBieXRlcyB0byA4LWJ5dGUgZGVzdCBiZHJ5CiAJYW5kaS4JcjYscjYsNwpAQCAtMTI4LDcgKzEyOCw3IEBACiAJYgkuTGRvX3RhaWwKIAogLkxkc3RfdW5hbGlnbmVkOgotCW10Y3JmCTB4MDEscjYJCSMgcHV0ICNieXRlcyB0byA4QiBiZHJ5IGludG8gY3I3CisJUFBDX01UT0NSRgkweDAxLHI2CQkjIHB1dCAjYnl0ZXMgdG8gOEIgYmRyeSBpbnRvIGNyNwogCXN1YmYJcjUscjYscjUKIAlsaQlyNywwCiAJY21wbGRpCXIxLHI1LDE2CkBAIC0xNDMsNyArMTQzLDcgQEAKIDI6CWJmCWNyNyo0KzEsM2YKIAlsd3p4CXIwLHI3LHI0CiAJc3R3eAlyMCxyNyxyMwotMzoJbXRjcmYJMHgwMSxyNQorMzoJUFBDX01UT0NSRgkweDAxLHI1CiAJYWRkCXI0LHI2LHI0CiAJYWRkCXIzLHI2LHIzCiAJYgkuTGRzdF9hbGlnbmVkCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbGliL3NzdGVwLmMgYi9hcmNoL3Bvd2VycGMvbGliL3NzdGVwLmMKaW5kZXggN2U4ZGVkMC4uNGFhZTBjMyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2xpYi9zc3RlcC5jCisrKyBiL2FyY2gvcG93ZXJwYy9saWIvc3N0ZXAuYwpAQCAtNTQsNyArNTQsNyBAQAogICovCiBpbnQgX19rcHJvYmVzIGVtdWxhdGVfc3RlcChzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgaW50IGluc3RyKQogewotCXVuc2lnbmVkIGludCBvcGNvZGUsIHJkOworCXVuc2lnbmVkIGludCBvcGNvZGUsIHJzLCByYiwgcmQsIHNwcjsKIAl1bnNpZ25lZCBsb25nIGludCBpbW07CiAKIAlvcGNvZGUgPSBpbnN0ciA+PiAyNjsKQEAgLTE1Miw2ICsxNTIsNDkgQEAKIAkJCQlyZWdzLT5uaXAgJj0gMHhmZmZmZmZmZlVMOwogCQkJcmV0dXJuIDE7CiAjZW5kaWYKKwkJY2FzZSAweDI2OgkvKiBtZmNyICovCisJCQlyZWdzLT5ncHJbcmRdID0gcmVncy0+Y2NyOworCQkJcmVncy0+Z3ByW3JkXSAmPSAweGZmZmZmZmZmVUw7CisJCQlnb3RvIG10c3ByX291dDsKKwkJY2FzZSAweDJhNjoJLyogbWZzcHIgKi8KKwkJCXNwciA9IChpbnN0ciA+PiAxMSkgJiAweDNmZjsKKwkJCXN3aXRjaCAoc3ByKSB7CisJCQljYXNlIDB4MjA6CS8qIG1meGVyICovCisJCQkJcmVncy0+Z3ByW3JkXSA9IHJlZ3MtPnhlcjsKKwkJCQlyZWdzLT5ncHJbcmRdICY9IDB4ZmZmZmZmZmZVTDsKKwkJCQlnb3RvIG10c3ByX291dDsKKwkJCWNhc2UgMHgxMDA6CS8qIG1mbHIgKi8KKwkJCQlyZWdzLT5ncHJbcmRdID0gcmVncy0+bGluazsKKwkJCQlnb3RvIG10c3ByX291dDsKKwkJCWNhc2UgMHgxMjA6CS8qIG1mY3RyICovCisJCQkJcmVncy0+Z3ByW3JkXSA9IHJlZ3MtPmN0cjsKKwkJCQlnb3RvIG10c3ByX291dDsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIDB4Mzc4OgkvKiBvcnggKi8KKwkJCXJzID0gKGluc3RyID4+IDIxKSAmIDB4MWY7CisJCQlyYiA9IChpbnN0ciA+PiAxMSkgJiAweDFmOworCQkJaWYgKHJzID09IHJiKSB7CQkvKiBtciAqLworCQkJCXJkID0gKGluc3RyID4+IDE2KSAmIDB4MWY7CisJCQkJcmVncy0+Z3ByW3JkXSA9IHJlZ3MtPmdwcltyc107CisJCQkJZ290byBtdHNwcl9vdXQ7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAweDNhNjoJLyogbXRzcHIgKi8KKwkJCXNwciA9IChpbnN0ciA+PiAxMSkgJiAweDNmZjsKKwkJCXN3aXRjaCAoc3ByKSB7CisJCQljYXNlIDB4MjA6CS8qIG10eGVyICovCisJCQkJcmVncy0+eGVyID0gKHJlZ3MtPmdwcltyZF0gJiAweGZmZmZmZmZmVUwpOworCQkJCWdvdG8gbXRzcHJfb3V0OworCQkJY2FzZSAweDEwMDoJLyogbXRsciAqLworCQkJCXJlZ3MtPmxpbmsgPSByZWdzLT5ncHJbcmRdOworCQkJCWdvdG8gbXRzcHJfb3V0OworCQkJY2FzZSAweDEyMDoJLyogbXRjdHIgKi8KKwkJCQlyZWdzLT5jdHIgPSByZWdzLT5ncHJbcmRdOworbXRzcHJfb3V0OgorCQkJCXJlZ3MtPm5pcCArPSA0OworCQkJCXJldHVybiAxOworCQkJfQogCQl9CiAJfQogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2xpYi9zdHJjYXNlLmMgYi9hcmNoL3Bvd2VycGMvbGliL3N0cmNhc2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhlYzFlYi4uMDAwMDAwMAotLS0gYS9hcmNoL3Bvd2VycGMvbGliL3N0cmNhc2UuYworKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0KLWludCBzdHJjYXNlY21wKGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMikKLXsKLQlpbnQgYzEsIGMyOwotCi0JZG8gewotCQljMSA9IHRvbG93ZXIoKnMxKyspOwotCQljMiA9IHRvbG93ZXIoKnMyKyspOwotCX0gd2hpbGUgKGMxID09IGMyICYmIGMxICE9IDApOwotCXJldHVybiBjMSAtIGMyOwotfQotCi1pbnQgc3RybmNhc2VjbXAoY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyLCBzaXplX3QgbikKLXsKLQlpbnQgYzEsIGMyOwotCi0JZG8gewotCQljMSA9IHRvbG93ZXIoKnMxKyspOwotCQljMiA9IHRvbG93ZXIoKnMyKyspOwotCX0gd2hpbGUgKCgtLW4gPiAwKSAmJiBjMSA9PSBjMiAmJiBjMSAhPSAwKTsKLQlyZXR1cm4gYzEgLSBjMjsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS9oYXNoX2xvd18zMi5TIGIvYXJjaC9wb3dlcnBjL21tL2hhc2hfbG93XzMyLlMKaW5kZXggYmQ2OGRmNS4uZGRjZWVmYyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL2hhc2hfbG93XzMyLlMKKysrIGIvYXJjaC9wb3dlcnBjL21tL2hhc2hfbG93XzMyLlMKQEAgLTI4Myw2ICsyODMsNyBAQAogI2RlZmluZSBQVEVHX1NJWkUJNjQKICNkZWZpbmUgTEdfUFRFR19TSVpFCTYKICNkZWZpbmUgTERQVEV1CQlsd3p1CisjZGVmaW5lIExEUFRFCQlsd3oKICNkZWZpbmUgU1RQVEUJCXN0dwogI2RlZmluZSBDTVBQVEUJCWNtcHcKICNkZWZpbmUgUFRFX0gJCTB4NDAKQEAgLTM4OSwxMyArMzkwLDMwIEBACiAJICogYW5kIHdlIGtub3cgdGhlcmUgaXMgYSBkZWZpbml0ZSAoYWx0aG91Z2ggc21hbGwpIHNwZWVkCiAJICogYWR2YW50YWdlIHRvIHB1dHRpbmcgdGhlIFBURSBpbiB0aGUgcHJpbWFyeSBQVEVHLCB3ZSBhbHdheXMKIAkgKiBwdXQgdGhlIFBURSBpbiB0aGUgcHJpbWFyeSBQVEVHLgorCSAqCisJICogSW4gYWRkaXRpb24sIHdlIHNraXAgYW55IHNsb3QgdGhhdCBpcyBtYXBwaW5nIGtlcm5lbCB0ZXh0IGluCisJICogb3JkZXIgdG8gYXZvaWQgYSBkZWFkbG9jayB3aGVuIG5vdCB1c2luZyBCQVQgbWFwcGluZ3MgaWYKKwkgKiB0cnlpbmcgdG8gaGFzaCBpbiB0aGUga2VybmVsIGhhc2ggY29kZSBpdHNlbGYgYWZ0ZXIgaXQgaGFzCisJICogYWxyZWFkeSB0YWtlbiB0aGUgaGFzaCB0YWJsZSBsb2NrLiBUaGlzIHdvcmtzIGluIGNvbmp1bmN0aW9uCisJICogd2l0aCBwcmUtZmF1bHRpbmcgb2YgdGhlIGtlcm5lbCB0ZXh0LgorCSAqCisJICogSWYgdGhlIGhhc2ggdGFibGUgYnVja2V0IGlzIGZ1bGwgb2Yga2VybmVsIHRleHQgZW50cmllcywgd2UnbGwKKwkgKiBsb2NrdXAgaGVyZSBidXQgdGhhdCBzaG91bGRuJ3QgaGFwcGVuCiAJICovCi0JYWRkaXMJcjQscjcsbmV4dF9zbG90QGhhCisKKzE6CWFkZGlzCXI0LHI3LG5leHRfc2xvdEBoYQkJLyogZ2V0IG5leHQgZXZpY3Qgc2xvdCAqLwogCWx3eglyNixuZXh0X3Nsb3RAbChyNCkKLQlhZGRpCXI2LHI2LFBURV9TSVpFCisJYWRkaQlyNixyNixQVEVfU0laRQkJCS8qIHNlYXJjaCBmb3IgY2FuZGlkYXRlICovCiAJYW5kaS4JcjYscjYsNypQVEVfU0laRQogCXN0dwlyNixuZXh0X3Nsb3RAbChyNCkKIAlhZGQJcjQscjMscjYKKwlMRFBURQlyMCxQVEVfU0laRS8yKHI0KQkJLyogZ2V0IFBURSBzZWNvbmQgd29yZCAqLworCWNscnJ3aQlyMCxyMCwxMgorCWxpcwlyNixldGV4dEBoCisJb3JpCXI2LHI2LGV0ZXh0QGwJCQkvKiBnZXQgZXRleHQgKi8KKwl0b3BoeXMocjYscjYpCisJY21wbAljcjAscjAscjYJCQkvKiBjb21wYXJlIGFuZCB0cnkgYWdhaW4gKi8KKwlibHQJMWIKIAogI2lmbmRlZiBDT05GSUdfU01QCiAJLyogU3RvcmUgUFRFIGluIFBURUcgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS9oYXNoX2xvd182NC5TIGIvYXJjaC9wb3dlcnBjL21tL2hhc2hfbG93XzY0LlMKaW5kZXggOWJjMGE5Yy4uZTY0Y2UzZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL2hhc2hfbG93XzY0LlMKKysrIGIvYXJjaC9wb3dlcnBjL21tL2hhc2hfbG93XzY0LlMKQEAgLTQ0NSw5ICs0NDUsMTIgQEAKIAogaHRhYl9pbnNlcnRfcHRlOgogCS8qIHJlYWwgcGFnZSBudW1iZXIgaW4gcjUsIFBURSBSUE4gdmFsdWUgKyBpbmRleCAqLwotCXJsZGljbAlyNSxyMzEsNjQtUFRFX1JQTl9TSElGVCxQVEVfUlBOX1NISUZUCisJYW5kaXMuCXIwLHIzMSxfUEFHRV80S19QRk5AaAorCXNyZGkJcjUscjMxLFBURV9SUE5fU0hJRlQKKwlibmUtCWh0YWJfc3BlY2lhbF9wZm4KIAlzbGRpCXI1LHI1LFBBR0VfU0hJRlQtSFdfUEFHRV9TSElGVAogCWFkZAlyNSxyNSxyMjUKK2h0YWJfc3BlY2lhbF9wZm46CiAJc2xkaQlyNSxyNSxIV19QQUdFX1NISUZUCiAKIAkvKiBDYWxjdWxhdGUgcHJpbWFyeSBncm91cCBoYXNoICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vaGFzaF9uYXRpdmVfNjQuYyBiL2FyY2gvcG93ZXJwYy9tbS9oYXNoX25hdGl2ZV82NC5jCmluZGV4IDZmMTAxNmEuLjc5YWVkYWYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9oYXNoX25hdGl2ZV82NC5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9oYXNoX25hdGl2ZV82NC5jCkBAIC01MDUsNyArNTA1LDcgQEAKIAlpbnQgZW5hYmxlZCA9IDE7CiAKIAlpZiAocm9vdCkgewotCQljb25zdCBjaGFyICptb2RlbCA9IGdldF9wcm9wZXJ0eShyb290LCAibW9kZWwiLCBOVUxMKTsKKwkJY29uc3QgY2hhciAqbW9kZWwgPSBvZl9nZXRfcHJvcGVydHkocm9vdCwgIm1vZGVsIiwgTlVMTCk7CiAJCWlmIChtb2RlbCAmJiAhc3RyY21wKG1vZGVsLCAiSUJNLDkwNzYtTjgxIikpCiAJCQllbmFibGVkID0gMDsKIAkJb2Zfbm9kZV9wdXQocm9vdCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vaGFzaF91dGlsc182NC5jIGIvYXJjaC9wb3dlcnBjL21tL2hhc2hfdXRpbHNfNjQuYwppbmRleCAzYzdmZTJjLi40OTYxODQ2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vaGFzaF91dGlsc182NC5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9oYXNoX3V0aWxzXzY0LmMKQEAgLTEwMCw2ICsxMDAsMTEgQEAKICNpZmRlZiBDT05GSUdfUFBDXzY0S19QQUdFUwogaW50IG1tdV9jaV9yZXN0cmljdGlvbnM7CiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfREVCVUdfUEFHRUFMTE9DCitzdGF0aWMgdTggKmxpbmVhcl9tYXBfaGFzaF9zbG90czsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxpbmVhcl9tYXBfaGFzaF9jb3VudDsKK3N0YXRpYyBzcGlubG9ja190IGxpbmVhcl9tYXBfaGFzaF9sb2NrOworI2VuZGlmIC8qIENPTkZJR19ERUJVR19QQUdFQUxMT0MgKi8KIAogLyogVGhlcmUgYXJlIGRlZmluaXRpb25zIG9mIHBhZ2Ugc2l6ZXMgYXJyYXlzIHRvIGJlIHVzZWQgd2hlbiBub25lCiAgKiBpcyBwcm92aWRlZCBieSB0aGUgZmlybXdhcmUuCkBAIC0xNTIsMTEgKzE1NywxMCBAQAogCiAJZm9yICh2YWRkciA9IHZzdGFydCwgcGFkZHIgPSBwc3RhcnQ7IHZhZGRyIDwgdmVuZDsKIAkgICAgIHZhZGRyICs9IHN0ZXAsIHBhZGRyICs9IHN0ZXApIHsKLQkJdW5zaWduZWQgbG9uZyB2cG4sIGhhc2gsIGhwdGVnOworCQl1bnNpZ25lZCBsb25nIGhhc2gsIGhwdGVnOwogCQl1bnNpZ25lZCBsb25nIHZzaWQgPSBnZXRfa2VybmVsX3ZzaWQodmFkZHIpOwogCQl1bnNpZ25lZCBsb25nIHZhID0gKHZzaWQgPDwgMjgpIHwgKHZhZGRyICYgMHgwZmZmZmZmZik7CiAKLQkJdnBuID0gdmEgPj4gc2hpZnQ7CiAJCXRtcF9tb2RlID0gbW9kZTsKIAkJCiAJCS8qIE1ha2Ugbm9uLWtlcm5lbCB0ZXh0IG5vbi1leGVjdXRhYmxlICovCkBAIC0xNzQsNiArMTc4LDEwIEBACiAKIAkJaWYgKHJldCA8IDApCiAJCQlicmVhazsKKyNpZmRlZiBDT05GSUdfREVCVUdfUEFHRUFMTE9DCisJCWlmICgocGFkZHIgPj4gUEFHRV9TSElGVCkgPCBsaW5lYXJfbWFwX2hhc2hfY291bnQpCisJCQlsaW5lYXJfbWFwX2hhc2hfc2xvdHNbcGFkZHIgPj4gUEFHRV9TSElGVF0gPSByZXQgfCAweDgwOworI2VuZGlmIC8qIENPTkZJR19ERUJVR19QQUdFQUxMT0MgKi8KIAl9CiAJcmV0dXJuIHJldCA8IDAgPyByZXQgOiAwOwogfQpAQCAtMjgxLDYgKzI4OSw3IEBACiAJCW1lbWNweShtbXVfcHNpemVfZGVmcywgbW11X3BzaXplX2RlZmF1bHRzX2dwLAogCQkgICAgICAgc2l6ZW9mKG1tdV9wc2l6ZV9kZWZhdWx0c19ncCkpOwogIGZvdW5kOgorI2lmbmRlZiBDT05GSUdfREVCVUdfUEFHRUFMTE9DCiAJLyoKIAkgKiBQaWNrIGEgc2l6ZSBmb3IgdGhlIGxpbmVhciBtYXBwaW5nLiBDdXJyZW50bHksIHdlIG9ubHkgc3VwcG9ydAogCSAqIDE2TSwgMU0gYW5kIDRLIHdoaWNoIGlzIHRoZSBkZWZhdWx0CkBAIC0yODksNiArMjk4LDcgQEAKIAkJbW11X2xpbmVhcl9wc2l6ZSA9IE1NVV9QQUdFXzE2TTsKIAllbHNlIGlmIChtbXVfcHNpemVfZGVmc1tNTVVfUEFHRV8xTV0uc2hpZnQpCiAJCW1tdV9saW5lYXJfcHNpemUgPSBNTVVfUEFHRV8xTTsKKyNlbmRpZiAvKiBDT05GSUdfREVCVUdfUEFHRUFMTE9DICovCiAKICNpZmRlZiBDT05GSUdfUFBDXzY0S19QQUdFUwogCS8qCkBAIC0zMDMsMTIgKzMxMywxNCBAQAogCWlmIChtbXVfcHNpemVfZGVmc1tNTVVfUEFHRV82NEtdLnNoaWZ0KSB7CiAJCW1tdV92aXJ0dWFsX3BzaXplID0gTU1VX1BBR0VfNjRLOwogCQltbXVfdm1hbGxvY19wc2l6ZSA9IE1NVV9QQUdFXzY0SzsKKwkJaWYgKG1tdV9saW5lYXJfcHNpemUgPT0gTU1VX1BBR0VfNEspCisJCQltbXVfbGluZWFyX3BzaXplID0gTU1VX1BBR0VfNjRLOwogCQlpZiAoY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfQ0lfTEFSR0VfUEFHRSkpCiAJCQltbXVfaW9fcHNpemUgPSBNTVVfUEFHRV82NEs7CiAJCWVsc2UKIAkJCW1tdV9jaV9yZXN0cmljdGlvbnMgPSAxOwogCX0KLSNlbmRpZgorI2VuZGlmIC8qIENPTkZJR19QUENfNjRLX1BBR0VTICovCiAKIAlwcmludGsoS0VSTl9ERUJVRyAiUGFnZSBvcmRlcnM6IGxpbmVhciBtYXBwaW5nID0gJWQsICIKIAkgICAgICAgInZpcnR1YWwgPSAlZCwgaW8gPSAlZFxuIiwKQEAgLTQ3Niw2ICs0ODgsMTMgQEAKIAogCW1vZGVfcncgPSBfUEFHRV9BQ0NFU1NFRCB8IF9QQUdFX0RJUlRZIHwgX1BBR0VfQ09IRVJFTlQgfCBQUF9SV1hYOwogCisjaWZkZWYgQ09ORklHX0RFQlVHX1BBR0VBTExPQworCWxpbmVhcl9tYXBfaGFzaF9jb3VudCA9IGxtYl9lbmRfb2ZfRFJBTSgpID4+IFBBR0VfU0hJRlQ7CisJbGluZWFyX21hcF9oYXNoX3Nsb3RzID0gX192YShsbWJfYWxsb2NfYmFzZShsaW5lYXJfbWFwX2hhc2hfY291bnQsCisJCQkJCQkgICAgMSwgbG1iLnJtb19zaXplKSk7CisJbWVtc2V0KGxpbmVhcl9tYXBfaGFzaF9zbG90cywgMCwgbGluZWFyX21hcF9oYXNoX2NvdW50KTsKKyNlbmRpZiAvKiBDT05GSUdfREVCVUdfUEFHRUFMTE9DICovCisKIAkvKiBPbiBVMyBiYXNlZCBtYWNoaW5lcywgd2UgbmVlZCB0byByZXNlcnZlIHRoZSBEQVJUIGFyZWEgYW5kCiAJICogX05PVF8gbWFwIGl0IHRvIGF2b2lkIGNhY2hlIHBhcmFkb3hlcyBhcyBpdCdzIHJlbWFwcGVkIG5vbgogCSAqIGNhY2hlYWJsZSBsYXRlciBvbgpAQCAtNTczLDYgKzU5MiwyNyBAQAogCXJldHVybiBwcDsKIH0KIAorLyoKKyAqIERlbW90ZSBhIHNlZ21lbnQgdG8gdXNpbmcgNGsgcGFnZXMuCisgKiBGb3Igbm93IHRoaXMgbWFrZXMgdGhlIHdob2xlIHByb2Nlc3MgdXNlIDRrIHBhZ2VzLgorICovCit2b2lkIGRlbW90ZV9zZWdtZW50XzRrKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIpCit7CisjaWZkZWYgQ09ORklHX1BQQ182NEtfUEFHRVMKKwlpZiAobW0tPmNvbnRleHQudXNlcl9wc2l6ZSA9PSBNTVVfUEFHRV80SykKKwkJcmV0dXJuOworCW1tLT5jb250ZXh0LnVzZXJfcHNpemUgPSBNTVVfUEFHRV80SzsKKwltbS0+Y29udGV4dC5zbGxwID0gU0xCX1ZTSURfVVNFUiB8IG1tdV9wc2l6ZV9kZWZzW01NVV9QQUdFXzRLXS5zbGxwOworCWdldF9wYWNhKCktPmNvbnRleHQgPSBtbS0+Y29udGV4dDsKKwlzbGJfZmx1c2hfYW5kX3JlYm9sdCgpOworI2lmZGVmIENPTkZJR19TUEVfQkFTRQorCXNwdV9mbHVzaF9hbGxfc2xicyhtbSk7CisjZW5kaWYKKyNlbmRpZgorfQorCitFWFBPUlRfU1lNQk9MX0dQTChkZW1vdGVfc2VnbWVudF80ayk7CisKIC8qIFJlc3VsdCBjb2RlIGlzOgogICogIDAgLSBoYW5kbGVkCiAgKiAgMSAtIG5vcm1hbCBwYWdlIGZhdWx0CkBAIC02NjUsMTUgKzcwNSwxOSBAQAogI2lmbmRlZiBDT05GSUdfUFBDXzY0S19QQUdFUwogCXJjID0gX19oYXNoX3BhZ2VfNEsoZWEsIGFjY2VzcywgdnNpZCwgcHRlcCwgdHJhcCwgbG9jYWwpOwogI2Vsc2UKKwkvKiBJZiBfUEFHRV80S19QRk4gaXMgc2V0LCBtYWtlIHN1cmUgdGhpcyBpcyBhIDRrIHNlZ21lbnQgKi8KKwlpZiAocHRlX3ZhbCgqcHRlcCkgJiBfUEFHRV80S19QRk4pIHsKKwkJZGVtb3RlX3NlZ21lbnRfNGsobW0sIGVhKTsKKwkJcHNpemUgPSBNTVVfUEFHRV80SzsKKwl9CisKIAlpZiAobW11X2NpX3Jlc3RyaWN0aW9ucykgewogCQkvKiBJZiB0aGlzIFBURSBpcyBub24tY2FjaGVhYmxlLCBzd2l0Y2ggdG8gNGsgKi8KIAkJaWYgKHBzaXplID09IE1NVV9QQUdFXzY0SyAmJgogCQkgICAgKHB0ZV92YWwoKnB0ZXApICYgX1BBR0VfTk9fQ0FDSEUpKSB7CiAJCQlpZiAodXNlcl9yZWdpb24pIHsKKwkJCQlkZW1vdGVfc2VnbWVudF80ayhtbSwgZWEpOwogCQkJCXBzaXplID0gTU1VX1BBR0VfNEs7Ci0JCQkJbW0tPmNvbnRleHQudXNlcl9wc2l6ZSA9IE1NVV9QQUdFXzRLOwotCQkJCW1tLT5jb250ZXh0LnNsbHAgPSBTTEJfVlNJRF9VU0VSIHwKLQkJCQkJbW11X3BzaXplX2RlZnNbTU1VX1BBR0VfNEtdLnNsbHA7CiAJCQl9IGVsc2UgaWYgKGVhIDwgVk1BTExPQ19FTkQpIHsKIAkJCQkvKgogCQkJCSAqIHNvbWUgZHJpdmVyIGRpZCBhIG5vbi1jYWNoZWFibGUgbWFwcGluZwpAQCAtNzU2LDE2ICs4MDAsOCBAQAogCWlmIChtbXVfY2lfcmVzdHJpY3Rpb25zKSB7CiAJCS8qIElmIHRoaXMgUFRFIGlzIG5vbi1jYWNoZWFibGUsIHN3aXRjaCB0byA0ayAqLwogCQlpZiAobW0tPmNvbnRleHQudXNlcl9wc2l6ZSA9PSBNTVVfUEFHRV82NEsgJiYKLQkJICAgIChwdGVfdmFsKCpwdGVwKSAmIF9QQUdFX05PX0NBQ0hFKSkgewotCQkJbW0tPmNvbnRleHQudXNlcl9wc2l6ZSA9IE1NVV9QQUdFXzRLOwotCQkJbW0tPmNvbnRleHQuc2xscCA9IFNMQl9WU0lEX1VTRVIgfAotCQkJCW1tdV9wc2l6ZV9kZWZzW01NVV9QQUdFXzRLXS5zbGxwOwotCQkJZ2V0X3BhY2EoKS0+Y29udGV4dCA9IG1tLT5jb250ZXh0OwotCQkJc2xiX2ZsdXNoX2FuZF9yZWJvbHQoKTsKLSNpZmRlZiBDT05GSUdfU1BFX0JBU0UKLQkJCXNwdV9mbHVzaF9hbGxfc2xicyhtbSk7Ci0jZW5kaWYKLQkJfQorCQkgICAgKHB0ZV92YWwoKnB0ZXApICYgX1BBR0VfTk9fQ0FDSEUpKQorCQkJZGVtb3RlX3NlZ21lbnRfNGsobW0sIGVhKTsKIAl9CiAJaWYgKG1tLT5jb250ZXh0LnVzZXJfcHNpemUgPT0gTU1VX1BBR0VfNjRLKQogCQlfX2hhc2hfcGFnZV82NEsoZWEsIGFjY2VzcywgdnNpZCwgcHRlcCwgdHJhcCwgbG9jYWwpOwpAQCAtODI1LDMgKzg2MSw2MiBAQAogCX0KIAliYWRfcGFnZV9mYXVsdChyZWdzLCBhZGRyZXNzLCBTSUdCVVMpOwogfQorCisjaWZkZWYgQ09ORklHX0RFQlVHX1BBR0VBTExPQworc3RhdGljIHZvaWQga2VybmVsX21hcF9saW5lYXJfcGFnZSh1bnNpZ25lZCBsb25nIHZhZGRyLCB1bnNpZ25lZCBsb25nIGxtaSkKK3sKKwl1bnNpZ25lZCBsb25nIGhhc2gsIGhwdGVnLCB2c2lkID0gZ2V0X2tlcm5lbF92c2lkKHZhZGRyKTsKKwl1bnNpZ25lZCBsb25nIHZhID0gKHZzaWQgPDwgMjgpIHwgKHZhZGRyICYgMHgwZmZmZmZmZik7CisJdW5zaWduZWQgbG9uZyBtb2RlID0gX1BBR0VfQUNDRVNTRUQgfCBfUEFHRV9ESVJUWSB8CisJCV9QQUdFX0NPSEVSRU5UIHwgUFBfUldYWCB8IEhQVEVfUl9OOworCWludCByZXQ7CisKKwloYXNoID0gaHB0X2hhc2godmEsIFBBR0VfU0hJRlQpOworCWhwdGVnID0gKChoYXNoICYgaHRhYl9oYXNoX21hc2spICogSFBURVNfUEVSX0dST1VQKTsKKworCXJldCA9IHBwY19tZC5ocHRlX2luc2VydChocHRlZywgdmEsIF9fcGEodmFkZHIpLAorCQkJCSBtb2RlLCBIUFRFX1ZfQk9MVEVELCBtbXVfbGluZWFyX3BzaXplKTsKKwlCVUdfT04gKHJldCA8IDApOworCXNwaW5fbG9jaygmbGluZWFyX21hcF9oYXNoX2xvY2spOworCUJVR19PTihsaW5lYXJfbWFwX2hhc2hfc2xvdHNbbG1pXSAmIDB4ODApOworCWxpbmVhcl9tYXBfaGFzaF9zbG90c1tsbWldID0gcmV0IHwgMHg4MDsKKwlzcGluX3VubG9jaygmbGluZWFyX21hcF9oYXNoX2xvY2spOworfQorCitzdGF0aWMgdm9pZCBrZXJuZWxfdW5tYXBfbGluZWFyX3BhZ2UodW5zaWduZWQgbG9uZyB2YWRkciwgdW5zaWduZWQgbG9uZyBsbWkpCit7CisJdW5zaWduZWQgbG9uZyBoYXNoLCBoaWR4LCBzbG90LCB2c2lkID0gZ2V0X2tlcm5lbF92c2lkKHZhZGRyKTsKKwl1bnNpZ25lZCBsb25nIHZhID0gKHZzaWQgPDwgMjgpIHwgKHZhZGRyICYgMHgwZmZmZmZmZik7CisKKwloYXNoID0gaHB0X2hhc2godmEsIFBBR0VfU0hJRlQpOworCXNwaW5fbG9jaygmbGluZWFyX21hcF9oYXNoX2xvY2spOworCUJVR19PTighKGxpbmVhcl9tYXBfaGFzaF9zbG90c1tsbWldICYgMHg4MCkpOworCWhpZHggPSBsaW5lYXJfbWFwX2hhc2hfc2xvdHNbbG1pXSAmIDB4N2Y7CisJbGluZWFyX21hcF9oYXNoX3Nsb3RzW2xtaV0gPSAwOworCXNwaW5fdW5sb2NrKCZsaW5lYXJfbWFwX2hhc2hfbG9jayk7CisJaWYgKGhpZHggJiBfUFRFSURYX1NFQ09OREFSWSkKKwkJaGFzaCA9IH5oYXNoOworCXNsb3QgPSAoaGFzaCAmIGh0YWJfaGFzaF9tYXNrKSAqIEhQVEVTX1BFUl9HUk9VUDsKKwlzbG90ICs9IGhpZHggJiBfUFRFSURYX0dST1VQX0lYOworCXBwY19tZC5ocHRlX2ludmFsaWRhdGUoc2xvdCwgdmEsIG1tdV9saW5lYXJfcHNpemUsIDApOworfQorCit2b2lkIGtlcm5lbF9tYXBfcGFnZXMoc3RydWN0IHBhZ2UgKnBhZ2UsIGludCBudW1wYWdlcywgaW50IGVuYWJsZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzLCB2YWRkciwgbG1pOworCWludCBpOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWZvciAoaSA9IDA7IGkgPCBudW1wYWdlczsgaSsrLCBwYWdlKyspIHsKKwkJdmFkZHIgPSAodW5zaWduZWQgbG9uZylwYWdlX2FkZHJlc3MocGFnZSk7CisJCWxtaSA9IF9fcGEodmFkZHIpID4+IFBBR0VfU0hJRlQ7CisJCWlmIChsbWkgPj0gbGluZWFyX21hcF9oYXNoX2NvdW50KQorCQkJY29udGludWU7CisJCWlmIChlbmFibGUpCisJCQlrZXJuZWxfbWFwX2xpbmVhcl9wYWdlKHZhZGRyLCBsbWkpOworCQllbHNlCisJCQlrZXJuZWxfdW5tYXBfbGluZWFyX3BhZ2UodmFkZHIsIGxtaSk7CisJfQorCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKyNlbmRpZiAvKiBDT05GSUdfREVCVUdfUEFHRUFMTE9DICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vaHVnZXRsYnBhZ2UuYyBiL2FyY2gvcG93ZXJwYy9tbS9odWdldGxicGFnZS5jCmluZGV4IGY2ZmZhYWEuLjg1MDhmOTcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9odWdldGxicGFnZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9odWdldGxicGFnZS5jCkBAIC0zMTYsMTIgKzMxNiwxMSBAQAogewogCWlmIChwdGVfcHJlc2VudCgqcHRlcCkpIHsKIAkJLyogV2Ugb3Blbi1jb2RlIHB0ZV9jbGVhciBiZWNhdXNlIHdlIG5lZWQgdG8gcGFzcyB0aGUgcmlnaHQKLQkJICogYXJndW1lbnQgdG8gaHB0ZV91cGRhdGUgKGh1Z2UgLyAhaHVnZSkKKwkJICogYXJndW1lbnQgdG8gaHB0ZV9uZWVkX2ZsdXNoIChodWdlIC8gIWh1Z2UpLiBNaWdodCBub3QgYmUKKwkJICogbmVjZXNzYXJ5IGFueW1vcmUgaWYgd2UgbWFrZSBocHRlX25lZWRfZmx1c2goKSBnZXQgdGhlCisJCSAqIHBhZ2Ugc2l6ZSBmcm9tIHRoZSBzbGljZXMKIAkJICovCi0JCXVuc2lnbmVkIGxvbmcgb2xkID0gcHRlX3VwZGF0ZShwdGVwLCB+MFVMKTsKLQkJaWYgKG9sZCAmIF9QQUdFX0hBU0hQVEUpCi0JCQlocHRlX3VwZGF0ZShtbSwgYWRkciAmIEhQQUdFX01BU0ssIHB0ZXAsIG9sZCwgMSk7Ci0JCWZsdXNoX3RsYl9wZW5kaW5nKCk7CisJCXB0ZV91cGRhdGUobW0sIGFkZHIgJiBIUEFHRV9NQVNLLCBwdGVwLCB+MFVMLCAxKTsKIAl9CiAJKnB0ZXAgPSBfX3B0ZShwdGVfdmFsKHB0ZSkgJiB+X1BBR0VfSFBURUZMQUdTKTsKIH0KQEAgLTMyOSwxMiArMzI4LDcgQEAKIHB0ZV90IGh1Z2VfcHRlcF9nZXRfYW5kX2NsZWFyKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsCiAJCQkgICAgICBwdGVfdCAqcHRlcCkKIHsKLQl1bnNpZ25lZCBsb25nIG9sZCA9IHB0ZV91cGRhdGUocHRlcCwgfjBVTCk7Ci0KLQlpZiAob2xkICYgX1BBR0VfSEFTSFBURSkKLQkJaHB0ZV91cGRhdGUobW0sIGFkZHIgJiBIUEFHRV9NQVNLLCBwdGVwLCBvbGQsIDEpOwotCSpwdGVwID0gX19wdGUoMCk7Ci0KKwl1bnNpZ25lZCBsb25nIG9sZCA9IHB0ZV91cGRhdGUobW0sIGFkZHIsIHB0ZXAsIH4wVUwsIDEpOwogCXJldHVybiBfX3B0ZShvbGQpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vaW5pdF8zMi5jIGIvYXJjaC9wb3dlcnBjL21tL2luaXRfMzIuYwppbmRleCAwZTUzY2E4Li41ZmNlNmNjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vaW5pdF8zMi5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9pbml0XzMyLmMKQEAgLTExNSw2ICsxMTUsMTAgQEAKIAlpZiAoc3Ryc3RyKGNtZF9saW5lLCAibm9sdGxicyIpKSB7CiAJCV9fbWFwX3dpdGhvdXRfbHRsYnMgPSAxOwogCX0KKyNpZmRlZiBDT05GSUdfREVCVUdfUEFHRUFMTE9DCisJX19tYXBfd2l0aG91dF9iYXRzID0gMTsKKwlfX21hcF93aXRob3V0X2x0bGJzID0gMTsKKyNlbmRpZgogfQogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL2xtYi5jIGIvYXJjaC9wb3dlcnBjL21tL2xtYi5jCmluZGV4IDcxNmEyOTAuLmUzYTFlOGQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9sbWIuYworKysgYi9hcmNoL3Bvd2VycGMvbW0vbG1iLmMKQEAgLTE0Niw2ICsxNDYsMTAgQEAKIAkJdW5zaWduZWQgbG9uZyByZ25iYXNlID0gcmduLT5yZWdpb25baV0uYmFzZTsKIAkJdW5zaWduZWQgbG9uZyByZ25zaXplID0gcmduLT5yZWdpb25baV0uc2l6ZTsKIAorCQlpZiAoKHJnbmJhc2UgPT0gYmFzZSkgJiYgKHJnbnNpemUgPT0gc2l6ZSkpCisJCQkvKiBBbHJlYWR5IGhhdmUgdGhpcyByZWdpb24sIHNvIHdlJ3JlIGRvbmUgKi8KKwkJCXJldHVybiAwOworCiAJCWFkamFjZW50ID0gbG1iX2FkZHJzX2FkamFjZW50KGJhc2Usc2l6ZSxyZ25iYXNlLHJnbnNpemUpOwogCQlpZiAoIGFkamFjZW50ID4gMCApIHsKIAkJCXJnbi0+cmVnaW9uW2ldLmJhc2UgLT0gc2l6ZTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS9tZW0uYyBiL2FyY2gvcG93ZXJwYy9tbS9tZW0uYwppbmRleCA1MmYzOTdjMS4uYzRiY2Q3NSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL21lbS5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9tZW0uYwpAQCAtNTgsOSArNTgsNiBAQAogaW50IG1lbV9pbml0X2RvbmU7CiB1bnNpZ25lZCBsb25nIG1lbW9yeV9saW1pdDsKIAotZXh0ZXJuIHZvaWQgaGFzaF9wcmVsb2FkKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGVhLAotCQkJIHVuc2lnbmVkIGxvbmcgYWNjZXNzLCB1bnNpZ25lZCBsb25nIHRyYXApOwotCiBpbnQgcGFnZV9pc19yYW0odW5zaWduZWQgbG9uZyBwZm4pCiB7CiAJdW5zaWduZWQgbG9uZyBwYWRkciA9IChwZm4gPDwgUEFHRV9TSElGVCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vbW11X2RlY2wuaCBiL2FyY2gvcG93ZXJwYy9tbS9tbXVfZGVjbC5oCmluZGV4IGJlYTJkMjEuLjljNDUzOGIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9tbXVfZGVjbC5oCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9tbXVfZGVjbC5oCkBAIC0xOSw5ICsxOSwxNCBAQAogICogIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKgogICovCisjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KICNpbmNsdWRlIDxhc20vbW11Lmg+CiAKK2V4dGVybiB2b2lkIGhhc2hfcHJlbG9hZChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBlYSwKKwkJCSB1bnNpZ25lZCBsb25nIGFjY2VzcywgdW5zaWduZWQgbG9uZyB0cmFwKTsKKworCiAjaWZkZWYgQ09ORklHX1BQQzMyCiBleHRlcm4gdm9pZCBtYXBpbl9yYW0odm9pZCk7CiBleHRlcm4gaW50IG1hcF9wYWdlKHVuc2lnbmVkIGxvbmcgdmEsIHBoeXNfYWRkcl90IHBhLCBpbnQgZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL251bWEuYyBiL2FyY2gvcG93ZXJwYy9tbS9udW1hLmMKaW5kZXggZTg2YzM3Yy4uYjNhNTkyYiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL251bWEuYworKysgYi9hcmNoL3Bvd2VycGMvbW0vbnVtYS5jCkBAIC03NCw3ICs3NCw3IEBACiAKIAl3aGlsZSAoKGNwdV9ub2RlID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUoY3B1X25vZGUsICJjcHUiKSkgIT0gTlVMTCkgewogCQkvKiBUcnkgaW50ZXJydXB0IHNlcnZlciBmaXJzdCAqLwotCQlpbnRlcnJ1cHRfc2VydmVyID0gZ2V0X3Byb3BlcnR5KGNwdV9ub2RlLAorCQlpbnRlcnJ1cHRfc2VydmVyID0gb2ZfZ2V0X3Byb3BlcnR5KGNwdV9ub2RlLAogCQkJCQkiaWJtLHBwYy1pbnRlcnJ1cHQtc2VydmVyI3MiLCAmbGVuKTsKIAogCQlsZW4gPSBsZW4gLyBzaXplb2YodTMyKTsKQEAgLTg1LDcgKzg1LDcgQEAKIAkJCQkJcmV0dXJuIGNwdV9ub2RlOwogCQkJfQogCQl9IGVsc2UgewotCQkJcmVnID0gZ2V0X3Byb3BlcnR5KGNwdV9ub2RlLCAicmVnIiwgJmxlbik7CisJCQlyZWcgPSBvZl9nZXRfcHJvcGVydHkoY3B1X25vZGUsICJyZWciLCAmbGVuKTsKIAkJCWlmIChyZWcgJiYgKGxlbiA+IDApICYmIChyZWdbMF0gPT0gaHdfY3B1aWQpKQogCQkJCXJldHVybiBjcHVfbm9kZTsKIAkJfQpAQCAtOTcsNyArOTcsNyBAQAogLyogbXVzdCBob2xkIHJlZmVyZW5jZSB0byBub2RlIGR1cmluZyBjYWxsICovCiBzdGF0aWMgY29uc3QgaW50ICpvZl9nZXRfYXNzb2NpYXRpdml0eShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldikKIHsKLQlyZXR1cm4gZ2V0X3Byb3BlcnR5KGRldiwgImlibSxhc3NvY2lhdGl2aXR5IiwgTlVMTCk7CisJcmV0dXJuIG9mX2dldF9wcm9wZXJ0eShkZXYsICJpYm0sYXNzb2NpYXRpdml0eSIsIE5VTEwpOwogfQogCiAvKiBSZXR1cm5zIG5pZCBpbiB0aGUgcmFuZ2UgWzAuLk1BWF9OVU1OT0RFUy0xXSwgb3IgLTEgaWYgbm8gdXNlZnVsIG51bWEKQEAgLTE3OSw3ICsxNzksNyBAQAogCSAqIGNvbmZpZ3VyYXRpb24gKHNob3VsZCBiZSBhbGwgMCdzKSBhbmQgdGhlIHNlY29uZCBpcyBmb3IgYSBub3JtYWwKIAkgKiBOVU1BIGNvbmZpZ3VyYXRpb24uCiAJICovCi0JcmVmX3BvaW50cyA9IGdldF9wcm9wZXJ0eShydGFzX3Jvb3QsCisJcmVmX3BvaW50cyA9IG9mX2dldF9wcm9wZXJ0eShydGFzX3Jvb3QsCiAJCQkiaWJtLGFzc29jaWF0aXZpdHktcmVmZXJlbmNlLXBvaW50cyIsICZsZW4pOwogCiAJaWYgKChsZW4gPj0gMSkgJiYgcmVmX3BvaW50cykgewpAQCAtMjAxLDggKzIwMSw4IEBACiAJaWYgKCFtZW1vcnkpCiAJCXBhbmljKCJudW1hLmM6IE5vIG1lbW9yeSBub2RlcyBmb3VuZCEiKTsKIAotCSpuX2FkZHJfY2VsbHMgPSBwcm9tX25fYWRkcl9jZWxscyhtZW1vcnkpOwotCSpuX3NpemVfY2VsbHMgPSBwcm9tX25fc2l6ZV9jZWxscyhtZW1vcnkpOworCSpuX2FkZHJfY2VsbHMgPSBvZl9uX2FkZHJfY2VsbHMobWVtb3J5KTsKKwkqbl9zaXplX2NlbGxzID0gb2Zfbl9zaXplX2NlbGxzKG1lbW9yeSk7CiAJb2Zfbm9kZV9wdXQobWVtb3J5KTsKIH0KIApAQCAtMzA4LDkgKzMwOCw5IEBACiAJaW50IG5pZCwgZGVmYXVsdF9uaWQgPSAwOwogCXVuc2lnbmVkIGludCBzdGFydCwgYWksIGZsYWdzOwogCi0JbG0gPSBnZXRfcHJvcGVydHkobWVtb3J5LCAiaWJtLGxtYi1zaXplIiwgJmxzKTsKLQlkbSA9IGdldF9wcm9wZXJ0eShtZW1vcnksICJpYm0sZHluYW1pYy1tZW1vcnkiLCAmbGQpOwotCWFhID0gZ2V0X3Byb3BlcnR5KG1lbW9yeSwgImlibSxhc3NvY2lhdGl2aXR5LWxvb2t1cC1hcnJheXMiLCAmbGEpOworCWxtID0gb2ZfZ2V0X3Byb3BlcnR5KG1lbW9yeSwgImlibSxsbWItc2l6ZSIsICZscyk7CisJZG0gPSBvZl9nZXRfcHJvcGVydHkobWVtb3J5LCAiaWJtLGR5bmFtaWMtbWVtb3J5IiwgJmxkKTsKKwlhYSA9IG9mX2dldF9wcm9wZXJ0eShtZW1vcnksICJpYm0sYXNzb2NpYXRpdml0eS1sb29rdXAtYXJyYXlzIiwgJmxhKTsKIAlpZiAoIWxtIHx8ICFkbSB8fCAhYWEgfHwKIAkgICAgbHMgPCBzaXplb2YodW5zaWduZWQgaW50KSB8fCBsZCA8IHNpemVvZih1bnNpZ25lZCBpbnQpIHx8CiAJICAgIGxhIDwgMiAqIHNpemVvZih1bnNpZ25lZCBpbnQpKQpAQCAtNDA0LDEwICs0MDQsMTAgQEAKIAkJY29uc3QgdW5zaWduZWQgaW50ICptZW1jZWxsX2J1ZjsKIAkJdW5zaWduZWQgaW50IGxlbjsKIAotCQltZW1jZWxsX2J1ZiA9IGdldF9wcm9wZXJ0eShtZW1vcnksCisJCW1lbWNlbGxfYnVmID0gb2ZfZ2V0X3Byb3BlcnR5KG1lbW9yeSwKIAkJCSJsaW51eCx1c2FibGUtbWVtb3J5IiwgJmxlbik7CiAJCWlmICghbWVtY2VsbF9idWYgfHwgbGVuIDw9IDApCi0JCQltZW1jZWxsX2J1ZiA9IGdldF9wcm9wZXJ0eShtZW1vcnksICJyZWciLCAmbGVuKTsKKwkJCW1lbWNlbGxfYnVmID0gb2ZfZ2V0X3Byb3BlcnR5KG1lbW9yeSwgInJlZyIsICZsZW4pOwogCQlpZiAoIW1lbWNlbGxfYnVmIHx8IGxlbiA8PSAwKQogCQkJY29udGludWU7CiAKQEAgLTcyNSw3ICs3MjUsNyBAQAogCQljb25zdCB1bnNpZ25lZCBpbnQgKm1lbWNlbGxfYnVmOwogCQl1bnNpZ25lZCBpbnQgbGVuOwogCi0JCW1lbWNlbGxfYnVmID0gZ2V0X3Byb3BlcnR5KG1lbW9yeSwgInJlZyIsICZsZW4pOworCQltZW1jZWxsX2J1ZiA9IG9mX2dldF9wcm9wZXJ0eShtZW1vcnksICJyZWciLCAmbGVuKTsKIAkJaWYgKCFtZW1jZWxsX2J1ZiB8fCBsZW4gPD0gMCkKIAkJCWNvbnRpbnVlOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vcGd0YWJsZV8zMi5jIGIvYXJjaC9wb3dlcnBjL21tL3BndGFibGVfMzIuYwppbmRleCBjMjg0YmRhLi5iY2E1NjAzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vcGd0YWJsZV8zMi5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9wZ3RhYmxlXzMyLmMKQEAgLTE4Myw4ICsxODMsOCBAQAogCSAqIG1lbV9pbml0KCkgc2V0cyBoaWdoX21lbW9yeSBzbyBvbmx5IGRvIHRoZSBjaGVjayBhZnRlciB0aGF0LgogCSAqLwogCWlmIChtZW1faW5pdF9kb25lICYmIChwIDwgdmlydF90b19waHlzKGhpZ2hfbWVtb3J5KSkpIHsKLQkJcHJpbnRrKCJfX2lvcmVtYXAoKTogcGh5cyBhZGRyICJQSFlTX0ZNVCIgaXMgUkFNIGxyICVwXG4iLCBwLAotCQkgICAgICAgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKKwkJcHJpbnRrKCJfX2lvcmVtYXAoKTogcGh5cyBhZGRyIDB4JWxseCBpcyBSQU0gbHIgJXBcbiIsCisJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXAsIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7CiAJCXJldHVybiBOVUxMOwogCX0KIApAQCAtMjY2LDkgKzI2NiwxMiBAQAogCXBnID0gcHRlX2FsbG9jX2tlcm5lbChwZCwgdmEpOwogCWlmIChwZyAhPSAwKSB7CiAJCWVyciA9IDA7Ci0JCXNldF9wdGVfYXQoJmluaXRfbW0sIHZhLCBwZywgcGZuX3B0ZShwYSA+PiBQQUdFX1NISUZULCBfX3BncHJvdChmbGFncykpKTsKLQkJaWYgKG1lbV9pbml0X2RvbmUpCi0JCQlmbHVzaF9IUFRFKDAsIHZhLCBwbWRfdmFsKCpwZCkpOworCQkvKiBUaGUgUFRFIHNob3VsZCBuZXZlciBiZSBhbHJlYWR5IHNldCBub3IgcHJlc2VudCBpbiB0aGUKKwkJICogaGFzaCB0YWJsZQorCQkgKi8KKwkJQlVHX09OKHB0ZV92YWwoKnBnKSAmIChfUEFHRV9QUkVTRU5UIHwgX1BBR0VfSEFTSFBURSkpOworCQlzZXRfcHRlX2F0KCZpbml0X21tLCB2YSwgcGcsIHBmbl9wdGUocGEgPj4gUEFHRV9TSElGVCwKKwkJCQkJCSAgICAgX19wZ3Byb3QoZmxhZ3MpKSk7CiAJfQogCXJldHVybiBlcnI7CiB9CkBAIC0yNzksMTYgKzI4MiwxOSBAQAogdm9pZCBfX2luaXQgbWFwaW5fcmFtKHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyB2LCBwLCBzLCBmOworCWludCBrdGV4dDsKIAogCXMgPSBtbXVfbWFwaW5fcmFtKCk7CiAJdiA9IEtFUk5FTEJBU0UgKyBzOwogCXAgPSBQUENfTUVNU1RBUlQgKyBzOwogCWZvciAoOyBzIDwgdG90YWxfbG93bWVtOyBzICs9IFBBR0VfU0laRSkgewotCQlpZiAoKGNoYXIgKikgdiA+PSBfc3RleHQgJiYgKGNoYXIgKikgdiA8IGV0ZXh0KQotCQkJZiA9IF9QQUdFX1JBTV9URVhUOwotCQllbHNlCi0JCQlmID0gX1BBR0VfUkFNOworCQlrdGV4dCA9ICgoY2hhciAqKSB2ID49IF9zdGV4dCAmJiAoY2hhciAqKSB2IDwgZXRleHQpOworCQlmID0ga3RleHQgP19QQUdFX1JBTV9URVhUIDogX1BBR0VfUkFNOwogCQltYXBfcGFnZSh2LCBwLCBmKTsKKyNpZmRlZiBDT05GSUdfUFBDX1NURF9NTVVfMzIKKwkJaWYgKGt0ZXh0KQorCQkJaGFzaF9wcmVsb2FkKCZpbml0X21tLCB2LCAwLCAweDMwMCk7CisjZW5kaWYKIAkJdiArPSBQQUdFX1NJWkU7CiAJCXAgKz0gUEFHRV9TSVpFOwogCX0KQEAgLTQ0NSwzICs0NTEsNTUgQEAKIAlyZXR1cm4gcmV0OwogfQogCisjaWZkZWYgQ09ORklHX0RFQlVHX1BBR0VBTExPQworCitzdGF0aWMgaW50IF9fY2hhbmdlX3BhZ2VfYXR0cihzdHJ1Y3QgcGFnZSAqcGFnZSwgcGdwcm90X3QgcHJvdCkKK3sKKwlwdGVfdCAqa3B0ZTsKKwlwbWRfdCAqa3BtZDsKKwl1bnNpZ25lZCBsb25nIGFkZHJlc3M7CisKKwlCVUdfT04oUGFnZUhpZ2hNZW0ocGFnZSkpOworCWFkZHJlc3MgPSAodW5zaWduZWQgbG9uZylwYWdlX2FkZHJlc3MocGFnZSk7CisKKwlpZiAodl9tYXBwZWRfYnlfYmF0cyhhZGRyZXNzKSB8fCB2X21hcHBlZF9ieV90bGJjYW0oYWRkcmVzcykpCisJCXJldHVybiAwOworCWlmICghZ2V0X3B0ZXB0cigmaW5pdF9tbSwgYWRkcmVzcywgJmtwdGUsICZrcG1kKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJc2V0X3B0ZV9hdCgmaW5pdF9tbSwgYWRkcmVzcywga3B0ZSwgbWtfcHRlKHBhZ2UsIHByb3QpKTsKKwl3bWIoKTsKKwlmbHVzaF9IUFRFKDAsIGFkZHJlc3MsIHBtZF92YWwoKmtwbWQpKTsKKwlwdGVfdW5tYXAoa3B0ZSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENoYW5nZSB0aGUgcGFnZSBhdHRyaWJ1dGVzIG9mIGFuIHBhZ2UgaW4gdGhlIGxpbmVhciBtYXBwaW5nLgorICoKKyAqIFRISVMgQ09ORkxJQ1RTIFdJVEggQkFUIE1BUFBJTkdTLCBERUJVRyBVU0UgT05MWQorICovCitzdGF0aWMgaW50IGNoYW5nZV9wYWdlX2F0dHIoc3RydWN0IHBhZ2UgKnBhZ2UsIGludCBudW1wYWdlcywgcGdwcm90X3QgcHJvdCkKK3sKKwlpbnQgaSwgZXJyID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWZvciAoaSA9IDA7IGkgPCBudW1wYWdlczsgaSsrLCBwYWdlKyspIHsKKwkJZXJyID0gX19jaGFuZ2VfcGFnZV9hdHRyKHBhZ2UsIHByb3QpOworCQlpZiAoZXJyKQorCQkJYnJlYWs7CisJfQorCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlyZXR1cm4gZXJyOworfQorCisKK3ZvaWQga2VybmVsX21hcF9wYWdlcyhzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IG51bXBhZ2VzLCBpbnQgZW5hYmxlKQoreworCWlmIChQYWdlSGlnaE1lbShwYWdlKSkKKwkJcmV0dXJuOworCisJY2hhbmdlX3BhZ2VfYXR0cihwYWdlLCBudW1wYWdlcywgZW5hYmxlID8gUEFHRV9LRVJORUwgOiBfX3BncHJvdCgwKSk7Cit9CisjZW5kaWYgLyogQ09ORklHX0RFQlVHX1BBR0VBTExPQyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL3BwY19tbXVfMzIuYyBiL2FyY2gvcG93ZXJwYy9tbS9wcGNfbW11XzMyLmMKaW5kZXggN2NjZWIyYy4uMDUwNjY2NyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL3BwY19tbXVfMzIuYworKysgYi9hcmNoL3Bvd2VycGMvbW0vcHBjX21tdV8zMi5jCkBAIC04NSw4ICs4NSwxMCBAQAogCXVuc2lnbmVkIGxvbmcgbWF4X3NpemUgPSAoMjU2PDwyMCk7CiAJdW5zaWduZWQgbG9uZyBhbGlnbjsKIAotCWlmIChfX21hcF93aXRob3V0X2JhdHMpCisJaWYgKF9fbWFwX3dpdGhvdXRfYmF0cykgeworCQlwcmludGsoS0VSTl9ERUJVRyAiUkFNIG1hcHBlZCB3aXRob3V0IEJBVHNcbiIpOwogCQlyZXR1cm4gMDsKKwl9CiAKIAkvKiBTZXQgdXAgQkFUMiBhbmQgaWYgbmVjZXNzYXJ5IEJBVDMgdG8gY292ZXIgUkFNLiAqLwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vdGxiXzY0LmMgYi9hcmNoL3Bvd2VycGMvbW0vdGxiXzY0LmMKaW5kZXggYjU4YmFhNi4uZmQ4ZDA4YyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL3RsYl82NC5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS90bGJfNjQuYwpAQCAtMTIwLDE3ICsxMjAsMjAgQEAKIH0KIAogLyoKLSAqIFVwZGF0ZSB0aGUgTU1VIGhhc2ggdGFibGUgdG8gY29ycmVzcG9uZCB3aXRoIGEgY2hhbmdlIHRvCi0gKiBhIExpbnV4IFBURS4gIElmIHdycHJvdCBpcyB0cnVlLCBpdCBpcyBwZXJtaXNzaWJsZSB0bwotICogY2hhbmdlIHRoZSBleGlzdGluZyBIUFRFIHRvIHJlYWQtb25seSByYXRoZXIgdGhhbiByZW1vdmluZyBpdAotICogKGlmIHdlIHJlbW92ZSBpdCB3ZSBzaG91bGQgY2xlYXIgdGhlIF9QVEVfSFBURUZMQUdTIGJpdHMpLgorICogQSBsaW51eCBQVEUgd2FzIGNoYW5nZWQgYW5kIHRoZSBjb3JyZXNwb25kaW5nIGhhc2ggdGFibGUgZW50cnkKKyAqIG5lZXNkIHRvIGJlIGZsdXNoZWQuIFRoaXMgZnVuY3Rpb24gd2lsbCBlaXRoZXIgcGVyZm9ybSB0aGUgZmx1c2gKKyAqIGltbWVkaWF0ZWx5IG9yIHdpbGwgYmF0Y2ggaXQgdXAgaWYgdGhlIGN1cnJlbnQgQ1BVIGhhcyBhbiBhY3RpdmUKKyAqIGJhdGNoIG9uIGl0LgorICoKKyAqIE11c3QgYmUgY2FsbGVkIGZyb20gd2l0aGluIHNvbWUga2luZCBvZiBzcGlubG9jay9ub24tcHJlZW1wdCByZWdpb24uLi4KICAqLwotdm9pZCBocHRlX3VwZGF0ZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLAotCQkgcHRlX3QgKnB0ZXAsIHVuc2lnbmVkIGxvbmcgcHRlLCBpbnQgaHVnZSkKK3ZvaWQgaHB0ZV9uZWVkX2ZsdXNoKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsCisJCSAgICAgcHRlX3QgKnB0ZXAsIHVuc2lnbmVkIGxvbmcgcHRlLCBpbnQgaHVnZSkKIHsKIAlzdHJ1Y3QgcHBjNjRfdGxiX2JhdGNoICpiYXRjaCA9ICZfX2dldF9jcHVfdmFyKHBwYzY0X3RsYl9iYXRjaCk7Ci0JdW5zaWduZWQgbG9uZyB2c2lkOworCXVuc2lnbmVkIGxvbmcgdnNpZCwgdmFkZHI7CiAJdW5zaWduZWQgaW50IHBzaXplOworCXJlYWxfcHRlX3QgcnB0ZTsKIAlpbnQgaTsKIAogCWkgPSBiYXRjaC0+aW5kZXg7CkBAIC0xNTEsNiArMTU0LDI2IEBACiAJfSBlbHNlCiAJCXBzaXplID0gcHRlX3BhZ2VzaXplX2luZGV4KHB0ZSk7CiAKKwkvKiBCdWlsZCBmdWxsIHZhZGRyICovCisJaWYgKCFpc19rZXJuZWxfYWRkcihhZGRyKSkgeworCQl2c2lkID0gZ2V0X3ZzaWQobW0tPmNvbnRleHQuaWQsIGFkZHIpOworCQlXQVJOX09OKHZzaWQgPT0gMCk7CisJfSBlbHNlCisJCXZzaWQgPSBnZXRfa2VybmVsX3ZzaWQoYWRkcik7CisJdmFkZHIgPSAodnNpZCA8PCAyOCApIHwgKGFkZHIgJiAweDBmZmZmZmZmKTsKKwlycHRlID0gX19yZWFsX3B0ZShfX3B0ZShwdGUpLCBwdGVwKTsKKworCS8qCisJICogQ2hlY2sgaWYgd2UgaGF2ZSBhbiBhY3RpdmUgYmF0Y2ggb24gdGhpcyBDUFUuIElmIG5vdCwganVzdAorCSAqIGZsdXNoIG5vdyBhbmQgcmV0dXJuLiBGb3Igbm93LCB3ZSBkb24gZ2xvYmFsIGludmFsaWRhdGVzCisJICogaW4gdGhhdCBjYXNlLCBtaWdodCBiZSB3b3J0aCB0ZXN0aW5nIHRoZSBtbSBjcHUgbWFzayB0aG91Z2gKKwkgKiBhbmQgZGVjaWRlIHRvIHVzZSBsb2NhbCBpbnZhbGlkYXRlcyBpbnN0ZWFkLi4uCisJICovCisJaWYgKCFiYXRjaC0+YWN0aXZlKSB7CisJCWZsdXNoX2hhc2hfcGFnZSh2YWRkciwgcnB0ZSwgcHNpemUsIDApOworCQlyZXR1cm47CisJfQorCiAJLyoKIAkgKiBUaGlzIGNhbiBoYXBwZW4gd2hlbiB3ZSBhcmUgaW4gdGhlIG1pZGRsZSBvZiBhIFRMQiBiYXRjaCBhbmQKIAkgKiB3ZSBlbmNvdW50ZXIgbWVtb3J5IHByZXNzdXJlIChlZyBjb3B5X3BhZ2VfcmFuZ2Ugd2hlbiBpdCB0cmllcwpAQCAtMTYyLDQ3ICsxODUsNDIgQEAKIAkgKiBiYXRjaAogCSAqLwogCWlmIChpICE9IDAgJiYgKG1tICE9IGJhdGNoLT5tbSB8fCBiYXRjaC0+cHNpemUgIT0gcHNpemUpKSB7Ci0JCWZsdXNoX3RsYl9wZW5kaW5nKCk7CisJCV9fZmx1c2hfdGxiX3BlbmRpbmcoYmF0Y2gpOwogCQlpID0gMDsKIAl9CiAJaWYgKGkgPT0gMCkgewogCQliYXRjaC0+bW0gPSBtbTsKIAkJYmF0Y2gtPnBzaXplID0gcHNpemU7CiAJfQotCWlmICghaXNfa2VybmVsX2FkZHIoYWRkcikpIHsKLQkJdnNpZCA9IGdldF92c2lkKG1tLT5jb250ZXh0LmlkLCBhZGRyKTsKLQkJV0FSTl9PTih2c2lkID09IDApOwotCX0gZWxzZQotCQl2c2lkID0gZ2V0X2tlcm5lbF92c2lkKGFkZHIpOwotCWJhdGNoLT52YWRkcltpXSA9ICh2c2lkIDw8IDI4ICkgfCAoYWRkciAmIDB4MGZmZmZmZmYpOwotCWJhdGNoLT5wdGVbaV0gPSBfX3JlYWxfcHRlKF9fcHRlKHB0ZSksIHB0ZXApOworCWJhdGNoLT5wdGVbaV0gPSBycHRlOworCWJhdGNoLT52YWRkcltpXSA9IHZhZGRyOwogCWJhdGNoLT5pbmRleCA9ICsraTsKIAlpZiAoaSA+PSBQUEM2NF9UTEJfQkFUQ0hfTlIpCi0JCWZsdXNoX3RsYl9wZW5kaW5nKCk7CisJCV9fZmx1c2hfdGxiX3BlbmRpbmcoYmF0Y2gpOwogfQogCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0ZXJtaW5hdGluZyBhbiBtbXUgYmF0Y2ggb3Igd2hlbiBhIGJhdGNoCisgKiBpcyBmdWxsLiBJdCB3aWxsIHBlcmZvcm0gdGhlIGZsdXNoIG9mIGFsbCB0aGUgZW50cmllcyBjdXJyZW50bHkgc3RvcmVkCisgKiBpbiBhIGJhdGNoLgorICoKKyAqIE11c3QgYmUgY2FsbGVkIGZyb20gd2l0aGluIHNvbWUga2luZCBvZiBzcGlubG9jay9ub24tcHJlZW1wdCByZWdpb24uLi4KKyAqLwogdm9pZCBfX2ZsdXNoX3RsYl9wZW5kaW5nKHN0cnVjdCBwcGM2NF90bGJfYmF0Y2ggKmJhdGNoKQogewotCWludCBpOwotCWludCBjcHU7CiAJY3B1bWFza190IHRtcDsKLQlpbnQgbG9jYWwgPSAwOworCWludCBpLCBsb2NhbCA9IDA7CiAKLQlCVUdfT04oaW5faW50ZXJydXB0KCkpOwotCi0JY3B1ID0gZ2V0X2NwdSgpOwogCWkgPSBiYXRjaC0+aW5kZXg7Ci0JdG1wID0gY3B1bWFza19vZl9jcHUoY3B1KTsKKwl0bXAgPSBjcHVtYXNrX29mX2NwdShzbXBfcHJvY2Vzc29yX2lkKCkpOwogCWlmIChjcHVzX2VxdWFsKGJhdGNoLT5tbS0+Y3B1X3ZtX21hc2ssIHRtcCkpCiAJCWxvY2FsID0gMTsKLQogCWlmIChpID09IDEpCiAJCWZsdXNoX2hhc2hfcGFnZShiYXRjaC0+dmFkZHJbMF0sIGJhdGNoLT5wdGVbMF0sCiAJCQkJYmF0Y2gtPnBzaXplLCBsb2NhbCk7CiAJZWxzZQogCQlmbHVzaF9oYXNoX3JhbmdlKGksIGxvY2FsKTsKIAliYXRjaC0+aW5kZXggPSAwOwotCXB1dF9jcHUoKTsKIH0KIAogdm9pZCBwdGVfZnJlZV9maW5pc2godm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9NYWtlZmlsZQppbmRleCA0Y2NlZjJkLi40YjVmOTUyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvb3Byb2ZpbGUvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL29wcm9maWxlL01ha2VmaWxlCkBAIC0xMiw2ICsxMiw2IEBACiAKIG9wcm9maWxlLXkgOj0gJChEUklWRVJfT0JKUykgY29tbW9uLm8gYmFja3RyYWNlLm8KIG9wcm9maWxlLSQoQ09ORklHX1BQQ19DRUxMX05BVElWRSkgKz0gb3BfbW9kZWxfY2VsbC5vCi1vcHJvZmlsZS0kKENPTkZJR19QUEM2NCkgKz0gb3BfbW9kZWxfcnM2NC5vIG9wX21vZGVsX3Bvd2VyNC5vCitvcHJvZmlsZS0kKENPTkZJR19QUEM2NCkgKz0gb3BfbW9kZWxfcnM2NC5vIG9wX21vZGVsX3Bvd2VyNC5vIG9wX21vZGVsX3BhNnQubwogb3Byb2ZpbGUtJChDT05GSUdfRlNMX0JPT0tFKSArPSBvcF9tb2RlbF9mc2xfYm9va2Uubwogb3Byb2ZpbGUtJChDT05GSUdfNnh4KSArPSBvcF9tb2RlbF83NDUwLm8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9jb21tb24uYyBiL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9jb21tb24uYwppbmRleCBmYmQ2MmVhLi4xYTdlZjdlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvb3Byb2ZpbGUvY29tbW9uLmMKKysrIGIvYXJjaC9wb3dlcnBjL29wcm9maWxlL2NvbW1vbi5jCkBAIC0xNjAsNiArMTYwLDkgQEAKIAkJY2FzZSBQUENfT1BST0ZJTEVfUE9XRVI0OgogCQkJbW9kZWwgPSAmb3BfbW9kZWxfcG93ZXI0OwogCQkJYnJlYWs7CisJCWNhc2UgUFBDX09QUk9GSUxFX1BBNlQ6CisJCQltb2RlbCA9ICZvcF9tb2RlbF9wYTZ0OworCQkJYnJlYWs7CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfNnh4CiAJCWNhc2UgUFBDX09QUk9GSUxFX0c0OgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL29wcm9maWxlL29wX21vZGVsX2NlbGwuYyBiL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9vcF9tb2RlbF9jZWxsLmMKaW5kZXggZTA4ZTFkNy4uNjI2YjI5ZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL29wcm9maWxlL29wX21vZGVsX2NlbGwuYworKysgYi9hcmNoL3Bvd2VycGMvb3Byb2ZpbGUvb3BfbW9kZWxfY2VsbC5jCkBAIC0zNyw2ICszNyw3IEBACiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogCiAjaW5jbHVkZSAiLi4vcGxhdGZvcm1zL2NlbGwvaW50ZXJydXB0LmgiCisjaW5jbHVkZSAiLi4vcGxhdGZvcm1zL2NlbGwvY2JlX3JlZ3MuaCIKIAogI2RlZmluZSBQUFVfQ1lDTEVTX0VWRU5UX05VTSAxCS8qICBldmVudCBudW1iZXIgZm9yIENZQ0xFUyAqLwogI2RlZmluZSBQUFVfQ1lDTEVTX0dSUF9OVU0gICAxICAvKiBzcGVjaWFsIGdyb3VwIG51bWJlciBmb3IgaWRlbnRpZnlpbmcKQEAgLTEzMCw3ICsxMzEsNyBAQAogc3RhdGljIHUzMiByZXNldF92YWx1ZVtOUl9QSFlTX0NUUlNdOwogc3RhdGljIGludCBudW1fY291bnRlcnM7CiBzdGF0aWMgaW50IG9wcm9maWxlX3J1bm5pbmc7Ci1zdGF0aWMgc3BpbmxvY2tfdCB2aXJ0X2NudHJfbG9jayA9IFNQSU5fTE9DS19VTkxPQ0tFRDsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sodmlydF9jbnRyX2xvY2spOwogCiBzdGF0aWMgdTMyIGN0cl9lbmFibGVkOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvb3Byb2ZpbGUvb3BfbW9kZWxfcGE2dC5jIGIvYXJjaC9wb3dlcnBjL29wcm9maWxlL29wX21vZGVsX3BhNnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGE1NmIwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL29wcm9maWxlL29wX21vZGVsX3BhNnQuYwpAQCAtMCwwICsxLDIzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNi0yMDA3IFBBIFNlbWksIEluYworICoKKyAqIEF1dGhvcjogU2hhc2hpIFJhbywgUEEgU2VtaQorICoKKyAqIE1haW50YWluZWQgYnk6IE9sb2YgSm9oYW5zc29uIDxvbG9mQGxpeG9tLm5ldD4KKyAqCisgKiBCYXNlZCBvbiBhcmNoL3Bvd2VycGMvb3Byb2ZpbGUvb3BfbW9kZWxfcG93ZXI0LmMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvb3Byb2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9jcHV0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9vcHJvZmlsZV9pbXBsLmg+CisjaW5jbHVkZSA8YXNtL3JlZy5oPgorCitzdGF0aWMgdW5zaWduZWQgY2hhciBvcHJvZmlsZV9ydW5uaW5nOworCisvKiBtbWNyIHZhbHVlcyBhcmUgc2V0IGluIHBhNnRfcmVnX3NldHVwLCB1c2VkIGluIHBhNnRfY3B1X3NldHVwICovCitzdGF0aWMgdTY0IG1tY3IwX3ZhbDsKK3N0YXRpYyB1NjQgbW1jcjFfdmFsOworCisvKiBpbml0ZWQgaW4gcGE2dF9yZWdfc2V0dXAgKi8KK3N0YXRpYyB1NjQgcmVzZXRfdmFsdWVbT1BfTUFYX0NPVU5URVJdOworCitzdGF0aWMgaW5saW5lIHU2NCBjdHJfcmVhZCh1bnNpZ25lZCBpbnQgaSkKK3sKKwlzd2l0Y2ggKGkpIHsKKwljYXNlIDA6CisJCXJldHVybiBtZnNwcihTUFJOX1BBNlRfUE1DMCk7CisJY2FzZSAxOgorCQlyZXR1cm4gbWZzcHIoU1BSTl9QQTZUX1BNQzEpOworCWNhc2UgMjoKKwkJcmV0dXJuIG1mc3ByKFNQUk5fUEE2VF9QTUMyKTsKKwljYXNlIDM6CisJCXJldHVybiBtZnNwcihTUFJOX1BBNlRfUE1DMyk7CisJY2FzZSA0OgorCQlyZXR1cm4gbWZzcHIoU1BSTl9QQTZUX1BNQzQpOworCWNhc2UgNToKKwkJcmV0dXJuIG1mc3ByKFNQUk5fUEE2VF9QTUM1KTsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9FUlIgImN0cl9yZWFkIGNhbGxlZCB3aXRoIGJhZCBhcmcgJXVcbiIsIGkpOworCQlyZXR1cm4gMDsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjdHJfd3JpdGUodW5zaWduZWQgaW50IGksIHU2NCB2YWwpCit7CisJc3dpdGNoIChpKSB7CisJY2FzZSAwOgorCQltdHNwcihTUFJOX1BBNlRfUE1DMCwgdmFsKTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQltdHNwcihTUFJOX1BBNlRfUE1DMSwgdmFsKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQltdHNwcihTUFJOX1BBNlRfUE1DMiwgdmFsKTsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQltdHNwcihTUFJOX1BBNlRfUE1DMywgdmFsKTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQltdHNwcihTUFJOX1BBNlRfUE1DNCwgdmFsKTsKKwkJYnJlYWs7CisJY2FzZSA1OgorCQltdHNwcihTUFJOX1BBNlRfUE1DNSwgdmFsKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSICJjdHJfd3JpdGUgY2FsbGVkIHdpdGggYmFkIGFyZyAldVxuIiwgaSk7CisJCWJyZWFrOworCX0KK30KKworCisvKiBwcmVjb21wdXRlIHRoZSB2YWx1ZXMgdG8gc3R1ZmYgaW4gdGhlIGhhcmR3YXJlIHJlZ2lzdGVycyAqLworc3RhdGljIHZvaWQgcGE2dF9yZWdfc2V0dXAoc3RydWN0IG9wX2NvdW50ZXJfY29uZmlnICpjdHIsCisJCQkgICBzdHJ1Y3Qgb3Bfc3lzdGVtX2NvbmZpZyAqc3lzLAorCQkJICAgaW50IG51bV9jdHJzKQoreworCWludCBwbWM7CisKKwkvKgorCSAqIGFkanVzdCB0aGUgbW1jcjAuZW5bMC01XSBhbmQgbW1jcjAuaW50ZW5bMC01XSB2YWx1ZXMgb2J0YWluZWQgZnJvbSB0aGUKKwkgKiBldmVudF9tYXBwaW5ncyBmaWxlIGJ5IHR1cm5pbmcgb2ZmIHRoZSBjb3VudGVycyB0aGF0IHRoZSB1c2VyIGRvZXNuJ3QKKwkgKiBjYXJlIGFib3V0CisJICoKKwkgKiBzZXR1cCB1c2VyIGFuZCBrZXJuZWwgcHJvZmlsaW5nCisJICovCisJZm9yIChwbWMgPSAwOyBwbWMgPCBjdXJfY3B1X3NwZWMtPm51bV9wbWNzOyBwbWMrKykKKwkJaWYgKCFjdHJbcG1jXS5lbmFibGVkKSB7CisJCQlzeXMtPm1tY3IwICY9IH4oMHgxVUwgPDwgcG1jKTsKKwkJCXN5cy0+bW1jcjAgJj0gfigweDFVTCA8PCAocG1jKzEyKSk7CisJCQlwcl9kZWJ1ZygidHVybmVkIG9mZiBjb3VudGVyICV1XG4iLCBwbWMpOworCQl9CisKKwlpZiAoc3lzLT5lbmFibGVfa2VybmVsKQorCQlzeXMtPm1tY3IwIHw9IFBBNlRfTU1DUjBfU1VQRU4gfCBQQTZUX01NQ1IwX0hZUEVOOworCWVsc2UKKwkJc3lzLT5tbWNyMCAmPSB+KFBBNlRfTU1DUjBfU1VQRU4gfCBQQTZUX01NQ1IwX0hZUEVOKTsKKworCWlmIChzeXMtPmVuYWJsZV91c2VyKQorCQlzeXMtPm1tY3IwIHw9IFBBNlRfTU1DUjBfUFJFTjsKKwllbHNlCisJCXN5cy0+bW1jcjAgJj0gflBBNlRfTU1DUjBfUFJFTjsKKworCS8qCisJICogVGhlIHBlcmZvcm1hbmNlIGNvdW50ZXIgZXZlbnQgc2V0dGluZ3MgYXJlIGdpdmVuIGluIHRoZSBtbWNyMCBhbmQKKwkgKiBtbWNyMSB2YWx1ZXMgcGFzc2VkIGZyb20gdGhlIHVzZXIgaW4gdGhlIG9wX3N5c3RlbV9jb25maWcKKwkgKiBzdHJ1Y3R1cmUgKHN5cyB2YXJpYWJsZSkuCisJICovCisJbW1jcjBfdmFsID0gc3lzLT5tbWNyMDsKKwltbWNyMV92YWwgPSBzeXMtPm1tY3IxOworCXByX2RlYnVnKCJtbWNyMF92YWwgaW5pdGVkIHRvICUwMTZseFxuIiwgc3lzLT5tbWNyMCk7CisJcHJfZGVidWcoIm1tY3IxX3ZhbCBpbml0ZWQgdG8gJTAxNmx4XG4iLCBzeXMtPm1tY3IxKTsKKworCWZvciAocG1jID0gMDsgcG1jIDwgY3VyX2NwdV9zcGVjLT5udW1fcG1jczsgcG1jKyspIHsKKwkJLyogY291bnRlcnMgYXJlIDQwIGJpdC4gTW92ZSB0byBjcHV0YWJsZSBhdCBzb21lIHBvaW50PyAqLworCQlyZXNldF92YWx1ZVtwbWNdID0gKDB4MVVMIDw8IDM5KSAtIGN0cltwbWNdLmNvdW50OworCQlwcl9kZWJ1ZygicmVzZXRfdmFsdWUgZm9yIHBtYyV1IGluaXRlZCB0byAweCVseFxuIiwKKwkJCQkgcG1jLCByZXNldF92YWx1ZVtwbWNdKTsKKwl9Cit9CisKKy8qIGNvbmZpZ3VyZSByZWdpc3RlcnMgb24gdGhpcyBjcHUgKi8KK3N0YXRpYyB2b2lkIHBhNnRfY3B1X3NldHVwKHN0cnVjdCBvcF9jb3VudGVyX2NvbmZpZyAqY3RyKQoreworCXU2NCBtbWNyMCA9IG1tY3IwX3ZhbDsKKwl1NjQgbW1jcjEgPSBtbWNyMV92YWw7CisKKwkvKiBEZWZhdWx0IGlzIGFsbCBQTUNzIG9mZiAqLworCW1tY3IwICY9IH4oMHgzRlVMKTsKKwltdHNwcihTUFJOX1BBNlRfTU1DUjAsIG1tY3IwKTsKKworCS8qIHByb2dyYW0gc2VsZWN0ZWQgcHJvZ3JhbW1hYmxlIGV2ZW50cyBpbiAqLworCW10c3ByKFNQUk5fUEE2VF9NTUNSMSwgbW1jcjEpOworCisJcHJfZGVidWcoInNldHVwIG9uIGNwdSAlZCwgbW1jcjAgJTAxNmx4XG4iLCBzbXBfcHJvY2Vzc29yX2lkKCksCisJCW1mc3ByKFNQUk5fUEE2VF9NTUNSMCkpOworCXByX2RlYnVnKCJzZXR1cCBvbiBjcHUgJWQsIG1tY3IxICUwMTZseFxuIiwgc21wX3Byb2Nlc3Nvcl9pZCgpLAorCQltZnNwcihTUFJOX1BBNlRfTU1DUjEpKTsKK30KKworc3RhdGljIHZvaWQgcGE2dF9zdGFydChzdHJ1Y3Qgb3BfY291bnRlcl9jb25maWcgKmN0cikKK3sKKwlpbnQgaTsKKworCS8qIEhvbGQgb2ZmIGV2ZW50IGNvdW50aW5nIHVudGlsIHJmaWQgKi8KKwl1NjQgbW1jcjAgPSBtbWNyMF92YWwgfCBQQTZUX01NQ1IwX0hBTkRESVM7CisKKwlmb3IgKGkgPSAwOyBpIDwgY3VyX2NwdV9zcGVjLT5udW1fcG1jczsgaSsrKQorCQlpZiAoY3RyW2ldLmVuYWJsZWQpCisJCQljdHJfd3JpdGUoaSwgcmVzZXRfdmFsdWVbaV0pOworCQllbHNlCisJCQljdHJfd3JpdGUoaSwgMFVMKTsKKworCW10c3ByKFNQUk5fUEE2VF9NTUNSMCwgbW1jcjApOworCisJb3Byb2ZpbGVfcnVubmluZyA9IDE7CisKKwlwcl9kZWJ1Zygic3RhcnQgb24gY3B1ICVkLCBtbWNyMCAlbHhcbiIsIHNtcF9wcm9jZXNzb3JfaWQoKSwgbW1jcjApOworfQorCitzdGF0aWMgdm9pZCBwYTZ0X3N0b3Aodm9pZCkKK3sKKwl1NjQgbW1jcjA7CisKKwkvKiBmcmVlemUgY291bnRlcnMgKi8KKwltbWNyMCA9IG1mc3ByKFNQUk5fUEE2VF9NTUNSMCk7CisJbW1jcjAgfD0gUEE2VF9NTUNSMF9GQ00wOworCW10c3ByKFNQUk5fUEE2VF9NTUNSMCwgbW1jcjApOworCisJb3Byb2ZpbGVfcnVubmluZyA9IDA7CisKKwlwcl9kZWJ1Zygic3RvcCBvbiBjcHUgJWQsIG1tY3IwICVseFxuIiwgc21wX3Byb2Nlc3Nvcl9pZCgpLCBtbWNyMCk7Cit9CisKKy8qIGhhbmRsZSB0aGUgcGVyZm1vbiBvdmVyZmxvdyB2ZWN0b3IgKi8KK3N0YXRpYyB2b2lkIHBhNnRfaGFuZGxlX2ludGVycnVwdChzdHJ1Y3QgcHRfcmVncyAqcmVncywKKwkJCQkgIHN0cnVjdCBvcF9jb3VudGVyX2NvbmZpZyAqY3RyKQoreworCXVuc2lnbmVkIGxvbmcgcGMgPSBtZnNwcihTUFJOX1BBNlRfU0lBUik7CisJaW50IGlzX2tlcm5lbCA9IGlzX2tlcm5lbF9hZGRyKHBjKTsKKwl1NjQgdmFsOworCWludCBpOworCXU2NCBtbWNyMDsKKworCS8qIGRpc2FibGUgcGVyZm1vbiBjb3VudGluZyB1bnRpbCByZmlkICovCisJbW1jcjAgPSBtZnNwcihTUFJOX1BBNlRfTU1DUjApOworCW10c3ByKFNQUk5fUEE2VF9NTUNSMCwgbW1jcjAgfCBQQTZUX01NQ1IwX0hBTkRESVMpOworCisJLyogUmVjb3JkIHNhbXBsZXMuIFdlJ3ZlIGdvdCBvbmUgZ2xvYmFsIGJpdCBmb3Igd2hldGhlciBhIHNhbXBsZQorCSAqIHdhcyB0YWtlbiwgc28gYWRkIGl0IGZvciBhbnkgY291bnRlciB0aGF0IHRyaWdnZXJlZCBvdmVyZmxvdy4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgY3VyX2NwdV9zcGVjLT5udW1fcG1jczsgaSsrKSB7CisJCXZhbCA9IGN0cl9yZWFkKGkpOworCQlpZiAodmFsICYgKDB4MVVMIDw8IDM5KSkgeyAvKiBPdmVyZmxvdyBiaXQgc2V0ICovCisJCQlpZiAob3Byb2ZpbGVfcnVubmluZyAmJiBjdHJbaV0uZW5hYmxlZCkgeworCQkJCWlmIChtbWNyMCAmIFBBNlRfTU1DUjBfU0lBUkxPRykKKwkJCQkJb3Byb2ZpbGVfYWRkX2V4dF9zYW1wbGUocGMsIHJlZ3MsIGksIGlzX2tlcm5lbCk7CisJCQkJY3RyX3dyaXRlKGksIHJlc2V0X3ZhbHVlW2ldKTsKKwkJCX0gZWxzZSB7CisJCQkJY3RyX3dyaXRlKGksIDBVTCk7CisJCQl9CisJCX0KKwl9CisKKwkvKiBSZXN0b3JlIG1tY3IwIHRvIGEgZ29vZCBrbm93biB2YWx1ZSBzaW5jZSB0aGUgUE1JIGNoYW5nZXMgaXQgKi8KKwltbWNyMCA9IG1tY3IwX3ZhbCB8IFBBNlRfTU1DUjBfSEFORERJUzsKKwltdHNwcihTUFJOX1BBNlRfTU1DUjAsIG1tY3IwKTsKK30KKworc3RydWN0IG9wX3Bvd2VycGNfbW9kZWwgb3BfbW9kZWxfcGE2dCA9IHsKKwkucmVnX3NldHVwCQk9IHBhNnRfcmVnX3NldHVwLAorCS5jcHVfc2V0dXAJCT0gcGE2dF9jcHVfc2V0dXAsCisJLnN0YXJ0CQkJPSBwYTZ0X3N0YXJ0LAorCS5zdG9wCQkJPSBwYTZ0X3N0b3AsCisJLmhhbmRsZV9pbnRlcnJ1cHQJPSBwYTZ0X2hhbmRsZV9pbnRlcnJ1cHQsCit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy80eHgvS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNHh4L0tjb25maWcKaW5kZXggMmYyYTEzZS4uZGVkMzU3YyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy80eHgvS2NvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzR4eC9LY29uZmlnCkBAIC0zLDI3OCArMywyMDYgQEAKIAlkZXBlbmRzIG9uIDQweCB8fCA0NHgKIAlkZWZhdWx0IHkKIAotY29uZmlnIFdBTlRfRUFSTFlfU0VSSUFMCitjb25maWcgQk9PS0UKIAlib29sCi0Jc2VsZWN0IFNFUklBTF84MjUwCi0JZGVmYXVsdCBuCi0KLW1lbnUgIkFNQ0MgNHh4IG9wdGlvbnMiCi0JZGVwZW5kcyBvbiA0eHgKLQotY2hvaWNlCi0JcHJvbXB0ICJNYWNoaW5lIFR5cGUiCi0JZGVwZW5kcyBvbiA0MHgKLQlkZWZhdWx0IFdBTE5VVAotCi1jb25maWcgQlVCSU5HQQotCWJvb2wgIkJ1YmluZ2EiCi0Jc2VsZWN0IFdBTlRfRUFSTFlfU0VSSUFMCi0JaGVscAotCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgSUJNIDQwNUVQIGV2YWx1YXRpb24gYm9hcmQuCi0KLWNvbmZpZyBDUENJNDA1Ci0JYm9vbCAiQ1BDSTQwNSIKLQloZWxwCi0JICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBDUENJNDA1IGJvYXJkLgotCi1jb25maWcgRVA0MDUKLQlib29sICJFUDQwNS9FUDQwNVBDIgotCWhlbHAKLQkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIEVQNDA1L0VQNDA1UEMgYm9hcmRzLgotCi1jb25maWcgUkVEV09PRF81Ci0JYm9vbCAiUmVkd29vZC01IgotCWhlbHAKLQkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIElCTSBTVEIwNCBldmFsdWF0aW9uIGJvYXJkLgotCi1jb25maWcgUkVEV09PRF82Ci0JYm9vbCAiUmVkd29vZC02IgotCWhlbHAKLQkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIElCTSBTVEJ4MjV4eCBldmFsdWF0aW9uIGJvYXJkLgotCi1jb25maWcgU1lDQU1PUkUKLQlib29sICJTeWNhbW9yZSIKLQloZWxwCi0JICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBJQk0gUFBDNDA1R1ByIGV2YWx1YXRpb24gYm9hcmQuCi0KLWNvbmZpZyBXQUxOVVQKLQlib29sICJXYWxudXQiCi0JaGVscAotCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgSUJNIFBQQzQwNUdQIGV2YWx1YXRpb24gYm9hcmQuCi0KLWNvbmZpZyBYSUxJTlhfTUwzMDAKLQlib29sICJYaWxpbngtTUwzMDAiCi0JaGVscAotCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgWGlsaW54IE1MMzAwIGV2YWx1YXRpb24gYm9hcmQuCi0KLWVuZGNob2ljZQotCi1jaG9pY2UKLQlwcm9tcHQgIk1hY2hpbmUgVHlwZSIKIAlkZXBlbmRzIG9uIDQ0eAotCWRlZmF1bHQgRUJPTlkKKwlkZWZhdWx0IHkKIAotY29uZmlnIEJBTUJPTwotCWJvb2wgIkJhbWJvbyIKLQlzZWxlY3QgV0FOVF9FQVJMWV9TRVJJQUwKLQloZWxwCi0JICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBJQk0gUFBDNDQwRVAgZXZhbHVhdGlvbiBib2FyZC4KK21lbnUgIkFNQ0MgNDB4IG9wdGlvbnMiCisJZGVwZW5kcyBvbiA0MHgKKworI2NvbmZpZyBCVUJJTkdBCisjCWJvb2wgIkJ1YmluZ2EiCisjCWRlcGVuZHMgb24gNDB4CisjCWRlZmF1bHQgbgorIwlzZWxlY3QgNDA1RVAKKyMJaGVscAorIwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIElCTSA0MDVFUCBldmFsdWF0aW9uIGJvYXJkLgorCisjY29uZmlnIENQQ0k0MDUKKyMJYm9vbCAiQ1BDSTQwNSIKKyMJZGVwZW5kcyBvbiA0MHgKKyMJZGVmYXVsdCBuCisjCXNlbGVjdCA0MDVHUAorIwloZWxwCisjCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgQ1BDSTQwNSBib2FyZC4KKworI2NvbmZpZyBFUDQwNQorIwlib29sICJFUDQwNS9FUDQwNVBDIgorIwlkZXBlbmRzIG9uIDQweAorIwlkZWZhdWx0IG4KKyMJc2VsZWN0IDQwNUdQCisjCWhlbHAKKyMJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBFUDQwNS9FUDQwNVBDIGJvYXJkcy4KKworI2NvbmZpZyBFUDQwNVBDCisjCWJvb2wgIkVQNDA1UEMgU3VwcG9ydCIKKyMJZGVwZW5kcyBvbiBFUDQwNQorIwlkZWZhdWx0IHkKKyMJaGVscAorIwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIGV4dHJhIGZlYXR1cmVzIG9mIHRoZSBFUDQwNVBDIGJvYXJkLgorCisjY29uZmlnIFJFRFdPT0RfNQorIwlib29sICJSZWR3b29kLTUiCisjCWRlcGVuZHMgb24gNDB4CisjCWRlZmF1bHQgbgorIwlzZWxlY3QgU1RCMDN4eHgKKyMJaGVscAorIwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIElCTSBTVEIwNCBldmFsdWF0aW9uIGJvYXJkLgorCisjY29uZmlnIFJFRFdPT0RfNgorIwlib29sICJSZWR3b29kLTYiCisjCWRlcGVuZHMgb24gNDB4CisjCWRlZmF1bHQgbgorIwlzZWxlY3QgU1RCMDN4eHgKKyMJaGVscAorIwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIElCTSBTVEJ4MjV4eCBldmFsdWF0aW9uIGJvYXJkLgorCisjY29uZmlnIFNZQ0FNT1JFCisjCWJvb2wgIlN5Y2Ftb3JlIgorIwlkZXBlbmRzIG9uIDQweAorIwlkZWZhdWx0IG4KKyMJc2VsZWN0IDQwNUdQUgorIwloZWxwCisjCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgSUJNIFBQQzQwNUdQciBldmFsdWF0aW9uIGJvYXJkLgorCisjY29uZmlnIFdBTE5VVAorIwlib29sICJXYWxudXQiCisjCWRlcGVuZHMgb24gNDB4CisjCWRlZmF1bHQgeQorIwlzZWxlY3QgNDA1R1AKKyMJaGVscAorIwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIElCTSBQUEM0MDVHUCBldmFsdWF0aW9uIGJvYXJkLgorCisjY29uZmlnIFhJTElOWF9NTDMwMAorIwlib29sICJYaWxpbngtTUwzMDAiCisjCWRlcGVuZHMgb24gNDB4CisjCWRlZmF1bHQgeQorIwlzZWxlY3QgVklSVEVYX0lJX1BSTworIwloZWxwCisjCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgWGlsaW54IE1MMzAwIGV2YWx1YXRpb24gYm9hcmQuCisKK2VuZG1lbnUKKworIyA0MHggc3BlY2lmaWMgQ1BVIG1vZHVsZXMsIHNlbGVjdGVkIGJhc2VkIG9uIHRoZSBib2FyZCBhYm92ZS4KK2NvbmZpZyBOUDQwNUgKKwlib29sCisJI2RlcGVuZHMgb24gQVNICisKKyMgT0FLIGRvZXNuJ3QgZXhpc3QgYnV0IHdhbnRlZCB0byBrZWVwIHRoaXMgYXJvdW5kIGZvciBhbnkgZnV0dXJlIDQwM0dDWCBib2FyZHMKK2NvbmZpZyA0MDNHQ1gKKwlib29sCisJI2RlcGVuZHMgb24gT0FLCisJc2VsZWN0IElCTTQwNV9FUlI1MQorCitjb25maWcgNDA1R1AKKwlib29sCisJc2VsZWN0IElCTTQwNV9FUlI3NworCXNlbGVjdCBJQk00MDVfRVJSNTEKKworY29uZmlnIDQwNUVQCisJYm9vbAorCitjb25maWcgNDA1R1BSCisJYm9vbAorCitjb25maWcgVklSVEVYX0lJX1BSTworCWJvb2wKKwlzZWxlY3QgSUJNNDA1X0VSUjc3CisJc2VsZWN0IElCTTQwNV9FUlI1MQorCitjb25maWcgU1RCMDN4eHgKKwlib29sCisJc2VsZWN0IElCTTQwNV9FUlI3NworCXNlbGVjdCBJQk00MDVfRVJSNTEKKworIyA0MHggZXJyYXRhL3dvcmthcm91bmQgY29uZmlnIHN5bWJvbHMsIHNlbGVjdGVkIGJ5IHRoZSBDUFUgbW9kZWxzIGFib3ZlCisKKyMgQWxsIDQwNS1iYXNlZCBjb3JlcyB1cCB1bnRpbCB0aGUgNDA1R1BSIGFuZCA0MDVFUCBoYXZlIHRoaXMgZXJyYXRhLgorY29uZmlnIElCTTQwNV9FUlI3NworCWJvb2wKKworIyBBbGwgNDB4LWJhc2VkIGNvcmVzLCB1cCB1bnRpbCB0aGUgNDA1R1BSIGFuZCA0MDVFUCBoYXZlIHRoaXMgZXJyYXRhLgorY29uZmlnIElCTTQwNV9FUlI1MQorCWJvb2wKKworbWVudSAiQU1DQyA0NHggb3B0aW9ucyIKKwlkZXBlbmRzIG9uIDQ0eAorCisjY29uZmlnIEJBTUJPTworIwlib29sICJCYW1ib28iCisjCWRlcGVuZHMgb24gNDR4CisjCWRlZmF1bHQgbgorIwlzZWxlY3QgNDQwRVAKKyMJaGVscAorIwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIElCTSBQUEM0NDBFUCBldmFsdWF0aW9uIGJvYXJkLgogCiBjb25maWcgRUJPTlkKIAlib29sICJFYm9ueSIKLQlzZWxlY3QgV0FOVF9FQVJMWV9TRVJJQUwKKwlkZXBlbmRzIG9uIDQ0eAorCWRlZmF1bHQgeQorCXNlbGVjdCA0NDBHUAogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIElCTSBQUEM0NDBHUCBldmFsdWF0aW9uIGJvYXJkLgogCi1jb25maWcgTFVBTgotCWJvb2wgIkx1YW4iCi0Jc2VsZWN0IFdBTlRfRUFSTFlfU0VSSUFMCi0JaGVscAotCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgSUJNIFBQQzQ0MFNQIGV2YWx1YXRpb24gYm9hcmQuCisjY29uZmlnIExVQU4KKyMJYm9vbCAiTHVhbiIKKyMJZGVwZW5kcyBvbiA0NHgKKyMJZGVmYXVsdCBuCisjCXNlbGVjdCA0NDBTUAorIwloZWxwCisjCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgSUJNIFBQQzQ0MFNQIGV2YWx1YXRpb24gYm9hcmQuCiAKLWNvbmZpZyBPQ09URUEKLQlib29sICJPY290ZWEiCi0Jc2VsZWN0IFdBTlRfRUFSTFlfU0VSSUFMCi0JaGVscAotCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgSUJNIFBQQzQ0MEdYIGV2YWx1YXRpb24gYm9hcmQuCisjY29uZmlnIE9DT1RFQQorIwlib29sICJPY290ZWEiCisjCWRlcGVuZHMgb24gNDR4CisjCWRlZmF1bHQgbgorIwlzZWxlY3QgNDQwR1gKKyMJaGVscAorIwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIElCTSBQUEM0NDBHWCBldmFsdWF0aW9uIGJvYXJkLgogCi1lbmRjaG9pY2UKK2VuZG1lbnUKIAotY29uZmlnIEVQNDA1UEMKLQlib29sICJFUDQwNVBDIFN1cHBvcnQiCi0JZGVwZW5kcyBvbiBFUDQwNQotCi0KLSMgSXQncyBvZnRlbiBuZWNlc3NhcnkgdG8ga25vdyB0aGUgc3BlY2lmaWMgNHh4IHByb2Nlc3NvciB0eXBlLgotIyBGb3J0dW5hdGVseSwgaXQgaXMgaW1wbGVkIChzbyBmYXIpIGZyb20gdGhlIGJvYXJkIHR5cGUsIHNvIHdlCi0jIGRvbid0IG5lZWQgdG8gYXNrIG1vcmUgcmVkdW5kYW50IHF1ZXN0aW9ucy4KLWNvbmZpZyBOUDQwNUgKLQlib29sCi0JZGVwZW5kcyBvbiBBU0gKLQlkZWZhdWx0IHkKLQorIyA0NHggc3BlY2lmaWMgQ1BVIG1vZHVsZXMsIHNlbGVjdGVkIGJhc2VkIG9uIHRoZSBib2FyZCBhYm92ZS4KIGNvbmZpZyA0NDBFUAogCWJvb2wKLQlkZXBlbmRzIG9uIEJBTUJPTwogCXNlbGVjdCBQUENfRlBVCi0JZGVmYXVsdCB5CisJc2VsZWN0IElCTTQ0MEVQX0VSUjQyCiAKIGNvbmZpZyA0NDBHUAogCWJvb2wKLQlkZXBlbmRzIG9uIEVCT05ZCi0JZGVmYXVsdCB5CisJc2VsZWN0IElCTV9ORVdfRU1BQ19aTUlJCiAKIGNvbmZpZyA0NDBHWAogCWJvb2wKLQlkZXBlbmRzIG9uIE9DT1RFQQotCWRlZmF1bHQgeQogCiBjb25maWcgNDQwU1AKIAlib29sCi0JZGVwZW5kcyBvbiBMVUFOCi0JZGVmYXVsdCB5Ci0KLWNvbmZpZyA0NDAKLQlib29sCi0JZGVwZW5kcyBvbiA0NDBHUCB8fCA0NDBTUCB8fCA0NDBFUAotCWRlZmF1bHQgeQogCiBjb25maWcgNDQwQQogCWJvb2wKIAlkZXBlbmRzIG9uIDQ0MEdYCiAJZGVmYXVsdCB5CiAKKyMgNDR4IGVycmF0YS93b3JrYXJvdW5kIGNvbmZpZyBzeW1ib2xzLCBzZWxlY3RlZCBieSB0aGUgQ1BVIG1vZGVscyBhYm92ZQogY29uZmlnIElCTTQ0MEVQX0VSUjQyCiAJYm9vbAotCWRlcGVuZHMgb24gNDQwRVAKLQlkZWZhdWx0IHkKIAotIyBBbGwgNDA1LWJhc2VkIGNvcmVzIHVwIHVudGlsIHRoZSA0MDVHUFIgYW5kIDQwNUVQIGhhdmUgdGhpcyBlcnJhdGEuCi1jb25maWcgSUJNNDA1X0VSUjc3Ci0JYm9vbAotCWRlcGVuZHMgb24gNDB4ICYmICE0MDNHQ1ggJiYgITQwNUdQUiAmJiAhNDA1RVAKLQlkZWZhdWx0IHkKKyNjb25maWcgWElMSU5YX09DUAorIwlib29sCisjCWRlcGVuZHMgb24gWElMSU5YX01MMzAwCisjCWRlZmF1bHQgeQogCi0jIEFsbCA0MHgtYmFzZWQgY29yZXMsIHVwIHVudGlsIHRoZSA0MDVHUFIgYW5kIDQwNUVQIGhhdmUgdGhpcyBlcnJhdGEuCi1jb25maWcgSUJNNDA1X0VSUjUxCi0JYm9vbAotCWRlcGVuZHMgb24gNDB4ICYmICE0MDVHUFIgJiYgITQwNUVQCi0JZGVmYXVsdCB5CisjY29uZmlnIEJJT1NfRklYVVAKKyMJYm9vbAorIwlkZXBlbmRzIG9uIEJVQklOR0EgfHwgRVA0MDUgfHwgU1lDQU1PUkUgfHwgV0FMTlVUCisjCWRlZmF1bHQgeQogCi1jb25maWcgQk9PS0UKLQlib29sCi0JZGVwZW5kcyBvbiA0NHgKLQlkZWZhdWx0IHkKKyNjb25maWcgUFBDNHh4X0RNQQorIwlib29sICJQUEM0eHggRE1BIGNvbnRyb2xsZXIgc3VwcG9ydCIKKyMJZGVwZW5kcyBvbiA0eHgKIAotY29uZmlnIElCTV9PQ1AKLQlib29sCi0JZGVwZW5kcyBvbiBBU0ggfHwgQkFNQk9PIHx8IEJVQklOR0EgfHwgQ1BDSTQwNSB8fCBFQk9OWSB8fCBFUDQwNSB8fCBMVUFOIHx8IE9DT1RFQSB8fCBSRURXT09EXzUgfHwgUkVEV09PRF82IHx8IFNZQ0FNT1JFIHx8IFdBTE5VVAotCWRlZmF1bHQgeQotCi1jb25maWcgWElMSU5YX09DUAotCWJvb2wKLQlkZXBlbmRzIG9uIFhJTElOWF9NTDMwMAotCWRlZmF1bHQgeQotCi1jb25maWcgSUJNX0VNQUM0Ci0JYm9vbAotCWRlcGVuZHMgb24gNDQwR1ggfHwgNDQwU1AKLQlkZWZhdWx0IHkKLQotY29uZmlnIEJJT1NfRklYVVAKLQlib29sCi0JZGVwZW5kcyBvbiBCVUJJTkdBIHx8IEVQNDA1IHx8IFNZQ0FNT1JFIHx8IFdBTE5VVAotCWRlZmF1bHQgeQotCi0jIE9BSyBkb2Vzbid0IGV4aXN0IGJ1dCB3YW50ZWQgdG8ga2VlcCB0aGlzIGFyb3VuZCBmb3IgYW55IGZ1dHVyZSA0MDNHQ1ggYm9hcmRzCi1jb25maWcgNDAzR0NYCi0JYm9vbAotCWRlcGVuZHMgb24gT0FLCi0JZGVmYXVsdCB5Ci0KLWNvbmZpZyA0MDVFUAotCWJvb2wKLQlkZXBlbmRzIG9uIEJVQklOR0EKLQlkZWZhdWx0IHkKLQotY29uZmlnIDQwNUdQCi0JYm9vbAotCWRlcGVuZHMgb24gQ1BDSTQwNSB8fCBFUDQwNSB8fCBXQUxOVVQKLQlkZWZhdWx0IHkKLQotY29uZmlnIDQwNUdQUgotCWJvb2wKLQlkZXBlbmRzIG9uIFNZQ0FNT1JFCi0JZGVmYXVsdCB5Ci0KLWNvbmZpZyBWSVJURVhfSUlfUFJPCi0JYm9vbAotCWRlcGVuZHMgb24gWElMSU5YX01MMzAwCi0JZGVmYXVsdCB5Ci0KLWNvbmZpZyBTVEIwM3h4eAotCWJvb2wKLQlkZXBlbmRzIG9uIFJFRFdPT0RfNSB8fCBSRURXT09EXzYKLQlkZWZhdWx0IHkKLQotY29uZmlnIEVNQkVEREVEQk9PVAotCWJvb2wKLQlkZXBlbmRzIG9uIEVQNDA1IHx8IFhJTElOWF9NTDMwMAotCWRlZmF1bHQgeQotCi1jb25maWcgSUJNX09QRU5CSU9TCi0JYm9vbAotCWRlcGVuZHMgb24gQVNIIHx8IEJVQklOR0EgfHwgUkVEV09PRF81IHx8IFJFRFdPT0RfNiB8fCBTWUNBTU9SRSB8fCBXQUxOVVQKLQlkZWZhdWx0IHkKLQotY29uZmlnIFBQQzR4eF9ETUEKLQlib29sICJQUEM0eHggRE1BIGNvbnRyb2xsZXIgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIDR4eAotCi1jb25maWcgUFBDNHh4X0VETUEKLQlib29sCi0JZGVwZW5kcyBvbiAhU1RCMDN4eHggJiYgUFBDNHh4X0RNQQotCWRlZmF1bHQgeQotCi1jb25maWcgUFBDX0dFTjU1MAotCWJvb2wKLQlkZXBlbmRzIG9uIDR4eAotCWRlZmF1bHQgeQotCi1jaG9pY2UKLQlwcm9tcHQgIlRUWVMwIGRldmljZSBhbmQgZGVmYXVsdCBjb25zb2xlIgotCWRlcGVuZHMgb24gNDB4Ci0JZGVmYXVsdCBVQVJUMF9UVFlTMAotCi1jb25maWcgVUFSVDBfVFRZUzAKLQlib29sICJVQVJUMCIKLQotY29uZmlnIFVBUlQwX1RUWVMxCi0JYm9vbCAiVUFSVDEiCi0KLWVuZGNob2ljZQotCi1jb25maWcgU0VSSUFMX1NJQ0MKLQlib29sICJTSUNDIFNlcmlhbCBwb3J0IHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBTVEIwM3h4eAotCi1jb25maWcgVUFSVDFfREZMVF9DT05TT0xFCi0JYm9vbAotCWRlcGVuZHMgb24gU0VSSUFMX1NJQ0MgJiYgVUFSVDBfVFRZUzEKLQlkZWZhdWx0IHkKLQotY29uZmlnIFNFUklBTF9TSUNDX0NPTlNPTEUKLQlib29sCi0JZGVwZW5kcyBvbiBTRVJJQUxfU0lDQyAmJiBVQVJUMF9UVFlTMQotCWRlZmF1bHQgeQotZW5kbWVudQotCi0KLW1lbnUgIklCTSA0MHggb3B0aW9ucyIKLQlkZXBlbmRzIG9uIDQweAotCi1jb25maWcgU0VSSUFMX1NJQ0MKLQlib29sICJTSUNDIFNlcmlhbCBwb3J0IgotCWRlcGVuZHMgb24gU1RCMDN4eHgKLQotY29uZmlnIFVBUlQxX0RGTFRfQ09OU09MRQotCWJvb2wKLQlkZXBlbmRzIG9uIFNFUklBTF9TSUNDICYmIFVBUlQwX1RUWVMxCi0JZGVmYXVsdCB5Ci0KLWNvbmZpZyBTRVJJQUxfU0lDQ19DT05TT0xFCi0JYm9vbAotCWRlcGVuZHMgb24gU0VSSUFMX1NJQ0MgJiYgVUFSVDBfVFRZUzEKLQlkZWZhdWx0IHkKLQotZW5kbWVudQorI2NvbmZpZyBQUEM0eHhfRURNQQorIwlib29sCisjCWRlcGVuZHMgb24gIVNUQjAzeHh4ICYmIFBQQzR4eF9ETUEKKyMJZGVmYXVsdCB5CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjNGFhNGEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvS2NvbmZpZwpAQCAtMCwwICsxLDM1IEBACitjb25maWcgUFBDX01QQzUyeHgKKwlib29sCisJZGVmYXVsdCBuCisKK2NvbmZpZyBQUENfTVBDNTIwMAorCWJvb2wKKwlzZWxlY3QgUFBDX01QQzUyeHgKKwlkZWZhdWx0IG4KKworY29uZmlnIFBQQ19NUEM1MjAwX0JVR0ZJWAorCWJvb2wgIk1QQzUyMDAgKEwyNVIpIGJ1Z2ZpeCBzdXBwb3J0IgorCWRlcGVuZHMgb24gUFBDX01QQzUyMDAKKwlkZWZhdWx0IG4KKwloZWxwCisJICBFbmFibGUgd29ya2Fyb3VuZHMgZm9yIG9yaWdpbmFsIE1QQzUyMDAgZXJyYXRhLiAgVGhpcyBpcyBub3QgcmVxdWlyZWQKKwkgIGZvciBNUEM1MjAwQiBiYXNlZCBib2FyZHMuCisKKwkgIEl0IGlzIHNhZmUgdG8gc2F5ICdZJyBoZXJlCisKK2NvbmZpZyBQUENfRUZJS0EKKwlib29sICJiUGxhbiBFZmlrYSA1azIuIE1QQzUyMDBCIGJhc2VkIGNvbXB1dGVyIgorCWRlcGVuZHMgb24gUFBDX01VTFRJUExBVEZPUk0gJiYgUFBDMzIKKwlzZWxlY3QgUFBDX1JUQVMKKwlzZWxlY3QgUlRBU19QUk9DCisJc2VsZWN0IFBQQ19NUEM1Mnh4CisJc2VsZWN0IFBQQ19OQVRJVkUKKwlkZWZhdWx0IG4KKworY29uZmlnIFBQQ19MSVRFNTIwMAorCWJvb2wgIkZyZWVzY2FsZSBMaXRlNTIwMCBFdmFsIEJvYXJkIgorCWRlcGVuZHMgb24gUFBDX01VTFRJUExBVEZPUk0gJiYgUFBDMzIKKwlzZWxlY3QgUFBDX01QQzUyMDAKKwlkZWZhdWx0IG4KKworCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvZWZpa2EuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9lZmlrYS5jCmluZGV4IDhkZTAzNDEuLmE2YmJhOTcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9lZmlrYS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9lZmlrYS5jCkBAIC0xMTIsNyArMTEyLDcgQEAKIAkJcmV0dXJuOwogCX0KIAotCWJ1c19yYW5nZSA9IGdldF9wcm9wZXJ0eShwY2ljdHJsLCAiYnVzLXJhbmdlIiwgJmxlbik7CisJYnVzX3JhbmdlID0gb2ZfZ2V0X3Byb3BlcnR5KHBjaWN0cmwsICJidXMtcmFuZ2UiLCAmbGVuKTsKIAlpZiAoYnVzX3JhbmdlID09IE5VTEwgfHwgbGVuIDwgMiAqIHNpemVvZihpbnQpKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgRUZJS0FfUExBVEZPUk1fTkFNRQogCQkgICAgICAgIjogQ2FuJ3QgZ2V0IGJ1cy1yYW5nZSBmb3IgJXNcbiIsIHBjaWN0cmwtPmZ1bGxfbmFtZSk7CkBAIC0xNTgsMTggKzE1OCwxNyBAQAogc3RhdGljIHZvaWQgZWZpa2Ffc2hvd19jcHVpbmZvKHN0cnVjdCBzZXFfZmlsZSAqbSkKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKnJvb3Q7Ci0JY29uc3QgY2hhciAqcmV2aXNpb24gPSBOVUxMOwotCWNvbnN0IGNoYXIgKmNvZGVnZW5kZXNjcmlwdGlvbiA9IE5VTEw7Ci0JY29uc3QgY2hhciAqY29kZWdlbnZlbmRvciA9IE5VTEw7CisJY29uc3QgY2hhciAqcmV2aXNpb247CisJY29uc3QgY2hhciAqY29kZWdlbmRlc2NyaXB0aW9uOworCWNvbnN0IGNoYXIgKmNvZGVnZW52ZW5kb3I7CiAKIAlyb290ID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgoIi8iKTsKIAlpZiAoIXJvb3QpCiAJCXJldHVybjsKIAotCXJldmlzaW9uID0gZ2V0X3Byb3BlcnR5KHJvb3QsICJyZXZpc2lvbiIsIE5VTEwpOwotCWNvZGVnZW5kZXNjcmlwdGlvbiA9Ci0JCSAgICBnZXRfcHJvcGVydHkocm9vdCwgIkNPREVHRU4sZGVzY3JpcHRpb24iLCBOVUxMKTsKLQljb2RlZ2VudmVuZG9yID0gZ2V0X3Byb3BlcnR5KHJvb3QsICJDT0RFR0VOLHZlbmRvciIsIE5VTEwpOworCXJldmlzaW9uID0gb2ZfZ2V0X3Byb3BlcnR5KHJvb3QsICJyZXZpc2lvbiIsIE5VTEwpOworCWNvZGVnZW5kZXNjcmlwdGlvbiA9IG9mX2dldF9wcm9wZXJ0eShyb290LCAiQ09ERUdFTixkZXNjcmlwdGlvbiIsIE5VTEwpOworCWNvZGVnZW52ZW5kb3IgPSBvZl9nZXRfcHJvcGVydHkocm9vdCwgIkNPREVHRU4sdmVuZG9yIiwgTlVMTCk7CiAKIAlpZiAoY29kZWdlbmRlc2NyaXB0aW9uKQogCQlzZXFfcHJpbnRmKG0sICJtYWNoaW5lXHRcdDogJXNcbiIsIGNvZGVnZW5kZXNjcmlwdGlvbik7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvbGl0ZTUyMDAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9saXRlNTIwMC5jCmluZGV4IGNjM2I0MGQuLjhlMjY0NmEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9saXRlNTIwMC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9saXRlNTIwMC5jCkBAIC05NCw4ICs5NCw4IEBACiAKIAlucCA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKE5VTEwsICJjcHUiKTsKIAlpZiAobnApIHsKLQkJdW5zaWduZWQgaW50ICpmcCA9Ci0JCSAgICAoaW50ICopZ2V0X3Byb3BlcnR5KG5wLCAiY2xvY2stZnJlcXVlbmN5IiwgTlVMTCk7CisJCWNvbnN0IHVuc2lnbmVkIGludCAqZnAgPQorCQkJb2ZfZ2V0X3Byb3BlcnR5KG5wLCAiY2xvY2stZnJlcXVlbmN5IiwgTlVMTCk7CiAJCWlmIChmcCAhPSAwKQogCQkJbG9vcHNfcGVyX2ppZmZ5ID0gKmZwIC8gSFo7CiAJCWVsc2UKQEAgLTEwOCw5ICsxMDgsMTEgQEAKIAlsaXRlNTIwMF9zZXR1cF9jcHUoKTsJLyogUGxhdG9ybSBzcGVjaWZpYyAqLwogCiAjaWZkZWYgQ09ORklHX1BDSQotCW5wID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUobnAsICJwY2kiKTsKLQlpZiAobnApCisJbnAgPSBvZl9maW5kX25vZGVfYnlfdHlwZShOVUxMLCAicGNpIik7CisJaWYgKG5wKSB7CiAJCW1wYzUyeHhfYWRkX2JyaWRnZShucCk7CisJCW9mX25vZGVfcHV0KG5wKTsKKwl9CiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19CTEtfREVWX0lOSVRSRApAQCAtMTMyLDcgKzEzNCw3IEBACiAJY29uc3QgY2hhciAqbW9kZWwgPSBOVUxMOwogCiAJaWYgKG5wKQotCQltb2RlbCA9IGdldF9wcm9wZXJ0eShucCwgIm1vZGVsIiwgTlVMTCk7CisJCW1vZGVsID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAibW9kZWwiLCBOVUxMKTsKIAogCXNlcV9wcmludGYobSwgInZlbmRvclx0XHQ6CUZyZWVzY2FsZSBTZW1pY29uZHVjdG9yXG4iKTsKIAlzZXFfcHJpbnRmKG0sICJtYWNoaW5lXHRcdDoJJXNcbiIsIG1vZGVsID8gbW9kZWwgOiAidW5rbm93biIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L21wYzUyeHhfY29tbW9uLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvbXBjNTJ4eF9jb21tb24uYwppbmRleCBlZDBjYjY5Li4yZGQ0MTVmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvbXBjNTJ4eF9jb21tb24uYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvbXBjNTJ4eF9jb21tb24uYwpAQCAtNjAsNyArNjAsNyBAQAogCiAJb2Zfbm9kZV9nZXQobm9kZSk7CiAJd2hpbGUgKG5vZGUpIHsKLQkJcF9pcGJfZnJlcSA9IGdldF9wcm9wZXJ0eShub2RlLCAiYnVzLWZyZXF1ZW5jeSIsIE5VTEwpOworCQlwX2lwYl9mcmVxID0gb2ZfZ2V0X3Byb3BlcnR5KG5vZGUsICJidXMtZnJlcXVlbmN5IiwgTlVMTCk7CiAJCWlmIChwX2lwYl9mcmVxKQogCQkJYnJlYWs7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9tcGM1Mnh4X3BjaS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L21wYzUyeHhfcGNpLmMKaW5kZXggZmFmMTYxYi4uMzRkMzRhMiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L21wYzUyeHhfcGNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L21wYzUyeHhfcGNpLmMKQEAgLTM3MCw3ICszNzAsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlidXNfcmFuZ2UgPSBnZXRfcHJvcGVydHkobm9kZSwgImJ1cy1yYW5nZSIsICZsZW4pOworCWJ1c19yYW5nZSA9IG9mX2dldF9wcm9wZXJ0eShub2RlLCAiYnVzLXJhbmdlIiwgJmxlbik7CiAJaWYgKGJ1c19yYW5nZSA9PSBOVUxMIHx8IGxlbiA8IDIgKiBzaXplb2YoaW50KSkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJDYW4ndCBnZXQgJXMgYnVzLXJhbmdlLCBhc3N1bWUgYnVzIDBcbiIsCiAJCSAgICAgICBub2RlLT5mdWxsX25hbWUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Mnh4L0tjb25maWcgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgyeHgvS2NvbmZpZwppbmRleCA0N2Q4NDFlLi5kZTdmY2U5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgyeHgvS2NvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgyeHgvS2NvbmZpZwpAQCAtMSwyMSArMSwzNiBAQAotbWVudSAiUGxhdGZvcm0gc3VwcG9ydCIKLSAgICAgICBkZXBlbmRzIG9uIFBQQ184Mnh4Ci0KIGNob2ljZQotICAgICAgIHByb21wdCAiTWFjaGluZSBUeXBlIgotICAgICAgIGRlZmF1bHQgTVBDODJ4eF9BRFMKKwlwcm9tcHQgIk1hY2hpbmUgVHlwZSIKKwlkZXBlbmRzIG9uIFBQQ184Mnh4CisJZGVmYXVsdCBNUEM4Mnh4X0FEUwogCiBjb25maWcgTVBDODJ4eF9BRFMKLSAgICAgICBib29sICJGcmVlc2NhbGUgTVBDODJ4eCBBRFMiCi0gICAgICAgc2VsZWN0IERFRkFVTFRfVUlNQUdFCi0gICAgICAgc2VsZWN0IFBRMkFEUwotICAgICAgIHNlbGVjdCA4MjcyCi0gICAgICAgc2VsZWN0IDgyNjAKLSAgICAgICBzZWxlY3QgQ1BNMgotICAgICAgIHNlbGVjdCBGU0xfU09DCi0gICAgICAgaGVscAotICAgICAgICAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgTVBDODI3MiBBRFMgYm9hcmQKKwlib29sICJGcmVlc2NhbGUgTVBDODJ4eCBBRFMiCisJc2VsZWN0IERFRkFVTFRfVUlNQUdFCisJc2VsZWN0IFBRMkFEUworCXNlbGVjdCA4MjcyCisJc2VsZWN0IDgyNjAKKwlzZWxlY3QgRlNMX1NPQworCWhlbHAKKwlUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBNUEM4MjcyIEFEUyBib2FyZAogCiBlbmRjaG9pY2UKIAotZW5kbWVudQorY29uZmlnIFBRMkFEUworCWJvb2wKKwlkZWZhdWx0IG4KKworY29uZmlnIDgyNjAKKwlib29sCisJZGVwZW5kcyBvbiA2eHgKKwlzZWxlY3QgQ1BNMgorCWhlbHAKKwkgIFRoZSBNUEM4MjYwIGlzIGEgdHlwaWNhbCBlbWJlZGRlZCBDUFUgbWFkZSBieSBGcmVlc2NhbGUuICBTZWxlY3RpbmcKKwkgIHRoaXMgb3B0aW9uIG1lYW5zIHRoYXQgeW91IHdpc2ggdG8gYnVpbGQgYSBrZXJuZWwgZm9yIGEgbWFjaGluZSB3aXRoCisJICBhbiA4MjYwIGNsYXNzIENQVS4KKworY29uZmlnIDgyNzIKKwlib29sCisJc2VsZWN0IDgyNjAKKwloZWxwCisJICBUaGUgTVBDODI3MiBDUE0gaGFzIGEgZGlmZmVyZW50IGludGVybmFsIGRwcmFtIHNldHVwIHRoYW4gb3RoZXIgQ1BNMgorCSAgZGV2aWNlcwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Mnh4L21wYzgyeHguYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODJ4eC9tcGM4Mnh4LmMKaW5kZXggNzRlNzg5Mi4uY2M5OTAwZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Mnh4L21wYzgyeHguYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgyeHgvbXBjODJ4eC5jCkBAIC01NSwxNyArNTUsMTcgQEAKIHN0YXRpYyBpbnQgX19pbml0IGdldF9mcmVxKGNoYXIgKm5hbWUsIHVuc2lnbmVkIGxvbmcgKnZhbCkKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNwdTsKLQl1bnNpZ25lZCBpbnQgKmZwOworCWNvbnN0IHVuc2lnbmVkIGludCAqZnA7CiAJaW50IGZvdW5kID0gMDsKIAogCS8qIFRoZSBjcHUgbm9kZSBzaG91bGQgaGF2ZSB0aW1lYmFzZSBhbmQgY2xvY2sgZnJlcXVlbmN5IHByb3BlcnRpZXMgKi8KIAljcHUgPSBvZl9maW5kX25vZGVfYnlfdHlwZShOVUxMLCAiY3B1Iik7CiAKIAlpZiAoY3B1KSB7Ci0JCWZwID0gKHVuc2lnbmVkIGludCAqKWdldF9wcm9wZXJ0eShjcHUsIG5hbWUsIE5VTEwpOworCQlmcCA9IG9mX2dldF9wcm9wZXJ0eShjcHUsIG5hbWUsIE5VTEwpOwogCQlpZiAoZnApIHsKIAkJCWZvdW5kID0gMTsKLQkJCSp2YWwgPSAqZnArKzsKKwkJCSp2YWwgPSAqZnA7CiAJCX0KIAogCQlvZl9ub2RlX3B1dChjcHUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Mnh4L21wYzgyeHhfYWRzLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgyeHgvbXBjODJ4eF9hZHMuYwppbmRleCA3MzM0YzFhLi40N2NiMDlmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgyeHgvbXBjODJ4eF9hZHMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgyeHgvbXBjODJ4eF9hZHMuYwpAQCAtNDU2LDcgKzQ1Niw3IEBACiAJCWlvdW5tYXAoaW1tYXApOwogCQlyZXR1cm47CiAJfQotCWlycV9tYXAgPSBnZXRfcHJvcGVydHkobnAsICJpbnRlcnJ1cHQtbWFwIiwgJnNpemUpOworCWlycV9tYXAgPSBvZl9nZXRfcHJvcGVydHkobnAsICJpbnRlcnJ1cHQtbWFwIiwgJnNpemUpOwogCWlmICgoIWlycV9tYXApIHx8IChzaXplIDw9IDcpKSB7CiAJCXByaW50ayhLRVJOX0lORk8gIk5vIGludGVycnVwdC1tYXAgcHJvcGVydHkgb2YgcGNpIG5vZGVcbiIpOwogCQlpb3VubWFwKGltbWFwKTsKQEAgLTQ4MSw3ICs0ODEsNyBAQAogCX0KIAlwY2lfcGljX25vZGUgPSBvZl9ub2RlX2dldChucCk7CiAJLyogUENJIGludGVycnVwdCBjb250cm9sbGVyIHJlZ2lzdGVyczogc3RhdHVzIGFuZCBtYXNrICovCi0JcmVncyA9IGdldF9wcm9wZXJ0eShucCwgInJlZyIsICZzaXplKTsKKwlyZWdzID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAicmVnIiwgJnNpemUpOwogCWlmICgoIXJlZ3MpIHx8IChzaXplIDw9IDIpKSB7CiAJCXByaW50ayhLRVJOX0lORk8gIk5vIHJlZyBwcm9wZXJ0eSBpbiBwY2kgcGljIG5vZGVcbiIpOwogCQlpb3VubWFwKGltbWFwKTsKQEAgLTUyMSwyMCArNTIxLDIwIEBACiAJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlOwogCXN0cnVjdCByZXNvdXJjZSByOwogCWNvbnN0IGludCAqYnVzX3JhbmdlOwotCWNvbnN0IHZvaWQgKnB0cjsKKwljb25zdCB1aW50ICpwdHI7CiAKIAltZW1zZXQoJnIsIDAsIHNpemVvZihyKSk7CiAJaWYgKG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UobnAsIDAsICZyKSkgewogCQlwcmludGsoS0VSTl9JTkZPICJObyBQQ0kgcmVnIHByb3BlcnR5IGluIGRldmljZSB0cmVlXG4iKTsKIAkJcmV0dXJuOwogCX0KLQlpZiAoIShwdHIgPSBnZXRfcHJvcGVydHkobnAsICJjbG9jay1mcmVxdWVuY3kiLCBOVUxMKSkpIHsKKwlpZiAoIShwdHIgPSBvZl9nZXRfcHJvcGVydHkobnAsICJjbG9jay1mcmVxdWVuY3kiLCBOVUxMKSkpIHsKIAkJcHJpbnRrKEtFUk5fSU5GTyAiTm8gY2xvY2stZnJlcXVlbmN5IHByb3BlcnR5IGluIFBDSSBub2RlIik7CiAJCXJldHVybjsKIAl9Ci0JcGNpX2Nsa19mcnEgPSAqKHVpbnQgKikgcHRyOworCXBjaV9jbGtfZnJxID0gKnB0cjsKIAlvZl9ub2RlX3B1dChucCk7Ci0JYnVzX3JhbmdlID0gZ2V0X3Byb3BlcnR5KG5wLCAiYnVzLXJhbmdlIiwgJmxlbik7CisJYnVzX3JhbmdlID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAiYnVzLXJhbmdlIiwgJmxlbik7CiAJaWYgKGJ1c19yYW5nZSA9PSBOVUxMIHx8IGxlbiA8IDIgKiBzaXplb2YoaW50KSkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJDYW4ndCBnZXQgYnVzLXJhbmdlIGZvciAlcywgYXNzdW1lIgogCQkgICAgICAgIiBidXMgMFxuIiwgbnAtPmZ1bGxfbmFtZSk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9LY29uZmlnCmluZGV4IDcxM2IzMWEuLjE5Y2FmZGYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9LY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9LY29uZmlnCkBAIC0xLDggKzEsNiBAQAotbWVudSAiUGxhdGZvcm0gc3VwcG9ydCIKLQlkZXBlbmRzIG9uIFBQQ184M3h4Ci0KIGNob2ljZQogCXByb21wdCAiTWFjaGluZSBUeXBlIgorCWRlcGVuZHMgb24gUFBDXzgzeHgKIAlkZWZhdWx0IE1QQzgzNHhfTURTCiAKIGNvbmZpZyBNUEM4MzEzX1JEQgpAQCAtMTgsNiArMTYsMTMgQEAKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBNUEM4MzJ4IE1EUyBldmFsdWF0aW9uIGJvYXJkLgogCitjb25maWcgTVBDODMyeF9SREIKKwlib29sICJGcmVlc2NhbGUgTVBDODMyeCBSREIiCisJc2VsZWN0IERFRkFVTFRfVUlNQUdFCisJc2VsZWN0IFFVSUNDX0VOR0lORQorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIE1QQzgzMjMgUkRCIGJvYXJkLgorCiBjb25maWcgTVBDODM0eF9NRFMKIAlib29sICJGcmVlc2NhbGUgTVBDODM0eCBNRFMiCiAJc2VsZWN0IERFRkFVTFRfVUlNQUdFCkBAIC01Nyw3ICs2Miw3IEBACiAJYm9vbAogCXNlbGVjdCBQUENfVURCR18xNjU1MAogCXNlbGVjdCBQUENfSU5ESVJFQ1RfUENJCi0JZGVmYXVsdCB5IGlmIE1QQzgzMnhfTURTCisJZGVmYXVsdCB5IGlmIE1QQzgzMnhfTURTIHx8IE1QQzgzMnhfUkRCCiAKIGNvbmZpZyBNUEM4MzR4CiAJYm9vbApAQCAtNzAsNSArNzUsMyBAQAogCXNlbGVjdCBQUENfVURCR18xNjU1MAogCXNlbGVjdCBQUENfSU5ESVJFQ1RfUENJCiAJZGVmYXVsdCB5IGlmIE1QQzgzNnhfTURTCi0KLWVuZG1lbnUKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9NYWtlZmlsZQppbmRleCBkZmM5NzBkLi4zMWE5MWI1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L01ha2VmaWxlCkBAIC00LDYgKzQsNyBAQAogb2JqLXkJCQkJOj0gbWlzYy5vCiBvYmotJChDT05GSUdfUENJKQkJKz0gcGNpLm8KIG9iai0kKENPTkZJR19NUEM4MzEzX1JEQikJKz0gbXBjODMxM19yZGIubworb2JqLSQoQ09ORklHX01QQzgzMnhfUkRCKQkrPSBtcGM4MzJ4X3JkYi5vCiBvYmotJChDT05GSUdfTVBDODM0eF9NRFMpCSs9IG1wYzgzNHhfbWRzLm8KIG9iai0kKENPTkZJR19NUEM4MzR4X0lUWCkJKz0gbXBjODM0eF9pdHgubwogb2JqLSQoQ09ORklHX01QQzgzNnhfTURTKQkrPSBtcGM4MzZ4X21kcy5vCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODMyeF9tZHMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzJ4X21kcy5jCmluZGV4IDE3ZTNhM2MuLmZmZjA5ZjUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzJ4X21kcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzJ4X21kcy5jCkBAIC00MSw3ICs0MSw2IEBACiAjaW5jbHVkZSA8YXNtL3FlX2ljLmg+CiAKICNpbmNsdWRlICJtcGM4M3h4LmgiCi0jaW5jbHVkZSAibXBjODMyeF9tZHMuaCIKIAogI3VuZGVmIERFQlVHCiAjaWZkZWYgREVCVUcKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzJ4X21kcy5oIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzMnhfbWRzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0OTU4ODkuLjAwMDAwMDAKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzMnhfbWRzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSBGcmVlc2NhbGUgU2VtaWNvbmR1dG9yLCBJbmMuIDIwMDYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBNUEM4MzJ4IE1EUyBib2FyZCBzcGVjaWZpYyBoZWFkZXIuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgotICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKi8KLQotI2lmbmRlZiBfX01BQ0hfTVBDODMyeF9NRFNfSF9fCi0jZGVmaW5lIF9fTUFDSF9NUEM4MzJ4X01EU19IX18KLQotZXh0ZXJuIHU4ICpnZXRfYmNzcih2b2lkKTsKLQotI2VuZGlmCQkJCS8qIF9fTUFDSF9NUEM4MzJ4X01EU19IX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzJ4X3JkYi5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzMnhfcmRiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI3MWU5ZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzJ4X3JkYi5jCkBAIC0wLDAgKzEsMTM4IEBACisvKgorICogYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzMnhfcmRiLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuIDIwMDcuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGVzY3JpcHRpb246CisgKiBNUEM4MzJ4IFJEQiBib2FyZCBzcGVjaWZpYyByb3V0aW5lcy4KKyAqIFRoaXMgZmlsZSBpcyBiYXNlZCBvbiBtcGM4MzJ4X21kcy5jIGFuZCBtcGM4MzEzX3JkYi5jCisgKiBBdXRob3I6IE1pY2hhZWwgQmFya293c2tpIDxtaWNoYWVsLmJhcmtvd3NraUBmcmVlc2NhbGUuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorCisjaW5jbHVkZSA8YXNtL29mX3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8YXNtL3RpbWUuaD4KKyNpbmNsdWRlIDxhc20vaXBpYy5oPgorI2luY2x1ZGUgPGFzbS91ZGJnLmg+CisjaW5jbHVkZSA8YXNtL3FlLmg+CisjaW5jbHVkZSA8YXNtL3FlX2ljLmg+CisKKyNpbmNsdWRlICJtcGM4M3h4LmgiCisKKyN1bmRlZiBERUJVRworI2lmZGVmIERFQlVHCisjZGVmaW5lIERCRyhmbXQuLi4pIHVkYmdfcHJpbnRmKGZtdCkKKyNlbHNlCisjZGVmaW5lIERCRyhmbXQuLi4pCisjZW5kaWYKKworI2lmbmRlZiBDT05GSUdfUENJCit1bnNpZ25lZCBsb25nIGlzYV9pb19iYXNlID0gMDsKK3Vuc2lnbmVkIGxvbmcgaXNhX21lbV9iYXNlID0gMDsKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBTZXR1cCB0aGUgYXJjaGl0ZWN0dXJlCisgKgorICovCitzdGF0aWMgdm9pZCBfX2luaXQgbXBjODMyeF9yZGJfc2V0dXBfYXJjaCh2b2lkKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisKKwlpZiAocHBjX21kLnByb2dyZXNzKQorCQlwcGNfbWQucHJvZ3Jlc3MoIm1wYzgzMnhfcmRiX3NldHVwX2FyY2goKSIsIDApOworCisjaWZkZWYgQ09ORklHX1BDSQorCWZvciAobnAgPSBOVUxMOyAobnAgPSBvZl9maW5kX25vZGVfYnlfdHlwZShucCwgInBjaSIpKSAhPSBOVUxMOykKKwkJYWRkX2JyaWRnZShucCk7CisKKwlwcGNfbWQucGNpX2V4Y2x1ZGVfZGV2aWNlID0gbXBjODN4eF9leGNsdWRlX2RldmljZTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1FVSUNDX0VOR0lORQorCXFlX3Jlc2V0KCk7CisKKwlpZiAoKG5wID0gb2ZfZmluZF9ub2RlX2J5X25hbWUobnAsICJwYXJfaW8iKSkgIT0gTlVMTCkgeworCQlwYXJfaW9faW5pdChucCk7CisJCW9mX25vZGVfcHV0KG5wKTsKKworCQlmb3IgKG5wID0gTlVMTDsgKG5wID0gb2ZfZmluZF9ub2RlX2J5X25hbWUobnAsICJ1Y2MiKSkgIT0gTlVMTDspCisJCQlwYXJfaW9fb2ZfY29uZmlnKG5wKTsKKwl9CisjZW5kaWYJCQkJLyogQ09ORklHX1FVSUNDX0VOR0lORSAqLworfQorCitzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBtcGM4MzJ4X2lkc1tdID0geworCXsgLnR5cGUgPSAic29jIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gInNvYyIsIH0sCisJeyAudHlwZSA9ICJxZSIsIH0sCisJe30sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBtcGM4MzJ4X2RlY2xhcmVfb2ZfcGxhdGZvcm1fZGV2aWNlcyh2b2lkKQoreworCWlmICghbWFjaGluZV9pcyhtcGM4MzJ4X3JkYikpCisJCXJldHVybiAwOworCisJLyogUHVibGlzaCB0aGUgUUUgZGV2aWNlcyAqLworCW9mX3BsYXRmb3JtX2J1c19wcm9iZShOVUxMLCBtcGM4MzJ4X2lkcywgTlVMTCk7CisKKwlyZXR1cm4gMDsKK30KK2RldmljZV9pbml0Y2FsbChtcGM4MzJ4X2RlY2xhcmVfb2ZfcGxhdGZvcm1fZGV2aWNlcyk7CisKK3ZvaWQgX19pbml0IG1wYzgzMnhfcmRiX2luaXRfSVJRKHZvaWQpCit7CisKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCisJbnAgPSBvZl9maW5kX25vZGVfYnlfdHlwZShOVUxMLCAiaXBpYyIpOworCWlmICghbnApCisJCXJldHVybjsKKworCWlwaWNfaW5pdChucCwgMCk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBkZWZhdWx0IGludGVycnVwdCBtYXBwaW5nIHByaW9yaXRpZXMsCisJICogaW4gY2FzZSB0aGUgYm9vdCByb20gY2hhbmdlZCBzb21ldGhpbmcgb24gdXMuCisJICovCisJaXBpY19zZXRfZGVmYXVsdF9wcmlvcml0eSgpOworCW9mX25vZGVfcHV0KG5wKTsKKworI2lmZGVmIENPTkZJR19RVUlDQ19FTkdJTkUKKwlucCA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKE5VTEwsICJxZWljIik7CisJaWYgKCFucCkKKwkJcmV0dXJuOworCisJcWVfaWNfaW5pdChucCwgMCk7CisJb2Zfbm9kZV9wdXQobnApOworI2VuZGlmCQkJCS8qIENPTkZJR19RVUlDQ19FTkdJTkUgKi8KK30KKworLyoKKyAqIENhbGxlZCB2ZXJ5IGVhcmx5LCBNTVUgaXMgb2ZmLCBkZXZpY2UtdHJlZSBpc24ndCB1bmZsYXR0ZW5lZAorICovCitzdGF0aWMgaW50IF9faW5pdCBtcGM4MzJ4X3JkYl9wcm9iZSh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgcm9vdCA9IG9mX2dldF9mbGF0X2R0X3Jvb3QoKTsKKworCXJldHVybiBvZl9mbGF0X2R0X2lzX2NvbXBhdGlibGUocm9vdCwgIk1QQzgzMnhSREIiKTsKK30KKworZGVmaW5lX21hY2hpbmUobXBjODMyeF9yZGIpIHsKKwkubmFtZQkJPSAiTVBDODMyeCBSREIiLAorCS5wcm9iZQkJPSBtcGM4MzJ4X3JkYl9wcm9iZSwKKwkuc2V0dXBfYXJjaAk9IG1wYzgzMnhfcmRiX3NldHVwX2FyY2gsCisJLmluaXRfSVJRCT0gbXBjODMyeF9yZGJfaW5pdF9JUlEsCisJLmdldF9pcnEJPSBpcGljX2dldF9pcnEsCisJLnJlc3RhcnQJPSBtcGM4M3h4X3Jlc3RhcnQsCisJLnRpbWVfaW5pdAk9IG1wYzgzeHhfdGltZV9pbml0LAorCS5jYWxpYnJhdGVfZGVjcgk9IGdlbmVyaWNfY2FsaWJyYXRlX2RlY3IsCisJLnByb2dyZXNzCT0gdWRiZ19wcm9ncmVzcywKK307CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODM0eF9pdHguaCBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzR4X2l0eC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzRjYTRlLi4wMDAwMDAwCi0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzR4X2l0eC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoKLSAqIGFyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzR4X2l0eC5oCi0gKgotICogTVBDODM0WCBJVFggY29tbW9uIGJvYXJkIGRlZmluaXRpb25zCi0gKgotICogTWFpbnRhaW5lcjogS3VtYXIgR2FsYSA8Z2FsYWtAa2VybmVsLmNyYXNoaW5nLm9yZz4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCi0gKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqLwotCi0jaWZuZGVmIF9fTUFDSF9NUEM4M1hYX0lUWF9IX18KLSNkZWZpbmUgX19NQUNIX01QQzgzWFhfSVRYX0hfXwotCi0jZGVmaW5lIFBJUlFBCU1QQzgzeHhfSVJRX0VYVDQKLSNkZWZpbmUgUElSUUIJTVBDODN4eF9JUlFfRVhUNQotI2RlZmluZSBQSVJRQwlNUEM4M3h4X0lSUV9FWFQ2Ci0jZGVmaW5lIFBJUlFECU1QQzgzeHhfSVJRX0VYVDcKLQotI2VuZGlmCQkJCS8qIF9fTUFDSF9NUEM4M1hYX0lUWF9IX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9wY2kuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9wY2kuYwppbmRleCA5YzM2NTA1Li43NzQ0NTdkMCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L3BjaS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9wY2kuYwpAQCAtNjAsNyArNjAsNyBAQAogCWhhc19hZGRyZXNzID0gKG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UoZGV2LCAwLCAmcnNyYykgPT0gMCk7CiAKIAkvKiBHZXQgYnVzIHJhbmdlIGlmIGFueSAqLwotCWJ1c19yYW5nZSA9IGdldF9wcm9wZXJ0eShkZXYsICJidXMtcmFuZ2UiLCAmbGVuKTsKKwlidXNfcmFuZ2UgPSBvZl9nZXRfcHJvcGVydHkoZGV2LCAiYnVzLXJhbmdlIiwgJmxlbik7CiAJaWYgKGJ1c19yYW5nZSA9PSBOVUxMIHx8IGxlbiA8IDIgKiBzaXplb2YoaW50KSkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJDYW4ndCBnZXQgYnVzLXJhbmdlIGZvciAlcywgYXNzdW1lIgogCQkgICAgICAgIiBidXMgMFxuIiwgZGV2LT5mdWxsX25hbWUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L0tjb25maWcgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvS2NvbmZpZwppbmRleCBlNzY0YzBhLi42Mjk5MjZlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvS2NvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvS2NvbmZpZwpAQCAtMSw4ICsxLDYgQEAKLW1lbnUgIlBsYXRmb3JtIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBQUENfODV4eAotCiBjaG9pY2UKIAlwcm9tcHQgIk1hY2hpbmUgVHlwZSIKKwlkZXBlbmRzIG9uIFBQQ184NXh4CiAJZGVmYXVsdCBNUEM4NTQwX0FEUwogCiBjb25maWcgTVBDODU0MF9BRFMKQEAgLTMwLDYgKzI4LDEyIEBACiAJaGVscAogCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgTVBDODV4eCBNRFMgYm9hcmQKIAorY29uZmlnIE1QQzg1NDRfRFMKKwlib29sICJGcmVlc2NhbGUgTVBDODU0NCBEUyIKKwlzZWxlY3QgREVGQVVMVF9VSU1BR0UKKwloZWxwCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBNUEM4NTQ0IERTIGJvYXJkCisKIGVuZGNob2ljZQogCiBjb25maWcgTVBDODU0MApAQCAtNDAsMzMgKzQ0LDE1IEBACiAKIGNvbmZpZyBNUEM4NTYwCiAJYm9vbAotCXNlbGVjdCBQUENfSU5ESVJFQ1RfUENJCisJc2VsZWN0IENQTTIKIAlkZWZhdWx0IHkgaWYgTVBDODU2MF9BRFMKIAogY29uZmlnIE1QQzg1eHgKIAlib29sCiAJc2VsZWN0IFBQQ19VREJHXzE2NTUwCiAJc2VsZWN0IFBQQ19JTkRJUkVDVF9QQ0kKKwlzZWxlY3QgUFBDX0lORElSRUNUX1BDSV9CRQorCXNlbGVjdCBNUElDCiAJc2VsZWN0IFNFUklBTF84MjUwX1NIQVJFX0lSUSBpZiBTRVJJQUxfODI1MAotCWRlZmF1bHQgeSBpZiBNUEM4NTQwX0FEUyB8fCBNUEM4NXh4X0NEUyB8fCBNUEM4NTYwX0FEUyB8fCBNUEM4NXh4X01EUwotCi1jb25maWcgUFBDX0lORElSRUNUX1BDSV9CRQotCWJvb2wKLQlkZXBlbmRzIG9uIFBQQ184NXh4Ci0JZGVmYXVsdCB5Ci0KLWNvbmZpZyBNUElDCi0JYm9vbAotCWRlZmF1bHQgeQotCi1jb25maWcgQ1BNMgotCWJvb2wKLQlkZXBlbmRzIG9uIE1QQzg1NjAKLQlkZWZhdWx0IHkKLQloZWxwCi0JICBUaGUgQ1BNMiAoQ29tbXVuaWNhdGlvbnMgUHJvY2Vzc29yIE1vZHVsZSkgaXMgYSBjb3Byb2Nlc3NvciBvbgotCSAgZW1iZWRkZWQgQ1BVcyBtYWRlIGJ5IE1vdG9yb2xhLiAgU2VsZWN0aW5nIHRoaXMgb3B0aW9uIG1lYW5zIHRoYXQKLQkgIHlvdSB3aXNoIHRvIGJ1aWxkIGEga2VybmVsIGZvciBhIG1hY2hpbmUgd2l0aCBhIENQTTIgY29wcm9jZXNzb3IKLQkgIG9uIGl0LgotCi1lbmRtZW51CisJZGVmYXVsdCB5IGlmIE1QQzg1NDBfQURTIHx8IE1QQzg1eHhfQ0RTIHx8IE1QQzg1NjBfQURTIFwKKwkJfHwgTVBDODV4eF9NRFMgfHwgTVBDODU0NF9EUwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L01ha2VmaWxlCmluZGV4IDRlNjM5MTcuLjRlMDJjYmIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9NYWtlZmlsZQorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvTWFrZWZpbGUKQEAgLTUsNCArNSw1IEBACiBvYmotJChDT05GSUdfTVBDODU0MF9BRFMpICs9IG1wYzg1eHhfYWRzLm8KIG9iai0kKENPTkZJR19NUEM4NTYwX0FEUykgKz0gbXBjODV4eF9hZHMubwogb2JqLSQoQ09ORklHX01QQzg1eHhfQ0RTKSArPSBtcGM4NXh4X2Nkcy5vCitvYmotJChDT05GSUdfTVBDODU0NF9EUykgICs9IG1wYzg1NDRfZHMubwogb2JqLSQoQ09ORklHX01QQzg1eHhfTURTKSArPSBtcGM4NXh4X21kcy5vCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODU0NF9kcy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1NDRfZHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODY3Zjg1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1NDRfZHMuYwpAQCAtMCwwICsxLDE0NCBAQAorLyoKKyAqIE1QQzg1NDQgRFMgQm9hcmQgU2V0dXAKKyAqCisgKiBBdXRob3IgWGlhbmdodWEgWGlhbyAoeC54aWFvQGZyZWVzY2FsZS5jb20pCisgKiBDb3B5cmlnaHQgMjAwNyBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgva2Rldl90Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS90aW1lLmg+CisjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KKyNpbmNsdWRlIDxhc20vbXBjODV4eC5oPgorI2luY2x1ZGUgPG1tL21tdV9kZWNsLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNpbmNsdWRlIDxhc20vdWRiZy5oPgorI2luY2x1ZGUgPGFzbS9tcGljLmg+CisjaW5jbHVkZSA8YXNtL2k4MjU5Lmg+CisKKyNpbmNsdWRlIDxzeXNkZXYvZnNsX3NvYy5oPgorI2luY2x1ZGUgIm1wYzg1eHguaCIKKworI3VuZGVmIERFQlVHCisKKyNpZmRlZiBERUJVRworI2RlZmluZSBEQkcoZm10LCBhcmdzLi4uKSBwcmludGsoS0VSTl9FUlIgIiVzOiAiIGZtdCwgX19GVU5DVElPTl9fLCAjIyBhcmdzKQorI2Vsc2UKKyNkZWZpbmUgREJHKGZtdCwgYXJncy4uLikKKyNlbmRpZgorCisKK3ZvaWQgX19pbml0IG1wYzg1NDRfZHNfcGljX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgbXBpYyAqbXBpYzsKKwlzdHJ1Y3QgcmVzb3VyY2UgcjsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gTlVMTDsKKyNpZmRlZiBDT05GSUdfUFBDX0k4MjU5CisJc3RydWN0IGRldmljZV9ub2RlICpjYXNjYWRlX25vZGUgPSBOVUxMOworCWludCBjYXNjYWRlX2lycTsKKyNlbmRpZgorCisJbnAgPSBvZl9maW5kX25vZGVfYnlfdHlwZShucCwgIm9wZW4tcGljIik7CisKKwlpZiAobnAgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIkNvdWxkIG5vdCBmaW5kIG9wZW4tcGljIG5vZGVcbiIpOworCQlyZXR1cm47CisJfQorCisJaWYgKG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UobnAsIDAsICZyKSkgeworCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byBtYXAgbXBpYyByZWdpc3RlciBzcGFjZVxuIik7CisJCW9mX25vZGVfcHV0KG5wKTsKKwkJcmV0dXJuOworCX0KKworCS8qIEFsbG9jIG1waWMgc3RydWN0dXJlIGFuZCBwZXIgaXN1IGhhcyAxNiBJTlQgZW50cmllcy4gKi8KKwltcGljID0gbXBpY19hbGxvYyhucCwgci5zdGFydCwKKwkJCSAgTVBJQ19QUklNQVJZIHwgTVBJQ19XQU5UU19SRVNFVCB8IE1QSUNfQklHX0VORElBTiwKKwkJCSAgMTYsIDY0LCAiIE9QRU5QSUMgICAgICIpOworCUJVR19PTihtcGljID09IE5VTEwpOworCisJLyoKKwkgKiA0OCBJbnRlcm5hbCBJbnRlcnJ1cHRzCisJICovCisJbXBpY19hc3NpZ25faXN1KG1waWMsIDAsIHIuc3RhcnQgKyAweDEwMjAwKTsKKwltcGljX2Fzc2lnbl9pc3UobXBpYywgMSwgci5zdGFydCArIDB4MTA0MDApOworCW1waWNfYXNzaWduX2lzdShtcGljLCAyLCByLnN0YXJ0ICsgMHgxMDYwMCk7CisKKwkvKgorCSAqIDE2IEV4dGVybmFsIGludGVycnVwdHMKKwkgKi8KKwltcGljX2Fzc2lnbl9pc3UobXBpYywgMywgci5zdGFydCArIDB4MTAwMDApOworCisJbXBpY19pbml0KG1waWMpOworCisjaWZkZWYgQ09ORklHX1BQQ19JODI1OQorCS8qIEluaXRpYWxpemUgdGhlIGk4MjU5IGNvbnRyb2xsZXIgKi8KKwlmb3JfZWFjaF9ub2RlX2J5X3R5cGUobnAsICJpbnRlcnJ1cHQtY29udHJvbGxlciIpCisJICAgIGlmIChkZXZpY2VfaXNfY29tcGF0aWJsZShucCwgImNocnAsaWljIikpIHsKKwkJY2FzY2FkZV9ub2RlID0gbnA7CisJCWJyZWFrOworCX0KKworCWlmIChjYXNjYWRlX25vZGUgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiQ291bGQgbm90IGZpbmQgaTgyNTkgUElDXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWNhc2NhZGVfaXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAoY2FzY2FkZV9ub2RlLCAwKTsKKwlpZiAoY2FzY2FkZV9pcnEgPT0gTk9fSVJRKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIG1hcCBjYXNjYWRlIGludGVycnVwdFxuIik7CisJCXJldHVybjsKKwl9CisKKwlEQkcoIm1wYzg1NDRkczogY2FzY2FkZSBtYXBwZWQgdG8gaXJxICVkXG4iLCBjYXNjYWRlX2lycSk7CisKKwlpODI1OV9pbml0KGNhc2NhZGVfbm9kZSwgMCk7CisJb2Zfbm9kZV9wdXQoY2FzY2FkZV9ub2RlKTsKKworCXNldF9pcnFfY2hhaW5lZF9oYW5kbGVyKGNhc2NhZGVfaXJxLCBtcGM4NTQ0XzgyNTlfY2FzY2FkZSk7CisjZW5kaWYJLyogQ09ORklHX1BQQ19JODI1OSAqLworfQorCisKKy8qCisgKiBTZXR1cCB0aGUgYXJjaGl0ZWN0dXJlCisgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBtcGM4NTQ0X2RzX3NldHVwX2FyY2godm9pZCkKK3sKKwlpZiAocHBjX21kLnByb2dyZXNzKQorCQlwcGNfbWQucHJvZ3Jlc3MoIm1wYzg1NDRfZHNfc2V0dXBfYXJjaCgpIiwgMCk7CisKKwlwcmludGsoIk1QQzg1NDQgRFMgYm9hcmQgZnJvbSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvclxuIik7Cit9CisKKworLyoKKyAqIENhbGxlZCB2ZXJ5IGVhcmx5LCBkZXZpY2UtdHJlZSBpc24ndCB1bmZsYXR0ZW5lZAorICovCitzdGF0aWMgaW50IF9faW5pdCBtcGM4NTQ0X2RzX3Byb2JlKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyByb290ID0gb2ZfZ2V0X2ZsYXRfZHRfcm9vdCgpOworCisJcmV0dXJuIG9mX2ZsYXRfZHRfaXNfY29tcGF0aWJsZShyb290LCAiTVBDODU0NERTIik7Cit9CisKK2RlZmluZV9tYWNoaW5lKG1wYzg1NDRfZHMpIHsKKwkubmFtZQkJCT0gIk1QQzg1NDQgRFMiLAorCS5wcm9iZQkJCT0gbXBjODU0NF9kc19wcm9iZSwKKwkuc2V0dXBfYXJjaAkJPSBtcGM4NTQ0X2RzX3NldHVwX2FyY2gsCisJLmluaXRfSVJRCQk9IG1wYzg1NDRfZHNfcGljX2luaXQsCisJLmdldF9pcnEJCT0gbXBpY19nZXRfaXJxLAorCS5yZXN0YXJ0CQk9IG1wYzg1eHhfcmVzdGFydCwKKwkuY2FsaWJyYXRlX2RlY3IJCT0gZ2VuZXJpY19jYWxpYnJhdGVfZGVjciwKKwkucHJvZ3Jlc3MJCT0gdWRiZ19wcm9ncmVzcywKK307CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9hZHMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X2Fkcy5jCmluZGV4IDhlZDAzNGEuLjVkMjc2MjEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X2Fkcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X2Fkcy5jCkBAIC0yMjcsNyArMjI3LDcgQEAKIAlpZiAoY3B1ICE9IDApIHsKIAkJY29uc3QgdW5zaWduZWQgaW50ICpmcDsKIAotCQlmcCA9IGdldF9wcm9wZXJ0eShjcHUsICJjbG9jay1mcmVxdWVuY3kiLCBOVUxMKTsKKwkJZnAgPSBvZl9nZXRfcHJvcGVydHkoY3B1LCAiY2xvY2stZnJlcXVlbmN5IiwgTlVMTCk7CiAJCWlmIChmcCAhPSAwKQogCQkJbG9vcHNfcGVyX2ppZmZ5ID0gKmZwIC8gSFo7CiAJCWVsc2UKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X2Nkcy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHhfY2RzLmMKaW5kZXggNDIzMjY4Ni4uN2U3MTYzNiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHhfY2RzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHhfY2RzLmMKQEAgLTIzNyw3ICsyMzcsNyBAQAogCWlmIChjcHUgIT0gMCkgewogCQljb25zdCB1bnNpZ25lZCBpbnQgKmZwOwogCi0JCWZwID0gZ2V0X3Byb3BlcnR5KGNwdSwgImNsb2NrLWZyZXF1ZW5jeSIsIE5VTEwpOworCQlmcCA9IG9mX2dldF9wcm9wZXJ0eShjcHUsICJjbG9jay1mcmVxdWVuY3kiLCBOVUxMKTsKIAkJaWYgKGZwICE9IDApCiAJCQlsb29wc19wZXJfamlmZnkgPSAqZnAgLyBIWjsKIAkJZWxzZQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHhfbWRzLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9tZHMuYwppbmRleCA4MTE0NGQyLi41NGRiNDE2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9tZHMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9tZHMuYwpAQCAtODAsNyArODAsNyBAQAogCW5wID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUoTlVMTCwgImNwdSIpOwogCWlmIChucCAhPSBOVUxMKSB7CiAJCWNvbnN0IHVuc2lnbmVkIGludCAqZnAgPQotCQkgICAgZ2V0X3Byb3BlcnR5KG5wLCAiY2xvY2stZnJlcXVlbmN5IiwgTlVMTCk7CisJCSAgICBvZl9nZXRfcHJvcGVydHkobnAsICJjbG9jay1mcmVxdWVuY3kiLCBOVUxMKTsKIAkJaWYgKGZwICE9IE5VTEwpCiAJCQlsb29wc19wZXJfamlmZnkgPSAqZnAgLyBIWjsKIAkJZWxzZQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3BjaS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3BjaS5jCmluZGV4IDA1OTMwZWUuLjQ4ZjE3ZTIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9wY2kuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvcGNpLmMKQEAgLTUxLDcgKzUxLDcgQEAKIAloYXNfYWRkcmVzcyA9IChvZl9hZGRyZXNzX3RvX3Jlc291cmNlKGRldiwgMCwgJnJzcmMpID09IDApOwogCiAJLyogR2V0IGJ1cyByYW5nZSBpZiBhbnkgKi8KLQlidXNfcmFuZ2UgPSBnZXRfcHJvcGVydHkoZGV2LCAiYnVzLXJhbmdlIiwgJmxlbik7CisJYnVzX3JhbmdlID0gb2ZfZ2V0X3Byb3BlcnR5KGRldiwgImJ1cy1yYW5nZSIsICZsZW4pOwogCWlmIChidXNfcmFuZ2UgPT0gTlVMTCB8fCBsZW4gPCAyICogc2l6ZW9mKGludCkpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiQ2FuJ3QgZ2V0IGJ1cy1yYW5nZSBmb3IgJXMsIGFzc3VtZSIKIAkJICAgICAgICIgYnVzIDBcbiIsIGRldi0+ZnVsbF9uYW1lKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9LY29uZmlnIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L0tjb25maWcKaW5kZXggMGM3MDk0NC4uZDFiY2ZmNSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L0tjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L0tjb25maWcKQEAgLTEsOCArMSw2IEBACi1tZW51ICJQbGF0Zm9ybSBTdXBwb3J0IgotCWRlcGVuZHMgb24gUFBDXzg2eHgKLQogY2hvaWNlCiAJcHJvbXB0ICJNYWNoaW5lIFR5cGUiCisJZGVwZW5kcyBvbiBQUENfODZ4eAogCWRlZmF1bHQgTVBDODY0MV9IUENOCiAKIGNvbmZpZyBNUEM4NjQxX0hQQ04KQEAgLTE0LDIwICsxMiwxMCBAQAogCiBlbmRjaG9pY2UKIAotCiBjb25maWcgTVBDODY0MQogCWJvb2wKIAlzZWxlY3QgUFBDX0lORElSRUNUX1BDSQorCXNlbGVjdCBQUENfSU5ESVJFQ1RfUENJX0JFCiAJc2VsZWN0IFBQQ19VREJHXzE2NTUwCisJc2VsZWN0IE1QSUMKIAlkZWZhdWx0IHkgaWYgTVBDODY0MV9IUENOCi0KLWNvbmZpZyBNUElDCi0JYm9vbAotCWRlZmF1bHQgeQotCi1jb25maWcgUFBDX0lORElSRUNUX1BDSV9CRQotCWJvb2wKLQlkZXBlbmRzIG9uIFBQQ184Nnh4Ci0JZGVmYXVsdCB5Ci0KLWVuZG1lbnUKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9NYWtlZmlsZQppbmRleCA0NzZhNmVlLi40MThmZDhmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg2eHgvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L01ha2VmaWxlCkBAIC00LDQgKzQsNCBAQAogCiBvYmotJChDT05GSUdfU01QKQkJKz0gbXBjODZ4eF9zbXAubwogb2JqLSQoQ09ORklHX01QQzg2NDFfSFBDTikJKz0gbXBjODZ4eF9ocGNuLm8KLW9iai0kKENPTkZJR19QQ0kpCQkrPSBwY2kubyBtcGM4Nnh4X3BjaWUubworb2JqLSQoQ09ORklHX1BDSSkJCSs9IHBjaS5vCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg2eHgvbXBjODZ4eF9ocGNuLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg2eHgvbXBjODZ4eF9ocGNuLmMKaW5kZXggZjQyZjgwMS4uM2QzZDk4ZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L21wYzg2eHhfaHBjbi5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9tcGM4Nnh4X2hwY24uYwpAQCAtMzQ5LDcgKzM0OSw3IEBACiAJaWYgKG5wICE9IDApIHsKIAkJY29uc3QgdW5zaWduZWQgaW50ICpmcDsKIAotCQlmcCA9IGdldF9wcm9wZXJ0eShucCwgImNsb2NrLWZyZXF1ZW5jeSIsIE5VTEwpOworCQlmcCA9IG9mX2dldF9wcm9wZXJ0eShucCwgImNsb2NrLWZyZXF1ZW5jeSIsIE5VTEwpOwogCQlpZiAoZnAgIT0gMCkKIAkJCWxvb3BzX3Blcl9qaWZmeSA9ICpmcCAvIEhaOwogCQllbHNlCkBAIC0zODQsNyArMzg0LDcgQEAKIAogCXJvb3QgPSBvZl9maW5kX25vZGVfYnlfcGF0aCgiLyIpOwogCWlmIChyb290KQotCQltb2RlbCA9IGdldF9wcm9wZXJ0eShyb290LCAibW9kZWwiLCBOVUxMKTsKKwkJbW9kZWwgPSBvZl9nZXRfcHJvcGVydHkocm9vdCwgIm1vZGVsIiwgTlVMTCk7CiAJc2VxX3ByaW50ZihtLCAiTWFjaGluZVx0XHQ6ICVzXG4iLCBtb2RlbCk7CiAJb2Zfbm9kZV9wdXQocm9vdCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9wY2kuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9wY2kuYwppbmRleCA0ODFlMThlLi44MjM1YzU2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg2eHgvcGNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L3BjaS5jCkBAIC0yMiw5ICsyMiw5IEBACiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9wcm9tLmg+Ci0jaW5jbHVkZSA8YXNtL2ltbWFwXzg2eHguaD4KICNpbmNsdWRlIDxhc20vcGNpLWJyaWRnZS5oPgogI2luY2x1ZGUgPHN5c2Rldi9mc2xfc29jLmg+CisjaW5jbHVkZSA8c3lzZGV2L2ZzbF9wY2llLmg+CiAKICNpbmNsdWRlICJtcGM4Nnh4LmgiCiAKQEAgLTE2Myw3ICsxNjMsNyBAQAogCWhhc19hZGRyZXNzID0gKG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UoZGV2LCAwLCAmcnNyYykgPT0gMCk7CiAKIAkvKiBHZXQgYnVzIHJhbmdlIGlmIGFueSAqLwotCWJ1c19yYW5nZSA9IGdldF9wcm9wZXJ0eShkZXYsICJidXMtcmFuZ2UiLCAmbGVuKTsKKwlidXNfcmFuZ2UgPSBvZl9nZXRfcHJvcGVydHkoZGV2LCAiYnVzLXJhbmdlIiwgJmxlbik7CiAJaWYgKGJ1c19yYW5nZSA9PSBOVUxMIHx8IGxlbiA8IDIgKiBzaXplb2YoaW50KSkKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiQ2FuJ3QgZ2V0IGJ1cy1yYW5nZSBmb3IgJXMsIGFzc3VtZSIKIAkJICAgICAgICIgYnVzIDBcbiIsIGRldi0+ZnVsbF9uYW1lKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvOHh4L0tjb25maWcgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzh4eC9LY29uZmlnCmluZGV4IGJlZWE2ODMuLjM5YmI4YzUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvOHh4L0tjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84eHgvS2NvbmZpZwpAQCAtMSw2ICsxLDMgQEAKLW1lbnUgIlBsYXRmb3JtIHN1cHBvcnQiCi0gICAgICAgIGRlcGVuZHMgb24gUFBDXzh4eAotCiBjb25maWcgRkFEUwogCWJvb2wKIApAQCAtOSw2ICs2LDcgQEAKIAogY2hvaWNlCiAJcHJvbXB0ICI4eHggTWFjaGluZSBUeXBlIgorCWRlcGVuZHMgb24gUFBDXzh4eAogCWRlcGVuZHMgb24gOHh4CiAJZGVmYXVsdCBNUEM4ODVBRFMKIApAQCAtMzYsMzggKzM0LDM2IEBACiBlbmRjaG9pY2UKIAogbWVudSAiRnJlZXNjYWxlIEV0aGVybmV0IGRyaXZlciBwbGF0Zm9ybS1zcGVjaWZpYyBvcHRpb25zIgotICAgICAgICBkZXBlbmRzIG9uIChGU19FTkVUICYmIE1QQzg4NUFEUykKKwlkZXBlbmRzIG9uIChGU19FTkVUICYmIE1QQzg4NUFEUykKIAotICAgICAgICBjb25maWcgTVBDOHh4X1NFQ09ORF9FVEgKLSAgICAgICAgYm9vbCAiU2Vjb25kIEV0aGVybmV0IGNoYW5uZWwiCi0gICAgICAgIGRlcGVuZHMgb24gTVBDODg1QURTCi0gICAgICAgIGRlZmF1bHQgeQotICAgICAgICBoZWxwCi0gICAgICAgICAgVGhpcyBlbmFibGVzIHN1cHBvcnQgZm9yIHNlY29uZCBFdGhlcm5ldCBvbiBNUEM4ODVBRFMgYW5kIE1QQzg2eEFEUyBib2FyZHMuCi0gICAgICAgICAgVGhlIGxhdHRlciB3aWxsIHVzZSBTQ0MxLCBmb3IgODg1QURTIHlvdSBjYW4gc2VsZWN0IGl0IGJlbG93LgorCWNvbmZpZyBNUEM4eHhfU0VDT05EX0VUSAorCWJvb2wgIlNlY29uZCBFdGhlcm5ldCBjaGFubmVsIgorCWRlcGVuZHMgb24gTVBDODg1QURTCisJZGVmYXVsdCB5CisJaGVscAorCSAgVGhpcyBlbmFibGVzIHN1cHBvcnQgZm9yIHNlY29uZCBFdGhlcm5ldCBvbiBNUEM4ODVBRFMgYW5kIE1QQzg2eEFEUyBib2FyZHMuCisJICBUaGUgbGF0dGVyIHdpbGwgdXNlIFNDQzEsIGZvciA4ODVBRFMgeW91IGNhbiBzZWxlY3QgaXQgYmVsb3cuCiAKLSAgICAgICAgY2hvaWNlCi0gICAgICAgICAgICAgICAgcHJvbXB0ICJTZWNvbmQgRXRoZXJuZXQgY2hhbm5lbCIKLSAgICAgICAgICAgICAgICBkZXBlbmRzIG9uIE1QQzh4eF9TRUNPTkRfRVRICi0gICAgICAgICAgICAgICAgZGVmYXVsdCBNUEM4eHhfU0VDT05EX0VUSF9GRUMyCisJY2hvaWNlCisJCXByb21wdCAiU2Vjb25kIEV0aGVybmV0IGNoYW5uZWwiCisJCWRlcGVuZHMgb24gTVBDOHh4X1NFQ09ORF9FVEgKKwkJZGVmYXVsdCBNUEM4eHhfU0VDT05EX0VUSF9GRUMyCiAKLSAgICAgICAgICAgICAgICBjb25maWcgTVBDOHh4X1NFQ09ORF9FVEhfRkVDMgotICAgICAgICAgICAgICAgIGJvb2wgIkZFQzIiCi0gICAgICAgICAgICAgICAgZGVwZW5kcyBvbiBNUEM4ODVBRFMKLSAgICAgICAgICAgICAgICBoZWxwCi0gICAgICAgICAgICAgICAgICBFbmFibGUgRkVDMiB0byBzZXJ2ZSBhcyAyLW5kIEV0aGVybmV0IGNoYW5uZWwuIE5vdGUgdGhhdCBTTUMyCi0gICAgICAgICAgICAgICAgICAob2Z0ZW4gMi1uZCBVQVJUKSB3aWxsIG5vdCB3b3JrIGlmIHRoaXMgaXMgZW5hYmxlZC4KKwkJY29uZmlnIE1QQzh4eF9TRUNPTkRfRVRIX0ZFQzIKKwkJYm9vbCAiRkVDMiIKKwkJZGVwZW5kcyBvbiBNUEM4ODVBRFMKKwkJaGVscAorCQkgIEVuYWJsZSBGRUMyIHRvIHNlcnZlIGFzIDItbmQgRXRoZXJuZXQgY2hhbm5lbC4gTm90ZSB0aGF0IFNNQzIKKwkJICAob2Z0ZW4gMi1uZCBVQVJUKSB3aWxsIG5vdCB3b3JrIGlmIHRoaXMgaXMgZW5hYmxlZC4KIAotICAgICAgICAgICAgICAgIGNvbmZpZyBNUEM4eHhfU0VDT05EX0VUSF9TQ0MzCi0gICAgICAgICAgICAgICAgYm9vbCAiU0NDMyIKLSAgICAgICAgICAgICAgICBkZXBlbmRzIG9uIE1QQzg4NUFEUwotICAgICAgICAgICAgICAgIGhlbHAKLSAgICAgICAgICAgICAgICAgIEVuYWJsZSBTQ0MzIHRvIHNlcnZlIGFzIDItbmQgRXRoZXJuZXQgY2hhbm5lbC4gTm90ZSB0aGF0IFNNQzEKLSAgICAgICAgICAgICAgICAgIChvZnRlbiAxLW5kIFVBUlQpIHdpbGwgbm90IHdvcmsgaWYgdGhpcyBpcyBlbmFibGVkLgorCQljb25maWcgTVBDOHh4X1NFQ09ORF9FVEhfU0NDMworCQlib29sICJTQ0MzIgorCQlkZXBlbmRzIG9uIE1QQzg4NUFEUworCQloZWxwCisJCSAgRW5hYmxlIFNDQzMgdG8gc2VydmUgYXMgMi1uZCBFdGhlcm5ldCBjaGFubmVsLiBOb3RlIHRoYXQgU01DMQorCQkgIChvZnRlbiAxLW5kIFVBUlQpIHdpbGwgbm90IHdvcmsgaWYgdGhpcyBpcyBlbmFibGVkLgogCi0gICAgICAgIGVuZGNob2ljZQotCi1lbmRtZW51CisJZW5kY2hvaWNlCiAKIGVuZG1lbnUKIApAQCAtOTgsNyArOTQsNyBAQAogCSAgcmVxdWlyZSB3b3JrYXJvdW5kcyBmb3IgTGludXggKGFuZCBtb3N0IG90aGVyIE9TZXMgdG8gd29yaykuICBJZiB5b3UKIAkgIGdldCBhIEJVRygpIHZlcnkgZWFybHkgaW4gYm9vdCwgdGhpcyBtaWdodCBmaXggdGhlIHByb2JsZW0uICBGb3IKIAkgIG1vcmUgZGV0YWlscyByZWFkIHRoZSBkb2N1bWVudCBlbnRpdGxlZCAiTVBDODYwIEZhbWlseSBEZXZpY2UgRXJyYXRhCi0JICBSZWZlcmVuY2UiIG9uIE1vdG9yb2xhJ3Mgd2Vic2l0ZS4gIFRoaXMgb3B0aW9uIGFsc28gaW5jdXJzIGEKKwkgIFJlZmVyZW5jZSIgb24gRnJlZXNjYWxlJ3Mgd2Vic2l0ZS4gIFRoaXMgb3B0aW9uIGFsc28gaW5jdXJzIGEKIAkgIHBlcmZvcm1hbmNlIGhpdC4KIAogCSAgSWYgaW4gZG91YnQsIHNheSBOIGhlcmUuCkBAIC0xMzUsNCArMTMxLDMgQEAKIAlkZXBlbmRzIG9uICFOT19VQ09ERV9QQVRDSAogCiBlbmRtZW51Ci0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvOHh4L204eHhfc2V0dXAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvOHh4L204eHhfc2V0dXAuYwppbmRleCA5ZWQ3MTI1Li4wOTAxZGJhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzh4eC9tOHh4X3NldHVwLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84eHgvbTh4eF9zZXR1cC5jCkBAIC04NSwxNyArODUsMTcgQEAKIHN0YXRpYyBpbnQgX19pbml0IGdldF9mcmVxKGNoYXIgKm5hbWUsIHVuc2lnbmVkIGxvbmcgKnZhbCkKIHsKICAgICAgICAgc3RydWN0IGRldmljZV9ub2RlICpjcHU7Ci0gICAgICAgIHVuc2lnbmVkIGludCAqZnA7CisgICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCAqZnA7CiAgICAgICAgIGludCBmb3VuZCA9IDA7CiAKICAgICAgICAgLyogVGhlIGNwdSBub2RlIHNob3VsZCBoYXZlIHRpbWViYXNlIGFuZCBjbG9jayBmcmVxdWVuY3kgcHJvcGVydGllcyAqLwogICAgICAgICBjcHUgPSBvZl9maW5kX25vZGVfYnlfdHlwZShOVUxMLCAiY3B1Iik7CiAKICAgICAgICAgaWYgKGNwdSkgewotICAgICAgICAgICAgICAgIGZwID0gKHVuc2lnbmVkIGludCAqKWdldF9wcm9wZXJ0eShjcHUsIG5hbWUsIE5VTEwpOworICAgICAgICAgICAgICAgIGZwID0gb2ZfZ2V0X3Byb3BlcnR5KGNwdSwgbmFtZSwgTlVMTCk7CiAgICAgICAgICAgICAgICAgaWYgKGZwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqdmFsID0gKmZwKys7CisgICAgICAgICAgICAgICAgICAgICAgICAqdmFsID0gKmZwOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIG9mX25vZGVfcHV0KGNwdSk7CkBAIC0yNjIsNyArMjYyLDcgQEAKIAogCXJvb3QgPSBvZl9maW5kX25vZGVfYnlfcGF0aCgiLyIpOwogCWlmIChyb290KQotCQltb2RlbCA9IGdldF9wcm9wZXJ0eShyb290LCAibW9kZWwiLCBOVUxMKTsKKwkJbW9kZWwgPSBvZl9nZXRfcHJvcGVydHkocm9vdCwgIm1vZGVsIiwgTlVMTCk7CiAJc2VxX3ByaW50ZihtLCAiTWFjaGluZVx0XHQ6ICVzXG4iLCBtb2RlbCk7CiAJb2Zfbm9kZV9wdXQocm9vdCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvOHh4L21wYzg2eGFkcy5oIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84eHgvbXBjODZ4YWRzLmgKaW5kZXggYjVkMTlkZC4uNTliYWQyZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84eHgvbXBjODZ4YWRzLmgKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84eHgvbXBjODZ4YWRzLmgKQEAgLTM3LDcgKzM3LDcgQEAKICNkZWZpbmUgQ1BNX01BUF9BRERSCQkoZ2V0X2ltbXJiYXNlKCkgKyBNUEM4eHhfQ1BNX09GRlNFVCkKICNkZWZpbmUgQ1BNX0lSUV9PRkZTRVQJCTE2ICAgICAvLyBmb3IgY29tcGFiaWxpdHkgd2l0aCBjcG1fdWFydCBkcml2ZXIKIAotI2RlZmluZSBQQ01DSUFfTUVNX0FERFIJCSh1aW50KTB4ZmYwMjAwMDApCisjZGVmaW5lIFBDTUNJQV9NRU1fQUREUgkJKCh1aW50KTB4ZmYwMjAwMDApCiAjZGVmaW5lIFBDTUNJQV9NRU1fU0laRQkJKCh1aW50KSg2NCAqIDEwMjQpKQogCiAvKiBCaXRzIG9mIGludGVyZXN0IGluIHRoZSBCQ1NScy4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvOHh4L21wYzg2eGFkc19zZXR1cC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84eHgvbXBjODZ4YWRzX3NldHVwLmMKaW5kZXggZWY1MmNlNy4uYTM1MzE1YSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84eHgvbXBjODZ4YWRzX3NldHVwLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84eHgvbXBjODZ4YWRzX3NldHVwLmMKQEAgLTI0Nyw3ICsyNDcsNyBAQAogCX0KIH0KIAotaW50IHBsYXRmb3JtX2RldmljZV9za2lwKGNoYXIgKm1vZGVsLCBpbnQgaWQpCitpbnQgcGxhdGZvcm1fZGV2aWNlX3NraXAoY29uc3QgY2hhciAqbW9kZWwsIGludCBpZCkKIHsKIAlyZXR1cm4gMDsKIH0KQEAgLTI2MCw3ICsyNjAsNyBAQAogCWlmIChjcHUgIT0gMCkgewogCQljb25zdCB1bnNpZ25lZCBpbnQgKmZwOwogCi0JCWZwID0gZ2V0X3Byb3BlcnR5KGNwdSwgImNsb2NrLWZyZXF1ZW5jeSIsIE5VTEwpOworCQlmcCA9IG9mX2dldF9wcm9wZXJ0eShjcHUsICJjbG9jay1mcmVxdWVuY3kiLCBOVUxMKTsKIAkJaWYgKGZwICE9IDApCiAJCQlsb29wc19wZXJfamlmZnkgPSAqZnAgLyBIWjsKIAkJZWxzZQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84eHgvbXBjODg1YWRzLmggYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzh4eC9tcGM4ODVhZHMuaAppbmRleCAzMGNiZWJmLi43YzMxYWVjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzh4eC9tcGM4ODVhZHMuaAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzh4eC9tcGM4ODVhZHMuaApAQCAtMzcsNyArMzcsNyBAQAogI2RlZmluZSBDUE1fTUFQX0FERFIJCShnZXRfaW1tcmJhc2UoKSArIE1QQzh4eF9DUE1fT0ZGU0VUKQogI2RlZmluZSBDUE1fSVJRX09GRlNFVAkJMTYgICAgIC8vIGZvciBjb21wYWJpbGl0eSB3aXRoIGNwbV91YXJ0IGRyaXZlcgogCi0jZGVmaW5lIFBDTUNJQV9NRU1fQUREUgkJKHVpbnQpMHhmZjAyMDAwMCkKKyNkZWZpbmUgUENNQ0lBX01FTV9BRERSCQkoKHVpbnQpMHhmZjAyMDAwMCkKICNkZWZpbmUgUENNQ0lBX01FTV9TSVpFCQkoKHVpbnQpKDY0ICogMTAyNCkpCiAKIC8qIEJpdHMgb2YgaW50ZXJlc3QgaW4gdGhlIEJDU1JzLgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84eHgvbXBjODg1YWRzX3NldHVwLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzh4eC9tcGM4ODVhZHNfc2V0dXAuYwppbmRleCBjNWZlZmRmNi4uYTU3YjU3NyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84eHgvbXBjODg1YWRzX3NldHVwLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84eHgvbXBjODg1YWRzX3NldHVwLmMKQEAgLTMyMiw3ICszMjIsNyBAQAogCX0KIH0KIAotaW50IHBsYXRmb3JtX2RldmljZV9za2lwKGNoYXIgKm1vZGVsLCBpbnQgaWQpCitpbnQgcGxhdGZvcm1fZGV2aWNlX3NraXAoY29uc3QgY2hhciAqbW9kZWwsIGludCBpZCkKIHsKICNpZmRlZiBDT05GSUdfTVBDOHh4X1NFQ09ORF9FVEhfU0NDMwogCWNvbnN0IGNoYXIgKmRldiA9ICJGRUMiOwpAQCAtMzQ2LDcgKzM0Niw3IEBACiAJaWYgKGNwdSAhPSAwKSB7CiAJCWNvbnN0IHVuc2lnbmVkIGludCAqZnA7CiAKLQkJZnAgPSBnZXRfcHJvcGVydHkoY3B1LCAiY2xvY2stZnJlcXVlbmN5IiwgTlVMTCk7CisJCWZwID0gb2ZfZ2V0X3Byb3BlcnR5KGNwdSwgImNsb2NrLWZyZXF1ZW5jeSIsIE5VTEwpOwogCQlpZiAoZnAgIT0gMCkKIAkJCWxvb3BzX3Blcl9qaWZmeSA9ICpmcCAvIEhaOwogCQllbHNlCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL0tjb25maWcgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFlMzMzNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvS2NvbmZpZwpAQCAtMCwwICsxLDI1OSBAQAorbWVudSAiUGxhdGZvcm0gc3VwcG9ydCIKKworY2hvaWNlCisJcHJvbXB0ICJNYWNoaW5lIHR5cGUiCisJZGVwZW5kcyBvbiBQUEM2NCB8fCBDTEFTU0lDMzIKKwlkZWZhdWx0IFBQQ19NVUxUSVBMQVRGT1JNCisKK2NvbmZpZyBQUENfTVVMVElQTEFURk9STQorCWJvb2wgIkdlbmVyaWMgZGVza3RvcC9zZXJ2ZXIvbGFwdG9wIgorCWhlbHAKKwkgIFNlbGVjdCB0aGlzIG9wdGlvbiBpZiBjb25maWd1cmluZyBmb3IgYW4gSUJNIHBTZXJpZXMgb3IKKwkgIFJTLzYwMDAgbWFjaGluZSwgYW4gQXBwbGUgbWFjaGluZSwgb3IgYSBQUmVQLCBDSFJQLAorCSAgTWFwbGUgb3IgQ2VsbC1iYXNlZCBtYWNoaW5lLgorCitjb25maWcgRU1CRURERUQ2eHgKKwlib29sICJFbWJlZGRlZCA2eHgvN3h4Lzd4eHgtYmFzZWQgYm9hcmQiCisJZGVwZW5kcyBvbiBQUEMzMiAmJiAoQlJPS0VOfHxCUk9LRU5fT05fU01QKQorCitjb25maWcgQVBVUworCWJvb2wgIkFtaWdhLUFQVVMiCisJZGVwZW5kcyBvbiBQUEMzMiAmJiBCUk9LRU4KKwloZWxwCisJICBTZWxlY3QgQVBVUyBpZiBjb25maWd1cmluZyBmb3IgYSBQb3dlclVQIEFtaWdhLgorCSAgTW9yZSBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUgYXQ6CisJICA8aHR0cDovL2xpbnV4LWFwdXMuc291cmNlZm9yZ2UubmV0Lz4uCitlbmRjaG9pY2UKKworc291cmNlICJhcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvS2NvbmZpZyIKK3NvdXJjZSAiYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL0tjb25maWciCitzb3VyY2UgImFyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2hycC9LY29uZmlnIgorc291cmNlICJhcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvS2NvbmZpZyIKK3NvdXJjZSAiYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9LY29uZmlnIgorc291cmNlICJhcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3ByZXAvS2NvbmZpZyIKK3NvdXJjZSAiYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9tYXBsZS9LY29uZmlnIgorc291cmNlICJhcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9LY29uZmlnIgorc291cmNlICJhcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGxlYi9LY29uZmlnIgorc291cmNlICJhcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9LY29uZmlnIgorc291cmNlICJhcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvS2NvbmZpZyIKK3NvdXJjZSAiYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84eHgvS2NvbmZpZyIKK3NvdXJjZSAiYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Mnh4L0tjb25maWciCitzb3VyY2UgImFyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9LY29uZmlnIgorc291cmNlICJhcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvS2NvbmZpZyIKK3NvdXJjZSAiYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L0tjb25maWciCitzb3VyY2UgImFyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvS2NvbmZpZyIKKyNzb3VyY2UgImFyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNHh4L0tjb25maWcKKworY29uZmlnIFBQQ19OQVRJVkUKKwlib29sCisJZGVwZW5kcyBvbiBQUENfTVVMVElQTEFURk9STQorCWhlbHAKKwkgIFN1cHBvcnQgZm9yIHJ1bm5pbmcgbmF0aXZlbHkgb24gdGhlIGhhcmR3YXJlLCBpLmUuIHdpdGhvdXQKKwkgIGEgaHlwZXJ2aXNvci4gVGhpcyBvcHRpb24gaXMgbm90IHVzZXItc2VsZWN0YWJsZSBidXQgc2hvdWxkCisJICBiZSBzZWxlY3RlZCBieSBhbGwgcGxhdGZvcm1zIHRoYXQgbmVlZCBpdC4KKworY29uZmlnIFVEQkdfUlRBU19DT05TT0xFCisJYm9vbCAiUlRBUyBiYXNlZCBkZWJ1ZyBjb25zb2xlIgorCWRlcGVuZHMgb24gUFBDX1JUQVMKKwlkZWZhdWx0IG4KKworY29uZmlnIFBQQ19VREJHX0JFQVQKKwlib29sICJCRUFUIGJhc2VkIGRlYnVnIGNvbnNvbGUiCisJZGVwZW5kcyBvbiBQUENfQ0VMTEVCCisJZGVmYXVsdCBuCisKK2NvbmZpZyBYSUNTCisJZGVwZW5kcyBvbiBQUENfUFNFUklFUworCWJvb2wKKwlkZWZhdWx0IHkKKworY29uZmlnIE1QSUMKKwlib29sCisJZGVmYXVsdCBuCisKK2NvbmZpZyBNUElDX1dFSVJECisJYm9vbAorCWRlZmF1bHQgbgorCitjb25maWcgUFBDX0k4MjU5CisJYm9vbAorCWRlZmF1bHQgbgorCitjb25maWcgVTNfREFSVAorCWJvb2wKKwlkZXBlbmRzIG9uIFBQQ19NVUxUSVBMQVRGT1JNICYmIFBQQzY0CisJZGVmYXVsdCBuCisKK2NvbmZpZyBQUENfUlRBUworCWJvb2wKKwlkZWZhdWx0IG4KKworY29uZmlnIFJUQVNfRVJST1JfTE9HR0lORworCWJvb2wKKwlkZXBlbmRzIG9uIFBQQ19SVEFTCisJZGVmYXVsdCBuCisKK2NvbmZpZyBSVEFTX1BST0MKKwlib29sICJQcm9jIGludGVyZmFjZSB0byBSVEFTIgorCWRlcGVuZHMgb24gUFBDX1JUQVMKKwlkZWZhdWx0IHkKKworY29uZmlnIFJUQVNfRkxBU0gKKwl0cmlzdGF0ZSAiRmlybXdhcmUgZmxhc2ggaW50ZXJmYWNlIgorCWRlcGVuZHMgb24gUFBDNjQgJiYgUlRBU19QUk9DCisKK2NvbmZpZyBQUENfUE1JCisJdHJpc3RhdGUgIlN1cHBvcnQgZm9yIFBNSSIKKwlkZXBlbmRzIFBQQ19JQk1fQ0VMTF9CTEFERQorCWhlbHAKKwkgIFBNSSAoUGxhdGZvcm0gTWFuYWdlbWVudCBJbnRlcnJ1cHQpIGlzIGEgd2F5IHRvCisJICBjb21tdW5pY2F0ZSB3aXRoIHRoZSBCTUMgKEJhc2Vib2FyZCBNYW5nZW1lbnQgQ29udHJvbGxlcikuCisJICBJdCBpcyB1c2VkIGluIHNvbWUgSUJNIENlbGwgYmxhZGVzLgorCWRlZmF1bHQgbQorCitjb25maWcgTU1JT19OVlJBTQorCWJvb2wKKwlkZWZhdWx0IG4KKworY29uZmlnIE1QSUNfVTNfSFRfSVJRUworCWJvb2wKKwlkZXBlbmRzIG9uIFBQQ19NQVBMRQorCWRlZmF1bHQgeQorCitjb25maWcgSUJNVklPCisJZGVwZW5kcyBvbiBQUENfUFNFUklFUyB8fCBQUENfSVNFUklFUworCWJvb2wKKwlkZWZhdWx0IHkKKworY29uZmlnIElCTUVCVVMKKwlkZXBlbmRzIG9uIFBQQ19QU0VSSUVTCisJYm9vbCAiU3VwcG9ydCBmb3IgR1ggYnVzIGJhc2VkIGFkYXB0ZXJzIgorCWhlbHAKKwkgIEJ1cyBkZXZpY2UgZHJpdmVyIGZvciBHWCBidXMgYmFzZWQgYWRhcHRlcnMuCisKK2NvbmZpZyBQUENfTVBDMTA2CisJYm9vbAorCWRlZmF1bHQgbgorCitjb25maWcgUFBDXzk3MF9OQVAKKwlib29sCisJZGVmYXVsdCBuCisKK2NvbmZpZyBQUENfSU5ESVJFQ1RfSU8KKwlib29sCisJc2VsZWN0IEdFTkVSSUNfSU9NQVAKKwlkZWZhdWx0IG4KKworY29uZmlnIEdFTkVSSUNfSU9NQVAKKwlib29sCisJZGVmYXVsdCBuCisKK3NvdXJjZSAiZHJpdmVycy9jcHVmcmVxL0tjb25maWciCisKK21lbnUgIkNQVSBGcmVxdWVuY3kgZHJpdmVycyIKKwlkZXBlbmRzIG9uIENQVV9GUkVRCisKK2NvbmZpZyBDUFVfRlJFUV9QTUFDCisJYm9vbCAiU3VwcG9ydCBmb3IgQXBwbGUgUG93ZXJCb29rcyIKKwlkZXBlbmRzIG9uIEFEQl9QTVUgJiYgUFBDMzIKKwlzZWxlY3QgQ1BVX0ZSRVFfVEFCTEUKKwloZWxwCisJICBUaGlzIGFkZHMgc3VwcG9ydCBmb3IgZnJlcXVlbmN5IHN3aXRjaGluZyBvbiBBcHBsZSBQb3dlckJvb2tzLAorCSAgdGhpcyBjdXJyZW50bHkgaW5jbHVkZXMgc29tZSBtb2RlbHMgb2YgaUJvb2sgJiBUaXRhbml1bQorCSAgUG93ZXJCb29rLgorCitjb25maWcgQ1BVX0ZSRVFfUE1BQzY0CisJYm9vbCAiU3VwcG9ydCBmb3Igc29tZSBBcHBsZSBHNXMiCisJZGVwZW5kcyBvbiBQUENfUE1BQyAmJiBQUEM2NAorCXNlbGVjdCBDUFVfRlJFUV9UQUJMRQorCWhlbHAKKwkgIFRoaXMgYWRkcyBzdXBwb3J0IGZvciBmcmVxdWVuY3kgc3dpdGNoaW5nIG9uIEFwcGxlIGlNYWMgRzUsCisJICBhbmQgc29tZSBvZiB0aGUgbW9yZSByZWNlbnQgZGVza3RvcCBHNSBtYWNoaW5lcyBhcyB3ZWxsLgorCitjb25maWcgUFBDX1BBU0VNSV9DUFVGUkVRCisJYm9vbCAiU3VwcG9ydCBmb3IgUEEgU2VtaSBQV1JmaWNpZW50IgorCWRlcGVuZHMgb24gUFBDX1BBU0VNSQorCWRlZmF1bHQgeQorCXNlbGVjdCBDUFVfRlJFUV9UQUJMRQorCWhlbHAKKwkgIFRoaXMgYWRkcyB0aGUgc3VwcG9ydCBmb3IgZnJlcXVlbmN5IHN3aXRjaGluZyBvbiBQQSBTZW1pCisJICBQV1JmaWNpZW50IHByb2Nlc3NvcnMuCisKK2VuZG1lbnUKKworY29uZmlnIFBQQzYwMV9TWU5DX0ZJWAorCWJvb2wgIldvcmthcm91bmRzIGZvciBQUEM2MDEgYnVncyIKKwlkZXBlbmRzIG9uIDZ4eCAmJiAoUFBDX1BSRVAgfHwgUFBDX1BNQUMpCisJaGVscAorCSAgU29tZSB2ZXJzaW9ucyBvZiB0aGUgUFBDNjAxICh0aGUgZmlyc3QgUG93ZXJQQyBjaGlwKSBoYXZlIGJ1Z3Mgd2hpY2gKKwkgIG1lYW4gdGhhdCBleHRyYSBzeW5jaHJvbml6YXRpb24gaW5zdHJ1Y3Rpb25zIGFyZSByZXF1aXJlZCBuZWFyCisJICBjZXJ0YWluIGluc3RydWN0aW9ucywgdHlwaWNhbGx5IHRob3NlIHRoYXQgbWFrZSBtYWpvciBjaGFuZ2VzIHRvIHRoZQorCSAgQ1BVIHN0YXRlLiAgVGhlc2UgZXh0cmEgaW5zdHJ1Y3Rpb25zIHJlZHVjZSBwZXJmb3JtYW5jZSBzbGlnaHRseS4KKwkgIElmIHlvdSBzYXkgTiBoZXJlLCB0aGVzZSBleHRyYSBpbnN0cnVjdGlvbnMgd2lsbCBub3QgYmUgaW5jbHVkZWQsCisJICByZXN1bHRpbmcgaW4gYSBrZXJuZWwgd2hpY2ggd2lsbCBydW4gZmFzdGVyIGJ1dCBtYXkgbm90IHJ1biBhdCBhbGwKKwkgIG9uIHNvbWUgc3lzdGVtcyB3aXRoIHRoZSBQUEM2MDEgY2hpcC4KKworCSAgSWYgaW4gZG91YnQsIHNheSBZIGhlcmUuCisKK2NvbmZpZyBUQVUKKwlib29sICJPbi1jaGlwIENQVSB0ZW1wZXJhdHVyZSBzZW5zb3Igc3VwcG9ydCIKKwlkZXBlbmRzIG9uIENMQVNTSUMzMgorCWhlbHAKKwkgIEczIGFuZCBHNCBwcm9jZXNzb3JzIGhhdmUgYW4gb24tY2hpcCB0ZW1wZXJhdHVyZSBzZW5zb3IgY2FsbGVkIHRoZQorCSAgJ1RoZXJtYWwgQXNzaXN0IFVuaXQgKFRBVSknLCB3aGljaCwgaW4gdGhlb3J5LCBjYW4gbWVhc3VyZSB0aGUgb24tZGllCisJICB0ZW1wZXJhdHVyZSB3aXRoaW4gMi00IGRlZ3JlZXMgQ2Vsc2l1cy4gVGhpcyBvcHRpb24gc2hvd3MgdGhlIGN1cnJlbnQKKwkgIG9uLWRpZSB0ZW1wZXJhdHVyZSBpbiAvcHJvYy9jcHVpbmZvIGlmIHRoZSBjcHUgc3VwcG9ydHMgaXQuCisKKwkgIFVuZm9ydHVuYXRlbHksIG9uIHNvbWUgY2hpcCByZXZpc2lvbnMsIHRoaXMgc2Vuc29yIGlzIHZlcnkgaW5hY2N1cmF0ZQorCSAgYW5kIGluIG1hbnkgY2FzZXMsIGRvZXMgbm90IHdvcmsgYXQgYWxsLCBzbyBkb24ndCBhc3N1bWUgdGhlIGNwdQorCSAgdGVtcCBpcyBhY3R1YWxseSB3aGF0IC9wcm9jL2NwdWluZm8gc2F5cyBpdCBpcy4KKworY29uZmlnIFRBVV9JTlQKKwlib29sICJJbnRlcnJ1cHQgZHJpdmVuIFRBVSBkcml2ZXIgKERBTkdFUk9VUykiCisJZGVwZW5kcyBvbiBUQVUKKwktLS1oZWxwLS0tCisJICBUaGUgVEFVIHN1cHBvcnRzIGFuIGludGVycnVwdCBkcml2ZW4gbW9kZSB3aGljaCBjYXVzZXMgYW4gaW50ZXJydXB0CisJICB3aGVuZXZlciB0aGUgdGVtcGVyYXR1cmUgZ29lcyBvdXQgb2YgcmFuZ2UuIFRoaXMgaXMgdGhlIGZhc3Rlc3Qgd2F5CisJICB0byBnZXQgbm90aWZpZWQgdGhlIHRlbXAgaGFzIGV4Y2VlZGVkIGEgcmFuZ2UuIFdpdGggdGhpcyBvcHRpb24gb2ZmLAorCSAgYSB0aW1lciBpcyB1c2VkIHRvIHJlLWNoZWNrIHRoZSB0ZW1wZXJhdHVyZSBwZXJpb2RpY2FsbHkuCisKKwkgIEhvd2V2ZXIsIG9uIHNvbWUgY3B1cyBpdCBhcHBlYXJzIHRoYXQgdGhlIFRBVSBpbnRlcnJ1cHQgaGFyZHdhcmUKKwkgIGlzIGJ1Z2d5IGFuZCBjYW4gY2F1c2UgYSBzaXR1YXRpb24gd2hpY2ggd291bGQgbGVhZCB1bmV4cGxhaW5lZCBoYXJkCisJICBsb2NrdXBzLgorCisJICBVbmxlc3MgeW91IGFyZSBleHRlbmRpbmcgdGhlIFRBVSBkcml2ZXIsIG9yIGVuam95IGtlcm5lbC9oYXJkd2FyZQorCSAgZGVidWdnaW5nLCBsZWF2ZSB0aGlzIG9wdGlvbiBvZmYuCisKK2NvbmZpZyBUQVVfQVZFUkFHRQorCWJvb2wgIkF2ZXJhZ2UgaGlnaCBhbmQgbG93IHRlbXAiCisJZGVwZW5kcyBvbiBUQVUKKwktLS1oZWxwLS0tCisJICBUaGUgVEFVIGhhcmR3YXJlIGNhbiBjb21wYXJlIHRoZSB0ZW1wZXJhdHVyZSB0byBhbiB1cHBlciBhbmQgbG93ZXIKKwkgIGJvdW5kLiAgVGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gc2hvdyBib3RoIHRoZSB1cHBlciBhbmQgbG93ZXIKKwkgIGJvdW5kIGluIC9wcm9jL2NwdWluZm8uIElmIHRoZSByYW5nZSBpcyBsYXJnZSwgdGhlIHRlbXBlcmF0dXJlIGlzCisJICBlaXRoZXIgY2hhbmdpbmcgYSBsb3QsIG9yIHRoZSBUQVUgaGFyZHdhcmUgaXMgYnJva2VuIChsaWtlbHkgb24gc29tZQorCSAgRzQncykuIElmIHRoZSByYW5nZSBpcyBzbWFsbCAoYXJvdW5kIDQgZGVncmVlcyksIHRoZSB0ZW1wZXJhdHVyZSBpcworCSAgcmVsYXRpdmVseSBzdGFibGUuICBJZiB5b3Ugc2F5IFkgaGVyZSwgYSBzaW5nbGUgdGVtcGVyYXR1cmUgdmFsdWUsCisJICBoYWxmd2F5IGJldHdlZW4gdGhlIHVwcGVyIGFuZCBsb3dlciBib3VuZHMsIHdpbGwgYmUgcmVwb3J0ZWQgaW4KKwkgIC9wcm9jL2NwdWluZm8uCisKKwkgIElmIGluIGRvdWJ0LCBzYXkgTiBoZXJlLgorCitjb25maWcgUVVJQ0NfRU5HSU5FCisJYm9vbAorCWhlbHAKKwkgIFRoZSBRVUlDQyBFbmdpbmUgKFFFKSBpcyBhIG5ldyBnZW5lcmF0aW9uIG9mIGNvbW11bmljYXRpb25zCisJICBjb3Byb2Nlc3NvcnMgb24gRnJlZXNjYWxlIGVtYmVkZGVkIENQVXMgKGFraW4gdG8gQ1BNIGluIG9sZGVyIGNoaXBzKS4KKwkgIFNlbGVjdGluZyB0aGlzIG9wdGlvbiBtZWFucyB0aGF0IHlvdSB3aXNoIHRvIGJ1aWxkIGEga2VybmVsCisJICBmb3IgYSBtYWNoaW5lIHdpdGggYSBRRSBjb3Byb2Nlc3Nvci4KKworY29uZmlnIENQTTIKKwlib29sCisJZGVmYXVsdCBuCisJaGVscAorCSAgVGhlIENQTTIgKENvbW11bmljYXRpb25zIFByb2Nlc3NvciBNb2R1bGUpIGlzIGEgY29wcm9jZXNzb3Igb24KKwkgIGVtYmVkZGVkIENQVXMgbWFkZSBieSBGcmVlc2NhbGUuICBTZWxlY3RpbmcgdGhpcyBvcHRpb24gbWVhbnMgdGhhdAorCSAgeW91IHdpc2ggdG8gYnVpbGQgYSBrZXJuZWwgZm9yIGEgbWFjaGluZSB3aXRoIGEgQ1BNMiBjb3Byb2Nlc3NvcgorCSAgb24gaXQgKDgyNngsIDgyN3gsIDg1NjApLgorCitlbmRtZW51CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9LY29uZmlnCmluZGV4IDA2YTg1YjcuLjgyNTUxNzcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9LY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9LY29uZmlnCkBAIC0xLDMgKzEsMjYgQEAKK2NvbmZpZyBQUENfQ0VMTAorCWJvb2wKKwlkZWZhdWx0IG4KKworY29uZmlnIFBQQ19DRUxMX05BVElWRQorCWJvb2wKKwlzZWxlY3QgUFBDX0NFTEwKKwlzZWxlY3QgUFBDX0RDUl9NTUlPCisJc2VsZWN0IFBQQ19PRl9QTEFURk9STV9QQ0kKKwlzZWxlY3QgUFBDX0lORElSRUNUX0lPCisJc2VsZWN0IFBQQ19OQVRJVkUKKwlzZWxlY3QgTVBJQworCWRlZmF1bHQgbgorCitjb25maWcgUFBDX0lCTV9DRUxMX0JMQURFCisJYm9vbCAiSUJNIENlbGwgQmxhZGUiCisJZGVwZW5kcyBvbiBQUENfTVVMVElQTEFURk9STSAmJiBQUEM2NAorCXNlbGVjdCBQUENfQ0VMTF9OQVRJVkUKKwlzZWxlY3QgUFBDX1JUQVMKKwlzZWxlY3QgTU1JT19OVlJBTQorCXNlbGVjdCBQUENfVURCR18xNjU1MAorCXNlbGVjdCBVREJHX1JUQVNfQ09OU09MRQorCiBtZW51ICJDZWxsIEJyb2FkYmFuZCBFbmdpbmUgb3B0aW9ucyIKIAlkZXBlbmRzIG9uIFBQQ19DRUxMCiAKQEAgLTE4LDYgKzQxLDcgQEAKIAogY29uZmlnIENCRV9SQVMKIAlib29sICJSQVMgZmVhdHVyZXMgZm9yIGJhcmUgbWV0YWwgQ2VsbCBCRSIKKwlkZXBlbmRzIG9uIFBQQ19DRUxMX05BVElWRQogCWRlZmF1bHQgeQogCiBjb25maWcgQ0JFX1RIRVJNCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvY2JlX2NwdWZyZXEuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9jYmVfY3B1ZnJlcS5jCmluZGV4IGEzODUwZmQuLmY5YWMzZmUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9jYmVfY3B1ZnJlcS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9jYmVfY3B1ZnJlcS5jCkBAIC0yNSw5ICsyNSwxMiBAQAogCiAjaW5jbHVkZSA8YXNtL2h3X2lycS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogI2luY2x1ZGUgPGFzbS9wcm9tLmg+CiAjaW5jbHVkZSA8YXNtL3RpbWUuaD4KKyNpbmNsdWRlIDxhc20vcG1pLmg+CisjaW5jbHVkZSA8YXNtL29mX3BsYXRmb3JtLmg+CiAKICNpbmNsdWRlICJjYmVfcmVncy5oIgogCkBAIC02OCw2ICs3MSwzOCBAQAogICogaGFyZHdhcmUgc3BlY2lmaWMgZnVuY3Rpb25zCiAgKi8KIAorc3RhdGljIHN0cnVjdCBvZl9kZXZpY2UgKnBtaV9kZXY7CisKK3N0YXRpYyBpbnQgc2V0X3Btb2RlX3BtaShpbnQgY3B1LCB1bnNpZ25lZCBpbnQgcG1vZGUpCit7CisJaW50IHJldDsKKwlwbWlfbWVzc2FnZV90IHBtaV9tc2c7CisjaWZkZWYgREVCVUcKKwl1NjQgdGltZTsKKyNlbmRpZgorCisJcG1pX21zZy50eXBlID0gUE1JX1RZUEVfRlJFUV9DSEFOR0U7CisJcG1pX21zZy5kYXRhMSA9CWNiZV9jcHVfdG9fbm9kZShjcHUpOworCXBtaV9tc2cuZGF0YTIgPSBwbW9kZTsKKworI2lmZGVmIERFQlVHCisJdGltZSA9ICh1NjQpIGdldF9jeWNsZXMoKTsKKyNlbmRpZgorCisJcG1pX3NlbmRfbWVzc2FnZShwbWlfZGV2LCBwbWlfbXNnKTsKKwlyZXQgPSBwbWlfbXNnLmRhdGEyOworCisJcHJfZGVidWcoIlBNSSByZXR1cm5lZCBzbG93IG1vZGUgJWRcbiIsIHJldCk7CisKKyNpZmRlZiBERUJVRworCXRpbWUgPSAodTY0KSBnZXRfY3ljbGVzKCkgLSB0aW1lOyAvKiBhY3R1YWwgY3ljbGVzIChub3QgY3B1IGN5Y2xlcyEpICovCisJdGltZSA9IDEwMDAwMDAwMDAgKiB0aW1lIC8gQ0xPQ0tfVElDS19SQVRFOyAvKiB0aW1lIGluIG5zICgxMF4tOSkgKi8KKwlwcl9kZWJ1ZygiaGFkIHRvIHdhaXQgJWx1IG5zIGZvciBhIHRyYW5zaXRpb25cbiIsIHRpbWUpOworI2VuZGlmCisJcmV0dXJuIHJldDsKK30KKworCiBzdGF0aWMgaW50IGdldF9wbW9kZShpbnQgY3B1KQogewogCWludCByZXQ7CkBAIC03OSw3ICsxMTQsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgc2V0X3Btb2RlKGludCBjcHUsIHVuc2lnbmVkIGludCBwbW9kZSkKK3N0YXRpYyBpbnQgc2V0X3Btb2RlX3JlZyhpbnQgY3B1LCB1bnNpZ25lZCBpbnQgcG1vZGUpCiB7CiAJc3RydWN0IGNiZV9wbWRfcmVncyBfX2lvbWVtICpwbWRfcmVnczsKIAlzdHJ1Y3QgY2JlX21pY190bV9yZWdzIF9faW9tZW0gKm1pY190bV9yZWdzOwpAQCAtMTIwLDM3ICsxNTUsNzEgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBzZXRfcG1vZGUoaW50IGNwdSwgdW5zaWduZWQgaW50IHNsb3dfbW9kZSkgeworCWlmIChwbWlfZGV2KQorCQlyZXR1cm4gc2V0X3Btb2RlX3BtaShjcHUsIHNsb3dfbW9kZSk7CisJZWxzZQorCQlyZXR1cm4gc2V0X3Btb2RlX3JlZyhjcHUsIHNsb3dfbW9kZSk7Cit9CisKK3N0YXRpYyB2b2lkIGNiZV9jcHVmcmVxX2hhbmRsZV9wbWkoc3RydWN0IG9mX2RldmljZSAqZGV2LCBwbWlfbWVzc2FnZV90IHBtaV9tc2cpCit7CisJc3RydWN0IGNwdWZyZXFfcG9saWN5IHBvbGljeTsKKwl1OCBjcHU7CisJdTggY2JlX3Btb2RlX25ldzsKKworCUJVR19PTihwbWlfbXNnLnR5cGUgIT0gUE1JX1RZUEVfRlJFUV9DSEFOR0UpOworCisJY3B1ID0gY2JlX25vZGVfdG9fY3B1KHBtaV9tc2cuZGF0YTEpOworCWNiZV9wbW9kZV9uZXcgPSBwbWlfbXNnLmRhdGEyOworCisJY3B1ZnJlcV9nZXRfcG9saWN5KCZwb2xpY3ksIGNwdSk7CisKKwlwb2xpY3kubWF4ID0gbWluKHBvbGljeS5tYXgsIGNiZV9mcmVxc1tjYmVfcG1vZGVfbmV3XS5mcmVxdWVuY3kpOworCXBvbGljeS5taW4gPSBtaW4ocG9saWN5Lm1pbiwgcG9saWN5Lm1heCk7CisKKwlwcl9kZWJ1ZygiY2JlX2hhbmRsZV9wbWk6IG5ldyBwb2xpY3kubWluPSVkIHBvbGljeS5tYXg9JWRcbiIsIHBvbGljeS5taW4sIHBvbGljeS5tYXgpOworCWNwdWZyZXFfc2V0X3BvbGljeSgmcG9saWN5KTsKK30KKworc3RhdGljIHN0cnVjdCBwbWlfaGFuZGxlciBjYmVfcG1pX2hhbmRsZXIgPSB7CisJLnR5cGUJCQk9IFBNSV9UWVBFX0ZSRVFfQ0hBTkdFLAorCS5oYW5kbGVfcG1pX21lc3NhZ2UJPSBjYmVfY3B1ZnJlcV9oYW5kbGVfcG1pLAorfTsKKworCiAvKgogICogY3B1ZnJlcSBmdW5jdGlvbnMKICAqLwogCi1zdGF0aWMgaW50IGNiZV9jcHVmcmVxX2NwdV9pbml0IChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKK3N0YXRpYyBpbnQgY2JlX2NwdWZyZXFfY3B1X2luaXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCiB7Ci0JdTMyICptYXhfZnJlcTsKKwljb25zdCB1MzIgKm1heF9mcmVxcDsKKwl1MzIgbWF4X2ZyZXE7CiAJaW50IGksIGN1cl9wbW9kZTsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNwdTsKIAogCWNwdSA9IG9mX2dldF9jcHVfbm9kZShwb2xpY3ktPmNwdSwgTlVMTCk7CiAKLQlpZighY3B1KQorCWlmICghY3B1KQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCXByX2RlYnVnKCJpbml0IGNwdWZyZXEgb24gQ1BVICVkXG4iLCBwb2xpY3ktPmNwdSk7CiAKLQltYXhfZnJlcSA9ICh1MzIqKSBnZXRfcHJvcGVydHkoY3B1LCAiY2xvY2stZnJlcXVlbmN5IiwgTlVMTCk7CisJbWF4X2ZyZXFwID0gb2ZfZ2V0X3Byb3BlcnR5KGNwdSwgImNsb2NrLWZyZXF1ZW5jeSIsIE5VTEwpOwogCi0JaWYoIW1heF9mcmVxKQorCWlmICghbWF4X2ZyZXFwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCS8vIHdlIG5lZWQgdGhlIGZyZXEgaW4ga0h6Ci0JKm1heF9mcmVxIC89IDEwMDA7CisJLyogd2UgbmVlZCB0aGUgZnJlcSBpbiBrSHogKi8KKwltYXhfZnJlcSA9ICptYXhfZnJlcXAgLyAxMDAwOwogCi0JcHJfZGVidWcoIm1heCBjbG9jay1mcmVxdWVuY3kgaXMgYXQgJXUga0h6XG4iLCAqbWF4X2ZyZXEpOworCXByX2RlYnVnKCJtYXggY2xvY2stZnJlcXVlbmN5IGlzIGF0ICV1IGtIelxuIiwgbWF4X2ZyZXEpOwogCXByX2RlYnVnKCJpbml0aWFsaXppbmcgZnJlcXVlbmN5IHRhYmxlXG4iKTsKIAotCS8vIGluaXRpYWxpemUgZnJlcXVlbmN5IHRhYmxlCisJLyogaW5pdGlhbGl6ZSBmcmVxdWVuY3kgdGFibGUgKi8KIAlmb3IgKGk9MDsgY2JlX2ZyZXFzW2ldLmZyZXF1ZW5jeSE9Q1BVRlJFUV9UQUJMRV9FTkQ7IGkrKykgewotCQljYmVfZnJlcXNbaV0uZnJlcXVlbmN5ID0gKm1heF9mcmVxIC8gY2JlX2ZyZXFzW2ldLmluZGV4OworCQljYmVfZnJlcXNbaV0uZnJlcXVlbmN5ID0gbWF4X2ZyZXEgLyBjYmVfZnJlcXNbaV0uaW5kZXg7CiAJCXByX2RlYnVnKCIlZDogJWRcbiIsIGksIGNiZV9mcmVxc1tpXS5mcmVxdWVuY3kpOwogCX0KIApAQCAtMTY3LDEwICsyMzYsMTAgQEAKIAlwb2xpY3ktPmNwdXMgPSBjcHVfc2libGluZ19tYXBbcG9saWN5LT5jcHVdOwogI2VuZGlmCiAKLQljcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV9nZXRfYXR0ciAoY2JlX2ZyZXFzLCBwb2xpY3ktPmNwdSk7CisJY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfZ2V0X2F0dHIoY2JlX2ZyZXFzLCBwb2xpY3ktPmNwdSk7CiAKIAkvKiB0aGlzIGVuc3VyZXMgdGhhdCBwb2xpY3ktPmNwdWluZm9fbWluIGFuZCBwb2xpY3ktPmNwdWluZm9fbWF4IGFyZSBzZXQgY29ycmVjdGx5ICovCi0JcmV0dXJuIGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX2NwdWluZm8gKHBvbGljeSwgY2JlX2ZyZXFzKTsKKwlyZXR1cm4gY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfY3B1aW5mbyhwb2xpY3ksIGNiZV9mcmVxcyk7CiB9CiAKIHN0YXRpYyBpbnQgY2JlX2NwdWZyZXFfY3B1X2V4aXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCkBAIC0yMDIsNyArMjcxLDcgQEAKIAlmcmVxcy5uZXcgPSBjYmVfZnJlcXNbY2JlX3Btb2RlX25ld10uZnJlcXVlbmN5OwogCWZyZXFzLmNwdSA9IHBvbGljeS0+Y3B1OwogCi0JbXV0ZXhfbG9jayAoJmNiZV9zd2l0Y2hfbXV0ZXgpOworCW11dGV4X2xvY2soJmNiZV9zd2l0Y2hfbXV0ZXgpOwogCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmZyZXFzLCBDUFVGUkVRX1BSRUNIQU5HRSk7CiAKIAlwcl9kZWJ1Zygic2V0dGluZyBmcmVxdWVuY3kgZm9yIGNwdSAlZCB0byAlZCBrSHosIDEvJWQgb2YgbWF4IGZyZXF1ZW5jeVxuIiwKQEAgLTIzMywxMSArMzAyLDI2IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGNiZV9jcHVmcmVxX2luaXQodm9pZCkKIHsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCisJaWYgKCFtYWNoaW5lX2lzKGNlbGwpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCW5wID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUoTlVMTCwgImlibSxwbWkiKTsKKworCXBtaV9kZXYgPSBvZl9maW5kX2RldmljZV9ieV9ub2RlKG5wKTsKKworCWlmIChwbWlfZGV2KQorCQlwbWlfcmVnaXN0ZXJfaGFuZGxlcihwbWlfZGV2LCAmY2JlX3BtaV9oYW5kbGVyKTsKKwogCXJldHVybiBjcHVmcmVxX3JlZ2lzdGVyX2RyaXZlcigmY2JlX2NwdWZyZXFfZHJpdmVyKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGNiZV9jcHVmcmVxX2V4aXQodm9pZCkKIHsKKwlpZiAocG1pX2RldikKKwkJcG1pX3VucmVnaXN0ZXJfaGFuZGxlcihwbWlfZGV2LCAmY2JlX3BtaV9oYW5kbGVyKTsKKwogCWNwdWZyZXFfdW5yZWdpc3Rlcl9kcml2ZXIoJmNiZV9jcHVmcmVxX2RyaXZlcik7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9jYmVfcmVncy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2NiZV9yZWdzLmMKaW5kZXggOWEwZWU2Mi4uMTJjOTY3NCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2NiZV9yZWdzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2NiZV9yZWdzLmMKQEAgLTE0LDYgKzE0LDggQEAKICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9wcm9tLmg+CiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgorI2luY2x1ZGUgPGFzbS9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxhc20vb2ZfcGxhdGZvcm0uaD4KIAogI2luY2x1ZGUgImNiZV9yZWdzLmgiCiAKQEAgLTI3LDYgKzI5LDcgQEAKIHN0YXRpYyBzdHJ1Y3QgY2JlX3JlZ3NfbWFwCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpjcHVfbm9kZTsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmJlX25vZGU7CiAJc3RydWN0IGNiZV9wbWRfcmVncyBfX2lvbWVtICpwbWRfcmVnczsKIAlzdHJ1Y3QgY2JlX2lpY19yZWdzIF9faW9tZW0gKmlpY19yZWdzOwogCXN0cnVjdCBjYmVfbWljX3RtX3JlZ3MgX19pb21lbSAqbWljX3RtX3JlZ3M7CkBAIC0zNywzMCArNDAsNDMgQEAKIHN0YXRpYyBzdHJ1Y3QgY2JlX3RocmVhZF9tYXAKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNwdV9ub2RlOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqYmVfbm9kZTsKIAlzdHJ1Y3QgY2JlX3JlZ3NfbWFwICpyZWdzOworCXVuc2lnbmVkIGludCB0aHJlYWRfaWQ7CisJdW5zaWduZWQgaW50IGNiZV9pZDsKIH0gY2JlX3RocmVhZF9tYXBbTlJfQ1BVU107CiAKK3N0YXRpYyBjcHVtYXNrX3QgY2JlX2xvY2FsX21hc2tbTUFYX0NCRV0gPSB7IFswIC4uLiBNQVhfQ0JFLTFdID0gQ1BVX01BU0tfTk9ORSB9Oworc3RhdGljIGNwdW1hc2tfdCBjYmVfZmlyc3Rfb25saW5lX2NwdSA9IENQVV9NQVNLX05PTkU7CisKIHN0YXRpYyBzdHJ1Y3QgY2JlX3JlZ3NfbWFwICpjYmVfZmluZF9tYXAoc3RydWN0IGRldmljZV9ub2RlICpucCkKIHsKIAlpbnQgaTsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKnRtcF9ucDsKIAotCWlmIChzdHJjYXNlY21wKG5wLT50eXBlLCAic3BlIikgPT0gMCkgewotCQlpZiAobnAtPmRhdGEgPT0gTlVMTCkgewotCQkJLyogd2FsayB1cCBwYXRoIHVudGlsIGNwdSBub2RlIHdhcyBmb3VuZCAqLwotCQkJdG1wX25wID0gbnAtPnBhcmVudDsKLQkJCXdoaWxlICh0bXBfbnAgIT0gTlVMTCAmJiBzdHJjYXNlY21wKHRtcF9ucC0+dHlwZSwgImNwdSIpICE9IDApCi0JCQkJdG1wX25wID0gdG1wX25wLT5wYXJlbnQ7Ci0KLQkJCW5wLT5kYXRhID0gY2JlX2ZpbmRfbWFwKHRtcF9ucCk7Ci0JCX0KLQkJcmV0dXJuIG5wLT5kYXRhOworCWlmIChzdHJjYXNlY21wKG5wLT50eXBlLCAic3BlIikpIHsKKwkJZm9yIChpID0gMDsgaSA8IGNiZV9yZWdzX21hcF9jb3VudDsgaSsrKQorCQkJaWYgKGNiZV9yZWdzX21hcHNbaV0uY3B1X25vZGUgPT0gbnAgfHwKKwkJCSAgICBjYmVfcmVnc19tYXBzW2ldLmJlX25vZGUgPT0gbnApCisJCQkJcmV0dXJuICZjYmVfcmVnc19tYXBzW2ldOworCQlyZXR1cm4gTlVMTDsKIAl9CiAKLQlmb3IgKGkgPSAwOyBpIDwgY2JlX3JlZ3NfbWFwX2NvdW50OyBpKyspCi0JCWlmIChjYmVfcmVnc19tYXBzW2ldLmNwdV9ub2RlID09IG5wKQotCQkJcmV0dXJuICZjYmVfcmVnc19tYXBzW2ldOwotCXJldHVybiBOVUxMOworCWlmIChucC0+ZGF0YSkKKwkJcmV0dXJuIG5wLT5kYXRhOworCisJLyogd2FsayB1cCBwYXRoIHVudGlsIGNwdSBvciBiZSBub2RlIHdhcyBmb3VuZCAqLworCXRtcF9ucCA9IG5wOworCWRvIHsKKwkJdG1wX25wID0gdG1wX25wLT5wYXJlbnQ7CisJCS8qIG9uIGEgY29ycmVjdCBkZXZpY2V0cmVlIHdlIHdvbnQgZ2V0IHVwIHRvIHJvb3QgKi8KKwkJQlVHX09OKCF0bXBfbnApOworCX0gd2hpbGUgKHN0cmNhc2VjbXAodG1wX25wLT50eXBlLCAiY3B1IikgJiYKKwkJIHN0cmNhc2VjbXAodG1wX25wLT50eXBlLCAiYmUiKSk7CisKKwlucC0+ZGF0YSA9IGNiZV9maW5kX21hcCh0bXBfbnApOworCisJcmV0dXJuIG5wLT5kYXRhOwogfQogCiBzdHJ1Y3QgY2JlX3BtZF9yZWdzIF9faW9tZW0gKmNiZV9nZXRfcG1kX3JlZ3Moc3RydWN0IGRldmljZV9ub2RlICpucCkKQEAgLTEzMCwzOCArMTQ2LDEwNSBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoY2JlX2dldF9jcHVfbWljX3RtX3JlZ3MpOwogCi0vKiBGSVhNRQotICogVGhpcyBpcyBsaXR0bGUgbW9yZSB0aGFuIGEgc3R1YiBhdCB0aGUgbW9tZW50LiAgSXQgc2hvdWxkIGJlCi0gKiBmbGVzaGVkIG91dCBzbyB0aGF0IGl0IHdvcmtzIGZvciBib3RoIFNNVCBhbmQgbm9uLVNNVCwgbm8KLSAqIG1hdHRlciBpZiB0aGUgcGFzc2VkIGNwdSBpcyBvZGQgb3IgZXZlbi4KLSAqIEZvciBTTVQgZW5hYmxlZCwgcmV0dXJucyAwIGZvciBldmVuLW51bWJlcmVkIGNwdTsgb3RoZXJ3aXNlIDEuCi0gKiBGb3IgU01UIGRpc2FibGVkLCByZXR1cm5zIDAgZm9yIGFsbCBjcHVzLgotICovCiB1MzIgY2JlX2dldF9od190aHJlYWRfaWQoaW50IGNwdSkKIHsKLQlyZXR1cm4gKGNwdSAmIDEpOworCXJldHVybiBjYmVfdGhyZWFkX21hcFtjcHVdLnRocmVhZF9pZDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGNiZV9nZXRfaHdfdGhyZWFkX2lkKTsKIAotdm9pZCBfX2luaXQgY2JlX3JlZ3NfaW5pdCh2b2lkKQordTMyIGNiZV9jcHVfdG9fbm9kZShpbnQgY3B1KQogewotCWludCBpOwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqY3B1OworCXJldHVybiBjYmVfdGhyZWFkX21hcFtjcHVdLmNiZV9pZDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGNiZV9jcHVfdG9fbm9kZSk7CiAKLQkvKiBCdWlsZCBsb2NhbCBmYXN0IG1hcCBvZiBDUFVzICovCi0JZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpCi0JCWNiZV90aHJlYWRfbWFwW2ldLmNwdV9ub2RlID0gb2ZfZ2V0X2NwdV9ub2RlKGksIE5VTEwpOwordTMyIGNiZV9ub2RlX3RvX2NwdShpbnQgbm9kZSkKK3sKKwlyZXR1cm4gZmluZF9maXJzdF9iaXQoICh1bnNpZ25lZCBsb25nICopICZjYmVfbG9jYWxfbWFza1tub2RlXSwgc2l6ZW9mKGNwdW1hc2tfdCkpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoY2JlX25vZGVfdG9fY3B1KTsKIAotCS8qIEZpbmQgbWFwcyBmb3IgZWFjaCBkZXZpY2UgdHJlZSBDUFUgKi8KLQlmb3JfZWFjaF9ub2RlX2J5X3R5cGUoY3B1LCAiY3B1IikgewotCQlzdHJ1Y3QgY2JlX3JlZ3NfbWFwICptYXAgPSAmY2JlX3JlZ3NfbWFwc1tjYmVfcmVnc19tYXBfY291bnQrK107CitzdGF0aWMgc3RydWN0IGRldmljZV9ub2RlICpjYmVfZ2V0X2JlX25vZGUoaW50IGNwdV9pZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwogCisJZm9yX2VhY2hfbm9kZV9ieV90eXBlIChucCwgImJlIikgeworCQlpbnQgbGVuLGk7CisJCWNvbnN0IHBoYW5kbGUgKmNwdV9oYW5kbGU7CisKKwkJY3B1X2hhbmRsZSA9IG9mX2dldF9wcm9wZXJ0eShucCwgImNwdXMiLCAmbGVuKTsKKworCQlmb3IgKGk9MDsgaTxsZW47IGkrKykKKwkJCWlmIChvZl9maW5kX25vZGVfYnlfcGhhbmRsZShjcHVfaGFuZGxlW2ldKSA9PSBvZl9nZXRfY3B1X25vZGUoY3B1X2lkLCBOVUxMKSkKKwkJCQlyZXR1cm4gbnA7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgX19pbml0IGNiZV9maWxsX3JlZ3NfbWFwKHN0cnVjdCBjYmVfcmVnc19tYXAgKm1hcCkKK3sKKwlpZihtYXAtPmJlX25vZGUpIHsKKwkJc3RydWN0IGRldmljZV9ub2RlICpiZSwgKm5wOworCisJCWJlID0gbWFwLT5iZV9ub2RlOworCisJCWZvcl9lYWNoX25vZGVfYnlfdHlwZShucCwgInBlcnZhc2l2ZSIpCisJCQlpZiAob2ZfZ2V0X3BhcmVudChucCkgPT0gYmUpCisJCQkJbWFwLT5wbWRfcmVncyA9IG9mX2lvbWFwKG5wLCAwKTsKKworCQlmb3JfZWFjaF9ub2RlX2J5X3R5cGUobnAsICJDQkVBLUludGVybmFsLUludGVycnVwdC1Db250cm9sbGVyIikKKwkJCWlmIChvZl9nZXRfcGFyZW50KG5wKSA9PSBiZSkKKwkJCQltYXAtPmlpY19yZWdzID0gb2ZfaW9tYXAobnAsIDIpOworCisJCWZvcl9lYWNoX25vZGVfYnlfdHlwZShucCwgIm1pYy10bSIpCisJCQlpZiAob2ZfZ2V0X3BhcmVudChucCkgPT0gYmUpCisJCQkJbWFwLT5taWNfdG1fcmVncyA9IG9mX2lvbWFwKG5wLCAwKTsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNwdTsKIAkJLyogVGhhdCBoYWNrIG11c3QgZGllIGRpZSBkaWUgISAqLwogCQljb25zdCBzdHJ1Y3QgYWRkcmVzc19wcm9wIHsKIAkJCXVuc2lnbmVkIGxvbmcgYWRkcmVzczsKIAkJCXVuc2lnbmVkIGludCBsZW47CiAJCX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgKnByb3A7CiAKKwkJY3B1ID0gbWFwLT5jcHVfbm9kZTsKKworCQlwcm9wID0gb2ZfZ2V0X3Byb3BlcnR5KGNwdSwgInBlcnZhc2l2ZSIsIE5VTEwpOworCQlpZiAocHJvcCAhPSBOVUxMKQorCQkJbWFwLT5wbWRfcmVncyA9IGlvcmVtYXAocHJvcC0+YWRkcmVzcywgcHJvcC0+bGVuKTsKKworCQlwcm9wID0gb2ZfZ2V0X3Byb3BlcnR5KGNwdSwgImlpYyIsIE5VTEwpOworCQlpZiAocHJvcCAhPSBOVUxMKQorCQkJbWFwLT5paWNfcmVncyA9IGlvcmVtYXAocHJvcC0+YWRkcmVzcywgcHJvcC0+bGVuKTsKKworCQlwcm9wID0gb2ZfZ2V0X3Byb3BlcnR5KGNwdSwgIm1pYy10bSIsIE5VTEwpOworCQlpZiAocHJvcCAhPSBOVUxMKQorCQkJbWFwLT5taWNfdG1fcmVncyA9IGlvcmVtYXAocHJvcC0+YWRkcmVzcywgcHJvcC0+bGVuKTsKKwl9Cit9CisKKwordm9pZCBfX2luaXQgY2JlX3JlZ3NfaW5pdCh2b2lkKQoreworCWludCBpOworCXVuc2lnbmVkIGludCB0aHJlYWRfaWQ7CisJc3RydWN0IGRldmljZV9ub2RlICpjcHU7CisKKwkvKiBCdWlsZCBsb2NhbCBmYXN0IG1hcCBvZiBDUFVzICovCisJZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpIHsKKwkJY2JlX3RocmVhZF9tYXBbaV0uY3B1X25vZGUgPSBvZl9nZXRfY3B1X25vZGUoaSwgJnRocmVhZF9pZCk7CisJCWNiZV90aHJlYWRfbWFwW2ldLmJlX25vZGUgPSBjYmVfZ2V0X2JlX25vZGUoaSk7CisJCWNiZV90aHJlYWRfbWFwW2ldLnRocmVhZF9pZCA9IHRocmVhZF9pZDsKKwl9CisKKwkvKiBGaW5kIG1hcHMgZm9yIGVhY2ggZGV2aWNlIHRyZWUgQ1BVICovCisJZm9yX2VhY2hfbm9kZV9ieV90eXBlKGNwdSwgImNwdSIpIHsKKwkJc3RydWN0IGNiZV9yZWdzX21hcCAqbWFwOworCQl1bnNpZ25lZCBpbnQgY2JlX2lkOworCisJCWNiZV9pZCA9IGNiZV9yZWdzX21hcF9jb3VudCsrOworCQltYXAgPSAmY2JlX3JlZ3NfbWFwc1tjYmVfaWRdOwogCiAJCWlmIChjYmVfcmVnc19tYXBfY291bnQgPiBNQVhfQ0JFKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgImNiZV9yZWdzOiBNb3JlIEJFIGNoaXBzIHRoYW4gc3VwcG9ydGVkIgpAQCAtMTcwLDIyICsyNTMsMjEgQEAKIAkJCXJldHVybjsKIAkJfQogCQltYXAtPmNwdV9ub2RlID0gY3B1OwotCQlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkKLQkJCWlmIChjYmVfdGhyZWFkX21hcFtpXS5jcHVfbm9kZSA9PSBjcHUpCi0JCQkJY2JlX3RocmVhZF9tYXBbaV0ucmVncyA9IG1hcDsKIAotCQlwcm9wID0gZ2V0X3Byb3BlcnR5KGNwdSwgInBlcnZhc2l2ZSIsIE5VTEwpOwotCQlpZiAocHJvcCAhPSBOVUxMKQotCQkJbWFwLT5wbWRfcmVncyA9IGlvcmVtYXAocHJvcC0+YWRkcmVzcywgcHJvcC0+bGVuKTsKKwkJZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpIHsKKwkJCXN0cnVjdCBjYmVfdGhyZWFkX21hcCAqdGhyZWFkID0gJmNiZV90aHJlYWRfbWFwW2ldOwogCi0JCXByb3AgPSBnZXRfcHJvcGVydHkoY3B1LCAiaWljIiwgTlVMTCk7Ci0JCWlmIChwcm9wICE9IE5VTEwpCi0JCQltYXAtPmlpY19yZWdzID0gaW9yZW1hcChwcm9wLT5hZGRyZXNzLCBwcm9wLT5sZW4pOworCQkJaWYgKHRocmVhZC0+Y3B1X25vZGUgPT0gY3B1KSB7CisJCQkJdGhyZWFkLT5yZWdzID0gbWFwOworCQkJCXRocmVhZC0+Y2JlX2lkID0gY2JlX2lkOworCQkJCW1hcC0+YmVfbm9kZSA9IHRocmVhZC0+YmVfbm9kZTsKKwkJCQljcHVfc2V0KGksIGNiZV9sb2NhbF9tYXNrW2NiZV9pZF0pOworCQkJCWlmKHRocmVhZC0+dGhyZWFkX2lkID09IDApCisJCQkJCWNwdV9zZXQoaSwgY2JlX2ZpcnN0X29ubGluZV9jcHUpOworCQkJfQorCQl9CiAKLQkJcHJvcCA9IChzdHJ1Y3QgYWRkcmVzc19wcm9wICopZ2V0X3Byb3BlcnR5KGNwdSwgIm1pYy10bSIsCi0JCQkJCQkJICAgTlVMTCk7Ci0JCWlmIChwcm9wICE9IE5VTEwpCi0JCQltYXAtPm1pY190bV9yZWdzID0gaW9yZW1hcChwcm9wLT5hZGRyZXNzLCBwcm9wLT5sZW4pOworCQljYmVfZmlsbF9yZWdzX21hcChtYXApOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2NiZV9yZWdzLmggYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvY2JlX3JlZ3MuaAppbmRleCA0NDBhN2VjLi4xN2Q1OTcxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvY2JlX3JlZ3MuaAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvY2JlX3JlZ3MuaApAQCAtMjU1LDYgKzI1NSwxMSBAQAogZXh0ZXJuIHN0cnVjdCBjYmVfbWljX3RtX3JlZ3MgX19pb21lbSAqY2JlX2dldF9taWNfdG1fcmVncyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKTsKIGV4dGVybiBzdHJ1Y3QgY2JlX21pY190bV9yZWdzIF9faW9tZW0gKmNiZV9nZXRfY3B1X21pY190bV9yZWdzKGludCBjcHUpOwogCisvKiBzb21lIHV0aWxpdHkgZnVuY3Rpb25zIHRvIGRlYWwgd2l0aCBTTVQgKi8KK2V4dGVybiB1MzIgY2JlX2dldF9od190aHJlYWRfaWQoaW50IGNwdSk7CitleHRlcm4gdTMyIGNiZV9jcHVfdG9fbm9kZShpbnQgY3B1KTsKK2V4dGVybiB1MzIgY2JlX25vZGVfdG9fY3B1KGludCBub2RlKTsKKwogLyogSW5pdCB0aGlzIG1vZHVsZSBlYXJseSAqLwogZXh0ZXJuIHZvaWQgY2JlX3JlZ3NfaW5pdCh2b2lkKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2NiZV90aGVybWFsLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvY2JlX3RoZXJtYWwuYwppbmRleCA3MGUwZDk2Li5mMzcwZjBmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvY2JlX3RoZXJtYWwuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvY2JlX3RoZXJtYWwuYwpAQCAtMSw2ICsxLDMxIEBACiAvKgogICogdGhlcm1hbCBzdXBwb3J0IGZvciB0aGUgY2VsbCBwcm9jZXNzb3IKICAqCisgKiBUaGlzIG1vZHVsZSBhZGRzIHNvbWUgc3lzZnMgYXR0cmlidXRlcyB0byBjcHUgYW5kIHNwdSBub2Rlcy4KKyAqIEJhc2UgZm9yIG1lYXN1cmVtZW50cyBhcmUgdGhlIGRpZ2l0YWwgdGhlcm1hbCBzZW5zb3JzIChEVFMpCisgKiBsb2NhdGVkIG9uIHRoZSBjaGlwLgorICogVGhlIGFjY3VyYWN5IGlzIDIgZGVncmVlcywgc3RhcnRpbmcgZnJvbSA2NSB1cCB0byAxMjUgZGVncmVlcyBjZWxzaXVzCisgKiBUaGUgYXR0cmlidXRlcyBjYW4gYmUgZm91bmQgdW5kZXIKKyAqIC9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1L2NwdVgvdGhlcm1hbAorICogL3N5cy9kZXZpY2VzL3N5c3RlbS9zcHUvc3B1WC90aGVybWFsCisgKgorICogVGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIGFyZSBhZGRlZCBmb3IgZWFjaCBub2RlOgorICogdGVtcGVyYXR1cmU6CisgKgljb250YWlucyB0aGUgY3VycmVudCB0ZW1wZXJhdHVyZSBtZWFzdXJlZCBieSB0aGUgRFRTCisgKiB0aHJvdHRsZV9iZWdpbjoKKyAqCXRocm90dGxpbmcgYmVnaW5zIHdoZW4gdGVtcGVyYXR1cmUgaXMgZ3JlYXRlciBvciBlcXVhbCB0bworICoJdGhyb3R0bGVfYmVnaW4uIFNldHRpbmcgdGhpcyB2YWx1ZSB0byAxMjUgcHJldmVudHMgdGhyb3R0bGluZy4KKyAqIHRocm90dGxlX2VuZDoKKyAqCXRocm90dGxpbmcgaXMgYmVpbmcgY2Vhc2VkLCBpZiB0aGUgdGVtcGVyYXR1cmUgaXMgbG93ZXIgdGhhbgorICoJdGhyb3R0bGVfZW5kLiBEdWUgdG8gYSBkZWxheSBiZXR3ZWVuIGFwcGx5aW5nIHRocm90dGxpbmcgYW5kCisgKglhIHJlZHVjZWQgdGVtcGVyYXR1cmUgdGhpcyB2YWx1ZSBzaG91bGQgYmUgbGVzcyB0aGFuIHRocm90dGxlX2JlZ2luLgorICoJQSB2YWx1ZSBlcXVhbCB0byB0aHJvdHRsZV9iZWdpbiBwcm92aWRlcyBvbmx5IGEgdmVyeSBsaXR0bGUgaHlzdGVyZXNpcy4KKyAqIHRocm90dGxlX2Z1bGxfc3RvcDoKKyAqCUlmIHRoZSB0ZW1wZXJhdHJ1ZSBpcyBncmVhdGVyIG9yIGVxdWFsIHRvIHRocm90dGxlX2Z1bGxfc3RvcCwKKyAqCWZ1bGwgdGhyb3R0bGluZyBpcyBhcHBsaWVkIHRvIHRoZSBjcHUgb3Igc3B1LiBUaGlzIHZhbHVlIHNob3VsZCBiZQorICoJZ3JlYXRlciB0aGFuIHRocm90dGxlX2JlZ2luIGFuZCB0aHJvdHRsZV9lbmQuIFNldHRpbmcgdGhpcyB2YWx1ZSB0bworICoJNjUgcHJldmVudHMgdGhlIHVuaXQgZnJvbSBydW5uaW5nIGNvZGUgYXQgYWxsLgorICoKICAqIChDKSBDb3B5cmlnaHQgSUJNIERldXRzY2hsYW5kIEVudHdpY2tsdW5nIEdtYkggMjAwNQogICoKICAqIEF1dGhvcjogQ2hyaXN0aWFuIEtyYWZmdCA8a3JhZmZ0QGRlLmlibS5jb20+CkBAIC0zMSw2ICs1NiwyNiBAQAogI2luY2x1ZGUgImNiZV9yZWdzLmgiCiAjaW5jbHVkZSAic3B1X3ByaXYxX21taW8uaCIKIAorI2RlZmluZSBURU1QX01JTiA2NQorI2RlZmluZSBURU1QX01BWCAxMjUKKworI2RlZmluZSBTWVNERVZfUFJFRklYX0FUVFIoX3ByZWZpeCxfbmFtZSxfbW9kZSkJCQlcCitzdHJ1Y3Qgc3lzZGV2X2F0dHJpYnV0ZSBhdHRyXyAjIyBfcHJlZml4ICMjIF8gIyMgX25hbWUgPSB7CVwKKwkuYXR0ciA9IHsgLm5hbWUgPSBfX3N0cmluZ2lmeShfbmFtZSksIC5tb2RlID0gX21vZGUgfSwJXAorCS5zaG93CT0gX3ByZWZpeCAjIyBfc2hvd18gIyMgX25hbWUsCQkJXAorCS5zdG9yZQk9IF9wcmVmaXggIyMgX3N0b3JlXyAjIyBfbmFtZSwJCQlcCit9OworCitzdGF0aWMgaW5saW5lIHU4IHJlZ190b190ZW1wKHU4IHJlZ192YWx1ZSkKK3sKKwlyZXR1cm4gKChyZWdfdmFsdWUgJiAweDNmKSA8PCAxKSArIFRFTVBfTUlOOworfQorCitzdGF0aWMgaW5saW5lIHU4IHRlbXBfdG9fcmVnKHU4IHRlbXApCit7CisJcmV0dXJuICgodGVtcCAtIFRFTVBfTUlOKSA+PiAxKSAmIDB4M2Y7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgY2JlX3BtZF9yZWdzIF9faW9tZW0gKmdldF9wbWRfcmVncyhzdHJ1Y3Qgc3lzX2RldmljZSAqc3lzZGV2KQogewogCXN0cnVjdCBzcHUgKnNwdTsKQEAgLTQzLDE0ICs4OCwxNCBAQAogLyogcmV0dXJucyB0aGUgdmFsdWUgZm9yIGEgZ2l2ZW4gc3B1IGluIGEgZ2l2ZW4gcmVnaXN0ZXIgKi8KIHN0YXRpYyB1OCBzcHVfcmVhZF9yZWdpc3Rlcl92YWx1ZShzdHJ1Y3Qgc3lzX2RldmljZSAqc3lzZGV2LCB1bmlvbiBzcGVfcmVnIF9faW9tZW0gKnJlZykKIHsKLQl1bnNpZ25lZCBpbnQgKmlkOworCWNvbnN0IHVuc2lnbmVkIGludCAqaWQ7CiAJdW5pb24gc3BlX3JlZyB2YWx1ZTsKIAlzdHJ1Y3Qgc3B1ICpzcHU7CiAKIAkvKiBnZXR0aW5nIHRoZSBpZCBmcm9tIHRoZSByZWcgYXR0cmlidXRlIHdpbGwgbm90IHdvcmsgb24gZnV0dXJlIGRldmljZS10cmVlIGxheW91dHMKIAkgKiBpbiBmdXR1cmUgd2Ugc2hvdWxkIHN0b3JlIHRoZSBpZCB0byB0aGUgc3B1IHN0cnVjdCBhbmQgdXNlIGl0IGhlcmUgKi8KIAlzcHUgPSBjb250YWluZXJfb2Yoc3lzZGV2LCBzdHJ1Y3Qgc3B1LCBzeXNkZXYpOwotCWlkID0gKHVuc2lnbmVkIGludCAqKWdldF9wcm9wZXJ0eShzcHVfZGV2bm9kZShzcHUpLCAicmVnIiwgTlVMTCk7CisJaWQgPSBvZl9nZXRfcHJvcGVydHkoc3B1X2Rldm5vZGUoc3B1KSwgInJlZyIsIE5VTEwpOwogCXZhbHVlLnZhbCA9IGluX2JlNjQoJnJlZy0+dmFsKTsKIAogCXJldHVybiB2YWx1ZS5zcGVbKmlkXTsKQEAgLTU4LDIwICsxMDMsODEgQEAKIAogc3RhdGljIHNzaXplX3Qgc3B1X3Nob3dfdGVtcChzdHJ1Y3Qgc3lzX2RldmljZSAqc3lzZGV2LCBjaGFyICpidWYpCiB7Ci0JaW50IHZhbHVlOworCXU4IHZhbHVlOwogCXN0cnVjdCBjYmVfcG1kX3JlZ3MgX19pb21lbSAqcG1kX3JlZ3M7CiAKIAlwbWRfcmVncyA9IGdldF9wbWRfcmVncyhzeXNkZXYpOwogCiAJdmFsdWUgPSBzcHVfcmVhZF9yZWdpc3Rlcl92YWx1ZShzeXNkZXYsICZwbWRfcmVncy0+dHNfY3RzcjEpOwotCS8qIGNsZWFyIGFsbCBvdGhlciBiaXRzICovCi0JdmFsdWUgJj0gMHgzRjsKLQkvKiB0ZW1wIGlzIHN0b3JlZCBpbiBzdGVwcyBvZiAyIGRlZ3JlZXMgKi8KLQl2YWx1ZSAqPSAyOwotCS8qIGJhc2UgdGVtcCBpcyA2NSBkZWdyZWVzICovCi0JdmFsdWUgKz0gNjU7CiAKLQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgKGludCkgdmFsdWUpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCByZWdfdG9fdGVtcCh2YWx1ZSkpOworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X3Rocm90dGxlKHN0cnVjdCBjYmVfcG1kX3JlZ3MgX19pb21lbSAqcG1kX3JlZ3MsIGNoYXIgKmJ1ZiwgaW50IHBvcykKK3sKKwl1NjQgdmFsdWU7CisKKwl2YWx1ZSA9IGluX2JlNjQoJnBtZF9yZWdzLT50bV90cHIudmFsKTsKKwkvKiBhY2Nlc3MgdGhlIGNvcnJlc3BvbmRpbmcgYnl0ZSAqLworCXZhbHVlID4+PSBwb3M7CisJdmFsdWUgJj0gMHgzRjsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCByZWdfdG9fdGVtcCh2YWx1ZSkpOworfQorCitzdGF0aWMgc3NpemVfdCBzdG9yZV90aHJvdHRsZShzdHJ1Y3QgY2JlX3BtZF9yZWdzIF9faW9tZW0gKnBtZF9yZWdzLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBzaXplLCBpbnQgcG9zKQoreworCXU2NCByZWdfdmFsdWU7CisJaW50IHRlbXA7CisJdTY0IG5ld192YWx1ZTsKKwlpbnQgcmV0OworCisJcmV0ID0gc3NjYW5mKGJ1ZiwgIiV1IiwgJnRlbXApOworCisJaWYgKHJldCAhPSAxIHx8IHRlbXAgPCBURU1QX01JTiB8fCB0ZW1wID4gVEVNUF9NQVgpCisJCXJldHVybiAtRUlOVkFMOworCisJbmV3X3ZhbHVlID0gdGVtcF90b19yZWcodGVtcCk7CisKKwlyZWdfdmFsdWUgPSBpbl9iZTY0KCZwbWRfcmVncy0+dG1fdHByLnZhbCk7CisKKwkvKiB6ZXJvIG91dCBiaXRzIGZvciBuZXcgdmFsdWUgKi8KKwlyZWdfdmFsdWUgJj0gfigweGZmdWxsIDw8IHBvcyk7CisJLyogc2V0IGJpdHMgdG8gbmV3IHZhbHVlICovCisJcmVnX3ZhbHVlIHw9IG5ld192YWx1ZSA8PCBwb3M7CisKKwlvdXRfYmU2NCgmcG1kX3JlZ3MtPnRtX3Rwci52YWwsIHJlZ192YWx1ZSk7CisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNwdV9zaG93X3Rocm90dGxlX2VuZChzdHJ1Y3Qgc3lzX2RldmljZSAqc3lzZGV2LCBjaGFyICpidWYpCit7CisJcmV0dXJuIHNob3dfdGhyb3R0bGUoZ2V0X3BtZF9yZWdzKHN5c2RldiksIGJ1ZiwgMCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNwdV9zaG93X3Rocm90dGxlX2JlZ2luKHN0cnVjdCBzeXNfZGV2aWNlICpzeXNkZXYsIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc2hvd190aHJvdHRsZShnZXRfcG1kX3JlZ3Moc3lzZGV2KSwgYnVmLCA4KTsKK30KKworc3RhdGljIHNzaXplX3Qgc3B1X3Nob3dfdGhyb3R0bGVfZnVsbF9zdG9wKHN0cnVjdCBzeXNfZGV2aWNlICpzeXNkZXYsIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc2hvd190aHJvdHRsZShnZXRfcG1kX3JlZ3Moc3lzZGV2KSwgYnVmLCAxNik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNwdV9zdG9yZV90aHJvdHRsZV9lbmQoc3RydWN0IHN5c19kZXZpY2UgKnN5c2RldiwgY29uc3QgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwlyZXR1cm4gc3RvcmVfdGhyb3R0bGUoZ2V0X3BtZF9yZWdzKHN5c2RldiksIGJ1Ziwgc2l6ZSwgMCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNwdV9zdG9yZV90aHJvdHRsZV9iZWdpbihzdHJ1Y3Qgc3lzX2RldmljZSAqc3lzZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBzaXplKQoreworCXJldHVybiBzdG9yZV90aHJvdHRsZShnZXRfcG1kX3JlZ3Moc3lzZGV2KSwgYnVmLCBzaXplLCA4KTsKK30KKworc3RhdGljIHNzaXplX3Qgc3B1X3N0b3JlX3Rocm90dGxlX2Z1bGxfc3RvcChzdHJ1Y3Qgc3lzX2RldmljZSAqc3lzZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBzaXplKQoreworCXJldHVybiBzdG9yZV90aHJvdHRsZShnZXRfcG1kX3JlZ3Moc3lzZGV2KSwgYnVmLCBzaXplLCAxNik7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IHBwZV9zaG93X3RlbXAoc3RydWN0IHN5c19kZXZpY2UgKnN5c2RldiwgY2hhciAqYnVmLCBpbnQgcG9zKQpAQCAtODIsMTYgKzE4OCw5IEBACiAJcG1kX3JlZ3MgPSBjYmVfZ2V0X2NwdV9wbWRfcmVncyhzeXNkZXYtPmlkKTsKIAl2YWx1ZSA9IGluX2JlNjQoJnBtZF9yZWdzLT50c19jdHNyMik7CiAKLQkvKiBhY2Nlc3MgdGhlIGNvcnJlc3BvbmRpbmcgYnl0ZSAqLwotCXZhbHVlID4+PSBwb3M7Ci0JLyogY2xlYXIgYWxsIG90aGVyIGJpdHMgKi8KLQl2YWx1ZSAmPSAweDNGOwotCS8qIHRlbXAgaXMgc3RvcmVkIGluIHN0ZXBzIG9mIDIgZGVncmVlcyAqLwotCXZhbHVlICo9IDI7Ci0JLyogYmFzZSB0ZW1wIGlzIDY1IGRlZ3JlZXMgKi8KLQl2YWx1ZSArPSA2NTsKKwl2YWx1ZSA9ICh2YWx1ZSA+PiBwb3MpICYgMHgzZjsKIAotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCAoaW50KSB2YWx1ZSk7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHJlZ190b190ZW1wKHZhbHVlKSk7CiB9CiAKIApAQCAtMTA4LDEzICsyMDcsNTIgQEAKIAlyZXR1cm4gcHBlX3Nob3dfdGVtcChzeXNkZXYsIGJ1ZiwgMCk7CiB9CiAKK3N0YXRpYyBzc2l6ZV90IHBwZV9zaG93X3Rocm90dGxlX2VuZChzdHJ1Y3Qgc3lzX2RldmljZSAqc3lzZGV2LCBjaGFyICpidWYpCit7CisJcmV0dXJuIHNob3dfdGhyb3R0bGUoY2JlX2dldF9jcHVfcG1kX3JlZ3Moc3lzZGV2LT5pZCksIGJ1ZiwgMzIpOworfQorCitzdGF0aWMgc3NpemVfdCBwcGVfc2hvd190aHJvdHRsZV9iZWdpbihzdHJ1Y3Qgc3lzX2RldmljZSAqc3lzZGV2LCBjaGFyICpidWYpCit7CisJcmV0dXJuIHNob3dfdGhyb3R0bGUoY2JlX2dldF9jcHVfcG1kX3JlZ3Moc3lzZGV2LT5pZCksIGJ1ZiwgNDApOworfQorCitzdGF0aWMgc3NpemVfdCBwcGVfc2hvd190aHJvdHRsZV9mdWxsX3N0b3Aoc3RydWN0IHN5c19kZXZpY2UgKnN5c2RldiwgY2hhciAqYnVmKQoreworCXJldHVybiBzaG93X3Rocm90dGxlKGNiZV9nZXRfY3B1X3BtZF9yZWdzKHN5c2Rldi0+aWQpLCBidWYsIDQ4KTsKK30KKworc3RhdGljIHNzaXplX3QgcHBlX3N0b3JlX3Rocm90dGxlX2VuZChzdHJ1Y3Qgc3lzX2RldmljZSAqc3lzZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBzaXplKQoreworCXJldHVybiBzdG9yZV90aHJvdHRsZShjYmVfZ2V0X2NwdV9wbWRfcmVncyhzeXNkZXYtPmlkKSwgYnVmLCBzaXplLCAzMik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHBwZV9zdG9yZV90aHJvdHRsZV9iZWdpbihzdHJ1Y3Qgc3lzX2RldmljZSAqc3lzZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBzaXplKQoreworCXJldHVybiBzdG9yZV90aHJvdHRsZShjYmVfZ2V0X2NwdV9wbWRfcmVncyhzeXNkZXYtPmlkKSwgYnVmLCBzaXplLCA0MCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHBwZV9zdG9yZV90aHJvdHRsZV9mdWxsX3N0b3Aoc3RydWN0IHN5c19kZXZpY2UgKnN5c2RldiwgY29uc3QgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwlyZXR1cm4gc3RvcmVfdGhyb3R0bGUoY2JlX2dldF9jcHVfcG1kX3JlZ3Moc3lzZGV2LT5pZCksIGJ1Ziwgc2l6ZSwgNDgpOworfQorCisKIHN0YXRpYyBzdHJ1Y3Qgc3lzZGV2X2F0dHJpYnV0ZSBhdHRyX3NwdV90ZW1wZXJhdHVyZSA9IHsKIAkuYXR0ciA9IHsubmFtZSA9ICJ0ZW1wZXJhdHVyZSIsIC5tb2RlID0gMDQwMCB9LAogCS5zaG93ID0gc3B1X3Nob3dfdGVtcCwKIH07CiAKK3N0YXRpYyBTWVNERVZfUFJFRklYX0FUVFIoc3B1LCB0aHJvdHRsZV9lbmQsIDA2MDApOworc3RhdGljIFNZU0RFVl9QUkVGSVhfQVRUUihzcHUsIHRocm90dGxlX2JlZ2luLCAwNjAwKTsKK3N0YXRpYyBTWVNERVZfUFJFRklYX0FUVFIoc3B1LCB0aHJvdHRsZV9mdWxsX3N0b3AsIDA2MDApOworCisKIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpzcHVfYXR0cmlidXRlc1tdID0gewogCSZhdHRyX3NwdV90ZW1wZXJhdHVyZS5hdHRyLAorCSZhdHRyX3NwdV90aHJvdHRsZV9lbmQuYXR0ciwKKwkmYXR0cl9zcHVfdGhyb3R0bGVfYmVnaW4uYXR0ciwKKwkmYXR0cl9zcHVfdGhyb3R0bGVfZnVsbF9zdG9wLmF0dHIsCiAJTlVMTCwKIH07CiAKQEAgLTEzMyw5ICsyNzEsMTYgQEAKIAkuc2hvdyA9IHBwZV9zaG93X3RlbXAxLAogfTsKIAorc3RhdGljIFNZU0RFVl9QUkVGSVhfQVRUUihwcGUsIHRocm90dGxlX2VuZCwgMDYwMCk7CitzdGF0aWMgU1lTREVWX1BSRUZJWF9BVFRSKHBwZSwgdGhyb3R0bGVfYmVnaW4sIDA2MDApOworc3RhdGljIFNZU0RFVl9QUkVGSVhfQVRUUihwcGUsIHRocm90dGxlX2Z1bGxfc3RvcCwgMDYwMCk7CisKIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpwcGVfYXR0cmlidXRlc1tdID0gewogCSZhdHRyX3BwZV90ZW1wZXJhdHVyZTAuYXR0ciwKIAkmYXR0cl9wcGVfdGVtcGVyYXR1cmUxLmF0dHIsCisJJmF0dHJfcHBlX3Rocm90dGxlX2VuZC5hdHRyLAorCSZhdHRyX3BwZV90aHJvdHRsZV9iZWdpbi5hdHRyLAorCSZhdHRyX3BwZV90aHJvdHRsZV9mdWxsX3N0b3AuYXR0ciwKIAlOVUxMLAogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2ludGVycnVwdC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2ludGVycnVwdC5jCmluZGV4IDY2NjZkMDMuLjRmYzRlOTI3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvaW50ZXJydXB0LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2ludGVycnVwdC5jCkBAIC0yNjEsNyArMjYxLDcgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAJaWYgKGludHNpemUgIT0gMSkKIAkJcmV0dXJuIC1FTk9ERVY7Ci0JdmFsID0gZ2V0X3Byb3BlcnR5KGN0LCAiI2ludGVycnVwdC1jZWxscyIsIE5VTEwpOworCXZhbCA9IG9mX2dldF9wcm9wZXJ0eShjdCwgIiNpbnRlcnJ1cHQtY2VsbHMiLCBOVUxMKTsKIAlpZiAodmFsID09IE5VTEwgfHwgKnZhbCAhPSAxKQogCQlyZXR1cm4gLUVOT0RFVjsKIApAQCAtMzI3LDcgKzMyNyw3IEBACiAJCWlmICghZGV2aWNlX2lzX2NvbXBhdGlibGUoZG4sCiAJCQkJICAgICAiSUJNLENCRUEtSW50ZXJuYWwtSW50ZXJydXB0LUNvbnRyb2xsZXIiKSkKIAkJCWNvbnRpbnVlOwotCQlucCA9IGdldF9wcm9wZXJ0eShkbiwgImlibSxpbnRlcnJ1cHQtc2VydmVyLXJhbmdlcyIsIE5VTEwpOworCQlucCA9IG9mX2dldF9wcm9wZXJ0eShkbiwgImlibSxpbnRlcnJ1cHQtc2VydmVyLXJhbmdlcyIsIE5VTEwpOwogCQlpZiAobnAgPT0gTlVMTCkgewogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiSUlDOiBDUFUgYXNzb2NpYXRpb24gbm90IGZvdW5kXG4iKTsKIAkJCW9mX25vZGVfcHV0KGRuKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9pby13b3JrYXJvdW5kcy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2lvLXdvcmthcm91bmRzLmMKaW5kZXggN2M3MzEyOC4uZDY4ZDkyMCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2lvLXdvcmthcm91bmRzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2lvLXdvcmthcm91bmRzLmMKQEAgLTMxOCw3ICszMTgsNyBAQAogCSAqLwogCWxpc3RfZm9yX2VhY2hfZW50cnkocGhiLCAmaG9zZV9saXN0LCBsaXN0X25vZGUpIHsKIAkJc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBoYi0+YXJjaF9kYXRhOwotCQljb25zdCBjaGFyICptb2RlbCA9IGdldF9wcm9wZXJ0eShucCwgIm1vZGVsIiwgTlVMTCk7CisJCWNvbnN0IGNoYXIgKm1vZGVsID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAibW9kZWwiLCBOVUxMKTsKIAogCQkvKiBJZiBubyBtb2RlbCBwcm9wZXJ0eSBvciBuYW1lIGlzbid0IGV4YWN0bHkgInBjaSIsIHNraXAgKi8KIAkJaWYgKG1vZGVsID09IE5VTEwgfHwgc3RyY21wKG5wLT5uYW1lLCAicGNpIikpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvaW9tbXUuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9pb21tdS5jCmluZGV4IDY3ZDYxN2IuLjc2MGNhYTcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9pb21tdS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9pb21tdS5jCkBAIC0yOTEsOSArMjkxLDkgQEAKIAkJY29uc3QgdW5zaWduZWQgaW50ICpuaWRwOwogCQljb25zdCB1bnNpZ25lZCBsb25nICp0bXA7CiAKLQkJbmlkcCA9IGdldF9wcm9wZXJ0eShucCwgIm5vZGUtaWQiLCBOVUxMKTsKKwkJbmlkcCA9IG9mX2dldF9wcm9wZXJ0eShucCwgIm5vZGUtaWQiLCBOVUxMKTsKIAkJaWYgKG5pZHAgJiYgKm5pZHAgPT0gbmlkKSB7Ci0JCQl0bXAgPSBnZXRfcHJvcGVydHkobnAsICJpb2MtdHJhbnNsYXRpb24iLCBOVUxMKTsKKwkJCXRtcCA9IG9mX2dldF9wcm9wZXJ0eShucCwgImlvYy10cmFuc2xhdGlvbiIsIE5VTEwpOwogCQkJaWYgKHRtcCkgewogCQkJCSpiYXNlID0gKnRtcDsKIAkJCQlvZl9ub2RlX3B1dChucCk7CkBAIC00MzAsNyArNDMwLDcgQEAKIAlzdHJ1Y3QgaW9tbXVfd2luZG93ICp3aW5kb3c7CiAJY29uc3QgdW5zaWduZWQgaW50ICppb2lkOwogCi0JaW9pZCA9IGdldF9wcm9wZXJ0eShucCwgImlvaWQiLCBOVUxMKTsKKwlpb2lkID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAiaW9pZCIsIE5VTEwpOwogCWlmIChpb2lkID09IE5VTEwpCiAJCXByaW50ayhLRVJOX1dBUk5JTkcgImlvbW11OiBtaXNzaW5nIGlvaWQgZm9yICVzIHVzaW5nIDBcbiIsCiAJCSAgICAgICBucC0+ZnVsbF9uYW1lKTsKQEAgLTQ5Niw3ICs0OTYsNyBAQAogCXN0cnVjdCBkZXZfYXJjaGRhdGEgKmFyY2hkYXRhID0gJmRldi0+YXJjaGRhdGE7CiAKIAkvKiBJZiB3ZSBydW4gd2l0aG91dCBpb21tdSwgbm8gbmVlZCB0byBkbyBhbnl0aGluZyAqLwotCWlmIChwY2lfZG1hX29wcyA9PSAmZG1hX2RpcmVjdF9vcHMpCisJaWYgKGdldF9wY2lfZG1hX29wcygpID09ICZkbWFfZGlyZWN0X29wcykKIAkJcmV0dXJuOwogCiAJLyogQ3VycmVudCBpbXBsZW1lbnRhdGlvbiB1c2VzIHRoZSBmaXJzdCB3aW5kb3cgYXZhaWxhYmxlIGluIHRoYXQKQEAgLTUzMCw3ICs1MzAsNyBAQAogCQlyZXR1cm4gMDsKIAogCS8qIFdlIHVzZSB0aGUgUENJIERNQSBvcHMgKi8KLQlkZXYtPmFyY2hkYXRhLmRtYV9vcHMgPSBwY2lfZG1hX29wczsKKwlkZXYtPmFyY2hkYXRhLmRtYV9vcHMgPSBnZXRfcGNpX2RtYV9vcHMoKTsKIAogCWNlbGxfZG1hX2Rldl9zZXR1cChkZXYpOwogCkBAIC01NDksNyArNTQ5LDcgQEAKIAl1bnNpZ25lZCBsb25nIGluZGV4OwogCiAJLyogVXNlIGlibSxkbWEtd2luZG93IGlmIGF2YWlsYWJsZSwgZWxzZSwgaGFyZCBjb2RlICEgKi8KLQlkbWFfd2luZG93ID0gZ2V0X3Byb3BlcnR5KG5wLCAiaWJtLGRtYS13aW5kb3ciLCBOVUxMKTsKKwlkbWFfd2luZG93ID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAiaWJtLGRtYS13aW5kb3ciLCBOVUxMKTsKIAlpZiAoZG1hX3dpbmRvdyA9PSBOVUxMKSB7CiAJCSpiYXNlID0gMDsKIAkJKnNpemUgPSAweDgwMDAwMDAwdTsKQEAgLTY0Niw3ICs2NDYsNyBAQAogCXVuc2lnbmVkIGxvbmcgYmFzZSA9IDAsIHNpemU7CiAKIAkvKiBXaGVuIG5vIGlvbW11IGlzIHByZXNlbnQsIHdlIHVzZSBkaXJlY3QgRE1BIG9wcyAqLwotCXBjaV9kbWFfb3BzID0gJmRtYV9kaXJlY3Rfb3BzOworCXNldF9wY2lfZG1hX29wcygmZG1hX2RpcmVjdF9vcHMpOwogCiAJLyogRmlyc3QgbWFrZSBzdXJlIGFsbCBJT0MgdHJhbnNsYXRpb24gaXMgdHVybmVkIG9mZiAqLwogCWNlbGxfZGlzYWJsZV9pb21tdXMoKTsKQEAgLTczNCw3ICs3MzQsNyBAQAogCX0KIAogCS8qIFNldHVwIGRlZmF1bHQgUENJIGlvbW11IG9wcyAqLwotCXBjaV9kbWFfb3BzID0gJmRtYV9pb21tdV9vcHM7CisJc2V0X3BjaV9kbWFfb3BzKCZkbWFfaW9tbXVfb3BzKTsKIAogIGJhaWw6CiAJLyogUmVnaXN0ZXIgY2FsbGJhY2tzIG9uIE9GIHBsYXRmb3JtIGRldmljZSBhZGRpdGlvbi9yZW1vdmFsCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvcmFzLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvcmFzLmMKaW5kZXggMDk4NGM3MC4uMzk2MWEwOCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3Jhcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9yYXMuYwpAQCAtMywxMSArMywxMyBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CiAKICNpbmNsdWRlIDxhc20vcmVnLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3Byb20uaD4KICNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgorI2luY2x1ZGUgPGFzbS9ydGFzLmg+CiAKICNpbmNsdWRlICJyYXMuaCIKICNpbmNsdWRlICJjYmVfcmVncy5oIgpAQCAtODIsNiArODQsMTY0IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0cnVjdCBwdGNhbF9hcmVhIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJaW50IG5pZDsKKwlpbnQgb3JkZXI7CisJc3RydWN0IHBhZ2UgKnBhZ2VzOworfTsKKworc3RhdGljIExJU1RfSEVBRChwdGNhbF9saXN0KTsKKworc3RhdGljIGludCBwdGNhbF9zdGFydF90b2ssIHB0Y2FsX3N0b3BfdG9rOworCitzdGF0aWMgaW50IF9faW5pdCBjYmVfcHRjYWxfZW5hYmxlX29uX25vZGUoaW50IG5pZCwgaW50IG9yZGVyKQoreworCXN0cnVjdCBwdGNhbF9hcmVhICphcmVhOworCWludCByZXQgPSAtRU5PTUVNOworCXVuc2lnbmVkIGxvbmcgYWRkcjsKKworI2lmZGVmIENPTkZJR19DUkFTSF9EVU1QCisJcnRhc19jYWxsKHB0Y2FsX3N0b3BfdG9rLCAxLCAxLCBOVUxMLCBuaWQpOworI2VuZGlmCisKKwlhcmVhID0ga21hbGxvYyhzaXplb2YoKmFyZWEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWFyZWEpCisJCWdvdG8gb3V0X2VycjsKKworCWFyZWEtPm5pZCA9IG5pZDsKKwlhcmVhLT5vcmRlciA9IG9yZGVyOworCWFyZWEtPnBhZ2VzID0gYWxsb2NfcGFnZXNfbm9kZShhcmVhLT5uaWQsIEdGUF9LRVJORUwsIGFyZWEtPm9yZGVyKTsKKworCWlmICghYXJlYS0+cGFnZXMpCisJCWdvdG8gb3V0X2ZyZWVfYXJlYTsKKworCWFkZHIgPSBfX3BhKHBhZ2VfYWRkcmVzcyhhcmVhLT5wYWdlcykpOworCisJcmV0ID0gLUVJTzsKKwlpZiAocnRhc19jYWxsKHB0Y2FsX3N0YXJ0X3RvaywgMywgMSwgTlVMTCwgYXJlYS0+bmlkLAorCQkJCSh1bnNpZ25lZCBpbnQpKGFkZHIgPj4gMzIpLAorCQkJCSh1bnNpZ25lZCBpbnQpKGFkZHIgJiAweGZmZmZmZmZmKSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogZXJyb3IgZW5hYmxpbmcgUFRDQUwgb24gbm9kZSAlZCFcbiIsCisJCQkJX19GVU5DVElPTl9fLCBuaWQpOworCQlnb3RvIG91dF9mcmVlX3BhZ2VzOworCX0KKworCWxpc3RfYWRkKCZhcmVhLT5saXN0LCAmcHRjYWxfbGlzdCk7CisKKwlyZXR1cm4gMDsKKworb3V0X2ZyZWVfcGFnZXM6CisJX19mcmVlX3BhZ2VzKGFyZWEtPnBhZ2VzLCBhcmVhLT5vcmRlcik7CitvdXRfZnJlZV9hcmVhOgorCWtmcmVlKGFyZWEpOworb3V0X2VycjoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9faW5pdCBjYmVfcHRjYWxfZW5hYmxlKHZvaWQpCit7CisJY29uc3QgdTMyICpzaXplOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisJaW50IG9yZGVyLCBmb3VuZF9taWMgPSAwOworCisJbnAgPSBvZl9maW5kX25vZGVfYnlfcGF0aCgiL3J0YXMiKTsKKwlpZiAoIW5wKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXNpemUgPSBvZl9nZXRfcHJvcGVydHkobnAsICJpYm0sY2JlLXB0Y2FsLXNpemUiLCBOVUxMKTsKKwlpZiAoIXNpemUpCisJCXJldHVybiAtRU5PREVWOworCisJcHJfZGVidWcoIiVzOiBlbmFibGluZyBQVENBTCwgc2l6ZSA9IDB4JXhcbiIsIF9fRlVOQ1RJT05fXywgKnNpemUpOworCW9yZGVyID0gZ2V0X29yZGVyKCpzaXplKTsKKwlvZl9ub2RlX3B1dChucCk7CisKKwkvKiBzdXBwb3J0IGZvciBtYWx0YSBkZXZpY2UgdHJlZXMsIHdpdGggYmVAL21pY0Agbm9kZXMgKi8KKwlmb3JfZWFjaF9ub2RlX2J5X3R5cGUobnAsICJtaWMtdG0iKSB7CisJCWNiZV9wdGNhbF9lbmFibGVfb25fbm9kZShvZl9ub2RlX3RvX25pZChucCksIG9yZGVyKTsKKwkJZm91bmRfbWljID0gMTsKKwl9CisKKwlpZiAoZm91bmRfbWljKQorCQlyZXR1cm4gMDsKKworCS8qIHN1cHBvcnQgZm9yIG9sZGVyIGRldmljZSB0cmVlIC0gdXNlIGNwdSBub2RlcyAqLworCWZvcl9lYWNoX25vZGVfYnlfdHlwZShucCwgImNwdSIpIHsKKwkJY29uc3QgdTMyICpuaWQgPSBvZl9nZXRfcHJvcGVydHkobnAsICJub2RlLWlkIiwgTlVMTCk7CisJCWlmICghbmlkKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBub2RlICVzIGlzIG1pc3Npbmcgbm9kZS1pZD9cbiIsCisJCQkJCV9fRlVOQ1RJT05fXywgbnAtPmZ1bGxfbmFtZSk7CisJCQljb250aW51ZTsKKwkJfQorCQljYmVfcHRjYWxfZW5hYmxlX29uX25vZGUoKm5pZCwgb3JkZXIpOworCQlmb3VuZF9taWMgPSAxOworCX0KKworCXJldHVybiBmb3VuZF9taWMgPyAwIDogLUVOT0RFVjsKK30KKworc3RhdGljIGludCBjYmVfcHRjYWxfZGlzYWJsZSh2b2lkKQoreworCXN0cnVjdCBwdGNhbF9hcmVhICphcmVhLCAqdG1wOworCWludCByZXQgPSAwOworCisJcHJfZGVidWcoIiVzOiBkaXNhYmxpbmcgUFRDQUxcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYXJlYSwgdG1wLCAmcHRjYWxfbGlzdCwgbGlzdCkgeworCQkvKiBkaXNhYmxlIHB0Y2FsIG9uIHRoaXMgbm9kZSAqLworCQlpZiAocnRhc19jYWxsKHB0Y2FsX3N0b3BfdG9rLCAxLCAxLCBOVUxMLCBhcmVhLT5uaWQpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBlcnJvciBkaXNhYmxpbmcgUFRDQUwgIgorCQkJCQkib24gbm9kZSAlZCFcbiIsIF9fRlVOQ1RJT05fXywKKwkJCQkJYXJlYS0+bmlkKTsKKwkJCXJldCA9IC1FSU87CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIGVuc3VyZSB3ZSBjYW4gYWNjZXNzIHRoZSBQVENBTCBhcmVhICovCisJCW1lbXNldChwYWdlX2FkZHJlc3MoYXJlYS0+cGFnZXMpLCAwLAorCQkJCTEgPDwgKGFyZWEtPm9yZGVyICsgUEFHRV9TSElGVCkpOworCisJCS8qIGNsZWFuIHVwICovCisJCWxpc3RfZGVsKCZhcmVhLT5saXN0KTsKKwkJX19mcmVlX3BhZ2VzKGFyZWEtPnBhZ2VzLCBhcmVhLT5vcmRlcik7CisJCWtmcmVlKGFyZWEpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgY2JlX3B0Y2FsX25vdGlmeV9yZWJvb3Qoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwKKwkJdW5zaWduZWQgbG9uZyBjb2RlLCB2b2lkICpkYXRhKQoreworCXJldHVybiBjYmVfcHRjYWxfZGlzYWJsZSgpOworfQorCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGNiZV9wdGNhbF9yZWJvb3Rfbm90aWZpZXIgPSB7CisJLm5vdGlmaWVyX2NhbGwgPSBjYmVfcHRjYWxfbm90aWZ5X3JlYm9vdAorfTsKKworaW50IF9faW5pdCBjYmVfcHRjYWxfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisJcHRjYWxfc3RhcnRfdG9rID0gcnRhc190b2tlbigiaWJtLGNiZS1zdGFydC1wdGNhbCIpOworCXB0Y2FsX3N0b3BfdG9rID0gcnRhc190b2tlbigiaWJtLGNiZS1zdG9wLXB0Y2FsIik7CisKKwlpZiAocHRjYWxfc3RhcnRfdG9rID09IFJUQVNfVU5LTk9XTl9TRVJWSUNFCisJCQl8fCBwdGNhbF9zdG9wX3RvayA9PSBSVEFTX1VOS05PV05fU0VSVklDRSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXQgPSByZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJmNiZV9wdGNhbF9yZWJvb3Rfbm90aWZpZXIpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJDYW4ndCBkaXNhYmxlIFBUQ0FMLCBzbyBub3QgZW5hYmxpbmdcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiBjYmVfcHRjYWxfZW5hYmxlKCk7Cit9CisKK2FyY2hfaW5pdGNhbGwoY2JlX3B0Y2FsX2luaXQpOworCiB2b2lkIF9faW5pdCBjYmVfcmFzX2luaXQodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIGhpZDA7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc2V0dXAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zZXR1cC5jCmluZGV4IDM2OTg5YzIuLjU0Yjk2MTggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zZXR1cC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zZXR1cC5jCkBAIC03MSw3ICs3MSw3IEBACiAKIAlyb290ID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgoIi8iKTsKIAlpZiAocm9vdCkKLQkJbW9kZWwgPSBnZXRfcHJvcGVydHkocm9vdCwgIm1vZGVsIiwgTlVMTCk7CisJCW1vZGVsID0gb2ZfZ2V0X3Byb3BlcnR5KHJvb3QsICJtb2RlbCIsIE5VTEwpOwogCXNlcV9wcmludGYobSwgIm1hY2hpbmVcdFx0OiBDSFJQICVzXG4iLCBtb2RlbCk7CiAJb2Zfbm9kZV9wdXQocm9vdCk7CiB9CkBAIC0xOTAsMTUgKzE5MCw2IEBACiAJcmV0dXJuIDE7CiB9CiAKLS8qCi0gKiBDZWxsIGhhcyBubyBsZWdhY3kgSU87IGFueXRoaW5nIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiBoYXMgdG8KLSAqIGZhaWwgb3IgYmFkIHRoaW5ncyB3aWxsIGhhcHBlbgotICovCi1zdGF0aWMgaW50IGNlbGxfY2hlY2tfbGVnYWN5X2lvcG9ydCh1bnNpZ25lZCBpbnQgYmFzZXBvcnQpCi17Ci0JcmV0dXJuIC1FTk9ERVY7Ci19Ci0KIGRlZmluZV9tYWNoaW5lKGNlbGwpIHsKIAkubmFtZQkJCT0gIkNlbGwiLAogCS5wcm9iZQkJCT0gY2VsbF9wcm9iZSwKQEAgLTIxMSw3ICsyMDIsNiBAQAogCS5nZXRfcnRjX3RpbWUJCT0gcnRhc19nZXRfcnRjX3RpbWUsCiAJLnNldF9ydGNfdGltZQkJPSBydGFzX3NldF9ydGNfdGltZSwKIAkuY2FsaWJyYXRlX2RlY3IJCT0gZ2VuZXJpY19jYWxpYnJhdGVfZGVjciwKLQkuY2hlY2tfbGVnYWN5X2lvcG9ydAk9IGNlbGxfY2hlY2tfbGVnYWN5X2lvcG9ydCwKIAkucHJvZ3Jlc3MJCT0gY2VsbF9wcm9ncmVzcywKIAkuaW5pdF9JUlEgICAgICAgCT0gY2VsbF9pbml0X2lycSwKIAkucGNpX3NldHVwX3BoYgkJPSBydGFzX3NldHVwX3BoYiwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcGlkZXItcGljLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3BpZGVyLXBpYy5jCmluZGV4IDIxYTllYmQuLmZiMWYxNTcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcGlkZXItcGljLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwaWRlci1waWMuYwpAQCAtMjU0LDI1ICsyNTQsMjUgQEAKIAl9CiAKIAkvKiBOb3cgZG8gdGhlIGhvcnJpYmxlIGhhY2tzICovCi0JdG1wID0gZ2V0X3Byb3BlcnR5KHBpYy0+b2Zfbm9kZSwgIiNpbnRlcnJ1cHQtY2VsbHMiLCBOVUxMKTsKKwl0bXAgPSBvZl9nZXRfcHJvcGVydHkocGljLT5vZl9ub2RlLCAiI2ludGVycnVwdC1jZWxscyIsIE5VTEwpOwogCWlmICh0bXAgPT0gTlVMTCkKIAkJcmV0dXJuIE5PX0lSUTsKIAlpbnRzaXplID0gKnRtcDsKLQlpbWFwID0gZ2V0X3Byb3BlcnR5KHBpYy0+b2Zfbm9kZSwgImludGVycnVwdC1tYXAiLCAmaW1hcGxlbik7CisJaW1hcCA9IG9mX2dldF9wcm9wZXJ0eShwaWMtPm9mX25vZGUsICJpbnRlcnJ1cHQtbWFwIiwgJmltYXBsZW4pOwogCWlmIChpbWFwID09IE5VTEwgfHwgaW1hcGxlbiA8IChpbnRzaXplICsgMSkpCiAJCXJldHVybiBOT19JUlE7CiAJaWljID0gb2ZfZmluZF9ub2RlX2J5X3BoYW5kbGUoaW1hcFtpbnRzaXplXSk7CiAJaWYgKGlpYyA9PSBOVUxMKQogCQlyZXR1cm4gTk9fSVJROwogCWltYXAgKz0gaW50c2l6ZSArIDE7Ci0JdG1wID0gZ2V0X3Byb3BlcnR5KGlpYywgIiNpbnRlcnJ1cHQtY2VsbHMiLCBOVUxMKTsKKwl0bXAgPSBvZl9nZXRfcHJvcGVydHkoaWljLCAiI2ludGVycnVwdC1jZWxscyIsIE5VTEwpOwogCWlmICh0bXAgPT0gTlVMTCkKIAkJcmV0dXJuIE5PX0lSUTsKIAlpbnRzaXplID0gKnRtcDsKIAkvKiBBc3N1bWUgdW5pdCBpcyBsYXN0IGVudHJ5IG9mIGludGVycnVwdCBzcGVjaWZpZXIgKi8KIAl1bml0ID0gaW1hcFtpbnRzaXplIC0gMV07CiAJLyogT2ssIHdlIGhhdmUgYSB1bml0LCBub3cgbGV0J3MgdHJ5IHRvIGdldCB0aGUgbm9kZSAqLwotCXRtcCA9IGdldF9wcm9wZXJ0eShpaWMsICJpYm0saW50ZXJydXB0LXNlcnZlci1yYW5nZXMiLCBOVUxMKTsKKwl0bXAgPSBvZl9nZXRfcHJvcGVydHkoaWljLCAiaWJtLGludGVycnVwdC1zZXJ2ZXItcmFuZ2VzIiwgTlVMTCk7CiAJaWYgKHRtcCA9PSBOVUxMKSB7CiAJCW9mX25vZGVfcHV0KGlpYyk7CiAJCXJldHVybiBOT19JUlE7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1X2Jhc2UuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVfYmFzZS5jCmluZGV4IGViYTdhMjYuLmZlYzUxNTIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVfYmFzZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVfYmFzZS5jCkBAIC0zNiwxMiArMzYsMTQgQEAKICNpbmNsdWRlIDxhc20veG1vbi5oPgogCiBjb25zdCBzdHJ1Y3Qgc3B1X21hbmFnZW1lbnRfb3BzICpzcHVfbWFuYWdlbWVudF9vcHM7CitFWFBPUlRfU1lNQk9MX0dQTChzcHVfbWFuYWdlbWVudF9vcHMpOworCiBjb25zdCBzdHJ1Y3Qgc3B1X3ByaXYxX29wcyAqc3B1X3ByaXYxX29wczsKIAogc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgc3B1X2xpc3RbTUFYX05VTU5PREVTXTsKIHN0YXRpYyBMSVNUX0hFQUQoc3B1X2Z1bGxfbGlzdCk7CiBzdGF0aWMgREVGSU5FX01VVEVYKHNwdV9tdXRleCk7Ci1zdGF0aWMgc3BpbmxvY2tfdCBzcHVfbGlzdF9sb2NrID0gU1BJTl9MT0NLX1VOTE9DS0VEOworc3RhdGljIERFRklORV9TUElOTE9DSyhzcHVfbGlzdF9sb2NrKTsKIAogRVhQT1JUX1NZTUJPTF9HUEwoc3B1X3ByaXYxX29wcyk7CiAKQEAgLTI5MCw3ICsyOTIsNiBAQAogCiAJcmV0dXJuIHN0YXQgPyBJUlFfSEFORExFRCA6IElSUV9OT05FOwogfQotRVhQT1JUX1NZTUJPTF9HUEwoc3B1X2lycV9jbGFzc18xX2JvdHRvbSk7CiAKIHN0YXRpYyBpcnFyZXR1cm5fdAogc3B1X2lycV9jbGFzc18yKGludCBpcnEsIHZvaWQgKmRhdGEpCkBAIC00MzEsMTAgKzQzMiwxMSBAQAogCQlzcHUgPSBsaXN0X2VudHJ5KHNwdV9saXN0W25vZGVdLm5leHQsIHN0cnVjdCBzcHUsIGxpc3QpOwogCQlsaXN0X2RlbF9pbml0KCZzcHUtPmxpc3QpOwogCQlwcl9kZWJ1ZygiR290IFNQVSAlZCAlZFxuIiwgc3B1LT5udW1iZXIsIHNwdS0+bm9kZSk7Ci0JCXNwdV9pbml0X2NoYW5uZWxzKHNwdSk7CiAJfQogCW11dGV4X3VubG9jaygmc3B1X211dGV4KTsKIAorCWlmIChzcHUpCisJCXNwdV9pbml0X2NoYW5uZWxzKHNwdSk7CiAJcmV0dXJuIHNwdTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHNwdV9hbGxvY19ub2RlKTsKQEAgLTQ2MSwxMDggKzQ2Myw2IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChzcHVfZnJlZSk7CiAKLXN0YXRpYyBpbnQgc3B1X2hhbmRsZV9tbV9mYXVsdChzdHJ1Y3Qgc3B1ICpzcHUpCi17Ci0Jc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBzcHUtPm1tOwotCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOwotCXU2NCBlYSwgZHNpc3IsIGlzX3dyaXRlOwotCWludCByZXQ7Ci0KLQllYSA9IHNwdS0+ZGFyOwotCWRzaXNyID0gc3B1LT5kc2lzcjsKLSNpZiAwCi0JaWYgKCFJU19WQUxJRF9FQShlYSkpIHsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotI2VuZGlmIC8qIFhYWCAqLwotCWlmIChtbSA9PSBOVUxMKSB7Ci0JCXJldHVybiAtRUZBVUxUOwotCX0KLQlpZiAobW0tPnBnZCA9PSBOVUxMKSB7Ci0JCXJldHVybiAtRUZBVUxUOwotCX0KLQotCWRvd25fcmVhZCgmbW0tPm1tYXBfc2VtKTsKLQl2bWEgPSBmaW5kX3ZtYShtbSwgZWEpOwotCWlmICghdm1hKQotCQlnb3RvIGJhZF9hcmVhOwotCWlmICh2bWEtPnZtX3N0YXJ0IDw9IGVhKQotCQlnb3RvIGdvb2RfYXJlYTsKLQlpZiAoISh2bWEtPnZtX2ZsYWdzICYgVk1fR1JPV1NET1dOKSkKLQkJZ290byBiYWRfYXJlYTsKLSNpZiAwCi0JaWYgKGV4cGFuZF9zdGFjayh2bWEsIGVhKSkKLQkJZ290byBiYWRfYXJlYTsKLSNlbmRpZiAvKiBYWFggKi8KLWdvb2RfYXJlYToKLQlpc193cml0ZSA9IGRzaXNyICYgTUZDX0RTSVNSX0FDQ0VTU19QVVQ7Ci0JaWYgKGlzX3dyaXRlKSB7Ci0JCWlmICghKHZtYS0+dm1fZmxhZ3MgJiBWTV9XUklURSkpCi0JCQlnb3RvIGJhZF9hcmVhOwotCX0gZWxzZSB7Ci0JCWlmIChkc2lzciAmIE1GQ19EU0lTUl9BQ0NFU1NfREVOSUVEKQotCQkJZ290byBiYWRfYXJlYTsKLQkJaWYgKCEodm1hLT52bV9mbGFncyAmIChWTV9SRUFEIHwgVk1fRVhFQykpKQotCQkJZ290byBiYWRfYXJlYTsKLQl9Ci0JcmV0ID0gMDsKLQlzd2l0Y2ggKGhhbmRsZV9tbV9mYXVsdChtbSwgdm1hLCBlYSwgaXNfd3JpdGUpKSB7Ci0JY2FzZSBWTV9GQVVMVF9NSU5PUjoKLQkJY3VycmVudC0+bWluX2ZsdCsrOwotCQlicmVhazsKLQljYXNlIFZNX0ZBVUxUX01BSk9SOgotCQljdXJyZW50LT5tYWpfZmx0Kys7Ci0JCWJyZWFrOwotCWNhc2UgVk1fRkFVTFRfU0lHQlVTOgotCQlyZXQgPSAtRUZBVUxUOwotCQlnb3RvIGJhZF9hcmVhOwotCWNhc2UgVk1fRkFVTFRfT09NOgotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGJhZF9hcmVhOwotCWRlZmF1bHQ6Ci0JCUJVRygpOwotCX0KLQl1cF9yZWFkKCZtbS0+bW1hcF9zZW0pOwotCXJldHVybiByZXQ7Ci0KLWJhZF9hcmVhOgotCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7Ci0JcmV0dXJuIC1FRkFVTFQ7Ci19Ci0KLWludCBzcHVfaXJxX2NsYXNzXzFfYm90dG9tKHN0cnVjdCBzcHUgKnNwdSkKLXsKLQl1NjQgZWEsIGRzaXNyLCBhY2Nlc3MsIGVycm9yID0gMFVMOwotCWludCByZXQgPSAwOwotCi0JZWEgPSBzcHUtPmRhcjsKLQlkc2lzciA9IHNwdS0+ZHNpc3I7Ci0JaWYgKGRzaXNyICYgKE1GQ19EU0lTUl9QVEVfTk9UX0ZPVU5EIHwgTUZDX0RTSVNSX0FDQ0VTU19ERU5JRUQpKSB7Ci0JCXU2NCBmbGFnczsKLQotCQlhY2Nlc3MgPSAoX1BBR0VfUFJFU0VOVCB8IF9QQUdFX1VTRVIpOwotCQlhY2Nlc3MgfD0gKGRzaXNyICYgTUZDX0RTSVNSX0FDQ0VTU19QVVQpID8gX1BBR0VfUlcgOiAwVUw7Ci0JCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQkJaWYgKGhhc2hfcGFnZShlYSwgYWNjZXNzLCAweDMwMCkgIT0gMCkKLQkJCWVycm9yIHw9IENMQVNTMV9FTkFCTEVfU1RPUkFHRV9GQVVMVF9JTlRSOwotCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0JfQotCWlmIChlcnJvciAmIENMQVNTMV9FTkFCTEVfU1RPUkFHRV9GQVVMVF9JTlRSKSB7Ci0JCWlmICgocmV0ID0gc3B1X2hhbmRsZV9tbV9mYXVsdChzcHUpKSAhPSAwKQotCQkJZXJyb3IgfD0gQ0xBU1MxX0VOQUJMRV9TVE9SQUdFX0ZBVUxUX0lOVFI7Ci0JCWVsc2UKLQkJCWVycm9yICY9IH5DTEFTUzFfRU5BQkxFX1NUT1JBR0VfRkFVTFRfSU5UUjsKLQl9Ci0Jc3B1LT5kYXIgPSAwVUw7Ci0Jc3B1LT5kc2lzciA9IDBVTDsKLQlpZiAoIWVycm9yKSB7Ci0JCXNwdV9yZXN0YXJ0X2RtYShzcHUpOwotCX0gZWxzZSB7Ci0JCXNwdS0+ZG1hX2NhbGxiYWNrKHNwdSwgU1BFX0VWRU5UX1NQRV9EQVRBX1NUT1JBR0UpOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCiBzdHJ1Y3Qgc3lzZGV2X2NsYXNzIHNwdV9zeXNkZXZfY2xhc3MgPSB7CiAJc2V0X2tzZXRfbmFtZSgic3B1IikKIH07CkBAIC02MzYsMTIgKzUzNiw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHNwdV9kZXN0cm95X3N5c2RldihzdHJ1Y3Qgc3B1ICpzcHUpCi17Ci0Jc3lzZnNfcmVtb3ZlX2RldmljZV9mcm9tX25vZGUoJnNwdS0+c3lzZGV2LCBzcHUtPm5vZGUpOwotCXN5c2Rldl91bnJlZ2lzdGVyKCZzcHUtPnN5c2Rldik7Ci19Ci0KIHN0YXRpYyBpbnQgX19pbml0IGNyZWF0ZV9zcHUodm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3Qgc3B1ICpzcHU7CkBAIC02OTMsNTggKzU4NywzNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIGRlc3Ryb3lfc3B1KHN0cnVjdCBzcHUgKnNwdSkKLXsKLQlsaXN0X2RlbF9pbml0KCZzcHUtPmxpc3QpOwotCWxpc3RfZGVsX2luaXQoJnNwdS0+ZnVsbF9saXN0KTsKLQotCXNwdV9kZXN0cm95X3N5c2RldihzcHUpOwotCXNwdV9mcmVlX2lycXMoc3B1KTsKLQlzcHVfZGVzdHJveV9zcHUoc3B1KTsKLQlrZnJlZShzcHUpOwotfQotCi1zdGF0aWMgdm9pZCBjbGVhbnVwX3NwdV9iYXNlKHZvaWQpCi17Ci0Jc3RydWN0IHNwdSAqc3B1LCAqdG1wOwotCWludCBub2RlOwotCi0JbXV0ZXhfbG9jaygmc3B1X211dGV4KTsKLQlmb3IgKG5vZGUgPSAwOyBub2RlIDwgTUFYX05VTU5PREVTOyBub2RlKyspIHsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHNwdSwgdG1wLCAmc3B1X2xpc3Rbbm9kZV0sIGxpc3QpCi0JCQlkZXN0cm95X3NwdShzcHUpOwotCX0KLQltdXRleF91bmxvY2soJnNwdV9tdXRleCk7Ci0Jc3lzZGV2X2NsYXNzX3VucmVnaXN0ZXIoJnNwdV9zeXNkZXZfY2xhc3MpOwotfQotbW9kdWxlX2V4aXQoY2xlYW51cF9zcHVfYmFzZSk7Ci0KIHN0YXRpYyBpbnQgX19pbml0IGluaXRfc3B1X2Jhc2Uodm9pZCkKIHsKLQlpbnQgaSwgcmV0OworCWludCBpLCByZXQgPSAwOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9OVU1OT0RFUzsgaSsrKQorCQlJTklUX0xJU1RfSEVBRCgmc3B1X2xpc3RbaV0pOwogCiAJaWYgKCFzcHVfbWFuYWdlbWVudF9vcHMpCi0JCXJldHVybiAwOworCQlnb3RvIG91dDsKIAogCS8qIGNyZWF0ZSBzeXNkZXYgY2xhc3MgZm9yIHNwdXMgKi8KIAlyZXQgPSBzeXNkZXZfY2xhc3NfcmVnaXN0ZXIoJnNwdV9zeXNkZXZfY2xhc3MpOwogCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTUFYX05VTU5PREVTOyBpKyspCi0JCUlOSVRfTElTVF9IRUFEKCZzcHVfbGlzdFtpXSk7CisJCWdvdG8gb3V0OwogCiAJcmV0ID0gc3B1X2VudW1lcmF0ZV9zcHVzKGNyZWF0ZV9zcHUpOwogCiAJaWYgKHJldCkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogRXJyb3IgaW5pdGlhbGl6aW5nIHNwdXNcbiIsCiAJCQlfX0ZVTkNUSU9OX18pOwotCQljbGVhbnVwX3NwdV9iYXNlKCk7Ci0JCXJldHVybiByZXQ7CisJCWdvdG8gb3V0X3VucmVnaXN0ZXJfc3lzZGV2X2NsYXNzOwogCX0KIAogCXhtb25fcmVnaXN0ZXJfc3B1cygmc3B1X2Z1bGxfbGlzdCk7CiAKKwlyZXR1cm4gMDsKKworIG91dF91bnJlZ2lzdGVyX3N5c2Rldl9jbGFzczoKKwlzeXNkZXZfY2xhc3NfdW5yZWdpc3Rlcigmc3B1X3N5c2Rldl9jbGFzcyk7Cisgb3V0OgorCiAJcmV0dXJuIHJldDsKIH0KIG1vZHVsZV9pbml0KGluaXRfc3B1X2Jhc2UpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdV9jb3JlZHVtcC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdV9jb3JlZHVtcC5jCmluZGV4IDY5MTViNDEuLjRmZDM3ZmYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVfY29yZWR1bXAuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1X2NvcmVkdW1wLmMKQEAgLTI2LDE5ICsyNiwxOCBAQAogCiAjaW5jbHVkZSA8YXNtL3NwdS5oPgogCi1zdGF0aWMgc3RydWN0IHNwdV9jb3JlZHVtcF9jYWxscyBzcHVfY29yZWR1bXBfY2FsbHM7CitzdGF0aWMgc3RydWN0IHNwdV9jb3JlZHVtcF9jYWxscyAqc3B1X2NvcmVkdW1wX2NhbGxzOwogc3RhdGljIERFRklORV9NVVRFWChzcHVfY29yZWR1bXBfbXV0ZXgpOwogCiBpbnQgYXJjaF9ub3Rlc19zaXplKHZvaWQpCiB7CiAJbG9uZyByZXQ7Ci0Jc3RydWN0IG1vZHVsZSAqb3duZXIgPSBzcHVfY29yZWR1bXBfY2FsbHMub3duZXI7CiAKIAlyZXQgPSAtRU5PU1lTOwogCW11dGV4X2xvY2soJnNwdV9jb3JlZHVtcF9tdXRleCk7Ci0JaWYgKG93bmVyICYmIHRyeV9tb2R1bGVfZ2V0KG93bmVyKSkgewotCQlyZXQgPSBzcHVfY29yZWR1bXBfY2FsbHMuYXJjaF9ub3Rlc19zaXplKCk7Ci0JCW1vZHVsZV9wdXQob3duZXIpOworCWlmIChzcHVfY29yZWR1bXBfY2FsbHMgJiYgdHJ5X21vZHVsZV9nZXQoc3B1X2NvcmVkdW1wX2NhbGxzLT5vd25lcikpIHsKKwkJcmV0ID0gc3B1X2NvcmVkdW1wX2NhbGxzLT5hcmNoX25vdGVzX3NpemUoKTsKKwkJbW9kdWxlX3B1dChzcHVfY29yZWR1bXBfY2FsbHMtPm93bmVyKTsKIAl9CiAJbXV0ZXhfdW5sb2NrKCZzcHVfY29yZWR1bXBfbXV0ZXgpOwogCXJldHVybiByZXQ7CkBAIC00NiwzNiArNDUsMzUgQEAKIAogdm9pZCBhcmNoX3dyaXRlX25vdGVzKHN0cnVjdCBmaWxlICpmaWxlKQogewotCXN0cnVjdCBtb2R1bGUgKm93bmVyID0gc3B1X2NvcmVkdW1wX2NhbGxzLm93bmVyOwotCiAJbXV0ZXhfbG9jaygmc3B1X2NvcmVkdW1wX211dGV4KTsKLQlpZiAob3duZXIgJiYgdHJ5X21vZHVsZV9nZXQob3duZXIpKSB7Ci0JCXNwdV9jb3JlZHVtcF9jYWxscy5hcmNoX3dyaXRlX25vdGVzKGZpbGUpOwotCQltb2R1bGVfcHV0KG93bmVyKTsKKwlpZiAoc3B1X2NvcmVkdW1wX2NhbGxzICYmIHRyeV9tb2R1bGVfZ2V0KHNwdV9jb3JlZHVtcF9jYWxscy0+b3duZXIpKSB7CisJCXNwdV9jb3JlZHVtcF9jYWxscy0+YXJjaF93cml0ZV9ub3RlcyhmaWxlKTsKKwkJbW9kdWxlX3B1dChzcHVfY29yZWR1bXBfY2FsbHMtPm93bmVyKTsKIAl9CiAJbXV0ZXhfdW5sb2NrKCZzcHVfY29yZWR1bXBfbXV0ZXgpOwogfQogCiBpbnQgcmVnaXN0ZXJfYXJjaF9jb3JlZHVtcF9jYWxscyhzdHJ1Y3Qgc3B1X2NvcmVkdW1wX2NhbGxzICpjYWxscykKIHsKLQlpZiAoc3B1X2NvcmVkdW1wX2NhbGxzLm93bmVyKQotCQlyZXR1cm4gLUVCVVNZOworCWludCByZXQgPSAwOworCiAKIAltdXRleF9sb2NrKCZzcHVfY29yZWR1bXBfbXV0ZXgpOwotCXNwdV9jb3JlZHVtcF9jYWxscy5hcmNoX25vdGVzX3NpemUgPSBjYWxscy0+YXJjaF9ub3Rlc19zaXplOwotCXNwdV9jb3JlZHVtcF9jYWxscy5hcmNoX3dyaXRlX25vdGVzID0gY2FsbHMtPmFyY2hfd3JpdGVfbm90ZXM7Ci0Jc3B1X2NvcmVkdW1wX2NhbGxzLm93bmVyID0gY2FsbHMtPm93bmVyOworCWlmIChzcHVfY29yZWR1bXBfY2FsbHMpCisJCXJldCA9IC1FQlVTWTsKKwllbHNlCisJCXNwdV9jb3JlZHVtcF9jYWxscyA9IGNhbGxzOwogCW11dGV4X3VubG9jaygmc3B1X2NvcmVkdW1wX211dGV4KTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gcmV0OwogfQogRVhQT1JUX1NZTUJPTF9HUEwocmVnaXN0ZXJfYXJjaF9jb3JlZHVtcF9jYWxscyk7CiAKIHZvaWQgdW5yZWdpc3Rlcl9hcmNoX2NvcmVkdW1wX2NhbGxzKHN0cnVjdCBzcHVfY29yZWR1bXBfY2FsbHMgKmNhbGxzKQogewotCUJVR19PTihzcHVfY29yZWR1bXBfY2FsbHMub3duZXIgIT0gY2FsbHMtPm93bmVyKTsKKwlCVUdfT04oc3B1X2NvcmVkdW1wX2NhbGxzICE9IGNhbGxzKTsKIAogCW11dGV4X2xvY2soJnNwdV9jb3JlZHVtcF9tdXRleCk7Ci0Jc3B1X2NvcmVkdW1wX2NhbGxzLm93bmVyID0gTlVMTDsKKwlzcHVfY29yZWR1bXBfY2FsbHMgPSBOVUxMOwogCW11dGV4X3VubG9jaygmc3B1X2NvcmVkdW1wX211dGV4KTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHVucmVnaXN0ZXJfYXJjaF9jb3JlZHVtcF9jYWxscyk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1X21hbmFnZS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdV9tYW5hZ2UuYwppbmRleCBlMzQ1OTlmLi4xZDQ1NjJhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1X21hbmFnZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVfbWFuYWdlLmMKQEAgLTQ4LDExICs0OCwxMSBAQAogewogCWNvbnN0IHVuc2lnbmVkIGludCAqcHJvcDsKIAlpbnQgcHJvcGxlbjsKLQlwcm9wID0gZ2V0X3Byb3BlcnR5KHNwZSwgInVuaXQtaWQiLCAmcHJvcGxlbik7CisJcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShzcGUsICJ1bml0LWlkIiwgJnByb3BsZW4pOwogCWlmIChwcm9wbGVuID09IDQpCiAJCXJldHVybiAodTY0KSpwcm9wOwogCi0JcHJvcCA9IGdldF9wcm9wZXJ0eShzcGUsICJyZWciLCAmcHJvcGxlbik7CisJcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShzcGUsICJyZWciLCAmcHJvcGxlbik7CiAJaWYgKHByb3BsZW4gPT0gNCkKIAkJcmV0dXJuICh1NjQpKnByb3A7CiAKQEAgLTc2LDEyICs3NiwxMiBAQAogCWludCBuaWQ7CiAKIAkvKiBHZXQgdGhlIGludGVycnVwdCBzb3VyY2UgdW5pdCBmcm9tIHRoZSBkZXZpY2UtdHJlZSAqLwotCXRtcCA9IGdldF9wcm9wZXJ0eShucCwgImlzcmMiLCBOVUxMKTsKKwl0bXAgPSBvZl9nZXRfcHJvcGVydHkobnAsICJpc3JjIiwgTlVMTCk7CiAJaWYgKCF0bXApCiAJCXJldHVybiAtRU5PREVWOwogCWlzcmMgPSB0bXBbMF07CiAKLQl0bXAgPSBnZXRfcHJvcGVydHkobnAtPnBhcmVudC0+cGFyZW50LCAibm9kZS1pZCIsIE5VTEwpOworCXRtcCA9IG9mX2dldF9wcm9wZXJ0eShucC0+cGFyZW50LT5wYXJlbnQsICJub2RlLWlkIiwgTlVMTCk7CiAJaWYgKCF0bXApIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGNhbid0IGZpbmQgbm9kZS1pZFxuIiwgX19GVU5DVElPTl9fKTsKIAkJbmlkID0gc3B1LT5ub2RlOwpAQCAtMTEwLDcgKzExMCw3IEBACiAJfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSAqcHJvcDsKIAlpbnQgcHJvcGxlbjsKIAotCXByb3AgPSBnZXRfcHJvcGVydHkobiwgbmFtZSwgJnByb3BsZW4pOworCXByb3AgPSBvZl9nZXRfcHJvcGVydHkobiwgbmFtZSwgJnByb3BsZW4pOwogCWlmIChwcm9wID09IE5VTEwgfHwgcHJvcGxlbiAhPSBzaXplb2YgKHN0cnVjdCBhZGRyZXNzX3Byb3ApKQogCQlyZXR1cm4gTlVMTDsKIApAQCAtMTI0LDExICsxMjQsMTEgQEAKIAlpbnQgcmV0OwogCiAJcmV0ID0gLUVOT0RFVjsKLQlzcHUtPm5hbWUgPSBnZXRfcHJvcGVydHkobm9kZSwgIm5hbWUiLCBOVUxMKTsKKwlzcHUtPm5hbWUgPSBvZl9nZXRfcHJvcGVydHkobm9kZSwgIm5hbWUiLCBOVUxMKTsKIAlpZiAoIXNwdS0+bmFtZSkKIAkJZ290byBvdXQ7CiAKLQlwcm9wID0gZ2V0X3Byb3BlcnR5KG5vZGUsICJsb2NhbC1zdG9yZSIsIE5VTEwpOworCXByb3AgPSBvZl9nZXRfcHJvcGVydHkobm9kZSwgImxvY2FsLXN0b3JlIiwgTlVMTCk7CiAJaWYgKCFwcm9wKQogCQlnb3RvIG91dDsKIAlzcHUtPmxvY2FsX3N0b3JlX3BoeXMgPSAqKHVuc2lnbmVkIGxvbmcgKilwcm9wOwpAQCAtMTM5LDcgKzEzOSw3IEBACiAJaWYgKCFzcHUtPmxvY2FsX3N0b3JlKQogCQlnb3RvIG91dDsKIAotCXByb3AgPSBnZXRfcHJvcGVydHkobm9kZSwgInByb2JsZW0iLCBOVUxMKTsKKwlwcm9wID0gb2ZfZ2V0X3Byb3BlcnR5KG5vZGUsICJwcm9ibGVtIiwgTlVMTCk7CiAJaWYgKCFwcm9wKQogCQlnb3RvIG91dF91bm1hcDsKIAlzcHUtPnByb2JsZW1fcGh5cyA9ICoodW5zaWduZWQgbG9uZyAqKXByb3A7CkBAIC0yMjYsNyArMjI2LDcgQEAKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gc3B1LT5kZXZub2RlOwogCWludCByZXQgPSAtRU5PREVWOwogCi0Jc3B1LT5uYW1lID0gZ2V0X3Byb3BlcnR5KG5wLCAibmFtZSIsIE5VTEwpOworCXNwdS0+bmFtZSA9IG9mX2dldF9wcm9wZXJ0eShucCwgIm5hbWUiLCBOVUxMKTsKIAlpZiAoIXNwdS0+bmFtZSkKIAkJZ290byBvdXQ7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9NYWtlZmlsZQppbmRleCA0NzIyMTdkLi4yY2Q4OWMxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL01ha2VmaWxlCkBAIC0xLDQgKzEsNCBAQAotb2JqLXkgKz0gc3dpdGNoLm8KK29iai15ICs9IHN3aXRjaC5vIGZhdWx0Lm8KIAogb2JqLSQoQ09ORklHX1NQVV9GUykgKz0gc3B1ZnMubwogc3B1ZnMteSArPSBpbm9kZS5vIGZpbGUubyBjb250ZXh0Lm8gc3lzY2FsbHMubyBjb3JlZHVtcC5vCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvYmFja2luZ19vcHMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9iYWNraW5nX29wcy5jCmluZGV4IDE4OThmMGQuLjMzMjI1MjggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9iYWNraW5nX29wcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9iYWNraW5nX29wcy5jCkBAIC0zNTAsNiArMzUwLDExIEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIHZvaWQgc3B1X2JhY2tpbmdfcmVzdGFydF9kbWEoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgpCit7CisJLyogbm90aGluZyB0byBkbyBoZXJlICovCit9CisKIHN0cnVjdCBzcHVfY29udGV4dF9vcHMgc3B1X2JhY2tpbmdfb3BzID0gewogCS5tYm94X3JlYWQgPSBzcHVfYmFja2luZ19tYm94X3JlYWQsCiAJLm1ib3hfc3RhdF9yZWFkID0gc3B1X2JhY2tpbmdfbWJveF9zdGF0X3JlYWQsCkBAIC0zNzYsNCArMzgxLDUgQEAKIAkucmVhZF9tZmNfdGFnc3RhdHVzID0gc3B1X2JhY2tpbmdfcmVhZF9tZmNfdGFnc3RhdHVzLAogCS5nZXRfbWZjX2ZyZWVfZWxlbWVudHMgPSBzcHVfYmFja2luZ19nZXRfbWZjX2ZyZWVfZWxlbWVudHMsCiAJLnNlbmRfbWZjX2NvbW1hbmQgPSBzcHVfYmFja2luZ19zZW5kX21mY19jb21tYW5kLAorCS5yZXN0YXJ0X2RtYSA9IHNwdV9iYWNraW5nX3Jlc3RhcnRfZG1hLAogfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9jb250ZXh0LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvY29udGV4dC5jCmluZGV4IDA0YWQyZTMuLmE4N2Q5Y2EgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9jb250ZXh0LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2NvbnRleHQuYwpAQCAtNDEsOSArNDEsMTAgQEAKIAkJZ290byBvdXRfZnJlZTsKIAl9CiAJc3Bpbl9sb2NrX2luaXQoJmN0eC0+bW1pb19sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmY3R4LT5tYXBwaW5nX2xvY2spOwogCWtyZWZfaW5pdCgmY3R4LT5rcmVmKTsKIAltdXRleF9pbml0KCZjdHgtPnN0YXRlX211dGV4KTsKLQlpbml0X01VVEVYKCZjdHgtPnJ1bl9zZW1hKTsKKwltdXRleF9pbml0KCZjdHgtPnJ1bl9tdXRleCk7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmY3R4LT5pYm94X3dxKTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjdHgtPndib3hfd3EpOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmN0eC0+c3RvcF93cSk7CkBAIC01MSw2ICs1Miw3IEBACiAJY3R4LT5zdGF0ZSA9IFNQVV9TVEFURV9TQVZFRDsKIAljdHgtPm9wcyA9ICZzcHVfYmFja2luZ19vcHM7CiAJY3R4LT5vd25lciA9IGdldF90YXNrX21tKGN1cnJlbnQpOworCUlOSVRfTElTVF9IRUFEKCZjdHgtPnJxKTsKIAlpZiAoZ2FuZykKIAkJc3B1X2dhbmdfYWRkX2N0eChnYW5nLCBjdHgpOwogCWN0eC0+cnRfcHJpb3JpdHkgPSBjdXJyZW50LT5ydF9wcmlvcml0eTsKQEAgLTc1LDYgKzc3LDcgQEAKIAlzcHVfZmluaV9jc2EoJmN0eC0+Y3NhKTsKIAlpZiAoY3R4LT5nYW5nKQogCQlzcHVfZ2FuZ19yZW1vdmVfY3R4KGN0eC0+Z2FuZywgY3R4KTsKKwlCVUdfT04oIWxpc3RfZW1wdHkoJmN0eC0+cnEpKTsKIAlrZnJlZShjdHgpOwogfQogCkBAIC0xMTksNDYgKzEyMiw2IEBACiB9CiAKIC8qKgotICogc3B1X2FjcXVpcmVfZXhjbHVzaXZlIC0gbG9jayBzcHUgY29udGV4IGFuZCBwcm90ZWN0IGFnYWluc3QgdXNlcnNwYWNlIGFjY2VzcwotICogQGN0eDoJc3B1IGNvbnRleCB0byBsb2NrCi0gKgotICogTm90ZToKLSAqCVJldHVybnMgMCBhbmQgd2l0aCB0aGUgY29udGV4dCBsb2NrZWQgb24gc3VjY2VzcwotICoJUmV0dXJucyBuZWdhdGl2ZSBlcnJvciBhbmQgd2l0aCB0aGUgY29udGV4dCBfdW5sb2NrZWRfIG9uIGZhaWx1cmUuCi0gKi8KLWludCBzcHVfYWNxdWlyZV9leGNsdXNpdmUoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgpCi17Ci0JaW50IHJldCA9IC1FSU5WQUw7Ci0KLQlzcHVfYWNxdWlyZShjdHgpOwotCS8qCi0JICogQ29udGV4dCBpcyBhYm91dCB0byBiZSBmcmVlZCwgc28gd2UgY2FuJ3QgYWNxdWlyZSBpdCBhbnltb3JlLgotCSAqLwotCWlmICghY3R4LT5vd25lcikKLQkJZ290byBvdXRfdW5sb2NrOwotCi0JaWYgKGN0eC0+c3RhdGUgPT0gU1BVX1NUQVRFX1NBVkVEKSB7Ci0JCXJldCA9IHNwdV9hY3RpdmF0ZShjdHgsIDApOwotCQlpZiAocmV0KQotCQkJZ290byBvdXRfdW5sb2NrOwotCX0gZWxzZSB7Ci0JCS8qCi0JCSAqIFdlIG5lZWQgdG8gZXhjbHVkZSB1c2Vyc3BhY2UgYWNjZXNzIHRvIHRoZSBjb250ZXh0LgotCQkgKgotCQkgKiBUbyBwcm90ZWN0IGFnYWluc3QgbWVtb3J5IGFjY2VzcyB3ZSBpbnZhbGlkYXRlIGFsbCBwdGVzCi0JCSAqIGFuZCBtYWtlIHN1cmUgdGhlIHBhZ2VmYXVsdCBoYW5kbGVycyBibG9jayBvbiB0aGUgbXV0ZXguCi0JCSAqLwotCQlzcHVfdW5tYXBfbWFwcGluZ3MoY3R4KTsKLQl9Ci0KLQlyZXR1cm4gMDsKLQotIG91dF91bmxvY2s6Ci0Jc3B1X3JlbGVhc2UoY3R4KTsKLQlyZXR1cm4gcmV0OwotfQotCi0vKioKICAqIHNwdV9hY3F1aXJlX3J1bm5hYmxlIC0gbG9jayBzcHUgY29udGV4IGFuZCBtYWtlIHN1cmUgaXQgaXMgaW4gcnVubmFibGUgc3RhdGUKICAqIEBjdHg6CXNwdSBjb250ZXggdG8gbG9jawogICoKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9jb3JlZHVtcC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2NvcmVkdW1wLmMKaW5kZXggNzI1ZTE5NS4uNWQ5YWQ1YSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2NvcmVkdW1wLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2NvcmVkdW1wLmMKQEAgLTE2OSwxMiArMTY5LDEyIEBACiAJc3RydWN0IHNwdV9jb250ZXh0ICpjdHg7CiAJbG9mZl90IHBvcyA9IDA7CiAJaW50IHN6LCBkZmQsIHJjLCB0b3RhbCA9IDA7Ci0JY29uc3QgaW50IGJ1ZnN6ID0gNDA5NjsKKwljb25zdCBpbnQgYnVmc3ogPSBQQUdFX1NJWkU7CiAJY2hhciAqbmFtZTsKIAljaGFyIGZ1bGxuYW1lWzgwXSwgKmJ1ZjsKIAlzdHJ1Y3QgZWxmX25vdGUgZW47CiAKLQlidWYgPSBrbWFsbG9jKGJ1ZnN6LCBHRlBfS0VSTkVMKTsKKwlidWYgPSAodm9pZCAqKWdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKIAlpZiAoIWJ1ZikKIAkJcmV0dXJuOwogCkBAIC0xODcsOSArMTg3LDggQEAKIAkJc3ogPSBzcHVmc19jb3JlZHVtcF9yZWFkW2ldLnNpemU7CiAKIAljdHggPSBjdHhfaW5mby0+Y3R4OwotCWlmICghY3R4KSB7Ci0JCXJldHVybjsKLQl9CisJaWYgKCFjdHgpCisJCWdvdG8gb3V0OwogCiAJc3ByaW50ZihmdWxsbmFtZSwgIlNQVS8lZC8lcyIsIGRmZCwgbmFtZSk7CiAJZW4ubl9uYW1lc3ogPSBzdHJsZW4oZnVsbG5hbWUpICsgMTsKQEAgLTE5NywyMyArMTk2LDI1IEBACiAJZW4ubl90eXBlID0gTlRfU1BVOwogCiAJaWYgKCFzcHVmc19kdW1wX3dyaXRlKGZpbGUsICZlbiwgc2l6ZW9mKGVuKSkpCi0JCXJldHVybjsKKwkJZ290byBvdXQ7CiAJaWYgKCFzcHVmc19kdW1wX3dyaXRlKGZpbGUsIGZ1bGxuYW1lLCBlbi5uX25hbWVzeikpCi0JCXJldHVybjsKKwkJZ290byBvdXQ7CiAJaWYgKCFzcHVmc19kdW1wX3NlZWsoZmlsZSwgcm91bmR1cCgodW5zaWduZWQgbG9uZylmaWxlLT5mX3BvcywgNCkpKQotCQlyZXR1cm47CisJCWdvdG8gb3V0OwogCiAJZG8gewogCQlyYyA9IGRvX2NvcmVkdW1wX3JlYWQoaSwgY3R4LCBidWYsIGJ1ZnN6LCAmcG9zKTsKIAkJaWYgKHJjID4gMCkgewogCQkJaWYgKCFzcHVmc19kdW1wX3dyaXRlKGZpbGUsIGJ1ZiwgcmMpKQotCQkJCXJldHVybjsKKwkJCQlnb3RvIG91dDsKIAkJCXRvdGFsICs9IHJjOwogCQl9CiAJfSB3aGlsZSAocmMgPT0gYnVmc3ogJiYgdG90YWwgPCBzeik7CiAKIAlzcHVmc19kdW1wX3NlZWsoZmlsZSwgcm91bmR1cCgodW5zaWduZWQgbG9uZylmaWxlLT5mX3BvcwogCQkJCQkJLSB0b3RhbCArIHN6LCA0KSk7CitvdXQ6CisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWJ1Zik7CiB9CiAKIHN0YXRpYyB2b2lkIHNwdWZzX2FyY2hfd3JpdGVfbm90ZXMoc3RydWN0IGZpbGUgKmZpbGUpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvZmF1bHQuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9mYXVsdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmNzVjMDcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvZmF1bHQuYwpAQCAtMCwwICsxLDIxMSBAQAorLyoKKyAqIExvdy1sZXZlbCBTUFUgaGFuZGxpbmcKKyAqCisgKiAoQykgQ29weXJpZ2h0IElCTSBEZXV0c2NobGFuZCBFbnR3aWNrbHVuZyBHbWJIIDIwMDUKKyAqCisgKiBBdXRob3I6IEFybmQgQmVyZ21hbm4gPGFybmRiQGRlLmlibS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxhc20vc3B1Lmg+CisjaW5jbHVkZSA8YXNtL3NwdV9jc2EuaD4KKworI2luY2x1ZGUgInNwdWZzLmgiCisKKy8qCisgKiBUaGlzIG91Z2h0IHRvIGJlIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBwb3dlcnBjIHNwZWNpZmljIGRvX3BhZ2VfZmF1bHQKKyAqIGZ1bmN0aW9uLiBDdXJyZW50bHksIHRoZXJlIGFyZSBhIGZldyBjb3JuZXIgY2FzZXMgdGhhdCB3ZSBoYXZlbid0IGhhZAorICogdG8gaGFuZGxlIGZvcnR1bmF0ZWx5LgorICovCitzdGF0aWMgaW50IHNwdV9oYW5kbGVfbW1fZmF1bHQoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgZWEsIHVuc2lnbmVkIGxvbmcgZHNpc3IpCit7CisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7CisJdW5zaWduZWQgbG9uZyBpc193cml0ZTsKKwlpbnQgcmV0OworCisjaWYgMAorCWlmICghSVNfVkFMSURfRUEoZWEpKSB7CisJCXJldHVybiAtRUZBVUxUOworCX0KKyNlbmRpZiAvKiBYWFggKi8KKwlpZiAobW0gPT0gTlVMTCkgeworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJaWYgKG1tLT5wZ2QgPT0gTlVMTCkgeworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlkb3duX3JlYWQoJm1tLT5tbWFwX3NlbSk7CisJdm1hID0gZmluZF92bWEobW0sIGVhKTsKKwlpZiAoIXZtYSkKKwkJZ290byBiYWRfYXJlYTsKKwlpZiAodm1hLT52bV9zdGFydCA8PSBlYSkKKwkJZ290byBnb29kX2FyZWE7CisJaWYgKCEodm1hLT52bV9mbGFncyAmIFZNX0dST1dTRE9XTikpCisJCWdvdG8gYmFkX2FyZWE7CisJaWYgKGV4cGFuZF9zdGFjayh2bWEsIGVhKSkKKwkJZ290byBiYWRfYXJlYTsKK2dvb2RfYXJlYToKKwlpc193cml0ZSA9IGRzaXNyICYgTUZDX0RTSVNSX0FDQ0VTU19QVVQ7CisJaWYgKGlzX3dyaXRlKSB7CisJCWlmICghKHZtYS0+dm1fZmxhZ3MgJiBWTV9XUklURSkpCisJCQlnb3RvIGJhZF9hcmVhOworCX0gZWxzZSB7CisJCWlmIChkc2lzciAmIE1GQ19EU0lTUl9BQ0NFU1NfREVOSUVEKQorCQkJZ290byBiYWRfYXJlYTsKKwkJaWYgKCEodm1hLT52bV9mbGFncyAmIChWTV9SRUFEIHwgVk1fRVhFQykpKQorCQkJZ290byBiYWRfYXJlYTsKKwl9CisJcmV0ID0gMDsKKwlzd2l0Y2ggKGhhbmRsZV9tbV9mYXVsdChtbSwgdm1hLCBlYSwgaXNfd3JpdGUpKSB7CisJY2FzZSBWTV9GQVVMVF9NSU5PUjoKKwkJY3VycmVudC0+bWluX2ZsdCsrOworCQlicmVhazsKKwljYXNlIFZNX0ZBVUxUX01BSk9SOgorCQljdXJyZW50LT5tYWpfZmx0Kys7CisJCWJyZWFrOworCWNhc2UgVk1fRkFVTFRfU0lHQlVTOgorCQlyZXQgPSAtRUZBVUxUOworCQlnb3RvIGJhZF9hcmVhOworCWNhc2UgVk1fRkFVTFRfT09NOgorCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGJhZF9hcmVhOworCWRlZmF1bHQ6CisJCUJVRygpOworCX0KKwl1cF9yZWFkKCZtbS0+bW1hcF9zZW0pOworCXJldHVybiByZXQ7CisKK2JhZF9hcmVhOgorCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7CisJcmV0dXJuIC1FRkFVTFQ7Cit9CisKK3N0YXRpYyB2b2lkIHNwdWZzX2hhbmRsZV9kbWFfZXJyb3Ioc3RydWN0IHNwdV9jb250ZXh0ICpjdHgsCisJCQkJdW5zaWduZWQgbG9uZyBlYSwgaW50IHR5cGUpCit7CisJaWYgKGN0eC0+ZmxhZ3MgJiBTUFVfQ1JFQVRFX0VWRU5UU19FTkFCTEVEKSB7CisJCWN0eC0+ZXZlbnRfcmV0dXJuIHw9IHR5cGU7CisJCXdha2VfdXBfYWxsKCZjdHgtPnN0b3Bfd3EpOworCX0gZWxzZSB7CisJCXNpZ2luZm9fdCBpbmZvOworCQltZW1zZXQoJmluZm8sIDAsIHNpemVvZihpbmZvKSk7CisKKwkJc3dpdGNoICh0eXBlKSB7CisJCWNhc2UgU1BFX0VWRU5UX0lOVkFMSURfRE1BOgorCQkJaW5mby5zaV9zaWdubyA9IFNJR0JVUzsKKwkJCWluZm8uc2lfY29kZSA9IEJVU19PQkpFUlI7CisJCQlicmVhazsKKwkJY2FzZSBTUEVfRVZFTlRfU1BFX0RBVEFfU1RPUkFHRToKKwkJCWluZm8uc2lfc2lnbm8gPSBTSUdCVVM7CisJCQlpbmZvLnNpX2FkZHIgPSAodm9pZCBfX3VzZXIgKillYTsKKwkJCWluZm8uc2lfY29kZSA9IEJVU19BRFJFUlI7CisJCQlicmVhazsKKwkJY2FzZSBTUEVfRVZFTlRfRE1BX0FMSUdOTUVOVDoKKwkJCWluZm8uc2lfc2lnbm8gPSBTSUdCVVM7CisJCQkvKiBEQVIgaXNuJ3Qgc2V0IGZvciBhbiBhbGlnbm1lbnQgZmF1bHQgOiggKi8KKwkJCWluZm8uc2lfY29kZSA9IEJVU19BRFJBTE47CisJCQlicmVhazsKKwkJY2FzZSBTUEVfRVZFTlRfU1BFX0VSUk9SOgorCQkJaW5mby5zaV9zaWdubyA9IFNJR0lMTDsKKwkJCWluZm8uc2lfYWRkciA9ICh2b2lkIF9fdXNlciAqKSh1bnNpZ25lZCBsb25nKQorCQkJCWN0eC0+b3BzLT5ucGNfcmVhZChjdHgpIC0gNDsKKwkJCWluZm8uc2lfY29kZSA9IElMTF9JTExPUEM7CisJCQlicmVhazsKKwkJfQorCQlpZiAoaW5mby5zaV9zaWdubykKKwkJCWZvcmNlX3NpZ19pbmZvKGluZm8uc2lfc2lnbm8sICZpbmZvLCBjdXJyZW50KTsKKwl9Cit9CisKK3ZvaWQgc3B1ZnNfZG1hX2NhbGxiYWNrKHN0cnVjdCBzcHUgKnNwdSwgaW50IHR5cGUpCit7CisJc3B1ZnNfaGFuZGxlX2RtYV9lcnJvcihzcHUtPmN0eCwgc3B1LT5kYXIsIHR5cGUpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3B1ZnNfZG1hX2NhbGxiYWNrKTsKKworLyoKKyAqIGJvdHRvbSBoYWxmIGhhbmRsZXIgZm9yIHBhZ2UgZmF1bHRzLCB3ZSBjYW4ndCBkbyB0aGlzIGZyb20KKyAqIGludGVycnVwdCBjb250ZXh0LCBzaW5jZSB3ZSBtaWdodCBuZWVkIHRvIHNsZWVwLgorICogd2UgYWxzbyBuZWVkIHRvIGdpdmUgdXAgdGhlIG11dGV4IHNvIHdlIGNhbiBnZXQgc2NoZWR1bGVkCisgKiBvdXQgd2hpbGUgd2FpdGluZyBmb3IgdGhlIGJhY2tpbmcgc3RvcmUuCisgKgorICogVE9ETzogdHJ5IGNhbGxpbmcgaGFzaF9wYWdlIGZyb20gdGhlIGludGVycnVwdCBoYW5kbGVyIGZpcnN0CisgKiAgICAgICBpbiBvcmRlciB0byBzcGVlZCB1cCB0aGUgZWFzeSBjYXNlLgorICovCitpbnQgc3B1ZnNfaGFuZGxlX2NsYXNzMShzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCkKK3sKKwl1NjQgZWEsIGRzaXNyLCBhY2Nlc3M7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0OworCisJLyoKKwkgKiBkYXIgYW5kIGRzaXNyIGdldCBwYXNzZWQgZnJvbSB0aGUgcmVnaXN0ZXJzCisJICogdG8gdGhlIHNwdV9jb250ZXh0LCB0byB0aGlzIGZ1bmN0aW9uLCBidXQgbm90CisJICogYmFjayB0byB0aGUgc3B1IGlmIGl0IGdldHMgc2NoZWR1bGVkIGFnYWluLgorCSAqCisJICogaWYgd2UgZG9uJ3QgaGFuZGxlIHRoZSBmYXVsdCBmb3IgYSBzYXZlZCBjb250ZXh0CisJICogaW4gdGltZSwgd2UgY2FuIHN0aWxsIGV4cGVjdCB0byBnZXQgdGhlIHNhbWUgZmF1bHQKKwkgKiB0aGUgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGNvbnRleHQgcmVzdG9yZS4KKwkgKi8KKwlpZiAoY3R4LT5zdGF0ZSA9PSBTUFVfU1RBVEVfUlVOTkFCTEUpIHsKKwkJZWEgPSBjdHgtPnNwdS0+ZGFyOworCQlkc2lzciA9IGN0eC0+c3B1LT5kc2lzcjsKKwkJY3R4LT5zcHUtPmRhcj0gY3R4LT5zcHUtPmRzaXNyID0gMDsKKwl9IGVsc2UgeworCQllYSA9IGN0eC0+Y3NhLnByaXYxLm1mY19kYXJfUlc7CisJCWRzaXNyID0gY3R4LT5jc2EucHJpdjEubWZjX2RzaXNyX1JXOworCQljdHgtPmNzYS5wcml2MS5tZmNfZGFyX1JXID0gMDsKKwkJY3R4LT5jc2EucHJpdjEubWZjX2RzaXNyX1JXID0gMDsKKwl9CisKKwlpZiAoIShkc2lzciAmIChNRkNfRFNJU1JfUFRFX05PVF9GT1VORCB8IE1GQ19EU0lTUl9BQ0NFU1NfREVOSUVEKSkpCisJCXJldHVybiAwOworCisJcHJfZGVidWcoImN0eCAlcDogZWEgJTAxNmx4LCBkc2lzciAlMDE2bHggc3RhdGUgJWRcbiIsIGN0eCwgZWEsCisJCWRzaXNyLCBjdHgtPnN0YXRlKTsKKworCS8qIHdlIG11c3Qgbm90IGhvbGQgdGhlIGxvY2sgd2hlbiBlbnRlcmluZyBzcHVfaGFuZGxlX21tX2ZhdWx0ICovCisJc3B1X3JlbGVhc2UoY3R4KTsKKworCWFjY2VzcyA9IChfUEFHRV9QUkVTRU5UIHwgX1BBR0VfVVNFUik7CisJYWNjZXNzIHw9IChkc2lzciAmIE1GQ19EU0lTUl9BQ0NFU1NfUFVUKSA/IF9QQUdFX1JXIDogMFVMOworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlyZXQgPSBoYXNoX3BhZ2UoZWEsIGFjY2VzcywgMHgzMDApOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCS8qIGhhc2hpbmcgZmFpbGVkLCBzbyB0cnkgdGhlIGFjdHVhbCBmYXVsdCBoYW5kbGVyICovCisJaWYgKHJldCkKKwkJcmV0ID0gc3B1X2hhbmRsZV9tbV9mYXVsdChjdXJyZW50LT5tbSwgZWEsIGRzaXNyKTsKKworCXNwdV9hY3F1aXJlKGN0eCk7CisJLyoKKwkgKiBJZiB3ZSBoYW5kbGVkIHRoZSBmYXVsdCBzdWNjZXNzZnVsbHkgYW5kIGFyZSBpbiBydW5uYWJsZQorCSAqIHN0YXRlLCByZXN0YXJ0IHRoZSBETUEuCisJICogSW4gY2FzZSBvZiB1bmhhbmRsZWQgZXJyb3IgcmVwb3J0IHRoZSBwcm9ibGVtIHRvIHVzZXIgc3BhY2UuCisJICovCisJaWYgKCFyZXQpIHsKKwkJaWYgKGN0eC0+c3B1KQorCQkJY3R4LT5vcHMtPnJlc3RhcnRfZG1hKGN0eCk7CisJfSBlbHNlCisJCXNwdWZzX2hhbmRsZV9kbWFfZXJyb3IoY3R4LCBlYSwgU1BFX0VWRU5UX1NQRV9EQVRBX1NUT1JBR0UpOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNwdWZzX2hhbmRsZV9jbGFzczEpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2ZpbGUuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9maWxlLmMKaW5kZXggNTA1MjY2YS4uZDAxMGIyNCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2ZpbGUuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvZmlsZS5jCkBAIC00NCw5ICs0NCwyNSBAQAogewogCXN0cnVjdCBzcHVmc19pbm9kZV9pbmZvICppID0gU1BVRlNfSShpbm9kZSk7CiAJc3RydWN0IHNwdV9jb250ZXh0ICpjdHggPSBpLT5pX2N0eDsKKworCXNwaW5fbG9jaygmY3R4LT5tYXBwaW5nX2xvY2spOwogCWZpbGUtPnByaXZhdGVfZGF0YSA9IGN0eDsKLQljdHgtPmxvY2FsX3N0b3JlID0gaW5vZGUtPmlfbWFwcGluZzsKLQlzbXBfd21iKCk7CisJaWYgKCFpLT5pX29wZW5lcnMrKykKKwkJY3R4LT5sb2NhbF9zdG9yZSA9IGlub2RlLT5pX21hcHBpbmc7CisJc3Bpbl91bmxvY2soJmN0eC0+bWFwcGluZ19sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorc3B1ZnNfbWVtX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHNwdWZzX2lub2RlX2luZm8gKmkgPSBTUFVGU19JKGlub2RlKTsKKwlzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCA9IGktPmlfY3R4OworCisJc3Bpbl9sb2NrKCZjdHgtPm1hcHBpbmdfbG9jayk7CisJaWYgKCEtLWktPmlfb3BlbmVycykKKwkJY3R4LT5sb2NhbF9zdG9yZSA9IE5VTEw7CisJc3Bpbl91bmxvY2soJmN0eC0+bWFwcGluZ19sb2NrKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTQ5LDYgKzE2NSw3IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNwdWZzX21lbV9mb3BzID0gewogCS5vcGVuCSA9IHNwdWZzX21lbV9vcGVuLAorCS5yZWxlYXNlID0gc3B1ZnNfbWVtX3JlbGVhc2UsCiAJLnJlYWQgICAgPSBzcHVmc19tZW1fcmVhZCwKIAkud3JpdGUgICA9IHNwdWZzX21lbV93cml0ZSwKIAkubGxzZWVrICA9IGdlbmVyaWNfZmlsZV9sbHNlZWssCkBAIC0yMzgsMTYgKzI1NSwzMyBAQAogCXN0cnVjdCBzcHVmc19pbm9kZV9pbmZvICppID0gU1BVRlNfSShpbm9kZSk7CiAJc3RydWN0IHNwdV9jb250ZXh0ICpjdHggPSBpLT5pX2N0eDsKIAorCXNwaW5fbG9jaygmY3R4LT5tYXBwaW5nX2xvY2spOwogCWZpbGUtPnByaXZhdGVfZGF0YSA9IGN0eDsKLQljdHgtPmNudGwgPSBpbm9kZS0+aV9tYXBwaW5nOwotCXNtcF93bWIoKTsKKwlpZiAoIWktPmlfb3BlbmVycysrKQorCQljdHgtPmNudGwgPSBpbm9kZS0+aV9tYXBwaW5nOworCXNwaW5fdW5sb2NrKCZjdHgtPm1hcHBpbmdfbG9jayk7CiAJcmV0dXJuIHNpbXBsZV9hdHRyX29wZW4oaW5vZGUsIGZpbGUsIHNwdWZzX2NudGxfZ2V0LAogCQkJCQlzcHVmc19jbnRsX3NldCwgIjB4JTA4bHgiKTsKIH0KIAorc3RhdGljIGludAorc3B1ZnNfY250bF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBzcHVmc19pbm9kZV9pbmZvICppID0gU1BVRlNfSShpbm9kZSk7CisJc3RydWN0IHNwdV9jb250ZXh0ICpjdHggPSBpLT5pX2N0eDsKKworCXNpbXBsZV9hdHRyX2Nsb3NlKGlub2RlLCBmaWxlKTsKKworCXNwaW5fbG9jaygmY3R4LT5tYXBwaW5nX2xvY2spOworCWlmICghLS1pLT5pX29wZW5lcnMpCisJCWN0eC0+Y250bCA9IE5VTEw7CisJc3Bpbl91bmxvY2soJmN0eC0+bWFwcGluZ19sb2NrKTsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc3B1ZnNfY250bF9mb3BzID0gewogCS5vcGVuID0gc3B1ZnNfY250bF9vcGVuLAotCS5yZWxlYXNlID0gc2ltcGxlX2F0dHJfY2xvc2UsCisJLnJlbGVhc2UgPSBzcHVmc19jbnRsX3JlbGVhc2UsCiAJLnJlYWQgPSBzaW1wbGVfYXR0cl9yZWFkLAogCS53cml0ZSA9IHNpbXBsZV9hdHRyX3dyaXRlLAogCS5tbWFwID0gc3B1ZnNfY250bF9tbWFwLApAQCAtNzIzLDEyICs3NTcsMjggQEAKIHsKIAlzdHJ1Y3Qgc3B1ZnNfaW5vZGVfaW5mbyAqaSA9IFNQVUZTX0koaW5vZGUpOwogCXN0cnVjdCBzcHVfY29udGV4dCAqY3R4ID0gaS0+aV9jdHg7CisKKwlzcGluX2xvY2soJmN0eC0+bWFwcGluZ19sb2NrKTsKIAlmaWxlLT5wcml2YXRlX2RhdGEgPSBjdHg7Ci0JY3R4LT5zaWduYWwxID0gaW5vZGUtPmlfbWFwcGluZzsKLQlzbXBfd21iKCk7CisJaWYgKCFpLT5pX29wZW5lcnMrKykKKwkJY3R4LT5zaWduYWwxID0gaW5vZGUtPmlfbWFwcGluZzsKKwlzcGluX3VubG9jaygmY3R4LT5tYXBwaW5nX2xvY2spOwogCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKIH0KIAorc3RhdGljIGludAorc3B1ZnNfc2lnbmFsMV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBzcHVmc19pbm9kZV9pbmZvICppID0gU1BVRlNfSShpbm9kZSk7CisJc3RydWN0IHNwdV9jb250ZXh0ICpjdHggPSBpLT5pX2N0eDsKKworCXNwaW5fbG9jaygmY3R4LT5tYXBwaW5nX2xvY2spOworCWlmICghLS1pLT5pX29wZW5lcnMpCisJCWN0eC0+c2lnbmFsMSA9IE5VTEw7CisJc3Bpbl91bmxvY2soJmN0eC0+bWFwcGluZ19sb2NrKTsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHNzaXplX3QgX19zcHVmc19zaWduYWwxX3JlYWQoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgsIGNoYXIgX191c2VyICpidWYsCiAJCQlzaXplX3QgbGVuLCBsb2ZmX3QgKnBvcykKIHsKQEAgLTgyMSw2ICs4NzEsNyBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzcHVmc19zaWduYWwxX2ZvcHMgPSB7CiAJLm9wZW4gPSBzcHVmc19zaWduYWwxX29wZW4sCisJLnJlbGVhc2UgPSBzcHVmc19zaWduYWwxX3JlbGVhc2UsCiAJLnJlYWQgPSBzcHVmc19zaWduYWwxX3JlYWQsCiAJLndyaXRlID0gc3B1ZnNfc2lnbmFsMV93cml0ZSwKIAkubW1hcCA9IHNwdWZzX3NpZ25hbDFfbW1hcCwKQEAgLTgzMCwxMiArODgxLDI4IEBACiB7CiAJc3RydWN0IHNwdWZzX2lub2RlX2luZm8gKmkgPSBTUFVGU19JKGlub2RlKTsKIAlzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCA9IGktPmlfY3R4OworCisJc3Bpbl9sb2NrKCZjdHgtPm1hcHBpbmdfbG9jayk7CiAJZmlsZS0+cHJpdmF0ZV9kYXRhID0gY3R4OwotCWN0eC0+c2lnbmFsMiA9IGlub2RlLT5pX21hcHBpbmc7Ci0Jc21wX3dtYigpOworCWlmICghaS0+aV9vcGVuZXJzKyspCisJCWN0eC0+c2lnbmFsMiA9IGlub2RlLT5pX21hcHBpbmc7CisJc3Bpbl91bmxvY2soJmN0eC0+bWFwcGluZ19sb2NrKTsKIAlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7CiB9CiAKK3N0YXRpYyBpbnQKK3NwdWZzX3NpZ25hbDJfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3Qgc3B1ZnNfaW5vZGVfaW5mbyAqaSA9IFNQVUZTX0koaW5vZGUpOworCXN0cnVjdCBzcHVfY29udGV4dCAqY3R4ID0gaS0+aV9jdHg7CisKKwlzcGluX2xvY2soJmN0eC0+bWFwcGluZ19sb2NrKTsKKwlpZiAoIS0taS0+aV9vcGVuZXJzKQorCQljdHgtPnNpZ25hbDIgPSBOVUxMOworCXNwaW5fdW5sb2NrKCZjdHgtPm1hcHBpbmdfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBzc2l6ZV90IF9fc3B1ZnNfc2lnbmFsMl9yZWFkKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4LCBjaGFyIF9fdXNlciAqYnVmLAogCQkJc2l6ZV90IGxlbiwgbG9mZl90ICpwb3MpCiB7CkBAIC05MzIsNiArOTk5LDcgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc3B1ZnNfc2lnbmFsMl9mb3BzID0gewogCS5vcGVuID0gc3B1ZnNfc2lnbmFsMl9vcGVuLAorCS5yZWxlYXNlID0gc3B1ZnNfc2lnbmFsMl9yZWxlYXNlLAogCS5yZWFkID0gc3B1ZnNfc2lnbmFsMl9yZWFkLAogCS53cml0ZSA9IHNwdWZzX3NpZ25hbDJfd3JpdGUsCiAJLm1tYXAgPSBzcHVmc19zaWduYWwyX21tYXAsCkBAIC0xMDMxLDEzICsxMDk5LDMwIEBACiAJc3RydWN0IHNwdV9jb250ZXh0ICpjdHggPSBpLT5pX2N0eDsKIAogCWZpbGUtPnByaXZhdGVfZGF0YSA9IGktPmlfY3R4OwotCWN0eC0+bXNzID0gaW5vZGUtPmlfbWFwcGluZzsKLQlzbXBfd21iKCk7CisKKwlzcGluX2xvY2soJmN0eC0+bWFwcGluZ19sb2NrKTsKKwlpZiAoIWktPmlfb3BlbmVycysrKQorCQljdHgtPm1zcyA9IGlub2RlLT5pX21hcHBpbmc7CisJc3Bpbl91bmxvY2soJmN0eC0+bWFwcGluZ19sb2NrKTsKIAlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7CiB9CiAKK3N0YXRpYyBpbnQKK3NwdWZzX21zc19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBzcHVmc19pbm9kZV9pbmZvICppID0gU1BVRlNfSShpbm9kZSk7CisJc3RydWN0IHNwdV9jb250ZXh0ICpjdHggPSBpLT5pX2N0eDsKKworCXNwaW5fbG9jaygmY3R4LT5tYXBwaW5nX2xvY2spOworCWlmICghLS1pLT5pX29wZW5lcnMpCisJCWN0eC0+bXNzID0gTlVMTDsKKwlzcGluX3VubG9jaygmY3R4LT5tYXBwaW5nX2xvY2spOworCXJldHVybiAwOworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzcHVmc19tc3NfZm9wcyA9IHsKIAkub3BlbgkgPSBzcHVmc19tc3Nfb3BlbiwKKwkucmVsZWFzZSA9IHNwdWZzX21zc19yZWxlYXNlLAogCS5tbWFwCSA9IHNwdWZzX21zc19tbWFwLAogfTsKIApAQCAtMTA3MiwxNCArMTE1NywzMCBAQAogCXN0cnVjdCBzcHVmc19pbm9kZV9pbmZvICppID0gU1BVRlNfSShpbm9kZSk7CiAJc3RydWN0IHNwdV9jb250ZXh0ICpjdHggPSBpLT5pX2N0eDsKIAorCXNwaW5fbG9jaygmY3R4LT5tYXBwaW5nX2xvY2spOwogCWZpbGUtPnByaXZhdGVfZGF0YSA9IGktPmlfY3R4OwotCWN0eC0+cHNtYXAgPSBpbm9kZS0+aV9tYXBwaW5nOwotCXNtcF93bWIoKTsKKwlpZiAoIWktPmlfb3BlbmVycysrKQorCQljdHgtPnBzbWFwID0gaW5vZGUtPmlfbWFwcGluZzsKKwlzcGluX3VubG9jaygmY3R4LT5tYXBwaW5nX2xvY2spOwogCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKIH0KIAorc3RhdGljIGludAorc3B1ZnNfcHNtYXBfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3Qgc3B1ZnNfaW5vZGVfaW5mbyAqaSA9IFNQVUZTX0koaW5vZGUpOworCXN0cnVjdCBzcHVfY29udGV4dCAqY3R4ID0gaS0+aV9jdHg7CisKKwlzcGluX2xvY2soJmN0eC0+bWFwcGluZ19sb2NrKTsKKwlpZiAoIS0taS0+aV9vcGVuZXJzKQorCQljdHgtPnBzbWFwID0gTlVMTDsKKwlzcGluX3VubG9jaygmY3R4LT5tYXBwaW5nX2xvY2spOworCXJldHVybiAwOworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzcHVmc19wc21hcF9mb3BzID0gewogCS5vcGVuCSA9IHNwdWZzX3BzbWFwX29wZW4sCisJLnJlbGVhc2UgPSBzcHVmc19wc21hcF9yZWxlYXNlLAogCS5tbWFwCSA9IHNwdWZzX3BzbWFwX21tYXAsCiB9OwogCkBAIC0xMTI2LDEyICsxMjI3LDI3IEBACiAJaWYgKGF0b21pY19yZWFkKCZpbm9kZS0+aV9jb3VudCkgIT0gMSkKIAkJcmV0dXJuIC1FQlVTWTsKIAorCXNwaW5fbG9jaygmY3R4LT5tYXBwaW5nX2xvY2spOwogCWZpbGUtPnByaXZhdGVfZGF0YSA9IGN0eDsKLQljdHgtPm1mYyA9IGlub2RlLT5pX21hcHBpbmc7Ci0Jc21wX3dtYigpOworCWlmICghaS0+aV9vcGVuZXJzKyspCisJCWN0eC0+bWZjID0gaW5vZGUtPmlfbWFwcGluZzsKKwlzcGluX3VubG9jaygmY3R4LT5tYXBwaW5nX2xvY2spOwogCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKIH0KIAorc3RhdGljIGludAorc3B1ZnNfbWZjX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHNwdWZzX2lub2RlX2luZm8gKmkgPSBTUFVGU19JKGlub2RlKTsKKwlzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCA9IGktPmlfY3R4OworCisJc3Bpbl9sb2NrKCZjdHgtPm1hcHBpbmdfbG9jayk7CisJaWYgKCEtLWktPmlfb3BlbmVycykKKwkJY3R4LT5tZmMgPSBOVUxMOworCXNwaW5fdW5sb2NrKCZjdHgtPm1hcHBpbmdfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKIC8qIGludGVycnVwdC1sZXZlbCBtZmMgY2FsbGJhY2sgZnVuY3Rpb24uICovCiB2b2lkIHNwdWZzX21mY19jYWxsYmFjayhzdHJ1Y3Qgc3B1ICpzcHUpCiB7CkBAIC0xMzEzLDcgKzE0MjksMTAgQEAKIAlpZiAocmV0KQogCQlnb3RvIG91dDsKIAotCXNwdV9hY3F1aXJlX3J1bm5hYmxlKGN0eCwgMCk7CisJcmV0ID0gc3B1X2FjcXVpcmVfcnVubmFibGUoY3R4LCAwKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKwogCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgewogCQlyZXQgPSBjdHgtPm9wcy0+c2VuZF9tZmNfY29tbWFuZChjdHgsICZjbWQpOwogCX0gZWxzZSB7CkBAIC0xMzk5LDYgKzE1MTgsNyBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzcHVmc19tZmNfZm9wcyA9IHsKIAkub3BlbgkgPSBzcHVmc19tZmNfb3BlbiwKKwkucmVsZWFzZSA9IHNwdWZzX21mY19yZWxlYXNlLAogCS5yZWFkCSA9IHNwdWZzX21mY19yZWFkLAogCS53cml0ZQkgPSBzcHVmc19tZmNfd3JpdGUsCiAJLnBvbGwJID0gc3B1ZnNfbWZjX3BvbGwsCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvaHdfb3BzLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvaHdfb3BzLmMKaW5kZXggYWU0MmUwMy4uNDI4ODc1YyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2h3X29wcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9od19vcHMuYwpAQCAtMjk2LDYgKzI5NiwxNCBAQAogCX0KIH0KIAorc3RhdGljIHZvaWQgc3B1X2h3X3Jlc3RhcnRfZG1hKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4KQoreworCXN0cnVjdCBzcHVfcHJpdjIgX19pb21lbSAqcHJpdjIgPSBjdHgtPnNwdS0+cHJpdjI7CisKKwlpZiAoIXRlc3RfYml0KFNQVV9DT05URVhUX1NXSVRDSF9QRU5ESU5HLCAmY3R4LT5zcHUtPmZsYWdzKSkKKwkJb3V0X2JlNjQoJnByaXYyLT5tZmNfY29udHJvbF9SVywgTUZDX0NOVExfUkVTVEFSVF9ETUFfQ09NTUFORCk7Cit9CisKIHN0cnVjdCBzcHVfY29udGV4dF9vcHMgc3B1X2h3X29wcyA9IHsKIAkubWJveF9yZWFkID0gc3B1X2h3X21ib3hfcmVhZCwKIAkubWJveF9zdGF0X3JlYWQgPSBzcHVfaHdfbWJveF9zdGF0X3JlYWQsCkBAIC0zMjAsNCArMzI4LDUgQEAKIAkucmVhZF9tZmNfdGFnc3RhdHVzID0gc3B1X2h3X3JlYWRfbWZjX3RhZ3N0YXR1cywKIAkuZ2V0X21mY19mcmVlX2VsZW1lbnRzID0gc3B1X2h3X2dldF9tZmNfZnJlZV9lbGVtZW50cywKIAkuc2VuZF9tZmNfY29tbWFuZCA9IHNwdV9od19zZW5kX21mY19jb21tYW5kLAorCS5yZXN0YXJ0X2RtYSA9IHNwdV9od19yZXN0YXJ0X2RtYSwKIH07CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvaW5vZGUuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9pbm9kZS5jCmluZGV4IDgwNzk5ODMuLjEzZTRmNzAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9pbm9kZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9pbm9kZS5jCkBAIC0zNiw2ICszNiw3IEBACiAjaW5jbHVkZSA8YXNtL3Byb20uaD4KICNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CiAjaW5jbHVkZSA8YXNtL3NwdS5oPgorI2luY2x1ZGUgPGFzbS9zcHVfcHJpdjEuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCiAjaW5jbHVkZSAic3B1ZnMuaCIKQEAgLTU0LDYgKzU1LDcgQEAKIAogCWVpLT5pX2dhbmcgPSBOVUxMOwogCWVpLT5pX2N0eCA9IE5VTEw7CisJZWktPmlfb3BlbmVycyA9IDA7CiAKIAlyZXR1cm4gJmVpLT52ZnNfaW5vZGU7CiB9CkBAIC01MjAsMTMgKzUyMiwxNCBAQAogCiAvKiBGaWxlIHN5c3RlbSBpbml0aWFsaXphdGlvbiAqLwogZW51bSB7Ci0JT3B0X3VpZCwgT3B0X2dpZCwgT3B0X2VyciwKKwlPcHRfdWlkLCBPcHRfZ2lkLCBPcHRfbW9kZSwgT3B0X2VyciwKIH07CiAKIHN0YXRpYyBtYXRjaF90YWJsZV90IHNwdWZzX3Rva2VucyA9IHsKLQl7IE9wdF91aWQsICJ1aWQ9JWQiIH0sCi0JeyBPcHRfZ2lkLCAiZ2lkPSVkIiB9LAotCXsgT3B0X2VyciwgTlVMTCAgfSwKKwl7IE9wdF91aWQsICAidWlkPSVkIiB9LAorCXsgT3B0X2dpZCwgICJnaWQ9JWQiIH0sCisJeyBPcHRfbW9kZSwgIm1vZGU9JW8iIH0sCisJeyBPcHRfZXJyLCAgIE5VTEwgIH0sCiB9OwogCiBzdGF0aWMgaW50CkBAIC01NTMsNiArNTU2LDExIEBACiAJCQkJcmV0dXJuIDA7CiAJCQlyb290LT5pX2dpZCA9IG9wdGlvbjsKIAkJCWJyZWFrOworCQljYXNlIE9wdF9tb2RlOgorCQkJaWYgKG1hdGNoX29jdGFsKCZhcmdzWzBdLCAmb3B0aW9uKSkKKwkJCQlyZXR1cm4gMDsKKwkJCXJvb3QtPmlfbW9kZSA9IG9wdGlvbiB8IFNfSUZESVI7CisJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCXJldHVybiAwOwogCQl9CkBAIC01NjAsNiArNTY4LDExIEBACiAJcmV0dXJuIDE7CiB9CiAKK3N0YXRpYyB2b2lkIHNwdWZzX2V4aXRfaXNvbGF0ZWRfbG9hZGVyKHZvaWQpCit7CisJa2ZyZWUoaXNvbGF0ZWRfbG9hZGVyKTsKK30KKwogc3RhdGljIHZvaWQKIHNwdWZzX2luaXRfaXNvbGF0ZWRfbG9hZGVyKHZvaWQpCiB7CkBAIC01NzEsNyArNTg0LDcgQEAKIAlpZiAoIWRuKQogCQlyZXR1cm47CiAKLQlsb2FkZXIgPSBnZXRfcHJvcGVydHkoZG4sICJsb2FkZXIiLCAmc2l6ZSk7CisJbG9hZGVyID0gb2ZfZ2V0X3Byb3BlcnR5KGRuLCAibG9hZGVyIiwgJnNpemUpOwogCWlmICghbG9hZGVyKQogCQlyZXR1cm47CiAKQEAgLTY1Myw2ICs2NjYsMTAgQEAKIHsKIAlpbnQgcmV0OwogCisJcmV0ID0gLUVOT0RFVjsKKwlpZiAoIXNwdV9tYW5hZ2VtZW50X29wcykKKwkJZ290byBvdXQ7CisKIAlyZXQgPSAtRU5PTUVNOwogCXNwdWZzX2lub2RlX2NhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUoInNwdWZzX2lub2RlX2NhY2hlIiwKIAkJCXNpemVvZihzdHJ1Y3Qgc3B1ZnNfaW5vZGVfaW5mbyksIDAsCkBAIC02NjAsMjUgKzY3NywyOSBAQAogCiAJaWYgKCFzcHVmc19pbm9kZV9jYWNoZSkKIAkJZ290byBvdXQ7Ci0JaWYgKHNwdV9zY2hlZF9pbml0KCkgIT0gMCkgewotCQlrbWVtX2NhY2hlX2Rlc3Ryb3koc3B1ZnNfaW5vZGVfY2FjaGUpOwotCQlnb3RvIG91dDsKLQl9Ci0JcmV0ID0gcmVnaXN0ZXJfZmlsZXN5c3RlbSgmc3B1ZnNfdHlwZSk7CisJcmV0ID0gc3B1X3NjaGVkX2luaXQoKTsKIAlpZiAocmV0KQogCQlnb3RvIG91dF9jYWNoZTsKKwlyZXQgPSByZWdpc3Rlcl9maWxlc3lzdGVtKCZzcHVmc190eXBlKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF9zY2hlZDsKIAlyZXQgPSByZWdpc3Rlcl9zcHVfc3lzY2FsbHMoJnNwdWZzX2NhbGxzKTsKIAlpZiAocmV0KQogCQlnb3RvIG91dF9mczsKIAlyZXQgPSByZWdpc3Rlcl9hcmNoX2NvcmVkdW1wX2NhbGxzKCZzcHVmc19jb3JlZHVtcF9jYWxscyk7CiAJaWYgKHJldCkKLQkJZ290byBvdXRfZnM7CisJCWdvdG8gb3V0X3N5c2NhbGxzOwogCiAJc3B1ZnNfaW5pdF9pc29sYXRlZF9sb2FkZXIoKTsKIAogCXJldHVybiAwOworCitvdXRfc3lzY2FsbHM6CisJdW5yZWdpc3Rlcl9zcHVfc3lzY2FsbHMoJnNwdWZzX2NhbGxzKTsKIG91dF9mczoKIAl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJnNwdWZzX3R5cGUpOworb3V0X3NjaGVkOgorCXNwdV9zY2hlZF9leGl0KCk7CiBvdXRfY2FjaGU6CiAJa21lbV9jYWNoZV9kZXN0cm95KHNwdWZzX2lub2RlX2NhY2hlKTsKIG91dDoKQEAgLTY4OSw2ICs3MTAsNyBAQAogc3RhdGljIHZvaWQgX19leGl0IHNwdWZzX2V4aXQodm9pZCkKIHsKIAlzcHVfc2NoZWRfZXhpdCgpOworCXNwdWZzX2V4aXRfaXNvbGF0ZWRfbG9hZGVyKCk7CiAJdW5yZWdpc3Rlcl9hcmNoX2NvcmVkdW1wX2NhbGxzKCZzcHVmc19jb3JlZHVtcF9jYWxscyk7CiAJdW5yZWdpc3Rlcl9zcHVfc3lzY2FsbHMoJnNwdWZzX2NhbGxzKTsKIAl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJnNwdWZzX3R5cGUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3J1bi5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3J1bi5jCmluZGV4IGY5NWE2MTEuLjU3NjI2NjAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9ydW4uYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvcnVuLmMKQEAgLTE4LDI3ICsxOCw2IEBACiAJd2FrZV91cF9hbGwoJmN0eC0+c3RvcF93cSk7CiB9CiAKLXZvaWQgc3B1ZnNfZG1hX2NhbGxiYWNrKHN0cnVjdCBzcHUgKnNwdSwgaW50IHR5cGUpCi17Ci0Jc3RydWN0IHNwdV9jb250ZXh0ICpjdHggPSBzcHUtPmN0eDsKLQotCWlmIChjdHgtPmZsYWdzICYgU1BVX0NSRUFURV9FVkVOVFNfRU5BQkxFRCkgewotCQljdHgtPmV2ZW50X3JldHVybiB8PSB0eXBlOwotCQl3YWtlX3VwX2FsbCgmY3R4LT5zdG9wX3dxKTsKLQl9IGVsc2UgewotCQlzd2l0Y2ggKHR5cGUpIHsKLQkJY2FzZSBTUEVfRVZFTlRfRE1BX0FMSUdOTUVOVDoKLQkJY2FzZSBTUEVfRVZFTlRfU1BFX0RBVEFfU1RPUkFHRToKLQkJY2FzZSBTUEVfRVZFTlRfSU5WQUxJRF9ETUE6Ci0JCQlmb3JjZV9zaWcoU0lHQlVTLCAvKiBpbmZvLCAqLyBjdXJyZW50KTsKLQkJCWJyZWFrOwotCQljYXNlIFNQRV9FVkVOVF9TUEVfRVJST1I6Ci0JCQlmb3JjZV9zaWcoU0lHSUxMLCAvKiBpbmZvICovIGN1cnJlbnQpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci19Ci0KIHN0YXRpYyBpbmxpbmUgaW50IHNwdV9zdG9wcGVkKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4LCB1MzIgKiBzdGF0KQogewogCXN0cnVjdCBzcHUgKnNwdTsKQEAgLTYzLDEzICs0MiwxOCBAQAogCWNvbnN0IHUzMiBzdGF0dXNfbG9hZGluZyA9IFNQVV9TVEFUVVNfUlVOTklORwogCQl8IFNQVV9TVEFUVVNfSVNPTEFURURfU1RBVEUgfCBTUFVfU1RBVFVTX0lTT0xBVEVEX0xPQURfU1RBVFVTOwogCisJcmV0ID0gLUVOT0RFVjsKIAlpZiAoIWlzb2xhdGVkX2xvYWRlcikKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlyZXQgPSBzcHVfYWNxdWlyZV9leGNsdXNpdmUoY3R4KTsKLQlpZiAocmV0KQogCQlnb3RvIG91dDsKIAorCS8qCisJICogV2UgbmVlZCB0byBleGNsdWRlIHVzZXJzcGFjZSBhY2Nlc3MgdG8gdGhlIGNvbnRleHQuCisJICoKKwkgKiBUbyBwcm90ZWN0IGFnYWluc3QgbWVtb3J5IGFjY2VzcyB3ZSBpbnZhbGlkYXRlIGFsbCBwdGVzCisJICogYW5kIG1ha2Ugc3VyZSB0aGUgcGFnZWZhdWx0IGhhbmRsZXJzIGJsb2NrIG9uIHRoZSBtdXRleC4KKwkgKi8KKwlzcHVfdW5tYXBfbWFwcGluZ3MoY3R4KTsKKwogCW1mY19jbnRsID0gJmN0eC0+c3B1LT5wcml2Mi0+bWZjX2NvbnRyb2xfUlc7CiAKIAkvKiBwdXJnZSB0aGUgTUZDIERNQSBxdWV1ZSB0byBlbnN1cmUgbm8gc3B1cmlvdXMgYWNjZXNzZXMgYmVmb3JlIHdlCkBAIC04Miw3ICs2Niw3IEBACiAJCQlwcmludGsoS0VSTl9FUlIgIiVzOiB0aW1lb3V0IGZsdXNoaW5nIE1GQyBETUEgcXVldWVcbiIsCiAJCQkJCV9fRlVOQ1RJT05fXyk7CiAJCQlyZXQgPSAtRUlPOwotCQkJZ290byBvdXRfdW5sb2NrOworCQkJZ290byBvdXQ7CiAJCX0KIAkJY29uZF9yZXNjaGVkKCk7CiAJfQpAQCAtMTE5LDEyICsxMDMsMTUgQEAKIAkJcHJfZGVidWcoIiVzOiBpc29sYXRlZCBMT0FEIGZhaWxlZFxuIiwgX19GVU5DVElPTl9fKTsKIAkJY3R4LT5vcHMtPnJ1bmNudGxfd3JpdGUoY3R4LCBTUFVfUlVOQ05UTF9SVU5OQUJMRSk7CiAJCXJldCA9IC1FQUNDRVM7CisJCWdvdG8gb3V0X2Ryb3BfcHJpdjsKKwl9CiAKLQl9IGVsc2UgaWYgKCEoc3RhdHVzICYgU1BVX1NUQVRVU19JU09MQVRFRF9TVEFURSkpIHsKKwlpZiAoIShzdGF0dXMgJiBTUFVfU1RBVFVTX0lTT0xBVEVEX1NUQVRFKSkgewogCQkvKiBUaGlzIGlzbid0IGFsbG93ZWQgYnkgdGhlIENCRUEsIGJ1dCBjaGVjayBhbnl3YXkgKi8KIAkJcHJfZGVidWcoIiVzOiBTUFUgZmVsbCBvdXQgb2YgaXNvbGF0ZWQgbW9kZT9cbiIsIF9fRlVOQ1RJT05fXyk7CiAJCWN0eC0+b3BzLT5ydW5jbnRsX3dyaXRlKGN0eCwgU1BVX1JVTkNOVExfU1RPUCk7CiAJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X2Ryb3BfcHJpdjsKIAl9CiAKIG91dF9kcm9wX3ByaXY6CkBAIC0xMzIsMzAgKzExOSwxOSBAQAogCXNyMSB8PSBNRkNfU1RBVEUxX1BST0JMRU1fU1RBVEVfTUFTSzsKIAlzcHVfbWZjX3NyMV9zZXQoY3R4LT5zcHUsIHNyMSk7CiAKLW91dF91bmxvY2s6Ci0Jc3B1X3JlbGVhc2UoY3R4KTsKIG91dDoKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW5saW5lIGludCBzcHVfcnVuX2luaXQoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgsIHUzMiAqIG5wYykKK3N0YXRpYyBpbnQgc3B1X3J1bl9pbml0KHN0cnVjdCBzcHVfY29udGV4dCAqY3R4LCB1MzIgKiBucGMpCiB7Ci0JaW50IHJldDsKLQl1bnNpZ25lZCBsb25nIHJ1bmNudGwgPSBTUFVfUlVOQ05UTF9SVU5OQUJMRTsKLQotCXJldCA9IHNwdV9hY3F1aXJlX3J1bm5hYmxlKGN0eCwgMCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQogCWlmIChjdHgtPmZsYWdzICYgU1BVX0NSRUFURV9JU09MQVRFKSB7CisJCXVuc2lnbmVkIGxvbmcgcnVuY250bDsKKwogCQlpZiAoIShjdHgtPm9wcy0+c3RhdHVzX3JlYWQoY3R4KSAmIFNQVV9TVEFUVVNfSVNPTEFURURfU1RBVEUpKSB7Ci0JCQkvKiBOZWVkIHRvIHJlbGVhc2UgY3R4LCBiZWNhdXNlIHNwdV9zZXR1cF9pc29sYXRlZCB3aWxsCi0JCQkgKiBhY3F1aXJlIGl0IGV4Y2x1c2l2ZWx5LgotCQkJICovCi0JCQlzcHVfcmVsZWFzZShjdHgpOwotCQkJcmV0ID0gc3B1X3NldHVwX2lzb2xhdGVkKGN0eCk7Ci0JCQlpZiAoIXJldCkKLQkJCQlyZXQgPSBzcHVfYWNxdWlyZV9ydW5uYWJsZShjdHgsIDApOworCQkJaW50IHJldCA9IHNwdV9zZXR1cF9pc29sYXRlZChjdHgpOworCQkJaWYgKHJldCkKKwkJCQlyZXR1cm4gcmV0OwogCQl9CiAKIAkJLyogaWYgdXNlcnNwYWNlIGhhcyBzZXQgdGhlIHJ1bmNudHJsIHJlZ2lzdGVyIChlZywgdG8gaXNzdWUgYW4KQEAgLTE2NCwxNiArMTQwLDE3IEBACiAJCQkoU1BVX1JVTkNOVExfUlVOTkFCTEUgfCBTUFVfUlVOQ05UTF9JU09MQVRFKTsKIAkJaWYgKHJ1bmNudGwgPT0gMCkKIAkJCXJ1bmNudGwgPSBTUFVfUlVOQ05UTF9SVU5OQUJMRTsKKwkJY3R4LT5vcHMtPnJ1bmNudGxfd3JpdGUoY3R4LCBydW5jbnRsKTsKIAl9IGVsc2UgewogCQlzcHVfc3RhcnRfdGljayhjdHgpOwogCQljdHgtPm9wcy0+bnBjX3dyaXRlKGN0eCwgKm5wYyk7CisJCWN0eC0+b3BzLT5ydW5jbnRsX3dyaXRlKGN0eCwgU1BVX1JVTkNOVExfUlVOTkFCTEUpOwogCX0KIAotCWN0eC0+b3BzLT5ydW5jbnRsX3dyaXRlKGN0eCwgcnVuY250bCk7Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgc3B1X3J1bl9maW5pKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4LCB1MzIgKiBucGMsCitzdGF0aWMgaW50IHNwdV9ydW5fZmluaShzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCwgdTMyICogbnBjLAogCQkJICAgICAgIHUzMiAqIHN0YXR1cykKIHsKIAlpbnQgcmV0ID0gMDsKQEAgLTE4OSwxOSArMTY2LDI3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgc3B1X3JlYWNxdWlyZV9ydW5uYWJsZShzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCwgdTMyICpucGMsCitzdGF0aWMgaW50IHNwdV9yZWFjcXVpcmVfcnVubmFibGUoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgsIHUzMiAqbnBjLAogCQkJCSAgICAgICAgIHUzMiAqc3RhdHVzKQogewogCWludCByZXQ7CiAKLQlpZiAoKHJldCA9IHNwdV9ydW5fZmluaShjdHgsIG5wYywgc3RhdHVzKSkgIT0gMCkKKwlyZXQgPSBzcHVfcnVuX2ZpbmkoY3R4LCBucGMsIHN0YXR1cyk7CisJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKLQlpZiAoKnN0YXR1cyAmIChTUFVfU1RBVFVTX1NUT1BQRURfQllfU1RPUCB8Ci0JCSAgICAgICBTUFVfU1RBVFVTX1NUT1BQRURfQllfSEFMVCkpIHsKKworCWlmICgqc3RhdHVzICYgKFNQVV9TVEFUVVNfU1RPUFBFRF9CWV9TVE9QIHwgU1BVX1NUQVRVU19TVE9QUEVEX0JZX0hBTFQpKQogCQlyZXR1cm4gKnN0YXR1czsKLQl9Ci0JaWYgKChyZXQgPSBzcHVfcnVuX2luaXQoY3R4LCBucGMpKSAhPSAwKQorCisJcmV0ID0gc3B1X2FjcXVpcmVfcnVubmFibGUoY3R4LCAwKTsKKwlpZiAocmV0KQogCQlyZXR1cm4gcmV0OworCisJcmV0ID0gc3B1X3J1bl9pbml0KGN0eCwgbnBjKTsKKwlpZiAocmV0KSB7CisJCXNwdV9yZWxlYXNlKGN0eCk7CisJCXJldHVybiByZXQ7CisJfQogCXJldHVybiAwOwogfQogCkBAIC0yNTMsMTcgKzIzOCwxNyBAQAogewogCXN0cnVjdCBzcHVfc3lzY2FsbF9ibG9jayBzOwogCXUzMiBsc19wb2ludGVyLCBucGM7Ci0JY2hhciAqbHM7CisJdm9pZCBfX2lvbWVtICpsczsKIAlsb25nIHNwdV9yZXQ7CiAJaW50IHJldDsKIAogCS8qIGdldCBzeXNjYWxsIGJsb2NrIGZyb20gbG9jYWwgc3RvcmUgKi8KLQlucGMgPSBjdHgtPm9wcy0+bnBjX3JlYWQoY3R4KTsKLQlscyA9IGN0eC0+b3BzLT5nZXRfbHMoY3R4KTsKLQlsc19wb2ludGVyID0gKih1MzIqKShscyArIG5wYyk7CisJbnBjID0gY3R4LT5vcHMtPm5wY19yZWFkKGN0eCkgJiB+MzsKKwlscyA9ICh2b2lkIF9faW9tZW0gKiljdHgtPm9wcy0+Z2V0X2xzKGN0eCk7CisJbHNfcG9pbnRlciA9IGluX2JlMzIobHMgKyBucGMpOwogCWlmIChsc19wb2ludGVyID4gKExTX1NJWkUgLSBzaXplb2YocykpKQogCQlyZXR1cm4gLUVGQVVMVDsKLQltZW1jcHkoJnMsIGxzICsgbHNfcG9pbnRlciwgc2l6ZW9mIChzKSk7CisJbWVtY3B5X2Zyb21pbygmcywgbHMgKyBsc19wb2ludGVyLCBzaXplb2YocykpOwogCiAJLyogZG8gYWN0dWFsIHN5c2NhbGwgd2l0aG91dCBwaW5uaW5nIHRoZSBzcHUgKi8KIAlyZXQgPSAwOwpAQCAtMjgzLDcgKzI2OCw3IEBACiAJfQogCiAJLyogd3JpdGUgcmVzdWx0LCBqdW1wIG92ZXIgaW5kaXJlY3QgcG9pbnRlciAqLwotCW1lbWNweShscyArIGxzX3BvaW50ZXIsICZzcHVfcmV0LCBzaXplb2YgKHNwdV9yZXQpKTsKKwltZW1jcHlfdG9pbyhscyArIGxzX3BvaW50ZXIsICZzcHVfcmV0LCBzaXplb2Yoc3B1X3JldCkpOwogCWN0eC0+b3BzLT5ucGNfd3JpdGUoY3R4LCBucGMpOwogCWN0eC0+b3BzLT5ydW5jbnRsX3dyaXRlKGN0eCwgU1BVX1JVTkNOVExfUlVOTkFCTEUpOwogCXJldHVybiByZXQ7CkBAIC0yOTIsMTEgKzI3Nyw4IEBACiBzdGF0aWMgaW5saW5lIGludCBzcHVfcHJvY2Vzc19ldmVudHMoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgpCiB7CiAJc3RydWN0IHNwdSAqc3B1ID0gY3R4LT5zcHU7Ci0JdTY0IHB0ZV9mYXVsdCA9IE1GQ19EU0lTUl9QVEVfTk9UX0ZPVU5EIHwgTUZDX0RTSVNSX0FDQ0VTU19ERU5JRUQ7CiAJaW50IHJldCA9IDA7CiAKLQlpZiAoc3B1LT5kc2lzciAmIHB0ZV9mYXVsdCkKLQkJcmV0ID0gc3B1X2lycV9jbGFzc18xX2JvdHRvbShzcHUpOwogCWlmIChzcHUtPmNsYXNzXzBfcGVuZGluZykKIAkJcmV0ID0gc3B1X2lycV9jbGFzc18wX2JvdHRvbShzcHUpOwogCWlmICghcmV0ICYmIHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQpAQCAtMzEwLDE0ICsyOTIsMjEgQEAKIAlpbnQgcmV0OwogCXUzMiBzdGF0dXM7CiAKLQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZjdHgtPnJ1bl9zZW1hKSkKKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZjdHgtPnJ1bl9tdXRleCkpCiAJCXJldHVybiAtRVJFU1RBUlRTWVM7CiAKIAljdHgtPm9wcy0+bWFzdGVyX3N0YXJ0KGN0eCk7CiAJY3R4LT5ldmVudF9yZXR1cm4gPSAwOwotCXJldCA9IHNwdV9ydW5faW5pdChjdHgsIG5wYyk7CisKKwlyZXQgPSBzcHVfYWNxdWlyZV9ydW5uYWJsZShjdHgsIDApOwogCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBzcHVfcnVuX2luaXQoY3R4LCBucGMpOworCWlmIChyZXQpIHsKKwkJc3B1X3JlbGVhc2UoY3R4KTsKIAkJZ290byBvdXQ7CisJfQogCiAJZG8gewogCQlyZXQgPSBzcHVmc193YWl0KGN0eC0+c3RvcF93cSwgc3B1X3N0b3BwZWQoY3R4LCAmc3RhdHVzKSk7CkBAIC0zMzAsNiArMzE5LDEwIEBACiAJCQkJYnJlYWs7CiAJCQlzdGF0dXMgJj0gflNQVV9TVEFUVVNfU1RPUFBFRF9CWV9TVE9QOwogCQl9CisJCXJldCA9IHNwdWZzX2hhbmRsZV9jbGFzczEoY3R4KTsKKwkJaWYgKHJldCkKKwkJCWJyZWFrOworCiAJCWlmICh1bmxpa2VseShjdHgtPnN0YXRlICE9IFNQVV9TVEFURV9SVU5OQUJMRSkpIHsKIAkJCXJldCA9IHNwdV9yZWFjcXVpcmVfcnVubmFibGUoY3R4LCBucGMsICZzdGF0dXMpOwogCQkJaWYgKHJldCkgewpAQCAtMzYzLDYgKzM1Niw2IEBACiAKIG91dDoKIAkqZXZlbnQgPSBjdHgtPmV2ZW50X3JldHVybjsKLQl1cCgmY3R4LT5ydW5fc2VtYSk7CisJbXV0ZXhfdW5sb2NrKCZjdHgtPnJ1bl9tdXRleCk7CiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zY2hlZC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3NjaGVkLmMKaW5kZXggMzk4MjNjZS4uOTEwMzBiOCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3NjaGVkLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3NjaGVkLmMKQEAgLTcxLDE0ICs3MSwyNyBAQAogCiB2b2lkIHNwdV9zdGFydF90aWNrKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4KQogewotCWlmIChjdHgtPnBvbGljeSA9PSBTQ0hFRF9SUikKKwlpZiAoY3R4LT5wb2xpY3kgPT0gU0NIRURfUlIpIHsKKwkJLyoKKwkJICogTWFrZSBzdXJlIHRoZSBleGl0aW5nIGJpdCBpcyBjbGVhcmVkLgorCQkgKi8KKwkJY2xlYXJfYml0KFNQVV9TQ0hFRF9FWElUSU5HLCAmY3R4LT5zY2hlZF9mbGFncyk7CisJCW1iKCk7CiAJCXF1ZXVlX2RlbGF5ZWRfd29yayhzcHVfc2NoZWRfd3EsICZjdHgtPnNjaGVkX3dvcmssIFNQVV9USU1FU0xJQ0UpOworCX0KIH0KIAogdm9pZCBzcHVfc3RvcF90aWNrKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4KQogewotCWlmIChjdHgtPnBvbGljeSA9PSBTQ0hFRF9SUikKKwlpZiAoY3R4LT5wb2xpY3kgPT0gU0NIRURfUlIpIHsKKwkJLyoKKwkJICogV2hpbGUgdGhlIHdvcmsgY2FuIGJlIHJlYXJtaW5nIG5vcm1hbGx5IHNldHRpbmcgdGhpcyBmbGFnCisJCSAqIG1ha2VzIHN1cmUgaXQgZG9lcyBub3QgcmVhcm0gaXRzZWxmIGFueW1vcmUuCisJCSAqLworCQlzZXRfYml0KFNQVV9TQ0hFRF9FWElUSU5HLCAmY3R4LT5zY2hlZF9mbGFncyk7CisJCW1iKCk7CiAJCWNhbmNlbF9kZWxheWVkX3dvcmsoJmN0eC0+c2NoZWRfd29yayk7CisJfQogfQogCiB2b2lkIHNwdV9zY2hlZF90aWNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKQEAgLTg2LDcgKzk5LDE1IEBACiAJc3RydWN0IHNwdV9jb250ZXh0ICpjdHggPQogCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHNwdV9jb250ZXh0LCBzY2hlZF93b3JrLndvcmspOwogCXN0cnVjdCBzcHUgKnNwdTsKLQlpbnQgcmVhcm0gPSAxOworCWludCBwcmVlbXB0ZWQgPSAwOworCisJLyoKKwkgKiBJZiB0aGlzIGNvbnRleHQgaXMgYmVpbmcgc3RvcHBlZCBhdm9pZCByZXNjaGVkdWxpbmcgZnJvbSB0aGUKKwkgKiBzY2hlZHVsZXIgdGljayBiZWNhdXNlIHdlIHdvdWxkIGJsb2NrIG9uIHRoZSBzdGF0ZV9tdXRleC4KKwkgKiBUaGUgY2FsbGVyIHdpbGwgeWllbGQgdGhlIHNwdSBsYXRlciBvbiBhbnl3YXkuCisJICovCisJaWYgKHRlc3RfYml0KFNQVV9TQ0hFRF9FWElUSU5HLCAmY3R4LT5zY2hlZF9mbGFncykpCisJCXJldHVybjsKIAogCW11dGV4X2xvY2soJmN0eC0+c3RhdGVfbXV0ZXgpOwogCXNwdSA9IGN0eC0+c3B1OwpAQCAtOTQsMTIgKzExNSwxOSBAQAogCQlpbnQgYmVzdCA9IHNjaGVkX2ZpbmRfZmlyc3RfYml0KHNwdV9wcmlvLT5iaXRtYXApOwogCQlpZiAoYmVzdCA8PSBjdHgtPnByaW8pIHsKIAkJCXNwdV9kZWFjdGl2YXRlKGN0eCk7Ci0JCQlyZWFybSA9IDA7CisJCQlwcmVlbXB0ZWQgPSAxOwogCQl9CiAJfQogCW11dGV4X3VubG9jaygmY3R4LT5zdGF0ZV9tdXRleCk7CiAKLQlpZiAocmVhcm0pCisJaWYgKHByZWVtcHRlZCkgeworCQkvKgorCQkgKiBXZSBuZWVkIHRvIGJyZWFrIG91dCBvZiB0aGUgd2FpdCBsb29wIGluIHNwdV9ydW4gbWFudWFsbHkKKwkJICogdG8gZW5zdXJlIHRoaXMgY29udGV4dCBnZXRzIHB1dCBvbiB0aGUgcnVucXVldWUgYWdhaW4KKwkJICogQVNBUC4KKwkJICovCisJCXdha2VfdXAoJmN0eC0+c3RvcF93cSk7CisJfSBlbHNlCiAJCXNwdV9zdGFydF90aWNrKGN0eCk7CiB9CiAKQEAgLTIwOCw1OCArMjM2LDQwIEBACiAgKiBzcHVfYWRkX3RvX3JxIC0gYWRkIGEgY29udGV4dCB0byB0aGUgcnVucXVldWUKICAqIEBjdHg6ICAgICAgIGNvbnRleHQgdG8gYWRkCiAgKi8KLXN0YXRpYyB2b2lkIHNwdV9hZGRfdG9fcnEoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgpCitzdGF0aWMgdm9pZCBfX3NwdV9hZGRfdG9fcnEoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgpCiB7Ci0Jc3Bpbl9sb2NrKCZzcHVfcHJpby0+cnVucV9sb2NrKTsKLQlsaXN0X2FkZF90YWlsKCZjdHgtPnJxLCAmc3B1X3ByaW8tPnJ1bnFbY3R4LT5wcmlvXSk7Ci0Jc2V0X2JpdChjdHgtPnByaW8sIHNwdV9wcmlvLT5iaXRtYXApOwotCXNwaW5fdW5sb2NrKCZzcHVfcHJpby0+cnVucV9sb2NrKTsKKwlpbnQgcHJpbyA9IGN0eC0+cHJpbzsKKworCWxpc3RfYWRkX3RhaWwoJmN0eC0+cnEsICZzcHVfcHJpby0+cnVucVtwcmlvXSk7CisJc2V0X2JpdChwcmlvLCBzcHVfcHJpby0+Yml0bWFwKTsKIH0KIAotLyoqCi0gKiBzcHVfZGVsX2Zyb21fcnEgLSByZW1vdmUgYSBjb250ZXh0IGZyb20gdGhlIHJ1bnF1ZXVlCi0gKiBAY3R4OiAgICAgICBjb250ZXh0IHRvIHJlbW92ZQotICovCi1zdGF0aWMgdm9pZCBzcHVfZGVsX2Zyb21fcnEoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgpCitzdGF0aWMgdm9pZCBfX3NwdV9kZWxfZnJvbV9ycShzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCkKIHsKLQlzcGluX2xvY2soJnNwdV9wcmlvLT5ydW5xX2xvY2spOwotCWxpc3RfZGVsX2luaXQoJmN0eC0+cnEpOwotCWlmIChsaXN0X2VtcHR5KCZzcHVfcHJpby0+cnVucVtjdHgtPnByaW9dKSkKLQkJY2xlYXJfYml0KGN0eC0+cHJpbywgc3B1X3ByaW8tPmJpdG1hcCk7Ci0Jc3Bpbl91bmxvY2soJnNwdV9wcmlvLT5ydW5xX2xvY2spOwotfQorCWludCBwcmlvID0gY3R4LT5wcmlvOwogCi0vKioKLSAqIHNwdV9ncmFiX2NvbnRleHQgLSByZW1vdmUgb25lIGNvbnRleHQgZnJvbSB0aGUgcnVucXVldWUKLSAqIEBwcmlvOiAgICAgIHByaW9yaXR5IG9mIHRoZSBjb250ZXh0IHRvIGJlIHJlbW92ZWQKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHJlbW92ZXMgb25lIGNvbnRleHQgZnJvbSB0aGUgcnVucXVldWUgZm9yIHByaW9yaXR5IEBwcmlvLgotICogSWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBjb250ZXh0IHdpdGggdGhlIGdpdmVuIHByaW9yaXR5IHRoZSBmaXJzdAotICogdGFzayBvbiB0aGUgcnVucXVldWUgd2lsbCBiZSB0YWtlbi4KLSAqCi0gKiBSZXR1cm5zIHRoZSBzcHVfY29udGV4dCBpdCBqdXN0IHJlbW92ZWQuCi0gKgotICogTXVzdCBiZSBjYWxsZWQgd2l0aCBzcHVfcHJpby0+cnVucV9sb2NrIGhlbGQuCi0gKi8KLXN0YXRpYyBzdHJ1Y3Qgc3B1X2NvbnRleHQgKnNwdV9ncmFiX2NvbnRleHQoaW50IHByaW8pCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcnEgPSAmc3B1X3ByaW8tPnJ1bnFbcHJpb107Ci0KLQlpZiAobGlzdF9lbXB0eShycSkpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBsaXN0X2VudHJ5KHJxLT5uZXh0LCBzdHJ1Y3Qgc3B1X2NvbnRleHQsIHJxKTsKKwlpZiAoIWxpc3RfZW1wdHkoJmN0eC0+cnEpKQorCQlsaXN0X2RlbF9pbml0KCZjdHgtPnJxKTsKKwlpZiAobGlzdF9lbXB0eSgmc3B1X3ByaW8tPnJ1bnFbcHJpb10pKQorCQljbGVhcl9iaXQocHJpbywgc3B1X3ByaW8tPmJpdG1hcCk7CiB9CiAKIHN0YXRpYyB2b2lkIHNwdV9wcmlvX3dhaXQoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgpCiB7CiAJREVGSU5FX1dBSVQod2FpdCk7CiAKKwlzcGluX2xvY2soJnNwdV9wcmlvLT5ydW5xX2xvY2spOwogCXByZXBhcmVfdG9fd2FpdF9leGNsdXNpdmUoJmN0eC0+c3RvcF93cSwgJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSk7CiAJaWYgKCFzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQlfX3NwdV9hZGRfdG9fcnEoY3R4KTsKKwkJc3Bpbl91bmxvY2soJnNwdV9wcmlvLT5ydW5xX2xvY2spOwogCQltdXRleF91bmxvY2soJmN0eC0+c3RhdGVfbXV0ZXgpOwogCQlzY2hlZHVsZSgpOwogCQltdXRleF9sb2NrKCZjdHgtPnN0YXRlX211dGV4KTsKKwkJc3Bpbl9sb2NrKCZzcHVfcHJpby0+cnVucV9sb2NrKTsKKwkJX19zcHVfZGVsX2Zyb21fcnEoY3R4KTsKIAl9CisJc3Bpbl91bmxvY2soJnNwdV9wcmlvLT5ydW5xX2xvY2spOwogCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKIAlyZW1vdmVfd2FpdF9xdWV1ZSgmY3R4LT5zdG9wX3dxLCAmd2FpdCk7CiB9CkBAIC0yODAsOSArMjkwLDE0IEBACiAJc3Bpbl9sb2NrKCZzcHVfcHJpby0+cnVucV9sb2NrKTsKIAliZXN0ID0gc2NoZWRfZmluZF9maXJzdF9iaXQoc3B1X3ByaW8tPmJpdG1hcCk7CiAJaWYgKGJlc3QgPCBNQVhfUFJJTykgewotCQlzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCA9IHNwdV9ncmFiX2NvbnRleHQoYmVzdCk7Ci0JCWlmIChjdHgpCi0JCQl3YWtlX3VwKCZjdHgtPnN0b3Bfd3EpOworCQlzdHJ1Y3QgbGlzdF9oZWFkICpycSA9ICZzcHVfcHJpby0+cnVucVtiZXN0XTsKKwkJc3RydWN0IHNwdV9jb250ZXh0ICpjdHg7CisKKwkJQlVHX09OKGxpc3RfZW1wdHkocnEpKTsKKworCQljdHggPSBsaXN0X2VudHJ5KHJxLT5uZXh0LCBzdHJ1Y3Qgc3B1X2NvbnRleHQsIHJxKTsKKwkJX19zcHVfZGVsX2Zyb21fcnEoY3R4KTsKKwkJd2FrZV91cCgmY3R4LT5zdG9wX3dxKTsKIAl9CiAJc3Bpbl91bmxvY2soJnNwdV9wcmlvLT5ydW5xX2xvY2spOwogfQpAQCAtMzY1LDYgKzM4MCwxMiBAQAogCQkJfQogCQkJc3B1X3VuYmluZF9jb250ZXh0KHNwdSwgdmljdGltKTsKIAkJCW11dGV4X3VubG9jaygmdmljdGltLT5zdGF0ZV9tdXRleCk7CisJCQkvKgorCQkJICogV2UgbmVlZCB0byBicmVhayBvdXQgb2YgdGhlIHdhaXQgbG9vcCBpbiBzcHVfcnVuCisJCQkgKiBtYW51YWxseSB0byBlbnN1cmUgdGhpcyBjb250ZXh0IGdldHMgcHV0IG9uIHRoZQorCQkJICogcnVucXVldWUgYWdhaW4gQVNBUC4KKwkJCSAqLworCQkJd2FrZV91cCgmdmljdGltLT5zdG9wX3dxKTsKIAkJCXJldHVybiBzcHU7CiAJCX0KIAl9CkBAIC0zNzcsNyArMzk4LDcgQEAKICAqIEBjdHg6CXNwdSBjb250ZXh0IHRvIHNjaGVkdWxlCiAgKiBAZmxhZ3M6CWZsYWdzIChjdXJyZW50bHkgaWdub3JlZCkKICAqCi0gKiBUcmllcyB0byBmaW5kIGEgZnJlZSBzcHUgdG8gcnVuIEBjdHguICBJZiBubyBmcmVlIHNwdSBpcyBhdmFpbGJsZQorICogVHJpZXMgdG8gZmluZCBhIGZyZWUgc3B1IHRvIHJ1biBAY3R4LiAgSWYgbm8gZnJlZSBzcHUgaXMgYXZhaWxhYmxlCiAgKiBhZGQgdGhlIGNvbnRleHQgdG8gdGhlIHJ1bnF1ZXVlIHNvIGl0IGdldHMgd29rZW4gdXAgb25jZSBhbiBzcHUKICAqIGlzIGF2YWlsYWJsZS4KICAqLwpAQCAtNDAyLDkgKzQyMyw3IEBACiAJCQlyZXR1cm4gMDsKIAkJfQogCi0JCXNwdV9hZGRfdG9fcnEoY3R4KTsKIAkJc3B1X3ByaW9fd2FpdChjdHgpOwotCQlzcHVfZGVsX2Zyb21fcnEoY3R4KTsKIAl9IHdoaWxlICghc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpOwogCiAJcmV0dXJuIC1FUkVTVEFSVFNZUzsKQEAgLTQzOCw3ICs0NTcsNiBAQAogdm9pZCBzcHVfeWllbGQoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgpCiB7CiAJc3RydWN0IHNwdSAqc3B1OwotCWludCBuZWVkX3lpZWxkID0gMDsKIAogCWlmIChtdXRleF90cnlsb2NrKCZjdHgtPnN0YXRlX211dGV4KSkgewogCQlpZiAoKHNwdSA9IGN0eC0+c3B1KSAhPSBOVUxMKSB7CkBAIC00NDcsMTMgKzQ2NSwxMCBAQAogCQkJCXByX2RlYnVnKCIlczogeWllbGRpbmcgU1BVICVkIE5PREUgJWRcbiIsCiAJCQkJCSBfX0ZVTkNUSU9OX18sIHNwdS0+bnVtYmVyLCBzcHUtPm5vZGUpOwogCQkJCXNwdV9kZWFjdGl2YXRlKGN0eCk7Ci0JCQkJbmVlZF95aWVsZCA9IDE7CiAJCQl9CiAJCX0KIAkJbXV0ZXhfdW5sb2NrKCZjdHgtPnN0YXRlX211dGV4KTsKIAl9Ci0JaWYgKHVubGlrZWx5KG5lZWRfeWllbGQpKQotCQl5aWVsZCgpOwogfQogCiBpbnQgX19pbml0IHNwdV9zY2hlZF9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc3B1ZnMuaCBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zcHVmcy5oCmluZGV4IDVjNGU0N2QuLjBhOTQ3ZmQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zcHVmcy5oCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zcHVmcy5oCkBAIC00MSw3ICs0MSw3IEBACiAKIC8qIGN0eC0+c2NoZWRfZmxhZ3MgKi8KIGVudW0gewotCVNQVV9TQ0hFRF9XQUtFID0gMCwgLyogY3VycmVudGx5IHVudXNlZCAqLworCVNQVV9TQ0hFRF9FWElUSU5HID0gMCwKIH07CiAKIHN0cnVjdCBzcHVfY29udGV4dCB7CkBAIC01MCwxNiArNTAsMTcgQEAKIAlzcGlubG9ja190IG1taW9fbG9jazsJCSAgLyogcHJvdGVjdHMgbW1pbyBhY2Nlc3MgKi8KIAlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbG9jYWxfc3RvcmU7IC8qIGxvY2FsIHN0b3JlIG1hcHBpbmcuICAqLwogCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptZmM7CSAgIC8qICdtZmMnIGFyZWEgbWFwcGluZ3MuICovCi0Jc3RydWN0IGFkZHJlc3Nfc3BhY2UgKmNudGw7IAkgICAvKiAnY29udHJvbCcgYXJlYSBtYXBwaW5ncy4gKi8KLQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqc2lnbmFsMTsgCSAgIC8qICdzaWduYWwxJyBhcmVhIG1hcHBpbmdzLiAqLwotCXN0cnVjdCBhZGRyZXNzX3NwYWNlICpzaWduYWwyOyAJICAgLyogJ3NpZ25hbDInIGFyZWEgbWFwcGluZ3MuICovCi0Jc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1zczsgCSAgIC8qICdtc3MnIGFyZWEgbWFwcGluZ3MuICovCi0Jc3RydWN0IGFkZHJlc3Nfc3BhY2UgKnBzbWFwOyAJICAgLyogJ3BzbWFwJyBhcmVhIG1hcHBpbmdzLiAqLworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICpjbnRsOwkgICAvKiAnY29udHJvbCcgYXJlYSBtYXBwaW5ncy4gKi8KKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqc2lnbmFsMTsJICAgLyogJ3NpZ25hbDEnIGFyZWEgbWFwcGluZ3MuICovCisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKnNpZ25hbDI7CSAgIC8qICdzaWduYWwyJyBhcmVhIG1hcHBpbmdzLiAqLworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptc3M7CSAgIC8qICdtc3MnIGFyZWEgbWFwcGluZ3MuICovCisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKnBzbWFwOwkgICAvKiAncHNtYXAnIGFyZWEgbWFwcGluZ3MuICovCisJc3BpbmxvY2tfdCBtYXBwaW5nX2xvY2s7CiAJdTY0IG9iamVjdF9pZDsJCSAgIC8qIHVzZXIgc3BhY2UgcG9pbnRlciBmb3Igb3Byb2ZpbGUgKi8KIAogCWVudW0geyBTUFVfU1RBVEVfUlVOTkFCTEUsIFNQVV9TVEFURV9TQVZFRCB9IHN0YXRlOwogCXN0cnVjdCBtdXRleCBzdGF0ZV9tdXRleDsKLQlzdHJ1Y3Qgc2VtYXBob3JlIHJ1bl9zZW1hOworCXN0cnVjdCBtdXRleCBydW5fbXV0ZXg7CiAKIAlzdHJ1Y3QgbW1fc3RydWN0ICpvd25lcjsKIApAQCAtMTQwLDYgKzE0MSw3IEBACiAJCQkgICAgICAgc3RydWN0IHNwdV9kbWFfaW5mbyAqIGluZm8pOwogCXZvaWQgKCpwcm94eWRtYV9pbmZvX3JlYWQpIChzdHJ1Y3Qgc3B1X2NvbnRleHQgKiBjdHgsCiAJCQkJICAgIHN0cnVjdCBzcHVfcHJveHlkbWFfaW5mbyAqIGluZm8pOworCXZvaWQgKCpyZXN0YXJ0X2RtYSkoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgpOwogfTsKIAogZXh0ZXJuIHN0cnVjdCBzcHVfY29udGV4dF9vcHMgc3B1X2h3X29wczsKQEAgLTE0OSw2ICsxNTEsNyBAQAogCXN0cnVjdCBzcHVfY29udGV4dCAqaV9jdHg7CiAJc3RydWN0IHNwdV9nYW5nICppX2dhbmc7CiAJc3RydWN0IGlub2RlIHZmc19pbm9kZTsKKwlpbnQgaV9vcGVuZXJzOwogfTsKICNkZWZpbmUgU1BVRlNfSShpbm9kZSkgXAogCWNvbnRhaW5lcl9vZihpbm9kZSwgc3RydWN0IHNwdWZzX2lub2RlX2luZm8sIHZmc19pbm9kZSkKQEAgLTE3MCw2ICsxNzMsOSBAQAogdm9pZCBzcHVfZ2FuZ19yZW1vdmVfY3R4KHN0cnVjdCBzcHVfZ2FuZyAqZ2FuZywgc3RydWN0IHNwdV9jb250ZXh0ICpjdHgpOwogdm9pZCBzcHVfZ2FuZ19hZGRfY3R4KHN0cnVjdCBzcHVfZ2FuZyAqZ2FuZywgc3RydWN0IHNwdV9jb250ZXh0ICpjdHgpOwogCisvKiBmYXVsdCBoYW5kbGluZyAqLworaW50IHNwdWZzX2hhbmRsZV9jbGFzczEoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgpOworCiAvKiBjb250ZXh0IG1hbmFnZW1lbnQgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBzcHVfYWNxdWlyZShzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCkKIHsKQEAgLTE5MCw3ICsxOTYsNiBAQAogdm9pZCBzcHVfZm9yZ2V0KHN0cnVjdCBzcHVfY29udGV4dCAqY3R4KTsKIGludCBzcHVfYWNxdWlyZV9ydW5uYWJsZShzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCwgdW5zaWduZWQgbG9uZyBmbGFncyk7CiB2b2lkIHNwdV9hY3F1aXJlX3NhdmVkKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4KTsKLWludCBzcHVfYWNxdWlyZV9leGNsdXNpdmUoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgpOwogCiBpbnQgc3B1X2FjdGl2YXRlKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4LCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKIHZvaWQgc3B1X2RlYWN0aXZhdGUoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgpOwpAQCAtMjE4LDE0ICsyMjMsMTMgQEAKIAkJcHJlcGFyZV90b193YWl0KCYod3EpLCAmX193YWl0LCBUQVNLX0lOVEVSUlVQVElCTEUpOwlcCiAJCWlmIChjb25kaXRpb24pCQkJCQkJXAogCQkJYnJlYWs7CQkJCQkJXAotCQlpZiAoIXNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CQkJCVwKLQkJCXNwdV9yZWxlYXNlKGN0eCk7CQkJCVwKLQkJCXNjaGVkdWxlKCk7CQkJCQlcCi0JCQlzcHVfYWNxdWlyZShjdHgpOwkJCQlcCi0JCQljb250aW51ZTsJCQkJCVwKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CQkJCVwKKwkJCV9fcmV0ID0gLUVSRVNUQVJUU1lTOwkJCQlcCisJCQlicmVhazsJCQkJCQlcCiAJCX0JCQkJCQkJXAotCQlfX3JldCA9IC1FUkVTVEFSVFNZUzsJCQkJCVwKLQkJYnJlYWs7CQkJCQkJCVwKKwkJc3B1X3JlbGVhc2UoY3R4KTsJCQkJCVwKKwkJc2NoZWR1bGUoKTsJCQkJCQlcCisJCXNwdV9hY3F1aXJlKGN0eCk7CQkJCQlcCiAJfQkJCQkJCQkJXAogCWZpbmlzaF93YWl0KCYod3EpLCAmX193YWl0KTsJCQkJCVwKIAlfX3JldDsJCQkJCQkJCVwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zd2l0Y2guYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zd2l0Y2guYwppbmRleCBmZDkxYzczLi44MzQ3YzRhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc3dpdGNoLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3N3aXRjaC5jCkBAIC0yMDg0LDYgKzIwODQsMTAgQEAKIAlpbnQgcmM7CiAKIAlhY3F1aXJlX3NwdV9sb2NrKHNwdSk7CSAgICAgICAgLyogU3RlcCAxLiAgICAgKi8KKwlwcmV2LT5kYXIgPSBzcHUtPmRhcjsKKwlwcmV2LT5kc2lzciA9IHNwdS0+ZHNpc3I7CisJc3B1LT5kYXIgPSAwOworCXNwdS0+ZHNpc3IgPSAwOwogCXJjID0gX19kb19zcHVfc2F2ZShwcmV2LCBzcHUpOwkvKiBTdGVwcyAyLTUzLiAqLwogCXJlbGVhc2Vfc3B1X2xvY2soc3B1KTsKIAlpZiAocmMgIT0gMCAmJiByYyAhPSAyICYmIHJjICE9IDYpIHsKQEAgLTIxMDksOSArMjExMyw5IEBACiAKIAlhY3F1aXJlX3NwdV9sb2NrKHNwdSk7CiAJaGFydmVzdChOVUxMLCBzcHUpOwotCXNwdS0+ZGFyID0gMDsKLQlzcHUtPmRzaXNyID0gMDsKIAlzcHUtPnNsYl9yZXBsYWNlID0gMDsKKwluZXctPmRhciA9IDA7CisJbmV3LT5kc2lzciA9IDA7CiAJc3B1LT5jbGFzc18wX3BlbmRpbmcgPSAwOwogCXJjID0gX19kb19zcHVfcmVzdG9yZShuZXcsIHNwdSk7CiAJcmVsZWFzZV9zcHVfbG9jayhzcHUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsZWIvS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbGViL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRiMWUyOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbGViL0tjb25maWcKQEAgLTAsMCArMSw5IEBACitjb25maWcgUFBDX0NFTExFQgorCWJvb2wgIlRvc2hpYmEncyBDZWxsIFJlZmVyZW5jZSBTZXQgJ0NlbGxlYicgQXJjaGl0ZWN0dXJlIgorCWRlcGVuZHMgb24gUFBDX01VTFRJUExBVEZPUk0gJiYgUFBDNjQKKwlzZWxlY3QgUFBDX0NFTEwKKwlzZWxlY3QgUFBDX09GX1BMQVRGT1JNX1BDSQorCXNlbGVjdCBIQVNfVFhYOV9TRVJJQUwKKwlzZWxlY3QgUFBDX1VEQkdfQkVBVAorCXNlbGVjdCBVU0JfT0hDSV9CSUdfRU5ESUFOX01NSU8KKwlzZWxlY3QgVVNCX0VIQ0lfQklHX0VORElBTl9NTUlPCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGxlYi9pb21tdS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsZWIvaW9tbXUuYwppbmRleCBmNjNiOTRjLi43NTVkODY5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGxlYi9pb21tdS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbGViL2lvbW11LmMKQEAgLTM3LDcgKzM3LDcgQEAKIAljb25zdCB1bnNpZ25lZCBsb25nICpkbWFfd2luZG93OwogCiAJZm9yX2VhY2hfbm9kZV9ieV90eXBlKGRuLCAiaW9pZiIpIHsKLQkJZG1hX3dpbmRvdyA9IGdldF9wcm9wZXJ0eShkbiwgInRvc2hpYmEsZG1hLXdpbmRvdyIsIE5VTEwpOworCQlkbWFfd2luZG93ID0gb2ZfZ2V0X3Byb3BlcnR5KGRuLCAidG9zaGliYSxkbWEtd2luZG93IiwgTlVMTCk7CiAJCWlmIChkbWFfd2luZG93KSB7CiAJCQkqaW9fc3BhY2VfaWQgPSAoZG1hX3dpbmRvd1swXSA+PiAzMikgJiAweGZmZmZmZmZmVUw7CiAJCQkqaW9pZCA9IGRtYV93aW5kb3dbMF0gJiAweDdmZlVMOwpAQCAtODAsNyArODAsNyBAQAogCWlmIChhY3Rpb24gIT0gQlVTX05PVElGWV9BRERfREVWSUNFKQogCQlyZXR1cm4gMDsKIAotCWRldi0+YXJjaGRhdGEuZG1hX29wcyA9IHBjaV9kbWFfb3BzOworCWRldi0+YXJjaGRhdGEuZG1hX29wcyA9IGdldF9wY2lfZG1hX29wcygpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC05NSw3ICs5NSw3IEBACiAJCXJldHVybiAtRU5PREVWOwogCiAJY2VsbGViX2luaXRfZGlyZWN0X21hcHBpbmcoKTsKLQlwY2lfZG1hX29wcyA9ICZkbWFfZGlyZWN0X29wczsKKwlzZXRfcGNpX2RtYV9vcHMoJmRtYV9kaXJlY3Rfb3BzKTsKIAlidXNfcmVnaXN0ZXJfbm90aWZpZXIoJm9mX3BsYXRmb3JtX2J1c190eXBlLCAmY2VsbGViX29mX2J1c19ub3RpZmllcik7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbGViL3BjaS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsZWIvcGNpLmMKaW5kZXggOThkZTgzNi4uZDFhZGYzNCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsZWIvcGNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsZWIvcGNpLmMKQEAgLTMwOSwxMyArMzA5LDEzIEBACiAJCWdvdG8gZXJyb3I7CiAJfQogCi0JbmFtZSA9IGdldF9wcm9wZXJ0eShub2RlLCAibW9kZWwiLCAmcmxlbik7CisJbmFtZSA9IG9mX2dldF9wcm9wZXJ0eShub2RlLCAibW9kZWwiLCAmcmxlbik7CiAJaWYgKCFuYW1lKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiUENJOiBtb2RlbCBwcm9wZXJ0eSBub3QgZm91bmQuXG4iKTsKIAkJZ290byBlcnJvcjsKIAl9CiAKLQl3aTQgPSBnZXRfcHJvcGVydHkobm9kZSwgInJlZyIsICZybGVuKTsKKwl3aTQgPSBvZl9nZXRfcHJvcGVydHkobm9kZSwgInJlZyIsICZybGVuKTsKIAlpZiAod2k0ID09IE5VTEwpCiAJCWdvdG8gZXJyb3I7CiAKQEAgLTM1MiwxMCArMzUyLDEwIEBACiAJfQogCXByX2RlYnVnKCJQQ0k6IHJlcyBhc3NpZ25lZCAweCUwMTZseFxuIiwgKHVuc2lnbmVkIGxvbmcpKnJlcyk7CiAKLQl3aTAgPSBnZXRfcHJvcGVydHkobm9kZSwgImRldmljZS1pZCIsIE5VTEwpOwotCXdpMSA9IGdldF9wcm9wZXJ0eShub2RlLCAidmVuZG9yLWlkIiwgTlVMTCk7Ci0Jd2kyID0gZ2V0X3Byb3BlcnR5KG5vZGUsICJjbGFzcy1jb2RlIiwgTlVMTCk7Ci0Jd2kzID0gZ2V0X3Byb3BlcnR5KG5vZGUsICJyZXZpc2lvbi1pZCIsIE5VTEwpOworCXdpMCA9IG9mX2dldF9wcm9wZXJ0eShub2RlLCAiZGV2aWNlLWlkIiwgTlVMTCk7CisJd2kxID0gb2ZfZ2V0X3Byb3BlcnR5KG5vZGUsICJ2ZW5kb3ItaWQiLCBOVUxMKTsKKwl3aTIgPSBvZl9nZXRfcHJvcGVydHkobm9kZSwgImNsYXNzLWNvZGUiLCBOVUxMKTsKKwl3aTMgPSBvZl9nZXRfcHJvcGVydHkobm9kZSwgInJldmlzaW9uLWlkIiwgTlVMTCk7CiAKIAljZWxsZWJfY29uZmlnX3dyaXRlX2Zha2UoKmNvbmZpZywgUENJX0RFVklDRV9JRCwgMiwgd2kwWzBdICYgMHhmZmZmKTsKIAljZWxsZWJfY29uZmlnX3dyaXRlX2Zha2UoKmNvbmZpZywgUENJX1ZFTkRPUl9JRCwgMiwgd2kxWzBdICYgMHhmZmZmKTsKQEAgLTM3Niw3ICszNzYsNyBAQAogCiAJY2VsbGViX3NldHVwX3BjaV9iYXNlX2FkZHJzKGhvc2UsIGRldm5vLCBmbiwgbnVtX2Jhc2VfYWRkcik7CiAKLQlsaSA9IGdldF9wcm9wZXJ0eShub2RlLCAiaW50ZXJydXB0cyIsICZybGVuKTsKKwlsaSA9IG9mX2dldF9wcm9wZXJ0eShub2RlLCAiaW50ZXJydXB0cyIsICZybGVuKTsKIAl2YWwgPSBsaVswXTsKIAljZWxsZWJfY29uZmlnX3dyaXRlX2Zha2UoKmNvbmZpZywgUENJX0lOVEVSUlVQVF9QSU4sIDEsIDEpOwogCWNlbGxlYl9jb25maWdfd3JpdGVfZmFrZSgqY29uZmlnLCBQQ0lfSU5URVJSVVBUX0xJTkUsIDEsIHZhbCk7CkBAIC00MjQsNyArNDI0LDcgQEAKIAljb25zdCBpbnQgKmJ1c19yYW5nZTsKIAl1bnNpZ25lZCBpbnQgbGVuOwogCi0JYnVzX3JhbmdlID0gZ2V0X3Byb3BlcnR5KGRldiwgImJ1cy1yYW5nZSIsICZsZW4pOworCWJ1c19yYW5nZSA9IG9mX2dldF9wcm9wZXJ0eShkZXYsICJidXMtcmFuZ2UiLCAmbGVuKTsKIAlpZiAoYnVzX3JhbmdlID09IE5VTEwgfHwgbGVuIDwgMiAqIHNpemVvZihpbnQpKQogCQlyZXR1cm4gMTsKIApAQCAtNDUxLDcgKzQ1MSw3IEBACiAJc3RydWN0IGRldmljZV9ub2RlICpub2RlOwogCXVuc2lnbmVkIGludCBybGVuOwogCi0JbmFtZSA9IGdldF9wcm9wZXJ0eShkZXYsICJuYW1lIiwgJnJsZW4pOworCW5hbWUgPSBvZl9nZXRfcHJvcGVydHkoZGV2LCAibmFtZSIsICZybGVuKTsKIAlpZiAoIW5hbWUpCiAJCXJldHVybiAxOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGxlYi9zZXR1cC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsZWIvc2V0dXAuYwppbmRleCA1ZjRkMGQ5Li41OTZhYjJhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGxlYi9zZXR1cC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbGViL3NldHVwLmMKQEAgLTY3LDcgKzY3LDcgQEAKIAogCXJvb3QgPSBvZl9maW5kX25vZGVfYnlfcGF0aCgiLyIpOwogCWlmIChyb290KQotCQltb2RlbCA9IGdldF9wcm9wZXJ0eShyb290LCAibW9kZWwiLCBOVUxMKTsKKwkJbW9kZWwgPSBvZl9nZXRfcHJvcGVydHkocm9vdCwgIm1vZGVsIiwgTlVMTCk7CiAJLyogdXNpbmcgIkNIUlAiIGlzIHRvIHRyaWNrIGFuYWNvbmRhIGludG8gaW5zdGFsbGluZyBGQ3ggaW50byBDZWxsZWIgKi8KIAlzZXFfcHJpbnRmKG0sICJtYWNoaW5lXHRcdDogJXMgJXNcbiIsIGNlbGxlYl9tYWNoaW5lX3R5cGUsIG1vZGVsKTsKIAlvZl9ub2RlX3B1dChyb290KTsKQEAgLTEyOCwxNSArMTI4LDYgQEAKIAlyZXR1cm4gMTsKIH0KIAotLyoKLSAqIENlbGwgaGFzIG5vIGxlZ2FjeSBJTzsgYW55dGhpbmcgY2FsbGluZyB0aGlzIGZ1bmN0aW9uIGhhcyB0bwotICogZmFpbCBvciBiYWQgdGhpbmdzIHdpbGwgaGFwcGVuCi0gKi8KLXN0YXRpYyBpbnQgY2VsbGViX2NoZWNrX2xlZ2FjeV9pb3BvcnQodW5zaWduZWQgaW50IGJhc2Vwb3J0KQotewotCXJldHVybiAtRU5PREVWOwotfQotCiAjaWZkZWYgQ09ORklHX0tFWEVDCiBzdGF0aWMgdm9pZCBjZWxsZWJfa2V4ZWNfY3B1X2Rvd24oaW50IGNyYXNoLCBpbnQgc2Vjb25kYXJ5KQogewpAQCAtMTczLDcgKzE2NCw2IEBACiAJLmdldF9ydGNfdGltZQkJPSBiZWF0X2dldF9ydGNfdGltZSwKIAkuc2V0X3J0Y190aW1lCQk9IGJlYXRfc2V0X3J0Y190aW1lLAogCS5jYWxpYnJhdGVfZGVjcgkJPSBnZW5lcmljX2NhbGlicmF0ZV9kZWNyLAotCS5jaGVja19sZWdhY3lfaW9wb3J0CT0gY2VsbGViX2NoZWNrX2xlZ2FjeV9pb3BvcnQsCiAJLnByb2dyZXNzCQk9IGNlbGxlYl9wcm9ncmVzcywKIAkucG93ZXJfc2F2ZQkJPSBiZWF0X3Bvd2VyX3NhdmUsCiAJLm52cmFtX3NpemUJCT0gYmVhdF9udnJhbV9nZXRfc2l6ZSwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2hycC9LY29uZmlnIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jaHJwL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJjNjkwNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2hycC9LY29uZmlnCkBAIC0wLDAgKzEsMTEgQEAKK2NvbmZpZyBQUENfQ0hSUAorCWJvb2wgIkNvbW1vbiBIYXJkd2FyZSBSZWZlcmVuY2UgUGxhdGZvcm0gKENIUlApIGJhc2VkIG1hY2hpbmVzIgorCWRlcGVuZHMgb24gUFBDX01VTFRJUExBVEZPUk0gJiYgUFBDMzIKKwlzZWxlY3QgTVBJQworCXNlbGVjdCBQUENfSTgyNTkKKwlzZWxlY3QgUFBDX0lORElSRUNUX1BDSQorCXNlbGVjdCBQUENfUlRBUworCXNlbGVjdCBQUENfTVBDMTA2CisJc2VsZWN0IFBQQ19VREJHXzE2NTUwCisJc2VsZWN0IFBQQ19OQVRJVkUKKwlkZWZhdWx0IHkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2hycC9udnJhbS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jaHJwL252cmFtLmMKaW5kZXggMGRkNGE2NC4uOGVmZDQyNCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jaHJwL252cmFtLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jaHJwL252cmFtLmMKQEAgLTc0LDcgKzc0LDcgQEAKIAlpZiAobnZyYW0gPT0gTlVMTCkKIAkJcmV0dXJuOwogCi0JbmJ5dGVzX3AgPSBnZXRfcHJvcGVydHkobnZyYW0sICIjYnl0ZXMiLCAmcHJvcGxlbik7CisJbmJ5dGVzX3AgPSBvZl9nZXRfcHJvcGVydHkobnZyYW0sICIjYnl0ZXMiLCAmcHJvcGxlbik7CiAJaWYgKG5ieXRlc19wID09IE5VTEwgfHwgcHJvcGxlbiAhPSBzaXplb2YodW5zaWduZWQgaW50KSkKIAkJcmV0dXJuOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NocnAvcGNpLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NocnAvcGNpLmMKaW5kZXggZGRiNGExMS4uMTQ2OWQ2NCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jaHJwL3BjaS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2hycC9wY2kuYwpAQCAtNyw3ICs3LDYgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9pZGUuaD4KIAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CkBAIC0xMzcsOSArMTM2LDExIEBACiAJc3RydWN0IGRldmljZV9ub2RlICpucDsKIAlzdHJ1Y3QgcmVzb3VyY2UgcjsKIAotCW5wID0gZmluZF9kZXZpY2VzKCJtYWMtaW8iKTsKLQlpZiAobnAgPT0gTlVMTCB8fCBvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5wLCAwLCAmcikpCisJbnAgPSBvZl9maW5kX25vZGVfYnlfbmFtZShOVUxMLCAibWFjLWlvIik7CisJaWYgKG5wID09IE5VTEwgfHwgb2ZfYWRkcmVzc190b19yZXNvdXJjZShucCwgMCwgJnIpKSB7CisJCW9mX25vZGVfcHV0KG5wKTsKIAkJcmV0dXJuIDA7CisJfQogCUh5ZHJhID0gaW9yZW1hcChyLnN0YXJ0LCByLmVuZC1yLnN0YXJ0KTsKIAlwcmludGsoIkh5ZHJhIE1hYyBJL08gYXQgJWxseFxuIiwgKHVuc2lnbmVkIGxvbmcgbG9uZylyLnN0YXJ0KTsKIAlwcmludGsoIkh5ZHJhIEZlYXR1cmVfQ29udHJvbCB3YXMgJXgiLApAQCAtMTg2LDEwICsxODcsOSBAQAogLyogTWFydmVsbCBEaXNjb3ZlcnkgSUkgYmFzZWQgUGVnYXNvcyAyICovCiBzdGF0aWMgdm9pZCBfX2luaXQgc2V0dXBfcGVnMihzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsIHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2KQogewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcm9vdCA9IGZpbmRfcGF0aF9kZXZpY2UoIi8iKTsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKnJvb3QgPSBvZl9maW5kX25vZGVfYnlfcGF0aCgiLyIpOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcnRhczsKIAotCW9mX25vZGVfZ2V0KHJvb3QpOwogCXJ0YXMgPSBvZl9maW5kX25vZGVfYnlfbmFtZSAocm9vdCwgInJ0YXMiKTsKIAlpZiAocnRhcykgewogCQlob3NlLT5vcHMgPSAmcnRhc19wY2lfb3BzOwpAQCAtMTk5LDYgKzE5OSw3IEBACiAJCQkiIHlvdXIgZmlybXdhcmVcbiIpOwogCX0KIAlwY2lfYXNzaWduX2FsbF9idXNlcyA9IDE7CisJLyoga2VlcCB0aGUgcmVmZXJlbmNlIHRvIHRoZSByb290IG5vZGUgKi8KIH0KIAogdm9pZCBfX2luaXQKQEAgLTIxMSwxNCArMjEyLDE0IEBACiAJY29uc3QgdW5zaWduZWQgaW50ICpkbWE7CiAJY29uc3QgY2hhciAqbW9kZWwsICptYWNoaW5lOwogCWludCBpc19sb25ndHJhaWwgPSAwLCBpc19tb3QgPSAwLCBpc19wZWdhc29zID0gMDsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKnJvb3QgPSBmaW5kX3BhdGhfZGV2aWNlKCIvIik7CisJc3RydWN0IGRldmljZV9ub2RlICpyb290ID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgoIi8iKTsKIAlzdHJ1Y3QgcmVzb3VyY2UgcjsKIAkvKgogCSAqIFRoZSBQQ0kgaG9zdCBicmlkZ2Ugbm9kZXMgb24gc29tZSBtYWNoaW5lcyBkb24ndCBoYXZlCiAJICogcHJvcGVydGllcyB0byBhZGVxdWF0ZWx5IGlkZW50aWZ5IHRoZW0sIHNvIHdlIGhhdmUgdG8KIAkgKiBsb29rIGF0IHdoYXQgc29ydCBvZiBtYWNoaW5lIHRoaXMgaXMgYXMgd2VsbC4KIAkgKi8KLQltYWNoaW5lID0gZ2V0X3Byb3BlcnR5KHJvb3QsICJtb2RlbCIsIE5VTEwpOworCW1hY2hpbmUgPSBvZl9nZXRfcHJvcGVydHkocm9vdCwgIm1vZGVsIiwgTlVMTCk7CiAJaWYgKG1hY2hpbmUgIT0gTlVMTCkgewogCQlpc19sb25ndHJhaWwgPSBzdHJuY21wKG1hY2hpbmUsICJJQk0sTG9uZ1RyYWlsIiwgMTMpID09IDA7CiAJCWlzX21vdCA9IHN0cm5jbXAobWFjaGluZSwgIk1PVCIsIDMpID09IDA7CkBAIC0yMzcsNyArMjM4LDcgQEAKIAkJCSAgICAgICBkZXYtPmZ1bGxfbmFtZSk7CiAJCQljb250aW51ZTsKIAkJfQotCQlidXNfcmFuZ2UgPSBnZXRfcHJvcGVydHkoZGV2LCAiYnVzLXJhbmdlIiwgJmxlbik7CisJCWJ1c19yYW5nZSA9IG9mX2dldF9wcm9wZXJ0eShkZXYsICJidXMtcmFuZ2UiLCAmbGVuKTsKIAkJaWYgKGJ1c19yYW5nZSA9PSBOVUxMIHx8IGxlbiA8IDIgKiBzaXplb2YoaW50KSkgewogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQ2FuJ3QgZ2V0IGJ1cy1yYW5nZSBmb3IgJXNcbiIsCiAJCQkJZGV2LT5mdWxsX25hbWUpOwpAQCAtMjYzLDcgKzI2NCw3IEBACiAJCWhvc2UtPmZpcnN0X2J1c25vID0gYnVzX3JhbmdlWzBdOwogCQlob3NlLT5sYXN0X2J1c25vID0gYnVzX3JhbmdlWzFdOwogCi0JCW1vZGVsID0gZ2V0X3Byb3BlcnR5KGRldiwgIm1vZGVsIiwgTlVMTCk7CisJCW1vZGVsID0gb2ZfZ2V0X3Byb3BlcnR5KGRldiwgIm1vZGVsIiwgTlVMTCk7CiAJCWlmIChtb2RlbCA9PSBOVUxMKQogCQkJbW9kZWwgPSAiPG5vbmU+IjsKIAkJaWYgKGRldmljZV9pc19jb21wYXRpYmxlKGRldiwgIklCTSxweXRob24iKSkgewpAQCAtMjg1LDcgKzI4Niw4IEBACiAJCQkJCSAgIHIuc3RhcnQgKyAweDAwMGY4MDAwLAogCQkJCQkgICByLnN0YXJ0ICsgMHgwMDBmODAxMCk7CiAJCQlpZiAoaW5kZXggPT0gMCkgewotCQkJCWRtYSA9IGdldF9wcm9wZXJ0eShkZXYsICJzeXN0ZW0tZG1hLWJhc2UiLCZsZW4pOworCQkJCWRtYSA9IG9mX2dldF9wcm9wZXJ0eShkZXYsICJzeXN0ZW0tZG1hLWJhc2UiLAorCQkJCQkJCSZsZW4pOwogCQkJCWlmIChkbWEgJiYgbGVuID49IHNpemVvZigqZG1hKSkgewogCQkJCQlkbWEgPSAodW5zaWduZWQgaW50ICopCiAJCQkJCQkoKCh1bnNpZ25lZCBsb25nKWRtYSkgKwpAQCAtMzAzLDEyICszMDUsMTMgQEAKIAogCQkvKiBjaGVjayB0aGUgZmlyc3QgYnJpZGdlIGZvciBhIHByb3BlcnR5IHRoYXQgd2UgY2FuCiAJCSAgIHVzZSB0byBzZXQgcGNpX2RyYW1fb2Zmc2V0ICovCi0JCWRtYSA9IGdldF9wcm9wZXJ0eShkZXYsICJpYm0sZG1hLXJhbmdlcyIsICZsZW4pOworCQlkbWEgPSBvZl9nZXRfcHJvcGVydHkoZGV2LCAiaWJtLGRtYS1yYW5nZXMiLCAmbGVuKTsKIAkJaWYgKGluZGV4ID09IDAgJiYgZG1hICE9IE5VTEwgJiYgbGVuID49IDYgKiBzaXplb2YoKmRtYSkpIHsKIAkJCXBjaV9kcmFtX29mZnNldCA9IGRtYVsyXSAtIGRtYVszXTsKIAkJCXByaW50aygicGNpX2RyYW1fb2Zmc2V0ID0gJWx4XG4iLCBwY2lfZHJhbV9vZmZzZXQpOwogCQl9CiAJfQorCW9mX25vZGVfcHV0KHJvb3QpOwogfQogCiAvKiBTTDgyQzEwNSBJREUgQ29udHJvbC9TdGF0dXMgUmVnaXN0ZXIgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2hycC9zZXR1cC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jaHJwL3NldHVwLmMKaW5kZXggMTE3YzlhMC4uMTg3MDAzOCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jaHJwL3NldHVwLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jaHJwL3NldHVwLmMKQEAgLTI4LDcgKzI4LDYgQEAKICNpbmNsdWRlIDxsaW51eC9hZGIuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2lkZS5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3Jvb3RfZGV2Lmg+CkBAIC0xMTEsOSArMTEwLDkgQEAKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKnJvb3Q7CiAJY29uc3QgY2hhciAqbW9kZWwgPSAiIjsKIAotCXJvb3QgPSBmaW5kX3BhdGhfZGV2aWNlKCIvIik7CisJcm9vdCA9IG9mX2ZpbmRfbm9kZV9ieV9wYXRoKCIvIik7CiAJaWYgKHJvb3QpCi0JCW1vZGVsID0gZ2V0X3Byb3BlcnR5KHJvb3QsICJtb2RlbCIsIE5VTEwpOworCQltb2RlbCA9IG9mX2dldF9wcm9wZXJ0eShyb290LCAibW9kZWwiLCBOVUxMKTsKIAlzZXFfcHJpbnRmKG0sICJtYWNoaW5lXHRcdDogQ0hSUCAlc1xuIiwgbW9kZWwpOwogCiAJLyogbG9uZ3RyYWlsIChnb2xkZW5nYXRlKSBzdHVmZiAqLwpAQCAtMTYxLDYgKzE2MCw3IEBACiAJCQkgICBnZzJfY2FjaGV0eXBlc1sodD4+MikgJiAzXSwKIAkJCSAgIGdnMl9jYWNoZW1vZGVzW3QgJiAzXSk7CiAJfQorCW9mX25vZGVfcHV0KHJvb3QpOwogfQogCiAvKgpAQCAtMjA1LDEzICsyMDUsMTUgQEAKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKnJvb3Q7CiAKLQlpZiAoKHJvb3QgPSBmaW5kX3BhdGhfZGV2aWNlKCIvIikpICYmCi0JICAgICFzdHJuY21wKGdldF9wcm9wZXJ0eShyb290LCAibW9kZWwiLCBOVUxMKSwgIklCTSxMb25nVHJhaWwiLCAxMykpIHsKKwlpZiAoKHJvb3QgPSBvZl9maW5kX25vZGVfYnlfcGF0aCgiLyIpKSAmJgorCSAgICAhc3RybmNtcChvZl9nZXRfcHJvcGVydHkocm9vdCwgIm1vZGVsIiwgTlVMTCksCisJCQkiSUJNLExvbmdUcmFpbCIsIDEzKSkgewogCQkvKiBsb2dpY2FsIGRldmljZSAwIChLQkMvS2V5Ym9hcmQpICovCiAJCXNpb19maXh1cF9pcnEoImtleWJvYXJkIiwgMCwgMSwgMik7CiAJCS8qIHNlbGVjdCBsb2dpY2FsIGRldmljZSAxIChLQkMvTW91c2UpICovCiAJCXNpb19maXh1cF9pcnEoIm1vdXNlIiwgMSwgMTIsIDIpOwogCX0KKwlvZl9ub2RlX3B1dChyb290KTsKIH0KIAogCkBAIC0yMjQsMTIgKzIyNiwxMiBAQAogCQlyZXR1cm47CiAKIAkvKiBFbmFibGUgTDIgY2FjaGUgaWYgbmVlZGVkICovCi0JbnAgPSBmaW5kX3R5cGVfZGV2aWNlcygiY3B1Iik7CisJbnAgPSBvZl9maW5kX25vZGVfYnlfdHlwZShOVUxMLCAiY3B1Iik7CiAJaWYgKG5wICE9IE5VTEwpIHsKLQkJY29uc3QgdW5zaWduZWQgaW50ICpsMmNyID0gZ2V0X3Byb3BlcnR5KG5wLCAibDJjciIsIE5VTEwpOworCQljb25zdCB1bnNpZ25lZCBpbnQgKmwyY3IgPSBvZl9nZXRfcHJvcGVydHkobnAsICJsMmNyIiwgTlVMTCk7CiAJCWlmIChsMmNyID09IE5VTEwpIHsKIAkJCXByaW50ayAoIlBlZ2Fzb3MgbDJjciA6IG5vIGNwdSBsMmNyIHByb3BlcnR5IGZvdW5kXG4iKTsKLQkJCXJldHVybjsKKwkJCWdvdG8gb3V0OwogCQl9CiAJCWlmICghKCgqbDJjcikgJiAweDgwMDAwMDAwKSkgewogCQkJcHJpbnRrICgiUGVnYXNvcyBsMmNyIDogTDIgY2FjaGUgd2FzIG5vdCBhY3RpdmUsICIKQEAgLTIzOCw2ICsyNDAsOCBAQAogCQkJX3NldF9MMkNSKCgqbDJjcikgfCAweDgwMDAwMDAwKTsKIAkJfQogCX0KK291dDoKKwlvZl9ub2RlX3B1dChucCk7CiB9CiAKIHN0YXRpYyB2b2lkIGJyaXFfcmVzdGFydChjaGFyICpjbWQpCkBAIC0yNTAsMTQgKzI1NCwxNCBAQAogCiB2b2lkIF9faW5pdCBjaHJwX3NldHVwX2FyY2godm9pZCkKIHsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKnJvb3QgPSBmaW5kX3BhdGhfZGV2aWNlICgiLyIpOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcm9vdCA9IG9mX2ZpbmRfbm9kZV9ieV9wYXRoKCIvIik7CiAJY29uc3QgY2hhciAqbWFjaGluZSA9IE5VTEw7CiAKIAkvKiBpbml0IHRvIHNvbWUgfnNhbmUgdmFsdWUgdW50aWwgY2FsaWJyYXRlX2RlbGF5KCkgcnVucyAqLwogCWxvb3BzX3Blcl9qaWZmeSA9IDUwMDAwMDAwL0haOwogCiAJaWYgKHJvb3QpCi0JCW1hY2hpbmUgPSBnZXRfcHJvcGVydHkocm9vdCwgIm1vZGVsIiwgTlVMTCk7CisJCW1hY2hpbmUgPSBvZl9nZXRfcHJvcGVydHkocm9vdCwgIm1vZGVsIiwgTlVMTCk7CiAJaWYgKG1hY2hpbmUgJiYgc3RybmNtcChtYWNoaW5lLCAiUGVnYXNvcyIsIDcpID09IDApIHsKIAkJX2NocnBfdHlwZSA9IF9DSFJQX1BlZ2Fzb3M7CiAJfSBlbHNlIGlmIChtYWNoaW5lICYmIHN0cm5jbXAobWFjaGluZSwgIklCTSIsIDMpID09IDApIHsKQEAgLTI3Myw2ICsyNzcsNyBAQAogCQkvKiBMZXQncyBhc3N1bWUgaXQgaXMgYW4gSUJNIGNocnAgaWYgYWxsIGVsc2UgZmFpbHMgKi8KIAkJX2NocnBfdHlwZSA9IF9DSFJQX0lCTTsKIAl9CisJb2Zfbm9kZV9wdXQocm9vdCk7CiAJcHJpbnRrKCJjaHJwIHR5cGUgPSAleCBbJXNdXG4iLCBfY2hycF90eXBlLCBjaHJwX25hbWVzW19jaHJwX3R5cGVdKTsKIAogCXJ0YXNfaW5pdGlhbGl6ZSgpOwpAQCAtMzYxLDggKzM2Niw4IEBACiAJCXJldHVybjsKIAlyb290ID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgoIi8iKTsKIAlpZiAocm9vdCkgewotCQlvcHByb3AgPSBnZXRfcHJvcGVydHkocm9vdCwgInBsYXRmb3JtLW9wZW4tcGljIiwgJm9wbGVuKTsKLQkJbmEgPSBwcm9tX25fYWRkcl9jZWxscyhyb290KTsKKwkJb3Bwcm9wID0gb2ZfZ2V0X3Byb3BlcnR5KHJvb3QsICJwbGF0Zm9ybS1vcGVuLXBpYyIsICZvcGxlbik7CisJCW5hID0gb2Zfbl9hZGRyX2NlbGxzKHJvb3QpOwogCX0KIAlpZiAob3Bwcm9wICYmIG9wbGVuID49IG5hICogc2l6ZW9mKHVuc2lnbmVkIGludCkpIHsKIAkJb3BhZGRyID0gb3Bwcm9wW25hLTFdOwkvKiBhc3N1bWUgMzItYml0ICovCkBAIC0zNzgsNyArMzgzLDcgQEAKIAogCXByaW50ayhLRVJOX0lORk8gIk9wZW5QSUMgYXQgJWx4XG4iLCBvcGFkZHIpOwogCi0JaXJhbmdlcyA9IGdldF9wcm9wZXJ0eShucCwgImludGVycnVwdC1yYW5nZXMiLCAmbGVuKTsKKwlpcmFuZ2VzID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAiaW50ZXJydXB0LXJhbmdlcyIsICZsZW4pOwogCWlmIChpcmFuZ2VzID09IE5VTEwpCiAJCWxlbiA9IDA7CS8qIG5vbi1kaXN0cmlidXRlZCBtcGljICovCiAJZWxzZQpAQCAtNDI3LDcgKzQzMiw3IEBACiAJb2Zfbm9kZV9wdXQobnApOwogfQogCi0jaWYgZGVmaW5lZChDT05GSUdfVlQpICYmIGRlZmluZWQoQ09ORklHX0lOUFVUX0FEQkhJRCkgJiYgZGVmaW5lZChYTU9OKQorI2lmIGRlZmluZWQoQ09ORklHX1ZUKSAmJiBkZWZpbmVkKENPTkZJR19JTlBVVF9BREJISUQpICYmIGRlZmluZWQoQ09ORklHX1hNT04pCiBzdGF0aWMgc3RydWN0IGlycWFjdGlvbiB4bW9uX2lycWFjdGlvbiA9IHsKIAkuaGFuZGxlciA9IHhtb25faXJxLAogCS5tYXNrID0gQ1BVX01BU0tfTk9ORSwKQEAgLTQ2MywxNSArNDY4LDE2IEBACiAJICogQWxzbywgUGVnYXNvcy10eXBlIHBsYXRmb3JtcyBkb24ndCBoYXZlIGEgcHJvcGVyIG5vZGUgdG8gc3RhcnQKIAkgKiBmcm9tIGFueXdheQogCSAqLwotCWZvciAobnAgPSBmaW5kX2RldmljZXMoInBjaSIpOyBucCAhPSBOVUxMOyBucCA9IG5wLT5uZXh0KSB7Ci0JCWNvbnN0IHVuc2lnbmVkIGludCAqYWRkcnAgPSBnZXRfcHJvcGVydHkobnAsCisJZm9yX2VhY2hfbm9kZV9ieV9uYW1lKG5wLCAicGNpIikgeworCQljb25zdCB1bnNpZ25lZCBpbnQgKmFkZHJwID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLAogCQkJCSI4MjU5LWludGVycnVwdC1hY2tub3dsZWRnZSIsIE5VTEwpOwogCiAJCWlmIChhZGRycCA9PSBOVUxMKQogCQkJY29udGludWU7Ci0JCWNocnBfaW50X2FjayA9IGFkZHJwW3Byb21fbl9hZGRyX2NlbGxzKG5wKS0xXTsKKwkJY2hycF9pbnRfYWNrID0gYWRkcnBbb2Zfbl9hZGRyX2NlbGxzKG5wKS0xXTsKIAkJYnJlYWs7CiAJfQorCW9mX25vZGVfcHV0KG5wKTsKIAlpZiAobnAgPT0gTlVMTCkKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiQ2Fubm90IGZpbmQgUENJIGludGVycnVwdCBhY2tub3dsZWRnZSIKIAkJICAgICAgICIgYWRkcmVzcywgcG9sbGluZ1xuIik7CkBAIC00OTMsNyArNDk5LDcgQEAKIAogdm9pZCBfX2luaXQgY2hycF9pbml0X0lSUSh2b2lkKQogewotI2lmIGRlZmluZWQoQ09ORklHX1ZUKSAmJiBkZWZpbmVkKENPTkZJR19JTlBVVF9BREJISUQpICYmIGRlZmluZWQoWE1PTikKKyNpZiBkZWZpbmVkKENPTkZJR19WVCkgJiYgZGVmaW5lZChDT05GSUdfSU5QVVRfQURCSElEKSAmJiBkZWZpbmVkKENPTkZJR19YTU9OKQogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqa2JkOwogI2VuZGlmCiAJY2hycF9maW5kX29wZW5waWMoKTsKQEAgLTUxMCwxMyArNTE2LDE0IEBACiAJaWYgKF9jaHJwX3R5cGUgPT0gX0NIUlBfUGVnYXNvcykKIAkJcHBjX21kLmdldF9pcnEgICAgICAgID0gaTgyNTlfaXJxOwogCi0jaWYgZGVmaW5lZChDT05GSUdfVlQpICYmIGRlZmluZWQoQ09ORklHX0lOUFVUX0FEQkhJRCkgJiYgZGVmaW5lZChYTU9OKQorI2lmIGRlZmluZWQoQ09ORklHX1ZUKSAmJiBkZWZpbmVkKENPTkZJR19JTlBVVF9BREJISUQpICYmIGRlZmluZWQoQ09ORklHX1hNT04pCiAJLyogc2VlIGlmIHRoZXJlIGlzIGEga2V5Ym9hcmQgaW4gdGhlIGRldmljZSB0cmVlCiAJICAgd2l0aCBhIHBhcmVudCBvZiB0eXBlICJhZGIiICovCi0JZm9yIChrYmQgPSBmaW5kX2RldmljZXMoImtleWJvYXJkIik7IGtiZDsga2JkID0ga2JkLT5uZXh0KQorCWZvcl9lYWNoX25vZGVfYnlfbmFtZShrYmQsICJrZXlib2FyZCIpCiAJCWlmIChrYmQtPnBhcmVudCAmJiBrYmQtPnBhcmVudC0+dHlwZQogCQkgICAgJiYgc3RyY21wKGtiZC0+cGFyZW50LT50eXBlLCAiYWRiIikgPT0gMCkKIAkJCWJyZWFrOworCW9mX25vZGVfcHV0KGtiZCk7CiAJaWYgKGtiZCkKIAkJc2V0dXBfaXJxKEhZRFJBX0lOVF9BREJfTk1JLCAmeG1vbl9pcnFhY3Rpb24pOwogI2VuZGlmCkBAIC01NDIsOSArNTQ5LDkgQEAKIAkvKiBHZXQgdGhlIGV2ZW50IHNjYW4gcmF0ZSBmb3IgdGhlIHJ0YXMgc28gd2Uga25vdyBob3cKIAkgKiBvZnRlbiBpdCBleHBlY3RzIGEgaGVhcnRiZWF0LiAtLSBDb3J0CiAJICovCi0JZGV2aWNlID0gZmluZF9kZXZpY2VzKCJydGFzIik7CisJZGV2aWNlID0gb2ZfZmluZF9ub2RlX2J5X25hbWUoTlVMTCwgInJ0YXMiKTsKIAlpZiAoZGV2aWNlKQotCQlwID0gZ2V0X3Byb3BlcnR5KGRldmljZSwgInJ0YXMtZXZlbnQtc2Nhbi1yYXRlIiwgTlVMTCk7CisJCXAgPSBvZl9nZXRfcHJvcGVydHkoZGV2aWNlLCAicnRhcy1ldmVudC1zY2FuLXJhdGUiLCBOVUxMKTsKIAlpZiAocCAmJiAqcCkgewogCQkvKgogCQkgKiBBcnJhbmdlIHRvIGNhbGwgY2hycF9ldmVudF9zY2FuIGF0IGxlYXN0ICpwIHRpbWVzCkBAIC01NzEsNiArNTc4LDcgQEAKIAkJcHJpbnRrKCJSVEFTIEV2ZW50IFNjYW4gUmF0ZTogJXUgKCVsdSBqaWZmaWVzKVxuIiwKIAkJICAgICAgICpwLCBpbnRlcnZhbCk7CiAJfQorCW9mX25vZGVfcHV0KGRldmljZSk7CiAKIAlpZiAocHBjX21kLnByb2dyZXNzKQogCQlwcGNfbWQucHJvZ3Jlc3MoIiAgSGF2ZSBmdW4hICAgICIsIDB4Nzc3Nyk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NocnAvdGltZS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jaHJwL3RpbWUuYwppbmRleCA3ZDc4ODkwLi45NmQxZTRiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NocnAvdGltZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2hycC90aW1lLmMKQEAgLTM5LDEyICszOSwxNyBAQAogCXN0cnVjdCByZXNvdXJjZSByOwogCWludCBiYXNlOwogCi0JcnRjcyA9IGZpbmRfY29tcGF0aWJsZV9kZXZpY2VzKCJydGMiLCAicG5wUE5QLGIwMCIpOworCXJ0Y3MgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShOVUxMLCAicnRjIiwgInBucFBOUCxiMDAiKTsKIAlpZiAocnRjcyA9PSBOVUxMKQotCQlydGNzID0gZmluZF9jb21wYXRpYmxlX2RldmljZXMoInJ0YyIsICJkczEzODUtcnRjIik7Ci0JaWYgKHJ0Y3MgPT0gTlVMTCB8fCBvZl9hZGRyZXNzX3RvX3Jlc291cmNlKHJ0Y3MsIDAsICZyKSkKKwkJcnRjcyA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsICJydGMiLCAiZHMxMzg1LXJ0YyIpOworCWlmIChydGNzID09IE5VTEwpCiAJCXJldHVybiAwOwotCQorCWlmIChvZl9hZGRyZXNzX3RvX3Jlc291cmNlKHJ0Y3MsIDAsICZyKSkgeworCQlvZl9ub2RlX3B1dChydGNzKTsKKwkJcmV0dXJuIDA7CisJfQorCW9mX25vZGVfcHV0KHJ0Y3MpOworCiAJYmFzZSA9IHIuc3RhcnQ7CiAJbnZyYW1fYXMxID0gMDsKIAludnJhbV9hczAgPSBiYXNlOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9LY29uZmlnIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9LY29uZmlnCmluZGV4IDM0MTBiY2IuLjk1NTc5MDggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvS2NvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L0tjb25maWcKQEAgLTIsNzggKzIsNiBAQAogCXByb21wdCAiTWFjaGluZSBUeXBlIgogCWRlcGVuZHMgb24gRU1CRURERUQ2eHgKIAotY29uZmlnIEtBVEFOQQotCWJvb2wgIkFydGVzeW4tS2F0YW5hIgotCWhlbHAKLQkgIFNlbGVjdCBLQVRBTkEgaWYgY29uZmlndXJpbmcgYW4gQXJ0ZXN5biBLQVRBTkEgNzUwaSBvciAzNzUwCi0JICBjUENJIGJvYXJkLgotCi1jb25maWcgV0lMTE9XCi0JYm9vbCAiQ29nZW50LVdpbGxvdyIKLQotY29uZmlnIENQQ0k2OTAKLQlib29sICJGb3JjZS1DUENJNjkwIgotCWhlbHAKLQkgIFNlbGVjdCBDUENJNjkwIGlmIGNvbmZpZ3VyaW5nIGEgRm9yY2UgQ1BDSTY5MCBjUENJIGJvYXJkLgotCi1jb25maWcgUE9XRVJQTUMyNTAKLQlib29sICJGb3JjZS1Qb3dlclBNQzI1MCIKLQotY29uZmlnIENIRVNUTlVUCi0JYm9vbCAiSUJNIDc1MEZYIEV2YWwgYm9hcmQgb3IgNzUwR1ggRXZhbCBib2FyZCIKLQloZWxwCi0JICBTZWxlY3QgQ0hFU1ROVVQgaWYgY29uZmlndXJpbmcgYW4gSUJNIDc1MEZYIEV2YWwgQm9hcmQgb3IgYQotCSAgSUJNIDc1MEdYIEV2YWwgYm9hcmQuCi0KLWNvbmZpZyBTUFJVQ0UKLQlib29sICJJQk0tU3BydWNlIgotCXNlbGVjdCBQUENfSU5ESVJFQ1RfUENJCi0KLWNvbmZpZyBIRFBVCi0JYm9vbCAiU2t5LUhEUFUiCi0JaGVscAotCSAgU2VsZWN0IEhEUFUgaWYgY29uZmlndXJpbmcgYSBTa3kgQ29tcHV0ZXJzIENvbXB1dGUgQmxhZGUuCi0KLWNvbmZpZyBIRFBVX0ZFQVRVUkVTCi0JZGVwZW5kcyBvbiBIRFBVCi0JdHJpc3RhdGUgIkhEUFUtRmVhdHVyZXMiCi0JaGVscAotCSAgU2VsZWN0IHRvIGVuYWJsZSBIRFBVIGVuaGFuY2VkIGZlYXR1cmVzLgotCi1jb25maWcgRVY2NDI2MAotCWJvb2wgIk1hcnZlbGwtRVY2NDI2MEJQIgotCWhlbHAKLQkgIFNlbGVjdCBFVjY0MjYwIGlmIGNvbmZpZ3VyaW5nIGEgTWFydmVsbCAoZm9ybWVybHkgR2FsaWxlbykKLQkgIEVWNjQyNjBCUCBFdmFsdWF0aW9uIHBsYXRmb3JtLgotCi1jb25maWcgTE9QRUMKLQlib29sICJNb3Rvcm9sYS1Mb1BFQyIKLQlzZWxlY3QgUFBDX0k4MjU5Ci0KLWNvbmZpZyBNVk1FNTEwMAotCWJvb2wgIk1vdG9yb2xhLU1WTUU1MTAwIgotCXNlbGVjdCBQUENfSU5ESVJFQ1RfUENJCi0KLWNvbmZpZyBQUExVUwotCWJvb2wgIk1vdG9yb2xhLVBvd2VyUGx1cyIKLQlzZWxlY3QgUFBDX0k4MjU5Ci0Jc2VsZWN0IFBQQ19JTkRJUkVDVF9QQ0kKLQotY29uZmlnIFBSUE1DNzUwCi0JYm9vbCAiTW90b3JvbGEtUHJQTUM3NTAiCi0Jc2VsZWN0IFBQQ19JTkRJUkVDVF9QQ0kKLQotY29uZmlnIFBSUE1DODAwCi0JYm9vbCAiTW90b3JvbGEtUHJQTUM4MDAiCi0Jc2VsZWN0IFBQQ19JTkRJUkVDVF9QQ0kKLQotY29uZmlnIFNBTkRQT0lOVAotCWJvb2wgIk1vdG9yb2xhLVNhbmRwb2ludCIKLQlzZWxlY3QgUFBDX0k4MjU5Ci0JaGVscAotCSAgU2VsZWN0IFNBTkRQT0lOVCBpZiBjb25maWd1cmluZyBmb3IgYSBNb3Rvcm9sYSBTYW5kcG9pbnQgWDMKLQkgIChhbnkgZmxhdm9yKS4KLQogY29uZmlnIExJTktTVEFUSU9OCiAJYm9vbCAiTGlua3N0YXRpb24gLyBLdXJvYm94KEhHKSBmcm9tIEJ1ZmZhbG8iCiAJc2VsZWN0IE1QSUMKQEAgLTk3LDIxMiArMjUsMjQgQEAKIAloZWxwCiAJICBTZWxlY3QgTVBDNzQ0OEhQQzIgaWYgY29uZmlndXJpbmcgZm9yIEZyZWVzY2FsZSBNUEM3NDQ4SFBDMiAoVGFpZ2EpCiAJICBwbGF0Zm9ybQotCi1jb25maWcgUkFEU1RPTkVfUFBDN0QKLQlib29sICJSYWRzdG9uZSBUZWNobm9sb2d5IFBQQzdEIGJvYXJkIgotCXNlbGVjdCBQUENfSTgyNTkKLQotY29uZmlnIFBBTDQKLQlib29sICJTQlMtUGFsb21hcjQiCi0KLWNvbmZpZyBFU1Q4MjYwCi0JYm9vbCAiRVNUODI2MCIKLQktLS1oZWxwLS0tCi0JICBUaGUgRVNUODI2MCBpcyBhIHNpbmdsZS1ib2FyZCBjb21wdXRlciBtYW51ZmFjdHVyZWQgYnkgV2luZCBSaXZlcgotCSAgU3lzdGVtcywgSW5jLiAoZm9ybWVybHkgRW1iZWRkZWQgU3VwcG9ydCBUb29scyBDb3JwLikgYW5kIGJhc2VkIG9uCi0JICB0aGUgTVBDODI2MC4gIFdpbmQgUml2ZXIgU3lzdGVtcyBoYXMgYSB3ZWJzaXRlIGF0Ci0JICA8aHR0cDovL3d3dy53aW5kcml2ZXIuY29tLz4sIGJ1dCB0aGUgRVNUODI2MCBjYW5ub3QgYmUgZm91bmQgb24gaXQKLQkgIGFuZCBoYXMgcHJvYmFibHkgYmVlbiBkaXNjb250aW51ZWQgb3IgcmViYWRnZWQuCi0KLWNvbmZpZyBTQkM4Mnh4Ci0JYm9vbCAiU0JDODJ4eCIKLQktLS1oZWxwLS0tCi0JICBTQkMgUG93ZXJRVUlDQyBJSSwgc2luZ2xlLWJvYXJkIGNvbXB1dGVyIHdpdGggTVBDODJ4eCBDUFUKLQkgIE1hbnVmYWN0dXJlcjogV2luZCBSaXZlciBTeXN0ZW1zLCBJbmMuCi0JICBEYXRlIG9mIFJlbGVhc2U6IE1heSAyMDAzCi0JICBFbmQgb2YgTGlmZTogLQotCSAgVVJMOiA8aHR0cDovL3d3dy53aW5kcml2ZXIuY29tLz4KLQotY29uZmlnIFNCUzgyNjAKLQlib29sICJTQlM4MjYwIgotCi1jb25maWcgUlBYODI2MAotCWJvb2wgIlJQWFNVUEVSIgotCi1jb25maWcgVFFNODI2MAotCWJvb2wgIlRRTTgyNjAiCi0JLS0taGVscC0tLQotCSAgTVBDODI2MCBiYXNlZCBtb2R1bGUsIGxpdHRsZSBsYXJnZXIgdGhhbiBjcmVkaXQgY2FyZCwKLQkgIHVwIHRvIDEyOCBNQiBnbG9iYWwgKyA2NCBNQiBsb2NhbCBSQU0sIDMyIE1CIEZsYXNoLAotCSAgMzIga0IgRUVQUk9NLCAyNTYga0IgTEAgQ2FjaGUsIDEwYmFzZVQgKyAxMDBiYXNlVCBFdGhlcm5ldCwKLQkgIDIgeCBzZXJpYWwgcG9ydHMsIC4uLgotCSAgTWFudWZhY3R1cmVyOiBUUSBDb21wb25lbnRzLCB3d3cudHEtZ3JvdXAuZGUKLQkgIERhdGUgb2YgUmVsZWFzZTogSnVuZSAyMDAxCi0JICBFbmQgb2YgTGlmZTogbm90IHlldCA6LSkKLQkgIFVSTDogPGh0dHA6Ly93d3cuZGVueC5kZS9QREYvVFFNODJ4eF9TUEVDX1JldjAwNS5wZGY+Ci0KLWNvbmZpZyBBRFM4MjcyCi0JYm9vbCAiQURTODI3MiIKLQotY29uZmlnIFBRMkZBRFMKLQlib29sICJGcmVlc2NhbGUtUFEyRkFEUyIKLQloZWxwCi0JICBTZWxlY3QgUFEyRkFEUyBpZiB5b3Ugd2lzaCB0byBjb25maWd1cmUgZm9yIGEgRnJlZXNjYWxlCi0JICBQUTJGQURTIGJvYXJkICgtVlIgb3IgLVpVKS4KLQotY29uZmlnIEVWNjQzNjAKLQlib29sICJNYXJ2ZWxsLUVWNjQzNjBCUCIKLQloZWxwCi0JICBTZWxlY3QgRVY2NDM2MCBpZiBjb25maWd1cmluZyBhIE1hcnZlbGwgRVY2NDM2MEJQIEV2YWx1YXRpb24KLQkgIHBsYXRmb3JtLgogZW5kY2hvaWNlCiAKLWNvbmZpZyBQUTJBRFMKLQlib29sCi0JZGVwZW5kcyBvbiBBRFM4MjcyCi0JZGVmYXVsdCB5Ci0KLWNvbmZpZyBUUU04eHhMCi0JYm9vbAotCWRlcGVuZHMgb24gOHh4ICYmIChUUU04MjNMIHx8IFRRTTg1MEwgfHwgRlBTODUwTCB8fCBUUU04NTVMIHx8IFRRTTg2MEwpCi0JZGVmYXVsdCB5Ci0KLWNvbmZpZyA4MjYwCi0JYm9vbCAiQ1BNMiBTdXBwb3J0IiBpZiBXSUxMT1cKLQlkZXBlbmRzIG9uIDZ4eAotCWRlZmF1bHQgeSBpZiBUUU04MjYwIHx8IFJQWDgyNjAgfHwgRVNUODI2MCB8fCBTQlM4MjYwIHx8IFNCQzgyeHggfHwgUFEyRkFEUwotCWhlbHAKLQkgIFRoZSBNUEM4MjYwIGlzIGEgdHlwaWNhbCBlbWJlZGRlZCBDUFUgbWFkZSBieSBNb3Rvcm9sYS4gIFNlbGVjdGluZwotCSAgdGhpcyBvcHRpb24gbWVhbnMgdGhhdCB5b3Ugd2lzaCB0byBidWlsZCBhIGtlcm5lbCBmb3IgYSBtYWNoaW5lIHdpdGgKLQkgIGFuIDgyNjAgY2xhc3MgQ1BVLgotCi1jb25maWcgODI3MgotCWJvb2wKLQlkZXBlbmRzIG9uIDZ4eAotCWRlZmF1bHQgeSBpZiBBRFM4MjcyCi0Jc2VsZWN0IDgyNjAKLQloZWxwCi0JICBUaGUgTVBDODI3MiBDUE0gaGFzIGEgZGlmZmVyZW50IGludGVybmFsIGRwcmFtIHNldHVwIHRoYW4gb3RoZXIgQ1BNMgotCSAgZGV2aWNlcwotCi1jb25maWcgQ1BNMgotCWJvb2wKLQlkZXBlbmRzIG9uIDgyNjAgfHwgTVBDODU2MCB8fCBNUEM4NTU1Ci0JZGVmYXVsdCB5Ci0JaGVscAotCSAgVGhlIENQTTIgKENvbW11bmljYXRpb25zIFByb2Nlc3NvciBNb2R1bGUpIGlzIGEgY29wcm9jZXNzb3Igb24KLQkgIGVtYmVkZGVkIENQVXMgbWFkZSBieSBNb3Rvcm9sYS4gIFNlbGVjdGluZyB0aGlzIG9wdGlvbiBtZWFucyB0aGF0Ci0JICB5b3Ugd2lzaCB0byBidWlsZCBhIGtlcm5lbCBmb3IgYSBtYWNoaW5lIHdpdGggYSBDUE0yIGNvcHJvY2Vzc29yCi0JICBvbiBpdCAoODI2eCwgODI3eCwgODU2MCkuCi0KLWNvbmZpZyBQUENfR0VONTUwCi0JYm9vbAotCWRlcGVuZHMgb24gU0FORFBPSU5UIHx8IFNQUlVDRSB8fCBQUExVUyB8fCBcCi0JCVBSUE1DNzUwIHx8IFBSUE1DODAwIHx8IExPUEVDIHx8IFwKLQkJKEVWNjQyNjAgJiYgIVNFUklBTF9NUFNDKSB8fCBDSEVTVE5VVCB8fCBSQURTVE9ORV9QUEM3RCB8fCBcCi0JCTgzeHggfHwgTElOS1NUQVRJT04KLQlkZWZhdWx0IHkKLQotY29uZmlnIEZPUkNFCi0JYm9vbAotCWRlcGVuZHMgb24gNnh4ICYmIFBPV0VSUE1DMjUwCi0JZGVmYXVsdCB5Ci0KLWNvbmZpZyBHVDY0MjYwCi0JYm9vbAotCWRlcGVuZHMgb24gRVY2NDI2MCB8fCBDUENJNjkwCi0JZGVmYXVsdCB5Ci0KLWNvbmZpZyBNVjY0MzYwCQkjIFJlYWxseSBNVjY0MzYwICYgTVY2NDQ2MAotCWJvb2wKLQlkZXBlbmRzIG9uIENIRVNUTlVUIHx8IEtBVEFOQSB8fCBSQURTVE9ORV9QUEM3RCB8fCBIRFBVIHx8IEVWNjQzNjAKLQlkZWZhdWx0IHkKLQotY29uZmlnIE1WNjRYNjAKLQlib29sCi0JZGVwZW5kcyBvbiAoR1Q2NDI2MCB8fCBNVjY0MzYwKQotCXNlbGVjdCBQUENfSU5ESVJFQ1RfUENJCi0JZGVmYXVsdCB5Ci0KIGNvbmZpZyBUU0kxMDhfQlJJREdFCiAJYm9vbAogCWRlcGVuZHMgb24gTVBDNzQ0OEhQQzIKIAlkZWZhdWx0IHkKIAotbWVudSAiU2V0IGJyaWRnZSBvcHRpb25zIgotCWRlcGVuZHMgb24gTVY2NFg2MAotCi1jb25maWcgTk9UX0NPSEVSRU5UX0NBQ0hFCi0JYm9vbCAiVHVybiBvZmYgQ2FjaGUgQ29oZXJlbmN5IgotCWRlZmF1bHQgbgotCWhlbHAKLQkgIFNvbWUgNjR4NjAgYnJpZGdlcyBsb2NrIHVwIHdoZW4gdHJ5aW5nIHRvIGVuZm9yY2UgY2FjaGUgY29oZXJlbmN5LgotCSAgV2hlbiB0aGlzIG9wdGlvbiBpcyBzZWxlY3RlZCwgY2FjaGUgY29oZXJlbmN5IHdpbGwgYmUgdHVybmVkIG9mZi4KLQkgIE5vdGUgdGhhdCB0aGlzIGNhbiBjYXVzZSBvdGhlciBwcm9ibGVtcyAoZS5nLiwgc3RhbGUgZGF0YSBiZWluZwotCSAgc3BlY3VsYXRpdmVseSBsb2FkZWQgdmlhIGEgY2FjaGVkIG1hcHBpbmcpLiAgVXNlIGF0IHlvdXIgb3duIHJpc2suCi0KLWNvbmZpZyBNVjY0WDYwX0JBU0UKLQloZXggIlNldCBicmlkZ2UgYmFzZSB1c2VkIGJ5IGZpcm13YXJlIgotCWRlZmF1bHQgIjB4ZjEwMDAwMDAiCi0JaGVscAotCSAgQSBmaXJtd2FyZSBjYW4gbGVhdmUgdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgYnJpZGdlJ3MgcmVnaXN0ZXJzIGF0Ci0JICBhIG5vbi1zdGFuZGFyZCBsb2NhdGlvbi4gIElmIHNvLCBzZXQgdGhpcyB2YWx1ZSB0byByZWZsZWN0IHRoZQotCSAgYWRkcmVzcyBvZiB0aGF0IG5vbi1zdGFuZGFyZCBsb2NhdGlvbi4KLQotY29uZmlnIE1WNjRYNjBfTkVXX0JBU0UKLQloZXggIlNldCBicmlkZ2UgYmFzZSB1c2VkIGJ5IGtlcm5lbCIKLQlkZWZhdWx0ICIweGYxMDAwMDAwIgotCWhlbHAKLQkgIElmIHRoZSBjdXJyZW50IGJhc2UgYWRkcmVzcyBvZiB0aGUgYnJpZGdlJ3MgcmVnaXN0ZXJzIGlzIG5vdCB3aGVyZQotCSAgeW91IHdhbnQgaXQsIHNldCB0aGlzIHZhbHVlIHRvIHRoZSBhZGRyZXNzIHRoYXQgeW91IHdhbnQgaXQgbW92ZWQgdG8uCi0KLWVuZG1lbnUKLQotY29uZmlnIE5PTk1PTkFSQ0hfU1VQUE9SVAotCWJvb2wgIkVuYWJsZSBOb24tTW9uYXJjaCBTdXBwb3J0IgotCWRlcGVuZHMgb24gUFJQTUM4MDAKLQotY29uZmlnIEhBUlJJRVIKLQlib29sCi0JZGVwZW5kcyBvbiBQUlBNQzgwMAotCWRlZmF1bHQgeQotCi1jb25maWcgRVBJQ19TRVJJQUxfTU9ERQotCWJvb2wKLQlkZXBlbmRzIG9uIDZ4eCAmJiAoTE9QRUMgfHwgU0FORFBPSU5UKQotCWRlZmF1bHQgeQotCiBjb25maWcgTVBDMTBYX0JSSURHRQogCWJvb2wKLQlkZXBlbmRzIG9uIFBPV0VSUE1DMjUwIHx8IExPUEVDIHx8IFNBTkRQT0lOVCB8fCBMSU5LU1RBVElPTgorCWRlcGVuZHMgb24gTElOS1NUQVRJT04KIAlzZWxlY3QgUFBDX0lORElSRUNUX1BDSQogCWRlZmF1bHQgeQogCiBjb25maWcgTVBDMTBYX09QRU5QSUMKIAlib29sCi0JZGVwZW5kcyBvbiBQT1dFUlBNQzI1MCB8fCBMT1BFQyB8fCBTQU5EUE9JTlQgfHwgTElOS1NUQVRJT04KKwlkZXBlbmRzIG9uIExJTktTVEFUSU9OCiAJZGVmYXVsdCB5CiAKIGNvbmZpZyBNUEMxMFhfU1RPUkVfR0FUSEVSSU5HCiAJYm9vbCAiRW5hYmxlIE1QQzEweCBzdG9yZSBnYXRoZXJpbmciCiAJZGVwZW5kcyBvbiBNUEMxMFhfQlJJREdFCi0KLWNvbmZpZyBTQU5EUE9JTlRfRU5BQkxFX1VBUlQxCi0JYm9vbCAiRW5hYmxlIERVQVJUIG1vZGUgb24gU2FuZHBvaW50IgotCWRlcGVuZHMgb24gU0FORFBPSU5UCi0JaGVscAotCSAgSWYgdGhpcyBvcHRpb24gaXMgZW5hYmxlZCB0aGVuIHRoZSBNUEM4MjR4IHByb2Nlc3NvciB3aWxsIHJ1bgotCSAgaW4gRFVBUlQgbW9kZSBpbnN0ZWFkIG9mIFVBUlQgbW9kZS4KLQotY29uZmlnIEhBUlJJRVJfU1RPUkVfR0FUSEVSSU5HCi0JYm9vbCAiRW5hYmxlIEhhcnJpZXIgc3RvcmUgZ2F0aGVyaW5nIgotCWRlcGVuZHMgb24gSEFSUklFUgotCi1jb25maWcgTVZNRTUxMDBfSVBNQzc2MV9QUkVTRU5UCi0JYm9vbCAiTVZNRTUxMDAgY29uZmlndXJlZCB3aXRoIGFuIElQTUM3NjEiCi0JZGVwZW5kcyBvbiBNVk1FNTEwMAotCXNlbGVjdCBQUENfSTgyNTkKLQotY29uZmlnIFNQUlVDRV9CQVVEXzMzTQotCWJvb2wgIlNwcnVjZSBiYXVkIGNsb2NrIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBTUFJVQ0UKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvbGlua3N0YXRpb24uYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvbGlua3N0YXRpb24uYwppbmRleCAzZjZjNDExLi5iNDEyZjAwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L2xpbmtzdGF0aW9uLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9saW5rc3RhdGlvbi5jCkBAIC01OCwxMSArNTgsMTEgQEAKIHsKIAlpbnQgbGVuOwogCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZTsKLQlpbnQgKmJ1c19yYW5nZTsKKwljb25zdCBpbnQgKmJ1c19yYW5nZTsKIAogCXByaW50aygiQWRkaW5nIFBDSSBob3N0IGJyaWRnZSAlc1xuIiwgZGV2LT5mdWxsX25hbWUpOwogCi0JYnVzX3JhbmdlID0gKGludCAqKSBnZXRfcHJvcGVydHkoZGV2LCAiYnVzLXJhbmdlIiwgJmxlbik7CisJYnVzX3JhbmdlID0gb2ZfZ2V0X3Byb3BlcnR5KGRldiwgImJ1cy1yYW5nZSIsICZsZW4pOwogCWlmIChidXNfcmFuZ2UgPT0gTlVMTCB8fCBsZW4gPCAyICogc2l6ZW9mKGludCkpCiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIkNhbid0IGdldCBidXMtcmFuZ2UgZm9yICVzLCBhc3N1bWUiCiAJCQkJIiBidXMgMFxuIiwgZGV2LT5mdWxsX25hbWUpOwpAQCAtMTA2LDcgKzEwNiw3IEBACiB7CiAJc3RydWN0IG1waWMgKm1waWM7CiAJc3RydWN0IGRldmljZV9ub2RlICpkbnA7Ci0Jdm9pZCAqcHJvcDsKKwljb25zdCB1MzIgKnByb3A7CiAJaW50IHNpemU7CiAJcGh5c19hZGRyX3QgcGFkZHI7CiAKQEAgLTExNCw3ICsxMTQsNyBAQAogCWlmIChkbnAgPT0gTlVMTCkKIAkJcmV0dXJuOwogCi0JcHJvcCA9IChzdHJ1Y3QgZGV2aWNlX25vZGUgKilnZXRfcHJvcGVydHkoZG5wLCAicmVnIiwgJnNpemUpOworCXByb3AgPSBvZl9nZXRfcHJvcGVydHkoZG5wLCAicmVnIiwgJnNpemUpOwogCXBhZGRyID0gKHBoeXNfYWRkcl90KW9mX3RyYW5zbGF0ZV9hZGRyZXNzKGRucCwgcHJvcCk7CiAKIAltcGljID0gbXBpY19hbGxvYyhkbnAsIHBhZGRyLCBNUElDX1BSSU1BUlkgfCBNUElDX1dBTlRTX1JFU0VULCA0LCAzMiwgIiBFUElDICAgICAiKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvbHNfdWFydC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9sc191YXJ0LmMKaW5kZXggMGU4Mzc3Ni4uZDBiZWU5ZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9sc191YXJ0LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9sc191YXJ0LmMKQEAgLTExMCw4ICsxMTAsOCBAQAogCWlmICghYXZyKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWF2cl9jbG9jayA9ICoodTMyKilnZXRfcHJvcGVydHkoYXZyLCAiY2xvY2stZnJlcXVlbmN5IiwgJmxlbik7Ci0JcGh5c19hZGRyID0gKCh1MzIqKWdldF9wcm9wZXJ0eShhdnIsICJyZWciLCAmbGVuKSlbMF07CisJYXZyX2Nsb2NrID0gKih1MzIqKW9mX2dldF9wcm9wZXJ0eShhdnIsICJjbG9jay1mcmVxdWVuY3kiLCAmbGVuKTsKKwlwaHlzX2FkZHIgPSAoKHUzMiopb2ZfZ2V0X3Byb3BlcnR5KGF2ciwgInJlZyIsICZsZW4pKVswXTsKIAogCWlmICghYXZyX2Nsb2NrIHx8ICFwaHlzX2FkZHIpCiAJCXJldHVybiAtRUlOVkFMOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9tcGM3NDQ4X2hwYzIuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvbXBjNzQ0OF9ocGMyLmMKaW5kZXggM2ZjYzg1Zi4uYzNmNjRkZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9tcGM3NDQ4X2hwYzIuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L21wYzc0NDhfaHBjMi5jCkBAIC0yNSw3ICsyNSw2IEBACiAjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+Ci0jaW5jbHVkZSA8bGludXgvaWRlLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9yb290X2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgpAQCAtODIsNyArODEsNyBAQAogCWlmIChjcHUgIT0gMCkgewogCQljb25zdCB1bnNpZ25lZCBpbnQgKmZwOwogCi0JCWZwID0gZ2V0X3Byb3BlcnR5KGNwdSwgImNsb2NrLWZyZXF1ZW5jeSIsIE5VTEwpOworCQlmcCA9IG9mX2dldF9wcm9wZXJ0eShjcHUsICJjbG9jay1mcmVxdWVuY3kiLCBOVUxMKTsKIAkJaWYgKGZwICE9IDApCiAJCQlsb29wc19wZXJfamlmZnkgPSAqZnAgLyBIWjsKIAkJZWxzZQpAQCAtOTEsMTYgKzkwLDYgQEAKIAl9CiAJdHNpMTA4X2Nzcl92aXJfYmFzZSA9IGdldF92aXJfY3NyYmFzZSgpOwogCi0jaWZkZWYJQ09ORklHX1JPT1RfTkZTCi0JUk9PVF9ERVYgPSBSb290X05GUzsKLSNlbHNlCi0JUk9PVF9ERVYgPSBSb290X0hEQTE7Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19CTEtfREVWX0lOSVRSRAotCVJPT1RfREVWID0gUm9vdF9SQU0wOwotI2VuZGlmCi0KIAkvKiBzZXR1cCBQQ0kgaG9zdCBicmlkZ2UgKi8KICNpZmRlZiBDT05GSUdfUENJCiAJZm9yIChucCA9IE5VTEw7IChucCA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKG5wLCAicGNpIikpICE9IE5VTEw7KQpAQCAtMTQzLDcgKzEzMiw3IEBACiAJdHNpX3BpYyA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKE5VTEwsICJvcGVuLXBpYyIpOwogCWlmICh0c2lfcGljKSB7CiAJCXVuc2lnbmVkIGludCBzaXplOwotCQljb25zdCB2b2lkICpwcm9wID0gZ2V0X3Byb3BlcnR5KHRzaV9waWMsICJyZWciLCAmc2l6ZSk7CisJCWNvbnN0IHZvaWQgKnByb3AgPSBvZl9nZXRfcHJvcGVydHkodHNpX3BpYywgInJlZyIsICZzaXplKTsKIAkJbXBpY19wYWRkciA9IG9mX3RyYW5zbGF0ZV9hZGRyZXNzKHRzaV9waWMsIHByb3ApOwogCX0KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL0tjb25maWcgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvS2NvbmZpZwppbmRleCA1NGU2YjNiLi40NmMzYThlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvS2NvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvS2NvbmZpZwpAQCAtMSwzICsxLDcgQEAKK2NvbmZpZyBQUENfSVNFUklFUworCWJvb2wgIklCTSBMZWdhY3kgaVNlcmllcyIKKwlkZXBlbmRzIG9uIFBQQ19NVUxUSVBMQVRGT1JNICYmIFBQQzY0CisJc2VsZWN0IFBQQ19JTkRJUkVDVF9JTwogCiBtZW51ICJpU2VyaWVzIGRldmljZSBkcml2ZXJzIgogCWRlcGVuZHMgb24gUFBDX0lTRVJJRVMKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9pb21tdS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL2lvbW11LmMKaW5kZXggZDdhNzU2ZC4uM2I2YTk2NiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL2lvbW11LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL2lvbW11LmMKQEAgLTE3MSw3ICsxNzEsNyBAQAogewogCXN0cnVjdCBpb21tdV90YWJsZSAqdGJsOwogCXN0cnVjdCBwY2lfZG4gKnBkbiA9IFBDSV9ETihkbik7Ci0JY29uc3QgdTMyICpsc24gPSBnZXRfcHJvcGVydHkoZG4sICJsaW51eCxsb2dpY2FsLXNsb3QtbnVtYmVyIiwgTlVMTCk7CisJY29uc3QgdTMyICpsc24gPSBvZl9nZXRfcHJvcGVydHkoZG4sICJsaW51eCxsb2dpY2FsLXNsb3QtbnVtYmVyIiwgTlVMTCk7CiAKIAlCVUdfT04obHNuID09IE5VTEwpOwogCkBAIC0xOTQsNSArMTk0LDUgQEAKIAlwcGNfbWQudGNlX2J1aWxkID0gdGNlX2J1aWxkX2lTZXJpZXM7CiAJcHBjX21kLnRjZV9mcmVlICA9IHRjZV9mcmVlX2lTZXJpZXM7CiAKLQlwY2lfZG1hX29wcyA9ICZkbWFfaW9tbXVfb3BzOworCXNldF9wY2lfZG1hX29wcygmZG1hX2lvbW11X29wcyk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvaXJxLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvaXJxLmMKaW5kZXggNTIyNWFiZi4uNjNiMzM2NyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL2lycS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9pcnEuYwpAQCAtMzAsNyArMzAsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3BhcmFtLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgotI2luY2x1ZGUgPGxpbnV4L2lkZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAKQEAgLTMzNyw2ICszMzYsOCBAQAogCXJldHVybiBpcnE7CiB9CiAKKyNpZmRlZiBDT05GSUdfUENJCisKIHN0YXRpYyBpbnQgaXNlcmllc19pcnFfaG9zdF9tYXAoc3RydWN0IGlycV9ob3N0ICpoLCB1bnNpZ25lZCBpbnQgdmlycSwKIAkJCQlpcnFfaHdfbnVtYmVyX3QgaHcpCiB7CkBAIC0zODQsMyArMzg1LDQgQEAKIAkJCQkiZmFpbGVkIHdpdGggcmMgMHgleFxuIiwgcmV0KTsKIH0KIAorI2VuZGlmCS8qIENPTkZJR19QQ0kgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9wY2kuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9wY2kuYwppbmRleCA0YTA2ZDljLi45Yzk3NDIyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvcGNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL3BjaS5jCkBAIC0yNCw3ICsyNCw2IEBACiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2lkZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CkBAIC0xNzcsNyArMTc2LDcgQEAKIAkJCXN0cnVjdCBwY2lfZG4gKnBkbiA9IFBDSV9ETihub2RlKTsKIAkJCWNvbnN0IHUzMiAqYWdlbnQ7CiAKLQkJCWFnZW50ID0gZ2V0X3Byb3BlcnR5KG5vZGUsICJsaW51eCxhZ2VudC1pZCIsIE5VTEwpOworCQkJYWdlbnQgPSBvZl9nZXRfcHJvcGVydHkobm9kZSwgImxpbnV4LGFnZW50LWlkIiwgTlVMTCk7CiAJCQlpZiAoKHBkbiAhPSBOVUxMKSAmJiAoYWdlbnQgIT0gTlVMTCkpIHsKIAkJCQl1OCBpcnEgPSBpU2VyaWVzX2FsbG9jYXRlX0lSUShwZG4tPmJ1c25vLCAwLAogCQkJCQkJcGRuLT5idXNzdWJubyk7CkBAIC03NTUsNyArNzU0LDcgQEAKIAkJaWYgKChub2RlLT50eXBlID09IE5VTEwpIHx8IChzdHJjbXAobm9kZS0+dHlwZSwgInBjaSIpICE9IDApKQogCQkJY29udGludWU7CiAKLQkJYnVzcCA9IGdldF9wcm9wZXJ0eShub2RlLCAiYnVzLXJhbmdlIiwgTlVMTCk7CisJCWJ1c3AgPSBvZl9nZXRfcHJvcGVydHkobm9kZSwgImJ1cy1yYW5nZSIsIE5VTEwpOwogCQlpZiAoYnVzcCA9PSBOVUxMKQogCQkJY29udGludWU7CiAJCWJ1cyA9ICpidXNwOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL3NldHVwLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvc2V0dXAuYwppbmRleCBjY2U3ZTMwLi43ZjVkY2VlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvc2V0dXAuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvc2V0dXAuYwpAQCAtNjI4LDE1ICs2MjgsNiBAQAogewogfQogCi0vKgotICogaVNlcmllcyBoYXMgbm8gbGVnYWN5IElPLCBhbnl0aGluZyBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gaGFzIHRvCi0gKiBmYWlsIG9yIGJhZCB0aGluZ3Mgd2lsbCBoYXBwZW4KLSAqLwotc3RhdGljIGludCBpc2VyaWVzX2NoZWNrX2xlZ2FjeV9pb3BvcnQodW5zaWduZWQgaW50IGJhc2Vwb3J0KQotewotCXJldHVybiAtRU5PREVWOwotfQotCiBzdGF0aWMgaW50IF9faW5pdCBpc2VyaWVzX3Byb2JlKHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyByb290ID0gb2ZfZ2V0X2ZsYXRfZHRfcm9vdCgpOwpAQCAtNjY3LDcgKzY1OCw2IEBACiAJLmNhbGlicmF0ZV9kZWNyCT0gZ2VuZXJpY19jYWxpYnJhdGVfZGVjciwKIAkucHJvZ3Jlc3MJPSBpU2VyaWVzX3Byb2dyZXNzLAogCS5wcm9iZQkJPSBpc2VyaWVzX3Byb2JlLAotCS5jaGVja19sZWdhY3lfaW9wb3J0CT0gaXNlcmllc19jaGVja19sZWdhY3lfaW9wb3J0LAogCS5pb3JlbWFwCT0gaXNlcmllc19pb3JlbWFwLAogCS5pb3VubWFwCT0gaXNlcmllc19pb3VubWFwLAogCS8qIFhYWCBJbXBsZW1lbnQgZW5hYmxlX3BtY3MgZm9yIGlTZXJpZXMgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy92aW9wYXRoLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvdmlvcGF0aC5jCmluZGV4IGUyMTAwZWMuLjJjYTJkOGEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy92aW9wYXRoLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL3Zpb3BhdGguYwpAQCAtMTU1LDcgKzE1NSw3IEBACiAJbm9kZSA9IG9mX2ZpbmRfbm9kZV9ieV9wYXRoKCIvIik7CiAJc3lzaWQgPSBOVUxMOwogCWlmIChub2RlICE9IE5VTEwpCi0JCXN5c2lkID0gZ2V0X3Byb3BlcnR5KG5vZGUsICJzeXN0ZW0taWQiLCBOVUxMKTsKKwkJc3lzaWQgPSBvZl9nZXRfcHJvcGVydHkobm9kZSwgInN5c3RlbS1pZCIsIE5VTEwpOwogCiAJaWYgKHN5c2lkID09IE5VTEwpCiAJCXNlcV9wcmludGYobSwgIlNSTE5CUj08VU5LTk9XTj5cbiIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9tYXBsZS9LY29uZmlnIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9tYXBsZS9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3Yzk1ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL21hcGxlL0tjb25maWcKQEAgLTAsMCArMSwxNyBAQAorY29uZmlnIFBQQ19NQVBMRQorCWRlcGVuZHMgb24gUFBDX01VTFRJUExBVEZPUk0gJiYgUFBDNjQKKwlib29sICJNYXBsZSA5NzBGWCBFdmFsdWF0aW9uIEJvYXJkIgorCXNlbGVjdCBNUElDCisJc2VsZWN0IFUzX0RBUlQKKwlzZWxlY3QgTVBJQ19VM19IVF9JUlFTCisJc2VsZWN0IEdFTkVSSUNfVEJTWU5DCisJc2VsZWN0IFBQQ19VREJHXzE2NTUwCisJc2VsZWN0IFBQQ185NzBfTkFQCisJc2VsZWN0IFBQQ19OQVRJVkUKKwlzZWxlY3QgUFBDX1JUQVMKKwlzZWxlY3QgTU1JT19OVlJBTQorCXNlbGVjdCBBVEFfTk9OU1RBTkRBUkQgaWYgQVRBCisJZGVmYXVsdCBuCisJaGVscAorICAgICAgICAgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIE1hcGxlIDk3MEZYIEV2YWx1YXRpb24gQm9hcmQuCisJICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcmVmZXIgdG8gPGh0dHA6Ly93d3cuOTcwZXZhbC5jb20+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL21hcGxlL3BjaS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9tYXBsZS9wY2kuYwppbmRleCA3M2M1OTkwLi5iMWQzYjk5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL21hcGxlL3BjaS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvbWFwbGUvcGNpLmMKQEAgLTQ0LDExICs0NCwxMSBAQAogCQlpbnQgbGVuOwogCiAJCS8qIEZvciBQQ0k8LT5QQ0kgYnJpZGdlcyBvciBDYXJkQnVzIGJyaWRnZXMsIHdlIGdvIGRvd24gKi8KLQkJY2xhc3NfY29kZSA9IGdldF9wcm9wZXJ0eShub2RlLCAiY2xhc3MtY29kZSIsIE5VTEwpOworCQljbGFzc19jb2RlID0gb2ZfZ2V0X3Byb3BlcnR5KG5vZGUsICJjbGFzcy1jb2RlIiwgTlVMTCk7CiAJCWlmICghY2xhc3NfY29kZSB8fCAoKCpjbGFzc19jb2RlID4+IDgpICE9IFBDSV9DTEFTU19CUklER0VfUENJICYmCiAJCQkoKmNsYXNzX2NvZGUgPj4gOCkgIT0gUENJX0NMQVNTX0JSSURHRV9DQVJEQlVTKSkKIAkJCWNvbnRpbnVlOwotCQlidXNfcmFuZ2UgPSBnZXRfcHJvcGVydHkobm9kZSwgImJ1cy1yYW5nZSIsICZsZW4pOworCQlidXNfcmFuZ2UgPSBvZl9nZXRfcHJvcGVydHkobm9kZSwgImJ1cy1yYW5nZSIsICZsZW4pOwogCQlpZiAoYnVzX3JhbmdlICE9IE5VTEwgJiYgbGVuID4gMiAqIHNpemVvZihpbnQpKSB7CiAJCQlpZiAoYnVzX3JhbmdlWzFdID4gaGlnaGVyKQogCQkJCWhpZ2hlciA9IGJ1c19yYW5nZVsxXTsKQEAgLTc3LDcgKzc3LDcgQEAKIAkJCSAgICAgICBicmlkZ2UtPmZ1bGxfbmFtZSk7CiAJCXJldHVybjsKIAl9Ci0JYnVzX3JhbmdlID0gKGludCAqKXByb3AtPnZhbHVlOworCWJ1c19yYW5nZSA9IHByb3AtPnZhbHVlOwogCWJ1c19yYW5nZVsxXSA9IGZpeHVwX29uZV9sZXZlbF9idXNfcmFuZ2UoYnJpZGdlLT5jaGlsZCwgYnVzX3JhbmdlWzFdKTsKIH0KIApAQCAtNDU0LDcgKzQ1NCw3IEBACiAKIAlEQkcoIkFkZGluZyBQQ0kgaG9zdCBicmlkZ2UgJXNcbiIsIGRldi0+ZnVsbF9uYW1lKTsKIAotCWJ1c19yYW5nZSA9IGdldF9wcm9wZXJ0eShkZXYsICJidXMtcmFuZ2UiLCAmbGVuKTsKKwlidXNfcmFuZ2UgPSBvZl9nZXRfcHJvcGVydHkoZGV2LCAiYnVzLXJhbmdlIiwgJmxlbik7CiAJaWYgKGJ1c19yYW5nZSA9PSBOVUxMIHx8IGxlbiA8IDIgKiBzaXplb2YoaW50KSkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJDYW4ndCBnZXQgYnVzLXJhbmdlIGZvciAlcywgYXNzdW1lIGJ1cyAwXG4iLAogCQlkZXYtPmZ1bGxfbmFtZSk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL21hcGxlL3NldHVwLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL21hcGxlL3NldHVwLmMKaW5kZXggODJkM2Y5ZS4uMmEzMGM1YiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9tYXBsZS9zZXR1cC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvbWFwbGUvc2V0dXAuYwpAQCAtMzIsNyArMzIsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXRyZC5oPgogI2luY2x1ZGUgPGxpbnV4L3Z0X2tlcm4uaD4KICNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+Ci0jaW5jbHVkZSA8bGludXgvaWRlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvYWRiLmg+CiAjaW5jbHVkZSA8bGludXgvY3VkYS5oPgpAQCAtMTE0LDggKzExMyw4IEBACiAJCXByaW50ayhLRVJOX0VNRVJHICJNYXBsZTogVW5hYmxlIHRvIGZpbmQgU2VydmljZSBQcm9jZXNzb3JcbiIpOwogCQlnb3RvIGZhaWw7CiAJfQotCW1hcGxlX252cmFtX29mZnNldCA9IGdldF9wcm9wZXJ0eShzcCwgInJlc3RhcnQtYWRkciIsIE5VTEwpOwotCW1hcGxlX252cmFtX2NvbW1hbmQgPSBnZXRfcHJvcGVydHkoc3AsICJyZXN0YXJ0LXZhbHVlIiwgTlVMTCk7CisJbWFwbGVfbnZyYW1fb2Zmc2V0ID0gb2ZfZ2V0X3Byb3BlcnR5KHNwLCAicmVzdGFydC1hZGRyIiwgTlVMTCk7CisJbWFwbGVfbnZyYW1fY29tbWFuZCA9IG9mX2dldF9wcm9wZXJ0eShzcCwgInJlc3RhcnQtdmFsdWUiLCBOVUxMKTsKIAlvZl9ub2RlX3B1dChzcCk7CiAKIAkvKiBzZW5kIGNvbW1hbmQgKi8KQEAgLTE0MSw4ICsxNDAsOCBAQAogCQlwcmludGsoS0VSTl9FTUVSRyAiTWFwbGU6IFVuYWJsZSB0byBmaW5kIFNlcnZpY2UgUHJvY2Vzc29yXG4iKTsKIAkJZ290byBmYWlsOwogCX0KLQltYXBsZV9udnJhbV9vZmZzZXQgPSBnZXRfcHJvcGVydHkoc3AsICJwb3dlci1vZmYtYWRkciIsIE5VTEwpOwotCW1hcGxlX252cmFtX2NvbW1hbmQgPSBnZXRfcHJvcGVydHkoc3AsICJwb3dlci1vZmYtdmFsdWUiLCBOVUxMKTsKKwltYXBsZV9udnJhbV9vZmZzZXQgPSBvZl9nZXRfcHJvcGVydHkoc3AsICJwb3dlci1vZmYtYWRkciIsIE5VTEwpOworCW1hcGxlX252cmFtX2NvbW1hbmQgPSBvZl9nZXRfcHJvcGVydHkoc3AsICJwb3dlci1vZmYtdmFsdWUiLCBOVUxMKTsKIAlvZl9ub2RlX3B1dChzcCk7CiAKIAkvKiBzZW5kIGNvbW1hbmQgKi8KQEAgLTI0OSw4ICsyNDgsOCBAQAogCiAJLyogRmluZCBhZGRyZXNzIGxpc3QgaW4gL3BsYXRmb3JtLW9wZW4tcGljICovCiAJcm9vdCA9IG9mX2ZpbmRfbm9kZV9ieV9wYXRoKCIvIik7Ci0JbmFkZHIgPSBwcm9tX25fYWRkcl9jZWxscyhyb290KTsKLQlvcHByb3AgPSBnZXRfcHJvcGVydHkocm9vdCwgInBsYXRmb3JtLW9wZW4tcGljIiwgJm9wcGxlbik7CisJbmFkZHIgPSBvZl9uX2FkZHJfY2VsbHMocm9vdCk7CisJb3Bwcm9wID0gb2ZfZ2V0X3Byb3BlcnR5KHJvb3QsICJwbGF0Zm9ybS1vcGVuLXBpYyIsICZvcHBsZW4pOwogCWlmIChvcHByb3AgIT0gMCkgewogCQlvcGVucGljX2FkZHIgPSBvZl9yZWFkX251bWJlcihvcHByb3AsIG5hZGRyKTsKIAkJaGFzX2lzdXMgPSAob3BwbGVuID4gbmFkZHIpOwpAQCAtMjYxLDExICsyNjAsMTEgQEAKIAlCVUdfT04ob3BlbnBpY19hZGRyID09IDApOwogCiAJLyogQ2hlY2sgZm9yIGEgYmlnIGVuZGlhbiBNUElDICovCi0JaWYgKGdldF9wcm9wZXJ0eShucCwgImJpZy1lbmRpYW4iLCBOVUxMKSAhPSBOVUxMKQorCWlmIChvZl9nZXRfcHJvcGVydHkobnAsICJiaWctZW5kaWFuIiwgTlVMTCkgIT0gTlVMTCkKIAkJZmxhZ3MgfD0gTVBJQ19CSUdfRU5ESUFOOwogCiAJLyogWFhYIE1hcGxlIHNwZWNpZmljIGJpdHMgKi8KLQlmbGFncyB8PSBNUElDX0JST0tFTl9VMyB8IE1QSUNfV0FOVFNfUkVTRVQ7CisJZmxhZ3MgfD0gTVBJQ19VM19IVF9JUlFTIHwgTVBJQ19XQU5UU19SRVNFVDsKIAkvKiBBbGwgVTMvVTQgYXJlIGJpZy1lbmRpYW4sIG9sZGVyIFNMT0YgZmlybXdhcmUgZG9lc24ndCBlbmNvZGUgdGhpcyAqLwogCWZsYWdzIHw9IE1QSUNfQklHX0VORElBTjsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL0tjb25maWcKaW5kZXggNjhkYzUyOS4uZWI0ZGJjNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvS2NvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9LY29uZmlnCkBAIC0xLDMgKzEsMTUgQEAKK2NvbmZpZyBQUENfUEFTRU1JCisJZGVwZW5kcyBvbiBQUENfTVVMVElQTEFURk9STSAmJiBQUEM2NAorCWJvb2wgIlBBIFNlbWkgU29DLWJhc2VkIHBsYXRmb3JtcyIKKwlkZWZhdWx0IG4KKwlzZWxlY3QgTVBJQworCXNlbGVjdCBQUENfVURCR18xNjU1MAorCXNlbGVjdCBHRU5FUklDX1RCU1lOQworCXNlbGVjdCBQUENfTkFUSVZFCisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciBQQSBTZW1pJ3MgUFdSZmljaWVudCBsaW5lCisJICBvZiBTb0MgcHJvY2Vzc29ycywgaW5jbHVkaW5nIFBBNlQtMTY4Mk0KKwogbWVudSAiUEEgU2VtaSBQV1JmaWNpZW50IG9wdGlvbnMiCiAJZGVwZW5kcyBvbiBQUENfUEFTRU1JCiAKQEAgLTcsNCArMTksMTEgQEAKIAloZWxwCiAJICBJT01NVSBzdXBwb3J0IGZvciBQQTZULTE2ODJNCiAKK2NvbmZpZyBQUENfUEFTRU1JX01ESU8KKwlkZXBlbmRzIG9uIFBIWUxJQgorCXRyaXN0YXRlICJNRElPIHN1cHBvcnQgdmlhIEdQSU8iCisJZGVmYXVsdCB5CisJaGVscAorCSAgRHJpdmVyIGZvciBNRElPIHZpYSBHUElPIG9uIFBXUmZpY2llbnQgcGxhdGZvcm1zCisKIGVuZG1lbnUKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvTWFrZWZpbGUKaW5kZXggZTY1N2NjYS4uMmNkMmE0ZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvTWFrZWZpbGUKQEAgLTEsMiArMSwzIEBACiBvYmoteQkrPSBzZXR1cC5vIHBjaS5vIHRpbWUubyBpZGxlLm8gcG93ZXJzYXZlLm8gaW9tbXUubwotCitvYmotJChDT05GSUdfUFBDX1BBU0VNSV9NRElPKQkrPSBncGlvX21kaW8ubworb2JqLSQoQ09ORklHX1BQQ19QQVNFTUlfQ1BVRlJFUSkgKz0gY3B1ZnJlcS5vCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9jcHVmcmVxLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9jcHVmcmVxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE1N2Q2MAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL2NwdWZyZXEuYwpAQCAtMCwwICsxLDMwOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBQQSBTZW1pLCBJbmMKKyAqCisgKiBBdXRob3JzOiBFZ29yIE1hcnRvdmV0c2t5IDxlZ29yQHBhc2VtaS5jb20+CisgKgkgICAgT2xvZiBKb2hhbnNzb24gPG9sb2ZAbGl4b20ubmV0PgorICoKKyAqIE1haW50YWluZWQgYnk6IE9sb2YgSm9oYW5zc29uIDxvbG9mQGxpeG9tLm5ldD4KKyAqCisgKiBCYXNlZCBvbiBhcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvY2JlX2NwdWZyZXEuYzoKKyAqIChDKSBDb3B5cmlnaHQgSUJNIERldXRzY2hsYW5kIEVudHdpY2tsdW5nIEdtYkggMjAwNQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvY3B1ZnJlcS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisKKyNpbmNsdWRlIDxhc20vaHdfaXJxLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKworI2RlZmluZSBTRENBU1JfUkVHCQkweDAxMDAKKyNkZWZpbmUgU0RDQVNSX1JFR19TVFJJREUJMHgxMDAwCisjZGVmaW5lIFNEQ1BXUl9DRkdBMF9SRUcJMHgwMTAwCisjZGVmaW5lIFNEQ1BXUl9QV1NUMF9SRUcJMHgwMDAwCisjZGVmaW5lIFNEQ1BXUl9HSVpUSU1FX1JFRwkweDA0NDAKKworLyogU0RDUFdSX0dJWlRJTUVfUkVHIGZpZWxkcyAqLworI2RlZmluZSBTRENQV1JfR0laVElNRV9HUgkweDgwMDAwMDAwCisjZGVmaW5lIFNEQ1BXUl9HSVpUSU1FX0xPTkdMT0NLCTB4MDAwMDAwZmYKKworLyogT2Zmc2V0IG9mIEFTUiByZWdpc3RlcnMgZnJvbSBTREMgYmFzZSAqLworI2RlZmluZSBTRENBU1JfT0ZGU0VUCQkweDEyMDAwMAorCitzdGF0aWMgdm9pZCBfX2lvbWVtICpzZGNwd3JfbWFwYmFzZTsKK3N0YXRpYyB2b2lkIF9faW9tZW0gKnNkY2Fzcl9tYXBiYXNlOworCitzdGF0aWMgREVGSU5FX01VVEVYKHBhc19zd2l0Y2hfbXV0ZXgpOworCisvKiBDdXJyZW50IGFzdGF0ZSwgaXMgdXNlZCB3aGVuIHdha2luZyB1cCBmcm9tIHBvd2VyIHNhdmluZ3Mgb24KKyAqIG9uZSBjb3JlLCBpbiBjYXNlIHRoZSBvdGhlciBjb3JlIGhhcyBzd2l0Y2hlZCBzdGF0ZXMgZHVyaW5nCisgKiB0aGUgaWRsZSB0aW1lLgorICovCitzdGF0aWMgaW50IGN1cnJlbnRfYXN0YXRlOworCisvKiBXZSBzdXBwb3J0IDUoQTAtQTQpIHBvd2VyIHN0YXRlcyBleGNsdWRpbmcgdHVyYm8oQTUtQTYpIG1vZGVzICovCitzdGF0aWMgc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlIHBhc19mcmVxc1tdID0geworCXswLAkwfSwKKwl7MSwJMH0sCisJezIsCTB9LAorCXszLAkwfSwKKwl7NCwJMH0sCisJezAsCUNQVUZSRVFfVEFCTEVfRU5EfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZnJlcV9hdHRyICpwYXNfY3B1X2ZyZXFzX2F0dHJbXSA9IHsKKwkmY3B1ZnJlcV9mcmVxX2F0dHJfc2NhbGluZ19hdmFpbGFibGVfZnJlcXMsCisJTlVMTCwKK307CisKKy8qCisgKiBoYXJkd2FyZSBzcGVjaWZpYyBmdW5jdGlvbnMKKyAqLworCitzdGF0aWMgaW50IGdldF9hc3RhdGVfZnJlcShpbnQgYXN0YXRlKQoreworCXUzMiByZXQ7CisJcmV0ID0gaW5fbGUzMihzZGNwd3JfbWFwYmFzZSArIFNEQ1BXUl9DRkdBMF9SRUcgKyAoYXN0YXRlICogMHgxMCkpOworCisJcmV0dXJuIHJldCAmIDB4M2Y7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2N1cl9hc3RhdGUoaW50IGNwdSkKK3sKKwl1MzIgcmV0OworCisJcmV0ID0gaW5fbGUzMihzZGNwd3JfbWFwYmFzZSArIFNEQ1BXUl9QV1NUMF9SRUcpOworCXJldCA9IChyZXQgPj4gKGNwdSAqIDQpKSAmIDB4NzsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2dpem1vX2xhdGVuY3kodm9pZCkKK3sKKwl1MzIgZ2l6dGltZSwgcmV0OworCisJZ2l6dGltZSA9IGluX2xlMzIoc2RjcHdyX21hcGJhc2UgKyBTRENQV1JfR0laVElNRV9SRUcpOworCisJLyoganVzdCBwcm92aWRlIHRoZSB1cHBlciBib3VuZCAqLworCWlmIChnaXp0aW1lICYgU0RDUFdSX0dJWlRJTUVfR1IpCisJCXJldCA9IChnaXp0aW1lICYgU0RDUFdSX0dJWlRJTUVfTE9OR0xPQ0spICogMTI4MDAwOworCWVsc2UKKwkJcmV0ID0gKGdpenRpbWUgJiBTRENQV1JfR0laVElNRV9MT05HTE9DSykgKiAxMDAwOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgc2V0X2FzdGF0ZShpbnQgY3B1LCB1bnNpZ25lZCBpbnQgYXN0YXRlKQoreworCXU2NCBmbGFnczsKKworCS8qIFJldHVybiBpZiBjYWxsZWQgYmVmb3JlIGluaXQgaGFzIHJ1biAqLworCWlmICh1bmxpa2VseSghc2RjYXNyX21hcGJhc2UpKQorCQlyZXR1cm47CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwlvdXRfbGUzMihzZGNhc3JfbWFwYmFzZSArIFNEQ0FTUl9SRUcgKyBTRENBU1JfUkVHX1NUUklERSpjcHUsIGFzdGF0ZSk7CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKK3ZvaWQgcmVzdG9yZV9hc3RhdGUoaW50IGNwdSkKK3sKKwlzZXRfYXN0YXRlKGNwdSwgY3VycmVudF9hc3RhdGUpOworfQorCisvKgorICogY3B1ZnJlcSBmdW5jdGlvbnMKKyAqLworCitzdGF0aWMgaW50IHBhc19jcHVmcmVxX2NwdV9pbml0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQoreworCWNvbnN0IHUzMiAqbWF4X2ZyZXFwOworCXUzMiBtYXhfZnJlcTsKKwlpbnQgaSwgY3VyX2FzdGF0ZTsKKwlzdHJ1Y3QgcmVzb3VyY2UgcmVzOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqY3B1LCAqZG47CisJaW50IGVyciA9IC1FTk9ERVY7CisKKwljcHUgPSBvZl9nZXRfY3B1X25vZGUocG9saWN5LT5jcHUsIE5VTEwpOworCisJaWYgKCFjcHUpCisJCWdvdG8gb3V0OworCisJZG4gPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShOVUxMLCAic2RjIiwgIjE2ODJtLXNkYyIpOworCWlmICghZG4pCisJCWdvdG8gb3V0OworCWVyciA9IG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UoZG4sIDAsICZyZXMpOworCW9mX25vZGVfcHV0KGRuKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKwlzZGNhc3JfbWFwYmFzZSA9IGlvcmVtYXAocmVzLnN0YXJ0ICsgU0RDQVNSX09GRlNFVCwgMHgyMDAwKTsKKwlpZiAoIXNkY2Fzcl9tYXBiYXNlKSB7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCWRuID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgImdpem1vIiwgIjE2ODJtLWdpem1vIik7CisJaWYgKCFkbikgeworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIG91dF91bm1hcF9zZGNhc3I7CisJfQorCWVyciA9IG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UoZG4sIDAsICZyZXMpOworCW9mX25vZGVfcHV0KGRuKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF91bm1hcF9zZGNhc3I7CisJc2RjcHdyX21hcGJhc2UgPSBpb3JlbWFwKHJlcy5zdGFydCwgMHgxMDAwKTsKKwlpZiAoIXNkY3B3cl9tYXBiYXNlKSB7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X3VubWFwX3NkY2FzcjsKKwl9CisKKwlwcl9kZWJ1ZygiaW5pdCBjcHVmcmVxIG9uIENQVSAlZFxuIiwgcG9saWN5LT5jcHUpOworCisJbWF4X2ZyZXFwID0gb2ZfZ2V0X3Byb3BlcnR5KGNwdSwgImNsb2NrLWZyZXF1ZW5jeSIsIE5VTEwpOworCWlmICghbWF4X2ZyZXFwKSB7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X3VubWFwX3NkY3B3cjsKKwl9CisKKwkvKiB3ZSBuZWVkIHRoZSBmcmVxIGluIGtIeiAqLworCW1heF9mcmVxID0gKm1heF9mcmVxcCAvIDEwMDA7CisKKwlwcl9kZWJ1ZygibWF4IGNsb2NrLWZyZXF1ZW5jeSBpcyBhdCAldSBrSHpcbiIsIG1heF9mcmVxKTsKKwlwcl9kZWJ1ZygiaW5pdGlhbGl6aW5nIGZyZXF1ZW5jeSB0YWJsZVxuIik7CisKKwkvKiBpbml0aWFsaXplIGZyZXF1ZW5jeSB0YWJsZSAqLworCWZvciAoaT0wOyBwYXNfZnJlcXNbaV0uZnJlcXVlbmN5IT1DUFVGUkVRX1RBQkxFX0VORDsgaSsrKSB7CisJCXBhc19mcmVxc1tpXS5mcmVxdWVuY3kgPSBnZXRfYXN0YXRlX2ZyZXEocGFzX2ZyZXFzW2ldLmluZGV4KSAqIDEwMDAwMDsKKwkJcHJfZGVidWcoIiVkOiAlZFxuIiwgaSwgcGFzX2ZyZXFzW2ldLmZyZXF1ZW5jeSk7CisJfQorCisJcG9saWN5LT5nb3Zlcm5vciA9IENQVUZSRVFfREVGQVVMVF9HT1ZFUk5PUjsKKworCXBvbGljeS0+Y3B1aW5mby50cmFuc2l0aW9uX2xhdGVuY3kgPSBnZXRfZ2l6bW9fbGF0ZW5jeSgpOworCisJY3VyX2FzdGF0ZSA9IGdldF9jdXJfYXN0YXRlKHBvbGljeS0+Y3B1KTsKKwlwcl9kZWJ1ZygiY3VycmVudCBhc3RhdGUgaXMgYXQgJWRcbiIsY3VyX2FzdGF0ZSk7CisKKwlwb2xpY3ktPmN1ciA9IHBhc19mcmVxc1tjdXJfYXN0YXRlXS5mcmVxdWVuY3k7CisJcG9saWN5LT5jcHVzID0gY3B1X29ubGluZV9tYXA7CisKKwljcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV9nZXRfYXR0cihwYXNfZnJlcXMsIHBvbGljeS0+Y3B1KTsKKworCS8qIHRoaXMgZW5zdXJlcyB0aGF0IHBvbGljeS0+Y3B1aW5mb19taW4gYW5kIHBvbGljeS0+Y3B1aW5mb19tYXgKKwkgKiBhcmUgc2V0IGNvcnJlY3RseQorCSAqLworCXJldHVybiBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV9jcHVpbmZvKHBvbGljeSwgcGFzX2ZyZXFzKTsKKworb3V0X3VubWFwX3NkY3B3cjoKKwlpb3VubWFwKHNkY3B3cl9tYXBiYXNlKTsKKworb3V0X3VubWFwX3NkY2FzcjoKKwlpb3VubWFwKHNkY2Fzcl9tYXBiYXNlKTsKK291dDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHBhc19jcHVmcmVxX2NwdV9leGl0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQoreworCWlmIChzZGNhc3JfbWFwYmFzZSkKKwkJaW91bm1hcChzZGNhc3JfbWFwYmFzZSk7CisJaWYgKHNkY3B3cl9tYXBiYXNlKQorCQlpb3VubWFwKHNkY3B3cl9tYXBiYXNlKTsKKworCWNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3B1dF9hdHRyKHBvbGljeS0+Y3B1KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYXNfY3B1ZnJlcV92ZXJpZnkoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCit7CisJcmV0dXJuIGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3ZlcmlmeShwb2xpY3ksIHBhc19mcmVxcyk7Cit9CisKK3N0YXRpYyBpbnQgcGFzX2NwdWZyZXFfdGFyZ2V0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5LAorCQkJICAgICAgdW5zaWduZWQgaW50IHRhcmdldF9mcmVxLAorCQkJICAgICAgdW5zaWduZWQgaW50IHJlbGF0aW9uKQoreworCXN0cnVjdCBjcHVmcmVxX2ZyZXFzIGZyZXFzOworCWludCBwYXNfYXN0YXRlX25ldzsKKwlpbnQgaTsKKworCWNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3RhcmdldChwb2xpY3ksCisJCQkJICAgICAgIHBhc19mcmVxcywKKwkJCQkgICAgICAgdGFyZ2V0X2ZyZXEsCisJCQkJICAgICAgIHJlbGF0aW9uLAorCQkJCSAgICAgICAmcGFzX2FzdGF0ZV9uZXcpOworCisJZnJlcXMub2xkID0gcG9saWN5LT5jdXI7CisJZnJlcXMubmV3ID0gcGFzX2ZyZXFzW3Bhc19hc3RhdGVfbmV3XS5mcmVxdWVuY3k7CisJZnJlcXMuY3B1ID0gcG9saWN5LT5jcHU7CisKKwltdXRleF9sb2NrKCZwYXNfc3dpdGNoX211dGV4KTsKKwljcHVmcmVxX25vdGlmeV90cmFuc2l0aW9uKCZmcmVxcywgQ1BVRlJFUV9QUkVDSEFOR0UpOworCisJcHJfZGVidWcoInNldHRpbmcgZnJlcXVlbmN5IGZvciBjcHUgJWQgdG8gJWQga0h6LCAxLyVkIG9mIG1heCBmcmVxdWVuY3lcbiIsCisJCSBwb2xpY3ktPmNwdSwKKwkJIHBhc19mcmVxc1twYXNfYXN0YXRlX25ld10uZnJlcXVlbmN5LAorCQkgcGFzX2ZyZXFzW3Bhc19hc3RhdGVfbmV3XS5pbmRleCk7CisKKwljdXJyZW50X2FzdGF0ZSA9IHBhc19hc3RhdGVfbmV3OworCisJZm9yX2VhY2hfb25saW5lX2NwdShpKQorCQlzZXRfYXN0YXRlKGksIHBhc19hc3RhdGVfbmV3KTsKKworCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmZyZXFzLCBDUFVGUkVRX1BPU1RDSEFOR0UpOworCW11dGV4X3VubG9jaygmcGFzX3N3aXRjaF9tdXRleCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBjcHVmcmVxX2RyaXZlciBwYXNfY3B1ZnJlcV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gInBhcy1jcHVmcmVxIiwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmZsYWdzCQk9IENQVUZSRVFfQ09OU1RfTE9PUFMsCisJLmluaXQJCT0gcGFzX2NwdWZyZXFfY3B1X2luaXQsCisJLmV4aXQJCT0gcGFzX2NwdWZyZXFfY3B1X2V4aXQsCisJLnZlcmlmeQkJPSBwYXNfY3B1ZnJlcV92ZXJpZnksCisJLnRhcmdldAkJPSBwYXNfY3B1ZnJlcV90YXJnZXQsCisJLmF0dHIJCT0gcGFzX2NwdV9mcmVxc19hdHRyLAorfTsKKworLyoKKyAqIG1vZHVsZSBpbml0IGFuZCBkZXN0b3kKKyAqLworCitzdGF0aWMgaW50IF9faW5pdCBwYXNfY3B1ZnJlcV9pbml0KHZvaWQpCit7CisJaWYgKCFtYWNoaW5lX2lzX2NvbXBhdGlibGUoIlBBNlQtMTY4Mk0iKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXR1cm4gY3B1ZnJlcV9yZWdpc3Rlcl9kcml2ZXIoJnBhc19jcHVmcmVxX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBwYXNfY3B1ZnJlcV9leGl0KHZvaWQpCit7CisJY3B1ZnJlcV91bnJlZ2lzdGVyX2RyaXZlcigmcGFzX2NwdWZyZXFfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQocGFzX2NwdWZyZXFfaW5pdCk7Cittb2R1bGVfZXhpdChwYXNfY3B1ZnJlcV9leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiRWdvciBNYXJ0b3ZldHNreSA8ZWdvckBwYXNlbWkuY29tPiwgT2xvZiBKb2hhbnNzb24gPG9sb2ZAbGl4b20ubmV0PiIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvZ3Bpb19tZGlvLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9ncGlvX21kaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTFhMzM1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvZ3Bpb19tZGlvLmMKQEAgLTAsMCArMSwzMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwNyBQQSBTZW1pLCBJbmMKKyAqCisgKiBBdXRob3I6IE9sb2YgSm9oYW5zc29uLCBQQSBTZW1pCisgKgorICogTWFpbnRhaW5lZCBieTogT2xvZiBKb2hhbnNzb24gPG9sb2ZAbGl4b20ubmV0PgorICoKKyAqIEJhc2VkIG9uIGRyaXZlcnMvbmV0L2ZzX2VuZXQvbWlpLWJpdGJhbmcuYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9waHkuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxhc20vb2ZfcGxhdGZvcm0uaD4KKworI2RlZmluZSBERUxBWSAxCisKK3N0YXRpYyB2b2lkIF9faW9tZW0gKmdwaW9fcmVnczsKKworc3RydWN0IGdwaW9fcHJpdiB7CisJaW50IG1kY19waW47CisJaW50IG1kaW9fcGluOworfTsKKworI2RlZmluZSBNRENfUElOKGJ1cykJKCgoc3RydWN0IGdwaW9fcHJpdiAqKWJ1cy0+cHJpdiktPm1kY19waW4pCisjZGVmaW5lIE1ESU9fUElOKGJ1cykJKCgoc3RydWN0IGdwaW9fcHJpdiAqKWJ1cy0+cHJpdiktPm1kaW9fcGluKQorCitzdGF0aWMgaW5saW5lIHZvaWQgbWRpb19sbyhzdHJ1Y3QgbWlpX2J1cyAqYnVzKQoreworCW91dF9sZTMyKGdwaW9fcmVncysweDEwLCAxIDw8IE1ESU9fUElOKGJ1cykpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbWRpb19oaShzdHJ1Y3QgbWlpX2J1cyAqYnVzKQoreworCW91dF9sZTMyKGdwaW9fcmVncywgMSA8PCBNRElPX1BJTihidXMpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1kY19sbyhzdHJ1Y3QgbWlpX2J1cyAqYnVzKQoreworCW91dF9sZTMyKGdwaW9fcmVncysweDEwLCAxIDw8IE1EQ19QSU4oYnVzKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtZGNfaGkoc3RydWN0IG1paV9idXMgKmJ1cykKK3sKKwlvdXRfbGUzMihncGlvX3JlZ3MsIDEgPDwgTURDX1BJTihidXMpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1kaW9fYWN0aXZlKHN0cnVjdCBtaWlfYnVzICpidXMpCit7CisJb3V0X2xlMzIoZ3Bpb19yZWdzKzB4MjAsICgxIDw8IE1EQ19QSU4oYnVzKSkgfCAoMSA8PCBNRElPX1BJTihidXMpKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtZGlvX3RyaXN0YXRlKHN0cnVjdCBtaWlfYnVzICpidXMpCit7CisJb3V0X2xlMzIoZ3Bpb19yZWdzKzB4MzAsICgxIDw8IE1ESU9fUElOKGJ1cykpKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbWRpb19yZWFkKHN0cnVjdCBtaWlfYnVzICpidXMpCit7CisJcmV0dXJuICEhKGluX2xlMzIoZ3Bpb19yZWdzKzB4NDApICYgKDEgPDwgTURJT19QSU4oYnVzKSkpOworfQorCitzdGF0aWMgdm9pZCBjbG9ja19vdXQoc3RydWN0IG1paV9idXMgKmJ1cywgaW50IGJpdCkKK3sKKwlpZiAoYml0KQorCQltZGlvX2hpKGJ1cyk7CisJZWxzZQorCQltZGlvX2xvKGJ1cyk7CisJdWRlbGF5KERFTEFZKTsKKwltZGNfaGkoYnVzKTsKKwl1ZGVsYXkoREVMQVkpOworCW1kY19sbyhidXMpOworfQorCisvKiBVdGlsaXR5IHRvIHNlbmQgdGhlIHByZWFtYmxlLCBhZGRyZXNzLCBhbmQgcmVnaXN0ZXIgKGNvbW1vbiB0byByZWFkIGFuZCB3cml0ZSkuICovCitzdGF0aWMgdm9pZCBiaXRiYW5nX3ByZShzdHJ1Y3QgbWlpX2J1cyAqYnVzLCBpbnQgcmVhZCwgdTggYWRkciwgdTggcmVnKQoreworCWludCBpOworCisJLyogQ0ZFIHVzZXMgYSByZWFsbHkgbG9uZyBwcmVhbWJsZSAoNDAgYml0cykuIFdlJ2xsIGRvIHRoZSBzYW1lLiAqLworCW1kaW9fYWN0aXZlKGJ1cyk7CisJZm9yIChpID0gMDsgaSA8IDQwOyBpKyspIHsKKwkJY2xvY2tfb3V0KGJ1cywgMSk7CisJfQorCisJLyogc2VuZCB0aGUgc3RhcnQgYml0ICgwMSkgYW5kIHRoZSByZWFkIG9wY29kZSAoMTApIG9yIHdyaXRlICgxMCkgKi8KKwljbG9ja19vdXQoYnVzLCAwKTsKKwljbG9ja19vdXQoYnVzLCAxKTsKKworCWNsb2NrX291dChidXMsIHJlYWQpOworCWNsb2NrX291dChidXMsICFyZWFkKTsKKworCS8qIHNlbmQgdGhlIFBIWSBhZGRyZXNzICovCisJZm9yIChpID0gMDsgaSA8IDU7IGkrKykgeworCQljbG9ja19vdXQoYnVzLCAoYWRkciAmIDB4MTApICE9IDApOworCQlhZGRyIDw8PSAxOworCX0KKworCS8qIHNlbmQgdGhlIHJlZ2lzdGVyIGFkZHJlc3MgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKSB7CisJCWNsb2NrX291dChidXMsIChyZWcgJiAweDEwKSAhPSAwKTsKKwkJcmVnIDw8PSAxOworCX0KK30KKworc3RhdGljIGludCBncGlvX21kaW9fcmVhZChzdHJ1Y3QgbWlpX2J1cyAqYnVzLCBpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24pCit7CisJdTE2IHJkcmVnOworCWludCByZXQsIGk7CisJdTggYWRkciA9IHBoeV9pZCAmIDB4ZmY7CisJdTggcmVnID0gbG9jYXRpb24gJiAweGZmOworCisJYml0YmFuZ19wcmUoYnVzLCAxLCBhZGRyLCByZWcpOworCisJLyogdHJpLXN0YXRlIG91ciBNRElPIEkvTyBwaW4gc28gd2UgY2FuIHJlYWQgKi8KKwltZGlvX3RyaXN0YXRlKGJ1cyk7CisJdWRlbGF5KERFTEFZKTsKKwltZGNfaGkoYnVzKTsKKwl1ZGVsYXkoREVMQVkpOworCW1kY19sbyhidXMpOworCisJLyogcmVhZCAxNiBiaXRzIG9mIHJlZ2lzdGVyIGRhdGEsIE1TQiBmaXJzdCAqLworCXJkcmVnID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQltZGNfbG8oYnVzKTsKKwkJdWRlbGF5KERFTEFZKTsKKwkJbWRjX2hpKGJ1cyk7CisJCXVkZWxheShERUxBWSk7CisJCW1kY19sbyhidXMpOworCQl1ZGVsYXkoREVMQVkpOworCQlyZHJlZyA8PD0gMTsKKwkJcmRyZWcgfD0gbWRpb19yZWFkKGJ1cyk7CisJfQorCisJbWRjX2hpKGJ1cyk7CisJdWRlbGF5KERFTEFZKTsKKwltZGNfbG8oYnVzKTsKKwl1ZGVsYXkoREVMQVkpOworCisJcmV0ID0gcmRyZWc7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGdwaW9fbWRpb193cml0ZShzdHJ1Y3QgbWlpX2J1cyAqYnVzLCBpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24sIHUxNiB2YWwpCit7CisJaW50IGk7CisKKwl1OCBhZGRyID0gcGh5X2lkICYgMHhmZjsKKwl1OCByZWcgPSBsb2NhdGlvbiAmIDB4ZmY7CisJdTE2IHZhbHVlID0gdmFsICYgMHhmZmZmOworCisJYml0YmFuZ19wcmUoYnVzLCAwLCBhZGRyLCByZWcpOworCisJLyogc2VuZCB0aGUgdHVybmFyb3VuZCAoMTApICovCisJbWRjX2xvKGJ1cyk7CisJbWRpb19oaShidXMpOworCXVkZWxheShERUxBWSk7CisJbWRjX2hpKGJ1cyk7CisJdWRlbGF5KERFTEFZKTsKKwltZGNfbG8oYnVzKTsKKwltZGlvX2xvKGJ1cyk7CisJdWRlbGF5KERFTEFZKTsKKwltZGNfaGkoYnVzKTsKKwl1ZGVsYXkoREVMQVkpOworCisJLyogd3JpdGUgMTYgYml0cyBvZiByZWdpc3RlciBkYXRhLCBNU0IgZmlyc3QgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQltZGNfbG8oYnVzKTsKKwkJaWYgKHZhbHVlICYgMHg4MDAwKQorCQkJbWRpb19oaShidXMpOworCQllbHNlCisJCQltZGlvX2xvKGJ1cyk7CisJCXVkZWxheShERUxBWSk7CisJCW1kY19oaShidXMpOworCQl1ZGVsYXkoREVMQVkpOworCQl2YWx1ZSA8PD0gMTsKKwl9CisKKwkvKgorCSAqIFRyaS1zdGF0ZSB0aGUgTURJTyBsaW5lLgorCSAqLworCW1kaW9fdHJpc3RhdGUoYnVzKTsKKwltZGNfbG8oYnVzKTsKKwl1ZGVsYXkoREVMQVkpOworCW1kY19oaShidXMpOworCXVkZWxheShERUxBWSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ3Bpb19tZGlvX3Jlc2V0KHN0cnVjdCBtaWlfYnVzICpidXMpCit7CisJLypub3RoaW5nIGhlcmUgLSBkdW5ubyBob3cgdG8gcmVzZXQgaXQqLworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGdwaW9fbWRpb19wcm9iZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvZmRldiwKKwkJCQkgICAgIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZvZmRldi0+ZGV2OworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBvZmRldi0+bm9kZTsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmdwaW9fbnA7CisJc3RydWN0IG1paV9idXMgKm5ld19idXM7CisJc3RydWN0IHJlc291cmNlIHJlczsKKwlzdHJ1Y3QgZ3Bpb19wcml2ICpwcml2OworCWNvbnN0IHVuc2lnbmVkIGludCAqcHJvcDsKKwlpbnQgZXJyID0gMDsKKwlpbnQgaTsKKworCWdwaW9fbnAgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShOVUxMLCAiZ3BpbyIsICIxNjgybS1ncGlvIik7CisKKwlpZiAoIWdwaW9fbnApCisJCXJldHVybiAtRU5PREVWOworCisJZXJyID0gb2ZfYWRkcmVzc190b19yZXNvdXJjZShncGlvX25wLCAwLCAmcmVzKTsKKwlvZl9ub2RlX3B1dChncGlvX25wKTsKKworCWlmIChlcnIpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFncGlvX3JlZ3MpCisJCWdwaW9fcmVncyA9IGlvcmVtYXAocmVzLnN0YXJ0LCAweDEwMCk7CisKKwlpZiAoIWdwaW9fcmVncykKKwkJcmV0dXJuIC1FUEVSTTsKKworCXByaXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZ3Bpb19wcml2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKHByaXYgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwluZXdfYnVzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1paV9idXMpLCBHRlBfS0VSTkVMKTsKKworCWlmIChuZXdfYnVzID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJbmV3X2J1cy0+bmFtZSA9ICJwYXNlbWkgZ3BpbyBtZGlvIGJ1cyIsCisJbmV3X2J1cy0+cmVhZCA9ICZncGlvX21kaW9fcmVhZCwKKwluZXdfYnVzLT53cml0ZSA9ICZncGlvX21kaW9fd3JpdGUsCisJbmV3X2J1cy0+cmVzZXQgPSAmZ3Bpb19tZGlvX3Jlc2V0LAorCisJcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShucCwgInJlZyIsIE5VTEwpOworCW5ld19idXMtPmlkID0gKnByb3A7CisJbmV3X2J1cy0+cHJpdiA9IHByaXY7CisKKwluZXdfYnVzLT5waHlfbWFzayA9IDA7CisKKwluZXdfYnVzLT5pcnEgPSBrbWFsbG9jKHNpemVvZihpbnQpKlBIWV9NQVhfQUREUiwgR0ZQX0tFUk5FTCk7CisJZm9yKGkgPSAwOyBpIDwgUEhZX01BWF9BRERSOyArK2kpCisJCW5ld19idXMtPmlycVtpXSA9IGlycV9jcmVhdGVfbWFwcGluZyhOVUxMLCAxMCk7CisKKworCXByb3AgPSBvZl9nZXRfcHJvcGVydHkobnAsICJtZGMtcGluIiwgTlVMTCk7CisJcHJpdi0+bWRjX3BpbiA9ICpwcm9wOworCisJcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShucCwgIm1kaW8tcGluIiwgTlVMTCk7CisJcHJpdi0+bWRpb19waW4gPSAqcHJvcDsKKworCW5ld19idXMtPmRldiA9IGRldjsKKwlkZXZfc2V0X2RydmRhdGEoZGV2LCBuZXdfYnVzKTsKKworCWVyciA9IG1kaW9idXNfcmVnaXN0ZXIobmV3X2J1cyk7CisKKwlpZiAoMCAhPSBlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogQ2Fubm90IHJlZ2lzdGVyIGFzIE1ESU8gYnVzLCBlcnIgJWRcbiIsCisJCQkJbmV3X2J1cy0+bmFtZSwgZXJyKTsKKwkJZ290byBidXNfcmVnaXN0ZXJfZmFpbDsKKwl9CisKKwlyZXR1cm4gMDsKKworYnVzX3JlZ2lzdGVyX2ZhaWw6CisJa2ZyZWUobmV3X2J1cyk7CisKKwlyZXR1cm4gZXJyOworfQorCisKK3N0YXRpYyBpbnQgZ3Bpb19tZGlvX3JlbW92ZShzdHJ1Y3Qgb2ZfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG1paV9idXMgKmJ1cyA9IGRldl9nZXRfZHJ2ZGF0YSgmZGV2LT5kZXYpOworCisJbWRpb2J1c191bnJlZ2lzdGVyKGJ1cyk7CisKKwlkZXZfc2V0X2RydmRhdGEoJmRldi0+ZGV2LCBOVUxMKTsKKworCWtmcmVlKGJ1cy0+cHJpdik7CisJYnVzLT5wcml2ID0gTlVMTDsKKwlrZnJlZShidXMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGdwaW9fbWRpb19tYXRjaFtdID0KK3sKKwl7CisJCS5jb21wYXRpYmxlICAgICAgPSAiZ3Bpby1tZGlvIiwKKwl9LAorCXt9LAorfTsKKworc3RhdGljIHN0cnVjdCBvZl9wbGF0Zm9ybV9kcml2ZXIgZ3Bpb19tZGlvX2RyaXZlciA9Cit7CisJLm5hbWUJCT0gImdwaW8tbWRpby1iaXRiYW5nIiwKKwkubWF0Y2hfdGFibGUJPSBncGlvX21kaW9fbWF0Y2gsCisJLnByb2JlCQk9IGdwaW9fbWRpb19wcm9iZSwKKwkucmVtb3ZlCQk9IGdwaW9fbWRpb19yZW1vdmUsCit9OworCitpbnQgZ3Bpb19tZGlvX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gb2ZfcmVnaXN0ZXJfcGxhdGZvcm1fZHJpdmVyKCZncGlvX21kaW9fZHJpdmVyKTsKK30KKwordm9pZCBncGlvX21kaW9fZXhpdCh2b2lkKQoreworCW9mX3VucmVnaXN0ZXJfcGxhdGZvcm1fZHJpdmVyKCZncGlvX21kaW9fZHJpdmVyKTsKK30KK2RldmljZV9pbml0Y2FsbChncGlvX21kaW9faW5pdCk7CisKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL2lkbGUuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL2lkbGUuYwppbmRleCAxY2EzZmYzLi41OTg1Y2UwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9pZGxlLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvaWRsZS5jCkBAIC02MSw2ICs2MSwxMCBAQAogCQkvKiBkbyBzeXN0ZW0gcmVzZXQgKi8KIAkJcmV0dXJuIDA7CiAJfQorCisJLyogU2V0IGhpZ2hlciBhc3RhdGUgc2luY2Ugd2UgY29tZSBvdXQgb2YgcG93ZXIgc2F2aW5ncyBhdCAwICovCisJcmVzdG9yZV9hc3RhdGUoaGFyZF9zbXBfcHJvY2Vzc29yX2lkKCkpOworCiAJLyogZXZlcnl0aGluZyBoYW5kbGVkICovCiAJcmVncy0+bXNyIHw9IE1TUl9SSTsKIAlyZXR1cm4gMTsKQEAgLTY4LDYgKzcyLDExIEBACiAKIHZvaWQgX19pbml0IHBhc2VtaV9pZGxlX2luaXQodm9pZCkKIHsKKyNpZm5kZWYgQ09ORklHX1BQQ19QQVNFTUlfQ1BVRlJFUQorCXByaW50ayhLRVJOX1dBUk5JTkcgIk5vIGNwdWZyZXEgZHJpdmVyLCBwb3dlcnNhdmluZ3MgbW9kZXMgZGlzYWJsZWRcbiIpOworCWN1cnJlbnRfbW9kZSA9IDA7CisjZW5kaWYKKwogCXBwY19tZC5zeXN0ZW1fcmVzZXRfZXhjZXB0aW9uID0gcGFzZW1pX3N5c3RlbV9yZXNldF9leGNlcHRpb247CiAJcHBjX21kLnBvd2VyX3NhdmUgPSBtb2Rlc1tjdXJyZW50X21vZGVdLmVudHJ5OwogCXByaW50ayhLRVJOX0lORk8gIlVzaW5nIFBBNlQgaWRsZSBsb29wICglcylcbiIsIG1vZGVzW2N1cnJlbnRfbW9kZV0ubmFtZSk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9pb21tdS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvaW9tbXUuYwppbmRleCA3MWRiZjFhLi45NWZhNmE3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9pb21tdS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL2lvbW11LmMKQEAgLTI0OSwxMyArMjQ5LDEzIEBACiAJaW9tbXVfb2ZmID0gMTsKICNlbHNlCiAJaW9tbXVfb2ZmID0gb2ZfY2hvc2VuICYmCi0JCQlnZXRfcHJvcGVydHkob2ZfY2hvc2VuLCAibGludXgsaW9tbXUtb2ZmIiwgTlVMTCk7CisJCQlvZl9nZXRfcHJvcGVydHkob2ZfY2hvc2VuLCAibGludXgsaW9tbXUtb2ZmIiwgTlVMTCk7CiAjZW5kaWYKIAlpZiAoaW9tbXVfb2ZmKSB7CiAJCS8qIERpcmVjdCBJL08sIElPTU1VIG9mZiAqLwogCQlwcGNfbWQucGNpX2RtYV9kZXZfc2V0dXAgPSBwY2lfZG1hX2Rldl9zZXR1cF9udWxsOwogCQlwcGNfbWQucGNpX2RtYV9idXNfc2V0dXAgPSBwY2lfZG1hX2J1c19zZXR1cF9udWxsOwotCQlwY2lfZG1hX29wcyA9ICZkbWFfZGlyZWN0X29wczsKKwkJc2V0X3BjaV9kbWFfb3BzKCZkbWFfZGlyZWN0X29wcyk7CiAKIAkJcmV0dXJuOwogCX0KQEAgLTI2Niw3ICsyNjYsNyBAQAogCXBwY19tZC5wY2lfZG1hX2J1c19zZXR1cCA9IHBjaV9kbWFfYnVzX3NldHVwX3Bhc2VtaTsKIAlwcGNfbWQudGNlX2J1aWxkID0gaW9ibWFwX2J1aWxkOwogCXBwY19tZC50Y2VfZnJlZSAgPSBpb2JtYXBfZnJlZTsKLQlwY2lfZG1hX29wcyA9ICZkbWFfaW9tbXVfb3BzOworCXNldF9wY2lfZG1hX29wcygmZG1hX2lvbW11X29wcyk7CiB9CiAKIHZvaWQgX19pbml0IGFsbG9jX2lvYm1hcF9sMih2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvcGFzZW1pLmggYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9wYXNlbWkuaAppbmRleCAyZDM5MjdlLi5iZTg0OTU0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9wYXNlbWkuaAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9wYXNlbWkuaApAQCAtMTQsNiArMTQsMTQgQEAKIGV4dGVybiB2b2lkIGlkbGVfc3Bpbih2b2lkKTsKIGV4dGVybiB2b2lkIGlkbGVfZG96ZSh2b2lkKTsKIAorLyogUmVzdG9yZSBhc3RhdGUgdG8gbGFzdCBzZXQgKi8KKyNpZmRlZiBDT05GSUdfUFBDX1BBU0VNSV9DUFVGUkVRCitleHRlcm4gdm9pZCByZXN0b3JlX2FzdGF0ZShpbnQgY3B1KTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgcmVzdG9yZV9hc3RhdGUoaW50IGNwdSkKK3sKK30KKyNlbmRpZgogCiAKICNlbmRpZiAvKiBfUEFTRU1JX1BBU0VNSV9IICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9wY2kuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL3BjaS5jCmluZGV4IDdlY2IyYmEuLjA1NjI0M2QgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL3BjaS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL3BjaS5jCkBAIC0zMyw3ICszMywxNyBAQAogCiAjZGVmaW5lIFBBX1BYUF9DRkEoYnVzLCBkZXZmbiwgb2ZmKSAoKChidXMpIDw8IDIwKSB8ICgoZGV2Zm4pIDw8IDEyKSB8IChvZmYpKQogCi0jZGVmaW5lIENPTkZJR19PRkZTRVRfVkFMSUQob2ZmKSAoKG9mZikgPCA0MDk2KQorc3RhdGljIGlubGluZSBpbnQgcGFfcHhwX29mZnNldF92YWxpZCh1OCBidXMsIHU4IGRldmZuLCBpbnQgb2Zmc2V0KQoreworCS8qIERldmljZSAwIEZ1bmN0aW9uIDAgaXMgc3BlY2lhbDogSXQncyBjb25maWcgc3BhY2Ugc3BhbnMgZnVuY3Rpb24gMSBhcworCSAqIHdlbGwsIHNvIGFsbG93IGxhcmdlciBvZmZzZXQuIEl0J3MgcmVhbGx5IGEgdHdvLWZ1bmN0aW9uIGRldmljZSBidXQgdGhlCisJICogc2Vjb25kIGZ1bmN0aW9uIGRvZXMgbm90IHByb2JlLgorCSAqLworCWlmIChidXMgPT0gMCAmJiBkZXZmbiA9PSAwKQorCQlyZXR1cm4gb2Zmc2V0IDwgODE5MjsKKwllbHNlCisJCXJldHVybiBvZmZzZXQgPCA0MDk2OworfQogCiBzdGF0aWMgdm9pZCB2b2xhdGlsZSBfX2lvbWVtICpwYV9weHBfY2ZnX2FkZHIoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLAogCQkJCSAgICAgICB1OCBidXMsIHU4IGRldmZuLCBpbnQgb2Zmc2V0KQpAQCAtNTEsNyArNjEsNyBAQAogCWlmICghaG9zZSkKIAkJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKIAotCWlmICghQ09ORklHX09GRlNFVF9WQUxJRChvZmZzZXQpKQorCWlmICghcGFfcHhwX29mZnNldF92YWxpZChidXMtPm51bWJlciwgZGV2Zm4sIG9mZnNldCkpCiAJCXJldHVybiBQQ0lCSU9TX0JBRF9SRUdJU1RFUl9OVU1CRVI7CiAKIAlhZGRyID0gcGFfcHhwX2NmZ19hZGRyKGhvc2UsIGJ1cy0+bnVtYmVyLCBkZXZmbiwgb2Zmc2V0KTsKQEAgLTg1LDcgKzk1LDcgQEAKIAlpZiAoIWhvc2UpCiAJCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7CiAKLQlpZiAoIUNPTkZJR19PRkZTRVRfVkFMSUQob2Zmc2V0KSkKKwlpZiAoIXBhX3B4cF9vZmZzZXRfdmFsaWQoYnVzLT5udW1iZXIsIGRldmZuLCBvZmZzZXQpKQogCQlyZXR1cm4gUENJQklPU19CQURfUkVHSVNURVJfTlVNQkVSOwogCiAJYWRkciA9IHBhX3B4cF9jZmdfYWRkcihob3NlLCBidXMtPm51bWJlciwgZGV2Zm4sIG9mZnNldCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9zZXR1cC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvc2V0dXAuYwppbmRleCA0NDljZjFhLi5mODhmMGVjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9zZXR1cC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL3NldHVwLmMKQEAgLTM1LDYgKzM1LDcgQEAKICNpbmNsdWRlIDxhc20vbXBpYy5oPgogI2luY2x1ZGUgPGFzbS9zbXAuaD4KICNpbmNsdWRlIDxhc20vdGltZS5oPgorI2luY2x1ZGUgPGFzbS9vZl9wbGF0Zm9ybS5oPgogCiAjaW5jbHVkZSAicGFzZW1pLmgiCiAKQEAgLTEwMSwxMiArMTAyLDYgQEAKIAlwYXNlbWlfaWRsZV9pbml0KCk7CiB9CiAKLS8qIE5vIGxlZ2FjeSBJTyBvbiBvdXIgcGFydHMgKi8KLXN0YXRpYyBpbnQgcGFzX2NoZWNrX2xlZ2FjeV9pb3BvcnQodW5zaWduZWQgaW50IGJhc2Vwb3J0KQotewotCXJldHVybiAtRU5PREVWOwotfQotCiBzdGF0aWMgX19pbml0IHZvaWQgcGFzX2luaXRfSVJRKHZvaWQpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpucDsKQEAgLTEzNiw4ICsxMzEsOCBAQAogCiAJLyogRmluZCBhZGRyZXNzIGxpc3QgaW4gL3BsYXRmb3JtLW9wZW4tcGljICovCiAJcm9vdCA9IG9mX2ZpbmRfbm9kZV9ieV9wYXRoKCIvIik7Ci0JbmFkZHIgPSBwcm9tX25fYWRkcl9jZWxscyhyb290KTsKLQlvcHByb3AgPSBnZXRfcHJvcGVydHkocm9vdCwgInBsYXRmb3JtLW9wZW4tcGljIiwgJm9wcGxlbik7CisJbmFkZHIgPSBvZl9uX2FkZHJfY2VsbHMocm9vdCk7CisJb3Bwcm9wID0gb2ZfZ2V0X3Byb3BlcnR5KHJvb3QsICJwbGF0Zm9ybS1vcGVuLXBpYyIsICZvcHBsZW4pOwogCWlmICghb3Bwcm9wKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiTm8gcGxhdGZvcm0tb3Blbi1waWMgcHJvcGVydHkuXG4iKTsKIAkJb2Zfbm9kZV9wdXQocm9vdCk7CkBAIC0xNDcsNyArMTQyLDcgQEAKIAlwcmludGsoS0VSTl9ERUJVRyAiT3BlblBJQyBhZGRyOiAlbHhcbiIsIG9wZW5waWNfYWRkcik7CiAKIAltcGljID0gbXBpY19hbGxvYyhtcGljX25vZGUsIG9wZW5waWNfYWRkciwKLQkJCSAgTVBJQ19QUklNQVJZfE1QSUNfTEFSR0VfVkVDVE9SUywKKwkJCSAgTVBJQ19QUklNQVJZfE1QSUNfTEFSR0VfVkVDVE9SU3xNUElDX1dBTlRTX1JFU0VULAogCQkJICAwLCAwLCAiIFBBUy1PUElDICAiKTsKIAlCVUdfT04oIW1waWMpOwogCkBAIC0yMDksNiArMjA0LDIwIEBACiAJaW9tbXVfaW5pdF9lYXJseV9wYXNlbWkoKTsKIH0KIAorc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgcGFzZW1pX2J1c19pZHNbXSA9IHsKKwl7IC50eXBlID0gInNkYyIsIH0sCisJe30sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBwYXNlbWlfcHVibGlzaF9kZXZpY2VzKHZvaWQpCit7CisJLyogUHVibGlzaCBPRiBwbGF0Zm9ybSBkZXZpY2VzIGZvciBzb3V0aGJyaWRnZSBJT3MgKi8KKwlvZl9wbGF0Zm9ybV9idXNfcHJvYmUoTlVMTCwgcGFzZW1pX2J1c19pZHMsIE5VTEwpOworCisJcmV0dXJuIDA7Cit9CitkZXZpY2VfaW5pdGNhbGwocGFzZW1pX3B1Ymxpc2hfZGV2aWNlcyk7CisKIAogLyoKICAqIENhbGxlZCB2ZXJ5IGVhcmx5LCBNTVUgaXMgb2ZmLCBkZXZpY2UtdHJlZSBpc24ndCB1bmZsYXR0ZW5lZApAQCAtMjM3LDcgKzI0Niw2IEBACiAJLnJlc3RhcnQJCT0gcGFzX3Jlc3RhcnQsCiAJLmdldF9ib290X3RpbWUJCT0gcGFzX2dldF9ib290X3RpbWUsCiAJLmNhbGlicmF0ZV9kZWNyCQk9IGdlbmVyaWNfY2FsaWJyYXRlX2RlY3IsCi0JLmNoZWNrX2xlZ2FjeV9pb3BvcnQgICAgPSBwYXNfY2hlY2tfbGVnYWN5X2lvcG9ydCwKIAkucHJvZ3Jlc3MJCT0gcGFzX3Byb2dyZXNzLAogCS5tYWNoaW5lX2NoZWNrX2V4Y2VwdGlvbiA9IHBhc19tYWNoaW5lX2NoZWNrX2hhbmRsZXIsCiAJLnBjaV9pcnFfZml4dXAJCT0gcGFzX3BjaV9pcnFfZml4dXAsCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL0tjb25maWcgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI3YWZlNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvS2NvbmZpZwpAQCAtMCwwICsxLDIwIEBACitjb25maWcgUFBDX1BNQUMKKwlib29sICJBcHBsZSBQb3dlck1hYyBiYXNlZCBtYWNoaW5lcyIKKwlkZXBlbmRzIG9uIFBQQ19NVUxUSVBMQVRGT1JNCisJc2VsZWN0IE1QSUMKKwlzZWxlY3QgUFBDX0lORElSRUNUX1BDSSBpZiBQUEMzMgorCXNlbGVjdCBQUENfTVBDMTA2IGlmIFBQQzMyCisJc2VsZWN0IFBQQ19OQVRJVkUKKwlkZWZhdWx0IHkKKworY29uZmlnIFBQQ19QTUFDNjQKKwlib29sCisJZGVwZW5kcyBvbiBQUENfUE1BQyAmJiBQT1dFUjQKKwlzZWxlY3QgTVBJQworCXNlbGVjdCBVM19EQVJUCisJc2VsZWN0IE1QSUNfVTNfSFRfSVJRUworCXNlbGVjdCBHRU5FUklDX1RCU1lOQworCXNlbGVjdCBQUENfOTcwX05BUAorCWRlZmF1bHQgeQorCisKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvYmFja2xpZ2h0LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL2JhY2tsaWdodC5jCmluZGV4IGRlNzQ0MGUuLmQ2Nzk5NjQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvYmFja2xpZ2h0LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9iYWNrbGlnaHQuYwpAQCAtNTYsMTMgKzU2LDE2IEBACiAKIGludCBwbWFjX2hhc19iYWNrbGlnaHRfdHlwZShjb25zdCBjaGFyICp0eXBlKQogewotCXN0cnVjdCBkZXZpY2Vfbm9kZSogYmtfbm9kZSA9IGZpbmRfZGV2aWNlcygiYmFja2xpZ2h0Iik7CisJc3RydWN0IGRldmljZV9ub2RlKiBia19ub2RlID0gb2ZfZmluZF9ub2RlX2J5X25hbWUoTlVMTCwgImJhY2tsaWdodCIpOwogCiAJaWYgKGJrX25vZGUpIHsKLQkJY29uc3QgY2hhciAqcHJvcCA9IGdldF9wcm9wZXJ0eShia19ub2RlLAorCQljb25zdCBjaGFyICpwcm9wID0gb2ZfZ2V0X3Byb3BlcnR5KGJrX25vZGUsCiAJCQkJImJhY2tsaWdodC1jb250cm9sIiwgTlVMTCk7Ci0JCWlmIChwcm9wICYmIHN0cm5jbXAocHJvcCwgdHlwZSwgc3RybGVuKHR5cGUpKSA9PSAwKQorCQlpZiAocHJvcCAmJiBzdHJuY21wKHByb3AsIHR5cGUsIHN0cmxlbih0eXBlKSkgPT0gMCkgeworCQkJb2Zfbm9kZV9wdXQoYmtfbm9kZSk7CiAJCQlyZXR1cm4gMTsKKwkJfQorCQlvZl9ub2RlX3B1dChia19ub2RlKTsKIAl9CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvY3B1ZnJlcV8zMi5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9jcHVmcmVxXzMyLmMKaW5kZXggYzJiNmI0MTMuLjg5NDNhOTQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvY3B1ZnJlcV8zMi5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvY3B1ZnJlcV8zMi5jCkBAIC00MjEsNyArNDIxLDcgQEAKIAogc3RhdGljIHUzMiByZWFkX2dwaW8oc3RydWN0IGRldmljZV9ub2RlICpucCkKIHsKLQljb25zdCB1MzIgKnJlZyA9IGdldF9wcm9wZXJ0eShucCwgInJlZyIsIE5VTEwpOworCWNvbnN0IHUzMiAqcmVnID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAicmVnIiwgTlVMTCk7CiAJdTMyIG9mZnNldDsKIAogCWlmIChyZWcgPT0gTlVMTCkKQEAgLTUyMSwxMyArNTIxLDE0IEBACiAJCWludCBsZW5wLCByYzsKIAkJY29uc3QgdTMyICpmcmVxcywgKnJhdGlvOwogCi0JCWZyZXFzID0gZ2V0X3Byb3BlcnR5KGNwdW5vZGUsICJidXMtZnJlcXVlbmNpZXMiLCAmbGVucCk7CisJCWZyZXFzID0gb2ZfZ2V0X3Byb3BlcnR5KGNwdW5vZGUsICJidXMtZnJlcXVlbmNpZXMiLCAmbGVucCk7CiAJCWxlbnAgLz0gc2l6ZW9mKHUzMik7CiAJCWlmIChmcmVxcyA9PSBOVUxMIHx8IGxlbnAgIT0gMikgewogCQkJcHJpbnRrKEtFUk5fRVJSICJjcHVmcmVxOiBidXMtZnJlcXVlbmNpZXMgaW5jb3JyZWN0IG9yIG1pc3NpbmdcbiIpOwogCQkJcmV0dXJuIDE7CiAJCX0KLQkJcmF0aW8gPSBnZXRfcHJvcGVydHkoY3B1bm9kZSwgInByb2Nlc3Nvci10by1idXMtcmF0aW8qMiIsIE5VTEwpOworCQlyYXRpbyA9IG9mX2dldF9wcm9wZXJ0eShjcHVub2RlLCAicHJvY2Vzc29yLXRvLWJ1cy1yYXRpbyoyIiwKKwkJCQkJCU5VTEwpOwogCQlpZiAocmF0aW8gPT0gTlVMTCkgewogCQkJcHJpbnRrKEtFUk5fRVJSICJjcHVmcmVxOiBwcm9jZXNzb3ItdG8tYnVzLXJhdGlvKjIgbWlzc2luZ1xuIik7CiAJCQlyZXR1cm4gMTsKQEAgLTU2Miw3ICs1NjMsNyBAQAogCS8qIElmIHdlIHVzZSB0aGUgUE1VLCBsb29rIGZvciB0aGUgbWluICYgbWF4IGZyZXF1ZW5jaWVzIGluIHRoZQogCSAqIGRldmljZS10cmVlCiAJICovCi0JdmFsdWUgPSBnZXRfcHJvcGVydHkoY3B1bm9kZSwgIm1pbi1jbG9jay1mcmVxdWVuY3kiLCBOVUxMKTsKKwl2YWx1ZSA9IG9mX2dldF9wcm9wZXJ0eShjcHVub2RlLCAibWluLWNsb2NrLWZyZXF1ZW5jeSIsIE5VTEwpOwogCWlmICghdmFsdWUpCiAJCXJldHVybiAxOwogCWxvd19mcmVxID0gKCp2YWx1ZSkgLyAxMDAwOwpAQCAtNTcxLDcgKzU3Miw3IEBACiAJaWYgKGxvd19mcmVxIDwgMTAwMDAwKQogCQlsb3dfZnJlcSAqPSAxMDsKIAotCXZhbHVlID0gZ2V0X3Byb3BlcnR5KGNwdW5vZGUsICJtYXgtY2xvY2stZnJlcXVlbmN5IiwgTlVMTCk7CisJdmFsdWUgPSBvZl9nZXRfcHJvcGVydHkoY3B1bm9kZSwgIm1heC1jbG9jay1mcmVxdWVuY3kiLCBOVUxMKTsKIAlpZiAoIXZhbHVlKQogCQlyZXR1cm4gMTsKIAloaV9mcmVxID0gKCp2YWx1ZSkgLyAxMDAwOwpAQCAtNTg1LDcgKzU4Niw3IEBACiB7CiAJc3RydWN0IGRldmljZV9ub2RlICp2b2x0X2dwaW9fbnA7CiAKLQlpZiAoZ2V0X3Byb3BlcnR5KGNwdW5vZGUsICJkeW5hbWljLXBvd2VyLXN0ZXAiLCBOVUxMKSA9PSBOVUxMKQorCWlmIChvZl9nZXRfcHJvcGVydHkoY3B1bm9kZSwgImR5bmFtaWMtcG93ZXItc3RlcCIsIE5VTEwpID09IE5VTEwpCiAJCXJldHVybiAxOwogCiAJdm9sdF9ncGlvX25wID0gb2ZfZmluZF9ub2RlX2J5X25hbWUoTlVMTCwgImNwdS12Y29yZS1zZWxlY3QiKTsKQEAgLTYxNCwxMSArNjE1LDExIEBACiAJdTMyIHB2cjsKIAljb25zdCB1MzIgKnZhbHVlOwogCi0JaWYgKGdldF9wcm9wZXJ0eShjcHVub2RlLCAiZHluYW1pYy1wb3dlci1zdGVwIiwgTlVMTCkgPT0gTlVMTCkKKwlpZiAob2ZfZ2V0X3Byb3BlcnR5KGNwdW5vZGUsICJkeW5hbWljLXBvd2VyLXN0ZXAiLCBOVUxMKSA9PSBOVUxMKQogCQlyZXR1cm4gMTsKIAogCWhpX2ZyZXEgPSBjdXJfZnJlcTsKLQl2YWx1ZSA9IGdldF9wcm9wZXJ0eShjcHVub2RlLCAicmVkdWNlZC1jbG9jay1mcmVxdWVuY3kiLCBOVUxMKTsKKwl2YWx1ZSA9IG9mX2dldF9wcm9wZXJ0eShjcHVub2RlLCAicmVkdWNlZC1jbG9jay1mcmVxdWVuY3kiLCBOVUxMKTsKIAlpZiAoIXZhbHVlKQogCQlyZXR1cm4gMTsKIAlsb3dfZnJlcSA9ICgqdmFsdWUpIC8gMTAwMDsKQEAgLTY1NywxOSArNjU4LDE5IEBACiAJCXJldHVybiAwOwogCiAJLyogQXNzdW1lIG9ubHkgb25lIENQVSAqLwotCWNwdW5vZGUgPSBmaW5kX3R5cGVfZGV2aWNlcygiY3B1Iik7CisJY3B1bm9kZSA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKE5VTEwsICJjcHUiKTsKIAlpZiAoIWNwdW5vZGUpCiAJCWdvdG8gb3V0OwogCiAJLyogR2V0IGN1cnJlbnQgY3B1IGNsb2NrIGZyZXEgKi8KLQl2YWx1ZSA9IGdldF9wcm9wZXJ0eShjcHVub2RlLCAiY2xvY2stZnJlcXVlbmN5IiwgTlVMTCk7CisJdmFsdWUgPSBvZl9nZXRfcHJvcGVydHkoY3B1bm9kZSwgImNsb2NrLWZyZXF1ZW5jeSIsIE5VTEwpOwogCWlmICghdmFsdWUpCiAJCWdvdG8gb3V0OwogCWN1cl9mcmVxID0gKCp2YWx1ZSkgLyAxMDAwOwogCiAJLyogIENoZWNrIGZvciA3NDQ3QSBiYXNlZCBNYWNSSVNDMyAqLwogCWlmIChtYWNoaW5lX2lzX2NvbXBhdGlibGUoIk1hY1JJU0MzIikgJiYKLQkgICAgZ2V0X3Byb3BlcnR5KGNwdW5vZGUsICJkeW5hbWljLXBvd2VyLXN0ZXAiLCBOVUxMKSAmJgorCSAgICBvZl9nZXRfcHJvcGVydHkoY3B1bm9kZSwgImR5bmFtaWMtcG93ZXItc3RlcCIsIE5VTEwpICYmCiAJICAgIFBWUl9WRVIobWZzcHIoU1BSTl9QVlIpKSA9PSAweDgwMDMpIHsKIAkJcG1hY19jcHVmcmVxX2luaXRfNzQ0N0EoY3B1bm9kZSk7CiAJLyogQ2hlY2sgZm9yIG90aGVyIE1hY1JJU0MzIG1hY2hpbmVzICovCkBAIC03MDcsNiArNzA4LDcgQEAKIAllbHNlIGlmIChQVlJfVkVSKG1mc3ByKFNQUk5fUFZSKSkgPT0gMHg3MDAwKQogCQlwbWFjX2NwdWZyZXFfaW5pdF83NTBGWChjcHVub2RlKTsKIG91dDoKKwlvZl9ub2RlX3B1dChjcHVub2RlKTsKIAlpZiAoc2V0X3NwZWVkX3Byb2MgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvY3B1ZnJlcV82NC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9jcHVmcmVxXzY0LmMKaW5kZXggOWQyMjM2MS4uNTY3ZDU1MiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9jcHVmcmVxXzY0LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9jcHVmcmVxXzY0LmMKQEAgLTQxMCw3ICs0MTAsNyBAQAogCS8qIEdldCBmaXJzdCBDUFUgbm9kZSAqLwogCWZvciAoY3B1bm9kZSA9IE5VTEw7CiAJICAgICAoY3B1bm9kZSA9IG9mX2dldF9uZXh0X2NoaWxkKGNwdXMsIGNwdW5vZGUpKSAhPSBOVUxMOykgewotCQljb25zdCB1MzIgKnJlZyA9IGdldF9wcm9wZXJ0eShjcHVub2RlLCAicmVnIiwgTlVMTCk7CisJCWNvbnN0IHUzMiAqcmVnID0gb2ZfZ2V0X3Byb3BlcnR5KGNwdW5vZGUsICJyZWciLCBOVUxMKTsKIAkJaWYgKHJlZyA9PSBOVUxMIHx8ICgqcmVnKSAhPSAwKQogCQkJY29udGludWU7CiAJCWlmICghc3RyY21wKGNwdW5vZGUtPnR5cGUsICJjcHUiKSkKQEAgLTQyMiw3ICs0MjIsNyBAQAogCX0KIAogCS8qIENoZWNrIDk3MEZYIGZvciBub3cgKi8KLQl2YWxwID0gZ2V0X3Byb3BlcnR5KGNwdW5vZGUsICJjcHUtdmVyc2lvbiIsIE5VTEwpOworCXZhbHAgPSBvZl9nZXRfcHJvcGVydHkoY3B1bm9kZSwgImNwdS12ZXJzaW9uIiwgTlVMTCk7CiAJaWYgKCF2YWxwKSB7CiAJCURCRygiTm8gY3B1LXZlcnNpb24gcHJvcGVydHkgIVxuIik7CiAJCWdvdG8gYmFpbF9ub3Byb3BzOwpAQCAtNDM0LDcgKzQzNCw3IEBACiAJfQogCiAJLyogTG9vayBmb3IgdGhlIHBvd2VydHVuZSBkYXRhIGluIHRoZSBkZXZpY2UtdHJlZSAqLwotCWc1X3Btb2RlX2RhdGEgPSBnZXRfcHJvcGVydHkoY3B1bm9kZSwgInBvd2VyLW1vZGUtZGF0YSIsJnBzaXplKTsKKwlnNV9wbW9kZV9kYXRhID0gb2ZfZ2V0X3Byb3BlcnR5KGNwdW5vZGUsICJwb3dlci1tb2RlLWRhdGEiLCZwc2l6ZSk7CiAJaWYgKCFnNV9wbW9kZV9kYXRhKSB7CiAJCURCRygiTm8gcG93ZXItbW9kZS1kYXRhICFcbiIpOwogCQlnb3RvIGJhaWxfbm9wcm9wczsKQEAgLTQ5Myw3ICs0OTMsNyBAQAogCSAqIGhhbGYgZnJlcSBpbiB0aGlzIHZlcnNpb24uIFNvIGZhciwgSSBoYXZlbid0IHlldCBzZWVuIGEgbWFjaGluZQogCSAqIHN1cHBvcnRpbmcgYW55dGhpbmcgZWxzZS4KIAkgKi8KLQl2YWxwID0gZ2V0X3Byb3BlcnR5KGNwdW5vZGUsICJjbG9jay1mcmVxdWVuY3kiLCBOVUxMKTsKKwl2YWxwID0gb2ZfZ2V0X3Byb3BlcnR5KGNwdW5vZGUsICJjbG9jay1mcmVxdWVuY3kiLCBOVUxMKTsKIAlpZiAoIXZhbHApCiAJCXJldHVybiAtRU5PREVWOwogCW1heF9mcmVxID0gKCp2YWxwKS8xMDAwOwpAQCAtNTYzLDcgKzU2Myw3IEBACiAJLyogTG9va3VwIHRoZSBjcHVpZCBlZXByb20gbm9kZSAqLwogICAgICAgICBjcHVpZCA9IG9mX2ZpbmRfbm9kZV9ieV9wYXRoKCIvdTNAMCxmODAwMDAwMC9pMmNAZjgwMDEwMDAvY3B1aWRAYTAiKTsKIAlpZiAoY3B1aWQgIT0gTlVMTCkKLQkJZWVwcm9tID0gZ2V0X3Byb3BlcnR5KGNwdWlkLCAiY3B1aWQiLCBOVUxMKTsKKwkJZWVwcm9tID0gb2ZfZ2V0X3Byb3BlcnR5KGNwdWlkLCAiY3B1aWQiLCBOVUxMKTsKIAlpZiAoZWVwcm9tID09IE5VTEwpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJjcHVmcmVxOiBDYW4ndCBmaW5kIGNwdWlkIEVFUFJPTSAhXG4iKTsKIAkJcmMgPSAtRU5PREVWOwpAQCAtNTczLDEzICs1NzMsMTMgQEAKIAkvKiBMb29rdXAgdGhlIGkyYyBod2Nsb2NrICovCiAJZm9yIChod2Nsb2NrID0gTlVMTDsKIAkgICAgIChod2Nsb2NrID0gb2ZfZmluZF9ub2RlX2J5X25hbWUoaHdjbG9jaywgImkyYy1od2Nsb2NrIikpICE9IE5VTEw7KXsKLQkJY29uc3QgY2hhciAqbG9jID0gZ2V0X3Byb3BlcnR5KGh3Y2xvY2ssCisJCWNvbnN0IGNoYXIgKmxvYyA9IG9mX2dldF9wcm9wZXJ0eShod2Nsb2NrLAogCQkJCSJod2N0cmwtbG9jYXRpb24iLCBOVUxMKTsKIAkJaWYgKGxvYyA9PSBOVUxMKQogCQkJY29udGludWU7CiAJCWlmIChzdHJjbXAobG9jLCAiQ1BVIENMT0NLIikpCiAJCQljb250aW51ZTsKLQkJaWYgKCFnZXRfcHJvcGVydHkoaHdjbG9jaywgInBsYXRmb3JtLWdldC1mcmVxdWVuY3kiLCBOVUxMKSkKKwkJaWYgKCFvZl9nZXRfcHJvcGVydHkoaHdjbG9jaywgInBsYXRmb3JtLWdldC1mcmVxdWVuY3kiLCBOVUxMKSkKIAkJCWNvbnRpbnVlOwogCQlicmVhazsKIAl9CkBAIC02MzgsNyArNjM4LDcgQEAKIAkgKi8KIAogCS8qIEdldCBtYXggZnJlcXVlbmN5IGZyb20gZGV2aWNlLXRyZWUgKi8KLQl2YWxwID0gZ2V0X3Byb3BlcnR5KGNwdW5vZGUsICJjbG9jay1mcmVxdWVuY3kiLCBOVUxMKTsKKwl2YWxwID0gb2ZfZ2V0X3Byb3BlcnR5KGNwdW5vZGUsICJjbG9jay1mcmVxdWVuY3kiLCBOVUxMKTsKIAlpZiAoIXZhbHApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJjcHVmcmVxOiBDYW4ndCBmaW5kIENQVSBmcmVxdWVuY3kgIVxuIik7CiAJCXJjID0gLUVOT0RFVjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvZmVhdHVyZS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9mZWF0dXJlLmMKaW5kZXggMjRjYzUwYy4uNTJjZmRkOCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9mZWF0dXJlLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9mZWF0dXJlLmMKQEAgLTEwNDQsNiArMTA0NCw3IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgbWFjaW9fY2hpcCAqbWFjaW87CiAJc3RydWN0IGRldmljZV9ub2RlICpucDsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNwdXM7CiAJY29uc3QgaW50IGRmbHRfcmVzZXRfbGluZXNbXSA9IHsJS0xfR1BJT19SRVNFVF9DUFUwLAogCQkJCQkJS0xfR1BJT19SRVNFVF9DUFUxLAogCQkJCQkJS0xfR1BJT19SRVNFVF9DUFUyLApAQCAtMTA1MywxMiArMTA1NCwxMiBAQAogCWlmIChtYWNpby0+dHlwZSAhPSBtYWNpb19rZXlsYXJnbykKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlucCA9IGZpbmRfcGF0aF9kZXZpY2UoIi9jcHVzIik7Ci0JaWYgKG5wID09IE5VTEwpCisJY3B1cyA9IG9mX2ZpbmRfbm9kZV9ieV9wYXRoKCIvY3B1cyIpOworCWlmIChjcHVzID09IE5VTEwpCiAJCXJldHVybiAtRU5PREVWOwotCWZvciAobnAgPSBucC0+Y2hpbGQ7IG5wICE9IE5VTEw7IG5wID0gbnAtPnNpYmxpbmcpIHsKLQkJY29uc3QgdTMyICpudW0gPSBnZXRfcHJvcGVydHkobnAsICJyZWciLCBOVUxMKTsKLQkJY29uc3QgdTMyICpyc3QgPSBnZXRfcHJvcGVydHkobnAsICJzb2Z0LXJlc2V0IiwgTlVMTCk7CisJZm9yIChucCA9IGNwdXMtPmNoaWxkOyBucCAhPSBOVUxMOyBucCA9IG5wLT5zaWJsaW5nKSB7CisJCWNvbnN0IHUzMiAqbnVtID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAicmVnIiwgTlVMTCk7CisJCWNvbnN0IHUzMiAqcnN0ID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAic29mdC1yZXNldCIsIE5VTEwpOwogCQlpZiAobnVtID09IE5VTEwgfHwgcnN0ID09IE5VTEwpCiAJCQljb250aW51ZTsKIAkJaWYgKHBhcmFtID09ICpudW0pIHsKQEAgLTEwNjYsNiArMTA2Nyw3IEBACiAJCQlicmVhazsKIAkJfQogCX0KKwlvZl9ub2RlX3B1dChjcHVzKTsKIAlpZiAobnAgPT0gTlVMTCB8fCByZXNldF9pbyA9PSAwKQogCQlyZXNldF9pbyA9IGRmbHRfcmVzZXRfbGluZXNbcGFyYW1dOwogCkBAIC0xMDk1LDcgKzEwOTcsNyBAQAogCSAgICBtYWNpby0+dHlwZSAhPSBtYWNpb19pbnRyZXBpZCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlwcm9wID0gZ2V0X3Byb3BlcnR5KG5vZGUsICJBQVBMLGNsb2NrLWlkIiwgTlVMTCk7CisJcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShub2RlLCAiQUFQTCxjbG9jay1pZCIsIE5VTEwpOwogCWlmICghcHJvcCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAJaWYgKHN0cm5jbXAocHJvcCwgInVzYjB1MDQ4IiwgOCkgPT0gMCkKQEAgLTE0OTcsMTcgKzE0OTksMTggQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBtYWNpb19jaGlwICptYWNpbzsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqY3B1czsKIAogCW1hY2lvID0gJm1hY2lvX2NoaXBzWzBdOwogCWlmIChtYWNpby0+dHlwZSAhPSBtYWNpb19rZXlsYXJnbzIgJiYgbWFjaW8tPnR5cGUgIT0gbWFjaW9fc2hhc3RhKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCW5wID0gZmluZF9wYXRoX2RldmljZSgiL2NwdXMiKTsKLQlpZiAobnAgPT0gTlVMTCkKKwljcHVzID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgoIi9jcHVzIik7CisJaWYgKGNwdXMgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9ERVY7Ci0JZm9yIChucCA9IG5wLT5jaGlsZDsgbnAgIT0gTlVMTDsgbnAgPSBucC0+c2libGluZykgewotCQljb25zdCB1MzIgKm51bSA9IGdldF9wcm9wZXJ0eShucCwgInJlZyIsIE5VTEwpOwotCQljb25zdCB1MzIgKnJzdCA9IGdldF9wcm9wZXJ0eShucCwgInNvZnQtcmVzZXQiLCBOVUxMKTsKKwlmb3IgKG5wID0gY3B1cy0+Y2hpbGQ7IG5wICE9IE5VTEw7IG5wID0gbnAtPnNpYmxpbmcpIHsKKwkJY29uc3QgdTMyICpudW0gPSBvZl9nZXRfcHJvcGVydHkobnAsICJyZWciLCBOVUxMKTsKKwkJY29uc3QgdTMyICpyc3QgPSBvZl9nZXRfcHJvcGVydHkobnAsICJzb2Z0LXJlc2V0IiwgTlVMTCk7CiAJCWlmIChudW0gPT0gTlVMTCB8fCByc3QgPT0gTlVMTCkKIAkJCWNvbnRpbnVlOwogCQlpZiAocGFyYW0gPT0gKm51bSkgewpAQCAtMTUxNSw2ICsxNTE4LDcgQEAKIAkJCWJyZWFrOwogCQl9CiAJfQorCW9mX25vZGVfcHV0KGNwdXMpOwogCWlmIChucCA9PSBOVUxMIHx8IHJlc2V0X2lvID09IDApCiAJCXJldHVybiAtRU5PREVWOwogCkBAIC0yNDA0LDE0ICsyNDA4LDE1IEBACiAJc3RydWN0IG1hY2lvX2NoaXAgKm1hY2lvID0gJm1hY2lvX2NoaXBzWzBdOwogCWNvbnN0IGNoYXIgKm1vZGVsID0gTlVMTDsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmR0OworCWludCByZXQgPSAwOwogCiAJLyogTG9va3VwIGtub3duIG1vdGhlcmJvYXJkIHR5cGUgaW4gZGV2aWNlLXRyZWUuIEZpcnN0IHRyeSBhbgogCSAqIGV4YWN0IG1hdGNoIG9uIHRoZSAibW9kZWwiIHByb3BlcnR5LCB0aGVuIHRyeSBhICJjb21wYXRpYmxlIgogCSAqIG1hdGNoIGlzIG5vbmUgaXMgZm91bmQuCiAJICovCi0JZHQgPSBmaW5kX2RldmljZXMoImRldmljZS10cmVlIik7CisJZHQgPSBvZl9maW5kX25vZGVfYnlfbmFtZShOVUxMLCAiZGV2aWNlLXRyZWUiKTsKIAlpZiAoZHQgIT0gTlVMTCkKLQkJbW9kZWwgPSBnZXRfcHJvcGVydHkoZHQsICJtb2RlbCIsIE5VTEwpOworCQltb2RlbCA9IG9mX2dldF9wcm9wZXJ0eShkdCwgIm1vZGVsIiwgTlVMTCk7CiAJZm9yKGk9MDsgbW9kZWwgJiYgaTwoc2l6ZW9mKHBtYWNfbWJfZGVmcykvc2l6ZW9mKHN0cnVjdCBwbWFjX21iX2RlZikpOyBpKyspIHsKIAkgICAgaWYgKHN0cmNtcChtb2RlbCwgcG1hY19tYl9kZWZzW2ldLm1vZGVsX3N0cmluZykgPT0gMCkgewogCQlwbWFjX21iID0gcG1hY19tYl9kZWZzW2ldOwpAQCAtMjQ3NCwxNSArMjQ3OSwxOCBAQAogCQlicmVhazsKICNlbmRpZiAvKiBDT05GSUdfUE9XRVI0ICovCiAJZGVmYXVsdDoKLQkJcmV0dXJuIC1FTk9ERVY7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZG9uZTsKIAl9CiBmb3VuZDoKICNpZm5kZWYgQ09ORklHX1BPV0VSNAogCS8qIEZpeHVwIEhvb3BlciB2cy4gQ29tZXQgKi8KIAlpZiAocG1hY19tYi5tb2RlbF9pZCA9PSBQTUFDX1RZUEVfSE9PUEVSKSB7CiAJCXUzMiBfX2lvbWVtICogbWFjaF9pZF9wdHIgPSBpb3JlbWFwKDB4ZjMwMDAwMzQsIDQpOwotCQlpZiAoIW1hY2hfaWRfcHRyKQotCQkJcmV0dXJuIC1FTk9ERVY7CisJCWlmICghbWFjaF9pZF9wdHIpIHsKKwkJCXJldCA9IC1FTk9ERVY7CisJCQlnb3RvIGRvbmU7CisJCX0KIAkJLyogSGVyZSwgSSB1c2VkIHRvIGRpc2FibGUgdGhlIG1lZGlhLWJheSBvbiBjb21ldC4gSXQKIAkJICogYXBwZWFycyB0aGlzIGlzIHdyb25nLCB0aGUgZmxvcHB5IGNvbm5lY3RvciBpcyBhY3R1YWxseQogCQkgKiBhIGtpbmQgb2YgbWVkaWEtYmF5IGFuZCB3b3JrcyB3aXRoIHRoZSBjdXJyZW50IGRyaXZlci4KQEAgLTI0OTksMTggKzI1MDcsMjYgQEAKIAkgKiB0aGF0IGFsbCBBcHBsZSBPRiByZXZzIGRpZCBpdCBwcm9wZXJseSwgSSBkbyBpdCB0aGUgcGFyYW5vaWQgd2F5LgogCSAqLwogCXdoaWxlICh1bmlub3J0aF9iYXNlICYmIHVuaW5vcnRoX3JldiA+IDMpIHsKLQkJc3RydWN0IGRldmljZV9ub2RlICpucCA9IGZpbmRfcGF0aF9kZXZpY2UoIi9jcHVzIik7Ci0JCWlmICghbnAgfHwgIW5wLT5jaGlsZCkgeworCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNwdXMgPSBvZl9maW5kX25vZGVfYnlfcGF0aCgiL2NwdXMiKTsKKwkJc3RydWN0IGRldmljZV9ub2RlICpucDsKKworCQlpZiAoIWNwdXMgfHwgIWNwdXMtPmNoaWxkKSB7CiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICJDYW4ndCBmaW5kIENQVShzKSBpbiBkZXZpY2UgdHJlZSAhXG4iKTsKKwkJCW9mX25vZGVfcHV0KGNwdXMpOwogCQkJYnJlYWs7CiAJCX0KLQkJbnAgPSBucC0+Y2hpbGQ7CisJCW5wID0gY3B1cy0+Y2hpbGQ7CiAJCS8qIE5hcCBtb2RlIG5vdCBzdXBwb3J0ZWQgb24gU01QICovCi0JCWlmIChucC0+c2libGluZykKKwkJaWYgKG5wLT5zaWJsaW5nKSB7CisJCQlvZl9ub2RlX3B1dChjcHVzKTsKIAkJCWJyZWFrOworCQl9CiAJCS8qIE5hcCBtb2RlIG5vdCBzdXBwb3J0ZWQgaWYgZmx1c2gtb24tbG9jayBwcm9wZXJ0eSBpcyBwcmVzZW50ICovCi0JCWlmIChnZXRfcHJvcGVydHkobnAsICJmbHVzaC1vbi1sb2NrIiwgTlVMTCkpCisJCWlmIChvZl9nZXRfcHJvcGVydHkobnAsICJmbHVzaC1vbi1sb2NrIiwgTlVMTCkpIHsKKwkJCW9mX25vZGVfcHV0KGNwdXMpOwogCQkJYnJlYWs7CisJCX0KKwkJb2Zfbm9kZV9wdXQoY3B1cyk7CiAJCXBvd2Vyc2F2ZV9uYXAgPSAxOwogCQlwcmludGsoS0VSTl9ERUJVRyAiUHJvY2Vzc29yIE5BUCBtb2RlIG9uIGlkbGUgZW5hYmxlZC5cbiIpOwogCQlicmVhazsKQEAgLTI1MzIsNyArMjU0OCw5IEBACiAKIAogCXByaW50ayhLRVJOX0lORk8gIlBvd2VyTWFjIG1vdGhlcmJvYXJkOiAlc1xuIiwgcG1hY19tYi5tb2RlbF9uYW1lKTsKLQlyZXR1cm4gMDsKK2RvbmU6CisJb2Zfbm9kZV9wdXQoZHQpOworCXJldHVybiByZXQ7CiB9CiAKIC8qIEluaXRpYWxpemUgdGhlIENvcmU5OSBVbmlOb3J0aCBob3N0IGJyaWRnZSBhbmQgbWVtb3J5IGNvbnRyb2xsZXIKQEAgLTI1NTgsNyArMjU3Niw3IEBACiAJaWYgKHVuaW5vcnRoX25vZGUgPT0gTlVMTCkKIAkJcmV0dXJuOwogCi0JYWRkcnAgPSBnZXRfcHJvcGVydHkodW5pbm9ydGhfbm9kZSwgInJlZyIsIE5VTEwpOworCWFkZHJwID0gb2ZfZ2V0X3Byb3BlcnR5KHVuaW5vcnRoX25vZGUsICJyZWciLCBOVUxMKTsKIAlpZiAoYWRkcnAgPT0gTlVMTCkKIAkJcmV0dXJuOwogCWFkZHJlc3MgPSBvZl90cmFuc2xhdGVfYWRkcmVzcyh1bmlub3J0aF9ub2RlLCBhZGRycCk7CkBAIC0yNjQyLDcgKzI2NjAsNyBAQAogCQlyZXR1cm47CiAJfQogCWlmICh0eXBlID09IG1hY2lvX2tleWxhcmdvIHx8IHR5cGUgPT0gbWFjaW9fa2V5bGFyZ28yKSB7Ci0JCWNvbnN0IHUzMiAqZGlkID0gZ2V0X3Byb3BlcnR5KG5vZGUsICJkZXZpY2UtaWQiLCBOVUxMKTsKKwkJY29uc3QgdTMyICpkaWQgPSBvZl9nZXRfcHJvcGVydHkobm9kZSwgImRldmljZS1pZCIsIE5VTEwpOwogCQlpZiAoKmRpZCA9PSAweDAwMDAwMDI1KQogCQkJdHlwZSA9IG1hY2lvX3BhbmdlYTsKIAkJaWYgKCpkaWQgPT0gMHgwMDAwMDAzZSkKQEAgLTI2NTUsNyArMjY3Myw3IEBACiAJbWFjaW9fY2hpcHNbaV0uYmFzZQk9IGJhc2U7CiAJbWFjaW9fY2hpcHNbaV0uZmxhZ3MJPSBNQUNJT19GTEFHX1NDQ0JfT04gfCBNQUNJT19GTEFHX1NDQ0JfT047CiAJbWFjaW9fY2hpcHNbaV0ubmFtZQk9IG1hY2lvX25hbWVzW3R5cGVdOwotCXJldnAgPSBnZXRfcHJvcGVydHkobm9kZSwgInJldmlzaW9uLWlkIiwgTlVMTCk7CisJcmV2cCA9IG9mX2dldF9wcm9wZXJ0eShub2RlLCAicmV2aXNpb24taWQiLCBOVUxMKTsKIAlpZiAocmV2cCkKIAkJbWFjaW9fY2hpcHNbaV0ucmV2ID0gKnJldnA7CiAJcHJpbnRrKEtFUk5fSU5GTyAiRm91bmQgYSAlcyBtYWMtaW8gY29udHJvbGxlciwgcmV2OiAlZCwgbWFwcGVkIGF0IDB4JXBcbiIsCkBAIC0yNzA2LDggKzI3MjQsOCBAQAogCWludCBwb3J0X3R5cGUgPSBQTUFDX1NDQ19BU1lOQzsKIAlpbnQgbW9kZW0gPSAwOwogCi0Jc2xvdHMgPSBnZXRfcHJvcGVydHkobnAsICJzbG90LW5hbWVzIiwgJmxlbik7Ci0JY29ubiA9IGdldF9wcm9wZXJ0eShucCwgIkFBUEwsY29ubmVjdG9yIiwgJmxlbik7CisJc2xvdHMgPSBvZl9nZXRfcHJvcGVydHkobnAsICJzbG90LW5hbWVzIiwgJmxlbik7CisJY29ubiA9IG9mX2dldF9wcm9wZXJ0eShucCwgIkFBUEwsY29ubmVjdG9yIiwgJmxlbik7CiAJaWYgKGNvbm4gJiYgKHN0cmNtcChjb25uLCAiaW5mcmFyZWQiKSA9PSAwKSkKIAkJcG9ydF90eXBlID0gUE1BQ19TQ0NfSVJEQTsKIAllbHNlIGlmIChkZXZpY2VfaXNfY29tcGF0aWJsZShucCwgImNvYmFsdCIpKQpAQCAtMjczNSwxMiArMjc1MywxNCBAQAogCSAqIGRpZmZlcmVuY2lhdGUgdGhlbSBhbGwgYW5kIHNpbmNlIHRoYXQgaGFjayB3YXMgdGhlcmUgZm9yIGEgbG9uZwogCSAqIHRpbWUsIEknbGwga2VlcCBpdCBhcm91bmQKIAkgKi8KLQlpZiAobWFjaW9fY2hpcHNbMF0udHlwZSA9PSBtYWNpb19vaGFyZSAmJiAhZmluZF9kZXZpY2VzKCJ2aWEtcG11IikpIHsKKwlpZiAobWFjaW9fY2hpcHNbMF0udHlwZSA9PSBtYWNpb19vaGFyZSkgewogCQlzdHJ1Y3QgbWFjaW9fY2hpcCAqbWFjaW8gPSAmbWFjaW9fY2hpcHNbMF07Ci0JCU1BQ0lPX09VVDMyKE9IQVJFX0ZDUiwgU1RBUk1BWF9GRUFUVVJFUyk7Ci0JfSBlbHNlIGlmIChtYWNpb19jaGlwc1swXS50eXBlID09IG1hY2lvX29oYXJlKSB7Ci0JCXN0cnVjdCBtYWNpb19jaGlwICptYWNpbyA9ICZtYWNpb19jaGlwc1swXTsKLQkJTUFDSU9fQklTKE9IQVJFX0ZDUiwgT0hfSU9CVVNfRU5BQkxFKTsKKwkJbnAgPSBvZl9maW5kX25vZGVfYnlfbmFtZShOVUxMLCAidmlhLXBtdSIpOworCQlpZiAobnApCisJCQlNQUNJT19CSVMoT0hBUkVfRkNSLCBPSF9JT0JVU19FTkFCTEUpOworCQllbHNlCisJCQlNQUNJT19PVVQzMihPSEFSRV9GQ1IsIFNUQVJNQVhfRkVBVFVSRVMpOworCQlvZl9ub2RlX3B1dChucCk7CiAJfSBlbHNlIGlmIChtYWNpb19jaGlwc1sxXS50eXBlID09IG1hY2lvX29oYXJlKSB7CiAJCXN0cnVjdCBtYWNpb19jaGlwICptYWNpbyA9ICZtYWNpb19jaGlwc1sxXTsKIAkJTUFDSU9fQklTKE9IQVJFX0ZDUiwgT0hfSU9CVVNfRU5BQkxFKTsKQEAgLTI4MzMsMTQgKzI4NTMsMTMgQEAKIAkJfQogCiAJCS8qIFN3aXRjaCBhaXJwb3J0IG9mZiAqLwotCQlucCA9IGZpbmRfZGV2aWNlcygicmFkaW8iKTsKLQkJd2hpbGUobnApIHsKKwkJZm9yX2VhY2hfbm9kZV9ieV9uYW1lKG5wLCAicmFkaW8iKSB7CiAJCQlpZiAobnAgJiYgbnAtPnBhcmVudCA9PSBtYWNpb19jaGlwc1swXS5vZl9ub2RlKSB7CiAJCQkJbWFjaW9fY2hpcHNbMF0uZmxhZ3MgfD0gTUFDSU9fRkxBR19BSVJQT1JUX09OOwogCQkJCWNvcmU5OV9haXJwb3J0X2VuYWJsZShucCwgMCwgMCk7CiAJCQl9Ci0JCQlucCA9IG5wLT5uZXh0OwogCQl9CisJCW9mX25vZGVfcHV0KG5wKTsKIAl9CiAKIAkvKiBPbiBhbGwgbWFjaGluZXMgdGhhdCBzdXBwb3J0IHNvdW5kIFBNLCBzd2l0Y2ggc291bmQgb2ZmICovCkBAIC0yODYwLDE2ICsyODc5LDEyIEBACiAjZW5kaWYgLyogQ09ORklHX1BPV0VSNCAqLwogCiAJLyogT24gYWxsIG1hY2hpbmVzLCBzd2l0Y2ggbW9kZW0gJiBzZXJpYWwgcG9ydHMgb2ZmICovCi0JbnAgPSBmaW5kX2RldmljZXMoImNoLWEiKTsKLQl3aGlsZShucCkgeworCWZvcl9lYWNoX25vZGVfYnlfbmFtZShucCwgImNoLWEiKQogCQlpbml0aWFsX3NlcmlhbF9zaHV0ZG93bihucCk7Ci0JCW5wID0gbnAtPm5leHQ7Ci0JfQotCW5wID0gZmluZF9kZXZpY2VzKCJjaC1iIik7Ci0Jd2hpbGUobnApIHsKKwlvZl9ub2RlX3B1dChucCk7CisJZm9yX2VhY2hfbm9kZV9ieV9uYW1lKG5wLCAiY2gtYiIpCiAJCWluaXRpYWxfc2VyaWFsX3NodXRkb3duKG5wKTsKLQkJbnAgPSBucC0+bmV4dDsKLQl9CisJb2Zfbm9kZV9wdXQobnApOwogfQogCiB2b2lkIF9faW5pdApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9sb3dfaTJjLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL2xvd19pMmMuYwppbmRleCBiZmM0ODI5Li41NDMwZTE0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL2xvd19pMmMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL2xvd19pMmMuYwpAQCAtNDkxLDcgKzQ5MSw3IEBACiAJICogb24gYWxsIGkyYyBrZXl3ZXN0IG5vZGVzIHNvIGZhciAuLi4gd2Ugd291bGQgaGF2ZSB0byBmYWxsYmFjawogCSAqIHRvIG1hY2lvIHBhcnNpbmcgaWYgdGhhdCB3YXNuJ3QgdGhlIGNhc2UKIAkgKi8KLQlhZGRycCA9IGdldF9wcm9wZXJ0eShucCwgIkFBUEwsYWRkcmVzcyIsIE5VTEwpOworCWFkZHJwID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAiQUFQTCxhZGRyZXNzIiwgTlVMTCk7CiAJaWYgKGFkZHJwID09IE5VTEwpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJsb3dfaTJjOiBDYW4ndCBmaW5kIGFkZHJlc3MgZm9yICVzXG4iLAogCQkgICAgICAgbnAtPmZ1bGxfbmFtZSk7CkBAIC01MDUsMTMgKzUwNSwxMyBAQAogCWhvc3QtPnRpbWVvdXRfdGltZXIuZnVuY3Rpb24gPSBrd19pMmNfdGltZW91dDsKIAlob3N0LT50aW1lb3V0X3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylob3N0OwogCi0JcHN0ZXBzID0gZ2V0X3Byb3BlcnR5KG5wLCAiQUFQTCxhZGRyZXNzLXN0ZXAiLCBOVUxMKTsKKwlwc3RlcHMgPSBvZl9nZXRfcHJvcGVydHkobnAsICJBQVBMLGFkZHJlc3Mtc3RlcCIsIE5VTEwpOwogCXN0ZXBzID0gcHN0ZXBzID8gKCpwc3RlcHMpIDogMHgxMDsKIAlmb3IgKGhvc3QtPmJzdGVwcyA9IDA7IChzdGVwcyAmIDB4MDEpID09IDA7IGhvc3QtPmJzdGVwcysrKQogCQlzdGVwcyA+Pj0gMTsKIAkvKiBTZWxlY3QgaW50ZXJmYWNlIHJhdGUgKi8KIAlob3N0LT5zcGVlZCA9IEtXX0kyQ19NT0RFXzI1S0haOwotCXByYXRlID0gZ2V0X3Byb3BlcnR5KG5wLCAiQUFQTCxpMmMtcmF0ZSIsIE5VTEwpOworCXByYXRlID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAiQUFQTCxpMmMtcmF0ZSIsIE5VTEwpOwogCWlmIChwcmF0ZSkgc3dpdGNoKCpwcmF0ZSkgewogCWNhc2UgMTAwOgogCQlob3N0LT5zcGVlZCA9IEtXX0kyQ19NT0RFXzEwMEtIWjsKQEAgLTYxOSw3ICs2MTksNyBAQAogCQl9IGVsc2UgewogCQkJZm9yIChjaGlsZCA9IE5VTEw7CiAJCQkgICAgIChjaGlsZCA9IG9mX2dldF9uZXh0X2NoaWxkKG5wLCBjaGlsZCkpICE9IE5VTEw7KSB7Ci0JCQkJY29uc3QgdTMyICpyZWcgPSBnZXRfcHJvcGVydHkoY2hpbGQsCisJCQkJY29uc3QgdTMyICpyZWcgPSBvZl9nZXRfcHJvcGVydHkoY2hpbGQsCiAJCQkJCQkicmVnIiwgTlVMTCk7CiAJCQkJaWYgKHJlZyA9PSBOVUxMKQogCQkJCQljb250aW51ZTsKQEAgLTkwNSw3ICs5MDUsNyBAQAogCQlpZiAoc3RyY21wKGJ1c25vZGUtPnR5cGUsICJpMmMiKSAmJgogCQkgICAgc3RyY21wKGJ1c25vZGUtPnR5cGUsICJpMmMtYnVzIikpCiAJCQljb250aW51ZTsKLQkJcmVnID0gZ2V0X3Byb3BlcnR5KGJ1c25vZGUsICJyZWciLCBOVUxMKTsKKwkJcmVnID0gb2ZfZ2V0X3Byb3BlcnR5KGJ1c25vZGUsICJyZWciLCBOVUxMKTsKIAkJaWYgKHJlZyA9PSBOVUxMKQogCQkJY29udGludWU7CiAKQEAgLTk1MCw3ICs5NTAsOCBAQAogCQkJaWYgKHAgPT0gYnVzLT5idXNub2RlKSB7CiAJCQkJaWYgKHByZXYgJiYgYnVzLT5mbGFncyAmIHBtYWNfaTJjX211bHRpYnVzKSB7CiAJCQkJCWNvbnN0IHUzMiAqcmVnOwotCQkJCQlyZWcgPSBnZXRfcHJvcGVydHkocHJldiwgInJlZyIsIE5VTEwpOworCQkJCQlyZWcgPSBvZl9nZXRfcHJvcGVydHkocHJldiwgInJlZyIsCisJCQkJCQkJCU5VTEwpOwogCQkJCQlpZiAoIXJlZykKIAkJCQkJCWNvbnRpbnVlOwogCQkJCQlpZiAoKCgqcmVnKSA+PiA4KSAhPSBidXMtPmNoYW5uZWwpCkBAIC05NzEsNyArOTcyLDcgQEAKIAogdTggcG1hY19pMmNfZ2V0X2Rldl9hZGRyKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2aWNlKQogewotCWNvbnN0IHUzMiAqcmVnID0gZ2V0X3Byb3BlcnR5KGRldmljZSwgInJlZyIsIE5VTEwpOworCWNvbnN0IHUzMiAqcmVnID0gb2ZfZ2V0X3Byb3BlcnR5KGRldmljZSwgInJlZyIsIE5VTEwpOwogCiAJaWYgKHJlZyA9PSBOVUxMKQogCQlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvcGNpLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3BjaS5jCmluZGV4IDZmYmFjMzAuLjIyYzRhZTQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvcGNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9wY2kuYwpAQCAtNzAsMTEgKzcwLDExIEBACiAJCWludCBsZW47CiAKIAkJLyogRm9yIFBDSTwtPlBDSSBicmlkZ2VzIG9yIENhcmRCdXMgYnJpZGdlcywgd2UgZ28gZG93biAqLwotCQljbGFzc19jb2RlID0gZ2V0X3Byb3BlcnR5KG5vZGUsICJjbGFzcy1jb2RlIiwgTlVMTCk7CisJCWNsYXNzX2NvZGUgPSBvZl9nZXRfcHJvcGVydHkobm9kZSwgImNsYXNzLWNvZGUiLCBOVUxMKTsKIAkJaWYgKCFjbGFzc19jb2RlIHx8ICgoKmNsYXNzX2NvZGUgPj4gOCkgIT0gUENJX0NMQVNTX0JSSURHRV9QQ0kgJiYKIAkJCSgqY2xhc3NfY29kZSA+PiA4KSAhPSBQQ0lfQ0xBU1NfQlJJREdFX0NBUkRCVVMpKQogCQkJY29udGludWU7Ci0JCWJ1c19yYW5nZSA9IGdldF9wcm9wZXJ0eShub2RlLCAiYnVzLXJhbmdlIiwgJmxlbik7CisJCWJ1c19yYW5nZSA9IG9mX2dldF9wcm9wZXJ0eShub2RlLCAiYnVzLXJhbmdlIiwgJmxlbik7CiAJCWlmIChidXNfcmFuZ2UgIT0gTlVMTCAmJiBsZW4gPiAyICogc2l6ZW9mKGludCkpIHsKIAkJCWlmIChidXNfcmFuZ2VbMV0gPiBoaWdoZXIpCiAJCQkJaGlnaGVyID0gYnVzX3JhbmdlWzFdOwpAQCAtMTAwLDcgKzEwMCw3IEBACiAJaWYgKHByb3AgPT0gTlVMTCB8fCBwcm9wLT5sZW5ndGggPCAyICogc2l6ZW9mKGludCkpCiAJCXJldHVybjsKIAotCWJ1c19yYW5nZSA9IChpbnQgKilwcm9wLT52YWx1ZTsKKwlidXNfcmFuZ2UgPSBwcm9wLT52YWx1ZTsKIAlidXNfcmFuZ2VbMV0gPSBmaXh1cF9vbmVfbGV2ZWxfYnVzX3JhbmdlKGJyaWRnZS0+Y2hpbGQsIGJ1c19yYW5nZVsxXSk7CiB9CiAKQEAgLTI0Niw4ICsyNDYsOCBAQAogCWlmIChucCA9PSBOVUxMKQogCQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOwogCi0JdmVuZG9yID0gZ2V0X3Byb3BlcnR5KG5wLCAidmVuZG9yLWlkIiwgTlVMTCk7Ci0JZGV2aWNlID0gZ2V0X3Byb3BlcnR5KG5wLCAiZGV2aWNlLWlkIiwgTlVMTCk7CisJdmVuZG9yID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAidmVuZG9yLWlkIiwgTlVMTCk7CisJZGV2aWNlID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAiZGV2aWNlLWlkIiwgTlVMTCk7CiAJaWYgKHZlbmRvciA9PSBOVUxMIHx8IGRldmljZSA9PSBOVUxMKQogCQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOwogCkBAIC02MjIsMTMgKzYyMiwxNCBAQAogCiAJLyogWFhYIGl0IHdvdWxkIGJlIGJldHRlciBoZXJlIHRvIGlkZW50aWZ5IHRoZSBzcGVjaWZpYwogCSAgIFBDSS1QQ0kgYnJpZGdlIGNoaXAgd2UgaGF2ZS4gKi8KLQlpZiAoKHAycGJyaWRnZSA9IGZpbmRfZGV2aWNlcygicGNpLWJyaWRnZSIpKSA9PSAwCisJcDJwYnJpZGdlID0gb2ZfZmluZF9ub2RlX2J5X25hbWUoTlVMTCwgInBjaS1icmlkZ2UiKTsKKwlpZiAocDJwYnJpZGdlID09IE5VTEwKIAkgICAgfHwgcDJwYnJpZGdlLT5wYXJlbnQgPT0gTlVMTAogCSAgICB8fCBzdHJjbXAocDJwYnJpZGdlLT5wYXJlbnQtPm5hbWUsICJwY2kiKSAhPSAwKQotCQlyZXR1cm47CisJCWdvdG8gZG9uZTsKIAlpZiAocGNpX2RldmljZV9mcm9tX09GX25vZGUocDJwYnJpZGdlLCAmYnVzLCAmZGV2Zm4pIDwgMCkgewogCQlEQkcoIkNhbid0IGZpbmQgUENJIGluZm9zIGZvciBQQ0k8LT5QQ0kgYnJpZGdlXG4iKTsKLQkJcmV0dXJuOworCQlnb3RvIGRvbmU7CiAJfQogCS8qIFdhcm5pbmc6IEF0IHRoaXMgcG9pbnQsIHdlIGhhdmUgbm90IHlldCByZW51bWJlcmVkIGFsbCBidXNzZXMuCiAJICogU28gd2UgbXVzdCB1c2UgT0Ygd2Fsa2luZyB0byBmaW5kIG91dCBob3NlCkBAIC02MzYsMTYgKzYzNywxOCBAQAogCWhvc2UgPSBwY2lfZmluZF9ob3NlX2Zvcl9PRl9kZXZpY2UocDJwYnJpZGdlKTsKIAlpZiAoIWhvc2UpIHsKIAkJREJHKCJDYW4ndCBmaW5kIGhvc2UgZm9yIFBDSTwtPlBDSSBicmlkZ2VcbiIpOwotCQlyZXR1cm47CisJCWdvdG8gZG9uZTsKIAl9CiAJaWYgKGVhcmx5X3JlYWRfY29uZmlnX3dvcmQoaG9zZSwgYnVzLCBkZXZmbiwKIAkJCQkgICBQQ0lfQlJJREdFX0NPTlRST0wsICZ2YWwpIDwgMCkgewogCQlwcmludGsoS0VSTl9FUlIgImluaXRfcDJwYnJpZGdlOiBjb3VsZG4ndCByZWFkIGJyaWRnZSIKIAkJICAgICAgICIgY29udHJvbFxuIik7Ci0JCXJldHVybjsKKwkJZ290byBkb25lOwogCX0KIAl2YWwgJj0gflBDSV9CUklER0VfQ1RMX01BU1RFUl9BQk9SVDsKIAllYXJseV93cml0ZV9jb25maWdfd29yZChob3NlLCBidXMsIGRldmZuLCBQQ0lfQlJJREdFX0NPTlRST0wsIHZhbCk7Citkb25lOgorCW9mX25vZGVfcHV0KHAycGJyaWRnZSk7CiB9CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBpbml0X3NlY29uZF9vaGFyZSh2b2lkKQpAQCAtNjkxLDE3ICs2OTQsMTcgQEAKIAkJY29uc3QgdTMyICpwcm9wOwogCQl1OCBidXMsIGRldmZuOwogCi0JCXByb3AgPSBnZXRfcHJvcGVydHkobmVjLCAidmVuZG9yLWlkIiwgTlVMTCk7CisJCXByb3AgPSBvZl9nZXRfcHJvcGVydHkobmVjLCAidmVuZG9yLWlkIiwgTlVMTCk7CiAJCWlmIChwcm9wID09IE5VTEwpCiAJCQljb250aW51ZTsKIAkJaWYgKDB4MTAzMyAhPSAqcHJvcCkKIAkJCWNvbnRpbnVlOwotCQlwcm9wID0gZ2V0X3Byb3BlcnR5KG5lYywgImRldmljZS1pZCIsIE5VTEwpOworCQlwcm9wID0gb2ZfZ2V0X3Byb3BlcnR5KG5lYywgImRldmljZS1pZCIsIE5VTEwpOwogCQlpZiAocHJvcCA9PSBOVUxMKQogCQkJY29udGludWU7CiAJCWlmICgweDAwMzUgIT0gKnByb3ApCiAJCQljb250aW51ZTsKLQkJcHJvcCA9IGdldF9wcm9wZXJ0eShuZWMsICJyZWciLCBOVUxMKTsKKwkJcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShuZWMsICJyZWciLCBOVUxMKTsKIAkJaWYgKHByb3AgPT0gTlVMTCkKIAkJCWNvbnRpbnVlOwogCQlkZXZmbiA9IChwcm9wWzBdID4+IDgpICYgMHhmZjsKQEAgLTkwOSw3ICs5MTIsNyBAQAogCWhhc19hZGRyZXNzID0gKG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UoZGV2LCAwLCAmcnNyYykgPT0gMCk7CiAKIAkvKiBHZXQgYnVzIHJhbmdlIGlmIGFueSAqLwotCWJ1c19yYW5nZSA9IGdldF9wcm9wZXJ0eShkZXYsICJidXMtcmFuZ2UiLCAmbGVuKTsKKwlidXNfcmFuZ2UgPSBvZl9nZXRfcHJvcGVydHkoZGV2LCAiYnVzLXJhbmdlIiwgJmxlbik7CiAJaWYgKGJ1c19yYW5nZSA9PSBOVUxMIHx8IGxlbiA8IDIgKiBzaXplb2YoaW50KSkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJDYW4ndCBnZXQgYnVzLXJhbmdlIGZvciAlcywgYXNzdW1lIgogCQkgICAgICAgIiBidXMgMFxuIiwgZGV2LT5mdWxsX25hbWUpOwpAQCAtMTE5OSw4ICsxMjAyLDcgQEAKIAl9CiAjZW5kaWYgLyogQ09ORklHX0JMS19ERVZfSURFICovCiAKLQluZCA9IGZpbmRfZGV2aWNlcygiZmlyZXdpcmUiKTsKLQl3aGlsZSAobmQpIHsKKwlmb3JfZWFjaF9ub2RlX2J5X25hbWUobmQsICJmaXJld2lyZSIpIHsKIAkJaWYgKG5kLT5wYXJlbnQgJiYgKGRldmljZV9pc19jb21wYXRpYmxlKG5kLCAicGNpMTA2YiwxOCIpIHx8CiAJCQkJICAgZGV2aWNlX2lzX2NvbXBhdGlibGUobmQsICJwY2kxMDZiLDMwIikgfHwKIAkJCQkgICBkZXZpY2VfaXNfY29tcGF0aWJsZShuZCwgInBjaTExYzEsNTgxMSIpKQpAQCAtMTIwOCwxNSArMTIxMCwxNCBAQAogCQkJcG1hY19jYWxsX2ZlYXR1cmUoUE1BQ19GVFJfMTM5NF9FTkFCTEUsIG5kLCAwLCAwKTsKIAkJCXBtYWNfY2FsbF9mZWF0dXJlKFBNQUNfRlRSXzEzOTRfQ0FCTEVfUE9XRVIsIG5kLCAwLCAwKTsKIAkJfQotCQluZCA9IG5kLT5uZXh0OwogCX0KLQluZCA9IGZpbmRfZGV2aWNlcygiZXRoZXJuZXQiKTsKLQl3aGlsZSAobmQpIHsKKwlvZl9ub2RlX3B1dChuZCk7CisJZm9yX2VhY2hfbm9kZV9ieV9uYW1lKG5kLCAiZXRoZXJuZXQiKSB7CiAJCWlmIChuZC0+cGFyZW50ICYmIGRldmljZV9pc19jb21wYXRpYmxlKG5kLCAiZ21hYyIpCiAJCSAgICAmJiBkZXZpY2VfaXNfY29tcGF0aWJsZShuZC0+cGFyZW50LCAidW5pLW5vcnRoIikpCiAJCQlwbWFjX2NhbGxfZmVhdHVyZShQTUFDX0ZUUl9HTUFDX0VOQUJMRSwgbmQsIDAsIDApOwotCQluZCA9IG5kLT5uZXh0OwogCX0KKwlvZl9ub2RlX3B1dChuZCk7CiB9CiAKICNpZmRlZiBDT05GSUdfUFBDMzIKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvcGZ1bmNfYmFzZS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9wZnVuY19iYXNlLmMKaW5kZXggNWM2YzE1Yy4uNDVkNTRiOSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9wZnVuY19iYXNlLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9wZnVuY19iYXNlLmMKQEAgLTExNCw3ICsxMTQsNyBAQAogCSAqIHdlIGp1c3QgY3JlYXRlIHRoZW0gYWxsCiAJICovCiAJZm9yIChncCA9IE5VTEw7IChncCA9IG9mX2dldF9uZXh0X2NoaWxkKGdwYXJlbnQsIGdwKSkgIT0gTlVMTDspIHsKLQkJY29uc3QgdTMyICpyZWcgPSBnZXRfcHJvcGVydHkoZ3AsICJyZWciLCBOVUxMKTsKKwkJY29uc3QgdTMyICpyZWcgPSBvZl9nZXRfcHJvcGVydHkoZ3AsICJyZWciLCBOVUxMKTsKIAkJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CiAJCWlmIChyZWcgPT0gTlVMTCkKIAkJCWNvbnRpbnVlOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9wZnVuY19jb3JlLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3BmdW5jX2NvcmUuYwppbmRleCA3NjUxZjI3OC4uODU0MzQyMzEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvcGZ1bmNfY29yZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvcGZ1bmNfY29yZS5jCkBAIC02OTIsOCArNjkyLDcgQEAKIAkJbmFtZSA9IHBwLT5uYW1lICsgcGxlbjsKIAkJaWYgKHN0cmxlbihuYW1lKSAmJiBwcC0+bGVuZ3RoID49IDEyKQogCQkJY291bnQgKz0gcG1mX2FkZF9mdW5jdGlvbl9wcm9wKGRldiwgZHJpdmVyZGF0YSwgbmFtZSwKLQkJCQkJCSAgICAgICAodTMyICopcHAtPnZhbHVlLAotCQkJCQkJICAgICAgIHBwLT5sZW5ndGgpOworCQkJCQkJICAgICAgIHBwLT52YWx1ZSwgcHAtPmxlbmd0aCk7CiAJfQogCXJldHVybiBjb3VudDsKIH0KQEAgLTgyMSw3ICs4MjAsNyBAQAogCSAqIG9uZSwgdGhlbiB3ZSBmYWxsYmFjayB0byBhIGRpcmVjdCBjYWxsIGF0dGVtcHQKIAkgKi8KIAlzbnByaW50ZihmbmFtZSwgNjMsICJwbGF0Zm9ybS0lcyIsIG5hbWUpOwotCXByb3AgPSBnZXRfcHJvcGVydHkodGFyZ2V0LCBmbmFtZSwgTlVMTCk7CisJcHJvcCA9IG9mX2dldF9wcm9wZXJ0eSh0YXJnZXQsIGZuYW1lLCBOVUxMKTsKIAlpZiAocHJvcCA9PSBOVUxMKQogCQlnb3RvIGZpbmRfaXQ7CiAJcGggPSAqcHJvcDsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvcGljLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3BpYy5jCmluZGV4IDVlNWMwZTQuLmFlNTA5N2EgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvcGljLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9waWMuYwpAQCAtNDgyLDE0ICs0ODIsMTQgQEAKIAlwbWFjX2NhbGxfZmVhdHVyZShQTUFDX0ZUUl9FTkFCTEVfTVBJQywgbnAsIDAsIDApOwogCiAJZmxhZ3MgfD0gTVBJQ19XQU5UU19SRVNFVDsKLQlpZiAoZ2V0X3Byb3BlcnR5KG5wLCAiYmlnLWVuZGlhbiIsIE5VTEwpKQorCWlmIChvZl9nZXRfcHJvcGVydHkobnAsICJiaWctZW5kaWFuIiwgTlVMTCkpCiAJCWZsYWdzIHw9IE1QSUNfQklHX0VORElBTjsKIAogCS8qIFByaW1hcnkgQmlnIEVuZGlhbiBtZWFucyBIVCBpbnRlcnJ1cHRzLiBUaGlzIGlzIHF1aXRlIGRvZGd5CiAJICogYnV0IHdvcmtzIHVudGlsIEkgZmluZCBhIGJldHRlciB3YXkKIAkgKi8KIAlpZiAobWFzdGVyICYmIChmbGFncyAmIE1QSUNfQklHX0VORElBTikpCi0JCWZsYWdzIHw9IE1QSUNfQlJPS0VOX1UzOworCQlmbGFncyB8PSBNUElDX1UzX0hUX0lSUVM7CiAKIAltcGljID0gbXBpY19hbGxvYyhucCwgci5zdGFydCwgZmxhZ3MsIDAsIDAsIG5hbWUpOwogCWlmIChtcGljID09IE5VTEwpCkBAIC01MTAsNyArNTEwLDcgQEAKIAlmb3IgKG5wID0gTlVMTDsgKG5wID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUobnAsICJvcGVuLXBpYyIpKQogCQkgICAgICE9IE5VTEw7KSB7CiAJCWlmIChtYXN0ZXIgPT0gTlVMTCAmJgotCQkgICAgZ2V0X3Byb3BlcnR5KG5wLCAiaW50ZXJydXB0cyIsIE5VTEwpID09IE5VTEwpCisJCSAgICBvZl9nZXRfcHJvcGVydHkobnAsICJpbnRlcnJ1cHRzIiwgTlVMTCkgPT0gTlVMTCkKIAkJCW1hc3RlciA9IG9mX25vZGVfZ2V0KG5wKTsKIAkJZWxzZSBpZiAoc2xhdmUgPT0gTlVMTCkKIAkJCXNsYXZlID0gb2Zfbm9kZV9nZXQobnApOwpAQCAtNTc1LDcgKzU3NSw3IEBACiAjaWZkZWYgQ09ORklHX1BQQzMyCiAJaWYgKCFwbWFjX25ld3dvcmxkKQogCQlmbGFncyB8PSBPRl9JTUFQX09MRFdPUkxEX01BQzsKLQlpZiAoZ2V0X3Byb3BlcnR5KG9mX2Nob3NlbiwgImxpbnV4LGJvb3R4IiwgTlVMTCkgIT0gTlVMTCkKKwlpZiAob2ZfZ2V0X3Byb3BlcnR5KG9mX2Nob3NlbiwgImxpbnV4LGJvb3R4IiwgTlVMTCkgIT0gTlVMTCkKIAkJZmxhZ3MgfD0gT0ZfSU1BUF9OT19QSEFORExFOwogI2VuZGlmIC8qIENPTkZJR19QUENfMzIgKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9zZXR1cC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9zZXR1cC5jCmluZGV4IDY1MWZhNDIuLmI4MjBjYWIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvc2V0dXAuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3NldHVwLmMKQEAgLTQyLDcgKzQyLDYgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0cmQuaD4KICNpbmNsdWRlIDxsaW51eC92dF9rZXJuLmg+CiAjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgotI2luY2x1ZGUgPGxpbnV4L2lkZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2FkYi5oPgogI2luY2x1ZGUgPGxpbnV4L2N1ZGEuaD4KQEAgLTEzNSwxMiArMTM0LDEyIEBACiAJc2VxX3ByaW50ZihtLCAibWFjaGluZVx0XHQ6ICIpOwogCW5wID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgoIi8iKTsKIAlpZiAobnAgIT0gTlVMTCkgewotCQlwcCA9IGdldF9wcm9wZXJ0eShucCwgIm1vZGVsIiwgTlVMTCk7CisJCXBwID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAibW9kZWwiLCBOVUxMKTsKIAkJaWYgKHBwICE9IE5VTEwpCiAJCQlzZXFfcHJpbnRmKG0sICIlc1xuIiwgcHApOwogCQllbHNlCiAJCQlzZXFfcHJpbnRmKG0sICJQb3dlck1hY1xuIik7Ci0JCXBwID0gZ2V0X3Byb3BlcnR5KG5wLCAiY29tcGF0aWJsZSIsICZwbGVuKTsKKwkJcHAgPSBvZl9nZXRfcHJvcGVydHkobnAsICJjb21wYXRpYmxlIiwgJnBsZW4pOwogCQlpZiAocHAgIT0gTlVMTCkgewogCQkJc2VxX3ByaW50ZihtLCAibW90aGVyYm9hcmRcdDoiKTsKIAkJCXdoaWxlIChwbGVuID4gMCkgewpAQCAtMTY0LDExICsxNjMsMTMgQEAKIAlpZiAobnAgPT0gTlVMTCkKIAkJbnAgPSBvZl9maW5kX25vZGVfYnlfdHlwZShOVUxMLCAiY2FjaGUiKTsKIAlpZiAobnAgIT0gTlVMTCkgewotCQljb25zdCB1bnNpZ25lZCBpbnQgKmljID0gZ2V0X3Byb3BlcnR5KG5wLCAiaS1jYWNoZS1zaXplIiwgTlVMTCk7Ci0JCWNvbnN0IHVuc2lnbmVkIGludCAqZGMgPSBnZXRfcHJvcGVydHkobnAsICJkLWNhY2hlLXNpemUiLCBOVUxMKTsKKwkJY29uc3QgdW5zaWduZWQgaW50ICppYyA9CisJCQlvZl9nZXRfcHJvcGVydHkobnAsICJpLWNhY2hlLXNpemUiLCBOVUxMKTsKKwkJY29uc3QgdW5zaWduZWQgaW50ICpkYyA9CisJCQlvZl9nZXRfcHJvcGVydHkobnAsICJkLWNhY2hlLXNpemUiLCBOVUxMKTsKIAkJc2VxX3ByaW50ZihtLCAiTDIgY2FjaGVcdDoiKTsKIAkJaGFzX2wyY2FjaGUgPSAxOwotCQlpZiAoZ2V0X3Byb3BlcnR5KG5wLCAiY2FjaGUtdW5pZmllZCIsIE5VTEwpICE9IDAgJiYgZGMpIHsKKwkJaWYgKG9mX2dldF9wcm9wZXJ0eShucCwgImNhY2hlLXVuaWZpZWQiLCBOVUxMKSAhPSAwICYmIGRjKSB7CiAJCQlzZXFfcHJpbnRmKG0sICIgJWRLIHVuaWZpZWQiLCAqZGMgLyAxMDI0KTsKIAkJfSBlbHNlIHsKIAkJCWlmIChpYykKQEAgLTE3Nyw3ICsxNzgsNyBAQAogCQkJCXNlcV9wcmludGYobSwgIiVzICVkSyBkYXRhIiwKIAkJCQkJICAgKGljPyAiICsiOiAiIiksICpkYyAvIDEwMjQpOwogCQl9Ci0JCXBwID0gZ2V0X3Byb3BlcnR5KG5wLCAicmFtLXR5cGUiLCBOVUxMKTsKKwkJcHAgPSBvZl9nZXRfcHJvcGVydHkobnAsICJyYW0tdHlwZSIsIE5VTEwpOwogCQlpZiAocHApCiAJCQlzZXFfcHJpbnRmKG0sICIgJXMiLCBwcCk7CiAJCXNlcV9wcmludGYobSwgIlxuIik7CkBAIC0xOTIsOCArMTkzLDExIEBACiAjaWZuZGVmIENPTkZJR19BREJfQ1VEQQogaW50IGZpbmRfdmlhX2N1ZGEodm9pZCkKIHsKLQlpZiAoIWZpbmRfZGV2aWNlcygidmlhLWN1ZGEiKSkKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuID0gb2ZfZmluZF9ub2RlX2J5X25hbWUoTlVMTCwgInZpYS1jdWRhIik7CisKKwlpZiAoIWRuKQogCQlyZXR1cm4gMDsKKwlvZl9ub2RlX3B1dChkbik7CiAJcHJpbnRrKCJXQVJOSU5HICEgWW91ciBtYWNoaW5lIGlzIENVREEtYmFzZWQgYnV0IHlvdXIga2VybmVsXG4iKTsKIAlwcmludGsoIiAgICAgICAgICB3YXNuJ3QgY29tcGlsZWQgd2l0aCBDT05GSUdfQURCX0NVREEgb3B0aW9uICFcbiIpOwogCXJldHVybiAwOwpAQCAtMjAzLDggKzIwNywxMSBAQAogI2lmbmRlZiBDT05GSUdfQURCX1BNVQogaW50IGZpbmRfdmlhX3BtdSh2b2lkKQogewotCWlmICghZmluZF9kZXZpY2VzKCJ2aWEtcG11IikpCisJc3RydWN0IGRldmljZV9ub2RlICpkbiA9IG9mX2ZpbmRfbm9kZV9ieV9uYW1lKE5VTEwsICJ2aWEtcG11Iik7CisKKwlpZiAoIWRuKQogCQlyZXR1cm4gMDsKKwlvZl9ub2RlX3B1dChkbik7CiAJcHJpbnRrKCJXQVJOSU5HICEgWW91ciBtYWNoaW5lIGlzIFBNVS1iYXNlZCBidXQgeW91ciBrZXJuZWxcbiIpOwogCXByaW50aygiICAgICAgICAgIHdhc24ndCBjb21waWxlZCB3aXRoIENPTkZJR19BREJfUE1VIG9wdGlvbiAhXG4iKTsKIAlyZXR1cm4gMDsKQEAgLTIyNCw2ICsyMzEsOCBAQAogCiBzdGF0aWMgdm9pZCBfX2luaXQgb2hhcmVfaW5pdCh2b2lkKQogeworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZG47CisKIAkvKiB0aGlzIGFyZWEgaGFzIHRoZSBDUFUgaWRlbnRpZmljYXRpb24gcmVnaXN0ZXIKIAkgICBhbmQgc29tZSByZWdpc3RlcnMgdXNlZCBieSBzbXAgYm9hcmRzICovCiAJc3lzY3RybF9yZWdzID0gKHZvbGF0aWxlIHUzMiAqKSBpb3JlbWFwKDB4ZjgwMDAwMDAsIDB4MTAwMCk7CkBAIC0yMzMsNyArMjQyLDkgQEAKIAkgKiBXZSBhc3N1bWUgdGhhdCB3ZSBoYXZlIGEgUFNYIG1lbW9yeSBjb250cm9sbGVyIGlmZgogCSAqIHdlIGhhdmUgYW4gb2hhcmUgSS9PIGNvbnRyb2xsZXIuCiAJICovCi0JaWYgKGZpbmRfZGV2aWNlcygib2hhcmUiKSAhPSBOVUxMKSB7CisJZG4gPSBvZl9maW5kX25vZGVfYnlfbmFtZShOVUxMLCAib2hhcmUiKTsKKwlpZiAoZG4pIHsKKwkJb2Zfbm9kZV9wdXQoZG4pOwogCQlpZiAoKChzeXNjdHJsX3JlZ3NbMl0gPj4gMjQpICYgMHhmKSA+PSAzKSB7CiAJCQlpZiAoc3lzY3RybF9yZWdzWzRdICYgMHgxMCkKIAkJCQlzeXNjdHJsX3JlZ3NbNF0gfD0gMHgwNDAwMDAyMDsKQEAgLTI0OSwxOCArMjYwLDE5IEBACiB7CiAJLyogQ2hlY2tzICJsMmNyLXZhbHVlIiBwcm9wZXJ0eSBpbiB0aGUgcmVnaXN0cnkgKi8KIAlpZiAoY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfTDJDUikpIHsKLQkJc3RydWN0IGRldmljZV9ub2RlICpucCA9IGZpbmRfZGV2aWNlcygiY3B1cyIpOworCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gb2ZfZmluZF9ub2RlX2J5X25hbWUoTlVMTCwgImNwdXMiKTsKIAkJaWYgKG5wID09IDApCi0JCQlucCA9IGZpbmRfdHlwZV9kZXZpY2VzKCJjcHUiKTsKKwkJCW5wID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUoTlVMTCwgImNwdSIpOwogCQlpZiAobnAgIT0gMCkgewogCQkJY29uc3QgdW5zaWduZWQgaW50ICpsMmNyID0KLQkJCQlnZXRfcHJvcGVydHkobnAsICJsMmNyLXZhbHVlIiwgTlVMTCk7CisJCQkJb2ZfZ2V0X3Byb3BlcnR5KG5wLCAibDJjci12YWx1ZSIsIE5VTEwpOwogCQkJaWYgKGwyY3IgIT0gMCkgewogCQkJCXBwY19vdmVycmlkZV9sMmNyID0gMTsKIAkJCQlwcGNfb3ZlcnJpZGVfbDJjcl92YWx1ZSA9ICpsMmNyOwogCQkJCV9zZXRfTDJDUigwKTsKIAkJCQlfc2V0X0wyQ1IocHBjX292ZXJyaWRlX2wyY3JfdmFsdWUpOwogCQkJfQorCQkJb2Zfbm9kZV9wdXQobnApOwogCQl9CiAJfQogCkBAIC0yODYsNyArMjk4LDcgQEAKIAlsb29wc19wZXJfamlmZnkgPSA1MDAwMDAwMCAvIEhaOwogCWNwdSA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKE5VTEwsICJjcHUiKTsKIAlpZiAoY3B1ICE9IE5VTEwpIHsKLQkJZnAgPSBnZXRfcHJvcGVydHkoY3B1LCAiY2xvY2stZnJlcXVlbmN5IiwgTlVMTCk7CisJCWZwID0gb2ZfZ2V0X3Byb3BlcnR5KGNwdSwgImNsb2NrLWZyZXF1ZW5jeSIsIE5VTEwpOwogCQlpZiAoZnAgIT0gTlVMTCkgewogCQkJaWYgKHB2ciA+PSAweDMwICYmIHB2ciA8IDB4ODApCiAJCQkJLyogUFBDOTcwIGV0Yy4gKi8KQEAgLTMwMyw3ICszMTUsNyBAQAogCiAJLyogU2VlIGlmIG5ld3dvcmxkIG9yIG9sZHdvcmxkICovCiAJZm9yIChpYyA9IE5VTEw7IChpYyA9IG9mX2ZpbmRfYWxsX25vZGVzKGljKSkgIT0gTlVMTDsgKQotCQlpZiAoZ2V0X3Byb3BlcnR5KGljLCAiaW50ZXJydXB0LWNvbnRyb2xsZXIiLCBOVUxMKSkKKwkJaWYgKG9mX2dldF9wcm9wZXJ0eShpYywgImludGVycnVwdC1jb250cm9sbGVyIiwgTlVMTCkpCiAJCQlicmVhazsKIAlpZiAoaWMpIHsKIAkJcG1hY19uZXd3b3JsZCA9IDE7CkBAIC0zNDEsOCArMzUzLDE1IEBACiAKICNpZmRlZiBDT05GSUdfU01QCiAJLyogQ2hlY2sgZm9yIENvcmU5OSAqLwotCWlmIChmaW5kX2RldmljZXMoInVuaS1uIikgfHwgZmluZF9kZXZpY2VzKCJ1MyIpIHx8IGZpbmRfZGV2aWNlcygidTQiKSkKKwlpYyA9IG9mX2ZpbmRfbm9kZV9ieV9uYW1lKE5VTEwsICJ1bmktbiIpOworCWlmICghaWMpCisJCWljID0gb2ZfZmluZF9ub2RlX2J5X25hbWUoTlVMTCwgInUzIik7CisJaWYgKCFpYykKKwkJaWMgPSBvZl9maW5kX25vZGVfYnlfbmFtZShOVUxMLCAidTQiKTsKKwlpZiAoaWMpIHsKKwkJb2Zfbm9kZV9wdXQoaWMpOwogCQlzbXBfb3BzID0gJmNvcmU5OV9zbXBfb3BzOworCX0KICNpZmRlZiBDT05GSUdfUFBDMzIKIAllbHNlCiAJCXNtcF9vcHMgPSAmcHN1cmdlX3NtcF9vcHM7CkBAIC02MTYsMTUgKzYzNSw2IEBACiAjZW5kaWYKIH0KIAotLyoKLSAqIHBtYWMgaGFzIG5vIGxlZ2FjeSBJTywgYW55dGhpbmcgY2FsbGluZyB0aGlzIGZ1bmN0aW9uIGhhcyB0bwotICogZmFpbCBvciBiYWQgdGhpbmdzIHdpbGwgaGFwcGVuCi0gKi8KLXN0YXRpYyBpbnQgcG1hY19jaGVja19sZWdhY3lfaW9wb3J0KHVuc2lnbmVkIGludCBiYXNlcG9ydCkKLXsKLQlyZXR1cm4gLUVOT0RFVjsKLX0KLQogc3RhdGljIGludCBfX2luaXQgcG1hY19kZWNsYXJlX29mX3BsYXRmb3JtX2RldmljZXModm9pZCkKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwpAQCAtNzM2LDcgKzc0Niw2IEBACiAJLmdldF9ydGNfdGltZQkJPSBwbWFjX2dldF9ydGNfdGltZSwKIAkuY2FsaWJyYXRlX2RlY3IJCT0gcG1hY19jYWxpYnJhdGVfZGVjciwKIAkuZmVhdHVyZV9jYWxsCQk9IHBtYWNfZG9fZmVhdHVyZV9jYWxsLAotCS5jaGVja19sZWdhY3lfaW9wb3J0CT0gcG1hY19jaGVja19sZWdhY3lfaW9wb3J0LAogCS5wcm9ncmVzcwkJPSB1ZGJnX3Byb2dyZXNzLAogI2lmZGVmIENPTkZJR19QUEM2NAogCS5wY2lfcHJvYmVfbW9kZQkJPSBwbWFjX3BjaV9wcm9iZV9tb2RlLApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9zbXAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvc21wLmMKaW5kZXggZDczZmI3My4uNmYzMmM0ZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9zbXAuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3NtcC5jCkBAIC0yNjQsNiArMjY0LDcgQEAKIHN0YXRpYyBpbnQgX19pbml0IHNtcF9wc3VyZ2VfcHJvYmUodm9pZCkKIHsKIAlpbnQgaSwgbmNwdXM7CisJc3RydWN0IGRldmljZV9ub2RlICpkbjsKIAogCS8qIFdlIGRvbid0IGRvIFNNUCBvbiB0aGUgUFBDNjAxIC0tIHBhdWx1cyAqLwogCWlmIChQVlJfVkVSKG1mc3ByKFNQUk5fUFZSKSkgPT0gMSkKQEAgLTI3OSw4ICsyODAsMTAgQEAKIAkgKiBpbiB0aGUgaGFtbWVyaGVhZCBtZW1vcnkgY29udHJvbGxlciBpbiB0aGUgY2FzZSBvZiB0aGUKIAkgKiBkdWFsLWNwdSBwb3dlcnN1cmdlIGJvYXJkLiAgLS0gcGF1bHVzLgogCSAqLwotCWlmIChmaW5kX2RldmljZXMoImhhbW1lcmhlYWQiKSA9PSBOVUxMKQorCWRuID0gb2ZfZmluZF9ub2RlX2J5X25hbWUoTlVMTCwgImhhbW1lcmhlYWQiKTsKKwlpZiAoZG4gPT0gTlVMTCkKIAkJcmV0dXJuIDE7CisJb2Zfbm9kZV9wdXQoZG4pOwogCiAJaGhlYWRfYmFzZSA9IGlvcmVtYXAoSEFNTUVSSEVBRF9CQVNFLCAweDgwMCk7CiAJcXVhZF9iYXNlID0gaW9yZW1hcChQU1VSR0VfUVVBRF9SRUdfQUREUiwgMTAyNCk7CkBAIC01NjcsNyArNTcwLDcgQEAKIAkJcG1hY190Yl9jbG9ja19jaGlwX2hvc3QgPSBwbWFjX2kyY19maW5kX2J1cyhjYyk7CiAJCWlmIChwbWFjX3RiX2Nsb2NrX2NoaXBfaG9zdCA9PSBOVUxMKQogCQkJY29udGludWU7Ci0JCXJlZyA9IGdldF9wcm9wZXJ0eShjYywgInJlZyIsIE5VTEwpOworCQlyZWcgPSBvZl9nZXRfcHJvcGVydHkoY2MsICJyZWciLCBOVUxMKTsKIAkJaWYgKHJlZyA9PSBOVUxMKQogCQkJY29udGludWU7CiAJCXN3aXRjaCAoKnJlZykgewpAQCAtNjk1LDcgKzY5OCw3IEBACiAJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqY3B1cyA9CiAJCQlvZl9maW5kX25vZGVfYnlfcGF0aCgiL2NwdXMiKTsKIAkJaWYgKGNwdXMgJiYKLQkJICAgIGdldF9wcm9wZXJ0eShjcHVzLCAicGxhdGZvcm0tY3B1LXRpbWViYXNlIiwgTlVMTCkpIHsKKwkJICAgIG9mX2dldF9wcm9wZXJ0eShjcHVzLCAicGxhdGZvcm0tY3B1LXRpbWViYXNlIiwgTlVMTCkpIHsKIAkJCXBtYWNfdGJfZnJlZXplID0gc21wX2NvcmU5OV9wZnVuY190Yl9mcmVlemU7CiAJCQlwcmludGsoS0VSTl9JTkZPICJQcm9jZXNzb3IgdGltZWJhc2Ugc3luYyB1c2luZyIKIAkJCSAgICAgICAiIHBsYXRmb3JtIGZ1bmN0aW9uXG4iKTsKQEAgLTcxMiw3ICs3MTUsNyBAQAogCQljb3JlOTlfdGJfZ3BpbyA9IEtMX0dQSU9fVEJfRU5BQkxFOwkvKiBkZWZhdWx0IHZhbHVlICovCiAJCWNwdSA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKE5VTEwsICJjcHUiKTsKIAkJaWYgKGNwdSAhPSBOVUxMKSB7Ci0JCQl0YnByb3AgPSBnZXRfcHJvcGVydHkoY3B1LCAidGltZWJhc2UtZW5hYmxlIiwgTlVMTCk7CisJCQl0YnByb3AgPSBvZl9nZXRfcHJvcGVydHkoY3B1LCAidGltZWJhc2UtZW5hYmxlIiwgTlVMTCk7CiAJCQlpZiAodGJwcm9wKQogCQkJCWNvcmU5OV90Yl9ncGlvID0gKnRicHJvcDsKIAkJCW9mX25vZGVfcHV0KGNwdSk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3RpbWUuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvdGltZS5jCmluZGV4IGE0MTczOTAuLmJmOWRhNTYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvdGltZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvdGltZS5jCkBAIC0yOTcsNDkgKzI5NywxMSBAQAogfQogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfUE0KLS8qCi0gKiBSZXNldCB0aGUgdGltZSBhZnRlciBhIHNsZWVwLgotICovCi1zdGF0aWMgaW50Ci10aW1lX3NsZWVwX25vdGlmeShzdHJ1Y3QgcG11X3NsZWVwX25vdGlmaWVyICpzZWxmLCBpbnQgd2hlbikKLXsKLQlzdGF0aWMgdW5zaWduZWQgbG9uZyB0aW1lX2RpZmY7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bnNpZ25lZCBsb25nIHNlcTsKLQlzdHJ1Y3QgdGltZXNwZWMgdHY7Ci0KLQlzd2l0Y2ggKHdoZW4pIHsKLQljYXNlIFBCT09LX1NMRUVQX05PVzoKLQkJZG8gewotCQkJc2VxID0gcmVhZF9zZXFiZWdpbl9pcnFzYXZlKCZ4dGltZV9sb2NrLCBmbGFncyk7Ci0JCQl0aW1lX2RpZmYgPSB4dGltZS50dl9zZWMgLSBwbWFjX2dldF9ib290X3RpbWUoKTsKLQkJfSB3aGlsZSAocmVhZF9zZXFyZXRyeV9pcnFyZXN0b3JlKCZ4dGltZV9sb2NrLCBzZXEsIGZsYWdzKSk7Ci0JCWJyZWFrOwotCWNhc2UgUEJPT0tfV0FLRToKLQkJdHYudHZfc2VjID0gcG1hY19nZXRfYm9vdF90aW1lKCkgKyB0aW1lX2RpZmY7Ci0JCXR2LnR2X25zZWMgPSAwOwotCQlkb19zZXR0aW1lb2ZkYXkoJnR2KTsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiBQQk9PS19TTEVFUF9PSzsKLX0KLQotc3RhdGljIHN0cnVjdCBwbXVfc2xlZXBfbm90aWZpZXIgdGltZV9zbGVlcF9ub3RpZmllciA9IHsKLQl0aW1lX3NsZWVwX25vdGlmeSwgU0xFRVBfTEVWRUxfTUlTQywKLX07Ci0jZW5kaWYgLyogQ09ORklHX1BNICovCi0KIC8qCiAgKiBRdWVyeSB0aGUgT0YgYW5kIGdldCB0aGUgZGVjciBmcmVxdWVuY3kuCiAgKi8KIHZvaWQgX19pbml0IHBtYWNfY2FsaWJyYXRlX2RlY3Iodm9pZCkKIHsKLSNpZiBkZWZpbmVkKENPTkZJR19QTSkgJiYgZGVmaW5lZChDT05GSUdfQURCX1BNVSkKLQkvKiBYWFggd2h5IGhlcmU/ICovCi0JcG11X3JlZ2lzdGVyX3NsZWVwX25vdGlmaWVyKCZ0aW1lX3NsZWVwX25vdGlmaWVyKTsKLSNlbmRpZgotCiAJZ2VuZXJpY19jYWxpYnJhdGVfZGVjcigpOwogCiAjaWZkZWYgQ09ORklHX1BQQzMyCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3VkYmdfc2NjLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3VkYmdfc2NjLmMKaW5kZXggMzc5ZGIwNS4uNDdkZTRkMyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy91ZGJnX3NjYy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvdWRiZ19zY2MuYwpAQCAtODEsNyArODEsNyBAQAogCW1hY2lvID0gb2ZfZ2V0X3BhcmVudChlc2NjKTsKIAlpZiAobWFjaW8gPT0gTlVMTCkKIAkJZ290byBiYWlsOwotCXBhdGggPSBnZXRfcHJvcGVydHkob2ZfY2hvc2VuLCAibGludXgsc3Rkb3V0LXBhdGgiLCBOVUxMKTsKKwlwYXRoID0gb2ZfZ2V0X3Byb3BlcnR5KG9mX2Nob3NlbiwgImxpbnV4LHN0ZG91dC1wYXRoIiwgTlVMTCk7CiAJaWYgKHBhdGggIT0gTlVMTCkKIAkJc3Rkb3V0ID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgocGF0aCk7CiAJZm9yIChjaCA9IE5VTEw7IChjaCA9IG9mX2dldF9uZXh0X2NoaWxkKGVzY2MsIGNoKSkgIT0gTlVMTDspIHsKQEAgLTk2LDEzICs5NiwxMyBAQAogCWNoID0gY2hfZGVmID8gY2hfZGVmIDogY2hfYTsKIAogCS8qIEdldCBhZGRyZXNzIHdpdGhpbiBtYWMtaW8gQVNJQyAqLwotCXJlZyA9IGdldF9wcm9wZXJ0eShlc2NjLCAicmVnIiwgTlVMTCk7CisJcmVnID0gb2ZfZ2V0X3Byb3BlcnR5KGVzY2MsICJyZWciLCBOVUxMKTsKIAlpZiAocmVnID09IE5VTEwpCiAJCWdvdG8gYmFpbDsKIAlhZGRyID0gcmVnWzBdOwogCiAJLyogR2V0IGFkZHJlc3Mgb2YgbWFjLWlvIFBDSSBpdHNlbGYgKi8KLQlyZWcgPSBnZXRfcHJvcGVydHkobWFjaW8sICJhc3NpZ25lZC1hZGRyZXNzZXMiLCBOVUxMKTsKKwlyZWcgPSBvZl9nZXRfcHJvcGVydHkobWFjaW8sICJhc3NpZ25lZC1hZGRyZXNzZXMiLCBOVUxMKTsKIAlpZiAocmVnID09IE5VTEwpCiAJCWdvdG8gYmFpbDsKIAlhZGRyICs9IHJlZ1syXTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHJlcC9LY29uZmlnIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wcmVwL0tjb25maWcKaW5kZXggNjczYWM0Ny4uMjlkNDExMiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wcmVwL0tjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wcmVwL0tjb25maWcKQEAgLTEsMyArMSwxMiBAQAorY29uZmlnIFBQQ19QUkVQCisJYm9vbCAiUG93ZXJQQyBSZWZlcmVuY2UgUGxhdGZvcm0gKFBSZVApIGJhc2VkIG1hY2hpbmVzIgorCWRlcGVuZHMgb24gUFBDX01VTFRJUExBVEZPUk0gJiYgUFBDMzIgJiYgQlJPS0VOCisJc2VsZWN0IE1QSUMKKwlzZWxlY3QgUFBDX0k4MjU5CisJc2VsZWN0IFBQQ19JTkRJUkVDVF9QQ0kKKwlzZWxlY3QgUFBDX1VEQkdfMTY1NTAKKwlzZWxlY3QgUFBDX05BVElWRQorCWRlZmF1bHQgbgogCiBjb25maWcgUFJFUF9SRVNJRFVBTAogCWJvb2wgIlN1cHBvcnQgZm9yIFBSZVAgUmVzaWR1YWwgRGF0YSIKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL0tjb25maWcgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9LY29uZmlnCmluZGV4IDFhNDgxYTYuLjQwZjAwMDggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL0tjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvS2NvbmZpZwpAQCAtMSwzICsxLDE5IEBACitjb25maWcgUFBDX1BTMworCWJvb2wgIlNvbnkgUFMzIChpbmNvbXBsZXRlKSIKKwlkZXBlbmRzIG9uIFBQQ19NVUxUSVBMQVRGT1JNICYmIFBQQzY0CisJc2VsZWN0IFBQQ19DRUxMCisJc2VsZWN0IFVTQl9BUkNIX0hBU19PSENJCisJc2VsZWN0IFVTQl9PSENJX0xJVFRMRV9FTkRJQU4KKwlzZWxlY3QgVVNCX09IQ0lfQklHX0VORElBTl9NTUlPCisJc2VsZWN0IFVTQl9BUkNIX0hBU19FSENJCisJc2VsZWN0IFVTQl9FSENJX0JJR19FTkRJQU5fTU1JTworCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIFNvbnkgUFMzIGdhbWUgY29uc29sZQorCSAgYW5kIG90aGVyIHBsYXRmb3JtcyB1c2luZyB0aGUgUFMzIGh5cGVydmlzb3IuCisJICBTdXBwb3J0IGZvciB0aGlzIHBsYXRmb3JtIGlzIG5vdCB5ZXQgY29tcGxldGUsIHNvCisJICBlbmFibGluZyB0aGlzIHdpbGwgbm90IHJlc3VsdCBpbiBhIGJvb3RhYmxlIGtlcm5lbCBvbiBhCisJICBQUzMgc3lzdGVtLgorCiBtZW51ICJQUzMgUGxhdGZvcm0gT3B0aW9ucyIKIAlkZXBlbmRzIG9uIFBQQ19QUzMKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvaHRhYi5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvaHRhYi5jCmluZGV4IGUxMmU1OWYuLmVhNjBjNDUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL2h0YWIuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9odGFiLmMKQEAgLTM5LDcgKzM5LDcgQEAKIHN0YXRpYyB1bnNpZ25lZCBjaGFyICpib2x0dGFiOwogc3RhdGljIHVuc2lnbmVkIGNoYXIgKmludXNldGFiOwogCi1zdGF0aWMgc3BpbmxvY2tfdCBwczNfYm9sdHRhYl9sb2NrID0gU1BJTl9MT0NLX1VOTE9DS0VEOworc3RhdGljIERFRklORV9TUElOTE9DSyhwczNfYm9sdHRhYl9sb2NrKTsKIAogI2RlZmluZSBkZWJ1Z19kdW1wX2hwdGUoX2EsIF9iLCBfYywgX2QsIF9lLCBfZiwgX2cpIFwKIAlfZGVidWdfZHVtcF9ocHRlKF9hLCBfYiwgX2MsIF9kLCBfZSwgX2YsIF9nLCBfX2Z1bmNfXywgX19MSU5FX18pCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9LY29uZmlnCmluZGV4IGE1NzAzMmMuLjE2ZTRlNDAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9LY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9LY29uZmlnCkBAIC0xLDMgKzEsMTMgQEAKK2NvbmZpZyBQUENfUFNFUklFUworCWRlcGVuZHMgb24gUFBDX01VTFRJUExBVEZPUk0gJiYgUFBDNjQKKwlib29sICJJQk0gcFNlcmllcyAmIG5ldyAoUE9XRVI1LWJhc2VkKSBpU2VyaWVzIgorCXNlbGVjdCBNUElDCisJc2VsZWN0IFBQQ19JODI1OQorCXNlbGVjdCBQUENfUlRBUworCXNlbGVjdCBSVEFTX0VSUk9SX0xPR0dJTkcKKwlzZWxlY3QgUFBDX1VEQkdfMTY1NTAKKwlzZWxlY3QgUFBDX05BVElWRQorCWRlZmF1bHQgeQogCiBjb25maWcgUFBDX1NQTFBBUgogCWRlcGVuZHMgb24gUFBDX1BTRVJJRVMKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9NYWtlZmlsZQppbmRleCAyZGZkMDUwLi45MDIzNWQ1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL01ha2VmaWxlCkBAIC0yLDE0ICsyLDE1IEBACiBFWFRSQV9DRkxBR1MJCSs9IC1tbm8tbWluaW1hbC10b2MKIGVuZGlmCiAKLW9iai15CQkJOj0gcGNpLm8gbHBhci5vIGh2Q2FsbC5vIG52cmFtLm8gcmVjb25maWcubyBcCi0JCQkgICBzZXR1cC5vIGlvbW11Lm8gcmFzLm8gcnRhc2QubyBwY2lfZGxwYXIubyBcCitvYmoteQkJCTo9IGxwYXIubyBodkNhbGwubyBudnJhbS5vIHJlY29uZmlnLm8gXAorCQkJICAgc2V0dXAubyBpb21tdS5vIHJhcy5vIHJ0YXNkLm8gXAogCQkJICAgZmlybXdhcmUubyBwb3dlci5vCiBvYmotJChDT05GSUdfU01QKQkrPSBzbXAubwogb2JqLSQoQ09ORklHX1hJQ1MpCSs9IHhpY3Mubwogb2JqLSQoQ09ORklHX1NDQU5MT0cpCSs9IHNjYW5sb2cubwogb2JqLSQoQ09ORklHX0VFSCkJKz0gZWVoLm8gZWVoX2NhY2hlLm8gZWVoX2RyaXZlci5vIGVlaF9ldmVudC5vCiBvYmotJChDT05GSUdfS0VYRUMpCSs9IGtleGVjLm8KK29iai0kKENPTkZJR19QQ0kpCSs9IHBjaS5vIHBjaV9kbHBhci5vCiAKIG9iai0kKENPTkZJR19IT1RQTFVHX0NQVSkJKz0gaG90cGx1Zy1jcHUubwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZWVoLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZWVoLmMKaW5kZXggNmNlZGJjMC4uNDhmYmQ0NCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2VlaC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9lZWguYwpAQCAtNzQsNyArNzQsMTAgQEAKICAqIGlzIGJyb2tlbiBhbmQgcGFuaWMuICBUaGlzIHNldHMgdGhlIHRocmVzaG9sZCBmb3IgaG93IG1hbnkgcmVhZAogICogYXR0ZW1wdHMgd2UgYWxsb3cgYmVmb3JlIHBhbmlja2luZy4KICAqLwotI2RlZmluZSBFRUhfTUFYX0ZBSUxTCTEwMDAwMAorI2RlZmluZSBFRUhfTUFYX0ZBSUxTCTIxMDAwMDAKKworLyogVGltZSB0byB3YWl0IGZvciBhIFBDSSBzbG90IHRvIHJldHBvcnQgc3RhdHVzLCBpbiBtaWxsaXNlY29uZHMgKi8KKyNkZWZpbmUgUENJX0JVU19SRVNFVF9XQUlUX01TRUMgKDYwKjEwMDApCiAKIC8qIFJUQVMgdG9rZW5zICovCiBzdGF0aWMgaW50IGlibV9zZXRfZWVoX29wdGlvbjsKQEAgLTgzLDYgKzg2LDcgQEAKIHN0YXRpYyBpbnQgaWJtX3JlYWRfc2xvdF9yZXNldF9zdGF0ZTI7CiBzdGF0aWMgaW50IGlibV9zbG90X2Vycm9yX2RldGFpbDsKIHN0YXRpYyBpbnQgaWJtX2dldF9jb25maWdfYWRkcl9pbmZvOworc3RhdGljIGludCBpYm1fZ2V0X2NvbmZpZ19hZGRyX2luZm8yOwogc3RhdGljIGludCBpYm1fY29uZmlndXJlX2JyaWRnZTsKIAogaW50IGVlaF9zdWJzeXN0ZW1fZW5hYmxlZDsKQEAgLTE2OCw2ICsxNzIsNTUgQEAKIH0KIAogLyoqCisgKiBlZWhfd2FpdF9mb3Jfc2xvdF9zdGF0dXMgLSByZXR1cm5zIGVycm9yIHN0YXR1cyBvZiBzbG90CisgKiBAcGRuIHBjaSBkZXZpY2Ugbm9kZQorICogQG1heF93YWl0X21zZWNzIG1heGltdW0gbnVtYmVyIHRvIG1pbGxpc2VjcyB0byB3YWl0CisgKgorICogUmV0dXJuIG5lZ2F0aXZlIHZhbHVlIGlmIGEgcGVybWFuZW50IGVycm9yLCBlbHNlIHJldHVybgorICogUGFydGl0aW9uIEVuZHBvaW50IChQRSkgc3RhdHVzIHZhbHVlLgorICoKKyAqIElmIEBtYXhfd2FpdF9tc2VjcyBpcyBwb3NpdGl2ZSwgdGhlbiB0aGlzIHJvdXRpbmUgd2lsbAorICogc2xlZXAgdW50aWwgYSB2YWxpZCBzdGF0dXMgY2FuIGJlIG9idGFpbmVkLCBvciB1bnRpbAorICogdGhlIG1heCBhbGxvd2VkIHdhaXQgdGltZSBpcyBleGNlZWRlZCwgaW4gd2hpY2ggY2FzZQorICogYSAtMiBpcyByZXR1cm5lZC4KKyAqLworaW50CitlZWhfd2FpdF9mb3Jfc2xvdF9zdGF0dXMoc3RydWN0IHBjaV9kbiAqcGRuLCBpbnQgbWF4X3dhaXRfbXNlY3MpCit7CisJaW50IHJjOworCWludCByZXRzWzNdOworCWludCBtd2FpdDsKKworCXdoaWxlICgxKSB7CisJCXJjID0gcmVhZF9zbG90X3Jlc2V0X3N0YXRlKHBkbiwgcmV0cyk7CisJCWlmIChyYykgcmV0dXJuIHJjOworCQlpZiAocmV0c1sxXSA9PSAwKSByZXR1cm4gLTE7ICAvKiBFRUggaXMgbm90IHN1cHBvcnRlZCAqLworCisJCWlmIChyZXRzWzBdICE9IDUpIHJldHVybiByZXRzWzBdOyAvKiByZXR1cm4gYWN0dWFsIHN0YXR1cyAqLworCisJCWlmIChyZXRzWzJdID09IDApIHJldHVybiAtMTsgLyogcGVybWFuZW50bHkgdW5hdmFpbGFibGUgKi8KKworCQlpZiAobWF4X3dhaXRfbXNlY3MgPD0gMCkgcmV0dXJuIC0xOworCisJCW13YWl0ID0gcmV0c1syXTsKKwkJaWYgKG13YWl0IDw9IDApIHsKKwkJCXByaW50ayAoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgICJFRUg6IEZpcm13YXJlIHJldHVybmVkIGJhZCB3YWl0IHZhbHVlPSVkXG4iLCBtd2FpdCk7CisJCQltd2FpdCA9IDEwMDA7CisJCX0gZWxzZSBpZiAobXdhaXQgPiAzMDAqMTAwMCkgeworCQkJcHJpbnRrIChLRVJOX1dBUk5JTkcKKwkJCSAgICAgICAgIkVFSDogRmlybXdhcmUgaXMgdGFraW5nIHRvbyBsb25nLCB0aW1lPSVkXG4iLCBtd2FpdCk7CisJCQltd2FpdCA9IDMwMCoxMDAwOworCQl9CisJCW1heF93YWl0X21zZWNzIC09IG13YWl0OworCQltc2xlZXAgKG13YWl0KTsKKwl9CisKKwlwcmludGsoS0VSTl9XQVJOSU5HICJFRUg6IFRpbWVkIG91dCB3YWl0aW5nIGZvciBzbG90IHN0YXR1c1xuIik7CisJcmV0dXJuIC0yOworfQorCisvKioKICAqIGVlaF90b2tlbl90b19waHlzIC0gY29udmVydCBFRUggYWRkcmVzcyB0b2tlbiB0byBwaHlzIGFkZHJlc3MKICAqIEB0b2tlbiBpL28gdG9rZW4sIHNob3VsZCBiZSBhZGRyZXNzIGluIHRoZSBmb3JtIDB4QS4uLi4KICAqLwpAQCAtMjI5LDcgKzI4Miw3IEBACiAJZG4gPSBmaW5kX2RldmljZV9wZSAoZG4pOwogCiAJLyogQmFjayB1cCBvbmUsIHNpbmNlIGNvbmZpZyBhZGRycyBtaWdodCBiZSBzaGFyZWQgKi8KLQlpZiAoUENJX0ROKGRuKSAmJiBQQ0lfRE4oZG4pLT5lZWhfcGVfY29uZmlnX2FkZHIpCisJaWYgKCFwY2liaW9zX2ZpbmRfcGNpX2J1cyhkbikgJiYgUENJX0ROKGRuLT5wYXJlbnQpKQogCQlkbiA9IGRuLT5wYXJlbnQ7CiAKIAlQQ0lfRE4oZG4pLT5lZWhfbW9kZSB8PSBtb2RlX2ZsYWc7CkBAIC0yNjMsNyArMzE2LDcgQEAKIAlkbiA9IGZpbmRfZGV2aWNlX3BlIChkbik7CiAJCiAJLyogQmFjayB1cCBvbmUsIHNpbmNlIGNvbmZpZyBhZGRycyBtaWdodCBiZSBzaGFyZWQgKi8KLQlpZiAoUENJX0ROKGRuKSAmJiBQQ0lfRE4oZG4pLT5lZWhfcGVfY29uZmlnX2FkZHIpCisJaWYgKCFwY2liaW9zX2ZpbmRfcGNpX2J1cyhkbikgJiYgUENJX0ROKGRuLT5wYXJlbnQpKQogCQlkbiA9IGRuLT5wYXJlbnQ7CiAKIAlQQ0lfRE4oZG4pLT5lZWhfbW9kZSAmPSB+bW9kZV9mbGFnOwpAQCAtMjkzLDcgKzM0Niw2IEBACiAJaW50IHJldHNbM107CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgcGNpX2RuICpwZG47Ci0JZW51bSBwY2lfY2hhbm5lbF9zdGF0ZSBzdGF0ZTsKIAlpbnQgcmMgPSAwOwogCiAJdG90YWxfbW1pb19mZnMrKzsKQEAgLTM2Nyw2ICs0MTksMTQgQEAKIAkJZ290byBkbl91bmxvY2s7CiAJfQogCisJLyogTm90ZSB0aGF0IGNvbmZpZy1pbyB0byBlbXB0eSBzbG90cyBtYXkgZmFpbDsKKwkgKiB0aGV5IGFyZSBlbXB0eSB3aGVuIHRoZXkgZG9uJ3QgaGF2ZSBjaGlsZHJlbi4gKi8KKwlpZiAoKHJldHNbMF0gPT0gNSkgJiYgKGRuLT5jaGlsZCA9PSBOVUxMKSkgeworCQlmYWxzZV9wb3NpdGl2ZXMrKzsKKwkJcmMgPSAwOworCQlnb3RvIGRuX3VubG9jazsKKwl9CisKIAkvKiBJZiBFRUggaXMgbm90IHN1cHBvcnRlZCBvbiB0aGlzIGRldmljZSwgcHVudC4gKi8KIAlpZiAocmV0c1sxXSAhPSAxKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIkVFSDogZXZlbnQgb24gdW5zdXBwb3J0ZWQgZGV2aWNlLCByYz0lZCBkbj0lc1xuIiwKQEAgLTM3NywxNSArNDM3LDcgQEAKIAl9CiAKIAkvKiBJZiBub3QgdGhlIGtpbmQgb2YgZXJyb3Igd2Uga25vdyBhYm91dCwgcHVudC4gKi8KLQlpZiAocmV0c1swXSAhPSAyICYmIHJldHNbMF0gIT0gNCAmJiByZXRzWzBdICE9IDUpIHsKLQkJZmFsc2VfcG9zaXRpdmVzKys7Ci0JCXJjID0gMDsKLQkJZ290byBkbl91bmxvY2s7Ci0JfQotCi0JLyogTm90ZSB0aGF0IGNvbmZpZy1pbyB0byBlbXB0eSBzbG90cyBtYXkgZmFpbDsKLQkgKiB3ZSByZWNvZ25pemUgZW1wdHkgYmVjYXVzZSB0aGV5IGRvbid0IGhhdmUgY2hpbGRyZW4uICovCi0JaWYgKChyZXRzWzBdID09IDUpICYmIChkbi0+Y2hpbGQgPT0gTlVMTCkpIHsKKwlpZiAocmV0c1swXSAhPSAxICYmIHJldHNbMF0gIT0gMiAmJiByZXRzWzBdICE9IDQgJiYgcmV0c1swXSAhPSA1KSB7CiAJCWZhbHNlX3Bvc2l0aXZlcysrOwogCQlyYyA9IDA7CiAJCWdvdG8gZG5fdW5sb2NrOwpAQCAtMzk5LDE3ICs0NTEsMTIgQEAKIAllZWhfbWFya19zbG90IChkbiwgRUVIX01PREVfSVNPTEFURUQpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvbmZpcm1fZXJyb3JfbG9jaywgZmxhZ3MpOwogCi0Jc3RhdGUgPSBwY2lfY2hhbm5lbF9pb19ub3JtYWw7Ci0JaWYgKChyZXRzWzBdID09IDIpIHx8IChyZXRzWzBdID09IDQpKQotCQlzdGF0ZSA9IHBjaV9jaGFubmVsX2lvX2Zyb3plbjsKLQlpZiAocmV0c1swXSA9PSA1KQotCQlzdGF0ZSA9IHBjaV9jaGFubmVsX2lvX3Blcm1fZmFpbHVyZTsKLQllZWhfc2VuZF9mYWlsdXJlX2V2ZW50IChkbiwgZGV2LCBzdGF0ZSwgcmV0c1syXSk7CisJZWVoX3NlbmRfZmFpbHVyZV9ldmVudCAoZG4sIGRldik7CiAKIAkvKiBNb3N0IEVFSCBldmVudHMgYXJlIGR1ZSB0byBkZXZpY2UgZHJpdmVyIGJ1Z3MuICBIYXZpbmcKIAkgKiBhIHN0YWNrIHRyYWNlIHdpbGwgaGVscCB0aGUgZGV2aWNlLWRyaXZlciBhdXRob3JzIGZpZ3VyZQogCSAqIG91dCB3aGF0IGhhcHBlbmVkLiAgU28gcHJpbnQgdGhhdCBvdXQuICovCi0JaWYgKHJldHNbMF0gIT0gNSkgZHVtcF9zdGFjaygpOworCWR1bXBfc3RhY2soKTsKIAlyZXR1cm4gMTsKIAogZG5fdW5sb2NrOgpAQCAtNDU4LDM4ICs1MDUsNiBAQAogLyogVGhlIGNvZGUgYmVsb3cgZGVhbHMgd2l0aCBlcnJvciByZWNvdmVyeSAqLwogCiAvKioKLSAqIGVlaF9zbG90X2F2YWlsYWJpbGl0eSAtIHJldHVybnMgZXJyb3Igc3RhdHVzIG9mIHNsb3QKLSAqIEBwZG4gcGNpIGRldmljZSBub2RlCi0gKgotICogUmV0dXJuIG5lZ2F0aXZlIHZhbHVlIGlmIGEgcGVybWFuZW50IGVycm9yLCBlbHNlIHJldHVybgotICogYSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQgdW50aWwgdGhlIFBDSSBzbG90IGlzCi0gKiByZWFkeSB0byBiZSB1c2VkLgotICovCi1zdGF0aWMgaW50Ci1lZWhfc2xvdF9hdmFpbGFiaWxpdHkoc3RydWN0IHBjaV9kbiAqcGRuKQotewotCWludCByYzsKLQlpbnQgcmV0c1szXTsKLQotCXJjID0gcmVhZF9zbG90X3Jlc2V0X3N0YXRlKHBkbiwgcmV0cyk7Ci0KLQlpZiAocmMpIHJldHVybiByYzsKLQotCWlmIChyZXRzWzFdID09IDApIHJldHVybiAtMTsgIC8qIEVFSCBpcyBub3Qgc3VwcG9ydGVkICovCi0JaWYgKHJldHNbMF0gPT0gMCkgcmV0dXJuIDA7ICAgLyogT2xsIEtvcnJlY3QgKi8KLQlpZiAocmV0c1swXSA9PSA1KSB7Ci0JCWlmIChyZXRzWzJdID09IDApIHJldHVybiAtMTsgLyogcGVybWFuZW50bHkgdW5hdmFpbGFibGUgKi8KLQkJcmV0dXJuIHJldHNbMl07IC8qIG51bWJlciBvZiBtaWxsaXNlY3MgdG8gd2FpdCAqLwotCX0KLQlpZiAocmV0c1swXSA9PSAxKQotCQlyZXR1cm4gMjUwOwotCi0JcHJpbnRrIChLRVJOX0VSUiAiRUVIOiBTbG90IHVuYXZhaWxhYmxlOiByYz0lZCwgcmV0cz0lZCAlZCAlZFxuIiwKLQkJcmMsIHJldHNbMF0sIHJldHNbMV0sIHJldHNbMl0pOwotCXJldHVybiAtMjsKLX0KLQotLyoqCiAgKiBydGFzX3BjaV9lbmFibGUgLSBlbmFibGUgTU1JTyBvciBETUEgdHJhbnNmZXJzIGZvciB0aGlzIHNsb3QKICAqIEBwZG4gcGNpIGRldmljZSBub2RlCiAgKi8KQEAgLTUxMiw5ICs1MjcsMTMgQEAKIAkJICAgICAgICAgICAgZnVuY3Rpb24pOwogCiAJaWYgKHJjKQotCQlwcmludGsoS0VSTl9XQVJOSU5HICJFRUg6IENhbm5vdCBlbmFibGUgZnVuY3Rpb24gJWQsIGVycj0lZCBkbj0lc1xuIiwKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiRUVIOiBVbmV4cGVjdGVkIHN0YXRlIGNoYW5nZSAlZCwgZXJyPSVkIGRuPSVzXG4iLAogCQkgICAgICAgIGZ1bmN0aW9uLCByYywgcGRuLT5ub2RlLT5mdWxsX25hbWUpOwogCisJcmMgPSBlZWhfd2FpdF9mb3Jfc2xvdF9zdGF0dXMgKHBkbiwgUENJX0JVU19SRVNFVF9XQUlUX01TRUMpOworCWlmICgocmMgPT0gNCkgJiYgKGZ1bmN0aW9uID09IEVFSF9USEFXX01NSU8pKQorCQlyZXR1cm4gMDsKKwogCXJldHVybiByYzsKIH0KIApAQCAtNTk1LDM2ICs2MTQsMjQgQEAKIHsKIAlpbnQgaSwgcmM7CiAKLQlfX3J0YXNfc2V0X3Nsb3RfcmVzZXQocGRuKTsKKwkvKiBUYWtlIHRocmVlIHNob3RzIGF0IHJlc2V0dGluZyB0aGUgYnVzICovCisJZm9yIChpPTA7IGk8MzsgaSsrKSB7CisJCV9fcnRhc19zZXRfc2xvdF9yZXNldChwZG4pOwogCi0JLyogTm93IGRvdWJsZSBjaGVjayB3aXRoIHRoZSBmaXJtd2FyZSB0byBtYWtlIHN1cmUgdGhlIGRldmljZSBpcwotCSAqIHJlYWR5IHRvIGJlIHVzZWQ7IGlmIG5vdCwgd2FpdCBmb3IgcmVjb3ZlcnkuICovCi0JZm9yIChpPTA7IGk8MTA7IGkrKykgewotCQlyYyA9IGVlaF9zbG90X2F2YWlsYWJpbGl0eSAocGRuKTsKKwkJcmMgPSBlZWhfd2FpdF9mb3Jfc2xvdF9zdGF0dXMocGRuLCBQQ0lfQlVTX1JFU0VUX1dBSVRfTVNFQyk7CiAJCWlmIChyYyA9PSAwKQogCQkJcmV0dXJuIDA7CiAKLQkJaWYgKHJjID09IC0yKSB7Ci0JCQlwcmludGsgKEtFUk5fRVJSICJFRUg6IGZhaWxlZCAoJWQpIHRvIHJlc2V0IHNsb3QgJXNcbiIsCi0JCQkgICAgICAgIGksIHBkbi0+bm9kZS0+ZnVsbF9uYW1lKTsKLQkJCV9fcnRhc19zZXRfc2xvdF9yZXNldChwZG4pOwotCQkJY29udGludWU7Ci0JCX0KLQogCQlpZiAocmMgPCAwKSB7CiAJCQlwcmludGsgKEtFUk5fRVJSICJFRUg6IHVucmVjb3ZlcmFibGUgc2xvdCBmYWlsdXJlICVzXG4iLAogCQkJICAgICAgICBwZG4tPm5vZGUtPmZ1bGxfbmFtZSk7CiAJCQlyZXR1cm4gLTE7CiAJCX0KLQotCQltc2xlZXAgKHJjKzEwMCk7CisJCXByaW50ayAoS0VSTl9FUlIgIkVFSDogYnVzIHJlc2V0ICVkIGZhaWxlZCBvbiBzbG90ICVzXG4iLAorCQkgICAgICAgIGkrMSwgcGRuLT5ub2RlLT5mdWxsX25hbWUpOwogCX0KIAotCXJjID0gZWVoX3Nsb3RfYXZhaWxhYmlsaXR5IChwZG4pOwotCWlmIChyYykKLQkJcHJpbnRrIChLRVJOX0VSUiAiRUVIOiB0aW1lb3V0IHJlc2V0dGluZyBzbG90ICVzXG4iLCBwZG4tPm5vZGUtPmZ1bGxfbmFtZSk7Ci0KLQlyZXR1cm4gcmM7CisJcmV0dXJuIC0xOwogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC03NDQsMTYgKzc1MSw0OCBAQAogCXVuc2lnbmVkIGludCBidWlkX2xvOwogfTsKIAorc3RhdGljIGludCBnZXRfcGVfYWRkciAoaW50IGNvbmZpZ19hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGVlaF9lYXJseV9lbmFibGVfaW5mbyAqaW5mbykKK3sKKwl1bnNpZ25lZCBpbnQgcmV0c1szXTsKKwlpbnQgcmV0OworCisJLyogVXNlIGxhdGVzdCBjb25maWctYWRkciB0b2tlbiBvbiBwb3dlcjYgKi8KKwlpZiAoaWJtX2dldF9jb25maWdfYWRkcl9pbmZvMiAhPSBSVEFTX1VOS05PV05fU0VSVklDRSkgeworCQkvKiBNYWtlIHN1cmUgd2UgaGF2ZSBhIFBFIGluIGhhbmQgKi8KKwkJcmV0ID0gcnRhc19jYWxsIChpYm1fZ2V0X2NvbmZpZ19hZGRyX2luZm8yLCA0LCAyLCByZXRzLAorCQkJY29uZmlnX2FkZHIsIGluZm8tPmJ1aWRfaGksIGluZm8tPmJ1aWRfbG8sIDEpOworCQlpZiAocmV0IHx8IChyZXRzWzBdPT0wKSkKKwkJCXJldHVybiAwOworCisJCXJldCA9IHJ0YXNfY2FsbCAoaWJtX2dldF9jb25maWdfYWRkcl9pbmZvMiwgNCwgMiwgcmV0cywKKwkJCWNvbmZpZ19hZGRyLCBpbmZvLT5idWlkX2hpLCBpbmZvLT5idWlkX2xvLCAwKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiAwOworCQlyZXR1cm4gcmV0c1swXTsKKwl9CisKKwkvKiBVc2Ugb2xkZXIgY29uZmlnLWFkZHIgdG9rZW4gb24gcG93ZXI1ICovCisJaWYgKGlibV9nZXRfY29uZmlnX2FkZHJfaW5mbyAhPSBSVEFTX1VOS05PV05fU0VSVklDRSkgeworCQlyZXQgPSBydGFzX2NhbGwgKGlibV9nZXRfY29uZmlnX2FkZHJfaW5mbywgNCwgMiwgcmV0cywKKwkJCWNvbmZpZ19hZGRyLCBpbmZvLT5idWlkX2hpLCBpbmZvLT5idWlkX2xvLCAwKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiAwOworCQlyZXR1cm4gcmV0c1swXTsKKwl9CisJcmV0dXJuIDA7Cit9CisKIC8qIEVuYWJsZSBlZWggZm9yIHRoZSBnaXZlbiBkZXZpY2Ugbm9kZS4gKi8KIHN0YXRpYyB2b2lkICplYXJseV9lbmFibGVfZWVoKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZG4sIHZvaWQgKmRhdGEpCiB7CiAJdW5zaWduZWQgaW50IHJldHNbM107CiAJc3RydWN0IGVlaF9lYXJseV9lbmFibGVfaW5mbyAqaW5mbyA9IGRhdGE7CiAJaW50IHJldDsKLQljb25zdCBjaGFyICpzdGF0dXMgPSBnZXRfcHJvcGVydHkoZG4sICJzdGF0dXMiLCBOVUxMKTsKLQljb25zdCB1MzIgKmNsYXNzX2NvZGUgPSBnZXRfcHJvcGVydHkoZG4sICJjbGFzcy1jb2RlIiwgTlVMTCk7Ci0JY29uc3QgdTMyICp2ZW5kb3JfaWQgPSBnZXRfcHJvcGVydHkoZG4sICJ2ZW5kb3ItaWQiLCBOVUxMKTsKLQljb25zdCB1MzIgKmRldmljZV9pZCA9IGdldF9wcm9wZXJ0eShkbiwgImRldmljZS1pZCIsIE5VTEwpOworCWNvbnN0IGNoYXIgKnN0YXR1cyA9IG9mX2dldF9wcm9wZXJ0eShkbiwgInN0YXR1cyIsIE5VTEwpOworCWNvbnN0IHUzMiAqY2xhc3NfY29kZSA9IG9mX2dldF9wcm9wZXJ0eShkbiwgImNsYXNzLWNvZGUiLCBOVUxMKTsKKwljb25zdCB1MzIgKnZlbmRvcl9pZCA9IG9mX2dldF9wcm9wZXJ0eShkbiwgInZlbmRvci1pZCIsIE5VTEwpOworCWNvbnN0IHUzMiAqZGV2aWNlX2lkID0gb2ZfZ2V0X3Byb3BlcnR5KGRuLCAiZGV2aWNlLWlkIiwgTlVMTCk7CiAJY29uc3QgdTMyICpyZWdzOwogCWludCBlbmFibGU7CiAJc3RydWN0IHBjaV9kbiAqcGRuID0gUENJX0ROKGRuKTsKQEAgLTc5Niw3ICs4MzUsNyBAQAogCiAJLyogT2suLi4gc2VlIGlmIHRoaXMgZGV2aWNlIHN1cHBvcnRzIEVFSC4gIFNvbWUgZG8sIHNvbWUgZG9uJ3QsCiAJICogYW5kIHRoZSBvbmx5IHdheSB0byBmaW5kIG91dCBpcyB0byBjaGVjayBlYWNoIGFuZCBldmVyeSBvbmUuICovCi0JcmVncyA9IGdldF9wcm9wZXJ0eShkbiwgInJlZyIsIE5VTEwpOworCXJlZ3MgPSBvZl9nZXRfcHJvcGVydHkoZG4sICJyZWciLCBOVUxMKTsKIAlpZiAocmVncykgewogCQkvKiBGaXJzdCByZWdpc3RlciBlbnRyeSBpcyBhZGRyICgwMEJCU1MwMCkgICovCiAJCS8qIFRyeSB0byBlbmFibGUgZWVoICovCkBAIC04MTAsMTUgKzg0OSw3IEBACiAKIAkJCS8qIElmIHRoZSBuZXdlciwgYmV0dGVyLCBpYm0sZ2V0LWNvbmZpZy1hZGRyLWluZm8gaXMgc3VwcG9ydGVkLCAKIAkJCSAqIHRoZW4gdXNlIHRoYXQgaW5zdGVhZC4gKi8KLQkJCXBkbi0+ZWVoX3BlX2NvbmZpZ19hZGRyID0gMDsKLQkJCWlmIChpYm1fZ2V0X2NvbmZpZ19hZGRyX2luZm8gIT0gUlRBU19VTktOT1dOX1NFUlZJQ0UpIHsKLQkJCQlyZXQgPSBydGFzX2NhbGwgKGlibV9nZXRfY29uZmlnX2FkZHJfaW5mbywgNCwgMiwgcmV0cywgCi0JCQkJCXBkbi0+ZWVoX2NvbmZpZ19hZGRyLCAKLQkJCQkJaW5mby0+YnVpZF9oaSwgaW5mby0+YnVpZF9sbywKLQkJCQkJMCk7Ci0JCQkJaWYgKHJldCA9PSAwKQotCQkJCQlwZG4tPmVlaF9wZV9jb25maWdfYWRkciA9IHJldHNbMF07Ci0JCQl9CisJCQlwZG4tPmVlaF9wZV9jb25maWdfYWRkciA9IGdldF9wZV9hZGRyKHBkbi0+ZWVoX2NvbmZpZ19hZGRyLCBpbmZvKTsKIAogCQkJLyogU29tZSBvbGRlciBzeXN0ZW1zIChQb3dlcjQpIGFsbG93IHRoZQogCQkJICogaWJtLHNldC1lZWgtb3B0aW9uIGNhbGwgdG8gc3VjY2VlZCBldmVuIG9uIG5vZGVzCkBAIC04ODksNiArOTIwLDcgQEAKIAlpYm1fcmVhZF9zbG90X3Jlc2V0X3N0YXRlID0gcnRhc190b2tlbigiaWJtLHJlYWQtc2xvdC1yZXNldC1zdGF0ZSIpOwogCWlibV9zbG90X2Vycm9yX2RldGFpbCA9IHJ0YXNfdG9rZW4oImlibSxzbG90LWVycm9yLWRldGFpbCIpOwogCWlibV9nZXRfY29uZmlnX2FkZHJfaW5mbyA9IHJ0YXNfdG9rZW4oImlibSxnZXQtY29uZmlnLWFkZHItaW5mbyIpOworCWlibV9nZXRfY29uZmlnX2FkZHJfaW5mbzIgPSBydGFzX3Rva2VuKCJpYm0sZ2V0LWNvbmZpZy1hZGRyLWluZm8yIik7CiAJaWJtX2NvbmZpZ3VyZV9icmlkZ2UgPSBydGFzX3Rva2VuICgiaWJtLGNvbmZpZ3VyZS1icmlkZ2UiKTsKIAogCWlmIChpYm1fc2V0X2VlaF9vcHRpb24gPT0gUlRBU19VTktOT1dOX1NFUlZJQ0UpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZWVoX2RyaXZlci5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2VlaF9kcml2ZXIuYwppbmRleCBhNGMwYmY4Li4zMTcwZTAwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZWVoX2RyaXZlci5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9lZWhfZHJpdmVyLmMKQEAgLTE1OCw3ICsxNTgsOCBAQAogCQlyZXR1cm47CiAKIAlyYyA9IGRyaXZlci0+ZXJyX2hhbmRsZXItPnNsb3RfcmVzZXQoZGV2KTsKLQlpZiAoKnJlcyA9PSBQQ0lfRVJTX1JFU1VMVF9OT05FKSAqcmVzID0gcmM7CisJaWYgKCgqcmVzID09IFBDSV9FUlNfUkVTVUxUX05PTkUpIHx8CisJICAgICgqcmVzID09IFBDSV9FUlNfUkVTVUxUX1JFQ09WRVJFRCkpICpyZXMgPSByYzsKIAlpZiAoKnJlcyA9PSBQQ0lfRVJTX1JFU1VMVF9ESVNDT05ORUNUICYmCiAJICAgICByYyA9PSBQQ0lfRVJTX1JFU1VMVF9ORUVEX1JFU0VUKSAqcmVzID0gcmM7CiB9CkBAIC0yNDgsNiArMjQ5LDcgQEAKIAogc3RhdGljIGludCBlZWhfcmVzZXRfZGV2aWNlIChzdHJ1Y3QgcGNpX2RuICpwZV9kbiwgc3RydWN0IHBjaV9idXMgKmJ1cykKIHsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuOwogCWludCBjbnQsIHJjOwogCiAJLyogcGNpYmlvcyB3aWxsIGNsZWFyIHRoZSBjb3VudGVyOyBzYXZlIHRoZSB2YWx1ZSAqLwpAQCAtMjYzLDIzICsyNjUsMjAgQEAKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIAotIAkvKiBOZXctc3R5bGUgY29uZmlnIGFkZHJzIG1pZ2h0IGJlIHNoYXJlZCBhY3Jvc3MgbXVsdGlwbGUgZGV2aWNlcywKLSAJICogV2FsayBvdmVyIGFsbCBmdW5jdGlvbnMgb24gdGhpcyBkZXZpY2UgKi8KLSAJaWYgKHBlX2RuLT5lZWhfcGVfY29uZmlnX2FkZHIpIHsKLSAJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcGUgPSBwZV9kbi0+bm9kZTsKLSAJCXBlID0gcGUtPnBhcmVudC0+Y2hpbGQ7Ci0gCQl3aGlsZSAocGUpIHsKLSAJCQlzdHJ1Y3QgcGNpX2RuICpwcGUgPSBQQ0lfRE4ocGUpOwotIAkJCWlmIChwZV9kbi0+ZWVoX3BlX2NvbmZpZ19hZGRyID09IHBwZS0+ZWVoX3BlX2NvbmZpZ19hZGRyKSB7Ci0gCQkJCXJ0YXNfY29uZmlndXJlX2JyaWRnZShwcGUpOwotIAkJCQllZWhfcmVzdG9yZV9iYXJzKHBwZSk7Ci0gCQkJfQotIAkJCXBlID0gcGUtPnNpYmxpbmc7CisJLyogV2FsayBvdmVyIGFsbCBmdW5jdGlvbnMgb24gdGhpcyBkZXZpY2UuICAqLworCWRuID0gcGVfZG4tPm5vZGU7CisJaWYgKCFwY2liaW9zX2ZpbmRfcGNpX2J1cyhkbikgJiYgUENJX0ROKGRuLT5wYXJlbnQpKQorCQlkbiA9IGRuLT5wYXJlbnQtPmNoaWxkOworCisJd2hpbGUgKGRuKSB7CisJCXN0cnVjdCBwY2lfZG4gKnBwZSA9IFBDSV9ETihkbik7CisJCS8qIE9uIFBvd2VyNCwgYWx3YXlzIHRydWUgYmVjYXVzZSBlZWhfcGVfY29uZmlnX2FkZHI9MCAqLworCQlpZiAocGVfZG4tPmVlaF9wZV9jb25maWdfYWRkciA9PSBwcGUtPmVlaF9wZV9jb25maWdfYWRkcikgeworCQkJcnRhc19jb25maWd1cmVfYnJpZGdlKHBwZSk7CisJCQllZWhfcmVzdG9yZV9iYXJzKHBwZSk7CiAgCQl9Ci0gCX0gZWxzZSB7Ci0gCQlydGFzX2NvbmZpZ3VyZV9icmlkZ2UocGVfZG4pOwotIAkJZWVoX3Jlc3RvcmVfYmFycyhwZV9kbik7Ci0gCX0KKwkJZG4gPSBkbi0+c2libGluZzsKKwl9CiAKIAkvKiBHaXZlIHRoZSBzeXN0ZW0gNSBzZWNvbmRzIHRvIGZpbmlzaCBydW5uaW5nIHRoZSB1c2VyLXNwYWNlCiAJICogaG90cGx1ZyBzaHV0ZG93biBzY3JpcHRzLCBlLmcuIGlmZG93biBmb3IgZXRoZXJuZXQuICBZZXMsIApAQCAtMjk5LDcgKzI5OCw3IEBACiAvKiBUaGUgbG9uZ2VzdCBhbW91bnQgb2YgdGltZSB0byB3YWl0IGZvciBhIHBjaSBkZXZpY2UKICAqIHRvIGNvbWUgYmFjayBvbiBsaW5lLCBpbiBzZWNvbmRzLgogICovCi0jZGVmaW5lIE1BWF9XQUlUX0ZPUl9SRUNPVkVSWSAxNQorI2RlZmluZSBNQVhfV0FJVF9GT1JfUkVDT1ZFUlkgMTUwCiAKIHN0cnVjdCBwY2lfZG4gKiBoYW5kbGVfZWVoX2V2ZW50cyAoc3RydWN0IGVlaF9ldmVudCAqZXZlbnQpCiB7CkBAIC0zMTUsMTQgKzMxNCwxNCBAQAogCiAJaWYgKCFmcm96ZW5fZG4pIHsKIAotCQlsb2NhdGlvbiA9IGdldF9wcm9wZXJ0eShldmVudC0+ZG4sICJpYm0sbG9jLWNvZGUiLCBOVUxMKTsKKwkJbG9jYXRpb24gPSBvZl9nZXRfcHJvcGVydHkoZXZlbnQtPmRuLCAiaWJtLGxvYy1jb2RlIiwgTlVMTCk7CiAJCWxvY2F0aW9uID0gbG9jYXRpb24gPyBsb2NhdGlvbiA6ICJ1bmtub3duIjsKIAkJcHJpbnRrKEtFUk5fRVJSICJFRUg6IEVycm9yOiBDYW5ub3QgZmluZCBwYXJ0aXRpb24gZW5kcG9pbnQgIgogCQkgICAgICAgICAgICAgICAgImZvciBsb2NhdGlvbj0lcyBwY2kgYWRkcj0lc1xuIiwKIAkJICAgICAgICBsb2NhdGlvbiwgcGNpX25hbWUoZXZlbnQtPmRldikpOwogCQlyZXR1cm4gTlVMTDsKIAl9Ci0JbG9jYXRpb24gPSBnZXRfcHJvcGVydHkoZnJvemVuX2RuLCAiaWJtLGxvYy1jb2RlIiwgTlVMTCk7CisJbG9jYXRpb24gPSBvZl9nZXRfcHJvcGVydHkoZnJvemVuX2RuLCAiaWJtLGxvYy1jb2RlIiwgTlVMTCk7CiAJbG9jYXRpb24gPSBsb2NhdGlvbiA/IGxvY2F0aW9uIDogInVua25vd24iOwogCiAJLyogVGhlcmUgYXJlIHR3byBkaWZmZXJlbnQgc3R5bGVzIGZvciBjb21pbmcgdXAgd2l0aCB0aGUgUEUuCkBAIC0zNDEsMTMgKzM0MCw2IEBACiAJCXJldHVybiBOVUxMOwogCX0KIAotI2lmIDAKLQkvKiBXZSBtYXkgZ2V0ICJwZXJtYW5lbnQgZmFpbHVyZSIgbWVzc2FnZXMgb24gZW1wdHkgc2xvdHMuCi0JICogVGhlc2UgYXJlIGZhbHNlIGFsYXJtcy4gRW1wdHkgc2xvdHMgaGF2ZSBubyBjaGlsZCBkbi4gKi8KLQlpZiAoKGV2ZW50LT5zdGF0ZSA9PSBwY2lfY2hhbm5lbF9pb19wZXJtX2ZhaWx1cmUpICYmIChmcm96ZW5fZGV2aWNlID09IE5VTEwpKQotCQlyZXR1cm47Ci0jZW5kaWYKLQogCWZyb3plbl9wZG4gPSBQQ0lfRE4oZnJvemVuX2RuKTsKIAlmcm96ZW5fcGRuLT5lZWhfZnJlZXplX2NvdW50Kys7CiAKQEAgLTM2MiwxMyArMzU0LDEyIEBACiAJaWYgKGZyb3plbl9wZG4tPmVlaF9mcmVlemVfY291bnQgPiBFRUhfTUFYX0FMTE9XRURfRlJFRVpFUykKIAkJZ290byBleGNlc3NfZmFpbHVyZXM7CiAKLQkvKiBJZiB0aGUgcmVzZXQgc3RhdGUgaXMgYSAnNScgYW5kIHRoZSB0aW1lIHRvIHJlc2V0IGlzIDAgKGluZmluaXR5KQotCSAqIG9yIGlzIG1vcmUgdGhlbiAxNSBzZWNvbmRzLCB0aGVuIG1hcmsgdGhpcyBhcyBhIHBlcm1hbmVudCBmYWlsdXJlLgotCSAqLwotCWlmICgoZXZlbnQtPnN0YXRlID09IHBjaV9jaGFubmVsX2lvX3Blcm1fZmFpbHVyZSkgJiYKLQkgICAgKChldmVudC0+dGltZV91bmF2YWlsIDw9IDApIHx8Ci0JICAgICAoZXZlbnQtPnRpbWVfdW5hdmFpbCA+IE1BWF9XQUlUX0ZPUl9SRUNPVkVSWSoxMDAwKSkpCisJLyogR2V0IHRoZSBjdXJyZW50IFBDSSBzbG90IHN0YXRlLiAqLworCXJjID0gZWVoX3dhaXRfZm9yX3Nsb3Rfc3RhdHVzIChmcm96ZW5fcGRuLCBNQVhfV0FJVF9GT1JfUkVDT1ZFUlkqMTAwMCk7CisJaWYgKHJjIDwgMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJFRUg6IFBlcm1hbmVudCBmYWlsdXJlXG4iKTsKIAkJZ290byBoYXJkX2ZhaWw7CisJfQogCiAJZWVoX3Nsb3RfZXJyb3JfZGV0YWlsKGZyb3plbl9wZG4sIDEgLyogVGVtcG9yYXJ5IEVycm9yICovKTsKIAlwcmludGsoS0VSTl9XQVJOSU5HCkBAIC0zOTAsMTQgKzM4MSwxOCBAQAogCSAqLwogCWlmIChyZXN1bHQgPT0gUENJX0VSU19SRVNVTFRfTk9ORSkgewogCQlyYyA9IGVlaF9yZXNldF9kZXZpY2UoZnJvemVuX3BkbiwgZnJvemVuX2J1cyk7Ci0JCWlmIChyYykKKwkJaWYgKHJjKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJFRUg6IFVuYWJsZSB0byByZXNldCwgcmM9JWRcbiIsIHJjKTsKIAkJCWdvdG8gaGFyZF9mYWlsOworCQl9CiAJfQogCiAJLyogSWYgYWxsIGRldmljZXMgcmVwb3J0ZWQgdGhleSBjYW4gcHJvY2VlZCwgdGhlbiByZS1lbmFibGUgTU1JTyAqLwogCWlmIChyZXN1bHQgPT0gUENJX0VSU19SRVNVTFRfQ0FOX1JFQ09WRVIpIHsKIAkJcmMgPSBydGFzX3BjaV9lbmFibGUoZnJvemVuX3BkbiwgRUVIX1RIQVdfTU1JTyk7CiAKKwkJaWYgKHJjIDwgMCkKKwkJCWdvdG8gaGFyZF9mYWlsOwogCQlpZiAocmMpIHsKIAkJCXJlc3VsdCA9IFBDSV9FUlNfUkVTVUxUX05FRURfUkVTRVQ7CiAJCX0gZWxzZSB7CkBAIC00MTAsNiArNDA1LDggQEAKIAlpZiAocmVzdWx0ID09IFBDSV9FUlNfUkVTVUxUX0NBTl9SRUNPVkVSKSB7CiAJCXJjID0gcnRhc19wY2lfZW5hYmxlKGZyb3plbl9wZG4sIEVFSF9USEFXX0RNQSk7CiAKKwkJaWYgKHJjIDwgMCkKKwkJCWdvdG8gaGFyZF9mYWlsOwogCQlpZiAocmMpCiAJCQlyZXN1bHQgPSBQQ0lfRVJTX1JFU1VMVF9ORUVEX1JFU0VUOwogCQllbHNlCkBAIC00MTcsMjEgKzQxNCwyOCBAQAogCX0KIAogCS8qIElmIGFueSBkZXZpY2UgaGFzIGEgaGFyZCBmYWlsdXJlLCB0aGVuIHNodXQgb2ZmIGV2ZXJ5dGhpbmcuICovCi0JaWYgKHJlc3VsdCA9PSBQQ0lfRVJTX1JFU1VMVF9ESVNDT05ORUNUKQorCWlmIChyZXN1bHQgPT0gUENJX0VSU19SRVNVTFRfRElTQ09OTkVDVCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJFRUg6IERldmljZSBkcml2ZXIgZ2F2ZSB1cFxuIik7CiAJCWdvdG8gaGFyZF9mYWlsOworCX0KIAogCS8qIElmIGFueSBkZXZpY2UgY2FsbGVkIG91dCBmb3IgYSByZXNldCwgdGhlbiByZXNldCB0aGUgc2xvdCAqLwogCWlmIChyZXN1bHQgPT0gUENJX0VSU19SRVNVTFRfTkVFRF9SRVNFVCkgewogCQlyYyA9IGVlaF9yZXNldF9kZXZpY2UoZnJvemVuX3BkbiwgTlVMTCk7Ci0JCWlmIChyYykKKwkJaWYgKHJjKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJFRUg6IENhbm5vdCByZXNldCwgcmM9JWRcbiIsIHJjKTsKIAkJCWdvdG8gaGFyZF9mYWlsOworCQl9CiAJCXJlc3VsdCA9IFBDSV9FUlNfUkVTVUxUX05PTkU7CiAJCXBjaV93YWxrX2J1cyhmcm96ZW5fYnVzLCBlZWhfcmVwb3J0X3Jlc2V0LCAmcmVzdWx0KTsKIAl9CiAKIAkvKiBBbGwgZGV2aWNlcyBzaG91bGQgY2xhaW0gdGhleSBoYXZlIHJlY292ZXJlZCBieSBub3cuICovCi0JaWYgKHJlc3VsdCAhPSBQQ0lfRVJTX1JFU1VMVF9SRUNPVkVSRUQpCisJaWYgKChyZXN1bHQgIT0gUENJX0VSU19SRVNVTFRfUkVDT1ZFUkVEKSAmJgorCSAgICAocmVzdWx0ICE9IFBDSV9FUlNfUkVTVUxUX05PTkUpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkVFSDogTm90IHJlY292ZXJlZFxuIik7CiAJCWdvdG8gaGFyZF9mYWlsOworCX0KIAogCS8qIFRlbGwgYWxsIGRldmljZSBkcml2ZXJzIHRoYXQgdGhleSBjYW4gcmVzdW1lIG9wZXJhdGlvbnMgKi8KIAlwY2lfd2Fsa19idXMoZnJvemVuX2J1cywgZWVoX3JlcG9ydF9yZXN1bWUsIE5VTEwpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2VlaF9ldmVudC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2VlaF9ldmVudC5jCmluZGV4IDQ5MDM3ZWQuLmRkYjgwZjUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9lZWhfZXZlbnQuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZWVoX2V2ZW50LmMKQEAgLTExOCw5ICsxMTgsNyBAQAogICogKGZyb20gYSB3b3JrcXVldWUpLgogICovCiBpbnQgZWVoX3NlbmRfZmFpbHVyZV9ldmVudCAoc3RydWN0IGRldmljZV9ub2RlICpkbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcGNpX2RldiAqZGV2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gcGNpX2NoYW5uZWxfc3RhdGUgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpbWVfdW5hdmFpbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IGVlaF9ldmVudCAqZXZlbnQ7CkBAIC0xMjgsNyArMTI2LDcgQEAKIAogCWlmICghbWVtX2luaXRfZG9uZSkgewogCQlwcmludGsoS0VSTl9FUlIgIkVFSDogZXZlbnQgZHVyaW5nIGVhcmx5IGJvb3Qgbm90IGhhbmRsZWRcbiIpOwotCQlsb2NhdGlvbiA9IGdldF9wcm9wZXJ0eShkbiwgImlibSxsb2MtY29kZSIsIE5VTEwpOworCQlsb2NhdGlvbiA9IG9mX2dldF9wcm9wZXJ0eShkbiwgImlibSxsb2MtY29kZSIsIE5VTEwpOwogCQlwcmludGsoS0VSTl9FUlIgIkVFSDogZGV2aWNlIG5vZGUgPSAlc1xuIiwgZG4tPmZ1bGxfbmFtZSk7CiAJCXByaW50ayhLRVJOX0VSUiAiRUVIOiBQQ0kgbG9jYXRpb24gPSAlc1xuIiwgbG9jYXRpb24pOwogCQlyZXR1cm4gMTsKQEAgLTE0NCw4ICsxNDIsNiBAQAogCiAJZXZlbnQtPmRuID0gZG47CiAJZXZlbnQtPmRldiA9IGRldjsKLQlldmVudC0+c3RhdGUgPSBzdGF0ZTsKLQlldmVudC0+dGltZV91bmF2YWlsID0gdGltZV91bmF2YWlsOwogCiAJLyogV2UgbWF5IG9yIG1heSBub3QgYmUgY2FsbGVkIGluIGFuIGludGVycnVwdCBjb250ZXh0ICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmVlaF9ldmVudGxpc3RfbG9jaywgZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2Zpcm13YXJlLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZmlybXdhcmUuYwppbmRleCA5MDUyMmUzLi4yOWJmODNiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZmlybXdhcmUuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZmlybXdhcmUuYwpAQCAtODAsNyArODAsNyBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQloeXBlcnRhcyA9IGdldF9wcm9wZXJ0eShkbiwgImlibSxoeXBlcnRhcy1mdW5jdGlvbnMiLCAmbGVuKTsKKwloeXBlcnRhcyA9IG9mX2dldF9wcm9wZXJ0eShkbiwgImlibSxoeXBlcnRhcy1mdW5jdGlvbnMiLCAmbGVuKTsKIAlpZiAoaHlwZXJ0YXMgPT0gTlVMTCkKIAkJZ290byBvdXQ7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9ob3RwbHVnLWNwdS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2hvdHBsdWctY3B1LmMKaW5kZXggZjQ2MGI5Yy4uOTcxMWViMCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2hvdHBsdWctY3B1LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2hvdHBsdWctY3B1LmMKQEAgLTE0Myw3ICsxNDMsNyBAQAogCWludCBlcnIgPSAtRU5PU1BDLCBsZW4sIG50aHJlYWRzLCBpOwogCWNvbnN0IHUzMiAqaW50c2VydjsKIAotCWludHNlcnYgPSBnZXRfcHJvcGVydHkobnAsICJpYm0scHBjLWludGVycnVwdC1zZXJ2ZXIjcyIsICZsZW4pOworCWludHNlcnYgPSBvZl9nZXRfcHJvcGVydHkobnAsICJpYm0scHBjLWludGVycnVwdC1zZXJ2ZXIjcyIsICZsZW4pOwogCWlmICghaW50c2VydikKIAkJcmV0dXJuIDA7CiAKQEAgLTIwMyw3ICsyMDMsNyBAQAogCWludCBsZW4sIG50aHJlYWRzLCBpOwogCWNvbnN0IHUzMiAqaW50c2VydjsKIAotCWludHNlcnYgPSBnZXRfcHJvcGVydHkobnAsICJpYm0scHBjLWludGVycnVwdC1zZXJ2ZXIjcyIsICZsZW4pOworCWludHNlcnYgPSBvZl9nZXRfcHJvcGVydHkobnAsICJpYm0scHBjLWludGVycnVwdC1zZXJ2ZXIjcyIsICZsZW4pOwogCWlmICghaW50c2VydikKIAkJcmV0dXJuOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvaW9tbXUuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9pb21tdS5jCmluZGV4IGU2NjUzYTguLjY2NjY1YzggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9pb21tdS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9pb21tdS5jCkBAIC0yNDIsNiArMjQyLDcgQEAKIAlyZXR1cm4gdGNlX3JldDsKIH0KIAorI2lmZGVmIENPTkZJR19QQ0kKIHN0YXRpYyB2b2lkIGlvbW11X3RhYmxlX3NldHBhcm1zKHN0cnVjdCBwY2lfY29udHJvbGxlciAqcGhiLAogCQkJCSBzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuLAogCQkJCSBzdHJ1Y3QgaW9tbXVfdGFibGUgKnRibCkKQEAgLTI1Miw4ICsyNTMsOCBAQAogCiAJbm9kZSA9IChzdHJ1Y3QgZGV2aWNlX25vZGUgKilwaGItPmFyY2hfZGF0YTsKIAotCWJhc2VwID0gZ2V0X3Byb3BlcnR5KG5vZGUsICJsaW51eCx0Y2UtYmFzZSIsIE5VTEwpOwotCXNpemVwID0gZ2V0X3Byb3BlcnR5KG5vZGUsICJsaW51eCx0Y2Utc2l6ZSIsIE5VTEwpOworCWJhc2VwID0gb2ZfZ2V0X3Byb3BlcnR5KG5vZGUsICJsaW51eCx0Y2UtYmFzZSIsIE5VTEwpOworCXNpemVwID0gb2ZfZ2V0X3Byb3BlcnR5KG5vZGUsICJsaW51eCx0Y2Utc2l6ZSIsIE5VTEwpOwogCWlmIChiYXNlcCA9PSBOVUxMIHx8IHNpemVwID09IE5VTEwpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJQQ0lfRE1BOiBpb21tdV90YWJsZV9zZXRwYXJtczogJXMgaGFzICIKIAkJCQkibWlzc2luZyB0Y2UgZW50cmllcyAhXG4iLCBkbi0+ZnVsbF9uYW1lKTsKQEAgLTQwMyw3ICs0MDQsNyBAQAogCiAJLyogRmluZCBuZWFyZXN0IGlibSxkbWEtd2luZG93LCB3YWxraW5nIHVwIHRoZSBkZXZpY2UgdHJlZSAqLwogCWZvciAocGRuID0gZG47IHBkbiAhPSBOVUxMOyBwZG4gPSBwZG4tPnBhcmVudCkgewotCQlkbWFfd2luZG93ID0gZ2V0X3Byb3BlcnR5KHBkbiwgImlibSxkbWEtd2luZG93IiwgTlVMTCk7CisJCWRtYV93aW5kb3cgPSBvZl9nZXRfcHJvcGVydHkocGRuLCAiaWJtLGRtYS13aW5kb3ciLCBOVUxMKTsKIAkJaWYgKGRtYV93aW5kb3cgIT0gTlVMTCkKIAkJCWJyZWFrOwogCX0KQEAgLTQ3OCwyOSArNDc5LDYgQEAKIAkJICAgICAgIHBjaV9uYW1lKGRldikpOwogfQogCi1zdGF0aWMgaW50IGlvbW11X3JlY29uZmlnX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsIHVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpub2RlKQotewotCWludCBlcnIgPSBOT1RJRllfT0s7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpucCA9IG5vZGU7Ci0Jc3RydWN0IHBjaV9kbiAqcGNpID0gUENJX0ROKG5wKTsKLQotCXN3aXRjaCAoYWN0aW9uKSB7Ci0JY2FzZSBQU0VSSUVTX1JFQ09ORklHX1JFTU9WRToKLQkJaWYgKHBjaSAmJiBwY2ktPmlvbW11X3RhYmxlICYmCi0JCSAgICBnZXRfcHJvcGVydHkobnAsICJpYm0sZG1hLXdpbmRvdyIsIE5VTEwpKQotCQkJaW9tbXVfZnJlZV90YWJsZShucCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWVyciA9IE5PVElGWV9ET05FOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBpb21tdV9yZWNvbmZpZ19uYiA9IHsKLQkubm90aWZpZXJfY2FsbCA9IGlvbW11X3JlY29uZmlnX25vdGlmaWVyLAotfTsKLQogc3RhdGljIHZvaWQgcGNpX2RtYV9kZXZfc2V0dXBfcFNlcmllc0xQKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpwZG4sICpkbjsKQEAgLTUyMSw3ICs0OTksNyBAQAogCiAJZm9yIChwZG4gPSBkbjsgcGRuICYmIFBDSV9ETihwZG4pICYmICFQQ0lfRE4ocGRuKS0+aW9tbXVfdGFibGU7CiAJICAgICBwZG4gPSBwZG4tPnBhcmVudCkgewotCQlkbWFfd2luZG93ID0gZ2V0X3Byb3BlcnR5KHBkbiwgImlibSxkbWEtd2luZG93IiwgTlVMTCk7CisJCWRtYV93aW5kb3cgPSBvZl9nZXRfcHJvcGVydHkocGRuLCAiaWJtLGRtYS13aW5kb3ciLCBOVUxMKTsKIAkJaWYgKGRtYV93aW5kb3cpCiAJCQlicmVhazsKIAl9CkBAIC01NTQsMTUgKzUzMiw0NCBAQAogCiAJZGV2LT5kZXYuYXJjaGRhdGEuZG1hX2RhdGEgPSBwY2ktPmlvbW11X3RhYmxlOwogfQorI2Vsc2UgIC8qIENPTkZJR19QQ0kgKi8KKyNkZWZpbmUgcGNpX2RtYV9idXNfc2V0dXBfcFNlcmllcwlOVUxMCisjZGVmaW5lIHBjaV9kbWFfZGV2X3NldHVwX3BTZXJpZXMJTlVMTAorI2RlZmluZSBwY2lfZG1hX2J1c19zZXR1cF9wU2VyaWVzTFAJTlVMTAorI2RlZmluZSBwY2lfZG1hX2Rldl9zZXR1cF9wU2VyaWVzTFAJTlVMTAorI2VuZGlmIC8qICFDT05GSUdfUENJICovCisKK3N0YXRpYyBpbnQgaW9tbXVfcmVjb25maWdfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwgdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKm5vZGUpCit7CisJaW50IGVyciA9IE5PVElGWV9PSzsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gbm9kZTsKKwlzdHJ1Y3QgcGNpX2RuICpwY2kgPSBQQ0lfRE4obnApOworCisJc3dpdGNoIChhY3Rpb24pIHsKKwljYXNlIFBTRVJJRVNfUkVDT05GSUdfUkVNT1ZFOgorCQlpZiAocGNpICYmIHBjaS0+aW9tbXVfdGFibGUgJiYKKwkJICAgIG9mX2dldF9wcm9wZXJ0eShucCwgImlibSxkbWEtd2luZG93IiwgTlVMTCkpCisJCQlpb21tdV9mcmVlX3RhYmxlKG5wKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZXJyID0gTk9USUZZX0RPTkU7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGlvbW11X3JlY29uZmlnX25iID0geworCS5ub3RpZmllcl9jYWxsID0gaW9tbXVfcmVjb25maWdfbm90aWZpZXIsCit9OwogCiAvKiBUaGVzZSBhcmUgY2FsbGVkIHZlcnkgZWFybHkuICovCiB2b2lkIGlvbW11X2luaXRfZWFybHlfcFNlcmllcyh2b2lkKQogewotCWlmIChvZl9jaG9zZW4gJiYgZ2V0X3Byb3BlcnR5KG9mX2Nob3NlbiwgImxpbnV4LGlvbW11LW9mZiIsIE5VTEwpKSB7CisJaWYgKG9mX2Nob3NlbiAmJiBvZl9nZXRfcHJvcGVydHkob2ZfY2hvc2VuLCAibGludXgsaW9tbXUtb2ZmIiwgTlVMTCkpIHsKIAkJLyogRGlyZWN0IEkvTywgSU9NTVUgb2ZmICovCiAJCXBwY19tZC5wY2lfZG1hX2Rldl9zZXR1cCA9IE5VTEw7CiAJCXBwY19tZC5wY2lfZG1hX2J1c19zZXR1cCA9IE5VTEw7Ci0JCXBjaV9kbWFfb3BzID0gJmRtYV9kaXJlY3Rfb3BzOworCQlzZXRfcGNpX2RtYV9vcHMoJmRtYV9kaXJlY3Rfb3BzKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtNTg4LDYgKzU5NSw2IEBACiAKIAlwU2VyaWVzX3JlY29uZmlnX25vdGlmaWVyX3JlZ2lzdGVyKCZpb21tdV9yZWNvbmZpZ19uYik7CiAKLQlwY2lfZG1hX29wcyA9ICZkbWFfaW9tbXVfb3BzOworCXNldF9wY2lfZG1hX29wcygmZG1hX2lvbW11X29wcyk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9scGFyLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvbHBhci5jCmluZGV4IDg0M2VlOTYuLjNhNzBlOGEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9scGFyLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2xwYXIuYwpAQCAtMjA5LDEzICsyMDksMTMgQEAKIAkvKiBmaW5kIHRoZSBib290IGNvbnNvbGUgZnJvbSAvY2hvc2VuL3N0ZG91dCAqLwogCWlmICghb2ZfY2hvc2VuKQogCQlyZXR1cm47Ci0JbmFtZSA9IGdldF9wcm9wZXJ0eShvZl9jaG9zZW4sICJsaW51eCxzdGRvdXQtcGF0aCIsIE5VTEwpOworCW5hbWUgPSBvZl9nZXRfcHJvcGVydHkob2ZfY2hvc2VuLCAibGludXgsc3Rkb3V0LXBhdGgiLCBOVUxMKTsKIAlpZiAobmFtZSA9PSBOVUxMKQogCQlyZXR1cm47CiAJc3Rkb3V0X25vZGUgPSBvZl9maW5kX25vZGVfYnlfcGF0aChuYW1lKTsKIAlpZiAoIXN0ZG91dF9ub2RlKQogCQlyZXR1cm47Ci0JbmFtZSA9IGdldF9wcm9wZXJ0eShzdGRvdXRfbm9kZSwgIm5hbWUiLCBOVUxMKTsKKwluYW1lID0gb2ZfZ2V0X3Byb3BlcnR5KHN0ZG91dF9ub2RlLCAibmFtZSIsIE5VTEwpOwogCWlmICghbmFtZSkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJzdGRvdXQgbm9kZSBtaXNzaW5nICduYW1lJyBwcm9wZXJ0eSFcbiIpOwogCQlnb3RvIG91dDsKQEAgLTIyNiw3ICsyMjYsNyBAQAogCS8qIENoZWNrIGlmIGl0J3MgYSB2aXJ0dWFsIHRlcm1pbmFsICovCiAJaWYgKHN0cm5jbXAobmFtZSwgInZ0eSIsIDMpICE9IDApCiAJCWdvdG8gb3V0OwotCXRlcm1ubyA9IGdldF9wcm9wZXJ0eShzdGRvdXRfbm9kZSwgInJlZyIsIE5VTEwpOworCXRlcm1ubyA9IG9mX2dldF9wcm9wZXJ0eShzdGRvdXRfbm9kZSwgInJlZyIsIE5VTEwpOwogCWlmICh0ZXJtbm8gPT0gTlVMTCkKIAkJZ290byBvdXQ7CiAJdnRlcm1ubyA9IHRlcm1ub1swXTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9udnJhbS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL252cmFtLmMKaW5kZXggNjQxNjNjZS4uZjY4OTAzZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL252cmFtLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL252cmFtLmMKQEAgLTEzMCw3ICsxMzAsNyBAQAogCWlmIChudnJhbSA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCW5ieXRlc19wID0gZ2V0X3Byb3BlcnR5KG52cmFtLCAiI2J5dGVzIiwgJnByb3BsZW4pOworCW5ieXRlc19wID0gb2ZfZ2V0X3Byb3BlcnR5KG52cmFtLCAiI2J5dGVzIiwgJnByb3BsZW4pOwogCWlmIChuYnl0ZXNfcCA9PSBOVUxMIHx8IHByb3BsZW4gIT0gc2l6ZW9mKHVuc2lnbmVkIGludCkpCiAJCXJldHVybiAtRUlPOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcGNpLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcGNpLmMKaW5kZXggZmE1OTEyNC4uMmM2ZGVkMiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3BjaS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9wY2kuYwpAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogCisjaW5jbHVkZSA8YXNtL2VlaC5oPgogI2luY2x1ZGUgPGFzbS9wY2ktYnJpZGdlLmg+CiAjaW5jbHVkZSA8YXNtL3Byb20uaD4KICNpbmNsdWRlIDxhc20vcHBjLXBjaS5oPgpAQCAtMzksNyArNDAsNyBAQAogCSAqLwogCWRuID0gcGNpX2RldmljZV90b19PRl9ub2RlKGRldik7CiAJaWYgKGRuKSB7Ci0JCWNoYXIgKmxvY19jb2RlID0gZ2V0X3Byb3BlcnR5KGRuLCAiaWJtLGxvYy1jb2RlIiwgMCk7CisJCWNvbnN0IGNoYXIgKmxvY19jb2RlID0gb2ZfZ2V0X3Byb3BlcnR5KGRuLCAiaWJtLGxvYy1jb2RlIiwgMCk7CiAJCWlmIChsb2NfY29kZSkgewogCQkJaW50IGxvY19sZW4gPSBzdHJsZW4obG9jX2NvZGUpOwogCQkJaWYgKGxvY19sZW4gPCBzaXplb2YoZGV2LT5kZXYubmFtZSkpIHsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9wY2lfZGxwYXIuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9wY2lfZGxwYXIuYwppbmRleCBhYzU2Yjg2Li5mZGMxYTM2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcGNpX2RscGFyLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3BjaV9kbHBhci5jCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSA8YXNtL3BjaS1icmlkZ2UuaD4KICNpbmNsdWRlIDxhc20vcHBjLXBjaS5oPgogI2luY2x1ZGUgPGFzbS9maXJtd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9lZWguaD4KIAogc3RhdGljIHN0cnVjdCBwY2lfYnVzICoKIGZpbmRfYnVzX2Ftb25nX2NoaWxkcmVuKHN0cnVjdCBwY2lfYnVzICpidXMsCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcmFzLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcmFzLmMKaW5kZXggZWRjMDM4OC4uNTNhYTA0MSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3Jhcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9yYXMuYwpAQCAtODUsNyArODUsNyBAQAogCSAqIG1hcCB0aG9zZSBpbnRlcnJ1cHRzIHVzaW5nIHRoZSBkZWZhdWx0IGludGVycnVwdCBob3N0IGFuZCBkZWZhdWx0CiAJICogdHJpZ2dlcgogCSAqLwotCW9waWNwcm9wID0gZ2V0X3Byb3BlcnR5KG5wLCAib3Blbi1waWMtaW50ZXJydXB0IiwgJm9waWNwbGVuKTsKKwlvcGljcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShucCwgIm9wZW4tcGljLWludGVycnVwdCIsICZvcGljcGxlbik7CiAJaWYgKG9waWNwcm9wKSB7CiAJCW9waWNwbGVuIC89IHNpemVvZih1MzIpOwogCQlmb3IgKGkgPSAwOyBpIDwgb3BpY3BsZW47IGkrKykgewpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3J0YXNkLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcnRhc2QuYwppbmRleCA3N2QwOTM3Li45Nzk3YjEwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcnRhc2QuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcnRhc2QuYwpAQCAtMzYzLDcgKzM2Myw3IEBACiAKIAlub2RlID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgoIi9ydGFzIik7CiAKLQlpcCA9IGdldF9wcm9wZXJ0eShub2RlLCAicnRhcy1ldmVudC1zY2FuLXJhdGUiLCBOVUxMKTsKKwlpcCA9IG9mX2dldF9wcm9wZXJ0eShub2RlLCAicnRhcy1ldmVudC1zY2FuLXJhdGUiLCBOVUxMKTsKIAlpZiAoaXAgPT0gTlVMTCkgewogCQlwcmludGsoS0VSTl9FUlIgInJ0YXNkOiBubyBydGFzLWV2ZW50LXNjYW4tcmF0ZVxuIik7CiAJCW9mX25vZGVfcHV0KG5vZGUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3NldHVwLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvc2V0dXAuYwppbmRleCAzNGFmZjQ3Li4zM2VlYzI4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvc2V0dXAuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvc2V0dXAuYwpAQCAtNjUsNiArNjUsNyBAQAogI2luY2x1ZGUgPGFzbS91ZGJnLmg+CiAjaW5jbHVkZSA8YXNtL3NtcC5oPgogI2luY2x1ZGUgPGFzbS9maXJtd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9lZWguaD4KIAogI2luY2x1ZGUgInBscGFyX3dyYXBwZXJzLmgiCiAjaW5jbHVkZSAicHNlcmllcy5oIgpAQCAtOTIsNyArOTMsNyBAQAogCiAJcm9vdCA9IG9mX2ZpbmRfbm9kZV9ieV9wYXRoKCIvIik7CiAJaWYgKHJvb3QpCi0JCW1vZGVsID0gZ2V0X3Byb3BlcnR5KHJvb3QsICJtb2RlbCIsIE5VTEwpOworCQltb2RlbCA9IG9mX2dldF9wcm9wZXJ0eShyb290LCAibW9kZWwiLCBOVUxMKTsKIAlzZXFfcHJpbnRmKG0sICJtYWNoaW5lXHRcdDogQ0hSUCAlc1xuIiwgbW9kZWwpOwogCW9mX25vZGVfcHV0KHJvb3QpOwogfQpAQCAtMTM4LDggKzEzOSw4IEBACiAJc3RydWN0IG1waWMgKm1waWM7CiAKIAlucCA9IG9mX2ZpbmRfbm9kZV9ieV9wYXRoKCIvIik7Ci0JbmFkZHIgPSBwcm9tX25fYWRkcl9jZWxscyhucCk7Ci0Jb3Bwcm9wID0gZ2V0X3Byb3BlcnR5KG5wLCAicGxhdGZvcm0tb3Blbi1waWMiLCAmb3BwbGVuKTsKKwluYWRkciA9IG9mX25fYWRkcl9jZWxscyhucCk7CisJb3Bwcm9wID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAicGxhdGZvcm0tb3Blbi1waWMiLCAmb3BwbGVuKTsKIAlpZiAob3Bwcm9wICE9IDApIHsKIAkJb3BlbnBpY19hZGRyID0gb2ZfcmVhZF9udW1iZXIob3Bwcm9wLCBuYWRkcik7CiAJCXByaW50ayhLRVJOX0RFQlVHICJPcGVuUElDIGFkZHI6ICVseFxuIiwgb3BlbnBpY19hZGRyKTsKQEAgLTE4OCwxMSArMTg5LDExIEBACiAJCQlicmVhazsKIAkJaWYgKHN0cmNtcChucC0+bmFtZSwgInBjaSIpICE9IDApCiAJCQljb250aW51ZTsKLQkJYWRkcnAgPSBnZXRfcHJvcGVydHkobnAsICI4MjU5LWludGVycnVwdC1hY2tub3dsZWRnZSIsCisJCWFkZHJwID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAiODI1OS1pbnRlcnJ1cHQtYWNrbm93bGVkZ2UiLAogCQkJCQkgICAgTlVMTCk7CiAJCWlmIChhZGRycCA9PSBOVUxMKQogCQkJY29udGludWU7Ci0JCW5hZGRyID0gcHJvbV9uX2FkZHJfY2VsbHMobnApOworCQluYWRkciA9IG9mX25fYWRkcl9jZWxscyhucCk7CiAJCWludGFjayA9IGFkZHJwW25hZGRyLTFdOwogCQlpZiAobmFkZHIgPiAxKQogCQkJaW50YWNrIHw9ICgodW5zaWduZWQgbG9uZylhZGRycFtuYWRkci0yXSkgPDwgMzI7CkBAIC0yMjUsNyArMjI2LDcgQEAKIAogCWZvciAobnAgPSBOVUxMOyAobnAgPSBvZl9maW5kX25vZGVfYnlfbmFtZShucCwKIAkJCQkJCSAgICJpbnRlcnJ1cHQtY29udHJvbGxlciIpKTspIHsKLQkJdHlwZXAgPSBnZXRfcHJvcGVydHkobnAsICJjb21wYXRpYmxlIiwgTlVMTCk7CisJCXR5cGVwID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAiY29tcGF0aWJsZSIsIE5VTEwpOwogCQlpZiAoc3Ryc3RyKHR5cGVwLCAib3Blbi1waWMiKSkgewogCQkJcFNlcmllc19tcGljX25vZGUgPSBvZl9ub2RlX2dldChucCk7CiAJCQlwcGNfbWQuaW5pdF9JUlEgICAgICAgPSBwc2VyaWVzX21waWNfaW5pdF9JUlE7CkBAIC0zMzQsMzIgKzMzNSw2IEBACiAJREJHKCIgPC0gcFNlcmllc19pbml0X2Vhcmx5KClcbiIpOwogfQogCi0KLXN0YXRpYyBpbnQgcFNlcmllc19jaGVja19sZWdhY3lfaW9wb3J0KHVuc2lnbmVkIGludCBiYXNlcG9ydCkKLXsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwotCi0jZGVmaW5lIEk4MDQyX0RBVEFfUkVHCTB4NjAKLSNkZWZpbmUgRkRDX0JBU0UJMHgzZjAKLQotCi0Jc3dpdGNoKGJhc2Vwb3J0KSB7Ci0JY2FzZSBJODA0Ml9EQVRBX1JFRzoKLQkJbnAgPSBvZl9maW5kX25vZGVfYnlfdHlwZShOVUxMLCAiODA0MiIpOwotCQlpZiAobnAgPT0gTlVMTCkKLQkJCXJldHVybiAtRU5PREVWOwotCQlvZl9ub2RlX3B1dChucCk7Ci0JCWJyZWFrOwotCWNhc2UgRkRDX0JBU0U6Ci0JCW5wID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUoTlVMTCwgImZkYyIpOwotCQlpZiAobnAgPT0gTlVMTCkKLQkJCXJldHVybiAtRU5PREVWOwotCQlvZl9ub2RlX3B1dChucCk7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gMDsKLX0KLQogLyoKICAqIENhbGxlZCB2ZXJ5IGVhcmx5LCBNTVUgaXMgb2ZmLCBkZXZpY2UtdHJlZSBpc24ndCB1bmZsYXR0ZW5lZAogICovCkBAIC01MTQsNiArNDg5LDEwIEBACiAJZm9yICg7Oyk7CiB9CiAKKyNpZm5kZWYgQ09ORklHX1BDSQordm9pZCBwU2VyaWVzX2ZpbmFsX2ZpeHVwKHZvaWQpIHsgfQorI2VuZGlmCisKIGRlZmluZV9tYWNoaW5lKHBzZXJpZXMpIHsKIAkubmFtZQkJCT0gInBTZXJpZXMiLAogCS5wcm9iZQkJCT0gcFNlcmllc19wcm9iZSwKQEAgLTUzMiw3ICs1MTEsNiBAQAogCS5zZXRfcnRjX3RpbWUJCT0gcnRhc19zZXRfcnRjX3RpbWUsCiAJLmNhbGlicmF0ZV9kZWNyCQk9IGdlbmVyaWNfY2FsaWJyYXRlX2RlY3IsCiAJLnByb2dyZXNzCQk9IHJ0YXNfcHJvZ3Jlc3MsCi0JLmNoZWNrX2xlZ2FjeV9pb3BvcnQJPSBwU2VyaWVzX2NoZWNrX2xlZ2FjeV9pb3BvcnQsCiAJLnN5c3RlbV9yZXNldF9leGNlcHRpb24gPSBwU2VyaWVzX3N5c3RlbV9yZXNldF9leGNlcHRpb24sCiAJLm1hY2hpbmVfY2hlY2tfZXhjZXB0aW9uID0gcFNlcmllc19tYWNoaW5lX2NoZWNrX2V4Y2VwdGlvbiwKIH07CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMveGljcy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3hpY3MuYwppbmRleCA4MWQxNzJkLi44OTZjYmYzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMveGljcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy94aWNzLmMKQEAgLTU3Niw3ICs1NzYsNyBAQAogCSAqIFRoaXMgaGFwcGVucyB0byBiZSB0aGUgY2FzZSBzbyBmYXIgYnV0IHdlIGFyZSBwbGF5aW5nIHdpdGggZmlyZS4uLgogCSAqIHNob3VsZCBiZSBmaXhlZCBvbmUgb2YgdGhlc2UgZGF5cy4gLUJlbkguCiAJICovCi0JaXJlZyA9IGdldF9wcm9wZXJ0eShucCwgImlibSxpbnRlcnJ1cHQtc2VydmVyLXJhbmdlcyIsIE5VTEwpOworCWlyZWcgPSBvZl9nZXRfcHJvcGVydHkobnAsICJpYm0saW50ZXJydXB0LXNlcnZlci1yYW5nZXMiLCBOVUxMKTsKIAogCS8qIERvIHRoYXQgZXZlciBoYXBwZW4gPyB3ZSdsbCBrbm93IHNvb24gZW5vdWdoLi4uIGJ1dCBldmVuIGdvb2Qnb2xkCiAJICogZjgwIGRvZXMgaGF2ZSB0aGF0IHByb3BlcnR5IC4uCkBAIC01ODgsNyArNTg4LDcgQEAKIAkJICovCiAJCSppbmR4ID0gKmlyZWc7CiAJfQotCWlyZWcgPSBnZXRfcHJvcGVydHkobnAsICJyZWciLCAmaWxlbik7CisJaXJlZyA9IG9mX2dldF9wcm9wZXJ0eShucCwgInJlZyIsICZpbGVuKTsKIAlpZiAoIWlyZWcpCiAJCXBhbmljKCJ4aWNzX2luaXRfSVJROiBjYW4ndCBmaW5kIGludGVycnVwdCByZWcgcHJvcGVydHkiKTsKIApAQCAtNjQwLDEwICs2NDAsMTAgQEAKIAkJCWJyZWFrOwogCQlpZiAoc3RyY21wKG5wLT5uYW1lLCAicGNpIikgIT0gMCkKIAkJCWNvbnRpbnVlOwotCQlhZGRycCA9IGdldF9wcm9wZXJ0eShucCwgIjgyNTktaW50ZXJydXB0LWFja25vd2xlZGdlIiwgTlVMTCk7CisJCWFkZHJwID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAiODI1OS1pbnRlcnJ1cHQtYWNrbm93bGVkZ2UiLCBOVUxMKTsKIAkJaWYgKGFkZHJwID09IE5VTEwpCiAJCQljb250aW51ZTsKLQkJbmFkZHIgPSBwcm9tX25fYWRkcl9jZWxscyhucCk7CisJCW5hZGRyID0gb2Zfbl9hZGRyX2NlbGxzKG5wKTsKIAkJaW50YWNrID0gYWRkcnBbbmFkZHItMV07CiAJCWlmIChuYWRkciA+IDEpCiAJCQlpbnRhY2sgfD0gKCh1bnNpZ25lZCBsb25nKWFkZHJwW25hZGRyLTJdKSA8PCAzMjsKQEAgLTY2NCwxMCArNjY0LDExIEBACiAJCWludCBpLCBsZW47CiAJCWNvbnN0IHUzMiAqaW50c2VydjsKIAotCQlpbnRzZXJ2ID0gZ2V0X3Byb3BlcnR5KG5wLCAiaWJtLHBwYy1pbnRlcnJ1cHQtc2VydmVyI3MiLCAmbGVuKTsKKwkJaW50c2VydiA9IG9mX2dldF9wcm9wZXJ0eShucCwgImlibSxwcGMtaW50ZXJydXB0LXNlcnZlciNzIiwKKwkJCQkJJmxlbik7CiAKIAkJaWYgKCFpbnRzZXJ2KQotCQkJaW50c2VydiA9IGdldF9wcm9wZXJ0eShucCwgInJlZyIsICZsZW4pOworCQkJaW50c2VydiA9IG9mX2dldF9wcm9wZXJ0eShucCwgInJlZyIsICZsZW4pOwogCiAJCWkgPSBsZW4gLyBzaXplb2YodTMyKTsKIApAQCAtNzA5LDcgKzcxMCw3IEBACiAJLyogRmluZCB0aGUgc2VydmVyIG51bWJlcnMgZm9yIHRoZSBib290IGNwdS4gKi8KIAlucCA9IGNwdWlkX3RvX29mX25vZGUoYm9vdF9jcHVpZCk7CiAJQlVHX09OKCFucCk7Ci0JaXJlZyA9IGdldF9wcm9wZXJ0eShucCwgImlibSxwcGMtaW50ZXJydXB0LWdzZXJ2ZXIjcyIsICZpbGVuKTsKKwlpcmVnID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAiaWJtLHBwYy1pbnRlcnJ1cHQtZ3NlcnZlciNzIiwgJmlsZW4pOwogCWlmICghaXJlZykKIAkJZ290byBza2lwX2dzZXJ2ZXJfY2hlY2s7CiAJaSA9IGlsZW4gLyBzaXplb2YoaW50KTsKQEAgLTcyNSw3ICs3MjYsNyBAQAogCQkJZGVmYXVsdF9zZXJ2ZXIgPSBoY3B1aWQ7CiAJCQlkZWZhdWx0X2Rpc3RyaWJfc2VydmVyID0gaXJlZ1tqKzFdOwogCi0JCQlpc2l6ZSA9IGdldF9wcm9wZXJ0eShucCwKKwkJCWlzaXplID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLAogCQkJCQkiaWJtLGludGVycnVwdC1zZXJ2ZXIjLXNpemUiLCBOVUxMKTsKIAkJCWlmIChpc2l6ZSkKIAkJCQlpbnRlcnJ1cHRfc2VydmVyX3NpemUgPSAqaXNpemU7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9NYWtlZmlsZQppbmRleCAyNmNhM2ZmLi5lOTZjYTk2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvTWFrZWZpbGUKQEAgLTExLDEyICsxMSwxNyBAQAogb2JqLSQoQ09ORklHX1UzX0RBUlQpCQkrPSBkYXJ0X2lvbW11Lm8KIG9iai0kKENPTkZJR19NTUlPX05WUkFNKQkrPSBtbWlvX252cmFtLm8KIG9iai0kKENPTkZJR19GU0xfU09DKQkJKz0gZnNsX3NvYy5vCitvYmotJChDT05GSUdfRlNMX1BDSUUpCQkrPSBmc2xfcGNpZS5vCiBvYmotJChDT05GSUdfVFNJMTA4X0JSSURHRSkJKz0gdHNpMTA4X3BjaS5vIHRzaTEwOF9kZXYubwogb2JqLSQoQ09ORklHX1FVSUNDX0VOR0lORSkJKz0gcWVfbGliLwogCisjIGNvbnRhaW5zIG9ubHkgdGhlIHN1c3BlbmQgaGFuZGxlciBmb3IgdGltZQorb2JqLSQoQ09ORklHX1BNKQkJKz0gdGltZXIubworCiBpZmVxICgkKENPTkZJR19QUENfTUVSR0UpLHkpCiBvYmotJChDT05GSUdfUFBDX0k4MjU5KQkJKz0gaTgyNTkubwogb2JqLSQoQ09ORklHX1BQQ184M3h4KQkJKz0gaXBpYy5vCitvYmotJChDT05GSUdfNHh4KQkJKz0gdWljLm8KIGVuZGlmCiAKICMgVGVtcG9yYXJ5IGhhY2sgdW50aWwgd2UgaGF2ZSBtaWdyYXRlZCB0byBhc20tcG93ZXJwYwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9kYXJ0X2lvbW11LmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2RhcnRfaW9tbXUuYwppbmRleCAxNDg4NTM1Li4zMzYxODZkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2RhcnRfaW9tbXUuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2RhcnRfaW9tbXUuYwpAQCAtMzMzLDcgKzMzMyw3IEBACiAJCXBwY19tZC5wY2lfZG1hX2J1c19zZXR1cCA9IHBjaV9kbWFfYnVzX3NldHVwX2RhcnQ7CiAKIAkJLyogU2V0dXAgcGNpX2RtYSBvcHMgKi8KLQkJcGNpX2RtYV9vcHMgPSAmZG1hX2lvbW11X29wczsKKwkJc2V0X3BjaV9kbWFfb3BzKCZkbWFfaW9tbXVfb3BzKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMzQzLDcgKzM0Myw3IEBACiAJcHBjX21kLnBjaV9kbWFfYnVzX3NldHVwID0gTlVMTDsKIAogCS8qIFNldHVwIHBjaV9kbWEgb3BzICovCi0JcGNpX2RtYV9vcHMgPSAmZG1hX2RpcmVjdF9vcHM7CisJc2V0X3BjaV9kbWFfb3BzKCZkbWFfZGlyZWN0X29wcyk7CiB9CiAKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9kY3IuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZGNyLmMKaW5kZXggMWZjNTgxOS4uNTc0YjZlZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9kY3IuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2Rjci5jCkBAIC0yNiw3ICsyNiw3IEBACiB1bnNpZ25lZCBpbnQgZGNyX3Jlc291cmNlX3N0YXJ0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIHVuc2lnbmVkIGludCBpbmRleCkKIHsKIAl1bnNpZ25lZCBpbnQgZHM7Ci0JY29uc3QgdTMyICpkciA9IGdldF9wcm9wZXJ0eShucCwgImRjci1yZWciLCAmZHMpOworCWNvbnN0IHUzMiAqZHIgPSBvZl9nZXRfcHJvcGVydHkobnAsICJkY3ItcmVnIiwgJmRzKTsKIAogCWlmIChkciA9PSBOVUxMIHx8IGRzICYgMSB8fCBpbmRleCA+PSAoZHMgLyA4KSkKIAkJcmV0dXJuIDA7CkBAIC0zNyw3ICszNyw3IEBACiB1bnNpZ25lZCBpbnQgZGNyX3Jlc291cmNlX2xlbihzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCB1bnNpZ25lZCBpbnQgaW5kZXgpCiB7CiAJdW5zaWduZWQgaW50IGRzOwotCWNvbnN0IHUzMiAqZHIgPSBnZXRfcHJvcGVydHkobnAsICJkY3ItcmVnIiwgJmRzKTsKKwljb25zdCB1MzIgKmRyID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAiZGNyLXJlZyIsICZkcyk7CiAKIAlpZiAoZHIgPT0gTlVMTCB8fCBkcyAmIDEgfHwgaW5kZXggPj0gKGRzIC8gOCkpCiAJCXJldHVybiAwOwpAQCAtNTMsOSArNTMsOSBAQAogCWNvbnN0IHUzMiAqcDsKIAogCWZvciAocGFyID0gb2Zfbm9kZV9nZXQobm9kZSk7IHBhcjspIHsKLQkJaWYgKGdldF9wcm9wZXJ0eShwYXIsICJkY3ItY29udHJvbGxlciIsIE5VTEwpKQorCQlpZiAob2ZfZ2V0X3Byb3BlcnR5KHBhciwgImRjci1jb250cm9sbGVyIiwgTlVMTCkpCiAJCQlicmVhazsKLQkJcCA9IGdldF9wcm9wZXJ0eShwYXIsICJkY3ItcGFyZW50IiwgTlVMTCk7CisJCXAgPSBvZl9nZXRfcHJvcGVydHkocGFyLCAiZGNyLXBhcmVudCIsIE5VTEwpOwogCQl0bXAgPSBwYXI7CiAJCWlmIChwID09IE5VTEwpCiAJCQlwYXIgPSBvZl9nZXRfcGFyZW50KHBhcik7CkBAIC04MCwxMyArODAsMTMgQEAKIAkJcmV0dXJuIE9GX0JBRF9BRERSOwogCiAJLyogU3RyaWRlIGlzIG5vdCBwcm9wZXJseSBkZWZpbmVkIHlldCwgZGVmYXVsdCB0byAweDEwIGZvciBBeG9uICovCi0JcCA9IGdldF9wcm9wZXJ0eShkcCwgImRjci1tbWlvLXN0cmlkZSIsIE5VTEwpOworCXAgPSBvZl9nZXRfcHJvcGVydHkoZHAsICJkY3ItbW1pby1zdHJpZGUiLCBOVUxMKTsKIAlzdHJpZGUgPSAocCA9PSBOVUxMKSA/IDB4MTAgOiAqcDsKIAogCS8qIFhYWCBGSVhNRTogV2hpY2ggcHJvcGVydHkgbmFtZSBpcyB0byB1c2Ugb2YgdGhlIDIgZm9sbG93aW5nID8gKi8KLQlwID0gZ2V0X3Byb3BlcnR5KGRwLCAiZGNyLW1taW8tcmFuZ2UiLCBOVUxMKTsKKwlwID0gb2ZfZ2V0X3Byb3BlcnR5KGRwLCAiZGNyLW1taW8tcmFuZ2UiLCBOVUxMKTsKIAlpZiAocCA9PSBOVUxMKQotCQlwID0gZ2V0X3Byb3BlcnR5KGRwLCAiZGNyLW1taW8tc3BhY2UiLCBOVUxMKTsKKwkJcCA9IG9mX2dldF9wcm9wZXJ0eShkcCwgImRjci1tbWlvLXNwYWNlIiwgTlVMTCk7CiAJaWYgKHAgPT0gTlVMTCkKIAkJcmV0dXJuIE9GX0JBRF9BRERSOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg2eHgvbXBjODZ4eF9wY2llLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9wY2llLmMKc2ltaWxhcml0eSBpbmRleCA5OCUKcmVuYW1lIGZyb20gYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L21wYzg2eHhfcGNpZS5jCnJlbmFtZSB0byBhcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9wY2llLmMKaW5kZXggYTJmNGY3My4uMDQxYzA3ZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L21wYzg2eHhfcGNpZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3BjaWUuYwpAQCAtMjQsOCArMjQsNiBAQAogI2luY2x1ZGUgPGFzbS9wY2ktYnJpZGdlLmg+CiAjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KIAotI2luY2x1ZGUgIm1wYzg2eHguaCIKLQogI2RlZmluZSBQQ0lfQ0ZHX09VVCBvdXRfYmUzMgogCiAvKiBFUlJBVEEgUENJLUV4IDE0IFBDSUUgQ29udHJvbGxlciB0aW1lb3V0ICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9wY2llLmggYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9wY2llLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ5Nzc5YwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3BjaWUuaApAQCAtMCwwICsxLDk0IEBACisvKgorICogTVBDODV4eC84Nnh4IFBDSSBFeHByZXNzIHN0cnVjdHVyZSBkZWZpbmUKKyAqCisgKiBDb3B5cmlnaHQgMjAwNyBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworI2lmZGVmIF9fS0VSTkVMX18KKyNpZm5kZWYgX19QT1dFUlBDX0ZTTF9QQ0lFX0gKKyNkZWZpbmUgX19QT1dFUlBDX0ZTTF9QQ0lFX0gKKworLyogUENJRSBFeHByZXNzIElPIGJsb2NrIHJlZ2lzdGVycyBpbiA4NXh4Lzg2eHggKi8KKworc3RydWN0IGNjc3JfcGV4IHsKKwlfX2JlMzIgX19pb21lbSAgICBwZXhfY29uZmlnX2FkZHI7CS8qIDB4LjAwMCAtIFBDSSBFeHByZXNzIENvbmZpZ3VyYXRpb24gQWRkcmVzcyBSZWdpc3RlciAqLworCV9fYmUzMiBfX2lvbWVtICAgIHBleF9jb25maWdfZGF0YTsJLyogMHguMDA0IC0gUENJIEV4cHJlc3MgQ29uZmlndXJhdGlvbiBEYXRhIFJlZ2lzdGVyICovCisJdTggX19pb21lbSAgICByZXMxWzRdOworCV9fYmUzMiBfX2lvbWVtICAgIHBleF9vdGJfY3BsX3RvcjsJLyogMHguMDBjIC0gUENJIEV4cHJlc3MgT3V0Ym91bmQgY29tcGxldGlvbiB0aW1lb3V0IHJlZ2lzdGVyICovCisJX19iZTMyIF9faW9tZW0gICAgcGV4X2NvbmZfdG9yOwkJLyogMHguMDEwIC0gUENJIEV4cHJlc3MgY29uZmlndXJhdGlvbiB0aW1lb3V0IHJlZ2lzdGVyICovCisJdTggX19pb21lbSAgICByZXMyWzEyXTsKKwlfX2JlMzIgX19pb21lbSAgICBwZXhfcG1lX21lc19kcjsJLyogMHguMDIwIC0gUENJIEV4cHJlc3MgUE1FIGFuZCBtZXNzYWdlIGRldGVjdCByZWdpc3RlciAqLworCV9fYmUzMiBfX2lvbWVtICAgIHBleF9wbWVfbWVzX2Rpc3I7CS8qIDB4LjAyNCAtIFBDSSBFeHByZXNzIFBNRSBhbmQgbWVzc2FnZSBkaXNhYmxlIHJlZ2lzdGVyICovCisJX19iZTMyIF9faW9tZW0gICAgcGV4X3BtZV9tZXNfaWVyOwkvKiAweC4wMjggLSBQQ0kgRXhwcmVzcyBQTUUgYW5kIG1lc3NhZ2UgaW50ZXJydXB0IGVuYWJsZSByZWdpc3RlciAqLworCV9fYmUzMiBfX2lvbWVtICAgIHBleF9wbWNyOwkJLyogMHguMDJjIC0gUENJIEV4cHJlc3MgcG93ZXIgbWFuYWdlbWVudCBjb21tYW5kIHJlZ2lzdGVyICovCisJdTggX19pb21lbSAgICByZXMzWzMwMjRdOworCV9fYmUzMiBfX2lvbWVtICAgIHBleG90YXIwOwkJLyogMHguYzAwIC0gUENJIEV4cHJlc3Mgb3V0Ym91bmQgdHJhbnNsYXRpb24gYWRkcmVzcyByZWdpc3RlciAwICovCisJX19iZTMyIF9faW9tZW0gICAgcGV4b3RlYXIwOwkJLyogMHguYzA0IC0gUENJIEV4cHJlc3Mgb3V0Ym91bmQgdHJhbnNsYXRpb24gZXh0ZW5kZWQgYWRkcmVzcyByZWdpc3RlciAwKi8KKwl1OCBfX2lvbWVtICAgIHJlczRbOF07CisJX19iZTMyIF9faW9tZW0gICAgcGV4b3dhcjA7CQkvKiAweC5jMTAgLSBQQ0kgRXhwcmVzcyBvdXRib3VuZCB3aW5kb3cgYXR0cmlidXRlcyByZWdpc3RlciAwKi8KKwl1OCBfX2lvbWVtICAgIHJlczVbMTJdOworCV9fYmUzMiBfX2lvbWVtICAgIHBleG90YXIxOwkJLyogMHguYzIwIC0gUENJIEV4cHJlc3Mgb3V0Ym91bmQgdHJhbnNsYXRpb24gYWRkcmVzcyByZWdpc3RlciAxICovCisJX19iZTMyIF9faW9tZW0gICAgcGV4b3RlYXIxOwkJLyogMHguYzI0IC0gUENJIEV4cHJlc3Mgb3V0Ym91bmQgdHJhbnNsYXRpb24gZXh0ZW5kZWQgYWRkcmVzcyByZWdpc3RlciAxKi8KKwlfX2JlMzIgX19pb21lbSAgICBwZXhvd2JhcjE7CQkvKiAweC5jMjggLSBQQ0kgRXhwcmVzcyBvdXRib3VuZCB3aW5kb3cgYmFzZSBhZGRyZXNzIHJlZ2lzdGVyIDEqLworCXU4IF9faW9tZW0gICAgcmVzNls0XTsKKwlfX2JlMzIgX19pb21lbSAgICBwZXhvd2FyMTsJCS8qIDB4LmMzMCAtIFBDSSBFeHByZXNzIG91dGJvdW5kIHdpbmRvdyBhdHRyaWJ1dGVzIHJlZ2lzdGVyIDEqLworCXU4IF9faW9tZW0gICAgcmVzN1sxMl07CisJX19iZTMyIF9faW9tZW0gICAgcGV4b3RhcjI7CQkvKiAweC5jNDAgLSBQQ0kgRXhwcmVzcyBvdXRib3VuZCB0cmFuc2xhdGlvbiBhZGRyZXNzIHJlZ2lzdGVyIDIgKi8KKwlfX2JlMzIgX19pb21lbSAgICBwZXhvdGVhcjI7CQkvKiAweC5jNDQgLSBQQ0kgRXhwcmVzcyBvdXRib3VuZCB0cmFuc2xhdGlvbiBleHRlbmRlZCBhZGRyZXNzIHJlZ2lzdGVyIDIqLworCV9fYmUzMiBfX2lvbWVtICAgIHBleG93YmFyMjsJCS8qIDB4LmM0OCAtIFBDSSBFeHByZXNzIG91dGJvdW5kIHdpbmRvdyBiYXNlIGFkZHJlc3MgcmVnaXN0ZXIgMiovCisJdTggX19pb21lbSAgICByZXM4WzRdOworCV9fYmUzMiBfX2lvbWVtICAgIHBleG93YXIyOwkJLyogMHguYzUwIC0gUENJIEV4cHJlc3Mgb3V0Ym91bmQgd2luZG93IGF0dHJpYnV0ZXMgcmVnaXN0ZXIgMiovCisJdTggX19pb21lbSAgICByZXM5WzEyXTsKKwlfX2JlMzIgX19pb21lbSAgICBwZXhvdGFyMzsJCS8qIDB4LmM2MCAtIFBDSSBFeHByZXNzIG91dGJvdW5kIHRyYW5zbGF0aW9uIGFkZHJlc3MgcmVnaXN0ZXIgMyAqLworCV9fYmUzMiBfX2lvbWVtICAgIHBleG90ZWFyMzsJCS8qIDB4LmM2NCAtIFBDSSBFeHByZXNzIG91dGJvdW5kIHRyYW5zbGF0aW9uIGV4dGVuZGVkIGFkZHJlc3MgcmVnaXN0ZXIgMyovCisJX19iZTMyIF9faW9tZW0gICAgcGV4b3diYXIzOwkJLyogMHguYzY4IC0gUENJIEV4cHJlc3Mgb3V0Ym91bmQgd2luZG93IGJhc2UgYWRkcmVzcyByZWdpc3RlciAzKi8KKwl1OCBfX2lvbWVtICAgIHJlczEwWzRdOworCV9fYmUzMiBfX2lvbWVtICAgIHBleG93YXIzOwkJLyogMHguYzcwIC0gUENJIEV4cHJlc3Mgb3V0Ym91bmQgd2luZG93IGF0dHJpYnV0ZXMgcmVnaXN0ZXIgMyovCisJdTggX19pb21lbSAgICByZXMxMVsxMl07CisJX19iZTMyIF9faW9tZW0gICAgcGV4b3RhcjQ7CQkvKiAweC5jODAgLSBQQ0kgRXhwcmVzcyBvdXRib3VuZCB0cmFuc2xhdGlvbiBhZGRyZXNzIHJlZ2lzdGVyIDQgKi8KKwlfX2JlMzIgX19pb21lbSAgICBwZXhvdGVhcjQ7CQkvKiAweC5jODQgLSBQQ0kgRXhwcmVzcyBvdXRib3VuZCB0cmFuc2xhdGlvbiBleHRlbmRlZCBhZGRyZXNzIHJlZ2lzdGVyIDQqLworCV9fYmUzMiBfX2lvbWVtICAgIHBleG93YmFyNDsJCS8qIDB4LmM4OCAtIFBDSSBFeHByZXNzIG91dGJvdW5kIHdpbmRvdyBiYXNlIGFkZHJlc3MgcmVnaXN0ZXIgNCovCisJdTggX19pb21lbSAgICByZXMxMls0XTsKKwlfX2JlMzIgX19pb21lbSAgICBwZXhvd2FyNDsJCS8qIDB4LmM5MCAtIFBDSSBFeHByZXNzIG91dGJvdW5kIHdpbmRvdyBhdHRyaWJ1dGVzIHJlZ2lzdGVyIDQqLworCXU4IF9faW9tZW0gICAgcmVzMTNbMTJdOworCXU4IF9faW9tZW0gICAgcmVzMTRbMjU2XTsKKwlfX2JlMzIgX19pb21lbSAgICBwZXhpdGFyMzsJCS8qIDB4LmRhMCAtIFBDSSBFeHByZXNzIGluYm91bmQgdHJhbnNsYXRpb24gYWRkcmVzcyByZWdpc3RlciAzICovCisJdTggX19pb21lbSAgICByZXMxNVs0XTsKKwlfX2JlMzIgX19pb21lbSAgICBwZXhpd2JhcjM7CQkvKiAweC5kYTggLSBQQ0kgRXhwcmVzcyBpbmJvdW5kIHdpbmRvdyBiYXNlIGFkZHJlc3MgcmVnaXN0ZXIgMyAqLworCV9fYmUzMiBfX2lvbWVtICAgIHBleGl3YmVhcjM7CQkvKiAweC5kYWMgLSBQQ0kgRXhwcmVzcyBpbmJvdW5kIHdpbmRvdyBiYXNlIGV4dGVuZGVkIGFkZHJlc3MgcmVnaXN0ZXIgMyAqLworCV9fYmUzMiBfX2lvbWVtICAgIHBleGl3YXIzOwkJLyogMHguZGIwIC0gUENJIEV4cHJlc3MgaW5ib3VuZCB3aW5kb3cgYXR0cmlidXRlcyByZWdpc3RlciAzICovCisJdTggX19pb21lbSAgICByZXMxNlsxMl07CisJX19iZTMyIF9faW9tZW0gICAgcGV4aXRhcjI7CQkvKiAweC5kYzAgLSBQQ0kgRXhwcmVzcyBpbmJvdW5kIHRyYW5zbGF0aW9uIGFkZHJlc3MgcmVnaXN0ZXIgMiAqLworCXU4IF9faW9tZW0gICAgcmVzMTdbNF07CisJX19iZTMyIF9faW9tZW0gICAgcGV4aXdiYXIyOwkJLyogMHguZGM4IC0gUENJIEV4cHJlc3MgaW5ib3VuZCB3aW5kb3cgYmFzZSBhZGRyZXNzIHJlZ2lzdGVyIDIgKi8KKwlfX2JlMzIgX19pb21lbSAgICBwZXhpd2JlYXIyOwkJLyogMHguZGNjIC0gUENJIEV4cHJlc3MgaW5ib3VuZCB3aW5kb3cgYmFzZSBleHRlbmRlZCBhZGRyZXNzIHJlZ2lzdGVyIDIgKi8KKwlfX2JlMzIgX19pb21lbSAgICBwZXhpd2FyMjsJCS8qIDB4LmRkMCAtIFBDSSBFeHByZXNzIGluYm91bmQgd2luZG93IGF0dHJpYnV0ZXMgcmVnaXN0ZXIgMiAqLworCXU4IF9faW9tZW0gICAgcmVzMThbMTJdOworCV9fYmUzMiBfX2lvbWVtICAgIHBleGl0YXIxOwkJLyogMHguZGUwIC0gUENJIEV4cHJlc3MgaW5ib3VuZCB0cmFuc2xhdGlvbiBhZGRyZXNzIHJlZ2lzdGVyIDIgKi8KKwl1OCBfX2lvbWVtICAgIHJlczE5WzRdOworCV9fYmUzMiBfX2lvbWVtICAgIHBleGl3YmFyMTsJCS8qIDB4LmRlOCAtIFBDSSBFeHByZXNzIGluYm91bmQgd2luZG93IGJhc2UgYWRkcmVzcyByZWdpc3RlciAyICovCisJX19iZTMyIF9faW9tZW0gICAgcGV4aXdiZWFyMTsJCS8qIDB4LmRlYyAtIFBDSSBFeHByZXNzIGluYm91bmQgd2luZG93IGJhc2UgZXh0ZW5kZWQgYWRkcmVzcyByZWdpc3RlciAyICovCisJX19iZTMyIF9faW9tZW0gICAgcGV4aXdhcjE7CQkvKiAweC5kZjAgLSBQQ0kgRXhwcmVzcyBpbmJvdW5kIHdpbmRvdyBhdHRyaWJ1dGVzIHJlZ2lzdGVyIDIgKi8KKwl1OCBfX2lvbWVtICAgIHJlczIwWzEyXTsKKwlfX2JlMzIgX19pb21lbSAgICBwZXhfZXJyX2RyOwkJLyogMHguZTAwIC0gUENJIEV4cHJlc3MgZXJyb3IgZGV0ZWN0IHJlZ2lzdGVyICovCisJdTggX19pb21lbSAgICByZXMyMVs0XTsKKwlfX2JlMzIgX19pb21lbSAgICBwZXhfZXJyX2VuOwkJLyogMHguZTA4IC0gUENJIEV4cHJlc3MgZXJyb3IgaW50ZXJydXB0IGVuYWJsZSByZWdpc3RlciAqLworCXU4IF9faW9tZW0gICAgcmVzMjJbNF07CisJX19iZTMyIF9faW9tZW0gICAgcGV4X2Vycl9kaXNyOwkJLyogMHguZTEwIC0gUENJIEV4cHJlc3MgZXJyb3IgZGlzYWJsZSByZWdpc3RlciAqLworCXU4IF9faW9tZW0gICAgcmVzMjNbMTJdOworCV9fYmUzMiBfX2lvbWVtICAgIHBleF9lcnJfY2FwX3N0YXQ7CS8qIDB4LmUyMCAtIFBDSSBFeHByZXNzIGVycm9yIGNhcHR1cmUgc3RhdHVzIHJlZ2lzdGVyICovCisJdTggX19pb21lbSAgICByZXMyNFs0XTsKKwlfX2JlMzIgX19pb21lbSAgICBwZXhfZXJyX2NhcF9yMDsJLyogMHguZTI4IC0gUENJIEV4cHJlc3MgZXJyb3IgY2FwdHVyZSByZWdpc3RlciAwICovCisJX19iZTMyIF9faW9tZW0gICAgcGV4X2Vycl9jYXBfcjE7CS8qIDB4LmUyYyAtIFBDSSBFeHByZXNzIGVycm9yIGNhcHR1cmUgcmVnaXN0ZXIgMCAqLworCV9fYmUzMiBfX2lvbWVtICAgIHBleF9lcnJfY2FwX3IyOwkvKiAweC5lMzAgLSBQQ0kgRXhwcmVzcyBlcnJvciBjYXB0dXJlIHJlZ2lzdGVyIDAgKi8KKwlfX2JlMzIgX19pb21lbSAgICBwZXhfZXJyX2NhcF9yMzsJLyogMHguZTM0IC0gUENJIEV4cHJlc3MgZXJyb3IgY2FwdHVyZSByZWdpc3RlciAwICovCit9OworCisjZW5kaWYgLyogX19QT1dFUlBDX0ZTTF9QQ0lFX0ggKi8KKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9zb2MuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3NvYy5jCmluZGV4IGQyMGYwMjkyLi44YTEyM2M3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9zb2MuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9zb2MuYwpAQCAtNTIsNyArNTIsNyBAQAogCXNvYyA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKE5VTEwsICJzb2MiKTsKIAlpZiAoc29jKSB7CiAJCXVuc2lnbmVkIGludCBzaXplOwotCQljb25zdCB2b2lkICpwcm9wID0gZ2V0X3Byb3BlcnR5KHNvYywgInJlZyIsICZzaXplKTsKKwkJY29uc3Qgdm9pZCAqcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShzb2MsICJyZWciLCAmc2l6ZSk7CiAKIAkJaWYgKHByb3ApCiAJCQlpbW1yYmFzZSA9IG9mX3RyYW5zbGF0ZV9hZGRyZXNzKHNvYywgcHJvcCk7CkBAIC03OCw4ICs3OCw4IEBACiAJbm9kZSA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKE5VTEwsICJjcG0iKTsKIAlpZiAobm9kZSkgewogCQl1bnNpZ25lZCBpbnQgc2l6ZTsKLQkJY29uc3QgdW5zaWduZWQgaW50ICpwcm9wID0gZ2V0X3Byb3BlcnR5KG5vZGUsICJicmctZnJlcXVlbmN5IiwKLQkJCQkJJnNpemUpOworCQljb25zdCB1bnNpZ25lZCBpbnQgKnByb3AgPSBvZl9nZXRfcHJvcGVydHkobm9kZSwKKwkJCQkJImJyZy1mcmVxdWVuY3kiLCAmc2l6ZSk7CiAKIAkJaWYgKHByb3ApCiAJCQlicmdmcmVxID0gKnByb3A7CkBAIC0xMDMsOCArMTAzLDggQEAKIAlub2RlID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUoTlVMTCwgInNlcmlhbCIpOwogCWlmIChub2RlKSB7CiAJCXVuc2lnbmVkIGludCBzaXplOwotCQljb25zdCB1bnNpZ25lZCBpbnQgKnByb3AgPSBnZXRfcHJvcGVydHkobm9kZSwgImN1cnJlbnQtc3BlZWQiLAotCQkJCSZzaXplKTsKKwkJY29uc3QgdW5zaWduZWQgaW50ICpwcm9wID0gb2ZfZ2V0X3Byb3BlcnR5KG5vZGUsCisJCQkJImN1cnJlbnQtc3BlZWQiLCAmc2l6ZSk7CiAKIAkJaWYgKHByb3ApCiAJCQlmc19iYXVkcmF0ZSA9ICpwcm9wOwpAQCAtMTUzLDcgKzE1Myw4IEBACiAJCXdoaWxlICgoY2hpbGQgPSBvZl9nZXRfbmV4dF9jaGlsZChucCwgY2hpbGQpKSAhPSBOVUxMKSB7CiAJCQlpbnQgaXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAoY2hpbGQsIDApOwogCQkJaWYgKGlycSAhPSBOT19JUlEpIHsKLQkJCQljb25zdCB1MzIgKmlkID0gZ2V0X3Byb3BlcnR5KGNoaWxkLCAicmVnIiwgTlVMTCk7CisJCQkJY29uc3QgdTMyICppZCA9IG9mX2dldF9wcm9wZXJ0eShjaGlsZCwKKwkJCQkJCQkicmVnIiwgTlVMTCk7CiAJCQkJbWRpb19kYXRhLmlycVsqaWRdID0gaXJxOwogCQkJfQogCQl9CkBAIC0yMDksNyArMjEwLDcgQEAKIAogCQlvZl9pcnFfdG9fcmVzb3VyY2UobnAsIDAsICZyWzFdKTsKIAotCQltb2RlbCA9IGdldF9wcm9wZXJ0eShucCwgIm1vZGVsIiwgTlVMTCk7CisJCW1vZGVsID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAibW9kZWwiLCBOVUxMKTsKIAogCQkvKiBJZiB3ZSBhcmVuJ3QgdGhlIEZFQyB3ZSBoYXZlIG11bHRpcGxlIGludGVycnVwdHMgKi8KIAkJaWYgKG1vZGVsICYmIHN0cmNhc2VjbXAobW9kZWwsICJGRUMiKSkgewpAQCAtMjUzLDcgKzI1NCw3IEBACiAJCQkgICAgRlNMX0dJQU5GQVJfREVWX0hBU19WTEFOIHwKIAkJCSAgICBGU0xfR0lBTkZBUl9ERVZfSEFTX0VYVEVOREVEX0hBU0g7CiAKLQkJcGggPSBnZXRfcHJvcGVydHkobnAsICJwaHktaGFuZGxlIiwgTlVMTCk7CisJCXBoID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAicGh5LWhhbmRsZSIsIE5VTEwpOwogCQlwaHkgPSBvZl9maW5kX25vZGVfYnlfcGhhbmRsZSgqcGgpOwogCiAJCWlmIChwaHkgPT0gTlVMTCkgewpAQCAtMjYzLDcgKzI2NCw3IEBACiAKIAkJbWRpbyA9IG9mX2dldF9wYXJlbnQocGh5KTsKIAotCQlpZCA9IGdldF9wcm9wZXJ0eShwaHksICJyZWciLCBOVUxMKTsKKwkJaWQgPSBvZl9nZXRfcHJvcGVydHkocGh5LCAicmVnIiwgTlVMTCk7CiAJCXJldCA9IG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UobWRpbywgMCwgJnJlcyk7CiAJCWlmIChyZXQpIHsKIAkJCW9mX25vZGVfcHV0KHBoeSk7CkBAIC0zMjUsMTEgKzMyNiwxMSBAQAogCQl9CiAKIAkJaTJjX2RhdGEuZGV2aWNlX2ZsYWdzID0gMDsKLQkJZmxhZ3MgPSBnZXRfcHJvcGVydHkobnAsICJkZnNyciIsIE5VTEwpOworCQlmbGFncyA9IG9mX2dldF9wcm9wZXJ0eShucCwgImRmc3JyIiwgTlVMTCk7CiAJCWlmIChmbGFncykKIAkJCWkyY19kYXRhLmRldmljZV9mbGFncyB8PSBGU0xfSTJDX0RFVl9TRVBBUkFURV9ERlNSUjsKIAotCQlmbGFncyA9IGdldF9wcm9wZXJ0eShucCwgImZzbDUyMDAtY2xvY2tpbmciLCBOVUxMKTsKKwkJZmxhZ3MgPSBvZl9nZXRfcHJvcGVydHkobnAsICJmc2w1MjAwLWNsb2NraW5nIiwgTlVMTCk7CiAJCWlmIChmbGFncykKIAkJCWkyY19kYXRhLmRldmljZV9mbGFncyB8PSBGU0xfSTJDX0RFVl9DTE9DS181MjAwOwogCkBAIC0zNzQsNyArMzc1LDcgQEAKIAkJZ290byBub3NvYzsKIAl9CiAKLQlmcmVxID0gZ2V0X3Byb3BlcnR5KHNvYywgImJ1cy1mcmVxdWVuY3kiLCBOVUxMKTsKKwlmcmVxID0gb2ZfZ2V0X3Byb3BlcnR5KHNvYywgImJ1cy1mcmVxdWVuY3kiLCBOVUxMKTsKIAlpZiAoIWZyZXEpIHsKIAkJcmV0ID0gLUVOT0RFVjsKIAkJZ290byBlcnI7CkBAIC00NjYsMTUgKzQ2NywxNSBAQAogCiAJCXVzYl9kYXRhLm9wZXJhdGluZ19tb2RlID0gRlNMX1VTQjJfTVBIX0hPU1Q7CiAKLQkJcHJvcCA9IGdldF9wcm9wZXJ0eShucCwgInBvcnQwIiwgTlVMTCk7CisJCXByb3AgPSBvZl9nZXRfcHJvcGVydHkobnAsICJwb3J0MCIsIE5VTEwpOwogCQlpZiAocHJvcCkKIAkJCXVzYl9kYXRhLnBvcnRfZW5hYmxlcyB8PSBGU0xfVVNCMl9QT1JUMF9FTkFCTEVEOwogCi0JCXByb3AgPSBnZXRfcHJvcGVydHkobnAsICJwb3J0MSIsIE5VTEwpOworCQlwcm9wID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAicG9ydDEiLCBOVUxMKTsKIAkJaWYgKHByb3ApCiAJCQl1c2JfZGF0YS5wb3J0X2VuYWJsZXMgfD0gRlNMX1VTQjJfUE9SVDFfRU5BQkxFRDsKIAotCQlwcm9wID0gZ2V0X3Byb3BlcnR5KG5wLCAicGh5X3R5cGUiLCBOVUxMKTsKKwkJcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShucCwgInBoeV90eXBlIiwgTlVMTCk7CiAJCXVzYl9kYXRhLnBoeV9tb2RlID0gZGV0ZXJtaW5lX3VzYl9waHkocHJvcCk7CiAKIAkJcmV0ID0KQEAgLTUwMSw3ICs1MDIsNyBAQAogCiAJCW9mX2lycV90b19yZXNvdXJjZShucCwgMCwgJnJbMV0pOwogCi0JCXByb3AgPSBnZXRfcHJvcGVydHkobnAsICJkcl9tb2RlIiwgTlVMTCk7CisJCXByb3AgPSBvZl9nZXRfcHJvcGVydHkobnAsICJkcl9tb2RlIiwgTlVMTCk7CiAKIAkJaWYgKCFwcm9wIHx8ICFzdHJjbXAocHJvcCwgImhvc3QiKSkgewogCQkJdXNiX2RhdGEub3BlcmF0aW5nX21vZGUgPSBGU0xfVVNCMl9EUl9IT1NUOwpAQCAtNTM4LDcgKzUzOSw3IEBACiAJCQlnb3RvIGVycjsKIAkJfQogCi0JCXByb3AgPSBnZXRfcHJvcGVydHkobnAsICJwaHlfdHlwZSIsIE5VTEwpOworCQlwcm9wID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAicGh5X3R5cGUiLCBOVUxMKTsKIAkJdXNiX2RhdGEucGh5X21vZGUgPSBkZXRlcm1pbmVfdXNiX3BoeShwcm9wKTsKIAogCQlpZiAodXNiX2Rldl9kcl9ob3N0KSB7CkBAIC02MzMsNyArNjM0LDcgQEAKIAkJCWdvdG8gZXJyOwogCQl9CiAKLQkJbW9kZWwgPSBnZXRfcHJvcGVydHkobnAsICJtb2RlbCIsIE5VTEwpOworCQltb2RlbCA9IG9mX2dldF9wcm9wZXJ0eShucCwgIm1vZGVsIiwgTlVMTCk7CiAJCWlmIChtb2RlbCA9PSBOVUxMKSB7CiAJCQlyZXQgPSAtRU5PREVWOwogCQkJZ290byB1bnJlZzsKQEAgLTY0Myw3ICs2NDQsNyBAQAogCQlpZiAobWFjX2FkZHIpCiAJCQltZW1jcHkoZnNfZW5ldF9kYXRhLm1hY2FkZHIsIG1hY19hZGRyLCA2KTsKIAotCQlwaCA9IGdldF9wcm9wZXJ0eShucCwgInBoeS1oYW5kbGUiLCBOVUxMKTsKKwkJcGggPSBvZl9nZXRfcHJvcGVydHkobnAsICJwaHktaGFuZGxlIiwgTlVMTCk7CiAJCXBoeSA9IG9mX2ZpbmRfbm9kZV9ieV9waGFuZGxlKCpwaCk7CiAKIAkJaWYgKHBoeSA9PSBOVUxMKSB7CkBAIC02NTEsMTIgKzY1MiwxMiBAQAogCQkJZ290byB1bnJlZzsKIAkJfQogCi0JCXBoeV9hZGRyID0gZ2V0X3Byb3BlcnR5KHBoeSwgInJlZyIsIE5VTEwpOworCQlwaHlfYWRkciA9IG9mX2dldF9wcm9wZXJ0eShwaHksICJyZWciLCBOVUxMKTsKIAkJZnNfZW5ldF9kYXRhLnBoeV9hZGRyID0gKnBoeV9hZGRyOwogCi0JCXBoeV9pcnEgPSBnZXRfcHJvcGVydHkocGh5LCAiaW50ZXJydXB0cyIsIE5VTEwpOworCQlwaHlfaXJxID0gb2ZfZ2V0X3Byb3BlcnR5KHBoeSwgImludGVycnVwdHMiLCBOVUxMKTsKIAotCQlpZCA9IGdldF9wcm9wZXJ0eShucCwgImRldmljZS1pZCIsIE5VTEwpOworCQlpZCA9IG9mX2dldF9wcm9wZXJ0eShucCwgImRldmljZS1pZCIsIE5VTEwpOwogCQlmc19lbmV0X2RhdGEuZnNfbm8gPSAqaWQ7CiAJCXN0cmNweShmc19lbmV0X2RhdGEuZnNfdHlwZSwgbW9kZWwpOwogCkBAIC02NjgsOCArNjY5LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHVucmVnOwogICAgICAgICAgICAgICAgIH0KIAotCQlmc19lbmV0X2RhdGEuY2xrX3J4ID0gKigodTMyICopIGdldF9wcm9wZXJ0eShucCwgInJ4LWNsb2NrIiwgTlVMTCkpOwotCQlmc19lbmV0X2RhdGEuY2xrX3R4ID0gKigodTMyICopIGdldF9wcm9wZXJ0eShucCwgInR4LWNsb2NrIiwgTlVMTCkpOworCQlmc19lbmV0X2RhdGEuY2xrX3J4ID0gKigodTMyICopb2ZfZ2V0X3Byb3BlcnR5KG5wLAorCQkJCQkJInJ4LWNsb2NrIiwgTlVMTCkpOworCQlmc19lbmV0X2RhdGEuY2xrX3R4ID0gKigodTMyICopb2ZfZ2V0X3Byb3BlcnR5KG5wLAorCQkJCQkJInR4LWNsb2NrIiwgTlVMTCkpOwogCiAJCWlmIChzdHJzdHIobW9kZWwsICJGQ0MiKSkgewogCQkJaW50IGZjY19pbmRleCA9ICppZCAtIDE7CkBAIC02OTAsNyArNjkzLDcgQEAKIAkJCWZzX2VuZXRfZGF0YS5idXNfaWQgPSAoY2hhciopJmJ1c19pZFsoKmlkKV07CiAJCQlmc19lbmV0X2RhdGEuaW5pdF9pb3BvcnRzID0gaW5pdF9mY2NfaW9wb3J0czsKIAotCQkJbWRpb19iYl9wcm9wID0gZ2V0X3Byb3BlcnR5KHBoeSwgImJpdGJhbmciLCBOVUxMKTsKKwkJCW1kaW9fYmJfcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShwaHksICJiaXRiYW5nIiwgTlVMTCk7CiAJCQlpZiAobWRpb19iYl9wcm9wKSB7CiAJCQkJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZnNfZW5ldF9tZGlvX2JiX2RldjsKIAkJCQlzdHJ1Y3QgZnNfbWlpX2JiX3BsYXRmb3JtX2luZm8gZnNfZW5ldF9tZGlvX2JiX2RhdGE7CkBAIC03OTYsMTAgKzc5OSwxMCBAQAogCQkJZ290byBlcnI7CiAJCX0KIAotCQlpZCA9IGdldF9wcm9wZXJ0eShucCwgImRldmljZS1pZCIsIE5VTEwpOworCQlpZCA9IG9mX2dldF9wcm9wZXJ0eShucCwgImRldmljZS1pZCIsIE5VTEwpOwogCQljcG1fdWFydF9kYXRhLmZzX25vID0gKmlkOwogCi0JCW1vZGVsID0gKGNoYXIqKWdldF9wcm9wZXJ0eShucCwgIm1vZGVsIiwgTlVMTCk7CisJCW1vZGVsID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAibW9kZWwiLCBOVUxMKTsKIAkJc3RyY3B5KGNwbV91YXJ0X2RhdGEuZnNfdHlwZSwgbW9kZWwpOwogCiAJCWNwbV91YXJ0X2RhdGEudWFydF9jbGsgPSBwcGNfcHJvY19mcmVxOwpAQCAtODA4LDggKzgxMSwxMCBAQAogCQljcG1fdWFydF9kYXRhLnR4X2J1Zl9zaXplID0gMzI7CiAJCWNwbV91YXJ0X2RhdGEucnhfbnVtX2ZpZm8gPSA0OwogCQljcG1fdWFydF9kYXRhLnJ4X2J1Zl9zaXplID0gMzI7Ci0JCWNwbV91YXJ0X2RhdGEuY2xrX3J4ID0gKigodTMyICopIGdldF9wcm9wZXJ0eShucCwgInJ4LWNsb2NrIiwgTlVMTCkpOwotCQljcG1fdWFydF9kYXRhLmNsa190eCA9ICooKHUzMiAqKSBnZXRfcHJvcGVydHkobnAsICJ0eC1jbG9jayIsIE5VTEwpKTsKKwkJY3BtX3VhcnRfZGF0YS5jbGtfcnggPSAqKCh1MzIgKilvZl9nZXRfcHJvcGVydHkobnAsCisJCQkJCQkicngtY2xvY2siLCBOVUxMKSk7CisJCWNwbV91YXJ0X2RhdGEuY2xrX3R4ID0gKigodTMyICopb2ZfZ2V0X3Byb3BlcnR5KG5wLAorCQkJCQkJInR4LWNsb2NrIiwgTlVMTCkpOwogCiAJCXJldCA9CiAJCSAgICBwbGF0Zm9ybV9kZXZpY2VfYWRkX2RhdGEoY3BtX3VhcnRfZGV2LCAmY3BtX3VhcnRfZGF0YSwKQEAgLTgzMyw3ICs4MzgsNyBAQAogI2lmZGVmIENPTkZJR184eHgKIAogZXh0ZXJuIHZvaWQgaW5pdF9zY2NfaW9wb3J0cyhzdHJ1Y3QgZnNfcGxhdGZvcm1faW5mbyopOwotZXh0ZXJuIGludCBwbGF0Zm9ybV9kZXZpY2Vfc2tpcChjaGFyICptb2RlbCwgaW50IGlkKTsKK2V4dGVybiBpbnQgcGxhdGZvcm1fZGV2aWNlX3NraXAoY29uc3QgY2hhciAqbW9kZWwsIGludCBpZCk7CiAKIHN0YXRpYyBpbnQgX19pbml0IGZzX2VuZXRfbWRpb19vZl9pbml0KHZvaWQpCiB7CkBAIC05MDAsMjEgKzkwNSwyMiBAQAogCQlzdHJ1Y3QgcmVzb3VyY2Ugcls0XTsKIAkJc3RydWN0IGRldmljZV9ub2RlICpwaHkgPSBOVUxMLCAqbWRpbyA9IE5VTEw7CiAJCXN0cnVjdCBmc19wbGF0Zm9ybV9pbmZvIGZzX2VuZXRfZGF0YTsKLQkJdW5zaWduZWQgaW50ICppZCwgKnBoeV9hZGRyOworCQljb25zdCB1bnNpZ25lZCBpbnQgKmlkOworCQljb25zdCB1bnNpZ25lZCBpbnQgKnBoeV9hZGRyOwogCQl2b2lkICptYWNfYWRkcjsKLQkJcGhhbmRsZSAqcGg7Ci0JCWNoYXIgKm1vZGVsOworCQljb25zdCBwaGFuZGxlICpwaDsKKwkJY29uc3QgY2hhciAqbW9kZWw7CiAKIAkJbWVtc2V0KHIsIDAsIHNpemVvZihyKSk7CiAJCW1lbXNldCgmZnNfZW5ldF9kYXRhLCAwLCBzaXplb2YoZnNfZW5ldF9kYXRhKSk7CiAKLQkJbW9kZWwgPSAoY2hhciAqKWdldF9wcm9wZXJ0eShucCwgIm1vZGVsIiwgTlVMTCk7CisJCW1vZGVsID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAibW9kZWwiLCBOVUxMKTsKIAkJaWYgKG1vZGVsID09IE5VTEwpIHsKIAkJCXJldCA9IC1FTk9ERVY7CiAJCQlnb3RvIHVucmVnOwogCQl9CiAKLQkJaWQgPSAodTMyICopIGdldF9wcm9wZXJ0eShucCwgImRldmljZS1pZCIsIE5VTEwpOworCQlpZCA9IG9mX2dldF9wcm9wZXJ0eShucCwgImRldmljZS1pZCIsIE5VTEwpOwogCQlmc19lbmV0X2RhdGEuZnNfbm8gPSAqaWQ7CiAKIAkJaWYgKHBsYXRmb3JtX2RldmljZV9za2lwKG1vZGVsLCAqaWQpKQpAQCAtOTI5LDEyICs5MzUsMTIgQEAKIAkJaWYgKG1hY19hZGRyKQogCQkJbWVtY3B5KGZzX2VuZXRfZGF0YS5tYWNhZGRyLCBtYWNfYWRkciwgNik7CiAKLQkJcGggPSAocGhhbmRsZSAqKSBnZXRfcHJvcGVydHkobnAsICJwaHktaGFuZGxlIiwgTlVMTCk7CisJCXBoID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAicGh5LWhhbmRsZSIsIE5VTEwpOwogCQlpZiAocGggIT0gTlVMTCkKIAkJCXBoeSA9IG9mX2ZpbmRfbm9kZV9ieV9waGFuZGxlKCpwaCk7CiAKIAkJaWYgKHBoeSAhPSBOVUxMKSB7Ci0JCQlwaHlfYWRkciA9ICh1MzIgKikgZ2V0X3Byb3BlcnR5KHBoeSwgInJlZyIsIE5VTEwpOworCQkJcGh5X2FkZHIgPSBvZl9nZXRfcHJvcGVydHkocGh5LCAicmVnIiwgTlVMTCk7CiAJCQlmc19lbmV0X2RhdGEucGh5X2FkZHIgPSAqcGh5X2FkZHI7CiAJCQlmc19lbmV0X2RhdGEuaGFzX3BoeSA9IDE7CiAKQEAgLTk0Nyw3ICs5NTMsNyBAQAogCQkJfQogCQl9CiAKLQkJbW9kZWwgPSAoY2hhciopZ2V0X3Byb3BlcnR5KG5wLCAibW9kZWwiLCBOVUxMKTsKKwkJbW9kZWwgPSBvZl9nZXRfcHJvcGVydHkobnAsICJtb2RlbCIsIE5VTEwpOwogCQlzdHJjcHkoZnNfZW5ldF9kYXRhLmZzX3R5cGUsIG1vZGVsKTsKIAogCQlpZiAoc3Ryc3RyKG1vZGVsLCAiRkVDIikpIHsKQEAgLTEwMzgsOCArMTA0NCw4IEBACiAJICAgICBpKyspIHsKIAkJc3RydWN0IHJlc291cmNlIHJbM107CiAJCXN0cnVjdCBmc191YXJ0X3BsYXRmb3JtX2luZm8gY3BtX3VhcnRfZGF0YTsKLQkJaW50ICppZDsKLQkJY2hhciAqbW9kZWw7CisJCWNvbnN0IGludCAqaWQ7CisJCWNvbnN0IGNoYXIgKm1vZGVsOwogCiAJCW1lbXNldChyLCAwLCBzaXplb2YocikpOwogCQltZW1zZXQoJmNwbV91YXJ0X2RhdGEsIDAsIHNpemVvZihjcG1fdWFydF9kYXRhKSk7CkBAIC0xMDY2LDEwICsxMDcyLDEwIEBACiAJCQlnb3RvIGVycjsKIAkJfQogCi0JCW1vZGVsID0gKGNoYXIqKWdldF9wcm9wZXJ0eShucCwgIm1vZGVsIiwgTlVMTCk7CisJCW1vZGVsID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAibW9kZWwiLCBOVUxMKTsKIAkJc3RyY3B5KGNwbV91YXJ0X2RhdGEuZnNfdHlwZSwgbW9kZWwpOwogCi0JCWlkID0gKGludCopZ2V0X3Byb3BlcnR5KG5wLCAiZGV2aWNlLWlkIiwgTlVMTCk7CisJCWlkID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAiZGV2aWNlLWlkIiwgTlVMTCk7CiAJCWNwbV91YXJ0X2RhdGEuZnNfbm8gPSAqaWQ7CiAJCWNwbV91YXJ0X2RhdGEudWFydF9jbGsgPSBwcGNfcHJvY19mcmVxOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L21waWMuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXBpYy5jCmluZGV4IGJjZmI5MDAuLjBiODRiN2MgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXBpYy5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXBpYy5jCkBAIC0zMDQsNyArMzA0LDcgQEAKIAl9CiB9CiAKLSNpZmRlZiBDT05GSUdfTVBJQ19CUk9LRU5fVTMKKyNpZmRlZiBDT05GSUdfTVBJQ19VM19IVF9JUlFTCiAKIC8qIFRlc3QgaWYgYW4gaW50ZXJydXB0IGlzIHNvdXJjZWQgZnJvbSBIeXBlclRyYW5zcG9ydCAodXNlZCBvbiBicm9rZW4gVTNzKQogICogdG8gZm9yY2UgdGhlIGVkZ2Ugc2V0dGluZyBvbiB0aGUgTVBJQyBhbmQgZG8gdGhlIGFjayB3b3JrYXJvdW5kLgpAQCAtNDc2LDcgKzQ3Niw3IEBACiAJfQogfQogCi0jZWxzZSAvKiBDT05GSUdfTVBJQ19CUk9LRU5fVTMgKi8KKyNlbHNlIC8qIENPTkZJR19NUElDX1UzX0hUX0lSUVMgKi8KIAogc3RhdGljIGlubGluZSBpbnQgbXBpY19pc19odF9pbnRlcnJ1cHQoc3RydWN0IG1waWMgKm1waWMsIHVuc2lnbmVkIGludCBzb3VyY2UpCiB7CkBAIC00ODcsNyArNDg3LDcgQEAKIHsKIH0KIAotI2VuZGlmIC8qIENPTkZJR19NUElDX0JST0tFTl9VMyAqLworI2VuZGlmIC8qIENPTkZJR19NUElDX1UzX0hUX0lSUVMgKi8KIAogCiAjZGVmaW5lIG1waWNfaXJxX3RvX2h3KHZpcnEpCSgodW5zaWduZWQgaW50KWlycV9tYXBbdmlycV0uaHdpcnEpCkBAIC02MTUsNyArNjE1LDcgQEAKIAltcGljX2VvaShtcGljKTsKIH0KIAotI2lmZGVmIENPTkZJR19NUElDX0JST0tFTl9VMworI2lmZGVmIENPTkZJR19NUElDX1UzX0hUX0lSUVMKIAogc3RhdGljIHZvaWQgbXBpY191bm1hc2tfaHRfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7CkBAIC02NjUsNyArNjY1LDcgQEAKIAkJbXBpY19odF9lbmRfaXJxKG1waWMsIHNyYyk7CiAJbXBpY19lb2kobXBpYyk7CiB9Ci0jZW5kaWYgLyogIUNPTkZJR19NUElDX0JST0tFTl9VMyAqLworI2VuZGlmIC8qICFDT05GSUdfTVBJQ19VM19IVF9JUlFTICovCiAKICNpZmRlZiBDT05GSUdfU01QCiAKQEAgLTc4OCw3ICs3ODgsNyBAQAogfTsKICNlbmRpZiAvKiBDT05GSUdfU01QICovCiAKLSNpZmRlZiBDT05GSUdfTVBJQ19CUk9LRU5fVTMKKyNpZmRlZiBDT05GSUdfTVBJQ19VM19IVF9JUlFTCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIG1waWNfaXJxX2h0X2NoaXAgPSB7CiAJLnN0YXJ0dXAJPSBtcGljX3N0YXJ0dXBfaHRfaXJxLAogCS5zaHV0ZG93bgk9IG1waWNfc2h1dGRvd25faHRfaXJxLApAQCAtNzk3LDcgKzc5Nyw3IEBACiAJLmVvaQkJPSBtcGljX2VuZF9odF9pcnEsCiAJLnNldF90eXBlCT0gbXBpY19zZXRfaXJxX3R5cGUsCiB9OwotI2VuZGlmIC8qIENPTkZJR19NUElDX0JST0tFTl9VMyAqLworI2VuZGlmIC8qIENPTkZJR19NUElDX1UzX0hUX0lSUVMgKi8KIAogCiBzdGF0aWMgaW50IG1waWNfaG9zdF9tYXRjaChzdHJ1Y3QgaXJxX2hvc3QgKmgsIHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSkKQEAgLTgzNywxMSArODM3LDExIEBACiAJLyogRGVmYXVsdCBjaGlwICovCiAJY2hpcCA9ICZtcGljLT5oY19pcnE7CiAKLSNpZmRlZiBDT05GSUdfTVBJQ19CUk9LRU5fVTMKKyNpZmRlZiBDT05GSUdfTVBJQ19VM19IVF9JUlFTCiAJLyogQ2hlY2sgZm9yIEhUIGludGVycnVwdHMsIG92ZXJyaWRlIHZlY3ByaSAqLwogCWlmIChtcGljX2lzX2h0X2ludGVycnVwdChtcGljLCBodykpCiAJCWNoaXAgPSAmbXBpYy0+aGNfaHRfaXJxOwotI2VuZGlmIC8qIENPTkZJR19NUElDX0JST0tFTl9VMyAqLworI2VuZGlmIC8qIENPTkZJR19NUElDX1UzX0hUX0lSUVMgKi8KIAogCURCRygibXBpYzogbWFwcGluZyB0byBpcnEgY2hpcCBAJXBcbiIsIGNoaXApOwogCkBAIC05MzcsMTIgKzkzNywxMiBAQAogCW1waWMtPmhjX2lycS50eXBlbmFtZSA9IG5hbWU7CiAJaWYgKGZsYWdzICYgTVBJQ19QUklNQVJZKQogCQltcGljLT5oY19pcnEuc2V0X2FmZmluaXR5ID0gbXBpY19zZXRfYWZmaW5pdHk7Ci0jaWZkZWYgQ09ORklHX01QSUNfQlJPS0VOX1UzCisjaWZkZWYgQ09ORklHX01QSUNfVTNfSFRfSVJRUwogCW1waWMtPmhjX2h0X2lycSA9IG1waWNfaXJxX2h0X2NoaXA7CiAJbXBpYy0+aGNfaHRfaXJxLnR5cGVuYW1lID0gbmFtZTsKIAlpZiAoZmxhZ3MgJiBNUElDX1BSSU1BUlkpCiAJCW1waWMtPmhjX2h0X2lycS5zZXRfYWZmaW5pdHkgPSBtcGljX3NldF9hZmZpbml0eTsKLSNlbmRpZiAvKiBDT05GSUdfTVBJQ19CUk9LRU5fVTMgKi8KKyNlbmRpZiAvKiBDT05GSUdfTVBJQ19VM19IVF9JUlFTICovCiAKICNpZmRlZiBDT05GSUdfU01QCiAJbXBpYy0+aGNfaXBpID0gbXBpY19pcGlfY2hpcDsKQEAgLTk3MCw3ICs5NzAsNyBAQAogCW1waWMtPnNwdXJpb3VzX3ZlYyAgPSBpbnR2ZWNfdG9wOwogCiAJLyogQ2hlY2sgZm9yICJiaWctZW5kaWFuIiBpbiBkZXZpY2UtdHJlZSAqLwotCWlmIChub2RlICYmIGdldF9wcm9wZXJ0eShub2RlLCAiYmlnLWVuZGlhbiIsIE5VTEwpICE9IE5VTEwpCisJaWYgKG5vZGUgJiYgb2ZfZ2V0X3Byb3BlcnR5KG5vZGUsICJiaWctZW5kaWFuIiwgTlVMTCkgIT0gTlVMTCkKIAkJbXBpYy0+ZmxhZ3MgfD0gTVBJQ19CSUdfRU5ESUFOOwogCiAKQEAgLTk4NiwxMyArOTg2LDEzIEBACiAJQlVHX09OKHBhZGRyID09IDAgJiYgbm9kZSA9PSBOVUxMKTsKIAogCS8qIElmIG5vIHBoeXNpY2FsIGFkZHJlc3MgcGFzc2VkIGluLCBjaGVjayBpZiBpdCdzIGRjciBiYXNlZCAqLwotCWlmIChwYWRkciA9PSAwICYmIGdldF9wcm9wZXJ0eShub2RlLCAiZGNyLXJlZyIsIE5VTEwpICE9IE5VTEwpCisJaWYgKHBhZGRyID09IDAgJiYgb2ZfZ2V0X3Byb3BlcnR5KG5vZGUsICJkY3ItcmVnIiwgTlVMTCkgIT0gTlVMTCkKIAkJbXBpYy0+ZmxhZ3MgfD0gTVBJQ19VU0VTX0RDUjsKIAogI2lmZGVmIENPTkZJR19QUENfRENSCiAJaWYgKG1waWMtPmZsYWdzICYgTVBJQ19VU0VTX0RDUikgewogCQljb25zdCB1MzIgKmRiYXNlcDsKLQkJZGJhc2VwID0gZ2V0X3Byb3BlcnR5KG5vZGUsICJkY3ItcmVnIiwgTlVMTCk7CisJCWRiYXNlcCA9IG9mX2dldF9wcm9wZXJ0eShub2RlLCAiZGNyLXJlZyIsIE5VTEwpOwogCQlCVUdfT04oZGJhc2VwID09IE5VTEwpOwogCQltcGljLT5kY3JfYmFzZSA9ICpkYmFzZXA7CiAJCW1waWMtPnJlZ190eXBlID0gbXBpY19hY2Nlc3NfZGNyOwpAQCAtMTAwNiw3ICsxMDA2LDcgQEAKIAkgKi8KIAlpZiAocGFkZHIgPT0gMCAmJiAhKG1waWMtPmZsYWdzICYgTVBJQ19VU0VTX0RDUikpIHsKIAkJY29uc3QgdTMyICpyZWc7Ci0JCXJlZyA9IGdldF9wcm9wZXJ0eShub2RlLCAicmVnIiwgTlVMTCk7CisJCXJlZyA9IG9mX2dldF9wcm9wZXJ0eShub2RlLCAicmVnIiwgTlVMTCk7CiAJCUJVR19PTihyZWcgPT0gTlVMTCk7CiAJCXBhZGRyID0gb2ZfdHJhbnNsYXRlX2FkZHJlc3Mobm9kZSwgcmVnKTsKIAkJQlVHX09OKHBhZGRyID09IE9GX0JBRF9BRERSKTsKQEAgLTExNDIsNyArMTE0Miw3IEBACiAKIAkvKiBEbyB0aGUgSFQgUElDIGZpeHVwcyBvbiBVMyBicm9rZW4gbXBpYyAqLwogCURCRygiTVBJQyBmbGFnczogJXhcbiIsIG1waWMtPmZsYWdzKTsKLQlpZiAoKG1waWMtPmZsYWdzICYgTVBJQ19CUk9LRU5fVTMpICYmIChtcGljLT5mbGFncyAmIE1QSUNfUFJJTUFSWSkpCisJaWYgKChtcGljLT5mbGFncyAmIE1QSUNfVTNfSFRfSVJRUykgJiYgKG1waWMtPmZsYWdzICYgTVBJQ19QUklNQVJZKSkKICAJCW1waWNfc2Nhbl9odF9waWNzKG1waWMpOwogCiAJZm9yIChpID0gMDsgaSA8IG1waWMtPm51bV9zb3VyY2VzOyBpKyspIHsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvcG1pLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3BtaS5jCmluZGV4IGE1MjgyMDEuLjg1YTdjOTkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvcG1pLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9wbWkuYwpAQCAtMzMsNyArMzMsNyBAQAogI2luY2x1ZGUgPGFzbS9vZl9wbGF0Zm9ybS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9wbWkuaD4KLQorI2luY2x1ZGUgPGFzbS9wcm9tLmg+CiAKIHN0cnVjdCBwbWlfZGF0YSB7CiAJc3RydWN0IGxpc3RfaGVhZAloYW5kbGVyOwpAQCAtNDksMjEgKzQ5LDYgQEAKIH07CiAKIAotCi1zdGF0aWMgdm9pZCBfX2lvbWVtICpvZl9pb21hcChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQotewotCXN0cnVjdCByZXNvdXJjZSByZXM7Ci0KLQlpZiAob2ZfYWRkcmVzc190b19yZXNvdXJjZShucCwgMCwgJnJlcykpCi0JCXJldHVybiBOVUxMOwotCi0JcHJfZGVidWcoIlJlc291cmNlIHN0YXJ0OiAweCVseFxuIiwgcmVzLnN0YXJ0KTsKLQlwcl9kZWJ1ZygiUmVzb3VyY2UgZW5kOiAweCVseFxuIiwgcmVzLmVuZCk7Ci0KLQlyZXR1cm4gaW9yZW1hcChyZXMuc3RhcnQsIDEgKyByZXMuZW5kIC0gcmVzLnN0YXJ0KTsKLX0KLQotCiBzdGF0aWMgaW50IHBtaV9pcnFfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7CiAJc3RydWN0IHBtaV9kYXRhICpkYXRhOwpAQCAtMTE4LDYgKzEwMyw3IEBACiAKIHN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHBtaV9tYXRjaFtdID0gewogCXsgLnR5cGUgPSAiaWJtLHBtaSIsIC5uYW1lID0gImlibSxwbWkiIH0sCisJeyAudHlwZSA9ICJpYm0scG1pIiB9LAogCXt9LAogfTsKIApAQCAtMTUzLDcgKzEzOSw3IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCWRhdGEtPnBtaV9yZWcgPSBvZl9pb21hcChucCk7CisJZGF0YS0+cG1pX3JlZyA9IG9mX2lvbWFwKG5wLCAwKTsKIAlpZiAoIWRhdGEtPnBtaV9yZWcpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJwbWk6IGludmFsaWQgcmVnaXN0ZXIgYWRkcmVzcy5cbiIpOwogCQlyYyA9IC1FRkFVTFQ7CkBAIC0yNzksNiArMjY1LDkgQEAKIAlzdHJ1Y3QgcG1pX2RhdGEgKmRhdGE7CiAJZGF0YSA9IGRldmljZS0+ZGV2LmRyaXZlcl9kYXRhOwogCisJaWYgKCFkYXRhKQorCQlyZXR1cm47CisKIAlzcGluX2xvY2soJmRhdGEtPmhhbmRsZXJfc3BpbmxvY2spOwogCWxpc3RfYWRkX3RhaWwoJmhhbmRsZXItPm5vZGUsICZkYXRhLT5oYW5kbGVyKTsKIAlzcGluX3VubG9jaygmZGF0YS0+aGFuZGxlcl9zcGlubG9jayk7CkBAIC0yODksMTEgKzI3OCwxMyBAQAogCQkJICAgIHN0cnVjdCBwbWlfaGFuZGxlciAqaGFuZGxlcikKIHsKIAlzdHJ1Y3QgcG1pX2RhdGEgKmRhdGE7CisJZGF0YSA9IGRldmljZS0+ZGV2LmRyaXZlcl9kYXRhOworCisJaWYgKCFkYXRhKQorCQlyZXR1cm47CiAKIAlwcl9kZWJ1ZygicG1pOiB1bnJlZ2lzdGVyaW5nIGhhbmRsZXIgJXBcbiIsIGhhbmRsZXIpOwogCi0JZGF0YSA9IGRldmljZS0+ZGV2LmRyaXZlcl9kYXRhOwotCiAJc3Bpbl9sb2NrKCZkYXRhLT5oYW5kbGVyX3NwaW5sb2NrKTsKIAlsaXN0X2RlbCgmaGFuZGxlci0+bm9kZSk7CiAJc3Bpbl91bmxvY2soJmRhdGEtPmhhbmRsZXJfc3BpbmxvY2spOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9xZV9saWIvS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvcWVfbGliL0tjb25maWcKaW5kZXggYTcyNWU4MC4uODg3NzM5ZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9xZV9saWIvS2NvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3FlX2xpYi9LY29uZmlnCkBAIC0yLDExICsyLDggQEAKICMgUUUgQ29tbXVuaWNhdGlvbiBvcHRpb25zCiAjCiAKLW1lbnUgIlFFIE9wdGlvbnMiCi0JZGVwZW5kcyBvbiBRVUlDQ19FTkdJTkUKLQogY29uZmlnIFVDQ19TTE9XCi0JYm9vbCAiVUNDIFNsb3cgUHJvdG9jb2xzIFN1cHBvcnQiCisJYm9vbAogCWRlZmF1bHQgbgogCXNlbGVjdCBVQ0MKIAloZWxwCkBAIC0xNCwxMCArMTEsOSBAQAogCSAgcHJvdG9jb2xzOiBVQVJULCBCSVNZTkMsIFFNQwogCiBjb25maWcgVUNDX0ZBU1QKLQlib29sICJVQ0MgRmFzdCBQcm90b2NvbHMgU3VwcG9ydCIKKwlib29sCiAJZGVmYXVsdCBuCiAJc2VsZWN0IFVDQwotCXNlbGVjdCBVQ0NfU0xPVwogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIHByb3ZpZGVzIHFlX2xpYiBzdXBwb3J0IHRvIFVDQyBmYXN0CiAJICBwcm90b2NvbHM6IEhETEMsIEV0aGVybmV0LCBBVE0sIHRyYW5zcGFyZW50CkBAIC0yNiw1ICsyMiwzIEBACiAJYm9vbAogCWRlZmF1bHQgeSBpZiBVQ0NfRkFTVCB8fCBVQ0NfU0xPVwogCi1lbmRtZW51Ci0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvcWVfbGliL3FlLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3FlX2xpYi9xZS5jCmluZGV4IDQzZjZjYzkuLjdmNGMwNzUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvcWVfbGliL3FlLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9xZV9saWIvcWUuYwpAQCAtNzEsNyArNzEsNyBAQAogCXFlID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUoTlVMTCwgInFlIik7CiAJaWYgKHFlKSB7CiAJCXVuc2lnbmVkIGludCBzaXplOwotCQljb25zdCB2b2lkICpwcm9wID0gZ2V0X3Byb3BlcnR5KHFlLCAicmVnIiwgJnNpemUpOworCQljb25zdCB2b2lkICpwcm9wID0gb2ZfZ2V0X3Byb3BlcnR5KHFlLCAicmVnIiwgJnNpemUpOwogCQlxZWJhc2UgPSBvZl90cmFuc2xhdGVfYWRkcmVzcyhxZSwgcHJvcCk7CiAJCW9mX25vZGVfcHV0KHFlKTsKIAl9OwpAQCAtMTU4LDcgKzE1OCw3IEBACiAJcWUgPSBvZl9maW5kX25vZGVfYnlfdHlwZShOVUxMLCAicWUiKTsKIAlpZiAocWUpIHsKIAkJdW5zaWduZWQgaW50IHNpemU7Ci0JCWNvbnN0IHUzMiAqcHJvcCA9IGdldF9wcm9wZXJ0eShxZSwgImJyZy1mcmVxdWVuY3kiLCAmc2l6ZSk7CisJCWNvbnN0IHUzMiAqcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShxZSwgImJyZy1mcmVxdWVuY3kiLCAmc2l6ZSk7CiAJCWJyZ19jbGsgPSAqcHJvcDsKIAkJb2Zfbm9kZV9wdXQocWUpOwogCX07CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3FlX2xpYi9xZV9pby5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9xZV9saWIvcWVfaW8uYwppbmRleCAwYWZlNmJmLi5lMzJiNDViIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3FlX2xpYi9xZV9pby5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvcWVfbGliL3FlX2lvLmMKQEAgLTUzLDcgKzUzLDcgQEAKIAkJcmV0dXJuIHJldDsKIAlwYXJfaW8gPSBpb3JlbWFwKHJlcy5zdGFydCwgcmVzLmVuZCAtIHJlcy5zdGFydCArIDEpOwogCi0JbnVtX3BvcnRzID0gZ2V0X3Byb3BlcnR5KG5wLCAibnVtLXBvcnRzIiwgTlVMTCk7CisJbnVtX3BvcnRzID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAibnVtLXBvcnRzIiwgTlVMTCk7CiAJaWYgKG51bV9wb3J0cykKIAkJbnVtX3Bhcl9pb19wb3J0cyA9ICpudW1fcG9ydHM7CiAKQEAgLTE2MSw3ICsxNjEsNyBAQAogCQlyZXR1cm4gLTE7CiAJfQogCi0JcGggPSBnZXRfcHJvcGVydHkobnAsICJwaW8taGFuZGxlIiwgTlVMTCk7CisJcGggPSBvZl9nZXRfcHJvcGVydHkobnAsICJwaW8taGFuZGxlIiwgTlVMTCk7CiAJaWYgKHBoID09IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJwaW8taGFuZGxlIG5vdCBhdmFpbGFibGUgXG4iKTsKIAkJcmV0dXJuIC0xOwpAQCAtMTY5LDcgKzE2OSw3IEBACiAKIAlwaW8gPSBvZl9maW5kX25vZGVfYnlfcGhhbmRsZSgqcGgpOwogCi0JcGlvX21hcCA9IGdldF9wcm9wZXJ0eShwaW8sICJwaW8tbWFwIiwgJnBpb19tYXBfbGVuKTsKKwlwaW9fbWFwID0gb2ZfZ2V0X3Byb3BlcnR5KHBpbywgInBpby1tYXAiLCAmcGlvX21hcF9sZW4pOwogCWlmIChwaW9fbWFwID09IE5VTEwpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJwaW8tbWFwIGlzIG5vdCBzZXQhIFxuIik7CiAJCXJldHVybiAtMTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvcWVfbGliL3VjY19mYXN0LmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3FlX2xpYi91Y2NfZmFzdC5jCmluZGV4IGE0NTdhYzEuLjY2MTM3YmYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvcWVfbGliL3VjY19mYXN0LmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9xZV9saWIvdWNjX2Zhc3QuYwpAQCAtMjEwLDYgKzIxMCw5IEBACiAJdWZfcmVncyA9IHVjY2YtPnVmX3JlZ3M7CiAJdWNjZi0+cF91Y2NlID0gKHUzMiAqKSAmICh1Zl9yZWdzLT51Y2NlKTsKIAl1Y2NmLT5wX3VjY20gPSAodTMyICopICYgKHVmX3JlZ3MtPnVjY20pOworI2lmZGVmIENPTkZJR19VR0VUSF9UWF9PTl9ERU1BTkQKKwl1Y2NmLT5wX3V0b2RyID0gKHUxNiAqKSAmICh1Zl9yZWdzLT51dG9kcik7CisjZW5kaWYKICNpZmRlZiBTVEFUSVNUSUNTCiAJdWNjZi0+dHhfZnJhbWVzID0gMDsKIAl1Y2NmLT5yeF9mcmFtZXMgPSAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9xZV9saWIvdWNjX3Nsb3cuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvcWVfbGliL3VjY19zbG93LmMKaW5kZXggODE3ZGY3My4uYjkzMGQ2OCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9xZV9saWIvdWNjX3Nsb3cuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3FlX2xpYi91Y2Nfc2xvdy5jCkBAIC0xODcsNyArMTg3LDcgQEAKIAl1Y2NzLT51c19wcmFtID0gcWVfbXVyYW1fYWRkcih1Y2NzLT51c19wcmFtX29mZnNldCk7CiAKIAkvKiBJbml0IEd1ZW1yIHJlZ2lzdGVyICovCi0JaWYgKChyZXQgPSB1Y2NfaW5pdF9ndWVtcigoc3RydWN0IHVjY19jb21tb24gKikgKHVzX2luZm8tPnJlZ3MpKSkpIHsKKwlpZiAoKHJldCA9IHVjY19pbml0X2d1ZW1yKChzdHJ1Y3QgdWNjX2NvbW1vbiAqKSB1c19yZWdzKSkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogY2Fubm90IGluaXQgR1VFTVIiLCBfX0ZVTkNUSU9OX18pOwogCQl1Y2Nfc2xvd19mcmVlKHVjY3MpOwogCQlyZXR1cm4gcmV0OwpAQCAtMTk1LDcgKzE5NSw3IEBACiAKIAkvKiBTZXQgVUNDIHRvIHNsb3cgdHlwZSAqLwogCWlmICgocmV0ID0gdWNjX3NldF90eXBlKHVzX2luZm8tPnVjY19udW0sCi0JCQkJKHN0cnVjdCB1Y2NfY29tbW9uICopICh1c19pbmZvLT5yZWdzKSwKKwkJCQkoc3RydWN0IHVjY19jb21tb24gKikgdXNfcmVncywKIAkJCQlVQ0NfU1BFRURfVFlQRV9TTE9XKSkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogY2Fubm90IHNldCBVQ0MgdHlwZSIsIF9fRlVOQ1RJT05fXyk7CiAJCXVjY19zbG93X2ZyZWUodWNjcyk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3RpbWVyLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3RpbWVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGEwMTc0OAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvdGltZXIuYwpAQCAtMCwwICsxLDcxIEBACisvKgorICogQ29tbW9uIGNvZGUgdG8ga2VlcCB0aW1lIHdoZW4gbWFjaGluZSBzdXNwZW5kcy4KKyAqCisgKiBDb3B5cmlnaHQgMjAwNwlKb2hhbm5lcyBCZXJnIDxqb2hhbm5lc0BzaXBzb2x1dGlvbnMubmV0PgorICoKKyAqIEdQTHYyCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KKyNpbmNsdWRlIDxhc20vcnRjLmg+CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHN1c3BlbmRfcnRjX3RpbWU7CisKKy8qCisgKiBSZXNldCB0aGUgdGltZSBhZnRlciBhIHNsZWVwLgorICovCitzdGF0aWMgaW50IHRpbWVyX3Jlc3VtZShzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0aW1ldmFsIHR2OworCXN0cnVjdCB0aW1lc3BlYyB0czsKKwlzdHJ1Y3QgcnRjX3RpbWUgY3VyX3J0Y190bTsKKwl1bnNpZ25lZCBsb25nIGN1cl9ydGNfdGltZSwgZGlmZjsKKworCS8qIGdldCBjdXJyZW50IFJUQyB0aW1lIGFuZCBjb252ZXJ0IHRvIHNlY29uZHMgKi8KKwlnZXRfcnRjX3RpbWUoJmN1cl9ydGNfdG0pOworCXJ0Y190bV90b190aW1lKCZjdXJfcnRjX3RtLCAmY3VyX3J0Y190aW1lKTsKKworCWRpZmYgPSBjdXJfcnRjX3RpbWUgLSBzdXNwZW5kX3J0Y190aW1lOworCisJLyogYWRqdXN0IHRpbWUgb2YgZGF5IGJ5IHNlY29uZHMgdGhhdCBlbGFwc2VkIHdoaWxlCisJICogd2Ugd2VyZSBzdXNwZW5kZWQgKi8KKwlkb19nZXR0aW1lb2ZkYXkoJnR2KTsKKwl0cy50dl9zZWMgPSB0di50dl9zZWMgKyBkaWZmOworCXRzLnR2X25zZWMgPSB0di50dl91c2VjICogTlNFQ19QRVJfVVNFQzsKKwlkb19zZXR0aW1lb2ZkYXkoJnRzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRpbWVyX3N1c3BlbmQoc3RydWN0IHN5c19kZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXN0cnVjdCBydGNfdGltZSBzdXNwZW5kX3J0Y190bTsKKwlXQVJOX09OKCFwcGNfbWQuZ2V0X3J0Y190aW1lKTsKKworCWdldF9ydGNfdGltZSgmc3VzcGVuZF9ydGNfdG0pOworCXJ0Y190bV90b190aW1lKCZzdXNwZW5kX3J0Y190bSwgJnN1c3BlbmRfcnRjX3RpbWUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzZGV2X2NsYXNzIHRpbWVyX3N5c2NsYXNzID0geworCS5yZXN1bWUgPSB0aW1lcl9yZXN1bWUsCisJLnN1c3BlbmQgPSB0aW1lcl9zdXNwZW5kLAorCXNldF9rc2V0X25hbWUoInRpbWVyIiksCit9OworCitzdGF0aWMgc3RydWN0IHN5c19kZXZpY2UgZGV2aWNlX3RpbWVyID0geworCS5pZCA9IDAsCisJLmNscyA9ICZ0aW1lcl9zeXNjbGFzcywKK307CisKK3N0YXRpYyBpbnQgdGltZV9pbml0X2RldmljZSh2b2lkKQoreworCWludCBlcnJvciA9IHN5c2Rldl9jbGFzc19yZWdpc3RlcigmdGltZXJfc3lzY2xhc3MpOworCWlmICghZXJyb3IpCisJCWVycm9yID0gc3lzZGV2X3JlZ2lzdGVyKCZkZXZpY2VfdGltZXIpOworCXJldHVybiBlcnJvcjsKK30KKworZGV2aWNlX2luaXRjYWxsKHRpbWVfaW5pdF9kZXZpY2UpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi90c2kxMDhfZGV2LmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3RzaTEwOF9kZXYuYwppbmRleCA5N2YzN2VmLi4zMzcwMzllIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3RzaTEwOF9kZXYuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3RzaTEwOF9kZXYuYwpAQCAtNDgsNyArNDgsNyBAQAogCXRzaSA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKE5VTEwsICJ0c2ktYnJpZGdlIik7CiAJaWYgKHRzaSkgewogCQl1bnNpZ25lZCBpbnQgc2l6ZTsKLQkJY29uc3Qgdm9pZCAqcHJvcCA9IGdldF9wcm9wZXJ0eSh0c2ksICJyZWciLCAmc2l6ZSk7CisJCWNvbnN0IHZvaWQgKnByb3AgPSBvZl9nZXRfcHJvcGVydHkodHNpLCAicmVnIiwgJnNpemUpOwogCQl0c2kxMDhfY3NyX2Jhc2UgPSBvZl90cmFuc2xhdGVfYWRkcmVzcyh0c2ksIHByb3ApOwogCQlvZl9ub2RlX3B1dCh0c2kpOwogCX07CkBAIC03NywxMCArNzcsMTAgQEAKIAkJc3RydWN0IHJlc291cmNlIHJbMl07CiAJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcGh5OwogCQlod19pbmZvIHRzaV9ldGhfZGF0YTsKLQkJdW5zaWduZWQgaW50ICppZDsKLQkJdW5zaWduZWQgaW50ICpwaHlfaWQ7CisJCWNvbnN0IHVuc2lnbmVkIGludCAqaWQ7CisJCWNvbnN0IHVuc2lnbmVkIGludCAqcGh5X2lkOwogCQljb25zdCB2b2lkICptYWNfYWRkcjsKLQkJcGhhbmRsZSAqcGg7CisJCWNvbnN0IHBoYW5kbGUgKnBoOwogCiAJCW1lbXNldChyLCAwLCBzaXplb2YocikpOwogCQltZW1zZXQoJnRzaV9ldGhfZGF0YSwgMCwgc2l6ZW9mKHRzaV9ldGhfZGF0YSkpOwpAQCAtMTA3LDEwICsxMDcsMTAgQEAKIAkJCWdvdG8gZXJyOwogCQl9CiAKLQkJbWFjX2FkZHIgPSBnZXRfcHJvcGVydHkobnAsICJhZGRyZXNzIiwgTlVMTCk7CisJCW1hY19hZGRyID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAiYWRkcmVzcyIsIE5VTEwpOwogCQltZW1jcHkodHNpX2V0aF9kYXRhLm1hY19hZGRyLCBtYWNfYWRkciwgNik7CiAKLQkJcGggPSAocGhhbmRsZSAqKSBnZXRfcHJvcGVydHkobnAsICJwaHktaGFuZGxlIiwgTlVMTCk7CisJCXBoID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAicGh5LWhhbmRsZSIsIE5VTEwpOwogCQlwaHkgPSBvZl9maW5kX25vZGVfYnlfcGhhbmRsZSgqcGgpOwogCiAJCWlmIChwaHkgPT0gTlVMTCkgewpAQCAtMTE4LDggKzExOCw4IEBACiAJCQlnb3RvIHVucmVnOwogCQl9CiAKLQkJaWQgPSAodTMyICopIGdldF9wcm9wZXJ0eShwaHksICJyZWciLCBOVUxMKTsKLQkJcGh5X2lkID0gKHUzMiAqKSBnZXRfcHJvcGVydHkocGh5LCAicGh5LWlkIiwgTlVMTCk7CisJCWlkID0gb2ZfZ2V0X3Byb3BlcnR5KHBoeSwgInJlZyIsIE5VTEwpOworCQlwaHlfaWQgPSBvZl9nZXRfcHJvcGVydHkocGh5LCAicGh5LWlkIiwgTlVMTCk7CiAJCXJldCA9IG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UocGh5LCAwLCAmcmVzKTsKIAkJaWYgKHJldCkgewogCQkJb2Zfbm9kZV9wdXQocGh5KTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvdHNpMTA4X3BjaS5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi90c2kxMDhfcGNpLmMKaW5kZXggYWUyNDljNi4uNThiOWU3ZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi90c2kxMDhfcGNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi90c2kxMDhfcGNpLmMKQEAgLTIxMSw3ICsyMTEsNyBAQAogCWhhc19hZGRyZXNzID0gKG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UoZGV2LCAwLCAmcnNyYykgPT0gMCk7CiAKIAkvKiBHZXQgYnVzIHJhbmdlIGlmIGFueSAqLwotCWJ1c19yYW5nZSA9IGdldF9wcm9wZXJ0eShkZXYsICJidXMtcmFuZ2UiLCAmbGVuKTsKKwlidXNfcmFuZ2UgPSBvZl9nZXRfcHJvcGVydHkoZGV2LCAiYnVzLXJhbmdlIiwgJmxlbik7CiAJaWYgKGJ1c19yYW5nZSA9PSBOVUxMIHx8IGxlbiA8IDIgKiBzaXplb2YoaW50KSkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJDYW4ndCBnZXQgYnVzLXJhbmdlIGZvciAlcywgYXNzdW1lIgogCQkgICAgICAgIiBidXMgMFxuIiwgZGV2LT5mdWxsX25hbWUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi91aWMuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvdWljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY4ZmI0MAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvdWljLmMKQEAgLTAsMCArMSwzNDIgQEAKKy8qCisgKiBhcmNoL3Bvd2VycGMvc3lzZGV2L3VpYy5jCisgKgorICogSUJNIFBvd2VyUEMgNHh4IFVuaXZlcnNhbCBJbnRlcnJ1cHQgQ29udHJvbGxlcgorICoKKyAqIENvcHlyaWdodCAyMDA3IERhdmlkIEdpYnNvbiA8ZHdnQGF1MS5pYm0uY29tPiwgSUJNIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNpbmNsdWRlIDxhc20vZGNyLmg+CisKKyNkZWZpbmUgTlJfVUlDX0lOVFMJMzIKKworI2RlZmluZSBVSUNfU1IJCTB4MAorI2RlZmluZSBVSUNfRVIJCTB4MgorI2RlZmluZSBVSUNfQ1IJCTB4MworI2RlZmluZSBVSUNfUFIJCTB4NAorI2RlZmluZSBVSUNfVFIJCTB4NQorI2RlZmluZSBVSUNfTVNSCQkweDYKKyNkZWZpbmUgVUlDX1ZSCQkweDcKKyNkZWZpbmUgVUlDX1ZDUgkJMHg4CisKKyNkZWZpbmUgdWljX2lycV90b19odyh2aXJxKQkoaXJxX21hcFt2aXJxXS5od2lycSkKKworc3RydWN0IHVpYyAqcHJpbWFyeV91aWM7CisKK3N0cnVjdCB1aWMgeworCWludCBpbmRleDsKKwlpbnQgZGNyYmFzZTsKKworCXNwaW5sb2NrX3QgbG9jazsKKworCS8qIFRoZSByZW1hcHBlciBmb3IgdGhpcyBVSUMgKi8KKwlzdHJ1Y3QgaXJxX2hvc3QJKmlycWhvc3Q7CisKKwkvKiBGb3Igc2Vjb25kYXJ5IFVJQ3MsIHRoZSBjYXNjYWRlIGludGVycnVwdCdzIGlycWFjdGlvbiAqLworCXN0cnVjdCBpcnFhY3Rpb24gY2FzY2FkZTsKKworCS8qIFRoZSBkZXZpY2Ugbm9kZSBvZiB0aGUgaW50ZXJydXB0IGNvbnRyb2xsZXIgKi8KKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX25vZGU7Cit9OworCitzdGF0aWMgdm9pZCB1aWNfdW5tYXNrX2lycSh1bnNpZ25lZCBpbnQgdmlycSkKK3sKKwlzdHJ1Y3QgdWljICp1aWMgPSBnZXRfaXJxX2NoaXBfZGF0YSh2aXJxKTsKKwl1bnNpZ25lZCBpbnQgc3JjID0gdWljX2lycV90b19odyh2aXJxKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiBlcjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ1aWMtPmxvY2ssIGZsYWdzKTsKKwllciA9IG1mZGNyKHVpYy0+ZGNyYmFzZSArIFVJQ19FUik7CisJZXIgfD0gMSA8PCAoMzEgLSBzcmMpOworCW10ZGNyKHVpYy0+ZGNyYmFzZSArIFVJQ19FUiwgZXIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVpYy0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCB1aWNfbWFza19pcnEodW5zaWduZWQgaW50IHZpcnEpCit7CisJc3RydWN0IHVpYyAqdWljID0gZ2V0X2lycV9jaGlwX2RhdGEodmlycSk7CisJdW5zaWduZWQgaW50IHNyYyA9IHVpY19pcnFfdG9faHcodmlycSk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgZXI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdWljLT5sb2NrLCBmbGFncyk7CisJZXIgPSBtZmRjcih1aWMtPmRjcmJhc2UgKyBVSUNfRVIpOworCWVyICY9IH4oMSA8PCAoMzEgLSBzcmMpKTsKKwltdGRjcih1aWMtPmRjcmJhc2UgKyBVSUNfRVIsIGVyKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1aWMtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgdWljX2Fja19pcnEodW5zaWduZWQgaW50IHZpcnEpCit7CisJc3RydWN0IHVpYyAqdWljID0gZ2V0X2lycV9jaGlwX2RhdGEodmlycSk7CisJdW5zaWduZWQgaW50IHNyYyA9IHVpY19pcnFfdG9faHcodmlycSk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ1aWMtPmxvY2ssIGZsYWdzKTsKKwltdGRjcih1aWMtPmRjcmJhc2UgKyBVSUNfU1IsIDEgPDwgKDMxLXNyYykpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVpYy0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IHVpY19zZXRfaXJxX3R5cGUodW5zaWduZWQgaW50IHZpcnEsIHVuc2lnbmVkIGludCBmbG93X3R5cGUpCit7CisJc3RydWN0IHVpYyAqdWljID0gZ2V0X2lycV9jaGlwX2RhdGEodmlycSk7CisJdW5zaWduZWQgaW50IHNyYyA9IHVpY19pcnFfdG9faHcodmlycSk7CisJc3RydWN0IGlycV9kZXNjICpkZXNjID0gZ2V0X2lycV9kZXNjKHZpcnEpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHRyaWdnZXIsIHBvbGFyaXR5OworCXUzMiB0ciwgcHIsIG1hc2s7CisKKwlzd2l0Y2ggKGZsb3dfdHlwZSAmIElSUV9UWVBFX1NFTlNFX01BU0spIHsKKwljYXNlIElSUV9UWVBFX05PTkU6CisJCXVpY19tYXNrX2lycSh2aXJxKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIElSUV9UWVBFX0VER0VfUklTSU5HOgorCQl0cmlnZ2VyID0gMTsgcG9sYXJpdHkgPSAxOworCQlicmVhazsKKwljYXNlIElSUV9UWVBFX0VER0VfRkFMTElORzoKKwkJdHJpZ2dlciA9IDE7IHBvbGFyaXR5ID0gMDsKKwkJYnJlYWs7CisJY2FzZSBJUlFfVFlQRV9MRVZFTF9ISUdIOgorCQl0cmlnZ2VyID0gMDsgcG9sYXJpdHkgPSAxOworCQlicmVhazsKKwljYXNlIElSUV9UWVBFX0xFVkVMX0xPVzoKKwkJdHJpZ2dlciA9IDA7IHBvbGFyaXR5ID0gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbWFzayA9IH4oMSA8PCAoMzEgLSBzcmMpKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ1aWMtPmxvY2ssIGZsYWdzKTsKKwl0ciA9IG1mZGNyKHVpYy0+ZGNyYmFzZSArIFVJQ19UUik7CisJcHIgPSBtZmRjcih1aWMtPmRjcmJhc2UgKyBVSUNfUFIpOworCXRyID0gKHRyICYgbWFzaykgfCAodHJpZ2dlciA8PCAoMzEtc3JjKSk7CisJcHIgPSAocHIgJiBtYXNrKSB8IChwb2xhcml0eSA8PCAoMzEtc3JjKSk7CisKKwltdGRjcih1aWMtPmRjcmJhc2UgKyBVSUNfUFIsIHByKTsKKwltdGRjcih1aWMtPmRjcmJhc2UgKyBVSUNfVFIsIHRyKTsKKworCWRlc2MtPnN0YXR1cyAmPSB+KElSUV9UWVBFX1NFTlNFX01BU0sgfCBJUlFfTEVWRUwpOworCWRlc2MtPnN0YXR1cyB8PSBmbG93X3R5cGUgJiBJUlFfVFlQRV9TRU5TRV9NQVNLOworCWlmICh0cmlnZ2VyKQorCQlkZXNjLT5zdGF0dXMgfD0gSVJRX0xFVkVMOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdWljLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBpcnFfY2hpcCB1aWNfaXJxX2NoaXAgPSB7CisJLnR5cGVuYW1lCT0gIiBVSUMgICIsCisJLnVubWFzawkJPSB1aWNfdW5tYXNrX2lycSwKKwkubWFzawkJPSB1aWNfbWFza19pcnEsCisvKiAJLm1hc2tfYWNrCT0gdWljX21hc2tfaXJxX2FuZF9hY2ssICovCisJLmFjawkJPSB1aWNfYWNrX2lycSwKKwkuc2V0X3R5cGUJPSB1aWNfc2V0X2lycV90eXBlLAorfTsKKworc3RhdGljIGludCB1aWNfaG9zdF9tYXRjaChzdHJ1Y3QgaXJxX2hvc3QgKmgsIHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSkKK3sKKwlzdHJ1Y3QgdWljICp1aWMgPSBoLT5ob3N0X2RhdGE7CisJcmV0dXJuIHVpYy0+b2Zfbm9kZSA9PSBub2RlOworfQorCitzdGF0aWMgaW50IHVpY19ob3N0X21hcChzdHJ1Y3QgaXJxX2hvc3QgKmgsIHVuc2lnbmVkIGludCB2aXJxLAorCQkJaXJxX2h3X251bWJlcl90IGh3KQoreworCXN0cnVjdCB1aWMgKnVpYyA9IGgtPmhvc3RfZGF0YTsKKworCXNldF9pcnFfY2hpcF9kYXRhKHZpcnEsIHVpYyk7CisJLyogRGVzcGl0ZSB0aGUgbmFtZSwgaGFuZGxlX2xldmVsX2lycSgpIHdvcmtzIGZvciBib3RoIGxldmVsCisJICogYW5kIGVkZ2UgaXJxcyBvbiBVSUMuICBGSVhNRTogY2hlY2sgdGhpcyBpcyBjb3JyZWN0ICovCisJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyKHZpcnEsICZ1aWNfaXJxX2NoaXAsIGhhbmRsZV9sZXZlbF9pcnEpOworCisJLyogU2V0IGRlZmF1bHQgaXJxIHR5cGUgKi8KKwlzZXRfaXJxX3R5cGUodmlycSwgSVJRX1RZUEVfTk9ORSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1aWNfaG9zdF94bGF0ZShzdHJ1Y3QgaXJxX2hvc3QgKmgsIHN0cnVjdCBkZXZpY2Vfbm9kZSAqY3QsCisJCQkgIHUzMiAqaW50c3BlYywgdW5zaWduZWQgaW50IGludHNpemUsCisJCQkgIGlycV9od19udW1iZXJfdCAqb3V0X2h3aXJxLCB1bnNpZ25lZCBpbnQgKm91dF90eXBlKQorCit7CisJLyogVUlDIGludHNwZWNzIG11c3QgaGF2ZSAyIGNlbGxzICovCisJQlVHX09OKGludHNpemUgIT0gMik7CisJKm91dF9od2lycSA9IGludHNwZWNbMF07CisJKm91dF90eXBlID0gaW50c3BlY1sxXTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBpcnFfaG9zdF9vcHMgdWljX2hvc3Rfb3BzID0geworCS5tYXRjaAk9IHVpY19ob3N0X21hdGNoLAorCS5tYXAJPSB1aWNfaG9zdF9tYXAsCisJLnhsYXRlCT0gdWljX2hvc3RfeGxhdGUsCit9OworCitpcnFyZXR1cm5fdCB1aWNfY2FzY2FkZShpbnQgdmlycSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgdWljICp1aWMgPSBkYXRhOworCXUzMiBtc3I7CisJaW50IHNyYzsKKwlpbnQgc3VidmlycTsKKworCW1zciA9IG1mZGNyKHVpYy0+ZGNyYmFzZSArIFVJQ19NU1IpOworCXNyYyA9IDMyIC0gZmZzKG1zcik7CisKKwlzdWJ2aXJxID0gaXJxX2xpbmVhcl9yZXZtYXAodWljLT5pcnFob3N0LCBzcmMpOworCWdlbmVyaWNfaGFuZGxlX2lycShzdWJ2aXJxKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHN0cnVjdCB1aWMgKiBfX2luaXQgdWljX2luaXRfb25lKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSkKK3sKKwlzdHJ1Y3QgdWljICp1aWM7CisJY29uc3QgdTMyICppbmRleHAsICpkY3JyZWc7CisJaW50IGxlbjsKKworCUJVR19PTighIGRldmljZV9pc19jb21wYXRpYmxlKG5vZGUsICJpYm0sdWljIikpOworCisJdWljID0gYWxsb2NfYm9vdG1lbShzaXplb2YoKnVpYykpOworCWlmICghIHVpYykKKwkJcmV0dXJuIE5VTEw7IC8qIEZJWE1FOiBwYW5pYz8gKi8KKworCW1lbXNldCh1aWMsIDAsIHNpemVvZigqdWljKSk7CisJc3Bpbl9sb2NrX2luaXQoJnVpYy0+bG9jayk7CisJdWljLT5vZl9ub2RlID0gb2Zfbm9kZV9nZXQobm9kZSk7CisJaW5kZXhwID0gb2ZfZ2V0X3Byb3BlcnR5KG5vZGUsICJjZWxsLWluZGV4IiwgJmxlbik7CisJaWYgKCFpbmRleHAgfHwgKGxlbiAhPSBzaXplb2YodTMyKSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ1aWM6IERldmljZSBub2RlICVzIGhhcyBtaXNzaW5nIG9yIGludmFsaWQgIgorCQkgICAgICAgImNlbGwtaW5kZXggcHJvcGVydHlcbiIsIG5vZGUtPmZ1bGxfbmFtZSk7CisJCXJldHVybiBOVUxMOworCX0KKwl1aWMtPmluZGV4ID0gKmluZGV4cDsKKworCWRjcnJlZyA9IG9mX2dldF9wcm9wZXJ0eShub2RlLCAiZGNyLXJlZyIsICZsZW4pOworCWlmICghZGNycmVnIHx8IChsZW4gIT0gMipzaXplb2YodTMyKSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ1aWM6IERldmljZSBub2RlICVzIGhhcyBtaXNzaW5nIG9yIGludmFsaWQgIgorCQkgICAgICAgImRjci1yZWcgcHJvcGVydHlcbiIsIG5vZGUtPmZ1bGxfbmFtZSk7CisJCXJldHVybiBOVUxMOworCX0KKwl1aWMtPmRjcmJhc2UgPSAqZGNycmVnOworCisJdWljLT5pcnFob3N0ID0gaXJxX2FsbG9jX2hvc3QoSVJRX0hPU1RfTUFQX0xJTkVBUiwgTlJfVUlDX0lOVFMsCisJCQkJICAgICAgJnVpY19ob3N0X29wcywgLTEpOworCWlmICghIHVpYy0+aXJxaG9zdCkgeworCQlvZl9ub2RlX3B1dChub2RlKTsKKwkJcmV0dXJuIE5VTEw7IC8qIEZJWE1FOiBwYW5pYz8gKi8KKwl9CisKKwl1aWMtPmlycWhvc3QtPmhvc3RfZGF0YSA9IHVpYzsKKworCS8qIFN0YXJ0IHdpdGggYWxsIGludGVycnVwdHMgZGlzYWJsZWQsIGxldmVsIGFuZCBub24tY3JpdGljYWwgKi8KKwltdGRjcih1aWMtPmRjcmJhc2UgKyBVSUNfRVIsIDApOworCW10ZGNyKHVpYy0+ZGNyYmFzZSArIFVJQ19DUiwgMCk7CisJbXRkY3IodWljLT5kY3JiYXNlICsgVUlDX1RSLCAwKTsKKwkvKiBDbGVhciBhbnkgcGVuZGluZyBpbnRlcnJ1cHRzLCBpbiBjYXNlIHRoZSBmaXJtd2FyZSBsZWZ0IHNvbWUgKi8KKwltdGRjcih1aWMtPmRjcmJhc2UgKyBVSUNfU1IsIDB4ZmZmZmZmZmYpOworCisJcHJpbnRrICgiVUlDJWQgKCVkIElSUSBzb3VyY2VzKSBhdCBEQ1IgMHgleFxuIiwgdWljLT5pbmRleCwKKwkJTlJfVUlDX0lOVFMsIHVpYy0+ZGNyYmFzZSk7CisKKwlyZXR1cm4gdWljOworfQorCit2b2lkIF9faW5pdCB1aWNfaW5pdF90cmVlKHZvaWQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucDsKKwlzdHJ1Y3QgdWljICp1aWM7CisJY29uc3QgdTMyICppbnRlcnJ1cHRzOworCisJLyogRmlyc3QgbG9jYXRlIGFuZCBpbml0aWFsaXplIHRoZSB0b3AtbGV2ZWwgVUlDICovCisKKwlucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsIE5VTEwsICJpYm0sdWljIik7CisJd2hpbGUgKG5wKSB7CisJCWludGVycnVwdHMgPSBvZl9nZXRfcHJvcGVydHkobnAsICJpbnRlcnJ1cHRzIiwgTlVMTCk7CisJCWlmICghIGludGVycnVwdHMpCisJCQlicmVhazsKKworCQlucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKG5wLCBOVUxMLCAiaWJtLHVpYyIpOworCX0KKworCUJVR19PTighbnApOyAvKiB1aWNfaW5pdF90cmVlKCkgYXNzdW1lcyB0aGVyZSdzIGEgVUlDIGFzIHRoZQorCQkgICAgICAqIHRvcC1sZXZlbCBpbnRlcnJ1cHQgY29udHJvbGxlciAqLworCXByaW1hcnlfdWljID0gdWljX2luaXRfb25lKG5wKTsKKwlpZiAoISBwcmltYXJ5X3VpYykKKwkJcGFuaWMoIlVuYWJsZSB0byBpbml0aWFsaXplIHByaW1hcnkgVUlDICVzXG4iLCBucC0+ZnVsbF9uYW1lKTsKKworCWlycV9zZXRfZGVmYXVsdF9ob3N0KHByaW1hcnlfdWljLT5pcnFob3N0KTsKKwlvZl9ub2RlX3B1dChucCk7CisKKwkvKiBUaGUgc2NhbiBhZ2FpbiBmb3IgY2FzY2FkZWQgVUlDcyAqLworCW5wID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgTlVMTCwgImlibSx1aWMiKTsKKwl3aGlsZSAobnApIHsKKwkJaW50ZXJydXB0cyA9IG9mX2dldF9wcm9wZXJ0eShucCwgImludGVycnVwdHMiLCBOVUxMKTsKKwkJaWYgKGludGVycnVwdHMpIHsKKwkJCS8qIFNlY29uZGFyeSBVSUMgKi8KKwkJCWludCBjYXNjYWRlX3ZpcnE7CisJCQlpbnQgcmV0OworCisJCQl1aWMgPSB1aWNfaW5pdF9vbmUobnApOworCQkJaWYgKCEgdWljKQorCQkJCXBhbmljKCJVbmFibGUgdG8gaW5pdGlhbGl6ZSBhIHNlY29uZGFyeSBVSUMgJXNcbiIsCisJCQkJICAgICAgbnAtPmZ1bGxfbmFtZSk7CisKKwkJCWNhc2NhZGVfdmlycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG5wLCAwKTsKKworCQkJdWljLT5jYXNjYWRlLmhhbmRsZXIgPSB1aWNfY2FzY2FkZTsKKwkJCXVpYy0+Y2FzY2FkZS5uYW1lID0gIlVJQyBjYXNjYWRlIjsKKwkJCXVpYy0+Y2FzY2FkZS5kZXZfaWQgPSB1aWM7CisKKwkJCXJldCA9IHNldHVwX2lycShjYXNjYWRlX3ZpcnEsICZ1aWMtPmNhc2NhZGUpOworCQkJaWYgKHJldCkKKwkJCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byBzZXR1cF9pcnEoJWQpIGZvciAiCisJCQkJICAgICAgICJVSUMlZCBjYXNjYWRlXG4iLCBjYXNjYWRlX3ZpcnEsCisJCQkJICAgICAgIHVpYy0+aW5kZXgpOworCisJCQkvKiBGSVhNRTogc2V0dXAgY3JpdGljYWwgY2FzY2FkZT8/ICovCisJCX0KKworCQlucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKG5wLCBOVUxMLCAiaWJtLHVpYyIpOworCX0KK30KKworLyogUmV0dXJuIGFuIGludGVycnVwdCB2ZWN0b3Igb3IgTk9fSVJRIGlmIG5vIGludGVycnVwdCBpcyBwZW5kaW5nLiAqLwordW5zaWduZWQgaW50IHVpY19nZXRfaXJxKHZvaWQpCit7CisJdTMyIG1zcjsKKwlpbnQgc3JjOworCisJQlVHX09OKCEgcHJpbWFyeV91aWMpOworCisJbXNyID0gbWZkY3IocHJpbWFyeV91aWMtPmRjcmJhc2UgKyBVSUNfTVNSKTsKKwlzcmMgPSAzMiAtIGZmcyhtc3IpOworCisJcmV0dXJuIGlycV9saW5lYXJfcmV2bWFwKHByaW1hcnlfdWljLT5pcnFob3N0LCBzcmMpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3htb24veG1vbi5jIGIvYXJjaC9wb3dlcnBjL3htb24veG1vbi5jCmluZGV4IGJmMjk5YjYuLmI0ODFkYjEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy94bW9uL3htb24uYworKysgYi9hcmNoL3Bvd2VycGMveG1vbi94bW9uLmMKQEAgLTMzMCwxOCArMzMwLDE3IEBACiBzdGF0aWMgaW50IHhtb25fY29yZShzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IGZyb21pcGkpCiB7CiAJaW50IGNtZCA9IDA7Ci0JdW5zaWduZWQgbG9uZyBtc3I7CiAJc3RydWN0IGJwdCAqYnA7CiAJbG9uZyByZWN1cnNlX2ptcFtKTVBfQlVGX0xFTl07CiAJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKICNpZmRlZiBDT05GSUdfU01QCiAJaW50IGNwdTsKIAlpbnQgc2Vjb25kYXJ5OwogCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKICNlbmRpZgogCi0JbXNyID0gbWZtc3IoKTsKLQltdG1zcihtc3IgJiB+TVNSX0VFKTsJLyogZGlzYWJsZSBpbnRlcnJ1cHRzICovCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCiAJYnAgPSBpbl9icmVha3BvaW50X3RhYmxlKHJlZ3MtPm5pcCwgJm9mZnNldCk7CiAJaWYgKGJwICE9IE5VTEwpIHsKQEAgLTUxNiw3ICs1MTUsNyBAQAogCiAJaW5zZXJ0X2NwdV9icHRzKCk7CiAKLQltdG1zcihtc3IpOwkJLyogcmVzdG9yZSBpbnRlcnJ1cHQgZW5hYmxlICovCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCiAJcmV0dXJuIGNtZCAhPSAnWCcgJiYgY21kICE9IEVPRjsKIH0KQEAgLTEzNjAsOCArMTM1OSwxMiBAQAogCWlmIChpc193YXJuaW5nX2J1ZyhidWcpKQogCQlyZXR1cm47CiAKKyNpZmRlZiBDT05GSUdfREVCVUdfQlVHVkVSQk9TRQogCXByaW50Zigia2VybmVsIEJVRyBhdCAlczoldSFcbiIsCiAJICAgICAgIGJ1Zy0+ZmlsZSwgYnVnLT5saW5lKTsKKyNlbHNlCisJcHJpbnRmKCJrZXJuZWwgQlVHIGF0ICVwIVxuIiwgKHZvaWQgKilidWctPmJ1Z19hZGRyKTsKKyNlbmRpZgogfQogCiB2b2lkIGV4Y3ByaW50KHN0cnVjdCBwdF9yZWdzICpmcCkKZGlmZiAtLWdpdCBhL2FyY2gvcHBjLzgyNjBfaW8vZW5ldC5jIGIvYXJjaC9wcGMvODI2MF9pby9lbmV0LmMKaW5kZXggYTYwNTZjMi4uNDhjZTg0ZiAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvODI2MF9pby9lbmV0LmMKKysrIGIvYXJjaC9wcGMvODI2MF9pby9lbmV0LmMKQEAgLTQ3Nyw3ICs0NzcsNiBAQAogCQkJY2VwLT5zdGF0cy5yeF9kcm9wcGVkKys7CiAJCX0KIAkJZWxzZSB7Ci0JCQlza2ItPmRldiA9IGRldjsKIAkJCXNrYl9wdXQoc2tiLHBrdF9sZW4tNCk7CS8qIE1ha2Ugcm9vbSAqLwogCQkJZXRoX2NvcHlfYW5kX3N1bShza2IsCiAJCQkJKHVuc2lnbmVkIGNoYXIgKilfX3ZhKGJkcC0+Y2JkX2J1ZmFkZHIpLApkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvODI2MF9pby9mY2NfZW5ldC5jIGIvYXJjaC9wcGMvODI2MF9pby9mY2NfZW5ldC5jCmluZGV4IDA2Yjg0YzMuLjlkYjgyNWYgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjLzgyNjBfaW8vZmNjX2VuZXQuYworKysgYi9hcmNoL3BwYy84MjYwX2lvL2ZjY19lbmV0LmMKQEAgLTczNCw3ICs3MzQsNiBAQAogCQkJY2VwLT5zdGF0cy5yeF9kcm9wcGVkKys7CiAJCX0KIAkJZWxzZSB7Ci0JCQlza2ItPmRldiA9IGRldjsKIAkJCXNrYl9wdXQoc2tiLHBrdF9sZW4pOwkvKiBNYWtlIHJvb20gKi8KIAkJCWV0aF9jb3B5X2FuZF9zdW0oc2tiLAogCQkJCSh1bnNpZ25lZCBjaGFyICopX192YShiZHAtPmNiZF9idWZhZGRyKSwKZGlmZiAtLWdpdCBhL2FyY2gvcHBjLzh4eF9pby9LY29uZmlnIGIvYXJjaC9wcGMvOHh4X2lvL0tjb25maWcKaW5kZXggNTdkYWNmOS4uYzYyM2U0NCAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvOHh4X2lvL0tjb25maWcKKysrIGIvYXJjaC9wcGMvOHh4X2lvL0tjb25maWcKQEAgLTc0LDEwICs3NCw2IEBACiAJICBBbGxvY2F0ZSBsYXJnZSBidWZmZXJzIGZvciBNUEM4eHggRXRoZXJuZXQuIEluY3JlYXNlcyB0aHJvdWdocHV0CiAJICBhbmQgZGVjcmVhc2VzIHRoZSBsaWtlbGlob29kIG9mIGRyb3BwZWQgcGFja2V0cywgYnV0IGNvc3RzIG1lbW9yeS4KIAotY29uZmlnIEhURE1TT1VORAotCWJvb2wgIkVtYmVkZGVkIFBsYW5ldCBISU9YIEF1ZGlvIgotCWRlcGVuZHMgb24gU09VTkQ9eQotCiAjIFRoaXMgZG9lc24ndCByZWFsbHkgYmVsb25nIGhlcmUsIGJ1dCBpdCBpcyBjb252ZW5pZW50IHRvIGFzawogIyA4eHggc3BlY2lmaWMgcXVlc3Rpb25zLgogY29tbWVudCAiR2VuZXJpYyBNUEM4eHggT3B0aW9ucyIKZGlmZiAtLWdpdCBhL2FyY2gvcHBjLzh4eF9pby9NYWtlZmlsZSBiL2FyY2gvcHBjLzh4eF9pby9NYWtlZmlsZQppbmRleCBkODc2MDE4Li4xMDUxYTA2IDEwMDY0NAotLS0gYS9hcmNoL3BwYy84eHhfaW8vTWFrZWZpbGUKKysrIGIvYXJjaC9wcGMvOHh4X2lvL01ha2VmaWxlCkBAIC03LDQgKzcsMyBAQAogb2JqLSQoQ09ORklHX0ZFQ19FTkVUKQkrPSBmZWMubwogb2JqLSQoQ09ORklHX1NDQ19FTkVUKQkrPSBlbmV0Lm8KIG9iai0kKENPTkZJR19VQ09ERV9QQVRDSCkgKz0gbWljcm9wYXRjaC5vCi1vYmotJChDT05GSUdfSFRETVNPVU5EKSArPSBjczQyMThfdGRtLm8KZGlmZiAtLWdpdCBhL2FyY2gvcHBjLzh4eF9pby9jczQyMTguaCBiL2FyY2gvcHBjLzh4eF9pby9jczQyMTguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVmOTQzMC4uMDAwMDAwMAotLS0gYS9hcmNoL3BwYy84eHhfaW8vY3M0MjE4LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotI2lmbmRlZiBfY3M0MjE4X2hfCi0vKgotICogIEhhY2tlZCB2ZXJzaW9uIG9mIGxpbnV4L2RyaXZlcnMvc291bmQvZG1hc291bmQvZG1hc291bmQuaAotICoKLSAqCi0gKiAgTWlub3IgbnVtYmVycyBmb3IgdGhlIHNvdW5kIGRyaXZlci4KLSAqCi0gKiAgVW5mb3J0dW5hdGVseSBDcmVhdGl2ZSBjYWxsZWQgdGhlIGNvZGVjIGNoaXAgb2YgU0IgYXMgYSBEU1AuIEZvciB0aGlzCi0gKiAgcmVhc29uIHRoZSAvZGV2L2RzcCBpcyByZXNlcnZlZCBmb3IgZGlnaXRpemVkIGF1ZGlvIHVzZS4gVGhlcmUgaXMgYQotICogIGRldmljZSBmb3IgdHJ1ZSBEU1AgcHJvY2Vzc29ycyBidXQgaXQgd2lsbCBiZSBjYWxsZWQgc29tZXRoaW5nIGVsc2UuCi0gKiAgSW4gdjMuMCBpdCdzIC9kZXYvc25kcHJvYyBidXQgdGhpcyBjb3VsZCBiZSBhIHRlbXBvcmFyeSBzb2x1dGlvbi4KLSAqLwotI2RlZmluZSBfY3M0MjE4X2hfCi0KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotCi0jZGVmaW5lIFNORF9OREVWUwkyNTYJLyogTnVtYmVyIG9mIHN1cHBvcnRlZCBkZXZpY2VzICovCi0jZGVmaW5lIFNORF9ERVZfQ1RMCTAJLyogQ29udHJvbCBwb3J0IC9kZXYvbWl4ZXIgKi8KLSNkZWZpbmUgU05EX0RFVl9TRVEJMQkvKiBTZXF1ZW5jZXIgb3V0cHV0IC9kZXYvc2VxdWVuY2VyIChGTQotCQkJCSAgIHN5bnRoZXNpemVyIGFuZCBNSURJIG91dHB1dCkgKi8KLSNkZWZpbmUgU05EX0RFVl9NSURJTgkyCS8qIFJhdyBtaWRpIGFjY2VzcyAqLwotI2RlZmluZSBTTkRfREVWX0RTUAkzCS8qIERpZ2l0aXplZCB2b2ljZSAvZGV2L2RzcCAqLwotI2RlZmluZSBTTkRfREVWX0FVRElPCTQJLyogU3BhcmMgY29tcGF0aWJsZSAvZGV2L2F1ZGlvICovCi0jZGVmaW5lIFNORF9ERVZfRFNQMTYJNQkvKiBMaWtlIC9kZXYvZHNwIGJ1dCAxNiBiaXRzL3NhbXBsZSAqLwotI2RlZmluZSBTTkRfREVWX1NUQVRVUwk2CS8qIC9kZXYvc25kc3RhdCAqLwotLyogIzcgbm90IGluIHVzZSBub3cuIFdhcyBpbiAyLjQuIEZyZWUgZm9yIHVzZSBhZnRlciB2My4wLiAqLwotI2RlZmluZSBTTkRfREVWX1NFUTIJOAkvKiAvZGV2L3NlcXVlbmNlciwgbGV2ZWwgMiBpbnRlcmZhY2UgKi8KLSNkZWZpbmUgU05EX0RFVl9TTkRQUk9DIDkJLyogL2Rldi9zbmRwcm9jIGZvciBwcm9ncmFtbWFibGUgZGV2aWNlcyAqLwotI2RlZmluZSBTTkRfREVWX1BTUwlTTkRfREVWX1NORFBST0MKLQotLyogc3dpdGNoIG9uIHZhcmlvdXMgcHJpbmtzICovCi0jZGVmaW5lIERFQlVHX0RNQVNPVU5EIDEKLQotI2RlZmluZSBNQVhfQVVESU9fREVWCTUKLSNkZWZpbmUgTUFYX01JWEVSX0RFVgk0Ci0jZGVmaW5lIE1BWF9TWU5USF9ERVYJMwotI2RlZmluZSBNQVhfTUlESV9ERVYJNgotI2RlZmluZSBNQVhfVElNRVJfREVWCTMKLQotI2RlZmluZSBNQVhfQ0FUQ0hfUkFESVVTCTEwCi0KLSNkZWZpbmUgbGUyYmUxNih4KQkoKCh4KTw8OCAmIDB4ZmYwMCkgfCAoKHgpPj44ICYgMHgwMGZmKSkKLSNkZWZpbmUgbGUyYmUxNmRibCh4KQkoKCh4KTw8OCAmIDB4ZmYwMGZmMDApIHwgKCh4KT4+OCAmIDB4MDBmZjAwZmYpKQotCi0jZGVmaW5lIElPQ1RMX0lOKGFyZywgcmV0KSBcCi0JZG8geyBpbnQgZXJyb3IgPSBnZXRfdXNlcihyZXQsIChpbnQgKikoYXJnKSk7IFwKLQkJaWYgKGVycm9yKSByZXR1cm4gZXJyb3I7IFwKLQl9IHdoaWxlICgwKQotI2RlZmluZSBJT0NUTF9PVVQoYXJnLCByZXQpCWlvY3RsX3JldHVybigoaW50ICopKGFyZyksIHJldCkKLQotc3RhdGljIGlubGluZSBpbnQgaW9jdGxfcmV0dXJuKGludCAqYWRkciwgaW50IHZhbHVlKQotewotCXJldHVybiB2YWx1ZSA8IDAgPyB2YWx1ZSA6IHB1dF91c2VyKHZhbHVlLCBhZGRyKTsKLX0KLQotI2RlZmluZSBIQVNfUkVDT1JECi0KLSAgICAvKgotICAgICAqICBJbml0aWFsaXphdGlvbgotICAgICAqLwotCi0vKiBkZXNjcmlwdGlvbiBvZiB0aGUgc2V0LXVwIGFwcGxpZXMgdG8gZWl0aGVyIGhhcmQgb3Igc29mdCBzZXR0aW5ncyAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgaW50IGZvcm1hdDsJCS8qIEFGTVRfKiAqLwotICAgIGludCBzdGVyZW87CQkvKiAwID0gbW9ubywgMSA9IHN0ZXJlbyAqLwotICAgIGludCBzaXplOwkJLyogOC8xNiBiaXQqLwotICAgIGludCBzcGVlZDsJCS8qIHNwZWVkICovCi19IFNFVFRJTkdTOwotCi0gICAgLyoKLSAgICAgKiAgTWFjaGluZSBkZWZpbml0aW9ucwotICAgICAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICBjb25zdCBjaGFyICpuYW1lMjsKLSAgICB2b2lkICgqb3Blbikodm9pZCk7Ci0gICAgdm9pZCAoKnJlbGVhc2UpKHZvaWQpOwotICAgIHZvaWQgKigqZG1hX2FsbG9jKSh1bnNpZ25lZCBpbnQsIGdmcF90KTsKLSAgICB2b2lkICgqZG1hX2ZyZWUpKHZvaWQgKiwgdW5zaWduZWQgaW50KTsKLSAgICBpbnQgKCppcnFpbml0KSh2b2lkKTsKLSNpZmRlZiBNT0RVTEUKLSAgICB2b2lkICgqaXJxY2xlYW51cCkodm9pZCk7Ci0jZW5kaWYKLSAgICB2b2lkICgqaW5pdCkodm9pZCk7Ci0gICAgdm9pZCAoKnNpbGVuY2UpKHZvaWQpOwotICAgIGludCAoKnNldEZvcm1hdCkoaW50KTsKLSAgICBpbnQgKCpzZXRWb2x1bWUpKGludCk7Ci0gICAgaW50ICgqc2V0QmFzcykoaW50KTsKLSAgICBpbnQgKCpzZXRUcmVibGUpKGludCk7Ci0gICAgaW50ICgqc2V0R2FpbikoaW50KTsKLSAgICB2b2lkICgqcGxheSkodm9pZCk7Ci0gICAgdm9pZCAoKnJlY29yZCkodm9pZCk7CQkvKiBvcHRpb25hbCAqLwotICAgIHZvaWQgKCptaXhlcl9pbml0KSh2b2lkKTsJCS8qIG9wdGlvbmFsICovCi0gICAgaW50ICgqbWl4ZXJfaW9jdGwpKHVfaW50LCB1X2xvbmcpOwkvKiBvcHRpb25hbCAqLwotICAgIGludCAoKndyaXRlX3NxX3NldHVwKSh2b2lkKTsJLyogb3B0aW9uYWwgKi8KLSAgICBpbnQgKCpyZWFkX3NxX3NldHVwKSh2b2lkKTsJCS8qIG9wdGlvbmFsICovCi0gICAgaW50ICgqc3Ffb3BlbikobW9kZV90KTsJCS8qIG9wdGlvbmFsICovCi0gICAgaW50ICgqc3RhdGVfaW5mbykoY2hhciAqLCBzaXplX3QpOwkvKiBvcHRpb25hbCAqLwotICAgIHZvaWQgKCphYm9ydF9yZWFkKSh2b2lkKTsJCS8qIG9wdGlvbmFsICovCi0gICAgaW50IG1pbl9kc3Bfc3BlZWQ7Ci0gICAgaW50IG1heF9kc3Bfc3BlZWQ7Ci0gICAgaW50IHZlcnNpb24gOwotICAgIGludCBoYXJkd2FyZV9hZm10cyA7CQkvKiBPU1Mgc2F5cyB3ZSBvbmx5IHJldHVybiBoJ3dhcmUgaW5mbyAqLwotCQkJCQkvKiB3aGVuIHF1ZXJpZWQgdmlhIFNORENUTF9EU1BfR0VURk1UUyAqLwotICAgIGludCBjYXBhYmlsaXRpZXMgOwkJLyogbG93LWxldmVsIHJlcGx5IHRvIFNORENUTF9EU1BfR0VUQ0FQUyAqLwotICAgIFNFVFRJTkdTIGRlZmF1bHRfaGFyZCA7CS8qIG9wZW4oKSBvciBpbml0KCkgc2hvdWxkIHNldCBzb21ldGhpbmcgdmFsaWQgKi8KLSAgICBTRVRUSU5HUyBkZWZhdWx0X3NvZnQgOwkvKiB5b3UgY2FuIG1ha2UgaXQgbG9vayBsaWtlIG9sZCBPU1MsIGlmIHlvdSB3YW50IHRvICovCi19IE1BQ0hJTkU7Ci0KLSAgICAvKgotICAgICAqICBMb3cgbGV2ZWwgc3R1ZmYKLSAgICAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHNzaXplX3QgKCpjdF91bGF3KShjb25zdCB1X2NoYXIgKiwgc2l6ZV90LCB1X2NoYXIgKiwgc3NpemVfdCAqLCBzc2l6ZV90KTsKLSAgICBzc2l6ZV90ICgqY3RfYWxhdykoY29uc3QgdV9jaGFyICosIHNpemVfdCwgdV9jaGFyICosIHNzaXplX3QgKiwgc3NpemVfdCk7Ci0gICAgc3NpemVfdCAoKmN0X3M4KShjb25zdCB1X2NoYXIgKiwgc2l6ZV90LCB1X2NoYXIgKiwgc3NpemVfdCAqLCBzc2l6ZV90KTsKLSAgICBzc2l6ZV90ICgqY3RfdTgpKGNvbnN0IHVfY2hhciAqLCBzaXplX3QsIHVfY2hhciAqLCBzc2l6ZV90ICosIHNzaXplX3QpOwotICAgIHNzaXplX3QgKCpjdF9zMTZiZSkoY29uc3QgdV9jaGFyICosIHNpemVfdCwgdV9jaGFyICosIHNzaXplX3QgKiwgc3NpemVfdCk7Ci0gICAgc3NpemVfdCAoKmN0X3UxNmJlKShjb25zdCB1X2NoYXIgKiwgc2l6ZV90LCB1X2NoYXIgKiwgc3NpemVfdCAqLCBzc2l6ZV90KTsKLSAgICBzc2l6ZV90ICgqY3RfczE2bGUpKGNvbnN0IHVfY2hhciAqLCBzaXplX3QsIHVfY2hhciAqLCBzc2l6ZV90ICosIHNzaXplX3QpOwotICAgIHNzaXplX3QgKCpjdF91MTZsZSkoY29uc3QgdV9jaGFyICosIHNpemVfdCwgdV9jaGFyICosIHNzaXplX3QgKiwgc3NpemVfdCk7Ci19IFRSQU5TOwotCi0KLSAgICAvKgotICAgICAqIFNvdW5kIHF1ZXVlIHN0dWZmLCB0aGUgaGVhcnQgb2YgdGhlIGRyaXZlcgotICAgICAqLwotCi1zdHJ1Y3Qgc291bmRfcXVldWUgewotICAgIC8qIGJ1ZmZlcnMgYWxsb2NhdGVkIGZvciB0aGlzIHF1ZXVlICovCi0gICAgaW50IG51bUJ1ZnM7CQkvKiByZWFsIGxpbWl0cyBvbiB3aGF0IHRoZSB1c2VyIGNhbiBoYXZlICovCi0gICAgaW50IGJ1ZlNpemU7CQkvKiBpbiBieXRlcyAqLwotICAgIGNoYXIgKipidWZmZXJzOwotCi0gICAgLyogY3VycmVudCBwYXJhbWV0ZXJzICovCi0gICAgaW50IGxvY2tlZCA7CQkvKiBwYXJhbXMgY2Fubm90IGJlIG1vZGlmaWVkIHdoZW4gIT0gMCAqLwotICAgIGludCB1c2VyX2ZyYWdzIDsJCS8qIHVzZXIgcmVxdWVzdHMgdGhpcyBtYW55ICovCi0gICAgaW50IHVzZXJfZnJhZ19zaXplIDsJLyogb2YgdGhpcyBzaXplICovCi0gICAgaW50IG1heF9jb3VudDsJCS8qIGFjdHVhbCAjIGZyYWdtZW50cyA8PSBudW1CdWZzICovCi0gICAgaW50IGJsb2NrX3NpemU7CQkvKiBpbnRlcm5hbCBibG9jayBzaXplIGluIGJ5dGVzICovCi0gICAgaW50IG1heF9hY3RpdmU7CQkvKiBpbi11c2UgZnJhZ21lbnRzIDw9IG1heF9jb3VudCAqLwotCi0gICAgLyogaXQgc2hvdWxkbid0IGJlIG5lY2Vzc2FyeSB0byBkZWNsYXJlIGFueSBvZiB0aGVzZSB2b2xhdGlsZSAqLwotICAgIGludCBmcm9udCwgcmVhciwgY291bnQ7Ci0gICAgaW50IHJlYXJfc2l6ZTsKLSAgICAvKgotICAgICAqCVRoZSB1c2Ugb2YgdGhlIHBsYXlpbmcgZmllbGQgZGVwZW5kcyBvbiB0aGUgaGFyZHdhcmUKLSAgICAgKgotICAgICAqCUF0YXJpLCBQTWFjOiBUaGUgbnVtYmVyIG9mIGZyYW1lcyB0aGF0IGFyZSBsb2FkZWQvcGxheWluZwotICAgICAqCi0gICAgICoJQW1pZ2E6IEJpdCAwIGlzIHNldDogYSBmcmFtZSBpcyBsb2FkZWQKLSAgICAgKgkgICAgICAgQml0IDEgaXMgc2V0OiBhIGZyYW1lIGlzIHBsYXlpbmcKLSAgICAgKi8KLSAgICBpbnQgYWN0aXZlOwotICAgIHdhaXRfcXVldWVfaGVhZF90IGFjdGlvbl9xdWV1ZSwgb3Blbl9xdWV1ZSwgc3luY19xdWV1ZTsKLSAgICBpbnQgb3Blbl9tb2RlOwotICAgIGludCBidXN5LCBzeW5jaW5nLCB4cnVucywgZGllZDsKLX07Ci0KLSNkZWZpbmUgU0xFRVAocXVldWUpCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uX3RpbWVvdXQoJnF1ZXVlLCBIWikKLSNkZWZpbmUgV0FLRV9VUChxdWV1ZSkJCSh3YWtlX3VwX2ludGVycnVwdGlibGUoJnF1ZXVlKSkKLQotI2VuZGlmIC8qIF9jczQyMThfaF8gKi8KZGlmZiAtLWdpdCBhL2FyY2gvcHBjLzh4eF9pby9jczQyMThfdGRtLmMgYi9hcmNoL3BwYy84eHhfaW8vY3M0MjE4X3RkbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTU2ZjI4Li4wMDAwMDAwCi0tLSBhL2FyY2gvcHBjLzh4eF9pby9jczQyMThfdGRtLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyODMzICswLDAgQEAKLQotLyogVGhpcyBpcyBhIG1vZGlmaWVkIHZlcnNpb24gb2YgbGludXgvZHJpdmVycy9zb3VuZC9kbWFzb3VuZC5jIHRvCi0gKiBzdXBwb3J0IHRoZSBDUzQyMTggY29kZWMgb24gdGhlIDh4eCBURE0gcG9ydC4gIFRoYW5rcyB0byBldmVyeW9uZQotICogdGhhdCBjb250cmlidXRlZCB0byB0aGUgZG1hc291bmQgc29mdHdhcmUgKHdoaWNoIGluY2x1ZGVzIG1lIDotKS4KLSAqCi0gKiBUaGUgQ1M0MjE4IGlzIGNvbmZpZ3VyZWQgaW4gTW9kZSA0LCBzdWItbW9kZSAwLiAgVGhpcyBwcm92aWRlcwotICogbGVmdC9yaWdodCBkYXRhIG9ubHkgb24gdGhlIFRETSBwb3J0LCBhcyBhIDMyLWJpdCB3b3JkLCBwZXIgZnJhbWUKLSAqIHB1bHNlLiAgVGhlIGNvbnRyb2wgb2YgdGhlIENTNDIxOCBpcyBwcm92aWRlZCBieSBzb21lIG90aGVyIG1lYW5zLAotICogbGlrZSB0aGUgU1BJIHBvcnQuCi0gKiBEYW4gTWFsZWsgKGRtYWxla0BqbGMubmV0KQotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+Ci0jaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KLSNpbmNsdWRlIDxsaW51eC9mY250bC5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvc291bmQuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLQotI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+Ci0jaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotCi0vKiBTaG91bGQgcHJvYmFibHkgZG8gc29tZXRoaW5nIGRpZmZlcmVudCB3aXRoIHRoaXMgcGF0aCBuYW1lLi4uLi4KLSAqIEFjdHVhbGx5LCBJIHNob3VsZCBqdXN0IHN0b3AgdXNpbmcgaXQuLi4KLSAqLwotI2luY2x1ZGUgImNzNDIxOC5oIgotI2luY2x1ZGUgPGxpbnV4L3NvdW5kY2FyZC5oPgotCi0jaW5jbHVkZSA8YXNtL21wYzh4eC5oPgotI2luY2x1ZGUgPGFzbS84eHhfaW1tYXAuaD4KLSNpbmNsdWRlIDxhc20vY29tbXByb2MuaD4KLQotI2RlZmluZSBETUFTTkRfQ1M0MjE4CQk1Ci0KLSNkZWZpbmUgTUFYX0NBVENIX1JBRElVUwkxMAotI2RlZmluZSBNSU5fQlVGRkVSUwkJNAotI2RlZmluZSBNSU5fQlVGU0laRSAJCTQKLSNkZWZpbmUgTUFYX0JVRlNJWkUJCTEyOAotCi0jZGVmaW5lIEhBU184QklUX1RBQkxFUwotCi1zdGF0aWMgaW50IHNxX3VuaXQgPSAtMTsKLXN0YXRpYyBpbnQgbWl4ZXJfdW5pdCA9IC0xOwotc3RhdGljIGludCBzdGF0ZV91bml0ID0gLTE7Ci1zdGF0aWMgaW50IGlycV9pbnN0YWxsZWQgPSAwOwotc3RhdGljIGNoYXIgKipzb3VuZF9idWZmZXJzID0gTlVMTDsKLXN0YXRpYyBjaGFyICoqc291bmRfcmVhZF9idWZmZXJzID0gTlVMTDsKLQotc3RhdGljIERFRklORV9TUElOTE9DSyhjczQyMThfbG9jayk7Ci0KLS8qIExvY2FsIGNvcGllcyBvZiB0aGluZ3Mgd2UgcHV0IGluIHRoZSBjb250cm9sIHJlZ2lzdGVyLiAgT3V0cHV0Ci0gKiB2b2x1bWUsIGxpa2UgbW9zdCBjb2RlY3MgaXMgcmVhbGx5IGF0dGVudWF0aW9uLgotICovCi1zdGF0aWMgaW50IGNzNDIxOF9yYXRlX2luZGV4OwotCi0vKgotICogU3R1ZmYgZm9yIG91dHB1dHRpbmcgYSBiZWVwLiAgVGhlIHZhbHVlcyByYW5nZSBmcm9tIC0zMjcgdG8gKzMyNwotICogc28gd2UgY2FuIG11bHRpcGx5IGJ5IGFuIGFtcGxpdHVkZSBpbiB0aGUgcmFuZ2UgMC4uMTAwIHRvIGdldCBhCi0gKiBzaWduZWQgc2hvcnQgdmFsdWUgdG8gcHV0IGluIHRoZSBvdXRwdXQgYnVmZmVyLgotICovCi1zdGF0aWMgc2hvcnQgYmVlcF93Zm9ybVsyNTZdID0gewotCTAsCTQwLAk3OSwJMTE3LAkxNTMsCTE4NywJMjE4LAkyNDUsCi0JMjY5LAkyODgsCTMwNCwJMzE2LAkzMjMsCTMyNywJMzI3LAkzMjQsCi0JMzE4LAkzMTAsCTI5OSwJMjg4LAkyNzUsCTI2MiwJMjQ5LAkyMzYsCi0JMjI0LAkyMTMsCTIwNCwJMTk2LAkxOTAsCTE4NiwJMTgzLAkxODIsCi0JMTgyLAkxODMsCTE4NiwJMTg5LAkxOTIsCTE5NiwJMjAwLAkyMDMsCi0JMjA2LAkyMDgsCTIwOSwJMjA5LAkyMDksCTIwNywJMjA0LAkyMDEsCi0JMTk3LAkxOTMsCTE4OCwJMTgzLAkxNzksCTE3NCwJMTcwLAkxNjYsCi0JMTYzLAkxNjEsCTE2MCwJMTU5LAkxNTksCTE2MCwJMTYxLAkxNjIsCi0JMTY0LAkxNjYsCTE2OCwJMTY5LAkxNzEsCTE3MSwJMTcxLAkxNzAsCi0JMTY5LAkxNjcsCTE2MywJMTU5LAkxNTUsCTE1MCwJMTQ0LAkxMzksCi0JMTMzLAkxMjgsCTEyMiwJMTE3LAkxMTMsCTExMCwJMTA3LAkxMDUsCi0JMTAzLAkxMDMsCTEwMywJMTAzLAkxMDQsCTEwNCwJMTA1LAkxMDUsCi0JMTA1LAkxMDMsCTEwMSwJOTcsCTkyLAk4NiwJNzgsCTY4LAotCTU4LAk0NSwJMzIsCTE4LAkzLAktMTEsCS0yNiwJLTQxLAotCS01NSwJLTY4LAktNzksCS04OCwJLTk1LAktMTAwLAktMTAyLAktMTAyLAotCS05OSwJLTkzLAktODUsCS03NSwJLTYyLAktNDgsCS0zMywJLTE2LAotCTAsCTE2LAkzMywJNDgsCTYyLAk3NSwJODUsCTkzLAotCTk5LAkxMDIsCTEwMiwJMTAwLAk5NSwJODgsCTc5LAk2OCwKLQk1NSwJNDEsCTI2LAkxMSwJLTMsCS0xOCwJLTMyLAktNDUsCi0JLTU4LAktNjgsCS03OCwJLTg2LAktOTIsCS05NywJLTEwMSwJLTEwMywKLQktMTA1LAktMTA1LAktMTA1LAktMTA0LAktMTA0LAktMTAzLAktMTAzLAktMTAzLAotCS0xMDMsCS0xMDUsCS0xMDcsCS0xMTAsCS0xMTMsCS0xMTcsCS0xMjIsCS0xMjgsCi0JLTEzMywJLTEzOSwJLTE0NCwJLTE1MCwJLTE1NSwJLTE1OSwJLTE2MywJLTE2NywKLQktMTY5LAktMTcwLAktMTcxLAktMTcxLAktMTcxLAktMTY5LAktMTY4LAktMTY2LAotCS0xNjQsCS0xNjIsCS0xNjEsCS0xNjAsCS0xNTksCS0xNTksCS0xNjAsCS0xNjEsCi0JLTE2MywJLTE2NiwJLTE3MCwJLTE3NCwJLTE3OSwJLTE4MywJLTE4OCwJLTE5MywKLQktMTk3LAktMjAxLAktMjA0LAktMjA3LAktMjA5LAktMjA5LAktMjA5LAktMjA4LAotCS0yMDYsCS0yMDMsCS0yMDAsCS0xOTYsCS0xOTIsCS0xODksCS0xODYsCS0xODMsCi0JLTE4MiwJLTE4MiwJLTE4MywJLTE4NiwJLTE5MCwJLTE5NiwJLTIwNCwJLTIxMywKLQktMjI0LAktMjM2LAktMjQ5LAktMjYyLAktMjc1LAktMjg4LAktMjk5LAktMzEwLAotCS0zMTgsCS0zMjQsCS0zMjcsCS0zMjcsCS0zMjMsCS0zMTYsCS0zMDQsCS0yODgsCi0JLTI2OSwJLTI0NSwJLTIxOCwJLTE4NywJLTE1MywJLTExNywJLTc5LAktNDAsCi19OwotCi0jZGVmaW5lIEJFRVBfU1BFRUQJNQkvKiAyMjA1MCBIeiBzYW1wbGUgcmF0ZSAqLwotI2RlZmluZSBCRUVQX0JVRkxFTgk1MTIKLSNkZWZpbmUgQkVFUF9WT0xVTUUJMTUJLyogMCAtIDEwMCAqLwotCi1zdGF0aWMgaW50IGJlZXBfdm9sdW1lID0gQkVFUF9WT0xVTUU7Ci1zdGF0aWMgaW50IGJlZXBfcGxheWluZyA9IDA7Ci1zdGF0aWMgaW50IGJlZXBfc3RhdGUgPSAwOwotc3RhdGljIHNob3J0ICpiZWVwX2J1ZjsKLXN0YXRpYyB2b2lkICgqb3JpZ19ta3NvdW5kKSh1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCk7Ci0KLS8qIFRoaXMgaXMgZm91bmQgc29tZXBsYWNlIGVsc2UuLi4uLi5JIGd1ZXNzIGluIHRoZSBrZXlib2FyZCBkcml2ZXIKLSAqIHdlIGRvbid0IGluY2x1ZGUuCi0gKi8KLXN0YXRpYyB2b2lkICgqa2RfbWtzb3VuZCkodW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpOwotCi1zdGF0aWMgaW50IGNhdGNoUmFkaXVzID0gMDsKLXN0YXRpYyBpbnQgbnVtQnVmcyA9IDQsIGJ1ZlNpemUgPSAzMjsKLXN0YXRpYyBpbnQgbnVtUmVhZEJ1ZnMgPSA0LCByZWFkYnVmU2l6ZSA9IDMyOwotCi0KLS8qIFRETS9TZXJpYWwgdHJhbnNtaXQgYW5kIHJlY2VpdmUgYnVmZmVyIGRlc2NyaXB0b3JzLgotKi8KLXN0YXRpYyB2b2xhdGlsZSBjYmRfdAkqcnhfYmFzZSwgKnJ4X2N1ciwgKnR4X2Jhc2UsICp0eF9jdXI7Ci0KLW1vZHVsZV9wYXJhbShjYXRjaFJhZGl1cywgaW50LCAwKTsKLW1vZHVsZV9wYXJhbShudW1CdWZzLCBpbnQsIDApOwotbW9kdWxlX3BhcmFtKGJ1ZlNpemUsIGludCwgMCk7Ci1tb2R1bGVfcGFyYW0obnVtcmVhZEJ1ZnMsIGludCwgMCk7Ci1tb2R1bGVfcGFyYW0ocmVhZGJ1ZlNpemUsIGludCwgMCk7Ci0KLSNkZWZpbmUgYXJyYXlzaXplKHgpCShzaXplb2YoeCkvc2l6ZW9mKCooeCkpKQotI2RlZmluZSBsZTJiZTE2KHgpCSgoKHgpPDw4ICYgMHhmZjAwKSB8ICgoeCk+PjggJiAweDAwZmYpKQotI2RlZmluZSBsZTJiZTE2ZGJsKHgpCSgoKHgpPDw4ICYgMHhmZjAwZmYwMCkgfCAoKHgpPj44ICYgMHgwMGZmMDBmZikpCi0KLSNkZWZpbmUgSU9DVExfSU4oYXJnLCByZXQpIFwKLQlkbyB7IGludCBlcnJvciA9IGdldF91c2VyKHJldCwgKGludCAqKShhcmcpKTsgXAotCQlpZiAoZXJyb3IpIHJldHVybiBlcnJvcjsgXAotCX0gd2hpbGUgKDApCi0jZGVmaW5lIElPQ1RMX09VVChhcmcsIHJldCkJaW9jdGxfcmV0dXJuKChpbnQgKikoYXJnKSwgcmV0KQotCi0vKiBDUzQyMTggc2VyaWFsIHBvcnQgY29udHJvbCBpbiBtb2RlIDQuCi0qLwotI2RlZmluZSBDU19JTlRNQVNLCSgodWludCkweDQwMDAwMDAwKQotI2RlZmluZSBDU19ETzEJCSgodWludCkweDIwMDAwMDAwKQotI2RlZmluZSBDU19MQVRURU4JKCh1aW50KTB4MWYwMDAwMDApCi0jZGVmaW5lIENTX1JBVFRFTgkoKHVpbnQpMHgwMGY4MDAwMCkKLSNkZWZpbmUgQ1NfTVVURQkJKCh1aW50KTB4MDAwNDAwMDApCi0jZGVmaW5lIENTX0lTTAkJKCh1aW50KTB4MDAwMjAwMDApCi0jZGVmaW5lIENTX0lTUgkJKCh1aW50KTB4MDAwMTAwMDApCi0jZGVmaW5lIENTX0xHQUlOCSgodWludCkweDAwMDBmMDAwKQotI2RlZmluZSBDU19SR0FJTgkoKHVpbnQpMHgwMDAwMGYwMCkKLQotI2RlZmluZSBDU19MQVRURU5fU0VUKFgpCSgoKFgpICYgMHgxZikgPDwgMjQpCi0jZGVmaW5lIENTX1JBVFRFTl9TRVQoWCkJKCgoWCkgJiAweDFmKSA8PCAxOSkKLSNkZWZpbmUgQ1NfTEdBSU5fU0VUKFgpCQkoKChYKSAmIDB4MGYpIDw8IDEyKQotI2RlZmluZSBDU19SR0FJTl9TRVQoWCkJCSgoKFgpICYgMHgwZikgPDwgOCkKLQotI2RlZmluZSBDU19MQVRURU5fR0VUKFgpCSgoKFgpID4+IDI0KSAmIDB4MWYpCi0jZGVmaW5lIENTX1JBVFRFTl9HRVQoWCkJKCgoWCkgPj4gMTkpICYgMHgxZikKLSNkZWZpbmUgQ1NfTEdBSU5fR0VUKFgpCQkoKChYKSA+PiAxMikgJiAweDBmKQotI2RlZmluZSBDU19SR0FJTl9HRVQoWCkJCSgoKFgpID4+IDgpICYgMHgwZikKLQotLyogVGhlIGNvbnRyb2wgcmVnaXN0ZXIgaXMgZWZmZWN0aXZlbHkgd3JpdGUgb25seS4gIFdlIGhhdmUgdG8ga2VlcCBhIGNvcHkKLSAqIG9mIHdoYXQgd2Ugd3JpdGUuCi0gKi8KLXN0YXRpYwl1aW50CWNzNDIxOF9jb250cm9sOwotCi0vKiBBIHBsYWNlIHRvIHN0b3JlIGV4cGFuZGluZyBpbmZvcm1hdGlvbi4KLSovCi1zdGF0aWMgaW50CWV4cGFuZF9iYWw7Ci1zdGF0aWMgaW50CWV4cGFuZF9kYXRhOwotCi0vKiBTaW5jZSBJIGNhbid0IG1ha2UgdGhlIG1pY3JvY29kZSBwYXRjaCB3b3JrIGZvciB0aGUgU1BJLCBJIGp1c3QKLSAqIGNsb2NrIHRoZSBiaXRzIHVzaW5nIHNvZnR3YXJlLgotICovCi1zdGF0aWMJdm9pZAlzd19zcGlfaW5pdCh2b2lkKTsKLXN0YXRpYwl2b2lkCXN3X3NwaV9pbyh1X2NoYXIgKm9idWYsIHVfY2hhciAqaWJ1ZiwgdWludCBiY250KTsKLXN0YXRpYwl1aW50CWNzNDIxOF9jdGxfd3JpdGUodWludCBjdGxyZWcpOwotCi0vKioqIFNvbWUgbG93IGxldmVsIGhlbHBlcnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIDE2IGJpdCBtdS1sYXcgKi8KLQotc3RhdGljIHNob3J0IHVsYXcyZG1hMTZbXSA9IHsKLQktMzIxMjQsCS0zMTEwMCwJLTMwMDc2LAktMjkwNTIsCS0yODAyOCwJLTI3MDA0LAktMjU5ODAsCS0yNDk1NiwKLQktMjM5MzIsCS0yMjkwOCwJLTIxODg0LAktMjA4NjAsCS0xOTgzNiwJLTE4ODEyLAktMTc3ODgsCS0xNjc2NCwKLQktMTU5OTYsCS0xNTQ4NCwJLTE0OTcyLAktMTQ0NjAsCS0xMzk0OCwJLTEzNDM2LAktMTI5MjQsCS0xMjQxMiwKLQktMTE5MDAsCS0xMTM4OCwJLTEwODc2LAktMTAzNjQsCS05ODUyLAktOTM0MCwJLTg4MjgsCS04MzE2LAotCS03OTMyLAktNzY3NiwJLTc0MjAsCS03MTY0LAktNjkwOCwJLTY2NTIsCS02Mzk2LAktNjE0MCwKLQktNTg4NCwJLTU2MjgsCS01MzcyLAktNTExNiwJLTQ4NjAsCS00NjA0LAktNDM0OCwJLTQwOTIsCi0JLTM5MDAsCS0zNzcyLAktMzY0NCwJLTM1MTYsCS0zMzg4LAktMzI2MCwJLTMxMzIsCS0zMDA0LAotCS0yODc2LAktMjc0OCwJLTI2MjAsCS0yNDkyLAktMjM2NCwJLTIyMzYsCS0yMTA4LAktMTk4MCwKLQktMTg4NCwJLTE4MjAsCS0xNzU2LAktMTY5MiwJLTE2MjgsCS0xNTY0LAktMTUwMCwJLTE0MzYsCi0JLTEzNzIsCS0xMzA4LAktMTI0NCwJLTExODAsCS0xMTE2LAktMTA1MiwJLTk4OCwJLTkyNCwKLQktODc2LAktODQ0LAktODEyLAktNzgwLAktNzQ4LAktNzE2LAktNjg0LAktNjUyLAotCS02MjAsCS01ODgsCS01NTYsCS01MjQsCS00OTIsCS00NjAsCS00MjgsCS0zOTYsCi0JLTM3MiwJLTM1NiwJLTM0MCwJLTMyNCwJLTMwOCwJLTI5MiwJLTI3NiwJLTI2MCwKLQktMjQ0LAktMjI4LAktMjEyLAktMTk2LAktMTgwLAktMTY0LAktMTQ4LAktMTMyLAotCS0xMjAsCS0xMTIsCS0xMDQsCS05NiwJLTg4LAktODAsCS03MiwJLTY0LAotCS01NiwJLTQ4LAktNDAsCS0zMiwJLTI0LAktMTYsCS04LAkwLAotCTMyMTI0LAkzMTEwMCwJMzAwNzYsCTI5MDUyLAkyODAyOCwJMjcwMDQsCTI1OTgwLAkyNDk1NiwKLQkyMzkzMiwJMjI5MDgsCTIxODg0LAkyMDg2MCwJMTk4MzYsCTE4ODEyLAkxNzc4OCwJMTY3NjQsCi0JMTU5OTYsCTE1NDg0LAkxNDk3MiwJMTQ0NjAsCTEzOTQ4LAkxMzQzNiwJMTI5MjQsCTEyNDEyLAotCTExOTAwLAkxMTM4OCwJMTA4NzYsCTEwMzY0LAk5ODUyLAk5MzQwLAk4ODI4LAk4MzE2LAotCTc5MzIsCTc2NzYsCTc0MjAsCTcxNjQsCTY5MDgsCTY2NTIsCTYzOTYsCTYxNDAsCi0JNTg4NCwJNTYyOCwJNTM3MiwJNTExNiwJNDg2MCwJNDYwNCwJNDM0OCwJNDA5MiwKLQkzOTAwLAkzNzcyLAkzNjQ0LAkzNTE2LAkzMzg4LAkzMjYwLAkzMTMyLAkzMDA0LAotCTI4NzYsCTI3NDgsCTI2MjAsCTI0OTIsCTIzNjQsCTIyMzYsCTIxMDgsCTE5ODAsCi0JMTg4NCwJMTgyMCwJMTc1NiwJMTY5MiwJMTYyOCwJMTU2NCwJMTUwMCwJMTQzNiwKLQkxMzcyLAkxMzA4LAkxMjQ0LAkxMTgwLAkxMTE2LAkxMDUyLAk5ODgsCTkyNCwKLQk4NzYsCTg0NCwJODEyLAk3ODAsCTc0OCwJNzE2LAk2ODQsCTY1MiwKLQk2MjAsCTU4OCwJNTU2LAk1MjQsCTQ5MiwJNDYwLAk0MjgsCTM5NiwKLQkzNzIsCTM1NiwJMzQwLAkzMjQsCTMwOCwJMjkyLAkyNzYsCTI2MCwKLQkyNDQsCTIyOCwJMjEyLAkxOTYsCTE4MCwJMTY0LAkxNDgsCTEzMiwKLQkxMjAsCTExMiwJMTA0LAk5NiwJODgsCTgwLAk3MiwJNjQsCi0JNTYsCTQ4LAk0MCwJMzIsCTI0LAkxNiwJOCwJMCwKLX07Ci0KLS8qIDE2IGJpdCBBLWxhdyAqLwotCi1zdGF0aWMgc2hvcnQgYWxhdzJkbWExNltdID0gewotCS01NTA0LAktNTI0OCwJLTYwMTYsCS01NzYwLAktNDQ4MCwJLTQyMjQsCS00OTkyLAktNDczNiwKLQktNzU1MiwJLTcyOTYsCS04MDY0LAktNzgwOCwJLTY1MjgsCS02MjcyLAktNzA0MCwJLTY3ODQsCi0JLTI3NTIsCS0yNjI0LAktMzAwOCwJLTI4ODAsCS0yMjQwLAktMjExMiwJLTI0OTYsCS0yMzY4LAotCS0zNzc2LAktMzY0OCwJLTQwMzIsCS0zOTA0LAktMzI2NCwJLTMxMzYsCS0zNTIwLAktMzM5MiwKLQktMjIwMTYsCS0yMDk5MiwJLTI0MDY0LAktMjMwNDAsCS0xNzkyMCwJLTE2ODk2LAktMTk5NjgsCS0xODk0NCwKLQktMzAyMDgsCS0yOTE4NCwJLTMyMjU2LAktMzEyMzIsCS0yNjExMiwJLTI1MDg4LAktMjgxNjAsCS0yNzEzNiwKLQktMTEwMDgsCS0xMDQ5NiwJLTEyMDMyLAktMTE1MjAsCS04OTYwLAktODQ0OCwJLTk5ODQsCS05NDcyLAotCS0xNTEwNCwJLTE0NTkyLAktMTYxMjgsCS0xNTYxNiwJLTEzMDU2LAktMTI1NDQsCS0xNDA4MCwJLTEzNTY4LAotCS0zNDQsCS0zMjgsCS0zNzYsCS0zNjAsCS0yODAsCS0yNjQsCS0zMTIsCS0yOTYsCi0JLTQ3MiwJLTQ1NiwJLTUwNCwJLTQ4OCwJLTQwOCwJLTM5MiwJLTQ0MCwJLTQyNCwKLQktODgsCS03MiwJLTEyMCwJLTEwNCwJLTI0LAktOCwJLTU2LAktNDAsCi0JLTIxNiwJLTIwMCwJLTI0OCwJLTIzMiwJLTE1MiwJLTEzNiwJLTE4NCwJLTE2OCwKLQktMTM3NiwJLTEzMTIsCS0xNTA0LAktMTQ0MCwJLTExMjAsCS0xMDU2LAktMTI0OCwJLTExODQsCi0JLTE4ODgsCS0xODI0LAktMjAxNiwJLTE5NTIsCS0xNjMyLAktMTU2OCwJLTE3NjAsCS0xNjk2LAotCS02ODgsCS02NTYsCS03NTIsCS03MjAsCS01NjAsCS01MjgsCS02MjQsCS01OTIsCi0JLTk0NCwJLTkxMiwJLTEwMDgsCS05NzYsCS04MTYsCS03ODQsCS04ODAsCS04NDgsCi0JNTUwNCwJNTI0OCwJNjAxNiwJNTc2MCwJNDQ4MCwJNDIyNCwJNDk5MiwJNDczNiwKLQk3NTUyLAk3Mjk2LAk4MDY0LAk3ODA4LAk2NTI4LAk2MjcyLAk3MDQwLAk2Nzg0LAotCTI3NTIsCTI2MjQsCTMwMDgsCTI4ODAsCTIyNDAsCTIxMTIsCTI0OTYsCTIzNjgsCi0JMzc3NiwJMzY0OCwJNDAzMiwJMzkwNCwJMzI2NCwJMzEzNiwJMzUyMCwJMzM5MiwKLQkyMjAxNiwJMjA5OTIsCTI0MDY0LAkyMzA0MCwJMTc5MjAsCTE2ODk2LAkxOTk2OCwJMTg5NDQsCi0JMzAyMDgsCTI5MTg0LAkzMjI1NiwJMzEyMzIsCTI2MTEyLAkyNTA4OCwJMjgxNjAsCTI3MTM2LAotCTExMDA4LAkxMDQ5NiwJMTIwMzIsCTExNTIwLAk4OTYwLAk4NDQ4LAk5OTg0LAk5NDcyLAotCTE1MTA0LAkxNDU5MiwJMTYxMjgsCTE1NjE2LAkxMzA1NiwJMTI1NDQsCTE0MDgwLAkxMzU2OCwKLQkzNDQsCTMyOCwJMzc2LAkzNjAsCTI4MCwJMjY0LAkzMTIsCTI5NiwKLQk0NzIsCTQ1NiwJNTA0LAk0ODgsCTQwOCwJMzkyLAk0NDAsCTQyNCwKLQk4OCwJNzIsCTEyMCwJMTA0LAkyNCwJOCwJNTYsCTQwLAotCTIxNiwJMjAwLAkyNDgsCTIzMiwJMTUyLAkxMzYsCTE4NCwJMTY4LAotCTEzNzYsCTEzMTIsCTE1MDQsCTE0NDAsCTExMjAsCTEwNTYsCTEyNDgsCTExODQsCi0JMTg4OCwJMTgyNCwJMjAxNiwJMTk1MiwJMTYzMiwJMTU2OCwJMTc2MCwJMTY5NiwKLQk2ODgsCTY1NiwJNzUyLAk3MjAsCTU2MCwJNTI4LAk2MjQsCTU5MiwKLQk5NDQsCTkxMiwJMTAwOCwJOTc2LAk4MTYsCTc4NCwJODgwLAk4NDgsCi19OwotCi0KLS8qKiogVHJhbnNsYXRpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1zdGF0aWMgc3NpemVfdCBjczQyMThfY3RfbGF3KGNvbnN0IHVfY2hhciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKLQkJCSAgIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCi0JCQkgICBzc2l6ZV90IGZyYW1lTGVmdCk7Ci1zdGF0aWMgc3NpemVfdCBjczQyMThfY3RfczgoY29uc3QgdV9jaGFyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAotCQkJICB1X2NoYXIgZnJhbWVbXSwgc3NpemVfdCAqZnJhbWVVc2VkLAotCQkJICBzc2l6ZV90IGZyYW1lTGVmdCk7Ci1zdGF0aWMgc3NpemVfdCBjczQyMThfY3RfdTgoY29uc3QgdV9jaGFyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAotCQkJICB1X2NoYXIgZnJhbWVbXSwgc3NpemVfdCAqZnJhbWVVc2VkLAotCQkJICBzc2l6ZV90IGZyYW1lTGVmdCk7Ci1zdGF0aWMgc3NpemVfdCBjczQyMThfY3RfczE2KGNvbnN0IHVfY2hhciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKLQkJCSAgIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCi0JCQkgICBzc2l6ZV90IGZyYW1lTGVmdCk7Ci1zdGF0aWMgc3NpemVfdCBjczQyMThfY3RfdTE2KGNvbnN0IHVfY2hhciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKLQkJCSAgIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCi0JCQkgICBzc2l6ZV90IGZyYW1lTGVmdCk7Ci1zdGF0aWMgc3NpemVfdCBjczQyMThfY3R4X2xhdyhjb25zdCB1X2NoYXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCi0JCQkgICAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKLQkJCSAgICBzc2l6ZV90IGZyYW1lTGVmdCk7Ci1zdGF0aWMgc3NpemVfdCBjczQyMThfY3R4X3M4KGNvbnN0IHVfY2hhciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKLQkJCSAgIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCi0JCQkgICBzc2l6ZV90IGZyYW1lTGVmdCk7Ci1zdGF0aWMgc3NpemVfdCBjczQyMThfY3R4X3U4KGNvbnN0IHVfY2hhciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKLQkJCSAgIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCi0JCQkgICBzc2l6ZV90IGZyYW1lTGVmdCk7Ci1zdGF0aWMgc3NpemVfdCBjczQyMThfY3R4X3MxNihjb25zdCB1X2NoYXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCi0JCQkgICAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKLQkJCSAgICBzc2l6ZV90IGZyYW1lTGVmdCk7Ci1zdGF0aWMgc3NpemVfdCBjczQyMThfY3R4X3UxNihjb25zdCB1X2NoYXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCi0JCQkgICAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKLQkJCSAgICBzc2l6ZV90IGZyYW1lTGVmdCk7Ci1zdGF0aWMgc3NpemVfdCBjczQyMThfY3RfczE2X3JlYWQoY29uc3QgdV9jaGFyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAotCQkJICAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKLQkJCSAgIHNzaXplX3QgZnJhbWVMZWZ0KTsKLXN0YXRpYyBzc2l6ZV90IGNzNDIxOF9jdF91MTZfcmVhZChjb25zdCB1X2NoYXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCi0JCQkgICB1X2NoYXIgZnJhbWVbXSwgc3NpemVfdCAqZnJhbWVVc2VkLAotCQkJICAgc3NpemVfdCBmcmFtZUxlZnQpOwotCi0KLS8qKiogTG93IGxldmVsIHN0dWZmICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGNzX3NvdW5kX3NldHRpbmdzIHsKLQlNQUNISU5FIG1hY2g7CQkvKiBtYWNoaW5lIGRlcGVuZGVudCB0aGluZ3MgKi8KLQlTRVRUSU5HUyBoYXJkOwkJLyogaGFyZHdhcmUgc2V0dGluZ3MgKi8KLQlTRVRUSU5HUyBzb2Z0OwkJLyogc29mdHdhcmUgc2V0dGluZ3MgKi8KLQlTRVRUSU5HUyBkc3A7CQkvKiAvZGV2L2RzcCBkZWZhdWx0IHNldHRpbmdzICovCi0JVFJBTlMgKnRyYW5zX3dyaXRlOwkvKiBzdXBwb3J0ZWQgdHJhbnNsYXRpb25zIGZvciBwbGF5YmFjayAqLwotCVRSQU5TICp0cmFuc19yZWFkOwkvKiBzdXBwb3J0ZWQgdHJhbnNsYXRpb25zIGZvciByZWNvcmQgKi8KLQlpbnQgdm9sdW1lX2xlZnQ7CS8qIHZvbHVtZSAocmFuZ2UgaXMgbWFjaGluZSBkZXBlbmRlbnQpICovCi0JaW50IHZvbHVtZV9yaWdodDsKLQlpbnQgYmFzczsJCS8qIHRvbmUgKHJhbmdlIGlzIG1hY2hpbmUgZGVwZW5kZW50KSAqLwotCWludCB0cmVibGU7Ci0JaW50IGdhaW47Ci0JaW50IG1pbkRldjsJCS8qIG1pbm9yIGRldmljZSBudW1iZXIgY3VycmVudGx5IG9wZW4gKi8KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY3Nfc291bmRfc2V0dGluZ3Mgc291bmQ7Ci0KLXN0YXRpYyB2b2lkICpDU19BbGxvYyh1bnNpZ25lZCBpbnQgc2l6ZSwgZ2ZwX3QgZmxhZ3MpOwotc3RhdGljIHZvaWQgQ1NfRnJlZSh2b2lkICpwdHIsIHVuc2lnbmVkIGludCBzaXplKTsKLXN0YXRpYyBpbnQgQ1NfSXJxSW5pdCh2b2lkKTsKLSNpZmRlZiBNT0RVTEUKLXN0YXRpYyB2b2lkIENTX0lycUNsZWFudXAodm9pZCk7Ci0jZW5kaWYgLyogTU9EVUxFICovCi1zdGF0aWMgdm9pZCBDU19TaWxlbmNlKHZvaWQpOwotc3RhdGljIHZvaWQgQ1NfSW5pdCh2b2lkKTsKLXN0YXRpYyB2b2lkIENTX1BsYXkodm9pZCk7Ci1zdGF0aWMgdm9pZCBDU19SZWNvcmQodm9pZCk7Ci1zdGF0aWMgaW50IENTX1NldEZvcm1hdChpbnQgZm9ybWF0KTsKLXN0YXRpYyBpbnQgQ1NfU2V0Vm9sdW1lKGludCB2b2x1bWUpOwotc3RhdGljIHZvaWQgY3M0MjE4X3RkbV90eF9pbnRyKHZvaWQgKmRldmlkKTsKLXN0YXRpYyB2b2lkIGNzNDIxOF90ZG1fcnhfaW50cih2b2lkICpkZXZpZCk7Ci1zdGF0aWMgdm9pZCBjczQyMThfaW50cih2b2lkICpkZXZpZCk7Ci1zdGF0aWMgaW50IGNzX2dldF92b2x1bWUodWludCByZWcpOwotc3RhdGljIGludCBjc192b2x1bWVfc2V0dGVyKGludCB2b2x1bWUsIGludCBtdXRlKTsKLXN0YXRpYyBpbnQgY3NfZ2V0X2dhaW4odWludCByZWcpOwotc3RhdGljIGludCBjc19zZXRfZ2FpbihpbnQgZ2Fpbik7Ci1zdGF0aWMgdm9pZCBjc19ta3NvdW5kKHVuc2lnbmVkIGludCBoeiwgdW5zaWduZWQgaW50IHRpY2tzKTsKLXN0YXRpYyB2b2lkIGNzX25vc291bmQodW5zaWduZWQgbG9uZyB4eCk7Ci0KLS8qKiogTWlkIGxldmVsIHN0dWZmICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1zdGF0aWMgdm9pZCBzb3VuZF9zaWxlbmNlKHZvaWQpOwotc3RhdGljIHZvaWQgc291bmRfaW5pdCh2b2lkKTsKLXN0YXRpYyBpbnQgc291bmRfc2V0X2Zvcm1hdChpbnQgZm9ybWF0KTsKLXN0YXRpYyBpbnQgc291bmRfc2V0X3NwZWVkKGludCBzcGVlZCk7Ci1zdGF0aWMgaW50IHNvdW5kX3NldF9zdGVyZW8oaW50IHN0ZXJlbyk7Ci1zdGF0aWMgaW50IHNvdW5kX3NldF92b2x1bWUoaW50IHZvbHVtZSk7Ci0KLXN0YXRpYyBzc2l6ZV90IHNvdW5kX2NvcHlfdHJhbnNsYXRlKGNvbnN0IHVfY2hhciAqdXNlclB0ciwKLQkJCQkgICAgc2l6ZV90IHVzZXJDb3VudCwKLQkJCQkgICAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKLQkJCQkgICAgc3NpemVfdCBmcmFtZUxlZnQpOwotc3RhdGljIHNzaXplX3Qgc291bmRfY29weV90cmFuc2xhdGVfcmVhZChjb25zdCB1X2NoYXIgKnVzZXJQdHIsCi0JCQkJICAgIHNpemVfdCB1c2VyQ291bnQsCi0JCQkJICAgIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCi0JCQkJICAgIHNzaXplX3QgZnJhbWVMZWZ0KTsKLQotCi0vKgotICogL2Rldi9taXhlciBhYnN0cmFjdGlvbgotICovCi0KLXN0cnVjdCBzb3VuZF9taXhlciB7Ci0gICAgaW50IGJ1c3k7Ci0gICAgaW50IG1vZGlmeV9jb3VudGVyOwotfTsKLQotc3RhdGljIHN0cnVjdCBzb3VuZF9taXhlciBtaXhlcjsKLQotc3RhdGljIHN0cnVjdCBzb3VuZF9xdWV1ZSBzcTsKLXN0YXRpYyBzdHJ1Y3Qgc291bmRfcXVldWUgcmVhZF9zcTsKLQotI2RlZmluZSBzcV9ibG9ja19hZGRyZXNzKGkpCShzcS5idWZmZXJzW2ldKQotI2RlZmluZSBTSUdOQUxfUkVDRUlWRUQJKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQotI2RlZmluZSBOT05fQkxPQ0tJTkcob3Blbl9tb2RlKQkob3Blbl9tb2RlICYgT19OT05CTE9DSykKLSNkZWZpbmUgT05FX1NFQ09ORAlIWgkvKiBpbiBqaWZmaWVzICgxMDB0aHMgb2YgYSBzZWNvbmQpICovCi0jZGVmaW5lIE5PX1RJTUVfTElNSVQJMHhmZmZmZmZmZgotCi0vKgotICogL2Rldi9zbmRzdGF0Ci0gKi8KLQotc3RydWN0IHNvdW5kX3N0YXRlIHsKLQlpbnQgYnVzeTsKLQljaGFyIGJ1Zls1MTJdOwotCWludCBsZW4sIHB0cjsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc291bmRfc3RhdGUgc3RhdGU7Ci0KLS8qKiogQ29tbW9uIHN0dWZmICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgbG9uZyBsb25nIHNvdW5kX2xzZWVrKHN0cnVjdCBmaWxlICpmaWxlLCBsb25nIGxvbmcgb2Zmc2V0LCBpbnQgb3JpZyk7Ci0KLS8qKiogQ29uZmlnICYgU2V0dXAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCBkbWFzb3VuZF9zZXR1cChjaGFyICpzdHIsIGludCAqaW50cyk7Ci0KLS8qKiogVHJhbnNsYXRpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0vKiArK1RlU2NoZTogcmFkaWNhbGx5IGNoYW5nZWQgZm9yIG5ldyBleHBhbmRpbmcgcHVycG9zZXMuLi4KLSAqCi0gKiBUaGVzZSB0d28gcm91dGluZXMgbm93IGRlYWwgd2l0aCBjb3B5aW5nL2V4cGFuZGluZy90cmFuc2xhdGluZyB0aGUgc2FtcGxlcwotICogZnJvbSB1c2VyIHNwYWNlIGludG8gb3VyIGJ1ZmZlciBhdCB0aGUgcmlnaHQgZnJlcXVlbmN5LiBUaGV5IHRha2UgY2FyZSBhYm91dAotICogaG93IG11Y2ggZGF0YSB0aGVyZSdzIGFjdHVhbGx5IHRvIHJlYWQsIGhvdyBtdWNoIGJ1ZmZlciBzcGFjZSB0aGVyZSBpcyBhbmQKLSAqIHRvIGNvbnZlcnQgc2FtcGxlcyBpbnRvIHRoZSByaWdodCBmcmVxdWVuY3kvZW5jb2RpbmcuIFRoZXkgd2lsbCBvbmx5IHdvcmsgb24KLSAqIGNvbXBsZXRlIHNhbXBsZXMgc28gaXQgbWF5IGhhcHBlbiB0aGV5IGxlYXZlIHNvbWUgYnl0ZXMgaW4gdGhlIGlucHV0IHN0cmVhbQotICogaWYgdGhlIHVzZXIgZGlkbid0IHdyaXRlIGEgbXVsdGlwbGUgb2YgdGhlIGN1cnJlbnQgc2FtcGxlIHNpemUuIFRoZXkgYm90aAotICogcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhleSd2ZSB1c2VkIGZyb20gYm90aCBzdHJlYW1zIHNvIHlvdSBtYXkgZGV0ZWN0Ci0gKiBzdWNoIGEgc2l0dWF0aW9uLiBMdWNraWx5IGFsbCBwcm9ncmFtcyBzaG91bGQgYmUgYWJsZSB0byBjb3BlIHdpdGggdGhhdC4KLSAqCi0gKiBJIHRoaW5rIEkndmUgb3B0aW1pemVkIGFueXRoaW5nIGFzIGZhciBhcyBvbmUgY2FuIGRvIGluIHBsYWluIEMsIGFsbAotICogdmFyaWFibGVzIHNob3VsZCBmaXQgaW4gcmVnaXN0ZXJzIGFuZCB0aGUgbG9vcHMgYXJlIHJlYWxseSBzaG9ydC4gVGhlcmUncwotICogb25lIGxvb3AgZm9yIGV2ZXJ5IHBvc3NpYmxlIHNpdHVhdGlvbi4gV3JpdGluZyBhIG1vcmUgZ2VuZXJhbGl6ZWQgYW5kIHRodXMKLSAqIHBhcmFtZXRlcml6ZWQgbG9vcCB3b3VsZCBvbmx5IHByb2R1Y2Ugc2xvd2VyIGNvZGUuIEZlZWwgZnJlZSB0byBvcHRpbWl6ZQotICogdGhpcyBpbiBhc3NlbWJsZXIgaWYgeW91IGxpa2UuIDopCi0gKgotICogSSB0aGluayB0aGVzZSByb3V0aW5lcyBiZWxvbmcgaGVyZSBiZWNhdXNlIHRoZXkncmUgbm90IHlldCByZWFsbHkgaGFyZHdhcmUKLSAqIGluZGVwZW5kZW50LCBlc3BlY2lhbGx5IHRoZSBmYWN0IHRoYXQgdGhlIEZhbGNvbiBjYW4gcGxheSAxNmJpdCBzYW1wbGVzCi0gKiBvbmx5IGluIHN0ZXJlbyBpcyBoYXJkY29kZWQgaW4gYm90aCBvZiB0aGVtIQotICoKLSAqICsrZ2VlcnQ6IHNwbGl0IGluIGV2ZW4gbW9yZSBmdW5jdGlvbnMgKG9uZSBwZXIgZm9ybWF0KQotICovCi0KLXN0YXRpYyBzc2l6ZV90IGNzNDIxOF9jdF9sYXcoY29uc3QgdV9jaGFyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAotCQkJICAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKLQkJCSAgIHNzaXplX3QgZnJhbWVMZWZ0KQotewotCXNob3J0ICp0YWJsZSA9IHNvdW5kLnNvZnQuZm9ybWF0ID09IEFGTVRfTVVfTEFXID8gdWxhdzJkbWExNjogYWxhdzJkbWExNjsKLQlzc2l6ZV90IGNvdW50LCB1c2VkOwotCXNob3J0ICpwID0gKHNob3J0ICopICZmcmFtZVsqZnJhbWVVc2VkXTsKLQlpbnQgdmFsLCBzdGVyZW8gPSBzb3VuZC5zb2Z0LnN0ZXJlbzsKLQotCWZyYW1lTGVmdCA+Pj0gMjsKLQlpZiAoc3RlcmVvKQotCQl1c2VyQ291bnQgPj49IDE7Ci0JdXNlZCA9IGNvdW50ID0gbWluKHVzZXJDb3VudCwgZnJhbWVMZWZ0KTsKLQl3aGlsZSAoY291bnQgPiAwKSB7Ci0JCXVfY2hhciBkYXRhOwotCQlpZiAoZ2V0X3VzZXIoZGF0YSwgdXNlclB0cisrKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQl2YWwgPSB0YWJsZVtkYXRhXTsKLQkJKnArKyA9IHZhbDsKLQkJaWYgKHN0ZXJlbykgewotCQkJaWYgKGdldF91c2VyKGRhdGEsIHVzZXJQdHIrKykpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQl2YWwgPSB0YWJsZVtkYXRhXTsKLQkJfQotCQkqcCsrID0gdmFsOwotCQljb3VudC0tOwotCX0KLQkqZnJhbWVVc2VkICs9IHVzZWQgKiA0OwotCXJldHVybiBzdGVyZW8/IHVzZWQgKiAyOiB1c2VkOwotfQotCi0KLXN0YXRpYyBzc2l6ZV90IGNzNDIxOF9jdF9zOChjb25zdCB1X2NoYXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCi0JCQkgIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCi0JCQkgIHNzaXplX3QgZnJhbWVMZWZ0KQotewotCXNzaXplX3QgY291bnQsIHVzZWQ7Ci0Jc2hvcnQgKnAgPSAoc2hvcnQgKikgJmZyYW1lWypmcmFtZVVzZWRdOwotCWludCB2YWwsIHN0ZXJlbyA9IHNvdW5kLnNvZnQuc3RlcmVvOwotCi0JZnJhbWVMZWZ0ID4+PSAyOwotCWlmIChzdGVyZW8pCi0JCXVzZXJDb3VudCA+Pj0gMTsKLQl1c2VkID0gY291bnQgPSBtaW4odXNlckNvdW50LCBmcmFtZUxlZnQpOwotCXdoaWxlIChjb3VudCA+IDApIHsKLQkJdV9jaGFyIGRhdGE7Ci0JCWlmIChnZXRfdXNlcihkYXRhLCB1c2VyUHRyKyspKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCXZhbCA9IGRhdGEgPDwgODsKLQkJKnArKyA9IHZhbDsKLQkJaWYgKHN0ZXJlbykgewotCQkJaWYgKGdldF91c2VyKGRhdGEsIHVzZXJQdHIrKykpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQl2YWwgPSBkYXRhIDw8IDg7Ci0JCX0KLQkJKnArKyA9IHZhbDsKLQkJY291bnQtLTsKLQl9Ci0JKmZyYW1lVXNlZCArPSB1c2VkICogNDsKLQlyZXR1cm4gc3RlcmVvPyB1c2VkICogMjogdXNlZDsKLX0KLQotCi1zdGF0aWMgc3NpemVfdCBjczQyMThfY3RfdTgoY29uc3QgdV9jaGFyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAotCQkJICB1X2NoYXIgZnJhbWVbXSwgc3NpemVfdCAqZnJhbWVVc2VkLAotCQkJICBzc2l6ZV90IGZyYW1lTGVmdCkKLXsKLQlzc2l6ZV90IGNvdW50LCB1c2VkOwotCXNob3J0ICpwID0gKHNob3J0ICopICZmcmFtZVsqZnJhbWVVc2VkXTsKLQlpbnQgdmFsLCBzdGVyZW8gPSBzb3VuZC5zb2Z0LnN0ZXJlbzsKLQotCWZyYW1lTGVmdCA+Pj0gMjsKLQlpZiAoc3RlcmVvKQotCQl1c2VyQ291bnQgPj49IDE7Ci0JdXNlZCA9IGNvdW50ID0gbWluKHVzZXJDb3VudCwgZnJhbWVMZWZ0KTsKLQl3aGlsZSAoY291bnQgPiAwKSB7Ci0JCXVfY2hhciBkYXRhOwotCQlpZiAoZ2V0X3VzZXIoZGF0YSwgdXNlclB0cisrKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQl2YWwgPSAoZGF0YSBeIDB4ODApIDw8IDg7Ci0JCSpwKysgPSB2YWw7Ci0JCWlmIChzdGVyZW8pIHsKLQkJCWlmIChnZXRfdXNlcihkYXRhLCB1c2VyUHRyKyspKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJdmFsID0gKGRhdGEgXiAweDgwKSA8PCA4OwotCQl9Ci0JCSpwKysgPSB2YWw7Ci0JCWNvdW50LS07Ci0JfQotCSpmcmFtZVVzZWQgKz0gdXNlZCAqIDQ7Ci0JcmV0dXJuIHN0ZXJlbz8gdXNlZCAqIDI6IHVzZWQ7Ci19Ci0KLQotLyogVGhpcyBpcyB0aGUgZGVmYXVsdCBmb3JtYXQgb2YgdGhlIGNvZGVjLiAgU2lnbmVkLCAxNi1iaXQgc3RlcmVvCi0gKiBnZW5lcmF0ZWQgYnkgYW4gYXBwbGljYXRpb24gc2hvdWxkbid0IGhhdmUgdG8gYmUgY29waWVkIGF0IGFsbC4KLSAqIFdlIHNob3VsZCBqdXN0IGdldCB0aGUgcGhzaWNhbCBhZGRyZXNzIG9mIHRoZSBidWZmZXJzIGFuZCB1cGRhdGUKLSAqIHRoZSBURE0gQkRzIGRpcmVjdGx5LgotICovCi1zdGF0aWMgc3NpemVfdCBjczQyMThfY3RfczE2KGNvbnN0IHVfY2hhciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKLQkJCSAgIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCi0JCQkgICBzc2l6ZV90IGZyYW1lTGVmdCkKLXsKLQlzc2l6ZV90IGNvdW50LCB1c2VkOwotCWludCBzdGVyZW8gPSBzb3VuZC5zb2Z0LnN0ZXJlbzsKLQlzaG9ydCAqZnAgPSAoc2hvcnQgKikgJmZyYW1lWypmcmFtZVVzZWRdOwotCi0JZnJhbWVMZWZ0ID4+PSAyOwotCXVzZXJDb3VudCA+Pj0gKHN0ZXJlbz8gMjogMSk7Ci0JdXNlZCA9IGNvdW50ID0gbWluKHVzZXJDb3VudCwgZnJhbWVMZWZ0KTsKLQlpZiAoIXN0ZXJlbykgewotCQlzaG9ydCAqdXAgPSAoc2hvcnQgKikgdXNlclB0cjsKLQkJd2hpbGUgKGNvdW50ID4gMCkgewotCQkJc2hvcnQgZGF0YTsKLQkJCWlmIChnZXRfdXNlcihkYXRhLCB1cCsrKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCSpmcCsrID0gZGF0YTsKLQkJCSpmcCsrID0gZGF0YTsKLQkJCWNvdW50LS07Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAoY29weV9mcm9tX3VzZXIoZnAsIHVzZXJQdHIsIGNvdW50ICogNCkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0JKmZyYW1lVXNlZCArPSB1c2VkICogNDsKLQlyZXR1cm4gc3RlcmVvPyB1c2VkICogNDogdXNlZCAqIDI7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGNzNDIxOF9jdF91MTYoY29uc3QgdV9jaGFyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAotCQkJICAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKLQkJCSAgIHNzaXplX3QgZnJhbWVMZWZ0KQotewotCXNzaXplX3QgY291bnQsIHVzZWQ7Ci0JaW50IG1hc2sgPSAoc291bmQuc29mdC5mb3JtYXQgPT0gQUZNVF9VMTZfTEU/IDB4MDA4MDogMHg4MDAwKTsKLQlpbnQgc3RlcmVvID0gc291bmQuc29mdC5zdGVyZW87Ci0Jc2hvcnQgKmZwID0gKHNob3J0ICopICZmcmFtZVsqZnJhbWVVc2VkXTsKLQlzaG9ydCAqdXAgPSAoc2hvcnQgKikgdXNlclB0cjsKLQotCWZyYW1lTGVmdCA+Pj0gMjsKLQl1c2VyQ291bnQgPj49IChzdGVyZW8/IDI6IDEpOwotCXVzZWQgPSBjb3VudCA9IG1pbih1c2VyQ291bnQsIGZyYW1lTGVmdCk7Ci0Jd2hpbGUgKGNvdW50ID4gMCkgewotCQlpbnQgZGF0YTsKLQkJaWYgKGdldF91c2VyKGRhdGEsIHVwKyspKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCWRhdGEgXj0gbWFzazsKLQkJKmZwKysgPSBkYXRhOwotCQlpZiAoc3RlcmVvKSB7Ci0JCQlpZiAoZ2V0X3VzZXIoZGF0YSwgdXArKykpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQlkYXRhIF49IG1hc2s7Ci0JCX0KLQkJKmZwKysgPSBkYXRhOwotCQljb3VudC0tOwotCX0KLQkqZnJhbWVVc2VkICs9IHVzZWQgKiA0OwotCXJldHVybiBzdGVyZW8/IHVzZWQgKiA0OiB1c2VkICogMjsKLX0KLQotCi1zdGF0aWMgc3NpemVfdCBjczQyMThfY3R4X2xhdyhjb25zdCB1X2NoYXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCi0JCQkgICAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKLQkJCSAgICBzc2l6ZV90IGZyYW1lTGVmdCkKLXsKLQl1bnNpZ25lZCBzaG9ydCAqdGFibGUgPSAodW5zaWduZWQgc2hvcnQgKikKLQkJKHNvdW5kLnNvZnQuZm9ybWF0ID09IEFGTVRfTVVfTEFXID8gdWxhdzJkbWExNjogYWxhdzJkbWExNik7Ci0JdW5zaWduZWQgaW50IGRhdGEgPSBleHBhbmRfZGF0YTsKLQl1bnNpZ25lZCBpbnQgKnAgPSAodW5zaWduZWQgaW50ICopICZmcmFtZVsqZnJhbWVVc2VkXTsKLQlpbnQgYmFsID0gZXhwYW5kX2JhbDsKLQlpbnQgaFNwZWVkID0gc291bmQuaGFyZC5zcGVlZCwgc1NwZWVkID0gc291bmQuc29mdC5zcGVlZDsKLQlpbnQgdXRvdGFsLCBmdG90YWw7Ci0JaW50IHN0ZXJlbyA9IHNvdW5kLnNvZnQuc3RlcmVvOwotCi0JZnJhbWVMZWZ0ID4+PSAyOwotCWlmIChzdGVyZW8pCi0JCXVzZXJDb3VudCA+Pj0gMTsKLQlmdG90YWwgPSBmcmFtZUxlZnQ7Ci0JdXRvdGFsID0gdXNlckNvdW50OwotCXdoaWxlIChmcmFtZUxlZnQpIHsKLQkJdV9jaGFyIGM7Ci0JCWlmIChiYWwgPCAwKSB7Ci0JCQlpZiAodXNlckNvdW50ID09IDApCi0JCQkJYnJlYWs7Ci0JCQlpZiAoZ2V0X3VzZXIoYywgdXNlclB0cisrKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCWRhdGEgPSB0YWJsZVtjXTsKLQkJCWlmIChzdGVyZW8pIHsKLQkJCQlpZiAoZ2V0X3VzZXIoYywgdXNlclB0cisrKSkKLQkJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJZGF0YSA9IChkYXRhIDw8IDE2KSArIHRhYmxlW2NdOwotCQkJfSBlbHNlCi0JCQkJZGF0YSA9IChkYXRhIDw8IDE2KSArIGRhdGE7Ci0JCQl1c2VyQ291bnQtLTsKLQkJCWJhbCArPSBoU3BlZWQ7Ci0JCX0KLQkJKnArKyA9IGRhdGE7Ci0JCWZyYW1lTGVmdC0tOwotCQliYWwgLT0gc1NwZWVkOwotCX0KLQlleHBhbmRfYmFsID0gYmFsOwotCWV4cGFuZF9kYXRhID0gZGF0YTsKLQkqZnJhbWVVc2VkICs9IChmdG90YWwgLSBmcmFtZUxlZnQpICogNDsKLQl1dG90YWwgLT0gdXNlckNvdW50OwotCXJldHVybiBzdGVyZW8/IHV0b3RhbCAqIDI6IHV0b3RhbDsKLX0KLQotCi1zdGF0aWMgc3NpemVfdCBjczQyMThfY3R4X3M4KGNvbnN0IHVfY2hhciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKLQkJCSAgIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCi0JCQkgICBzc2l6ZV90IGZyYW1lTGVmdCkKLXsKLQl1bnNpZ25lZCBpbnQgKnAgPSAodW5zaWduZWQgaW50ICopICZmcmFtZVsqZnJhbWVVc2VkXTsKLQl1bnNpZ25lZCBpbnQgZGF0YSA9IGV4cGFuZF9kYXRhOwotCWludCBiYWwgPSBleHBhbmRfYmFsOwotCWludCBoU3BlZWQgPSBzb3VuZC5oYXJkLnNwZWVkLCBzU3BlZWQgPSBzb3VuZC5zb2Z0LnNwZWVkOwotCWludCBzdGVyZW8gPSBzb3VuZC5zb2Z0LnN0ZXJlbzsKLQlpbnQgdXRvdGFsLCBmdG90YWw7Ci0KLQlmcmFtZUxlZnQgPj49IDI7Ci0JaWYgKHN0ZXJlbykKLQkJdXNlckNvdW50ID4+PSAxOwotCWZ0b3RhbCA9IGZyYW1lTGVmdDsKLQl1dG90YWwgPSB1c2VyQ291bnQ7Ci0Jd2hpbGUgKGZyYW1lTGVmdCkgewotCQl1X2NoYXIgYzsKLQkJaWYgKGJhbCA8IDApIHsKLQkJCWlmICh1c2VyQ291bnQgPT0gMCkKLQkJCQlicmVhazsKLQkJCWlmIChnZXRfdXNlcihjLCB1c2VyUHRyKyspKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJZGF0YSA9IGMgPDwgODsKLQkJCWlmIChzdGVyZW8pIHsKLQkJCQlpZiAoZ2V0X3VzZXIoYywgdXNlclB0cisrKSkKLQkJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJZGF0YSA9IChkYXRhIDw8IDE2KSArIChjIDw8IDgpOwotCQkJfSBlbHNlCi0JCQkJZGF0YSA9IChkYXRhIDw8IDE2KSArIGRhdGE7Ci0JCQl1c2VyQ291bnQtLTsKLQkJCWJhbCArPSBoU3BlZWQ7Ci0JCX0KLQkJKnArKyA9IGRhdGE7Ci0JCWZyYW1lTGVmdC0tOwotCQliYWwgLT0gc1NwZWVkOwotCX0KLQlleHBhbmRfYmFsID0gYmFsOwotCWV4cGFuZF9kYXRhID0gZGF0YTsKLQkqZnJhbWVVc2VkICs9IChmdG90YWwgLSBmcmFtZUxlZnQpICogNDsKLQl1dG90YWwgLT0gdXNlckNvdW50OwotCXJldHVybiBzdGVyZW8/IHV0b3RhbCAqIDI6IHV0b3RhbDsKLX0KLQotCi1zdGF0aWMgc3NpemVfdCBjczQyMThfY3R4X3U4KGNvbnN0IHVfY2hhciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKLQkJCSAgIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCi0JCQkgICBzc2l6ZV90IGZyYW1lTGVmdCkKLXsKLQl1bnNpZ25lZCBpbnQgKnAgPSAodW5zaWduZWQgaW50ICopICZmcmFtZVsqZnJhbWVVc2VkXTsKLQl1bnNpZ25lZCBpbnQgZGF0YSA9IGV4cGFuZF9kYXRhOwotCWludCBiYWwgPSBleHBhbmRfYmFsOwotCWludCBoU3BlZWQgPSBzb3VuZC5oYXJkLnNwZWVkLCBzU3BlZWQgPSBzb3VuZC5zb2Z0LnNwZWVkOwotCWludCBzdGVyZW8gPSBzb3VuZC5zb2Z0LnN0ZXJlbzsKLQlpbnQgdXRvdGFsLCBmdG90YWw7Ci0KLQlmcmFtZUxlZnQgPj49IDI7Ci0JaWYgKHN0ZXJlbykKLQkJdXNlckNvdW50ID4+PSAxOwotCWZ0b3RhbCA9IGZyYW1lTGVmdDsKLQl1dG90YWwgPSB1c2VyQ291bnQ7Ci0Jd2hpbGUgKGZyYW1lTGVmdCkgewotCQl1X2NoYXIgYzsKLQkJaWYgKGJhbCA8IDApIHsKLQkJCWlmICh1c2VyQ291bnQgPT0gMCkKLQkJCQlicmVhazsKLQkJCWlmIChnZXRfdXNlcihjLCB1c2VyUHRyKyspKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJZGF0YSA9IChjIF4gMHg4MCkgPDwgODsKLQkJCWlmIChzdGVyZW8pIHsKLQkJCQlpZiAoZ2V0X3VzZXIoYywgdXNlclB0cisrKSkKLQkJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJZGF0YSA9IChkYXRhIDw8IDE2KSArICgoYyBeIDB4ODApIDw8IDgpOwotCQkJfSBlbHNlCi0JCQkJZGF0YSA9IChkYXRhIDw8IDE2KSArIGRhdGE7Ci0JCQl1c2VyQ291bnQtLTsKLQkJCWJhbCArPSBoU3BlZWQ7Ci0JCX0KLQkJKnArKyA9IGRhdGE7Ci0JCWZyYW1lTGVmdC0tOwotCQliYWwgLT0gc1NwZWVkOwotCX0KLQlleHBhbmRfYmFsID0gYmFsOwotCWV4cGFuZF9kYXRhID0gZGF0YTsKLQkqZnJhbWVVc2VkICs9IChmdG90YWwgLSBmcmFtZUxlZnQpICogNDsKLQl1dG90YWwgLT0gdXNlckNvdW50OwotCXJldHVybiBzdGVyZW8/IHV0b3RhbCAqIDI6IHV0b3RhbDsKLX0KLQotCi1zdGF0aWMgc3NpemVfdCBjczQyMThfY3R4X3MxNihjb25zdCB1X2NoYXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCi0JCQkgICAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKLQkJCSAgICBzc2l6ZV90IGZyYW1lTGVmdCkKLXsKLQl1bnNpZ25lZCBpbnQgKnAgPSAodW5zaWduZWQgaW50ICopICZmcmFtZVsqZnJhbWVVc2VkXTsKLQl1bnNpZ25lZCBpbnQgZGF0YSA9IGV4cGFuZF9kYXRhOwotCXVuc2lnbmVkIHNob3J0ICp1cCA9ICh1bnNpZ25lZCBzaG9ydCAqKSB1c2VyUHRyOwotCWludCBiYWwgPSBleHBhbmRfYmFsOwotCWludCBoU3BlZWQgPSBzb3VuZC5oYXJkLnNwZWVkLCBzU3BlZWQgPSBzb3VuZC5zb2Z0LnNwZWVkOwotCWludCBzdGVyZW8gPSBzb3VuZC5zb2Z0LnN0ZXJlbzsKLQlpbnQgdXRvdGFsLCBmdG90YWw7Ci0KLQlmcmFtZUxlZnQgPj49IDI7Ci0JdXNlckNvdW50ID4+PSAoc3RlcmVvPyAyOiAxKTsKLQlmdG90YWwgPSBmcmFtZUxlZnQ7Ci0JdXRvdGFsID0gdXNlckNvdW50OwotCXdoaWxlIChmcmFtZUxlZnQpIHsKLQkJdW5zaWduZWQgc2hvcnQgYzsKLQkJaWYgKGJhbCA8IDApIHsKLQkJCWlmICh1c2VyQ291bnQgPT0gMCkKLQkJCQlicmVhazsKLQkJCWlmIChnZXRfdXNlcihkYXRhLCB1cCsrKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCWlmIChzdGVyZW8pIHsKLQkJCQlpZiAoZ2V0X3VzZXIoYywgdXArKykpCi0JCQkJCXJldHVybiAtRUZBVUxUOwotCQkJCWRhdGEgPSAoZGF0YSA8PCAxNikgKyBjOwotCQkJfSBlbHNlCi0JCQkJZGF0YSA9IChkYXRhIDw8IDE2KSArIGRhdGE7Ci0JCQl1c2VyQ291bnQtLTsKLQkJCWJhbCArPSBoU3BlZWQ7Ci0JCX0KLQkJKnArKyA9IGRhdGE7Ci0JCWZyYW1lTGVmdC0tOwotCQliYWwgLT0gc1NwZWVkOwotCX0KLQlleHBhbmRfYmFsID0gYmFsOwotCWV4cGFuZF9kYXRhID0gZGF0YTsKLQkqZnJhbWVVc2VkICs9IChmdG90YWwgLSBmcmFtZUxlZnQpICogNDsKLQl1dG90YWwgLT0gdXNlckNvdW50OwotCXJldHVybiBzdGVyZW8/IHV0b3RhbCAqIDQ6IHV0b3RhbCAqIDI7Ci19Ci0KLQotc3RhdGljIHNzaXplX3QgY3M0MjE4X2N0eF91MTYoY29uc3QgdV9jaGFyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAotCQkJICAgIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCi0JCQkgICAgc3NpemVfdCBmcmFtZUxlZnQpCi17Ci0JaW50IG1hc2sgPSAoc291bmQuc29mdC5mb3JtYXQgPT0gQUZNVF9VMTZfTEU/IDB4MDA4MDogMHg4MDAwKTsKLQl1bnNpZ25lZCBpbnQgKnAgPSAodW5zaWduZWQgaW50ICopICZmcmFtZVsqZnJhbWVVc2VkXTsKLQl1bnNpZ25lZCBpbnQgZGF0YSA9IGV4cGFuZF9kYXRhOwotCXVuc2lnbmVkIHNob3J0ICp1cCA9ICh1bnNpZ25lZCBzaG9ydCAqKSB1c2VyUHRyOwotCWludCBiYWwgPSBleHBhbmRfYmFsOwotCWludCBoU3BlZWQgPSBzb3VuZC5oYXJkLnNwZWVkLCBzU3BlZWQgPSBzb3VuZC5zb2Z0LnNwZWVkOwotCWludCBzdGVyZW8gPSBzb3VuZC5zb2Z0LnN0ZXJlbzsKLQlpbnQgdXRvdGFsLCBmdG90YWw7Ci0KLQlmcmFtZUxlZnQgPj49IDI7Ci0JdXNlckNvdW50ID4+PSAoc3RlcmVvPyAyOiAxKTsKLQlmdG90YWwgPSBmcmFtZUxlZnQ7Ci0JdXRvdGFsID0gdXNlckNvdW50OwotCXdoaWxlIChmcmFtZUxlZnQpIHsKLQkJdW5zaWduZWQgc2hvcnQgYzsKLQkJaWYgKGJhbCA8IDApIHsKLQkJCWlmICh1c2VyQ291bnQgPT0gMCkKLQkJCQlicmVhazsKLQkJCWlmIChnZXRfdXNlcihkYXRhLCB1cCsrKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCWRhdGEgXj0gbWFzazsKLQkJCWlmIChzdGVyZW8pIHsKLQkJCQlpZiAoZ2V0X3VzZXIoYywgdXArKykpCi0JCQkJCXJldHVybiAtRUZBVUxUOwotCQkJCWRhdGEgPSAoZGF0YSA8PCAxNikgKyAoYyBeIG1hc2spOwotCQkJfSBlbHNlCi0JCQkJZGF0YSA9IChkYXRhIDw8IDE2KSArIGRhdGE7Ci0JCQl1c2VyQ291bnQtLTsKLQkJCWJhbCArPSBoU3BlZWQ7Ci0JCX0KLQkJKnArKyA9IGRhdGE7Ci0JCWZyYW1lTGVmdC0tOwotCQliYWwgLT0gc1NwZWVkOwotCX0KLQlleHBhbmRfYmFsID0gYmFsOwotCWV4cGFuZF9kYXRhID0gZGF0YTsKLQkqZnJhbWVVc2VkICs9IChmdG90YWwgLSBmcmFtZUxlZnQpICogNDsKLQl1dG90YWwgLT0gdXNlckNvdW50OwotCXJldHVybiBzdGVyZW8/IHV0b3RhbCAqIDQ6IHV0b3RhbCAqIDI7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGNzNDIxOF9jdF9zOF9yZWFkKGNvbnN0IHVfY2hhciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKLQkJCSAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKLQkJCSAgc3NpemVfdCBmcmFtZUxlZnQpCi17Ci0Jc3NpemVfdCBjb3VudCwgdXNlZDsKLQlzaG9ydCAqcCA9IChzaG9ydCAqKSAmZnJhbWVbKmZyYW1lVXNlZF07Ci0JaW50IHZhbCwgc3RlcmVvID0gc291bmQuc29mdC5zdGVyZW87Ci0KLQlmcmFtZUxlZnQgPj49IDI7Ci0JaWYgKHN0ZXJlbykKLQkJdXNlckNvdW50ID4+PSAxOwotCXVzZWQgPSBjb3VudCA9IG1pbih1c2VyQ291bnQsIGZyYW1lTGVmdCk7Ci0Jd2hpbGUgKGNvdW50ID4gMCkgewotCQl1X2NoYXIgZGF0YTsKLQotCQl2YWwgPSAqcCsrOwotCQlkYXRhID0gdmFsID4+IDg7Ci0JCWlmIChwdXRfdXNlcihkYXRhLCAodV9jaGFyICopdXNlclB0cisrKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlpZiAoc3RlcmVvKSB7Ci0JCQl2YWwgPSAqcDsKLQkJCWRhdGEgPSB2YWwgPj4gODsKLQkJCWlmIChwdXRfdXNlcihkYXRhLCAodV9jaGFyICopdXNlclB0cisrKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQotCQlwKys7Ci0JCWNvdW50LS07Ci0JfQotCSpmcmFtZVVzZWQgKz0gdXNlZCAqIDQ7Ci0JcmV0dXJuIHN0ZXJlbz8gdXNlZCAqIDI6IHVzZWQ7Ci19Ci0KLQotc3RhdGljIHNzaXplX3QgY3M0MjE4X2N0X3U4X3JlYWQoY29uc3QgdV9jaGFyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAotCQkJICB1X2NoYXIgZnJhbWVbXSwgc3NpemVfdCAqZnJhbWVVc2VkLAotCQkJICBzc2l6ZV90IGZyYW1lTGVmdCkKLXsKLQlzc2l6ZV90IGNvdW50LCB1c2VkOwotCXNob3J0ICpwID0gKHNob3J0ICopICZmcmFtZVsqZnJhbWVVc2VkXTsKLQlpbnQgdmFsLCBzdGVyZW8gPSBzb3VuZC5zb2Z0LnN0ZXJlbzsKLQotCWZyYW1lTGVmdCA+Pj0gMjsKLQlpZiAoc3RlcmVvKQotCQl1c2VyQ291bnQgPj49IDE7Ci0JdXNlZCA9IGNvdW50ID0gbWluKHVzZXJDb3VudCwgZnJhbWVMZWZ0KTsKLQl3aGlsZSAoY291bnQgPiAwKSB7Ci0JCXVfY2hhciBkYXRhOwotCi0JCXZhbCA9ICpwKys7Ci0JCWRhdGEgPSAodmFsID4+IDgpIF4gMHg4MDsKLQkJaWYgKHB1dF91c2VyKGRhdGEsICh1X2NoYXIgKil1c2VyUHRyKyspKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCWlmIChzdGVyZW8pIHsKLQkJCXZhbCA9ICpwOwotCQkJZGF0YSA9ICh2YWwgPj4gOCkgXiAweDgwOwotCQkJaWYgKHB1dF91c2VyKGRhdGEsICh1X2NoYXIgKil1c2VyUHRyKyspKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQl9Ci0JCXArKzsKLQkJY291bnQtLTsKLQl9Ci0JKmZyYW1lVXNlZCArPSB1c2VkICogNDsKLQlyZXR1cm4gc3RlcmVvPyB1c2VkICogMjogdXNlZDsKLX0KLQotCi1zdGF0aWMgc3NpemVfdCBjczQyMThfY3RfczE2X3JlYWQoY29uc3QgdV9jaGFyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAotCQkJICAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKLQkJCSAgIHNzaXplX3QgZnJhbWVMZWZ0KQotewotCXNzaXplX3QgY291bnQsIHVzZWQ7Ci0JaW50IHN0ZXJlbyA9IHNvdW5kLnNvZnQuc3RlcmVvOwotCXNob3J0ICpmcCA9IChzaG9ydCAqKSAmZnJhbWVbKmZyYW1lVXNlZF07Ci0KLQlmcmFtZUxlZnQgPj49IDI7Ci0JdXNlckNvdW50ID4+PSAoc3RlcmVvPyAyOiAxKTsKLQl1c2VkID0gY291bnQgPSBtaW4odXNlckNvdW50LCBmcmFtZUxlZnQpOwotCWlmICghc3RlcmVvKSB7Ci0JCXNob3J0ICp1cCA9IChzaG9ydCAqKSB1c2VyUHRyOwotCQl3aGlsZSAoY291bnQgPiAwKSB7Ci0JCQlzaG9ydCBkYXRhOwotCQkJZGF0YSA9ICpmcDsKLQkJCWlmIChwdXRfdXNlcihkYXRhLCB1cCsrKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCWZwKz0yOwotCQkJY291bnQtLTsKLQkJfQotCX0gZWxzZSB7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHVfY2hhciAqKXVzZXJQdHIsIGZwLCBjb3VudCAqIDQpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCSpmcmFtZVVzZWQgKz0gdXNlZCAqIDQ7Ci0JcmV0dXJuIHN0ZXJlbz8gdXNlZCAqIDQ6IHVzZWQgKiAyOwotfQotCi1zdGF0aWMgc3NpemVfdCBjczQyMThfY3RfdTE2X3JlYWQoY29uc3QgdV9jaGFyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAotCQkJICAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKLQkJCSAgIHNzaXplX3QgZnJhbWVMZWZ0KQotewotCXNzaXplX3QgY291bnQsIHVzZWQ7Ci0JaW50IG1hc2sgPSAoc291bmQuc29mdC5mb3JtYXQgPT0gQUZNVF9VMTZfTEU/IDB4MDA4MDogMHg4MDAwKTsKLQlpbnQgc3RlcmVvID0gc291bmQuc29mdC5zdGVyZW87Ci0Jc2hvcnQgKmZwID0gKHNob3J0ICopICZmcmFtZVsqZnJhbWVVc2VkXTsKLQlzaG9ydCAqdXAgPSAoc2hvcnQgKikgdXNlclB0cjsKLQotCWZyYW1lTGVmdCA+Pj0gMjsKLQl1c2VyQ291bnQgPj49IChzdGVyZW8/IDI6IDEpOwotCXVzZWQgPSBjb3VudCA9IG1pbih1c2VyQ291bnQsIGZyYW1lTGVmdCk7Ci0Jd2hpbGUgKGNvdW50ID4gMCkgewotCQlpbnQgZGF0YTsKLQotCQlkYXRhID0gKmZwKys7Ci0JCWRhdGEgXj0gbWFzazsKLQkJaWYgKHB1dF91c2VyKGRhdGEsIHVwKyspKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCWlmIChzdGVyZW8pIHsKLQkJCWRhdGEgPSAqZnA7Ci0JCQlkYXRhIF49IG1hc2s7Ci0JCQlpZiAocHV0X3VzZXIoZGF0YSwgdXArKykpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQkJZnArKzsKLQkJY291bnQtLTsKLQl9Ci0JKmZyYW1lVXNlZCArPSB1c2VkICogNDsKLQlyZXR1cm4gc3RlcmVvPyB1c2VkICogNDogdXNlZCAqIDI7Ci19Ci0KLXN0YXRpYyBUUkFOUyB0cmFuc0NTTm9ybWFsID0gewotCWNzNDIxOF9jdF9sYXcsIGNzNDIxOF9jdF9sYXcsIGNzNDIxOF9jdF9zOCwgY3M0MjE4X2N0X3U4LAotCWNzNDIxOF9jdF9zMTYsIGNzNDIxOF9jdF91MTYsIGNzNDIxOF9jdF9zMTYsIGNzNDIxOF9jdF91MTYKLX07Ci0KLXN0YXRpYyBUUkFOUyB0cmFuc0NTRXhwYW5kID0gewotCWNzNDIxOF9jdHhfbGF3LCBjczQyMThfY3R4X2xhdywgY3M0MjE4X2N0eF9zOCwgY3M0MjE4X2N0eF91OCwKLQljczQyMThfY3R4X3MxNiwgY3M0MjE4X2N0eF91MTYsIGNzNDIxOF9jdHhfczE2LCBjczQyMThfY3R4X3UxNgotfTsKLQotc3RhdGljIFRSQU5TIHRyYW5zQ1NOb3JtYWxSZWFkID0gewotCU5VTEwsIE5VTEwsIGNzNDIxOF9jdF9zOF9yZWFkLCBjczQyMThfY3RfdThfcmVhZCwKLQljczQyMThfY3RfczE2X3JlYWQsIGNzNDIxOF9jdF91MTZfcmVhZCwKLQljczQyMThfY3RfczE2X3JlYWQsIGNzNDIxOF9jdF91MTZfcmVhZAotfTsKLQotLyoqKiBMb3cgbGV2ZWwgc3R1ZmYgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdm9pZCAqQ1NfQWxsb2ModW5zaWduZWQgaW50IHNpemUsIGdmcF90IGZsYWdzKQotewotCWludAlvcmRlcjsKLQotCXNpemUgPj49IDEzOwotCWZvciAob3JkZXI9MDsgb3JkZXIgPCA1OyBvcmRlcisrKSB7Ci0JCWlmIChzaXplID09IDApCi0JCQlicmVhazsKLQkJc2l6ZSA+Pj0gMTsKLQl9Ci0JcmV0dXJuICh2b2lkICopX19nZXRfZnJlZV9wYWdlcyhmbGFncywgb3JkZXIpOwotfQotCi1zdGF0aWMgdm9pZCBDU19GcmVlKHZvaWQgKnB0ciwgdW5zaWduZWQgaW50IHNpemUpCi17Ci0JaW50CW9yZGVyOwotCi0Jc2l6ZSA+Pj0gMTM7Ci0JZm9yIChvcmRlcj0wOyBvcmRlciA8IDU7IG9yZGVyKyspIHsKLQkJaWYgKHNpemUgPT0gMCkKLQkJCWJyZWFrOwotCQlzaXplID4+PSAxOwotCX0KLQlmcmVlX3BhZ2VzKCh1bG9uZylwdHIsIG9yZGVyKTsKLX0KLQotc3RhdGljIGludCBfX2luaXQgQ1NfSXJxSW5pdCh2b2lkKQotewotCWNwbV9pbnN0YWxsX2hhbmRsZXIoQ1BNVkVDX1NNQzIsIGNzNDIxOF9pbnRyLCBOVUxMKTsKLQlyZXR1cm4gMTsKLX0KLQotI2lmZGVmIE1PRFVMRQotc3RhdGljIHZvaWQgQ1NfSXJxQ2xlYW51cCh2b2lkKQotewotCXZvbGF0aWxlIHNtY190CQkqc3A7Ci0Jdm9sYXRpbGUgY3BtOHh4X3QJKmNwOwotCi0JLyogRmlyc3QgZGlzYWJsZSB0cmFuc21pdHRlciBhbmQgcmVjZWl2ZXIuCi0JKi8KLQlzcCA9ICZjcG1wLT5jcF9zbWNbMV07Ci0Jc3AtPnNtY19zbWNtciAmPSB+KFNNQ01SX1JFTiB8IFNNQ01SX1RFTik7Ci0KLQkvKiBBbmQgbm93IHNodXQgZG93biB0aGUgU01DLgotCSovCi0JY3AgPSBjcG1wOwkvKiBHZXQgcG9pbnRlciB0byBDb21tdW5pY2F0aW9uIFByb2Nlc3NvciAqLwotCWNwLT5jcF9jcGNyID0gbWtfY3JfY21kKENQTV9DUl9DSF9TTUMyLAotCQkJCUNQTV9DUl9TVE9QX1RYKSB8IENQTV9DUl9GTEc7Ci0Jd2hpbGUgKGNwLT5jcF9jcGNyICYgQ1BNX0NSX0ZMRyk7Ci0KLQkvKiBSZWxlYXNlIHRoZSBpbnRlcnJ1cHQgaGFuZGxlci4KLQkqLwotCWNwbV9mcmVlX2hhbmRsZXIoQ1BNVkVDX1NNQzIpOwotCi0Ja2ZyZWUoYmVlcF9idWYpOwotCWtkX21rc291bmQgPSBvcmlnX21rc291bmQ7Ci19Ci0jZW5kaWYgLyogTU9EVUxFICovCi0KLXN0YXRpYyB2b2lkIENTX1NpbGVuY2Uodm9pZCkKLXsKLQl2b2xhdGlsZSBzbWNfdAkJKnNwOwotCi0JLyogRGlzYWJsZSB0cmFuc21pdHRlci4KLQkqLwotCXNwID0gJmNwbXAtPmNwX3NtY1sxXTsKLQlzcC0+c21jX3NtY21yICY9IH5TTUNNUl9URU47Ci19Ci0KLS8qIEZyZXF1ZW5jaWVzIGRlcGVuZCB1cG9uIGV4dGVybmFsIG9zY2lsbGF0b3IuICBUaGVyZSBhcmUgdHdvCi0gKiBjaG9pY2VzLCAxMi4yODggYW5kIDExLjI4OTYgTUh6LiAgVGhlIFJQQ0cgYXVkaW8gc3VwcG9ydHMgYm90aCB0aHJvdWdoCi0gKiBhbmQgZXh0ZXJuYWwgY29udHJvbCByZWdpc3RlciBzZWxlY3Rpb24gYml0LgotICovCi1zdGF0aWMgaW50IGNzNDIxOF9mcmVxc1tdID0gewotICAgIC8qIDEyLjI4OCAgMTEuMjg5NiAgKi8KLQk0ODAwMCwgNDQxMDAsCi0JMzIwMDAsIDI5NDAwLAotCTI0MDAwLCAyMjA1MCwKLQkxOTIwMCwgMTc2NDAsCi0JMTYwMDAsIDE0NzAwLAotCTEyMDAwLCAxMTAyNSwKLQkgOTYwMCwgIDg4MjAsCi0JIDgwMDAsICA3MzUwCi19OwotCi1zdGF0aWMgdm9pZCBDU19Jbml0KHZvaWQpCi17Ci0JaW50IGksIHRvbGVyYW5jZTsKLQotCXN3aXRjaCAoc291bmQuc29mdC5mb3JtYXQpIHsKLQljYXNlIEFGTVRfUzE2X0xFOgotCWNhc2UgQUZNVF9VMTZfTEU6Ci0JCXNvdW5kLmhhcmQuZm9ybWF0ID0gQUZNVF9TMTZfTEU7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXNvdW5kLmhhcmQuZm9ybWF0ID0gQUZNVF9TMTZfQkU7Ci0JCWJyZWFrOwotCX0KLQlzb3VuZC5oYXJkLnN0ZXJlbyA9IDE7Ci0Jc291bmQuaGFyZC5zaXplID0gMTY7Ci0KLQkvKgotCSAqIElmIHdlIGhhdmUgYSBzYW1wbGUgcmF0ZSB3aGljaCBpcyB3aXRoaW4gY2F0Y2hSYWRpdXMgcGVyY2VudAotCSAqIG9mIHRoZSByZXF1ZXN0ZWQgdmFsdWUsIHdlIGRvbid0IGhhdmUgdG8gZXhwYW5kIHRoZSBzYW1wbGVzLgotCSAqIE90aGVyd2lzZSBjaG9vc2UgdGhlIG5leHQgaGlnaGVyIHJhdGUuCi0JICovCi0JaSA9IChzaXplb2YoY3M0MjE4X2ZyZXFzKSAvIHNpemVvZihpbnQpKTsKLQlkbyB7Ci0JCXRvbGVyYW5jZSA9IGNhdGNoUmFkaXVzICogY3M0MjE4X2ZyZXFzWy0taV0gLyAxMDA7Ci0JfSB3aGlsZSAoc291bmQuc29mdC5zcGVlZCA+IGNzNDIxOF9mcmVxc1tpXSArIHRvbGVyYW5jZSAmJiBpID4gMCk7Ci0JaWYgKHNvdW5kLnNvZnQuc3BlZWQgPj0gY3M0MjE4X2ZyZXFzW2ldIC0gdG9sZXJhbmNlKQotCQlzb3VuZC50cmFuc193cml0ZSA9ICZ0cmFuc0NTTm9ybWFsOwotCWVsc2UKLQkJc291bmQudHJhbnNfd3JpdGUgPSAmdHJhbnNDU0V4cGFuZDsKLQlzb3VuZC50cmFuc19yZWFkID0gJnRyYW5zQ1NOb3JtYWxSZWFkOwotCXNvdW5kLmhhcmQuc3BlZWQgPSBjczQyMThfZnJlcXNbaV07Ci0JY3M0MjE4X3JhdGVfaW5kZXggPSBpOwotCi0JLyogVGhlIENTNDIxOCBoYXMgc2V2ZW4gc2VsZWN0YWJsZSBjbG9jayBkaXZpZGVycyBmb3IgdGhlIHNhbXBsZQotCSAqIGNsb2NrLiAgVGhlIEhJT1ggdGhlbiBwcm92aWRlcyBvbmUgb2YgdHdvIGV4dGVybmFsIHJhdGVzLgotCSAqIEFuIGV2ZW4gbnVtYmVyZWQgZnJlcXVlbmN5IHRhYmxlIGluZGV4IHVzZXMgdGhlIGhpZ2ggZXh0ZXJuYWwKLQkgKiBjbG9jayByYXRlLgotCSAqLwotCSoodWludCAqKUhJT1hfQ1NSNF9BRERSICY9IH4oSElPWF9DU1I0X0FVRENMS0hJIHwgSElPWF9DU1I0X0FVRENMS1NFTCk7Ci0JaWYgKChpICYgMSkgPT0gMCkKLQkJKih1aW50ICopSElPWF9DU1I0X0FERFIgfD0gSElPWF9DU1I0X0FVRENMS0hJOwotCWkgPj49IDE7Ci0JKih1aW50ICopSElPWF9DU1I0X0FERFIgfD0gKGkgJiBISU9YX0NTUjRfQVVEQ0xLU0VMKTsKLQotCWV4cGFuZF9iYWwgPSAtc291bmQuc29mdC5zcGVlZDsKLX0KLQotc3RhdGljIGludCBDU19TZXRGb3JtYXQoaW50IGZvcm1hdCkKLXsKLQlpbnQgc2l6ZTsKLQotCXN3aXRjaCAoZm9ybWF0KSB7Ci0JY2FzZSBBRk1UX1FVRVJZOgotCQlyZXR1cm4gc291bmQuc29mdC5mb3JtYXQ7Ci0JY2FzZSBBRk1UX01VX0xBVzoKLQljYXNlIEFGTVRfQV9MQVc6Ci0JY2FzZSBBRk1UX1U4OgotCWNhc2UgQUZNVF9TODoKLQkJc2l6ZSA9IDg7Ci0JCWJyZWFrOwotCWNhc2UgQUZNVF9TMTZfQkU6Ci0JY2FzZSBBRk1UX1UxNl9CRToKLQljYXNlIEFGTVRfUzE2X0xFOgotCWNhc2UgQUZNVF9VMTZfTEU6Ci0JCXNpemUgPSAxNjsKLQkJYnJlYWs7Ci0JZGVmYXVsdDogLyogOi0pICovCi0JCXByaW50ayhLRVJOX0VSUiAiZG1hc291bmQ6IHVua25vd24gZm9ybWF0IDB4JXgsIHVzaW5nIEFGTVRfVThcbiIsCi0JCSAgICAgICBmb3JtYXQpOwotCQlzaXplID0gODsKLQkJZm9ybWF0ID0gQUZNVF9VODsKLQl9Ci0KLQlzb3VuZC5zb2Z0LmZvcm1hdCA9IGZvcm1hdDsKLQlzb3VuZC5zb2Z0LnNpemUgPSBzaXplOwotCWlmIChzb3VuZC5taW5EZXYgPT0gU05EX0RFVl9EU1ApIHsKLQkJc291bmQuZHNwLmZvcm1hdCA9IGZvcm1hdDsKLQkJc291bmQuZHNwLnNpemUgPSBzaXplOwotCX0KLQotCUNTX0luaXQoKTsKLQotCXJldHVybiBmb3JtYXQ7Ci19Ci0KLS8qIFZvbHVtZSBpcyB0aGUgYW1vdW50IG9mIGF0dGVudWF0aW9uIHdlIHRlbGwgdGhlIGNvZGVjIHRvIGltcG9zZQotICogb24gdGhlIG91dHB1dHMuICBUaGVyZSBhcmUgMzIgbGV2ZWxzLCB3aXRoIDAgdGhlICJsb3VkZXN0Ii4KLSAqLwotI2RlZmluZSBDU19WT0xVTUVfVE9fTUFTSyh4KQkoMzEgLSAoKCgoeCkgLSAxKSAqIDMxKSAvIDk5KSkKLSNkZWZpbmUgQ1NfTUFTS19UT19WT0xVTUUoeSkJKDEwMCAtICgoeSkgKiA5OSAvIDMxKSkKLQotc3RhdGljIGludCBjc19nZXRfdm9sdW1lKHVpbnQgcmVnKQotewotCWludCB2b2x1bWU7Ci0KLQl2b2x1bWUgPSBDU19NQVNLX1RPX1ZPTFVNRShDU19MQVRURU5fR0VUKHJlZykpOwotCXZvbHVtZSB8PSBDU19NQVNLX1RPX1ZPTFVNRShDU19SQVRURU5fR0VUKHJlZykpIDw8IDg7Ci0JcmV0dXJuIHZvbHVtZTsKLX0KLQotc3RhdGljIGludCBjc192b2x1bWVfc2V0dGVyKGludCB2b2x1bWUsIGludCBtdXRlKQotewotCXVpbnQgdGVtcGN0bDsKLQotCWlmIChtdXRlICYmIHZvbHVtZSA9PSAwKSB7Ci0JCXRlbXBjdGwgPSBjczQyMThfY29udHJvbCB8IENTX01VVEU7Ci0JfSBlbHNlIHsKLQkJdGVtcGN0bCA9IGNzNDIxOF9jb250cm9sICYgfkNTX01VVEU7Ci0JCXRlbXBjdGwgPSB0ZW1wY3RsICYgfihDU19MQVRURU4gfCBDU19SQVRURU4pOwotCQl0ZW1wY3RsIHw9IENTX0xBVFRFTl9TRVQoQ1NfVk9MVU1FX1RPX01BU0sodm9sdW1lICYgMHhmZikpOwotCQl0ZW1wY3RsIHw9IENTX1JBVFRFTl9TRVQoQ1NfVk9MVU1FX1RPX01BU0soKHZvbHVtZSA+PiA4KSAmIDB4ZmYpKTsKLQkJdm9sdW1lID0gY3NfZ2V0X3ZvbHVtZSh0ZW1wY3RsKTsKLQl9Ci0JaWYgKHRlbXBjdGwgIT0gY3M0MjE4X2NvbnRyb2wpIHsKLQkJY3M0MjE4X2N0bF93cml0ZSh0ZW1wY3RsKTsKLQl9Ci0JcmV0dXJuIHZvbHVtZTsKLX0KLQotCi0vKiBHYWluIGhhcyAxNiBzdGVwcyBmcm9tIDAgdG8gMTUuICBUaGVzZSBhcmUgaW4gMS41ZEIgaW5jcmVtZW50cyBmcm9tCi0gKiAwIChubyBnYWluKSB0byAyMi41IGRCLgotICovCi0jZGVmaW5lIENTX1JFQ0xFVkVMX1RPX0dBSU4odikgXAotCSgodikgPCAwID8gMCA6ICh2KSA+IDEwMCA/IDE1IDogKHYpICogMyAvIDIwKQotI2RlZmluZSBDU19HQUlOX1RPX1JFQ0xFVkVMKHYpICgoKHYpICogMjAgKyAyKSAvIDMpCi0KLXN0YXRpYyBpbnQgY3NfZ2V0X2dhaW4odWludCByZWcpCi17Ci0JaW50IGdhaW47Ci0KLQlnYWluID0gQ1NfR0FJTl9UT19SRUNMRVZFTChDU19MR0FJTl9HRVQocmVnKSk7Ci0JZ2FpbiB8PSBDU19HQUlOX1RPX1JFQ0xFVkVMKENTX1JHQUlOX0dFVChyZWcpKSA8PCA4OwotCXJldHVybiBnYWluOwotfQotCi1zdGF0aWMgaW50IGNzX3NldF9nYWluKGludCBnYWluKQotewotCXVpbnQgdGVtcGN0bDsKLQotCXRlbXBjdGwgPSBjczQyMThfY29udHJvbCAmIH4oQ1NfTEdBSU4gfCBDU19SR0FJTik7Ci0JdGVtcGN0bCB8PSBDU19MR0FJTl9TRVQoQ1NfUkVDTEVWRUxfVE9fR0FJTihnYWluICYgMHhmZikpOwotCXRlbXBjdGwgfD0gQ1NfUkdBSU5fU0VUKENTX1JFQ0xFVkVMX1RPX0dBSU4oKGdhaW4gPj4gOCkgJiAweGZmKSk7Ci0JZ2FpbiA9IGNzX2dldF9nYWluKHRlbXBjdGwpOwotCi0JaWYgKHRlbXBjdGwgIT0gY3M0MjE4X2NvbnRyb2wpIHsKLQkJY3M0MjE4X2N0bF93cml0ZSh0ZW1wY3RsKTsKLQl9Ci0JcmV0dXJuIGdhaW47Ci19Ci0KLXN0YXRpYyBpbnQgQ1NfU2V0Vm9sdW1lKGludCB2b2x1bWUpCi17Ci0JcmV0dXJuIGNzX3ZvbHVtZV9zZXR0ZXIodm9sdW1lLCBDU19NVVRFKTsKLX0KLQotc3RhdGljIHZvaWQgQ1NfUGxheSh2b2lkKQotewotCWludCBpLCBjb3VudDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXZvbGF0aWxlIGNiZF90CSpiZHA7Ci0Jdm9sYXRpbGUgY3BtOHh4X3QgKmNwOwotCi0JLyogUHJvdGVjdCBidWZmZXIgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY3M0MjE4X2xvY2ssIGZsYWdzKTsKLSNpZiAwCi0JaWYgKGF3YWNzX2JlZXBfc3RhdGUpIHsKLQkJLyogc291bmQgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIGJlZXBzICovCi0JCW91dF9sZTMyKCZhd2Fjc190eGRtYS0+Y29udHJvbCwgKFJVTnxQQVVTRXxGTFVTSHxXQUtFKSA8PCAxNik7Ci0JCW91dF9sZTMyKCZhd2Fjcy0+Y29udHJvbCwKLQkJCSAoaW5fbGUzMigmYXdhY3MtPmNvbnRyb2wpICYgfjB4MWYwMCkKLQkJCSB8IChhd2Fjc19yYXRlX2luZGV4IDw8IDgpKTsKLQkJb3V0X2xlMzIoJmF3YWNzLT5ieXRlc3dhcCwgc291bmQuaGFyZC5mb3JtYXQgIT0gQUZNVF9TMTZfQkUpOwotCQlvdXRfbGUzMigmYXdhY3NfdHhkbWEtPmNtZHB0ciwgdmlydF90b19idXMoJihhd2Fjc190eF9jbWRzWyhzcS5mcm9udCtzcS5hY3RpdmUpICUgc3EubWF4X2NvdW50XSkpKTsKLQotCQliZWVwX3BsYXlpbmcgPSAwOwotCQlhd2Fjc19iZWVwX3N0YXRlID0gMDsKLQl9Ci0jZW5kaWYKLQlpID0gc3EuZnJvbnQgKyBzcS5hY3RpdmU7Ci0JaWYgKGkgPj0gc3EubWF4X2NvdW50KQotCQlpIC09IHNxLm1heF9jb3VudDsKLQl3aGlsZSAoc3EuYWN0aXZlIDwgMiAmJiBzcS5hY3RpdmUgPCBzcS5jb3VudCkgewotCQljb3VudCA9IChzcS5jb3VudCA9PSBzcS5hY3RpdmUgKyAxKT9zcS5yZWFyX3NpemU6c3EuYmxvY2tfc2l6ZTsKLQkJaWYgKGNvdW50IDwgc3EuYmxvY2tfc2l6ZSAmJiAhc3Euc3luY2luZykKLQkJCS8qIGxhc3QgYmxvY2sgbm90IHlldCBmaWxsZWQsIGFuZCB3ZSdyZSBub3Qgc3luY2luZy4gKi8KLQkJCWJyZWFrOwotCi0JCWJkcCA9ICZ0eF9iYXNlW2ldOwotCQliZHAtPmNiZF9kYXRsZW4gPSBjb3VudDsKLQotCQlmbHVzaF9kY2FjaGVfcmFuZ2UoKHVsb25nKXNvdW5kX2J1ZmZlcnNbaV0sCi0JCQkJCSh1bG9uZykoc291bmRfYnVmZmVyc1tpXSArIGNvdW50KSk7Ci0KLQkJaWYgKCsraSA+PSBzcS5tYXhfY291bnQpCi0JCQlpID0gMDsKLQotCQlpZiAoc3EuYWN0aXZlID09IDApIHsKLQkJCS8qIFRoZSBTTUMgZG9lcyBub3QgbG9hZCBpdHMgZmlmbyB1bnRpbCB0aGUgZmlyc3QKLQkJCSAqIFRETSBmcmFtZSBwdWxzZSwgc28gdGhlIHRyYW5zbWl0IGRhdGEgZ2V0cyBzaGlmdGVkCi0JCQkgKiBieSBvbmUgd29yZC4gIFRvIGNvbXBlbnNhdGUgZm9yIHRoaXMsIHdlIGluY29ycmVjdGx5Ci0JCQkgKiB0cmFuc21pdCB0aGUgZmlyc3QgYnVmZmVyIGFuZCBzaG9ydGVuIGl0IGJ5IG9uZQotCQkJICogd29yZC4gIFN1YnNlcXVlbnQgYnVmZmVycyBhcmUgdGhlbiBhbGlnbmVkIHByb3Blcmx5LgotCQkJICovCi0JCQliZHAtPmNiZF9kYXRsZW4gLT0gMjsKLQotCQkJLyogU3RhcnQgdXAgdGhlIFNNQyBUcmFuc21pdHRlci4KLQkJCSovCi0JCQljcCA9IGNwbXA7Ci0JCQljcC0+Y3Bfc21jWzFdLnNtY19zbWNtciB8PSBTTUNNUl9URU47Ci0JCQljcC0+Y3BfY3BjciA9IG1rX2NyX2NtZChDUE1fQ1JfQ0hfU01DMiwKLQkJCQkJQ1BNX0NSX1JFU1RBUlRfVFgpIHwgQ1BNX0NSX0ZMRzsKLQkJCXdoaWxlIChjcC0+Y3BfY3BjciAmIENQTV9DUl9GTEcpOwotCQl9Ci0KLQkJLyogQnVmZmVyIGlzIHJlYWR5IG5vdy4KLQkJKi8KLQkJYmRwLT5jYmRfc2MgfD0gQkRfU0NfUkVBRFk7Ci0KLQkJKytzcS5hY3RpdmU7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNzNDIxOF9sb2NrLCBmbGFncyk7Ci19Ci0KLQotc3RhdGljIHZvaWQgQ1NfUmVjb3JkKHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl2b2xhdGlsZSBzbWNfdAkJKnNwOwotCi0JaWYgKHJlYWRfc3EuYWN0aXZlKQotCQlyZXR1cm47Ci0KLQkvKiBQcm90ZWN0IGJ1ZmZlciAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZjczQyMThfbG9jaywgZmxhZ3MpOwotCi0JLyogVGhpcyBpcyBhbGwgd2UgaGF2ZSB0byBkby4uLi4uLkp1c3Qgc3RhcnQgaXQgdXAuCi0JKi8KLQlzcCA9ICZjcG1wLT5jcF9zbWNbMV07Ci0Jc3AtPnNtY19zbWNtciB8PSBTTUNNUl9SRU47Ci0KLQlyZWFkX3NxLmFjdGl2ZSA9IDE7Ci0KLSAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3M0MjE4X2xvY2ssIGZsYWdzKTsKLX0KLQotCi1zdGF0aWMgdm9pZAotY3M0MjE4X3RkbV90eF9pbnRyKHZvaWQgKmRldmlkKQotewotCWludCBpID0gc3EuZnJvbnQ7Ci0Jdm9sYXRpbGUgY2JkX3QgKmJkcDsKLQotCXdoaWxlIChzcS5hY3RpdmUgPiAwKSB7Ci0JCWJkcCA9ICZ0eF9iYXNlW2ldOwotCQlpZiAoYmRwLT5jYmRfc2MgJiBCRF9TQ19SRUFEWSkKLQkJCWJyZWFrOwkvKiB0aGlzIGZyYW1lIGlzIHN0aWxsIGdvaW5nICovCi0JCS0tc3EuY291bnQ7Ci0JCS0tc3EuYWN0aXZlOwotCQlpZiAoKytpID49IHNxLm1heF9jb3VudCkKLQkJCWkgPSAwOwotCX0KLQlpZiAoaSAhPSBzcS5mcm9udCkKLQkJV0FLRV9VUChzcS5hY3Rpb25fcXVldWUpOwotCXNxLmZyb250ID0gaTsKLQotCUNTX1BsYXkoKTsKLQotCWlmICghc3EuYWN0aXZlKQotCQlXQUtFX1VQKHNxLnN5bmNfcXVldWUpOwotfQotCi0KLXN0YXRpYyB2b2lkCi1jczQyMThfdGRtX3J4X2ludHIodm9pZCAqZGV2aWQpCi17Ci0KLQkvKiBXZSB3YW50IHRvIGJsb3cgJ2VtIG9mZiB3aGVuIHNodXR0aW5nIGRvd24uCi0JKi8KLQlpZiAocmVhZF9zcS5hY3RpdmUgPT0gMCkKLQkJcmV0dXJuOwotCi0JLyogQ2hlY2sgbXVsdGlwbGUgYnVmZmVycyBpbiBjYXNlIHdlIHdlcmUgaGVsZCBvZmYgZnJvbQotCSAqIGludGVycnVwdCBwcm9jZXNzaW5nIGZvciBhIGxvbmcgdGltZS4gIEdlZXplLCBJIHJlYWxseSBob3BlCi0JICogdGhpcyBkb2Vzbid0IGhhcHBlbi4KLQkgKi8KLQl3aGlsZSAoKHJ4X2Jhc2VbcmVhZF9zcS5yZWFyXS5jYmRfc2MgJiBCRF9TQ19FTVBUWSkgPT0gMCkgewotCi0JCS8qIEludmFsaWRhdGUgdGhlIGRhdGEgY2FjaGUgcmFuZ2UgZm9yIHRoaXMgYnVmZmVyLgotCQkqLwotCQlpbnZhbGlkYXRlX2RjYWNoZV9yYW5nZSgKLQkJICAgICh1aW50KShzb3VuZF9yZWFkX2J1ZmZlcnNbcmVhZF9zcS5yZWFyXSksCi0JCSAgICAodWludCkoc291bmRfcmVhZF9idWZmZXJzW3JlYWRfc3EucmVhcl0gKyByZWFkX3NxLmJsb2NrX3NpemUpKTsKLQotCQkvKiBNYWtlIGJ1ZmZlciBhdmFpbGFibGUgYWdhaW4gYW5kIG1vdmUgb24uCi0JCSovCi0JCXJ4X2Jhc2VbcmVhZF9zcS5yZWFyXS5jYmRfc2MgfD0gQkRfU0NfRU1QVFk7Ci0JCXJlYWRfc3EucmVhcisrOwotCi0JCS8qIFdyYXAgdGhlIGJ1ZmZlciByaW5nLgotCQkqLwotCQlpZiAocmVhZF9zcS5yZWFyID49IHJlYWRfc3EubWF4X2FjdGl2ZSkKLQkJCXJlYWRfc3EucmVhciA9IDA7Ci0KLQkJLyogSWYgd2UgaGF2ZSBjYXVnaHQgdXAgdG8gdGhlIGZyb250IGJ1ZmZlciwgYnVtcCBpdC4KLQkJICogVGhpcyB3aWxsIGNhdXNlIHdlaXJkIChidXQgbm90IGZhdGFsKSByZXN1bHRzIGlmIHRoZQotCQkgKiByZWFkIGxvb3AgaXMgY3VycmVudGx5IHVzaW5nIHRoaXMgYnVmZmVyLiAgVGhlIHVzZXIgaXMKLQkJICogYmVoaW5kIGluIHRoaXMgY2FzZSBhbnl3YXksIHNvIHdlaXJkIHRoaW5ncyBhcmUgZ29pbmcKLQkJICogdG8gaGFwcGVuLgotCQkgKi8KLQkJaWYgKHJlYWRfc3EucmVhciA9PSByZWFkX3NxLmZyb250KSB7Ci0JCQlyZWFkX3NxLmZyb250Kys7Ci0JCQlpZiAocmVhZF9zcS5mcm9udCA+PSByZWFkX3NxLm1heF9hY3RpdmUpCi0JCQkJcmVhZF9zcS5mcm9udCA9IDA7Ci0JCX0KLQl9Ci0KLQlXQUtFX1VQKHJlYWRfc3EuYWN0aW9uX3F1ZXVlKTsKLX0KLQotc3RhdGljIHZvaWQgY3Nfbm9zb3VuZCh1bnNpZ25lZCBsb25nIHh4KQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkvKiBub3Qgc3VyZSBpZiB0aGlzIGlzIG5lZWRlZCwgc2luY2UgaGFyZHdhcmUgY29tbWFuZCBpcyAjaWYgMCdkICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNzNDIxOF9sb2NrLCBmbGFncyk7Ci0JaWYgKGJlZXBfcGxheWluZykgewotI2lmIDAKLQkJc3RfbGUxNigmYmVlcF9kYmRtYV9jbWQtPmNvbW1hbmQsIERCRE1BX1NUT1ApOwotI2VuZGlmCi0JCWJlZXBfcGxheWluZyA9IDA7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNzNDIxOF9sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyBERUZJTkVfVElNRVIoYmVlcF90aW1lciwgY3Nfbm9zb3VuZCwgMCwgMCk7Ci0KLXN0YXRpYyB2b2lkIGNzX21rc291bmQodW5zaWduZWQgaW50IGh6LCB1bnNpZ25lZCBpbnQgdGlja3MpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgYmVlcF9zcGVlZCA9IEJFRVBfU1BFRUQ7Ci0JaW50IHNyYXRlID0gY3M0MjE4X2ZyZXFzW2JlZXBfc3BlZWRdOwotCWludCBwZXJpb2QsIG5jeWNsZXMsIG5zYW1wbGVzOwotCWludCBpLCBqLCBmOwotCXNob3J0ICpwOwotCXN0YXRpYyBpbnQgYmVlcF9oel9jYWNoZTsKLQlzdGF0aWMgaW50IGJlZXBfbnNhbXBsZXNfY2FjaGU7Ci0Jc3RhdGljIGludCBiZWVwX3ZvbHVtZV9jYWNoZTsKLQotCWlmIChoeiA8PSBzcmF0ZSAvIEJFRVBfQlVGTEVOIHx8IGh6ID4gc3JhdGUgLyAyKSB7Ci0jaWYgMQotCQkvKiB0aGlzIGlzIGEgaGFjayBmb3IgYnJva2VuIFggc2VydmVyIGNvZGUgKi8KLQkJaHogPSA3NTA7Ci0JCXRpY2tzID0gMTI7Ci0jZWxzZQotCQkvKiBjYW5jZWwgYmVlcCBjdXJyZW50bHkgcGxheWluZyAqLwotCQlhd2Fjc19ub3NvdW5kKDApOwotCQlyZXR1cm47Ci0jZW5kaWYKLQl9Ci0JLyogbG9jayB3aGlsZSBtb2RpZnlpbmcgYmVlcF90aW1lciAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZjczQyMThfbG9jaywgZmxhZ3MpOwotCWRlbF90aW1lcigmYmVlcF90aW1lcik7Ci0JaWYgKHRpY2tzKSB7Ci0JCWJlZXBfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyB0aWNrczsKLQkJYWRkX3RpbWVyKCZiZWVwX3RpbWVyKTsKLQl9Ci0JaWYgKGJlZXBfcGxheWluZyB8fCBzcS5hY3RpdmUgfHwgYmVlcF9idWYgPT0gTlVMTCkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjczQyMThfbG9jaywgZmxhZ3MpOwotCQlyZXR1cm47CQkvKiB0b28gaGFyZCwgc29ycnkgOi0oICovCi0JfQotCWJlZXBfcGxheWluZyA9IDE7Ci0jaWYgMAotCXN0X2xlMTYoJmJlZXBfZGJkbWFfY21kLT5jb21tYW5kLCBPVVRQVVRfTU9SRSArIEJSX0FMV0FZUyk7Ci0jZW5kaWYKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjczQyMThfbG9jaywgZmxhZ3MpOwotCi0JaWYgKGh6ID09IGJlZXBfaHpfY2FjaGUgJiYgYmVlcF92b2x1bWUgPT0gYmVlcF92b2x1bWVfY2FjaGUpIHsKLQkJbnNhbXBsZXMgPSBiZWVwX25zYW1wbGVzX2NhY2hlOwotCX0gZWxzZSB7Ci0JCXBlcmlvZCA9IHNyYXRlICogMjU2IC8gaHo7CS8qIGZpeGVkIHBvaW50ICovCi0JCW5jeWNsZXMgPSBCRUVQX0JVRkxFTiAqIDI1NiAvIHBlcmlvZDsKLQkJbnNhbXBsZXMgPSAocGVyaW9kICogbmN5Y2xlcykgPj4gODsKLQkJZiA9IG5jeWNsZXMgKiA2NTUzNiAvIG5zYW1wbGVzOwotCQlqID0gMDsKLQkJcCA9IGJlZXBfYnVmOwotCQlmb3IgKGkgPSAwOyBpIDwgbnNhbXBsZXM7ICsraSwgcCArPSAyKSB7Ci0JCQlwWzBdID0gcFsxXSA9IGJlZXBfd2Zvcm1baiA+PiA4XSAqIGJlZXBfdm9sdW1lOwotCQkJaiA9IChqICsgZikgJiAweGZmZmY7Ci0JCX0KLQkJYmVlcF9oel9jYWNoZSA9IGh6OwotCQliZWVwX3ZvbHVtZV9jYWNoZSA9IGJlZXBfdm9sdW1lOwotCQliZWVwX25zYW1wbGVzX2NhY2hlID0gbnNhbXBsZXM7Ci0JfQotCi0jaWYgMAotCXN0X2xlMTYoJmJlZXBfZGJkbWFfY21kLT5yZXFfY291bnQsIG5zYW1wbGVzKjQpOwotCXN0X2xlMTYoJmJlZXBfZGJkbWFfY21kLT54ZmVyX3N0YXR1cywgMCk7Ci0Jc3RfbGUzMigmYmVlcF9kYmRtYV9jbWQtPmNtZF9kZXAsIHZpcnRfdG9fYnVzKGJlZXBfZGJkbWFfY21kKSk7Ci0Jc3RfbGUzMigmYmVlcF9kYmRtYV9jbWQtPnBoeV9hZGRyLCB2aXJ0X3RvX2J1cyhiZWVwX2J1ZikpOwotCWF3YWNzX2JlZXBfc3RhdGUgPSAxOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNzNDIxOF9sb2NrLCBmbGFncyk7Ci0JaWYgKGJlZXBfcGxheWluZykgewkvKiBpLmUuIGhhdmVuJ3QgYmVlbiB0ZXJtaW5hdGVkIGFscmVhZHkgKi8KLQkJb3V0X2xlMzIoJmF3YWNzX3R4ZG1hLT5jb250cm9sLCAoUlVOfFdBS0V8RkxVU0h8UEFVU0UpIDw8IDE2KTsKLQkJb3V0X2xlMzIoJmF3YWNzLT5jb250cm9sLAotCQkJIChpbl9sZTMyKCZhd2Fjcy0+Y29udHJvbCkgJiB+MHgxZjAwKQotCQkJIHwgKGJlZXBfc3BlZWQgPDwgOCkpOwotCQlvdXRfbGUzMigmYXdhY3MtPmJ5dGVzd2FwLCAwKTsKLQkJb3V0X2xlMzIoJmF3YWNzX3R4ZG1hLT5jbWRwdHIsIHZpcnRfdG9fYnVzKGJlZXBfZGJkbWFfY21kKSk7Ci0JCW91dF9sZTMyKCZhd2Fjc190eGRtYS0+Y29udHJvbCwgUlVOIHwgKFJVTiA8PCAxNikpOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjczQyMThfbG9jaywgZmxhZ3MpOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBNQUNISU5FIG1hY2hfY3M0MjE4ID0gewotCS5vd25lciA9CVRISVNfTU9EVUxFLAotCS5uYW1lID0JCSJISU9YIENTNDIxOCIsCi0JLm5hbWUyID0JIkJ1aWx0LWluIFNvdW5kIiwKLQkuZG1hX2FsbG9jID0JQ1NfQWxsb2MsCi0JLmRtYV9mcmVlID0JQ1NfRnJlZSwKLQkuaXJxaW5pdCA9CUNTX0lycUluaXQsCi0jaWZkZWYgTU9EVUxFCi0JLmlycWNsZWFudXAgPQlDU19JcnFDbGVhbnVwLAotI2VuZGlmIC8qIE1PRFVMRSAqLwotCS5pbml0ID0JCUNTX0luaXQsCi0JLnNpbGVuY2UgPQlDU19TaWxlbmNlLAotCS5zZXRGb3JtYXQgPQlDU19TZXRGb3JtYXQsCi0JLnNldFZvbHVtZSA9CUNTX1NldFZvbHVtZSwKLQkucGxheSA9CQlDU19QbGF5Ci19OwotCi0KLS8qKiogTWlkIGxldmVsIHN0dWZmICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1zdGF0aWMgdm9pZCBzb3VuZF9zaWxlbmNlKHZvaWQpCi17Ci0JLyogdXBkYXRlIGhhcmR3YXJlIHNldHRpbmdzIG9uZSBtb3JlICovCi0JKCpzb3VuZC5tYWNoLmluaXQpKCk7Ci0KLQkoKnNvdW5kLm1hY2guc2lsZW5jZSkoKTsKLX0KLQotCi1zdGF0aWMgdm9pZCBzb3VuZF9pbml0KHZvaWQpCi17Ci0JKCpzb3VuZC5tYWNoLmluaXQpKCk7Ci19Ci0KLQotc3RhdGljIGludCBzb3VuZF9zZXRfZm9ybWF0KGludCBmb3JtYXQpCi17Ci0JcmV0dXJuKCpzb3VuZC5tYWNoLnNldEZvcm1hdCkoZm9ybWF0KTsKLX0KLQotCi1zdGF0aWMgaW50IHNvdW5kX3NldF9zcGVlZChpbnQgc3BlZWQpCi17Ci0JaWYgKHNwZWVkIDwgMCkKLQkJcmV0dXJuKHNvdW5kLnNvZnQuc3BlZWQpOwotCi0Jc291bmQuc29mdC5zcGVlZCA9IHNwZWVkOwotCSgqc291bmQubWFjaC5pbml0KSgpOwotCWlmIChzb3VuZC5taW5EZXYgPT0gU05EX0RFVl9EU1ApCi0JCXNvdW5kLmRzcC5zcGVlZCA9IHNvdW5kLnNvZnQuc3BlZWQ7Ci0KLQlyZXR1cm4oc291bmQuc29mdC5zcGVlZCk7Ci19Ci0KLQotc3RhdGljIGludCBzb3VuZF9zZXRfc3RlcmVvKGludCBzdGVyZW8pCi17Ci0JaWYgKHN0ZXJlbyA8IDApCi0JCXJldHVybihzb3VuZC5zb2Z0LnN0ZXJlbyk7Ci0KLQlzdGVyZW8gPSAhIXN0ZXJlbzsgICAgLyogc2hvdWxkIGJlIDAgb3IgMSBub3cgKi8KLQotCXNvdW5kLnNvZnQuc3RlcmVvID0gc3RlcmVvOwotCWlmIChzb3VuZC5taW5EZXYgPT0gU05EX0RFVl9EU1ApCi0JCXNvdW5kLmRzcC5zdGVyZW8gPSBzdGVyZW87Ci0JKCpzb3VuZC5tYWNoLmluaXQpKCk7Ci0KLQlyZXR1cm4oc3RlcmVvKTsKLX0KLQotCi1zdGF0aWMgaW50IHNvdW5kX3NldF92b2x1bWUoaW50IHZvbHVtZSkKLXsKLQlyZXR1cm4oKnNvdW5kLm1hY2guc2V0Vm9sdW1lKSh2b2x1bWUpOwotfQotCi1zdGF0aWMgc3NpemVfdCBzb3VuZF9jb3B5X3RyYW5zbGF0ZShjb25zdCB1X2NoYXIgKnVzZXJQdHIsCi0JCQkJICAgIHNpemVfdCB1c2VyQ291bnQsCi0JCQkJICAgIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCi0JCQkJICAgIHNzaXplX3QgZnJhbWVMZWZ0KQotewotCXNzaXplX3QgKCpjdF9mdW5jKShjb25zdCB1X2NoYXIgKiwgc2l6ZV90LCB1X2NoYXIgKiwgc3NpemVfdCAqLCBzc2l6ZV90KSA9IE5VTEw7Ci0KLQlzd2l0Y2ggKHNvdW5kLnNvZnQuZm9ybWF0KSB7Ci0JY2FzZSBBRk1UX01VX0xBVzoKLQkJY3RfZnVuYyA9IHNvdW5kLnRyYW5zX3dyaXRlLT5jdF91bGF3OwotCQlicmVhazsKLQljYXNlIEFGTVRfQV9MQVc6Ci0JCWN0X2Z1bmMgPSBzb3VuZC50cmFuc193cml0ZS0+Y3RfYWxhdzsKLQkJYnJlYWs7Ci0JY2FzZSBBRk1UX1M4OgotCQljdF9mdW5jID0gc291bmQudHJhbnNfd3JpdGUtPmN0X3M4OwotCQlicmVhazsKLQljYXNlIEFGTVRfVTg6Ci0JCWN0X2Z1bmMgPSBzb3VuZC50cmFuc193cml0ZS0+Y3RfdTg7Ci0JCWJyZWFrOwotCWNhc2UgQUZNVF9TMTZfQkU6Ci0JCWN0X2Z1bmMgPSBzb3VuZC50cmFuc193cml0ZS0+Y3RfczE2YmU7Ci0JCWJyZWFrOwotCWNhc2UgQUZNVF9VMTZfQkU6Ci0JCWN0X2Z1bmMgPSBzb3VuZC50cmFuc193cml0ZS0+Y3RfdTE2YmU7Ci0JCWJyZWFrOwotCWNhc2UgQUZNVF9TMTZfTEU6Ci0JCWN0X2Z1bmMgPSBzb3VuZC50cmFuc193cml0ZS0+Y3RfczE2bGU7Ci0JCWJyZWFrOwotCWNhc2UgQUZNVF9VMTZfTEU6Ci0JCWN0X2Z1bmMgPSBzb3VuZC50cmFuc193cml0ZS0+Y3RfdTE2bGU7Ci0JCWJyZWFrOwotCX0KLQlpZiAoY3RfZnVuYykKLQkJcmV0dXJuIGN0X2Z1bmModXNlclB0ciwgdXNlckNvdW50LCBmcmFtZSwgZnJhbWVVc2VkLCBmcmFtZUxlZnQpOwotCWVsc2UKLQkJcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHNvdW5kX2NvcHlfdHJhbnNsYXRlX3JlYWQoY29uc3QgdV9jaGFyICp1c2VyUHRyLAotCQkJCSAgICBzaXplX3QgdXNlckNvdW50LAotCQkJCSAgICB1X2NoYXIgZnJhbWVbXSwgc3NpemVfdCAqZnJhbWVVc2VkLAotCQkJCSAgICBzc2l6ZV90IGZyYW1lTGVmdCkKLXsKLQlzc2l6ZV90ICgqY3RfZnVuYykoY29uc3QgdV9jaGFyICosIHNpemVfdCwgdV9jaGFyICosIHNzaXplX3QgKiwgc3NpemVfdCkgPSBOVUxMOwotCi0Jc3dpdGNoIChzb3VuZC5zb2Z0LmZvcm1hdCkgewotCWNhc2UgQUZNVF9NVV9MQVc6Ci0JCWN0X2Z1bmMgPSBzb3VuZC50cmFuc19yZWFkLT5jdF91bGF3OwotCQlicmVhazsKLQljYXNlIEFGTVRfQV9MQVc6Ci0JCWN0X2Z1bmMgPSBzb3VuZC50cmFuc19yZWFkLT5jdF9hbGF3OwotCQlicmVhazsKLQljYXNlIEFGTVRfUzg6Ci0JCWN0X2Z1bmMgPSBzb3VuZC50cmFuc19yZWFkLT5jdF9zODsKLQkJYnJlYWs7Ci0JY2FzZSBBRk1UX1U4OgotCQljdF9mdW5jID0gc291bmQudHJhbnNfcmVhZC0+Y3RfdTg7Ci0JCWJyZWFrOwotCWNhc2UgQUZNVF9TMTZfQkU6Ci0JCWN0X2Z1bmMgPSBzb3VuZC50cmFuc19yZWFkLT5jdF9zMTZiZTsKLQkJYnJlYWs7Ci0JY2FzZSBBRk1UX1UxNl9CRToKLQkJY3RfZnVuYyA9IHNvdW5kLnRyYW5zX3JlYWQtPmN0X3UxNmJlOwotCQlicmVhazsKLQljYXNlIEFGTVRfUzE2X0xFOgotCQljdF9mdW5jID0gc291bmQudHJhbnNfcmVhZC0+Y3RfczE2bGU7Ci0JCWJyZWFrOwotCWNhc2UgQUZNVF9VMTZfTEU6Ci0JCWN0X2Z1bmMgPSBzb3VuZC50cmFuc19yZWFkLT5jdF91MTZsZTsKLQkJYnJlYWs7Ci0JfQotCWlmIChjdF9mdW5jKQotCQlyZXR1cm4gY3RfZnVuYyh1c2VyUHRyLCB1c2VyQ291bnQsIGZyYW1lLCBmcmFtZVVzZWQsIGZyYW1lTGVmdCk7Ci0JZWxzZQotCQlyZXR1cm4gMDsKLX0KLQotCi0vKgotICogL2Rldi9taXhlciBhYnN0cmFjdGlvbgotICovCi0KLXN0YXRpYyBpbnQgbWl4ZXJfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQltaXhlci5idXN5ID0gMTsKLQlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Ci19Ci0KLQotc3RhdGljIGludCBtaXhlcl9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCW1peGVyLmJ1c3kgPSAwOwotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpbnQgbWl4ZXJfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVfaW50IGNtZCwKLQkJICAgICAgIHVfbG9uZyBhcmcpCi17Ci0JaW50IGRhdGE7Ci0JdWludCB0bXBjczsKLQotCWlmIChfU0lPQ19ESVIoY21kKSAmIF9TSU9DX1dSSVRFKQotCSAgICBtaXhlci5tb2RpZnlfY291bnRlcisrOwotCWlmIChjbWQgPT0gT1NTX0dFVFZFUlNJT04pCi0JICAgIHJldHVybiBJT0NUTF9PVVQoYXJnLCBTT1VORF9WRVJTSU9OKTsKLQlzd2l0Y2ggKGNtZCkgewotCQljYXNlIFNPVU5EX01JWEVSX0lORk86IHsKLQkJICAgIG1peGVyX2luZm8gaW5mbzsKLQkJICAgIHN0cmxjcHkoaW5mby5pZCwgIkNTNDIxOF9URE0iLCBzaXplb2YoaW5mby5pZCkpOwotCQkgICAgc3RybGNweShpbmZvLm5hbWUsICJDUzQyMThfVERNIiwgc2l6ZW9mKGluZm8ubmFtZSkpOwotCQkgICAgaW5mby5uYW1lW3NpemVvZihpbmZvLm5hbWUpLTFdID0gMDsKLQkJICAgIGluZm8ubW9kaWZ5X2NvdW50ZXIgPSBtaXhlci5tb2RpZnlfY291bnRlcjsKLQkJICAgIGlmIChjb3B5X3RvX3VzZXIoKGludCAqKWFyZywgJmluZm8sIHNpemVvZihpbmZvKSkpCi0JCSAgICAJCXJldHVybiAtRUZBVUxUOwotCQkgICAgcmV0dXJuIDA7Ci0JCX0KLQkJY2FzZSBTT1VORF9NSVhFUl9SRUFEX0RFVk1BU0s6Ci0JCQlkYXRhID0gU09VTkRfTUFTS19WT0xVTUUgfCBTT1VORF9NQVNLX0xJTkUKLQkJCQl8IFNPVU5EX01BU0tfTUlDIHwgU09VTkRfTUFTS19SRUNMRVYKLQkJCQl8IFNPVU5EX01BU0tfQUxUUENNOwotCQkJcmV0dXJuIElPQ1RMX09VVChhcmcsIGRhdGEpOwotCQljYXNlIFNPVU5EX01JWEVSX1JFQURfUkVDTUFTSzoKLQkJCWRhdGEgPSBTT1VORF9NQVNLX0xJTkUgfCBTT1VORF9NQVNLX01JQzsKLQkJCXJldHVybiBJT0NUTF9PVVQoYXJnLCBkYXRhKTsKLQkJY2FzZSBTT1VORF9NSVhFUl9SRUFEX1JFQ1NSQzoKLQkJCWlmIChjczQyMThfY29udHJvbCAmIENTX0RPMSkKLQkJCQlkYXRhID0gU09VTkRfTUFTS19MSU5FOwotCQkJZWxzZQotCQkJCWRhdGEgPSBTT1VORF9NQVNLX01JQzsKLQkJCXJldHVybiBJT0NUTF9PVVQoYXJnLCBkYXRhKTsKLQkJY2FzZSBTT1VORF9NSVhFUl9XUklURV9SRUNTUkM6Ci0JCQlJT0NUTF9JTihhcmcsIGRhdGEpOwotCQkJZGF0YSAmPSAoU09VTkRfTUFTS19MSU5FIHwgU09VTkRfTUFTS19NSUMpOwotCQkJaWYgKGRhdGEgJiBTT1VORF9NQVNLX0xJTkUpCi0JCQkJdG1wY3MgPSBjczQyMThfY29udHJvbCB8Ci0JCQkJCQkoQ1NfSVNMIHwgQ1NfSVNSIHwgQ1NfRE8xKTsKLQkJCWlmIChkYXRhICYgU09VTkRfTUFTS19NSUMpCi0JCQkJdG1wY3MgPSBjczQyMThfY29udHJvbCAmCi0JCQkJCQl+KENTX0lTTCB8IENTX0lTUiB8IENTX0RPMSk7Ci0JCQlpZiAodG1wY3MgIT0gY3M0MjE4X2NvbnRyb2wpCi0JCQkJY3M0MjE4X2N0bF93cml0ZSh0bXBjcyk7Ci0JCQlyZXR1cm4gSU9DVExfT1VUKGFyZywgZGF0YSk7Ci0JCWNhc2UgU09VTkRfTUlYRVJfUkVBRF9TVEVSRU9ERVZTOgotCQkJZGF0YSA9IFNPVU5EX01BU0tfVk9MVU1FIHwgU09VTkRfTUFTS19SRUNMRVY7Ci0JCQlyZXR1cm4gSU9DVExfT1VUKGFyZywgZGF0YSk7Ci0JCWNhc2UgU09VTkRfTUlYRVJfUkVBRF9DQVBTOgotCQkJcmV0dXJuIElPQ1RMX09VVChhcmcsIDApOwotCQljYXNlIFNPVU5EX01JWEVSX1JFQURfVk9MVU1FOgotCQkJZGF0YSA9IChjczQyMThfY29udHJvbCAmIENTX01VVEUpPyAwOgotCQkJCWNzX2dldF92b2x1bWUoY3M0MjE4X2NvbnRyb2wpOwotCQkJcmV0dXJuIElPQ1RMX09VVChhcmcsIGRhdGEpOwotCQljYXNlIFNPVU5EX01JWEVSX1dSSVRFX1ZPTFVNRToKLQkJCUlPQ1RMX0lOKGFyZywgZGF0YSk7Ci0JCQlyZXR1cm4gSU9DVExfT1VUKGFyZywgc291bmRfc2V0X3ZvbHVtZShkYXRhKSk7Ci0JCWNhc2UgU09VTkRfTUlYRVJfV1JJVEVfQUxUUENNOgkvKiByZWFsbHkgYmVsbCB2b2x1bWUgKi8KLQkJCUlPQ1RMX0lOKGFyZywgZGF0YSk7Ci0JCQliZWVwX3ZvbHVtZSA9IGRhdGEgJiAweGZmOwotCQkJLyogZmFsbCB0aHJvdWdoICovCi0JCWNhc2UgU09VTkRfTUlYRVJfUkVBRF9BTFRQQ006Ci0JCQlyZXR1cm4gSU9DVExfT1VUKGFyZywgYmVlcF92b2x1bWUpOwotCQljYXNlIFNPVU5EX01JWEVSX1dSSVRFX1JFQ0xFVjoKLQkJCUlPQ1RMX0lOKGFyZywgZGF0YSk7Ci0JCQlkYXRhID0gY3Nfc2V0X2dhaW4oZGF0YSk7Ci0JCQlyZXR1cm4gSU9DVExfT1VUKGFyZywgZGF0YSk7Ci0JCWNhc2UgU09VTkRfTUlYRVJfUkVBRF9SRUNMRVY6Ci0JCQlkYXRhID0gY3NfZ2V0X2dhaW4oY3M0MjE4X2NvbnRyb2wpOwotCQkJcmV0dXJuIElPQ1RMX09VVChhcmcsIGRhdGEpOwotCX0KLQotCXJldHVybiAtRUlOVkFMOwotfQotCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG1peGVyX2ZvcHMgPQotewotCS5vd25lciA9CVRISVNfTU9EVUxFLAotCS5sbHNlZWsgPQlzb3VuZF9sc2VlaywKLQkuaW9jdGwgPQltaXhlcl9pb2N0bCwKLQkub3BlbiA9CQltaXhlcl9vcGVuLAotCS5yZWxlYXNlID0JbWl4ZXJfcmVsZWFzZSwKLX07Ci0KLQotc3RhdGljIHZvaWQgX19pbml0IG1peGVyX2luaXQodm9pZCkKLXsKLQltaXhlcl91bml0ID0gcmVnaXN0ZXJfc291bmRfbWl4ZXIoJm1peGVyX2ZvcHMsIC0xKTsKLQlpZiAobWl4ZXJfdW5pdCA8IDApCi0JCXJldHVybjsKLQotCW1peGVyLmJ1c3kgPSAwOwotCXNvdW5kLnRyZWJsZSA9IDA7Ci0Jc291bmQuYmFzcyA9IDA7Ci0KLQkvKiBTZXQgTGluZSBpbnB1dCwgbm8gZ2Fpbiwgbm8gYXR0ZW51YXRpb24uCi0JKi8KLQljczQyMThfY29udHJvbCA9IENTX0lTTCB8IENTX0lTUiB8IENTX0RPMTsKLQljczQyMThfY29udHJvbCB8PSBDU19MR0FJTl9TRVQoMCkgfCBDU19SR0FJTl9TRVQoMCk7Ci0JY3M0MjE4X2NvbnRyb2wgfD0gQ1NfTEFUVEVOX1NFVCgwKSB8IENTX1JBVFRFTl9TRVQoMCk7Ci0JY3M0MjE4X2N0bF93cml0ZShjczQyMThfY29udHJvbCk7Ci19Ci0KLQotLyoKLSAqIFNvdW5kIHF1ZXVlIHN0dWZmLCB0aGUgaGVhcnQgb2YgdGhlIGRyaXZlcgotICovCi0KLQotc3RhdGljIGludCBzcV9hbGxvY2F0ZV9idWZmZXJzKHZvaWQpCi17Ci0JaW50IGk7Ci0KLQlpZiAoc291bmRfYnVmZmVycykKLQkJcmV0dXJuIDA7Ci0Jc291bmRfYnVmZmVycyA9IGttYWxsb2MgKG51bUJ1ZnMgKiBzaXplb2YoY2hhciAqKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFzb3VuZF9idWZmZXJzKQotCQlyZXR1cm4gLUVOT01FTTsKLQlmb3IgKGkgPSAwOyBpIDwgbnVtQnVmczsgaSsrKSB7Ci0JCXNvdW5kX2J1ZmZlcnNbaV0gPSBzb3VuZC5tYWNoLmRtYV9hbGxvYyAoYnVmU2l6ZSA8PCAxMCwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghc291bmRfYnVmZmVyc1tpXSkgewotCQkJd2hpbGUgKGktLSkKLQkJCQlzb3VuZC5tYWNoLmRtYV9mcmVlIChzb3VuZF9idWZmZXJzW2ldLCBidWZTaXplIDw8IDEwKTsKLQkJCWtmcmVlIChzb3VuZF9idWZmZXJzKTsKLQkJCXNvdW5kX2J1ZmZlcnMgPSAwOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIHZvaWQgc3FfcmVsZWFzZV9idWZmZXJzKHZvaWQpCi17Ci0JaW50IGk7Ci0KLQlpZiAoc291bmRfYnVmZmVycykgewotCQlmb3IgKGkgPSAwOyBpIDwgbnVtQnVmczsgaSsrKQotCQkJc291bmQubWFjaC5kbWFfZnJlZSAoc291bmRfYnVmZmVyc1tpXSwgYnVmU2l6ZSA8PCAxMCk7Ci0JCWtmcmVlIChzb3VuZF9idWZmZXJzKTsKLQkJc291bmRfYnVmZmVycyA9IDA7Ci0JfQotfQotCi0KLXN0YXRpYyBpbnQgc3FfYWxsb2NhdGVfcmVhZF9idWZmZXJzKHZvaWQpCi17Ci0JaW50IGk7Ci0KLQlpZiAoc291bmRfcmVhZF9idWZmZXJzKQotCQlyZXR1cm4gMDsKLQlzb3VuZF9yZWFkX2J1ZmZlcnMgPSBrbWFsbG9jKG51bVJlYWRCdWZzICogc2l6ZW9mKGNoYXIgKiksIEdGUF9LRVJORUwpOwotCWlmICghc291bmRfcmVhZF9idWZmZXJzKQotCQlyZXR1cm4gLUVOT01FTTsKLQlmb3IgKGkgPSAwOyBpIDwgbnVtQnVmczsgaSsrKSB7Ci0JCXNvdW5kX3JlYWRfYnVmZmVyc1tpXSA9IHNvdW5kLm1hY2guZG1hX2FsbG9jIChyZWFkYnVmU2l6ZTw8MTAsCi0JCQkJCQkJICAgICAgR0ZQX0tFUk5FTCk7Ci0JCWlmICghc291bmRfcmVhZF9idWZmZXJzW2ldKSB7Ci0JCQl3aGlsZSAoaS0tKQotCQkJCXNvdW5kLm1hY2guZG1hX2ZyZWUgKHNvdW5kX3JlYWRfYnVmZmVyc1tpXSwKLQkJCQkJCSAgICAgcmVhZGJ1ZlNpemUgPDwgMTApOwotCQkJa2ZyZWUgKHNvdW5kX3JlYWRfYnVmZmVycyk7Ci0JCQlzb3VuZF9yZWFkX2J1ZmZlcnMgPSAwOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHNxX3JlbGVhc2VfcmVhZF9idWZmZXJzKHZvaWQpCi17Ci0JaW50IGk7Ci0KLQlpZiAoc291bmRfcmVhZF9idWZmZXJzKSB7Ci0JCWNwbXAtPmNwX3NtY1sxXS5zbWNfc21jbXIgJj0gflNNQ01SX1JFTjsKLQkJZm9yIChpID0gMDsgaSA8IG51bVJlYWRCdWZzOyBpKyspCi0JCQlzb3VuZC5tYWNoLmRtYV9mcmVlIChzb3VuZF9yZWFkX2J1ZmZlcnNbaV0sCi0JCQkJCSAgICAgYnVmU2l6ZSA8PCAxMCk7Ci0JCWtmcmVlIChzb3VuZF9yZWFkX2J1ZmZlcnMpOwotCQlzb3VuZF9yZWFkX2J1ZmZlcnMgPSAwOwotCX0KLX0KLQotCi1zdGF0aWMgdm9pZCBzcV9zZXR1cChpbnQgbnVtQnVmcywgaW50IGJ1ZlNpemUsIGNoYXIgKip3cml0ZV9idWZmZXJzKQotewotCWludCBpOwotCXZvbGF0aWxlIGNiZF90ICpiZHA7Ci0Jdm9sYXRpbGUgY3BtOHh4X3QJKmNwOwotCXZvbGF0aWxlIHNtY190CSpzcDsKLQotCS8qIE1ha2Ugc3VyZSB0aGUgU01DIHRyYW5zbWl0IGlzIHNodXQgZG93bi4KLQkqLwotCWNwID0gY3BtcDsKLQlzcCA9ICZjcG1wLT5jcF9zbWNbMV07Ci0Jc3AtPnNtY19zbWNtciAmPSB+U01DTVJfVEVOOwotCi0Jc3EubWF4X2NvdW50ID0gbnVtQnVmczsKLQlzcS5tYXhfYWN0aXZlID0gbnVtQnVmczsKLQlzcS5ibG9ja19zaXplID0gYnVmU2l6ZTsKLQlzcS5idWZmZXJzID0gd3JpdGVfYnVmZmVyczsKLQotCXNxLmZyb250ID0gc3EuY291bnQgPSAwOwotCXNxLnJlYXIgPSAtMTsKLQlzcS5zeW5jaW5nID0gMDsKLQlzcS5hY3RpdmUgPSAwOwotCi0JYmRwID0gdHhfYmFzZTsKLQlmb3IgKGk9MDsgaTxudW1CdWZzOyBpKyspIHsKLQkJYmRwLT5jYmRfYnVmYWRkciA9IHZpcnRfdG9fYnVzKHdyaXRlX2J1ZmZlcnNbaV0pOwotCQliZHArKzsKLQl9Ci0KLQkvKiBUaGlzIGNhdXNlcyB0aGUgU01DIHRvIHN5bmMgdXAgd2l0aCB0aGUgZmlyc3QgYnVmZmVyIGFnYWluLgotCSovCi0JY3AtPmNwX2NwY3IgPSBta19jcl9jbWQoQ1BNX0NSX0NIX1NNQzIsIENQTV9DUl9JTklUX1RYKSB8IENQTV9DUl9GTEc7Ci0Jd2hpbGUgKGNwLT5jcF9jcGNyICYgQ1BNX0NSX0ZMRyk7Ci19Ci0KLXN0YXRpYyB2b2lkIHJlYWRfc3Ffc2V0dXAoaW50IG51bUJ1ZnMsIGludCBidWZTaXplLCBjaGFyICoqcmVhZF9idWZmZXJzKQotewotCWludCBpOwotCXZvbGF0aWxlIGNiZF90ICpiZHA7Ci0Jdm9sYXRpbGUgY3BtOHh4X3QJKmNwOwotCXZvbGF0aWxlIHNtY190CSpzcDsKLQotCS8qIE1ha2Ugc3VyZSB0aGUgU01DIHJlY2VpdmUgaXMgc2h1dCBkb3duLgotCSovCi0JY3AgPSBjcG1wOwotCXNwID0gJmNwbXAtPmNwX3NtY1sxXTsKLQlzcC0+c21jX3NtY21yICY9IH5TTUNNUl9SRU47Ci0KLQlyZWFkX3NxLm1heF9jb3VudCA9IG51bUJ1ZnM7Ci0JcmVhZF9zcS5tYXhfYWN0aXZlID0gbnVtQnVmczsKLQlyZWFkX3NxLmJsb2NrX3NpemUgPSBidWZTaXplOwotCXJlYWRfc3EuYnVmZmVycyA9IHJlYWRfYnVmZmVyczsKLQotCXJlYWRfc3EuZnJvbnQgPSByZWFkX3NxLmNvdW50ID0gMDsKLQlyZWFkX3NxLnJlYXIgPSAwOwotCXJlYWRfc3EucmVhcl9zaXplID0gMDsKLQlyZWFkX3NxLnN5bmNpbmcgPSAwOwotCXJlYWRfc3EuYWN0aXZlID0gMDsKLQotCWJkcCA9IHJ4X2Jhc2U7Ci0JZm9yIChpPTA7IGk8bnVtUmVhZEJ1ZnM7IGkrKykgewotCQliZHAtPmNiZF9idWZhZGRyID0gdmlydF90b19idXMocmVhZF9idWZmZXJzW2ldKTsKLQkJYmRwLT5jYmRfZGF0bGVuID0gcmVhZF9zcS5ibG9ja19zaXplOwotCQliZHArKzsKLQl9Ci0KLQkvKiBUaGlzIGNhdXNlcyB0aGUgU01DIHRvIHN5bmMgdXAgd2l0aCB0aGUgZmlyc3QgYnVmZmVyIGFnYWluLgotCSovCi0JY3AtPmNwX2NwY3IgPSBta19jcl9jbWQoQ1BNX0NSX0NIX1NNQzIsIENQTV9DUl9JTklUX1JYKSB8IENQTV9DUl9GTEc7Ci0Jd2hpbGUgKGNwLT5jcF9jcGNyICYgQ1BNX0NSX0ZMRyk7Ci19Ci0KLQotc3RhdGljIHZvaWQgc3FfcGxheSh2b2lkKQotewotCSgqc291bmQubWFjaC5wbGF5KSgpOwotfQotCi0KLS8qICsrVGVTY2hlOiByYWRpY2FsbHkgY2hhbmdlZCB0aGlzIG9uZSB0b28gKi8KLQotc3RhdGljIHNzaXplX3Qgc3Ffd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgKnNyYywgc2l6ZV90IHVMZWZ0LAotCQkJbG9mZl90ICpwcG9zKQotewotCXNzaXplX3QgdVdyaXR0ZW4gPSAwOwotCXVfY2hhciAqZGVzdDsKLQlzc2l6ZV90IHVVc2VkLCBiVXNlZCwgYkxlZnQ7Ci0KLQkvKiArK1RlU2NoZTogSXMgc29tZXRoaW5nIGxpa2UgdGhpcyBuZWNlc3Nhcnk/Ci0JICogSGV5LCB0aGF0J3MgYW4gaG9uZXN0IHF1ZXN0aW9uISBPciBkb2VzIGFueSBvdGhlciBwYXJ0IG9mIHRoZQotCSAqIGZpbGVzeXN0ZW0gYWxyZWFkeSBjaGVja3MgdGhpcyBzaXR1YXRpb24/IEkgcmVhbGx5IGRvbid0IGtub3cuCi0JICovCi0JaWYgKHVMZWZ0ID09IDApCi0JCXJldHVybiAwOwotCi0JLyogVGhlIGludGVycnVwdCBkb2Vzbid0IHN0YXJ0IHRvIHBsYXkgdGhlIGxhc3QsIGluY29tcGxldGUgZnJhbWUuCi0JICogVGh1cyB3ZSBjYW4gYXBwZW5kIHRvIGl0IHdpdGhvdXQgZGlzYWJsaW5nIHRoZSBpbnRlcnJ1cHRzISAoTm90ZQotCSAqIGFsc28gdGhhdCBzcS5yZWFyIGlzbid0IGFmZmVjdGVkIGJ5IHRoZSBpbnRlcnJ1cHQuKQotCSAqLwotCi0JaWYgKHNxLmNvdW50ID4gMCAmJiAoYkxlZnQgPSBzcS5ibG9ja19zaXplLXNxLnJlYXJfc2l6ZSkgPiAwKSB7Ci0JCWRlc3QgPSBzcV9ibG9ja19hZGRyZXNzKHNxLnJlYXIpOwotCQliVXNlZCA9IHNxLnJlYXJfc2l6ZTsKLQkJdVVzZWQgPSBzb3VuZF9jb3B5X3RyYW5zbGF0ZShzcmMsIHVMZWZ0LCBkZXN0LCAmYlVzZWQsIGJMZWZ0KTsKLQkJaWYgKHVVc2VkIDw9IDApCi0JCQlyZXR1cm4gdVVzZWQ7Ci0JCXNyYyArPSB1VXNlZDsKLQkJdVdyaXR0ZW4gKz0gdVVzZWQ7Ci0JCXVMZWZ0IC09IHVVc2VkOwotCQlzcS5yZWFyX3NpemUgPSBiVXNlZDsKLQl9Ci0KLQlkbyB7Ci0JCXdoaWxlIChzcS5jb3VudCA9PSBzcS5tYXhfYWN0aXZlKSB7Ci0JCQlzcV9wbGF5KCk7Ci0JCQlpZiAoTk9OX0JMT0NLSU5HKHNxLm9wZW5fbW9kZSkpCi0JCQkJcmV0dXJuIHVXcml0dGVuID4gMCA/IHVXcml0dGVuIDogLUVBR0FJTjsKLQkJCVNMRUVQKHNxLmFjdGlvbl9xdWV1ZSk7Ci0JCQlpZiAoU0lHTkFMX1JFQ0VJVkVEKQotCQkJCXJldHVybiB1V3JpdHRlbiA+IDAgPyB1V3JpdHRlbiA6IC1FSU5UUjsKLQkJfQotCi0JCS8qIEhlcmUsIHdlIGNhbiBhdm9pZCBkaXNhYmxpbmcgdGhlIGludGVycnVwdCBieSBmaXJzdAotCQkgKiBjb3B5aW5nIGFuZCB0cmFuc2xhdGluZyB0aGUgZGF0YSwgYW5kIHRoZW4gdXBkYXRpbmcKLQkJICogdGhlIHNxIHZhcmlhYmxlcy4gVW50aWwgdGhpcyBpcyBkb25lLCB0aGUgaW50ZXJydXB0Ci0JCSAqIHdvbid0IHNlZSB0aGUgbmV3IGZyYW1lIGFuZCB3ZSBjYW4gd29yayBvbiBpdAotCQkgKiB1bmRpc3R1cmJlZC4KLQkJICovCi0KLQkJZGVzdCA9IHNxX2Jsb2NrX2FkZHJlc3MoKHNxLnJlYXIrMSkgJSBzcS5tYXhfY291bnQpOwotCQliVXNlZCA9IDA7Ci0JCWJMZWZ0ID0gc3EuYmxvY2tfc2l6ZTsKLQkJdVVzZWQgPSBzb3VuZF9jb3B5X3RyYW5zbGF0ZShzcmMsIHVMZWZ0LCBkZXN0LCAmYlVzZWQsIGJMZWZ0KTsKLQkJaWYgKHVVc2VkIDw9IDApCi0JCQlicmVhazsKLQkJc3JjICs9IHVVc2VkOwotCQl1V3JpdHRlbiArPSB1VXNlZDsKLQkJdUxlZnQgLT0gdVVzZWQ7Ci0JCWlmIChiVXNlZCkgewotCQkJc3EucmVhciA9IChzcS5yZWFyKzEpICUgc3EubWF4X2NvdW50OwotCQkJc3EucmVhcl9zaXplID0gYlVzZWQ7Ci0JCQlzcS5jb3VudCsrOwotCQl9Ci0JfSB3aGlsZSAoYlVzZWQpOyAgIC8qIHVVc2VkIG1heSBoYXZlIGJlZW4gMCAqLwotCi0Jc3FfcGxheSgpOwotCi0JcmV0dXJuIHVVc2VkIDwgMD8gdVVzZWQ6IHVXcml0dGVuOwotfQotCi0KLS8qKioqKioqKioqKi8KLQotLyogSGVyZSBpcyBob3cgdGhlIHZhbHVlcyBhcmUgdXNlZCBmb3IgcmVhZGluZy4KLSAqIFRoZSB2YWx1ZSAnYWN0aXZlJyBzaW1wbHkgaW5kaWNhdGVzIHRoZSBETUEgaXMgcnVubmluZy4gIFRoaXMgaXMKLSAqIGRvbmUgc28gdGhlIGRyaXZlciBzZW1hbnRpY3MgYXJlIERNQSBzdGFydHMgd2hlbiB0aGUgZmlyc3QgcmVhZCBpcwotICogcG9zdGVkLiAgVGhlIHZhbHVlICdmcm9udCcgaW5kaWNhdGVzIHRoZSBidWZmZXIgd2Ugc2hvdWxkIG5leHQKLSAqIHNlbmQgdG8gdGhlIHVzZXIuICBUaGUgdmFsdWUgJ3JlYXInIGluZGljYXRlcyB0aGUgYnVmZmVyIHRoZSBETUEgaXMKLSAqIGN1cnJlbnRseSBmaWxsaW5nLiAgV2hlbiAnZnJvbnQnID09ICdyZWFyJyB0aGUgYnVmZmVyICJyaW5nIiBpcwotICogZW1wdHkgKHdlIGFsd2F5cyBoYXZlIGFuIGVtcHR5IGF2YWlsYWJsZSkuICBUaGUgJ3JlYXJfc2l6ZScgaXMgdXNlZAotICogdG8gdHJhY2sgcGFydGlhbCBvZmZzZXRzIGludG8gdGhlIGN1cnJlbnQgYnVmZmVyLiAgUmlnaHQgbm93LCBJIGp1c3Qga2VlcAotICogVGhlIERNQSBydW5uaW5nLiAgSWYgdGhlIHJlYWRlciBjYW4ndCBrZWVwIHVwLCB0aGUgaW50ZXJydXB0IHRvc3NlcwotICogdGhlIG9sZGVzdCBidWZmZXIuICBXZSBjb3VsZCBhbHNvIHNodXQgZG93biB0aGUgRE1BIGluIHRoaXMgY2FzZS4KLSAqLwotc3RhdGljIHNzaXplX3Qgc3FfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqZHN0LCBzaXplX3QgdUxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgIGxvZmZfdCAqcHBvcykKLXsKLQotCXNzaXplX3QJdVJlYWQsIGJMZWZ0LCBiVXNlZCwgdVVzZWQ7Ci0KLQlpZiAodUxlZnQgPT0gMCkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoIXJlYWRfc3EuYWN0aXZlKQotCQlDU19SZWNvcmQoKTsJLyogS2ljayBvZmYgdGhlIHJlY29yZCBwcm9jZXNzLiAqLwotCi0JdVJlYWQgPSAwOwotCi0JLyogTW92ZSB3aGF0IHRoZSB1c2VyIHJlcXVlc3RzLCBkZXBlbmRpbmcgdXBvbiBvdGhlciBvcHRpb25zLgotCSovCi0Jd2hpbGUgKHVMZWZ0ID4gMCkgewotCi0JCS8qIFdoZW4gZnJvbnQgPT0gcmVhciwgdGhlIERNQSBpcyBub3QgZG9uZSB5ZXQuCi0JCSovCi0JCXdoaWxlIChyZWFkX3NxLmZyb250ID09IHJlYWRfc3EucmVhcikgewotCQkJaWYgKE5PTl9CTE9DS0lORyhyZWFkX3NxLm9wZW5fbW9kZSkpIHsKLQkJCSAgICAgICByZXR1cm4gdVJlYWQgPiAwID8gdVJlYWQgOiAtRUFHQUlOOwotCQkJfQotCQkJU0xFRVAocmVhZF9zcS5hY3Rpb25fcXVldWUpOwotCQkJaWYgKFNJR05BTF9SRUNFSVZFRCkKLQkJCQlyZXR1cm4gdVJlYWQgPiAwID8gdVJlYWQgOiAtRUlOVFI7Ci0JCX0KLQotCQkvKiBUaGUgYW1vdW50IHdlIG1vdmUgaXMgZWl0aGVyIHdoYXQgaXMgbGVmdCBpbiB0aGUKLQkJICogY3VycmVudCBidWZmZXIgb3Igd2hhdCB0aGUgdXNlciB3YW50cy4KLQkJICovCi0JCWJMZWZ0ID0gcmVhZF9zcS5ibG9ja19zaXplIC0gcmVhZF9zcS5yZWFyX3NpemU7Ci0JCWJVc2VkID0gcmVhZF9zcS5yZWFyX3NpemU7Ci0JCXVVc2VkID0gc291bmRfY29weV90cmFuc2xhdGVfcmVhZChkc3QsIHVMZWZ0LAotCQkJcmVhZF9zcS5idWZmZXJzW3JlYWRfc3EuZnJvbnRdLCAmYlVzZWQsIGJMZWZ0KTsKLQkJaWYgKHVVc2VkIDw9IDApCi0JCQlyZXR1cm4gdVVzZWQ7Ci0JCWRzdCArPSB1VXNlZDsKLQkJdVJlYWQgKz0gdVVzZWQ7Ci0JCXVMZWZ0IC09IHVVc2VkOwotCQlyZWFkX3NxLnJlYXJfc2l6ZSArPSBiVXNlZDsKLQkJaWYgKHJlYWRfc3EucmVhcl9zaXplID49IHJlYWRfc3EuYmxvY2tfc2l6ZSkgewotCQkJcmVhZF9zcS5yZWFyX3NpemUgPSAwOwotCQkJcmVhZF9zcS5mcm9udCsrOwotCQkJaWYgKHJlYWRfc3EuZnJvbnQgPj0gcmVhZF9zcS5tYXhfYWN0aXZlKQotCQkJCXJlYWRfc3EuZnJvbnQgPSAwOwotCQl9Ci0JfQotCXJldHVybiB1UmVhZDsKLX0KLQotc3RhdGljIGludCBzcV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCWludCByYyA9IDA7Ci0KLQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKLQkJaWYgKHNxLmJ1c3kpIHsKLQkJCXJjID0gLUVCVVNZOwotCQkJaWYgKE5PTl9CTE9DS0lORyhmaWxlLT5mX2ZsYWdzKSkKLQkJCQlnb3RvIGVycl9vdXQ7Ci0JCQlyYyA9IC1FSU5UUjsKLQkJCXdoaWxlIChzcS5idXN5KSB7Ci0JCQkJU0xFRVAoc3Eub3Blbl9xdWV1ZSk7Ci0JCQkJaWYgKFNJR05BTF9SRUNFSVZFRCkKLQkJCQkJZ290byBlcnJfb3V0OwotCQkJfQotCQl9Ci0JCXNxLmJ1c3kgPSAxOyAvKiBMZXQncyBwbGF5IHNwb3QtdGhlLXJhY2UtY29uZGl0aW9uICovCi0KLQkJaWYgKHNxX2FsbG9jYXRlX2J1ZmZlcnMoKSkgZ290byBlcnJfb3V0X25vYnVzeTsKLQotCQlzcV9zZXR1cChudW1CdWZzLCBidWZTaXplPDwxMCxzb3VuZF9idWZmZXJzKTsKLQkJc3Eub3Blbl9tb2RlID0gZmlsZS0+Zl9tb2RlOwotCX0KLQotCi0JaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKLQkJaWYgKHJlYWRfc3EuYnVzeSkgewotCQkJcmMgPSAtRUJVU1k7Ci0JCQlpZiAoTk9OX0JMT0NLSU5HKGZpbGUtPmZfZmxhZ3MpKQotCQkJCWdvdG8gZXJyX291dDsKLQkJCXJjID0gLUVJTlRSOwotCQkJd2hpbGUgKHJlYWRfc3EuYnVzeSkgewotCQkJCVNMRUVQKHJlYWRfc3Eub3Blbl9xdWV1ZSk7Ci0JCQkJaWYgKFNJR05BTF9SRUNFSVZFRCkKLQkJCQkJZ290byBlcnJfb3V0OwotCQkJfQotCQkJcmMgPSAwOwotCQl9Ci0JCXJlYWRfc3EuYnVzeSA9IDE7Ci0JCWlmIChzcV9hbGxvY2F0ZV9yZWFkX2J1ZmZlcnMoKSkgZ290byBlcnJfb3V0X25vYnVzeTsKLQotCQlyZWFkX3NxX3NldHVwKG51bVJlYWRCdWZzLHJlYWRidWZTaXplPDwxMCwgc291bmRfcmVhZF9idWZmZXJzKTsKLQkJcmVhZF9zcS5vcGVuX21vZGUgPSBmaWxlLT5mX21vZGU7Ci0JfQotCi0JLyogU3RhcnQgdXAgdGhlIDQyMTggYnk6Ci0JICogUmVzZXQuCi0JICogRW5hYmxlLCB1bnJlc2V0LgotCSAqLwotCSooKHZvbGF0aWxlIHVpbnQgKilISU9YX0NTUjRfQUREUikgJj0gfkhJT1hfQ1NSNF9SU1RBVURJTzsKLQllaWVpbygpOwotCSooKHZvbGF0aWxlIHVpbnQgKilISU9YX0NTUjRfQUREUikgfD0gSElPWF9DU1I0X0VOQVVESU87Ci0JbWRlbGF5KDUwKTsKLQkqKCh2b2xhdGlsZSB1aW50ICopSElPWF9DU1I0X0FERFIpIHw9IEhJT1hfQ1NSNF9SU1RBVURJTzsKLQotCS8qIFdlIG5lZWQgdG8gc2VuZCB0aGUgY3VycmVudCBjb250cm9sIHdvcmQgaW4gY2FzZSBzb21lb25lCi0JICogb3BlbmVkIC9kZXYvbWl4ZXIgYW5kIGNoYW5nZWQgdGhpbmdzIHdoaWxlIHdlIHdlcmUgc2h1dAotCSAqIGRvd24uICBDaGFuY2VzIGFyZSBnb29kIHRoZSBpbml0aWFsaXphdGlvbiB0aGF0IGZvbGxvd3MKLQkgKiB3b3VsZCBoYXZlIGRvbmUgdGhpcywgYnV0IGl0IGlzIHN0aWxsIHBvc3NpYmxlIGl0IHdvdWxkbid0LgotCSAqLwotCWNzNDIxOF9jdGxfd3JpdGUoY3M0MjE4X2NvbnRyb2wpOwotCi0Jc291bmQubWluRGV2ID0gaW1pbm9yKGlub2RlKSAmIDB4MGY7Ci0Jc291bmQuc29mdCA9IHNvdW5kLmRzcDsKLQlzb3VuZC5oYXJkID0gc291bmQuZHNwOwotCXNvdW5kX2luaXQoKTsKLQlpZiAoKGltaW5vcihpbm9kZSkgJiAweDBmKSA9PSBTTkRfREVWX0FVRElPKSB7Ci0JCXNvdW5kX3NldF9zcGVlZCg4MDAwKTsKLQkJc291bmRfc2V0X3N0ZXJlbygwKTsKLQkJc291bmRfc2V0X2Zvcm1hdChBRk1UX01VX0xBVyk7Ci0JfQotCi0JcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOwotCi1lcnJfb3V0X25vYnVzeToKLQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKLQkJc3EuYnVzeSA9IDA7Ci0JCVdBS0VfVVAoc3Eub3Blbl9xdWV1ZSk7Ci0JfQotCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7Ci0JCXJlYWRfc3EuYnVzeSA9IDA7Ci0JCVdBS0VfVVAocmVhZF9zcS5vcGVuX3F1ZXVlKTsKLQl9Ci1lcnJfb3V0OgotCXJldHVybiByYzsKLX0KLQotCi1zdGF0aWMgdm9pZCBzcV9yZXNldCh2b2lkKQotewotCXNvdW5kX3NpbGVuY2UoKTsKLQlzcS5hY3RpdmUgPSAwOwotCXNxLmNvdW50ID0gMDsKLQlzcS5mcm9udCA9IChzcS5yZWFyKzEpICUgc3EubWF4X2NvdW50OwotI2lmIDAKLQlpbml0X3RkbV9idWZmZXJzKCk7Ci0jZW5kaWYKLX0KLQotCi1zdGF0aWMgaW50IHNxX2ZzeW5jKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCi17Ci0JaW50IHJjID0gMDsKLQotCXNxLnN5bmNpbmcgPSAxOwotCXNxX3BsYXkoKTsJLyogdGhlcmUgbWF5IGJlIGFuIGluY29tcGxldGUgZnJhbWUgd2FpdGluZyAqLwotCi0Jd2hpbGUgKHNxLmFjdGl2ZSkgewotCQlTTEVFUChzcS5zeW5jX3F1ZXVlKTsKLQkJaWYgKFNJR05BTF9SRUNFSVZFRCkgewotCQkJLyogV2hpbGUgd2FpdGluZyBmb3IgYXVkaW8gb3V0cHV0IHRvIGRyYWluLCBhbgotCQkJICogaW50ZXJydXB0IG9jY3VycmVkLiAgU3RvcCBhdWRpbyBvdXRwdXQgaW1tZWRpYXRlbHkKLQkJCSAqIGFuZCBjbGVhciB0aGUgcXVldWUuICovCi0JCQlzcV9yZXNldCgpOwotCQkJcmMgPSAtRUlOVFI7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCXNxLnN5bmNpbmcgPSAwOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBzcV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCWludCByYyA9IDA7Ci0KLQlpZiAoc3EuYnVzeSkKLQkJcmMgPSBzcV9mc3luYyhmaWxlLCBmaWxlLT5mX3BhdGguZGVudHJ5KTsKLQlzb3VuZC5zb2Z0ID0gc291bmQuZHNwOwotCXNvdW5kLmhhcmQgPSBzb3VuZC5kc3A7Ci0Jc291bmRfc2lsZW5jZSgpOwotCi0Jc3FfcmVsZWFzZV9yZWFkX2J1ZmZlcnMoKTsKLQlzcV9yZWxlYXNlX2J1ZmZlcnMoKTsKLQotCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7Ci0JCXJlYWRfc3EuYnVzeSA9IDA7Ci0JCVdBS0VfVVAocmVhZF9zcS5vcGVuX3F1ZXVlKTsKLQl9Ci0KLQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKLQkJc3EuYnVzeSA9IDA7Ci0JCVdBS0VfVVAoc3Eub3Blbl9xdWV1ZSk7Ci0JfQotCi0JLyogU2h1dCBkb3duIHRoZSBTTUMuCi0JKi8KLQljcG1wLT5jcF9zbWNbMV0uc21jX3NtY21yICY9IH4oU01DTVJfVEVOIHwgU01DTVJfUkVOKTsKLQotCS8qIFNodXQgZG93biB0aGUgY29kZWMuCi0JKi8KLQkqKCh2b2xhdGlsZSB1aW50ICopSElPWF9DU1I0X0FERFIpIHw9IEhJT1hfQ1NSNF9SU1RBVURJTzsKLQllaWVpbygpOwotCSooKHZvbGF0aWxlIHVpbnQgKilISU9YX0NTUjRfQUREUikgJj0gfkhJT1hfQ1NSNF9FTkFVRElPOwotCi0JLyogV2FrZSB1cCBhIHByb2Nlc3Mgd2FpdGluZyBmb3IgdGhlIHF1ZXVlIGJlaW5nIHJlbGVhc2VkLgotCSAqIE5vdGU6IFRoZXJlIG1heSBiZSBzZXZlcmFsIHByb2Nlc3NlcyB3YWl0aW5nIGZvciBhIGNhbGwKLQkgKiB0byBvcGVuKCkgcmV0dXJuaW5nLiAqLwotCi0JcmV0dXJuIHJjOwotfQotCi0KLXN0YXRpYyBpbnQgc3FfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVfaW50IGNtZCwKLQkJICAgIHVfbG9uZyBhcmcpCi17Ci0JdV9sb25nIGZtdDsKLQlpbnQgZGF0YTsKLSNpZiAwCi0JaW50IHNpemUsIG5idWZzOwotI2Vsc2UKLQlpbnQgc2l6ZTsKLSNlbmRpZgotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIFNORENUTF9EU1BfUkVTRVQ6Ci0JCXNxX3Jlc2V0KCk7Ci0JCXJldHVybiAwOwotCWNhc2UgU05EQ1RMX0RTUF9QT1NUOgotCWNhc2UgU05EQ1RMX0RTUF9TWU5DOgotCQlyZXR1cm4gc3FfZnN5bmMoZmlsZSwgZmlsZS0+Zl9wYXRoLmRlbnRyeSk7Ci0KLQkJLyogKytUZVNjaGU6IGJlZm9yZSBjaGFuZ2luZyBhbnkgb2YgdGhlc2UgaXQncwotCQkgKiBwcm9iYWJseSB3aXNlIHRvIHdhaXQgdW50aWwgc291bmQgcGxheWluZyBoYXMKLQkJICogc2V0dGxlZCBkb3duLiAqLwotCWNhc2UgU05EQ1RMX0RTUF9TUEVFRDoKLQkJc3FfZnN5bmMoZmlsZSwgZmlsZS0+Zl9wYXRoLmRlbnRyeSk7Ci0JCUlPQ1RMX0lOKGFyZywgZGF0YSk7Ci0JCXJldHVybiBJT0NUTF9PVVQoYXJnLCBzb3VuZF9zZXRfc3BlZWQoZGF0YSkpOwotCWNhc2UgU05EQ1RMX0RTUF9TVEVSRU86Ci0JCXNxX2ZzeW5jKGZpbGUsIGZpbGUtPmZfcGF0aC5kZW50cnkpOwotCQlJT0NUTF9JTihhcmcsIGRhdGEpOwotCQlyZXR1cm4gSU9DVExfT1VUKGFyZywgc291bmRfc2V0X3N0ZXJlbyhkYXRhKSk7Ci0JY2FzZSBTT1VORF9QQ01fV1JJVEVfQ0hBTk5FTFM6Ci0JCXNxX2ZzeW5jKGZpbGUsIGZpbGUtPmZfcGF0aC5kZW50cnkpOwotCQlJT0NUTF9JTihhcmcsIGRhdGEpOwotCQlyZXR1cm4gSU9DVExfT1VUKGFyZywgc291bmRfc2V0X3N0ZXJlbyhkYXRhLTEpKzEpOwotCWNhc2UgU05EQ1RMX0RTUF9TRVRGTVQ6Ci0JCXNxX2ZzeW5jKGZpbGUsIGZpbGUtPmZfcGF0aC5kZW50cnkpOwotCQlJT0NUTF9JTihhcmcsIGRhdGEpOwotCQlyZXR1cm4gSU9DVExfT1VUKGFyZywgc291bmRfc2V0X2Zvcm1hdChkYXRhKSk7Ci0JY2FzZSBTTkRDVExfRFNQX0dFVEZNVFM6Ci0JCWZtdCA9IDA7Ci0JCWlmIChzb3VuZC50cmFuc193cml0ZSkgewotCQkJaWYgKHNvdW5kLnRyYW5zX3dyaXRlLT5jdF91bGF3KQotCQkJCWZtdCB8PSBBRk1UX01VX0xBVzsKLQkJCWlmIChzb3VuZC50cmFuc193cml0ZS0+Y3RfYWxhdykKLQkJCQlmbXQgfD0gQUZNVF9BX0xBVzsKLQkJCWlmIChzb3VuZC50cmFuc193cml0ZS0+Y3RfczgpCi0JCQkJZm10IHw9IEFGTVRfUzg7Ci0JCQlpZiAoc291bmQudHJhbnNfd3JpdGUtPmN0X3U4KQotCQkJCWZtdCB8PSBBRk1UX1U4OwotCQkJaWYgKHNvdW5kLnRyYW5zX3dyaXRlLT5jdF9zMTZiZSkKLQkJCQlmbXQgfD0gQUZNVF9TMTZfQkU7Ci0JCQlpZiAoc291bmQudHJhbnNfd3JpdGUtPmN0X3UxNmJlKQotCQkJCWZtdCB8PSBBRk1UX1UxNl9CRTsKLQkJCWlmIChzb3VuZC50cmFuc193cml0ZS0+Y3RfczE2bGUpCi0JCQkJZm10IHw9IEFGTVRfUzE2X0xFOwotCQkJaWYgKHNvdW5kLnRyYW5zX3dyaXRlLT5jdF91MTZsZSkKLQkJCQlmbXQgfD0gQUZNVF9VMTZfTEU7Ci0JCX0KLQkJcmV0dXJuIElPQ1RMX09VVChhcmcsIGZtdCk7Ci0JY2FzZSBTTkRDVExfRFNQX0dFVEJMS1NJWkU6Ci0JCXNpemUgPSBzcS5ibG9ja19zaXplCi0JCQkqIHNvdW5kLnNvZnQuc2l6ZSAqIChzb3VuZC5zb2Z0LnN0ZXJlbyArIDEpCi0JCQkvIChzb3VuZC5oYXJkLnNpemUgKiAoc291bmQuaGFyZC5zdGVyZW8gKyAxKSk7Ci0JCXJldHVybiBJT0NUTF9PVVQoYXJnLCBzaXplKTsKLQljYXNlIFNORENUTF9EU1BfU1VCRElWSURFOgotCQlicmVhazsKLSNpZiAwCS8qIFNvcnJ5IGNhbid0IGRvIHRoaXMgYXQgdGhlIG1vbWVudC4gIFRoZSBDUE0gYWxsb2NhdGVkIGJ1ZmZlcnMKLQkgKiBsb25nIGFnbyB0aGF0IGNhbid0IGJlIGNoYW5nZWQuCi0JICovCi0JY2FzZSBTTkRDVExfRFNQX1NFVEZSQUdNRU5UOgotCQlpZiAoc3EuY291bnQgfHwgc3EuYWN0aXZlIHx8IHNxLnN5bmNpbmcpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJSU9DVExfSU4oYXJnLCBzaXplKTsKLQkJbmJ1ZnMgPSBzaXplID4+IDE2OwotCQlpZiAobmJ1ZnMgPCAyIHx8IG5idWZzID4gbnVtQnVmcykKLQkJCW5idWZzID0gbnVtQnVmczsKLQkJc2l6ZSAmPSAweGZmZmY7Ci0JCWlmIChzaXplID49IDggJiYgc2l6ZSA8PSAzMCkgewotCQkJc2l6ZSA9IDEgPDwgc2l6ZTsKLQkJCXNpemUgKj0gc291bmQuaGFyZC5zaXplICogKHNvdW5kLmhhcmQuc3RlcmVvICsgMSk7Ci0JCQlzaXplIC89IHNvdW5kLnNvZnQuc2l6ZSAqIChzb3VuZC5zb2Z0LnN0ZXJlbyArIDEpOwotCQkJaWYgKHNpemUgPiAoYnVmU2l6ZSA8PCAxMCkpCi0JCQkJc2l6ZSA9IGJ1ZlNpemUgPDwgMTA7Ci0JCX0gZWxzZQotCQkJc2l6ZSA9IGJ1ZlNpemUgPDwgMTA7Ci0JCXNxX3NldHVwKG51bUJ1ZnMsIHNpemUsIHNvdW5kX2J1ZmZlcnMpOwotCQlzcS5tYXhfYWN0aXZlID0gbmJ1ZnM7Ci0JCXJldHVybiAwOwotI2VuZGlmCi0KLQlkZWZhdWx0OgotCQlyZXR1cm4gbWl4ZXJfaW9jdGwoaW5vZGUsIGZpbGUsIGNtZCwgYXJnKTsKLQl9Ci0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzcV9mb3BzID0KLXsKLQkub3duZXIgPQlUSElTX01PRFVMRSwKLQkubGxzZWVrID0Jc291bmRfbHNlZWssCi0JLnJlYWQgPQkJc3FfcmVhZCwJCQkvKiBzcV9yZWFkICovCi0JLndyaXRlID0Jc3Ffd3JpdGUsCi0JLmlvY3RsID0Jc3FfaW9jdGwsCi0JLm9wZW4gPQkJc3Ffb3BlbiwKLQkucmVsZWFzZSA9CXNxX3JlbGVhc2UsCi19OwotCi0KLXN0YXRpYyB2b2lkIF9faW5pdCBzcV9pbml0KHZvaWQpCi17Ci0Jc3FfdW5pdCA9IHJlZ2lzdGVyX3NvdW5kX2RzcCgmc3FfZm9wcywgLTEpOwotCWlmIChzcV91bml0IDwgMCkKLQkJcmV0dXJuOwotCi0JaW5pdF93YWl0cXVldWVfaGVhZCgmc3EuYWN0aW9uX3F1ZXVlKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzcS5vcGVuX3F1ZXVlKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzcS5zeW5jX3F1ZXVlKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZyZWFkX3NxLmFjdGlvbl9xdWV1ZSk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmcmVhZF9zcS5vcGVuX3F1ZXVlKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZyZWFkX3NxLnN5bmNfcXVldWUpOwotCi0Jc3EuYnVzeSA9IDA7Ci0JcmVhZF9zcS5idXN5ID0gMDsKLQotCS8qIHdoYXRldmVyIHlvdSBsaWtlIGFzIHN0YXJ0dXAgbW9kZSBmb3IgL2Rldi9kc3AsCi0JICogKC9kZXYvYXVkaW8gaGFzbid0IGdvdCBhIHN0YXJ0dXAgbW9kZSkuIG5vdGUgdGhhdAotCSAqIG9uY2UgY2hhbmdlZCBhIG5ldyBvcGVuKCkgd2lsbCAqbm90KiByZXN0b3JlIHRoZXNlIQotCSAqLwotCXNvdW5kLmRzcC5mb3JtYXQgPSBBRk1UX1MxNl9CRTsKLQlzb3VuZC5kc3Auc3RlcmVvID0gMTsKLQlzb3VuZC5kc3Auc2l6ZSA9IDE2OwotCi0JLyogc2V0IG1pbmltdW0gcmF0ZSBwb3NzaWJsZSB3aXRob3V0IGV4cGFuZGluZyAqLwotCXNvdW5kLmRzcC5zcGVlZCA9IDgwMDA7Ci0KLQkvKiBiZWZvcmUgdGhlIGZpcnN0IG9wZW4gdG8gL2Rldi9kc3AgdGhpcyB3b3VsZG4ndCBiZSBzZXQgKi8KLQlzb3VuZC5zb2Z0ID0gc291bmQuZHNwOwotCXNvdW5kLmhhcmQgPSBzb3VuZC5kc3A7Ci0KLQlzb3VuZF9zaWxlbmNlKCk7Ci19Ci0KLS8qCi0gKiAvZGV2L3NuZHN0YXQKLSAqLwotCi0KLS8qIHN0YXRlLmJ1ZiBzaG91bGQgbm90IG92ZXJmbG93ISAqLwotCi1zdGF0aWMgaW50IHN0YXRlX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JY2hhciAqYnVmZmVyID0gc3RhdGUuYnVmLCAqbWFjaCA9ICIiLCBjczQyMThfYnVmWzUwXTsKLQlpbnQgbGVuID0gMDsKLQotCWlmIChzdGF0ZS5idXN5KQotCQlyZXR1cm4gLUVCVVNZOwotCi0Jc3RhdGUucHRyID0gMDsKLQlzdGF0ZS5idXN5ID0gMTsKLQotCXNwcmludGYoY3M0MjE4X2J1ZiwgIkNyeXN0YWwgQ1M0MjE4IG9uIFRETSwgIik7Ci0JbWFjaCA9IGNzNDIxOF9idWY7Ci0KLQlsZW4gKz0gc3ByaW50ZihidWZmZXIrbGVuLCAiJXNETUEgc291bmQgZHJpdmVyOlxuIiwgbWFjaCk7Ci0KLQlsZW4gKz0gc3ByaW50ZihidWZmZXIrbGVuLCAiXHRzb3VuZC5mb3JtYXQgPSAweCV4Iiwgc291bmQuc29mdC5mb3JtYXQpOwotCXN3aXRjaCAoc291bmQuc29mdC5mb3JtYXQpIHsKLQljYXNlIEFGTVRfTVVfTEFXOgotCQlsZW4gKz0gc3ByaW50ZihidWZmZXIrbGVuLCAiIChtdS1sYXcpIik7Ci0JCWJyZWFrOwotCWNhc2UgQUZNVF9BX0xBVzoKLQkJbGVuICs9IHNwcmludGYoYnVmZmVyK2xlbiwgIiAoQS1sYXcpIik7Ci0JCWJyZWFrOwotCWNhc2UgQUZNVF9VODoKLQkJbGVuICs9IHNwcmludGYoYnVmZmVyK2xlbiwgIiAodW5zaWduZWQgOCBiaXQpIik7Ci0JCWJyZWFrOwotCWNhc2UgQUZNVF9TODoKLQkJbGVuICs9IHNwcmludGYoYnVmZmVyK2xlbiwgIiAoc2lnbmVkIDggYml0KSIpOwotCQlicmVhazsKLQljYXNlIEFGTVRfUzE2X0JFOgotCQlsZW4gKz0gc3ByaW50ZihidWZmZXIrbGVuLCAiIChzaWduZWQgMTYgYml0IGJpZykiKTsKLQkJYnJlYWs7Ci0JY2FzZSBBRk1UX1UxNl9CRToKLQkJbGVuICs9IHNwcmludGYoYnVmZmVyK2xlbiwgIiAodW5zaWduZWQgMTYgYml0IGJpZykiKTsKLQkJYnJlYWs7Ci0JY2FzZSBBRk1UX1MxNl9MRToKLQkJbGVuICs9IHNwcmludGYoYnVmZmVyK2xlbiwgIiAoc2lnbmVkIDE2IGJpdCBsaXR0bGUpIik7Ci0JCWJyZWFrOwotCWNhc2UgQUZNVF9VMTZfTEU6Ci0JCWxlbiArPSBzcHJpbnRmKGJ1ZmZlcitsZW4sICIgKHVuc2lnbmVkIDE2IGJpdCBsaXR0bGUpIik7Ci0JCWJyZWFrOwotCX0KLQlsZW4gKz0gc3ByaW50ZihidWZmZXIrbGVuLCAiXG4iKTsKLQlsZW4gKz0gc3ByaW50ZihidWZmZXIrbGVuLCAiXHRzb3VuZC5zcGVlZCA9ICVkSHogKHBoeXMuICVkSHopXG4iLAotCQkgICAgICAgc291bmQuc29mdC5zcGVlZCwgc291bmQuaGFyZC5zcGVlZCk7Ci0JbGVuICs9IHNwcmludGYoYnVmZmVyK2xlbiwgIlx0c291bmQuc3RlcmVvID0gMHgleCAoJXMpXG4iLAotCQkgICAgICAgc291bmQuc29mdC5zdGVyZW8sIHNvdW5kLnNvZnQuc3RlcmVvID8gInN0ZXJlbyIgOiAibW9ubyIpOwotCWxlbiArPSBzcHJpbnRmKGJ1ZmZlcitsZW4sICJcdHNxLmJsb2NrX3NpemUgPSAlZCBzcS5tYXhfY291bnQgPSAlZCIKLQkJICAgICAgICIgc3EubWF4X2FjdGl2ZSA9ICVkXG4iLAotCQkgICAgICAgc3EuYmxvY2tfc2l6ZSwgc3EubWF4X2NvdW50LCBzcS5tYXhfYWN0aXZlKTsKLQlsZW4gKz0gc3ByaW50ZihidWZmZXIrbGVuLCAiXHRzcS5jb3VudCA9ICVkIHNxLnJlYXJfc2l6ZSA9ICVkXG4iLCBzcS5jb3VudCwKLQkJICAgICAgIHNxLnJlYXJfc2l6ZSk7Ci0JbGVuICs9IHNwcmludGYoYnVmZmVyK2xlbiwgIlx0c3EuYWN0aXZlID0gJWQgc3Euc3luY2luZyA9ICVkXG4iLAotCQkgICAgICAgc3EuYWN0aXZlLCBzcS5zeW5jaW5nKTsKLQlzdGF0ZS5sZW4gPSBsZW47Ci0JcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOwotfQotCi0KLXN0YXRpYyBpbnQgc3RhdGVfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdGF0ZS5idXN5ID0gMDsKLQlyZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgc3NpemVfdCBzdGF0ZV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwKLQkJCSAgbG9mZl90ICpwcG9zKQotewotCWludCBuID0gc3RhdGUubGVuIC0gc3RhdGUucHRyOwotCWlmIChuID4gY291bnQpCi0JCW4gPSBjb3VudDsKLQlpZiAobiA8PSAwKQotCQlyZXR1cm4gMDsKLQlpZiAoY29weV90b191c2VyKGJ1ZiwgJnN0YXRlLmJ1ZltzdGF0ZS5wdHJdLCBuKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0Jc3RhdGUucHRyICs9IG47Ci0JcmV0dXJuIG47Ci19Ci0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc3RhdGVfZm9wcyA9Ci17Ci0JLm93bmVyID0JVEhJU19NT0RVTEUsCi0JLmxsc2VlayA9CXNvdW5kX2xzZWVrLAotCS5yZWFkID0JCXN0YXRlX3JlYWQsCi0JLm9wZW4gPQkJc3RhdGVfb3BlbiwKLQkucmVsZWFzZSA9CXN0YXRlX3JlbGVhc2UsCi19OwotCi0KLXN0YXRpYyB2b2lkIF9faW5pdCBzdGF0ZV9pbml0KHZvaWQpCi17Ci0Jc3RhdGVfdW5pdCA9IHJlZ2lzdGVyX3NvdW5kX3NwZWNpYWwoJnN0YXRlX2ZvcHMsIFNORF9ERVZfU1RBVFVTKTsKLQlpZiAoc3RhdGVfdW5pdCA8IDApCi0JCXJldHVybjsKLQlzdGF0ZS5idXN5ID0gMDsKLX0KLQotCi0vKioqIENvbW1vbiBzdHVmZiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGxvbmcgbG9uZyBzb3VuZF9sc2VlayhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9uZyBsb25nIG9mZnNldCwgaW50IG9yaWcpCi17Ci0JcmV0dXJuIC1FU1BJUEU7Ci19Ci0KLQotLyoqKiBDb25maWcgJiBTZXR1cCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLWludCBfX2luaXQgdGRtOHh4X3NvdW5kX2luaXQodm9pZCkKLXsKLQlpbnQgaSwgaGFzX3NvdW5kOwotCXVpbnQJCQlkcF9vZmZzZXQ7Ci0Jdm9sYXRpbGUgdWludAkJKnNpcnA7Ci0Jdm9sYXRpbGUgY2JkX3QJCSpiZHA7Ci0Jdm9sYXRpbGUgY3BtOHh4X3QJKmNwOwotCXZvbGF0aWxlIHNtY190CQkqc3A7Ci0Jdm9sYXRpbGUgc21jX3VhcnRfdAkqdXA7Ci0Jdm9sYXRpbGUgaW1tYXBfdAkqaW1tYXA7Ci0KLQloYXNfc291bmQgPSAwOwotCi0JLyogUHJvZ3JhbSB0aGUgU0kvVFNBIHRvIHVzZSBURE1hLCBjb25uZWN0ZWQgdG8gU01DMiwgZm9yIDQgYnl0ZXMuCi0JKi8KLQljcCA9IGNwbXA7CS8qIEdldCBwb2ludGVyIHRvIENvbW11bmljYXRpb24gUHJvY2Vzc29yICovCi0JaW1tYXAgPSAoaW1tYXBfdCAqKUlNQVBfQUREUjsJLyogYW5kIHRvIGludGVybmFsIHJlZ2lzdGVycyAqLwotCi0JLyogU2V0IGFsbCBURE1hIGNvbnRyb2wgYml0cyB0byB6ZXJvLiAgVGhpcyBlbmFibGVzIG1vc3QgZmVhdHVyZXMKLQkgKiB3ZSB3YW50LgotCSAqLwotCWNwLT5jcF9zaW1vZGUgJj0gfjB4MDAwMDBmZmY7Ci0KLQkvKiBFbmFibGUgY29tbW9uIHJlY2VpdmUvdHJhbnNtaXQgY2xvY2sgcGlucywgdXNlIElETCBmb3JtYXQuCi0JICogU3luYyBvbiBmYWxsaW5nIGVkZ2UsIHRyYW5zbWl0IHJpc2luZyBjbG9jaywgcmVjZWl2ZSBmYWxsaW5nCi0JICogY2xvY2ssIGRlbGF5IDEgYml0IG9uIGJvdGggVHggYW5kIFJ4LiAgQ29tbW9uIFR4L1J4IGNsb2NrcyBhbmQKLQkgKiBzeW5jLgotCSAqIENvbm5lY3QgU01DMiB0byBUU0EuCi0JICovCi0JY3AtPmNwX3NpbW9kZSB8PSAweDgwMDAwMTQxOwotCi0JLyogQ29uZmlndXJlIHBvcnQgQSBwaW5zIGZvciBURE1hIG9wZXJhdGlvbi4KLQkgKiBUaGUgUlBYLUxpdGUgKE1QQzg1MC84MjMpIGxvc2VzIFNNQzIgd2hlbiBURE0gaXMgdXNlZC4KLQkgKi8KLQlpbW1hcC0+aW1faW9wb3J0LmlvcF9wYXBhciB8PSAweDAxYzA7IC8qIEVuYWJsZSBURE1hIGZ1bmN0aW9ucyAqLwotCWltbWFwLT5pbV9pb3BvcnQuaW9wX3BhZGlyIHw9IDB4MDBjMDsgLyogRW5hYmxlIFRETWEgVHgvUnggKi8KLQlpbW1hcC0+aW1faW9wb3J0LmlvcF9wYWRpciAmPSB+MHgwMTAwOyAvKiBFbmFibGUgTDFSQ0xLYSAqLwotCi0JaW1tYXAtPmltX2lvcG9ydC5pb3BfcGNwYXIgfD0gMHgwODAwOyAvKiBFbmFibGUgTDFSU1lOQ2EgKi8KLQlpbW1hcC0+aW1faW9wb3J0LmlvcF9wY2RpciAmPSB+MHgwODAwOwotCi0JLyogSW5pdGlhbGl6ZSB0aGUgU0kgVERNIHJvdXRpbmcgdGFibGUuICBXZSB1c2UgVERNYSBvbmx5LgotCSAqIFRoZSByZWNlaXZlIHRhYmxlIGFuZCB0cmFuc21pdCB0YWJsZSBlYWNoIGhhdmUgb25seSBvbmUKLQkgKiBlbnRyeSwgdG8gY2FwdHVyZS9zZW5kIGZvdXIgYnl0ZXMgYWZ0ZXIgZWFjaCBmcmFtZSBwdWxzZS4KLQkgKiBUaGUgMTYtYml0IHJhbSBlbnRyeSBpcyAwMDAwIDAwMDEgMTAwMCAxMTExLiAoU01DMikKLQkgKi8KLQljcC0+Y3Bfc2lnbXIgPSAwOwotCXNpcnAgPSAodWludCAqKWNwLT5jcF9zaXJhbTsKLQotCSpzaXJwID0gMHgwMThmMDAwMDsJCS8qIFJlY2VpdmUgZW50cnkgKi8KLQlzaXJwICs9IDY0OwotCSpzaXJwID0gMHgwMThmMDAwMDsJCS8qIFRyYW1zbWl0IGVudHJ5ICovCi0KLQkvKiBFbmFibGUgc2luZ2xlIFRETWEgcm91dGluZy4KLQkqLwotCWNwLT5jcF9zaWdtciA9IDB4MDQ7Ci0KLQkvKiBJbml0aWFsaXplIHRoZSBTTUMgZm9yIHRyYW5zcGFyZW50IG9wZXJhdGlvbi4KLQkqLwotCXNwID0gJmNwbXAtPmNwX3NtY1sxXTsKLQl1cCA9IChzbWNfdWFydF90ICopJmNwLT5jcF9kcGFyYW1bUFJPRkZfU01DMl07Ci0KLQkvKiBXZSBuZWVkIHRvIGFsbG9jYXRlIGEgdHJhbnNtaXQgYW5kIHJlY2VpdmUgYnVmZmVyCi0JICogZGVzY3JpcHRvcnMgZnJvbSBkdWFsIHBvcnQgcmFtLgotCSAqLwotCWRwX2FkZHIgPSBjcG1fZHBhbGxvYyhzaXplb2YoY2JkX3QpICogbnVtUmVhZEJ1ZnMsIDgpOwotCi0JLyogU2V0IHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBob3N0IG1lbW9yeQotCSAqIGJ1ZmZlcnMgaW4gdGhlIGJ1ZmZlciBkZXNjcmlwdG9ycywgYW5kIHRoZQotCSAqIHZpcnR1YWwgYWRkcmVzcyBmb3IgdXMgdG8gd29yayB3aXRoLgotCSAqLwotCWJkcCA9IChjYmRfdCAqKSZjcC0+Y3BfZHBtZW1bZHBfYWRkcl07Ci0JdXAtPnNtY19yYmFzZSA9IGRwX29mZnNldDsKLQlyeF9jdXIgPSByeF9iYXNlID0gKGNiZF90ICopYmRwOwotCi0JZm9yIChpPTA7IGk8KG51bVJlYWRCdWZzLTEpOyBpKyspIHsKLQkJYmRwLT5jYmRfYnVmYWRkciA9IDA7Ci0JCWJkcC0+Y2JkX2RhdGxlbiA9IDA7Ci0JCWJkcC0+Y2JkX3NjID0gQkRfU0NfRU1QVFkgfCBCRF9TQ19JTlRSUFQ7Ci0JCWJkcCsrOwotCX0KLQliZHAtPmNiZF9idWZhZGRyID0gMDsKLQliZHAtPmNiZF9kYXRsZW4gPSAwOwotCWJkcC0+Y2JkX3NjID0gQkRfU0NfV1JBUCB8IEJEX1NDX0VNUFRZIHwgQkRfU0NfSU5UUlBUOwotCi0JLyogTm93LCBkbyB0aGUgc2FtZSBmb3IgdGhlIHRyYW5zbWl0IGJ1ZmZlcnMuCi0JKi8KLQlkcF9vZmZzZXQgPSBjcG1fZHBhbGxvYyhzaXplb2YoY2JkX3QpICogbnVtQnVmcywgOCk7Ci0KLQliZHAgPSAoY2JkX3QgKikmY3AtPmNwX2RwbWVtW2RwX2FkZHJdOwotCXVwLT5zbWNfdGJhc2UgPSBkcF9vZmZzZXQ7Ci0JdHhfY3VyID0gdHhfYmFzZSA9IChjYmRfdCAqKWJkcDsKLQotCWZvciAoaT0wOyBpPChudW1CdWZzLTEpOyBpKyspIHsKLQkJYmRwLT5jYmRfYnVmYWRkciA9IDA7Ci0JCWJkcC0+Y2JkX2RhdGxlbiA9IDA7Ci0JCWJkcC0+Y2JkX3NjID0gQkRfU0NfSU5UUlBUOwotCQliZHArKzsKLQl9Ci0JYmRwLT5jYmRfYnVmYWRkciA9IDA7Ci0JYmRwLT5jYmRfZGF0bGVuID0gMDsKLQliZHAtPmNiZF9zYyA9IChCRF9TQ19XUkFQIHwgQkRfU0NfSU5UUlBUKTsKLQotCS8qIFNldCB0cmFuc3BhcmVudCBTTUMgbW9kZS4KLQkgKiBBIGZldyB0aGluZ3MgYXJlIHNwZWNpZmljIHRvIG91ciBhcHBsaWNhdGlvbi4gIFRoZSBjb2RlYyBpbnRlcmZhY2UKLQkgKiBpcyBNU0IgZmlyc3QsIGhlbmNlIHRoZSBSRVZEIHNlbGVjdGlvbi4gIFRoZSBDRC9DVFMgcHVsc2UgYXJlCi0JICogdXNlZCBieSB0aGUgVFNBIHRvIGluZGljYXRlIHRoZSBmcmFtZSBzdGFydCB0byB0aGUgU01DLgotCSAqLwotCXVwLT5zbWNfcmZjciA9IFNDQ19FQjsKLQl1cC0+c21jX3RmY3IgPSBTQ0NfRUI7Ci0JdXAtPnNtY19tcmJsciA9IHJlYWRidWZTaXplICogMTAyNDsKLQotCS8qIFNldCAxNi1iaXQgcmV2ZXJzZWQgZGF0YSwgdHJhbnNwYXJlbnQgbW9kZS4KLQkqLwotCXNwLT5zbWNfc21jbXIgPSBzbWNyX21rX2NsZW4oMTUpIHwKLQkJU01DTVJfU01fVFJBTlMgfCBTTUNNUl9SRVZEIHwgU01DTVJfQlM7Ci0KLQkvKiBFbmFibGUgYW5kIGNsZWFyIGV2ZW50cy4KLQkgKiBCZWNhdXNlIG9mIEZJRk8gZGVsYXlzLCBhbGwgd2UgbmVlZCBpcyB0aGUgcmVjZWl2ZSBpbnRlcnJ1cHQKLQkgKiBhbmQgd2UgY2FuIHByb2Nlc3MgYm90aCB0aGUgY3VycmVudCByZWNlaXZlIGFuZCBjdXJyZW50Ci0JICogdHJhbnNtaXQgaW50ZXJydXB0IHdpdGhpbiBhIGZldyBtaWNyb3NlY29uZHMgb2YgdGhlIHRyYW5zbWl0LgotCSAqLwotCXNwLT5zbWNfc21jZSA9IDB4ZmY7Ci0Jc3AtPnNtY19zbWNtID0gU01DTV9UWEUgfCBTTUNNX1RYIHwgU01DTV9SWDsKLQotCS8qIFNlbmQgdGhlIENQTSBhbiBpbml0aWFsaXplIGNvbW1hbmQuCi0JKi8KLQljcC0+Y3BfY3BjciA9IG1rX2NyX2NtZChDUE1fQ1JfQ0hfU01DMiwKLQkJCQlDUE1fQ1JfSU5JVF9UUlgpIHwgQ1BNX0NSX0ZMRzsKLQl3aGlsZSAoY3AtPmNwX2NwY3IgJiBDUE1fQ1JfRkxHKTsKLQotCXNvdW5kLm1hY2ggPSBtYWNoX2NzNDIxODsKLQloYXNfc291bmQgPSAxOwotCi0JLyogSW5pdGlhbGl6ZSBiZWVwIHN0dWZmICovCi0Jb3JpZ19ta3NvdW5kID0ga2RfbWtzb3VuZDsKLQlrZF9ta3NvdW5kID0gY3NfbWtzb3VuZDsKLQliZWVwX2J1ZiA9IGttYWxsb2MoQkVFUF9CVUZMRU4gKiA0LCBHRlBfS0VSTkVMKTsKLQlpZiAoYmVlcF9idWYgPT0gTlVMTCkKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiZG1hc291bmQ6IG5vIG1lbW9yeSBmb3IgIgotCQkgICAgICAgImJlZXAgYnVmZmVyXG4iKTsKLQotCWlmICghaGFzX3NvdW5kKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCS8qIEluaXRpYWxpemUgdGhlIHNvZnR3YXJlIFNQSS4KLQkqLwotCXN3X3NwaV9pbml0KCk7Ci0KLQkvKiBTZXQgdXAgc291bmQgcXVldWUsIC9kZXYvYXVkaW8gYW5kIC9kZXYvZHNwLiAqLwotCi0JLyogU2V0IGRlZmF1bHQgc2V0dGluZ3MuICovCi0Jc3FfaW5pdCgpOwotCi0JLyogU2V0IHVwIC9kZXYvc25kc3RhdC4gKi8KLQlzdGF0ZV9pbml0KCk7Ci0KLQkvKiBTZXQgdXAgL2Rldi9taXhlci4gKi8KLQltaXhlcl9pbml0KCk7Ci0KLQlpZiAoIXNvdW5kLm1hY2guaXJxaW5pdCgpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRE1BIHNvdW5kIGRyaXZlcjogSW50ZXJydXB0IGluaXRpYWxpemF0aW9uIGZhaWxlZFxuIik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLSNpZmRlZiBNT0RVTEUKLQlpcnFfaW5zdGFsbGVkID0gMTsKLSNlbmRpZgotCi0JcHJpbnRrKEtFUk5fSU5GTyAiRE1BIHNvdW5kIGRyaXZlciBpbnN0YWxsZWQsIHVzaW5nICVkIGJ1ZmZlcnMgb2YgJWRrLlxuIiwKLQkgICAgICAgbnVtQnVmcywgYnVmU2l6ZSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogRHVlIHRvIEZJRk9zIGFuZCBiaXQgZGVsYXlzLCB0aGUgdHJhbnNtaXQgaW50ZXJydXB0IG9jY3VycyBhIGZldwotICogbWljcm9zZWNvbmRzIGFoZWFkIG9mIHRoZSByZWNlaXZlIGludGVycnVwdC4KLSAqIFdoZW4gd2UgZ2V0IGFuIGludGVycnVwdCwgd2Ugc2VydmljZSB0aGUgdHJhbnNtaXQgZmlyc3QsIHRoZW4KLSAqIGNoZWNrIGZvciBhIHJlY2VpdmUgdG8gcHJldmVudCB0aGUgb3ZlcmhlYWQgb2YgcmV0dXJuaW5nIHRocm91Z2gKLSAqIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciBvbmx5IHRvIGdldCBiYWNrIGhlcmUgcmlnaHQgYXdheSBkdXJpbmcKLSAqIGZ1bGwgZHVwbGV4IG9wZXJhdGlvbi4KLSAqLwotc3RhdGljIHZvaWQKLWNzNDIxOF9pbnRyKHZvaWQgKmRldl9pZCkKLXsKLQl2b2xhdGlsZSBzbWNfdAkqc3A7Ci0Jdm9sYXRpbGUgY3BtOHh4X3QJKmNwOwotCi0Jc3AgPSAmY3BtcC0+Y3Bfc21jWzFdOwotCi0JaWYgKHNwLT5zbWNfc21jZSAmIFNDQ01fVFgpIHsKLQkJc3AtPnNtY19zbWNlID0gU0NDTV9UWDsKLQkJY3M0MjE4X3RkbV90eF9pbnRyKCh2b2lkICopc3ApOwotCX0KLQotCWlmIChzcC0+c21jX3NtY2UgJiBTQ0NNX1JYKSB7Ci0JCXNwLT5zbWNfc21jZSA9IFNDQ01fUlg7Ci0JCWNzNDIxOF90ZG1fcnhfaW50cigodm9pZCAqKXNwKTsKLQl9Ci0KLQlpZiAoc3AtPnNtY19zbWNlICYgU0NDTV9UWEUpIHsKLQkJLyogVHJhbnNtaXQgdW5kZXJydW4uICBUaGlzIGhhcHBlbnMgd2l0aCB0aGUgYXBwbGljYXRpb24KLQkJICogZGlkbid0IGtlZXAgdXAgc2VuZGluZyBidWZmZXJzLiAgV2UgdGVsbCB0aGUgU01DIHRvCi0JCSAqIHJlc3RhcnQsIHdoaWNoIHdpbGwgY2F1c2UgaXQgdG8gcG9sbCB0aGUgY3VycmVudCAobmV4dCkKLQkJICogQkQuICBJZiB0aGUgdXNlciBzdXBwbGllZCBkYXRhIHNpbmNlIHRoaXMgb2NjdXJyZWQsCi0JCSAqIHdlIGp1c3Qgc3RhcnQgcnVubmluZyBhZ2Fpbi4gIElmIHRoZXkgZGlkbid0LCB0aGUgU01DCi0JCSAqIHdpbGwgcG9sbCB0aGUgZGVzY3JpcHRvciB1bnRpbCBkYXRhIGlzIHBsYWNlZCB0aGVyZS4KLQkJICovCi0JCXNwLT5zbWNfc21jZSA9IFNDQ01fVFhFOwotCQljcCA9IGNwbXA7CS8qIEdldCBwb2ludGVyIHRvIENvbW11bmljYXRpb24gUHJvY2Vzc29yICovCi0JCWNwLT5jcF9jcGNyID0gbWtfY3JfY21kKENQTV9DUl9DSF9TTUMyLAotCQkJCQlDUE1fQ1JfUkVTVEFSVF9UWCkgfCBDUE1fQ1JfRkxHOwotCQl3aGlsZSAoY3AtPmNwX2NwY3IgJiBDUE1fQ1JfRkxHKTsKLQl9Ci19Ci0KLQotI2RlZmluZSBNQVhBUkdTCQk4CS8qIFNob3VsZCBiZSBzdWZmaWNpZW50IGZvciBub3cgKi8KLQotdm9pZCBfX2luaXQgZG1hc291bmRfc2V0dXAoY2hhciAqc3RyLCBpbnQgKmludHMpCi17Ci0JLyogY2hlY2sgdGhlIGJvb3RzdHJhcCBwYXJhbWV0ZXIgZm9yICJkbWFzb3VuZD0iICovCi0KLQlzd2l0Y2ggKGludHNbMF0pIHsKLQljYXNlIDM6Ci0JCWlmICgoaW50c1szXSA8IDApIHx8IChpbnRzWzNdID4gTUFYX0NBVENIX1JBRElVUykpCi0JCQlwcmludGsoImRtYXNvdW5kX3NldHVwOiBpbnZhbGlkIGNhdGNoIHJhZGl1cywgdXNpbmcgZGVmYXVsdCA9ICVkXG4iLCBjYXRjaFJhZGl1cyk7Ci0JCWVsc2UKLQkJCWNhdGNoUmFkaXVzID0gaW50c1szXTsKLQkJLyogZmFsbCB0aHJvdWdoICovCi0JY2FzZSAyOgotCQlpZiAoaW50c1sxXSA8IE1JTl9CVUZGRVJTKQotCQkJcHJpbnRrKCJkbWFzb3VuZF9zZXR1cDogaW52YWxpZCBudW1iZXIgb2YgYnVmZmVycywgdXNpbmcgZGVmYXVsdCA9ICVkXG4iLCBudW1CdWZzKTsKLQkJZWxzZQotCQkJbnVtQnVmcyA9IGludHNbMV07Ci0JCWlmIChpbnRzWzJdIDwgTUlOX0JVRlNJWkUgfHwgaW50c1syXSA+IE1BWF9CVUZTSVpFKQotCQkJcHJpbnRrKCJkbWFzb3VuZF9zZXR1cDogaW52YWxpZCBidWZmZXIgc2l6ZSwgdXNpbmcgZGVmYXVsdCA9ICVkXG4iLCBidWZTaXplKTsKLQkJZWxzZQotCQkJYnVmU2l6ZSA9IGludHNbMl07Ci0JCWJyZWFrOwotCWNhc2UgMDoKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJpbnRrKCJkbWFzb3VuZF9zZXR1cDogaW52YWxpZCBudW1iZXIgb2YgYXJndW1lbnRzXG4iKTsKLQl9Ci19Ci0KLS8qIFNvZnR3YXJlIFNQSSBmdW5jdGlvbnMuCi0gKiBUaGVzZSBhcmUgb24gUG9ydCBCLgotICovCi0jZGVmaW5lIFBCX1NQSUNMSwkoKHVpbnQpMHgwMDAwMDAwMikKLSNkZWZpbmUgUEJfU1BJTU9TSQkoKHVpbnQpMHgwMDAwMDAwNCkKLSNkZWZpbmUgUEJfU1BJTUlTTwkoKHVpbnQpMHgwMDAwMDAwOCkKLQotc3RhdGljCi12b2lkCXN3X3NwaV9pbml0KHZvaWQpCi17Ci0Jdm9sYXRpbGUgY3BtOHh4X3QJKmNwOwotCXZvbGF0aWxlIHVpbnQJCSpoY3NyNDsKLQotCWhjc3I0ID0gKHZvbGF0aWxlIHVpbnQgKilISU9YX0NTUjRfQUREUjsKLQljcCA9IGNwbXA7CS8qIEdldCBwb2ludGVyIHRvIENvbW11bmljYXRpb24gUHJvY2Vzc29yICovCi0KLQkqaGNzcjQgJj0gfkhJT1hfQ1NSNF9BVURTUElTRUw7CS8qIERpc2FibGUgU1BJIHNlbGVjdCAqLwotCi0JLyogTWFrZSB0aGVzZSBQb3J0IEIgc2lnbmFscyBnZW5lcmFsIHB1cnBvc2UgSS9PLgotCSAqIEZpcnN0LCBtYWtlIHN1cmUgdGhlIGNsb2NrIGlzIGxvdy4KLQkgKi8KLQljcC0+Y3BfcGJkYXQgJj0gflBCX1NQSUNMSzsKLQljcC0+Y3BfcGJwYXIgJj0gfihQQl9TUElDTEsgfCBQQl9TUElNT1NJIHwgUEJfU1BJTUlTTyk7Ci0KLQkvKiBDbG9jayBhbmQgTWFzdGVyIE91dHB1dCBhcmUgb3V0cHV0cy4KLQkqLwotCWNwLT5jcF9wYmRpciB8PSAoUEJfU1BJQ0xLIHwgUEJfU1BJTU9TSSk7Ci0KLQkvKiBNYXN0ZXIgSW5wdXQuCi0JKi8KLQljcC0+Y3BfcGJkaXIgJj0gflBCX1NQSU1JU087Ci0KLX0KLQotLyogV3JpdGUgdGhlIENTNDIxOCBjb250cm9sIHdvcmQgb3V0IHRoZSBTUEkgcG9ydC4gIFdoaWxlIHRoZQotICogdGhlIGNvbnRyb2wgd29yZCBpcyBnb2luZyBvdXQsIHRoZSBzdGF0dXMgd29yZCBpcyBhcnJpdmluZy4KLSAqLwotc3RhdGljCi11aW50CWNzNDIxOF9jdGxfd3JpdGUodWludCBjdGxyZWcpCi17Ci0JdWludAlzdGF0dXM7Ci0KLQlzd19zcGlfaW8oKHVfY2hhciAqKSZjdGxyZWcsICh1X2NoYXIgKikmc3RhdHVzLCA0KTsKLQotCS8qIFNoYWRvdyB0aGUgY29udHJvbCByZWdpc3Rlci4uLi4uSSBndWVzcyB3ZSBjb3VsZCBkbwotCSAqIHRoZSBzYW1lIGZvciB0aGUgc3RhdHVzLCBidXQgZm9yIG5vdyB3ZSBqdXN0IHJldHVybiBpdAotCSAqIGFuZCBsZXQgdGhlIGNhbGxlciBkZWNpZGUuCi0JICovCi0JY3M0MjE4X2NvbnRyb2wgPSBjdGxyZWc7Ci0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljCi12b2lkCXN3X3NwaV9pbyh1X2NoYXIgKm9idWYsIHVfY2hhciAqaWJ1ZiwgdWludCBiY250KQotewotCWludAliaXRzLCBpOwotCXVfY2hhcglvdXRieXRlLCBpbmJ5dGU7Ci0Jdm9sYXRpbGUgY3BtOHh4X3QJKmNwOwotCXZvbGF0aWxlIHVpbnQJCSpoY3NyNDsKLQotCWhjc3I0ID0gKHZvbGF0aWxlIHVpbnQgKilISU9YX0NTUjRfQUREUjsKLQljcCA9IGNwbXA7CS8qIEdldCBwb2ludGVyIHRvIENvbW11bmljYXRpb24gUHJvY2Vzc29yICovCi0KLQkvKiBUaGUgdGltaW5nIG9uIHRoZSBidXMgaXMgcHJldHR5IHNsb3cuICBDb2RlIGluZWZmaWNpZW5jeQotCSAqIGFuZCBlaWVpbygpIGlzIG91ciBmcmllbmQgaGVyZSA6LSkuCi0JICovCi0JY3AtPmNwX3BiZGF0ICY9IH5QQl9TUElDTEs7Ci0JKmhjc3I0IHw9IEhJT1hfQ1NSNF9BVURTUElTRUw7CS8qIEVuYWJsZSBTUEkgc2VsZWN0ICovCi0JZWllaW8oKTsKLQotCS8qIENsb2NrIGluL291dCB0aGUgYnl0ZXMuICBEYXRhIGlzIHZhbGlkIG9uIHRoZSBmYWxsaW5nIGVkZ2UKLQkgKiBvZiB0aGUgY2xvY2suICBEYXRhIGlzIE1TQiBmaXJzdC4KLQkgKi8KLQlmb3IgKGk9MDsgaTxiY250OyBpKyspIHsKLQkJb3V0Ynl0ZSA9ICpvYnVmKys7Ci0JCWluYnl0ZSA9IDA7Ci0JCWZvciAoYml0cz0wOyBiaXRzPDg7IGJpdHMrKykgewotCQkJZWllaW8oKTsKLQkJCWNwLT5jcF9wYmRhdCB8PSBQQl9TUElDTEs7Ci0JCQllaWVpbygpOwotCQkJaWYgKG91dGJ5dGUgJiAweDgwKQotCQkJCWNwLT5jcF9wYmRhdCB8PSBQQl9TUElNT1NJOwotCQkJZWxzZQotCQkJCWNwLT5jcF9wYmRhdCAmPSB+UEJfU1BJTU9TSTsKLQkJCWVpZWlvKCk7Ci0JCQljcC0+Y3BfcGJkYXQgJj0gflBCX1NQSUNMSzsKLQkJCWVpZWlvKCk7Ci0JCQlvdXRieXRlIDw8PSAxOwotCQkJaW5ieXRlIDw8PSAxOwotCQkJaWYgKGNwLT5jcF9wYmRhdCAmIFBCX1NQSU1JU08pCi0JCQkJaW5ieXRlIHw9IDE7Ci0JCX0KLQkJKmlidWYrKyA9IGluYnl0ZTsKLQl9Ci0KLQkqaGNzcjQgJj0gfkhJT1hfQ1NSNF9BVURTUElTRUw7CS8qIERpc2FibGUgU1BJIHNlbGVjdCAqLwotCWVpZWlvKCk7Ci19Ci0KLXZvaWQgY2xlYW51cF9tb2R1bGUodm9pZCkKLXsKLQlpZiAoaXJxX2luc3RhbGxlZCkgewotCQlzb3VuZF9zaWxlbmNlKCk7Ci0jaWZkZWYgTU9EVUxFCi0JCXNvdW5kLm1hY2guaXJxY2xlYW51cCgpOwotI2VuZGlmCi0JfQotCi0Jc3FfcmVsZWFzZV9yZWFkX2J1ZmZlcnMoKTsKLQlzcV9yZWxlYXNlX2J1ZmZlcnMoKTsKLQotCWlmIChtaXhlcl91bml0ID49IDApCi0JCXVucmVnaXN0ZXJfc291bmRfbWl4ZXIobWl4ZXJfdW5pdCk7Ci0JaWYgKHN0YXRlX3VuaXQgPj0gMCkKLQkJdW5yZWdpc3Rlcl9zb3VuZF9zcGVjaWFsKHN0YXRlX3VuaXQpOwotCWlmIChzcV91bml0ID49IDApCi0JCXVucmVnaXN0ZXJfc291bmRfZHNwKHNxX3VuaXQpOwotfQotCi1tb2R1bGVfaW5pdCh0ZG04eHhfc291bmRfaW5pdCk7Ci1tb2R1bGVfZXhpdChjbGVhbnVwX21vZHVsZSk7Ci0KZGlmZiAtLWdpdCBhL2FyY2gvcHBjLzh4eF9pby9lbmV0LmMgYi9hcmNoL3BwYy84eHhfaW8vZW5ldC5jCmluZGV4IGIyM2M0NWIuLmJmYTNmNTIgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjLzh4eF9pby9lbmV0LmMKKysrIGIvYXJjaC9wcGMvOHh4X2lvL2VuZXQuYwpAQCAtNTA2LDcgKzUwNiw2IEBACiAJCQljZXAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKIAkJfQogCQllbHNlIHsKLQkJCXNrYi0+ZGV2ID0gZGV2OwogCQkJc2tiX3B1dChza2IscGt0X2xlbi00KTsJLyogTWFrZSByb29tICovCiAJCQlldGhfY29weV9hbmRfc3VtKHNrYiwKIAkJCQljZXAtPnJ4X3ZhZGRyW2JkcCAtIGNlcC0+cnhfYmRfYmFzZV0sCmRpZmYgLS1naXQgYS9hcmNoL3BwYy84eHhfaW8vZmVjLmMgYi9hcmNoL3BwYy84eHhfaW8vZmVjLmMKaW5kZXggZTZjMjhmYi4uNTdhOWE2MSAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvOHh4X2lvL2ZlYy5jCisrKyBiL2FyY2gvcHBjLzh4eF9pby9mZWMuYwpAQCAtNzI0LDcgKzcyNCw2IEBACiAJCXByaW50aygiJXM6IE1lbW9yeSBzcXVlZXplLCBkcm9wcGluZyBwYWNrZXQuXG4iLCBkZXYtPm5hbWUpOwogCQlmZXAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKIAl9IGVsc2UgewotCQlza2ItPmRldiA9IGRldjsKIAkJc2tiX3B1dChza2IscGt0X2xlbi00KTsJLyogTWFrZSByb29tICovCiAJCWV0aF9jb3B5X2FuZF9zdW0oc2tiLCBkYXRhLCBwa3RfbGVuLTQsIDApOwogCQlza2ItPnByb3RvY29sPWV0aF90eXBlX3RyYW5zKHNrYixkZXYpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvYm9vdC9jb21tb24vbWlzYy1jb21tb24uYyBiL2FyY2gvcHBjL2Jvb3QvY29tbW9uL21pc2MtY29tbW9uLmMKaW5kZXggOGUxZmNjZC4uOTU4OTk2OSAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvYm9vdC9jb21tb24vbWlzYy1jb21tb24uYworKysgYi9hcmNoL3BwYy9ib290L2NvbW1vbi9taXNjLWNvbW1vbi5jCkBAIC01Nyw3ICs1Nyw4IEBACiAKICNpZiBkZWZpbmVkKENPTkZJR19TRVJJQUxfQ1BNX0NPTlNPTEUpIHx8IGRlZmluZWQoQ09ORklHX1NFUklBTF84MjUwX0NPTlNPTEUpIFwKIAl8fCBkZWZpbmVkKENPTkZJR19TRVJJQUxfTVBDNTJ4eF9DT05TT0xFKSBcCi0JfHwgZGVmaW5lZChDT05GSUdfU0VSSUFMX01QU0NfQ09OU09MRSkKKwl8fCBkZWZpbmVkKENPTkZJR19TRVJJQUxfTVBTQ19DT05TT0xFKSBcCisJfHwgZGVmaW5lZChDT05GSUdfU0VSSUFMX1VBUlRMSVRFX0NPTlNPTEUpCiBleHRlcm4gdW5zaWduZWQgbG9uZyBjb21fcG9ydDsKIAogZXh0ZXJuIGludCBzZXJpYWxfdHN0Yyh1bnNpZ25lZCBsb25nIGNvbV9wb3J0KTsKQEAgLTgwLDcgKzgxLDggQEAKIHsKICNpZiBkZWZpbmVkKENPTkZJR19TRVJJQUxfQ1BNX0NPTlNPTEUpIHx8IGRlZmluZWQoQ09ORklHX1NFUklBTF84MjUwX0NPTlNPTEUpIFwKIAl8fCBkZWZpbmVkKENPTkZJR19TRVJJQUxfTVBDNTJ4eF9DT05TT0xFKSBcCi0JfHwgZGVmaW5lZChDT05GSUdfU0VSSUFMX01QU0NfQ09OU09MRSkKKwl8fCBkZWZpbmVkKENPTkZJR19TRVJJQUxfTVBTQ19DT05TT0xFKSBcCisJfHwgZGVmaW5lZChDT05GSUdfU0VSSUFMX1VBUlRMSVRFX0NPTlNPTEUpCiAJaWYoa2V5Yl9wcmVzZW50KQogCQlyZXR1cm4gKENSVF90c3RjKCkgfHwgc2VyaWFsX3RzdGMoY29tX3BvcnQpKTsKIAllbHNlCkBAIC05NSw3ICs5Nyw4IEBACiAJd2hpbGUgKDEpIHsKICNpZiBkZWZpbmVkKENPTkZJR19TRVJJQUxfQ1BNX0NPTlNPTEUpIHx8IGRlZmluZWQoQ09ORklHX1NFUklBTF84MjUwX0NPTlNPTEUpIFwKIAl8fCBkZWZpbmVkKENPTkZJR19TRVJJQUxfTVBDNTJ4eF9DT05TT0xFKSBcCi0JfHwgZGVmaW5lZChDT05GSUdfU0VSSUFMX01QU0NfQ09OU09MRSkKKwl8fCBkZWZpbmVkKENPTkZJR19TRVJJQUxfTVBTQ19DT05TT0xFKSBcCisJfHwgZGVmaW5lZChDT05GSUdfU0VSSUFMX1VBUlRMSVRFX0NPTlNPTEUpCiAJCWlmIChzZXJpYWxfdHN0Yyhjb21fcG9ydCkpCiAJCQlyZXR1cm4gKHNlcmlhbF9nZXRjKGNvbV9wb3J0KSk7CiAjZW5kaWYgLyogc2VyaWFsIGNvbnNvbGUgKi8KQEAgLTExMiw3ICsxMTUsOCBAQAogCiAjaWYgZGVmaW5lZChDT05GSUdfU0VSSUFMX0NQTV9DT05TT0xFKSB8fCBkZWZpbmVkKENPTkZJR19TRVJJQUxfODI1MF9DT05TT0xFKSBcCiAJfHwgZGVmaW5lZChDT05GSUdfU0VSSUFMX01QQzUyeHhfQ09OU09MRSkgXAotCXx8IGRlZmluZWQoQ09ORklHX1NFUklBTF9NUFNDX0NPTlNPTEUpCisJfHwgZGVmaW5lZChDT05GSUdfU0VSSUFMX01QU0NfQ09OU09MRSkgXAorCXx8IGRlZmluZWQoQ09ORklHX1NFUklBTF9VQVJUTElURV9DT05TT0xFKQogCXNlcmlhbF9wdXRjKGNvbV9wb3J0LCBjKTsKIAlpZiAoIGMgPT0gJ1xuJyApCiAJCXNlcmlhbF9wdXRjKGNvbV9wb3J0LCAnXHInKTsKQEAgLTE2MSw3ICsxNjUsOCBAQAogCXdoaWxlICggKCBjID0gKnMrKyApICE9ICdcMCcgKSB7CiAjaWYgZGVmaW5lZChDT05GSUdfU0VSSUFMX0NQTV9DT05TT0xFKSB8fCBkZWZpbmVkKENPTkZJR19TRVJJQUxfODI1MF9DT05TT0xFKSBcCiAJfHwgZGVmaW5lZChDT05GSUdfU0VSSUFMX01QQzUyeHhfQ09OU09MRSkgXAotCXx8IGRlZmluZWQoQ09ORklHX1NFUklBTF9NUFNDX0NPTlNPTEUpCisJfHwgZGVmaW5lZChDT05GSUdfU0VSSUFMX01QU0NfQ09OU09MRSkgXAorCXx8IGRlZmluZWQoQ09ORklHX1NFUklBTF9VQVJUTElURV9DT05TT0xFKQogCSAgICAgICAgc2VyaWFsX3B1dGMoY29tX3BvcnQsIGMpOwogCSAgICAgICAgaWYgKCBjID09ICdcbicgKSBzZXJpYWxfcHV0Yyhjb21fcG9ydCwgJ1xyJyk7CiAjZW5kaWYgLyogc2VyaWFsIGNvbnNvbGUgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcHBjL2Jvb3Qvc2ltcGxlL01ha2VmaWxlIGIvYXJjaC9wcGMvYm9vdC9zaW1wbGUvTWFrZWZpbGUKaW5kZXggYmNmYjZjZC4uNWI4Nzc3OSAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvYm9vdC9zaW1wbGUvTWFrZWZpbGUKKysrIGIvYXJjaC9wcGMvYm9vdC9zaW1wbGUvTWFrZWZpbGUKQEAgLTIwMSw2ICsyMDEsNyBAQAogZW5kaWYKIGJvb3QtJChDT05GSUdfU0VSSUFMX01QQzUyeHhfQ09OU09MRSkJKz0gbXBjNTJ4eF90dHkubwogYm9vdC0kKENPTkZJR19TRVJJQUxfTVBTQ19DT05TT0xFKQkrPSBtdjY0eDYwX3R0eS5vCitib290LSQoQ09ORklHX1NFUklBTF9VQVJUTElURV9DT05TT0xFKQkrPSB1YXJ0bGl0ZV90dHkubwogCiBMSUJTCQkJCTo9ICQoY29tbW9uKS9saWIuYSAkKGJvb3RsaWIpL2xpYi5hCiBpZmVxICgkKENPTkZJR19QUENfUFJFUCkseSkKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL2Jvb3Qvc2ltcGxlL3VhcnRsaXRlX3R0eS5jIGIvYXJjaC9wcGMvYm9vdC9zaW1wbGUvdWFydGxpdGVfdHR5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVhZTFlYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcHBjL2Jvb3Qvc2ltcGxlL3VhcnRsaXRlX3R0eS5jCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBYaWxpbnggVUFSVExJVEUgYm9vdGxvYWRlciBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgU2VjcmV0IExhYiBUZWNobm9sb2dpZXMgTHRkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL3NlcmlhbC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPHBsYXRmb3Jtcy80eHgveHBhcmFtZXRlcnMveHBhcmFtZXRlcnMuaD4KKworI2RlZmluZSBVQVJUTElURV9CQVNFQUREUiAoKHZvaWQqKShYUEFSX1VBUlRMSVRFXzBfQkFTRUFERFIpKQorCit2b2lkCitzZXJpYWxfcHV0Yyh1bnNpZ25lZCBsb25nIGNvbV9wb3J0LCB1bnNpZ25lZCBjaGFyIGMpCit7CisJd2hpbGUgKChpbl9iZTMyKFVBUlRMSVRFX0JBU0VBRERSICsgMHg4KSAmIDB4MDgpICE9IDApOyAvKiBzcGluICovCisJb3V0X2JlMzIoVUFSVExJVEVfQkFTRUFERFIgKyAweDQsIGMpOworfQorCit1bnNpZ25lZCBjaGFyCitzZXJpYWxfZ2V0Yyh1bnNpZ25lZCBsb25nIGNvbV9wb3J0KQoreworCXdoaWxlICgoaW5fYmUzMihVQVJUTElURV9CQVNFQUREUiArIDB4OCkgJiAweDAxKSA9PSAwKTsgLyogc3BpbiAqLworCXJldHVybiBpbl9iZTMyKFVBUlRMSVRFX0JBU0VBRERSKTsKK30KKworaW50CitzZXJpYWxfdHN0Yyh1bnNpZ25lZCBsb25nIGNvbV9wb3J0KQoreworCXJldHVybiAoKGluX2JlMzIoVUFSVExJVEVfQkFTRUFERFIgKyAweDgpICYgMHgwMSkgIT0gMCk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3BwYy9rZXJuZWwvYXNtLW9mZnNldHMuYyBiL2FyY2gvcHBjL2tlcm5lbC9hc20tb2Zmc2V0cy5jCmluZGV4IDFmOTFlY2EuLmM1ODUwYTIgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL2tlcm5lbC9hc20tb2Zmc2V0cy5jCisrKyBiL2FyY2gvcHBjL2tlcm5lbC9hc20tb2Zmc2V0cy5jCkBAIC00MCw3ICs0MCw2IEBACiAJREVGSU5FKFBUUkFDRSwgb2Zmc2V0b2Yoc3RydWN0IHRhc2tfc3RydWN0LCBwdHJhY2UpKTsKIAlERUZJTkUoS1NQLCBvZmZzZXRvZihzdHJ1Y3QgdGhyZWFkX3N0cnVjdCwga3NwKSk7CiAJREVGSU5FKFBHRElSLCBvZmZzZXRvZihzdHJ1Y3QgdGhyZWFkX3N0cnVjdCwgcGdkaXIpKTsKLQlERUZJTkUoTEFTVF9TWVNDQUxMLCBvZmZzZXRvZihzdHJ1Y3QgdGhyZWFkX3N0cnVjdCwgbGFzdF9zeXNjYWxsKSk7CiAJREVGSU5FKFBUX1JFR1MsIG9mZnNldG9mKHN0cnVjdCB0aHJlYWRfc3RydWN0LCByZWdzKSk7CiAJREVGSU5FKFRIUkVBRF9GUEVYQ19NT0RFLCBvZmZzZXRvZihzdHJ1Y3QgdGhyZWFkX3N0cnVjdCwgZnBleGNfbW9kZSkpOwogCURFRklORShUSFJFQURfRlBSMCwgb2Zmc2V0b2Yoc3RydWN0IHRocmVhZF9zdHJ1Y3QsIGZwclswXSkpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMva2VybmVsL2VudHJ5LlMgYi9hcmNoL3BwYy9rZXJuZWwvZW50cnkuUwppbmRleCBhOWQ0NTUzLi5hYjY0MjU2IDEwMDY0NAotLS0gYS9hcmNoL3BwYy9rZXJuZWwvZW50cnkuUworKysgYi9hcmNoL3BwYy9rZXJuZWwvZW50cnkuUwpAQCAtMTkxLDcgKzE5MSw2IEBACiAwOgogCiBfR0xPQkFMKERvU3lzY2FsbCkKLQlzdHcJcjAsVEhSRUFEK0xBU1RfU1lTQ0FMTChyMikKIAlzdHcJcjMsT1JJR19HUFIzKHIxKQogCWxpCXIxMiwwCiAJc3R3CXIxMixSRVNVTFQocjEpCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9rZXJuZWwvcHBjX2tzeW1zLmMgYi9hcmNoL3BwYy9rZXJuZWwvcHBjX2tzeW1zLmMKaW5kZXggMTMxOGI2Zi4uNGFkNDk5NjAgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL2tlcm5lbC9wcGNfa3N5bXMuYworKysgYi9hcmNoL3BwYy9rZXJuZWwvcHBjX2tzeW1zLmMKQEAgLTkzLDggKzkzLDYgQEAKIEVYUE9SVF9TWU1CT0woc3RyY2F0KTsKIEVYUE9SVF9TWU1CT0woc3RybGVuKTsKIEVYUE9SVF9TWU1CT0woc3RyY21wKTsKLUVYUE9SVF9TWU1CT0woc3RyY2FzZWNtcCk7Ci1FWFBPUlRfU1lNQk9MKHN0cm5jYXNlY21wKTsKIEVYUE9SVF9TWU1CT0woX19kaXY2NF8zMik7CiAKIEVYUE9SVF9TWU1CT0woY3N1bV9wYXJ0aWFsKTsKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL2xpYi9NYWtlZmlsZSBiL2FyY2gvcHBjL2xpYi9NYWtlZmlsZQppbmRleCA1MDM1OGU0Li40MjJiZWY5IDEwMDY0NAotLS0gYS9hcmNoL3BwYy9saWIvTWFrZWZpbGUKKysrIGIvYXJjaC9wcGMvbGliL01ha2VmaWxlCkBAIC0yLDcgKzIsNyBAQAogIyBNYWtlZmlsZSBmb3IgcHBjLXNwZWNpZmljIGxpYnJhcnkgZmlsZXMuLgogIwogCi1vYmoteQkJCTo9IGNoZWNrc3VtLm8gc3RyaW5nLm8gc3RyY2FzZS5vIGRpdjY0Lm8KK29iai15CQkJOj0gY2hlY2tzdW0ubyBzdHJpbmcubyBkaXY2NC5vCiAKIG9iai0kKENPTkZJR184eHgpCSs9IHJoZWFwLm8KIG9iai0kKENPTkZJR19DUE0yKQkrPSByaGVhcC5vCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9saWIvc3RyY2FzZS5jIGIvYXJjaC9wcGMvbGliL3N0cmNhc2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2IwMDk0Yy4uMDAwMDAwMAotLS0gYS9hcmNoL3BwYy9saWIvc3RyY2FzZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLQotaW50IHN0cmNhc2VjbXAoY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyKQotewotCWludCBjMSwgYzI7Ci0KLQlkbyB7Ci0JCWMxID0gdG9sb3dlcigqczErKyk7Ci0JCWMyID0gdG9sb3dlcigqczIrKyk7Ci0JfSB3aGlsZSAoYzEgPT0gYzIgJiYgYzEgIT0gMCk7Ci0JcmV0dXJuIGMxIC0gYzI7Ci19Ci0KLWludCBzdHJuY2FzZWNtcChjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIsIHNpemVfdCBuKQotewotCWludCBjMSwgYzI7Ci0KLQlkbyB7Ci0JCWMxID0gdG9sb3dlcigqczErKyk7Ci0JCWMyID0gdG9sb3dlcigqczIrKyk7Ci0JfSB3aGlsZSAoKC0tbiA+IDApICYmIGMxID09IGMyICYmIGMxICE9IDApOwotCXJldHVybiBjMSAtIGMyOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvcGxhdGZvcm1zLzR4eC9LY29uZmlnIGIvYXJjaC9wcGMvcGxhdGZvcm1zLzR4eC9LY29uZmlnCmluZGV4IDcwNWFlNTYuLjc2NTUxYjYgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL3BsYXRmb3Jtcy80eHgvS2NvbmZpZworKysgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvNHh4L0tjb25maWcKQEAgLTI5LDYgKzI5LDcgQEAKIAogY29uZmlnIEVQNDA1CiAJYm9vbCAiRVA0MDUvRVA0MDVQQyIKKwlzZWxlY3QgRU1CRURERURCT09UCiAJaGVscAogCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgRVA0MDUvRVA0MDVQQyBib2FyZHMuCiAKQEAgLTU0LDExICs1NSwxNSBAQAogCiBjb25maWcgWElMSU5YX01MMzAwCiAJYm9vbCAiWGlsaW54LU1MMzAwIgorCXNlbGVjdCBYSUxJTlhfVklSVEVYX0lJX1BSTworCXNlbGVjdCBFTUJFRERFREJPT1QKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBYaWxpbnggTUwzMDAgZXZhbHVhdGlvbiBib2FyZC4KIAogY29uZmlnIFhJTElOWF9NTDQwMwogCWJvb2wgIlhpbGlueC1NTDQwMyIKKwlzZWxlY3QgWElMSU5YX1ZJUlRFWF80X0ZYCisJc2VsZWN0IEVNQkVEREVEQk9PVAogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIFhpbGlueCBNTDQwMyBldmFsdWF0aW9uIGJvYXJkLgogZW5kY2hvaWNlCkBAIC0yMTUsMTggKzIyMCwxNCBAQAogCiBjb25maWcgWElMSU5YX1ZJUlRFWF9JSV9QUk8KIAlib29sCi0JZGVwZW5kcyBvbiBYSUxJTlhfTUwzMDAKLQlkZWZhdWx0IHkKKwlzZWxlY3QgWElMSU5YX1ZJUlRFWAogCiBjb25maWcgWElMSU5YX1ZJUlRFWF80X0ZYCiAJYm9vbAotCWRlcGVuZHMgb24gWElMSU5YX01MNDAzCi0JZGVmYXVsdCB5CisJc2VsZWN0IFhJTElOWF9WSVJURVgKIAogY29uZmlnIFhJTElOWF9WSVJURVgKIAlib29sCi0JZGVwZW5kcyBvbiBYSUxJTlhfVklSVEVYX0lJX1BSTyB8fCBYSUxJTlhfVklSVEVYXzRfRlgKLQlkZWZhdWx0IHkKIAogY29uZmlnIFNUQjAzeHh4CiAJYm9vbApAQCAtMjM1LDggKzIzNiw2IEBACiAKIGNvbmZpZyBFTUJFRERFREJPT1QKIAlib29sCi0JZGVwZW5kcyBvbiBFUDQwNSB8fCBYSUxJTlhfTUwzMDAgfHwgWElMSU5YX01MNDAzCi0JZGVmYXVsdCB5CiAKIGNvbmZpZyBJQk1fT1BFTkJJT1MKIAlib29sCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9wbGF0Zm9ybXMvNHh4L01ha2VmaWxlIGIvYXJjaC9wcGMvcGxhdGZvcm1zLzR4eC9NYWtlZmlsZQppbmRleCBmYTY2MTBiLi43MjNhZDc5IDEwMDY0NAotLS0gYS9hcmNoL3BwYy9wbGF0Zm9ybXMvNHh4L01ha2VmaWxlCisrKyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy80eHgvTWFrZWZpbGUKQEAgLTI4LDUgKzI4LDQgQEAKIG9iai0kKENPTkZJR180NDBTUEUpCQkrPSBwcGM0NDBzcGUubwogb2JqLSQoQ09ORklHXzQwNUVQKQkJKz0gaWJtNDA1ZXAubwogb2JqLSQoQ09ORklHXzQwNUdQUikJCSs9IGlibTQwNWdwci5vCi1vYmotJChDT05GSUdfWElMSU5YX1ZJUlRFWCkJKz0gdmlydGV4Lm8KIApkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvcGxhdGZvcm1zLzR4eC9vY290ZWEuYyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy80eHgvb2NvdGVhLmMKaW5kZXggODRlOTk5ZC4uNWU5OTRlMSAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvcGxhdGZvcm1zLzR4eC9vY290ZWEuYworKysgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvNHh4L29jb3RlYS5jCkBAIC0xNzgsNyArMTc4LDcgQEAKIAkvKiBTZXR1cCAyR0IgUENJLT5QTEIgaW5ib3VuZCBtZW1vcnkgd2luZG93IGF0IDAsIGVuYWJsZSBNU0lzICovCiAJUENJWF9XUklURUwoMHgwMDAwMDAwMCwgUENJWDBfUElNMExBSCk7CiAJUENJWF9XUklURUwoMHgwMDAwMDAwMCwgUENJWDBfUElNMExBTCk7Ci0JUENJWF9XUklURUwoMHhlMDAwMDAwNywgUENJWDBfUElNMFNBKTsKKwlQQ0lYX1dSSVRFTCgweDgwMDAwMDA3LCBQQ0lYMF9QSU0wU0EpOwogCiAJZWllaW8oKTsKIH0KQEAgLTI4OSw3ICsyODksNyBAQAogCSAqIGZyb20gRlBHQSwgYmVjYXVzZSBpdCBjYW4gYmUgY2hhbmdlZCBieSBvbi1ib2FyZCBzd2l0Y2hlcwogCSAqIC0tZWJzCiAJICovCi0JaWJtNDQwZ3hfZ2V0X2Nsb2NrcygmY2xvY2tzLCAzMzMzMzMzMywgNiAqIDE4NDMyMDApOworCWlibTQ0MGd4X2dldF9jbG9ja3MoJmNsb2NrcywgMzMzMDAwMDAsIDYgKiAxODQzMjAwKTsKIAlvY3Bfc3lzX2luZm8ub3BiX2J1c19mcmVxID0gY2xvY2tzLm9wYjsKIAogCS8qIFNldHVwIFRPREMgYWNjZXNzICovCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9wbGF0Zm9ybXMvNHh4L3RhaXNoYW4uYyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy80eHgvdGFpc2hhbi5jCmluZGV4IGJiMDI1M2UuLjVkOWFmOGQgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL3BsYXRmb3Jtcy80eHgvdGFpc2hhbi5jCisrKyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy80eHgvdGFpc2hhbi5jCkBAIC0yMzUsNyArMjM1LDcgQEAKIAkvKiBTZXR1cCAyR0IgUENJLT5QTEIgaW5ib3VuZCBtZW1vcnkgd2luZG93IGF0IDAsIGVuYWJsZSBNU0lzICovCiAJUENJWF9XUklURUwoMHgwMDAwMDAwMCwgUENJWDBfUElNMExBSCk7CiAJUENJWF9XUklURUwoMHgwMDAwMDAwMCwgUENJWDBfUElNMExBTCk7Ci0JUENJWF9XUklURUwoMHhlMDAwMDAwNywgUENJWDBfUElNMFNBKTsKKwlQQ0lYX1dSSVRFTCgweDgwMDAwMDA3LCBQQ0lYMF9QSU0wU0EpOwogCVBDSVhfV1JJVEVMKDB4ZmZmZmZmZmYsIFBDSVgwX1BJTTBTQUgpOwogCiAJaW91bm1hcChwY2l4X3JlZ19iYXNlKTsKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3BsYXRmb3Jtcy80eHgvdmlydGV4LmMgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvNHh4L3ZpcnRleC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzNhODMxLi4wMDAwMDAwCi0tLSBhL2FyY2gvcHBjL3BsYXRmb3Jtcy80eHgvdmlydGV4LmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKgotICogVmlydGV4LUlJIFBybyAmIFZpcnRleC00IEZYIGNvbW1vbiBpbmZyYXN0cnVjdHVyZQotICoKLSAqIE1haW50YWluZXI6IEdyYW50IExpa2VseSA8Z3JhbnQubGlrZWx5QHNlY3JldGxhYi5jYT4KLSAqCi0gKiBDb3B5cmlnaHQgMjAwNSBTZWNyZXQgTGFiIFRlY2hub2xvZ2llcyBMdGQuCi0gKiBDb3B5cmlnaHQgMjAwNSBHZW5lcmFsIER5bmFtaWNzIENhbmFkYSBMdGQuCi0gKiBDb3B5cmlnaHQgMjAwNSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgotICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF84MjUwLmg+Ci0jaW5jbHVkZSA8YXNtL3BwY19zeXMuaD4KLSNpbmNsdWRlIDxwbGF0Zm9ybXMvNHh4L3ZpcnRleC5oPgotI2luY2x1ZGUgPHBsYXRmb3Jtcy80eHgveHBhcmFtZXRlcnMveHBhcmFtZXRlcnMuaD4KLQotI2RlZmluZSBYUEFSX1VBUlQobnVtKSB7IFwKLQkJLm1hcGJhc2UgID0gWFBBUl9VQVJUTlM1NTBfIyNudW0jI19CQVNFQUREUiArIDMsIFwKLQkJLmlycQkgID0gWFBBUl9JTlRDXzBfVUFSVE5TNTUwXyMjbnVtIyNfVkVDX0lELCBcCi0JCS5pb3R5cGUJICA9IFVQSU9fTUVNLCBcCi0JCS51YXJ0Y2xrICA9IFhQQVJfVUFSVE5TNTUwXyMjbnVtIyNfQ0xPQ0tfRlJFUV9IWiwgXAotCQkuZmxhZ3MJICA9IFVQRl9CT09UX0FVVE9DT05GLCBcCi0JCS5yZWdzaGlmdCA9IDIsIFwKLQl9Ci0KLXN0cnVjdCBwbGF0X3NlcmlhbDgyNTBfcG9ydCBzZXJpYWxfcGxhdGZvcm1fZGF0YVtdID0gewotI2lmZGVmIFhQQVJfVUFSVE5TNTUwXzBfQkFTRUFERFIKLQlYUEFSX1VBUlQoMCksCi0jZW5kaWYKLSNpZmRlZiBYUEFSX1VBUlROUzU1MF8xX0JBU0VBRERSCi0JWFBBUl9VQVJUKDEpLAotI2VuZGlmCi0jaWZkZWYgWFBBUl9VQVJUTlM1NTBfMl9CQVNFQUREUgotCVhQQVJfVUFSVCgyKSwKLSNlbmRpZgotI2lmZGVmIFhQQVJfVUFSVE5TNTUwXzNfQkFTRUFERFIKLQlYUEFSX1VBUlQoMyksCi0jZW5kaWYKLQl7IH0sIC8qIHRlcm1pbmF0ZWQgYnkgZW1wdHkgcmVjb3JkICovCi19OwotCi1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHBwY19zeXNfcGxhdGZvcm1fZGV2aWNlc1tdID0gewotCVtWSVJURVhfVUFSVF0gPSB7Ci0JCS5uYW1lCQk9ICJzZXJpYWw4MjUwIiwKLQkJLmlkCQk9IDAsCi0JCS5kZXYucGxhdGZvcm1fZGF0YSA9IHNlcmlhbF9wbGF0Zm9ybV9kYXRhLAotCX0sCi19OwotCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9wbGF0Zm9ybXMvNHh4L3ZpcnRleC5oIGIvYXJjaC9wcGMvcGxhdGZvcm1zLzR4eC92aXJ0ZXguaAppbmRleCBjMTQzMjVkLi43MzgyODA0IDEwMDY0NAotLS0gYS9hcmNoL3BwYy9wbGF0Zm9ybXMvNHh4L3ZpcnRleC5oCisrKyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy80eHgvdmlydGV4LmgKQEAgLTEsMzUgKzEsMzUgQEAKIC8qCi0gKiBhcmNoL3BwYy9wbGF0Zm9ybXMvNHh4L3ZpcnRleC5oCisgKiBCYXNpYyBWaXJ0ZXggcGxhdGZvcm0gZGVmaW5lcywgaW5jbHVkZWQgYnkgPGFzbS9pYm00eHguaD4KICAqCi0gKiBJbmNsdWRlIGZpbGUgdGhhdCBkZWZpbmVzIHRoZSBYaWxpbnggVmlydGV4LUlJIFBybyBwcm9jZXNzb3IKKyAqIDIwMDUtMjAwNyAoYykgU2VjcmV0IExhYiBUZWNobm9sb2dpZXMgTHRkLgorICogMjAwMi0yMDA0IChjKSBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCiAgKgotICogQXV0aG9yOiBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCi0gKiAgICAgICAgIHNvdXJjZUBtdmlzdGEuY29tCi0gKgotICogMjAwMi0yMDA0IChjKSBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLiAgVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkCi0gKiAiYXMgaXMiIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIuICBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueSB3YXJyYW50eSBvZiBhbnkKKyAqIGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICovCiAKICNpZmRlZiBfX0tFUk5FTF9fCiAjaWZuZGVmIF9fQVNNX1ZJUlRFWF9IX18KICNkZWZpbmUgX19BU01fVklSVEVYX0hfXwogCi0vKiBzZXJpYWwgZGVmaW5lcyAqLwotCiAjaW5jbHVkZSA8YXNtL2libTQwNS5oPgorI2luY2x1ZGUgPGFzbS9wcGNib290Lmg+CiAKIC8qIFVnbHksIHVnbHksIHVnbHkhIEJBU0VfQkFVRCBkZWZpbmVkIGhlcmUgdG8ga2VlcCA4MjUwLmMgaGFwcHkuICovCiAjaWYgIWRlZmluZWQoQkFTRV9CQVVEKQogICNkZWZpbmUgQkFTRV9CQVVECQkoMCkgLyogZHVtbXkgdmFsdWU7IG5vdCB1c2VkICovCiAjZW5kaWYKLSAgCi0vKiBEZXZpY2UgdHlwZSBlbnVtZXJhdGlvbiBmb3IgcGxhdGZvcm0gYnVzIGRlZmluaXRpb25zICovCisKICNpZm5kZWYgX19BU1NFTUJMWV9fCi1lbnVtIHBwY19zeXNfZGV2aWNlcyB7Ci0JVklSVEVYX1VBUlQsIE5VTV9QUENfU1lTX0RFVlMsCi19OwotI2VuZGlmCi0gIAorZXh0ZXJuIGNvbnN0IGNoYXIqIHZpcnRleF9tYWNoaW5lX25hbWU7CisjZGVmaW5lIFBQQzR4eF9NQUNISU5FX05BTUUgKHZpcnRleF9tYWNoaW5lX25hbWUpCisjZW5kaWYgLyogIV9fQVNTRU1CTFlfXyAqLworCisvKiBXZSBkb24ndCBuZWVkIGFueXRoaW5nIG1hcHBlZC4gIFNpemUgb2YgemVybyB3aWxsIGFjY29tcGxpc2ggdGhhdC4gKi8KKyNkZWZpbmUgUFBDNHh4X09OQl9JT19QQUREUgkwdQorI2RlZmluZSBQUEM0eHhfT05CX0lPX1ZBRERSCTB1CisjZGVmaW5lIFBQQzR4eF9PTkJfSU9fU0laRQkwdQorCiAjZW5kaWYJCQkJLyogX19BU01fVklSVEVYX0hfXyAqLwogI2VuZGlmCQkJCS8qIF9fS0VSTkVMX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3BsYXRmb3Jtcy80eHgveGlsaW54X21sMzAwLmMgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvNHh4L3hpbGlueF9tbDMwMC5jCmluZGV4IGZiNWYwYjUuLjZlNTIyZmUgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL3BsYXRmb3Jtcy80eHgveGlsaW54X21sMzAwLmMKKysrIGIvYXJjaC9wcGMvcGxhdGZvcm1zLzR4eC94aWxpbnhfbWwzMDAuYwpAQCAtMTgsOSArMTgsOSBAQAogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbFAuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgotI2luY2x1ZGUgPGFzbS9wcGNfc3lzLmg+CiAKICNpbmNsdWRlIDxzeXNsaWIvZ2VuNTUwLmg+CisjaW5jbHVkZSA8c3lzbGliL3ZpcnRleF9kZXZpY2VzLmg+CiAjaW5jbHVkZSA8cGxhdGZvcm1zLzR4eC94cGFyYW1ldGVycy94cGFyYW1ldGVycy5oPgogCiAvKgpAQCAtNTMsMjQgKzUzLDkgQEAKICAqICAgICAgICAgIHBwYzR4eF9waWNfaW5pdAkJCWFyY2gvcHBjL3N5c2xpYi94aWxpbnhfcGljLmMKICAqLwogCi0vKiBCb2FyZCBzcGVjaWZpY2F0aW9ucyBzdHJ1Y3R1cmVzICovCi1zdHJ1Y3QgcHBjX3N5c19zcGVjICpjdXJfcHBjX3N5c19zcGVjOwotc3RydWN0IHBwY19zeXNfc3BlYyBwcGNfc3lzX3NwZWNzW10gPSB7Ci0JewotCQkvKiBPbmx5IG9uZSBlbnRyeSwgYWx3YXlzIGFzc3VtZSB0aGUgc2FtZSBkZXNpZ24gKi8KLQkJLnBwY19zeXNfbmFtZQk9ICJYaWxpbnggTUwzMDAgUmVmZXJlbmNlIERlc2lnbiIsCi0JCS5tYXNrIAkJPSAweDAwMDAwMDAwLAotCQkudmFsdWUgCQk9IDB4MDAwMDAwMDAsCi0JCS5udW1fZGV2aWNlcwk9IDEsCi0JCS5kZXZpY2VfbGlzdAk9IChlbnVtIHBwY19zeXNfZGV2aWNlc1tdKQotCQl7Ci0JCQlWSVJURVhfVUFSVCwKLQkJfSwKLQl9LAotfTsKK2NvbnN0IGNoYXIqIHZpcnRleF9tYWNoaW5lX25hbWUgPSAiTUwzMDAgUmVmZXJlbmNlIERlc2lnbiI7CiAKICNpZiBkZWZpbmVkKFhQQVJfUE9XRVJfMF9QT1dFUkRPV05fQkFTRUFERFIpCi0KIHN0YXRpYyB2b2xhdGlsZSB1bnNpZ25lZCAqcG93ZXJkb3duX2Jhc2UgPQogICAgICh2b2xhdGlsZSB1bnNpZ25lZCAqKSBYUEFSX1BPV0VSXzBfUE9XRVJET1dOX0JBU0VBRERSOwogCkBAIC05NSw1MiArODAsMTQgQEAKICNlbmRpZgogfQogCi0vKiBFYXJseSBzZXJpYWwgc3VwcG9ydCBmdW5jdGlvbnMgKi8KLXN0YXRpYyB2b2lkIF9faW5pdAotbWwzMDBfZWFybHlfc2VyaWFsX2luaXQoaW50IG51bSwgc3RydWN0IHBsYXRfc2VyaWFsODI1MF9wb3J0ICpwZGF0YSkKLXsKLSNpZiBkZWZpbmVkKENPTkZJR19TRVJJQUxfVEVYVF9ERUJVRykgfHwgZGVmaW5lZChDT05GSUdfS0dEQikKLQlzdHJ1Y3QgdWFydF9wb3J0IHNlcmlhbF9yZXE7Ci0KLQltZW1zZXQoJnNlcmlhbF9yZXEsIDAsIHNpemVvZihzZXJpYWxfcmVxKSk7Ci0Jc2VyaWFsX3JlcS5tYXBiYXNlCT0gcGRhdGEtPm1hcGJhc2U7Ci0Jc2VyaWFsX3JlcS5tZW1iYXNlCT0gcGRhdGEtPm1lbWJhc2U7Ci0Jc2VyaWFsX3JlcS5pcnEJCT0gcGRhdGEtPmlycTsKLQlzZXJpYWxfcmVxLnVhcnRjbGsJPSBwZGF0YS0+dWFydGNsazsKLQlzZXJpYWxfcmVxLnJlZ3NoaWZ0CT0gcGRhdGEtPnJlZ3NoaWZ0OwotCXNlcmlhbF9yZXEuaW90eXBlCT0gcGRhdGEtPmlvdHlwZTsKLQlzZXJpYWxfcmVxLmZsYWdzCT0gcGRhdGEtPmZsYWdzOwotCWdlbjU1MF9pbml0KG51bSwgJnNlcmlhbF9yZXEpOwotI2VuZGlmCi19Ci0KLXZvaWQgX19pbml0Ci1tbDMwMF9lYXJseV9zZXJpYWxfbWFwKHZvaWQpCi17Ci0jaWZkZWYgQ09ORklHX1NFUklBTF84MjUwCi0Jc3RydWN0IHBsYXRfc2VyaWFsODI1MF9wb3J0ICpwZGF0YTsKLQlpbnQgaSA9IDA7Ci0KLQlwZGF0YSA9IChzdHJ1Y3QgcGxhdF9zZXJpYWw4MjUwX3BvcnQgKikgcHBjX3N5c19nZXRfcGRhdGEoVklSVEVYX1VBUlQpOwotCXdoaWxlKHBkYXRhICYmIHBkYXRhLT5mbGFncykKLQl7Ci0JCXBkYXRhLT5tZW1iYXNlID0gaW9yZW1hcChwZGF0YS0+bWFwYmFzZSwgMHgxMDApOwotCQltbDMwMF9lYXJseV9zZXJpYWxfaW5pdChpLCBwZGF0YSk7Ci0JCXBkYXRhKys7Ci0JCWkrKzsKLQl9Ci0jZW5kaWYgLyogQ09ORklHX1NFUklBTF84MjUwICovCi19Ci0KIHZvaWQgX19pbml0CiBtbDMwMF9zZXR1cF9hcmNoKHZvaWQpCiB7Ci0JbWwzMDBfZWFybHlfc2VyaWFsX21hcCgpOworCXZpcnRleF9lYXJseV9zZXJpYWxfbWFwKCk7CiAJcHBjNHh4X3NldHVwX2FyY2goKTsJLyogY2FsbHMgcHBjNHh4X2ZpbmRfYnJpZGdlcygpICovCiAKIAkvKiBJZGVudGlmeSB0aGUgc3lzdGVtICovCi0JcHJpbnRrKEtFUk5fSU5GTyAiWGlsaW54IFZpcnRleC1JSSBQcm8gcG9ydFxuIik7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiUG9ydCBieSBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuIChzb3VyY2VAbXZpc3RhLmNvbSlcbiIpOworCXByaW50ayhLRVJOX0lORk8gIlhpbGlueCBNTDMwMCBSZWZlcmVuY2UgU3lzdGVtIChWaXJ0ZXgtSUkgUHJvKVxuIik7CiB9CiAKIC8qIENhbGxlZCBhZnRlciBib2FyZF9zZXR1cF9pcnEgZnJvbSBwcGM0eHhfaW5pdF9JUlEoKS4gKi8KQEAgLTE1Niw4ICsxMDMsNiBAQAogewogCXBwYzR4eF9pbml0KHIzLCByNCwgcjUsIHI2LCByNyk7CiAKLQlpZGVudGlmeV9wcGNfc3lzX2J5X2lkKG1mc3ByKFNQUk5fUFZSKSk7Ci0KIAlwcGNfbWQuc2V0dXBfYXJjaCA9IG1sMzAwX3NldHVwX2FyY2g7CiAJcHBjX21kLnNldHVwX2lvX21hcHBpbmdzID0gbWwzMDBfbWFwX2lvOwogCXBwY19tZC5pbml0X0lSUSA9IG1sMzAwX2luaXRfaXJxOwpAQCAtMTY3LDcgKzExMiw3IEBACiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19LR0RCCi0JcHBjX21kLmVhcmx5X3NlcmlhbF9tYXAgPSBtbDMwMF9lYXJseV9zZXJpYWxfbWFwOworCXBwY19tZC5lYXJseV9zZXJpYWxfbWFwID0gdmlydGV4X2Vhcmx5X3NlcmlhbF9tYXA7CiAjZW5kaWYKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvcGxhdGZvcm1zLzR4eC94aWxpbnhfbWwzMDAuaCBiL2FyY2gvcHBjL3BsYXRmb3Jtcy80eHgveGlsaW54X21sMzAwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkNTczMzIuLjAwMDAwMDAKLS0tIGEvYXJjaC9wcGMvcGxhdGZvcm1zLzR4eC94aWxpbnhfbWwzMDAuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBJbmNsdWRlIGZpbGUgdGhhdCBkZWZpbmVzIHRoZSBYaWxpbnggTUwzMDAgZXZhbHVhdGlvbiBib2FyZAotICoKLSAqIEF1dGhvcjogTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgotICogICAgICAgICBzb3VyY2VAbXZpc3RhLmNvbQotICoKLSAqIDIwMDItMjAwNCAoYykgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4gIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZAotICogImFzIGlzIiB3aXRob3V0IGFueSB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKi8KLQotI2lmZGVmIF9fS0VSTkVMX18KLSNpZm5kZWYgX19BU01fWElMSU5YX01MMzAwX0hfXwotI2RlZmluZSBfX0FTTV9YSUxJTlhfTUwzMDBfSF9fCi0KLS8qIE1MMzAwIGhhcyBhIFhpbGlueCBWaXJ0ZXgtSUkgUHJvIHByb2Nlc3NvciAqLwotI2luY2x1ZGUgPHBsYXRmb3Jtcy80eHgvdmlydGV4Lmg+Ci0KLSNpZm5kZWYgX19BU1NFTUJMWV9fCi0KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotCi10eXBlZGVmIHN0cnVjdCBib2FyZF9pbmZvIHsKLQl1bnNpZ25lZCBpbnQJIGJpX21lbXNpemU7CQkvKiBEUkFNIGluc3RhbGxlZCwgaW4gYnl0ZXMgKi8KLQl1bnNpZ25lZCBjaGFyCSBiaV9lbmV0YWRkcls2XTsJLyogTG9jYWwgRXRoZXJuZXQgTUFDIGFkZHJlc3MgKi8KLQl1bnNpZ25lZCBpbnQJIGJpX2ludGZyZXE7CQkvKiBQcm9jZXNzb3Igc3BlZWQsIGluIEh6ICovCi0JdW5zaWduZWQgaW50CSBiaV9idXNmcmVxOwkJLyogUExCIEJ1cyBzcGVlZCwgaW4gSHogKi8KLQl1bnNpZ25lZCBpbnQJIGJpX3BjaV9idXNmcmVxOwkvKiBQQ0kgQnVzIHNwZWVkLCBpbiBIeiAqLwotfSBiZF90OwotCi0vKiBTb21lIDR4eCBwYXJ0cyB1c2UgYSBkaWZmZXJlbnQgdGltZWJhc2UgZnJlcXVlbmN5IGZyb20gdGhlIGludGVybmFsIGNsb2NrLgotKi8KLSNkZWZpbmUgYmlfdGJmcmVxIGJpX2ludGZyZXEKLQotI2VuZGlmIC8qICFfX0FTU0VNQkxZX18gKi8KLQotLyogV2UgZG9uJ3QgbmVlZCBhbnl0aGluZyBtYXBwZWQuICBTaXplIG9mIHplcm8gd2lsbCBhY2NvbXBsaXNoIHRoYXQuICovCi0jZGVmaW5lIFBQQzR4eF9PTkJfSU9fUEFERFIJMHUKLSNkZWZpbmUgUFBDNHh4X09OQl9JT19WQUREUgkwdQotI2RlZmluZSBQUEM0eHhfT05CX0lPX1NJWkUJMHUKLQotI2RlZmluZSBQUEM0eHhfTUFDSElORV9OQU1FICJYaWxpbnggTUwzMDAgUmVmZXJlbmNlIFN5c3RlbSIKLQotI2VuZGlmIC8qIF9fQVNNX1hJTElOWF9NTDMwMF9IX18gKi8KLSNlbmRpZiAvKiBfX0tFUk5FTF9fICovCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9wbGF0Zm9ybXMvNHh4L3hpbGlueF9tbDQwMy5jIGIvYXJjaC9wcGMvcGxhdGZvcm1zLzR4eC94aWxpbnhfbWw0MDMuYwppbmRleCBjYjNiZjdhLi5iYzNhY2UzIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9wbGF0Zm9ybXMvNHh4L3hpbGlueF9tbDQwMy5jCisrKyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy80eHgveGlsaW54X21sNDAzLmMKQEAgLTEsMTEgKzEsOSBAQAogLyoKLSAqIGFyY2gvcHBjL3BsYXRmb3Jtcy80eHgveGlsaW54X21sNDAzLmMKLSAqCiAgKiBYaWxpbnggTUw0MDMgZXZhbHVhdGlvbiBib2FyZCBpbml0aWFsaXphdGlvbgogICoKICAqIEF1dGhvcjogR3JhbnQgTGlrZWx5IDxncmFudC5saWtlbHlAc2VjcmV0bGFiLmNhPgogICoKLSAqIDIwMDUgKGMpIFNlY3JldCBMYWIgVGVjaG5vbG9naWVzIEx0ZC4KKyAqIDIwMDUtMjAwNyAoYykgU2VjcmV0IExhYiBUZWNobm9sb2dpZXMgTHRkLgogICogMjAwMi0yMDA0IChjKSBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCiAgKgogICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKQEAgLTIyLDkgKzIwLDkgQEAKICNpbmNsdWRlIDxsaW51eC9zZXJpYWxQLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KLSNpbmNsdWRlIDxhc20vcHBjX3N5cy5oPgogCiAjaW5jbHVkZSA8c3lzbGliL2dlbjU1MC5oPgorI2luY2x1ZGUgPHN5c2xpYi92aXJ0ZXhfZGV2aWNlcy5oPgogI2luY2x1ZGUgPHBsYXRmb3Jtcy80eHgveHBhcmFtZXRlcnMveHBhcmFtZXRlcnMuaD4KIAogLyoKQEAgLTU3LDI0ICs1NSw5IEBACiAgKiAgICAgICAgICBwcGM0eHhfcGljX2luaXQJCQlhcmNoL3BwYy9zeXNsaWIveGlsaW54X3BpYy5jCiAgKi8KIAotLyogQm9hcmQgc3BlY2lmaWNhdGlvbnMgc3RydWN0dXJlcyAqLwotc3RydWN0IHBwY19zeXNfc3BlYyAqY3VyX3BwY19zeXNfc3BlYzsKLXN0cnVjdCBwcGNfc3lzX3NwZWMgcHBjX3N5c19zcGVjc1tdID0gewotCXsKLQkJLyogT25seSBvbmUgZW50cnksIGFsd2F5cyBhc3N1bWUgdGhlIHNhbWUgZGVzaWduICovCi0JCS5wcGNfc3lzX25hbWUJPSAiWGlsaW54IE1MNDAzIFJlZmVyZW5jZSBEZXNpZ24iLAotCQkubWFzayAJCT0gMHgwMDAwMDAwMCwKLQkJLnZhbHVlIAkJPSAweDAwMDAwMDAwLAotCQkubnVtX2RldmljZXMJPSAxLAotCQkuZGV2aWNlX2xpc3QJPSAoZW51bSBwcGNfc3lzX2RldmljZXNbXSkKLQkJewotCQkJVklSVEVYX1VBUlQsCi0JCX0sCi0JfSwKLX07Citjb25zdCBjaGFyKiB2aXJ0ZXhfbWFjaGluZV9uYW1lID0gIk1MNDAzIFJlZmVyZW5jZSBEZXNpZ24iOwogCiAjaWYgZGVmaW5lZChYUEFSX1BPV0VSXzBfUE9XRVJET1dOX0JBU0VBRERSKQotCiBzdGF0aWMgdm9sYXRpbGUgdW5zaWduZWQgKnBvd2VyZG93bl9iYXNlID0KICAgICAodm9sYXRpbGUgdW5zaWduZWQgKikgWFBBUl9QT1dFUl8wX1BPV0VSRE9XTl9CQVNFQUREUjsKIApAQCAtOTksNDcgKzgyLDEwIEBACiAjZW5kaWYKIH0KIAotLyogRWFybHkgc2VyaWFsIHN1cHBvcnQgZnVuY3Rpb25zICovCi1zdGF0aWMgdm9pZCBfX2luaXQKLW1sNDAzX2Vhcmx5X3NlcmlhbF9pbml0KGludCBudW0sIHN0cnVjdCBwbGF0X3NlcmlhbDgyNTBfcG9ydCAqcGRhdGEpCi17Ci0jaWYgZGVmaW5lZChDT05GSUdfU0VSSUFMX1RFWFRfREVCVUcpIHx8IGRlZmluZWQoQ09ORklHX0tHREIpCi0Jc3RydWN0IHVhcnRfcG9ydCBzZXJpYWxfcmVxOwotCi0JbWVtc2V0KCZzZXJpYWxfcmVxLCAwLCBzaXplb2Yoc2VyaWFsX3JlcSkpOwotCXNlcmlhbF9yZXEubWFwYmFzZQk9IHBkYXRhLT5tYXBiYXNlOwotCXNlcmlhbF9yZXEubWVtYmFzZQk9IHBkYXRhLT5tZW1iYXNlOwotCXNlcmlhbF9yZXEuaXJxCQk9IHBkYXRhLT5pcnE7Ci0Jc2VyaWFsX3JlcS51YXJ0Y2xrCT0gcGRhdGEtPnVhcnRjbGs7Ci0Jc2VyaWFsX3JlcS5yZWdzaGlmdAk9IHBkYXRhLT5yZWdzaGlmdDsKLQlzZXJpYWxfcmVxLmlvdHlwZQk9IHBkYXRhLT5pb3R5cGU7Ci0Jc2VyaWFsX3JlcS5mbGFncwk9IHBkYXRhLT5mbGFnczsKLQlnZW41NTBfaW5pdChudW0sICZzZXJpYWxfcmVxKTsKLSNlbmRpZgotfQotCi12b2lkIF9faW5pdAotbWw0MDNfZWFybHlfc2VyaWFsX21hcCh2b2lkKQotewotI2lmZGVmIENPTkZJR19TRVJJQUxfODI1MAotCXN0cnVjdCBwbGF0X3NlcmlhbDgyNTBfcG9ydCAqcGRhdGE7Ci0JaW50IGkgPSAwOwotCi0JcGRhdGEgPSAoc3RydWN0IHBsYXRfc2VyaWFsODI1MF9wb3J0ICopIHBwY19zeXNfZ2V0X3BkYXRhKFZJUlRFWF9VQVJUKTsKLQl3aGlsZShwZGF0YSAmJiBwZGF0YS0+ZmxhZ3MpCi0JewotCQlwZGF0YS0+bWVtYmFzZSA9IGlvcmVtYXAocGRhdGEtPm1hcGJhc2UsIDB4MTAwKTsKLQkJbWw0MDNfZWFybHlfc2VyaWFsX2luaXQoaSwgcGRhdGEpOwotCQlwZGF0YSsrOwotCQlpKys7Ci0JfQotI2VuZGlmIC8qIENPTkZJR19TRVJJQUxfODI1MCAqLwotfQotCiB2b2lkIF9faW5pdAogbWw0MDNfc2V0dXBfYXJjaCh2b2lkKQogewotCW1sNDAzX2Vhcmx5X3NlcmlhbF9tYXAoKTsKKwl2aXJ0ZXhfZWFybHlfc2VyaWFsX21hcCgpOwogCXBwYzR4eF9zZXR1cF9hcmNoKCk7CS8qIGNhbGxzIHBwYzR4eF9maW5kX2JyaWRnZXMoKSAqLwogCiAJLyogSWRlbnRpZnkgdGhlIHN5c3RlbSAqLwpAQCAtMTU5LDggKzEwNSw2IEBACiB7CiAJcHBjNHh4X2luaXQocjMsIHI0LCByNSwgcjYsIHI3KTsKIAotCWlkZW50aWZ5X3BwY19zeXNfYnlfaWQobWZzcHIoU1BSTl9QVlIpKTsKLQogCXBwY19tZC5zZXR1cF9hcmNoID0gbWw0MDNfc2V0dXBfYXJjaDsKIAlwcGNfbWQuc2V0dXBfaW9fbWFwcGluZ3MgPSBtbDQwM19tYXBfaW87CiAJcHBjX21kLmluaXRfSVJRID0gbWw0MDNfaW5pdF9pcnE7CkBAIC0xNzAsNyArMTE0LDcgQEAKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0tHREIKLQlwcGNfbWQuZWFybHlfc2VyaWFsX21hcCA9IG1sNDAzX2Vhcmx5X3NlcmlhbF9tYXA7CisJcHBjX21kLmVhcmx5X3NlcmlhbF9tYXAgPSB2aXJ0ZXhfZWFybHlfc2VyaWFsX21hcDsKICNlbmRpZgogfQogCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9wbGF0Zm9ybXMvNHh4L3hpbGlueF9tbDQwMy5oIGIvYXJjaC9wcGMvcGxhdGZvcm1zLzR4eC94aWxpbnhfbWw0MDMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDczNTk2OS4uMDAwMDAwMAotLS0gYS9hcmNoL3BwYy9wbGF0Zm9ybXMvNHh4L3hpbGlueF9tbDQwMy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoKLSAqIGFyY2gvcHBjL3BsYXRmb3Jtcy80eHgveGlsaW54X21sNDAzLmgKLSAqCi0gKiBJbmNsdWRlIGZpbGUgdGhhdCBkZWZpbmVzIHRoZSBYaWxpbnggTUw0MDMgcmVmZXJlbmNlIGRlc2lnbgotICoKLSAqIEF1dGhvcjogR3JhbnQgTGlrZWx5IDxncmFudC5saWtlbHlAc2VjcmV0bGFiLmNhPgotICoKLSAqIDIwMDUgKGMpIFNlY3JldCBMYWIgVGVjaG5vbG9naWVzIEx0ZC4KLSAqIDIwMDItMjAwNCAoYykgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgotICoKLSAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIuICBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueSB3YXJyYW50eSBvZiBhbnkKLSAqIGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICovCi0KLSNpZmRlZiBfX0tFUk5FTF9fCi0jaWZuZGVmIF9fQVNNX1hJTElOWF9NTDQwM19IX18KLSNkZWZpbmUgX19BU01fWElMSU5YX01MNDAzX0hfXwotCi0vKiBNTDQwMyBoYXMgYSBYaWxpbnggVmlydGV4LTQgRlBHQSB3aXRoIGEgUFBDNDA1IGhhcmQgY29yZSAqLwotI2luY2x1ZGUgPHBsYXRmb3Jtcy80eHgvdmlydGV4Lmg+Ci0KLSNpZm5kZWYgX19BU1NFTUJMWV9fCi0KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotCi10eXBlZGVmIHN0cnVjdCBib2FyZF9pbmZvIHsKLQl1bnNpZ25lZCBpbnQJIGJpX21lbXNpemU7CQkvKiBEUkFNIGluc3RhbGxlZCwgaW4gYnl0ZXMgKi8KLQl1bnNpZ25lZCBjaGFyCSBiaV9lbmV0YWRkcls2XTsJLyogTG9jYWwgRXRoZXJuZXQgTUFDIGFkZHJlc3MgKi8KLQl1bnNpZ25lZCBpbnQJIGJpX2ludGZyZXE7CQkvKiBQcm9jZXNzb3Igc3BlZWQsIGluIEh6ICovCi0JdW5zaWduZWQgaW50CSBiaV9idXNmcmVxOwkJLyogUExCIEJ1cyBzcGVlZCwgaW4gSHogKi8KLQl1bnNpZ25lZCBpbnQJIGJpX3BjaV9idXNmcmVxOwkvKiBQQ0kgQnVzIHNwZWVkLCBpbiBIeiAqLwotfSBiZF90OwotCi0vKiBTb21lIDR4eCBwYXJ0cyB1c2UgYSBkaWZmZXJlbnQgdGltZWJhc2UgZnJlcXVlbmN5IGZyb20gdGhlIGludGVybmFsIGNsb2NrLgotKi8KLSNkZWZpbmUgYmlfdGJmcmVxIGJpX2ludGZyZXEKLQotI2VuZGlmIC8qICFfX0FTU0VNQkxZX18gKi8KLQotLyogV2UgZG9uJ3QgbmVlZCBhbnl0aGluZyBtYXBwZWQuICBTaXplIG9mIHplcm8gd2lsbCBhY2NvbXBsaXNoIHRoYXQuICovCi0jZGVmaW5lIFBQQzR4eF9PTkJfSU9fUEFERFIJMHUKLSNkZWZpbmUgUFBDNHh4X09OQl9JT19WQUREUgkwdQotI2RlZmluZSBQUEM0eHhfT05CX0lPX1NJWkUJMHUKLQotI2RlZmluZSBQUEM0eHhfTUFDSElORV9OQU1FICJYaWxpbnggTUw0MDMgUmVmZXJlbmNlIERlc2lnbiIKLQotI2VuZGlmIC8qIF9fQVNNX1hJTElOWF9NTDQwM19IX18gKi8KLSNlbmRpZiAvKiBfX0tFUk5FTF9fICovCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9wbGF0Zm9ybXMvNHh4L3hwYXJhbWV0ZXJzL3hwYXJhbWV0ZXJzLmggYi9hcmNoL3BwYy9wbGF0Zm9ybXMvNHh4L3hwYXJhbWV0ZXJzL3hwYXJhbWV0ZXJzLmgKaW5kZXggNjZlYzVmMy4uMDFhYTA0MyAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvcGxhdGZvcm1zLzR4eC94cGFyYW1ldGVycy94cGFyYW1ldGVycy5oCisrKyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy80eHgveHBhcmFtZXRlcnMveHBhcmFtZXRlcnMuaApAQCAtMzQsMyArMzQsNjMgQEAKIAkuaW9fdHlwZQkgPSBTRVJJQUxfSU9fTUVNLAkJCQlcCiAgIH0sCiAjZW5kaWYKKworLyoKKyAqIEEgZmV3IHJlYXNvbmFibGUgZGVmYXVsdHMgZm9yIHRoZSAjZGVmaW5lcyB3aGljaCBjb3VsZCBiZSBtaXNzaW5nIGRlcGVuZGluZworICogb24gdGhlIElQIHZlcnNpb24gb3IgdmFyaWFudCAoZS5nLiBPUEIgdnMgUExCKQorICovCisKKyNpZm5kZWYgWFBBUl9FTUFDXzBfQ0FNX0VYSVNUCisjZGVmaW5lIFhQQVJfRU1BQ18wX0NBTV9FWElTVCAwCisjZW5kaWYKKyNpZm5kZWYgWFBBUl9FTUFDXzBfSlVNQk9fRVhJU1QKKyNkZWZpbmUgWFBBUl9FTUFDXzBfSlVNQk9fRVhJU1QgMAorI2VuZGlmCisjaWZuZGVmIFhQQVJfRU1BQ18wX1RYX0RSRV9UWVBFCisjZGVmaW5lIFhQQVJfRU1BQ18wX1RYX0RSRV9UWVBFIDAKKyNlbmRpZgorI2lmbmRlZiBYUEFSX0VNQUNfMF9SWF9EUkVfVFlQRQorI2RlZmluZSBYUEFSX0VNQUNfMF9SWF9EUkVfVFlQRSAwCisjZW5kaWYKKyNpZm5kZWYgWFBBUl9FTUFDXzBfVFhfSU5DTFVERV9DU1VNCisjZGVmaW5lIFhQQVJfRU1BQ18wX1RYX0lOQ0xVREVfQ1NVTSAwCisjZW5kaWYKKyNpZm5kZWYgWFBBUl9FTUFDXzBfUlhfSU5DTFVERV9DU1VNCisjZGVmaW5lIFhQQVJfRU1BQ18wX1JYX0lOQ0xVREVfQ1NVTSAwCisjZW5kaWYKKworI2lmbmRlZiBYUEFSX0VNQUNfMV9DQU1fRVhJU1QKKyNkZWZpbmUgWFBBUl9FTUFDXzFfQ0FNX0VYSVNUIDAKKyNlbmRpZgorI2lmbmRlZiBYUEFSX0VNQUNfMV9KVU1CT19FWElTVAorI2RlZmluZSBYUEFSX0VNQUNfMV9KVU1CT19FWElTVCAwCisjZW5kaWYKKyNpZm5kZWYgWFBBUl9FTUFDXzFfVFhfRFJFX1RZUEUKKyNkZWZpbmUgWFBBUl9FTUFDXzFfVFhfRFJFX1RZUEUgMAorI2VuZGlmCisjaWZuZGVmIFhQQVJfRU1BQ18xX1JYX0RSRV9UWVBFCisjZGVmaW5lIFhQQVJfRU1BQ18xX1JYX0RSRV9UWVBFIDAKKyNlbmRpZgorI2lmbmRlZiBYUEFSX0VNQUNfMV9UWF9JTkNMVURFX0NTVU0KKyNkZWZpbmUgWFBBUl9FTUFDXzFfVFhfSU5DTFVERV9DU1VNIDAKKyNlbmRpZgorI2lmbmRlZiBYUEFSX0VNQUNfMV9SWF9JTkNMVURFX0NTVU0KKyNkZWZpbmUgWFBBUl9FTUFDXzFfUlhfSU5DTFVERV9DU1VNIDAKKyNlbmRpZgorCisjaWZuZGVmIFhQQVJfR1BJT18wX0lTX0RVQUwKKyNkZWZpbmUgWFBBUl9HUElPXzBfSVNfRFVBTCAwCisjZW5kaWYKKyNpZm5kZWYgWFBBUl9HUElPXzFfSVNfRFVBTAorI2RlZmluZSBYUEFSX0dQSU9fMV9JU19EVUFMIDAKKyNlbmRpZgorI2lmbmRlZiBYUEFSX0dQSU9fMl9JU19EVUFMCisjZGVmaW5lIFhQQVJfR1BJT18yX0lTX0RVQUwgMAorI2VuZGlmCisjaWZuZGVmIFhQQVJfR1BJT18zX0lTX0RVQUwKKyNkZWZpbmUgWFBBUl9HUElPXzNfSVNfRFVBTCAwCisjZW5kaWYKKyNpZm5kZWYgWFBBUl9HUElPXzRfSVNfRFVBTAorI2RlZmluZSBYUEFSX0dQSU9fNF9JU19EVUFMIDAKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9wbGF0Zm9ybXMvcnB4Y2xhc3NpYy5oIGIvYXJjaC9wcGMvcGxhdGZvcm1zL3JweGNsYXNzaWMuaAppbmRleCA1N2EyYTU1Li5hM2MxMTE4IDEwMDY0NAotLS0gYS9hcmNoL3BwYy9wbGF0Zm9ybXMvcnB4Y2xhc3NpYy5oCisrKyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy9ycHhjbGFzc2ljLmgKQEAgLTY5LDEwICs2OSw2IEBACiAjZGVmaW5lIEJDU1IyX1FTUEFDRVNFTAkJKCh1aW50KTB4MDAwMDQwMDApCiAjZGVmaW5lIEJDU1IyX0ZFVEhMRURNT0RFCSgodWludCkweDAwMDAwODAwKQkvKiBDTExGICovCiAKLSNpZiBkZWZpbmVkKENPTkZJR19IVERNU09VTkQpCi0jaW5jbHVkZSA8cGxhdGZvcm1zL3JweGhpb3guaD4KLSNlbmRpZgotCiAvKiBkZWZpbmUgSU9fQkFTRSBmb3IgcGNtY2lhLCBDTExGIG9ubHkgKi8KICNpZiAhZGVmaW5lZChDT05GSUdfUENJKQogI2RlZmluZSBfSU9fQkFTRSAweDgwMDAwMDAwCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9wbGF0Zm9ybXMvcnB4aGlveC5oIGIvYXJjaC9wcGMvcGxhdGZvcm1zL3JweGhpb3guaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNmYTVhNi4uMDAwMDAwMAotLS0gYS9hcmNoL3BwYy9wbGF0Zm9ybXMvcnB4aGlveC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqIFRoZSBFbWJlZGRlZCBQbGFuZXQgSElPWCBleHBhbnNpb24gY2FyZCBkZWZpbml0aW9ucy4KLSAqIFRoZXJlIHdlcmUgYSBmZXcgZGlmZmVyZW50IHZlcnNpb25zIG9mIHRoZXNlIGNhcmRzLCBidXQgb25seQotICogdGhlIG9uZSB0aGF0IGVzY2FwZWQgcmVhbCBwcm9kdWN0aW9uIGlzIGRlZmluZWQgaGVyZS4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgRGFuIE1hbGVrIChkbWFsZWtAamxjLm5ldCkKLSAqLwotI2lmbmRlZiBfX01BQ0hfUlBYX0hJT1hfREVGUwotI2RlZmluZSBfX01BQ0hfUlBYX0hJT1hfREVGUwotCi0jZGVmaW5lIEhJT1hfQ1NSX0FERFIJCSgodWludCkweGZhYzAwMDAwKQotI2RlZmluZSBISU9YX0NTUl9TSVpFCQkoKHVpbnQpKDQgKiAxMDI0KSkKLSNkZWZpbmUgSElPWF9DU1IwX0FERFIJCUhJT1hfQ1NSX0FERFIKLSNkZWZpbmUgSElPWF9DU1I0X0FERFIJCSgodWludCkweGZhYzAwMDA0KQotCi0jZGVmaW5lIEhJT1hfQ1NSMF9ERUZBVUxUCSgodWludCkweDM4MGYzYzAwKQotI2RlZmluZSBISU9YX0NTUjBfRU5TQ0MyCSgodWludCkweDgwMDAwMDAwKQotI2RlZmluZSBISU9YX0NTUjBfRU5TTUMyCSgodWludCkweDA0MDAwMDAwKQotI2RlZmluZSBISU9YX0NTUjBfRU5WRE9DTEsJKCh1aW50KTB4MDIwMDAwMDApCi0jZGVmaW5lIEhJT1hfQ1NSMF9WRE9SU1RfSEwJKCh1aW50KTB4MDEwMDAwMDApCi0jZGVmaW5lIEhJT1hfQ1NSMF9SUzIzMlNFTAkoKHVpbnQpMHgwMDAwYzAwMCkKLSNkZWZpbmUgSElPWF9DU1IwX1NDQzNTRUwJKCh1aW50KTB4MDAwMGMwMDApCi0jZGVmaW5lIEhJT1hfQ1NSMF9TTUMxU0VMCSgodWludCkweDAwMDA4MDAwKQotI2RlZmluZSBISU9YX0NTUjBfU0NDMVNFTAkoKHVpbnQpMHgwMDAwNDAwMCkKLSNkZWZpbmUgSElPWF9DU1IwX0VOVE9VQ0gJKCh1aW50KTB4MDAwMDAwODApCi0jZGVmaW5lIEhJT1hfQ1NSMF9QRE9XTjEwMAkoKHVpbnQpMHgwMDAwMDA2MCkKLSNkZWZpbmUgSElPWF9DU1IwX1BET1dOMTAJKCh1aW50KTB4MDAwMDAwNDApCi0jZGVmaW5lIEhJT1hfQ1NSMF9QRE9XTjEJKCh1aW50KTB4MDAwMDAwMjApCi0jZGVmaW5lIEhJT1hfQ1NSMF9UU0VMU1BJCSgodWludCkweDAwMDAwMDEwKQotI2RlZmluZSBISU9YX0NTUjBfVElSUVNUQVQJKCh1aW50KTB4MDAwMDAwMDgpCi0jZGVmaW5lIEhJT1hfQ1NSNF9ERUZBVUxUCSgodWludCkweDAwMDAwMDAwKQotI2RlZmluZSBISU9YX0NTUjRfRU5USVJRMgkoKHVpbnQpMHgyMDAwMDAwMCkKLSNkZWZpbmUgSElPWF9DU1I0X0VOVElSUTMJKCh1aW50KTB4MTAwMDAwMDApCi0jZGVmaW5lIEhJT1hfQ1NSNF9FTkFVRElPCSgodWludCkweDAwMDAwMDgwKQotI2RlZmluZSBISU9YX0NTUjRfUlNUQVVESU8JKCh1aW50KTB4MDAwMDAwNDApCS8qIDAgPT0gcmVzZXQgKi8KLSNkZWZpbmUgSElPWF9DU1I0X0FVRENMS0hJCSgodWludCkweDAwMDAwMDIwKQotI2RlZmluZSBISU9YX0NTUjRfQVVEU1BJU0VMCSgodWludCkweDAwMDAwMDEwKQotI2RlZmluZSBISU9YX0NTUjRfQVVESVJRU1RBVAkoKHVpbnQpMHgwMDAwMDAwOCkKLSNkZWZpbmUgSElPWF9DU1I0X0FVRENMS1NFTAkoKHVpbnQpMHgwMDAwMDAwNykKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9wbGF0Zm9ybXMvcnB4bGl0ZS5oIGIvYXJjaC9wcGMvcGxhdGZvcm1zL3JweGxpdGUuaAppbmRleCA3MTk3ODA2Li5iNjE1NTAxIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9wbGF0Zm9ybXMvcnB4bGl0ZS5oCisrKyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy9ycHhsaXRlLmgKQEAgLTU3LDEwICs1Nyw2IEBACiAjZGVmaW5lIEJDU1IxX1BDVkNUTDYgICAgICAgICAgKCh1aW50KTB4MDAwMjAwMDApCiAjZGVmaW5lIEJDU1IxX1BDVkNUTDcgICAgICAgICAgKCh1aW50KTB4MDAwMTAwMDApCiAKLSNpZiBkZWZpbmVkKENPTkZJR19IVERNU09VTkQpCi0jaW5jbHVkZSA8cGxhdGZvcm1zL3JweGhpb3guaD4KLSNlbmRpZgotCiAvKiBkZWZpbmUgSU9fQkFTRSBmb3IgcGNtY2lhICovCiAjZGVmaW5lIF9JT19CQVNFIDB4ODAwMDAwMDAKICNkZWZpbmUgX0lPX0JBU0VfU0laRSAweDEwMDAKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3N5c2xpYi9NYWtlZmlsZSBiL2FyY2gvcHBjL3N5c2xpYi9NYWtlZmlsZQppbmRleCAwOTkxMTExLi45NTY5NDE1OSAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvc3lzbGliL01ha2VmaWxlCisrKyBiL2FyY2gvcHBjL3N5c2xpYi9NYWtlZmlsZQpAQCAtMTgsNyArMTgsOCBAQAogb2JqLSQoQ09ORklHXzQ0MFNQRSkJCSs9IGlibTQ0MGd4X2NvbW1vbi5vIGlibTQ0MHNwX2NvbW1vbi5vIHBwYzQ0MHNwZV9wY2llLm8KIGlmZXEgKCQoQ09ORklHXzR4eCkseSkKIGlmZXEgKCQoQ09ORklHX1hJTElOWF9WSVJURVgpLHkpCi1vYmotJChDT05GSUdfNDB4KQkJKz0geGlsaW54X3BpYy5vIHBwY19zeXMubworb2JqLSQoQ09ORklHXzQweCkJCSs9IHhpbGlueF9waWMubworb2JqLXkJCQkJKz0gdmlydGV4X2RldmljZXMubwogZWxzZQogaWZlcSAoJChDT05GSUdfNDAzKSx5KQogb2JqLSQoQ09ORklHXzQweCkJCSs9IHBwYzQwM19waWMubwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvc3lzbGliL2NwYzcxMC5oIGIvYXJjaC9wcGMvc3lzbGliL2NwYzcxMC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Mjk5YmY4Li4wMDAwMDAwCi0tLSBhL2FyY2gvcHBjL3N5c2xpYi9jcGM3MTAuaAorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qCi0gKiBEZWZpbml0aW9ucyBmb3IgdGhlIElCTSBDUEM3MTAgUENJIEhvc3QgQnJpZGdlCi0gKgotICogQXV0aG9yOiBNYXR0IFBvcnRlciA8bXBvcnRlckBtdmlzdGEuY29tPgotICoKLSAqIDIwMDEgKGMpIE1vbnRhVmlzdGEsIFNvZnR3YXJlLCBJbmMuICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIKLSAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLiAgVGhpcyBwcm9ncmFtCi0gKiBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3MKLSAqIG9yIGltcGxpZWQuCi0gKi8KLQotI2lmbmRlZiBfX1BQQ19QTEFURk9STVNfQ1BDNzEwX0gKLSNkZWZpbmUgX19QUENfUExBVEZPUk1TX0NQQzcxMF9ICi0KLS8qIEdlbmVyYWwgYnJpZGdlIGFuZCBtZW1vcnkgY29udHJvbGxlciByZWdpc3RlcnMgKi8KLSNkZWZpbmUgUElEUgkweGZmMDAwMDA4Ci0jZGVmaW5lCUNORlIJMHhmZjAwMDAwYwotI2RlZmluZQlSU1RSCTB4ZmYwMDAwMTAKLSNkZWZpbmUgVUNUTAkweGZmMDAxMDAwCi0jZGVmaW5lCU1QU1IJMHhmZjAwMTAxMAotI2RlZmluZQlTSU9DCTB4ZmYwMDEwMjAKLSNkZWZpbmUJQUJDTlRMCTB4ZmYwMDEwMzAKLSNkZWZpbmUgU1JTVAkweGZmMDAxMDQwCi0jZGVmaW5lCUVSUkMJMHhmZjAwMTA1MAotI2RlZmluZQlTRVNSCTB4ZmYwMDEwNjAKLSNkZWZpbmUJU0VBUgkweGZmMDAxMDcwCi0jZGVmaW5lCVNJT0MxCTB4ZmYwMDEwOTAKLSNkZWZpbmUJUEdDSFAJMHhmZjAwMTEwMAotI2RlZmluZQlHUERJUgkweGZmMDAxMTMwCi0jZGVmaW5lCUdQT1VUCTB4ZmYwMDExNTAKLSNkZWZpbmUJQVRBUwkweGZmMDAxMTYwCi0jZGVmaW5lCUFWREcJMHhmZjAwMTE3MAotI2RlZmluZQlNQ0NSCTB4ZmYwMDEyMDAKLSNkZWZpbmUJTUVTUgkweGZmMDAxMjIwCi0jZGVmaW5lCU1FQVIJMHhmZjAwMTIzMAotI2RlZmluZQlNQ0VSMAkweGZmMDAxMzAwCi0jZGVmaW5lCU1DRVIxCTB4ZmYwMDEzMTAKLSNkZWZpbmUJTUNFUjIJMHhmZjAwMTMyMAotI2RlZmluZQlNQ0VSMwkweGZmMDAxMzMwCi0jZGVmaW5lCU1DRVI0CTB4ZmYwMDEzNDAKLSNkZWZpbmUJTUNFUjUJMHhmZjAwMTM1MAotI2RlZmluZQlNQ0VSNgkweGZmMDAxMzYwCi0jZGVmaW5lCU1DRVI3CTB4ZmYwMDEzNzAKLQotLyoKLSAqIFBDSTMyLzY0IGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzCi0gKiBHaXZlbiBhcyBvZmZzZXRzIGZyb20gdGhlaXIKLSAqIHJlc3BlY3RpdmUgcGh5c2ljYWwgc2VnbWVudCBCQVIKLSAqLwotI2RlZmluZSBQSUJBUgkweDAwMGY3ODAwCi0jZGVmaW5lIFBNQkFSCTB4MDAwZjc4MTAKLSNkZWZpbmUgTVNJWkUJMHgwMDBmN2Y0MAotI2RlZmluZSBJT1NJWkUJMHgwMDBmN2Y2MAotI2RlZmluZSBTTUJBUgkweDAwMGY3ZjgwCi0jZGVmaW5lIFNJQkFSCTB4MDAwZjdmYzAKLSNkZWZpbmUgUFNTSVpFCTB4MDAwZjgxMDAKLSNkZWZpbmUgUFBTSVpFCTB4MDAwZjgxMTAKLSNkZWZpbmUgQkFSUFMJMHgwMDBmODEyMAotI2RlZmluZSBCQVJQUAkweDAwMGY4MTMwCi0jZGVmaW5lIFBTQkFSCTB4MDAwZjgxNDAKLSNkZWZpbmUgUFBCQVIJMHgwMDBmODE1MAotI2RlZmluZSBCUE1ETEsJMHgwMDBmODIwMCAgICAgIC8qIEJvdHRvbSBvZiBQZXJpcGhlcmFsIE1lbW9yeSBTcGFjZSAqLwotI2RlZmluZSBUUE1ETEsJMHgwMDBmODIxMCAgICAgIC8qIFRvcCBvZiBQZXJpcGhlcmFsIE1lbW9yeSBTcGFjZSAqLwotI2RlZmluZSBCSU9ETEsJMHgwMDBmODIyMCAgICAgIC8qIEJvdHRvbSBvZiBQZXJpcGhlcmFsIEkvTyBTcGFjZSAqLwotI2RlZmluZSBUSU9ETEsJMHgwMDBmODIzMCAgICAgIC8qIFRvcCBvZiBQZXJpb2hlcmFsIEkvTyBTcGFjZSAqLwotI2RlZmluZSBETEtDVFJMCTB4MDAwZjgyNDAgICAgICAvKiBEZWFkbG9jayBjb250cm9sICovCi0jZGVmaW5lIERMS0RFVgkweDAwMGY4MjUwICAgICAgLyogRGVhZGxvY2sgZGV2aWNlICovCi0KLS8qIFN5c3RlbSBzdGFuZGFyZCBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyBzcGFjZSAqLwotI2RlZmluZQlEQ1IJMHhmZjIwMDAwMAotI2RlZmluZQlESUQJMHhmZjIwMDAwNAotI2RlZmluZQlCQVIJMHhmZjIwMDAxOAotCi0vKiBEZXZpY2Ugc3BlY2lmaWMgY29uZmlndXJhdGlvbiBzcGFjZSAqLwotI2RlZmluZQlQQ0lFTkIJMHhmZjIwMTAwMAotCi0vKiBDb25maWd1cmF0aW9uIHNwYWNlIHJlZ2lzdGVycyAqLwotI2RlZmluZSBDUEM3MTBfQlVTX05VTUJFUgkweDQwCi0jZGVmaW5lIENQQzcxMF9TVUJfQlVTX05VTUJFUgkweDQxCi0KLSNlbmRpZiAvKiBfX1BQQ19QTEFURk9STVNfQ1BDNzEwX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3N5c2xpYi9tOHh4X3NldHVwLmMgYi9hcmNoL3BwYy9zeXNsaWIvbTh4eF9zZXR1cC5jCmluZGV4IDAxZTQ4ZDguLjljYWY4NTAgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL3N5c2xpYi9tOHh4X3NldHVwLmMKKysrIGIvYXJjaC9wcGMvc3lzbGliL204eHhfc2V0dXAuYwpAQCAtNDEzLDcgKzQxMyw3IEBACiAJaW9fYmxvY2tfbWFwcGluZyhfSU9fQkFTRSxfSU9fQkFTRSxfSU9fQkFTRV9TSVpFLCBfUEFHRV9JTyk7CiAjZW5kaWYKICNlbmRpZgotI2lmIGRlZmluZWQoQ09ORklHX0hURE1TT1VORCkgfHwgZGVmaW5lZChDT05GSUdfUlBYVE9VQ0gpIHx8IGRlZmluZWQoQ09ORklHX0ZCX1JQWCkKKyNpZiBkZWZpbmVkKENPTkZJR19SUFhUT1VDSCkgfHwgZGVmaW5lZChDT05GSUdfRkJfUlBYKQogCWlvX2Jsb2NrX21hcHBpbmcoSElPWF9DU1JfQUREUiwgSElPWF9DU1JfQUREUiwgSElPWF9DU1JfU0laRSwgX1BBR0VfSU8pOwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0ZBRFMKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3N5c2xpYi9wcGM0eHhfc2dkbWEuYyBiL2FyY2gvcHBjL3N5c2xpYi9wcGM0eHhfc2dkbWEuYwppbmRleCAyZjgzZTE2Li45MzlhYmUzIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9zeXNsaWIvcHBjNHh4X3NnZG1hLmMKKysrIGIvYXJjaC9wcGMvc3lzbGliL3BwYzR4eF9zZ2RtYS5jCkBAIC0yNyw2ICsyNyw3IEBACiAKICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8YXNtL3BwYzR4eF9kbWEuaD4KIAogdm9pZApkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvc3lzbGliL3ZpcnRleF9kZXZpY2VzLmMgYi9hcmNoL3BwYy9zeXNsaWIvdmlydGV4X2RldmljZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjU0Njc4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wcGMvc3lzbGliL3ZpcnRleF9kZXZpY2VzLmMKQEAgLTAsMCArMSwyMzMgQEAKKy8qCisgKiBWaXJ0ZXggaGFyZCBwcGM0MDUgY29yZSBjb21tb24gZGV2aWNlIGxpc3RpbmcKKyAqCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA3IFNlY3JldCBMYWIgVGVjaG5vbG9naWVzIEx0ZC4KKyAqIENvcHlyaWdodCAyMDA1IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEluYy4KKyAqIENvcHlyaWdodCAyMDAyLTIwMDQgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfODI1MC5oPgorI2luY2x1ZGUgPHN5c2xpYi92aXJ0ZXhfZGV2aWNlcy5oPgorI2luY2x1ZGUgPHBsYXRmb3Jtcy80eHgveHBhcmFtZXRlcnMveHBhcmFtZXRlcnMuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworLyoKKyAqIFVBUlRMSVRFOiBzaG9ydGN1dCBtYWNybyBmb3Igc2luZ2xlIGluc3RhbmNlCisgKi8KKyNkZWZpbmUgWFBBUl9VQVJUTElURShudW0pIHsgXAorCS5uYW1lID0gInVhcnRsaXRlIiwgXAorCS5pZCA9IG51bSwgXAorCS5udW1fcmVzb3VyY2VzID0gMiwgXAorCS5yZXNvdXJjZSA9IChzdHJ1Y3QgcmVzb3VyY2VbXSkgeyBcCisJCXsgXAorCQkJLnN0YXJ0ID0gWFBBUl9VQVJUTElURV8jI251bSMjX0JBU0VBRERSICsgMywgXAorCQkJLmVuZCA9IFhQQVJfVUFSVExJVEVfIyNudW0jI19ISUdIQUREUiwgXAorCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sIFwKKwkJfSwgXAorCQl7IFwKKwkJCS5zdGFydCA9IFhQQVJfSU5UQ18wX1VBUlRMSVRFXyMjbnVtIyNfVkVDX0lELCBcCisJCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwgXAorCQl9LCBcCisJfSwgXAorfQorCisvKgorICogRnVsbCBVQVJUOiBzaG9ydGN1dCBtYWNybyBmb3Igc2luZ2xlIGluc3RhbmNlICsgcGxhdGZvcm0gZGF0YSBzdHJ1Y3R1cmUKKyAqLworI2RlZmluZSBYUEFSX1VBUlQobnVtKSB7IFwKKwkubWFwYmFzZSA9IFhQQVJfVUFSVE5TNTUwXyMjbnVtIyNfQkFTRUFERFIgKyAzLCBcCisJLmlycSA9IFhQQVJfSU5UQ18wX1VBUlROUzU1MF8jI251bSMjX1ZFQ19JRCwgXAorCS5pb3R5cGUgPSBVUElPX01FTSwgXAorCS51YXJ0Y2xrID0gWFBBUl9VQVJUTlM1NTBfIyNudW0jI19DTE9DS19GUkVRX0haLCBcCisJLmZsYWdzID0gVVBGX0JPT1RfQVVUT0NPTkYsIFwKKwkucmVnc2hpZnQgPSAyLCBcCit9CisKKy8qCisgKiBTeXN0ZW1BQ0U6IHNob3J0Y3V0IG1hY3JvIGZvciBzaW5nbGUgaW5zdGFuY2UKKyAqLworI2RlZmluZSBYUEFSX1NZU0FDRShudW0pIHsgXAorCS5uYW1lCQk9ICJ4c3lzYWNlIiwgXAorCS5pZAkJPSBYUEFSX1NZU0FDRV8jI251bSMjX0RFVklDRV9JRCwgXAorCS5udW1fcmVzb3VyY2VzCT0gMiwgXAorCS5yZXNvdXJjZSA9IChzdHJ1Y3QgcmVzb3VyY2VbXSkgeyBcCisJCXsgXAorCQkJLnN0YXJ0CT0gWFBBUl9TWVNBQ0VfIyNudW0jI19CQVNFQUREUiwgXAorCQkJLmVuZAk9IFhQQVJfU1lTQUNFXyMjbnVtIyNfSElHSEFERFIsIFwKKwkJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLCBcCisJCX0sIFwKKwkJeyBcCisJCQkuc3RhcnQJPSBYUEFSX0lOVENfMF9TWVNBQ0VfIyNudW0jI19WRUNfSUQsIFwKKwkJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLCBcCisJCX0sIFwKKwl9LCBcCit9CisKKworLyogVUFSVCA4MjUwIGRyaXZlciBwbGF0Zm9ybSBkYXRhIHRhYmxlICovCitzdHJ1Y3QgcGxhdF9zZXJpYWw4MjUwX3BvcnQgdmlydGV4X3NlcmlhbF9wbGF0Zm9ybV9kYXRhW10gPSB7CisjaWYgZGVmaW5lZChYUEFSX1VBUlROUzU1MF8wX0JBU0VBRERSKQorCVhQQVJfVUFSVCgwKSwKKyNlbmRpZgorI2lmIGRlZmluZWQoWFBBUl9VQVJUTlM1NTBfMV9CQVNFQUREUikKKwlYUEFSX1VBUlQoMSksCisjZW5kaWYKKyNpZiBkZWZpbmVkKFhQQVJfVUFSVE5TNTUwXzJfQkFTRUFERFIpCisJWFBBUl9VQVJUKDIpLAorI2VuZGlmCisjaWYgZGVmaW5lZChYUEFSX1VBUlROUzU1MF8zX0JBU0VBRERSKQorCVhQQVJfVUFSVCgzKSwKKyNlbmRpZgorI2lmIGRlZmluZWQoWFBBUl9VQVJUTlM1NTBfNF9CQVNFQUREUikKKwlYUEFSX1VBUlQoNCksCisjZW5kaWYKKyNpZiBkZWZpbmVkKFhQQVJfVUFSVE5TNTUwXzVfQkFTRUFERFIpCisJWFBBUl9VQVJUKDUpLAorI2VuZGlmCisjaWYgZGVmaW5lZChYUEFSX1VBUlROUzU1MF82X0JBU0VBRERSKQorCVhQQVJfVUFSVCg2KSwKKyNlbmRpZgorI2lmIGRlZmluZWQoWFBBUl9VQVJUTlM1NTBfN19CQVNFQUREUikKKwlYUEFSX1VBUlQoNyksCisjZW5kaWYKKwl7IH0sIC8qIHRlcm1pbmF0ZWQgYnkgZW1wdHkgcmVjb3JkICovCit9OworCisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgdmlydGV4X3BsYXRmb3JtX2RldmljZXNbXSA9IHsKKwkvKiBVQVJUTElURSBpbnN0YW5jZXMgKi8KKyNpZiBkZWZpbmVkKFhQQVJfVUFSVExJVEVfMF9CQVNFQUREUikKKwlYUEFSX1VBUlRMSVRFKDApLAorI2VuZGlmCisjaWYgZGVmaW5lZChYUEFSX1VBUlRMSVRFXzFfQkFTRUFERFIpCisJWFBBUl9VQVJUTElURSgxKSwKKyNlbmRpZgorI2lmIGRlZmluZWQoWFBBUl9VQVJUTElURV8yX0JBU0VBRERSKQorCVhQQVJfVUFSVExJVEUoMiksCisjZW5kaWYKKyNpZiBkZWZpbmVkKFhQQVJfVUFSVExJVEVfM19CQVNFQUREUikKKwlYUEFSX1VBUlRMSVRFKDMpLAorI2VuZGlmCisjaWYgZGVmaW5lZChYUEFSX1VBUlRMSVRFXzRfQkFTRUFERFIpCisJWFBBUl9VQVJUTElURSg0KSwKKyNlbmRpZgorI2lmIGRlZmluZWQoWFBBUl9VQVJUTElURV81X0JBU0VBRERSKQorCVhQQVJfVUFSVExJVEUoNSksCisjZW5kaWYKKyNpZiBkZWZpbmVkKFhQQVJfVUFSVExJVEVfNl9CQVNFQUREUikKKwlYUEFSX1VBUlRMSVRFKDYpLAorI2VuZGlmCisjaWYgZGVmaW5lZChYUEFSX1VBUlRMSVRFXzdfQkFTRUFERFIpCisJWFBBUl9VQVJUTElURSg3KSwKKyNlbmRpZgorCisJLyogRnVsbCBVQVJUIGluc3RhbmNlcyAqLworI2lmIGRlZmluZWQoWFBBUl9VQVJUTlM1NTBfMF9CQVNFQUREUikKKwl7CisJCS5uYW1lCQk9ICJzZXJpYWw4MjUwIiwKKwkJLmlkCQk9IDAsCisJCS5kZXYucGxhdGZvcm1fZGF0YSA9IHZpcnRleF9zZXJpYWxfcGxhdGZvcm1fZGF0YSwKKwl9LAorI2VuZGlmCisKKwkvKiBTeXN0ZW1BQ0UgaW5zdGFuY2VzICovCisjaWYgZGVmaW5lZChYUEFSX1NZU0FDRV8wX0JBU0VBRERSKQorCVhQQVJfU1lTQUNFKDApLAorI2VuZGlmCisjaWYgZGVmaW5lZChYUEFSX1NZU0FDRV8xX0JBU0VBRERSKQorCVhQQVJfU1lTQUNFKDEpLAorI2VuZGlmCisKKwkvKiBNTDMwMC80MDMgcmVmZXJlbmNlIGRlc2lnbiBmcmFtZWJ1ZmZlciAqLworI2lmIGRlZmluZWQoWFBBUl9URlRfMF9CQVNFQUREUikKKwl7CisJCS5uYW1lCQk9ICJ4aWxpbnhmYiIsCisJCS5pZAkJPSAwLAorCQkubnVtX3Jlc291cmNlcwk9IDEsCisJCS5yZXNvdXJjZSA9IChzdHJ1Y3QgcmVzb3VyY2VbXSkgeworCQkJeworCQkJCS5zdGFydAk9IFhQQVJfVEZUXzBfQkFTRUFERFIsCisJCQkJLmVuZAk9IFhQQVJfVEZUXzBfQkFTRUFERFIrNywKKwkJCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lPLAorCQkJfSwKKwkJfSwKKwl9LAorI2VuZGlmCit9OworCisvKiBFYXJseSBzZXJpYWwgc3VwcG9ydCBmdW5jdGlvbnMgKi8KK3N0YXRpYyB2b2lkIF9faW5pdAordmlydGV4X2Vhcmx5X3NlcmlhbF9pbml0KGludCBudW0sIHN0cnVjdCBwbGF0X3NlcmlhbDgyNTBfcG9ydCAqcGRhdGEpCit7CisjaWYgZGVmaW5lZChDT05GSUdfU0VSSUFMX1RFWFRfREVCVUcpIHx8IGRlZmluZWQoQ09ORklHX0tHREIpCisJc3RydWN0IHVhcnRfcG9ydCBzZXJpYWxfcmVxOworCisJbWVtc2V0KCZzZXJpYWxfcmVxLCAwLCBzaXplb2Yoc2VyaWFsX3JlcSkpOworCXNlcmlhbF9yZXEubWFwYmFzZQk9IHBkYXRhLT5tYXBiYXNlOworCXNlcmlhbF9yZXEubWVtYmFzZQk9IHBkYXRhLT5tZW1iYXNlOworCXNlcmlhbF9yZXEuaXJxCQk9IHBkYXRhLT5pcnE7CisJc2VyaWFsX3JlcS51YXJ0Y2xrCT0gcGRhdGEtPnVhcnRjbGs7CisJc2VyaWFsX3JlcS5yZWdzaGlmdAk9IHBkYXRhLT5yZWdzaGlmdDsKKwlzZXJpYWxfcmVxLmlvdHlwZQk9IHBkYXRhLT5pb3R5cGU7CisJc2VyaWFsX3JlcS5mbGFncwk9IHBkYXRhLT5mbGFnczsKKwlnZW41NTBfaW5pdChudW0sICZzZXJpYWxfcmVxKTsKKyNlbmRpZgorfQorCit2b2lkIF9faW5pdAordmlydGV4X2Vhcmx5X3NlcmlhbF9tYXAodm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfU0VSSUFMXzgyNTAKKwlzdHJ1Y3QgcGxhdF9zZXJpYWw4MjUwX3BvcnQgKnBkYXRhOworCWludCBpID0gMDsKKworCXBkYXRhID0gdmlydGV4X3NlcmlhbF9wbGF0Zm9ybV9kYXRhOworCXdoaWxlKHBkYXRhICYmIHBkYXRhLT5mbGFncykgeworCQlwZGF0YS0+bWVtYmFzZSA9IGlvcmVtYXAocGRhdGEtPm1hcGJhc2UsIDB4MTAwKTsKKwkJdmlydGV4X2Vhcmx5X3NlcmlhbF9pbml0KGksIHBkYXRhKTsKKwkJcGRhdGErKzsKKwkJaSsrOworCX0KKyNlbmRpZiAvKiBDT05GSUdfU0VSSUFMXzgyNTAgKi8KK30KKworLyoKKyAqIGRlZmF1bHQgZml4dXAgcm91dGluZTsgZG8gbm90aGluZyBhbmQgcmV0dXJuIHN1Y2Nlc3MuCisgKgorICogUmVpbXBsZW1lbnQgdGhpcyByb3V0aW5lIGluIHlvdXIgY3VzdG9tIGJvYXJkIHN1cHBvcnQgZmlsZSB0bworICogb3ZlcnJpZGUgdGhlIGRlZmF1bHQgYmVoYXZpb3VyCisgKi8KK2ludCBfX2F0dHJpYnV0ZV9fICgod2VhaykpCit2aXJ0ZXhfZGV2aWNlX2ZpeHVwKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgdmlydGV4X2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICppbmRleCA9IHZpcnRleF9wbGF0Zm9ybV9kZXZpY2VzOworCXVuc2lnbmVkIGludCByZXQgPSAwOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodmlydGV4X3BsYXRmb3JtX2RldmljZXMpOyBpKyssIGluZGV4KyspIHsKKwkJaWYgKHZpcnRleF9kZXZpY2VfZml4dXAoaW5kZXgpICE9IDApCisJCQljb250aW51ZTsKKworCQlpZiAocGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKGluZGV4KSkgeworCQkJcmV0ID0gMTsKKwkJCXByaW50ayhLRVJOX0VSUiAiY2Fubm90IHJlZ2lzdGVyIGRldiAlczolZFxuIiwKKwkJCSAgICAgICBpbmRleC0+bmFtZSwgaW5kZXgtPmlkKTsKKwkJfQorCX0KKwlyZXR1cm4gcmV0OworfQorCitzdWJzeXNfaW5pdGNhbGwodmlydGV4X2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvc3lzbGliL3ZpcnRleF9kZXZpY2VzLmggYi9hcmNoL3BwYy9zeXNsaWIvdmlydGV4X2RldmljZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTE3ZGQzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wcGMvc3lzbGliL3ZpcnRleF9kZXZpY2VzLmgKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqIENvbW1vbiBzdXBwb3J0IGhlYWRlciBmb3IgdmlydGV4IHBwYzQwNSBwbGF0Zm9ybXMKKyAqCisgKiBDb3B5cmlnaHQgMjAwNyBTZWNyZXQgTGFiIFRlY2hub2xvZ2llcyBMdGQuCisgKgorICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMi4gIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9mIGFueQorICoga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKi8KKworI2lmbmRlZiBfX0FTTV9WSVJURVhfREVWSUNFU19IX18KKyNkZWZpbmUgX19BU01fVklSVEVYX0RFVklDRVNfSF9fCisKKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKwordm9pZCBfX2luaXQgdmlydGV4X2Vhcmx5X3NlcmlhbF9tYXAodm9pZCk7CisKKy8qIFByb3RvdHlwZSBmb3IgZGV2aWNlIGZpeHVwIHJvdXRpbmUuICBJbXBsZW1lbnQgdGhpcyByb3V0aW5lIGluIHRoZQorICogYm9hcmQgc3BlY2lmaWMgZml4dXAgY29kZSBhbmQgdGhlIGdlbmVyaWMgc2V0dXAgY29kZSB3aWxsIGNhbGwgaXQgZm9yCisgKiBlYWNoIGRldmljZSBpcyB0aGUgcGxhdGZvcm0gZGV2aWNlIGxpc3QuCisgKgorICogSWYgdGhlIGhvb2sgcmV0dXJucyBhIG5vbi16ZXJvIHZhbHVlLCB0aGVuIHRoZSBkZXZpY2Ugd2lsbCBub3QgZ2V0CisgKiByZWdpc3RlcmVkIHdpdGggdGhlIHBsYXRmb3JtIGJ1cworICovCitpbnQgdmlydGV4X2RldmljZV9maXh1cChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpOworCisjZW5kaWYgIC8qIF9fQVNNX1ZJUlRFWF9ERVZJQ0VTX0hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL0tjb25maWcgYi9hcmNoL3MzOTAvS2NvbmZpZwppbmRleCAwZjI5M2FhLi5lNmVjNDE4IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvS2NvbmZpZworKysgYi9hcmNoL3MzOTAvS2NvbmZpZwpAQCAtNDEsNiArNDEsMTEgQEAKIGNvbmZpZyBHRU5FUklDX1RJTUUKIAlkZWZfYm9vbCB5CiAKK2NvbmZpZyBHRU5FUklDX0JVRworCWJvb2wKKwlkZXBlbmRzIG9uIEJVRworCWRlZmF1bHQgeQorCiBjb25maWcgTk9fSU9NRU0KIAlkZWZfYm9vbCB5CiAKQEAgLTUxNCw2ICs1MTksMTQgQEAKIAkgIGN1cnJlbnQga2VybmVsLCBhbmQgdG8gc3RhcnQgYW5vdGhlciBrZXJuZWwuICBJdCBpcyBsaWtlIGEgcmVib290CiAJICBidXQgaXMgaW5kZXBlbmRlbnQgb2YgaGFyZHdhcmUvbWljcm9jb2RlIHN1cHBvcnQuCiAKK2NvbmZpZyBaRkNQRFVNUAorCXRyaXN0YXRlICJ6ZmNwZHVtcCBzdXBwb3J0IgorCXNlbGVjdCBTTVAKKwlkZWZhdWx0IG4KKwloZWxwCisJICBTZWxlY3QgdGhpcyBvcHRpb24gaWYgeW91IHdhbnQgdG8gYnVpbGQgYW4gemZjcGR1bXAgZW5hYmxlZCBrZXJuZWwuCisJICBSZWZlciB0byAiRG9jdW1lbnRhdGlvbi9zMzkwL3pmY3BkdW1wLnR4dCIgZm9yIG1vcmUgZGV0YWlscyBvbiB0aGlzLgorCiBlbmRtZW51CiAKIHNvdXJjZSAibmV0L0tjb25maWciCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvTWFrZWZpbGUgYi9hcmNoL3MzOTAvTWFrZWZpbGUKaW5kZXggYjFlNTU4NC4uNjg0NDFlMCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL01ha2VmaWxlCisrKyBiL2FyY2gvczM5MC9NYWtlZmlsZQpAQCAtNjcsOCArNjcsMTAgQEAKIAogaWZlcSAoJChjYWxsIGNjLW9wdGlvbi15biwtbXN0YWNrLXNpemU9ODE5MiAtbXN0YWNrLWd1YXJkPTEyOCkseSkKIGNmbGFncy0kKENPTkZJR19DSEVDS19TVEFDSykgKz0gLW1zdGFjay1zaXplPSQoU1RBQ0tfU0laRSkKK2lmbmVxICgkKGNhbGwgY2Mtb3B0aW9uLXluLC1tc3RhY2stc2l6ZT04MTkyKSx5KQogY2ZsYWdzLSQoQ09ORklHX0NIRUNLX1NUQUNLKSArPSAtbXN0YWNrLWd1YXJkPSQoQ09ORklHX1NUQUNLX0dVQVJEKQogZW5kaWYKK2VuZGlmCiAKIGlmZXEgKCQoY2FsbCBjYy1vcHRpb24teW4sLW13YXJuLWR5bmFtaWNzdGFjaykseSkKIGNmbGFncy0kKENPTkZJR19XQVJOX1NUQUNLKSArPSAtbXdhcm4tZHluYW1pY3N0YWNrCkBAIC0xMDMsNiArMTA1LDkgQEAKIGltYWdlOiB2bWxpbnV4CiAJJChRKSQoTUFLRSkgJChidWlsZCk9JChib290KSAkKGJvb3QpLyRACiAKK3pmY3BkdW1wOgorCSQoUSkkKE1BS0UpICQoYnVpbGQpPSQoYm9vdCkgJChib290KS8kQAorCiBhcmNoY2xlYW46CiAJJChRKSQoTUFLRSkgJChjbGVhbik9JChib290KQogCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvYXBwbGRhdGEvYXBwbGRhdGFfYmFzZS5jIGIvYXJjaC9zMzkwL2FwcGxkYXRhL2FwcGxkYXRhX2Jhc2UuYwppbmRleCAwYzNjZjRiLi5lZTg5YjMzIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvYXBwbGRhdGEvYXBwbGRhdGFfYmFzZS5jCisrKyBiL2FyY2gvczM5MC9hcHBsZGF0YS9hcHBsZGF0YV9iYXNlLmMKQEAgLTY2OCw0NSArNjY4LDcgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKGFwcGxkYXRhX3VucmVnaXN0ZXJfb3BzKTsKIEVYUE9SVF9TWU1CT0xfR1BMKGFwcGxkYXRhX2RpYWcpOwogCi0jaWZkZWYgTU9EVUxFCi0vKgotICogS2VybmVsIHN5bWJvbHMgbmVlZGVkIGJ5IGFwcGxkYXRhX21lbSBhbmQgYXBwbGRhdGFfb3MgbW9kdWxlcy4KLSAqIEhvd2V2ZXIsIGlmIHRoaXMgZmlsZSBpcyBjb21waWxlZCBhcyBhIG1vZHVsZSAoZm9yIHRlc3Rpbmcgb25seSksIHRoZXNlCi0gKiBzeW1ib2xzIGFyZSBub3QgZXhwb3J0ZWQuIEluIHRoaXMgY2FzZSwgd2UgZGVmaW5lIHRoZW0gbG9jYWxseSBhbmQgZXhwb3J0Ci0gKiB0aG9zZS4KLSAqLwotdm9pZCBzaV9zd2FwaW5mbyhzdHJ1Y3Qgc3lzaW5mbyAqdmFsKQotewotCXZhbC0+ZnJlZXN3YXAgPSAtMXVsOwotCXZhbC0+dG90YWxzd2FwID0gLTF1bDsKLX0KLQotdW5zaWduZWQgbG9uZyBhdmVucnVuWzNdID0gey0xIC0gRklYRURfMS8yMDAsIC0xIC0gRklYRURfMS8yMDAsCi0JCQkJLTEgLSBGSVhFRF8xLzIwMH07Ci1pbnQgbnJfdGhyZWFkcyA9IC0xOwotCi12b2lkIGdldF9mdWxsX3BhZ2Vfc3RhdGUoc3RydWN0IHBhZ2Vfc3RhdGUgKnBzKQotewotCW1lbXNldChwcywgLTEsIHNpemVvZihzdHJ1Y3QgcGFnZV9zdGF0ZSkpOwotfQotCi11bnNpZ25lZCBsb25nIG5yX3J1bm5pbmcodm9pZCkKLXsKLQlyZXR1cm4gLTE7Ci19Ci0KLXVuc2lnbmVkIGxvbmcgbnJfaW93YWl0KHZvaWQpCi17Ci0JcmV0dXJuIC0xOwotfQotCi0vKnVuc2lnbmVkIGxvbmcgbnJfY29udGV4dF9zd2l0Y2hlcyh2b2lkKQotewotCXJldHVybiAtMTsKLX0qLwotI2VuZGlmIC8qIE1PRFVMRSAqLwogRVhQT1JUX1NZTUJPTF9HUEwoc2lfc3dhcGluZm8pOwogRVhQT1JUX1NZTUJPTF9HUEwobnJfdGhyZWFkcyk7CiBFWFBPUlRfU1lNQk9MX0dQTChucl9ydW5uaW5nKTsKIEVYUE9SVF9TWU1CT0xfR1BMKG5yX2lvd2FpdCk7Ci0vL0VYUE9SVF9TWU1CT0xfR1BMKG5yX2NvbnRleHRfc3dpdGNoZXMpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2FwcGxkYXRhL2FwcGxkYXRhX25ldF9zdW0uYyBiL2FyY2gvczM5MC9hcHBsZGF0YS9hcHBsZGF0YV9uZXRfc3VtLmMKaW5kZXggZjY0YjhjOC4uYTQzZjM0OCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2FwcGxkYXRhL2FwcGxkYXRhX25ldF9zdW0uYworKysgYi9hcmNoL3MzOTAvYXBwbGRhdGEvYXBwbGRhdGFfbmV0X3N1bS5jCkBAIC0xMDgsOSArMTA4LDYgQEAKIAljb2xsaXNpb25zID0gMDsKIAlyZWFkX2xvY2soJmRldl9iYXNlX2xvY2spOwogCWZvciAoZGV2ID0gZGV2X2Jhc2U7IGRldiAhPSBOVUxMOyBkZXYgPSBkZXYtPm5leHQpIHsKLQkJaWYgKGRldi0+Z2V0X3N0YXRzID09IE5VTEwpIHsKLQkJCWNvbnRpbnVlOwotCQl9CiAJCXN0YXRzID0gZGV2LT5nZXRfc3RhdHMoZGV2KTsKIAkJcnhfcGFja2V0cyArPSBzdGF0cy0+cnhfcGFja2V0czsKIAkJdHhfcGFja2V0cyArPSBzdGF0cy0+dHhfcGFja2V0czsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9jcnlwdG8vYWVzX3MzOTAuYyBiL2FyY2gvczM5MC9jcnlwdG8vYWVzX3MzOTAuYwppbmRleCA5MTYzNjM1Li4zNjYwY2E2IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvY3J5cHRvL2Flc19zMzkwLmMKKysrIGIvYXJjaC9zMzkwL2NyeXB0by9hZXNfczM5MC5jCkBAIC0xMTksNyArMTE5LDggQEAKIAkuY3JhX25hbWUJCT0JImFlcyIsCiAJLmNyYV9kcml2ZXJfbmFtZQk9CSJhZXMtczM5MCIsCiAJLmNyYV9wcmlvcml0eQkJPQlDUllQVF9TMzkwX1BSSU9SSVRZLAotCS5jcmFfZmxhZ3MJCT0JQ1JZUFRPX0FMR19UWVBFX0NJUEhFUiwKKwkuY3JhX2ZsYWdzCQk9CUNSWVBUT19BTEdfVFlQRV9DSVBIRVIgfAorCQkJCQlDUllQVE9fQUxHX05FRURfRkFMTEJBQ0ssCiAJLmNyYV9ibG9ja3NpemUJCT0JQUVTX0JMT0NLX1NJWkUsCiAJLmNyYV9jdHhzaXplCQk9CXNpemVvZihzdHJ1Y3QgczM5MF9hZXNfY3R4KSwKIAkuY3JhX21vZHVsZQkJPQlUSElTX01PRFVMRSwKQEAgLTIwNiw3ICsyMDcsOCBAQAogCS5jcmFfbmFtZQkJPQkiZWNiKGFlcykiLAogCS5jcmFfZHJpdmVyX25hbWUJPQkiZWNiLWFlcy1zMzkwIiwKIAkuY3JhX3ByaW9yaXR5CQk9CUNSWVBUX1MzOTBfQ09NUE9TSVRFX1BSSU9SSVRZLAotCS5jcmFfZmxhZ3MJCT0JQ1JZUFRPX0FMR19UWVBFX0JMS0NJUEhFUiwKKwkuY3JhX2ZsYWdzCQk9CUNSWVBUT19BTEdfVFlQRV9CTEtDSVBIRVIgfAorCQkJCQlDUllQVE9fQUxHX05FRURfRkFMTEJBQ0ssCiAJLmNyYV9ibG9ja3NpemUJCT0JQUVTX0JMT0NLX1NJWkUsCiAJLmNyYV9jdHhzaXplCQk9CXNpemVvZihzdHJ1Y3QgczM5MF9hZXNfY3R4KSwKIAkuY3JhX3R5cGUJCT0JJmNyeXB0b19ibGtjaXBoZXJfdHlwZSwKQEAgLTMwMCw3ICszMDIsOCBAQAogCS5jcmFfbmFtZQkJPQkiY2JjKGFlcykiLAogCS5jcmFfZHJpdmVyX25hbWUJPQkiY2JjLWFlcy1zMzkwIiwKIAkuY3JhX3ByaW9yaXR5CQk9CUNSWVBUX1MzOTBfQ09NUE9TSVRFX1BSSU9SSVRZLAotCS5jcmFfZmxhZ3MJCT0JQ1JZUFRPX0FMR19UWVBFX0JMS0NJUEhFUiwKKwkuY3JhX2ZsYWdzCQk9CUNSWVBUT19BTEdfVFlQRV9CTEtDSVBIRVIgfAorCQkJCQlDUllQVE9fQUxHX05FRURfRkFMTEJBQ0ssCiAJLmNyYV9ibG9ja3NpemUJCT0JQUVTX0JMT0NLX1NJWkUsCiAJLmNyYV9jdHhzaXplCQk9CXNpemVvZihzdHJ1Y3QgczM5MF9hZXNfY3R4KSwKIAkuY3JhX3R5cGUJCT0JJmNyeXB0b19ibGtjaXBoZXJfdHlwZSwKQEAgLTMzMywxMCArMzM2LDE0IEBACiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAogCS8qIHo5IDEwOSBhbmQgejkgQkMvRUMgb25seSBzdXBwb3J0IDEyOCBiaXQga2V5IGxlbmd0aCAqLwotCWlmIChrZXlsZW5fZmxhZyA9PSBBRVNfS0VZTEVOXzEyOCkKKwlpZiAoa2V5bGVuX2ZsYWcgPT0gQUVTX0tFWUxFTl8xMjgpIHsKKwkJYWVzX2FsZy5jcmFfdS5jaXBoZXIuY2lhX21heF9rZXlzaXplID0gQUVTX01JTl9LRVlfU0laRTsKKwkJZWNiX2Flc19hbGcuY3JhX3UuYmxrY2lwaGVyLm1heF9rZXlzaXplID0gQUVTX01JTl9LRVlfU0laRTsKKwkJY2JjX2Flc19hbGcuY3JhX3UuYmxrY2lwaGVyLm1heF9rZXlzaXplID0gQUVTX01JTl9LRVlfU0laRTsKIAkJcHJpbnRrKEtFUk5fSU5GTwogCQkgICAgICAgImFlc19zMzkwOiBoYXJkd2FyZSBhY2NlbGVyYXRpb24gb25seSBhdmFpbGFibGUgZm9yIgogCQkgICAgICAgIjEyOCBiaXQga2V5c1xuIik7CisJfQogCiAJcmV0ID0gY3J5cHRvX3JlZ2lzdGVyX2FsZygmYWVzX2FsZyk7CiAJaWYgKHJldCkKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9jcnlwdG8vc2hhMV9zMzkwLmMgYi9hcmNoL3MzOTAvY3J5cHRvL3NoYTFfczM5MC5jCmluZGV4IDk2OTYzOWYuLmFmNDQ2MGUgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9jcnlwdG8vc2hhMV9zMzkwLmMKKysrIGIvYXJjaC9zMzkwL2NyeXB0by9zaGExX3MzOTAuYwpAQCAtMjUsOTkgKzI1LDEwMCBAQAogICovCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+Ci0jaW5jbHVkZSA8YXNtL3NjYXR0ZXJsaXN0Lmg+Ci0jaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCiAjaW5jbHVkZSAiY3J5cHRfczM5MC5oIgogCiAjZGVmaW5lIFNIQTFfRElHRVNUX1NJWkUJMjAKICNkZWZpbmUgU0hBMV9CTE9DS19TSVpFCQk2NAogCi1zdHJ1Y3QgY3J5cHRfczM5MF9zaGExX2N0eCB7Ci0JdTY0IGNvdW50Oworc3RydWN0IHMzOTBfc2hhMV9jdHggeworCXU2NCBjb3VudDsJCS8qIG1lc3NhZ2UgbGVuZ3RoICovCiAJdTMyIHN0YXRlWzVdOwotCXUzMiBidWZfbGVuOwotCXU4IGJ1ZmZlclsyICogU0hBMV9CTE9DS19TSVpFXTsKKwl1OCBidWZbMiAqIFNIQTFfQkxPQ0tfU0laRV07CiB9OwogCiBzdGF0aWMgdm9pZCBzaGExX2luaXQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKIHsKLQlzdHJ1Y3QgY3J5cHRfczM5MF9zaGExX2N0eCAqY3R4ID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKKwlzdHJ1Y3QgczM5MF9zaGExX2N0eCAqc2N0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7CiAKLQljdHgtPnN0YXRlWzBdID0gMHg2NzQ1MjMwMTsKLQljdHgtPnN0YXRlWzFdID0JMHhFRkNEQUI4OTsKLQljdHgtPnN0YXRlWzJdID0JMHg5OEJBRENGRTsKLQljdHgtPnN0YXRlWzNdID0gMHgxMDMyNTQ3NjsKLQljdHgtPnN0YXRlWzRdID0JMHhDM0QyRTFGMDsKLQotCWN0eC0+Y291bnQgPSAwOwotCWN0eC0+YnVmX2xlbiA9IDA7CisJc2N0eC0+c3RhdGVbMF0gPSAweDY3NDUyMzAxOworCXNjdHgtPnN0YXRlWzFdID0gMHhFRkNEQUI4OTsKKwlzY3R4LT5zdGF0ZVsyXSA9IDB4OThCQURDRkU7CisJc2N0eC0+c3RhdGVbM10gPSAweDEwMzI1NDc2OworCXNjdHgtPnN0YXRlWzRdID0gMHhDM0QyRTFGMDsKKwlzY3R4LT5jb3VudCA9IDA7CiB9CiAKIHN0YXRpYyB2b2lkIHNoYTFfdXBkYXRlKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIGNvbnN0IHU4ICpkYXRhLAogCQkJdW5zaWduZWQgaW50IGxlbikKIHsKLQlzdHJ1Y3QgY3J5cHRfczM5MF9zaGExX2N0eCAqc2N0eDsKLQlsb25nIGltZF9sZW47CisJc3RydWN0IHMzOTBfc2hhMV9jdHggKnNjdHggPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOworCXVuc2lnbmVkIGludCBpbmRleDsKKwlpbnQgcmV0OwogCi0Jc2N0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7Ci0Jc2N0eC0+Y291bnQgKz0gbGVuICogODsgLyogbWVzc2FnZSBiaXQgbGVuZ3RoICovCisJLyogaG93IG11Y2ggaXMgYWxyZWFkeSBpbiB0aGUgYnVmZmVyPyAqLworCWluZGV4ID0gc2N0eC0+Y291bnQgJiAweDNmOwogCi0JLyogYW55dGhpbmcgaW4gYnVmZmVyIHlldD8gLT4gbXVzdCBiZSBjb21wbGV0ZWQgKi8KLQlpZiAoc2N0eC0+YnVmX2xlbiAmJiAoc2N0eC0+YnVmX2xlbiArIGxlbikgPj0gU0hBMV9CTE9DS19TSVpFKSB7Ci0JCS8qIGNvbXBsZXRlIGZ1bGwgYmxvY2sgYW5kIGhhc2ggKi8KLQkJbWVtY3B5KHNjdHgtPmJ1ZmZlciArIHNjdHgtPmJ1Zl9sZW4sIGRhdGEsCi0JCSAgICAgICBTSEExX0JMT0NLX1NJWkUgLSBzY3R4LT5idWZfbGVuKTsKLQkJY3J5cHRfczM5MF9raW1kKEtJTURfU0hBXzEsIHNjdHgtPnN0YXRlLCBzY3R4LT5idWZmZXIsCi0JCQkJU0hBMV9CTE9DS19TSVpFKTsKLQkJZGF0YSArPSBTSEExX0JMT0NLX1NJWkUgLSBzY3R4LT5idWZfbGVuOwotCQlsZW4gLT0gU0hBMV9CTE9DS19TSVpFIC0gc2N0eC0+YnVmX2xlbjsKLQkJc2N0eC0+YnVmX2xlbiA9IDA7CisJc2N0eC0+Y291bnQgKz0gbGVuOworCisJaWYgKGluZGV4ICsgbGVuIDwgU0hBMV9CTE9DS19TSVpFKQorCQlnb3RvIHN0b3JlOworCisJLyogcHJvY2VzcyBvbmUgc3RvcmVkIGJsb2NrICovCisJaWYgKGluZGV4KSB7CisJCW1lbWNweShzY3R4LT5idWYgKyBpbmRleCwgZGF0YSwgU0hBMV9CTE9DS19TSVpFIC0gaW5kZXgpOworCQlyZXQgPSBjcnlwdF9zMzkwX2tpbWQoS0lNRF9TSEFfMSwgc2N0eC0+c3RhdGUsIHNjdHgtPmJ1ZiwKKwkJCQkgICAgICBTSEExX0JMT0NLX1NJWkUpOworCQlCVUdfT04ocmV0ICE9IFNIQTFfQkxPQ0tfU0laRSk7CisJCWRhdGEgKz0gU0hBMV9CTE9DS19TSVpFIC0gaW5kZXg7CisJCWxlbiAtPSBTSEExX0JMT0NLX1NJWkUgLSBpbmRleDsKIAl9CiAKLQkvKiByZXN0IG9mIGRhdGEgY29udGFpbnMgZnVsbCBibG9ja3M/ICovCi0JaW1kX2xlbiA9IGxlbiAmIH4weDNmdWw7Ci0JaWYgKGltZF9sZW4pIHsKLQkJY3J5cHRfczM5MF9raW1kKEtJTURfU0hBXzEsIHNjdHgtPnN0YXRlLCBkYXRhLCBpbWRfbGVuKTsKLQkJZGF0YSArPSBpbWRfbGVuOwotCQlsZW4gLT0gaW1kX2xlbjsKKwkvKiBwcm9jZXNzIGFzIG1hbnkgYmxvY2tzIGFzIHBvc3NpYmxlICovCisJaWYgKGxlbiA+PSBTSEExX0JMT0NLX1NJWkUpIHsKKwkJcmV0ID0gY3J5cHRfczM5MF9raW1kKEtJTURfU0hBXzEsIHNjdHgtPnN0YXRlLCBkYXRhLAorCQkJCSAgICAgIGxlbiAmIH4oU0hBMV9CTE9DS19TSVpFIC0gMSkpOworCQlCVUdfT04ocmV0ICE9IChsZW4gJiB+KFNIQTFfQkxPQ0tfU0laRSAtIDEpKSk7CisJCWRhdGEgKz0gcmV0OworCQlsZW4gLT0gcmV0OwogCX0KLQkvKiBhbnl0aGluZyBsZWZ0PyBzdG9yZSBpbiBidWZmZXIgKi8KLQlpZiAobGVuKSB7Ci0JCW1lbWNweShzY3R4LT5idWZmZXIgKyBzY3R4LT5idWZfbGVuICwgZGF0YSwgbGVuKTsKLQkJc2N0eC0+YnVmX2xlbiArPSBsZW47Ci0JfQotfQogCi0KLXN0YXRpYyB2b2lkIHBhZF9tZXNzYWdlKHN0cnVjdCBjcnlwdF9zMzkwX3NoYTFfY3R4KiBzY3R4KQotewotCWludCBpbmRleDsKLQotCWluZGV4ID0gc2N0eC0+YnVmX2xlbjsKLQlzY3R4LT5idWZfbGVuID0gKHNjdHgtPmJ1Zl9sZW4gPCA1NikgPwotCQkJIFNIQTFfQkxPQ0tfU0laRToyICogU0hBMV9CTE9DS19TSVpFOwotCS8qIHN0YXJ0IHBhZCB3aXRoIDEgKi8KLQlzY3R4LT5idWZmZXJbaW5kZXhdID0gMHg4MDsKLQkvKiBwYWQgd2l0aCB6ZXJvcyAqLwotCWluZGV4Kys7Ci0JbWVtc2V0KHNjdHgtPmJ1ZmZlciArIGluZGV4LCAweDAwLCBzY3R4LT5idWZfbGVuIC0gaW5kZXgpOwotCS8qIGFwcGVuZCBsZW5ndGggKi8KLQltZW1jcHkoc2N0eC0+YnVmZmVyICsgc2N0eC0+YnVmX2xlbiAtIDgsICZzY3R4LT5jb3VudCwKLQkgICAgICAgc2l6ZW9mIHNjdHgtPmNvdW50KTsKK3N0b3JlOgorCS8qIGFueXRoaW5nIGxlZnQ/ICovCisJaWYgKGxlbikKKwkJbWVtY3B5KHNjdHgtPmJ1ZiArIGluZGV4ICwgZGF0YSwgbGVuKTsKIH0KIAogLyogQWRkIHBhZGRpbmcgYW5kIHJldHVybiB0aGUgbWVzc2FnZSBkaWdlc3QuICovCiBzdGF0aWMgdm9pZCBzaGExX2ZpbmFsKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpvdXQpCiB7Ci0Jc3RydWN0IGNyeXB0X3MzOTBfc2hhMV9jdHggKnNjdHggPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOworCXN0cnVjdCBzMzkwX3NoYTFfY3R4ICpzY3R4ID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKKwl1NjQgYml0czsKKwl1bnNpZ25lZCBpbnQgaW5kZXgsIGVuZDsKKwlpbnQgcmV0OwogCiAJLyogbXVzdCBwZXJmb3JtIG1hbnVhbCBwYWRkaW5nICovCi0JcGFkX21lc3NhZ2Uoc2N0eCk7Ci0JY3J5cHRfczM5MF9raW1kKEtJTURfU0hBXzEsIHNjdHgtPnN0YXRlLCBzY3R4LT5idWZmZXIsIHNjdHgtPmJ1Zl9sZW4pOworCWluZGV4ID0gc2N0eC0+Y291bnQgJiAweDNmOworCWVuZCA9ICAoaW5kZXggPCA1NikgPyBTSEExX0JMT0NLX1NJWkUgOiAoMiAqIFNIQTFfQkxPQ0tfU0laRSk7CisKKwkvKiBzdGFydCBwYWQgd2l0aCAxICovCisJc2N0eC0+YnVmW2luZGV4XSA9IDB4ODA7CisKKwkvKiBwYWQgd2l0aCB6ZXJvcyAqLworCWluZGV4Kys7CisJbWVtc2V0KHNjdHgtPmJ1ZiArIGluZGV4LCAweDAwLCBlbmQgLSBpbmRleCAtIDgpOworCisJLyogYXBwZW5kIG1lc3NhZ2UgbGVuZ3RoICovCisJYml0cyA9IHNjdHgtPmNvdW50ICogODsKKwltZW1jcHkoc2N0eC0+YnVmICsgZW5kIC0gOCwgJmJpdHMsIHNpemVvZihiaXRzKSk7CisKKwlyZXQgPSBjcnlwdF9zMzkwX2tpbWQoS0lNRF9TSEFfMSwgc2N0eC0+c3RhdGUsIHNjdHgtPmJ1ZiwgZW5kKTsKKwlCVUdfT04ocmV0ICE9IGVuZCk7CisKIAkvKiBjb3B5IGRpZ2VzdCB0byBvdXQgKi8KIAltZW1jcHkob3V0LCBzY3R4LT5zdGF0ZSwgU0hBMV9ESUdFU1RfU0laRSk7CisKIAkvKiB3aXBlIGNvbnRleHQgKi8KIAltZW1zZXQoc2N0eCwgMCwgc2l6ZW9mICpzY3R4KTsKIH0KQEAgLTEyOCw3ICsxMjksNyBAQAogCS5jcmFfcHJpb3JpdHkJPQlDUllQVF9TMzkwX1BSSU9SSVRZLAogCS5jcmFfZmxhZ3MJPQlDUllQVE9fQUxHX1RZUEVfRElHRVNULAogCS5jcmFfYmxvY2tzaXplCT0JU0hBMV9CTE9DS19TSVpFLAotCS5jcmFfY3R4c2l6ZQk9CXNpemVvZihzdHJ1Y3QgY3J5cHRfczM5MF9zaGExX2N0eCksCisJLmNyYV9jdHhzaXplCT0Jc2l6ZW9mKHN0cnVjdCBzMzkwX3NoYTFfY3R4KSwKIAkuY3JhX21vZHVsZQk9CVRISVNfTU9EVUxFLAogCS5jcmFfbGlzdAk9CUxJU1RfSEVBRF9JTklUKGFsZy5jcmFfbGlzdCksCiAJLmNyYV91CQk9CXsgLmRpZ2VzdCA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9jcnlwdG8vc2hhMjU2X3MzOTAuYyBiL2FyY2gvczM5MC9jcnlwdG8vc2hhMjU2X3MzOTAuYwppbmRleCA3ODQzNmM2Li4yY2VkMzMzIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvY3J5cHRvL3NoYTI1Nl9zMzkwLmMKKysrIGIvYXJjaC9zMzkwL2NyeXB0by9zaGEyNTZfczM5MC5jCkBAIC0yNiw3ICsyNiw3IEBACiAjZGVmaW5lIFNIQTI1Nl9CTE9DS19TSVpFCTY0CiAKIHN0cnVjdCBzMzkwX3NoYTI1Nl9jdHggewotCXU2NCBjb3VudDsKKwl1NjQgY291bnQ7CQkvKiBtZXNzYWdlIGxlbmd0aCAqLwogCXUzMiBzdGF0ZVs4XTsKIAl1OCBidWZbMiAqIFNIQTI1Nl9CTE9DS19TSVpFXTsKIH07CkBAIC01NCwxMCArNTQsOSBAQAogCWludCByZXQ7CiAKIAkvKiBob3cgbXVjaCBpcyBhbHJlYWR5IGluIHRoZSBidWZmZXI/ICovCi0JaW5kZXggPSBzY3R4LT5jb3VudCAvIDggJiAweDNmOworCWluZGV4ID0gc2N0eC0+Y291bnQgJiAweDNmOwogCi0JLyogdXBkYXRlIG1lc3NhZ2UgYml0IGxlbmd0aCAqLwotCXNjdHgtPmNvdW50ICs9IGxlbiAqIDg7CisJc2N0eC0+Y291bnQgKz0gbGVuOwogCiAJaWYgKChpbmRleCArIGxlbikgPCBTSEEyNTZfQkxPQ0tfU0laRSkKIAkJZ290byBzdG9yZTsKQEAgLTg3LDEyICs4NiwxNyBAQAogCQltZW1jcHkoc2N0eC0+YnVmICsgaW5kZXggLCBkYXRhLCBsZW4pOwogfQogCi1zdGF0aWMgdm9pZCBwYWRfbWVzc2FnZShzdHJ1Y3QgczM5MF9zaGEyNTZfY3R4KiBzY3R4KQorLyogQWRkIHBhZGRpbmcgYW5kIHJldHVybiB0aGUgbWVzc2FnZSBkaWdlc3QgKi8KK3N0YXRpYyB2b2lkIHNoYTI1Nl9maW5hbChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqb3V0KQogewotCWludCBpbmRleCwgZW5kOworCXN0cnVjdCBzMzkwX3NoYTI1Nl9jdHggKnNjdHggPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOworCXU2NCBiaXRzOworCXVuc2lnbmVkIGludCBpbmRleCwgZW5kOworCWludCByZXQ7CiAKLQlpbmRleCA9IHNjdHgtPmNvdW50IC8gOCAmIDB4M2Y7Ci0JZW5kID0gaW5kZXggPCA1NiA/IFNIQTI1Nl9CTE9DS19TSVpFIDogMiAqIFNIQTI1Nl9CTE9DS19TSVpFOworCS8qIG11c3QgcGVyZm9ybSBtYW51YWwgcGFkZGluZyAqLworCWluZGV4ID0gc2N0eC0+Y291bnQgJiAweDNmOworCWVuZCA9IChpbmRleCA8IDU2KSA/IFNIQTI1Nl9CTE9DS19TSVpFIDogKDIgKiBTSEEyNTZfQkxPQ0tfU0laRSk7CiAKIAkvKiBzdGFydCBwYWQgd2l0aCAxICovCiAJc2N0eC0+YnVmW2luZGV4XSA9IDB4ODA7CkBAIC0xMDIsMjEgKzEwNiwxMSBAQAogCW1lbXNldChzY3R4LT5idWYgKyBpbmRleCwgMHgwMCwgZW5kIC0gaW5kZXggLSA4KTsKIAogCS8qIGFwcGVuZCBtZXNzYWdlIGxlbmd0aCAqLwotCW1lbWNweShzY3R4LT5idWYgKyBlbmQgLSA4LCAmc2N0eC0+Y291bnQsIHNpemVvZiBzY3R4LT5jb3VudCk7CisJYml0cyA9IHNjdHgtPmNvdW50ICogODsKKwltZW1jcHkoc2N0eC0+YnVmICsgZW5kIC0gOCwgJmJpdHMsIHNpemVvZihiaXRzKSk7CiAKLQlzY3R4LT5jb3VudCA9IGVuZCAqIDg7Ci19Ci0KLS8qIEFkZCBwYWRkaW5nIGFuZCByZXR1cm4gdGhlIG1lc3NhZ2UgZGlnZXN0ICovCi1zdGF0aWMgdm9pZCBzaGEyNTZfZmluYWwoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTggKm91dCkKLXsKLQlzdHJ1Y3QgczM5MF9zaGEyNTZfY3R4ICpzY3R4ID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKLQotCS8qIG11c3QgcGVyZm9ybSBtYW51YWwgcGFkZGluZyAqLwotCXBhZF9tZXNzYWdlKHNjdHgpOwotCi0JY3J5cHRfczM5MF9raW1kKEtJTURfU0hBXzI1Niwgc2N0eC0+c3RhdGUsIHNjdHgtPmJ1ZiwKLQkJCXNjdHgtPmNvdW50IC8gOCk7CisJcmV0ID0gY3J5cHRfczM5MF9raW1kKEtJTURfU0hBXzI1Niwgc2N0eC0+c3RhdGUsIHNjdHgtPmJ1ZiwgZW5kKTsKKwlCVUdfT04ocmV0ICE9IGVuZCk7CiAKIAkvKiBjb3B5IGRpZ2VzdCB0byBvdXQgKi8KIAltZW1jcHkob3V0LCBzY3R4LT5zdGF0ZSwgU0hBMjU2X0RJR0VTVF9TSVpFKTsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9kZWZjb25maWcgYi9hcmNoL3MzOTAvZGVmY29uZmlnCmluZGV4IDc0MWQyYmJiLi4wZTRkYThhIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvZGVmY29uZmlnCisrKyBiL2FyY2gvczM5MC9kZWZjb25maWcKQEAgLTEyLDYgKzEyLDcgQEAKICMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1U2NCBpcyBub3Qgc2V0CiBDT05GSUdfR0VORVJJQ19IV0VJR0hUPXkKIENPTkZJR19HRU5FUklDX1RJTUU9eQorQ09ORklHX0dFTkVSSUNfQlVHPXkKIENPTkZJR19OT19JT01FTT15CiBDT05GSUdfUzM5MD15CiBDT05GSUdfREVGQ09ORklHX0xJU1Q9Ii9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgpAQCAtMTY2LDYgKzE2Nyw3IEBACiBDT05GSUdfTk9fSURMRV9IWl9JTklUPXkKIENPTkZJR19TMzkwX0hZUEZTX0ZTPXkKIENPTkZJR19LRVhFQz15CisjIENPTkZJR19aRkNQRFVNUCBpcyBub3Qgc2V0CiAKICMKICMgTmV0d29ya2luZwpAQCAtNzA1LDYgKzcwNyw3IEBACiBDT05GSUdfREVCVUdfU1BJTkxPQ0tfU0xFRVA9eQogIyBDT05GSUdfREVCVUdfTE9DS0lOR19BUElfU0VMRlRFU1RTIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX0tPQkpFQ1QgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0U9eQogIyBDT05GSUdfREVCVUdfSU5GTyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19WTSBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19MSVNUIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL3MzOTAva2VybmVsL01ha2VmaWxlCmluZGV4IDU0OTJkMjUuLjMxOTVkMzcgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvTWFrZWZpbGUKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9NYWtlZmlsZQpAQCAtNiw3ICs2LDcgQEAKIAogb2JqLXkJOj0gIGJpdG1hcC5vIHRyYXBzLm8gdGltZS5vIHByb2Nlc3MubyBiYXNlLm8gZWFybHkubyBcCiAgICAgICAgICAgICBzZXR1cC5vIHN5c19zMzkwLm8gcHRyYWNlLm8gc2lnbmFsLm8gY3BjbWQubyBlYmNkaWMubyBcCi0JICAgIHNlbWFwaG9yZS5vIHMzOTBfZXh0Lm8gZGVidWcubyBpcnEubyBpcGwubworCSAgICBzZW1hcGhvcmUubyBzMzkwX2V4dC5vIGRlYnVnLm8gaXJxLm8gaXBsLm8gZGlzLm8KIAogb2JqLXkJKz0gJChpZiAkKENPTkZJR182NEJJVCksZW50cnk2NC5vLGVudHJ5Lm8pCiBvYmoteQkrPSAkKGlmICQoQ09ORklHXzY0QklUKSxyZWlwbDY0Lm8scmVpcGwubykKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvY29tcGF0X2xpbnV4LmMgYi9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF9saW51eC5jCmluZGV4IDY2NGM2NjkuLjUyMzZmZGIgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvY29tcGF0X2xpbnV4LmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfbGludXguYwpAQCAtNDk1LDI5ICs0OTUsMzQgQEAKICAqIHN5czMyX2V4ZWN2ZSgpIGV4ZWN1dGVzIGEgbmV3IHByb2dyYW0gYWZ0ZXIgdGhlIGFzbSBzdHViIGhhcyBzZXQKICAqIHRoaW5ncyB1cCBmb3IgdXMuICBUaGlzIHNob3VsZCBiYXNpY2FsbHkgZG8gd2hhdCBJIHdhbnQgaXQgdG8uCiAgKi8KLWFzbWxpbmthZ2UgbG9uZwotc3lzMzJfZXhlY3ZlKHN0cnVjdCBwdF9yZWdzIHJlZ3MpCithc21saW5rYWdlIGxvbmcgc3lzMzJfZXhlY3ZlKHZvaWQpCiB7Ci0gICAgICAgIGludCBlcnJvcjsKLSAgICAgICAgY2hhciAqIGZpbGVuYW1lOworCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gdGFza19wdF9yZWdzKGN1cnJlbnQpOworCWNoYXIgKmZpbGVuYW1lOworCXVuc2lnbmVkIGxvbmcgcmVzdWx0OworCWludCByYzsKIAotICAgICAgICBmaWxlbmFtZSA9IGdldG5hbWUoY29tcGF0X3B0cihyZWdzLm9yaWdfZ3ByMikpOwotICAgICAgICBlcnJvciA9IFBUUl9FUlIoZmlsZW5hbWUpOwotICAgICAgICBpZiAoSVNfRVJSKGZpbGVuYW1lKSkKKwlmaWxlbmFtZSA9IGdldG5hbWUoY29tcGF0X3B0cihyZWdzLT5vcmlnX2dwcjIpKTsKKwlpZiAoSVNfRVJSKGZpbGVuYW1lKSkgeworCQlyZXN1bHQgPSBQVFJfRVJSKGZpbGVuYW1lKTsKICAgICAgICAgICAgICAgICBnb3RvIG91dDsKLSAgICAgICAgZXJyb3IgPSBjb21wYXRfZG9fZXhlY3ZlKGZpbGVuYW1lLCBjb21wYXRfcHRyKHJlZ3MuZ3Byc1szXSksCi0JCQkJIGNvbXBhdF9wdHIocmVncy5ncHJzWzRdKSwgJnJlZ3MpOwotCWlmIChlcnJvciA9PSAwKQotCXsKLQkJdGFza19sb2NrKGN1cnJlbnQpOwotCQljdXJyZW50LT5wdHJhY2UgJj0gflBUX0RUUkFDRTsKLQkJdGFza191bmxvY2soY3VycmVudCk7Ci0JCWN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwYz0wOwotCQlhc20gdm9sYXRpbGUoInNmcGMgJTAsMCIgOiA6ICJkIiAoMCkpOwogCX0KKwlyYyA9IGNvbXBhdF9kb19leGVjdmUoZmlsZW5hbWUsIGNvbXBhdF9wdHIocmVncy0+Z3Byc1szXSksCisJCQkgICAgICBjb21wYXRfcHRyKHJlZ3MtPmdwcnNbNF0pLCByZWdzKTsKKwlpZiAocmMpIHsKKwkJcmVzdWx0ID0gcmM7CisJCWdvdG8gb3V0X3B1dG5hbWU7CisJfQorCXRhc2tfbG9jayhjdXJyZW50KTsKKwljdXJyZW50LT5wdHJhY2UgJj0gflBUX0RUUkFDRTsKKwl0YXNrX3VubG9jayhjdXJyZW50KTsKKwljdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcGM9MDsKKwlhc20gdm9sYXRpbGUoInNmcGMgJTAsMCIgOiA6ICJkIiAoMCkpOworCXJlc3VsdCA9IHJlZ3MtPmdwcnNbMl07CitvdXRfcHV0bmFtZToKICAgICAgICAgcHV0bmFtZShmaWxlbmFtZSk7CiBvdXQ6Ci0gICAgICAgIHJldHVybiBlcnJvcjsKKwlyZXR1cm4gcmVzdWx0OwogfQogCiAKQEAgLTkxOCwxOSArOTIzLDIwIEBACiAJcmV0dXJuIHN5c193cml0ZShmZCwgYnVmLCBjb3VudCk7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXMzMl9jbG9uZShzdHJ1Y3QgcHRfcmVncyByZWdzKQorYXNtbGlua2FnZSBsb25nIHN5czMyX2Nsb25lKHZvaWQpCiB7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgY2xvbmVfZmxhZ3M7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgbmV3c3A7CisJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSB0YXNrX3B0X3JlZ3MoY3VycmVudCk7CisJdW5zaWduZWQgbG9uZyBjbG9uZV9mbGFnczsKKwl1bnNpZ25lZCBsb25nIG5ld3NwOwogCWludCBfX3VzZXIgKnBhcmVudF90aWRwdHIsICpjaGlsZF90aWRwdHI7CiAKLSAgICAgICAgY2xvbmVfZmxhZ3MgPSByZWdzLmdwcnNbM10gJiAweGZmZmZmZmZmVUw7Ci0gICAgICAgIG5ld3NwID0gcmVncy5vcmlnX2dwcjIgJiAweDdmZmZmZmZmVUw7Ci0JcGFyZW50X3RpZHB0ciA9IGNvbXBhdF9wdHIocmVncy5ncHJzWzRdKTsKLQljaGlsZF90aWRwdHIgPSBjb21wYXRfcHRyKHJlZ3MuZ3Byc1s1XSk7Ci0gICAgICAgIGlmICghbmV3c3ApCi0gICAgICAgICAgICAgICAgbmV3c3AgPSByZWdzLmdwcnNbMTVdOwotICAgICAgICByZXR1cm4gZG9fZm9yayhjbG9uZV9mbGFncywgbmV3c3AsICZyZWdzLCAwLAorCWNsb25lX2ZsYWdzID0gcmVncy0+Z3Byc1szXSAmIDB4ZmZmZmZmZmZVTDsKKwluZXdzcCA9IHJlZ3MtPm9yaWdfZ3ByMiAmIDB4N2ZmZmZmZmZVTDsKKwlwYXJlbnRfdGlkcHRyID0gY29tcGF0X3B0cihyZWdzLT5ncHJzWzRdKTsKKwljaGlsZF90aWRwdHIgPSBjb21wYXRfcHRyKHJlZ3MtPmdwcnNbNV0pOworCWlmICghbmV3c3ApCisJCW5ld3NwID0gcmVncy0+Z3Byc1sxNV07CisJcmV0dXJuIGRvX2ZvcmsoY2xvbmVfZmxhZ3MsIG5ld3NwLCByZWdzLCAwLAogCQkgICAgICAgcGFyZW50X3RpZHB0ciwgY2hpbGRfdGlkcHRyKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfc2lnbmFsLmMgYi9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF9zaWduYWwuYwppbmRleCA4ODdhOTg4Li44MGE1NGEwIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF9zaWduYWwuYworKysgYi9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF9zaWduYWwuYwpAQCAtMjU1LDkgKzI1NSw5IEBACiB9CiAKIGFzbWxpbmthZ2UgbG9uZwotc3lzMzJfc2lnYWx0c3RhY2soY29uc3Qgc3RhY2tfdDMyIF9fdXNlciAqdXNzLCBzdGFja190MzIgX191c2VyICp1b3NzLAotCQkJCQkJCXN0cnVjdCBwdF9yZWdzICpyZWdzKQorc3lzMzJfc2lnYWx0c3RhY2soY29uc3Qgc3RhY2tfdDMyIF9fdXNlciAqdXNzLCBzdGFja190MzIgX191c2VyICp1b3NzKQogeworCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gdGFza19wdF9yZWdzKGN1cnJlbnQpOwogCXN0YWNrX3Qga3NzLCBrb3NzOwogCXVuc2lnbmVkIGxvbmcgc3Nfc3A7CiAJaW50IHJldCwgZXJyID0gMDsKQEAgLTM0NCw4ICszNDQsOSBAQAogCXJldHVybiAwOwogfQogCi1hc21saW5rYWdlIGxvbmcgc3lzMzJfc2lncmV0dXJuKHN0cnVjdCBwdF9yZWdzICpyZWdzKQorYXNtbGlua2FnZSBsb25nIHN5czMyX3NpZ3JldHVybih2b2lkKQogeworCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gdGFza19wdF9yZWdzKGN1cnJlbnQpOwogCXNpZ2ZyYW1lMzIgX191c2VyICpmcmFtZSA9IChzaWdmcmFtZTMyIF9fdXNlciAqKXJlZ3MtPmdwcnNbMTVdOwogCXNpZ3NldF90IHNldDsKIApAQCAtMzcwLDggKzM3MSw5IEBACiAJcmV0dXJuIDA7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXMzMl9ydF9zaWdyZXR1cm4oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCithc21saW5rYWdlIGxvbmcgc3lzMzJfcnRfc2lncmV0dXJuKHZvaWQpCiB7CisJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSB0YXNrX3B0X3JlZ3MoY3VycmVudCk7CiAJcnRfc2lnZnJhbWUzMiBfX3VzZXIgKmZyYW1lID0gKHJ0X3NpZ2ZyYW1lMzIgX191c2VyICopcmVncy0+Z3Byc1sxNV07CiAJc2lnc2V0X3Qgc2V0OwogCXN0YWNrX3Qgc3Q7CkBAIC00MDcsOCArNDA5LDggQEAKIAlyZXR1cm4gcmVncy0+Z3Byc1syXTsKIAogYmFkZnJhbWU6Ci0gICAgICAgIGZvcmNlX3NpZyhTSUdTRUdWLCBjdXJyZW50KTsKLSAgICAgICAgcmV0dXJuIDA7CisJZm9yY2Vfc2lnKFNJR1NFR1YsIGN1cnJlbnQpOworCXJldHVybiAwOwogfQkKIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvZGlzLmMgYi9hcmNoL3MzOTAva2VybmVsL2Rpcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhYmFmOTgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3MzOTAva2VybmVsL2Rpcy5jCkBAIC0wLDAgKzEsMTI3OCBAQAorLyoKKyAqIGFyY2gvczM5MC9rZXJuZWwvZGlzLmMKKyAqCisgKiBEaXNhc3NlbWJsZSBzMzkwIGluc3RydWN0aW9ucy4KKyAqCisgKiBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDcKKyAqIEF1dGhvcihzKTogTWFydGluIFNjaHdpZGVmc2t5IChzY2h3aWRlZnNreUBkZS5pYm0uY29tKSwKKyAqLworCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2thbGxzeW1zLmg+CisjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CisjaW5jbHVkZSA8bGludXgva3Byb2Jlcy5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorI2luY2x1ZGUgPGFzbS9tYXRoZW11Lmg+CisjaW5jbHVkZSA8YXNtL2NwY21kLmg+CisjaW5jbHVkZSA8YXNtL3MzOTBfZXh0Lmg+CisjaW5jbHVkZSA8YXNtL2xvd2NvcmUuaD4KKyNpbmNsdWRlIDxhc20vZGVidWcuaD4KKyNpbmNsdWRlIDxhc20va2RlYnVnLmg+CisKKyNpZm5kZWYgQ09ORklHXzY0QklUCisjZGVmaW5lIE9ORUxPTkcgIiUwOGx4OiAiCisjZWxzZSAvKiBDT05GSUdfNjRCSVQgKi8KKyNkZWZpbmUgT05FTE9ORyAiJTAxNmx4OiAiCisjZW5kaWYgLyogQ09ORklHXzY0QklUICovCisKKyNkZWZpbmUgT1BFUkFORF9HUFIJMHgxCS8qIE9wZXJhbmQgcHJpbnRlZCBhcyAlcnggKi8KKyNkZWZpbmUgT1BFUkFORF9GUFIJMHgyCS8qIE9wZXJhbmQgcHJpbnRlZCBhcyAlZnggKi8KKyNkZWZpbmUgT1BFUkFORF9BUgkweDQJLyogT3BlcmFuZCBwcmludGVkIGFzICVheCAqLworI2RlZmluZSBPUEVSQU5EX0NSCTB4OAkvKiBPcGVyYW5kIHByaW50ZWQgYXMgJWN4ICovCisjZGVmaW5lIE9QRVJBTkRfRElTUAkweDEwCS8qIE9wZXJhbmQgcHJpbnRlZCBhcyBkaXNwbGFjZW1lbnQgKi8KKyNkZWZpbmUgT1BFUkFORF9CQVNFCTB4MjAJLyogT3BlcmFuZCBwcmludGVkIGFzIGJhc2UgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgT1BFUkFORF9JTkRFWAkweDQwCS8qIE9wZXJhbmQgcHJpbnRlZCBhcyBpbmRleCByZWdpc3RlciAqLworI2RlZmluZSBPUEVSQU5EX1BDUkVMCTB4ODAJLyogT3BlcmFuZCBwcmludGVkIGFzIHBjLXJlbGF0aXZlIHN5bWJvbCAqLworI2RlZmluZSBPUEVSQU5EX1NJR05FRAkweDEwMAkvKiBPcGVyYW5kIHByaW50ZWQgYXMgc2lnbmVkIHZhbHVlICovCisjZGVmaW5lIE9QRVJBTkRfTEVOR1RICTB4MjAwCS8qIE9wZXJhbmQgcHJpbnRlZCBhcyBsZW5ndGggKCsxKSAqLworCitlbnVtIHsKKwlVTlVTRUQsCS8qIEluZGljYXRlcyB0aGUgZW5kIG9mIHRoZSBvcGVyYW5kIGxpc3QgKi8KKwlSXzgsCS8qIEdQUiBzdGFydGluZyBhdCBwb3NpdGlvbiA4ICovCisJUl8xMiwJLyogR1BSIHN0YXJ0aW5nIGF0IHBvc2l0aW9uIDEyICovCisJUl8xNiwJLyogR1BSIHN0YXJ0aW5nIGF0IHBvc2l0aW9uIDE2ICovCisJUl8yMCwJLyogR1BSIHN0YXJ0aW5nIGF0IHBvc2l0aW9uIDIwICovCisJUl8yNCwJLyogR1BSIHN0YXJ0aW5nIGF0IHBvc2l0aW9uIDI0ICovCisJUl8yOCwJLyogR1BSIHN0YXJ0aW5nIGF0IHBvc2l0aW9uIDI4ICovCisJUl8zMiwJLyogR1BSIHN0YXJ0aW5nIGF0IHBvc2l0aW9uIDMyICovCisJRl84LAkvKiBGUFIgc3RhcnRpbmcgYXQgcG9zaXRpb24gOCAqLworCUZfMTIsCS8qIEZQUiBzdGFydGluZyBhdCBwb3NpdGlvbiAxMiAqLworCUZfMTYsCS8qIEZQUiBzdGFydGluZyBhdCBwb3NpdGlvbiAxNiAqLworCUZfMjAsCS8qIEZQUiBzdGFydGluZyBhdCBwb3NpdGlvbiAxNiAqLworCUZfMjQsCS8qIEZQUiBzdGFydGluZyBhdCBwb3NpdGlvbiAyNCAqLworCUZfMjgsCS8qIEZQUiBzdGFydGluZyBhdCBwb3NpdGlvbiAyOCAqLworCUZfMzIsCS8qIEZQUiBzdGFydGluZyBhdCBwb3NpdGlvbiAzMiAqLworCUFfOCwJLyogQWNjZXNzIHJlZy4gc3RhcnRpbmcgYXQgcG9zaXRpb24gOCAqLworCUFfMTIsCS8qIEFjY2VzcyByZWcuIHN0YXJ0aW5nIGF0IHBvc2l0aW9uIDEyICovCisJQV8yNCwJLyogQWNjZXNzIHJlZy4gc3RhcnRpbmcgYXQgcG9zaXRpb24gMjQgKi8KKwlBXzI4LAkvKiBBY2Nlc3MgcmVnLiBzdGFydGluZyBhdCBwb3NpdGlvbiAyOCAqLworCUNfOCwJLyogQ29udHJvbCByZWcuIHN0YXJ0aW5nIGF0IHBvc2l0aW9uIDggKi8KKwlDXzEyLAkvKiBDb250cm9sIHJlZy4gc3RhcnRpbmcgYXQgcG9zaXRpb24gMTIgKi8KKwlCXzE2LAkvKiBCYXNlIHJlZ2lzdGVyIHN0YXJ0aW5nIGF0IHBvc2l0aW9uIDE2ICovCisJQl8zMiwJLyogQmFzZSByZWdpc3RlciBzdGFydGluZyBhdCBwb3NpdGlvbiAzMiAqLworCVhfMTIsCS8qIEluZGV4IHJlZ2lzdGVyIHN0YXJ0aW5nIGF0IHBvc2l0aW9uIDEyICovCisJRF8yMCwJLyogRGlzcGxhY2VtZW50IHN0YXJ0aW5nIGF0IHBvc2l0aW9uIDIwICovCisJRF8zNiwJLyogRGlzcGxhY2VtZW50IHN0YXJ0aW5nIGF0IHBvc2l0aW9uIDM2ICovCisJRDIwXzIwLAkvKiAyMCBiaXQgZGlzcGxhY2VtZW50IHN0YXJ0aW5nIGF0IDIwICovCisJTDRfOCwJLyogNCBiaXQgbGVuZ3RoIHN0YXJ0aW5nIGF0IHBvc2l0aW9uIDggKi8KKwlMNF8xMiwJLyogNCBiaXQgbGVuZ3RoIHN0YXJ0aW5nIGF0IHBvc2l0aW9uIDEyICovCisJTDhfOCwJLyogOCBiaXQgbGVuZ3RoIHN0YXJ0aW5nIGF0IHBvc2l0aW9uIDggKi8KKwlVNF84LAkvKiA0IGJpdCB1bnNpZ25lZCB2YWx1ZSBzdGFydGluZyBhdCA4ICovCisJVTRfMTIsCS8qIDQgYml0IHVuc2lnbmVkIHZhbHVlIHN0YXJ0aW5nIGF0IDEyICovCisJVTRfMTYsCS8qIDQgYml0IHVuc2lnbmVkIHZhbHVlIHN0YXJ0aW5nIGF0IDE2ICovCisJVTRfMjAsCS8qIDQgYml0IHVuc2lnbmVkIHZhbHVlIHN0YXJ0aW5nIGF0IDIwICovCisJVThfOCwJLyogOCBiaXQgdW5zaWduZWQgdmFsdWUgc3RhcnRpbmcgYXQgOCAqLworCVU4XzE2LAkvKiA4IGJpdCB1bnNpZ25lZCB2YWx1ZSBzdGFydGluZyBhdCAxNiAqLworCUkxNl8xNiwJLyogMTYgYml0IHNpZ25lZCB2YWx1ZSBzdGFydGluZyBhdCAxNiAqLworCVUxNl8xNiwJLyogMTYgYml0IHVuc2lnbmVkIHZhbHVlIHN0YXJ0aW5nIGF0IDE2ICovCisJSjE2XzE2LAkvKiBQQyByZWxhdGl2ZSBqdW1wIG9mZnNldCBhdCAxNiAqLworCUozMl8xNiwJLyogUEMgcmVsYXRpdmUgbG9uZyBvZmZzZXQgYXQgMTYgKi8KKwlJMzJfMTYsCS8qIDMyIGJpdCBzaWduZWQgdmFsdWUgc3RhcnRpbmcgYXQgMTYgKi8KKwlVMzJfMTYsCS8qIDMyIGJpdCB1bnNpZ25lZCB2YWx1ZSBzdGFydGluZyBhdCAxNiAqLworCU1fMTYsCS8qIDQgYml0IG9wdGlvbmFsIG1hc2sgc3RhcnRpbmcgYXQgMTYgKi8KKwlST18yOCwJLyogb3B0aW9uYWwgR1BSIHN0YXJ0aW5nIGF0IHBvc2l0aW9uIDI4ICovCit9OworCisvKgorICogRW51bWVyYXRpb24gb2YgdGhlIGRpZmZlcmVudCBpbnN0cnVjdGlvbiBmb3JtYXRzLgorICogRm9yIGRldGFpbHMgY29uc3VsdCB0aGUgcHJpbmNpcGxlcyBvZiBvcGVyYXRpb24uCisgKi8KK2VudW0geworCUlOU1RSX0lOVkFMSUQsCisJSU5TVFJfRSwgSU5TVFJfUklFX1JSUCwgSU5TVFJfUklMX1JJLCBJTlNUUl9SSUxfUlAsIElOU1RSX1JJTF9SVSwKKwlJTlNUUl9SSUxfVVAsIElOU1RSX1JJX1JJLCBJTlNUUl9SSV9SUCwgSU5TVFJfUklfUlUsIElOU1RSX1JJX1VQLAorCUlOU1RSX1JSRV8wMCwgSU5TVFJfUlJFXzBSLCBJTlNUUl9SUkVfQUEsIElOU1RSX1JSRV9BUiwgSU5TVFJfUlJFX0YwLAorCUlOU1RSX1JSRV9GRiwgSU5TVFJfUlJFX1IwLCBJTlNUUl9SUkVfUkEsIElOU1RSX1JSRV9SRiwgSU5TVFJfUlJFX1JSLAorCUlOU1RSX1JSRV9SUl9PUFQsIElOU1RSX1JSRl9GMEZGLCBJTlNUUl9SUkZfRlVGRiwgSU5TVFJfUlJGX00wUlIsCisJSU5TVFJfUlJGX1IwUlIsIElOU1RSX1JSRl9SVVJSLCBJTlNUUl9SUkZfVTBGRiwgSU5TVFJfUlJGX1UwUkYsCisJSU5TVFJfUlJfRkYsIElOU1RSX1JSX1IwLCBJTlNUUl9SUl9SUiwgSU5TVFJfUlJfVTAsIElOU1RSX1JSX1VSLAorCUlOU1RSX1JTRV9DQ1JELCBJTlNUUl9SU0VfUlJSRCwgSU5TVFJfUlNFX1JVUkQsIElOU1RSX1JTSV9SUlAsCisJSU5TVFJfUlNMX1IwUkQsIElOU1RSX1JTWV9BQVJELCBJTlNUUl9SU1lfQ0NSRCwgSU5TVFJfUlNZX1JSUkQsCisJSU5TVFJfUlNZX1JVUkQsIElOU1RSX1JTX0FBUkQsIElOU1RSX1JTX0NDUkQsIElOU1RSX1JTX1IwUkQsCisJSU5TVFJfUlNfUlJSRCwgSU5TVFJfUlNfUlVSRCwgSU5TVFJfUlhFX0ZSUkQsIElOU1RSX1JYRV9SUlJELAorCUlOU1RSX1JYRl9GUlJERiwgSU5TVFJfUlhZX0ZSUkQsIElOU1RSX1JYWV9SUlJELCBJTlNUUl9SWF9GUlJELAorCUlOU1RSX1JYX1JSUkQsIElOU1RSX1JYX1VSUkQsIElOU1RSX1NJWV9VUkQsIElOU1RSX1NJX1VSRCwKKwlJTlNUUl9TU0VfUkRSRCwgSU5TVFJfU1NGX1JSRFJELCBJTlNUUl9TU19MMFJEUkQsIElOU1RSX1NTX0xJUkRSRCwKKwlJTlNUUl9TU19MTFJEUkQsIElOU1RSX1NTX1JSUkRSRCwgSU5TVFJfU1NfUlJSRFJEMiwgSU5TVFJfU1NfUlJSRFJEMywKKwlJTlNUUl9TXzAwLCBJTlNUUl9TX1JELAorfTsKKworc3RydWN0IG9wZXJhbmQgeworCWludCBiaXRzOwkJLyogVGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBvcGVyYW5kLiAqLworCWludCBzaGlmdDsJCS8qIFRoZSBudW1iZXIgb2YgYml0cyB0byBzaGlmdC4gKi8KKwlpbnQgZmxhZ3M7CQkvKiBPbmUgYml0IHN5bnRheCBmbGFncy4gKi8KK307CisKK3N0cnVjdCBpbnNuIHsKKwljb25zdCBjaGFyIG5hbWVbNV07CisJdW5zaWduZWQgY2hhciBvcGZyYWc7CisJdW5zaWduZWQgY2hhciBmb3JtYXQ7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9wZXJhbmQgb3BlcmFuZHNbXSA9Cit7CisJW1VOVVNFRF0gID0geyAwLCAwLCAwIH0sCisJW1JfOF0JID0geyAgNCwgIDgsIE9QRVJBTkRfR1BSIH0sCisJW1JfMTJdCSA9IHsgIDQsIDEyLCBPUEVSQU5EX0dQUiB9LAorCVtSXzE2XQkgPSB7ICA0LCAxNiwgT1BFUkFORF9HUFIgfSwKKwlbUl8yMF0JID0geyAgNCwgMjAsIE9QRVJBTkRfR1BSIH0sCisJW1JfMjRdCSA9IHsgIDQsIDI0LCBPUEVSQU5EX0dQUiB9LAorCVtSXzI4XQkgPSB7ICA0LCAyOCwgT1BFUkFORF9HUFIgfSwKKwlbUl8zMl0JID0geyAgNCwgMzIsIE9QRVJBTkRfR1BSIH0sCisJW0ZfOF0JID0geyAgNCwgIDgsIE9QRVJBTkRfRlBSIH0sCisJW0ZfMTJdCSA9IHsgIDQsIDEyLCBPUEVSQU5EX0ZQUiB9LAorCVtGXzE2XQkgPSB7ICA0LCAxNiwgT1BFUkFORF9GUFIgfSwKKwlbRl8yMF0JID0geyAgNCwgMTYsIE9QRVJBTkRfRlBSIH0sCisJW0ZfMjRdCSA9IHsgIDQsIDI0LCBPUEVSQU5EX0ZQUiB9LAorCVtGXzI4XQkgPSB7ICA0LCAyOCwgT1BFUkFORF9GUFIgfSwKKwlbRl8zMl0JID0geyAgNCwgMzIsIE9QRVJBTkRfRlBSIH0sCisJW0FfOF0JID0geyAgNCwgIDgsIE9QRVJBTkRfQVIgfSwKKwlbQV8xMl0JID0geyAgNCwgMTIsIE9QRVJBTkRfQVIgfSwKKwlbQV8yNF0JID0geyAgNCwgMjQsIE9QRVJBTkRfQVIgfSwKKwlbQV8yOF0JID0geyAgNCwgMjgsIE9QRVJBTkRfQVIgfSwKKwlbQ184XQkgPSB7ICA0LCAgOCwgT1BFUkFORF9DUiB9LAorCVtDXzEyXQkgPSB7ICA0LCAxMiwgT1BFUkFORF9DUiB9LAorCVtCXzE2XQkgPSB7ICA0LCAxNiwgT1BFUkFORF9CQVNFIHwgT1BFUkFORF9HUFIgfSwKKwlbQl8zMl0JID0geyAgNCwgMzIsIE9QRVJBTkRfQkFTRSB8IE9QRVJBTkRfR1BSIH0sCisJW1hfMTJdCSA9IHsgIDQsIDEyLCBPUEVSQU5EX0lOREVYIHwgT1BFUkFORF9HUFIgfSwKKwlbRF8yMF0JID0geyAxMiwgMjAsIE9QRVJBTkRfRElTUCB9LAorCVtEXzM2XQkgPSB7IDEyLCAzNiwgT1BFUkFORF9ESVNQIH0sCisJW0QyMF8yMF0gPSB7IDIwLCAyMCwgT1BFUkFORF9ESVNQIHwgT1BFUkFORF9TSUdORUQgfSwKKwlbTDRfOF0JID0geyAgNCwgIDgsIE9QRVJBTkRfTEVOR1RIIH0sCisJW0w0XzEyXSAgPSB7ICA0LCAxMiwgT1BFUkFORF9MRU5HVEggfSwKKwlbTDhfOF0JID0geyAgOCwgIDgsIE9QRVJBTkRfTEVOR1RIIH0sCisJW1U0XzhdCSA9IHsgIDQsICA4LCAwIH0sCisJW1U0XzEyXSAgPSB7ICA0LCAxMiwgMCB9LAorCVtVNF8xNl0gID0geyAgNCwgMTYsIDAgfSwKKwlbVTRfMjBdICA9IHsgIDQsIDIwLCAwIH0sCisJW1U4XzhdCSA9IHsgIDgsICA4LCAwIH0sCisJW1U4XzE2XSAgPSB7ICA4LCAxNiwgMCB9LAorCVtJMTZfMTZdID0geyAxNiwgMTYsIE9QRVJBTkRfU0lHTkVEIH0sCisJW1UxNl8xNl0gPSB7IDE2LCAxNiwgMCB9LAorCVtKMTZfMTZdID0geyAxNiwgMTYsIE9QRVJBTkRfUENSRUwgfSwKKwlbSjMyXzE2XSA9IHsgMzIsIDE2LCBPUEVSQU5EX1BDUkVMIH0sCisJW0kzMl8xNl0gPSB7IDMyLCAxNiwgT1BFUkFORF9TSUdORUQgfSwKKwlbVTMyXzE2XSA9IHsgMzIsIDE2LCAwIH0sCisJW01fMTZdCSA9IHsgIDQsIDE2LCAwIH0sCisJW1JPXzI4XSAgPSB7ICA0LCAyOCwgT1BFUkFORF9HUFIgfQorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgZm9ybWF0c1tdWzddID0geworCVtJTlNUUl9FXQkgID0geyAweGZmLCAwLDAsMCwwLDAsMCB9LAkgICAgICAgLyogZS5nLiBwciAgICAqLworCVtJTlNUUl9SSUVfUlJQXQkgID0geyAweGZmLCBSXzgsUl8xMixKMTZfMTYsMCwwLDAgfSwgICAvKiBlLmcuIGJyeGhnICovCisJW0lOU1RSX1JJTF9SUF0JICA9IHsgMHgwZiwgUl84LEozMl8xNiwwLDAsMCwwIH0sICAgICAgLyogZS5nLiBicmFzbCAqLworCVtJTlNUUl9SSUxfVVBdCSAgPSB7IDB4MGYsIFU0XzgsSjMyXzE2LDAsMCwwLDAgfSwgICAgIC8qIGUuZy4gYnJjbCAgKi8KKwlbSU5TVFJfUklMX1JJXQkgID0geyAweDBmLCBSXzgsSTMyXzE2LDAsMCwwLDAgfSwgICAgICAvKiBlLmcuIGFmaSAgICovCisJW0lOU1RSX1JJTF9SVV0JICA9IHsgMHgwZiwgUl84LFUzMl8xNiwwLDAsMCwwIH0sICAgICAgLyogZS5nLiBhbGZpICAqLworCVtJTlNUUl9SSV9SSV0JICA9IHsgMHgwZiwgUl84LEkxNl8xNiwwLDAsMCwwIH0sICAgICAgLyogZS5nLiBhaGkgICAqLworCVtJTlNUUl9SSV9SUF0JICA9IHsgMHgwZiwgUl84LEoxNl8xNiwwLDAsMCwwIH0sICAgICAgLyogZS5nLiBicmN0ICAqLworCVtJTlNUUl9SSV9SVV0JICA9IHsgMHgwZiwgUl84LFUxNl8xNiwwLDAsMCwwIH0sICAgICAgLyogZS5nLiB0bWwgICAqLworCVtJTlNUUl9SSV9VUF0JICA9IHsgMHgwZiwgVTRfOCxKMTZfMTYsMCwwLDAsMCB9LCAgICAgLyogZS5nLiBicmMgICAqLworCVtJTlNUUl9SUkVfMDBdCSAgPSB7IDB4ZmYsIDAsMCwwLDAsMCwwIH0sCSAgICAgICAvKiBlLmcuIHBhbGIgICovCisJW0lOU1RSX1JSRV8wUl0JICA9IHsgMHhmZiwgUl8yOCwwLDAsMCwwLDAgfSwJICAgICAgIC8qIGUuZy4gdGIgICAgKi8KKwlbSU5TVFJfUlJFX0FBXQkgID0geyAweGZmLCBBXzI0LEFfMjgsMCwwLDAsMCB9LCAgICAgICAvKiBlLmcuIGNweWEgICovCisJW0lOU1RSX1JSRV9BUl0JICA9IHsgMHhmZiwgQV8yNCxSXzI4LDAsMCwwLDAgfSwgICAgICAgLyogZS5nLiBzYXIgICAqLworCVtJTlNUUl9SUkVfRjBdCSAgPSB7IDB4ZmYsIEZfMjQsMCwwLDAsMCwwIH0sCSAgICAgICAvKiBlLmcuIHNxZXIgICovCisJW0lOU1RSX1JSRV9GRl0JICA9IHsgMHhmZiwgRl8yNCxGXzI4LDAsMCwwLDAgfSwgICAgICAgLyogZS5nLiBkZWJyICAqLworCVtJTlNUUl9SUkVfUjBdCSAgPSB7IDB4ZmYsIFJfMjQsMCwwLDAsMCwwIH0sCSAgICAgICAvKiBlLmcuIGlwbSAgICovCisJW0lOU1RSX1JSRV9SQV0JICA9IHsgMHhmZiwgUl8yNCxBXzI4LDAsMCwwLDAgfSwgICAgICAgLyogZS5nLiBlYXIgICAqLworCVtJTlNUUl9SUkVfUkZdCSAgPSB7IDB4ZmYsIFJfMjQsRl8yOCwwLDAsMCwwIH0sICAgICAgIC8qIGUuZy4gY2VmYnIgKi8KKwlbSU5TVFJfUlJFX1JSXQkgID0geyAweGZmLCBSXzI0LFJfMjgsMCwwLDAsMCB9LCAgICAgICAvKiBlLmcuIGx1cmEgICovCisJW0lOU1RSX1JSRV9SUl9PUFRdPSB7IDB4ZmYsIFJfMjQsUk9fMjgsMCwwLDAsMCB9LCAgICAgIC8qIGVmcGMsIHNmcGMgKi8KKwlbSU5TVFJfUlJGX0YwRkZdICA9IHsgMHhmZiwgRl8xNixGXzI0LEZfMjgsMCwwLDAgfSwgICAgLyogZS5nLiBtYWRiciAqLworCVtJTlNUUl9SUkZfRlVGRl0gID0geyAweGZmLCBGXzI0LEZfMTYsRl8yOCxVNF8yMCwwLDAgfSwvKiBlLmcuIGRpZGJyICovCisJW0lOU1RSX1JSRl9SVVJSXSAgPSB7IDB4ZmYsIFJfMjQsUl8yOCxSXzE2LFU0XzIwLDAsMCB9LC8qIGUuZy4gLmluc24gKi8KKwlbSU5TVFJfUlJGX1IwUlJdICA9IHsgMHhmZiwgUl8yNCxSXzI4LFJfMTYsMCwwLDAgfSwgICAgLyogZS5nLiBpZHRlICAqLworCVtJTlNUUl9SUkZfVTBGRl0gID0geyAweGZmLCBGXzI0LFU0XzE2LEZfMjgsMCwwLDAgfSwgICAvKiBlLmcuIGZpeHIgICovCisJW0lOU1RSX1JSRl9VMFJGXSAgPSB7IDB4ZmYsIFJfMjQsVTRfMTYsRl8yOCwwLDAsMCB9LCAgIC8qIGUuZy4gY2ZlYnIgKi8KKwlbSU5TVFJfUlJGX00wUlJdICA9IHsgMHhmZiwgUl8yNCxSXzI4LE1fMTYsMCwwLDAgfSwgICAgLyogZS5nLiBzc2tlICAqLworCVtJTlNUUl9SUl9GRl0JICA9IHsgMHhmZiwgRl84LEZfMTIsMCwwLDAsMCB9LCAgICAgICAgLyogZS5nLiBhZHIgICAqLworCVtJTlNUUl9SUl9SMF0JICA9IHsgMHhmZiwgUl84LCAwLDAsMCwwLDAgfSwJICAgICAgIC8qIGUuZy4gc3BtICAgKi8KKwlbSU5TVFJfUlJfUlJdCSAgPSB7IDB4ZmYsIFJfOCxSXzEyLDAsMCwwLDAgfSwgICAgICAgIC8qIGUuZy4gbHIgICAgKi8KKwlbSU5TVFJfUlJfVTBdCSAgPSB7IDB4ZmYsIFU4XzgsIDAsMCwwLDAsMCB9LAkgICAgICAgLyogZS5nLiBzdmMgICAqLworCVtJTlNUUl9SUl9VUl0JICA9IHsgMHhmZiwgVTRfOCxSXzEyLDAsMCwwLDAgfSwgICAgICAgLyogZS5nLiBiY3IgICAqLworCVtJTlNUUl9SU0VfUlJSRF0gID0geyAweGZmLCBSXzgsUl8xMixEXzIwLEJfMTYsMCwwIH0sICAvKiBlLmcuIGxtaCAgICovCisJW0lOU1RSX1JTRV9DQ1JEXSAgPSB7IDB4ZmYsIENfOCxDXzEyLERfMjAsQl8xNiwwLDAgfSwgIC8qIGUuZy4gbG1oICAgKi8KKwlbSU5TVFJfUlNFX1JVUkRdICA9IHsgMHhmZiwgUl84LFU0XzEyLERfMjAsQl8xNiwwLDAgfSwgLyogZS5nLiBpY21oICAqLworCVtJTlNUUl9SU0xfUjBSRF0gID0geyAweGZmLCBSXzgsRF8yMCxCXzE2LDAsMCwwIH0sICAgICAvKiBlLmcuIHRwICAgICovCisJW0lOU1RSX1JTSV9SUlBdCSAgPSB7IDB4ZmYsIFJfOCxSXzEyLEoxNl8xNiwwLDAsMCB9LCAgIC8qIGUuZy4gYnJ4aCAgKi8KKwlbSU5TVFJfUlNZX1JSUkRdICA9IHsgMHhmZiwgUl84LFJfMTIsRDIwXzIwLEJfMTYsMCwwIH0sLyogZS5nLiBzdG15ICAqLworCVtJTlNUUl9SU1lfUlVSRF0gID0geyAweGZmLCBSXzgsVTRfMTIsRDIwXzIwLEJfMTYsMCwwIH0sCisJCQkJCQkJICAgICAgIC8qIGUuZy4gaWNtaCAgKi8KKwlbSU5TVFJfUlNZX0FBUkRdICA9IHsgMHhmZiwgQV84LEFfMTIsRDIwXzIwLEJfMTYsMCwwIH0sLyogZS5nLiBsYW15ICAqLworCVtJTlNUUl9SU1lfQ0NSRF0gID0geyAweGZmLCBDXzgsQ18xMixEMjBfMjAsQl8xNiwwLDAgfSwvKiBlLmcuIGxhbXkgICovCisJW0lOU1RSX1JTX0FBUkRdCSAgPSB7IDB4ZmYsIEFfOCxBXzEyLERfMjAsQl8xNiwwLDAgfSwgIC8qIGUuZy4gbGFtICAgKi8KKwlbSU5TVFJfUlNfQ0NSRF0JICA9IHsgMHhmZiwgQ184LENfMTIsRF8yMCxCXzE2LDAsMCB9LCAgLyogZS5nLiBsY3RsICAqLworCVtJTlNUUl9SU19SMFJEXQkgID0geyAweGZmLCBSXzgsRF8yMCxCXzE2LDAsMCwwIH0sICAgICAvKiBlLmcuIHNsbCAgICovCisJW0lOU1RSX1JTX1JSUkRdCSAgPSB7IDB4ZmYsIFJfOCxSXzEyLERfMjAsQl8xNiwwLDAgfSwgIC8qIGUuZy4gY3MgICAgKi8KKwlbSU5TVFJfUlNfUlVSRF0JICA9IHsgMHhmZiwgUl84LFU0XzEyLERfMjAsQl8xNiwwLDAgfSwgLyogZS5nLiBpY20gICAqLworCVtJTlNUUl9SWEVfRlJSRF0gID0geyAweGZmLCBGXzgsRF8yMCxYXzEyLEJfMTYsMCwwIH0sICAvKiBlLmcuIGF4YnIgICovCisJW0lOU1RSX1JYRV9SUlJEXSAgPSB7IDB4ZmYsIFJfOCxEXzIwLFhfMTIsQl8xNiwwLDAgfSwgIC8qIGUuZy4gbGcgICAgKi8KKwlbSU5TVFJfUlhGX0ZSUkRGXSA9IHsgMHhmZiwgRl8zMixGXzgsRF8yMCxYXzEyLEJfMTYsMCB9LAorCQkJCQkJCSAgICAgICAvKiBlLmcuIG1hZGIgICovCisJW0lOU1RSX1JYWV9SUlJEXSAgPSB7IDB4ZmYsIFJfOCxEMjBfMjAsWF8xMixCXzE2LDAsMCB9LC8qIGUuZy4gbHkgICAgKi8KKwlbSU5TVFJfUlhZX0ZSUkRdICA9IHsgMHhmZiwgRl84LEQyMF8yMCxYXzEyLEJfMTYsMCwwIH0sLyogZS5nLiBsZXkgICAqLworCVtJTlNUUl9SWF9GUlJEXQkgID0geyAweGZmLCBGXzgsRF8yMCxYXzEyLEJfMTYsMCwwIH0sICAvKiBlLmcuIGFlICAgICovCisJW0lOU1RSX1JYX1JSUkRdCSAgPSB7IDB4ZmYsIFJfOCxEXzIwLFhfMTIsQl8xNiwwLDAgfSwgIC8qIGUuZy4gbCAgICAgKi8KKwlbSU5TVFJfUlhfVVJSRF0JICA9IHsgMHgwMCwgVTRfOCxEXzIwLFhfMTIsQl8xNiwwLDAgfSwgLyogZS5nLiBiYyAgICAqLworCVtJTlNUUl9TSV9VUkRdCSAgPSB7IDB4MDAsIERfMjAsQl8xNixVOF84LDAsMCwwIH0sICAgIC8qIGUuZy4gY2xpICAgKi8KKwlbSU5TVFJfU0lZX1VSRF0JICA9IHsgMHhmZiwgRDIwXzIwLEJfMTYsVThfOCwwLDAsMCB9LCAgLyogZS5nLiB0bXkgICAqLworCVtJTlNUUl9TU0VfUkRSRF0gID0geyAweGZmLCBEXzIwLEJfMTYsRF8zNixCXzMyLDAsMCB9LCAvKiBlLmcuIG12c2RrICovCisJW0lOU1RSX1NTX0wwUkRSRF0gPSB7IDB4ZmYsIERfMjAsTDhfOCxCXzE2LERfMzYsQl8zMiwwIH0sCisJCQkJCQkJICAgICAgIC8qIGUuZy4gbXZjICAgKi8KKwlbSU5TVFJfU1NfTElSRFJEXSA9IHsgMHhmZiwgRF8yMCxMNF84LEJfMTYsRF8zNixCXzMyLFU0XzEyIH0sCisJCQkJCQkJICAgICAgIC8qIGUuZy4gc3JwICAgKi8KKwlbSU5TVFJfU1NfTExSRFJEXSA9IHsgMHhmZiwgRF8yMCxMNF84LEJfMTYsRF8zNixMNF8xMixCXzMyIH0sCisJCQkJCQkJICAgICAgIC8qIGUuZy4gcGFjayAgKi8KKwlbSU5TVFJfU1NfUlJSRFJEXSA9IHsgMHhmZiwgRF8yMCxSXzgsQl8xNixEXzM2LEJfMzIsUl8xMiB9LAorCQkJCQkJCSAgICAgICAvKiBlLmcuIG12Y2sgICovCisJW0lOU1RSX1NTX1JSUkRSRDJdPSB7IDB4ZmYsIFJfOCxEXzIwLEJfMTYsUl8xMixEXzM2LEJfMzIgfSwKKwkJCQkJCQkgICAgICAgLyogZS5nLiBwbG8gICAqLworCVtJTlNUUl9TU19SUlJEUkQzXT0geyAweGZmLCBSXzgsUl8xMixEXzIwLEJfMTYsRF8zNixCXzMyIH0sCisJCQkJCQkJICAgICAgIC8qIGUuZy4gbG1kICAgKi8KKwlbSU5TVFJfU18wMF0JICA9IHsgMHhmZiwgMCwwLDAsMCwwLDAgfSwJICAgICAgIC8qIGUuZy4gaHNjaCAgKi8KKwlbSU5TVFJfU19SRF0JICA9IHsgMHhmZiwgRF8yMCxCXzE2LDAsMCwwLDAgfSwgICAgICAgLyogZS5nLiBscHN3ICAqLworCVtJTlNUUl9TU0ZfUlJEUkRdID0geyAweDAwLCBEXzIwLEJfMTYsRF8zNixCXzMyLFJfOCwwIH0sCisJCQkJCQkJICAgICAgIC8qIGUuZy4gbXZjb3MgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgaW5zbiBvcGNvZGVbXSA9IHsKKyNpZmRlZiBDT05GSUdfNjRCSVQKKwl7ICJsbWQiLCAweGVmLCBJTlNUUl9TU19SUlJEUkQzIH0sCisjZW5kaWYKKwl7ICJzcG0iLCAweDA0LCBJTlNUUl9SUl9SMCB9LAorCXsgImJhbHIiLCAweDA1LCBJTlNUUl9SUl9SUiB9LAorCXsgImJjdHIiLCAweDA2LCBJTlNUUl9SUl9SUiB9LAorCXsgImJjciIsIDB4MDcsIElOU1RSX1JSX1VSIH0sCisJeyAic3ZjIiwgMHgwYSwgSU5TVFJfUlJfVTAgfSwKKwl7ICJic20iLCAweDBiLCBJTlNUUl9SUl9SUiB9LAorCXsgImJhc3NtIiwgMHgwYywgSU5TVFJfUlJfUlIgfSwKKwl7ICJiYXNyIiwgMHgwZCwgSU5TVFJfUlJfUlIgfSwKKwl7ICJtdmNsIiwgMHgwZSwgSU5TVFJfUlJfUlIgfSwKKwl7ICJjbGNsIiwgMHgwZiwgSU5TVFJfUlJfUlIgfSwKKwl7ICJscHIiLCAweDEwLCBJTlNUUl9SUl9SUiB9LAorCXsgImxuciIsIDB4MTEsIElOU1RSX1JSX1JSIH0sCisJeyAibHRyIiwgMHgxMiwgSU5TVFJfUlJfUlIgfSwKKwl7ICJsY3IiLCAweDEzLCBJTlNUUl9SUl9SUiB9LAorCXsgIm5yIiwgMHgxNCwgSU5TVFJfUlJfUlIgfSwKKwl7ICJjbHIiLCAweDE1LCBJTlNUUl9SUl9SUiB9LAorCXsgIm9yIiwgMHgxNiwgSU5TVFJfUlJfUlIgfSwKKwl7ICJ4ciIsIDB4MTcsIElOU1RSX1JSX1JSIH0sCisJeyAibHIiLCAweDE4LCBJTlNUUl9SUl9SUiB9LAorCXsgImNyIiwgMHgxOSwgSU5TVFJfUlJfUlIgfSwKKwl7ICJhciIsIDB4MWEsIElOU1RSX1JSX1JSIH0sCisJeyAic3IiLCAweDFiLCBJTlNUUl9SUl9SUiB9LAorCXsgIm1yIiwgMHgxYywgSU5TVFJfUlJfUlIgfSwKKwl7ICJkciIsIDB4MWQsIElOU1RSX1JSX1JSIH0sCisJeyAiYWxyIiwgMHgxZSwgSU5TVFJfUlJfUlIgfSwKKwl7ICJzbHIiLCAweDFmLCBJTlNUUl9SUl9SUiB9LAorCXsgImxwZHIiLCAweDIwLCBJTlNUUl9SUl9GRiB9LAorCXsgImxuZHIiLCAweDIxLCBJTlNUUl9SUl9GRiB9LAorCXsgImx0ZHIiLCAweDIyLCBJTlNUUl9SUl9GRiB9LAorCXsgImxjZHIiLCAweDIzLCBJTlNUUl9SUl9GRiB9LAorCXsgImhkciIsIDB4MjQsIElOU1RSX1JSX0ZGIH0sCisJeyAibGR4ciIsIDB4MjUsIElOU1RSX1JSX0ZGIH0sCisJeyAibHJkciIsIDB4MjUsIElOU1RSX1JSX0ZGIH0sCisJeyAibXhyIiwgMHgyNiwgSU5TVFJfUlJfRkYgfSwKKwl7ICJteGRyIiwgMHgyNywgSU5TVFJfUlJfRkYgfSwKKwl7ICJsZHIiLCAweDI4LCBJTlNUUl9SUl9GRiB9LAorCXsgImNkciIsIDB4MjksIElOU1RSX1JSX0ZGIH0sCisJeyAiYWRyIiwgMHgyYSwgSU5TVFJfUlJfRkYgfSwKKwl7ICJzZHIiLCAweDJiLCBJTlNUUl9SUl9GRiB9LAorCXsgIm1kciIsIDB4MmMsIElOU1RSX1JSX0ZGIH0sCisJeyAiZGRyIiwgMHgyZCwgSU5TVFJfUlJfRkYgfSwKKwl7ICJhd3IiLCAweDJlLCBJTlNUUl9SUl9GRiB9LAorCXsgInN3ciIsIDB4MmYsIElOU1RSX1JSX0ZGIH0sCisJeyAibHBlciIsIDB4MzAsIElOU1RSX1JSX0ZGIH0sCisJeyAibG5lciIsIDB4MzEsIElOU1RSX1JSX0ZGIH0sCisJeyAibHRlciIsIDB4MzIsIElOU1RSX1JSX0ZGIH0sCisJeyAibGNlciIsIDB4MzMsIElOU1RSX1JSX0ZGIH0sCisJeyAiaGVyIiwgMHgzNCwgSU5TVFJfUlJfRkYgfSwKKwl7ICJsZWRyIiwgMHgzNSwgSU5TVFJfUlJfRkYgfSwKKwl7ICJscmVyIiwgMHgzNSwgSU5TVFJfUlJfRkYgfSwKKwl7ICJheHIiLCAweDM2LCBJTlNUUl9SUl9GRiB9LAorCXsgInN4ciIsIDB4MzcsIElOU1RSX1JSX0ZGIH0sCisJeyAibGVyIiwgMHgzOCwgSU5TVFJfUlJfRkYgfSwKKwl7ICJjZXIiLCAweDM5LCBJTlNUUl9SUl9GRiB9LAorCXsgImFlciIsIDB4M2EsIElOU1RSX1JSX0ZGIH0sCisJeyAic2VyIiwgMHgzYiwgSU5TVFJfUlJfRkYgfSwKKwl7ICJtZGVyIiwgMHgzYywgSU5TVFJfUlJfRkYgfSwKKwl7ICJtZXIiLCAweDNjLCBJTlNUUl9SUl9GRiB9LAorCXsgImRlciIsIDB4M2QsIElOU1RSX1JSX0ZGIH0sCisJeyAiYXVyIiwgMHgzZSwgSU5TVFJfUlJfRkYgfSwKKwl7ICJzdXIiLCAweDNmLCBJTlNUUl9SUl9GRiB9LAorCXsgInN0aCIsIDB4NDAsIElOU1RSX1JYX1JSUkQgfSwKKwl7ICJsYSIsIDB4NDEsIElOU1RSX1JYX1JSUkQgfSwKKwl7ICJzdGMiLCAweDQyLCBJTlNUUl9SWF9SUlJEIH0sCisJeyAiaWMiLCAweDQzLCBJTlNUUl9SWF9SUlJEIH0sCisJeyAiZXgiLCAweDQ0LCBJTlNUUl9SWF9SUlJEIH0sCisJeyAiYmFsIiwgMHg0NSwgSU5TVFJfUlhfUlJSRCB9LAorCXsgImJjdCIsIDB4NDYsIElOU1RSX1JYX1JSUkQgfSwKKwl7ICJiYyIsIDB4NDcsIElOU1RSX1JYX1VSUkQgfSwKKwl7ICJsaCIsIDB4NDgsIElOU1RSX1JYX1JSUkQgfSwKKwl7ICJjaCIsIDB4NDksIElOU1RSX1JYX1JSUkQgfSwKKwl7ICJhaCIsIDB4NGEsIElOU1RSX1JYX1JSUkQgfSwKKwl7ICJzaCIsIDB4NGIsIElOU1RSX1JYX1JSUkQgfSwKKwl7ICJtaCIsIDB4NGMsIElOU1RSX1JYX1JSUkQgfSwKKwl7ICJiYXMiLCAweDRkLCBJTlNUUl9SWF9SUlJEIH0sCisJeyAiY3ZkIiwgMHg0ZSwgSU5TVFJfUlhfUlJSRCB9LAorCXsgImN2YiIsIDB4NGYsIElOU1RSX1JYX1JSUkQgfSwKKwl7ICJzdCIsIDB4NTAsIElOU1RSX1JYX1JSUkQgfSwKKwl7ICJsYWUiLCAweDUxLCBJTlNUUl9SWF9SUlJEIH0sCisJeyAibiIsIDB4NTQsIElOU1RSX1JYX1JSUkQgfSwKKwl7ICJjbCIsIDB4NTUsIElOU1RSX1JYX1JSUkQgfSwKKwl7ICJvIiwgMHg1NiwgSU5TVFJfUlhfUlJSRCB9LAorCXsgIngiLCAweDU3LCBJTlNUUl9SWF9SUlJEIH0sCisJeyAibCIsIDB4NTgsIElOU1RSX1JYX1JSUkQgfSwKKwl7ICJjIiwgMHg1OSwgSU5TVFJfUlhfUlJSRCB9LAorCXsgImEiLCAweDVhLCBJTlNUUl9SWF9SUlJEIH0sCisJeyAicyIsIDB4NWIsIElOU1RSX1JYX1JSUkQgfSwKKwl7ICJtIiwgMHg1YywgSU5TVFJfUlhfUlJSRCB9LAorCXsgImQiLCAweDVkLCBJTlNUUl9SWF9SUlJEIH0sCisJeyAiYWwiLCAweDVlLCBJTlNUUl9SWF9SUlJEIH0sCisJeyAic2wiLCAweDVmLCBJTlNUUl9SWF9SUlJEIH0sCisJeyAic3RkIiwgMHg2MCwgSU5TVFJfUlhfRlJSRCB9LAorCXsgIm14ZCIsIDB4NjcsIElOU1RSX1JYX0ZSUkQgfSwKKwl7ICJsZCIsIDB4NjgsIElOU1RSX1JYX0ZSUkQgfSwKKwl7ICJjZCIsIDB4NjksIElOU1RSX1JYX0ZSUkQgfSwKKwl7ICJhZCIsIDB4NmEsIElOU1RSX1JYX0ZSUkQgfSwKKwl7ICJzZCIsIDB4NmIsIElOU1RSX1JYX0ZSUkQgfSwKKwl7ICJtZCIsIDB4NmMsIElOU1RSX1JYX0ZSUkQgfSwKKwl7ICJkZCIsIDB4NmQsIElOU1RSX1JYX0ZSUkQgfSwKKwl7ICJhdyIsIDB4NmUsIElOU1RSX1JYX0ZSUkQgfSwKKwl7ICJzdyIsIDB4NmYsIElOU1RSX1JYX0ZSUkQgfSwKKwl7ICJzdGUiLCAweDcwLCBJTlNUUl9SWF9GUlJEIH0sCisJeyAibXMiLCAweDcxLCBJTlNUUl9SWF9SUlJEIH0sCisJeyAibGUiLCAweDc4LCBJTlNUUl9SWF9GUlJEIH0sCisJeyAiY2UiLCAweDc5LCBJTlNUUl9SWF9GUlJEIH0sCisJeyAiYWUiLCAweDdhLCBJTlNUUl9SWF9GUlJEIH0sCisJeyAic2UiLCAweDdiLCBJTlNUUl9SWF9GUlJEIH0sCisJeyAibWRlIiwgMHg3YywgSU5TVFJfUlhfRlJSRCB9LAorCXsgIm1lIiwgMHg3YywgSU5TVFJfUlhfRlJSRCB9LAorCXsgImRlIiwgMHg3ZCwgSU5TVFJfUlhfRlJSRCB9LAorCXsgImF1IiwgMHg3ZSwgSU5TVFJfUlhfRlJSRCB9LAorCXsgInN1IiwgMHg3ZiwgSU5TVFJfUlhfRlJSRCB9LAorCXsgInNzbSIsIDB4ODAsIElOU1RSX1NfUkQgfSwKKwl7ICJscHN3IiwgMHg4MiwgSU5TVFJfU19SRCB9LAorCXsgImRpYWciLCAweDgzLCBJTlNUUl9SU19SUlJEIH0sCisJeyAiYnJ4aCIsIDB4ODQsIElOU1RSX1JTSV9SUlAgfSwKKwl7ICJicnhsZSIsIDB4ODUsIElOU1RSX1JTSV9SUlAgfSwKKwl7ICJieGgiLCAweDg2LCBJTlNUUl9SU19SUlJEIH0sCisJeyAiYnhsZSIsIDB4ODcsIElOU1RSX1JTX1JSUkQgfSwKKwl7ICJzcmwiLCAweDg4LCBJTlNUUl9SU19SMFJEIH0sCisJeyAic2xsIiwgMHg4OSwgSU5TVFJfUlNfUjBSRCB9LAorCXsgInNyYSIsIDB4OGEsIElOU1RSX1JTX1IwUkQgfSwKKwl7ICJzbGEiLCAweDhiLCBJTlNUUl9SU19SMFJEIH0sCisJeyAic3JkbCIsIDB4OGMsIElOU1RSX1JTX1IwUkQgfSwKKwl7ICJzbGRsIiwgMHg4ZCwgSU5TVFJfUlNfUjBSRCB9LAorCXsgInNyZGEiLCAweDhlLCBJTlNUUl9SU19SMFJEIH0sCisJeyAic2xkYSIsIDB4OGYsIElOU1RSX1JTX1IwUkQgfSwKKwl7ICJzdG0iLCAweDkwLCBJTlNUUl9SU19SUlJEIH0sCisJeyAidG0iLCAweDkxLCBJTlNUUl9TSV9VUkQgfSwKKwl7ICJtdmkiLCAweDkyLCBJTlNUUl9TSV9VUkQgfSwKKwl7ICJ0cyIsIDB4OTMsIElOU1RSX1NfUkQgfSwKKwl7ICJuaSIsIDB4OTQsIElOU1RSX1NJX1VSRCB9LAorCXsgImNsaSIsIDB4OTUsIElOU1RSX1NJX1VSRCB9LAorCXsgIm9pIiwgMHg5NiwgSU5TVFJfU0lfVVJEIH0sCisJeyAieGkiLCAweDk3LCBJTlNUUl9TSV9VUkQgfSwKKwl7ICJsbSIsIDB4OTgsIElOU1RSX1JTX1JSUkQgfSwKKwl7ICJ0cmFjZSIsIDB4OTksIElOU1RSX1JTX1JSUkQgfSwKKwl7ICJsYW0iLCAweDlhLCBJTlNUUl9SU19BQVJEIH0sCisJeyAic3RhbSIsIDB4OWIsIElOU1RSX1JTX0FBUkQgfSwKKwl7ICJtdmNsZSIsIDB4YTgsIElOU1RSX1JTX1JSUkQgfSwKKwl7ICJjbGNsZSIsIDB4YTksIElOU1RSX1JTX1JSUkQgfSwKKwl7ICJzdG5zbSIsIDB4YWMsIElOU1RSX1NJX1VSRCB9LAorCXsgInN0b3NtIiwgMHhhZCwgSU5TVFJfU0lfVVJEIH0sCisJeyAic2lncCIsIDB4YWUsIElOU1RSX1JTX1JSUkQgfSwKKwl7ICJtYyIsIDB4YWYsIElOU1RSX1NJX1VSRCB9LAorCXsgImxyYSIsIDB4YjEsIElOU1RSX1JYX1JSUkQgfSwKKwl7ICJzdGN0bCIsIDB4YjYsIElOU1RSX1JTX0NDUkQgfSwKKwl7ICJsY3RsIiwgMHhiNywgSU5TVFJfUlNfQ0NSRCB9LAorCXsgImNzIiwgMHhiYSwgSU5TVFJfUlNfUlJSRCB9LAorCXsgImNkcyIsIDB4YmIsIElOU1RSX1JTX1JSUkQgfSwKKwl7ICJjbG0iLCAweGJkLCBJTlNUUl9SU19SVVJEIH0sCisJeyAic3RjbSIsIDB4YmUsIElOU1RSX1JTX1JVUkQgfSwKKwl7ICJpY20iLCAweGJmLCBJTlNUUl9SU19SVVJEIH0sCisJeyAibXZuIiwgMHhkMSwgSU5TVFJfU1NfTDBSRFJEIH0sCisJeyAibXZjIiwgMHhkMiwgSU5TVFJfU1NfTDBSRFJEIH0sCisJeyAibXZ6IiwgMHhkMywgSU5TVFJfU1NfTDBSRFJEIH0sCisJeyAibmMiLCAweGQ0LCBJTlNUUl9TU19MMFJEUkQgfSwKKwl7ICJjbGMiLCAweGQ1LCBJTlNUUl9TU19MMFJEUkQgfSwKKwl7ICJvYyIsIDB4ZDYsIElOU1RSX1NTX0wwUkRSRCB9LAorCXsgInhjIiwgMHhkNywgSU5TVFJfU1NfTDBSRFJEIH0sCisJeyAibXZjayIsIDB4ZDksIElOU1RSX1NTX1JSUkRSRCB9LAorCXsgIm12Y3AiLCAweGRhLCBJTlNUUl9TU19SUlJEUkQgfSwKKwl7ICJtdmNzIiwgMHhkYiwgSU5TVFJfU1NfUlJSRFJEIH0sCisJeyAidHIiLCAweGRjLCBJTlNUUl9TU19MMFJEUkQgfSwKKwl7ICJ0cnQiLCAweGRkLCBJTlNUUl9TU19MMFJEUkQgfSwKKwl7ICJlZCIsIDB4ZGUsIElOU1RSX1NTX0wwUkRSRCB9LAorCXsgImVkbWsiLCAweGRmLCBJTlNUUl9TU19MMFJEUkQgfSwKKwl7ICJwa3UiLCAweGUxLCBJTlNUUl9TU19MMFJEUkQgfSwKKwl7ICJ1bnBrdSIsIDB4ZTIsIElOU1RSX1NTX0wwUkRSRCB9LAorCXsgIm12Y2luIiwgMHhlOCwgSU5TVFJfU1NfTDBSRFJEIH0sCisJeyAicGthIiwgMHhlOSwgSU5TVFJfU1NfTDBSRFJEIH0sCisJeyAidW5wa2EiLCAweGVhLCBJTlNUUl9TU19MMFJEUkQgfSwKKwl7ICJwbG8iLCAweGVlLCBJTlNUUl9TU19SUlJEUkQyIH0sCisJeyAic3JwIiwgMHhmMCwgSU5TVFJfU1NfTElSRFJEIH0sCisJeyAibXZvIiwgMHhmMSwgSU5TVFJfU1NfTExSRFJEIH0sCisJeyAicGFjayIsIDB4ZjIsIElOU1RSX1NTX0xMUkRSRCB9LAorCXsgInVucGsiLCAweGYzLCBJTlNUUl9TU19MTFJEUkQgfSwKKwl7ICJ6YXAiLCAweGY4LCBJTlNUUl9TU19MTFJEUkQgfSwKKwl7ICJjcCIsIDB4ZjksIElOU1RSX1NTX0xMUkRSRCB9LAorCXsgImFwIiwgMHhmYSwgSU5TVFJfU1NfTExSRFJEIH0sCisJeyAic3AiLCAweGZiLCBJTlNUUl9TU19MTFJEUkQgfSwKKwl7ICJtcCIsIDB4ZmMsIElOU1RSX1NTX0xMUkRSRCB9LAorCXsgImRwIiwgMHhmZCwgSU5TVFJfU1NfTExSRFJEIH0sCisJeyAiIiwgMCwgSU5TVFJfSU5WQUxJRCB9Cit9OworCitzdGF0aWMgc3RydWN0IGluc24gb3Bjb2RlXzAxW10gPSB7CisjaWZkZWYgQ09ORklHXzY0QklUCisJeyAic2FtNjQiLCAweDBlLCBJTlNUUl9FIH0sCisjZW5kaWYKKwl7ICJwciIsIDB4MDEsIElOU1RSX0UgfSwKKwl7ICJ1cHQiLCAweDAyLCBJTlNUUl9FIH0sCisJeyAic2NrcGYiLCAweDA3LCBJTlNUUl9FIH0sCisJeyAidGFtIiwgMHgwYiwgSU5TVFJfRSB9LAorCXsgInNhbTI0IiwgMHgwYywgSU5TVFJfRSB9LAorCXsgInNhbTMxIiwgMHgwZCwgSU5TVFJfRSB9LAorCXsgInRyYXAyIiwgMHhmZiwgSU5TVFJfRSB9LAorCXsgIiIsIDAsIElOU1RSX0lOVkFMSUQgfQorfTsKKworc3RhdGljIHN0cnVjdCBpbnNuIG9wY29kZV9hNVtdID0geworI2lmZGVmIENPTkZJR182NEJJVAorCXsgImlpaGgiLCAweDAwLCBJTlNUUl9SSV9SVSB9LAorCXsgImlpaGwiLCAweDAxLCBJTlNUUl9SSV9SVSB9LAorCXsgImlpbGgiLCAweDAyLCBJTlNUUl9SSV9SVSB9LAorCXsgImlpbGwiLCAweDAzLCBJTlNUUl9SSV9SVSB9LAorCXsgIm5paGgiLCAweDA0LCBJTlNUUl9SSV9SVSB9LAorCXsgIm5paGwiLCAweDA1LCBJTlNUUl9SSV9SVSB9LAorCXsgIm5pbGgiLCAweDA2LCBJTlNUUl9SSV9SVSB9LAorCXsgIm5pbGwiLCAweDA3LCBJTlNUUl9SSV9SVSB9LAorCXsgIm9paGgiLCAweDA4LCBJTlNUUl9SSV9SVSB9LAorCXsgIm9paGwiLCAweDA5LCBJTlNUUl9SSV9SVSB9LAorCXsgIm9pbGgiLCAweDBhLCBJTlNUUl9SSV9SVSB9LAorCXsgIm9pbGwiLCAweDBiLCBJTlNUUl9SSV9SVSB9LAorCXsgImxsaWhoIiwgMHgwYywgSU5TVFJfUklfUlUgfSwKKwl7ICJsbGlobCIsIDB4MGQsIElOU1RSX1JJX1JVIH0sCisJeyAibGxpbGgiLCAweDBlLCBJTlNUUl9SSV9SVSB9LAorCXsgImxsaWxsIiwgMHgwZiwgSU5TVFJfUklfUlUgfSwKKyNlbmRpZgorCXsgIiIsIDAsIElOU1RSX0lOVkFMSUQgfQorfTsKKworc3RhdGljIHN0cnVjdCBpbnNuIG9wY29kZV9hN1tdID0geworI2lmZGVmIENPTkZJR182NEJJVAorCXsgInRtaGgiLCAweDAyLCBJTlNUUl9SSV9SVSB9LAorCXsgInRtaGwiLCAweDAzLCBJTlNUUl9SSV9SVSB9LAorCXsgImJyY3RnIiwgMHgwNywgSU5TVFJfUklfUlAgfSwKKwl7ICJsZ2hpIiwgMHgwOSwgSU5TVFJfUklfUkkgfSwKKwl7ICJhZ2hpIiwgMHgwYiwgSU5TVFJfUklfUkkgfSwKKwl7ICJtZ2hpIiwgMHgwZCwgSU5TVFJfUklfUkkgfSwKKwl7ICJjZ2hpIiwgMHgwZiwgSU5TVFJfUklfUkkgfSwKKyNlbmRpZgorCXsgInRtbGgiLCAweDAwLCBJTlNUUl9SSV9SVSB9LAorCXsgInRtbGwiLCAweDAxLCBJTlNUUl9SSV9SVSB9LAorCXsgImJyYyIsIDB4MDQsIElOU1RSX1JJX1VQIH0sCisJeyAiYnJhcyIsIDB4MDUsIElOU1RSX1JJX1JQIH0sCisJeyAiYnJjdCIsIDB4MDYsIElOU1RSX1JJX1JQIH0sCisJeyAibGhpIiwgMHgwOCwgSU5TVFJfUklfUkkgfSwKKwl7ICJhaGkiLCAweDBhLCBJTlNUUl9SSV9SSSB9LAorCXsgIm1oaSIsIDB4MGMsIElOU1RSX1JJX1JJIH0sCisJeyAiY2hpIiwgMHgwZSwgSU5TVFJfUklfUkkgfSwKKwl7ICIiLCAwLCBJTlNUUl9JTlZBTElEIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgaW5zbiBvcGNvZGVfYjJbXSA9IHsKKyNpZmRlZiBDT05GSUdfNjRCSVQKKwl7ICJzc2tlIiwgMHgyYiwgSU5TVFJfUlJGX00wUlIgfSwKKwl7ICJzdGNrZiIsIDB4N2MsIElOU1RSX1NfUkQgfSwKKwl7ICJjdTIxIiwgMHhhNiwgSU5TVFJfUlJGX00wUlIgfSwKKwl7ICJjdXV0ZiIsIDB4YTYsIElOU1RSX1JSRl9NMFJSIH0sCisJeyAiY3UxMiIsIDB4YTcsIElOU1RSX1JSRl9NMFJSIH0sCisJeyAiY3V0ZnUiLCAweGE3LCBJTlNUUl9SUkZfTTBSUiB9LAorCXsgInN0ZmxlIiwgMHhiMCwgSU5TVFJfU19SRCB9LAorCXsgImxwc3dlIiwgMHhiMiwgSU5TVFJfU19SRCB9LAorI2VuZGlmCisJeyAic3RpZHAiLCAweDAyLCBJTlNUUl9TX1JEIH0sCisJeyAic2NrIiwgMHgwNCwgSU5TVFJfU19SRCB9LAorCXsgInN0Y2siLCAweDA1LCBJTlNUUl9TX1JEIH0sCisJeyAic2NrYyIsIDB4MDYsIElOU1RSX1NfUkQgfSwKKwl7ICJzdGNrYyIsIDB4MDcsIElOU1RSX1NfUkQgfSwKKwl7ICJzcHQiLCAweDA4LCBJTlNUUl9TX1JEIH0sCisJeyAic3RwdCIsIDB4MDksIElOU1RSX1NfUkQgfSwKKwl7ICJzcGthIiwgMHgwYSwgSU5TVFJfU19SRCB9LAorCXsgImlwayIsIDB4MGIsIElOU1RSX1NfMDAgfSwKKwl7ICJwdGxiIiwgMHgwZCwgSU5TVFJfU18wMCB9LAorCXsgInNweCIsIDB4MTAsIElOU1RSX1NfUkQgfSwKKwl7ICJzdHB4IiwgMHgxMSwgSU5TVFJfU19SRCB9LAorCXsgInN0YXAiLCAweDEyLCBJTlNUUl9TX1JEIH0sCisJeyAic2llIiwgMHgxNCwgSU5TVFJfU19SRCB9LAorCXsgInBjIiwgMHgxOCwgSU5TVFJfU19SRCB9LAorCXsgInNhYyIsIDB4MTksIElOU1RSX1NfUkQgfSwKKwl7ICJjZmMiLCAweDFhLCBJTlNUUl9TX1JEIH0sCisJeyAiaXB0ZSIsIDB4MjEsIElOU1RSX1JSRV9SUiB9LAorCXsgImlwbSIsIDB4MjIsIElOU1RSX1JSRV9SMCB9LAorCXsgIml2c2siLCAweDIzLCBJTlNUUl9SUkVfUlIgfSwKKwl7ICJpYWMiLCAweDI0LCBJTlNUUl9SUkVfUjAgfSwKKwl7ICJzc2FyIiwgMHgyNSwgSU5TVFJfUlJFX1IwIH0sCisJeyAiZXBhciIsIDB4MjYsIElOU1RSX1JSRV9SMCB9LAorCXsgImVzYXIiLCAweDI3LCBJTlNUUl9SUkVfUjAgfSwKKwl7ICJwdCIsIDB4MjgsIElOU1RSX1JSRV9SUiB9LAorCXsgImlza2UiLCAweDI5LCBJTlNUUl9SUkVfUlIgfSwKKwl7ICJycmJlIiwgMHgyYSwgSU5TVFJfUlJFX1JSIH0sCisJeyAic3NrZSIsIDB4MmIsIElOU1RSX1JSRV9SUiB9LAorCXsgInRiIiwgMHgyYywgSU5TVFJfUlJFXzBSIH0sCisJeyAiZHhyIiwgMHgyZCwgSU5TVFJfUlJFX0YwIH0sCisJeyAicGdpbiIsIDB4MmUsIElOU1RSX1JSRV9SUiB9LAorCXsgInBnb3V0IiwgMHgyZiwgSU5TVFJfUlJFX1JSIH0sCisJeyAiY3NjaCIsIDB4MzAsIElOU1RSX1NfMDAgfSwKKwl7ICJoc2NoIiwgMHgzMSwgSU5TVFJfU18wMCB9LAorCXsgIm1zY2giLCAweDMyLCBJTlNUUl9TX1JEIH0sCisJeyAic3NjaCIsIDB4MzMsIElOU1RSX1NfUkQgfSwKKwl7ICJzdHNjaCIsIDB4MzQsIElOU1RSX1NfUkQgfSwKKwl7ICJ0c2NoIiwgMHgzNSwgSU5TVFJfU19SRCB9LAorCXsgInRwaSIsIDB4MzYsIElOU1RSX1NfUkQgfSwKKwl7ICJzYWwiLCAweDM3LCBJTlNUUl9TXzAwIH0sCisJeyAicnNjaCIsIDB4MzgsIElOU1RSX1NfMDAgfSwKKwl7ICJzdGNydyIsIDB4MzksIElOU1RSX1NfUkQgfSwKKwl7ICJzdGNwcyIsIDB4M2EsIElOU1RSX1NfUkQgfSwKKwl7ICJyY2hwIiwgMHgzYiwgSU5TVFJfU18wMCB9LAorCXsgInNjaG0iLCAweDNjLCBJTlNUUl9TXzAwIH0sCisJeyAiYmFrciIsIDB4NDAsIElOU1RSX1JSRV9SUiB9LAorCXsgImNrc20iLCAweDQxLCBJTlNUUl9SUkVfUlIgfSwKKwl7ICJzcWRyIiwgMHg0NCwgSU5TVFJfUlJFX0YwIH0sCisJeyAic3FlciIsIDB4NDUsIElOU1RSX1JSRV9GMCB9LAorCXsgInN0dXJhIiwgMHg0NiwgSU5TVFJfUlJFX1JSIH0sCisJeyAibXN0YSIsIDB4NDcsIElOU1RSX1JSRV9SMCB9LAorCXsgInBhbGIiLCAweDQ4LCBJTlNUUl9SUkVfMDAgfSwKKwl7ICJlcmVnIiwgMHg0OSwgSU5TVFJfUlJFX1JSIH0sCisJeyAiZXN0YSIsIDB4NGEsIElOU1RSX1JSRV9SUiB9LAorCXsgImx1cmEiLCAweDRiLCBJTlNUUl9SUkVfUlIgfSwKKwl7ICJ0YXIiLCAweDRjLCBJTlNUUl9SUkVfQVIgfSwKKwl7ICJjcHlhIiwgSU5TVFJfUlJFX0FBIH0sCisJeyAic2FyIiwgMHg0ZSwgSU5TVFJfUlJFX0FSIH0sCisJeyAiZWFyIiwgMHg0ZiwgSU5TVFJfUlJFX1JBIH0sCisJeyAiY3NwIiwgMHg1MCwgSU5TVFJfUlJFX1JSIH0sCisJeyAibXNyIiwgMHg1MiwgSU5TVFJfUlJFX1JSIH0sCisJeyAibXZwZyIsIDB4NTQsIElOU1RSX1JSRV9SUiB9LAorCXsgIm12c3QiLCAweDU1LCBJTlNUUl9SUkVfUlIgfSwKKwl7ICJjdXNlIiwgMHg1NywgSU5TVFJfUlJFX1JSIH0sCisJeyAiYnNnIiwgMHg1OCwgSU5TVFJfUlJFX1JSIH0sCisJeyAiYnNhIiwgMHg1YSwgSU5TVFJfUlJFX1JSIH0sCisJeyAiY2xzdCIsIDB4NWQsIElOU1RSX1JSRV9SUiB9LAorCXsgInNyc3QiLCAweDVlLCBJTlNUUl9SUkVfUlIgfSwKKwl7ICJjbXBzYyIsIDB4NjMsIElOU1RSX1JSRV9SUiB9LAorCXsgImNtcHNjIiwgMHg2MywgSU5TVFJfUlJFX1JSIH0sCisJeyAic2lnYSIsIDB4NzQsIElOU1RSX1NfUkQgfSwKKwl7ICJ4c2NoIiwgMHg3NiwgSU5TVFJfU18wMCB9LAorCXsgInJwIiwgMHg3NywgSU5TVFJfU19SRCB9LAorCXsgInN0Y2tlIiwgMHg3OCwgSU5TVFJfU19SRCB9LAorCXsgInNhY2YiLCAweDc5LCBJTlNUUl9TX1JEIH0sCisJeyAic3RzaSIsIDB4N2QsIElOU1RSX1NfUkQgfSwKKwl7ICJzcm5tIiwgMHg5OSwgSU5TVFJfU19SRCB9LAorCXsgInN0ZnBjIiwgMHg5YywgSU5TVFJfU19SRCB9LAorCXsgImxmcGMiLCAweDlkLCBJTlNUUl9TX1JEIH0sCisJeyAidHJlIiwgMHhhNSwgSU5TVFJfUlJFX1JSIH0sCisJeyAiY3V1dGYiLCAweGE2LCBJTlNUUl9SUkVfUlIgfSwKKwl7ICJjdXRmdSIsIDB4YTcsIElOU1RSX1JSRV9SUiB9LAorCXsgInN0ZmwiLCAweGIxLCBJTlNUUl9TX1JEIH0sCisJeyAidHJhcDQiLCAweGZmLCBJTlNUUl9TX1JEIH0sCisJeyAiIiwgMCwgSU5TVFJfSU5WQUxJRCB9Cit9OworCitzdGF0aWMgc3RydWN0IGluc24gb3Bjb2RlX2IzW10gPSB7CisjaWZkZWYgQ09ORklHXzY0QklUCisJeyAibWF5bHIiLCAweDM4LCBJTlNUUl9SUkZfRjBGRiB9LAorCXsgIm15bHIiLCAweDM5LCBJTlNUUl9SUkZfRjBGRiB9LAorCXsgIm1heXIiLCAweDNhLCBJTlNUUl9SUkZfRjBGRiB9LAorCXsgIm15ciIsIDB4M2IsIElOU1RSX1JSRl9GMEZGIH0sCisJeyAibWF5aHIiLCAweDNjLCBJTlNUUl9SUkZfRjBGRiB9LAorCXsgIm15aHIiLCAweDNkLCBJTlNUUl9SUkZfRjBGRiB9LAorCXsgImNlZ2JyIiwgMHhhNCwgSU5TVFJfUlJFX1JSIH0sCisJeyAiY2RnYnIiLCAweGE1LCBJTlNUUl9SUkVfUlIgfSwKKwl7ICJjeGdiciIsIDB4YTYsIElOU1RSX1JSRV9SUiB9LAorCXsgImNnZWJyIiwgMHhhOCwgSU5TVFJfUlJGX1UwUkYgfSwKKwl7ICJjZ2RiciIsIDB4YTksIElOU1RSX1JSRl9VMFJGIH0sCisJeyAiY2d4YnIiLCAweGFhLCBJTlNUUl9SUkZfVTBSRiB9LAorCXsgImNmZXIiLCAweGI4LCBJTlNUUl9SUkZfVTBSRiB9LAorCXsgImNmZHIiLCAweGI5LCBJTlNUUl9SUkZfVTBSRiB9LAorCXsgImNmeHIiLCAweGJhLCBJTlNUUl9SUkZfVTBSRiB9LAorCXsgImNlZ3IiLCAweGM0LCBJTlNUUl9SUkVfUlIgfSwKKwl7ICJjZGdyIiwgMHhjNSwgSU5TVFJfUlJFX1JSIH0sCisJeyAiY3hnciIsIDB4YzYsIElOU1RSX1JSRV9SUiB9LAorCXsgImNnZXIiLCAweGM4LCBJTlNUUl9SUkZfVTBSRiB9LAorCXsgImNnZHIiLCAweGM5LCBJTlNUUl9SUkZfVTBSRiB9LAorCXsgImNneHIiLCAweGNhLCBJTlNUUl9SUkZfVTBSRiB9LAorI2VuZGlmCisJeyAibHBlYnIiLCAweDAwLCBJTlNUUl9SUkVfRkYgfSwKKwl7ICJsbmViciIsIDB4MDEsIElOU1RSX1JSRV9GRiB9LAorCXsgImx0ZWJyIiwgMHgwMiwgSU5TVFJfUlJFX0ZGIH0sCisJeyAibGNlYnIiLCAweDAzLCBJTlNUUl9SUkVfRkYgfSwKKwl7ICJsZGViciIsIDB4MDQsIElOU1RSX1JSRV9GRiB9LAorCXsgImx4ZGJyIiwgMHgwNSwgSU5TVFJfUlJFX0ZGIH0sCisJeyAibHhlYnIiLCAweDA2LCBJTlNUUl9SUkVfRkYgfSwKKwl7ICJteGRiciIsIDB4MDcsIElOU1RSX1JSRV9GRiB9LAorCXsgImtlYnIiLCAweDA4LCBJTlNUUl9SUkVfRkYgfSwKKwl7ICJjZWJyIiwgMHgwOSwgSU5TVFJfUlJFX0ZGIH0sCisJeyAiYWViciIsIDB4MGEsIElOU1RSX1JSRV9GRiB9LAorCXsgInNlYnIiLCAweDBiLCBJTlNUUl9SUkVfRkYgfSwKKwl7ICJtZGViciIsIDB4MGMsIElOU1RSX1JSRV9GRiB9LAorCXsgImRlYnIiLCAweDBkLCBJTlNUUl9SUkVfRkYgfSwKKwl7ICJtYWViciIsIDB4MGUsIElOU1RSX1JSRl9GMEZGIH0sCisJeyAibXNlYnIiLCAweDBmLCBJTlNUUl9SUkZfRjBGRiB9LAorCXsgImxwZGJyIiwgMHgxMCwgSU5TVFJfUlJFX0ZGIH0sCisJeyAibG5kYnIiLCAweDExLCBJTlNUUl9SUkVfRkYgfSwKKwl7ICJsdGRiciIsIDB4MTIsIElOU1RSX1JSRV9GRiB9LAorCXsgImxjZGJyIiwgMHgxMywgSU5TVFJfUlJFX0ZGIH0sCisJeyAic3FlYnIiLCAweDE0LCBJTlNUUl9SUkVfRkYgfSwKKwl7ICJzcWRiciIsIDB4MTUsIElOU1RSX1JSRV9GRiB9LAorCXsgInNxeGJyIiwgMHgxNiwgSU5TVFJfUlJFX0ZGIH0sCisJeyAibWVlYnIiLCAweDE3LCBJTlNUUl9SUkVfRkYgfSwKKwl7ICJrZGJyIiwgMHgxOCwgSU5TVFJfUlJFX0ZGIH0sCisJeyAiY2RiciIsIDB4MTksIElOU1RSX1JSRV9GRiB9LAorCXsgImFkYnIiLCAweDFhLCBJTlNUUl9SUkVfRkYgfSwKKwl7ICJzZGJyIiwgMHgxYiwgSU5TVFJfUlJFX0ZGIH0sCisJeyAibWRiciIsIDB4MWMsIElOU1RSX1JSRV9GRiB9LAorCXsgImRkYnIiLCAweDFkLCBJTlNUUl9SUkVfRkYgfSwKKwl7ICJtYWRiciIsIDB4MWUsIElOU1RSX1JSRl9GMEZGIH0sCisJeyAibXNkYnIiLCAweDFmLCBJTlNUUl9SUkZfRjBGRiB9LAorCXsgImxkZXIiLCAweDI0LCBJTlNUUl9SUkVfRkYgfSwKKwl7ICJseGRyIiwgMHgyNSwgSU5TVFJfUlJFX0ZGIH0sCisJeyAibHhlciIsIDB4MjYsIElOU1RSX1JSRV9GRiB9LAorCXsgIm1hZXIiLCAweDJlLCBJTlNUUl9SUkZfRjBGRiB9LAorCXsgIm1zZXIiLCAweDJmLCBJTlNUUl9SUkZfRjBGRiB9LAorCXsgInNxeHIiLCAweDM2LCBJTlNUUl9SUkVfRkYgfSwKKwl7ICJtZWVyIiwgMHgzNywgSU5TVFJfUlJFX0ZGIH0sCisJeyAibWFkciIsIDB4M2UsIElOU1RSX1JSRl9GMEZGIH0sCisJeyAibXNkciIsIDB4M2YsIElOU1RSX1JSRl9GMEZGIH0sCisJeyAibHB4YnIiLCAweDQwLCBJTlNUUl9SUkVfRkYgfSwKKwl7ICJsbnhiciIsIDB4NDEsIElOU1RSX1JSRV9GRiB9LAorCXsgImx0eGJyIiwgMHg0MiwgSU5TVFJfUlJFX0ZGIH0sCisJeyAibGN4YnIiLCAweDQzLCBJTlNUUl9SUkVfRkYgfSwKKwl7ICJsZWRiciIsIDB4NDQsIElOU1RSX1JSRV9GRiB9LAorCXsgImxkeGJyIiwgMHg0NSwgSU5TVFJfUlJFX0ZGIH0sCisJeyAibGV4YnIiLCAweDQ2LCBJTlNUUl9SUkVfRkYgfSwKKwl7ICJmaXhiciIsIDB4NDcsIElOU1RSX1JSRl9VMEZGIH0sCisJeyAia3hiciIsIDB4NDgsIElOU1RSX1JSRV9GRiB9LAorCXsgImN4YnIiLCAweDQ5LCBJTlNUUl9SUkVfRkYgfSwKKwl7ICJheGJyIiwgMHg0YSwgSU5TVFJfUlJFX0ZGIH0sCisJeyAic3hiciIsIDB4NGIsIElOU1RSX1JSRV9GRiB9LAorCXsgIm14YnIiLCAweDRjLCBJTlNUUl9SUkVfRkYgfSwKKwl7ICJkeGJyIiwgMHg0ZCwgSU5TVFJfUlJFX0ZGIH0sCisJeyAidGJlZHIiLCAweDUwLCBJTlNUUl9SUkZfVTBGRiB9LAorCXsgInRiZHIiLCAweDUxLCBJTlNUUl9SUkZfVTBGRiB9LAorCXsgImRpZWJyIiwgMHg1MywgSU5TVFJfUlJGX0ZVRkYgfSwKKwl7ICJmaWViciIsIDB4NTcsIElOU1RSX1JSRl9VMEZGIH0sCisJeyAidGhkZXIiLCAweDU4LCBJTlNUUl9SUkVfUlIgfSwKKwl7ICJ0aGRyIiwgMHg1OSwgSU5TVFJfUlJFX1JSIH0sCisJeyAiZGlkYnIiLCAweDViLCBJTlNUUl9SUkZfRlVGRiB9LAorCXsgImZpZGJyIiwgMHg1ZiwgSU5TVFJfUlJGX1UwRkYgfSwKKwl7ICJscHhyIiwgMHg2MCwgSU5TVFJfUlJFX0ZGIH0sCisJeyAibG54ciIsIDB4NjEsIElOU1RSX1JSRV9GRiB9LAorCXsgImx0eHIiLCAweDYyLCBJTlNUUl9SUkVfRkYgfSwKKwl7ICJsY3hyIiwgMHg2MywgSU5TVFJfUlJFX0ZGIH0sCisJeyAibHhyIiwgMHg2NSwgSU5TVFJfUlJFX1JSIH0sCisJeyAibGV4ciIsIDB4NjYsIElOU1RSX1JSRV9GRiB9LAorCXsgImZpeHIiLCAweDY3LCBJTlNUUl9SUkZfVTBGRiB9LAorCXsgImN4ciIsIDB4NjksIElOU1RSX1JSRV9GRiB9LAorCXsgImx6ZXIiLCAweDc0LCBJTlNUUl9SUkVfUjAgfSwKKwl7ICJsemRyIiwgMHg3NSwgSU5TVFJfUlJFX1IwIH0sCisJeyAibHp4ciIsIDB4NzYsIElOU1RSX1JSRV9SMCB9LAorCXsgImZpZXIiLCAweDc3LCBJTlNUUl9SUkZfVTBGRiB9LAorCXsgImZpZHIiLCAweDdmLCBJTlNUUl9SUkZfVTBGRiB9LAorCXsgInNmcGMiLCAweDg0LCBJTlNUUl9SUkVfUlJfT1BUIH0sCisJeyAiZWZwYyIsIDB4OGMsIElOU1RSX1JSRV9SUl9PUFQgfSwKKwl7ICJjZWZiciIsIDB4OTQsIElOU1RSX1JSRV9SRiB9LAorCXsgImNkZmJyIiwgMHg5NSwgSU5TVFJfUlJFX1JGIH0sCisJeyAiY3hmYnIiLCAweDk2LCBJTlNUUl9SUkVfUkYgfSwKKwl7ICJjZmViciIsIDB4OTgsIElOU1RSX1JSRl9VMFJGIH0sCisJeyAiY2ZkYnIiLCAweDk5LCBJTlNUUl9SUkZfVTBSRiB9LAorCXsgImNmeGJyIiwgMHg5YSwgSU5TVFJfUlJGX1UwUkYgfSwKKwl7ICJjZWZyIiwgMHhiNCwgSU5TVFJfUlJFX1JGIH0sCisJeyAiY2RmciIsIDB4YjUsIElOU1RSX1JSRV9SRiB9LAorCXsgImN4ZnIiLCAweGI2LCBJTlNUUl9SUkVfUkYgfSwKKwl7ICIiLCAwLCBJTlNUUl9JTlZBTElEIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgaW5zbiBvcGNvZGVfYjlbXSA9IHsKKyNpZmRlZiBDT05GSUdfNjRCSVQKKwl7ICJscGdyIiwgMHgwMCwgSU5TVFJfUlJFX1JSIH0sCisJeyAibG5nciIsIDB4MDEsIElOU1RSX1JSRV9SUiB9LAorCXsgImx0Z3IiLCAweDAyLCBJTlNUUl9SUkVfUlIgfSwKKwl7ICJsY2dyIiwgMHgwMywgSU5TVFJfUlJFX1JSIH0sCisJeyAibGdyIiwgMHgwNCwgSU5TVFJfUlJFX1JSIH0sCisJeyAibHVyYWciLCAweDA1LCBJTlNUUl9SUkVfUlIgfSwKKwl7ICJsZ2JyIiwgMHgwNiwgSU5TVFJfUlJFX1JSIH0sCisJeyAibGdociIsIDB4MDcsIElOU1RSX1JSRV9SUiB9LAorCXsgImFnciIsIDB4MDgsIElOU1RSX1JSRV9SUiB9LAorCXsgInNnciIsIDB4MDksIElOU1RSX1JSRV9SUiB9LAorCXsgImFsZ3IiLCAweDBhLCBJTlNUUl9SUkVfUlIgfSwKKwl7ICJzbGdyIiwgMHgwYiwgSU5TVFJfUlJFX1JSIH0sCisJeyAibXNnciIsIDB4MGMsIElOU1RSX1JSRV9SUiB9LAorCXsgImRzZ3IiLCAweDBkLCBJTlNUUl9SUkVfUlIgfSwKKwl7ICJlcmVnZyIsIDB4MGUsIElOU1RSX1JSRV9SUiB9LAorCXsgImxydmdyIiwgMHgwZiwgSU5TVFJfUlJFX1JSIH0sCisJeyAibHBnZnIiLCAweDEwLCBJTlNUUl9SUkVfUlIgfSwKKwl7ICJsbmdmciIsIDB4MTEsIElOU1RSX1JSRV9SUiB9LAorCXsgImx0Z2ZyIiwgMHgxMiwgSU5TVFJfUlJFX1JSIH0sCisJeyAibGNnZnIiLCAweDEzLCBJTlNUUl9SUkVfUlIgfSwKKwl7ICJsZ2ZyIiwgMHgxNCwgSU5TVFJfUlJFX1JSIH0sCisJeyAibGxnZnIiLCAweDE2LCBJTlNUUl9SUkVfUlIgfSwKKwl7ICJsbGd0ciIsIDB4MTcsIElOU1RSX1JSRV9SUiB9LAorCXsgImFnZnIiLCAweDE4LCBJTlNUUl9SUkVfUlIgfSwKKwl7ICJzZ2ZyIiwgMHgxOSwgSU5TVFJfUlJFX1JSIH0sCisJeyAiYWxnZnIiLCAweDFhLCBJTlNUUl9SUkVfUlIgfSwKKwl7ICJzbGdmciIsIDB4MWIsIElOU1RSX1JSRV9SUiB9LAorCXsgIm1zZ2ZyIiwgMHgxYywgSU5TVFJfUlJFX1JSIH0sCisJeyAiZHNnZnIiLCAweDFkLCBJTlNUUl9SUkVfUlIgfSwKKwl7ICJjZ3IiLCAweDIwLCBJTlNUUl9SUkVfUlIgfSwKKwl7ICJjbGdyIiwgMHgyMSwgSU5TVFJfUlJFX1JSIH0sCisJeyAic3R1cmciLCAweDI1LCBJTlNUUl9SUkVfUlIgfSwKKwl7ICJsYnIiLCAweDI2LCBJTlNUUl9SUkVfUlIgfSwKKwl7ICJsaHIiLCAweDI3LCBJTlNUUl9SUkVfUlIgfSwKKwl7ICJjZ2ZyIiwgMHgzMCwgSU5TVFJfUlJFX1JSIH0sCisJeyAiY2xnZnIiLCAweDMxLCBJTlNUUl9SUkVfUlIgfSwKKwl7ICJiY3RnciIsIDB4NDYsIElOU1RSX1JSRV9SUiB9LAorCXsgIm5nciIsIDB4ODAsIElOU1RSX1JSRV9SUiB9LAorCXsgIm9nciIsIDB4ODEsIElOU1RSX1JSRV9SUiB9LAorCXsgInhnciIsIDB4ODIsIElOU1RSX1JSRV9SUiB9LAorCXsgImZsb2dyIiwgMHg4MywgSU5TVFJfUlJFX1JSIH0sCisJeyAibGxnY3IiLCAweDg0LCBJTlNUUl9SUkVfUlIgfSwKKwl7ICJsbGdociIsIDB4ODUsIElOU1RSX1JSRV9SUiB9LAorCXsgIm1sZ3IiLCAweDg2LCBJTlNUUl9SUkVfUlIgfSwKKwl7ICJkbGdyIiwgMHg4NywgSU5TVFJfUlJFX1JSIH0sCisJeyAiYWxjZ3IiLCAweDg4LCBJTlNUUl9SUkVfUlIgfSwKKwl7ICJzbGJnciIsIDB4ODksIElOU1RSX1JSRV9SUiB9LAorCXsgImNzcGciLCAweDhhLCBJTlNUUl9SUkVfUlIgfSwKKwl7ICJpZHRlIiwgMHg4ZSwgSU5TVFJfUlJGX1IwUlIgfSwKKwl7ICJsbGNyIiwgMHg5NCwgSU5TVFJfUlJFX1JSIH0sCisJeyAibGxociIsIDB4OTUsIElOU1RSX1JSRV9SUiB9LAorCXsgImVzZWEiLCAweDlkLCBJTlNUUl9SUkVfUjAgfSwKKwl7ICJscHRlYSIsIDB4YWEsIElOU1RSX1JSRl9SVVJSIH0sCisJeyAiY3UxNCIsIDB4YjAsIElOU1RSX1JSRl9NMFJSIH0sCisJeyAiY3UyNCIsIDB4YjEsIElOU1RSX1JSRl9NMFJSIH0sCisJeyAiY3U0MSIsIDB4YjIsIElOU1RSX1JSRl9NMFJSIH0sCisJeyAiY3U0MiIsIDB4YjMsIElOU1RSX1JSRl9NMFJSIH0sCisjZW5kaWYKKwl7ICJrbWFjIiwgMHgxZSwgSU5TVFJfUlJFX1JSIH0sCisJeyAibHJ2ciIsIDB4MWYsIElOU1RSX1JSRV9SUiB9LAorCXsgImttIiwgMHgyZSwgSU5TVFJfUlJFX1JSIH0sCisJeyAia21jIiwgMHgyZiwgSU5TVFJfUlJFX1JSIH0sCisJeyAia2ltZCIsIDB4M2UsIElOU1RSX1JSRV9SUiB9LAorCXsgImtsbWQiLCAweDNmLCBJTlNUUl9SUkVfUlIgfSwKKwl7ICJlcHN3IiwgMHg4ZCwgSU5TVFJfUlJFX1JSIH0sCisJeyAidHJ0dCIsIDB4OTAsIElOU1RSX1JSRV9SUiB9LAorCXsgInRydHQiLCAweDkwLCBJTlNUUl9SUkZfTTBSUiB9LAorCXsgInRydG8iLCAweDkxLCBJTlNUUl9SUkVfUlIgfSwKKwl7ICJ0cnRvIiwgMHg5MSwgSU5TVFJfUlJGX00wUlIgfSwKKwl7ICJ0cm90IiwgMHg5MiwgSU5TVFJfUlJFX1JSIH0sCisJeyAidHJvdCIsIDB4OTIsIElOU1RSX1JSRl9NMFJSIH0sCisJeyAidHJvbyIsIDB4OTMsIElOU1RSX1JSRV9SUiB9LAorCXsgInRyb28iLCAweDkzLCBJTlNUUl9SUkZfTTBSUiB9LAorCXsgIm1sciIsIDB4OTYsIElOU1RSX1JSRV9SUiB9LAorCXsgImRsciIsIDB4OTcsIElOU1RSX1JSRV9SUiB9LAorCXsgImFsY3IiLCAweDk4LCBJTlNUUl9SUkVfUlIgfSwKKwl7ICJzbGJyIiwgMHg5OSwgSU5TVFJfUlJFX1JSIH0sCisJeyAiIiwgMCwgSU5TVFJfSU5WQUxJRCB9Cit9OworCitzdGF0aWMgc3RydWN0IGluc24gb3Bjb2RlX2MwW10gPSB7CisjaWZkZWYgQ09ORklHXzY0QklUCisJeyAibGdmaSIsIDB4MDEsIElOU1RSX1JJTF9SSSB9LAorCXsgInhpaGYiLCAweDA2LCBJTlNUUl9SSUxfUlUgfSwKKwl7ICJ4aWxmIiwgMHgwNywgSU5TVFJfUklMX1JVIH0sCisJeyAiaWloZiIsIDB4MDgsIElOU1RSX1JJTF9SVSB9LAorCXsgImlpbGYiLCAweDA5LCBJTlNUUl9SSUxfUlUgfSwKKwl7ICJuaWhmIiwgMHgwYSwgSU5TVFJfUklMX1JVIH0sCisJeyAibmlsZiIsIDB4MGIsIElOU1RSX1JJTF9SVSB9LAorCXsgIm9paGYiLCAweDBjLCBJTlNUUl9SSUxfUlUgfSwKKwl7ICJvaWxmIiwgMHgwZCwgSU5TVFJfUklMX1JVIH0sCisJeyAibGxpaGYiLCAweDBlLCBJTlNUUl9SSUxfUlUgfSwKKwl7ICJsbGlsZiIsIDB4MGYsIElOU1RSX1JJTF9SVSB9LAorI2VuZGlmCisJeyAibGFybCIsIDB4MDAsIElOU1RSX1JJTF9SUCB9LAorCXsgImJyY2wiLCAweDA0LCBJTlNUUl9SSUxfVVAgfSwKKwl7ICJicmFzbCIsIDB4MDUsIElOU1RSX1JJTF9SUCB9LAorCXsgIiIsIDAsIElOU1RSX0lOVkFMSUQgfQorfTsKKworc3RhdGljIHN0cnVjdCBpbnNuIG9wY29kZV9jMltdID0geworI2lmZGVmIENPTkZJR182NEJJVAorCXsgInNsZ2ZpIiwgMHgwNCwgSU5TVFJfUklMX1JVIH0sCisJeyAic2xmaSIsIDB4MDUsIElOU1RSX1JJTF9SVSB9LAorCXsgImFnZmkiLCAweDA4LCBJTlNUUl9SSUxfUkkgfSwKKwl7ICJhZmkiLCAweDA5LCBJTlNUUl9SSUxfUkkgfSwKKwl7ICJhbGdmaSIsIDB4MGEsIElOU1RSX1JJTF9SVSB9LAorCXsgImFsZmkiLCAweDBiLCBJTlNUUl9SSUxfUlUgfSwKKwl7ICJjZ2ZpIiwgMHgwYywgSU5TVFJfUklMX1JJIH0sCisJeyAiY2ZpIiwgMHgwZCwgSU5TVFJfUklMX1JJIH0sCisJeyAiY2xnZmkiLCAweDBlLCBJTlNUUl9SSUxfUlUgfSwKKwl7ICJjbGZpIiwgMHgwZiwgSU5TVFJfUklMX1JVIH0sCisjZW5kaWYKKwl7ICIiLCAwLCBJTlNUUl9JTlZBTElEIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgaW5zbiBvcGNvZGVfYzhbXSA9IHsKKyNpZmRlZiBDT05GSUdfNjRCSVQKKwl7ICJtdmNvcyIsIDB4MDAsIElOU1RSX1NTRl9SUkRSRCB9LAorI2VuZGlmCisJeyAiIiwgMCwgSU5TVFJfSU5WQUxJRCB9Cit9OworCitzdGF0aWMgc3RydWN0IGluc24gb3Bjb2RlX2UzW10gPSB7CisjaWZkZWYgQ09ORklHXzY0QklUCisJeyAibHRnIiwgMHgwMiwgSU5TVFJfUlhZX1JSUkQgfSwKKwl7ICJscmFnIiwgMHgwMywgSU5TVFJfUlhZX1JSUkQgfSwKKwl7ICJsZyIsIDB4MDQsIElOU1RSX1JYWV9SUlJEIH0sCisJeyAiY3ZieSIsIDB4MDYsIElOU1RSX1JYWV9SUlJEIH0sCisJeyAiYWciLCAweDA4LCBJTlNUUl9SWFlfUlJSRCB9LAorCXsgInNnIiwgMHgwOSwgSU5TVFJfUlhZX1JSUkQgfSwKKwl7ICJhbGciLCAweDBhLCBJTlNUUl9SWFlfUlJSRCB9LAorCXsgInNsZyIsIDB4MGIsIElOU1RSX1JYWV9SUlJEIH0sCisJeyAibXNnIiwgMHgwYywgSU5TVFJfUlhZX1JSUkQgfSwKKwl7ICJkc2ciLCAweDBkLCBJTlNUUl9SWFlfUlJSRCB9LAorCXsgImN2YmciLCAweDBlLCBJTlNUUl9SWFlfUlJSRCB9LAorCXsgImxydmciLCAweDBmLCBJTlNUUl9SWFlfUlJSRCB9LAorCXsgImx0IiwgMHgxMiwgSU5TVFJfUlhZX1JSUkQgfSwKKwl7ICJscmF5IiwgMHgxMywgSU5TVFJfUlhZX1JSUkQgfSwKKwl7ICJsZ2YiLCAweDE0LCBJTlNUUl9SWFlfUlJSRCB9LAorCXsgImxnaCIsIDB4MTUsIElOU1RSX1JYWV9SUlJEIH0sCisJeyAibGxnZiIsIDB4MTYsIElOU1RSX1JYWV9SUlJEIH0sCisJeyAibGxndCIsIDB4MTcsIElOU1RSX1JYWV9SUlJEIH0sCisJeyAiYWdmIiwgMHgxOCwgSU5TVFJfUlhZX1JSUkQgfSwKKwl7ICJzZ2YiLCAweDE5LCBJTlNUUl9SWFlfUlJSRCB9LAorCXsgImFsZ2YiLCAweDFhLCBJTlNUUl9SWFlfUlJSRCB9LAorCXsgInNsZ2YiLCAweDFiLCBJTlNUUl9SWFlfUlJSRCB9LAorCXsgIm1zZ2YiLCAweDFjLCBJTlNUUl9SWFlfUlJSRCB9LAorCXsgImRzZ2YiLCAweDFkLCBJTlNUUl9SWFlfUlJSRCB9LAorCXsgImNnIiwgMHgyMCwgSU5TVFJfUlhZX1JSUkQgfSwKKwl7ICJjbGciLCAweDIxLCBJTlNUUl9SWFlfUlJSRCB9LAorCXsgInN0ZyIsIDB4MjQsIElOU1RSX1JYWV9SUlJEIH0sCisJeyAiY3ZkeSIsIDB4MjYsIElOU1RSX1JYWV9SUlJEIH0sCisJeyAiY3ZkZyIsIDB4MmUsIElOU1RSX1JYWV9SUlJEIH0sCisJeyAic3RydmciLCAweDJmLCBJTlNUUl9SWFlfUlJSRCB9LAorCXsgImNnZiIsIDB4MzAsIElOU1RSX1JYWV9SUlJEIH0sCisJeyAiY2xnZiIsIDB4MzEsIElOU1RSX1JYWV9SUlJEIH0sCisJeyAic3RydmgiLCAweDNmLCBJTlNUUl9SWFlfUlJSRCB9LAorCXsgImJjdGciLCAweDQ2LCBJTlNUUl9SWFlfUlJSRCB9LAorCXsgInN0eSIsIDB4NTAsIElOU1RSX1JYWV9SUlJEIH0sCisJeyAibXN5IiwgMHg1MSwgSU5TVFJfUlhZX1JSUkQgfSwKKwl7ICJueSIsIDB4NTQsIElOU1RSX1JYWV9SUlJEIH0sCisJeyAiY2x5IiwgMHg1NSwgSU5TVFJfUlhZX1JSUkQgfSwKKwl7ICJveSIsIDB4NTYsIElOU1RSX1JYWV9SUlJEIH0sCisJeyAieHkiLCAweDU3LCBJTlNUUl9SWFlfUlJSRCB9LAorCXsgImx5IiwgMHg1OCwgSU5TVFJfUlhZX1JSUkQgfSwKKwl7ICJjeSIsIDB4NTksIElOU1RSX1JYWV9SUlJEIH0sCisJeyAiYXkiLCAweDVhLCBJTlNUUl9SWFlfUlJSRCB9LAorCXsgInN5IiwgMHg1YiwgSU5TVFJfUlhZX1JSUkQgfSwKKwl7ICJhbHkiLCAweDVlLCBJTlNUUl9SWFlfUlJSRCB9LAorCXsgInNseSIsIDB4NWYsIElOU1RSX1JYWV9SUlJEIH0sCisJeyAic3RoeSIsIDB4NzAsIElOU1RSX1JYWV9SUlJEIH0sCisJeyAibGF5IiwgMHg3MSwgSU5TVFJfUlhZX1JSUkQgfSwKKwl7ICJzdGN5IiwgMHg3MiwgSU5TVFJfUlhZX1JSUkQgfSwKKwl7ICJpY3kiLCAweDczLCBJTlNUUl9SWFlfUlJSRCB9LAorCXsgImxiIiwgMHg3NiwgSU5TVFJfUlhZX1JSUkQgfSwKKwl7ICJsZ2IiLCAweDc3LCBJTlNUUl9SWFlfUlJSRCB9LAorCXsgImxoeSIsIDB4NzgsIElOU1RSX1JYWV9SUlJEIH0sCisJeyAiY2h5IiwgMHg3OSwgSU5TVFJfUlhZX1JSUkQgfSwKKwl7ICJhaHkiLCAweDdhLCBJTlNUUl9SWFlfUlJSRCB9LAorCXsgInNoeSIsIDB4N2IsIElOU1RSX1JYWV9SUlJEIH0sCisJeyAibmciLCAweDgwLCBJTlNUUl9SWFlfUlJSRCB9LAorCXsgIm9nIiwgMHg4MSwgSU5TVFJfUlhZX1JSUkQgfSwKKwl7ICJ4ZyIsIDB4ODIsIElOU1RSX1JYWV9SUlJEIH0sCisJeyAibWxnIiwgMHg4NiwgSU5TVFJfUlhZX1JSUkQgfSwKKwl7ICJkbGciLCAweDg3LCBJTlNUUl9SWFlfUlJSRCB9LAorCXsgImFsY2ciLCAweDg4LCBJTlNUUl9SWFlfUlJSRCB9LAorCXsgInNsYmciLCAweDg5LCBJTlNUUl9SWFlfUlJSRCB9LAorCXsgInN0cHEiLCAweDhlLCBJTlNUUl9SWFlfUlJSRCB9LAorCXsgImxwcSIsIDB4OGYsIElOU1RSX1JYWV9SUlJEIH0sCisJeyAibGxnYyIsIDB4OTAsIElOU1RSX1JYWV9SUlJEIH0sCisJeyAibGxnaCIsIDB4OTEsIElOU1RSX1JYWV9SUlJEIH0sCisJeyAibGxjIiwgMHg5NCwgSU5TVFJfUlhZX1JSUkQgfSwKKwl7ICJsbGgiLCAweDk1LCBJTlNUUl9SWFlfUlJSRCB9LAorI2VuZGlmCisJeyAibHJ2IiwgMHgxZSwgSU5TVFJfUlhZX1JSUkQgfSwKKwl7ICJscnZoIiwgMHgxZiwgSU5TVFJfUlhZX1JSUkQgfSwKKwl7ICJzdHJ2IiwgMHgzZSwgSU5TVFJfUlhZX1JSUkQgfSwKKwl7ICJtbCIsIDB4OTYsIElOU1RSX1JYWV9SUlJEIH0sCisJeyAiZGwiLCAweDk3LCBJTlNUUl9SWFlfUlJSRCB9LAorCXsgImFsYyIsIDB4OTgsIElOU1RSX1JYWV9SUlJEIH0sCisJeyAic2xiIiwgMHg5OSwgSU5TVFJfUlhZX1JSUkQgfSwKKwl7ICIiLCAwLCBJTlNUUl9JTlZBTElEIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgaW5zbiBvcGNvZGVfZTVbXSA9IHsKKyNpZmRlZiBDT05GSUdfNjRCSVQKKwl7ICJzdHJhZyIsIDB4MDIsIElOU1RSX1NTRV9SRFJEIH0sCisjZW5kaWYKKwl7ICJsYXNwIiwgMHgwMCwgSU5TVFJfU1NFX1JEUkQgfSwKKwl7ICJ0cHJvdCIsIDB4MDEsIElOU1RSX1NTRV9SRFJEIH0sCisJeyAibXZjc2siLCAweDBlLCBJTlNUUl9TU0VfUkRSRCB9LAorCXsgIm12Y2RrIiwgMHgwZiwgSU5TVFJfU1NFX1JEUkQgfSwKKwl7ICIiLCAwLCBJTlNUUl9JTlZBTElEIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgaW5zbiBvcGNvZGVfZWJbXSA9IHsKKyNpZmRlZiBDT05GSUdfNjRCSVQKKwl7ICJsbWciLCAweDA0LCBJTlNUUl9SU1lfUlJSRCB9LAorCXsgInNyYWciLCAweDBhLCBJTlNUUl9SU1lfUlJSRCB9LAorCXsgInNsYWciLCAweDBiLCBJTlNUUl9SU1lfUlJSRCB9LAorCXsgInNybGciLCAweDBjLCBJTlNUUl9SU1lfUlJSRCB9LAorCXsgInNsbGciLCAweDBkLCBJTlNUUl9SU1lfUlJSRCB9LAorCXsgInRyYWNnIiwgMHgwZiwgSU5TVFJfUlNZX1JSUkQgfSwKKwl7ICJjc3kiLCAweDE0LCBJTlNUUl9SU1lfUlJSRCB9LAorCXsgInJsbGciLCAweDFjLCBJTlNUUl9SU1lfUlJSRCB9LAorCXsgImNsbWgiLCAweDIwLCBJTlNUUl9SU1lfUlVSRCB9LAorCXsgImNsbXkiLCAweDIxLCBJTlNUUl9SU1lfUlVSRCB9LAorCXsgInN0bWciLCAweDI0LCBJTlNUUl9SU1lfUlJSRCB9LAorCXsgInN0Y3RnIiwgMHgyNSwgSU5TVFJfUlNZX0NDUkQgfSwKKwl7ICJzdG1oIiwgMHgyNiwgSU5TVFJfUlNZX1JSUkQgfSwKKwl7ICJzdGNtaCIsIDB4MmMsIElOU1RSX1JTWV9SVVJEIH0sCisJeyAic3RjbXkiLCAweDJkLCBJTlNUUl9SU1lfUlVSRCB9LAorCXsgImxjdGxnIiwgMHgyZiwgSU5TVFJfUlNZX0NDUkQgfSwKKwl7ICJjc2ciLCAweDMwLCBJTlNUUl9SU1lfUlJSRCB9LAorCXsgImNkc3kiLCAweDMxLCBJTlNUUl9SU1lfUlJSRCB9LAorCXsgImNkc2ciLCAweDNlLCBJTlNUUl9SU1lfUlJSRCB9LAorCXsgImJ4aGciLCAweDQ0LCBJTlNUUl9SU1lfUlJSRCB9LAorCXsgImJ4bGVnIiwgMHg0NSwgSU5TVFJfUlNZX1JSUkQgfSwKKwl7ICJ0bXkiLCAweDUxLCBJTlNUUl9TSVlfVVJEIH0sCisJeyAibXZpeSIsIDB4NTIsIElOU1RSX1NJWV9VUkQgfSwKKwl7ICJuaXkiLCAweDU0LCBJTlNUUl9TSVlfVVJEIH0sCisJeyAiY2xpeSIsIDB4NTUsIElOU1RSX1NJWV9VUkQgfSwKKwl7ICJvaXkiLCAweDU2LCBJTlNUUl9TSVlfVVJEIH0sCisJeyAieGl5IiwgMHg1NywgSU5TVFJfU0lZX1VSRCB9LAorCXsgImljbWgiLCAweDgwLCBJTlNUUl9SU0VfUlVSRCB9LAorCXsgImljbWgiLCAweDgwLCBJTlNUUl9SU1lfUlVSRCB9LAorCXsgImljbXkiLCAweDgxLCBJTlNUUl9SU1lfUlVSRCB9LAorCXsgImNsY2x1IiwgMHg4ZiwgSU5TVFJfUlNZX1JSUkQgfSwKKwl7ICJzdG15IiwgMHg5MCwgSU5TVFJfUlNZX1JSUkQgfSwKKwl7ICJsbWgiLCAweDk2LCBJTlNUUl9SU1lfUlJSRCB9LAorCXsgImxteSIsIDB4OTgsIElOU1RSX1JTWV9SUlJEIH0sCisJeyAibGFteSIsIDB4OWEsIElOU1RSX1JTWV9BQVJEIH0sCisJeyAic3RhbXkiLCAweDliLCBJTlNUUl9SU1lfQUFSRCB9LAorI2VuZGlmCisJeyAicmxsIiwgMHgxZCwgSU5TVFJfUlNZX1JSUkQgfSwKKwl7ICJtdmNsdSIsIDB4OGUsIElOU1RSX1JTWV9SUlJEIH0sCisJeyAidHAiLCAweGMwLCBJTlNUUl9SU0xfUjBSRCB9LAorCXsgIiIsIDAsIElOU1RSX0lOVkFMSUQgfQorfTsKKworc3RhdGljIHN0cnVjdCBpbnNuIG9wY29kZV9lY1tdID0geworI2lmZGVmIENPTkZJR182NEJJVAorCXsgImJyeGhnIiwgMHg0NCwgSU5TVFJfUklFX1JSUCB9LAorCXsgImJyeGxnIiwgMHg0NSwgSU5TVFJfUklFX1JSUCB9LAorI2VuZGlmCisJeyAiIiwgMCwgSU5TVFJfSU5WQUxJRCB9Cit9OworCitzdGF0aWMgc3RydWN0IGluc24gb3Bjb2RlX2VkW10gPSB7CisjaWZkZWYgQ09ORklHXzY0QklUCisJeyAibWF5bCIsIDB4MzgsIElOU1RSX1JYRl9GUlJERiB9LAorCXsgIm15bCIsIDB4MzksIElOU1RSX1JYRl9GUlJERiB9LAorCXsgIm1heSIsIDB4M2EsIElOU1RSX1JYRl9GUlJERiB9LAorCXsgIm15IiwgMHgzYiwgSU5TVFJfUlhGX0ZSUkRGIH0sCisJeyAibWF5aCIsIDB4M2MsIElOU1RSX1JYRl9GUlJERiB9LAorCXsgIm15aCIsIDB4M2QsIElOU1RSX1JYRl9GUlJERiB9LAorCXsgImxleSIsIDB4NjQsIElOU1RSX1JYWV9GUlJEIH0sCisJeyAibGR5IiwgMHg2NSwgSU5TVFJfUlhZX0ZSUkQgfSwKKwl7ICJzdGV5IiwgMHg2NiwgSU5TVFJfUlhZX0ZSUkQgfSwKKwl7ICJzdGR5IiwgMHg2NywgSU5TVFJfUlhZX0ZSUkQgfSwKKyNlbmRpZgorCXsgImxkZWIiLCAweDA0LCBJTlNUUl9SWEVfRlJSRCB9LAorCXsgImx4ZGIiLCAweDA1LCBJTlNUUl9SWEVfRlJSRCB9LAorCXsgImx4ZWIiLCAweDA2LCBJTlNUUl9SWEVfRlJSRCB9LAorCXsgIm14ZGIiLCAweDA3LCBJTlNUUl9SWEVfRlJSRCB9LAorCXsgImtlYiIsIDB4MDgsIElOU1RSX1JYRV9GUlJEIH0sCisJeyAiY2ViIiwgMHgwOSwgSU5TVFJfUlhFX0ZSUkQgfSwKKwl7ICJhZWIiLCAweDBhLCBJTlNUUl9SWEVfRlJSRCB9LAorCXsgInNlYiIsIDB4MGIsIElOU1RSX1JYRV9GUlJEIH0sCisJeyAibWRlYiIsIDB4MGMsIElOU1RSX1JYRV9GUlJEIH0sCisJeyAiZGViIiwgMHgwZCwgSU5TVFJfUlhFX0ZSUkQgfSwKKwl7ICJtYWViIiwgMHgwZSwgSU5TVFJfUlhGX0ZSUkRGIH0sCisJeyAibXNlYiIsIDB4MGYsIElOU1RSX1JYRl9GUlJERiB9LAorCXsgInRjZWIiLCAweDEwLCBJTlNUUl9SWEVfRlJSRCB9LAorCXsgInRjZGIiLCAweDExLCBJTlNUUl9SWEVfRlJSRCB9LAorCXsgInRjeGIiLCAweDEyLCBJTlNUUl9SWEVfRlJSRCB9LAorCXsgInNxZWIiLCAweDE0LCBJTlNUUl9SWEVfRlJSRCB9LAorCXsgInNxZGIiLCAweDE1LCBJTlNUUl9SWEVfRlJSRCB9LAorCXsgIm1lZWIiLCAweDE3LCBJTlNUUl9SWEVfRlJSRCB9LAorCXsgImtkYiIsIDB4MTgsIElOU1RSX1JYRV9GUlJEIH0sCisJeyAiY2RiIiwgMHgxOSwgSU5TVFJfUlhFX0ZSUkQgfSwKKwl7ICJhZGIiLCAweDFhLCBJTlNUUl9SWEVfRlJSRCB9LAorCXsgInNkYiIsIDB4MWIsIElOU1RSX1JYRV9GUlJEIH0sCisJeyAibWRiIiwgMHgxYywgSU5TVFJfUlhFX0ZSUkQgfSwKKwl7ICJkZGIiLCAweDFkLCBJTlNUUl9SWEVfRlJSRCB9LAorCXsgIm1hZGIiLCAweDFlLCBJTlNUUl9SWEZfRlJSREYgfSwKKwl7ICJtc2RiIiwgMHgxZiwgSU5TVFJfUlhGX0ZSUkRGIH0sCisJeyAibGRlIiwgMHgyNCwgSU5TVFJfUlhFX0ZSUkQgfSwKKwl7ICJseGQiLCAweDI1LCBJTlNUUl9SWEVfRlJSRCB9LAorCXsgImx4ZSIsIDB4MjYsIElOU1RSX1JYRV9GUlJEIH0sCisJeyAibWFlIiwgMHgyZSwgSU5TVFJfUlhGX0ZSUkRGIH0sCisJeyAibXNlIiwgMHgyZiwgSU5TVFJfUlhGX0ZSUkRGIH0sCisJeyAic3FlIiwgMHgzNCwgSU5TVFJfUlhFX0ZSUkQgfSwKKwl7ICJtZWUiLCAweDM3LCBJTlNUUl9SWEVfRlJSRCB9LAorCXsgIm1hZCIsIDB4M2UsIElOU1RSX1JYRl9GUlJERiB9LAorCXsgIm1zZCIsIDB4M2YsIElOU1RSX1JYRl9GUlJERiB9LAorCXsgIiIsIDAsIElOU1RSX0lOVkFMSUQgfQorfTsKKworLyogRXh0cmFjdHMgYW4gb3BlcmFuZCB2YWx1ZSBmcm9tIGFuIGluc3RydWN0aW9uLiAgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgZXh0cmFjdF9vcGVyYW5kKHVuc2lnbmVkIGNoYXIgKmNvZGUsCisJCQkJICAgIGNvbnN0IHN0cnVjdCBvcGVyYW5kICpvcGVyYW5kKQoreworCXVuc2lnbmVkIGludCB2YWw7CisJaW50IGJpdHM7CisKKwkvKiBFeHRyYWN0IGZyYWdtZW50cyBvZiB0aGUgb3BlcmFuZCBieXRlIGZvciBieXRlLiAgKi8KKwljb2RlICs9IG9wZXJhbmQtPnNoaWZ0IC8gODsKKwliaXRzID0gKG9wZXJhbmQtPnNoaWZ0ICYgNykgKyBvcGVyYW5kLT5iaXRzOworCXZhbCA9IDA7CisJZG8geworCQl2YWwgPDw9IDg7CisJCXZhbCB8PSAodW5zaWduZWQgaW50KSAqY29kZSsrOworCQliaXRzIC09IDg7CisJfSB3aGlsZSAoYml0cyA+IDApOworCXZhbCA+Pj0gLWJpdHM7CisJdmFsICY9ICgoMVUgPDwgKG9wZXJhbmQtPmJpdHMgLSAxKSkgPDwgMSkgLSAxOworCisJLyogQ2hlY2sgZm9yIHNwZWNpYWwgbG9uZyBkaXNwbGFjZW1lbnQgY2FzZS4gICovCisJaWYgKG9wZXJhbmQtPmJpdHMgPT0gMjAgJiYgb3BlcmFuZC0+c2hpZnQgPT0gMjApCisJCXZhbCA9ICh2YWwgJiAweGZmKSA8PCAxMiB8ICh2YWwgJiAweGZmZjAwKSA+PiA4OworCisJLyogU2lnbiBleHRlbmQgdmFsdWUgaWYgdGhlIG9wZXJhbmQgaXMgc2lnbmVkIG9yIHBjIHJlbGF0aXZlLiAgKi8KKwlpZiAoKG9wZXJhbmQtPmZsYWdzICYgKE9QRVJBTkRfU0lHTkVEIHwgT1BFUkFORF9QQ1JFTCkpICYmCisJICAgICh2YWwgJiAoMVUgPDwgKG9wZXJhbmQtPmJpdHMgLSAxKSkpKQorCQl2YWwgfD0gKC0xVSA8PCAob3BlcmFuZC0+Yml0cyAtIDEpKSA8PCAxOworCisJLyogRG91YmxlIHZhbHVlIGlmIHRoZSBvcGVyYW5kIGlzIHBjIHJlbGF0aXZlLgkqLworCWlmIChvcGVyYW5kLT5mbGFncyAmIE9QRVJBTkRfUENSRUwpCisJCXZhbCA8PD0gMTsKKworCS8qIExlbmd0aCB4IGluIGFuIGluc3RydWN0aW9ucyBoYXMgcmVhbCBsZW5ndGggeCArIDEuICAqLworCWlmIChvcGVyYW5kLT5mbGFncyAmIE9QRVJBTkRfTEVOR1RIKQorCQl2YWwrKzsKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgaW5saW5lIGludCBpbnNuX2xlbmd0aCh1bnNpZ25lZCBjaGFyIGNvZGUpCit7CisJcmV0dXJuICgoKChpbnQpIGNvZGUgKyA2NCkgPj4gNykgKyAxKSA8PCAxOworfQorCitzdGF0aWMgc3RydWN0IGluc24gKmZpbmRfaW5zbih1bnNpZ25lZCBjaGFyICpjb2RlKQoreworCXVuc2lnbmVkIGNoYXIgb3BmcmFnID0gY29kZVsxXTsKKwl1bnNpZ25lZCBjaGFyIG9wbWFzazsKKwlzdHJ1Y3QgaW5zbiAqdGFibGU7CisKKwlzd2l0Y2ggKGNvZGVbMF0pIHsKKwljYXNlIDB4MDE6CisJCXRhYmxlID0gb3Bjb2RlXzAxOworCQlicmVhazsKKwljYXNlIDB4YTU6CisJCXRhYmxlID0gb3Bjb2RlX2E1OworCQlicmVhazsKKwljYXNlIDB4YTc6CisJCXRhYmxlID0gb3Bjb2RlX2E3OworCQlicmVhazsKKwljYXNlIDB4YjI6CisJCXRhYmxlID0gb3Bjb2RlX2IyOworCQlicmVhazsKKwljYXNlIDB4YjM6CisJCXRhYmxlID0gb3Bjb2RlX2IzOworCQlicmVhazsKKwljYXNlIDB4Yjk6CisJCXRhYmxlID0gb3Bjb2RlX2I5OworCQlicmVhazsKKwljYXNlIDB4YzA6CisJCXRhYmxlID0gb3Bjb2RlX2MwOworCQlicmVhazsKKwljYXNlIDB4YzI6CisJCXRhYmxlID0gb3Bjb2RlX2MyOworCQlicmVhazsKKwljYXNlIDB4Yzg6CisJCXRhYmxlID0gb3Bjb2RlX2M4OworCQlicmVhazsKKwljYXNlIDB4ZTM6CisJCXRhYmxlID0gb3Bjb2RlX2UzOworCQlvcGZyYWcgPSBjb2RlWzVdOworCQlicmVhazsKKwljYXNlIDB4ZTU6CisJCXRhYmxlID0gb3Bjb2RlX2U1OworCQlicmVhazsKKwljYXNlIDB4ZWI6CisJCXRhYmxlID0gb3Bjb2RlX2ViOworCQlvcGZyYWcgPSBjb2RlWzVdOworCQlicmVhazsKKwljYXNlIDB4ZWM6CisJCXRhYmxlID0gb3Bjb2RlX2VjOworCQlvcGZyYWcgPSBjb2RlWzVdOworCQlicmVhazsKKwljYXNlIDB4ZWQ6CisJCXRhYmxlID0gb3Bjb2RlX2VkOworCQlvcGZyYWcgPSBjb2RlWzVdOworCQlicmVhazsKKwlkZWZhdWx0OgorCQl0YWJsZSA9IG9wY29kZTsKKwkJb3BmcmFnID0gY29kZVswXTsKKwkJYnJlYWs7CisJfQorCXdoaWxlICh0YWJsZS0+Zm9ybWF0ICE9IElOU1RSX0lOVkFMSUQpIHsKKwkJb3BtYXNrID0gZm9ybWF0c1t0YWJsZS0+Zm9ybWF0XVswXTsKKwkJaWYgKHRhYmxlLT5vcGZyYWcgPT0gKG9wZnJhZyAmIG9wbWFzaykpCisJCQlyZXR1cm4gdGFibGU7CisJCXRhYmxlKys7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IHByaW50X2luc24oY2hhciAqYnVmZmVyLCB1bnNpZ25lZCBjaGFyICpjb2RlLCB1bnNpZ25lZCBsb25nIGFkZHIpCit7CisJc3RydWN0IGluc24gKmluc247CisJY29uc3QgdW5zaWduZWQgY2hhciAqb3BzOworCWNvbnN0IHN0cnVjdCBvcGVyYW5kICpvcGVyYW5kOworCXVuc2lnbmVkIGludCB2YWx1ZTsKKwljaGFyIHNlcGFyYXRvcjsKKwljaGFyICpwdHI7CisKKwlwdHIgPSBidWZmZXI7CisJaW5zbiA9IGZpbmRfaW5zbihjb2RlKTsKKwlpZiAoaW5zbikgeworCQlwdHIgKz0gc3ByaW50ZihwdHIsICIlLjVzXHQiLCBpbnNuLT5uYW1lKTsKKwkJLyogRXh0cmFjdCB0aGUgb3BlcmFuZHMuICovCisJCXNlcGFyYXRvciA9IDA7CisJCWZvciAob3BzID0gZm9ybWF0c1tpbnNuLT5mb3JtYXRdICsgMTsgKm9wcyAhPSAwOyBvcHMrKykgeworCQkJb3BlcmFuZCA9IG9wZXJhbmRzICsgKm9wczsKKwkJCXZhbHVlID0gZXh0cmFjdF9vcGVyYW5kKGNvZGUsIG9wZXJhbmQpOworCQkJaWYgKChvcGVyYW5kLT5mbGFncyAmIE9QRVJBTkRfSU5ERVgpICAmJiB2YWx1ZSA9PSAwKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKChvcGVyYW5kLT5mbGFncyAmIE9QRVJBTkRfQkFTRSkgJiYKKwkJCSAgICB2YWx1ZSA9PSAwICYmIHNlcGFyYXRvciA9PSAnKCcpIHsKKwkJCQlzZXBhcmF0b3IgPSAnLCc7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoc2VwYXJhdG9yKQorCQkJCXB0ciArPSBzcHJpbnRmKHB0ciwgIiVjIiwgc2VwYXJhdG9yKTsKKwkJCWlmIChvcGVyYW5kLT5mbGFncyAmIE9QRVJBTkRfR1BSKQorCQkJCXB0ciArPSBzcHJpbnRmKHB0ciwgIiUlciVpIiwgdmFsdWUpOworCQkJZWxzZSBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBPUEVSQU5EX0ZQUikKKwkJCQlwdHIgKz0gc3ByaW50ZihwdHIsICIlJWYlaSIsIHZhbHVlKTsKKwkJCWVsc2UgaWYgKG9wZXJhbmQtPmZsYWdzICYgT1BFUkFORF9BUikKKwkJCQlwdHIgKz0gc3ByaW50ZihwdHIsICIlJWElaSIsIHZhbHVlKTsKKwkJCWVsc2UgaWYgKG9wZXJhbmQtPmZsYWdzICYgT1BFUkFORF9DUikKKwkJCQlwdHIgKz0gc3ByaW50ZihwdHIsICIlJWMlaSIsIHZhbHVlKTsKKwkJCWVsc2UgaWYgKG9wZXJhbmQtPmZsYWdzICYgT1BFUkFORF9QQ1JFTCkKKwkJCQlwdHIgKz0gc3ByaW50ZihwdHIsICIlbHgiLCB2YWx1ZSArIGFkZHIpOworCQkJZWxzZSBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBPUEVSQU5EX1NJR05FRCkKKwkJCQlwdHIgKz0gc3ByaW50ZihwdHIsICIlaSIsIHZhbHVlKTsKKwkJCWVsc2UKKwkJCQlwdHIgKz0gc3ByaW50ZihwdHIsICIldSIsIHZhbHVlKTsKKwkJCWlmIChvcGVyYW5kLT5mbGFncyAmIE9QRVJBTkRfRElTUCkKKwkJCQlzZXBhcmF0b3IgPSAnKCc7CisJCQllbHNlIGlmIChvcGVyYW5kLT5mbGFncyAmIE9QRVJBTkRfQkFTRSkgeworCQkJCXB0ciArPSBzcHJpbnRmKHB0ciwgIikiKTsKKwkJCQlzZXBhcmF0b3IgPSAnLCc7CisJCQl9IGVsc2UKKwkJCQlzZXBhcmF0b3IgPSAnLCc7CisJCX0KKwl9IGVsc2UKKwkJcHRyICs9IHNwcmludGYocHRyLCAidW5rbm93biIpOworCXJldHVybiAoaW50KSAocHRyIC0gYnVmZmVyKTsKK30KKwordm9pZCBzaG93X2NvZGUoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJY2hhciAqbW9kZSA9IChyZWdzLT5wc3cubWFzayAmIFBTV19NQVNLX1BTVEFURSkgPyAiVXNlciIgOiAiS3JubCI7CisJdW5zaWduZWQgY2hhciBjb2RlWzY0XTsKKwljaGFyIGJ1ZmZlcls2NF0sICpwdHI7CisJbW1fc2VnbWVudF90IG9sZF9mczsKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisJaW50IHN0YXJ0LCBlbmQsIG9wc2l6ZSwgaG9wcywgaTsKKworCS8qIEdldCBhIHNuYXBzaG90IG9mIHRoZSA2NCBieXRlcyBzdXJyb3VuZGluZyB0aGUgZmF1bHQgYWRkcmVzcy4gKi8KKwlvbGRfZnMgPSBnZXRfZnMoKTsKKwlzZXRfZnMoKHJlZ3MtPnBzdy5tYXNrICYgUFNXX01BU0tfUFNUQVRFKSA/IFVTRVJfRFMgOiBLRVJORUxfRFMpOworCWZvciAoc3RhcnQgPSAzMjsgc3RhcnQgJiYgcmVncy0+cHN3LmFkZHIgPj0gMzQgLSBzdGFydDsgc3RhcnQgLT0gMikgeworCQlhZGRyID0gcmVncy0+cHN3LmFkZHIgLSAzNCArIHN0YXJ0OworCQlpZiAoX19jb3B5X2Zyb21fdXNlcihjb2RlICsgc3RhcnQgLSAyLAorCQkJCSAgICAgKGNoYXIgX191c2VyICopIGFkZHIsIDIpKQorCQkJYnJlYWs7CisJfQorCWZvciAoZW5kID0gMzI7IGVuZCA8IDY0OyBlbmQgKz0gMikgeworCQlhZGRyID0gcmVncy0+cHN3LmFkZHIgKyBlbmQgLSAzMjsKKwkJaWYgKF9fY29weV9mcm9tX3VzZXIoY29kZSArIGVuZCwKKwkJCQkgICAgIChjaGFyIF9fdXNlciAqKSBhZGRyLCAyKSkKKwkJCWJyZWFrOworCX0KKwlzZXRfZnMob2xkX2ZzKTsKKwkvKiBDb2RlIHNuYXBzaG90IHVzZWFibGUgPyAqLworCWlmICgocmVncy0+cHN3LmFkZHIgJiAxKSB8fCBzdGFydCA+PSBlbmQpIHsKKwkJcHJpbnRrKCIlcyBDb2RlOiBCYWQgUFNXLlxuIiwgbW9kZSk7CisJCXJldHVybjsKKwl9CisJLyogRmluZCBhIHN0YXJ0aW5nIHBvaW50IGZvciB0aGUgZGlzYXNzZW1ibHkuICovCisJd2hpbGUgKHN0YXJ0IDwgMzIpIHsKKwkJaG9wcyA9IDA7CisJCWZvciAoaSA9IDAsIGhvcHMgPSAwOyBzdGFydCArIGkgPCAzMiAmJiBob3BzIDwgMzsgaG9wcysrKSB7CisJCQlpZiAoIWZpbmRfaW5zbihjb2RlICsgc3RhcnQgKyBpKSkKKwkJCQlicmVhazsKKwkJCWkgKz0gaW5zbl9sZW5ndGgoY29kZVtzdGFydCArIGldKTsKKwkJfQorCQlpZiAoc3RhcnQgKyBpID09IDMyKQorCQkJLyogTG9va3MgZ29vZCwgc2VxdWVuY2UgZW5kcyBhdCBQU1cuICovCisJCQlicmVhazsKKwkJc3RhcnQgKz0gMjsKKwl9CisJLyogRGVjb2RlIHRoZSBpbnN0cnVjdGlvbnMuICovCisJcHRyID0gYnVmZmVyOworCXB0ciArPSBzcHJpbnRmKHB0ciwgIiVzIENvZGU6IiwgbW9kZSk7CisJaG9wcyA9IDA7CisJd2hpbGUgKHN0YXJ0IDwgZW5kICYmIGhvcHMgPCA4KSB7CisJCSpwdHIrKyA9IChzdGFydCA9PSAzMikgPyAnPicgOiAnICc7CisJCWFkZHIgPSByZWdzLT5wc3cuYWRkciArIHN0YXJ0IC0gMzI7CisJCXB0ciArPSBzcHJpbnRmKHB0ciwgT05FTE9ORywgYWRkcik7CisJCW9wc2l6ZSA9IGluc25fbGVuZ3RoKGNvZGVbc3RhcnRdKTsKKwkJaWYgKHN0YXJ0ICsgb3BzaXplID49IGVuZCkKKwkJCWJyZWFrOworCQlmb3IgKGkgPSAwOyBpIDwgb3BzaXplOyBpKyspCisJCQlwdHIgKz0gc3ByaW50ZihwdHIsICIlMDJ4IiwgY29kZVtzdGFydCArIGldKTsKKwkJKnB0cisrID0gJ1x0JzsKKwkJaWYgKGkgPCA2KQorCQkJKnB0cisrID0gJ1x0JzsKKwkJcHRyICs9IHByaW50X2luc24ocHRyLCBjb2RlICsgc3RhcnQsIGFkZHIpOworCQlzdGFydCArPSBvcHNpemU7CisJCXByaW50ayhidWZmZXIpOworCQlwdHIgPSBidWZmZXI7CisJCXB0ciArPSBzcHJpbnRmKHB0ciwgIlxuICAgICAgICAgICIpOworCQlob3BzKys7CisJfQorCXByaW50aygiXG4iKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvZWFybHkuYyBiL2FyY2gvczM5MC9rZXJuZWwvZWFybHkuYwppbmRleCA1ZTQ3OTM2Li41MDUzOGU1IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL2Vhcmx5LmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9lYXJseS5jCkBAIC0yNTMsMTEgKzI1MywxMCBAQAogCQkJYnJlYWs7CiAjZW5kaWYKIAkJLyoKLQkJICogRmluaXNoIG1lbW9yeSBkZXRlY3Rpb24gYXQgdGhlIGZpcnN0IGhvbGUsIHVubGVzcwotCQkgKiAtIHdlIHJlYWNoZWQgdGhlIGhzYSAtPiBza2lwIGl0LgotCQkgKiAtIHdlIGtub3cgdGhlcmUgbXVzdCBiZSBtb3JlLgorCQkgKiBGaW5pc2ggbWVtb3J5IGRldGVjdGlvbiBhdCB0aGUgZmlyc3QgaG9sZQorCQkgKiBpZiBzdG9yYWdlIHNpemUgaXMgdW5rbm93bi4KIAkJICovCi0JCWlmIChjYyA9PSAtMVVMICYmICFtZW1zaXplICYmIG9sZF9hZGRyICE9IEFERFIyRykKKwkJaWYgKGNjID09IC0xVUwgJiYgIW1lbXNpemUpCiAJCQlicmVhazsKIAkJaWYgKG1lbXNpemUgJiYgYWRkciA+PSBtZW1zaXplKQogCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2VudHJ5LlMgYi9hcmNoL3MzOTAva2VybmVsL2VudHJ5LlMKaW5kZXggZGRkYzNkZS4uYzhhMjIxMiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9lbnRyeS5TCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvZW50cnkuUwpAQCAtMjQ5LDggKzI0OSw2IEBACiAJYm56CUJBU0VEKHN5c2NfdHJhY2VzeXMpCiAJYmFzcgklcjE0LCVyOAkgICMgY2FsbCBzeXNfeHh4eAogCXN0CSVyMixTUF9SMiglcjE1KSAgICMgc3RvcmUgcmV0dXJuIHZhbHVlIChjaGFuZ2UgUjIgb24gc3RhY2spCi0JCQkJICAjIEFUVEVOVElPTjogY2hlY2sgc3lzX2V4ZWN2ZV9nbHVlIGJlZm9yZQotCQkJCSAgIyBjaGFuZ2luZyBhbnl0aGluZyBoZXJlICEhCiAKIHN5c2NfcmV0dXJuOgogCXRtCVNQX1BTVysxKCVyMTUpLDB4MDEJIyByZXR1cm5pbmcgdG8gdXNlciA/CkBAIC0zODEsNTAgKzM3OSwzNyBAQAogCWIJQkFTRUQoc3lzY19yZXR1cm4pCiAKICMKLSMgY2xvbmUsIGZvcmssIHZmb3JrLCBleGVjIGFuZCBzaWdyZXR1cm4gbmVlZCBnbHVlLAotIyBiZWNhdXNlIHRoZXkgYWxsIGV4cGVjdCBwdF9yZWdzIGFzIHBhcmFtZXRlciwKLSMgYnV0IGFyZSBjYWxsZWQgd2l0aCBkaWZmZXJlbnQgcGFyYW1ldGVyLgotIyByZXR1cm4tYWRkcmVzcyBpcyBzZXQgdXAgYWJvdmUKKyMga2VybmVsX2V4ZWN2ZSBmdW5jdGlvbiBuZWVkcyB0byBkZWFsIHdpdGggcHRfcmVncyB0aGF0IGlzIG5vdAorIyBhdCB0aGUgdXN1YWwgcGxhY2UKICMKLXN5c19jbG9uZV9nbHVlOgotCWxhCSVyMixTUF9QVFJFR1MoJXIxNSkJIyBsb2FkIHB0X3JlZ3MKLQlsCSVyMSxCQVNFRCguTGNsb25lKQotCWJyCSVyMQkJCSMgYnJhbmNoIHRvIHN5c19jbG9uZQotCi1zeXNfZm9ya19nbHVlOgotCWxhCSVyMixTUF9QVFJFR1MoJXIxNSkJIyBsb2FkIHB0X3JlZ3MKLQlsCSVyMSxCQVNFRCguTGZvcmspCi0JYnIJJXIxCQkJIyBicmFuY2ggdG8gc3lzX2ZvcmsKLQotc3lzX3Zmb3JrX2dsdWU6Ci0JbGEJJXIyLFNQX1BUUkVHUyglcjE1KQkjIGxvYWQgcHRfcmVncwotCWwJJXIxLEJBU0VEKC5MdmZvcmspCi0JYnIJJXIxCQkJIyBicmFuY2ggdG8gc3lzX3Zmb3JrCi0KLXN5c19leGVjdmVfZ2x1ZToKLQlsYQklcjIsU1BfUFRSRUdTKCVyMTUpCSMgbG9hZCBwdF9yZWdzCi0JbAklcjEsQkFTRUQoLkxleGVjdmUpCi0JbHIJJXIxMiwlcjE0CQkjIHNhdmUgcmV0dXJuIGFkZHJlc3MKLQliYXNyCSVyMTQsJXIxCQkjIGNhbGwgc3lzX2V4ZWN2ZQotCWx0cgklcjIsJXIyCQkJIyBjaGVjayBpZiBleGVjdmUgZmFpbGVkCi0JYm56CTAoJXIxMikJCQkjIGl0IGRpZCBmYWlsIC0+IHN0b3JlIHJlc3VsdCBpbiBncHIyCi0JYgk0KCVyMTIpCQkJIyBTS0lQIFNUIDIsU1BfUjIoMTUpIGFmdGVyIEJBU1IgMTQsOAotCQkJCQkjIGluIHN5c3RlbV9jYWxsL3N5c2NfdHJhY2VzeXMKLQotc3lzX3NpZ3JldHVybl9nbHVlOgotCWxhCSVyMixTUF9QVFJFR1MoJXIxNSkJIyBsb2FkIHB0X3JlZ3MgYXMgcGFyYW1ldGVyCi0JbAklcjEsQkFTRUQoLkxzaWdyZXR1cm4pCi0JYnIJJXIxCQkJIyBicmFuY2ggdG8gc3lzX3NpZ3JldHVybgotCi1zeXNfcnRfc2lncmV0dXJuX2dsdWU6Ci0JbGEJJXIyLFNQX1BUUkVHUyglcjE1KQkjIGxvYWQgcHRfcmVncyBhcyBwYXJhbWV0ZXIKLQlsCSVyMSxCQVNFRCguTHJ0X3NpZ3JldHVybikKLQlicgklcjEJCQkjIGJyYW5jaCB0byBzeXNfc2lncmV0dXJuCi0KLXN5c19zaWdhbHRzdGFja19nbHVlOgotCWxhCSVyNCxTUF9QVFJFR1MoJXIxNSkJIyBsb2FkIHB0X3JlZ3MgYXMgcGFyYW1ldGVyCi0JbAklcjEsQkFTRUQoLkxzaWdhbHRzdGFjaykKLQlicgklcjEJCQkjIGJyYW5jaCB0byBzeXNfc2lncmV0dXJuCisJLmdsb2JsCWtlcm5lbF9leGVjdmUKK2tlcm5lbF9leGVjdmU6CisJc3RtCSVyMTIsJXIxNSw0OCglcjE1KQorCWxyCSVyMTQsJXIxNQorCWwJJXIxMyxfX0xDX1NWQ19ORVdfUFNXKzQKKwlzCSVyMTUsQkFTRUQoLkxjX3Nwc2l6ZSkKKwlzdAklcjE0LF9fU0ZfQkFDS0NIQUlOKCVyMTUpCisJbGEJJXIxMixTUF9QVFJFR1MoJXIxNSkKKwl4YwkwKF9fUFRfU0laRSwlcjEyKSwwKCVyMTIpCisJbAklcjEsQkFTRUQoLkxkb19leGVjdmUpCisJbHIJJXI1LCVyMTIKKwliYXNyCSVyMTQsJXIxCisJbHRyCSVyMiwlcjIKKwliZQlCQVNFRCgwZikKKwlhCSVyMTUsQkFTRUQoLkxjX3Nwc2l6ZSkKKwlsbQklcjEyLCVyMTUsNDgoJXIxNSkKKwlicgklcjE0CisJIyBleGVjdmUgc3VjY2VlZGVkLgorMDoJc3Ruc20JX19TRl9FTVBUWSglcjE1KSwweGZjCSMgZGlzYWJsZSBpbnRlcnJ1cHRzCisJbAklcjE1LF9fTENfS0VSTkVMX1NUQUNLCSMgbG9hZCBrc3AKKwlzCSVyMTUsQkFTRUQoLkxjX3Nwc2l6ZSkJIyBtYWtlIHJvb20gZm9yIHJlZ2lzdGVycyAmIHBzdworCWwJJXI5LF9fTENfVEhSRUFEX0lORk8KKwltdmMJU1BfUFRSRUdTKF9fUFRfU0laRSwlcjE1KSwwKCVyMTIpCSMgY29weSBwdF9yZWdzCisJeGMJX19TRl9CQUNLQ0hBSU4oNCwlcjE1KSxfX1NGX0JBQ0tDSEFJTiglcjE1KQorCXN0b3NtCV9fU0ZfRU1QVFkoJXIxNSksMHgwMwkjIHJlZW5hYmxlIGludGVycnVwdHMKKwlsCSVyMSxCQVNFRCguTGV4ZWN2ZV90YWlsKQorCWJhc3IJJXIxNCwlcjEKKwliCUJBU0VEKHN5c2NfcmV0dXJuKQogCiAvKgogICogUHJvZ3JhbSBjaGVjayBoYW5kbGVyIHJvdXRpbmUKQEAgLTEwMzEsMTkgKzEwMTYsMTEgQEAKIC5MZG9fZXh0aW50OgkubG9uZwlkb19leHRpbnQKIC5MZG9fc2lnbmFsOgkubG9uZwlkb19zaWduYWwKIC5MaGFuZGxlX3BlcjoJLmxvbmcJZG9fc2luZ2xlX3N0ZXAKKy5MZG9fZXhlY3ZlOgkubG9uZwlkb19leGVjdmUKKy5MZXhlY3ZlX3RhaWw6CS5sb25nCWV4ZWN2ZV90YWlsCiAuTGp1bXBfdGFibGU6CS5sb25nCXBnbV9jaGVja190YWJsZQogLkxzY2hlZHVsZToJLmxvbmcJc2NoZWR1bGUKLS5MY2xvbmU6CS5sb25nCXN5c19jbG9uZQotLkxleGVjdmU6CS5sb25nCXN5c19leGVjdmUKLS5MZm9yazogCS5sb25nCXN5c19mb3JrCi0uTHJ0X3NpZ3JldHVybjogLmxvbmcJc3lzX3J0X3NpZ3JldHVybgotLkxydF9zaWdzdXNwZW5kOgotCQkubG9uZwlzeXNfcnRfc2lnc3VzcGVuZAotLkxzaWdyZXR1cm46CS5sb25nCXN5c19zaWdyZXR1cm4KLS5Mc2lnc3VzcGVuZDoJLmxvbmcJc3lzX3NpZ3N1c3BlbmQKLS5Mc2lnYWx0c3RhY2s6CS5sb25nCXN5c19zaWdhbHRzdGFjawogLkx0cmFjZToJLmxvbmcJc3lzY2FsbF90cmFjZQotLkx2Zm9yazoJLmxvbmcJc3lzX3Zmb3JrCiAuTHNjaGVkdGFpbDoJLmxvbmcJc2NoZWR1bGVfdGFpbAogLkxzeXNjX3RhYmxlOgkubG9uZwlzeXNfY2FsbF90YWJsZQogI2lmZGVmIENPTkZJR19UUkFDRV9JUlFGTEFHUwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9lbnRyeTY0LlMgYi9hcmNoL3MzOTAva2VybmVsL2VudHJ5NjQuUwppbmRleCAwZjc1OGMzLi45Mzc0NWZkIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL2VudHJ5NjQuUworKysgYi9hcmNoL3MzOTAva2VybmVsL2VudHJ5NjQuUwpAQCAtMjQ0LDggKzI0NCw2IEBACiAJam56CXN5c2NfdHJhY2VzeXMKIAliYXNyCSVyMTQsJXI4CSMgY2FsbCBzeXNfeHh4eAogCXN0ZwklcjIsU1BfUjIoJXIxNSkgIyBzdG9yZSByZXR1cm4gdmFsdWUgKGNoYW5nZSBSMiBvbiBzdGFjaykKLQkJCQkjIEFUVEVOVElPTjogY2hlY2sgc3lzX2V4ZWN2ZV9nbHVlIGJlZm9yZQotCQkJCSMgY2hhbmdpbmcgYW55dGhpbmcgaGVyZSAhIQogCiBzeXNjX3JldHVybjoKIAl0bQlTUF9QU1crMSglcjE1KSwweDAxCSMgcmV0dXJuaW5nIHRvIHVzZXIgPwpAQCAtMzcxLDc3ICszNjksMzUgQEAKIAlqCXN5c2NfcmV0dXJuCiAKICMKLSMgY2xvbmUsIGZvcmssIHZmb3JrLCBleGVjIGFuZCBzaWdyZXR1cm4gbmVlZCBnbHVlLAotIyBiZWNhdXNlIHRoZXkgYWxsIGV4cGVjdCBwdF9yZWdzIGFzIHBhcmFtZXRlciwKLSMgYnV0IGFyZSBjYWxsZWQgd2l0aCBkaWZmZXJlbnQgcGFyYW1ldGVyLgotIyByZXR1cm4tYWRkcmVzcyBpcyBzZXQgdXAgYWJvdmUKKyMga2VybmVsX2V4ZWN2ZSBmdW5jdGlvbiBuZWVkcyB0byBkZWFsIHdpdGggcHRfcmVncyB0aGF0IGlzIG5vdAorIyBhdCB0aGUgdXN1YWwgcGxhY2UKICMKLXN5c19jbG9uZV9nbHVlOgotCWxhCSVyMixTUF9QVFJFR1MoJXIxNSkJIyBsb2FkIHB0X3JlZ3MKLQlqZwlzeXNfY2xvbmUJCSMgYnJhbmNoIHRvIHN5c19jbG9uZQotCi0jaWZkZWYgQ09ORklHX0NPTVBBVAotc3lzMzJfY2xvbmVfZ2x1ZToKLQlsYQklcjIsU1BfUFRSRUdTKCVyMTUpCSMgbG9hZCBwdF9yZWdzCi0JamcJc3lzMzJfY2xvbmUJCSMgYnJhbmNoIHRvIHN5czMyX2Nsb25lCi0jZW5kaWYKLQotc3lzX2ZvcmtfZ2x1ZToKLQlsYQklcjIsU1BfUFRSRUdTKCVyMTUpCSMgbG9hZCBwdF9yZWdzCi0JamcJc3lzX2ZvcmsJCSMgYnJhbmNoIHRvIHN5c19mb3JrCi0KLXN5c192Zm9ya19nbHVlOgotCWxhCSVyMixTUF9QVFJFR1MoJXIxNSkJIyBsb2FkIHB0X3JlZ3MKLQlqZwlzeXNfdmZvcmsJCSMgYnJhbmNoIHRvIHN5c192Zm9yawotCi1zeXNfZXhlY3ZlX2dsdWU6Ci0JbGEJJXIyLFNQX1BUUkVHUyglcjE1KQkjIGxvYWQgcHRfcmVncwotCWxncgklcjEyLCVyMTQJCSMgc2F2ZSByZXR1cm4gYWRkcmVzcwotCWJyYXNsCSVyMTQsc3lzX2V4ZWN2ZSAJIyBjYWxsIHN5c19leGVjdmUKLQlsdGdyCSVyMiwlcjIgCQkjIGNoZWNrIGlmIGV4ZWN2ZSBmYWlsZWQKLQlibnoJMCglcjEyKSAJCSMgaXQgZGlkIGZhaWwgLT4gc3RvcmUgcmVzdWx0IGluIGdwcjIKLQliCTYoJXIxMikgCQkjIFNLSVAgU1RHIDIsU1BfUjIoMTUpIGluCi0JCQkJCSMgc3lzdGVtX2NhbGwvc3lzY190cmFjZXN5cwotI2lmZGVmIENPTkZJR19DT01QQVQKLXN5czMyX2V4ZWN2ZV9nbHVlOgotCWxhCSVyMixTUF9QVFJFR1MoJXIxNSkJIyBsb2FkIHB0X3JlZ3MKLQlsZ3IJJXIxMiwlcjE0CQkjIHNhdmUgcmV0dXJuIGFkZHJlc3MKLQlicmFzbAklcjE0LHN5czMyX2V4ZWN2ZQkjIGNhbGwgc3lzMzJfZXhlY3ZlCi0JbHRncgklcjIsJXIyIAkJIyBjaGVjayBpZiBleGVjdmUgZmFpbGVkCi0JYm56CTAoJXIxMikgCQkjIGl0IGRpZCBmYWlsIC0+IHN0b3JlIHJlc3VsdCBpbiBncHIyCi0JYgk2KCVyMTIpIAkJIyBTS0lQIFNURyAyLFNQX1IyKDE1KSBpbgotCQkJCQkjIHN5c3RlbV9jYWxsL3N5c2NfdHJhY2VzeXMKLSNlbmRpZgotCi1zeXNfc2lncmV0dXJuX2dsdWU6Ci0JbGEJJXIyLFNQX1BUUkVHUyglcjE1KQkjIGxvYWQgcHRfcmVncyBhcyBwYXJhbWV0ZXIKLQlqZwlzeXNfc2lncmV0dXJuCQkjIGJyYW5jaCB0byBzeXNfc2lncmV0dXJuCi0KLSNpZmRlZiBDT05GSUdfQ09NUEFUCi1zeXMzMl9zaWdyZXR1cm5fZ2x1ZToKLQlsYQklcjIsU1BfUFRSRUdTKCVyMTUpCSMgbG9hZCBwdF9yZWdzIGFzIHBhcmFtZXRlcgotCWpnCXN5czMyX3NpZ3JldHVybiAJIyBicmFuY2ggdG8gc3lzMzJfc2lncmV0dXJuCi0jZW5kaWYKLQotc3lzX3J0X3NpZ3JldHVybl9nbHVlOgotCWxhCSVyMixTUF9QVFJFR1MoJXIxNSkJIyBsb2FkIHB0X3JlZ3MgYXMgcGFyYW1ldGVyCi0JamcJc3lzX3J0X3NpZ3JldHVybgkjIGJyYW5jaCB0byBzeXNfc2lncmV0dXJuCi0KLSNpZmRlZiBDT05GSUdfQ09NUEFUCi1zeXMzMl9ydF9zaWdyZXR1cm5fZ2x1ZToKLQlsYQklcjIsU1BfUFRSRUdTKCVyMTUpCSMgbG9hZCBwdF9yZWdzIGFzIHBhcmFtZXRlcgotCWpnCXN5czMyX3J0X3NpZ3JldHVybgkjIGJyYW5jaCB0byBzeXMzMl9zaWdyZXR1cm4KLSNlbmRpZgotCi1zeXNfc2lnYWx0c3RhY2tfZ2x1ZToKLQlsYQklcjQsU1BfUFRSRUdTKCVyMTUpCSMgbG9hZCBwdF9yZWdzIGFzIHBhcmFtZXRlcgotCWpnCXN5c19zaWdhbHRzdGFjayAJIyBicmFuY2ggdG8gc3lzX3NpZ3JldHVybgotCi0jaWZkZWYgQ09ORklHX0NPTVBBVAotc3lzMzJfc2lnYWx0c3RhY2tfZ2x1ZToKLQlsYQklcjQsU1BfUFRSRUdTKCVyMTUpCSMgbG9hZCBwdF9yZWdzIGFzIHBhcmFtZXRlcgotCWpnCXN5czMyX3NpZ2FsdHN0YWNrX3dyYXBwZXIgIyBicmFuY2ggdG8gc3lzX3NpZ3JldHVybgotI2VuZGlmCisJLmdsb2JsCWtlcm5lbF9leGVjdmUKK2tlcm5lbF9leGVjdmU6CisJc3RtZwklcjEyLCVyMTUsOTYoJXIxNSkKKwlsZ3IJJXIxNCwlcjE1CisJYWdoaQklcjE1LC1TUF9TSVpFCisJc3RnCSVyMTQsX19TRl9CQUNLQ0hBSU4oJXIxNSkKKwlsYQklcjEyLFNQX1BUUkVHUyglcjE1KQorCXhjCTAoX19QVF9TSVpFLCVyMTIpLDAoJXIxMikKKwlsZ3IJJXI1LCVyMTIKKwlicmFzbAklcjE0LGRvX2V4ZWN2ZQorCWx0Z2ZyCSVyMiwlcjIKKwlqZQkwZgorCWFnaGkJJXIxNSxTUF9TSVpFCisJbG1nCSVyMTIsJXIxNSw5NiglcjE1KQorCWJyCSVyMTQKKwkjIGV4ZWN2ZSBzdWNjZWVkZWQuCiswOglzdG5zbQlfX1NGX0VNUFRZKCVyMTUpLDB4ZmMJIyBkaXNhYmxlIGludGVycnVwdHMKKwlsZwklcjE1LF9fTENfS0VSTkVMX1NUQUNLCSMgbG9hZCBrc3AKKwlhZ2hpCSVyMTUsLVNQX1NJWkUJCSMgbWFrZSByb29tIGZvciByZWdpc3RlcnMgJiBwc3cKKwlsZwklcjEzLF9fTENfU1ZDX05FV19QU1crOAorCWxnCSVyOSxfX0xDX1RIUkVBRF9JTkZPCisJbXZjCVNQX1BUUkVHUyhfX1BUX1NJWkUsJXIxNSksMCglcjEyKQkjIGNvcHkgcHRfcmVncworCXhjCV9fU0ZfQkFDS0NIQUlOKDgsJXIxNSksX19TRl9CQUNLQ0hBSU4oJXIxNSkKKwlzdG9zbQlfX1NGX0VNUFRZKCVyMTUpLDB4MDMJIyByZWVuYWJsZSBpbnRlcnJ1cHRzCisJYnJhc2wJJXIxNCxleGVjdmVfdGFpbAorCWoJc3lzY19yZXR1cm4KIAogLyoKICAqIFByb2dyYW0gY2hlY2sgaGFuZGxlciByb3V0aW5lCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2hlYWQ2NC5TIGIvYXJjaC9zMzkwL2tlcm5lbC9oZWFkNjQuUwppbmRleCAzNzAxMDcwLi5hODdiMTk3IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL2hlYWQ2NC5TCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvaGVhZDY0LlMKQEAgLTM5LDcgKzM5LDY5IEBACiAJYmFzcgklcjEzLDAJCQkjIGdldCBiYXNlCiAuTFBHMToJc2xsCSVyMTMsMQkJCSMgcmVtb3ZlIGhpZ2ggb3JkZXIgYml0CiAJc3JsCSVyMTMsMQotCWxoaQklcjEsMQkJCSMgbW9kZSAxID0gZXNhbWUKKworI2lmZGVmIENPTkZJR19aRkNQRFVNUAorCisJIyBjaGVjayBpZiB3ZSBoYXZlIGJlZW4gaXBsZWQgdXNpbmcgemZjcCBkdW1wOgorCisJdG0JMHhiOSwweDAxCQkjIHRlc3QgaWYgc3ViY2hhbm5lbCBpcyBlbmFibGVkCisJam5vCS5ub2R1bXAJCQkjIHN1YmNoYW5uZWwgZGlzYWJsZWQKKwlsCSVyMSwweGI4CisJbGEJJXI1LC5MaXBsX3NjaGliLS5MUEcxKCVyMTMpCisJc3RzY2gJMCglcjUpCQkJIyBnZXQgc2NoaWIgb2Ygc3ViY2hhbm5lbAorCWpuZQkubm9kdW1wCQkJIyBzY2hpYiBub3QgYXZhaWxhYmxlCisJdG0JNSglcjUpLDB4MDEJCSMgZGV2bm8gdmFsaWQ/CisJam5vCS5ub2R1bXAKKwl0bQk0KCVyNSksMHg4MAkJIyBxZGlvIGNhcGFibGUgZGV2aWNlPworCWpubwkubm9kdW1wCisJbAklcjIsMjAoJXIwKQkJIyBhZGRyZXNzIG9mIGlwbCBwYXJhbWV0ZXIgYmxvY2sKKwlsaGkJJXIzLDAKKwlpYwklcjMsMHgxNDgoJXIyKQkJIyBnZXQgb3B0IGZpZWxkCisJY2hpCSVyMywweDIwCQkjIGxvYWQgd2l0aCBkdW1wPworCWpuZQkubm9kdW1wCisKKwkjIHN0b3JlIGFsbCBwcmVmaXggcmVnaXN0ZXJzIGluIGNhc2Ugb2YgbG9hZCB3aXRoIGR1bXA6CisKKwlsYQklcjcsMAkJCSMgYmFzZSByZWdpc3RlciBmb3IgMCBwYWdlCisJbGEJJXI4LDAJCQkjIGZpcnN0IGNwdQorCWwJJXIxMSwuTHByZWZfYXJyX3B0ci0uTFBHMSglcjEzKQkjIGFkZHJlc3Mgb2YgcHJlZml4IGFycmF5CisJYWhpCSVyMTEsNAkJCSMgc2tpcCBib290IGNwdQorCWxyCSVyMTIsJXIxMQorCWFoaQklcjEyLChDT05GSUdfTlJfQ1BVUyo0KQkjIGVuZCBvZiBwcmVmaXggYXJyYXkKKwlzdGFwCS5MY3VycmVudF9jcHUrMi0uTFBHMSglcjEzKQkjIHN0b3JlIGN1cnJlbnQgY3B1IGFkZHIKKzE6CisJY2wJJXI4LC5MY3VycmVudF9jcHUtLkxQRzEoJXIxMykJIyBpcyBpcGwgY3B1ID8KKwlqZQk0ZgkJCQkjIGlmIHllcyBnZXQgbmV4dCBjcHUKKzI6CisJbHIJJXI5LCVyNworCXNpZ3AJJXI5LCVyOCwweDkJCSMgc3RvcCAmIHN0b3JlIHN0YXR1cyBvZiBjcHUKKwlicmMJOCwzZgkJCSMgYWNjZXB0ZWQKKwlicmMJNCw0ZgkJCSMgc3RhdHVzIHN0b3JlZDogbmV4dCBjcHUKKwlicmMJMiwyYgkJCSMgYnVzeTogCSB0cnkgYWdhaW4KKwlicmMJMSw0ZgkJCSMgbm90IG9wOgkgbmV4dCBjcHUKKzM6CisJbXZjCTAoNCwlcjExKSwyNjQoJXI3KQkjIGNvcHkgcHJlZml4IHJlZ2lzdGVyIHRvIHByZWZpeCBhcnJheQorCWFoaQklcjExLDQJCQkjIG5leHQgZWxlbWVudCBpbiBwcmVmaXggYXJyYXkKKwljbHIJJXIxMSwlcjEyCisJamUJNWYJCQkjIG5vIG1vcmUgc3BhY2UgaW4gcHJlZml4IGFycmF5Cis0OgorCWFoaQklcjgsMQkJCQkjIG5leHQgY3B1IChyOCArPSAxKQorCWNsCSVyOCwuTGxhc3RfY3B1LS5MUEcxKCVyMTMpCSMgaXMgbGFzdCBwb3NzaWJsZSBjcHUgPworCWpsCTFiCQkJCSMganVtcCBpZiBub3QgbGFzdCBjcHUKKzU6CisJbGhpCSVyMSwyCQkJIyBtb2RlIDIgPSBlc2FtZSAoZHVtcCkKKwlqCTZmCisJLmFsaWduIDQKKy5MaXBsX3NjaGliOgorCS5yZXB0IDEzCisJLmxvbmcgMAorCS5lbmRyCisubm9kdW1wOgorCWxoaQklcjEsMQkJCSMgbW9kZSAxID0gZXNhbWUgKG5vcm1hbCBpcGwpCis2OgorI2Vsc2UKKwlsaGkJJXIxLDEJCQkjIG1vZGUgMSA9IGVzYW1lIChub3JtYWwgaXBsKQorI2VuZGlmIC8qIENPTkZJR19aRkNQRFVNUCAqLwogCW12aQlfX0xDX0FSX01PREVfSUQsMQkjIHNldCBlc2FtZSBmbGFnCiAJc2xyCSVyMCwlcjAgCQkjIHNldCBjcHVpZCB0byB6ZXJvCiAJc2lncAklcjEsJXIwLDB4MTIJCSMgc3dpdGNoIHRvIGVzYW1lIG1vZGUKQEAgLTE0OSw2ICsyMTEsMTQgQEAKIC5MNG1hbGlnbjoucXVhZCAweGZmZmZmZmZmZmZjMDAwMDAKIC5Mc2NhbjJnOi5xdWFkCTB4ODAwMDAwMDAgKyAweDIwMDAwIC0gOAkjIDJHQiArIDEyOEsgLSA4CiAuTG5vcDoJLmxvbmcJMHgwNzAwMDcwMAorI2lmZGVmIENPTkZJR19aRkNQRFVNUAorLkxjdXJyZW50X2NwdToKKwkubG9uZyAweDAKKy5MbGFzdF9jcHU6CisJLmxvbmcgMHgwMDAwZmZmZgorLkxwcmVmX2Fycl9wdHI6CisJLmxvbmcgemZjcGR1bXBfcHJlZml4X2FycmF5CisjZW5kaWYgLyogQ09ORklHX1pGQ1BEVU1QICovCiAuTHBhcm1hZGRyOgogCS5xdWFkCVBBUk1BUkVBCiAJLmFsaWduCTY0CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2lwbC5jIGIvYXJjaC9zMzkwL2tlcm5lbC9pcGwuYwppbmRleCBmNzMxMTg1Li4wNjgzM2FjIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL2lwbC5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvaXBsLmMKQEAgLTI5LDM2ICsyOSwyMSBAQAogI2RlZmluZSBTQ0NCX0xPQURQQVJNICgmczM5MF9yZWFkaW5mb19zY2NiLmxvYWRwYXJtKQogI2RlZmluZSBTQ0NCX0ZMQUcgKHMzOTBfcmVhZGluZm9fc2NjYi5mbGFncykKIAotZW51bSBpcGxfdHlwZSB7Ci0JSVBMX1RZUEVfTk9ORQkgPSAxLAotCUlQTF9UWVBFX1VOS05PV04gPSAyLAotCUlQTF9UWVBFX0NDVwkgPSA0LAotCUlQTF9UWVBFX0ZDUAkgPSA4LAotCUlQTF9UWVBFX05TUwkgPSAxNiwKLX07Ci0KLSNkZWZpbmUgSVBMX05PTkVfU1RSCSAibm9uZSIKLSNkZWZpbmUgSVBMX1VOS05PV05fU1RSICAidW5rbm93biIKLSNkZWZpbmUgSVBMX0NDV19TVFIJICJjY3ciCi0jZGVmaW5lIElQTF9GQ1BfU1RSCSAiZmNwIgotI2RlZmluZSBJUExfTlNTX1NUUgkgIm5zcyIKLQotLyoKLSAqIE11c3QgYmUgaW4gZGF0YSBzZWN0aW9uIHNpbmNlIHRoZSBic3Mgc2VjdGlvbgotICogaXMgbm90IGNsZWFyZWQgd2hlbiB0aGVzZSBhcmUgYWNjZXNzZWQuCi0gKi8KLXUxNiBpcGxfZGV2bm8gX19hdHRyaWJ1dGVfXygoX19zZWN0aW9uX18oIi5kYXRhIikpKSA9IDA7Ci11MzIgaXBsX2ZsYWdzIF9fYXR0cmlidXRlX18oKF9fc2VjdGlvbl9fKCIuZGF0YSIpKSkgPSAwOworI2RlZmluZSBJUExfVU5LTk9XTl9TVFIJCSJ1bmtub3duIgorI2RlZmluZSBJUExfQ0NXX1NUUgkJImNjdyIKKyNkZWZpbmUgSVBMX0ZDUF9TVFIJCSJmY3AiCisjZGVmaW5lIElQTF9GQ1BfRFVNUF9TVFIJImZjcF9kdW1wIgorI2RlZmluZSBJUExfTlNTX1NUUgkJIm5zcyIKIAogc3RhdGljIGNoYXIgKmlwbF90eXBlX3N0cihlbnVtIGlwbF90eXBlIHR5cGUpCiB7CiAJc3dpdGNoICh0eXBlKSB7Ci0JY2FzZSBJUExfVFlQRV9OT05FOgotCQlyZXR1cm4gSVBMX05PTkVfU1RSOwogCWNhc2UgSVBMX1RZUEVfQ0NXOgogCQlyZXR1cm4gSVBMX0NDV19TVFI7CiAJY2FzZSBJUExfVFlQRV9GQ1A6CiAJCXJldHVybiBJUExfRkNQX1NUUjsKKwljYXNlIElQTF9UWVBFX0ZDUF9EVU1QOgorCQlyZXR1cm4gSVBMX0ZDUF9EVU1QX1NUUjsKIAljYXNlIElQTF9UWVBFX05TUzoKIAkJcmV0dXJuIElQTF9OU1NfU1RSOwogCWNhc2UgSVBMX1RZUEVfVU5LTk9XTjoKQEAgLTY3LDE1ICs1Miw1NSBAQAogCX0KIH0KIAorZW51bSBkdW1wX3R5cGUgeworCURVTVBfVFlQRV9OT05FCT0gMSwKKwlEVU1QX1RZUEVfQ0NXCT0gMiwKKwlEVU1QX1RZUEVfRkNQCT0gNCwKK307CisKKyNkZWZpbmUgRFVNUF9OT05FX1NUUgkgIm5vbmUiCisjZGVmaW5lIERVTVBfQ0NXX1NUUgkgImNjdyIKKyNkZWZpbmUgRFVNUF9GQ1BfU1RSCSAiZmNwIgorCitzdGF0aWMgY2hhciAqZHVtcF90eXBlX3N0cihlbnVtIGR1bXBfdHlwZSB0eXBlKQoreworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgRFVNUF9UWVBFX05PTkU6CisJCXJldHVybiBEVU1QX05PTkVfU1RSOworCWNhc2UgRFVNUF9UWVBFX0NDVzoKKwkJcmV0dXJuIERVTVBfQ0NXX1NUUjsKKwljYXNlIERVTVBfVFlQRV9GQ1A6CisJCXJldHVybiBEVU1QX0ZDUF9TVFI7CisJZGVmYXVsdDoKKwkJcmV0dXJuIE5VTEw7CisJfQorfQorCisvKgorICogTXVzdCBiZSBpbiBkYXRhIHNlY3Rpb24gc2luY2UgdGhlIGJzcyBzZWN0aW9uCisgKiBpcyBub3QgY2xlYXJlZCB3aGVuIHRoZXNlIGFyZSBhY2Nlc3NlZC4KKyAqLworc3RhdGljIHUxNiBpcGxfZGV2bm8gX19hdHRyaWJ1dGVfXygoX19zZWN0aW9uX18oIi5kYXRhIikpKSA9IDA7Cit1MzIgaXBsX2ZsYWdzIF9fYXR0cmlidXRlX18oKF9fc2VjdGlvbl9fKCIuZGF0YSIpKSkgPSAwOworCiBlbnVtIGlwbF9tZXRob2QgewotCUlQTF9NRVRIT0RfTk9ORSwKLQlJUExfTUVUSE9EX0NDV19DSU8sCi0JSVBMX01FVEhPRF9DQ1dfRElBRywKLQlJUExfTUVUSE9EX0NDV19WTSwKLQlJUExfTUVUSE9EX0ZDUF9ST19ESUFHLAotCUlQTF9NRVRIT0RfRkNQX1JXX0RJQUcsCi0JSVBMX01FVEhPRF9GQ1BfUk9fVk0sCi0JSVBMX01FVEhPRF9OU1MsCisJUkVJUExfTUVUSE9EX0NDV19DSU8sCisJUkVJUExfTUVUSE9EX0NDV19ESUFHLAorCVJFSVBMX01FVEhPRF9DQ1dfVk0sCisJUkVJUExfTUVUSE9EX0ZDUF9ST19ESUFHLAorCVJFSVBMX01FVEhPRF9GQ1BfUldfRElBRywKKwlSRUlQTF9NRVRIT0RfRkNQX1JPX1ZNLAorCVJFSVBMX01FVEhPRF9GQ1BfRFVNUCwKKwlSRUlQTF9NRVRIT0RfTlNTLAorCVJFSVBMX01FVEhPRF9ERUZBVUxULAorfTsKKworZW51bSBkdW1wX21ldGhvZCB7CisJRFVNUF9NRVRIT0RfTk9ORSwKKwlEVU1QX01FVEhPRF9DQ1dfQ0lPLAorCURVTVBfTUVUSE9EX0NDV19ESUFHLAorCURVTVBfTUVUSE9EX0NDV19WTSwKKwlEVU1QX01FVEhPRF9GQ1BfRElBRywKIH07CiAKIGVudW0gc2h1dGRvd25fYWN0aW9uIHsKQEAgLTEwNywxNSArMTMyLDE1IEBACiBzdGF0aWMgaW50IHJlaXBsX2NhcGFiaWxpdGllcyA9IElQTF9UWVBFX1VOS05PV047CiAKIHN0YXRpYyBlbnVtIGlwbF90eXBlIHJlaXBsX3R5cGUgPSBJUExfVFlQRV9VTktOT1dOOwotc3RhdGljIGVudW0gaXBsX21ldGhvZCByZWlwbF9tZXRob2QgPSBJUExfTUVUSE9EX05PTkU7CitzdGF0aWMgZW51bSBpcGxfbWV0aG9kIHJlaXBsX21ldGhvZCA9IFJFSVBMX01FVEhPRF9ERUZBVUxUOwogc3RhdGljIHN0cnVjdCBpcGxfcGFyYW1ldGVyX2Jsb2NrICpyZWlwbF9ibG9ja19mY3A7CiBzdGF0aWMgc3RydWN0IGlwbF9wYXJhbWV0ZXJfYmxvY2sgKnJlaXBsX2Jsb2NrX2NjdzsKIAogc3RhdGljIGNoYXIgcmVpcGxfbnNzX25hbWVbTlNTX05BTUVfU0laRSArIDFdOwogCi1zdGF0aWMgaW50IGR1bXBfY2FwYWJpbGl0aWVzID0gSVBMX1RZUEVfTk9ORTsKLXN0YXRpYyBlbnVtIGlwbF90eXBlIGR1bXBfdHlwZSA9IElQTF9UWVBFX05PTkU7Ci1zdGF0aWMgZW51bSBpcGxfbWV0aG9kIGR1bXBfbWV0aG9kID0gSVBMX01FVEhPRF9OT05FOworc3RhdGljIGludCBkdW1wX2NhcGFiaWxpdGllcyA9IERVTVBfVFlQRV9OT05FOworc3RhdGljIGVudW0gZHVtcF90eXBlIGR1bXBfdHlwZSA9IERVTVBfVFlQRV9OT05FOworc3RhdGljIGVudW0gZHVtcF9tZXRob2QgZHVtcF9tZXRob2QgPSBEVU1QX01FVEhPRF9OT05FOwogc3RhdGljIHN0cnVjdCBpcGxfcGFyYW1ldGVyX2Jsb2NrICpkdW1wX2Jsb2NrX2ZjcDsKIHN0YXRpYyBzdHJ1Y3QgaXBsX3BhcmFtZXRlcl9ibG9jayAqZHVtcF9ibG9ja19jY3c7CiAKQEAgLTEzNCw2ICsxNTksNyBAQAogCQk6ICJkIiAoc3ViY29kZSkgOiAiY2MiLCAibWVtb3J5Iik7CiAJcmV0dXJuIF9yYzsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGRpYWczMDgpOwogCiAvKiBTWVNGUyAqLwogCkBAIC0xOTcsNyArMjIzLDcgQEAKICAqIGlwbCBzZWN0aW9uCiAgKi8KIAotc3RhdGljIGVudW0gaXBsX3R5cGUgaXBsX2dldF90eXBlKHZvaWQpCitzdGF0aWMgX19pbml0IGVudW0gaXBsX3R5cGUgZ2V0X2lwbF90eXBlKHZvaWQpCiB7CiAJc3RydWN0IGlwbF9wYXJhbWV0ZXJfYmxvY2sgKmlwbCA9IElQTF9QQVJNQkxPQ0tfU1RBUlQ7CiAKQEAgLTIxMSwxMiArMjM3LDQ0IEBACiAJCXJldHVybiBJUExfVFlQRV9VTktOT1dOOwogCWlmIChpcGwtPmhkci5wYnQgIT0gRElBRzMwOF9JUExfVFlQRV9GQ1ApCiAJCXJldHVybiBJUExfVFlQRV9VTktOT1dOOworCWlmIChpcGwtPmlwbF9pbmZvLmZjcC5vcHQgPT0gRElBRzMwOF9JUExfT1BUX0RVTVApCisJCXJldHVybiBJUExfVFlQRV9GQ1BfRFVNUDsKIAlyZXR1cm4gSVBMX1RZUEVfRkNQOwogfQogCit2b2lkIF9faW5pdCBzZXR1cF9pcGxfaW5mbyh2b2lkKQoreworCWlwbF9pbmZvLnR5cGUgPSBnZXRfaXBsX3R5cGUoKTsKKwlzd2l0Y2ggKGlwbF9pbmZvLnR5cGUpIHsKKwljYXNlIElQTF9UWVBFX0NDVzoKKwkJaXBsX2luZm8uZGF0YS5jY3cuZGV2X2lkLmRldm5vID0gaXBsX2Rldm5vOworCQlpcGxfaW5mby5kYXRhLmNjdy5kZXZfaWQuc3NpZCA9IDA7CisJCWJyZWFrOworCWNhc2UgSVBMX1RZUEVfRkNQOgorCWNhc2UgSVBMX1RZUEVfRkNQX0RVTVA6CisJCWlwbF9pbmZvLmRhdGEuZmNwLmRldl9pZC5kZXZubyA9CisJCQlJUExfUEFSTUJMT0NLX1NUQVJULT5pcGxfaW5mby5mY3AuZGV2bm87CisJCWlwbF9pbmZvLmRhdGEuZmNwLmRldl9pZC5zc2lkID0gMDsKKwkJaXBsX2luZm8uZGF0YS5mY3Aud3dwbiA9IElQTF9QQVJNQkxPQ0tfU1RBUlQtPmlwbF9pbmZvLmZjcC53d3BuOworCQlpcGxfaW5mby5kYXRhLmZjcC5sdW4gPSBJUExfUEFSTUJMT0NLX1NUQVJULT5pcGxfaW5mby5mY3AubHVuOworCQlicmVhazsKKwljYXNlIElQTF9UWVBFX05TUzoKKwkJc3RybmNweShpcGxfaW5mby5kYXRhLm5zcy5uYW1lLCBrZXJuZWxfbnNzX25hbWUsCisJCQlzaXplb2YoaXBsX2luZm8uZGF0YS5uc3MubmFtZSkpOworCQlicmVhazsKKwljYXNlIElQTF9UWVBFX1VOS05PV046CisJZGVmYXVsdDoKKwkJLyogV2UgaGF2ZSBubyBpbmZvIHRvIGNvcHkgKi8KKwkJYnJlYWs7CisJfQorfQorCitzdHJ1Y3QgaXBsX2luZm8gaXBsX2luZm87CitFWFBPUlRfU1lNQk9MX0dQTChpcGxfaW5mbyk7CisKIHN0YXRpYyBzc2l6ZV90IGlwbF90eXBlX3Nob3coc3RydWN0IHN1YnN5c3RlbSAqc3Vic3lzLCBjaGFyICpwYWdlKQogewotCXJldHVybiBzcHJpbnRmKHBhZ2UsICIlc1xuIiwgaXBsX3R5cGVfc3RyKGlwbF9nZXRfdHlwZSgpKSk7CisJcmV0dXJuIHNwcmludGYocGFnZSwgIiVzXG4iLCBpcGxfdHlwZV9zdHIoaXBsX2luZm8udHlwZSkpOwogfQogCiBzdGF0aWMgc3RydWN0IHN1YnN5c19hdHRyaWJ1dGUgc3lzX2lwbF90eXBlX2F0dHIgPSBfX0FUVFJfUk8oaXBsX3R5cGUpOwpAQCAtMjI1LDEwICsyODMsMTEgQEAKIHsKIAlzdHJ1Y3QgaXBsX3BhcmFtZXRlcl9ibG9jayAqaXBsID0gSVBMX1BBUk1CTE9DS19TVEFSVDsKIAotCXN3aXRjaCAoaXBsX2dldF90eXBlKCkpIHsKKwlzd2l0Y2ggKGlwbF9pbmZvLnR5cGUpIHsKIAljYXNlIElQTF9UWVBFX0NDVzoKIAkJcmV0dXJuIHNwcmludGYocGFnZSwgIjAuMC4lMDR4XG4iLCBpcGxfZGV2bm8pOwogCWNhc2UgSVBMX1RZUEVfRkNQOgorCWNhc2UgSVBMX1RZUEVfRkNQX0RVTVA6CiAJCXJldHVybiBzcHJpbnRmKHBhZ2UsICIwLjAuJTA0eFxuIiwgaXBsLT5pcGxfaW5mby5mY3AuZGV2bm8pOwogCWRlZmF1bHQ6CiAJCXJldHVybiAwOwpAQCAtNDg1LDIzICs1NDQsMjkgQEAKIAlzd2l0Y2godHlwZSkgewogCWNhc2UgSVBMX1RZUEVfQ0NXOgogCQlpZiAoTUFDSElORV9JU19WTSkKLQkJCXJlaXBsX21ldGhvZCA9IElQTF9NRVRIT0RfQ0NXX1ZNOworCQkJcmVpcGxfbWV0aG9kID0gUkVJUExfTUVUSE9EX0NDV19WTTsKIAkJZWxzZQotCQkJcmVpcGxfbWV0aG9kID0gSVBMX01FVEhPRF9DQ1dfQ0lPOworCQkJcmVpcGxfbWV0aG9kID0gUkVJUExfTUVUSE9EX0NDV19DSU87CiAJCWJyZWFrOwogCWNhc2UgSVBMX1RZUEVfRkNQOgogCQlpZiAoZGlhZzMwOF9zZXRfd29ya3MpCi0JCQlyZWlwbF9tZXRob2QgPSBJUExfTUVUSE9EX0ZDUF9SV19ESUFHOworCQkJcmVpcGxfbWV0aG9kID0gUkVJUExfTUVUSE9EX0ZDUF9SV19ESUFHOwogCQllbHNlIGlmIChNQUNISU5FX0lTX1ZNKQotCQkJcmVpcGxfbWV0aG9kID0gSVBMX01FVEhPRF9GQ1BfUk9fVk07CisJCQlyZWlwbF9tZXRob2QgPSBSRUlQTF9NRVRIT0RfRkNQX1JPX1ZNOwogCQllbHNlCi0JCQlyZWlwbF9tZXRob2QgPSBJUExfTUVUSE9EX0ZDUF9ST19ESUFHOworCQkJcmVpcGxfbWV0aG9kID0gUkVJUExfTUVUSE9EX0ZDUF9ST19ESUFHOworCQlicmVhazsKKwljYXNlIElQTF9UWVBFX0ZDUF9EVU1QOgorCQlyZWlwbF9tZXRob2QgPSBSRUlQTF9NRVRIT0RfRkNQX0RVTVA7CiAJCWJyZWFrOwogCWNhc2UgSVBMX1RZUEVfTlNTOgotCQlyZWlwbF9tZXRob2QgPSBJUExfTUVUSE9EX05TUzsKKwkJcmVpcGxfbWV0aG9kID0gUkVJUExfTUVUSE9EX05TUzsKKwkJYnJlYWs7CisJY2FzZSBJUExfVFlQRV9VTktOT1dOOgorCQlyZWlwbF9tZXRob2QgPSBSRUlQTF9NRVRIT0RfREVGQVVMVDsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcmVpcGxfbWV0aG9kID0gSVBMX01FVEhPRF9OT05FOworCQlCVUcoKTsKIAl9CiAJcmVpcGxfdHlwZSA9IHR5cGU7CiAJcmV0dXJuIDA7CkBAIC01NzksMjIgKzY0NCwyMiBAQAogCiAvKiBkdW1wIHR5cGUgKi8KIAotc3RhdGljIGludCBkdW1wX3NldF90eXBlKGVudW0gaXBsX3R5cGUgdHlwZSkKK3N0YXRpYyBpbnQgZHVtcF9zZXRfdHlwZShlbnVtIGR1bXBfdHlwZSB0eXBlKQogewogCWlmICghKGR1bXBfY2FwYWJpbGl0aWVzICYgdHlwZSkpCiAJCXJldHVybiAtRUlOVkFMOwogCXN3aXRjaCh0eXBlKSB7Ci0JY2FzZSBJUExfVFlQRV9DQ1c6CisJY2FzZSBEVU1QX1RZUEVfQ0NXOgogCQlpZiAoTUFDSElORV9JU19WTSkKLQkJCWR1bXBfbWV0aG9kID0gSVBMX01FVEhPRF9DQ1dfVk07CisJCQlkdW1wX21ldGhvZCA9IERVTVBfTUVUSE9EX0NDV19WTTsKIAkJZWxzZQotCQkJZHVtcF9tZXRob2QgPSBJUExfTUVUSE9EX0NDV19DSU87CisJCQlkdW1wX21ldGhvZCA9IERVTVBfTUVUSE9EX0NDV19DSU87CiAJCWJyZWFrOwotCWNhc2UgSVBMX1RZUEVfRkNQOgotCQlkdW1wX21ldGhvZCA9IElQTF9NRVRIT0RfRkNQX1JXX0RJQUc7CisJY2FzZSBEVU1QX1RZUEVfRkNQOgorCQlkdW1wX21ldGhvZCA9IERVTVBfTUVUSE9EX0ZDUF9ESUFHOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlkdW1wX21ldGhvZCA9IElQTF9NRVRIT0RfTk9ORTsKKwkJZHVtcF9tZXRob2QgPSBEVU1QX01FVEhPRF9OT05FOwogCX0KIAlkdW1wX3R5cGUgPSB0eXBlOwogCXJldHVybiAwOwpAQCAtNjAyLDcgKzY2Nyw3IEBACiAKIHN0YXRpYyBzc2l6ZV90IGR1bXBfdHlwZV9zaG93KHN0cnVjdCBzdWJzeXN0ZW0gKnN1YnN5cywgY2hhciAqcGFnZSkKIHsKLQlyZXR1cm4gc3ByaW50ZihwYWdlLCAiJXNcbiIsIGlwbF90eXBlX3N0cihkdW1wX3R5cGUpKTsKKwlyZXR1cm4gc3ByaW50ZihwYWdlLCAiJXNcbiIsIGR1bXBfdHlwZV9zdHIoZHVtcF90eXBlKSk7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IGR1bXBfdHlwZV9zdG9yZShzdHJ1Y3Qgc3Vic3lzdGVtICpzdWJzeXMsIGNvbnN0IGNoYXIgKmJ1ZiwKQEAgLTYxMCwxMiArNjc1LDEyIEBACiB7CiAJaW50IHJjID0gLUVJTlZBTDsKIAotCWlmIChzdHJuY21wKGJ1ZiwgSVBMX05PTkVfU1RSLCBzdHJsZW4oSVBMX05PTkVfU1RSKSkgPT0gMCkKLQkJcmMgPSBkdW1wX3NldF90eXBlKElQTF9UWVBFX05PTkUpOwotCWVsc2UgaWYgKHN0cm5jbXAoYnVmLCBJUExfQ0NXX1NUUiwgc3RybGVuKElQTF9DQ1dfU1RSKSkgPT0gMCkKLQkJcmMgPSBkdW1wX3NldF90eXBlKElQTF9UWVBFX0NDVyk7Ci0JZWxzZSBpZiAoc3RybmNtcChidWYsIElQTF9GQ1BfU1RSLCBzdHJsZW4oSVBMX0ZDUF9TVFIpKSA9PSAwKQotCQlyYyA9IGR1bXBfc2V0X3R5cGUoSVBMX1RZUEVfRkNQKTsKKwlpZiAoc3RybmNtcChidWYsIERVTVBfTk9ORV9TVFIsIHN0cmxlbihEVU1QX05PTkVfU1RSKSkgPT0gMCkKKwkJcmMgPSBkdW1wX3NldF90eXBlKERVTVBfVFlQRV9OT05FKTsKKwllbHNlIGlmIChzdHJuY21wKGJ1ZiwgRFVNUF9DQ1dfU1RSLCBzdHJsZW4oRFVNUF9DQ1dfU1RSKSkgPT0gMCkKKwkJcmMgPSBkdW1wX3NldF90eXBlKERVTVBfVFlQRV9DQ1cpOworCWVsc2UgaWYgKHN0cm5jbXAoYnVmLCBEVU1QX0ZDUF9TVFIsIHN0cmxlbihEVU1QX0ZDUF9TVFIpKSA9PSAwKQorCQlyYyA9IGR1bXBfc2V0X3R5cGUoRFVNUF9UWVBFX0ZDUCk7CiAJcmV0dXJuIChyYyAhPSAwKSA/IHJjIDogbGVuOwogfQogCkBAIC02NjQsMTQgKzcyOSwxNCBAQAogCWNoYXIgbG9hZHBhcm1bTE9BRFBBUk1fTEVOICsgMV07CiAKIAlzd2l0Y2ggKHJlaXBsX21ldGhvZCkgewotCWNhc2UgSVBMX01FVEhPRF9DQ1dfQ0lPOgorCWNhc2UgUkVJUExfTUVUSE9EX0NDV19DSU86CiAJCWRldmlkLmRldm5vID0gcmVpcGxfYmxvY2tfY2N3LT5pcGxfaW5mby5jY3cuZGV2bm87Ci0JCWlmIChpcGxfZ2V0X3R5cGUoKSA9PSBJUExfVFlQRV9DQ1cgJiYgZGV2aWQuZGV2bm8gPT0gaXBsX2Rldm5vKQorCQlpZiAoaXBsX2luZm8udHlwZSA9PSBJUExfVFlQRV9DQ1cgJiYgZGV2aWQuZGV2bm8gPT0gaXBsX2Rldm5vKQogCQkJZGlhZzMwOChESUFHMzA4X0lQTCwgTlVMTCk7CiAJCWRldmlkLnNzaWQgID0gMDsKIAkJcmVpcGxfY2N3X2RldigmZGV2aWQpOwogCQlicmVhazsKLQljYXNlIElQTF9NRVRIT0RfQ0NXX1ZNOgorCWNhc2UgUkVJUExfTUVUSE9EX0NDV19WTToKIAkJcmVpcGxfZ2V0X2FzY2lpX2xvYWRwYXJtKGxvYWRwYXJtKTsKIAkJaWYgKHN0cmxlbihsb2FkcGFybSkgPT0gMCkKIAkJCXNwcmludGYoYnVmLCAiSVBMICVYIiwKQEAgLTY4MSwzMCArNzQ2LDMyIEBACiAJCQkJcmVpcGxfYmxvY2tfY2N3LT5pcGxfaW5mby5jY3cuZGV2bm8sIGxvYWRwYXJtKTsKIAkJX19jcGNtZChidWYsIE5VTEwsIDAsIE5VTEwpOwogCQlicmVhazsKLQljYXNlIElQTF9NRVRIT0RfQ0NXX0RJQUc6CisJY2FzZSBSRUlQTF9NRVRIT0RfQ0NXX0RJQUc6CiAJCWRpYWczMDgoRElBRzMwOF9TRVQsIHJlaXBsX2Jsb2NrX2Njdyk7CiAJCWRpYWczMDgoRElBRzMwOF9JUEwsIE5VTEwpOwogCQlicmVhazsKLQljYXNlIElQTF9NRVRIT0RfRkNQX1JXX0RJQUc6CisJY2FzZSBSRUlQTF9NRVRIT0RfRkNQX1JXX0RJQUc6CiAJCWRpYWczMDgoRElBRzMwOF9TRVQsIHJlaXBsX2Jsb2NrX2ZjcCk7CiAJCWRpYWczMDgoRElBRzMwOF9JUEwsIE5VTEwpOwogCQlicmVhazsKLQljYXNlIElQTF9NRVRIT0RfRkNQX1JPX0RJQUc6CisJY2FzZSBSRUlQTF9NRVRIT0RfRkNQX1JPX0RJQUc6CiAJCWRpYWczMDgoRElBRzMwOF9JUEwsIE5VTEwpOwogCQlicmVhazsKLQljYXNlIElQTF9NRVRIT0RfRkNQX1JPX1ZNOgorCWNhc2UgUkVJUExfTUVUSE9EX0ZDUF9ST19WTToKIAkJX19jcGNtZCgiSVBMIiwgTlVMTCwgMCwgTlVMTCk7CiAJCWJyZWFrOwotCWNhc2UgSVBMX01FVEhPRF9OU1M6CisJY2FzZSBSRUlQTF9NRVRIT0RfTlNTOgogCQlzcHJpbnRmKGJ1ZiwgIklQTCAlcyIsIHJlaXBsX25zc19uYW1lKTsKIAkJX19jcGNtZChidWYsIE5VTEwsIDAsIE5VTEwpOwogCQlicmVhazsKLQljYXNlIElQTF9NRVRIT0RfTk9ORToKLQlkZWZhdWx0OgorCWNhc2UgUkVJUExfTUVUSE9EX0RFRkFVTFQ6CiAJCWlmIChNQUNISU5FX0lTX1ZNKQogCQkJX19jcGNtZCgiSVBMIiwgTlVMTCwgMCwgTlVMTCk7CiAJCWRpYWczMDgoRElBRzMwOF9JUEwsIE5VTEwpOwogCQlicmVhazsKKwljYXNlIFJFSVBMX01FVEhPRF9GQ1BfRFVNUDoKKwlkZWZhdWx0OgorCQlicmVhazsKIAl9CiAJc2lnbmFsX3Byb2Nlc3NvcihzbXBfcHJvY2Vzc29yX2lkKCksIHNpZ3Bfc3RvcF9hbmRfc3RvcmVfc3RhdHVzKTsKIH0KQEAgLTcxNSwyOCArNzgyLDI4IEBACiAJc3RhdGljIGNoYXIgYnVmWzEwMF07CiAKIAlzd2l0Y2ggKGR1bXBfbWV0aG9kKSB7Ci0JY2FzZSBJUExfTUVUSE9EX0NDV19DSU86CisJY2FzZSBEVU1QX01FVEhPRF9DQ1dfQ0lPOgogCQlzbXBfc2VuZF9zdG9wKCk7CiAJCWRldmlkLmRldm5vID0gZHVtcF9ibG9ja19jY3ctPmlwbF9pbmZvLmNjdy5kZXZubzsKIAkJZGV2aWQuc3NpZCAgPSAwOwogCQlyZWlwbF9jY3dfZGV2KCZkZXZpZCk7CiAJCWJyZWFrOwotCWNhc2UgSVBMX01FVEhPRF9DQ1dfVk06CisJY2FzZSBEVU1QX01FVEhPRF9DQ1dfVk06CiAJCXNtcF9zZW5kX3N0b3AoKTsKIAkJc3ByaW50ZihidWYsICJTVE9SRSBTVEFUVVMiKTsKIAkJX19jcGNtZChidWYsIE5VTEwsIDAsIE5VTEwpOwogCQlzcHJpbnRmKGJ1ZiwgIklQTCAlWCIsIGR1bXBfYmxvY2tfY2N3LT5pcGxfaW5mby5jY3cuZGV2bm8pOwogCQlfX2NwY21kKGJ1ZiwgTlVMTCwgMCwgTlVMTCk7CiAJCWJyZWFrOwotCWNhc2UgSVBMX01FVEhPRF9DQ1dfRElBRzoKKwljYXNlIERVTVBfTUVUSE9EX0NDV19ESUFHOgogCQlkaWFnMzA4KERJQUczMDhfU0VULCBkdW1wX2Jsb2NrX2Njdyk7CiAJCWRpYWczMDgoRElBRzMwOF9EVU1QLCBOVUxMKTsKIAkJYnJlYWs7Ci0JY2FzZSBJUExfTUVUSE9EX0ZDUF9SV19ESUFHOgorCWNhc2UgRFVNUF9NRVRIT0RfRkNQX0RJQUc6CiAJCWRpYWczMDgoRElBRzMwOF9TRVQsIGR1bXBfYmxvY2tfZmNwKTsKIAkJZGlhZzMwOChESUFHMzA4X0RVTVAsIE5VTEwpOwogCQlicmVhazsKLQljYXNlIElQTF9NRVRIT0RfTk9ORToKKwljYXNlIERVTVBfTUVUSE9EX05PTkU6CiAJZGVmYXVsdDoKIAkJcmV0dXJuOwogCX0KQEAgLTc3NywxMiArODQ0LDEzIEBACiAJcmMgPSBmaXJtd2FyZV9yZWdpc3RlcigmaXBsX3N1YnN5cyk7CiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7Ci0Jc3dpdGNoIChpcGxfZ2V0X3R5cGUoKSkgeworCXN3aXRjaCAoaXBsX2luZm8udHlwZSkgewogCWNhc2UgSVBMX1RZUEVfQ0NXOgogCQlyYyA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmaXBsX3N1YnN5cy5rc2V0LmtvYmosCiAJCQkJCSZpcGxfY2N3X2F0dHJfZ3JvdXApOwogCQlicmVhazsKIAljYXNlIElQTF9UWVBFX0ZDUDoKKwljYXNlIElQTF9UWVBFX0ZDUF9EVU1QOgogCQlyYyA9IGlwbF9yZWdpc3Rlcl9mY3BfZmlsZXMoKTsKIAkJYnJlYWs7CiAJY2FzZSBJUExfVFlQRV9OU1M6CkBAIC04NTIsNyArOTIwLDcgQEAKIAkvKiBGSVhNRTogY2hlY2sgZm9yIGRpYWczMDhfc2V0X3dvcmtzIHdoZW4gZW5hYmxpbmcgZGlhZyBjY3cgcmVpcGwgKi8KIAlpZiAoIU1BQ0hJTkVfSVNfVk0pCiAJCXN5c19yZWlwbF9jY3dfbG9hZHBhcm1fYXR0ci5hdHRyLm1vZGUgPSBTX0lSVUdPOwotCWlmIChpcGxfZ2V0X3R5cGUoKSA9PSBJUExfVFlQRV9DQ1cpCisJaWYgKGlwbF9pbmZvLnR5cGUgPT0gSVBMX1RZUEVfQ0NXKQogCQlyZWlwbF9ibG9ja19jY3ctPmlwbF9pbmZvLmNjdy5kZXZubyA9IGlwbF9kZXZubzsKIAlyZWlwbF9jYXBhYmlsaXRpZXMgfD0gSVBMX1RZUEVfQ0NXOwogCXJldHVybiAwOwpAQCAtODYyLDkgKzkzMCw5IEBACiB7CiAJaW50IHJjOwogCi0JaWYgKCghZGlhZzMwOF9zZXRfd29ya3MpICYmIChpcGxfZ2V0X3R5cGUoKSAhPSBJUExfVFlQRV9GQ1ApKQorCWlmICgoIWRpYWczMDhfc2V0X3dvcmtzKSAmJiAoaXBsX2luZm8udHlwZSAhPSBJUExfVFlQRV9GQ1ApKQogCQlyZXR1cm4gMDsKLQlpZiAoKCFkaWFnMzA4X3NldF93b3JrcykgJiYgKGlwbF9nZXRfdHlwZSgpID09IElQTF9UWVBFX0ZDUCkpCisJaWYgKCghZGlhZzMwOF9zZXRfd29ya3MpICYmIChpcGxfaW5mby50eXBlID09IElQTF9UWVBFX0ZDUCkpCiAJCW1ha2VfYXR0cnNfcm8ocmVpcGxfZmNwX2F0dHJzKTsKIAogCXJlaXBsX2Jsb2NrX2ZjcCA9ICh2b2lkICopIGdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKQEAgLTg3NSw3ICs5NDMsNyBAQAogCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpcmVpcGxfYmxvY2tfZmNwKTsKIAkJcmV0dXJuIHJjOwogCX0KLQlpZiAoaXBsX2dldF90eXBlKCkgPT0gSVBMX1RZUEVfRkNQKSB7CisJaWYgKGlwbF9pbmZvLnR5cGUgPT0gSVBMX1RZUEVfRkNQKSB7CiAJCW1lbWNweShyZWlwbF9ibG9ja19mY3AsIElQTF9QQVJNQkxPQ0tfU1RBUlQsIFBBR0VfU0laRSk7CiAJfSBlbHNlIHsKIAkJcmVpcGxfYmxvY2tfZmNwLT5oZHIubGVuID0gSVBMX1BBUk1fQkxLX0ZDUF9MRU47CkBAIC05MDksNyArOTc3LDcgQEAKIAlyYyA9IHJlaXBsX25zc19pbml0KCk7CiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7Ci0JcmMgPSByZWlwbF9zZXRfdHlwZShpcGxfZ2V0X3R5cGUoKSk7CisJcmMgPSByZWlwbF9zZXRfdHlwZShpcGxfaW5mby50eXBlKTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIAlyZXR1cm4gMDsKQEAgLTkzMSw3ICs5OTksNyBAQAogCWR1bXBfYmxvY2tfY2N3LT5oZHIudmVyc2lvbiA9IElQTF9QQVJNX0JMT0NLX1ZFUlNJT047CiAJZHVtcF9ibG9ja19jY3ctPmhkci5ibGswX2xlbiA9IElQTF9QQVJNX0JMSzBfQ0NXX0xFTjsKIAlkdW1wX2Jsb2NrX2Njdy0+aGRyLnBidCA9IERJQUczMDhfSVBMX1RZUEVfQ0NXOwotCWR1bXBfY2FwYWJpbGl0aWVzIHw9IElQTF9UWVBFX0NDVzsKKwlkdW1wX2NhcGFiaWxpdGllcyB8PSBEVU1QX1RZUEVfQ0NXOwogCXJldHVybiAwOwogfQogCkBAIC05NTYsNyArMTAyNCw3IEBACiAJZHVtcF9ibG9ja19mY3AtPmhkci5ibGswX2xlbiA9IElQTF9QQVJNX0JMSzBfRkNQX0xFTjsKIAlkdW1wX2Jsb2NrX2ZjcC0+aGRyLnBidCA9IERJQUczMDhfSVBMX1RZUEVfRkNQOwogCWR1bXBfYmxvY2tfZmNwLT5pcGxfaW5mby5mY3Aub3B0ID0gRElBRzMwOF9JUExfT1BUX0RVTVA7Ci0JZHVtcF9jYXBhYmlsaXRpZXMgfD0gSVBMX1RZUEVfRkNQOworCWR1bXBfY2FwYWJpbGl0aWVzIHw9IERVTVBfVFlQRV9GQ1A7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTk5NSw3ICsxMDYzLDcgQEAKIAlyYyA9IGR1bXBfZmNwX2luaXQoKTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKLQlkdW1wX3NldF90eXBlKElQTF9UWVBFX05PTkUpOworCWR1bXBfc2V0X3R5cGUoRFVNUF9UWVBFX05PTkUpOwogCXJldHVybiAwOwogfQogCkBAIC0xMDM4LDYgKzExMDYsMjcgQEAKIAogX19pbml0Y2FsbChzMzkwX2lwbF9pbml0KTsKIAordm9pZCBfX2luaXQgaXBsX3NhdmVfcGFyYW1ldGVycyh2b2lkKQoreworCXN0cnVjdCBjaW9faXBsaW5mbyBpcGxpbmZvOworCXVuc2lnbmVkIGludCAqaXBsX3B0cjsKKwl2b2lkICpzcmMsICpkc3Q7CisKKwlpZiAoY2lvX2dldF9pcGxpbmZvKCZpcGxpbmZvKSkKKwkJcmV0dXJuOworCisJaXBsX2Rldm5vID0gaXBsaW5mby5kZXZubzsKKwlpcGxfZmxhZ3MgfD0gSVBMX0RFVk5PX1ZBTElEOworCWlmICghaXBsaW5mby5pc19xZGlvKQorCQlyZXR1cm47CisJaXBsX2ZsYWdzIHw9IElQTF9QQVJNQkxPQ0tfVkFMSUQ7CisJaXBsX3B0ciA9ICh1bnNpZ25lZCBpbnQgKilfX0xDX0lQTF9QQVJNQkxPQ0tfUFRSOworCXNyYyA9ICh2b2lkICopKHVuc2lnbmVkIGxvbmcpKmlwbF9wdHI7CisJZHN0ID0gKHZvaWQgKilJUExfUEFSTUJMT0NLX09SSUdJTjsKKwltZW1tb3ZlKGRzdCwgc3JjLCBQQUdFX1NJWkUpOworCSppcGxfcHRyID0gSVBMX1BBUk1CTE9DS19PUklHSU47Cit9CisKIHN0YXRpYyBMSVNUX0hFQUQocmNhbGwpOwogc3RhdGljIERFRklORV9NVVRFWChyY2FsbF9tdXRleCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwva3Byb2Jlcy5jIGIvYXJjaC9zMzkwL2tlcm5lbC9rcHJvYmVzLmMKaW5kZXggOTkzZjM1My4uMjNjNjFmNiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9rcHJvYmVzLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9rcHJvYmVzLmMKQEAgLTUxNiw3ICs1MTYsNyBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgaW50IF9fa3Byb2JlcyBrcHJvYmVfZmF1bHRfaGFuZGxlcihzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IHRyYXBucikKK2ludCBfX2twcm9iZXMga3Byb2JlX2ZhdWx0X2hhbmRsZXIoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGludCB0cmFwbnIpCiB7CiAJc3RydWN0IGtwcm9iZSAqY3VyID0ga3Byb2JlX3J1bm5pbmcoKTsKIAlzdHJ1Y3Qga3Byb2JlX2N0bGJsayAqa2NiID0gZ2V0X2twcm9iZV9jdGxibGsoKTsKQEAgLTYwMyw3ICs2MDMsNiBAQAogCQkJcmV0ID0gTk9USUZZX1NUT1A7CiAJCWJyZWFrOwogCWNhc2UgRElFX1RSQVA6Ci0JY2FzZSBESUVfUEFHRV9GQVVMVDoKIAkJLyoga3Byb2JlX3J1bm5pbmcoKSBuZWVkcyBzbXBfcHJvY2Vzc29yX2lkKCkgKi8KIAkJcHJlZW1wdF9kaXNhYmxlKCk7CiAJCWlmIChrcHJvYmVfcnVubmluZygpICYmCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL21vZHVsZS5jIGIvYXJjaC9zMzkwL2tlcm5lbC9tb2R1bGUuYwppbmRleCAzOWQxZGQ3Li41OWI0ZTc5IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL21vZHVsZS5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvbW9kdWxlLmMKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGVsb2FkZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9idWcuaD4KIAogI2lmIDAKICNkZWZpbmUgREVCVUdQIHByaW50awpAQCAtMzk4LDkgKzM5OSwxMCBAQAogCQkgICAgc3RydWN0IG1vZHVsZSAqbWUpCiB7CiAJdmZyZWUobWUtPmFyY2guc3ltaW5mbyk7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIG1vZHVsZV9idWdfZmluYWxpemUoaGRyLCBzZWNoZHJzLCBtZSk7CiB9CiAKIHZvaWQgbW9kdWxlX2FyY2hfY2xlYW51cChzdHJ1Y3QgbW9kdWxlICptb2QpCiB7CisJbW9kdWxlX2J1Z19jbGVhbnVwKG1vZCk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvczM5MC9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IDVhY2ZhYzYuLjExZDliMDEgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvcHJvY2Vzcy5jCkBAIC0yODAsMjQgKzI4MCwyNiBAQAogICAgICAgICByZXR1cm4gMDsKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5c19mb3JrKHN0cnVjdCBwdF9yZWdzIHJlZ3MpCithc21saW5rYWdlIGxvbmcgc3lzX2Zvcmsodm9pZCkKIHsKLQlyZXR1cm4gZG9fZm9yayhTSUdDSExELCByZWdzLmdwcnNbMTVdLCAmcmVncywgMCwgTlVMTCwgTlVMTCk7CisJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSB0YXNrX3B0X3JlZ3MoY3VycmVudCk7CisJcmV0dXJuIGRvX2ZvcmsoU0lHQ0hMRCwgcmVncy0+Z3Byc1sxNV0sIHJlZ3MsIDAsIE5VTEwsIE5VTEwpOwogfQogCi1hc21saW5rYWdlIGxvbmcgc3lzX2Nsb25lKHN0cnVjdCBwdF9yZWdzIHJlZ3MpCithc21saW5rYWdlIGxvbmcgc3lzX2Nsb25lKHZvaWQpCiB7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgY2xvbmVfZmxhZ3M7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgbmV3c3A7CisJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSB0YXNrX3B0X3JlZ3MoY3VycmVudCk7CisJdW5zaWduZWQgbG9uZyBjbG9uZV9mbGFnczsKKwl1bnNpZ25lZCBsb25nIG5ld3NwOwogCWludCBfX3VzZXIgKnBhcmVudF90aWRwdHIsICpjaGlsZF90aWRwdHI7CiAKLSAgICAgICAgY2xvbmVfZmxhZ3MgPSByZWdzLmdwcnNbM107Ci0gICAgICAgIG5ld3NwID0gcmVncy5vcmlnX2dwcjI7Ci0JcGFyZW50X3RpZHB0ciA9IChpbnQgX191c2VyICopIHJlZ3MuZ3Byc1s0XTsKLQljaGlsZF90aWRwdHIgPSAoaW50IF9fdXNlciAqKSByZWdzLmdwcnNbNV07Ci0gICAgICAgIGlmICghbmV3c3ApCi0gICAgICAgICAgICAgICAgbmV3c3AgPSByZWdzLmdwcnNbMTVdOwotICAgICAgICByZXR1cm4gZG9fZm9yayhjbG9uZV9mbGFncywgbmV3c3AsICZyZWdzLCAwLAorCWNsb25lX2ZsYWdzID0gcmVncy0+Z3Byc1szXTsKKwluZXdzcCA9IHJlZ3MtPm9yaWdfZ3ByMjsKKwlwYXJlbnRfdGlkcHRyID0gKGludCBfX3VzZXIgKikgcmVncy0+Z3Byc1s0XTsKKwljaGlsZF90aWRwdHIgPSAoaW50IF9fdXNlciAqKSByZWdzLT5ncHJzWzVdOworCWlmICghbmV3c3ApCisJCW5ld3NwID0gcmVncy0+Z3Byc1sxNV07CisJcmV0dXJuIGRvX2ZvcmsoY2xvbmVfZmxhZ3MsIG5ld3NwLCByZWdzLCAwLAogCQkgICAgICAgcGFyZW50X3RpZHB0ciwgY2hpbGRfdGlkcHRyKTsKIH0KIApAQCAtMzExLDQwICszMTMsNTIgQEAKICAqIGRvIG5vdCBoYXZlIGVub3VnaCBjYWxsLWNsb2JiZXJlZCByZWdpc3RlcnMgdG8gaG9sZCBhbGwKICAqIHRoZSBpbmZvcm1hdGlvbiB5b3UgbmVlZC4KICAqLwotYXNtbGlua2FnZSBsb25nIHN5c192Zm9yayhzdHJ1Y3QgcHRfcmVncyByZWdzKQorYXNtbGlua2FnZSBsb25nIHN5c192Zm9yayh2b2lkKQogeworCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gdGFza19wdF9yZWdzKGN1cnJlbnQpOwogCXJldHVybiBkb19mb3JrKENMT05FX1ZGT1JLIHwgQ0xPTkVfVk0gfCBTSUdDSExELAotCQkgICAgICAgcmVncy5ncHJzWzE1XSwgJnJlZ3MsIDAsIE5VTEwsIE5VTEwpOworCQkgICAgICAgcmVncy0+Z3Byc1sxNV0sIHJlZ3MsIDAsIE5VTEwsIE5VTEwpOworfQorCithc21saW5rYWdlIHZvaWQgZXhlY3ZlX3RhaWwodm9pZCkKK3sKKwl0YXNrX2xvY2soY3VycmVudCk7CisJY3VycmVudC0+cHRyYWNlICY9IH5QVF9EVFJBQ0U7CisJdGFza191bmxvY2soY3VycmVudCk7CisJY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnBjID0gMDsKKwlpZiAoTUFDSElORV9IQVNfSUVFRSkKKwkJYXNtIHZvbGF0aWxlKCJzZnBjICUwLCUwIiA6IDogImQiICgwKSk7CiB9CiAKIC8qCiAgKiBzeXNfZXhlY3ZlKCkgZXhlY3V0ZXMgYSBuZXcgcHJvZ3JhbS4KICAqLwotYXNtbGlua2FnZSBsb25nIHN5c19leGVjdmUoc3RydWN0IHB0X3JlZ3MgcmVncykKK2FzbWxpbmthZ2UgbG9uZyBzeXNfZXhlY3ZlKHZvaWQpCiB7Ci0gICAgICAgIGludCBlcnJvcjsKLSAgICAgICAgY2hhciAqIGZpbGVuYW1lOworCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gdGFza19wdF9yZWdzKGN1cnJlbnQpOworCWNoYXIgKmZpbGVuYW1lOworCXVuc2lnbmVkIGxvbmcgcmVzdWx0OworCWludCByYzsKIAotICAgICAgICBmaWxlbmFtZSA9IGdldG5hbWUoKGNoYXIgX191c2VyICopIHJlZ3Mub3JpZ19ncHIyKTsKLSAgICAgICAgZXJyb3IgPSBQVFJfRVJSKGZpbGVuYW1lKTsKLSAgICAgICAgaWYgKElTX0VSUihmaWxlbmFtZSkpCi0gICAgICAgICAgICAgICAgZ290byBvdXQ7Ci0gICAgICAgIGVycm9yID0gZG9fZXhlY3ZlKGZpbGVuYW1lLCAoY2hhciBfX3VzZXIgKiBfX3VzZXIgKikgcmVncy5ncHJzWzNdLAotCQkJICAoY2hhciBfX3VzZXIgKiBfX3VzZXIgKikgcmVncy5ncHJzWzRdLCAmcmVncyk7Ci0JaWYgKGVycm9yID09IDApIHsKLQkJdGFza19sb2NrKGN1cnJlbnQpOwotCQljdXJyZW50LT5wdHJhY2UgJj0gflBUX0RUUkFDRTsKLQkJdGFza191bmxvY2soY3VycmVudCk7Ci0JCWN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwYyA9IDA7Ci0JCWlmIChNQUNISU5FX0hBU19JRUVFKQotCQkJYXNtIHZvbGF0aWxlKCJzZnBjICUwLCUwIiA6IDogImQiICgwKSk7CisJZmlsZW5hbWUgPSBnZXRuYW1lKChjaGFyIF9fdXNlciAqKSByZWdzLT5vcmlnX2dwcjIpOworCWlmIChJU19FUlIoZmlsZW5hbWUpKSB7CisJCXJlc3VsdCA9IFBUUl9FUlIoZmlsZW5hbWUpOworCQlnb3RvIG91dDsKIAl9Ci0gICAgICAgIHB1dG5hbWUoZmlsZW5hbWUpOworCXJjID0gZG9fZXhlY3ZlKGZpbGVuYW1lLCAoY2hhciBfX3VzZXIgKiBfX3VzZXIgKikgcmVncy0+Z3Byc1szXSwKKwkJICAgICAgIChjaGFyIF9fdXNlciAqIF9fdXNlciAqKSByZWdzLT5ncHJzWzRdLCByZWdzKTsKKwlpZiAocmMpIHsKKwkJcmVzdWx0ID0gcmM7CisJCWdvdG8gb3V0X3B1dG5hbWU7CisJfQorCWV4ZWN2ZV90YWlsKCk7CisJcmVzdWx0ID0gcmVncy0+Z3Byc1syXTsKK291dF9wdXRuYW1lOgorCXB1dG5hbWUoZmlsZW5hbWUpOwogb3V0OgotICAgICAgICByZXR1cm4gZXJyb3I7CisJcmV0dXJuIHJlc3VsdDsKIH0KIAotCiAvKgogICogZmlsbCBpbiB0aGUgRlBVIHN0cnVjdHVyZSBmb3IgYSBjb3JlIGR1bXAuCiAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvczM5MC9rZXJuZWwvc2V0dXAuYwppbmRleCA4NjNjOGQwLi42YmZiMDg4IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9zZXR1cC5jCkBAIC02NSw3ICs2NSw3IEBACiAgKiBVc2VyIGNvcHkgb3BlcmF0aW9ucy4KICAqLwogc3RydWN0IHVhY2Nlc3Nfb3BzIHVhY2Nlc3M7Ci1FWFBPUlRfU1lNQk9MX0dQTCh1YWNjZXNzKTsKK0VYUE9SVF9TWU1CT0wodWFjY2Vzcyk7CiAKIC8qCiAgKiBNYWNoaW5lIHNldHVwLi4KQEAgLTc0LDYgKzc0LDggQEAKIHVuc2lnbmVkIGludCBjb25zb2xlX2Rldm5vID0gLTE7CiB1bnNpZ25lZCBpbnQgY29uc29sZV9pcnEgPSAtMTsKIHVuc2lnbmVkIGxvbmcgbWFjaGluZV9mbGFncyA9IDA7Cit1bnNpZ25lZCBsb25nIGVsZl9od2NhcCA9IDA7CitjaGFyIGVsZl9wbGF0Zm9ybVtFTEZfUExBVEZPUk1fU0laRV07CiAKIHN0cnVjdCBtZW1fY2h1bmsgX19pbml0ZGF0YSBtZW1vcnlfY2h1bmtbTUVNT1JZX0NIVU5LU107CiB2b2xhdGlsZSBpbnQgX19jcHVfbG9naWNhbF9tYXBbTlJfQ1BVU107IC8qIGxvZ2ljYWwgY3B1IHRvIGNwdSBhZGRyZXNzICovCkBAIC0yODUsNiArMjg3LDI2IEBACiAJfQogfQogCisjaWYgZGVmaW5lZChDT05GSUdfWkZDUERVTVApIHx8IGRlZmluZWQoQ09ORklHX1pGQ1BEVU1QX01PRFVMRSkKK3N0YXRpYyB2b2lkIF9faW5pdCBzZXR1cF96ZmNwZHVtcCh1bnNpZ25lZCBpbnQgY29uc29sZV9kZXZubykKK3sKKwlzdGF0aWMgY2hhciBzdHJbNjRdOworCisJaWYgKGlwbF9pbmZvLnR5cGUgIT0gSVBMX1RZUEVfRkNQX0RVTVApCisJCXJldHVybjsKKwlpZiAoY29uc29sZV9kZXZubyAhPSAtMSkKKwkJc3ByaW50ZihzdHIsICJjaW9faWdub3JlPWFsbCwhMC4wLiUwNHgsITAuMC4lMDR4IiwKKwkJCWlwbF9pbmZvLmRhdGEuZmNwLmRldl9pZC5kZXZubywgY29uc29sZV9kZXZubyk7CisJZWxzZQorCQlzcHJpbnRmKHN0ciwgImNpb19pZ25vcmU9YWxsLCEwLjAuJTA0eCIsCisJCQlpcGxfaW5mby5kYXRhLmZjcC5kZXZfaWQuZGV2bm8pOworCXN0cmNhdChDT01NQU5EX0xJTkUsIHN0cik7CisJY29uc29sZV9sb2dsZXZlbCA9IDI7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIHNldHVwX3pmY3BkdW1wKHVuc2lnbmVkIGludCBjb25zb2xlX2Rldm5vKSB7fQorI2VuZGlmIC8qIENPTkZJR19aRkNQRFVNUCAqLworCiAjaWZkZWYgQ09ORklHX1NNUAogdm9pZCAoKl9tYWNoaW5lX3Jlc3RhcnQpKGNoYXIgKmNvbW1hbmQpID0gbWFjaGluZV9yZXN0YXJ0X3NtcDsKIHZvaWQgKCpfbWFjaGluZV9oYWx0KSh2b2lkKSA9IG1hY2hpbmVfaGFsdF9zbXA7CkBAIC01ODYsMTMgKzYwOCwyMCBAQAogCX0KIH0KIAordW5zaWduZWQgbG9uZyByZWFsX21lbW9yeV9zaXplOworRVhQT1JUX1NZTUJPTF9HUEwocmVhbF9tZW1vcnlfc2l6ZSk7CisKIHN0YXRpYyB2b2lkIF9faW5pdCBzZXR1cF9tZW1vcnlfZW5kKHZvaWQpCiB7Ci0JdW5zaWduZWQgbG9uZyByZWFsX3NpemUsIG1lbW9yeV9zaXplOworCXVuc2lnbmVkIGxvbmcgbWVtb3J5X3NpemU7CiAJdW5zaWduZWQgbG9uZyBtYXhfbWVtLCBtYXhfcGh5czsKIAlpbnQgaTsKIAotCW1lbW9yeV9zaXplID0gcmVhbF9zaXplID0gMDsKKyNpZiBkZWZpbmVkKENPTkZJR19aRkNQRFVNUCkgfHwgZGVmaW5lZChDT05GSUdfWkZDUERVTVBfTU9EVUxFKQorCWlmIChpcGxfaW5mby50eXBlID09IElQTF9UWVBFX0ZDUF9EVU1QKQorCQltZW1vcnlfZW5kID0gWkZDUERVTVBfSFNBX1NJWkU7CisjZW5kaWYKKwltZW1vcnlfc2l6ZSA9IDA7CiAJbWF4X3BoeXMgPSBWTUFMTE9DX0VORF9JTklUIC0gVk1BTExPQ19NSU5fU0laRTsKIAltZW1vcnlfZW5kICY9IFBBR0VfTUFTSzsKIApAQCAtNjAxLDcgKzYzMCw4IEBACiAJZm9yIChpID0gMDsgaSA8IE1FTU9SWV9DSFVOS1M7IGkrKykgewogCQlzdHJ1Y3QgbWVtX2NodW5rICpjaHVuayA9ICZtZW1vcnlfY2h1bmtbaV07CiAKLQkJcmVhbF9zaXplID0gbWF4KHJlYWxfc2l6ZSwgY2h1bmstPmFkZHIgKyBjaHVuay0+c2l6ZSk7CisJCXJlYWxfbWVtb3J5X3NpemUgPSBtYXgocmVhbF9tZW1vcnlfc2l6ZSwKKwkJCQkgICAgICAgY2h1bmstPmFkZHIgKyBjaHVuay0+c2l6ZSk7CiAJCWlmIChjaHVuay0+YWRkciA+PSBtYXhfbWVtKSB7CiAJCQltZW1zZXQoY2h1bmssIDAsIHNpemVvZigqY2h1bmspKTsKIAkJCWNvbnRpbnVlOwpAQCAtNzIxLDYgKzc1MSw5OCBAQAogI2VuZGlmCiB9CiAKK3N0YXRpYyBfX2luaXQgdW5zaWduZWQgaW50IHN0Zmwodm9pZCkKK3sKKwlhc20gdm9sYXRpbGUoCisJCSIJLmluc24JcywweGIyYjEwMDAwLDAoMClcbiIgLyogc3RmbCAqLworCQkiMDpcbiIKKwkJRVhfVEFCTEUoMGIsMGIpKTsKKwlyZXR1cm4gUzM5MF9sb3djb3JlLnN0ZmxfZmFjX2xpc3Q7Cit9CisKK3N0YXRpYyBfX2luaXQgaW50IHN0ZmxlKHVuc2lnbmVkIGxvbmcgbG9uZyAqbGlzdCwgaW50IGRvdWJsZXdvcmRzKQoreworCXR5cGVkZWYgc3RydWN0IHsgdW5zaWduZWQgbG9uZyBsb25nIF9bZG91Ymxld29yZHNdOyB9IGFkZHJ0eXBlOworCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgX19uciBhc20oIjAiKSA9IGRvdWJsZXdvcmRzIC0gMTsKKworCWFzbSB2b2xhdGlsZSgiLmluc24gcywweGIyYjAwMDAwLCUwIiAvKiBzdGZsZSAqLworCQkgICAgIDogIj1tIiAoKihhZGRydHlwZSAqKSBsaXN0KSwgIitkIiAoX19ucikgOiA6ICJjYyIpOworCXJldHVybiBfX25yICsgMTsKK30KKworLyoKKyAqIFNldHVwIGhhcmR3YXJlIGNhcGFiaWxpdGllcy4KKyAqLworc3RhdGljIHZvaWQgX19pbml0IHNldHVwX2h3Y2Fwcyh2b2lkKQoreworCXN0YXRpYyBjb25zdCBpbnQgc3RmbF9iaXRzWzZdID0geyAwLCAyLCA3LCAxNywgMTksIDIxIH07CisJc3RydWN0IGNwdWluZm9fUzM5MCAqY3B1aW5mbyA9ICZTMzkwX2xvd2NvcmUuY3B1X2RhdGE7CisJdW5zaWduZWQgbG9uZyBsb25nIGZhY2lsaXR5X2xpc3RfZXh0ZW5kZWQ7CisJdW5zaWduZWQgaW50IGZhY2lsaXR5X2xpc3Q7CisJaW50IGk7CisKKwlmYWNpbGl0eV9saXN0ID0gc3RmbCgpOworCS8qCisJICogVGhlIHN0b3JlIGZhY2lsaXR5IGxpc3QgYml0cyBudW1iZXJzIGFzIGZvdW5kIGluIHRoZSBwcmluY2lwbGVzCisJICogb2Ygb3BlcmF0aW9uIGFyZSBudW1iZXJlZCB3aXRoIGJpdCAxVUw8PDMxIGFzIG51bWJlciAwIHRvCisJICogYml0IDFVTDw8MCBhcyBudW1iZXIgMzEuCisJICogICBCaXQgMDogaW5zdHJ1Y3Rpb25zIG5hbWVkIE4zLCAiYmFja3BvcnRlZCIgdG8gZXNhLW1vZGUKKwkgKiAgIEJpdCAyOiB6L0FyY2hpdGVjdHVyZSBtb2RlIGlzIGFjdGl2ZQorCSAqICAgQml0IDc6IHRoZSBzdG9yZS1mYWNpbGl0eS1saXN0LWV4dGVuZGVkIGZhY2lsaXR5IGlzIGluc3RhbGxlZAorCSAqICAgQml0IDE3OiB0aGUgbWVzc2FnZS1zZWN1cml0eSBhc3Npc3QgaXMgaW5zdGFsbGVkCisJICogICBCaXQgMTk6IHRoZSBsb25nLWRpc3BsYWNlbWVudCBmYWNpbGl0eSBpcyBpbnN0YWxsZWQKKwkgKiAgIEJpdCAyMTogdGhlIGV4dGVuZGVkLWltbWVkaWF0ZSBmYWNpbGl0eSBpcyBpbnN0YWxsZWQKKwkgKiBUaGVzZSBnZXQgdHJhbnNsYXRlZCB0bzoKKwkgKiAgIEhXQ0FQX1MzOTBfRVNBTjMgYml0IDAsIEhXQ0FQX1MzOTBfWkFSQ0ggYml0IDEsCisJICogICBIV0NBUF9TMzkwX1NURkxFIGJpdCAyLCBIV0NBUF9TMzkwX01TQSBiaXQgMywKKwkgKiAgIEhXQ0FQX1MzOTBfTERJU1AgYml0IDQsIGFuZCBIV0NBUF9TMzkwX0VJTU0gYml0IDUuCisJICovCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJaWYgKGZhY2lsaXR5X2xpc3QgJiAoMVVMIDw8ICgzMSAtIHN0ZmxfYml0c1tpXSkpKQorCQkJZWxmX2h3Y2FwIHw9IDFVTCA8PCBpOworCisJLyoKKwkgKiBDaGVjayBmb3IgYWRkaXRpb25hbCBmYWNpbGl0aWVzIHdpdGggc3RvcmUtZmFjaWxpdHktbGlzdC1leHRlbmRlZC4KKwkgKiBzdGZsZSBzdG9yZXMgZG91Ymxld29yZHMgKDggYnl0ZSkgd2l0aCBiaXQgMVVMTDw8NjMgYXMgYml0IDAKKwkgKiBhbmQgMVVMTDw8MCBhcyBiaXQgNjMuIEJpdHMgMC0zMSBjb250YWluIHRoZSBzYW1lIGluZm9ybWF0aW9uCisJICogYXMgc3RvcmVkIGJ5IHN0ZmwsIGJpdHMgMzIteHh4IGNvbnRhaW4gYWRkaXRpb25hbCBmYWNpbGl0aWVzLgorCSAqIEhvdyBtYW55IGZhY2lsaXR5IHdvcmRzIGFyZSBzdG9yZWQgZGVwZW5kcyBvbiB0aGUgbnVtYmVyIG9mCisJICogZG91Ymxld29yZHMgcGFzc2VkIHRvIHRoZSBpbnN0cnVjdGlvbi4gVGhlIGFkZGl0aW9uYWwgZmFjaWxpdGVzCisJICogYXJlOgorCSAqICAgQml0IDQzOiBkZWNpbWFsIGZsb2F0aW5nIHBvaW50IGZhY2lsaXR5IGlzIGluc3RhbGxlZAorCSAqIHRyYW5zbGF0ZWQgdG86CisJICogICBIV0NBUF9TMzkwX0RGUCBiaXQgNi4KKwkgKi8KKwlpZiAoKGVsZl9od2NhcCAmICgxVUwgPDwgMikpICYmCisJICAgIHN0ZmxlKCZmYWNpbGl0eV9saXN0X2V4dGVuZGVkLCAxKSA+IDApIHsKKwkJaWYgKGZhY2lsaXR5X2xpc3RfZXh0ZW5kZWQgJiAoMVVMTCA8PCAoNjQgLSA0MykpKQorCQkJZWxmX2h3Y2FwIHw9IDFVTCA8PCA2OworCX0KKworCXN3aXRjaCAoY3B1aW5mby0+Y3B1X2lkLm1hY2hpbmUpIHsKKwljYXNlIDB4OTY3MjoKKyNpZiAhZGVmaW5lZChDT05GSUdfNjRCSVQpCisJZGVmYXVsdDoJLyogVXNlICJnNSIgYXMgZGVmYXVsdCBmb3IgMzEgYml0IGtlcm5lbHMuICovCisjZW5kaWYKKwkJc3RyY3B5KGVsZl9wbGF0Zm9ybSwgImc1Iik7CisJCWJyZWFrOworCWNhc2UgMHgyMDY0OgorCWNhc2UgMHgyMDY2OgorI2lmIGRlZmluZWQoQ09ORklHXzY0QklUKQorCWRlZmF1bHQ6CS8qIFVzZSAiejkwMCIgYXMgZGVmYXVsdCBmb3IgNjQgYml0IGtlcm5lbHMuICovCisjZW5kaWYKKwkJc3RyY3B5KGVsZl9wbGF0Zm9ybSwgIno5MDAiKTsKKwkJYnJlYWs7CisJY2FzZSAweDIwODQ6CisJY2FzZSAweDIwODY6CisJCXN0cmNweShlbGZfcGxhdGZvcm0sICJ6OTkwIik7CisJCWJyZWFrOworCWNhc2UgMHgyMDk0OgorCQlzdHJjcHkoZWxmX3BsYXRmb3JtLCAiejktMTA5Iik7CisJCWJyZWFrOworCX0KK30KKwogLyoKICAqIFNldHVwIGZ1bmN0aW9uIGNhbGxlZCBmcm9tIGluaXQvbWFpbi5jIGp1c3QgYWZ0ZXIgdGhlIGJhbm5lcgogICogd2FzIHByaW50ZWQuCkBAIC03NjUsNiArODg3LDcgQEAKIAogCXBhcnNlX2Vhcmx5X3BhcmFtKCk7CiAKKwlzZXR1cF9pcGxfaW5mbygpOwogCXNldHVwX21lbW9yeV9lbmQoKTsKIAlzZXR1cF9hZGRyZXNzaW5nX21vZGUoKTsKIAlzZXR1cF9tZW1vcnkoKTsKQEAgLTc3NiwxMiArODk5LDIwIEBACiAJc21wX3NldHVwX2NwdV9wb3NzaWJsZV9tYXAoKTsKIAogCS8qCisJICogU2V0dXAgY2FwYWJpbGl0aWVzIChFTEZfSFdDQVAgJiBFTEZfUExBVEZPUk0pLgorCSAqLworCXNldHVwX2h3Y2FwcygpOworCisJLyoKIAkgKiBDcmVhdGUga2VybmVsIHBhZ2UgdGFibGVzIGFuZCBzd2l0Y2ggdG8gdmlydHVhbCBhZGRyZXNzaW5nLgogCSAqLwogICAgICAgICBwYWdpbmdfaW5pdCgpOwogCiAgICAgICAgIC8qIFNldHVwIGRlZmF1bHQgY29uc29sZSAqLwogCWNvbm1vZGVfZGVmYXVsdCgpOworCisJLyogU2V0dXAgemZjcGR1bXAgc3VwcG9ydCAqLworCXNldHVwX3pmY3BkdW1wKGNvbnNvbGVfZGV2bm8pOwogfQogCiB2b2lkIHByaW50X2NwdV9pbmZvKHN0cnVjdCBjcHVpbmZvX1MzOTAgKmNwdWluZm8pCkBAIC04MDcsOCArOTM4LDEyIEBACiAKIHN0YXRpYyBpbnQgc2hvd19jcHVpbmZvKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKIHsKKwlzdGF0aWMgY29uc3QgY2hhciAqaHdjYXBfc3RyWzddID0geworCQkiZXNhbjMiLCAiemFyY2giLCAic3RmbGUiLCAibXNhIiwgImxkaXNwIiwgImVpbW0iLCAiZGZwIgorCX07CiAgICAgICAgIHN0cnVjdCBjcHVpbmZvX1MzOTAgKmNwdWluZm87CiAJdW5zaWduZWQgbG9uZyBuID0gKHVuc2lnbmVkIGxvbmcpIHYgLSAxOworCWludCBpOwogCiAJczM5MF9hZGp1c3RfamlmZmllcygpOwogCXByZWVtcHRfZGlzYWJsZSgpOwpAQCAtODE4LDcgKzk1MywxMyBAQAogCQkJICAgICAgICJib2dvbWlwcyBwZXIgY3B1OiAlbHUuJTAybHVcbiIsCiAJCQkgICAgICAgbnVtX29ubGluZV9jcHVzKCksIGxvb3BzX3Blcl9qaWZmeS8oNTAwMDAwL0haKSwKIAkJCSAgICAgICAobG9vcHNfcGVyX2ppZmZ5Lyg1MDAwL0haKSklMTAwKTsKKwkJc2VxX3B1dHMobSwgImZlYXR1cmVzXHQ6ICIpOworCQlmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKQorCQkJaWYgKGh3Y2FwX3N0cltpXSAmJiAoZWxmX2h3Y2FwICYgKDFVTCA8PCBpKSkpCisJCQkJc2VxX3ByaW50ZihtLCAiJXMgIiwgaHdjYXBfc3RyW2ldKTsKKwkJc2VxX3B1dHMobSwgIlxuIik7CiAJfQorCiAJaWYgKGNwdV9vbmxpbmUobikpIHsKICNpZmRlZiBDT05GSUdfU01QCiAJCWlmIChzbXBfcHJvY2Vzc29yX2lkKCkgPT0gbikKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvc2lnbmFsLmMgYi9hcmNoL3MzOTAva2VybmVsL3NpZ25hbC5jCmluZGV4IDU1NGY5Y2YuLjNjNDE5MDcgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvc2lnbmFsLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9zaWduYWwuYwpAQCAtMTAyLDkgKzEwMiw5IEBACiB9CiAKIGFzbWxpbmthZ2UgbG9uZwotc3lzX3NpZ2FsdHN0YWNrKGNvbnN0IHN0YWNrX3QgX191c2VyICp1c3MsIHN0YWNrX3QgX191c2VyICp1b3NzLAotCQkJCQlzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3N5c19zaWdhbHRzdGFjayhjb25zdCBzdGFja190IF9fdXNlciAqdXNzLCBzdGFja190IF9fdXNlciAqdW9zcykKIHsKKwlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IHRhc2tfcHRfcmVncyhjdXJyZW50KTsKIAlyZXR1cm4gZG9fc2lnYWx0c3RhY2sodXNzLCB1b3NzLCByZWdzLT5ncHJzWzE1XSk7CiB9CiAKQEAgLTE2Myw4ICsxNjMsOSBAQAogCXJldHVybiAwOwogfQogCi1hc21saW5rYWdlIGxvbmcgc3lzX3NpZ3JldHVybihzdHJ1Y3QgcHRfcmVncyAqcmVncykKK2FzbWxpbmthZ2UgbG9uZyBzeXNfc2lncmV0dXJuKHZvaWQpCiB7CisJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSB0YXNrX3B0X3JlZ3MoY3VycmVudCk7CiAJc2lnZnJhbWUgX191c2VyICpmcmFtZSA9IChzaWdmcmFtZSBfX3VzZXIgKilyZWdzLT5ncHJzWzE1XTsKIAlzaWdzZXRfdCBzZXQ7CiAKQEAgLTE4OSw4ICsxOTAsOSBAQAogCXJldHVybiAwOwogfQogCi1hc21saW5rYWdlIGxvbmcgc3lzX3J0X3NpZ3JldHVybihzdHJ1Y3QgcHRfcmVncyAqcmVncykKK2FzbWxpbmthZ2UgbG9uZyBzeXNfcnRfc2lncmV0dXJuKHZvaWQpCiB7CisJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSB0YXNrX3B0X3JlZ3MoY3VycmVudCk7CiAJcnRfc2lnZnJhbWUgX191c2VyICpmcmFtZSA9IChydF9zaWdmcmFtZSBfX3VzZXIgKilyZWdzLT5ncHJzWzE1XTsKIAlzaWdzZXRfdCBzZXQ7CiAKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvc21wLmMgYi9hcmNoL3MzOTAva2VybmVsL3NtcC5jCmluZGV4IDk3NzY0ZjcuLjM3NTRlMjAgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvc21wLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9zbXAuYwpAQCAtMSwxMiArMSwxMiBAQAogLyoKICAqICBhcmNoL3MzOTAva2VybmVsL3NtcC5jCiAgKgotICogICAgQ29weXJpZ2h0IChDKSBJQk0gQ29ycC4gMTk5OSwyMDA2CisgKiAgICBDb3B5cmlnaHQgSUJNIENvcnAuIDE5OTksMjAwNwogICogICAgQXV0aG9yKHMpOiBEZW5pcyBKb3NlcGggQmFycm93IChkamJhcnJvd0BkZS5pYm0uY29tLGJhcnJvd19kakB5YWhvby5jb20pLAotICogICAgICAgICAgICAgICBNYXJ0aW4gU2Nod2lkZWZza3kgKHNjaHdpZGVmc2t5QGRlLmlibS5jb20pCi0gKiAgICAgICAgICAgICAgIEhlaWtvIENhcnN0ZW5zIChoZWlrby5jYXJzdGVuc0BkZS5pYm0uY29tKQorICoJCSBNYXJ0aW4gU2Nod2lkZWZza3kgKHNjaHdpZGVmc2t5QGRlLmlibS5jb20pCisgKgkJIEhlaWtvIENhcnN0ZW5zIChoZWlrby5jYXJzdGVuc0BkZS5pYm0uY29tKQogICoKLSAqICBiYXNlZCBvbiBvdGhlciBzbXAgc3R1ZmYgYnkgCisgKiAgYmFzZWQgb24gb3RoZXIgc21wIHN0dWZmIGJ5CiAgKiAgICAoYykgMTk5NSBBbGFuIENveCwgQ3ltcnVORVQgTHRkICA8YWxhbkBjeW1ydS5uZXQ+CiAgKiAgICAoYykgMTk5OCBJbmdvIE1vbG5hcgogICoKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9jcHUuaD4KICNpbmNsdWRlIDxsaW51eC90aW1leC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KICNpbmNsdWRlIDxhc20vaXBsLmg+CiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAjaW5jbHVkZSA8YXNtL3NpZ3AuaD4KQEAgLTQwLDE3ICs0MSwxOSBAQAogI2luY2x1ZGUgPGFzbS9jcGNtZC5oPgogI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgogI2luY2x1ZGUgPGFzbS90aW1lci5oPgotCi1leHRlcm4gdm9sYXRpbGUgaW50IF9fY3B1X2xvZ2ljYWxfbWFwW107CisjaW5jbHVkZSA8YXNtL2xvd2NvcmUuaD4KIAogLyoKICAqIEFuIGFycmF5IHdpdGggYSBwb2ludGVyIHRoZSBsb3djb3JlIG9mIGV2ZXJ5IENQVS4KICAqLwotCiBzdHJ1Y3QgX2xvd2NvcmUgKmxvd2NvcmVfcHRyW05SX0NQVVNdOworRVhQT1JUX1NZTUJPTChsb3djb3JlX3B0cik7CiAKIGNwdW1hc2tfdCBjcHVfb25saW5lX21hcCA9IENQVV9NQVNLX05PTkU7CitFWFBPUlRfU1lNQk9MKGNwdV9vbmxpbmVfbWFwKTsKKwogY3B1bWFza190IGNwdV9wb3NzaWJsZV9tYXAgPSBDUFVfTUFTS19OT05FOworRVhQT1JUX1NZTUJPTChjcHVfcG9zc2libGVfbWFwKTsKIAogc3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCAqY3VycmVudF9zZXRbTlJfQ1BVU107CiAKQEAgLTcwLDcgKzczLDcgQEAKIAlpbnQgd2FpdDsKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgY2FsbF9kYXRhX3N0cnVjdCAqIGNhbGxfZGF0YTsKK3N0YXRpYyBzdHJ1Y3QgY2FsbF9kYXRhX3N0cnVjdCAqY2FsbF9kYXRhOwogCiAvKgogICogJ0NhbGwgZnVuY3Rpb24nIGludGVycnVwdCBjYWxsYmFjawpAQCAtMTUwLDggKzE1Myw4IEBACiAgKgogICogUnVuIGEgZnVuY3Rpb24gb24gYWxsIG90aGVyIENQVXMuCiAgKgotICogWW91IG11c3Qgbm90IGNhbGwgdGhpcyBmdW5jdGlvbiB3aXRoIGRpc2FibGVkIGludGVycnVwdHMgb3IgZnJvbSBhCi0gKiBoYXJkd2FyZSBpbnRlcnJ1cHQgaGFuZGxlci4gWW91IG1heSBjYWxsIGl0IGZyb20gYSBib3R0b20gaGFsZi4KKyAqIFlvdSBtdXN0IG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24gd2l0aCBkaXNhYmxlZCBpbnRlcnJ1cHRzLCBmcm9tIGEKKyAqIGhhcmR3YXJlIGludGVycnVwdCBoYW5kbGVyIG9yIGZyb20gYSBib3R0b20gaGFsZi4KICAqLwogaW50IHNtcF9jYWxsX2Z1bmN0aW9uKHZvaWQgKCpmdW5jKSAodm9pZCAqaW5mbyksIHZvaWQgKmluZm8sIGludCBub25hdG9taWMsCiAJCSAgICAgIGludCB3YWl0KQpAQCAtMTc3LDExICsxODAsMTEgQEAKICAqCiAgKiBSdW4gYSBmdW5jdGlvbiBvbiBvbmUgcHJvY2Vzc29yLgogICoKLSAqIFlvdSBtdXN0IG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24gd2l0aCBkaXNhYmxlZCBpbnRlcnJ1cHRzIG9yIGZyb20gYQotICogaGFyZHdhcmUgaW50ZXJydXB0IGhhbmRsZXIuIFlvdSBtYXkgY2FsbCBpdCBmcm9tIGEgYm90dG9tIGhhbGYuCisgKiBZb3UgbXVzdCBub3QgY2FsbCB0aGlzIGZ1bmN0aW9uIHdpdGggZGlzYWJsZWQgaW50ZXJydXB0cywgZnJvbSBhCisgKiBoYXJkd2FyZSBpbnRlcnJ1cHQgaGFuZGxlciBvciBmcm9tIGEgYm90dG9tIGhhbGYuCiAgKi8KIGludCBzbXBfY2FsbF9mdW5jdGlvbl9vbih2b2lkICgqZnVuYykgKHZvaWQgKmluZm8pLCB2b2lkICppbmZvLCBpbnQgbm9uYXRvbWljLAotCQkJICBpbnQgd2FpdCwgaW50IGNwdSkKKwkJCSBpbnQgd2FpdCwgaW50IGNwdSkKIHsKIAljcHVtYXNrX3QgbWFwID0gQ1BVX01BU0tfTk9ORTsKIApAQCAtMTk1LDkgKzE5OCw5IEBACiAKIHN0YXRpYyB2b2lkIGRvX3NlbmRfc3RvcCh2b2lkKQogewotICAgICAgICBpbnQgY3B1LCByYzsKKwlpbnQgY3B1LCByYzsKIAotICAgICAgICAvKiBzdG9wIGFsbCBwcm9jZXNzb3JzICovCisJLyogc3RvcCBhbGwgcHJvY2Vzc29ycyAqLwogCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KSB7CiAJCWlmIChjcHUgPT0gc21wX3Byb2Nlc3Nvcl9pZCgpKQogCQkJY29udGludWU7CkBAIC0yMDksOSArMjEyLDkgQEAKIAogc3RhdGljIHZvaWQgZG9fc3RvcmVfc3RhdHVzKHZvaWQpCiB7Ci0gICAgICAgIGludCBjcHUsIHJjOworCWludCBjcHUsIHJjOwogCi0gICAgICAgIC8qIHN0b3JlIHN0YXR1cyBvZiBhbGwgcHJvY2Vzc29ycyBpbiB0aGVpciBsb3djb3JlcyAocmVhbCAwKSAqLworCS8qIHN0b3JlIHN0YXR1cyBvZiBhbGwgcHJvY2Vzc29ycyBpbiB0aGVpciBsb3djb3JlcyAocmVhbCAwKSAqLwogCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KSB7CiAJCWlmIChjcHUgPT0gc21wX3Byb2Nlc3Nvcl9pZCgpKQogCQkJY29udGludWU7CkBAIC0yMTksOCArMjIyLDggQEAKIAkJCXJjID0gc2lnbmFsX3Byb2Nlc3Nvcl9wKAogCQkJCShfX3UzMikodW5zaWduZWQgbG9uZykgbG93Y29yZV9wdHJbY3B1XSwgY3B1LAogCQkJCXNpZ3Bfc3RvcmVfc3RhdHVzX2F0X2FkZHJlc3MpOwotCQl9IHdoaWxlKHJjID09IHNpZ3BfYnVzeSk7Ci0gICAgICAgIH0KKwkJfSB3aGlsZSAocmMgPT0gc2lncF9idXN5KTsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIGRvX3dhaXRfZm9yX3N0b3Aodm9pZCkKQEAgLTIzMSw3ICsyMzQsNyBAQAogCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KSB7CiAJCWlmIChjcHUgPT0gc21wX3Byb2Nlc3Nvcl9pZCgpKQogCQkJY29udGludWU7Ci0JCXdoaWxlKCFzbXBfY3B1X25vdF9ydW5uaW5nKGNwdSkpCisJCXdoaWxlICghc21wX2NwdV9ub3RfcnVubmluZyhjcHUpKQogCQkJY3B1X3JlbGF4KCk7CiAJfQogfQpAQCAtMjQ1LDcgKzI0OCw3IEBACiAJLyogRGlzYWJsZSBhbGwgaW50ZXJydXB0cy9tYWNoaW5lIGNoZWNrcyAqLwogCV9fbG9hZF9wc3dfbWFzayhwc3dfa2VybmVsX2JpdHMgJiB+UFNXX01BU0tfTUNIRUNLKTsKIAotICAgICAgICAvKiB3cml0ZSBtYWdpYyBudW1iZXIgdG8gemVybyBwYWdlIChhYnNvbHV0ZSAwKSAqLworCS8qIHdyaXRlIG1hZ2ljIG51bWJlciB0byB6ZXJvIHBhZ2UgKGFic29sdXRlIDApICovCiAJbG93Y29yZV9wdHJbc21wX3Byb2Nlc3Nvcl9pZCgpXS0+cGFuaWNfbWFnaWMgPSBfX1BBTklDX01BR0lDOwogCiAJLyogc3RvcCBvdGhlciBwcm9jZXNzb3JzLiAqLwpAQCAtMjYxLDggKzI2NCw3IEBACiAvKgogICogUmVib290LCBoYWx0IGFuZCBwb3dlcl9vZmYgcm91dGluZXMgZm9yIFNNUC4KICAqLwotCi12b2lkIG1hY2hpbmVfcmVzdGFydF9zbXAoY2hhciAqIF9fdW51c2VkKSAKK3ZvaWQgbWFjaGluZV9yZXN0YXJ0X3NtcChjaGFyICpfX3VudXNlZCkKIHsKIAlzbXBfc2VuZF9zdG9wKCk7CiAJZG9fcmVpcGwoKTsKQEAgLTI5MywxNyArMjk1LDE3IEBACiAKIHN0YXRpYyB2b2lkIGRvX2V4dF9jYWxsX2ludGVycnVwdChfX3UxNiBjb2RlKQogewotICAgICAgICB1bnNpZ25lZCBsb25nIGJpdHM7CisJdW5zaWduZWQgbG9uZyBiaXRzOwogCi0gICAgICAgIC8qCi0gICAgICAgICAqIGhhbmRsZSBiaXQgc2lnbmFsIGV4dGVybmFsIGNhbGxzCi0gICAgICAgICAqCi0gICAgICAgICAqIEZvciB0aGUgZWNfc2NoZWR1bGUgc2lnbmFsIHdlIGhhdmUgdG8gZG8gbm90aGluZy4gQWxsIHRoZSB3b3JrCi0gICAgICAgICAqIGlzIGRvbmUgYXV0b21hdGljYWxseSB3aGVuIHdlIHJldHVybiBmcm9tIHRoZSBpbnRlcnJ1cHQuCi0gICAgICAgICAqLworCS8qCisJICogaGFuZGxlIGJpdCBzaWduYWwgZXh0ZXJuYWwgY2FsbHMKKwkgKgorCSAqIEZvciB0aGUgZWNfc2NoZWR1bGUgc2lnbmFsIHdlIGhhdmUgdG8gZG8gbm90aGluZy4gQWxsIHRoZSB3b3JrCisJICogaXMgZG9uZSBhdXRvbWF0aWNhbGx5IHdoZW4gd2UgcmV0dXJuIGZyb20gdGhlIGludGVycnVwdC4KKwkgKi8KIAliaXRzID0geGNoZygmUzM5MF9sb3djb3JlLmV4dF9jYWxsX2Zhc3QsIDApOwogCi0JaWYgKHRlc3RfYml0KGVjX2NhbGxfZnVuY3Rpb24sICZiaXRzKSkgCisJaWYgKHRlc3RfYml0KGVjX2NhbGxfZnVuY3Rpb24sICZiaXRzKSkKIAkJZG9fY2FsbF9mdW5jdGlvbigpOwogfQogCkBAIC0zMTMsMTEgKzMxNSwxMSBAQAogICovCiBzdGF0aWMgdm9pZCBzbXBfZXh0X2JpdGNhbGwoaW50IGNwdSwgZWNfYml0X3NpZyBzaWcpCiB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIFNldCBzaWduYWxpbmcgYml0IGluIGxvd2NvcmUgb2YgdGFyZ2V0IGNwdSBhbmQga2ljayBpdAotICAgICAgICAgKi8KKwkvKgorCSAqIFNldCBzaWduYWxpbmcgYml0IGluIGxvd2NvcmUgb2YgdGFyZ2V0IGNwdSBhbmQga2ljayBpdAorCSAqLwogCXNldF9iaXQoc2lnLCAodW5zaWduZWQgbG9uZyAqKSAmbG93Y29yZV9wdHJbY3B1XS0+ZXh0X2NhbGxfZmFzdCk7Ci0Jd2hpbGUoc2lnbmFsX3Byb2Nlc3NvcihjcHUsIHNpZ3BfZW1lcmdlbmN5X3NpZ25hbCkgPT0gc2lncF9idXN5KQorCXdoaWxlIChzaWduYWxfcHJvY2Vzc29yKGNwdSwgc2lncF9lbWVyZ2VuY3lfc2lnbmFsKSA9PSBzaWdwX2J1c3kpCiAJCXVkZWxheSgxMCk7CiB9CiAKQEAgLTMzMiw3ICszMzQsNyBAQAogCiB2b2lkIHNtcF9wdGxiX2FsbCh2b2lkKQogewotICAgICAgICBvbl9lYWNoX2NwdShzbXBfcHRsYl9jYWxsYmFjaywgTlVMTCwgMCwgMSk7CisJb25fZWFjaF9jcHUoc21wX3B0bGJfY2FsbGJhY2ssIE5VTEwsIDAsIDEpOwogfQogRVhQT1JUX1NZTUJPTChzbXBfcHRsYl9hbGwpOwogI2VuZGlmIC8qICEgQ09ORklHXzY0QklUICovCkBAIC0zNDQsNyArMzQ2LDcgQEAKICAqLwogdm9pZCBzbXBfc2VuZF9yZXNjaGVkdWxlKGludCBjcHUpCiB7Ci0gICAgICAgIHNtcF9leHRfYml0Y2FsbChjcHUsIGVjX3NjaGVkdWxlKTsKKwlzbXBfZXh0X2JpdGNhbGwoY3B1LCBlY19zY2hlZHVsZSk7CiB9CiAKIC8qCkBAIC0zNTgsMTEgKzM2MCwxMiBAQAogLyoKICAqIGNhbGxiYWNrIGZvciBzZXR0aW5nL2NsZWFyaW5nIGNvbnRyb2wgYml0cwogICovCi1zdGF0aWMgdm9pZCBzbXBfY3RsX2JpdF9jYWxsYmFjayh2b2lkICppbmZvKSB7CitzdGF0aWMgdm9pZCBzbXBfY3RsX2JpdF9jYWxsYmFjayh2b2lkICppbmZvKQorewogCXN0cnVjdCBlY19jcmVnX21hc2tfcGFybXMgKnBwID0gaW5mbzsKIAl1bnNpZ25lZCBsb25nIGNyZWdzWzE2XTsKIAlpbnQgaTsKLQkKKwogCV9fY3RsX3N0b3JlKGNyZWdzLCAwLCAxNSk7CiAJZm9yIChpID0gMDsgaSA8PSAxNTsgaSsrKQogCQljcmVnc1tpXSA9IChjcmVnc1tpXSAmIHBwLT5hbmR2YWxzW2ldKSB8IHBwLT5vcnZhbHNbaV07CkBAIC0zODEsNiArMzg0LDcgQEAKIAlwYXJtcy5vcnZhbHNbY3JdID0gMSA8PCBiaXQ7CiAJb25fZWFjaF9jcHUoc21wX2N0bF9iaXRfY2FsbGJhY2ssICZwYXJtcywgMCwgMSk7CiB9CitFWFBPUlRfU1lNQk9MKHNtcF9jdGxfc2V0X2JpdCk7CiAKIC8qCiAgKiBDbGVhciBhIGJpdCBpbiBhIGNvbnRyb2wgcmVnaXN0ZXIgb2YgYWxsIGNwdXMKQEAgLTM5NCwxMyArMzk4LDcyIEBACiAJcGFybXMuYW5kdmFsc1tjcl0gPSB+KDFMIDw8IGJpdCk7CiAJb25fZWFjaF9jcHUoc21wX2N0bF9iaXRfY2FsbGJhY2ssICZwYXJtcywgMCwgMSk7CiB9CitFWFBPUlRfU1lNQk9MKHNtcF9jdGxfY2xlYXJfYml0KTsKKworI2lmIGRlZmluZWQoQ09ORklHX1pGQ1BEVU1QKSB8fCBkZWZpbmVkKENPTkZJR19aRkNQRFVNUF9NT0RVTEUpCisKKy8qCisgKiB6ZmNwZHVtcF9wcmVmaXhfYXJyYXkgaG9sZHMgcHJlZml4IHJlZ2lzdGVycyBmb3IgdGhlIGZvbGxvd2luZyBzY2VuYXJpbzoKKyAqIDY0IGJpdCB6ZmNwZHVtcCBrZXJuZWwgYW5kIDMxIGJpdCBrZXJuZWwgd2hpY2ggaXMgdG8gYmUgZHVtcGVkLiBXZSBoYXZlIHRvCisgKiBzYXZlIGl0cyBwcmVmaXggcmVnaXN0ZXJzLCBzaW5jZSB0aGV5IGdldCBsb3N0LCB3aGVuIHN3aXRjaGluZyBmcm9tIDMxIGJpdAorICogdG8gNjQgYml0LgorICovCit1bnNpZ25lZCBpbnQgemZjcGR1bXBfcHJlZml4X2FycmF5W05SX0NQVVMgKyAxXSBcCisJX19hdHRyaWJ1dGVfXygoX19zZWN0aW9uX18oIi5kYXRhIikpKTsKKworc3RhdGljIHZvaWQgX19pbml0IHNtcF9nZXRfc2F2ZV9hcmVhcyh2b2lkKQoreworCXVuc2lnbmVkIGludCBjcHUsIGNwdV9udW0sIHJjOworCV9fdTE2IGJvb3RfY3B1X2FkZHI7CisKKwlpZiAoaXBsX2luZm8udHlwZSAhPSBJUExfVFlQRV9GQ1BfRFVNUCkKKwkJcmV0dXJuOworCWJvb3RfY3B1X2FkZHIgPSBTMzkwX2xvd2NvcmUuY3B1X2RhdGEuY3B1X2FkZHI7CisJY3B1X251bSA9IDE7CisJZm9yIChjcHUgPSAwOyBjcHUgPD0gNjU1MzU7IGNwdSsrKSB7CisJCWlmICgodTE2KSBjcHUgPT0gYm9vdF9jcHVfYWRkcikKKwkJCWNvbnRpbnVlOworCQlfX2NwdV9sb2dpY2FsX21hcFsxXSA9IChfX3UxNikgY3B1OworCQlpZiAoc2lnbmFsX3Byb2Nlc3NvcigxLCBzaWdwX3NlbnNlKSA9PSBzaWdwX25vdF9vcGVyYXRpb25hbCkKKwkJCWNvbnRpbnVlOworCQlpZiAoY3B1X251bSA+PSBOUl9DUFVTKSB7CisJCQlwcmludGsoIldBUk5JTkc6IFJlZ2lzdGVycyBmb3IgY3B1ICVpIGFyZSBub3QgIgorCQkJICAgICAgICJzYXZlZCwgc2luY2UgZHVtcCBrZXJuZWwgd2FzIGNvbXBpbGVkIHdpdGgiCisJCQkgICAgICAgIk5SX0NQVVM9JWkhXG4iLCBjcHVfbnVtLCBOUl9DUFVTKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXpmY3BkdW1wX3NhdmVfYXJlYXNbY3B1X251bV0gPQorCQkJYWxsb2NfYm9vdG1lbShzaXplb2YodW5pb24gc2F2ZV9hcmVhKSk7CisJCXdoaWxlICgxKSB7CisJCQlyYyA9IHNpZ25hbF9wcm9jZXNzb3IoMSwgc2lncF9zdG9wX2FuZF9zdG9yZV9zdGF0dXMpOworCQkJaWYgKHJjICE9IHNpZ3BfYnVzeSkKKwkJCQlicmVhazsKKwkJCWNwdV9yZWxheCgpOworCQl9CisJCW1lbWNweSh6ZmNwZHVtcF9zYXZlX2FyZWFzW2NwdV9udW1dLAorCQkgICAgICAgKHZvaWQgKikodW5zaWduZWQgbG9uZykgc3RvcmVfcHJlZml4KCkgKworCQkgICAgICAgU0FWRV9BUkVBX0JBU0UsIFNBVkVfQVJFQV9TSVpFKTsKKyNpZmRlZiBfX3MzOTB4X18KKwkJLyogY29weSBvcmlnaW5hbCBwcmVmaXggcmVnaXN0ZXIgKi8KKwkJemZjcGR1bXBfc2F2ZV9hcmVhc1tjcHVfbnVtXS0+czM5MHgucHJlZl9yZWcgPQorCQkJemZjcGR1bXBfcHJlZml4X2FycmF5W2NwdV9udW1dOworI2VuZGlmCisJCWNwdV9udW0rKzsKKwl9Cit9CisKK3VuaW9uIHNhdmVfYXJlYSAqemZjcGR1bXBfc2F2ZV9hcmVhc1tOUl9DUFVTICsgMV07CitFWFBPUlRfU1lNQk9MX0dQTCh6ZmNwZHVtcF9zYXZlX2FyZWFzKTsKKworI2Vsc2UKKyNkZWZpbmUgc21wX2dldF9zYXZlX2FyZWFzKCkgZG8geyB9IHdoaWxlICgwKQorI2VuZGlmCiAKIC8qCiAgKiBMZXRzIGNoZWNrIGhvdyBtYW55IENQVXMgd2UgaGF2ZS4KICAqLwogCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1fX2luaXQgc21wX2NvdW50X2NwdXModm9pZCkKK3N0YXRpYyB1bnNpZ25lZCBpbnQgX19pbml0IHNtcF9jb3VudF9jcHVzKHZvaWQpCiB7CiAJdW5zaWduZWQgaW50IGNwdSwgbnVtX2NwdXM7CiAJX191MTYgYm9vdF9jcHVfYWRkcjsKQEAgLTQxNiwzMSArNDc5LDMwIEBACiAJCWlmICgoX191MTYpIGNwdSA9PSBib290X2NwdV9hZGRyKQogCQkJY29udGludWU7CiAJCV9fY3B1X2xvZ2ljYWxfbWFwWzFdID0gKF9fdTE2KSBjcHU7Ci0JCWlmIChzaWduYWxfcHJvY2Vzc29yKDEsIHNpZ3Bfc2Vuc2UpID09Ci0JCSAgICBzaWdwX25vdF9vcGVyYXRpb25hbCkKKwkJaWYgKHNpZ25hbF9wcm9jZXNzb3IoMSwgc2lncF9zZW5zZSkgPT0gc2lncF9ub3Rfb3BlcmF0aW9uYWwpCiAJCQljb250aW51ZTsKIAkJbnVtX2NwdXMrKzsKIAl9CiAKLQlwcmludGsoIkRldGVjdGVkICVkIENQVSdzXG4iLChpbnQpIG51bV9jcHVzKTsKKwlwcmludGsoIkRldGVjdGVkICVkIENQVSdzXG4iLCAoaW50KSBudW1fY3B1cyk7CiAJcHJpbnRrKCJCb290IGNwdSBhZGRyZXNzICUyWFxuIiwgYm9vdF9jcHVfYWRkcik7CiAKIAlyZXR1cm4gbnVtX2NwdXM7CiB9CiAKIC8qCi0gKiAgICAgIEFjdGl2YXRlIGEgc2Vjb25kYXJ5IHByb2Nlc3Nvci4KKyAqCUFjdGl2YXRlIGEgc2Vjb25kYXJ5IHByb2Nlc3Nvci4KICAqLwogaW50IF9fZGV2aW5pdCBzdGFydF9zZWNvbmRhcnkodm9pZCAqY3B1dm9pZCkKIHsKLSAgICAgICAgLyogU2V0dXAgdGhlIGNwdSAqLwotICAgICAgICBjcHVfaW5pdCgpOworCS8qIFNldHVwIHRoZSBjcHUgKi8KKwljcHVfaW5pdCgpOwogCXByZWVtcHRfZGlzYWJsZSgpOwogCS8qIEVuYWJsZSBUT0QgY2xvY2sgaW50ZXJydXB0cyBvbiB0aGUgc2Vjb25kYXJ5IGNwdS4gKi8KLSAgICAgICAgaW5pdF9jcHVfdGltZXIoKTsKKwlpbml0X2NwdV90aW1lcigpOwogI2lmZGVmIENPTkZJR19WSVJUX1RJTUVSCiAJLyogRW5hYmxlIGNwdSB0aW1lciBpbnRlcnJ1cHRzIG9uIHRoZSBzZWNvbmRhcnkgY3B1LiAqLwotICAgICAgICBpbml0X2NwdV92dGltZXIoKTsKKwlpbml0X2NwdV92dGltZXIoKTsKICNlbmRpZgogCS8qIEVuYWJsZSBwZmF1bHQgcHNldWRvIHBhZ2UgZmF1bHRzIG9uIHRoaXMgY3B1LiAqLwogCXBmYXVsdF9pbml0KCk7CkBAIC00NDksMTEgKzUxMSwxMSBAQAogCWNwdV9zZXQoc21wX3Byb2Nlc3Nvcl9pZCgpLCBjcHVfb25saW5lX21hcCk7CiAJLyogU3dpdGNoIG9uIGludGVycnVwdHMgKi8KIAlsb2NhbF9pcnFfZW5hYmxlKCk7Ci0gICAgICAgIC8qIFByaW50IGluZm8gYWJvdXQgdGhpcyBwcm9jZXNzb3IgKi8KLSAgICAgICAgcHJpbnRfY3B1X2luZm8oJlMzOTBfbG93Y29yZS5jcHVfZGF0YSk7Ci0gICAgICAgIC8qIGNwdV9pZGxlIHdpbGwgY2FsbCBzY2hlZHVsZSBmb3IgdXMgKi8KLSAgICAgICAgY3B1X2lkbGUoKTsKLSAgICAgICAgcmV0dXJuIDA7CisJLyogUHJpbnQgaW5mbyBhYm91dCB0aGlzIHByb2Nlc3NvciAqLworCXByaW50X2NwdV9pbmZvKCZTMzkwX2xvd2NvcmUuY3B1X2RhdGEpOworCS8qIGNwdV9pZGxlIHdpbGwgY2FsbCBzY2hlZHVsZSBmb3IgdXMgKi8KKwljcHVfaWRsZSgpOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBfX2luaXQgc21wX2NyZWF0ZV9pZGxlKHVuc2lnbmVkIGludCBjcHUpCkBAIC00NzAsNTYgKzUzMiwxMyBAQAogCWN1cnJlbnRfc2V0W2NwdV0gPSBwOwogfQogCi0vKiBSZXNlcnZpbmcgYW5kIHJlbGVhc2luZyBvZiBDUFVzICovCi0KLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soc21wX3Jlc2VydmVfbG9jayk7Ci1zdGF0aWMgaW50IHNtcF9jcHVfcmVzZXJ2ZWRbTlJfQ1BVU107Ci0KLWludAotc21wX2dldF9jcHUoY3B1bWFza190IGNwdV9tYXNrKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IGNwdTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZzbXBfcmVzZXJ2ZV9sb2NrLCBmbGFncyk7Ci0JLyogVHJ5IHRvIGZpbmQgYW4gYWxyZWFkeSByZXNlcnZlZCBjcHUuICovCi0JZm9yX2VhY2hfY3B1X21hc2soY3B1LCBjcHVfbWFzaykgewotCQlpZiAoc21wX2NwdV9yZXNlcnZlZFtjcHVdICE9IDApIHsKLQkJCXNtcF9jcHVfcmVzZXJ2ZWRbY3B1XSsrOwotCQkJLyogRm91bmQgb25lLiAqLwotCQkJZ290byBvdXQ7Ci0JCX0KLQl9Ci0JLyogUmVzZXJ2ZSBhIG5ldyBjcHUgZnJvbSBjcHVfbWFzay4gKi8KLQlmb3JfZWFjaF9jcHVfbWFzayhjcHUsIGNwdV9tYXNrKSB7Ci0JCWlmIChjcHVfb25saW5lKGNwdSkpIHsKLQkJCXNtcF9jcHVfcmVzZXJ2ZWRbY3B1XSsrOwotCQkJZ290byBvdXQ7Ci0JCX0KLQl9Ci0JY3B1ID0gLUVOT0RFVjsKLW91dDoKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzbXBfcmVzZXJ2ZV9sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIGNwdTsKLX0KLQotdm9pZAotc21wX3B1dF9jcHUoaW50IGNwdSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnNtcF9yZXNlcnZlX2xvY2ssIGZsYWdzKTsKLQlzbXBfY3B1X3Jlc2VydmVkW2NwdV0tLTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzbXBfcmVzZXJ2ZV9sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyBpbnQKLWNwdV9zdG9wcGVkKGludCBjcHUpCitzdGF0aWMgaW50IGNwdV9zdG9wcGVkKGludCBjcHUpCiB7CiAJX191MzIgc3RhdHVzOwogCiAJLyogQ2hlY2sgZm9yIHN0b3BwZWQgc3RhdGUgKi8KLQlpZiAoc2lnbmFsX3Byb2Nlc3Nvcl9wcygmc3RhdHVzLCAwLCBjcHUsIHNpZ3Bfc2Vuc2UpID09IHNpZ3Bfc3RhdHVzX3N0b3JlZCkgeworCWlmIChzaWduYWxfcHJvY2Vzc29yX3BzKCZzdGF0dXMsIDAsIGNwdSwgc2lncF9zZW5zZSkgPT0KKwkgICAgc2lncF9zdGF0dXNfc3RvcmVkKSB7CiAJCWlmIChzdGF0dXMgJiAweDQwKQogCQkJcmV0dXJuIDE7CiAJfQpAQCAtNTI4LDE0ICs1NDcsMTMgQEAKIAogLyogVXBwaW5nIGFuZCBkb3duaW5nIG9mIENQVXMgKi8KIAotaW50Ci1fX2NwdV91cCh1bnNpZ25lZCBpbnQgY3B1KQoraW50IF9fY3B1X3VwKHVuc2lnbmVkIGludCBjcHUpCiB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICppZGxlOwotICAgICAgICBzdHJ1Y3QgX2xvd2NvcmUgICAgKmNwdV9sb3djb3JlOworCXN0cnVjdCBfbG93Y29yZSAqY3B1X2xvd2NvcmU7CiAJc3RydWN0IHN0YWNrX2ZyYW1lICpzZjsKLSAgICAgICAgc2lncF9jY29kZSAgICAgICAgICBjY29kZTsKLQlpbnQgICAgICAgICAgICAgICAgIGN1cnJfY3B1OworCXNpZ3BfY2NvZGUgY2NvZGU7CisJaW50IGN1cnJfY3B1OwogCiAJZm9yIChjdXJyX2NwdSA9IDA7IGN1cnJfY3B1IDw9IDY1NTM1OyBjdXJyX2NwdSsrKSB7CiAJCV9fY3B1X2xvZ2ljYWxfbWFwW2NwdV0gPSAoX191MTYpIGN1cnJfY3B1OwpAQCAtNTQ4LDcgKzU2Niw3IEBACiAKIAljY29kZSA9IHNpZ25hbF9wcm9jZXNzb3JfcCgoX191MzIpKHVuc2lnbmVkIGxvbmcpKGxvd2NvcmVfcHRyW2NwdV0pLAogCQkJCSAgIGNwdSwgc2lncF9zZXRfcHJlZml4KTsKLQlpZiAoY2NvZGUpeworCWlmIChjY29kZSkgewogCQlwcmludGsoInNpZ3Bfc2V0X3ByZWZpeCBmYWlsZWQgZm9yIGNwdSAlZCAiCiAJCSAgICAgICAid2l0aCBjb25kaXRpb24gY29kZSAlZFxuIiwKIAkJICAgICAgIChpbnQpIGNwdSwgKGludCkgY2NvZGUpOwpAQCAtNTU2LDkgKzU3NCw5IEBACiAJfQogCiAJaWRsZSA9IGN1cnJlbnRfc2V0W2NwdV07Ci0gICAgICAgIGNwdV9sb3djb3JlID0gbG93Y29yZV9wdHJbY3B1XTsKKwljcHVfbG93Y29yZSA9IGxvd2NvcmVfcHRyW2NwdV07CiAJY3B1X2xvd2NvcmUtPmtlcm5lbF9zdGFjayA9ICh1bnNpZ25lZCBsb25nKQotCQl0YXNrX3N0YWNrX3BhZ2UoaWRsZSkgKyAoVEhSRUFEX1NJWkUpOworCQl0YXNrX3N0YWNrX3BhZ2UoaWRsZSkgKyBUSFJFQURfU0laRTsKIAlzZiA9IChzdHJ1Y3Qgc3RhY2tfZnJhbWUgKikgKGNwdV9sb3djb3JlLT5rZXJuZWxfc3RhY2sKIAkJCQkgICAgIC0gc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKQogCQkJCSAgICAgLSBzaXplb2Yoc3RydWN0IHN0YWNrX2ZyYW1lKSk7CkBAIC01NzAsMTEgKzU4OCwxMSBAQAogCQkiCXN0YW0JMCwxNSwwKCUwKSIKIAkJOiA6ICJhIiAoJmNwdV9sb3djb3JlLT5hY2Nlc3NfcmVnc19zYXZlX2FyZWEpIDogIm1lbW9yeSIpOwogCWNwdV9sb3djb3JlLT5wZXJjcHVfb2Zmc2V0ID0gX19wZXJfY3B1X29mZnNldFtjcHVdOwotICAgICAgICBjcHVfbG93Y29yZS0+Y3VycmVudF90YXNrID0gKHVuc2lnbmVkIGxvbmcpIGlkbGU7Ci0gICAgICAgIGNwdV9sb3djb3JlLT5jcHVfZGF0YS5jcHVfbnIgPSBjcHU7CisJY3B1X2xvd2NvcmUtPmN1cnJlbnRfdGFzayA9ICh1bnNpZ25lZCBsb25nKSBpZGxlOworCWNwdV9sb3djb3JlLT5jcHVfZGF0YS5jcHVfbnIgPSBjcHU7CiAJZWllaW8oKTsKIAotCXdoaWxlIChzaWduYWxfcHJvY2Vzc29yKGNwdSxzaWdwX3Jlc3RhcnQpID09IHNpZ3BfYnVzeSkKKwl3aGlsZSAoc2lnbmFsX3Byb2Nlc3NvcihjcHUsIHNpZ3BfcmVzdGFydCkgPT0gc2lncF9idXN5KQogCQl1ZGVsYXkoMTApOwogCiAJd2hpbGUgKCFjcHVfb25saW5lKGNwdSkpCkBAIC01ODksNiArNjA3LDcgQEAKIHsKIAl1bnNpZ25lZCBpbnQgcGh5X2NwdXMsIHBvc19jcHVzLCBjcHU7CiAKKwlzbXBfZ2V0X3NhdmVfYXJlYXMoKTsKIAlwaHlfY3B1cyA9IHNtcF9jb3VudF9jcHVzKCk7CiAJcG9zX2NwdXMgPSBtaW4ocGh5X2NwdXMgKyBhZGRpdGlvbmFsX2NwdXMsICh1bnNpZ25lZCBpbnQpIE5SX0NQVVMpOwogCkBAIC02MjAsMTggKzYzOSwxMSBAQAogfQogZWFybHlfcGFyYW0oInBvc3NpYmxlX2NwdXMiLCBzZXR1cF9wb3NzaWJsZV9jcHVzKTsKIAotaW50Ci1fX2NwdV9kaXNhYmxlKHZvaWQpCitpbnQgX19jcHVfZGlzYWJsZSh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IGVjX2NyZWdfbWFza19wYXJtcyBjcl9wYXJtczsKIAlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnNtcF9yZXNlcnZlX2xvY2ssIGZsYWdzKTsKLQlpZiAoc21wX2NwdV9yZXNlcnZlZFtjcHVdICE9IDApIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc21wX3Jlc2VydmVfbG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gLUVCVVNZOwotCX0KIAljcHVfY2xlYXIoY3B1LCBjcHVfb25saW5lX21hcCk7CiAKIAkvKiBEaXNhYmxlIHBmYXVsdCBwc2V1ZG8gcGFnZSBmYXVsdHMgb24gdGhpcyBjcHUuICovCkBAIC02NDIsMjQgKzY1NCwyMyBAQAogCiAJLyogZGlzYWJsZSBhbGwgZXh0ZXJuYWwgaW50ZXJydXB0cyAqLwogCWNyX3Bhcm1zLm9ydmFsc1swXSA9IDA7Ci0JY3JfcGFybXMuYW5kdmFsc1swXSA9IH4oMTw8MTUgfCAxPDwxNCB8IDE8PDEzIHwgMTw8MTIgfAotCQkJCTE8PDExIHwgMTw8MTAgfCAxPDwgNiB8IDE8PCA0KTsKKwljcl9wYXJtcy5hbmR2YWxzWzBdID0gfigxIDw8IDE1IHwgMSA8PCAxNCB8IDEgPDwgMTMgfCAxIDw8IDEyIHwKKwkJCQkxIDw8IDExIHwgMSA8PCAxMCB8IDEgPDwgIDYgfCAxIDw8ICA0KTsKIAkvKiBkaXNhYmxlIGFsbCBJL08gaW50ZXJydXB0cyAqLwogCWNyX3Bhcm1zLm9ydmFsc1s2XSA9IDA7Ci0JY3JfcGFybXMuYW5kdmFsc1s2XSA9IH4oMTw8MzEgfCAxPDwzMCB8IDE8PDI5IHwgMTw8MjggfAotCQkJCTE8PDI3IHwgMTw8MjYgfCAxPDwyNSB8IDE8PDI0KTsKKwljcl9wYXJtcy5hbmR2YWxzWzZdID0gfigxIDw8IDMxIHwgMSA8PCAzMCB8IDEgPDwgMjkgfCAxIDw8IDI4IHwKKwkJCQkxIDw8IDI3IHwgMSA8PCAyNiB8IDEgPDwgMjUgfCAxIDw8IDI0KTsKIAkvKiBkaXNhYmxlIG1vc3QgbWFjaGluZSBjaGVja3MgKi8KIAljcl9wYXJtcy5vcnZhbHNbMTRdID0gMDsKLQljcl9wYXJtcy5hbmR2YWxzWzE0XSA9IH4oMTw8MjggfCAxPDwyNyB8IDE8PDI2IHwgMTw8MjUgfCAxPDwyNCk7CisJY3JfcGFybXMuYW5kdmFsc1sxNF0gPSB+KDEgPDwgMjggfCAxIDw8IDI3IHwgMSA8PCAyNiB8CisJCQkJIDEgPDwgMjUgfCAxIDw8IDI0KTsKIAogCXNtcF9jdGxfYml0X2NhbGxiYWNrKCZjcl9wYXJtcyk7CiAKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzbXBfcmVzZXJ2ZV9sb2NrLCBmbGFncyk7CiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQKLV9fY3B1X2RpZSh1bnNpZ25lZCBpbnQgY3B1KQordm9pZCBfX2NwdV9kaWUodW5zaWduZWQgaW50IGNwdSkKIHsKIAkvKiBXYWl0IHVudGlsIHRhcmdldCBjcHUgaXMgZG93biAqLwogCXdoaWxlICghc21wX2NwdV9ub3RfcnVubmluZyhjcHUpKQpAQCAtNjY3LDEzICs2NzgsMTIgQEAKIAlwcmludGsoIlByb2Nlc3NvciAlZCBzcHVuIGRvd25cbiIsIGNwdSk7CiB9CiAKLXZvaWQKLWNwdV9kaWUodm9pZCkKK3ZvaWQgY3B1X2RpZSh2b2lkKQogewogCWlkbGVfdGFza19leGl0KCk7CiAJc2lnbmFsX3Byb2Nlc3NvcihzbXBfcHJvY2Vzc29yX2lkKCksIHNpZ3Bfc3RvcCk7CiAJQlVHKCk7Ci0JZm9yKDs7KTsKKwlmb3IgKDs7KTsKIH0KIAogI2VuZGlmIC8qIENPTkZJR19IT1RQTFVHX0NQVSAqLwpAQCAtNjg2LDM2ICs2OTYsMzYgQEAKIHsKIAl1bnNpZ25lZCBsb25nIHN0YWNrOwogCXVuc2lnbmVkIGludCBjcHU7Ci0gICAgICAgIGludCBpOworCWludCBpOwogCi0gICAgICAgIC8qIHJlcXVlc3QgdGhlIDB4MTIwMSBlbWVyZ2VuY3kgc2lnbmFsIGV4dGVybmFsIGludGVycnVwdCAqLwotICAgICAgICBpZiAocmVnaXN0ZXJfZXh0ZXJuYWxfaW50ZXJydXB0KDB4MTIwMSwgZG9fZXh0X2NhbGxfaW50ZXJydXB0KSAhPSAwKQotICAgICAgICAgICAgICAgIHBhbmljKCJDb3VsZG4ndCByZXF1ZXN0IGV4dGVybmFsIGludGVycnVwdCAweDEyMDEiKTsKLSAgICAgICAgbWVtc2V0KGxvd2NvcmVfcHRyLDAsc2l6ZW9mKGxvd2NvcmVfcHRyKSk7ICAKLSAgICAgICAgLyoKLSAgICAgICAgICogIEluaXRpYWxpemUgcHJlZml4IHBhZ2VzIGFuZCBzdGFja3MgZm9yIGFsbCBwb3NzaWJsZSBjcHVzCi0gICAgICAgICAqLworCS8qIHJlcXVlc3QgdGhlIDB4MTIwMSBlbWVyZ2VuY3kgc2lnbmFsIGV4dGVybmFsIGludGVycnVwdCAqLworCWlmIChyZWdpc3Rlcl9leHRlcm5hbF9pbnRlcnJ1cHQoMHgxMjAxLCBkb19leHRfY2FsbF9pbnRlcnJ1cHQpICE9IDApCisJCXBhbmljKCJDb3VsZG4ndCByZXF1ZXN0IGV4dGVybmFsIGludGVycnVwdCAweDEyMDEiKTsKKwltZW1zZXQobG93Y29yZV9wdHIsIDAsIHNpemVvZihsb3djb3JlX3B0cikpOworCS8qCisJICogIEluaXRpYWxpemUgcHJlZml4IHBhZ2VzIGFuZCBzdGFja3MgZm9yIGFsbCBwb3NzaWJsZSBjcHVzCisJICovCiAJcHJpbnRfY3B1X2luZm8oJlMzOTBfbG93Y29yZS5jcHVfZGF0YSk7CiAKLSAgICAgICAgZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpIHsKKwlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkgewogCQlsb3djb3JlX3B0cltpXSA9IChzdHJ1Y3QgX2xvd2NvcmUgKikKLQkJCV9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTHxHRlBfRE1BLCAKLQkJCQkJc2l6ZW9mKHZvaWQqKSA9PSA4ID8gMSA6IDApOwotCQlzdGFjayA9IF9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCxBU1lOQ19PUkRFUik7Ci0JCWlmIChsb3djb3JlX3B0cltpXSA9PSBOVUxMIHx8IHN0YWNrID09IDBVTEwpCisJCQlfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwgfCBHRlBfRE1BLAorCQkJCQkgc2l6ZW9mKHZvaWQqKSA9PSA4ID8gMSA6IDApOworCQlzdGFjayA9IF9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCwgQVNZTkNfT1JERVIpOworCQlpZiAoIWxvd2NvcmVfcHRyW2ldIHx8ICFzdGFjaykKIAkJCXBhbmljKCJzbXBfYm9vdF9jcHVzIGZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnlcbiIpOwogCiAJCSoobG93Y29yZV9wdHJbaV0pID0gUzM5MF9sb3djb3JlOwotCQlsb3djb3JlX3B0cltpXS0+YXN5bmNfc3RhY2sgPSBzdGFjayArIChBU1lOQ19TSVpFKTsKLQkJc3RhY2sgPSBfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwsMCk7Ci0JCWlmIChzdGFjayA9PSAwVUxMKQorCQlsb3djb3JlX3B0cltpXS0+YXN5bmNfc3RhY2sgPSBzdGFjayArIEFTWU5DX1NJWkU7CisJCXN0YWNrID0gX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLCAwKTsKKwkJaWYgKCFzdGFjaykKIAkJCXBhbmljKCJzbXBfYm9vdF9jcHVzIGZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnlcbiIpOwotCQlsb3djb3JlX3B0cltpXS0+cGFuaWNfc3RhY2sgPSBzdGFjayArIChQQUdFX1NJWkUpOworCQlsb3djb3JlX3B0cltpXS0+cGFuaWNfc3RhY2sgPSBzdGFjayArIFBBR0VfU0laRTsKICNpZm5kZWYgQ09ORklHXzY0QklUCiAJCWlmIChNQUNISU5FX0hBU19JRUVFKSB7CiAJCQlsb3djb3JlX3B0cltpXS0+ZXh0ZW5kZWRfc2F2ZV9hcmVhX2FkZHIgPQotCQkJCShfX3UzMikgX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLDApOwotCQkJaWYgKGxvd2NvcmVfcHRyW2ldLT5leHRlbmRlZF9zYXZlX2FyZWFfYWRkciA9PSAwKQorCQkJCShfX3UzMikgX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLCAwKTsKKwkJCWlmICghbG93Y29yZV9wdHJbaV0tPmV4dGVuZGVkX3NhdmVfYXJlYV9hZGRyKQogCQkJCXBhbmljKCJzbXBfYm9vdF9jcHVzIGZhaWxlZCB0byAiCiAJCQkJICAgICAgImFsbG9jYXRlIG1lbW9yeVxuIik7CiAJCX0KQEAgLTc1NCwzNCArNzY0LDYzIEBACiAgKi8KIGludCBzZXR1cF9wcm9maWxpbmdfdGltZXIodW5zaWduZWQgaW50IG11bHRpcGxpZXIpCiB7Ci0gICAgICAgIHJldHVybiAwOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGNwdSwgY3B1X2RldmljZXMpOwogCitzdGF0aWMgc3NpemVfdCBzaG93X2NhcGFiaWxpdHkoc3RydWN0IHN5c19kZXZpY2UgKmRldiwgY2hhciAqYnVmKQoreworCXVuc2lnbmVkIGludCBjYXBhYmlsaXR5OworCWludCByYzsKKworCXJjID0gZ2V0X2NwdV9jYXBhYmlsaXR5KCZjYXBhYmlsaXR5KTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgY2FwYWJpbGl0eSk7Cit9CitzdGF0aWMgU1lTREVWX0FUVFIoY2FwYWJpbGl0eSwgMDQ0NCwgc2hvd19jYXBhYmlsaXR5LCBOVUxMKTsKKworc3RhdGljIGludCBfX2NwdWluaXQgc21wX2NwdV9ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLAorCQkJCSAgICB1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqaGNwdSkKK3sKKwl1bnNpZ25lZCBpbnQgY3B1ID0gKHVuc2lnbmVkIGludCkobG9uZyloY3B1OworCXN0cnVjdCBjcHUgKmMgPSAmcGVyX2NwdShjcHVfZGV2aWNlcywgY3B1KTsKKwlzdHJ1Y3Qgc3lzX2RldmljZSAqcyA9ICZjLT5zeXNkZXY7CisKKwlzd2l0Y2ggKGFjdGlvbikgeworCWNhc2UgQ1BVX09OTElORToKKwkJaWYgKHN5c2Rldl9jcmVhdGVfZmlsZShzLCAmYXR0cl9jYXBhYmlsaXR5KSkKKwkJCXJldHVybiBOT1RJRllfQkFEOworCQlicmVhazsKKwljYXNlIENQVV9ERUFEOgorCQlzeXNkZXZfcmVtb3ZlX2ZpbGUocywgJmF0dHJfY2FwYWJpbGl0eSk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gTk9USUZZX09LOworfQorCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIF9fY3B1aW5pdGRhdGEgc21wX2NwdV9uYiA9IHsKKwkubm90aWZpZXJfY2FsbCA9IHNtcF9jcHVfbm90aWZ5LAorfTsKKwogc3RhdGljIGludCBfX2luaXQgdG9wb2xvZ3lfaW5pdCh2b2lkKQogewogCWludCBjcHU7Ci0JaW50IHJldDsKKworCXJlZ2lzdGVyX2NwdV9ub3RpZmllcigmc21wX2NwdV9uYik7CiAKIAlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7CiAJCXN0cnVjdCBjcHUgKmMgPSAmcGVyX2NwdShjcHVfZGV2aWNlcywgY3B1KTsKKwkJc3RydWN0IHN5c19kZXZpY2UgKnMgPSAmYy0+c3lzZGV2OwogCiAJCWMtPmhvdHBsdWdnYWJsZSA9IDE7Ci0JCXJldCA9IHJlZ2lzdGVyX2NwdShjLCBjcHUpOwotCQlpZiAocmV0KQotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAidG9wb2xvZ3lfaW5pdDogcmVnaXN0ZXJfY3B1ICVkICIKLQkJCSAgICAgICAiZmFpbGVkICglZClcbiIsIGNwdSwgcmV0KTsKKwkJcmVnaXN0ZXJfY3B1KGMsIGNwdSk7CisJCWlmICghY3B1X29ubGluZShjcHUpKQorCQkJY29udGludWU7CisJCXMgPSAmYy0+c3lzZGV2OworCQlzeXNkZXZfY3JlYXRlX2ZpbGUocywgJmF0dHJfY2FwYWJpbGl0eSk7CiAJfQogCXJldHVybiAwOwogfQotCiBzdWJzeXNfaW5pdGNhbGwodG9wb2xvZ3lfaW5pdCk7Ci0KLUVYUE9SVF9TWU1CT0woY3B1X29ubGluZV9tYXApOwotRVhQT1JUX1NZTUJPTChjcHVfcG9zc2libGVfbWFwKTsKLUVYUE9SVF9TWU1CT0wobG93Y29yZV9wdHIpOwotRVhQT1JUX1NZTUJPTChzbXBfY3RsX3NldF9iaXQpOwotRVhQT1JUX1NZTUJPTChzbXBfY3RsX2NsZWFyX2JpdCk7Ci1FWFBPUlRfU1lNQk9MKHNtcF9nZXRfY3B1KTsKLUVYUE9SVF9TWU1CT0woc21wX3B1dF9jcHUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9zeXNfczM5MC5jIGIvYXJjaC9zMzkwL2tlcm5lbC9zeXNfczM5MC5jCmluZGV4IDU4NGVkOTUuLjNhNzdjMjIgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvc3lzX3MzOTAuYworKysgYi9hcmNoL3MzOTAva2VybmVsL3N5c19zMzkwLmMKQEAgLTI2NiwyMyArMjY2LDMgQEAKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJcmV0dXJuIHN5c19mYWR2aXNlNjRfNjQoYS5mZCwgYS5vZmZzZXQsIGEubGVuLCBhLmFkdmljZSk7CiB9Ci0KLS8qCi0gKiBEbyBhIHN5c3RlbSBjYWxsIGZyb20ga2VybmVsIGluc3RlYWQgb2YgY2FsbGluZyBzeXNfZXhlY3ZlIHNvIHdlCi0gKiBlbmQgdXAgd2l0aCBwcm9wZXIgcHRfcmVncy4KLSAqLwotaW50IGtlcm5lbF9leGVjdmUoY29uc3QgY2hhciAqZmlsZW5hbWUsIGNoYXIgKmNvbnN0IGFyZ3ZbXSwgY2hhciAqY29uc3QgZW52cFtdKQotewotCXJlZ2lzdGVyIGNvbnN0IGNoYXIgKl9fYXJnMSBhc20oIjIiKSA9IGZpbGVuYW1lOwotCXJlZ2lzdGVyIGNoYXIgKmNvbnN0Kl9fYXJnMiBhc20oIjMiKSA9IGFyZ3Y7Ci0JcmVnaXN0ZXIgY2hhciAqY29uc3QqX19hcmczIGFzbSgiNCIpID0gZW52cDsKLQlyZWdpc3RlciBsb25nIF9fc3ZjcmVzIGFzbSgiMiIpOwotCWFzbSB2b2xhdGlsZSgKLQkJInN2YyAlYjEiCi0JCTogIj1kIiAoX19zdmNyZXMpCi0JCTogImkiIChfX05SX2V4ZWN2ZSksCi0JCSAgIjAiIChfX2FyZzEpLAotCQkgICJkIiAoX19hcmcyKSwKLQkJICAiZCIgKF9fYXJnMykgOiAibWVtb3J5Iik7Ci0JcmV0dXJuIF9fc3ZjcmVzOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9zeXNjYWxscy5TIGIvYXJjaC9zMzkwL2tlcm5lbC9zeXNjYWxscy5TCmluZGV4IGM3NzRmMTAuLmNkOGQzMjEgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvc3lzY2FsbHMuUworKysgYi9hcmNoL3MzOTAva2VybmVsL3N5c2NhbGxzLlMKQEAgLTEwLDcgKzEwLDcgQEAKIAogTklfU1lTQ0FMTAkJCQkJCQkvKiAwICovCiBTWVNDQUxMKHN5c19leGl0LHN5c19leGl0LHN5czMyX2V4aXRfd3JhcHBlcikKLVNZU0NBTEwoc3lzX2ZvcmtfZ2x1ZSxzeXNfZm9ya19nbHVlLHN5c19mb3JrX2dsdWUpCitTWVNDQUxMKHN5c19mb3JrLHN5c19mb3JrLHN5c19mb3JrKQogU1lTQ0FMTChzeXNfcmVhZCxzeXNfcmVhZCxzeXMzMl9yZWFkX3dyYXBwZXIpCiBTWVNDQUxMKHN5c193cml0ZSxzeXNfd3JpdGUsc3lzMzJfd3JpdGVfd3JhcHBlcikKIFNZU0NBTEwoc3lzX29wZW4sc3lzX29wZW4sc3lzMzJfb3Blbl93cmFwcGVyKQkJCS8qIDUgKi8KQEAgLTE5LDcgKzE5LDcgQEAKIFNZU0NBTEwoc3lzX2NyZWF0LHN5c19jcmVhdCxzeXMzMl9jcmVhdF93cmFwcGVyKQogU1lTQ0FMTChzeXNfbGluayxzeXNfbGluayxzeXMzMl9saW5rX3dyYXBwZXIpCiBTWVNDQUxMKHN5c191bmxpbmssc3lzX3VubGluayxzeXMzMl91bmxpbmtfd3JhcHBlcikJCS8qIDEwICovCi1TWVNDQUxMKHN5c19leGVjdmVfZ2x1ZSxzeXNfZXhlY3ZlX2dsdWUsc3lzMzJfZXhlY3ZlX2dsdWUpCitTWVNDQUxMKHN5c19leGVjdmUsc3lzX2V4ZWN2ZSxzeXMzMl9leGVjdmUpCiBTWVNDQUxMKHN5c19jaGRpcixzeXNfY2hkaXIsc3lzMzJfY2hkaXJfd3JhcHBlcikKIFNZU0NBTEwoc3lzX3RpbWUsc3lzX25pX3N5c2NhbGwsc3lzMzJfdGltZV93cmFwcGVyKQkJLyogb2xkIHRpbWUgc3lzY2FsbCAqLwogU1lTQ0FMTChzeXNfbWtub2Qsc3lzX21rbm9kLHN5czMyX21rbm9kX3dyYXBwZXIpCkBAIC0xMjcsOCArMTI3LDggQEAKIFNZU0NBTEwoc3lzX3N5c2luZm8sc3lzX3N5c2luZm8sY29tcGF0X3N5c19zeXNpbmZvX3dyYXBwZXIpCiBTWVNDQUxMKHN5c19pcGMsc3lzX2lwYyxzeXMzMl9pcGNfd3JhcHBlcikKIFNZU0NBTEwoc3lzX2ZzeW5jLHN5c19mc3luYyxzeXMzMl9mc3luY193cmFwcGVyKQotU1lTQ0FMTChzeXNfc2lncmV0dXJuX2dsdWUsc3lzX3NpZ3JldHVybl9nbHVlLHN5czMyX3NpZ3JldHVybl9nbHVlKQotU1lTQ0FMTChzeXNfY2xvbmVfZ2x1ZSxzeXNfY2xvbmVfZ2x1ZSxzeXMzMl9jbG9uZV9nbHVlKQkJLyogMTIwICovCitTWVNDQUxMKHN5c19zaWdyZXR1cm4sc3lzX3NpZ3JldHVybixzeXMzMl9zaWdyZXR1cm4pCitTWVNDQUxMKHN5c19jbG9uZSxzeXNfY2xvbmUsc3lzMzJfY2xvbmUpCQkJLyogMTIwICovCiBTWVNDQUxMKHN5c19zZXRkb21haW5uYW1lLHN5c19zZXRkb21haW5uYW1lLHN5czMyX3NldGRvbWFpbm5hbWVfd3JhcHBlcikKIFNZU0NBTEwoc3lzX25ld3VuYW1lLHMzOTB4X25ld3VuYW1lLHN5czMyX25ld3VuYW1lX3dyYXBwZXIpCiBOSV9TWVNDQUxMCQkJCQkJCS8qIG1vZGlmeV9sZHQgZm9yIGkzODYgKi8KQEAgLTE4MSw3ICsxODEsNyBAQAogU1lTQ0FMTChzeXNfc2V0cmVzZ2lkMTYsc3lzX25pX3N5c2NhbGwsc3lzMzJfc2V0cmVzZ2lkMTZfd3JhcHBlcikJLyogMTcwIG9sZCBzZXRyZXNnaWQxNiBzeXNjYWxsICovCiBTWVNDQUxMKHN5c19nZXRyZXNnaWQxNixzeXNfbmlfc3lzY2FsbCxzeXMzMl9nZXRyZXNnaWQxNl93cmFwcGVyKQkvKiBvbGQgZ2V0cmVzZ2lkMTYgc3lzY2FsbCAqLwogU1lTQ0FMTChzeXNfcHJjdGwsc3lzX3ByY3RsLHN5czMyX3ByY3RsX3dyYXBwZXIpCi1TWVNDQUxMKHN5c19ydF9zaWdyZXR1cm5fZ2x1ZSxzeXNfcnRfc2lncmV0dXJuX2dsdWUsc3lzMzJfcnRfc2lncmV0dXJuX2dsdWUpCitTWVNDQUxMKHN5c19ydF9zaWdyZXR1cm4sc3lzX3J0X3NpZ3JldHVybixzeXMzMl9ydF9zaWdyZXR1cm4pCiBTWVNDQUxMKHN5c19ydF9zaWdhY3Rpb24sc3lzX3J0X3NpZ2FjdGlvbixzeXMzMl9ydF9zaWdhY3Rpb25fd3JhcHBlcikKIFNZU0NBTEwoc3lzX3J0X3NpZ3Byb2NtYXNrLHN5c19ydF9zaWdwcm9jbWFzayxzeXMzMl9ydF9zaWdwcm9jbWFza193cmFwcGVyKQkvKiAxNzUgKi8KIFNZU0NBTEwoc3lzX3J0X3NpZ3BlbmRpbmcsc3lzX3J0X3NpZ3BlbmRpbmcsc3lzMzJfcnRfc2lncGVuZGluZ193cmFwcGVyKQpAQCAtMTk0LDExICsxOTQsMTEgQEAKIFNZU0NBTEwoc3lzX2dldGN3ZCxzeXNfZ2V0Y3dkLHN5czMyX2dldGN3ZF93cmFwcGVyKQogU1lTQ0FMTChzeXNfY2FwZ2V0LHN5c19jYXBnZXQsc3lzMzJfY2FwZ2V0X3dyYXBwZXIpCiBTWVNDQUxMKHN5c19jYXBzZXQsc3lzX2NhcHNldCxzeXMzMl9jYXBzZXRfd3JhcHBlcikJCS8qIDE4NSAqLwotU1lTQ0FMTChzeXNfc2lnYWx0c3RhY2tfZ2x1ZSxzeXNfc2lnYWx0c3RhY2tfZ2x1ZSxzeXMzMl9zaWdhbHRzdGFja19nbHVlKQorU1lTQ0FMTChzeXNfc2lnYWx0c3RhY2ssc3lzX3NpZ2FsdHN0YWNrLHN5czMyX3NpZ2FsdHN0YWNrKQogU1lTQ0FMTChzeXNfc2VuZGZpbGUsc3lzX3NlbmRmaWxlNjQsc3lzMzJfc2VuZGZpbGVfd3JhcHBlcikKIE5JX1NZU0NBTEwJCQkJCQkJLyogc3RyZWFtczEgKi8KIE5JX1NZU0NBTEwJCQkJCQkJLyogc3RyZWFtczIgKi8KLVNZU0NBTEwoc3lzX3Zmb3JrX2dsdWUsc3lzX3Zmb3JrX2dsdWUsc3lzX3Zmb3JrX2dsdWUpCQkvKiAxOTAgKi8KK1NZU0NBTEwoc3lzX3Zmb3JrLHN5c192Zm9yayxzeXNfdmZvcmspCQkJCS8qIDE5MCAqLwogU1lTQ0FMTChzeXNfZ2V0cmxpbWl0LHN5c19nZXRybGltaXQsY29tcGF0X3N5c19nZXRybGltaXRfd3JhcHBlcikKIFNZU0NBTEwoc3lzX21tYXAyLHN5c19tbWFwMixzeXMzMl9tbWFwMl93cmFwcGVyKQogU1lTQ0FMTChzeXNfdHJ1bmNhdGU2NCxzeXNfbmlfc3lzY2FsbCxzeXMzMl90cnVuY2F0ZTY0X3dyYXBwZXIpCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3RpbWUuYyBiL2FyY2gvczM5MC9rZXJuZWwvdGltZS5jCmluZGV4IGUxYWQ0NjQuLjcxMWRhZTggMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvdGltZS5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvdGltZS5jCkBAIC0yODAsNyArMjgwLDYgQEAKIH0KIAogc3RhdGljIHZvaWQgZXRyX3Jlc2V0KHZvaWQpOwotc3RhdGljIHZvaWQgZXRyX2luaXQodm9pZCk7CiBzdGF0aWMgdm9pZCBldHJfZXh0X2hhbmRsZXIoX191MTYpOwogCiAvKgpAQCAtMzU1LDcgKzM1NCw2IEBACiAjaWZkZWYgQ09ORklHX1ZJUlRfVElNRVIKIAl2dGltZV9pbml0KCk7CiAjZW5kaWYKLQlldHJfaW5pdCgpOwogfQogCiAvKgpAQCAtNDI2LDExICs0MjQsMTEgQEAKIHN0YXRpYyBpbnQgZXRyX3BvcnQxX3VwdG9kYXRlOwogc3RhdGljIHVuc2lnbmVkIGxvbmcgZXRyX2V2ZW50czsKIHN0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBldHJfdGltZXI7Ci1zdGF0aWMgc3RydWN0IHRhc2tsZXRfc3RydWN0IGV0cl90YXNrbGV0Owogc3RhdGljIERFRklORV9QRVJfQ1BVKGF0b21pY190LCBldHJfc3luY193b3JkKTsKIAogc3RhdGljIHZvaWQgZXRyX3RpbWVvdXQodW5zaWduZWQgbG9uZyBkdW1teSk7Ci1zdGF0aWMgdm9pZCBldHJfdGFza2xldF9mbih1bnNpZ25lZCBsb25nIGR1bW15KTsKK3N0YXRpYyB2b2lkIGV0cl93b3JrX2ZuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CitzdGF0aWMgREVDTEFSRV9XT1JLKGV0cl93b3JrLCBldHJfd29ya19mbik7CiAKIC8qCiAgKiBUaGUgZXRyIGdldF9jbG9jayBmdW5jdGlvbi4gSXQgd2lsbCB3cml0ZSB0aGUgY3VycmVudCBjbG9jayB2YWx1ZQpAQCAtNTA3LDI5ICs1MDUsMzEgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGV0cl9pbml0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBldHJfaW5pdCh2b2lkKQogewogCXN0cnVjdCBldHJfYWliIGFpYjsKIAogCWlmICh0ZXN0X2JpdChFVFJfRkxBR19FTk9TWVMsICZldHJfZmxhZ3MpKQotCQlyZXR1cm47CisJCXJldHVybiAwOwogCS8qIENoZWNrIGlmIHRoaXMgbWFjaGluZSBoYXMgdGhlIHN0ZWFpIGluc3RydWN0aW9uLiAqLwogCWlmIChldHJfc3RlYWkoJmFpYiwgRVRSX1NURUFJX1NURVBQSU5HX1BPUlQpID09IDApCiAJCXNldF9iaXQoRVRSX0ZMQUdfU1RFQUksICZldHJfZmxhZ3MpOwogCXNldHVwX3RpbWVyKCZldHJfdGltZXIsIGV0cl90aW1lb3V0LCAwVUwpOwotCXRhc2tsZXRfaW5pdCgmZXRyX3Rhc2tsZXQsIGV0cl90YXNrbGV0X2ZuLCAwKTsKIAlpZiAoIWV0cl9wb3J0MF9vbmxpbmUgJiYgIWV0cl9wb3J0MV9vbmxpbmUpCiAJCXNldF9iaXQoRVRSX0ZMQUdfRUFDQ0VTLCAmZXRyX2ZsYWdzKTsKIAlpZiAoZXRyX3BvcnQwX29ubGluZSkgewogCQlzZXRfYml0KEVUUl9FVkVOVF9QT1JUMF9DSEFOR0UsICZldHJfZXZlbnRzKTsKLQkJdGFza2xldF9oaV9zY2hlZHVsZSgmZXRyX3Rhc2tsZXQpOworCQlzY2hlZHVsZV93b3JrKCZldHJfd29yayk7CiAJfQogCWlmIChldHJfcG9ydDFfb25saW5lKSB7CiAJCXNldF9iaXQoRVRSX0VWRU5UX1BPUlQxX0NIQU5HRSwgJmV0cl9ldmVudHMpOwotCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZldHJfdGFza2xldCk7CisJCXNjaGVkdWxlX3dvcmsoJmV0cl93b3JrKTsKIAl9CisJcmV0dXJuIDA7CiB9CiAKK2FyY2hfaW5pdGNhbGwoZXRyX2luaXQpOworCiAvKgogICogVHdvIHNvcnRzIG9mIEVUUiBtYWNoaW5lIGNoZWNrcy4gVGhlIGFyY2hpdGVjdHVyZSByZWFkczoKICAqICJXaGVuIGEgbWFjaGluZS1jaGVjayBuaXRlcnJ1cHRpb24gb2NjdXJzIGFuZCBpZiBhIHN3aXRjaC10by1sb2NhbCBvcgpAQCAtNTQ5LDcgKzU0OSw3IEBACiAJCXJldHVybjsKIAlldHJfZGlzYWJsZV9zeW5jX2Nsb2NrKE5VTEwpOwogCXNldF9iaXQoRVRSX0VWRU5UX1NXSVRDSF9MT0NBTCwgJmV0cl9ldmVudHMpOwotCXRhc2tsZXRfaGlfc2NoZWR1bGUoJmV0cl90YXNrbGV0KTsKKwlzY2hlZHVsZV93b3JrKCZldHJfd29yayk7CiB9CiAKIC8qCkBAIC01NjQsNyArNTY0LDcgQEAKIAkJcmV0dXJuOwogCWV0cl9kaXNhYmxlX3N5bmNfY2xvY2soTlVMTCk7CiAJc2V0X2JpdChFVFJfRVZFTlRfU1lOQ19DSEVDSywgJmV0cl9ldmVudHMpOwotCXRhc2tsZXRfaGlfc2NoZWR1bGUoJmV0cl90YXNrbGV0KTsKKwlzY2hlZHVsZV93b3JrKCZldHJfd29yayk7CiB9CiAKIC8qCkBAIC01OTEsMTMgKzU5MSwxMyBAQAogCQkgKiBCb3RoIHBvcnRzIGFyZSBub3QgdXAtdG8tZGF0ZSBub3cuCiAJCSAqLwogCQlzZXRfYml0KEVUUl9FVkVOVF9QT1JUX0FMRVJULCAmZXRyX2V2ZW50cyk7Ci0JdGFza2xldF9oaV9zY2hlZHVsZSgmZXRyX3Rhc2tsZXQpOworCXNjaGVkdWxlX3dvcmsoJmV0cl93b3JrKTsKIH0KIAogc3RhdGljIHZvaWQgZXRyX3RpbWVvdXQodW5zaWduZWQgbG9uZyBkdW1teSkKIHsKIAlzZXRfYml0KEVUUl9FVkVOVF9VUERBVEUsICZldHJfZXZlbnRzKTsKLQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZldHJfdGFza2xldCk7CisJc2NoZWR1bGVfd29yaygmZXRyX3dvcmspOwogfQogCiAvKgpAQCAtOTI3LDcgKzkyNyw3IEBACiAJaWYgKCFlYWNyLmUwICYmICFlYWNyLmUxKQogCQlyZXR1cm4gZWFjcjsKIAotCS8qIFVwZGF0ZSBwb3J0MCBvciBwb3J0MSB3aXRoIGFpYiBzdG9yZWQgaW4gZXRyX3Rhc2tsZXRfZm4uICovCisJLyogVXBkYXRlIHBvcnQwIG9yIHBvcnQxIHdpdGggYWliIHN0b3JlZCBpbiBldHJfd29ya19mbi4gKi8KIAlpZiAoYWliLT5lc3cucSA9PSAwKSB7CiAJCS8qIEluZm9ybWF0aW9uIGZvciBwb3J0IDAgc3RvcmVkLiAqLwogCQlpZiAoZWFjci5wMCAmJiAhZXRyX3BvcnQwX3VwdG9kYXRlKSB7CkBAIC0xMDA3LDcgKzEwMDcsNyBAQAogICogcGFydGljdWxhciB0aGlzIGlzIHRoZSBvbmx5IGZ1bmN0aW9uIHRoYXQgY2FsbHMgZXRyX3VwZGF0ZV9lYWNyKCksCiAgKiBpdCAiY29udHJvbHMiIHRoZSBldHIgY29udHJvbCByZWdpc3Rlci4KICAqLwotc3RhdGljIHZvaWQgZXRyX3Rhc2tsZXRfZm4odW5zaWduZWQgbG9uZyBkdW1teSkKK3N0YXRpYyB2b2lkIGV0cl93b3JrX2ZuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAl1bnNpZ25lZCBsb25nIGxvbmcgbm93OwogCXN0cnVjdCBldHJfZWFjciBlYWNyOwpAQCAtMTIyMCwxMyArMTIyMCwxMyBAQAogCQkJcmV0dXJuIGNvdW50OwkvKiBOb3RoaW5nIHRvIGRvLiAqLwogCQlldHJfcG9ydDBfb25saW5lID0gdmFsdWU7CiAJCXNldF9iaXQoRVRSX0VWRU5UX1BPUlQwX0NIQU5HRSwgJmV0cl9ldmVudHMpOwotCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZldHJfdGFza2xldCk7CisJCXNjaGVkdWxlX3dvcmsoJmV0cl93b3JrKTsKIAl9IGVsc2UgewogCQlpZiAoZXRyX3BvcnQxX29ubGluZSA9PSB2YWx1ZSkKIAkJCXJldHVybiBjb3VudDsJLyogTm90aGluZyB0byBkby4gKi8KIAkJZXRyX3BvcnQxX29ubGluZSA9IHZhbHVlOwogCQlzZXRfYml0KEVUUl9FVkVOVF9QT1JUMV9DSEFOR0UsICZldHJfZXZlbnRzKTsKLQkJdGFza2xldF9oaV9zY2hlZHVsZSgmZXRyX3Rhc2tsZXQpOworCQlzY2hlZHVsZV93b3JrKCZldHJfd29yayk7CiAJfQogCXJldHVybiBjb3VudDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvczM5MC9rZXJuZWwvdHJhcHMuYwppbmRleCBmMGU1YTMyLi40OWRlYzgzIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC90cmFwcy5jCkBAIC0zMCw3ICszMCw3IEBACiAjaW5jbHVkZSA8bGludXgva2FsbHN5bXMuaD4KICNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KICNpbmNsdWRlIDxsaW51eC9rcHJvYmVzLmg+Ci0KKyNpbmNsdWRlIDxsaW51eC9idWcuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KQEAgLTE4OCwxOCArMTg4LDMxIEBACiAKIEVYUE9SVF9TWU1CT0woZHVtcF9zdGFjayk7CiAKK3N0YXRpYyBpbmxpbmUgaW50IG1hc2tfYml0cyhzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgbG9uZyBiaXRzKQoreworCXJldHVybiAocmVncy0+cHN3Lm1hc2sgJiBiaXRzKSAvICgofmJpdHMgKyAxKSAmIGJpdHMpOworfQorCiB2b2lkIHNob3dfcmVnaXN0ZXJzKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCW1tX3NlZ21lbnRfdCBvbGRfZnM7CiAJY2hhciAqbW9kZTsKLQlpbnQgaTsKIAogCW1vZGUgPSAocmVncy0+cHN3Lm1hc2sgJiBQU1dfTUFTS19QU1RBVEUpID8gIlVzZXIiIDogIktybmwiOwogCXByaW50aygiJXMgUFNXIDogJXAgJXAiLAogCSAgICAgICBtb2RlLCAodm9pZCAqKSByZWdzLT5wc3cubWFzaywKIAkgICAgICAgKHZvaWQgKikgcmVncy0+cHN3LmFkZHIpOwogCXByaW50X3N5bWJvbCgiICglcylcbiIsIHJlZ3MtPnBzdy5hZGRyICYgUFNXX0FERFJfSU5TTik7Ci0JcHJpbnRrKCIlcyBHUFJTOiAiIEZPVVJMT05HLCBtb2RlLAorCXByaW50aygiICAgICAgICAgICBSOiV4IFQ6JXggSU86JXggRVg6JXggS2V5OiV4IE06JXggVzoleCAiCisJICAgICAgICJQOiV4IEFTOiV4IENDOiV4IFBNOiV4IiwgbWFza19iaXRzKHJlZ3MsIFBTV19NQVNLX1BFUiksCisJICAgICAgIG1hc2tfYml0cyhyZWdzLCBQU1dfTUFTS19EQVQpLCBtYXNrX2JpdHMocmVncywgUFNXX01BU0tfSU8pLAorCSAgICAgICBtYXNrX2JpdHMocmVncywgUFNXX01BU0tfRVhUKSwgbWFza19iaXRzKHJlZ3MsIFBTV19NQVNLX0tFWSksCisJICAgICAgIG1hc2tfYml0cyhyZWdzLCBQU1dfTUFTS19NQ0hFQ0spLCBtYXNrX2JpdHMocmVncywgUFNXX01BU0tfV0FJVCksCisJICAgICAgIG1hc2tfYml0cyhyZWdzLCBQU1dfTUFTS19QU1RBVEUpLCBtYXNrX2JpdHMocmVncywgUFNXX01BU0tfQVNDKSwKKwkgICAgICAgbWFza19iaXRzKHJlZ3MsIFBTV19NQVNLX0NDKSwgbWFza19iaXRzKHJlZ3MsIFBTV19NQVNLX1BNKSk7CisjaWZkZWYgQ09ORklHXzY0QklUCisJcHJpbnRrKCIgRUE6JXgiLCBtYXNrX2JpdHMocmVncywgUFNXX0JBU0VfQklUUykpOworI2VuZGlmCisJcHJpbnRrKCJcbiVzIEdQUlM6ICIgRk9VUkxPTkcsIG1vZGUsCiAJICAgICAgIHJlZ3MtPmdwcnNbMF0sIHJlZ3MtPmdwcnNbMV0sIHJlZ3MtPmdwcnNbMl0sIHJlZ3MtPmdwcnNbM10pOwogCXByaW50aygiICAgICAgICAgICAiIEZPVVJMT05HLAogCSAgICAgICByZWdzLT5ncHJzWzRdLCByZWdzLT5ncHJzWzVdLCByZWdzLT5ncHJzWzZdLCByZWdzLT5ncHJzWzddKTsKQEAgLTIwOCw0MSArMjIxLDcgQEAKIAlwcmludGsoIiAgICAgICAgICAgIiBGT1VSTE9ORywKIAkgICAgICAgcmVncy0+Z3Byc1sxMl0sIHJlZ3MtPmdwcnNbMTNdLCByZWdzLT5ncHJzWzE0XSwgcmVncy0+Z3Byc1sxNV0pOwogCi0jaWYgMAotCS8qIEZJWE1FOiB0aGlzIGlzbid0IG5lZWRlZCBhbnkgbW9yZSBidXQgaXQgY2hhbmdlcyB0aGUga3N5bW9vcHMKLQkgKiBpbnB1dC4gVG8gcmVtb3ZlIG9yIG5vdCB0byByZW1vdmUgLi4uICovCi0Jc2F2ZV9hY2Nlc3NfcmVncyhyZWdzLT5hY3JzKTsKLQlwcmludGsoIiVzIEFDUlM6ICUwOHggJTA4eCAlMDh4ICUwOHhcbiIsIG1vZGUsCi0JICAgICAgIHJlZ3MtPmFjcnNbMF0sIHJlZ3MtPmFjcnNbMV0sIHJlZ3MtPmFjcnNbMl0sIHJlZ3MtPmFjcnNbM10pOwotCXByaW50aygiICAgICAgICAgICAlMDh4ICUwOHggJTA4eCAlMDh4XG4iLAotCSAgICAgICByZWdzLT5hY3JzWzRdLCByZWdzLT5hY3JzWzVdLCByZWdzLT5hY3JzWzZdLCByZWdzLT5hY3JzWzddKTsKLQlwcmludGsoIiAgICAgICAgICAgJTA4eCAlMDh4ICUwOHggJTA4eFxuIiwKLQkgICAgICAgcmVncy0+YWNyc1s4XSwgcmVncy0+YWNyc1s5XSwgcmVncy0+YWNyc1sxMF0sIHJlZ3MtPmFjcnNbMTFdKTsKLQlwcmludGsoIiAgICAgICAgICAgJTA4eCAlMDh4ICUwOHggJTA4eFxuIiwKLQkgICAgICAgcmVncy0+YWNyc1sxMl0sIHJlZ3MtPmFjcnNbMTNdLCByZWdzLT5hY3JzWzE0XSwgcmVncy0+YWNyc1sxNV0pOwotI2VuZGlmCi0KLQkvKgotCSAqIFByaW50IHRoZSBmaXJzdCAyMCBieXRlIG9mIHRoZSBpbnN0cnVjdGlvbiBzdHJlYW0gYXQgdGhlCi0JICogdGltZSBvZiB0aGUgZmF1bHQuCi0JICovCi0Jb2xkX2ZzID0gZ2V0X2ZzKCk7Ci0JaWYgKHJlZ3MtPnBzdy5tYXNrICYgUFNXX01BU0tfUFNUQVRFKQotCQlzZXRfZnMoVVNFUl9EUyk7Ci0JZWxzZQotCQlzZXRfZnMoS0VSTkVMX0RTKTsKLQlwcmludGsoIiVzIENvZGU6ICIsIG1vZGUpOwotCWZvciAoaSA9IDA7IGkgPCAyMDsgaSsrKSB7Ci0JCXVuc2lnbmVkIGNoYXIgYzsKLQkJaWYgKF9fZ2V0X3VzZXIoYywgKGNoYXIgX191c2VyICopKHJlZ3MtPnBzdy5hZGRyICsgaSkpKSB7Ci0JCQlwcmludGsoIiBCYWQgUFNXLiIpOwotCQkJYnJlYWs7Ci0JCX0KLQkJcHJpbnRrKCIlMDJ4ICIsIGMpOwotCX0KLQlzZXRfZnMob2xkX2ZzKTsKLQotCXByaW50aygiXG4iKTsKKwlzaG93X2NvZGUocmVncyk7CiB9CQogCiAvKiBUaGlzIGlzIGNhbGxlZCBmcm9tIGZzL3Byb2MvYXJyYXkuYyAqLwpAQCAtMzE4LDYgKzI5NywxMSBAQAogI2VuZGlmCiB9CiAKK2ludCBpc192YWxpZF9idWdhZGRyKHVuc2lnbmVkIGxvbmcgYWRkcikKK3sKKwlyZXR1cm4gMTsKK30KKwogc3RhdGljIHZvaWQgX19rcHJvYmVzIGlubGluZSBkb190cmFwKGxvbmcgaW50ZXJydXB0aW9uX2NvZGUsIGludCBzaWduciwKIAkJCQkJY2hhciAqc3RyLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywKIAkJCQkJc2lnaW5mb190ICppbmZvKQpAQCAtMzQ0LDggKzMyOCwxNCBAQAogICAgICAgICAgICAgICAgIGZpeHVwID0gc2VhcmNoX2V4Y2VwdGlvbl90YWJsZXMocmVncy0+cHN3LmFkZHIgJiBQU1dfQUREUl9JTlNOKTsKICAgICAgICAgICAgICAgICBpZiAoZml4dXApCiAgICAgICAgICAgICAgICAgICAgICAgICByZWdzLT5wc3cuYWRkciA9IGZpeHVwLT5maXh1cCB8IFBTV19BRERSX0FNT0RFOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGRpZShzdHIsIHJlZ3MsIGludGVycnVwdGlvbl9jb2RlKTsKKwkJZWxzZSB7CisJCQllbnVtIGJ1Z190cmFwX3R5cGUgYnR0OworCisJCQlidHQgPSByZXBvcnRfYnVnKHJlZ3MtPnBzdy5hZGRyICYgUFNXX0FERFJfSU5TTik7CisJCQlpZiAoYnR0ID09IEJVR19UUkFQX1RZUEVfV0FSTikKKwkJCQlyZXR1cm47CisJCQlkaWUoc3RyLCByZWdzLCBpbnRlcnJ1cHRpb25fY29kZSk7CisJCX0KICAgICAgICAgfQogfQogCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3ZtbGludXgubGRzLlMgYi9hcmNoL3MzOTAva2VybmVsL3ZtbGludXgubGRzLlMKaW5kZXggYzMwNzE2YS4uNDE4ZjY0MiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC92bWxpbnV4Lmxkcy5TCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvdm1saW51eC5sZHMuUwpAQCAtNDUsNiArNDUsOCBAQAogICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KICAgX19zdG9wX19fZXhfdGFibGUgPSAuOwogCisgIEJVR19UQUJMRQorCiAgIC5kYXRhIDogewkJCS8qIERhdGEgKi8KIAkqKC5kYXRhKQogCUNPTlNUUlVDVE9SUwpAQCAtNzcsNiArNzksMTIgQEAKIAkqKC5pbml0LnRleHQpCiAJX2Vpbml0dGV4dCA9IC47CiAgIH0KKyAgLyoKKyAgICogLmV4aXQudGV4dCBpcyBkaXNjYXJkZWQgYXQgcnVudGltZSwgbm90IGxpbmsgdGltZSwKKyAgICogdG8gZGVhbCB3aXRoIHJlZmVyZW5jZXMgZnJvbSBfX2J1Z190YWJsZQorICAgKi8KKyAgLmV4aXQudGV4dCA6CSB7ICooLmV4aXQudGV4dCkgfQorCiAgIC5pbml0LmRhdGEgOiB7ICooLmluaXQuZGF0YSkgfQogICAuID0gQUxJR04oMjU2KTsKICAgX19zZXR1cF9zdGFydCA9IC47CkBAIC0xMTYsNyArMTI0LDcgQEAKIAogICAvKiBTZWN0aW9ucyB0byBiZSBkaXNjYXJkZWQgKi8KICAgL0RJU0NBUkQvIDogewotCSooLmV4aXQudGV4dCkgKiguZXhpdC5kYXRhKSAqKC5leGl0Y2FsbC5leGl0KQorCSooLmV4aXQuZGF0YSkgKiguZXhpdGNhbGwuZXhpdCkKIAl9CiAKICAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvdnRpbWUuYyBiL2FyY2gvczM5MC9rZXJuZWwvdnRpbWUuYwppbmRleCA5ZDViMDI4Li4xZTFhNmVlIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3Z0aW1lLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC92dGltZS5jCkBAIC0xMjgsNyArMTI4LDcgQEAKIAlTMzkwX2xvd2NvcmUubGFzdF91cGRhdGVfdGltZXIgPSBleHBpcmVzOwogCiAJLyogc3RvcmUgZXhwaXJlIHRpbWUgZm9yIHRoaXMgQ1BVIHRpbWVyICovCi0JcGVyX2NwdSh2aXJ0X2NwdV90aW1lciwgc21wX3Byb2Nlc3Nvcl9pZCgpKS50b19leHBpcmUgPSBleHBpcmVzOworCV9fZ2V0X2NwdV92YXIodmlydF9jcHVfdGltZXIpLnRvX2V4cGlyZSA9IGV4cGlyZXM7CiB9CiAjZWxzZQogc3RhdGljIGlubGluZSB2b2lkIHNldF92dGltZXIoX191NjQgZXhwaXJlcykKQEAgLTEzNyw3ICsxMzcsNyBAQAogCWFzbSB2b2xhdGlsZSAoIlNQVCAlMCIgOiA6ICJtIiAoUzM5MF9sb3djb3JlLmxhc3RfdXBkYXRlX3RpbWVyKSk7CiAKIAkvKiBzdG9yZSBleHBpcmUgdGltZSBmb3IgdGhpcyBDUFUgdGltZXIgKi8KLQlwZXJfY3B1KHZpcnRfY3B1X3RpbWVyLCBzbXBfcHJvY2Vzc29yX2lkKCkpLnRvX2V4cGlyZSA9IGV4cGlyZXM7CisJX19nZXRfY3B1X3Zhcih2aXJ0X2NwdV90aW1lcikudG9fZXhwaXJlID0gZXhwaXJlczsKIH0KICNlbmRpZgogCkBAIC0xNDUsNyArMTQ1LDcgQEAKIHsKIAlzdHJ1Y3QgdnRpbWVyX3F1ZXVlICp2dF9saXN0OwogCi0JdnRfbGlzdCA9ICZwZXJfY3B1KHZpcnRfY3B1X3RpbWVyLCBzbXBfcHJvY2Vzc29yX2lkKCkpOworCXZ0X2xpc3QgPSAmX19nZXRfY3B1X3Zhcih2aXJ0X2NwdV90aW1lcik7CiAKIAkvKiBDUFUgdGltZXIgaW50ZXJydXB0IGlzIHBlbmRpbmcsIGRvbid0IHJlcHJvZ3JhbW0gaXQgKi8KIAlpZiAodnRfbGlzdC0+aWRsZSAmIDFMTDw8NjMpCkBAIC0xNTksNyArMTU5LDcgQEAKIHsKIAlzdHJ1Y3QgdnRpbWVyX3F1ZXVlICp2dF9saXN0OwogCi0JdnRfbGlzdCA9ICZwZXJfY3B1KHZpcnRfY3B1X3RpbWVyLCBzbXBfcHJvY2Vzc29yX2lkKCkpOworCXZ0X2xpc3QgPSAmX19nZXRfY3B1X3Zhcih2aXJ0X2NwdV90aW1lcik7CiAKIAkvKiBub3RoaW5nIHRvIGRvICovCiAJaWYgKGxpc3RfZW1wdHkoJnZ0X2xpc3QtPmxpc3QpKSB7CkBAIC0yMTksNyArMjE5LDcgQEAKIAlpZiAobGlzdF9lbXB0eShjYl9saXN0KSkKIAkJcmV0dXJuOwogCi0JdnRfbGlzdCA9ICZwZXJfY3B1KHZpcnRfY3B1X3RpbWVyLCBzbXBfcHJvY2Vzc29yX2lkKCkpOworCXZ0X2xpc3QgPSAmX19nZXRfY3B1X3Zhcih2aXJ0X2NwdV90aW1lcik7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZXZlbnQsIHRtcCwgY2JfbGlzdCwgZW50cnkpIHsKIAkJZm4gPSBldmVudC0+ZnVuY3Rpb247CkBAIC0yNDQsNyArMjQ0LDYgQEAKICAqLwogc3RhdGljIHZvaWQgZG9fY3B1X3RpbWVyX2ludGVycnVwdChfX3UxNiBlcnJvcl9jb2RlKQogewotCWludCBjcHU7CiAJX191NjQgbmV4dCwgZGVsdGE7CiAJc3RydWN0IHZ0aW1lcl9xdWV1ZSAqdnRfbGlzdDsKIAlzdHJ1Y3QgdnRpbWVyX2xpc3QgKmV2ZW50LCAqdG1wOwpAQCAtMjUzLDggKzI1Miw3IEBACiAJc3RydWN0IGxpc3RfaGVhZCBjYl9saXN0OwogCiAJSU5JVF9MSVNUX0hFQUQoJmNiX2xpc3QpOwotCWNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQl2dF9saXN0ID0gJnBlcl9jcHUodmlydF9jcHVfdGltZXIsIGNwdSk7CisJdnRfbGlzdCA9ICZfX2dldF9jcHVfdmFyKHZpcnRfY3B1X3RpbWVyKTsKIAogCS8qIHdhbGsgdGltZXIgbGlzdCwgZmlyZSBhbGwgZXhwaXJlZCBldmVudHMgKi8KIAlzcGluX2xvY2soJnZ0X2xpc3QtPmxvY2spOwpAQCAtNTM0LDcgKzUzMiw3IEBACiAJLyogZW5hYmxlIGNwdSB0aW1lciBpbnRlcnJ1cHRzICovCiAJX19jdGxfc2V0X2JpdCgwLDEwKTsKIAotCXZ0X2xpc3QgPSAmcGVyX2NwdSh2aXJ0X2NwdV90aW1lciwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwl2dF9saXN0ID0gJl9fZ2V0X2NwdV92YXIodmlydF9jcHVfdGltZXIpOwogCUlOSVRfTElTVF9IRUFEKCZ2dF9saXN0LT5saXN0KTsKIAlzcGluX2xvY2tfaW5pdCgmdnRfbGlzdC0+bG9jayk7CiAJdnRfbGlzdC0+dG9fZXhwaXJlID0gMDsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9saWIvTWFrZWZpbGUgYi9hcmNoL3MzOTAvbGliL01ha2VmaWxlCmluZGV4IDdhNDRmZWQuLjU5YWVhNjUgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9saWIvTWFrZWZpbGUKKysrIGIvYXJjaC9zMzkwL2xpYi9NYWtlZmlsZQpAQCAtNSw2ICs1LDYgQEAKIEVYVFJBX0FGTEFHUyA6PSAtdHJhZGl0aW9uYWwKIAogbGliLXkgKz0gZGVsYXkubyBzdHJpbmcubyB1YWNjZXNzX3N0ZC5vIHVhY2Nlc3NfcHQubyBxcm5uZC5vCi1saWItJChDT05GSUdfMzJCSVQpICs9IGRpdjY0Lm8KK29iai0kKENPTkZJR18zMkJJVCkgKz0gZGl2NjQubwogbGliLSQoQ09ORklHXzY0QklUKSArPSB1YWNjZXNzX212Y29zLm8KIGxpYi0kKENPTkZJR19TTVApICs9IHNwaW5sb2NrLm8KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9saWIvZGl2NjQuYyBiL2FyY2gvczM5MC9saWIvZGl2NjQuYwppbmRleCAwNDgxZjM0Li5hNWY4MzAwIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvbGliL2RpdjY0LmMKKysrIGIvYXJjaC9zMzkwL2xpYi9kaXY2NC5jCkBAIC0xNDcsNSArMTQ3LDMgQEAKIH0KIAogI2VuZGlmIC8qIE1BUkNIX0c1ICovCi0KLUVYUE9SVF9TWU1CT0woX19kaXY2NF8zMik7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvbW0vZmF1bHQuYyBiL2FyY2gvczM5MC9tbS9mYXVsdC5jCmluZGV4IDc0NjJhZWIuLjkxZjcwNWEgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9tbS9mYXVsdC5jCisrKyBiL2FyY2gvczM5MC9tbS9mYXVsdC5jCkBAIC0yNiw5ICsyNiw5IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPgogI2luY2x1ZGUgPGxpbnV4L2twcm9iZXMuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAKICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9rZGVidWcuaD4KICNpbmNsdWRlIDxhc20vczM5MF9leHQuaD4KQEAgLTUyLDM0ICs1MiwyNCBAQAogZXh0ZXJuIHZvaWQgZGllKGNvbnN0IGNoYXIgKixzdHJ1Y3QgcHRfcmVncyAqLGxvbmcpOwogCiAjaWZkZWYgQ09ORklHX0tQUk9CRVMKLXN0YXRpYyBBVE9NSUNfTk9USUZJRVJfSEVBRChub3RpZnlfcGFnZV9mYXVsdF9jaGFpbik7Ci1pbnQgcmVnaXN0ZXJfcGFnZV9mYXVsdF9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKQorc3RhdGljIGlubGluZSBpbnQgbm90aWZ5X3BhZ2VfZmF1bHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGxvbmcgZXJyKQogewotCXJldHVybiBhdG9taWNfbm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIoJm5vdGlmeV9wYWdlX2ZhdWx0X2NoYWluLCBuYik7Ci19CisJaW50IHJldCA9IDA7CiAKLWludCB1bnJlZ2lzdGVyX3BhZ2VfZmF1bHRfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKLXsKLQlyZXR1cm4gYXRvbWljX25vdGlmaWVyX2NoYWluX3VucmVnaXN0ZXIoJm5vdGlmeV9wYWdlX2ZhdWx0X2NoYWluLCBuYik7Ci19CisJLyoga3Byb2JlX3J1bm5pbmcoKSBuZWVkcyBzbXBfcHJvY2Vzc29yX2lkKCkgKi8KKwlpZiAoIXVzZXJfbW9kZShyZWdzKSkgeworCQlwcmVlbXB0X2Rpc2FibGUoKTsKKwkJaWYgKGtwcm9iZV9ydW5uaW5nKCkgJiYga3Byb2JlX2ZhdWx0X2hhbmRsZXIocmVncywgMTQpKQorCQkJcmV0ID0gMTsKKwkJcHJlZW1wdF9lbmFibGUoKTsKKwl9CiAKLXN0YXRpYyBpbmxpbmUgaW50IG5vdGlmeV9wYWdlX2ZhdWx0KGVudW0gZGllX3ZhbCB2YWwsIGNvbnN0IGNoYXIgKnN0ciwKLQkJCXN0cnVjdCBwdF9yZWdzICpyZWdzLCBsb25nIGVyciwgaW50IHRyYXAsIGludCBzaWcpCi17Ci0Jc3RydWN0IGRpZV9hcmdzIGFyZ3MgPSB7Ci0JCS5yZWdzID0gcmVncywKLQkJLnN0ciA9IHN0ciwKLQkJLmVyciA9IGVyciwKLQkJLnRyYXBuciA9IHRyYXAsCi0JCS5zaWduciA9IHNpZwotCX07Ci0JcmV0dXJuIGF0b21pY19ub3RpZmllcl9jYWxsX2NoYWluKCZub3RpZnlfcGFnZV9mYXVsdF9jaGFpbiwgdmFsLCAmYXJncyk7CisJcmV0dXJuIHJldDsKIH0KICNlbHNlCi1zdGF0aWMgaW5saW5lIGludCBub3RpZnlfcGFnZV9mYXVsdChlbnVtIGRpZV92YWwgdmFsLCBjb25zdCBjaGFyICpzdHIsCi0JCQlzdHJ1Y3QgcHRfcmVncyAqcmVncywgbG9uZyBlcnIsIGludCB0cmFwLCBpbnQgc2lnKQorc3RhdGljIGlubGluZSBpbnQgbm90aWZ5X3BhZ2VfZmF1bHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGxvbmcgZXJyKQogewotCXJldHVybiBOT1RJRllfRE9ORTsKKwlyZXR1cm4gMDsKIH0KICNlbmRpZgogCkBAIC0xNzAsNzQgKzE2MCwxMjcgQEAKIAlmb3JjZV9zaWdfaW5mbyhTSUdTRUdWLCAmc2ksIGN1cnJlbnQpOwogfQogCitzdGF0aWMgdm9pZCBkb19ub19jb250ZXh0KHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBsb25nIGVycm9yX2NvZGUsCisJCQkgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKK3sKKwljb25zdCBzdHJ1Y3QgZXhjZXB0aW9uX3RhYmxlX2VudHJ5ICpmaXh1cDsKKworCS8qIEFyZSB3ZSBwcmVwYXJlZCB0byBoYW5kbGUgdGhpcyBrZXJuZWwgZmF1bHQ/ICAqLworCWZpeHVwID0gc2VhcmNoX2V4Y2VwdGlvbl90YWJsZXMocmVncy0+cHN3LmFkZHIgJiBfX0ZJWFVQX01BU0spOworCWlmIChmaXh1cCkgeworCQlyZWdzLT5wc3cuYWRkciA9IGZpeHVwLT5maXh1cCB8IFBTV19BRERSX0FNT0RFOworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBPb3BzLiBUaGUga2VybmVsIHRyaWVkIHRvIGFjY2VzcyBzb21lIGJhZCBwYWdlLiBXZSdsbCBoYXZlIHRvCisJICogdGVybWluYXRlIHRoaW5ncyB3aXRoIGV4dHJlbWUgcHJlanVkaWNlLgorCSAqLworCWlmIChjaGVja19zcGFjZShjdXJyZW50KSA9PSAwKQorCQlwcmludGsoS0VSTl9BTEVSVCAiVW5hYmxlIHRvIGhhbmRsZSBrZXJuZWwgcG9pbnRlciBkZXJlZmVyZW5jZSIKKwkJICAgICAgICIgYXQgdmlydHVhbCBrZXJuZWwgYWRkcmVzcyAlcFxuIiwgKHZvaWQgKilhZGRyZXNzKTsKKwllbHNlCisJCXByaW50ayhLRVJOX0FMRVJUICJVbmFibGUgdG8gaGFuZGxlIGtlcm5lbCBwYWdpbmcgcmVxdWVzdCIKKwkJICAgICAgICIgYXQgdmlydHVhbCB1c2VyIGFkZHJlc3MgJXBcbiIsICh2b2lkICopYWRkcmVzcyk7CisKKwlkaWUoIk9vcHMiLCByZWdzLCBlcnJvcl9jb2RlKTsKKwlkb19leGl0KFNJR0tJTEwpOworfQorCitzdGF0aWMgdm9pZCBkb19sb3dfYWRkcmVzcyhzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgbG9uZyBlcnJvcl9jb2RlKQoreworCS8qIExvdy1hZGRyZXNzIHByb3RlY3Rpb24gaGl0IGluIGtlcm5lbCBtb2RlIG1lYW5zCisJICAgTlVMTCBwb2ludGVyIHdyaXRlIGFjY2VzcyBpbiBrZXJuZWwgbW9kZS4gICovCisJaWYgKHJlZ3MtPnBzdy5tYXNrICYgUFNXX01BU0tfUFNUQVRFKSB7CisJCS8qIExvdy1hZGRyZXNzIHByb3RlY3Rpb24gaGl0IGluIHVzZXIgbW9kZSAnY2Fubm90IGhhcHBlbicuICovCisJCWRpZSAoIkxvdy1hZGRyZXNzIHByb3RlY3Rpb24iLCByZWdzLCBlcnJvcl9jb2RlKTsKKwkJZG9fZXhpdChTSUdLSUxMKTsKKwl9CisKKwlkb19ub19jb250ZXh0KHJlZ3MsIGVycm9yX2NvZGUsIDApOworfQorCisvKgorICogV2UgcmFuIG91dCBvZiBtZW1vcnksIG9yIHNvbWUgb3RoZXIgdGhpbmcgaGFwcGVuZWQgdG8gdXMgdGhhdCBtYWRlCisgKiB1cyB1bmFibGUgdG8gaGFuZGxlIHRoZSBwYWdlIGZhdWx0IGdyYWNlZnVsbHkuCisgKi8KK3N0YXRpYyBpbnQgZG9fb3V0X29mX21lbW9yeShzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgbG9uZyBlcnJvcl9jb2RlLAorCQkJICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7CisJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSB0c2stPm1tOworCisJdXBfcmVhZCgmbW0tPm1tYXBfc2VtKTsKKwlpZiAoaXNfaW5pdCh0c2spKSB7CisJCXlpZWxkKCk7CisJCWRvd25fcmVhZCgmbW0tPm1tYXBfc2VtKTsKKwkJcmV0dXJuIDE7CisJfQorCXByaW50aygiVk06IGtpbGxpbmcgcHJvY2VzcyAlc1xuIiwgdHNrLT5jb21tKTsKKwlpZiAocmVncy0+cHN3Lm1hc2sgJiBQU1dfTUFTS19QU1RBVEUpCisJCWRvX2V4aXQoU0lHS0lMTCk7CisJZG9fbm9fY29udGV4dChyZWdzLCBlcnJvcl9jb2RlLCBhZGRyZXNzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZG9fc2lnYnVzKHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBsb25nIGVycm9yX2NvZGUsCisJCSAgICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7CisJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSB0c2stPm1tOworCisJdXBfcmVhZCgmbW0tPm1tYXBfc2VtKTsKKwkvKgorCSAqIFNlbmQgYSBzaWdidXMsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB3ZSB3ZXJlIGluIGtlcm5lbAorCSAqIG9yIHVzZXIgbW9kZS4KKwkgKi8KKwl0c2stPnRocmVhZC5wcm90X2FkZHIgPSBhZGRyZXNzOworCXRzay0+dGhyZWFkLnRyYXBfbm8gPSBlcnJvcl9jb2RlOworCWZvcmNlX3NpZyhTSUdCVVMsIHRzayk7CisKKwkvKiBLZXJuZWwgbW9kZT8gSGFuZGxlIGV4Y2VwdGlvbnMgb3IgZGllICovCisJaWYgKCEocmVncy0+cHN3Lm1hc2sgJiBQU1dfTUFTS19QU1RBVEUpKQorCQlkb19ub19jb250ZXh0KHJlZ3MsIGVycm9yX2NvZGUsIGFkZHJlc3MpOworfQorCiAjaWZkZWYgQ09ORklHX1MzOTBfRVhFQ19QUk9URUNUCiBleHRlcm4gbG9uZyBzeXNfc2lncmV0dXJuKHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKIGV4dGVybiBsb25nIHN5c19ydF9zaWdyZXR1cm4oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwogZXh0ZXJuIGxvbmcgc3lzMzJfc2lncmV0dXJuKHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKIGV4dGVybiBsb25nIHN5czMyX3J0X3NpZ3JldHVybihzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBkb19zaWdyZXR1cm4oc3RydWN0IG1tX3N0cnVjdCAqbW0sIHN0cnVjdCBwdF9yZWdzICpyZWdzLAotCQkJCWludCBydCkKLXsKLQl1cF9yZWFkKCZtbS0+bW1hcF9zZW0pOwotCWNsZWFyX3Rza190aHJlYWRfZmxhZyhjdXJyZW50LCBUSUZfU0lOR0xFX1NURVApOwotI2lmZGVmIENPTkZJR19DT01QQVQKLQlpZiAodGVzdF90c2tfdGhyZWFkX2ZsYWcoY3VycmVudCwgVElGXzMxQklUKSkgewotCQlpZiAocnQpCi0JCQlzeXMzMl9ydF9zaWdyZXR1cm4ocmVncyk7Ci0JCWVsc2UKLQkJCXN5czMyX3NpZ3JldHVybihyZWdzKTsKLQkJcmV0dXJuOwotCX0KLSNlbmRpZiAvKiBDT05GSUdfQ09NUEFUICovCi0JaWYgKHJ0KQotCQlzeXNfcnRfc2lncmV0dXJuKHJlZ3MpOwotCWVsc2UKLQkJc3lzX3NpZ3JldHVybihyZWdzKTsKLQlyZXR1cm47Ci19Ci0KIHN0YXRpYyBpbnQgc2lnbmFsX3JldHVybihzdHJ1Y3QgbW1fc3RydWN0ICptbSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCiAJCQkgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBsb25nIGVycm9yX2NvZGUpCiB7Ci0JcGdkX3QgKnBnZDsKLQlwbWRfdCAqcG1kOwotCXB0ZV90ICpwdGU7Ci0JdTE2ICppbnN0cnVjdGlvbjsKLQl1bnNpZ25lZCBsb25nIHBmbiwgdWFkZHIgPSByZWdzLT5wc3cuYWRkcjsKKwl1MTYgaW5zdHJ1Y3Rpb247CisJaW50IHJjLCBjb21wYXQ7CiAKLQlzcGluX2xvY2soJm1tLT5wYWdlX3RhYmxlX2xvY2spOwotCXBnZCA9IHBnZF9vZmZzZXQobW0sIHVhZGRyKTsKLQlpZiAocGdkX25vbmUoKnBnZCkgfHwgdW5saWtlbHkocGdkX2JhZCgqcGdkKSkpCi0JCWdvdG8gb3V0X2ZhdWx0OwotCXBtZCA9IHBtZF9vZmZzZXQocGdkLCB1YWRkcik7Ci0JaWYgKHBtZF9ub25lKCpwbWQpIHx8IHVubGlrZWx5KHBtZF9iYWQoKnBtZCkpKQotCQlnb3RvIG91dF9mYXVsdDsKLQlwdGUgPSBwdGVfb2Zmc2V0X21hcChwbWRfb2Zmc2V0KHBnZF9vZmZzZXQobW0sIHVhZGRyKSwgdWFkZHIpLCB1YWRkcik7Ci0JaWYgKCFwdGUgfHwgIXB0ZV9wcmVzZW50KCpwdGUpKQotCQlnb3RvIG91dF9mYXVsdDsKLQlwZm4gPSBwdGVfcGZuKCpwdGUpOwotCWlmICghcGZuX3ZhbGlkKHBmbikpCi0JCWdvdG8gb3V0X2ZhdWx0OwotCXNwaW5fdW5sb2NrKCZtbS0+cGFnZV90YWJsZV9sb2NrKTsKKwlwYWdlZmF1bHRfZGlzYWJsZSgpOworCXJjID0gX19nZXRfdXNlcihpbnN0cnVjdGlvbiwgKHUxNiBfX3VzZXIgKikgcmVncy0+cHN3LmFkZHIpOworCXBhZ2VmYXVsdF9lbmFibGUoKTsKKwlpZiAocmMpCisJCXJldHVybiAtRUZBVUxUOwogCi0JaW5zdHJ1Y3Rpb24gPSAodTE2ICopICgocGZuIDw8IFBBR0VfU0hJRlQpICsgKHVhZGRyICYgKFBBR0VfU0laRS0xKSkpOwotCWlmICgqaW5zdHJ1Y3Rpb24gPT0gMHgwYTc3KQotCQlkb19zaWdyZXR1cm4obW0sIHJlZ3MsIDApOwotCWVsc2UgaWYgKCppbnN0cnVjdGlvbiA9PSAweDBhYWQpCi0JCWRvX3NpZ3JldHVybihtbSwgcmVncywgMSk7CisJdXBfcmVhZCgmbW0tPm1tYXBfc2VtKTsKKwljbGVhcl90c2tfdGhyZWFkX2ZsYWcoY3VycmVudCwgVElGX1NJTkdMRV9TVEVQKTsKKyNpZmRlZiBDT05GSUdfQ09NUEFUCisJY29tcGF0ID0gdGVzdF90c2tfdGhyZWFkX2ZsYWcoY3VycmVudCwgVElGXzMxQklUKTsKKwlpZiAoY29tcGF0ICYmIGluc3RydWN0aW9uID09IDB4MGE3NykKKwkJc3lzMzJfc2lncmV0dXJuKHJlZ3MpOworCWVsc2UgaWYgKGNvbXBhdCAmJiBpbnN0cnVjdGlvbiA9PSAweDBhYWQpCisJCXN5czMyX3J0X3NpZ3JldHVybihyZWdzKTsKKwllbHNlCisjZW5kaWYKKwlpZiAoaW5zdHJ1Y3Rpb24gPT0gMHgwYTc3KQorCQlzeXNfc2lncmV0dXJuKHJlZ3MpOworCWVsc2UgaWYgKGluc3RydWN0aW9uID09IDB4MGFhZCkKKwkJc3lzX3J0X3NpZ3JldHVybihyZWdzKTsKIAllbHNlIHsKLQkJcHJpbnRrKCItIFhYWCAtIGRvX2V4Y2VwdGlvbjogdGFzayA9ICVzLCBwcmltYXJ5LCBOTyBFWEVDICIKLQkJICAgICAgICItPiBTSUdTRUdWXG4iLCBjdXJyZW50LT5jb21tKTsKLQkJdXBfcmVhZCgmbW0tPm1tYXBfc2VtKTsKIAkJY3VycmVudC0+dGhyZWFkLnByb3RfYWRkciA9IGFkZHJlc3M7CiAJCWN1cnJlbnQtPnRocmVhZC50cmFwX25vID0gZXJyb3JfY29kZTsKIAkJZG9fc2lnc2VndihyZWdzLCBlcnJvcl9jb2RlLCBTRUdWX01BUEVSUiwgYWRkcmVzcyk7CiAJfQogCXJldHVybiAwOwotb3V0X2ZhdWx0OgotCXNwaW5fdW5sb2NrKCZtbS0+cGFnZV90YWJsZV9sb2NrKTsKLQlyZXR1cm4gLUVGQVVMVDsKIH0KICNlbmRpZiAvKiBDT05GSUdfUzM5MF9FWEVDX1BST1RFQ1QgKi8KIApAQCAtMjUzLDQ5ICsyOTYsMjMgQEAKICAqICAgM2IgICAgICAgUmVnaW9uIHRoaXJkIHRyYW5zLiAgLT4gIE5vdCBwcmVzZW50ICAgICAgIChudWxsaWZpY2F0aW9uKQogICovCiBzdGF0aWMgaW5saW5lIHZvaWQKLWRvX2V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgbG9uZyBlcnJvcl9jb2RlLCBpbnQgaXNfcHJvdGVjdGlvbikKK2RvX2V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgbG9uZyBlcnJvcl9jb2RlLCBpbnQgd3JpdGUpCiB7Ci0gICAgICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrOwotICAgICAgICBzdHJ1Y3QgbW1fc3RydWN0ICptbTsKLSAgICAgICAgc3RydWN0IHZtX2FyZWFfc3RydWN0ICogdm1hOwotICAgICAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3M7Ci0JY29uc3Qgc3RydWN0IGV4Y2VwdGlvbl90YWJsZV9lbnRyeSAqZml4dXA7Ci0JaW50IHNpX2NvZGU7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0c2s7CisJc3RydWN0IG1tX3N0cnVjdCAqbW07CisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7CisJdW5zaWduZWQgbG9uZyBhZGRyZXNzOwogCWludCBzcGFjZTsKKwlpbnQgc2lfY29kZTsKIAotICAgICAgICB0c2sgPSBjdXJyZW50OwotICAgICAgICBtbSA9IHRzay0+bW07Ci0JCi0JaWYgKG5vdGlmeV9wYWdlX2ZhdWx0KERJRV9QQUdFX0ZBVUxULCAicGFnZSBmYXVsdCIsIHJlZ3MsIGVycm9yX2NvZGUsIDE0LAotCQkJCQlTSUdTRUdWKSA9PSBOT1RJRllfU1RPUCkKKwlpZiAobm90aWZ5X3BhZ2VfZmF1bHQocmVncywgZXJyb3JfY29kZSkpCiAJCXJldHVybjsKIAotCS8qIAotICAgICAgICAgKiBDaGVjayBmb3IgbG93LWFkZHJlc3MgcHJvdGVjdGlvbi4gIFRoaXMgbmVlZHMgdG8gYmUgdHJlYXRlZAotCSAqIGFzIGEgc3BlY2lhbCBjYXNlIGJlY2F1c2UgdGhlIHRyYW5zbGF0aW9uIGV4Y2VwdGlvbiBjb2RlIAotCSAqIGZpZWxkIGlzIG5vdCBndWFyYW50ZWVkIHRvIGNvbnRhaW4gdmFsaWQgZGF0YSBpbiB0aGlzIGNhc2UuCi0JICovCi0JaWYgKGlzX3Byb3RlY3Rpb24gJiYgIShTMzkwX2xvd2NvcmUudHJhbnNfZXhjX2NvZGUgJiA0KSkgeworCXRzayA9IGN1cnJlbnQ7CisJbW0gPSB0c2stPm1tOwogCi0JCS8qIExvdy1hZGRyZXNzIHByb3RlY3Rpb24gaGl0IGluIGtlcm5lbCBtb2RlIG1lYW5zIAotCQkgICBOVUxMIHBvaW50ZXIgd3JpdGUgYWNjZXNzIGluIGtlcm5lbCBtb2RlLiAgKi8KLSAJCWlmICghKHJlZ3MtPnBzdy5tYXNrICYgUFNXX01BU0tfUFNUQVRFKSkgewotCQkJYWRkcmVzcyA9IDA7Ci0JCQlzcGFjZSA9IDA7Ci0JCQlnb3RvIG5vX2NvbnRleHQ7Ci0JCX0KLQotCQkvKiBMb3ctYWRkcmVzcyBwcm90ZWN0aW9uIGhpdCBpbiB1c2VyIG1vZGUgJ2Nhbm5vdCBoYXBwZW4nLiAgKi8KLQkJZGllICgiTG93LWFkZHJlc3MgcHJvdGVjdGlvbiIsIHJlZ3MsIGVycm9yX2NvZGUpOwotICAgICAgICAJZG9fZXhpdChTSUdLSUxMKTsKLQl9Ci0KLSAgICAgICAgLyogCi0gICAgICAgICAqIGdldCB0aGUgZmFpbGluZyBhZGRyZXNzIAotICAgICAgICAgKiBtb3JlIHNwZWNpZmljIHRoZSBzZWdtZW50IGFuZCBwYWdlIHRhYmxlIHBvcnRpb24gb2YgCi0gICAgICAgICAqIHRoZSBhZGRyZXNzIAotICAgICAgICAgKi8KLSAgICAgICAgYWRkcmVzcyA9IFMzOTBfbG93Y29yZS50cmFuc19leGNfY29kZSAmIF9fRkFJTF9BRERSX01BU0s7CisJLyogZ2V0IHRoZSBmYWlsaW5nIGFkZHJlc3MgYW5kIHRoZSBhZmZlY3RlZCBzcGFjZSAqLworCWFkZHJlc3MgPSBTMzkwX2xvd2NvcmUudHJhbnNfZXhjX2NvZGUgJiBfX0ZBSUxfQUREUl9NQVNLOwogCXNwYWNlID0gY2hlY2tfc3BhY2UodHNrKTsKIAogCS8qCkBAIC0zMTMsNyArMzMwLDcgQEAKIAkgKi8KIAlsb2NhbF9pcnFfZW5hYmxlKCk7CiAKLSAgICAgICAgZG93bl9yZWFkKCZtbS0+bW1hcF9zZW0pOworCWRvd25fcmVhZCgmbW0tPm1tYXBfc2VtKTsKIAogCXNpX2NvZGUgPSBTRUdWX01BUEVSUjsKIAl2bWEgPSBmaW5kX3ZtYShtbSwgYWRkcmVzcyk7CkBAIC0zMzAsMTkgKzM0NywxOSBAQAogCQkJcmV0dXJuOwogI2VuZGlmCiAKLSAgICAgICAgaWYgKHZtYS0+dm1fc3RhcnQgPD0gYWRkcmVzcykgCi0gICAgICAgICAgICAgICAgZ290byBnb29kX2FyZWE7Ci0gICAgICAgIGlmICghKHZtYS0+dm1fZmxhZ3MgJiBWTV9HUk9XU0RPV04pKQotICAgICAgICAgICAgICAgIGdvdG8gYmFkX2FyZWE7Ci0gICAgICAgIGlmIChleHBhbmRfc3RhY2sodm1hLCBhZGRyZXNzKSkKLSAgICAgICAgICAgICAgICBnb3RvIGJhZF9hcmVhOworCWlmICh2bWEtPnZtX3N0YXJ0IDw9IGFkZHJlc3MpCisJCWdvdG8gZ29vZF9hcmVhOworCWlmICghKHZtYS0+dm1fZmxhZ3MgJiBWTV9HUk9XU0RPV04pKQorCQlnb3RvIGJhZF9hcmVhOworCWlmIChleHBhbmRfc3RhY2sodm1hLCBhZGRyZXNzKSkKKwkJZ290byBiYWRfYXJlYTsKIC8qCiAgKiBPaywgd2UgaGF2ZSBhIGdvb2Qgdm1fYXJlYSBmb3IgdGhpcyBtZW1vcnkgYWNjZXNzLCBzbwogICogd2UgY2FuIGhhbmRsZSBpdC4uCiAgKi8KIGdvb2RfYXJlYToKIAlzaV9jb2RlID0gU0VHVl9BQ0NFUlI7Ci0JaWYgKCFpc19wcm90ZWN0aW9uKSB7CisJaWYgKCF3cml0ZSkgewogCQkvKiBwYWdlIG5vdCBwcmVzZW50LCBjaGVjayB2bSBmbGFncyAqLwogCQlpZiAoISh2bWEtPnZtX2ZsYWdzICYgKFZNX1JFQUQgfCBWTV9FWEVDIHwgVk1fV1JJVEUpKSkKIAkJCWdvdG8gYmFkX2FyZWE7CkBAIC0zNTcsNyArMzc0LDcgQEAKIAkgKiBtYWtlIHN1cmUgd2UgZXhpdCBncmFjZWZ1bGx5IHJhdGhlciB0aGFuIGVuZGxlc3NseSByZWRvCiAJICogdGhlIGZhdWx0LgogCSAqLwotCXN3aXRjaCAoaGFuZGxlX21tX2ZhdWx0KG1tLCB2bWEsIGFkZHJlc3MsIGlzX3Byb3RlY3Rpb24pKSB7CisJc3dpdGNoIChoYW5kbGVfbW1fZmF1bHQobW0sIHZtYSwgYWRkcmVzcywgd3JpdGUpKSB7CiAJY2FzZSBWTV9GQVVMVF9NSU5PUjoKIAkJdHNrLT5taW5fZmx0Kys7CiAJCWJyZWFrOwpAQCAtMzY1LDkgKzM4MiwxMiBAQAogCQl0c2stPm1hal9mbHQrKzsKIAkJYnJlYWs7CiAJY2FzZSBWTV9GQVVMVF9TSUdCVVM6Ci0JCWdvdG8gZG9fc2lnYnVzOworCQlkb19zaWdidXMocmVncywgZXJyb3JfY29kZSwgYWRkcmVzcyk7CisJCXJldHVybjsKIAljYXNlIFZNX0ZBVUxUX09PTToKLQkJZ290byBvdXRfb2ZfbWVtb3J5OworCQlpZiAoZG9fb3V0X29mX21lbW9yeShyZWdzLCBlcnJvcl9jb2RlLCBhZGRyZXNzKSkKKwkJCWdvdG8gc3Vydml2ZTsKKwkJcmV0dXJuOwogCWRlZmF1bHQ6CiAJCUJVRygpOwogCX0KQEAgLTM4NSw3NSArNDA1LDM0IEBACiAgKiBGaXggaXQsIGJ1dCBjaGVjayBpZiBpdCdzIGtlcm5lbCBvciB1c2VyIGZpcnN0Li4KICAqLwogYmFkX2FyZWE6Ci0gICAgICAgIHVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7CisJdXBfcmVhZCgmbW0tPm1tYXBfc2VtKTsKIAotICAgICAgICAvKiBVc2VyIG1vZGUgYWNjZXNzZXMganVzdCBjYXVzZSBhIFNJR1NFR1YgKi8KLSAgICAgICAgaWYgKHJlZ3MtPnBzdy5tYXNrICYgUFNXX01BU0tfUFNUQVRFKSB7Ci0gICAgICAgICAgICAgICAgdHNrLT50aHJlYWQucHJvdF9hZGRyID0gYWRkcmVzczsKLSAgICAgICAgICAgICAgICB0c2stPnRocmVhZC50cmFwX25vID0gZXJyb3JfY29kZTsKKwkvKiBVc2VyIG1vZGUgYWNjZXNzZXMganVzdCBjYXVzZSBhIFNJR1NFR1YgKi8KKwlpZiAocmVncy0+cHN3Lm1hc2sgJiBQU1dfTUFTS19QU1RBVEUpIHsKKwkJdHNrLT50aHJlYWQucHJvdF9hZGRyID0gYWRkcmVzczsKKwkJdHNrLT50aHJlYWQudHJhcF9ubyA9IGVycm9yX2NvZGU7CiAJCWRvX3NpZ3NlZ3YocmVncywgZXJyb3JfY29kZSwgc2lfY29kZSwgYWRkcmVzcyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOworCQlyZXR1cm47CiAJfQogCiBub19jb250ZXh0OgotICAgICAgICAvKiBBcmUgd2UgcHJlcGFyZWQgdG8gaGFuZGxlIHRoaXMga2VybmVsIGZhdWx0PyAgKi8KLQlmaXh1cCA9IHNlYXJjaF9leGNlcHRpb25fdGFibGVzKHJlZ3MtPnBzdy5hZGRyICYgX19GSVhVUF9NQVNLKTsKLQlpZiAoZml4dXApIHsKLQkJcmVncy0+cHN3LmFkZHIgPSBmaXh1cC0+Zml4dXAgfCBQU1dfQUREUl9BTU9ERTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotLyoKLSAqIE9vcHMuIFRoZSBrZXJuZWwgdHJpZWQgdG8gYWNjZXNzIHNvbWUgYmFkIHBhZ2UuIFdlJ2xsIGhhdmUgdG8KLSAqIHRlcm1pbmF0ZSB0aGluZ3Mgd2l0aCBleHRyZW1lIHByZWp1ZGljZS4KLSAqLwotCWlmIChzcGFjZSA9PSAwKQotICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0FMRVJUICJVbmFibGUgdG8gaGFuZGxlIGtlcm5lbCBwb2ludGVyIGRlcmVmZXJlbmNlIgotICAgICAgICAJICAgICAgICIgYXQgdmlydHVhbCBrZXJuZWwgYWRkcmVzcyAlcFxuIiwgKHZvaWQgKilhZGRyZXNzKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0FMRVJUICJVbmFibGUgdG8gaGFuZGxlIGtlcm5lbCBwYWdpbmcgcmVxdWVzdCIKLQkJICAgICAgICIgYXQgdmlydHVhbCB1c2VyIGFkZHJlc3MgJXBcbiIsICh2b2lkICopYWRkcmVzcyk7Ci0KLSAgICAgICAgZGllKCJPb3BzIiwgcmVncywgZXJyb3JfY29kZSk7Ci0gICAgICAgIGRvX2V4aXQoU0lHS0lMTCk7Ci0KLQotLyoKLSAqIFdlIHJhbiBvdXQgb2YgbWVtb3J5LCBvciBzb21lIG90aGVyIHRoaW5nIGhhcHBlbmVkIHRvIHVzIHRoYXQgbWFkZQotICogdXMgdW5hYmxlIHRvIGhhbmRsZSB0aGUgcGFnZSBmYXVsdCBncmFjZWZ1bGx5LgotKi8KLW91dF9vZl9tZW1vcnk6Ci0JdXBfcmVhZCgmbW0tPm1tYXBfc2VtKTsKLQlpZiAoaXNfaW5pdCh0c2spKSB7Ci0JCXlpZWxkKCk7Ci0JCWRvd25fcmVhZCgmbW0tPm1tYXBfc2VtKTsKLQkJZ290byBzdXJ2aXZlOwotCX0KLQlwcmludGsoIlZNOiBraWxsaW5nIHByb2Nlc3MgJXNcbiIsIHRzay0+Y29tbSk7Ci0JaWYgKHJlZ3MtPnBzdy5tYXNrICYgUFNXX01BU0tfUFNUQVRFKQotCQlkb19leGl0KFNJR0tJTEwpOwotCWdvdG8gbm9fY29udGV4dDsKLQotZG9fc2lnYnVzOgotCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7Ci0KLQkvKgotCSAqIFNlbmQgYSBzaWdidXMsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB3ZSB3ZXJlIGluIGtlcm5lbAotCSAqIG9yIHVzZXIgbW9kZS4KLQkgKi8KLSAgICAgICAgdHNrLT50aHJlYWQucHJvdF9hZGRyID0gYWRkcmVzczsKLSAgICAgICAgdHNrLT50aHJlYWQudHJhcF9ubyA9IGVycm9yX2NvZGU7Ci0JZm9yY2Vfc2lnKFNJR0JVUywgdHNrKTsKLQotCS8qIEtlcm5lbCBtb2RlPyBIYW5kbGUgZXhjZXB0aW9ucyBvciBkaWUgKi8KLQlpZiAoIShyZWdzLT5wc3cubWFzayAmIFBTV19NQVNLX1BTVEFURSkpCi0JCWdvdG8gbm9fY29udGV4dDsKKwlkb19ub19jb250ZXh0KHJlZ3MsIGVycm9yX2NvZGUsIGFkZHJlc3MpOwogfQogCiB2b2lkIF9fa3Byb2JlcyBkb19wcm90ZWN0aW9uX2V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncywKIAkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBlcnJvcl9jb2RlKQogeworCS8qIFByb3RlY3Rpb24gZXhjZXB0aW9uIGlzIHN1cHJlc3NpbmcsIGRlY3JlbWVudCBwc3cgYWRkcmVzcy4gKi8KIAlyZWdzLT5wc3cuYWRkciAtPSAoZXJyb3JfY29kZSA+PiAxNik7CisJLyoKKwkgKiBDaGVjayBmb3IgbG93LWFkZHJlc3MgcHJvdGVjdGlvbi4gIFRoaXMgbmVlZHMgdG8gYmUgdHJlYXRlZAorCSAqIGFzIGEgc3BlY2lhbCBjYXNlIGJlY2F1c2UgdGhlIHRyYW5zbGF0aW9uIGV4Y2VwdGlvbiBjb2RlCisJICogZmllbGQgaXMgbm90IGd1YXJhbnRlZWQgdG8gY29udGFpbiB2YWxpZCBkYXRhIGluIHRoaXMgY2FzZS4KKwkgKi8KKwlpZiAodW5saWtlbHkoIShTMzkwX2xvd2NvcmUudHJhbnNfZXhjX2NvZGUgJiA0KSkpIHsKKwkJZG9fbG93X2FkZHJlc3MocmVncywgZXJyb3JfY29kZSk7CisJCXJldHVybjsKKwl9CiAJZG9fZXhjZXB0aW9uKHJlZ3MsIDQsIDEpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9ocDZ4eC9wbS5jIGIvYXJjaC9zaC9ib2FyZHMvaHA2eHgvcG0uYwppbmRleCBkMTk0NzczLi44MTQzZDFiIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9ocDZ4eC9wbS5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL2hwNnh4L3BtLmMKQEAgLTI3LDkgKzI3LDYgQEAKIAl1MTYgaGQ2NDQ2MV9zdGJjcjsKICNlbmRpZgogCi0JaWYgKHN0YXRlICE9IFBNX1NVU1BFTkRfTUVNKQotCQlyZXR1cm4gLUVJTlZBTDsKLQogI2lmZGVmIENPTkZJR19IRDY0NDYxX0VOQUJMRVIKIAlvdXRiKDAsIEhENjQ0NjFfUENDMUNTQ0lFUik7CiAKQEAgLTcwLDEyICs2Nyw5IEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qCi0gKiBTZXQgdG8gUE1fRElTS19GSVJNV0FSRSBzbyB3ZSBjYW4gcXVpY2tseSB2ZXRvIHN1c3BlbmQtdG8tZGlzay4KLSAqLwogc3RhdGljIHN0cnVjdCBwbV9vcHMgaHA2eDBfcG1fb3BzID0gewotCS5wbV9kaXNrX21vZGUJPSBQTV9ESVNLX0ZJUk1XQVJFLAogCS5lbnRlcgkJPSBocDZ4MF9wbV9lbnRlciwKKwkudmFsaWQJCT0gcG1fdmFsaWRfb25seV9tZW0sCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBocDZ4MF9wbV9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2xpYi9NYWtlZmlsZSBiL2FyY2gvc2gvbGliL01ha2VmaWxlCmluZGV4IGI1NjgxZTMuLjBiOWNjYTUgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvbGliL01ha2VmaWxlCisrKyBiL2FyY2gvc2gvbGliL01ha2VmaWxlCkBAIC0zLDcgKzMsNyBAQAogIwogCiBsaWIteSAgPSBkZWxheS5vIG1lbXNldC5vIG1lbW1vdmUubyBtZW1jaHIubyBcCi0JIGNoZWNrc3VtLm8gc3RyY2FzZWNtcC5vIHN0cmxlbi5vIGRpdjY0Lm8gdWRpdmRpMy5vIFwKKwkgY2hlY2tzdW0ubyBzdHJsZW4ubyBkaXY2NC5vIHVkaXZkaTMubyBcCiAJIGRpdjY0LWdlbmVyaWMubwogCiBtZW1jcHkteQkJCTo9IG1lbWNweS5vCmRpZmYgLS1naXQgYS9hcmNoL3NoL2xpYi9zdHJjYXNlY21wLmMgYi9hcmNoL3NoL2xpYi9zdHJjYXNlY21wLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlNTdhMjEuLjAwMDAwMDAKLS0tIGEvYXJjaC9zaC9saWIvc3RyY2FzZWNtcC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoKLSAqICBsaW51eC9hcmNoL2FscGhhL2xpYi9zdHJjYXNlY21wLmMKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0KLQotLyogV2UgaGFuZGxlIG5vdGhpbmcgaGVyZSBleGNlcHQgdGhlIEMgbG9jYWxlLiAgU2luY2UgdGhpcyBpcyB1c2VkIGluCi0gICBvbmx5IG9uZSBwbGFjZSwgb24gc3RyaW5ncyBrbm93biB0byBjb250YWluIG9ubHkgNyBiaXQgQVNDSUksIHRoaXMKLSAgIGlzIG9rLiAgKi8KLQotaW50IHN0cmNhc2VjbXAoY29uc3QgY2hhciAqYSwgY29uc3QgY2hhciAqYikKLXsKLQlpbnQgY2EsIGNiOwotCi0JZG8gewotCQljYSA9ICphKysgJiAweGZmOwotCQljYiA9ICpiKysgJiAweGZmOwotCQlpZiAoY2EgPj0gJ0EnICYmIGNhIDw9ICdaJykKLQkJCWNhICs9ICdhJyAtICdBJzsKLQkJaWYgKGNiID49ICdBJyAmJiBjYiA8PSAnWicpCi0JCQljYiArPSAnYScgLSAnQSc7Ci0JfSB3aGlsZSAoY2EgPT0gY2IgJiYgY2EgIT0gJ1wwJyk7Ci0KLQlyZXR1cm4gY2EgLSBjYjsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL2VidXMuYyBiL2FyY2gvc3BhcmMva2VybmVsL2VidXMuYwppbmRleCBiYTU4YzNhLi43YmI4NmI5YyAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvZWJ1cy5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL2VidXMuYwpAQCAtMjUsNyArMjUsNyBAQAogc3RydWN0IGxpbnV4X2VidXMgKmVidXNfY2hhaW4gPSBOVUxMOwogCiAvKiBXZSBhcmUgdG9nZXRoZXIgd2l0aCBwY2ljLmMgdW5kZXIgQ09ORklHX1BDSS4gKi8KLWV4dGVybiB1bnNpZ25lZCBpbnQgcGNpY19waW5fdG9faXJxKHVuc2lnbmVkIGludCwgY2hhciAqbmFtZSk7CitleHRlcm4gdW5zaWduZWQgaW50IHBjaWNfcGluX3RvX2lycSh1bnNpZ25lZCBpbnQsIGNvbnN0IGNoYXIgKm5hbWUpOwogCiAvKgogICogSVJRIEJsYWNrbGlzdApAQCAtNjksNyArNjksNyBAQAogCiAvKgogICovCi1pbnQgX19pbml0IGVidXNfYmxhY2tsaXN0X2lycShjaGFyICpuYW1lKQoraW50IF9faW5pdCBlYnVzX2JsYWNrbGlzdF9pcnEoY29uc3QgY2hhciAqbmFtZSkKIHsKIAlzdHJ1Y3QgZWJ1c19kZXZpY2VfaXJxICpkcDsKIApAQCAtODYsOCArODYsOCBAQAogdm9pZCBfX2luaXQgZmlsbF9lYnVzX2NoaWxkKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAsCiAJCQkgICAgc3RydWN0IGxpbnV4X2VidXNfY2hpbGQgKmRldikKIHsKLQlpbnQgKnJlZ3M7Ci0JaW50ICppcnFzOworCWNvbnN0IGludCAqcmVnczsKKwljb25zdCBpbnQgKmlycXM7CiAJaW50IGksIGxlbjsKIAogCWRldi0+cHJvbV9ub2RlID0gZHA7CkBAIC0xNDYsOSArMTQ2LDkgQEAKIAogdm9pZCBfX2luaXQgZmlsbF9lYnVzX2RldmljZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwLCBzdHJ1Y3QgbGludXhfZWJ1c19kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgbGludXhfcHJvbV9yZWdpc3RlcnMgKnJlZ3M7CisJY29uc3Qgc3RydWN0IGxpbnV4X3Byb21fcmVnaXN0ZXJzICpyZWdzOwogCXN0cnVjdCBsaW51eF9lYnVzX2NoaWxkICpjaGlsZDsKLQlpbnQgKmlycXM7CisJY29uc3QgaW50ICppcnFzOwogCWludCBpLCBuLCBsZW47CiAJdW5zaWduZWQgbG9uZyBiYXNlYWRkcjsKIApAQCAtMjY5LDcgKzI2OSw3IEBACiAKIHZvaWQgX19pbml0IGVidXNfaW5pdCh2b2lkKQogewotCXN0cnVjdCBsaW51eF9wcm9tX3BjaV9yZWdpc3RlcnMgKnJlZ3M7CisJY29uc3Qgc3RydWN0IGxpbnV4X3Byb21fcGNpX3JlZ2lzdGVycyAqcmVnczsKIAlzdHJ1Y3QgbGludXhfcGJtX2luZm8gKnBibTsKIAlzdHJ1Y3QgbGludXhfZWJ1c19kZXZpY2UgKmRldjsKIAlzdHJ1Y3QgbGludXhfZWJ1cyAqZWJ1czsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL29mX2RldmljZS5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvb2ZfZGV2aWNlLmMKaW5kZXggNDhjMjRmNy4uZmQ3ZjhjYiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvb2ZfZGV2aWNlLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvb2ZfZGV2aWNlLmMKQEAgLTIxMCw3ICsyMTAsNyBAQAogCQkJCSAgICAgICBpbnQgKmFkZHJjLCBpbnQgKnNpemVjKTsKIAlpbnQJCSgqbWFwKSh1MzIgKmFkZHIsIGNvbnN0IHUzMiAqcmFuZ2UsCiAJCQkgICAgICAgaW50IG5hLCBpbnQgbnMsIGludCBwbmEpOwotCXVuc2lnbmVkIGludAkoKmdldF9mbGFncykodTMyICphZGRyKTsKKwl1bnNpZ25lZCBpbnQJKCpnZXRfZmxhZ3MpKGNvbnN0IHUzMiAqYWRkcik7CiB9OwogCiAvKgpAQCAtMjcwLDcgKzI3MCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgb2ZfYnVzX2RlZmF1bHRfZ2V0X2ZsYWdzKHUzMiAqYWRkcikKK3N0YXRpYyB1bnNpZ25lZCBpbnQgb2ZfYnVzX2RlZmF1bHRfZ2V0X2ZsYWdzKGNvbnN0IHUzMiAqYWRkcikKIHsKIAlyZXR1cm4gSU9SRVNPVVJDRV9NRU07CiB9CkBAIC0zMzQsNyArMzM0LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGludCBvZl9idXNfcGNpX2dldF9mbGFncyh1MzIgKmFkZHIpCitzdGF0aWMgdW5zaWduZWQgaW50IG9mX2J1c19wY2lfZ2V0X2ZsYWdzKGNvbnN0IHUzMiAqYWRkcikKIHsKIAl1bnNpZ25lZCBpbnQgZmxhZ3MgPSAwOwogCXUzMiB3ID0gYWRkclswXTsKQEAgLTM3NSw3ICszNzUsNyBAQAogCXJldHVybiBvZl9idXNfZGVmYXVsdF9tYXAoYWRkciwgcmFuZ2UsIG5hLCBucywgcG5hKTsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGludCBvZl9idXNfc2J1c19nZXRfZmxhZ3ModTMyICphZGRyKQorc3RhdGljIHVuc2lnbmVkIGludCBvZl9idXNfc2J1c19nZXRfZmxhZ3MoY29uc3QgdTMyICphZGRyKQogewogCXJldHVybiBJT1JFU09VUkNFX01FTTsKIH0KQEAgLTQzMiw3ICs0MzIsNyBAQAogCQkJCSAgICAgdTMyICphZGRyLAogCQkJCSAgICAgaW50IG5hLCBpbnQgbnMsIGludCBwbmEpCiB7Ci0JdTMyICpyYW5nZXM7CisJY29uc3QgdTMyICpyYW5nZXM7CiAJdW5zaWduZWQgaW50IHJsZW47CiAJaW50IHJvbmU7CiAKQEAgLTQ3MCw3ICs0NzAsNyBAQAogCXN0cnVjdCBvZl9idXMgKmJ1czsKIAlpbnQgbmEsIG5zOwogCWludCBpbmRleCwgbnVtX3JlZzsKLQl2b2lkICpwcmVnOworCWNvbnN0IHZvaWQgKnByZWc7CiAKIAlpZiAoIXBhcmVudCkKIAkJcmV0dXJuOwpAQCAtNDkyLDcgKzQ5Miw3IEBACiAJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbnVtX3JlZzsgaW5kZXgrKykgewogCQlzdHJ1Y3QgcmVzb3VyY2UgKnIgPSAmb3AtPnJlc291cmNlW2luZGV4XTsKIAkJdTMyIGFkZHJbT0ZfTUFYX0FERFJfQ0VMTFNdOwotCQl1MzIgKnJlZyA9IChwcmVnICsgKGluZGV4ICogKChuYSArIG5zKSAqIDQpKSk7CisJCWNvbnN0IHUzMiAqcmVnID0gKHByZWcgKyAoaW5kZXggKiAoKG5hICsgbnMpICogNCkpKTsKIAkJc3RydWN0IGRldmljZV9ub2RlICpkcCA9IG9wLT5ub2RlOwogCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKnBwID0gcF9vcC0+bm9kZTsKIAkJc3RydWN0IG9mX2J1cyAqcGJ1cywgKmRidXM7CkBAIC01NTksNyArNTU5LDcgQEAKIAkJCQkJCSBzdHJ1Y3QgZGV2aWNlICpwYXJlbnQpCiB7CiAJc3RydWN0IG9mX2RldmljZSAqb3AgPSBremFsbG9jKHNpemVvZigqb3ApLCBHRlBfS0VSTkVMKTsKLQlzdHJ1Y3QgbGludXhfcHJvbV9pcnFzICppbnRyOworCWNvbnN0IHN0cnVjdCBsaW51eF9wcm9tX2lycXMgKmludHI7CiAJaW50IGxlbiwgaTsKIAogCWlmICghb3ApCkBAIC01NzksNyArNTc5LDggQEAKIAkJZm9yIChpID0gMDsgaSA8IG9wLT5udW1faXJxczsgaSsrKQogCQkJb3AtPmlycXNbaV0gPSBpbnRyW2ldLnByaTsKIAl9IGVsc2UgewotCQl1bnNpZ25lZCBpbnQgKmlycSA9IG9mX2dldF9wcm9wZXJ0eShkcCwgImludGVycnVwdHMiLCAmbGVuKTsKKwkJY29uc3QgdW5zaWduZWQgaW50ICppcnEgPQorCQkJb2ZfZ2V0X3Byb3BlcnR5KGRwLCAiaW50ZXJydXB0cyIsICZsZW4pOwogCiAJCWlmIChpcnEpIHsKIAkJCW9wLT5udW1faXJxcyA9IGxlbiAvIHNpemVvZih1bnNpZ25lZCBpbnQpOwpAQCAtNTk0LDcgKzU5NSw3IEBACiAJCQkwLCAwLCAxLCAyLCAwLCAzLCAwLCA0LCAwLCA1LCAwLCA2LCAwLCA3LCAwLCAwLAogCQl9OwogCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmlvX3VuaXQsICpzYmkgPSBkcC0+cGFyZW50OwotCQlzdHJ1Y3QgbGludXhfcHJvbV9yZWdpc3RlcnMgKnJlZ3M7CisJCWNvbnN0IHN0cnVjdCBsaW51eF9wcm9tX3JlZ2lzdGVycyAqcmVnczsKIAkJaW50IGJvYXJkLCBzbG90OwogCiAJCXdoaWxlIChzYmkpIHsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3BjaWMuYyBiL2FyY2gvc3BhcmMva2VybmVsL3BjaWMuYwppbmRleCAxYzkyN2M1Li41Y2E3ZThmIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9wY2ljLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvcGNpYy5jCkBAIC0zNyw4ICszNyw2IEBACiAjaW5jbHVkZSA8YXNtL2lycV9yZWdzLmg+CiAKIAotdW5zaWduZWQgaW50IHBjaWNfcGluX3RvX2lycSh1bnNpZ25lZCBpbnQgcGluLCBjaGFyICpuYW1lKTsKLQogLyoKICAqIEkgc3R1ZGllZCBkaWZmZXJlbnQgZG9jdW1lbnRzIGFuZCBtYW55IGxpdmUgUFJPTXMgYm90aCBmcm9tIDIuMzAKICAqIGZhbWlseSBhbmQgMy54eCB2ZXJzaW9ucy4gSSBjYW1lIHRvIHRoZSBhbWF6aW5nIGNvbmNsdXNpb246IHRoZXJlIGlzCkBAIC02ODEsNyArNjc5LDcgQEAKICAqIHBjaWNfcGluX3RvX2lycSgpIGlzIGV4cG9ydGVkIHRvIGVidXMuYy4KICAqLwogdW5zaWduZWQgaW50Ci1wY2ljX3Bpbl90b19pcnEodW5zaWduZWQgaW50IHBpbiwgY2hhciAqbmFtZSkKK3BjaWNfcGluX3RvX2lycSh1bnNpZ25lZCBpbnQgcGluLCBjb25zdCBjaGFyICpuYW1lKQogewogCXN0cnVjdCBsaW51eF9wY2ljICpwY2ljID0gJnBjaWMwOwogCXVuc2lnbmVkIGludCBpcnE7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9wcm9tLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9wcm9tLmMKaW5kZXggMmNjMzAyYi4uZWVkMTQwYiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvcHJvbS5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3Byb20uYwpAQCAtMzIsMTIgKzMyLDEzIEBACiAgKi8KIHN0YXRpYyBERUZJTkVfUldMT0NLKGRldnRyZWVfbG9jayk7CiAKLWludCBvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldmljZSwgY29uc3QgY2hhciAqY29tcGF0KQoraW50IG9mX2RldmljZV9pc19jb21wYXRpYmxlKGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2aWNlLAorCQkJICAgIGNvbnN0IGNoYXIgKmNvbXBhdCkKIHsKIAljb25zdCBjaGFyKiBjcDsKIAlpbnQgY3BsZW4sIGw7CiAKLQljcCA9IChjaGFyICopIG9mX2dldF9wcm9wZXJ0eShkZXZpY2UsICJjb21wYXRpYmxlIiwgJmNwbGVuKTsKKwljcCA9IG9mX2dldF9wcm9wZXJ0eShkZXZpY2UsICJjb21wYXRpYmxlIiwgJmNwbGVuKTsKIAlpZiAoY3AgPT0gTlVMTCkKIAkJcmV0dXJuIDA7CiAJd2hpbGUgKGNwbGVuID4gMCkgewpAQCAtMTUwLDEzICsxNTEsMTQgQEAKIH0KIEVYUE9SVF9TWU1CT0wob2ZfZmluZF9jb21wYXRpYmxlX25vZGUpOwogCi1zdHJ1Y3QgcHJvcGVydHkgKm9mX2ZpbmRfcHJvcGVydHkoc3RydWN0IGRldmljZV9ub2RlICpucCwgY29uc3QgY2hhciAqbmFtZSwKK3N0cnVjdCBwcm9wZXJ0eSAqb2ZfZmluZF9wcm9wZXJ0eShjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCQkJCSAgY29uc3QgY2hhciAqbmFtZSwKIAkJCQkgIGludCAqbGVucCkKIHsKIAlzdHJ1Y3QgcHJvcGVydHkgKnBwOwogCiAJZm9yIChwcCA9IG5wLT5wcm9wZXJ0aWVzOyBwcCAhPSAwOyBwcCA9IHBwLT5uZXh0KSB7Ci0JCWlmIChzdHJjbXAocHAtPm5hbWUsIG5hbWUpID09IDApIHsKKwkJaWYgKHN0cmNhc2VjbXAocHAtPm5hbWUsIG5hbWUpID09IDApIHsKIAkJCWlmIChsZW5wICE9IDApCiAJCQkJKmxlbnAgPSBwcC0+bGVuZ3RoOwogCQkJYnJlYWs7CkBAIC0xNzAsNyArMTcyLDggQEAKICAqIEZpbmQgYSBwcm9wZXJ0eSB3aXRoIGEgZ2l2ZW4gbmFtZSBmb3IgYSBnaXZlbiBub2RlCiAgKiBhbmQgcmV0dXJuIHRoZSB2YWx1ZS4KICAqLwotdm9pZCAqb2ZfZ2V0X3Byb3BlcnR5KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIGNvbnN0IGNoYXIgKm5hbWUsIGludCAqbGVucCkKK2NvbnN0IHZvaWQgKm9mX2dldF9wcm9wZXJ0eShjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCBjb25zdCBjaGFyICpuYW1lLAorCQkJICAgIGludCAqbGVucCkKIHsKIAlzdHJ1Y3QgcHJvcGVydHkgKnBwID0gb2ZfZmluZF9wcm9wZXJ0eShucCxuYW1lLGxlbnApOwogCXJldHVybiBwcCA/IHBwLT52YWx1ZSA6IE5VTEw7CkBAIC0xOTIsNyArMTk1LDcgQEAKIAogaW50IG9mX25fYWRkcl9jZWxscyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQogewotCWludCogaXA7CisJY29uc3QgaW50KiBpcDsKIAlkbyB7CiAJCWlmIChucC0+cGFyZW50KQogCQkJbnAgPSBucC0+cGFyZW50OwpAQCAtMjA3LDcgKzIxMCw3IEBACiAKIGludCBvZl9uX3NpemVfY2VsbHMoc3RydWN0IGRldmljZV9ub2RlICpucCkKIHsKLQlpbnQqIGlwOworCWNvbnN0IGludCogaXA7CiAJZG8gewogCQlpZiAobnAtPnBhcmVudCkKIAkJCW5wID0gbnAtPnBhcmVudDsKQEAgLTIzOSw3ICsyNDIsNyBAQAogCXdoaWxlICgqcHJldnApIHsKIAkJc3RydWN0IHByb3BlcnR5ICpwcm9wID0gKnByZXZwOwogCi0JCWlmICghc3RyY21wKHByb3AtPm5hbWUsIG5hbWUpKSB7CisJCWlmICghc3RyY2FzZWNtcChwcm9wLT5uYW1lLCBuYW1lKSkgewogCQkJdm9pZCAqb2xkX3ZhbCA9IHByb3AtPnZhbHVlOwogCQkJaW50IHJldDsKIApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvdGltZS5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvdGltZS5jCmluZGV4IDliYjEyNDBhYS4uZjE0MDFiNSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvdGltZS5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3RpbWUuYwpAQCAtMzAxLDcgKzMwMSw3IEBACiBzdGF0aWMgaW50IF9fZGV2aW5pdCBjbG9ja19wcm9iZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCwgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2gpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpkcCA9IG9wLT5ub2RlOwotCWNoYXIgKm1vZGVsID0gb2ZfZ2V0X3Byb3BlcnR5KGRwLCAibW9kZWwiLCBOVUxMKTsKKwljb25zdCBjaGFyICptb2RlbCA9IG9mX2dldF9wcm9wZXJ0eShkcCwgIm1vZGVsIiwgTlVMTCk7CiAKIAlpZiAoIW1vZGVsKQogCQlyZXR1cm4gLUVOT0RFVjsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9LY29uZmlnIGIvYXJjaC9zcGFyYzY0L0tjb25maWcKaW5kZXggMWE2MzQ4Yi4uNTkwYTQxYiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L0tjb25maWcKKysrIGIvYXJjaC9zcGFyYzY0L0tjb25maWcKQEAgLTE5LDYgKzE5LDE0IEBACiAJICBTUEFSQzY0IHBvcnRzOyBpdHMgd2ViIHBhZ2UgaXMgYXZhaWxhYmxlIGF0CiAJICA8aHR0cDovL3d3dy51bHRyYWxpbnV4Lm9yZy8+LgogCitjb25maWcgR0VORVJJQ19USU1FCisJYm9vbAorCWRlZmF1bHQgeQorCitjb25maWcgR0VORVJJQ19DTE9DS0VWRU5UUworCWJvb2wKKwlkZWZhdWx0IHkKKwogY29uZmlnIDY0QklUCiAJZGVmX2Jvb2wgeQogCkBAIC0zNCwxMCArNDIsNiBAQAogCWJvb2wKIAlkZWZhdWx0IHkKIAotY29uZmlnIFRJTUVfSU5URVJQT0xBVElPTgotCWJvb2wKLQlkZWZhdWx0IHkKLQogY29uZmlnIEFSQ0hfTUFZX0hBVkVfUENfRkRDCiAJYm9vbAogCWRlZmF1bHQgeQpAQCAtMTEzLDYgKzExNyw4IEBACiAKIG1lbnUgIkdlbmVyYWwgbWFjaGluZSBzZXR1cCIKIAorc291cmNlICJrZXJuZWwvdGltZS9LY29uZmlnIgorCiBjb25maWcgU01QCiAJYm9vbCAiU3ltbWV0cmljIG11bHRpLXByb2Nlc3Npbmcgc3VwcG9ydCIKIAktLS1oZWxwLS0tCkBAIC0yMTQsNiArMjIwLDcgQEAKIAogY29uZmlnIEFSQ0hfU1BBUlNFTUVNX0RFRkFVTFQKIAlkZWZfYm9vbCB5CisJc2VsZWN0IFNQQVJTRU1FTV9TVEFUSUMKIAogY29uZmlnIExBUkdFX0FMTE9DUwogCWRlZl9ib29sIHkKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvY2VudHJhbC5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9jZW50cmFsLmMKaW5kZXggZTcyNGM1NC4uYzY1YjJmOSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9jZW50cmFsLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9jZW50cmFsLmMKQEAgLTMyLDcgKzMyLDcgQEAKIHN0YXRpYyB2b2lkIGNlbnRyYWxfcmFuZ2VzX2luaXQoc3RydWN0IGxpbnV4X2NlbnRyYWwgKmNlbnRyYWwpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpkcCA9IGNlbnRyYWwtPnByb21fbm9kZTsKLQl2b2lkICpwdmFsOworCWNvbnN0IHZvaWQgKnB2YWw7CiAJaW50IGxlbjsKIAkKIAljZW50cmFsLT5udW1fY2VudHJhbF9yYW5nZXMgPSAwOwpAQCAtNDcsNyArNDcsNyBAQAogc3RhdGljIHZvaWQgZmhjX3Jhbmdlc19pbml0KHN0cnVjdCBsaW51eF9maGMgKmZoYykKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwID0gZmhjLT5wcm9tX25vZGU7Ci0Jdm9pZCAqcHZhbDsKKwljb25zdCB2b2lkICpwdmFsOwogCWludCBsZW47CiAJCiAJZmhjLT5udW1fZmhjX3JhbmdlcyA9IDA7CkBAIC0xMTksNyArMTE5LDcgQEAKIHN0YXRpYyB2b2lkIHByb2JlX290aGVyX2ZoY3Modm9pZCkKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwOwotCXN0cnVjdCBsaW51eF9wcm9tNjRfcmVnaXN0ZXJzICpmcHJlZ3M7CisJY29uc3Qgc3RydWN0IGxpbnV4X3Byb202NF9yZWdpc3RlcnMgKmZwcmVnczsKIAogCWZvcl9lYWNoX25vZGVfYnlfbmFtZShkcCwgImZoYyIpIHsKIAkJc3RydWN0IGxpbnV4X2ZoYyAqZmhjOwpAQCAtMTkwLDcgKzE5MCw4IEBACiAJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKmZwKQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHA7Ci0Jc3RydWN0IGxpbnV4X3Byb21fcmVnaXN0ZXJzIGNyZWdzWzNdLCAqcHI7CisJc3RydWN0IGxpbnV4X3Byb21fcmVnaXN0ZXJzIGNyZWdzWzNdOworCWNvbnN0IHN0cnVjdCBsaW51eF9wcm9tX3JlZ2lzdGVycyAqcHI7CiAJaW50IG5zbG90cywgdG1wLCBucmVnczsKIAogCWRwID0gZnAtPmNoaWxkOwpAQCAtMjk5LDcgKzMwMCw4IEBACiAKIHZvaWQgY2VudHJhbF9wcm9iZSh2b2lkKQogewotCXN0cnVjdCBsaW51eF9wcm9tX3JlZ2lzdGVycyBmcHJlZ3NbNl0sICpwcjsKKwlzdHJ1Y3QgbGludXhfcHJvbV9yZWdpc3RlcnMgZnByZWdzWzZdOworCWNvbnN0IHN0cnVjdCBsaW51eF9wcm9tX3JlZ2lzdGVycyAqcHI7CiAJc3RydWN0IGxpbnV4X2ZoYyAqZmhjOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAsICpmcDsKIAlpbnQgZXJyOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9jaG1jLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL2NobWMuYwppbmRleCA5Njk5YWJlLi43NzdkMzQ1IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL2NobWMuYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL2NobWMuYwpAQCAtMzQzLDggKzM0Myw4IEBACiB7CiAJc3RydWN0IG1jdHJsX2luZm8gKm1wID0ga3phbGxvYyhzaXplb2YoKm1wKSwgR0ZQX0tFUk5FTCk7CiAJaW50IHBvcnRpZCA9IG9mX2dldGludHByb3BfZGVmYXVsdChkcCwgInBvcnRpZCIsIC0xKTsKLQlzdHJ1Y3QgbGludXhfcHJvbTY0X3JlZ2lzdGVycyAqcmVnczsKLQl2b2lkICpwdmFsOworCWNvbnN0IHN0cnVjdCBsaW51eF9wcm9tNjRfcmVnaXN0ZXJzICpyZWdzOworCWNvbnN0IHZvaWQgKnB2YWw7CiAJaW50IGxlbjsKIAogCWlmICghbXApCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL2VidXMuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvZWJ1cy5jCmluZGV4IDM1YmY4OTUuLjBhY2UxN2IgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvZWJ1cy5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvZWJ1cy5jCkBAIC0yODUsNyArMjg1LDcgQEAKIAkJCQkgICBpbnQgbm9uX3N0YW5kYXJkX3JlZ3MpCiB7CiAJc3RydWN0IG9mX2RldmljZSAqb3A7Ci0JaW50ICpyZWdzOworCWNvbnN0IGludCAqcmVnczsKIAlpbnQgaSwgbGVuOwogCiAJZGV2LT5wcm9tX25vZGUgPSBkcDsKQEAgLTQzOCwxMSArNDM4LDkgQEAKIAogdm9pZCBfX2luaXQgZWJ1c19pbml0KHZvaWQpCiB7Ci0Jc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtOwogCXN0cnVjdCBsaW51eF9lYnVzX2RldmljZSAqZGV2OwogCXN0cnVjdCBsaW51eF9lYnVzICplYnVzOwogCXN0cnVjdCBwY2lfZGV2ICpwZGV2OwotCXN0cnVjdCBwY2lkZXZfY29va2llICpjb29raWU7CiAJc3RydWN0IGRldmljZV9ub2RlICpkcDsKIAlpbnQgaXNfcmlvOwogCWludCBudW1fZWJ1cyA9IDA7CkBAIC00NTMsOCArNDUxLDcgQEAKIAkJcmV0dXJuOwogCX0KIAotCWNvb2tpZSA9IHBkZXYtPnN5c2RhdGE7Ci0JZHAgPSBjb29raWUtPnByb21fbm9kZTsKKwlkcCA9IHBjaV9kZXZpY2VfdG9fT0Zfbm9kZShwZGV2KTsKIAogCWVidXNfY2hhaW4gPSBlYnVzID0gZWJ1c19hbGxvYyhzaXplb2Yoc3RydWN0IGxpbnV4X2VidXMpKTsKIAllYnVzLT5uZXh0ID0gTlVMTDsKQEAgLTQ4MCw4ICs0NzcsNyBAQAogCQkJCWJyZWFrOwogCQkJfQogCQkJZWJ1cy0+aXNfcmlvID0gaXNfcmlvOwotCQkJY29va2llID0gcGRldi0+c3lzZGF0YTsKLQkJCWRwID0gY29va2llLT5wcm9tX25vZGU7CisJCQlkcCA9IHBjaV9kZXZpY2VfdG9fT0Zfbm9kZShwZGV2KTsKIAkJCWNvbnRpbnVlOwogCQl9CiAJCXByaW50aygiZWJ1cyVkOiIsIG51bV9lYnVzKTsKQEAgLTQ4OSw3ICs0ODUsNiBAQAogCQllYnVzLT5pbmRleCA9IG51bV9lYnVzOwogCQllYnVzLT5wcm9tX25vZGUgPSBkcDsKIAkJZWJ1cy0+c2VsZiA9IHBkZXY7Ci0JCWVidXMtPnBhcmVudCA9IHBibSA9IGNvb2tpZS0+cGJtOwogCiAJCWVidXMtPm9mZGV2Lm5vZGUgPSBkcDsKIAkJZWJ1cy0+b2ZkZXYuZGV2LnBhcmVudCA9ICZwZGV2LT5kZXY7CkBAIC01MzEsOCArNTI2LDcgQEAKIAkJaWYgKCFwZGV2KQogCQkJYnJlYWs7CiAKLQkJY29va2llID0gcGRldi0+c3lzZGF0YTsKLQkJZHAgPSBjb29raWUtPnByb21fbm9kZTsKKwkJZHAgPSBwY2lfZGV2aWNlX3RvX09GX25vZGUocGRldik7CiAKIAkJZWJ1cy0+bmV4dCA9IGVidXNfYWxsb2Moc2l6ZW9mKHN0cnVjdCBsaW51eF9lYnVzKSk7CiAJCWVidXMgPSBlYnVzLT5uZXh0OwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9pcnEuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvaXJxLmMKaW5kZXggYzQ0M2RiMS4uNjI0MWUzZCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9pcnEuYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL2lycS5jCkBAIC01ODksMzIgKzU4OSw2IEBACiAJICAgICAgIGlubywgdmlydF9pcnEpOwogfQogCi0jaWZuZGVmIENPTkZJR19TTVAKLWV4dGVybiBpcnFyZXR1cm5fdCB0aW1lcl9pbnRlcnJ1cHQoaW50LCB2b2lkICopOwotCi12b2lkIHRpbWVyX2lycShpbnQgaXJxLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQl1bnNpZ25lZCBsb25nIGNscl9tYXNrID0gMSA8PCBpcnE7Ci0JdW5zaWduZWQgbG9uZyB0aWNrX21hc2sgPSB0aWNrX29wcy0+c29mdGludF9tYXNrOwotCXN0cnVjdCBwdF9yZWdzICpvbGRfcmVnczsKLQotCWlmIChnZXRfc29mdGludCgpICYgdGlja19tYXNrKSB7Ci0JCWlycSA9IDA7Ci0JCWNscl9tYXNrID0gdGlja19tYXNrOwotCX0KLQljbGVhcl9zb2Z0aW50KGNscl9tYXNrKTsKLQotCW9sZF9yZWdzID0gc2V0X2lycV9yZWdzKHJlZ3MpOwotCWlycV9lbnRlcigpOwotCi0Ja3N0YXRfdGhpc19jcHUuaXJxc1swXSsrOwotCXRpbWVyX2ludGVycnVwdChpcnEsIE5VTEwpOwotCi0JaXJxX2V4aXQoKTsKLQlzZXRfaXJxX3JlZ3Mob2xkX3JlZ3MpOwotfQotI2VuZGlmCi0KIHZvaWQgaGFuZGxlcl9pcnEoaW50IGlycSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJc3RydWN0IGlub19idWNrZXQgKmJ1Y2tldDsKQEAgLTY1Myw3ICs2MjcsNyBAQAogc3RhdGljIHZvaWQgbWFwX3Byb21fdGltZXJzKHZvaWQpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpkcDsKLQl1bnNpZ25lZCBpbnQgKmFkZHI7CisJY29uc3QgdW5zaWduZWQgaW50ICphZGRyOwogCiAJLyogUFJPTSB0aW1lciBub2RlIGhhbmdzIG91dCBpbiB0aGUgdG9wIGxldmVsIG9mIGRldmljZSBzaWJsaW5ncy4uLiAqLwogCWRwID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgoIi8iKTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvaXNhLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL2lzYS5jCmluZGV4IDk4NzIxYTguLjZhNjg4MmUgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvaXNhLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9pc2EuYwpAQCAtMjQsMjcgKzI0LDkgQEAKIAogc3RhdGljIHZvaWQgX19pbml0IGlzYV9kZXZfZ2V0X3Jlc291cmNlKHN0cnVjdCBzcGFyY19pc2FfZGV2aWNlICppc2FfZGV2KQogewotCXN0cnVjdCBsaW51eF9wcm9tX3JlZ2lzdGVycyAqcHJlZ3M7Ci0JdW5zaWduZWQgbG9uZyBiYXNlLCBsZW47Ci0JaW50IHByb3BfbGVuOworCXN0cnVjdCBvZl9kZXZpY2UgKm9wID0gb2ZfZmluZF9kZXZpY2VfYnlfbm9kZShpc2FfZGV2LT5wcm9tX25vZGUpOwogCi0JcHJlZ3MgPSBvZl9nZXRfcHJvcGVydHkoaXNhX2Rldi0+cHJvbV9ub2RlLCAicmVnIiwgJnByb3BfbGVuKTsKLQlpZiAoIXByZWdzKQotCQlyZXR1cm47Ci0KLQkvKiBPbmx5IHRoZSBmaXJzdCBvbmUgaXMgaW50ZXJlc3RpbmcuICovCi0JbGVuID0gcHJlZ3NbMF0ucmVnX3NpemU7Ci0JYmFzZSA9ICgoKHVuc2lnbmVkIGxvbmcpcHJlZ3NbMF0ud2hpY2hfaW8gPDwgMzIpIHwKLQkJKHVuc2lnbmVkIGxvbmcpcHJlZ3NbMF0ucGh5c19hZGRyKTsKLQliYXNlICs9IGlzYV9kZXYtPmJ1cy0+cGFyZW50LT5pb19zcGFjZS5zdGFydDsKLQotCWlzYV9kZXYtPnJlc291cmNlLnN0YXJ0ID0gYmFzZTsKLQlpc2FfZGV2LT5yZXNvdXJjZS5lbmQgICA9IChiYXNlICsgbGVuIC0gMVVMKTsKLQlpc2FfZGV2LT5yZXNvdXJjZS5mbGFncyA9IElPUkVTT1VSQ0VfSU87Ci0JaXNhX2Rldi0+cmVzb3VyY2UubmFtZSAgPSBpc2FfZGV2LT5wcm9tX25vZGUtPm5hbWU7Ci0KLQlyZXF1ZXN0X3Jlc291cmNlKCZpc2FfZGV2LT5idXMtPnBhcmVudC0+aW9fc3BhY2UsCi0JCQkgJmlzYV9kZXYtPnJlc291cmNlKTsKKwltZW1jcHkoJmlzYV9kZXYtPnJlc291cmNlLCAmb3AtPnJlc291cmNlWzBdLCBzaXplb2Yoc3RydWN0IHJlc291cmNlKSk7CiB9CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBpc2FfZGV2X2dldF9pcnEoc3RydWN0IHNwYXJjX2lzYV9kZXZpY2UgKmlzYV9kZXYpCkBAIC0xNTgsMTkgKzE0MCwxMCBAQAogCiAJcGRldiA9IE5VTEw7CiAJd2hpbGUgKChwZGV2ID0gcGNpX2dldF9kZXZpY2UodmVuZG9yLCBkZXZpY2UsIHBkZXYpKSAhPSBOVUxMKSB7Ci0JCXN0cnVjdCBwY2lkZXZfY29va2llICpwZGV2X2Nvb2tpZTsKLQkJc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtOwogCQlzdHJ1Y3Qgc3BhcmNfaXNhX2JyaWRnZSAqaXNhX2JyOwogCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwOwogCi0JCXBkZXZfY29va2llID0gcGRldi0+c3lzZGF0YTsKLQkJaWYgKCFwZGV2X2Nvb2tpZSkgewotCQkJcHJpbnRrKCJJU0E6IFdhcm5pbmcsIElTQSBicmlkZ2UgaWdub3JlZCBkdWUgdG8gIgotCQkJICAgICAgICJsYWNrIG9mIE9CUCBkYXRhLlxuIik7Ci0JCQljb250aW51ZTsKLQkJfQotCQlwYm0gPSBwZGV2X2Nvb2tpZS0+cGJtOwotCQlkcCA9IHBkZXZfY29va2llLT5wcm9tX25vZGU7CisJCWRwID0gcGNpX2RldmljZV90b19PRl9ub2RlKHBkZXYpOwogCiAJCWlzYV9iciA9IGt6YWxsb2Moc2l6ZW9mKCppc2FfYnIpLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFpc2FfYnIpIHsKQEAgLTE5NSwxMCArMTY4LDkgQEAKIAkJaXNhX2JyLT5uZXh0ID0gaXNhX2NoYWluOwogCQlpc2FfY2hhaW4gPSBpc2FfYnI7CiAKLQkJaXNhX2JyLT5wYXJlbnQgPSBwYm07CiAJCWlzYV9ici0+c2VsZiA9IHBkZXY7CiAJCWlzYV9ici0+aW5kZXggPSBpbmRleCsrOwotCQlpc2FfYnItPnByb21fbm9kZSA9IHBkZXZfY29va2llLT5wcm9tX25vZGU7CisJCWlzYV9ici0+cHJvbV9ub2RlID0gZHA7CiAKIAkJcHJpbnRrKCJpc2ElZDoiLCBpc2FfYnItPmluZGV4KTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9vZl9kZXZpY2UuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvb2ZfZGV2aWNlLmMKaW5kZXggZmI5YmYxZS4uOWFjOWEzMCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9vZl9kZXZpY2UuYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL29mX2RldmljZS5jCkBAIC0yNDUsNyArMjQ1LDcgQEAKIAkJCQkgICAgICAgaW50ICphZGRyYywgaW50ICpzaXplYyk7CiAJaW50CQkoKm1hcCkodTMyICphZGRyLCBjb25zdCB1MzIgKnJhbmdlLAogCQkJICAgICAgIGludCBuYSwgaW50IG5zLCBpbnQgcG5hKTsKLQl1bnNpZ25lZCBpbnQJKCpnZXRfZmxhZ3MpKHUzMiAqYWRkcik7CisJdW5zaWduZWQgaW50CSgqZ2V0X2ZsYWdzKShjb25zdCB1MzIgKmFkZHIpOwogfTsKIAogLyoKQEAgLTMwNSw3ICszMDUsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdW5zaWduZWQgaW50IG9mX2J1c19kZWZhdWx0X2dldF9mbGFncyh1MzIgKmFkZHIpCitzdGF0aWMgdW5zaWduZWQgaW50IG9mX2J1c19kZWZhdWx0X2dldF9mbGFncyhjb25zdCB1MzIgKmFkZHIpCiB7CiAJcmV0dXJuIElPUkVTT1VSQ0VfTUVNOwogfQpAQCAtMzE3LDYgKzMxNywxMSBAQAogc3RhdGljIGludCBvZl9idXNfcGNpX21hdGNoKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCiB7CiAJaWYgKCFzdHJjbXAobnAtPnR5cGUsICJwY2kiKSB8fCAhc3RyY21wKG5wLT50eXBlLCAicGNpZXgiKSkgeworCQljb25zdCBjaGFyICptb2RlbCA9IG9mX2dldF9wcm9wZXJ0eShucCwgIm1vZGVsIiwgTlVMTCk7CisKKwkJaWYgKG1vZGVsICYmICFzdHJjbXAobW9kZWwsICJTVU5XLHNpbWJhIikpCisJCQlyZXR1cm4gMDsKKwogCQkvKiBEbyBub3QgZG8gUENJIHNwZWNpZmljIGZyb2JiaW5nIGlmIHRoZQogCQkgKiBQQ0kgYnJpZGdlIGxhY2tzIGEgcmFuZ2VzIHByb3BlcnR5LiAgV2UKIAkJICogd2FudCB0byBwYXNzIGl0IHRocm91Z2ggdXAgdG8gdGhlIG5leHQKQEAgLTMzMiw2ICszMzcsMjEgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBvZl9idXNfc2ltYmFfbWF0Y2goc3RydWN0IGRldmljZV9ub2RlICpucCkKK3sKKwljb25zdCBjaGFyICptb2RlbCA9IG9mX2dldF9wcm9wZXJ0eShucCwgIm1vZGVsIiwgTlVMTCk7CisKKwlpZiAobW9kZWwgJiYgIXN0cmNtcChtb2RlbCwgIlNVTlcsc2ltYmEiKSkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb2ZfYnVzX3NpbWJhX21hcCh1MzIgKmFkZHIsIGNvbnN0IHUzMiAqcmFuZ2UsCisJCQkgICAgaW50IG5hLCBpbnQgbnMsIGludCBwbmEpCit7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyB2b2lkIG9mX2J1c19wY2lfY291bnRfY2VsbHMoc3RydWN0IGRldmljZV9ub2RlICpucCwKIAkJCQkgICBpbnQgKmFkZHJjLCBpbnQgKnNpemVjKQogewpAQCAtMzY5LDcgKzM4OSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgb2ZfYnVzX3BjaV9nZXRfZmxhZ3ModTMyICphZGRyKQorc3RhdGljIHVuc2lnbmVkIGludCBvZl9idXNfcGNpX2dldF9mbGFncyhjb25zdCB1MzIgKmFkZHIpCiB7CiAJdW5zaWduZWQgaW50IGZsYWdzID0gMDsKIAl1MzIgdyA9IGFkZHJbMF07CkBAIC00MzYsNiArNDU2LDE1IEBACiAJCS5tYXAgPSBvZl9idXNfcGNpX21hcCwKIAkJLmdldF9mbGFncyA9IG9mX2J1c19wY2lfZ2V0X2ZsYWdzLAogCX0sCisJLyogU0lNQkEgKi8KKwl7CisJCS5uYW1lID0gInNpbWJhIiwKKwkJLmFkZHJfcHJvcF9uYW1lID0gImFzc2lnbmVkLWFkZHJlc3NlcyIsCisJCS5tYXRjaCA9IG9mX2J1c19zaW1iYV9tYXRjaCwKKwkJLmNvdW50X2NlbGxzID0gb2ZfYnVzX3BjaV9jb3VudF9jZWxscywKKwkJLm1hcCA9IG9mX2J1c19zaW1iYV9tYXAsCisJCS5nZXRfZmxhZ3MgPSBvZl9idXNfcGNpX2dldF9mbGFncywKKwl9LAogCS8qIFNCVVMgKi8KIAl7CiAJCS5uYW1lID0gInNidXMiLApAQCAtNDgyLDcgKzUxMSw3IEBACiAJCQkJICAgICB1MzIgKmFkZHIsCiAJCQkJICAgICBpbnQgbmEsIGludCBucywgaW50IHBuYSkKIHsKLQl1MzIgKnJhbmdlczsKKwljb25zdCB1MzIgKnJhbmdlczsKIAl1bnNpZ25lZCBpbnQgcmxlbjsKIAlpbnQgcm9uZTsKIApAQCAtNTEzLDcgKzU0Miw3IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IHVzZV8xdG8xX21hcHBpbmcoc3RydWN0IGRldmljZV9ub2RlICpwcCkKIHsKLQljaGFyICptb2RlbDsKKwljb25zdCBjaGFyICptb2RlbDsKIAogCS8qIElmIHRoaXMgaXMgb24gdGhlIFBNVSBidXMsIGRvbid0IHRyeSB0byB0cmFuc2xhdGUgaXQgZXZlbgogCSAqIGlmIGEgcmFuZ2VzIHByb3BlcnR5IGV4aXN0cy4KQEAgLTU0OCw3ICs1NzcsNyBAQAogCXN0cnVjdCBvZl9idXMgKmJ1czsKIAlpbnQgbmEsIG5zOwogCWludCBpbmRleCwgbnVtX3JlZzsKLQl2b2lkICpwcmVnOworCWNvbnN0IHZvaWQgKnByZWc7CiAKIAlpZiAoIXBhcmVudCkKIAkJcmV0dXJuOwpAQCAtNTc4LDcgKzYwNyw3IEBACiAJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbnVtX3JlZzsgaW5kZXgrKykgewogCQlzdHJ1Y3QgcmVzb3VyY2UgKnIgPSAmb3AtPnJlc291cmNlW2luZGV4XTsKIAkJdTMyIGFkZHJbT0ZfTUFYX0FERFJfQ0VMTFNdOwotCQl1MzIgKnJlZyA9IChwcmVnICsgKGluZGV4ICogKChuYSArIG5zKSAqIDQpKSk7CisJCWNvbnN0IHUzMiAqcmVnID0gKHByZWcgKyAoaW5kZXggKiAoKG5hICsgbnMpICogNCkpKTsKIAkJc3RydWN0IGRldmljZV9ub2RlICpkcCA9IG9wLT5ub2RlOwogCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKnBwID0gcF9vcC0+bm9kZTsKIAkJc3RydWN0IG9mX2J1cyAqcGJ1cywgKmRidXM7CkBAIC02NDMsMTQgKzY3MiwxNCBAQAogCiBzdGF0aWMgc3RydWN0IGRldmljZV9ub2RlICogX19pbml0CiBhcHBseV9pbnRlcnJ1cHRfbWFwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAsIHN0cnVjdCBkZXZpY2Vfbm9kZSAqcHAsCi0JCSAgICB1MzIgKmltYXAsIGludCBpbWxlbiwgdTMyICppbWFzaywKKwkJICAgIGNvbnN0IHUzMiAqaW1hcCwgaW50IGltbGVuLCBjb25zdCB1MzIgKmltYXNrLAogCQkgICAgdW5zaWduZWQgaW50ICppcnFfcCkKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNwOwogCXVuc2lnbmVkIGludCBpcnEgPSAqaXJxX3A7CiAJc3RydWN0IG9mX2J1cyAqYnVzOwogCXBoYW5kbGUgaGFuZGxlOwotCXUzMiAqcmVnOworCWNvbnN0IHUzMiAqcmVnOwogCWludCBuYSwgbnVtX3JlZywgaTsKIAogCWJ1cyA9IG9mX21hdGNoX2J1cyhwcCk7CkBAIC03MDUsNyArNzM0LDcgQEAKIAkJCQkJICAgc3RydWN0IGRldmljZV9ub2RlICpwcCwKIAkJCQkJICAgdW5zaWduZWQgaW50IGlycSkKIHsKLQlzdHJ1Y3QgbGludXhfcHJvbV9wY2lfcmVnaXN0ZXJzICpyZWdzOworCWNvbnN0IHN0cnVjdCBsaW51eF9wcm9tX3BjaV9yZWdpc3RlcnMgKnJlZ3M7CiAJdW5zaWduZWQgaW50IGJ1cywgZGV2Zm4sIHNsb3QsIHJldDsKIAogCWlmIChpcnEgPCAxIHx8IGlycSA+IDQpCkBAIC03MzAsMTIgKzc1OSw2IEBACiAJCSAqIEQ6IDItYml0IHNsb3QgbnVtYmVyLCBkZXJpdmVkIGZyb20gUENJIGRldmljZSBudW1iZXIgYXMKIAkJICogICAgKGRldiAtIDEpIGZvciBidXMgQSwgb3IgKGRldiAtIDIpIGZvciBidXMgQgogCQkgKiBMOiAyLWJpdCBsaW5lIG51bWJlcgotCQkgKgotCQkgKiBBY3R1YWxseSwgbW9yZSAicG9ydGFibGUiIHdheSB0byBjYWxjdWxhdGUgdGhlIGZ1bmt5Ci0JCSAqIHNsb3QgbnVtYmVyIGlzIHRvIHN1YnRyYWN0IHBibS0+cGNpX2ZpcnN0X3Nsb3QgZnJvbSB0aGUKLQkJICogZGV2aWNlIG51bWJlciwgYW5kIHRoYXQncyBleGFjdGx5IHdoYXQgdGhlIHByZS1PRgotCQkgKiBzcGFyYzY0IGNvZGUgZGlkLCBidXQgd2UncmUgYnVpbGRpbmcgdGhpcyBzdHVmZiBnZW5lcmljYWxseQotCQkgKiB1c2luZyB0aGUgT0JQIHRyZWUsIG5vdCBpbiB0aGUgUENJIGNvbnRyb2xsZXIgbGF5ZXIuCiAJCSAqLwogCQlpZiAoYnVzICYgMHg4MCkgewogCQkJLyogUEJNLUEgKi8KQEAgLTc5NCw3ICs4MTcsNyBAQAogCXBwID0gZHAtPnBhcmVudDsKIAlpcCA9IE5VTEw7CiAJd2hpbGUgKHBwKSB7Ci0JCXZvaWQgKmltYXAsICppbXNrOworCQljb25zdCB2b2lkICppbWFwLCAqaW1zazsKIAkJaW50IGltbGVuOwogCiAJCWltYXAgPSBvZl9nZXRfcHJvcGVydHkocHAsICJpbnRlcnJ1cHQtbWFwIiwgJmltbGVuKTsKQEAgLTg1OSw3ICs4ODIsNyBAQAogCQkJCQkJIHN0cnVjdCBkZXZpY2UgKnBhcmVudCkKIHsKIAlzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCA9IGt6YWxsb2Moc2l6ZW9mKCpvcCksIEdGUF9LRVJORUwpOwotCXVuc2lnbmVkIGludCAqaXJxOworCWNvbnN0IHVuc2lnbmVkIGludCAqaXJxOwogCWludCBsZW4sIGk7CiAKIAlpZiAoIW9wKQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2kuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpLmMKaW5kZXggMTIxMDk4OC4uMDIzYWY0MSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2kuYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3BjaS5jCkBAIC0xLDkgKzEsMTEgQEAKLS8qICRJZDogcGNpLmMsdiAxLjM5IDIwMDIvMDEvMDUgMDE6MTM6NDMgZGF2ZW0gRXhwICQKLSAqIHBjaS5jOiBVbHRyYVNwYXJjIFBDSSBjb250cm9sbGVyIHN1cHBvcnQuCisvKiBwY2kuYzogVWx0cmFTcGFyYyBQQ0kgY29udHJvbGxlciBzdXBwb3J0LgogICoKICAqIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCwgMTk5OSBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQHJlZGhhdC5jb20pCiAgKiBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTkgRWRkaWUgQy4gRG9zdCAgIChlY2RAc2t5bmV0LmJlKQogICogQ29weXJpZ2h0IChDKSAxOTk5IEpha3ViIEplbGluZWsgICAoampAdWx0cmEubGludXguY3opCisgKgorICogT0YgdHJlZSBiYXNlZCBQQ0kgYnVzIHByb2JpbmcgdGFrZW4gZnJvbSB0aGUgUG93ZXJQQyBwb3J0CisgKiB3aXRoIG1pbm9yIG1vZGlmaWNhdGlvbnMsIHNlZSB0aGVyZSBmb3IgY3JlZGl0cy4KICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC0yNCw2ICsyNiw5IEBACiAjaW5jbHVkZSA8YXNtL2VidXMuaD4KICNpbmNsdWRlIDxhc20vaXNhLmg+CiAjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNpbmNsdWRlIDxhc20vYXBiLmg+CisKKyNpbmNsdWRlICJwY2lfaW1wbC5oIgogCiB1bnNpZ25lZCBsb25nIHBjaV9tZW1zcGFjZV9tYXNrID0gMHhmZmZmZmZmZlVMOwogCkBAIC0yNzcsMTAgKzI4MiwxMCBAQAogCXJldHVybiBwY2lfY29udHJvbGxlcl9zY2FuKHBjaV9pc19jb250cm9sbGVyKTsKIH0KIAotc3RydWN0IHBjaV9pb21tdV9vcHMgKnBjaV9pb21tdV9vcHM7Citjb25zdCBzdHJ1Y3QgcGNpX2lvbW11X29wcyAqcGNpX2lvbW11X29wczsKIEVYUE9SVF9TWU1CT0wocGNpX2lvbW11X29wcyk7CiAKLWV4dGVybiBzdHJ1Y3QgcGNpX2lvbW11X29wcyBwY2lfc3VuNHVfaW9tbXVfb3BzLAorZXh0ZXJuIGNvbnN0IHN0cnVjdCBwY2lfaW9tbXVfb3BzIHBjaV9zdW40dV9pb21tdV9vcHMsCiAJcGNpX3N1bjR2X2lvbW11X29wczsKIAogLyogRmluZCBlYWNoIGNvbnRyb2xsZXIgaW4gdGhlIHN5c3RlbSwgYXR0YWNoIGFuZCBpbml0aWFsaXplCkBAIC0zMDAsNiArMzA1LDQ2NyBAQAogCXBjaV9jb250cm9sbGVyX3NjYW4ocGNpX2NvbnRyb2xsZXJfaW5pdCk7CiB9CiAKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHBjaV9wYXJzZV9vZl9mbGFncyh1MzIgYWRkcjApCit7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CisKKwlpZiAoYWRkcjAgJiAweDAyMDAwMDAwKSB7CisJCWZsYWdzID0gSU9SRVNPVVJDRV9NRU0gfCBQQ0lfQkFTRV9BRERSRVNTX1NQQUNFX01FTU9SWTsKKwkJZmxhZ3MgfD0gKGFkZHIwID4+IDIyKSAmIFBDSV9CQVNFX0FERFJFU1NfTUVNX1RZUEVfNjQ7CisJCWZsYWdzIHw9IChhZGRyMCA+PiAyOCkgJiBQQ0lfQkFTRV9BRERSRVNTX01FTV9UWVBFXzFNOworCQlpZiAoYWRkcjAgJiAweDQwMDAwMDAwKQorCQkJZmxhZ3MgfD0gSU9SRVNPVVJDRV9QUkVGRVRDSAorCQkJCSB8IFBDSV9CQVNFX0FERFJFU1NfTUVNX1BSRUZFVENIOworCX0gZWxzZSBpZiAoYWRkcjAgJiAweDAxMDAwMDAwKQorCQlmbGFncyA9IElPUkVTT1VSQ0VfSU8gfCBQQ0lfQkFTRV9BRERSRVNTX1NQQUNFX0lPOworCXJldHVybiBmbGFnczsKK30KKworLyogVGhlIG9mX2RldmljZSBsYXllciBoYXMgdHJhbnNsYXRlZCBhbGwgb2YgdGhlIGFzc2lnbmVkLWFkZHJlc3MgcHJvcGVydGllcworICogaW50byBwaHlzaWNhbCBhZGRyZXNzIHJlc291cmNlcywgd2Ugb25seSBoYXZlIHRvIGZpZ3VyZSBvdXQgdGhlIHJlZ2lzdGVyCisgKiBtYXBwaW5nLgorICovCitzdGF0aWMgdm9pZCBwY2lfcGFyc2Vfb2ZfYWRkcnMoc3RydWN0IG9mX2RldmljZSAqb3AsCisJCQkgICAgICAgc3RydWN0IGRldmljZV9ub2RlICpub2RlLAorCQkJICAgICAgIHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJc3RydWN0IHJlc291cmNlICpvcF9yZXM7CisJY29uc3QgdTMyICphZGRyczsKKwlpbnQgcHJvcGxlbjsKKworCWFkZHJzID0gb2ZfZ2V0X3Byb3BlcnR5KG5vZGUsICJhc3NpZ25lZC1hZGRyZXNzZXMiLCAmcHJvcGxlbik7CisJaWYgKCFhZGRycykKKwkJcmV0dXJuOworCXByaW50aygiICAgIHBhcnNlIGFkZHJlc3NlcyAoJWQgYnl0ZXMpIEAgJXBcbiIsIHByb3BsZW4sIGFkZHJzKTsKKwlvcF9yZXMgPSAmb3AtPnJlc291cmNlWzBdOworCWZvciAoOyBwcm9wbGVuID49IDIwOyBwcm9wbGVuIC09IDIwLCBhZGRycyArPSA1LCBvcF9yZXMrKykgeworCQlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJaW50IGk7CisKKwkJZmxhZ3MgPSBwY2lfcGFyc2Vfb2ZfZmxhZ3MoYWRkcnNbMF0pOworCQlpZiAoIWZsYWdzKQorCQkJY29udGludWU7CisJCWkgPSBhZGRyc1swXSAmIDB4ZmY7CisJCXByaW50aygiICBzdGFydDogJWx4LCBlbmQ6ICVseCwgaTogJXhcbiIsCisJCSAgICAgICBvcF9yZXMtPnN0YXJ0LCBvcF9yZXMtPmVuZCwgaSk7CisKKwkJaWYgKFBDSV9CQVNFX0FERFJFU1NfMCA8PSBpICYmIGkgPD0gUENJX0JBU0VfQUREUkVTU181KSB7CisJCQlyZXMgPSAmZGV2LT5yZXNvdXJjZVsoaSAtIFBDSV9CQVNFX0FERFJFU1NfMCkgPj4gMl07CisJCX0gZWxzZSBpZiAoaSA9PSBkZXYtPnJvbV9iYXNlX3JlZykgeworCQkJcmVzID0gJmRldi0+cmVzb3VyY2VbUENJX1JPTV9SRVNPVVJDRV07CisJCQlmbGFncyB8PSBJT1JFU09VUkNFX1JFQURPTkxZIHwgSU9SRVNPVVJDRV9DQUNIRUFCTEU7CisJCX0gZWxzZSB7CisJCQlwcmludGsoS0VSTl9FUlIgIlBDSTogYmFkIGNmZyByZWcgbnVtIDB4JXhcbiIsIGkpOworCQkJY29udGludWU7CisJCX0KKwkJcmVzLT5zdGFydCA9IG9wX3Jlcy0+c3RhcnQ7CisJCXJlcy0+ZW5kID0gb3BfcmVzLT5lbmQ7CisJCXJlcy0+ZmxhZ3MgPSBmbGFnczsKKwkJcmVzLT5uYW1lID0gcGNpX25hbWUoZGV2KTsKKwl9Cit9CisKK3N0cnVjdCBwY2lfZGV2ICpvZl9jcmVhdGVfcGNpX2RldihzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0sCisJCQkJICBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsCisJCQkJICBzdHJ1Y3QgcGNpX2J1cyAqYnVzLCBpbnQgZGV2Zm4sCisJCQkJICBpbnQgaG9zdF9jb250cm9sbGVyKQoreworCXN0cnVjdCBkZXZfYXJjaGRhdGEgKnNkOworCXN0cnVjdCBwY2lfZGV2ICpkZXY7CisJY29uc3QgY2hhciAqdHlwZTsKKwl1MzIgY2xhc3M7CisKKwlkZXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcGNpX2RldiksIEdGUF9LRVJORUwpOworCWlmICghZGV2KQorCQlyZXR1cm4gTlVMTDsKKworCXNkID0gJmRldi0+ZGV2LmFyY2hkYXRhOworCXNkLT5pb21tdSA9IHBibS0+aW9tbXU7CisJc2QtPnN0YyA9ICZwYm0tPnN0YzsKKwlzZC0+aG9zdF9jb250cm9sbGVyID0gcGJtOworCXNkLT5wcm9tX25vZGUgPSBub2RlOworCXNkLT5vcCA9IG9mX2ZpbmRfZGV2aWNlX2J5X25vZGUobm9kZSk7CisJc2QtPm1zaV9udW0gPSAweGZmZmZmZmZmOworCisJdHlwZSA9IG9mX2dldF9wcm9wZXJ0eShub2RlLCAiZGV2aWNlX3R5cGUiLCBOVUxMKTsKKwlpZiAodHlwZSA9PSBOVUxMKQorCQl0eXBlID0gIiI7CisKKwlwcmludGsoIiAgICBjcmVhdGUgZGV2aWNlLCBkZXZmbjogJXgsIHR5cGU6ICVzIGhvc3Rjb250cm9sbGVyKCVkKVxuIiwKKwkgICAgICAgZGV2Zm4sIHR5cGUsIGhvc3RfY29udHJvbGxlcik7CisKKwlkZXYtPmJ1cyA9IGJ1czsKKwlkZXYtPnN5c2RhdGEgPSBub2RlOworCWRldi0+ZGV2LnBhcmVudCA9IGJ1cy0+YnJpZGdlOworCWRldi0+ZGV2LmJ1cyA9ICZwY2lfYnVzX3R5cGU7CisJZGV2LT5kZXZmbiA9IGRldmZuOworCWRldi0+bXVsdGlmdW5jdGlvbiA9IDA7CQkvKiBtYXliZSBhIGxpZT8gKi8KKworCWlmIChob3N0X2NvbnRyb2xsZXIpIHsKKwkJZGV2LT52ZW5kb3IgPSAweDEwOGU7CisJCWRldi0+ZGV2aWNlID0gMHg4MDAwOworCQlkZXYtPnN1YnN5c3RlbV92ZW5kb3IgPSAweDAwMDA7CisJCWRldi0+c3Vic3lzdGVtX2RldmljZSA9IDB4MDAwMDsKKwkJZGV2LT5jZmdfc2l6ZSA9IDI1NjsKKwkJZGV2LT5jbGFzcyA9IFBDSV9DTEFTU19CUklER0VfSE9TVCA8PCA4OworCQlzcHJpbnRmKHBjaV9uYW1lKGRldiksICIlMDR4OiUwMng6JTAyeC4lZCIsIHBjaV9kb21haW5fbnIoYnVzKSwKKwkJCTB4MDAsIFBDSV9TTE9UKGRldmZuKSwgUENJX0ZVTkMoZGV2Zm4pKTsKKwl9IGVsc2UgeworCQlkZXYtPnZlbmRvciA9IG9mX2dldGludHByb3BfZGVmYXVsdChub2RlLCAidmVuZG9yLWlkIiwgMHhmZmZmKTsKKwkJZGV2LT5kZXZpY2UgPSBvZl9nZXRpbnRwcm9wX2RlZmF1bHQobm9kZSwgImRldmljZS1pZCIsIDB4ZmZmZik7CisJCWRldi0+c3Vic3lzdGVtX3ZlbmRvciA9CisJCQlvZl9nZXRpbnRwcm9wX2RlZmF1bHQobm9kZSwgInN1YnN5c3RlbS12ZW5kb3ItaWQiLCAwKTsKKwkJZGV2LT5zdWJzeXN0ZW1fZGV2aWNlID0KKwkJCW9mX2dldGludHByb3BfZGVmYXVsdChub2RlLCAic3Vic3lzdGVtLWlkIiwgMCk7CisKKwkJZGV2LT5jZmdfc2l6ZSA9IHBjaV9jZmdfc3BhY2Vfc2l6ZShkZXYpOworCisJCS8qIFdlIGNhbid0IGFjdHVhbGx5IHVzZSB0aGUgZmlybXdhcmUgdmFsdWUsIHdlIGhhdmUKKwkJICogdG8gcmVhZCB3aGF0IGlzIGluIHRoZSByZWdpc3RlciByaWdodCBub3cuICBPbmUKKwkJICogcmVhc29uIGlzIHRoYXQgaW4gdGhlIGNhc2Ugb2YgSURFIGludGVyZmFjZXMgdGhlCisJCSAqIGZpcm13YXJlIGNhbiBzYW1wbGUgdGhlIHZhbHVlIGJlZm9yZSB0aGUgdGhlIElERQorCQkgKiBpbnRlcmZhY2UgaXMgcHJvZ3JhbW1lZCBpbnRvIG5hdGl2ZSBtb2RlLgorCQkgKi8KKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgUENJX0NMQVNTX1JFVklTSU9OLCAmY2xhc3MpOworCQlkZXYtPmNsYXNzID0gY2xhc3MgPj4gODsKKworCQlzcHJpbnRmKHBjaV9uYW1lKGRldiksICIlMDR4OiUwMng6JTAyeC4lZCIsIHBjaV9kb21haW5fbnIoYnVzKSwKKwkJCWRldi0+YnVzLT5udW1iZXIsIFBDSV9TTE9UKGRldmZuKSwgUENJX0ZVTkMoZGV2Zm4pKTsKKwl9CisJcHJpbnRrKCIgICAgY2xhc3M6IDB4JXggZGV2aWNlIG5hbWU6ICVzXG4iLAorCSAgICAgICBkZXYtPmNsYXNzLCBwY2lfbmFtZShkZXYpKTsKKworCWRldi0+Y3VycmVudF9zdGF0ZSA9IDQ7CQkvKiB1bmtub3duIHBvd2VyIHN0YXRlICovCisJZGV2LT5lcnJvcl9zdGF0ZSA9IHBjaV9jaGFubmVsX2lvX25vcm1hbDsKKworCWlmIChob3N0X2NvbnRyb2xsZXIpIHsKKwkJZGV2LT5oZHJfdHlwZSA9IFBDSV9IRUFERVJfVFlQRV9CUklER0U7CisJCWRldi0+cm9tX2Jhc2VfcmVnID0gUENJX1JPTV9BRERSRVNTMTsKKwkJZGV2LT5pcnEgPSBQQ0lfSVJRX05PTkU7CisJfSBlbHNlIHsKKwkJaWYgKCFzdHJjbXAodHlwZSwgInBjaSIpIHx8ICFzdHJjbXAodHlwZSwgInBjaWV4IikpIHsKKwkJCS8qIGEgUENJLVBDSSBicmlkZ2UgKi8KKwkJCWRldi0+aGRyX3R5cGUgPSBQQ0lfSEVBREVSX1RZUEVfQlJJREdFOworCQkJZGV2LT5yb21fYmFzZV9yZWcgPSBQQ0lfUk9NX0FERFJFU1MxOworCQl9IGVsc2UgaWYgKCFzdHJjbXAodHlwZSwgImNhcmRidXMiKSkgeworCQkJZGV2LT5oZHJfdHlwZSA9IFBDSV9IRUFERVJfVFlQRV9DQVJEQlVTOworCQl9IGVsc2UgeworCQkJZGV2LT5oZHJfdHlwZSA9IFBDSV9IRUFERVJfVFlQRV9OT1JNQUw7CisJCQlkZXYtPnJvbV9iYXNlX3JlZyA9IFBDSV9ST01fQUREUkVTUzsKKworCQkJZGV2LT5pcnEgPSBzZC0+b3AtPmlycXNbMF07CisJCQlpZiAoZGV2LT5pcnEgPT0gMHhmZmZmZmZmZikKKwkJCQlkZXYtPmlycSA9IFBDSV9JUlFfTk9ORTsKKwkJfQorCX0KKwlwY2lfcGFyc2Vfb2ZfYWRkcnMoc2QtPm9wLCBub2RlLCBkZXYpOworCisJcHJpbnRrKCIgICAgYWRkaW5nIHRvIHN5c3RlbSAuLi5cbiIpOworCisJcGNpX2RldmljZV9hZGQoZGV2LCBidXMpOworCisJcmV0dXJuIGRldjsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGFwYl9jYWxjX2ZpcnN0X2xhc3QodTggbWFwLCB1MzIgKmZpcnN0X3AsIHUzMiAqbGFzdF9wKQoreworCXUzMiBpZHgsIGZpcnN0LCBsYXN0OworCisJZmlyc3QgPSA4OworCWxhc3QgPSAwOworCWZvciAoaWR4ID0gMDsgaWR4IDwgODsgaWR4KyspIHsKKwkJaWYgKChtYXAgJiAoMSA8PCBpZHgpKSAhPSAwKSB7CisJCQlpZiAoZmlyc3QgPiBpZHgpCisJCQkJZmlyc3QgPSBpZHg7CisJCQlpZiAobGFzdCA8IGlkeCkKKwkJCQlsYXN0ID0gaWR4OworCQl9CisJfQorCisJKmZpcnN0X3AgPSBmaXJzdDsKKwkqbGFzdF9wID0gbGFzdDsKK30KKworc3RhdGljIHZvaWQgX19pbml0IHBjaV9yZXNvdXJjZV9hZGp1c3Qoc3RydWN0IHJlc291cmNlICpyZXMsCisJCQkJICAgICAgIHN0cnVjdCByZXNvdXJjZSAqcm9vdCkKK3sKKwlyZXMtPnN0YXJ0ICs9IHJvb3QtPnN0YXJ0OworCXJlcy0+ZW5kICs9IHJvb3QtPnN0YXJ0OworfQorCisvKiBDb29rIHVwIGZha2UgYnVzIHJlc291cmNlcyBmb3IgU1VOVyxzaW1iYSBQQ0kgYnJpZGdlcyB3aGljaCBsYWNrCisgKiBhIHByb3BlciAncmFuZ2VzJyBwcm9wZXJ0eS4KKyAqLworc3RhdGljIHZvaWQgX19pbml0IGFwYl9mYWtlX3JhbmdlcyhzdHJ1Y3QgcGNpX2RldiAqZGV2LAorCQkJCSAgIHN0cnVjdCBwY2lfYnVzICpidXMsCisJCQkJICAgc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtKQoreworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCXUzMiBmaXJzdCwgbGFzdDsKKwl1OCBtYXA7CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIEFQQl9JT19BRERSRVNTX01BUCwgJm1hcCk7CisJYXBiX2NhbGNfZmlyc3RfbGFzdChtYXAsICZmaXJzdCwgJmxhc3QpOworCXJlcyA9IGJ1cy0+cmVzb3VyY2VbMF07CisJcmVzLT5zdGFydCA9IChmaXJzdCA8PCAyMSk7CisJcmVzLT5lbmQgPSAobGFzdCA8PCAyMSkgKyAoKDEgPDwgMjEpIC0gMSk7CisJcmVzLT5mbGFncyA9IElPUkVTT1VSQ0VfSU87CisJcGNpX3Jlc291cmNlX2FkanVzdChyZXMsICZwYm0tPmlvX3NwYWNlKTsKKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgQVBCX01FTV9BRERSRVNTX01BUCwgJm1hcCk7CisJYXBiX2NhbGNfZmlyc3RfbGFzdChtYXAsICZmaXJzdCwgJmxhc3QpOworCXJlcyA9IGJ1cy0+cmVzb3VyY2VbMV07CisJcmVzLT5zdGFydCA9IChmaXJzdCA8PCAyMSk7CisJcmVzLT5lbmQgPSAobGFzdCA8PCAyMSkgKyAoKDEgPDwgMjEpIC0gMSk7CisJcmVzLT5mbGFncyA9IElPUkVTT1VSQ0VfTUVNOworCXBjaV9yZXNvdXJjZV9hZGp1c3QocmVzLCAmcGJtLT5tZW1fc3BhY2UpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgcGNpX29mX3NjYW5fYnVzKHN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSwKKwkJCQkgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsCisJCQkJICAgc3RydWN0IHBjaV9idXMgKmJ1cyk7CisKKyNkZWZpbmUgR0VUXzY0QklUKHByb3AsIGkpCSgoKCh1NjQpIChwcm9wKVsoaSldKSA8PCAzMikgfCAocHJvcClbKGkpKzFdKQorCit2b2lkIF9fZGV2aW5pdCBvZl9zY2FuX3BjaV9icmlkZ2Uoc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtLAorCQkJCSAgc3RydWN0IGRldmljZV9ub2RlICpub2RlLAorCQkJCSAgc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgcGNpX2J1cyAqYnVzOworCWNvbnN0IHUzMiAqYnVzcmFuZ2UsICpyYW5nZXM7CisJaW50IGxlbiwgaSwgc2ltYmE7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJdW5zaWduZWQgaW50IGZsYWdzOworCXU2NCBzaXplOworCisJcHJpbnRrKCJvZl9zY2FuX3BjaV9icmlkZ2UoJXMpXG4iLCBub2RlLT5mdWxsX25hbWUpOworCisJLyogcGFyc2UgYnVzLXJhbmdlIHByb3BlcnR5ICovCisJYnVzcmFuZ2UgPSBvZl9nZXRfcHJvcGVydHkobm9kZSwgImJ1cy1yYW5nZSIsICZsZW4pOworCWlmIChidXNyYW5nZSA9PSBOVUxMIHx8IGxlbiAhPSA4KSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJDYW4ndCBnZXQgYnVzLXJhbmdlIGZvciBQQ0ktUENJIGJyaWRnZSAlc1xuIiwKKwkJICAgICAgIG5vZGUtPmZ1bGxfbmFtZSk7CisJCXJldHVybjsKKwl9CisJcmFuZ2VzID0gb2ZfZ2V0X3Byb3BlcnR5KG5vZGUsICJyYW5nZXMiLCAmbGVuKTsKKwlzaW1iYSA9IDA7CisJaWYgKHJhbmdlcyA9PSBOVUxMKSB7CisJCWNvbnN0IGNoYXIgKm1vZGVsID0gb2ZfZ2V0X3Byb3BlcnR5KG5vZGUsICJtb2RlbCIsIE5VTEwpOworCQlpZiAobW9kZWwgJiYgIXN0cmNtcChtb2RlbCwgIlNVTlcsc2ltYmEiKSkgeworCQkJc2ltYmEgPSAxOworCQl9IGVsc2UgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIkNhbid0IGdldCByYW5nZXMgZm9yIFBDSS1QQ0kgYnJpZGdlICVzXG4iLAorCQkJICAgICAgIG5vZGUtPmZ1bGxfbmFtZSk7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwlidXMgPSBwY2lfYWRkX25ld19idXMoZGV2LT5idXMsIGRldiwgYnVzcmFuZ2VbMF0pOworCWlmICghYnVzKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIGNyZWF0ZSBwY2kgYnVzIGZvciAlc1xuIiwKKwkJICAgICAgIG5vZGUtPmZ1bGxfbmFtZSk7CisJCXJldHVybjsKKwl9CisKKwlidXMtPnByaW1hcnkgPSBkZXYtPmJ1cy0+bnVtYmVyOworCWJ1cy0+c3Vib3JkaW5hdGUgPSBidXNyYW5nZVsxXTsKKwlidXMtPmJyaWRnZV9jdGwgPSAwOworCisJLyogcGFyc2UgcmFuZ2VzIHByb3BlcnR5LCBvciBjb29rIG9uZSB1cCBieSBoYW5kIGZvciBTaW1iYSAqLworCS8qIFBDSSAjYWRkcmVzcy1jZWxscyA9PSAzIGFuZCAjc2l6ZS1jZWxscyA9PSAyIGFsd2F5cyAqLworCXJlcyA9ICZkZXYtPnJlc291cmNlW1BDSV9CUklER0VfUkVTT1VSQ0VTXTsKKwlmb3IgKGkgPSAwOyBpIDwgUENJX05VTV9SRVNPVVJDRVMgLSBQQ0lfQlJJREdFX1JFU09VUkNFUzsgKytpKSB7CisJCXJlcy0+ZmxhZ3MgPSAwOworCQlidXMtPnJlc291cmNlW2ldID0gcmVzOworCQkrK3JlczsKKwl9CisJaWYgKHNpbWJhKSB7CisJCWFwYl9mYWtlX3JhbmdlcyhkZXYsIGJ1cywgcGJtKTsKKwkJZ290byBzaW1iYV9jb250OworCX0KKwlpID0gMTsKKwlmb3IgKDsgbGVuID49IDMyOyBsZW4gLT0gMzIsIHJhbmdlcyArPSA4KSB7CisJCXN0cnVjdCByZXNvdXJjZSAqcm9vdDsKKworCQlmbGFncyA9IHBjaV9wYXJzZV9vZl9mbGFncyhyYW5nZXNbMF0pOworCQlzaXplID0gR0VUXzY0QklUKHJhbmdlcywgNik7CisJCWlmIChmbGFncyA9PSAwIHx8IHNpemUgPT0gMCkKKwkJCWNvbnRpbnVlOworCQlpZiAoZmxhZ3MgJiBJT1JFU09VUkNFX0lPKSB7CisJCQlyZXMgPSBidXMtPnJlc291cmNlWzBdOworCQkJaWYgKHJlcy0+ZmxhZ3MpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIlBDSTogaWdub3JpbmcgZXh0cmEgSS9PIHJhbmdlIgorCQkJCSAgICAgICAiIGZvciBicmlkZ2UgJXNcbiIsIG5vZGUtPmZ1bGxfbmFtZSk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlyb290ID0gJnBibS0+aW9fc3BhY2U7CisJCX0gZWxzZSB7CisJCQlpZiAoaSA+PSBQQ0lfTlVNX1JFU09VUkNFUyAtIFBDSV9CUklER0VfUkVTT1VSQ0VTKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJQQ0k6IHRvbyBtYW55IG1lbW9yeSByYW5nZXMiCisJCQkJICAgICAgICIgZm9yIGJyaWRnZSAlc1xuIiwgbm9kZS0+ZnVsbF9uYW1lKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXJlcyA9IGJ1cy0+cmVzb3VyY2VbaV07CisJCQkrK2k7CisJCQlyb290ID0gJnBibS0+bWVtX3NwYWNlOworCQl9CisKKwkJcmVzLT5zdGFydCA9IEdFVF82NEJJVChyYW5nZXMsIDEpOworCQlyZXMtPmVuZCA9IHJlcy0+c3RhcnQgKyBzaXplIC0gMTsKKwkJcmVzLT5mbGFncyA9IGZsYWdzOworCisJCS8qIEFub3RoZXIgd2F5IHRvIGltcGxlbWVudCB0aGlzIHdvdWxkIGJlIHRvIGFkZCBhbiBvZl9kZXZpY2UKKwkJICogbGF5ZXIgcm91dGluZSB0aGF0IGNhbiBjYWxjdWxhdGUgYSByZXNvdXJjZSBmb3IgYSBnaXZlbgorCQkgKiByYW5nZSBwcm9wZXJ0eSB2YWx1ZSBpbiBhIFBDSSBkZXZpY2UuCisJCSAqLworCQlwY2lfcmVzb3VyY2VfYWRqdXN0KHJlcywgcm9vdCk7CisJfQorc2ltYmFfY29udDoKKwlzcHJpbnRmKGJ1cy0+bmFtZSwgIlBDSSBCdXMgJTA0eDolMDJ4IiwgcGNpX2RvbWFpbl9ucihidXMpLAorCQlidXMtPm51bWJlcik7CisJcHJpbnRrKCIgICAgYnVzIG5hbWU6ICVzXG4iLCBidXMtPm5hbWUpOworCisJcGNpX29mX3NjYW5fYnVzKHBibSwgbm9kZSwgYnVzKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IHBjaV9vZl9zY2FuX2J1cyhzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0sCisJCQkJICAgc3RydWN0IGRldmljZV9ub2RlICpub2RlLAorCQkJCSAgIHN0cnVjdCBwY2lfYnVzICpidXMpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpjaGlsZDsKKwljb25zdCB1MzIgKnJlZzsKKwlpbnQgcmVnbGVuLCBkZXZmbjsKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2OworCisJcHJpbnRrKCJQQ0k6IHNjYW5fYnVzWyVzXSBidXMgbm8gJWRcbiIsCisJICAgICAgIG5vZGUtPmZ1bGxfbmFtZSwgYnVzLT5udW1iZXIpOworCisJY2hpbGQgPSBOVUxMOworCXdoaWxlICgoY2hpbGQgPSBvZl9nZXRfbmV4dF9jaGlsZChub2RlLCBjaGlsZCkpICE9IE5VTEwpIHsKKwkJcHJpbnRrKCIgICogJXNcbiIsIGNoaWxkLT5mdWxsX25hbWUpOworCQlyZWcgPSBvZl9nZXRfcHJvcGVydHkoY2hpbGQsICJyZWciLCAmcmVnbGVuKTsKKwkJaWYgKHJlZyA9PSBOVUxMIHx8IHJlZ2xlbiA8IDIwKQorCQkJY29udGludWU7CisJCWRldmZuID0gKHJlZ1swXSA+PiA4KSAmIDB4ZmY7CisKKwkJLyogY3JlYXRlIGEgbmV3IHBjaV9kZXYgZm9yIHRoaXMgZGV2aWNlICovCisJCWRldiA9IG9mX2NyZWF0ZV9wY2lfZGV2KHBibSwgY2hpbGQsIGJ1cywgZGV2Zm4sIDApOworCQlpZiAoIWRldikKKwkJCWNvbnRpbnVlOworCQlwcmludGsoIlBDSTogZGV2IGhlYWRlciB0eXBlOiAleFxuIiwgZGV2LT5oZHJfdHlwZSk7CisKKwkJaWYgKGRldi0+aGRyX3R5cGUgPT0gUENJX0hFQURFUl9UWVBFX0JSSURHRSB8fAorCQkgICAgZGV2LT5oZHJfdHlwZSA9PSBQQ0lfSEVBREVSX1RZUEVfQ0FSREJVUykKKwkJCW9mX3NjYW5fcGNpX2JyaWRnZShwYm0sIGNoaWxkLCBkZXYpOworCX0KK30KKworc3RhdGljIHNzaXplX3QKK3Nob3dfcGNpb2JwcGF0aF9hdHRyKHN0cnVjdCBkZXZpY2UgKiBkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICogYXR0ciwgY2hhciAqIGJ1ZikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwOworCisJcGRldiA9IHRvX3BjaV9kZXYoZGV2KTsKKwlkcCA9IHBkZXYtPmRldi5hcmNoZGF0YS5wcm9tX25vZGU7CisKKwlyZXR1cm4gc25wcmludGYgKGJ1ZiwgUEFHRV9TSVpFLCAiJXNcbiIsIGRwLT5mdWxsX25hbWUpOworfQorCitzdGF0aWMgREVWSUNFX0FUVFIob2JwcGF0aCwgU19JUlVTUiB8IFNfSVJHUlAgfCBTX0lST1RILCBzaG93X3BjaW9icHBhdGhfYXR0ciwgTlVMTCk7CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBwY2lfYnVzX3JlZ2lzdGVyX29mX3N5c2ZzKHN0cnVjdCBwY2lfYnVzICpidXMpCit7CisJc3RydWN0IHBjaV9kZXYgKmRldjsKKwlzdHJ1Y3QgcGNpX2J1cyAqY2hpbGRfYnVzOworCWludCBlcnI7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldiwgJmJ1cy0+ZGV2aWNlcywgYnVzX2xpc3QpIHsKKwkJLyogd2UgZG9uJ3QgcmVhbGx5IGNhcmUgaWYgd2UgY2FuIGNyZWF0ZSB0aGlzIGZpbGUgb3IKKwkJICogbm90LCBidXQgd2UgbmVlZCB0byBhc3NpZ24gdGhlIHJlc3VsdCBvZiB0aGUgY2FsbAorCQkgKiBvciB0aGUgd29ybGQgd2lsbCBmYWxsIHVuZGVyIGFsaWVuIGludmFzaW9uIGFuZAorCQkgKiBldmVyeWJvZHkgd2lsbCBiZSBmcm96ZW4gb24gYSBzcGFjZXNoaXAgcmVhZHkgdG8gYmUKKwkJICogZWF0ZW4gb24gYWxwaGEgY2VudGF1cmkgYnkgc29tZSBncmVlbiBhbmQgamVsbHkKKwkJICogaHVtYW5vaWQuCisJCSAqLworCQllcnIgPSBzeXNmc19jcmVhdGVfZmlsZSgmZGV2LT5kZXYua29iaiwgJmRldl9hdHRyX29icHBhdGguYXR0cik7CisJfQorCWxpc3RfZm9yX2VhY2hfZW50cnkoY2hpbGRfYnVzLCAmYnVzLT5jaGlsZHJlbiwgbm9kZSkKKwkJcGNpX2J1c19yZWdpc3Rlcl9vZl9zeXNmcyhjaGlsZF9idXMpOworfQorCitpbnQgcGNpX2hvc3RfYnJpZGdlX3JlYWRfcGNpX2NmZyhzdHJ1Y3QgcGNpX2J1cyAqYnVzX2RldiwKKwkJCQkgdW5zaWduZWQgaW50IGRldmZuLAorCQkJCSBpbnQgd2hlcmUsIGludCBzaXplLAorCQkJCSB1MzIgKnZhbHVlKQoreworCXN0YXRpYyB1OCBmYWtlX3BjaV9jb25maWdbXSA9IHsKKwkJMHg4ZSwgMHgxMCwgLyogVmVuZG9yOiAweDEwOGUgKFN1bikgKi8KKwkJMHgwMCwgMHg4MCwgLyogRGV2aWNlOiAweDgwMDAgKFBCTSkgKi8KKwkJMHg0NiwgMHgwMSwgLyogQ29tbWFuZDogMHgwMTQ2IChTRVJSLCBQQVJJVFksIE1BU1RFUiwgTUVNKSAqLworCQkweGEwLCAweDIyLCAvKiBTdGF0dXM6IDB4MDJhMCAoREVWU0VMX01FRCwgRkIyQiwgNjZNSFopICovCisJCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDYsIC8qIENsYXNzOiAweDA2MDAwMDAwIGhvc3QgYnJpZGdlICovCisJCTB4MDAsIC8qIENhY2hlbGluZTogMHgwMCAqLworCQkweDQwLCAvKiBMYXRlbmN5OiAweDQwICovCisJCTB4MDAsIC8qIEhlYWRlci1UeXBlOiAweDAwIG5vcm1hbCAqLworCX07CisKKwkqdmFsdWUgPSAwOworCWlmICh3aGVyZSA+PSAwICYmIHdoZXJlIDwgc2l6ZW9mKGZha2VfcGNpX2NvbmZpZykgJiYKKwkgICAgKHdoZXJlICsgc2l6ZSkgPj0gMCAmJgorCSAgICAod2hlcmUgKyBzaXplKSA8IHNpemVvZihmYWtlX3BjaV9jb25maWcpICYmCisJICAgIHNpemUgPD0gc2l6ZW9mKHUzMikpIHsKKwkJd2hpbGUgKHNpemUtLSkgeworCQkJKnZhbHVlIDw8PSA4OworCQkJKnZhbHVlIHw9IGZha2VfcGNpX2NvbmZpZ1t3aGVyZSArIHNpemVdOworCQl9CisJfQorCisJcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKK30KKworaW50IHBjaV9ob3N0X2JyaWRnZV93cml0ZV9wY2lfY2ZnKHN0cnVjdCBwY2lfYnVzICpidXNfZGV2LAorCQkJCSAgdW5zaWduZWQgaW50IGRldmZuLAorCQkJCSAgaW50IHdoZXJlLCBpbnQgc2l6ZSwKKwkJCQkgIHUzMiB2YWx1ZSkKK3sKKwlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOworfQorCitzdHJ1Y3QgcGNpX2J1cyAqIF9faW5pdCBwY2lfc2Nhbl9vbmVfcGJtKHN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSkKK3sKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXJfaW5mbyAqcCA9IHBibS0+cGFyZW50OworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSA9IHBibS0+cHJvbV9ub2RlOworCXN0cnVjdCBwY2lfZGV2ICpob3N0X3BkZXY7CisJc3RydWN0IHBjaV9idXMgKmJ1czsKKworCXByaW50aygiUENJOiBTY2FubmluZyBQQk0gJXNcbiIsIG5vZGUtPmZ1bGxfbmFtZSk7CisKKwkvKiBYWFggcGFyZW50IGRldmljZT8gWFhYICovCisJYnVzID0gcGNpX2NyZWF0ZV9idXMoTlVMTCwgcGJtLT5wY2lfZmlyc3RfYnVzbm8sIHAtPnBjaV9vcHMsIHBibSk7CisJaWYgKCFidXMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gY3JlYXRlIGJ1cyBmb3IgJXNcbiIsCisJCSAgICAgICBub2RlLT5mdWxsX25hbWUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJYnVzLT5zZWNvbmRhcnkgPSBwYm0tPnBjaV9maXJzdF9idXNubzsKKwlidXMtPnN1Ym9yZGluYXRlID0gcGJtLT5wY2lfbGFzdF9idXNubzsKKworCWJ1cy0+cmVzb3VyY2VbMF0gPSAmcGJtLT5pb19zcGFjZTsKKwlidXMtPnJlc291cmNlWzFdID0gJnBibS0+bWVtX3NwYWNlOworCisJLyogQ3JlYXRlIHRoZSBkdW1teSBob3N0IGJyaWRnZSBhbmQgbGluayBpdCBpbi4gICovCisJaG9zdF9wZGV2ID0gb2ZfY3JlYXRlX3BjaV9kZXYocGJtLCBub2RlLCBidXMsIDB4MDAsIDEpOworCWJ1cy0+c2VsZiA9IGhvc3RfcGRldjsKKworCXBjaV9vZl9zY2FuX2J1cyhwYm0sIG5vZGUsIGJ1cyk7CisJcGNpX2J1c19hZGRfZGV2aWNlcyhidXMpOworCXBjaV9idXNfcmVnaXN0ZXJfb2Zfc3lzZnMoYnVzKTsKKworCXJldHVybiBidXM7Cit9CisKIHN0YXRpYyB2b2lkIF9faW5pdCBwY2lfc2Nhbl9lYWNoX2NvbnRyb2xsZXJfYnVzKHZvaWQpCiB7CiAJc3RydWN0IHBjaV9jb250cm9sbGVyX2luZm8gKnA7CkBAIC0zNjAsOCArODI2LDMzIEBACiB7CiB9CiAKLWludCBwY2liaW9zX2VuYWJsZV9kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCBtYXNrKQoraW50IHBjaWJpb3NfZW5hYmxlX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgbWFzaykKIHsKKwl1MTYgY21kLCBvbGRjbWQ7CisJaW50IGk7CisKKwlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIFBDSV9DT01NQU5ELCAmY21kKTsKKwlvbGRjbWQgPSBjbWQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgUENJX05VTV9SRVNPVVJDRVM7IGkrKykgeworCQlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9ICZkZXYtPnJlc291cmNlW2ldOworCisJCS8qIE9ubHkgc2V0IHVwIHRoZSByZXF1ZXN0ZWQgc3R1ZmYgKi8KKwkJaWYgKCEobWFzayAmICgxPDxpKSkpCisJCQljb250aW51ZTsKKworCQlpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8pCisJCQljbWQgfD0gUENJX0NPTU1BTkRfSU87CisJCWlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9NRU0pCisJCQljbWQgfD0gUENJX0NPTU1BTkRfTUVNT1JZOworCX0KKworCWlmIChjbWQgIT0gb2xkY21kKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJQQ0k6IEVuYWJsaW5nIGRldmljZTogKCVzKSwgY21kICV4XG4iLAorCQkgICAgICAgcGNpX25hbWUoZGV2KSwgY21kKTsKKyAgICAgICAgICAgICAgICAvKiBFbmFibGUgdGhlIGFwcHJvcHJpYXRlIGJpdHMgaW4gdGhlIFBDSSBjb21tYW5kIHJlZ2lzdGVyLiAgKi8KKwkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgUENJX0NPTU1BTkQsIGNtZCk7CisJfQogCXJldHVybiAwOwogfQogCkBAIC0zODAsNyArODcxLDcgQEAKIAllbHNlCiAJCXJvb3QgPSAmcGJtLT5tZW1fc3BhY2U7CiAKLQlwYm0tPnBhcmVudC0+cmVzb3VyY2VfYWRqdXN0KHBkZXYsICZ6ZXJvX3Jlcywgcm9vdCk7CisJcGNpX3Jlc291cmNlX2FkanVzdCgmemVyb19yZXMsIHJvb3QpOwogCiAJcmVnaW9uLT5zdGFydCA9IHJlcy0+c3RhcnQgLSB6ZXJvX3Jlcy5zdGFydDsKIAlyZWdpb24tPmVuZCA9IHJlcy0+ZW5kIC0gemVyb19yZXMuc3RhcnQ7CkBAIC00MDEsNyArODkyLDcgQEAKIAllbHNlCiAJCXJvb3QgPSAmcGJtLT5tZW1fc3BhY2U7CiAKLQlwYm0tPnBhcmVudC0+cmVzb3VyY2VfYWRqdXN0KHBkZXYsIHJlcywgcm9vdCk7CisJcGNpX3Jlc291cmNlX2FkanVzdChyZXMsIHJvb3QpOwogfQogRVhQT1JUX1NZTUJPTChwY2liaW9zX2J1c190b19yZXNvdXJjZSk7CiAKQEAgLTQyMiw1NSArOTEzLDE3IEBACiBzdGF0aWMgaW50IF9fcGNpX21tYXBfbWFrZV9vZmZzZXRfYnVzKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKIAkJCQkgICAgICBlbnVtIHBjaV9tbWFwX3N0YXRlIG1tYXBfc3RhdGUpCiB7Ci0Jc3RydWN0IHBjaWRldl9jb29raWUgKnBjcCA9IHBkZXYtPnN5c2RhdGE7Ci0Jc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtOworCXN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSA9IHBkZXYtPmRldi5hcmNoZGF0YS5ob3N0X2NvbnRyb2xsZXI7CiAJc3RydWN0IHBjaV9jb250cm9sbGVyX2luZm8gKnA7CiAJdW5zaWduZWQgbG9uZyBzcGFjZV9zaXplLCB1c2VyX29mZnNldCwgdXNlcl9zaXplOwogCi0JaWYgKCFwY3ApCi0JCXJldHVybiAtRU5YSU87Ci0JcGJtID0gcGNwLT5wYm07Ci0JaWYgKCFwYm0pCi0JCXJldHVybiAtRU5YSU87Ci0KIAlwID0gcGJtLT5wYXJlbnQ7Ci0JaWYgKHAtPnBibXNfc2FtZV9kb21haW4pIHsKLQkJdW5zaWduZWQgbG9uZyBsb3dlc3QsIGhpZ2hlc3Q7Ci0KLQkJbG93ZXN0ID0gfjBVTDsgaGlnaGVzdCA9IDBVTDsKLQkJaWYgKG1tYXBfc3RhdGUgPT0gcGNpX21tYXBfaW8pIHsKLQkJCWlmIChwLT5wYm1fQS5pb19zcGFjZS5mbGFncykgewotCQkJCWxvd2VzdCA9IHAtPnBibV9BLmlvX3NwYWNlLnN0YXJ0OwotCQkJCWhpZ2hlc3QgPSBwLT5wYm1fQS5pb19zcGFjZS5lbmQgKyAxOwotCQkJfQotCQkJaWYgKHAtPnBibV9CLmlvX3NwYWNlLmZsYWdzKSB7Ci0JCQkJaWYgKGxvd2VzdCA+IHAtPnBibV9CLmlvX3NwYWNlLnN0YXJ0KQotCQkJCQlsb3dlc3QgPSBwLT5wYm1fQi5pb19zcGFjZS5zdGFydDsKLQkJCQlpZiAoaGlnaGVzdCA8IHAtPnBibV9CLmlvX3NwYWNlLmVuZCArIDEpCi0JCQkJCWhpZ2hlc3QgPSBwLT5wYm1fQi5pb19zcGFjZS5lbmQgKyAxOwotCQkJfQotCQkJc3BhY2Vfc2l6ZSA9IGhpZ2hlc3QgLSBsb3dlc3Q7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAocC0+cGJtX0EubWVtX3NwYWNlLmZsYWdzKSB7Ci0JCQkJbG93ZXN0ID0gcC0+cGJtX0EubWVtX3NwYWNlLnN0YXJ0OwotCQkJCWhpZ2hlc3QgPSBwLT5wYm1fQS5tZW1fc3BhY2UuZW5kICsgMTsKLQkJCX0KLQkJCWlmIChwLT5wYm1fQi5tZW1fc3BhY2UuZmxhZ3MpIHsKLQkJCQlpZiAobG93ZXN0ID4gcC0+cGJtX0IubWVtX3NwYWNlLnN0YXJ0KQotCQkJCQlsb3dlc3QgPSBwLT5wYm1fQi5tZW1fc3BhY2Uuc3RhcnQ7Ci0JCQkJaWYgKGhpZ2hlc3QgPCBwLT5wYm1fQi5tZW1fc3BhY2UuZW5kICsgMSkKLQkJCQkJaGlnaGVzdCA9IHAtPnBibV9CLm1lbV9zcGFjZS5lbmQgKyAxOwotCQkJfQotCQkJc3BhY2Vfc2l6ZSA9IGhpZ2hlc3QgLSBsb3dlc3Q7Ci0JCX0KKwlpZiAobW1hcF9zdGF0ZSA9PSBwY2lfbW1hcF9pbykgeworCQlzcGFjZV9zaXplID0gKHBibS0+aW9fc3BhY2UuZW5kIC0KKwkJCSAgICAgIHBibS0+aW9fc3BhY2Uuc3RhcnQpICsgMTsKIAl9IGVsc2UgewotCQlpZiAobW1hcF9zdGF0ZSA9PSBwY2lfbW1hcF9pbykgewotCQkJc3BhY2Vfc2l6ZSA9IChwYm0tPmlvX3NwYWNlLmVuZCAtCi0JCQkJICAgICAgcGJtLT5pb19zcGFjZS5zdGFydCkgKyAxOwotCQl9IGVsc2UgewotCQkJc3BhY2Vfc2l6ZSA9IChwYm0tPm1lbV9zcGFjZS5lbmQgLQotCQkJCSAgICAgIHBibS0+bWVtX3NwYWNlLnN0YXJ0KSArIDE7Ci0JCX0KKwkJc3BhY2Vfc2l6ZSA9IChwYm0tPm1lbV9zcGFjZS5lbmQgLQorCQkJICAgICAgcGJtLT5tZW1fc3BhY2Uuc3RhcnQpICsgMTsKIAl9CiAKIAkvKiBNYWtlIHN1cmUgdGhlIHJlcXVlc3QgaXMgaW4gcmFuZ2UuICovCkBAIC00ODEsMzEgKzkzNCwxMiBAQAogCSAgICAodXNlcl9vZmZzZXQgKyB1c2VyX3NpemUpID4gc3BhY2Vfc2l6ZSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAocC0+cGJtc19zYW1lX2RvbWFpbikgewotCQl1bnNpZ25lZCBsb25nIGxvd2VzdCA9IH4wVUw7Ci0KLQkJaWYgKG1tYXBfc3RhdGUgPT0gcGNpX21tYXBfaW8pIHsKLQkJCWlmIChwLT5wYm1fQS5pb19zcGFjZS5mbGFncykKLQkJCQlsb3dlc3QgPSBwLT5wYm1fQS5pb19zcGFjZS5zdGFydDsKLQkJCWlmIChwLT5wYm1fQi5pb19zcGFjZS5mbGFncyAmJgotCQkJICAgIGxvd2VzdCA+IHAtPnBibV9CLmlvX3NwYWNlLnN0YXJ0KQotCQkJCWxvd2VzdCA9IHAtPnBibV9CLmlvX3NwYWNlLnN0YXJ0OwotCQl9IGVsc2UgewotCQkJaWYgKHAtPnBibV9BLm1lbV9zcGFjZS5mbGFncykKLQkJCQlsb3dlc3QgPSBwLT5wYm1fQS5tZW1fc3BhY2Uuc3RhcnQ7Ci0JCQlpZiAocC0+cGJtX0IubWVtX3NwYWNlLmZsYWdzICYmCi0JCQkgICAgbG93ZXN0ID4gcC0+cGJtX0IubWVtX3NwYWNlLnN0YXJ0KQotCQkJCWxvd2VzdCA9IHAtPnBibV9CLm1lbV9zcGFjZS5zdGFydDsKLQkJfQotCQl2bWEtPnZtX3Bnb2ZmID0gKGxvd2VzdCArIHVzZXJfb2Zmc2V0KSA+PiBQQUdFX1NISUZUOworCWlmIChtbWFwX3N0YXRlID09IHBjaV9tbWFwX2lvKSB7CisJCXZtYS0+dm1fcGdvZmYgPSAocGJtLT5pb19zcGFjZS5zdGFydCArCisJCQkJIHVzZXJfb2Zmc2V0KSA+PiBQQUdFX1NISUZUOwogCX0gZWxzZSB7Ci0JCWlmIChtbWFwX3N0YXRlID09IHBjaV9tbWFwX2lvKSB7Ci0JCQl2bWEtPnZtX3Bnb2ZmID0gKHBibS0+aW9fc3BhY2Uuc3RhcnQgKwotCQkJCQkgdXNlcl9vZmZzZXQpID4+IFBBR0VfU0hJRlQ7Ci0JCX0gZWxzZSB7Ci0JCQl2bWEtPnZtX3Bnb2ZmID0gKHBibS0+bWVtX3NwYWNlLnN0YXJ0ICsKLQkJCQkJIHVzZXJfb2Zmc2V0KSA+PiBQQUdFX1NISUZUOwotCQl9CisJCXZtYS0+dm1fcGdvZmYgPSAocGJtLT5tZW1fc3BhY2Uuc3RhcnQgKworCQkJCSB1c2VyX29mZnNldCkgPj4gUEFHRV9TSElGVDsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTYzOSw5ICsxMDczLDggQEAKIAkJc3RydWN0IHBjaV9jb250cm9sbGVyX2luZm8gKnAgPSBwYm0tPnBhcmVudDsKIAogCQlyZXQgPSBwLT5pbmRleDsKLQkJaWYgKHAtPnBibXNfc2FtZV9kb21haW4gPT0gMCkKLQkJCXJldCA9ICgocmV0IDw8IDEpICsKLQkJCSAgICAgICAoKHBibSA9PSAmcGJtLT5wYXJlbnQtPnBibV9CKSA/IDEgOiAwKSk7CisJCXJldCA9ICgocmV0IDw8IDEpICsKKwkJICAgICAgICgocGJtID09ICZwYm0tPnBhcmVudC0+cGJtX0IpID8gMSA6IDApKTsKIAl9CiAKIAlyZXR1cm4gcmV0OwpAQCAtNjUxLDggKzEwODQsNyBAQAogI2lmZGVmIENPTkZJR19QQ0lfTVNJCiBpbnQgYXJjaF9zZXR1cF9tc2lfaXJxKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3QgbXNpX2Rlc2MgKmRlc2MpCiB7Ci0Jc3RydWN0IHBjaWRldl9jb29raWUgKnBjcCA9IHBkZXYtPnN5c2RhdGE7Ci0Jc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtID0gcGNwLT5wYm07CisJc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtID0gcGRldi0+ZGV2LmFyY2hkYXRhLmhvc3RfY29udHJvbGxlcjsKIAlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXJfaW5mbyAqcCA9IHBibS0+cGFyZW50OwogCWludCB2aXJ0X2lycSwgZXJyOwogCkBAIC02NzAsOCArMTEwMiw3IEBACiB7CiAJc3RydWN0IG1zaV9kZXNjICplbnRyeSA9IGdldF9pcnFfbXNpKHZpcnRfaXJxKTsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGVudHJ5LT5kZXY7Ci0Jc3RydWN0IHBjaWRldl9jb29raWUgKnBjcCA9IHBkZXYtPnN5c2RhdGE7Ci0Jc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtID0gcGNwLT5wYm07CisJc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtID0gcGRldi0+ZGV2LmFyY2hkYXRhLmhvc3RfY29udHJvbGxlcjsKIAlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXJfaW5mbyAqcCA9IHBibS0+cGFyZW50OwogCiAJaWYgKCFwYm0tPm1zaV9udW0gfHwgIXAtPnNldHVwX21zaV9pcnEpCkBAIC02ODMsOSArMTExNCw3IEBACiAKIHN0cnVjdCBkZXZpY2Vfbm9kZSAqcGNpX2RldmljZV90b19PRl9ub2RlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewotCXN0cnVjdCBwY2lkZXZfY29va2llICpwYyA9IHBkZXYtPnN5c2RhdGE7Ci0KLQlyZXR1cm4gcGMtPm9wLT5ub2RlOworCXJldHVybiBwZGV2LT5kZXYuYXJjaGRhdGEucHJvbV9ub2RlOwogfQogRVhQT1JUX1NZTUJPTChwY2lfZGV2aWNlX3RvX09GX25vZGUpOwogCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9jb21tb24uYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX2NvbW1vbi5jCmluZGV4IDVhOTJjYjkuLjFlNmFlZWQgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX2NvbW1vbi5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX2NvbW1vbi5jCkBAIC0xLDcgKzEsNiBAQAotLyogJElkOiBwY2lfY29tbW9uLmMsdiAxLjI5IDIwMDIvMDIvMDEgMDA6NTY6MDMgZGF2ZW0gRXhwICQKLSAqIHBjaV9jb21tb24uYzogUENJIGNvbnRyb2xsZXIgY29tbW9uIHN1cHBvcnQuCisvKiBwY2lfY29tbW9uLmM6IFBDSSBjb250cm9sbGVyIGNvbW1vbiBzdXBwb3J0LgogICoKLSAqIENvcHlyaWdodCAoQykgMTk5OSBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQHJlZGhhdC5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDcgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBkYXZlbWxvZnQubmV0KQogICovCiAKICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KQEAgLTE2LDcxNSArMTUsOCBAQAogCiAjaW5jbHVkZSAicGNpX2ltcGwuaCIKIAotLyogRml4IHNlbGYgZGV2aWNlIG9mIEJVUyBhbmQgaG9vayBpdCBpbnRvIEJVUy0+c2VsZi4KLSAqIFRoZSBwY2lfc2Nhbl9idXMgZG9lcyBub3QgZG8gdGhpcyBmb3IgdGhlIGhvc3QgYnJpZGdlLgotICovCi12b2lkIF9faW5pdCBwY2lfZml4dXBfaG9zdF9icmlkZ2Vfc2VsZihzdHJ1Y3QgcGNpX2J1cyAqcGJ1cykKLXsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkocGRldiwgJnBidXMtPmRldmljZXMsIGJ1c19saXN0KSB7Ci0JCWlmIChwZGV2LT5jbGFzcyA+PiA4ID09IFBDSV9DTEFTU19CUklER0VfSE9TVCkgewotCQkJcGJ1cy0+c2VsZiA9IHBkZXY7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQlwcm9tX3ByaW50ZigiUENJOiBDcml0aWNhbCBlcnJvciwgY2Fubm90IGZpbmQgaG9zdCBicmlkZ2UgUERFVi5cbiIpOwotCXByb21faGFsdCgpOwotfQotCi0vKiBGaW5kIHRoZSBPQlAgUFJPTSBkZXZpY2UgdHJlZSBub2RlIGZvciBhIFBDSSBkZXZpY2UuICAqLwotc3RhdGljIHN0cnVjdCBkZXZpY2Vfbm9kZSAqIF9faW5pdAotZmluZF9kZXZpY2VfcHJvbV9ub2RlKHN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSwgc3RydWN0IHBjaV9kZXYgKnBkZXYsCi0JCSAgICAgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqYnVzX25vZGUsCi0JCSAgICAgIHN0cnVjdCBsaW51eF9wcm9tX3BjaV9yZWdpc3RlcnMgKipwcmVncywKLQkJICAgICAgaW50ICpucmVncykKLXsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwOwotCi0JKm5yZWdzID0gMDsKLQotCS8qCi0JICogUmV0dXJuIHRoZSBQQk0ncyBQUk9NIG5vZGUgaW4gY2FzZSB3ZSBhcmUgaXQncyBQQ0kgZGV2aWNlLAotCSAqIGFzIHRoZSBQQk0ncyByZWcgcHJvcGVydHkgaXMgZGlmZmVyZW50IHRvIHN0YW5kYXJkIFBDSSByZWcKLQkgKiBwcm9wZXJ0aWVzLiBXZSB3b3VsZCBkZWxldGUgdGhpcyBkZXZpY2UgZW50cnkgb3RoZXJ3aXNlLAotCSAqIHdoaWNoIGNvbmZ1c2VzIFhGcmVlODYncyBkZXZpY2UgcHJvYmluZy4uLgotCSAqLwotCWlmICgocGRldi0+YnVzLT5udW1iZXIgPT0gcGJtLT5wY2lfYnVzLT5udW1iZXIpICYmIChwZGV2LT5kZXZmbiA9PSAwKSAmJgotCSAgICAocGRldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfU1VOKSAmJgotCSAgICAocGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfU1VOX1BCTSB8fAotCSAgICAgcGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfU1VOX1NDSElaTyB8fAotCSAgICAgcGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfU1VOX1RPTUFUSUxMTyB8fAotCSAgICAgcGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfU1VOX1NBQlJFIHx8Ci0JICAgICBwZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9TVU5fSFVNTUlOR0JJUkQpKQotCQlyZXR1cm4gYnVzX25vZGU7Ci0KLQlkcCA9IGJ1c19ub2RlLT5jaGlsZDsKLQl3aGlsZSAoZHApIHsKLQkJc3RydWN0IGxpbnV4X3Byb21fcGNpX3JlZ2lzdGVycyAqcmVnczsKLQkJc3RydWN0IHByb3BlcnR5ICpwcm9wOwotCQlpbnQgbGVuOwotCi0JCXByb3AgPSBvZl9maW5kX3Byb3BlcnR5KGRwLCAicmVnIiwgJmxlbik7Ci0JCWlmICghcHJvcCkKLQkJCWdvdG8gZG9fbmV4dF9zaWJsaW5nOwotCi0JCXJlZ3MgPSBwcm9wLT52YWx1ZTsKLQkJaWYgKCgocmVnc1swXS5waHlzX2hpID4+IDgpICYgMHhmZikgPT0gcGRldi0+ZGV2Zm4pIHsKLQkJCSpwcmVncyA9IHJlZ3M7Ci0JCQkqbnJlZ3MgPSBsZW4gLyBzaXplb2Yoc3RydWN0IGxpbnV4X3Byb21fcGNpX3JlZ2lzdGVycyk7Ci0JCQlyZXR1cm4gZHA7Ci0JCX0KLQotCWRvX25leHRfc2libGluZzoKLQkJZHAgPSBkcC0+c2libGluZzsKLQl9Ci0KLQlyZXR1cm4gTlVMTDsKLX0KLQotLyogT2xkZXIgdmVyc2lvbnMgb2YgT0JQIG9uIFBDSSBzeXN0ZW1zIGVuY29kZSA2NC1iaXQgTUVNCi0gKiBzcGFjZSBhc3NpZ25tZW50cyBpbmNvcnJlY3RseSwgdGhpcyBmaXhlcyB0aGVtIHVwLiAgV2UgYWxzbwotICogdGFrZSB0aGUgb3Bwb3J0dW5pdHkgaGVyZSB0byBoaWRlIG90aGVyIGtpbmRzIG9mIGJvZ3VzCi0gKiBhc3NpZ25tZW50cy4KLSAqLwotc3RhdGljIHZvaWQgX19pbml0IGZpeHVwX29icF9hc3NpZ25tZW50cyhzdHJ1Y3QgcGNpX2RldiAqcGRldiwKLQkJCQkJIHN0cnVjdCBwY2lkZXZfY29va2llICpwY3ApCi17Ci0JaW50IGk7Ci0KLQlpZiAocGRldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfQUwgJiYKLQkgICAgKHBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0FMX003MTAxIHx8Ci0JICAgICBwZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9BTF9NMTUzMykpIHsKLQkJaW50IGk7Ci0KLQkJLyogWmFwIGFsbCBvZiB0aGUgbm9ybWFsIHJlc291cmNlcywgdGhleSBhcmUKLQkJICogbWVhbmluZ2xlc3MgYW5kIGdlbmVyYXRlIGJvZ3VzIHJlc291cmNlIGNvbGxpc2lvbgotCQkgKiBtZXNzYWdlcy4gIFRoaXMgaXMgT3BlbkJvb3QncyBpbGwtZmF0ZWQgYXR0ZW1wdCB0bwotCQkgKiByZXByZXNlbnQgdGhlIGltcGxpY2l0IHJlc291cmNlcyB0aGF0IHRoZXNlIGRldmljZXMKLQkJICogaGF2ZS4KLQkJICovCi0JCXBjcC0+bnVtX3Byb21fYXNzaWdubWVudHMgPSAwOwotCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7Ci0JCQlwZGV2LT5yZXNvdXJjZVtpXS5zdGFydCA9Ci0JCQkJcGRldi0+cmVzb3VyY2VbaV0uZW5kID0KLQkJCQlwZGV2LT5yZXNvdXJjZVtpXS5mbGFncyA9IDA7Ci0JCX0KLQkJcGRldi0+cmVzb3VyY2VbUENJX1JPTV9SRVNPVVJDRV0uc3RhcnQgPQotCQkJcGRldi0+cmVzb3VyY2VbUENJX1JPTV9SRVNPVVJDRV0uZW5kID0KLQkJCXBkZXYtPnJlc291cmNlW1BDSV9ST01fUkVTT1VSQ0VdLmZsYWdzID0gMDsKLQkJcmV0dXJuOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBwY3AtPm51bV9wcm9tX2Fzc2lnbm1lbnRzOyBpKyspIHsKLQkJc3RydWN0IGxpbnV4X3Byb21fcGNpX3JlZ2lzdGVycyAqYXA7Ci0JCWludCBzcGFjZTsKLQotCQlhcCA9ICZwY3AtPnByb21fYXNzaWdubWVudHNbaV07Ci0JCXNwYWNlID0gYXAtPnBoeXNfaGkgPj4gMjQ7Ci0JCWlmICgoc3BhY2UgJiAweDMpID09IDIgJiYKLQkJICAgIChzcGFjZSAmIDB4NCkgIT0gMCkgewotCQkJYXAtPnBoeXNfaGkgJj0gfigweDcgPDwgMjQpOwotCQkJYXAtPnBoeXNfaGkgfD0gMHgzIDw8IDI0OwotCQl9Ci0JfQotfQotCi1zdGF0aWMgc3NpemVfdAotc2hvd19wY2lvYnBwYXRoX2F0dHIoc3RydWN0IGRldmljZSAqIGRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKiBhdHRyLCBjaGFyICogYnVmKQotewotCXN0cnVjdCBwY2lfZGV2ICpwZGV2OwotCXN0cnVjdCBwY2lkZXZfY29va2llICpzeXNkYXRhOwotCi0JcGRldiA9IHRvX3BjaV9kZXYoZGV2KTsKLQlzeXNkYXRhID0gcGRldi0+c3lzZGF0YTsKLQotCXJldHVybiBzbnByaW50ZiAoYnVmLCBQQUdFX1NJWkUsICIlc1xuIiwgc3lzZGF0YS0+cHJvbV9ub2RlLT5mdWxsX25hbWUpOwotfQotCi1zdGF0aWMgREVWSUNFX0FUVFIob2JwcGF0aCwgU19JUlVTUiB8IFNfSVJHUlAgfCBTX0lST1RILCBzaG93X3BjaW9icHBhdGhfYXR0ciwgTlVMTCk7Ci0KLS8qIEZpbGwgaW4gdGhlIFBDSSBkZXZpY2UgY29va2llIHN5c2RhdGEgZm9yIHRoZSBnaXZlbgotICogUENJIGRldmljZS4gIFRoaXMgY29va2llIGlzIHRoZSBtZWFucyBieSB3aGljaCBvbmUKLSAqIGNhbiBnZXQgdG8gT0JQIGFuZCBQQ0kgY29udHJvbGxlciBzcGVjaWZpYyBpbmZvcm1hdGlvbgotICogZm9yIGEgUENJIGRldmljZS4KLSAqLwotc3RhdGljIHZvaWQgX19pbml0IHBkZXZfY29va2llX2ZpbGxpbihzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0sCi0JCQkJICAgICAgc3RydWN0IHBjaV9kZXYgKnBkZXYsCi0JCQkJICAgICAgc3RydWN0IGRldmljZV9ub2RlICpidXNfbm9kZSkKLXsKLQlzdHJ1Y3QgbGludXhfcHJvbV9wY2lfcmVnaXN0ZXJzICpwcmVncyA9IE5VTEw7Ci0Jc3RydWN0IHBjaWRldl9jb29raWUgKnBjcDsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwOwotCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKLQlpbnQgbnJlZ3MsIGxlbiwgZXJyOwotCi0JZHAgPSBmaW5kX2RldmljZV9wcm9tX25vZGUocGJtLCBwZGV2LCBidXNfbm9kZSwKLQkJCQkgICAmcHJlZ3MsICZucmVncyk7Ci0JaWYgKCFkcCkgewotCQkvKiBJZiBpdCBpcyBub3QgaW4gdGhlIE9CUCBkZXZpY2UgdHJlZSB0aGVuCi0JCSAqIHRoZXJlIG11c3QgYmUgYSBkYW1uIGdvb2QgcmVhc29uIGZvciBpdC4KLQkJICoKLQkJICogU28gd2hhdCB3ZSBkbyBpcyBkZWxldGUgdGhlIGRldmljZSBmcm9tIHRoZQotCQkgKiBQQ0kgZGV2aWNlIHRyZWUgY29tcGxldGVseS4gIFRoaXMgc2NlbmFyaW8KLQkJICogaXMgc2VlbiwgZm9yIGV4YW1wbGUsIG9uIENQMTUwMCBmb3IgdGhlCi0JCSAqIHNlY29uZCBFQlVTL0hhcHB5TWVhbCBwYWlyIGlmIHRoZSBleHRlcm5hbAotCQkgKiBjb25uZWN0b3IgZm9yIGl0IGlzIG5vdCBwcmVzZW50LgotCQkgKi8KLQkJcGNpX3JlbW92ZV9idXNfZGV2aWNlKHBkZXYpOwotCQlyZXR1cm47Ci0JfQotCi0JcGNwID0ga3phbGxvYyhzaXplb2YoKnBjcCksIEdGUF9BVE9NSUMpOwotCWlmIChwY3AgPT0gTlVMTCkgewotCQlwcm9tX3ByaW50ZigiUENJX0NPT0tJRTogRmF0YWwgbWFsbG9jIGVycm9yLCBhYm9ydGluZy4uLlxuIik7Ci0JCXByb21faGFsdCgpOwotCX0KLQlwY3AtPnBibSA9IHBibTsKLQlwY3AtPnByb21fbm9kZSA9IGRwOwotCXBjcC0+b3AgPSBvZl9maW5kX2RldmljZV9ieV9ub2RlKGRwKTsKLQltZW1jcHkocGNwLT5wcm9tX3JlZ3MsIHByZWdzLAotCSAgICAgICBucmVncyAqIHNpemVvZihzdHJ1Y3QgbGludXhfcHJvbV9wY2lfcmVnaXN0ZXJzKSk7Ci0JcGNwLT5udW1fcHJvbV9yZWdzID0gbnJlZ3M7Ci0KLQkvKiBXZSBjYW4ndCBoYXZlIHRoZSBwY2lkZXZfY29va2llIGFzc2lnbm1lbnRzIGJlIGp1c3QKLQkgKiBkaXJlY3QgcG9pbnRlcnMgaW50byB0aGUgcHJvcGVydHkgdmFsdWUsIHNpbmNlIHRoZXkKLQkgKiBhcmUgcG90ZW50aWFsbHkgbW9kaWZpZWQgYnkgdGhlIHByb2JpbmcgcHJvY2Vzcy4KLQkgKi8KLQlwcm9wID0gb2ZfZmluZF9wcm9wZXJ0eShkcCwgImFzc2lnbmVkLWFkZHJlc3NlcyIsICZsZW4pOwotCWlmICghcHJvcCkgewotCQlwY3AtPm51bV9wcm9tX2Fzc2lnbm1lbnRzID0gMDsKLQl9IGVsc2UgewotCQltZW1jcHkocGNwLT5wcm9tX2Fzc2lnbm1lbnRzLCBwcm9wLT52YWx1ZSwgbGVuKTsKLQkJcGNwLT5udW1fcHJvbV9hc3NpZ25tZW50cyA9Ci0JCQkobGVuIC8gc2l6ZW9mKHBjcC0+cHJvbV9hc3NpZ25tZW50c1swXSkpOwotCX0KLQotCWlmIChzdHJjbXAoZHAtPm5hbWUsICJlYnVzIikgPT0gMCkgewotCQlzdHJ1Y3QgbGludXhfcHJvbV9lYnVzX3JhbmdlcyAqZXJuZzsKLQkJaW50IGl0ZXI7Ci0KLQkJLyogRUJVUyBpcyBzcGVjaWFsLi4uICovCi0JCXByb3AgPSBvZl9maW5kX3Byb3BlcnR5KGRwLCAicmFuZ2VzIiwgJmxlbik7Ci0JCWlmICghcHJvcCkgewotCQkJcHJvbV9wcmludGYoIkVCVVM6IEZhdGFsIGVycm9yLCBubyByYW5nZSBwcm9wZXJ0eVxuIik7Ci0JCQlwcm9tX2hhbHQoKTsKLQkJfQotCQllcm5nID0gcHJvcC0+dmFsdWU7Ci0JCWxlbiA9IChsZW4gLyBzaXplb2YoZXJuZ1swXSkpOwotCQlmb3IgKGl0ZXIgPSAwOyBpdGVyIDwgbGVuOyBpdGVyKyspIHsKLQkJCXN0cnVjdCBsaW51eF9wcm9tX2VidXNfcmFuZ2VzICplcCA9ICZlcm5nW2l0ZXJdOwotCQkJc3RydWN0IGxpbnV4X3Byb21fcGNpX3JlZ2lzdGVycyAqYXA7Ci0KLQkJCWFwID0gJnBjcC0+cHJvbV9hc3NpZ25tZW50c1tpdGVyXTsKLQotCQkJYXAtPnBoeXNfaGkgPSBlcC0+cGFyZW50X3BoeXNfaGk7Ci0JCQlhcC0+cGh5c19taWQgPSBlcC0+cGFyZW50X3BoeXNfbWlkOwotCQkJYXAtPnBoeXNfbG8gPSBlcC0+cGFyZW50X3BoeXNfbG87Ci0JCQlhcC0+c2l6ZV9oaSA9IDA7Ci0JCQlhcC0+c2l6ZV9sbyA9IGVwLT5zaXplOwotCQl9Ci0JCXBjcC0+bnVtX3Byb21fYXNzaWdubWVudHMgPSBsZW47Ci0JfQotCi0JZml4dXBfb2JwX2Fzc2lnbm1lbnRzKHBkZXYsIHBjcCk7Ci0KLQlwZGV2LT5zeXNkYXRhID0gcGNwOwotCi0JLyogd2UgZG9uJ3QgcmVhbGx5IGNhcmUgaWYgd2UgY2FuIGNyZWF0ZSB0aGlzIGZpbGUgb3Igbm90LAotCSAqIGJ1dCB3ZSBuZWVkIHRvIGFzc2lnbiB0aGUgcmVzdWx0IG9mIHRoZSBjYWxsIG9yIHRoZSB3b3JsZCB3aWxsIGZhbGwKLQkgKiB1bmRlciBhbGllbiBpbnZhc2lvbiBhbmQgZXZlcnlib2R5IHdpbGwgYmUgZnJvemVuIG9uIGEgc3BhY2VzaGlwCi0JICogcmVhZHkgdG8gYmUgZWF0ZW4gb24gYWxwaGEgY2VudGF1cmkgYnkgc29tZSBncmVlbiBhbmQgamVsbHkgaHVtYW5vaWQuCi0JICovCi0JZXJyID0gc3lzZnNfY3JlYXRlX2ZpbGUoJnBkZXYtPmRldi5rb2JqLCAmZGV2X2F0dHJfb2JwcGF0aC5hdHRyKTsKLX0KLQotdm9pZCBfX2luaXQgcGNpX2ZpbGxfaW5fcGJtX2Nvb2tpZXMoc3RydWN0IHBjaV9idXMgKnBidXMsCi0JCQkJICAgIHN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSwKLQkJCQkgICAgc3RydWN0IGRldmljZV9ub2RlICpkcCkKLXsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldiwgKnBkZXZfbmV4dDsKLQlzdHJ1Y3QgcGNpX2J1cyAqdGhpc19wYnVzLCAqcGJ1c19uZXh0OwotCi0JLyogVGhpcyBtdXN0IGJlIF9zYWZlIGJlY2F1c2UgdGhlIGNvb2tpZSBmaWxsaW4KLQkgICByb3V0aW5lIGNhbiBkZWxldGUgZGV2aWNlcyBmcm9tIHRoZSB0cmVlLiAgKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocGRldiwgcGRldl9uZXh0LCAmcGJ1cy0+ZGV2aWNlcywgYnVzX2xpc3QpCi0JCXBkZXZfY29va2llX2ZpbGxpbihwYm0sIHBkZXYsIGRwKTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh0aGlzX3BidXMsIHBidXNfbmV4dCwgJnBidXMtPmNoaWxkcmVuLCBub2RlKSB7Ci0JCXN0cnVjdCBwY2lkZXZfY29va2llICpwY3AgPSB0aGlzX3BidXMtPnNlbGYtPnN5c2RhdGE7Ci0KLQkJcGNpX2ZpbGxfaW5fcGJtX2Nvb2tpZXModGhpc19wYnVzLCBwYm0sIHBjcC0+cHJvbV9ub2RlKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBiYWRfYXNzaWdubWVudChzdHJ1Y3QgcGNpX2RldiAqcGRldiwKLQkJCQkgIHN0cnVjdCBsaW51eF9wcm9tX3BjaV9yZWdpc3RlcnMgKmFwLAotCQkJCSAgc3RydWN0IHJlc291cmNlICpyZXMsCi0JCQkJICBpbnQgZG9fcHJvbV9oYWx0KQotewotCXByb21fcHJpbnRmKCJQQ0k6IEJvZ3VzIFBST00gYXNzaWdubWVudC4gQlVTWyUwMnhdIERFVkZOWyV4XVxuIiwKLQkJICAgIHBkZXYtPmJ1cy0+bnVtYmVyLCBwZGV2LT5kZXZmbik7Ci0JaWYgKGFwKQotCQlwcm9tX3ByaW50ZigiUENJOiBwaHlzWyUwOHg6JTA4eDolMDh4XSBzaXplWyUwOHg6JTA4eF1cbiIsCi0JCQkgICAgYXAtPnBoeXNfaGksIGFwLT5waHlzX21pZCwgYXAtPnBoeXNfbG8sCi0JCQkgICAgYXAtPnNpemVfaGksIGFwLT5zaXplX2xvKTsKLQlpZiAocmVzKQotCQlwcm9tX3ByaW50ZigiUENJOiBSRVNbJTAxNmx4LS0+JTAxNmx4OiglbHgpXVxuIiwKLQkJCSAgICByZXMtPnN0YXJ0LCByZXMtPmVuZCwgcmVzLT5mbGFncyk7Ci0JaWYgKGRvX3Byb21faGFsdCkKLQkJcHJvbV9oYWx0KCk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgKgotX19pbml0IGdldF9yb290X3Jlc291cmNlKHN0cnVjdCBsaW51eF9wcm9tX3BjaV9yZWdpc3RlcnMgKmFwLAotCQkJIHN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSkKLXsKLQlpbnQgc3BhY2UgPSAoYXAtPnBoeXNfaGkgPj4gMjQpICYgMzsKLQotCXN3aXRjaCAoc3BhY2UpIHsKLQljYXNlIDA6Ci0JCS8qIENvbmZpZ3VyYXRpb24gc3BhY2UsIHNpbGVudGx5IGlnbm9yZSBpdC4gKi8KLQkJcmV0dXJuIE5VTEw7Ci0KLQljYXNlIDE6Ci0JCS8qIDE2LWJpdCBJTyBzcGFjZSAqLwotCQlyZXR1cm4gJnBibS0+aW9fc3BhY2U7Ci0KLQljYXNlIDI6Ci0JCS8qIDMyLWJpdCBNRU0gc3BhY2UgKi8KLQkJcmV0dXJuICZwYm0tPm1lbV9zcGFjZTsKLQotCWNhc2UgMzoKLQkJLyogNjQtYml0IE1FTSBzcGFjZSwgdGhlc2UgYXJlIGFsbG9jYXRlZCBvdXQgb2YKLQkJICogdGhlIDMyLWJpdCBtZW1fc3BhY2UgcmFuZ2UgZm9yIHRoZSBQQk0sIGllLgotCQkgKiB3ZSBqdXN0IHplcm8gb3V0IHRoZSB1cHBlciAzMi1iaXRzLgotCQkgKi8KLQkJcmV0dXJuICZwYm0tPm1lbV9zcGFjZTsKLQotCWRlZmF1bHQ6Ci0JCXByaW50aygiUENJOiBXaGF0IGlzIHJlc291cmNlIHNwYWNlICV4P1xuIiwgc3BhY2UpOwotCQlyZXR1cm4gTlVMTDsKLQl9OwotfQotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlICoKLV9faW5pdCBnZXRfZGV2aWNlX3Jlc291cmNlKHN0cnVjdCBsaW51eF9wcm9tX3BjaV9yZWdpc3RlcnMgKmFwLAotCQkJICAgc3RydWN0IHBjaV9kZXYgKnBkZXYpCi17Ci0Jc3RydWN0IHJlc291cmNlICpyZXM7Ci0JaW50IGJyZWcgPSAoYXAtPnBoeXNfaGkgJiAweGZmKTsKLQotCXN3aXRjaCAoYnJlZykgewotCWNhc2UgIFBDSV9ST01fQUREUkVTUzoKLQkJLyogVW5mb3J0dW5hdGVseSBJIGhhdmUgc2VlbiBzZXZlcmFsIGNhc2VzIHdoZXJlCi0JCSAqIGJ1Z2d5IEZDT0RFIHVzZXMgYSBzcGFjZSB2YWx1ZSBvZiAnMScgKEkvTyBzcGFjZSkKLQkJICogaW4gdGhlIHJlZ2lzdGVyIHByb3BlcnR5IGZvciB0aGUgUk9NIGFkZHJlc3MKLQkJICogc28gZGlzYWJsZSB0aGlzIHNhbml0eSBjaGVjayBmb3Igbm93LgotCQkgKi8KLSNpZiAwCi0JewotCQlpbnQgc3BhY2UgPSAoYXAtPnBoeXNfaGkgPj4gMjQpICYgMzsKLQotCQkvKiBJdCBoYWQgYmV0dGVyIGJlIE1FTSBzcGFjZS4gKi8KLQkJaWYgKHNwYWNlICE9IDIpCi0JCQliYWRfYXNzaWdubWVudChwZGV2LCBhcCwgTlVMTCwgMCk7Ci0JfQotI2VuZGlmCi0JCXJlcyA9ICZwZGV2LT5yZXNvdXJjZVtQQ0lfUk9NX1JFU09VUkNFXTsKLQkJYnJlYWs7Ci0KLQljYXNlIFBDSV9CQVNFX0FERFJFU1NfMDoKLQljYXNlIFBDSV9CQVNFX0FERFJFU1NfMToKLQljYXNlIFBDSV9CQVNFX0FERFJFU1NfMjoKLQljYXNlIFBDSV9CQVNFX0FERFJFU1NfMzoKLQljYXNlIFBDSV9CQVNFX0FERFJFU1NfNDoKLQljYXNlIFBDSV9CQVNFX0FERFJFU1NfNToKLQkJcmVzID0gJnBkZXYtPnJlc291cmNlWyhicmVnIC0gUENJX0JBU0VfQUREUkVTU18wKSAvIDRdOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCWJhZF9hc3NpZ25tZW50KHBkZXYsIGFwLCBOVUxMLCAwKTsKLQkJcmVzID0gTlVMTDsKLQkJYnJlYWs7Ci0JfTsKLQotCXJldHVybiByZXM7Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBwZGV2X3JlY29yZF9hc3NpZ25tZW50cyhzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0sCi0JCQkJCSAgIHN0cnVjdCBwY2lfZGV2ICpwZGV2KQotewotCXN0cnVjdCBwY2lkZXZfY29va2llICpwY3AgPSBwZGV2LT5zeXNkYXRhOwotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IHBjcC0+bnVtX3Byb21fYXNzaWdubWVudHM7IGkrKykgewotCQlzdHJ1Y3QgbGludXhfcHJvbV9wY2lfcmVnaXN0ZXJzICphcDsKLQkJc3RydWN0IHJlc291cmNlICpyb290LCAqcmVzOwotCi0JCS8qIFRoZSBmb3JtYXQgb2YgdGhpcyBwcm9wZXJ0eSBpcyBzcGVjaWZpZWQgaW4KLQkJICogdGhlIFBDSSBCdXMgQmluZGluZyB0byBJRUVFMTI3NS0xOTk0LgotCQkgKi8KLQkJYXAgPSAmcGNwLT5wcm9tX2Fzc2lnbm1lbnRzW2ldOwotCQlyb290ID0gZ2V0X3Jvb3RfcmVzb3VyY2UoYXAsIHBibSk7Ci0JCXJlcyA9IGdldF9kZXZpY2VfcmVzb3VyY2UoYXAsIHBkZXYpOwotCQlpZiAocm9vdCA9PSBOVUxMIHx8IHJlcyA9PSBOVUxMIHx8Ci0JCSAgICByZXMtPmZsYWdzID09IDApCi0JCQljb250aW51ZTsKLQotCQkvKiBPayB3ZSBrbm93IHdoaWNoIHJlc291cmNlIHRoaXMgUFJPTSBhc3NpZ25tZW50IGlzCi0JCSAqIGZvciwgc2FuaXR5IGNoZWNrIGl0LgotCQkgKi8KLQkJaWYgKChyZXMtPnN0YXJ0ICYgMHhmZmZmZmZmZlVMKSAhPSBhcC0+cGh5c19sbykKLQkJCWJhZF9hc3NpZ25tZW50KHBkZXYsIGFwLCByZXMsIDEpOwotCi0JCS8qIElmIGl0IGlzIGEgNjQtYml0IE1FTSBzcGFjZSBhc3NpZ25tZW50LCB2ZXJpZnkgdGhhdAotCQkgKiB0aGUgcmVzb3VyY2UgaXMgdG9vIGFuZCB0aGF0IHRoZSB1cHBlciAzMi1iaXRzIG1hdGNoLgotCQkgKi8KLQkJaWYgKCgoYXAtPnBoeXNfaGkgPj4gMjQpICYgMykgPT0gMykgewotCQkJaWYgKCgocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfTUVNKSA9PSAwKSB8fAotCQkJICAgICgocmVzLT5mbGFncyAmIFBDSV9CQVNFX0FERFJFU1NfTUVNX1RZUEVfTUFTSykKLQkJCSAgICAgIT0gUENJX0JBU0VfQUREUkVTU19NRU1fVFlQRV82NCkpCi0JCQkJYmFkX2Fzc2lnbm1lbnQocGRldiwgYXAsIHJlcywgMSk7Ci0JCQlpZiAoKHJlcy0+c3RhcnQgPj4gMzIpICE9IGFwLT5waHlzX21pZCkKLQkJCQliYWRfYXNzaWdubWVudChwZGV2LCBhcCwgcmVzLCAxKTsKLQotCQkJLyogUEJNIGNhbm5vdCBnZW5lcmF0ZSBjcHUgaW5pdGlhdGVkIFBJT3MKLQkJCSAqIHRvIHRoZSBmdWxsIDY0LWJpdCBzcGFjZS4gIFRoZXJlZm9yZSB0aGUKLQkJCSAqIHVwcGVyIDMyLWJpdHMgYmV0dGVyIGJlIHplcm8uICBJZiBpdCBpcwotCQkJICogbm90LCBqdXN0IHNraXAgaXQgYW5kIHdlIHdpbGwgYXNzaWduIGl0Ci0JCQkgKiBwcm9wZXJseSBvdXJzZWx2ZXMuCi0JCQkgKi8KLQkJCWlmICgocmVzLT5zdGFydCA+PiAzMikgIT0gMFVMKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICJQQ0k6IE9CUCBhc3NpZ25zIG91dCBvZiByYW5nZSBNRU0gYWRkcmVzcyAiCi0JCQkJICAgICAgICIlMDE2bHggZm9yIHJlZ2lvbiAlbGQgb24gZGV2aWNlICVzXG4iLAotCQkJCSAgICAgICByZXMtPnN0YXJ0LCAocmVzIC0gJnBkZXYtPnJlc291cmNlWzBdKSwgcGNpX25hbWUocGRldikpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQl9Ci0KLQkJLyogQWRqdXN0IHRoZSByZXNvdXJjZSBpbnRvIHRoZSBwaHlzaWNhbCBhZGRyZXNzIHNwYWNlCi0JCSAqIG9mIHRoaXMgUEJNLgotCQkgKi8KLQkJcGJtLT5wYXJlbnQtPnJlc291cmNlX2FkanVzdChwZGV2LCByZXMsIHJvb3QpOwotCi0JCWlmIChyZXF1ZXN0X3Jlc291cmNlKHJvb3QsIHJlcykgPCAwKSB7Ci0JCQlpbnQgcm51bTsKLQotCQkJLyogT0ssIHRoZXJlIGlzIHNvbWUgY29uZmxpY3QuICBCdXQgdGhpcyBpcyBmaW5lCi0JCQkgKiBzaW5jZSB3ZSdsbCByZWFzc2lnbiBpdCBpbiB0aGUgZml4dXAgcGFzcy4KLQkJCSAqCi0JCQkgKiBEbyBub3QgcHJpbnQgdGhlIHdhcm5pbmcgZm9yIFJPTSByZXNvdXJjZXMKLQkJCSAqIGFzIHN1Y2ggYSBjb25mbGljdCBpcyBxdWl0ZSBjb21tb24gYW5kCi0JCQkgKiBoYXJtbGVzcyBhcyB0aGUgUk9NIGJhciBpcyBkaXNhYmxlZC4KLQkJCSAqLwotCQkJcm51bSA9IChyZXMgLSAmcGRldi0+cmVzb3VyY2VbMF0pOwotCQkJaWYgKHJudW0gIT0gUENJX1JPTV9SRVNPVVJDRSkKLQkJCQlwcmludGsoS0VSTl9FUlIgIlBDSTogUmVzb3VyY2UgY29sbGlzaW9uLCAiCi0JCQkJICAgICAgICJyZWdpb24gJWQgIgotCQkJCSAgICAgICAiWyUwMTZseDolMDE2bHhdIG9mIGRldmljZSAlc1xuIiwKLQkJCQkgICAgICAgcm51bSwKLQkJCQkgICAgICAgcmVzLT5zdGFydCwgcmVzLT5lbmQsCi0JCQkJICAgICAgIHBjaV9uYW1lKHBkZXYpKTsKLQkJfQotCX0KLX0KLQotdm9pZCBfX2luaXQgcGNpX3JlY29yZF9hc3NpZ25tZW50cyhzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0sCi0JCQkJICAgc3RydWN0IHBjaV9idXMgKnBidXMpCi17Ci0Jc3RydWN0IHBjaV9kZXYgKmRldjsKLQlzdHJ1Y3QgcGNpX2J1cyAqYnVzOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZwYnVzLT5kZXZpY2VzLCBidXNfbGlzdCkKLQkJcGRldl9yZWNvcmRfYXNzaWdubWVudHMocGJtLCBkZXYpOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShidXMsICZwYnVzLT5jaGlsZHJlbiwgbm9kZSkKLQkJcGNpX3JlY29yZF9hc3NpZ25tZW50cyhwYm0sIGJ1cyk7Ci19Ci0KLS8qIFJldHVybiBub24temVybyBpZiBQREVWIGhhcyBpbXBsaWNpdCBJL08gcmVzb3VyY2VzIGV2ZW4KLSAqIHRob3VnaCBpdCBtYXkgbm90IGhhdmUgYW4gSS9PIGJhc2UgYWRkcmVzcyByZWdpc3RlcgotICogYWN0aXZlLgotICovCi1zdGF0aWMgaW50IF9faW5pdCBoYXNfaW1wbGljaXRfaW8oc3RydWN0IHBjaV9kZXYgKnBkZXYpCi17Ci0JaW50IGNsYXNzID0gcGRldi0+Y2xhc3MgPj4gODsKLQotCWlmIChjbGFzcyA9PSBQQ0lfQ0xBU1NfTk9UX0RFRklORUQgfHwKLQkgICAgY2xhc3MgPT0gUENJX0NMQVNTX05PVF9ERUZJTkVEX1ZHQSB8fAotCSAgICBjbGFzcyA9PSBQQ0lfQ0xBU1NfU1RPUkFHRV9JREUgfHwKLQkgICAgKHBkZXYtPmNsYXNzID4+IDE2KSA9PSBQQ0lfQkFTRV9DTEFTU19ESVNQTEFZKQotCQlyZXR1cm4gMTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgcGRldl9hc3NpZ25fdW5hc3NpZ25lZChzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0sCi0JCQkJCSAgc3RydWN0IHBjaV9kZXYgKnBkZXYpCi17Ci0JdTMyIHJlZzsKLQl1MTYgY21kOwotCWludCBpLCBpb19zZWVuLCBtZW1fc2VlbjsKLQotCWlvX3NlZW4gPSBtZW1fc2VlbiA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IFBDSV9OVU1fUkVTT1VSQ0VTOyBpKyspIHsKLQkJc3RydWN0IHJlc291cmNlICpyb290LCAqcmVzOwotCQl1bnNpZ25lZCBsb25nIHNpemUsIG1pbiwgbWF4LCBhbGlnbjsKLQotCQlyZXMgPSAmcGRldi0+cmVzb3VyY2VbaV07Ci0KLQkJaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKQotCQkJaW9fc2VlbisrOwotCQllbHNlIGlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9NRU0pCi0JCQltZW1fc2VlbisrOwotCi0JCS8qIElmIGl0IGlzIGFscmVhZHkgYXNzaWduZWQgb3IgdGhlIHJlc291cmNlIGRvZXMKLQkJICogbm90IGV4aXN0LCB0aGVyZSBpcyBub3RoaW5nIHRvIGRvLgotCQkgKi8KLQkJaWYgKHJlcy0+cGFyZW50ICE9IE5VTEwgfHwgcmVzLT5mbGFncyA9PSAwVUwpCi0JCQljb250aW51ZTsKLQotCQkvKiBEZXRlcm1pbmUgdGhlIHJvb3Qgd2UgYWxsb2NhdGUgZnJvbS4gKi8KLQkJaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKSB7Ci0JCQlyb290ID0gJnBibS0+aW9fc3BhY2U7Ci0JCQltaW4gPSByb290LT5zdGFydCArIDB4NDAwVUw7Ci0JCQltYXggPSByb290LT5lbmQ7Ci0JCX0gZWxzZSB7Ci0JCQlyb290ID0gJnBibS0+bWVtX3NwYWNlOwotCQkJbWluID0gcm9vdC0+c3RhcnQ7Ci0JCQltYXggPSBtaW4gKyAweDgwMDAwMDAwVUw7Ci0JCX0KLQotCQlzaXplID0gcmVzLT5lbmQgLSByZXMtPnN0YXJ0OwotCQlhbGlnbiA9IHNpemUgKyAxOwotCQlpZiAoYWxsb2NhdGVfcmVzb3VyY2Uocm9vdCwgcmVzLCBzaXplICsgMSwgbWluLCBtYXgsIGFsaWduLCBOVUxMLCBOVUxMKSA8IDApIHsKLQkJCS8qIHVoIG9oICovCi0JCQlwcm9tX3ByaW50ZigiUENJOiBGYWlsZWQgdG8gYWxsb2NhdGUgcmVzb3VyY2UgJWQgZm9yICVzXG4iLAotCQkJCSAgICBpLCBwY2lfbmFtZShwZGV2KSk7Ci0JCQlwcm9tX2hhbHQoKTsKLQkJfQotCi0JCS8qIFVwZGF0ZSBQQ0kgY29uZmlnIHNwYWNlLiAqLwotCQlwYm0tPnBhcmVudC0+YmFzZV9hZGRyZXNzX3VwZGF0ZShwZGV2LCBpKTsKLQl9Ci0KLQkvKiBTcGVjaWFsIGNhc2UsIGRpc2FibGUgdGhlIFJPTS4gIFNldmVyYWwgZGV2aWNlcwotCSAqIGFjdCBmdW5ueSAoaWUuIGRvIG5vdCByZXNwb25kIHRvIG1lbW9yeSBzcGFjZSB3cml0ZXMpCi0JICogd2hlbiBpdCBpcyBsZWZ0IGVuYWJsZWQuICBBIGdvb2QgZXhhbXBsZSBhcmUgUWxvZ2ljLElTUAotCSAqIGFkYXB0ZXJzLgotCSAqLwotCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBQQ0lfUk9NX0FERFJFU1MsICZyZWcpOwotCXJlZyAmPSB+UENJX1JPTV9BRERSRVNTX0VOQUJMRTsKLQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIFBDSV9ST01fQUREUkVTUywgcmVnKTsKLQotCS8qIElmIHdlIHNhdyBJL08gb3IgTUVNIHJlc291cmNlcywgZW5hYmxlIGFwcHJvcHJpYXRlCi0JICogYml0cyBpbiBQQ0kgY29tbWFuZCByZWdpc3Rlci4KLQkgKi8KLQlpZiAoaW9fc2VlbiB8fCBtZW1fc2VlbikgewotCQlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBQQ0lfQ09NTUFORCwgJmNtZCk7Ci0JCWlmIChpb19zZWVuIHx8IGhhc19pbXBsaWNpdF9pbyhwZGV2KSkKLQkJCWNtZCB8PSBQQ0lfQ09NTUFORF9JTzsKLQkJaWYgKG1lbV9zZWVuKQotCQkJY21kIHw9IFBDSV9DT01NQU5EX01FTU9SWTsKLQkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9DT01NQU5ELCBjbWQpOwotCX0KLQotCS8qIElmIHRoaXMgaXMgYSBQQ0kgYnJpZGdlIG9yIGFuIElERSBjb250cm9sbGVyLAotCSAqIGVuYWJsZSBidXMgbWFzdGVyaW5nLiAgSW4gdGhlIGZvcm1lciBjYXNlIGFsc28KLQkgKiBzZXQgdGhlIGNhY2hlIGxpbmUgc2l6ZSBjb3JyZWN0bHkuCi0JICovCi0JaWYgKCgocGRldi0+Y2xhc3MgPj4gOCkgPT0gUENJX0NMQVNTX0JSSURHRV9QQ0kpIHx8Ci0JICAgICgoKHBkZXYtPmNsYXNzID4+IDgpID09IFBDSV9DTEFTU19TVE9SQUdFX0lERSkgJiYKLQkgICAgICgocGRldi0+Y2xhc3MgJiAweDgwKSAhPSAwKSkpIHsKLQkJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgUENJX0NPTU1BTkQsICZjbWQpOwotCQljbWQgfD0gUENJX0NPTU1BTkRfTUFTVEVSOwotCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQocGRldiwgUENJX0NPTU1BTkQsIGNtZCk7Ci0KLQkJaWYgKChwZGV2LT5jbGFzcyA+PiA4KSA9PSBQQ0lfQ0xBU1NfQlJJREdFX1BDSSkKLQkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LAotCQkJCQkgICAgICBQQ0lfQ0FDSEVfTElORV9TSVpFLAotCQkJCQkgICAgICAoNjQgLyBzaXplb2YodTMyKSkpOwotCX0KLX0KLQotdm9pZCBfX2luaXQgcGNpX2Fzc2lnbl91bmFzc2lnbmVkKHN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSwKLQkJCQkgIHN0cnVjdCBwY2lfYnVzICpwYnVzKQotewotCXN0cnVjdCBwY2lfZGV2ICpkZXY7Ci0Jc3RydWN0IHBjaV9idXMgKmJ1czsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmcGJ1cy0+ZGV2aWNlcywgYnVzX2xpc3QpCi0JCXBkZXZfYXNzaWduX3VuYXNzaWduZWQocGJtLCBkZXYpOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShidXMsICZwYnVzLT5jaGlsZHJlbiwgbm9kZSkKLQkJcGNpX2Fzc2lnbl91bmFzc2lnbmVkKHBibSwgYnVzKTsKLX0KLQotc3RhdGljIHZvaWQgX19pbml0IHBkZXZfZml4dXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQotewotCXN0cnVjdCBwY2lkZXZfY29va2llICpwY3AgPSBwZGV2LT5zeXNkYXRhOwotCXN0cnVjdCBvZl9kZXZpY2UgKm9wID0gcGNwLT5vcDsKLQotCWlmIChvcC0+aXJxc1swXSA9PSAweGZmZmZmZmZmKSB7Ci0JCXBkZXYtPmlycSA9IFBDSV9JUlFfTk9ORTsKLQkJcmV0dXJuOwotCX0KLQotCXBkZXYtPmlycSA9IG9wLT5pcnFzWzBdOwotCi0JcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9JTlRFUlJVUFRfTElORSwKLQkJCSAgICAgIHBkZXYtPmlycSAmIFBDSV9JUlFfSU5PKTsKLX0KLQotdm9pZCBfX2luaXQgcGNpX2ZpeHVwX2lycShzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0sCi0JCQkgIHN0cnVjdCBwY2lfYnVzICpwYnVzKQotewotCXN0cnVjdCBwY2lfZGV2ICpkZXY7Ci0Jc3RydWN0IHBjaV9idXMgKmJ1czsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmcGJ1cy0+ZGV2aWNlcywgYnVzX2xpc3QpCi0JCXBkZXZfZml4dXBfaXJxKGRldik7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGJ1cywgJnBidXMtPmNoaWxkcmVuLCBub2RlKQotCQlwY2lfZml4dXBfaXJxKHBibSwgYnVzKTsKLX0KLQotc3RhdGljIHZvaWQgcGRldl9zZXR1cF9idXNtYXN0ZXJpbmcoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCBpc182Nm1oeikKLXsKLQl1MTYgY21kOwotCXU4IGhkcl90eXBlLCBtaW5fZ250LCBsdGltZXI7Ci0KLQlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBQQ0lfQ09NTUFORCwgJmNtZCk7Ci0JY21kIHw9IFBDSV9DT01NQU5EX01BU1RFUjsKLQlwY2lfd3JpdGVfY29uZmlnX3dvcmQocGRldiwgUENJX0NPTU1BTkQsIGNtZCk7Ci0KLQkvKiBSZWFkIGl0IGJhY2ssIGlmIHRoZSBtYXN0ZXJpbmcgYml0IGRpZCBub3QKLQkgKiBnZXQgc2V0LCB0aGUgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgYnVzCi0JICogbWFzdGVyaW5nIHNvIHdlIGhhdmUgbm90aGluZyB0byBkbyBoZXJlLgotCSAqLwotCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9DT01NQU5ELCAmY21kKTsKLQlpZiAoKGNtZCAmIFBDSV9DT01NQU5EX01BU1RFUikgPT0gMCkKLQkJcmV0dXJuOwotCi0JLyogU2V0IGNvcnJlY3QgY2FjaGUgbGluZSBzaXplLCA2NC1ieXRlIG9uIGFsbAotCSAqIFNwYXJjNjQgUENJIHN5c3RlbXMuICBOb3RlIHRoYXQgdGhlIHZhbHVlIGlzCi0JICogbWVhc3VyZWQgaW4gMzItYml0IHdvcmRzLgotCSAqLwotCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBQQ0lfQ0FDSEVfTElORV9TSVpFLAotCQkJICAgICAgNjQgLyBzaXplb2YodTMyKSk7Ci0KLQlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBQQ0lfSEVBREVSX1RZUEUsICZoZHJfdHlwZSk7Ci0JaGRyX3R5cGUgJj0gfjB4ODA7Ci0JaWYgKGhkcl90eXBlICE9IFBDSV9IRUFERVJfVFlQRV9OT1JNQUwpCi0JCXJldHVybjsKLQotCS8qIElmIHRoZSBsYXRlbmN5IHRpbWVyIGlzIGFscmVhZHkgcHJvZ3JhbW1lZCB3aXRoIGEgbm9uLXplcm8KLQkgKiB2YWx1ZSwgYXNzdW1lIHdob2V2ZXIgc2V0IGl0IChPQlAgb3Igd2hvZXZlcikga25vd3Mgd2hhdAotCSAqIHRoZXkgYXJlIGRvaW5nLgotCSAqLwotCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9MQVRFTkNZX1RJTUVSLCAmbHRpbWVyKTsKLQlpZiAobHRpbWVyICE9IDApCi0JCXJldHVybjsKLQotCS8qIFhYWCBTaW5jZSBJJ20gdGlwcGluZyBvZmYgdGhlIG1pbiBncmFudCB2YWx1ZSB0bwotCSAqIFhYWCBjaG9vc2UgYSBzdWl0YWJsZSBsYXRlbmN5IHRpbWVyIHZhbHVlLCBJIGFsc28KLQkgKiBYWFggY29uc2lkZXJlZCBtYWtpbmcgdXNlIG9mIHRoZSBtYXggbGF0ZW5jeSB2YWx1ZQotCSAqIFhYWCBhcyB3ZWxsLiAgVW5mb3J0dW5hdGVseSBJJ3ZlIHNlZW4gdG9vIG1hbnkgYm9ndXNseQotCSAqIFhYWCBsb3cgc2V0dGluZ3MgZm9yIGl0IHRvIHRoZSBwb2ludCB3aGVyZSBpdCBsYWNrcwotCSAqIFhYWCBhbnkgdXNlZnVsbmVzcy4gIEluIG9uZSBjYXNlLCBhbiBldGhlcm5ldCBjYXJkCi0JICogWFhYIGNsYWltZWQgYSBtaW4gZ3JhbnQgb2YgMTAgYW5kIGEgbWF4IGxhdGVuY3kgb2YgNS4KLQkgKiBYWFggTm93LCBpZiBJIGhhZCB0d28gc3VjaCBjYXJkcyBvbiB0aGUgc2FtZSBidXMgSQotCSAqIFhYWCBjb3VsZCBub3Qgc2V0IHRoZSBkZXNpcmVkIGJ1cnN0IHBlcmlvZCAoY2FsY3VsYXRlZAotCSAqIFhYWCBmcm9tIG1pbiBncmFudCkgd2l0aG91dCB2aW9sYXRpbmcgdGhlIG1heCBsYXRlbmN5Ci0JICogWFhYIGJvdW5kLiAgRHVoLi4uCi0JICogWFhYCi0JICogWFhYIEkgYmxhbWUgZHVtYiBQQyBiaW9zIGltcGxlbWVudG9ycyBmb3Igc3R1ZmYgbGlrZQotCSAqIFhYWCB0aGlzLCBtb3N0IG9mIHRoZW0gZG9uJ3QgZXZlbiB0cnkgdG8gZG8gc29tZXRoaW5nCi0JICogWFhYIHNlbnNpYmxlIHdpdGggbGF0ZW5jeSB0aW1lciB2YWx1ZXMgYW5kIGp1c3Qgc2V0IHNvbWUKLQkgKiBYWFggZGVmYXVsdCB2YWx1ZSAodXN1YWxseSAzMikgaW50byBldmVyeSBkZXZpY2UuCi0JICovCi0KLQlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBQQ0lfTUlOX0dOVCwgJm1pbl9nbnQpOwotCi0JaWYgKG1pbl9nbnQgPT0gMCkgewotCQkvKiBJZiBubyBtaW5fZ250IHNldHRpbmcgdGhlbiB1c2UgYSBkZWZhdWx0Ci0JCSAqIHZhbHVlLgotCQkgKi8KLQkJaWYgKGlzXzY2bWh6KQotCQkJbHRpbWVyID0gMTY7Ci0JCWVsc2UKLQkJCWx0aW1lciA9IDMyOwotCX0gZWxzZSB7Ci0JCWludCBzaGlmdF9mYWN0b3I7Ci0KLQkJaWYgKGlzXzY2bWh6KQotCQkJc2hpZnRfZmFjdG9yID0gMjsKLQkJZWxzZQotCQkJc2hpZnRfZmFjdG9yID0gMzsKLQotCQkvKiBVc2UgYSBkZWZhdWx0IHZhbHVlIHdoZW4gdGhlIG1pbl9nbnQgdmFsdWUKLQkJICogaXMgZXJyb25lb3VzbHkgaGlnaC4KLQkJICovCi0JCWlmICgoKHVuc2lnbmVkIGludCkgbWluX2dudCA8PCBzaGlmdF9mYWN0b3IpID4gNTEyIHx8Ci0JCSAgICAoKG1pbl9nbnQgPDwgc2hpZnRfZmFjdG9yKSAmIDB4ZmYpID09IDApIHsKLQkJCWx0aW1lciA9IDggPDwgc2hpZnRfZmFjdG9yOwotCQl9IGVsc2UgewotCQkJbHRpbWVyID0gbWluX2dudCA8PCBzaGlmdF9mYWN0b3I7Ci0JCX0KLQl9Ci0KLQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgUENJX0xBVEVOQ1lfVElNRVIsIGx0aW1lcik7Ci19Ci0KLXZvaWQgcGNpX2RldGVybWluZV82Nm1oel9kaXNwb3NpdGlvbihzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0sCi0JCQkJICAgICBzdHJ1Y3QgcGNpX2J1cyAqcGJ1cykKLXsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKLQlpbnQgYWxsX2FyZV82Nm1oejsKLQl1MTYgc3RhdHVzOwotCi0JaWYgKHBibS0+aXNfNjZtaHpfY2FwYWJsZSA9PSAwKSB7Ci0JCWFsbF9hcmVfNjZtaHogPSAwOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlhbGxfYXJlXzY2bWh6ID0gMTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBkZXYsICZwYnVzLT5kZXZpY2VzLCBidXNfbGlzdCkgewotCQlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBQQ0lfU1RBVFVTLCAmc3RhdHVzKTsKLQkJaWYgKCEoc3RhdHVzICYgUENJX1NUQVRVU182Nk1IWikpIHsKLQkJCWFsbF9hcmVfNjZtaHogPSAwOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci1vdXQ6Ci0JcGJtLT5hbGxfZGV2c182Nm1oeiA9IGFsbF9hcmVfNjZtaHo7Ci0KLQlwcmludGsoIlBDSSVkKFBCTSVjKTogQnVzIHJ1bm5pbmcgYXQgJWRNSHpcbiIsCi0JICAgICAgIHBibS0+cGFyZW50LT5pbmRleCwKLQkgICAgICAgKHBibSA9PSAmcGJtLT5wYXJlbnQtPnBibV9BKSA/ICdBJyA6ICdCJywKLQkgICAgICAgKGFsbF9hcmVfNjZtaHogPyA2NiA6IDMzKSk7Ci19Ci0KLXZvaWQgcGNpX3NldHVwX2J1c21hc3RlcmluZyhzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0sCi0JCQkgICAgc3RydWN0IHBjaV9idXMgKnBidXMpCi17Ci0Jc3RydWN0IHBjaV9kZXYgKmRldjsKLQlzdHJ1Y3QgcGNpX2J1cyAqYnVzOwotCWludCBpc182Nm1oejsKLQotCWlzXzY2bWh6ID0gcGJtLT5pc182Nm1oel9jYXBhYmxlICYmIHBibS0+YWxsX2RldnNfNjZtaHo7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldiwgJnBidXMtPmRldmljZXMsIGJ1c19saXN0KQotCQlwZGV2X3NldHVwX2J1c21hc3RlcmluZyhkZXYsIGlzXzY2bWh6KTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoYnVzLCAmcGJ1cy0+Y2hpbGRyZW4sIG5vZGUpCi0JCXBjaV9zZXR1cF9idXNtYXN0ZXJpbmcocGJtLCBidXMpOwotfQotCi12b2lkIHBjaV9yZWdpc3Rlcl9sZWdhY3lfcmVnaW9ucyhzdHJ1Y3QgcmVzb3VyY2UgKmlvX3JlcywKLQkJCQkgc3RydWN0IHJlc291cmNlICptZW1fcmVzKQorc3RhdGljIHZvaWQgcGNpX3JlZ2lzdGVyX2xlZ2FjeV9yZWdpb25zKHN0cnVjdCByZXNvdXJjZSAqaW9fcmVzLAorCQkJCQlzdHJ1Y3QgcmVzb3VyY2UgKm1lbV9yZXMpCiB7CiAJc3RydWN0IHJlc291cmNlICpwOwogCkBAIC03NjAsNiArNTIsMTAyIEBACiAJcmVxdWVzdF9yZXNvdXJjZShtZW1fcmVzLCBwKTsKIH0KIAorc3RhdGljIHZvaWQgcGNpX3JlZ2lzdGVyX2lvbW11X3JlZ2lvbihzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0pCit7CisJY29uc3QgdTMyICp2ZG1hID0gb2ZfZ2V0X3Byb3BlcnR5KHBibS0+cHJvbV9ub2RlLCAidmlydHVhbC1kbWEiLCBOVUxMKTsKKworCWlmICh2ZG1hKSB7CisJCXN0cnVjdCByZXNvdXJjZSAqcnAgPSBrbWFsbG9jKHNpemVvZigqcnApLCBHRlBfS0VSTkVMKTsKKworCQlpZiAoIXJwKSB7CisJCQlwcm9tX3ByaW50ZigiQ2Fubm90IGFsbG9jYXRlIElPTU1VIHJlc291cmNlLlxuIik7CisJCQlwcm9tX2hhbHQoKTsKKwkJfQorCQlycC0+bmFtZSA9ICJJT01NVSI7CisJCXJwLT5zdGFydCA9IHBibS0+bWVtX3NwYWNlLnN0YXJ0ICsgKHVuc2lnbmVkIGxvbmcpIHZkbWFbMF07CisJCXJwLT5lbmQgPSBycC0+c3RhcnQgKyAodW5zaWduZWQgbG9uZykgdmRtYVsxXSAtIDFVTDsKKwkJcnAtPmZsYWdzID0gSU9SRVNPVVJDRV9CVVNZOworCQlyZXF1ZXN0X3Jlc291cmNlKCZwYm0tPm1lbV9zcGFjZSwgcnApOworCX0KK30KKwordm9pZCBwY2lfZGV0ZXJtaW5lX21lbV9pb19zcGFjZShzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0pCit7CisJY29uc3Qgc3RydWN0IGxpbnV4X3Byb21fcGNpX3JhbmdlcyAqcGJtX3JhbmdlczsKKwlpbnQgaSwgc2F3X21lbSwgc2F3X2lvOworCWludCBudW1fcGJtX3JhbmdlczsKKworCXNhd19tZW0gPSBzYXdfaW8gPSAwOworCXBibV9yYW5nZXMgPSBvZl9nZXRfcHJvcGVydHkocGJtLT5wcm9tX25vZGUsICJyYW5nZXMiLCAmaSk7CisJbnVtX3BibV9yYW5nZXMgPSBpIC8gc2l6ZW9mKCpwYm1fcmFuZ2VzKTsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fcGJtX3JhbmdlczsgaSsrKSB7CisJCWNvbnN0IHN0cnVjdCBsaW51eF9wcm9tX3BjaV9yYW5nZXMgKnByID0gJnBibV9yYW5nZXNbaV07CisJCXVuc2lnbmVkIGxvbmcgYTsKKwkJdTMyIHBhcmVudF9waHlzX2hpLCBwYXJlbnRfcGh5c19sbzsKKwkJaW50IHR5cGU7CisKKwkJcGFyZW50X3BoeXNfaGkgPSBwci0+cGFyZW50X3BoeXNfaGk7CisJCXBhcmVudF9waHlzX2xvID0gcHItPnBhcmVudF9waHlzX2xvOworCQlpZiAodGxiX3R5cGUgPT0gaHlwZXJ2aXNvcikKKwkJCXBhcmVudF9waHlzX2hpICY9IDB4MGZmZmZmZmY7CisKKwkJdHlwZSA9IChwci0+Y2hpbGRfcGh5c19oaSA+PiAyNCkgJiAweDM7CisJCWEgPSAoKCh1bnNpZ25lZCBsb25nKXBhcmVudF9waHlzX2hpIDw8IDMyVUwpIHwKKwkJICAgICAoKHVuc2lnbmVkIGxvbmcpcGFyZW50X3BoeXNfbG8gIDw8ICAwVUwpKTsKKworCQlzd2l0Y2ggKHR5cGUpIHsKKwkJY2FzZSAwOgorCQkJLyogUENJIGNvbmZpZyBzcGFjZSwgMTZNQiAqLworCQkJcGJtLT5jb25maWdfc3BhY2UgPSBhOworCQkJYnJlYWs7CisKKwkJY2FzZSAxOgorCQkJLyogMTYtYml0IElPIHNwYWNlLCAxNk1CICovCisJCQlwYm0tPmlvX3NwYWNlLnN0YXJ0ID0gYTsKKwkJCXBibS0+aW9fc3BhY2UuZW5kID0gYSArICgoMTZVTCoxMDI0VUwqMTAyNFVMKSAtIDFVTCk7CisJCQlwYm0tPmlvX3NwYWNlLmZsYWdzID0gSU9SRVNPVVJDRV9JTzsKKwkJCXNhd19pbyA9IDE7CisJCQlicmVhazsKKworCQljYXNlIDI6CisJCQkvKiAzMi1iaXQgTUVNIHNwYWNlLCAyR0IgKi8KKwkJCXBibS0+bWVtX3NwYWNlLnN0YXJ0ID0gYTsKKwkJCXBibS0+bWVtX3NwYWNlLmVuZCA9IGEgKyAoMHg4MDAwMDAwMFVMIC0gMVVMKTsKKwkJCXBibS0+bWVtX3NwYWNlLmZsYWdzID0gSU9SRVNPVVJDRV9NRU07CisJCQlzYXdfbWVtID0gMTsKKwkJCWJyZWFrOworCisJCWNhc2UgMzoKKwkJCS8qIFhYWCA2NC1iaXQgTUVNIGhhbmRsaW5nIFhYWCAqLworCisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfTsKKwl9CisKKwlpZiAoIXNhd19pbyB8fCAhc2F3X21lbSkgeworCQlwcm9tX3ByaW50ZigiJXM6IEZhdGFsIGVycm9yLCBtaXNzaW5nICVzIFBCTSByYW5nZS5cbiIsCisJCQkgICAgcGJtLT5uYW1lLAorCQkJICAgICghc2F3X2lvID8gIklPIiA6ICJNRU0iKSk7CisJCXByb21faGFsdCgpOworCX0KKworCXByaW50aygiJXM6IFBDSSBJT1slbHhdIE1FTVslbHhdXG4iLAorCSAgICAgICBwYm0tPm5hbWUsCisJICAgICAgIHBibS0+aW9fc3BhY2Uuc3RhcnQsCisJICAgICAgIHBibS0+bWVtX3NwYWNlLnN0YXJ0KTsKKworCXBibS0+aW9fc3BhY2UubmFtZSA9IHBibS0+bWVtX3NwYWNlLm5hbWUgPSBwYm0tPm5hbWU7CisKKwlyZXF1ZXN0X3Jlc291cmNlKCZpb3BvcnRfcmVzb3VyY2UsICZwYm0tPmlvX3NwYWNlKTsKKwlyZXF1ZXN0X3Jlc291cmNlKCZpb21lbV9yZXNvdXJjZSwgJnBibS0+bWVtX3NwYWNlKTsKKworCXBjaV9yZWdpc3Rlcl9sZWdhY3lfcmVnaW9ucygmcGJtLT5pb19zcGFjZSwKKwkJCQkgICAgJnBibS0+bWVtX3NwYWNlKTsKKwlwY2lfcmVnaXN0ZXJfaW9tbXVfcmVnaW9uKHBibSk7Cit9CisKIC8qIEdlbmVyaWMgaGVscGVyIHJvdXRpbmVzIGZvciBQQ0kgZXJyb3IgcmVwb3J0aW5nLiAqLwogdm9pZCBwY2lfc2Nhbl9mb3JfdGFyZ2V0X2Fib3J0KHN0cnVjdCBwY2lfY29udHJvbGxlcl9pbmZvICpwLAogCQkJICAgICAgIHN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSwKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX2ltcGwuaCBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX2ltcGwuaAppbmRleCA5NzFlMmJlLi4xMjA4NTgzIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9pbXBsLmgKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2lfaW1wbC5oCkBAIC0xLDcgKzEsNiBAQAotLyogJElkOiBwY2lfaW1wbC5oLHYgMS45IDIwMDEvMDYvMTMgMDY6MzQ6MzAgZGF2ZW0gRXhwICQKLSAqIHBjaV9pbXBsLmg6IEhlbHBlciBkZWZpbml0aW9ucyBmb3IgUENJIGNvbnRyb2xsZXIgc3VwcG9ydC4KKy8qIHBjaV9pbXBsLmg6IEhlbHBlciBkZWZpbml0aW9ucyBmb3IgUENJIGNvbnRyb2xsZXIgc3VwcG9ydC4KICAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTkgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUByZWRoYXQuY29tKQorICogQ29weXJpZ2h0IChDKSAxOTk5LCAyMDA3IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AZGF2ZW1sb2Z0Lm5ldCkKICAqLwogCiAjaWZuZGVmIFBDSV9JTVBMX0gKQEAgLTEzLDI2ICsxMiwyMiBAQAogI2luY2x1ZGUgPGFzbS9wcm9tLmg+CiAKIGV4dGVybiBzdHJ1Y3QgcGNpX2NvbnRyb2xsZXJfaW5mbyAqcGNpX2NvbnRyb2xsZXJfcm9vdDsKK2V4dGVybiB1bnNpZ25lZCBsb25nIHBjaV9tZW1zcGFjZV9tYXNrOwogCiBleHRlcm4gaW50IHBjaV9udW1fY29udHJvbGxlcnM7CiAKIC8qIFBDSSBidXMgc2Nhbm5pbmcgYW5kIGZpeHVwIHN1cHBvcnQuICovCi1leHRlcm4gdm9pZCBwY2lfZml4dXBfaG9zdF9icmlkZ2Vfc2VsZihzdHJ1Y3QgcGNpX2J1cyAqcGJ1cyk7Ci1leHRlcm4gdm9pZCBwY2lfZmlsbF9pbl9wYm1fY29va2llcyhzdHJ1Y3QgcGNpX2J1cyAqcGJ1cywKLQkJCQkgICAgc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtLAotCQkJCSAgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKnByb21fbm9kZSk7Ci1leHRlcm4gdm9pZCBwY2lfcmVjb3JkX2Fzc2lnbm1lbnRzKHN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSwKLQkJCQkgICBzdHJ1Y3QgcGNpX2J1cyAqcGJ1cyk7Ci1leHRlcm4gdm9pZCBwY2lfYXNzaWduX3VuYXNzaWduZWQoc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtLAotCQkJCSAgc3RydWN0IHBjaV9idXMgKnBidXMpOwotZXh0ZXJuIHZvaWQgcGNpX2ZpeHVwX2lycShzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0sCi0JCQkgIHN0cnVjdCBwY2lfYnVzICpwYnVzKTsKLWV4dGVybiB2b2lkIHBjaV9kZXRlcm1pbmVfNjZtaHpfZGlzcG9zaXRpb24oc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtLAotCQkJCQkgICAgc3RydWN0IHBjaV9idXMgKnBidXMpOwotZXh0ZXJuIHZvaWQgcGNpX3NldHVwX2J1c21hc3RlcmluZyhzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0sCi0JCQkJICAgc3RydWN0IHBjaV9idXMgKnBidXMpOwotZXh0ZXJuIHZvaWQgcGNpX3JlZ2lzdGVyX2xlZ2FjeV9yZWdpb25zKHN0cnVjdCByZXNvdXJjZSAqaW9fcmVzLAotCQkJCQlzdHJ1Y3QgcmVzb3VyY2UgKm1lbV9yZXMpOworZXh0ZXJuIHN0cnVjdCBwY2lfYnVzICpwY2lfc2Nhbl9vbmVfcGJtKHN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSk7CitleHRlcm4gdm9pZCBwY2lfZGV0ZXJtaW5lX21lbV9pb19zcGFjZShzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0pOworCitleHRlcm4gaW50IHBjaV9ob3N0X2JyaWRnZV9yZWFkX3BjaV9jZmcoc3RydWN0IHBjaV9idXMgKmJ1c19kZXYsCisJCQkJCXVuc2lnbmVkIGludCBkZXZmbiwKKwkJCQkJaW50IHdoZXJlLCBpbnQgc2l6ZSwKKwkJCQkJdTMyICp2YWx1ZSk7CitleHRlcm4gaW50IHBjaV9ob3N0X2JyaWRnZV93cml0ZV9wY2lfY2ZnKHN0cnVjdCBwY2lfYnVzICpidXNfZGV2LAorCQkJCQkgdW5zaWduZWQgaW50IGRldmZuLAorCQkJCQkgaW50IHdoZXJlLCBpbnQgc2l6ZSwKKwkJCQkJIHUzMiB2YWx1ZSk7CiAKIC8qIEVycm9yIHJlcG9ydGluZyBzdXBwb3J0LiAqLwogZXh0ZXJuIHZvaWQgcGNpX3NjYW5fZm9yX3RhcmdldF9hYm9ydChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXJfaW5mbyAqLCBzdHJ1Y3QgcGNpX3BibV9pbmZvICosIHN0cnVjdCBwY2lfYnVzICopOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2lfaW9tbXUuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX2lvbW11LmMKaW5kZXggN2FjYTBmMy4uNjY3MTI3NyAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2lfaW9tbXUuYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9pb21tdS5jCkBAIC0xLDcgKzEsNiBAQAotLyogJElkOiBwY2lfaW9tbXUuYyx2IDEuMTcgMjAwMS8xMi8xNyAwNzowNTowOSBkYXZlbSBFeHAgJAotICogcGNpX2lvbW11LmM6IFVsdHJhU3BhcmMgUENJIGNvbnRyb2xsZXIgSU9NL1NUQyBzdXBwb3J0LgorLyogcGNpX2lvbW11LmM6IFVsdHJhU3BhcmMgUENJIGNvbnRyb2xsZXIgSU9NL1NUQyBzdXBwb3J0LgogICoKLSAqIENvcHlyaWdodCAoQykgMTk5OSBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQHJlZGhhdC5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDcgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBkYXZlbWxvZnQubmV0KQogICogQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwIEpha3ViIEplbGluZWsgKGpha3ViQHJlZGhhdC5jb20pCiAgKi8KIApAQCAtMzYsNyArMzUsNyBAQAogCQkJICAgICAgICJpIiAoQVNJX1BIWVNfQllQQVNTX0VDX0UpKQogCiAvKiBNdXN0IGJlIGludm9rZWQgdW5kZXIgdGhlIElPTU1VIGxvY2suICovCi1zdGF0aWMgdm9pZCBfX2lvbW11X2ZsdXNoYWxsKHN0cnVjdCBwY2lfaW9tbXUgKmlvbW11KQorc3RhdGljIHZvaWQgX19pb21tdV9mbHVzaGFsbChzdHJ1Y3QgaW9tbXUgKmlvbW11KQogewogCXVuc2lnbmVkIGxvbmcgdGFnOwogCWludCBlbnRyeTsKQEAgLTY0LDcgKzYzLDcgQEAKICNkZWZpbmUgSU9QVEVfSVNfRFVNTVkoaW9tbXUsIGlvcHRlKQlcCiAJKChpb3B0ZV92YWwoKmlvcHRlKSAmIElPUFRFX1BBR0UpID09IChpb21tdSktPmR1bW15X3BhZ2VfcGEpCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBpb3B0ZV9tYWtlX2R1bW15KHN0cnVjdCBwY2lfaW9tbXUgKmlvbW11LCBpb3B0ZV90ICppb3B0ZSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBpb3B0ZV9tYWtlX2R1bW15KHN0cnVjdCBpb21tdSAqaW9tbXUsIGlvcHRlX3QgKmlvcHRlKQogewogCXVuc2lnbmVkIGxvbmcgdmFsID0gaW9wdGVfdmFsKCppb3B0ZSk7CiAKQEAgLTc1LDkgKzc0LDkgQEAKIH0KIAogLyogQmFzZWQgbGFyZ2VseSB1cG9uIHRoZSBwcGM2NCBpb21tdSBhbGxvY2F0b3IuICAqLwotc3RhdGljIGxvbmcgcGNpX2FyZW5hX2FsbG9jKHN0cnVjdCBwY2lfaW9tbXUgKmlvbW11LCB1bnNpZ25lZCBsb25nIG5wYWdlcykKK3N0YXRpYyBsb25nIHBjaV9hcmVuYV9hbGxvYyhzdHJ1Y3QgaW9tbXUgKmlvbW11LCB1bnNpZ25lZCBsb25nIG5wYWdlcykKIHsKLQlzdHJ1Y3QgcGNpX2lvbW11X2FyZW5hICphcmVuYSA9ICZpb21tdS0+YXJlbmE7CisJc3RydWN0IGlvbW11X2FyZW5hICphcmVuYSA9ICZpb21tdS0+YXJlbmE7CiAJdW5zaWduZWQgbG9uZyBuLCBpLCBzdGFydCwgZW5kLCBsaW1pdDsKIAlpbnQgcGFzczsKIApAQCAtMTE2LDcgKzExNSw3IEBACiAJcmV0dXJuIG47CiB9CiAKLXN0YXRpYyB2b2lkIHBjaV9hcmVuYV9mcmVlKHN0cnVjdCBwY2lfaW9tbXVfYXJlbmEgKmFyZW5hLCB1bnNpZ25lZCBsb25nIGJhc2UsIHVuc2lnbmVkIGxvbmcgbnBhZ2VzKQorc3RhdGljIHZvaWQgcGNpX2FyZW5hX2ZyZWUoc3RydWN0IGlvbW11X2FyZW5hICphcmVuYSwgdW5zaWduZWQgbG9uZyBiYXNlLCB1bnNpZ25lZCBsb25nIG5wYWdlcykKIHsKIAl1bnNpZ25lZCBsb25nIGk7CiAKQEAgLTEyNCw3ICsxMjMsNyBAQAogCQlfX2NsZWFyX2JpdChpLCBhcmVuYS0+bWFwKTsKIH0KIAotdm9pZCBwY2lfaW9tbXVfdGFibGVfaW5pdChzdHJ1Y3QgcGNpX2lvbW11ICppb21tdSwgaW50IHRzYnNpemUsIHUzMiBkbWFfb2Zmc2V0LCB1MzIgZG1hX2FkZHJfbWFzaykKK3ZvaWQgcGNpX2lvbW11X3RhYmxlX2luaXQoc3RydWN0IGlvbW11ICppb21tdSwgaW50IHRzYnNpemUsIHUzMiBkbWFfb2Zmc2V0LCB1MzIgZG1hX2FkZHJfbWFzaykKIHsKIAl1bnNpZ25lZCBsb25nIGksIHRzYmJhc2UsIG9yZGVyLCBzeiwgbnVtX3RzYl9lbnRyaWVzOwogCkBAIC0xNzAsNyArMTY5LDcgQEAKIAkJaW9wdGVfbWFrZV9kdW1teShpb21tdSwgJmlvbW11LT5wYWdlX3RhYmxlW2ldKTsKIH0KIAotc3RhdGljIGlubGluZSBpb3B0ZV90ICphbGxvY19ucGFnZXMoc3RydWN0IHBjaV9pb21tdSAqaW9tbXUsIHVuc2lnbmVkIGxvbmcgbnBhZ2VzKQorc3RhdGljIGlubGluZSBpb3B0ZV90ICphbGxvY19ucGFnZXMoc3RydWN0IGlvbW11ICppb21tdSwgdW5zaWduZWQgbG9uZyBucGFnZXMpCiB7CiAJbG9uZyBlbnRyeTsKIApAQCAtMTgxLDEyICsxODAsMTIgQEAKIAlyZXR1cm4gaW9tbXUtPnBhZ2VfdGFibGUgKyBlbnRyeTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGZyZWVfbnBhZ2VzKHN0cnVjdCBwY2lfaW9tbXUgKmlvbW11LCBkbWFfYWRkcl90IGJhc2UsIHVuc2lnbmVkIGxvbmcgbnBhZ2VzKQorc3RhdGljIGlubGluZSB2b2lkIGZyZWVfbnBhZ2VzKHN0cnVjdCBpb21tdSAqaW9tbXUsIGRtYV9hZGRyX3QgYmFzZSwgdW5zaWduZWQgbG9uZyBucGFnZXMpCiB7CiAJcGNpX2FyZW5hX2ZyZWUoJmlvbW11LT5hcmVuYSwgYmFzZSA+PiBJT19QQUdFX1NISUZULCBucGFnZXMpOwogfQogCi1zdGF0aWMgaW50IGlvbW11X2FsbG9jX2N0eChzdHJ1Y3QgcGNpX2lvbW11ICppb21tdSkKK3N0YXRpYyBpbnQgaW9tbXVfYWxsb2NfY3R4KHN0cnVjdCBpb21tdSAqaW9tbXUpCiB7CiAJaW50IGxvd2VzdCA9IGlvbW11LT5jdHhfbG93ZXN0X2ZyZWU7CiAJaW50IHN6ID0gSU9NTVVfTlVNX0NUWFMgLSBsb3dlc3Q7CkBAIC0yMDUsNyArMjA0LDcgQEAKIAlyZXR1cm4gbjsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGlvbW11X2ZyZWVfY3R4KHN0cnVjdCBwY2lfaW9tbXUgKmlvbW11LCBpbnQgY3R4KQorc3RhdGljIGlubGluZSB2b2lkIGlvbW11X2ZyZWVfY3R4KHN0cnVjdCBpb21tdSAqaW9tbXUsIGludCBjdHgpCiB7CiAJaWYgKGxpa2VseShjdHgpKSB7CiAJCV9fY2xlYXJfYml0KGN0eCwgaW9tbXUtPmN0eF9iaXRtYXApOwpAQCAtMjIwLDggKzIxOSw3IEBACiAgKi8KIHN0YXRpYyB2b2lkICpwY2lfNHVfYWxsb2NfY29uc2lzdGVudChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc2l6ZV90IHNpemUsIGRtYV9hZGRyX3QgKmRtYV9hZGRycCwgZ2ZwX3QgZ2ZwKQogewotCXN0cnVjdCBwY2lkZXZfY29va2llICpwY3A7Ci0Jc3RydWN0IHBjaV9pb21tdSAqaW9tbXU7CisJc3RydWN0IGlvbW11ICppb21tdTsKIAlpb3B0ZV90ICppb3B0ZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzLCBvcmRlciwgZmlyc3RfcGFnZTsKIAl2b2lkICpyZXQ7CkBAIC0yMzcsOCArMjM1LDcgQEAKIAkJcmV0dXJuIE5VTEw7CiAJbWVtc2V0KChjaGFyICopZmlyc3RfcGFnZSwgMCwgUEFHRV9TSVpFIDw8IG9yZGVyKTsKIAotCXBjcCA9IHBkZXYtPnN5c2RhdGE7Ci0JaW9tbXUgPSBwY3AtPnBibS0+aW9tbXU7CisJaW9tbXUgPSBwZGV2LT5kZXYuYXJjaGRhdGEuaW9tbXU7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaW9tbXUtPmxvY2ssIGZsYWdzKTsKIAlpb3B0ZSA9IGFsbG9jX25wYWdlcyhpb21tdSwgc2l6ZSA+PiBJT19QQUdFX1NISUZUKTsKQEAgLTI2OCwxNCArMjY1LDEyIEBACiAvKiBGcmVlIGFuZCB1bm1hcCBhIGNvbnNpc3RlbnQgRE1BIHRyYW5zbGF0aW9uLiAqLwogc3RhdGljIHZvaWQgcGNpXzR1X2ZyZWVfY29uc2lzdGVudChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc2l6ZV90IHNpemUsIHZvaWQgKmNwdSwgZG1hX2FkZHJfdCBkdm1hKQogewotCXN0cnVjdCBwY2lkZXZfY29va2llICpwY3A7Ci0Jc3RydWN0IHBjaV9pb21tdSAqaW9tbXU7CisJc3RydWN0IGlvbW11ICppb21tdTsKIAlpb3B0ZV90ICppb3B0ZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzLCBvcmRlciwgbnBhZ2VzOwogCiAJbnBhZ2VzID0gSU9fUEFHRV9BTElHTihzaXplKSA+PiBJT19QQUdFX1NISUZUOwotCXBjcCA9IHBkZXYtPnN5c2RhdGE7Ci0JaW9tbXUgPSBwY3AtPnBibS0+aW9tbXU7CisJaW9tbXUgPSBwZGV2LT5kZXYuYXJjaGRhdGEuaW9tbXU7CiAJaW9wdGUgPSBpb21tdS0+cGFnZV90YWJsZSArCiAJCSgoZHZtYSAtIGlvbW11LT5wYWdlX3RhYmxlX21hcF9iYXNlKSA+PiBJT19QQUdFX1NISUZUKTsKIApAQCAtMjk1LDE4ICsyOTAsMTYgQEAKICAqLwogc3RhdGljIGRtYV9hZGRyX3QgcGNpXzR1X21hcF9zaW5nbGUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHZvaWQgKnB0ciwgc2l6ZV90IHN6LCBpbnQgZGlyZWN0aW9uKQogewotCXN0cnVjdCBwY2lkZXZfY29va2llICpwY3A7Ci0Jc3RydWN0IHBjaV9pb21tdSAqaW9tbXU7Ci0Jc3RydWN0IHBjaV9zdHJidWYgKnN0cmJ1ZjsKKwlzdHJ1Y3QgaW9tbXUgKmlvbW11OworCXN0cnVjdCBzdHJidWYgKnN0cmJ1ZjsKIAlpb3B0ZV90ICpiYXNlOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIG5wYWdlcywgb2FkZHI7CiAJdW5zaWduZWQgbG9uZyBpLCBiYXNlX3BhZGRyLCBjdHg7CiAJdTMyIGJ1c19hZGRyLCByZXQ7CiAJdW5zaWduZWQgbG9uZyBpb3B0ZV9wcm90ZWN0aW9uOwogCi0JcGNwID0gcGRldi0+c3lzZGF0YTsKLQlpb21tdSA9IHBjcC0+cGJtLT5pb21tdTsKLQlzdHJidWYgPSAmcGNwLT5wYm0tPnN0YzsKKwlpb21tdSA9IHBkZXYtPmRldi5hcmNoZGF0YS5pb21tdTsKKwlzdHJidWYgPSBwZGV2LT5kZXYuYXJjaGRhdGEuc3RjOwogCiAJaWYgKHVubGlrZWx5KGRpcmVjdGlvbiA9PSBQQ0lfRE1BX05PTkUpKQogCQlnb3RvIGJhZF9ub19jdHg7CkBAIC0zNDksNyArMzQyLDcgQEAKIAlyZXR1cm4gUENJX0RNQV9FUlJPUl9DT0RFOwogfQogCi1zdGF0aWMgdm9pZCBwY2lfc3RyYnVmX2ZsdXNoKHN0cnVjdCBwY2lfc3RyYnVmICpzdHJidWYsIHN0cnVjdCBwY2lfaW9tbXUgKmlvbW11LCB1MzIgdmFkZHIsIHVuc2lnbmVkIGxvbmcgY3R4LCB1bnNpZ25lZCBsb25nIG5wYWdlcywgaW50IGRpcmVjdGlvbikKK3N0YXRpYyB2b2lkIHBjaV9zdHJidWZfZmx1c2goc3RydWN0IHN0cmJ1ZiAqc3RyYnVmLCBzdHJ1Y3QgaW9tbXUgKmlvbW11LCB1MzIgdmFkZHIsIHVuc2lnbmVkIGxvbmcgY3R4LCB1bnNpZ25lZCBsb25nIG5wYWdlcywgaW50IGRpcmVjdGlvbikKIHsKIAlpbnQgbGltaXQ7CiAKQEAgLTQxNiw5ICs0MDksOCBAQAogLyogVW5tYXAgYSBzaW5nbGUgc3RyZWFtaW5nIG1vZGUgRE1BIHRyYW5zbGF0aW9uLiAqLwogc3RhdGljIHZvaWQgcGNpXzR1X3VubWFwX3NpbmdsZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgZG1hX2FkZHJfdCBidXNfYWRkciwgc2l6ZV90IHN6LCBpbnQgZGlyZWN0aW9uKQogewotCXN0cnVjdCBwY2lkZXZfY29va2llICpwY3A7Ci0Jc3RydWN0IHBjaV9pb21tdSAqaW9tbXU7Ci0Jc3RydWN0IHBjaV9zdHJidWYgKnN0cmJ1ZjsKKwlzdHJ1Y3QgaW9tbXUgKmlvbW11OworCXN0cnVjdCBzdHJidWYgKnN0cmJ1ZjsKIAlpb3B0ZV90ICpiYXNlOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIG5wYWdlcywgY3R4LCBpOwogCkBAIC00MjgsOSArNDIwLDggQEAKIAkJcmV0dXJuOwogCX0KIAotCXBjcCA9IHBkZXYtPnN5c2RhdGE7Ci0JaW9tbXUgPSBwY3AtPnBibS0+aW9tbXU7Ci0Jc3RyYnVmID0gJnBjcC0+cGJtLT5zdGM7CisJaW9tbXUgPSBwZGV2LT5kZXYuYXJjaGRhdGEuaW9tbXU7CisJc3RyYnVmID0gcGRldi0+ZGV2LmFyY2hkYXRhLnN0YzsKIAogCW5wYWdlcyA9IElPX1BBR0VfQUxJR04oYnVzX2FkZHIgKyBzeikgLSAoYnVzX2FkZHIgJiBJT19QQUdFX01BU0spOwogCW5wYWdlcyA+Pj0gSU9fUEFHRV9TSElGVDsKQEAgLTU0OSw5ICs1NDAsOCBAQAogICovCiBzdGF0aWMgaW50IHBjaV80dV9tYXBfc2coc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2dsaXN0LCBpbnQgbmVsZW1zLCBpbnQgZGlyZWN0aW9uKQogewotCXN0cnVjdCBwY2lkZXZfY29va2llICpwY3A7Ci0Jc3RydWN0IHBjaV9pb21tdSAqaW9tbXU7Ci0Jc3RydWN0IHBjaV9zdHJidWYgKnN0cmJ1ZjsKKwlzdHJ1Y3QgaW9tbXUgKmlvbW11OworCXN0cnVjdCBzdHJidWYgKnN0cmJ1ZjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzLCBjdHgsIG5wYWdlcywgaW9wdGVfcHJvdGVjdGlvbjsKIAlpb3B0ZV90ICpiYXNlOwogCXUzMiBkbWFfYmFzZTsKQEAgLTU3MCw5ICs1NjAsOCBAQAogCQlyZXR1cm4gMTsKIAl9CiAKLQlwY3AgPSBwZGV2LT5zeXNkYXRhOwotCWlvbW11ID0gcGNwLT5wYm0tPmlvbW11OwotCXN0cmJ1ZiA9ICZwY3AtPnBibS0+c3RjOworCWlvbW11ID0gcGRldi0+ZGV2LmFyY2hkYXRhLmlvbW11OworCXN0cmJ1ZiA9IHBkZXYtPmRldi5hcmNoZGF0YS5zdGM7CiAJCiAJaWYgKHVubGlrZWx5KGRpcmVjdGlvbiA9PSBQQ0lfRE1BX05PTkUpKQogCQlnb3RvIGJhZF9ub19jdHg7CkBAIC02MzYsOSArNjI1LDggQEAKIC8qIFVubWFwIGEgc2V0IG9mIHN0cmVhbWluZyBtb2RlIERNQSB0cmFuc2xhdGlvbnMuICovCiBzdGF0aWMgdm9pZCBwY2lfNHVfdW5tYXBfc2coc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2dsaXN0LCBpbnQgbmVsZW1zLCBpbnQgZGlyZWN0aW9uKQogewotCXN0cnVjdCBwY2lkZXZfY29va2llICpwY3A7Ci0Jc3RydWN0IHBjaV9pb21tdSAqaW9tbXU7Ci0Jc3RydWN0IHBjaV9zdHJidWYgKnN0cmJ1ZjsKKwlzdHJ1Y3QgaW9tbXUgKmlvbW11OworCXN0cnVjdCBzdHJidWYgKnN0cmJ1ZjsKIAlpb3B0ZV90ICpiYXNlOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGN0eCwgaSwgbnBhZ2VzOwogCXUzMiBidXNfYWRkcjsKQEAgLTY0OCw5ICs2MzYsOCBAQAogCQkJV0FSTl9PTigxKTsKIAl9CiAKLQlwY3AgPSBwZGV2LT5zeXNkYXRhOwotCWlvbW11ID0gcGNwLT5wYm0tPmlvbW11OwotCXN0cmJ1ZiA9ICZwY3AtPnBibS0+c3RjOworCWlvbW11ID0gcGRldi0+ZGV2LmFyY2hkYXRhLmlvbW11OworCXN0cmJ1ZiA9IHBkZXYtPmRldi5hcmNoZGF0YS5zdGM7CiAJCiAJYnVzX2FkZHIgPSBzZ2xpc3QtPmRtYV9hZGRyZXNzICYgSU9fUEFHRV9NQVNLOwogCkBAIC02OTYsMTQgKzY4MywxMiBAQAogICovCiBzdGF0aWMgdm9pZCBwY2lfNHVfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGRtYV9hZGRyX3QgYnVzX2FkZHIsIHNpemVfdCBzeiwgaW50IGRpcmVjdGlvbikKIHsKLQlzdHJ1Y3QgcGNpZGV2X2Nvb2tpZSAqcGNwOwotCXN0cnVjdCBwY2lfaW9tbXUgKmlvbW11OwotCXN0cnVjdCBwY2lfc3RyYnVmICpzdHJidWY7CisJc3RydWN0IGlvbW11ICppb21tdTsKKwlzdHJ1Y3Qgc3RyYnVmICpzdHJidWY7CiAJdW5zaWduZWQgbG9uZyBmbGFncywgY3R4LCBucGFnZXM7CiAKLQlwY3AgPSBwZGV2LT5zeXNkYXRhOwotCWlvbW11ID0gcGNwLT5wYm0tPmlvbW11OwotCXN0cmJ1ZiA9ICZwY3AtPnBibS0+c3RjOworCWlvbW11ID0gcGRldi0+ZGV2LmFyY2hkYXRhLmlvbW11OworCXN0cmJ1ZiA9IHBkZXYtPmRldi5hcmNoZGF0YS5zdGM7CiAKIAlpZiAoIXN0cmJ1Zi0+c3RyYnVmX2VuYWJsZWQpCiAJCXJldHVybjsKQEAgLTczNiwxNSArNzIxLDEzIEBACiAgKi8KIHN0YXRpYyB2b2lkIHBjaV80dV9kbWFfc3luY19zZ19mb3JfY3B1KHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbGlzdCwgaW50IG5lbGVtcywgaW50IGRpcmVjdGlvbikKIHsKLQlzdHJ1Y3QgcGNpZGV2X2Nvb2tpZSAqcGNwOwotCXN0cnVjdCBwY2lfaW9tbXUgKmlvbW11OwotCXN0cnVjdCBwY2lfc3RyYnVmICpzdHJidWY7CisJc3RydWN0IGlvbW11ICppb21tdTsKKwlzdHJ1Y3Qgc3RyYnVmICpzdHJidWY7CiAJdW5zaWduZWQgbG9uZyBmbGFncywgY3R4LCBucGFnZXMsIGk7CiAJdTMyIGJ1c19hZGRyOwogCi0JcGNwID0gcGRldi0+c3lzZGF0YTsKLQlpb21tdSA9IHBjcC0+cGJtLT5pb21tdTsKLQlzdHJidWYgPSAmcGNwLT5wYm0tPnN0YzsKKwlpb21tdSA9IHBkZXYtPmRldi5hcmNoZGF0YS5pb21tdTsKKwlzdHJidWYgPSBwZGV2LT5kZXYuYXJjaGRhdGEuc3RjOwogCiAJaWYgKCFzdHJidWYtPnN0cmJ1Zl9lbmFibGVkKQogCQlyZXR1cm47CkBAIC03NzUsNyArNzU4LDcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb21tdS0+bG9jaywgZmxhZ3MpOwogfQogCi1zdHJ1Y3QgcGNpX2lvbW11X29wcyBwY2lfc3VuNHVfaW9tbXVfb3BzID0geworY29uc3Qgc3RydWN0IHBjaV9pb21tdV9vcHMgcGNpX3N1bjR1X2lvbW11X29wcyA9IHsKIAkuYWxsb2NfY29uc2lzdGVudAkJPSBwY2lfNHVfYWxsb2NfY29uc2lzdGVudCwKIAkuZnJlZV9jb25zaXN0ZW50CQk9IHBjaV80dV9mcmVlX2NvbnNpc3RlbnQsCiAJLm1hcF9zaW5nbGUJCQk9IHBjaV80dV9tYXBfc2luZ2xlLApAQCAtODA5LDEzICs3OTIsMTIgQEAKIAogaW50IHBjaV9kbWFfc3VwcG9ydGVkKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1NjQgZGV2aWNlX21hc2spCiB7Ci0Jc3RydWN0IHBjaWRldl9jb29raWUgKnBjcCA9IHBkZXYtPnN5c2RhdGE7CiAJdTY0IGRtYV9hZGRyX21hc2s7CiAKIAlpZiAocGRldiA9PSBOVUxMKSB7CiAJCWRtYV9hZGRyX21hc2sgPSAweGZmZmZmZmZmOwogCX0gZWxzZSB7Ci0JCXN0cnVjdCBwY2lfaW9tbXUgKmlvbW11ID0gcGNwLT5wYm0tPmlvbW11OworCQlzdHJ1Y3QgaW9tbXUgKmlvbW11ID0gcGRldi0+ZGV2LmFyY2hkYXRhLmlvbW11OwogCiAJCWRtYV9hZGRyX21hc2sgPSBpb21tdS0+ZG1hX2FkZHJfbWFzazsKIApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2lfcHN5Y2hvLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9wc3ljaG8uYwppbmRleCBmZGE1ZGIyLi4yNTNkNDBlIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9wc3ljaG8uYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9wc3ljaG8uYwpAQCAtMSw3ICsxLDYgQEAKLS8qICRJZDogcGNpX3BzeWNoby5jLHYgMS4zMyAyMDAyLzAyLzAxIDAwOjU4OjMzIGRhdmVtIEV4cCAkCi0gKiBwY2lfcHN5Y2hvLmM6IFBTWUNITy9VMlAgc3BlY2lmaWMgUENJIGNvbnRyb2xsZXIgc3VwcG9ydC4KKy8qIHBjaV9wc3ljaG8uYzogUFNZQ0hPL1UyUCBzcGVjaWZpYyBQQ0kgY29udHJvbGxlciBzdXBwb3J0LgogICoKLSAqIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCwgMTk5OSBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQGNhaXBmcy5ydXRnZXJzLmVkdSkKKyAqIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCwgMTk5OSwgMjAwNyBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQGRhdmVtbG9mdC5uZXQpCiAgKiBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTkgRWRkaWUgQy4gRG9zdCAgIChlY2RAc2t5bmV0LmJlKQogICogQ29weXJpZ2h0IChDKSAxOTk5IEpha3ViIEplbGluZWsgICAoamFrdWJAcmVkaGF0LmNvbSkKICAqLwpAQCAtMTE5LDYgKzExOCwxMCBAQAogCXUxNiB0bXAxNjsKIAl1OCB0bXA4OwogCisJaWYgKGJ1c19kZXYgPT0gcGJtLT5wY2lfYnVzICYmIGRldmZuID09IDB4MDApCisJCXJldHVybiBwY2lfaG9zdF9icmlkZ2VfcmVhZF9wY2lfY2ZnKGJ1c19kZXYsIGRldmZuLCB3aGVyZSwKKwkJCQkJCSAgICBzaXplLCB2YWx1ZSk7CisKIAlzd2l0Y2ggKHNpemUpIHsKIAljYXNlIDE6CiAJCSp2YWx1ZSA9IDB4ZmY7CkBAIC0xNzIsNiArMTc1LDkgQEAKIAl1bnNpZ25lZCBjaGFyIGJ1cyA9IGJ1c19kZXYtPm51bWJlcjsKIAl1MzIgKmFkZHI7CiAKKwlpZiAoYnVzX2RldiA9PSBwYm0tPnBjaV9idXMgJiYgZGV2Zm4gPT0gMHgwMCkKKwkJcmV0dXJuIHBjaV9ob3N0X2JyaWRnZV93cml0ZV9wY2lfY2ZnKGJ1c19kZXYsIGRldmZuLCB3aGVyZSwKKwkJCQkJCSAgICAgc2l6ZSwgdmFsdWUpOwogCWFkZHIgPSBwc3ljaG9fcGNpX2NvbmZpZ19ta2FkZHIocGJtLCBidXMsIGRldmZuLCB3aGVyZSk7CiAJaWYgKCFhZGRyKQogCQlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOwpAQCAtMjYzLDcgKzI2OSw3IEBACiAJCQkJICAgc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtLAogCQkJCSAgIGludCBpc19wYm1fYSkKIHsKLQlzdHJ1Y3QgcGNpX3N0cmJ1ZiAqc3RyYnVmID0gJnBibS0+c3RjOworCXN0cnVjdCBzdHJidWYgKnN0cmJ1ZiA9ICZwYm0tPnN0YzsKIAl1bnNpZ25lZCBsb25nIHJlZ2Jhc2UgPSBwLT5wYm1fQS5jb250cm9sbGVyX3JlZ3M7CiAJdW5zaWduZWQgbG9uZyBlcnJfYmFzZSwgdGFnX2Jhc2UsIGxpbmVfYmFzZTsKIAl1NjQgY29udHJvbDsKQEAgLTQxMiw3ICs0MTgsNyBAQAogCQkJCSAgICAgdW5zaWduZWQgbG9uZyBhZmFyLAogCQkJCSAgICAgZW51bSBwc3ljaG9fZXJyb3JfdHlwZSB0eXBlKQogewotCXN0cnVjdCBwY2lfaW9tbXUgKmlvbW11ID0gcC0+cGJtX0EuaW9tbXU7CisJc3RydWN0IGlvbW11ICppb21tdSA9IHAtPnBibV9BLmlvbW11OwogCXVuc2lnbmVkIGxvbmcgaW9tbXVfdGFnWzE2XTsKIAl1bnNpZ25lZCBsb25nIGlvbW11X2RhdGFbMTZdOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC04OTUsNTkgKzkwMSw2IEBACiB9CiAKIC8qIFBTWUNITyBib290IHRpbWUgcHJvYmluZyBhbmQgaW5pdGlhbGl6YXRpb24uICovCi1zdGF0aWMgdm9pZCBwc3ljaG9fcmVzb3VyY2VfYWRqdXN0KHN0cnVjdCBwY2lfZGV2ICpwZGV2LAotCQkJCSAgIHN0cnVjdCByZXNvdXJjZSAqcmVzLAotCQkJCSAgIHN0cnVjdCByZXNvdXJjZSAqcm9vdCkKLXsKLQlyZXMtPnN0YXJ0ICs9IHJvb3QtPnN0YXJ0OwotCXJlcy0+ZW5kICs9IHJvb3QtPnN0YXJ0OwotfQotCi1zdGF0aWMgdm9pZCBwc3ljaG9fYmFzZV9hZGRyZXNzX3VwZGF0ZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IHJlc291cmNlKQotewotCXN0cnVjdCBwY2lkZXZfY29va2llICpwY3AgPSBwZGV2LT5zeXNkYXRhOwotCXN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSA9IHBjcC0+cGJtOwotCXN0cnVjdCByZXNvdXJjZSAqcmVzLCAqcm9vdDsKLQl1MzIgcmVnOwotCWludCB3aGVyZSwgc2l6ZSwgaXNfNjRiaXQ7Ci0KLQlyZXMgPSAmcGRldi0+cmVzb3VyY2VbcmVzb3VyY2VdOwotCWlmIChyZXNvdXJjZSA8IDYpIHsKLQkJd2hlcmUgPSBQQ0lfQkFTRV9BRERSRVNTXzAgKyAocmVzb3VyY2UgKiA0KTsKLQl9IGVsc2UgaWYgKHJlc291cmNlID09IFBDSV9ST01fUkVTT1VSQ0UpIHsKLQkJd2hlcmUgPSBwZGV2LT5yb21fYmFzZV9yZWc7Ci0JfSBlbHNlIHsKLQkJLyogU29tZWJvZHkgbWlnaHQgaGF2ZSBhc2tlZCBhbGxvY2F0aW9uIG9mIGEgbm9uLXN0YW5kYXJkIHJlc291cmNlICovCi0JCXJldHVybjsKLQl9Ci0KLQlpc182NGJpdCA9IDA7Ci0JaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKQotCQlyb290ID0gJnBibS0+aW9fc3BhY2U7Ci0JZWxzZSB7Ci0JCXJvb3QgPSAmcGJtLT5tZW1fc3BhY2U7Ci0JCWlmICgocmVzLT5mbGFncyAmIFBDSV9CQVNFX0FERFJFU1NfTUVNX1RZUEVfTUFTSykKLQkJICAgID09IFBDSV9CQVNFX0FERFJFU1NfTUVNX1RZUEVfNjQpCi0JCQlpc182NGJpdCA9IDE7Ci0JfQotCi0Jc2l6ZSA9IHJlcy0+ZW5kIC0gcmVzLT5zdGFydDsKLQlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgd2hlcmUsICZyZWcpOwotCXJlZyA9ICgocmVnICYgc2l6ZSkgfAotCSAgICAgICAoKCh1MzIpKHJlcy0+c3RhcnQgLSByb290LT5zdGFydCkpICYgfnNpemUpKTsKLQlpZiAocmVzb3VyY2UgPT0gUENJX1JPTV9SRVNPVVJDRSkgewotCQlyZWcgfD0gUENJX1JPTV9BRERSRVNTX0VOQUJMRTsKLQkJcmVzLT5mbGFncyB8PSBJT1JFU09VUkNFX1JPTV9FTkFCTEU7Ci0JfQotCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgd2hlcmUsIHJlZyk7Ci0KLQkvKiBUaGlzIGtub3dzIHRoYXQgdGhlIHVwcGVyIDMyLWJpdHMgb2YgdGhlIGFkZHJlc3MKLQkgKiBtdXN0IGJlIHplcm8uICBPdXIgUENJIGNvbW1vbiBsYXllciBlbmZvcmNlcyB0aGlzLgotCSAqLwotCWlmIChpc182NGJpdCkKLQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCB3aGVyZSArIDQsIDApOwotfQotCiBzdGF0aWMgdm9pZCBwYm1fY29uZmlnX2J1c21hc3RlcmluZyhzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0pCiB7CiAJdTggKmFkZHI7CkBAIC05NjgsMjggKzkyMSw3IEBACiBzdGF0aWMgdm9pZCBwYm1fc2Nhbl9idXMoc3RydWN0IHBjaV9jb250cm9sbGVyX2luZm8gKnAsCiAJCQkgc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtKQogewotCXN0cnVjdCBwY2lkZXZfY29va2llICpjb29raWUgPSBremFsbG9jKHNpemVvZigqY29va2llKSwgR0ZQX0tFUk5FTCk7Ci0KLQlpZiAoIWNvb2tpZSkgewotCQlwcm9tX3ByaW50ZigiUFNZQ0hPOiBDcml0aWNhbCBhbGxvY2F0aW9uIGZhaWx1cmUuXG4iKTsKLQkJcHJvbV9oYWx0KCk7Ci0JfQotCi0JLyogQWxsIHdlIGNhcmUgYWJvdXQgaXMgdGhlIFBCTS4gKi8KLQljb29raWUtPnBibSA9IHBibTsKLQotCXBibS0+cGNpX2J1cyA9IHBjaV9zY2FuX2J1cyhwYm0tPnBjaV9maXJzdF9idXNubywKLQkJCQkgICAgcC0+cGNpX29wcywKLQkJCQkgICAgcGJtKTsKLQlwY2lfZml4dXBfaG9zdF9icmlkZ2Vfc2VsZihwYm0tPnBjaV9idXMpOwotCXBibS0+cGNpX2J1cy0+c2VsZi0+c3lzZGF0YSA9IGNvb2tpZTsKLQotCXBjaV9maWxsX2luX3BibV9jb29raWVzKHBibS0+cGNpX2J1cywgcGJtLCBwYm0tPnByb21fbm9kZSk7Ci0JcGNpX3JlY29yZF9hc3NpZ25tZW50cyhwYm0sIHBibS0+cGNpX2J1cyk7Ci0JcGNpX2Fzc2lnbl91bmFzc2lnbmVkKHBibSwgcGJtLT5wY2lfYnVzKTsKLQlwY2lfZml4dXBfaXJxKHBibSwgcGJtLT5wY2lfYnVzKTsKLQlwY2lfZGV0ZXJtaW5lXzY2bWh6X2Rpc3Bvc2l0aW9uKHBibSwgcGJtLT5wY2lfYnVzKTsKLQlwY2lfc2V0dXBfYnVzbWFzdGVyaW5nKHBibSwgcGJtLT5wY2lfYnVzKTsKKwlwYm0tPnBjaV9idXMgPSBwY2lfc2Nhbl9vbmVfcGJtKHBibSk7CiB9CiAKIHN0YXRpYyB2b2lkIHBzeWNob19zY2FuX2J1cyhzdHJ1Y3QgcGNpX2NvbnRyb2xsZXJfaW5mbyAqcCkKQEAgLTEwMDksNyArOTQxLDcgQEAKIAogc3RhdGljIHZvaWQgcHN5Y2hvX2lvbW11X2luaXQoc3RydWN0IHBjaV9jb250cm9sbGVyX2luZm8gKnApCiB7Ci0Jc3RydWN0IHBjaV9pb21tdSAqaW9tbXUgPSBwLT5wYm1fQS5pb21tdTsKKwlzdHJ1Y3QgaW9tbXUgKmlvbW11ID0gcC0+cGJtX0EuaW9tbXU7CiAJdW5zaWduZWQgbG9uZyBpOwogCXU2NCBjb250cm9sOwogCkBAIC0xMDk0LDE5ICsxMDI2LDYgQEAKIAlwc3ljaG9fd3JpdGUocC0+cGJtX0EuY29udHJvbGxlcl9yZWdzICsgUFNZQ0hPX1BDSUJfRElBRywgdG1wKTsKIH0KIAotc3RhdGljIHZvaWQgcGJtX3JlZ2lzdGVyX3RvcGxldmVsX3Jlc291cmNlcyhzdHJ1Y3QgcGNpX2NvbnRyb2xsZXJfaW5mbyAqcCwKLQkJCQkJICAgIHN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSkKLXsKLQljaGFyICpuYW1lID0gcGJtLT5uYW1lOwotCi0JcGJtLT5pb19zcGFjZS5uYW1lID0gcGJtLT5tZW1fc3BhY2UubmFtZSA9IG5hbWU7Ci0KLQlyZXF1ZXN0X3Jlc291cmNlKCZpb3BvcnRfcmVzb3VyY2UsICZwYm0tPmlvX3NwYWNlKTsKLQlyZXF1ZXN0X3Jlc291cmNlKCZpb21lbV9yZXNvdXJjZSwgJnBibS0+bWVtX3NwYWNlKTsKLQlwY2lfcmVnaXN0ZXJfbGVnYWN5X3JlZ2lvbnMoJnBibS0+aW9fc3BhY2UsCi0JCQkJICAgICZwYm0tPm1lbV9zcGFjZSk7Ci19Ci0KIHN0YXRpYyB2b2lkIHBzeWNob19wYm1fc3RyYnVmX2luaXQoc3RydWN0IHBjaV9jb250cm9sbGVyX2luZm8gKnAsCiAJCQkJICAgc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtLAogCQkJCSAgIGludCBpc19wYm1fYSkKQEAgLTExNzIsMTkgKzEwOTEsMTEgQEAKIAl1bnNpZ25lZCBpbnQgKmJ1c3JhbmdlOwogCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKIAlzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm07Ci0JaW50IGxlbjsKIAotCWlmIChpc19wYm1fYSkgeworCWlmIChpc19wYm1fYSkKIAkJcGJtID0gJnAtPnBibV9BOwotCQlwYm0tPnBjaV9maXJzdF9zbG90ID0gMTsKLQkJcGJtLT5pb19zcGFjZS5zdGFydCA9IHBibS0+Y29udHJvbGxlcl9yZWdzICsgUFNZQ0hPX0lPU1BBQ0VfQTsKLQkJcGJtLT5tZW1fc3BhY2Uuc3RhcnQgPSBwYm0tPmNvbnRyb2xsZXJfcmVncyArIFBTWUNIT19NRU1TUEFDRV9BOwotCX0gZWxzZSB7CisJZWxzZQogCQlwYm0gPSAmcC0+cGJtX0I7Ci0JCXBibS0+cGNpX2ZpcnN0X3Nsb3QgPSAyOwotCQlwYm0tPmlvX3NwYWNlLnN0YXJ0ID0gcGJtLT5jb250cm9sbGVyX3JlZ3MgKyBQU1lDSE9fSU9TUEFDRV9COwotCQlwYm0tPm1lbV9zcGFjZS5zdGFydCA9IHBibS0+Y29udHJvbGxlcl9yZWdzICsgUFNZQ0hPX01FTVNQQUNFX0I7Ci0JfQogCiAJcGJtLT5jaGlwX3R5cGUgPSBQQk1fQ0hJUF9UWVBFX1BTWUNITzsKIAlwYm0tPmNoaXBfdmVyc2lvbiA9IDA7CkBAIC0xMTk2LDQxICsxMTA3LDE1IEBACiAJaWYgKHByb3ApCiAJCXBibS0+Y2hpcF9yZXZpc2lvbiA9ICooaW50ICopIHByb3AtPnZhbHVlOwogCi0JcGJtLT5pb19zcGFjZS5lbmQgPSBwYm0tPmlvX3NwYWNlLnN0YXJ0ICsgUFNZQ0hPX0lPU1BBQ0VfU0laRTsKLQlwYm0tPmlvX3NwYWNlLmZsYWdzID0gSU9SRVNPVVJDRV9JTzsKLQlwYm0tPm1lbV9zcGFjZS5lbmQgPSBwYm0tPm1lbV9zcGFjZS5zdGFydCArIFBTWUNIT19NRU1TUEFDRV9TSVpFOwotCXBibS0+bWVtX3NwYWNlLmZsYWdzID0gSU9SRVNPVVJDRV9NRU07Ci0KIAlwYm0tPnBhcmVudCA9IHA7CiAJcGJtLT5wcm9tX25vZGUgPSBkcDsKIAlwYm0tPm5hbWUgPSBkcC0+ZnVsbF9uYW1lOwogCi0JcGJtX3JlZ2lzdGVyX3RvcGxldmVsX3Jlc291cmNlcyhwLCBwYm0pOwotCiAJcHJpbnRrKCIlczogUFNZQ0hPIFBDSSBCdXMgTW9kdWxlIHZlclsleDoleF1cbiIsCiAJICAgICAgIHBibS0+bmFtZSwKIAkgICAgICAgcGJtLT5jaGlwX3ZlcnNpb24sIHBibS0+Y2hpcF9yZXZpc2lvbik7CiAKLQlwcm9wID0gb2ZfZmluZF9wcm9wZXJ0eShkcCwgInJhbmdlcyIsICZsZW4pOwotCWlmIChwcm9wKSB7Ci0JCXBibS0+cGJtX3JhbmdlcyA9IHByb3AtPnZhbHVlOwotCQlwYm0tPm51bV9wYm1fcmFuZ2VzID0KLQkJCShsZW4gLyBzaXplb2Yoc3RydWN0IGxpbnV4X3Byb21fcGNpX3JhbmdlcykpOwotCX0gZWxzZSB7Ci0JCXBibS0+bnVtX3BibV9yYW5nZXMgPSAwOwotCX0KLQotCXByb3AgPSBvZl9maW5kX3Byb3BlcnR5KGRwLCAiaW50ZXJydXB0LW1hcCIsICZsZW4pOwotCWlmIChwcm9wKSB7Ci0JCXBibS0+cGJtX2ludG1hcCA9IHByb3AtPnZhbHVlOwotCQlwYm0tPm51bV9wYm1faW50bWFwID0KLQkJCShsZW4gLyBzaXplb2Yoc3RydWN0IGxpbnV4X3Byb21fcGNpX2ludG1hcCkpOwotCi0JCXByb3AgPSBvZl9maW5kX3Byb3BlcnR5KGRwLCAiaW50ZXJydXB0LW1hcC1tYXNrIiwgTlVMTCk7Ci0JCXBibS0+cGJtX2ludG1hc2sgPSBwcm9wLT52YWx1ZTsKLQl9IGVsc2UgewotCQlwYm0tPm51bV9wYm1faW50bWFwID0gMDsKLQl9CisJcGNpX2RldGVybWluZV9tZW1faW9fc3BhY2UocGJtKTsKIAogCXByb3AgPSBvZl9maW5kX3Byb3BlcnR5KGRwLCAiYnVzLXJhbmdlIiwgTlVMTCk7CiAJYnVzcmFuZ2UgPSBwcm9wLT52YWx1ZTsKQEAgLTEyNDYsNyArMTEzMSw3IEBACiB7CiAJc3RydWN0IGxpbnV4X3Byb202NF9yZWdpc3RlcnMgKnByX3JlZ3M7CiAJc3RydWN0IHBjaV9jb250cm9sbGVyX2luZm8gKnA7Ci0Jc3RydWN0IHBjaV9pb21tdSAqaW9tbXU7CisJc3RydWN0IGlvbW11ICppb21tdTsKIAlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CiAJdTMyIHVwYV9wb3J0aWQ7CiAJaW50IGlzX3BibV9hOwpAQCAtMTI2OSw3ICsxMTU0LDcgQEAKIAkJcHJvbV9wcmludGYoIlBTWUNITzogRmF0YWwgbWVtb3J5IGFsbG9jYXRpb24gZXJyb3IuXG4iKTsKIAkJcHJvbV9oYWx0KCk7CiAJfQotCWlvbW11ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBjaV9pb21tdSksIEdGUF9BVE9NSUMpOworCWlvbW11ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGlvbW11KSwgR0ZQX0FUT01JQyk7CiAJaWYgKCFpb21tdSkgewogCQlwcm9tX3ByaW50ZigiUFNZQ0hPOiBGYXRhbCBtZW1vcnkgYWxsb2NhdGlvbiBlcnJvci5cbiIpOwogCQlwcm9tX2hhbHQoKTsKQEAgLTEyODIsMTAgKzExNjcsNyBAQAogCXAtPnBibV9BLnBvcnRpZCA9IHVwYV9wb3J0aWQ7CiAJcC0+cGJtX0IucG9ydGlkID0gdXBhX3BvcnRpZDsKIAlwLT5pbmRleCA9IHBjaV9udW1fY29udHJvbGxlcnMrKzsKLQlwLT5wYm1zX3NhbWVfZG9tYWluID0gMDsKIAlwLT5zY2FuX2J1cyA9IHBzeWNob19zY2FuX2J1czsKLQlwLT5iYXNlX2FkZHJlc3NfdXBkYXRlID0gcHN5Y2hvX2Jhc2VfYWRkcmVzc191cGRhdGU7Ci0JcC0+cmVzb3VyY2VfYWRqdXN0ID0gcHN5Y2hvX3Jlc291cmNlX2FkanVzdDsKIAlwLT5wY2lfb3BzID0gJnBzeWNob19vcHM7CiAKIAlwcm9wID0gb2ZfZmluZF9wcm9wZXJ0eShkcCwgInJlZyIsIE5VTEwpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2lfc2FicmUuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX3NhYnJlLmMKaW5kZXggOTRiYjY4MS4uMzk3ODYyZiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2lfc2FicmUuYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9zYWJyZS5jCkBAIC0xLDcgKzEsNiBAQAotLyogJElkOiBwY2lfc2FicmUuYyx2IDEuNDIgMjAwMi8wMS8yMyAxMToyNzozMiBkYXZlbSBFeHAgJAotICogcGNpX3NhYnJlLmM6IFNhYnJlIHNwZWNpZmljIFBDSSBjb250cm9sbGVyIHN1cHBvcnQuCisvKiBwY2lfc2FicmUuYzogU2FicmUgc3BlY2lmaWMgUENJIGNvbnRyb2xsZXIgc3VwcG9ydC4KICAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTgsIDE5OTkgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBjYWlwZnMucnV0Z2Vycy5lZHUpCisgKiBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTgsIDE5OTksIDIwMDcgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBkYXZlbWxvZnQubmV0KQogICogQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5IEVkZGllIEMuIERvc3QgICAoZWNkQHNreW5ldC5iZSkKICAqIENvcHlyaWdodCAoQykgMTk5OSBKYWt1YiBKZWxpbmVrICAgKGpha3ViQHJlZGhhdC5jb20pCiAgKi8KQEAgLTI1NCw5ICsyNTMsNiBAQAogCQlyZXR1cm4gMDsKIAogCXJldHVybiAoKHBibS0+cGFyZW50ID09IDApIHx8Ci0JCSgocGJtID09ICZwYm0tPnBhcmVudC0+cGJtX0IpICYmCi0JCSAoYnVzID09IHBibS0+cGNpX2ZpcnN0X2J1c25vKSAmJgotCQkgUENJX1NMT1QoZGV2Zm4pID4gOCkgfHwKIAkJKChwYm0gPT0gJnBibS0+cGFyZW50LT5wYm1fQSkgJiYKIAkJIChidXMgPT0gcGJtLT5wY2lfZmlyc3RfYnVzbm8pICYmCiAJCSBQQ0lfU0xPVChkZXZmbikgPiA4KSk7CkBAIC0zMjIsNiArMzE4LDEyIEBACiBzdGF0aWMgaW50IHNhYnJlX3JlYWRfcGNpX2NmZyhzdHJ1Y3QgcGNpX2J1cyAqYnVzLCB1bnNpZ25lZCBpbnQgZGV2Zm4sCiAJCQkgICAgICBpbnQgd2hlcmUsIGludCBzaXplLCB1MzIgKnZhbHVlKQogeworCXN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSA9IGJ1cy0+c3lzZGF0YTsKKworCWlmIChidXMgPT0gcGJtLT5wY2lfYnVzICYmIGRldmZuID09IDB4MDApCisJCXJldHVybiBwY2lfaG9zdF9icmlkZ2VfcmVhZF9wY2lfY2ZnKGJ1cywgZGV2Zm4sIHdoZXJlLAorCQkJCQkJICAgIHNpemUsIHZhbHVlKTsKKwogCWlmICghYnVzLT5udW1iZXIgJiYgc2FicmVfb3V0X29mX3JhbmdlKGRldmZuKSkgewogCQlzd2l0Y2ggKHNpemUpIHsKIAkJY2FzZSAxOgpAQCAtNDM4LDYgKzQ0MCwxMiBAQAogc3RhdGljIGludCBzYWJyZV93cml0ZV9wY2lfY2ZnKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbiwKIAkJCSAgICAgICBpbnQgd2hlcmUsIGludCBzaXplLCB1MzIgdmFsdWUpCiB7CisJc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtID0gYnVzLT5zeXNkYXRhOworCisJaWYgKGJ1cyA9PSBwYm0tPnBjaV9idXMgJiYgZGV2Zm4gPT0gMHgwMCkKKwkJcmV0dXJuIHBjaV9ob3N0X2JyaWRnZV93cml0ZV9wY2lfY2ZnKGJ1cywgZGV2Zm4sIHdoZXJlLAorCQkJCQkJICAgICBzaXplLCB2YWx1ZSk7CisKIAlpZiAoYnVzLT5udW1iZXIpCiAJCXJldHVybiBfX3NhYnJlX3dyaXRlX3BjaV9jZmcoYnVzLCBkZXZmbiwgd2hlcmUsIHNpemUsIHZhbHVlKTsKIApAQCAtNDkwLDcgKzQ5OCw3IEBACiAJCQkJICAgIHVuc2lnbmVkIGxvbmcgYWZzciwKIAkJCQkgICAgdW5zaWduZWQgbG9uZyBhZmFyKQogewotCXN0cnVjdCBwY2lfaW9tbXUgKmlvbW11ID0gcC0+cGJtX0EuaW9tbXU7CisJc3RydWN0IGlvbW11ICppb21tdSA9IHAtPnBibV9BLmlvbW11OwogCXVuc2lnbmVkIGxvbmcgaW9tbXVfdGFnWzE2XTsKIAl1bnNpZ25lZCBsb25nIGlvbW11X2RhdGFbMTZdOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC03MTAsOCArNzE4LDggQEAKIAkJCSAgICAgICBwLT5pbmRleCk7CiAJCXJldCA9IElSUV9IQU5ETEVEOwogCX0KLQlwY2lfcmVhZF9jb25maWdfd29yZChzYWJyZV9yb290X2J1cy0+c2VsZiwKLQkJCSAgICAgUENJX1NUQVRVUywgJnN0YXQpOworCXBjaV9idXNfcmVhZF9jb25maWdfd29yZChzYWJyZV9yb290X2J1cywgMCwKKwkJCQkgUENJX1NUQVRVUywgJnN0YXQpOwogCWlmIChzdGF0ICYgKFBDSV9TVEFUVVNfUEFSSVRZIHwKIAkJICAgIFBDSV9TVEFUVVNfU0lHX1RBUkdFVF9BQk9SVCB8CiAJCSAgICBQQ0lfU1RBVFVTX1JFQ19UQVJHRVRfQUJPUlQgfApAQCAtNzE5LDggKzcyNyw4IEBACiAJCSAgICBQQ0lfU1RBVFVTX1NJR19TWVNURU1fRVJST1IpKSB7CiAJCXByaW50aygiU0FCUkUlZDogUENJIGJ1cyBlcnJvciwgUENJX1NUQVRVU1slMDR4XVxuIiwKIAkJICAgICAgIHAtPmluZGV4LCBzdGF0KTsKLQkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHNhYnJlX3Jvb3RfYnVzLT5zZWxmLAotCQkJCSAgICAgIFBDSV9TVEFUVVMsIDB4ZmZmZik7CisJCXBjaV9idXNfd3JpdGVfY29uZmlnX3dvcmQoc2FicmVfcm9vdF9idXMsIDAsCisJCQkJCSAgUENJX1NUQVRVUywgMHhmZmZmKTsKIAkJcmV0ID0gSVJRX0hBTkRMRUQ7CiAJfQogCXJldHVybiByZXQ7CkBAIC04MDAsMTIgKzgwOCwxMCBAQAogCWlmIChlcnJvcl9iaXRzICYgKFNBQlJFX1BJT0FGU1JfUFRBIHwgU0FCUkVfUElPQUZTUl9TVEEpKSB7CiAJCXNhYnJlX2NoZWNrX2lvbW11X2Vycm9yKHAsIGFmc3IsIGFmYXIpOwogCQlwY2lfc2Nhbl9mb3JfdGFyZ2V0X2Fib3J0KHAsICZwLT5wYm1fQSwgcC0+cGJtX0EucGNpX2J1cyk7Ci0JCXBjaV9zY2FuX2Zvcl90YXJnZXRfYWJvcnQocCwgJnAtPnBibV9CLCBwLT5wYm1fQi5wY2lfYnVzKTsKIAl9Ci0JaWYgKGVycm9yX2JpdHMgJiAoU0FCUkVfUElPQUZTUl9QTUEgfCBTQUJSRV9QSU9BRlNSX1NNQSkpIHsKKwlpZiAoZXJyb3JfYml0cyAmIChTQUJSRV9QSU9BRlNSX1BNQSB8IFNBQlJFX1BJT0FGU1JfU01BKSkKIAkJcGNpX3NjYW5fZm9yX21hc3Rlcl9hYm9ydChwLCAmcC0+cGJtX0EsIHAtPnBibV9BLnBjaV9idXMpOwotCQlwY2lfc2Nhbl9mb3JfbWFzdGVyX2Fib3J0KHAsICZwLT5wYm1fQiwgcC0+cGJtX0IucGNpX2J1cyk7Ci0JfQorCiAJLyogRm9yIGV4Y2Vzc2l2ZSByZXRyaWVzLCBTQUJSRS9QQk0gd2lsbCBhYm9ydCB0aGUgZGV2aWNlCiAJICogYW5kIHRoZXJlIGlzIG5vIHdheSB0byBzcGVjaWZpY2FsbHkgY2hlY2sgZm9yIGV4Y2Vzc2l2ZQogCSAqIHJldHJpZXMgaW4gdGhlIGNvbmZpZyBzcGFjZSBzdGF0dXMgcmVnaXN0ZXJzLiAgU28gd2hhdApAQCAtODEzLDEwICs4MTksOCBAQAogCSAqIGFib3J0IGV2ZW50cy4KIAkgKi8KIAotCWlmIChlcnJvcl9iaXRzICYgKFNBQlJFX1BJT0FGU1JfUFBFUlIgfCBTQUJSRV9QSU9BRlNSX1NQRVJSKSkgeworCWlmIChlcnJvcl9iaXRzICYgKFNBQlJFX1BJT0FGU1JfUFBFUlIgfCBTQUJSRV9QSU9BRlNSX1NQRVJSKSkKIAkJcGNpX3NjYW5fZm9yX3Bhcml0eV9lcnJvcihwLCAmcC0+cGJtX0EsIHAtPnBibV9BLnBjaV9idXMpOwotCQlwY2lfc2Nhbl9mb3JfcGFyaXR5X2Vycm9yKHAsICZwLT5wYm1fQiwgcC0+cGJtX0IucGNpX2J1cyk7Ci0JfQogCiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQpAQCAtODY5LDE0NCArODczLDUyIEBACiAJc2FicmVfd3JpdGUoYmFzZSArIFNBQlJFX1BDSUNUUkwsIHRtcCk7CiB9CiAKLXN0YXRpYyB2b2lkIHNhYnJlX3Jlc291cmNlX2FkanVzdChzdHJ1Y3QgcGNpX2RldiAqcGRldiwKLQkJCQkgIHN0cnVjdCByZXNvdXJjZSAqcmVzLAotCQkJCSAgc3RydWN0IHJlc291cmNlICpyb290KQotewotCXN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSA9IHBkZXYtPmJ1cy0+c3lzZGF0YTsKLQl1bnNpZ25lZCBsb25nIGJhc2U7Ci0KLQlpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8pCi0JCWJhc2UgPSBwYm0tPmNvbnRyb2xsZXJfcmVncyArIFNBQlJFX0lPU1BBQ0U7Ci0JZWxzZQotCQliYXNlID0gcGJtLT5jb250cm9sbGVyX3JlZ3MgKyBTQUJSRV9NRU1TUEFDRTsKLQotCXJlcy0+c3RhcnQgKz0gYmFzZTsKLQlyZXMtPmVuZCArPSBiYXNlOwotfQotCi1zdGF0aWMgdm9pZCBzYWJyZV9iYXNlX2FkZHJlc3NfdXBkYXRlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgcmVzb3VyY2UpCi17Ci0Jc3RydWN0IHBjaWRldl9jb29raWUgKnBjcCA9IHBkZXYtPnN5c2RhdGE7Ci0Jc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtID0gcGNwLT5wYm07Ci0Jc3RydWN0IHJlc291cmNlICpyZXM7Ci0JdW5zaWduZWQgbG9uZyBiYXNlOwotCXUzMiByZWc7Ci0JaW50IHdoZXJlLCBzaXplLCBpc182NGJpdDsKLQotCXJlcyA9ICZwZGV2LT5yZXNvdXJjZVtyZXNvdXJjZV07Ci0JaWYgKHJlc291cmNlIDwgNikgewotCQl3aGVyZSA9IFBDSV9CQVNFX0FERFJFU1NfMCArIChyZXNvdXJjZSAqIDQpOwotCX0gZWxzZSBpZiAocmVzb3VyY2UgPT0gUENJX1JPTV9SRVNPVVJDRSkgewotCQl3aGVyZSA9IHBkZXYtPnJvbV9iYXNlX3JlZzsKLQl9IGVsc2UgewotCQkvKiBTb21lYm9keSBtaWdodCBoYXZlIGFza2VkIGFsbG9jYXRpb24gb2YgYSBub24tc3RhbmRhcmQgcmVzb3VyY2UgKi8KLQkJcmV0dXJuOwotCX0KLQotCWlzXzY0Yml0ID0gMDsKLQlpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8pCi0JCWJhc2UgPSBwYm0tPmNvbnRyb2xsZXJfcmVncyArIFNBQlJFX0lPU1BBQ0U7Ci0JZWxzZSB7Ci0JCWJhc2UgPSBwYm0tPmNvbnRyb2xsZXJfcmVncyArIFNBQlJFX01FTVNQQUNFOwotCQlpZiAoKHJlcy0+ZmxhZ3MgJiBQQ0lfQkFTRV9BRERSRVNTX01FTV9UWVBFX01BU0spCi0JCSAgICA9PSBQQ0lfQkFTRV9BRERSRVNTX01FTV9UWVBFXzY0KQotCQkJaXNfNjRiaXQgPSAxOwotCX0KLQotCXNpemUgPSByZXMtPmVuZCAtIHJlcy0+c3RhcnQ7Ci0JcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIHdoZXJlLCAmcmVnKTsKLQlyZWcgPSAoKHJlZyAmIHNpemUpIHwKLQkgICAgICAgKCgodTMyKShyZXMtPnN0YXJ0IC0gYmFzZSkpICYgfnNpemUpKTsKLQlpZiAocmVzb3VyY2UgPT0gUENJX1JPTV9SRVNPVVJDRSkgewotCQlyZWcgfD0gUENJX1JPTV9BRERSRVNTX0VOQUJMRTsKLQkJcmVzLT5mbGFncyB8PSBJT1JFU09VUkNFX1JPTV9FTkFCTEU7Ci0JfQotCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgd2hlcmUsIHJlZyk7Ci0KLQkvKiBUaGlzIGtub3dzIHRoYXQgdGhlIHVwcGVyIDMyLWJpdHMgb2YgdGhlIGFkZHJlc3MKLQkgKiBtdXN0IGJlIHplcm8uICBPdXIgUENJIGNvbW1vbiBsYXllciBlbmZvcmNlcyB0aGlzLgotCSAqLwotCWlmIChpc182NGJpdCkKLQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCB3aGVyZSArIDQsIDApOwotfQotCiBzdGF0aWMgdm9pZCBhcGJfaW5pdChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXJfaW5mbyAqcCwgc3RydWN0IHBjaV9idXMgKnNhYnJlX2J1cykKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkocGRldiwgJnNhYnJlX2J1cy0+ZGV2aWNlcywgYnVzX2xpc3QpIHsKLQogCQlpZiAocGRldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfU1VOICYmCiAJCSAgICBwZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9TVU5fU0lNQkEpIHsKLQkJCXUzMiB3b3JkMzI7CiAJCQl1MTYgd29yZDE2OwogCi0JCQlzYWJyZV9yZWFkX3BjaV9jZmcocGRldi0+YnVzLCBwZGV2LT5kZXZmbiwKLQkJCQkJICAgUENJX0NPTU1BTkQsIDIsICZ3b3JkMzIpOwotCQkJd29yZDE2ID0gKHUxNikgd29yZDMyOworCQkJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgUENJX0NPTU1BTkQsICZ3b3JkMTYpOwogCQkJd29yZDE2IHw9IFBDSV9DT01NQU5EX1NFUlIgfCBQQ0lfQ09NTUFORF9QQVJJVFkgfAogCQkJCVBDSV9DT01NQU5EX01BU1RFUiB8IFBDSV9DT01NQU5EX01FTU9SWSB8CiAJCQkJUENJX0NPTU1BTkRfSU87Ci0JCQl3b3JkMzIgPSAodTMyKSB3b3JkMTY7Ci0JCQlzYWJyZV93cml0ZV9wY2lfY2ZnKHBkZXYtPmJ1cywgcGRldi0+ZGV2Zm4sCi0JCQkJCSAgICBQQ0lfQ09NTUFORCwgMiwgd29yZDMyKTsKKwkJCXBjaV93cml0ZV9jb25maWdfd29yZChwZGV2LCBQQ0lfQ09NTUFORCwgd29yZDE2KTsKIAogCQkJLyogU3RhdHVzIHJlZ2lzdGVyIGJpdHMgYXJlICJ3cml0ZSAxIHRvIGNsZWFyIi4gKi8KLQkJCXNhYnJlX3dyaXRlX3BjaV9jZmcocGRldi0+YnVzLCBwZGV2LT5kZXZmbiwKLQkJCQkJICAgIFBDSV9TVEFUVVMsIDIsIDB4ZmZmZik7Ci0JCQlzYWJyZV93cml0ZV9wY2lfY2ZnKHBkZXYtPmJ1cywgcGRldi0+ZGV2Zm4sCi0JCQkJCSAgICBQQ0lfU0VDX1NUQVRVUywgMiwgMHhmZmZmKTsKKwkJCXBjaV93cml0ZV9jb25maWdfd29yZChwZGV2LCBQQ0lfU1RBVFVTLCAweGZmZmYpOworCQkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9TRUNfU1RBVFVTLCAweGZmZmYpOwogCiAJCQkvKiBVc2UgYSBwcmltYXJ5L3NlY29uZGF5IGxhdGVuY3kgdGltZXIgdmFsdWUKIAkJCSAqIG9mIDY0LgogCQkJICovCi0JCQlzYWJyZV93cml0ZV9wY2lfY2ZnKHBkZXYtPmJ1cywgcGRldi0+ZGV2Zm4sCi0JCQkJCSAgICBQQ0lfTEFURU5DWV9USU1FUiwgMSwgNjQpOwotCQkJc2FicmVfd3JpdGVfcGNpX2NmZyhwZGV2LT5idXMsIHBkZXYtPmRldmZuLAotCQkJCQkgICAgUENJX1NFQ19MQVRFTkNZX1RJTUVSLCAxLCA2NCk7CisJCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgUENJX0xBVEVOQ1lfVElNRVIsIDY0KTsKKwkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBQQ0lfU0VDX0xBVEVOQ1lfVElNRVIsIDY0KTsKIAogCQkJLyogRW5hYmxlIHJlcG9ydGluZy9mb3J3YXJkaW5nIG9mIG1hc3RlciBhYm9ydHMsCiAJCQkgKiBwYXJpdHksIGFuZCBTRVJSLgogCQkJICovCi0JCQlzYWJyZV93cml0ZV9wY2lfY2ZnKHBkZXYtPmJ1cywgcGRldi0+ZGV2Zm4sCi0JCQkJCSAgICBQQ0lfQlJJREdFX0NPTlRST0wsIDEsCi0JCQkJCSAgICAoUENJX0JSSURHRV9DVExfUEFSSVRZIHwKLQkJCQkJICAgICBQQ0lfQlJJREdFX0NUTF9TRVJSIHwKLQkJCQkJICAgICBQQ0lfQlJJREdFX0NUTF9NQVNURVJfQUJPUlQpKTsKKwkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBQQ0lfQlJJREdFX0NPTlRST0wsCisJCQkJCSAgICAgIChQQ0lfQlJJREdFX0NUTF9QQVJJVFkgfAorCQkJCQkgICAgICAgUENJX0JSSURHRV9DVExfU0VSUiB8CisJCQkJCSAgICAgICBQQ0lfQlJJREdFX0NUTF9NQVNURVJfQUJPUlQpKTsKIAkJfQogCX0KIH0KIAotc3RhdGljIHN0cnVjdCBwY2lkZXZfY29va2llICphbGxvY19icmlkZ2VfY29va2llKHN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSkKLXsKLQlzdHJ1Y3QgcGNpZGV2X2Nvb2tpZSAqY29va2llID0ga3phbGxvYyhzaXplb2YoKmNvb2tpZSksIEdGUF9LRVJORUwpOwotCi0JaWYgKCFjb29raWUpIHsKLQkJcHJvbV9wcmludGYoIlNBQlJFOiBDcml0aWNhbCBhbGxvY2F0aW9uIGZhaWx1cmUuXG4iKTsKLQkJcHJvbV9oYWx0KCk7Ci0JfQotCi0JLyogQWxsIHdlIGNhcmUgYWJvdXQgaXMgdGhlIFBCTS4gKi8KLQljb29raWUtPnBibSA9IHBibTsKLQotCXJldHVybiBjb29raWU7Ci19Ci0KIHN0YXRpYyB2b2lkIHNhYnJlX3NjYW5fYnVzKHN0cnVjdCBwY2lfY29udHJvbGxlcl9pbmZvICpwKQogewogCXN0YXRpYyBpbnQgb25jZTsKLQlzdHJ1Y3QgcGNpX2J1cyAqc2FicmVfYnVzLCAqcGJ1czsKLQlzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm07Ci0Jc3RydWN0IHBjaWRldl9jb29raWUgKmNvb2tpZTsKLQlpbnQgc2FicmVzX3NjYW5uZWQ7CisJc3RydWN0IHBjaV9idXMgKnBidXM7CiAKIAkvKiBUaGUgQVBCIGJyaWRnZSBzcGVha3MgdG8gdGhlIFNhYnJlIGhvc3QgUENJIGJyaWRnZQogCSAqIGF0IDY2TWh6LCBidXQgdGhlIGZyb250IHNpZGUgb2YgQVBCIHJ1bnMgYXQgMzNNaHoKIAkgKiBmb3IgYm90aCBzZWdtZW50cy4KIAkgKi8KIAlwLT5wYm1fQS5pc182Nm1oel9jYXBhYmxlID0gMDsKLQlwLT5wYm1fQi5pc182Nm1oel9jYXBhYmxlID0gMDsKIAogCS8qIFRoaXMgZHJpdmVyIGhhcyBub3QgYmVlbiB2ZXJpZmllZCB0byBoYW5kbGUKIAkgKiBtdWx0aXBsZSBTQUJSRXMgeWV0LCBzbyB0cmFwIHRoaXMuCkBAIC0xMDIwLDU2ICs5MzIsMTMgQEAKIAl9CiAJb25jZSsrOwogCi0JY29va2llID0gYWxsb2NfYnJpZGdlX2Nvb2tpZSgmcC0+cGJtX0EpOworCXBidXMgPSBwY2lfc2Nhbl9vbmVfcGJtKCZwLT5wYm1fQSk7CisJaWYgKCFwYnVzKQorCQlyZXR1cm47CiAKLQlzYWJyZV9idXMgPSBwY2lfc2Nhbl9idXMocC0+cGNpX2ZpcnN0X2J1c25vLAotCQkJCSBwLT5wY2lfb3BzLAotCQkJCSAmcC0+cGJtX0EpOwotCXBjaV9maXh1cF9ob3N0X2JyaWRnZV9zZWxmKHNhYnJlX2J1cyk7Ci0Jc2FicmVfYnVzLT5zZWxmLT5zeXNkYXRhID0gY29va2llOworCXNhYnJlX3Jvb3RfYnVzID0gcGJ1czsKIAotCXNhYnJlX3Jvb3RfYnVzID0gc2FicmVfYnVzOwotCi0JYXBiX2luaXQocCwgc2FicmVfYnVzKTsKLQotCXNhYnJlc19zY2FubmVkID0gMDsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkocGJ1cywgJnNhYnJlX2J1cy0+Y2hpbGRyZW4sIG5vZGUpIHsKLQotCQlpZiAocGJ1cy0+bnVtYmVyID09IHAtPnBibV9BLnBjaV9maXJzdF9idXNubykgewotCQkJcGJtID0gJnAtPnBibV9BOwotCQl9IGVsc2UgaWYgKHBidXMtPm51bWJlciA9PSBwLT5wYm1fQi5wY2lfZmlyc3RfYnVzbm8pIHsKLQkJCXBibSA9ICZwLT5wYm1fQjsKLQkJfSBlbHNlCi0JCQljb250aW51ZTsKLQotCQljb29raWUgPSBhbGxvY19icmlkZ2VfY29va2llKHBibSk7Ci0JCXBidXMtPnNlbGYtPnN5c2RhdGEgPSBjb29raWU7Ci0KLQkJc2FicmVzX3NjYW5uZWQrKzsKLQotCQlwYnVzLT5zeXNkYXRhID0gcGJtOwotCQlwYm0tPnBjaV9idXMgPSBwYnVzOwotCQlwY2lfZmlsbF9pbl9wYm1fY29va2llcyhwYnVzLCBwYm0sIHBibS0+cHJvbV9ub2RlKTsKLQkJcGNpX3JlY29yZF9hc3NpZ25tZW50cyhwYm0sIHBidXMpOwotCQlwY2lfYXNzaWduX3VuYXNzaWduZWQocGJtLCBwYnVzKTsKLQkJcGNpX2ZpeHVwX2lycShwYm0sIHBidXMpOwotCQlwY2lfZGV0ZXJtaW5lXzY2bWh6X2Rpc3Bvc2l0aW9uKHBibSwgcGJ1cyk7Ci0JCXBjaV9zZXR1cF9idXNtYXN0ZXJpbmcocGJtLCBwYnVzKTsKLQl9Ci0KLQlpZiAoIXNhYnJlc19zY2FubmVkKSB7Ci0JCS8qIEh1bW1pbmdiaXJkLCBubyBBUEJzLiAqLwotCQlwYm0gPSAmcC0+cGJtX0E7Ci0JCXNhYnJlX2J1cy0+c3lzZGF0YSA9IHBibTsKLQkJcGJtLT5wY2lfYnVzID0gc2FicmVfYnVzOwotCQlwY2lfZmlsbF9pbl9wYm1fY29va2llcyhzYWJyZV9idXMsIHBibSwgcGJtLT5wcm9tX25vZGUpOwotCQlwY2lfcmVjb3JkX2Fzc2lnbm1lbnRzKHBibSwgc2FicmVfYnVzKTsKLQkJcGNpX2Fzc2lnbl91bmFzc2lnbmVkKHBibSwgc2FicmVfYnVzKTsKLQkJcGNpX2ZpeHVwX2lycShwYm0sIHNhYnJlX2J1cyk7Ci0JCXBjaV9kZXRlcm1pbmVfNjZtaHpfZGlzcG9zaXRpb24ocGJtLCBzYWJyZV9idXMpOwotCQlwY2lfc2V0dXBfYnVzbWFzdGVyaW5nKHBibSwgc2FicmVfYnVzKTsKLQl9CisJYXBiX2luaXQocCwgcGJ1cyk7CiAKIAlzYWJyZV9yZWdpc3Rlcl9lcnJvcl9oYW5kbGVycyhwKTsKIH0KQEAgLTEwNzgsNyArOTQ3LDcgQEAKIAkJCSAgICAgaW50IHRzYnNpemUsIHVuc2lnbmVkIGxvbmcgZHZtYV9vZmZzZXQsCiAJCQkgICAgIHUzMiBkbWFfbWFzaykKIHsKLQlzdHJ1Y3QgcGNpX2lvbW11ICppb21tdSA9IHAtPnBibV9BLmlvbW11OworCXN0cnVjdCBpb21tdSAqaW9tbXUgPSBwLT5wYm1fQS5pb21tdTsKIAl1bnNpZ25lZCBsb25nIGk7CiAJdTY0IGNvbnRyb2w7CiAKQEAgLTExMjYsMjI0ICs5OTUsMzEgQEAKIAlzYWJyZV93cml0ZShwLT5wYm1fQS5jb250cm9sbGVyX3JlZ3MgKyBTQUJSRV9JT01NVV9DT05UUk9MLCBjb250cm9sKTsKIH0KIAotc3RhdGljIHZvaWQgcGJtX3JlZ2lzdGVyX3RvcGxldmVsX3Jlc291cmNlcyhzdHJ1Y3QgcGNpX2NvbnRyb2xsZXJfaW5mbyAqcCwKLQkJCQkJICAgIHN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSkKLXsKLQljaGFyICpuYW1lID0gcGJtLT5uYW1lOwotCXVuc2lnbmVkIGxvbmcgaWJhc2UgPSBwLT5wYm1fQS5jb250cm9sbGVyX3JlZ3MgKyBTQUJSRV9JT1NQQUNFOwotCXVuc2lnbmVkIGxvbmcgbWJhc2UgPSBwLT5wYm1fQS5jb250cm9sbGVyX3JlZ3MgKyBTQUJSRV9NRU1TUEFDRTsKLQl1bnNpZ25lZCBpbnQgZGV2Zm47Ci0JdW5zaWduZWQgbG9uZyBmaXJzdCwgbGFzdCwgaTsKLQl1OCAqYWRkciwgbWFwOwotCi0Jc3ByaW50ZihuYW1lLCAiU0FCUkUlZCBQQk0lYyIsCi0JCXAtPmluZGV4LAotCQkocGJtID09ICZwLT5wYm1fQSA/ICdBJyA6ICdCJykpOwotCXBibS0+aW9fc3BhY2UubmFtZSA9IHBibS0+bWVtX3NwYWNlLm5hbWUgPSBuYW1lOwotCi0JZGV2Zm4gPSBQQ0lfREVWRk4oMSwgKHBibSA9PSAmcC0+cGJtX0EpID8gMCA6IDEpOwotCWFkZHIgPSBzYWJyZV9wY2lfY29uZmlnX21rYWRkcihwYm0sIDAsIGRldmZuLCBBUEJfSU9fQUREUkVTU19NQVApOwotCW1hcCA9IDA7Ci0JcGNpX2NvbmZpZ19yZWFkOChhZGRyLCAmbWFwKTsKLQotCWZpcnN0ID0gODsKLQlsYXN0ID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JCWlmICgobWFwICYgKDEgPDwgaSkpICE9IDApIHsKLQkJCWlmIChmaXJzdCA+IGkpCi0JCQkJZmlyc3QgPSBpOwotCQkJaWYgKGxhc3QgPCBpKQotCQkJCWxhc3QgPSBpOwotCQl9Ci0JfQotCXBibS0+aW9fc3BhY2Uuc3RhcnQgPSBpYmFzZSArIChmaXJzdCA8PCAyMVVMKTsKLQlwYm0tPmlvX3NwYWNlLmVuZCAgID0gaWJhc2UgKyAobGFzdCA8PCAyMVVMKSArICgoMSA8PCAyMVVMKSAtIDEpOwotCXBibS0+aW9fc3BhY2UuZmxhZ3MgPSBJT1JFU09VUkNFX0lPOwotCi0JYWRkciA9IHNhYnJlX3BjaV9jb25maWdfbWthZGRyKHBibSwgMCwgZGV2Zm4sIEFQQl9NRU1fQUREUkVTU19NQVApOwotCW1hcCA9IDA7Ci0JcGNpX2NvbmZpZ19yZWFkOChhZGRyLCAmbWFwKTsKLQotCWZpcnN0ID0gODsKLQlsYXN0ID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JCWlmICgobWFwICYgKDEgPDwgaSkpICE9IDApIHsKLQkJCWlmIChmaXJzdCA+IGkpCi0JCQkJZmlyc3QgPSBpOwotCQkJaWYgKGxhc3QgPCBpKQotCQkJCWxhc3QgPSBpOwotCQl9Ci0JfQotCXBibS0+bWVtX3NwYWNlLnN0YXJ0ID0gbWJhc2UgKyAoZmlyc3QgPDwgMjlVTCk7Ci0JcGJtLT5tZW1fc3BhY2UuZW5kICAgPSBtYmFzZSArIChsYXN0IDw8IDI5VUwpICsgKCgxIDw8IDI5VUwpIC0gMSk7Ci0JcGJtLT5tZW1fc3BhY2UuZmxhZ3MgPSBJT1JFU09VUkNFX01FTTsKLQotCWlmIChyZXF1ZXN0X3Jlc291cmNlKCZpb3BvcnRfcmVzb3VyY2UsICZwYm0tPmlvX3NwYWNlKSA8IDApIHsKLQkJcHJvbV9wcmludGYoIkNhbm5vdCByZWdpc3RlciBQQk0tJWMncyBJTyBzcGFjZS5cbiIsCi0JCQkgICAgKHBibSA9PSAmcC0+cGJtX0EgPyAnQScgOiAnQicpKTsKLQkJcHJvbV9oYWx0KCk7Ci0JfQotCWlmIChyZXF1ZXN0X3Jlc291cmNlKCZpb21lbV9yZXNvdXJjZSwgJnBibS0+bWVtX3NwYWNlKSA8IDApIHsKLQkJcHJvbV9wcmludGYoIkNhbm5vdCByZWdpc3RlciBQQk0tJWMncyBNRU0gc3BhY2UuXG4iLAotCQkJICAgIChwYm0gPT0gJnAtPnBibV9BID8gJ0EnIDogJ0InKSk7Ci0JCXByb21faGFsdCgpOwotCX0KLQotCS8qIFJlZ2lzdGVyIGxlZ2FjeSByZWdpb25zIGlmIHRoaXMgUEJNIGNvdmVycyB0aGF0IGFyZWEuICovCi0JaWYgKHBibS0+aW9fc3BhY2Uuc3RhcnQgPT0gaWJhc2UgJiYKLQkgICAgcGJtLT5tZW1fc3BhY2Uuc3RhcnQgPT0gbWJhc2UpCi0JCXBjaV9yZWdpc3Rlcl9sZWdhY3lfcmVnaW9ucygmcGJtLT5pb19zcGFjZSwKLQkJCQkJICAgICZwYm0tPm1lbV9zcGFjZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHNhYnJlX3BibV9pbml0KHN0cnVjdCBwY2lfY29udHJvbGxlcl9pbmZvICpwLCBzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwLCB1MzIgZG1hX3N0YXJ0LCB1MzIgZG1hX2VuZCkKK3N0YXRpYyB2b2lkIHNhYnJlX3BibV9pbml0KHN0cnVjdCBwY2lfY29udHJvbGxlcl9pbmZvICpwLCBzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwKQogewogCXN0cnVjdCBwY2lfcGJtX2luZm8gKnBibTsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGU7Ci0Jc3RydWN0IHByb3BlcnR5ICpwcm9wOwotCXUzMiAqYnVzcmFuZ2U7Ci0JaW50IGxlbiwgc2ltYmFzX2ZvdW5kOwogCi0Jc2ltYmFzX2ZvdW5kID0gMDsKLQlub2RlID0gZHAtPmNoaWxkOwotCXdoaWxlIChub2RlICE9IE5VTEwpIHsKLQkJaWYgKHN0cmNtcChub2RlLT5uYW1lLCAicGNpIikpCi0JCQlnb3RvIG5leHRfcGNpOworCXBibSA9ICZwLT5wYm1fQTsKKwlwYm0tPm5hbWUgPSBkcC0+ZnVsbF9uYW1lOworCXByaW50aygiJXM6IFNBQlJFIFBDSSBCdXMgTW9kdWxlXG4iLCBwYm0tPm5hbWUpOwogCi0JCXByb3AgPSBvZl9maW5kX3Byb3BlcnR5KG5vZGUsICJtb2RlbCIsIE5VTEwpOwotCQlpZiAoIXByb3AgfHwgc3RybmNtcChwcm9wLT52YWx1ZSwgIlNVTlcsc2ltYmEiLCBwcm9wLT5sZW5ndGgpKQotCQkJZ290byBuZXh0X3BjaTsKKwlwYm0tPmNoaXBfdHlwZSA9IFBCTV9DSElQX1RZUEVfU0FCUkU7CisJcGJtLT5wYXJlbnQgPSBwOworCXBibS0+cHJvbV9ub2RlID0gZHA7CisJcGJtLT5wY2lfZmlyc3RfYnVzbm8gPSBwLT5wY2lfZmlyc3RfYnVzbm87CisJcGJtLT5wY2lfbGFzdF9idXNubyA9IHAtPnBjaV9sYXN0X2J1c25vOwogCi0JCXNpbWJhc19mb3VuZCsrOwotCi0JCXByb3AgPSBvZl9maW5kX3Byb3BlcnR5KG5vZGUsICJidXMtcmFuZ2UiLCBOVUxMKTsKLQkJYnVzcmFuZ2UgPSBwcm9wLT52YWx1ZTsKLQkJaWYgKGJ1c3JhbmdlWzBdID09IDEpCi0JCQlwYm0gPSAmcC0+cGJtX0I7Ci0JCWVsc2UKLQkJCXBibSA9ICZwLT5wYm1fQTsKLQotCQlwYm0tPm5hbWUgPSBub2RlLT5mdWxsX25hbWU7Ci0JCXByaW50aygiJXM6IFNBQlJFIFBDSSBCdXMgTW9kdWxlXG4iLCBwYm0tPm5hbWUpOwotCi0JCXBibS0+Y2hpcF90eXBlID0gUEJNX0NISVBfVFlQRV9TQUJSRTsKLQkJcGJtLT5wYXJlbnQgPSBwOwotCQlwYm0tPnByb21fbm9kZSA9IG5vZGU7Ci0JCXBibS0+cGNpX2ZpcnN0X3Nsb3QgPSAxOwotCQlwYm0tPnBjaV9maXJzdF9idXNubyA9IGJ1c3JhbmdlWzBdOwotCQlwYm0tPnBjaV9sYXN0X2J1c25vID0gYnVzcmFuZ2VbMV07Ci0KLQkJcHJvcCA9IG9mX2ZpbmRfcHJvcGVydHkobm9kZSwgInJhbmdlcyIsICZsZW4pOwotCQlpZiAocHJvcCkgewotCQkJcGJtLT5wYm1fcmFuZ2VzID0gcHJvcC0+dmFsdWU7Ci0JCQlwYm0tPm51bV9wYm1fcmFuZ2VzID0KLQkJCQkobGVuIC8gc2l6ZW9mKHN0cnVjdCBsaW51eF9wcm9tX3BjaV9yYW5nZXMpKTsKLQkJfSBlbHNlIHsKLQkJCXBibS0+bnVtX3BibV9yYW5nZXMgPSAwOwotCQl9Ci0KLQkJcHJvcCA9IG9mX2ZpbmRfcHJvcGVydHkobm9kZSwgImludGVycnVwdC1tYXAiLCAmbGVuKTsKLQkJaWYgKHByb3ApIHsKLQkJCXBibS0+cGJtX2ludG1hcCA9IHByb3AtPnZhbHVlOwotCQkJcGJtLT5udW1fcGJtX2ludG1hcCA9Ci0JCQkJKGxlbiAvIHNpemVvZihzdHJ1Y3QgbGludXhfcHJvbV9wY2lfaW50bWFwKSk7Ci0KLQkJCXByb3AgPSBvZl9maW5kX3Byb3BlcnR5KG5vZGUsICJpbnRlcnJ1cHQtbWFwLW1hc2siLAotCQkJCQkJTlVMTCk7Ci0JCQlwYm0tPnBibV9pbnRtYXNrID0gcHJvcC0+dmFsdWU7Ci0JCX0gZWxzZSB7Ci0JCQlwYm0tPm51bV9wYm1faW50bWFwID0gMDsKLQkJfQotCi0JCXBibV9yZWdpc3Rlcl90b3BsZXZlbF9yZXNvdXJjZXMocCwgcGJtKTsKLQotCW5leHRfcGNpOgotCQlub2RlID0gbm9kZS0+c2libGluZzsKLQl9Ci0JaWYgKHNpbWJhc19mb3VuZCA9PSAwKSB7Ci0JCXN0cnVjdCByZXNvdXJjZSAqcnA7Ci0KLQkJLyogTm8gQVBCcyB1bmRlcm5lYXRoLCBwcm9iYWJseSB0aGlzIGlzIGEgaHVtbWluZ2JpcmQKLQkJICogc3lzdGVtLgotCQkgKi8KLQkJcGJtID0gJnAtPnBibV9BOwotCQlwYm0tPnBhcmVudCA9IHA7Ci0JCXBibS0+cHJvbV9ub2RlID0gZHA7Ci0JCXBibS0+cGNpX2ZpcnN0X2J1c25vID0gcC0+cGNpX2ZpcnN0X2J1c25vOwotCQlwYm0tPnBjaV9sYXN0X2J1c25vID0gcC0+cGNpX2xhc3RfYnVzbm87Ci0KLQkJcHJvcCA9IG9mX2ZpbmRfcHJvcGVydHkoZHAsICJyYW5nZXMiLCAmbGVuKTsKLQkJaWYgKHByb3ApIHsKLQkJCXBibS0+cGJtX3JhbmdlcyA9IHByb3AtPnZhbHVlOwotCQkJcGJtLT5udW1fcGJtX3JhbmdlcyA9Ci0JCQkJKGxlbiAvIHNpemVvZihzdHJ1Y3QgbGludXhfcHJvbV9wY2lfcmFuZ2VzKSk7Ci0JCX0gZWxzZSB7Ci0JCQlwYm0tPm51bV9wYm1fcmFuZ2VzID0gMDsKLQkJfQotCi0JCXByb3AgPSBvZl9maW5kX3Byb3BlcnR5KGRwLCAiaW50ZXJydXB0LW1hcCIsICZsZW4pOwotCQlpZiAocHJvcCkgewotCQkJcGJtLT5wYm1faW50bWFwID0gcHJvcC0+dmFsdWU7Ci0JCQlwYm0tPm51bV9wYm1faW50bWFwID0KLQkJCQkobGVuIC8gc2l6ZW9mKHN0cnVjdCBsaW51eF9wcm9tX3BjaV9pbnRtYXApKTsKLQotCQkJcHJvcCA9IG9mX2ZpbmRfcHJvcGVydHkoZHAsICJpbnRlcnJ1cHQtbWFwLW1hc2siLAotCQkJCQkJTlVMTCk7Ci0JCQlwYm0tPnBibV9pbnRtYXNrID0gcHJvcC0+dmFsdWU7Ci0JCX0gZWxzZSB7Ci0JCQlwYm0tPm51bV9wYm1faW50bWFwID0gMDsKLQkJfQotCi0JCXBibS0+bmFtZSA9IGRwLT5mdWxsX25hbWU7Ci0JCXByaW50aygiJXM6IFNBQlJFIFBDSSBCdXMgTW9kdWxlXG4iLCBwYm0tPm5hbWUpOwotCi0JCXBibS0+aW9fc3BhY2UubmFtZSA9IHBibS0+bWVtX3NwYWNlLm5hbWUgPSBwYm0tPm5hbWU7Ci0KLQkJLyogSGFjayB1cCB0b3AtbGV2ZWwgcmVzb3VyY2VzLiAqLwotCQlwYm0tPmlvX3NwYWNlLnN0YXJ0ID0gcC0+cGJtX0EuY29udHJvbGxlcl9yZWdzICsgU0FCUkVfSU9TUEFDRTsKLQkJcGJtLT5pb19zcGFjZS5lbmQgICA9IHBibS0+aW9fc3BhY2Uuc3RhcnQgKyAoMVVMIDw8IDI0KSAtIDFVTDsKLQkJcGJtLT5pb19zcGFjZS5mbGFncyA9IElPUkVTT1VSQ0VfSU87Ci0KLQkJcGJtLT5tZW1fc3BhY2Uuc3RhcnQgPQotCQkJKHAtPnBibV9BLmNvbnRyb2xsZXJfcmVncyArIFNBQlJFX01FTVNQQUNFKTsKLQkJcGJtLT5tZW1fc3BhY2UuZW5kID0KLQkJCShwYm0tPm1lbV9zcGFjZS5zdGFydCArICgoMVVMIDw8IDMyVUwpIC0gMVVMKSk7Ci0JCXBibS0+bWVtX3NwYWNlLmZsYWdzID0gSU9SRVNPVVJDRV9NRU07Ci0KLQkJaWYgKHJlcXVlc3RfcmVzb3VyY2UoJmlvcG9ydF9yZXNvdXJjZSwgJnBibS0+aW9fc3BhY2UpIDwgMCkgewotCQkJcHJvbV9wcmludGYoIkNhbm5vdCByZWdpc3RlciBIdW1taW5nYmlyZCdzIElPIHNwYWNlLlxuIik7Ci0JCQlwcm9tX2hhbHQoKTsKLQkJfQotCQlpZiAocmVxdWVzdF9yZXNvdXJjZSgmaW9tZW1fcmVzb3VyY2UsICZwYm0tPm1lbV9zcGFjZSkgPCAwKSB7Ci0JCQlwcm9tX3ByaW50ZigiQ2Fubm90IHJlZ2lzdGVyIEh1bW1pbmdiaXJkJ3MgTUVNIHNwYWNlLlxuIik7Ci0JCQlwcm9tX2hhbHQoKTsKLQkJfQotCi0JCXJwID0ga21hbGxvYyhzaXplb2YoKnJwKSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghcnApIHsKLQkJCXByb21fcHJpbnRmKCJDYW5ub3QgYWxsb2NhdGUgSU9NTVUgcmVzb3VyY2UuXG4iKTsKLQkJCXByb21faGFsdCgpOwotCQl9Ci0JCXJwLT5uYW1lID0gIklPTU1VIjsKLQkJcnAtPnN0YXJ0ID0gcGJtLT5tZW1fc3BhY2Uuc3RhcnQgKyAodW5zaWduZWQgbG9uZykgZG1hX3N0YXJ0OwotCQlycC0+ZW5kID0gcGJtLT5tZW1fc3BhY2Uuc3RhcnQgKyAodW5zaWduZWQgbG9uZykgZG1hX2VuZCAtIDFVTDsKLQkJcnAtPmZsYWdzID0gSU9SRVNPVVJDRV9CVVNZOwotCQlyZXF1ZXN0X3Jlc291cmNlKCZwYm0tPm1lbV9zcGFjZSwgcnApOwotCi0JCXBjaV9yZWdpc3Rlcl9sZWdhY3lfcmVnaW9ucygmcGJtLT5pb19zcGFjZSwKLQkJCQkJICAgICZwYm0tPm1lbV9zcGFjZSk7Ci0JfQorCXBjaV9kZXRlcm1pbmVfbWVtX2lvX3NwYWNlKHBibSk7CiB9CiAKIHZvaWQgc2FicmVfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwLCBjaGFyICptb2RlbF9uYW1lKQogewotCXN0cnVjdCBsaW51eF9wcm9tNjRfcmVnaXN0ZXJzICpwcl9yZWdzOworCWNvbnN0IHN0cnVjdCBsaW51eF9wcm9tNjRfcmVnaXN0ZXJzICpwcl9yZWdzOwogCXN0cnVjdCBwY2lfY29udHJvbGxlcl9pbmZvICpwOwotCXN0cnVjdCBwY2lfaW9tbXUgKmlvbW11OwotCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKwlzdHJ1Y3QgaW9tbXUgKmlvbW11OwogCWludCB0c2JzaXplOwotCXUzMiAqYnVzcmFuZ2U7Ci0JdTMyICp2ZG1hOworCWNvbnN0IHUzMiAqYnVzcmFuZ2U7CisJY29uc3QgdTMyICp2ZG1hOwogCXUzMiB1cGFfcG9ydGlkLCBkbWFfbWFzazsKIAl1NjQgY2xlYXJfaXJxOwogCkBAIC0xMzUxLDEzICsxMDI3LDkgQEAKIAlpZiAoIXN0cmNtcChtb2RlbF9uYW1lLCAicGNpMTA4ZSxhMDAxIikpCiAJCWh1bW1pbmdiaXJkX3AgPSAxOwogCWVsc2UgaWYgKCFzdHJjbXAobW9kZWxfbmFtZSwgIlNVTlcsc2FicmUiKSkgewotCQlwcm9wID0gb2ZfZmluZF9wcm9wZXJ0eShkcCwgImNvbXBhdGlibGUiLCBOVUxMKTsKLQkJaWYgKHByb3ApIHsKLQkJCWNvbnN0IGNoYXIgKmNvbXBhdCA9IHByb3AtPnZhbHVlOwotCi0JCQlpZiAoIXN0cmNtcChjb21wYXQsICJwY2kxMDhlLGEwMDEiKSkKLQkJCQlodW1taW5nYmlyZF9wID0gMTsKLQkJfQorCQljb25zdCBjaGFyICpjb21wYXQgPSBvZl9nZXRfcHJvcGVydHkoZHAsICJjb21wYXRpYmxlIiwgTlVMTCk7CisJCWlmIChjb21wYXQgJiYgIXN0cmNtcChjb21wYXQsICJwY2kxMDhlLGEwMDEiKSkKKwkJCWh1bW1pbmdiaXJkX3AgPSAxOwogCQlpZiAoIWh1bW1pbmdiaXJkX3ApIHsKIAkJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHA7CiAKQEAgLTEzODEsMzcgKzEwNTMsMjggQEAKIAkJcHJvbV9wcmludGYoIlNBQlJFOiBFcnJvciwga21hbGxvYyhwY2lfaW9tbXUpIGZhaWxlZC5cbiIpOwogCQlwcm9tX2hhbHQoKTsKIAl9Ci0JcC0+cGJtX0EuaW9tbXUgPSBwLT5wYm1fQi5pb21tdSA9IGlvbW11OworCXAtPnBibV9BLmlvbW11ID0gaW9tbXU7CiAKLQl1cGFfcG9ydGlkID0gMHhmZjsKLQlwcm9wID0gb2ZfZmluZF9wcm9wZXJ0eShkcCwgInVwYS1wb3J0aWQiLCBOVUxMKTsKLQlpZiAocHJvcCkKLQkJdXBhX3BvcnRpZCA9ICoodTMyICopIHByb3AtPnZhbHVlOworCXVwYV9wb3J0aWQgPSBvZl9nZXRpbnRwcm9wX2RlZmF1bHQoZHAsICJ1cGEtcG9ydGlkIiwgMHhmZik7CiAKIAlwLT5uZXh0ID0gcGNpX2NvbnRyb2xsZXJfcm9vdDsKIAlwY2lfY29udHJvbGxlcl9yb290ID0gcDsKIAogCXAtPnBibV9BLnBvcnRpZCA9IHVwYV9wb3J0aWQ7Ci0JcC0+cGJtX0IucG9ydGlkID0gdXBhX3BvcnRpZDsKIAlwLT5pbmRleCA9IHBjaV9udW1fY29udHJvbGxlcnMrKzsKLQlwLT5wYm1zX3NhbWVfZG9tYWluID0gMTsKIAlwLT5zY2FuX2J1cyA9IHNhYnJlX3NjYW5fYnVzOwotCXAtPmJhc2VfYWRkcmVzc191cGRhdGUgPSBzYWJyZV9iYXNlX2FkZHJlc3NfdXBkYXRlOwotCXAtPnJlc291cmNlX2FkanVzdCA9IHNhYnJlX3Jlc291cmNlX2FkanVzdDsKIAlwLT5wY2lfb3BzID0gJnNhYnJlX29wczsKIAogCS8qCiAJICogTWFwIGluIFNBQlJFIHJlZ2lzdGVyIHNldCBhbmQgcmVwb3J0IHRoZSBwcmVzZW5jZSBvZiB0aGlzIFNBQlJFLgogCSAqLwogCQotCXByb3AgPSBvZl9maW5kX3Byb3BlcnR5KGRwLCAicmVnIiwgTlVMTCk7Ci0JcHJfcmVncyA9IHByb3AtPnZhbHVlOworCXByX3JlZ3MgPSBvZl9nZXRfcHJvcGVydHkoZHAsICJyZWciLCBOVUxMKTsKIAogCS8qCiAJICogRmlyc3QgUkVHIGluIHByb3BlcnR5IGlzIGJhc2Ugb2YgZW50aXJlIFNBQlJFIHJlZ2lzdGVyIHNwYWNlLgogCSAqLwogCXAtPnBibV9BLmNvbnRyb2xsZXJfcmVncyA9IHByX3JlZ3NbMF0ucGh5c19hZGRyOwotCXAtPnBibV9CLmNvbnRyb2xsZXJfcmVncyA9IHByX3JlZ3NbMF0ucGh5c19hZGRyOwogCiAJLyogQ2xlYXIgaW50ZXJydXB0cyAqLwogCkBAIC0xNDI5LDExICsxMDkyLDEwIEBACiAJCSAgICAgU0FCUkVfUENJQ1RSTF9BUkJQQVJLIHwgU0FCUkVfUENJQ1RSTF9BRU4pKTsKIAogCS8qIE5vdyBtYXAgaW4gUENJIGNvbmZpZyBzcGFjZSBmb3IgZW50aXJlIFNBQlJFLiAqLwotCXAtPnBibV9BLmNvbmZpZ19zcGFjZSA9IHAtPnBibV9CLmNvbmZpZ19zcGFjZSA9CisJcC0+cGJtX0EuY29uZmlnX3NwYWNlID0KIAkJKHAtPnBibV9BLmNvbnRyb2xsZXJfcmVncyArIFNBQlJFX0NPTkZJR1NQQUNFKTsKIAotCXByb3AgPSBvZl9maW5kX3Byb3BlcnR5KGRwLCAidmlydHVhbC1kbWEiLCBOVUxMKTsKLQl2ZG1hID0gcHJvcC0+dmFsdWU7CisJdmRtYSA9IG9mX2dldF9wcm9wZXJ0eShkcCwgInZpcnR1YWwtZG1hIiwgTlVMTCk7CiAKIAlkbWFfbWFzayA9IHZkbWFbMF07CiAJc3dpdGNoKHZkbWFbMV0pIHsKQEAgLTE0NTcsMTMgKzExMTksMTIgQEAKIAogCXNhYnJlX2lvbW11X2luaXQocCwgdHNic2l6ZSwgdmRtYVswXSwgZG1hX21hc2spOwogCi0JcHJvcCA9IG9mX2ZpbmRfcHJvcGVydHkoZHAsICJidXMtcmFuZ2UiLCBOVUxMKTsKLQlidXNyYW5nZSA9IHByb3AtPnZhbHVlOworCWJ1c3JhbmdlID0gb2ZfZ2V0X3Byb3BlcnR5KGRwLCAiYnVzLXJhbmdlIiwgTlVMTCk7CiAJcC0+cGNpX2ZpcnN0X2J1c25vID0gYnVzcmFuZ2VbMF07CiAJcC0+cGNpX2xhc3RfYnVzbm8gPSBidXNyYW5nZVsxXTsKIAogCS8qCiAJICogTG9vayBmb3IgQVBCIHVuZGVybmVhdGguCiAJICovCi0Jc2FicmVfcGJtX2luaXQocCwgZHAsIHZkbWFbMF0sIHZkbWFbMF0gKyB2ZG1hWzFdKTsKKwlzYWJyZV9wYm1faW5pdChwLCBkcCk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9zY2hpem8uYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX3NjaGl6by5jCmluZGV4IDY2OTExYjEuLjkxYTczODUgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX3NjaGl6by5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX3NjaGl6by5jCkBAIC0xLDcgKzEsNiBAQAotLyogJElkOiBwY2lfc2NoaXpvLmMsdiAxLjI0IDIwMDIvMDEvMjMgMTE6Mjc6MzIgZGF2ZW0gRXhwICQKLSAqIHBjaV9zY2hpem8uYzogU0NISVpPL1RPTUFUSUxMTyBzcGVjaWZpYyBQQ0kgY29udHJvbGxlciBzdXBwb3J0LgorLyogcGNpX3NjaGl6by5jOiBTQ0hJWk8vVE9NQVRJTExPIHNwZWNpZmljIFBDSSBjb250cm9sbGVyIHN1cHBvcnQuCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyLCAyMDAzIERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AcmVkaGF0LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiwgMjAwMywgMjAwNyBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQGRhdmVtbG9mdC5uZXQpCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpAQCAtMTI2LDYgKzEyNSw5IEBACiAJdTE2IHRtcDE2OwogCXU4IHRtcDg7CiAKKwlpZiAoYnVzX2RldiA9PSBwYm0tPnBjaV9idXMgJiYgZGV2Zm4gPT0gMHgwMCkKKwkJcmV0dXJuIHBjaV9ob3N0X2JyaWRnZV9yZWFkX3BjaV9jZmcoYnVzX2RldiwgZGV2Zm4sIHdoZXJlLAorCQkJCQkJICAgIHNpemUsIHZhbHVlKTsKIAlzd2l0Y2ggKHNpemUpIHsKIAljYXNlIDE6CiAJCSp2YWx1ZSA9IDB4ZmY7CkBAIC0xNzksNiArMTgxLDkgQEAKIAl1bnNpZ25lZCBjaGFyIGJ1cyA9IGJ1c19kZXYtPm51bWJlcjsKIAl1MzIgKmFkZHI7CiAKKwlpZiAoYnVzX2RldiA9PSBwYm0tPnBjaV9idXMgJiYgZGV2Zm4gPT0gMHgwMCkKKwkJcmV0dXJuIHBjaV9ob3N0X2JyaWRnZV93cml0ZV9wY2lfY2ZnKGJ1c19kZXYsIGRldmZuLCB3aGVyZSwKKwkJCQkJCSAgICAgc2l6ZSwgdmFsdWUpOwogCWFkZHIgPSBzY2hpem9fcGNpX2NvbmZpZ19ta2FkZHIocGJtLCBidXMsIGRldmZuLCB3aGVyZSk7CiAJaWYgKCFhZGRyKQogCQlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOwpAQCAtMjc0LDcgKzI3OSw3IEBACiBzdGF0aWMgdm9pZCBfX3NjaGl6b19jaGVja19zdGNfZXJyb3JfcGJtKHN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSwKIAkJCQkJIGVudW0gc2NoaXpvX2Vycm9yX3R5cGUgdHlwZSkKIHsKLQlzdHJ1Y3QgcGNpX3N0cmJ1ZiAqc3RyYnVmID0gJnBibS0+c3RjOworCXN0cnVjdCBzdHJidWYgKnN0cmJ1ZiA9ICZwYm0tPnN0YzsKIAl1bnNpZ25lZCBsb25nIHJlZ2Jhc2UgPSBwYm0tPnBibV9yZWdzOwogCXVuc2lnbmVkIGxvbmcgZXJyX2Jhc2UsIHRhZ19iYXNlLCBsaW5lX2Jhc2U7CiAJdTY0IGNvbnRyb2w7CkBAIC0zODIsNyArMzg3LDcgQEAKIHN0YXRpYyB2b2lkIHNjaGl6b19jaGVja19pb21tdV9lcnJvcl9wYm0oc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtLAogCQkJCQkgZW51bSBzY2hpem9fZXJyb3JfdHlwZSB0eXBlKQogewotCXN0cnVjdCBwY2lfaW9tbXUgKmlvbW11ID0gcGJtLT5pb21tdTsKKwlzdHJ1Y3QgaW9tbXUgKmlvbW11ID0gcGJtLT5pb21tdTsKIAl1bnNpZ25lZCBsb25nIGlvbW11X3RhZ1sxNl07CiAJdW5zaWduZWQgbG9uZyBpb21tdV9kYXRhWzE2XTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtMTIyOSw0MiArMTIzNCw4IEBACiAJcGNpX2NvbmZpZ193cml0ZTgoYWRkciwgNjQpOwogfQogCi1zdGF0aWMgdm9pZCBwYm1fc2Nhbl9idXMoc3RydWN0IHBjaV9jb250cm9sbGVyX2luZm8gKnAsCi0JCQkgc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtKQorc3RhdGljIHZvaWQgc2NoaXpvX3NjYW5fYnVzKHN0cnVjdCBwY2lfY29udHJvbGxlcl9pbmZvICpwKQogewotCXN0cnVjdCBwY2lkZXZfY29va2llICpjb29raWUgPSBremFsbG9jKHNpemVvZigqY29va2llKSwgR0ZQX0tFUk5FTCk7Ci0KLQlpZiAoIWNvb2tpZSkgewotCQlwcm9tX3ByaW50ZigiJXM6IENyaXRpY2FsIGFsbG9jYXRpb24gZmFpbHVyZS5cbiIsIHBibS0+bmFtZSk7Ci0JCXByb21faGFsdCgpOwotCX0KLQotCS8qIEFsbCB3ZSBjYXJlIGFib3V0IGlzIHRoZSBQQk0uICovCi0JY29va2llLT5wYm0gPSBwYm07Ci0KLQlwYm0tPnBjaV9idXMgPSBwY2lfc2Nhbl9idXMocGJtLT5wY2lfZmlyc3RfYnVzbm8sCi0JCQkJICAgIHAtPnBjaV9vcHMsCi0JCQkJICAgIHBibSk7Ci0JcGNpX2ZpeHVwX2hvc3RfYnJpZGdlX3NlbGYocGJtLT5wY2lfYnVzKTsKLQlwYm0tPnBjaV9idXMtPnNlbGYtPnN5c2RhdGEgPSBjb29raWU7Ci0KLQlwY2lfZmlsbF9pbl9wYm1fY29va2llcyhwYm0tPnBjaV9idXMsIHBibSwgcGJtLT5wcm9tX25vZGUpOwotCXBjaV9yZWNvcmRfYXNzaWdubWVudHMocGJtLCBwYm0tPnBjaV9idXMpOwotCXBjaV9hc3NpZ25fdW5hc3NpZ25lZChwYm0sIHBibS0+cGNpX2J1cyk7Ci0JcGNpX2ZpeHVwX2lycShwYm0sIHBibS0+cGNpX2J1cyk7Ci0JcGNpX2RldGVybWluZV82Nm1oel9kaXNwb3NpdGlvbihwYm0sIHBibS0+cGNpX2J1cyk7Ci0JcGNpX3NldHVwX2J1c21hc3RlcmluZyhwYm0sIHBibS0+cGNpX2J1cyk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fc2NoaXpvX3NjYW5fYnVzKHN0cnVjdCBwY2lfY29udHJvbGxlcl9pbmZvICpwLAotCQkJICAgICAgaW50IGNoaXBfdHlwZSkKLXsKLQlpZiAoIXAtPnBibV9CLnByb21fbm9kZSB8fCAhcC0+cGJtX0EucHJvbV9ub2RlKSB7Ci0JCXByaW50aygiUENJOiBPbmx5IG9uZSBQQ0kgYnVzIG1vZHVsZSBvZiBjb250cm9sbGVyIGZvdW5kLlxuIik7Ci0JCXByaW50aygiUENJOiBJZ25vcmluZyBlbnRpcmUgY29udHJvbGxlci5cbiIpOwotCQlyZXR1cm47Ci0JfQotCiAJcGJtX2NvbmZpZ19idXNtYXN0ZXJpbmcoJnAtPnBibV9CKTsKIAlwLT5wYm1fQi5pc182Nm1oel9jYXBhYmxlID0KIAkJKG9mX2ZpbmRfcHJvcGVydHkocC0+cGJtX0IucHJvbV9ub2RlLCAiNjZtaHotY2FwYWJsZSIsIE5VTEwpCkBAIC0xMjczLDE1NCArMTI0NCwxOSBAQAogCXAtPnBibV9BLmlzXzY2bWh6X2NhcGFibGUgPQogCQkob2ZfZmluZF9wcm9wZXJ0eShwLT5wYm1fQS5wcm9tX25vZGUsICI2Nm1oei1jYXBhYmxlIiwgTlVMTCkKIAkJICE9IE5VTEwpOwotCXBibV9zY2FuX2J1cyhwLCAmcC0+cGJtX0IpOwotCXBibV9zY2FuX2J1cyhwLCAmcC0+cGJtX0EpOworCisJcC0+cGJtX0IucGNpX2J1cyA9IHBjaV9zY2FuX29uZV9wYm0oJnAtPnBibV9CKTsKKwlwLT5wYm1fQS5wY2lfYnVzID0gcGNpX3NjYW5fb25lX3BibSgmcC0+cGJtX0EpOwogCiAJLyogQWZ0ZXIgdGhlIFBDSSBidXMgc2NhbiBpcyBjb21wbGV0ZSwgd2UgY2FuIHJlZ2lzdGVyCiAJICogdGhlIGVycm9yIGludGVycnVwdCBoYW5kbGVycy4KIAkgKi8KLQlpZiAoY2hpcF90eXBlID09IFBCTV9DSElQX1RZUEVfVE9NQVRJTExPKQorCWlmIChwLT5wYm1fQi5jaGlwX3R5cGUgPT0gUEJNX0NISVBfVFlQRV9UT01BVElMTE8pCiAJCXRvbWF0aWxsb19yZWdpc3Rlcl9lcnJvcl9oYW5kbGVycyhwKTsKIAllbHNlCiAJCXNjaGl6b19yZWdpc3Rlcl9lcnJvcl9oYW5kbGVycyhwKTsKIH0KIAotc3RhdGljIHZvaWQgc2NoaXpvX3NjYW5fYnVzKHN0cnVjdCBwY2lfY29udHJvbGxlcl9pbmZvICpwKQotewotCV9fc2NoaXpvX3NjYW5fYnVzKHAsIFBCTV9DSElQX1RZUEVfU0NISVpPKTsKLX0KLQotc3RhdGljIHZvaWQgdG9tYXRpbGxvX3NjYW5fYnVzKHN0cnVjdCBwY2lfY29udHJvbGxlcl9pbmZvICpwKQotewotCV9fc2NoaXpvX3NjYW5fYnVzKHAsIFBCTV9DSElQX1RZUEVfVE9NQVRJTExPKTsKLX0KLQotc3RhdGljIHZvaWQgc2NoaXpvX2Jhc2VfYWRkcmVzc191cGRhdGUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCByZXNvdXJjZSkKLXsKLQlzdHJ1Y3QgcGNpZGV2X2Nvb2tpZSAqcGNwID0gcGRldi0+c3lzZGF0YTsKLQlzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0gPSBwY3AtPnBibTsKLQlzdHJ1Y3QgcmVzb3VyY2UgKnJlcywgKnJvb3Q7Ci0JdTMyIHJlZzsKLQlpbnQgd2hlcmUsIHNpemUsIGlzXzY0Yml0OwotCi0JcmVzID0gJnBkZXYtPnJlc291cmNlW3Jlc291cmNlXTsKLQlpZiAocmVzb3VyY2UgPCA2KSB7Ci0JCXdoZXJlID0gUENJX0JBU0VfQUREUkVTU18wICsgKHJlc291cmNlICogNCk7Ci0JfSBlbHNlIGlmIChyZXNvdXJjZSA9PSBQQ0lfUk9NX1JFU09VUkNFKSB7Ci0JCXdoZXJlID0gcGRldi0+cm9tX2Jhc2VfcmVnOwotCX0gZWxzZSB7Ci0JCS8qIFNvbWVib2R5IG1pZ2h0IGhhdmUgYXNrZWQgYWxsb2NhdGlvbiBvZiBhIG5vbi1zdGFuZGFyZCByZXNvdXJjZSAqLwotCQlyZXR1cm47Ci0JfQotCi0JaXNfNjRiaXQgPSAwOwotCWlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9JTykKLQkJcm9vdCA9ICZwYm0tPmlvX3NwYWNlOwotCWVsc2UgewotCQlyb290ID0gJnBibS0+bWVtX3NwYWNlOwotCQlpZiAoKHJlcy0+ZmxhZ3MgJiBQQ0lfQkFTRV9BRERSRVNTX01FTV9UWVBFX01BU0spCi0JCSAgICA9PSBQQ0lfQkFTRV9BRERSRVNTX01FTV9UWVBFXzY0KQotCQkJaXNfNjRiaXQgPSAxOwotCX0KLQotCXNpemUgPSByZXMtPmVuZCAtIHJlcy0+c3RhcnQ7Ci0JcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIHdoZXJlLCAmcmVnKTsKLQlyZWcgPSAoKHJlZyAmIHNpemUpIHwKLQkgICAgICAgKCgodTMyKShyZXMtPnN0YXJ0IC0gcm9vdC0+c3RhcnQpKSAmIH5zaXplKSk7Ci0JaWYgKHJlc291cmNlID09IFBDSV9ST01fUkVTT1VSQ0UpIHsKLQkJcmVnIHw9IFBDSV9ST01fQUREUkVTU19FTkFCTEU7Ci0JCXJlcy0+ZmxhZ3MgfD0gSU9SRVNPVVJDRV9ST01fRU5BQkxFOwotCX0KLQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIHdoZXJlLCByZWcpOwotCi0JLyogVGhpcyBrbm93cyB0aGF0IHRoZSB1cHBlciAzMi1iaXRzIG9mIHRoZSBhZGRyZXNzCi0JICogbXVzdCBiZSB6ZXJvLiAgT3VyIFBDSSBjb21tb24gbGF5ZXIgZW5mb3JjZXMgdGhpcy4KLQkgKi8KLQlpZiAoaXNfNjRiaXQpCi0JCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgd2hlcmUgKyA0LCAwKTsKLX0KLQotc3RhdGljIHZvaWQgc2NoaXpvX3Jlc291cmNlX2FkanVzdChzdHJ1Y3QgcGNpX2RldiAqcGRldiwKLQkJCQkgICBzdHJ1Y3QgcmVzb3VyY2UgKnJlcywKLQkJCQkgICBzdHJ1Y3QgcmVzb3VyY2UgKnJvb3QpCi17Ci0JcmVzLT5zdGFydCArPSByb290LT5zdGFydDsKLQlyZXMtPmVuZCArPSByb290LT5zdGFydDsKLX0KLQotLyogVXNlIHJhbmdlcyBwcm9wZXJ0eSB0byBkZXRlcm1pbmUgd2hlcmUgUENJIE1FTSwgSS9PLCBhbmQgQ29uZmlnCi0gKiBzcGFjZSBhcmUgZm9yIHRoaXMgUENJIGJ1cyBtb2R1bGUuCi0gKi8KLXN0YXRpYyB2b2lkIHNjaGl6b19kZXRlcm1pbmVfbWVtX2lvX3NwYWNlKHN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSkKLXsKLQlpbnQgaSwgc2F3X2NmZywgc2F3X21lbSwgc2F3X2lvOwotCi0Jc2F3X2NmZyA9IHNhd19tZW0gPSBzYXdfaW8gPSAwOwotCWZvciAoaSA9IDA7IGkgPCBwYm0tPm51bV9wYm1fcmFuZ2VzOyBpKyspIHsKLQkJc3RydWN0IGxpbnV4X3Byb21fcGNpX3JhbmdlcyAqcHIgPSAmcGJtLT5wYm1fcmFuZ2VzW2ldOwotCQl1bnNpZ25lZCBsb25nIGE7Ci0JCWludCB0eXBlOwotCi0JCXR5cGUgPSAocHItPmNoaWxkX3BoeXNfaGkgPj4gMjQpICYgMHgzOwotCQlhID0gKCgodW5zaWduZWQgbG9uZylwci0+cGFyZW50X3BoeXNfaGkgPDwgMzJVTCkgfAotCQkgICAgICgodW5zaWduZWQgbG9uZylwci0+cGFyZW50X3BoeXNfbG8gIDw8ICAwVUwpKTsKLQotCQlzd2l0Y2ggKHR5cGUpIHsKLQkJY2FzZSAwOgotCQkJLyogUENJIGNvbmZpZyBzcGFjZSwgMTZNQiAqLwotCQkJcGJtLT5jb25maWdfc3BhY2UgPSBhOwotCQkJc2F3X2NmZyA9IDE7Ci0JCQlicmVhazsKLQotCQljYXNlIDE6Ci0JCQkvKiAxNi1iaXQgSU8gc3BhY2UsIDE2TUIgKi8KLQkJCXBibS0+aW9fc3BhY2Uuc3RhcnQgPSBhOwotCQkJcGJtLT5pb19zcGFjZS5lbmQgPSBhICsgKCgxNlVMKjEwMjRVTCoxMDI0VUwpIC0gMVVMKTsKLQkJCXBibS0+aW9fc3BhY2UuZmxhZ3MgPSBJT1JFU09VUkNFX0lPOwotCQkJc2F3X2lvID0gMTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgMjoKLQkJCS8qIDMyLWJpdCBNRU0gc3BhY2UsIDJHQiAqLwotCQkJcGJtLT5tZW1fc3BhY2Uuc3RhcnQgPSBhOwotCQkJcGJtLT5tZW1fc3BhY2UuZW5kID0gYSArICgweDgwMDAwMDAwVUwgLSAxVUwpOwotCQkJcGJtLT5tZW1fc3BhY2UuZmxhZ3MgPSBJT1JFU09VUkNFX01FTTsKLQkJCXNhd19tZW0gPSAxOwotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCQl9OwotCX0KLQotCWlmICghc2F3X2NmZyB8fCAhc2F3X2lvIHx8ICFzYXdfbWVtKSB7Ci0JCXByb21fcHJpbnRmKCIlczogRmF0YWwgZXJyb3IsIG1pc3NpbmcgJXMgUEJNIHJhbmdlLlxuIiwKLQkJCSAgICBwYm0tPm5hbWUsCi0JCQkgICAgKCghc2F3X2NmZyA/Ci0JCQkgICAgICAiQ0ZHIiA6Ci0JCQkgICAgICAoIXNhd19pbyA/Ci0JCQkgICAgICAgIklPIiA6ICJNRU0iKSkpKTsKLQkJcHJvbV9oYWx0KCk7Ci0JfQotCi0JcHJpbnRrKCIlczogUENJIENGR1slbHhdIElPWyVseF0gTUVNWyVseF1cbiIsCi0JICAgICAgIHBibS0+bmFtZSwKLQkgICAgICAgcGJtLT5jb25maWdfc3BhY2UsCi0JICAgICAgIHBibS0+aW9fc3BhY2Uuc3RhcnQsCi0JICAgICAgIHBibS0+bWVtX3NwYWNlLnN0YXJ0KTsKLX0KLQotc3RhdGljIHZvaWQgcGJtX3JlZ2lzdGVyX3RvcGxldmVsX3Jlc291cmNlcyhzdHJ1Y3QgcGNpX2NvbnRyb2xsZXJfaW5mbyAqcCwKLQkJCQkJICAgIHN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSkKLXsKLQlwYm0tPmlvX3NwYWNlLm5hbWUgPSBwYm0tPm1lbV9zcGFjZS5uYW1lID0gcGJtLT5uYW1lOwotCi0JcmVxdWVzdF9yZXNvdXJjZSgmaW9wb3J0X3Jlc291cmNlLCAmcGJtLT5pb19zcGFjZSk7Ci0JcmVxdWVzdF9yZXNvdXJjZSgmaW9tZW1fcmVzb3VyY2UsICZwYm0tPm1lbV9zcGFjZSk7Ci0JcGNpX3JlZ2lzdGVyX2xlZ2FjeV9yZWdpb25zKCZwYm0tPmlvX3NwYWNlLAotCQkJCSAgICAmcGJtLT5tZW1fc3BhY2UpOwotfQotCiAjZGVmaW5lIFNDSElaT19TVFJCVUZfQ09OVFJPTAkJKDB4MDI4MDBVTCkKICNkZWZpbmUgU0NISVpPX1NUUkJVRl9GTFVTSAkJKDB4MDI4MDhVTCkKICNkZWZpbmUgU0NISVpPX1NUUkJVRl9GU1lOQwkJKDB4MDI4MTBVTCkKQEAgLTE0NzIsNyArMTMwOCw3IEBACiAKIHN0YXRpYyB2b2lkIHNjaGl6b19wYm1faW9tbXVfaW5pdChzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0pCiB7Ci0Jc3RydWN0IHBjaV9pb21tdSAqaW9tbXUgPSBwYm0tPmlvbW11OworCXN0cnVjdCBpb21tdSAqaW9tbXUgPSBwYm0tPmlvbW11OwogCXVuc2lnbmVkIGxvbmcgaSwgdGFnYmFzZSwgZGF0YWJhc2U7CiAJc3RydWN0IHByb3BlcnR5ICpwcm9wOwogCXUzMiB2ZG1hWzJdLCBkbWFfbWFzazsKQEAgLTE2NTQsMTQgKzE0OTAsMTIgQEAKIAkJCSAgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwLCB1MzIgcG9ydGlkLAogCQkJICAgIGludCBjaGlwX3R5cGUpCiB7Ci0Jc3RydWN0IGxpbnV4X3Byb202NF9yZWdpc3RlcnMgKnJlZ3M7Ci0Jc3RydWN0IHByb3BlcnR5ICpwcm9wOwotCXVuc2lnbmVkIGludCAqYnVzcmFuZ2U7CisJY29uc3Qgc3RydWN0IGxpbnV4X3Byb202NF9yZWdpc3RlcnMgKnJlZ3M7CisJY29uc3QgdW5zaWduZWQgaW50ICpidXNyYW5nZTsKIAlzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm07CiAJY29uc3QgY2hhciAqY2hpcHNldF9uYW1lOwotCXUzMiAqaW5vX2JpdG1hcDsKKwljb25zdCB1MzIgKmlub19iaXRtYXA7CiAJaW50IGlzX3BibV9hOwotCWludCBsZW47CiAKIAlzd2l0Y2ggKGNoaXBfdHlwZSkgewogCWNhc2UgUEJNX0NISVBfVFlQRV9UT01BVElMTE86CkBAIC0xNjg5LDExICsxNTIzLDkgQEAKIAkgKiAzKSBQQk0gUENJIGNvbmZpZyBzcGFjZQogCSAqIDQpIEljaGlwIHJlZ3MKIAkgKi8KLQlwcm9wID0gb2ZfZmluZF9wcm9wZXJ0eShkcCwgInJlZyIsIE5VTEwpOwotCXJlZ3MgPSBwcm9wLT52YWx1ZTsKKwlyZWdzID0gb2ZfZ2V0X3Byb3BlcnR5KGRwLCAicmVnIiwgTlVMTCk7CiAKIAlpc19wYm1fYSA9ICgocmVnc1swXS5waHlzX2FkZHIgJiAweDAwNzAwMDAwKSA9PSAweDAwNjAwMDAwKTsKLQogCWlmIChpc19wYm1fYSkKIAkJcGJtID0gJnAtPnBibV9BOwogCWVsc2UKQEAgLTE3MDIsMTcgKzE1MzQsMTAgQEAKIAlwYm0tPnBvcnRpZCA9IHBvcnRpZDsKIAlwYm0tPnBhcmVudCA9IHA7CiAJcGJtLT5wcm9tX25vZGUgPSBkcDsKLQlwYm0tPnBjaV9maXJzdF9zbG90ID0gMTsKIAogCXBibS0+Y2hpcF90eXBlID0gY2hpcF90eXBlOwotCXBibS0+Y2hpcF92ZXJzaW9uID0gMDsKLQlwcm9wID0gb2ZfZmluZF9wcm9wZXJ0eShkcCwgInZlcnNpb24jIiwgTlVMTCk7Ci0JaWYgKHByb3ApCi0JCXBibS0+Y2hpcF92ZXJzaW9uID0gKihpbnQgKikgcHJvcC0+dmFsdWU7Ci0JcGJtLT5jaGlwX3JldmlzaW9uID0gMDsKLQlwcm9wID0gb2ZfZmluZF9wcm9wZXJ0eShkcCwgIm1vZHVsZS1yZXZpc2lvbiMiLCBOVUxMKTsKLQlpZiAocHJvcCkKLQkJcGJtLT5jaGlwX3JldmlzaW9uID0gKihpbnQgKikgcHJvcC0+dmFsdWU7CisJcGJtLT5jaGlwX3ZlcnNpb24gPSBvZl9nZXRpbnRwcm9wX2RlZmF1bHQoZHAsICJ2ZXJzaW9uIyIsIDApOworCXBibS0+Y2hpcF9yZXZpc2lvbiA9IG9mX2dldGludHByb3BfZGVmYXVsdChkcCwgIm1vZHVsZS12ZXJzaW9uIyIsIDApOwogCiAJcGJtLT5wYm1fcmVncyA9IHJlZ3NbMF0ucGh5c19hZGRyOwogCXBibS0+Y29udHJvbGxlcl9yZWdzID0gcmVnc1sxXS5waHlzX2FkZHIgLSAweDEwMDAwVUw7CkBAIC0xNzIzLDQwICsxNTQ4LDE4IEBACiAJcGJtLT5uYW1lID0gZHAtPmZ1bGxfbmFtZTsKIAogCXByaW50aygiJXM6ICVzIFBDSSBCdXMgTW9kdWxlIHZlclsleDoleF1cbiIsCi0JICAgICAgIHBibS0+bmFtZSwKLQkgICAgICAgKGNoaXBfdHlwZSA9PSBQQk1fQ0hJUF9UWVBFX1RPTUFUSUxMTyA/Ci0JCSJUT01BVElMTE8iIDogIlNDSElaTyIpLAorCSAgICAgICBwYm0tPm5hbWUsIGNoaXBzZXRfbmFtZSwKIAkgICAgICAgcGJtLT5jaGlwX3ZlcnNpb24sIHBibS0+Y2hpcF9yZXZpc2lvbik7CiAKIAlzY2hpem9fcGJtX2h3X2luaXQocGJtKTsKIAotCXByb3AgPSBvZl9maW5kX3Byb3BlcnR5KGRwLCAicmFuZ2VzIiwgJmxlbik7Ci0JcGJtLT5wYm1fcmFuZ2VzID0gcHJvcC0+dmFsdWU7Ci0JcGJtLT5udW1fcGJtX3JhbmdlcyA9Ci0JCShsZW4gLyBzaXplb2Yoc3RydWN0IGxpbnV4X3Byb21fcGNpX3JhbmdlcykpOworCXBjaV9kZXRlcm1pbmVfbWVtX2lvX3NwYWNlKHBibSk7CiAKLQlzY2hpem9fZGV0ZXJtaW5lX21lbV9pb19zcGFjZShwYm0pOwotCXBibV9yZWdpc3Rlcl90b3BsZXZlbF9yZXNvdXJjZXMocCwgcGJtKTsKLQotCXByb3AgPSBvZl9maW5kX3Byb3BlcnR5KGRwLCAiaW50ZXJydXB0LW1hcCIsICZsZW4pOwotCWlmIChwcm9wKSB7Ci0JCXBibS0+cGJtX2ludG1hcCA9IHByb3AtPnZhbHVlOwotCQlwYm0tPm51bV9wYm1faW50bWFwID0KLQkJCShsZW4gLyBzaXplb2Yoc3RydWN0IGxpbnV4X3Byb21fcGNpX2ludG1hcCkpOwotCi0JCXByb3AgPSBvZl9maW5kX3Byb3BlcnR5KGRwLCAiaW50ZXJydXB0LW1hcC1tYXNrIiwgTlVMTCk7Ci0JCXBibS0+cGJtX2ludG1hc2sgPSBwcm9wLT52YWx1ZTsKLQl9IGVsc2UgewotCQlwYm0tPm51bV9wYm1faW50bWFwID0gMDsKLQl9Ci0KLQlwcm9wID0gb2ZfZmluZF9wcm9wZXJ0eShkcCwgImluby1iaXRtYXAiLCBOVUxMKTsKLQlpbm9fYml0bWFwID0gcHJvcC0+dmFsdWU7CisJaW5vX2JpdG1hcCA9IG9mX2dldF9wcm9wZXJ0eShkcCwgImluby1iaXRtYXAiLCBOVUxMKTsKIAlwYm0tPmlub19iaXRtYXAgPSAoKCh1NjQpaW5vX2JpdG1hcFsxXSA8PCAzMlVMKSB8CiAJCQkgICAoKHU2NClpbm9fYml0bWFwWzBdIDw8ICAwVUwpKTsKIAotCXByb3AgPSBvZl9maW5kX3Byb3BlcnR5KGRwLCAiYnVzLXJhbmdlIiwgTlVMTCk7Ci0JYnVzcmFuZ2UgPSBwcm9wLT52YWx1ZTsKKwlidXNyYW5nZSA9IG9mX2dldF9wcm9wZXJ0eShkcCwgImJ1cy1yYW5nZSIsIE5VTEwpOwogCXBibS0+cGNpX2ZpcnN0X2J1c25vID0gYnVzcmFuZ2VbMF07CiAJcGJtLT5wY2lfbGFzdF9idXNubyA9IGJ1c3JhbmdlWzFdOwogCkBAIC0xNzc3LDE1ICsxNTgwLDEwIEBACiBzdGF0aWMgdm9pZCBfX3NjaGl6b19pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAsIGNoYXIgKm1vZGVsX25hbWUsIGludCBjaGlwX3R5cGUpCiB7CiAJc3RydWN0IHBjaV9jb250cm9sbGVyX2luZm8gKnA7Ci0Jc3RydWN0IHBjaV9pb21tdSAqaW9tbXU7Ci0Jc3RydWN0IHByb3BlcnR5ICpwcm9wOwotCWludCBpc19wYm1fYTsKKwlzdHJ1Y3QgaW9tbXUgKmlvbW11OwogCXUzMiBwb3J0aWQ7CiAKLQlwb3J0aWQgPSAweGZmOwotCXByb3AgPSBvZl9maW5kX3Byb3BlcnR5KGRwLCAicG9ydGlkIiwgTlVMTCk7Ci0JaWYgKHByb3ApCi0JCXBvcnRpZCA9ICoodTMyICopIHByb3AtPnZhbHVlOworCXBvcnRpZCA9IG9mX2dldGludHByb3BfZGVmYXVsdChkcCwgInBvcnRpZCIsIDB4ZmYpOwogCiAJZm9yIChwID0gcGNpX2NvbnRyb2xsZXJfcm9vdDsgcDsgcCA9IHAtPm5leHQpIHsKIAkJc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtOwpAQCAtMTc5OCw0OCArMTU5Niw0MyBAQAogCQkgICAgICAgJnAtPnBibV9CKTsKIAogCQlpZiAocG9ydGlkX2NvbXBhcmUocGJtLT5wb3J0aWQsIHBvcnRpZCwgY2hpcF90eXBlKSkgewotCQkJaXNfcGJtX2EgPSAocC0+cGJtX0EucHJvbV9ub2RlID09IE5VTEwpOwogCQkJc2NoaXpvX3BibV9pbml0KHAsIGRwLCBwb3J0aWQsIGNoaXBfdHlwZSk7CiAJCQlyZXR1cm47CiAJCX0KIAl9CiAKIAlwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBjaV9jb250cm9sbGVyX2luZm8pLCBHRlBfQVRPTUlDKTsKLQlpZiAoIXApIHsKLQkJcHJvbV9wcmludGYoIlNDSElaTzogRmF0YWwgbWVtb3J5IGFsbG9jYXRpb24gZXJyb3IuXG4iKTsKLQkJcHJvbV9oYWx0KCk7Ci0JfQorCWlmICghcCkKKwkJZ290byBtZW1mYWlsOwogCi0JaW9tbXUgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcGNpX2lvbW11KSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFpb21tdSkgewotCQlwcm9tX3ByaW50ZigiU0NISVpPOiBGYXRhbCBtZW1vcnkgYWxsb2NhdGlvbiBlcnJvci5cbiIpOwotCQlwcm9tX2hhbHQoKTsKLQl9CisJaW9tbXUgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaW9tbXUpLCBHRlBfQVRPTUlDKTsKKwlpZiAoIWlvbW11KQorCQlnb3RvIG1lbWZhaWw7CisKIAlwLT5wYm1fQS5pb21tdSA9IGlvbW11OwogCi0JaW9tbXUgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcGNpX2lvbW11KSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFpb21tdSkgewotCQlwcm9tX3ByaW50ZigiU0NISVpPOiBGYXRhbCBtZW1vcnkgYWxsb2NhdGlvbiBlcnJvci5cbiIpOwotCQlwcm9tX2hhbHQoKTsKLQl9CisJaW9tbXUgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaW9tbXUpLCBHRlBfQVRPTUlDKTsKKwlpZiAoIWlvbW11KQorCQlnb3RvIG1lbWZhaWw7CisKIAlwLT5wYm1fQi5pb21tdSA9IGlvbW11OwogCiAJcC0+bmV4dCA9IHBjaV9jb250cm9sbGVyX3Jvb3Q7CiAJcGNpX2NvbnRyb2xsZXJfcm9vdCA9IHA7CiAKIAlwLT5pbmRleCA9IHBjaV9udW1fY29udHJvbGxlcnMrKzsKLQlwLT5wYm1zX3NhbWVfZG9tYWluID0gMDsKLQlwLT5zY2FuX2J1cyA9IChjaGlwX3R5cGUgPT0gUEJNX0NISVBfVFlQRV9UT01BVElMTE8gPwotCQkgICAgICAgdG9tYXRpbGxvX3NjYW5fYnVzIDoKLQkJICAgICAgIHNjaGl6b19zY2FuX2J1cyk7Ci0JcC0+YmFzZV9hZGRyZXNzX3VwZGF0ZSA9IHNjaGl6b19iYXNlX2FkZHJlc3NfdXBkYXRlOwotCXAtPnJlc291cmNlX2FkanVzdCA9IHNjaGl6b19yZXNvdXJjZV9hZGp1c3Q7CisJcC0+c2Nhbl9idXMgPSBzY2hpem9fc2Nhbl9idXM7CiAJcC0+cGNpX29wcyA9ICZzY2hpem9fb3BzOwogCiAJLyogTGlrZSBQU1lDSE8gd2UgaGF2ZSBhIDJHQiBhbGlnbmVkIGFyZWEgZm9yIG1lbW9yeSBzcGFjZS4gKi8KIAlwY2lfbWVtc3BhY2VfbWFzayA9IDB4N2ZmZmZmZmZVTDsKIAogCXNjaGl6b19wYm1faW5pdChwLCBkcCwgcG9ydGlkLCBjaGlwX3R5cGUpOworCXJldHVybjsKKworbWVtZmFpbDoKKwlwcm9tX3ByaW50ZigiU0NISVpPOiBGYXRhbCBtZW1vcnkgYWxsb2NhdGlvbiBlcnJvci5cbiIpOworCXByb21faGFsdCgpOwogfQogCiB2b2lkIHNjaGl6b19pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAsIGNoYXIgKm1vZGVsX25hbWUpCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9zdW40di5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2lfc3VuNHYuYwppbmRleCBlYzIyY2Q2Li45NDI5NWMyIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9zdW40di5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX3N1bjR2LmMKQEAgLTEsNiArMSw2IEBACiAvKiBwY2lfc3VuNHYuYzogU1VONFYgc3BlY2lmaWMgUENJIGNvbnRyb2xsZXIgc3VwcG9ydC4KICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBkYXZlbWxvZnQubmV0KQorICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AZGF2ZW1sb2Z0Lm5ldCkKICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CkBAIC0yOSw3ICsyOSw3IEBACiAKICNkZWZpbmUgUEdMSVNUX05FTlRTCShQQUdFX1NJWkUgLyBzaXplb2YodTY0KSkKIAotc3RydWN0IHBjaV9pb21tdV9iYXRjaCB7CitzdHJ1Y3QgaW9tbXVfYmF0Y2ggewogCXN0cnVjdCBwY2lfZGV2CSpwZGV2OwkJLyogRGV2aWNlIG1hcHBpbmcgaXMgZm9yLgkqLwogCXVuc2lnbmVkIGxvbmcJcHJvdDsJCS8qIElPTU1VIHBhZ2UgcHJvdGVjdGlvbnMJKi8KIAl1bnNpZ25lZCBsb25nCWVudHJ5OwkJLyogSW5kZXggaW50byBJT1RTQi4JCSovCkBAIC0zNywxMiArMzcsMTIgQEAKIAl1bnNpZ25lZCBsb25nCW5wYWdlczsJCS8qIE51bWJlciBvZiBwYWdlcyBpbiBsaXN0LgkqLwogfTsKIAotc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBwY2lfaW9tbXVfYmF0Y2gsIHBjaV9pb21tdV9iYXRjaCk7CitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGlvbW11X2JhdGNoLCBwY2lfaW9tbXVfYmF0Y2gpOwogCiAvKiBJbnRlcnJ1cHRzIG11c3QgYmUgZGlzYWJsZWQuICAqLwogc3RhdGljIGlubGluZSB2b2lkIHBjaV9pb21tdV9iYXRjaF9zdGFydChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdW5zaWduZWQgbG9uZyBwcm90LCB1bnNpZ25lZCBsb25nIGVudHJ5KQogewotCXN0cnVjdCBwY2lfaW9tbXVfYmF0Y2ggKnAgPSAmX19nZXRfY3B1X3ZhcihwY2lfaW9tbXVfYmF0Y2gpOworCXN0cnVjdCBpb21tdV9iYXRjaCAqcCA9ICZfX2dldF9jcHVfdmFyKHBjaV9pb21tdV9iYXRjaCk7CiAKIAlwLT5wZGV2CQk9IHBkZXY7CiAJcC0+cHJvdAkJPSBwcm90OwpAQCAtNTEsMTAgKzUxLDEwIEBACiB9CiAKIC8qIEludGVycnVwdHMgbXVzdCBiZSBkaXNhYmxlZC4gICovCi1zdGF0aWMgbG9uZyBwY2lfaW9tbXVfYmF0Y2hfZmx1c2goc3RydWN0IHBjaV9pb21tdV9iYXRjaCAqcCkKK3N0YXRpYyBsb25nIHBjaV9pb21tdV9iYXRjaF9mbHVzaChzdHJ1Y3QgaW9tbXVfYmF0Y2ggKnApCiB7Ci0Jc3RydWN0IHBjaWRldl9jb29raWUgKnBjcCA9IHAtPnBkZXYtPnN5c2RhdGE7Ci0JdW5zaWduZWQgbG9uZyBkZXZoYW5kbGUgPSBwY3AtPnBibS0+ZGV2aGFuZGxlOworCXN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSA9IHAtPnBkZXYtPmRldi5hcmNoZGF0YS5ob3N0X2NvbnRyb2xsZXI7CisJdW5zaWduZWQgbG9uZyBkZXZoYW5kbGUgPSBwYm0tPmRldmhhbmRsZTsKIAl1bnNpZ25lZCBsb25nIHByb3QgPSBwLT5wcm90OwogCXVuc2lnbmVkIGxvbmcgZW50cnkgPSBwLT5lbnRyeTsKIAl1NjQgKnBnbGlzdCA9IHAtPnBnbGlzdDsKQEAgLTg5LDcgKzg5LDcgQEAKIC8qIEludGVycnVwdHMgbXVzdCBiZSBkaXNhYmxlZC4gICovCiBzdGF0aWMgaW5saW5lIGxvbmcgcGNpX2lvbW11X2JhdGNoX2FkZCh1NjQgcGh5c19wYWdlKQogewotCXN0cnVjdCBwY2lfaW9tbXVfYmF0Y2ggKnAgPSAmX19nZXRfY3B1X3ZhcihwY2lfaW9tbXVfYmF0Y2gpOworCXN0cnVjdCBpb21tdV9iYXRjaCAqcCA9ICZfX2dldF9jcHVfdmFyKHBjaV9pb21tdV9iYXRjaCk7CiAKIAlCVUdfT04ocC0+bnBhZ2VzID49IFBHTElTVF9ORU5UUyk7CiAKQEAgLTEwMywxNCArMTAzLDE0IEBACiAvKiBJbnRlcnJ1cHRzIG11c3QgYmUgZGlzYWJsZWQuICAqLwogc3RhdGljIGlubGluZSBsb25nIHBjaV9pb21tdV9iYXRjaF9lbmQodm9pZCkKIHsKLQlzdHJ1Y3QgcGNpX2lvbW11X2JhdGNoICpwID0gJl9fZ2V0X2NwdV92YXIocGNpX2lvbW11X2JhdGNoKTsKKwlzdHJ1Y3QgaW9tbXVfYmF0Y2ggKnAgPSAmX19nZXRfY3B1X3ZhcihwY2lfaW9tbXVfYmF0Y2gpOwogCiAJQlVHX09OKHAtPm5wYWdlcyA+PSBQR0xJU1RfTkVOVFMpOwogCiAJcmV0dXJuIHBjaV9pb21tdV9iYXRjaF9mbHVzaChwKTsKIH0KIAotc3RhdGljIGxvbmcgcGNpX2FyZW5hX2FsbG9jKHN0cnVjdCBwY2lfaW9tbXVfYXJlbmEgKmFyZW5hLCB1bnNpZ25lZCBsb25nIG5wYWdlcykKK3N0YXRpYyBsb25nIHBjaV9hcmVuYV9hbGxvYyhzdHJ1Y3QgaW9tbXVfYXJlbmEgKmFyZW5hLCB1bnNpZ25lZCBsb25nIG5wYWdlcykKIHsKIAl1bnNpZ25lZCBsb25nIG4sIGksIHN0YXJ0LCBlbmQsIGxpbWl0OwogCWludCBwYXNzOwpAQCAtMTQ5LDcgKzE0OSw3IEBACiAJcmV0dXJuIG47CiB9CiAKLXN0YXRpYyB2b2lkIHBjaV9hcmVuYV9mcmVlKHN0cnVjdCBwY2lfaW9tbXVfYXJlbmEgKmFyZW5hLCB1bnNpZ25lZCBsb25nIGJhc2UsIHVuc2lnbmVkIGxvbmcgbnBhZ2VzKQorc3RhdGljIHZvaWQgcGNpX2FyZW5hX2ZyZWUoc3RydWN0IGlvbW11X2FyZW5hICphcmVuYSwgdW5zaWduZWQgbG9uZyBiYXNlLCB1bnNpZ25lZCBsb25nIG5wYWdlcykKIHsKIAl1bnNpZ25lZCBsb25nIGk7CiAKQEAgLTE1OSw4ICsxNTksNyBAQAogCiBzdGF0aWMgdm9pZCAqcGNpXzR2X2FsbG9jX2NvbnNpc3RlbnQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHNpemVfdCBzaXplLCBkbWFfYWRkcl90ICpkbWFfYWRkcnAsIGdmcF90IGdmcCkKIHsKLQlzdHJ1Y3QgcGNpZGV2X2Nvb2tpZSAqcGNwOwotCXN0cnVjdCBwY2lfaW9tbXUgKmlvbW11OworCXN0cnVjdCBpb21tdSAqaW9tbXU7CiAJdW5zaWduZWQgbG9uZyBmbGFncywgb3JkZXIsIGZpcnN0X3BhZ2UsIG5wYWdlcywgbjsKIAl2b2lkICpyZXQ7CiAJbG9uZyBlbnRyeTsKQEAgLTE3OCw4ICsxNzcsNyBAQAogCiAJbWVtc2V0KChjaGFyICopZmlyc3RfcGFnZSwgMCwgUEFHRV9TSVpFIDw8IG9yZGVyKTsKIAotCXBjcCA9IHBkZXYtPnN5c2RhdGE7Ci0JaW9tbXUgPSBwY3AtPnBibS0+aW9tbXU7CisJaW9tbXUgPSBwZGV2LT5kZXYuYXJjaGRhdGEuaW9tbXU7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaW9tbXUtPmxvY2ssIGZsYWdzKTsKIAllbnRyeSA9IHBjaV9hcmVuYV9hbGxvYygmaW9tbXUtPmFyZW5hLCBucGFnZXMpOwpAQCAtMjI2LDE1ICsyMjQsMTUgQEAKIAogc3RhdGljIHZvaWQgcGNpXzR2X2ZyZWVfY29uc2lzdGVudChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc2l6ZV90IHNpemUsIHZvaWQgKmNwdSwgZG1hX2FkZHJfdCBkdm1hKQogewotCXN0cnVjdCBwY2lkZXZfY29va2llICpwY3A7Ci0Jc3RydWN0IHBjaV9pb21tdSAqaW9tbXU7CisJc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtOworCXN0cnVjdCBpb21tdSAqaW9tbXU7CiAJdW5zaWduZWQgbG9uZyBmbGFncywgb3JkZXIsIG5wYWdlcywgZW50cnk7CiAJdTMyIGRldmhhbmRsZTsKIAogCW5wYWdlcyA9IElPX1BBR0VfQUxJR04oc2l6ZSkgPj4gSU9fUEFHRV9TSElGVDsKLQlwY3AgPSBwZGV2LT5zeXNkYXRhOwotCWlvbW11ID0gcGNwLT5wYm0tPmlvbW11OwotCWRldmhhbmRsZSA9IHBjcC0+cGJtLT5kZXZoYW5kbGU7CisJaW9tbXUgPSBwZGV2LT5kZXYuYXJjaGRhdGEuaW9tbXU7CisJcGJtID0gcGRldi0+ZGV2LmFyY2hkYXRhLmhvc3RfY29udHJvbGxlcjsKKwlkZXZoYW5kbGUgPSBwYm0tPmRldmhhbmRsZTsKIAllbnRyeSA9ICgoZHZtYSAtIGlvbW11LT5wYWdlX3RhYmxlX21hcF9iYXNlKSA+PiBJT19QQUdFX1NISUZUKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZpb21tdS0+bG9jaywgZmxhZ3MpOwpAQCAtMjU5LDE2ICsyNTcsMTQgQEAKIAogc3RhdGljIGRtYV9hZGRyX3QgcGNpXzR2X21hcF9zaW5nbGUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHZvaWQgKnB0ciwgc2l6ZV90IHN6LCBpbnQgZGlyZWN0aW9uKQogewotCXN0cnVjdCBwY2lkZXZfY29va2llICpwY3A7Ci0Jc3RydWN0IHBjaV9pb21tdSAqaW9tbXU7CisJc3RydWN0IGlvbW11ICppb21tdTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzLCBucGFnZXMsIG9hZGRyOwogCXVuc2lnbmVkIGxvbmcgaSwgYmFzZV9wYWRkcjsKIAl1MzIgYnVzX2FkZHIsIHJldDsKIAl1bnNpZ25lZCBsb25nIHByb3Q7CiAJbG9uZyBlbnRyeTsKIAotCXBjcCA9IHBkZXYtPnN5c2RhdGE7Ci0JaW9tbXUgPSBwY3AtPnBibS0+aW9tbXU7CisJaW9tbXUgPSBwZGV2LT5kZXYuYXJjaGRhdGEuaW9tbXU7CiAKIAlpZiAodW5saWtlbHkoZGlyZWN0aW9uID09IFBDSV9ETUFfTk9ORSkpCiAJCWdvdG8gYmFkOwpAQCAtMzI0LDggKzMyMCw4IEBACiAKIHN0YXRpYyB2b2lkIHBjaV80dl91bm1hcF9zaW5nbGUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGRtYV9hZGRyX3QgYnVzX2FkZHIsIHNpemVfdCBzeiwgaW50IGRpcmVjdGlvbikKIHsKLQlzdHJ1Y3QgcGNpZGV2X2Nvb2tpZSAqcGNwOwotCXN0cnVjdCBwY2lfaW9tbXUgKmlvbW11OworCXN0cnVjdCBwY2lfcGJtX2luZm8gKnBibTsKKwlzdHJ1Y3QgaW9tbXUgKmlvbW11OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIG5wYWdlczsKIAlsb25nIGVudHJ5OwogCXUzMiBkZXZoYW5kbGU7CkBAIC0zMzYsOSArMzMyLDkgQEAKIAkJcmV0dXJuOwogCX0KIAotCXBjcCA9IHBkZXYtPnN5c2RhdGE7Ci0JaW9tbXUgPSBwY3AtPnBibS0+aW9tbXU7Ci0JZGV2aGFuZGxlID0gcGNwLT5wYm0tPmRldmhhbmRsZTsKKwlpb21tdSA9IHBkZXYtPmRldi5hcmNoZGF0YS5pb21tdTsKKwlwYm0gPSBwZGV2LT5kZXYuYXJjaGRhdGEuaG9zdF9jb250cm9sbGVyOworCWRldmhhbmRsZSA9IHBibS0+ZGV2aGFuZGxlOwogCiAJbnBhZ2VzID0gSU9fUEFHRV9BTElHTihidXNfYWRkciArIHN6KSAtIChidXNfYWRkciAmIElPX1BBR0VfTUFTSyk7CiAJbnBhZ2VzID4+PSBJT19QQUdFX1NISUZUOwpAQCAtNDYwLDggKzQ1Niw3IEBACiAKIHN0YXRpYyBpbnQgcGNpXzR2X21hcF9zZyhzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2xpc3QsIGludCBuZWxlbXMsIGludCBkaXJlY3Rpb24pCiB7Ci0Jc3RydWN0IHBjaWRldl9jb29raWUgKnBjcDsKLQlzdHJ1Y3QgcGNpX2lvbW11ICppb21tdTsKKwlzdHJ1Y3QgaW9tbXUgKmlvbW11OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIG5wYWdlcywgcHJvdDsKIAl1MzIgZG1hX2Jhc2U7CiAJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ3RtcDsKQEAgLTQ4MCw4ICs0NzUsNyBAQAogCQlyZXR1cm4gMTsKIAl9CiAKLQlwY3AgPSBwZGV2LT5zeXNkYXRhOwotCWlvbW11ID0gcGNwLT5wYm0tPmlvbW11OworCWlvbW11ID0gcGRldi0+ZGV2LmFyY2hkYXRhLmlvbW11OwogCQogCWlmICh1bmxpa2VseShkaXJlY3Rpb24gPT0gUENJX0RNQV9OT05FKSkKIAkJZ290byBiYWQ7CkBAIC01MzcsOCArNTMxLDggQEAKIAogc3RhdGljIHZvaWQgcGNpXzR2X3VubWFwX3NnKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbGlzdCwgaW50IG5lbGVtcywgaW50IGRpcmVjdGlvbikKIHsKLQlzdHJ1Y3QgcGNpZGV2X2Nvb2tpZSAqcGNwOwotCXN0cnVjdCBwY2lfaW9tbXUgKmlvbW11OworCXN0cnVjdCBwY2lfcGJtX2luZm8gKnBibTsKKwlzdHJ1Y3QgaW9tbXUgKmlvbW11OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGksIG5wYWdlczsKIAlsb25nIGVudHJ5OwogCXUzMiBkZXZoYW5kbGUsIGJ1c19hZGRyOwpAQCAtNTQ4LDkgKzU0Miw5IEBACiAJCQlXQVJOX09OKDEpOwogCX0KIAotCXBjcCA9IHBkZXYtPnN5c2RhdGE7Ci0JaW9tbXUgPSBwY3AtPnBibS0+aW9tbXU7Ci0JZGV2aGFuZGxlID0gcGNwLT5wYm0tPmRldmhhbmRsZTsKKwlpb21tdSA9IHBkZXYtPmRldi5hcmNoZGF0YS5pb21tdTsKKwlwYm0gPSBwZGV2LT5kZXYuYXJjaGRhdGEuaG9zdF9jb250cm9sbGVyOworCWRldmhhbmRsZSA9IHBibS0+ZGV2aGFuZGxlOwogCQogCWJ1c19hZGRyID0gc2dsaXN0LT5kbWFfYWRkcmVzcyAmIElPX1BBR0VfTUFTSzsKIApAQCAtNTg5LDcgKzU4Myw3IEBACiAJLyogTm90aGluZyB0byBkby4uLiAqLwogfQogCi1zdHJ1Y3QgcGNpX2lvbW11X29wcyBwY2lfc3VuNHZfaW9tbXVfb3BzID0geworY29uc3Qgc3RydWN0IHBjaV9pb21tdV9vcHMgcGNpX3N1bjR2X2lvbW11X29wcyA9IHsKIAkuYWxsb2NfY29uc2lzdGVudAkJPSBwY2lfNHZfYWxsb2NfY29uc2lzdGVudCwKIAkuZnJlZV9jb25zaXN0ZW50CQk9IHBjaV80dl9mcmVlX2NvbnNpc3RlbnQsCiAJLm1hcF9zaW5nbGUJCQk9IHBjaV80dl9tYXBfc2luZ2xlLApAQCAtNjAwLDEzMiArNTk0LDEyIEBACiAJLmRtYV9zeW5jX3NnX2Zvcl9jcHUJCT0gcGNpXzR2X2RtYV9zeW5jX3NnX2Zvcl9jcHUsCiB9OwogCi0vKiBTVU40ViBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZSBhY2Nlc3NvcnMuICovCi0KLXN0cnVjdCBwZGV2X2VudHJ5IHsKLQlzdHJ1Y3QgcGRldl9lbnRyeQkqbmV4dDsKLQl1MzIJCQlkZXZoYW5kbGU7Ci0JdW5zaWduZWQgaW50CQlidXM7Ci0JdW5zaWduZWQgaW50CQlkZXZpY2U7Ci0JdW5zaWduZWQgaW50CQlmdW5jOwotfTsKLQotI2RlZmluZSBQREVWX0hUQUJfU0laRQkxNgotI2RlZmluZSBQREVWX0hUQUJfTUFTSwkoUERFVl9IVEFCX1NJWkUgLSAxKQotc3RhdGljIHN0cnVjdCBwZGV2X2VudHJ5ICpwZGV2X2h0YWJbUERFVl9IVEFCX1NJWkVdOwotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBwZGV2X2hhc2hmbih1MzIgZGV2aGFuZGxlLCB1bnNpZ25lZCBpbnQgYnVzLCB1bnNpZ25lZCBpbnQgZGV2aWNlLCB1bnNpZ25lZCBpbnQgZnVuYykKLXsKLQl1bnNpZ25lZCBpbnQgdmFsOwotCi0JdmFsID0gKGRldmhhbmRsZSBeIChkZXZoYW5kbGUgPj4gNCkpOwotCXZhbCBePSBidXM7Ci0JdmFsIF49IGRldmljZTsKLQl2YWwgXj0gZnVuYzsKLQotCXJldHVybiB2YWwgJiBQREVWX0hUQUJfTUFTSzsKLX0KLQotc3RhdGljIGludCBwZGV2X2h0YWJfYWRkKHUzMiBkZXZoYW5kbGUsIHVuc2lnbmVkIGludCBidXMsIHVuc2lnbmVkIGludCBkZXZpY2UsIHVuc2lnbmVkIGludCBmdW5jKQotewotCXN0cnVjdCBwZGV2X2VudHJ5ICpwID0ga21hbGxvYyhzaXplb2YoKnApLCBHRlBfS0VSTkVMKTsKLQlzdHJ1Y3QgcGRldl9lbnRyeSAqKnNsb3Q7Ci0KLQlpZiAoIXApCi0JCXJldHVybiAtRU5PTUVNOwotCi0Jc2xvdCA9ICZwZGV2X2h0YWJbcGRldl9oYXNoZm4oZGV2aGFuZGxlLCBidXMsIGRldmljZSwgZnVuYyldOwotCXAtPm5leHQgPSAqc2xvdDsKLQkqc2xvdCA9IHA7Ci0KLQlwLT5kZXZoYW5kbGUgPSBkZXZoYW5kbGU7Ci0JcC0+YnVzID0gYnVzOwotCXAtPmRldmljZSA9IGRldmljZTsKLQlwLT5mdW5jID0gZnVuYzsKLQotCXJldHVybiAwOwotfQotCi0vKiBSZWN1cnNpdmVseSBkZXNjZW5kIGludG8gdGhlIE9CUCBkZXZpY2UgdHJlZSwgcm9vdGVkIGF0IHRvcGxldmVsX25vZGUsCi0gKiBsb29raW5nIGZvciBhIFBDSSBkZXZpY2UgbWF0Y2hpbmcgYnVzIGFuZCBkZXZmbi4KLSAqLwotc3RhdGljIGludCBvYnBfZmluZChzdHJ1Y3QgZGV2aWNlX25vZGUgKnRvcGxldmVsX25vZGUsIHVuc2lnbmVkIGludCBidXMsIHVuc2lnbmVkIGludCBkZXZmbikKLXsKLQl0b3BsZXZlbF9ub2RlID0gdG9wbGV2ZWxfbm9kZS0+Y2hpbGQ7Ci0KLQl3aGlsZSAodG9wbGV2ZWxfbm9kZSAhPSBOVUxMKSB7Ci0JCXN0cnVjdCBsaW51eF9wcm9tX3BjaV9yZWdpc3RlcnMgKnJlZ3M7Ci0JCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKLQkJaW50IHJldDsKLQotCQlyZXQgPSBvYnBfZmluZCh0b3BsZXZlbF9ub2RlLCBidXMsIGRldmZuKTsKLQkJaWYgKHJldCAhPSAwKQotCQkJcmV0dXJuIHJldDsKLQotCQlwcm9wID0gb2ZfZmluZF9wcm9wZXJ0eSh0b3BsZXZlbF9ub2RlLCAicmVnIiwgTlVMTCk7Ci0JCWlmICghcHJvcCkKLQkJCWdvdG8gbmV4dF9zaWJsaW5nOwotCi0JCXJlZ3MgPSBwcm9wLT52YWx1ZTsKLQkJaWYgKCgocmVncy0+cGh5c19oaSA+PiAxNikgJiAweGZmKSA9PSBidXMgJiYKLQkJICAgICgocmVncy0+cGh5c19oaSA+PiA4KSAmIDB4ZmYpID09IGRldmZuKQotCQkJYnJlYWs7Ci0KLQluZXh0X3NpYmxpbmc6Ci0JCXRvcGxldmVsX25vZGUgPSB0b3BsZXZlbF9ub2RlLT5zaWJsaW5nOwotCX0KLQotCXJldHVybiB0b3BsZXZlbF9ub2RlICE9IE5VTEw7Ci19Ci0KLXN0YXRpYyBpbnQgcGRldl9odGFiX3BvcHVsYXRlKHN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSkKLXsKLQl1MzIgZGV2aGFuZGxlID0gcGJtLT5kZXZoYW5kbGU7Ci0JdW5zaWduZWQgaW50IGJ1czsKLQotCWZvciAoYnVzID0gcGJtLT5wY2lfZmlyc3RfYnVzbm87IGJ1cyA8PSBwYm0tPnBjaV9sYXN0X2J1c25vOyBidXMrKykgewotCQl1bnNpZ25lZCBpbnQgZGV2Zm47Ci0KLQkJZm9yIChkZXZmbiA9IDA7IGRldmZuIDwgMjU2OyBkZXZmbisrKSB7Ci0JCQl1bnNpZ25lZCBpbnQgZGV2aWNlID0gUENJX1NMT1QoZGV2Zm4pOwotCQkJdW5zaWduZWQgaW50IGZ1bmMgPSBQQ0lfRlVOQyhkZXZmbik7Ci0KLQkJCWlmIChvYnBfZmluZChwYm0tPnByb21fbm9kZSwgYnVzLCBkZXZmbikpIHsKLQkJCQlpbnQgZXJyID0gcGRldl9odGFiX2FkZChkZXZoYW5kbGUsIGJ1cywKLQkJCQkJCQlkZXZpY2UsIGZ1bmMpOwotCQkJCWlmIChlcnIpCi0JCQkJCXJldHVybiBlcnI7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBwZGV2X2VudHJ5ICpwZGV2X2ZpbmQodTMyIGRldmhhbmRsZSwgdW5zaWduZWQgaW50IGJ1cywgdW5zaWduZWQgaW50IGRldmljZSwgdW5zaWduZWQgaW50IGZ1bmMpCi17Ci0Jc3RydWN0IHBkZXZfZW50cnkgKnA7Ci0KLQlwID0gcGRldl9odGFiW3BkZXZfaGFzaGZuKGRldmhhbmRsZSwgYnVzLCBkZXZpY2UsIGZ1bmMpXTsKLQl3aGlsZSAocCkgewotCQlpZiAocC0+ZGV2aGFuZGxlID09IGRldmhhbmRsZSAmJgotCQkgICAgcC0+YnVzID09IGJ1cyAmJgotCQkgICAgcC0+ZGV2aWNlID09IGRldmljZSAmJgotCQkgICAgcC0+ZnVuYyA9PSBmdW5jKQotCQkJYnJlYWs7Ci0KLQkJcCA9IHAtPm5leHQ7Ci0JfQotCi0JcmV0dXJuIHA7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgaW50IHBjaV9zdW40dl9vdXRfb2ZfcmFuZ2Uoc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtLCB1bnNpZ25lZCBpbnQgYnVzLCB1bnNpZ25lZCBpbnQgZGV2aWNlLCB1bnNpZ25lZCBpbnQgZnVuYykKIHsKIAlpZiAoYnVzIDwgcGJtLT5wY2lfZmlyc3RfYnVzbm8gfHwKIAkgICAgYnVzID4gcGJtLT5wY2lfbGFzdF9idXNubykKIAkJcmV0dXJuIDE7Ci0JcmV0dXJuIHBkZXZfZmluZChwYm0tPmRldmhhbmRsZSwgYnVzLCBkZXZpY2UsIGZ1bmMpID09IE5VTEw7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgcGNpX3N1bjR2X3JlYWRfcGNpX2NmZyhzdHJ1Y3QgcGNpX2J1cyAqYnVzX2RldiwgdW5zaWduZWQgaW50IGRldmZuLApAQCAtNzM4LDYgKzYxMiw5IEBACiAJdW5zaWduZWQgaW50IGZ1bmMgPSBQQ0lfRlVOQyhkZXZmbik7CiAJdW5zaWduZWQgbG9uZyByZXQ7CiAKKwlpZiAoYnVzX2RldiA9PSBwYm0tPnBjaV9idXMgJiYgZGV2Zm4gPT0gMHgwMCkKKwkJcmV0dXJuIHBjaV9ob3N0X2JyaWRnZV9yZWFkX3BjaV9jZmcoYnVzX2RldiwgZGV2Zm4sIHdoZXJlLAorCQkJCQkJICAgIHNpemUsIHZhbHVlKTsKIAlpZiAocGNpX3N1bjR2X291dF9vZl9yYW5nZShwYm0sIGJ1cywgZGV2aWNlLCBmdW5jKSkgewogCQlyZXQgPSB+MFVMOwogCX0gZWxzZSB7CkBAIC03NzYsNiArNjUzLDkgQEAKIAl1bnNpZ25lZCBpbnQgZnVuYyA9IFBDSV9GVU5DKGRldmZuKTsKIAl1bnNpZ25lZCBsb25nIHJldDsKIAorCWlmIChidXNfZGV2ID09IHBibS0+cGNpX2J1cyAmJiBkZXZmbiA9PSAweDAwKQorCQlyZXR1cm4gcGNpX2hvc3RfYnJpZGdlX3dyaXRlX3BjaV9jZmcoYnVzX2RldiwgZGV2Zm4sIHdoZXJlLAorCQkJCQkJICAgICBzaXplLCB2YWx1ZSk7CiAJaWYgKHBjaV9zdW40dl9vdXRfb2ZfcmFuZ2UocGJtLCBidXMsIGRldmljZSwgZnVuYykpIHsKIAkJLyogRG8gbm90aGluZy4gKi8KIAl9IGVsc2UgewpAQCAtODAwLDI3ICs2ODAsNyBAQAogc3RhdGljIHZvaWQgcGJtX3NjYW5fYnVzKHN0cnVjdCBwY2lfY29udHJvbGxlcl9pbmZvICpwLAogCQkJIHN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSkKIHsKLQlzdHJ1Y3QgcGNpZGV2X2Nvb2tpZSAqY29va2llID0ga3phbGxvYyhzaXplb2YoKmNvb2tpZSksIEdGUF9LRVJORUwpOwotCi0JaWYgKCFjb29raWUpIHsKLQkJcHJvbV9wcmludGYoIiVzOiBDcml0aWNhbCBhbGxvY2F0aW9uIGZhaWx1cmUuXG4iLCBwYm0tPm5hbWUpOwotCQlwcm9tX2hhbHQoKTsKLQl9Ci0KLQkvKiBBbGwgd2UgY2FyZSBhYm91dCBpcyB0aGUgUEJNLiAqLwotCWNvb2tpZS0+cGJtID0gcGJtOwotCi0JcGJtLT5wY2lfYnVzID0gcGNpX3NjYW5fYnVzKHBibS0+cGNpX2ZpcnN0X2J1c25vLCBwLT5wY2lfb3BzLCBwYm0pOwotI2lmIDAKLQlwY2lfZml4dXBfaG9zdF9icmlkZ2Vfc2VsZihwYm0tPnBjaV9idXMpOwotCXBibS0+cGNpX2J1cy0+c2VsZi0+c3lzZGF0YSA9IGNvb2tpZTsKLSNlbmRpZgotCXBjaV9maWxsX2luX3BibV9jb29raWVzKHBibS0+cGNpX2J1cywgcGJtLCBwYm0tPnByb21fbm9kZSk7Ci0JcGNpX3JlY29yZF9hc3NpZ25tZW50cyhwYm0sIHBibS0+cGNpX2J1cyk7Ci0JcGNpX2Fzc2lnbl91bmFzc2lnbmVkKHBibSwgcGJtLT5wY2lfYnVzKTsKLQlwY2lfZml4dXBfaXJxKHBibSwgcGJtLT5wY2lfYnVzKTsKLQlwY2lfZGV0ZXJtaW5lXzY2bWh6X2Rpc3Bvc2l0aW9uKHBibSwgcGJtLT5wY2lfYnVzKTsKLQlwY2lfc2V0dXBfYnVzbWFzdGVyaW5nKHBibSwgcGJtLT5wY2lfYnVzKTsKKwlwYm0tPnBjaV9idXMgPSBwY2lfc2Nhbl9vbmVfcGJtKHBibSk7CiB9CiAKIHN0YXRpYyB2b2lkIHBjaV9zdW40dl9zY2FuX2J1cyhzdHJ1Y3QgcGNpX2NvbnRyb2xsZXJfaW5mbyAqcCkKQEAgLTg0NCwxMzAgKzcwNCwxMCBAQAogCS8qIFhYWCByZWdpc3RlciBlcnJvciBpbnRlcnJ1cHQgaGFuZGxlcnMgWFhYICovCiB9CiAKLXN0YXRpYyB2b2lkIHBjaV9zdW40dl9iYXNlX2FkZHJlc3NfdXBkYXRlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgcmVzb3VyY2UpCi17Ci0Jc3RydWN0IHBjaWRldl9jb29raWUgKnBjcCA9IHBkZXYtPnN5c2RhdGE7Ci0Jc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtID0gcGNwLT5wYm07Ci0Jc3RydWN0IHJlc291cmNlICpyZXMsICpyb290OwotCXUzMiByZWc7Ci0JaW50IHdoZXJlLCBzaXplLCBpc182NGJpdDsKLQotCXJlcyA9ICZwZGV2LT5yZXNvdXJjZVtyZXNvdXJjZV07Ci0JaWYgKHJlc291cmNlIDwgNikgewotCQl3aGVyZSA9IFBDSV9CQVNFX0FERFJFU1NfMCArIChyZXNvdXJjZSAqIDQpOwotCX0gZWxzZSBpZiAocmVzb3VyY2UgPT0gUENJX1JPTV9SRVNPVVJDRSkgewotCQl3aGVyZSA9IHBkZXYtPnJvbV9iYXNlX3JlZzsKLQl9IGVsc2UgewotCQkvKiBTb21lYm9keSBtaWdodCBoYXZlIGFza2VkIGFsbG9jYXRpb24gb2YgYSBub24tc3RhbmRhcmQgcmVzb3VyY2UgKi8KLQkJcmV0dXJuOwotCX0KLQotCS8qIFhYWCA2NC1iaXQgTUVNIGhhbmRsaW5nIGlzIG5vdCAlMTAwIGNvcnJlY3QuLi4gWFhYICovCi0JaXNfNjRiaXQgPSAwOwotCWlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9JTykKLQkJcm9vdCA9ICZwYm0tPmlvX3NwYWNlOwotCWVsc2UgewotCQlyb290ID0gJnBibS0+bWVtX3NwYWNlOwotCQlpZiAoKHJlcy0+ZmxhZ3MgJiBQQ0lfQkFTRV9BRERSRVNTX01FTV9UWVBFX01BU0spCi0JCSAgICA9PSBQQ0lfQkFTRV9BRERSRVNTX01FTV9UWVBFXzY0KQotCQkJaXNfNjRiaXQgPSAxOwotCX0KLQotCXNpemUgPSByZXMtPmVuZCAtIHJlcy0+c3RhcnQ7Ci0JcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIHdoZXJlLCAmcmVnKTsKLQlyZWcgPSAoKHJlZyAmIHNpemUpIHwKLQkgICAgICAgKCgodTMyKShyZXMtPnN0YXJ0IC0gcm9vdC0+c3RhcnQpKSAmIH5zaXplKSk7Ci0JaWYgKHJlc291cmNlID09IFBDSV9ST01fUkVTT1VSQ0UpIHsKLQkJcmVnIHw9IFBDSV9ST01fQUREUkVTU19FTkFCTEU7Ci0JCXJlcy0+ZmxhZ3MgfD0gSU9SRVNPVVJDRV9ST01fRU5BQkxFOwotCX0KLQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIHdoZXJlLCByZWcpOwotCi0JLyogVGhpcyBrbm93cyB0aGF0IHRoZSB1cHBlciAzMi1iaXRzIG9mIHRoZSBhZGRyZXNzCi0JICogbXVzdCBiZSB6ZXJvLiAgT3VyIFBDSSBjb21tb24gbGF5ZXIgZW5mb3JjZXMgdGhpcy4KLQkgKi8KLQlpZiAoaXNfNjRiaXQpCi0JCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgd2hlcmUgKyA0LCAwKTsKLX0KLQotc3RhdGljIHZvaWQgcGNpX3N1bjR2X3Jlc291cmNlX2FkanVzdChzdHJ1Y3QgcGNpX2RldiAqcGRldiwKLQkJCQkgICAgICBzdHJ1Y3QgcmVzb3VyY2UgKnJlcywKLQkJCQkgICAgICBzdHJ1Y3QgcmVzb3VyY2UgKnJvb3QpCi17Ci0JcmVzLT5zdGFydCArPSByb290LT5zdGFydDsKLQlyZXMtPmVuZCArPSByb290LT5zdGFydDsKLX0KLQotLyogVXNlIHJhbmdlcyBwcm9wZXJ0eSB0byBkZXRlcm1pbmUgd2hlcmUgUENJIE1FTSwgSS9PLCBhbmQgQ29uZmlnCi0gKiBzcGFjZSBhcmUgZm9yIHRoaXMgUENJIGJ1cyBtb2R1bGUuCi0gKi8KLXN0YXRpYyB2b2lkIHBjaV9zdW40dl9kZXRlcm1pbmVfbWVtX2lvX3NwYWNlKHN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSkKLXsKLQlpbnQgaSwgc2F3X21lbSwgc2F3X2lvOwotCi0Jc2F3X21lbSA9IHNhd19pbyA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IHBibS0+bnVtX3BibV9yYW5nZXM7IGkrKykgewotCQlzdHJ1Y3QgbGludXhfcHJvbV9wY2lfcmFuZ2VzICpwciA9ICZwYm0tPnBibV9yYW5nZXNbaV07Ci0JCXVuc2lnbmVkIGxvbmcgYTsKLQkJaW50IHR5cGU7Ci0KLQkJdHlwZSA9IChwci0+Y2hpbGRfcGh5c19oaSA+PiAyNCkgJiAweDM7Ci0JCWEgPSAoKCh1bnNpZ25lZCBsb25nKXByLT5wYXJlbnRfcGh5c19oaSA8PCAzMlVMKSB8Ci0JCSAgICAgKCh1bnNpZ25lZCBsb25nKXByLT5wYXJlbnRfcGh5c19sbyAgPDwgIDBVTCkpOwotCi0JCXN3aXRjaCAodHlwZSkgewotCQljYXNlIDE6Ci0JCQkvKiAxNi1iaXQgSU8gc3BhY2UsIDE2TUIgKi8KLQkJCXBibS0+aW9fc3BhY2Uuc3RhcnQgPSBhOwotCQkJcGJtLT5pb19zcGFjZS5lbmQgPSBhICsgKCgxNlVMKjEwMjRVTCoxMDI0VUwpIC0gMVVMKTsKLQkJCXBibS0+aW9fc3BhY2UuZmxhZ3MgPSBJT1JFU09VUkNFX0lPOwotCQkJc2F3X2lvID0gMTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgMjoKLQkJCS8qIDMyLWJpdCBNRU0gc3BhY2UsIDJHQiAqLwotCQkJcGJtLT5tZW1fc3BhY2Uuc3RhcnQgPSBhOwotCQkJcGJtLT5tZW1fc3BhY2UuZW5kID0gYSArICgweDgwMDAwMDAwVUwgLSAxVUwpOwotCQkJcGJtLT5tZW1fc3BhY2UuZmxhZ3MgPSBJT1JFU09VUkNFX01FTTsKLQkJCXNhd19tZW0gPSAxOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSAzOgotCQkJLyogWFhYIDY0LWJpdCBNRU0gaGFuZGxpbmcgWFhYICovCi0KLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCQl9OwotCX0KLQotCWlmICghc2F3X2lvIHx8ICFzYXdfbWVtKSB7Ci0JCXByb21fcHJpbnRmKCIlczogRmF0YWwgZXJyb3IsIG1pc3NpbmcgJXMgUEJNIHJhbmdlLlxuIiwKLQkJCSAgICBwYm0tPm5hbWUsCi0JCQkgICAgKCFzYXdfaW8gPyAiSU8iIDogIk1FTSIpKTsKLQkJcHJvbV9oYWx0KCk7Ci0JfQotCi0JcHJpbnRrKCIlczogUENJIElPWyVseF0gTUVNWyVseF1cbiIsCi0JICAgICAgIHBibS0+bmFtZSwKLQkgICAgICAgcGJtLT5pb19zcGFjZS5zdGFydCwKLQkgICAgICAgcGJtLT5tZW1fc3BhY2Uuc3RhcnQpOwotfQotCi1zdGF0aWMgdm9pZCBwYm1fcmVnaXN0ZXJfdG9wbGV2ZWxfcmVzb3VyY2VzKHN0cnVjdCBwY2lfY29udHJvbGxlcl9pbmZvICpwLAotCQkJCQkgICAgc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtKQotewotCXBibS0+aW9fc3BhY2UubmFtZSA9IHBibS0+bWVtX3NwYWNlLm5hbWUgPSBwYm0tPm5hbWU7Ci0KLQlyZXF1ZXN0X3Jlc291cmNlKCZpb3BvcnRfcmVzb3VyY2UsICZwYm0tPmlvX3NwYWNlKTsKLQlyZXF1ZXN0X3Jlc291cmNlKCZpb21lbV9yZXNvdXJjZSwgJnBibS0+bWVtX3NwYWNlKTsKLQlwY2lfcmVnaXN0ZXJfbGVnYWN5X3JlZ2lvbnMoJnBibS0+aW9fc3BhY2UsCi0JCQkJICAgICZwYm0tPm1lbV9zcGFjZSk7Ci19Ci0KIHN0YXRpYyB1bnNpZ25lZCBsb25nIHByb2JlX2V4aXN0aW5nX2VudHJpZXMoc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtLAotCQkJCQkgICAgc3RydWN0IHBjaV9pb21tdSAqaW9tbXUpCisJCQkJCSAgICBzdHJ1Y3QgaW9tbXUgKmlvbW11KQogewotCXN0cnVjdCBwY2lfaW9tbXVfYXJlbmEgKmFyZW5hID0gJmlvbW11LT5hcmVuYTsKKwlzdHJ1Y3QgaW9tbXVfYXJlbmEgKmFyZW5hID0gJmlvbW11LT5hcmVuYTsKIAl1bnNpZ25lZCBsb25nIGksIGNudCA9IDA7CiAJdTMyIGRldmhhbmRsZTsKIApAQCAtOTk0LDcgKzczNCw3IEBACiAKIHN0YXRpYyB2b2lkIHBjaV9zdW40dl9pb21tdV9pbml0KHN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSkKIHsKLQlzdHJ1Y3QgcGNpX2lvbW11ICppb21tdSA9IHBibS0+aW9tbXU7CisJc3RydWN0IGlvbW11ICppb21tdSA9IHBibS0+aW9tbXU7CiAJc3RydWN0IHByb3BlcnR5ICpwcm9wOwogCXVuc2lnbmVkIGxvbmcgbnVtX3RzYl9lbnRyaWVzLCBzejsKIAl1MzIgdmRtYVsyXSwgZG1hX21hc2ssIGRtYV9vZmZzZXQ7CkBAIC0xMjgxLDcgKzEwMjEsNyBAQAogCiBzdGF0aWMgdm9pZCBwY2lfc3VuNHZfbXNpX2luaXQoc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtKQogewotCXUzMiAqdmFsOworCWNvbnN0IHUzMiAqdmFsOwogCWludCBsZW47CiAKIAl2YWwgPSBvZl9nZXRfcHJvcGVydHkocGJtLT5wcm9tX25vZGUsICIjbXNpLWVxcyIsICZsZW4pOwpAQCAtMTI4OSwxNiArMTAyOSwxNiBAQAogCQlnb3RvIG5vX21zaTsKIAlwYm0tPm1zaXFfbnVtID0gKnZhbDsKIAlpZiAocGJtLT5tc2lxX251bSkgewotCQlzdHJ1Y3QgbXNpcV9wcm9wIHsKKwkJY29uc3Qgc3RydWN0IG1zaXFfcHJvcCB7CiAJCQl1MzIgZmlyc3RfbXNpcTsKIAkJCXUzMiBudW1fbXNpcTsKIAkJCXUzMiBmaXJzdF9kZXZpbm87CiAJCX0gKm1xcDsKLQkJc3RydWN0IG1zaV9yYW5nZV9wcm9wIHsKKwkJY29uc3Qgc3RydWN0IG1zaV9yYW5nZV9wcm9wIHsKIAkJCXUzMiBmaXJzdF9tc2k7CiAJCQl1MzIgbnVtX21zaTsKIAkJfSAqbXJuZzsKLQkJc3RydWN0IGFkZHJfcmFuZ2VfcHJvcCB7CisJCWNvbnN0IHN0cnVjdCBhZGRyX3JhbmdlX3Byb3AgewogCQkJdTMyIG1zaTMyX2hpZ2g7CiAJCQl1MzIgbXNpMzJfbG93OwogCQkJdTMyIG1zaTMyX2xlbjsKQEAgLTE0MTAsOCArMTE1MCw3IEBACiAJCQkJICAgc3RydWN0IHBjaV9kZXYgKnBkZXYsCiAJCQkJICAgc3RydWN0IG1zaV9kZXNjICplbnRyeSkKIHsKLQlzdHJ1Y3QgcGNpZGV2X2Nvb2tpZSAqcGNwID0gcGRldi0+c3lzZGF0YTsKLQlzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0gPSBwY3AtPnBibTsKKwlzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0gPSBwZGV2LT5kZXYuYXJjaGRhdGEuaG9zdF9jb250cm9sbGVyOwogCXVuc2lnbmVkIGxvbmcgZGV2aW5vLCBtc2lxaWQ7CiAJc3RydWN0IG1zaV9tc2cgbXNnOwogCWludCBtc2lfbnVtLCBlcnI7CkBAIC0xNDU1LDcgKzExOTQsNyBAQAogCWlmIChwY2lfc3VuNHZfbXNpX3NldHZhbGlkKHBibS0+ZGV2aGFuZGxlLCBtc2lfbnVtLCBIVl9NU0lWQUxJRF9WQUxJRCkpCiAJCWdvdG8gb3V0X2VycjsKIAotCXBjcC0+bXNpX251bSA9IG1zaV9udW07CisJcGRldi0+ZGV2LmFyY2hkYXRhLm1zaV9udW0gPSBtc2lfbnVtOwogCiAJaWYgKGVudHJ5LT5tc2lfYXR0cmliLmlzXzY0KSB7CiAJCW1zZy5hZGRyZXNzX2hpID0gcGJtLT5tc2k2NF9zdGFydCA+PiAzMjsKQEAgLTE0ODQsMTIgKzEyMjMsMTEgQEAKIHN0YXRpYyB2b2lkIHBjaV9zdW40dl90ZWFyZG93bl9tc2lfaXJxKHVuc2lnbmVkIGludCB2aXJ0X2lycSwKIAkJCQkgICAgICAgc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7Ci0Jc3RydWN0IHBjaWRldl9jb29raWUgKnBjcCA9IHBkZXYtPnN5c2RhdGE7Ci0Jc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtID0gcGNwLT5wYm07CisJc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtID0gcGRldi0+ZGV2LmFyY2hkYXRhLmhvc3RfY29udHJvbGxlcjsKIAl1bnNpZ25lZCBsb25nIG1zaXFpZCwgZXJyOwogCXVuc2lnbmVkIGludCBtc2lfbnVtOwogCi0JbXNpX251bSA9IHBjcC0+bXNpX251bTsKKwltc2lfbnVtID0gcGRldi0+ZGV2LmFyY2hkYXRhLm1zaV9udW07CiAJZXJyID0gcGNpX3N1bjR2X21zaV9nZXRtc2lxKHBibS0+ZGV2aGFuZGxlLCBtc2lfbnVtLCAmbXNpcWlkKTsKIAlpZiAoZXJyKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IGdldG1zaXEgZ2l2ZXMgZXJyb3IgJWx1XG4iLApAQCAtMTUxNiw4ICsxMjU0LDYgQEAKIHN0YXRpYyB2b2lkIHBjaV9zdW40dl9wYm1faW5pdChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXJfaW5mbyAqcCwgc3RydWN0IGRldmljZV9ub2RlICpkcCwgdTMyIGRldmhhbmRsZSkKIHsKIAlzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm07Ci0Jc3RydWN0IHByb3BlcnR5ICpwcm9wOwotCWludCBsZW4sIGk7CiAKIAlpZiAoZGV2aGFuZGxlICYgMHg0MCkKIAkJcGJtID0gJnAtPnBibV9COwpAQCAtMTUyNiw3ICsxMjYyLDYgQEAKIAogCXBibS0+cGFyZW50ID0gcDsKIAlwYm0tPnByb21fbm9kZSA9IGRwOwotCXBibS0+cGNpX2ZpcnN0X3Nsb3QgPSAxOwogCiAJcGJtLT5kZXZoYW5kbGUgPSBkZXZoYW5kbGU7CiAKQEAgLTE1MzQsMzkgKzEyNjksMTcgQEAKIAogCXByaW50aygiJXM6IFNVTjRWIFBDSSBCdXMgTW9kdWxlXG4iLCBwYm0tPm5hbWUpOwogCi0JcHJvcCA9IG9mX2ZpbmRfcHJvcGVydHkoZHAsICJyYW5nZXMiLCAmbGVuKTsKLQlwYm0tPnBibV9yYW5nZXMgPSBwcm9wLT52YWx1ZTsKLQlwYm0tPm51bV9wYm1fcmFuZ2VzID0KLQkJKGxlbiAvIHNpemVvZihzdHJ1Y3QgbGludXhfcHJvbV9wY2lfcmFuZ2VzKSk7Ci0KLQkvKiBNYXNrIG91dCB0aGUgdG9wIDggYml0cyBvZiB0aGUgcmFuZ2VzLCBsZWF2aW5nIHRoZSByZWFsCi0JICogcGh5c2ljYWwgYWRkcmVzcy4KLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgcGJtLT5udW1fcGJtX3JhbmdlczsgaSsrKQotCQlwYm0tPnBibV9yYW5nZXNbaV0ucGFyZW50X3BoeXNfaGkgJj0gMHgwZmZmZmZmZjsKLQotCXBjaV9zdW40dl9kZXRlcm1pbmVfbWVtX2lvX3NwYWNlKHBibSk7Ci0JcGJtX3JlZ2lzdGVyX3RvcGxldmVsX3Jlc291cmNlcyhwLCBwYm0pOwotCi0JcHJvcCA9IG9mX2ZpbmRfcHJvcGVydHkoZHAsICJpbnRlcnJ1cHQtbWFwIiwgJmxlbik7Ci0JcGJtLT5wYm1faW50bWFwID0gcHJvcC0+dmFsdWU7Ci0JcGJtLT5udW1fcGJtX2ludG1hcCA9Ci0JCShsZW4gLyBzaXplb2Yoc3RydWN0IGxpbnV4X3Byb21fcGNpX2ludG1hcCkpOwotCi0JcHJvcCA9IG9mX2ZpbmRfcHJvcGVydHkoZHAsICJpbnRlcnJ1cHQtbWFwLW1hc2siLCBOVUxMKTsKLQlwYm0tPnBibV9pbnRtYXNrID0gcHJvcC0+dmFsdWU7CisJcGNpX2RldGVybWluZV9tZW1faW9fc3BhY2UocGJtKTsKIAogCXBjaV9zdW40dl9nZXRfYnVzX3JhbmdlKHBibSk7CiAJcGNpX3N1bjR2X2lvbW11X2luaXQocGJtKTsKIAlwY2lfc3VuNHZfbXNpX2luaXQocGJtKTsKLQotCXBkZXZfaHRhYl9wb3B1bGF0ZShwYm0pOwogfQogCiB2b2lkIHN1bjR2X3BjaV9pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAsIGNoYXIgKm1vZGVsX25hbWUpCiB7CiAJc3RydWN0IHBjaV9jb250cm9sbGVyX2luZm8gKnA7Ci0Jc3RydWN0IHBjaV9pb21tdSAqaW9tbXU7CisJc3RydWN0IGlvbW11ICppb21tdTsKIAlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CiAJc3RydWN0IGxpbnV4X3Byb202NF9yZWdpc3RlcnMgKnJlZ3M7CiAJdTMyIGRldmhhbmRsZTsKQEAgLTE2MDYsMTMgKzEzMTksMTMgQEAKIAlpZiAoIXApCiAJCWdvdG8gZmF0YWxfbWVtb3J5X2Vycm9yOwogCi0JaW9tbXUgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcGNpX2lvbW11KSwgR0ZQX0FUT01JQyk7CisJaW9tbXUgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaW9tbXUpLCBHRlBfQVRPTUlDKTsKIAlpZiAoIWlvbW11KQogCQlnb3RvIGZhdGFsX21lbW9yeV9lcnJvcjsKIAogCXAtPnBibV9BLmlvbW11ID0gaW9tbXU7CiAKLQlpb21tdSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwY2lfaW9tbXUpLCBHRlBfQVRPTUlDKTsKKwlpb21tdSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpb21tdSksIEdGUF9BVE9NSUMpOwogCWlmICghaW9tbXUpCiAJCWdvdG8gZmF0YWxfbWVtb3J5X2Vycm9yOwogCkBAIC0xNjIyLDExICsxMzM1LDggQEAKIAlwY2lfY29udHJvbGxlcl9yb290ID0gcDsKIAogCXAtPmluZGV4ID0gcGNpX251bV9jb250cm9sbGVycysrOwotCXAtPnBibXNfc2FtZV9kb21haW4gPSAwOwogCiAJcC0+c2Nhbl9idXMgPSBwY2lfc3VuNHZfc2Nhbl9idXM7Ci0JcC0+YmFzZV9hZGRyZXNzX3VwZGF0ZSA9IHBjaV9zdW40dl9iYXNlX2FkZHJlc3NfdXBkYXRlOwotCXAtPnJlc291cmNlX2FkanVzdCA9IHBjaV9zdW40dl9yZXNvdXJjZV9hZGp1c3Q7CiAjaWZkZWYgQ09ORklHX1BDSV9NU0kKIAlwLT5zZXR1cF9tc2lfaXJxID0gcGNpX3N1bjR2X3NldHVwX21zaV9pcnE7CiAJcC0+dGVhcmRvd25fbXNpX2lycSA9IHBjaV9zdW40dl90ZWFyZG93bl9tc2lfaXJxOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3Byb2Nlc3MuYwppbmRleCBiMjkxMDYwLi5hMTE0MTUxIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3Byb2Nlc3MuYwpAQCAtMjgsNiArMjgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CisjaW5jbHVkZSA8bGludXgvdGljay5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KIAogI2luY2x1ZGUgPGFzbS9vcGxpYi5oPgpAQCAtODgsMTIgKzg5LDE0IEBACiAJc2V0X3RocmVhZF9mbGFnKFRJRl9QT0xMSU5HX05SRkxBRyk7CiAKIAl3aGlsZSgxKSB7Ci0JCWlmIChuZWVkX3Jlc2NoZWQoKSkgewotCQkJcHJlZW1wdF9lbmFibGVfbm9fcmVzY2hlZCgpOwotCQkJc2NoZWR1bGUoKTsKLQkJCXByZWVtcHRfZGlzYWJsZSgpOwotCQl9Ci0JCXNwYXJjNjRfeWllbGQoKTsKKwkJdGlja19ub2h6X3N0b3Bfc2NoZWRfdGljaygpOworCQl3aGlsZSAoIW5lZWRfcmVzY2hlZCgpKQorCQkJc3BhcmM2NF95aWVsZCgpOworCQl0aWNrX25vaHpfcmVzdGFydF9zY2hlZF90aWNrKCk7CisKKwkJcHJlZW1wdF9lbmFibGVfbm9fcmVzY2hlZCgpOworCQlzY2hlZHVsZSgpOworCQlwcmVlbXB0X2Rpc2FibGUoKTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcHJvbS5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9wcm9tLmMKaW5kZXggMDkxN2MyNC4uNWUxZmNkMCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wcm9tLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9wcm9tLmMKQEAgLTM2LDEyICszNiwxMyBAQAogICovCiBzdGF0aWMgREVGSU5FX1JXTE9DSyhkZXZ0cmVlX2xvY2spOwogCi1pbnQgb2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUoc3RydWN0IGRldmljZV9ub2RlICpkZXZpY2UsIGNvbnN0IGNoYXIgKmNvbXBhdCkKK2ludCBvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldmljZSwKKwkJCSAgICBjb25zdCBjaGFyICpjb21wYXQpCiB7CiAJY29uc3QgY2hhciogY3A7CiAJaW50IGNwbGVuLCBsOwogCi0JY3AgPSAoY2hhciAqKSBvZl9nZXRfcHJvcGVydHkoZGV2aWNlLCAiY29tcGF0aWJsZSIsICZjcGxlbik7CisJY3AgPSBvZl9nZXRfcHJvcGVydHkoZGV2aWNlLCAiY29tcGF0aWJsZSIsICZjcGxlbik7CiAJaWYgKGNwID09IE5VTEwpCiAJCXJldHVybiAwOwogCXdoaWxlIChjcGxlbiA+IDApIHsKQEAgLTE1NCwxMyArMTU1LDE0IEBACiB9CiBFWFBPUlRfU1lNQk9MKG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKTsKIAotc3RydWN0IHByb3BlcnR5ICpvZl9maW5kX3Byb3BlcnR5KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIGNvbnN0IGNoYXIgKm5hbWUsCitzdHJ1Y3QgcHJvcGVydHkgKm9mX2ZpbmRfcHJvcGVydHkoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJCQkgIGNvbnN0IGNoYXIgKm5hbWUsCiAJCQkJICBpbnQgKmxlbnApCiB7CiAJc3RydWN0IHByb3BlcnR5ICpwcDsKIAogCWZvciAocHAgPSBucC0+cHJvcGVydGllczsgcHAgIT0gMDsgcHAgPSBwcC0+bmV4dCkgewotCQlpZiAoc3RyY21wKHBwLT5uYW1lLCBuYW1lKSA9PSAwKSB7CisJCWlmIChzdHJjYXNlY21wKHBwLT5uYW1lLCBuYW1lKSA9PSAwKSB7CiAJCQlpZiAobGVucCAhPSAwKQogCQkJCSpsZW5wID0gcHAtPmxlbmd0aDsKIAkJCWJyZWFrOwpAQCAtMTc0LDcgKzE3Niw4IEBACiAgKiBGaW5kIGEgcHJvcGVydHkgd2l0aCBhIGdpdmVuIG5hbWUgZm9yIGEgZ2l2ZW4gbm9kZQogICogYW5kIHJldHVybiB0aGUgdmFsdWUuCiAgKi8KLXZvaWQgKm9mX2dldF9wcm9wZXJ0eShzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgKmxlbnApCitjb25zdCB2b2lkICpvZl9nZXRfcHJvcGVydHkoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpucCwgY29uc3QgY2hhciAqbmFtZSwKKwkJICAgICAgaW50ICpsZW5wKQogewogCXN0cnVjdCBwcm9wZXJ0eSAqcHAgPSBvZl9maW5kX3Byb3BlcnR5KG5wLG5hbWUsbGVucCk7CiAJcmV0dXJuIHBwID8gcHAtPnZhbHVlIDogTlVMTDsKQEAgLTE5Niw3ICsxOTksNyBAQAogCiBpbnQgb2Zfbl9hZGRyX2NlbGxzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCiB7Ci0JaW50KiBpcDsKKwljb25zdCBpbnQqIGlwOwogCWRvIHsKIAkJaWYgKG5wLT5wYXJlbnQpCiAJCQlucCA9IG5wLT5wYXJlbnQ7CkBAIC0yMTEsNyArMjE0LDcgQEAKIAogaW50IG9mX25fc2l6ZV9jZWxscyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQogewotCWludCogaXA7CisJY29uc3QgaW50KiBpcDsKIAlkbyB7CiAJCWlmIChucC0+cGFyZW50KQogCQkJbnAgPSBucC0+cGFyZW50OwpAQCAtMjQzLDcgKzI0Niw3IEBACiAJd2hpbGUgKCpwcmV2cCkgewogCQlzdHJ1Y3QgcHJvcGVydHkgKnByb3AgPSAqcHJldnA7CiAKLQkJaWYgKCFzdHJjbXAocHJvcC0+bmFtZSwgbmFtZSkpIHsKKwkJaWYgKCFzdHJjYXNlY21wKHByb3AtPm5hbWUsIG5hbWUpKSB7CiAJCQl2b2lkICpvbGRfdmFsID0gcHJvcC0+dmFsdWU7CiAJCQlpbnQgcmV0OwogCkBAIC0zOTcsNyArNDAwLDcgQEAKIAogc3RhdGljIHZvaWQgcHN5Y2hvX2lycV90cmFuc19pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHApCiB7Ci0Jc3RydWN0IGxpbnV4X3Byb202NF9yZWdpc3RlcnMgKnJlZ3M7CisJY29uc3Qgc3RydWN0IGxpbnV4X3Byb202NF9yZWdpc3RlcnMgKnJlZ3M7CiAKIAlkcC0+aXJxX3RyYW5zID0gcHJvbV9lYXJseV9hbGxvYyhzaXplb2Yoc3RydWN0IG9mX2lycV9jb250cm9sbGVyKSk7CiAJZHAtPmlycV90cmFucy0+aXJxX2J1aWxkID0gcHN5Y2hvX2lycV9idWlsZDsKQEAgLTU0Nyw3ICs1NTAsNyBAQAogc3RhdGljIGludCBzYWJyZV9kZXZpY2VfbmVlZHNfd3N5bmMoc3RydWN0IGRldmljZV9ub2RlICpkcCkKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKnBhcmVudCA9IGRwLT5wYXJlbnQ7Ci0JY2hhciAqcGFyZW50X21vZGVsLCAqcGFyZW50X2NvbXBhdDsKKwljb25zdCBjaGFyICpwYXJlbnRfbW9kZWwsICpwYXJlbnRfY29tcGF0OwogCiAJLyogVGhpcyB0cmF2ZXJzYWwgdXAgdG93YXJkcyB0aGUgcm9vdCBpcyBtZWFudCB0bwogCSAqIGhhbmRsZSB0d28gY2FzZXM6CkBAIC01ODksNyArNTkyLDcgQEAKIHsKIAlzdHJ1Y3Qgc2FicmVfaXJxX2RhdGEgKmlycV9kYXRhID0gX2RhdGE7CiAJdW5zaWduZWQgbG9uZyBjb250cm9sbGVyX3JlZ3MgPSBpcnFfZGF0YS0+Y29udHJvbGxlcl9yZWdzOwotCXN0cnVjdCBsaW51eF9wcm9tX3BjaV9yZWdpc3RlcnMgKnJlZ3M7CisJY29uc3Qgc3RydWN0IGxpbnV4X3Byb21fcGNpX3JlZ2lzdGVycyAqcmVnczsKIAl1bnNpZ25lZCBsb25nIGltYXAsIGljbHI7CiAJdW5zaWduZWQgbG9uZyBpbWFwX29mZiwgaWNscl9vZmY7CiAJaW50IGlub2ZpeHVwID0gMDsKQEAgLTYzOSw5ICs2NDIsOSBAQAogCiBzdGF0aWMgdm9pZCBzYWJyZV9pcnFfdHJhbnNfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwKQogewotCXN0cnVjdCBsaW51eF9wcm9tNjRfcmVnaXN0ZXJzICpyZWdzOworCWNvbnN0IHN0cnVjdCBsaW51eF9wcm9tNjRfcmVnaXN0ZXJzICpyZWdzOwogCXN0cnVjdCBzYWJyZV9pcnFfZGF0YSAqaXJxX2RhdGE7Ci0JdTMyICpidXNyYW5nZTsKKwljb25zdCB1MzIgKmJ1c3JhbmdlOwogCiAJZHAtPmlycV90cmFucyA9IHByb21fZWFybHlfYWxsb2Moc2l6ZW9mKHN0cnVjdCBvZl9pcnFfY29udHJvbGxlcikpOwogCWRwLT5pcnFfdHJhbnMtPmlycV9idWlsZCA9IHNhYnJlX2lycV9idWlsZDsKQEAgLTc5NSw3ICs3OTgsNyBAQAogCiBzdGF0aWMgdm9pZCBfX3NjaGl6b19pcnFfdHJhbnNfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwLCBpbnQgaXNfdG9tYXRpbGxvKQogewotCXN0cnVjdCBsaW51eF9wcm9tNjRfcmVnaXN0ZXJzICpyZWdzOworCWNvbnN0IHN0cnVjdCBsaW51eF9wcm9tNjRfcmVnaXN0ZXJzICpyZWdzOwogCXN0cnVjdCBzY2hpem9faXJxX2RhdGEgKmlycV9kYXRhOwogCiAJZHAtPmlycV90cmFucyA9IHByb21fZWFybHlfYWxsb2Moc2l6ZW9mKHN0cnVjdCBvZl9pcnFfY29udHJvbGxlcikpOwpAQCAtODM2LDcgKzgzOSw3IEBACiAKIHN0YXRpYyB2b2lkIHBjaV9zdW40dl9pcnFfdHJhbnNfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwKQogewotCXN0cnVjdCBsaW51eF9wcm9tNjRfcmVnaXN0ZXJzICpyZWdzOworCWNvbnN0IHN0cnVjdCBsaW51eF9wcm9tNjRfcmVnaXN0ZXJzICpyZWdzOwogCiAJZHAtPmlycV90cmFucyA9IHByb21fZWFybHlfYWxsb2Moc2l6ZW9mKHN0cnVjdCBvZl9pcnFfY29udHJvbGxlcikpOwogCWRwLT5pcnFfdHJhbnMtPmlycV9idWlsZCA9IHBjaV9zdW40dl9pcnFfYnVpbGQ7CkBAIC05NDAsNyArOTQzLDcgQEAKIAkJCQkgICAgICB2b2lkICpfZGF0YSkKIHsKIAl1bnNpZ25lZCBsb25nIHJlZ19iYXNlID0gKHVuc2lnbmVkIGxvbmcpIF9kYXRhOwotCXN0cnVjdCBsaW51eF9wcm9tX3JlZ2lzdGVycyAqcmVnczsKKwljb25zdCBzdHJ1Y3QgbGludXhfcHJvbV9yZWdpc3RlcnMgKnJlZ3M7CiAJdW5zaWduZWQgbG9uZyBpbWFwLCBpY2xyOwogCWludCBzYnVzX3Nsb3QgPSAwOwogCWludCBzYnVzX2xldmVsID0gMDsKQEAgLTk5NCw3ICs5OTcsNyBAQAogCiBzdGF0aWMgdm9pZCBzYnVzX2lycV90cmFuc19pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHApCiB7Ci0Jc3RydWN0IGxpbnV4X3Byb202NF9yZWdpc3RlcnMgKnJlZ3M7CisJY29uc3Qgc3RydWN0IGxpbnV4X3Byb202NF9yZWdpc3RlcnMgKnJlZ3M7CiAKIAlkcC0+aXJxX3RyYW5zID0gcHJvbV9lYXJseV9hbGxvYyhzaXplb2Yoc3RydWN0IG9mX2lycV9jb250cm9sbGVyKSk7CiAJZHAtPmlycV90cmFucy0+aXJxX2J1aWxkID0gc2J1c19vZl9idWlsZF9pcnE7CkBAIC0xMDgwLDcgKzEwODMsNyBAQAogCiBzdGF0aWMgdm9pZCBzdW40dl92ZGV2X2lycV90cmFuc19pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHApCiB7Ci0Jc3RydWN0IGxpbnV4X3Byb202NF9yZWdpc3RlcnMgKnJlZ3M7CisJY29uc3Qgc3RydWN0IGxpbnV4X3Byb202NF9yZWdpc3RlcnMgKnJlZ3M7CiAKIAlkcC0+aXJxX3RyYW5zID0gcHJvbV9lYXJseV9hbGxvYyhzaXplb2Yoc3RydWN0IG9mX2lycV9jb250cm9sbGVyKSk7CiAJZHAtPmlycV90cmFucy0+aXJxX2J1aWxkID0gc3VuNHZfdmRldl9pcnFfYnVpbGQ7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3NidXMuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvc2J1cy5jCmluZGV4IDE0Zjc4ZmIuLjNiMDU0MjggMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvc2J1cy5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvc2J1cy5jCkBAIC0yNiwyMyArMjYsOSBAQAogCiAjZGVmaW5lIE1BUF9CQVNFCSgodTMyKTB4YzAwMDAwMDApCiAKLXN0cnVjdCBzYnVzX2lvbW11X2FyZW5hIHsKLQl1bnNpZ25lZCBsb25nCSptYXA7Ci0JdW5zaWduZWQgaW50CWhpbnQ7Ci0JdW5zaWduZWQgaW50CWxpbWl0OwotfTsKLQotc3RydWN0IHNidXNfaW9tbXUgewotCXNwaW5sb2NrX3QJCWxvY2s7Ci0KLQlzdHJ1Y3Qgc2J1c19pb21tdV9hcmVuYQlhcmVuYTsKLQotCWlvcHRlX3QJCQkqcGFnZV90YWJsZTsKLQl1bnNpZ25lZCBsb25nCQlzdHJidWZfcmVnczsKLQl1bnNpZ25lZCBsb25nCQlpb21tdV9yZWdzOwotCXVuc2lnbmVkIGxvbmcJCXNidXNfY29udHJvbF9yZWc7Ci0KLQl2b2xhdGlsZSB1bnNpZ25lZCBsb25nCXN0cmJ1Zl9mbHVzaGZsYWc7CitzdHJ1Y3Qgc2J1c19pbmZvIHsKKwlzdHJ1Y3QgaW9tbXUJaW9tbXU7CisJc3RydWN0IHN0cmJ1ZglzdHJidWY7CiB9OwogCiAvKiBPZmZzZXRzIGZyb20gaW9tbXVfcmVncyAqLwpAQCAtNTgsMTYgKzQ0LDE3IEBACiAKICNkZWZpbmUgSU9NTVVfRFJBTV9WQUxJRAkoMVVMIDw8IDMwVUwpCiAKLXN0YXRpYyB2b2lkIF9faW9tbXVfZmx1c2hhbGwoc3RydWN0IHNidXNfaW9tbXUgKmlvbW11KQorc3RhdGljIHZvaWQgX19pb21tdV9mbHVzaGFsbChzdHJ1Y3QgaW9tbXUgKmlvbW11KQogewotCXVuc2lnbmVkIGxvbmcgdGFnID0gaW9tbXUtPmlvbW11X3JlZ3MgKyBJT01NVV9UQUdESUFHOworCXVuc2lnbmVkIGxvbmcgdGFnOwogCWludCBlbnRyeTsKIAorCXRhZyA9IGlvbW11LT5pb21tdV9jb250cm9sICsgKElPTU1VX1RBR0RJQUcgLSBJT01NVV9DT05UUk9MKTsKIAlmb3IgKGVudHJ5ID0gMDsgZW50cnkgPCAxNjsgZW50cnkrKykgewogCQl1cGFfd3JpdGVxKDAsIHRhZyk7CiAJCXRhZyArPSA4VUw7CiAJfQotCXVwYV9yZWFkcShpb21tdS0+c2J1c19jb250cm9sX3JlZyk7CisJdXBhX3JlYWRxKGlvbW11LT53cml0ZV9jb21wbGV0ZV9yZWcpOwogfQogCiAvKiBPZmZzZXRzIGZyb20gc3RyYnVmX3JlZ3MgKi8KQEAgLTgyLDE1ICs2OSwxNCBAQAogCiAjZGVmaW5lIFNUUkJVRl9UQUdfVkFMSUQJMHgwMlVMCiAKLXN0YXRpYyB2b2lkIHNidXNfc3RyYnVmX2ZsdXNoKHN0cnVjdCBzYnVzX2lvbW11ICppb21tdSwgdTMyIGJhc2UsIHVuc2lnbmVkIGxvbmcgbnBhZ2VzLCBpbnQgZGlyZWN0aW9uKQorc3RhdGljIHZvaWQgc2J1c19zdHJidWZfZmx1c2goc3RydWN0IGlvbW11ICppb21tdSwgc3RydWN0IHN0cmJ1ZiAqc3RyYnVmLCB1MzIgYmFzZSwgdW5zaWduZWQgbG9uZyBucGFnZXMsIGludCBkaXJlY3Rpb24pCiB7CiAJdW5zaWduZWQgbG9uZyBuOwogCWludCBsaW1pdDsKIAogCW4gPSBucGFnZXM7CiAJd2hpbGUgKG4tLSkKLQkJdXBhX3dyaXRlcShiYXNlICsgKG4gPDwgSU9fUEFHRV9TSElGVCksCi0JCQkgICBpb21tdS0+c3RyYnVmX3JlZ3MgKyBTVFJCVUZfUEZMVVNIKTsKKwkJdXBhX3dyaXRlcShiYXNlICsgKG4gPDwgSU9fUEFHRV9TSElGVCksIHN0cmJ1Zi0+c3RyYnVmX3BmbHVzaCk7CiAKIAkvKiBJZiB0aGUgZGV2aWNlIGNvdWxkIG5vdCBoYXZlIHBvc3NpYmx5IHB1dCBkaXJ0eSBkYXRhIGludG8KIAkgKiB0aGUgc3RyZWFtaW5nIGNhY2hlLCBubyBmbHVzaC1mbGFnIHN5bmNocm9uaXphdGlvbiBuZWVkcwpAQCAtOTksMTUgKzg1LDE0IEBACiAJaWYgKGRpcmVjdGlvbiA9PSBTQlVTX0RNQV9UT0RFVklDRSkKIAkJcmV0dXJuOwogCi0JaW9tbXUtPnN0cmJ1Zl9mbHVzaGZsYWcgPSAwVUw7CisJKihzdHJidWYtPnN0cmJ1Zl9mbHVzaGZsYWcpID0gMFVMOwogCiAJLyogV2hvb3BlZSBjdXNoaW9uISAqLwotCXVwYV93cml0ZXEoX19wYSgmaW9tbXUtPnN0cmJ1Zl9mbHVzaGZsYWcpLAotCQkgICBpb21tdS0+c3RyYnVmX3JlZ3MgKyBTVFJCVUZfRlNZTkMpOwotCXVwYV9yZWFkcShpb21tdS0+c2J1c19jb250cm9sX3JlZyk7CisJdXBhX3dyaXRlcShzdHJidWYtPnN0cmJ1Zl9mbHVzaGZsYWdfcGEsIHN0cmJ1Zi0+c3RyYnVmX2ZzeW5jKTsKKwl1cGFfcmVhZHEoaW9tbXUtPndyaXRlX2NvbXBsZXRlX3JlZyk7CiAKIAlsaW1pdCA9IDEwMDAwMDsKLQl3aGlsZSAoaW9tbXUtPnN0cmJ1Zl9mbHVzaGZsYWcgPT0gMFVMKSB7CisJd2hpbGUgKCooc3RyYnVmLT5zdHJidWZfZmx1c2hmbGFnKSA9PSAwVUwpIHsKIAkJbGltaXQtLTsKIAkJaWYgKCFsaW1pdCkKIAkJCWJyZWFrOwpAQCAtMTIxLDkgKzEwNiw5IEBACiB9CiAKIC8qIEJhc2VkIGxhcmdlbHkgdXBvbiB0aGUgcHBjNjQgaW9tbXUgYWxsb2NhdG9yLiAgKi8KLXN0YXRpYyBsb25nIHNidXNfYXJlbmFfYWxsb2Moc3RydWN0IHNidXNfaW9tbXUgKmlvbW11LCB1bnNpZ25lZCBsb25nIG5wYWdlcykKK3N0YXRpYyBsb25nIHNidXNfYXJlbmFfYWxsb2Moc3RydWN0IGlvbW11ICppb21tdSwgdW5zaWduZWQgbG9uZyBucGFnZXMpCiB7Ci0Jc3RydWN0IHNidXNfaW9tbXVfYXJlbmEgKmFyZW5hID0gJmlvbW11LT5hcmVuYTsKKwlzdHJ1Y3QgaW9tbXVfYXJlbmEgKmFyZW5hID0gJmlvbW11LT5hcmVuYTsKIAl1bnNpZ25lZCBsb25nIG4sIGksIHN0YXJ0LCBlbmQsIGxpbWl0OwogCWludCBwYXNzOwogCkBAIC0xNjIsNyArMTQ3LDcgQEAKIAlyZXR1cm4gbjsKIH0KIAotc3RhdGljIHZvaWQgc2J1c19hcmVuYV9mcmVlKHN0cnVjdCBzYnVzX2lvbW11X2FyZW5hICphcmVuYSwgdW5zaWduZWQgbG9uZyBiYXNlLCB1bnNpZ25lZCBsb25nIG5wYWdlcykKK3N0YXRpYyB2b2lkIHNidXNfYXJlbmFfZnJlZShzdHJ1Y3QgaW9tbXVfYXJlbmEgKmFyZW5hLCB1bnNpZ25lZCBsb25nIGJhc2UsIHVuc2lnbmVkIGxvbmcgbnBhZ2VzKQogewogCXVuc2lnbmVkIGxvbmcgaTsKIApAQCAtMTcwLDcgKzE1NSw3IEBACiAJCV9fY2xlYXJfYml0KGksIGFyZW5hLT5tYXApOwogfQogCi1zdGF0aWMgdm9pZCBzYnVzX2lvbW11X3RhYmxlX2luaXQoc3RydWN0IHNidXNfaW9tbXUgKmlvbW11LCB1bnNpZ25lZCBpbnQgdHNic2l6ZSkKK3N0YXRpYyB2b2lkIHNidXNfaW9tbXVfdGFibGVfaW5pdChzdHJ1Y3QgaW9tbXUgKmlvbW11LCB1bnNpZ25lZCBpbnQgdHNic2l6ZSkKIHsKIAl1bnNpZ25lZCBsb25nIHRzYmJhc2UsIG9yZGVyLCBzeiwgbnVtX3RzYl9lbnRyaWVzOwogCkBAIC0xNzgsMTMgKzE2MywxNCBAQAogCiAJLyogU2V0dXAgaW5pdGlhbCBzb2Z0d2FyZSBJT01NVSBzdGF0ZS4gKi8KIAlzcGluX2xvY2tfaW5pdCgmaW9tbXUtPmxvY2spOworCWlvbW11LT5wYWdlX3RhYmxlX21hcF9iYXNlID0gTUFQX0JBU0U7CiAKIAkvKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgZnJlZSBhcmVhIG1hcC4gICovCiAJc3ogPSBudW1fdHNiX2VudHJpZXMgLyA4OwogCXN6ID0gKHN6ICsgN1VMKSAmIH43VUw7CiAJaW9tbXUtPmFyZW5hLm1hcCA9IGt6YWxsb2Moc3osIEdGUF9LRVJORUwpOwogCWlmICghaW9tbXUtPmFyZW5hLm1hcCkgewotCQlwcm9tX3ByaW50ZigiUENJX0lPTU1VOiBFcnJvciwga21hbGxvYyhhcmVuYS5tYXApIGZhaWxlZC5cbiIpOworCQlwcm9tX3ByaW50ZigiU0JVU19JT01NVTogRXJyb3IsIGttYWxsb2MoYXJlbmEubWFwKSBmYWlsZWQuXG4iKTsKIAkJcHJvbV9oYWx0KCk7CiAJfQogCWlvbW11LT5hcmVuYS5saW1pdCA9IG51bV90c2JfZW50cmllczsKQEAgLTIwMCw3ICsxODYsNyBAQAogCW1lbXNldChpb21tdS0+cGFnZV90YWJsZSwgMCwgdHNic2l6ZSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW9wdGVfdCAqYWxsb2NfbnBhZ2VzKHN0cnVjdCBzYnVzX2lvbW11ICppb21tdSwgdW5zaWduZWQgbG9uZyBucGFnZXMpCitzdGF0aWMgaW5saW5lIGlvcHRlX3QgKmFsbG9jX25wYWdlcyhzdHJ1Y3QgaW9tbXUgKmlvbW11LCB1bnNpZ25lZCBsb25nIG5wYWdlcykKIHsKIAlsb25nIGVudHJ5OwogCkBAIC0yMTEsMTQgKzE5NywxNSBAQAogCXJldHVybiBpb21tdS0+cGFnZV90YWJsZSArIGVudHJ5OwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgZnJlZV9ucGFnZXMoc3RydWN0IHNidXNfaW9tbXUgKmlvbW11LCBkbWFfYWRkcl90IGJhc2UsIHVuc2lnbmVkIGxvbmcgbnBhZ2VzKQorc3RhdGljIGlubGluZSB2b2lkIGZyZWVfbnBhZ2VzKHN0cnVjdCBpb21tdSAqaW9tbXUsIGRtYV9hZGRyX3QgYmFzZSwgdW5zaWduZWQgbG9uZyBucGFnZXMpCiB7CiAJc2J1c19hcmVuYV9mcmVlKCZpb21tdS0+YXJlbmEsIGJhc2UgPj4gSU9fUEFHRV9TSElGVCwgbnBhZ2VzKTsKIH0KIAogdm9pZCAqc2J1c19hbGxvY19jb25zaXN0ZW50KHN0cnVjdCBzYnVzX2RldiAqc2Rldiwgc2l6ZV90IHNpemUsIGRtYV9hZGRyX3QgKmR2bWFfYWRkcikKIHsKLQlzdHJ1Y3Qgc2J1c19pb21tdSAqaW9tbXU7CisJc3RydWN0IHNidXNfaW5mbyAqaW5mbzsKKwlzdHJ1Y3QgaW9tbXUgKmlvbW11OwogCWlvcHRlX3QgKmlvcHRlOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIG9yZGVyLCBmaXJzdF9wYWdlOwogCXZvaWQgKnJldDsKQEAgLTIzNCw3ICsyMjEsOCBAQAogCQlyZXR1cm4gTlVMTDsKIAltZW1zZXQoKGNoYXIgKilmaXJzdF9wYWdlLCAwLCBQQUdFX1NJWkUgPDwgb3JkZXIpOwogCi0JaW9tbXUgPSBzZGV2LT5idXMtPmlvbW11OworCWluZm8gPSBzZGV2LT5idXMtPmlvbW11OworCWlvbW11ID0gJmluZm8tPmlvbW11OwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmlvbW11LT5sb2NrLCBmbGFncyk7CiAJaW9wdGUgPSBhbGxvY19ucGFnZXMoaW9tbXUsIHNpemUgPj4gSU9fUEFHRV9TSElGVCk7CkBAIC0yNDUsNyArMjMzLDcgQEAKIAkJcmV0dXJuIE5VTEw7CiAJfQogCi0JKmR2bWFfYWRkciA9IChNQVBfQkFTRSArCisJKmR2bWFfYWRkciA9IChpb21tdS0+cGFnZV90YWJsZV9tYXBfYmFzZSArCiAJCSAgICAgICgoaW9wdGUgLSBpb21tdS0+cGFnZV90YWJsZSkgPDwgSU9fUEFHRV9TSElGVCkpOwogCXJldCA9ICh2b2lkICopIGZpcnN0X3BhZ2U7CiAJbnBhZ2VzID0gc2l6ZSA+PiBJT19QQUdFX1NISUZUOwpAQCAtMjYzLDE4ICsyNTEsMjAgQEAKIAogdm9pZCBzYnVzX2ZyZWVfY29uc2lzdGVudChzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYsIHNpemVfdCBzaXplLCB2b2lkICpjcHUsIGRtYV9hZGRyX3QgZHZtYSkKIHsKLQlzdHJ1Y3Qgc2J1c19pb21tdSAqaW9tbXU7CisJc3RydWN0IHNidXNfaW5mbyAqaW5mbzsKKwlzdHJ1Y3QgaW9tbXUgKmlvbW11OwogCWlvcHRlX3QgKmlvcHRlOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIG9yZGVyLCBucGFnZXM7CiAKIAlucGFnZXMgPSBJT19QQUdFX0FMSUdOKHNpemUpID4+IElPX1BBR0VfU0hJRlQ7Ci0JaW9tbXUgPSBzZGV2LT5idXMtPmlvbW11OworCWluZm8gPSBzZGV2LT5idXMtPmlvbW11OworCWlvbW11ID0gJmluZm8tPmlvbW11OwogCWlvcHRlID0gaW9tbXUtPnBhZ2VfdGFibGUgKwotCQkoKGR2bWEgLSBNQVBfQkFTRSkgPj4gSU9fUEFHRV9TSElGVCk7CisJCSgoZHZtYSAtIGlvbW11LT5wYWdlX3RhYmxlX21hcF9iYXNlKSA+PiBJT19QQUdFX1NISUZUKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZpb21tdS0+bG9jaywgZmxhZ3MpOwogCi0JZnJlZV9ucGFnZXMoaW9tbXUsIGR2bWEgLSBNQVBfQkFTRSwgbnBhZ2VzKTsKKwlmcmVlX25wYWdlcyhpb21tdSwgZHZtYSAtIGlvbW11LT5wYWdlX3RhYmxlX21hcF9iYXNlLCBucGFnZXMpOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9tbXUtPmxvY2ssIGZsYWdzKTsKIApAQCAtMjg1LDE0ICsyNzUsMTYgQEAKIAogZG1hX2FkZHJfdCBzYnVzX21hcF9zaW5nbGUoc3RydWN0IHNidXNfZGV2ICpzZGV2LCB2b2lkICpwdHIsIHNpemVfdCBzeiwgaW50IGRpcmVjdGlvbikKIHsKLQlzdHJ1Y3Qgc2J1c19pb21tdSAqaW9tbXU7CisJc3RydWN0IHNidXNfaW5mbyAqaW5mbzsKKwlzdHJ1Y3QgaW9tbXUgKmlvbW11OwogCWlvcHRlX3QgKmJhc2U7CiAJdW5zaWduZWQgbG9uZyBmbGFncywgbnBhZ2VzLCBvYWRkcjsKIAl1bnNpZ25lZCBsb25nIGksIGJhc2VfcGFkZHI7CiAJdTMyIGJ1c19hZGRyLCByZXQ7CiAJdW5zaWduZWQgbG9uZyBpb3B0ZV9wcm90ZWN0aW9uOwogCi0JaW9tbXUgPSBzZGV2LT5idXMtPmlvbW11OworCWluZm8gPSBzZGV2LT5idXMtPmlvbW11OworCWlvbW11ID0gJmluZm8tPmlvbW11OwogCiAJaWYgKHVubGlrZWx5KGRpcmVjdGlvbiA9PSBTQlVTX0RNQV9OT05FKSkKIAkJQlVHKCk7CkBAIC0zMDgsNyArMzAwLDcgQEAKIAlpZiAodW5saWtlbHkoIWJhc2UpKQogCQlCVUcoKTsKIAotCWJ1c19hZGRyID0gKE1BUF9CQVNFICsKKwlidXNfYWRkciA9IChpb21tdS0+cGFnZV90YWJsZV9tYXBfYmFzZSArCiAJCSAgICAoKGJhc2UgLSBpb21tdS0+cGFnZV90YWJsZSkgPDwgSU9fUEFHRV9TSElGVCkpOwogCXJldCA9IGJ1c19hZGRyIHwgKG9hZGRyICYgfklPX1BBR0VfTUFTSyk7CiAJYmFzZV9wYWRkciA9IF9fcGEob2FkZHIgJiBJT19QQUdFX01BU0spOwpAQCAtMzI1LDcgKzMxNyw5IEBACiAKIHZvaWQgc2J1c191bm1hcF9zaW5nbGUoc3RydWN0IHNidXNfZGV2ICpzZGV2LCBkbWFfYWRkcl90IGJ1c19hZGRyLCBzaXplX3Qgc3osIGludCBkaXJlY3Rpb24pCiB7Ci0Jc3RydWN0IHNidXNfaW9tbXUgKmlvbW11ID0gc2Rldi0+YnVzLT5pb21tdTsKKwlzdHJ1Y3Qgc2J1c19pbmZvICppbmZvID0gc2Rldi0+YnVzLT5pb21tdTsKKwlzdHJ1Y3QgaW9tbXUgKmlvbW11ID0gJmluZm8tPmlvbW11OworCXN0cnVjdCBzdHJidWYgKnN0cmJ1ZiA9ICZpbmZvLT5zdHJidWY7CiAJaW9wdGVfdCAqYmFzZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzLCBucGFnZXMsIGk7CiAKQEAgLTMzNSwxNSArMzI5LDE1IEBACiAJbnBhZ2VzID0gSU9fUEFHRV9BTElHTihidXNfYWRkciArIHN6KSAtIChidXNfYWRkciAmIElPX1BBR0VfTUFTSyk7CiAJbnBhZ2VzID4+PSBJT19QQUdFX1NISUZUOwogCWJhc2UgPSBpb21tdS0+cGFnZV90YWJsZSArCi0JCSgoYnVzX2FkZHIgLSBNQVBfQkFTRSkgPj4gSU9fUEFHRV9TSElGVCk7CisJCSgoYnVzX2FkZHIgLSBpb21tdS0+cGFnZV90YWJsZV9tYXBfYmFzZSkgPj4gSU9fUEFHRV9TSElGVCk7CiAKIAlidXNfYWRkciAmPSBJT19QQUdFX01BU0s7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaW9tbXUtPmxvY2ssIGZsYWdzKTsKLQlzYnVzX3N0cmJ1Zl9mbHVzaChpb21tdSwgYnVzX2FkZHIsIG5wYWdlcywgZGlyZWN0aW9uKTsKKwlzYnVzX3N0cmJ1Zl9mbHVzaChpb21tdSwgc3RyYnVmLCBidXNfYWRkciwgbnBhZ2VzLCBkaXJlY3Rpb24pOwogCWZvciAoaSA9IDA7IGkgPCBucGFnZXM7IGkrKykKIAkJaW9wdGVfdmFsKGJhc2VbaV0pID0gMFVMOwotCWZyZWVfbnBhZ2VzKGlvbW11LCBidXNfYWRkciAtIE1BUF9CQVNFLCBucGFnZXMpOworCWZyZWVfbnBhZ2VzKGlvbW11LCBidXNfYWRkciAtIGlvbW11LT5wYWdlX3RhYmxlX21hcF9iYXNlLCBucGFnZXMpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvbW11LT5sb2NrLCBmbGFncyk7CiB9CiAKQEAgLTQyNSw3ICs0MTksOCBAQAogCiBpbnQgc2J1c19tYXBfc2coc3RydWN0IHNidXNfZGV2ICpzZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbGlzdCwgaW50IG5lbGVtcywgaW50IGRpcmVjdGlvbikKIHsKLQlzdHJ1Y3Qgc2J1c19pb21tdSAqaW9tbXU7CisJc3RydWN0IHNidXNfaW5mbyAqaW5mbzsKKwlzdHJ1Y3QgaW9tbXUgKmlvbW11OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIG5wYWdlcywgaW9wdGVfcHJvdGVjdGlvbjsKIAlpb3B0ZV90ICpiYXNlOwogCXUzMiBkbWFfYmFzZTsKQEAgLTQ0Miw3ICs0MzcsOCBAQAogCQlyZXR1cm4gMTsKIAl9CiAKLQlpb21tdSA9IHNkZXYtPmJ1cy0+aW9tbXU7CisJaW5mbyA9IHNkZXYtPmJ1cy0+aW9tbXU7CisJaW9tbXUgPSAmaW5mby0+aW9tbXU7CiAKIAlpZiAodW5saWtlbHkoZGlyZWN0aW9uID09IFNCVVNfRE1BX05PTkUpKQogCQlCVUcoKTsKQEAgLTQ1Niw3ICs0NTIsNyBAQAogCWlmICh1bmxpa2VseShiYXNlID09IE5VTEwpKQogCQlCVUcoKTsKIAotCWRtYV9iYXNlID0gTUFQX0JBU0UgKworCWRtYV9iYXNlID0gaW9tbXUtPnBhZ2VfdGFibGVfbWFwX2Jhc2UgKwogCQkoKGJhc2UgLSBpb21tdS0+cGFnZV90YWJsZSkgPDwgSU9fUEFHRV9TSElGVCk7CiAKIAkvKiBOb3JtYWxpemUgRFZNQSBhZGRyZXNzZXMuICovCkBAIC00ODUsNyArNDgxLDkgQEAKIAogdm9pZCBzYnVzX3VubWFwX3NnKHN0cnVjdCBzYnVzX2RldiAqc2Rldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2xpc3QsIGludCBuZWxlbXMsIGludCBkaXJlY3Rpb24pCiB7Ci0Jc3RydWN0IHNidXNfaW9tbXUgKmlvbW11OworCXN0cnVjdCBzYnVzX2luZm8gKmluZm87CisJc3RydWN0IGlvbW11ICppb21tdTsKKwlzdHJ1Y3Qgc3RyYnVmICpzdHJidWY7CiAJaW9wdGVfdCAqYmFzZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzLCBpLCBucGFnZXM7CiAJdTMyIGJ1c19hZGRyOwpAQCAtNDkzLDcgKzQ5MSw5IEBACiAJaWYgKHVubGlrZWx5KGRpcmVjdGlvbiA9PSBTQlVTX0RNQV9OT05FKSkKIAkJQlVHKCk7CiAKLQlpb21tdSA9IHNkZXYtPmJ1cy0+aW9tbXU7CisJaW5mbyA9IHNkZXYtPmJ1cy0+aW9tbXU7CisJaW9tbXUgPSAmaW5mby0+aW9tbXU7CisJc3RyYnVmID0gJmluZm8tPnN0cmJ1ZjsKIAogCWJ1c19hZGRyID0gc2dsaXN0LT5kbWFfYWRkcmVzcyAmIElPX1BBR0VfTUFTSzsKIApAQCAtNTA1LDI5ICs1MDUsMzMgQEAKIAkJICBidXNfYWRkcikgPj4gSU9fUEFHRV9TSElGVDsKIAogCWJhc2UgPSBpb21tdS0+cGFnZV90YWJsZSArCi0JCSgoYnVzX2FkZHIgLSBNQVBfQkFTRSkgPj4gSU9fUEFHRV9TSElGVCk7CisJCSgoYnVzX2FkZHIgLSBpb21tdS0+cGFnZV90YWJsZV9tYXBfYmFzZSkgPj4gSU9fUEFHRV9TSElGVCk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaW9tbXUtPmxvY2ssIGZsYWdzKTsKLQlzYnVzX3N0cmJ1Zl9mbHVzaChpb21tdSwgYnVzX2FkZHIsIG5wYWdlcywgZGlyZWN0aW9uKTsKKwlzYnVzX3N0cmJ1Zl9mbHVzaChpb21tdSwgc3RyYnVmLCBidXNfYWRkciwgbnBhZ2VzLCBkaXJlY3Rpb24pOwogCWZvciAoaSA9IDA7IGkgPCBucGFnZXM7IGkrKykKIAkJaW9wdGVfdmFsKGJhc2VbaV0pID0gMFVMOwotCWZyZWVfbnBhZ2VzKGlvbW11LCBidXNfYWRkciAtIE1BUF9CQVNFLCBucGFnZXMpOworCWZyZWVfbnBhZ2VzKGlvbW11LCBidXNfYWRkciAtIGlvbW11LT5wYWdlX3RhYmxlX21hcF9iYXNlLCBucGFnZXMpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvbW11LT5sb2NrLCBmbGFncyk7CiB9CiAKIHZvaWQgc2J1c19kbWFfc3luY19zaW5nbGVfZm9yX2NwdShzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYsIGRtYV9hZGRyX3QgYnVzX2FkZHIsIHNpemVfdCBzeiwgaW50IGRpcmVjdGlvbikKIHsKLQlzdHJ1Y3Qgc2J1c19pb21tdSAqaW9tbXU7CisJc3RydWN0IHNidXNfaW5mbyAqaW5mbzsKKwlzdHJ1Y3QgaW9tbXUgKmlvbW11OworCXN0cnVjdCBzdHJidWYgKnN0cmJ1ZjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzLCBucGFnZXM7CiAKLQlpb21tdSA9IHNkZXYtPmJ1cy0+aW9tbXU7CisJaW5mbyA9IHNkZXYtPmJ1cy0+aW9tbXU7CisJaW9tbXUgPSAmaW5mby0+aW9tbXU7CisJc3RyYnVmID0gJmluZm8tPnN0cmJ1ZjsKIAogCW5wYWdlcyA9IElPX1BBR0VfQUxJR04oYnVzX2FkZHIgKyBzeikgLSAoYnVzX2FkZHIgJiBJT19QQUdFX01BU0spOwogCW5wYWdlcyA+Pj0gSU9fUEFHRV9TSElGVDsKIAlidXNfYWRkciAmPSBJT19QQUdFX01BU0s7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaW9tbXUtPmxvY2ssIGZsYWdzKTsKLQlzYnVzX3N0cmJ1Zl9mbHVzaChpb21tdSwgYnVzX2FkZHIsIG5wYWdlcywgZGlyZWN0aW9uKTsKKwlzYnVzX3N0cmJ1Zl9mbHVzaChpb21tdSwgc3RyYnVmLCBidXNfYWRkciwgbnBhZ2VzLCBkaXJlY3Rpb24pOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvbW11LT5sb2NrLCBmbGFncyk7CiB9CiAKQEAgLTUzNywxMSArNTQxLDE1IEBACiAKIHZvaWQgc2J1c19kbWFfc3luY19zZ19mb3JfY3B1KHN0cnVjdCBzYnVzX2RldiAqc2Rldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2xpc3QsIGludCBuZWxlbXMsIGludCBkaXJlY3Rpb24pCiB7Ci0Jc3RydWN0IHNidXNfaW9tbXUgKmlvbW11OworCXN0cnVjdCBzYnVzX2luZm8gKmluZm87CisJc3RydWN0IGlvbW11ICppb21tdTsKKwlzdHJ1Y3Qgc3RyYnVmICpzdHJidWY7CiAJdW5zaWduZWQgbG9uZyBmbGFncywgbnBhZ2VzLCBpOwogCXUzMiBidXNfYWRkcjsKIAotCWlvbW11ID0gc2Rldi0+YnVzLT5pb21tdTsKKwlpbmZvID0gc2Rldi0+YnVzLT5pb21tdTsKKwlpb21tdSA9ICZpbmZvLT5pb21tdTsKKwlzdHJidWYgPSAmaW5mby0+c3RyYnVmOwogCiAJYnVzX2FkZHIgPSBzZ2xpc3RbMF0uZG1hX2FkZHJlc3MgJiBJT19QQUdFX01BU0s7CiAJZm9yIChpID0gMDsgaSA8IG5lbGVtczsgaSsrKSB7CkBAIC01NTMsNyArNTYxLDcgQEAKIAkJICAtIGJ1c19hZGRyKSA+PiBJT19QQUdFX1NISUZUOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmlvbW11LT5sb2NrLCBmbGFncyk7Ci0Jc2J1c19zdHJidWZfZmx1c2goaW9tbXUsIGJ1c19hZGRyLCBucGFnZXMsIGRpcmVjdGlvbik7CisJc2J1c19zdHJidWZfZmx1c2goaW9tbXUsIHN0cmJ1ZiwgYnVzX2FkZHIsIG5wYWdlcywgZGlyZWN0aW9uKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb21tdS0+bG9jaywgZmxhZ3MpOwogfQogCkBAIC01NjQsMTIgKzU3MiwxMyBAQAogLyogRW5hYmxlIDY0LWJpdCBEVk1BIG1vZGUgZm9yIHRoZSBnaXZlbiBkZXZpY2UuICovCiB2b2lkIHNidXNfc2V0X3NidXM2NChzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYsIGludCBidXJzdHMpCiB7Ci0Jc3RydWN0IHNidXNfaW9tbXUgKmlvbW11ID0gc2Rldi0+YnVzLT5pb21tdTsKKwlzdHJ1Y3Qgc2J1c19pbmZvICppbmZvID0gc2Rldi0+YnVzLT5pb21tdTsKKwlzdHJ1Y3QgaW9tbXUgKmlvbW11ID0gJmluZm8tPmlvbW11OwogCWludCBzbG90ID0gc2Rldi0+c2xvdDsKIAl1bnNpZ25lZCBsb25nIGNmZ19yZWc7CiAJdTY0IHZhbDsKIAotCWNmZ19yZWcgPSBpb21tdS0+c2J1c19jb250cm9sX3JlZzsKKwljZmdfcmVnID0gaW9tbXUtPndyaXRlX2NvbXBsZXRlX3JlZzsKIAlzd2l0Y2ggKHNsb3QpIHsKIAljYXNlIDA6CiAJCWNmZ19yZWcgKz0gMHgyMFVMOwpAQCAtNzA0LDggKzcxMyw5IEBACiB1bnNpZ25lZCBpbnQgc2J1c19idWlsZF9pcnEodm9pZCAqYnVzY29va2llLCB1bnNpZ25lZCBpbnQgaW5vKQogewogCXN0cnVjdCBzYnVzX2J1cyAqc2J1cyA9IChzdHJ1Y3Qgc2J1c19idXMgKilidXNjb29raWU7Ci0Jc3RydWN0IHNidXNfaW9tbXUgKmlvbW11ID0gc2J1cy0+aW9tbXU7Ci0JdW5zaWduZWQgbG9uZyByZWdfYmFzZSA9IGlvbW11LT5zYnVzX2NvbnRyb2xfcmVnIC0gMHgyMDAwVUw7CisJc3RydWN0IHNidXNfaW5mbyAqaW5mbyA9IHNidXMtPmlvbW11OworCXN0cnVjdCBpb21tdSAqaW9tbXUgPSAmaW5mby0+aW9tbXU7CisJdW5zaWduZWQgbG9uZyByZWdfYmFzZSA9IGlvbW11LT53cml0ZV9jb21wbGV0ZV9yZWcgLSAweDIwMDBVTDsKIAl1bnNpZ25lZCBsb25nIGltYXAsIGljbHI7CiAJaW50IHNidXNfbGV2ZWwgPSAwOwogCkBAIC03NjYsOCArNzc2LDkgQEAKIHN0YXRpYyBpcnFyZXR1cm5fdCBzeXNpb191ZV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKIAlzdHJ1Y3Qgc2J1c19idXMgKnNidXMgPSBkZXZfaWQ7Ci0Jc3RydWN0IHNidXNfaW9tbXUgKmlvbW11ID0gc2J1cy0+aW9tbXU7Ci0JdW5zaWduZWQgbG9uZyByZWdfYmFzZSA9IGlvbW11LT5zYnVzX2NvbnRyb2xfcmVnIC0gMHgyMDAwVUw7CisJc3RydWN0IHNidXNfaW5mbyAqaW5mbyA9IHNidXMtPmlvbW11OworCXN0cnVjdCBpb21tdSAqaW9tbXUgPSAmaW5mby0+aW9tbXU7CisJdW5zaWduZWQgbG9uZyByZWdfYmFzZSA9IGlvbW11LT53cml0ZV9jb21wbGV0ZV9yZWcgLSAweDIwMDBVTDsKIAl1bnNpZ25lZCBsb25nIGFmc3JfcmVnLCBhZmFyX3JlZzsKIAl1bnNpZ25lZCBsb25nIGFmc3IsIGFmYXIsIGVycm9yX2JpdHM7CiAJaW50IHJlcG9ydGVkOwpAQCAtODM4LDggKzg0OSw5IEBACiBzdGF0aWMgaXJxcmV0dXJuX3Qgc3lzaW9fY2VfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7CiAJc3RydWN0IHNidXNfYnVzICpzYnVzID0gZGV2X2lkOwotCXN0cnVjdCBzYnVzX2lvbW11ICppb21tdSA9IHNidXMtPmlvbW11OwotCXVuc2lnbmVkIGxvbmcgcmVnX2Jhc2UgPSBpb21tdS0+c2J1c19jb250cm9sX3JlZyAtIDB4MjAwMFVMOworCXN0cnVjdCBzYnVzX2luZm8gKmluZm8gPSBzYnVzLT5pb21tdTsKKwlzdHJ1Y3QgaW9tbXUgKmlvbW11ID0gJmluZm8tPmlvbW11OworCXVuc2lnbmVkIGxvbmcgcmVnX2Jhc2UgPSBpb21tdS0+d3JpdGVfY29tcGxldGVfcmVnIC0gMHgyMDAwVUw7CiAJdW5zaWduZWQgbG9uZyBhZnNyX3JlZywgYWZhcl9yZWc7CiAJdW5zaWduZWQgbG9uZyBhZnNyLCBhZmFyLCBlcnJvcl9iaXRzOwogCWludCByZXBvcnRlZDsKQEAgLTkxNSwxMiArOTI3LDEzIEBACiBzdGF0aWMgaXJxcmV0dXJuX3Qgc3lzaW9fc2J1c19lcnJvcl9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKIAlzdHJ1Y3Qgc2J1c19idXMgKnNidXMgPSBkZXZfaWQ7Ci0Jc3RydWN0IHNidXNfaW9tbXUgKmlvbW11ID0gc2J1cy0+aW9tbXU7CisJc3RydWN0IHNidXNfaW5mbyAqaW5mbyA9IHNidXMtPmlvbW11OworCXN0cnVjdCBpb21tdSAqaW9tbXUgPSAmaW5mby0+aW9tbXU7CiAJdW5zaWduZWQgbG9uZyBhZnNyX3JlZywgYWZhcl9yZWcsIHJlZ19iYXNlOwogCXVuc2lnbmVkIGxvbmcgYWZzciwgYWZhciwgZXJyb3JfYml0czsKIAlpbnQgcmVwb3J0ZWQ7CiAKLQlyZWdfYmFzZSA9IGlvbW11LT5zYnVzX2NvbnRyb2xfcmVnIC0gMHgyMDAwVUw7CisJcmVnX2Jhc2UgPSBpb21tdS0+d3JpdGVfY29tcGxldGVfcmVnIC0gMHgyMDAwVUw7CiAJYWZzcl9yZWcgPSByZWdfYmFzZSArIFNZU0lPX1NCVVNfQUZTUjsKIAlhZmFyX3JlZyA9IHJlZ19iYXNlICsgU1lTSU9fU0JVU19BRkFSOwogCkBAIC05ODIsOCArOTk1LDkgQEAKIAogc3RhdGljIHZvaWQgX19pbml0IHN5c2lvX3JlZ2lzdGVyX2Vycm9yX2hhbmRsZXJzKHN0cnVjdCBzYnVzX2J1cyAqc2J1cykKIHsKLQlzdHJ1Y3Qgc2J1c19pb21tdSAqaW9tbXUgPSBzYnVzLT5pb21tdTsKLQl1bnNpZ25lZCBsb25nIHJlZ19iYXNlID0gaW9tbXUtPnNidXNfY29udHJvbF9yZWcgLSAweDIwMDBVTDsKKwlzdHJ1Y3Qgc2J1c19pbmZvICppbmZvID0gc2J1cy0+aW9tbXU7CisJc3RydWN0IGlvbW11ICppb21tdSA9ICZpbmZvLT5pb21tdTsKKwl1bnNpZ25lZCBsb25nIHJlZ19iYXNlID0gaW9tbXUtPndyaXRlX2NvbXBsZXRlX3JlZyAtIDB4MjAwMFVMOwogCXVuc2lnbmVkIGludCBpcnE7CiAJdTY0IGNvbnRyb2w7CiAKQEAgLTEwMTcsMTggKzEwMzEsMjAgQEAKIAkJICAgIFNZU0lPX0VDTlRSTF9DRUVOKSwKIAkJICAgcmVnX2Jhc2UgKyBFQ0NfQ09OVFJPTCk7CiAKLQljb250cm9sID0gdXBhX3JlYWRxKGlvbW11LT5zYnVzX2NvbnRyb2xfcmVnKTsKKwljb250cm9sID0gdXBhX3JlYWRxKGlvbW11LT53cml0ZV9jb21wbGV0ZV9yZWcpOwogCWNvbnRyb2wgfD0gMHgxMDBVTDsgLyogU0JVUyBFcnJvciBJbnRlcnJ1cHQgRW5hYmxlICovCi0JdXBhX3dyaXRlcShjb250cm9sLCBpb21tdS0+c2J1c19jb250cm9sX3JlZyk7CisJdXBhX3dyaXRlcShjb250cm9sLCBpb21tdS0+d3JpdGVfY29tcGxldGVfcmVnKTsKIH0KIAogLyogQm9vdCB0aW1lIGluaXRpYWxpemF0aW9uLiAqLwogc3RhdGljIHZvaWQgX19pbml0IHNidXNfaW9tbXVfaW5pdChpbnQgX19ub2RlLCBzdHJ1Y3Qgc2J1c19idXMgKnNidXMpCiB7Ci0Jc3RydWN0IGxpbnV4X3Byb202NF9yZWdpc3RlcnMgKnByOworCWNvbnN0IHN0cnVjdCBsaW51eF9wcm9tNjRfcmVnaXN0ZXJzICpwcjsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwOwotCXN0cnVjdCBzYnVzX2lvbW11ICppb21tdTsKLQl1bnNpZ25lZCBsb25nIHJlZ3M7CisJc3RydWN0IHNidXNfaW5mbyAqaW5mbzsKKwlzdHJ1Y3QgaW9tbXUgKmlvbW11OworCXN0cnVjdCBzdHJidWYgKnN0cmJ1ZjsKKwl1bnNpZ25lZCBsb25nIHJlZ3MsIHJlZ19iYXNlOwogCXU2NCBjb250cm9sOwogCWludCBpOwogCkBAIC0xMDQzLDMzICsxMDU5LDQyIEBACiAJfQogCXJlZ3MgPSBwci0+cGh5c19hZGRyOwogCi0JaW9tbXUgPSBrbWFsbG9jKHNpemVvZigqaW9tbXUpICsgU01QX0NBQ0hFX0JZVEVTLCBHRlBfQVRPTUlDKTsKLQlpZiAoaW9tbXUgPT0gTlVMTCkgewotCQlwcm9tX3ByaW50Zigic2J1c19pb21tdV9pbml0OiBGYXRhbCBlcnJvciwga21hbGxvYyhpb21tdSkgZmFpbGVkXG4iKTsKKwlpbmZvID0ga3phbGxvYyhzaXplb2YoKmluZm8pLCBHRlBfQVRPTUlDKTsKKwlpZiAoaW5mbyA9PSBOVUxMKSB7CisJCXByb21fcHJpbnRmKCJzYnVzX2lvbW11X2luaXQ6IEZhdGFsIGVycm9yLCAiCisJCQkgICAgImttYWxsb2MoaW5mbykgZmFpbGVkXG4iKTsKIAkJcHJvbV9oYWx0KCk7CiAJfQogCi0JLyogQWxpZ24gb24gRSQgbGluZSBib3VuZGFyeS4gKi8KLQlpb21tdSA9IChzdHJ1Y3Qgc2J1c19pb21tdSAqKQotCQkoKCh1bnNpZ25lZCBsb25nKWlvbW11ICsgKFNNUF9DQUNIRV9CWVRFUyAtIDFVTCkpICYKLQkJIH4oU01QX0NBQ0hFX0JZVEVTIC0gMVVMKSk7CisJaW9tbXUgPSAmaW5mby0+aW9tbXU7CisJc3RyYnVmID0gJmluZm8tPnN0cmJ1ZjsKIAotCW1lbXNldChpb21tdSwgMCwgc2l6ZW9mKCppb21tdSkpOworCXJlZ19iYXNlID0gcmVncyArIFNZU0lPX0lPTU1VUkVHX0JBU0U7CisJaW9tbXUtPmlvbW11X2NvbnRyb2wgPSByZWdfYmFzZSArIElPTU1VX0NPTlRST0w7CisJaW9tbXUtPmlvbW11X3RzYmJhc2UgPSByZWdfYmFzZSArIElPTU1VX1RTQkJBU0U7CisJaW9tbXUtPmlvbW11X2ZsdXNoID0gcmVnX2Jhc2UgKyBJT01NVV9GTFVTSDsKIAotCS8qIFNldHVwIHNwaW5sb2NrLiAqLwotCXNwaW5fbG9ja19pbml0KCZpb21tdS0+bG9jayk7CisJcmVnX2Jhc2UgPSByZWdzICsgU1lTSU9fU1RSQlVGUkVHX0JBU0U7CisJc3RyYnVmLT5zdHJidWZfY29udHJvbCA9IHJlZ19iYXNlICsgU1RSQlVGX0NPTlRST0w7CisJc3RyYnVmLT5zdHJidWZfcGZsdXNoID0gcmVnX2Jhc2UgKyBTVFJCVUZfUEZMVVNIOworCXN0cmJ1Zi0+c3RyYnVmX2ZzeW5jID0gcmVnX2Jhc2UgKyBTVFJCVUZfRlNZTkM7CiAKLQkvKiBJbml0IHJlZ2lzdGVyIG9mZnNldHMuICovCi0JaW9tbXUtPmlvbW11X3JlZ3MgPSByZWdzICsgU1lTSU9fSU9NTVVSRUdfQkFTRTsKLQlpb21tdS0+c3RyYnVmX3JlZ3MgPSByZWdzICsgU1lTSU9fU1RSQlVGUkVHX0JBU0U7CisJc3RyYnVmLT5zdHJidWZfZW5hYmxlZCA9IDE7CisKKwlzdHJidWYtPnN0cmJ1Zl9mbHVzaGZsYWcgPSAodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKQorCQkoKCgodW5zaWduZWQgbG9uZykmc3RyYnVmLT5fX2ZsdXNoZmxhZ19idWZbMF0pCisJCSAgKyA2M1VMKQorCQkgJiB+NjNVTCk7CisJc3RyYnVmLT5zdHJidWZfZmx1c2hmbGFnX3BhID0gKHVuc2lnbmVkIGxvbmcpCisJCV9fcGEoc3RyYnVmLT5zdHJidWZfZmx1c2hmbGFnKTsKIAogCS8qIFRoZSBTWVNJTyBTQlVTIGNvbnRyb2wgcmVnaXN0ZXIgaXMgdXNlZCBmb3IgZHVtbXkgcmVhZHMKIAkgKiBpbiBvcmRlciB0byBlbnN1cmUgd3JpdGUgY29tcGxldGlvbi4KIAkgKi8KLQlpb21tdS0+c2J1c19jb250cm9sX3JlZyA9IHJlZ3MgKyAweDIwMDBVTDsKKwlpb21tdS0+d3JpdGVfY29tcGxldGVfcmVnID0gcmVncyArIDB4MjAwMFVMOwogCiAJLyogTGluayBpbnRvIFNZU0lPIHNvZnR3YXJlIHN0YXRlLiAqLwotCXNidXMtPmlvbW11ID0gaW9tbXU7CisJc2J1cy0+aW9tbXUgPSBpbmZvOwogCiAJcHJpbnRrKCJTWVNJTzogVVBBIHBvcnRJRCAleCwgYXQgJTAxNmx4XG4iLAogCSAgICAgICBzYnVzLT5wb3J0aWQsIHJlZ3MpOwpAQCAtMTA3Nyw0MCArMTEwMiw0NCBAQAogCS8qIFNldHVwIGZvciBUU0JfU0laRT03LCBUQldfU0laRT0wLCBNTVVfREU9MSwgTU1VX0VOPTEgKi8KIAlzYnVzX2lvbW11X3RhYmxlX2luaXQoaW9tbXUsIElPX1RTQl9TSVpFKTsKIAotCWNvbnRyb2wgPSB1cGFfcmVhZHEoaW9tbXUtPmlvbW11X3JlZ3MgKyBJT01NVV9DT05UUk9MKTsKKwljb250cm9sID0gdXBhX3JlYWRxKGlvbW11LT5pb21tdV9jb250cm9sKTsKIAljb250cm9sID0gKCg3VUwgPDwgMTZVTCkJfAogCQkgICAoMFVMIDw8IDJVTCkJCXwKIAkJICAgKDFVTCA8PCAxVUwpCQl8CiAJCSAgICgxVUwgPDwgMFVMKSk7Ci0JdXBhX3dyaXRlcShjb250cm9sLCBpb21tdS0+aW9tbXVfcmVncyArIElPTU1VX0NPTlRST0wpOworCXVwYV93cml0ZXEoY29udHJvbCwgaW9tbXUtPmlvbW11X2NvbnRyb2wpOwogCiAJLyogQ2xlYW4gb3V0IGFueSBjcnVmdCBpbiB0aGUgSU9NTVUgdXNpbmcKIAkgKiBkaWFnbm9zdGljIGFjY2Vzc2VzLgogCSAqLwogCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7Ci0JCXVuc2lnbmVkIGxvbmcgZHJhbSA9IGlvbW11LT5pb21tdV9yZWdzICsgSU9NTVVfRFJBTURJQUc7Ci0JCXVuc2lnbmVkIGxvbmcgdGFnID0gaW9tbXUtPmlvbW11X3JlZ3MgKyBJT01NVV9UQUdESUFHOworCQl1bnNpZ25lZCBsb25nIGRyYW0sIHRhZzsKKworCQlkcmFtID0gaW9tbXUtPmlvbW11X2NvbnRyb2wgKyAoSU9NTVVfRFJBTURJQUcgLSBJT01NVV9DT05UUk9MKTsKKwkJdGFnID0gaW9tbXUtPmlvbW11X2NvbnRyb2wgKyAoSU9NTVVfVEFHRElBRyAtIElPTU1VX0NPTlRST0wpOwogCiAJCWRyYW0gKz0gKHVuc2lnbmVkIGxvbmcpaSAqIDhVTDsKIAkJdGFnICs9ICh1bnNpZ25lZCBsb25nKWkgKiA4VUw7CiAJCXVwYV93cml0ZXEoMCwgZHJhbSk7CiAJCXVwYV93cml0ZXEoMCwgdGFnKTsKIAl9Ci0JdXBhX3JlYWRxKGlvbW11LT5zYnVzX2NvbnRyb2xfcmVnKTsKKwl1cGFfcmVhZHEoaW9tbXUtPndyaXRlX2NvbXBsZXRlX3JlZyk7CiAKIAkvKiBHaXZlIHRoZSBUU0IgdG8gU1lTSU8uICovCi0JdXBhX3dyaXRlcShfX3BhKGlvbW11LT5wYWdlX3RhYmxlKSwgaW9tbXUtPmlvbW11X3JlZ3MgKyBJT01NVV9UU0JCQVNFKTsKKwl1cGFfd3JpdGVxKF9fcGEoaW9tbXUtPnBhZ2VfdGFibGUpLCBpb21tdS0+aW9tbXVfdHNiYmFzZSk7CiAKIAkvKiBTZXR1cCBzdHJlYW1pbmcgYnVmZmVyLCBERT0xIFNCX0VOPTEgKi8KIAljb250cm9sID0gKDFVTCA8PCAxVUwpIHwgKDFVTCA8PCAwVUwpOwotCXVwYV93cml0ZXEoY29udHJvbCwgaW9tbXUtPnN0cmJ1Zl9yZWdzICsgU1RSQlVGX0NPTlRST0wpOworCXVwYV93cml0ZXEoY29udHJvbCwgc3RyYnVmLT5zdHJidWZfY29udHJvbCk7CiAKIAkvKiBDbGVhciBvdXQgdGhlIHRhZ3MgdXNpbmcgZGlhZ25vc3RpY3MuICovCiAJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKIAkJdW5zaWduZWQgbG9uZyBwdGFnLCBsdGFnOwogCi0JCXB0YWcgPSBpb21tdS0+c3RyYnVmX3JlZ3MgKyBTVFJCVUZfUFRBR0RJQUc7Ci0JCWx0YWcgPSBpb21tdS0+c3RyYnVmX3JlZ3MgKyBTVFJCVUZfTFRBR0RJQUc7CisJCXB0YWcgPSBzdHJidWYtPnN0cmJ1Zl9jb250cm9sICsKKwkJCShTVFJCVUZfUFRBR0RJQUcgLSBTVFJCVUZfQ09OVFJPTCk7CisJCWx0YWcgPSBzdHJidWYtPnN0cmJ1Zl9jb250cm9sICsKKwkJCShTVFJCVUZfTFRBR0RJQUcgLSBTVFJCVUZfQ09OVFJPTCk7CiAJCXB0YWcgKz0gKHVuc2lnbmVkIGxvbmcpaSAqIDhVTDsKIAkJbHRhZyArPSAodW5zaWduZWQgbG9uZylpICogOFVMOwogCkBAIC0xMTE5LDkgKzExNDgsOSBAQAogCX0KIAogCS8qIEVuYWJsZSBEVk1BIGFyYml0cmF0aW9uIGZvciBhbGwgZGV2aWNlcy9zbG90cy4gKi8KLQljb250cm9sID0gdXBhX3JlYWRxKGlvbW11LT5zYnVzX2NvbnRyb2xfcmVnKTsKKwljb250cm9sID0gdXBhX3JlYWRxKGlvbW11LT53cml0ZV9jb21wbGV0ZV9yZWcpOwogCWNvbnRyb2wgfD0gMHgzZlVMOwotCXVwYV93cml0ZXEoY29udHJvbCwgaW9tbXUtPnNidXNfY29udHJvbF9yZWcpOworCXVwYV93cml0ZXEoY29udHJvbCwgaW9tbXUtPndyaXRlX2NvbXBsZXRlX3JlZyk7CiAKIAkvKiBOb3cgc29tZSBYZmlyZSBzcGVjaWZpYyBncm90Li4uICovCiAJaWYgKHRoaXNfaXNfc3RhcmZpcmUpCkBAIC0xMTMzLDcgKzExNjIsNyBAQAogdm9pZCBzYnVzX2ZpbGxfZGV2aWNlX2lycShzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpkcCA9IG9mX2ZpbmRfbm9kZV9ieV9waGFuZGxlKHNkZXYtPnByb21fbm9kZSk7Ci0Jc3RydWN0IGxpbnV4X3Byb21faXJxcyAqaXJxczsKKwljb25zdCBzdHJ1Y3QgbGludXhfcHJvbV9pcnFzICppcnFzOwogCiAJaXJxcyA9IG9mX2dldF9wcm9wZXJ0eShkcCwgImludGVycnVwdHMiLCBOVUxMKTsKIAlpZiAoIWlycXMpIHsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvc21wLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3NtcC5jCmluZGV4IGZjOTlmN2IuLmQ0ZjBhNzAgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvc21wLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9zbXAuYwpAQCAtNDUsNyArNDUsNyBAQAogZXh0ZXJuIHZvaWQgY2FsaWJyYXRlX2RlbGF5KHZvaWQpOwogCiAvKiBQbGVhc2UgZG9uJ3QgbWFrZSB0aGlzIHN0dWZmIGluaXRkYXRhISEhICAtLURhdmVNICovCi1zdGF0aWMgdW5zaWduZWQgY2hhciBib290X2NwdV9pZDsKK3Vuc2lnbmVkIGNoYXIgYm9vdF9jcHVfaWQ7CiAKIGNwdW1hc2tfdCBjcHVfb25saW5lX21hcCBfX3JlYWRfbW9zdGx5ID0gQ1BVX01BU0tfTk9ORTsKIGNwdW1hc2tfdCBwaHlzX2NwdV9wcmVzZW50X21hcCBfX3JlYWRfbW9zdGx5ID0gQ1BVX01BU0tfTk9ORTsKQEAgLTgxLDggKzgxLDYgQEAKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwOwogCWludCBkZWY7CiAKLQkvKiBtdWx0aXBsaWVyIGFuZCBjb3VudGVyIHNldCBieQotCSAgIHNtcF9zZXR1cF9wZXJjcHVfdGltZXIoKSAgKi8KIAljcHVfZGF0YShpZCkudWRlbGF5X3ZhbAkJCT0gbG9vcHNfcGVyX2ppZmZ5OwogCiAJY3B1X2ZpbmRfYnlfbWlkKGlkLCAmZHApOwpAQCAtMTI1LDcgKzEyMyw3IEBACiAJICAgICAgIGNwdV9kYXRhKGlkKS5lY2FjaGVfc2l6ZSwgY3B1X2RhdGEoaWQpLmVjYWNoZV9saW5lX3NpemUpOwogfQogCi1zdGF0aWMgdm9pZCBzbXBfc2V0dXBfcGVyY3B1X3RpbWVyKHZvaWQpOworZXh0ZXJuIHZvaWQgc2V0dXBfc3BhcmM2NF90aW1lcih2b2lkKTsKIAogc3RhdGljIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgY2FsbGluX2ZsYWcgPSAwOwogCkBAIC0xNDAsNyArMTM4LDcgQEAKIAogCV9fZmx1c2hfdGxiX2FsbCgpOwogCi0Jc21wX3NldHVwX3BlcmNwdV90aW1lcigpOworCXNldHVwX3NwYXJjNjRfdGltZXIoKTsKIAogCWlmIChjaGVldGFoX3BjYWNoZV9mb3JjZWRfb24pCiAJCWNoZWV0YWhfZW5hYmxlX3BjYWNoZSgpOwpAQCAtMTc3LDggKzE3NSw2IEBACiAJcGFuaWMoIlNNUCBib2xpeGVkXG4iKTsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgY3VycmVudF90aWNrX29mZnNldCBfX3JlYWRfbW9zdGx5OwotCiAvKiBUaGlzIHRpY2sgcmVnaXN0ZXIgc3luY2hyb25pemF0aW9uIHNjaGVtZSBpcyB0YWtlbiBlbnRpcmVseSBmcm9tCiAgKiB0aGUgaWE2NCBwb3J0LCBzZWUgYXJjaC9pYTY0L2tlcm5lbC9zbXBib290LmMgZm9yIGRldGFpbHMgYW5kIGNyZWRpdC4KICAqCkBAIC0yNjEsNyArMjU3LDcgQEAKIAkJCQl9IGVsc2UKIAkJCQkJYWRqID0gLWRlbHRhOwogCi0JCQkJdGlja19vcHMtPmFkZF90aWNrKGFkaiwgY3VycmVudF90aWNrX29mZnNldCk7CisJCQkJdGlja19vcHMtPmFkZF90aWNrKGFkaik7CiAJCQl9CiAjaWYgREVCVUdfVElDS19TWU5DCiAJCQl0W2ldLnJ0ID0gcnQ7CkBAIC0xMTgwLDExNyArMTE3NiwxNSBAQAogCXByZWVtcHRfZW5hYmxlKCk7CiB9CiAKLSNkZWZpbmUgcHJvZl9tdWx0aXBsaWVyKF9fY3B1KQkJY3B1X2RhdGEoX19jcHUpLm11bHRpcGxpZXIKLSNkZWZpbmUgcHJvZl9jb3VudGVyKF9fY3B1KQkJY3B1X2RhdGEoX19jcHUpLmNvdW50ZXIKLQotdm9pZCBzbXBfcGVyY3B1X3RpbWVyX2ludGVycnVwdChzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQl1bnNpZ25lZCBsb25nIGNvbXBhcmUsIHRpY2ssIHBzdGF0ZTsKLQlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwotCWludCB1c2VyID0gdXNlcl9tb2RlKHJlZ3MpOwotCXN0cnVjdCBwdF9yZWdzICpvbGRfcmVnczsKLQotCS8qCi0JICogQ2hlY2sgZm9yIGxldmVsIDE0IHNvZnRpbnQuCi0JICovCi0JewotCQl1bnNpZ25lZCBsb25nIHRpY2tfbWFzayA9IHRpY2tfb3BzLT5zb2Z0aW50X21hc2s7Ci0KLQkJaWYgKCEoZ2V0X3NvZnRpbnQoKSAmIHRpY2tfbWFzaykpIHsKLQkJCWV4dGVybiB2b2lkIGhhbmRsZXJfaXJxKGludCwgc3RydWN0IHB0X3JlZ3MgKik7Ci0KLQkJCWhhbmRsZXJfaXJxKDE0LCByZWdzKTsKLQkJCXJldHVybjsKLQkJfQotCQljbGVhcl9zb2Z0aW50KHRpY2tfbWFzayk7Ci0JfQotCi0Jb2xkX3JlZ3MgPSBzZXRfaXJxX3JlZ3MocmVncyk7Ci0JZG8gewotCQlwcm9maWxlX3RpY2soQ1BVX1BST0ZJTElORyk7Ci0JCWlmICghLS1wcm9mX2NvdW50ZXIoY3B1KSkgewotCQkJaXJxX2VudGVyKCk7Ci0KLQkJCWlmIChjcHUgPT0gYm9vdF9jcHVfaWQpIHsKLQkJCQlrc3RhdF90aGlzX2NwdS5pcnFzWzBdKys7Ci0JCQkJdGltZXJfdGlja19pbnRlcnJ1cHQocmVncyk7Ci0JCQl9Ci0KLQkJCXVwZGF0ZV9wcm9jZXNzX3RpbWVzKHVzZXIpOwotCi0JCQlpcnFfZXhpdCgpOwotCi0JCQlwcm9mX2NvdW50ZXIoY3B1KSA9IHByb2ZfbXVsdGlwbGllcihjcHUpOwotCQl9Ci0KLQkJLyogR3VhcmFudGVlIHRoYXQgdGhlIGZvbGxvd2luZyBzZXF1ZW5jZXMgZXhlY3V0ZQotCQkgKiB1bmludGVycnVwdGVkLgotCQkgKi8KLQkJX19hc21fXyBfX3ZvbGF0aWxlX18oInJkcHIJJSVwc3RhdGUsICUwXG5cdCIKLQkJCQkgICAgICJ3cnByCSUwLCAlMSwgJSVwc3RhdGUiCi0JCQkJICAgICA6ICI9ciIgKHBzdGF0ZSkKLQkJCQkgICAgIDogImkiIChQU1RBVEVfSUUpKTsKLQotCQljb21wYXJlID0gdGlja19vcHMtPmFkZF9jb21wYXJlKGN1cnJlbnRfdGlja19vZmZzZXQpOwotCQl0aWNrID0gdGlja19vcHMtPmdldF90aWNrKCk7Ci0KLQkJLyogUmVzdG9yZSBQU1RBVEVfSUUuICovCi0JCV9fYXNtX18gX192b2xhdGlsZV9fKCJ3cnByCSUwLCAweDAsICUlcHN0YXRlIgotCQkJCSAgICAgOiAvKiBubyBvdXRwdXRzICovCi0JCQkJICAgICA6ICJyIiAocHN0YXRlKSk7Ci0JfSB3aGlsZSAodGltZV9hZnRlcl9lcSh0aWNrLCBjb21wYXJlKSk7Ci0Jc2V0X2lycV9yZWdzKG9sZF9yZWdzKTsKLX0KLQotc3RhdGljIHZvaWQgX19pbml0IHNtcF9zZXR1cF9wZXJjcHVfdGltZXIodm9pZCkKLXsKLQlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwotCXVuc2lnbmVkIGxvbmcgcHN0YXRlOwotCi0JcHJvZl9jb3VudGVyKGNwdSkgPSBwcm9mX211bHRpcGxpZXIoY3B1KSA9IDE7Ci0KLQkvKiBHdWFyYW50ZWUgdGhhdCB0aGUgZm9sbG93aW5nIHNlcXVlbmNlcyBleGVjdXRlCi0JICogdW5pbnRlcnJ1cHRlZC4KLQkgKi8KLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygicmRwcgklJXBzdGF0ZSwgJTBcblx0IgotCQkJICAgICAid3JwcgklMCwgJTEsICUlcHN0YXRlIgotCQkJICAgICA6ICI9ciIgKHBzdGF0ZSkKLQkJCSAgICAgOiAiaSIgKFBTVEFURV9JRSkpOwotCi0JdGlja19vcHMtPmluaXRfdGljayhjdXJyZW50X3RpY2tfb2Zmc2V0KTsKLQotCS8qIFJlc3RvcmUgUFNUQVRFX0lFLiAqLwotCV9fYXNtX18gX192b2xhdGlsZV9fKCJ3cnByCSUwLCAweDAsICUlcHN0YXRlIgotCQkJICAgICA6IC8qIG5vIG91dHB1dHMgKi8KLQkJCSAgICAgOiAiciIgKHBzdGF0ZSkpOwotfQotCiB2b2lkIF9faW5pdCBzbXBfdGlja19pbml0KHZvaWQpCiB7CiAJYm9vdF9jcHVfaWQgPSBoYXJkX3NtcF9wcm9jZXNzb3JfaWQoKTsKLQljdXJyZW50X3RpY2tfb2Zmc2V0ID0gdGltZXJfdGlja19vZmZzZXQ7Ci0KLQlwcm9mX2NvdW50ZXIoYm9vdF9jcHVfaWQpID0gcHJvZl9tdWx0aXBsaWVyKGJvb3RfY3B1X2lkKSA9IDE7CiB9CiAKIC8qIC9wcm9jL3Byb2ZpbGUgd3JpdGVzIGNhbiBjYWxsIHRoaXMsIGRvbid0IF9faW5pdCBpdCBwbGVhc2UuICovCi1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKHByb2Zfc2V0dXBfbG9jayk7Ci0KIGludCBzZXR1cF9wcm9maWxpbmdfdGltZXIodW5zaWduZWQgaW50IG11bHRpcGxpZXIpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgaTsKLQotCWlmICgoIW11bHRpcGxpZXIpIHx8ICh0aW1lcl90aWNrX29mZnNldCAvIG11bHRpcGxpZXIpIDwgMTAwMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJvZl9zZXR1cF9sb2NrLCBmbGFncyk7Ci0JZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpCi0JCXByb2ZfbXVsdGlwbGllcihpKSA9IG11bHRpcGxpZXI7Ci0JY3VycmVudF90aWNrX29mZnNldCA9ICh0aW1lcl90aWNrX29mZnNldCAvIG11bHRpcGxpZXIpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByb2Zfc2V0dXBfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIDA7CisJcmV0dXJuIC1FSU5WQUw7CiB9CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBzbXBfdHVuZV9zY2hlZHVsaW5nKHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3NwYXJjNjRfa3N5bXMuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3BhcmM2NF9rc3ltcy5jCmluZGV4IGJlZmZjODIuLmQwMGY1MWEgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3BhcmM2NF9rc3ltcy5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3BhcmM2NF9rc3ltcy5jCkBAIC0yMTIsNyArMjEyLDYgQEAKICNpZmRlZiBDT05GSUdfUENJCiBFWFBPUlRfU1lNQk9MKGVidXNfY2hhaW4pOwogRVhQT1JUX1NZTUJPTChpc2FfY2hhaW4pOwotRVhQT1JUX1NZTUJPTChwY2lfbWVtc3BhY2VfbWFzayk7CiBFWFBPUlRfU1lNQk9MKHBjaV9hbGxvY19jb25zaXN0ZW50KTsKIEVYUE9SVF9TWU1CT0wocGNpX2ZyZWVfY29uc2lzdGVudCk7CiBFWFBPUlRfU1lNQk9MKHBjaV9tYXBfc2luZ2xlKTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvdGltZS5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC90aW1lLmMKaW5kZXggZjg0ZGE0Zi4uMjU5MDYzZiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC90aW1lLmMKQEAgLTMxLDYgKzMxLDkgQEAKICNpbmNsdWRlIDxsaW51eC9wcm9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvY2xvY2tjaGlwcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsb2Nrc291cmNlLmg+CiAKICNpbmNsdWRlIDxhc20vb3BsaWIuaD4KICNpbmNsdWRlIDxhc20vbW9zdGVrLmg+CkBAIC02MCw2ICs2Myw3IEBACiBzdGF0aWMgaW50IHNldF9ydGNfbW1zcyh1bnNpZ25lZCBsb25nKTsKIAogI2RlZmluZSBUSUNLX1BSSVZfQklUCSgxVUwgPDwgNjMpCisjZGVmaW5lIFRJQ0tDTVBfSVJRX0JJVAkoMVVMIDw8IDYzKQogCiAjaWZkZWYgQ09ORklHX1NNUAogdW5zaWduZWQgbG9uZyBwcm9maWxlX3BjKHN0cnVjdCBwdF9yZWdzICpyZWdzKQpAQCAtOTMsMjEgKzk3LDIyIEBACiAJOiAiZzIiKTsKIH0KIAotc3RhdGljIHZvaWQgdGlja19pbml0X3RpY2sodW5zaWduZWQgbG9uZyBvZmZzZXQpCitzdGF0aWMgdm9pZCB0aWNrX2Rpc2FibGVfaXJxKHZvaWQpCiB7Ci0JdGlja19kaXNhYmxlX3Byb3RlY3Rpb24oKTsKLQogCV9fYXNtX18gX192b2xhdGlsZV9fKAotCSIJcmQJJSV0aWNrLCAlJWcxXG4iCi0JIglhbmRuCSUlZzEsICUxLCAlJWcxXG4iCiAJIgliYSxwdAklJXhjYywgMWZcbiIKLQkiCSBhZGQJJSVnMSwgJTAsICUlZzFcbiIKKwkiCSBub3BcbiIKIAkiCS5hbGlnbgk2NFxuIgotCSIxOgl3cgklJWcxLCAweDAsICUldGlja19jbXByXG4iCisJIjE6CXdyCSUwLCAweDAsICUldGlja19jbXByXG4iCiAJIglyZAklJXRpY2tfY21wciwgJSVnMCIKIAk6IC8qIG5vIG91dHB1dHMgKi8KLQk6ICJyIiAob2Zmc2V0KSwgInIiIChUSUNLX1BSSVZfQklUKQotCTogImcxIik7CisJOiAiciIgKFRJQ0tDTVBfSVJRX0JJVCkpOworfQorCitzdGF0aWMgdm9pZCB0aWNrX2luaXRfdGljayh2b2lkKQoreworCXRpY2tfZGlzYWJsZV9wcm90ZWN0aW9uKCk7CisJdGlja19kaXNhYmxlX2lycSgpOwogfQogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyB0aWNrX2dldF90aWNrKHZvaWQpCkBAIC0xMjEsMjAgKzEyNiwxNCBAQAogCXJldHVybiByZXQgJiB+VElDS19QUklWX0JJVDsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgdGlja19nZXRfY29tcGFyZSh2b2lkKQorc3RhdGljIGludCB0aWNrX2FkZF9jb21wYXJlKHVuc2lnbmVkIGxvbmcgYWRqKQogewotCXVuc2lnbmVkIGxvbmcgcmV0OworCXVuc2lnbmVkIGxvbmcgb3JpZ190aWNrLCBuZXdfdGljaywgbmV3X2NvbXBhcmU7CiAKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygicmQJJSV0aWNrX2NtcHIsICUwXG5cdCIKLQkJCSAgICAgIm1vdgklMCwgJTAiCi0JCQkgICAgIDogIj1yIiAocmV0KSk7CisJX19hc21fXyBfX3ZvbGF0aWxlX18oInJkCSUldGljaywgJTAiCisJCQkgICAgIDogIj1yIiAob3JpZ190aWNrKSk7CiAKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyB0aWNrX2FkZF9jb21wYXJlKHVuc2lnbmVkIGxvbmcgYWRqKQotewotCXVuc2lnbmVkIGxvbmcgbmV3X2NvbXBhcmU7CisJb3JpZ190aWNrICY9IH5USUNLQ01QX0lSUV9CSVQ7CiAKIAkvKiBXb3JrYXJvdW5kIGZvciBTcGl0ZmlyZSBFcnJhdGEgKCM1NCBJIHRoaW5rPz8pLCBJIGRpc2NvdmVyZWQKIAkgKiB0aGlzIHZpYSBTdW4gQnVnSUQgNDAwODIzNCwgbWVudGlvbmVkIGluIFNvbGFyaXMtMi41LjEgcGF0Y2gKQEAgLTE0NSw0NCArMTQ0LDQxIEBACiAJICogYXQgdGhlIHN0YXJ0IG9mIGFuIEktY2FjaGUgbGluZSwgYW5kIHBlcmZvcm0gYSBkdW1teQogCSAqIHJlYWQgYmFjayBmcm9tICV0aWNrX2NtcHIgcmlnaHQgYWZ0ZXIgd3JpdGluZyB0byBpdC4gLURhdmVNCiAJICovCi0JX19hc21fXyBfX3ZvbGF0aWxlX18oInJkCSUldGlja19jbXByLCAlMFxuXHQiCi0JCQkgICAgICJiYSxwdAklJXhjYywgMWZcblx0IgotCQkJICAgICAiIGFkZAklMCwgJTEsICUwXG5cdCIKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygiYmEscHQJJSV4Y2MsIDFmXG5cdCIKKwkJCSAgICAgIiBhZGQJJTEsICUyLCAlMFxuXHQiCiAJCQkgICAgICIuYWxpZ24JNjRcbiIKIAkJCSAgICAgIjE6XG5cdCIKIAkJCSAgICAgIndyCSUwLCAwLCAlJXRpY2tfY21wclxuXHQiCi0JCQkgICAgICJyZAklJXRpY2tfY21wciwgJSVnMCIKLQkJCSAgICAgOiAiPSZyIiAobmV3X2NvbXBhcmUpCi0JCQkgICAgIDogInIiIChhZGopKTsKKwkJCSAgICAgInJkCSUldGlja19jbXByLCAlJWcwXG5cdCIKKwkJCSAgICAgOiAiPXIiIChuZXdfY29tcGFyZSkKKwkJCSAgICAgOiAiciIgKG9yaWdfdGljayksICJyIiAoYWRqKSk7CiAKLQlyZXR1cm4gbmV3X2NvbXBhcmU7CisJX19hc21fXyBfX3ZvbGF0aWxlX18oInJkCSUldGljaywgJTAiCisJCQkgICAgIDogIj1yIiAobmV3X3RpY2spKTsKKwluZXdfdGljayAmPSB+VElDS0NNUF9JUlFfQklUOworCisJcmV0dXJuICgobG9uZykobmV3X3RpY2sgLSAob3JpZ190aWNrK2FkaikpKSA+IDBMOwogfQogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyB0aWNrX2FkZF90aWNrKHVuc2lnbmVkIGxvbmcgYWRqLCB1bnNpZ25lZCBsb25nIG9mZnNldCkKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHRpY2tfYWRkX3RpY2sodW5zaWduZWQgbG9uZyBhZGopCiB7Ci0JdW5zaWduZWQgbG9uZyBuZXdfdGljaywgdG1wOworCXVuc2lnbmVkIGxvbmcgbmV3X3RpY2s7CiAKIAkvKiBBbHNvIG5lZWQgdG8gaGFuZGxlIEJsYWNrYmlyZCBidWcgaGVyZSB0b28uICovCiAJX19hc21fXyBfX3ZvbGF0aWxlX18oInJkCSUldGljaywgJTBcblx0IgotCQkJICAgICAiYWRkCSUwLCAlMiwgJTBcblx0IgorCQkJICAgICAiYWRkCSUwLCAlMSwgJTBcblx0IgogCQkJICAgICAid3JwcgklMCwgMCwgJSV0aWNrXG5cdCIKLQkJCSAgICAgImFuZG4JJTAsICU0LCAlMVxuXHQiCi0JCQkgICAgICJiYSxwdAklJXhjYywgMWZcblx0IgotCQkJICAgICAiIGFkZAklMSwgJTMsICUxXG5cdCIKLQkJCSAgICAgIi5hbGlnbgk2NFxuIgotCQkJICAgICAiMTpcblx0IgotCQkJICAgICAid3IJJTEsIDAsICUldGlja19jbXByXG5cdCIKLQkJCSAgICAgInJkCSUldGlja19jbXByLCAlJWcwIgotCQkJICAgICA6ICI9JnIiIChuZXdfdGljayksICI9JnIiICh0bXApCi0JCQkgICAgIDogInIiIChhZGopLCAiciIgKG9mZnNldCksICJyIiAoVElDS19QUklWX0JJVCkpOworCQkJICAgICA6ICI9JnIiIChuZXdfdGljaykKKwkJCSAgICAgOiAiciIgKGFkaikpOwogCiAJcmV0dXJuIG5ld190aWNrOwogfQogCiBzdGF0aWMgc3RydWN0IHNwYXJjNjRfdGlja19vcHMgdGlja19vcGVyYXRpb25zIF9fcmVhZF9tb3N0bHkgPSB7CisJLm5hbWUJCT0JInRpY2siLAogCS5pbml0X3RpY2sJPQl0aWNrX2luaXRfdGljaywKKwkuZGlzYWJsZV9pcnEJPQl0aWNrX2Rpc2FibGVfaXJxLAogCS5nZXRfdGljawk9CXRpY2tfZ2V0X3RpY2ssCi0JLmdldF9jb21wYXJlCT0JdGlja19nZXRfY29tcGFyZSwKIAkuYWRkX3RpY2sJPQl0aWNrX2FkZF90aWNrLAogCS5hZGRfY29tcGFyZQk9CXRpY2tfYWRkX2NvbXBhcmUsCiAJLnNvZnRpbnRfbWFzawk9CTFVTCA8PCAwLApAQCAtMTkwLDcgKzE4NiwxNSBAQAogCiBzdHJ1Y3Qgc3BhcmM2NF90aWNrX29wcyAqdGlja19vcHMgX19yZWFkX21vc3RseSA9ICZ0aWNrX29wZXJhdGlvbnM7CiAKLXN0YXRpYyB2b2lkIHN0aWNrX2luaXRfdGljayh1bnNpZ25lZCBsb25nIG9mZnNldCkKK3N0YXRpYyB2b2lkIHN0aWNrX2Rpc2FibGVfaXJxKHZvaWQpCit7CisJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJIndyCSUwLCAweDAsICUlYXNyMjUiCisJOiAvKiBubyBvdXRwdXRzICovCisJOiAiciIgKFRJQ0tDTVBfSVJRX0JJVCkpOworfQorCitzdGF0aWMgdm9pZCBzdGlja19pbml0X3RpY2sodm9pZCkKIHsKIAkvKiBXcml0ZXMgdG8gdGhlICV0aWNrIGFuZCAlc3RpY2sgcmVnaXN0ZXIgYXJlIG5vdAogCSAqIGFsbG93ZWQgb24gc3VuNHYuICBUaGUgSHlwZXJ2aXNvciBjb250cm9scyB0aGF0CkBAIC0xOTgsNiArMjAyLDcgQEAKIAkgKi8KIAlpZiAodGxiX3R5cGUgIT0gaHlwZXJ2aXNvcikgewogCQl0aWNrX2Rpc2FibGVfcHJvdGVjdGlvbigpOworCQl0aWNrX2Rpc2FibGVfaXJxKCk7CiAKIAkJLyogTGV0IHRoZSB1c2VyIGdldCBhdCBTVElDSyB0b28uICovCiAJCV9fYXNtX18gX192b2xhdGlsZV9fKApAQCAtMjA5LDE0ICsyMTQsNyBAQAogCQk6ICJnMSIsICJnMiIpOwogCX0KIAotCV9fYXNtX18gX192b2xhdGlsZV9fKAotCSIJcmQJJSVhc3IyNCwgJSVnMVxuIgotCSIJYW5kbgklJWcxLCAlMSwgJSVnMVxuIgotCSIJYWRkCSUlZzEsICUwLCAlJWcxXG4iCi0JIgl3cgklJWcxLCAweDAsICUlYXNyMjUiCi0JOiAvKiBubyBvdXRwdXRzICovCi0JOiAiciIgKG9mZnNldCksICJyIiAoVElDS19QUklWX0JJVCkKLQk6ICJnMSIpOworCXN0aWNrX2Rpc2FibGVfaXJxKCk7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIHN0aWNrX2dldF90aWNrKHZvaWQpCkBAIC0yMjksNDkgKzIyNyw0MyBAQAogCXJldHVybiByZXQgJiB+VElDS19QUklWX0JJVDsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgc3RpY2tfZ2V0X2NvbXBhcmUodm9pZCkKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHN0aWNrX2FkZF90aWNrKHVuc2lnbmVkIGxvbmcgYWRqKQogewotCXVuc2lnbmVkIGxvbmcgcmV0OwotCi0JX19hc21fXyBfX3ZvbGF0aWxlX18oInJkCSUlYXNyMjUsICUwIgotCQkJICAgICA6ICI9ciIgKHJldCkpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgc3RpY2tfYWRkX3RpY2sodW5zaWduZWQgbG9uZyBhZGosIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KQotewotCXVuc2lnbmVkIGxvbmcgbmV3X3RpY2ssIHRtcDsKKwl1bnNpZ25lZCBsb25nIG5ld190aWNrOwogCiAJX19hc21fXyBfX3ZvbGF0aWxlX18oInJkCSUlYXNyMjQsICUwXG5cdCIKLQkJCSAgICAgImFkZAklMCwgJTIsICUwXG5cdCIKKwkJCSAgICAgImFkZAklMCwgJTEsICUwXG5cdCIKIAkJCSAgICAgIndyCSUwLCAwLCAlJWFzcjI0XG5cdCIKLQkJCSAgICAgImFuZG4JJTAsICU0LCAlMVxuXHQiCi0JCQkgICAgICJhZGQJJTEsICUzLCAlMVxuXHQiCi0JCQkgICAgICJ3cgklMSwgMCwgJSVhc3IyNSIKLQkJCSAgICAgOiAiPSZyIiAobmV3X3RpY2spLCAiPSZyIiAodG1wKQotCQkJICAgICA6ICJyIiAoYWRqKSwgInIiIChvZmZzZXQpLCAiciIgKFRJQ0tfUFJJVl9CSVQpKTsKKwkJCSAgICAgOiAiPSZyIiAobmV3X3RpY2spCisJCQkgICAgIDogInIiIChhZGopKTsKIAogCXJldHVybiBuZXdfdGljazsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgc3RpY2tfYWRkX2NvbXBhcmUodW5zaWduZWQgbG9uZyBhZGopCitzdGF0aWMgaW50IHN0aWNrX2FkZF9jb21wYXJlKHVuc2lnbmVkIGxvbmcgYWRqKQogewotCXVuc2lnbmVkIGxvbmcgbmV3X2NvbXBhcmU7CisJdW5zaWduZWQgbG9uZyBvcmlnX3RpY2ssIG5ld190aWNrOwogCi0JX19hc21fXyBfX3ZvbGF0aWxlX18oInJkCSUlYXNyMjUsICUwXG5cdCIKLQkJCSAgICAgImFkZAklMCwgJTEsICUwXG5cdCIKLQkJCSAgICAgIndyCSUwLCAwLCAlJWFzcjI1IgotCQkJICAgICA6ICI9JnIiIChuZXdfY29tcGFyZSkKLQkJCSAgICAgOiAiciIgKGFkaikpOworCV9fYXNtX18gX192b2xhdGlsZV9fKCJyZAklJWFzcjI0LCAlMCIKKwkJCSAgICAgOiAiPXIiIChvcmlnX3RpY2spKTsKKwlvcmlnX3RpY2sgJj0gflRJQ0tDTVBfSVJRX0JJVDsKIAotCXJldHVybiBuZXdfY29tcGFyZTsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygid3IJJTAsIDAsICUlYXNyMjUiCisJCQkgICAgIDogLyogbm8gb3V0cHV0cyAqLworCQkJICAgICA6ICJyIiAob3JpZ190aWNrICsgYWRqKSk7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygicmQJJSVhc3IyNCwgJTAiCisJCQkgICAgIDogIj1yIiAobmV3X3RpY2spKTsKKwluZXdfdGljayAmPSB+VElDS0NNUF9JUlFfQklUOworCisJcmV0dXJuICgobG9uZykobmV3X3RpY2sgLSAob3JpZ190aWNrK2FkaikpKSA+IDBMOwogfQogCiBzdGF0aWMgc3RydWN0IHNwYXJjNjRfdGlja19vcHMgc3RpY2tfb3BlcmF0aW9ucyBfX3JlYWRfbW9zdGx5ID0geworCS5uYW1lCQk9CSJzdGljayIsCiAJLmluaXRfdGljawk9CXN0aWNrX2luaXRfdGljaywKKwkuZGlzYWJsZV9pcnEJPQlzdGlja19kaXNhYmxlX2lycSwKIAkuZ2V0X3RpY2sJPQlzdGlja19nZXRfdGljaywKLQkuZ2V0X2NvbXBhcmUJPQlzdGlja19nZXRfY29tcGFyZSwKIAkuYWRkX3RpY2sJPQlzdGlja19hZGRfdGljaywKIAkuYWRkX2NvbXBhcmUJPQlzdGlja19hZGRfY29tcGFyZSwKIAkuc29mdGludF9tYXNrCT0JMVVMIDw8IDE2LApAQCAtMzIwLDIwICszMTIsNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIF9faGJpcmRfcmVhZF9jb21wYXJlKHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyBsb3csIGhpZ2g7Ci0JdW5zaWduZWQgbG9uZyBhZGRyID0gSEJJUkRfU1RJQ0tDTVBfQUREUjsKLQotCV9fYXNtX18gX192b2xhdGlsZV9fKCJsZHhhCVslMl0gJTMsICUwXG5cdCIKLQkJCSAgICAgImFkZAklMiwgMHg4LCAlMlxuXHQiCi0JCQkgICAgICJsZHhhCVslMl0gJTMsICUxIgotCQkJICAgICA6ICI9JnIiIChsb3cpLCAiPSZyIiAoaGlnaCksICI9JnIiIChhZGRyKQotCQkJICAgICA6ICJpIiAoQVNJX1BIWVNfQllQQVNTX0VDX0UpLCAiMiIgKGFkZHIpKTsKLQotCXJldHVybiAoaGlnaCA8PCAzMlVMKSB8IGxvdzsKLX0KLQogc3RhdGljIHZvaWQgX19oYmlyZF93cml0ZV9zdGljayh1bnNpZ25lZCBsb25nIHZhbCkKIHsKIAl1bnNpZ25lZCBsb25nIGxvdyA9ICh2YWwgJiAweGZmZmZmZmZmVUwpOwpAQCAtMzY0LDEwICszNDIsMTMgQEAKIAkJCSAgICAgICAiaSIgKEFTSV9QSFlTX0JZUEFTU19FQ19FKSk7CiB9CiAKLXN0YXRpYyB2b2lkIGhidGlja19pbml0X3RpY2sodW5zaWduZWQgbG9uZyBvZmZzZXQpCitzdGF0aWMgdm9pZCBoYnRpY2tfZGlzYWJsZV9pcnEodm9pZCkKIHsKLQl1bnNpZ25lZCBsb25nIHZhbDsKKwlfX2hiaXJkX3dyaXRlX2NvbXBhcmUoVElDS0NNUF9JUlFfQklUKTsKK30KIAorc3RhdGljIHZvaWQgaGJ0aWNrX2luaXRfdGljayh2b2lkKQorewogCXRpY2tfZGlzYWJsZV9wcm90ZWN0aW9uKCk7CiAKIAkvKiBYWFggVGhpcyBzZWVtcyB0byBiZSBuZWNlc3NhcnkgdG8gJ2p1bXBzdGFydCcgSHVtbWluZ2JpcmQKQEAgLTM3Nyw4ICszNTgsNyBAQAogCSAqLwogCV9faGJpcmRfd3JpdGVfc3RpY2soX19oYmlyZF9yZWFkX3N0aWNrKCkpOwogCi0JdmFsID0gX19oYmlyZF9yZWFkX3N0aWNrKCkgJiB+VElDS19QUklWX0JJVDsKLQlfX2hiaXJkX3dyaXRlX2NvbXBhcmUodmFsICsgb2Zmc2V0KTsKKwloYnRpY2tfZGlzYWJsZV9pcnEoKTsKIH0KIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgaGJ0aWNrX2dldF90aWNrKHZvaWQpCkBAIC0zODYsMTIyICszNjYsOTUgQEAKIAlyZXR1cm4gX19oYmlyZF9yZWFkX3N0aWNrKCkgJiB+VElDS19QUklWX0JJVDsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgaGJ0aWNrX2dldF9jb21wYXJlKHZvaWQpCi17Ci0JcmV0dXJuIF9faGJpcmRfcmVhZF9jb21wYXJlKCk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGhidGlja19hZGRfdGljayh1bnNpZ25lZCBsb25nIGFkaiwgdW5zaWduZWQgbG9uZyBvZmZzZXQpCitzdGF0aWMgdW5zaWduZWQgbG9uZyBoYnRpY2tfYWRkX3RpY2sodW5zaWduZWQgbG9uZyBhZGopCiB7CiAJdW5zaWduZWQgbG9uZyB2YWw7CiAKIAl2YWwgPSBfX2hiaXJkX3JlYWRfc3RpY2soKSArIGFkajsKIAlfX2hiaXJkX3dyaXRlX3N0aWNrKHZhbCk7CiAKLQl2YWwgJj0gflRJQ0tfUFJJVl9CSVQ7Ci0JX19oYmlyZF93cml0ZV9jb21wYXJlKHZhbCArIG9mZnNldCk7Ci0KIAlyZXR1cm4gdmFsOwogfQogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBoYnRpY2tfYWRkX2NvbXBhcmUodW5zaWduZWQgbG9uZyBhZGopCitzdGF0aWMgaW50IGhidGlja19hZGRfY29tcGFyZSh1bnNpZ25lZCBsb25nIGFkaikKIHsKLQl1bnNpZ25lZCBsb25nIHZhbCA9IF9faGJpcmRfcmVhZF9jb21wYXJlKCkgKyBhZGo7CisJdW5zaWduZWQgbG9uZyB2YWwgPSBfX2hiaXJkX3JlYWRfc3RpY2soKTsKKwl1bnNpZ25lZCBsb25nIHZhbDI7CiAKLQl2YWwgJj0gflRJQ0tfUFJJVl9CSVQ7CisJdmFsICY9IH5USUNLQ01QX0lSUV9CSVQ7CisJdmFsICs9IGFkajsKIAlfX2hiaXJkX3dyaXRlX2NvbXBhcmUodmFsKTsKIAotCXJldHVybiB2YWw7CisJdmFsMiA9IF9faGJpcmRfcmVhZF9zdGljaygpICYgflRJQ0tDTVBfSVJRX0JJVDsKKworCXJldHVybiAoKGxvbmcpKHZhbDIgLSB2YWwpKSA+IDBMOwogfQogCiBzdGF0aWMgc3RydWN0IHNwYXJjNjRfdGlja19vcHMgaGJ0aWNrX29wZXJhdGlvbnMgX19yZWFkX21vc3RseSA9IHsKKwkubmFtZQkJPQkiaGJ0aWNrIiwKIAkuaW5pdF90aWNrCT0JaGJ0aWNrX2luaXRfdGljaywKKwkuZGlzYWJsZV9pcnEJPQloYnRpY2tfZGlzYWJsZV9pcnEsCiAJLmdldF90aWNrCT0JaGJ0aWNrX2dldF90aWNrLAotCS5nZXRfY29tcGFyZQk9CWhidGlja19nZXRfY29tcGFyZSwKIAkuYWRkX3RpY2sJPQloYnRpY2tfYWRkX3RpY2ssCiAJLmFkZF9jb21wYXJlCT0JaGJ0aWNrX2FkZF9jb21wYXJlLAogCS5zb2Z0aW50X21hc2sJPQkxVUwgPDwgMCwKIH07CiAKLS8qIHRpbWVyX2ludGVycnVwdCgpIG5lZWRzIHRvIGtlZXAgdXAgdGhlIHJlYWwtdGltZSBjbG9jaywKLSAqIGFzIHdlbGwgYXMgY2FsbCB0aGUgImRvX3RpbWVyKCkiIHJvdXRpbmUgZXZlcnkgY2xvY2t0aWNrCi0gKgotICogTk9URTogT24gU1VONSBzeXN0ZW1zIHRoZSB0aWNrZXIgaW50ZXJydXB0IGNvbWVzIGluIHVzaW5nIDIKLSAqICAgICAgIGludGVycnVwdHMsIG9uZSBhdCBsZXZlbDE0IGFuZCBvbmUgd2l0aCBzb2Z0aW50IGJpdCAwLgotICovCi11bnNpZ25lZCBsb25nIHRpbWVyX3RpY2tfb2Zmc2V0IF9fcmVhZF9tb3N0bHk7Ci0KIHN0YXRpYyB1bnNpZ25lZCBsb25nIHRpbWVyX3RpY2tzX3Blcl9uc2VjX3F1b3RpZW50IF9fcmVhZF9tb3N0bHk7CiAKICNkZWZpbmUgVElDS19TSVpFICh0aWNrX25zZWMgLyAxMDAwKQogCi1zdGF0aWMgaW5saW5lIHZvaWQgdGltZXJfY2hlY2tfcnRjKHZvaWQpCisjZGVmaW5lIFVTRUNfQUZURVIJNTAwMDAwCisjZGVmaW5lIFVTRUNfQkVGT1JFCTUwMDAwMAorCitzdGF0aWMgdm9pZCBzeW5jX2Ntb3NfY2xvY2sodW5zaWduZWQgbG9uZyBkdW1teSk7CisKK3N0YXRpYyBERUZJTkVfVElNRVIoc3luY19jbW9zX3RpbWVyLCBzeW5jX2Ntb3NfY2xvY2ssIDAsIDApOworCitzdGF0aWMgdm9pZCBzeW5jX2Ntb3NfY2xvY2sodW5zaWduZWQgbG9uZyBkdW1teSkKIHsKLQkvKiBsYXN0IHRpbWUgdGhlIGNtb3MgY2xvY2sgZ290IHVwZGF0ZWQgKi8KLQlzdGF0aWMgbG9uZyBsYXN0X3J0Y191cGRhdGU7CisJc3RydWN0IHRpbWV2YWwgbm93LCBuZXh0OworCWludCBmYWlsID0gMTsKIAotCS8qIERldGVybWluZSB3aGVuIHRvIHVwZGF0ZSB0aGUgTW9zdGVrIGNsb2NrLiAqLwotCWlmIChudHBfc3luY2VkKCkgJiYKLQkgICAgeHRpbWUudHZfc2VjID4gbGFzdF9ydGNfdXBkYXRlICsgNjYwICYmCi0JICAgICh4dGltZS50dl9uc2VjIC8gMTAwMCkgPj0gNTAwMDAwIC0gKCh1bnNpZ25lZCkgVElDS19TSVpFKSAvIDIgJiYKLQkgICAgKHh0aW1lLnR2X25zZWMgLyAxMDAwKSA8PSA1MDAwMDAgKyAoKHVuc2lnbmVkKSBUSUNLX1NJWkUpIC8gMikgewotCQlpZiAoc2V0X3J0Y19tbXNzKHh0aW1lLnR2X3NlYykgPT0gMCkKLQkJCWxhc3RfcnRjX3VwZGF0ZSA9IHh0aW1lLnR2X3NlYzsKLQkJZWxzZQotCQkJbGFzdF9ydGNfdXBkYXRlID0geHRpbWUudHZfc2VjIC0gNjAwOwotCQkJLyogZG8gaXQgYWdhaW4gaW4gNjAgcyAqLwotCX0KLX0KLQotaXJxcmV0dXJuX3QgdGltZXJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIHRpY2tzLCBjb21wYXJlLCBwc3RhdGU7Ci0KLQl3cml0ZV9zZXFsb2NrKCZ4dGltZV9sb2NrKTsKLQotCWRvIHsKLSNpZm5kZWYgQ09ORklHX1NNUAotCQlwcm9maWxlX3RpY2soQ1BVX1BST0ZJTElORyk7Ci0JCXVwZGF0ZV9wcm9jZXNzX3RpbWVzKHVzZXJfbW9kZShnZXRfaXJxX3JlZ3MoKSkpOwotI2VuZGlmCi0JCWRvX3RpbWVyKDEpOwotCi0JCS8qIEd1YXJhbnRlZSB0aGF0IHRoZSBmb2xsb3dpbmcgc2VxdWVuY2VzIGV4ZWN1dGUKLQkJICogdW5pbnRlcnJ1cHRlZC4KKwkvKgorCSAqIElmIHdlIGhhdmUgYW4gZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQgTGludXggY2xvY2ssIHRoZW4gdXBkYXRlCisJICogQ01PUyBjbG9jayBhY2NvcmRpbmdseSBldmVyeSB+MTEgbWludXRlcy4gU2V0X3J0Y19tbXNzKCkgaGFzIHRvIGJlCisJICogY2FsbGVkIGFzIGNsb3NlIGFzIHBvc3NpYmxlIHRvIDUwMCBtcyBiZWZvcmUgdGhlIG5ldyBzZWNvbmQgc3RhcnRzLgorCSAqIFRoaXMgY29kZSBpcyBydW4gb24gYSB0aW1lci4gIElmIHRoZSBjbG9jayBpcyBzZXQsIHRoYXQgdGltZXIKKwkgKiBtYXkgbm90IGV4cGlyZSBhdCB0aGUgY29ycmVjdCB0aW1lLiAgVGh1cywgd2UgYWRqdXN0Li4uCisJICovCisJaWYgKCFudHBfc3luY2VkKCkpCisJCS8qCisJCSAqIE5vdCBzeW5jZWQsIGV4aXQsIGRvIG5vdCByZXN0YXJ0IGEgdGltZXIgKGlmIG9uZSBpcworCQkgKiBydW5uaW5nLCBsZXQgaXQgcnVuIG91dCkuCiAJCSAqLwotCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygicmRwcgklJXBzdGF0ZSwgJTBcblx0IgotCQkJCSAgICAgIndycHIJJTAsICUxLCAlJXBzdGF0ZSIKLQkJCQkgICAgIDogIj1yIiAocHN0YXRlKQotCQkJCSAgICAgOiAiaSIgKFBTVEFURV9JRSkpOworCQlyZXR1cm47CiAKLQkJY29tcGFyZSA9IHRpY2tfb3BzLT5hZGRfY29tcGFyZSh0aW1lcl90aWNrX29mZnNldCk7Ci0JCXRpY2tzID0gdGlja19vcHMtPmdldF90aWNrKCk7CisJZG9fZ2V0dGltZW9mZGF5KCZub3cpOworCWlmIChub3cudHZfdXNlYyA+PSBVU0VDX0FGVEVSIC0gKCh1bnNpZ25lZCkgVElDS19TSVpFKSAvIDIgJiYKKwkgICAgbm93LnR2X3VzZWMgPD0gVVNFQ19CRUZPUkUgKyAoKHVuc2lnbmVkKSBUSUNLX1NJWkUpIC8gMikKKwkJZmFpbCA9IHNldF9ydGNfbW1zcyhub3cudHZfc2VjKTsKIAotCQkvKiBSZXN0b3JlIFBTVEFURV9JRS4gKi8KLQkJX19hc21fXyBfX3ZvbGF0aWxlX18oIndycHIJJTAsIDB4MCwgJSVwc3RhdGUiCi0JCQkJICAgICA6IC8qIG5vIG91dHB1dHMgKi8KLQkJCQkgICAgIDogInIiIChwc3RhdGUpKTsKLQl9IHdoaWxlICh0aW1lX2FmdGVyX2VxKHRpY2tzLCBjb21wYXJlKSk7CisJbmV4dC50dl91c2VjID0gVVNFQ19BRlRFUiAtIG5vdy50dl91c2VjOworCWlmIChuZXh0LnR2X3VzZWMgPD0gMCkKKwkJbmV4dC50dl91c2VjICs9IFVTRUNfUEVSX1NFQzsKIAotCXRpbWVyX2NoZWNrX3J0YygpOworCWlmICghZmFpbCkKKwkJbmV4dC50dl9zZWMgPSA2NTk7CisJZWxzZQorCQluZXh0LnR2X3NlYyA9IDA7CiAKLQl3cml0ZV9zZXF1bmxvY2soJnh0aW1lX2xvY2spOwotCi0JcmV0dXJuIElSUV9IQU5ETEVEOworCWlmIChuZXh0LnR2X3VzZWMgPj0gVVNFQ19QRVJfU0VDKSB7CisJCW5leHQudHZfc2VjKys7CisJCW5leHQudHZfdXNlYyAtPSBVU0VDX1BFUl9TRUM7CisJfQorCW1vZF90aW1lcigmc3luY19jbW9zX3RpbWVyLCBqaWZmaWVzICsgdGltZXZhbF90b19qaWZmaWVzKCZuZXh0KSk7CiB9CiAKLSNpZmRlZiBDT05GSUdfU01QCi12b2lkIHRpbWVyX3RpY2tfaW50ZXJydXB0KHN0cnVjdCBwdF9yZWdzICpyZWdzKQordm9pZCBub3RpZnlfYXJjaF9jbW9zX3RpbWVyKHZvaWQpCiB7Ci0Jd3JpdGVfc2VxbG9jaygmeHRpbWVfbG9jayk7Ci0KLQlkb190aW1lcigxKTsKLQotCXRpbWVyX2NoZWNrX3J0YygpOwotCi0Jd3JpdGVfc2VxdW5sb2NrKCZ4dGltZV9sb2NrKTsKKwltb2RfdGltZXIoJnN5bmNfY21vc190aW1lciwgamlmZmllcyArIDEpOwogfQotI2VuZGlmCiAKIC8qIEtpY2sgc3RhcnQgYSBzdG9wcGVkIGNsb2NrIChwcm9jZWR1cmUgZnJvbSB0aGUgU3VuIE5WUkFNL2hvc3RpZCBGQVEpLiAqLwogc3RhdGljIHZvaWQgX19pbml0IGtpY2tfc3RhcnRfY2xvY2sodm9pZCkKQEAgLTc1MSw3ICs3MDQsNyBAQAogCXJldHVybiAtRU9QTk9UU1VQUDsKIH0KIAotc3RhdGljIGludCBfX2luaXQgY2xvY2tfbW9kZWxfbWF0Y2hlcyhjaGFyICptb2RlbCkKK3N0YXRpYyBpbnQgX19pbml0IGNsb2NrX21vZGVsX21hdGNoZXMoY29uc3QgY2hhciAqbW9kZWwpCiB7CiAJaWYgKHN0cmNtcChtb2RlbCwgIm1rNDh0MDIiKSAmJgogCSAgICBzdHJjbXAobW9kZWwsICJtazQ4dDA4IikgJiYKQEAgLTc2OCw3ICs3MjEsNyBAQAogc3RhdGljIGludCBfX2RldmluaXQgY2xvY2tfcHJvYmUoc3RydWN0IG9mX2RldmljZSAqb3AsIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoKQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAgPSBvcC0+bm9kZTsKLQljaGFyICptb2RlbCA9IG9mX2dldF9wcm9wZXJ0eShkcCwgIm1vZGVsIiwgTlVMTCk7CisJY29uc3QgY2hhciAqbW9kZWwgPSBvZl9nZXRfcHJvcGVydHkoZHAsICJtb2RlbCIsIE5VTEwpOwogCXVuc2lnbmVkIGxvbmcgc2l6ZSwgZmxhZ3M7CiAJdm9pZCBfX2lvbWVtICpyZWdzOwogCkBAIC05MDAsNyArODUzLDYgQEAKIAkJcHJvcCA9IG9mX2ZpbmRfcHJvcGVydHkoZHAsICJzdGljay1mcmVxdWVuY3kiLCBOVUxMKTsKIAl9CiAJY2xvY2sgPSAqKHVuc2lnbmVkIGludCAqKSBwcm9wLT52YWx1ZTsKLQl0aW1lcl90aWNrX29mZnNldCA9IGNsb2NrIC8gSFo7CiAKICNpZmRlZiBDT05GSUdfU01QCiAJc21wX3RpY2tfaW5pdCgpOwpAQCAtOTA5LDI2ICs4NjEsNiBAQAogCXJldHVybiBjbG9jazsKIH0KIAotc3RhdGljIHZvaWQgc3BhcmM2NF9zdGFydF90aW1lcnModm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIHBzdGF0ZTsKLQotCS8qIEd1YXJhbnRlZSB0aGF0IHRoZSBmb2xsb3dpbmcgc2VxdWVuY2VzIGV4ZWN1dGUKLQkgKiB1bmludGVycnVwdGVkLgotCSAqLwotCV9fYXNtX18gX192b2xhdGlsZV9fKCJyZHByCSUlcHN0YXRlLCAlMFxuXHQiCi0JCQkgICAgICJ3cnByCSUwLCAlMSwgJSVwc3RhdGUiCi0JCQkgICAgIDogIj1yIiAocHN0YXRlKQotCQkJICAgICA6ICJpIiAoUFNUQVRFX0lFKSk7Ci0KLQl0aWNrX29wcy0+aW5pdF90aWNrKHRpbWVyX3RpY2tfb2Zmc2V0KTsKLQotCS8qIFJlc3RvcmUgUFNUQVRFX0lFLiAqLwotCV9fYXNtX18gX192b2xhdGlsZV9fKCJ3cnByCSUwLCAweDAsICUlcHN0YXRlIgotCQkJICAgICA6IC8qIG5vIG91dHB1dHMgKi8KLQkJCSAgICAgOiAiciIgKHBzdGF0ZSkpOwotfQotCiBzdHJ1Y3QgZnJlcV90YWJsZSB7CiAJdW5zaWduZWQgbG9uZyBjbG9ja190aWNrX3JlZjsKIAl1bnNpZ25lZCBpbnQgcmVmX2ZyZXE7CkBAIC05NzUsMjkgKzkwNywxNDggQEAKIAogI2VuZGlmIC8qIENPTkZJR19DUFVfRlJFUSAqLwogCi1zdGF0aWMgc3RydWN0IHRpbWVfaW50ZXJwb2xhdG9yIHNwYXJjNjRfY3B1X2ludGVycG9sYXRvciA9IHsKLQkuc291cmNlCQk9CVRJTUVfU09VUkNFX0NQVSwKLQkuc2hpZnQJCT0JMTYsCi0JLm1hc2sJCT0JMHhmZmZmZmZmZmZmZmZmZmZmTEwKK3N0YXRpYyBpbnQgc3BhcmM2NF9uZXh0X2V2ZW50KHVuc2lnbmVkIGxvbmcgZGVsdGEsCisJCQkgICAgICBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQpCit7CisJcmV0dXJuIHRpY2tfb3BzLT5hZGRfY29tcGFyZShkZWx0YSkgPyAtRVRJTUUgOiAwOworfQorCitzdGF0aWMgdm9pZCBzcGFyYzY0X3RpbWVyX3NldHVwKGVudW0gY2xvY2tfZXZlbnRfbW9kZSBtb2RlLAorCQkJCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCkKK3sKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIENMT0NLX0VWVF9NT0RFX09ORVNIT1Q6CisJCWJyZWFrOworCisJY2FzZSBDTE9DS19FVlRfTU9ERV9TSFVURE9XTjoKKwkJdGlja19vcHMtPmRpc2FibGVfaXJxKCk7CisJCWJyZWFrOworCisJY2FzZSBDTE9DS19FVlRfTU9ERV9QRVJJT0RJQzoKKwljYXNlIENMT0NLX0VWVF9NT0RFX1VOVVNFRDoKKwkJV0FSTl9PTigxKTsKKwkJYnJlYWs7CisJfTsKK30KKworc3RhdGljIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2Ugc3BhcmM2NF9jbG9ja2V2ZW50ID0geworCS5mZWF0dXJlcwk9IENMT0NLX0VWVF9GRUFUX09ORVNIT1QsCisJLnNldF9tb2RlCT0gc3BhcmM2NF90aW1lcl9zZXR1cCwKKwkuc2V0X25leHRfZXZlbnQJPSBzcGFyYzY0X25leHRfZXZlbnQsCisJLnJhdGluZwkJPSAxMDAsCisJLnNoaWZ0CQk9IDMwLAorCS5pcnEJCT0gLTEsCit9Oworc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UsIHNwYXJjNjRfZXZlbnRzKTsKKwordm9pZCB0aW1lcl9pbnRlcnJ1cHQoaW50IGlycSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IHB0X3JlZ3MgKm9sZF9yZWdzID0gc2V0X2lycV9yZWdzKHJlZ3MpOworCXVuc2lnbmVkIGxvbmcgdGlja19tYXNrID0gdGlja19vcHMtPnNvZnRpbnRfbWFzazsKKwlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCA9ICZwZXJfY3B1KHNwYXJjNjRfZXZlbnRzLCBjcHUpOworCisJY2xlYXJfc29mdGludCh0aWNrX21hc2spOworCisJaXJxX2VudGVyKCk7CisKKwlrc3RhdF90aGlzX2NwdS5pcnFzWzBdKys7CisKKwlpZiAodW5saWtlbHkoIWV2dC0+ZXZlbnRfaGFuZGxlcikpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgIlNwdXJpb3VzIFNQQVJDNjQgdGltZXIgaW50ZXJydXB0IG9uIGNwdSAlZFxuIiwgY3B1KTsKKwl9IGVsc2UKKwkJZXZ0LT5ldmVudF9oYW5kbGVyKGV2dCk7CisKKwlpcnFfZXhpdCgpOworCisJc2V0X2lycV9yZWdzKG9sZF9yZWdzKTsKK30KKwordm9pZCBfX2RldmluaXQgc2V0dXBfc3BhcmM2NF90aW1lcih2b2lkKQoreworCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKnNldnQ7CisJdW5zaWduZWQgbG9uZyBwc3RhdGU7CisKKwkvKiBHdWFyYW50ZWUgdGhhdCB0aGUgZm9sbG93aW5nIHNlcXVlbmNlcyBleGVjdXRlCisJICogdW5pbnRlcnJ1cHRlZC4KKwkgKi8KKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygicmRwcgklJXBzdGF0ZSwgJTBcblx0IgorCQkJICAgICAid3JwcgklMCwgJTEsICUlcHN0YXRlIgorCQkJICAgICA6ICI9ciIgKHBzdGF0ZSkKKwkJCSAgICAgOiAiaSIgKFBTVEFURV9JRSkpOworCisJdGlja19vcHMtPmluaXRfdGljaygpOworCisJLyogUmVzdG9yZSBQU1RBVEVfSUUuICovCisJX19hc21fXyBfX3ZvbGF0aWxlX18oIndycHIJJTAsIDB4MCwgJSVwc3RhdGUiCisJCQkgICAgIDogLyogbm8gb3V0cHV0cyAqLworCQkJICAgICA6ICJyIiAocHN0YXRlKSk7CisKKwlzZXZ0ID0gJl9fZ2V0X2NwdV92YXIoc3BhcmM2NF9ldmVudHMpOworCisJbWVtY3B5KHNldnQsICZzcGFyYzY0X2Nsb2NrZXZlbnQsIHNpemVvZigqc2V2dCkpOworCXNldnQtPmNwdW1hc2sgPSBjcHVtYXNrX29mX2NwdShzbXBfcHJvY2Vzc29yX2lkKCkpOworCisJY2xvY2tldmVudHNfcmVnaXN0ZXJfZGV2aWNlKHNldnQpOworfQorCisjZGVmaW5lIFNQQVJDNjRfTlNFQ19QRVJfQ1lDX1NISUZUCTMyVUwKKworc3RhdGljIHN0cnVjdCBjbG9ja3NvdXJjZSBjbG9ja3NvdXJjZV90aWNrID0geworCS5yYXRpbmcJCT0gMTAwLAorCS5tYXNrCQk9IENMT0NLU09VUkNFX01BU0soNjQpLAorCS5zaGlmdAkJPSAxNiwKKwkuZmxhZ3MJCT0gQ0xPQ0tfU09VUkNFX0lTX0NPTlRJTlVPVVMsCiB9OwogCi0vKiBUaGUgcXVvdGllbnQgZm9ybXVsYSBpcyB0YWtlbiBmcm9tIHRoZSBJQTY0IHBvcnQuICovCi0jZGVmaW5lIFNQQVJDNjRfTlNFQ19QRVJfQ1lDX1NISUZUCTEwVUwKK3N0YXRpYyB2b2lkIF9faW5pdCBzZXR1cF9jbG9ja2V2ZW50X211bHRpcGxpZXIodW5zaWduZWQgbG9uZyBoeikKK3sKKwl1bnNpZ25lZCBsb25nIG11bHQsIHNoaWZ0ID0gMzI7CisKKwl3aGlsZSAoMSkgeworCQltdWx0ID0gZGl2X3NjKGh6LCBOU0VDX1BFUl9TRUMsIHNoaWZ0KTsKKwkJaWYgKG11bHQgJiYgKG11bHQgPj4gMzJVTCkgPT0gMFVMKQorCQkJYnJlYWs7CisKKwkJc2hpZnQtLTsKKwl9CisKKwlzcGFyYzY0X2Nsb2NrZXZlbnQuc2hpZnQgPSBzaGlmdDsKKwlzcGFyYzY0X2Nsb2NrZXZlbnQubXVsdCA9IG11bHQ7Cit9CisKIHZvaWQgX19pbml0IHRpbWVfaW5pdCh2b2lkKQogewogCXVuc2lnbmVkIGxvbmcgY2xvY2sgPSBzcGFyYzY0X2luaXRfdGltZXJzKCk7CiAKLQlzcGFyYzY0X2NwdV9pbnRlcnBvbGF0b3IuZnJlcXVlbmN5ID0gY2xvY2s7Ci0JcmVnaXN0ZXJfdGltZV9pbnRlcnBvbGF0b3IoJnNwYXJjNjRfY3B1X2ludGVycG9sYXRvcik7Ci0KLQkvKiBOb3cgdGhhdCB0aGUgaW50ZXJwb2xhdG9yIGlzIHJlZ2lzdGVyZWQsIGl0IGlzCi0JICogc2FmZSB0byBzdGFydCB0aGUgdGltZXIgdGlja2luZy4KLQkgKi8KLQlzcGFyYzY0X3N0YXJ0X3RpbWVycygpOwotCiAJdGltZXJfdGlja3NfcGVyX25zZWNfcXVvdGllbnQgPQotCQkoKChOU0VDX1BFUl9TRUMgPDwgU1BBUkM2NF9OU0VDX1BFUl9DWUNfU0hJRlQpICsKLQkJICAoY2xvY2sgLyAyKSkgLyBjbG9jayk7CisJCWNsb2Nrc291cmNlX2h6Mm11bHQoY2xvY2ssIFNQQVJDNjRfTlNFQ19QRVJfQ1lDX1NISUZUKTsKKworCWNsb2Nrc291cmNlX3RpY2submFtZSA9IHRpY2tfb3BzLT5uYW1lOworCWNsb2Nrc291cmNlX3RpY2subXVsdCA9CisJCWNsb2Nrc291cmNlX2h6Mm11bHQoY2xvY2ssCisJCQkJICAgIGNsb2Nrc291cmNlX3RpY2suc2hpZnQpOworCWNsb2Nrc291cmNlX3RpY2sucmVhZCA9IHRpY2tfb3BzLT5nZXRfdGljazsKKworCXByaW50aygiY2xvY2tzb3VyY2U6IG11bHRbJXhdIHNoaWZ0WyVkXVxuIiwKKwkgICAgICAgY2xvY2tzb3VyY2VfdGljay5tdWx0LCBjbG9ja3NvdXJjZV90aWNrLnNoaWZ0KTsKKworCWNsb2Nrc291cmNlX3JlZ2lzdGVyKCZjbG9ja3NvdXJjZV90aWNrKTsKKworCXNwYXJjNjRfY2xvY2tldmVudC5uYW1lID0gdGlja19vcHMtPm5hbWU7CisKKwlzZXR1cF9jbG9ja2V2ZW50X211bHRpcGxpZXIoY2xvY2spOworCisJc3BhcmM2NF9jbG9ja2V2ZW50Lm1heF9kZWx0YV9ucyA9CisJCWNsb2NrZXZlbnRfZGVsdGEybnMoMHg3ZmZmZmZmZmZmZmZmZmZmLCAmc3BhcmM2NF9jbG9ja2V2ZW50KTsKKwlzcGFyYzY0X2Nsb2NrZXZlbnQubWluX2RlbHRhX25zID0KKwkJY2xvY2tldmVudF9kZWx0YTJucygweEYsICZzcGFyYzY0X2Nsb2NrZXZlbnQpOworCisJcHJpbnRrKCJjbG9ja2V2ZW50OiBtdWx0WyVseF0gc2hpZnRbJWRdXG4iLAorCSAgICAgICBzcGFyYzY0X2Nsb2NrZXZlbnQubXVsdCwgc3BhcmM2NF9jbG9ja2V2ZW50LnNoaWZ0KTsKKworCXNldHVwX3NwYXJjNjRfdGltZXIoKTsKIAogI2lmZGVmIENPTkZJR19DUFVfRlJFUQogCWNwdWZyZXFfcmVnaXN0ZXJfbm90aWZpZXIoJnNwYXJjNjRfY3B1ZnJlcV9ub3RpZmllcl9ibG9jaywKQEAgLTExMjYsMTAgKzExNzcsNiBAQAogI2RlZmluZSBSVENfSVNfT1BFTgkJMHgwMQkvKiBtZWFucyAvZGV2L3J0YyBpcyBpbiB1c2UJKi8KIHN0YXRpYyB1bnNpZ25lZCBjaGFyIG1pbmlfcnRjX3N0YXR1czsJLyogYml0bWFwcGVkIHN0YXR1cyBieXRlLgkqLwogCi0vKiBtb250aHMgc3RhcnQgYXQgMCBub3cgKi8KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIGRheXNfaW5fbW9bXSA9Ci17MzEsIDI4LCAzMSwgMzAsIDMxLCAzMCwgMzEsIDMxLCAzMCwgMzEsIDMwLCAzMX07Ci0KICNkZWZpbmUgRkVCUlVBUlkJMgogI2RlZmluZQlTVEFSVE9GVElNRQkxOTcwCiAjZGVmaW5lIFNFQ0RBWQkJODY0MDBMCkBAIC0xMjc4LDggKzEzMjUsNyBAQAogCiAJY2FzZSBSVENfU0VUX1RJTUU6CS8qIFNldCB0aGUgUlRDICovCiAJICAgIHsKLQkJaW50IHllYXI7Ci0JCXVuc2lnbmVkIGNoYXIgbGVhcF95cjsKKwkJaW50IHllYXIsIGRheXM7CiAKIAkJaWYgKCFjYXBhYmxlKENBUF9TWVNfVElNRSkpCiAJCQlyZXR1cm4gLUVBQ0NFUzsKQEAgLTEyODgsMTQgKzEzMzQsMTQgQEAKIAkJCXJldHVybiAtRUZBVUxUOwogCiAJCXllYXIgPSB3dGltZS50bV95ZWFyICsgMTkwMDsKLQkJbGVhcF95ciA9ICgoISh5ZWFyICUgNCkgJiYgKHllYXIgJSAxMDApKSB8fAotCQkJICAgISh5ZWFyICUgNDAwKSk7CisJCWRheXMgPSBtb250aF9kYXlzW3d0aW1lLnRtX21vbl0gKworCQkgICAgICAgKCh3dGltZS50bV9tb24gPT0gMSkgJiYgbGVhcHllYXIoeWVhcikpOwogCi0JCWlmICgod3RpbWUudG1fbW9uIDwgMCB8fCB3dGltZS50bV9tb24gPiAxMSkgfHwgKHd0aW1lLnRtX21kYXkgPCAxKSkKKwkJaWYgKCh3dGltZS50bV9tb24gPCAwIHx8IHd0aW1lLnRtX21vbiA+IDExKSB8fAorCQkgICAgKHd0aW1lLnRtX21kYXkgPCAxKSkKIAkJCXJldHVybiAtRUlOVkFMOwogCi0JCWlmICh3dGltZS50bV9tZGF5IDwgMCB8fCB3dGltZS50bV9tZGF5ID4KLQkJICAgIChkYXlzX2luX21vW3d0aW1lLnRtX21vbl0gKyAoKHd0aW1lLnRtX21vbiA9PSAxKSAmJiBsZWFwX3lyKSkpCisJCWlmICh3dGltZS50bV9tZGF5IDwgMCB8fCB3dGltZS50bV9tZGF5ID4gZGF5cykKIAkJCXJldHVybiAtRUlOVkFMOwogCiAJCWlmICh3dGltZS50bV9ob3VyIDwgMCB8fCB3dGltZS50bV9ob3VyID49IDI0IHx8CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3R0YWJsZS5TIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC90dGFibGUuUwppbmRleCBkN2QyYThiLi43NTc1YWEzIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3R0YWJsZS5TCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvdHRhYmxlLlMKQEAgLTYwLDExICs2MCw3IEBACiB0bDBfaXJxNToJVFJBUF9JUlEoaGFuZGxlcl9pcnEsIDUpCiB0bDBfaXJxNjoJQlRSQVAoMHg0NikgQlRSQVAoMHg0NykgQlRSQVAoMHg0OCkgQlRSQVAoMHg0OSkKIHRsMF9pcnExMDoJQlRSQVAoMHg0YSkgQlRSQVAoMHg0YikgQlRSQVAoMHg0YykgQlRSQVAoMHg0ZCkKLSNpZm5kZWYgQ09ORklHX1NNUAotdGwwX2lycTE0OglUUkFQX0lSUSh0aW1lcl9pcnEsIDE0KQotI2Vsc2UKLXRsMF9pcnExNDoJVElDS19TTVBfSVJRCi0jZW5kaWYKK3RsMF9pcnExNDoJVFJBUF9JUlEodGltZXJfaW50ZXJydXB0LCAxNCkKIHRsMF9pcnExNToJVFJBUF9JUlEoaGFuZGxlcl9pcnEsIDE1KQogdGwwX3Jlc3YwNTA6CUJUUkFQKDB4NTApIEJUUkFQKDB4NTEpIEJUUkFQKDB4NTIpIEJUUkFQKDB4NTMpIEJUUkFQKDB4NTQpIEJUUkFQKDB4NTUpCiB0bDBfcmVzdjA1NjoJQlRSQVAoMHg1NikgQlRSQVAoMHg1NykgQlRSQVAoMHg1OCkgQlRSQVAoMHg1OSkgQlRSQVAoMHg1YSkgQlRSQVAoMHg1YikKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9tbS9pbml0LmMgYi9hcmNoL3NwYXJjNjQvbW0vaW5pdC5jCmluZGV4IGYxNDYwNzEuLmNhZmFkY2IgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9tbS9pbml0LmMKKysrIGIvYXJjaC9zcGFyYzY0L21tL2luaXQuYwpAQCAtMTIyLDI2ICsxMjIsMjEgQEAKIAkJCQlzaXplID0gMFVMOwogCQkJYmFzZSA9IG5ld19iYXNlOwogCQl9CisJCWlmIChzaXplID09IDBVTCkgeworCQkJLyogSWYgaXQgaXMgZW1wdHksIHNpbXBseSBnZXQgcmlkIG9mIGl0LgorCQkJICogVGhpcyBzaW1wbGlmaWVzIHRoZSBsb2dpYyBvZiB0aGUgb3RoZXIKKwkJCSAqIGZ1bmN0aW9ucyB0aGF0IHByb2Nlc3MgdGhlc2UgYXJyYXlzLgorCQkJICovCisJCQltZW1tb3ZlKCZyZWdzW2ldLCAmcmVnc1tpICsgMV0sCisJCQkJKGVudHMgLSBpIC0gMSkgKiBzaXplb2YocmVnc1swXSkpOworCQkJaS0tOworCQkJZW50cy0tOworCQkJY29udGludWU7CisJCX0KIAkJcmVnc1tpXS5waHlzX2FkZHIgPSBiYXNlOwogCQlyZWdzW2ldLnJlZ19zaXplID0gc2l6ZTsKIAl9CiAKLQlmb3IgKGkgPSAwOyBpIDwgZW50czsgaSsrKSB7Ci0JCWlmIChyZWdzW2ldLnJlZ19zaXplID09IDBVTCkgewotCQkJaW50IGo7Ci0KLQkJCWZvciAoaiA9IGk7IGogPCBlbnRzIC0gMTsgaisrKSB7Ci0JCQkJcmVnc1tqXS5waHlzX2FkZHIgPQotCQkJCQlyZWdzW2orMV0ucGh5c19hZGRyOwotCQkJCXJlZ3Nbal0ucmVnX3NpemUgPQotCQkJCQlyZWdzW2orMV0ucmVnX3NpemU7Ci0JCQl9Ci0KLQkJCWVudHMtLTsKLQkJCWktLTsKLQkJfQotCX0KLQogCSpudW1fZW50cyA9IGVudHM7CiAKIAlzb3J0KHJlZ3MsIGVudHMsIHNpemVvZihzdHJ1Y3QgbGludXhfcHJvbTY0X3JlZ2lzdGVycyksCkBAIC0xNTQsMTUgKzE0OSw2IEBACiB1bnNpZ25lZCBsb25nIGtlcm5fYmFzZSBfX3JlYWRfbW9zdGx5OwogdW5zaWduZWQgbG9uZyBrZXJuX3NpemUgX19yZWFkX21vc3RseTsKIAotLyogZ2V0X25ld19tbXVfY29udGV4dCgpIHVzZXMgImNhY2hlICsgMSIuICAqLwotREVGSU5FX1NQSU5MT0NLKGN0eF9hbGxvY19sb2NrKTsKLXVuc2lnbmVkIGxvbmcgdGxiX2NvbnRleHRfY2FjaGUgPSBDVFhfRklSU1RfVkVSU0lPTiAtIDE7Ci0jZGVmaW5lIENUWF9CTUFQX1NMT1RTICgxVUwgPDwgKENUWF9OUl9CSVRTIC0gNikpCi11bnNpZ25lZCBsb25nIG1tdV9jb250ZXh0X2JtYXBbQ1RYX0JNQVBfU0xPVFNdOwotCi0vKiBSZWZlcmVuY2VzIHRvIHNwZWNpYWwgc2VjdGlvbiBib3VuZGFyaWVzICovCi1leHRlcm4gY2hhciAgX3N0YXJ0W10sIF9lbmRbXTsKLQogLyogSW5pdGlhbCByYW1kaXNrIHNldHVwICovCiBleHRlcm4gdW5zaWduZWQgbG9uZyBzcGFyY19yYW1kaXNrX2ltYWdlNjQ7CiBleHRlcm4gdW5zaWduZWQgaW50IHNwYXJjX3JhbWRpc2tfaW1hZ2U7CkBAIC00MDYsMTkgKzM5Miw3MCBAQAogCWlmICh0bGJfdHlwZSA9PSBzcGl0ZmlyZSkgewogCQl1bnNpZ25lZCBsb25nIGthZGRyOwogCi0JCWZvciAoa2FkZHIgPSBzdGFydDsga2FkZHIgPCBlbmQ7IGthZGRyICs9IFBBR0VfU0laRSkKLQkJCV9fZmx1c2hfaWNhY2hlX3BhZ2UoX19nZXRfcGh5cyhrYWRkcikpOworCQkvKiBUaGlzIGNvZGUgb25seSBydW5zIG9uIFNwaXRmaXJlIGNwdXMgc28gdGhpcyBpcworCQkgKiB3aHkgd2UgY2FuIGFzc3VtZSBfUEFHRV9QQUREUl80VS4KKwkJICovCisJCWZvciAoa2FkZHIgPSBzdGFydDsga2FkZHIgPCBlbmQ7IGthZGRyICs9IFBBR0VfU0laRSkgeworCQkJdW5zaWduZWQgbG9uZyBwYWRkciwgbWFzayA9IF9QQUdFX1BBRERSXzRVOworCisJCQlpZiAoa2FkZHIgPj0gUEFHRV9PRkZTRVQpCisJCQkJcGFkZHIgPSBrYWRkciAmIG1hc2s7CisJCQllbHNlIHsKKwkJCQlwZ2RfdCAqcGdkcCA9IHBnZF9vZmZzZXRfayhrYWRkcik7CisJCQkJcHVkX3QgKnB1ZHAgPSBwdWRfb2Zmc2V0KHBnZHAsIGthZGRyKTsKKwkJCQlwbWRfdCAqcG1kcCA9IHBtZF9vZmZzZXQocHVkcCwga2FkZHIpOworCQkJCXB0ZV90ICpwdGVwID0gcHRlX29mZnNldF9rZXJuZWwocG1kcCwga2FkZHIpOworCisJCQkJcGFkZHIgPSBwdGVfdmFsKCpwdGVwKSAmIG1hc2s7CisJCQl9CisJCQlfX2ZsdXNoX2ljYWNoZV9wYWdlKHBhZGRyKTsKKwkJfQogCX0KIH0KIAogdm9pZCBzaG93X21lbSh2b2lkKQogewotCXByaW50aygiTWVtLWluZm86XG4iKTsKKwl1bnNpZ25lZCBsb25nIHRvdGFsID0gMCwgcmVzZXJ2ZWQgPSAwOworCXVuc2lnbmVkIGxvbmcgc2hhcmVkID0gMCwgY2FjaGVkID0gMDsKKwlwZ19kYXRhX3QgKnBnZGF0OworCisJcHJpbnRrKEtFUk5fSU5GTyAiTWVtLWluZm86XG4iKTsKIAlzaG93X2ZyZWVfYXJlYXMoKTsKLQlwcmludGsoIkZyZWUgc3dhcDogICAgICAgJTZsZGtCXG4iLAorCXByaW50ayhLRVJOX0lORk8gIkZyZWUgc3dhcDogICAgICAgJTZsZGtCXG4iLAogCSAgICAgICBucl9zd2FwX3BhZ2VzIDw8IChQQUdFX1NISUZULTEwKSk7Ci0JcHJpbnRrKCIlbGQgcGFnZXMgb2YgUkFNXG4iLCBudW1fcGh5c3BhZ2VzKTsKLQlwcmludGsoIiVsdSBmcmVlIHBhZ2VzXG4iLCBucl9mcmVlX3BhZ2VzKCkpOworCWZvcl9lYWNoX29ubGluZV9wZ2RhdChwZ2RhdCkgeworCQl1bnNpZ25lZCBsb25nIGksIGZsYWdzOworCisJCXBnZGF0X3Jlc2l6ZV9sb2NrKHBnZGF0LCAmZmxhZ3MpOworCQlmb3IgKGkgPSAwOyBpIDwgcGdkYXQtPm5vZGVfc3Bhbm5lZF9wYWdlczsgaSsrKSB7CisJCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHBnZGF0X3BhZ2VfbnIocGdkYXQsIGkpOworCQkJdG90YWwrKzsKKwkJCWlmIChQYWdlUmVzZXJ2ZWQocGFnZSkpCisJCQkJcmVzZXJ2ZWQrKzsKKwkJCWVsc2UgaWYgKFBhZ2VTd2FwQ2FjaGUocGFnZSkpCisJCQkJY2FjaGVkKys7CisJCQllbHNlIGlmIChwYWdlX2NvdW50KHBhZ2UpKQorCQkJCXNoYXJlZCArPSBwYWdlX2NvdW50KHBhZ2UpIC0gMTsKKwkJfQorCQlwZ2RhdF9yZXNpemVfdW5sb2NrKHBnZGF0LCAmZmxhZ3MpOworCX0KKworCXByaW50ayhLRVJOX0lORk8gIiVsdSBwYWdlcyBvZiBSQU1cbiIsIHRvdGFsKTsKKwlwcmludGsoS0VSTl9JTkZPICIlbHUgcmVzZXJ2ZWQgcGFnZXNcbiIsIHJlc2VydmVkKTsKKwlwcmludGsoS0VSTl9JTkZPICIlbHUgcGFnZXMgc2hhcmVkXG4iLCBzaGFyZWQpOworCXByaW50ayhLRVJOX0lORk8gIiVsdSBwYWdlcyBzd2FwIGNhY2hlZFxuIiwgY2FjaGVkKTsKKworCXByaW50ayhLRVJOX0lORk8gIiVsdSBwYWdlcyBkaXJ0eVxuIiwKKwkgICAgICAgZ2xvYmFsX3BhZ2Vfc3RhdGUoTlJfRklMRV9ESVJUWSkpOworCXByaW50ayhLRVJOX0lORk8gIiVsdSBwYWdlcyB3cml0ZWJhY2tcbiIsCisJICAgICAgIGdsb2JhbF9wYWdlX3N0YXRlKE5SX1dSSVRFQkFDSykpOworCXByaW50ayhLRVJOX0lORk8gIiVsdSBwYWdlcyBtYXBwZWRcbiIsCisJICAgICAgIGdsb2JhbF9wYWdlX3N0YXRlKE5SX0ZJTEVfTUFQUEVEKSk7CisJcHJpbnRrKEtFUk5fSU5GTyAiJWx1IHBhZ2VzIHNsYWJcbiIsCisJCWdsb2JhbF9wYWdlX3N0YXRlKE5SX1NMQUJfUkVDTEFJTUFCTEUpICsKKwkJZ2xvYmFsX3BhZ2Vfc3RhdGUoTlJfU0xBQl9VTlJFQ0xBSU1BQkxFKSk7CisJcHJpbnRrKEtFUk5fSU5GTyAiJWx1IHBhZ2VzIHBhZ2V0YWJsZXNcbiIsCisJICAgICAgIGdsb2JhbF9wYWdlX3N0YXRlKE5SX1BBR0VUQUJMRSkpOwogfQogCiB2b2lkIG1tdV9pbmZvKHN0cnVjdCBzZXFfZmlsZSAqbSkKQEAgLTY1OCw2ICs2OTUsMTMgQEAKIH0KICNlbmRpZiAvKiBEQ0FDSEVfQUxJQVNJTkdfUE9TU0lCTEUgKi8KIAorLyogZ2V0X25ld19tbXVfY29udGV4dCgpIHVzZXMgImNhY2hlICsgMSIuICAqLworREVGSU5FX1NQSU5MT0NLKGN0eF9hbGxvY19sb2NrKTsKK3Vuc2lnbmVkIGxvbmcgdGxiX2NvbnRleHRfY2FjaGUgPSBDVFhfRklSU1RfVkVSU0lPTiAtIDE7CisjZGVmaW5lIE1BWF9DVFhfTlIJKDFVTCA8PCBDVFhfTlJfQklUUykKKyNkZWZpbmUgQ1RYX0JNQVBfU0xPVFMJQklUU19UT19MT05HUyhNQVhfQ1RYX05SKQorREVDTEFSRV9CSVRNQVAobW11X2NvbnRleHRfYm1hcCwgTUFYX0NUWF9OUik7CisKIC8qIENhbGxlciBkb2VzIFRMQiBjb250ZXh0IGZsdXNoaW5nIG9uIGxvY2FsIENQVSBpZiBuZWNlc3NhcnkuCiAgKiBUaGUgY2FsbGVyIGFsc28gZW5zdXJlcyB0aGF0IENUWF9WQUxJRChtbS0+Y29udGV4dCkgaXMgZmFsc2UuCiAgKgpAQCAtNzE3LDk1ICs3NjEsNiBAQAogCQlzbXBfbmV3X21tdV9jb250ZXh0X3ZlcnNpb24oKTsKIH0KIAotdm9pZCBzcGFyY191bHRyYV9kdW1wX2l0bGIodm9pZCkKLXsKLSAgICAgICAgaW50IHNsb3Q7Ci0KLQlpZiAodGxiX3R5cGUgPT0gc3BpdGZpcmUpIHsKLQkJcHJpbnRrICgiQ29udGVudHMgb2YgaXRsYjogIik7Ci0JCWZvciAoc2xvdCA9IDA7IHNsb3QgPCAxNDsgc2xvdCsrKSBwcmludGsgKCIgICAgIik7Ci0JCXByaW50ayAoIiUyeDolMDE2bHgsJTAxNmx4XG4iLAotCQkJMCwKLQkJCXNwaXRmaXJlX2dldF9pdGxiX3RhZygwKSwgc3BpdGZpcmVfZ2V0X2l0bGJfZGF0YSgwKSk7Ci0JCWZvciAoc2xvdCA9IDE7IHNsb3QgPCA2NDsgc2xvdCs9MykgewotCQkJcHJpbnRrICgiJTJ4OiUwMTZseCwlMDE2bHggJTJ4OiUwMTZseCwlMDE2bHggJTJ4OiUwMTZseCwlMDE2bHhcbiIsIAotCQkJCXNsb3QsCi0JCQkJc3BpdGZpcmVfZ2V0X2l0bGJfdGFnKHNsb3QpLCBzcGl0ZmlyZV9nZXRfaXRsYl9kYXRhKHNsb3QpLAotCQkJCXNsb3QrMSwKLQkJCQlzcGl0ZmlyZV9nZXRfaXRsYl90YWcoc2xvdCsxKSwgc3BpdGZpcmVfZ2V0X2l0bGJfZGF0YShzbG90KzEpLAotCQkJCXNsb3QrMiwKLQkJCQlzcGl0ZmlyZV9nZXRfaXRsYl90YWcoc2xvdCsyKSwgc3BpdGZpcmVfZ2V0X2l0bGJfZGF0YShzbG90KzIpKTsKLQkJfQotCX0gZWxzZSBpZiAodGxiX3R5cGUgPT0gY2hlZXRhaCB8fCB0bGJfdHlwZSA9PSBjaGVldGFoX3BsdXMpIHsKLQkJcHJpbnRrICgiQ29udGVudHMgb2YgaXRsYjA6XG4iKTsKLQkJZm9yIChzbG90ID0gMDsgc2xvdCA8IDE2OyBzbG90Kz0yKSB7Ci0JCQlwcmludGsgKCIlMng6JTAxNmx4LCUwMTZseCAlMng6JTAxNmx4LCUwMTZseFxuIiwKLQkJCQlzbG90LAotCQkJCWNoZWV0YWhfZ2V0X2xpdGxiX3RhZyhzbG90KSwgY2hlZXRhaF9nZXRfbGl0bGJfZGF0YShzbG90KSwKLQkJCQlzbG90KzEsCi0JCQkJY2hlZXRhaF9nZXRfbGl0bGJfdGFnKHNsb3QrMSksIGNoZWV0YWhfZ2V0X2xpdGxiX2RhdGEoc2xvdCsxKSk7Ci0JCX0KLQkJcHJpbnRrICgiQ29udGVudHMgb2YgaXRsYjI6XG4iKTsKLQkJZm9yIChzbG90ID0gMDsgc2xvdCA8IDEyODsgc2xvdCs9MikgewotCQkJcHJpbnRrICgiJTJ4OiUwMTZseCwlMDE2bHggJTJ4OiUwMTZseCwlMDE2bHhcbiIsCi0JCQkJc2xvdCwKLQkJCQljaGVldGFoX2dldF9pdGxiX3RhZyhzbG90KSwgY2hlZXRhaF9nZXRfaXRsYl9kYXRhKHNsb3QpLAotCQkJCXNsb3QrMSwKLQkJCQljaGVldGFoX2dldF9pdGxiX3RhZyhzbG90KzEpLCBjaGVldGFoX2dldF9pdGxiX2RhdGEoc2xvdCsxKSk7Ci0JCX0KLQl9Ci19Ci0KLXZvaWQgc3BhcmNfdWx0cmFfZHVtcF9kdGxiKHZvaWQpCi17Ci0gICAgICAgIGludCBzbG90OwotCi0JaWYgKHRsYl90eXBlID09IHNwaXRmaXJlKSB7Ci0JCXByaW50ayAoIkNvbnRlbnRzIG9mIGR0bGI6ICIpOwotCQlmb3IgKHNsb3QgPSAwOyBzbG90IDwgMTQ7IHNsb3QrKykgcHJpbnRrICgiICAgICIpOwotCQlwcmludGsgKCIlMng6JTAxNmx4LCUwMTZseFxuIiwgMCwKLQkJCXNwaXRmaXJlX2dldF9kdGxiX3RhZygwKSwgc3BpdGZpcmVfZ2V0X2R0bGJfZGF0YSgwKSk7Ci0JCWZvciAoc2xvdCA9IDE7IHNsb3QgPCA2NDsgc2xvdCs9MykgewotCQkJcHJpbnRrICgiJTJ4OiUwMTZseCwlMDE2bHggJTJ4OiUwMTZseCwlMDE2bHggJTJ4OiUwMTZseCwlMDE2bHhcbiIsIAotCQkJCXNsb3QsCi0JCQkJc3BpdGZpcmVfZ2V0X2R0bGJfdGFnKHNsb3QpLCBzcGl0ZmlyZV9nZXRfZHRsYl9kYXRhKHNsb3QpLAotCQkJCXNsb3QrMSwKLQkJCQlzcGl0ZmlyZV9nZXRfZHRsYl90YWcoc2xvdCsxKSwgc3BpdGZpcmVfZ2V0X2R0bGJfZGF0YShzbG90KzEpLAotCQkJCXNsb3QrMiwKLQkJCQlzcGl0ZmlyZV9nZXRfZHRsYl90YWcoc2xvdCsyKSwgc3BpdGZpcmVfZ2V0X2R0bGJfZGF0YShzbG90KzIpKTsKLQkJfQotCX0gZWxzZSBpZiAodGxiX3R5cGUgPT0gY2hlZXRhaCB8fCB0bGJfdHlwZSA9PSBjaGVldGFoX3BsdXMpIHsKLQkJcHJpbnRrICgiQ29udGVudHMgb2YgZHRsYjA6XG4iKTsKLQkJZm9yIChzbG90ID0gMDsgc2xvdCA8IDE2OyBzbG90Kz0yKSB7Ci0JCQlwcmludGsgKCIlMng6JTAxNmx4LCUwMTZseCAlMng6JTAxNmx4LCUwMTZseFxuIiwKLQkJCQlzbG90LAotCQkJCWNoZWV0YWhfZ2V0X2xkdGxiX3RhZyhzbG90KSwgY2hlZXRhaF9nZXRfbGR0bGJfZGF0YShzbG90KSwKLQkJCQlzbG90KzEsCi0JCQkJY2hlZXRhaF9nZXRfbGR0bGJfdGFnKHNsb3QrMSksIGNoZWV0YWhfZ2V0X2xkdGxiX2RhdGEoc2xvdCsxKSk7Ci0JCX0KLQkJcHJpbnRrICgiQ29udGVudHMgb2YgZHRsYjI6XG4iKTsKLQkJZm9yIChzbG90ID0gMDsgc2xvdCA8IDUxMjsgc2xvdCs9MikgewotCQkJcHJpbnRrICgiJTJ4OiUwMTZseCwlMDE2bHggJTJ4OiUwMTZseCwlMDE2bHhcbiIsCi0JCQkJc2xvdCwKLQkJCQljaGVldGFoX2dldF9kdGxiX3RhZyhzbG90LCAyKSwgY2hlZXRhaF9nZXRfZHRsYl9kYXRhKHNsb3QsIDIpLAotCQkJCXNsb3QrMSwKLQkJCQljaGVldGFoX2dldF9kdGxiX3RhZyhzbG90KzEsIDIpLCBjaGVldGFoX2dldF9kdGxiX2RhdGEoc2xvdCsxLCAyKSk7Ci0JCX0KLQkJaWYgKHRsYl90eXBlID09IGNoZWV0YWhfcGx1cykgewotCQkJcHJpbnRrICgiQ29udGVudHMgb2YgZHRsYjM6XG4iKTsKLQkJCWZvciAoc2xvdCA9IDA7IHNsb3QgPCA1MTI7IHNsb3QrPTIpIHsKLQkJCQlwcmludGsgKCIlMng6JTAxNmx4LCUwMTZseCAlMng6JTAxNmx4LCUwMTZseFxuIiwKLQkJCQkJc2xvdCwKLQkJCQkJY2hlZXRhaF9nZXRfZHRsYl90YWcoc2xvdCwgMyksIGNoZWV0YWhfZ2V0X2R0bGJfZGF0YShzbG90LCAzKSwKLQkJCQkJc2xvdCsxLAotCQkJCQljaGVldGFoX2dldF9kdGxiX3RhZyhzbG90KzEsIDMpLCBjaGVldGFoX2dldF9kdGxiX2RhdGEoc2xvdCsxLCAzKSk7Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KLWV4dGVybiB1bnNpZ25lZCBsb25nIGNtZGxpbmVfbWVtb3J5X3NpemU7Ci0KIC8qIEZpbmQgYSBmcmVlIGFyZWEgZm9yIHRoZSBib290bWVtIG1hcCwgYXZvaWRpbmcgdGhlIGtlcm5lbCBpbWFnZQogICogYW5kIHRoZSBpbml0aWFsIHJhbWRpc2suCiAgKi8KQEAgLTgxNSw4ICs3NzAsOCBAQAogCXVuc2lnbmVkIGxvbmcgYXZvaWRfc3RhcnQsIGF2b2lkX2VuZCwgYm9vdG1hcF9zaXplOwogCWludCBpOwogCi0JYm9vdG1hcF9zaXplID0gKChlbmRfcGZuIC0gc3RhcnRfcGZuKSArIDcpIC8gODsKLQlib290bWFwX3NpemUgPSBBTElHTihib290bWFwX3NpemUsIHNpemVvZihsb25nKSk7CisJYm9vdG1hcF9zaXplID0gYm9vdG1lbV9ib290bWFwX3BhZ2VzKGVuZF9wZm4gLSBzdGFydF9wZm4pOworCWJvb3RtYXBfc2l6ZSA8PD0gUEFHRV9TSElGVDsKIAogCWF2b2lkX3N0YXJ0ID0gYXZvaWRfZW5kID0gMDsKICNpZmRlZiBDT05GSUdfQkxLX0RFVl9JTklUUkQKQEAgLTk4Myw2ICs5MzgsMjAgQEAKIAl9CiB9CiAKKy8qIEFib3V0IHBhZ2VzX2F2YWlsLCB0aGlzIGlzIHRoZSB2YWx1ZSB3ZSB3aWxsIHVzZSB0byBjYWxjdWxhdGUKKyAqIHRoZSB6aG9sZXNfc2l6ZVtdIGFyZ3VtZW50IGdpdmVuIHRvIGZyZWVfYXJlYV9pbml0X25vZGUoKS4gIFRoZQorICogcGFnZSBhbGxvY2F0b3IgdXNlcyB0aGlzIHRvIGNhbGN1bGF0ZSBucl9rZXJuZWxfcGFnZXMsCisgKiBucl9hbGxfcGFnZXMgYW5kIHpvbmUtPnByZXNlbnRfcGFnZXMuICBPbiBOVU1BIGl0IGlzIHVzZWQKKyAqIHRvIGNhbGN1bGF0ZSB6b25lLT5taW5fdW5tYXBwZWRfcGFnZXMgYW5kIHpvbmUtPm1pbl9zbGFiX3BhZ2VzLgorICoKKyAqIFNvIHRoaXMgbnVtYmVyIHNob3VsZCByZWFsbHkgYmUgc2V0IHRvIHdoYXQgdGhlIHBhZ2UgYWxsb2NhdG9yCisgKiBhY3R1YWxseSBlbmRzIHVwIHdpdGguICBUaGlzIG1lYW5zOgorICogMSkgSXQgc2hvdWxkIGluY2x1ZGUgYm9vdG1lbSBtYXAgcGFnZXMsIHdlJ2xsIHJlbGVhc2UgdGhvc2UuCisgKiAyKSBJdCBzaG91bGQgbm90IGluY2x1ZGUgdGhlIGtlcm5lbCBpbWFnZSwgZXhjZXB0IGZvciB0aGUKKyAqICAgIF9faW5pdCBzZWN0aW9ucyB3aGljaCB3ZSB3aWxsIGFsc28gcmVsZWFzZS4KKyAqIDMpIEl0IHNob3VsZCBpbmNsdWRlIHRoZSBpbml0cmQgaW1hZ2UsIHNpbmNlIHdlJ2xsIHJlbGVhc2UKKyAqICAgIHRoYXQgdG9vLgorICovCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBfX2luaXQgYm9vdG1lbV9pbml0KHVuc2lnbmVkIGxvbmcgKnBhZ2VzX2F2YWlsLAogCQkJCQkgdW5zaWduZWQgbG9uZyBwaHlzX2Jhc2UpCiB7CkBAIC0xMDY5LDcgKzEwMzgsNiBAQAogCQkJaW5pdHJkX3N0YXJ0LCBpbml0cmRfZW5kKTsKICNlbmRpZgogCQlyZXNlcnZlX2Jvb3RtZW0oaW5pdHJkX3N0YXJ0LCBzaXplKTsKLQkJKnBhZ2VzX2F2YWlsIC09IFBBR0VfQUxJR04oc2l6ZSkgPj4gUEFHRV9TSElGVDsKIAogCQlpbml0cmRfc3RhcnQgKz0gUEFHRV9PRkZTRVQ7CiAJCWluaXRyZF9lbmQgKz0gUEFHRV9PRkZTRVQ7CkBAIC0xMDgyLDYgKzEwNTAsMTEgQEAKIAlyZXNlcnZlX2Jvb3RtZW0oa2Vybl9iYXNlLCBrZXJuX3NpemUpOwogCSpwYWdlc19hdmFpbCAtPSBQQUdFX0FMSUdOKGtlcm5fc2l6ZSkgPj4gUEFHRV9TSElGVDsKIAorCS8qIEFkZCBiYWNrIGluIHRoZSBpbml0bWVtIHBhZ2VzLiAqLworCXNpemUgPSAoKHVuc2lnbmVkIGxvbmcpKF9faW5pdF9lbmQpICYgUEFHRV9NQVNLKSAtCisJCVBBR0VfQUxJR04oKHVuc2lnbmVkIGxvbmcpX19pbml0X2JlZ2luKTsKKwkqcGFnZXNfYXZhaWwgKz0gc2l6ZSA+PiBQQUdFX1NISUZUOworCiAJLyogUmVzZXJ2ZSB0aGUgYm9vdG1lbSBtYXAuICAgV2UgZG8gbm90IGFjY291bnQgZm9yIGl0CiAJICogaW4gcGFnZXNfYXZhaWwgYmVjYXVzZSB3ZSB3aWxsIHJlbGVhc2UgdGhhdCBtZW1vcnkKIAkgKiBpbiBmcmVlX2FsbF9ib290bWVtLgpAQCAtMTA5Miw3ICsxMDY1LDYgQEAKIAkJICAgIChib290bWFwX3BmbiA8PCBQQUdFX1NISUZUKSwgc2l6ZSk7CiAjZW5kaWYKIAlyZXNlcnZlX2Jvb3RtZW0oKGJvb3RtYXBfcGZuIDw8IFBBR0VfU0hJRlQpLCBzaXplKTsKLQkqcGFnZXNfYXZhaWwgLT0gUEFHRV9BTElHTihzaXplKSA+PiBQQUdFX1NISUZUOwogCiAJZm9yIChpID0gMDsgaSA8IHBhdmFpbF9lbnRzOyBpKyspIHsKIAkJdW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIGVuZF9wZm47CkBAIC0xNTg0LDYgKzE1NTYsMTAgQEAKICNpZmRlZiBDT05GSUdfREVCVUdfQk9PVE1FTQogCXByb21fcHJpbnRmKCJtZW1faW5pdDogQ2FsbGluZyBmcmVlX2FsbF9ib290bWVtKCkuXG4iKTsKICNlbmRpZgorCisJLyogV2Ugc3VidHJhY3Qgb25lIHRvIGFjY291bnQgZm9yIHRoZSBtZW1fbWFwX3plcm8gcGFnZQorCSAqIGFsbG9jYXRlZCBiZWxvdy4KKwkgKi8KIAl0b3RhbHJhbV9wYWdlcyA9IG51bV9waHlzcGFnZXMgPSBmcmVlX2FsbF9ib290bWVtKCkgLSAxOwogCiAJLyoKQEAgLTE4ODMsNjIgKzE4NTksNiBAQAogCXJldHVybiB2YWwgfCBwYWRkcjsKIH0KIAotLyoKLSAqIFRyYW5zbGF0ZSBQUk9NJ3MgbWFwcGluZyB3ZSBjYXB0dXJlIGF0IGJvb3QgdGltZSBpbnRvIHBoeXNpY2FsIGFkZHJlc3MuCi0gKiBUaGUgc2Vjb25kIHBhcmFtZXRlciBpcyBvbmx5IHNldCBmcm9tIHByb21fY2FsbGJhY2soKSBpbnZvY2F0aW9ucy4KLSAqLwotdW5zaWduZWQgbG9uZyBwcm9tX3ZpcnRfdG9fcGh5cyh1bnNpZ25lZCBsb25nIHByb212YSwgaW50ICplcnJvcikKLXsKLQl1bnNpZ25lZCBsb25nIG1hc2s7Ci0JaW50IGk7Ci0KLQltYXNrID0gX1BBR0VfUEFERFJfNFU7Ci0JaWYgKHRsYl90eXBlID09IGh5cGVydmlzb3IpCi0JCW1hc2sgPSBfUEFHRV9QQUREUl80VjsKLQotCWZvciAoaSA9IDA7IGkgPCBwcm9tX3RyYW5zX2VudHM7IGkrKykgewotCQlzdHJ1Y3QgbGludXhfcHJvbV90cmFuc2xhdGlvbiAqcCA9ICZwcm9tX3RyYW5zW2ldOwotCi0JCWlmIChwcm9tdmEgPj0gcC0+dmlydCAmJgotCQkgICAgcHJvbXZhIDwgKHAtPnZpcnQgKyBwLT5zaXplKSkgewotCQkJdW5zaWduZWQgbG9uZyBiYXNlID0gcC0+ZGF0YSAmIG1hc2s7Ci0KLQkJCWlmIChlcnJvcikKLQkJCQkqZXJyb3IgPSAwOwotCQkJcmV0dXJuIGJhc2UgKyAocHJvbXZhICYgKDgxOTIgLSAxKSk7Ci0JCX0KLQl9Ci0JaWYgKGVycm9yKQotCQkqZXJyb3IgPSAxOwotCXJldHVybiAwVUw7Ci19Ci0KLS8qIFhYWCBXZSBzaG91bGQga2lsbCBvZmYgdGhpcyB1Z2x5IHRoaW5nIGF0IHNvIG1lIHBvaW50LiBYWFggKi8KLXVuc2lnbmVkIGxvbmcgc3VuNHVfZ2V0X3B0ZSh1bnNpZ25lZCBsb25nIGFkZHIpCi17Ci0JcGdkX3QgKnBnZHA7Ci0JcHVkX3QgKnB1ZHA7Ci0JcG1kX3QgKnBtZHA7Ci0JcHRlX3QgKnB0ZXA7Ci0JdW5zaWduZWQgbG9uZyBtYXNrID0gX1BBR0VfUEFERFJfNFU7Ci0KLQlpZiAodGxiX3R5cGUgPT0gaHlwZXJ2aXNvcikKLQkJbWFzayA9IF9QQUdFX1BBRERSXzRWOwotCi0JaWYgKGFkZHIgPj0gUEFHRV9PRkZTRVQpCi0JCXJldHVybiBhZGRyICYgbWFzazsKLQotCWlmICgoYWRkciA+PSBMT1dfT0JQX0FERFJFU1MpICYmIChhZGRyIDwgSElfT0JQX0FERFJFU1MpKQotCQlyZXR1cm4gcHJvbV92aXJ0X3RvX3BoeXMoYWRkciwgTlVMTCk7Ci0KLQlwZ2RwID0gcGdkX29mZnNldF9rKGFkZHIpOwotCXB1ZHAgPSBwdWRfb2Zmc2V0KHBnZHAsIGFkZHIpOwotCXBtZHAgPSBwbWRfb2Zmc2V0KHB1ZHAsIGFkZHIpOwotCXB0ZXAgPSBwdGVfb2Zmc2V0X2tlcm5lbChwbWRwLCBhZGRyKTsKLQotCXJldHVybiBwdGVfdmFsKCpwdGVwKSAmIG1hc2s7Ci19Ci0KIC8qIElmIG5vdCBsb2NrZWQsIHphcCBpdC4gKi8KIHZvaWQgX19mbHVzaF90bGJfYWxsKHZvaWQpCiB7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQvc29sYXJpcy9taXNjLmMgYi9hcmNoL3NwYXJjNjQvc29sYXJpcy9taXNjLmMKaW5kZXggOWZjYWFkNi4uNTQyYzgwOCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L3NvbGFyaXMvbWlzYy5jCisrKyBiL2FyY2gvc3BhcmM2NC9zb2xhcmlzL21pc2MuYwpAQCAtMjI0LDcgKzIyNCw4IEBACiAKIAkqYnVmZmVyID0gMDsKIAlpZiAoZHApIHsKLQkJY2hhciAqdmFsID0gb2ZfZ2V0X3Byb3BlcnR5KGRwLCAic3lzdGVtLWJvYXJkLXNlcmlhbCMiLCAmbGVuKTsKKwkJY29uc3QgY2hhciAqdmFsID0KKwkJCW9mX2dldF9wcm9wZXJ0eShkcCwgInN5c3RlbS1ib2FyZC1zZXJpYWwjIiwgJmxlbik7CiAKIAkJaWYgKHZhbCAmJiBsZW4gPiAwKSB7CiAJCQlpZiAobGVuID4gc3opCmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvZGFlbW9uX2tlcm4uYyBiL2FyY2gvdW0vZHJpdmVycy9kYWVtb25fa2Vybi5jCmluZGV4IDljMmU3YTcuLmFkZWVjZTEgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9kYWVtb25fa2Vybi5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy9kYWVtb25fa2Vybi5jCkBAIC00Niw3ICs0Niw3IEBACiB7CiAJKnNrYiA9IGV0aGVyX2FkanVzdF9za2IoKnNrYiwgRVRIX0hFQURFUl9PVEhFUik7CiAJaWYoKnNrYiA9PSBOVUxMKSByZXR1cm4oLUVOT01FTSk7Ci0JcmV0dXJuKG5ldF9yZWN2ZnJvbShmZCwgKCpza2IpLT5tYWMucmF3LCAKKwlyZXR1cm4obmV0X3JlY3Zmcm9tKGZkLCBza2JfbWFjX2hlYWRlcigqc2tiKSwKIAkJCSAgICAoKnNrYiktPmRldi0+bXR1ICsgRVRIX0hFQURFUl9PVEhFUikpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvbWNhc3Rfa2Vybi5jIGIvYXJjaC91bS9kcml2ZXJzL21jYXN0X2tlcm4uYwppbmRleCA1MmNjYjdiLi5lNmI4ZTBkIDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvbWNhc3Rfa2Vybi5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy9tY2FzdF9rZXJuLmMKQEAgLTUwLDcgKzUwLDcgQEAKIHsKIAkqc2tiID0gZXRoZXJfYWRqdXN0X3NrYigqc2tiLCBFVEhfSEVBREVSX09USEVSKTsKIAlpZigqc2tiID09IE5VTEwpIHJldHVybigtRU5PTUVNKTsKLQlyZXR1cm4obmV0X3JlY3Zmcm9tKGZkLCAoKnNrYiktPm1hYy5yYXcsIAorCXJldHVybihuZXRfcmVjdmZyb20oZmQsIHNrYl9tYWNfaGVhZGVyKCpza2IpLAogCQkJICAgICgqc2tiKS0+ZGV2LT5tdHUgKyBFVEhfSEVBREVSX09USEVSKSk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9uZXRfa2Vybi5jIGIvYXJjaC91bS9kcml2ZXJzL25ldF9rZXJuLmMKaW5kZXggMDRlMzFmOC4uODU5MzAzNyAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL25ldF9rZXJuLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL25ldF9rZXJuLmMKQEAgLTU1LDcgKzU1LDcgQEAKIAogCXNrYi0+ZGV2ID0gZGV2OwogCXNrYl9wdXQoc2tiLCBkZXYtPm10dSk7Ci0Jc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOworCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CiAJcGt0X2xlbiA9ICgqbHAtPnJlYWQpKGxwLT5mZCwgJnNrYiwgbHApOwogCiAJaWYgKHBrdF9sZW4gPiAwKSB7CmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvcGNhcF9rZXJuLmMgYi9hcmNoL3VtL2RyaXZlcnMvcGNhcF9rZXJuLmMKaW5kZXggZTY3MzYyYS4uOTQ4ODQ5MyAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL3BjYXBfa2Vybi5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy9wY2FwX2tlcm4uYwpAQCAtMzYsNyArMzYsNyBAQAogewogCSpza2IgPSBldGhlcl9hZGp1c3Rfc2tiKCpza2IsIEVUSF9IRUFERVJfT1RIRVIpOwogCWlmKCpza2IgPT0gTlVMTCkgcmV0dXJuKC1FTk9NRU0pOwotCXJldHVybihwY2FwX3VzZXJfcmVhZChmZCwgKCpza2IpLT5tYWMucmF3LCAKKwlyZXR1cm4ocGNhcF91c2VyX3JlYWQoZmQsIHNrYl9tYWNfaGVhZGVyKCpza2IpLAogCQkJICAgICAgKCpza2IpLT5kZXYtPm10dSArIEVUSF9IRUFERVJfT1RIRVIsCiAJCQkgICAgICAoc3RydWN0IHBjYXBfZGF0YSAqKSAmbHAtPnVzZXIpKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9zbGlwX2tlcm4uYyBiL2FyY2gvdW0vZHJpdmVycy9zbGlwX2tlcm4uYwppbmRleCAyNTYzNGJkLi4xMjVjNDRmIDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvc2xpcF9rZXJuLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL3NsaXBfa2Vybi5jCkBAIC00OSw3ICs0OSw3IEBACiBzdGF0aWMgaW50IHNsaXBfcmVhZChpbnQgZmQsIHN0cnVjdCBza19idWZmICoqc2tiLCAKIAkJICAgICAgIHN0cnVjdCB1bWxfbmV0X3ByaXZhdGUgKmxwKQogewotCXJldHVybihzbGlwX3VzZXJfcmVhZChmZCwgKCpza2IpLT5tYWMucmF3LCAoKnNrYiktPmRldi0+bXR1LCAKKwlyZXR1cm4oc2xpcF91c2VyX3JlYWQoZmQsIHNrYl9tYWNfaGVhZGVyKCpza2IpLCAoKnNrYiktPmRldi0+bXR1LAogCQkJICAgICAgKHN0cnVjdCBzbGlwX2RhdGEgKikgJmxwLT51c2VyKSk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9zbGlycF9rZXJuLmMgYi9hcmNoL3VtL2RyaXZlcnMvc2xpcnBfa2Vybi5jCmluZGV4IGIzZWQ4ZmIuLjBhMDMyNGEgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9zbGlycF9rZXJuLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL3NsaXJwX2tlcm4uYwpAQCAtNTMsNyArNTMsNyBAQAogc3RhdGljIGludCBzbGlycF9yZWFkKGludCBmZCwgc3RydWN0IHNrX2J1ZmYgKipza2IsIAogCQkgICAgICAgc3RydWN0IHVtbF9uZXRfcHJpdmF0ZSAqbHApCiB7Ci0JcmV0dXJuKHNsaXJwX3VzZXJfcmVhZChmZCwgKCpza2IpLT5tYWMucmF3LCAoKnNrYiktPmRldi0+bXR1LCAKKwlyZXR1cm4oc2xpcnBfdXNlcl9yZWFkKGZkLCBza2JfbWFjX2hlYWRlcigqc2tiKSwgKCpza2IpLT5kZXYtPm10dSwKIAkJCSAgICAgIChzdHJ1Y3Qgc2xpcnBfZGF0YSAqKSAmbHAtPnVzZXIpKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC9kcml2ZXJzL2V0aGVydGFwX2tlcm4uYyBiL2FyY2gvdW0vb3MtTGludXgvZHJpdmVycy9ldGhlcnRhcF9rZXJuLmMKaW5kZXggNzA1NDE4Mi4uMTI2ODkxNCAxMDA2NDQKLS0tIGEvYXJjaC91bS9vcy1MaW51eC9kcml2ZXJzL2V0aGVydGFwX2tlcm4uYworKysgYi9hcmNoL3VtL29zLUxpbnV4L2RyaXZlcnMvZXRoZXJ0YXBfa2Vybi5jCkBAIC00Myw3ICs0Myw3IEBACiAKIAkqc2tiID0gZXRoZXJfYWRqdXN0X3NrYigqc2tiLCBFVEhfSEVBREVSX0VUSEVSVEFQKTsKIAlpZigqc2tiID09IE5VTEwpIHJldHVybigtRU5PTUVNKTsKLQlsZW4gPSBuZXRfcmVjdmZyb20oZmQsICgqc2tiKS0+bWFjLnJhdywgCisJbGVuID0gbmV0X3JlY3Zmcm9tKGZkLCBza2JfbWFjX2hlYWRlcigqc2tiKSwKIAkJCSAgICgqc2tiKS0+ZGV2LT5tdHUgKyAyICogRVRIX0hFQURFUl9FVEhFUlRBUCk7CiAJaWYobGVuIDw9IDApIHJldHVybihsZW4pOwogCXNrYl9wdWxsKCpza2IsIDIpOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC9kcml2ZXJzL3R1bnRhcF9rZXJuLmMgYi9hcmNoL3VtL29zLUxpbnV4L2RyaXZlcnMvdHVudGFwX2tlcm4uYwppbmRleCA3NjU3MGEyLi5mMTcxNGU3IDEwMDY0NAotLS0gYS9hcmNoL3VtL29zLUxpbnV4L2RyaXZlcnMvdHVudGFwX2tlcm4uYworKysgYi9hcmNoL3VtL29zLUxpbnV4L2RyaXZlcnMvdHVudGFwX2tlcm4uYwpAQCAtNDMsNyArNDMsNyBAQAogewogCSpza2IgPSBldGhlcl9hZGp1c3Rfc2tiKCpza2IsIEVUSF9IRUFERVJfT1RIRVIpOwogCWlmKCpza2IgPT0gTlVMTCkgcmV0dXJuKC1FTk9NRU0pOwotCXJldHVybihuZXRfcmVhZChmZCwgKCpza2IpLT5tYWMucmF3LCAKKwlyZXR1cm4obmV0X3JlYWQoZmQsIHNrYl9tYWNfaGVhZGVyKCpza2IpLAogCQkJKCpza2IpLT5kZXYtPm10dSArIEVUSF9IRUFERVJfT1RIRVIpKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQvZGVmY29uZmlnIGIvYXJjaC94ODZfNjQvZGVmY29uZmlnCmluZGV4IDdhMWUyNTEuLmIyNjM3ODggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2RlZmNvbmZpZworKysgYi9hcmNoL3g4Nl82NC9kZWZjb25maWcKQEAgLTYzMSw3ICs2MzEsNiBAQAogQ09ORklHX1NBVEFfVklBPXkKICMgQ09ORklHX1NBVEFfVklURVNTRSBpcyBub3Qgc2V0CiAjIENPTkZJR19TQVRBX0lOSUMxNjJYIGlzIG5vdCBzZXQKLUNPTkZJR19TQVRBX0lOVEVMX0NPTUJJTkVEPXkKIENPTkZJR19TQVRBX0FDUEk9eQogIyBDT05GSUdfUEFUQV9BTEkgaXMgbm90IHNldAogIyBDT05GSUdfUEFUQV9BTUQgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvbGliL01ha2VmaWxlIGIvYXJjaC94dGVuc2EvbGliL01ha2VmaWxlCmluZGV4IGVkOTM1YjUuLjZjNGZkZDggMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL2xpYi9NYWtlZmlsZQorKysgYi9hcmNoL3h0ZW5zYS9saWIvTWFrZWZpbGUKQEAgLTIsNiArMiw2IEBACiAjIE1ha2VmaWxlIGZvciBYdGVuc2Etc3BlY2lmaWMgbGlicmFyeSBmaWxlcy4KICMKIAotbGliLXkJKz0gbWVtY29weS5vIG1lbXNldC5vIGNoZWNrc3VtLm8gc3RyY2FzZWNtcC5vIFwKK2xpYi15CSs9IG1lbWNvcHkubyBtZW1zZXQubyBjaGVja3N1bS5vIFwKIAkgICB1c2VyY29weS5vIHN0cm5jcHlfdXNlci5vIHN0cm5sZW5fdXNlci5vCiBsaWItJChDT05GSUdfUENJKSArPSBwY2ktYXV0by5vCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9saWIvc3RyY2FzZWNtcC5jIGIvYXJjaC94dGVuc2EvbGliL3N0cmNhc2VjbXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTY1YjJkNi4uMDAwMDAwMAotLS0gYS9hcmNoL3h0ZW5zYS9saWIvc3RyY2FzZWNtcC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAqICBsaW51eC9hcmNoL3h0ZW5zYS9saWIvc3RyY2FzZWNtcC5jCi0gKgotICogIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwKLSAqICBQdWJsaWMgTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mCi0gKiAgdGhpcyBhcmNoaXZlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogIENvcHlyaWdodCAoQykgMjAwMiBUZW5zaWxpY2EgSW5jLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLQotCi0vKiBXZSBoYW5kbGUgbm90aGluZyBoZXJlIGV4Y2VwdCB0aGUgQyBsb2NhbGUuICBTaW5jZSB0aGlzIGlzIHVzZWQgaW4KLSAgIG9ubHkgb25lIHBsYWNlLCBvbiBzdHJpbmdzIGtub3duIHRvIGNvbnRhaW4gb25seSA3IGJpdCBBU0NJSSwgdGhpcwotICAgaXMgb2suICAqLwotCi1pbnQgc3RyY2FzZWNtcChjb25zdCBjaGFyICphLCBjb25zdCBjaGFyICpiKQotewotCWludCBjYSwgY2I7Ci0KLQlkbyB7Ci0JCWNhID0gKmErKyAmIDB4ZmY7Ci0JCWNiID0gKmIrKyAmIDB4ZmY7Ci0JCWlmIChjYSA+PSAnQScgJiYgY2EgPD0gJ1onKQotCQkJY2EgKz0gJ2EnIC0gJ0EnOwotCQlpZiAoY2IgPj0gJ0EnICYmIGNiIDw9ICdaJykKLQkJCWNiICs9ICdhJyAtICdBJzsKLQl9IHdoaWxlIChjYSA9PSBjYiAmJiBjYSAhPSAnXDAnKTsKLQotCXJldHVybiBjYSAtIGNiOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvcGxhdGZvcm0taXNzL25ldHdvcmsuYyBiL2FyY2gveHRlbnNhL3BsYXRmb3JtLWlzcy9uZXR3b3JrLmMKaW5kZXggOGViZmM4Ny4uYWIwNWJmZiAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2EvcGxhdGZvcm0taXNzL25ldHdvcmsuYworKysgYi9hcmNoL3h0ZW5zYS9wbGF0Zm9ybS1pc3MvbmV0d29yay5jCkBAIC0zODYsNyArMzg2LDcgQEAKIAkvKiBTZXR1cCBza2IgKi8KIAogCXNrYi0+ZGV2ID0gZGV2OwotCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKwlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwogCXBrdF9sZW4gPSBscC0+dHAucmVhZChscCwgJnNrYik7CiAJc2tiX3B1dChza2IsIHBrdF9sZW4pOwogCmRpZmYgLS1naXQgYS9ibG9jay9jZnEtaW9zY2hlZC5jIGIvYmxvY2svY2ZxLWlvc2NoZWQuYwppbmRleCBmOTJiYTJhLi42NGRmM2ZhIDEwMDY0NAotLS0gYS9ibG9jay9jZnEtaW9zY2hlZC5jCisrKyBiL2Jsb2NrL2NmcS1pb3NjaGVkLmMKQEAgLTksNyArOSw2IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvZWxldmF0b3IuaD4KLSNpbmNsdWRlIDxsaW51eC9oYXNoLmg+CiAjaW5jbHVkZSA8bGludXgvcmJ0cmVlLmg+CiAjaW5jbHVkZSA8bGludXgvaW9wcmlvLmg+CiAKQEAgLTI2LDE5ICsyNSwxNyBAQAogc3RhdGljIGNvbnN0IGludCBjZnFfc2xpY2VfYXN5bmNfcnEgPSAyOwogc3RhdGljIGludCBjZnFfc2xpY2VfaWRsZSA9IEhaIC8gMTI1OwogCisvKgorICogZ3JhY2UgcGVyaW9kIGJlZm9yZSBhbGxvd2luZyBpZGxlIGNsYXNzIHRvIGdldCBkaXNrIGFjY2VzcworICovCiAjZGVmaW5lIENGUV9JRExFX0dSQUNFCQkoSFogLyAxMCkKLSNkZWZpbmUgQ0ZRX1NMSUNFX1NDQUxFCQkoNSkKLQotI2RlZmluZSBDRlFfS0VZX0FTWU5DCQkoMCkKIAogLyoKLSAqIGZvciB0aGUgaGFzaCBvZiBjZnFxIGluc2lkZSB0aGUgY2ZxZAorICogYmVsb3cgdGhpcyB0aHJlc2hvbGQsIHdlIGNvbnNpZGVyIHRoaW5rdGltZSBpbW1lZGlhdGUKICAqLwotI2RlZmluZSBDRlFfUUhBU0hfU0hJRlQJCTYKLSNkZWZpbmUgQ0ZRX1FIQVNIX0VOVFJJRVMJKDEgPDwgQ0ZRX1FIQVNIX1NISUZUKQotI2RlZmluZSBsaXN0X2VudHJ5X3FoYXNoKGVudHJ5KQlobGlzdF9lbnRyeSgoZW50cnkpLCBzdHJ1Y3QgY2ZxX3F1ZXVlLCBjZnFfaGFzaCkKKyNkZWZpbmUgQ0ZRX01JTl9UVAkJKDIpCiAKLSNkZWZpbmUgbGlzdF9lbnRyeV9jZnFxKHB0cikJbGlzdF9lbnRyeSgocHRyKSwgc3RydWN0IGNmcV9xdWV1ZSwgY2ZxX2xpc3QpCisjZGVmaW5lIENGUV9TTElDRV9TQ0FMRQkJKDUpCiAKICNkZWZpbmUgUlFfQ0lDKHJxKQkJKChzdHJ1Y3QgY2ZxX2lvX2NvbnRleHQqKShycSktPmVsZXZhdG9yX3ByaXZhdGUpCiAjZGVmaW5lIFJRX0NGUVEocnEpCQkoKHJxKS0+ZWxldmF0b3JfcHJpdmF0ZTIpCkBAIC01NiwxNyArNTMsMjEgQEAKICNkZWZpbmUgQVNZTkMJCQkoMCkKICNkZWZpbmUgU1lOQwkJCSgxKQogCi0jZGVmaW5lIGNmcV9jZnFxX2Rpc3BhdGNoZWQoY2ZxcSkJXAotCSgoY2ZxcSktPm9uX2Rpc3BhdGNoW0FTWU5DXSArIChjZnFxKS0+b25fZGlzcGF0Y2hbU1lOQ10pCi0KLSNkZWZpbmUgY2ZxX2NmcXFfY2xhc3Nfc3luYyhjZnFxKQkoKGNmcXEpLT5rZXkgIT0gQ0ZRX0tFWV9BU1lOQykKLQotI2RlZmluZSBjZnFfY2ZxcV9zeW5jKGNmcXEpCQlcCi0JKGNmcV9jZnFxX2NsYXNzX3N5bmMoY2ZxcSkgfHwgKGNmcXEpLT5vbl9kaXNwYXRjaFtTWU5DXSkKLQogI2RlZmluZSBzYW1wbGVfdmFsaWQoc2FtcGxlcykJKChzYW1wbGVzKSA+IDgwKQogCiAvKgorICogTW9zdCBvZiBvdXIgcmJ0cmVlIHVzYWdlIGlzIGZvciBzb3J0aW5nIHdpdGggbWluIGV4dHJhY3Rpb24sIHNvCisgKiBpZiB3ZSBjYWNoZSB0aGUgbGVmdG1vc3Qgbm9kZSB3ZSBkb24ndCBoYXZlIHRvIHdhbGsgZG93biB0aGUgdHJlZQorICogdG8gZmluZCBpdC4gSWRlYSBib3Jyb3dlZCBmcm9tIEluZ28gTW9sbmFycyBDRlMgc2NoZWR1bGVyLiBXZSBzaG91bGQKKyAqIG1vdmUgdGhpcyBpbnRvIHRoZSBlbGV2YXRvciBmb3IgdGhlIHJxIHNvcnRpbmcgYXMgd2VsbC4KKyAqLworc3RydWN0IGNmcV9yYl9yb290IHsKKwlzdHJ1Y3QgcmJfcm9vdCByYjsKKwlzdHJ1Y3QgcmJfbm9kZSAqbGVmdDsKK307CisjZGVmaW5lIENGUV9SQl9ST09UCShzdHJ1Y3QgY2ZxX3JiX3Jvb3QpIHsgUkJfUk9PVCwgTlVMTCwgfQorCisvKgogICogUGVyIGJsb2NrIGRldmljZSBxdWV1ZSBzdHJ1Y3R1cmUKICAqLwogc3RydWN0IGNmcV9kYXRhIHsKQEAgLTc1LDE4ICs3NiwxMSBAQAogCS8qCiAJICogcnIgbGlzdCBvZiBxdWV1ZXMgd2l0aCByZXF1ZXN0cyBhbmQgdGhlIGNvdW50IG9mIHRoZW0KIAkgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkIHJyX2xpc3RbQ0ZRX1BSSU9fTElTVFNdOwotCXN0cnVjdCBsaXN0X2hlYWQgYnVzeV9ycjsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGN1cl9ycjsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGlkbGVfcnI7CisJc3RydWN0IGNmcV9yYl9yb290IHNlcnZpY2VfdHJlZTsKIAl1bnNpZ25lZCBpbnQgYnVzeV9xdWV1ZXM7CiAKLQkvKgotCSAqIGNmcXEgbG9va3VwIGhhc2gKLQkgKi8KLQlzdHJ1Y3QgaGxpc3RfaGVhZCAqY2ZxX2hhc2g7Ci0KIAlpbnQgcnFfaW5fZHJpdmVyOworCWludCBzeW5jX2ZsaWdodDsKIAlpbnQgaHdfdGFnOwogCiAJLyoKQEAgLTk3LDEyICs5MSwxMCBAQAogCiAJc3RydWN0IGNmcV9xdWV1ZSAqYWN0aXZlX3F1ZXVlOwogCXN0cnVjdCBjZnFfaW9fY29udGV4dCAqYWN0aXZlX2NpYzsKLQlpbnQgY3VyX3ByaW8sIGN1cl9lbmRfcHJpbzsKLQl1bnNpZ25lZCBpbnQgZGlzcGF0Y2hfc2xpY2U7CiAKIAlzdHJ1Y3QgdGltZXJfbGlzdCBpZGxlX2NsYXNzX3RpbWVyOwogCi0Jc2VjdG9yX3QgbGFzdF9zZWN0b3I7CisJc2VjdG9yX3QgbGFzdF9wb3NpdGlvbjsKIAl1bnNpZ25lZCBsb25nIGxhc3RfZW5kX3JlcXVlc3Q7CiAKIAkvKgpAQCAtMTE3LDYgKzEwOSw5IEBACiAJdW5zaWduZWQgaW50IGNmcV9zbGljZV9pZGxlOwogCiAJc3RydWN0IGxpc3RfaGVhZCBjaWNfbGlzdDsKKworCXNlY3Rvcl90IG5ld19zZWVrX21lYW47CisJdTY0IG5ld19zZWVrX3RvdGFsOwogfTsKIAogLyoKQEAgLTEyNywxMiArMTIyLDEwIEBACiAJYXRvbWljX3QgcmVmOwogCS8qIHBhcmVudCBjZnFfZGF0YSAqLwogCXN0cnVjdCBjZnFfZGF0YSAqY2ZxZDsKLQkvKiBjZnFxIGxvb2t1cCBoYXNoICovCi0Jc3RydWN0IGhsaXN0X25vZGUgY2ZxX2hhc2g7Ci0JLyogaGFzaCBrZXkgKi8KLQl1bnNpZ25lZCBpbnQga2V5OwotCS8qIG1lbWJlciBvZiB0aGUgcnIvYnVzeS9jdXIvaWRsZSBjZnFkIGxpc3QgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkIGNmcV9saXN0OworCS8qIHNlcnZpY2VfdHJlZSBtZW1iZXIgKi8KKwlzdHJ1Y3QgcmJfbm9kZSByYl9ub2RlOworCS8qIHNlcnZpY2VfdHJlZSBrZXkgKi8KKwl1bnNpZ25lZCBsb25nIHJiX2tleTsKIAkvKiBzb3J0ZWQgbGlzdCBvZiBwZW5kaW5nIHJlcXVlc3RzICovCiAJc3RydWN0IHJiX3Jvb3Qgc29ydF9saXN0OwogCS8qIGlmIGZpZm8gaXNuJ3QgZXhwaXJlZCwgbmV4dCByZXF1ZXN0IHRvIHNlcnZlICovCkBAIC0xNDcsMTEgKzE0MCwxMCBAQAogCXN0cnVjdCBsaXN0X2hlYWQgZmlmbzsKIAogCXVuc2lnbmVkIGxvbmcgc2xpY2VfZW5kOwotCXVuc2lnbmVkIGxvbmcgc2VydmljZV9sYXN0OwogCWxvbmcgc2xpY2VfcmVzaWQ7CiAKLQkvKiBudW1iZXIgb2YgcmVxdWVzdHMgdGhhdCBhcmUgb24gdGhlIGRpc3BhdGNoIGxpc3QgKi8KLQlpbnQgb25fZGlzcGF0Y2hbMl07CisJLyogbnVtYmVyIG9mIHJlcXVlc3RzIHRoYXQgYXJlIG9uIHRoZSBkaXNwYXRjaCBsaXN0IG9yIGluc2lkZSBkcml2ZXIgKi8KKwlpbnQgZGlzcGF0Y2hlZDsKIAogCS8qIGlvIHByaW8gb2YgdGhpcyBncm91cCAqLwogCXVuc2lnbmVkIHNob3J0IGlvcHJpbywgb3JnX2lvcHJpbzsKQEAgLTE1OSw2ICsxNTEsOCBAQAogCiAJLyogdmFyaW91cyBzdGF0ZSBmbGFncywgc2VlIGJlbG93ICovCiAJdW5zaWduZWQgaW50IGZsYWdzOworCisJc2VjdG9yX3QgbGFzdF9yZXF1ZXN0X3BvczsKIH07CiAKIGVudW0gY2ZxcV9zdGF0ZV9mbGFncyB7CkBAIC0xNzIsNiArMTY2LDcgQEAKIAlDRlFfQ0ZRUV9GTEFHX3ByaW9fY2hhbmdlZCwJLyogdGFzayBwcmlvcml0eSBoYXMgY2hhbmdlZCAqLwogCUNGUV9DRlFRX0ZMQUdfcXVldWVfbmV3LAkvKiBxdWV1ZSBuZXZlciBiZWVuIHNlcnZpY2VkICovCiAJQ0ZRX0NGUVFfRkxBR19zbGljZV9uZXcsCS8qIG5vIHJlcXVlc3RzIGRpc3BhdGNoZWQgaW4gc2xpY2UgKi8KKwlDRlFfQ0ZRUV9GTEFHX3N5bmMsCQkvKiBzeW5jaHJvbm91cyBxdWV1ZSAqLwogfTsKIAogI2RlZmluZSBDRlFfQ0ZRUV9GTlMobmFtZSkJCQkJCQlcCkBAIC0xOTgsMTEgKzE5MywzOCBAQAogQ0ZRX0NGUVFfRk5TKHByaW9fY2hhbmdlZCk7CiBDRlFfQ0ZRUV9GTlMocXVldWVfbmV3KTsKIENGUV9DRlFRX0ZOUyhzbGljZV9uZXcpOworQ0ZRX0NGUVFfRk5TKHN5bmMpOwogI3VuZGVmIENGUV9DRlFRX0ZOUwogCi1zdGF0aWMgc3RydWN0IGNmcV9xdWV1ZSAqY2ZxX2ZpbmRfY2ZxX2hhc2goc3RydWN0IGNmcV9kYXRhICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgc2hvcnQpOwogc3RhdGljIHZvaWQgY2ZxX2Rpc3BhdGNoX2luc2VydChyZXF1ZXN0X3F1ZXVlX3QgKiwgc3RydWN0IHJlcXVlc3QgKik7Ci1zdGF0aWMgc3RydWN0IGNmcV9xdWV1ZSAqY2ZxX2dldF9xdWV1ZShzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQsIHVuc2lnbmVkIGludCBrZXksIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBnZnBfdCBnZnBfbWFzayk7CitzdGF0aWMgc3RydWN0IGNmcV9xdWV1ZSAqY2ZxX2dldF9xdWV1ZShzdHJ1Y3QgY2ZxX2RhdGEgKiwgaW50LAorCQkJCSAgICAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKiwgZ2ZwX3QpOworc3RhdGljIHN0cnVjdCBjZnFfaW9fY29udGV4dCAqY2ZxX2NpY19yYl9sb29rdXAoc3RydWN0IGNmcV9kYXRhICosCisJCQkJCQlzdHJ1Y3QgaW9fY29udGV4dCAqKTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgY2ZxX3F1ZXVlICpjaWNfdG9fY2ZxcShzdHJ1Y3QgY2ZxX2lvX2NvbnRleHQgKmNpYywKKwkJCQkJICAgIGludCBpc19zeW5jKQoreworCXJldHVybiBjaWMtPmNmcXFbISFpc19zeW5jXTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNpY19zZXRfY2ZxcShzdHJ1Y3QgY2ZxX2lvX2NvbnRleHQgKmNpYywKKwkJCQlzdHJ1Y3QgY2ZxX3F1ZXVlICpjZnFxLCBpbnQgaXNfc3luYykKK3sKKwljaWMtPmNmcXFbISFpc19zeW5jXSA9IGNmcXE7Cit9CisKKy8qCisgKiBXZSByZWdhcmQgYSByZXF1ZXN0IGFzIFNZTkMsIGlmIGl0J3MgZWl0aGVyIGEgcmVhZCBvciBoYXMgdGhlIFNZTkMgYml0CisgKiBzZXQgKGluIHdoaWNoIGNhc2UgaXQgY291bGQgYWxzbyBiZSBkaXJlY3QgV1JJVEUpLgorICovCitzdGF0aWMgaW5saW5lIGludCBjZnFfYmlvX3N5bmMoc3RydWN0IGJpbyAqYmlvKQoreworCWlmIChiaW9fZGF0YV9kaXIoYmlvKSA9PSBSRUFEIHx8IGJpb19zeW5jKGJpbykpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CiAKIC8qCiAgKiBzY2hlZHVsZXIgcnVuIG9mIHF1ZXVlLCBpZiB0aGVyZSBhcmUgcmVxdWVzdHMgcGVuZGluZyBhbmQgbm8gb25lIGluIHRoZQpAQCAtMjIxLDQ0ICsyNDMsMzEgQEAKIAlyZXR1cm4gIWNmcWQtPmJ1c3lfcXVldWVzOwogfQogCi1zdGF0aWMgaW5saW5lIHBpZF90IGNmcV9xdWV1ZV9waWQoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBpbnQgcncsIGludCBpc19zeW5jKQotewotCS8qCi0JICogVXNlIHRoZSBwZXItcHJvY2VzcyBxdWV1ZSwgZm9yIHJlYWQgcmVxdWVzdHMgYW5kIHN5bmNyb25vdXMgd3JpdGVzCi0JICovCi0JaWYgKCEocncgJiBSRVFfUlcpIHx8IGlzX3N5bmMpCi0JCXJldHVybiB0YXNrLT5waWQ7Ci0KLQlyZXR1cm4gQ0ZRX0tFWV9BU1lOQzsKLX0KLQogLyoKICAqIFNjYWxlIHNjaGVkdWxlIHNsaWNlIGJhc2VkIG9uIGlvIHByaW9yaXR5LiBVc2UgdGhlIHN5bmMgdGltZSBzbGljZSBvbmx5CiAgKiBpZiBhIHF1ZXVlIGlzIG1hcmtlZCBzeW5jIGFuZCBoYXMgc3luYyBpbyBxdWV1ZWQuIEEgc3luYyBxdWV1ZSB3aXRoIGFzeW5jCiAgKiBpbyBvbmx5LCBzaG91bGQgbm90IGdldCBmdWxsIHN5bmMgc2xpY2UgbGVuZ3RoLgogICovCitzdGF0aWMgaW5saW5lIGludCBjZnFfcHJpb19zbGljZShzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQsIGludCBzeW5jLAorCQkJCSB1bnNpZ25lZCBzaG9ydCBwcmlvKQoreworCWNvbnN0IGludCBiYXNlX3NsaWNlID0gY2ZxZC0+Y2ZxX3NsaWNlW3N5bmNdOworCisJV0FSTl9PTihwcmlvID49IElPUFJJT19CRV9OUik7CisKKwlyZXR1cm4gYmFzZV9zbGljZSArIChiYXNlX3NsaWNlL0NGUV9TTElDRV9TQ0FMRSAqICg0IC0gcHJpbykpOworfQorCiBzdGF0aWMgaW5saW5lIGludAogY2ZxX3ByaW9fdG9fc2xpY2Uoc3RydWN0IGNmcV9kYXRhICpjZnFkLCBzdHJ1Y3QgY2ZxX3F1ZXVlICpjZnFxKQogewotCWNvbnN0IGludCBiYXNlX3NsaWNlID0gY2ZxZC0+Y2ZxX3NsaWNlW2NmcV9jZnFxX3N5bmMoY2ZxcSldOwotCi0JV0FSTl9PTihjZnFxLT5pb3ByaW8gPj0gSU9QUklPX0JFX05SKTsKLQotCXJldHVybiBiYXNlX3NsaWNlICsgKGJhc2Vfc2xpY2UvQ0ZRX1NMSUNFX1NDQUxFICogKDQgLSBjZnFxLT5pb3ByaW8pKTsKKwlyZXR1cm4gY2ZxX3ByaW9fc2xpY2UoY2ZxZCwgY2ZxX2NmcXFfc3luYyhjZnFxKSwgY2ZxcS0+aW9wcmlvKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkCiBjZnFfc2V0X3ByaW9fc2xpY2Uoc3RydWN0IGNmcV9kYXRhICpjZnFkLCBzdHJ1Y3QgY2ZxX3F1ZXVlICpjZnFxKQogewogCWNmcXEtPnNsaWNlX2VuZCA9IGNmcV9wcmlvX3RvX3NsaWNlKGNmcWQsIGNmcXEpICsgamlmZmllczsKLQljZnFxLT5zbGljZV9lbmQgKz0gY2ZxcS0+c2xpY2VfcmVzaWQ7Ci0KLQkvKgotCSAqIERvbid0IGNhcnJ5IG92ZXIgcmVzaWR1YWwgZm9yIG1vcmUgdGhhbiBvbmUgc2xpY2UsIHdlIG9ubHkgd2FudAotCSAqIHRvIHNsaWdodGx5IGNvcnJlY3QgdGhlIGZhaXJuZXNzLiBDYXJyeWluZyBvdmVyIGZvcmV2ZXIgd291bGQKLQkgKiBlYXNpbHkgaW50cm9kdWNlIG9zY2lsbGF0aW9ucy4KLQkgKi8KLQljZnFxLT5zbGljZV9yZXNpZCA9IDA7CiB9CiAKIC8qCkBAIC0zMDcsNyArMzE2LDcgQEAKIAlzMSA9IHJxMS0+c2VjdG9yOwogCXMyID0gcnEyLT5zZWN0b3I7CiAKLQlsYXN0ID0gY2ZxZC0+bGFzdF9zZWN0b3I7CisJbGFzdCA9IGNmcWQtPmxhc3RfcG9zaXRpb247CiAKIAkvKgogCSAqIGJ5IGRlZmluaXRpb24sIDFLaUIgaXMgMiBzZWN0b3JzCkBAIC0zNzIsNiArMzgxLDI2IEBACiB9CiAKIC8qCisgKiBUaGUgYmVsb3cgaXMgbGVmdG1vc3QgY2FjaGUgcmJ0cmVlIGFkZG9uCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcmJfbm9kZSAqY2ZxX3JiX2ZpcnN0KHN0cnVjdCBjZnFfcmJfcm9vdCAqcm9vdCkKK3sKKwlpZiAoIXJvb3QtPmxlZnQpCisJCXJvb3QtPmxlZnQgPSByYl9maXJzdCgmcm9vdC0+cmIpOworCisJcmV0dXJuIHJvb3QtPmxlZnQ7Cit9CisKK3N0YXRpYyB2b2lkIGNmcV9yYl9lcmFzZShzdHJ1Y3QgcmJfbm9kZSAqbiwgc3RydWN0IGNmcV9yYl9yb290ICpyb290KQoreworCWlmIChyb290LT5sZWZ0ID09IG4pCisJCXJvb3QtPmxlZnQgPSBOVUxMOworCisJcmJfZXJhc2UobiwgJnJvb3QtPnJiKTsKKwlSQl9DTEVBUl9OT0RFKG4pOworfQorCisvKgogICogd291bGQgYmUgbmljZSB0byB0YWtlIGZpZm8gZXhwaXJlIHRpbWUgaW50byBhY2NvdW50IGFzIHdlbGwKICAqLwogc3RhdGljIHN0cnVjdCByZXF1ZXN0ICoKQEAgLTM5OCw3OCArNDI3LDk2IEBACiAJcmV0dXJuIGNmcV9jaG9vc2VfcmVxKGNmcWQsIG5leHQsIHByZXYpOwogfQogCi1zdGF0aWMgdm9pZCBjZnFfcmVzb3J0X3JyX2xpc3Qoc3RydWN0IGNmcV9xdWV1ZSAqY2ZxcSwgaW50IHByZWVtcHRlZCkKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGNmcV9zbGljZV9vZmZzZXQoc3RydWN0IGNmcV9kYXRhICpjZnFkLAorCQkJCSAgICAgIHN0cnVjdCBjZnFfcXVldWUgKmNmcXEpCiB7Ci0Jc3RydWN0IGNmcV9kYXRhICpjZnFkID0gY2ZxcS0+Y2ZxZDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCAqbjsKLQlzdHJ1Y3QgY2ZxX3F1ZXVlICpfX2NmcXE7CisJLyoKKwkgKiBqdXN0IGFuIGFwcHJveGltYXRpb24sIHNob3VsZCBiZSBvay4KKwkgKi8KKwlyZXR1cm4gKGNmcWQtPmJ1c3lfcXVldWVzIC0gMSkgKiAoY2ZxX3ByaW9fc2xpY2UoY2ZxZCwgMSwgMCkgLQorCQkgICAgICAgY2ZxX3ByaW9fc2xpY2UoY2ZxZCwgY2ZxX2NmcXFfc3luYyhjZnFxKSwgY2ZxcS0+aW9wcmlvKSk7Cit9CiAKKy8qCisgKiBUaGUgY2ZxZC0+c2VydmljZV90cmVlIGhvbGRzIGFsbCBwZW5kaW5nIGNmcV9xdWV1ZSdzIHRoYXQgaGF2ZQorICogcmVxdWVzdHMgd2FpdGluZyB0byBiZSBwcm9jZXNzZWQuIEl0IGlzIHNvcnRlZCBpbiB0aGUgb3JkZXIgdGhhdAorICogd2Ugd2lsbCBzZXJ2aWNlIHRoZSBxdWV1ZXMuCisgKi8KK3N0YXRpYyB2b2lkIGNmcV9zZXJ2aWNlX3RyZWVfYWRkKHN0cnVjdCBjZnFfZGF0YSAqY2ZxZCwKKwkJCQkgICAgc3RydWN0IGNmcV9xdWV1ZSAqY2ZxcSwgaW50IGFkZF9mcm9udCkKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqKnAgPSAmY2ZxZC0+c2VydmljZV90cmVlLnJiLnJiX25vZGU7CisJc3RydWN0IHJiX25vZGUgKnBhcmVudCA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyByYl9rZXk7CisJaW50IGxlZnQ7CisKKwlpZiAoIWFkZF9mcm9udCkgeworCQlyYl9rZXkgPSBjZnFfc2xpY2Vfb2Zmc2V0KGNmcWQsIGNmcXEpICsgamlmZmllczsKKwkJcmJfa2V5ICs9IGNmcXEtPnNsaWNlX3Jlc2lkOworCQljZnFxLT5zbGljZV9yZXNpZCA9IDA7CisJfSBlbHNlCisJCXJiX2tleSA9IDA7CisKKwlpZiAoIVJCX0VNUFRZX05PREUoJmNmcXEtPnJiX25vZGUpKSB7CisJCS8qCisJCSAqIHNhbWUgcG9zaXRpb24sIG5vdGhpbmcgbW9yZSB0byBkbworCQkgKi8KKwkJaWYgKHJiX2tleSA9PSBjZnFxLT5yYl9rZXkpCisJCQlyZXR1cm47CisKKwkJY2ZxX3JiX2VyYXNlKCZjZnFxLT5yYl9ub2RlLCAmY2ZxZC0+c2VydmljZV90cmVlKTsKKwl9CisKKwlsZWZ0ID0gMTsKKwl3aGlsZSAoKnApIHsKKwkJc3RydWN0IGNmcV9xdWV1ZSAqX19jZnFxOworCQlzdHJ1Y3QgcmJfbm9kZSAqKm47CisKKwkJcGFyZW50ID0gKnA7CisJCV9fY2ZxcSA9IHJiX2VudHJ5KHBhcmVudCwgc3RydWN0IGNmcV9xdWV1ZSwgcmJfbm9kZSk7CisKKwkJLyoKKwkJICogc29ydCBSVCBxdWV1ZXMgZmlyc3QsIHdlIGFsd2F5cyB3YW50IHRvIGdpdmUKKwkJICogcHJlZmVyZW5jZSB0byB0aGVtLiBJRExFIHF1ZXVlcyBnb2VzIHRvIHRoZSBiYWNrLgorCQkgKiBhZnRlciB0aGF0LCBzb3J0IG9uIHRoZSBuZXh0IHNlcnZpY2UgdGltZS4KKwkJICovCisJCWlmIChjZnFfY2xhc3NfcnQoY2ZxcSkgPiBjZnFfY2xhc3NfcnQoX19jZnFxKSkKKwkJCW4gPSAmKCpwKS0+cmJfbGVmdDsKKwkJZWxzZSBpZiAoY2ZxX2NsYXNzX3J0KGNmcXEpIDwgY2ZxX2NsYXNzX3J0KF9fY2ZxcSkpCisJCQluID0gJigqcCktPnJiX3JpZ2h0OworCQllbHNlIGlmIChjZnFfY2xhc3NfaWRsZShjZnFxKSA8IGNmcV9jbGFzc19pZGxlKF9fY2ZxcSkpCisJCQluID0gJigqcCktPnJiX2xlZnQ7CisJCWVsc2UgaWYgKGNmcV9jbGFzc19pZGxlKGNmcXEpID4gY2ZxX2NsYXNzX2lkbGUoX19jZnFxKSkKKwkJCW4gPSAmKCpwKS0+cmJfcmlnaHQ7CisJCWVsc2UgaWYgKHJiX2tleSA8IF9fY2ZxcS0+cmJfa2V5KQorCQkJbiA9ICYoKnApLT5yYl9sZWZ0OworCQllbHNlCisJCQluID0gJigqcCktPnJiX3JpZ2h0OworCisJCWlmIChuID09ICYoKnApLT5yYl9yaWdodCkKKwkJCWxlZnQgPSAwOworCisJCXAgPSBuOworCX0KKworCWlmIChsZWZ0KQorCQljZnFkLT5zZXJ2aWNlX3RyZWUubGVmdCA9ICZjZnFxLT5yYl9ub2RlOworCisJY2ZxcS0+cmJfa2V5ID0gcmJfa2V5OworCXJiX2xpbmtfbm9kZSgmY2ZxcS0+cmJfbm9kZSwgcGFyZW50LCBwKTsKKwlyYl9pbnNlcnRfY29sb3IoJmNmcXEtPnJiX25vZGUsICZjZnFkLT5zZXJ2aWNlX3RyZWUucmIpOworfQorCisvKgorICogVXBkYXRlIGNmcXEncyBwb3NpdGlvbiBpbiB0aGUgc2VydmljZSB0cmVlLgorICovCitzdGF0aWMgdm9pZCBjZnFfcmVzb3J0X3JyX2xpc3Qoc3RydWN0IGNmcV9kYXRhICpjZnFkLCBzdHJ1Y3QgY2ZxX3F1ZXVlICpjZnFxKQorewogCS8qCiAJICogUmVzb3J0aW5nIHJlcXVpcmVzIHRoZSBjZnFxIHRvIGJlIG9uIHRoZSBSUiBsaXN0IGFscmVhZHkuCiAJICovCi0JaWYgKCFjZnFfY2ZxcV9vbl9ycihjZnFxKSkKLQkJcmV0dXJuOwotCi0JbGlzdF9kZWwoJmNmcXEtPmNmcV9saXN0KTsKLQotCWlmIChjZnFfY2xhc3NfcnQoY2ZxcSkpCi0JCWxpc3QgPSAmY2ZxZC0+Y3VyX3JyOwotCWVsc2UgaWYgKGNmcV9jbGFzc19pZGxlKGNmcXEpKQotCQlsaXN0ID0gJmNmcWQtPmlkbGVfcnI7Ci0JZWxzZSB7Ci0JCS8qCi0JCSAqIGlmIGNmcXEgaGFzIHJlcXVlc3RzIGluIGZsaWdodCwgZG9uJ3QgYWxsb3cgaXQgdG8gYmUKLQkJICogZm91bmQgaW4gY2ZxX3NldF9hY3RpdmVfcXVldWUgYmVmb3JlIGl0IGhhcyBmaW5pc2hlZCB0aGVtLgotCQkgKiB0aGlzIGlzIGRvbmUgdG8gaW5jcmVhc2UgZmFpcm5lc3MgYmV0d2VlbiBhIHByb2Nlc3MgdGhhdAotCQkgKiBoYXMgbG90cyBvZiBpbyBwZW5kaW5nIHZzIG9uZSB0aGF0IG9ubHkgZ2VuZXJhdGVzIG9uZQotCQkgKiBzcG9yYWRpY2FsbHkgb3Igc3luY2hyb25vdXNseQotCQkgKi8KLQkJaWYgKGNmcV9jZnFxX2Rpc3BhdGNoZWQoY2ZxcSkpCi0JCQlsaXN0ID0gJmNmcWQtPmJ1c3lfcnI7Ci0JCWVsc2UKLQkJCWxpc3QgPSAmY2ZxZC0+cnJfbGlzdFtjZnFxLT5pb3ByaW9dOwotCX0KLQotCWlmIChwcmVlbXB0ZWQgfHwgY2ZxX2NmcXFfcXVldWVfbmV3KGNmcXEpKSB7Ci0JCS8qCi0JCSAqIElmIHRoaXMgcXVldWUgd2FzIHByZWVtcHRlZCBvciBpcyBuZXcgKG5ldmVyIGJlZW4gc2VydmljZWQpLAotCQkgKiBsZXQgaXQgYmUgYWRkZWQgZmlyc3QgZm9yIGZhaXJuZXNzIGJ1dCBiZWluZCBvdGhlciBuZXcKLQkJICogcXVldWVzLgotCQkgKi8KLQkJbiA9IGxpc3Q7Ci0JCXdoaWxlIChuLT5uZXh0ICE9IGxpc3QpIHsKLQkJCV9fY2ZxcSA9IGxpc3RfZW50cnlfY2ZxcShuLT5uZXh0KTsKLQkJCWlmICghY2ZxX2NmcXFfcXVldWVfbmV3KF9fY2ZxcSkpCi0JCQkJYnJlYWs7Ci0KLQkJCW4gPSBuLT5uZXh0OwotCQl9Ci0JCWxpc3RfYWRkX3RhaWwoJmNmcXEtPmNmcV9saXN0LCBuKTsKLQl9IGVsc2UgaWYgKCFjZnFfY2ZxcV9jbGFzc19zeW5jKGNmcXEpKSB7Ci0JCS8qCi0JCSAqIGFzeW5jIHF1ZXVlIGFsd2F5cyBnb2VzIHRvIHRoZSBlbmQuIHRoaXMgd29udCBiZSBvdmVybHkKLQkJICogdW5mYWlyIHRvIHdyaXRlcywgYXMgdGhlIHNvcnQgb2YgdGhlIHN5bmMgcXVldWUgd29udCBiZQotCQkgKiBhbGxvd2VkIHRvIHBhc3MgdGhlIGFzeW5jIHF1ZXVlIGFnYWluLgotCQkgKi8KLQkJbGlzdF9hZGRfdGFpbCgmY2ZxcS0+Y2ZxX2xpc3QsIGxpc3QpOwotCX0gZWxzZSB7Ci0JCS8qCi0JCSAqIHNvcnQgYnkgbGFzdCBzZXJ2aWNlLCBidXQgZG9uJ3QgY3Jvc3MgYSBuZXcgb3IgYXN5bmMKLQkJICogcXVldWUuIHdlIGRvbid0IGNyb3NzIGEgbmV3IHF1ZXVlIGJlY2F1c2UgaXQgaGFzbid0IGJlZW4KLQkJICogc2VydmljZSBiZWZvcmUsIGFuZCB3ZSBkb24ndCBjcm9zcyBhbiBhc3luYyBxdWV1ZSBiZWNhdXNlCi0JCSAqIGl0IGdldHMgYWRkZWQgdG8gdGhlIGVuZCBvbiBleHBpcmUuCi0JCSAqLwotCQluID0gbGlzdDsKLQkJd2hpbGUgKChuID0gbi0+cHJldikgIT0gbGlzdCkgewotCQkJc3RydWN0IGNmcV9xdWV1ZSAqX19jZnFxID0gbGlzdF9lbnRyeV9jZnFxKG4pOwotCi0JCQlpZiAoIWNmcV9jZnFxX2NsYXNzX3N5bmMoY2ZxcSkgfHwgIV9fY2ZxcS0+c2VydmljZV9sYXN0KQotCQkJCWJyZWFrOwotCQkJaWYgKHRpbWVfYmVmb3JlKF9fY2ZxcS0+c2VydmljZV9sYXN0LCBjZnFxLT5zZXJ2aWNlX2xhc3QpKQotCQkJCWJyZWFrOwotCQl9Ci0JCWxpc3RfYWRkKCZjZnFxLT5jZnFfbGlzdCwgbik7Ci0JfQorCWlmIChjZnFfY2ZxcV9vbl9ycihjZnFxKSkKKwkJY2ZxX3NlcnZpY2VfdHJlZV9hZGQoY2ZxZCwgY2ZxcSwgMCk7CiB9CiAKIC8qCkBAIC00ODMsMTUgKzUzMCwyMSBAQAogCWNmcV9tYXJrX2NmcXFfb25fcnIoY2ZxcSk7CiAJY2ZxZC0+YnVzeV9xdWV1ZXMrKzsKIAotCWNmcV9yZXNvcnRfcnJfbGlzdChjZnFxLCAwKTsKKwljZnFfcmVzb3J0X3JyX2xpc3QoY2ZxZCwgY2ZxcSk7CiB9CiAKKy8qCisgKiBDYWxsZWQgd2hlbiB0aGUgY2ZxcSBubyBsb25nZXIgaGFzIHJlcXVlc3RzIHBlbmRpbmcsIHJlbW92ZSBpdCBmcm9tCisgKiB0aGUgc2VydmljZSB0cmVlLgorICovCiBzdGF0aWMgaW5saW5lIHZvaWQKIGNmcV9kZWxfY2ZxcV9ycihzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQsIHN0cnVjdCBjZnFfcXVldWUgKmNmcXEpCiB7CiAJQlVHX09OKCFjZnFfY2ZxcV9vbl9ycihjZnFxKSk7CiAJY2ZxX2NsZWFyX2NmcXFfb25fcnIoY2ZxcSk7Ci0JbGlzdF9kZWxfaW5pdCgmY2ZxcS0+Y2ZxX2xpc3QpOworCisJaWYgKCFSQl9FTVBUWV9OT0RFKCZjZnFxLT5yYl9ub2RlKSkKKwkJY2ZxX3JiX2VyYXNlKCZjZnFxLT5yYl9ub2RlLCAmY2ZxZC0+c2VydmljZV90cmVlKTsKIAogCUJVR19PTighY2ZxZC0+YnVzeV9xdWV1ZXMpOwogCWNmcWQtPmJ1c3lfcXVldWVzLS07CkBAIC01NTIsMTAgKzYwNSwxNCBAQAogY2ZxX2ZpbmRfcnFfZm1lcmdlKHN0cnVjdCBjZnFfZGF0YSAqY2ZxZCwgc3RydWN0IGJpbyAqYmlvKQogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gY3VycmVudDsKLQlwaWRfdCBrZXkgPSBjZnFfcXVldWVfcGlkKHRzaywgYmlvX2RhdGFfZGlyKGJpbyksIGJpb19zeW5jKGJpbykpOworCXN0cnVjdCBjZnFfaW9fY29udGV4dCAqY2ljOwogCXN0cnVjdCBjZnFfcXVldWUgKmNmcXE7CiAKLQljZnFxID0gY2ZxX2ZpbmRfY2ZxX2hhc2goY2ZxZCwga2V5LCB0c2stPmlvcHJpbyk7CisJY2ljID0gY2ZxX2NpY19yYl9sb29rdXAoY2ZxZCwgdHNrLT5pb19jb250ZXh0KTsKKwlpZiAoIWNpYykKKwkJcmV0dXJuIE5VTEw7CisKKwljZnFxID0gY2ljX3RvX2NmcXEoY2ljLCBjZnFfYmlvX3N5bmMoYmlvKSk7CiAJaWYgKGNmcXEpIHsKIAkJc2VjdG9yX3Qgc2VjdG9yID0gYmlvLT5iaV9zZWN0b3IgKyBiaW9fc2VjdG9ycyhiaW8pOwogCkBAIC01NzksNiArNjM2LDggQEAKIAkgKi8KIAlpZiAoIWNmcWQtPmh3X3RhZyAmJiBjZnFkLT5ycV9pbl9kcml2ZXIgPiA0KQogCQljZnFkLT5od190YWcgPSAxOworCisJY2ZxZC0+bGFzdF9wb3NpdGlvbiA9IHJxLT5oYXJkX3NlY3RvciArIHJxLT5oYXJkX25yX3NlY3RvcnM7CiB9CiAKIHN0YXRpYyB2b2lkIGNmcV9kZWFjdGl2YXRlX3JlcXVlc3QocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCkBAIC02MDUsOCArNjY0LDcgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbnQKLWNmcV9tZXJnZShyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCByZXF1ZXN0ICoqcmVxLCBzdHJ1Y3QgYmlvICpiaW8pCitzdGF0aWMgaW50IGNmcV9tZXJnZShyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCByZXF1ZXN0ICoqcmVxLCBzdHJ1Y3QgYmlvICpiaW8pCiB7CiAJc3RydWN0IGNmcV9kYXRhICpjZnFkID0gcS0+ZWxldmF0b3ItPmVsZXZhdG9yX2RhdGE7CiAJc3RydWN0IHJlcXVlc3QgKl9fcnE7CkBAIC02NDgsMjMgKzcwNiwyNCBAQAogCQkJICAgc3RydWN0IGJpbyAqYmlvKQogewogCXN0cnVjdCBjZnFfZGF0YSAqY2ZxZCA9IHEtPmVsZXZhdG9yLT5lbGV2YXRvcl9kYXRhOwotCWNvbnN0IGludCBydyA9IGJpb19kYXRhX2RpcihiaW8pOworCXN0cnVjdCBjZnFfaW9fY29udGV4dCAqY2ljOwogCXN0cnVjdCBjZnFfcXVldWUgKmNmcXE7Ci0JcGlkX3Qga2V5OwogCiAJLyoKIAkgKiBEaXNhbGxvdyBtZXJnZSBvZiBhIHN5bmMgYmlvIGludG8gYW4gYXN5bmMgcmVxdWVzdC4KIAkgKi8KLQlpZiAoKGJpb19kYXRhX2RpcihiaW8pID09IFJFQUQgfHwgYmlvX3N5bmMoYmlvKSkgJiYgIXJxX2lzX3N5bmMocnEpKQorCWlmIChjZnFfYmlvX3N5bmMoYmlvKSAmJiAhcnFfaXNfc3luYyhycSkpCiAJCXJldHVybiAwOwogCiAJLyoKIAkgKiBMb29rdXAgdGhlIGNmcXEgdGhhdCB0aGlzIGJpbyB3aWxsIGJlIHF1ZXVlZCB3aXRoLiBBbGxvdwogCSAqIG1lcmdlIG9ubHkgaWYgcnEgaXMgcXVldWVkIHRoZXJlLgogCSAqLwotCWtleSA9IGNmcV9xdWV1ZV9waWQoY3VycmVudCwgcncsIGJpb19zeW5jKGJpbykpOwotCWNmcXEgPSBjZnFfZmluZF9jZnFfaGFzaChjZnFkLCBrZXksIGN1cnJlbnQtPmlvcHJpbyk7CisJY2ljID0gY2ZxX2NpY19yYl9sb29rdXAoY2ZxZCwgY3VycmVudC0+aW9fY29udGV4dCk7CisJaWYgKCFjaWMpCisJCXJldHVybiAwOwogCisJY2ZxcSA9IGNpY190b19jZnFxKGNpYywgY2ZxX2Jpb19zeW5jKGJpbykpOwogCWlmIChjZnFxID09IFJRX0NGUVEocnEpKQogCQlyZXR1cm4gMTsKIApAQCAtNjg0LDYgKzc0Myw3IEBACiAJCWNmcV9jbGVhcl9jZnFxX211c3RfYWxsb2Nfc2xpY2UoY2ZxcSk7CiAJCWNmcV9jbGVhcl9jZnFxX2ZpZm9fZXhwaXJlKGNmcXEpOwogCQljZnFfbWFya19jZnFxX3NsaWNlX25ldyhjZnFxKTsKKwkJY2ZxX2NsZWFyX2NmcXFfcXVldWVfbmV3KGNmcXEpOwogCX0KIAogCWNmcWQtPmFjdGl2ZV9xdWV1ZSA9IGNmcXE7CkBAIC02OTQsMjMgKzc1NCwyMSBAQAogICovCiBzdGF0aWMgdm9pZAogX19jZnFfc2xpY2VfZXhwaXJlZChzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQsIHN0cnVjdCBjZnFfcXVldWUgKmNmcXEsCi0JCSAgICBpbnQgcHJlZW1wdGVkLCBpbnQgdGltZWRfb3V0KQorCQkgICAgaW50IHRpbWVkX291dCkKIHsKIAlpZiAoY2ZxX2NmcXFfd2FpdF9yZXF1ZXN0KGNmcXEpKQogCQlkZWxfdGltZXIoJmNmcWQtPmlkbGVfc2xpY2VfdGltZXIpOwogCiAJY2ZxX2NsZWFyX2NmcXFfbXVzdF9kaXNwYXRjaChjZnFxKTsKIAljZnFfY2xlYXJfY2ZxcV93YWl0X3JlcXVlc3QoY2ZxcSk7Ci0JY2ZxX2NsZWFyX2NmcXFfcXVldWVfbmV3KGNmcXEpOwogCiAJLyoKLQkgKiBzdG9yZSB3aGF0IHdhcyBsZWZ0IG9mIHRoaXMgc2xpY2UsIGlmIHRoZSBxdWV1ZSBpZGxlZCBvdXQKLQkgKiBvciB3YXMgcHJlZW1wdGVkCisJICogc3RvcmUgd2hhdCB3YXMgbGVmdCBvZiB0aGlzIHNsaWNlLCBpZiB0aGUgcXVldWUgaWRsZWQvdGltZWQgb3V0CiAJICovCiAJaWYgKHRpbWVkX291dCAmJiAhY2ZxX2NmcXFfc2xpY2VfbmV3KGNmcXEpKQogCQljZnFxLT5zbGljZV9yZXNpZCA9IGNmcXEtPnNsaWNlX2VuZCAtIGppZmZpZXM7CiAKLQljZnFfcmVzb3J0X3JyX2xpc3QoY2ZxcSwgcHJlZW1wdGVkKTsKKwljZnFfcmVzb3J0X3JyX2xpc3QoY2ZxZCwgY2ZxcSk7CiAKIAlpZiAoY2ZxcSA9PSBjZnFkLT5hY3RpdmVfcXVldWUpCiAJCWNmcWQtPmFjdGl2ZV9xdWV1ZSA9IE5VTEw7CkBAIC03MTksMTYzICs3NzcsMTUyIEBACiAJCXB1dF9pb19jb250ZXh0KGNmcWQtPmFjdGl2ZV9jaWMtPmlvYyk7CiAJCWNmcWQtPmFjdGl2ZV9jaWMgPSBOVUxMOwogCX0KLQotCWNmcWQtPmRpc3BhdGNoX3NsaWNlID0gMDsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGNmcV9zbGljZV9leHBpcmVkKHN0cnVjdCBjZnFfZGF0YSAqY2ZxZCwgaW50IHByZWVtcHRlZCwKLQkJCQkgICAgIGludCB0aW1lZF9vdXQpCitzdGF0aWMgaW5saW5lIHZvaWQgY2ZxX3NsaWNlX2V4cGlyZWQoc3RydWN0IGNmcV9kYXRhICpjZnFkLCBpbnQgdGltZWRfb3V0KQogewogCXN0cnVjdCBjZnFfcXVldWUgKmNmcXEgPSBjZnFkLT5hY3RpdmVfcXVldWU7CiAKIAlpZiAoY2ZxcSkKLQkJX19jZnFfc2xpY2VfZXhwaXJlZChjZnFkLCBjZnFxLCBwcmVlbXB0ZWQsIHRpbWVkX291dCk7CisJCV9fY2ZxX3NsaWNlX2V4cGlyZWQoY2ZxZCwgY2ZxcSwgdGltZWRfb3V0KTsKIH0KIAogLyoKLSAqIDAKLSAqIDAsMQotICogMCwxLDIKLSAqIDAsMSwyLDMKLSAqIDAsMSwyLDMsNAotICogMCwxLDIsMyw0LDUKLSAqIDAsMSwyLDMsNCw1LDYKLSAqIDAsMSwyLDMsNCw1LDYsNworICogR2V0IG5leHQgcXVldWUgZm9yIHNlcnZpY2UuIFVubGVzcyB3ZSBoYXZlIGEgcXVldWUgcHJlZW1wdGlvbiwKKyAqIHdlJ2xsIHNpbXBseSBzZWxlY3QgdGhlIGZpcnN0IGNmcXEgaW4gdGhlIHNlcnZpY2UgdHJlZS4KICAqLwotc3RhdGljIGludCBjZnFfZ2V0X25leHRfcHJpb19sZXZlbChzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQpCitzdGF0aWMgc3RydWN0IGNmcV9xdWV1ZSAqY2ZxX2dldF9uZXh0X3F1ZXVlKHN0cnVjdCBjZnFfZGF0YSAqY2ZxZCkKIHsKLQlpbnQgcHJpbywgd3JhcDsKKwlzdHJ1Y3QgY2ZxX3F1ZXVlICpjZnFxOworCXN0cnVjdCByYl9ub2RlICpuOwogCi0JcHJpbyA9IC0xOwotCXdyYXAgPSAwOwotCWRvIHsKLQkJaW50IHA7CisJaWYgKFJCX0VNUFRZX1JPT1QoJmNmcWQtPnNlcnZpY2VfdHJlZS5yYikpCisJCXJldHVybiBOVUxMOwogCi0JCWZvciAocCA9IGNmcWQtPmN1cl9wcmlvOyBwIDw9IGNmcWQtPmN1cl9lbmRfcHJpbzsgcCsrKSB7Ci0JCQlpZiAoIWxpc3RfZW1wdHkoJmNmcWQtPnJyX2xpc3RbcF0pKSB7Ci0JCQkJcHJpbyA9IHA7Ci0JCQkJYnJlYWs7Ci0JCQl9CisJbiA9IGNmcV9yYl9maXJzdCgmY2ZxZC0+c2VydmljZV90cmVlKTsKKwljZnFxID0gcmJfZW50cnkobiwgc3RydWN0IGNmcV9xdWV1ZSwgcmJfbm9kZSk7CisKKwlpZiAoY2ZxX2NsYXNzX2lkbGUoY2ZxcSkpIHsKKwkJdW5zaWduZWQgbG9uZyBlbmQ7CisKKwkJLyoKKwkJICogaWYgd2UgaGF2ZSBpZGxlIHF1ZXVlcyBhbmQgbm8gcnQgb3IgYmUgcXVldWVzIGhhZAorCQkgKiBwZW5kaW5nIHJlcXVlc3RzLCBlaXRoZXIgYWxsb3cgaW1tZWRpYXRlIHNlcnZpY2UgaWYKKwkJICogdGhlIGdyYWNlIHBlcmlvZCBoYXMgcGFzc2VkIG9yIGFybSB0aGUgaWRsZSBncmFjZQorCQkgKiB0aW1lcgorCQkgKi8KKwkJZW5kID0gY2ZxZC0+bGFzdF9lbmRfcmVxdWVzdCArIENGUV9JRExFX0dSQUNFOworCQlpZiAodGltZV9iZWZvcmUoamlmZmllcywgZW5kKSkgeworCQkJbW9kX3RpbWVyKCZjZnFkLT5pZGxlX2NsYXNzX3RpbWVyLCBlbmQpOworCQkJY2ZxcSA9IE5VTEw7CiAJCX0KLQotCQlpZiAocHJpbyAhPSAtMSkKLQkJCWJyZWFrOwotCQljZnFkLT5jdXJfcHJpbyA9IDA7Ci0JCWlmICgrK2NmcWQtPmN1cl9lbmRfcHJpbyA9PSBDRlFfUFJJT19MSVNUUykgewotCQkJY2ZxZC0+Y3VyX2VuZF9wcmlvID0gMDsKLQkJCWlmICh3cmFwKQotCQkJCWJyZWFrOwotCQkJd3JhcCA9IDE7Ci0JCX0KLQl9IHdoaWxlICgxKTsKLQotCWlmICh1bmxpa2VseShwcmlvID09IC0xKSkKLQkJcmV0dXJuIC0xOwotCi0JQlVHX09OKHByaW8gPj0gQ0ZRX1BSSU9fTElTVFMpOwotCi0JbGlzdF9zcGxpY2VfaW5pdCgmY2ZxZC0+cnJfbGlzdFtwcmlvXSwgJmNmcWQtPmN1cl9ycik7Ci0KLQljZnFkLT5jdXJfcHJpbyA9IHByaW8gKyAxOwotCWlmIChjZnFkLT5jdXJfcHJpbyA+IGNmcWQtPmN1cl9lbmRfcHJpbykgewotCQljZnFkLT5jdXJfZW5kX3ByaW8gPSBjZnFkLT5jdXJfcHJpbzsKLQkJY2ZxZC0+Y3VyX3ByaW8gPSAwOwotCX0KLQlpZiAoY2ZxZC0+Y3VyX2VuZF9wcmlvID09IENGUV9QUklPX0xJU1RTKSB7Ci0JCWNmcWQtPmN1cl9wcmlvID0gMDsKLQkJY2ZxZC0+Y3VyX2VuZF9wcmlvID0gMDsKIAl9CiAKLQlyZXR1cm4gcHJpbzsKKwlyZXR1cm4gY2ZxcTsKIH0KIAorLyoKKyAqIEdldCBhbmQgc2V0IGEgbmV3IGFjdGl2ZSBxdWV1ZSBmb3Igc2VydmljZS4KKyAqLwogc3RhdGljIHN0cnVjdCBjZnFfcXVldWUgKmNmcV9zZXRfYWN0aXZlX3F1ZXVlKHN0cnVjdCBjZnFfZGF0YSAqY2ZxZCkKIHsKLQlzdHJ1Y3QgY2ZxX3F1ZXVlICpjZnFxID0gTlVMTDsKKwlzdHJ1Y3QgY2ZxX3F1ZXVlICpjZnFxOwogCi0JaWYgKCFsaXN0X2VtcHR5KCZjZnFkLT5jdXJfcnIpIHx8IGNmcV9nZXRfbmV4dF9wcmlvX2xldmVsKGNmcWQpICE9IC0xKSB7Ci0JCS8qCi0JCSAqIGlmIGN1cnJlbnQgbGlzdCBpcyBub24tZW1wdHksIGdyYWIgZmlyc3QgZW50cnkuIGlmIGl0IGlzCi0JCSAqIGVtcHR5LCBnZXQgbmV4dCBwcmlvIGxldmVsIGFuZCBncmFiIGZpcnN0IGVudHJ5IHRoZW4gaWYgYW55Ci0JCSAqIGFyZSBzcGxpY2VkCi0JCSAqLwotCQljZnFxID0gbGlzdF9lbnRyeV9jZnFxKGNmcWQtPmN1cl9yci5uZXh0KTsKLQl9IGVsc2UgaWYgKCFsaXN0X2VtcHR5KCZjZnFkLT5idXN5X3JyKSkgewotCQkvKgotCQkgKiBJZiBubyBuZXcgcXVldWVzIGFyZSBhdmFpbGFibGUsIGNoZWNrIGlmIHRoZSBidXN5IGxpc3QgaGFzCi0JCSAqIHNvbWUgYmVmb3JlIGZhbGxpbmcgYmFjayB0byBpZGxlIGlvLgotCQkgKi8KLQkJY2ZxcSA9IGxpc3RfZW50cnlfY2ZxcShjZnFkLT5idXN5X3JyLm5leHQpOwotCX0gZWxzZSBpZiAoIWxpc3RfZW1wdHkoJmNmcWQtPmlkbGVfcnIpKSB7Ci0JCS8qCi0JCSAqIGlmIHdlIGhhdmUgaWRsZSBxdWV1ZXMgYW5kIG5vIHJ0IG9yIGJlIHF1ZXVlcyBoYWQgcGVuZGluZwotCQkgKiByZXF1ZXN0cywgZWl0aGVyIGFsbG93IGltbWVkaWF0ZSBzZXJ2aWNlIGlmIHRoZSBncmFjZSBwZXJpb2QKLQkJICogaGFzIHBhc3NlZCBvciBhcm0gdGhlIGlkbGUgZ3JhY2UgdGltZXIKLQkJICovCi0JCXVuc2lnbmVkIGxvbmcgZW5kID0gY2ZxZC0+bGFzdF9lbmRfcmVxdWVzdCArIENGUV9JRExFX0dSQUNFOwotCi0JCWlmICh0aW1lX2FmdGVyX2VxKGppZmZpZXMsIGVuZCkpCi0JCQljZnFxID0gbGlzdF9lbnRyeV9jZnFxKGNmcWQtPmlkbGVfcnIubmV4dCk7Ci0JCWVsc2UKLQkJCW1vZF90aW1lcigmY2ZxZC0+aWRsZV9jbGFzc190aW1lciwgZW5kKTsKLQl9Ci0KKwljZnFxID0gY2ZxX2dldF9uZXh0X3F1ZXVlKGNmcWQpOwogCV9fY2ZxX3NldF9hY3RpdmVfcXVldWUoY2ZxZCwgY2ZxcSk7CiAJcmV0dXJuIGNmcXE7CiB9CiAKLSNkZWZpbmUgQ0lDX1NFRUtZKGNpYykgKChjaWMpLT5zZWVrX21lYW4gPiAoMTI4ICogMTAyNCkpCitzdGF0aWMgaW5saW5lIHNlY3Rvcl90IGNmcV9kaXN0X2Zyb21fbGFzdChzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQsCisJCQkJCSAgc3RydWN0IHJlcXVlc3QgKnJxKQoreworCWlmIChycS0+c2VjdG9yID49IGNmcWQtPmxhc3RfcG9zaXRpb24pCisJCXJldHVybiBycS0+c2VjdG9yIC0gY2ZxZC0+bGFzdF9wb3NpdGlvbjsKKwllbHNlCisJCXJldHVybiBjZnFkLT5sYXN0X3Bvc2l0aW9uIC0gcnEtPnNlY3RvcjsKK30KIAotc3RhdGljIGludCBjZnFfYXJtX3NsaWNlX3RpbWVyKHN0cnVjdCBjZnFfZGF0YSAqY2ZxZCkKK3N0YXRpYyBpbmxpbmUgaW50IGNmcV9ycV9jbG9zZShzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQsIHN0cnVjdCByZXF1ZXN0ICpycSkKK3sKKwlzdHJ1Y3QgY2ZxX2lvX2NvbnRleHQgKmNpYyA9IGNmcWQtPmFjdGl2ZV9jaWM7CisKKwlpZiAoIXNhbXBsZV92YWxpZChjaWMtPnNlZWtfc2FtcGxlcykpCisJCXJldHVybiAwOworCisJcmV0dXJuIGNmcV9kaXN0X2Zyb21fbGFzdChjZnFkLCBycSkgPD0gY2ljLT5zZWVrX21lYW47Cit9CisKK3N0YXRpYyBpbnQgY2ZxX2Nsb3NlX2Nvb3BlcmF0b3Ioc3RydWN0IGNmcV9kYXRhICpjZnFfZGF0YSwKKwkJCQlzdHJ1Y3QgY2ZxX3F1ZXVlICpjZnFxKQoreworCS8qCisJICogV2Ugc2hvdWxkIG5vdGljZSBpZiBzb21lIG9mIHRoZSBxdWV1ZXMgYXJlIGNvb3BlcmF0aW5nLCBlZworCSAqIHdvcmtpbmcgY2xvc2VseSBvbiB0aGUgc2FtZSBhcmVhIG9mIHRoZSBkaXNrLiBJbiB0aGF0IGNhc2UsCisJICogd2UgY2FuIGdyb3VwIHRoZW0gdG9nZXRoZXIgYW5kIGRvbid0IHdhc3RlIHRpbWUgaWRsaW5nLgorCSAqLworCXJldHVybiAwOworfQorCisjZGVmaW5lIENJQ19TRUVLWShjaWMpICgoY2ljKS0+c2Vla19tZWFuID4gKDggKiAxMDI0KSkKKworc3RhdGljIHZvaWQgY2ZxX2FybV9zbGljZV90aW1lcihzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQpCiB7CiAJc3RydWN0IGNmcV9xdWV1ZSAqY2ZxcSA9IGNmcWQtPmFjdGl2ZV9xdWV1ZTsKIAlzdHJ1Y3QgY2ZxX2lvX2NvbnRleHQgKmNpYzsKIAl1bnNpZ25lZCBsb25nIHNsOwogCiAJV0FSTl9PTighUkJfRU1QVFlfUk9PVCgmY2ZxcS0+c29ydF9saXN0KSk7CisJV0FSTl9PTihjZnFfY2ZxcV9zbGljZV9uZXcoY2ZxcSkpOwogCiAJLyoKIAkgKiBpZGxlIGlzIGRpc2FibGVkLCBlaXRoZXIgbWFudWFsbHkgb3IgYnkgcGFzdCBwcm9jZXNzIGhpc3RvcnkKIAkgKi8KLQlpZiAoIWNmcWQtPmNmcV9zbGljZV9pZGxlKQotCQlyZXR1cm4gMDsKLQlpZiAoIWNmcV9jZnFxX2lkbGVfd2luZG93KGNmcXEpKQotCQlyZXR1cm4gMDsKKwlpZiAoIWNmcWQtPmNmcV9zbGljZV9pZGxlIHx8ICFjZnFfY2ZxcV9pZGxlX3dpbmRvdyhjZnFxKSkKKwkJcmV0dXJuOworCiAJLyoKIAkgKiB0YXNrIGhhcyBleGl0ZWQsIGRvbid0IHdhaXQKIAkgKi8KIAljaWMgPSBjZnFkLT5hY3RpdmVfY2ljOwogCWlmICghY2ljIHx8ICFjaWMtPmlvYy0+dGFzaykKLQkJcmV0dXJuIDA7CisJCXJldHVybjsKKworCS8qCisJICogU2VlIGlmIHRoaXMgcHJpbyBsZXZlbCBoYXMgYSBnb29kIGNhbmRpZGF0ZQorCSAqLworCWlmIChjZnFfY2xvc2VfY29vcGVyYXRvcihjZnFkLCBjZnFxKSAmJgorCSAgICAoc2FtcGxlX3ZhbGlkKGNpYy0+dHRpbWVfc2FtcGxlcykgJiYgY2ljLT50dGltZV9tZWFuID4gMikpCisJCXJldHVybjsKIAogCWNmcV9tYXJrX2NmcXFfbXVzdF9kaXNwYXRjaChjZnFxKTsKIAljZnFfbWFya19jZnFxX3dhaXRfcmVxdWVzdChjZnFxKTsKIAotCXNsID0gbWluKGNmcXEtPnNsaWNlX2VuZCAtIDEsICh1bnNpZ25lZCBsb25nKSBjZnFkLT5jZnFfc2xpY2VfaWRsZSk7Ci0KIAkvKgogCSAqIHdlIGRvbid0IHdhbnQgdG8gaWRsZSBmb3Igc2Vla3MsIGJ1dCB3ZSBkbyB3YW50IHRvIGFsbG93CiAJICogZmFpciBkaXN0cmlidXRpb24gb2Ygc2xpY2UgdGltZSBmb3IgYSBwcm9jZXNzIGRvaW5nIGJhY2stdG8tYmFjawogCSAqIHNlZWtzLiBzbyBhbGxvdyBhIGxpdHRsZSBiaXQgb2YgdGltZSBmb3IgaGltIHRvIHN1Ym1pdCBhIG5ldyBycQogCSAqLworCXNsID0gY2ZxZC0+Y2ZxX3NsaWNlX2lkbGU7CiAJaWYgKHNhbXBsZV92YWxpZChjaWMtPnNlZWtfc2FtcGxlcykgJiYgQ0lDX1NFRUtZKGNpYykpCi0JCXNsID0gbWluKHNsLCBtc2Vjc190b19qaWZmaWVzKDIpKTsKKwkJc2wgPSBtaW4oc2wsIG1zZWNzX3RvX2ppZmZpZXMoQ0ZRX01JTl9UVCkpOwogCiAJbW9kX3RpbWVyKCZjZnFkLT5pZGxlX3NsaWNlX3RpbWVyLCBqaWZmaWVzICsgc2wpOwotCXJldHVybiAxOwogfQogCisvKgorICogTW92ZSByZXF1ZXN0IGZyb20gaW50ZXJuYWwgbGlzdHMgdG8gdGhlIHJlcXVlc3QgcXVldWUgZGlzcGF0Y2ggbGlzdC4KKyAqLwogc3RhdGljIHZvaWQgY2ZxX2Rpc3BhdGNoX2luc2VydChyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSkKIHsKIAlzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQgPSBxLT5lbGV2YXRvci0+ZWxldmF0b3JfZGF0YTsKIAlzdHJ1Y3QgY2ZxX3F1ZXVlICpjZnFxID0gUlFfQ0ZRUShycSk7CiAKIAljZnFfcmVtb3ZlX3JlcXVlc3QocnEpOwotCWNmcXEtPm9uX2Rpc3BhdGNoW3JxX2lzX3N5bmMocnEpXSsrOworCWNmcXEtPmRpc3BhdGNoZWQrKzsKIAllbHZfZGlzcGF0Y2hfc29ydChxLCBycSk7CiAKLQlycSA9IGxpc3RfZW50cnkocS0+cXVldWVfaGVhZC5wcmV2LCBzdHJ1Y3QgcmVxdWVzdCwgcXVldWVsaXN0KTsKLQljZnFkLT5sYXN0X3NlY3RvciA9IHJxLT5zZWN0b3IgKyBycS0+bnJfc2VjdG9yczsKKwlpZiAoY2ZxX2NmcXFfc3luYyhjZnFxKSkKKwkJY2ZxZC0+c3luY19mbGlnaHQrKzsKIH0KIAogLyoKQEAgLTg5NSwxMyArOTQyLDEzIEBACiAJaWYgKGxpc3RfZW1wdHkoJmNmcXEtPmZpZm8pKQogCQlyZXR1cm4gTlVMTDsKIAotCWZpZm8gPSBjZnFfY2ZxcV9jbGFzc19zeW5jKGNmcXEpOworCWZpZm8gPSBjZnFfY2ZxcV9zeW5jKGNmcXEpOwogCXJxID0gcnFfZW50cnlfZmlmbyhjZnFxLT5maWZvLm5leHQpOwogCi0JaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgcnEtPnN0YXJ0X3RpbWUgKyBjZnFkLT5jZnFfZmlmb19leHBpcmVbZmlmb10pKQotCQlyZXR1cm4gcnE7CisJaWYgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHJxLT5zdGFydF90aW1lICsgY2ZxZC0+Y2ZxX2ZpZm9fZXhwaXJlW2ZpZm9dKSkKKwkJcmV0dXJuIE5VTEw7CiAKLQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gcnE7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50CkBAIC05MTUsNyArOTYyLDggQEAKIH0KIAogLyoKLSAqIGdldCBuZXh0IHF1ZXVlIGZvciBzZXJ2aWNlCisgKiBTZWxlY3QgYSBxdWV1ZSBmb3Igc2VydmljZS4gSWYgd2UgaGF2ZSBhIGN1cnJlbnQgYWN0aXZlIHF1ZXVlLAorICogY2hlY2sgd2hldGhlciB0byBjb250aW51ZSBzZXJ2aWNpbmcgaXQsIG9yIHJldHJpZXZlIGFuZCBzZXQgYSBuZXcgb25lLgogICovCiBzdGF0aWMgc3RydWN0IGNmcV9xdWV1ZSAqY2ZxX3NlbGVjdF9xdWV1ZShzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQpCiB7CkBAIC05MjYsMzMgKzk3NCw0MSBAQAogCQlnb3RvIG5ld19xdWV1ZTsKIAogCS8qCi0JICogc2xpY2UgaGFzIGV4cGlyZWQKKwkgKiBUaGUgYWN0aXZlIHF1ZXVlIGhhcyBydW4gb3V0IG9mIHRpbWUsIGV4cGlyZSBpdCBhbmQgc2VsZWN0IG5ldy4KIAkgKi8KLQlpZiAoIWNmcV9jZnFxX211c3RfZGlzcGF0Y2goY2ZxcSkgJiYgY2ZxX3NsaWNlX3VzZWQoY2ZxcSkpCisJaWYgKGNmcV9zbGljZV91c2VkKGNmcXEpKQogCQlnb3RvIGV4cGlyZTsKIAogCS8qCi0JICogaWYgcXVldWUgaGFzIHJlcXVlc3RzLCBkaXNwYXRjaCBvbmUuIGlmIG5vdCwgY2hlY2sgaWYKLQkgKiBlbm91Z2ggc2xpY2UgaXMgbGVmdCB0byB3YWl0IGZvciBvbmUKKwkgKiBUaGUgYWN0aXZlIHF1ZXVlIGhhcyByZXF1ZXN0cyBhbmQgaXNuJ3QgZXhwaXJlZCwgYWxsb3cgaXQgdG8KKwkgKiBkaXNwYXRjaC4KIAkgKi8KIAlpZiAoIVJCX0VNUFRZX1JPT1QoJmNmcXEtPnNvcnRfbGlzdCkpCiAJCWdvdG8ga2VlcF9xdWV1ZTsKLQllbHNlIGlmIChjZnFfY2ZxcV9zbGljZV9uZXcoY2ZxcSkgfHwgY2ZxX2NmcXFfZGlzcGF0Y2hlZChjZnFxKSkgeworCisJLyoKKwkgKiBObyByZXF1ZXN0cyBwZW5kaW5nLiBJZiB0aGUgYWN0aXZlIHF1ZXVlIHN0aWxsIGhhcyByZXF1ZXN0cyBpbgorCSAqIGZsaWdodCBvciBpcyBpZGxpbmcgZm9yIGEgbmV3IHJlcXVlc3QsIGFsbG93IGVpdGhlciBvZiB0aGVzZQorCSAqIGNvbmRpdGlvbnMgdG8gaGFwcGVuIChvciB0aW1lIG91dCkgYmVmb3JlIHNlbGVjdGluZyBhIG5ldyBxdWV1ZS4KKwkgKi8KKwlpZiAodGltZXJfcGVuZGluZygmY2ZxZC0+aWRsZV9zbGljZV90aW1lcikgfHwKKwkgICAgKGNmcXEtPmRpc3BhdGNoZWQgJiYgY2ZxX2NmcXFfaWRsZV93aW5kb3coY2ZxcSkpKSB7CiAJCWNmcXEgPSBOVUxMOwogCQlnb3RvIGtlZXBfcXVldWU7Ci0JfSBlbHNlIGlmIChjZnFfY2ZxcV9jbGFzc19zeW5jKGNmcXEpKSB7Ci0JCWlmIChjZnFfYXJtX3NsaWNlX3RpbWVyKGNmcWQpKQotCQkJcmV0dXJuIE5VTEw7CiAJfQogCiBleHBpcmU6Ci0JY2ZxX3NsaWNlX2V4cGlyZWQoY2ZxZCwgMCwgMCk7CisJY2ZxX3NsaWNlX2V4cGlyZWQoY2ZxZCwgMCk7CiBuZXdfcXVldWU6CiAJY2ZxcSA9IGNmcV9zZXRfYWN0aXZlX3F1ZXVlKGNmcWQpOwoga2VlcF9xdWV1ZToKIAlyZXR1cm4gY2ZxcTsKIH0KIAorLyoKKyAqIERpc3BhdGNoIHNvbWUgcmVxdWVzdHMgZnJvbSBjZnFxLCBtb3ZpbmcgdGhlbSB0byB0aGUgcmVxdWVzdCBxdWV1ZQorICogZGlzcGF0Y2ggbGlzdC4KKyAqLwogc3RhdGljIGludAogX19jZnFfZGlzcGF0Y2hfcmVxdWVzdHMoc3RydWN0IGNmcV9kYXRhICpjZnFkLCBzdHJ1Y3QgY2ZxX3F1ZXVlICpjZnFxLAogCQkJaW50IG1heF9kaXNwYXRjaCkKQEAgLTk3NSw3ICsxMDMxLDYgQEAKIAkJICovCiAJCWNmcV9kaXNwYXRjaF9pbnNlcnQoY2ZxZC0+cXVldWUsIHJxKTsKIAotCQljZnFkLT5kaXNwYXRjaF9zbGljZSsrOwogCQlkaXNwYXRjaGVkKys7CiAKIAkJaWYgKCFjZnFkLT5hY3RpdmVfY2ljKSB7CkBAIC05OTMsNTcgKzEwNDgsNTQgQEAKIAkgKiBxdWV1ZSBhbHdheXMgZXhwaXJlIGFmdGVyIDEgZGlzcGF0Y2ggcm91bmQuCiAJICovCiAJaWYgKGNmcWQtPmJ1c3lfcXVldWVzID4gMSAmJiAoKCFjZnFfY2ZxcV9zeW5jKGNmcXEpICYmCi0JICAgIGNmcWQtPmRpc3BhdGNoX3NsaWNlID49IGNmcV9wcmlvX3RvX21heHJxKGNmcWQsIGNmcXEpKSB8fAorCSAgICBkaXNwYXRjaGVkID49IGNmcV9wcmlvX3RvX21heHJxKGNmcWQsIGNmcXEpKSB8fAogCSAgICBjZnFfY2xhc3NfaWRsZShjZnFxKSkpIHsKIAkJY2ZxcS0+c2xpY2VfZW5kID0gamlmZmllcyArIDE7Ci0JCWNmcV9zbGljZV9leHBpcmVkKGNmcWQsIDAsIDApOworCQljZnFfc2xpY2VfZXhwaXJlZChjZnFkLCAwKTsKIAl9CiAKIAlyZXR1cm4gZGlzcGF0Y2hlZDsKIH0KIAotc3RhdGljIGludAotY2ZxX2ZvcmNlZF9kaXNwYXRjaF9jZnFxcyhzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KQorc3RhdGljIGlubGluZSBpbnQgX19jZnFfZm9yY2VkX2Rpc3BhdGNoX2NmcXEoc3RydWN0IGNmcV9xdWV1ZSAqY2ZxcSkKIHsKLQlzdHJ1Y3QgY2ZxX3F1ZXVlICpjZnFxLCAqbmV4dDsKLQlpbnQgZGlzcGF0Y2hlZDsKKwlpbnQgZGlzcGF0Y2hlZCA9IDA7CiAKLQlkaXNwYXRjaGVkID0gMDsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY2ZxcSwgbmV4dCwgbGlzdCwgY2ZxX2xpc3QpIHsKLQkJd2hpbGUgKGNmcXEtPm5leHRfcnEpIHsKLQkJCWNmcV9kaXNwYXRjaF9pbnNlcnQoY2ZxcS0+Y2ZxZC0+cXVldWUsIGNmcXEtPm5leHRfcnEpOwotCQkJZGlzcGF0Y2hlZCsrOwotCQl9Ci0JCUJVR19PTighbGlzdF9lbXB0eSgmY2ZxcS0+ZmlmbykpOworCXdoaWxlIChjZnFxLT5uZXh0X3JxKSB7CisJCWNmcV9kaXNwYXRjaF9pbnNlcnQoY2ZxcS0+Y2ZxZC0+cXVldWUsIGNmcXEtPm5leHRfcnEpOworCQlkaXNwYXRjaGVkKys7CiAJfQogCisJQlVHX09OKCFsaXN0X2VtcHR5KCZjZnFxLT5maWZvKSk7CiAJcmV0dXJuIGRpc3BhdGNoZWQ7CiB9CiAKLXN0YXRpYyBpbnQKLWNmcV9mb3JjZWRfZGlzcGF0Y2goc3RydWN0IGNmcV9kYXRhICpjZnFkKQorLyoKKyAqIERyYWluIG91ciBjdXJyZW50IHJlcXVlc3RzLiBVc2VkIGZvciBiYXJyaWVycyBhbmQgd2hlbiBzd2l0Y2hpbmcKKyAqIGlvIHNjaGVkdWxlcnMgb24tdGhlLWZseS4KKyAqLworc3RhdGljIGludCBjZnFfZm9yY2VkX2Rpc3BhdGNoKHN0cnVjdCBjZnFfZGF0YSAqY2ZxZCkKIHsKLQlpbnQgaSwgZGlzcGF0Y2hlZCA9IDA7CisJaW50IGRpc3BhdGNoZWQgPSAwOworCXN0cnVjdCByYl9ub2RlICpuOwogCi0JZm9yIChpID0gMDsgaSA8IENGUV9QUklPX0xJU1RTOyBpKyspCi0JCWRpc3BhdGNoZWQgKz0gY2ZxX2ZvcmNlZF9kaXNwYXRjaF9jZnFxcygmY2ZxZC0+cnJfbGlzdFtpXSk7CisJd2hpbGUgKChuID0gY2ZxX3JiX2ZpcnN0KCZjZnFkLT5zZXJ2aWNlX3RyZWUpKSAhPSBOVUxMKSB7CisJCXN0cnVjdCBjZnFfcXVldWUgKmNmcXEgPSByYl9lbnRyeShuLCBzdHJ1Y3QgY2ZxX3F1ZXVlLCByYl9ub2RlKTsKIAotCWRpc3BhdGNoZWQgKz0gY2ZxX2ZvcmNlZF9kaXNwYXRjaF9jZnFxcygmY2ZxZC0+YnVzeV9ycik7Ci0JZGlzcGF0Y2hlZCArPSBjZnFfZm9yY2VkX2Rpc3BhdGNoX2NmcXFzKCZjZnFkLT5jdXJfcnIpOwotCWRpc3BhdGNoZWQgKz0gY2ZxX2ZvcmNlZF9kaXNwYXRjaF9jZnFxcygmY2ZxZC0+aWRsZV9ycik7CisJCWRpc3BhdGNoZWQgKz0gX19jZnFfZm9yY2VkX2Rpc3BhdGNoX2NmcXEoY2ZxcSk7CisJfQogCi0JY2ZxX3NsaWNlX2V4cGlyZWQoY2ZxZCwgMCwgMCk7CisJY2ZxX3NsaWNlX2V4cGlyZWQoY2ZxZCwgMCk7CiAKIAlCVUdfT04oY2ZxZC0+YnVzeV9xdWV1ZXMpOwogCiAJcmV0dXJuIGRpc3BhdGNoZWQ7CiB9CiAKLXN0YXRpYyBpbnQKLWNmcV9kaXNwYXRjaF9yZXF1ZXN0cyhyZXF1ZXN0X3F1ZXVlX3QgKnEsIGludCBmb3JjZSkKK3N0YXRpYyBpbnQgY2ZxX2Rpc3BhdGNoX3JlcXVlc3RzKHJlcXVlc3RfcXVldWVfdCAqcSwgaW50IGZvcmNlKQogewogCXN0cnVjdCBjZnFfZGF0YSAqY2ZxZCA9IHEtPmVsZXZhdG9yLT5lbGV2YXRvcl9kYXRhOwotCXN0cnVjdCBjZnFfcXVldWUgKmNmcXEsICpwcmV2X2NmcXE7CisJc3RydWN0IGNmcV9xdWV1ZSAqY2ZxcTsKIAlpbnQgZGlzcGF0Y2hlZDsKIAogCWlmICghY2ZxZC0+YnVzeV9xdWV1ZXMpCkBAIC0xMDUzLDM2ICsxMTA1LDI4IEBACiAJCXJldHVybiBjZnFfZm9yY2VkX2Rpc3BhdGNoKGNmcWQpOwogCiAJZGlzcGF0Y2hlZCA9IDA7Ci0JcHJldl9jZnFxID0gTlVMTDsKIAl3aGlsZSAoKGNmcXEgPSBjZnFfc2VsZWN0X3F1ZXVlKGNmcWQpKSAhPSBOVUxMKSB7CiAJCWludCBtYXhfZGlzcGF0Y2g7CiAKLQkJaWYgKGNmcWQtPmJ1c3lfcXVldWVzID4gMSkgewotCQkJLyoKLQkJCSAqIERvbid0IHJlcGVhdCBkaXNwYXRjaCBmcm9tIHRoZSBwcmV2aW91cyBxdWV1ZS4KLQkJCSAqLwotCQkJaWYgKHByZXZfY2ZxcSA9PSBjZnFxKQotCQkJCWJyZWFrOwotCi0JCQkvKgotCQkJICogU28gd2UgaGF2ZSBkaXNwYXRjaGVkIGJlZm9yZSBpbiB0aGlzIHJvdW5kLCBpZiB0aGUKLQkJCSAqIG5leHQgcXVldWUgaGFzIGlkbGluZyBlbmFibGVkIChtdXN0IGJlIHN5bmMpLCBkb24ndAotCQkJICogYWxsb3cgaXQgc2VydmljZSB1bnRpbCB0aGUgcHJldmlvdXMgaGF2ZSBjb250aW51ZWQuCi0JCQkgKi8KLQkJCWlmIChjZnFkLT5ycV9pbl9kcml2ZXIgJiYgY2ZxX2NmcXFfaWRsZV93aW5kb3coY2ZxcSkpCi0JCQkJYnJlYWs7Ci0JCX0KLQotCQljZnFfY2xlYXJfY2ZxcV9tdXN0X2Rpc3BhdGNoKGNmcXEpOwotCQljZnFfY2xlYXJfY2ZxcV93YWl0X3JlcXVlc3QoY2ZxcSk7Ci0JCWRlbF90aW1lcigmY2ZxZC0+aWRsZV9zbGljZV90aW1lcik7Ci0KIAkJbWF4X2Rpc3BhdGNoID0gY2ZxZC0+Y2ZxX3F1YW50dW07CiAJCWlmIChjZnFfY2xhc3NfaWRsZShjZnFxKSkKIAkJCW1heF9kaXNwYXRjaCA9IDE7CiAKKwkJaWYgKGNmcXEtPmRpc3BhdGNoZWQgPj0gbWF4X2Rpc3BhdGNoKSB7CisJCQlpZiAoY2ZxZC0+YnVzeV9xdWV1ZXMgPiAxKQorCQkJCWJyZWFrOworCQkJaWYgKGNmcXEtPmRpc3BhdGNoZWQgPj0gNCAqIG1heF9kaXNwYXRjaCkKKwkJCQlicmVhazsKKwkJfQorCisJCWlmIChjZnFkLT5zeW5jX2ZsaWdodCAmJiAhY2ZxX2NmcXFfc3luYyhjZnFxKSkKKwkJCWJyZWFrOworCisJCWNmcV9jbGVhcl9jZnFxX211c3RfZGlzcGF0Y2goY2ZxcSk7CisJCWNmcV9jbGVhcl9jZnFxX3dhaXRfcmVxdWVzdChjZnFxKTsKKwkJZGVsX3RpbWVyKCZjZnFkLT5pZGxlX3NsaWNlX3RpbWVyKTsKKwogCQlkaXNwYXRjaGVkICs9IF9fY2ZxX2Rpc3BhdGNoX3JlcXVlc3RzKGNmcWQsIGNmcXEsIG1heF9kaXNwYXRjaCk7Ci0JCXByZXZfY2ZxcSA9IGNmcXE7CiAJfQogCiAJcmV0dXJuIGRpc3BhdGNoZWQ7CkBAIC0xMTA4LDQ4ICsxMTUyLDIxIEBACiAJQlVHX09OKGNmcV9jZnFxX29uX3JyKGNmcXEpKTsKIAogCWlmICh1bmxpa2VseShjZnFkLT5hY3RpdmVfcXVldWUgPT0gY2ZxcSkpIHsKLQkJX19jZnFfc2xpY2VfZXhwaXJlZChjZnFkLCBjZnFxLCAwLCAwKTsKKwkJX19jZnFfc2xpY2VfZXhwaXJlZChjZnFkLCBjZnFxLCAwKTsKIAkJY2ZxX3NjaGVkdWxlX2Rpc3BhdGNoKGNmcWQpOwogCX0KIAotCS8qCi0JICogaXQncyBvbiB0aGUgZW1wdHkgbGlzdCBhbmQgc3RpbGwgaGFzaGVkCi0JICovCi0JbGlzdF9kZWwoJmNmcXEtPmNmcV9saXN0KTsKLQlobGlzdF9kZWwoJmNmcXEtPmNmcV9oYXNoKTsKIAlrbWVtX2NhY2hlX2ZyZWUoY2ZxX3Bvb2wsIGNmcXEpOwogfQogCi1zdGF0aWMgc3RydWN0IGNmcV9xdWV1ZSAqCi1fX2NmcV9maW5kX2NmcV9oYXNoKHN0cnVjdCBjZnFfZGF0YSAqY2ZxZCwgdW5zaWduZWQgaW50IGtleSwgdW5zaWduZWQgaW50IHByaW8sCi0JCSAgICBjb25zdCBpbnQgaGFzaHZhbCkKLXsKLQlzdHJ1Y3QgaGxpc3RfaGVhZCAqaGFzaF9saXN0ID0gJmNmcWQtPmNmcV9oYXNoW2hhc2h2YWxdOwotCXN0cnVjdCBobGlzdF9ub2RlICplbnRyeTsKLQlzdHJ1Y3QgY2ZxX3F1ZXVlICpfX2NmcXE7Ci0KLQlobGlzdF9mb3JfZWFjaF9lbnRyeShfX2NmcXEsIGVudHJ5LCBoYXNoX2xpc3QsIGNmcV9oYXNoKSB7Ci0JCWNvbnN0IHVuc2lnbmVkIHNob3J0IF9fcCA9IElPUFJJT19QUklPX1ZBTFVFKF9fY2ZxcS0+b3JnX2lvcHJpb19jbGFzcywgX19jZnFxLT5vcmdfaW9wcmlvKTsKLQotCQlpZiAoX19jZnFxLT5rZXkgPT0ga2V5ICYmIChfX3AgPT0gcHJpbyB8fCAhcHJpbykpCi0JCQlyZXR1cm4gX19jZnFxOwotCX0KLQotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgc3RydWN0IGNmcV9xdWV1ZSAqCi1jZnFfZmluZF9jZnFfaGFzaChzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQsIHVuc2lnbmVkIGludCBrZXksIHVuc2lnbmVkIHNob3J0IHByaW8pCi17Ci0JcmV0dXJuIF9fY2ZxX2ZpbmRfY2ZxX2hhc2goY2ZxZCwga2V5LCBwcmlvLCBoYXNoX2xvbmcoa2V5LCBDRlFfUUhBU0hfU0hJRlQpKTsKLX0KLQogc3RhdGljIHZvaWQgY2ZxX2ZyZWVfaW9fY29udGV4dChzdHJ1Y3QgaW9fY29udGV4dCAqaW9jKQogewogCXN0cnVjdCBjZnFfaW9fY29udGV4dCAqX19jaWM7CiAJc3RydWN0IHJiX25vZGUgKm47CiAJaW50IGZyZWVkID0gMDsKIAorCWlvYy0+aW9jX2RhdGEgPSBOVUxMOworCiAJd2hpbGUgKChuID0gcmJfZmlyc3QoJmlvYy0+Y2ljX3Jvb3QpKSAhPSBOVUxMKSB7CiAJCV9fY2ljID0gcmJfZW50cnkobiwgc3RydWN0IGNmcV9pb19jb250ZXh0LCByYl9ub2RlKTsKIAkJcmJfZXJhc2UoJl9fY2ljLT5yYl9ub2RlLCAmaW9jLT5jaWNfcm9vdCk7CkBAIC0xMTY2LDcgKzExODMsNyBAQAogc3RhdGljIHZvaWQgY2ZxX2V4aXRfY2ZxcShzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQsIHN0cnVjdCBjZnFfcXVldWUgKmNmcXEpCiB7CiAJaWYgKHVubGlrZWx5KGNmcXEgPT0gY2ZxZC0+YWN0aXZlX3F1ZXVlKSkgewotCQlfX2NmcV9zbGljZV9leHBpcmVkKGNmcWQsIGNmcXEsIDAsIDApOworCQlfX2NmcV9zbGljZV9leHBpcmVkKGNmcWQsIGNmcXEsIDApOwogCQljZnFfc2NoZWR1bGVfZGlzcGF0Y2goY2ZxZCk7CiAJfQogCkBAIC0xMTkxLDEwICsxMjA4LDYgQEAKIAl9CiB9CiAKLQotLyoKLSAqIENhbGxlZCB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQKLSAqLwogc3RhdGljIHZvaWQgY2ZxX2V4aXRfc2luZ2xlX2lvX2NvbnRleHQoc3RydWN0IGNmcV9pb19jb250ZXh0ICpjaWMpCiB7CiAJc3RydWN0IGNmcV9kYXRhICpjZnFkID0gY2ljLT5rZXk7CkBAIC0xMjA4LDE1ICsxMjIxLDIwIEBACiAJfQogfQogCisvKgorICogVGhlIHByb2Nlc3MgdGhhdCBpb2MgYmVsb25ncyB0byBoYXMgZXhpdGVkLCB3ZSBuZWVkIHRvIGNsZWFuIHVwCisgKiBhbmQgcHV0IHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmVzIHdlIGhhdmUgdGhhdCBiZWxvbmdzIHRvIHRoYXQgcHJvY2Vzcy4KKyAqLwogc3RhdGljIHZvaWQgY2ZxX2V4aXRfaW9fY29udGV4dChzdHJ1Y3QgaW9fY29udGV4dCAqaW9jKQogewogCXN0cnVjdCBjZnFfaW9fY29udGV4dCAqX19jaWM7CiAJc3RydWN0IHJiX25vZGUgKm47CiAKKwlpb2MtPmlvY19kYXRhID0gTlVMTDsKKwogCS8qCiAJICogcHV0IHRoZSByZWZlcmVuY2UgdGhpcyB0YXNrIGlzIGhvbGRpbmcgdG8gdGhlIHZhcmlvdXMgcXVldWVzCiAJICovCi0KIAluID0gcmJfZmlyc3QoJmlvYy0+Y2ljX3Jvb3QpOwogCXdoaWxlIChuICE9IE5VTEwpIHsKIAkJX19jaWMgPSByYl9lbnRyeShuLCBzdHJ1Y3QgY2ZxX2lvX2NvbnRleHQsIHJiX25vZGUpOwpAQCAtMTI4NCw4ICsxMzAyLDYgQEAKIAkgKi8KIAljZnFxLT5vcmdfaW9wcmlvID0gY2ZxcS0+aW9wcmlvOwogCWNmcXEtPm9yZ19pb3ByaW9fY2xhc3MgPSBjZnFxLT5pb3ByaW9fY2xhc3M7Ci0KLQljZnFfcmVzb3J0X3JyX2xpc3QoY2ZxcSwgMCk7CiAJY2ZxX2NsZWFyX2NmcXFfcHJpb19jaGFuZ2VkKGNmcXEpOwogfQogCkBAIC0xMzAzLDcgKzEzMTksNyBAQAogCWNmcXEgPSBjaWMtPmNmcXFbQVNZTkNdOwogCWlmIChjZnFxKSB7CiAJCXN0cnVjdCBjZnFfcXVldWUgKm5ld19jZnFxOwotCQluZXdfY2ZxcSA9IGNmcV9nZXRfcXVldWUoY2ZxZCwgQ0ZRX0tFWV9BU1lOQywgY2ljLT5pb2MtPnRhc2ssCisJCW5ld19jZnFxID0gY2ZxX2dldF9xdWV1ZShjZnFkLCBBU1lOQywgY2ljLT5pb2MtPnRhc2ssCiAJCQkJCSBHRlBfQVRPTUlDKTsKIAkJaWYgKG5ld19jZnFxKSB7CiAJCQljaWMtPmNmcXFbQVNZTkNdID0gbmV3X2NmcXE7CkBAIC0xMzM1LDE2ICsxMzUxLDE2IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgY2ZxX3F1ZXVlICoKLWNmcV9nZXRfcXVldWUoc3RydWN0IGNmcV9kYXRhICpjZnFkLCB1bnNpZ25lZCBpbnQga2V5LCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywKK2NmcV9nZXRfcXVldWUoc3RydWN0IGNmcV9kYXRhICpjZnFkLCBpbnQgaXNfc3luYywgc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssCiAJICAgICAgZ2ZwX3QgZ2ZwX21hc2spCiB7Ci0JY29uc3QgaW50IGhhc2h2YWwgPSBoYXNoX2xvbmcoa2V5LCBDRlFfUUhBU0hfU0hJRlQpOwogCXN0cnVjdCBjZnFfcXVldWUgKmNmcXEsICpuZXdfY2ZxcSA9IE5VTEw7Ci0JdW5zaWduZWQgc2hvcnQgaW9wcmlvOworCXN0cnVjdCBjZnFfaW9fY29udGV4dCAqY2ljOwogCiByZXRyeToKLQlpb3ByaW8gPSB0c2stPmlvcHJpbzsKLQljZnFxID0gX19jZnFfZmluZF9jZnFfaGFzaChjZnFkLCBrZXksIGlvcHJpbywgaGFzaHZhbCk7CisJY2ljID0gY2ZxX2NpY19yYl9sb29rdXAoY2ZxZCwgdHNrLT5pb19jb250ZXh0KTsKKwkvKiBjaWMgYWx3YXlzIGV4aXN0cyBoZXJlICovCisJY2ZxcSA9IGNpY190b19jZnFxKGNpYywgaXNfc3luYyk7CiAKIAlpZiAoIWNmcXEpIHsKIAkJaWYgKG5ld19jZnFxKSB7CkBAIC0xMzY5LDIwICsxMzg1LDIwIEBACiAKIAkJbWVtc2V0KGNmcXEsIDAsIHNpemVvZigqY2ZxcSkpOwogCi0JCUlOSVRfSExJU1RfTk9ERSgmY2ZxcS0+Y2ZxX2hhc2gpOwotCQlJTklUX0xJU1RfSEVBRCgmY2ZxcS0+Y2ZxX2xpc3QpOworCQlSQl9DTEVBUl9OT0RFKCZjZnFxLT5yYl9ub2RlKTsKIAkJSU5JVF9MSVNUX0hFQUQoJmNmcXEtPmZpZm8pOwogCi0JCWNmcXEtPmtleSA9IGtleTsKLQkJaGxpc3RfYWRkX2hlYWQoJmNmcXEtPmNmcV9oYXNoLCAmY2ZxZC0+Y2ZxX2hhc2hbaGFzaHZhbF0pOwogCQlhdG9taWNfc2V0KCZjZnFxLT5yZWYsIDApOwogCQljZnFxLT5jZnFkID0gY2ZxZDsKIAotCQlpZiAoa2V5ICE9IENGUV9LRVlfQVNZTkMpCisJCWlmIChpc19zeW5jKSB7CiAJCQljZnFfbWFya19jZnFxX2lkbGVfd2luZG93KGNmcXEpOworCQkJY2ZxX21hcmtfY2ZxcV9zeW5jKGNmcXEpOworCQl9CiAKIAkJY2ZxX21hcmtfY2ZxcV9wcmlvX2NoYW5nZWQoY2ZxcSk7CiAJCWNmcV9tYXJrX2NmcXFfcXVldWVfbmV3KGNmcXEpOworCiAJCWNmcV9pbml0X3ByaW9fZGF0YShjZnFxKTsKIAl9CiAKQEAgLTEzOTUsMTAgKzE0MTEsMTcgQEAKIAlyZXR1cm4gY2ZxcTsKIH0KIAorLyoKKyAqIFdlIGRyb3AgY2ZxIGlvIGNvbnRleHRzIGxhemlseSwgc28gd2UgbWF5IGZpbmQgYSBkZWFkIG9uZS4KKyAqLwogc3RhdGljIHZvaWQKIGNmcV9kcm9wX2RlYWRfY2ljKHN0cnVjdCBpb19jb250ZXh0ICppb2MsIHN0cnVjdCBjZnFfaW9fY29udGV4dCAqY2ljKQogewogCVdBUk5fT04oIWxpc3RfZW1wdHkoJmNpYy0+cXVldWVfbGlzdCkpOworCisJaWYgKGlvYy0+aW9jX2RhdGEgPT0gY2ljKQorCQlpb2MtPmlvY19kYXRhID0gTlVMTDsKKwogCXJiX2VyYXNlKCZjaWMtPnJiX25vZGUsICZpb2MtPmNpY19yb290KTsKIAlrbWVtX2NhY2hlX2ZyZWUoY2ZxX2lvY19wb29sLCBjaWMpOwogCWVsdl9pb2NfY291bnRfZGVjKGlvY19jb3VudCk7CkBAIC0xNDExLDYgKzE0MzQsMTYgQEAKIAlzdHJ1Y3QgY2ZxX2lvX2NvbnRleHQgKmNpYzsKIAl2b2lkICprLCAqa2V5ID0gY2ZxZDsKIAorCWlmICh1bmxpa2VseSghaW9jKSkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKgorCSAqIHdlIG1haW50YWluIGEgbGFzdC1oaXQgY2FjaGUsIHRvIGF2b2lkIGJyb3dzaW5nIG92ZXIgdGhlIHRyZWUKKwkgKi8KKwljaWMgPSBpb2MtPmlvY19kYXRhOworCWlmIChjaWMgJiYgY2ljLT5rZXkgPT0gY2ZxZCkKKwkJcmV0dXJuIGNpYzsKKwogcmVzdGFydDoKIAluID0gaW9jLT5jaWNfcm9vdC5yYl9ub2RlOwogCXdoaWxlIChuKSB7CkBAIC0xNDI2LDggKzE0NTksMTAgQEAKIAkJCW4gPSBuLT5yYl9sZWZ0OwogCQllbHNlIGlmIChrZXkgPiBrKQogCQkJbiA9IG4tPnJiX3JpZ2h0OwotCQllbHNlCisJCWVsc2UgeworCQkJaW9jLT5pb2NfZGF0YSA9IGNpYzsKIAkJCXJldHVybiBjaWM7CisJCX0KIAl9CiAKIAlyZXR1cm4gTlVMTDsKQEAgLTE1MjQsNyArMTU1OSw4IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1jZnFfdXBkYXRlX2lvX3NlZWt0aW1lKHN0cnVjdCBjZnFfaW9fY29udGV4dCAqY2ljLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCitjZnFfdXBkYXRlX2lvX3NlZWt0aW1lKHN0cnVjdCBjZnFfZGF0YSAqY2ZxZCwgc3RydWN0IGNmcV9pb19jb250ZXh0ICpjaWMsCisJCSAgICAgICBzdHJ1Y3QgcmVxdWVzdCAqcnEpCiB7CiAJc2VjdG9yX3Qgc2Rpc3Q7CiAJdTY0IHRvdGFsOwpAQCAtMTUzNCw2ICsxNTcwLDExIEBACiAJZWxzZQogCQlzZGlzdCA9IGNpYy0+bGFzdF9yZXF1ZXN0X3BvcyAtIHJxLT5zZWN0b3I7CiAKKwlpZiAoIWNpYy0+c2Vla19zYW1wbGVzKSB7CisJCWNmcWQtPm5ld19zZWVrX3RvdGFsID0gKDcqY2ljLT5zZWVrX3RvdGFsICsgKHU2NCkyNTYqc2Rpc3QpIC8gODsKKwkJY2ZxZC0+bmV3X3NlZWtfbWVhbiA9IGNmcWQtPm5ld19zZWVrX3RvdGFsIC8gMjU2OworCX0KKwogCS8qCiAJICogRG9uJ3QgYWxsb3cgdGhlIHNlZWsgZGlzdGFuY2UgdG8gZ2V0IHRvbyBsYXJnZSBmcm9tIHRoZQogCSAqIG9kZCBmcmFnbWVudCwgcGFnZWluLCBldGMKQEAgLTE1NTgsNyArMTU5OSwxMiBAQAogY2ZxX3VwZGF0ZV9pZGxlX3dpbmRvdyhzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQsIHN0cnVjdCBjZnFfcXVldWUgKmNmcXEsCiAJCSAgICAgICBzdHJ1Y3QgY2ZxX2lvX2NvbnRleHQgKmNpYykKIHsKLQlpbnQgZW5hYmxlX2lkbGUgPSBjZnFfY2ZxcV9pZGxlX3dpbmRvdyhjZnFxKTsKKwlpbnQgZW5hYmxlX2lkbGU7CisKKwlpZiAoIWNmcV9jZnFxX3N5bmMoY2ZxcSkpCisJCXJldHVybjsKKworCWVuYWJsZV9pZGxlID0gY2ZxX2NmcXFfaWRsZV93aW5kb3coY2ZxcSk7CiAKIAlpZiAoIWNpYy0+aW9jLT50YXNrIHx8ICFjZnFkLT5jZnFfc2xpY2VfaWRsZSB8fAogCSAgICAoY2ZxZC0+aHdfdGFnICYmIENJQ19TRUVLWShjaWMpKSkKQEAgLTE1ODQsMjQgKzE2MzAsMjggQEAKIGNmcV9zaG91bGRfcHJlZW1wdChzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQsIHN0cnVjdCBjZnFfcXVldWUgKm5ld19jZnFxLAogCQkgICBzdHJ1Y3QgcmVxdWVzdCAqcnEpCiB7Ci0Jc3RydWN0IGNmcV9xdWV1ZSAqY2ZxcSA9IGNmcWQtPmFjdGl2ZV9xdWV1ZTsKKwlzdHJ1Y3QgY2ZxX3F1ZXVlICpjZnFxOworCisJY2ZxcSA9IGNmcWQtPmFjdGl2ZV9xdWV1ZTsKKwlpZiAoIWNmcXEpCisJCXJldHVybiAwOworCisJaWYgKGNmcV9zbGljZV91c2VkKGNmcXEpKQorCQlyZXR1cm4gMTsKIAogCWlmIChjZnFfY2xhc3NfaWRsZShuZXdfY2ZxcSkpCiAJCXJldHVybiAwOwogCi0JaWYgKCFjZnFxKQotCQlyZXR1cm4gMDsKLQogCWlmIChjZnFfY2xhc3NfaWRsZShjZnFxKSkKIAkJcmV0dXJuIDE7Ci0JaWYgKCFjZnFfY2ZxcV93YWl0X3JlcXVlc3QobmV3X2NmcXEpKQotCQlyZXR1cm4gMDsKKwogCS8qCiAJICogaWYgdGhlIG5ldyByZXF1ZXN0IGlzIHN5bmMsIGJ1dCB0aGUgY3VycmVudGx5IHJ1bm5pbmcgcXVldWUgaXMKIAkgKiBub3QsIGxldCB0aGUgc3luYyByZXF1ZXN0IGhhdmUgcHJpb3JpdHkuCiAJICovCiAJaWYgKHJxX2lzX3N5bmMocnEpICYmICFjZnFfY2ZxcV9zeW5jKGNmcXEpKQogCQlyZXR1cm4gMTsKKwogCS8qCiAJICogU28gYm90aCBxdWV1ZXMgYXJlIHN5bmMuIExldCB0aGUgbmV3IHJlcXVlc3QgZ2V0IGRpc2sgdGltZSBpZgogCSAqIGl0J3MgYSBtZXRhZGF0YSByZXF1ZXN0IGFuZCB0aGUgY3VycmVudCBxdWV1ZSBpcyBkb2luZyByZWd1bGFyIElPLgpAQCAtMTYwOSw2ICsxNjU5LDE2IEBACiAJaWYgKHJxX2lzX21ldGEocnEpICYmICFjZnFxLT5tZXRhX3BlbmRpbmcpCiAJCXJldHVybiAxOwogCisJaWYgKCFjZnFkLT5hY3RpdmVfY2ljIHx8ICFjZnFfY2ZxcV93YWl0X3JlcXVlc3QoY2ZxcSkpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBpZiB0aGlzIHJlcXVlc3QgaXMgYXMtZ29vZCBhcyBvbmUgd2Ugd291bGQgZXhwZWN0IGZyb20gdGhlCisJICogY3VycmVudCBjZnFxLCBsZXQgaXQgcHJlZW1wdAorCSAqLworCWlmIChjZnFfcnFfY2xvc2UoY2ZxZCwgcnEpKQorCQlyZXR1cm4gMTsKKwogCXJldHVybiAwOwogfQogCkBAIC0xNjE4LDE0ICsxNjc4LDE1IEBACiAgKi8KIHN0YXRpYyB2b2lkIGNmcV9wcmVlbXB0X3F1ZXVlKHN0cnVjdCBjZnFfZGF0YSAqY2ZxZCwgc3RydWN0IGNmcV9xdWV1ZSAqY2ZxcSkKIHsKLQljZnFfc2xpY2VfZXhwaXJlZChjZnFkLCAxLCAxKTsKKwljZnFfc2xpY2VfZXhwaXJlZChjZnFkLCAxKTsKIAogCS8qCiAJICogUHV0IHRoZSBuZXcgcXVldWUgYXQgdGhlIGZyb250IG9mIHRoZSBvZiB0aGUgY3VycmVudCBsaXN0LAogCSAqIHNvIHdlIGtub3cgdGhhdCBpdCB3aWxsIGJlIHNlbGVjdGVkIG5leHQuCiAJICovCiAJQlVHX09OKCFjZnFfY2ZxcV9vbl9ycihjZnFxKSk7Ci0JbGlzdF9tb3ZlKCZjZnFxLT5jZnFfbGlzdCwgJmNmcWQtPmN1cl9ycik7CisKKwljZnFfc2VydmljZV90cmVlX2FkZChjZnFkLCBjZnFxLCAxKTsKIAogCWNmcXEtPnNsaWNlX2VuZCA9IDA7CiAJY2ZxX21hcmtfY2ZxcV9zbGljZV9uZXcoY2ZxcSk7CkBAIC0xNjQ0LDI4ICsxNzA1LDEyIEBACiAJaWYgKHJxX2lzX21ldGEocnEpKQogCQljZnFxLT5tZXRhX3BlbmRpbmcrKzsKIAotCS8qCi0JICogd2UgbmV2ZXIgd2FpdCBmb3IgYW4gYXN5bmMgcmVxdWVzdCBhbmQgd2UgZG9uJ3QgYWxsb3cgcHJlZW1wdGlvbgotCSAqIG9mIGFuIGFzeW5jIHJlcXVlc3QuIHNvIGp1c3QgcmV0dXJuIGVhcmx5Ci0JICovCi0JaWYgKCFycV9pc19zeW5jKHJxKSkgewotCQkvKgotCQkgKiBzeW5jIHByb2Nlc3MgaXNzdWVkIGFuIGFzeW5jIHJlcXVlc3QsIGlmIGl0J3Mgd2FpdGluZwotCQkgKiB0aGVuIGV4cGlyZSBpdCBhbmQga2ljayBycSBoYW5kbGluZy4KLQkJICovCi0JCWlmIChjaWMgPT0gY2ZxZC0+YWN0aXZlX2NpYyAmJgotCQkgICAgZGVsX3RpbWVyKCZjZnFkLT5pZGxlX3NsaWNlX3RpbWVyKSkgewotCQkJY2ZxX3NsaWNlX2V4cGlyZWQoY2ZxZCwgMCwgMCk7Ci0JCQlibGtfc3RhcnRfcXVldWVpbmcoY2ZxZC0+cXVldWUpOwotCQl9Ci0JCXJldHVybjsKLQl9Ci0KIAljZnFfdXBkYXRlX2lvX3RoaW5rdGltZShjZnFkLCBjaWMpOwotCWNmcV91cGRhdGVfaW9fc2Vla3RpbWUoY2ljLCBycSk7CisJY2ZxX3VwZGF0ZV9pb19zZWVrdGltZShjZnFkLCBjaWMsIHJxKTsKIAljZnFfdXBkYXRlX2lkbGVfd2luZG93KGNmcWQsIGNmcXEsIGNpYyk7CiAKIAljaWMtPmxhc3RfcmVxdWVzdF9wb3MgPSBycS0+c2VjdG9yICsgcnEtPm5yX3NlY3RvcnM7CisJY2ZxcS0+bGFzdF9yZXF1ZXN0X3BvcyA9IGNpYy0+bGFzdF9yZXF1ZXN0X3BvczsKIAogCWlmIChjZnFxID09IGNmcWQtPmFjdGl2ZV9xdWV1ZSkgewogCQkvKgpAQCAtMTcxNCwxNiArMTc1OSwxNiBAQAogCW5vdyA9IGppZmZpZXM7CiAKIAlXQVJOX09OKCFjZnFkLT5ycV9pbl9kcml2ZXIpOwotCVdBUk5fT04oIWNmcXEtPm9uX2Rpc3BhdGNoW3N5bmNdKTsKKwlXQVJOX09OKCFjZnFxLT5kaXNwYXRjaGVkKTsKIAljZnFkLT5ycV9pbl9kcml2ZXItLTsKLQljZnFxLT5vbl9kaXNwYXRjaFtzeW5jXS0tOwotCWNmcXEtPnNlcnZpY2VfbGFzdCA9IG5vdzsKKwljZnFxLT5kaXNwYXRjaGVkLS07CisKKwlpZiAoY2ZxX2NmcXFfc3luYyhjZnFxKSkKKwkJY2ZxZC0+c3luY19mbGlnaHQtLTsKIAogCWlmICghY2ZxX2NsYXNzX2lkbGUoY2ZxcSkpCiAJCWNmcWQtPmxhc3RfZW5kX3JlcXVlc3QgPSBub3c7CiAKLQljZnFfcmVzb3J0X3JyX2xpc3QoY2ZxcSwgMCk7Ci0KIAlpZiAoc3luYykKIAkJUlFfQ0lDKHJxKS0+bGFzdF9lbmRfcmVxdWVzdCA9IG5vdzsKIApAQCAtMTczNywxMiArMTc4MiwxMyBAQAogCQkJY2ZxX2NsZWFyX2NmcXFfc2xpY2VfbmV3KGNmcXEpOwogCQl9CiAJCWlmIChjZnFfc2xpY2VfdXNlZChjZnFxKSkKLQkJCWNmcV9zbGljZV9leHBpcmVkKGNmcWQsIDAsIDEpOwotCQllbHNlIGlmIChzeW5jICYmIFJCX0VNUFRZX1JPT1QoJmNmcXEtPnNvcnRfbGlzdCkpIHsKLQkJCWlmICghY2ZxX2FybV9zbGljZV90aW1lcihjZnFkKSkKLQkJCQljZnFfc2NoZWR1bGVfZGlzcGF0Y2goY2ZxZCk7Ci0JCX0KKwkJCWNmcV9zbGljZV9leHBpcmVkKGNmcWQsIDEpOworCQllbHNlIGlmIChzeW5jICYmIFJCX0VNUFRZX1JPT1QoJmNmcXEtPnNvcnRfbGlzdCkpCisJCQljZnFfYXJtX3NsaWNlX3RpbWVyKGNmcWQpOwogCX0KKworCWlmICghY2ZxZC0+cnFfaW5fZHJpdmVyKQorCQljZnFfc2NoZWR1bGVfZGlzcGF0Y2goY2ZxZCk7CiB9CiAKIC8qCkBAIC0xNzUxLDkgKzE3OTcsNiBAQAogICovCiBzdGF0aWMgdm9pZCBjZnFfcHJpb19ib29zdChzdHJ1Y3QgY2ZxX3F1ZXVlICpjZnFxKQogewotCWNvbnN0IGludCBpb3ByaW9fY2xhc3MgPSBjZnFxLT5pb3ByaW9fY2xhc3M7Ci0JY29uc3QgaW50IGlvcHJpbyA9IGNmcXEtPmlvcHJpbzsKLQogCWlmIChoYXNfZnNfZXhjbCgpKSB7CiAJCS8qCiAJCSAqIGJvb3N0IGlkbGUgcHJpbyBvbiB0cmFuc2FjdGlvbnMgdGhhdCB3b3VsZCBsb2NrIG91dCBvdGhlcgpAQCAtMTc3MiwxMiArMTgxNSw2IEBACiAJCWlmIChjZnFxLT5pb3ByaW8gIT0gY2ZxcS0+b3JnX2lvcHJpbykKIAkJCWNmcXEtPmlvcHJpbyA9IGNmcXEtPm9yZ19pb3ByaW87CiAJfQotCi0JLyoKLQkgKiByZWZpbGUgYmV0d2VlbiByb3VuZC1yb2JpbiBsaXN0cyBpZiB3ZSBtb3ZlZCB0aGUgcHJpb3JpdHkgY2xhc3MKLQkgKi8KLQlpZiAoKGlvcHJpb19jbGFzcyAhPSBjZnFxLT5pb3ByaW9fY2xhc3MgfHwgaW9wcmlvICE9IGNmcXEtPmlvcHJpbykpCi0JCWNmcV9yZXNvcnRfcnJfbGlzdChjZnFxLCAwKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgX19jZnFfbWF5X3F1ZXVlKHN0cnVjdCBjZnFfcXVldWUgKmNmcXEpCkBAIC0xNzk1LDEwICsxODMyLDggQEAKIHsKIAlzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQgPSBxLT5lbGV2YXRvci0+ZWxldmF0b3JfZGF0YTsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7CisJc3RydWN0IGNmcV9pb19jb250ZXh0ICpjaWM7CiAJc3RydWN0IGNmcV9xdWV1ZSAqY2ZxcTsKLQl1bnNpZ25lZCBpbnQga2V5OwotCi0Ja2V5ID0gY2ZxX3F1ZXVlX3BpZCh0c2ssIHJ3LCBydyAmIFJFUV9SV19TWU5DKTsKIAogCS8qCiAJICogZG9uJ3QgZm9yY2Ugc2V0dXAgb2YgYSBxdWV1ZSBmcm9tIGhlcmUsIGFzIGEgY2FsbCB0byBtYXlfcXVldWUKQEAgLTE4MDYsNyArMTg0MSwxMSBAQAogCSAqIHNvIGp1c3QgbG9va3VwIGEgcG9zc2libHkgZXhpc3RpbmcgcXVldWUsIG9yIHJldHVybiAnbWF5IHF1ZXVlJwogCSAqIGlmIHRoYXQgZmFpbHMKIAkgKi8KLQljZnFxID0gY2ZxX2ZpbmRfY2ZxX2hhc2goY2ZxZCwga2V5LCB0c2stPmlvcHJpbyk7CisJY2ljID0gY2ZxX2NpY19yYl9sb29rdXAoY2ZxZCwgdHNrLT5pb19jb250ZXh0KTsKKwlpZiAoIWNpYykKKwkJcmV0dXJuIEVMVl9NUVVFVUVfTUFZOworCisJY2ZxcSA9IGNpY190b19jZnFxKGNpYywgcncgJiBSRVFfUldfU1lOQyk7CiAJaWYgKGNmcXEpIHsKIAkJY2ZxX2luaXRfcHJpb19kYXRhKGNmcXEpOwogCQljZnFfcHJpb19ib29zdChjZnFxKTsKQEAgLTE4NTAsNyArMTg4OSw2IEBACiAJc3RydWN0IGNmcV9pb19jb250ZXh0ICpjaWM7CiAJY29uc3QgaW50IHJ3ID0gcnFfZGF0YV9kaXIocnEpOwogCWNvbnN0IGludCBpc19zeW5jID0gcnFfaXNfc3luYyhycSk7Ci0JcGlkX3Qga2V5ID0gY2ZxX3F1ZXVlX3BpZCh0c2ssIHJ3LCBpc19zeW5jKTsKIAlzdHJ1Y3QgY2ZxX3F1ZXVlICpjZnFxOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKQEAgLTE4NjMsMTQgKzE5MDEsMTUgQEAKIAlpZiAoIWNpYykKIAkJZ290byBxdWV1ZV9mYWlsOwogCi0JaWYgKCFjaWMtPmNmcXFbaXNfc3luY10pIHsKLQkJY2ZxcSA9IGNmcV9nZXRfcXVldWUoY2ZxZCwga2V5LCB0c2ssIGdmcF9tYXNrKTsKKwljZnFxID0gY2ljX3RvX2NmcXEoY2ljLCBpc19zeW5jKTsKKwlpZiAoIWNmcXEpIHsKKwkJY2ZxcSA9IGNmcV9nZXRfcXVldWUoY2ZxZCwgaXNfc3luYywgdHNrLCBnZnBfbWFzayk7CisKIAkJaWYgKCFjZnFxKQogCQkJZ290byBxdWV1ZV9mYWlsOwogCi0JCWNpYy0+Y2ZxcVtpc19zeW5jXSA9IGNmcXE7Ci0JfSBlbHNlCi0JCWNmcXEgPSBjaWMtPmNmcXFbaXNfc3luY107CisJCWNpY19zZXRfY2ZxcShjaWMsIGNmcXEsIGlzX3N5bmMpOworCX0KIAogCWNmcXEtPmFsbG9jYXRlZFtyd10rKzsKIAljZnFfY2xlYXJfY2ZxcV9tdXN0X2FsbG9jKGNmcXEpOwpAQCAtMTk0MCw3ICsxOTc5LDcgQEAKIAkJfQogCX0KIGV4cGlyZToKLQljZnFfc2xpY2VfZXhwaXJlZChjZnFkLCAwLCB0aW1lZF9vdXQpOworCWNmcV9zbGljZV9leHBpcmVkKGNmcWQsIHRpbWVkX291dCk7CiBvdXRfa2ljazoKIAljZnFfc2NoZWR1bGVfZGlzcGF0Y2goY2ZxZCk7CiBvdXRfY29udDoKQEAgLTE5ODYsNyArMjAyNSw3IEBACiAJc3Bpbl9sb2NrX2lycShxLT5xdWV1ZV9sb2NrKTsKIAogCWlmIChjZnFkLT5hY3RpdmVfcXVldWUpCi0JCV9fY2ZxX3NsaWNlX2V4cGlyZWQoY2ZxZCwgY2ZxZC0+YWN0aXZlX3F1ZXVlLCAwLCAwKTsKKwkJX19jZnFfc2xpY2VfZXhwaXJlZChjZnFkLCBjZnFkLT5hY3RpdmVfcXVldWUsIDApOwogCiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZjZnFkLT5jaWNfbGlzdCkpIHsKIAkJc3RydWN0IGNmcV9pb19jb250ZXh0ICpjaWMgPSBsaXN0X2VudHJ5KGNmcWQtPmNpY19saXN0Lm5leHQsCkBAIC0yMDAwLDE0ICsyMDM5LDEyIEBACiAKIAljZnFfc2h1dGRvd25fdGltZXJfd3EoY2ZxZCk7CiAKLQlrZnJlZShjZnFkLT5jZnFfaGFzaCk7CiAJa2ZyZWUoY2ZxZCk7CiB9CiAKIHN0YXRpYyB2b2lkICpjZnFfaW5pdF9xdWV1ZShyZXF1ZXN0X3F1ZXVlX3QgKnEpCiB7CiAJc3RydWN0IGNmcV9kYXRhICpjZnFkOwotCWludCBpOwogCiAJY2ZxZCA9IGttYWxsb2Nfbm9kZShzaXplb2YoKmNmcWQpLCBHRlBfS0VSTkVMLCBxLT5ub2RlKTsKIAlpZiAoIWNmcWQpCkBAIC0yMDE1LDIxICsyMDUyLDkgQEAKIAogCW1lbXNldChjZnFkLCAwLCBzaXplb2YoKmNmcWQpKTsKIAotCWZvciAoaSA9IDA7IGkgPCBDRlFfUFJJT19MSVNUUzsgaSsrKQotCQlJTklUX0xJU1RfSEVBRCgmY2ZxZC0+cnJfbGlzdFtpXSk7Ci0KLQlJTklUX0xJU1RfSEVBRCgmY2ZxZC0+YnVzeV9ycik7Ci0JSU5JVF9MSVNUX0hFQUQoJmNmcWQtPmN1cl9ycik7Ci0JSU5JVF9MSVNUX0hFQUQoJmNmcWQtPmlkbGVfcnIpOworCWNmcWQtPnNlcnZpY2VfdHJlZSA9IENGUV9SQl9ST09UOwogCUlOSVRfTElTVF9IRUFEKCZjZnFkLT5jaWNfbGlzdCk7CiAKLQljZnFkLT5jZnFfaGFzaCA9IGttYWxsb2Nfbm9kZShzaXplb2Yoc3RydWN0IGhsaXN0X2hlYWQpICogQ0ZRX1FIQVNIX0VOVFJJRVMsIEdGUF9LRVJORUwsIHEtPm5vZGUpOwotCWlmICghY2ZxZC0+Y2ZxX2hhc2gpCi0JCWdvdG8gb3V0X2ZyZWU7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQ0ZRX1FIQVNIX0VOVFJJRVM7IGkrKykKLQkJSU5JVF9ITElTVF9IRUFEKCZjZnFkLT5jZnFfaGFzaFtpXSk7Ci0KIAljZnFkLT5xdWV1ZSA9IHE7CiAKIAlpbml0X3RpbWVyKCZjZnFkLT5pZGxlX3NsaWNlX3RpbWVyKTsKQEAgLTIwNTMsOSArMjA3OCw2IEBACiAJY2ZxZC0+Y2ZxX3NsaWNlX2lkbGUgPSBjZnFfc2xpY2VfaWRsZTsKIAogCXJldHVybiBjZnFkOwotb3V0X2ZyZWU6Ci0Ja2ZyZWUoY2ZxZCk7Ci0JcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyB2b2lkIGNmcV9zbGFiX2tpbGwodm9pZCkKQEAgLTIwODcsNyArMjEwOSw2IEBACiAvKgogICogc3lzZnMgcGFydHMgYmVsb3cgLS0+CiAgKi8KLQogc3RhdGljIHNzaXplX3QKIGNmcV92YXJfc2hvdyh1bnNpZ25lZCBpbnQgdmFyLCBjaGFyICpwYWdlKQogewpkaWZmIC0tZ2l0IGEvYmxvY2svZWxldmF0b3IuYyBiL2Jsb2NrL2VsZXZhdG9yLmMKaW5kZXggOTZhMDBjOC4uY2U4NjZlYiAxMDA2NDQKLS0tIGEvYmxvY2svZWxldmF0b3IuYworKysgYi9ibG9jay9lbGV2YXRvci5jCkBAIC0xMzQsMTMgKzEzNCwxMyBAQAogewogCXN0cnVjdCBlbGV2YXRvcl90eXBlICplOwogCi0Jc3Bpbl9sb2NrX2lycSgmZWx2X2xpc3RfbG9jayk7CisJc3Bpbl9sb2NrKCZlbHZfbGlzdF9sb2NrKTsKIAogCWUgPSBlbGV2YXRvcl9maW5kKG5hbWUpOwogCWlmIChlICYmICF0cnlfbW9kdWxlX2dldChlLT5lbGV2YXRvcl9vd25lcikpCiAJCWUgPSBOVUxMOwogCi0Jc3Bpbl91bmxvY2tfaXJxKCZlbHZfbGlzdF9sb2NrKTsKKwlzcGluX3VubG9jaygmZWx2X2xpc3RfbG9jayk7CiAKIAlyZXR1cm4gZTsKIH0KQEAgLTk2NSwxMCArOTY1LDExIEBACiBpbnQgZWx2X3JlZ2lzdGVyKHN0cnVjdCBlbGV2YXRvcl90eXBlICplKQogewogCWNoYXIgKmRlZiA9ICIiOwotCXNwaW5fbG9ja19pcnEoJmVsdl9saXN0X2xvY2spOworCisJc3Bpbl9sb2NrKCZlbHZfbGlzdF9sb2NrKTsKIAlCVUdfT04oZWxldmF0b3JfZmluZChlLT5lbGV2YXRvcl9uYW1lKSk7CiAJbGlzdF9hZGRfdGFpbCgmZS0+bGlzdCwgJmVsdl9saXN0KTsKLQlzcGluX3VubG9ja19pcnEoJmVsdl9saXN0X2xvY2spOworCXNwaW5fdW5sb2NrKCZlbHZfbGlzdF9sb2NrKTsKIAogCWlmICghc3RyY21wKGUtPmVsZXZhdG9yX25hbWUsIGNob3Nlbl9lbGV2YXRvcikgfHwKIAkJCSghKmNob3Nlbl9lbGV2YXRvciAmJgpAQCAtOTk4LDkgKzk5OSw5IEBACiAJCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKIAl9CiAKLQlzcGluX2xvY2tfaXJxKCZlbHZfbGlzdF9sb2NrKTsKKwlzcGluX2xvY2soJmVsdl9saXN0X2xvY2spOwogCWxpc3RfZGVsX2luaXQoJmUtPmxpc3QpOwotCXNwaW5fdW5sb2NrX2lycSgmZWx2X2xpc3RfbG9jayk7CisJc3Bpbl91bmxvY2soJmVsdl9saXN0X2xvY2spOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoZWx2X3VucmVnaXN0ZXIpOwogCkBAIC0xMTE4LDcgKzExMTksNyBAQAogCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5OwogCWludCBsZW4gPSAwOwogCi0Jc3Bpbl9sb2NrX2lycSgmZWx2X2xpc3RfbG9jayk7CisJc3Bpbl9sb2NrKCZlbHZfbGlzdF9sb2NrKTsKIAlsaXN0X2Zvcl9lYWNoKGVudHJ5LCAmZWx2X2xpc3QpIHsKIAkJc3RydWN0IGVsZXZhdG9yX3R5cGUgKl9fZTsKIApAQCAtMTEyOCw3ICsxMTI5LDcgQEAKIAkJZWxzZQogCQkJbGVuICs9IHNwcmludGYobmFtZStsZW4sICIlcyAiLCBfX2UtPmVsZXZhdG9yX25hbWUpOwogCX0KLQlzcGluX3VubG9ja19pcnEoJmVsdl9saXN0X2xvY2spOworCXNwaW5fdW5sb2NrKCZlbHZfbGlzdF9sb2NrKTsKIAogCWxlbiArPSBzcHJpbnRmKGxlbituYW1lLCAiXG4iKTsKIAlyZXR1cm4gbGVuOwpkaWZmIC0tZ2l0IGEvYmxvY2svbGxfcndfYmxrLmMgYi9ibG9jay9sbF9yd19ibGsuYwppbmRleCAzZGUwNjk1Li4xMjMwMDNhIDEwMDY0NAotLS0gYS9ibG9jay9sbF9yd19ibGsuYworKysgYi9ibG9jay9sbF9yd19ibGsuYwpAQCAtMzc0MSw2ICszNzQxLDcgQEAKIAkJcmV0LT5ucl9iYXRjaF9yZXF1ZXN0cyA9IDA7IC8qIGJlY2F1c2UgdGhpcyBpcyAwICovCiAJCXJldC0+YWljID0gTlVMTDsKIAkJcmV0LT5jaWNfcm9vdC5yYl9ub2RlID0gTlVMTDsKKwkJcmV0LT5pb2NfZGF0YSA9IE5VTEw7CiAJCS8qIG1ha2Ugc3VyZSBzZXRfdGFza19pb3ByaW8oKSBzZWVzIHRoZSBzZXR0aW5ncyBhYm92ZSAqLwogCQlzbXBfd21iKCk7CiAJCXRzay0+aW9fY29udGV4dCA9IHJldDsKZGlmZiAtLWdpdCBhL2NyeXB0by9taWNoYWVsX21pYy5jIGIvY3J5cHRvL21pY2hhZWxfbWljLmMKaW5kZXggMDk0Mzk3Yi4uOWU5MTdiOCAxMDA2NDQKLS0tIGEvY3J5cHRvL21pY2hhZWxfbWljLmMKKysrIGIvY3J5cHRvL21pY2hhZWxfbWljLmMKQEAgLTMsNyArMyw3IEBACiAgKgogICogTWljaGFlbCBNSUMgKElFRUUgODAyLjExaS9US0lQKSBrZXllZCBkaWdlc3QKICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSm91bmkgTWFsaW5lbiA8amttYWxpbmVAY2MuaHV0LmZpPgorICogQ29weXJpZ2h0IChjKSAyMDA0IEpvdW5pIE1hbGluZW4gPGpAdzEuZmk+CiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCkBAIC0xNzMsNCArMTczLDQgQEAKIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJNaWNoYWVsIE1JQyIpOwotTU9EVUxFX0FVVEhPUigiSm91bmkgTWFsaW5lbiA8amttYWxpbmVAY2MuaHV0LmZpPiIpOworTU9EVUxFX0FVVEhPUigiSm91bmkgTWFsaW5lbiA8akB3MS5maT4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvTWFrZWZpbGUgYi9kcml2ZXJzL01ha2VmaWxlCmluZGV4IDNhNzE4ZjUuLjkyMGM5NzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9NYWtlZmlsZQpAQCAtNzIsNyArNzIsNiBAQAogb2JqLSQoQ09ORklHX01NQykJCSs9IG1tYy8KIG9iai0kKENPTkZJR19ORVdfTEVEUykJCSs9IGxlZHMvCiBvYmotJChDT05GSUdfSU5GSU5JQkFORCkJKz0gaW5maW5pYmFuZC8KLW9iai0kKENPTkZJR19JUEFUSF9DT1JFKQkrPSBpbmZpbmliYW5kLwogb2JqLSQoQ09ORklHX1NHSV9TTikJCSs9IHNuLwogb2JqLXkJCQkJKz0gZmlybXdhcmUvCiBvYmotJChDT05GSUdfQ1JZUFRPKQkJKz0gY3J5cHRvLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL0tjb25maWcgYi9kcml2ZXJzL2FjcGkvS2NvbmZpZwppbmRleCBlMmNlNGE5Li4xMzlmNDFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvS2NvbmZpZworKysgYi9kcml2ZXJzL2FjcGkvS2NvbmZpZwpAQCAtODUsOCArODUsOCBAQAogCWRlcGVuZHMgb24gQUNQSQogCWRlZmF1bHQgeQogCS0tLWhlbHAtLS0KLQkgIFByb2NmcyBpbnRlcmZhY2UgZm9yIEFDUEkgaXMgbWFkZSBvcHRpb25hbCBmb3IgYmFjay1jb21wYXRpYmxlLgotCSAgQXMgdGhlIHNhbWUgZnVuY3Rpb25zIGFyZSBkdXBsaWNhdGVkIGluIHN5c2ZzIGludGVyZmFjZQorCSAgVGhlIFByb2NmcyBpbnRlcmZhY2UgZm9yIEFDUEkgaXMgbWFkZSBvcHRpb25hbCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KKwkgIEFzIHRoZSBzYW1lIGZ1bmN0aW9ucyBhcmUgZHVwbGljYXRlZCBpbiB0aGUgc3lzZnMgaW50ZXJmYWNlCiAJICBhbmQgdGhpcyBwcm9jIGludGVyZmFjZSB3aWxsIGJlIHJlbW92ZWQgc29tZSB0aW1lIGxhdGVyLAogCSAgaXQncyBtYXJrZWQgYXMgZGVwcmVjYXRlZC4KIAkgICggL3Byb2MvYWNwaS9kZWJ1Z19sYXllciAmJiBkZWJ1Z19sZXZlbCBhcmUgZGVwcmVjYXRlZCBieQpAQCAtMjE4LDQzICsyMTgsNiBAQAogCSAgTk9URTogVGhpcyBkcml2ZXIgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBwcm9iYWJseSBiZSByZW1vdmVkIHNvb24sCiAJICB1c2UgYXN1cy1sYXB0b3AgaW5zdGVhZC4KIAotY29uZmlnIEFDUElfSUJNCi0JdHJpc3RhdGUgIklCTSBUaGlua1BhZCBMYXB0b3AgRXh0cmFzIgotCWRlcGVuZHMgb24gWDg2Ci0Jc2VsZWN0IEJBQ0tMSUdIVF9DTEFTU19ERVZJQ0UKLQktLS1oZWxwLS0tCi0JICBUaGlzIGlzIGEgTGludXggQUNQSSBkcml2ZXIgZm9yIHRoZSBJQk0gVGhpbmtQYWQgbGFwdG9wcy4gSXQgYWRkcwotCSAgc3VwcG9ydCBmb3IgRm4tRngga2V5IGNvbWJpbmF0aW9ucywgQmx1ZXRvb3RoIGNvbnRyb2wsIHZpZGVvCi0JICBvdXRwdXQgc3dpdGNoaW5nLCBUaGlua0xpZ2h0IGNvbnRyb2wsIFVsdHJhQmF5IGVqZWN0IGFuZCBtb3JlLgotCSAgRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBkcml2ZXIgc2VlIDxmaWxlOkRvY3VtZW50YXRpb24vaWJtLWFjcGkudHh0PgotCSAgYW5kIDxodHRwOi8vaWJtLWFjcGkuc2YubmV0Lz4gLgotCi0JICBJZiB5b3UgaGF2ZSBhbiBJQk0gVGhpbmtQYWQgbGFwdG9wLCBzYXkgWSBvciBNIGhlcmUuCi0KLWNvbmZpZyBBQ1BJX0lCTV9ET0NLCi0JYm9vbCAiTGVnYWN5IERvY2tpbmcgU3RhdGlvbiBTdXBwb3J0IgotCWRlcGVuZHMgb24gQUNQSV9JQk0KLQlkZXBlbmRzIG9uIEFDUElfRE9DSz1uCi0JZGVmYXVsdCBuCi0JLS0taGVscC0tLQotCSAgQWxsb3dzIHRoZSBpYm1fYWNwaSBkcml2ZXIgdG8gaGFuZGxlIGRvY2tpbmcgc3RhdGlvbiBldmVudHMuCi0JICBUaGlzIHN1cHBvcnQgaXMgb2Jzb2xldGVkIGJ5IENPTkZJR19IT1RQTFVHX1BDSV9BQ1BJLiAgSXQgd2lsbAotCSAgYWxsb3cgbG9ja2luZyBhbmQgcmVtb3ZpbmcgdGhlIGxhcHRvcCBmcm9tIHRoZSBkb2NraW5nIHN0YXRpb24sCi0JICBidXQgd2lsbCBub3QgcHJvcGVybHkgY29ubmVjdCBQQ0kgZGV2aWNlcy4KLQotCSAgSWYgeW91IGFyZSBub3Qgc3VyZSwgc2F5IE4gaGVyZS4KLQotY29uZmlnIEFDUElfSUJNX0JBWQotCWJvb2wgIkxlZ2FjeSBSZW1vdmFibGUgQmF5IFN1cHBvcnQiCi0JZGVwZW5kcyBvbiBBQ1BJX0lCTQotCWRlZmF1bHQgeQotCS0tLWhlbHAtLS0KLQkgIEFsbG93cyB0aGUgaWJtX2FjcGkgZHJpdmVyIHRvIGhhbmRsZSByZW1vdmFibGUgYmF5cy4gIEl0IHdpbGwgYWxsb3cKLQkgIGRpc2FibGluZyB0aGUgZGV2aWNlIGluIHRoZSBiYXksIGFuZCBhbHNvIGdlbmVyYXRlIG5vdGlmaWNhdGlvbnMgd2hlbgotCSAgdGhlIGJheSBsZXZlciBpcyBlamVjdGVkIG9yIGluc2VydGVkLgotCi0JICBJZiB5b3UgYXJlIG5vdCBzdXJlLCBzYXkgWSBoZXJlLgotCiBjb25maWcgQUNQSV9UT1NISUJBCiAJdHJpc3RhdGUgIlRvc2hpYmEgTGFwdG9wIEV4dHJhcyIKIAlkZXBlbmRzIG9uIFg4NgpAQCAtMzg4LDExICszNTEsMTAgQEAKIAogY29uZmlnIEFDUElfU0JTCiAJdHJpc3RhdGUgIlNtYXJ0IEJhdHRlcnkgU3lzdGVtIChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gWDg2ICYmIEkyQworCWRlcGVuZHMgb24gWDg2CiAJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKIAloZWxwCiAJICBUaGlzIGRyaXZlciBhZGRzIHN1cHBvcnQgZm9yIHRoZSBTbWFydCBCYXR0ZXJ5IFN5c3RlbS4KLQkgIERlcGVuZHMgb24gSTJDIChEZXZpY2UgRHJpdmVycyAtLS0+IEkyQyBzdXBwb3J0KQogCSAgQSAiU21hcnQgQmF0dGVyeSIgaXMgcXVpdGUgb2xkIGFuZCBxdWl0ZSByYXJlIGNvbXBhcmVkCiAJICB0byB0b2RheSdzIEFDUEkgIkNvbnRyb2wgTWV0aG9kIiBiYXR0ZXJ5LgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvTWFrZWZpbGUgYi9kcml2ZXJzL2FjcGkvTWFrZWZpbGUKaW5kZXggNTk1NmU5Zi4uZDQzMzZmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvYWNwaS9NYWtlZmlsZQpAQCAtMSw2ICsxLDYgQEAKICMKICMgTWFrZWZpbGUgZm9yIHRoZSBMaW51eCBBQ1BJIGludGVycHJldGVyCi0jIAorIwogCiBleHBvcnQgQUNQSV9DRkxBR1MKIApAQCAtMzIsMTYgKzMyLDE3IEBACiBwcm9jZXNzb3Itb2JqcwkrPSBwcm9jZXNzb3JfY29yZS5vIHByb2Nlc3Nvcl90aHJvdHRsaW5nLm8gXAogCQkJCXByb2Nlc3Nvcl9pZGxlLm8gcHJvY2Vzc29yX3RoZXJtYWwubwogaWZkZWYgQ09ORklHX0NQVV9GUkVRCi1wcm9jZXNzb3Itb2JqcwkrPSBwcm9jZXNzb3JfcGVyZmxpYi5vCQkJCitwcm9jZXNzb3Itb2JqcwkrPSBwcm9jZXNzb3JfcGVyZmxpYi5vCiBlbmRpZgogCiBvYmoteQkJCQkrPSBzbGVlcC8KIG9iai15CQkJCSs9IGJ1cy5vIGdsdWUubwogb2JqLXkJCQkJKz0gc2Nhbi5vCisjIEtlZXAgRUMgZHJpdmVyIGZpcnN0LiBJbml0aWFsaXphdGlvbiBvZiBvdGhlcnMgZGVwZW5kIG9uIGl0Lgorb2JqLSQoQ09ORklHX0FDUElfRUMpCQkrPSBlYy5vCiBvYmotJChDT05GSUdfQUNQSV9BQykgCQkrPSBhYy5vCiBvYmotJChDT05GSUdfQUNQSV9CQVRURVJZKQkrPSBiYXR0ZXJ5Lm8KIG9iai0kKENPTkZJR19BQ1BJX0JVVFRPTikJKz0gYnV0dG9uLm8KLW9iai0kKENPTkZJR19BQ1BJX0VDKQkJKz0gZWMubwogb2JqLSQoQ09ORklHX0FDUElfRkFOKQkJKz0gZmFuLm8KIG9iai0kKENPTkZJR19BQ1BJX0RPQ0spCQkrPSBkb2NrLm8KIG9iai0kKENPTkZJR19BQ1BJX0JBWSkJCSs9IGJheS5vCkBAIC01NSw4ICs1Niw3IEBACiBvYmotJChDT05GSUdfQUNQSV9ERUJVRykJKz0gZGVidWcubwogb2JqLSQoQ09ORklHX0FDUElfTlVNQSkJCSs9IG51bWEubwogb2JqLSQoQ09ORklHX0FDUElfQVNVUykJCSs9IGFzdXNfYWNwaS5vCi1vYmotJChDT05GSUdfQUNQSV9JQk0pCQkrPSBpYm1fYWNwaS5vCiBvYmotJChDT05GSUdfQUNQSV9UT1NISUJBKQkrPSB0b3NoaWJhX2FjcGkubwogb2JqLSQoQ09ORklHX0FDUElfSE9UUExVR19NRU1PUlkpCSs9IGFjcGlfbWVtaG90cGx1Zy5vCiBvYmoteQkJCQkrPSBjbV9zYnMubwotb2JqLSQoQ09ORklHX0FDUElfU0JTKQkJKz0gaTJjX2VjLm8gc2JzLm8KK29iai0kKENPTkZJR19BQ1BJX1NCUykJCSs9IHNicy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaV9tZW1ob3RwbHVnLmMgYi9kcml2ZXJzL2FjcGkvYWNwaV9tZW1ob3RwbHVnLmMKaW5kZXggYzI2MTcyNi4uZTY1NjI4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGlfbWVtaG90cGx1Zy5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpX21lbWhvdHBsdWcuYwpAQCAtNDQsMTEgKzQ0LDYgQEAKIE1PRFVMRV9ERVNDUklQVElPTigiSG90cGx1ZyBNZW0gRHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKLS8qIEFDUEkgX1NUQSBtZXRob2QgdmFsdWVzICovCi0jZGVmaW5lIEFDUElfTUVNT1JZX1NUQV9QUkVTRU5UCQkoMHgwMDAwMDAwMVVMKQotI2RlZmluZSBBQ1BJX01FTU9SWV9TVEFfRU5BQkxFRAkJKDB4MDAwMDAwMDJVTCkKLSNkZWZpbmUgQUNQSV9NRU1PUllfU1RBX0ZVTkNUSU9OQUwJKDB4MDAwMDAwMDhVTCkKLQogLyogTWVtb3J5IERldmljZSBTdGF0ZXMgKi8KICNkZWZpbmUgTUVNT1JZX0lOVkFMSURfU1RBVEUJMAogI2RlZmluZSBNRU1PUllfUE9XRVJfT05fU1RBVEUJMQpAQCAtMjA0LDkgKzE5OSw5IEBACiAJICogQ2hlY2sgZm9yIGRldmljZSBzdGF0dXMuIERldmljZSBzaG91bGQgYmUKIAkgKiBwcmVzZW50L2VuYWJsZWQvZnVuY3Rpb25pbmcuCiAJICovCi0JaWYgKCEoKGN1cnJlbnRfc3RhdHVzICYgQUNQSV9NRU1PUllfU1RBX1BSRVNFTlQpCi0JICAgICAgJiYgKGN1cnJlbnRfc3RhdHVzICYgQUNQSV9NRU1PUllfU1RBX0VOQUJMRUQpCi0JICAgICAgJiYgKGN1cnJlbnRfc3RhdHVzICYgQUNQSV9NRU1PUllfU1RBX0ZVTkNUSU9OQUwpKSkKKwlpZiAoISgoY3VycmVudF9zdGF0dXMgJiBBQ1BJX1NUQV9ERVZJQ0VfUFJFU0VOVCkKKwkgICAgICAmJiAoY3VycmVudF9zdGF0dXMgJiBBQ1BJX1NUQV9ERVZJQ0VfRU5BQkxFRCkKKwkgICAgICAmJiAoY3VycmVudF9zdGF0dXMgJiBBQ1BJX1NUQV9ERVZJQ0VfRlVOQ1RJT05JTkcpKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAlyZXR1cm4gMDsKQEAgLTI4Niw3ICsyODEsNyBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAogCS8qIENoZWNrIGZvciBkZXZpY2Ugc3RhdHVzLiAgRGV2aWNlIHNob3VsZCBiZSBkaXNhYmxlZCAqLwotCWlmIChjdXJyZW50X3N0YXR1cyAmIEFDUElfTUVNT1JZX1NUQV9FTkFCTEVEKQorCWlmIChjdXJyZW50X3N0YXR1cyAmIEFDUElfU1RBX0RFVklDRV9FTkFCTEVEKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2J1cy5jIGIvZHJpdmVycy9hY3BpL2J1cy5jCmluZGV4IGRkNDllYTAuLmU1MDg0ZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9idXMuYworKysgYi9kcml2ZXJzL2FjcGkvYnVzLmMKQEAgLTEwMyw3ICsxMDMsOSBAQAogCWVsc2UgaWYgKGRldmljZS0+cGFyZW50KQogCQlkZXZpY2UtPnN0YXR1cyA9IGRldmljZS0+cGFyZW50LT5zdGF0dXM7CiAJZWxzZQotCQlTVFJVQ1RfVE9fSU5UKGRldmljZS0+c3RhdHVzKSA9IDB4MEY7CisJCVNUUlVDVF9UT19JTlQoZGV2aWNlLT5zdGF0dXMpID0KKwkJICAgIEFDUElfU1RBX0RFVklDRV9QUkVTRU5UIHwgQUNQSV9TVEFfREVWSUNFX0VOQUJMRUQgfAorCQkgICAgQUNQSV9TVEFfREVWSUNFX1VJICAgICAgfCBBQ1BJX1NUQV9ERVZJQ0VfRlVOQ1RJT05JTkc7CiAKIAlpZiAoZGV2aWNlLT5zdGF0dXMuZnVuY3Rpb25hbCAmJiAhZGV2aWNlLT5zdGF0dXMucHJlc2VudCkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HIFBSRUZJWCAiRGV2aWNlIFslc10gc3RhdHVzIFslMDh4XTogIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2NvbnRhaW5lci5jIGIvZHJpdmVycy9hY3BpL2NvbnRhaW5lci5jCmluZGV4IDA5MzBkOTQuLjBkZDNiZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9jb250YWluZXIuYworKysgYi9kcml2ZXJzL2FjcGkvY29udGFpbmVyLmMKQEAgLTQ5LDggKzQ5LDYgQEAKIE1PRFVMRV9ERVNDUklQVElPTigiQUNQSSBjb250YWluZXIgZHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKLSNkZWZpbmUgQUNQSV9TVEFfUFJFU0VOVAkJKDB4MDAwMDAwMDEpCi0KIHN0YXRpYyBpbnQgYWNwaV9jb250YWluZXJfYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKIHN0YXRpYyBpbnQgYWNwaV9jb250YWluZXJfcmVtb3ZlKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgdHlwZSk7CiAKQEAgLTc1LDEzICs3MywxMyBAQAogCiAJc3RhdHVzID0gYWNwaV9nZXRfaGFuZGxlKGhhbmRsZSwgIl9TVEEiLCAmdGVtcCk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQotCQlyZXR1cm4gMTsJLyogX1NUQSBub3QgZm91bmQsIGFzc211ZSBkZXZpY2UgcHJlc2VudCAqLworCQlyZXR1cm4gMTsJLyogX1NUQSBub3QgZm91bmQsIGFzc3VtZSBkZXZpY2UgcHJlc2VudCAqLwogCiAJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKGhhbmRsZSwgIl9TVEEiLCBOVUxMLCAmc3RhKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCiAJCXJldHVybiAwOwkvKiBGaXJtd2FyZSBlcnJvciAqLwogCi0JcmV0dXJuICgoc3RhICYgQUNQSV9TVEFfUFJFU0VOVCkgPT0gQUNQSV9TVEFfUFJFU0VOVCk7CisJcmV0dXJuICgoc3RhICYgQUNQSV9TVEFfREVWSUNFX1BSRVNFTlQpID09IEFDUElfU1RBX0RFVklDRV9QUkVTRU5UKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZG9jay5jIGIvZHJpdmVycy9hY3BpL2RvY2suYwppbmRleCA1NGE2OTdmLi40NTQ2YmY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZG9jay5jCisrKyBiL2RyaXZlcnMvYWNwaS9kb2NrLmMKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KICNpbmNsdWRlIDxhY3BpL2FjcGlfYnVzLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BpX2RyaXZlcnMuaD4KIApAQCAtNjY3LDYgKzY2OCwyMyBAQAogfQogREVWSUNFX0FUVFIodW5kb2NrLCBTX0lXVVNSLCBOVUxMLCB3cml0ZV91bmRvY2spOwogCisvKgorICogc2hvd19kb2NrX3VpZCAtIHJlYWQgbWV0aG9kIGZvciAidWlkIiBmaWxlIGluIHN5c2ZzCisgKi8KK3N0YXRpYyBzc2l6ZV90IHNob3dfZG9ja191aWQoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXVuc2lnbmVkIGxvbmcgbGJ1ZjsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX2ludGVnZXIoZG9ja19zdGF0aW9uLT5oYW5kbGUsICJfVUlEIiwgTlVMTCwgJmxidWYpOworCWlmKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJICAgIHJldHVybiAwOworCX0KKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlbHhcbiIsIGxidWYpOworfQorREVWSUNFX0FUVFIodWlkLCBTX0lSVUdPLCBzaG93X2RvY2tfdWlkLCBOVUxMKTsKKworCisKIC8qKgogICogZG9ja19hZGQgLSBhZGQgYSBuZXcgZG9jayBzdGF0aW9uCiAgKiBAaGFuZGxlOiB0aGUgZG9jayBzdGF0aW9uIGhhbmRsZQpAQCAtNzE1LDYgKzczMywxMyBAQAogCQlrZnJlZShkb2NrX3N0YXRpb24pOwogCQlyZXR1cm4gcmV0OwogCX0KKwlyZXQgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmRvY2tfZGV2aWNlLmRldiwgJmRldl9hdHRyX3VpZCk7CisJaWYgKHJldCkgeworCQlwcmludGsoIkVycm9yICVkIGFkZGluZyBzeXNmcyBmaWxlXG4iLCByZXQpOworCQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcigmZG9ja19kZXZpY2UpOworCQlrZnJlZShkb2NrX3N0YXRpb24pOworCQlyZXR1cm4gcmV0OworCX0KIAogCS8qIEZpbmQgZGVwZW5kZW50IGRldmljZXMgKi8KIAlhY3BpX3dhbGtfbmFtZXNwYWNlKEFDUElfVFlQRV9ERVZJQ0UsIEFDUElfUk9PVF9PQkpFQ1QsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZWMuYyBiL2RyaXZlcnMvYWNwaS9lYy5jCmluZGV4IGE4MDI5NjIuLmUwOGNmOTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9lYy5jCisrKyBiL2RyaXZlcnMvYWNwaS9lYy5jCkBAIC0xLDYgKzEsOCBAQAogLyoKLSAqICBhY3BpX2VjLmMgLSBBQ1BJIEVtYmVkZGVkIENvbnRyb2xsZXIgRHJpdmVyICgkUmV2aXNpb246IDM4ICQpCisgKiAgZWMuYyAtIEFDUEkgRW1iZWRkZWQgQ29udHJvbGxlciBEcml2ZXIgKHYyLjApCiAgKgorICogIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNyBBbGV4ZXkgU3Rhcmlrb3Zza2l5IDxhbGV4ZXkueS5zdGFyaWtvdnNraXlAaW50ZWwuY29tPgorICogIENvcHlyaWdodCAoQykgMjAwNiBEZW5pcyBTYWR5a292IDxkZW5pcy5tLnNhZHlrb3ZAaW50ZWwuY29tPgogICogIENvcHlyaWdodCAoQykgMjAwNCBMdW1pbmcgWXUgPGx1bWluZy55dUBpbnRlbC5jb20+CiAgKiAgQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyIEFuZHkgR3JvdmVyIDxhbmRyZXcuZ3JvdmVyQGludGVsLmNvbT4KICAqICBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIgUGF1bCBEaWVmZW5iYXVnaCA8cGF1bC5zLmRpZWZlbmJhdWdoQGludGVsLmNvbT4KQEAgLTkxLDkgKzkzLDkgQEAKIH07CiAKIC8qIElmIHdlIGZpbmQgYW4gRUMgdmlhIHRoZSBFQ0RULCB3ZSBuZWVkIHRvIGtlZXAgYSBwdHIgdG8gaXRzIGNvbnRleHQgKi8KKy8qIEV4dGVybmFsIGludGVyZmFjZXMgdXNlIGZpcnN0IEVDIG9ubHksIHNvIHJlbWVtYmVyICovCiBzdGF0aWMgc3RydWN0IGFjcGlfZWMgewogCWFjcGlfaGFuZGxlIGhhbmRsZTsKLQl1bnNpZ25lZCBsb25nIHVpZDsKIAl1bnNpZ25lZCBsb25nIGdwZTsKIAl1bnNpZ25lZCBsb25nIGNvbW1hbmRfYWRkcjsKIAl1bnNpZ25lZCBsb25nIGRhdGFfYWRkcjsKQEAgLTEwMSwxMiArMTAzLDggQEAKIAlzdHJ1Y3QgbXV0ZXggbG9jazsKIAlhdG9taWNfdCBxdWVyeV9wZW5kaW5nOwogCWF0b21pY190IGV2ZW50X2NvdW50OwotCWF0b21pY190IGxlYXZpbmdfYnVyc3Q7CS8qIDAgOiBObywgMSA6IFllcywgMjogYWJvcnQgKi8KIAl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0OwotfSAqZWNfZWNkdDsKLQotLyogRXh0ZXJuYWwgaW50ZXJmYWNlcyB1c2UgZmlyc3QgRUMgb25seSwgc28gcmVtZW1iZXIgKi8KLXN0YXRpYyBzdHJ1Y3QgYWNwaV9kZXZpY2UgKmZpcnN0X2VjOworfSAqYm9vdF9lYywgKmZpcnN0X2VjOwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2FjdGlvbiBNYW5hZ2VtZW50CkBAIC0xNzMsNTYgKzE3MSw2IEBACiAJcmV0dXJuIC1FVElNRTsKIH0KIAotI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCi0vKgotICogTm90ZTogc2Ftc3VuZyBudjUwMDAgZG9lc24ndCB3b3JrIHdpdGggZWMgYnVyc3QgbW9kZS4KLSAqIGh0dHA6Ly9idWd6aWxsYS5rZXJuZWwub3JnL3Nob3dfYnVnLmNnaT9pZD00OTgwCi0gKi8KLWludCBhY3BpX2VjX2VudGVyX2J1cnN0X21vZGUoc3RydWN0IGFjcGlfZWMgKmVjKQotewotCXU4IHRtcCA9IDA7Ci0JdTggc3RhdHVzID0gMDsKLQotCXN0YXR1cyA9IGFjcGlfZWNfcmVhZF9zdGF0dXMoZWMpOwotCWlmIChzdGF0dXMgIT0gLUVJTlZBTCAmJiAhKHN0YXR1cyAmIEFDUElfRUNfRkxBR19CVVJTVCkpIHsKLQkJc3RhdHVzID0gYWNwaV9lY193YWl0KGVjLCBBQ1BJX0VDX0VWRU5UX0lCRl8wKTsKLQkJaWYgKHN0YXR1cykKLQkJCWdvdG8gZW5kOwotCQlhY3BpX2VjX3dyaXRlX2NtZChlYywgQUNQSV9FQ19CVVJTVF9FTkFCTEUpOwotCQlzdGF0dXMgPSBhY3BpX2VjX3dhaXQoZWMsIEFDUElfRUNfRVZFTlRfT0JGXzEpOwotCQl0bXAgPSBhY3BpX2VjX3JlYWRfZGF0YShlYyk7Ci0JCWlmICh0bXAgIT0gMHg5MCkgewkvKiBCdXJzdCBBQ0sgYnl0ZSAqLwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQl9Ci0KLQlhdG9taWNfc2V0KCZlYy0+bGVhdmluZ19idXJzdCwgMCk7Ci0JcmV0dXJuIDA7Ci0gICAgICBlbmQ6Ci0JQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIHN0YXR1cywgIkVDIHdhaXQsIGJ1cnN0IG1vZGUiKSk7Ci0JcmV0dXJuIC0xOwotfQotCi1pbnQgYWNwaV9lY19sZWF2ZV9idXJzdF9tb2RlKHN0cnVjdCBhY3BpX2VjICplYykKLXsKLQl1OCBzdGF0dXMgPSAwOwotCi0Jc3RhdHVzID0gYWNwaV9lY19yZWFkX3N0YXR1cyhlYyk7Ci0JaWYgKHN0YXR1cyAhPSAtRUlOVkFMICYmIChzdGF0dXMgJiBBQ1BJX0VDX0ZMQUdfQlVSU1QpKSB7Ci0JCXN0YXR1cyA9IGFjcGlfZWNfd2FpdChlYywgQUNQSV9FQ19FVkVOVF9JQkZfMCk7Ci0JCWlmIChzdGF0dXMpCi0JCQlnb3RvIGVuZDsKLQkJYWNwaV9lY193cml0ZV9jbWQoZWMsIEFDUElfRUNfQlVSU1RfRElTQUJMRSk7Ci0JCWFjcGlfZWNfd2FpdChlYywgQUNQSV9FQ19FVkVOVF9JQkZfMCk7Ci0JfQotCWF0b21pY19zZXQoJmVjLT5sZWF2aW5nX2J1cnN0LCAxKTsKLQlyZXR1cm4gMDsKLSAgICAgIGVuZDoKLQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgc3RhdHVzLCAiRUMgbGVhdmUgYnVyc3QgbW9kZSIpKTsKLQlyZXR1cm4gLTE7Ci19Ci0jZW5kaWYJCQkJLyogQUNQSV9GVVRVUkVfVVNBR0UgKi8KLQogc3RhdGljIGludCBhY3BpX2VjX3RyYW5zYWN0aW9uX3VubG9ja2VkKHN0cnVjdCBhY3BpX2VjICplYywgdTggY29tbWFuZCwKIAkJCQkJY29uc3QgdTggKiB3ZGF0YSwgdW5zaWduZWQgd2RhdGFfbGVuLAogCQkJCQl1OCAqIHJkYXRhLCB1bnNpZ25lZCByZGF0YV9sZW4pCkBAIC0zMTIsNiArMjYwLDIxIEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAorLyoKKyAqIE5vdGU6IHNhbXN1bmcgbnY1MDAwIGRvZXNuJ3Qgd29yayB3aXRoIGVjIGJ1cnN0IG1vZGUuCisgKiBodHRwOi8vYnVnemlsbGEua2VybmVsLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDk4MAorICovCitpbnQgYWNwaV9lY19idXJzdF9lbmFibGUoc3RydWN0IGFjcGlfZWMgKmVjKQoreworCXU4IGQ7CisJcmV0dXJuIGFjcGlfZWNfdHJhbnNhY3Rpb24oZWMsIEFDUElfRUNfQlVSU1RfRU5BQkxFLCBOVUxMLCAwLCAmZCwgMSk7Cit9CisKK2ludCBhY3BpX2VjX2J1cnN0X2Rpc2FibGUoc3RydWN0IGFjcGlfZWMgKmVjKQoreworCXJldHVybiBhY3BpX2VjX3RyYW5zYWN0aW9uKGVjLCBBQ1BJX0VDX0JVUlNUX0RJU0FCTEUsIE5VTEwsIDAsIE5VTEwsIDApOworfQorCiBzdGF0aWMgaW50IGFjcGlfZWNfcmVhZChzdHJ1Y3QgYWNwaV9lYyAqZWMsIHU4IGFkZHJlc3MsIHU4ICogZGF0YSkKIHsKIAlpbnQgcmVzdWx0OwpAQCAtMzMzLDE4ICsyOTYsMzMgQEAKIC8qCiAgKiBFeHRlcm5hbGx5IGNhbGxhYmxlIEVDIGFjY2VzcyBmdW5jdGlvbnMuIEZvciBub3csIGFzc3VtZSAxIEVDIG9ubHkKICAqLworaW50IGVjX2J1cnN0X2VuYWJsZSh2b2lkKQoreworCWlmICghZmlyc3RfZWMpCisJCXJldHVybiAtRU5PREVWOworCXJldHVybiBhY3BpX2VjX2J1cnN0X2VuYWJsZShmaXJzdF9lYyk7Cit9CisKK0VYUE9SVF9TWU1CT0woZWNfYnVyc3RfZW5hYmxlKTsKKworaW50IGVjX2J1cnN0X2Rpc2FibGUodm9pZCkKK3sKKwlpZiAoIWZpcnN0X2VjKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlyZXR1cm4gYWNwaV9lY19idXJzdF9kaXNhYmxlKGZpcnN0X2VjKTsKK30KKworRVhQT1JUX1NZTUJPTChlY19idXJzdF9kaXNhYmxlKTsKKwogaW50IGVjX3JlYWQodTggYWRkciwgdTggKiB2YWwpCiB7Ci0Jc3RydWN0IGFjcGlfZWMgKmVjOwogCWludCBlcnI7CiAJdTggdGVtcF9kYXRhOwogCiAJaWYgKCFmaXJzdF9lYykKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQllYyA9IGFjcGlfZHJpdmVyX2RhdGEoZmlyc3RfZWMpOwotCi0JZXJyID0gYWNwaV9lY19yZWFkKGVjLCBhZGRyLCAmdGVtcF9kYXRhKTsKKwllcnIgPSBhY3BpX2VjX3JlYWQoZmlyc3RfZWMsIGFkZHIsICZ0ZW1wX2RhdGEpOwogCiAJaWYgKCFlcnIpIHsKIAkJKnZhbCA9IHRlbXBfZGF0YTsKQEAgLTM1NywxNSArMzM1LDEyIEBACiAKIGludCBlY193cml0ZSh1OCBhZGRyLCB1OCB2YWwpCiB7Ci0Jc3RydWN0IGFjcGlfZWMgKmVjOwogCWludCBlcnI7CiAKIAlpZiAoIWZpcnN0X2VjKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWVjID0gYWNwaV9kcml2ZXJfZGF0YShmaXJzdF9lYyk7Ci0KLQllcnIgPSBhY3BpX2VjX3dyaXRlKGVjLCBhZGRyLCB2YWwpOworCWVyciA9IGFjcGlfZWNfd3JpdGUoZmlyc3RfZWMsIGFkZHIsIHZhbCk7CiAKIAlyZXR1cm4gZXJyOwogfQpAQCAtMzc2LDE0ICszNTEsMTAgQEAKIAkJICAgY29uc3QgdTggKiB3ZGF0YSwgdW5zaWduZWQgd2RhdGFfbGVuLAogCQkgICB1OCAqIHJkYXRhLCB1bnNpZ25lZCByZGF0YV9sZW4pCiB7Ci0Jc3RydWN0IGFjcGlfZWMgKmVjOwotCiAJaWYgKCFmaXJzdF9lYykKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQllYyA9IGFjcGlfZHJpdmVyX2RhdGEoZmlyc3RfZWMpOwotCi0JcmV0dXJuIGFjcGlfZWNfdHJhbnNhY3Rpb24oZWMsIGNvbW1hbmQsIHdkYXRhLAorCXJldHVybiBhY3BpX2VjX3RyYW5zYWN0aW9uKGZpcnN0X2VjLCBjb21tYW5kLCB3ZGF0YSwKIAkJCQkgICB3ZGF0YV9sZW4sIHJkYXRhLCByZGF0YV9sZW4pOwogfQogCkBAIC00MjAsNyArMzkxLDcgQEAKIAogc3RhdGljIHZvaWQgYWNwaV9lY19ncGVfcXVlcnkodm9pZCAqZWNfY3h0KQogewotCXN0cnVjdCBhY3BpX2VjICplYyA9IChzdHJ1Y3QgYWNwaV9lYyAqKWVjX2N4dDsKKwlzdHJ1Y3QgYWNwaV9lYyAqZWMgPSBlY19jeHQ7CiAJdTggdmFsdWUgPSAwOwogCWNoYXIgb2JqZWN0X25hbWVbOF07CiAKQEAgLTQzOCw4ICs0MDksOSBAQAogewogCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwogCXU4IHZhbHVlOwotCXN0cnVjdCBhY3BpX2VjICplYyA9IChzdHJ1Y3QgYWNwaV9lYyAqKWRhdGE7CisJc3RydWN0IGFjcGlfZWMgKmVjID0gZGF0YTsKIAlhdG9taWNfaW5jKCZlYy0+ZXZlbnRfY291bnQpOworCiAJaWYgKGFjcGlfZWNfbW9kZSA9PSBFQ19JTlRSKSB7CiAJCXdha2VfdXAoJmVjLT53YWl0KTsKIAl9CkBAIC00ODIsNyArNDU0LDcgQEAKIAkJICAgICAgdm9pZCAqaGFuZGxlcl9jb250ZXh0LCB2b2lkICpyZWdpb25fY29udGV4dCkKIHsKIAlpbnQgcmVzdWx0ID0gMDsKLQlzdHJ1Y3QgYWNwaV9lYyAqZWMgPSBOVUxMOworCXN0cnVjdCBhY3BpX2VjICplYyA9IGhhbmRsZXJfY29udGV4dDsKIAl1NjQgdGVtcCA9ICp2YWx1ZTsKIAlhY3BpX2ludGVnZXIgZl92ID0gMDsKIAlpbnQgaSA9IDA7CkBAIC00OTQsOCArNDY2LDYgQEAKIAkJcmV0dXJuIEFFX0JBRF9QQVJBTUVURVI7CiAJfQogCi0JZWMgPSAoc3RydWN0IGFjcGlfZWMgKiloYW5kbGVyX2NvbnRleHQ7Ci0KICAgICAgIG5leHRfYnl0ZToKIAlzd2l0Y2ggKGZ1bmN0aW9uKSB7CiAJY2FzZSBBQ1BJX1JFQUQ6CkBAIC01NTEsMTggKzUyMSwxNiBAQAogCiBzdGF0aWMgaW50IGFjcGlfZWNfcmVhZF9pbmZvKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpCiB7Ci0Jc3RydWN0IGFjcGlfZWMgKmVjID0gKHN0cnVjdCBhY3BpX2VjICopc2VxLT5wcml2YXRlOworCXN0cnVjdCBhY3BpX2VjICplYyA9IHNlcS0+cHJpdmF0ZTsKIAogCWlmICghZWMpCiAJCWdvdG8gZW5kOwogCi0Jc2VxX3ByaW50ZihzZXEsICJncGU6ICAgICAgICAgICAgICAgICAweCUwMnhcbiIsICh1MzIpIGVjLT5ncGUpOwotCXNlcV9wcmludGYoc2VxLCAicG9ydHM6ICAgICAgICAgICAgICAgICAgIDB4JTAyeCwgMHglMDJ4XG4iLAotCQkgICAodTMyKSBlYy0+Y29tbWFuZF9hZGRyLCAodTMyKSBlYy0+ZGF0YV9hZGRyKTsKLQlzZXFfcHJpbnRmKHNlcSwgInVzZSBnbG9iYWwgbG9jazogICAgICAgICAlc1xuIiwKKwlzZXFfcHJpbnRmKHNlcSwgImdwZTpcdFx0XHQweCUwMnhcbiIsICh1MzIpIGVjLT5ncGUpOworCXNlcV9wcmludGYoc2VxLCAicG9ydHM6XHRcdFx0MHglMDJ4LCAweCUwMnhcbiIsCisJCSAgICh1bnNpZ25lZCllYy0+Y29tbWFuZF9hZGRyLCAodW5zaWduZWQpZWMtPmRhdGFfYWRkcik7CisJc2VxX3ByaW50ZihzZXEsICJ1c2UgZ2xvYmFsIGxvY2s6XHQlc1xuIiwKIAkJICAgZWMtPmdsb2JhbF9sb2NrID8gInllcyIgOiAibm8iKTsKLQlhY3BpX2VuYWJsZV9ncGUoTlVMTCwgZWMtPmdwZSwgQUNQSV9OT1RfSVNSKTsKLQogICAgICAgZW5kOgogCXJldHVybiAwOwogfQpAQCAtNjE5LDE1NCArNTg3LDEyMiBAQAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcml2ZXIgSW50ZXJmYWNlCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIGFjcGlfc3RhdHVzCitlY19wYXJzZV9pb19wb3J0cyhzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqcmVzb3VyY2UsIHZvaWQgKmNvbnRleHQpOworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2VjX3BhcnNlX2RldmljZShhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiBMZXZlbCwgdm9pZCAqY29udGV4dCwgdm9pZCAqKnJldHZhbCk7CisKK3N0YXRpYyBzdHJ1Y3QgYWNwaV9lYyAqbWFrZV9hY3BpX2VjKHZvaWQpCit7CisJc3RydWN0IGFjcGlfZWMgKmVjID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFjcGlfZWMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWVjKQorCQlyZXR1cm4gTlVMTDsKKworCWF0b21pY19zZXQoJmVjLT5xdWVyeV9wZW5kaW5nLCAxKTsKKwlhdG9taWNfc2V0KCZlYy0+ZXZlbnRfY291bnQsIDEpOworCW11dGV4X2luaXQoJmVjLT5sb2NrKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZlYy0+d2FpdCk7CisKKwlyZXR1cm4gZWM7Cit9CiAKIHN0YXRpYyBpbnQgYWNwaV9lY19hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCiB7Ci0JaW50IHJlc3VsdCA9IDA7CiAJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CiAJc3RydWN0IGFjcGlfZWMgKmVjID0gTlVMTDsKIAogCWlmICghZGV2aWNlKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWVjID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFjcGlfZWMpLCBHRlBfS0VSTkVMKTsKKwlzdHJjcHkoYWNwaV9kZXZpY2VfbmFtZShkZXZpY2UpLCBBQ1BJX0VDX0RFVklDRV9OQU1FKTsKKwlzdHJjcHkoYWNwaV9kZXZpY2VfY2xhc3MoZGV2aWNlKSwgQUNQSV9FQ19DTEFTUyk7CisKKwllYyA9IG1ha2VfYWNwaV9lYygpOwogCWlmICghZWMpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JZWMtPmhhbmRsZSA9IGRldmljZS0+aGFuZGxlOwotCWVjLT51aWQgPSAtMTsKLQltdXRleF9pbml0KCZlYy0+bG9jayk7Ci0JYXRvbWljX3NldCgmZWMtPnF1ZXJ5X3BlbmRpbmcsIDApOwotCWF0b21pY19zZXQoJmVjLT5ldmVudF9jb3VudCwgMSk7Ci0JaWYgKGFjcGlfZWNfbW9kZSA9PSBFQ19JTlRSKSB7Ci0JCWF0b21pY19zZXQoJmVjLT5sZWF2aW5nX2J1cnN0LCAxKTsKLQkJaW5pdF93YWl0cXVldWVfaGVhZCgmZWMtPndhaXQpOworCXN0YXR1cyA9IGVjX3BhcnNlX2RldmljZShkZXZpY2UtPmhhbmRsZSwgMCwgZWMsIE5VTEwpOworCWlmIChzdGF0dXMgIT0gQUVfQ1RSTF9URVJNSU5BVEUpIHsKKwkJa2ZyZWUoZWMpOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0Jc3RyY3B5KGFjcGlfZGV2aWNlX25hbWUoZGV2aWNlKSwgQUNQSV9FQ19ERVZJQ0VfTkFNRSk7Ci0Jc3RyY3B5KGFjcGlfZGV2aWNlX2NsYXNzKGRldmljZSksIEFDUElfRUNfQ0xBU1MpOworCisJLyogQ2hlY2sgaWYgd2UgZm91bmQgdGhlIGJvb3QgRUMgKi8KKwlpZiAoYm9vdF9lYykgeworCQlpZiAoYm9vdF9lYy0+Z3BlID09IGVjLT5ncGUpIHsKKwkJCS8qIFdlIG1pZ2h0IGhhdmUgaW5jb3JyZWN0IGluZm8gZm9yIEdMIGF0IGJvb3QgdGltZSAqLworCQkJbXV0ZXhfbG9jaygmYm9vdF9lYy0+bG9jayk7CisJCQlib290X2VjLT5nbG9iYWxfbG9jayA9IGVjLT5nbG9iYWxfbG9jazsKKwkJCW11dGV4X3VubG9jaygmYm9vdF9lYy0+bG9jayk7CisJCQlrZnJlZShlYyk7CisJCQllYyA9IGJvb3RfZWM7CisJCX0KKwl9IGVsc2UKKwkJZmlyc3RfZWMgPSBlYzsKKwllYy0+aGFuZGxlID0gZGV2aWNlLT5oYW5kbGU7CiAJYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpID0gZWM7CiAKLQkvKiBVc2UgdGhlIGdsb2JhbCBsb2NrIGZvciBhbGwgRUMgdHJhbnNhY3Rpb25zPyAqLwotCWFjcGlfZXZhbHVhdGVfaW50ZWdlcihlYy0+aGFuZGxlLCAiX0dMSyIsIE5VTEwsICZlYy0+Z2xvYmFsX2xvY2spOwotCi0JLyogWFhYIHdlIGRvbid0IHRlc3QgdWlkcywgYmVjYXVzZSBvbiBzb21lIGJveGVzIGVjZHQgdWlkID0gMCwgc2VlOgotCSAgIGh0dHA6Ly9idWd6aWxsYS5rZXJuZWwub3JnL3Nob3dfYnVnLmNnaT9pZD02MTExICovCi0JaWYgKGVjX2VjZHQpIHsKLQkJYWNwaV9yZW1vdmVfYWRkcmVzc19zcGFjZV9oYW5kbGVyKEFDUElfUk9PVF9PQkpFQ1QsCi0JCQkJCQkgIEFDUElfQURSX1NQQUNFX0VDLAotCQkJCQkJICAmYWNwaV9lY19zcGFjZV9oYW5kbGVyKTsKLQotCQlhY3BpX3JlbW92ZV9ncGVfaGFuZGxlcihOVUxMLCBlY19lY2R0LT5ncGUsCi0JCQkJCSZhY3BpX2VjX2dwZV9oYW5kbGVyKTsKLQotCQlrZnJlZShlY19lY2R0KTsKLQl9Ci0KLQkvKiBHZXQgR1BFIGJpdCBhc3NpZ25tZW50IChFQyBldmVudHMpLiAqLwotCS8qIFRPRE86IEFkZCBzdXBwb3J0IGZvciBfR1BFIHJldHVybmluZyBhIHBhY2thZ2UgKi8KLQlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX2ludGVnZXIoZWMtPmhhbmRsZSwgIl9HUEUiLCBOVUxMLCAmZWMtPmdwZSk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBzdGF0dXMsCi0JCQkJIk9idGFpbmluZyBHUEUgYml0IGFzc2lnbm1lbnQiKSk7Ci0JCXJlc3VsdCA9IC1FTk9ERVY7Ci0JCWdvdG8gZW5kOwotCX0KLQotCXJlc3VsdCA9IGFjcGlfZWNfYWRkX2ZzKGRldmljZSk7Ci0JaWYgKHJlc3VsdCkKLQkJZ290byBlbmQ7CisJYWNwaV9lY19hZGRfZnMoZGV2aWNlKTsKIAogCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIiVzIFslc10gKGdwZSAlZCkgaW50ZXJydXB0IG1vZGUuIiwKIAkJCSAgYWNwaV9kZXZpY2VfbmFtZShkZXZpY2UpLCBhY3BpX2RldmljZV9iaWQoZGV2aWNlKSwKIAkJCSAgKHUzMikgZWMtPmdwZSkpOwogCi0JaWYgKCFmaXJzdF9lYykKLQkJZmlyc3RfZWMgPSBkZXZpY2U7Ci0KLSAgICAgIGVuZDoKLQlpZiAocmVzdWx0KQotCQlrZnJlZShlYyk7Ci0KLQlyZXR1cm4gcmVzdWx0OworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGFjcGlfZWNfcmVtb3ZlKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgdHlwZSkKIHsKLQlzdHJ1Y3QgYWNwaV9lYyAqZWMgPSBOVUxMOworCXN0cnVjdCBhY3BpX2VjICplYzsKIAogCWlmICghZGV2aWNlKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWVjID0gYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpOwotCiAJYWNwaV9lY19yZW1vdmVfZnMoZGV2aWNlKTsKKwlhY3BpX2RyaXZlcl9kYXRhKGRldmljZSkgPSBOVUxMOworCWlmIChlYyA9PSBmaXJzdF9lYykKKwkJZmlyc3RfZWMgPSBOVUxMOwogCi0Ja2ZyZWUoZWMpOwotCisJLyogRG9uJ3QgdG91Y2ggYm9vdCBFQyAqLworCWlmIChib290X2VjICE9IGVjKQorCQlrZnJlZShlYyk7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV9lY19pb19wb3J0cyhzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqcmVzb3VyY2UsIHZvaWQgKmNvbnRleHQpCitlY19wYXJzZV9pb19wb3J0cyhzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqcmVzb3VyY2UsIHZvaWQgKmNvbnRleHQpCiB7Ci0Jc3RydWN0IGFjcGlfZWMgKmVjID0gKHN0cnVjdCBhY3BpX2VjICopY29udGV4dDsKKwlzdHJ1Y3QgYWNwaV9lYyAqZWMgPSBjb250ZXh0OwogCi0JaWYgKHJlc291cmNlLT50eXBlICE9IEFDUElfUkVTT1VSQ0VfVFlQRV9JTykgeworCWlmIChyZXNvdXJjZS0+dHlwZSAhPSBBQ1BJX1JFU09VUkNFX1RZUEVfSU8pCiAJCXJldHVybiBBRV9PSzsKLQl9CiAKIAkvKgogCSAqIFRoZSBmaXJzdCBhZGRyZXNzIHJlZ2lvbiByZXR1cm5lZCBpcyB0aGUgZGF0YSBwb3J0LCBhbmQKIAkgKiB0aGUgc2Vjb25kIGFkZHJlc3MgcmVnaW9uIHJldHVybmVkIGlzIHRoZSBzdGF0dXMvY29tbWFuZAogCSAqIHBvcnQuCiAJICovCi0JaWYgKGVjLT5kYXRhX2FkZHIgPT0gMCkgeworCWlmIChlYy0+ZGF0YV9hZGRyID09IDApCiAJCWVjLT5kYXRhX2FkZHIgPSByZXNvdXJjZS0+ZGF0YS5pby5taW5pbXVtOwotCX0gZWxzZSBpZiAoZWMtPmNvbW1hbmRfYWRkciA9PSAwKSB7CisJZWxzZSBpZiAoZWMtPmNvbW1hbmRfYWRkciA9PSAwKQogCQllYy0+Y29tbWFuZF9hZGRyID0gcmVzb3VyY2UtPmRhdGEuaW8ubWluaW11bTsKLQl9IGVsc2UgeworCWVsc2UKIAkJcmV0dXJuIEFFX0NUUkxfVEVSTUlOQVRFOwotCX0KIAogCXJldHVybiBBRV9PSzsKIH0KIAotc3RhdGljIGludCBhY3BpX2VjX3N0YXJ0KHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQorc3RhdGljIGludCBlY19pbnN0YWxsX2hhbmRsZXJzKHN0cnVjdCBhY3BpX2VjICplYykKIHsKLQlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKLQlzdHJ1Y3QgYWNwaV9lYyAqZWMgPSBOVUxMOwotCi0JaWYgKCFkZXZpY2UpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JZWMgPSBhY3BpX2RyaXZlcl9kYXRhKGRldmljZSk7Ci0KLQlpZiAoIWVjKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCS8qCi0JICogR2V0IEkvTyBwb3J0IGFkZHJlc3Nlcy4gQ29udmVydCB0byBHQVMgZm9ybWF0LgotCSAqLwotCXN0YXR1cyA9IGFjcGlfd2Fsa19yZXNvdXJjZXMoZWMtPmhhbmRsZSwgTUVUSE9EX05BTUVfX0NSUywKLQkJCQkgICAgIGFjcGlfZWNfaW9fcG9ydHMsIGVjKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykgfHwgZWMtPmNvbW1hbmRfYWRkciA9PSAwKSB7Ci0JCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBzdGF0dXMsCi0JCQkJIkVycm9yIGdldHRpbmcgSS9PIHBvcnQgYWRkcmVzc2VzIikpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJncGU9MHglMDJseCwgcG9ydHM9MHglMmx4LDB4JTJseCIsCi0JCQkgIGVjLT5ncGUsIGVjLT5jb21tYW5kX2FkZHIsIGVjLT5kYXRhX2FkZHIpKTsKLQotCS8qCi0JICogSW5zdGFsbCBHUEUgaGFuZGxlcgotCSAqLworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAlzdGF0dXMgPSBhY3BpX2luc3RhbGxfZ3BlX2hhbmRsZXIoTlVMTCwgZWMtPmdwZSwKIAkJCQkJICBBQ1BJX0dQRV9FREdFX1RSSUdHRVJFRCwKIAkJCQkJICAmYWNwaV9lY19ncGVfaGFuZGxlciwgZWMpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKIAkJcmV0dXJuIC1FTk9ERVY7Ci0JfQorCiAJYWNwaV9zZXRfZ3BlX3R5cGUoTlVMTCwgZWMtPmdwZSwgQUNQSV9HUEVfVFlQRV9SVU5USU1FKTsKIAlhY3BpX2VuYWJsZV9ncGUoTlVMTCwgZWMtPmdwZSwgQUNQSV9OT1RfSVNSKTsKIApAQCAtNzc5LDE5ICs3MTUsNTAgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JcmV0dXJuIEFFX09LOworCS8qIEVDIGlzIGZ1bGx5IG9wZXJhdGlvbmFsLCBhbGxvdyBxdWVyaWVzICovCisJYXRvbWljX3NldCgmZWMtPnF1ZXJ5X3BlbmRpbmcsIDApOworCisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYWNwaV9lY19zdG9wKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgdHlwZSkKK3N0YXRpYyBpbnQgYWNwaV9lY19zdGFydChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKIHsKLQlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKLQlzdHJ1Y3QgYWNwaV9lYyAqZWMgPSBOVUxMOworCXN0cnVjdCBhY3BpX2VjICplYzsKIAogCWlmICghZGV2aWNlKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWVjID0gYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpOwogCisJaWYgKCFlYykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJncGU9MHglMDJseCwgcG9ydHM9MHglMmx4LDB4JTJseCIsCisJCQkgIGVjLT5ncGUsIGVjLT5jb21tYW5kX2FkZHIsIGVjLT5kYXRhX2FkZHIpKTsKKworCS8qIEJvb3QgRUMgaXMgYWxyZWFkeSB3b3JraW5nICovCisJaWYgKGVjID09IGJvb3RfZWMpCisJCXJldHVybiAwOworCisJcmV0dXJuIGVjX2luc3RhbGxfaGFuZGxlcnMoZWMpOworfQorCitzdGF0aWMgaW50IGFjcGlfZWNfc3RvcChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCBhY3BpX2VjICplYzsKKworCWlmICghZGV2aWNlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWVjID0gYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpOworCWlmICghZWMpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogRG9uJ3QgdG91Y2ggYm9vdCBFQyAqLworCWlmIChlYyA9PSBib290X2VjKQorCQlyZXR1cm4gMDsKKwogCXN0YXR1cyA9IGFjcGlfcmVtb3ZlX2FkZHJlc3Nfc3BhY2VfaGFuZGxlcihlYy0+aGFuZGxlLAogCQkJCQkJICAgQUNQSV9BRFJfU1BBQ0VfRUMsCiAJCQkJCQkgICAmYWNwaV9lY19zcGFjZV9oYW5kbGVyKTsKQEAgLTgwNSwxNjQgKzc3Miw2NyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgYWNwaV9zdGF0dXMgX19pbml0Ci1hY3BpX2Zha2VfZWNkdF9jYWxsYmFjayhhY3BpX2hhbmRsZSBoYW5kbGUsCi0JCQl1MzIgTGV2ZWwsIHZvaWQgKmNvbnRleHQsIHZvaWQgKipyZXR2YWwpCitzdGF0aWMgYWNwaV9zdGF0dXMKK2VjX3BhcnNlX2RldmljZShhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiBMZXZlbCwgdm9pZCAqY29udGV4dCwgdm9pZCAqKnJldHZhbCkKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQltdXRleF9pbml0KCZlY19lY2R0LT5sb2NrKTsKLQlhdG9taWNfc2V0KCZlY19lY2R0LT5ldmVudF9jb3VudCwgMSk7Ci0JaWYgKGFjcGlfZWNfbW9kZSA9PSBFQ19JTlRSKSB7Ci0JCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmVjX2VjZHQtPndhaXQpOwotCX0KKwlzdHJ1Y3QgYWNwaV9lYyAqZWMgPSBjb250ZXh0OwogCXN0YXR1cyA9IGFjcGlfd2Fsa19yZXNvdXJjZXMoaGFuZGxlLCBNRVRIT0RfTkFNRV9fQ1JTLAotCQkJCSAgICAgYWNwaV9lY19pb19wb3J0cywgZWNfZWNkdCk7CisJCQkJICAgICBlY19wYXJzZV9pb19wb3J0cywgZWMpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKIAkJcmV0dXJuIHN0YXR1czsKIAotCWVjX2VjZHQtPnVpZCA9IC0xOwotCWFjcGlfZXZhbHVhdGVfaW50ZWdlcihoYW5kbGUsICJfVUlEIiwgTlVMTCwgJmVjX2VjZHQtPnVpZCk7Ci0KLQlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX2ludGVnZXIoaGFuZGxlLCAiX0dQRSIsIE5VTEwsICZlY19lY2R0LT5ncGUpOworCS8qIEdldCBHUEUgYml0IGFzc2lnbm1lbnQgKEVDIGV2ZW50cykuICovCisJLyogVE9ETzogQWRkIHN1cHBvcnQgZm9yIF9HUEUgcmV0dXJuaW5nIGEgcGFja2FnZSAqLworCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfaW50ZWdlcihoYW5kbGUsICJfR1BFIiwgTlVMTCwgJmVjLT5ncGUpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKIAkJcmV0dXJuIHN0YXR1czsKLQllY19lY2R0LT5nbG9iYWxfbG9jayA9IFRSVUU7Ci0JZWNfZWNkdC0+aGFuZGxlID0gaGFuZGxlOworCisJLyogVXNlIHRoZSBnbG9iYWwgbG9jayBmb3IgYWxsIEVDIHRyYW5zYWN0aW9ucz8gKi8KKwlhY3BpX2V2YWx1YXRlX2ludGVnZXIoaGFuZGxlLCAiX0dMSyIsIE5VTEwsICZlYy0+Z2xvYmFsX2xvY2spOworCisJZWMtPmhhbmRsZSA9IGhhbmRsZTsKIAogCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIkdQRT0weCUwMmx4LCBwb3J0cz0weCUybHgsIDB4JTJseCIsCi0JCQkgIGVjX2VjZHQtPmdwZSwgZWNfZWNkdC0+Y29tbWFuZF9hZGRyLAotCQkJICBlY19lY2R0LT5kYXRhX2FkZHIpKTsKKwkJCSAgZWMtPmdwZSwgZWMtPmNvbW1hbmRfYWRkciwgZWMtPmRhdGFfYWRkcikpOwogCiAJcmV0dXJuIEFFX0NUUkxfVEVSTUlOQVRFOwogfQogCi0vKgotICogU29tZSBCSU9TIChzdWNoIGFzIHNvbWUgZnJvbSBHYXRld2F5IGxhcHRvcHMpIGFjY2VzcyBFQyByZWdpb24gdmVyeSBlYXJseQotICogc3VjaCBhcyBpbiBCQVQwLl9JTkkgb3IgRUMuX0lOSSBiZWZvcmUgYW4gRUMgZGV2aWNlIGlzIGZvdW5kIGFuZAotICogZG8gbm90IHByb3ZpZGUgYW4gRUNEVC4gQWNjb3JkaW5nIHRvIEFDUEkgc3BlYywgRUNEVCBpc24ndCBtYW5kYXRvcmlseQotICogcmVxdWlyZWQsIGJ1dCBpZiBFQyByZWdpc29uIGlzIGFjY2Vzc2VkIGVhcmx5LCBpdCBpcyByZXF1aXJlZC4KLSAqIFRoZSByb3V0aW5lIHRyaWVzIHRvIHdvcmthcm91bmQgdGhlIEJJT1MgYnVnIGJ5IHByZS1zY2FuIEVDIGRldmljZQotICogSXQgYXNzdW1lcyB0aGF0IF9DUlMsIF9ISUQsIF9HUEUsIF9VSUQgbWV0aG9kcyBvZiBFQyBkb24ndCB0b3VjaCBhbnkKLSAqIG9wIHJlZ2lvbiAoc2luY2UgX1JFRyBpc24ndCBpbnZva2VkIHlldCkuIFRoZSBhc3N1bXB0aW9uIGlzIHRydWUgZm9yCi0gKiBhbGwgc3lzdGVtcyBmb3VuZC4KLSAqLwotc3RhdGljIGludCBfX2luaXQgYWNwaV9lY19mYWtlX2VjZHQodm9pZCkKK2ludCBfX2luaXQgYWNwaV9lY19lY2R0X3Byb2JlKHZvaWQpCiB7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCWludCByZXQgPSAwOwotCi0JQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiVHJ5IHRvIG1ha2UgYW4gZmFrZSBFQ0RUIikpOwotCi0JZWNfZWNkdCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhY3BpX2VjKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFlY19lY2R0KSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCi0Jc3RhdHVzID0gYWNwaV9nZXRfZGV2aWNlcyhBQ1BJX0VDX0hJRCwKLQkJCQkgIGFjcGlfZmFrZV9lY2R0X2NhbGxiYWNrLCBOVUxMLCBOVUxMKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJa2ZyZWUoZWNfZWNkdCk7Ci0JCWVjX2VjZHQgPSBOVUxMOwotCQlyZXQgPSAtRU5PREVWOwotCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgc3RhdHVzLCAiQ2FuJ3QgbWFrZSBhbiBmYWtlIEVDRFQiKSk7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCXJldHVybiAwOwotICAgICAgZXJyb3I6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBfX2luaXQgYWNwaV9lY19nZXRfcmVhbF9lY2R0KHZvaWQpCi17CisJaW50IHJldDsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAJc3RydWN0IGFjcGlfdGFibGVfZWNkdCAqZWNkdF9wdHI7CiAKKwlib290X2VjID0gbWFrZV9hY3BpX2VjKCk7CisJaWYgKCFib290X2VjKQorCQlyZXR1cm4gLUVOT01FTTsKKwkvKgorCSAqIEdlbmVyYXRlIGEgYm9vdCBlYyBjb250ZXh0CisJICovCisKIAlzdGF0dXMgPSBhY3BpX2dldF90YWJsZShBQ1BJX1NJR19FQ0RULCAxLAogCQkJCShzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKiopJmVjZHRfcHRyKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCi0JCXJldHVybiAtRU5PREVWOworCQlnb3RvIGVycm9yOwogCiAJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiRm91bmQgRUNEVCIpKTsKIAotCS8qCi0JICogR2VuZXJhdGUgYSB0ZW1wb3JhcnkgZWMgY29udGV4dCB0byB1c2UgdW50aWwgdGhlIG5hbWVzcGFjZSBpcyBzY2FubmVkCi0JICovCi0JZWNfZWNkdCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhY3BpX2VjKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFlY19lY2R0KQotCQlyZXR1cm4gLUVOT01FTTsKKwlib290X2VjLT5jb21tYW5kX2FkZHIgPSBlY2R0X3B0ci0+Y29udHJvbC5hZGRyZXNzOworCWJvb3RfZWMtPmRhdGFfYWRkciA9IGVjZHRfcHRyLT5kYXRhLmFkZHJlc3M7CisJYm9vdF9lYy0+Z3BlID0gZWNkdF9wdHItPmdwZTsKKwlib290X2VjLT5oYW5kbGUgPSBBQ1BJX1JPT1RfT0JKRUNUOwogCi0JbXV0ZXhfaW5pdCgmZWNfZWNkdC0+bG9jayk7Ci0JYXRvbWljX3NldCgmZWNfZWNkdC0+ZXZlbnRfY291bnQsIDEpOwotCWlmIChhY3BpX2VjX21vZGUgPT0gRUNfSU5UUikgewotCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZlY19lY2R0LT53YWl0KTsKLQl9Ci0JZWNfZWNkdC0+Y29tbWFuZF9hZGRyID0gZWNkdF9wdHItPmNvbnRyb2wuYWRkcmVzczsKLQllY19lY2R0LT5kYXRhX2FkZHIgPSBlY2R0X3B0ci0+ZGF0YS5hZGRyZXNzOwotCWVjX2VjZHQtPmdwZSA9IGVjZHRfcHRyLT5ncGU7Ci0JLyogdXNlIHRoZSBHTCBqdXN0IHRvIGJlIHNhZmUgKi8KLQllY19lY2R0LT5nbG9iYWxfbG9jayA9IFRSVUU7Ci0JZWNfZWNkdC0+dWlkID0gZWNkdF9wdHItPnVpZDsKLQotCXN0YXR1cyA9IGFjcGlfZ2V0X2hhbmRsZShOVUxMLCBlY2R0X3B0ci0+aWQsICZlY19lY2R0LT5oYW5kbGUpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlnb3RvIGVycm9yOwotCX0KLQotCXJldHVybiAwOwotICAgICAgZXJyb3I6Ci0JQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIHN0YXR1cywgIkNvdWxkIG5vdCB1c2UgRUNEVCIpKTsKLQlrZnJlZShlY19lY2R0KTsKLQllY19lY2R0ID0gTlVMTDsKLQotCXJldHVybiAtRU5PREVWOwotfQotCi1zdGF0aWMgaW50IF9faW5pdGRhdGEgYWNwaV9mYWtlX2VjZHRfZW5hYmxlZDsKLWludCBfX2luaXQgYWNwaV9lY19lY2R0X3Byb2JlKHZvaWQpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCWludCByZXQ7Ci0KLQlyZXQgPSBhY3BpX2VjX2dldF9yZWFsX2VjZHQoKTsKLQkvKiBUcnkgdG8gbWFrZSBhIGZha2UgRUNEVCAqLwotCWlmIChyZXQgJiYgYWNwaV9mYWtlX2VjZHRfZW5hYmxlZCkgewotCQlyZXQgPSBhY3BpX2VjX2Zha2VfZWNkdCgpOwotCX0KLQotCWlmIChyZXQpCisJcmV0ID0gZWNfaW5zdGFsbF9oYW5kbGVycyhib290X2VjKTsKKwlpZiAoIXJldCkgeworCQlmaXJzdF9lYyA9IGJvb3RfZWM7CiAJCXJldHVybiAwOwotCi0JLyoKLQkgKiBJbnN0YWxsIEdQRSBoYW5kbGVyCi0JICovCi0Jc3RhdHVzID0gYWNwaV9pbnN0YWxsX2dwZV9oYW5kbGVyKE5VTEwsIGVjX2VjZHQtPmdwZSwKLQkJCQkJICBBQ1BJX0dQRV9FREdFX1RSSUdHRVJFRCwKLQkJCQkJICAmYWNwaV9lY19ncGVfaGFuZGxlciwgZWNfZWNkdCk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCWdvdG8gZXJyb3I7CiAJfQotCWFjcGlfc2V0X2dwZV90eXBlKE5VTEwsIGVjX2VjZHQtPmdwZSwgQUNQSV9HUEVfVFlQRV9SVU5USU1FKTsKLQlhY3BpX2VuYWJsZV9ncGUoTlVMTCwgZWNfZWNkdC0+Z3BlLCBBQ1BJX05PVF9JU1IpOwotCi0Jc3RhdHVzID0gYWNwaV9pbnN0YWxsX2FkZHJlc3Nfc3BhY2VfaGFuZGxlcihBQ1BJX1JPT1RfT0JKRUNULAotCQkJCQkJICAgIEFDUElfQURSX1NQQUNFX0VDLAotCQkJCQkJICAgICZhY3BpX2VjX3NwYWNlX2hhbmRsZXIsCi0JCQkJCQkgICAgJmFjcGlfZWNfc3BhY2Vfc2V0dXAsCi0JCQkJCQkgICAgZWNfZWNkdCk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCWFjcGlfcmVtb3ZlX2dwZV9oYW5kbGVyKE5VTEwsIGVjX2VjZHQtPmdwZSwKLQkJCQkJJmFjcGlfZWNfZ3BlX2hhbmRsZXIpOwotCQlnb3RvIGVycm9yOwotCX0KLQotCXJldHVybiAwOwotCiAgICAgICBlcnJvcjoKLQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgc3RhdHVzLCAiQ291bGQgbm90IHVzZSBFQ0RUIikpOwotCWtmcmVlKGVjX2VjZHQpOwotCWVjX2VjZHQgPSBOVUxMOworCWtmcmVlKGJvb3RfZWMpOworCWJvb3RfZWMgPSBOVUxMOwogCiAJcmV0dXJuIC1FTk9ERVY7CiB9CkBAIC0xMDAzLDEzICs4NzMsNiBAQAogfQogI2VuZGlmCQkJCS8qIDAgKi8KIAotc3RhdGljIGludCBfX2luaXQgYWNwaV9mYWtlX2VjZHRfc2V0dXAoY2hhciAqc3RyKQotewotCWFjcGlfZmFrZV9lY2R0X2VuYWJsZWQgPSAxOwotCXJldHVybiAxOwotfQotCi1fX3NldHVwKCJhY3BpX2Zha2VfZWNkdCIsIGFjcGlfZmFrZV9lY2R0X3NldHVwKTsKIHN0YXRpYyBpbnQgX19pbml0IGFjcGlfZWNfc2V0X2ludHJfbW9kZShjaGFyICpzdHIpCiB7CiAJaW50IGludHI7CkBAIC0xMDE3LDEyICs4ODAsOCBAQAogCWlmICghZ2V0X29wdGlvbigmc3RyLCAmaW50cikpCiAJCXJldHVybiAwOwogCi0JaWYgKGludHIpIHsKLQkJYWNwaV9lY19tb2RlID0gRUNfSU5UUjsKLQl9IGVsc2UgewotCQlhY3BpX2VjX21vZGUgPSBFQ19QT0xMOwotCX0KLQlhY3BpX2VjX2RyaXZlci5vcHMuYWRkID0gYWNwaV9lY19hZGQ7CisJYWNwaV9lY19tb2RlID0gKGludHIpID8gRUNfSU5UUiA6IEVDX1BPTEw7CisKIAlwcmludGsoS0VSTl9OT1RJQ0UgUFJFRklYICIlcyBtb2RlLlxuIiwgaW50ciA/ICJpbnRlcnJ1cHQiIDogInBvbGxpbmciKTsKIAogCXJldHVybiAxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2kyY19lYy5jIGIvZHJpdmVycy9hY3BpL2kyY19lYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2FiNGE0Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvYWNwaS9pMmNfZWMuYworKysgL2Rldi9udWxsCkBAIC0xLDQwMyArMCwwIEBACi0vKgotICogU01CdXMgZHJpdmVyIGZvciBBQ1BJIEVtYmVkZGVkIENvbnRyb2xsZXIgKCRSZXZpc2lvbjogMS4zICQpCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA1IER1Y3JvdCBCcnVubwotICogQ29weXJpZ2h0IChjKSAyMDA1IFJpY2ggVG93bnNlbmQgKHRpbnkgaGFja3MgJiB0d2Vha3MpCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHZlcnNpb24gMi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvYWNwaS5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0KLSNpbmNsdWRlICJpMmNfZWMuaCIKLQotI2RlZmluZQl4dWRlbGF5KHQpCXVkZWxheSh0KQotI2RlZmluZQl4bXNsZWVwKHQpCW1zbGVlcCh0KQotCi0jZGVmaW5lIEFDUElfRUNfSENfQ09NUE9ORU5UCTB4MDAwODAwMDAKLSNkZWZpbmUgQUNQSV9FQ19IQ19DTEFTUwkiZWNfaGNfc21idXMiCi0jZGVmaW5lIEFDUElfRUNfSENfSElECQkiQUNQSTAwMDEiCi0jZGVmaW5lIEFDUElfRUNfSENfREVWSUNFX05BTUUJIkVDIEhDIHNtYnVzIgotCi0jZGVmaW5lIF9DT01QT05FTlQJCUFDUElfRUNfSENfQ09NUE9ORU5UCi0KLUFDUElfTU9EVUxFX05BTUUoImkyY19lYyIpOwotCi1zdGF0aWMgaW50IGFjcGlfZWNfaGNfYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKLXN0YXRpYyBpbnQgYWNwaV9lY19oY19yZW1vdmUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKTsKLQotc3RhdGljIHN0cnVjdCBhY3BpX2RyaXZlciBhY3BpX2VjX2hjX2RyaXZlciA9IHsKLQkubmFtZSA9ICJpMmNfZWMiLAotCS5jbGFzcyA9IEFDUElfRUNfSENfQ0xBU1MsCi0JLmlkcyA9IEFDUElfRUNfSENfSElELAotCS5vcHMgPSB7Ci0JCS5hZGQgPSBhY3BpX2VjX2hjX2FkZCwKLQkJLnJlbW92ZSA9IGFjcGlfZWNfaGNfcmVtb3ZlLAotCQl9LAotfTsKLQotLyogVmFyaW91cyBiaXQgbWFzayBmb3IgRUNfU0MgKFIpICovCi0jZGVmaW5lIE9CRgkJMHgwMQotI2RlZmluZSBJQkYJCTB4MDIKLSNkZWZpbmUgQ01ECQkweDA4Ci0jZGVmaW5lIEJVUlNUCQkweDEwCi0jZGVmaW5lIFNDSV9FVlQJCTB4MjAKLSNkZWZpbmUgU01JX0VWVAkJMHg0MAotCi0vKiBDb21tYW5kcyBmb3IgRUNfU0MgKFcpICovCi0jZGVmaW5lIFJEX0VDCQkweDgwCi0jZGVmaW5lIFdSX0VDCQkweDgxCi0jZGVmaW5lIEJFX0VDCQkweDgyCi0jZGVmaW5lIEJEX0VDCQkweDgzCi0jZGVmaW5lIFFSX0VDCQkweDg0Ci0KLS8qCi0gKiBBQ1BJIDIuMCBjaGFwdGVyIDEzIFNNQnVzIDIuMCBFQyByZWdpc3RlciBtb2RlbAotICovCi0KLSNkZWZpbmUgQUNQSV9FQ19TTUJfUFJUQ0wJMHgwMAkvKiBwcm90b2NvbCwgUEVDICovCi0jZGVmaW5lIEFDUElfRUNfU01CX1NUUwkJMHgwMQkvKiBzdGF0dXMgKi8KLSNkZWZpbmUgQUNQSV9FQ19TTUJfQUREUgkweDAyCS8qIGFkZHJlc3MgKi8KLSNkZWZpbmUgQUNQSV9FQ19TTUJfQ01ECQkweDAzCS8qIGNvbW1hbmQgKi8KLSNkZWZpbmUgQUNQSV9FQ19TTUJfREFUQQkweDA0CS8qIDMyIGRhdGEgcmVnaXN0ZXJzICovCi0jZGVmaW5lIEFDUElfRUNfU01CX0JDTlQJMHgyNAkvKiBudW1iZXIgb2YgZGF0YSBieXRlcyAqLwotI2RlZmluZSBBQ1BJX0VDX1NNQl9BTFJNX0EJMHgyNQkvKiBhbGFybSBhZGRyZXNzICovCi0jZGVmaW5lIEFDUElfRUNfU01CX0FMUk1fRAkweDI2CS8qIDIgYnl0ZXMgYWxhcm0gZGF0YSAqLwotCi0jZGVmaW5lIEFDUElfRUNfU01CX1NUU19ET05FCTB4ODAKLSNkZWZpbmUgQUNQSV9FQ19TTUJfU1RTX0FMUk0JMHg0MAotI2RlZmluZSBBQ1BJX0VDX1NNQl9TVFNfUkVTCTB4MjAKLSNkZWZpbmUgQUNQSV9FQ19TTUJfU1RTX1NUQVRVUwkweDFmCi0KLSNkZWZpbmUgQUNQSV9FQ19TTUJfU1RBVFVTX09LCQkweDAwCi0jZGVmaW5lIEFDUElfRUNfU01CX1NUQVRVU19GQUlMCQkweDA3Ci0jZGVmaW5lIEFDUElfRUNfU01CX1NUQVRVU19ETkFLCQkweDEwCi0jZGVmaW5lIEFDUElfRUNfU01CX1NUQVRVU19ERVJSCQkweDExCi0jZGVmaW5lIEFDUElfRUNfU01CX1NUQVRVU19DTURfREVOWQkweDEyCi0jZGVmaW5lIEFDUElfRUNfU01CX1NUQVRVU19VTktOT1dOCTB4MTMKLSNkZWZpbmUgQUNQSV9FQ19TTUJfU1RBVFVTX0FDQ19ERU5ZCTB4MTcKLSNkZWZpbmUgQUNQSV9FQ19TTUJfU1RBVFVTX1RJTUVPVVQJMHgxOAotI2RlZmluZSBBQ1BJX0VDX1NNQl9TVEFUVVNfTk9UU1VQCTB4MTkKLSNkZWZpbmUgQUNQSV9FQ19TTUJfU1RBVFVTX0JVU1kJCTB4MUEKLSNkZWZpbmUgQUNQSV9FQ19TTUJfU1RBVFVTX1BFQwkJMHgxRgotCi0jZGVmaW5lIEFDUElfRUNfU01CX1BSVENMX1dSSVRFCQkJMHgwMAotI2RlZmluZSBBQ1BJX0VDX1NNQl9QUlRDTF9SRUFECQkJMHgwMQotI2RlZmluZSBBQ1BJX0VDX1NNQl9QUlRDTF9RVUlDSwkJCTB4MDIKLSNkZWZpbmUgQUNQSV9FQ19TTUJfUFJUQ0xfQllURQkJCTB4MDQKLSNkZWZpbmUgQUNQSV9FQ19TTUJfUFJUQ0xfQllURV9EQVRBCQkweDA2Ci0jZGVmaW5lIEFDUElfRUNfU01CX1BSVENMX1dPUkRfREFUQQkJMHgwOAotI2RlZmluZSBBQ1BJX0VDX1NNQl9QUlRDTF9CTE9DS19EQVRBCQkweDBhCi0jZGVmaW5lIEFDUElfRUNfU01CX1BSVENMX1BST0NfQ0FMTAkJMHgwYwotI2RlZmluZSBBQ1BJX0VDX1NNQl9QUlRDTF9CTE9DS19QUk9DX0NBTEwJMHgwZAotI2RlZmluZSBBQ1BJX0VDX1NNQl9QUlRDTF9JMkNfQkxPQ0tfREFUQQkweDRhCi0jZGVmaW5lIEFDUElfRUNfU01CX1BSVENMX1BFQwkJCTB4ODAKLQotLyogTGVuZ3RoIG9mIHByZS9wb3N0IHRyYW5zYWN0aW9uIHNsZWVwIChtc2VjKSAqLwotI2RlZmluZSBBQ1BJX0VDX1NNQl9UUkFOU0FDVElPTl9TTEVFUAkJMQotI2RlZmluZSBBQ1BJX0VDX1NNQl9BQ0NFU1NfU0xFRVAxCQkxCi0jZGVmaW5lIEFDUElfRUNfU01CX0FDQ0VTU19TTEVFUDIJCTEwCi0KLXN0YXRpYyBpbnQgYWNwaV9lY19zbWJfcmVhZChzdHJ1Y3QgYWNwaV9lY19zbWJ1cyAqc21idXMsIHU4IGFkZHJlc3MsIHU4ICogZGF0YSkKLXsKLQl1OCB2YWw7Ci0JaW50IGVycjsKLQotCWVyciA9IGVjX3JlYWQoc21idXMtPmJhc2UgKyBhZGRyZXNzLCAmdmFsKTsKLQlpZiAoIWVycikgewotCQkqZGF0YSA9IHZhbDsKLQl9Ci0JeG1zbGVlcChBQ1BJX0VDX1NNQl9UUkFOU0FDVElPTl9TTEVFUCk7Ci0JcmV0dXJuIChlcnIpOwotfQotCi1zdGF0aWMgaW50IGFjcGlfZWNfc21iX3dyaXRlKHN0cnVjdCBhY3BpX2VjX3NtYnVzICpzbWJ1cywgdTggYWRkcmVzcywgdTggZGF0YSkKLXsKLQlpbnQgZXJyOwotCi0JZXJyID0gZWNfd3JpdGUoc21idXMtPmJhc2UgKyBhZGRyZXNzLCBkYXRhKTsKLQlyZXR1cm4gKGVycik7Ci19Ci0KLXN0YXRpYyBpbnQKLWFjcGlfZWNfc21iX2FjY2VzcyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsIHUxNiBhZGRyLCB1bnNpZ25lZCBzaG9ydCBmbGFncywKLQkJICAgY2hhciByZWFkX3dyaXRlLCB1OCBjb21tYW5kLCBpbnQgc2l6ZSwKLQkJICAgdW5pb24gaTJjX3NtYnVzX2RhdGEgKmRhdGEpCi17Ci0Jc3RydWN0IGFjcGlfZWNfc21idXMgKnNtYnVzID0gYWRhcC0+YWxnb19kYXRhOwotCXVuc2lnbmVkIGNoYXIgcHJvdG9jb2wsIGxlbiA9IDAsIHBlYywgdGVtcFsyXSA9IHsgMCwgMCB9OwotCWludCBpOwotCi0JaWYgKHJlYWRfd3JpdGUgPT0gSTJDX1NNQlVTX1JFQUQpIHsKLQkJcHJvdG9jb2wgPSBBQ1BJX0VDX1NNQl9QUlRDTF9SRUFEOwotCX0gZWxzZSB7Ci0JCXByb3RvY29sID0gQUNQSV9FQ19TTUJfUFJUQ0xfV1JJVEU7Ci0JfQotCXBlYyA9IChmbGFncyAmIEkyQ19DTElFTlRfUEVDKSA/IEFDUElfRUNfU01CX1BSVENMX1BFQyA6IDA7Ci0KLQlzd2l0Y2ggKHNpemUpIHsKLQotCWNhc2UgSTJDX1NNQlVTX1FVSUNLOgotCQlwcm90b2NvbCB8PSBBQ1BJX0VDX1NNQl9QUlRDTF9RVUlDSzsKLQkJcmVhZF93cml0ZSA9IEkyQ19TTUJVU19XUklURTsKLQkJYnJlYWs7Ci0KLQljYXNlIEkyQ19TTUJVU19CWVRFOgotCQlpZiAocmVhZF93cml0ZSA9PSBJMkNfU01CVVNfV1JJVEUpIHsKLQkJCWFjcGlfZWNfc21iX3dyaXRlKHNtYnVzLCBBQ1BJX0VDX1NNQl9EQVRBLCBkYXRhLT5ieXRlKTsKLQkJfQotCQlwcm90b2NvbCB8PSBBQ1BJX0VDX1NNQl9QUlRDTF9CWVRFOwotCQlicmVhazsKLQotCWNhc2UgSTJDX1NNQlVTX0JZVEVfREFUQToKLQkJYWNwaV9lY19zbWJfd3JpdGUoc21idXMsIEFDUElfRUNfU01CX0NNRCwgY29tbWFuZCk7Ci0JCWlmIChyZWFkX3dyaXRlID09IEkyQ19TTUJVU19XUklURSkgewotCQkJYWNwaV9lY19zbWJfd3JpdGUoc21idXMsIEFDUElfRUNfU01CX0RBVEEsIGRhdGEtPmJ5dGUpOwotCQl9Ci0JCXByb3RvY29sIHw9IEFDUElfRUNfU01CX1BSVENMX0JZVEVfREFUQTsKLQkJYnJlYWs7Ci0KLQljYXNlIEkyQ19TTUJVU19XT1JEX0RBVEE6Ci0JCWFjcGlfZWNfc21iX3dyaXRlKHNtYnVzLCBBQ1BJX0VDX1NNQl9DTUQsIGNvbW1hbmQpOwotCQlpZiAocmVhZF93cml0ZSA9PSBJMkNfU01CVVNfV1JJVEUpIHsKLQkJCWFjcGlfZWNfc21iX3dyaXRlKHNtYnVzLCBBQ1BJX0VDX1NNQl9EQVRBLCBkYXRhLT53b3JkKTsKLQkJCWFjcGlfZWNfc21iX3dyaXRlKHNtYnVzLCBBQ1BJX0VDX1NNQl9EQVRBICsgMSwKLQkJCQkJICBkYXRhLT53b3JkID4+IDgpOwotCQl9Ci0JCXByb3RvY29sIHw9IEFDUElfRUNfU01CX1BSVENMX1dPUkRfREFUQSB8IHBlYzsKLQkJYnJlYWs7Ci0KLQljYXNlIEkyQ19TTUJVU19CTE9DS19EQVRBOgotCQlhY3BpX2VjX3NtYl93cml0ZShzbWJ1cywgQUNQSV9FQ19TTUJfQ01ELCBjb21tYW5kKTsKLQkJaWYgKHJlYWRfd3JpdGUgPT0gSTJDX1NNQlVTX1dSSVRFKSB7Ci0JCQlsZW4gPSBtaW5fdCh1OCwgZGF0YS0+YmxvY2tbMF0sIDMyKTsKLQkJCWFjcGlfZWNfc21iX3dyaXRlKHNtYnVzLCBBQ1BJX0VDX1NNQl9CQ05ULCBsZW4pOwotCQkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQotCQkJCWFjcGlfZWNfc21iX3dyaXRlKHNtYnVzLCBBQ1BJX0VDX1NNQl9EQVRBICsgaSwKLQkJCQkJCSAgZGF0YS0+YmxvY2tbaSArIDFdKTsKLQkJfQotCQlwcm90b2NvbCB8PSBBQ1BJX0VDX1NNQl9QUlRDTF9CTE9DS19EQVRBIHwgcGVjOwotCQlicmVhazsKLQotCWNhc2UgSTJDX1NNQlVTX0kyQ19CTE9DS19EQVRBOgotCQlsZW4gPSBtaW5fdCh1OCwgZGF0YS0+YmxvY2tbMF0sIDMyKTsKLQkJYWNwaV9lY19zbWJfd3JpdGUoc21idXMsIEFDUElfRUNfU01CX0NNRCwgY29tbWFuZCk7Ci0JCWFjcGlfZWNfc21iX3dyaXRlKHNtYnVzLCBBQ1BJX0VDX1NNQl9CQ05ULCBsZW4pOwotCQlpZiAocmVhZF93cml0ZSA9PSBJMkNfU01CVVNfV1JJVEUpIHsKLQkJCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJCWFjcGlfZWNfc21iX3dyaXRlKHNtYnVzLCBBQ1BJX0VDX1NNQl9EQVRBICsgaSwKLQkJCQkJCSAgZGF0YS0+YmxvY2tbaSArIDFdKTsKLQkJCX0KLQkJfQotCQlwcm90b2NvbCB8PSBBQ1BJX0VDX1NNQl9QUlRDTF9JMkNfQkxPQ0tfREFUQTsKLQkJYnJlYWs7Ci0KLQljYXNlIEkyQ19TTUJVU19QUk9DX0NBTEw6Ci0JCWFjcGlfZWNfc21iX3dyaXRlKHNtYnVzLCBBQ1BJX0VDX1NNQl9DTUQsIGNvbW1hbmQpOwotCQlhY3BpX2VjX3NtYl93cml0ZShzbWJ1cywgQUNQSV9FQ19TTUJfREFUQSwgZGF0YS0+d29yZCk7Ci0JCWFjcGlfZWNfc21iX3dyaXRlKHNtYnVzLCBBQ1BJX0VDX1NNQl9EQVRBICsgMSwgZGF0YS0+d29yZCA+PiA4KTsKLQkJcHJvdG9jb2wgPSBBQ1BJX0VDX1NNQl9QUlRDTF9QUk9DX0NBTEwgfCBwZWM7Ci0JCXJlYWRfd3JpdGUgPSBJMkNfU01CVVNfUkVBRDsKLQkJYnJlYWs7Ci0KLQljYXNlIEkyQ19TTUJVU19CTE9DS19QUk9DX0NBTEw6Ci0JCXByb3RvY29sIHw9IHBlYzsKLQkJbGVuID0gbWluX3QodTgsIGRhdGEtPmJsb2NrWzBdLCAzMSk7Ci0JCWFjcGlfZWNfc21iX3dyaXRlKHNtYnVzLCBBQ1BJX0VDX1NNQl9DTUQsIGNvbW1hbmQpOwotCQlhY3BpX2VjX3NtYl93cml0ZShzbWJ1cywgQUNQSV9FQ19TTUJfQkNOVCwgbGVuKTsKLQkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQotCQkJYWNwaV9lY19zbWJfd3JpdGUoc21idXMsIEFDUElfRUNfU01CX0RBVEEgKyBpLAotCQkJCQkgIGRhdGEtPmJsb2NrW2kgKyAxXSk7Ci0JCXByb3RvY29sID0gQUNQSV9FQ19TTUJfUFJUQ0xfQkxPQ0tfUFJPQ19DQUxMIHwgcGVjOwotCQlyZWFkX3dyaXRlID0gSTJDX1NNQlVTX1JFQUQ7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9XQVJOLCAiRUMgU01CdXMgYWRhcHRlcjogIgotCQkJCSAgIlVuc3VwcG9ydGVkIHRyYW5zYWN0aW9uICVkXG4iLCBzaXplKSk7Ci0JCXJldHVybiAoLTEpOwotCX0KLQotCWFjcGlfZWNfc21iX3dyaXRlKHNtYnVzLCBBQ1BJX0VDX1NNQl9BRERSLCBhZGRyIDw8IDEpOwotCWFjcGlfZWNfc21iX3dyaXRlKHNtYnVzLCBBQ1BJX0VDX1NNQl9QUlRDTCwgcHJvdG9jb2wpOwotCi0JYWNwaV9lY19zbWJfcmVhZChzbWJ1cywgQUNQSV9FQ19TTUJfU1RTLCB0ZW1wICsgMCk7Ci0KLQlpZiAofnRlbXBbMF0gJiBBQ1BJX0VDX1NNQl9TVFNfRE9ORSkgewotCQl4dWRlbGF5KDUwMCk7Ci0JCWFjcGlfZWNfc21iX3JlYWQoc21idXMsIEFDUElfRUNfU01CX1NUUywgdGVtcCArIDApOwotCX0KLQlpZiAofnRlbXBbMF0gJiBBQ1BJX0VDX1NNQl9TVFNfRE9ORSkgewotCQl4bXNsZWVwKEFDUElfRUNfU01CX0FDQ0VTU19TTEVFUDIpOwotCQlhY3BpX2VjX3NtYl9yZWFkKHNtYnVzLCBBQ1BJX0VDX1NNQl9TVFMsIHRlbXAgKyAwKTsKLQl9Ci0JaWYgKCh+dGVtcFswXSAmIEFDUElfRUNfU01CX1NUU19ET05FKQotCSAgICB8fCAodGVtcFswXSAmIEFDUElfRUNfU01CX1NUU19TVEFUVVMpKSB7Ci0JCXJldHVybiAoLTEpOwotCX0KLQotCWlmIChyZWFkX3dyaXRlID09IEkyQ19TTUJVU19XUklURSkgewotCQlyZXR1cm4gKDApOwotCX0KLQotCXN3aXRjaCAoc2l6ZSkgewotCi0JY2FzZSBJMkNfU01CVVNfQllURToKLQljYXNlIEkyQ19TTUJVU19CWVRFX0RBVEE6Ci0JCWFjcGlfZWNfc21iX3JlYWQoc21idXMsIEFDUElfRUNfU01CX0RBVEEsICZkYXRhLT5ieXRlKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEkyQ19TTUJVU19XT1JEX0RBVEE6Ci0JY2FzZSBJMkNfU01CVVNfUFJPQ19DQUxMOgotCQlhY3BpX2VjX3NtYl9yZWFkKHNtYnVzLCBBQ1BJX0VDX1NNQl9EQVRBLCB0ZW1wICsgMCk7Ci0JCWFjcGlfZWNfc21iX3JlYWQoc21idXMsIEFDUElfRUNfU01CX0RBVEEgKyAxLCB0ZW1wICsgMSk7Ci0JCWRhdGEtPndvcmQgPSAodGVtcFsxXSA8PCA4KSB8IHRlbXBbMF07Ci0JCWJyZWFrOwotCi0JY2FzZSBJMkNfU01CVVNfQkxPQ0tfREFUQToKLQljYXNlIEkyQ19TTUJVU19CTE9DS19QUk9DX0NBTEw6Ci0JCWxlbiA9IDA7Ci0JCWFjcGlfZWNfc21iX3JlYWQoc21idXMsIEFDUElfRUNfU01CX0JDTlQsICZsZW4pOwotCQlsZW4gPSBtaW5fdCh1OCwgbGVuLCAzMik7Ci0JY2FzZSBJMkNfU01CVVNfSTJDX0JMT0NLX0RBVEE6Ci0JCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKLQkJCWFjcGlfZWNfc21iX3JlYWQoc21idXMsIEFDUElfRUNfU01CX0RBVEEgKyBpLAotCQkJCQkgZGF0YS0+YmxvY2sgKyBpICsgMSk7Ci0JCWRhdGEtPmJsb2NrWzBdID0gbGVuOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gKDApOwotfQotCi1zdGF0aWMgdTMyIGFjcGlfZWNfc21iX2Z1bmMoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQotewotCi0JcmV0dXJuIChJMkNfRlVOQ19TTUJVU19RVUlDSyB8IEkyQ19GVU5DX1NNQlVTX0JZVEUgfAotCQlJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEgfCBJMkNfRlVOQ19TTUJVU19XT1JEX0RBVEEgfAotCQlJMkNfRlVOQ19TTUJVU19CTE9DS19EQVRBIHwKLQkJSTJDX0ZVTkNfU01CVVNfUFJPQ19DQUxMIHwKLQkJSTJDX0ZVTkNfU01CVVNfQkxPQ0tfUFJPQ19DQUxMIHwKLQkJSTJDX0ZVTkNfU01CVVNfSTJDX0JMT0NLIHwgSTJDX0ZVTkNfU01CVVNfSFdQRUNfQ0FMQyk7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBhY3BpX2VjX3NtYnVzX2FsZ29yaXRobSA9IHsKLQkuc21idXNfeGZlciA9IGFjcGlfZWNfc21iX2FjY2VzcywKLQkuZnVuY3Rpb25hbGl0eSA9IGFjcGlfZWNfc21iX2Z1bmMsCi19OwotCi1zdGF0aWMgaW50IGFjcGlfZWNfaGNfYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQotewotCWludCBzdGF0dXM7Ci0JdW5zaWduZWQgbG9uZyB2YWw7Ci0Jc3RydWN0IGFjcGlfZWNfaGMgKmVjX2hjOwotCXN0cnVjdCBhY3BpX2VjX3NtYnVzICpzbWJ1czsKLQotCWlmICghZGV2aWNlKSB7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWVjX2hjID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFjcGlfZWNfaGMpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWVjX2hjKSB7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCXNtYnVzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFjcGlfZWNfc21idXMpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXNtYnVzKSB7Ci0JCWtmcmVlKGVjX2hjKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JZWNfaGMtPmhhbmRsZSA9IGRldmljZS0+aGFuZGxlOwotCXN0cmNweShhY3BpX2RldmljZV9uYW1lKGRldmljZSksIEFDUElfRUNfSENfREVWSUNFX05BTUUpOwotCXN0cmNweShhY3BpX2RldmljZV9jbGFzcyhkZXZpY2UpLCBBQ1BJX0VDX0hDX0NMQVNTKTsKLQlhY3BpX2RyaXZlcl9kYXRhKGRldmljZSkgPSBlY19oYzsKLQotCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfaW50ZWdlcihlY19oYy0+aGFuZGxlLCAiX0VDIiwgTlVMTCwgJnZhbCk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfV0FSTiwgIkVycm9yIG9idGFpbmluZyBfRUNcbiIpKTsKLQkJa2ZyZWUoZWNfaGMpOwotCQlrZnJlZShzbWJ1cyk7Ci0JCXJldHVybiAtRUlPOwotCX0KLQotCXNtYnVzLT5lYyA9IGFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlLT5wYXJlbnQpOwotCXNtYnVzLT5iYXNlID0gKHZhbCAmIDB4ZmYwMHVsbCkgPj4gODsKLQlzbWJ1cy0+YWxlcnQgPSB2YWwgJiAweGZmdWxsOwotCi0Jc21idXMtPmFkYXB0ZXIub3duZXIgPSBUSElTX01PRFVMRTsKLQlzbWJ1cy0+YWRhcHRlci5hbGdvID0gJmFjcGlfZWNfc21idXNfYWxnb3JpdGhtOwotCXNtYnVzLT5hZGFwdGVyLmFsZ29fZGF0YSA9IHNtYnVzOwotCXNtYnVzLT5hZGFwdGVyLmRldi5wYXJlbnQgPSAmZGV2aWNlLT5kZXY7Ci0KLQlpZiAoaTJjX2FkZF9hZGFwdGVyKCZzbWJ1cy0+YWRhcHRlcikpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9XQVJOLAotCQkJCSAgIkVDIFNNQnVzIGFkYXB0ZXI6IEZhaWxlZCB0byByZWdpc3RlciBhZGFwdGVyXG4iKSk7Ci0JCWtmcmVlKHNtYnVzKTsKLQkJa2ZyZWUoZWNfaGMpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQllY19oYy0+c21idXMgPSBzbWJ1czsKLQotCXByaW50ayhLRVJOX0lORk8gUFJFRklYICIlcyBbJXNdXG4iLAotCSAgICAgICBhY3BpX2RldmljZV9uYW1lKGRldmljZSksIGFjcGlfZGV2aWNlX2JpZChkZXZpY2UpKTsKLQotCXJldHVybiBBRV9PSzsKLX0KLQotc3RhdGljIGludCBhY3BpX2VjX2hjX3JlbW92ZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpCi17Ci0Jc3RydWN0IGFjcGlfZWNfaGMgKmVjX2hjOwotCi0JaWYgKCFkZXZpY2UpIHsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWVjX2hjID0gYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpOwotCi0JaTJjX2RlbF9hZGFwdGVyKCZlY19oYy0+c21idXMtPmFkYXB0ZXIpOwotCWtmcmVlKGVjX2hjLT5zbWJ1cyk7Ci0Ja2ZyZWUoZWNfaGMpOwotCi0JcmV0dXJuIEFFX09LOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBhY3BpX2VjX2hjX2luaXQodm9pZCkKLXsKLQlpbnQgcmVzdWx0OwotCi0JcmVzdWx0ID0gYWNwaV9idXNfcmVnaXN0ZXJfZHJpdmVyKCZhY3BpX2VjX2hjX2RyaXZlcik7Ci0JaWYgKHJlc3VsdCA8IDApIHsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgYWNwaV9lY19oY19leGl0KHZvaWQpCi17Ci0JYWNwaV9idXNfdW5yZWdpc3Rlcl9kcml2ZXIoJmFjcGlfZWNfaGNfZHJpdmVyKTsKLX0KLQotc3RydWN0IGFjcGlfZWNfaGMgKmFjcGlfZ2V0X2VjX2hjKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQotewotCXJldHVybiBhY3BpX2RyaXZlcl9kYXRhKGRldmljZS0+cGFyZW50KTsKLX0KLQotRVhQT1JUX1NZTUJPTChhY3BpX2dldF9lY19oYyk7Ci0KLW1vZHVsZV9pbml0KGFjcGlfZWNfaGNfaW5pdCk7Ci1tb2R1bGVfZXhpdChhY3BpX2VjX2hjX2V4aXQpOwotCi1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfQVVUSE9SKCJEdWNyb3QgQnJ1bm8iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiQUNQSSBFQyBTTUJ1cyBkcml2ZXIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9pMmNfZWMuaCBiL2RyaXZlcnMvYWNwaS9pMmNfZWMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M1M2ZiNy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2FjcGkvaTJjX2VjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKgotICogU01CdXMgZHJpdmVyIGZvciBBQ1BJIEVtYmVkZGVkIENvbnRyb2xsZXIgKCRSZXZpc2lvbjogMS4yICQpCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA1IER1Y3JvdCBCcnVubwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiB2ZXJzaW9uIDIuCi0gKi8KLQotc3RydWN0IGFjcGlfZWNfc21idXMgewotCXN0cnVjdCBpMmNfYWRhcHRlciBhZGFwdGVyOwotCXVuaW9uIGFjcGlfZWMgKmVjOwotCWludCBiYXNlOwotCWludCBhbGVydDsKLX07Ci0KLXN0cnVjdCBhY3BpX2VjX2hjIHsKLQlhY3BpX2hhbmRsZSBoYW5kbGU7Ci0Jc3RydWN0IGFjcGlfZWNfc21idXMgKnNtYnVzOwotfTsKLQotc3RydWN0IGFjcGlfZWNfaGMgKmFjcGlfZ2V0X2VjX2hjKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9pYm1fYWNwaS5jIGIvZHJpdmVycy9hY3BpL2libV9hY3BpLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjMTA5NjYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9hY3BpL2libV9hY3BpLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzk4ICswLDAgQEAKLS8qCi0gKiAgaWJtX2FjcGkuYyAtIElCTSBUaGlua1BhZCBBQ1BJIEV4dHJhcwotICoKLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDA0LTIwMDUgQm9yaXNsYXYgRGVpYW5vdiA8Ym9yaXNsYXZAdXNlcnMuc2YubmV0PgotICogIENvcHlyaWdodCAoQykgMjAwNiBIZW5yaXF1ZSBkZSBNb3JhZXMgSG9sc2NodWggPGhtaEBobWguZW5nLmJyPgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotICovCi0KLSNkZWZpbmUgSUJNX1ZFUlNJT04gIjAuMTMiCi0KLS8qCi0gKiAgQ2hhbmdlbG9nOgotICoKLSAqICAyMDA2LTExLTIyCTAuMTMJbmV3IG1haW50YWluZXIKLSAqICAJCQljaGFuZ2Vsb2cgbm93IGxpdmVzIGluIGdpdCBjb21taXQgaGlzdG9yeSwgYW5kIHdpbGwKLSAqICAJCQlub3QgYmUgdXBkYXRlZCBmdXJ0aGVyIGluLWZpbGUuCi0gKiAgCi0gKiAgMjAwNS0wOC0xNyAgMC4xMglmaXggY29tcGlsYXRpb24gb24gMi42LjEzLXJjIGtlcm5lbHMKLSAqICAyMDA1LTAzLTE3CTAuMTEJc3VwcG9ydCBmb3IgNjAwZSwgNzcweAotICoJCQkgICAgdGhhbmtzIHRvIEphbWllIExlbnRpbiA8bGVudGluakBkaWFsLnBpcGV4LmNvbT4KLSAqCQkJc3VwcG9ydCBmb3IgNzcwZSwgRzQxCi0gKgkJCUc0MCBhbmQgRzQxIGRvbid0IGhhdmUgYSB0aGlua2xpZ2h0Ci0gKgkJCXRlbXBlcmF0dXJlcyBubyBsb25nZXIgZXhwZXJpbWVudGFsCi0gKgkJCWV4cGVyaW1lbnRhbCBicmlnaHRuZXNzIGNvbnRyb2wKLSAqCQkJZXhwZXJpbWVudGFsIHZvbHVtZSBjb250cm9sCi0gKgkJCWV4cGVyaW1lbnRhbCBmYW4gZW5hYmxlL2Rpc2FibGUKLSAqICAyMDA1LTAxLTE2CTAuMTAJZml4IG1vZHVsZSBsb2FkaW5nIG9uIFIzMCwgUjMxIAotICogIDIwMDUtMDEtMTYJMC45CXN1cHBvcnQgZm9yIDU3MCwgUjMwLCBSMzEKLSAqCQkJdWx0cmFiYXkgc3VwcG9ydCBvbiBBMjJwLCBBM3gKLSAqCQkJbGltaXQgYXJnIGZvciBjbW9zLCBsZWQsIGJlZXAsIGRyb3AgZXhwZXJpbWVudGFsIHN0YXR1cwotICoJCQltb3JlIGNhcGFibGUgbGVkIGNvbnRyb2wgb24gQTIxZSwgQTIycCwgVDIwLTIyLCBYMjAKLSAqCQkJZXhwZXJpbWVudGFsIHRlbXBlcmF0dXJlcyBhbmQgZmFuIHNwZWVkCi0gKgkJCWV4cGVyaW1lbnRhbCBlbWJlZGRlZCBjb250cm9sbGVyIHJlZ2lzdGVyIGR1bXAKLSAqCQkJbWFyayBtb3JlIGZ1bmN0aW9ucyBhcyBfX2luaXQsIGRyb3AgaW5jb3JyZWN0IF9fZXhpdAotICoJCQl1c2UgTU9EVUxFX1ZFUlNJT04KLSAqCQkJICAgIHRoYW5rcyB0byBIZW5yaWsgQnJpeCBBbmRlcnNlbiA8YnJpeEBnZW50b28ub3JnPgotICoJCQlmaXggcGFyYW1ldGVyIHBhc3Npbmcgb24gbW9kdWxlIGxvYWRpbmcKLSAqCQkJICAgIHRoYW5rcyB0byBSdXN0eSBSdXNzZWxsIDxydXN0eUBydXN0Y29ycC5jb20uYXU+Ci0gKgkJCSAgICB0aGFua3MgdG8gSmltIFJhZGZvcmQgPHJhZGZvcmRAYmxhY2tiZWFuLm9yZz4KLSAqICAyMDA0LTExLTA4CTAuOAlmaXggaW5pdCBlcnJvciBjYXNlLCBkb24ndCByZXR1cm4gZnJvbSBhIG1hY3JvCi0gKgkJCSAgICB0aGFua3MgdG8gQ2hyaXMgV3JpZ2h0IDxjaHJpc3dAb3NkbC5vcmc+Ci0gKiAgMjAwNC0xMC0yMwkwLjcJZml4IG1vZHVsZSBsb2FkaW5nIG9uIEEyMWUsIEEyMnAsIFQyMCwgVDIxLCBYMjAKLSAqCQkJZml4IGxlZCBjb250cm9sIG9uIEEyMWUKLSAqICAyMDA0LTEwLTE5CTAuNgl1c2UgYWNwaV9idXNfcmVnaXN0ZXJfZHJpdmVyKCkgdG8gY2xhaW0gSEtFWSBkZXZpY2UKLSAqICAyMDA0LTEwLTE4CTAuNQl0aGlua2xpZ2h0IHN1cHBvcnQgb24gQTIxZSwgRzQwLCBSMzIsIFQyMCwgVDIxLCBYMjAKLSAqCQkJcHJvYyBmaWxlIGZvcm1hdCBjaGFuZ2VkCi0gKgkJCXZpZGVvX3N3aXRjaCBjb21tYW5kCi0gKgkJCWV4cGVyaW1lbnRhbCBjbW9zIGNvbnRyb2wKLSAqCQkJZXhwZXJpbWVudGFsIGxlZCBjb250cm9sCi0gKgkJCWV4cGVyaW1lbnRhbCBhY3BpIHNvdW5kcwotICogIDIwMDQtMDktMTYJMC40CXN1cHBvcnQgZm9yIG1vZHVsZSBwYXJhbWV0ZXJzCi0gKgkJCWhvdGtleSBtYXNrIGNhbiBiZSBwcmVmaXhlZCBieSAweAotICoJCQl2aWRlbyBvdXRwdXQgc3dpdGNoaW5nCi0gKgkJCXZpZGVvIGV4cGFuc2lvbiBjb250cm9sCi0gKgkJCXVsdHJhYmF5IGVqZWN0IHN1cHBvcnQKLSAqCQkJcmVtb3ZlZCBsY2QgYnJpZ2h0bmVzcy9vbi9vZmYgY29udHJvbCwgZGlkbid0IHdvcmsKLSAqICAyMDA0LTA4LTE3CTAuMwlzdXBwb3J0IGZvciBSNDAKLSAqCQkJbGNkIG9mZiwgYnJpZ2h0bmVzcyBjb250cm9sCi0gKgkJCXRoaW5rbGlnaHQgb24vb2ZmCi0gKiAgMjAwNC0wOC0xNAkwLjIJc3VwcG9ydCBmb3IgVCBzZXJpZXMsIFgyMAotICoJCQlibHVldG9vdGggZW5hYmxlL2Rpc2FibGUKLSAqCQkJaG90a2V5IGV2ZW50cyBkaXNhYmxlZCBieSBkZWZhdWx0Ci0gKgkJCXJlbW92ZWQgZmFuIGNvbnRyb2wsIGN1cnJlbnRseSB1c2VsZXNzCi0gKiAgMjAwNC0wOC0wOQkwLjEJaW5pdGlhbCByZWxlYXNlLCBzdXBwb3J0IGZvciBYIHNlcmllcwotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLQotI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9iYWNrbGlnaHQuaD4KLSNpbmNsdWRlIDxsaW51eC9mYi5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9kbWkuaD4KLSNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+Ci0jaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+Ci0KLSNpbmNsdWRlIDxhY3BpL2FjcGlfZHJpdmVycy5oPgotI2luY2x1ZGUgPGFjcGkvYWNuYW1lc3AuaD4KLQotI2RlZmluZSBJQk1fTkFNRSAiaWJtIgotI2RlZmluZSBJQk1fREVTQyAiSUJNIFRoaW5rUGFkIEFDUEkgRXh0cmFzIgotI2RlZmluZSBJQk1fRklMRSAiaWJtX2FjcGkiCi0jZGVmaW5lIElCTV9VUkwgImh0dHA6Ly9pYm0tYWNwaS5zZi5uZXQvIgotCi1NT0RVTEVfQVVUSE9SKCJCb3Jpc2xhdiBEZWlhbm92LCBIZW5yaXF1ZSBkZSBNb3JhZXMgSG9sc2NodWgiKTsKLU1PRFVMRV9ERVNDUklQVElPTihJQk1fREVTQyk7Ci1NT0RVTEVfVkVSU0lPTihJQk1fVkVSU0lPTik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KLSNkZWZpbmUgSUJNX0RJUiBJQk1fTkFNRQotCi0jZGVmaW5lIElCTV9MT0cgSUJNX0ZJTEUgIjogIgotI2RlZmluZSBJQk1fRVJSCSAgIEtFUk5fRVJSICAgIElCTV9MT0cKLSNkZWZpbmUgSUJNX05PVElDRSBLRVJOX05PVElDRSBJQk1fTE9HCi0jZGVmaW5lIElCTV9JTkZPICAgS0VSTl9JTkZPICAgSUJNX0xPRwotI2RlZmluZSBJQk1fREVCVUcgIEtFUk5fREVCVUcgIElCTV9MT0cKLQotI2RlZmluZSBJQk1fTUFYX0FDUElfQVJHUyAzCi0KLSNkZWZpbmUgX191bnVzZWQgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpCi0KLXN0YXRpYyBpbnQgZXhwZXJpbWVudGFsOwotbW9kdWxlX3BhcmFtKGV4cGVyaW1lbnRhbCwgaW50LCAwKTsKLQotc3RhdGljIGFjcGlfaGFuZGxlIHJvb3RfaGFuZGxlID0gTlVMTDsKLQotI2RlZmluZSBJQk1fSEFORExFKG9iamVjdCwgcGFyZW50LCBwYXRocy4uLikJCQlcCi0Jc3RhdGljIGFjcGlfaGFuZGxlICBvYmplY3QjI19oYW5kbGU7CQkJXAotCXN0YXRpYyBhY3BpX2hhbmRsZSAqb2JqZWN0IyNfcGFyZW50ID0gJnBhcmVudCMjX2hhbmRsZTsJXAotCXN0YXRpYyBjaGFyICAgICAgICAqb2JqZWN0IyNfcGF0aDsJCQlcCi0Jc3RhdGljIGNoYXIgICAgICAgICpvYmplY3QjI19wYXRoc1tdID0geyBwYXRocyB9Ci0KLUlCTV9IQU5ETEUoZWMsIHJvb3QsICJcXF9TQi5QQ0kwLklTQS5FQzAiLAkvKiAyNDAsIDI0MHggKi8KLQkgICAiXFxfU0IuUENJLklTQS5FQyIsCS8qIDU3MCAqLwotCSAgICJcXF9TQi5QQ0kwLklTQTAuRUMwIiwJLyogNjAwZS94LCA3NzBlLCA3NzB4ICovCi0JICAgIlxcX1NCLlBDSTAuSVNBLkVDIiwJLyogQTIxZSwgQTJ4bS9wLCBUMjAtMjIsIFgyMC0yMSAqLwotCSAgICJcXF9TQi5QQ0kwLkFENFMuRUMwIiwJLyogaTE0MDAsIFIzMCAqLwotCSAgICJcXF9TQi5QQ0kwLklDSDMuRUMwIiwJLyogUjMxICovCi0JICAgIlxcX1NCLlBDSTAuTFBDLkVDIiwJLyogYWxsIG90aGVycyAqLwotICAgICk7Ci0KLUlCTV9IQU5ETEUodmlkLCByb290LCAiXFxfU0IuUENJLkFHUC5WR0EiLAkvKiA1NzAgKi8KLQkgICAiXFxfU0IuUENJMC5BR1AwLlZJRDAiLAkvKiA2MDBlL3gsIDc3MHggKi8KLQkgICAiXFxfU0IuUENJMC5WSUQwIiwJLyogNzcwZSAqLwotCSAgICJcXF9TQi5QQ0kwLlZJRCIsCS8qIEEyMWUsIEc0eCwgUjUwZSwgWDMwLCBYNDAgKi8KLQkgICAiXFxfU0IuUENJMC5BR1AuVklEIiwJLyogYWxsIG90aGVycyAqLwotICAgICk7CQkJCS8qIFIzMCwgUjMxICovCi0KLUlCTV9IQU5ETEUodmlkMiwgcm9vdCwgIlxcX1NCLlBDSTAuQUdQQi5WSUQiKTsJLyogRzQxICovCi0KLUlCTV9IQU5ETEUoY21vcywgcm9vdCwgIlxcVUNNUyIsCS8qIFI1MCwgUjUwZSwgUjUwcCwgUjUxLCBUNHgsIFgzMSwgWDQwICovCi0JICAgIlxcQ01PUyIsCQkvKiBBM3gsIEc0eCwgUjMyLCBUMjMsIFQzMCwgWDIyLTI0LCBYMzAgKi8KLQkgICAiXFxDTVMiLAkJLyogUjQwLCBSNDBlICovCi0gICAgKTsJCQkJLyogYWxsIG90aGVycyAqLwotI2lmZGVmIENPTkZJR19BQ1BJX0lCTV9ET0NLCi1JQk1fSEFORExFKGRvY2ssIHJvb3QsICJcXF9TQi5HRENLIiwJLyogWDMwLCBYMzEsIFg0MCAqLwotCSAgICJcXF9TQi5QQ0kwLkRPQ0siLAkvKiA2MDBlL3gsNzcwZSw3NzB4LEEyeG0vcCxUMjAtMjIsWDIwLTIxICovCi0JICAgIlxcX1NCLlBDSTAuUENJMS5ET0NLIiwJLyogYWxsIG90aGVycyAqLwotCSAgICJcXF9TQi5QQ0kuSVNBLlNMQ0UiLAkvKiA1NzAgKi8KLSAgICApOwkJCQkvKiBBMjFlLEc0eCxSMzAsUjMxLFIzMixSNDAsUjQwZSxSNTBlICovCi0jZW5kaWYKLSNpZmRlZiBDT05GSUdfQUNQSV9JQk1fQkFZCi1JQk1fSEFORExFKGJheSwgcm9vdCwgIlxcX1NCLlBDSS5JREUuU0VDTi5NQVNUIiwJLyogNTcwICovCi0JICAgIlxcX1NCLlBDSTAuSURFMC5JREVTLklEU00iLAkvKiA2MDBlL3gsIDc3MGUsIDc3MHggKi8KLQkgICAiXFxfU0IuUENJMC5TQVRBLlNDTkQuTVNUUiIsCS8qIFQ2MCwgWDYwLCBaNjAgKi8gCi0JICAgIlxcX1NCLlBDSTAuSURFMC5TQ05ELk1TVFIiLAkvKiBhbGwgb3RoZXJzICovCi0gICAgKTsJCQkJLyogQTIxZSwgUjMwLCBSMzEgKi8KLQotSUJNX0hBTkRMRShiYXlfZWosIGJheSwgIl9FSjMiLAkvKiA2MDBlL3gsIEEyeG0vcCwgQTN4ICovCi0JICAgIl9FSjAiLAkJLyogYWxsIG90aGVycyAqLwotICAgICk7CQkJCS8qIDU3MCxBMjFlLEc0eCxSMzAsUjMxLFIzMixSNDBlLFI1MGUgKi8KLQotSUJNX0hBTkRMRShiYXkyLCByb290LCAiXFxfU0IuUENJMC5JREUwLlBSSU0uU0xBViIsCS8qIEEzeCwgUjMyICovCi0JICAgIlxcX1NCLlBDSTAuSURFMC5JREVQLklEUFMiLAkvKiA2MDBlL3gsIDc3MGUsIDc3MHggKi8KLSAgICApOwkJCQkvKiBhbGwgb3RoZXJzICovCi0KLUlCTV9IQU5ETEUoYmF5Ml9laiwgYmF5MiwgIl9FSjMiLAkvKiA2MDBlL3gsIDc3MGUsIEEzeCAqLwotCSAgICJfRUowIiwJCS8qIDc3MHggKi8KLSAgICApOwkJCQkvKiBhbGwgb3RoZXJzICovCi0jZW5kaWYgLyogQ09ORklHX0FDUElfSUJNX0JBWSAqLwotCi0vKiBkb24ndCBsaXN0IG90aGVyIGFsdGVybmF0aXZlcyBhcyB3ZSBpbnN0YWxsIGEgbm90aWZ5IGhhbmRsZXIgb24gdGhlIDU3MCAqLwotSUJNX0hBTkRMRShwY2ksIHJvb3QsICJcXF9TQi5QQ0kiKTsJLyogNTcwICovCi0KLUlCTV9IQU5ETEUoaGtleSwgZWMsICJcXF9TQi5IS0VZIiwJLyogNjAwZS94LCA3NzBlLCA3NzB4ICovCi0JICAgIl5IS0VZIiwJCS8qIFIzMCwgUjMxICovCi0JICAgIkhLRVkiLAkJLyogYWxsIG90aGVycyAqLwotICAgICk7CQkJCS8qIDU3MCAqLwotCi1JQk1fSEFORExFKGxnaHQsIHJvb3QsICJcXExHSFQiKTsJLyogQTIxZSwgQTJ4bS9wLCBUMjAtMjIsIFgyMC0yMSAqLwotSUJNX0hBTkRMRShsZWRiLCBlYywgIkxFREIiKTsJLyogRzR4ICovCi0KLUlCTV9IQU5ETEUobGVkLCBlYywgIlNMRUQiLAkvKiA1NzAgKi8KLQkgICAiU1lTTCIsCQkvKiA2MDBlL3gsIDc3MGUsIDc3MHgsIEEyMWUsIEEyeG0vcCwgVDIwLTIyLCBYMjAtMjEgKi8KLQkgICAiTEVEIiwJCS8qIGFsbCBvdGhlcnMgKi8KLSAgICApOwkJCQkvKiBSMzAsIFIzMSAqLwotCi1JQk1fSEFORExFKGJlZXAsIGVjLCAiQkVFUCIpOwkvKiBhbGwgZXhjZXB0IFIzMCwgUjMxICovCi1JQk1fSEFORExFKGVjcmQsIGVjLCAiRUNSRCIpOwkvKiA1NzAgKi8KLUlCTV9IQU5ETEUoZWN3ciwgZWMsICJFQ1dSIik7CS8qIDU3MCAqLwotSUJNX0hBTkRMRShmYW5zLCBlYywgIkZBTlMiKTsJLyogWDMxLCBYNDAsIFg0MSAqLwotCi1JQk1fSEFORExFKGdmYW4sIGVjLCAiR0ZBTiIsCS8qIDU3MCAqLwotCSAgICJcXEZTUEQiLAkJLyogNjAwZS94LCA3NzBlLCA3NzB4ICovCi0gICAgKTsJCQkJLyogYWxsIG90aGVycyAqLwotCi1JQk1fSEFORExFKHNmYW4sIGVjLCAiU0ZBTiIsCS8qIDU3MCAqLwotCSAgICJKRk5TIiwJCS8qIDc3MHgtSkwgKi8KLSAgICApOwkJCQkvKiBhbGwgb3RoZXJzICovCi0KLSNkZWZpbmUgSUJNX0hLRVlfSElECSJJQk0wMDY4IgotI2RlZmluZSBJQk1fUENJX0hJRAkiUE5QMEEwMyIKLQotZW51bSB0aGVybWFsX2FjY2Vzc19tb2RlIHsKLQlJQk1BQ1BJX1RIRVJNQUxfTk9ORSA9IDAsCS8qIE5vIHRoZXJtYWwgc3VwcG9ydCAqLwotCUlCTUFDUElfVEhFUk1BTF9BQ1BJX1RNUDA3LAkvKiBVc2UgQUNQSSBUTVAwLTcgKi8KLQlJQk1BQ1BJX1RIRVJNQUxfQUNQSV9VUERULAkvKiBVc2UgQUNQSSBUTVAwLTcgd2l0aCBVUERUICovCi0JSUJNQUNQSV9USEVSTUFMX1RQRUNfOCwJCS8qIFVzZSBBQ1BJIEVDIHJlZ3MsIDggc2Vuc29ycyAqLwotCUlCTUFDUElfVEhFUk1BTF9UUEVDXzE2LAkvKiBVc2UgQUNQSSBFQyByZWdzLCAxNiBzZW5zb3JzICovCi19OwotCi0jZGVmaW5lIElCTUFDUElfTUFYX1RIRVJNQUxfU0VOU09SUyAxNgkvKiBNYXggdGhlcm1hbCBzZW5zb3JzIHN1cHBvcnRlZCAqLwotc3RydWN0IGlibV90aGVybWFsX3NlbnNvcnNfc3RydWN0IHsKLQlzMzIgdGVtcFtJQk1BQ1BJX01BWF9USEVSTUFMX1NFTlNPUlNdOwotfTsKLQotLyoKLSAqIEZBTiBBQ0NFU1MgTU9ERVMKLSAqCi0gKiBJQk1BQ1BJX0ZBTl9SRF9BQ1BJX0dGQU46Ci0gKiAJQUNQSSBHRkFOIG1ldGhvZDogcmV0dXJucyBmYW4gbGV2ZWwKLSAqCi0gKiAJc2VlIElCTUFDUElfRkFOX1dSX0FDUElfU0ZBTgotICogCUVDIDB4MmYgbm90IGF2YWlsYWJsZSBpZiBHRkFOIGV4aXN0cwotICoKLSAqIElCTUFDUElfRkFOX1dSX0FDUElfU0ZBTjoKLSAqIAlBQ1BJIFNGQU4gbWV0aG9kOiBzZXRzIGZhbiBsZXZlbCwgMCAoc3RvcCkgdG8gNyAobWF4KQotICoKLSAqIAlFQyAweDJmIG1pZ2h0IGJlIGF2YWlsYWJsZSAqZm9yIHJlYWRpbmcqLCBidXQgbmV2ZXIgZm9yIHdyaXRpbmcuCi0gKgotICogSUJNQUNQSV9GQU5fV1JfVFBFQzoKLSAqIAlUaGlua1BhZCBFQyByZWdpc3RlciAweDJmIChIRlNQKTogZmFuIGNvbnRyb2wgbG9vcCBtb2RlIFN1cHBvcnRlZAotICogCW9uIGFsbW9zdCBhbGwgVGhpbmtQYWRzCi0gKgotICogCUZhbiBzcGVlZCBjaGFuZ2VzIG9mIGFueSBzb3J0IChpbmNsdWRpbmcgdGhvc2UgY2F1c2VkIGJ5IHRoZQotICogCWRpc2VuZ2FnZWQgbW9kZSkgYXJlIHVzdWFsbHkgZG9uZSBzbG93bHkgYnkgdGhlIGZpcm13YXJlIGFzIHRoZQotICogCW1heGltdW0gYW1tb3VudCBvZiBmYW4gZHV0eSBjeWNsZSBjaGFuZ2UgcGVyIHNlY29uZCBzZWVtcyB0byBiZQotICogCWxpbWl0ZWQuCi0gKgotICogCVJlYWRpbmcgaXMgbm90IGF2YWlsYWJsZSBpZiBHRkFOIGV4aXN0cy4KLSAqIAlXcml0aW5nIGlzIG5vdCBhdmFpbGFibGUgaWYgU0ZBTiBleGlzdHMuCi0gKgotICogCUJpdHMKLSAqCSA3CWF1dG9tYXRpYyBtb2RlIGVuZ2FnZWQ7Ci0gKiAgCQkoZGVmYXVsdCBvcGVyYXRpb24gbW9kZSBvZiB0aGUgVGhpbmtQYWQpCi0gKiAJCWZhbiBsZXZlbCBpcyBpZ25vcmVkIGluIHRoaXMgbW9kZS4KLSAqCSA2CWRpc2VuZ2FnZSBtb2RlICh0YWtlcyBwcmVjZWRlbmNlIG92ZXIgYml0IDcpOwotICoJCW5vdCBhdmFpbGFibGUgb24gYWxsIHRoaW5rcGFkcy4gIE1heSBkaXNhYmxlCi0gKgkJdGhlIHRhY2hvbWV0ZXIsIGFuZCBzcGVlZHMgdXAgZmFuIHRvIDEwMCUgZHV0eS1jeWNsZSwKLSAqCQl3aGljaCBzcGVlZHMgaXQgdXAgZmFyIGFib3ZlIHRoZSBzdGFuZGFyZCBSUE0KLSAqCQlsZXZlbHMuICBJdCBpcyBub3QgaW1wb3NzaWJsZSB0aGF0IGl0IGNvdWxkIGNhdXNlCi0gKgkJaGFyZHdhcmUgZGFtYWdlLgotICoJNS0zCXVudXNlZCBpbiBzb21lIG1vZGVscy4gIEV4dHJhIGJpdHMgZm9yIGZhbiBsZXZlbAotICoJCWluIG90aGVycywgYnV0IHN0aWxsIHVzZWxlc3MgYXMgYWxsIHZhbHVlcyBhYm92ZQotICoJCTcgbWFwIHRvIHRoZSBzYW1lIHNwZWVkIGFzIGxldmVsIDcgaW4gdGhlc2UgbW9kZWxzLgotICoJMi0wCWZhbiBsZXZlbCAoMC4uNyB1c3VhbGx5KQotICoJCQkweDAwID0gc3RvcAotICogCQkJMHgwNyA9IG1heCAoc2V0IHdoZW4gdGVtcGVyYXR1cmVzIGNyaXRpY2FsKQotICogCQlTb21lIFRoaW5rUGFkcyBtYXkgaGF2ZSBvdGhlciBsZXZlbHMsIHNlZQotICogCQlJQk1BQ1BJX0ZBTl9XUl9BQ1BJX0ZBTlMgKFgzMS9YNDAvWDQxKQotICoKLSAqCUZJUk1XQVJFIEJVRzogb24gc29tZSBtb2RlbHMsIEVDIDB4MmYgbWlnaHQgbm90IGJlIGluaXRpYWxpemVkIGF0Ci0gKglib290LiBBcHBhcmVudGx5IHRoZSBFQyBkb2VzIG5vdCBpbnRpYWxpemUgaXQsIHNvIHVubGVzcyBBQ1BJIERTRFQKLSAqCWRvZXMgc28sIGl0cyBpbml0aWFsIHZhbHVlIGlzIG1lYW5pbmdsZXNzICgweDA3KS4KLSAqCi0gKglGb3IgZmlybXdhcmUgYnVncywgcmVmZXIgdG86Ci0gKglodHRwOi8vdGhpbmt3aWtpLm9yZy93aWtpL0VtYmVkZGVkX0NvbnRyb2xsZXJfRmlybXdhcmUjRmlybXdhcmVfSXNzdWVzCi0gKgotICogCS0tLS0KLSAqCi0gKglUaGlua1BhZCBFQyByZWdpc3RlciAweDg0IChMU0IpLCAweDg1IChNU0IpOgotICoJTWFpbiBmYW4gdGFjaG9tZXRlciByZWFkaW5nIChpbiBSUE0pCi0gKgotICoJVGhpcyByZWdpc3RlciBpcyBwcmVzZW50IG9uIGFsbCBUaGlua1BhZHMgd2l0aCBhIG5ldy1zdHlsZSBFQywgYW5kCi0gKglpdCBpcyBrbm93biBub3QgdG8gYmUgcHJlc2VudCBvbiB0aGUgQTIxbS9lLCBhbmQgVDIyLCBhcyB0aGVyZSBpcwotICoJc29tZXRoaW5nIGVsc2UgaW4gb2Zmc2V0IDB4ODQgYWNjb3JkaW5nIHRvIHRoZSBBQ1BJIERTRFQuICBPdGhlcgotICoJVGhpbmtQYWRzIGZyb20gdGhpcyBzYW1lIHRpbWUgcGVyaW9kIChhbmQgZWFybGllcikgcHJvYmFibHkgbGFjayB0aGUKLSAqCXRhY2hvbWV0ZXIgYXMgd2VsbC4KLSAqCi0gKglVbmZvcnR1bmF0ZWx5IGEgbG90IG9mIFRoaW5rUGFkcyB3aXRoIG5ldy1zdHlsZSBFQ3MgYnV0IHdob3NlIGZpcndtYXJlCi0gKgl3YXMgbmV2ZXIgZml4ZWQgYnkgSUJNIHRvIHJlcG9ydCB0aGUgRUMgZmlybXdhcmUgdmVyc2lvbiBzdHJpbmcKLSAqCXByb2JhYmx5IHN1cHBvcnQgdGhlIHRhY2hvbWV0ZXIgKGxpa2UgdGhlIGVhcmx5IFggbW9kZWxzKSwgc28KLSAqCWRldGVjdGluZyBpdCBpcyBxdWl0ZSBoYXJkLiAgV2UgbmVlZCBtb3JlIGRhdGEgdG8ga25vdyBmb3Igc3VyZS4KLSAqCi0gKglGSVJNV0FSRSBCVUc6IGFsd2F5cyByZWFkIDB4ODQgZmlyc3QsIG90aGVyd2lzZSBpbmNvcnJlY3QgcmVhZGluZ3MKLSAqCW1pZ2h0IHJlc3VsdC4KLSAqCi0gKglGSVJNV0FSRSBCVUc6IHdoZW4gRUMgMHgyZiBiaXQgNiBpcyBzZXQgKGRpc2VuZ2FnZWQgbW9kZSksIHRoaXMKLSAqCXJlZ2lzdGVyIGlzIG5vdCBpbnZhbGlkYXRlZCBpbiBUaGlua1BhZHMgdGhhdCBkaXNhYmxlIHRhY2hvbWV0ZXIKLSAqCXJlYWRpbmdzLiAgVGh1cywgdGhlIHRhY2hvbWV0ZXIgcmVhZGluZ3MgZ28gc3RhbGUuCi0gKgotICoJRm9yIGZpcm13YXJlIGJ1Z3MsIHJlZmVyIHRvOgotICoJaHR0cDovL3RoaW5rd2lraS5vcmcvd2lraS9FbWJlZGRlZF9Db250cm9sbGVyX0Zpcm13YXJlI0Zpcm13YXJlX0lzc3VlcwotICoKLSAqIElCTUFDUElfRkFOX1dSX0FDUElfRkFOUzoKLSAqCVRoaW5rUGFkIFgzMSwgWDQwLCBYNDEuICBOb3QgYXZhaWxhYmxlIGluIHRoZSBYNjAuCi0gKgotICoJRkFOUyBBQ1BJIGhhbmRsZTogdGFrZXMgdGhyZWUgYXJndW1lbnRzOiBsb3cgc3BlZWQsIG1lZGl1bSBzcGVlZCwKLSAqCWhpZ2ggc3BlZWQuICBBQ1BJIERTRFQgc2VlbXMgdG8gbWFwIHRoZXNlIHRocmVlIHNwZWVkcyB0byBsZXZlbHMKLSAqCWFzIGZvbGxvd3M6IFNUT1AgTE9XIExPVyBNRUQgTUVEIEhJR0ggSElHSCBISUdIIEhJR0gKLSAqCSh0aGlzIG1hcCBpcyBzdG9yZWQgb24gRkFOMC4uRkFOOCBhcyAiMCwxLDEsMiwyLDMsMywzLDMiKQotICoKLSAqIAlUaGUgc3BlZWRzIGFyZSBzdG9yZWQgb24gaGFuZGxlcwotICogCShGQU5BOkZBTjkpLCAoRkFOQzpGQU5CKSwgKEZBTkU6RkFORCkuCi0gKgotICogCVRoZXJlIGFyZSB0aHJlZSBkZWZhdWx0IHNwZWVkIHNldHMsIGFjZXNzaWJsZSBhcyBoYW5kbGVzOgotICogCUZTMUwsRlMxTSxGUzFIOyBGUzJMLEZTMk0sRlMySDsgRlMzTCxGUzNNLEZTM0gKLSAqCi0gKiAJQUNQSSBEU0RUIHN3aXRjaGVzIHdoaWNoIHNldCBpcyBpbiB1c2UgZGVwZW5kaW5nIG9uIHZhcmlvdXMKLSAqIAlmYWN0b3JzLgotICoKLSAqIAlJQk1BQ1BJX0ZBTl9XUl9UUEVDIGlzIGFsc28gYXZhaWxhYmxlIGFuZCBzaG91bGQgYmUgdXNlZCB0bwotICogCWNvbW1hbmQgdGhlIGZhbi4gIFRoZSBYMzEvWDQwL1g0MSBzZWVtcyB0byBoYXZlIDggZmFuIGxldmVscywKLSAqIAlidXQgdGhlIEFDUEkgdGFibGVzIGp1c3QgbWVudGlvbiBsZXZlbCA3LgotICovCi0KLWVudW0gZmFuX3N0YXR1c19hY2Nlc3NfbW9kZSB7Ci0JSUJNQUNQSV9GQU5fTk9ORSA9IDAsCQkvKiBObyBmYW4gc3RhdHVzIG9yIGNvbnRyb2wgKi8KLQlJQk1BQ1BJX0ZBTl9SRF9BQ1BJX0dGQU4sCS8qIFVzZSBBQ1BJIEdGQU4gKi8KLQlJQk1BQ1BJX0ZBTl9SRF9UUEVDLAkJLyogVXNlIEFDUEkgRUMgcmVncyAweDJmLCAweDg0LTB4ODUgKi8KLX07Ci0KLWVudW0gZmFuX2NvbnRyb2xfYWNjZXNzX21vZGUgewotCUlCTUFDUElfRkFOX1dSX05PTkUgPSAwLAkvKiBObyBmYW4gY29udHJvbCAqLwotCUlCTUFDUElfRkFOX1dSX0FDUElfU0ZBTiwJLyogVXNlIEFDUEkgU0ZBTiAqLwotCUlCTUFDUElfRkFOX1dSX1RQRUMsCQkvKiBVc2UgQUNQSSBFQyByZWcgMHgyZiAqLwotCUlCTUFDUElfRkFOX1dSX0FDUElfRkFOUywJLyogVXNlIEFDUEkgRkFOUyBhbmQgRUMgcmVnIDB4MmYgKi8KLX07Ci0KLWVudW0gZmFuX2NvbnRyb2xfY29tbWFuZHMgewotCUlCTUFDUElfRkFOX0NNRF9TUEVFRCAJPSAweDAwMDEsCS8qIHNwZWVkIGNvbW1hbmQgKi8KLQlJQk1BQ1BJX0ZBTl9DTURfTEVWRUwgCT0gMHgwMDAyLAkvKiBsZXZlbCBjb21tYW5kICAqLwotCUlCTUFDUElfRkFOX0NNRF9FTkFCTEUJPSAweDAwMDQsCS8qIGVuYWJsZS9kaXNhYmxlIGNtZCwKLQkJCQkJCSAqIGFuZCBhbHNvIHdhdGNoZG9nIGNtZCAqLwotfTsKLQotZW51bSB7CQkJCQkvKiBGYW4gY29udHJvbCBjb25zdGFudHMgKi8KLQlmYW5fc3RhdHVzX29mZnNldCA9IDB4MmYsCS8qIEVDIHJlZ2lzdGVyIDB4MmYgKi8KLQlmYW5fcnBtX29mZnNldCA9IDB4ODQsCQkvKiBFQyByZWdpc3RlciAweDg0OiBMU0IsIDB4ODUgTVNCIChSUE0pCi0JCQkJCSAqIDB4ODQgbXVzdCBiZSByZWFkIGJlZm9yZSAweDg1ICovCi0KLQlJQk1BQ1BJX0ZBTl9FQ19ESVNFTkdBR0VEIAk9IDB4NDAsCS8qIEVDIG1vZGU6IHRhY2hvbWV0ZXIKLQkJCQkJCSAqIGRpc2VuZ2FnZWQgKi8KLQlJQk1BQ1BJX0ZBTl9FQ19BVVRPCQk9IDB4ODAsIC8qIEVDIG1vZGU6IGF1dG8gZmFuCi0JCQkJCQkgKiBjb250cm9sICovCi19OwotCi1zdGF0aWMgY2hhciAqaWJtX3RoaW5rcGFkX2VjX2ZvdW5kID0gTlVMTDsKLQotc3RydWN0IGlibV9zdHJ1Y3QgewotCWNoYXIgKm5hbWU7Ci0JY2hhciBwYXJhbVszMl07Ci0KLQljaGFyICpoaWQ7Ci0Jc3RydWN0IGFjcGlfZHJpdmVyICpkcml2ZXI7Ci0KLQlpbnQgKCppbml0KSAodm9pZCk7Ci0JaW50ICgqcmVhZCkgKGNoYXIgKik7Ci0JaW50ICgqd3JpdGUpIChjaGFyICopOwotCXZvaWQgKCpleGl0KSAodm9pZCk7Ci0KLQl2b2lkICgqbm90aWZ5KSAoc3RydWN0IGlibV9zdHJ1Y3QgKiwgdTMyKTsKLQlhY3BpX2hhbmRsZSAqaGFuZGxlOwotCWludCB0eXBlOwotCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlOwotCi0JaW50IGRyaXZlcl9yZWdpc3RlcmVkOwotCWludCBwcm9jX2NyZWF0ZWQ7Ci0JaW50IGluaXRfY2FsbGVkOwotCWludCBub3RpZnlfaW5zdGFsbGVkOwotCi0JaW50IGV4cGVyaW1lbnRhbDsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NfZGlyID0gTlVMTDsKLQotc3RhdGljIHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICppYm1fYmFja2xpZ2h0X2RldmljZSA9IE5VTEw7Ci0KLSNkZWZpbmUgb25vZmYoc3RhdHVzLGJpdCkgKChzdGF0dXMpICYgKDEgPDwgKGJpdCkpID8gIm9uIiA6ICJvZmYiKQotI2RlZmluZSBlbmFibGVkKHN0YXR1cyxiaXQpICgoc3RhdHVzKSAmICgxIDw8IChiaXQpKSA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpCi0jZGVmaW5lIHN0cmxlbmNtcChhLGIpIChzdHJuY21wKChhKSwgKGIpLCBzdHJsZW4oYikpKQotCi1zdGF0aWMgaW50IGFjcGlfZXZhbGYoYWNwaV9oYW5kbGUgaGFuZGxlLAotCQkgICAgICB2b2lkICpyZXMsIGNoYXIgKm1ldGhvZCwgY2hhciAqZm10LCAuLi4pCi17Ci0JY2hhciAqZm10MCA9IGZtdDsKLQlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCBwYXJhbXM7Ci0JdW5pb24gYWNwaV9vYmplY3QgaW5fb2Jqc1tJQk1fTUFYX0FDUElfQVJHU107Ci0Jc3RydWN0IGFjcGlfYnVmZmVyIHJlc3VsdCwgKnJlc3VsdHA7Ci0JdW5pb24gYWNwaV9vYmplY3Qgb3V0X29iajsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0JdmFfbGlzdCBhcDsKLQljaGFyIHJlc190eXBlOwotCWludCBzdWNjZXNzOwotCWludCBxdWlldDsKLQotCWlmICghKmZtdCkgewotCQlwcmludGsoSUJNX0VSUiAiYWNwaV9ldmFsZigpIGNhbGxlZCB3aXRoIGVtcHR5IGZvcm1hdFxuIik7Ci0JCXJldHVybiAwOwotCX0KLQotCWlmICgqZm10ID09ICdxJykgewotCQlxdWlldCA9IDE7Ci0JCWZtdCsrOwotCX0gZWxzZQotCQlxdWlldCA9IDA7Ci0KLQlyZXNfdHlwZSA9ICooZm10KyspOwotCi0JcGFyYW1zLmNvdW50ID0gMDsKLQlwYXJhbXMucG9pbnRlciA9ICZpbl9vYmpzWzBdOwotCi0JdmFfc3RhcnQoYXAsIGZtdCk7Ci0Jd2hpbGUgKCpmbXQpIHsKLQkJY2hhciBjID0gKihmbXQrKyk7Ci0JCXN3aXRjaCAoYykgewotCQljYXNlICdkJzoJLyogaW50ICovCi0JCQlpbl9vYmpzW3BhcmFtcy5jb3VudF0uaW50ZWdlci52YWx1ZSA9IHZhX2FyZyhhcCwgaW50KTsKLQkJCWluX29ianNbcGFyYW1zLmNvdW50KytdLnR5cGUgPSBBQ1BJX1RZUEVfSU5URUdFUjsKLQkJCWJyZWFrOwotCQkJLyogYWRkIG1vcmUgdHlwZXMgYXMgbmVlZGVkICovCi0JCWRlZmF1bHQ6Ci0JCQlwcmludGsoSUJNX0VSUiAiYWNwaV9ldmFsZigpIGNhbGxlZCAiCi0JCQkgICAgICAgIndpdGggaW52YWxpZCBmb3JtYXQgY2hhcmFjdGVyICclYydcbiIsIGMpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0JdmFfZW5kKGFwKTsKLQotCWlmIChyZXNfdHlwZSAhPSAndicpIHsKLQkJcmVzdWx0Lmxlbmd0aCA9IHNpemVvZihvdXRfb2JqKTsKLQkJcmVzdWx0LnBvaW50ZXIgPSAmb3V0X29iajsKLQkJcmVzdWx0cCA9ICZyZXN1bHQ7Ci0JfSBlbHNlCi0JCXJlc3VsdHAgPSBOVUxMOwotCi0Jc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QoaGFuZGxlLCBtZXRob2QsICZwYXJhbXMsIHJlc3VsdHApOwotCi0Jc3dpdGNoIChyZXNfdHlwZSkgewotCWNhc2UgJ2QnOgkJLyogaW50ICovCi0JCWlmIChyZXMpCi0JCQkqKGludCAqKXJlcyA9IG91dF9vYmouaW50ZWdlci52YWx1ZTsKLQkJc3VjY2VzcyA9IHN0YXR1cyA9PSBBRV9PSyAmJiBvdXRfb2JqLnR5cGUgPT0gQUNQSV9UWVBFX0lOVEVHRVI7Ci0JCWJyZWFrOwotCWNhc2UgJ3YnOgkJLyogdm9pZCAqLwotCQlzdWNjZXNzID0gc3RhdHVzID09IEFFX09LOwotCQlicmVhazsKLQkJLyogYWRkIG1vcmUgdHlwZXMgYXMgbmVlZGVkICovCi0JZGVmYXVsdDoKLQkJcHJpbnRrKElCTV9FUlIgImFjcGlfZXZhbGYoKSBjYWxsZWQgIgotCQkgICAgICAgIndpdGggaW52YWxpZCBmb3JtYXQgY2hhcmFjdGVyICclYydcbiIsIHJlc190eXBlKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKCFzdWNjZXNzICYmICFxdWlldCkKLQkJcHJpbnRrKElCTV9FUlIgImFjcGlfZXZhbGYoJXMsICVzLCAuLi4pIGZhaWxlZDogJWRcbiIsCi0JCSAgICAgICBtZXRob2QsIGZtdDAsIHN0YXR1cyk7Ci0KLQlyZXR1cm4gc3VjY2VzczsKLX0KLQotc3RhdGljIHZvaWQgX191bnVzZWQgYWNwaV9wcmludF9pbnQoYWNwaV9oYW5kbGUgaGFuZGxlLCBjaGFyICptZXRob2QpCi17Ci0JaW50IGk7Ci0KLQlpZiAoYWNwaV9ldmFsZihoYW5kbGUsICZpLCBtZXRob2QsICJkIikpCi0JCXByaW50ayhJQk1fSU5GTyAiJXMgPSAweCV4XG4iLCBtZXRob2QsIGkpOwotCWVsc2UKLQkJcHJpbnRrKElCTV9FUlIgImVycm9yIGNhbGxpbmcgJXNcbiIsIG1ldGhvZCk7Ci19Ci0KLXN0YXRpYyBjaGFyICpuZXh0X2NtZChjaGFyICoqY21kcykKLXsKLQljaGFyICpzdGFydCA9ICpjbWRzOwotCWNoYXIgKmVuZDsKLQotCXdoaWxlICgoZW5kID0gc3RyY2hyKHN0YXJ0LCAnLCcpKSAmJiBlbmQgPT0gc3RhcnQpCi0JCXN0YXJ0ID0gZW5kICsgMTsKLQotCWlmICghZW5kKQotCQlyZXR1cm4gTlVMTDsKLQotCSplbmQgPSAwOwotCSpjbWRzID0gZW5kICsgMTsKLQlyZXR1cm4gc3RhcnQ7Ci19Ci0KLXN0YXRpYyBpbnQgaWJtX2FjcGlfZHJpdmVyX2luaXQodm9pZCkKLXsKLQlwcmludGsoSUJNX0lORk8gIiVzIHYlc1xuIiwgSUJNX0RFU0MsIElCTV9WRVJTSU9OKTsKLQlwcmludGsoSUJNX0lORk8gIiVzXG4iLCBJQk1fVVJMKTsKLQotCWlmIChpYm1fdGhpbmtwYWRfZWNfZm91bmQpCi0JCXByaW50ayhJQk1fSU5GTyAiVGhpbmtQYWQgRUMgZmlybXdhcmUgJXNcbiIsCi0JCSAgICAgICBpYm1fdGhpbmtwYWRfZWNfZm91bmQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZHJpdmVyX3JlYWQoY2hhciAqcCkKLXsKLQlpbnQgbGVuID0gMDsKLQotCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJkcml2ZXI6XHRcdCVzXG4iLCBJQk1fREVTQyk7Ci0JbGVuICs9IHNwcmludGYocCArIGxlbiwgInZlcnNpb246XHQlc1xuIiwgSUJNX1ZFUlNJT04pOwotCi0JcmV0dXJuIGxlbjsKLX0KLQotc3RhdGljIGludCBob3RrZXlfc3VwcG9ydGVkOwotc3RhdGljIGludCBob3RrZXlfbWFza19zdXBwb3J0ZWQ7Ci1zdGF0aWMgaW50IGhvdGtleV9vcmlnX3N0YXR1czsKLXN0YXRpYyBpbnQgaG90a2V5X29yaWdfbWFzazsKLQotc3RhdGljIGludCBob3RrZXlfZ2V0KGludCAqc3RhdHVzLCBpbnQgKm1hc2spCi17Ci0JaWYgKCFhY3BpX2V2YWxmKGhrZXlfaGFuZGxlLCBzdGF0dXMsICJESEtDIiwgImQiKSkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoaG90a2V5X21hc2tfc3VwcG9ydGVkKQotCQlpZiAoIWFjcGlfZXZhbGYoaGtleV9oYW5kbGUsIG1hc2ssICJESEtOIiwgImQiKSkKLQkJCXJldHVybiAwOwotCi0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgaG90a2V5X3NldChpbnQgc3RhdHVzLCBpbnQgbWFzaykKLXsKLQlpbnQgaTsKLQotCWlmICghYWNwaV9ldmFsZihoa2V5X2hhbmRsZSwgTlVMTCwgIk1IS0MiLCAidmQiLCBzdGF0dXMpKQotCQlyZXR1cm4gMDsKLQotCWlmIChob3RrZXlfbWFza19zdXBwb3J0ZWQpCi0JCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7Ci0JCQlpbnQgYml0ID0gKCgxIDw8IGkpICYgbWFzaykgIT0gMDsKLQkJCWlmICghYWNwaV9ldmFsZihoa2V5X2hhbmRsZSwKLQkJCQkJTlVMTCwgIk1IS00iLCAidmRkIiwgaSArIDEsIGJpdCkpCi0JCQkJcmV0dXJuIDA7Ci0JCX0KLQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IGhvdGtleV9pbml0KHZvaWQpCi17Ci0JLyogaG90a2V5IG5vdCBzdXBwb3J0ZWQgb24gNTcwICovCi0JaG90a2V5X3N1cHBvcnRlZCA9IGhrZXlfaGFuZGxlICE9IE5VTEw7Ci0KLQlpZiAoaG90a2V5X3N1cHBvcnRlZCkgewotCQkvKiBtYXNrIG5vdCBzdXBwb3J0ZWQgb24gNTcwLCA2MDBlL3gsIDc3MGUsIDc3MHgsIEEyMWUsIEEyeG0vcCwKLQkJICAgQTMwLCBSMzAsIFIzMSwgVDIwLTIyLCBYMjAtMjEsIFgyMi0yNCAqLwotCQlob3RrZXlfbWFza19zdXBwb3J0ZWQgPQotCQkgICAgYWNwaV9ldmFsZihoa2V5X2hhbmRsZSwgTlVMTCwgIkRIS04iLCAicXYiKTsKLQotCQlpZiAoIWhvdGtleV9nZXQoJmhvdGtleV9vcmlnX3N0YXR1cywgJmhvdGtleV9vcmlnX21hc2spKQotCQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgaG90a2V5X3JlYWQoY2hhciAqcCkKLXsKLQlpbnQgc3RhdHVzLCBtYXNrOwotCWludCBsZW4gPSAwOwotCi0JaWYgKCFob3RrZXlfc3VwcG9ydGVkKSB7Ci0JCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJzdGF0dXM6XHRcdG5vdCBzdXBwb3J0ZWRcbiIpOwotCQlyZXR1cm4gbGVuOwotCX0KLQotCWlmICghaG90a2V5X2dldCgmc3RhdHVzLCAmbWFzaykpCi0JCXJldHVybiAtRUlPOwotCi0JbGVuICs9IHNwcmludGYocCArIGxlbiwgInN0YXR1czpcdFx0JXNcbiIsIGVuYWJsZWQoc3RhdHVzLCAwKSk7Ci0JaWYgKGhvdGtleV9tYXNrX3N1cHBvcnRlZCkgewotCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAibWFzazpcdFx0MHglMDR4XG4iLCBtYXNrKTsKLQkJbGVuICs9IHNwcmludGYocCArIGxlbiwKLQkJCSAgICAgICAiY29tbWFuZHM6XHRlbmFibGUsIGRpc2FibGUsIHJlc2V0LCA8bWFzaz5cbiIpOwotCX0gZWxzZSB7Ci0JCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJtYXNrOlx0XHRub3Qgc3VwcG9ydGVkXG4iKTsKLQkJbGVuICs9IHNwcmludGYocCArIGxlbiwgImNvbW1hbmRzOlx0ZW5hYmxlLCBkaXNhYmxlLCByZXNldFxuIik7Ci0JfQotCi0JcmV0dXJuIGxlbjsKLX0KLQotc3RhdGljIGludCBob3RrZXlfd3JpdGUoY2hhciAqYnVmKQotewotCWludCBzdGF0dXMsIG1hc2s7Ci0JY2hhciAqY21kOwotCWludCBkb19jbWQgPSAwOwotCi0JaWYgKCFob3RrZXlfc3VwcG9ydGVkKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCWlmICghaG90a2V5X2dldCgmc3RhdHVzLCAmbWFzaykpCi0JCXJldHVybiAtRUlPOwotCi0Jd2hpbGUgKChjbWQgPSBuZXh0X2NtZCgmYnVmKSkpIHsKLQkJaWYgKHN0cmxlbmNtcChjbWQsICJlbmFibGUiKSA9PSAwKSB7Ci0JCQlzdGF0dXMgPSAxOwotCQl9IGVsc2UgaWYgKHN0cmxlbmNtcChjbWQsICJkaXNhYmxlIikgPT0gMCkgewotCQkJc3RhdHVzID0gMDsKLQkJfSBlbHNlIGlmIChzdHJsZW5jbXAoY21kLCAicmVzZXQiKSA9PSAwKSB7Ci0JCQlzdGF0dXMgPSBob3RrZXlfb3JpZ19zdGF0dXM7Ci0JCQltYXNrID0gaG90a2V5X29yaWdfbWFzazsKLQkJfSBlbHNlIGlmIChzc2NhbmYoY21kLCAiMHgleCIsICZtYXNrKSA9PSAxKSB7Ci0JCQkvKiBtYXNrIHNldCAqLwotCQl9IGVsc2UgaWYgKHNzY2FuZihjbWQsICIleCIsICZtYXNrKSA9PSAxKSB7Ci0JCQkvKiBtYXNrIHNldCAqLwotCQl9IGVsc2UKLQkJCXJldHVybiAtRUlOVkFMOwotCQlkb19jbWQgPSAxOwotCX0KLQotCWlmIChkb19jbWQgJiYgIWhvdGtleV9zZXQoc3RhdHVzLCBtYXNrKSkKLQkJcmV0dXJuIC1FSU87Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgaG90a2V5X2V4aXQodm9pZCkKLXsKLQlpZiAoaG90a2V5X3N1cHBvcnRlZCkKLQkJaG90a2V5X3NldChob3RrZXlfb3JpZ19zdGF0dXMsIGhvdGtleV9vcmlnX21hc2spOwotfQotCi1zdGF0aWMgdm9pZCBob3RrZXlfbm90aWZ5KHN0cnVjdCBpYm1fc3RydWN0ICppYm0sIHUzMiBldmVudCkKLXsKLQlpbnQgaGtleTsKLQotCWlmIChhY3BpX2V2YWxmKGhrZXlfaGFuZGxlLCAmaGtleSwgIk1IS1AiLCAiZCIpKQotCQlhY3BpX2J1c19nZW5lcmF0ZV9ldmVudChpYm0tPmRldmljZSwgZXZlbnQsIGhrZXkpOwotCWVsc2UgewotCQlwcmludGsoSUJNX0VSUiAidW5rbm93biBob3RrZXkgZXZlbnQgJWRcbiIsIGV2ZW50KTsKLQkJYWNwaV9idXNfZ2VuZXJhdGVfZXZlbnQoaWJtLT5kZXZpY2UsIGV2ZW50LCAwKTsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgYmx1ZXRvb3RoX3N1cHBvcnRlZDsKLQotc3RhdGljIGludCBibHVldG9vdGhfaW5pdCh2b2lkKQotewotCS8qIGJsdWV0b290aCBub3Qgc3VwcG9ydGVkIG9uIDU3MCwgNjAwZS94LCA3NzBlLCA3NzB4LCBBMjFlLCBBMnhtL3AsCi0JICAgRzR4LCBSMzAsIFIzMSwgUjQwZSwgUjUwZSwgVDIwLTIyLCBYMjAtMjEgKi8KLQlibHVldG9vdGhfc3VwcG9ydGVkID0gaGtleV9oYW5kbGUgJiYKLQkgICAgYWNwaV9ldmFsZihoa2V5X2hhbmRsZSwgTlVMTCwgIkdCREMiLCAicXYiKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGJsdWV0b290aF9zdGF0dXModm9pZCkKLXsKLQlpbnQgc3RhdHVzOwotCi0JaWYgKCFibHVldG9vdGhfc3VwcG9ydGVkIHx8Ci0JICAgICFhY3BpX2V2YWxmKGhrZXlfaGFuZGxlLCAmc3RhdHVzLCAiR0JEQyIsICJkIikpCi0JCXN0YXR1cyA9IDA7Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgaW50IGJsdWV0b290aF9yZWFkKGNoYXIgKnApCi17Ci0JaW50IGxlbiA9IDA7Ci0JaW50IHN0YXR1cyA9IGJsdWV0b290aF9zdGF0dXMoKTsKLQotCWlmICghYmx1ZXRvb3RoX3N1cHBvcnRlZCkKLQkJbGVuICs9IHNwcmludGYocCArIGxlbiwgInN0YXR1czpcdFx0bm90IHN1cHBvcnRlZFxuIik7Ci0JZWxzZSBpZiAoIShzdGF0dXMgJiAxKSkKLQkJbGVuICs9IHNwcmludGYocCArIGxlbiwgInN0YXR1czpcdFx0bm90IGluc3RhbGxlZFxuIik7Ci0JZWxzZSB7Ci0JCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJzdGF0dXM6XHRcdCVzXG4iLCBlbmFibGVkKHN0YXR1cywgMSkpOwotCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiY29tbWFuZHM6XHRlbmFibGUsIGRpc2FibGVcbiIpOwotCX0KLQotCXJldHVybiBsZW47Ci19Ci0KLXN0YXRpYyBpbnQgYmx1ZXRvb3RoX3dyaXRlKGNoYXIgKmJ1ZikKLXsKLQlpbnQgc3RhdHVzID0gYmx1ZXRvb3RoX3N0YXR1cygpOwotCWNoYXIgKmNtZDsKLQlpbnQgZG9fY21kID0gMDsKLQotCWlmICghYmx1ZXRvb3RoX3N1cHBvcnRlZCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQl3aGlsZSAoKGNtZCA9IG5leHRfY21kKCZidWYpKSkgewotCQlpZiAoc3RybGVuY21wKGNtZCwgImVuYWJsZSIpID09IDApIHsKLQkJCXN0YXR1cyB8PSAyOwotCQl9IGVsc2UgaWYgKHN0cmxlbmNtcChjbWQsICJkaXNhYmxlIikgPT0gMCkgewotCQkJc3RhdHVzICY9IH4yOwotCQl9IGVsc2UKLQkJCXJldHVybiAtRUlOVkFMOwotCQlkb19jbWQgPSAxOwotCX0KLQotCWlmIChkb19jbWQgJiYgIWFjcGlfZXZhbGYoaGtleV9oYW5kbGUsIE5VTEwsICJTQkRDIiwgInZkIiwgc3RhdHVzKSkKLQkJcmV0dXJuIC1FSU87Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB3YW5fc3VwcG9ydGVkOwotCi1zdGF0aWMgaW50IHdhbl9pbml0KHZvaWQpCi17Ci0Jd2FuX3N1cHBvcnRlZCA9IGhrZXlfaGFuZGxlICYmCi0JICAgIGFjcGlfZXZhbGYoaGtleV9oYW5kbGUsIE5VTEwsICJHV0FOIiwgInF2Iik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB3YW5fc3RhdHVzKHZvaWQpCi17Ci0JaW50IHN0YXR1czsKLQotCWlmICghd2FuX3N1cHBvcnRlZCB8fCAhYWNwaV9ldmFsZihoa2V5X2hhbmRsZSwgJnN0YXR1cywgIkdXQU4iLCAiZCIpKQotCQlzdGF0dXMgPSAwOwotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGludCB3YW5fcmVhZChjaGFyICpwKQotewotCWludCBsZW4gPSAwOwotCWludCBzdGF0dXMgPSB3YW5fc3RhdHVzKCk7Ci0KLQlpZiAoIXdhbl9zdXBwb3J0ZWQpCi0JCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJzdGF0dXM6XHRcdG5vdCBzdXBwb3J0ZWRcbiIpOwotCWVsc2UgaWYgKCEoc3RhdHVzICYgMSkpCi0JCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJzdGF0dXM6XHRcdG5vdCBpbnN0YWxsZWRcbiIpOwotCWVsc2UgewotCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAic3RhdHVzOlx0XHQlc1xuIiwgZW5hYmxlZChzdGF0dXMsIDEpKTsKLQkJbGVuICs9IHNwcmludGYocCArIGxlbiwgImNvbW1hbmRzOlx0ZW5hYmxlLCBkaXNhYmxlXG4iKTsKLQl9Ci0KLQlyZXR1cm4gbGVuOwotfQotCi1zdGF0aWMgaW50IHdhbl93cml0ZShjaGFyICpidWYpCi17Ci0JaW50IHN0YXR1cyA9IHdhbl9zdGF0dXMoKTsKLQljaGFyICpjbWQ7Ci0JaW50IGRvX2NtZCA9IDA7Ci0KLQlpZiAoIXdhbl9zdXBwb3J0ZWQpCi0JCXJldHVybiAtRU5PREVWOwotCi0Jd2hpbGUgKChjbWQgPSBuZXh0X2NtZCgmYnVmKSkpIHsKLQkJaWYgKHN0cmxlbmNtcChjbWQsICJlbmFibGUiKSA9PSAwKSB7Ci0JCQlzdGF0dXMgfD0gMjsKLQkJfSBlbHNlIGlmIChzdHJsZW5jbXAoY21kLCAiZGlzYWJsZSIpID09IDApIHsKLQkJCXN0YXR1cyAmPSB+MjsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJZG9fY21kID0gMTsKLQl9Ci0KLQlpZiAoZG9fY21kICYmICFhY3BpX2V2YWxmKGhrZXlfaGFuZGxlLCBOVUxMLCAiU1dBTiIsICJ2ZCIsIHN0YXR1cykpCi0JCXJldHVybiAtRUlPOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWVudW0gdmlkZW9fYWNjZXNzX21vZGUgewotCUlCTUFDUElfVklERU9fTk9ORSA9IDAsCi0JSUJNQUNQSV9WSURFT181NzAsCS8qIDU3MCAqLwotCUlCTUFDUElfVklERU9fNzcwLAkvKiA2MDBlL3gsIDc3MGUsIDc3MHggKi8KLQlJQk1BQ1BJX1ZJREVPX05FVywJLyogYWxsIG90aGVycyAqLwotfTsKLQotc3RhdGljIGVudW0gdmlkZW9fYWNjZXNzX21vZGUgdmlkZW9fc3VwcG9ydGVkOwotc3RhdGljIGludCB2aWRlb19vcmlnX2F1dG9zdzsKLQotc3RhdGljIGludCB2aWRlb19pbml0KHZvaWQpCi17Ci0JaW50IGl2Z2E7Ci0KLQlpZiAodmlkMl9oYW5kbGUgJiYgYWNwaV9ldmFsZihOVUxMLCAmaXZnYSwgIlxcSVZHQSIsICJkIikgJiYgaXZnYSkKLQkJLyogRzQxLCBhc3N1bWUgSVZHQSBkb2Vzbid0IGNoYW5nZSAqLwotCQl2aWRfaGFuZGxlID0gdmlkMl9oYW5kbGU7Ci0KLQlpZiAoIXZpZF9oYW5kbGUpCi0JCS8qIHZpZGVvIHN3aXRjaGluZyBub3Qgc3VwcG9ydGVkIG9uIFIzMCwgUjMxICovCi0JCXZpZGVvX3N1cHBvcnRlZCA9IElCTUFDUElfVklERU9fTk9ORTsKLQllbHNlIGlmIChhY3BpX2V2YWxmKHZpZF9oYW5kbGUsICZ2aWRlb19vcmlnX2F1dG9zdywgIlNXSVQiLCAicWQiKSkKLQkJLyogNTcwICovCi0JCXZpZGVvX3N1cHBvcnRlZCA9IElCTUFDUElfVklERU9fNTcwOwotCWVsc2UgaWYgKGFjcGlfZXZhbGYodmlkX2hhbmRsZSwgJnZpZGVvX29yaWdfYXV0b3N3LCAiXlZBREwiLCAicWQiKSkKLQkJLyogNjAwZS94LCA3NzBlLCA3NzB4ICovCi0JCXZpZGVvX3N1cHBvcnRlZCA9IElCTUFDUElfVklERU9fNzcwOwotCWVsc2UKLQkJLyogYWxsIG90aGVycyAqLwotCQl2aWRlb19zdXBwb3J0ZWQgPSBJQk1BQ1BJX1ZJREVPX05FVzsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZpZGVvX3N0YXR1cyh2b2lkKQotewotCWludCBzdGF0dXMgPSAwOwotCWludCBpOwotCi0JaWYgKHZpZGVvX3N1cHBvcnRlZCA9PSBJQk1BQ1BJX1ZJREVPXzU3MCkgewotCQlpZiAoYWNwaV9ldmFsZihOVUxMLCAmaSwgIlxcX1NCLlBIUyIsICJkZCIsIDB4ODcpKQotCQkJc3RhdHVzID0gaSAmIDM7Ci0JfSBlbHNlIGlmICh2aWRlb19zdXBwb3J0ZWQgPT0gSUJNQUNQSV9WSURFT183NzApIHsKLQkJaWYgKGFjcGlfZXZhbGYoTlVMTCwgJmksICJcXFZDREwiLCAiZCIpKQotCQkJc3RhdHVzIHw9IDB4MDEgKiBpOwotCQlpZiAoYWNwaV9ldmFsZihOVUxMLCAmaSwgIlxcVkNEQyIsICJkIikpCi0JCQlzdGF0dXMgfD0gMHgwMiAqIGk7Ci0JfSBlbHNlIGlmICh2aWRlb19zdXBwb3J0ZWQgPT0gSUJNQUNQSV9WSURFT19ORVcpIHsKLQkJYWNwaV9ldmFsZihOVUxMLCBOVUxMLCAiXFxWVVBTIiwgInZkIiwgMSk7Ci0JCWlmIChhY3BpX2V2YWxmKE5VTEwsICZpLCAiXFxWQ0RDIiwgImQiKSkKLQkJCXN0YXR1cyB8PSAweDAyICogaTsKLQotCQlhY3BpX2V2YWxmKE5VTEwsIE5VTEwsICJcXFZVUFMiLCAidmQiLCAwKTsKLQkJaWYgKGFjcGlfZXZhbGYoTlVMTCwgJmksICJcXFZDREwiLCAiZCIpKQotCQkJc3RhdHVzIHw9IDB4MDEgKiBpOwotCQlpZiAoYWNwaV9ldmFsZihOVUxMLCAmaSwgIlxcVkNERCIsICJkIikpCi0JCQlzdGF0dXMgfD0gMHgwOCAqIGk7Ci0JfQotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGludCB2aWRlb19hdXRvc3codm9pZCkKLXsKLQlpbnQgYXV0b3N3ID0gMDsKLQotCWlmICh2aWRlb19zdXBwb3J0ZWQgPT0gSUJNQUNQSV9WSURFT181NzApCi0JCWFjcGlfZXZhbGYodmlkX2hhbmRsZSwgJmF1dG9zdywgIlNXSVQiLCAiZCIpOwotCWVsc2UgaWYgKHZpZGVvX3N1cHBvcnRlZCA9PSBJQk1BQ1BJX1ZJREVPXzc3MCB8fAotCQkgdmlkZW9fc3VwcG9ydGVkID09IElCTUFDUElfVklERU9fTkVXKQotCQlhY3BpX2V2YWxmKHZpZF9oYW5kbGUsICZhdXRvc3csICJeVkRFRSIsICJkIik7Ci0KLQlyZXR1cm4gYXV0b3N3ICYgMTsKLX0KLQotc3RhdGljIGludCB2aWRlb19yZWFkKGNoYXIgKnApCi17Ci0JaW50IHN0YXR1cyA9IHZpZGVvX3N0YXR1cygpOwotCWludCBhdXRvc3cgPSB2aWRlb19hdXRvc3coKTsKLQlpbnQgbGVuID0gMDsKLQotCWlmICghdmlkZW9fc3VwcG9ydGVkKSB7Ci0JCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJzdGF0dXM6XHRcdG5vdCBzdXBwb3J0ZWRcbiIpOwotCQlyZXR1cm4gbGVuOwotCX0KLQotCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJzdGF0dXM6XHRcdHN1cHBvcnRlZFxuIik7Ci0JbGVuICs9IHNwcmludGYocCArIGxlbiwgImxjZDpcdFx0JXNcbiIsIGVuYWJsZWQoc3RhdHVzLCAwKSk7Ci0JbGVuICs9IHNwcmludGYocCArIGxlbiwgImNydDpcdFx0JXNcbiIsIGVuYWJsZWQoc3RhdHVzLCAxKSk7Ci0JaWYgKHZpZGVvX3N1cHBvcnRlZCA9PSBJQk1BQ1BJX1ZJREVPX05FVykKLQkJbGVuICs9IHNwcmludGYocCArIGxlbiwgImR2aTpcdFx0JXNcbiIsIGVuYWJsZWQoc3RhdHVzLCAzKSk7Ci0JbGVuICs9IHNwcmludGYocCArIGxlbiwgImF1dG86XHRcdCVzXG4iLCBlbmFibGVkKGF1dG9zdywgMCkpOwotCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJjb21tYW5kczpcdGxjZF9lbmFibGUsIGxjZF9kaXNhYmxlXG4iKTsKLQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiY29tbWFuZHM6XHRjcnRfZW5hYmxlLCBjcnRfZGlzYWJsZVxuIik7Ci0JaWYgKHZpZGVvX3N1cHBvcnRlZCA9PSBJQk1BQ1BJX1ZJREVPX05FVykKLQkJbGVuICs9IHNwcmludGYocCArIGxlbiwgImNvbW1hbmRzOlx0ZHZpX2VuYWJsZSwgZHZpX2Rpc2FibGVcbiIpOwotCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJjb21tYW5kczpcdGF1dG9fZW5hYmxlLCBhdXRvX2Rpc2FibGVcbiIpOwotCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJjb21tYW5kczpcdHZpZGVvX3N3aXRjaCwgZXhwYW5kX3RvZ2dsZVxuIik7Ci0KLQlyZXR1cm4gbGVuOwotfQotCi1zdGF0aWMgaW50IHZpZGVvX3N3aXRjaCh2b2lkKQotewotCWludCBhdXRvc3cgPSB2aWRlb19hdXRvc3coKTsKLQlpbnQgcmV0OwotCi0JaWYgKCFhY3BpX2V2YWxmKHZpZF9oYW5kbGUsIE5VTEwsICJfRE9TIiwgInZkIiwgMSkpCi0JCXJldHVybiAtRUlPOwotCXJldCA9IHZpZGVvX3N1cHBvcnRlZCA9PSBJQk1BQ1BJX1ZJREVPXzU3MCA/Ci0JICAgIGFjcGlfZXZhbGYoZWNfaGFuZGxlLCBOVUxMLCAiX1ExNiIsICJ2IikgOgotCSAgICBhY3BpX2V2YWxmKHZpZF9oYW5kbGUsIE5VTEwsICJWU1dUIiwgInYiKTsKLQlhY3BpX2V2YWxmKHZpZF9oYW5kbGUsIE5VTEwsICJfRE9TIiwgInZkIiwgYXV0b3N3KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdmlkZW9fZXhwYW5kKHZvaWQpCi17Ci0JaWYgKHZpZGVvX3N1cHBvcnRlZCA9PSBJQk1BQ1BJX1ZJREVPXzU3MCkKLQkJcmV0dXJuIGFjcGlfZXZhbGYoZWNfaGFuZGxlLCBOVUxMLCAiX1ExNyIsICJ2Iik7Ci0JZWxzZSBpZiAodmlkZW9fc3VwcG9ydGVkID09IElCTUFDUElfVklERU9fNzcwKQotCQlyZXR1cm4gYWNwaV9ldmFsZih2aWRfaGFuZGxlLCBOVUxMLCAiVkVYUCIsICJ2Iik7Ci0JZWxzZQotCQlyZXR1cm4gYWNwaV9ldmFsZihOVUxMLCBOVUxMLCAiXFxWRVhQIiwgInYiKTsKLX0KLQotc3RhdGljIGludCB2aWRlb19zd2l0Y2gyKGludCBzdGF0dXMpCi17Ci0JaW50IHJldDsKLQotCWlmICh2aWRlb19zdXBwb3J0ZWQgPT0gSUJNQUNQSV9WSURFT181NzApIHsKLQkJcmV0ID0gYWNwaV9ldmFsZihOVUxMLCBOVUxMLAotCQkJCSAiXFxfU0IuUEhTMiIsICJ2ZGQiLCAweDhiLCBzdGF0dXMgfCAweDgwKTsKLQl9IGVsc2UgaWYgKHZpZGVvX3N1cHBvcnRlZCA9PSBJQk1BQ1BJX1ZJREVPXzc3MCkgewotCQlpbnQgYXV0b3N3ID0gdmlkZW9fYXV0b3N3KCk7Ci0JCWlmICghYWNwaV9ldmFsZih2aWRfaGFuZGxlLCBOVUxMLCAiX0RPUyIsICJ2ZCIsIDEpKQotCQkJcmV0dXJuIC1FSU87Ci0KLQkJcmV0ID0gYWNwaV9ldmFsZih2aWRfaGFuZGxlLCBOVUxMLAotCQkJCSAiQVNXVCIsICJ2ZGQiLCBzdGF0dXMgKiAweDEwMCwgMCk7Ci0KLQkJYWNwaV9ldmFsZih2aWRfaGFuZGxlLCBOVUxMLCAiX0RPUyIsICJ2ZCIsIGF1dG9zdyk7Ci0JfSBlbHNlIHsKLQkJcmV0ID0gYWNwaV9ldmFsZihOVUxMLCBOVUxMLCAiXFxWVVBTIiwgInZkIiwgMHg4MCkgJiYKLQkJICAgIGFjcGlfZXZhbGYoTlVMTCwgTlVMTCwgIlxcVlNEUyIsICJ2ZGQiLCBzdGF0dXMsIDEpOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdmlkZW9fd3JpdGUoY2hhciAqYnVmKQotewotCWNoYXIgKmNtZDsKLQlpbnQgZW5hYmxlLCBkaXNhYmxlLCBzdGF0dXM7Ci0KLQlpZiAoIXZpZGVvX3N1cHBvcnRlZCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQllbmFibGUgPSBkaXNhYmxlID0gMDsKLQotCXdoaWxlICgoY21kID0gbmV4dF9jbWQoJmJ1ZikpKSB7Ci0JCWlmIChzdHJsZW5jbXAoY21kLCAibGNkX2VuYWJsZSIpID09IDApIHsKLQkJCWVuYWJsZSB8PSAweDAxOwotCQl9IGVsc2UgaWYgKHN0cmxlbmNtcChjbWQsICJsY2RfZGlzYWJsZSIpID09IDApIHsKLQkJCWRpc2FibGUgfD0gMHgwMTsKLQkJfSBlbHNlIGlmIChzdHJsZW5jbXAoY21kLCAiY3J0X2VuYWJsZSIpID09IDApIHsKLQkJCWVuYWJsZSB8PSAweDAyOwotCQl9IGVsc2UgaWYgKHN0cmxlbmNtcChjbWQsICJjcnRfZGlzYWJsZSIpID09IDApIHsKLQkJCWRpc2FibGUgfD0gMHgwMjsKLQkJfSBlbHNlIGlmICh2aWRlb19zdXBwb3J0ZWQgPT0gSUJNQUNQSV9WSURFT19ORVcgJiYKLQkJCSAgIHN0cmxlbmNtcChjbWQsICJkdmlfZW5hYmxlIikgPT0gMCkgewotCQkJZW5hYmxlIHw9IDB4MDg7Ci0JCX0gZWxzZSBpZiAodmlkZW9fc3VwcG9ydGVkID09IElCTUFDUElfVklERU9fTkVXICYmCi0JCQkgICBzdHJsZW5jbXAoY21kLCAiZHZpX2Rpc2FibGUiKSA9PSAwKSB7Ci0JCQlkaXNhYmxlIHw9IDB4MDg7Ci0JCX0gZWxzZSBpZiAoc3RybGVuY21wKGNtZCwgImF1dG9fZW5hYmxlIikgPT0gMCkgewotCQkJaWYgKCFhY3BpX2V2YWxmKHZpZF9oYW5kbGUsIE5VTEwsICJfRE9TIiwgInZkIiwgMSkpCi0JCQkJcmV0dXJuIC1FSU87Ci0JCX0gZWxzZSBpZiAoc3RybGVuY21wKGNtZCwgImF1dG9fZGlzYWJsZSIpID09IDApIHsKLQkJCWlmICghYWNwaV9ldmFsZih2aWRfaGFuZGxlLCBOVUxMLCAiX0RPUyIsICJ2ZCIsIDApKQotCQkJCXJldHVybiAtRUlPOwotCQl9IGVsc2UgaWYgKHN0cmxlbmNtcChjbWQsICJ2aWRlb19zd2l0Y2giKSA9PSAwKSB7Ci0JCQlpZiAoIXZpZGVvX3N3aXRjaCgpKQotCQkJCXJldHVybiAtRUlPOwotCQl9IGVsc2UgaWYgKHN0cmxlbmNtcChjbWQsICJleHBhbmRfdG9nZ2xlIikgPT0gMCkgewotCQkJaWYgKCF2aWRlb19leHBhbmQoKSkKLQkJCQlyZXR1cm4gLUVJTzsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoZW5hYmxlIHx8IGRpc2FibGUpIHsKLQkJc3RhdHVzID0gKHZpZGVvX3N0YXR1cygpICYgMHgwZiAmIH5kaXNhYmxlKSB8IGVuYWJsZTsKLQkJaWYgKCF2aWRlb19zd2l0Y2gyKHN0YXR1cykpCi0JCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgdmlkZW9fZXhpdCh2b2lkKQotewotCWFjcGlfZXZhbGYodmlkX2hhbmRsZSwgTlVMTCwgIl9ET1MiLCAidmQiLCB2aWRlb19vcmlnX2F1dG9zdyk7Ci19Ci0KLXN0YXRpYyBpbnQgbGlnaHRfc3VwcG9ydGVkOwotc3RhdGljIGludCBsaWdodF9zdGF0dXNfc3VwcG9ydGVkOwotCi1zdGF0aWMgaW50IGxpZ2h0X2luaXQodm9pZCkKLXsKLQkvKiBsaWdodCBub3Qgc3VwcG9ydGVkIG9uIDU3MCwgNjAwZS94LCA3NzBlLCA3NzB4LCBHNHgsIFIzMCwgUjMxICovCi0JbGlnaHRfc3VwcG9ydGVkID0gKGNtb3NfaGFuZGxlIHx8IGxnaHRfaGFuZGxlKSAmJiAhbGVkYl9oYW5kbGU7Ci0KLQlpZiAobGlnaHRfc3VwcG9ydGVkKQotCQkvKiBsaWdodCBzdGF0dXMgbm90IHN1cHBvcnRlZCBvbgotCQkgICA1NzAsIDYwMGUveCwgNzcwZSwgNzcweCwgRzR4LCBSMzAsIFIzMSwgUjMyLCBYMjAgKi8KLQkJbGlnaHRfc3RhdHVzX3N1cHBvcnRlZCA9IGFjcGlfZXZhbGYoZWNfaGFuZGxlLCBOVUxMLAotCQkJCQkJICAgICJLQkxUIiwgInF2Iik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBsaWdodF9yZWFkKGNoYXIgKnApCi17Ci0JaW50IGxlbiA9IDA7Ci0JaW50IHN0YXR1cyA9IDA7Ci0KLQlpZiAoIWxpZ2h0X3N1cHBvcnRlZCkgewotCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAic3RhdHVzOlx0XHRub3Qgc3VwcG9ydGVkXG4iKTsKLQl9IGVsc2UgaWYgKCFsaWdodF9zdGF0dXNfc3VwcG9ydGVkKSB7Ci0JCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJzdGF0dXM6XHRcdHVua25vd25cbiIpOwotCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiY29tbWFuZHM6XHRvbiwgb2ZmXG4iKTsKLQl9IGVsc2UgewotCQlpZiAoIWFjcGlfZXZhbGYoZWNfaGFuZGxlLCAmc3RhdHVzLCAiS0JMVCIsICJkIikpCi0JCQlyZXR1cm4gLUVJTzsKLQkJbGVuICs9IHNwcmludGYocCArIGxlbiwgInN0YXR1czpcdFx0JXNcbiIsIG9ub2ZmKHN0YXR1cywgMCkpOwotCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiY29tbWFuZHM6XHRvbiwgb2ZmXG4iKTsKLQl9Ci0KLQlyZXR1cm4gbGVuOwotfQotCi1zdGF0aWMgaW50IGxpZ2h0X3dyaXRlKGNoYXIgKmJ1ZikKLXsKLQlpbnQgY21vc19jbWQsIGxnaHRfY21kOwotCWNoYXIgKmNtZDsKLQlpbnQgc3VjY2VzczsKLQotCWlmICghbGlnaHRfc3VwcG9ydGVkKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCXdoaWxlICgoY21kID0gbmV4dF9jbWQoJmJ1ZikpKSB7Ci0JCWlmIChzdHJsZW5jbXAoY21kLCAib24iKSA9PSAwKSB7Ci0JCQljbW9zX2NtZCA9IDB4MGM7Ci0JCQlsZ2h0X2NtZCA9IDE7Ci0JCX0gZWxzZSBpZiAoc3RybGVuY21wKGNtZCwgIm9mZiIpID09IDApIHsKLQkJCWNtb3NfY21kID0gMHgwZDsKLQkJCWxnaHRfY21kID0gMDsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQotCQlzdWNjZXNzID0gY21vc19oYW5kbGUgPwotCQkgICAgYWNwaV9ldmFsZihjbW9zX2hhbmRsZSwgTlVMTCwgTlVMTCwgInZkIiwgY21vc19jbWQpIDoKLQkJICAgIGFjcGlfZXZhbGYobGdodF9oYW5kbGUsIE5VTEwsIE5VTEwsICJ2ZCIsIGxnaHRfY21kKTsKLQkJaWYgKCFzdWNjZXNzKQotCQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLSNpZiBkZWZpbmVkKENPTkZJR19BQ1BJX0lCTV9ET0NLKSB8fCBkZWZpbmVkKENPTkZJR19BQ1BJX0lCTV9CQVkpCi1zdGF0aWMgaW50IF9zdGEoYWNwaV9oYW5kbGUgaGFuZGxlKQotewotCWludCBzdGF0dXM7Ci0KLQlpZiAoIWhhbmRsZSB8fCAhYWNwaV9ldmFsZihoYW5kbGUsICZzdGF0dXMsICJfU1RBIiwgImQiKSkKLQkJc3RhdHVzID0gMDsKLQotCXJldHVybiBzdGF0dXM7Ci19Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19BQ1BJX0lCTV9ET0NLCi0jZGVmaW5lIGRvY2tfZG9ja2VkKCkgKF9zdGEoZG9ja19oYW5kbGUpICYgMSkKLQotc3RhdGljIGludCBkb2NrX3JlYWQoY2hhciAqcCkKLXsKLQlpbnQgbGVuID0gMDsKLQlpbnQgZG9ja2VkID0gZG9ja19kb2NrZWQoKTsKLQotCWlmICghZG9ja19oYW5kbGUpCi0JCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJzdGF0dXM6XHRcdG5vdCBzdXBwb3J0ZWRcbiIpOwotCWVsc2UgaWYgKCFkb2NrZWQpCi0JCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJzdGF0dXM6XHRcdHVuZG9ja2VkXG4iKTsKLQllbHNlIHsKLQkJbGVuICs9IHNwcmludGYocCArIGxlbiwgInN0YXR1czpcdFx0ZG9ja2VkXG4iKTsKLQkJbGVuICs9IHNwcmludGYocCArIGxlbiwgImNvbW1hbmRzOlx0ZG9jaywgdW5kb2NrXG4iKTsKLQl9Ci0KLQlyZXR1cm4gbGVuOwotfQotCi1zdGF0aWMgaW50IGRvY2tfd3JpdGUoY2hhciAqYnVmKQotewotCWNoYXIgKmNtZDsKLQotCWlmICghZG9ja19kb2NrZWQoKSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQl3aGlsZSAoKGNtZCA9IG5leHRfY21kKCZidWYpKSkgewotCQlpZiAoc3RybGVuY21wKGNtZCwgInVuZG9jayIpID09IDApIHsKLQkJCWlmICghYWNwaV9ldmFsZihkb2NrX2hhbmRsZSwgTlVMTCwgIl9EQ0siLCAidmQiLCAwKSB8fAotCQkJICAgICFhY3BpX2V2YWxmKGRvY2tfaGFuZGxlLCBOVUxMLCAiX0VKMCIsICJ2ZCIsIDEpKQotCQkJCXJldHVybiAtRUlPOwotCQl9IGVsc2UgaWYgKHN0cmxlbmNtcChjbWQsICJkb2NrIikgPT0gMCkgewotCQkJaWYgKCFhY3BpX2V2YWxmKGRvY2tfaGFuZGxlLCBOVUxMLCAiX0RDSyIsICJ2ZCIsIDEpKQotCQkJCXJldHVybiAtRUlPOwotCQl9IGVsc2UKLQkJCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBkb2NrX25vdGlmeShzdHJ1Y3QgaWJtX3N0cnVjdCAqaWJtLCB1MzIgZXZlbnQpCi17Ci0JaW50IGRvY2tlZCA9IGRvY2tfZG9ja2VkKCk7Ci0JaW50IHBjaSA9IGlibS0+aGlkICYmIHN0cnN0cihpYm0tPmhpZCwgSUJNX1BDSV9ISUQpOwotCi0JaWYgKGV2ZW50ID09IDEgJiYgIXBjaSkJLyogNTcwICovCi0JCWFjcGlfYnVzX2dlbmVyYXRlX2V2ZW50KGlibS0+ZGV2aWNlLCBldmVudCwgMSk7CS8qIGJ1dHRvbiAqLwotCWVsc2UgaWYgKGV2ZW50ID09IDEgJiYgcGNpKQkvKiA1NzAgKi8KLQkJYWNwaV9idXNfZ2VuZXJhdGVfZXZlbnQoaWJtLT5kZXZpY2UsIGV2ZW50LCAzKTsJLyogZG9jayAqLwotCWVsc2UgaWYgKGV2ZW50ID09IDMgJiYgZG9ja2VkKQotCQlhY3BpX2J1c19nZW5lcmF0ZV9ldmVudChpYm0tPmRldmljZSwgZXZlbnQsIDEpOwkvKiBidXR0b24gKi8KLQllbHNlIGlmIChldmVudCA9PSAzICYmICFkb2NrZWQpCi0JCWFjcGlfYnVzX2dlbmVyYXRlX2V2ZW50KGlibS0+ZGV2aWNlLCBldmVudCwgMik7CS8qIHVuZG9jayAqLwotCWVsc2UgaWYgKGV2ZW50ID09IDAgJiYgZG9ja2VkKQotCQlhY3BpX2J1c19nZW5lcmF0ZV9ldmVudChpYm0tPmRldmljZSwgZXZlbnQsIDMpOwkvKiBkb2NrICovCi0JZWxzZSB7Ci0JCXByaW50ayhJQk1fRVJSICJ1bmtub3duIGRvY2sgZXZlbnQgJWQsIHN0YXR1cyAlZFxuIiwKLQkJICAgICAgIGV2ZW50LCBfc3RhKGRvY2tfaGFuZGxlKSk7Ci0JCWFjcGlfYnVzX2dlbmVyYXRlX2V2ZW50KGlibS0+ZGV2aWNlLCBldmVudCwgMCk7CS8qIHVua25vd24gKi8KLQl9Ci19Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19BQ1BJX0lCTV9CQVkKLXN0YXRpYyBpbnQgYmF5X3N0YXR1c19zdXBwb3J0ZWQ7Ci1zdGF0aWMgaW50IGJheV9zdGF0dXMyX3N1cHBvcnRlZDsKLXN0YXRpYyBpbnQgYmF5X2VqZWN0X3N1cHBvcnRlZDsKLXN0YXRpYyBpbnQgYmF5X2VqZWN0Ml9zdXBwb3J0ZWQ7Ci0KLXN0YXRpYyBpbnQgYmF5X2luaXQodm9pZCkKLXsKLQliYXlfc3RhdHVzX3N1cHBvcnRlZCA9IGJheV9oYW5kbGUgJiYKLQkgICAgYWNwaV9ldmFsZihiYXlfaGFuZGxlLCBOVUxMLCAiX1NUQSIsICJxdiIpOwotCWJheV9zdGF0dXMyX3N1cHBvcnRlZCA9IGJheTJfaGFuZGxlICYmCi0JICAgIGFjcGlfZXZhbGYoYmF5Ml9oYW5kbGUsIE5VTEwsICJfU1RBIiwgInF2Iik7Ci0KLQliYXlfZWplY3Rfc3VwcG9ydGVkID0gYmF5X2hhbmRsZSAmJiBiYXlfZWpfaGFuZGxlICYmCi0JICAgIChzdHJsZW5jbXAoYmF5X2VqX3BhdGgsICJfRUowIikgPT0gMCB8fCBleHBlcmltZW50YWwpOwotCWJheV9lamVjdDJfc3VwcG9ydGVkID0gYmF5Ml9oYW5kbGUgJiYgYmF5Ml9lal9oYW5kbGUgJiYKLQkgICAgKHN0cmxlbmNtcChiYXkyX2VqX3BhdGgsICJfRUowIikgPT0gMCB8fCBleHBlcmltZW50YWwpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLSNkZWZpbmUgYmF5X29jY3VwaWVkKGIpIChfc3RhKGIjI19oYW5kbGUpICYgMSkKLQotc3RhdGljIGludCBiYXlfcmVhZChjaGFyICpwKQotewotCWludCBsZW4gPSAwOwotCWludCBvY2N1cGllZCA9IGJheV9vY2N1cGllZChiYXkpOwotCWludCBvY2N1cGllZDIgPSBiYXlfb2NjdXBpZWQoYmF5Mik7Ci0JaW50IGVqZWN0LCBlamVjdDI7Ci0KLQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAic3RhdHVzOlx0XHQlc1xuIiwgYmF5X3N0YXR1c19zdXBwb3J0ZWQgPwotCQkgICAgICAgKG9jY3VwaWVkID8gIm9jY3VwaWVkIiA6ICJ1bm9jY3VwaWVkIikgOgotCQkgICAgICAgIm5vdCBzdXBwb3J0ZWQiKTsKLQlpZiAoYmF5X3N0YXR1czJfc3VwcG9ydGVkKQotCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAic3RhdHVzMjpcdCVzXG4iLCBvY2N1cGllZDIgPwotCQkJICAgICAgICJvY2N1cGllZCIgOiAidW5vY2N1cGllZCIpOwotCi0JZWplY3QgPSBiYXlfZWplY3Rfc3VwcG9ydGVkICYmIG9jY3VwaWVkOwotCWVqZWN0MiA9IGJheV9lamVjdDJfc3VwcG9ydGVkICYmIG9jY3VwaWVkMjsKLQotCWlmIChlamVjdCAmJiBlamVjdDIpCi0JCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJjb21tYW5kczpcdGVqZWN0LCBlamVjdDJcbiIpOwotCWVsc2UgaWYgKGVqZWN0KQotCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiY29tbWFuZHM6XHRlamVjdFxuIik7Ci0JZWxzZSBpZiAoZWplY3QyKQotCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiY29tbWFuZHM6XHRlamVjdDJcbiIpOwotCi0JcmV0dXJuIGxlbjsKLX0KLQotc3RhdGljIGludCBiYXlfd3JpdGUoY2hhciAqYnVmKQotewotCWNoYXIgKmNtZDsKLQotCWlmICghYmF5X2VqZWN0X3N1cHBvcnRlZCAmJiAhYmF5X2VqZWN0Ml9zdXBwb3J0ZWQpCi0JCXJldHVybiAtRU5PREVWOwotCi0Jd2hpbGUgKChjbWQgPSBuZXh0X2NtZCgmYnVmKSkpIHsKLQkJaWYgKGJheV9lamVjdF9zdXBwb3J0ZWQgJiYgc3RybGVuY21wKGNtZCwgImVqZWN0IikgPT0gMCkgewotCQkJaWYgKCFhY3BpX2V2YWxmKGJheV9lal9oYW5kbGUsIE5VTEwsIE5VTEwsICJ2ZCIsIDEpKQotCQkJCXJldHVybiAtRUlPOwotCQl9IGVsc2UgaWYgKGJheV9lamVjdDJfc3VwcG9ydGVkICYmCi0JCQkgICBzdHJsZW5jbXAoY21kLCAiZWplY3QyIikgPT0gMCkgewotCQkJaWYgKCFhY3BpX2V2YWxmKGJheTJfZWpfaGFuZGxlLCBOVUxMLCBOVUxMLCAidmQiLCAxKSkKLQkJCQlyZXR1cm4gLUVJTzsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgYmF5X25vdGlmeShzdHJ1Y3QgaWJtX3N0cnVjdCAqaWJtLCB1MzIgZXZlbnQpCi17Ci0JYWNwaV9idXNfZ2VuZXJhdGVfZXZlbnQoaWJtLT5kZXZpY2UsIGV2ZW50LCAwKTsKLX0KLSNlbmRpZiAvKiBDT05GSUdfQUNQSV9JQk1fQkFZICovCi0KLXN0YXRpYyBpbnQgY21vc19yZWFkKGNoYXIgKnApCi17Ci0JaW50IGxlbiA9IDA7Ci0KLQkvKiBjbW9zIG5vdCBzdXBwb3J0ZWQgb24gNTcwLCA2MDBlL3gsIDc3MGUsIDc3MHgsIEEyMWUsIEEyeG0vcCwKLQkgICBSMzAsIFIzMSwgVDIwLTIyLCBYMjAtMjEgKi8KLQlpZiAoIWNtb3NfaGFuZGxlKQotCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAic3RhdHVzOlx0XHRub3Qgc3VwcG9ydGVkXG4iKTsKLQllbHNlIHsKLQkJbGVuICs9IHNwcmludGYocCArIGxlbiwgInN0YXR1czpcdFx0c3VwcG9ydGVkXG4iKTsKLQkJbGVuICs9IHNwcmludGYocCArIGxlbiwgImNvbW1hbmRzOlx0PGNtZD4gKDxjbWQ+IGlzIDAtMjEpXG4iKTsKLQl9Ci0KLQlyZXR1cm4gbGVuOwotfQotCi1zdGF0aWMgaW50IGNtb3NfZXZhbChpbnQgY21vc19jbWQpCi17Ci0JaWYgKGNtb3NfaGFuZGxlKQotCQlyZXR1cm4gYWNwaV9ldmFsZihjbW9zX2hhbmRsZSwgTlVMTCwgTlVMTCwgInZkIiwgY21vc19jbWQpOwotCWVsc2UKLQkJcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgY21vc193cml0ZShjaGFyICpidWYpCi17Ci0JY2hhciAqY21kOwotCWludCBjbW9zX2NtZDsKLQotCWlmICghY21vc19oYW5kbGUpCi0JCXJldHVybiAtRUlOVkFMOwotCi0Jd2hpbGUgKChjbWQgPSBuZXh0X2NtZCgmYnVmKSkpIHsKLQkJaWYgKHNzY2FuZihjbWQsICIldSIsICZjbW9zX2NtZCkgPT0gMSAmJgotCQkgICAgY21vc19jbWQgPj0gMCAmJiBjbW9zX2NtZCA8PSAyMSkgewotCQkJLyogY21vc19jbWQgc2V0ICovCi0JCX0gZWxzZQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJaWYgKCFjbW9zX2V2YWwoY21vc19jbWQpKQotCQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLWVudW0gbGVkX2FjY2Vzc19tb2RlIHsKLQlJQk1BQ1BJX0xFRF9OT05FID0gMCwKLQlJQk1BQ1BJX0xFRF81NzAsCS8qIDU3MCAqLwotCUlCTUFDUElfTEVEX09MRCwJLyogNjAwZS94LCA3NzBlLCA3NzB4LCBBMjFlLCBBMnhtL3AsIFQyMC0yMiwgWDIwLTIxICovCi0JSUJNQUNQSV9MRURfTkVXLAkvKiBhbGwgb3RoZXJzICovCi19Owotc3RhdGljIGVudW0gbGVkX2FjY2Vzc19tb2RlIGxlZF9zdXBwb3J0ZWQ7Ci0KLXN0YXRpYyBpbnQgbGVkX2luaXQodm9pZCkKLXsKLQlpZiAoIWxlZF9oYW5kbGUpCi0JCS8qIGxlZCBub3Qgc3VwcG9ydGVkIG9uIFIzMCwgUjMxICovCi0JCWxlZF9zdXBwb3J0ZWQgPSBJQk1BQ1BJX0xFRF9OT05FOwotCWVsc2UgaWYgKHN0cmxlbmNtcChsZWRfcGF0aCwgIlNMRUQiKSA9PSAwKQotCQkvKiA1NzAgKi8KLQkJbGVkX3N1cHBvcnRlZCA9IElCTUFDUElfTEVEXzU3MDsKLQllbHNlIGlmIChzdHJsZW5jbXAobGVkX3BhdGgsICJTWVNMIikgPT0gMCkKLQkJLyogNjAwZS94LCA3NzBlLCA3NzB4LCBBMjFlLCBBMnhtL3AsIFQyMC0yMiwgWDIwLTIxICovCi0JCWxlZF9zdXBwb3J0ZWQgPSBJQk1BQ1BJX0xFRF9PTEQ7Ci0JZWxzZQotCQkvKiBhbGwgb3RoZXJzICovCi0JCWxlZF9zdXBwb3J0ZWQgPSBJQk1BQ1BJX0xFRF9ORVc7Ci0KLQlyZXR1cm4gMDsKLX0KLQotI2RlZmluZSBsZWRfc3RhdHVzKHMpICgocykgPT0gMCA/ICJvZmYiIDogKChzKSA9PSAxID8gIm9uIiA6ICJibGlua2luZyIpKQotCi1zdGF0aWMgaW50IGxlZF9yZWFkKGNoYXIgKnApCi17Ci0JaW50IGxlbiA9IDA7Ci0KLQlpZiAoIWxlZF9zdXBwb3J0ZWQpIHsKLQkJbGVuICs9IHNwcmludGYocCArIGxlbiwgInN0YXR1czpcdFx0bm90IHN1cHBvcnRlZFxuIik7Ci0JCXJldHVybiBsZW47Ci0JfQotCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJzdGF0dXM6XHRcdHN1cHBvcnRlZFxuIik7Ci0KLQlpZiAobGVkX3N1cHBvcnRlZCA9PSBJQk1BQ1BJX0xFRF81NzApIHsKLQkJLyogNTcwICovCi0JCWludCBpLCBzdGF0dXM7Ci0JCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKLQkJCWlmICghYWNwaV9ldmFsZihlY19oYW5kbGUsCi0JCQkJCSZzdGF0dXMsICJHTEVEIiwgImRkIiwgMSA8PCBpKSkKLQkJCQlyZXR1cm4gLUVJTzsKLQkJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICIlZDpcdFx0JXNcbiIsCi0JCQkJICAgICAgIGksIGxlZF9zdGF0dXMoc3RhdHVzKSk7Ci0JCX0KLQl9Ci0KLQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiY29tbWFuZHM6XHQiCi0JCSAgICAgICAiPGxlZD4gb24sIDxsZWQ+IG9mZiwgPGxlZD4gYmxpbmsgKDxsZWQ+IGlzIDAtNylcbiIpOwotCi0JcmV0dXJuIGxlbjsKLX0KLQotLyogb2ZmLCBvbiwgYmxpbmsgKi8KLXN0YXRpYyBjb25zdCBpbnQgbGVkX3NsZWRfYXJnMVtdID0geyAwLCAxLCAzIH07Ci1zdGF0aWMgY29uc3QgaW50IGxlZF9leHBfaGxibFtdID0geyAwLCAwLCAxIH07CS8qIGxlZCMgKiAqLwotc3RhdGljIGNvbnN0IGludCBsZWRfZXhwX2hsY2xbXSA9IHsgMCwgMSwgMSB9OwkvKiBsZWQjICogKi8KLXN0YXRpYyBjb25zdCBpbnQgbGVkX2xlZF9hcmcxW10gPSB7IDAsIDB4ODAsIDB4YzAgfTsKLQotI2RlZmluZSBFQ19ITENMIDB4MGMKLSNkZWZpbmUgRUNfSExCTCAweDBkCi0jZGVmaW5lIEVDX0hMTVMgMHgwZQotCi1zdGF0aWMgaW50IGxlZF93cml0ZShjaGFyICpidWYpCi17Ci0JY2hhciAqY21kOwotCWludCBsZWQsIGluZCwgcmV0OwotCi0JaWYgKCFsZWRfc3VwcG9ydGVkKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCXdoaWxlICgoY21kID0gbmV4dF9jbWQoJmJ1ZikpKSB7Ci0JCWlmIChzc2NhbmYoY21kLCAiJWQiLCAmbGVkKSAhPSAxIHx8IGxlZCA8IDAgfHwgbGVkID4gNykKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCWlmIChzdHJzdHIoY21kLCAib2ZmIikpIHsKLQkJCWluZCA9IDA7Ci0JCX0gZWxzZSBpZiAoc3Ryc3RyKGNtZCwgIm9uIikpIHsKLQkJCWluZCA9IDE7Ci0JCX0gZWxzZSBpZiAoc3Ryc3RyKGNtZCwgImJsaW5rIikpIHsKLQkJCWluZCA9IDI7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJaWYgKGxlZF9zdXBwb3J0ZWQgPT0gSUJNQUNQSV9MRURfNTcwKSB7Ci0JCQkvKiA1NzAgKi8KLQkJCWxlZCA9IDEgPDwgbGVkOwotCQkJaWYgKCFhY3BpX2V2YWxmKGxlZF9oYW5kbGUsIE5VTEwsIE5VTEwsICJ2ZGQiLAotCQkJCQlsZWQsIGxlZF9zbGVkX2FyZzFbaW5kXSkpCi0JCQkJcmV0dXJuIC1FSU87Ci0JCX0gZWxzZSBpZiAobGVkX3N1cHBvcnRlZCA9PSBJQk1BQ1BJX0xFRF9PTEQpIHsKLQkJCS8qIDYwMGUveCwgNzcwZSwgNzcweCwgQTIxZSwgQTJ4bS9wLCBUMjAtMjIsIFgyMCAqLwotCQkJbGVkID0gMSA8PCBsZWQ7Ci0JCQlyZXQgPSBlY193cml0ZShFQ19ITE1TLCBsZWQpOwotCQkJaWYgKHJldCA+PSAwKQotCQkJCXJldCA9Ci0JCQkJICAgIGVjX3dyaXRlKEVDX0hMQkwsIGxlZCAqIGxlZF9leHBfaGxibFtpbmRdKTsKLQkJCWlmIChyZXQgPj0gMCkKLQkJCQlyZXQgPQotCQkJCSAgICBlY193cml0ZShFQ19ITENMLCBsZWQgKiBsZWRfZXhwX2hsY2xbaW5kXSk7Ci0JCQlpZiAocmV0IDwgMCkKLQkJCQlyZXR1cm4gcmV0OwotCQl9IGVsc2UgewotCQkJLyogYWxsIG90aGVycyAqLwotCQkJaWYgKCFhY3BpX2V2YWxmKGxlZF9oYW5kbGUsIE5VTEwsIE5VTEwsICJ2ZGQiLAotCQkJCQlsZWQsIGxlZF9sZWRfYXJnMVtpbmRdKSkKLQkJCQlyZXR1cm4gLUVJTzsKLQkJfQotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGJlZXBfcmVhZChjaGFyICpwKQotewotCWludCBsZW4gPSAwOwotCi0JaWYgKCFiZWVwX2hhbmRsZSkKLQkJbGVuICs9IHNwcmludGYocCArIGxlbiwgInN0YXR1czpcdFx0bm90IHN1cHBvcnRlZFxuIik7Ci0JZWxzZSB7Ci0JCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJzdGF0dXM6XHRcdHN1cHBvcnRlZFxuIik7Ci0JCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJjb21tYW5kczpcdDxjbWQ+ICg8Y21kPiBpcyAwLTE3KVxuIik7Ci0JfQotCi0JcmV0dXJuIGxlbjsKLX0KLQotc3RhdGljIGludCBiZWVwX3dyaXRlKGNoYXIgKmJ1ZikKLXsKLQljaGFyICpjbWQ7Ci0JaW50IGJlZXBfY21kOwotCi0JaWYgKCFiZWVwX2hhbmRsZSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQl3aGlsZSAoKGNtZCA9IG5leHRfY21kKCZidWYpKSkgewotCQlpZiAoc3NjYW5mKGNtZCwgIiV1IiwgJmJlZXBfY21kKSA9PSAxICYmCi0JCSAgICBiZWVwX2NtZCA+PSAwICYmIGJlZXBfY21kIDw9IDE3KSB7Ci0JCQkvKiBiZWVwX2NtZCBzZXQgKi8KLQkJfSBlbHNlCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJaWYgKCFhY3BpX2V2YWxmKGJlZXBfaGFuZGxlLCBOVUxMLCBOVUxMLCAidmRkIiwgYmVlcF9jbWQsIDApKQotCQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYWNwaV9lY19yZWFkKGludCBpLCB1OCAqIHApCi17Ci0JaW50IHY7Ci0KLQlpZiAoZWNyZF9oYW5kbGUpIHsKLQkJaWYgKCFhY3BpX2V2YWxmKGVjcmRfaGFuZGxlLCAmdiwgTlVMTCwgImRkIiwgaSkpCi0JCQlyZXR1cm4gMDsKLQkJKnAgPSB2OwotCX0gZWxzZSB7Ci0JCWlmIChlY19yZWFkKGksIHApIDwgMCkKLQkJCXJldHVybiAwOwotCX0KLQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IGFjcGlfZWNfd3JpdGUoaW50IGksIHU4IHYpCi17Ci0JaWYgKGVjd3JfaGFuZGxlKSB7Ci0JCWlmICghYWNwaV9ldmFsZihlY3dyX2hhbmRsZSwgTlVMTCwgTlVMTCwgInZkZCIsIGksIHYpKQotCQkJcmV0dXJuIDA7Ci0JfSBlbHNlIHsKLQkJaWYgKGVjX3dyaXRlKGksIHYpIDwgMCkKLQkJCXJldHVybiAwOwotCX0KLQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgZW51bSB0aGVybWFsX2FjY2Vzc19tb2RlIHRoZXJtYWxfcmVhZF9tb2RlOwotCi1zdGF0aWMgaW50IHRoZXJtYWxfaW5pdCh2b2lkKQotewotCXU4IHQsIHRhMSwgdGEyOwotCWludCBpOwotCWludCBhY3BpX3RtcDcgPSBhY3BpX2V2YWxmKGVjX2hhbmRsZSwgTlVMTCwgIlRNUDciLCAicXYiKTsKLQotCWlmIChpYm1fdGhpbmtwYWRfZWNfZm91bmQgJiYgZXhwZXJpbWVudGFsKSB7Ci0JCS8qCi0JCSAqIERpcmVjdCBFQyBhY2Nlc3MgbW9kZTogc2Vuc29ycyBhdCByZWdpc3RlcnMKLQkJICogMHg3OC0weDdGLCAweEMwLTB4QzcuICBSZWdpc3RlcnMgcmV0dXJuIDB4MDAgZm9yCi0JCSAqIG5vbi1pbXBsZW1lbnRlZCwgdGhlcm1hbCBzZW5zb3JzIHJldHVybiAweDgwIHdoZW4KLQkJICogbm90IGF2YWlsYWJsZQotCQkgKi8KLQotCQl0YTEgPSB0YTIgPSAwOwotCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JCQlpZiAobGlrZWx5KGFjcGlfZWNfcmVhZCgweDc4ICsgaSwgJnQpKSkgewotCQkJCXRhMSB8PSB0OwotCQkJfSBlbHNlIHsKLQkJCQl0YTEgPSAwOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKGxpa2VseShhY3BpX2VjX3JlYWQoMHhDMCArIGksICZ0KSkpIHsKLQkJCQl0YTIgfD0gdDsKLQkJCX0gZWxzZSB7Ci0JCQkJdGExID0gMDsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAodGExID09IDApIHsKLQkJCS8qIFRoaXMgaXMgc2hlZXIgcGFyYW5vaWEsIGJ1dCB3ZSBoYW5kbGUgaXQgYW55d2F5ICovCi0JCQlpZiAoYWNwaV90bXA3KSB7Ci0JCQkJcHJpbnRrKElCTV9FUlIKLQkJCQkgICAgICAgIlRoaW5rUGFkIEFDUEkgRUMgYWNjZXNzIG1pc2JlaGF2aW5nLCAiCi0JCQkJICAgICAgICJmYWxsaW5nIGJhY2sgdG8gQUNQSSBUTVB4IGFjY2VzcyBtb2RlXG4iKTsKLQkJCQl0aGVybWFsX3JlYWRfbW9kZSA9IElCTUFDUElfVEhFUk1BTF9BQ1BJX1RNUDA3OwotCQkJfSBlbHNlIHsKLQkJCQlwcmludGsoSUJNX0VSUgotCQkJCSAgICAgICAiVGhpbmtQYWQgQUNQSSBFQyBhY2Nlc3MgbWlzYmVoYXZpbmcsICIKLQkJCQkgICAgICAgImRpc2FibGluZyB0aGVybWFsIHNlbnNvcnMgYWNjZXNzXG4iKTsKLQkJCQl0aGVybWFsX3JlYWRfbW9kZSA9IElCTUFDUElfVEhFUk1BTF9OT05FOwotCQkJfQotCQl9IGVsc2UgewotCQkJdGhlcm1hbF9yZWFkX21vZGUgPQotCQkJICAgICh0YTIgIT0gMCkgPwotCQkJICAgIElCTUFDUElfVEhFUk1BTF9UUEVDXzE2IDogSUJNQUNQSV9USEVSTUFMX1RQRUNfODsKLQkJfQotCX0gZWxzZSBpZiAoYWNwaV90bXA3KSB7Ci0JCWlmIChhY3BpX2V2YWxmKGVjX2hhbmRsZSwgTlVMTCwgIlVQRFQiLCAicXYiKSkgewotCQkJLyogNjAwZS94LCA3NzBlLCA3NzB4ICovCi0JCQl0aGVybWFsX3JlYWRfbW9kZSA9IElCTUFDUElfVEhFUk1BTF9BQ1BJX1VQRFQ7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBTdGFuZGFyZCBBQ1BJIFRNUHggYWNjZXNzLCBtYXggOCBzZW5zb3JzICovCi0JCQl0aGVybWFsX3JlYWRfbW9kZSA9IElCTUFDUElfVEhFUk1BTF9BQ1BJX1RNUDA3OwotCQl9Ci0JfSBlbHNlIHsKLQkJLyogdGVtcGVyYXR1cmVzIG5vdCBzdXBwb3J0ZWQgb24gNTcwLCBHNHgsIFIzMCwgUjMxLCBSMzIgKi8KLQkJdGhlcm1hbF9yZWFkX21vZGUgPSBJQk1BQ1BJX1RIRVJNQUxfTk9ORTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB0aGVybWFsX2dldF9zZW5zb3JzKHN0cnVjdCBpYm1fdGhlcm1hbF9zZW5zb3JzX3N0cnVjdCAqcykKLXsKLQlpbnQgaSwgdDsKLQlzOCB0bXA7Ci0JY2hhciB0bXBpW10gPSAiVE1QaSI7Ci0KLQlpZiAoIXMpCi0JCXJldHVybiAtRUlOVkFMOwotCi0Jc3dpdGNoICh0aGVybWFsX3JlYWRfbW9kZSkgewotI2lmIElCTUFDUElfTUFYX1RIRVJNQUxfU0VOU09SUyA+PSAxNgotCWNhc2UgSUJNQUNQSV9USEVSTUFMX1RQRUNfMTY6Ci0JCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKLQkJCWlmICghYWNwaV9lY19yZWFkKDB4QzAgKyBpLCAmdG1wKSkKLQkJCQlyZXR1cm4gLUVJTzsKLQkJCXMtPnRlbXBbaSArIDhdID0gdG1wICogMTAwMDsKLQkJfQotCQkvKiBmYWxsdGhyb3VnaCAqLwotI2VuZGlmCi0JY2FzZSBJQk1BQ1BJX1RIRVJNQUxfVFBFQ184OgotCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JCQlpZiAoIWFjcGlfZWNfcmVhZCgweDc4ICsgaSwgJnRtcCkpCi0JCQkJcmV0dXJuIC1FSU87Ci0JCQlzLT50ZW1wW2ldID0gdG1wICogMTAwMDsKLQkJfQotCQlyZXR1cm4gKHRoZXJtYWxfcmVhZF9tb2RlID09IElCTUFDUElfVEhFUk1BTF9UUEVDXzE2KSA/IDE2IDogODsKLQotCWNhc2UgSUJNQUNQSV9USEVSTUFMX0FDUElfVVBEVDoKLQkJaWYgKCFhY3BpX2V2YWxmKGVjX2hhbmRsZSwgTlVMTCwgIlVQRFQiLCAidiIpKQotCQkJcmV0dXJuIC1FSU87Ci0JCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKLQkJCXRtcGlbM10gPSAnMCcgKyBpOwotCQkJaWYgKCFhY3BpX2V2YWxmKGVjX2hhbmRsZSwgJnQsIHRtcGksICJkIikpCi0JCQkJcmV0dXJuIC1FSU87Ci0JCQlzLT50ZW1wW2ldID0gKHQgLSAyNzMyKSAqIDEwMDsKLQkJfQotCQlyZXR1cm4gODsKLQotCWNhc2UgSUJNQUNQSV9USEVSTUFMX0FDUElfVE1QMDc6Ci0JCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKLQkJCXRtcGlbM10gPSAnMCcgKyBpOwotCQkJaWYgKCFhY3BpX2V2YWxmKGVjX2hhbmRsZSwgJnQsIHRtcGksICJkIikpCi0JCQkJcmV0dXJuIC1FSU87Ci0JCQlzLT50ZW1wW2ldID0gdCAqIDEwMDA7Ci0JCX0KLQkJcmV0dXJuIDg7Ci0KLQljYXNlIElCTUFDUElfVEhFUk1BTF9OT05FOgotCWRlZmF1bHQ6Ci0JCXJldHVybiAwOwotCX0KLX0KLQotc3RhdGljIGludCB0aGVybWFsX3JlYWQoY2hhciAqcCkKLXsKLQlpbnQgbGVuID0gMDsKLQlpbnQgbiwgaTsKLQlzdHJ1Y3QgaWJtX3RoZXJtYWxfc2Vuc29yc19zdHJ1Y3QgdDsKLQotCW4gPSB0aGVybWFsX2dldF9zZW5zb3JzKCZ0KTsKLQlpZiAodW5saWtlbHkobiA8IDApKQotCQlyZXR1cm4gbjsKLQotCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJ0ZW1wZXJhdHVyZXM6XHQiKTsKLQotCWlmIChuID4gMCkgewotCQlmb3IgKGkgPSAwOyBpIDwgKG4gLSAxKTsgaSsrKQotCQkJbGVuICs9IHNwcmludGYocCArIGxlbiwgIiVkICIsIHQudGVtcFtpXSAvIDEwMDApOwotCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiJWRcbiIsIHQudGVtcFtpXSAvIDEwMDApOwotCX0gZWxzZQotCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAibm90IHN1cHBvcnRlZFxuIik7Ci0KLQlyZXR1cm4gbGVuOwotfQotCi1zdGF0aWMgdTggZWNkdW1wX3JlZ3NbMjU2XTsKLQotc3RhdGljIGludCBlY2R1bXBfcmVhZChjaGFyICpwKQotewotCWludCBsZW4gPSAwOwotCWludCBpLCBqOwotCXU4IHY7Ci0KLQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiRUMgICAgICAiCi0JCSAgICAgICAiICswMCArMDEgKzAyICswMyArMDQgKzA1ICswNiArMDciCi0JCSAgICAgICAiICswOCArMDkgKzBhICswYiArMGMgKzBkICswZSArMGZcbiIpOwotCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkgKz0gMTYpIHsKLQkJbGVuICs9IHNwcmludGYocCArIGxlbiwgIkVDIDB4JTAyeDoiLCBpKTsKLQkJZm9yIChqID0gMDsgaiA8IDE2OyBqKyspIHsKLQkJCWlmICghYWNwaV9lY19yZWFkKGkgKyBqLCAmdikpCi0JCQkJYnJlYWs7Ci0JCQlpZiAodiAhPSBlY2R1bXBfcmVnc1tpICsgal0pCi0JCQkJbGVuICs9IHNwcmludGYocCArIGxlbiwgIiAqJTAyeCIsIHYpOwotCQkJZWxzZQotCQkJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICIgICUwMngiLCB2KTsKLQkJCWVjZHVtcF9yZWdzW2kgKyBqXSA9IHY7Ci0JCX0KLQkJbGVuICs9IHNwcmludGYocCArIGxlbiwgIlxuIik7Ci0JCWlmIChqICE9IDE2KQotCQkJYnJlYWs7Ci0JfQotCi0JLyogVGhlc2UgYXJlIHdheSB0b28gZGFuZ2Vyb3VzIHRvIGFkdmVydGlzZSBvcGVubHkuLi4gKi8KLSNpZiAwCi0JbGVuICs9IHNwcmludGYocCArIGxlbiwgImNvbW1hbmRzOlx0MHg8b2Zmc2V0PiAweDx2YWx1ZT4iCi0JCSAgICAgICAiICg8b2Zmc2V0PiBpcyAwMC1mZiwgPHZhbHVlPiBpcyAwMC1mZilcbiIpOwotCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJjb21tYW5kczpcdDB4PG9mZnNldD4gPHZhbHVlPiAgIgotCQkgICAgICAgIiAoPG9mZnNldD4gaXMgMDAtZmYsIDx2YWx1ZT4gaXMgMC0yNTUpXG4iKTsKLSNlbmRpZgotCXJldHVybiBsZW47Ci19Ci0KLXN0YXRpYyBpbnQgZWNkdW1wX3dyaXRlKGNoYXIgKmJ1ZikKLXsKLQljaGFyICpjbWQ7Ci0JaW50IGksIHY7Ci0KLQl3aGlsZSAoKGNtZCA9IG5leHRfY21kKCZidWYpKSkgewotCQlpZiAoc3NjYW5mKGNtZCwgIjB4JXggMHgleCIsICZpLCAmdikgPT0gMikgewotCQkJLyogaSBhbmQgdiBzZXQgKi8KLQkJfSBlbHNlIGlmIChzc2NhbmYoY21kLCAiMHgleCAldSIsICZpLCAmdikgPT0gMikgewotCQkJLyogaSBhbmQgdiBzZXQgKi8KLQkJfSBlbHNlCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJaWYgKGkgPj0gMCAmJiBpIDwgMjU2ICYmIHYgPj0gMCAmJiB2IDwgMjU2KSB7Ci0JCQlpZiAoIWFjcGlfZWNfd3JpdGUoaSwgdikpCi0JCQkJcmV0dXJuIC1FSU87Ci0JCX0gZWxzZQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYnJpZ2h0bmVzc19vZmZzZXQgPSAweDMxOwotCi1zdGF0aWMgaW50IGJyaWdodG5lc3NfZ2V0KHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZCkKLXsKLQl1OCBsZXZlbDsKLQlpZiAoIWFjcGlfZWNfcmVhZChicmlnaHRuZXNzX29mZnNldCwgJmxldmVsKSkKLQkJcmV0dXJuIC1FSU87Ci0KLQlsZXZlbCAmPSAweDc7Ci0KLQlyZXR1cm4gbGV2ZWw7Ci19Ci0KLXN0YXRpYyBpbnQgYnJpZ2h0bmVzc19yZWFkKGNoYXIgKnApCi17Ci0JaW50IGxlbiA9IDA7Ci0JaW50IGxldmVsOwotCi0JaWYgKChsZXZlbCA9IGJyaWdodG5lc3NfZ2V0KE5VTEwpKSA8IDApIHsKLQkJbGVuICs9IHNwcmludGYocCArIGxlbiwgImxldmVsOlx0XHR1bnJlYWRhYmxlXG4iKTsKLQl9IGVsc2UgewotCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAibGV2ZWw6XHRcdCVkXG4iLCBsZXZlbCAmIDB4Nyk7Ci0JCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJjb21tYW5kczpcdHVwLCBkb3duXG4iKTsKLQkJbGVuICs9IHNwcmludGYocCArIGxlbiwgImNvbW1hbmRzOlx0bGV2ZWwgPGxldmVsPiIKLQkJCSAgICAgICAiICg8bGV2ZWw+IGlzIDAtNylcbiIpOwotCX0KLQotCXJldHVybiBsZW47Ci19Ci0KLSNkZWZpbmUgQlJJR0hUTkVTU19VUAk0Ci0jZGVmaW5lIEJSSUdIVE5FU1NfRE9XTgk1Ci0KLXN0YXRpYyBpbnQgYnJpZ2h0bmVzc19zZXQoaW50IHZhbHVlKQotewotCWludCBjbW9zX2NtZCwgaW5jLCBpOwotCWludCBjdXJyZW50X3ZhbHVlID0gYnJpZ2h0bmVzc19nZXQoTlVMTCk7Ci0KLQl2YWx1ZSAmPSA3OwotCi0JY21vc19jbWQgPSB2YWx1ZSA+IGN1cnJlbnRfdmFsdWUgPyBCUklHSFRORVNTX1VQIDogQlJJR0hUTkVTU19ET1dOOwotCWluYyA9IHZhbHVlID4gY3VycmVudF92YWx1ZSA/IDEgOiAtMTsKLQlmb3IgKGkgPSBjdXJyZW50X3ZhbHVlOyBpICE9IHZhbHVlOyBpICs9IGluYykgewotCQlpZiAoIWNtb3NfZXZhbChjbW9zX2NtZCkpCi0JCQlyZXR1cm4gLUVJTzsKLQkJaWYgKCFhY3BpX2VjX3dyaXRlKGJyaWdodG5lc3Nfb2Zmc2V0LCBpICsgaW5jKSkKLQkJCXJldHVybiAtRUlPOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGJyaWdodG5lc3Nfd3JpdGUoY2hhciAqYnVmKQotewotCWludCBsZXZlbDsKLQlpbnQgbmV3X2xldmVsOwotCWNoYXIgKmNtZDsKLQotCXdoaWxlICgoY21kID0gbmV4dF9jbWQoJmJ1ZikpKSB7Ci0JCWlmICgobGV2ZWwgPSBicmlnaHRuZXNzX2dldChOVUxMKSkgPCAwKQotCQkJcmV0dXJuIGxldmVsOwotCQlsZXZlbCAmPSA3OwotCi0JCWlmIChzdHJsZW5jbXAoY21kLCAidXAiKSA9PSAwKSB7Ci0JCQluZXdfbGV2ZWwgPSBsZXZlbCA9PSA3ID8gNyA6IGxldmVsICsgMTsKLQkJfSBlbHNlIGlmIChzdHJsZW5jbXAoY21kLCAiZG93biIpID09IDApIHsKLQkJCW5ld19sZXZlbCA9IGxldmVsID09IDAgPyAwIDogbGV2ZWwgLSAxOwotCQl9IGVsc2UgaWYgKHNzY2FuZihjbWQsICJsZXZlbCAlZCIsICZuZXdfbGV2ZWwpID09IDEgJiYKLQkJCSAgIG5ld19sZXZlbCA+PSAwICYmIG5ld19sZXZlbCA8PSA3KSB7Ci0JCQkvKiBuZXdfbGV2ZWwgc2V0ICovCi0JCX0gZWxzZQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJYnJpZ2h0bmVzc19zZXQobmV3X2xldmVsKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBicmlnaHRuZXNzX3VwZGF0ZV9zdGF0dXMoc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkKQotewotCXJldHVybiBicmlnaHRuZXNzX3NldCgKLQkJKGJkLT5wcm9wcy5mYl9ibGFuayA9PSBGQl9CTEFOS19VTkJMQU5LICYmCi0JCSBiZC0+cHJvcHMucG93ZXIgPT0gRkJfQkxBTktfVU5CTEFOSykgPwotCQkJCWJkLT5wcm9wcy5icmlnaHRuZXNzIDogMCk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgYmFja2xpZ2h0X29wcyBpYm1fYmFja2xpZ2h0X2RhdGEgPSB7Ci0gICAgICAgIC5nZXRfYnJpZ2h0bmVzcyA9IGJyaWdodG5lc3NfZ2V0LAotICAgICAgICAudXBkYXRlX3N0YXR1cyAgPSBicmlnaHRuZXNzX3VwZGF0ZV9zdGF0dXMsCi19OwotCi1zdGF0aWMgaW50IGJyaWdodG5lc3NfaW5pdCh2b2lkKQotewotCWludCBiOwotCi0JYiA9IGJyaWdodG5lc3NfZ2V0KE5VTEwpOwotCWlmIChiIDwgMCkKLQkJcmV0dXJuIGI7Ci0KLQlpYm1fYmFja2xpZ2h0X2RldmljZSA9IGJhY2tsaWdodF9kZXZpY2VfcmVnaXN0ZXIoImlibSIsIE5VTEwsIE5VTEwsCi0JCQkJCQkJICZpYm1fYmFja2xpZ2h0X2RhdGEpOwotCWlmIChJU19FUlIoaWJtX2JhY2tsaWdodF9kZXZpY2UpKSB7Ci0JCXByaW50ayhJQk1fRVJSICJDb3VsZCBub3QgcmVnaXN0ZXIgYmFja2xpZ2h0IGRldmljZVxuIik7Ci0JCXJldHVybiBQVFJfRVJSKGlibV9iYWNrbGlnaHRfZGV2aWNlKTsKLQl9Ci0KLQlpYm1fYmFja2xpZ2h0X2RldmljZS0+cHJvcHMubWF4X2JyaWdodG5lc3MgPSA3OwotCWlibV9iYWNrbGlnaHRfZGV2aWNlLT5wcm9wcy5icmlnaHRuZXNzID0gYjsKLQliYWNrbGlnaHRfdXBkYXRlX3N0YXR1cyhpYm1fYmFja2xpZ2h0X2RldmljZSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgYnJpZ2h0bmVzc19leGl0KHZvaWQpCi17Ci0JaWYgKGlibV9iYWNrbGlnaHRfZGV2aWNlKSB7Ci0JCWJhY2tsaWdodF9kZXZpY2VfdW5yZWdpc3RlcihpYm1fYmFja2xpZ2h0X2RldmljZSk7Ci0JCWlibV9iYWNrbGlnaHRfZGV2aWNlID0gTlVMTDsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgdm9sdW1lX29mZnNldCA9IDB4MzA7Ci0KLXN0YXRpYyBpbnQgdm9sdW1lX3JlYWQoY2hhciAqcCkKLXsKLQlpbnQgbGVuID0gMDsKLQl1OCBsZXZlbDsKLQotCWlmICghYWNwaV9lY19yZWFkKHZvbHVtZV9vZmZzZXQsICZsZXZlbCkpIHsKLQkJbGVuICs9IHNwcmludGYocCArIGxlbiwgImxldmVsOlx0XHR1bnJlYWRhYmxlXG4iKTsKLQl9IGVsc2UgewotCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAibGV2ZWw6XHRcdCVkXG4iLCBsZXZlbCAmIDB4Zik7Ci0JCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJtdXRlOlx0XHQlc1xuIiwgb25vZmYobGV2ZWwsIDYpKTsKLQkJbGVuICs9IHNwcmludGYocCArIGxlbiwgImNvbW1hbmRzOlx0dXAsIGRvd24sIG11dGVcbiIpOwotCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiY29tbWFuZHM6XHRsZXZlbCA8bGV2ZWw+IgotCQkJICAgICAgICIgKDxsZXZlbD4gaXMgMC0xNSlcbiIpOwotCX0KLQotCXJldHVybiBsZW47Ci19Ci0KLSNkZWZpbmUgVk9MVU1FX0RPV04JMAotI2RlZmluZSBWT0xVTUVfVVAJMQotI2RlZmluZSBWT0xVTUVfTVVURQkyCi0KLXN0YXRpYyBpbnQgdm9sdW1lX3dyaXRlKGNoYXIgKmJ1ZikKLXsKLQlpbnQgY21vc19jbWQsIGluYywgaTsKLQl1OCBsZXZlbCwgbXV0ZTsKLQlpbnQgbmV3X2xldmVsLCBuZXdfbXV0ZTsKLQljaGFyICpjbWQ7Ci0KLQl3aGlsZSAoKGNtZCA9IG5leHRfY21kKCZidWYpKSkgewotCQlpZiAoIWFjcGlfZWNfcmVhZCh2b2x1bWVfb2Zmc2V0LCAmbGV2ZWwpKQotCQkJcmV0dXJuIC1FSU87Ci0JCW5ld19tdXRlID0gbXV0ZSA9IGxldmVsICYgMHg0MDsKLQkJbmV3X2xldmVsID0gbGV2ZWwgPSBsZXZlbCAmIDB4ZjsKLQotCQlpZiAoc3RybGVuY21wKGNtZCwgInVwIikgPT0gMCkgewotCQkJaWYgKG11dGUpCi0JCQkJbmV3X211dGUgPSAwOwotCQkJZWxzZQotCQkJCW5ld19sZXZlbCA9IGxldmVsID09IDE1ID8gMTUgOiBsZXZlbCArIDE7Ci0JCX0gZWxzZSBpZiAoc3RybGVuY21wKGNtZCwgImRvd24iKSA9PSAwKSB7Ci0JCQlpZiAobXV0ZSkKLQkJCQluZXdfbXV0ZSA9IDA7Ci0JCQllbHNlCi0JCQkJbmV3X2xldmVsID0gbGV2ZWwgPT0gMCA/IDAgOiBsZXZlbCAtIDE7Ci0JCX0gZWxzZSBpZiAoc3NjYW5mKGNtZCwgImxldmVsICVkIiwgJm5ld19sZXZlbCkgPT0gMSAmJgotCQkJICAgbmV3X2xldmVsID49IDAgJiYgbmV3X2xldmVsIDw9IDE1KSB7Ci0JCQkvKiBuZXdfbGV2ZWwgc2V0ICovCi0JCX0gZWxzZSBpZiAoc3RybGVuY21wKGNtZCwgIm11dGUiKSA9PSAwKSB7Ci0JCQluZXdfbXV0ZSA9IDB4NDA7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJaWYgKG5ld19sZXZlbCAhPSBsZXZlbCkgewkvKiBtdXRlIGRvZXNuJ3QgY2hhbmdlICovCi0JCQljbW9zX2NtZCA9IG5ld19sZXZlbCA+IGxldmVsID8gVk9MVU1FX1VQIDogVk9MVU1FX0RPV047Ci0JCQlpbmMgPSBuZXdfbGV2ZWwgPiBsZXZlbCA/IDEgOiAtMTsKLQotCQkJaWYgKG11dGUgJiYgKCFjbW9zX2V2YWwoY21vc19jbWQpIHx8Ci0JCQkJICAgICAhYWNwaV9lY193cml0ZSh2b2x1bWVfb2Zmc2V0LCBsZXZlbCkpKQotCQkJCXJldHVybiAtRUlPOwotCi0JCQlmb3IgKGkgPSBsZXZlbDsgaSAhPSBuZXdfbGV2ZWw7IGkgKz0gaW5jKQotCQkJCWlmICghY21vc19ldmFsKGNtb3NfY21kKSB8fAotCQkJCSAgICAhYWNwaV9lY193cml0ZSh2b2x1bWVfb2Zmc2V0LCBpICsgaW5jKSkKLQkJCQkJcmV0dXJuIC1FSU87Ci0KLQkJCWlmIChtdXRlICYmICghY21vc19ldmFsKFZPTFVNRV9NVVRFKSB8fAotCQkJCSAgICAgIWFjcGlfZWNfd3JpdGUodm9sdW1lX29mZnNldCwKLQkJCQkJCSAgICBuZXdfbGV2ZWwgKyBtdXRlKSkpCi0JCQkJcmV0dXJuIC1FSU87Ci0JCX0KLQotCQlpZiAobmV3X211dGUgIT0gbXV0ZSkgewkvKiBsZXZlbCBkb2Vzbid0IGNoYW5nZSAqLwotCQkJY21vc19jbWQgPSBuZXdfbXV0ZSA/IFZPTFVNRV9NVVRFIDogVk9MVU1FX1VQOwotCi0JCQlpZiAoIWNtb3NfZXZhbChjbW9zX2NtZCkgfHwKLQkJCSAgICAhYWNwaV9lY193cml0ZSh2b2x1bWVfb2Zmc2V0LCBsZXZlbCArIG5ld19tdXRlKSkKLQkJCQlyZXR1cm4gLUVJTzsKLQkJfQotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgZW51bSBmYW5fc3RhdHVzX2FjY2Vzc19tb2RlIGZhbl9zdGF0dXNfYWNjZXNzX21vZGU7Ci1zdGF0aWMgZW51bSBmYW5fY29udHJvbF9hY2Nlc3NfbW9kZSBmYW5fY29udHJvbF9hY2Nlc3NfbW9kZTsKLXN0YXRpYyBlbnVtIGZhbl9jb250cm9sX2NvbW1hbmRzIGZhbl9jb250cm9sX2NvbW1hbmRzOwotCi1zdGF0aWMgaW50IGZhbl9jb250cm9sX3N0YXR1c19rbm93bjsKLXN0YXRpYyB1OCBmYW5fY29udHJvbF9pbml0aWFsX3N0YXR1czsKLQotc3RhdGljIHZvaWQgZmFuX3dhdGNoZG9nX2ZpcmUoc3RydWN0IHdvcmtfc3RydWN0ICppZ25vcmVkKTsKLXN0YXRpYyBpbnQgZmFuX3dhdGNoZG9nX21heGludGVydmFsOwotc3RhdGljIERFQ0xBUkVfREVMQVlFRF9XT1JLKGZhbl93YXRjaGRvZ190YXNrLCBmYW5fd2F0Y2hkb2dfZmlyZSk7Ci0KLXN0YXRpYyBpbnQgZmFuX2luaXQodm9pZCkKLXsKLQlmYW5fc3RhdHVzX2FjY2Vzc19tb2RlID0gSUJNQUNQSV9GQU5fTk9ORTsKLQlmYW5fY29udHJvbF9hY2Nlc3NfbW9kZSA9IElCTUFDUElfRkFOX1dSX05PTkU7Ci0JZmFuX2NvbnRyb2xfY29tbWFuZHMgPSAwOwotCWZhbl9jb250cm9sX3N0YXR1c19rbm93biA9IDE7Ci0JZmFuX3dhdGNoZG9nX21heGludGVydmFsID0gMDsKLQotCWlmIChnZmFuX2hhbmRsZSkgewotCQkvKiA1NzAsIDYwMGUveCwgNzcwZSwgNzcweCAqLwotCQlmYW5fc3RhdHVzX2FjY2Vzc19tb2RlID0gSUJNQUNQSV9GQU5fUkRfQUNQSV9HRkFOOwotCX0gZWxzZSB7Ci0JCS8qIGFsbCBvdGhlciBUaGlua1BhZHM6IG5vdGUgdGhhdCBldmVuIG9sZC1zdHlsZQotCQkgKiBUaGlua1BhZCBFQ3Mgc3VwcG9ydHMgdGhlIGZhbiBjb250cm9sIHJlZ2lzdGVyICovCi0JCWlmIChsaWtlbHkoYWNwaV9lY19yZWFkKGZhbl9zdGF0dXNfb2Zmc2V0LAotCQkJCQkmZmFuX2NvbnRyb2xfaW5pdGlhbF9zdGF0dXMpKSkgewotCQkJZmFuX3N0YXR1c19hY2Nlc3NfbW9kZSA9IElCTUFDUElfRkFOX1JEX1RQRUM7Ci0KLQkJCS8qIEluIHNvbWUgVGhpbmtQYWRzLCBuZWl0aGVyIHRoZSBFQyBub3IgdGhlIEFDUEkKLQkJCSAqIERTRFQgaW5pdGlhbGl6ZSB0aGUgZmFuIHN0YXR1cywgYW5kIGl0IGVuZHMgdXAKLQkJCSAqIGJlaW5nIHNldCB0byAweDA3IHdoZW4gaXQgKmNvdWxkKiBiZSBlaXRoZXIKLQkJCSAqIDB4MDcgb3IgMHg4MC4KLQkJCSAqCi0JCQkgKiBFbmFibGUgZm9yIFRQLTFZIChUNDMpLCBUUC03OCAoUjUxZSksCi0JCQkgKiBUUC03NiAoUjUyKSwgVFAtNzAgKFQ0MywgUjUyKSwgd2hpY2ggYXJlIGtub3duCi0JCQkgKiB0byBiZSBidWdneS4gKi8KLQkJCWlmIChmYW5fY29udHJvbF9pbml0aWFsX3N0YXR1cyA9PSAweDA3ICYmCi0JCQkgICAgaWJtX3RoaW5rcGFkX2VjX2ZvdW5kICYmCi0JCQkgICAgKChpYm1fdGhpbmtwYWRfZWNfZm91bmRbMF0gPT0gJzEnICYmCi0JCQkgICAgICBpYm1fdGhpbmtwYWRfZWNfZm91bmRbMV0gPT0gJ1knKSB8fAotCQkJICAgICAoaWJtX3RoaW5rcGFkX2VjX2ZvdW5kWzBdID09ICc3JyAmJgotCQkJICAgICAgKGlibV90aGlua3BhZF9lY19mb3VuZFsxXSA9PSAnNicgfHwKLQkJCSAgICAgICBpYm1fdGhpbmtwYWRfZWNfZm91bmRbMV0gPT0gJzgnIHx8Ci0JCQkgICAgICAgaWJtX3RoaW5rcGFkX2VjX2ZvdW5kWzFdID09ICcwJykpCi0JCQkgICAgKSkgewotCQkJCXByaW50ayhJQk1fTk9USUNFCi0JCQkJICAgICAgICJmYW5faW5pdDogaW5pdGlhbCBmYW4gc3RhdHVzIGlzICIKLQkJCQkgICAgICAgInVua25vd24sIGFzc3VtaW5nIGl0IGlzIGluIGF1dG8gIgotCQkJCSAgICAgICAibW9kZVxuIik7Ci0JCQkJZmFuX2NvbnRyb2xfc3RhdHVzX2tub3duID0gMDsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXByaW50ayhJQk1fRVJSCi0JCQkgICAgICAgIlRoaW5rUGFkIEFDUEkgRUMgYWNjZXNzIG1pc2JlaGF2aW5nLCAiCi0JCQkgICAgICAgImZhbiBzdGF0dXMgYW5kIGNvbnRyb2wgdW5hdmFpbGFibGVcbiIpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0KLQlpZiAoc2Zhbl9oYW5kbGUpIHsKLQkJLyogNTcwLCA3NzB4LUpMICovCi0JCWZhbl9jb250cm9sX2FjY2Vzc19tb2RlID0gSUJNQUNQSV9GQU5fV1JfQUNQSV9TRkFOOwotCQlmYW5fY29udHJvbF9jb21tYW5kcyB8PQotCQkgICAgSUJNQUNQSV9GQU5fQ01EX0xFVkVMIHwgSUJNQUNQSV9GQU5fQ01EX0VOQUJMRTsKLQl9IGVsc2UgewotCQlpZiAoIWdmYW5faGFuZGxlKSB7Ci0JCQkvKiBnZmFuIHdpdGhvdXQgc2ZhbiBtZWFucyBubyBmYW4gY29udHJvbCAqLwotCQkJLyogYWxsIG90aGVyIG1vZGVscyBpbXBsZW1lbnQgVFAgRUMgMHgyZiBjb250cm9sICovCi0KLQkJCWlmIChmYW5zX2hhbmRsZSkgewotCQkJCS8qIFgzMSwgWDQwLCBYNDEgKi8KLQkJCQlmYW5fY29udHJvbF9hY2Nlc3NfbW9kZSA9Ci0JCQkJICAgIElCTUFDUElfRkFOX1dSX0FDUElfRkFOUzsKLQkJCQlmYW5fY29udHJvbF9jb21tYW5kcyB8PQotCQkJCSAgICBJQk1BQ1BJX0ZBTl9DTURfU1BFRUQgfAotCQkJCSAgICBJQk1BQ1BJX0ZBTl9DTURfTEVWRUwgfAotCQkJCSAgICBJQk1BQ1BJX0ZBTl9DTURfRU5BQkxFOwotCQkJfSBlbHNlIHsKLQkJCQlmYW5fY29udHJvbF9hY2Nlc3NfbW9kZSA9IElCTUFDUElfRkFOX1dSX1RQRUM7Ci0JCQkJZmFuX2NvbnRyb2xfY29tbWFuZHMgfD0KLQkJCQkgICAgSUJNQUNQSV9GQU5fQ01EX0xFVkVMIHwKLQkJCQkgICAgSUJNQUNQSV9GQU5fQ01EX0VOQUJMRTsKLQkJCX0KLQkJfQotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGZhbl9nZXRfc3RhdHVzKHU4ICpzdGF0dXMpCi17Ci0JdTggczsKLQotCS8qIFRPRE86Ci0JICogQWRkIElCTUFDUElfRkFOX1JEX0FDUElfRkFOUyA/ICovCi0KLQlzd2l0Y2ggKGZhbl9zdGF0dXNfYWNjZXNzX21vZGUpIHsKLQljYXNlIElCTUFDUElfRkFOX1JEX0FDUElfR0ZBTjoKLQkJLyogNTcwLCA2MDBlL3gsIDc3MGUsIDc3MHggKi8KLQotCQlpZiAodW5saWtlbHkoIWFjcGlfZXZhbGYoZ2Zhbl9oYW5kbGUsICZzLCBOVUxMLCAiZCIpKSkKLQkJCXJldHVybiAtRUlPOwotCi0JCWlmIChsaWtlbHkoc3RhdHVzKSkKLQkJCSpzdGF0dXMgPSBzICYgMHgwNzsKLQotCQlicmVhazsKLQotCWNhc2UgSUJNQUNQSV9GQU5fUkRfVFBFQzoKLQkJLyogYWxsIGV4Y2VwdCA1NzAsIDYwMGUveCwgNzcwZSwgNzcweCAqLwotCQlpZiAodW5saWtlbHkoIWFjcGlfZWNfcmVhZChmYW5fc3RhdHVzX29mZnNldCwgJnMpKSkKLQkJCXJldHVybiAtRUlPOwotCi0JCWlmIChsaWtlbHkoc3RhdHVzKSkKLQkJCSpzdGF0dXMgPSBzOwotCi0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FTlhJTzsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBmYW5fZ2V0X3NwZWVkKHVuc2lnbmVkIGludCAqc3BlZWQpCi17Ci0JdTggaGksIGxvOwotCi0Jc3dpdGNoIChmYW5fc3RhdHVzX2FjY2Vzc19tb2RlKSB7Ci0JY2FzZSBJQk1BQ1BJX0ZBTl9SRF9UUEVDOgotCQkvKiBhbGwgZXhjZXB0IDU3MCwgNjAwZS94LCA3NzBlLCA3NzB4ICovCi0JCWlmICh1bmxpa2VseSghYWNwaV9lY19yZWFkKGZhbl9ycG1fb2Zmc2V0LCAmbG8pIHx8Ci0JCQkgICAgICFhY3BpX2VjX3JlYWQoZmFuX3JwbV9vZmZzZXQgKyAxLCAmaGkpKSkKLQkJCXJldHVybiAtRUlPOwotCi0JCWlmIChsaWtlbHkoc3BlZWQpKQotCQkJKnNwZWVkID0gKGhpIDw8IDgpIHwgbG87Ci0KLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVOWElPOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBmYW5fZXhpdCh2b2lkKQotewotCWNhbmNlbF9kZWxheWVkX3dvcmsoJmZhbl93YXRjaGRvZ190YXNrKTsKLQlmbHVzaF9zY2hlZHVsZWRfd29yaygpOwotfQotCi1zdGF0aWMgdm9pZCBmYW5fd2F0Y2hkb2dfcmVzZXQodm9pZCkKLXsKLQlzdGF0aWMgaW50IGZhbl93YXRjaGRvZ19hY3RpdmUgPSAwOwotCi0JaWYgKGZhbl93YXRjaGRvZ19hY3RpdmUpCi0JCWNhbmNlbF9kZWxheWVkX3dvcmsoJmZhbl93YXRjaGRvZ190YXNrKTsKLQotCWlmIChmYW5fd2F0Y2hkb2dfbWF4aW50ZXJ2YWwgPiAwKSB7Ci0JCWZhbl93YXRjaGRvZ19hY3RpdmUgPSAxOwotCQlpZiAoIXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmZmFuX3dhdGNoZG9nX3Rhc2ssCi0JCQkJbXNlY3NfdG9famlmZmllcyhmYW5fd2F0Y2hkb2dfbWF4aW50ZXJ2YWwKLQkJCQkJCSAqIDEwMDApKSkgewotCQkJcHJpbnRrKElCTV9FUlIgImZhaWxlZCB0byBzY2hlZHVsZSB0aGUgZmFuIHdhdGNoZG9nLCAiCi0JCQkgICAgICAgIndhdGNoZG9nIHdpbGwgbm90IHRyaWdnZXJcbiIpOwotCQl9Ci0JfSBlbHNlCi0JCWZhbl93YXRjaGRvZ19hY3RpdmUgPSAwOwotfQotCi1zdGF0aWMgaW50IGZhbl9yZWFkKGNoYXIgKnApCi17Ci0JaW50IGxlbiA9IDA7Ci0JaW50IHJjOwotCXU4IHN0YXR1czsKLQl1bnNpZ25lZCBpbnQgc3BlZWQgPSAwOwotCi0Jc3dpdGNoIChmYW5fc3RhdHVzX2FjY2Vzc19tb2RlKSB7Ci0JY2FzZSBJQk1BQ1BJX0ZBTl9SRF9BQ1BJX0dGQU46Ci0JCS8qIDU3MCwgNjAwZS94LCA3NzBlLCA3NzB4ICovCi0JCWlmICgocmMgPSBmYW5fZ2V0X3N0YXR1cygmc3RhdHVzKSkgPCAwKQotCQkJcmV0dXJuIHJjOwotCi0JCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJzdGF0dXM6XHRcdCVzXG4iCi0JCQkgICAgICAgImxldmVsOlx0XHQlZFxuIiwKLQkJCSAgICAgICAoc3RhdHVzICE9IDApID8gImVuYWJsZWQiIDogImRpc2FibGVkIiwgc3RhdHVzKTsKLQkJYnJlYWs7Ci0KLQljYXNlIElCTUFDUElfRkFOX1JEX1RQRUM6Ci0JCS8qIGFsbCBleGNlcHQgNTcwLCA2MDBlL3gsIDc3MGUsIDc3MHggKi8KLQkJaWYgKChyYyA9IGZhbl9nZXRfc3RhdHVzKCZzdGF0dXMpKSA8IDApCi0JCQlyZXR1cm4gcmM7Ci0KLQkJaWYgKHVubGlrZWx5KCFmYW5fY29udHJvbF9zdGF0dXNfa25vd24pKSB7Ci0JCQlpZiAoc3RhdHVzICE9IGZhbl9jb250cm9sX2luaXRpYWxfc3RhdHVzKQotCQkJCWZhbl9jb250cm9sX3N0YXR1c19rbm93biA9IDE7Ci0JCQllbHNlCi0JCQkJLyogUmV0dXJuIG1vc3QgbGlrZWx5IHN0YXR1cy4gSW4gZmFjdCwgaXQKLQkJCQkgKiBtaWdodCBiZSB0aGUgb25seSBwb3NzaWJsZSBzdGF0dXMgKi8KLQkJCQlzdGF0dXMgPSBJQk1BQ1BJX0ZBTl9FQ19BVVRPOwotCQl9Ci0KLQkJbGVuICs9IHNwcmludGYocCArIGxlbiwgInN0YXR1czpcdFx0JXNcbiIsCi0JCQkgICAgICAgKHN0YXR1cyAhPSAwKSA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOwotCi0JCS8qIE5vIFRoaW5rUGFkIGJvb3RzIG9uIGRpc2VuZ2FnZWQgbW9kZSwgd2UgY2FuIHNhZmVseQotCQkgKiBhc3N1bWUgdGhlIHRhY2hvbWV0ZXIgaXMgb25saW5lIGlmIGZhbiBjb250cm9sIHN0YXR1cwotCQkgKiB3YXMgdW5rbm93biAqLwotCQlpZiAoKHJjID0gZmFuX2dldF9zcGVlZCgmc3BlZWQpKSA8IDApCi0JCQlyZXR1cm4gcmM7Ci0KLQkJbGVuICs9IHNwcmludGYocCArIGxlbiwgInNwZWVkOlx0XHQlZFxuIiwgc3BlZWQpOwotCi0JCWlmIChzdGF0dXMgJiBJQk1BQ1BJX0ZBTl9FQ19ESVNFTkdBR0VEKQotCQkJLyogRGlzZW5nYWdlZCBtb2RlIHRha2VzIHByZWNlZGVuY2UgKi8KLQkJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJsZXZlbDpcdFx0ZGlzZW5nYWdlZFxuIik7Ci0JCWVsc2UgaWYgKHN0YXR1cyAmIElCTUFDUElfRkFOX0VDX0FVVE8pCi0JCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAibGV2ZWw6XHRcdGF1dG9cbiIpOwotCQllbHNlCi0JCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAibGV2ZWw6XHRcdCVkXG4iLCBzdGF0dXMpOwotCQlicmVhazsKLQotCWNhc2UgSUJNQUNQSV9GQU5fTk9ORToKLQlkZWZhdWx0OgotCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAic3RhdHVzOlx0XHRub3Qgc3VwcG9ydGVkXG4iKTsKLQl9Ci0KLQlpZiAoZmFuX2NvbnRyb2xfY29tbWFuZHMgJiBJQk1BQ1BJX0ZBTl9DTURfTEVWRUwpIHsKLQkJbGVuICs9IHNwcmludGYocCArIGxlbiwgImNvbW1hbmRzOlx0bGV2ZWwgPGxldmVsPiIpOwotCi0JCXN3aXRjaCAoZmFuX2NvbnRyb2xfYWNjZXNzX21vZGUpIHsKLQkJY2FzZSBJQk1BQ1BJX0ZBTl9XUl9BQ1BJX1NGQU46Ci0JCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiICg8bGV2ZWw+IGlzIDAtNylcbiIpOwotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICIgKDxsZXZlbD4gaXMgMC03LCAiCi0JCQkJICAgICAgICJhdXRvLCBkaXNlbmdhZ2VkKVxuIik7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCWlmIChmYW5fY29udHJvbF9jb21tYW5kcyAmIElCTUFDUElfRkFOX0NNRF9FTkFCTEUpCi0JCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJjb21tYW5kczpcdGVuYWJsZSwgZGlzYWJsZVxuIgotCQkJICAgICAgICJjb21tYW5kczpcdHdhdGNoZG9nIDx0aW1lb3V0PiAoPHRpbWVvdXQ+IGlzIDAgKG9mZiksICIKLQkJCSAgICAgICAiMS0xMjAgKHNlY29uZHMpKVxuIik7Ci0KLQlpZiAoZmFuX2NvbnRyb2xfY29tbWFuZHMgJiBJQk1BQ1BJX0ZBTl9DTURfU1BFRUQpCi0JCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJjb21tYW5kczpcdHNwZWVkIDxzcGVlZD4iCi0JCQkgICAgICAgIiAoPHNwZWVkPiBpcyAwLTY1NTM1KVxuIik7Ci0KLQlyZXR1cm4gbGVuOwotfQotCi1zdGF0aWMgaW50IGZhbl9zZXRfbGV2ZWwoaW50IGxldmVsKQotewotCXN3aXRjaCAoZmFuX2NvbnRyb2xfYWNjZXNzX21vZGUpIHsKLQljYXNlIElCTUFDUElfRkFOX1dSX0FDUElfU0ZBTjoKLQkJaWYgKGxldmVsID49IDAgJiYgbGV2ZWwgPD0gNykgewotCQkJaWYgKCFhY3BpX2V2YWxmKHNmYW5faGFuZGxlLCBOVUxMLCBOVUxMLCAidmQiLCBsZXZlbCkpCi0JCQkJcmV0dXJuIC1FSU87Ci0JCX0gZWxzZQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWJyZWFrOwotCi0JY2FzZSBJQk1BQ1BJX0ZBTl9XUl9BQ1BJX0ZBTlM6Ci0JY2FzZSBJQk1BQ1BJX0ZBTl9XUl9UUEVDOgotCQlpZiAoKGxldmVsICE9IElCTUFDUElfRkFOX0VDX0FVVE8pICYmCi0JCSAgICAobGV2ZWwgIT0gSUJNQUNQSV9GQU5fRUNfRElTRU5HQUdFRCkgJiYKLQkJICAgICgobGV2ZWwgPCAwKSB8fCAobGV2ZWwgPiA3KSkpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQotCQlpZiAoIWFjcGlfZWNfd3JpdGUoZmFuX3N0YXR1c19vZmZzZXQsIGxldmVsKSkKLQkJCXJldHVybiAtRUlPOwotCQllbHNlCi0JCQlmYW5fY29udHJvbF9zdGF0dXNfa25vd24gPSAxOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRU5YSU87Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGZhbl9zZXRfZW5hYmxlKHZvaWQpCi17Ci0JdTggczsKLQlpbnQgcmM7Ci0KLQlzd2l0Y2ggKGZhbl9jb250cm9sX2FjY2Vzc19tb2RlKSB7Ci0JY2FzZSBJQk1BQ1BJX0ZBTl9XUl9BQ1BJX0ZBTlM6Ci0JY2FzZSBJQk1BQ1BJX0ZBTl9XUl9UUEVDOgotCQlpZiAoKHJjID0gZmFuX2dldF9zdGF0dXMoJnMpKSA8IDApCi0JCQlyZXR1cm4gcmM7Ci0KLQkJLyogRG9uJ3QgZ28gb3V0IG9mIGVtZXJnZW5jeSBmYW4gbW9kZSAqLwotCQlpZiAocyAhPSA3KQotCQkJcyA9IElCTUFDUElfRkFOX0VDX0FVVE87Ci0KLQkJaWYgKCFhY3BpX2VjX3dyaXRlKGZhbl9zdGF0dXNfb2Zmc2V0LCBzKSkKLQkJCXJldHVybiAtRUlPOwotCQllbHNlCi0JCQlmYW5fY29udHJvbF9zdGF0dXNfa25vd24gPSAxOwotCQlicmVhazsKLQotCWNhc2UgSUJNQUNQSV9GQU5fV1JfQUNQSV9TRkFOOgotCQlpZiAoKHJjID0gZmFuX2dldF9zdGF0dXMoJnMpKSA8IDApCi0JCQlyZXR1cm4gcmM7Ci0KLQkJcyAmPSAweDA3OwotCi0JCS8qIFNldCBmYW4gdG8gYXQgbGVhc3QgbGV2ZWwgNCAqLwotCQlpZiAocyA8IDQpCi0JCQlzID0gNDsKLQotCQlpZiAoIWFjcGlfZXZhbGYoc2Zhbl9oYW5kbGUsIE5VTEwsIE5VTEwsICJ2ZCIsIHMpKQotCQkJcmV0dXJuIC1FSU87Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FTlhJTzsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZmFuX3NldF9kaXNhYmxlKHZvaWQpCi17Ci0Jc3dpdGNoIChmYW5fY29udHJvbF9hY2Nlc3NfbW9kZSkgewotCWNhc2UgSUJNQUNQSV9GQU5fV1JfQUNQSV9GQU5TOgotCWNhc2UgSUJNQUNQSV9GQU5fV1JfVFBFQzoKLQkJaWYgKCFhY3BpX2VjX3dyaXRlKGZhbl9zdGF0dXNfb2Zmc2V0LCAweDAwKSkKLQkJCXJldHVybiAtRUlPOwotCQllbHNlCi0JCQlmYW5fY29udHJvbF9zdGF0dXNfa25vd24gPSAxOwotCQlicmVhazsKLQotCWNhc2UgSUJNQUNQSV9GQU5fV1JfQUNQSV9TRkFOOgotCQlpZiAoIWFjcGlfZXZhbGYoc2Zhbl9oYW5kbGUsIE5VTEwsIE5VTEwsICJ2ZCIsIDB4MDApKQotCQkJcmV0dXJuIC1FSU87Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FTlhJTzsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZmFuX3NldF9zcGVlZChpbnQgc3BlZWQpCi17Ci0Jc3dpdGNoIChmYW5fY29udHJvbF9hY2Nlc3NfbW9kZSkgewotCWNhc2UgSUJNQUNQSV9GQU5fV1JfQUNQSV9GQU5TOgotCQlpZiAoc3BlZWQgPj0gMCAmJiBzcGVlZCA8PSA2NTUzNSkgewotCQkJaWYgKCFhY3BpX2V2YWxmKGZhbnNfaGFuZGxlLCBOVUxMLCBOVUxMLCAidmRkZCIsCi0JCQkJCXNwZWVkLCBzcGVlZCwgc3BlZWQpKQotCQkJCXJldHVybiAtRUlPOwotCQl9IGVsc2UKLQkJCXJldHVybiAtRUlOVkFMOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRU5YSU87Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGZhbl93cml0ZV9jbWRfbGV2ZWwoY29uc3QgY2hhciAqY21kLCBpbnQgKnJjKQotewotCWludCBsZXZlbDsKLQotCWlmIChzdHJsZW5jbXAoY21kLCAibGV2ZWwgYXV0byIpID09IDApCi0JCWxldmVsID0gSUJNQUNQSV9GQU5fRUNfQVVUTzsKLQllbHNlIGlmIChzdHJsZW5jbXAoY21kLCAibGV2ZWwgZGlzZW5nYWdlZCIpID09IDApCi0JCWxldmVsID0gSUJNQUNQSV9GQU5fRUNfRElTRU5HQUdFRDsKLQllbHNlIGlmIChzc2NhbmYoY21kLCAibGV2ZWwgJWQiLCAmbGV2ZWwpICE9IDEpCi0JCXJldHVybiAwOwotCi0JaWYgKCgqcmMgPSBmYW5fc2V0X2xldmVsKGxldmVsKSkgPT0gLUVOWElPKQotCQlwcmludGsoSUJNX0VSUiAibGV2ZWwgY29tbWFuZCBhY2NlcHRlZCBmb3IgdW5zdXBwb3J0ZWQgIgotCQkgICAgICAgImFjY2VzcyBtb2RlICVkIiwgZmFuX2NvbnRyb2xfYWNjZXNzX21vZGUpOwotCi0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgZmFuX3dyaXRlX2NtZF9lbmFibGUoY29uc3QgY2hhciAqY21kLCBpbnQgKnJjKQotewotCWlmIChzdHJsZW5jbXAoY21kLCAiZW5hYmxlIikgIT0gMCkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoKCpyYyA9IGZhbl9zZXRfZW5hYmxlKCkpID09IC1FTlhJTykKLQkJcHJpbnRrKElCTV9FUlIgImVuYWJsZSBjb21tYW5kIGFjY2VwdGVkIGZvciB1bnN1cHBvcnRlZCAiCi0JCSAgICAgICAiYWNjZXNzIG1vZGUgJWQiLCBmYW5fY29udHJvbF9hY2Nlc3NfbW9kZSk7Ci0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBmYW5fd3JpdGVfY21kX2Rpc2FibGUoY29uc3QgY2hhciAqY21kLCBpbnQgKnJjKQotewotCWlmIChzdHJsZW5jbXAoY21kLCAiZGlzYWJsZSIpICE9IDApCi0JCXJldHVybiAwOwotCi0JaWYgKCgqcmMgPSBmYW5fc2V0X2Rpc2FibGUoKSkgPT0gLUVOWElPKQotCQlwcmludGsoSUJNX0VSUiAiZGlzYWJsZSBjb21tYW5kIGFjY2VwdGVkIGZvciB1bnN1cHBvcnRlZCAiCi0JCSAgICAgICAiYWNjZXNzIG1vZGUgJWQiLCBmYW5fY29udHJvbF9hY2Nlc3NfbW9kZSk7Ci0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBmYW5fd3JpdGVfY21kX3NwZWVkKGNvbnN0IGNoYXIgKmNtZCwgaW50ICpyYykKLXsKLQlpbnQgc3BlZWQ7Ci0KLQkvKiBUT0RPOgotCSAqIFN1cHBvcnQgc3BlZWQgPGxvdz4gPG1lZGl1bT4gPGhpZ2g+ID8gKi8KLQotCWlmIChzc2NhbmYoY21kLCAic3BlZWQgJWQiLCAmc3BlZWQpICE9IDEpCi0JCXJldHVybiAwOwotCi0JaWYgKCgqcmMgPSBmYW5fc2V0X3NwZWVkKHNwZWVkKSkgPT0gLUVOWElPKQotCQlwcmludGsoSUJNX0VSUiAic3BlZWQgY29tbWFuZCBhY2NlcHRlZCBmb3IgdW5zdXBwb3J0ZWQgIgotCQkgICAgICAgImFjY2VzcyBtb2RlICVkIiwgZmFuX2NvbnRyb2xfYWNjZXNzX21vZGUpOwotCi0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgZmFuX3dyaXRlX2NtZF93YXRjaGRvZyhjb25zdCBjaGFyICpjbWQsIGludCAqcmMpCi17Ci0JaW50IGludGVydmFsOwotCi0JaWYgKHNzY2FuZihjbWQsICJ3YXRjaGRvZyAlZCIsICZpbnRlcnZhbCkgIT0gMSkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoaW50ZXJ2YWwgPCAwIHx8IGludGVydmFsID4gMTIwKQotCQkqcmMgPSAtRUlOVkFMOwotCWVsc2UKLQkJZmFuX3dhdGNoZG9nX21heGludGVydmFsID0gaW50ZXJ2YWw7Ci0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBmYW5fd3JpdGUoY2hhciAqYnVmKQotewotCWNoYXIgKmNtZDsKLQlpbnQgcmMgPSAwOwotCi0Jd2hpbGUgKCFyYyAmJiAoY21kID0gbmV4dF9jbWQoJmJ1ZikpKSB7Ci0JCWlmICghKChmYW5fY29udHJvbF9jb21tYW5kcyAmIElCTUFDUElfRkFOX0NNRF9MRVZFTCkgJiYKLQkJICAgICAgZmFuX3dyaXRlX2NtZF9sZXZlbChjbWQsICZyYykpICYmCi0JCSAgICAhKChmYW5fY29udHJvbF9jb21tYW5kcyAmIElCTUFDUElfRkFOX0NNRF9FTkFCTEUpICYmCi0JCSAgICAgIChmYW5fd3JpdGVfY21kX2VuYWJsZShjbWQsICZyYykgfHwKLQkJICAgICAgIGZhbl93cml0ZV9jbWRfZGlzYWJsZShjbWQsICZyYykgfHwKLQkJICAgICAgIGZhbl93cml0ZV9jbWRfd2F0Y2hkb2coY21kLCAmcmMpKSkgJiYKLQkJICAgICEoKGZhbl9jb250cm9sX2NvbW1hbmRzICYgSUJNQUNQSV9GQU5fQ01EX1NQRUVEKSAmJgotCQkgICAgICBmYW5fd3JpdGVfY21kX3NwZWVkKGNtZCwgJnJjKSkKLQkJICAgICkKLQkJCXJjID0gLUVJTlZBTDsKLQkJZWxzZSBpZiAoIXJjKQotCQkJZmFuX3dhdGNoZG9nX3Jlc2V0KCk7Ci0JfQotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgdm9pZCBmYW5fd2F0Y2hkb2dfZmlyZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKmlnbm9yZWQpCi17Ci0JcHJpbnRrKElCTV9OT1RJQ0UgImZhbiB3YXRjaGRvZzogZW5hYmxpbmcgZmFuXG4iKTsKLQlpZiAoZmFuX3NldF9lbmFibGUoKSkgewotCQlwcmludGsoSUJNX0VSUiAiZmFuIHdhdGNoZG9nOiBlcnJvciB3aGlsZSBlbmFibGluZyBmYW5cbiIpOwotCQkvKiByZXNjaGVkdWxlIGZvciBsYXRlciAqLwotCQlmYW5fd2F0Y2hkb2dfcmVzZXQoKTsKLQl9Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaWJtX3N0cnVjdCBpYm1zW10gPSB7Ci0JewotCSAubmFtZSA9ICJkcml2ZXIiLAotCSAuaW5pdCA9IGlibV9hY3BpX2RyaXZlcl9pbml0LAotCSAucmVhZCA9IGRyaXZlcl9yZWFkLAotCSB9LAotCXsKLQkgLm5hbWUgPSAiaG90a2V5IiwKLQkgLmhpZCA9IElCTV9IS0VZX0hJRCwKLQkgLmluaXQgPSBob3RrZXlfaW5pdCwKLQkgLnJlYWQgPSBob3RrZXlfcmVhZCwKLQkgLndyaXRlID0gaG90a2V5X3dyaXRlLAotCSAuZXhpdCA9IGhvdGtleV9leGl0LAotCSAubm90aWZ5ID0gaG90a2V5X25vdGlmeSwKLQkgLmhhbmRsZSA9ICZoa2V5X2hhbmRsZSwKLQkgLnR5cGUgPSBBQ1BJX0RFVklDRV9OT1RJRlksCi0JIH0sCi0JewotCSAubmFtZSA9ICJibHVldG9vdGgiLAotCSAuaW5pdCA9IGJsdWV0b290aF9pbml0LAotCSAucmVhZCA9IGJsdWV0b290aF9yZWFkLAotCSAud3JpdGUgPSBibHVldG9vdGhfd3JpdGUsCi0JIH0sCi0JewotCSAubmFtZSA9ICJ3YW4iLAotCSAuaW5pdCA9IHdhbl9pbml0LAotCSAucmVhZCA9IHdhbl9yZWFkLAotCSAud3JpdGUgPSB3YW5fd3JpdGUsCi0JIC5leHBlcmltZW50YWwgPSAxLAotCSB9LAotCXsKLQkgLm5hbWUgPSAidmlkZW8iLAotCSAuaW5pdCA9IHZpZGVvX2luaXQsCi0JIC5yZWFkID0gdmlkZW9fcmVhZCwKLQkgLndyaXRlID0gdmlkZW9fd3JpdGUsCi0JIC5leGl0ID0gdmlkZW9fZXhpdCwKLQkgfSwKLQl7Ci0JIC5uYW1lID0gImxpZ2h0IiwKLQkgLmluaXQgPSBsaWdodF9pbml0LAotCSAucmVhZCA9IGxpZ2h0X3JlYWQsCi0JIC53cml0ZSA9IGxpZ2h0X3dyaXRlLAotCSB9LAotI2lmZGVmIENPTkZJR19BQ1BJX0lCTV9ET0NLCi0JewotCSAubmFtZSA9ICJkb2NrIiwKLQkgLnJlYWQgPSBkb2NrX3JlYWQsCi0JIC53cml0ZSA9IGRvY2tfd3JpdGUsCi0JIC5ub3RpZnkgPSBkb2NrX25vdGlmeSwKLQkgLmhhbmRsZSA9ICZkb2NrX2hhbmRsZSwKLQkgLnR5cGUgPSBBQ1BJX1NZU1RFTV9OT1RJRlksCi0JIH0sCi0JewotCSAubmFtZSA9ICJkb2NrIiwKLQkgLmhpZCA9IElCTV9QQ0lfSElELAotCSAubm90aWZ5ID0gZG9ja19ub3RpZnksCi0JIC5oYW5kbGUgPSAmcGNpX2hhbmRsZSwKLQkgLnR5cGUgPSBBQ1BJX1NZU1RFTV9OT1RJRlksCi0JIH0sCi0jZW5kaWYKLSNpZmRlZiBDT05GSUdfQUNQSV9JQk1fQkFZCi0JewotCSAubmFtZSA9ICJiYXkiLAotCSAuaW5pdCA9IGJheV9pbml0LAotCSAucmVhZCA9IGJheV9yZWFkLAotCSAud3JpdGUgPSBiYXlfd3JpdGUsCi0JIC5ub3RpZnkgPSBiYXlfbm90aWZ5LAotCSAuaGFuZGxlID0gJmJheV9oYW5kbGUsCi0JIC50eXBlID0gQUNQSV9TWVNURU1fTk9USUZZLAotCSB9LAotI2VuZGlmIC8qIENPTkZJR19BQ1BJX0lCTV9CQVkgKi8KLQl7Ci0JIC5uYW1lID0gImNtb3MiLAotCSAucmVhZCA9IGNtb3NfcmVhZCwKLQkgLndyaXRlID0gY21vc193cml0ZSwKLQkgfSwKLQl7Ci0JIC5uYW1lID0gImxlZCIsCi0JIC5pbml0ID0gbGVkX2luaXQsCi0JIC5yZWFkID0gbGVkX3JlYWQsCi0JIC53cml0ZSA9IGxlZF93cml0ZSwKLQkgfSwKLQl7Ci0JIC5uYW1lID0gImJlZXAiLAotCSAucmVhZCA9IGJlZXBfcmVhZCwKLQkgLndyaXRlID0gYmVlcF93cml0ZSwKLQkgfSwKLQl7Ci0JIC5uYW1lID0gInRoZXJtYWwiLAotCSAuaW5pdCA9IHRoZXJtYWxfaW5pdCwKLQkgLnJlYWQgPSB0aGVybWFsX3JlYWQsCi0JIH0sCi0JewotCSAubmFtZSA9ICJlY2R1bXAiLAotCSAucmVhZCA9IGVjZHVtcF9yZWFkLAotCSAud3JpdGUgPSBlY2R1bXBfd3JpdGUsCi0JIC5leHBlcmltZW50YWwgPSAxLAotCSB9LAotCXsKLQkgLm5hbWUgPSAiYnJpZ2h0bmVzcyIsCi0JIC5yZWFkID0gYnJpZ2h0bmVzc19yZWFkLAotCSAud3JpdGUgPSBicmlnaHRuZXNzX3dyaXRlLAotCSAuaW5pdCA9IGJyaWdodG5lc3NfaW5pdCwKLQkgLmV4aXQgPSBicmlnaHRuZXNzX2V4aXQsCi0JIH0sCi0JewotCSAubmFtZSA9ICJ2b2x1bWUiLAotCSAucmVhZCA9IHZvbHVtZV9yZWFkLAotCSAud3JpdGUgPSB2b2x1bWVfd3JpdGUsCi0JIH0sCi0JewotCSAubmFtZSA9ICJmYW4iLAotCSAucmVhZCA9IGZhbl9yZWFkLAotCSAud3JpdGUgPSBmYW5fd3JpdGUsCi0JIC5pbml0ID0gZmFuX2luaXQsCi0JIC5leGl0ID0gZmFuX2V4aXQsCi0JIC5leHBlcmltZW50YWwgPSAxLAotCSB9LAotfTsKLQotc3RhdGljIGludCBkaXNwYXRjaF9yZWFkKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLCBpbnQgY291bnQsCi0JCQkgaW50ICplb2YsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IGlibV9zdHJ1Y3QgKmlibSA9IGRhdGE7Ci0JaW50IGxlbjsKLQotCWlmICghaWJtIHx8ICFpYm0tPnJlYWQpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JbGVuID0gaWJtLT5yZWFkKHBhZ2UpOwotCWlmIChsZW4gPCAwKQotCQlyZXR1cm4gbGVuOwotCi0JaWYgKGxlbiA8PSBvZmYgKyBjb3VudCkKLQkJKmVvZiA9IDE7Ci0JKnN0YXJ0ID0gcGFnZSArIG9mZjsKLQlsZW4gLT0gb2ZmOwotCWlmIChsZW4gPiBjb3VudCkKLQkJbGVuID0gY291bnQ7Ci0JaWYgKGxlbiA8IDApCi0JCWxlbiA9IDA7Ci0KLQlyZXR1cm4gbGVuOwotfQotCi1zdGF0aWMgaW50IGRpc3BhdGNoX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqIHVzZXJidWYsCi0JCQkgIHVuc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IGlibV9zdHJ1Y3QgKmlibSA9IGRhdGE7Ci0JY2hhciAqa2VybmJ1ZjsKLQlpbnQgcmV0OwotCi0JaWYgKCFpYm0gfHwgIWlibS0+d3JpdGUpCi0JCXJldHVybiAtRUlOVkFMOwotCi0Ja2VybmJ1ZiA9IGttYWxsb2MoY291bnQgKyAyLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWtlcm5idWYpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKGtlcm5idWYsIHVzZXJidWYsIGNvdW50KSkgewotCQlrZnJlZShrZXJuYnVmKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCi0Ja2VybmJ1Zltjb3VudF0gPSAwOwotCXN0cmNhdChrZXJuYnVmLCAiLCIpOwotCXJldCA9IGlibS0+d3JpdGUoa2VybmJ1Zik7Ci0JaWYgKHJldCA9PSAwKQotCQlyZXQgPSBjb3VudDsKLQotCWtmcmVlKGtlcm5idWYpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgZGlzcGF0Y2hfbm90aWZ5KGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIGV2ZW50LCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBpYm1fc3RydWN0ICppYm0gPSBkYXRhOwotCi0JaWYgKCFpYm0gfHwgIWlibS0+bm90aWZ5KQotCQlyZXR1cm47Ci0KLQlpYm0tPm5vdGlmeShpYm0sIGV2ZW50KTsKLX0KLQotc3RhdGljIGludCBfX2luaXQgc2V0dXBfbm90aWZ5KHN0cnVjdCBpYm1fc3RydWN0ICppYm0pCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCWludCByZXQ7Ci0KLQlpZiAoISppYm0tPmhhbmRsZSkKLQkJcmV0dXJuIDA7Ci0KLQlyZXQgPSBhY3BpX2J1c19nZXRfZGV2aWNlKCppYm0tPmhhbmRsZSwgJmlibS0+ZGV2aWNlKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcmludGsoSUJNX0VSUiAiJXMgZGV2aWNlIG5vdCBwcmVzZW50XG4iLCBpYm0tPm5hbWUpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlhY3BpX2RyaXZlcl9kYXRhKGlibS0+ZGV2aWNlKSA9IGlibTsKLQlzcHJpbnRmKGFjcGlfZGV2aWNlX2NsYXNzKGlibS0+ZGV2aWNlKSwgIiVzLyVzIiwgSUJNX05BTUUsIGlibS0+bmFtZSk7Ci0KLQlzdGF0dXMgPSBhY3BpX2luc3RhbGxfbm90aWZ5X2hhbmRsZXIoKmlibS0+aGFuZGxlLCBpYm0tPnR5cGUsCi0JCQkJCSAgICAgZGlzcGF0Y2hfbm90aWZ5LCBpYm0pOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlpZiAoc3RhdHVzID09IEFFX0FMUkVBRFlfRVhJU1RTKSB7Ci0JCQlwcmludGsoSUJNX05PVElDRSAiYW5vdGhlciBkZXZpY2UgZHJpdmVyIGlzIGFscmVhZHkgaGFuZGxpbmcgJXMgZXZlbnRzXG4iLAotCQkJCWlibS0+bmFtZSk7Ci0JCX0gZWxzZSB7Ci0JCQlwcmludGsoSUJNX0VSUiAiYWNwaV9pbnN0YWxsX25vdGlmeV9oYW5kbGVyKCVzKSBmYWlsZWQ6ICVkXG4iLAotCQkJCWlibS0+bmFtZSwgc3RhdHVzKTsKLQkJfQotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0JaWJtLT5ub3RpZnlfaW5zdGFsbGVkID0gMTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBfX2luaXQgaWJtX2RldmljZV9hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IHJlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgaWJtX3N0cnVjdCAqaWJtKQotewotCWludCByZXQ7Ci0KLQlpYm0tPmRyaXZlciA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhY3BpX2RyaXZlciksIEdGUF9LRVJORUwpOwotCWlmICghaWJtLT5kcml2ZXIpIHsKLQkJcHJpbnRrKElCTV9FUlIgImttYWxsb2MoaWJtLT5kcml2ZXIpIGZhaWxlZFxuIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlzcHJpbnRmKGlibS0+ZHJpdmVyLT5uYW1lLCAiJXNfJXMiLCBJQk1fTkFNRSwgaWJtLT5uYW1lKTsKLQlpYm0tPmRyaXZlci0+aWRzID0gaWJtLT5oaWQ7Ci0JaWJtLT5kcml2ZXItPm9wcy5hZGQgPSAmaWJtX2RldmljZV9hZGQ7Ci0KLQlyZXQgPSBhY3BpX2J1c19yZWdpc3Rlcl9kcml2ZXIoaWJtLT5kcml2ZXIpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50ayhJQk1fRVJSICJhY3BpX2J1c19yZWdpc3Rlcl9kcml2ZXIoJXMpIGZhaWxlZDogJWRcbiIsCi0JCSAgICAgICBpYm0tPmhpZCwgcmV0KTsKLQkJa2ZyZWUoaWJtLT5kcml2ZXIpOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGlibV9leGl0KHN0cnVjdCBpYm1fc3RydWN0ICppYm0pOwotCi1zdGF0aWMgaW50IF9faW5pdCBpYm1faW5pdChzdHJ1Y3QgaWJtX3N0cnVjdCAqaWJtKQotewotCWludCByZXQ7Ci0Jc3RydWN0IHByb2NfZGlyX2VudHJ5ICplbnRyeTsKLQotCWlmIChpYm0tPmV4cGVyaW1lbnRhbCAmJiAhZXhwZXJpbWVudGFsKQotCQlyZXR1cm4gMDsKLQotCWlmIChpYm0tPmhpZCkgewotCQlyZXQgPSByZWdpc3Rlcl9kcml2ZXIoaWJtKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OwotCQlpYm0tPmRyaXZlcl9yZWdpc3RlcmVkID0gMTsKLQl9Ci0KLQlpZiAoaWJtLT5pbml0KSB7Ci0JCXJldCA9IGlibS0+aW5pdCgpOwotCQlpZiAocmV0ICE9IDApCi0JCQlyZXR1cm4gcmV0OwotCQlpYm0tPmluaXRfY2FsbGVkID0gMTsKLQl9Ci0KLQlpZiAoaWJtLT5yZWFkKSB7Ci0JCWVudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkoaWJtLT5uYW1lLAotCQkJCQkgIFNfSUZSRUcgfCBTX0lSVUdPIHwgU19JV1VTUiwKLQkJCQkJICBwcm9jX2Rpcik7Ci0JCWlmICghZW50cnkpIHsKLQkJCXByaW50ayhJQk1fRVJSICJ1bmFibGUgdG8gY3JlYXRlIHByb2MgZW50cnkgJXNcbiIsCi0JCQkgICAgICAgaWJtLT5uYW1lKTsKLQkJCXJldHVybiAtRU5PREVWOwotCQl9Ci0JCWVudHJ5LT5vd25lciA9IFRISVNfTU9EVUxFOwotCQllbnRyeS0+ZGF0YSA9IGlibTsKLQkJZW50cnktPnJlYWRfcHJvYyA9ICZkaXNwYXRjaF9yZWFkOwotCQlpZiAoaWJtLT53cml0ZSkKLQkJCWVudHJ5LT53cml0ZV9wcm9jID0gJmRpc3BhdGNoX3dyaXRlOwotCQlpYm0tPnByb2NfY3JlYXRlZCA9IDE7Ci0JfQotCi0JaWYgKGlibS0+bm90aWZ5KSB7Ci0JCXJldCA9IHNldHVwX25vdGlmeShpYm0pOwotCQlpZiAocmV0ID09IC1FTk9ERVYpIHsKLQkJCXByaW50ayhJQk1fTk9USUNFICJkaXNhYmxpbmcgc3ViZHJpdmVyICVzXG4iLAotCQkJCWlibS0+bmFtZSk7Ci0JCQlpYm1fZXhpdChpYm0pOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBpYm1fZXhpdChzdHJ1Y3QgaWJtX3N0cnVjdCAqaWJtKQotewotCWlmIChpYm0tPm5vdGlmeV9pbnN0YWxsZWQpCi0JCWFjcGlfcmVtb3ZlX25vdGlmeV9oYW5kbGVyKCppYm0tPmhhbmRsZSwgaWJtLT50eXBlLAotCQkJCQkgICBkaXNwYXRjaF9ub3RpZnkpOwotCi0JaWYgKGlibS0+cHJvY19jcmVhdGVkKQotCQlyZW1vdmVfcHJvY19lbnRyeShpYm0tPm5hbWUsIHByb2NfZGlyKTsKLQotCWlmIChpYm0tPmluaXRfY2FsbGVkICYmIGlibS0+ZXhpdCkKLQkJaWJtLT5leGl0KCk7Ci0KLQlpZiAoaWJtLT5kcml2ZXJfcmVnaXN0ZXJlZCkgewotCQlhY3BpX2J1c191bnJlZ2lzdGVyX2RyaXZlcihpYm0tPmRyaXZlcik7Ci0JCWtmcmVlKGlibS0+ZHJpdmVyKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBpYm1faGFuZGxlX2luaXQoY2hhciAqbmFtZSwKLQkJCQkgICBhY3BpX2hhbmRsZSAqIGhhbmRsZSwgYWNwaV9oYW5kbGUgcGFyZW50LAotCQkJCSAgIGNoYXIgKipwYXRocywgaW50IG51bV9wYXRocywgY2hhciAqKnBhdGgpCi17Ci0JaW50IGk7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCi0JZm9yIChpID0gMDsgaSA8IG51bV9wYXRoczsgaSsrKSB7Ci0JCXN0YXR1cyA9IGFjcGlfZ2V0X2hhbmRsZShwYXJlbnQsIHBhdGhzW2ldLCBoYW5kbGUpOwotCQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKLQkJCSpwYXRoID0gcGF0aHNbaV07Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQkqaGFuZGxlID0gTlVMTDsKLX0KLQotI2RlZmluZSBJQk1fSEFORExFX0lOSVQob2JqZWN0KQkJCQkJCVwKLQlpYm1faGFuZGxlX2luaXQoI29iamVjdCwgJm9iamVjdCMjX2hhbmRsZSwgKm9iamVjdCMjX3BhcmVudCwJXAotCQlvYmplY3QjI19wYXRocywgQVJSQVlfU0laRShvYmplY3QjI19wYXRocyksICZvYmplY3QjI19wYXRoKQotCi1zdGF0aWMgaW50IF9faW5pdCBzZXRfaWJtX3BhcmFtKGNvbnN0IGNoYXIgKnZhbCwgc3RydWN0IGtlcm5lbF9wYXJhbSAqa3ApCi17Ci0JdW5zaWduZWQgaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpYm1zKTsgaSsrKQotCQlpZiAoc3RyY21wKGlibXNbaV0ubmFtZSwga3AtPm5hbWUpID09IDAgJiYgaWJtc1tpXS53cml0ZSkgewotCQkJaWYgKHN0cmxlbih2YWwpID4gc2l6ZW9mKGlibXNbaV0ucGFyYW0pIC0gMikKLQkJCQlyZXR1cm4gLUVOT1NQQzsKLQkJCXN0cmNweShpYm1zW2ldLnBhcmFtLCB2YWwpOwotCQkJc3RyY2F0KGlibXNbaV0ucGFyYW0sICIsIik7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLSNkZWZpbmUgSUJNX1BBUkFNKGZlYXR1cmUpIFwKLQltb2R1bGVfcGFyYW1fY2FsbChmZWF0dXJlLCBzZXRfaWJtX3BhcmFtLCBOVUxMLCBOVUxMLCAwKQotCi1JQk1fUEFSQU0oaG90a2V5KTsKLUlCTV9QQVJBTShibHVldG9vdGgpOwotSUJNX1BBUkFNKHZpZGVvKTsKLUlCTV9QQVJBTShsaWdodCk7Ci0jaWZkZWYgQ09ORklHX0FDUElfSUJNX0RPQ0sKLUlCTV9QQVJBTShkb2NrKTsKLSNlbmRpZgotI2lmZGVmIENPTkZJR19BQ1BJX0lCTV9CQVkKLUlCTV9QQVJBTShiYXkpOwotI2VuZGlmIC8qIENPTkZJR19BQ1BJX0lCTV9CQVkgKi8KLUlCTV9QQVJBTShjbW9zKTsKLUlCTV9QQVJBTShsZWQpOwotSUJNX1BBUkFNKGJlZXApOwotSUJNX1BBUkFNKGVjZHVtcCk7Ci1JQk1fUEFSQU0oYnJpZ2h0bmVzcyk7Ci1JQk1fUEFSQU0odm9sdW1lKTsKLUlCTV9QQVJBTShmYW4pOwotCi1zdGF0aWMgdm9pZCBhY3BpX2libV9leGl0KHZvaWQpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSBBUlJBWV9TSVpFKGlibXMpIC0gMTsgaSA+PSAwOyBpLS0pCi0JCWlibV9leGl0KCZpYm1zW2ldKTsKLQotCWlmIChwcm9jX2RpcikKLQkJcmVtb3ZlX3Byb2NfZW50cnkoSUJNX0RJUiwgYWNwaV9yb290X2Rpcik7Ci0KLQlpZiAoaWJtX3RoaW5rcGFkX2VjX2ZvdW5kKQotCQlrZnJlZShpYm1fdGhpbmtwYWRfZWNfZm91bmQpOwotfQotCi1zdGF0aWMgY2hhciogX19pbml0IGNoZWNrX2RtaV9mb3JfZWModm9pZCkKLXsKLQlzdHJ1Y3QgZG1pX2RldmljZSAqZGV2ID0gTlVMTDsKLQljaGFyIGVjX2Z3X3N0cmluZ1sxOF07Ci0KLQkvKgotCSAqIFRoaW5rUGFkIFQyMyBvciBuZXdlciwgQTMxIG9yIG5ld2VyLCBSNTBlIG9yIG5ld2VyLAotCSAqIFgzMiBvciBuZXdlciwgYWxsIFogc2VyaWVzOyAgU29tZSBtb2RlbHMgbXVzdCBoYXZlIGFuCi0JICogdXAtdG8tZGF0ZSBCSU9TIG9yIHRoZXkgd2lsbCBub3QgYmUgZGV0ZWN0ZWQuCi0JICoKLQkgKiBTZWUgaHR0cDovL3RoaW5rd2lraS5vcmcvd2lraS9MaXN0X29mX0RNSV9JRHMKLQkgKi8KLQl3aGlsZSAoKGRldiA9IGRtaV9maW5kX2RldmljZShETUlfREVWX1RZUEVfT0VNX1NUUklORywgTlVMTCwgZGV2KSkpIHsKLQkJaWYgKHNzY2FuZihkZXYtPm5hbWUsCi0JCQkgICAiSUJNIFRoaW5rUGFkIEVtYmVkZGVkIENvbnRyb2xsZXIgLVslMTdjIiwKLQkJCSAgIGVjX2Z3X3N0cmluZykgPT0gMSkgewotCQkJZWNfZndfc3RyaW5nW3NpemVvZihlY19md19zdHJpbmcpIC0gMV0gPSAwOwotCQkJZWNfZndfc3RyaW5nW3N0cmNzcG4oZWNfZndfc3RyaW5nLCAiIF0iKV0gPSAwOwotCQkJcmV0dXJuIGtzdHJkdXAoZWNfZndfc3RyaW5nLCBHRlBfS0VSTkVMKTsKLQkJfQotCX0KLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGludCBfX2luaXQgYWNwaV9pYm1faW5pdCh2b2lkKQotewotCWludCByZXQsIGk7Ci0KLQlpZiAoYWNwaV9kaXNhYmxlZCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQkvKiBlYyBpcyByZXF1aXJlZCBiZWNhdXNlIG1hbnkgb3RoZXIgaGFuZGxlcyBhcmUgcmVsYXRpdmUgdG8gaXQgKi8KLQlJQk1fSEFORExFX0lOSVQoZWMpOwotCWlmICghZWNfaGFuZGxlKSB7Ci0JCXByaW50ayhJQk1fRVJSICJlYyBvYmplY3Qgbm90IGZvdW5kXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JLyogTW9kZWxzIHdpdGggbmV3ZXIgZmlybXdhcmUgcmVwb3J0IHRoZSBFQyBpbiBETUkgKi8KLQlpYm1fdGhpbmtwYWRfZWNfZm91bmQgPSBjaGVja19kbWlfZm9yX2VjKCk7Ci0KLQkvKiB0aGVzZSBoYW5kbGVzIGFyZSBub3QgcmVxdWlyZWQgKi8KLQlJQk1fSEFORExFX0lOSVQodmlkKTsKLQlJQk1fSEFORExFX0lOSVQodmlkMik7Ci0JSUJNX0hBTkRMRV9JTklUKGxlZGIpOwotCUlCTV9IQU5ETEVfSU5JVChsZWQpOwotCUlCTV9IQU5ETEVfSU5JVChoa2V5KTsKLQlJQk1fSEFORExFX0lOSVQobGdodCk7Ci0JSUJNX0hBTkRMRV9JTklUKGNtb3MpOwotI2lmZGVmIENPTkZJR19BQ1BJX0lCTV9ET0NLCi0JSUJNX0hBTkRMRV9JTklUKGRvY2spOwotI2VuZGlmCi0JSUJNX0hBTkRMRV9JTklUKHBjaSk7Ci0jaWZkZWYgQ09ORklHX0FDUElfSUJNX0JBWQotCUlCTV9IQU5ETEVfSU5JVChiYXkpOwotCWlmIChiYXlfaGFuZGxlKQotCQlJQk1fSEFORExFX0lOSVQoYmF5X2VqKTsKLQlJQk1fSEFORExFX0lOSVQoYmF5Mik7Ci0JaWYgKGJheTJfaGFuZGxlKQotCQlJQk1fSEFORExFX0lOSVQoYmF5Ml9laik7Ci0jZW5kaWYgLyogQ09ORklHX0FDUElfSUJNX0JBWSAqLwotCUlCTV9IQU5ETEVfSU5JVChiZWVwKTsKLQlJQk1fSEFORExFX0lOSVQoZWNyZCk7Ci0JSUJNX0hBTkRMRV9JTklUKGVjd3IpOwotCUlCTV9IQU5ETEVfSU5JVChmYW5zKTsKLQlJQk1fSEFORExFX0lOSVQoZ2Zhbik7Ci0JSUJNX0hBTkRMRV9JTklUKHNmYW4pOwotCi0JcHJvY19kaXIgPSBwcm9jX21rZGlyKElCTV9ESVIsIGFjcGlfcm9vdF9kaXIpOwotCWlmICghcHJvY19kaXIpIHsKLQkJcHJpbnRrKElCTV9FUlIgInVuYWJsZSB0byBjcmVhdGUgcHJvYyBkaXIgJXMiLCBJQk1fRElSKTsKLQkJYWNwaV9pYm1fZXhpdCgpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0JcHJvY19kaXItPm93bmVyID0gVEhJU19NT0RVTEU7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpYm1zKTsgaSsrKSB7Ci0JCXJldCA9IGlibV9pbml0KCZpYm1zW2ldKTsKLQkJaWYgKHJldCA+PSAwICYmICppYm1zW2ldLnBhcmFtKQotCQkJcmV0ID0gaWJtc1tpXS53cml0ZShpYm1zW2ldLnBhcmFtKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCWFjcGlfaWJtX2V4aXQoKTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotbW9kdWxlX2luaXQoYWNwaV9pYm1faW5pdCk7Ci1tb2R1bGVfZXhpdChhY3BpX2libV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfY29yZS5jIGIvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9jb3JlLmMKaW5kZXggOTlkMTUxNi4uZjdkZTAyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9jb3JlLmMKKysrIGIvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9jb3JlLmMKQEAgLTcwLDggKzcwLDYgQEAKICNkZWZpbmUgQUNQSV9QUk9DRVNTT1JfTElNSVRfVVNFUgkwCiAjZGVmaW5lIEFDUElfUFJPQ0VTU09SX0xJTUlUX1RIRVJNQUwJMQogCi0jZGVmaW5lIEFDUElfU1RBX1BSRVNFTlQgMHgwMDAwMDAwMQotCiAjZGVmaW5lIF9DT01QT05FTlQJCUFDUElfUFJPQ0VTU09SX0NPTVBPTkVOVAogQUNQSV9NT0RVTEVfTkFNRSgicHJvY2Vzc29yX2NvcmUiKTsKIApAQCAtNzc5LDcgKzc3Nyw3IEBACiAKIAogCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfaW50ZWdlcihoYW5kbGUsICJfU1RBIiwgTlVMTCwgJnN0YSk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpIHx8ICEoc3RhICYgQUNQSV9TVEFfUFJFU0VOVCkpIHsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykgfHwgIShzdGEgJiBBQ1BJX1NUQV9ERVZJQ0VfUFJFU0VOVCkpIHsKIAkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIHN0YXR1cywgIlByb2Nlc3NvciBEZXZpY2UgaXMgbm90IHByZXNlbnQiKSk7CiAJCXJldHVybiAwOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfaWRsZS5jIGIvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9pZGxlLmMKaW5kZXggY2RmNzg5NC4uYWUwNjU0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9pZGxlLmMKKysrIGIvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9pZGxlLmMKQEAgLTUxLDE0ICs1MSw2IEBACiAjaW5jbHVkZSA8YXNtL2FwaWMuaD4KICNlbmRpZgogCi0vKgotICogSW5jbHVkZSB0aGUgYXBpYyBkZWZpbml0aW9ucyBmb3IgeDg2IHRvIGhhdmUgdGhlIEFQSUMgdGltZXIgcmVsYXRlZCBkZWZpbmVzCi0gKiBhdmFpbGFibGUgYWxzbyBmb3IgVVAgKG9uIFNNUCBpdCBnZXRzIG1hZ2ljYWxseSBpbmNsdWRlZCB2aWEgbGludXgvc21wLmgpLgotICovCi0jaWZkZWYgQ09ORklHX1g4NgotI2luY2x1ZGUgPGFzbS9hcGljLmg+Ci0jZW5kaWYKLQogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9zYnMuYyBiL2RyaXZlcnMvYWNwaS9zYnMuYwppbmRleCA1OTY0MGQ5Li5jMWJhZTEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvc2JzLmMKKysrIGIvZHJpdmVycy9hY3BpL3Nicy5jCkBAIC0zMCwzMCArMzAsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvYWNwaS5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAKLSNpbmNsdWRlICJpMmNfZWMuaCIKLQotI2RlZmluZQlERUZfQ0FQQUNJVFlfVU5JVAkzCi0jZGVmaW5lCU1BSF9DQVBBQ0lUWV9VTklUCTEKLSNkZWZpbmUJTVdIX0NBUEFDSVRZX1VOSVQJMgotI2RlZmluZQlDQVBBQ0lUWV9VTklUCQlERUZfQ0FQQUNJVFlfVU5JVAotCi0jZGVmaW5lCVJFUVVFU1RfVVBEQVRFX01PREUJMQotI2RlZmluZQlRVUVVRV9VUERBVEVfTU9ERQkyCi0KLSNkZWZpbmUJREFUQV9UWVBFX0NPTU1PTgkwCi0jZGVmaW5lCURBVEFfVFlQRV9JTkZPCQkxCi0jZGVmaW5lCURBVEFfVFlQRV9TVEFURQkJMgotI2RlZmluZQlEQVRBX1RZUEVfQUxBUk0JCTMKLSNkZWZpbmUJREFUQV9UWVBFX0FDX1NUQVRFCTQKLQotZXh0ZXJuIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqYWNwaV9sb2NrX2FjX2Rpcih2b2lkKTsKLWV4dGVybiBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmFjcGlfbG9ja19iYXR0ZXJ5X2Rpcih2b2lkKTsKLWV4dGVybiB2b2lkIGFjcGlfdW5sb2NrX2FjX2RpcihzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmFjcGlfYWNfZGlyKTsKLWV4dGVybiB2b2lkIGFjcGlfdW5sb2NrX2JhdHRlcnlfZGlyKHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqYWNwaV9iYXR0ZXJ5X2Rpcik7Ci0KICNkZWZpbmUgQUNQSV9TQlNfQ09NUE9ORU5UCQkweDAwMDgwMDAwCiAjZGVmaW5lIEFDUElfU0JTX0NMQVNTCQkJInNicyIKICNkZWZpbmUgQUNQSV9BQ19DTEFTUwkJCSJhY19hZGFwdGVyIgpAQCAtNzQsMzkgKzU0LDc1IEBACiAKICNkZWZpbmUgX0NPTVBPTkVOVAkJCUFDUElfU0JTX0NPTVBPTkVOVAogCi0jZGVmaW5lCU1BWF9TQlNfQkFUCQkJNAotI2RlZmluZQlNQVhfU01CVVNfRVJSCQkJMQotCiBBQ1BJX01PRFVMRV9OQU1FKCJzYnMiKTsKIAogTU9EVUxFX0FVVEhPUigiUmljaCBUb3duc2VuZCIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJTbWFydCBCYXR0ZXJ5IFN5c3RlbSBBQ1BJIGludGVyZmFjZSBkcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAotc3RhdGljIHN0cnVjdCBzZW1hcGhvcmUgc2JzX3NlbTsKKyNkZWZpbmUJeG1zbGVlcCh0KQltc2xlZXAodCkKIAotI2RlZmluZQlVUERBVEVfTU9ERQkJUVVFVUVfVVBEQVRFX01PREUKLS8qIFJFUVVFU1RfVVBEQVRFX01PREUgIFFVRVVFX1VQREFURV9NT0RFICovCi0jZGVmaW5lCVVQREFURV9JTkZPX01PREUJMAotI2RlZmluZQlVUERBVEVfVElNRQkJNjAKLSNkZWZpbmUJVVBEQVRFX1RJTUUyCQkwCisjZGVmaW5lIEFDUElfRUNfU01CX1BSVENMCTB4MDAJLyogcHJvdG9jb2wsIFBFQyAqLwogCi1zdGF0aWMgaW50IGNhcGFjaXR5X21vZGUgPSBDQVBBQ0lUWV9VTklUOwotc3RhdGljIGludCB1cGRhdGVfbW9kZSA9IFVQREFURV9NT0RFOwotc3RhdGljIGludCB1cGRhdGVfaW5mb19tb2RlID0gVVBEQVRFX0lORk9fTU9ERTsKLXN0YXRpYyBpbnQgdXBkYXRlX3RpbWUgPSBVUERBVEVfVElNRTsKLXN0YXRpYyBpbnQgdXBkYXRlX3RpbWUyID0gVVBEQVRFX1RJTUUyOworI2RlZmluZSBBQ1BJX0VDX1NNQl9TVFMJCTB4MDEJLyogc3RhdHVzICovCisjZGVmaW5lIEFDUElfRUNfU01CX0FERFIJMHgwMgkvKiBhZGRyZXNzICovCisjZGVmaW5lIEFDUElfRUNfU01CX0NNRAkJMHgwMwkvKiBjb21tYW5kICovCisjZGVmaW5lIEFDUElfRUNfU01CX0RBVEEJMHgwNAkvKiAzMiBkYXRhIHJlZ2lzdGVycyAqLworI2RlZmluZSBBQ1BJX0VDX1NNQl9CQ05UCTB4MjQJLyogbnVtYmVyIG9mIGRhdGEgYnl0ZXMgKi8KIAotbW9kdWxlX3BhcmFtKGNhcGFjaXR5X21vZGUsIGludCwgMCk7Ci1tb2R1bGVfcGFyYW0odXBkYXRlX21vZGUsIGludCwgMCk7Ci1tb2R1bGVfcGFyYW0odXBkYXRlX2luZm9fbW9kZSwgaW50LCAwKTsKLW1vZHVsZV9wYXJhbSh1cGRhdGVfdGltZSwgaW50LCAwKTsKLW1vZHVsZV9wYXJhbSh1cGRhdGVfdGltZTIsIGludCwgMCk7CisjZGVmaW5lIEFDUElfRUNfU01CX1NUU19ET05FCTB4ODAKKyNkZWZpbmUgQUNQSV9FQ19TTUJfU1RTX1NUQVRVUwkweDFmCisKKyNkZWZpbmUgQUNQSV9FQ19TTUJfUFJUQ0xfV1JJVEUJCTB4MDAKKyNkZWZpbmUgQUNQSV9FQ19TTUJfUFJUQ0xfUkVBRAkJMHgwMQorI2RlZmluZSBBQ1BJX0VDX1NNQl9QUlRDTF9XT1JEX0RBVEEJMHgwOAorI2RlZmluZSBBQ1BJX0VDX1NNQl9QUlRDTF9CTE9DS19EQVRBCTB4MGEKKworI2RlZmluZSBBQ1BJX0VDX1NNQl9UUkFOU0FDVElPTl9TTEVFUAkxCisjZGVmaW5lIEFDUElfRUNfU01CX0FDQ0VTU19TTEVFUDEJMQorI2RlZmluZSBBQ1BJX0VDX1NNQl9BQ0NFU1NfU0xFRVAyCTEwCisKKyNkZWZpbmUJREVGX0NBUEFDSVRZX1VOSVQJMworI2RlZmluZQlNQUhfQ0FQQUNJVFlfVU5JVAkxCisjZGVmaW5lCU1XSF9DQVBBQ0lUWV9VTklUCTIKKyNkZWZpbmUJQ0FQQUNJVFlfVU5JVAkJREVGX0NBUEFDSVRZX1VOSVQKKworI2RlZmluZQlSRVFVRVNUX1VQREFURV9NT0RFCTEKKyNkZWZpbmUJUVVFVUVfVVBEQVRFX01PREUJMgorCisjZGVmaW5lCURBVEFfVFlQRV9DT01NT04JMAorI2RlZmluZQlEQVRBX1RZUEVfSU5GTwkJMQorI2RlZmluZQlEQVRBX1RZUEVfU1RBVEUJCTIKKyNkZWZpbmUJREFUQV9UWVBFX0FMQVJNCQkzCisjZGVmaW5lCURBVEFfVFlQRV9BQ19TVEFURQk0CisKK2V4dGVybiBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmFjcGlfbG9ja19hY19kaXIodm9pZCk7CitleHRlcm4gc3RydWN0IHByb2NfZGlyX2VudHJ5ICphY3BpX2xvY2tfYmF0dGVyeV9kaXIodm9pZCk7CitleHRlcm4gdm9pZCBhY3BpX3VubG9ja19hY19kaXIoc3RydWN0IHByb2NfZGlyX2VudHJ5ICphY3BpX2FjX2Rpcik7CitleHRlcm4gdm9pZCBhY3BpX3VubG9ja19iYXR0ZXJ5X2RpcihzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmFjcGlfYmF0dGVyeV9kaXIpOworCisjZGVmaW5lCU1BWF9TQlNfQkFUCQkJNAorI2RlZmluZSBBQ1BJX1NCU19CTE9DS19NQVgJCTMyCisKKyNkZWZpbmUgQUNQSV9TQlNfU01CVVNfUkVBRAkJMQorI2RlZmluZSBBQ1BJX1NCU19TTUJVU19XUklURQkJMgorCisjZGVmaW5lIEFDUElfU0JTX1dPUkRfREFUQQkJMQorI2RlZmluZSBBQ1BJX1NCU19CTE9DS19EQVRBCQkyCisKKyNkZWZpbmUJVVBEQVRFX0RFTEFZCTEwCisKKy8qIDAgLSBldmVyeSB0aW1lLCA+IDAgLSBieSB1cGRhdGVfdGltZSAqLworc3RhdGljIHVuc2lnbmVkIGludCB1cGRhdGVfdGltZSA9IDEyMDsKKworc3RhdGljIHVuc2lnbmVkIGludCBjYXBhY2l0eV9tb2RlID0gQ0FQQUNJVFlfVU5JVDsKKworbW9kdWxlX3BhcmFtKHVwZGF0ZV90aW1lLCB1aW50LCAwNjQ0KTsKK21vZHVsZV9wYXJhbShjYXBhY2l0eV9tb2RlLCB1aW50LCAwNDQ0KTsKIAogc3RhdGljIGludCBhY3BpX3Nic19hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOwogc3RhdGljIGludCBhY3BpX3Nic19yZW1vdmUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKTsKLXN0YXRpYyB2b2lkIGFjcGlfYmF0dGVyeV9zbWJ1c19lcnJfaGFuZGxlcihzdHJ1Y3QgYWNwaV9lY19zbWJ1cyAqc21idXMpOwotc3RhdGljIHZvaWQgYWNwaV9zYnNfdXBkYXRlX3F1ZXVlKHZvaWQgKmRhdGEpOworc3RhdGljIGludCBhY3BpX3Nic19yZXN1bWUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOwogCiBzdGF0aWMgc3RydWN0IGFjcGlfZHJpdmVyIGFjcGlfc2JzX2RyaXZlciA9IHsKIAkubmFtZSA9ICJzYnMiLApAQCAtMTE1LDkgKzEzMSwxNCBAQAogCS5vcHMgPSB7CiAJCS5hZGQgPSBhY3BpX3Nic19hZGQsCiAJCS5yZW1vdmUgPSBhY3BpX3Nic19yZW1vdmUsCisJCS5yZXN1bWUgPSBhY3BpX3Nic19yZXN1bWUsCiAJCX0sCiB9OwogCitzdHJ1Y3QgYWNwaV9hYyB7CisJaW50IGFjX3ByZXNlbnQ7Cit9OworCiBzdHJ1Y3QgYWNwaV9iYXR0ZXJ5X2luZm8gewogCWludCBjYXBhY2l0eV9tb2RlOwogCXMxNiBmdWxsX2NoYXJnZV9jYXBhY2l0eTsKQEAgLTEyNiwxOCArMTQ3LDE2IEBACiAJaW50IHZzY2FsZTsKIAlpbnQgaXBzY2FsZTsKIAlzMTYgc2VyaWFsX251bWJlcjsKLQljaGFyIG1hbnVmYWN0dXJlcl9uYW1lW0kyQ19TTUJVU19CTE9DS19NQVggKyAzXTsKLQljaGFyIGRldmljZV9uYW1lW0kyQ19TTUJVU19CTE9DS19NQVggKyAzXTsKLQljaGFyIGRldmljZV9jaGVtaXN0cnlbSTJDX1NNQlVTX0JMT0NLX01BWCArIDNdOworCWNoYXIgbWFudWZhY3R1cmVyX25hbWVbQUNQSV9TQlNfQkxPQ0tfTUFYICsgM107CisJY2hhciBkZXZpY2VfbmFtZVtBQ1BJX1NCU19CTE9DS19NQVggKyAzXTsKKwljaGFyIGRldmljZV9jaGVtaXN0cnlbQUNQSV9TQlNfQkxPQ0tfTUFYICsgM107CiB9OwogCiBzdHJ1Y3QgYWNwaV9iYXR0ZXJ5X3N0YXRlIHsKIAlzMTYgdm9sdGFnZTsKIAlzMTYgYW1wZXJhZ2U7CiAJczE2IHJlbWFpbmluZ19jYXBhY2l0eTsKLQlzMTYgYXZlcmFnZV90aW1lX3RvX2VtcHR5OwotCXMxNiBhdmVyYWdlX3RpbWVfdG9fZnVsbDsKLQlzMTYgYmF0dGVyeV9zdGF0dXM7CisJczE2IGJhdHRlcnlfc3RhdGU7CiB9OwogCiBzdHJ1Y3QgYWNwaV9iYXR0ZXJ5X2FsYXJtIHsKQEAgLTE0Niw5ICsxNjUsOSBAQAogCiBzdHJ1Y3QgYWNwaV9iYXR0ZXJ5IHsKIAlpbnQgYWxpdmU7Ci0JaW50IGJhdHRlcnlfcHJlc2VudDsKIAlpbnQgaWQ7CiAJaW50IGluaXRfc3RhdGU7CisJaW50IGJhdHRlcnlfcHJlc2VudDsKIAlzdHJ1Y3QgYWNwaV9zYnMgKnNiczsKIAlzdHJ1Y3QgYWNwaV9iYXR0ZXJ5X2luZm8gaW5mbzsKIAlzdHJ1Y3QgYWNwaV9iYXR0ZXJ5X3N0YXRlIHN0YXRlOwpAQCAtMTU4LDE4NiArMTc3LDI1MSBAQAogCiBzdHJ1Y3QgYWNwaV9zYnMgewogCWFjcGlfaGFuZGxlIGhhbmRsZTsKKwlpbnQgYmFzZTsKIAlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZTsKIAlzdHJ1Y3QgYWNwaV9lY19zbWJ1cyAqc21idXM7CisJc3RydWN0IG11dGV4IG11dGV4OwogCWludCBzYnNtX3ByZXNlbnQ7CiAJaW50IHNic21fYmF0dGVyaWVzX3N1cHBvcnRlZDsKLQlpbnQgYWNfcHJlc2VudDsKIAlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmFjX2VudHJ5OworCXN0cnVjdCBhY3BpX2FjIGFjOwogCXN0cnVjdCBhY3BpX2JhdHRlcnkgYmF0dGVyeVtNQVhfU0JTX0JBVF07Ci0JaW50IHVwZGF0ZV9pbmZvX21vZGU7CiAJaW50IHpvbWJpZTsKLQlpbnQgdXBkYXRlX3RpbWU7Ci0JaW50IHVwZGF0ZV90aW1lMjsKIAlzdHJ1Y3QgdGltZXJfbGlzdCB1cGRhdGVfdGltZXI7CisJaW50IHJ1bl9jbnQ7CisJaW50IHVwZGF0ZV9wcm9jX2ZsZzsKIH07CiAKLXN0YXRpYyB2b2lkIGFjcGlfdXBkYXRlX2RlbGF5KHN0cnVjdCBhY3BpX3NicyAqc2JzKTsKLXN0YXRpYyBpbnQgYWNwaV9zYnNfdXBkYXRlX3J1bihzdHJ1Y3QgYWNwaV9zYnMgKnNicywgaW50IGRhdGFfdHlwZSk7CitzdGF0aWMgaW50IGFjcGlfc2JzX3VwZGF0ZV9ydW4oc3RydWN0IGFjcGlfc2JzICpzYnMsIGludCBpZCwgaW50IGRhdGFfdHlwZSk7CitzdGF0aWMgdm9pZCBhY3BpX3Nic191cGRhdGVfdGltZSh2b2lkICpkYXRhKTsKKwordW5pb24gc2JzX3J3X2RhdGEgeworCXUxNiB3b3JkOworCXU4IGJsb2NrW0FDUElfU0JTX0JMT0NLX01BWCArIDJdOworfTsKKworc3RhdGljIGludCBhY3BpX2VjX3Nic19hY2Nlc3Moc3RydWN0IGFjcGlfc2JzICpzYnMsIHUxNiBhZGRyLAorCQkJICAgICAgY2hhciByZWFkX3dyaXRlLCB1OCBjb21tYW5kLCBpbnQgc2l6ZSwKKwkJCSAgICAgIHVuaW9uIHNic19yd19kYXRhICpkYXRhKTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTUJ1cyBDb21tdW5pY2F0aW9uCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1zdGF0aWMgdm9pZCBhY3BpX2JhdHRlcnlfc21idXNfZXJyX2hhbmRsZXIoc3RydWN0IGFjcGlfZWNfc21idXMgKnNtYnVzKQorc3RhdGljIGludCBhY3BpX2VjX3Nic19yZWFkKHN0cnVjdCBhY3BpX3NicyAqc2JzLCB1OCBhZGRyZXNzLCB1OCAqIGRhdGEpCiB7Ci0JdW5pb24gaTJjX3NtYnVzX2RhdGEgZGF0YTsKLQlpbnQgcmVzdWx0ID0gMDsKLQljaGFyICplcnJfc3RyOwotCWludCBlcnJfbnVtYmVyOworCXU4IHZhbDsKKwlpbnQgZXJyOwogCi0JZGF0YS53b3JkID0gMDsKKwllcnIgPSBlY19yZWFkKHNicy0+YmFzZSArIGFkZHJlc3MsICZ2YWwpOworCWlmICghZXJyKSB7CisJCSpkYXRhID0gdmFsOworCX0KKwl4bXNsZWVwKEFDUElfRUNfU01CX1RSQU5TQUNUSU9OX1NMRUVQKTsKKwlyZXR1cm4gKGVycik7Cit9CiAKLQlyZXN1bHQgPSBzbWJ1cy0+YWRhcHRlci5hbGdvLT4KLQkgICAgc21idXNfeGZlcigmc21idXMtPmFkYXB0ZXIsCi0JCSAgICAgICBBQ1BJX1NCX1NNQlVTX0FERFIsCi0JCSAgICAgICAwLCBJMkNfU01CVVNfUkVBRCwgMHgxNiwgSTJDX1NNQlVTX0JMT0NLX0RBVEEsICZkYXRhKTsKK3N0YXRpYyBpbnQgYWNwaV9lY19zYnNfd3JpdGUoc3RydWN0IGFjcGlfc2JzICpzYnMsIHU4IGFkZHJlc3MsIHU4IGRhdGEpCit7CisJaW50IGVycjsKIAotCWVycl9udW1iZXIgPSAoZGF0YS53b3JkICYgMHgwMDBmKTsKKwllcnIgPSBlY193cml0ZShzYnMtPmJhc2UgKyBhZGRyZXNzLCBkYXRhKTsKKwlyZXR1cm4gKGVycik7Cit9CiAKLQlzd2l0Y2ggKGRhdGEud29yZCAmIDB4MDAwZikgewotCWNhc2UgMHgwMDAwOgotCQllcnJfc3RyID0gInVuZXhwZWN0ZWQgYnVzIGVycm9yIjsKK3N0YXRpYyBpbnQKK2FjcGlfZWNfc2JzX2FjY2VzcyhzdHJ1Y3QgYWNwaV9zYnMgKnNicywgdTE2IGFkZHIsCisJCSAgIGNoYXIgcmVhZF93cml0ZSwgdTggY29tbWFuZCwgaW50IHNpemUsCisJCSAgIHVuaW9uIHNic19yd19kYXRhICpkYXRhKQoreworCXVuc2lnbmVkIGNoYXIgcHJvdG9jb2wsIGxlbiA9IDAsIHRlbXBbMl0gPSB7IDAsIDAgfTsKKwlpbnQgaTsKKworCWlmIChyZWFkX3dyaXRlID09IEFDUElfU0JTX1NNQlVTX1JFQUQpIHsKKwkJcHJvdG9jb2wgPSBBQ1BJX0VDX1NNQl9QUlRDTF9SRUFEOworCX0gZWxzZSB7CisJCXByb3RvY29sID0gQUNQSV9FQ19TTUJfUFJUQ0xfV1JJVEU7CisJfQorCisJc3dpdGNoIChzaXplKSB7CisKKwljYXNlIEFDUElfU0JTX1dPUkRfREFUQToKKwkJYWNwaV9lY19zYnNfd3JpdGUoc2JzLCBBQ1BJX0VDX1NNQl9DTUQsIGNvbW1hbmQpOworCQlpZiAocmVhZF93cml0ZSA9PSBBQ1BJX1NCU19TTUJVU19XUklURSkgeworCQkJYWNwaV9lY19zYnNfd3JpdGUoc2JzLCBBQ1BJX0VDX1NNQl9EQVRBLCBkYXRhLT53b3JkKTsKKwkJCWFjcGlfZWNfc2JzX3dyaXRlKHNicywgQUNQSV9FQ19TTUJfREFUQSArIDEsCisJCQkJCSAgZGF0YS0+d29yZCA+PiA4KTsKKwkJfQorCQlwcm90b2NvbCB8PSBBQ1BJX0VDX1NNQl9QUlRDTF9XT1JEX0RBVEE7CiAJCWJyZWFrOwotCWNhc2UgMHgwMDAxOgotCQllcnJfc3RyID0gImJ1c3kiOwotCQlicmVhazsKLQljYXNlIDB4MDAwMjoKLQkJZXJyX3N0ciA9ICJyZXNlcnZlZCBjb21tYW5kIjsKLQkJYnJlYWs7Ci0JY2FzZSAweDAwMDM6Ci0JCWVycl9zdHIgPSAidW5zdXBwb3J0ZWQgY29tbWFuZCI7Ci0JCWJyZWFrOwotCWNhc2UgMHgwMDA0OgotCQllcnJfc3RyID0gImFjY2VzcyBkZW5pZWQiOwotCQlicmVhazsKLQljYXNlIDB4MDAwNToKLQkJZXJyX3N0ciA9ICJvdmVyZmxvdy91bmRlcmZsb3ciOwotCQlicmVhazsKLQljYXNlIDB4MDAwNjoKLQkJZXJyX3N0ciA9ICJiYWQgc2l6ZSI7Ci0JCWJyZWFrOwotCWNhc2UgMHgwMDA3OgotCQllcnJfc3RyID0gInVua25vd24gZXJyb3IiOworCWNhc2UgQUNQSV9TQlNfQkxPQ0tfREFUQToKKwkJYWNwaV9lY19zYnNfd3JpdGUoc2JzLCBBQ1BJX0VDX1NNQl9DTUQsIGNvbW1hbmQpOworCQlpZiAocmVhZF93cml0ZSA9PSBBQ1BJX1NCU19TTUJVU19XUklURSkgeworCQkJbGVuID0gbWluX3QodTgsIGRhdGEtPmJsb2NrWzBdLCAzMik7CisJCQlhY3BpX2VjX3Nic193cml0ZShzYnMsIEFDUElfRUNfU01CX0JDTlQsIGxlbik7CisJCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJCQkJYWNwaV9lY19zYnNfd3JpdGUoc2JzLCBBQ1BJX0VDX1NNQl9EQVRBICsgaSwKKwkJCQkJCSAgZGF0YS0+YmxvY2tbaSArIDFdKTsKKwkJfQorCQlwcm90b2NvbCB8PSBBQ1BJX0VDX1NNQl9QUlRDTF9CTE9DS19EQVRBOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQllcnJfc3RyID0gInVucmVjb2duaXplZCBlcnJvciI7CisJCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBBRV9FUlJPUiwKKwkJCQkidW5zdXBwb3J0ZWQgdHJhbnNhY3Rpb24gJWQiLCBzaXplKSk7CisJCXJldHVybiAoLTEpOwogCX0KLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJICAiJXM6IHJldCAlaSwgZXJyICVpXG4iLCBlcnJfc3RyLCByZXN1bHQsIGVycl9udW1iZXIpKTsKKworCWFjcGlfZWNfc2JzX3dyaXRlKHNicywgQUNQSV9FQ19TTUJfQUREUiwgYWRkciA8PCAxKTsKKwlhY3BpX2VjX3Nic193cml0ZShzYnMsIEFDUElfRUNfU01CX1BSVENMLCBwcm90b2NvbCk7CisKKwlhY3BpX2VjX3Nic19yZWFkKHNicywgQUNQSV9FQ19TTUJfU1RTLCB0ZW1wKTsKKworCWlmICh+dGVtcFswXSAmIEFDUElfRUNfU01CX1NUU19ET05FKSB7CisJCXhtc2xlZXAoQUNQSV9FQ19TTUJfQUNDRVNTX1NMRUVQMSk7CisJCWFjcGlfZWNfc2JzX3JlYWQoc2JzLCBBQ1BJX0VDX1NNQl9TVFMsIHRlbXApOworCX0KKwlpZiAofnRlbXBbMF0gJiBBQ1BJX0VDX1NNQl9TVFNfRE9ORSkgeworCQl4bXNsZWVwKEFDUElfRUNfU01CX0FDQ0VTU19TTEVFUDIpOworCQlhY3BpX2VjX3Nic19yZWFkKHNicywgQUNQSV9FQ19TTUJfU1RTLCB0ZW1wKTsKKwl9CisJaWYgKCh+dGVtcFswXSAmIEFDUElfRUNfU01CX1NUU19ET05FKQorCSAgICB8fCAodGVtcFswXSAmIEFDUElfRUNfU01CX1NUU19TVEFUVVMpKSB7CisJCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBBRV9FUlJPUiwKKwkJCQkidHJhbnNhY3Rpb24gJWQgZXJyb3IiLCBzaXplKSk7CisJCXJldHVybiAoLTEpOworCX0KKworCWlmIChyZWFkX3dyaXRlID09IEFDUElfU0JTX1NNQlVTX1dSSVRFKSB7CisJCXJldHVybiAoMCk7CisJfQorCisJc3dpdGNoIChzaXplKSB7CisKKwljYXNlIEFDUElfU0JTX1dPUkRfREFUQToKKwkJYWNwaV9lY19zYnNfcmVhZChzYnMsIEFDUElfRUNfU01CX0RBVEEsIHRlbXApOworCQlhY3BpX2VjX3Nic19yZWFkKHNicywgQUNQSV9FQ19TTUJfREFUQSArIDEsIHRlbXAgKyAxKTsKKwkJZGF0YS0+d29yZCA9ICh0ZW1wWzFdIDw8IDgpIHwgdGVtcFswXTsKKwkJYnJlYWs7CisKKwljYXNlIEFDUElfU0JTX0JMT0NLX0RBVEE6CisJCWxlbiA9IDA7CisJCWFjcGlfZWNfc2JzX3JlYWQoc2JzLCBBQ1BJX0VDX1NNQl9CQ05ULCAmbGVuKTsKKwkJbGVuID0gbWluX3QodTgsIGxlbiwgMzIpOworCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJCQlhY3BpX2VjX3Nic19yZWFkKHNicywgQUNQSV9FQ19TTUJfREFUQSArIGksCisJCQkJCSBkYXRhLT5ibG9jayArIGkgKyAxKTsKKwkJZGF0YS0+YmxvY2tbMF0gPSBsZW47CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBBRV9FUlJPUiwKKwkJCQkidW5zdXBwb3J0ZWQgdHJhbnNhY3Rpb24gJWQiLCBzaXplKSk7CisJCXJldHVybiAoLTEpOworCX0KKworCXJldHVybiAoMCk7CiB9CiAKIHN0YXRpYyBpbnQKLWFjcGlfc2JzX3NtYnVzX3JlYWRfd29yZChzdHJ1Y3QgYWNwaV9lY19zbWJ1cyAqc21idXMsIGludCBhZGRyLCBpbnQgZnVuYywKLQkJCSB1MTYgKiB3b3JkLAotCQkJIHZvaWQgKCplcnJfaGFuZGxlcikgKHN0cnVjdCBhY3BpX2VjX3NtYnVzICogc21idXMpKQorYWNwaV9zYnNfcmVhZF93b3JkKHN0cnVjdCBhY3BpX3NicyAqc2JzLCBpbnQgYWRkciwgaW50IGZ1bmMsIHUxNiAqIHdvcmQpCiB7Ci0JdW5pb24gaTJjX3NtYnVzX2RhdGEgZGF0YTsKKwl1bmlvbiBzYnNfcndfZGF0YSBkYXRhOwogCWludCByZXN1bHQgPSAwOwotCWludCBpOwogCi0JaWYgKGVycl9oYW5kbGVyID09IE5VTEwpIHsKLQkJZXJyX2hhbmRsZXIgPSBhY3BpX2JhdHRlcnlfc21idXNfZXJyX2hhbmRsZXI7Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IE1BWF9TTUJVU19FUlI7IGkrKykgewotCQlyZXN1bHQgPQotCQkgICAgc21idXMtPmFkYXB0ZXIuYWxnby0+c21idXNfeGZlcigmc21idXMtPmFkYXB0ZXIsIGFkZHIsIDAsCi0JCQkJCQkgICAgSTJDX1NNQlVTX1JFQUQsIGZ1bmMsCi0JCQkJCQkgICAgSTJDX1NNQlVTX1dPUkRfREFUQSwgJmRhdGEpOwotCQlpZiAocmVzdWx0KSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkgICJ0cnkgJWk6IHNtYnVzLT5hZGFwdGVyLmFsZ28tPnNtYnVzX3hmZXIoKSBmYWlsZWRcbiIsCi0JCQkJCSAgaSkpOwotCQkJaWYgKGVycl9oYW5kbGVyKSB7Ci0JCQkJZXJyX2hhbmRsZXIoc21idXMpOwotCQkJfQotCQl9IGVsc2UgewotCQkJKndvcmQgPSBkYXRhLndvcmQ7Ci0JCQlicmVhazsKLQkJfQorCXJlc3VsdCA9IGFjcGlfZWNfc2JzX2FjY2VzcyhzYnMsIGFkZHIsCisJCQkJICAgIEFDUElfU0JTX1NNQlVTX1JFQUQsIGZ1bmMsCisJCQkJICAgIEFDUElfU0JTX1dPUkRfREFUQSwgJmRhdGEpOworCWlmIChyZXN1bHQpIHsKKwkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIEFFX0VSUk9SLAorCQkJCSJhY3BpX2VjX3Nic19hY2Nlc3MoKSBmYWlsZWQiKSk7CisJfSBlbHNlIHsKKwkJKndvcmQgPSBkYXRhLndvcmQ7CiAJfQogCiAJcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIGludAotYWNwaV9zYnNfc21idXNfcmVhZF9zdHIoc3RydWN0IGFjcGlfZWNfc21idXMgKnNtYnVzLCBpbnQgYWRkciwgaW50IGZ1bmMsCi0JCQljaGFyICpzdHIsCi0JCQl2b2lkICgqZXJyX2hhbmRsZXIpIChzdHJ1Y3QgYWNwaV9lY19zbWJ1cyAqIHNtYnVzKSkKK2FjcGlfc2JzX3JlYWRfc3RyKHN0cnVjdCBhY3BpX3NicyAqc2JzLCBpbnQgYWRkciwgaW50IGZ1bmMsIGNoYXIgKnN0cikKIHsKLQl1bmlvbiBpMmNfc21idXNfZGF0YSBkYXRhOworCXVuaW9uIHNic19yd19kYXRhIGRhdGE7CiAJaW50IHJlc3VsdCA9IDA7Ci0JaW50IGk7CiAKLQlpZiAoZXJyX2hhbmRsZXIgPT0gTlVMTCkgewotCQllcnJfaGFuZGxlciA9IGFjcGlfYmF0dGVyeV9zbWJ1c19lcnJfaGFuZGxlcjsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTUFYX1NNQlVTX0VSUjsgaSsrKSB7Ci0JCXJlc3VsdCA9Ci0JCSAgICBzbWJ1cy0+YWRhcHRlci5hbGdvLT5zbWJ1c194ZmVyKCZzbWJ1cy0+YWRhcHRlciwgYWRkciwgMCwKLQkJCQkJCSAgICBJMkNfU01CVVNfUkVBRCwgZnVuYywKLQkJCQkJCSAgICBJMkNfU01CVVNfQkxPQ0tfREFUQSwKLQkJCQkJCSAgICAmZGF0YSk7Ci0JCWlmIChyZXN1bHQpIHsKLQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJCSAgInRyeSAlaTogc21idXMtPmFkYXB0ZXIuYWxnby0+c21idXNfeGZlcigpIGZhaWxlZFxuIiwKLQkJCQkJICBpKSk7Ci0JCQlpZiAoZXJyX2hhbmRsZXIpIHsKLQkJCQllcnJfaGFuZGxlcihzbWJ1cyk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdHJuY3B5KHN0ciwgKGNvbnN0IGNoYXIgKilkYXRhLmJsb2NrICsgMSwKLQkJCQlkYXRhLmJsb2NrWzBdKTsKLQkJCXN0cltkYXRhLmJsb2NrWzBdXSA9IDA7Ci0JCQlicmVhazsKLQkJfQorCXJlc3VsdCA9IGFjcGlfZWNfc2JzX2FjY2VzcyhzYnMsIGFkZHIsCisJCQkJICAgIEFDUElfU0JTX1NNQlVTX1JFQUQsIGZ1bmMsCisJCQkJICAgIEFDUElfU0JTX0JMT0NLX0RBVEEsICZkYXRhKTsKKwlpZiAocmVzdWx0KSB7CisJCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBBRV9FUlJPUiwKKwkJCQkiYWNwaV9lY19zYnNfYWNjZXNzKCkgZmFpbGVkIikpOworCX0gZWxzZSB7CisJCXN0cm5jcHkoc3RyLCAoY29uc3QgY2hhciAqKWRhdGEuYmxvY2sgKyAxLCBkYXRhLmJsb2NrWzBdKTsKKwkJc3RyW2RhdGEuYmxvY2tbMF1dID0gMDsKIAl9CiAKIAlyZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgaW50Ci1hY3BpX3Nic19zbWJ1c193cml0ZV93b3JkKHN0cnVjdCBhY3BpX2VjX3NtYnVzICpzbWJ1cywgaW50IGFkZHIsIGludCBmdW5jLAotCQkJICBpbnQgd29yZCwKLQkJCSAgdm9pZCAoKmVycl9oYW5kbGVyKSAoc3RydWN0IGFjcGlfZWNfc21idXMgKiBzbWJ1cykpCithY3BpX3Nic193cml0ZV93b3JkKHN0cnVjdCBhY3BpX3NicyAqc2JzLCBpbnQgYWRkciwgaW50IGZ1bmMsIGludCB3b3JkKQogewotCXVuaW9uIGkyY19zbWJ1c19kYXRhIGRhdGE7CisJdW5pb24gc2JzX3J3X2RhdGEgZGF0YTsKIAlpbnQgcmVzdWx0ID0gMDsKLQlpbnQgaTsKLQotCWlmIChlcnJfaGFuZGxlciA9PSBOVUxMKSB7Ci0JCWVycl9oYW5kbGVyID0gYWNwaV9iYXR0ZXJ5X3NtYnVzX2Vycl9oYW5kbGVyOwotCX0KIAogCWRhdGEud29yZCA9IHdvcmQ7CiAKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX1NNQlVTX0VSUjsgaSsrKSB7Ci0JCXJlc3VsdCA9Ci0JCSAgICBzbWJ1cy0+YWRhcHRlci5hbGdvLT5zbWJ1c194ZmVyKCZzbWJ1cy0+YWRhcHRlciwgYWRkciwgMCwKLQkJCQkJCSAgICBJMkNfU01CVVNfV1JJVEUsIGZ1bmMsCi0JCQkJCQkgICAgSTJDX1NNQlVTX1dPUkRfREFUQSwgJmRhdGEpOwotCQlpZiAocmVzdWx0KSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkgICJ0cnkgJWk6IHNtYnVzLT5hZGFwdGVyLmFsZ28iCi0JCQkJCSAgIi0+c21idXNfeGZlcigpIGZhaWxlZFxuIiwgaSkpOwotCQkJaWYgKGVycl9oYW5kbGVyKSB7Ci0JCQkJZXJyX2hhbmRsZXIoc21idXMpOwotCQkJfQotCQl9IGVsc2UgewotCQkJYnJlYWs7Ci0JCX0KKwlyZXN1bHQgPSBhY3BpX2VjX3Nic19hY2Nlc3Moc2JzLCBhZGRyLAorCQkJCSAgICBBQ1BJX1NCU19TTUJVU19XUklURSwgZnVuYywKKwkJCQkgICAgQUNQSV9TQlNfV09SRF9EQVRBLCAmZGF0YSk7CisJaWYgKHJlc3VsdCkgeworCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgQUVfRVJST1IsCisJCQkJImFjcGlfZWNfc2JzX2FjY2VzcygpIGZhaWxlZCIpKTsKIAl9CiAKIAlyZXR1cm4gcmVzdWx0OwogfQogCitzdGF0aWMgaW50IHNic196b21iaWUoc3RydWN0IGFjcGlfc2JzICpzYnMpCit7CisJcmV0dXJuIChzYnMtPnpvbWJpZSk7Cit9CisKK3N0YXRpYyBpbnQgc2JzX211dGV4X2xvY2soc3RydWN0IGFjcGlfc2JzICpzYnMpCit7CisJaWYgKHNic196b21iaWUoc2JzKSkgeworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJbXV0ZXhfbG9jaygmc2JzLT5tdXRleCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNic19tdXRleF91bmxvY2soc3RydWN0IGFjcGlfc2JzICpzYnMpCit7CisJbXV0ZXhfdW5sb2NrKCZzYnMtPm11dGV4KTsKK30KKwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFydCBCYXR0ZXJ5IFN5c3RlbSBNYW5hZ2VtZW50CiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKiBTbWFydCBCYXR0ZXJ5ICovCitzdGF0aWMgaW50IGFjcGlfY2hlY2tfdXBkYXRlX3Byb2Moc3RydWN0IGFjcGlfc2JzICpzYnMpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisKKwlpZiAodXBkYXRlX3RpbWUgPT0gMCkgeworCQlzYnMtPnVwZGF0ZV9wcm9jX2ZsZyA9IDA7CisJCXJldHVybiAwOworCX0KKwlpZiAoc2JzLT51cGRhdGVfcHJvY19mbGcgPT0gMCkgeworCQlzdGF0dXMgPSBhY3BpX29zX2V4ZWN1dGUoT1NMX0dQRV9IQU5ETEVSLAorCQkJCQkgYWNwaV9zYnNfdXBkYXRlX3RpbWUsIHNicyk7CisJCWlmIChzdGF0dXMgIT0gQUVfT0spIHsKKwkJCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBzdGF0dXMsCisJCQkJCSJhY3BpX29zX2V4ZWN1dGUoKSBmYWlsZWQiKSk7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlzYnMtPnVwZGF0ZV9wcm9jX2ZsZyA9IDE7CisJfQorCXJldHVybiAwOworfQogCiBzdGF0aWMgaW50IGFjcGlfc2JzX2dlbmVyYXRlX2V2ZW50KHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLAogCQkJCSAgIGludCBldmVudCwgaW50IHN0YXRlLCBjaGFyICpiaWQsIGNoYXIgKmNsYXNzKQpAQCAtMzY2LDEyICs0NTAsMTEgQEAKIAlpbnQgcmVzdWx0ID0gMDsKIAlpbnQgaXNfcHJlc2VudCA9IDA7CiAKLQlyZXN1bHQgPSBhY3BpX3Nic19zbWJ1c19yZWFkX3dvcmQoYmF0dGVyeS0+c2JzLT5zbWJ1cywKLQkJCQkJICBBQ1BJX1NCU01fU01CVVNfQUREUiwgMHgwMSwKLQkJCQkJICAmc3RhdGUsIE5VTEwpOworCXJlc3VsdCA9IGFjcGlfc2JzX3JlYWRfd29yZChiYXR0ZXJ5LT5zYnMsCisJCQkJICAgIEFDUElfU0JTTV9TTUJVU19BRERSLCAweDAxLCAmc3RhdGUpOwogCWlmIChyZXN1bHQpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkgICJhY3BpX3Nic19zbWJ1c19yZWFkX3dvcmQoKSBmYWlsZWQiKSk7CisJCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBBRV9FUlJPUiwKKwkJCQkiYWNwaV9zYnNfcmVhZF93b3JkKCkgZmFpbGVkIikpOwogCX0KIAlpZiAoIXJlc3VsdCkgewogCQlpc19wcmVzZW50ID0gKHN0YXRlICYgMHgwMDBmKSAmICgxIDw8IGJhdHRlcnktPmlkKTsKQEAgLTM4MSw0NSArNDY0LDMzIEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotc3RhdGljIGludCBhY3BpX2JhdHRlcnlfaXNfcHJlc2VudChzdHJ1Y3QgYWNwaV9iYXR0ZXJ5ICpiYXR0ZXJ5KQotewotCXJldHVybiAoYmF0dGVyeS0+YmF0dGVyeV9wcmVzZW50KTsKLX0KLQotc3RhdGljIGludCBhY3BpX2FjX2lzX3ByZXNlbnQoc3RydWN0IGFjcGlfc2JzICpzYnMpCi17Ci0JcmV0dXJuIChzYnMtPmFjX3ByZXNlbnQpOwotfQotCiBzdGF0aWMgaW50IGFjcGlfYmF0dGVyeV9zZWxlY3Qoc3RydWN0IGFjcGlfYmF0dGVyeSAqYmF0dGVyeSkKIHsKLQlzdHJ1Y3QgYWNwaV9lY19zbWJ1cyAqc21idXMgPSBiYXR0ZXJ5LT5zYnMtPnNtYnVzOworCXN0cnVjdCBhY3BpX3NicyAqc2JzID0gYmF0dGVyeS0+c2JzOwogCWludCByZXN1bHQgPSAwOwogCXMxNiBzdGF0ZTsKIAlpbnQgZm9vOwogCi0JaWYgKGJhdHRlcnktPnNicy0+c2JzbV9wcmVzZW50KSB7CisJaWYgKHNicy0+c2JzbV9wcmVzZW50KSB7CiAKIAkJLyogVGFrZSBzcGVjaWFsIGNhcmUgbm90IHRvIGtub2JibGUgb3RoZXIgbmliYmxlcyBvZgogCQkgKiBzdGF0ZSAoYWthIHNlbGVjdG9yX3N0YXRlKSwgc2luY2UKIAkJICogaXQgY2F1c2VzIGNoYXJnaW5nIHRvIGhhbHQgb24gU0JTRUxzICovCiAKIAkJcmVzdWx0ID0KLQkJICAgIGFjcGlfc2JzX3NtYnVzX3JlYWRfd29yZChzbWJ1cywgQUNQSV9TQlNNX1NNQlVTX0FERFIsIDB4MDEsCi0JCQkJCSAgICAgJnN0YXRlLCBOVUxMKTsKKwkJICAgIGFjcGlfc2JzX3JlYWRfd29yZChzYnMsIEFDUElfU0JTTV9TTUJVU19BRERSLCAweDAxLCAmc3RhdGUpOwogCQlpZiAocmVzdWx0KSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkgICJhY3BpX3Nic19zbWJ1c19yZWFkX3dvcmQoKSBmYWlsZWRcbiIpKTsKKwkJCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBBRV9FUlJPUiwKKwkJCQkJImFjcGlfc2JzX3JlYWRfd29yZCgpIGZhaWxlZCIpKTsKIAkJCWdvdG8gZW5kOwogCQl9CiAKIAkJZm9vID0gKHN0YXRlICYgMHgwZmZmKSB8ICgxIDw8IChiYXR0ZXJ5LT5pZCArIDEyKSk7CiAJCXJlc3VsdCA9Ci0JCSAgICBhY3BpX3Nic19zbWJ1c193cml0ZV93b3JkKHNtYnVzLCBBQ1BJX1NCU01fU01CVVNfQUREUiwgMHgwMSwKLQkJCQkJICAgICAgZm9vLCBOVUxMKTsKKwkJICAgIGFjcGlfc2JzX3dyaXRlX3dvcmQoc2JzLCBBQ1BJX1NCU01fU01CVVNfQUREUiwgMHgwMSwgZm9vKTsKIAkJaWYgKHJlc3VsdCkgewotCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkJICAiYWNwaV9zYnNfc21idXNfd3JpdGVfd29yZCgpIGZhaWxlZFxuIikpOworCQkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIEFFX0VSUk9SLAorCQkJCQkiYWNwaV9zYnNfd3JpdGVfd29yZCgpIGZhaWxlZCIpKTsKIAkJCWdvdG8gZW5kOwogCQl9CiAJfQpAQCAtNDMwLDE1ICs1MDEsMTQgQEAKIAogc3RhdGljIGludCBhY3BpX3Nic21fZ2V0X2luZm8oc3RydWN0IGFjcGlfc2JzICpzYnMpCiB7Ci0Jc3RydWN0IGFjcGlfZWNfc21idXMgKnNtYnVzID0gc2JzLT5zbWJ1czsKIAlpbnQgcmVzdWx0ID0gMDsKIAlzMTYgYmF0dGVyeV9zeXN0ZW1faW5mbzsKIAotCXJlc3VsdCA9IGFjcGlfc2JzX3NtYnVzX3JlYWRfd29yZChzbWJ1cywgQUNQSV9TQlNNX1NNQlVTX0FERFIsIDB4MDQsCi0JCQkJCSAgJmJhdHRlcnlfc3lzdGVtX2luZm8sIE5VTEwpOworCXJlc3VsdCA9IGFjcGlfc2JzX3JlYWRfd29yZChzYnMsIEFDUElfU0JTTV9TTUJVU19BRERSLCAweDA0LAorCQkJCSAgICAmYmF0dGVyeV9zeXN0ZW1faW5mbyk7CiAJaWYgKHJlc3VsdCkgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCSAgImFjcGlfc2JzX3NtYnVzX3JlYWRfd29yZCgpIGZhaWxlZFxuIikpOworCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgQUVfRVJST1IsCisJCQkJImFjcGlfc2JzX3JlYWRfd29yZCgpIGZhaWxlZCIpKTsKIAkJZ290byBlbmQ7CiAJfQogCkBAIC00NTEsNTMgKzUyMSw1MCBAQAogCiBzdGF0aWMgaW50IGFjcGlfYmF0dGVyeV9nZXRfaW5mbyhzdHJ1Y3QgYWNwaV9iYXR0ZXJ5ICpiYXR0ZXJ5KQogewotCXN0cnVjdCBhY3BpX2VjX3NtYnVzICpzbWJ1cyA9IGJhdHRlcnktPnNicy0+c21idXM7CisJc3RydWN0IGFjcGlfc2JzICpzYnMgPSBiYXR0ZXJ5LT5zYnM7CiAJaW50IHJlc3VsdCA9IDA7CiAJczE2IGJhdHRlcnlfbW9kZTsKIAlzMTYgc3BlY2lmaWNhdGlvbl9pbmZvOwogCi0JcmVzdWx0ID0gYWNwaV9zYnNfc21idXNfcmVhZF93b3JkKHNtYnVzLCBBQ1BJX1NCX1NNQlVTX0FERFIsIDB4MDMsCi0JCQkJCSAgJmJhdHRlcnlfbW9kZSwKLQkJCQkJICAmYWNwaV9iYXR0ZXJ5X3NtYnVzX2Vycl9oYW5kbGVyKTsKKwlyZXN1bHQgPSBhY3BpX3Nic19yZWFkX3dvcmQoc2JzLCBBQ1BJX1NCX1NNQlVTX0FERFIsIDB4MDMsCisJCQkJICAgICZiYXR0ZXJ5X21vZGUpOwogCWlmIChyZXN1bHQpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkgICJhY3BpX3Nic19zbWJ1c19yZWFkX3dvcmQoKSBmYWlsZWRcbiIpKTsKKwkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIEFFX0VSUk9SLAorCQkJCSJhY3BpX3Nic19yZWFkX3dvcmQoKSBmYWlsZWQiKSk7CiAJCWdvdG8gZW5kOwogCX0KIAliYXR0ZXJ5LT5pbmZvLmNhcGFjaXR5X21vZGUgPSAoYmF0dGVyeV9tb2RlICYgMHg4MDAwKSA+PiAxNTsKIAotCXJlc3VsdCA9IGFjcGlfc2JzX3NtYnVzX3JlYWRfd29yZChzbWJ1cywgQUNQSV9TQl9TTUJVU19BRERSLCAweDEwLAotCQkJCQkgICZiYXR0ZXJ5LT5pbmZvLmZ1bGxfY2hhcmdlX2NhcGFjaXR5LAotCQkJCQkgICZhY3BpX2JhdHRlcnlfc21idXNfZXJyX2hhbmRsZXIpOworCXJlc3VsdCA9IGFjcGlfc2JzX3JlYWRfd29yZChzYnMsIEFDUElfU0JfU01CVVNfQUREUiwgMHgxMCwKKwkJCQkgICAgJmJhdHRlcnktPmluZm8uZnVsbF9jaGFyZ2VfY2FwYWNpdHkpOwogCWlmIChyZXN1bHQpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkgICJhY3BpX3Nic19zbWJ1c19yZWFkX3dvcmQoKSBmYWlsZWRcbiIpKTsKKwkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIEFFX0VSUk9SLAorCQkJCSJhY3BpX3Nic19yZWFkX3dvcmQoKSBmYWlsZWQiKSk7CiAJCWdvdG8gZW5kOwogCX0KIAotCXJlc3VsdCA9IGFjcGlfc2JzX3NtYnVzX3JlYWRfd29yZChzbWJ1cywgQUNQSV9TQl9TTUJVU19BRERSLCAweDE4LAotCQkJCQkgICZiYXR0ZXJ5LT5pbmZvLmRlc2lnbl9jYXBhY2l0eSwKLQkJCQkJICAmYWNwaV9iYXR0ZXJ5X3NtYnVzX2Vycl9oYW5kbGVyKTsKKwlyZXN1bHQgPSBhY3BpX3Nic19yZWFkX3dvcmQoc2JzLCBBQ1BJX1NCX1NNQlVTX0FERFIsIDB4MTgsCisJCQkJICAgICZiYXR0ZXJ5LT5pbmZvLmRlc2lnbl9jYXBhY2l0eSk7CiAKIAlpZiAocmVzdWx0KSB7CisJCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBBRV9FUlJPUiwKKwkJCQkiYWNwaV9zYnNfcmVhZF93b3JkKCkgZmFpbGVkIikpOwogCQlnb3RvIGVuZDsKIAl9CiAKLQlyZXN1bHQgPSBhY3BpX3Nic19zbWJ1c19yZWFkX3dvcmQoc21idXMsIEFDUElfU0JfU01CVVNfQUREUiwgMHgxOSwKLQkJCQkJICAmYmF0dGVyeS0+aW5mby5kZXNpZ25fdm9sdGFnZSwKLQkJCQkJICAmYWNwaV9iYXR0ZXJ5X3NtYnVzX2Vycl9oYW5kbGVyKTsKKwlyZXN1bHQgPSBhY3BpX3Nic19yZWFkX3dvcmQoc2JzLCBBQ1BJX1NCX1NNQlVTX0FERFIsIDB4MTksCisJCQkJICAgICZiYXR0ZXJ5LT5pbmZvLmRlc2lnbl92b2x0YWdlKTsKIAlpZiAocmVzdWx0KSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJICAiYWNwaV9zYnNfc21idXNfcmVhZF93b3JkKCkgZmFpbGVkXG4iKSk7CisJCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBBRV9FUlJPUiwKKwkJCQkiYWNwaV9zYnNfcmVhZF93b3JkKCkgZmFpbGVkIikpOwogCQlnb3RvIGVuZDsKIAl9CiAKLQlyZXN1bHQgPSBhY3BpX3Nic19zbWJ1c19yZWFkX3dvcmQoc21idXMsIEFDUElfU0JfU01CVVNfQUREUiwgMHgxYSwKLQkJCQkJICAmc3BlY2lmaWNhdGlvbl9pbmZvLAotCQkJCQkgICZhY3BpX2JhdHRlcnlfc21idXNfZXJyX2hhbmRsZXIpOworCXJlc3VsdCA9IGFjcGlfc2JzX3JlYWRfd29yZChzYnMsIEFDUElfU0JfU01CVVNfQUREUiwgMHgxYSwKKwkJCQkgICAgJnNwZWNpZmljYXRpb25faW5mbyk7CiAJaWYgKHJlc3VsdCkgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCSAgImFjcGlfc2JzX3NtYnVzX3JlYWRfd29yZCgpIGZhaWxlZFxuIikpOworCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgQUVfRVJST1IsCisJCQkJImFjcGlfc2JzX3JlYWRfd29yZCgpIGZhaWxlZCIpKTsKIAkJZ290byBlbmQ7CiAJfQogCkBAIC01MjksMzcgKzU5NiwzNSBAQAogCQliYXR0ZXJ5LT5pbmZvLmlwc2NhbGUgPSAxOwogCX0KIAotCXJlc3VsdCA9IGFjcGlfc2JzX3NtYnVzX3JlYWRfd29yZChzbWJ1cywgQUNQSV9TQl9TTUJVU19BRERSLCAweDFjLAotCQkJCQkgICZiYXR0ZXJ5LT5pbmZvLnNlcmlhbF9udW1iZXIsCi0JCQkJCSAgJmFjcGlfYmF0dGVyeV9zbWJ1c19lcnJfaGFuZGxlcik7CisJcmVzdWx0ID0gYWNwaV9zYnNfcmVhZF93b3JkKHNicywgQUNQSV9TQl9TTUJVU19BRERSLCAweDFjLAorCQkJCSAgICAmYmF0dGVyeS0+aW5mby5zZXJpYWxfbnVtYmVyKTsKIAlpZiAocmVzdWx0KSB7CisJCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBBRV9FUlJPUiwKKwkJCQkiYWNwaV9zYnNfcmVhZF93b3JkKCkgZmFpbGVkIikpOwogCQlnb3RvIGVuZDsKIAl9CiAKLQlyZXN1bHQgPSBhY3BpX3Nic19zbWJ1c19yZWFkX3N0cihzbWJ1cywgQUNQSV9TQl9TTUJVU19BRERSLCAweDIwLAotCQkJCQkgYmF0dGVyeS0+aW5mby5tYW51ZmFjdHVyZXJfbmFtZSwKLQkJCQkJICZhY3BpX2JhdHRlcnlfc21idXNfZXJyX2hhbmRsZXIpOworCXJlc3VsdCA9IGFjcGlfc2JzX3JlYWRfc3RyKHNicywgQUNQSV9TQl9TTUJVU19BRERSLCAweDIwLAorCQkJCSAgIGJhdHRlcnktPmluZm8ubWFudWZhY3R1cmVyX25hbWUpOwogCWlmIChyZXN1bHQpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkgICJhY3BpX3Nic19zbWJ1c19yZWFkX3N0cigpIGZhaWxlZFxuIikpOworCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgQUVfRVJST1IsCisJCQkJImFjcGlfc2JzX3JlYWRfc3RyKCkgZmFpbGVkIikpOwogCQlnb3RvIGVuZDsKIAl9CiAKLQlyZXN1bHQgPSBhY3BpX3Nic19zbWJ1c19yZWFkX3N0cihzbWJ1cywgQUNQSV9TQl9TTUJVU19BRERSLCAweDIxLAotCQkJCQkgYmF0dGVyeS0+aW5mby5kZXZpY2VfbmFtZSwKLQkJCQkJICZhY3BpX2JhdHRlcnlfc21idXNfZXJyX2hhbmRsZXIpOworCXJlc3VsdCA9IGFjcGlfc2JzX3JlYWRfc3RyKHNicywgQUNQSV9TQl9TTUJVU19BRERSLCAweDIxLAorCQkJCSAgIGJhdHRlcnktPmluZm8uZGV2aWNlX25hbWUpOwogCWlmIChyZXN1bHQpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkgICJhY3BpX3Nic19zbWJ1c19yZWFkX3N0cigpIGZhaWxlZFxuIikpOworCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgQUVfRVJST1IsCisJCQkJImFjcGlfc2JzX3JlYWRfc3RyKCkgZmFpbGVkIikpOwogCQlnb3RvIGVuZDsKIAl9CiAKLQlyZXN1bHQgPSBhY3BpX3Nic19zbWJ1c19yZWFkX3N0cihzbWJ1cywgQUNQSV9TQl9TTUJVU19BRERSLCAweDIyLAotCQkJCQkgYmF0dGVyeS0+aW5mby5kZXZpY2VfY2hlbWlzdHJ5LAotCQkJCQkgJmFjcGlfYmF0dGVyeV9zbWJ1c19lcnJfaGFuZGxlcik7CisJcmVzdWx0ID0gYWNwaV9zYnNfcmVhZF9zdHIoc2JzLCBBQ1BJX1NCX1NNQlVTX0FERFIsIDB4MjIsCisJCQkJICAgYmF0dGVyeS0+aW5mby5kZXZpY2VfY2hlbWlzdHJ5KTsKIAlpZiAocmVzdWx0KSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJICAiYWNwaV9zYnNfc21idXNfcmVhZF9zdHIoKSBmYWlsZWRcbiIpKTsKKwkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIEFFX0VSUk9SLAorCQkJCSJhY3BpX3Nic19yZWFkX3N0cigpIGZhaWxlZCIpKTsKIAkJZ290byBlbmQ7CiAJfQogCkBAIC01NjcsMTAzICs2MzIsNjAgQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogCi1zdGF0aWMgdm9pZCBhY3BpX3VwZGF0ZV9kZWxheShzdHJ1Y3QgYWNwaV9zYnMgKnNicykKLXsKLQlpZiAoc2JzLT56b21iaWUpIHsKLQkJcmV0dXJuOwotCX0KLQlpZiAoc2JzLT51cGRhdGVfdGltZTIgPiAwKSB7Ci0JCW1zbGVlcChzYnMtPnVwZGF0ZV90aW1lMiAqIDEwMDApOwotCX0KLX0KLQogc3RhdGljIGludCBhY3BpX2JhdHRlcnlfZ2V0X3N0YXRlKHN0cnVjdCBhY3BpX2JhdHRlcnkgKmJhdHRlcnkpCiB7Ci0Jc3RydWN0IGFjcGlfZWNfc21idXMgKnNtYnVzID0gYmF0dGVyeS0+c2JzLT5zbWJ1czsKKwlzdHJ1Y3QgYWNwaV9zYnMgKnNicyA9IGJhdHRlcnktPnNiczsKIAlpbnQgcmVzdWx0ID0gMDsKIAotCWFjcGlfdXBkYXRlX2RlbGF5KGJhdHRlcnktPnNicyk7Ci0JcmVzdWx0ID0gYWNwaV9zYnNfc21idXNfcmVhZF93b3JkKHNtYnVzLCBBQ1BJX1NCX1NNQlVTX0FERFIsIDB4MDksCi0JCQkJCSAgJmJhdHRlcnktPnN0YXRlLnZvbHRhZ2UsCi0JCQkJCSAgJmFjcGlfYmF0dGVyeV9zbWJ1c19lcnJfaGFuZGxlcik7CisJcmVzdWx0ID0gYWNwaV9zYnNfcmVhZF93b3JkKHNicywgQUNQSV9TQl9TTUJVU19BRERSLCAweDA5LAorCQkJCSAgICAmYmF0dGVyeS0+c3RhdGUudm9sdGFnZSk7CiAJaWYgKHJlc3VsdCkgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCSAgImFjcGlfc2JzX3NtYnVzX3JlYWRfd29yZCgpIGZhaWxlZFxuIikpOworCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgQUVfRVJST1IsCisJCQkJImFjcGlfc2JzX3JlYWRfd29yZCgpIGZhaWxlZCIpKTsKIAkJZ290byBlbmQ7CiAJfQogCi0JYWNwaV91cGRhdGVfZGVsYXkoYmF0dGVyeS0+c2JzKTsKLQlyZXN1bHQgPSBhY3BpX3Nic19zbWJ1c19yZWFkX3dvcmQoc21idXMsIEFDUElfU0JfU01CVVNfQUREUiwgMHgwYSwKLQkJCQkJICAmYmF0dGVyeS0+c3RhdGUuYW1wZXJhZ2UsCi0JCQkJCSAgJmFjcGlfYmF0dGVyeV9zbWJ1c19lcnJfaGFuZGxlcik7CisJcmVzdWx0ID0gYWNwaV9zYnNfcmVhZF93b3JkKHNicywgQUNQSV9TQl9TTUJVU19BRERSLCAweDBhLAorCQkJCSAgICAmYmF0dGVyeS0+c3RhdGUuYW1wZXJhZ2UpOwogCWlmIChyZXN1bHQpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkgICJhY3BpX3Nic19zbWJ1c19yZWFkX3dvcmQoKSBmYWlsZWRcbiIpKTsKKwkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIEFFX0VSUk9SLAorCQkJCSJhY3BpX3Nic19yZWFkX3dvcmQoKSBmYWlsZWQiKSk7CiAJCWdvdG8gZW5kOwogCX0KIAotCWFjcGlfdXBkYXRlX2RlbGF5KGJhdHRlcnktPnNicyk7Ci0JcmVzdWx0ID0gYWNwaV9zYnNfc21idXNfcmVhZF93b3JkKHNtYnVzLCBBQ1BJX1NCX1NNQlVTX0FERFIsIDB4MGYsCi0JCQkJCSAgJmJhdHRlcnktPnN0YXRlLnJlbWFpbmluZ19jYXBhY2l0eSwKLQkJCQkJICAmYWNwaV9iYXR0ZXJ5X3NtYnVzX2Vycl9oYW5kbGVyKTsKKwlyZXN1bHQgPSBhY3BpX3Nic19yZWFkX3dvcmQoc2JzLCBBQ1BJX1NCX1NNQlVTX0FERFIsIDB4MGYsCisJCQkJICAgICZiYXR0ZXJ5LT5zdGF0ZS5yZW1haW5pbmdfY2FwYWNpdHkpOwogCWlmIChyZXN1bHQpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkgICJhY3BpX3Nic19zbWJ1c19yZWFkX3dvcmQoKSBmYWlsZWRcbiIpKTsKKwkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIEFFX0VSUk9SLAorCQkJCSJhY3BpX3Nic19yZWFkX3dvcmQoKSBmYWlsZWQiKSk7CiAJCWdvdG8gZW5kOwogCX0KIAotCWFjcGlfdXBkYXRlX2RlbGF5KGJhdHRlcnktPnNicyk7Ci0JcmVzdWx0ID0gYWNwaV9zYnNfc21idXNfcmVhZF93b3JkKHNtYnVzLCBBQ1BJX1NCX1NNQlVTX0FERFIsIDB4MTIsCi0JCQkJCSAgJmJhdHRlcnktPnN0YXRlLmF2ZXJhZ2VfdGltZV90b19lbXB0eSwKLQkJCQkJICAmYWNwaV9iYXR0ZXJ5X3NtYnVzX2Vycl9oYW5kbGVyKTsKKwlyZXN1bHQgPSBhY3BpX3Nic19yZWFkX3dvcmQoc2JzLCBBQ1BJX1NCX1NNQlVTX0FERFIsIDB4MTYsCisJCQkJICAgICZiYXR0ZXJ5LT5zdGF0ZS5iYXR0ZXJ5X3N0YXRlKTsKIAlpZiAocmVzdWx0KSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJICAiYWNwaV9zYnNfc21idXNfcmVhZF93b3JkKCkgZmFpbGVkXG4iKSk7CisJCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBBRV9FUlJPUiwKKwkJCQkiYWNwaV9zYnNfcmVhZF93b3JkKCkgZmFpbGVkIikpOwogCQlnb3RvIGVuZDsKIAl9CiAKLQlhY3BpX3VwZGF0ZV9kZWxheShiYXR0ZXJ5LT5zYnMpOwotCXJlc3VsdCA9IGFjcGlfc2JzX3NtYnVzX3JlYWRfd29yZChzbWJ1cywgQUNQSV9TQl9TTUJVU19BRERSLCAweDEzLAotCQkJCQkgICZiYXR0ZXJ5LT5zdGF0ZS5hdmVyYWdlX3RpbWVfdG9fZnVsbCwKLQkJCQkJICAmYWNwaV9iYXR0ZXJ5X3NtYnVzX2Vycl9oYW5kbGVyKTsKLQlpZiAocmVzdWx0KSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJICAiYWNwaV9zYnNfc21idXNfcmVhZF93b3JkKCkgZmFpbGVkXG4iKSk7Ci0JCWdvdG8gZW5kOwotCX0KLQotCWFjcGlfdXBkYXRlX2RlbGF5KGJhdHRlcnktPnNicyk7Ci0JcmVzdWx0ID0gYWNwaV9zYnNfc21idXNfcmVhZF93b3JkKHNtYnVzLCBBQ1BJX1NCX1NNQlVTX0FERFIsIDB4MTYsCi0JCQkJCSAgJmJhdHRlcnktPnN0YXRlLmJhdHRlcnlfc3RhdHVzLAotCQkJCQkgICZhY3BpX2JhdHRlcnlfc21idXNfZXJyX2hhbmRsZXIpOwotCWlmIChyZXN1bHQpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkgICJhY3BpX3Nic19zbWJ1c19yZWFkX3dvcmQoKSBmYWlsZWRcbiIpKTsKLQkJZ290byBlbmQ7Ci0JfQotCi0JYWNwaV91cGRhdGVfZGVsYXkoYmF0dGVyeS0+c2JzKTsKLQogICAgICAgZW5kOgogCXJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBpbnQgYWNwaV9iYXR0ZXJ5X2dldF9hbGFybShzdHJ1Y3QgYWNwaV9iYXR0ZXJ5ICpiYXR0ZXJ5KQogewotCXN0cnVjdCBhY3BpX2VjX3NtYnVzICpzbWJ1cyA9IGJhdHRlcnktPnNicy0+c21idXM7CisJc3RydWN0IGFjcGlfc2JzICpzYnMgPSBiYXR0ZXJ5LT5zYnM7CiAJaW50IHJlc3VsdCA9IDA7CiAKLQlyZXN1bHQgPSBhY3BpX3Nic19zbWJ1c19yZWFkX3dvcmQoc21idXMsIEFDUElfU0JfU01CVVNfQUREUiwgMHgwMSwKLQkJCQkJICAmYmF0dGVyeS0+YWxhcm0ucmVtYWluaW5nX2NhcGFjaXR5LAotCQkJCQkgICZhY3BpX2JhdHRlcnlfc21idXNfZXJyX2hhbmRsZXIpOworCXJlc3VsdCA9IGFjcGlfc2JzX3JlYWRfd29yZChzYnMsIEFDUElfU0JfU01CVVNfQUREUiwgMHgwMSwKKwkJCQkgICAgJmJhdHRlcnktPmFsYXJtLnJlbWFpbmluZ19jYXBhY2l0eSk7CiAJaWYgKHJlc3VsdCkgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCSAgImFjcGlfc2JzX3NtYnVzX3JlYWRfd29yZCgpIGZhaWxlZFxuIikpOworCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgQUVfRVJST1IsCisJCQkJImFjcGlfc2JzX3JlYWRfd29yZCgpIGZhaWxlZCIpKTsKIAkJZ290byBlbmQ7CiAJfQogCi0JYWNwaV91cGRhdGVfZGVsYXkoYmF0dGVyeS0+c2JzKTsKLQogICAgICAgZW5kOgogCiAJcmV0dXJuIHJlc3VsdDsKQEAgLTY3MiwxNSArNjk0LDE1IEBACiBzdGF0aWMgaW50IGFjcGlfYmF0dGVyeV9zZXRfYWxhcm0oc3RydWN0IGFjcGlfYmF0dGVyeSAqYmF0dGVyeSwKIAkJCQkgIHVuc2lnbmVkIGxvbmcgYWxhcm0pCiB7Ci0Jc3RydWN0IGFjcGlfZWNfc21idXMgKnNtYnVzID0gYmF0dGVyeS0+c2JzLT5zbWJ1czsKKwlzdHJ1Y3QgYWNwaV9zYnMgKnNicyA9IGJhdHRlcnktPnNiczsKIAlpbnQgcmVzdWx0ID0gMDsKIAlzMTYgYmF0dGVyeV9tb2RlOwogCWludCBmb287CiAKIAlyZXN1bHQgPSBhY3BpX2JhdHRlcnlfc2VsZWN0KGJhdHRlcnkpOwogCWlmIChyZXN1bHQpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkgICJhY3BpX2JhdHRlcnlfc2VsZWN0KCkgZmFpbGVkXG4iKSk7CisJCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBBRV9FUlJPUiwKKwkJCQkiYWNwaV9iYXR0ZXJ5X3NlbGVjdCgpIGZhaWxlZCIpKTsKIAkJZ290byBlbmQ7CiAJfQogCkBAIC02ODgsMzMgKzcxMCwyOSBAQAogCiAJaWYgKGFsYXJtID4gMCkgewogCQlyZXN1bHQgPQotCQkgICAgYWNwaV9zYnNfc21idXNfcmVhZF93b3JkKHNtYnVzLCBBQ1BJX1NCX1NNQlVTX0FERFIsIDB4MDMsCi0JCQkJCSAgICAgJmJhdHRlcnlfbW9kZSwKLQkJCQkJICAgICAmYWNwaV9iYXR0ZXJ5X3NtYnVzX2Vycl9oYW5kbGVyKTsKKwkJICAgIGFjcGlfc2JzX3JlYWRfd29yZChzYnMsIEFDUElfU0JfU01CVVNfQUREUiwgMHgwMywKKwkJCQkgICAgICAgJmJhdHRlcnlfbW9kZSk7CiAJCWlmIChyZXN1bHQpIHsKLQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJCSAgImFjcGlfc2JzX3NtYnVzX3JlYWRfd29yZCgpIGZhaWxlZFxuIikpOworCQkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIEFFX0VSUk9SLAorCQkJCQkiYWNwaV9zYnNfcmVhZF93b3JkKCkgZmFpbGVkIikpOwogCQkJZ290byBlbmQ7CiAJCX0KIAogCQlyZXN1bHQgPQotCQkgICAgYWNwaV9zYnNfc21idXNfd3JpdGVfd29yZChzbWJ1cywgQUNQSV9TQl9TTUJVU19BRERSLCAweDAxLAotCQkJCQkgICAgICBiYXR0ZXJ5X21vZGUgJiAweGJmZmYsCi0JCQkJCSAgICAgICZhY3BpX2JhdHRlcnlfc21idXNfZXJyX2hhbmRsZXIpOworCQkgICAgYWNwaV9zYnNfd3JpdGVfd29yZChzYnMsIEFDUElfU0JfU01CVVNfQUREUiwgMHgwMSwKKwkJCQkJYmF0dGVyeV9tb2RlICYgMHhiZmZmKTsKIAkJaWYgKHJlc3VsdCkgewotCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkJICAiYWNwaV9zYnNfc21idXNfd3JpdGVfd29yZCgpIGZhaWxlZFxuIikpOworCQkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIEFFX0VSUk9SLAorCQkJCQkiYWNwaV9zYnNfd3JpdGVfd29yZCgpIGZhaWxlZCIpKTsKIAkJCWdvdG8gZW5kOwogCQl9CiAJfQogCiAJZm9vID0gYWxhcm0gLyAoYmF0dGVyeS0+aW5mby5jYXBhY2l0eV9tb2RlID8gMTAgOiAxKTsKLQlyZXN1bHQgPSBhY3BpX3Nic19zbWJ1c193cml0ZV93b3JkKHNtYnVzLCBBQ1BJX1NCX1NNQlVTX0FERFIsIDB4MDEsCi0JCQkJCSAgIGZvbywKLQkJCQkJICAgJmFjcGlfYmF0dGVyeV9zbWJ1c19lcnJfaGFuZGxlcik7CisJcmVzdWx0ID0gYWNwaV9zYnNfd3JpdGVfd29yZChzYnMsIEFDUElfU0JfU01CVVNfQUREUiwgMHgwMSwgZm9vKTsKIAlpZiAocmVzdWx0KSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJICAiYWNwaV9zYnNfc21idXNfd3JpdGVfd29yZCgpIGZhaWxlZFxuIikpOworCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgQUVfRVJST1IsCisJCQkJImFjcGlfc2JzX3dyaXRlX3dvcmQoKSBmYWlsZWQiKSk7CiAJCWdvdG8gZW5kOwogCX0KIApAQCAtNzI1LDYgKzc0Myw3IEBACiAKIHN0YXRpYyBpbnQgYWNwaV9iYXR0ZXJ5X3NldF9tb2RlKHN0cnVjdCBhY3BpX2JhdHRlcnkgKmJhdHRlcnkpCiB7CisJc3RydWN0IGFjcGlfc2JzICpzYnMgPSBiYXR0ZXJ5LT5zYnM7CiAJaW50IHJlc3VsdCA9IDA7CiAJczE2IGJhdHRlcnlfbW9kZTsKIApAQCAtNzMyLDEyICs3NTEsMTEgQEAKIAkJZ290byBlbmQ7CiAJfQogCi0JcmVzdWx0ID0gYWNwaV9zYnNfc21idXNfcmVhZF93b3JkKGJhdHRlcnktPnNicy0+c21idXMsCi0JCQkJCSAgQUNQSV9TQl9TTUJVU19BRERSLCAweDAzLAotCQkJCQkgICZiYXR0ZXJ5X21vZGUsIE5VTEwpOworCXJlc3VsdCA9IGFjcGlfc2JzX3JlYWRfd29yZChzYnMsCisJCQkJICAgIEFDUElfU0JfU01CVVNfQUREUiwgMHgwMywgJmJhdHRlcnlfbW9kZSk7CiAJaWYgKHJlc3VsdCkgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCSAgImFjcGlfc2JzX3NtYnVzX3JlYWRfd29yZCgpIGZhaWxlZFxuIikpOworCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgQUVfRVJST1IsCisJCQkJImFjcGlfc2JzX3JlYWRfd29yZCgpIGZhaWxlZCIpKTsKIAkJZ290byBlbmQ7CiAJfQogCkBAIC03NDYsMjEgKzc2NCwxOSBAQAogCX0gZWxzZSB7CiAJCWJhdHRlcnlfbW9kZSB8PSAweDgwMDA7CiAJfQotCXJlc3VsdCA9IGFjcGlfc2JzX3NtYnVzX3dyaXRlX3dvcmQoYmF0dGVyeS0+c2JzLT5zbWJ1cywKLQkJCQkJICAgQUNQSV9TQl9TTUJVU19BRERSLCAweDAzLAotCQkJCQkgICBiYXR0ZXJ5X21vZGUsIE5VTEwpOworCXJlc3VsdCA9IGFjcGlfc2JzX3dyaXRlX3dvcmQoc2JzLAorCQkJCSAgICAgQUNQSV9TQl9TTUJVU19BRERSLCAweDAzLCBiYXR0ZXJ5X21vZGUpOwogCWlmIChyZXN1bHQpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkgICJhY3BpX3Nic19zbWJ1c193cml0ZV93b3JkKCkgZmFpbGVkXG4iKSk7CisJCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBBRV9FUlJPUiwKKwkJCQkiYWNwaV9zYnNfd3JpdGVfd29yZCgpIGZhaWxlZCIpKTsKIAkJZ290byBlbmQ7CiAJfQogCi0JcmVzdWx0ID0gYWNwaV9zYnNfc21idXNfcmVhZF93b3JkKGJhdHRlcnktPnNicy0+c21idXMsCi0JCQkJCSAgQUNQSV9TQl9TTUJVU19BRERSLCAweDAzLAotCQkJCQkgICZiYXR0ZXJ5X21vZGUsIE5VTEwpOworCXJlc3VsdCA9IGFjcGlfc2JzX3JlYWRfd29yZChzYnMsCisJCQkJICAgIEFDUElfU0JfU01CVVNfQUREUiwgMHgwMywgJmJhdHRlcnlfbW9kZSk7CiAJaWYgKHJlc3VsdCkgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCSAgImFjcGlfc2JzX3NtYnVzX3JlYWRfd29yZCgpIGZhaWxlZFxuIikpOworCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgQUVfRVJST1IsCisJCQkJImFjcGlfc2JzX3JlYWRfd29yZCgpIGZhaWxlZCIpKTsKIAkJZ290byBlbmQ7CiAJfQogCkBAIC03NzQsMzYgKzc5MCwzNiBAQAogCiAJcmVzdWx0ID0gYWNwaV9iYXR0ZXJ5X3NlbGVjdChiYXR0ZXJ5KTsKIAlpZiAocmVzdWx0KSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJICAiYWNwaV9iYXR0ZXJ5X2luaXQoKSBmYWlsZWRcbiIpKTsKKwkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIEFFX0VSUk9SLAorCQkJCSJhY3BpX2JhdHRlcnlfc2VsZWN0KCkgZmFpbGVkIikpOwogCQlnb3RvIGVuZDsKIAl9CiAKIAlyZXN1bHQgPSBhY3BpX2JhdHRlcnlfc2V0X21vZGUoYmF0dGVyeSk7CiAJaWYgKHJlc3VsdCkgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCSAgImFjcGlfYmF0dGVyeV9zZXRfbW9kZSgpIGZhaWxlZFxuIikpOworCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgQUVfRVJST1IsCisJCQkJImFjcGlfYmF0dGVyeV9zZXRfbW9kZSgpIGZhaWxlZCIpKTsKIAkJZ290byBlbmQ7CiAJfQogCiAJcmVzdWx0ID0gYWNwaV9iYXR0ZXJ5X2dldF9pbmZvKGJhdHRlcnkpOwogCWlmIChyZXN1bHQpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkgICJhY3BpX2JhdHRlcnlfZ2V0X2luZm8oKSBmYWlsZWRcbiIpKTsKKwkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIEFFX0VSUk9SLAorCQkJCSJhY3BpX2JhdHRlcnlfZ2V0X2luZm8oKSBmYWlsZWQiKSk7CiAJCWdvdG8gZW5kOwogCX0KIAogCXJlc3VsdCA9IGFjcGlfYmF0dGVyeV9nZXRfc3RhdGUoYmF0dGVyeSk7CiAJaWYgKHJlc3VsdCkgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCSAgImFjcGlfYmF0dGVyeV9nZXRfc3RhdGUoKSBmYWlsZWRcbiIpKTsKKwkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIEFFX0VSUk9SLAorCQkJCSJhY3BpX2JhdHRlcnlfZ2V0X3N0YXRlKCkgZmFpbGVkIikpOwogCQlnb3RvIGVuZDsKIAl9CiAKIAlyZXN1bHQgPSBhY3BpX2JhdHRlcnlfZ2V0X2FsYXJtKGJhdHRlcnkpOwogCWlmIChyZXN1bHQpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkgICJhY3BpX2JhdHRlcnlfZ2V0X2FsYXJtKCkgZmFpbGVkXG4iKSk7CisJCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBBRV9FUlJPUiwKKwkJCQkiYWNwaV9iYXR0ZXJ5X2dldF9hbGFybSgpIGZhaWxlZCIpKTsKIAkJZ290byBlbmQ7CiAJfQogCkBAIC04MTMsMjAgKzgyOSwxOSBAQAogCiBzdGF0aWMgaW50IGFjcGlfYWNfZ2V0X3ByZXNlbnQoc3RydWN0IGFjcGlfc2JzICpzYnMpCiB7Ci0Jc3RydWN0IGFjcGlfZWNfc21idXMgKnNtYnVzID0gc2JzLT5zbWJ1czsKIAlpbnQgcmVzdWx0ID0gMDsKIAlzMTYgY2hhcmdlcl9zdGF0dXM7CiAKLQlyZXN1bHQgPSBhY3BpX3Nic19zbWJ1c19yZWFkX3dvcmQoc21idXMsIEFDUElfU0JDX1NNQlVTX0FERFIsIDB4MTMsCi0JCQkJCSAgJmNoYXJnZXJfc3RhdHVzLCBOVUxMKTsKKwlyZXN1bHQgPSBhY3BpX3Nic19yZWFkX3dvcmQoc2JzLCBBQ1BJX1NCQ19TTUJVU19BRERSLCAweDEzLAorCQkJCSAgICAmY2hhcmdlcl9zdGF0dXMpOwogCiAJaWYgKHJlc3VsdCkgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCSAgImFjcGlfc2JzX3NtYnVzX3JlYWRfd29yZCgpIGZhaWxlZFxuIikpOworCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgQUVfRVJST1IsCisJCQkJImFjcGlfc2JzX3JlYWRfd29yZCgpIGZhaWxlZCIpKTsKIAkJZ290byBlbmQ7CiAJfQogCi0Jc2JzLT5hY19wcmVzZW50ID0gKGNoYXJnZXJfc3RhdHVzICYgMHg4MDAwKSA+PiAxNTsKKwlzYnMtPmFjLmFjX3ByZXNlbnQgPSAoY2hhcmdlcl9zdGF0dXMgJiAweDgwMDApID4+IDE1OwogCiAgICAgICBlbmQ6CiAKQEAgLTg1Miw4ICs4NjcsOCBAQAogCWlmICghKmRpcikgewogCQkqZGlyID0gcHJvY19ta2RpcihkaXJfbmFtZSwgcGFyZW50X2Rpcik7CiAJCWlmICghKmRpcikgewotCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkJICAicHJvY19ta2RpcigpIGZhaWxlZFxuIikpOworCQkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIEFFX0VSUk9SLAorCQkJCQkicHJvY19ta2RpcigpIGZhaWxlZCIpKTsKIAkJCXJldHVybiAtRU5PREVWOwogCQl9CiAJCSgqZGlyKS0+b3duZXIgPSBUSElTX01PRFVMRTsKQEAgLTg2Myw4ICs4NzgsOCBAQAogCWlmIChpbmZvX2ZvcHMpIHsKIAkJZW50cnkgPSBjcmVhdGVfcHJvY19lbnRyeShBQ1BJX1NCU19GSUxFX0lORk8sIFNfSVJVR08sICpkaXIpOwogCQlpZiAoIWVudHJ5KSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkgICJjcmVhdGVfcHJvY19lbnRyeSgpIGZhaWxlZFxuIikpOworCQkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIEFFX0VSUk9SLAorCQkJCQkiY3JlYXRlX3Byb2NfZW50cnkoKSBmYWlsZWQiKSk7CiAJCX0gZWxzZSB7CiAJCQllbnRyeS0+cHJvY19mb3BzID0gaW5mb19mb3BzOwogCQkJZW50cnktPmRhdGEgPSBkYXRhOwpAQCAtODc2LDggKzg5MSw4IEBACiAJaWYgKHN0YXRlX2ZvcHMpIHsKIAkJZW50cnkgPSBjcmVhdGVfcHJvY19lbnRyeShBQ1BJX1NCU19GSUxFX1NUQVRFLCBTX0lSVUdPLCAqZGlyKTsKIAkJaWYgKCFlbnRyeSkgewotCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkJICAiY3JlYXRlX3Byb2NfZW50cnkoKSBmYWlsZWRcbiIpKTsKKwkJCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBBRV9FUlJPUiwKKwkJCQkJImNyZWF0ZV9wcm9jX2VudHJ5KCkgZmFpbGVkIikpOwogCQl9IGVsc2UgewogCQkJZW50cnktPnByb2NfZm9wcyA9IHN0YXRlX2ZvcHM7CiAJCQllbnRyeS0+ZGF0YSA9IGRhdGE7CkBAIC04ODksOCArOTA0LDggQEAKIAlpZiAoYWxhcm1fZm9wcykgewogCQllbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KEFDUElfU0JTX0ZJTEVfQUxBUk0sIFNfSVJVR08sICpkaXIpOwogCQlpZiAoIWVudHJ5KSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkgICJjcmVhdGVfcHJvY19lbnRyeSgpIGZhaWxlZFxuIikpOworCQkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIEFFX0VSUk9SLAorCQkJCQkiY3JlYXRlX3Byb2NfZW50cnkoKSBmYWlsZWQiKSk7CiAJCX0gZWxzZSB7CiAJCQllbnRyeS0+cHJvY19mb3BzID0gYWxhcm1fZm9wczsKIAkJCWVudHJ5LT5kYXRhID0gZGF0YTsKQEAgLTkyMywyNCArOTM4LDI3IEBACiBzdGF0aWMgaW50IGFjcGlfYmF0dGVyeV9yZWFkX2luZm8oc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCkKIHsKIAlzdHJ1Y3QgYWNwaV9iYXR0ZXJ5ICpiYXR0ZXJ5ID0gc2VxLT5wcml2YXRlOworCXN0cnVjdCBhY3BpX3NicyAqc2JzID0gYmF0dGVyeS0+c2JzOwogCWludCBjc2NhbGU7CiAJaW50IHJlc3VsdCA9IDA7CiAKLQlpZiAoYmF0dGVyeS0+c2JzLT56b21iaWUpIHsKKwlpZiAoc2JzX211dGV4X2xvY2soc2JzKSkgewogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQlkb3duKCZzYnNfc2VtKTsKKwlyZXN1bHQgPSBhY3BpX2NoZWNrX3VwZGF0ZV9wcm9jKHNicyk7CisJaWYgKHJlc3VsdCkKKwkJZ290byBlbmQ7CiAKLQlpZiAodXBkYXRlX21vZGUgPT0gUkVRVUVTVF9VUERBVEVfTU9ERSkgewotCQlyZXN1bHQgPSBhY3BpX3Nic191cGRhdGVfcnVuKGJhdHRlcnktPnNicywgREFUQV9UWVBFX0lORk8pOworCWlmICh1cGRhdGVfdGltZSA9PSAwKSB7CisJCXJlc3VsdCA9IGFjcGlfc2JzX3VwZGF0ZV9ydW4oc2JzLCBiYXR0ZXJ5LT5pZCwgREFUQV9UWVBFX0lORk8pOwogCQlpZiAocmVzdWx0KSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkgICJhY3BpX3Nic191cGRhdGVfcnVuKCkgZmFpbGVkXG4iKSk7CisJCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgQUVfRVJST1IsCisJCQkJCSJhY3BpX3Nic191cGRhdGVfcnVuKCkgZmFpbGVkIikpOwogCQl9CiAJfQogCi0JaWYgKGFjcGlfYmF0dGVyeV9pc19wcmVzZW50KGJhdHRlcnkpKSB7CisJaWYgKGJhdHRlcnktPmJhdHRlcnlfcHJlc2VudCkgewogCQlzZXFfcHJpbnRmKHNlcSwgInByZXNlbnQ6ICAgICAgICAgICAgICAgICB5ZXNcbiIpOwogCX0gZWxzZSB7CiAJCXNlcV9wcmludGYoc2VxLCAicHJlc2VudDogICAgICAgICAgICAgICAgIG5vXG4iKTsKQEAgLTk1MiwxMyArOTcwLDEzIEBACiAJfSBlbHNlIHsKIAkJY3NjYWxlID0gYmF0dGVyeS0+aW5mby5pcHNjYWxlOwogCX0KLQlzZXFfcHJpbnRmKHNlcSwgImRlc2lnbiBjYXBhY2l0eTogICAgICAgICAlaSVzIiwKKwlzZXFfcHJpbnRmKHNlcSwgImRlc2lnbiBjYXBhY2l0eTogICAgICAgICAlaSVzXG4iLAogCQkgICBiYXR0ZXJ5LT5pbmZvLmRlc2lnbl9jYXBhY2l0eSAqIGNzY2FsZSwKLQkJICAgYmF0dGVyeS0+aW5mby5jYXBhY2l0eV9tb2RlID8gIjAgbVdoXG4iIDogIiBtQWhcbiIpOworCQkgICBiYXR0ZXJ5LT5pbmZvLmNhcGFjaXR5X21vZGUgPyAiMCBtV2giIDogIiBtQWgiKTsKIAotCXNlcV9wcmludGYoc2VxLCAibGFzdCBmdWxsIGNhcGFjaXR5OiAgICAgICVpJXMiLAorCXNlcV9wcmludGYoc2VxLCAibGFzdCBmdWxsIGNhcGFjaXR5OiAgICAgICVpJXNcbiIsCiAJCSAgIGJhdHRlcnktPmluZm8uZnVsbF9jaGFyZ2VfY2FwYWNpdHkgKiBjc2NhbGUsCi0JCSAgIGJhdHRlcnktPmluZm8uY2FwYWNpdHlfbW9kZSA/ICIwIG1XaFxuIiA6ICIgbUFoXG4iKTsKKwkJICAgYmF0dGVyeS0+aW5mby5jYXBhY2l0eV9tb2RlID8gIjAgbVdoIiA6ICIgbUFoIik7CiAKIAlzZXFfcHJpbnRmKHNlcSwgImJhdHRlcnkgdGVjaG5vbG9neTogICAgICByZWNoYXJnZWFibGVcbiIpOwogCkBAIC05ODQsNyArMTAwMiw3IEBACiAKICAgICAgIGVuZDoKIAotCXVwKCZzYnNfc2VtKTsKKwlzYnNfbXV0ZXhfdW5sb2NrKHNicyk7CiAKIAlyZXR1cm4gcmVzdWx0OwogfQpAQCAtOTk2LDI2ICsxMDE0LDI5IEBACiAKIHN0YXRpYyBpbnQgYWNwaV9iYXR0ZXJ5X3JlYWRfc3RhdGUoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCkKIHsKLQlzdHJ1Y3QgYWNwaV9iYXR0ZXJ5ICpiYXR0ZXJ5ID0gKHN0cnVjdCBhY3BpX2JhdHRlcnkgKilzZXEtPnByaXZhdGU7CisJc3RydWN0IGFjcGlfYmF0dGVyeSAqYmF0dGVyeSA9IHNlcS0+cHJpdmF0ZTsKKwlzdHJ1Y3QgYWNwaV9zYnMgKnNicyA9IGJhdHRlcnktPnNiczsKIAlpbnQgcmVzdWx0ID0gMDsKIAlpbnQgY3NjYWxlOwogCWludCBmb287CiAKLQlpZiAoYmF0dGVyeS0+c2JzLT56b21iaWUpIHsKKwlpZiAoc2JzX211dGV4X2xvY2soc2JzKSkgewogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQlkb3duKCZzYnNfc2VtKTsKKwlyZXN1bHQgPSBhY3BpX2NoZWNrX3VwZGF0ZV9wcm9jKHNicyk7CisJaWYgKHJlc3VsdCkKKwkJZ290byBlbmQ7CiAKLQlpZiAodXBkYXRlX21vZGUgPT0gUkVRVUVTVF9VUERBVEVfTU9ERSkgewotCQlyZXN1bHQgPSBhY3BpX3Nic191cGRhdGVfcnVuKGJhdHRlcnktPnNicywgREFUQV9UWVBFX1NUQVRFKTsKKwlpZiAodXBkYXRlX3RpbWUgPT0gMCkgeworCQlyZXN1bHQgPSBhY3BpX3Nic191cGRhdGVfcnVuKHNicywgYmF0dGVyeS0+aWQsIERBVEFfVFlQRV9TVEFURSk7CiAJCWlmIChyZXN1bHQpIHsKLQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJCSAgImFjcGlfc2JzX3VwZGF0ZV9ydW4oKSBmYWlsZWRcbiIpKTsKKwkJCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBBRV9FUlJPUiwKKwkJCQkJImFjcGlfc2JzX3VwZGF0ZV9ydW4oKSBmYWlsZWQiKSk7CiAJCX0KIAl9CiAKLQlpZiAoYWNwaV9iYXR0ZXJ5X2lzX3ByZXNlbnQoYmF0dGVyeSkpIHsKKwlpZiAoYmF0dGVyeS0+YmF0dGVyeV9wcmVzZW50KSB7CiAJCXNlcV9wcmludGYoc2VxLCAicHJlc2VudDogICAgICAgICAgICAgICAgIHllc1xuIik7CiAJfSBlbHNlIHsKIAkJc2VxX3ByaW50ZihzZXEsICJwcmVzZW50OiAgICAgICAgICAgICAgICAgbm9cbiIpOwpAQCAtMTAyOCw3ICsxMDQ5LDcgQEAKIAkJY3NjYWxlID0gYmF0dGVyeS0+aW5mby5pcHNjYWxlOwogCX0KIAotCWlmIChiYXR0ZXJ5LT5zdGF0ZS5iYXR0ZXJ5X3N0YXR1cyAmIDB4MDAxMCkgeworCWlmIChiYXR0ZXJ5LT5zdGF0ZS5iYXR0ZXJ5X3N0YXRlICYgMHgwMDEwKSB7CiAJCXNlcV9wcmludGYoc2VxLCAiY2FwYWNpdHkgc3RhdGU6ICAgICAgICAgIGNyaXRpY2FsXG4iKTsKIAl9IGVsc2UgewogCQlzZXFfcHJpbnRmKHNlcSwgImNhcGFjaXR5IHN0YXRlOiAgICAgICAgICBva1xuIik7CkBAIC0xMDUyLDE2ICsxMDczLDE2IEBACiAJCQkgICBiYXR0ZXJ5LT5pbmZvLmNhcGFjaXR5X21vZGUgPyAibVciIDogIm1BIik7CiAJfQogCi0Jc2VxX3ByaW50ZihzZXEsICJyZW1haW5pbmcgY2FwYWNpdHk6ICAgICAgJWklcyIsCisJc2VxX3ByaW50ZihzZXEsICJyZW1haW5pbmcgY2FwYWNpdHk6ICAgICAgJWklc1xuIiwKIAkJICAgYmF0dGVyeS0+c3RhdGUucmVtYWluaW5nX2NhcGFjaXR5ICogY3NjYWxlLAotCQkgICBiYXR0ZXJ5LT5pbmZvLmNhcGFjaXR5X21vZGUgPyAiMCBtV2hcbiIgOiAiIG1BaFxuIik7CisJCSAgIGJhdHRlcnktPmluZm8uY2FwYWNpdHlfbW9kZSA/ICIwIG1XaCIgOiAiIG1BaCIpOwogCiAJc2VxX3ByaW50ZihzZXEsICJwcmVzZW50IHZvbHRhZ2U6ICAgICAgICAgJWkgbVZcbiIsCiAJCSAgIGJhdHRlcnktPnN0YXRlLnZvbHRhZ2UgKiBiYXR0ZXJ5LT5pbmZvLnZzY2FsZSk7CiAKICAgICAgIGVuZDoKIAotCXVwKCZzYnNfc2VtKTsKKwlzYnNfbXV0ZXhfdW5sb2NrKHNicyk7CiAKIAlyZXR1cm4gcmVzdWx0OwogfQpAQCAtMTA3NCwyNCArMTA5NSwyNyBAQAogc3RhdGljIGludCBhY3BpX2JhdHRlcnlfcmVhZF9hbGFybShzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KQogewogCXN0cnVjdCBhY3BpX2JhdHRlcnkgKmJhdHRlcnkgPSBzZXEtPnByaXZhdGU7CisJc3RydWN0IGFjcGlfc2JzICpzYnMgPSBiYXR0ZXJ5LT5zYnM7CiAJaW50IHJlc3VsdCA9IDA7CiAJaW50IGNzY2FsZTsKIAotCWlmIChiYXR0ZXJ5LT5zYnMtPnpvbWJpZSkgeworCWlmIChzYnNfbXV0ZXhfbG9jayhzYnMpKSB7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCWRvd24oJnNic19zZW0pOworCXJlc3VsdCA9IGFjcGlfY2hlY2tfdXBkYXRlX3Byb2Moc2JzKTsKKwlpZiAocmVzdWx0KQorCQlnb3RvIGVuZDsKIAotCWlmICh1cGRhdGVfbW9kZSA9PSBSRVFVRVNUX1VQREFURV9NT0RFKSB7Ci0JCXJlc3VsdCA9IGFjcGlfc2JzX3VwZGF0ZV9ydW4oYmF0dGVyeS0+c2JzLCBEQVRBX1RZUEVfQUxBUk0pOworCWlmICh1cGRhdGVfdGltZSA9PSAwKSB7CisJCXJlc3VsdCA9IGFjcGlfc2JzX3VwZGF0ZV9ydW4oc2JzLCBiYXR0ZXJ5LT5pZCwgREFUQV9UWVBFX0FMQVJNKTsKIAkJaWYgKHJlc3VsdCkgewotCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkJICAiYWNwaV9zYnNfdXBkYXRlX3J1bigpIGZhaWxlZFxuIikpOworCQkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIEFFX0VSUk9SLAorCQkJCQkiYWNwaV9zYnNfdXBkYXRlX3J1bigpIGZhaWxlZCIpKTsKIAkJfQogCX0KIAotCWlmICghYWNwaV9iYXR0ZXJ5X2lzX3ByZXNlbnQoYmF0dGVyeSkpIHsKKwlpZiAoIWJhdHRlcnktPmJhdHRlcnlfcHJlc2VudCkgewogCQlzZXFfcHJpbnRmKHNlcSwgInByZXNlbnQ6ICAgICAgICAgICAgICAgICBub1xuIik7CiAJCWdvdG8gZW5kOwogCX0KQEAgLTExMDQsMTYgKzExMjgsMTYgQEAKIAogCXNlcV9wcmludGYoc2VxLCAiYWxhcm06ICAgICAgICAgICAgICAgICAgICIpOwogCWlmIChiYXR0ZXJ5LT5hbGFybS5yZW1haW5pbmdfY2FwYWNpdHkpIHsKLQkJc2VxX3ByaW50ZihzZXEsICIlaSVzIiwKKwkJc2VxX3ByaW50ZihzZXEsICIlaSVzXG4iLAogCQkJICAgYmF0dGVyeS0+YWxhcm0ucmVtYWluaW5nX2NhcGFjaXR5ICogY3NjYWxlLAotCQkJICAgYmF0dGVyeS0+aW5mby5jYXBhY2l0eV9tb2RlID8gIjAgbVdoXG4iIDogIiBtQWhcbiIpOworCQkJICAgYmF0dGVyeS0+aW5mby5jYXBhY2l0eV9tb2RlID8gIjAgbVdoIiA6ICIgbUFoIik7CiAJfSBlbHNlIHsKIAkJc2VxX3ByaW50ZihzZXEsICJkaXNhYmxlZFxuIik7CiAJfQogCiAgICAgICBlbmQ6CiAKLQl1cCgmc2JzX3NlbSk7CisJc2JzX211dGV4X3VubG9jayhzYnMpOwogCiAJcmV0dXJuIHJlc3VsdDsKIH0KQEAgLTExMjQsMTYgKzExNDgsMTkgQEAKIHsKIAlzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgYWNwaV9iYXR0ZXJ5ICpiYXR0ZXJ5ID0gc2VxLT5wcml2YXRlOworCXN0cnVjdCBhY3BpX3NicyAqc2JzID0gYmF0dGVyeS0+c2JzOwogCWNoYXIgYWxhcm1fc3RyaW5nWzEyXSA9IHsgJ1wwJyB9OwogCWludCByZXN1bHQsIG9sZF9hbGFybSwgbmV3X2FsYXJtOwogCi0JaWYgKGJhdHRlcnktPnNicy0+em9tYmllKSB7CisJaWYgKHNic19tdXRleF9sb2NrKHNicykpIHsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JZG93bigmc2JzX3NlbSk7CisJcmVzdWx0ID0gYWNwaV9jaGVja191cGRhdGVfcHJvYyhzYnMpOworCWlmIChyZXN1bHQpCisJCWdvdG8gZW5kOwogCi0JaWYgKCFhY3BpX2JhdHRlcnlfaXNfcHJlc2VudChiYXR0ZXJ5KSkgeworCWlmICghYmF0dGVyeS0+YmF0dGVyeV9wcmVzZW50KSB7CiAJCXJlc3VsdCA9IC1FTk9ERVY7CiAJCWdvdG8gZW5kOwogCX0KQEAgLTExNTUsMjEgKzExODIsMjEgQEAKIAogCXJlc3VsdCA9IGFjcGlfYmF0dGVyeV9zZXRfYWxhcm0oYmF0dGVyeSwgbmV3X2FsYXJtKTsKIAlpZiAocmVzdWx0KSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJICAiYWNwaV9iYXR0ZXJ5X3NldF9hbGFybSgpIGZhaWxlZFxuIikpOworCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgQUVfRVJST1IsCisJCQkJImFjcGlfYmF0dGVyeV9zZXRfYWxhcm0oKSBmYWlsZWQiKSk7CiAJCWFjcGlfYmF0dGVyeV9zZXRfYWxhcm0oYmF0dGVyeSwgb2xkX2FsYXJtKTsKIAkJZ290byBlbmQ7CiAJfQogCXJlc3VsdCA9IGFjcGlfYmF0dGVyeV9nZXRfYWxhcm0oYmF0dGVyeSk7CiAJaWYgKHJlc3VsdCkgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCSAgImFjcGlfYmF0dGVyeV9nZXRfYWxhcm0oKSBmYWlsZWRcbiIpKTsKKwkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIEFFX0VSUk9SLAorCQkJCSJhY3BpX2JhdHRlcnlfZ2V0X2FsYXJtKCkgZmFpbGVkIikpOwogCQlhY3BpX2JhdHRlcnlfc2V0X2FsYXJtKGJhdHRlcnksIG9sZF9hbGFybSk7CiAJCWdvdG8gZW5kOwogCX0KIAogICAgICAgZW5kOgotCXVwKCZzYnNfc2VtKTsKKwlzYnNfbXV0ZXhfdW5sb2NrKHNicyk7CiAKIAlpZiAocmVzdWx0KSB7CiAJCXJldHVybiByZXN1bHQ7CkBAIC0xMjE3LDI0ICsxMjQ0LDIyIEBACiAJc3RydWN0IGFjcGlfc2JzICpzYnMgPSBzZXEtPnByaXZhdGU7CiAJaW50IHJlc3VsdDsKIAotCWlmIChzYnMtPnpvbWJpZSkgeworCWlmIChzYnNfbXV0ZXhfbG9jayhzYnMpKSB7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCWRvd24oJnNic19zZW0pOwotCi0JaWYgKHVwZGF0ZV9tb2RlID09IFJFUVVFU1RfVVBEQVRFX01PREUpIHsKLQkJcmVzdWx0ID0gYWNwaV9zYnNfdXBkYXRlX3J1bihzYnMsIERBVEFfVFlQRV9BQ19TVEFURSk7CisJaWYgKHVwZGF0ZV90aW1lID09IDApIHsKKwkJcmVzdWx0ID0gYWNwaV9zYnNfdXBkYXRlX3J1bihzYnMsIC0xLCBEQVRBX1RZUEVfQUNfU1RBVEUpOwogCQlpZiAocmVzdWx0KSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkgICJhY3BpX3Nic191cGRhdGVfcnVuKCkgZmFpbGVkXG4iKSk7CisJCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgQUVfRVJST1IsCisJCQkJCSJhY3BpX3Nic191cGRhdGVfcnVuKCkgZmFpbGVkIikpOwogCQl9CiAJfQogCiAJc2VxX3ByaW50ZihzZXEsICJzdGF0ZTogICAgICAgICAgICAgICAgICAgJXNcbiIsCi0JCSAgIHNicy0+YWNfcHJlc2VudCA/ICJvbi1saW5lIiA6ICJvZmYtbGluZSIpOworCQkgICBzYnMtPmFjLmFjX3ByZXNlbnQgPyAib24tbGluZSIgOiAib2ZmLWxpbmUiKTsKIAotCXVwKCZzYnNfc2VtKTsKKwlzYnNfbXV0ZXhfdW5sb2NrKHNicyk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTEyNzUsMjUgKzEzMDAsMjUgQEAKIAogCXJlc3VsdCA9IGFjcGlfYmF0dGVyeV9zZWxlY3QoYmF0dGVyeSk7CiAJaWYgKHJlc3VsdCkgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCSAgImFjcGlfYmF0dGVyeV9zZWxlY3QoKSBmYWlsZWRcbiIpKTsKKwkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIEFFX0VSUk9SLAorCQkJCSJhY3BpX2JhdHRlcnlfc2VsZWN0KCkgZmFpbGVkIikpOwogCQlnb3RvIGVuZDsKIAl9CiAKIAlyZXN1bHQgPSBhY3BpX2JhdHRlcnlfZ2V0X3ByZXNlbnQoYmF0dGVyeSk7CiAJaWYgKHJlc3VsdCkgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCSAgImFjcGlfYmF0dGVyeV9nZXRfcHJlc2VudCgpIGZhaWxlZFxuIikpOworCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgQUVfRVJST1IsCisJCQkJImFjcGlfYmF0dGVyeV9nZXRfcHJlc2VudCgpIGZhaWxlZCIpKTsKIAkJZ290byBlbmQ7CiAJfQogCi0JaXNfcHJlc2VudCA9IGFjcGlfYmF0dGVyeV9pc19wcmVzZW50KGJhdHRlcnkpOworCWlzX3ByZXNlbnQgPSBiYXR0ZXJ5LT5iYXR0ZXJ5X3ByZXNlbnQ7CiAKIAlpZiAoaXNfcHJlc2VudCkgewogCQlyZXN1bHQgPSBhY3BpX2JhdHRlcnlfaW5pdChiYXR0ZXJ5KTsKIAkJaWYgKHJlc3VsdCkgewotCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkJICAiYWNwaV9iYXR0ZXJ5X2luaXQoKSBmYWlsZWRcbiIpKTsKKwkJCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBBRV9FUlJPUiwKKwkJCQkJImFjcGlfYmF0dGVyeV9pbml0KCkgZmFpbGVkIikpOwogCQkJZ290byBlbmQ7CiAJCX0KIAkJYmF0dGVyeS0+aW5pdF9zdGF0ZSA9IDE7CkBAIC0xMzA4LDEyICsxMzMzLDE2IEBACiAJCQkJCSAmYWNwaV9iYXR0ZXJ5X3N0YXRlX2ZvcHMsCiAJCQkJCSAmYWNwaV9iYXR0ZXJ5X2FsYXJtX2ZvcHMsIGJhdHRlcnkpOwogCWlmIChyZXN1bHQpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkgICJhY3BpX3Nic19nZW5lcmljX2FkZF9mcygpIGZhaWxlZFxuIikpOworCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgQUVfRVJST1IsCisJCQkJImFjcGlfc2JzX2dlbmVyaWNfYWRkX2ZzKCkgZmFpbGVkIikpOwogCQlnb3RvIGVuZDsKIAl9CiAJYmF0dGVyeS0+YWxpdmUgPSAxOwogCisJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggIiVzIFslc106IEJhdHRlcnkgU2xvdCBbJXNdIChiYXR0ZXJ5ICVzKVxuIiwKKwkgICAgICAgQUNQSV9TQlNfREVWSUNFX05BTUUsIGFjcGlfZGV2aWNlX2JpZChzYnMtPmRldmljZSksIGRpcl9uYW1lLAorCSAgICAgICBzYnMtPmJhdHRlcnktPmJhdHRlcnlfcHJlc2VudCA/ICJwcmVzZW50IiA6ICJhYnNlbnQiKTsKKwogICAgICAgZW5kOgogCXJldHVybiByZXN1bHQ7CiB9CkBAIC0xMzMzLDggKzEzNjIsOCBAQAogCiAJcmVzdWx0ID0gYWNwaV9hY19nZXRfcHJlc2VudChzYnMpOwogCWlmIChyZXN1bHQpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkgICJhY3BpX2FjX2dldF9wcmVzZW50KCkgZmFpbGVkXG4iKSk7CisJCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBBRV9FUlJPUiwKKwkJCQkiYWNwaV9hY19nZXRfcHJlc2VudCgpIGZhaWxlZCIpKTsKIAkJZ290byBlbmQ7CiAJfQogCkBAIC0xMzQzLDExICsxMzcyLDE1IEBACiAJCQkJCSBBQ1BJX0FDX0RJUl9OQU1FLAogCQkJCQkgTlVMTCwgJmFjcGlfYWNfc3RhdGVfZm9wcywgTlVMTCwgc2JzKTsKIAlpZiAocmVzdWx0KSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJICAiYWNwaV9zYnNfZ2VuZXJpY19hZGRfZnMoKSBmYWlsZWRcbiIpKTsKKwkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIEFFX0VSUk9SLAorCQkJCSJhY3BpX3Nic19nZW5lcmljX2FkZF9mcygpIGZhaWxlZCIpKTsKIAkJZ290byBlbmQ7CiAJfQogCisJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggIiVzIFslc106IEFDIEFkYXB0ZXIgWyVzXSAoJXMpXG4iLAorCSAgICAgICBBQ1BJX1NCU19ERVZJQ0VfTkFNRSwgYWNwaV9kZXZpY2VfYmlkKHNicy0+ZGV2aWNlKSwKKwkgICAgICAgQUNQSV9BQ19ESVJfTkFNRSwgc2JzLT5hYy5hY19wcmVzZW50ID8gIm9uLWxpbmUiIDogIm9mZi1saW5lIik7CisKICAgICAgIGVuZDoKIAogCXJldHVybiByZXN1bHQ7CkBAIC0xMzYxLDQ1ICsxMzk0LDg1IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBhY3BpX3Nic191cGRhdGVfcXVldWVfcnVuKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3N0YXRpYyB2b2lkIGFjcGlfc2JzX3VwZGF0ZV90aW1lX3J1bih1bnNpZ25lZCBsb25nIGRhdGEpCiB7Ci0JYWNwaV9vc19leGVjdXRlKE9TTF9HUEVfSEFORExFUiwgYWNwaV9zYnNfdXBkYXRlX3F1ZXVlLCAodm9pZCAqKWRhdGEpOworCWFjcGlfb3NfZXhlY3V0ZShPU0xfR1BFX0hBTkRMRVIsIGFjcGlfc2JzX3VwZGF0ZV90aW1lLCAodm9pZCAqKWRhdGEpOwogfQogCi1zdGF0aWMgaW50IGFjcGlfc2JzX3VwZGF0ZV9ydW4oc3RydWN0IGFjcGlfc2JzICpzYnMsIGludCBkYXRhX3R5cGUpCitzdGF0aWMgaW50IGFjcGlfc2JzX3VwZGF0ZV9ydW4oc3RydWN0IGFjcGlfc2JzICpzYnMsIGludCBpZCwgaW50IGRhdGFfdHlwZSkKIHsKIAlzdHJ1Y3QgYWNwaV9iYXR0ZXJ5ICpiYXR0ZXJ5OwotCWludCByZXN1bHQgPSAwOwotCWludCBvbGRfYWNfcHJlc2VudDsKLQlpbnQgb2xkX2JhdHRlcnlfcHJlc2VudDsKLQlpbnQgbmV3X2FjX3ByZXNlbnQ7Ci0JaW50IG5ld19iYXR0ZXJ5X3ByZXNlbnQ7Ci0JaW50IGlkOworCWludCByZXN1bHQgPSAwLCBjbnQ7CisJaW50IG9sZF9hY19wcmVzZW50ID0gLTE7CisJaW50IG9sZF9iYXR0ZXJ5X3ByZXNlbnQgPSAtMTsKKwlpbnQgbmV3X2FjX3ByZXNlbnQgPSAtMTsKKwlpbnQgbmV3X2JhdHRlcnlfcHJlc2VudCA9IC0xOworCWludCBpZF9taW4gPSAwLCBpZF9tYXggPSBNQVhfU0JTX0JBVCAtIDE7CiAJY2hhciBkaXJfbmFtZVszMl07Ci0JaW50IGRvX2JhdHRlcnlfaW5pdCwgZG9fYWNfaW5pdDsKLQlzMTYgb2xkX3JlbWFpbmluZ19jYXBhY2l0eTsKKwlpbnQgZG9fYmF0dGVyeV9pbml0ID0gMCwgZG9fYWNfaW5pdCA9IDA7CisJaW50IG9sZF9yZW1haW5pbmdfY2FwYWNpdHkgPSAwOworCWludCB1cGRhdGVfYWMgPSAxLCB1cGRhdGVfYmF0dGVyeSA9IDE7CisJaW50IHVwX3RtID0gdXBkYXRlX3RpbWU7CiAKLQlpZiAoc2JzLT56b21iaWUpIHsKKwlpZiAoc2JzX3pvbWJpZShzYnMpKSB7CiAJCWdvdG8gZW5kOwogCX0KIAotCW9sZF9hY19wcmVzZW50ID0gYWNwaV9hY19pc19wcmVzZW50KHNicyk7CisJaWYgKGlkID49IDApIHsKKwkJaWRfbWluID0gaWRfbWF4ID0gaWQ7CisJfQorCisJaWYgKGRhdGFfdHlwZSA9PSBEQVRBX1RZUEVfQ09NTU9OICYmIHVwX3RtID4gMCkgeworCQljbnQgPSB1cF90bSAvICh1cF90bSA+IFVQREFURV9ERUxBWSA/IFVQREFURV9ERUxBWSA6IHVwX3RtKTsKKwkJaWYgKHNicy0+cnVuX2NudCAlIGNudCAhPSAwKSB7CisJCQl1cGRhdGVfYmF0dGVyeSA9IDA7CisJCX0KKwl9CisKKwlzYnMtPnJ1bl9jbnQrKzsKKworCWlmICghdXBkYXRlX2FjICYmICF1cGRhdGVfYmF0dGVyeSkgeworCQlnb3RvIGVuZDsKKwl9CisKKwlvbGRfYWNfcHJlc2VudCA9IHNicy0+YWMuYWNfcHJlc2VudDsKIAogCXJlc3VsdCA9IGFjcGlfYWNfZ2V0X3ByZXNlbnQoc2JzKTsKIAlpZiAocmVzdWx0KSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJICAiYWNwaV9hY19nZXRfcHJlc2VudCgpIGZhaWxlZFxuIikpOworCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgQUVfRVJST1IsCisJCQkJImFjcGlfYWNfZ2V0X3ByZXNlbnQoKSBmYWlsZWQiKSk7CiAJfQogCi0JbmV3X2FjX3ByZXNlbnQgPSBhY3BpX2FjX2lzX3ByZXNlbnQoc2JzKTsKKwluZXdfYWNfcHJlc2VudCA9IHNicy0+YWMuYWNfcHJlc2VudDsKIAogCWRvX2FjX2luaXQgPSAob2xkX2FjX3ByZXNlbnQgIT0gbmV3X2FjX3ByZXNlbnQpOworCWlmIChzYnMtPnJ1bl9jbnQgPT0gMSAmJiBkYXRhX3R5cGUgPT0gREFUQV9UWVBFX0NPTU1PTikgeworCQlkb19hY19pbml0ID0gMTsKKwl9CiAKLQlpZiAoZGF0YV90eXBlID09IERBVEFfVFlQRV9BQ19TVEFURSkgeworCWlmIChkb19hY19pbml0KSB7CisJCXJlc3VsdCA9IGFjcGlfc2JzX2dlbmVyYXRlX2V2ZW50KHNicy0+ZGV2aWNlLAorCQkJCQkJIEFDUElfU0JTX0FDX05PVElGWV9TVEFUVVMsCisJCQkJCQkgbmV3X2FjX3ByZXNlbnQsCisJCQkJCQkgQUNQSV9BQ19ESVJfTkFNRSwKKwkJCQkJCSBBQ1BJX0FDX0NMQVNTKTsKKwkJaWYgKHJlc3VsdCkgeworCQkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIEFFX0VSUk9SLAorCQkJCQkiYWNwaV9zYnNfZ2VuZXJhdGVfZXZlbnQoKSBmYWlsZWQiKSk7CisJCX0KKwl9CisKKwlpZiAoZGF0YV90eXBlID09IERBVEFfVFlQRV9DT01NT04pIHsKKwkJaWYgKCFkb19hY19pbml0ICYmICF1cGRhdGVfYmF0dGVyeSkgeworCQkJZ290byBlbmQ7CisJCX0KKwl9CisKKwlpZiAoZGF0YV90eXBlID09IERBVEFfVFlQRV9BQ19TVEFURSAmJiAhZG9fYWNfaW5pdCkgewogCQlnb3RvIGVuZDsKIAl9CiAKLQlmb3IgKGlkID0gMDsgaWQgPCBNQVhfU0JTX0JBVDsgaWQrKykgeworCWZvciAoaWQgPSBpZF9taW47IGlkIDw9IGlkX21heDsgaWQrKykgewogCQliYXR0ZXJ5ID0gJnNicy0+YmF0dGVyeVtpZF07CiAJCWlmIChiYXR0ZXJ5LT5hbGl2ZSA9PSAwKSB7CiAJCQljb250aW51ZTsKQEAgLTE0MDcsODEgKzE0ODAsOTIgQEAKIAogCQlvbGRfcmVtYWluaW5nX2NhcGFjaXR5ID0gYmF0dGVyeS0+c3RhdGUucmVtYWluaW5nX2NhcGFjaXR5OwogCi0JCW9sZF9iYXR0ZXJ5X3ByZXNlbnQgPSBhY3BpX2JhdHRlcnlfaXNfcHJlc2VudChiYXR0ZXJ5KTsKKwkJb2xkX2JhdHRlcnlfcHJlc2VudCA9IGJhdHRlcnktPmJhdHRlcnlfcHJlc2VudDsKIAogCQlyZXN1bHQgPSBhY3BpX2JhdHRlcnlfc2VsZWN0KGJhdHRlcnkpOwogCQlpZiAocmVzdWx0KSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkgICJhY3BpX2JhdHRlcnlfc2VsZWN0KCkgZmFpbGVkXG4iKSk7Ci0JCX0KLQkJaWYgKHNicy0+em9tYmllKSB7Ci0JCQlnb3RvIGVuZDsKKwkJCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBBRV9FUlJPUiwKKwkJCQkJImFjcGlfYmF0dGVyeV9zZWxlY3QoKSBmYWlsZWQiKSk7CiAJCX0KIAogCQlyZXN1bHQgPSBhY3BpX2JhdHRlcnlfZ2V0X3ByZXNlbnQoYmF0dGVyeSk7CiAJCWlmIChyZXN1bHQpIHsKLQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJCSAgImFjcGlfYmF0dGVyeV9nZXRfcHJlc2VudCgpIGZhaWxlZFxuIikpOwotCQl9Ci0JCWlmIChzYnMtPnpvbWJpZSkgewotCQkJZ290byBlbmQ7CisJCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgQUVfRVJST1IsCisJCQkJCSJhY3BpX2JhdHRlcnlfZ2V0X3ByZXNlbnQoKSBmYWlsZWQiKSk7CiAJCX0KIAotCQluZXdfYmF0dGVyeV9wcmVzZW50ID0gYWNwaV9iYXR0ZXJ5X2lzX3ByZXNlbnQoYmF0dGVyeSk7CisJCW5ld19iYXR0ZXJ5X3ByZXNlbnQgPSBiYXR0ZXJ5LT5iYXR0ZXJ5X3ByZXNlbnQ7CiAKIAkJZG9fYmF0dGVyeV9pbml0ID0gKChvbGRfYmF0dGVyeV9wcmVzZW50ICE9IG5ld19iYXR0ZXJ5X3ByZXNlbnQpCiAJCQkJICAgJiYgbmV3X2JhdHRlcnlfcHJlc2VudCk7Ci0KLQkJaWYgKHNicy0+em9tYmllKSB7Ci0JCQlnb3RvIGVuZDsKLQkJfQotCQlpZiAoZG9fYWNfaW5pdCB8fCBkb19iYXR0ZXJ5X2luaXQgfHwKLQkJICAgIHVwZGF0ZV9pbmZvX21vZGUgfHwgc2JzLT51cGRhdGVfaW5mb19tb2RlKSB7Ci0JCQlpZiAoc2JzLT51cGRhdGVfaW5mb19tb2RlKSB7Ci0JCQkJc2JzLT51cGRhdGVfaW5mb19tb2RlID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJc2JzLT51cGRhdGVfaW5mb19tb2RlID0gMTsKLQkJCX0KKwkJaWYgKCFuZXdfYmF0dGVyeV9wcmVzZW50KQorCQkJZ290byBldmVudDsKKwkJaWYgKGRvX2FjX2luaXQgfHwgZG9fYmF0dGVyeV9pbml0KSB7CiAJCQlyZXN1bHQgPSBhY3BpX2JhdHRlcnlfaW5pdChiYXR0ZXJ5KTsKIAkJCWlmIChyZXN1bHQpIHsKLQkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkJICAiYWNwaV9iYXR0ZXJ5X2luaXQoKSAiCi0JCQkJCQkgICJmYWlsZWRcbiIpKTsKKwkJCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgQUVfRVJST1IsCisJCQkJCQkiYWNwaV9iYXR0ZXJ5X2luaXQoKSAiCisJCQkJCQkiZmFpbGVkIikpOworCQkJfQorCQl9CisJCWlmIChzYnNfem9tYmllKHNicykpIHsKKwkJCWdvdG8gZW5kOworCQl9CisKKwkJaWYgKChkYXRhX3R5cGUgPT0gREFUQV9UWVBFX0NPTU1PTgorCQkgICAgIHx8IGRhdGFfdHlwZSA9PSBEQVRBX1RZUEVfSU5GTykKKwkJICAgICYmIG5ld19iYXR0ZXJ5X3ByZXNlbnQpIHsKKwkJCXJlc3VsdCA9IGFjcGlfYmF0dGVyeV9nZXRfaW5mbyhiYXR0ZXJ5KTsKKwkJCWlmIChyZXN1bHQpIHsKKwkJCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgQUVfRVJST1IsCisJCQkJCQkiYWNwaV9iYXR0ZXJ5X2dldF9pbmZvKCkgZmFpbGVkIikpOwogCQkJfQogCQl9CiAJCWlmIChkYXRhX3R5cGUgPT0gREFUQV9UWVBFX0lORk8pIHsKIAkJCWNvbnRpbnVlOwogCQl9Ci0KLQkJaWYgKHNicy0+em9tYmllKSB7CisJCWlmIChzYnNfem9tYmllKHNicykpIHsKIAkJCWdvdG8gZW5kOwogCQl9Ci0JCWlmIChuZXdfYmF0dGVyeV9wcmVzZW50KSB7Ci0JCQlyZXN1bHQgPSBhY3BpX2JhdHRlcnlfZ2V0X2FsYXJtKGJhdHRlcnkpOwotCQkJaWYgKHJlc3VsdCkgewotCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJCQkgICJhY3BpX2JhdHRlcnlfZ2V0X2FsYXJtKCkgIgotCQkJCQkJICAiZmFpbGVkXG4iKSk7Ci0JCQl9Ci0JCQlpZiAoZGF0YV90eXBlID09IERBVEFfVFlQRV9BTEFSTSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQogCisJCWlmICgoZGF0YV90eXBlID09IERBVEFfVFlQRV9DT01NT04KKwkJICAgICB8fCBkYXRhX3R5cGUgPT0gREFUQV9UWVBFX1NUQVRFKQorCQkgICAgJiYgbmV3X2JhdHRlcnlfcHJlc2VudCkgewogCQkJcmVzdWx0ID0gYWNwaV9iYXR0ZXJ5X2dldF9zdGF0ZShiYXR0ZXJ5KTsKIAkJCWlmIChyZXN1bHQpIHsKLQkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkJICAiYWNwaV9iYXR0ZXJ5X2dldF9zdGF0ZSgpICIKLQkJCQkJCSAgImZhaWxlZFxuIikpOworCQkJCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBBRV9FUlJPUiwKKwkJCQkJCSJhY3BpX2JhdHRlcnlfZ2V0X3N0YXRlKCkgZmFpbGVkIikpOwogCQkJfQogCQl9Ci0JCWlmIChzYnMtPnpvbWJpZSkgeworCQlpZiAoZGF0YV90eXBlID09IERBVEFfVFlQRV9TVEFURSkgeworCQkJZ290byBldmVudDsKKwkJfQorCQlpZiAoc2JzX3pvbWJpZShzYnMpKSB7CiAJCQlnb3RvIGVuZDsKIAkJfQotCQlpZiAoZGF0YV90eXBlICE9IERBVEFfVFlQRV9DT01NT04pIHsKKworCQlpZiAoKGRhdGFfdHlwZSA9PSBEQVRBX1RZUEVfQ09NTU9OCisJCSAgICAgfHwgZGF0YV90eXBlID09IERBVEFfVFlQRV9BTEFSTSkKKwkJICAgICYmIG5ld19iYXR0ZXJ5X3ByZXNlbnQpIHsKKwkJCXJlc3VsdCA9IGFjcGlfYmF0dGVyeV9nZXRfYWxhcm0oYmF0dGVyeSk7CisJCQlpZiAocmVzdWx0KSB7CisJCQkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIEFFX0VSUk9SLAorCQkJCQkJImFjcGlfYmF0dGVyeV9nZXRfYWxhcm0oKSAiCisJCQkJCQkiZmFpbGVkIikpOworCQkJfQorCQl9CisJCWlmIChkYXRhX3R5cGUgPT0gREFUQV9UWVBFX0FMQVJNKSB7CiAJCQljb250aW51ZTsKIAkJfQorCQlpZiAoc2JzX3pvbWJpZShzYnMpKSB7CisJCQlnb3RvIGVuZDsKKwkJfQogCi0JCWlmIChvbGRfYmF0dGVyeV9wcmVzZW50ICE9IG5ld19iYXR0ZXJ5X3ByZXNlbnQpIHsKKwkgICAgICBldmVudDoKKworCQlpZiAob2xkX2JhdHRlcnlfcHJlc2VudCAhPSBuZXdfYmF0dGVyeV9wcmVzZW50IHx8IGRvX2FjX2luaXQgfHwKKwkJICAgIG9sZF9yZW1haW5pbmdfY2FwYWNpdHkgIT0KKwkJICAgIGJhdHRlcnktPnN0YXRlLnJlbWFpbmluZ19jYXBhY2l0eSkgewogCQkJc3ByaW50ZihkaXJfbmFtZSwgQUNQSV9CQVRURVJZX0RJUl9OQU1FLCBpZCk7CiAJCQlyZXN1bHQgPSBhY3BpX3Nic19nZW5lcmF0ZV9ldmVudChzYnMtPmRldmljZSwKIAkJCQkJCQkgQUNQSV9TQlNfQkFUVEVSWV9OT1RJRllfU1RBVFVTLApAQCAtMTQ4OSwxNTEgKzE1NzMsMTIwIEBACiAJCQkJCQkJIGRpcl9uYW1lLAogCQkJCQkJCSBBQ1BJX0JBVFRFUllfQ0xBU1MpOwogCQkJaWYgKHJlc3VsdCkgewotCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJCQkgICJhY3BpX3Nic19nZW5lcmF0ZV9ldmVudCgpICIKLQkJCQkJCSAgImZhaWxlZFxuIikpOworCQkJCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBBRV9FUlJPUiwKKwkJCQkJCSJhY3BpX3Nic19nZW5lcmF0ZV9ldmVudCgpICIKKwkJCQkJCSJmYWlsZWQiKSk7CiAJCQl9CiAJCX0KLQkJaWYgKG9sZF9yZW1haW5pbmdfY2FwYWNpdHkgIT0gYmF0dGVyeS0+c3RhdGUucmVtYWluaW5nX2NhcGFjaXR5KSB7Ci0JCQlzcHJpbnRmKGRpcl9uYW1lLCBBQ1BJX0JBVFRFUllfRElSX05BTUUsIGlkKTsKLQkJCXJlc3VsdCA9IGFjcGlfc2JzX2dlbmVyYXRlX2V2ZW50KHNicy0+ZGV2aWNlLAotCQkJCQkJCSBBQ1BJX1NCU19CQVRURVJZX05PVElGWV9TVEFUVVMsCi0JCQkJCQkJIG5ld19iYXR0ZXJ5X3ByZXNlbnQsCi0JCQkJCQkJIGRpcl9uYW1lLAotCQkJCQkJCSBBQ1BJX0JBVFRFUllfQ0xBU1MpOwotCQkJaWYgKHJlc3VsdCkgewotCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJCQkgICJhY3BpX3Nic19nZW5lcmF0ZV9ldmVudCgpIGZhaWxlZFxuIikpOwotCQkJfQotCQl9Ci0KLQl9Ci0JaWYgKHNicy0+em9tYmllKSB7Ci0JCWdvdG8gZW5kOwotCX0KLQlpZiAoZGF0YV90eXBlICE9IERBVEFfVFlQRV9DT01NT04pIHsKLQkJZ290byBlbmQ7Ci0JfQotCi0JaWYgKG9sZF9hY19wcmVzZW50ICE9IG5ld19hY19wcmVzZW50KSB7Ci0JCXJlc3VsdCA9IGFjcGlfc2JzX2dlbmVyYXRlX2V2ZW50KHNicy0+ZGV2aWNlLAotCQkJCQkJIEFDUElfU0JTX0FDX05PVElGWV9TVEFUVVMsCi0JCQkJCQkgbmV3X2FjX3ByZXNlbnQsCi0JCQkJCQkgQUNQSV9BQ19ESVJfTkFNRSwKLQkJCQkJCSBBQ1BJX0FDX0NMQVNTKTsKLQkJaWYgKHJlc3VsdCkgewotCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkJICAiYWNwaV9zYnNfZ2VuZXJhdGVfZXZlbnQoKSBmYWlsZWRcbiIpKTsKLQkJfQogCX0KIAogICAgICAgZW5kOgorCiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotc3RhdGljIHZvaWQgYWNwaV9zYnNfdXBkYXRlX3F1ZXVlKHZvaWQgKmRhdGEpCitzdGF0aWMgdm9pZCBhY3BpX3Nic191cGRhdGVfdGltZSh2b2lkICpkYXRhKQogewogCXN0cnVjdCBhY3BpX3NicyAqc2JzID0gZGF0YTsKIAl1bnNpZ25lZCBsb25nIGRlbGF5ID0gLTE7CiAJaW50IHJlc3VsdDsKKwl1bnNpZ25lZCBpbnQgdXBfdG0gPSB1cGRhdGVfdGltZTsKIAotCWlmIChzYnMtPnpvbWJpZSkgewotCQlnb3RvIGVuZDsKLQl9CisJaWYgKHNic19tdXRleF9sb2NrKHNicykpCisJCXJldHVybjsKIAotCXJlc3VsdCA9IGFjcGlfc2JzX3VwZGF0ZV9ydW4oc2JzLCBEQVRBX1RZUEVfQ09NTU9OKTsKKwlyZXN1bHQgPSBhY3BpX3Nic191cGRhdGVfcnVuKHNicywgLTEsIERBVEFfVFlQRV9DT01NT04pOwogCWlmIChyZXN1bHQpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkgICJhY3BpX3Nic191cGRhdGVfcnVuKCkgZmFpbGVkXG4iKSk7CisJCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBBRV9FUlJPUiwKKwkJCQkiYWNwaV9zYnNfdXBkYXRlX3J1bigpIGZhaWxlZCIpKTsKIAl9CiAKLQlpZiAoc2JzLT56b21iaWUpIHsKKwlpZiAoc2JzX3pvbWJpZShzYnMpKSB7CiAJCWdvdG8gZW5kOwogCX0KIAotCWlmICh1cGRhdGVfbW9kZSA9PSBSRVFVRVNUX1VQREFURV9NT0RFKSB7Ci0JCWdvdG8gZW5kOworCWlmICghdXBfdG0pIHsKKwkJaWYgKHRpbWVyX3BlbmRpbmcoJnNicy0+dXBkYXRlX3RpbWVyKSkKKwkJCWRlbF90aW1lcigmc2JzLT51cGRhdGVfdGltZXIpOworCX0gZWxzZSB7CisJCWRlbGF5ID0gKHVwX3RtID4gVVBEQVRFX0RFTEFZID8gVVBEQVRFX0RFTEFZIDogdXBfdG0pOworCQlkZWxheSA9IGppZmZpZXMgKyBIWiAqIGRlbGF5OworCQlpZiAodGltZXJfcGVuZGluZygmc2JzLT51cGRhdGVfdGltZXIpKSB7CisJCQltb2RfdGltZXIoJnNicy0+dXBkYXRlX3RpbWVyLCBkZWxheSk7CisJCX0gZWxzZSB7CisJCQlzYnMtPnVwZGF0ZV90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpZGF0YTsKKwkJCXNicy0+dXBkYXRlX3RpbWVyLmZ1bmN0aW9uID0gYWNwaV9zYnNfdXBkYXRlX3RpbWVfcnVuOworCQkJc2JzLT51cGRhdGVfdGltZXIuZXhwaXJlcyA9IGRlbGF5OworCQkJYWRkX3RpbWVyKCZzYnMtPnVwZGF0ZV90aW1lcik7CisJCX0KIAl9CiAKLQlkZWxheSA9IGppZmZpZXMgKyBIWiAqIHVwZGF0ZV90aW1lOwotCXNicy0+dXBkYXRlX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylkYXRhOwotCXNicy0+dXBkYXRlX3RpbWVyLmZ1bmN0aW9uID0gYWNwaV9zYnNfdXBkYXRlX3F1ZXVlX3J1bjsKLQlzYnMtPnVwZGF0ZV90aW1lci5leHBpcmVzID0gZGVsYXk7Ci0JYWRkX3RpbWVyKCZzYnMtPnVwZGF0ZV90aW1lcik7CiAgICAgICBlbmQ6Ci0JOworCisJc2JzX211dGV4X3VubG9jayhzYnMpOwogfQogCiBzdGF0aWMgaW50IGFjcGlfc2JzX2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKIHsKIAlzdHJ1Y3QgYWNwaV9zYnMgKnNicyA9IE5VTEw7Ci0Jc3RydWN0IGFjcGlfZWNfaGMgKmVjX2hjID0gTlVMTDsKLQlpbnQgcmVzdWx0LCByZW1vdmVfcmVzdWx0ID0gMDsKKwlpbnQgcmVzdWx0ID0gMCwgcmVtb3ZlX3Jlc3VsdCA9IDA7CiAJdW5zaWduZWQgbG9uZyBzYnNfb2JqOwotCWludCBpZCwgY250OworCWludCBpZDsKIAlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwl1bnNpZ25lZCBsb25nIHZhbDsKKworCXN0YXR1cyA9CisJICAgIGFjcGlfZXZhbHVhdGVfaW50ZWdlcihkZXZpY2UtPnBhcmVudC0+aGFuZGxlLCAiX0VDIiwgTlVMTCwgJnZhbCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBBRV9FUlJPUiwgIkVycm9yIG9idGFpbmluZyBfRUMiKSk7CisJCXJldHVybiAtRUlPOworCX0KIAogCXNicyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhY3BpX3NicyksIEdGUF9LRVJORUwpOwogCWlmICghc2JzKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJrbWFsbG9jKCkgZmFpbGVkXG4iKSk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCWNudCA9IDA7Ci0Jd2hpbGUgKGNudCA8IDEwKSB7Ci0JCWNudCsrOwotCQllY19oYyA9IGFjcGlfZ2V0X2VjX2hjKGRldmljZSk7Ci0JCWlmIChlY19oYykgewotCQkJYnJlYWs7Ci0JCX0KLQkJbXNsZWVwKDEwMDApOwotCX0KLQotCWlmICghZWNfaGMpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkgICJhY3BpX2dldF9lY19oYygpIGZhaWxlZDogIgotCQkJCSAgIk5PIGRyaXZlciBmb3VuZCBmb3IgRUMgSEMgU01CdXNcbiIpKTsKLQkJcmVzdWx0ID0gLUVOT0RFVjsKKwkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIEFFX0VSUk9SLCAia3phbGxvYygpIGZhaWxlZCIpKTsKKwkJcmVzdWx0ID0gLUVOT01FTTsKIAkJZ290byBlbmQ7CiAJfQogCisJbXV0ZXhfaW5pdCgmc2JzLT5tdXRleCk7CisKKwlzYnNfbXV0ZXhfbG9jayhzYnMpOworCisJc2JzLT5iYXNlID0gKHZhbCAmIDB4ZmYwMHVsbCkgPj4gODsKIAlzYnMtPmRldmljZSA9IGRldmljZTsKLQlzYnMtPnNtYnVzID0gZWNfaGMtPnNtYnVzOwogCiAJc3RyY3B5KGFjcGlfZGV2aWNlX25hbWUoZGV2aWNlKSwgQUNQSV9TQlNfREVWSUNFX05BTUUpOwogCXN0cmNweShhY3BpX2RldmljZV9jbGFzcyhkZXZpY2UpLCBBQ1BJX1NCU19DTEFTUyk7CiAJYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpID0gc2JzOwogCi0Jc2JzLT51cGRhdGVfdGltZSA9IDA7Ci0Jc2JzLT51cGRhdGVfdGltZTIgPSAwOwotCiAJcmVzdWx0ID0gYWNwaV9hY19hZGQoc2JzKTsKIAlpZiAocmVzdWx0KSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJhY3BpX2FjX2FkZCgpIGZhaWxlZFxuIikpOworCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgQUVfRVJST1IsICJhY3BpX2FjX2FkZCgpIGZhaWxlZCIpKTsKIAkJZ290byBlbmQ7CiAJfQotCXJlc3VsdCA9IGFjcGlfZXZhbHVhdGVfaW50ZWdlcihkZXZpY2UtPmhhbmRsZSwgIl9TQlMiLCBOVUxMLCAmc2JzX29iaik7Ci0JaWYgKEFDUElfRkFJTFVSRShyZXN1bHQpKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJICAiYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKCkgZmFpbGVkXG4iKSk7CisJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKGRldmljZS0+aGFuZGxlLCAiX1NCUyIsIE5VTEwsICZzYnNfb2JqKTsKKwlpZiAoc3RhdHVzKSB7CisJCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBzdGF0dXMsCisJCQkJImFjcGlfZXZhbHVhdGVfaW50ZWdlcigpIGZhaWxlZCIpKTsKIAkJcmVzdWx0ID0gLUVJTzsKIAkJZ290byBlbmQ7CiAJfQotCiAJaWYgKHNic19vYmogPiAwKSB7CiAJCXJlc3VsdCA9IGFjcGlfc2JzbV9nZXRfaW5mbyhzYnMpOwogCQlpZiAocmVzdWx0KSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkgICJhY3BpX3Nic21fZ2V0X2luZm8oKSBmYWlsZWRcbiIpKTsKKwkJCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBBRV9FUlJPUiwKKwkJCQkJImFjcGlfc2JzbV9nZXRfaW5mbygpIGZhaWxlZCIpKTsKIAkJCWdvdG8gZW5kOwogCQl9CiAJCXNicy0+c2JzbV9wcmVzZW50ID0gMTsKIAl9CisKIAlpZiAoc2JzLT5zYnNtX3ByZXNlbnQgPT0gMCkgewogCQlyZXN1bHQgPSBhY3BpX2JhdHRlcnlfYWRkKHNicywgMCk7CiAJCWlmIChyZXN1bHQpIHsKLQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJCSAgImFjcGlfYmF0dGVyeV9hZGQoKSBmYWlsZWRcbiIpKTsKKwkJCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBBRV9FUlJPUiwKKwkJCQkJImFjcGlfYmF0dGVyeV9hZGQoKSBmYWlsZWQiKSk7CiAJCQlnb3RvIGVuZDsKIAkJfQogCX0gZWxzZSB7CkBAIC0xNjQxLDkgKzE2OTQsOCBAQAogCQkJaWYgKChzYnMtPnNic21fYmF0dGVyaWVzX3N1cHBvcnRlZCAmICgxIDw8IGlkKSkpIHsKIAkJCQlyZXN1bHQgPSBhY3BpX2JhdHRlcnlfYWRkKHNicywgaWQpOwogCQkJCWlmIChyZXN1bHQpIHsKLQkJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkJCQkgICJhY3BpX2JhdHRlcnlfYWRkKCkgIgotCQkJCQkJCSAgImZhaWxlZFxuIikpOworCQkJCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgQUVfRVJST1IsCisJCQkJCQkJImFjcGlfYmF0dGVyeV9hZGQoKSBmYWlsZWQiKSk7CiAJCQkJCWdvdG8gZW5kOwogCQkJCX0KIAkJCX0KQEAgLTE2NTMsMzMgKzE3MDUsMjYgQEAKIAlzYnMtPmhhbmRsZSA9IGRldmljZS0+aGFuZGxlOwogCiAJaW5pdF90aW1lcigmc2JzLT51cGRhdGVfdGltZXIpOwotCWlmICh1cGRhdGVfbW9kZSA9PSBRVUVVRV9VUERBVEVfTU9ERSkgewotCQlzdGF0dXMgPSBhY3BpX29zX2V4ZWN1dGUoT1NMX0dQRV9IQU5ETEVSLAotCQkJCQkgYWNwaV9zYnNfdXBkYXRlX3F1ZXVlLCBzYnMpOwotCQlpZiAoc3RhdHVzICE9IEFFX09LKSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCQkgICJhY3BpX29zX2V4ZWN1dGUoKSBmYWlsZWRcbiIpKTsKLQkJfQotCX0KLQlzYnMtPnVwZGF0ZV90aW1lID0gdXBkYXRlX3RpbWU7Ci0Jc2JzLT51cGRhdGVfdGltZTIgPSB1cGRhdGVfdGltZTI7Ci0KLQlwcmludGsoS0VSTl9JTkZPIFBSRUZJWCAiJXMgWyVzXVxuIiwKLQkgICAgICAgYWNwaV9kZXZpY2VfbmFtZShkZXZpY2UpLCBhY3BpX2RldmljZV9iaWQoZGV2aWNlKSk7CisJcmVzdWx0ID0gYWNwaV9jaGVja191cGRhdGVfcHJvYyhzYnMpOworCWlmIChyZXN1bHQpCisJCWdvdG8gZW5kOwogCiAgICAgICBlbmQ6CisKKwlzYnNfbXV0ZXhfdW5sb2NrKHNicyk7CisKIAlpZiAocmVzdWx0KSB7CiAJCXJlbW92ZV9yZXN1bHQgPSBhY3BpX3Nic19yZW1vdmUoZGV2aWNlLCAwKTsKIAkJaWYgKHJlbW92ZV9yZXN1bHQpIHsKLQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJCSAgImFjcGlfc2JzX3JlbW92ZSgpIGZhaWxlZFxuIikpOworCQkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIEFFX0VSUk9SLAorCQkJCQkiYWNwaV9zYnNfcmVtb3ZlKCkgZmFpbGVkIikpOwogCQl9CiAJfQogCiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotaW50IGFjcGlfc2JzX3JlbW92ZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpCitzdGF0aWMgaW50IGFjcGlfc2JzX3JlbW92ZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpCiB7CiAJc3RydWN0IGFjcGlfc2JzICpzYnM7CiAJaW50IGlkOwpAQCAtMTY4OCwxNSArMTczMywxNCBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlzYnMgPSAoc3RydWN0IGFjcGlfc2JzICopYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpOwotCisJc2JzID0gYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpOwogCWlmICghc2JzKSB7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCXNic19tdXRleF9sb2NrKHNicyk7CisKIAlzYnMtPnpvbWJpZSA9IDE7Ci0Jc2JzLT51cGRhdGVfdGltZSA9IDA7Ci0Jc2JzLT51cGRhdGVfdGltZTIgPSAwOwogCWRlbF90aW1lcl9zeW5jKCZzYnMtPnVwZGF0ZV90aW1lcik7CiAJYWNwaV9vc193YWl0X2V2ZW50c19jb21wbGV0ZShOVUxMKTsKIAlkZWxfdGltZXJfc3luYygmc2JzLT51cGRhdGVfdGltZXIpOwpAQCAtMTcwNywxMSArMTc1MSw0MSBAQAogCiAJYWNwaV9hY19yZW1vdmUoc2JzKTsKIAorCXNic19tdXRleF91bmxvY2soc2JzKTsKKworCW11dGV4X2Rlc3Ryb3koJnNicy0+bXV0ZXgpOworCiAJa2ZyZWUoc2JzKTsKIAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBhY3BpX3Nic19ybWRpcnModm9pZCkKK3sKKwlpZiAoYWNwaV9hY19kaXIpIHsKKwkJYWNwaV91bmxvY2tfYWNfZGlyKGFjcGlfYWNfZGlyKTsKKwkJYWNwaV9hY19kaXIgPSBOVUxMOworCX0KKwlpZiAoYWNwaV9iYXR0ZXJ5X2RpcikgeworCQlhY3BpX3VubG9ja19iYXR0ZXJ5X2RpcihhY3BpX2JhdHRlcnlfZGlyKTsKKwkJYWNwaV9iYXR0ZXJ5X2RpciA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgaW50IGFjcGlfc2JzX3Jlc3VtZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKK3sKKwlzdHJ1Y3QgYWNwaV9zYnMgKnNiczsKKworCWlmICghZGV2aWNlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNicyA9IGRldmljZS0+ZHJpdmVyX2RhdGE7CisKKwlzYnMtPnJ1bl9jbnQgPSAwOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgX19pbml0IGFjcGlfc2JzX2luaXQodm9pZCkKIHsKIAlpbnQgcmVzdWx0ID0gMDsKQEAgLTE3MTksMzUgKzE3OTMsMzQgQEAKIAlpZiAoYWNwaV9kaXNhYmxlZCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlpbml0X01VVEVYKCZzYnNfc2VtKTsKLQogCWlmIChjYXBhY2l0eV9tb2RlICE9IERFRl9DQVBBQ0lUWV9VTklUCiAJICAgICYmIGNhcGFjaXR5X21vZGUgIT0gTUFIX0NBUEFDSVRZX1VOSVQKIAkgICAgJiYgY2FwYWNpdHlfbW9kZSAhPSBNV0hfQ0FQQUNJVFlfVU5JVCkgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiYWNwaV9zYnNfaW5pdDogIgotCQkJCSAgImludmFsaWQgY2FwYWNpdHlfbW9kZSA9ICVkXG4iLAotCQkJCSAgY2FwYWNpdHlfbW9kZSkpOworCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgQUVfRVJST1IsCisJCQkJImludmFsaWQgY2FwYWNpdHlfbW9kZSA9ICVkIiwgY2FwYWNpdHlfbW9kZSkpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlhY3BpX2FjX2RpciA9IGFjcGlfbG9ja19hY19kaXIoKTsKIAlpZiAoIWFjcGlfYWNfZGlyKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJICAiYWNwaV9sb2NrX2FjX2RpcigpIGZhaWxlZFxuIikpOworCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgQUVfRVJST1IsCisJCQkJImFjcGlfbG9ja19hY19kaXIoKSBmYWlsZWQiKSk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAogCWFjcGlfYmF0dGVyeV9kaXIgPSBhY3BpX2xvY2tfYmF0dGVyeV9kaXIoKTsKIAlpZiAoIWFjcGlfYmF0dGVyeV9kaXIpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkgICJhY3BpX2xvY2tfYmF0dGVyeV9kaXIoKSBmYWlsZWRcbiIpKTsKKwkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIEFFX0VSUk9SLAorCQkJCSJhY3BpX2xvY2tfYmF0dGVyeV9kaXIoKSBmYWlsZWQiKSk7CisJCWFjcGlfc2JzX3JtZGlycygpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKIAlyZXN1bHQgPSBhY3BpX2J1c19yZWdpc3Rlcl9kcml2ZXIoJmFjcGlfc2JzX2RyaXZlcik7CiAJaWYgKHJlc3VsdCA8IDApIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkgICJhY3BpX2J1c19yZWdpc3Rlcl9kcml2ZXIoKSBmYWlsZWRcbiIpKTsKKwkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIEFFX0VSUk9SLAorCQkJCSJhY3BpX2J1c19yZWdpc3Rlcl9kcml2ZXIoKSBmYWlsZWQiKSk7CisJCWFjcGlfc2JzX3JtZGlycygpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKQEAgLTE3NTYsMTMgKzE4MjksOSBAQAogCiBzdGF0aWMgdm9pZCBfX2V4aXQgYWNwaV9zYnNfZXhpdCh2b2lkKQogewotCiAJYWNwaV9idXNfdW5yZWdpc3Rlcl9kcml2ZXIoJmFjcGlfc2JzX2RyaXZlcik7CiAKLQlhY3BpX3VubG9ja19hY19kaXIoYWNwaV9hY19kaXIpOwotCWFjcGlfYWNfZGlyID0gTlVMTDsKLQlhY3BpX3VubG9ja19iYXR0ZXJ5X2RpcihhY3BpX2JhdHRlcnlfZGlyKTsKLQlhY3BpX2JhdHRlcnlfZGlyID0gTlVMTDsKKwlhY3BpX3Nic19ybWRpcnMoKTsKIAogCXJldHVybjsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9zY2FuLmMgYi9kcml2ZXJzL2FjcGkvc2Nhbi5jCmluZGV4IGJiMGUwZGEuLmQ4MGRkODQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9zY2FuLmMKKysrIGIvZHJpdmVycy9hY3BpL3NjYW4uYwpAQCAtMTA2OCw3ICsxMDY4LDkgQEAKIAkJfQogCQlicmVhazsKIAlkZWZhdWx0OgotCQlTVFJVQ1RfVE9fSU5UKGRldmljZS0+c3RhdHVzKSA9IDB4MEY7CisJCVNUUlVDVF9UT19JTlQoZGV2aWNlLT5zdGF0dXMpID0KKwkJICAgIEFDUElfU1RBX0RFVklDRV9QUkVTRU5UIHwgQUNQSV9TVEFfREVWSUNFX0VOQUJMRUQgfAorCQkgICAgQUNQSV9TVEFfREVWSUNFX1VJICAgICAgfCBBQ1BJX1NUQV9ERVZJQ0VfRlVOQ1RJT05JTkc7CiAJCWJyZWFrOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3NsZWVwL21haW4uYyBiL2RyaXZlcnMvYWNwaS9zbGVlcC9tYWluLmMKaW5kZXggMzdhMDkzMC4uZjhjNjM0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3NsZWVwL21haW4uYworKysgYi9kcml2ZXJzL2FjcGkvc2xlZXAvbWFpbi5jCkBAIC0xNjgsOSArMTY4LDE4IEBACiAKIHN0YXRpYyBpbnQgYWNwaV9wbV9zdGF0ZV92YWxpZChzdXNwZW5kX3N0YXRlX3QgcG1fc3RhdGUpCiB7Ci0JdTMyIGFjcGlfc3RhdGUgPSBhY3BpX3N1c3BlbmRfc3RhdGVzW3BtX3N0YXRlXTsKKwl1MzIgYWNwaV9zdGF0ZTsKIAotCXJldHVybiBzbGVlcF9zdGF0ZXNbYWNwaV9zdGF0ZV07CisJc3dpdGNoIChwbV9zdGF0ZSkgeworCWNhc2UgUE1fU1VTUEVORF9PTjoKKwljYXNlIFBNX1NVU1BFTkRfU1RBTkRCWToKKwljYXNlIFBNX1NVU1BFTkRfTUVNOgorCQlhY3BpX3N0YXRlID0gYWNwaV9zdXNwZW5kX3N0YXRlc1twbV9zdGF0ZV07CisKKwkJcmV0dXJuIHNsZWVwX3N0YXRlc1thY3BpX3N0YXRlXTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcG1fb3BzIGFjcGlfcG1fb3BzID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3NsZWVwL3Byb2MuYyBiL2RyaXZlcnMvYWNwaS9zbGVlcC9wcm9jLmMKaW5kZXggY2NjMTFiMy4uMmQ5MTJiNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3NsZWVwL3Byb2MuYworKysgYi9kcml2ZXJzL2FjcGkvc2xlZXAvcHJvYy5jCkBAIC0zNTAsMjEgKzM1MCwzMSBAQAogewogCXN0cnVjdCBsaXN0X2hlYWQgKm5vZGUsICpuZXh0OwogCi0Jc2VxX3ByaW50ZihzZXEsICJEZXZpY2UJU2xlZXAgc3RhdGUJU3RhdHVzXG4iKTsKKwlzZXFfcHJpbnRmKHNlcSwgIkRldmljZVx0Uy1zdGF0ZVx0ICBTdGF0dXMgICBTeXNmcyBub2RlXG4iKTsKIAogCXNwaW5fbG9jaygmYWNwaV9kZXZpY2VfbG9jayk7CiAJbGlzdF9mb3JfZWFjaF9zYWZlKG5vZGUsIG5leHQsICZhY3BpX3dha2V1cF9kZXZpY2VfbGlzdCkgewogCQlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldiA9CiAJCSAgICBjb250YWluZXJfb2Yobm9kZSwgc3RydWN0IGFjcGlfZGV2aWNlLCB3YWtldXBfbGlzdCk7CisJCXN0cnVjdCBkZXZpY2UgKmxkZXY7CiAKIAkJaWYgKCFkZXYtPndha2V1cC5mbGFncy52YWxpZCkKIAkJCWNvbnRpbnVlOwogCQlzcGluX3VubG9jaygmYWNwaV9kZXZpY2VfbG9jayk7Ci0JCXNlcV9wcmludGYoc2VxLCAiJTRzCSU0ZAkJJXMlOHNcbiIsCisKKwkJbGRldiA9IGFjcGlfZ2V0X3BoeXNpY2FsX2RldmljZShkZXYtPmhhbmRsZSk7CisJCXNlcV9wcmludGYoc2VxLCAiJXNcdCAgUyVkXHQlYyUtOHMgICIsCiAJCQkgICBkZXYtPnBucC5idXNfaWQsCiAJCQkgICAodTMyKSBkZXYtPndha2V1cC5zbGVlcF9zdGF0ZSwKLQkJCSAgIGRldi0+d2FrZXVwLmZsYWdzLnJ1bl93YWtlID8gIioiIDogIiIsCisJCQkgICBkZXYtPndha2V1cC5mbGFncy5ydW5fd2FrZSA/ICcqJyA6ICcgJywKIAkJCSAgIGRldi0+d2FrZXVwLnN0YXRlLmVuYWJsZWQgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKKwkJaWYgKGxkZXYpCisJCQlzZXFfcHJpbnRmKHNlcSwgIiVzOiVzIiwKKwkJCQlsZGV2LT5idXMgPyBsZGV2LT5idXMtPm5hbWUgOiAibm8tYnVzIiwKKwkJCQlsZGV2LT5idXNfaWQpOworCQlzZXFfcHJpbnRmKHNlcSwgIlxuIik7CisJCXB1dF9kZXZpY2UobGRldik7CisKIAkJc3Bpbl9sb2NrKCZhY3BpX2RldmljZV9sb2NrKTsKIAl9CiAJc3Bpbl91bmxvY2soJmFjcGlfZGV2aWNlX2xvY2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3RhYmxlcy90YmZhZHQuYyBiL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJmYWR0LmMKaW5kZXggODA3YzcxMS4uMWRiODMzZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3RhYmxlcy90YmZhZHQuYworKysgYi9kcml2ZXJzL2FjcGkvdGFibGVzL3RiZmFkdC5jCkBAIC0zNDcsNiArMzQ3LDE4IEBACiAJCWFjcGlfZ2JsX3hwbTFiX2VuYWJsZS5zcGFjZV9pZCA9IGFjcGlfZ2JsX0ZBRFQueHBtMWFfZXZlbnRfYmxvY2suc3BhY2VfaWQ7CiAKIAl9CisKKwkvKgorCSAqIEZvciBBQ1BJIDEuMCBGQURUcywgZW5zdXJlIHRoYXQgcmVzZXJ2ZWQgZmllbGRzICh3aGljaCBzaG91bGQgYmUgemVybykKKwkgKiBhcmUgaW5kZWVkIHplcm8uIFRoaXMgd2lsbCB3b3JrYXJvdW5kIEJJT1NzIHRoYXQgaW5hZHZlcnRlbnRseSBwbGFjZWQKKwkgKiB2YWx1ZXMgaW4gdGhlc2UgZmllbGRzLgorCSAqLworCWlmIChhY3BpX2dibF9GQURULmhlYWRlci5yZXZpc2lvbiA8IDMpIHsKKwkJYWNwaV9nYmxfRkFEVC5wcmVmZXJyZWRfcHJvZmlsZSA9IDA7CisJCWFjcGlfZ2JsX0ZBRFQucHN0YXRlX2NvbnRyb2wgPSAwOworCQlhY3BpX2dibF9GQURULmNzdF9jb250cm9sID0gMDsKKwkJYWNwaV9nYmxfRkFEVC5ib290X2ZsYWdzID0gMDsKKwl9CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYW1iYS9idXMuYyBiL2RyaXZlcnMvYW1iYS9idXMuYwppbmRleCBmZDU0NzUwLi4yNjhlMzAxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FtYmEvYnVzLmMKKysrIGIvZHJpdmVycy9hbWJhL2J1cy5jCkBAIC00NywxNCArNDcsMTMgQEAKIHN0YXRpYyBpbnQgYW1iYV91ZXZlbnQoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICoqZW52cCwgaW50IG5yX2VudiwgY2hhciAqYnVmLCBpbnQgYnVmc3opCiB7CiAJc3RydWN0IGFtYmFfZGV2aWNlICpwY2RldiA9IHRvX2FtYmFfZGV2aWNlKGRldik7CisJaW50IHJldHZhbCA9IDAsIGkgPSAwLCBsZW4gPSAwOwogCi0JaWYgKG5yX2VudiA8IDIpCi0JCXJldHVybiAtRU5PTUVNOwotCi0Jc25wcmludGYoYnVmLCBidWZzeiwgIkFNQkFfSUQ9JTA4eCIsIHBjZGV2LT5wZXJpcGhpZCk7Ci0JKmVudnArKyA9IGJ1ZjsKLQkqZW52cCsrID0gTlVMTDsKLQlyZXR1cm4gMDsKKwlyZXR2YWwgPSBhZGRfdWV2ZW50X3ZhcihlbnZwLCBucl9lbnYsICZpLAorCQkJCWJ1ZiwgYnVmc3osICZsZW4sCisJCQkJIkFNQkFfSUQ9JTA4eCIsIHBjZGV2LT5wZXJpcGhpZCk7CisJZW52cFtpXSA9IE5VTEw7CisJcmV0dXJuIHJldHZhbDsKIH0KICNlbHNlCiAjZGVmaW5lIGFtYmFfdWV2ZW50IE5VTEwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL0tjb25maWcgYi9kcml2ZXJzL2F0YS9LY29uZmlnCmluZGV4IDdiZGJlNWEuLjM2NWMzMDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL0tjb25maWcKKysrIGIvZHJpdmVycy9hdGEvS2NvbmZpZwpAQCAtMTU2LDExICsxNTYsNiBAQAogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgSW5pdGlvIDE2MnggU2VyaWFsIEFUQS4KIAotY29uZmlnIFNBVEFfSU5URUxfQ09NQklORUQKLQlib29sCi0JZGVwZW5kcyBvbiBJREU9eSAmJiAhQkxLX0RFVl9JREVfU0FUQSAmJiAoU0FUQV9BSENJIHx8IEFUQV9QSUlYKQotCWRlZmF1bHQgeQotCiBjb25maWcgU0FUQV9BQ1BJCiAJYm9vbAogCWRlcGVuZHMgb24gQUNQSSAmJiBQQ0kKQEAgLTE4NCw3ICsxNzksNyBAQAogCSAgSWYgdW5zdXJlLCBzYXkgTi4KIAogY29uZmlnIFBBVEFfQU1ECi0JdHJpc3RhdGUgIkFNRC9OVmlkaWEgUEFUQSBzdXBwb3J0IChFeHBlcmltZW50YWwpIgorCXRyaXN0YXRlICJBTUQvTlZpZGlhIFBBVEEgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFBDSQogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIEFNRCBhbmQgTlZpZGlhIFBBVEEKQEAgLTIwOSw2ICsyMDQsMTYgQEAKIAogCSAgSWYgdW5zdXJlLCBzYXkgTi4KIAorY29uZmlnIFBBVEFfQ01ENjQwX1BDSQorCXRyaXN0YXRlICJDTUQ2NDAgUENJIFBBVEEgc3VwcG9ydCAoVmVyeSBFeHBlcmltZW50YWwpIgorCWRlcGVuZHMgb24gUENJICYmIEVYUEVSSU1FTlRBTAorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIENNRDY0MCBQQ0kgSURFCisJICBpbnRlcmZhY2UgY2hpcC4gT25seSB0aGUgcHJpbWFyeSBjaGFubmVsIGlzIGN1cnJlbnRseQorCSAgc3VwcG9ydGVkLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCiBjb25maWcgUEFUQV9DTUQ2NFgKIAl0cmlzdGF0ZSAiQ01ENjR4IFBBVEEgc3VwcG9ydCAoVmVyeSBFeHBlcmltZW50YWwpIgogCWRlcGVuZHMgb24gUENJJiYgRVhQRVJJTUVOVEFMCkBAIC0yNzMsNyArMjc4LDcgQEAKIAkgIElmIHVuc3VyZSwgc2F5IE4uCiAKIGNvbmZpZyBQQVRBX0hQVDM2NgotCXRyaXN0YXRlICJIUFQgMzY2LzM2OCBQQVRBIHN1cHBvcnQgKFZlcnkgRXhwZXJpbWVudGFsKSIKKwl0cmlzdGF0ZSAiSFBUIDM2Ni8zNjggUEFUQSBzdXBwb3J0IChFeHBlcmltZW50YWwpIgogCWRlcGVuZHMgb24gUENJICYmIEVYUEVSSU1FTlRBTAogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIEhQVCAzNjYgYW5kIDM2OApAQCAtMjgyLDcgKzI4Nyw3IEBACiAJICBJZiB1bnN1cmUsIHNheSBOLgogCiBjb25maWcgUEFUQV9IUFQzN1gKLQl0cmlzdGF0ZSAiSFBUIDM3MC8zNzBBLzM3MS8zNzIvMzc0LzMwMiBQQVRBIHN1cHBvcnQgKFZlcnkgRXhwZXJpbWVudGFsKSIKKwl0cmlzdGF0ZSAiSFBUIDM3MC8zNzBBLzM3MS8zNzIvMzc0LzMwMiBQQVRBIHN1cHBvcnQgKEV4cGVyaW1lbnRhbCkiCiAJZGVwZW5kcyBvbiBQQ0kgJiYgRVhQRVJJTUVOVEFMCiAJaGVscAogCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgbWFqb3JpdHkgb2YgdGhlIGxhdGVyIEhQVApAQCAtMzA5LDcgKzMxNCw3IEBACiAJICBJZiB1bnN1cmUsIHNheSBOLgogCiBjb25maWcgUEFUQV9JU0FQTlAKLQl0cmlzdGF0ZSAiSVNBIFBsdWcgYW5kIFBsYXkgUEFUQSBzdXBwb3J0IChWZXJ5IEV4cGVyaW1lbnRhbCkiCisJdHJpc3RhdGUgIklTQSBQbHVnIGFuZCBQbGF5IFBBVEEgc3VwcG9ydCAoRXhwZXJpbWVudGFsKSIKIAlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTCAmJiBJU0FQTlAKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIElTQSBwbHVnICYgcGxheSBBVEEKQEAgLTMxOCw4ICszMjMsOCBAQAogCSAgSWYgdW5zdXJlLCBzYXkgTi4KIAogY29uZmlnIFBBVEFfSVQ4MjFYCi0JdHJpc3RhdGUgIklUODIxMS8yIFBBVEEgc3VwcG9ydCAoRXhwZXJpbWVudGFsKSIKLQlkZXBlbmRzIG9uIFBDSSAmJiBFWFBFUklNRU5UQUwKKwl0cmlzdGF0ZSAiSVQ4MjExLzIgUEFUQSBzdXBwb3J0IgorCWRlcGVuZHMgb24gUENJCiAJaGVscAogCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgSVRFIDgyMTEgYW5kIDgyMTIKIAkgIFBBVEEgY29udHJvbGxlcnMgdmlhIHRoZSBuZXcgQVRBIGxheWVyLCBpbmNsdWRpbmcgUkFJRApAQCAtMzkwLDEwICszOTUsMTAgQEAKIAkgIElmIHVuc3VyZSwgc2F5IE4uCiAKIGNvbmZpZyBQQVRBX09MRFBJSVgKLQl0cmlzdGF0ZSAiSW50ZWwgUEFUQSBvbGQgUElJWCBzdXBwb3J0IChFeHBlcmltZW50YWwpIgotCWRlcGVuZHMgb24gUENJICYmIEVYUEVSSU1FTlRBTAorCXRyaXN0YXRlICJJbnRlbCBQQVRBIG9sZCBQSUlYIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBQQ0kKIAloZWxwCi0JICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIG9sZCg/KSBQSUlYIFBBVEEgc3VwcG9ydC4KKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgZWFybHkgUElJWCBQQVRBIHN1cHBvcnQuCiAKIAkgIElmIHVuc3VyZSwgc2F5IE4uCiAKQEAgLTQ0NCw3ICs0NDksNyBAQAogCSAgSWYgdW5zdXJlLCBzYXkgTi4KIAogY29uZmlnIFBBVEFfUERDX09MRAotCXRyaXN0YXRlICJPbGRlciBQcm9taXNlIFBBVEEgY29udHJvbGxlciBzdXBwb3J0IChWZXJ5IEV4cGVyaW1lbnRhbCkiCisJdHJpc3RhdGUgIk9sZGVyIFByb21pc2UgUEFUQSBjb250cm9sbGVyIHN1cHBvcnQgKEV4cGVyaW1lbnRhbCkiCiAJZGVwZW5kcyBvbiBQQ0kgJiYgRVhQRVJJTUVOVEFMCiAJaGVscAogCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgUHJvbWlzZSAyMDI0NiwgMjAyNjIsIDIwMjYzLApAQCAtNDU5LDcgKzQ2NCw3IEBACiAJICBTdXBwb3J0IGZvciBRREkgNjUwMCBhbmQgNjU4MCBQQVRBIGNvbnRyb2xsZXJzIG9uIFZFU0EgbG9jYWwgYnVzLgogCiBjb25maWcgUEFUQV9SQURJU1lTCi0JdHJpc3RhdGUgIlJBRElTWVMgODI2MDAgUEFUQSBzdXBwb3J0IChWZXJ5IGV4cGVyaW1lbnRhbCkiCisJdHJpc3RhdGUgIlJBRElTWVMgODI2MDAgUEFUQSBzdXBwb3J0IChWZXJ5IEV4cGVyaW1lbnRhbCkiCiAJZGVwZW5kcyBvbiBQQ0kgJiYgRVhQRVJJTUVOVEFMCiAJaGVscAogCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgUkFESVNZUyA4MjYwMApAQCAtNDc3LDcgKzQ4Miw3IEBACiAJICBJZiB1bnN1cmUsIHNheSBOLgogCiBjb25maWcgUEFUQV9TQzEyMDAKLQl0cmlzdGF0ZSAiU0MxMjAwIFBBVEEgc3VwcG9ydCAoUmF2aW5nIEx1bmF0aWMpIgorCXRyaXN0YXRlICJTQzEyMDAgUEFUQSBzdXBwb3J0IChWZXJ5IEV4cGVyaW1lbnRhbCkiCiAJZGVwZW5kcyBvbiBQQ0kgJiYgRVhQRVJJTUVOVEFMCiAJaGVscAogCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgTmF0U2VtaS9BTUQgU0MxMjAwIFNvQwpAQCAtNDg2LDggKzQ5MSw4IEBACiAJICBJZiB1bnN1cmUsIHNheSBOLgogCiBjb25maWcgUEFUQV9TRVJWRVJXT1JLUwotCXRyaXN0YXRlICJTRVJWRVJXT1JLUyBPU0I0L0NTQjUvQ1NCNi9IVDEwMDAgUEFUQSBzdXBwb3J0IChFeHBlcmltZW50YWwpIgotCWRlcGVuZHMgb24gUENJICYmIEVYUEVSSU1FTlRBTAorCXRyaXN0YXRlICJTRVJWRVJXT1JLUyBPU0I0L0NTQjUvQ1NCNi9IVDEwMDAgUEFUQSBzdXBwb3J0IgorCWRlcGVuZHMgb24gUENJCiAJaGVscAogCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgU2VydmVyd29ya3MgT1NCNC9DU0I1L0NTQjYgYW5kCiAJICBIVDEwMDAgUEFUQSBjb250cm9sbGVycywgdmlhIHRoZSBuZXcgQVRBIGxheWVyLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvTWFrZWZpbGUgYi9kcml2ZXJzL2F0YS9NYWtlZmlsZQppbmRleCAxM2Q3Mzk3Li5iNzA1NWUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2F0YS9NYWtlZmlsZQpAQCAtMjIsNiArMjIsNyBAQAogb2JqLSQoQ09ORklHX1BBVEFfQU1EKQkJKz0gcGF0YV9hbWQubwogb2JqLSQoQ09ORklHX1BBVEFfQVJUT1ApCSs9IHBhdGFfYXJ0b3Aubwogb2JqLSQoQ09ORklHX1BBVEFfQVRJSVhQKQkrPSBwYXRhX2F0aWl4cC5vCitvYmotJChDT05GSUdfUEFUQV9DTUQ2NDBfUENJKQkrPSBwYXRhX2NtZDY0MC5vCiBvYmotJChDT05GSUdfUEFUQV9DTUQ2NFgpCSs9IHBhdGFfY21kNjR4Lm8KIG9iai0kKENPTkZJR19QQVRBX0NTNTUyMCkJKz0gcGF0YV9jczU1MjAubwogb2JqLSQoQ09ORklHX1BBVEFfQ1M1NTMwKQkrPSBwYXRhX2NzNTUzMC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9haGNpLmMgYi9kcml2ZXJzL2F0YS9haGNpLmMKaW5kZXggZmQyNzIyNy4uMzRjNTUzNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvYWhjaS5jCisrKyBiL2RyaXZlcnMvYXRhL2FoY2kuYwpAQCAtMTcwLDYgKzE3MCwxMCBAQAogCUFIQ0lfRkxBR19JR05fSVJRX0lGX0VSUgk9ICgxIDw8IDI1KSwgLyogaWdub3JlIElSUV9JRl9FUlIgKi8KIAlBSENJX0ZMQUdfSE9OT1JfUEkJCT0gKDEgPDwgMjYpLCAvKiBob25vciBQT1JUU19JTVBMICovCiAJQUhDSV9GTEFHX0lHTl9TRVJSX0lOVEVSTkFMCT0gKDEgPDwgMjcpLCAvKiBpZ25vcmUgU0VSUl9JTlRFUk5BTCAqLworCisJQUhDSV9GTEFHX0NPTU1PTgkJPSBBVEFfRkxBR19TQVRBIHwgQVRBX0ZMQUdfTk9fTEVHQUNZIHwKKwkJCQkJICBBVEFfRkxBR19NTUlPIHwgQVRBX0ZMQUdfUElPX0RNQSB8CisJCQkJCSAgQVRBX0ZMQUdfU0tJUF9EMkhfQlNZLAogfTsKIAogc3RydWN0IGFoY2lfY21kX2hkciB7CkBAIC0xODgsOCArMTkyLDEwIEBACiB9OwogCiBzdHJ1Y3QgYWhjaV9ob3N0X3ByaXYgewotCXUzMgkJCWNhcDsJLyogY2FjaGUgb2YgSE9TVF9DQVAgcmVnaXN0ZXIgKi8KLQl1MzIJCQlwb3J0X21hcDsgLyogY2FjaGUgb2YgSE9TVF9QT1JUU19JTVBMIHJlZyAqLworCXUzMgkJCWNhcDsJCS8qIGNhcCB0byB1c2UgKi8KKwl1MzIJCQlwb3J0X21hcDsJLyogcG9ydCBtYXAgdG8gdXNlICovCisJdTMyCQkJc2F2ZWRfY2FwOwkvKiBzYXZlZCBpbml0aWFsIGNhcCAqLworCXUzMgkJCXNhdmVkX3BvcnRfbWFwOwkvKiBzYXZlZCBpbml0aWFsIHBvcnRfbWFwICovCiB9OwogCiBzdHJ1Y3QgYWhjaV9wb3J0X3ByaXYgewpAQCAtMjA5LDcgKzIxNSw2IEBACiBzdGF0aWMgdm9pZCBhaGNpX3Njcl93cml0ZSAoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IHNjX3JlZywgdTMyIHZhbCk7CiBzdGF0aWMgaW50IGFoY2lfaW5pdF9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KTsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgYWhjaV9xY19pc3N1ZShzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKTsKLXN0YXRpYyBpcnFyZXR1cm5fdCBhaGNpX2ludGVycnVwdCAoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlKTsKIHN0YXRpYyB2b2lkIGFoY2lfaXJxX2NsZWFyKHN0cnVjdCBhdGFfcG9ydCAqYXApOwogc3RhdGljIGludCBhaGNpX3BvcnRfc3RhcnQoc3RydWN0IGF0YV9wb3J0ICphcCk7CiBzdGF0aWMgdm9pZCBhaGNpX3BvcnRfc3RvcChzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKQEAgLTI2Myw3ICsyNjgsNiBAQAogCS5xY19wcmVwCQk9IGFoY2lfcWNfcHJlcCwKIAkucWNfaXNzdWUJCT0gYWhjaV9xY19pc3N1ZSwKIAotCS5pcnFfaGFuZGxlcgkJPSBhaGNpX2ludGVycnVwdCwKIAkuaXJxX2NsZWFyCQk9IGFoY2lfaXJxX2NsZWFyLAogCS5pcnFfb24JCQk9IGF0YV9kdW1teV9pcnFfb24sCiAJLmlycV9hY2sJCT0gYXRhX2R1bW15X2lycV9hY2ssCkBAIC0yOTgsNyArMzAyLDYgQEAKIAkucWNfcHJlcAkJPSBhaGNpX3FjX3ByZXAsCiAJLnFjX2lzc3VlCQk9IGFoY2lfcWNfaXNzdWUsCiAKLQkuaXJxX2hhbmRsZXIJCT0gYWhjaV9pbnRlcnJ1cHQsCiAJLmlycV9jbGVhcgkJPSBhaGNpX2lycV9jbGVhciwKIAkuaXJxX29uCQkJPSBhdGFfZHVtbXlfaXJxX29uLAogCS5pcnFfYWNrCQk9IGF0YV9kdW1teV9pcnFfYWNrLApAQCAtMzI0LDU4ICszMjcsNDEgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBhaGNpX3BvcnRfaW5mb1tdID0gewogCS8qIGJvYXJkX2FoY2kgKi8KIAl7Ci0JCS5zaHQJCT0gJmFoY2lfc2h0LAotCQkuZmxhZ3MJCT0gQVRBX0ZMQUdfU0FUQSB8IEFUQV9GTEFHX05PX0xFR0FDWSB8Ci0JCQkJICBBVEFfRkxBR19NTUlPIHwgQVRBX0ZMQUdfUElPX0RNQSB8Ci0JCQkJICBBVEFfRkxBR19TS0lQX0QySF9CU1ksCisJCS5mbGFncwkJPSBBSENJX0ZMQUdfQ09NTU9OLAogCQkucGlvX21hc2sJPSAweDFmLCAvKiBwaW8wLTQgKi8KIAkJLnVkbWFfbWFzawk9IDB4N2YsIC8qIHVkbWEwLTYgOyBGSVhNRSAqLwogCQkucG9ydF9vcHMJPSAmYWhjaV9vcHMsCiAJfSwKIAkvKiBib2FyZF9haGNpX3BpICovCiAJewotCQkuc2h0CQk9ICZhaGNpX3NodCwKLQkJLmZsYWdzCQk9IEFUQV9GTEFHX1NBVEEgfCBBVEFfRkxBR19OT19MRUdBQ1kgfAotCQkJCSAgQVRBX0ZMQUdfTU1JTyB8IEFUQV9GTEFHX1BJT19ETUEgfAotCQkJCSAgQVRBX0ZMQUdfU0tJUF9EMkhfQlNZIHwgQUhDSV9GTEFHX0hPTk9SX1BJLAorCQkuZmxhZ3MJCT0gQUhDSV9GTEFHX0NPTU1PTiB8IEFIQ0lfRkxBR19IT05PUl9QSSwKIAkJLnBpb19tYXNrCT0gMHgxZiwgLyogcGlvMC00ICovCiAJCS51ZG1hX21hc2sJPSAweDdmLCAvKiB1ZG1hMC02IDsgRklYTUUgKi8KIAkJLnBvcnRfb3BzCT0gJmFoY2lfb3BzLAogCX0sCiAJLyogYm9hcmRfYWhjaV92dDgyNTEgKi8KIAl7Ci0JCS5zaHQJCT0gJmFoY2lfc2h0LAotCQkuZmxhZ3MJCT0gQVRBX0ZMQUdfU0FUQSB8IEFUQV9GTEFHX05PX0xFR0FDWSB8Ci0JCQkJICBBVEFfRkxBR19NTUlPIHwgQVRBX0ZMQUdfUElPX0RNQSB8Ci0JCQkJICBBVEFfRkxBR19TS0lQX0QySF9CU1kgfAotCQkJCSAgQVRBX0ZMQUdfSFJTVF9UT19SRVNVTUUgfCBBSENJX0ZMQUdfTk9fTkNRLAorCQkuZmxhZ3MJCT0gQUhDSV9GTEFHX0NPTU1PTiB8IEFUQV9GTEFHX0hSU1RfVE9fUkVTVU1FIHwKKwkJCQkgIEFIQ0lfRkxBR19OT19OQ1EsCiAJCS5waW9fbWFzawk9IDB4MWYsIC8qIHBpbzAtNCAqLwogCQkudWRtYV9tYXNrCT0gMHg3ZiwgLyogdWRtYTAtNiA7IEZJWE1FICovCiAJCS5wb3J0X29wcwk9ICZhaGNpX3Z0ODI1MV9vcHMsCiAJfSwKIAkvKiBib2FyZF9haGNpX2lnbl9pZmVyciAqLwogCXsKLQkJLnNodAkJPSAmYWhjaV9zaHQsCi0JCS5mbGFncwkJPSBBVEFfRkxBR19TQVRBIHwgQVRBX0ZMQUdfTk9fTEVHQUNZIHwKLQkJCQkgIEFUQV9GTEFHX01NSU8gfCBBVEFfRkxBR19QSU9fRE1BIHwKLQkJCQkgIEFUQV9GTEFHX1NLSVBfRDJIX0JTWSB8Ci0JCQkJICBBSENJX0ZMQUdfSUdOX0lSUV9JRl9FUlIsCisJCS5mbGFncwkJPSBBSENJX0ZMQUdfQ09NTU9OIHwgQUhDSV9GTEFHX0lHTl9JUlFfSUZfRVJSLAogCQkucGlvX21hc2sJPSAweDFmLCAvKiBwaW8wLTQgKi8KIAkJLnVkbWFfbWFzawk9IDB4N2YsIC8qIHVkbWEwLTYgOyBGSVhNRSAqLwogCQkucG9ydF9vcHMJPSAmYWhjaV9vcHMsCiAJfSwKIAkvKiBib2FyZF9haGNpX3NiNjAwICovCiAJewotCQkuc2h0CQk9ICZhaGNpX3NodCwKLQkJLmZsYWdzCQk9IEFUQV9GTEFHX1NBVEEgfCBBVEFfRkxBR19OT19MRUdBQ1kgfAotCQkJCSAgQVRBX0ZMQUdfTU1JTyB8IEFUQV9GTEFHX1BJT19ETUEgfAotCQkJCSAgQVRBX0ZMQUdfU0tJUF9EMkhfQlNZIHwKKwkJLmZsYWdzCQk9IEFIQ0lfRkxBR19DT01NT04gfAogCQkJCSAgQUhDSV9GTEFHX0lHTl9TRVJSX0lOVEVSTkFMLAogCQkucGlvX21hc2sJPSAweDFmLCAvKiBwaW8wLTQgKi8KIAkJLnVkbWFfbWFzawk9IDB4N2YsIC8qIHVkbWEwLTYgOyBGSVhNRSAqLwogCQkucG9ydF9vcHMJPSAmYWhjaV9vcHMsCiAJfSwKLQogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIGFoY2lfcGNpX3RibFtdID0gewpAQCAtNDEzLDExICszOTksMTEgQEAKIAkgIFBDSV9DTEFTU19TVE9SQUdFX1NBVEFfQUhDSSwgMHhmZmZmZmYsIGJvYXJkX2FoY2lfaWduX2lmZXJyIH0sCiAKIAkvKiBBVEkgKi8KLQl7IFBDSV9WREVWSUNFKEFUSSwgMHg0MzgwKSwgYm9hcmRfYWhjaV9zYjYwMCB9LCAvKiBBVEkgU0I2MDAgbm9uLXJhaWQgKi8KLQl7IFBDSV9WREVWSUNFKEFUSSwgMHg0MzgxKSwgYm9hcmRfYWhjaSB9LCAvKiBBVEkgU0I2MDAgcmFpZCAqLworCXsgUENJX1ZERVZJQ0UoQVRJLCAweDQzODApLCBib2FyZF9haGNpX3NiNjAwIH0sIC8qIEFUSSBTQjYwMCAqLwogCiAJLyogVklBICovCiAJeyBQQ0lfVkRFVklDRShWSUEsIDB4MzM0OSksIGJvYXJkX2FoY2lfdnQ4MjUxIH0sIC8qIFZJQSBWVDgyNTEgKi8KKwl7IFBDSV9WREVWSUNFKFZJQSwgMHg2Mjg3KSwgYm9hcmRfYWhjaV92dDgyNTEgfSwgLyogVklBIFZUODI1MSAqLwogCiAJLyogTlZJRElBICovCiAJeyBQQ0lfVkRFVklDRShOVklESUEsIDB4MDQ0YyksIGJvYXJkX2FoY2kgfSwJCS8qIE1DUDY1ICovCkBAIC00NzEsMTAgKzQ1NywxMDAgQEAKIAlyZXR1cm4gKGNhcCAmIDB4MWYpICsgMTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIF9faW9tZW0gKmFoY2lfcG9ydF9iYXNlKHZvaWQgX19pb21lbSAqYmFzZSwKLQkJCQkJICAgdW5zaWduZWQgaW50IHBvcnQpCitzdGF0aWMgaW5saW5lIHZvaWQgX19pb21lbSAqYWhjaV9wb3J0X2Jhc2Uoc3RydWN0IGF0YV9wb3J0ICphcCkKIHsKLQlyZXR1cm4gYmFzZSArIDB4MTAwICsgKHBvcnQgKiAweDgwKTsKKwl2b2lkIF9faW9tZW0gKm1taW8gPSBhcC0+aG9zdC0+aW9tYXBbQUhDSV9QQ0lfQkFSXTsKKworCXJldHVybiBtbWlvICsgMHgxMDAgKyAoYXAtPnBvcnRfbm8gKiAweDgwKTsKK30KKworLyoqCisgKglhaGNpX3NhdmVfaW5pdGlhbF9jb25maWcgLSBTYXZlIGFuZCBmaXh1cCBpbml0aWFsIGNvbmZpZyB2YWx1ZXMKKyAqCUBwZGV2OiB0YXJnZXQgUENJIGRldmljZQorICoJQHBpOiBhc3NvY2lhdGVkIEFUQSBwb3J0IGluZm8KKyAqCUBocHJpdjogaG9zdCBwcml2YXRlIGFyZWEgdG8gc3RvcmUgY29uZmlnIHZhbHVlcworICoKKyAqCVNvbWUgcmVnaXN0ZXJzIGNvbnRhaW5pbmcgY29uZmlndXJhdGlvbiBpbmZvIG1pZ2h0IGJlIHNldHVwIGJ5CisgKglCSU9TIGFuZCBtaWdodCBiZSBjbGVhcmVkIG9uIHJlc2V0LiAgVGhpcyBmdW5jdGlvbiBzYXZlcyB0aGUKKyAqCWluaXRpYWwgdmFsdWVzIG9mIHRob3NlIHJlZ2lzdGVycyBpbnRvIEBocHJpdiBzdWNoIHRoYXQgdGhleQorICoJY2FuIGJlIHJlc3RvcmVkIGFmdGVyIGNvbnRyb2xsZXIgcmVzZXQuCisgKgorICoJSWYgaW5jb25zaXN0ZW50LCBjb25maWcgdmFsdWVzIGFyZSBmaXhlZCB1cCBieSB0aGlzIGZ1bmN0aW9uLgorICoKKyAqCUxPQ0tJTkc6CisgKglOb25lLgorICovCitzdGF0aWMgdm9pZCBhaGNpX3NhdmVfaW5pdGlhbF9jb25maWcoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJICAgICBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqcGksCisJCQkJICAgICBzdHJ1Y3QgYWhjaV9ob3N0X3ByaXYgKmhwcml2KQoreworCXZvaWQgX19pb21lbSAqbW1pbyA9IHBjaW1faW9tYXBfdGFibGUocGRldilbQUhDSV9QQ0lfQkFSXTsKKwl1MzIgY2FwLCBwb3J0X21hcDsKKwlpbnQgaTsKKworCS8qIFZhbHVlcyBwcmVmaXhlZCB3aXRoIHNhdmVkXyBhcmUgd3JpdHRlbiBiYWNrIHRvIGhvc3QgYWZ0ZXIKKwkgKiByZXNldC4gIFZhbHVlcyB3aXRob3V0IGFyZSB1c2VkIGZvciBkcml2ZXIgb3BlcmF0aW9uLgorCSAqLworCWhwcml2LT5zYXZlZF9jYXAgPSBjYXAgPSByZWFkbChtbWlvICsgSE9TVF9DQVApOworCWhwcml2LT5zYXZlZF9wb3J0X21hcCA9IHBvcnRfbWFwID0gcmVhZGwobW1pbyArIEhPU1RfUE9SVFNfSU1QTCk7CisKKwkvKiBmaXh1cCB6ZXJvIHBvcnRfbWFwICovCisJaWYgKCFwb3J0X21hcCkgeworCQlwb3J0X21hcCA9ICgxIDw8IGFoY2lfbnJfcG9ydHMoaHByaXYtPmNhcCkpIC0gMTsKKwkJZGV2X3ByaW50ayhLRVJOX1dBUk5JTkcsICZwZGV2LT5kZXYsCisJCQkgICAiUE9SVFNfSU1QTCBpcyB6ZXJvLCBmb3JjaW5nIDB4JXhcbiIsIHBvcnRfbWFwKTsKKworCQkvKiB3cml0ZSB0aGUgZml4ZWQgdXAgdmFsdWUgdG8gdGhlIFBJIHJlZ2lzdGVyICovCisJCWhwcml2LT5zYXZlZF9wb3J0X21hcCA9IHBvcnRfbWFwOworCX0KKworCS8qIGNyb3NzIGNoZWNrIHBvcnRfbWFwIGFuZCBjYXAubl9wb3J0cyAqLworCWlmIChwaS0+ZmxhZ3MgJiBBSENJX0ZMQUdfSE9OT1JfUEkpIHsKKwkJdTMyIHRtcF9wb3J0X21hcCA9IHBvcnRfbWFwOworCQlpbnQgbl9wb3J0cyA9IGFoY2lfbnJfcG9ydHMoY2FwKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgQUhDSV9NQVhfUE9SVFMgJiYgbl9wb3J0czsgaSsrKSB7CisJCQlpZiAodG1wX3BvcnRfbWFwICYgKDEgPDwgaSkpIHsKKwkJCQluX3BvcnRzLS07CisJCQkJdG1wX3BvcnRfbWFwICY9IH4oMSA8PCBpKTsKKwkJCX0KKwkJfQorCisJCS8qIFdoaW5lIGlmIGluY29uc2lzdGVudC4gIE5vIG5lZWQgdG8gdXBkYXRlIGNhcC4KKwkJICogcG9ydF9tYXAgaXMgdXNlZCB0byBkZXRlcm1pbmUgbnVtYmVyIG9mIHBvcnRzLgorCQkgKi8KKwkJaWYgKG5fcG9ydHMgfHwgdG1wX3BvcnRfbWFwKQorCQkJZGV2X3ByaW50ayhLRVJOX1dBUk5JTkcsICZwZGV2LT5kZXYsCisJCQkJICAgIm5yX3BvcnRzICgldSkgYW5kIGltcGxlbWVudGVkIHBvcnQgbWFwICIKKwkJCQkgICAiKDB4JXgpIGRvbid0IG1hdGNoXG4iLAorCQkJCSAgIGFoY2lfbnJfcG9ydHMoY2FwKSwgcG9ydF9tYXApOworCX0gZWxzZSB7CisJCS8qIGZhYnJpY2F0ZSBwb3J0X21hcCBmcm9tIGNhcC5ucl9wb3J0cyAqLworCQlwb3J0X21hcCA9ICgxIDw8IGFoY2lfbnJfcG9ydHMoY2FwKSkgLSAxOworCX0KKworCS8qIHJlY29yZCB2YWx1ZXMgdG8gdXNlIGR1cmluZyBvcGVyYXRpb24gKi8KKwlocHJpdi0+Y2FwID0gY2FwOworCWhwcml2LT5wb3J0X21hcCA9IHBvcnRfbWFwOworfQorCisvKioKKyAqCWFoY2lfcmVzdG9yZV9pbml0aWFsX2NvbmZpZyAtIFJlc3RvcmUgaW5pdGlhbCBjb25maWcKKyAqCUBob3N0OiB0YXJnZXQgQVRBIGhvc3QKKyAqCisgKglSZXN0b3JlIGluaXRpYWwgY29uZmlnIHN0b3JlZCBieSBhaGNpX3NhdmVfaW5pdGlhbF9jb25maWcoKS4KKyAqCisgKglMT0NLSU5HOgorICoJTm9uZS4KKyAqLworc3RhdGljIHZvaWQgYWhjaV9yZXN0b3JlX2luaXRpYWxfY29uZmlnKHN0cnVjdCBhdGFfaG9zdCAqaG9zdCkKK3sKKwlzdHJ1Y3QgYWhjaV9ob3N0X3ByaXYgKmhwcml2ID0gaG9zdC0+cHJpdmF0ZV9kYXRhOworCXZvaWQgX19pb21lbSAqbW1pbyA9IGhvc3QtPmlvbWFwW0FIQ0lfUENJX0JBUl07CisKKwl3cml0ZWwoaHByaXYtPnNhdmVkX2NhcCwgbW1pbyArIEhPU1RfQ0FQKTsKKwl3cml0ZWwoaHByaXYtPnNhdmVkX3BvcnRfbWFwLCBtbWlvICsgSE9TVF9QT1JUU19JTVBMKTsKKwkodm9pZCkgcmVhZGwobW1pbyArIEhPU1RfUE9SVFNfSU1QTCk7CS8qIGZsdXNoICovCiB9CiAKIHN0YXRpYyB1MzIgYWhjaV9zY3JfcmVhZCAoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IHNjX3JlZ19pbikKQEAgLTUxMSw4ICs1ODcsOSBAQAogCXdyaXRlbCh2YWwsIGFwLT5pb2FkZHIuc2NyX2FkZHIgKyAoc2NfcmVnICogNCkpOwogfQogCi1zdGF0aWMgdm9pZCBhaGNpX3N0YXJ0X2VuZ2luZSh2b2lkIF9faW9tZW0gKnBvcnRfbW1pbykKK3N0YXRpYyB2b2lkIGFoY2lfc3RhcnRfZW5naW5lKHN0cnVjdCBhdGFfcG9ydCAqYXApCiB7CisJdm9pZCBfX2lvbWVtICpwb3J0X21taW8gPSBhaGNpX3BvcnRfYmFzZShhcCk7CiAJdTMyIHRtcDsKIAogCS8qIHN0YXJ0IERNQSAqLwpAQCAtNTIyLDggKzU5OSw5IEBACiAJcmVhZGwocG9ydF9tbWlvICsgUE9SVF9DTUQpOyAvKiBmbHVzaCAqLwogfQogCi1zdGF0aWMgaW50IGFoY2lfc3RvcF9lbmdpbmUodm9pZCBfX2lvbWVtICpwb3J0X21taW8pCitzdGF0aWMgaW50IGFoY2lfc3RvcF9lbmdpbmUoc3RydWN0IGF0YV9wb3J0ICphcCkKIHsKKwl2b2lkIF9faW9tZW0gKnBvcnRfbW1pbyA9IGFoY2lfcG9ydF9iYXNlKGFwKTsKIAl1MzIgdG1wOwogCiAJdG1wID0gcmVhZGwocG9ydF9tbWlvICsgUE9SVF9DTUQpOwpAQCAtNTQ1LDE5ICs2MjMsMjMgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgYWhjaV9zdGFydF9maXNfcngodm9pZCBfX2lvbWVtICpwb3J0X21taW8sIHUzMiBjYXAsCi0JCQkgICAgICBkbWFfYWRkcl90IGNtZF9zbG90X2RtYSwgZG1hX2FkZHJfdCByeF9maXNfZG1hKQorc3RhdGljIHZvaWQgYWhjaV9zdGFydF9maXNfcngoc3RydWN0IGF0YV9wb3J0ICphcCkKIHsKKwl2b2lkIF9faW9tZW0gKnBvcnRfbW1pbyA9IGFoY2lfcG9ydF9iYXNlKGFwKTsKKwlzdHJ1Y3QgYWhjaV9ob3N0X3ByaXYgKmhwcml2ID0gYXAtPmhvc3QtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgYWhjaV9wb3J0X3ByaXYgKnBwID0gYXAtPnByaXZhdGVfZGF0YTsKIAl1MzIgdG1wOwogCiAJLyogc2V0IEZJUyByZWdpc3RlcnMgKi8KLQlpZiAoY2FwICYgSE9TVF9DQVBfNjQpCi0JCXdyaXRlbCgoY21kX3Nsb3RfZG1hID4+IDE2KSA+PiAxNiwgcG9ydF9tbWlvICsgUE9SVF9MU1RfQUREUl9ISSk7Ci0Jd3JpdGVsKGNtZF9zbG90X2RtYSAmIDB4ZmZmZmZmZmYsIHBvcnRfbW1pbyArIFBPUlRfTFNUX0FERFIpOworCWlmIChocHJpdi0+Y2FwICYgSE9TVF9DQVBfNjQpCisJCXdyaXRlbCgocHAtPmNtZF9zbG90X2RtYSA+PiAxNikgPj4gMTYsCisJCSAgICAgICBwb3J0X21taW8gKyBQT1JUX0xTVF9BRERSX0hJKTsKKwl3cml0ZWwocHAtPmNtZF9zbG90X2RtYSAmIDB4ZmZmZmZmZmYsIHBvcnRfbW1pbyArIFBPUlRfTFNUX0FERFIpOwogCi0JaWYgKGNhcCAmIEhPU1RfQ0FQXzY0KQotCQl3cml0ZWwoKHJ4X2Zpc19kbWEgPj4gMTYpID4+IDE2LCBwb3J0X21taW8gKyBQT1JUX0ZJU19BRERSX0hJKTsKLQl3cml0ZWwocnhfZmlzX2RtYSAmIDB4ZmZmZmZmZmYsIHBvcnRfbW1pbyArIFBPUlRfRklTX0FERFIpOworCWlmIChocHJpdi0+Y2FwICYgSE9TVF9DQVBfNjQpCisJCXdyaXRlbCgocHAtPnJ4X2Zpc19kbWEgPj4gMTYpID4+IDE2LAorCQkgICAgICAgcG9ydF9tbWlvICsgUE9SVF9GSVNfQUREUl9ISSk7CisJd3JpdGVsKHBwLT5yeF9maXNfZG1hICYgMHhmZmZmZmZmZiwgcG9ydF9tbWlvICsgUE9SVF9GSVNfQUREUik7CiAKIAkvKiBlbmFibGUgRklTIHJlY2VwdGlvbiAqLwogCXRtcCA9IHJlYWRsKHBvcnRfbW1pbyArIFBPUlRfQ01EKTsKQEAgLTU2OCw4ICs2NTAsOSBAQAogCXJlYWRsKHBvcnRfbW1pbyArIFBPUlRfQ01EKTsKIH0KIAotc3RhdGljIGludCBhaGNpX3N0b3BfZmlzX3J4KHZvaWQgX19pb21lbSAqcG9ydF9tbWlvKQorc3RhdGljIGludCBhaGNpX3N0b3BfZmlzX3J4KHN0cnVjdCBhdGFfcG9ydCAqYXApCiB7CisJdm9pZCBfX2lvbWVtICpwb3J0X21taW8gPSBhaGNpX3BvcnRfYmFzZShhcCk7CiAJdTMyIHRtcDsKIAogCS8qIGRpc2FibGUgRklTIHJlY2VwdGlvbiAqLwpAQCAtNTg2LDE0ICs2NjksMTYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgYWhjaV9wb3dlcl91cCh2b2lkIF9faW9tZW0gKnBvcnRfbW1pbywgdTMyIGNhcCkKK3N0YXRpYyB2b2lkIGFoY2lfcG93ZXJfdXAoc3RydWN0IGF0YV9wb3J0ICphcCkKIHsKKwlzdHJ1Y3QgYWhjaV9ob3N0X3ByaXYgKmhwcml2ID0gYXAtPmhvc3QtPnByaXZhdGVfZGF0YTsKKwl2b2lkIF9faW9tZW0gKnBvcnRfbW1pbyA9IGFoY2lfcG9ydF9iYXNlKGFwKTsKIAl1MzIgY21kOwogCiAJY21kID0gcmVhZGwocG9ydF9tbWlvICsgUE9SVF9DTUQpICYgflBPUlRfQ01EX0lDQ19NQVNLOwogCiAJLyogc3BpbiB1cCBkZXZpY2UgKi8KLQlpZiAoY2FwICYgSE9TVF9DQVBfU1NTKSB7CisJaWYgKGhwcml2LT5jYXAgJiBIT1NUX0NBUF9TU1MpIHsKIAkJY21kIHw9IFBPUlRfQ01EX1NQSU5fVVA7CiAJCXdyaXRlbChjbWQsIHBvcnRfbW1pbyArIFBPUlRfQ01EKTsKIAl9CkBAIC02MDMsMTEgKzY4OCwxMyBAQAogfQogCiAjaWZkZWYgQ09ORklHX1BNCi1zdGF0aWMgdm9pZCBhaGNpX3Bvd2VyX2Rvd24odm9pZCBfX2lvbWVtICpwb3J0X21taW8sIHUzMiBjYXApCitzdGF0aWMgdm9pZCBhaGNpX3Bvd2VyX2Rvd24oc3RydWN0IGF0YV9wb3J0ICphcCkKIHsKKwlzdHJ1Y3QgYWhjaV9ob3N0X3ByaXYgKmhwcml2ID0gYXAtPmhvc3QtPnByaXZhdGVfZGF0YTsKKwl2b2lkIF9faW9tZW0gKnBvcnRfbW1pbyA9IGFoY2lfcG9ydF9iYXNlKGFwKTsKIAl1MzIgY21kLCBzY29udHJvbDsKIAotCWlmICghKGNhcCAmIEhPU1RfQ0FQX1NTUykpCisJaWYgKCEoaHByaXYtPmNhcCAmIEhPU1RfQ0FQX1NTUykpCiAJCXJldHVybjsKIAogCS8qIHB1dCBkZXZpY2UgaW50byBsaXN0ZW4gbW9kZSwgZmlyc3Qgc2V0IFB4U0NUTC5ERVQgdG8gMCAqLwpAQCAtNjIyLDI5ICs3MDksMjggQEAKIH0KICNlbmRpZgogCi1zdGF0aWMgdm9pZCBhaGNpX2luaXRfcG9ydCh2b2lkIF9faW9tZW0gKnBvcnRfbW1pbywgdTMyIGNhcCwKLQkJCSAgIGRtYV9hZGRyX3QgY21kX3Nsb3RfZG1hLCBkbWFfYWRkcl90IHJ4X2Zpc19kbWEpCitzdGF0aWMgdm9pZCBhaGNpX2luaXRfcG9ydChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQogewogCS8qIGVuYWJsZSBGSVMgcmVjZXB0aW9uICovCi0JYWhjaV9zdGFydF9maXNfcngocG9ydF9tbWlvLCBjYXAsIGNtZF9zbG90X2RtYSwgcnhfZmlzX2RtYSk7CisJYWhjaV9zdGFydF9maXNfcngoYXApOwogCiAJLyogZW5hYmxlIERNQSAqLwotCWFoY2lfc3RhcnRfZW5naW5lKHBvcnRfbW1pbyk7CisJYWhjaV9zdGFydF9lbmdpbmUoYXApOwogfQogCi1zdGF0aWMgaW50IGFoY2lfZGVpbml0X3BvcnQodm9pZCBfX2lvbWVtICpwb3J0X21taW8sIHUzMiBjYXAsIGNvbnN0IGNoYXIgKiplbXNnKQorc3RhdGljIGludCBhaGNpX2RlaW5pdF9wb3J0KHN0cnVjdCBhdGFfcG9ydCAqYXAsIGNvbnN0IGNoYXIgKiplbXNnKQogewogCWludCByYzsKIAogCS8qIGRpc2FibGUgRE1BICovCi0JcmMgPSBhaGNpX3N0b3BfZW5naW5lKHBvcnRfbW1pbyk7CisJcmMgPSBhaGNpX3N0b3BfZW5naW5lKGFwKTsKIAlpZiAocmMpIHsKIAkJKmVtc2cgPSAiZmFpbGVkIHRvIHN0b3AgZW5naW5lIjsKIAkJcmV0dXJuIHJjOwogCX0KIAogCS8qIGRpc2FibGUgRklTIHJlY2VwdGlvbiAqLwotCXJjID0gYWhjaV9zdG9wX2Zpc19yeChwb3J0X21taW8pOworCXJjID0gYWhjaV9zdG9wX2Zpc19yeChhcCk7CiAJaWYgKHJjKSB7CiAJCSplbXNnID0gImZhaWxlZCBzdG9wIEZJUyBSWCI7CiAJCXJldHVybiByYzsKQEAgLTY1MywxMiArNzM5LDExIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYWhjaV9yZXNldF9jb250cm9sbGVyKHZvaWQgX19pb21lbSAqbW1pbywgc3RydWN0IHBjaV9kZXYgKnBkZXYpCitzdGF0aWMgaW50IGFoY2lfcmVzZXRfY29udHJvbGxlcihzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QpCiB7Ci0JdTMyIGNhcF9zYXZlLCBpbXBsX3NhdmUsIHRtcDsKLQotCWNhcF9zYXZlID0gcmVhZGwobW1pbyArIEhPU1RfQ0FQKTsKLQlpbXBsX3NhdmUgPSByZWFkbChtbWlvICsgSE9TVF9QT1JUU19JTVBMKTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoaG9zdC0+ZGV2KTsKKwl2b2lkIF9faW9tZW0gKm1taW8gPSBob3N0LT5pb21hcFtBSENJX1BDSV9CQVJdOworCXUzMiB0bXA7CiAKIAkvKiBnbG9iYWwgY29udHJvbGxlciByZXNldCAqLwogCXRtcCA9IHJlYWRsKG1taW8gKyBIT1NUX0NUTCk7CkBAIC02NzQsNyArNzU5LDcgQEAKIAogCXRtcCA9IHJlYWRsKG1taW8gKyBIT1NUX0NUTCk7CiAJaWYgKHRtcCAmIEhPU1RfUkVTRVQpIHsKLQkJZGV2X3ByaW50ayhLRVJOX0VSUiwgJnBkZXYtPmRldiwKKwkJZGV2X3ByaW50ayhLRVJOX0VSUiwgaG9zdC0+ZGV2LAogCQkJICAgImNvbnRyb2xsZXIgcmVzZXQgZmFpbGVkICgweCV4KVxuIiwgdG1wKTsKIAkJcmV0dXJuIC1FSU87CiAJfQpAQCAtNjgzLDE4ICs3NjgsOCBAQAogCXdyaXRlbChIT1NUX0FIQ0lfRU4sIG1taW8gKyBIT1NUX0NUTCk7CiAJKHZvaWQpIHJlYWRsKG1taW8gKyBIT1NUX0NUTCk7CS8qIGZsdXNoICovCiAKLQkvKiBUaGVzZSB3cml0ZS1vbmNlIHJlZ2lzdGVycyBhcmUgbm9ybWFsbHkgY2xlYXJlZCBvbiByZXNldC4KLQkgKiBSZXN0b3JlIEJJT1MgdmFsdWVzLi4uIHdoaWNoIHdlIEhPUEUgd2VyZSBwcmVzZW50IGJlZm9yZQotCSAqIHJlc2V0LgotCSAqLwotCWlmICghaW1wbF9zYXZlKSB7Ci0JCWltcGxfc2F2ZSA9ICgxIDw8IGFoY2lfbnJfcG9ydHMoY2FwX3NhdmUpKSAtIDE7Ci0JCWRldl9wcmludGsoS0VSTl9XQVJOSU5HLCAmcGRldi0+ZGV2LAotCQkJICAgIlBPUlRTX0lNUEwgaXMgemVybywgZm9yY2luZyAweCV4XG4iLCBpbXBsX3NhdmUpOwotCX0KLQl3cml0ZWwoY2FwX3NhdmUsIG1taW8gKyBIT1NUX0NBUCk7Ci0Jd3JpdGVsKGltcGxfc2F2ZSwgbW1pbyArIEhPU1RfUE9SVFNfSU1QTCk7Ci0JKHZvaWQpIHJlYWRsKG1taW8gKyBIT1NUX1BPUlRTX0lNUEwpOwkvKiBmbHVzaCAqLworCS8qIHNvbWUgcmVnaXN0ZXJzIG1pZ2h0IGJlIGNsZWFyZWQgb24gcmVzZXQuICByZXN0b3JlIGluaXRpYWwgdmFsdWVzICovCisJYWhjaV9yZXN0b3JlX2luaXRpYWxfY29uZmlnKGhvc3QpOwogCiAJaWYgKHBkZXYtPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0lOVEVMKSB7CiAJCXUxNiB0bXAxNjsKQEAgLTcwOCwyMyArNzgzLDIzIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGFoY2lfaW5pdF9jb250cm9sbGVyKHZvaWQgX19pb21lbSAqbW1pbywgc3RydWN0IHBjaV9kZXYgKnBkZXYsCi0JCQkJIGludCBuX3BvcnRzLCB1bnNpZ25lZCBpbnQgcG9ydF9mbGFncywKLQkJCQkgc3RydWN0IGFoY2lfaG9zdF9wcml2ICpocHJpdikKK3N0YXRpYyB2b2lkIGFoY2lfaW5pdF9jb250cm9sbGVyKHN0cnVjdCBhdGFfaG9zdCAqaG9zdCkKIHsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoaG9zdC0+ZGV2KTsKKwl2b2lkIF9faW9tZW0gKm1taW8gPSBob3N0LT5pb21hcFtBSENJX1BDSV9CQVJdOwogCWludCBpLCByYzsKIAl1MzIgdG1wOwogCi0JZm9yIChpID0gMDsgaSA8IG5fcG9ydHM7IGkrKykgewotCQl2b2lkIF9faW9tZW0gKnBvcnRfbW1pbyA9IGFoY2lfcG9ydF9iYXNlKG1taW8sIGkpOworCWZvciAoaSA9IDA7IGkgPCBob3N0LT5uX3BvcnRzOyBpKyspIHsKKwkJc3RydWN0IGF0YV9wb3J0ICphcCA9IGhvc3QtPnBvcnRzW2ldOworCQl2b2lkIF9faW9tZW0gKnBvcnRfbW1pbyA9IGFoY2lfcG9ydF9iYXNlKGFwKTsKIAkJY29uc3QgY2hhciAqZW1zZyA9IE5VTEw7CiAKLQkJaWYgKChwb3J0X2ZsYWdzICYgQUhDSV9GTEFHX0hPTk9SX1BJKSAmJgotCQkgICAgIShocHJpdi0+cG9ydF9tYXAgJiAoMSA8PCBpKSkpCisJCWlmIChhdGFfcG9ydF9pc19kdW1teShhcCkpCiAJCQljb250aW51ZTsKIAogCQkvKiBtYWtlIHN1cmUgcG9ydCBpcyBub3QgYWN0aXZlICovCi0JCXJjID0gYWhjaV9kZWluaXRfcG9ydChwb3J0X21taW8sIGhwcml2LT5jYXAsICZlbXNnKTsKKwkJcmMgPSBhaGNpX2RlaW5pdF9wb3J0KGFwLCAmZW1zZyk7CiAJCWlmIChyYykKIAkJCWRldl9wcmludGsoS0VSTl9XQVJOSU5HLCAmcGRldi0+ZGV2LAogCQkJCSAgICIlcyAoJWQpXG4iLCBlbXNnLCByYyk7CkBAIC03NTIsNyArODI3LDcgQEAKIAogc3RhdGljIHVuc2lnbmVkIGludCBhaGNpX2Rldl9jbGFzc2lmeShzdHJ1Y3QgYXRhX3BvcnQgKmFwKQogewotCXZvaWQgX19pb21lbSAqcG9ydF9tbWlvID0gYXAtPmlvYWRkci5jbWRfYWRkcjsKKwl2b2lkIF9faW9tZW0gKnBvcnRfbW1pbyA9IGFoY2lfcG9ydF9iYXNlKGFwKTsKIAlzdHJ1Y3QgYXRhX3Rhc2tmaWxlIHRmOwogCXUzMiB0bXA7CiAKQEAgLTgwMiw4ICs4NzcsNyBAQAogc3RhdGljIGludCBhaGNpX3NvZnRyZXNldChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgKmNsYXNzKQogewogCXN0cnVjdCBhaGNpX3BvcnRfcHJpdiAqcHAgPSBhcC0+cHJpdmF0ZV9kYXRhOwotCXZvaWQgX19pb21lbSAqbW1pbyA9IGFwLT5ob3N0LT5pb21hcFtBSENJX1BDSV9CQVJdOwotCXZvaWQgX19pb21lbSAqcG9ydF9tbWlvID0gYWhjaV9wb3J0X2Jhc2UobW1pbywgYXAtPnBvcnRfbm8pOworCXZvaWQgX19pb21lbSAqcG9ydF9tbWlvID0gYWhjaV9wb3J0X2Jhc2UoYXApOwogCWNvbnN0IHUzMiBjbWRfZmlzX2xlbiA9IDU7IC8qIGZpdmUgZHdvcmRzICovCiAJY29uc3QgY2hhciAqcmVhc29uID0gTlVMTDsKIAlzdHJ1Y3QgYXRhX3Rhc2tmaWxlIHRmOwpAQCAtODIwLDcgKzg5NCw3IEBACiAJfQogCiAJLyogcHJlcGFyZSBmb3IgU1JTVCAoQUhDSS0xLjEgMTAuNC4xKSAqLwotCXJjID0gYWhjaV9zdG9wX2VuZ2luZShwb3J0X21taW8pOworCXJjID0gYWhjaV9zdG9wX2VuZ2luZShhcCk7CiAJaWYgKHJjKSB7CiAJCXJlYXNvbiA9ICJmYWlsZWQgdG8gc3RvcCBlbmdpbmUiOwogCQlnb3RvIGZhaWxfcmVzdGFydDsKQEAgLTg0MCw3ICs5MTQsNyBAQAogCX0KIAogCS8qIHJlc3RhcnQgZW5naW5lICovCi0JYWhjaV9zdGFydF9lbmdpbmUocG9ydF9tbWlvKTsKKwlhaGNpX3N0YXJ0X2VuZ2luZShhcCk7CiAKIAlhdGFfdGZfaW5pdChhcC0+ZGV2aWNlLCAmdGYpOwogCWZpcyA9IHBwLT5jbWRfdGJsOwpAQCAtODk5LDcgKzk3Myw3IEBACiAJcmV0dXJuIDA7CiAKICBmYWlsX3Jlc3RhcnQ6Ci0JYWhjaV9zdGFydF9lbmdpbmUocG9ydF9tbWlvKTsKKwlhaGNpX3N0YXJ0X2VuZ2luZShhcCk7CiAgZmFpbDoKIAlhdGFfcG9ydF9wcmludGsoYXAsIEtFUk5fRVJSLCAic29mdHJlc2V0IGZhaWxlZCAoJXMpXG4iLCByZWFzb24pOwogCXJldHVybiByYzsKQEAgLTkxMCwxMyArOTg0LDExIEBACiAJc3RydWN0IGFoY2lfcG9ydF9wcml2ICpwcCA9IGFwLT5wcml2YXRlX2RhdGE7CiAJdTggKmQyaF9maXMgPSBwcC0+cnhfZmlzICsgUlhfRklTX0QySF9SRUc7CiAJc3RydWN0IGF0YV90YXNrZmlsZSB0ZjsKLQl2b2lkIF9faW9tZW0gKm1taW8gPSBhcC0+aG9zdC0+aW9tYXBbQUhDSV9QQ0lfQkFSXTsKLQl2b2lkIF9faW9tZW0gKnBvcnRfbW1pbyA9IGFoY2lfcG9ydF9iYXNlKG1taW8sIGFwLT5wb3J0X25vKTsKIAlpbnQgcmM7CiAKIAlEUFJJTlRLKCJFTlRFUlxuIik7CiAKLQlhaGNpX3N0b3BfZW5naW5lKHBvcnRfbW1pbyk7CisJYWhjaV9zdG9wX2VuZ2luZShhcCk7CiAKIAkvKiBjbGVhciBEMkggcmVjZXB0aW9uIGFyZWEgdG8gcHJvcGVybHkgd2FpdCBmb3IgRDJIIEZJUyAqLwogCWF0YV90Zl9pbml0KGFwLT5kZXZpY2UsICZ0Zik7CkBAIC05MjUsNyArOTk3LDcgQEAKIAogCXJjID0gc2F0YV9zdGRfaGFyZHJlc2V0KGFwLCBjbGFzcyk7CiAKLQlhaGNpX3N0YXJ0X2VuZ2luZShwb3J0X21taW8pOworCWFoY2lfc3RhcnRfZW5naW5lKGFwKTsKIAogCWlmIChyYyA9PSAwICYmIGF0YV9wb3J0X29ubGluZShhcCkpCiAJCSpjbGFzcyA9IGFoY2lfZGV2X2NsYXNzaWZ5KGFwKTsKQEAgLTkzOCwyMCArMTAxMCwxOCBAQAogCiBzdGF0aWMgaW50IGFoY2lfdnQ4MjUxX2hhcmRyZXNldChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgKmNsYXNzKQogewotCXZvaWQgX19pb21lbSAqbW1pbyA9IGFwLT5ob3N0LT5pb21hcFtBSENJX1BDSV9CQVJdOwotCXZvaWQgX19pb21lbSAqcG9ydF9tbWlvID0gYWhjaV9wb3J0X2Jhc2UobW1pbywgYXAtPnBvcnRfbm8pOwogCWludCByYzsKIAogCURQUklOVEsoIkVOVEVSXG4iKTsKIAotCWFoY2lfc3RvcF9lbmdpbmUocG9ydF9tbWlvKTsKKwlhaGNpX3N0b3BfZW5naW5lKGFwKTsKIAogCXJjID0gc2F0YV9wb3J0X2hhcmRyZXNldChhcCwgc2F0YV9laGNfZGViX3RpbWluZygmYXAtPmVoX2NvbnRleHQpKTsKIAogCS8qIHZ0ODI1MSBuZWVkcyBTRXJyb3IgY2xlYXJlZCBmb3IgdGhlIHBvcnQgdG8gb3BlcmF0ZSAqLwogCWFoY2lfc2NyX3dyaXRlKGFwLCBTQ1JfRVJST1IsIGFoY2lfc2NyX3JlYWQoYXAsIFNDUl9FUlJPUikpOwogCi0JYWhjaV9zdGFydF9lbmdpbmUocG9ydF9tbWlvKTsKKwlhaGNpX3N0YXJ0X2VuZ2luZShhcCk7CiAKIAlEUFJJTlRLKCJFWElULCByYz0lZCwgY2xhc3M9JXVcbiIsIHJjLCAqY2xhc3MpOwogCkBAIC05NjMsNyArMTAzMyw3IEBACiAKIHN0YXRpYyB2b2lkIGFoY2lfcG9zdHJlc2V0KHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCAqY2xhc3MpCiB7Ci0Jdm9pZCBfX2lvbWVtICpwb3J0X21taW8gPSBhcC0+aW9hZGRyLmNtZF9hZGRyOworCXZvaWQgX19pb21lbSAqcG9ydF9tbWlvID0gYWhjaV9wb3J0X2Jhc2UoYXApOwogCXUzMiBuZXdfdG1wLCB0bXA7CiAKIAlhdGFfc3RkX3Bvc3RyZXNldChhcCwgY2xhc3MpOwpAQCAtMTEzMSw4ICsxMjAxLDcgQEAKIAogc3RhdGljIHZvaWQgYWhjaV9ob3N0X2ludHIoc3RydWN0IGF0YV9wb3J0ICphcCkKIHsKLQl2b2lkIF9faW9tZW0gKm1taW8gPSBhcC0+aG9zdC0+aW9tYXBbQUhDSV9QQ0lfQkFSXTsKLQl2b2lkIF9faW9tZW0gKnBvcnRfbW1pbyA9IGFoY2lfcG9ydF9iYXNlKG1taW8sIGFwLT5wb3J0X25vKTsKKwl2b2lkIF9faW9tZW0gKnBvcnRfbW1pbyA9IGFwLT5pb2FkZHIuY21kX2FkZHI7CiAJc3RydWN0IGF0YV9laF9pbmZvICplaGkgPSAmYXAtPmVoX2luZm87CiAJc3RydWN0IGFoY2lfcG9ydF9wcml2ICpwcCA9IGFwLT5wcml2YXRlX2RhdGE7CiAJdTMyIHN0YXR1cywgcWNfYWN0aXZlOwpAQCAtMTI4Myw3ICsxMzUyLDcgQEAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgYWhjaV9xY19pc3N1ZShzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKQogewogCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBxYy0+YXA7Ci0Jdm9pZCBfX2lvbWVtICpwb3J0X21taW8gPSBhcC0+aW9hZGRyLmNtZF9hZGRyOworCXZvaWQgX19pb21lbSAqcG9ydF9tbWlvID0gYWhjaV9wb3J0X2Jhc2UoYXApOwogCiAJaWYgKHFjLT50Zi5wcm90b2NvbCA9PSBBVEFfUFJPVF9OQ1EpCiAJCXdyaXRlbCgxIDw8IHFjLT50YWcsIHBvcnRfbW1pbyArIFBPUlRfU0NSX0FDVCk7CkBAIC0xMjk1LDggKzEzNjQsNyBAQAogCiBzdGF0aWMgdm9pZCBhaGNpX2ZyZWV6ZShzdHJ1Y3QgYXRhX3BvcnQgKmFwKQogewotCXZvaWQgX19pb21lbSAqbW1pbyA9IGFwLT5ob3N0LT5pb21hcFtBSENJX1BDSV9CQVJdOwotCXZvaWQgX19pb21lbSAqcG9ydF9tbWlvID0gYWhjaV9wb3J0X2Jhc2UobW1pbywgYXAtPnBvcnRfbm8pOworCXZvaWQgX19pb21lbSAqcG9ydF9tbWlvID0gYWhjaV9wb3J0X2Jhc2UoYXApOwogCiAJLyogdHVybiBJUlEgb2ZmICovCiAJd3JpdGVsKDAsIHBvcnRfbW1pbyArIFBPUlRfSVJRX01BU0spOwpAQCAtMTMwNSw3ICsxMzczLDcgQEAKIHN0YXRpYyB2b2lkIGFoY2lfdGhhdyhzdHJ1Y3QgYXRhX3BvcnQgKmFwKQogewogCXZvaWQgX19pb21lbSAqbW1pbyA9IGFwLT5ob3N0LT5pb21hcFtBSENJX1BDSV9CQVJdOwotCXZvaWQgX19pb21lbSAqcG9ydF9tbWlvID0gYWhjaV9wb3J0X2Jhc2UobW1pbywgYXAtPnBvcnRfbm8pOworCXZvaWQgX19pb21lbSAqcG9ydF9tbWlvID0gYWhjaV9wb3J0X2Jhc2UoYXApOwogCXUzMiB0bXA7CiAKIAkvKiBjbGVhciBJUlEgKi8KQEAgLTEzMTksMTMgKzEzODcsMTAgQEAKIAogc3RhdGljIHZvaWQgYWhjaV9lcnJvcl9oYW5kbGVyKHN0cnVjdCBhdGFfcG9ydCAqYXApCiB7Ci0Jdm9pZCBfX2lvbWVtICptbWlvID0gYXAtPmhvc3QtPmlvbWFwW0FIQ0lfUENJX0JBUl07Ci0Jdm9pZCBfX2lvbWVtICpwb3J0X21taW8gPSBhaGNpX3BvcnRfYmFzZShtbWlvLCBhcC0+cG9ydF9ubyk7Ci0KIAlpZiAoIShhcC0+cGZsYWdzICYgQVRBX1BGTEFHX0ZST1pFTikpIHsKIAkJLyogcmVzdGFydCBlbmdpbmUgKi8KLQkJYWhjaV9zdG9wX2VuZ2luZShwb3J0X21taW8pOwotCQlhaGNpX3N0YXJ0X2VuZ2luZShwb3J0X21taW8pOworCQlhaGNpX3N0b3BfZW5naW5lKGFwKTsKKwkJYWhjaV9zdGFydF9lbmdpbmUoYXApOwogCX0KIAogCS8qIHBlcmZvcm0gcmVjb3ZlcnkgKi8KQEAgLTEzMzUsMTMgKzE0MDAsMTAgQEAKIAogc3RhdGljIHZvaWQgYWhjaV92dDgyNTFfZXJyb3JfaGFuZGxlcihzdHJ1Y3QgYXRhX3BvcnQgKmFwKQogewotCXZvaWQgX19pb21lbSAqbW1pbyA9IGFwLT5ob3N0LT5pb21hcFtBSENJX1BDSV9CQVJdOwotCXZvaWQgX19pb21lbSAqcG9ydF9tbWlvID0gYWhjaV9wb3J0X2Jhc2UobW1pbywgYXAtPnBvcnRfbm8pOwotCiAJaWYgKCEoYXAtPnBmbGFncyAmIEFUQV9QRkxBR19GUk9aRU4pKSB7CiAJCS8qIHJlc3RhcnQgZW5naW5lICovCi0JCWFoY2lfc3RvcF9lbmdpbmUocG9ydF9tbWlvKTsKLQkJYWhjaV9zdGFydF9lbmdpbmUocG9ydF9tbWlvKTsKKwkJYWhjaV9zdG9wX2VuZ2luZShhcCk7CisJCWFoY2lfc3RhcnRfZW5naW5lKGFwKTsKIAl9CiAKIAkvKiBwZXJmb3JtIHJlY292ZXJ5ICovCkBAIC0xMzUyLDM2ICsxNDE0LDI2IEBACiBzdGF0aWMgdm9pZCBhaGNpX3Bvc3RfaW50ZXJuYWxfY21kKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpCiB7CiAJc3RydWN0IGF0YV9wb3J0ICphcCA9IHFjLT5hcDsKLQl2b2lkIF9faW9tZW0gKm1taW8gPSBhcC0+aG9zdC0+aW9tYXBbQUhDSV9QQ0lfQkFSXTsKLQl2b2lkIF9faW9tZW0gKnBvcnRfbW1pbyA9IGFoY2lfcG9ydF9iYXNlKG1taW8sIGFwLT5wb3J0X25vKTsKIAotCWlmIChxYy0+ZmxhZ3MgJiBBVEFfUUNGTEFHX0ZBSUxFRCkKLQkJcWMtPmVycl9tYXNrIHw9IEFDX0VSUl9PVEhFUjsKLQotCWlmIChxYy0+ZXJyX21hc2spIHsKKwlpZiAocWMtPmZsYWdzICYgQVRBX1FDRkxBR19GQUlMRUQpIHsKIAkJLyogbWFrZSBETUEgZW5naW5lIGZvcmdldCBhYm91dCB0aGUgZmFpbGVkIGNvbW1hbmQgKi8KLQkJYWhjaV9zdG9wX2VuZ2luZShwb3J0X21taW8pOwotCQlhaGNpX3N0YXJ0X2VuZ2luZShwb3J0X21taW8pOworCQlhaGNpX3N0b3BfZW5naW5lKGFwKTsKKwkJYWhjaV9zdGFydF9lbmdpbmUoYXApOwogCX0KIH0KIAogI2lmZGVmIENPTkZJR19QTQogc3RhdGljIGludCBhaGNpX3BvcnRfc3VzcGVuZChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBwbV9tZXNzYWdlX3QgbWVzZykKIHsKLQlzdHJ1Y3QgYWhjaV9ob3N0X3ByaXYgKmhwcml2ID0gYXAtPmhvc3QtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgYWhjaV9wb3J0X3ByaXYgKnBwID0gYXAtPnByaXZhdGVfZGF0YTsKLQl2b2lkIF9faW9tZW0gKm1taW8gPSBhcC0+aG9zdC0+aW9tYXBbQUhDSV9QQ0lfQkFSXTsKLQl2b2lkIF9faW9tZW0gKnBvcnRfbW1pbyA9IGFoY2lfcG9ydF9iYXNlKG1taW8sIGFwLT5wb3J0X25vKTsKIAljb25zdCBjaGFyICplbXNnID0gTlVMTDsKIAlpbnQgcmM7CiAKLQlyYyA9IGFoY2lfZGVpbml0X3BvcnQocG9ydF9tbWlvLCBocHJpdi0+Y2FwLCAmZW1zZyk7CisJcmMgPSBhaGNpX2RlaW5pdF9wb3J0KGFwLCAmZW1zZyk7CiAJaWYgKHJjID09IDApCi0JCWFoY2lfcG93ZXJfZG93bihwb3J0X21taW8sIGhwcml2LT5jYXApOworCQlhaGNpX3Bvd2VyX2Rvd24oYXApOwogCWVsc2UgewogCQlhdGFfcG9ydF9wcmludGsoYXAsIEtFUk5fRVJSLCAiJXMgKCVkKVxuIiwgZW1zZywgcmMpOwotCQlhaGNpX2luaXRfcG9ydChwb3J0X21taW8sIGhwcml2LT5jYXAsCi0JCQkgICAgICAgcHAtPmNtZF9zbG90X2RtYSwgcHAtPnJ4X2Zpc19kbWEpOworCQlhaGNpX2luaXRfcG9ydChhcCk7CiAJfQogCiAJcmV0dXJuIHJjOwpAQCAtMTM4OSwxMyArMTQ0MSw4IEBACiAKIHN0YXRpYyBpbnQgYWhjaV9wb3J0X3Jlc3VtZShzdHJ1Y3QgYXRhX3BvcnQgKmFwKQogewotCXN0cnVjdCBhaGNpX3BvcnRfcHJpdiAqcHAgPSBhcC0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBhaGNpX2hvc3RfcHJpdiAqaHByaXYgPSBhcC0+aG9zdC0+cHJpdmF0ZV9kYXRhOwotCXZvaWQgX19pb21lbSAqbW1pbyA9IGFwLT5ob3N0LT5pb21hcFtBSENJX1BDSV9CQVJdOwotCXZvaWQgX19pb21lbSAqcG9ydF9tbWlvID0gYWhjaV9wb3J0X2Jhc2UobW1pbywgYXAtPnBvcnRfbm8pOwotCi0JYWhjaV9wb3dlcl91cChwb3J0X21taW8sIGhwcml2LT5jYXApOwotCWFoY2lfaW5pdF9wb3J0KHBvcnRfbW1pbywgaHByaXYtPmNhcCwgcHAtPmNtZF9zbG90X2RtYSwgcHAtPnJ4X2Zpc19kbWEpOworCWFoY2lfcG93ZXJfdXAoYXApOworCWFoY2lfaW5pdF9wb3J0KGFwKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTQyMyw4ICsxNDcwLDYgQEAKIHN0YXRpYyBpbnQgYWhjaV9wY2lfZGV2aWNlX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKIAlzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QgPSBkZXZfZ2V0X2RydmRhdGEoJnBkZXYtPmRldik7Ci0Jc3RydWN0IGFoY2lfaG9zdF9wcml2ICpocHJpdiA9IGhvc3QtPnByaXZhdGVfZGF0YTsKLQl2b2lkIF9faW9tZW0gKm1taW8gPSBob3N0LT5pb21hcFtBSENJX1BDSV9CQVJdOwogCWludCByYzsKIAogCXJjID0gYXRhX3BjaV9kZXZpY2VfZG9fcmVzdW1lKHBkZXYpOwpAQCAtMTQzMiwxMiArMTQ3NywxMSBAQAogCQlyZXR1cm4gcmM7CiAKIAlpZiAocGRldi0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlLmV2ZW50ID09IFBNX0VWRU5UX1NVU1BFTkQpIHsKLQkJcmMgPSBhaGNpX3Jlc2V0X2NvbnRyb2xsZXIobW1pbywgcGRldik7CisJCXJjID0gYWhjaV9yZXNldF9jb250cm9sbGVyKGhvc3QpOwogCQlpZiAocmMpCiAJCQlyZXR1cm4gcmM7CiAKLQkJYWhjaV9pbml0X2NvbnRyb2xsZXIobW1pbywgcGRldiwgaG9zdC0+bl9wb3J0cywKLQkJCQkgICAgIGhvc3QtPnBvcnRzWzBdLT5mbGFncywgaHByaXYpOworCQlhaGNpX2luaXRfY29udHJvbGxlcihob3N0KTsKIAl9CiAKIAlhdGFfaG9zdF9yZXN1bWUoaG9zdCk7CkBAIC0xNDQ5LDEwICsxNDkzLDcgQEAKIHN0YXRpYyBpbnQgYWhjaV9wb3J0X3N0YXJ0KHN0cnVjdCBhdGFfcG9ydCAqYXApCiB7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gYXAtPmhvc3QtPmRldjsKLQlzdHJ1Y3QgYWhjaV9ob3N0X3ByaXYgKmhwcml2ID0gYXAtPmhvc3QtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgYWhjaV9wb3J0X3ByaXYgKnBwOwotCXZvaWQgX19pb21lbSAqbW1pbyA9IGFwLT5ob3N0LT5pb21hcFtBSENJX1BDSV9CQVJdOwotCXZvaWQgX19pb21lbSAqcG9ydF9tbWlvID0gYWhjaV9wb3J0X2Jhc2UobW1pbywgYXAtPnBvcnRfbm8pOwogCXZvaWQgKm1lbTsKIAlkbWFfYWRkcl90IG1lbV9kbWE7CiAJaW50IHJjOwpAQCAtMTUwMCw4NSArMTU0MSwyOSBAQAogCWFwLT5wcml2YXRlX2RhdGEgPSBwcDsKIAogCS8qIHBvd2VyIHVwIHBvcnQgKi8KLQlhaGNpX3Bvd2VyX3VwKHBvcnRfbW1pbywgaHByaXYtPmNhcCk7CisJYWhjaV9wb3dlcl91cChhcCk7CiAKIAkvKiBpbml0aWFsaXplIHBvcnQgKi8KLQlhaGNpX2luaXRfcG9ydChwb3J0X21taW8sIGhwcml2LT5jYXAsIHBwLT5jbWRfc2xvdF9kbWEsIHBwLT5yeF9maXNfZG1hKTsKKwlhaGNpX2luaXRfcG9ydChhcCk7CiAKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgYWhjaV9wb3J0X3N0b3Aoc3RydWN0IGF0YV9wb3J0ICphcCkKIHsKLQlzdHJ1Y3QgYWhjaV9ob3N0X3ByaXYgKmhwcml2ID0gYXAtPmhvc3QtPnByaXZhdGVfZGF0YTsKLQl2b2lkIF9faW9tZW0gKm1taW8gPSBhcC0+aG9zdC0+aW9tYXBbQUhDSV9QQ0lfQkFSXTsKLQl2b2lkIF9faW9tZW0gKnBvcnRfbW1pbyA9IGFoY2lfcG9ydF9iYXNlKG1taW8sIGFwLT5wb3J0X25vKTsKIAljb25zdCBjaGFyICplbXNnID0gTlVMTDsKIAlpbnQgcmM7CiAKIAkvKiBkZS1pbml0aWFsaXplIHBvcnQgKi8KLQlyYyA9IGFoY2lfZGVpbml0X3BvcnQocG9ydF9tbWlvLCBocHJpdi0+Y2FwLCAmZW1zZyk7CisJcmMgPSBhaGNpX2RlaW5pdF9wb3J0KGFwLCAmZW1zZyk7CiAJaWYgKHJjKQogCQlhdGFfcG9ydF9wcmludGsoYXAsIEtFUk5fV0FSTklORywgIiVzICglZClcbiIsIGVtc2csIHJjKTsKIH0KIAotc3RhdGljIHZvaWQgYWhjaV9zZXR1cF9wb3J0KHN0cnVjdCBhdGFfaW9wb3J0cyAqcG9ydCwgdm9pZCBfX2lvbWVtICpiYXNlLAotCQkJICAgIHVuc2lnbmVkIGludCBwb3J0X2lkeCkKK3N0YXRpYyBpbnQgYWhjaV9jb25maWd1cmVfZG1hX21hc2tzKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgdXNpbmdfZGFjKQogewotCVZQUklOVEsoIkVOVEVSLCBiYXNlPT0weCVseCwgcG9ydF9pZHggJXVcbiIsIGJhc2UsIHBvcnRfaWR4KTsKLQliYXNlID0gYWhjaV9wb3J0X2Jhc2UoYmFzZSwgcG9ydF9pZHgpOwotCVZQUklOVEsoImJhc2Ugbm93PT0weCVseFxuIiwgYmFzZSk7Ci0KLQlwb3J0LT5jbWRfYWRkcgkJPSBiYXNlOwotCXBvcnQtPnNjcl9hZGRyCQk9IGJhc2UgKyBQT1JUX1NDUjsKLQotCVZQUklOVEsoIkVYSVRcbiIpOwotfQotCi1zdGF0aWMgaW50IGFoY2lfaG9zdF9pbml0KHN0cnVjdCBhdGFfcHJvYmVfZW50ICpwcm9iZV9lbnQpCi17Ci0Jc3RydWN0IGFoY2lfaG9zdF9wcml2ICpocHJpdiA9IHByb2JlX2VudC0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2Rldihwcm9iZV9lbnQtPmRldik7Ci0Jdm9pZCBfX2lvbWVtICptbWlvID0gcHJvYmVfZW50LT5pb21hcFtBSENJX1BDSV9CQVJdOwotCXVuc2lnbmVkIGludCBpLCBjYXBfbl9wb3J0cywgdXNpbmdfZGFjOwogCWludCByYzsKIAotCXJjID0gYWhjaV9yZXNldF9jb250cm9sbGVyKG1taW8sIHBkZXYpOwotCWlmIChyYykKLQkJcmV0dXJuIHJjOwotCi0JaHByaXYtPmNhcCA9IHJlYWRsKG1taW8gKyBIT1NUX0NBUCk7Ci0JaHByaXYtPnBvcnRfbWFwID0gcmVhZGwobW1pbyArIEhPU1RfUE9SVFNfSU1QTCk7Ci0JY2FwX25fcG9ydHMgPSBhaGNpX25yX3BvcnRzKGhwcml2LT5jYXApOwotCi0JVlBSSU5USygiY2FwIDB4JXggIHBvcnRfbWFwIDB4JXggIG5fcG9ydHMgJWRcbiIsCi0JCWhwcml2LT5jYXAsIGhwcml2LT5wb3J0X21hcCwgY2FwX25fcG9ydHMpOwotCi0JaWYgKHByb2JlX2VudC0+cG9ydF9mbGFncyAmIEFIQ0lfRkxBR19IT05PUl9QSSkgewotCQl1bnNpZ25lZCBpbnQgbl9wb3J0cyA9IGNhcF9uX3BvcnRzOwotCQl1MzIgcG9ydF9tYXAgPSBocHJpdi0+cG9ydF9tYXA7Ci0JCWludCBtYXhfcG9ydCA9IDA7Ci0KLQkJZm9yIChpID0gMDsgaSA8IEFIQ0lfTUFYX1BPUlRTICYmIG5fcG9ydHM7IGkrKykgewotCQkJaWYgKHBvcnRfbWFwICYgKDEgPDwgaSkpIHsKLQkJCQluX3BvcnRzLS07Ci0JCQkJcG9ydF9tYXAgJj0gfigxIDw8IGkpOwotCQkJCW1heF9wb3J0ID0gaTsKLQkJCX0gZWxzZQotCQkJCXByb2JlX2VudC0+ZHVtbXlfcG9ydF9tYXNrIHw9IDEgPDwgaTsKLQkJfQotCi0JCWlmIChuX3BvcnRzIHx8IHBvcnRfbWFwKQotCQkJZGV2X3ByaW50ayhLRVJOX1dBUk5JTkcsICZwZGV2LT5kZXYsCi0JCQkJICAgIm5yX3BvcnRzICgldSkgYW5kIGltcGxlbWVudGVkIHBvcnQgbWFwICIKLQkJCQkgICAiKDB4JXgpIGRvbid0IG1hdGNoXG4iLAotCQkJCSAgIGNhcF9uX3BvcnRzLCBocHJpdi0+cG9ydF9tYXApOwotCi0JCXByb2JlX2VudC0+bl9wb3J0cyA9IG1heF9wb3J0ICsgMTsKLQl9IGVsc2UKLQkJcHJvYmVfZW50LT5uX3BvcnRzID0gY2FwX25fcG9ydHM7Ci0KLQl1c2luZ19kYWMgPSBocHJpdi0+Y2FwICYgSE9TVF9DQVBfNjQ7CiAJaWYgKHVzaW5nX2RhYyAmJgogCSAgICAhcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfNjRCSVRfTUFTSykpIHsKIAkJcmMgPSBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgRE1BXzY0QklUX01BU0spOwpAQCAtMTYwNCwyMyArMTU4OSwxNCBAQAogCQkJcmV0dXJuIHJjOwogCQl9CiAJfQotCi0JZm9yIChpID0gMDsgaSA8IHByb2JlX2VudC0+bl9wb3J0czsgaSsrKQotCQlhaGNpX3NldHVwX3BvcnQoJnByb2JlX2VudC0+cG9ydFtpXSwgbW1pbywgaSk7Ci0KLQlhaGNpX2luaXRfY29udHJvbGxlcihtbWlvLCBwZGV2LCBwcm9iZV9lbnQtPm5fcG9ydHMsCi0JCQkgICAgIHByb2JlX2VudC0+cG9ydF9mbGFncywgaHByaXYpOwotCi0JcGNpX3NldF9tYXN0ZXIocGRldik7Ci0KIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgYWhjaV9wcmludF9pbmZvKHN0cnVjdCBhdGFfcHJvYmVfZW50ICpwcm9iZV9lbnQpCitzdGF0aWMgdm9pZCBhaGNpX3ByaW50X2luZm8oc3RydWN0IGF0YV9ob3N0ICpob3N0KQogewotCXN0cnVjdCBhaGNpX2hvc3RfcHJpdiAqaHByaXYgPSBwcm9iZV9lbnQtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYocHJvYmVfZW50LT5kZXYpOwotCXZvaWQgX19pb21lbSAqbW1pbyA9IHByb2JlX2VudC0+aW9tYXBbQUhDSV9QQ0lfQkFSXTsKKwlzdHJ1Y3QgYWhjaV9ob3N0X3ByaXYgKmhwcml2ID0gaG9zdC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2Rldihob3N0LT5kZXYpOworCXZvaWQgX19pb21lbSAqbW1pbyA9IGhvc3QtPmlvbWFwW0FIQ0lfUENJX0JBUl07CiAJdTMyIHZlcnMsIGNhcCwgaW1wbCwgc3BlZWQ7CiAJY29uc3QgY2hhciAqc3BlZWRfczsKIAl1MTYgY2M7CkBAIC0xNjkwLDExICsxNjY2LDEyIEBACiBzdGF0aWMgaW50IGFoY2lfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCiB7CiAJc3RhdGljIGludCBwcmludGVkX3ZlcnNpb247Ci0JdW5zaWduZWQgaW50IGJvYXJkX2lkeCA9ICh1bnNpZ25lZCBpbnQpIGVudC0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IGF0YV9wb3J0X2luZm8gcGkgPSBhaGNpX3BvcnRfaW5mb1tlbnQtPmRyaXZlcl9kYXRhXTsKKwljb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqcHBpW10gPSB7ICZwaSwgTlVMTCB9OwogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7Ci0Jc3RydWN0IGF0YV9wcm9iZV9lbnQgKnByb2JlX2VudDsKIAlzdHJ1Y3QgYWhjaV9ob3N0X3ByaXYgKmhwcml2OwotCWludCByYzsKKwlzdHJ1Y3QgYXRhX2hvc3QgKmhvc3Q7CisJaW50IGksIHJjOwogCiAJVlBSSU5USygiRU5URVJcbiIpOwogCkBAIC0xNzAzLDYgKzE2ODAsNyBAQAogCWlmICghcHJpbnRlZF92ZXJzaW9uKyspCiAJCWRldl9wcmludGsoS0VSTl9ERUJVRywgJnBkZXYtPmRldiwgInZlcnNpb24gIiBEUlZfVkVSU0lPTiAiXG4iKTsKIAorCS8qIGFjcXVpcmUgcmVzb3VyY2VzICovCiAJcmMgPSBwY2ltX2VuYWJsZV9kZXZpY2UocGRldik7CiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CkBAIC0xNzE2LDQ0ICsxNjk0LDQ5IEBACiAJaWYgKHBjaV9lbmFibGVfbXNpKHBkZXYpKQogCQlwY2lfaW50eChwZGV2LCAxKTsKIAotCXByb2JlX2VudCA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqcHJvYmVfZW50KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHByb2JlX2VudCA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXByb2JlX2VudC0+ZGV2ID0gcGNpX2Rldl90b19kZXYocGRldik7Ci0JSU5JVF9MSVNUX0hFQUQoJnByb2JlX2VudC0+bm9kZSk7Ci0KIAlocHJpdiA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqaHByaXYpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWhwcml2KQogCQlyZXR1cm4gLUVOT01FTTsKIAotCXByb2JlX2VudC0+c2h0CQk9IGFoY2lfcG9ydF9pbmZvW2JvYXJkX2lkeF0uc2h0OwotCXByb2JlX2VudC0+cG9ydF9mbGFncwk9IGFoY2lfcG9ydF9pbmZvW2JvYXJkX2lkeF0uZmxhZ3M7Ci0JcHJvYmVfZW50LT5waW9fbWFzawk9IGFoY2lfcG9ydF9pbmZvW2JvYXJkX2lkeF0ucGlvX21hc2s7Ci0JcHJvYmVfZW50LT51ZG1hX21hc2sJPSBhaGNpX3BvcnRfaW5mb1tib2FyZF9pZHhdLnVkbWFfbWFzazsKLQlwcm9iZV9lbnQtPnBvcnRfb3BzCT0gYWhjaV9wb3J0X2luZm9bYm9hcmRfaWR4XS5wb3J0X29wczsKKwkvKiBzYXZlIGluaXRpYWwgY29uZmlnICovCisJYWhjaV9zYXZlX2luaXRpYWxfY29uZmlnKHBkZXYsICZwaSwgaHByaXYpOwogCi0gICAgICAgCXByb2JlX2VudC0+aXJxID0gcGRldi0+aXJxOwotICAgICAgIAlwcm9iZV9lbnQtPmlycV9mbGFncyA9IElSUUZfU0hBUkVEOwotCXByb2JlX2VudC0+aW9tYXAgPSBwY2ltX2lvbWFwX3RhYmxlKHBkZXYpOwotCXByb2JlX2VudC0+cHJpdmF0ZV9kYXRhID0gaHByaXY7CisJLyogcHJlcGFyZSBob3N0ICovCisJaWYgKCEocGkuZmxhZ3MgJiBBSENJX0ZMQUdfTk9fTkNRKSAmJiAoaHByaXYtPmNhcCAmIEhPU1RfQ0FQX05DUSkpCisJCXBpLmZsYWdzIHw9IEFUQV9GTEFHX05DUTsKKworCWhvc3QgPSBhdGFfaG9zdF9hbGxvY19waW5mbygmcGRldi0+ZGV2LCBwcGksIGZscyhocHJpdi0+cG9ydF9tYXApKTsKKwlpZiAoIWhvc3QpCisJCXJldHVybiAtRU5PTUVNOworCWhvc3QtPmlvbWFwID0gcGNpbV9pb21hcF90YWJsZShwZGV2KTsKKwlob3N0LT5wcml2YXRlX2RhdGEgPSBocHJpdjsKKworCWZvciAoaSA9IDA7IGkgPCBob3N0LT5uX3BvcnRzOyBpKyspIHsKKwkJaWYgKGhwcml2LT5wb3J0X21hcCAmICgxIDw8IGkpKSB7CisJCQlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gaG9zdC0+cG9ydHNbaV07CisJCQl2b2lkIF9faW9tZW0gKnBvcnRfbW1pbyA9IGFoY2lfcG9ydF9iYXNlKGFwKTsKKworCQkJYXAtPmlvYWRkci5jbWRfYWRkciA9IHBvcnRfbW1pbzsKKwkJCWFwLT5pb2FkZHIuc2NyX2FkZHIgPSBwb3J0X21taW8gKyBQT1JUX1NDUjsKKwkJfSBlbHNlCisJCQlob3N0LT5wb3J0c1tpXS0+b3BzID0gJmF0YV9kdW1teV9wb3J0X29wczsKKwl9CiAKIAkvKiBpbml0aWFsaXplIGFkYXB0ZXIgKi8KLQlyYyA9IGFoY2lfaG9zdF9pbml0KHByb2JlX2VudCk7CisJcmMgPSBhaGNpX2NvbmZpZ3VyZV9kbWFfbWFza3MocGRldiwgaHByaXYtPmNhcCAmIEhPU1RfQ0FQXzY0KTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIAotCWlmICghKHByb2JlX2VudC0+cG9ydF9mbGFncyAmIEFIQ0lfRkxBR19OT19OQ1EpICYmCi0JICAgIChocHJpdi0+Y2FwICYgSE9TVF9DQVBfTkNRKSkKLQkJcHJvYmVfZW50LT5wb3J0X2ZsYWdzIHw9IEFUQV9GTEFHX05DUTsKKwlyYyA9IGFoY2lfcmVzZXRfY29udHJvbGxlcihob3N0KTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKIAotCWFoY2lfcHJpbnRfaW5mbyhwcm9iZV9lbnQpOworCWFoY2lfaW5pdF9jb250cm9sbGVyKGhvc3QpOworCWFoY2lfcHJpbnRfaW5mbyhob3N0KTsKIAotCWlmICghYXRhX2RldmljZV9hZGQocHJvYmVfZW50KSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlkZXZtX2tmcmVlKGRldiwgcHJvYmVfZW50KTsKLQlyZXR1cm4gMDsKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKwlyZXR1cm4gYXRhX2hvc3RfYWN0aXZhdGUoaG9zdCwgcGRldi0+aXJxLCBhaGNpX2ludGVycnVwdCwgSVJRRl9TSEFSRUQsCisJCQkJICZhaGNpX3NodCk7CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IGFoY2lfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvYXRhX2dlbmVyaWMuYyBiL2RyaXZlcnMvYXRhL2F0YV9nZW5lcmljLmMKaW5kZXggZDhlNzk4OC4uOTJhNDkxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvYXRhX2dlbmVyaWMuYworKysgYi9kcml2ZXJzL2F0YS9hdGFfZ2VuZXJpYy5jCkBAIC0zMywzNSArMzMsNiBAQAogICovCiAKIC8qKgotICoJZ2VuZXJpY19wcmVfcmVzZXQJCS0JcHJvYmUgYmVnaW4KLSAqCUBhcDogQVRBIHBvcnQKLSAqCi0gKglTZXQgdXAgY2FibGUgdHlwZSBhbmQgdXNlIGdlbmVyaWMgcHJvYmUgaW5pdAotICovCi0KLXN0YXRpYyBpbnQgZ2VuZXJpY19wcmVfcmVzZXQoc3RydWN0IGF0YV9wb3J0ICphcCkKLXsKLQlhcC0+Y2JsID0gQVRBX0NCTF9QQVRBODA7Ci0JcmV0dXJuIGF0YV9zdGRfcHJlcmVzZXQoYXApOwotfQotCi0KLS8qKgotICoJZ2VuZXJpY19lcnJvcl9oYW5kbGVyIC0gUHJvYmUgc3BlY2lmaWVkIHBvcnQgb24gUEFUQSBob3N0IGNvbnRyb2xsZXIKLSAqCUBhcDogUG9ydCB0byBwcm9iZQotICoJQGNsYXNzZXM6Ci0gKgotICoJTE9DS0lORzoKLSAqCU5vbmUgKGluaGVyaXRlZCBmcm9tIGNhbGxlcikuCi0gKi8KLQotCi1zdGF0aWMgdm9pZCBnZW5lcmljX2Vycm9yX2hhbmRsZXIoc3RydWN0IGF0YV9wb3J0ICphcCkKLXsKLQlhdGFfYm1kbWFfZHJpdmVfZWgoYXAsIGdlbmVyaWNfcHJlX3Jlc2V0LCBhdGFfc3RkX3NvZnRyZXNldCwgTlVMTCwgYXRhX3N0ZF9wb3N0cmVzZXQpOwotfQotCi0vKioKICAqCWdlbmVyaWNfc2V0X21vZGUJLQltb2RlIHNldHRpbmcKICAqCUBhcDogaW50ZXJmYWNlIHRvIHNldCB1cAogICoJQHVudXNlZDogcmV0dXJuZWQgZGV2aWNlIG9uIGVycm9yCkBAIC0xNDQsOCArMTE1LDkgQEAKIAogCS5mcmVlemUJCT0gYXRhX2JtZG1hX2ZyZWV6ZSwKIAkudGhhdwkJPSBhdGFfYm1kbWFfdGhhdywKLQkuZXJyb3JfaGFuZGxlcgk9IGdlbmVyaWNfZXJyb3JfaGFuZGxlciwKKwkuZXJyb3JfaGFuZGxlcgk9IGF0YV9ibWRtYV9lcnJvcl9oYW5kbGVyLAogCS5wb3N0X2ludGVybmFsX2NtZCA9IGF0YV9ibWRtYV9wb3N0X2ludGVybmFsX2NtZCwKKwkuY2FibGVfZGV0ZWN0CT0gYXRhX2NhYmxlX3Vua25vd24sCiAKIAkucWNfcHJlcCAJPSBhdGFfcWNfcHJlcCwKIAkucWNfaXNzdWUJPSBhdGFfcWNfaXNzdWVfcHJvdCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL2F0YV9waWl4LmMgYi9kcml2ZXJzL2F0YS9hdGFfcGlpeC5jCmluZGV4IGI5NTJjNTguLjU1ZDMwNmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL2F0YV9waWl4LmMKKysrIGIvZHJpdmVycy9hdGEvYXRhX3BpaXguYwpAQCAtOTMsNyArOTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpYmF0YS5oPgogCiAjZGVmaW5lIERSVl9OQU1FCSJhdGFfcGlpeCIKLSNkZWZpbmUgRFJWX1ZFUlNJT04JIjIuMTBhYzEiCisjZGVmaW5lIERSVl9WRVJTSU9OCSIyLjExIgogCiBlbnVtIHsKIAlQSUlYX0lPQ0ZHCQk9IDB4NTQsIC8qIElERSBJL08gY29uZmlndXJhdGlvbiByZWdpc3RlciAqLwpAQCAtMTU1LDExICsxNTUsMTEgQEAKIHN0YXRpYyBpbnQgcGlpeF9pbml0X29uZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYsCiAJCQkJICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpOwogc3RhdGljIHZvaWQgcGlpeF9wYXRhX2Vycm9yX2hhbmRsZXIoc3RydWN0IGF0YV9wb3J0ICphcCk7Ci1zdGF0aWMgdm9pZCBpY2hfcGF0YV9lcnJvcl9oYW5kbGVyKHN0cnVjdCBhdGFfcG9ydCAqYXApOwogc3RhdGljIHZvaWQgcGlpeF9zYXRhX2Vycm9yX2hhbmRsZXIoc3RydWN0IGF0YV9wb3J0ICphcCk7CiBzdGF0aWMgdm9pZCBwaWl4X3NldF9waW9tb2RlIChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX2RldmljZSAqYWRldik7CiBzdGF0aWMgdm9pZCBwaWl4X3NldF9kbWFtb2RlIChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX2RldmljZSAqYWRldik7CiBzdGF0aWMgdm9pZCBpY2hfc2V0X2RtYW1vZGUgKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfZGV2aWNlICphZGV2KTsKK3N0YXRpYyBpbnQgaWNoX3BhdGFfY2FibGVfZGV0ZWN0KHN0cnVjdCBhdGFfcG9ydCAqYXApOwogCiBzdGF0aWMgdW5zaWduZWQgaW50IGluX21vZHVsZV9pbml0ID0gMTsKIApAQCAtMzA1LDYgKzMwNSw3IEBACiAJLnRoYXcJCQk9IGF0YV9ibWRtYV90aGF3LAogCS5lcnJvcl9oYW5kbGVyCQk9IHBpaXhfcGF0YV9lcnJvcl9oYW5kbGVyLAogCS5wb3N0X2ludGVybmFsX2NtZAk9IGF0YV9ibWRtYV9wb3N0X2ludGVybmFsX2NtZCwKKwkuY2FibGVfZGV0ZWN0CQk9IGF0YV9jYWJsZV80MHdpcmUsCiAKIAkuaXJxX2hhbmRsZXIJCT0gYXRhX2ludGVycnVwdCwKIAkuaXJxX2NsZWFyCQk9IGF0YV9ibWRtYV9pcnFfY2xlYXIsCkBAIC0zMzYsOCArMzM3LDkgQEAKIAogCS5mcmVlemUJCQk9IGF0YV9ibWRtYV9mcmVlemUsCiAJLnRoYXcJCQk9IGF0YV9ibWRtYV90aGF3LAotCS5lcnJvcl9oYW5kbGVyCQk9IGljaF9wYXRhX2Vycm9yX2hhbmRsZXIsCisJLmVycm9yX2hhbmRsZXIJCT0gcGlpeF9wYXRhX2Vycm9yX2hhbmRsZXIsCiAJLnBvc3RfaW50ZXJuYWxfY21kCT0gYXRhX2JtZG1hX3Bvc3RfaW50ZXJuYWxfY21kLAorCS5jYWJsZV9kZXRlY3QJCT0gaWNoX3BhdGFfY2FibGVfZGV0ZWN0LAogCiAJLmlycV9oYW5kbGVyCQk9IGF0YV9pbnRlcnJ1cHQsCiAJLmlycV9jbGVhcgkJPSBhdGFfYm1kbWFfaXJxX2NsZWFyLApAQCAtNTgwLDEyICs1ODIsMTMgQEAKIAkvKiBkZXZpZCwgc3VidmVuZG9yLCBzdWJkZXYgKi8KIAl7IDB4MjdERiwgMHgwMDA1LCAweDAyODAgfSwJLyogSUNINyBvbiBBY2VyIDU2MDJXTE1pICovCiAJeyAweDI3REYsIDB4MTAyNSwgMHgwMTEwIH0sCS8qIElDSDcgb24gQWNlciAzNjgyV0xNaSAqLworCXsgMHgyN0RGLCAweDEwNDMsIDB4MTI2NyB9LAkvKiBJQ0g3IG9uIEFzdXMgVzVGICovCiAJLyogZW5kIG1hcmtlciAqLwogCXsgMCwgfQogfTsKIAogLyoqCi0gKglwaWl4X3BhdGFfY2JsX2RldGVjdCAtIFByb2JlIGhvc3QgY29udHJvbGxlciBjYWJsZSBkZXRlY3QgaW5mbworICoJaWNoX3BhdGFfY2FibGVfZGV0ZWN0IC0gUHJvYmUgaG9zdCBjb250cm9sbGVyIGNhYmxlIGRldGVjdCBpbmZvCiAgKglAYXA6IFBvcnQgZm9yIHdoaWNoIGNhYmxlIGRldGVjdCBpbmZvIGlzIGRlc2lyZWQKICAqCiAgKglSZWFkIDgwYyBjYWJsZSBpbmRpY2F0b3IgZnJvbSBBVEEgUENJIGRldmljZSdzIFBDSSBjb25maWcKQEAgLTU5NSwyMyArNTk4LDE4IEBACiAgKglOb25lIChpbmhlcml0ZWQgZnJvbSBjYWxsZXIpLgogICovCiAKLXN0YXRpYyB2b2lkIGljaF9wYXRhX2NibF9kZXRlY3Qoc3RydWN0IGF0YV9wb3J0ICphcCkKK3N0YXRpYyBpbnQgaWNoX3BhdGFfY2FibGVfZGV0ZWN0KHN0cnVjdCBhdGFfcG9ydCAqYXApCiB7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGFwLT5ob3N0LT5kZXYpOwogCWNvbnN0IHN0cnVjdCBpY2hfbGFwdG9wICpsYXAgPSAmaWNoX2xhcHRvcFswXTsKIAl1OCB0bXAsIG1hc2s7CiAKLQkvKiBubyA4MGMgc3VwcG9ydCBpbiBob3N0IGNvbnRyb2xsZXI/ICovCi0JaWYgKChhcC0+dWRtYV9tYXNrICYgfkFUQV9VRE1BX01BU0tfNDBDKSA9PSAwKQotCQlnb3RvIGNibDQwOwotCiAJLyogQ2hlY2sgZm9yIHNwZWNpYWxzIC0gQWNlciBBc3BpcmUgNTYwMldMTWkgKi8KIAl3aGlsZSAobGFwLT5kZXZpY2UpIHsKIAkJaWYgKGxhcC0+ZGV2aWNlID09IHBkZXYtPmRldmljZSAmJgogCQkgICAgbGFwLT5zdWJ2ZW5kb3IgPT0gcGRldi0+c3Vic3lzdGVtX3ZlbmRvciAmJgogCQkgICAgbGFwLT5zdWJkZXZpY2UgPT0gcGRldi0+c3Vic3lzdGVtX2RldmljZSkgewotCQkJYXAtPmNibCA9IEFUQV9DQkxfUEFUQTQwX1NIT1JUOwotCQkgICAgCXJldHVybjsKKwkJCXJldHVybiBBVEFfQ0JMX1BBVEE0MF9TSE9SVDsKIAkJfQogCQlsYXArKzsKIAl9CkBAIC02MjAsMjAgKzYxOCwxNCBAQAogCW1hc2sgPSBhcC0+cG9ydF9ubyA9PSAwID8gUElJWF84MENfUFJJIDogUElJWF84MENfU0VDOwogCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFBJSVhfSU9DRkcsICZ0bXApOwogCWlmICgodG1wICYgbWFzaykgPT0gMCkKLQkJZ290byBjYmw0MDsKLQotCWFwLT5jYmwgPSBBVEFfQ0JMX1BBVEE4MDsKLQlyZXR1cm47Ci0KLWNibDQwOgotCWFwLT5jYmwgPSBBVEFfQ0JMX1BBVEE0MDsKKwkJcmV0dXJuIEFUQV9DQkxfUEFUQTQwOworCXJldHVybiBBVEFfQ0JMX1BBVEE4MDsKIH0KIAogLyoqCiAgKglwaWl4X3BhdGFfcHJlcmVzZXQgLSBwcmVyZXNldCBmb3IgUEFUQSBob3N0IGNvbnRyb2xsZXIKICAqCUBhcDogVGFyZ2V0IHBvcnQKICAqCi0gKgogICoJTE9DS0lORzoKICAqCU5vbmUgKGluaGVyaXRlZCBmcm9tIGNhbGxlcikuCiAgKi8KQEAgLTY0Myw4ICs2MzUsNiBAQAogCiAJaWYgKCFwY2lfdGVzdF9jb25maWdfYml0cyhwZGV2LCAmcGlpeF9lbmFibGVfYml0c1thcC0+cG9ydF9ub10pKQogCQlyZXR1cm4gLUVOT0VOVDsKLQotCWFwLT5jYmwgPSBBVEFfQ0JMX1BBVEE0MDsKIAlyZXR1cm4gYXRhX3N0ZF9wcmVyZXNldChhcCk7CiB9CiAKQEAgLTY1NSwzMCArNjQ1LDYgQEAKIH0KIAogCi0vKioKLSAqCWljaF9wYXRhX3ByZXJlc2V0IC0gcHJlcmVzZXQgZm9yIFBBVEEgaG9zdCBjb250cm9sbGVyCi0gKglAYXA6IFRhcmdldCBwb3J0Ci0gKgotICoKLSAqCUxPQ0tJTkc6Ci0gKglOb25lIChpbmhlcml0ZWQgZnJvbSBjYWxsZXIpLgotICovCi1zdGF0aWMgaW50IGljaF9wYXRhX3ByZXJlc2V0KHN0cnVjdCBhdGFfcG9ydCAqYXApCi17Ci0Jc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGFwLT5ob3N0LT5kZXYpOwotCi0JaWYgKCFwY2lfdGVzdF9jb25maWdfYml0cyhwZGV2LCAmcGlpeF9lbmFibGVfYml0c1thcC0+cG9ydF9ub10pKQotCQlyZXR1cm4gLUVOT0VOVDsKLQlpY2hfcGF0YV9jYmxfZGV0ZWN0KGFwKTsKLQlyZXR1cm4gYXRhX3N0ZF9wcmVyZXNldChhcCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGljaF9wYXRhX2Vycm9yX2hhbmRsZXIoc3RydWN0IGF0YV9wb3J0ICphcCkKLXsKLQlhdGFfYm1kbWFfZHJpdmVfZWgoYXAsIGljaF9wYXRhX3ByZXJlc2V0LCBhdGFfc3RkX3NvZnRyZXNldCwgTlVMTCwKLQkJCSAgIGF0YV9zdGRfcG9zdHJlc2V0KTsKLX0KLQogc3RhdGljIHZvaWQgcGlpeF9zYXRhX2Vycm9yX2hhbmRsZXIoc3RydWN0IGF0YV9wb3J0ICphcCkKIHsKIAlhdGFfYm1kbWFfZHJpdmVfZWgoYXAsIGF0YV9zdGRfcHJlcmVzZXQsIGF0YV9zdGRfc29mdHJlc2V0LCBOVUxMLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvbGliYXRhLWNvcmUuYyBiL2RyaXZlcnMvYXRhL2xpYmF0YS1jb3JlLmMKaW5kZXggMGFiZDcyZC4uY2E2NzQ4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvbGliYXRhLWNvcmUuYworKysgYi9kcml2ZXJzL2F0YS9saWJhdGEtY29yZS5jCkBAIC03Miw3ICs3Miw3IEBACiBzdGF0aWMgdW5zaWduZWQgaW50IGF0YV9kZXZfc2V0X3hmZXJtb2RlKHN0cnVjdCBhdGFfZGV2aWNlICpkZXYpOwogc3RhdGljIHZvaWQgYXRhX2Rldl94ZmVybWFzayhzdHJ1Y3QgYXRhX2RldmljZSAqZGV2KTsKIAotc3RhdGljIHVuc2lnbmVkIGludCBhdGFfcHJpbnRfaWQgPSAxOwordW5zaWduZWQgaW50IGF0YV9wcmludF9pZCA9IDE7CiBzdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmF0YV93cTsKIAogc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmF0YV9hdXhfd3E7CkBAIC04OSw2ICs4OSwxMCBAQAogbW9kdWxlX3BhcmFtX25hbWVkKGZ1YSwgbGliYXRhX2Z1YSwgaW50LCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoZnVhLCAiRlVBIHN1cHBvcnQgKDA9b2ZmLCAxPW9uKSIpOwogCitzdGF0aWMgaW50IGF0YV9pZ25vcmVfaHBhID0gMDsKK21vZHVsZV9wYXJhbV9uYW1lZChpZ25vcmVfaHBhLCBhdGFfaWdub3JlX2hwYSwgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoaWdub3JlX2hwYSwgIklnbm9yZSBIUEEgbGltaXQgKDA9a2VlcCBCSU9TIGxpbWl0cywgMT1pZ25vcmUgbGltaXRzLCB1c2luZyBmdWxsIGRpc2spIik7CisKIHN0YXRpYyBpbnQgYXRhX3Byb2JlX3RpbWVvdXQgPSBBVEFfVE1PVVRfSU5URVJOQUwgLyBIWjsKIG1vZHVsZV9wYXJhbShhdGFfcHJvYmVfdGltZW91dCwgaW50LCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoYXRhX3Byb2JlX3RpbWVvdXQsICJTZXQgQVRBIHByb2JpbmcgdGltZW91dCAoc2Vjb25kcykiKTsKQEAgLTgwOCw2ICs4MTIsMjA1IEBACiAJKnAgPSAnXDAnOwogfQogCitzdGF0aWMgdTY0IGF0YV90Zl90b19sYmE0OChzdHJ1Y3QgYXRhX3Rhc2tmaWxlICp0ZikKK3sKKwl1NjQgc2VjdG9ycyA9IDA7CisKKwlzZWN0b3JzIHw9ICgodTY0KSh0Zi0+aG9iX2xiYWggJiAweGZmKSkgPDwgNDA7CisJc2VjdG9ycyB8PSAoKHU2NCkodGYtPmhvYl9sYmFtICYgMHhmZikpIDw8IDMyOworCXNlY3RvcnMgfD0gKHRmLT5ob2JfbGJhbCAmIDB4ZmYpIDw8IDI0OworCXNlY3RvcnMgfD0gKHRmLT5sYmFoICYgMHhmZikgPDwgMTY7CisJc2VjdG9ycyB8PSAodGYtPmxiYW0gJiAweGZmKSA8PCA4OworCXNlY3RvcnMgfD0gKHRmLT5sYmFsICYgMHhmZik7CisKKwlyZXR1cm4gKytzZWN0b3JzOworfQorCitzdGF0aWMgdTY0IGF0YV90Zl90b19sYmEoc3RydWN0IGF0YV90YXNrZmlsZSAqdGYpCit7CisJdTY0IHNlY3RvcnMgPSAwOworCisJc2VjdG9ycyB8PSAodGYtPmRldmljZSAmIDB4MGYpIDw8IDI0OworCXNlY3RvcnMgfD0gKHRmLT5sYmFoICYgMHhmZikgPDwgMTY7CisJc2VjdG9ycyB8PSAodGYtPmxiYW0gJiAweGZmKSA8PCA4OworCXNlY3RvcnMgfD0gKHRmLT5sYmFsICYgMHhmZik7CisKKwlyZXR1cm4gKytzZWN0b3JzOworfQorCisvKioKKyAqCWF0YV9yZWFkX25hdGl2ZV9tYXhfYWRkcmVzc19leHQJLQlMQkE0OCBuYXRpdmUgbWF4IHF1ZXJ5CisgKglAZGV2OiBEZXZpY2UgdG8gcXVlcnkKKyAqCisgKglQZXJmb3JtIGFuIExCQTQ4IHNpemUgcXVlcnkgdXBvbiB0aGUgZGV2aWNlIGluIHF1ZXN0aW9uLiBSZXR1cm4gdGhlCisgKglhY3R1YWwgTEJBNDggc2l6ZSBvciB6ZXJvIGlmIHRoZSBjb21tYW5kIGZhaWxzLgorICovCisKK3N0YXRpYyB1NjQgYXRhX3JlYWRfbmF0aXZlX21heF9hZGRyZXNzX2V4dChzdHJ1Y3QgYXRhX2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIGludCBlcnI7CisJc3RydWN0IGF0YV90YXNrZmlsZSB0ZjsKKworCWF0YV90Zl9pbml0KGRldiwgJnRmKTsKKworCXRmLmNvbW1hbmQgPSBBVEFfQ01EX1JFQURfTkFUSVZFX01BWF9FWFQ7CisJdGYuZmxhZ3MgfD0gQVRBX1RGTEFHX0RFVklDRSB8IEFUQV9URkxBR19MQkE0OCB8IEFUQV9URkxBR19JU0FERFI7CisJdGYucHJvdG9jb2wgfD0gQVRBX1BST1RfTk9EQVRBOworCXRmLmRldmljZSB8PSAweDQwOworCisJZXJyID0gYXRhX2V4ZWNfaW50ZXJuYWwoZGV2LCAmdGYsIE5VTEwsIERNQV9OT05FLCBOVUxMLCAwKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBhdGFfdGZfdG9fbGJhNDgoJnRmKTsKK30KKworLyoqCisgKglhdGFfcmVhZF9uYXRpdmVfbWF4X2FkZHJlc3MJLQlMQkEyOCBuYXRpdmUgbWF4IHF1ZXJ5CisgKglAZGV2OiBEZXZpY2UgdG8gcXVlcnkKKyAqCisgKglQZXJmb3JtYSBhbiBMQkEyOCBzaXplIHF1ZXJ5IHVwb24gdGhlIGRldmljZSBpbiBxdWVzdGlvbi4gUmV0dXJuIHRoZQorICoJYWN0dWFsIExCQTI4IHNpemUgb3IgemVybyBpZiB0aGUgY29tbWFuZCBmYWlscy4KKyAqLworCitzdGF0aWMgdTY0IGF0YV9yZWFkX25hdGl2ZV9tYXhfYWRkcmVzcyhzdHJ1Y3QgYXRhX2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIGludCBlcnI7CisJc3RydWN0IGF0YV90YXNrZmlsZSB0ZjsKKworCWF0YV90Zl9pbml0KGRldiwgJnRmKTsKKworCXRmLmNvbW1hbmQgPSBBVEFfQ01EX1JFQURfTkFUSVZFX01BWDsKKwl0Zi5mbGFncyB8PSBBVEFfVEZMQUdfREVWSUNFIHwgQVRBX1RGTEFHX0lTQUREUjsKKwl0Zi5wcm90b2NvbCB8PSBBVEFfUFJPVF9OT0RBVEE7CisJdGYuZGV2aWNlIHw9IDB4NDA7CisKKwllcnIgPSBhdGFfZXhlY19pbnRlcm5hbChkZXYsICZ0ZiwgTlVMTCwgRE1BX05PTkUsIE5VTEwsIDApOworCWlmIChlcnIpCisJCXJldHVybiAwOworCisJcmV0dXJuIGF0YV90Zl90b19sYmEoJnRmKTsKK30KKworLyoqCisgKglhdGFfc2V0X25hdGl2ZV9tYXhfYWRkcmVzc19leHQJLQlMQkE0OCBuYXRpdmUgbWF4IHNldAorICoJQGRldjogRGV2aWNlIHRvIHF1ZXJ5CisgKgorICoJUGVyZm9ybSBhbiBMQkE0OCBzaXplIHNldCBtYXggdXBvbiB0aGUgZGV2aWNlIGluIHF1ZXN0aW9uLiBSZXR1cm4gdGhlCisgKglhY3R1YWwgTEJBNDggc2l6ZSBvciB6ZXJvIGlmIHRoZSBjb21tYW5kIGZhaWxzLgorICovCisKK3N0YXRpYyB1NjQgYXRhX3NldF9uYXRpdmVfbWF4X2FkZHJlc3NfZXh0KHN0cnVjdCBhdGFfZGV2aWNlICpkZXYsIHU2NCBuZXdfc2VjdG9ycykKK3sKKwl1bnNpZ25lZCBpbnQgZXJyOworCXN0cnVjdCBhdGFfdGFza2ZpbGUgdGY7CisKKwluZXdfc2VjdG9ycy0tOworCisJYXRhX3RmX2luaXQoZGV2LCAmdGYpOworCisJdGYuY29tbWFuZCA9IEFUQV9DTURfU0VUX01BWF9FWFQ7CisJdGYuZmxhZ3MgfD0gQVRBX1RGTEFHX0RFVklDRSB8IEFUQV9URkxBR19MQkE0OCB8IEFUQV9URkxBR19JU0FERFI7CisJdGYucHJvdG9jb2wgfD0gQVRBX1BST1RfTk9EQVRBOworCXRmLmRldmljZSB8PSAweDQwOworCisJdGYubGJhbCA9IChuZXdfc2VjdG9ycyA+PiAwKSAmIDB4ZmY7CisJdGYubGJhbSA9IChuZXdfc2VjdG9ycyA+PiA4KSAmIDB4ZmY7CisJdGYubGJhaCA9IChuZXdfc2VjdG9ycyA+PiAxNikgJiAweGZmOworCisJdGYuaG9iX2xiYWwgPSAobmV3X3NlY3RvcnMgPj4gMjQpICYgMHhmZjsKKwl0Zi5ob2JfbGJhbSA9IChuZXdfc2VjdG9ycyA+PiAzMikgJiAweGZmOworCXRmLmhvYl9sYmFoID0gKG5ld19zZWN0b3JzID4+IDQwKSAmIDB4ZmY7CisKKwllcnIgPSBhdGFfZXhlY19pbnRlcm5hbChkZXYsICZ0ZiwgTlVMTCwgRE1BX05PTkUsIE5VTEwsIDApOworCWlmIChlcnIpCisJCXJldHVybiAwOworCisJcmV0dXJuIGF0YV90Zl90b19sYmE0OCgmdGYpOworfQorCisvKioKKyAqCWF0YV9zZXRfbmF0aXZlX21heF9hZGRyZXNzCS0JTEJBMjggbmF0aXZlIG1heCBzZXQKKyAqCUBkZXY6IERldmljZSB0byBxdWVyeQorICoKKyAqCVBlcmZvcm0gYW4gTEJBMjggc2l6ZSBzZXQgbWF4IHVwb24gdGhlIGRldmljZSBpbiBxdWVzdGlvbi4gUmV0dXJuIHRoZQorICoJYWN0dWFsIExCQTI4IHNpemUgb3IgemVybyBpZiB0aGUgY29tbWFuZCBmYWlscy4KKyAqLworCitzdGF0aWMgdTY0IGF0YV9zZXRfbmF0aXZlX21heF9hZGRyZXNzKHN0cnVjdCBhdGFfZGV2aWNlICpkZXYsIHU2NCBuZXdfc2VjdG9ycykKK3sKKwl1bnNpZ25lZCBpbnQgZXJyOworCXN0cnVjdCBhdGFfdGFza2ZpbGUgdGY7CisKKwluZXdfc2VjdG9ycy0tOworCisJYXRhX3RmX2luaXQoZGV2LCAmdGYpOworCisJdGYuY29tbWFuZCA9IEFUQV9DTURfU0VUX01BWDsKKwl0Zi5mbGFncyB8PSBBVEFfVEZMQUdfREVWSUNFIHwgQVRBX1RGTEFHX0lTQUREUjsKKwl0Zi5wcm90b2NvbCB8PSBBVEFfUFJPVF9OT0RBVEE7CisKKwl0Zi5sYmFsID0gKG5ld19zZWN0b3JzID4+IDApICYgMHhmZjsKKwl0Zi5sYmFtID0gKG5ld19zZWN0b3JzID4+IDgpICYgMHhmZjsKKwl0Zi5sYmFoID0gKG5ld19zZWN0b3JzID4+IDE2KSAmIDB4ZmY7CisJdGYuZGV2aWNlIHw9ICgobmV3X3NlY3RvcnMgPj4gMjQpICYgMHgwZikgfCAweDQwOworCisJZXJyID0gYXRhX2V4ZWNfaW50ZXJuYWwoZGV2LCAmdGYsIE5VTEwsIERNQV9OT05FLCBOVUxMLCAwKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBhdGFfdGZfdG9fbGJhKCZ0Zik7Cit9CisKKy8qKgorICoJYXRhX2hwYV9yZXNpemUJCS0JUmVzaXplIGEgZGV2aWNlIHdpdGggYW4gSFBBIHNldAorICoJQGRldjogRGV2aWNlIHRvIHJlc2l6ZQorICoKKyAqCVJlYWQgdGhlIHNpemUgb2YgYW4gTEJBMjggb3IgTEJBNDggZGlzayB3aXRoIEhQQSBmZWF0dXJlcyBhbmQgcmVzaXplCisgKglpdCBpZiByZXF1aXJlZCB0byB0aGUgZnVsbCBzaXplIG9mIHRoZSBtZWRpYS4gVGhlIGNhbGxlciBtdXN0IGNoZWNrCisgKgl0aGUgZHJpdmUgaGFzIHRoZSBIUEEgZmVhdHVyZSBzZXQgZW5hYmxlZC4KKyAqLworCitzdGF0aWMgdTY0IGF0YV9ocGFfcmVzaXplKHN0cnVjdCBhdGFfZGV2aWNlICpkZXYpCit7CisJdTY0IHNlY3RvcnMgPSBkZXYtPm5fc2VjdG9yczsKKwl1NjQgaHBhX3NlY3RvcnM7CisJCisJaWYgKGF0YV9pZF9oYXNfbGJhNDgoZGV2LT5pZCkpCisJCWhwYV9zZWN0b3JzID0gYXRhX3JlYWRfbmF0aXZlX21heF9hZGRyZXNzX2V4dChkZXYpOworCWVsc2UKKwkJaHBhX3NlY3RvcnMgPSBhdGFfcmVhZF9uYXRpdmVfbWF4X2FkZHJlc3MoZGV2KTsKKworCS8qIGlmIG5vIGhwYSwgYm90aCBzaG91bGQgYmUgZXF1YWwgKi8KKwlhdGFfZGV2X3ByaW50ayhkZXYsIEtFUk5fSU5GTywgIiVzIDE6IHNlY3RvcnMgPSAlbGxkLCAiCisJCQkJImhwYV9zZWN0b3JzID0gJWxsZFxuIiwKKwkJX19GVU5DVElPTl9fLCAobG9uZyBsb25nKXNlY3RvcnMsIChsb25nIGxvbmcpaHBhX3NlY3RvcnMpOworCisJaWYgKGhwYV9zZWN0b3JzID4gc2VjdG9ycykgeworCQlhdGFfZGV2X3ByaW50ayhkZXYsIEtFUk5fSU5GTywKKwkJCSJIb3N0IFByb3RlY3RlZCBBcmVhIGRldGVjdGVkOlxuIgorCQkJIlx0Y3VycmVudCBzaXplOiAlbGxkIHNlY3RvcnNcbiIKKwkJCSJcdG5hdGl2ZSBzaXplOiAlbGxkIHNlY3RvcnNcbiIsCisJCQkobG9uZyBsb25nKXNlY3RvcnMsIChsb25nIGxvbmcpaHBhX3NlY3RvcnMpOworCisJCWlmIChhdGFfaWdub3JlX2hwYSkgeworCQkJaWYgKGF0YV9pZF9oYXNfbGJhNDgoZGV2LT5pZCkpCisJCQkJaHBhX3NlY3RvcnMgPSBhdGFfc2V0X25hdGl2ZV9tYXhfYWRkcmVzc19leHQoZGV2LCBocGFfc2VjdG9ycyk7CisJCQllbHNlCisJCQkJaHBhX3NlY3RvcnMgPSBhdGFfc2V0X25hdGl2ZV9tYXhfYWRkcmVzcyhkZXYsCisJCQkJCQkJCWhwYV9zZWN0b3JzKTsKKworCQkJaWYgKGhwYV9zZWN0b3JzKSB7CisJCQkJYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX0lORk8sICJuYXRpdmUgc2l6ZSAiCisJCQkJCSJpbmNyZWFzZWQgdG8gJWxsZCBzZWN0b3JzXG4iLAorCQkJCQkobG9uZyBsb25nKWhwYV9zZWN0b3JzKTsKKwkJCQlyZXR1cm4gaHBhX3NlY3RvcnM7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIHNlY3RvcnM7Cit9CisKIHN0YXRpYyB1NjQgYXRhX2lkX25fc2VjdG9ycyhjb25zdCB1MTYgKmlkKQogewogCWlmIChhdGFfaWRfaGFzX2xiYShpZCkpIHsKQEAgLTEyNzAsMTIgKzE0NzMsMTYgQEAKIAlpZiAoYXAtPm9wcy0+cG9zdF9pbnRlcm5hbF9jbWQpCiAJCWFwLT5vcHMtPnBvc3RfaW50ZXJuYWxfY21kKHFjKTsKIAotCWlmICgocWMtPmZsYWdzICYgQVRBX1FDRkxBR19GQUlMRUQpICYmICFxYy0+ZXJyX21hc2spIHsKLQkJaWYgKGF0YV9tc2dfd2FybihhcCkpCi0JCQlhdGFfZGV2X3ByaW50ayhkZXYsIEtFUk5fV0FSTklORywKLQkJCQkiemVybyBlcnJfbWFzayBmb3IgZmFpbGVkICIKLQkJCQkiaW50ZXJuYWwgY29tbWFuZCwgYXNzdW1pbmcgQUNfRVJSX09USEVSXG4iKTsKLQkJcWMtPmVycl9tYXNrIHw9IEFDX0VSUl9PVEhFUjsKKwkvKiBwZXJmb3JtIG1pbmltYWwgZXJyb3IgYW5hbHlzaXMgKi8KKwlpZiAocWMtPmZsYWdzICYgQVRBX1FDRkxBR19GQUlMRUQpIHsKKwkJaWYgKHFjLT5yZXN1bHRfdGYuY29tbWFuZCAmIChBVEFfRVJSIHwgQVRBX0RGKSkKKwkJCXFjLT5lcnJfbWFzayB8PSBBQ19FUlJfREVWOworCisJCWlmICghcWMtPmVycl9tYXNrKQorCQkJcWMtPmVycl9tYXNrIHw9IEFDX0VSUl9PVEhFUjsKKworCQlpZiAocWMtPmVycl9tYXNrICYgfkFDX0VSUl9PVEhFUikKKwkJCXFjLT5lcnJfbWFzayAmPSB+QUNfRVJSX09USEVSOwogCX0KIAogCS8qIGZpbmlzaCB1cCAqLwpAQCAtMTM3OSwzMCArMTU4Niw0NCBAQAogICoJQ2hlY2sgaWYgdGhlIGN1cnJlbnQgc3BlZWQgb2YgdGhlIGRldmljZSByZXF1aXJlcyBJT1JEWS4gVXNlZAogICoJYnkgdmFyaW91cyBjb250cm9sbGVycyBmb3IgY2hpcCBjb25maWd1cmF0aW9uLgogICovCi0KKyAKIHVuc2lnbmVkIGludCBhdGFfcGlvX25lZWRfaW9yZHkoY29uc3Qgc3RydWN0IGF0YV9kZXZpY2UgKmFkZXYpCiB7Ci0JaW50IHBpbzsKLQlpbnQgc3BlZWQgPSBhZGV2LT5waW9fbW9kZSAtIFhGRVJfUElPXzA7Ci0KLQlpZiAoc3BlZWQgPCAyKQorCS8qIENvbnRyb2xsZXIgZG9lc24ndCBzdXBwb3J0ICBJT1JEWS4gUHJvYmFibHkgYSBwb2ludGxlc3MgY2hlY2sKKwkgICBhcyB0aGUgY2FsbGVyIHNob3VsZCBrbm93IHRoaXMgKi8KKwlpZiAoYWRldi0+YXAtPmZsYWdzICYgQVRBX0ZMQUdfTk9fSU9SRFkpCiAJCXJldHVybiAwOwotCWlmIChzcGVlZCA+IDIpCisJLyogUElPMyBhbmQgaGlnaGVyIGl0IGlzIG1hbmRhdG9yeSAqLworCWlmIChhZGV2LT5waW9fbW9kZSA+IFhGRVJfUElPXzIpCiAJCXJldHVybiAxOworCS8qIFdlIHR1cm4gaXQgb24gd2hlbiBwb3NzaWJsZSAqLworCWlmIChhdGFfaWRfaGFzX2lvcmR5KGFkZXYtPmlkKSkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CiAKKy8qKgorICoJYXRhX3Bpb19tYXNrX25vX2lvcmR5CS0JUmV0dXJuIHRoZSBub24gSU9SRFkgbWFzaworICoJQGFkZXY6IEFUQSBkZXZpY2UKKyAqCisgKglDb21wdXRlIHRoZSBoaWdoZXN0IG1vZGUgcG9zc2libGUgaWYgd2UgYXJlIG5vdCB1c2luZyBpb3JkeS4gUmV0dXJuCisgKgktMSBpZiBubyBpb3JkeSBtb2RlIGlzIGF2YWlsYWJsZS4KKyAqLworIAorc3RhdGljIHUzMiBhdGFfcGlvX21hc2tfbm9faW9yZHkoY29uc3Qgc3RydWN0IGF0YV9kZXZpY2UgKmFkZXYpCit7CiAJLyogSWYgd2UgaGF2ZSBubyBkcml2ZSBzcGVjaWZpYyBydWxlLCB0aGVuIFBJTyAyIGlzIG5vbiBJT1JEWSAqLwotCiAJaWYgKGFkZXYtPmlkW0FUQV9JRF9GSUVMRF9WQUxJRF0gJiAyKSB7CS8qIEVJREUgKi8KLQkJcGlvID0gYWRldi0+aWRbQVRBX0lEX0VJREVfUElPXTsKKwkJdTE2IHBpbyA9IGFkZXYtPmlkW0FUQV9JRF9FSURFX1BJT107CiAJCS8qIElzIHRoZSBzcGVlZCBmYXN0ZXIgdGhhbiB0aGUgZHJpdmUgYWxsb3dzIG5vbiBJT1JEWSA/ICovCiAJCWlmIChwaW8pIHsKIAkJCS8qIFRoaXMgaXMgY3ljbGUgdGltZXMgbm90IGZyZXF1ZW5jeSAtIHdhdGNoIHRoZSBsb2dpYyEgKi8KIAkJCWlmIChwaW8gPiAyNDApCS8qIFBJTzIgaXMgMjQwblMgcGVyIGN5Y2xlICovCi0JCQkJcmV0dXJuIDE7Ci0JCQlyZXR1cm4gMDsKKwkJCQlyZXR1cm4gMyA8PCBBVEFfU0hJRlRfUElPOworCQkJcmV0dXJuIDcgPDwgQVRBX1NISUZUX1BJTzsKIAkJfQogCX0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gMyA8PCBBVEFfU0hJRlRfUElPOwogfQogCiAvKioKQEAgLTE0MzEsMTMgKzE2NTIsMTMgQEAKIAlzdHJ1Y3QgYXRhX3Rhc2tmaWxlIHRmOwogCXVuc2lnbmVkIGludCBlcnJfbWFzayA9IDA7CiAJY29uc3QgY2hhciAqcmVhc29uOworCWludCB0cmllZF9zcGludXAgPSAwOwogCWludCByYzsKIAogCWlmIChhdGFfbXNnX2N0bChhcCkpCiAJCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9ERUJVRywgIiVzOiBFTlRFUlxuIiwgX19GVU5DVElPTl9fKTsKIAogCWF0YV9kZXZfc2VsZWN0KGFwLCBkZXYtPmRldm5vLCAxLCAxKTsgLyogc2VsZWN0IGRldmljZSAwLzEgKi8KLQogIHJldHJ5OgogCWF0YV90Zl9pbml0KGRldiwgJnRmKTsKIApAQCAtMTQ5NCw2ICsxNzE1LDMyIEBACiAJCQlnb3RvIGVycl9vdXQ7CiAJfQogCisJaWYgKCF0cmllZF9zcGludXAgJiYgKGlkWzJdID09IDB4MzdjOCB8fCBpZFsyXSA9PSAweDczOGMpKSB7CisJCXRyaWVkX3NwaW51cCA9IDE7CisJCS8qCisJCSAqIERyaXZlIHBvd2VyZWQtdXAgaW4gc3RhbmRieSBtb2RlLCBhbmQgcmVxdWlyZXMgYSBzcGVjaWZpYworCQkgKiBTRVRfRkVBVFVSRVMgc3Bpbi11cCBzdWJjb21tYW5kIGJlZm9yZSBpdCB3aWxsIGFjY2VwdAorCQkgKiBhbnl0aGluZyBvdGhlciB0aGFuIHRoZSBvcmlnaW5hbCBJREVOVElGWSBjb21tYW5kLgorCQkgKi8KKwkJYXRhX3RmX2luaXQoZGV2LCAmdGYpOworCQl0Zi5jb21tYW5kID0gQVRBX0NNRF9TRVRfRkVBVFVSRVM7CisJCXRmLmZlYXR1cmUgPSBTRVRGRUFUVVJFU19TUElOVVA7CisJCXRmLnByb3RvY29sID0gQVRBX1BST1RfTk9EQVRBOworCQl0Zi5mbGFncyB8PSBBVEFfVEZMQUdfSVNBRERSIHwgQVRBX1RGTEFHX0RFVklDRTsKKwkJZXJyX21hc2sgPSBhdGFfZXhlY19pbnRlcm5hbChkZXYsICZ0ZiwgTlVMTCwgRE1BX05PTkUsIE5VTEwsIDApOworCQlpZiAoZXJyX21hc2spIHsKKwkJCXJjID0gLUVJTzsKKwkJCXJlYXNvbiA9ICJTUElOVVAgZmFpbGVkIjsKKwkJCWdvdG8gZXJyX291dDsKKwkJfQorCQkvKgorCQkgKiBJZiB0aGUgZHJpdmUgaW5pdGlhbGx5IHJldHVybmVkIGluY29tcGxldGUgSURFTlRJRlkgaW5mbywKKwkJICogd2Ugbm93IG11c3QgcmVpc3N1ZSB0aGUgSURFTlRJRlkgY29tbWFuZC4KKwkJICovCisJCWlmIChpZFsyXSA9PSAweDM3YzgpCisJCQlnb3RvIHJldHJ5OworCX0KKwogCWlmICgoZmxhZ3MgJiBBVEFfUkVBRElEX1BPU1RSRVNFVCkgJiYgY2xhc3MgPT0gQVRBX0RFVl9BVEEpIHsKIAkJLyoKIAkJICogVGhlIGV4YWN0IHNlcXVlbmNlIGV4cGVjdGVkIGJ5IGNlcnRhaW4gcHJlLUFUQTQgZHJpdmVzIGlzOgpAQCAtMTU2MCwyMCArMTgwNyw2IEBACiAJCXNucHJpbnRmKGRlc2MsIGRlc2Nfc3osICJOQ1EgKGRlcHRoICVkLyVkKSIsIGhkZXB0aCwgZGRlcHRoKTsKIH0KIAotc3RhdGljIHZvaWQgYXRhX3NldF9wb3J0X21heF9jbWRfbGVuKHN0cnVjdCBhdGFfcG9ydCAqYXApCi17Ci0JaW50IGk7Ci0KLQlpZiAoYXAtPnNjc2lfaG9zdCkgewotCQl1bnNpZ25lZCBpbnQgbGVuID0gMDsKLQotCQlmb3IgKGkgPSAwOyBpIDwgQVRBX01BWF9ERVZJQ0VTOyBpKyspCi0JCQlsZW4gPSBtYXgobGVuLCBhcC0+ZGV2aWNlW2ldLmNkYl9sZW4pOwotCi0JCWFwLT5zY3NpX2hvc3QtPm1heF9jbWRfbGVuID0gbGVuOwotCX0KLX0KLQogLyoqCiAgKglhdGFfZGV2X2NvbmZpZ3VyZSAtIENvbmZpZ3VyZSB0aGUgc3BlY2lmaWVkIEFUQS9BVEFQSSBkZXZpY2UKICAqCUBkZXY6IFRhcmdldCBkZXZpY2UgdG8gY29uZmlndXJlCkBAIC0xNjU4LDYgKzE4OTEsNyBAQAogCQkJc25wcmludGYocmV2YnVmLCA3LCAiQVRBLSVkIiwgIGF0YV9pZF9tYWpvcl92ZXJzaW9uKGlkKSk7CiAKIAkJZGV2LT5uX3NlY3RvcnMgPSBhdGFfaWRfbl9zZWN0b3JzKGlkKTsKKwkJZGV2LT5uX3NlY3RvcnNfYm9vdCA9IGRldi0+bl9zZWN0b3JzOwogCiAJCS8qIFNDU0kgb25seSB1c2VzIDQtY2hhciByZXZpc2lvbnMsIGR1bXAgZnVsbCA4IGNoYXJzIGZyb20gQVRBICovCiAJCWF0YV9pZF9jX3N0cmluZyhkZXYtPmlkLCBmd3JldmJ1ZiwgQVRBX0lEX0ZXX1JFViwKQEAgLTE2ODQsNiArMTkxOCw5IEBACiAJCQkJCWRldi0+ZmxhZ3MgfD0gQVRBX0RGTEFHX0ZMVVNIX0VYVDsKIAkJCX0KIAorCQkJaWYgKGF0YV9pZF9ocGFfZW5hYmxlZChkZXYtPmlkKSkKKwkJCQlkZXYtPm5fc2VjdG9ycyA9IGF0YV9ocGFfcmVzaXplKGRldik7CisKIAkJCS8qIGNvbmZpZyBOQ1EgKi8KIAkJCWF0YV9kZXZfY29uZmlnX25jcShkZXYsIG5jcV9kZXNjLCBzaXplb2YobmNxX2Rlc2MpKTsKIApAQCAtMTc3Myw4ICsyMDEwLDYgQEAKIAkJfQogCX0KIAotCWF0YV9zZXRfcG9ydF9tYXhfY21kX2xlbihhcCk7Ci0KIAkvKiBsaW1pdCBicmlkZ2UgdHJhbnNmZXJzIHRvIHVkbWE1LCAyMDAgc2VjdG9ycyAqLwogCWlmIChhdGFfZGV2X2tub2JibGUoZGV2KSkgewogCQlpZiAoYXRhX21zZ19kcnYoYXApICYmIHByaW50X2luZm8pCkBAIC0xNzg1LDE0ICsyMDIwLDE1IEBACiAJfQogCiAJaWYgKGF0YV9kZXZpY2VfYmxhY2tsaXN0ZWQoZGV2KSAmIEFUQV9IT1JLQUdFX01BWF9TRUNfMTI4KQotCQlkZXYtPm1heF9zZWN0b3JzID0gbWluKEFUQV9NQVhfU0VDVE9SU18xMjgsIGRldi0+bWF4X3NlY3RvcnMpOworCQlkZXYtPm1heF9zZWN0b3JzID0gbWluX3QodW5zaWduZWQgaW50LCBBVEFfTUFYX1NFQ1RPUlNfMTI4LAorCQkJCQkgZGV2LT5tYXhfc2VjdG9ycyk7CiAKIAkvKiBsaW1pdCBBVEFQSSBETUEgdG8gUi9XIGNvbW1hbmRzIG9ubHkgKi8KIAlpZiAoYXRhX2RldmljZV9ibGFja2xpc3RlZChkZXYpICYgQVRBX0hPUktBR0VfRE1BX1JXX09OTFkpCiAJCWRldi0+aG9ya2FnZSB8PSBBVEFfSE9SS0FHRV9ETUFfUldfT05MWTsKIAogCWlmIChhcC0+b3BzLT5kZXZfY29uZmlnKQotCQlhcC0+b3BzLT5kZXZfY29uZmlnKGFwLCBkZXYpOworCQlhcC0+b3BzLT5kZXZfY29uZmlnKGRldik7CiAKIAlpZiAoYXRhX21zZ19wcm9iZShhcCkpCiAJCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9ERUJVRywgIiVzOiBFWElULCBkcnZfc3RhdCA9IDB4JXhcbiIsCkBAIC0xODA3LDYgKzIwNDMsNTYgQEAKIH0KIAogLyoqCisgKglhdGFfY2FibGVfNDB3aXJlCS0JcmV0dXJuIDQwIHdpcmUgY2FibGUgdHlwZQorICoJQGFwOiBwb3J0CisgKgorICoJSGVscGVyIG1ldGhvZCBmb3IgZHJpdmVycyB3aGljaCB3YW50IHRvIGhhcmR3aXJlIDQwIHdpcmUgY2FibGUKKyAqCWRldGVjdGlvbi4KKyAqLworCitpbnQgYXRhX2NhYmxlXzQwd2lyZShzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCXJldHVybiBBVEFfQ0JMX1BBVEE0MDsKK30KKworLyoqCisgKglhdGFfY2FibGVfODB3aXJlCS0JcmV0dXJuIDgwIHdpcmUgY2FibGUgdHlwZQorICoJQGFwOiBwb3J0CisgKgorICoJSGVscGVyIG1ldGhvZCBmb3IgZHJpdmVycyB3aGljaCB3YW50IHRvIGhhcmR3aXJlIDgwIHdpcmUgY2FibGUKKyAqCWRldGVjdGlvbi4KKyAqLworCitpbnQgYXRhX2NhYmxlXzgwd2lyZShzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCXJldHVybiBBVEFfQ0JMX1BBVEE4MDsKK30KKworLyoqCisgKglhdGFfY2FibGVfdW5rbm93bgktCXJldHVybiB1bmtub3duIFBBVEEgY2FibGUuCisgKglAYXA6IHBvcnQKKyAqCisgKglIZWxwZXIgbWV0aG9kIGZvciBkcml2ZXJzIHdoaWNoIGhhdmUgbm8gUEFUQSBjYWJsZSBkZXRlY3Rpb24uCisgKi8KKworaW50IGF0YV9jYWJsZV91bmtub3duKHN0cnVjdCBhdGFfcG9ydCAqYXApCit7CisJcmV0dXJuIEFUQV9DQkxfUEFUQV9VTks7Cit9CisKKy8qKgorICoJYXRhX2NhYmxlX3NhdGEJLQlyZXR1cm4gU0FUQSBjYWJsZSB0eXBlCisgKglAYXA6IHBvcnQKKyAqCisgKglIZWxwZXIgbWV0aG9kIGZvciBkcml2ZXJzIHdoaWNoIGhhdmUgU0FUQSBjYWJsZXMKKyAqLworCitpbnQgYXRhX2NhYmxlX3NhdGEoc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKKwlyZXR1cm4gQVRBX0NCTF9TQVRBOworfQorCisvKioKICAqCWF0YV9idXNfcHJvYmUgLSBSZXNldCBhbmQgcHJvYmUgQVRBIGJ1cwogICoJQGFwOiBCdXMgdG8gcHJvYmUKICAqCkBAIC0xODc2LDYgKzIxNjIsMTAgQEAKIAkJCWdvdG8gZmFpbDsKIAl9CiAKKwkvKiBOb3cgYXNrIGZvciB0aGUgY2FibGUgdHlwZSBhcyBQRElBRy0gc2hvdWxkIGhhdmUgYmVlbiByZWxlYXNlZCAqLworCWlmIChhcC0+b3BzLT5jYWJsZV9kZXRlY3QpCisJCWFwLT5jYmwgPSBhcC0+b3BzLT5jYWJsZV9kZXRlY3QoYXApOworCiAJLyogQWZ0ZXIgdGhlIGlkZW50aWZ5IHNlcXVlbmNlIHdlIGNhbiBub3cgc2V0IHVwIHRoZSBkZXZpY2VzLiBXZSBkbwogCSAgIHRoaXMgaW4gdGhlIG5vcm1hbCBvcmRlciBzbyB0aGF0IHRoZSB1c2VyIGRvZXNuJ3QgZ2V0IGNvbmZ1c2VkICovCiAKQEAgLTE5NTgsNyArMjI0OCw3IEBACiAgKglMT0NLSU5HOgogICoJTm9uZS4KICAqLwotc3RhdGljIHZvaWQgc2F0YV9wcmludF9saW5rX3N0YXR1cyhzdHJ1Y3QgYXRhX3BvcnQgKmFwKQordm9pZCBzYXRhX3ByaW50X2xpbmtfc3RhdHVzKHN0cnVjdCBhdGFfcG9ydCAqYXApCiB7CiAJdTMyIHNzdGF0dXMsIHNjb250cm9sLCB0bXA7CiAKQEAgLTIzNTIsNiArMjY0MiwxMiBAQAogCQl0LT5hY3RpdmUgKz0gKHQtPmN5Y2xlIC0gKHQtPmFjdGl2ZSArIHQtPnJlY292ZXIpKSAvIDI7CiAJCXQtPnJlY292ZXIgPSB0LT5jeWNsZSAtIHQtPmFjdGl2ZTsKIAl9CisJCisJLyogSW4gYSBmZXcgY2FzZXMgcXVhbnRpc2F0aW9uIG1heSBwcm9kdWNlIGVub3VnaCBlcnJvcnMgdG8KKwkgICBsZWF2ZSB0LT5jeWNsZSB0b28gbG93IGZvciB0aGUgc3VtIG9mIGFjdGl2ZSBhbmQgcmVjb3ZlcnkKKwkgICBpZiBzbyB3ZSBtdXN0IGNvcnJlY3QgdGhpcyAqLworCWlmICh0LT5hY3RpdmUgKyB0LT5yZWNvdmVyID4gdC0+Y3ljbGUpCisJCXQtPmN5Y2xlID0gdC0+YWN0aXZlICsgdC0+cmVjb3ZlcjsKIAogCXJldHVybiAwOwogfQpAQCAtMjQ4MSwxMiArMjc3NywxMyBAQAogfQogCiAvKioKLSAqCWF0YV9zZXRfbW9kZSAtIFByb2dyYW0gdGltaW5ncyBhbmQgaXNzdWUgU0VUIEZFQVRVUkVTIC0gWEZFUgorICoJYXRhX2RvX3NldF9tb2RlIC0gUHJvZ3JhbSB0aW1pbmdzIGFuZCBpc3N1ZSBTRVQgRkVBVFVSRVMgLSBYRkVSCiAgKglAYXA6IHBvcnQgb24gd2hpY2ggdGltaW5ncyB3aWxsIGJlIHByb2dyYW1tZWQKICAqCUByX2ZhaWxlZF9kZXY6IG91dCBwYXJhbXRlciBmb3IgZmFpbGVkIGRldmljZQogICoKLSAqCVNldCBBVEEgZGV2aWNlIGRpc2sgdHJhbnNmZXIgbW9kZSAoUElPMywgVURNQTYsIGV0Yy4pLiAgSWYKLSAqCWF0YV9zZXRfbW9kZSgpIGZhaWxzLCBwb2ludGVyIHRvIHRoZSBmYWlsaW5nIGRldmljZSBpcworICoJU3RhbmRhcmQgaW1wbGVtZW50YXRpb24gb2YgdGhlIGZ1bmN0aW9uIHVzZWQgdG8gdHVuZSBhbmQgc2V0CisgKglBVEEgZGV2aWNlIGRpc2sgdHJhbnNmZXIgbW9kZSAoUElPMywgVURNQTYsIGV0Yy4pLiAgSWYKKyAqCWF0YV9kZXZfc2V0X21vZGUoKSBmYWlscywgcG9pbnRlciB0byB0aGUgZmFpbGluZyBkZXZpY2UgaXMKICAqCXJldHVybmVkIGluIEByX2ZhaWxlZF9kZXYuCiAgKgogICoJTE9DS0lORzoKQEAgLTI0OTUsMTQgKzI3OTIsMTIgQEAKICAqCVJFVFVSTlM6CiAgKgkwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm5vIG90aGVyd2lzZQogICovCi1pbnQgYXRhX3NldF9tb2RlKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfZGV2aWNlICoqcl9mYWlsZWRfZGV2KQorCitpbnQgYXRhX2RvX3NldF9tb2RlKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfZGV2aWNlICoqcl9mYWlsZWRfZGV2KQogewogCXN0cnVjdCBhdGFfZGV2aWNlICpkZXY7CiAJaW50IGksIHJjID0gMCwgdXNlZF9kbWEgPSAwLCBmb3VuZCA9IDA7CiAKLQkvKiBoYXMgcHJpdmF0ZSBzZXRfbW9kZT8gKi8KLQlpZiAoYXAtPm9wcy0+c2V0X21vZGUpCi0JCXJldHVybiBhcC0+b3BzLT5zZXRfbW9kZShhcCwgcl9mYWlsZWRfZGV2KTsKIAogCS8qIHN0ZXAgMTogY2FsY3VsYXRlIHhmZXJfbWFzayAqLwogCWZvciAoaSA9IDA7IGkgPCBBVEFfTUFYX0RFVklDRVM7IGkrKykgewpAQCAtMjU4Nyw2ICsyODgyLDI5IEBACiB9CiAKIC8qKgorICoJYXRhX3NldF9tb2RlIC0gUHJvZ3JhbSB0aW1pbmdzIGFuZCBpc3N1ZSBTRVQgRkVBVFVSRVMgLSBYRkVSCisgKglAYXA6IHBvcnQgb24gd2hpY2ggdGltaW5ncyB3aWxsIGJlIHByb2dyYW1tZWQKKyAqCUByX2ZhaWxlZF9kZXY6IG91dCBwYXJhbXRlciBmb3IgZmFpbGVkIGRldmljZQorICoKKyAqCVNldCBBVEEgZGV2aWNlIGRpc2sgdHJhbnNmZXIgbW9kZSAoUElPMywgVURNQTYsIGV0Yy4pLiAgSWYKKyAqCWF0YV9zZXRfbW9kZSgpIGZhaWxzLCBwb2ludGVyIHRvIHRoZSBmYWlsaW5nIGRldmljZSBpcworICoJcmV0dXJuZWQgaW4gQHJfZmFpbGVkX2Rldi4KKyAqCisgKglMT0NLSU5HOgorICoJUENJL2V0Yy4gYnVzIHByb2JlIHNlbS4KKyAqCisgKglSRVRVUk5TOgorICoJMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJubyBvdGhlcndpc2UKKyAqLworaW50IGF0YV9zZXRfbW9kZShzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX2RldmljZSAqKnJfZmFpbGVkX2RldikKK3sKKwkvKiBoYXMgcHJpdmF0ZSBzZXRfbW9kZT8gKi8KKwlpZiAoYXAtPm9wcy0+c2V0X21vZGUpCisJCXJldHVybiBhcC0+b3BzLT5zZXRfbW9kZShhcCwgcl9mYWlsZWRfZGV2KTsKKwlyZXR1cm4gYXRhX2RvX3NldF9tb2RlKGFwLCByX2ZhaWxlZF9kZXYpOworfQorCisvKioKICAqCWF0YV90Zl90b19ob3N0IC0gaXNzdWUgQVRBIHRhc2tmaWxlIHRvIGhvc3QgY29udHJvbGxlcgogICoJQGFwOiBwb3J0IHRvIHdoaWNoIGNvbW1hbmQgaXMgYmVpbmcgaXNzdWVkCiAgKglAdGY6IEFUQSB0YXNrZmlsZSByZWdpc3RlciBzZXQKQEAgLTMyNjcsNiArMzU4NSwxMSBAQAogCQkJICAgICAgICIlbGx1ICE9ICVsbHVcbiIsCiAJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylkZXYtPm5fc2VjdG9ycywKIAkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKW5ld19uX3NlY3RvcnMpOworCQkvKiBBcmUgd2UgdGhlIGJvb3QgdGltZSBzaXplIC0gaWYgc28gd2UgYXBwZWFyIHRvIGJlIHRoZQorCQkgICBzYW1lIGRpc2sgYXQgdGhpcyBwb2ludCBhbmQgb3VyIEhQQSBnb3QgcmVhcHBsaWVkICovCisJCWlmIChhdGFfaWdub3JlX2hwYSAmJiBkZXYtPm5fc2VjdG9yc19ib290ID09IG5ld19uX3NlY3RvcnMgCisJCSAgICAmJiBhdGFfaWRfaHBhX2VuYWJsZWQobmV3X2lkKSkKKwkJCXJldHVybiAxOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTM0NDEsMTkgKzM3NjQsNyBAQAogCXhmZXJfbWFzayA9IGF0YV9wYWNrX3hmZXJtYXNrKGFwLT5waW9fbWFzaywKIAkJCQkgICAgICBhcC0+bXdkbWFfbWFzaywgYXAtPnVkbWFfbWFzayk7CiAKLQkvKiBBcHBseSBjYWJsZSBydWxlIGhlcmUuICBEb24ndCBhcHBseSBpdCBlYXJseSBiZWNhdXNlIHdoZW4KLQkgKiB3ZSBoYW5kbGUgaG90IHBsdWcgdGhlIGNhYmxlIHR5cGUgY2FuIGl0c2VsZiBjaGFuZ2UuCi0JICovCi0JaWYgKGFwLT5jYmwgPT0gQVRBX0NCTF9QQVRBNDApCi0JCXhmZXJfbWFzayAmPSB+KDB4RjggPDwgQVRBX1NISUZUX1VETUEpOwotCS8qIEFwcGx5IGRyaXZlIHNpZGUgY2FibGUgcnVsZS4gVW5rbm93biBvciA4MCBwaW4gY2FibGVzIHJlcG9ydGVkCi0JICogaG9zdCBzaWRlIGFyZSBjaGVja2VkIGRyaXZlIHNpZGUgYXMgd2VsbC4gQ2FzZXMgd2hlcmUgd2Uga25vdyBhCi0JICogNDB3aXJlIGNhYmxlIGlzIHVzZWQgc2FmZWx5IGZvciA4MCBhcmUgbm90IGNoZWNrZWQgaGVyZS4KLQkgKi8KLSAgICAgICAgaWYgKGF0YV9kcml2ZV80MHdpcmUoZGV2LT5pZCkgJiYgKGFwLT5jYmwgPT0gQVRBX0NCTF9QQVRBX1VOSyB8fCBhcC0+Y2JsID09IEFUQV9DQkxfUEFUQTgwKSkKLQkJeGZlcl9tYXNrICY9IH4oMHhGOCA8PCBBVEFfU0hJRlRfVURNQSk7Ci0KLQorCS8qIGRyaXZlIG1vZGVzIGF2YWlsYWJsZSAqLwogCXhmZXJfbWFzayAmPSBhdGFfcGFja194ZmVybWFzayhkZXYtPnBpb19tYXNrLAogCQkJCSAgICAgICBkZXYtPm13ZG1hX21hc2ssIGRldi0+dWRtYV9tYXNrKTsKIAl4ZmVyX21hc2sgJj0gYXRhX2lkX3hmZXJtYXNrKGRldi0+aWQpOwpAQCAtMzQ4Miw4ICszNzkzLDMwIEBACiAJCQkgICAgICAgIm90aGVyIGRldmljZSwgZGlzYWJsaW5nIERNQVxuIik7CiAJfQogCisJaWYgKGFwLT5mbGFncyAmIEFUQV9GTEFHX05PX0lPUkRZKQorCQl4ZmVyX21hc2sgJj0gYXRhX3Bpb19tYXNrX25vX2lvcmR5KGRldik7CisKIAlpZiAoYXAtPm9wcy0+bW9kZV9maWx0ZXIpCi0JCXhmZXJfbWFzayA9IGFwLT5vcHMtPm1vZGVfZmlsdGVyKGFwLCBkZXYsIHhmZXJfbWFzayk7CisJCXhmZXJfbWFzayA9IGFwLT5vcHMtPm1vZGVfZmlsdGVyKGRldiwgeGZlcl9tYXNrKTsKKworCS8qIEFwcGx5IGNhYmxlIHJ1bGUgaGVyZS4gIERvbid0IGFwcGx5IGl0IGVhcmx5IGJlY2F1c2Ugd2hlbgorCSAqIHdlIGhhbmRsZSBob3QgcGx1ZyB0aGUgY2FibGUgdHlwZSBjYW4gaXRzZWxmIGNoYW5nZS4KKwkgKiBDaGVjayB0aGlzIGxhc3Qgc28gdGhhdCB3ZSBrbm93IGlmIHRoZSB0cmFuc2ZlciByYXRlIHdhcworCSAqIHNvbGVseSBsaW1pdGVkIGJ5IHRoZSBjYWJsZS4KKwkgKiBVbmtub3duIG9yIDgwIHdpcmUgY2FibGVzIHJlcG9ydGVkIGhvc3Qgc2lkZSBhcmUgY2hlY2tlZAorCSAqIGRyaXZlIHNpZGUgYXMgd2VsbC4gQ2FzZXMgd2hlcmUgd2Uga25vdyBhIDQwd2lyZSBjYWJsZQorCSAqIGlzIHVzZWQgc2FmZWx5IGZvciA4MCBhcmUgbm90IGNoZWNrZWQgaGVyZS4KKwkgKi8KKwlpZiAoeGZlcl9tYXNrICYgKDB4RjggPDwgQVRBX1NISUZUX1VETUEpKQorCQkvKiBVRE1BLzQ0IG9yIGhpZ2hlciB3b3VsZCBiZSBhdmFpbGFibGUgKi8KKwkJaWYoKGFwLT5jYmwgPT0gQVRBX0NCTF9QQVRBNDApIHx8CisgICAJCSAgICAoYXRhX2RyaXZlXzQwd2lyZShkZXYtPmlkKSAmJgorCQkgICAgIChhcC0+Y2JsID09IEFUQV9DQkxfUEFUQV9VTksgfHwKKyAgICAgICAgICAgICAgICAgICAgIGFwLT5jYmwgPT0gQVRBX0NCTF9QQVRBODApKSkgeworCQkgICAgICAJYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX1dBUk5JTkcsCisJCQkJICJsaW1pdGVkIHRvIFVETUEvMzMgZHVlIHRvIDQwLXdpcmUgY2FibGVcbiIpOworCQkJeGZlcl9tYXNrICY9IH4oMHhGOCA8PCBBVEFfU0hJRlRfVURNQSk7CisJCX0KIAogCWF0YV91bnBhY2tfeGZlcm1hc2soeGZlcl9tYXNrLCAmZGV2LT5waW9fbWFzaywKIAkJCSAgICAmZGV2LT5td2RtYV9tYXNrLCAmZGV2LT51ZG1hX21hc2spOwpAQCAtNDAyMiwxMCArNDM1NSwxMCBAQAogCiAKIC8qKgotICoJYXRhX3Bpb19zZWN0b3IgLSBUcmFuc2ZlciBBVEFfU0VDVF9TSVpFICg1MTIgYnl0ZXMpIG9mIGRhdGEuCisgKglhdGFfcGlvX3NlY3RvciAtIFRyYW5zZmVyIGEgc2VjdG9yIG9mIGRhdGEuCiAgKglAcWM6IENvbW1hbmQgb24gZ29pbmcKICAqCi0gKglUcmFuc2ZlciBBVEFfU0VDVF9TSVpFIG9mIGRhdGEgZnJvbS90byB0aGUgQVRBIGRldmljZS4KKyAqCVRyYW5zZmVyIHFjLT5zZWN0X3NpemUgYnl0ZXMgb2YgZGF0YSBmcm9tL3RvIHRoZSBBVEEgZGV2aWNlLgogICoKICAqCUxPQ0tJTkc6CiAgKglJbmhlcml0ZWQgZnJvbSBjYWxsZXIuCkBAIC00MDQwLDcgKzQzNzMsNyBAQAogCXVuc2lnbmVkIGludCBvZmZzZXQ7CiAJdW5zaWduZWQgY2hhciAqYnVmOwogCi0JaWYgKHFjLT5jdXJieXRlcyA9PSBxYy0+bmJ5dGVzIC0gQVRBX1NFQ1RfU0laRSkKKwlpZiAocWMtPmN1cmJ5dGVzID09IHFjLT5uYnl0ZXMgLSBxYy0+c2VjdF9zaXplKQogCQlhcC0+aHNtX3Rhc2tfc3RhdGUgPSBIU01fU1RfTEFTVDsKIAogCXBhZ2UgPSBzZ1txYy0+Y3Vyc2ddLnBhZ2U7CkBAIC00MDYwLDE3ICs0MzkzLDE3IEBACiAJCWJ1ZiA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX0lSUTApOwogCiAJCS8qIGRvIHRoZSBhY3R1YWwgZGF0YSB0cmFuc2ZlciAqLwotCQlhcC0+b3BzLT5kYXRhX3hmZXIocWMtPmRldiwgYnVmICsgb2Zmc2V0LCBBVEFfU0VDVF9TSVpFLCBkb193cml0ZSk7CisJCWFwLT5vcHMtPmRhdGFfeGZlcihxYy0+ZGV2LCBidWYgKyBvZmZzZXQsIHFjLT5zZWN0X3NpemUsIGRvX3dyaXRlKTsKIAogCQlrdW5tYXBfYXRvbWljKGJ1ZiwgS01fSVJRMCk7CiAJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAl9IGVsc2UgewogCQlidWYgPSBwYWdlX2FkZHJlc3MocGFnZSk7Ci0JCWFwLT5vcHMtPmRhdGFfeGZlcihxYy0+ZGV2LCBidWYgKyBvZmZzZXQsIEFUQV9TRUNUX1NJWkUsIGRvX3dyaXRlKTsKKwkJYXAtPm9wcy0+ZGF0YV94ZmVyKHFjLT5kZXYsIGJ1ZiArIG9mZnNldCwgcWMtPnNlY3Rfc2l6ZSwgZG9fd3JpdGUpOwogCX0KIAotCXFjLT5jdXJieXRlcyArPSBBVEFfU0VDVF9TSVpFOwotCXFjLT5jdXJzZ19vZnMgKz0gQVRBX1NFQ1RfU0laRTsKKwlxYy0+Y3VyYnl0ZXMgKz0gcWMtPnNlY3Rfc2l6ZTsKKwlxYy0+Y3Vyc2dfb2ZzICs9IHFjLT5zZWN0X3NpemU7CiAKIAlpZiAocWMtPmN1cnNnX29mcyA9PSAoJnNnW3FjLT5jdXJzZ10pLT5sZW5ndGgpIHsKIAkJcWMtPmN1cnNnKys7CkBAIC00MDc5LDEwICs0NDEyLDEwIEBACiB9CiAKIC8qKgotICoJYXRhX3Bpb19zZWN0b3JzIC0gVHJhbnNmZXIgb25lIG9yIG1hbnkgNTEyLWJ5dGUgc2VjdG9ycy4KKyAqCWF0YV9waW9fc2VjdG9ycyAtIFRyYW5zZmVyIG9uZSBvciBtYW55IHNlY3RvcnMuCiAgKglAcWM6IENvbW1hbmQgb24gZ29pbmcKICAqCi0gKglUcmFuc2ZlciBvbmUgb3IgbWFueSBBVEFfU0VDVF9TSVpFIG9mIGRhdGEgZnJvbS90byB0aGUKKyAqCVRyYW5zZmVyIG9uZSBvciBtYW55IHNlY3RvcnMgb2YgZGF0YSBmcm9tL3RvIHRoZQogICoJQVRBIGRldmljZSBmb3IgdGhlIERSUSByZXF1ZXN0LgogICoKICAqCUxPQ0tJTkc6CkBAIC00MDk3LDcgKzQ0MzAsNyBAQAogCiAJCVdBUk5fT04ocWMtPmRldi0+bXVsdGlfY291bnQgPT0gMCk7CiAKLQkJbnNlY3QgPSBtaW4oKHFjLT5uYnl0ZXMgLSBxYy0+Y3VyYnl0ZXMpIC8gQVRBX1NFQ1RfU0laRSwKKwkJbnNlY3QgPSBtaW4oKHFjLT5uYnl0ZXMgLSBxYy0+Y3VyYnl0ZXMpIC8gcWMtPnNlY3Rfc2l6ZSwKIAkJCSAgICBxYy0+ZGV2LT5tdWx0aV9jb3VudCk7CiAJCXdoaWxlIChuc2VjdC0tKQogCQkJYXRhX3Bpb19zZWN0b3IocWMpOwpAQCAtNTU3Nyw0MiArNTkxMCwzNSBAQAogfQogCiAvKioKLSAqCWF0YV9wb3J0X2luaXQgLSBJbml0aWFsaXplIGFuIGF0YV9wb3J0IHN0cnVjdHVyZQotICoJQGFwOiBTdHJ1Y3R1cmUgdG8gaW5pdGlhbGl6ZQotICoJQGhvc3Q6IENvbGxlY3Rpb24gb2YgaG9zdHMgdG8gd2hpY2ggQGFwIGJlbG9uZ3MKLSAqCUBlbnQ6IFByb2JlIGluZm9ybWF0aW9uIHByb3ZpZGVkIGJ5IGxvdy1sZXZlbCBkcml2ZXIKLSAqCUBwb3J0X25vOiBQb3J0IG51bWJlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBhdGFfcG9ydAorICoJYXRhX3BvcnRfYWxsb2MgLSBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBiYXNpYyBBVEEgcG9ydCByZXNvdXJjZXMKKyAqCUBob3N0OiBBVEEgaG9zdCB0aGlzIGFsbG9jYXRlZCBwb3J0IGJlbG9uZ3MgdG8KICAqCi0gKglJbml0aWFsaXplIGEgbmV3IGF0YV9wb3J0IHN0cnVjdHVyZS4KKyAqCUFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGJhc2ljIEFUQSBwb3J0IHJlc291cmNlcy4KKyAqCisgKglSRVRVUk5TOgorICoJQWxsb2NhdGUgQVRBIHBvcnQgb24gc3VjY2VzcywgTlVMTCBvbiBmYWlsdXJlLgogICoKICAqCUxPQ0tJTkc6Ci0gKglJbmhlcml0ZWQgZnJvbSBjYWxsZXIuCisgKglJbmhlcml0ZWQgZnJvbSBjYWxsaW5nIGxheWVyIChtYXkgc2xlZXApLgogICovCi12b2lkIGF0YV9wb3J0X2luaXQoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV9ob3N0ICpob3N0LAotCQkgICBjb25zdCBzdHJ1Y3QgYXRhX3Byb2JlX2VudCAqZW50LCB1bnNpZ25lZCBpbnQgcG9ydF9ubykKK3N0cnVjdCBhdGFfcG9ydCAqYXRhX3BvcnRfYWxsb2Moc3RydWN0IGF0YV9ob3N0ICpob3N0KQogeworCXN0cnVjdCBhdGFfcG9ydCAqYXA7CiAJdW5zaWduZWQgaW50IGk7CiAKKwlEUFJJTlRLKCJFTlRFUlxuIik7CisKKwlhcCA9IGt6YWxsb2Moc2l6ZW9mKCphcCksIEdGUF9LRVJORUwpOworCWlmICghYXApCisJCXJldHVybiBOVUxMOworCiAJYXAtPmxvY2sgPSAmaG9zdC0+bG9jazsKIAlhcC0+ZmxhZ3MgPSBBVEFfRkxBR19ESVNBQkxFRDsKLQlhcC0+cHJpbnRfaWQgPSBhdGFfcHJpbnRfaWQrKzsKKwlhcC0+cHJpbnRfaWQgPSAtMTsKIAlhcC0+Y3RsID0gQVRBX0RFVkNUTF9PQlM7CiAJYXAtPmhvc3QgPSBob3N0OwotCWFwLT5kZXYgPSBlbnQtPmRldjsKLQlhcC0+cG9ydF9ubyA9IHBvcnRfbm87Ci0JaWYgKHBvcnRfbm8gPT0gMSAmJiBlbnQtPnBpbmZvMikgewotCQlhcC0+cGlvX21hc2sgPSBlbnQtPnBpbmZvMi0+cGlvX21hc2s7Ci0JCWFwLT5td2RtYV9tYXNrID0gZW50LT5waW5mbzItPm13ZG1hX21hc2s7Ci0JCWFwLT51ZG1hX21hc2sgPSBlbnQtPnBpbmZvMi0+dWRtYV9tYXNrOwotCQlhcC0+ZmxhZ3MgfD0gZW50LT5waW5mbzItPmZsYWdzOwotCQlhcC0+b3BzID0gZW50LT5waW5mbzItPnBvcnRfb3BzOwotCX0gZWxzZSB7Ci0JCWFwLT5waW9fbWFzayA9IGVudC0+cGlvX21hc2s7Ci0JCWFwLT5td2RtYV9tYXNrID0gZW50LT5td2RtYV9tYXNrOwotCQlhcC0+dWRtYV9tYXNrID0gZW50LT51ZG1hX21hc2s7Ci0JCWFwLT5mbGFncyB8PSBlbnQtPnBvcnRfZmxhZ3M7Ci0JCWFwLT5vcHMgPSBlbnQtPnBvcnRfb3BzOwotCX0KKwlhcC0+ZGV2ID0gaG9zdC0+ZGV2OworCiAJYXAtPmh3X3NhdGFfc3BkX2xpbWl0ID0gVUlOVF9NQVg7CiAJYXAtPmFjdGl2ZV90YWcgPSBBVEFfVEFHX1BPSVNPTjsKIAlhcC0+bGFzdF9jdGwgPSAweEZGOwpAQCAtNTYzMiwxMCArNTk1OCw3IEBACiAJSU5JVF9MSVNUX0hFQUQoJmFwLT5laF9kb25lX3EpOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmFwLT5laF93YWl0X3EpOwogCi0JLyogc2V0IGNhYmxlIHR5cGUgKi8KIAlhcC0+Y2JsID0gQVRBX0NCTF9OT05FOwotCWlmIChhcC0+ZmxhZ3MgJiBBVEFfRkxBR19TQVRBKQotCQlhcC0+Y2JsID0gQVRBX0NCTF9TQVRBOwogCiAJZm9yIChpID0gMDsgaSA8IEFUQV9NQVhfREVWSUNFUzsgaSsrKSB7CiAJCXN0cnVjdCBhdGFfZGV2aWNlICpkZXYgPSAmYXAtPmRldmljZVtpXTsKQEAgLTU2NDgsNzIgKzU5NzEsNiBAQAogCWFwLT5zdGF0cy51bmhhbmRsZWRfaXJxID0gMTsKIAlhcC0+c3RhdHMuaWRsZV9pcnEgPSAxOwogI2VuZGlmCi0KLQltZW1jcHkoJmFwLT5pb2FkZHIsICZlbnQtPnBvcnRbcG9ydF9ub10sIHNpemVvZihzdHJ1Y3QgYXRhX2lvcG9ydHMpKTsKLX0KLQotLyoqCi0gKglhdGFfcG9ydF9pbml0X3Nob3N0IC0gSW5pdGlhbGl6ZSBTQ1NJIGhvc3QgYXNzb2NpYXRlZCB3aXRoIEFUQSBwb3J0Ci0gKglAYXA6IEFUQSBwb3J0IHRvIGluaXRpYWxpemUgU0NTSSBob3N0IGZvcgotICoJQHNob3N0OiBTQ1NJIGhvc3QgYXNzb2NpYXRlZCB3aXRoIEBhcAotICoKLSAqCUluaXRpYWxpemUgU0NTSSBob3N0IEBzaG9zdCBhc3NvY2lhdGVkIHdpdGggQVRBIHBvcnQgQGFwLgotICoKLSAqCUxPQ0tJTkc6Ci0gKglJbmhlcml0ZWQgZnJvbSBjYWxsZXIuCi0gKi8KLXN0YXRpYyB2b2lkIGF0YV9wb3J0X2luaXRfc2hvc3Qoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpCi17Ci0JYXAtPnNjc2lfaG9zdCA9IHNob3N0OwotCi0Jc2hvc3QtPnVuaXF1ZV9pZCA9IGFwLT5wcmludF9pZDsKLQlzaG9zdC0+bWF4X2lkID0gMTY7Ci0Jc2hvc3QtPm1heF9sdW4gPSAxOwotCXNob3N0LT5tYXhfY2hhbm5lbCA9IDE7Ci0Jc2hvc3QtPm1heF9jbWRfbGVuID0gMTI7Ci19Ci0KLS8qKgotICoJYXRhX3BvcnRfYWRkIC0gQXR0YWNoIGxvdy1sZXZlbCBBVEEgZHJpdmVyIHRvIHN5c3RlbQotICoJQGVudDogSW5mb3JtYXRpb24gcHJvdmlkZWQgYnkgbG93LWxldmVsIGRyaXZlcgotICoJQGhvc3Q6IENvbGxlY3Rpb25zIG9mIHBvcnRzIHRvIHdoaWNoIHdlIGFkZAotICoJQHBvcnRfbm86IFBvcnQgbnVtYmVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGhvc3QKLSAqCi0gKglBdHRhY2ggbG93LWxldmVsIEFUQSBkcml2ZXIgdG8gc3lzdGVtLgotICoKLSAqCUxPQ0tJTkc6Ci0gKglQQ0kvZXRjLiBidXMgcHJvYmUgc2VtLgotICoKLSAqCVJFVFVSTlM6Ci0gKglOZXcgYXRhX3BvcnQgb24gc3VjY2VzcywgZm9yIE5VTEwgb24gZXJyb3IuCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnQgKiBhdGFfcG9ydF9hZGQoY29uc3Qgc3RydWN0IGF0YV9wcm9iZV9lbnQgKmVudCwKLQkJCQkgICAgICBzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QsCi0JCQkJICAgICAgdW5zaWduZWQgaW50IHBvcnRfbm8pCi17Ci0Jc3RydWN0IFNjc2lfSG9zdCAqc2hvc3Q7Ci0Jc3RydWN0IGF0YV9wb3J0ICphcDsKLQotCURQUklOVEsoIkVOVEVSXG4iKTsKLQotCWlmICghZW50LT5wb3J0X29wcy0+ZXJyb3JfaGFuZGxlciAmJgotCSAgICAhKGVudC0+cG9ydF9mbGFncyAmIChBVEFfRkxBR19TQVRBX1JFU0VUIHwgQVRBX0ZMQUdfU1JTVCkpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiYXRhJXU6IG5vIHJlc2V0IG1lY2hhbmlzbSBhdmFpbGFibGVcbiIsCi0JCSAgICAgICBwb3J0X25vKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0Jc2hvc3QgPSBzY3NpX2hvc3RfYWxsb2MoZW50LT5zaHQsIHNpemVvZihzdHJ1Y3QgYXRhX3BvcnQpKTsKLQlpZiAoIXNob3N0KQotCQlyZXR1cm4gTlVMTDsKLQotCXNob3N0LT50cmFuc3BvcnR0ID0gJmF0YV9zY3NpX3RyYW5zcG9ydF90ZW1wbGF0ZTsKLQotCWFwID0gYXRhX3Nob3N0X3RvX3BvcnQoc2hvc3QpOwotCi0JYXRhX3BvcnRfaW5pdChhcCwgaG9zdCwgZW50LCBwb3J0X25vKTsKLQlhdGFfcG9ydF9pbml0X3Nob3N0KGFwLCBzaG9zdCk7Ci0KIAlyZXR1cm4gYXA7CiB9CiAKQEAgLTU3MjUsMTkgKzU5ODIsMjYgQEAKIAlmb3IgKGkgPSAwOyBpIDwgaG9zdC0+bl9wb3J0czsgaSsrKSB7CiAJCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBob3N0LT5wb3J0c1tpXTsKIAotCQlpZiAoYXAgJiYgYXAtPm9wcy0+cG9ydF9zdG9wKQorCQlpZiAoIWFwKQorCQkJY29udGludWU7CisKKwkJaWYgKChob3N0LT5mbGFncyAmIEFUQV9IT1NUX1NUQVJURUQpICYmIGFwLT5vcHMtPnBvcnRfc3RvcCkKIAkJCWFwLT5vcHMtPnBvcnRfc3RvcChhcCk7CiAJfQogCi0JaWYgKGhvc3QtPm9wcy0+aG9zdF9zdG9wKQorCWlmICgoaG9zdC0+ZmxhZ3MgJiBBVEFfSE9TVF9TVEFSVEVEKSAmJiBob3N0LT5vcHMtPmhvc3Rfc3RvcCkKIAkJaG9zdC0+b3BzLT5ob3N0X3N0b3AoaG9zdCk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgaG9zdC0+bl9wb3J0czsgaSsrKSB7CiAJCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBob3N0LT5wb3J0c1tpXTsKIAotCQlpZiAoYXApCisJCWlmICghYXApCisJCQljb250aW51ZTsKKworCQlpZiAoYXAtPnNjc2lfaG9zdCkKIAkJCXNjc2lfaG9zdF9wdXQoYXAtPnNjc2lfaG9zdCk7CiAKKwkJa2ZyZWUoYXApOwogCQlob3N0LT5wb3J0c1tpXSA9IE5VTEw7CiAJfQogCkBAIC01NzQ1LDYgKzYwMDksMTc0IEBACiB9CiAKIC8qKgorICoJYXRhX2hvc3RfYWxsb2MgLSBhbGxvY2F0ZSBhbmQgaW5pdCBiYXNpYyBBVEEgaG9zdCByZXNvdXJjZXMKKyAqCUBkZXY6IGdlbmVyaWMgZGV2aWNlIHRoaXMgaG9zdCBpcyBhc3NvY2lhdGVkIHdpdGgKKyAqCUBtYXhfcG9ydHM6IG1heGltdW0gbnVtYmVyIG9mIEFUQSBwb3J0cyBhc3NvY2lhdGVkIHdpdGggdGhpcyBob3N0CisgKgorICoJQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYmFzaWMgQVRBIGhvc3QgcmVzb3VyY2VzLiAgTExEIGNhbGxzCisgKgl0aGlzIGZ1bmN0aW9uIHRvIGFsbG9jYXRlIGEgaG9zdCwgaW5pdGlhbGl6ZXMgaXQgZnVsbHkgYW5kCisgKglhdHRhY2hlcyBpdCB1c2luZyBhdGFfaG9zdF9yZWdpc3RlcigpLgorICoKKyAqCUBtYXhfcG9ydHMgcG9ydHMgYXJlIGFsbG9jYXRlZCBhbmQgaG9zdC0+bl9wb3J0cyBpcworICoJaW5pdGlhbGl6ZWQgdG8gQG1heF9wb3J0cy4gIFRoZSBjYWxsZXIgaXMgYWxsb3dlZCB0byBkZWNyZWFzZQorICoJaG9zdC0+bl9wb3J0cyBiZWZvcmUgY2FsbGluZyBhdGFfaG9zdF9yZWdpc3RlcigpLiAgVGhlIHVudXNlZAorICoJcG9ydHMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGZyZWVkIG9uIHJlZ2lzdHJhdGlvbi4KKyAqCisgKglSRVRVUk5TOgorICoJQWxsb2NhdGUgQVRBIGhvc3Qgb24gc3VjY2VzcywgTlVMTCBvbiBmYWlsdXJlLgorICoKKyAqCUxPQ0tJTkc6CisgKglJbmhlcml0ZWQgZnJvbSBjYWxsaW5nIGxheWVyIChtYXkgc2xlZXApLgorICovCitzdHJ1Y3QgYXRhX2hvc3QgKmF0YV9ob3N0X2FsbG9jKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IG1heF9wb3J0cykKK3sKKwlzdHJ1Y3QgYXRhX2hvc3QgKmhvc3Q7CisJc2l6ZV90IHN6OworCWludCBpOworCisJRFBSSU5USygiRU5URVJcbiIpOworCisJaWYgKCFkZXZyZXNfb3Blbl9ncm91cChkZXYsIE5VTEwsIEdGUF9LRVJORUwpKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIGFsbG9jIGEgY29udGFpbmVyIGZvciBvdXIgbGlzdCBvZiBBVEEgcG9ydHMgKGJ1c2VzKSAqLworCXN6ID0gc2l6ZW9mKHN0cnVjdCBhdGFfaG9zdCkgKyAobWF4X3BvcnRzICsgMSkgKiBzaXplb2Yodm9pZCAqKTsKKwkvKiBhbGxvYyBhIGNvbnRhaW5lciBmb3Igb3VyIGxpc3Qgb2YgQVRBIHBvcnRzIChidXNlcykgKi8KKwlob3N0ID0gZGV2cmVzX2FsbG9jKGF0YV9ob3N0X3JlbGVhc2UsIHN6LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWhvc3QpCisJCWdvdG8gZXJyX291dDsKKworCWRldnJlc19hZGQoZGV2LCBob3N0KTsKKwlkZXZfc2V0X2RydmRhdGEoZGV2LCBob3N0KTsKKworCXNwaW5fbG9ja19pbml0KCZob3N0LT5sb2NrKTsKKwlob3N0LT5kZXYgPSBkZXY7CisJaG9zdC0+bl9wb3J0cyA9IG1heF9wb3J0czsKKworCS8qIGFsbG9jYXRlIHBvcnRzIGJvdW5kIHRvIHRoaXMgaG9zdCAqLworCWZvciAoaSA9IDA7IGkgPCBtYXhfcG9ydHM7IGkrKykgeworCQlzdHJ1Y3QgYXRhX3BvcnQgKmFwOworCisJCWFwID0gYXRhX3BvcnRfYWxsb2MoaG9zdCk7CisJCWlmICghYXApCisJCQlnb3RvIGVycl9vdXQ7CisKKwkJYXAtPnBvcnRfbm8gPSBpOworCQlob3N0LT5wb3J0c1tpXSA9IGFwOworCX0KKworCWRldnJlc19yZW1vdmVfZ3JvdXAoZGV2LCBOVUxMKTsKKwlyZXR1cm4gaG9zdDsKKworIGVycl9vdXQ6CisJZGV2cmVzX3JlbGVhc2VfZ3JvdXAoZGV2LCBOVUxMKTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCisgKglhdGFfaG9zdF9hbGxvY19waW5mbyAtIGFsbG9jIGhvc3QgYW5kIGluaXQgd2l0aCBwb3J0X2luZm8gYXJyYXkKKyAqCUBkZXY6IGdlbmVyaWMgZGV2aWNlIHRoaXMgaG9zdCBpcyBhc3NvY2lhdGVkIHdpdGgKKyAqCUBwcGk6IGFycmF5IG9mIEFUQSBwb3J0X2luZm8gdG8gaW5pdGlhbGl6ZSBob3N0IHdpdGgKKyAqCUBuX3BvcnRzOiBudW1iZXIgb2YgQVRBIHBvcnRzIGF0dGFjaGVkIHRvIHRoaXMgaG9zdAorICoKKyAqCUFsbG9jYXRlIEFUQSBob3N0IGFuZCBpbml0aWFsaXplIHdpdGggaW5mbyBmcm9tIEBwcGkuICBJZiBOVUxMCisgKgl0ZXJtaW5hdGVkLCBAcHBpIG1heSBjb250YWluIGZld2VyIGVudHJpZXMgdGhhbiBAbl9wb3J0cy4gIFRoZQorICoJbGFzdCBlbnRyeSB3aWxsIGJlIHVzZWQgZm9yIHRoZSByZW1haW5pbmcgcG9ydHMuCisgKgorICoJUkVUVVJOUzoKKyAqCUFsbG9jYXRlIEFUQSBob3N0IG9uIHN1Y2Nlc3MsIE5VTEwgb24gZmFpbHVyZS4KKyAqCisgKglMT0NLSU5HOgorICoJSW5oZXJpdGVkIGZyb20gY2FsbGluZyBsYXllciAobWF5IHNsZWVwKS4KKyAqLworc3RydWN0IGF0YV9ob3N0ICphdGFfaG9zdF9hbGxvY19waW5mbyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICAgY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gKiBjb25zdCAqIHBwaSwKKwkJCQkgICAgICBpbnQgbl9wb3J0cykKK3sKKwljb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqcGk7CisJc3RydWN0IGF0YV9ob3N0ICpob3N0OworCWludCBpLCBqOworCisJaG9zdCA9IGF0YV9ob3N0X2FsbG9jKGRldiwgbl9wb3J0cyk7CisJaWYgKCFob3N0KQorCQlyZXR1cm4gTlVMTDsKKworCWZvciAoaSA9IDAsIGogPSAwLCBwaSA9IE5VTEw7IGkgPCBob3N0LT5uX3BvcnRzOyBpKyspIHsKKwkJc3RydWN0IGF0YV9wb3J0ICphcCA9IGhvc3QtPnBvcnRzW2ldOworCisJCWlmIChwcGlbal0pCisJCQlwaSA9IHBwaVtqKytdOworCisJCWFwLT5waW9fbWFzayA9IHBpLT5waW9fbWFzazsKKwkJYXAtPm13ZG1hX21hc2sgPSBwaS0+bXdkbWFfbWFzazsKKwkJYXAtPnVkbWFfbWFzayA9IHBpLT51ZG1hX21hc2s7CisJCWFwLT5mbGFncyB8PSBwaS0+ZmxhZ3M7CisJCWFwLT5vcHMgPSBwaS0+cG9ydF9vcHM7CisKKwkJaWYgKCFob3N0LT5vcHMgJiYgKHBpLT5wb3J0X29wcyAhPSAmYXRhX2R1bW15X3BvcnRfb3BzKSkKKwkJCWhvc3QtPm9wcyA9IHBpLT5wb3J0X29wczsKKwkJaWYgKCFob3N0LT5wcml2YXRlX2RhdGEgJiYgcGktPnByaXZhdGVfZGF0YSkKKwkJCWhvc3QtPnByaXZhdGVfZGF0YSA9IHBpLT5wcml2YXRlX2RhdGE7CisJfQorCisJcmV0dXJuIGhvc3Q7Cit9CisKKy8qKgorICoJYXRhX2hvc3Rfc3RhcnQgLSBzdGFydCBhbmQgZnJlZXplIHBvcnRzIG9mIGFuIEFUQSBob3N0CisgKglAaG9zdDogQVRBIGhvc3QgdG8gc3RhcnQgcG9ydHMgZm9yCisgKgorICoJU3RhcnQgYW5kIHRoZW4gZnJlZXplIHBvcnRzIG9mIEBob3N0LiAgU3RhcnRlZCBzdGF0dXMgaXMKKyAqCXJlY29yZGVkIGluIGhvc3QtPmZsYWdzLCBzbyB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQKKyAqCW11bHRpcGxlIHRpbWVzLiAgUG9ydHMgYXJlIGd1YXJhbnRlZWQgdG8gZ2V0IHN0YXJ0ZWQgb25seQorICoJb25jZS4gIElmIGhvc3QtPm9wcyBpc24ndCBpbml0aWFsaXplZCB5ZXQsIGl0cyBzZXQgdG8gdGhlCisgKglmaXJzdCBub24tZHVtbXkgcG9ydCBvcHMuCisgKgorICoJTE9DS0lORzoKKyAqCUluaGVyaXRlZCBmcm9tIGNhbGxpbmcgbGF5ZXIgKG1heSBzbGVlcCkuCisgKgorICoJUkVUVVJOUzoKKyAqCTAgaWYgYWxsIHBvcnRzIGFyZSBzdGFydGVkIHN1Y2Nlc3NmdWxseSwgLWVycm5vIG90aGVyd2lzZS4KKyAqLworaW50IGF0YV9ob3N0X3N0YXJ0KHN0cnVjdCBhdGFfaG9zdCAqaG9zdCkKK3sKKwlpbnQgaSwgcmM7CisKKwlpZiAoaG9zdC0+ZmxhZ3MgJiBBVEFfSE9TVF9TVEFSVEVEKQorCQlyZXR1cm4gMDsKKworCWZvciAoaSA9IDA7IGkgPCBob3N0LT5uX3BvcnRzOyBpKyspIHsKKwkJc3RydWN0IGF0YV9wb3J0ICphcCA9IGhvc3QtPnBvcnRzW2ldOworCisJCWlmICghaG9zdC0+b3BzICYmICFhdGFfcG9ydF9pc19kdW1teShhcCkpCisJCQlob3N0LT5vcHMgPSBhcC0+b3BzOworCisJCWlmIChhcC0+b3BzLT5wb3J0X3N0YXJ0KSB7CisJCQlyYyA9IGFwLT5vcHMtPnBvcnRfc3RhcnQoYXApOworCQkJaWYgKHJjKSB7CisJCQkJYXRhX3BvcnRfcHJpbnRrKGFwLCBLRVJOX0VSUiwgImZhaWxlZCB0byAiCisJCQkJCQkic3RhcnQgcG9ydCAoZXJybm89JWQpXG4iLCByYyk7CisJCQkJZ290byBlcnJfb3V0OworCQkJfQorCQl9CisKKwkJYXRhX2VoX2ZyZWV6ZV9wb3J0KGFwKTsKKwl9CisKKwlob3N0LT5mbGFncyB8PSBBVEFfSE9TVF9TVEFSVEVEOworCXJldHVybiAwOworCisgZXJyX291dDoKKwl3aGlsZSAoLS1pID49IDApIHsKKwkJc3RydWN0IGF0YV9wb3J0ICphcCA9IGhvc3QtPnBvcnRzW2ldOworCisJCWlmIChhcC0+b3BzLT5wb3J0X3N0b3ApCisJCQlhcC0+b3BzLT5wb3J0X3N0b3AoYXApOworCX0KKwlyZXR1cm4gcmM7Cit9CisKKy8qKgogICoJYXRhX3Nhc19ob3N0X2luaXQgLSBJbml0aWFsaXplIGEgaG9zdCBzdHJ1Y3QKICAqCUBob3N0Oglob3N0IHRvIGluaXRpYWxpemUKICAqCUBkZXY6CWRldmljZSBob3N0IGlzIGF0dGFjaGVkIHRvCkBAIC01NzU1LDcgKzYxODcsNyBAQAogICoJUENJL2V0Yy4gYnVzIHByb2JlIHNlbS4KICAqCiAgKi8KLQorLyogS0lMTE1FIC0gdGhlIG9ubHkgdXNlciBsZWZ0IGlzIGlwciAqLwogdm9pZCBhdGFfaG9zdF9pbml0KHN0cnVjdCBhdGFfaG9zdCAqaG9zdCwgc3RydWN0IGRldmljZSAqZGV2LAogCQkgICB1bnNpZ25lZCBsb25nIGZsYWdzLCBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfb3BlcmF0aW9ucyAqb3BzKQogewpAQCAtNTc2NiwxMzcgKzYxOTgsNTggQEAKIH0KIAogLyoqCi0gKglhdGFfZGV2aWNlX2FkZCAtIFJlZ2lzdGVyIGhhcmR3YXJlIGRldmljZSB3aXRoIEFUQSBhbmQgU0NTSSBsYXllcnMKLSAqCUBlbnQ6IFByb2JlIGluZm9ybWF0aW9uIGRlc2NyaWJpbmcgaGFyZHdhcmUgZGV2aWNlIHRvIGJlIHJlZ2lzdGVyZWQKKyAqCWF0YV9ob3N0X3JlZ2lzdGVyIC0gcmVnaXN0ZXIgaW5pdGlhbGl6ZWQgQVRBIGhvc3QKKyAqCUBob3N0OiBBVEEgaG9zdCB0byByZWdpc3RlcgorICoJQHNodDogdGVtcGxhdGUgZm9yIFNDU0kgaG9zdAogICoKLSAqCVRoaXMgZnVuY3Rpb24gcHJvY2Vzc2VzIHRoZSBpbmZvcm1hdGlvbiBwcm92aWRlZCBpbiB0aGUgcHJvYmUKLSAqCWluZm9ybWF0aW9uIHN0cnVjdCBAZW50LCBhbGxvY2F0ZXMgdGhlIG5lY2Vzc2FyeSBBVEEgYW5kIFNDU0kKLSAqCWhvc3QgaW5mb3JtYXRpb24gc3RydWN0dXJlcywgaW5pdGlhbGl6ZXMgdGhlbSwgYW5kIHJlZ2lzdGVycwotICoJZXZlcnl0aGluZyB3aXRoIHJlcXVpc2l0ZSBrZXJuZWwgc3Vic3lzdGVtcy4KLSAqCi0gKglUaGlzIGZ1bmN0aW9uIHJlcXVlc3RzIGlycXMsIHByb2JlcyB0aGUgQVRBIGJ1cywgYW5kIHByb2JlcwotICoJdGhlIFNDU0kgYnVzLgorICoJUmVnaXN0ZXIgaW5pdGlhbGl6ZWQgQVRBIGhvc3QuICBAaG9zdCBpcyBhbGxvY2F0ZWQgdXNpbmcKKyAqCWF0YV9ob3N0X2FsbG9jKCkgYW5kIGZ1bGx5IGluaXRpYWxpemVkIGJ5IExMRC4gIFRoaXMgZnVuY3Rpb24KKyAqCXN0YXJ0cyBwb3J0cywgcmVnaXN0ZXJzIEBob3N0IHdpdGggQVRBIGFuZCBTQ1NJIGxheWVycyBhbmQKKyAqCXByb2JlIHJlZ2lzdGVyZWQgZGV2aWNlcy4KICAqCiAgKglMT0NLSU5HOgotICoJUENJL2V0Yy4gYnVzIHByb2JlIHNlbS4KKyAqCUluaGVyaXRlZCBmcm9tIGNhbGxpbmcgbGF5ZXIgKG1heSBzbGVlcCkuCiAgKgogICoJUkVUVVJOUzoKLSAqCU51bWJlciBvZiBwb3J0cyByZWdpc3RlcmVkLiAgWmVybyBvbiBlcnJvciAobm8gcG9ydHMgcmVnaXN0ZXJlZCkuCisgKgkwIG9uIHN1Y2Nlc3MsIC1lcnJubyBvdGhlcndpc2UuCiAgKi8KLWludCBhdGFfZGV2aWNlX2FkZChjb25zdCBzdHJ1Y3QgYXRhX3Byb2JlX2VudCAqZW50KQoraW50IGF0YV9ob3N0X3JlZ2lzdGVyKHN0cnVjdCBhdGFfaG9zdCAqaG9zdCwgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqc2h0KQogewotCXVuc2lnbmVkIGludCBpOwotCXN0cnVjdCBkZXZpY2UgKmRldiA9IGVudC0+ZGV2OwotCXN0cnVjdCBhdGFfaG9zdCAqaG9zdDsKLQlpbnQgcmM7CisJaW50IGksIHJjOwogCi0JRFBSSU5USygiRU5URVJcbiIpOwotCi0JaWYgKGVudC0+aXJxID09IDApIHsKLQkJZGV2X3ByaW50ayhLRVJOX0VSUiwgZGV2LCAiaXMgbm90IGF2YWlsYWJsZTogTm8gaW50ZXJydXB0IGFzc2lnbmVkLlxuIik7Ci0JCXJldHVybiAwOworCS8qIGhvc3QgbXVzdCBoYXZlIGJlZW4gc3RhcnRlZCAqLworCWlmICghKGhvc3QtPmZsYWdzICYgQVRBX0hPU1RfU1RBUlRFRCkpIHsKKwkJZGV2X3ByaW50ayhLRVJOX0VSUiwgaG9zdC0+ZGV2LAorCQkJICAgIkJVRzogdHJ5aW5nIHRvIHJlZ2lzdGVyIHVuc3RhcnRlZCBob3N0XG4iKTsKKwkJV0FSTl9PTigxKTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JaWYgKCFkZXZyZXNfb3Blbl9ncm91cChkZXYsIGF0YV9kZXZpY2VfYWRkLCBHRlBfS0VSTkVMKSkKLQkJcmV0dXJuIDA7CisJLyogQmxvdyBhd2F5IHVudXNlZCBwb3J0cy4gIFRoaXMgaGFwcGVucyB3aGVuIExMRCBjYW4ndAorCSAqIGRldGVybWluZSB0aGUgZXhhY3QgbnVtYmVyIG9mIHBvcnRzIHRvIGFsbG9jYXRlIGF0CisJICogYWxsb2NhdGlvbiB0aW1lLgorCSAqLworCWZvciAoaSA9IGhvc3QtPm5fcG9ydHM7IGhvc3QtPnBvcnRzW2ldOyBpKyspCisJCWtmcmVlKGhvc3QtPnBvcnRzW2ldKTsKIAotCS8qIGFsbG9jIGEgY29udGFpbmVyIGZvciBvdXIgbGlzdCBvZiBBVEEgcG9ydHMgKGJ1c2VzKSAqLwotCWhvc3QgPSBkZXZyZXNfYWxsb2MoYXRhX2hvc3RfcmVsZWFzZSwgc2l6ZW9mKHN0cnVjdCBhdGFfaG9zdCkgKwotCQkJICAgIChlbnQtPm5fcG9ydHMgKiBzaXplb2Yodm9pZCAqKSksIEdGUF9LRVJORUwpOwotCWlmICghaG9zdCkKLQkJZ290byBlcnJfb3V0OwotCWRldnJlc19hZGQoZGV2LCBob3N0KTsKLQlkZXZfc2V0X2RydmRhdGEoZGV2LCBob3N0KTsKKwkvKiBnaXZlIHBvcnRzIG5hbWVzIGFuZCBhZGQgU0NTSSBob3N0cyAqLworCWZvciAoaSA9IDA7IGkgPCBob3N0LT5uX3BvcnRzOyBpKyspCisJCWhvc3QtPnBvcnRzW2ldLT5wcmludF9pZCA9IGF0YV9wcmludF9pZCsrOwogCi0JYXRhX2hvc3RfaW5pdChob3N0LCBkZXYsIGVudC0+X2hvc3RfZmxhZ3MsIGVudC0+cG9ydF9vcHMpOwotCWhvc3QtPm5fcG9ydHMgPSBlbnQtPm5fcG9ydHM7Ci0JaG9zdC0+aXJxID0gZW50LT5pcnE7Ci0JaG9zdC0+aXJxMiA9IGVudC0+aXJxMjsKLQlob3N0LT5pb21hcCA9IGVudC0+aW9tYXA7Ci0JaG9zdC0+cHJpdmF0ZV9kYXRhID0gZW50LT5wcml2YXRlX2RhdGE7CisJcmMgPSBhdGFfc2NzaV9hZGRfaG9zdHMoaG9zdCwgc2h0KTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKIAotCS8qIHJlZ2lzdGVyIGVhY2ggcG9ydCBib3VuZCB0byB0aGlzIGRldmljZSAqLwotCWZvciAoaSA9IDA7IGkgPCBob3N0LT5uX3BvcnRzOyBpKyspIHsKLQkJc3RydWN0IGF0YV9wb3J0ICphcDsKLQkJdW5zaWduZWQgbG9uZyB4ZmVyX21vZGVfbWFzazsKLQkJaW50IGlycV9saW5lID0gZW50LT5pcnE7Ci0KLQkJYXAgPSBhdGFfcG9ydF9hZGQoZW50LCBob3N0LCBpKTsKLQkJaG9zdC0+cG9ydHNbaV0gPSBhcDsKLQkJaWYgKCFhcCkKLQkJCWdvdG8gZXJyX291dDsKLQotCQkvKiBkdW1teT8gKi8KLQkJaWYgKGVudC0+ZHVtbXlfcG9ydF9tYXNrICYgKDEgPDwgaSkpIHsKLQkJCWF0YV9wb3J0X3ByaW50ayhhcCwgS0VSTl9JTkZPLCAiRFVNTVlcbiIpOwotCQkJYXAtPm9wcyA9ICZhdGFfZHVtbXlfcG9ydF9vcHM7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCS8qIHN0YXJ0IHBvcnQgKi8KLQkJcmMgPSBhcC0+b3BzLT5wb3J0X3N0YXJ0KGFwKTsKLQkJaWYgKHJjKSB7Ci0JCQlob3N0LT5wb3J0c1tpXSA9IE5VTEw7Ci0JCQlzY3NpX2hvc3RfcHV0KGFwLT5zY3NpX2hvc3QpOwotCQkJZ290byBlcnJfb3V0OwotCQl9Ci0KLQkJLyogUmVwb3J0IHRoZSBzZWNvbmRhcnkgSVJRIGZvciBzZWNvbmQgY2hhbm5lbCBsZWdhY3kgKi8KLQkJaWYgKGkgPT0gMSAmJiBlbnQtPmlycTIpCi0JCQlpcnFfbGluZSA9IGVudC0+aXJxMjsKLQotCQl4ZmVyX21vZGVfbWFzayA9KGFwLT51ZG1hX21hc2sgPDwgQVRBX1NISUZUX1VETUEpIHwKLQkJCQkoYXAtPm13ZG1hX21hc2sgPDwgQVRBX1NISUZUX01XRE1BKSB8Ci0JCQkJKGFwLT5waW9fbWFzayA8PCBBVEFfU0hJRlRfUElPKTsKLQotCQkvKiBwcmludCBwZXItcG9ydCBpbmZvIHRvIGRtZXNnICovCi0JCWF0YV9wb3J0X3ByaW50ayhhcCwgS0VSTl9JTkZPLCAiJWNBVEEgbWF4ICVzIGNtZCAweCVwICIKLQkJCQkiY3RsIDB4JXAgYm1kbWEgMHglcCBpcnEgJWRcbiIsCi0JCQkJYXAtPmZsYWdzICYgQVRBX0ZMQUdfU0FUQSA/ICdTJyA6ICdQJywKLQkJCQlhdGFfbW9kZV9zdHJpbmcoeGZlcl9tb2RlX21hc2spLAotCQkJCWFwLT5pb2FkZHIuY21kX2FkZHIsCi0JCQkJYXAtPmlvYWRkci5jdGxfYWRkciwKLQkJCQlhcC0+aW9hZGRyLmJtZG1hX2FkZHIsCi0JCQkJaXJxX2xpbmUpOwotCi0JCS8qIGZyZWV6ZSBwb3J0IGJlZm9yZSByZXF1ZXN0aW5nIElSUSAqLwotCQlhdGFfZWhfZnJlZXplX3BvcnQoYXApOwotCX0KLQotCS8qIG9idGFpbiBpcnEsIHRoYXQgbWF5IGJlIHNoYXJlZCBiZXR3ZWVuIGNoYW5uZWxzICovCi0JcmMgPSBkZXZtX3JlcXVlc3RfaXJxKGRldiwgZW50LT5pcnEsIGVudC0+cG9ydF9vcHMtPmlycV9oYW5kbGVyLAotCQkJICAgICAgZW50LT5pcnFfZmxhZ3MsIERSVl9OQU1FLCBob3N0KTsKLQlpZiAocmMpIHsKLQkJZGV2X3ByaW50ayhLRVJOX0VSUiwgZGV2LCAiaXJxICVsdSByZXF1ZXN0IGZhaWxlZDogJWRcbiIsCi0JCQkgICBlbnQtPmlycSwgcmMpOwotCQlnb3RvIGVycl9vdXQ7Ci0JfQotCi0JLyogZG8gd2UgaGF2ZSBhIHNlY29uZCBJUlEgZm9yIHRoZSBvdGhlciBjaGFubmVsLCBlZyBsZWdhY3kgbW9kZSAqLwotCWlmIChlbnQtPmlycTIpIHsKLQkJLyogV2Ugd2lsbCBnZXQgd2VpcmQgY29yZSBjb2RlIGNyYXNoZXMgbGF0ZXIgaWYgdGhpcyBpcyB0cnVlCi0JCSAgIHNvIHRyYXAgaXQgbm93ICovCi0JCUJVR19PTihlbnQtPmlycSA9PSBlbnQtPmlycTIpOwotCi0JCXJjID0gZGV2bV9yZXF1ZXN0X2lycShkZXYsIGVudC0+aXJxMiwKLQkJCQllbnQtPnBvcnRfb3BzLT5pcnFfaGFuZGxlciwgZW50LT5pcnFfZmxhZ3MsCi0JCQkJRFJWX05BTUUsIGhvc3QpOwotCQlpZiAocmMpIHsKLQkJCWRldl9wcmludGsoS0VSTl9FUlIsIGRldiwgImlycSAlbHUgcmVxdWVzdCBmYWlsZWQ6ICVkXG4iLAotCQkJCSAgIGVudC0+aXJxMiwgcmMpOwotCQkJZ290byBlcnJfb3V0OwotCQl9Ci0JfQotCi0JLyogcmVzb3VyY2UgYWNxdWlzaXRpb24gY29tcGxldGUgKi8KLQlkZXZyZXNfcmVtb3ZlX2dyb3VwKGRldiwgYXRhX2RldmljZV9hZGQpOwotCi0JLyogcGVyZm9ybSBlYWNoIHByb2JlIHN5bmNocm9ub3VzbHkgKi8KLQlEUFJJTlRLKCJwcm9iZSBiZWdpblxuIik7CisJLyogc2V0IGNhYmxlLCBzYXRhX3NwZF9saW1pdCBhbmQgcmVwb3J0ICovCiAJZm9yIChpID0gMDsgaSA8IGhvc3QtPm5fcG9ydHM7IGkrKykgewogCQlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gaG9zdC0+cG9ydHNbaV07CisJCWludCBpcnFfbGluZTsKIAkJdTMyIHNjb250cm9sOwotCQlpbnQgcmM7CisJCXVuc2lnbmVkIGxvbmcgeGZlcl9tYXNrOworCisJCS8qIHNldCBTQVRBIGNhYmxlIHR5cGUgaWYgc3RpbGwgdW5zZXQgKi8KKwkJaWYgKGFwLT5jYmwgPT0gQVRBX0NCTF9OT05FICYmIChhcC0+ZmxhZ3MgJiBBVEFfRkxBR19TQVRBKSkKKwkJCWFwLT5jYmwgPSBBVEFfQ0JMX1NBVEE7CiAKIAkJLyogaW5pdCBzYXRhX3NwZF9saW1pdCB0byB0aGUgY3VycmVudCB2YWx1ZSAqLwogCQlpZiAoc2F0YV9zY3JfcmVhZChhcCwgU0NSX0NPTlRST0wsICZzY29udHJvbCkgPT0gMCkgewpAQCAtNTkwNSwxNiArNjI1OCwzNSBAQAogCQl9CiAJCWFwLT5zYXRhX3NwZF9saW1pdCA9IGFwLT5od19zYXRhX3NwZF9saW1pdDsKIAotCQlyYyA9IHNjc2lfYWRkX2hvc3QoYXAtPnNjc2lfaG9zdCwgZGV2KTsKLQkJaWYgKHJjKSB7Ci0JCQlhdGFfcG9ydF9wcmludGsoYXAsIEtFUk5fRVJSLCAic2NzaV9hZGRfaG9zdCBmYWlsZWRcbiIpOwotCQkJLyogRklYTUU6IGRvIHNvbWV0aGluZyB1c2VmdWwgaGVyZSAqLwotCQkJLyogRklYTUU6IGhhbmRsZSB1bmNvbmRpdGlvbmFsIGNhbGxzIHRvCi0JCQkgKiBzY3NpX3NjYW5faG9zdCBhbmQgYXRhX2hvc3RfcmVtb3ZlLCBiZWxvdywKLQkJCSAqIGF0IHRoZSB2ZXJ5IGxlYXN0Ci0JCQkgKi8KLQkJfQorCQkvKiByZXBvcnQgdGhlIHNlY29uZGFyeSBJUlEgZm9yIHNlY29uZCBjaGFubmVsIGxlZ2FjeSAqLworCQlpcnFfbGluZSA9IGhvc3QtPmlycTsKKwkJaWYgKGkgPT0gMSAmJiBob3N0LT5pcnEyKQorCQkJaXJxX2xpbmUgPSBob3N0LT5pcnEyOwogCisJCXhmZXJfbWFzayA9IGF0YV9wYWNrX3hmZXJtYXNrKGFwLT5waW9fbWFzaywgYXAtPm13ZG1hX21hc2ssCisJCQkJCSAgICAgIGFwLT51ZG1hX21hc2spOworCisJCS8qIHByaW50IHBlci1wb3J0IGluZm8gdG8gZG1lc2cgKi8KKwkJaWYgKCFhdGFfcG9ydF9pc19kdW1teShhcCkpCisJCQlhdGFfcG9ydF9wcmludGsoYXAsIEtFUk5fSU5GTywgIiVjQVRBIG1heCAlcyBjbWQgMHglcCAiCisJCQkJCSJjdGwgMHglcCBibWRtYSAweCVwIGlycSAlZFxuIiwKKwkJCQkJYXAtPmNibCA9PSBBVEFfQ0JMX1NBVEEgPyAnUycgOiAnUCcsCisJCQkJCWF0YV9tb2RlX3N0cmluZyh4ZmVyX21hc2spLAorCQkJCQlhcC0+aW9hZGRyLmNtZF9hZGRyLAorCQkJCQlhcC0+aW9hZGRyLmN0bF9hZGRyLAorCQkJCQlhcC0+aW9hZGRyLmJtZG1hX2FkZHIsCisJCQkJCWlycV9saW5lKTsKKwkJZWxzZQorCQkJYXRhX3BvcnRfcHJpbnRrKGFwLCBLRVJOX0lORk8sICJEVU1NWVxuIik7CisJfQorCisJLyogcGVyZm9ybSBlYWNoIHByb2JlIHN5bmNocm9ub3VzbHkgKi8KKwlEUFJJTlRLKCJwcm9iZSBiZWdpblxuIik7CisJZm9yIChpID0gMDsgaSA8IGhvc3QtPm5fcG9ydHM7IGkrKykgeworCQlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gaG9zdC0+cG9ydHNbaV07CisJCWludCByYzsKKworCQkvKiBwcm9iZSAqLwogCQlpZiAoYXAtPm9wcy0+ZXJyb3JfaGFuZGxlcikgewogCQkJc3RydWN0IGF0YV9laF9pbmZvICplaGkgPSAmYXAtPmVoX2luZm87CiAJCQl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtNTk1OSwxNiArNjMzMSw1MiBAQAogCQlhdGFfc2NzaV9zY2FuX2hvc3QoYXApOwogCX0KIAotCVZQUklOVEsoIkVYSVQsIHJldHVybmluZyAldVxuIiwgZW50LT5uX3BvcnRzKTsKLQlyZXR1cm4gZW50LT5uX3BvcnRzOyAvKiBzdWNjZXNzICovCi0KLSBlcnJfb3V0OgotCWRldnJlc19yZWxlYXNlX2dyb3VwKGRldiwgYXRhX2RldmljZV9hZGQpOwotCVZQUklOVEsoIkVYSVQsIHJldHVybmluZyAlZFxuIiwgcmMpOwogCXJldHVybiAwOwogfQogCiAvKioKKyAqCWF0YV9ob3N0X2FjdGl2YXRlIC0gc3RhcnQgaG9zdCwgcmVxdWVzdCBJUlEgYW5kIHJlZ2lzdGVyIGl0CisgKglAaG9zdDogdGFyZ2V0IEFUQSBob3N0CisgKglAaXJxOiBJUlEgdG8gcmVxdWVzdAorICoJQGlycV9oYW5kbGVyOiBpcnFfaGFuZGxlciB1c2VkIHdoZW4gcmVxdWVzdGluZyBJUlEKKyAqCUBpcnFfZmxhZ3M6IGlycV9mbGFncyB1c2VkIHdoZW4gcmVxdWVzdGluZyBJUlEKKyAqCUBzaHQ6IHNjc2lfaG9zdF90ZW1wbGF0ZSB0byB1c2Ugd2hlbiByZWdpc3RlcmluZyB0aGUgaG9zdAorICoKKyAqCUFmdGVyIGFsbG9jYXRpbmcgYW4gQVRBIGhvc3QgYW5kIGluaXRpYWxpemluZyBpdCwgbW9zdCBsaWJhdGEKKyAqCUxMRHMgcGVyZm9ybSB0aHJlZSBzdGVwcyB0byBhY3RpdmF0ZSB0aGUgaG9zdCAtIHN0YXJ0IGhvc3QsCisgKglyZXF1ZXN0IElSUSBhbmQgcmVnaXN0ZXIgaXQuICBUaGlzIGhlbHBlciB0YWtlcyBuZWNlc3Nhc3J5CisgKglhcmd1bWVudHMgYW5kIHBlcmZvcm1zIHRoZSB0aHJlZSBzdGVwcyBpbiBvbmUgZ28uCisgKgorICoJTE9DS0lORzoKKyAqCUluaGVyaXRlZCBmcm9tIGNhbGxpbmcgbGF5ZXIgKG1heSBzbGVlcCkuCisgKgorICoJUkVUVVJOUzoKKyAqCTAgb24gc3VjY2VzcywgLWVycm5vIG90aGVyd2lzZS4KKyAqLworaW50IGF0YV9ob3N0X2FjdGl2YXRlKHN0cnVjdCBhdGFfaG9zdCAqaG9zdCwgaW50IGlycSwKKwkJICAgICAgaXJxX2hhbmRsZXJfdCBpcnFfaGFuZGxlciwgdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3MsCisJCSAgICAgIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgKnNodCkKK3sKKwlpbnQgcmM7CisKKwlyYyA9IGF0YV9ob3N0X3N0YXJ0KGhvc3QpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJcmMgPSBkZXZtX3JlcXVlc3RfaXJxKGhvc3QtPmRldiwgaXJxLCBpcnFfaGFuZGxlciwgaXJxX2ZsYWdzLAorCQkJICAgICAgZGV2X2RyaXZlcl9zdHJpbmcoaG9zdC0+ZGV2KSwgaG9zdCk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlyYyA9IGF0YV9ob3N0X3JlZ2lzdGVyKGhvc3QsIHNodCk7CisJLyogaWYgZmFpbGVkLCBqdXN0IGZyZWUgdGhlIElSUSBhbmQgbGVhdmUgcG9ydHMgYWxvbmUgKi8KKwlpZiAocmMpCisJCWRldm1fZnJlZV9pcnEoaG9zdC0+ZGV2LCBpcnEsIGhvc3QpOworCisJcmV0dXJuIHJjOworfQorCisvKioKICAqCWF0YV9wb3J0X2RldGFjaCAtIERldGFjaCBBVEEgcG9ydCBpbiBwcmVwcmF0aW9uIG9mIGRldmljZSByZW1vdmFsCiAgKglAYXA6IEFUQSBwb3J0IHRvIGJlIGRldGFjaGVkCiAgKgpAQCAtNjA0MywzMiArNjQ1MSw2IEBACiAJCWF0YV9wb3J0X2RldGFjaChob3N0LT5wb3J0c1tpXSk7CiB9CiAKLXN0cnVjdCBhdGFfcHJvYmVfZW50ICoKLWF0YV9wcm9iZV9lbnRfYWxsb2Moc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqcG9ydCkKLXsKLQlzdHJ1Y3QgYXRhX3Byb2JlX2VudCAqcHJvYmVfZW50OwotCi0JcHJvYmVfZW50ID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpwcm9iZV9lbnQpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXByb2JlX2VudCkgewotCQlwcmludGsoS0VSTl9FUlIgRFJWX05BTUUgIiglcyk6IG91dCBvZiBtZW1vcnlcbiIsCi0JCSAgICAgICBrb2JqZWN0X25hbWUoJihkZXYtPmtvYmopKSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCUlOSVRfTElTVF9IRUFEKCZwcm9iZV9lbnQtPm5vZGUpOwotCXByb2JlX2VudC0+ZGV2ID0gZGV2OwotCi0JcHJvYmVfZW50LT5zaHQgPSBwb3J0LT5zaHQ7Ci0JcHJvYmVfZW50LT5wb3J0X2ZsYWdzID0gcG9ydC0+ZmxhZ3M7Ci0JcHJvYmVfZW50LT5waW9fbWFzayA9IHBvcnQtPnBpb19tYXNrOwotCXByb2JlX2VudC0+bXdkbWFfbWFzayA9IHBvcnQtPm13ZG1hX21hc2s7Ci0JcHJvYmVfZW50LT51ZG1hX21hc2sgPSBwb3J0LT51ZG1hX21hc2s7Ci0JcHJvYmVfZW50LT5wb3J0X29wcyA9IHBvcnQtPnBvcnRfb3BzOwotCXByb2JlX2VudC0+cHJpdmF0ZV9kYXRhID0gcG9ydC0+cHJpdmF0ZV9kYXRhOwotCi0JcmV0dXJuIHByb2JlX2VudDsKLX0KLQogLyoqCiAgKglhdGFfc3RkX3BvcnRzIC0gaW5pdGlhbGl6ZSBpb2FkZHIgd2l0aCBzdGFuZGFyZCBwb3J0IG9mZnNldHMuCiAgKglAaW9hZGRyOiBJTyBhZGRyZXNzIHN0cnVjdHVyZSB0byBiZSBpbml0aWFsaXplZApAQCAtNjMzNCw2ICs2NzE2LDEwIEBACiAJLnBvcnRfc3RvcAkJPSBhdGFfZHVtbXlfbm9yZXQsCiB9OwogCitjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBhdGFfZHVtbXlfcG9ydF9pbmZvID0geworCS5wb3J0X29wcwkJPSAmYXRhX2R1bW15X3BvcnRfb3BzLAorfTsKKwogLyoKICAqIGxpYmF0YSBpcyBlc3NlbnRpYWxseSBhIGxpYnJhcnkgb2YgaW50ZXJuYWwgaGVscGVyIGZ1bmN0aW9ucyBmb3IKICAqIGxvdy1sZXZlbCBBVEEgaG9zdCBjb250cm9sbGVyIGRyaXZlcnMuICBBcyBzdWNoLCB0aGUgQVBJL0FCSSBpcwpAQCAtNjM0NSwxMCArNjczMSwxNSBAQAogRVhQT1JUX1NZTUJPTF9HUEwoc2F0YV9kZWJfdGltaW5nX2hvdHBsdWcpOwogRVhQT1JUX1NZTUJPTF9HUEwoc2F0YV9kZWJfdGltaW5nX2xvbmcpOwogRVhQT1JUX1NZTUJPTF9HUEwoYXRhX2R1bW15X3BvcnRfb3BzKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9kdW1teV9wb3J0X2luZm8pOwogRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3N0ZF9iaW9zX3BhcmFtKTsKIEVYUE9SVF9TWU1CT0xfR1BMKGF0YV9zdGRfcG9ydHMpOwogRVhQT1JUX1NZTUJPTF9HUEwoYXRhX2hvc3RfaW5pdCk7Ci1FWFBPUlRfU1lNQk9MX0dQTChhdGFfZGV2aWNlX2FkZCk7CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfaG9zdF9hbGxvYyk7CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfaG9zdF9hbGxvY19waW5mbyk7CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfaG9zdF9zdGFydCk7CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfaG9zdF9yZWdpc3Rlcik7CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfaG9zdF9hY3RpdmF0ZSk7CiBFWFBPUlRfU1lNQk9MX0dQTChhdGFfaG9zdF9kZXRhY2gpOwogRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3NnX2luaXQpOwogRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3NnX2luaXRfb25lKTsKQEAgLTYzNjAsNiArNjc1MSw3IEBACiBFWFBPUlRfU1lNQk9MX0dQTChhdGFfdGZfcmVhZCk7CiBFWFBPUlRfU1lNQk9MX0dQTChhdGFfbm9vcF9kZXZfc2VsZWN0KTsKIEVYUE9SVF9TWU1CT0xfR1BMKGF0YV9zdGRfZGV2X3NlbGVjdCk7CitFWFBPUlRfU1lNQk9MX0dQTChzYXRhX3ByaW50X2xpbmtfc3RhdHVzKTsKIEVYUE9SVF9TWU1CT0xfR1BMKGF0YV90Zl90b19maXMpOwogRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3RmX2Zyb21fZmlzKTsKIEVYUE9SVF9TWU1CT0xfR1BMKGF0YV9jaGVja19zdGF0dXMpOwpAQCAtNjM2Nyw2ICs2NzU5LDcgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKGF0YV9leGVjX2NvbW1hbmQpOwogRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3BvcnRfc3RhcnQpOwogRVhQT1JUX1NZTUJPTF9HUEwoYXRhX2ludGVycnVwdCk7CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfZG9fc2V0X21vZGUpOwogRVhQT1JUX1NZTUJPTF9HUEwoYXRhX2RhdGFfeGZlcik7CiBFWFBPUlRfU1lNQk9MX0dQTChhdGFfZGF0YV94ZmVyX25vaXJxKTsKIEVYUE9SVF9TWU1CT0xfR1BMKGF0YV9xY19wcmVwKTsKQEAgLTY0MjksNyArNjgyMiw4IEBACiAKICNpZmRlZiBDT05GSUdfUENJCiBFWFBPUlRfU1lNQk9MX0dQTChwY2lfdGVzdF9jb25maWdfYml0cyk7Ci1FWFBPUlRfU1lNQk9MX0dQTChhdGFfcGNpX2luaXRfbmF0aXZlX21vZGUpOworRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3BjaV9pbml0X25hdGl2ZV9ob3N0KTsKK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9wY2lfcHJlcGFyZV9uYXRpdmVfaG9zdCk7CiBFWFBPUlRfU1lNQk9MX0dQTChhdGFfcGNpX2luaXRfb25lKTsKIEVYUE9SVF9TWU1CT0xfR1BMKGF0YV9wY2lfcmVtb3ZlX29uZSk7CiAjaWZkZWYgQ09ORklHX1BNCkBAIC02NDYxLDMgKzY4NTUsOCBAQAogRVhQT1JUX1NZTUJPTF9HUEwoYXRhX2lycV9hY2spOwogRVhQT1JUX1NZTUJPTF9HUEwoYXRhX2R1bW15X2lycV9hY2spOwogRVhQT1JUX1NZTUJPTF9HUEwoYXRhX2Rldl90cnlfY2xhc3NpZnkpOworCitFWFBPUlRfU1lNQk9MX0dQTChhdGFfY2FibGVfNDB3aXJlKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9jYWJsZV84MHdpcmUpOworRVhQT1JUX1NZTUJPTF9HUEwoYXRhX2NhYmxlX3Vua25vd24pOworRVhQT1JUX1NZTUJPTF9HUEwoYXRhX2NhYmxlX3NhdGEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvbGliYXRhLWVoLmMgYi9kcml2ZXJzL2F0YS9saWJhdGEtZWguYwppbmRleCAzOWY1NTZjLi4yYmZmOWFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9saWJhdGEtZWguYworKysgYi9kcml2ZXJzL2F0YS9saWJhdGEtZWguYwpAQCAtMTA1Niw3ICsxMDU2LDcgQEAKIAl9CiAJaWYgKHNlcnJvciAmIFNFUlJfSU5URVJOQUwpIHsKIAkJZXJyX21hc2sgfD0gQUNfRVJSX1NZU1RFTTsKLQkJYWN0aW9uIHw9IEFUQV9FSF9TT0ZUUkVTRVQ7CisJCWFjdGlvbiB8PSBBVEFfRUhfSEFSRFJFU0VUOwogCX0KIAlpZiAoc2Vycm9yICYgKFNFUlJfUEhZUkRZX0NIRyB8IFNFUlJfREVWX1hDSEcpKQogCQlhdGFfZWhpX2hvdHBsdWdnZWQoJmVoYy0+aSk7CkBAIC0xMTUxLDcgKzExNTEsOSBAQAogCQlyZXR1cm4gQVRBX0VIX1NPRlRSRVNFVDsKIAl9CiAKLQlpZiAoIShxYy0+ZXJyX21hc2sgJiBBQ19FUlJfREVWKSkKKwlpZiAoc3RhdCAmIChBVEFfRVJSIHwgQVRBX0RGKSkKKwkJcWMtPmVycl9tYXNrIHw9IEFDX0VSUl9ERVY7CisJZWxzZQogCQlyZXR1cm4gMDsKIAogCXN3aXRjaCAocWMtPmRldi0+Y2xhc3MpIHsKQEAgLTE2NjksNyArMTY3MSwxMCBAQAogCQkJCXJlc2V0ID09IHNvZnRyZXNldCA/ICJzb2Z0IiA6ICJoYXJkIik7CiAKIAkvKiBtYXJrIHRoYXQgdGhpcyBFSCBzZXNzaW9uIHN0YXJ0ZWQgd2l0aCByZXNldCAqLwotCWVoYy0+aS5mbGFncyB8PSBBVEFfRUhJX0RJRF9SRVNFVDsKKwlpZiAocmVzZXQgPT0gaGFyZHJlc2V0KQorCQllaGMtPmkuZmxhZ3MgfD0gQVRBX0VISV9ESURfSEFSRFJFU0VUOworCWVsc2UKKwkJZWhjLT5pLmZsYWdzIHw9IEFUQV9FSElfRElEX1NPRlRSRVNFVDsKIAogCXJjID0gYXRhX2RvX3Jlc2V0KGFwLCByZXNldCwgY2xhc3Nlcyk7CiAKQEAgLTE4MDgsNiArMTgxMywxMCBAQAogCQl9CiAJfQogCisJLyogUERJQUctIHNob3VsZCBoYXZlIGJlZW4gcmVsZWFzZWQsIGFzayBjYWJsZSB0eXBlIGlmIHBvc3QtcmVzZXQgKi8KKwlpZiAoKGVoYy0+aS5mbGFncyAmIEFUQV9FSElfRElEX1JFU0VUKSAmJiBhcC0+b3BzLT5jYWJsZV9kZXRlY3QpCisJCWFwLT5jYmwgPSBhcC0+b3BzLT5jYWJsZV9kZXRlY3QoYXApOworCiAJLyogQ29uZmlndXJlIG5ldyBkZXZpY2VzIGZvcndhcmQgc3VjaCB0aGF0IHVzZXIgZG9lc24ndCBzZWUKIAkgKiBkZXZpY2UgZGV0ZWN0aW9uIG1lc3NhZ2VzIGJhY2t3YXJkcy4KIAkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL2xpYmF0YS1zY3NpLmMgYi9kcml2ZXJzL2F0YS9saWJhdGEtc2NzaS5jCmluZGV4IGU5MzY0NDMuLjlhZmJhMmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL2xpYmF0YS1zY3NpLmMKKysrIGIvZHJpdmVycy9hdGEvbGliYXRhLXNjc2kuYwpAQCAtMTA0LDcgKzEwNCw3IEBACiAgKiBsaWJhdGEgdHJhbnNwb3J0IHRlbXBsYXRlLiAgbGliYXRhIGRvZXNuJ3QgZG8gcmVhbCB0cmFuc3BvcnQgc3R1ZmYuCiAgKiBJdCBqdXN0IG5lZWRzIHRoZSBlaF90aW1lZF9vdXQgaG9vay4KICAqLwotc3RydWN0IHNjc2lfdHJhbnNwb3J0X3RlbXBsYXRlIGF0YV9zY3NpX3RyYW5zcG9ydF90ZW1wbGF0ZSA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc2NzaV90cmFuc3BvcnRfdGVtcGxhdGUgYXRhX3Njc2lfdHJhbnNwb3J0X3RlbXBsYXRlID0gewogCS5laF9zdHJhdGVneV9oYW5kbGVyCT0gYXRhX3Njc2lfZXJyb3IsCiAJLmVoX3RpbWVkX291dAkJPSBhdGFfc2NzaV90aW1lZF9vdXQsCiAJLnVzZXJfc2NhbgkJPSBhdGFfc2NzaV91c2VyX3NjYW4sCkBAIC0yNjc4LDYgKzI2NzgsMTggQEAKIAkJdGYtPmRldmljZSA9IHFjLT5kZXYtPmRldm5vID8KIAkJCXRmLT5kZXZpY2UgfCBBVEFfREVWMSA6IHRmLT5kZXZpY2UgJiB+QVRBX0RFVjE7CiAKKwkvKiBSRUFEL1dSSVRFIExPTkcgdXNlIGEgbm9uLXN0YW5kYXJkIHNlY3Rfc2l6ZSAqLworCXFjLT5zZWN0X3NpemUgPSBBVEFfU0VDVF9TSVpFOworCXN3aXRjaCAodGYtPmNvbW1hbmQpIHsKKwljYXNlIEFUQV9DTURfUkVBRF9MT05HOgorCWNhc2UgQVRBX0NNRF9SRUFEX0xPTkdfT05DRToKKwljYXNlIEFUQV9DTURfV1JJVEVfTE9ORzoKKwljYXNlIEFUQV9DTURfV1JJVEVfTE9OR19PTkNFOgorCQlpZiAodGYtPnByb3RvY29sICE9IEFUQV9QUk9UX1BJTyB8fCB0Zi0+bnNlY3QgIT0gMSkKKwkJCWdvdG8gaW52YWxpZF9mbGQ7CisJCXFjLT5zZWN0X3NpemUgPSBzY21kLT5yZXF1ZXN0X2J1ZmZsZW47CisJfQorCiAJLyoKIAkgKiBGaWx0ZXIgU0VUX0ZFQVRVUkVTIC0gWEZFUiBNT0RFIGNvbW1hbmQgLS0gb3RoZXJ3aXNlLAogCSAqIFNFVF9GRUFUVVJFUyAtIFhGRVIgTU9ERSBtdXN0IGJlIHByZWNlZGVkL3N1Y2NlZWRlZApAQCAtMjc5Miw4ICsyODA0LDkgQEAKIHsKIAlpbnQgcmMgPSAwOwogCi0JaWYgKHVubGlrZWx5KCFzY21kLT5jbWRfbGVuKSkgewotCQlhdGFfZGV2X3ByaW50ayhkZXYsIEtFUk5fV0FSTklORywgIldBUk5JTkc6IHplcm8gbGVuIENEQlxuIik7CisJaWYgKHVubGlrZWx5KCFzY21kLT5jbWRfbGVuIHx8IHNjbWQtPmNtZF9sZW4gPiBkZXYtPmNkYl9sZW4pKSB7CisJCURQUklOVEsoImJhZCBDREIgbGVuPSV1LCBtYXg9JXVcbiIsCisJCQlzY21kLT5jbWRfbGVuLCBkZXYtPmNkYl9sZW4pOwogCQlzY21kLT5yZXN1bHQgPSBESURfRVJST1IgPDwgMTY7CiAJCWRvbmUoc2NtZCk7CiAJCXJldHVybiAwOwpAQCAtMjk0OCw2ICsyOTYxLDQ4IEBACiAJfQogfQogCitpbnQgYXRhX3Njc2lfYWRkX2hvc3RzKHN0cnVjdCBhdGFfaG9zdCAqaG9zdCwgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqc2h0KQoreworCWludCBpLCByYzsKKworCWZvciAoaSA9IDA7IGkgPCBob3N0LT5uX3BvcnRzOyBpKyspIHsKKwkJc3RydWN0IGF0YV9wb3J0ICphcCA9IGhvc3QtPnBvcnRzW2ldOworCQlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdDsKKworCQlyYyA9IC1FTk9NRU07CisJCXNob3N0ID0gc2NzaV9ob3N0X2FsbG9jKHNodCwgc2l6ZW9mKHN0cnVjdCBhdGFfcG9ydCAqKSk7CisJCWlmICghc2hvc3QpCisJCQlnb3RvIGVycl9hbGxvYzsKKworCQkqKHN0cnVjdCBhdGFfcG9ydCAqKikmc2hvc3QtPmhvc3RkYXRhWzBdID0gYXA7CisJCWFwLT5zY3NpX2hvc3QgPSBzaG9zdDsKKworCQlzaG9zdC0+dHJhbnNwb3J0dCA9ICZhdGFfc2NzaV90cmFuc3BvcnRfdGVtcGxhdGU7CisJCXNob3N0LT51bmlxdWVfaWQgPSBhcC0+cHJpbnRfaWQ7CisJCXNob3N0LT5tYXhfaWQgPSAxNjsKKwkJc2hvc3QtPm1heF9sdW4gPSAxOworCQlzaG9zdC0+bWF4X2NoYW5uZWwgPSAxOworCQlzaG9zdC0+bWF4X2NtZF9sZW4gPSAxNjsKKworCQlyYyA9IHNjc2lfYWRkX2hvc3QoYXAtPnNjc2lfaG9zdCwgYXAtPmhvc3QtPmRldik7CisJCWlmIChyYykKKwkJCWdvdG8gZXJyX2FkZDsKKwl9CisKKwlyZXR1cm4gMDsKKworIGVycl9hZGQ6CisJc2NzaV9ob3N0X3B1dChob3N0LT5wb3J0c1tpXS0+c2NzaV9ob3N0KTsKKyBlcnJfYWxsb2M6CisJd2hpbGUgKC0taSA+PSAwKSB7CisJCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gaG9zdC0+cG9ydHNbaV0tPnNjc2lfaG9zdDsKKworCQlzY3NpX3JlbW92ZV9ob3N0KHNob3N0KTsKKwkJc2NzaV9ob3N0X3B1dChzaG9zdCk7CisJfQorCXJldHVybiByYzsKK30KKwogdm9pZCBhdGFfc2NzaV9zY2FuX2hvc3Qoc3RydWN0IGF0YV9wb3J0ICphcCkKIHsKIAl1bnNpZ25lZCBpbnQgaTsKQEAgLTMyMjQsMjEgKzMyNzksMjEgQEAKIAkJCQkgICAgc3RydWN0IGF0YV9wb3J0X2luZm8gKnBvcnRfaW5mbywKIAkJCQkgICAgc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpCiB7Ci0Jc3RydWN0IGF0YV9wb3J0ICphcCA9IGt6YWxsb2Moc2l6ZW9mKCphcCksIEdGUF9LRVJORUwpOwotCXN0cnVjdCBhdGFfcHJvYmVfZW50ICplbnQ7CisJc3RydWN0IGF0YV9wb3J0ICphcDsKIAorCWFwID0gYXRhX3BvcnRfYWxsb2MoaG9zdCk7CiAJaWYgKCFhcCkKIAkJcmV0dXJuIE5VTEw7CiAKLQllbnQgPSBhdGFfcHJvYmVfZW50X2FsbG9jKGhvc3QtPmRldiwgcG9ydF9pbmZvKTsKLQlpZiAoIWVudCkgewotCQlrZnJlZShhcCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCWF0YV9wb3J0X2luaXQoYXAsIGhvc3QsIGVudCwgMCk7CisJYXAtPnBvcnRfbm8gPSAwOwogCWFwLT5sb2NrID0gc2hvc3QtPmhvc3RfbG9jazsKLQlkZXZtX2tmcmVlKGhvc3QtPmRldiwgZW50KTsKKwlhcC0+cGlvX21hc2sgPSBwb3J0X2luZm8tPnBpb19tYXNrOworCWFwLT5td2RtYV9tYXNrID0gcG9ydF9pbmZvLT5td2RtYV9tYXNrOworCWFwLT51ZG1hX21hc2sgPSBwb3J0X2luZm8tPnVkbWFfbWFzazsKKwlhcC0+ZmxhZ3MgfD0gcG9ydF9pbmZvLT5mbGFnczsKKwlhcC0+b3BzID0gcG9ydF9pbmZvLT5wb3J0X29wczsKKwlhcC0+Y2JsID0gQVRBX0NCTF9TQVRBOworCiAJcmV0dXJuIGFwOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3Nhc19wb3J0X2FsbG9jKTsKQEAgLTMyOTQsOCArMzM0OSwxMCBAQAogewogCWludCByYyA9IGFwLT5vcHMtPnBvcnRfc3RhcnQoYXApOwogCi0JaWYgKCFyYykKKwlpZiAoIXJjKSB7CisJCWFwLT5wcmludF9pZCA9IGF0YV9wcmludF9pZCsrOwogCQlyYyA9IGF0YV9idXNfcHJvYmUoYXApOworCX0KIAogCXJldHVybiByYzsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL2xpYmF0YS1zZmYuYyBiL2RyaXZlcnMvYXRhL2xpYmF0YS1zZmYuYwppbmRleCAyZmZjY2EwLi5kMjExZGI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9saWJhdGEtc2ZmLmMKKysrIGIvZHJpdmVycy9hdGEvbGliYXRhLXNmZi5jCkBAIC01MjYsMTY5ICs1MjYsNDAwIEBACiAJcG9ydCA9IHBvcnQgKiAyOwogCWZvciAoaSA9IDA7IGkgPCAyOyBpICsrKSB7CiAJCWlmIChwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgcG9ydCArIGkpID09IDAgfHwKLQkJCXBjaV9yZXNvdXJjZV9sZW4ocGRldiwgcG9ydCArIGkpID09IDApCi0JCXJldHVybiAwOworCQkgICAgcGNpX3Jlc291cmNlX2xlbihwZGV2LCBwb3J0ICsgaSkgPT0gMCkKKwkJCXJldHVybiAwOwogCX0KIAlyZXR1cm4gMTsKIH0KIAogLyoqCi0gKglhdGFfcGNpX2luaXRfbmF0aXZlX21vZGUgLSBJbml0aWFsaXplIG5hdGl2ZS1tb2RlIGRyaXZlcgotICoJQHBkZXY6ICBwY2kgZGV2aWNlIHRvIGJlIGluaXRpYWxpemVkCi0gKglAcG9ydDogIGFycmF5WzJdIG9mIHBvaW50ZXJzIHRvIHBvcnQgaW5mbyBzdHJ1Y3R1cmVzLgotICoJQHBvcnRzOiBiaXRtYXAgb2YgcG9ydHMgcHJlc2VudAorICoJYXRhX3BjaV9pbml0X2JtZG1hIC0gYWNxdWlyZSBQQ0kgQk1ETUEgcmVzb3VyY2VzIGFuZCBpbml0IEFUQSBob3N0CisgKglAaG9zdDogdGFyZ2V0IEFUQSBob3N0CiAgKgotICoJVXRpbGl0eSBmdW5jdGlvbiB3aGljaCBhbGxvY2F0ZXMgYW5kIGluaXRpYWxpemVzIGFuCi0gKglhdGFfcHJvYmVfZW50IHN0cnVjdHVyZSBmb3IgYSBzdGFuZGFyZCBkdWFsLXBvcnQKLSAqCVBJTy1iYXNlZCBJREUgY29udHJvbGxlci4gIFRoZSByZXR1cm5lZCBhdGFfcHJvYmVfZW50Ci0gKglzdHJ1Y3R1cmUgY2FuIGJlIHBhc3NlZCB0byBhdGFfZGV2aWNlX2FkZCgpLiAgVGhlIHJldHVybmVkCi0gKglhdGFfcHJvYmVfZW50IHN0cnVjdHVyZSBzaG91bGQgdGhlbiBiZSBmcmVlZCB3aXRoIGtmcmVlKCkuCisgKglBY3F1aXJlIFBDSSBCTURNQSByZXNvdXJjZXMgYW5kIGluaXRpYWxpemUgQGhvc3QgYWNjb3JkaW5nbHkuCiAgKgotICoJVGhlIGNhbGxlciBuZWVkIG9ubHkgcGFzcyB0aGUgYWRkcmVzcyBvZiB0aGUgcHJpbWFyeSBwb3J0LCB0aGUKLSAqCXNlY29uZGFyeSB3aWxsIGJlIGRlZHVjZWQgYXV0b21hdGljYWxseS4gSWYgdGhlIGRldmljZSBoYXMgbm9uCi0gKglzdGFuZGFyZCBzZWNvbmRhcnkgcG9ydCBtYXBwaW5ncyB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgdHdpY2UsCi0gKglvbmNlIGZvciBlYWNoIGludGVyZmFjZS4KKyAqCUxPQ0tJTkc6CisgKglJbmhlcml0ZWQgZnJvbSBjYWxsaW5nIGxheWVyIChtYXkgc2xlZXApLgorICoKKyAqCVJFVFVSTlM6CisgKgkwIG9uIHN1Y2Nlc3MsIC1lcnJubyBvdGhlcndpc2UuCiAgKi8KLQotc3RydWN0IGF0YV9wcm9iZV9lbnQgKgotYXRhX3BjaV9pbml0X25hdGl2ZV9tb2RlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqKnBvcnQsIGludCBwb3J0cykKK3N0YXRpYyBpbnQgYXRhX3BjaV9pbml0X2JtZG1hKHN0cnVjdCBhdGFfaG9zdCAqaG9zdCkKIHsKLQlzdHJ1Y3QgYXRhX3Byb2JlX2VudCAqcHJvYmVfZW50OwotCWludCBpLCBwID0gMDsKLQl2b2lkIF9faW9tZW0gKiBjb25zdCAqaW9tYXA7CisJc3RydWN0IGRldmljZSAqZ2RldiA9IGhvc3QtPmRldjsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoZ2Rldik7CisJaW50IGksIHJjOwogCi0JLyogaW9tYXAgQkFScyAqLwotCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJaWYgKHBjaW1faW9tYXAocGRldiwgaSwgMCkgPT0gTlVMTCkgewotCQkJZGV2X3ByaW50ayhLRVJOX0VSUiwgJnBkZXYtPmRldiwKLQkJCQkgICAiZmFpbGVkIHRvIGlvbWFwIFBDSSBCQVIgJWRcbiIsIGkpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KKwkvKiBUT0RPOiBJZiB3ZSBnZXQgbm8gRE1BIG1hc2sgd2Ugc2hvdWxkIGZhbGwgYmFjayB0byBQSU8gKi8KKwlyYyA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgQVRBX0RNQV9NQVNLKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKwlyYyA9IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBBVEFfRE1BX01BU0spOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJLyogcmVxdWVzdCBhbmQgaW9tYXAgRE1BIHJlZ2lvbiAqLworCXJjID0gcGNpbV9pb21hcF9yZWdpb25zKHBkZXYsIDEgPDwgNCwgRFJWX05BTUUpOworCWlmIChyYykgeworCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCBnZGV2LCAiZmFpbGVkIHRvIHJlcXVlc3QvaW9tYXAgQkFSNFxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlob3N0LT5pb21hcCA9IHBjaW1faW9tYXBfdGFibGUocGRldik7CisKKwlmb3IgKGkgPSAwOyBpIDwgaG9zdC0+bl9wb3J0czsgaSsrKSB7CisJCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBob3N0LT5wb3J0c1tpXTsKKwkJdm9pZCBfX2lvbWVtICpibWRtYSA9IGhvc3QtPmlvbWFwWzRdICsgOCAqIGk7CisKKwkJaWYgKGF0YV9wb3J0X2lzX2R1bW15KGFwKSkKKwkJCWNvbnRpbnVlOworCisJCWFwLT5pb2FkZHIuYm1kbWFfYWRkciA9IGJtZG1hOworCQlpZiAoKCEoYXAtPmZsYWdzICYgQVRBX0ZMQUdfSUdOX1NJTVBMRVgpKSAmJgorCQkgICAgKGlvcmVhZDgoYm1kbWEgKyAyKSAmIDB4ODApKQorCQkJaG9zdC0+ZmxhZ3MgfD0gQVRBX0hPU1RfU0lNUExFWDsKIAl9CiAKLQlwY2ltX2lvbWFwKHBkZXYsIDQsIDApOyAvKiBtYXkgZmFpbCAqLwotCWlvbWFwID0gcGNpbV9pb21hcF90YWJsZShwZGV2KTsKLQotCS8qIGFsbG9jIGFuZCBpbml0IHByb2JlX2VudCAqLwotCXByb2JlX2VudCA9IGF0YV9wcm9iZV9lbnRfYWxsb2MocGNpX2Rldl90b19kZXYocGRldiksIHBvcnRbMF0pOwotCWlmICghcHJvYmVfZW50KQotCQlyZXR1cm4gTlVMTDsKLQotCXByb2JlX2VudC0+aXJxID0gcGRldi0+aXJxOwotCXByb2JlX2VudC0+aXJxX2ZsYWdzID0gSVJRRl9TSEFSRUQ7Ci0KLQkvKiBEaXNjYXJkIGRpc2FibGVkIHBvcnRzLiBTb21lIGNvbnRyb2xsZXJzIHNob3cgdGhlaXIKLQkgICB1bnVzZWQgY2hhbm5lbHMgdGhpcyB3YXkgKi8KLQlpZiAoYXRhX3Jlc291cmNlc19wcmVzZW50KHBkZXYsIDApID09IDApCi0JCXBvcnRzICY9IH5BVEFfUE9SVF9QUklNQVJZOwotCWlmIChhdGFfcmVzb3VyY2VzX3ByZXNlbnQocGRldiwgMSkgPT0gMCkKLQkJcG9ydHMgJj0gfkFUQV9QT1JUX1NFQ09OREFSWTsKLQotCWlmIChwb3J0cyAmIEFUQV9QT1JUX1BSSU1BUlkpIHsKLQkJcHJvYmVfZW50LT5wb3J0W3BdLmNtZF9hZGRyID0gaW9tYXBbMF07Ci0JCXByb2JlX2VudC0+cG9ydFtwXS5hbHRzdGF0dXNfYWRkciA9Ci0JCXByb2JlX2VudC0+cG9ydFtwXS5jdGxfYWRkciA9ICh2b2lkIF9faW9tZW0gKikKLQkJCSgodW5zaWduZWQgbG9uZylpb21hcFsxXSB8IEFUQV9QQ0lfQ1RMX09GUyk7Ci0JCWlmIChpb21hcFs0XSkgewotCQkJaWYgKCghKHBvcnRbcF0tPmZsYWdzICYgQVRBX0ZMQUdfSUdOX1NJTVBMRVgpKSAmJgotCQkJICAgIChpb3JlYWQ4KGlvbWFwWzRdICsgMikgJiAweDgwKSkKLQkJCQlwcm9iZV9lbnQtPl9ob3N0X2ZsYWdzIHw9IEFUQV9IT1NUX1NJTVBMRVg7Ci0JCQlwcm9iZV9lbnQtPnBvcnRbcF0uYm1kbWFfYWRkciA9IGlvbWFwWzRdOwotCQl9Ci0JCWF0YV9zdGRfcG9ydHMoJnByb2JlX2VudC0+cG9ydFtwXSk7Ci0JCXArKzsKLQl9Ci0KLQlpZiAocG9ydHMgJiBBVEFfUE9SVF9TRUNPTkRBUlkpIHsKLQkJcHJvYmVfZW50LT5wb3J0W3BdLmNtZF9hZGRyID0gaW9tYXBbMl07Ci0JCXByb2JlX2VudC0+cG9ydFtwXS5hbHRzdGF0dXNfYWRkciA9Ci0JCXByb2JlX2VudC0+cG9ydFtwXS5jdGxfYWRkciA9ICh2b2lkIF9faW9tZW0gKikKLQkJCSgodW5zaWduZWQgbG9uZylpb21hcFszXSB8IEFUQV9QQ0lfQ1RMX09GUyk7Ci0JCWlmIChpb21hcFs0XSkgewotCQkJaWYgKCghKHBvcnRbcF0tPmZsYWdzICYgQVRBX0ZMQUdfSUdOX1NJTVBMRVgpKSAmJgotCQkJICAgIChpb3JlYWQ4KGlvbWFwWzRdICsgMTApICYgMHg4MCkpCi0JCQkJcHJvYmVfZW50LT5faG9zdF9mbGFncyB8PSBBVEFfSE9TVF9TSU1QTEVYOwotCQkJcHJvYmVfZW50LT5wb3J0W3BdLmJtZG1hX2FkZHIgPSBpb21hcFs0XSArIDg7Ci0JCX0KLQkJYXRhX3N0ZF9wb3J0cygmcHJvYmVfZW50LT5wb3J0W3BdKTsKLQkJcHJvYmVfZW50LT5waW5mbzIgPSBwb3J0WzFdOwotCQlwKys7Ci0JfQotCi0JcHJvYmVfZW50LT5uX3BvcnRzID0gcDsKLQlyZXR1cm4gcHJvYmVfZW50OworCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IGF0YV9wcm9iZV9lbnQgKmF0YV9wY2lfaW5pdF9sZWdhY3lfcG9ydChzdHJ1Y3QgcGNpX2RldiAqcGRldiwKLQkJCQlzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqKnBvcnQsIGludCBwb3J0X21hc2spCisvKioKKyAqCWF0YV9wY2lfaW5pdF9uYXRpdmVfaG9zdCAtIGFjcXVpcmUgbmF0aXZlIEFUQSByZXNvdXJjZXMgYW5kIGluaXQgaG9zdAorICoJQGhvc3Q6IHRhcmdldCBBVEEgaG9zdAorICoJQHBvcnRfbWFzazogcG9ydHMgdG8gY29uc2lkZXIKKyAqCisgKglBY3F1aXJlIG5hdGl2ZSBQQ0kgQVRBIHJlc291cmNlcyBmb3IgQGhvc3QgYW5kIGluaXRpYWxpemUKKyAqCUBob3N0IGFjY29yZG9pbmdseS4KKyAqCisgKglMT0NLSU5HOgorICoJSW5oZXJpdGVkIGZyb20gY2FsbGluZyBsYXllciAobWF5IHNsZWVwKS4KKyAqCisgKglSRVRVUk5TOgorICoJMCBvbiBzdWNjZXNzLCAtZXJybm8gb3RoZXJ3aXNlLgorICovCitpbnQgYXRhX3BjaV9pbml0X25hdGl2ZV9ob3N0KHN0cnVjdCBhdGFfaG9zdCAqaG9zdCwgdW5zaWduZWQgaW50IHBvcnRfbWFzaykKIHsKLQlzdHJ1Y3QgYXRhX3Byb2JlX2VudCAqcHJvYmVfZW50OwotCXZvaWQgX19pb21lbSAqaW9tYXBbNV0gPSB7IH0sICpibWRtYTsKKwlzdHJ1Y3QgZGV2aWNlICpnZGV2ID0gaG9zdC0+ZGV2OworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihnZGV2KTsKKwlpbnQgaSwgcmM7CiAKLQlpZiAocG9ydF9tYXNrICYgQVRBX1BPUlRfUFJJTUFSWSkgewotCQlpb21hcFswXSA9IGRldm1faW9wb3J0X21hcCgmcGRldi0+ZGV2LCBBVEFfUFJJTUFSWV9DTUQsIDgpOwotCQlpb21hcFsxXSA9IGRldm1faW9wb3J0X21hcCgmcGRldi0+ZGV2LCBBVEFfUFJJTUFSWV9DVEwsIDEpOwotCQlpZiAoIWlvbWFwWzBdIHx8ICFpb21hcFsxXSkKLQkJCXJldHVybiBOVUxMOwotCX0KLQotCWlmIChwb3J0X21hc2sgJiBBVEFfUE9SVF9TRUNPTkRBUlkpIHsKLQkJaW9tYXBbMl0gPSBkZXZtX2lvcG9ydF9tYXAoJnBkZXYtPmRldiwgQVRBX1NFQ09OREFSWV9DTUQsIDgpOwotCQlpb21hcFszXSA9IGRldm1faW9wb3J0X21hcCgmcGRldi0+ZGV2LCBBVEFfU0VDT05EQVJZX0NUTCwgMSk7Ci0JCWlmICghaW9tYXBbMl0gfHwgIWlvbWFwWzNdKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JYm1kbWEgPSBwY2ltX2lvbWFwKHBkZXYsIDQsIDE2KTsgLyogbWF5IGZhaWwgKi8KLQotCS8qIGFsbG9jIGFuZCBpbml0IHByb2JlX2VudCAqLwotCXByb2JlX2VudCA9IGF0YV9wcm9iZV9lbnRfYWxsb2MocGNpX2Rldl90b19kZXYocGRldiksIHBvcnRbMF0pOwotCWlmICghcHJvYmVfZW50KQotCQlyZXR1cm4gTlVMTDsKLQotCXByb2JlX2VudC0+bl9wb3J0cyA9IDI7Ci0JcHJvYmVfZW50LT5pcnFfZmxhZ3MgPSBJUlFGX1NIQVJFRDsKLQotCWlmIChwb3J0X21hc2sgJiBBVEFfUE9SVF9QUklNQVJZKSB7Ci0JCXByb2JlX2VudC0+aXJxID0gQVRBX1BSSU1BUllfSVJRKHBkZXYpOwotCQlwcm9iZV9lbnQtPnBvcnRbMF0uY21kX2FkZHIgPSBpb21hcFswXTsKLQkJcHJvYmVfZW50LT5wb3J0WzBdLmFsdHN0YXR1c19hZGRyID0KLQkJcHJvYmVfZW50LT5wb3J0WzBdLmN0bF9hZGRyID0gaW9tYXBbMV07Ci0JCWlmIChibWRtYSkgewotCQkJcHJvYmVfZW50LT5wb3J0WzBdLmJtZG1hX2FkZHIgPSBibWRtYTsKLQkJCWlmICgoIShwb3J0WzBdLT5mbGFncyAmIEFUQV9GTEFHX0lHTl9TSU1QTEVYKSkgJiYKLQkJCSAgICAoaW9yZWFkOChibWRtYSArIDIpICYgMHg4MCkpCi0JCQkJcHJvYmVfZW50LT5faG9zdF9mbGFncyB8PSBBVEFfSE9TVF9TSU1QTEVYOworCS8qIERpc2NhcmQgZGlzYWJsZWQgcG9ydHMuICBTb21lIGNvbnRyb2xsZXJzIHNob3cgdGhlaXIgdW51c2VkCisJICogY2hhbm5lbHMgdGhpcyB3YXkuICBEaXNhYmxlZCBwb3J0cyBhcmUgbWFkZSBkdW1teS4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCWlmICgocG9ydF9tYXNrICYgKDEgPDwgaSkpICYmICFhdGFfcmVzb3VyY2VzX3ByZXNlbnQocGRldiwgaSkpIHsKKwkJCWhvc3QtPnBvcnRzW2ldLT5vcHMgPSAmYXRhX2R1bW15X3BvcnRfb3BzOworCQkJcG9ydF9tYXNrICY9IH4oMSA8PCBpKTsKIAkJfQotCQlhdGFfc3RkX3BvcnRzKCZwcm9iZV9lbnQtPnBvcnRbMF0pOwotCX0gZWxzZQotCQlwcm9iZV9lbnQtPmR1bW15X3BvcnRfbWFzayB8PSBBVEFfUE9SVF9QUklNQVJZOworCX0KIAotCWlmIChwb3J0X21hc2sgJiBBVEFfUE9SVF9TRUNPTkRBUlkpIHsKLQkJaWYgKHByb2JlX2VudC0+aXJxKQotCQkJcHJvYmVfZW50LT5pcnEyID0gQVRBX1NFQ09OREFSWV9JUlEocGRldik7CisJaWYgKCFwb3J0X21hc2spIHsKKwkJZGV2X3ByaW50ayhLRVJOX0VSUiwgZ2RldiwgIm5vIGF2YWlsYWJsZSBwb3J0XG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogcmVxdWVzdCwgaW9tYXAgQkFScyBhbmQgaW5pdCBwb3J0IGFkZHJlc3NlcyBhY2NvcmRpbmdseSAqLworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJc3RydWN0IGF0YV9wb3J0ICphcCA9IGhvc3QtPnBvcnRzW2ldOworCQlpbnQgYmFzZSA9IGkgKiAyOworCQl2b2lkIF9faW9tZW0gKiBjb25zdCAqaW9tYXA7CisKKwkJaWYgKCEocG9ydF9tYXNrICYgKDEgPDwgaSkpKQorCQkJY29udGludWU7CisKKwkJcmMgPSBwY2ltX2lvbWFwX3JlZ2lvbnMocGRldiwgMHgzIDw8IGJhc2UsIERSVl9OQU1FKTsKKwkJaWYgKHJjKSB7CisJCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCBnZGV2LCAiZmFpbGVkIHRvIHJlcXVlc3QvaW9tYXAgIgorCQkJCSAgICJCQVJzIGZvciBwb3J0ICVkIChlcnJubz0lZClcbiIsIGksIHJjKTsKKwkJCWlmIChyYyA9PSAtRUJVU1kpCisJCQkJcGNpbV9waW5fZGV2aWNlKHBkZXYpOworCQkJcmV0dXJuIHJjOworCQl9CisJCWhvc3QtPmlvbWFwID0gaW9tYXAgPSBwY2ltX2lvbWFwX3RhYmxlKHBkZXYpOworCisJCWFwLT5pb2FkZHIuY21kX2FkZHIgPSBpb21hcFtiYXNlXTsKKwkJYXAtPmlvYWRkci5hbHRzdGF0dXNfYWRkciA9CisJCWFwLT5pb2FkZHIuY3RsX2FkZHIgPSAodm9pZCBfX2lvbWVtICopCisJCQkoKHVuc2lnbmVkIGxvbmcpaW9tYXBbYmFzZSArIDFdIHwgQVRBX1BDSV9DVExfT0ZTKTsKKwkJYXRhX3N0ZF9wb3J0cygmYXAtPmlvYWRkcik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJYXRhX3BjaV9wcmVwYXJlX25hdGl2ZV9ob3N0IC0gaGVscGVyIHRvIHByZXBhcmUgbmF0aXZlIFBDSSBBVEEgaG9zdAorICoJQHBkZXY6IHRhcmdldCBQQ0kgZGV2aWNlCisgKglAcHBpOiBhcnJheSBvZiBwb3J0X2luZm8KKyAqCUBuX3BvcnRzOiBudW1iZXIgb2YgcG9ydHMgdG8gYWxsb2NhdGUKKyAqCUByX2hvc3Q6IG91dCBhcmd1bWVudCBmb3IgdGhlIGluaXRpYWxpemVkIEFUQSBob3N0CisgKgorICoJSGVscGVyIHRvIGFsbG9jYXRlIEFUQSBob3N0IGZvciBAcGRldiwgYWNxdWlyZSBhbGwgbmF0aXZlIFBDSQorICoJcmVzb3VyY2VzIGFuZCBpbml0aWFsaXplIGl0IGFjY29yZGluZ2x5IGluIG9uZSBnby4KKyAqCisgKglMT0NLSU5HOgorICoJSW5oZXJpdGVkIGZyb20gY2FsbGluZyBsYXllciAobWF5IHNsZWVwKS4KKyAqCisgKglSRVRVUk5TOgorICoJMCBvbiBzdWNjZXNzLCAtZXJybm8gb3RoZXJ3aXNlLgorICovCitpbnQgYXRhX3BjaV9wcmVwYXJlX25hdGl2ZV9ob3N0KHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCWNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvICogY29uc3QgKiBwcGksCisJCQkJaW50IG5fcG9ydHMsIHN0cnVjdCBhdGFfaG9zdCAqKnJfaG9zdCkKK3sKKwlzdHJ1Y3QgYXRhX2hvc3QgKmhvc3Q7CisJdW5zaWduZWQgaW50IHBvcnRfbWFzazsKKwlpbnQgcmM7CisKKwlpZiAoIWRldnJlc19vcGVuX2dyb3VwKCZwZGV2LT5kZXYsIE5VTEwsIEdGUF9LRVJORUwpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWhvc3QgPSBhdGFfaG9zdF9hbGxvY19waW5mbygmcGRldi0+ZGV2LCBwcGksIDIpOworCWlmICghaG9zdCkgeworCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCAmcGRldi0+ZGV2LAorCQkJICAgImZhaWxlZCB0byBhbGxvY2F0ZSBBVEEgaG9zdFxuIik7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0OworCX0KKworCXBvcnRfbWFzayA9IEFUQV9QT1JUX1BSSU1BUlk7CisJaWYgKG5fcG9ydHMgPiAxKQorCQlwb3J0X21hc2sgfD0gQVRBX1BPUlRfU0VDT05EQVJZOworCisJcmMgPSBhdGFfcGNpX2luaXRfbmF0aXZlX2hvc3QoaG9zdCwgcG9ydF9tYXNrKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX291dDsKKworCS8qIGluaXQgRE1BIHJlbGF0ZWQgc3R1ZmYgKi8KKwlyYyA9IGF0YV9wY2lfaW5pdF9ibWRtYShob3N0KTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX2JtZG1hOworCisJZGV2cmVzX3JlbW92ZV9ncm91cCgmcGRldi0+ZGV2LCBOVUxMKTsKKwkqcl9ob3N0ID0gaG9zdDsKKwlyZXR1cm4gMDsKKworIGVycl9ibWRtYToKKwkvKiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIFBDSSBhbmQgaW9tYXAgcmVzb3VyY2VzIGFyZQorCSAqIG1lcmdlZCBhbmQgcmVsZWFzaW5nIHRoZSB0b3AgZ3JvdXAgd29uJ3QgcmVsZWFzZSB0aGUKKwkgKiBhY3F1aXJlZCByZXNvdXJjZXMgaWYgc29tZSBvZiB0aG9zZSBoYXZlIGJlZW4gYWNxdWlyZWQKKwkgKiBiZWZvcmUgZW50ZXJpbmcgdGhpcyBmdW5jdGlvbi4KKwkgKi8KKwlwY2ltX2lvdW5tYXBfcmVnaW9ucyhwZGV2LCAweGYpOworIGVycl9vdXQ6CisJZGV2cmVzX3JlbGVhc2VfZ3JvdXAoJnBkZXYtPmRldiwgTlVMTCk7CisJcmV0dXJuIHJjOworfQorCitzdHJ1Y3QgYXRhX2xlZ2FjeV9kZXZyZXMgeworCXVuc2lnbmVkIGludAltYXNrOworCXVuc2lnbmVkIGxvbmcJY21kX3BvcnRbMl07CisJdm9pZCBfX2lvbWVtICoJY21kX2FkZHJbMl07CisJdm9pZCBfX2lvbWVtICoJY3RsX2FkZHJbMl07CisJdW5zaWduZWQgaW50CWlycVsyXTsKKwl2b2lkICoJCWlycV9kZXZfaWRbMl07Cit9OworCitzdGF0aWMgdm9pZCBhdGFfbGVnYWN5X2ZyZWVfaXJxcyhzdHJ1Y3QgYXRhX2xlZ2FjeV9kZXZyZXMgKmxlZ2FjeV9kcikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJaWYgKCFsZWdhY3lfZHItPmlycVtpXSkKKwkJCWNvbnRpbnVlOworCisJCWZyZWVfaXJxKGxlZ2FjeV9kci0+aXJxW2ldLCBsZWdhY3lfZHItPmlycV9kZXZfaWRbaV0pOworCQlsZWdhY3lfZHItPmlycVtpXSA9IDA7CisJCWxlZ2FjeV9kci0+aXJxX2Rldl9pZFtpXSA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgdm9pZCBhdGFfbGVnYWN5X3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZ2Rldiwgdm9pZCAqcmVzKQoreworCXN0cnVjdCBhdGFfbGVnYWN5X2RldnJlcyAqdGhpcyA9IHJlczsKKwlpbnQgaTsKKworCWF0YV9sZWdhY3lfZnJlZV9pcnFzKHRoaXMpOworCisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQlpZiAodGhpcy0+Y21kX2FkZHJbaV0pCisJCQlpb3BvcnRfdW5tYXAodGhpcy0+Y21kX2FkZHJbaV0pOworCQlpZiAodGhpcy0+Y3RsX2FkZHJbaV0pCisJCQlpb3BvcnRfdW5tYXAodGhpcy0+Y3RsX2FkZHJbaV0pOworCQlpZiAodGhpcy0+Y21kX3BvcnRbaV0pCisJCQlyZWxlYXNlX3JlZ2lvbih0aGlzLT5jbWRfcG9ydFtpXSwgOCk7CisJfQorfQorCitzdGF0aWMgaW50IGF0YV9pbml0X2xlZ2FjeV9wb3J0KHN0cnVjdCBhdGFfcG9ydCAqYXAsCisJCQkJc3RydWN0IGF0YV9sZWdhY3lfZGV2cmVzICpsZWdhY3lfZHIpCit7CisJc3RydWN0IGF0YV9ob3N0ICpob3N0ID0gYXAtPmhvc3Q7CisJaW50IHBvcnRfbm8gPSBhcC0+cG9ydF9ubzsKKwl1bnNpZ25lZCBsb25nIGNtZF9wb3J0LCBjdGxfcG9ydDsKKworCWlmIChwb3J0X25vID09IDApIHsKKwkJY21kX3BvcnQgPSBBVEFfUFJJTUFSWV9DTUQ7CisJCWN0bF9wb3J0ID0gQVRBX1BSSU1BUllfQ1RMOworCX0gZWxzZSB7CisJCWNtZF9wb3J0ID0gQVRBX1NFQ09OREFSWV9DTUQ7CisJCWN0bF9wb3J0ID0gQVRBX1NFQ09OREFSWV9DVEw7CisJfQorCisJLyogcmVxdWVzdCBjbWRfcG9ydCAqLworCWlmIChyZXF1ZXN0X3JlZ2lvbihjbWRfcG9ydCwgOCwgImxpYmF0YSIpKQorCQlsZWdhY3lfZHItPmNtZF9wb3J0W3BvcnRfbm9dID0gY21kX3BvcnQ7CisJZWxzZSB7CisJCWRldl9wcmludGsoS0VSTl9XQVJOSU5HLCBob3N0LT5kZXYsCisJCQkgICAiMHglMGxYIElERSBwb3J0IGJ1c3lcbiIsIGNtZF9wb3J0KTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwkvKiBpb21hcCBjbWQgYW5kIGN0bCBwb3J0cyAqLworCWxlZ2FjeV9kci0+Y21kX2FkZHJbcG9ydF9ub10gPSBpb3BvcnRfbWFwKGNtZF9wb3J0LCA4KTsKKwlsZWdhY3lfZHItPmN0bF9hZGRyW3BvcnRfbm9dID0gaW9wb3J0X21hcChjdGxfcG9ydCwgMSk7CisJaWYgKCFsZWdhY3lfZHItPmNtZF9hZGRyW3BvcnRfbm9dIHx8ICFsZWdhY3lfZHItPmN0bF9hZGRyW3BvcnRfbm9dKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIGluaXQgSU8gYWRkcmVzc2VzICovCisJYXAtPmlvYWRkci5jbWRfYWRkciA9IGxlZ2FjeV9kci0+Y21kX2FkZHJbcG9ydF9ub107CisJYXAtPmlvYWRkci5hbHRzdGF0dXNfYWRkciA9IGxlZ2FjeV9kci0+Y3RsX2FkZHJbcG9ydF9ub107CisJYXAtPmlvYWRkci5jdGxfYWRkciA9IGxlZ2FjeV9kci0+Y3RsX2FkZHJbcG9ydF9ub107CisJYXRhX3N0ZF9wb3J0cygmYXAtPmlvYWRkcik7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKglhdGFfaW5pdF9sZWdhY3lfaG9zdCAtIGFjcXVpcmUgbGVnYWN5IEFUQSByZXNvdXJjZXMgYW5kIGluaXQgQVRBIGhvc3QKKyAqCUBob3N0OiB0YXJnZXQgQVRBIGhvc3QKKyAqCUBsZWdhY3lfbWFzazogb3V0IHBhcmFtZXRlciwgbWFzayBpbmRpY2F0aW5nIHBvcnRzIGlzIGluIGxlZ2FjeSBtb2RlCisgKglAd2FzX2J1c3k6IG91dCBwYXJhbWV0ZXIsIGluZGljYXRlcyB3aGV0aGVyIGFueSBwb3J0IHdhcyBidXN5CisgKgorICoJQWNxdWlyZSBsZWdhY3kgQVRBIHJlc291cmNlcyBmb3IgcG9ydHMuCisgKgorICoJTE9DS0lORzoKKyAqCUluaGVyaXRlZCBmcm9tIGNhbGxpbmcgbGF5ZXIgKG1heSBzbGVlcCkuCisgKgorICoJUkVUVVJOUzoKKyAqCTAgb24gc3VjY2VzcywgLWVycm5vIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludCBhdGFfaW5pdF9sZWdhY3lfaG9zdChzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QsCisJCQkJdW5zaWduZWQgaW50ICpsZWdhY3lfbWFzaywgaW50ICp3YXNfYnVzeSkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpnZGV2ID0gaG9zdC0+ZGV2OworCXN0cnVjdCBhdGFfbGVnYWN5X2RldnJlcyAqbGVnYWN5X2RyOworCWludCBpLCByYzsKKworCWlmICghZGV2cmVzX29wZW5fZ3JvdXAoZ2RldiwgTlVMTCwgR0ZQX0tFUk5FTCkpCisJCXJldHVybiAtRU5PTUVNOworCisJcmMgPSAtRU5PTUVNOworCWxlZ2FjeV9kciA9IGRldnJlc19hbGxvYyhhdGFfbGVnYWN5X3JlbGVhc2UsIHNpemVvZigqbGVnYWN5X2RyKSwKKwkJCQkgR0ZQX0tFUk5FTCk7CisJaWYgKCFsZWdhY3lfZHIpCisJCWdvdG8gZXJyX291dDsKKwlkZXZyZXNfYWRkKGdkZXYsIGxlZ2FjeV9kcik7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCSpsZWdhY3lfbWFzayAmPSB+KDEgPDwgaSk7CisJCXJjID0gYXRhX2luaXRfbGVnYWN5X3BvcnQoaG9zdC0+cG9ydHNbaV0sIGxlZ2FjeV9kcik7CisJCWlmIChyYyA9PSAwKQorCQkJbGVnYWN5X2RyLT5tYXNrIHw9IDEgPDwgaTsKKwkJZWxzZSBpZiAocmMgPT0gLUVCVVNZKQorCQkJKCp3YXNfYnVzeSkrKzsKKwl9CisKKwlpZiAoIWxlZ2FjeV9kci0+bWFzaykKKwkJcmV0dXJuIC1FQlVTWTsKKworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisJCWlmICghKGxlZ2FjeV9kci0+bWFzayAmICgxIDw8IGkpKSkKKwkJCWhvc3QtPnBvcnRzW2ldLT5vcHMgPSAmYXRhX2R1bW15X3BvcnRfb3BzOworCisJKmxlZ2FjeV9tYXNrIHw9IGxlZ2FjeV9kci0+bWFzazsKKworCWRldnJlc19yZW1vdmVfZ3JvdXAoZ2RldiwgTlVMTCk7CisJcmV0dXJuIDA7CisKKyBlcnJfb3V0OgorCWRldnJlc19yZWxlYXNlX2dyb3VwKGdkZXYsIE5VTEwpOworCXJldHVybiByYzsKK30KKworLyoqCisgKglhdGFfcmVxdWVzdF9sZWdhY3lfaXJxcyAtIHJlcXVlc3QgbGVnYWN5IEFUQSBJUlFzCisgKglAaG9zdDogdGFyZ2V0IEFUQSBob3N0CisgKglAaGFuZGxlcjogYXJyYXkgb2YgSVJRIGhhbmRsZXJzCisgKglAaXJxX2ZsYWdzOiBhcnJheSBvZiBJUlEgZmxhZ3MKKyAqCUBkZXZfaWQ6IGFycmF5IG9mIElSUSBkZXZfaWRzCisgKgorICoJUmVxdWVzdCBsZWdhY3kgSVJRcyBmb3Igbm9uLWR1bW15IGxlZ2FjeSBwb3J0cyBpbiBAaG9zdC4gIEFsbAorICoJSVJRIHBhcmFtZXRlcnMgYXJlIHBhc3NlZCBhcyBhcnJheSB0byBhbGxvdyBwb3J0cyB0byBoYXZlCisgKglzZXBhcmF0ZSBJUlEgaGFuZGxlcnMuCisgKgorICoJTE9DS0lORzoKKyAqCUluaGVyaXRlZCBmcm9tIGNhbGxpbmcgbGF5ZXIgKG1heSBzbGVlcCkuCisgKgorICoJUkVUVVJOUzoKKyAqCTAgb24gc3VjY2VzcywgLWVycm5vIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludCBhdGFfcmVxdWVzdF9sZWdhY3lfaXJxcyhzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QsCisJCQkJICAgaXJxX2hhbmRsZXJfdCBjb25zdCAqaGFuZGxlciwKKwkJCQkgICBjb25zdCB1bnNpZ25lZCBpbnQgKmlycV9mbGFncywKKwkJCQkgICB2b2lkICogY29uc3QgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpnZGV2ID0gaG9zdC0+ZGV2OworCXN0cnVjdCBhdGFfbGVnYWN5X2RldnJlcyAqbGVnYWN5X2RyOworCWludCBpLCByYzsKKworCWxlZ2FjeV9kciA9IGRldnJlc19maW5kKGhvc3QtPmRldiwgYXRhX2xlZ2FjeV9yZWxlYXNlLCBOVUxMLCBOVUxMKTsKKwlCVUdfT04oIWxlZ2FjeV9kcik7CisKKwlmb3IgKGkgPSAwOyBpIDwgaG9zdC0+bl9wb3J0czsgaSsrKSB7CisJCXVuc2lnbmVkIGludCBpcnE7CisKKwkJLyogRklYTUU6IEFUQV8qX0lSUSgpIHNob3VsZCB0YWtlIGdlbmVyaWMgZGV2aWNlIG5vdCBwY2lfZGV2ICovCisJCWlmIChpID09IDApCisJCQlpcnEgPSBBVEFfUFJJTUFSWV9JUlEodG9fcGNpX2RldihnZGV2KSk7CiAJCWVsc2UKLQkJCXByb2JlX2VudC0+aXJxID0gQVRBX1NFQ09OREFSWV9JUlEocGRldik7Ci0JCXByb2JlX2VudC0+cG9ydFsxXS5jbWRfYWRkciA9IGlvbWFwWzJdOwotCQlwcm9iZV9lbnQtPnBvcnRbMV0uYWx0c3RhdHVzX2FkZHIgPQotCQlwcm9iZV9lbnQtPnBvcnRbMV0uY3RsX2FkZHIgPSBpb21hcFszXTsKLQkJaWYgKGJtZG1hKSB7Ci0JCQlwcm9iZV9lbnQtPnBvcnRbMV0uYm1kbWFfYWRkciA9IGJtZG1hICsgODsKLQkJCWlmICgoIShwb3J0WzFdLT5mbGFncyAmIEFUQV9GTEFHX0lHTl9TSU1QTEVYKSkgJiYKLQkJCSAgICAoaW9yZWFkOChibWRtYSArIDEwKSAmIDB4ODApKQotCQkJCXByb2JlX2VudC0+X2hvc3RfZmxhZ3MgfD0gQVRBX0hPU1RfU0lNUExFWDsKKwkJCWlycSA9IEFUQV9TRUNPTkRBUllfSVJRKHRvX3BjaV9kZXYoZ2RldikpOworCisJCWlmICghKGxlZ2FjeV9kci0+bWFzayAmICgxIDw8IGkpKSkKKwkJCWNvbnRpbnVlOworCisJCWlmICghaGFuZGxlcltpXSkgeworCQkJZGV2X3ByaW50ayhLRVJOX0VSUiwgZ2RldiwKKwkJCQkgICAiTlVMTCBoYW5kbGVyIHNwZWNpZmllZCBmb3IgcG9ydCAlZFxuIiwgaSk7CisJCQlyYyA9IC1FSU5WQUw7CisJCQlnb3RvIGVycl9vdXQ7CiAJCX0KLQkJYXRhX3N0ZF9wb3J0cygmcHJvYmVfZW50LT5wb3J0WzFdKTsKIAotCQkvKiBGSVhNRTogY291bGQgYmUgcG9pbnRpbmcgdG8gc3RhY2sgYXJlYTsgbXVzdCBjb3B5ICovCi0JCXByb2JlX2VudC0+cGluZm8yID0gcG9ydFsxXTsKLQl9IGVsc2UKLQkJcHJvYmVfZW50LT5kdW1teV9wb3J0X21hc2sgfD0gQVRBX1BPUlRfU0VDT05EQVJZOworCQlyYyA9IHJlcXVlc3RfaXJxKGlycSwgaGFuZGxlcltpXSwgaXJxX2ZsYWdzW2ldLCBEUlZfTkFNRSwKKwkJCQkgZGV2X2lkW2ldKTsKKwkJaWYgKHJjKSB7CisJCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCBnZGV2LAorCQkJCSJpcnEgJXUgcmVxdWVzdCBmYWlsZWQgKGVycm5vPSVkKVxuIiwgaXJxLCByYyk7CisJCQlnb3RvIGVycl9vdXQ7CisJCX0KIAotCXJldHVybiBwcm9iZV9lbnQ7CisJCS8qIHJlY29yZCBpcnEgYWxsb2NhdGlvbiBpbiBsZWdhY3lfZHIgKi8KKwkJbGVnYWN5X2RyLT5pcnFbaV0gPSBpcnE7CisJCWxlZ2FjeV9kci0+aXJxX2Rldl9pZFtpXSA9IGRldl9pZFtpXTsKKworCQkvKiBvbmx5IHVzZWQgdG8gcHJpbnQgaW5mbyAqLworCQlpZiAoaSA9PSAwKQorCQkJaG9zdC0+aXJxID0gaXJxOworCQllbHNlCisJCQlob3N0LT5pcnEyID0gaXJxOworCX0KKworCXJldHVybiAwOworCisgZXJyX291dDoKKwlhdGFfbGVnYWN5X2ZyZWVfaXJxcyhsZWdhY3lfZHIpOworCXJldHVybiByYzsKIH0KIAotCiAvKioKICAqCWF0YV9wY2lfaW5pdF9vbmUgLSBJbml0aWFsaXplL3JlZ2lzdGVyIFBDSSBJREUgaG9zdCBjb250cm9sbGVyCiAgKglAcGRldjogQ29udHJvbGxlciB0byBiZSBpbml0aWFsaXplZApAQCAtNzE4LDggKzk0OSw4IEBACiAJCSAgICAgIHVuc2lnbmVkIGludCBuX3BvcnRzKQogewogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7Ci0Jc3RydWN0IGF0YV9wcm9iZV9lbnQgKnByb2JlX2VudCA9IE5VTEw7Ci0Jc3RydWN0IGF0YV9wb3J0X2luZm8gKnBvcnRbMl07CisJc3RydWN0IGF0YV9ob3N0ICpob3N0ID0gTlVMTDsKKwljb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqcG9ydFsyXTsKIAl1OCBtYXNrOwogCXVuc2lnbmVkIGludCBsZWdhY3lfbW9kZSA9IDA7CiAJaW50IHJjOwpAQCAtNzMyLDEwICs5NjMsNyBAQAogCUJVR19PTihuX3BvcnRzIDwgMSB8fCBuX3BvcnRzID4gMik7CiAKIAlwb3J0WzBdID0gcG9ydF9pbmZvWzBdOwotCWlmIChuX3BvcnRzID4gMSkKLQkJcG9ydFsxXSA9IHBvcnRfaW5mb1sxXTsKLQllbHNlCi0JCXBvcnRbMV0gPSBwb3J0WzBdOworCXBvcnRbMV0gPSAobl9wb3J0cyA+IDEpID8gcG9ydF9pbmZvWzFdIDogTlVMTDsKIAogCS8qIEZJWE1FOiBSZWFsbHkgZm9yIEFUQSBpdCBpc24ndCBzYWZlIGJlY2F1c2UgdGhlIGRldmljZSBtYXkgYmUKIAkgICBtdWx0aS1wdXJwb3NlIGFuZCB3ZSB3YW50IHRvIGxlYXZlIGl0IGFsb25lIGlmIGl0IHdhcyBhbHJlYWR5CkBAIC03NDMsNyArOTcxLDcgQEAKIAogCSAgIENoZWNraW5nIGRldi0+aXNfZW5hYmxlZCBpcyBpbnN1ZmZpY2llbnQgYXMgdGhpcyBpcyBub3Qgc2V0IGF0CiAJICAgYm9vdCBmb3IgdGhlIHByaW1hcnkgdmlkZW8gd2hpY2ggaXMgQklPUyBlbmFibGVkCi0gICAgICAgICAqLworCSAgKi8KIAogCXJjID0gcGNpbV9lbmFibGVfZGV2aWNlKHBkZXYpOwogCWlmIChyYykKQEAgLTc2OSw5NiArOTk3LDY4IEBACiAjZW5kaWYKIAl9CiAKLQlpZiAoIWxlZ2FjeV9tb2RlKSB7Ci0JCXJjID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCBEUlZfTkFNRSk7Ci0JCWlmIChyYykgewotCQkJcGNpbV9waW5fZGV2aWNlKHBkZXYpOwotCQkJZ290byBlcnJfb3V0OwotCQl9Ci0JfSBlbHNlIHsKLQkJLyogRGVhbCB3aXRoIGNvbWJpbmVkIG1vZGUgaGFjay4gVGhpcyBzaWRlIG9mIHRoZSBsb2dpYyBhbGwKLQkJICAgZ29lcyBhd2F5IG9uY2UgdGhlIGNvbWJpbmVkIG1vZGUgaGFjayBpcyBraWxsZWQgaW4gMi42LjIxICovCi0JCWlmICghZGV2bV9yZXF1ZXN0X3JlZ2lvbihkZXYsIEFUQV9QUklNQVJZX0NNRCwgOCwgImxpYmF0YSIpKSB7Ci0JCQlzdHJ1Y3QgcmVzb3VyY2UgKmNvbmZsaWN0LCByZXM7Ci0JCQlyZXMuc3RhcnQgPSBBVEFfUFJJTUFSWV9DTUQ7Ci0JCQlyZXMuZW5kID0gQVRBX1BSSU1BUllfQ01EICsgOCAtIDE7Ci0JCQljb25mbGljdCA9IF9fX19yZXF1ZXN0X3Jlc291cmNlKCZpb3BvcnRfcmVzb3VyY2UsICZyZXMpOwotCQkJd2hpbGUgKGNvbmZsaWN0LT5jaGlsZCkKLQkJCQljb25mbGljdCA9IF9fX19yZXF1ZXN0X3Jlc291cmNlKGNvbmZsaWN0LCAmcmVzKTsKLQkJCWlmICghc3RyY21wKGNvbmZsaWN0LT5uYW1lLCAibGliYXRhIikpCi0JCQkJbGVnYWN5X21vZGUgfD0gQVRBX1BPUlRfUFJJTUFSWTsKLQkJCWVsc2UgewotCQkJCXBjaW1fcGluX2RldmljZShwZGV2KTsKLQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJhdGE6IDB4JTBYIElERSBwb3J0IGJ1c3lcbiIgXAotCQkJCQkJICAgICJhdGE6IGNvbmZsaWN0IHdpdGggJXNcbiIsCi0JCQkJCQkgICAgQVRBX1BSSU1BUllfQ01ELAotCQkJCQkJICAgIGNvbmZsaWN0LT5uYW1lKTsKLQkJCX0KLQkJfSBlbHNlCi0JCQlsZWdhY3lfbW9kZSB8PSBBVEFfUE9SVF9QUklNQVJZOwotCi0JCWlmICghZGV2bV9yZXF1ZXN0X3JlZ2lvbihkZXYsIEFUQV9TRUNPTkRBUllfQ01ELCA4LCAibGliYXRhIikpIHsKLQkJCXN0cnVjdCByZXNvdXJjZSAqY29uZmxpY3QsIHJlczsKLQkJCXJlcy5zdGFydCA9IEFUQV9TRUNPTkRBUllfQ01EOwotCQkJcmVzLmVuZCA9IEFUQV9TRUNPTkRBUllfQ01EICsgOCAtIDE7Ci0JCQljb25mbGljdCA9IF9fX19yZXF1ZXN0X3Jlc291cmNlKCZpb3BvcnRfcmVzb3VyY2UsICZyZXMpOwotCQkJd2hpbGUgKGNvbmZsaWN0LT5jaGlsZCkKLQkJCQljb25mbGljdCA9IF9fX19yZXF1ZXN0X3Jlc291cmNlKGNvbmZsaWN0LCAmcmVzKTsKLQkJCWlmICghc3RyY21wKGNvbmZsaWN0LT5uYW1lLCAibGliYXRhIikpCi0JCQkJbGVnYWN5X21vZGUgfD0gQVRBX1BPUlRfU0VDT05EQVJZOwotCQkJZWxzZSB7Ci0JCQkJcGNpbV9waW5fZGV2aWNlKHBkZXYpOwotCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImF0YTogMHglWCBJREUgcG9ydCBidXN5XG4iIFwKLQkJCQkJCSAgICAiYXRhOiBjb25mbGljdCB3aXRoICVzXG4iLAotCQkJCQkJICAgIEFUQV9TRUNPTkRBUllfQ01ELAotCQkJCQkJICAgIGNvbmZsaWN0LT5uYW1lKTsKLQkJCX0KLQkJfSBlbHNlCi0JCQlsZWdhY3lfbW9kZSB8PSBBVEFfUE9SVF9TRUNPTkRBUlk7Ci0KLQkJaWYgKGxlZ2FjeV9tb2RlICYgQVRBX1BPUlRfUFJJTUFSWSkKLQkJCXBjaV9yZXF1ZXN0X3JlZ2lvbihwZGV2LCAxLCBEUlZfTkFNRSk7Ci0JCWlmIChsZWdhY3lfbW9kZSAmIEFUQV9QT1JUX1NFQ09OREFSWSkKLQkJCXBjaV9yZXF1ZXN0X3JlZ2lvbihwZGV2LCAzLCBEUlZfTkFNRSk7Ci0JCS8qIElmIHRoZXJlIGlzIGEgRE1BIHJlc291cmNlLCBhbGxvY2F0ZSBpdCAqLwotCQlwY2lfcmVxdWVzdF9yZWdpb24ocGRldiwgNCwgRFJWX05BTUUpOwotCX0KLQotCS8qIHdlIGhhdmUgbGVnYWN5IG1vZGUsIGJ1dCBhbGwgcG9ydHMgYXJlIHVuYXZhaWxhYmxlICovCi0JaWYgKGxlZ2FjeV9tb2RlID09ICgxIDw8IDMpKSB7Ci0JCXJjID0gLUVCVVNZOwotCQlnb3RvIGVycl9vdXQ7Ci0JfQotCi0JLyogVE9ETzogSWYgd2UgZ2V0IG5vIERNQSBtYXNrIHdlIHNob3VsZCBmYWxsIGJhY2sgdG8gUElPICovCi0JcmMgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIEFUQV9ETUFfTUFTSyk7Ci0JaWYgKHJjKQotCQlnb3RvIGVycl9vdXQ7Ci0JcmMgPSBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgQVRBX0RNQV9NQVNLKTsKLQlpZiAocmMpCi0JCWdvdG8gZXJyX291dDsKLQotCWlmIChsZWdhY3lfbW9kZSkgewotCQlwcm9iZV9lbnQgPSBhdGFfcGNpX2luaXRfbGVnYWN5X3BvcnQocGRldiwgcG9ydCwgbGVnYWN5X21vZGUpOwotCX0gZWxzZSB7Ci0JCWlmIChuX3BvcnRzID09IDIpCi0JCQlwcm9iZV9lbnQgPSBhdGFfcGNpX2luaXRfbmF0aXZlX21vZGUocGRldiwgcG9ydCwgQVRBX1BPUlRfUFJJTUFSWSB8IEFUQV9QT1JUX1NFQ09OREFSWSk7Ci0JCWVsc2UKLQkJCXByb2JlX2VudCA9IGF0YV9wY2lfaW5pdF9uYXRpdmVfbW9kZShwZGV2LCBwb3J0LCBBVEFfUE9SVF9QUklNQVJZKTsKLQl9Ci0JaWYgKCFwcm9iZV9lbnQpIHsKKwkvKiBhbGxvYyBhbmQgaW5pdCBob3N0ICovCisJaG9zdCA9IGF0YV9ob3N0X2FsbG9jX3BpbmZvKGRldiwgcG9ydCwgbl9wb3J0cyk7CisJaWYgKCFob3N0KSB7CisJCWRldl9wcmludGsoS0VSTl9FUlIsICZwZGV2LT5kZXYsCisJCQkgICAiZmFpbGVkIHRvIGFsbG9jYXRlIEFUQSBob3N0XG4iKTsKIAkJcmMgPSAtRU5PTUVNOwogCQlnb3RvIGVycl9vdXQ7CiAJfQogCi0JcGNpX3NldF9tYXN0ZXIocGRldik7CisJaWYgKCFsZWdhY3lfbW9kZSkgeworCQl1bnNpZ25lZCBpbnQgcG9ydF9tYXNrOwogCi0JaWYgKCFhdGFfZGV2aWNlX2FkZChwcm9iZV9lbnQpKSB7Ci0JCXJjID0gLUVOT0RFVjsKLQkJZ290byBlcnJfb3V0OworCQlwb3J0X21hc2sgPSBBVEFfUE9SVF9QUklNQVJZOworCQlpZiAobl9wb3J0cyA+IDEpCisJCQlwb3J0X21hc2sgfD0gQVRBX1BPUlRfU0VDT05EQVJZOworCisJCXJjID0gYXRhX3BjaV9pbml0X25hdGl2ZV9ob3N0KGhvc3QsIHBvcnRfbWFzayk7CisJCWlmIChyYykKKwkJCWdvdG8gZXJyX291dDsKKwl9IGVsc2UgeworCQlpbnQgd2FzX2J1c3kgPSAwOworCisJCXJjID0gYXRhX2luaXRfbGVnYWN5X2hvc3QoaG9zdCwgJmxlZ2FjeV9tb2RlLCAmd2FzX2J1c3kpOworCQlpZiAod2FzX2J1c3kpCisJCQlwY2ltX3Bpbl9kZXZpY2UocGRldik7CisJCWlmIChyYykKKwkJCWdvdG8gZXJyX291dDsKKworCQkvKiByZXF1ZXN0IHJlc3BlY3RpdmUgUENJIHJlZ2lvbnMsIG1heSBmYWlsICovCisJCXJjID0gcGNpX3JlcXVlc3RfcmVnaW9uKHBkZXYsIDEsIERSVl9OQU1FKTsKKwkJcmMgPSBwY2lfcmVxdWVzdF9yZWdpb24ocGRldiwgMywgRFJWX05BTUUpOwogCX0KIAotCWRldm1fa2ZyZWUoZGV2LCBwcm9iZV9lbnQpOworCS8qIGluaXQgQk1ETUEsIG1heSBmYWlsICovCisJYXRhX3BjaV9pbml0X2JtZG1hKGhvc3QpOworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCisJLyogc3RhcnQgaG9zdCBhbmQgcmVxdWVzdCBJUlEgKi8KKwlyYyA9IGF0YV9ob3N0X3N0YXJ0KGhvc3QpOworCWlmIChyYykKKwkJZ290byBlcnJfb3V0OworCisJaWYgKCFsZWdhY3lfbW9kZSkKKwkJcmMgPSBkZXZtX3JlcXVlc3RfaXJxKGRldiwgcGRldi0+aXJxLAorCQkJCSAgICAgIHBvcnRfaW5mb1swXS0+cG9ydF9vcHMtPmlycV9oYW5kbGVyLAorCQkJCSAgICAgIElSUUZfU0hBUkVELCBEUlZfTkFNRSwgaG9zdCk7CisJZWxzZSB7CisJCWlycV9oYW5kbGVyX3QgaGFuZGxlclsyXSA9IHsgaG9zdC0+b3BzLT5pcnFfaGFuZGxlciwKKwkJCQkJICAgICBob3N0LT5vcHMtPmlycV9oYW5kbGVyIH07CisJCXVuc2lnbmVkIGludCBpcnFfZmxhZ3NbMl0gPSB7IElSUUZfU0hBUkVELCBJUlFGX1NIQVJFRCB9OworCQl2b2lkICpkZXZfaWRbMl0gPSB7IGhvc3QsIGhvc3QgfTsKKworCQlyYyA9IGF0YV9yZXF1ZXN0X2xlZ2FjeV9pcnFzKGhvc3QsIGhhbmRsZXIsIGlycV9mbGFncywgZGV2X2lkKTsKKwl9CisJaWYgKHJjKQorCQlnb3RvIGVycl9vdXQ7CisKKwkvKiByZWdpc3RlciAqLworCXJjID0gYXRhX2hvc3RfcmVnaXN0ZXIoaG9zdCwgcG9ydF9pbmZvWzBdLT5zaHQpOworCWlmIChyYykKKwkJZ290byBlcnJfb3V0OworCiAJZGV2cmVzX3JlbW92ZV9ncm91cChkZXYsIE5VTEwpOwogCXJldHVybiAwOwogCkBAIC04OTMsMTIgKzEwOTMsMTIgQEAKIAlyZXR1cm4gMDsKIH0KIAotdW5zaWduZWQgbG9uZyBhdGFfcGNpX2RlZmF1bHRfZmlsdGVyKGNvbnN0IHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfZGV2aWNlICphZGV2LCB1bnNpZ25lZCBsb25nIHhmZXJfbWFzaykKK3Vuc2lnbmVkIGxvbmcgYXRhX3BjaV9kZWZhdWx0X2ZpbHRlcihzdHJ1Y3QgYXRhX2RldmljZSAqYWRldiwgdW5zaWduZWQgbG9uZyB4ZmVyX21hc2spCiB7CiAJLyogRmlsdGVyIG91dCBETUEgbW9kZXMgaWYgdGhlIGRldmljZSBoYXMgYmVlbiBjb25maWd1cmVkIGJ5CiAJICAgdGhlIEJJT1MgYXMgUElPIG9ubHkgKi8KIAotCWlmIChhcC0+aW9hZGRyLmJtZG1hX2FkZHIgPT0gMCkKKwlpZiAoYWRldi0+YXAtPmlvYWRkci5ibWRtYV9hZGRyID09IDApCiAJCXhmZXJfbWFzayAmPSB+KEFUQV9NQVNLX01XRE1BIHwgQVRBX01BU0tfVURNQSk7CiAJcmV0dXJuIHhmZXJfbWFzazsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL2xpYmF0YS5oIGIvZHJpdmVycy9hdGEvbGliYXRhLmgKaW5kZXggMWYxZTNhNS4uNWY0ZDQwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvbGliYXRhLmgKKysrIGIvZHJpdmVycy9hdGEvbGliYXRhLmgKQEAgLTUyLDYgKzUyLDcgQEAKIAlBVEFfRE5YRkVSX1FVSUVUCT0gKDEgPDwgMzEpLAogfTsKIAorZXh0ZXJuIHVuc2lnbmVkIGludCBhdGFfcHJpbnRfaWQ7CiBleHRlcm4gc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmF0YV9hdXhfd3E7CiBleHRlcm4gaW50IGF0YXBpX2VuYWJsZWQ7CiBleHRlcm4gaW50IGF0YXBpX2RtYWRpcjsKQEAgLTkyLDEwICs5Myw3IEBACiBleHRlcm4gdm9pZCBhdGFfZGV2X2luaXQoc3RydWN0IGF0YV9kZXZpY2UgKmRldik7CiBleHRlcm4gaW50IGF0YV90YXNrX2lvY3RsKHN0cnVjdCBzY3NpX2RldmljZSAqc2NzaWRldiwgdm9pZCBfX3VzZXIgKmFyZyk7CiBleHRlcm4gaW50IGF0YV9jbWRfaW9jdGwoc3RydWN0IHNjc2lfZGV2aWNlICpzY3NpZGV2LCB2b2lkIF9fdXNlciAqYXJnKTsKLWV4dGVybiB2b2lkIGF0YV9wb3J0X2luaXQoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV9ob3N0ICpob3N0LAotCQkJICBjb25zdCBzdHJ1Y3QgYXRhX3Byb2JlX2VudCAqZW50LCB1bnNpZ25lZCBpbnQgcG9ydF9ubyk7Ci1leHRlcm4gc3RydWN0IGF0YV9wcm9iZV9lbnQgKmF0YV9wcm9iZV9lbnRfYWxsb2Moc3RydWN0IGRldmljZSAqZGV2LAotCQkJCQkJIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvICpwb3J0KTsKK2V4dGVybiBzdHJ1Y3QgYXRhX3BvcnQgKmF0YV9wb3J0X2FsbG9jKHN0cnVjdCBhdGFfaG9zdCAqaG9zdCk7CiAKIC8qIGxpYmF0YS1hY3BpLmMgKi8KICNpZmRlZiBDT05GSUdfU0FUQV9BQ1BJCkBAIC0xMTMsOCArMTExLDggQEAKICNlbmRpZgogCiAvKiBsaWJhdGEtc2NzaS5jICovCi1leHRlcm4gc3RydWN0IHNjc2lfdHJhbnNwb3J0X3RlbXBsYXRlIGF0YV9zY3NpX3RyYW5zcG9ydF90ZW1wbGF0ZTsKLQorZXh0ZXJuIGludCBhdGFfc2NzaV9hZGRfaG9zdHMoc3RydWN0IGF0YV9ob3N0ICpob3N0LAorCQkJICAgICAgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqc2h0KTsKIGV4dGVybiB2b2lkIGF0YV9zY3NpX3NjYW5faG9zdChzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKIGV4dGVybiBpbnQgYXRhX3Njc2lfb2ZmbGluZV9kZXYoc3RydWN0IGF0YV9kZXZpY2UgKmRldik7CiBleHRlcm4gdm9pZCBhdGFfc2NzaV9ob3RwbHVnKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX2FsaS5jIGIvZHJpdmVycy9hdGEvcGF0YV9hbGkuYwppbmRleCAxMWVhNTUyLi5kNDBlZGViIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX2FsaS5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfYWxpLmMKQEAgLTM0LDcgKzM0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kbWkuaD4KIAogI2RlZmluZSBEUlZfTkFNRSAicGF0YV9hbGkiCi0jZGVmaW5lIERSVl9WRVJTSU9OICIwLjcuMyIKKyNkZWZpbmUgRFJWX1ZFUlNJT04gIjAuNy40IgogCiAvKgogICoJQ2FibGUgc3BlY2lhbCBjYXNlcwpAQCAtOTAsNTkgKzkwLDYgQEAKIH0KIAogLyoqCi0gKglhbGlfZWFybHlfZXJyb3JfaGFuZGxlcgktCXJlc2V0IGZvciBlYXJ5IGNoaXAKLSAqCUBhcDogQVRBIHBvcnQKLSAqCi0gKglIYW5kbGUgdGhlIHJlc2V0IGNhbGxiYWNrIGZvciB0aGUgbGF0ZXIgY2hpcHMgd2l0aCBjYWJsZSBkZXRlY3QKLSAqLwotCi1zdGF0aWMgaW50IGFsaV9jMl9wcmVfcmVzZXQoc3RydWN0IGF0YV9wb3J0ICphcCkKLXsKLQlhcC0+Y2JsID0gYWxpX2MyX2NhYmxlX2RldGVjdChhcCk7Ci0JcmV0dXJuIGF0YV9zdGRfcHJlcmVzZXQoYXApOwotfQotCi1zdGF0aWMgdm9pZCBhbGlfYzJfZXJyb3JfaGFuZGxlcihzdHJ1Y3QgYXRhX3BvcnQgKmFwKQotewotCWF0YV9ibWRtYV9kcml2ZV9laChhcCwgYWxpX2MyX3ByZV9yZXNldCwKLQkJCSAgICAgICBhdGFfc3RkX3NvZnRyZXNldCwgTlVMTCwKLQkJCSAgICAgICBhdGFfc3RkX3Bvc3RyZXNldCk7Ci19Ci0KLS8qKgotICoJYWxpX2Vhcmx5X2NhYmxlX2RldGVjdAktCWNhYmxlIGRldGVjdGlvbgotICoJQGFwOiBBVEEgcG9ydAotICoKLSAqCVBlcmZvcm0gY2FibGUgZGV0ZWN0aW9uIGZvciBvbGRlciBjaGlwc2V0cy4gVGhpcyB0dXJucyBvdXQgdG8gYmUKLSAqCXJhdGhlciBlYXN5IHRvIGltcGxlbWVudAotICovCi0KLXN0YXRpYyBpbnQgYWxpX2Vhcmx5X2NhYmxlX2RldGVjdChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQotewotCXJldHVybiBBVEFfQ0JMX1BBVEE0MDsKLX0KLQotLyoqCi0gKglhbGlfZWFybHlfcHJvYmVfaW5pdAktCXJlc2V0IGZvciBlYXJseSBjaGlwCi0gKglAYXA6IEFUQSBwb3J0Ci0gKgotICoJSGFuZGxlIHRoZSByZXNldCBjYWxsYmFjayBmb3IgdGhlIGVhcmx5IChwcmUgY2FibGUgZGV0ZWN0KSBjaGlwcy4KLSAqLwotCi1zdGF0aWMgaW50IGFsaV9lYXJseV9wcmVfcmVzZXQoc3RydWN0IGF0YV9wb3J0ICphcCkKLXsKLQlhcC0+Y2JsID0gYWxpX2Vhcmx5X2NhYmxlX2RldGVjdChhcCk7Ci0JcmV0dXJuIGF0YV9zdGRfcHJlcmVzZXQoYXApOwotfQotCi1zdGF0aWMgdm9pZCBhbGlfZWFybHlfZXJyb3JfaGFuZGxlcihzdHJ1Y3QgYXRhX3BvcnQgKmFwKQotewotCXJldHVybiBhdGFfYm1kbWFfZHJpdmVfZWgoYXAsIGFsaV9lYXJseV9wcmVfcmVzZXQsCi0JCQkJICAgICBhdGFfc3RkX3NvZnRyZXNldCwgTlVMTCwKLQkJCQkgICAgIGF0YV9zdGRfcG9zdHJlc2V0KTsKLX0KLQotLyoqCiAgKglhbGlfMjBfZmlsdGVyCQktCWZpbHRlciBmb3IgZWFybGllciBBTEkgRE1BCiAgKglAYXA6IEFMaSBBVEEgcG9ydAogICoJQGFkZXY6IGF0dGFjaGVkIGRldmljZQpAQCAtMTUxLDcgKzk4LDcgQEAKICAqCWZpeCB0aGF0IGxhdGVyIG9uLiBBbHNvIGVuc3VyZSB3ZSBkbyBub3QgZG8gVURNQSBvbiBXREMgZHJpdmVzCiAgKi8KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgYWxpXzIwX2ZpbHRlcihjb25zdCBzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX2RldmljZSAqYWRldiwgdW5zaWduZWQgbG9uZyBtYXNrKQorc3RhdGljIHVuc2lnbmVkIGxvbmcgYWxpXzIwX2ZpbHRlcihzdHJ1Y3QgYXRhX2RldmljZSAqYWRldiwgdW5zaWduZWQgbG9uZyBtYXNrKQogewogCWNoYXIgbW9kZWxfbnVtW0FUQV9JRF9QUk9EX0xFTiArIDFdOwogCS8qIE5vIERNQSBvbiBhbnl0aGluZyBidXQgYSBkaXNrIGZvciBub3cgKi8KQEAgLTE2MCw3ICsxMDcsNyBAQAogCWF0YV9pZF9jX3N0cmluZyhhZGV2LT5pZCwgbW9kZWxfbnVtLCBBVEFfSURfUFJPRCwgc2l6ZW9mKG1vZGVsX251bSkpOwogCWlmIChzdHJzdHIobW9kZWxfbnVtLCAiV0RDIikpCiAJCXJldHVybiBtYXNrICY9IH5BVEFfTUFTS19VRE1BOwotCXJldHVybiBhdGFfcGNpX2RlZmF1bHRfZmlsdGVyKGFwLCBhZGV2LCBtYXNrKTsKKwlyZXR1cm4gYXRhX3BjaV9kZWZhdWx0X2ZpbHRlcihhZGV2LCBtYXNrKTsKIH0KIAogLyoqCkBAIC0zMTQsNyArMjYxLDYgQEAKIAogLyoqCiAgKglhbGlfbG9ja19zZWN0b3JzCS0JS2VlcCBvbGRlciBkZXZpY2VzIHRvIDI1NSBzZWN0b3IgbW9kZQotICoJQGFwOiBBVEEgcG9ydAogICoJQGFkZXY6IERldmljZQogICoKICAqCUNhbGxlZCBkdXJpbmcgdGhlIGJ1cyBwcm9iZSBmb3IgZWFjaCBkZXZpY2UgdGhhdCBpcyBmb3VuZC4gV2UgdXNlCkBAIC0zMjQsNyArMjcwLDcgQEAKICAqCXNsb3dlciBQSU8gbWV0aG9kcwogICovCiAKLXN0YXRpYyB2b2lkIGFsaV9sb2NrX3NlY3RvcnMoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV9kZXZpY2UgKmFkZXYpCitzdGF0aWMgdm9pZCBhbGlfbG9ja19zZWN0b3JzKHN0cnVjdCBhdGFfZGV2aWNlICphZGV2KQogewogCWFkZXYtPm1heF9zZWN0b3JzID0gMjU1OwogfQpAQCAtMzY2LDggKzMxMiw5IEBACiAKIAkuZnJlZXplCQk9IGF0YV9ibWRtYV9mcmVlemUsCiAJLnRoYXcJCT0gYXRhX2JtZG1hX3RoYXcsCi0JLmVycm9yX2hhbmRsZXIJPSBhbGlfZWFybHlfZXJyb3JfaGFuZGxlciwKKwkuZXJyb3JfaGFuZGxlcgk9IGF0YV9ibWRtYV9lcnJvcl9oYW5kbGVyLAogCS5wb3N0X2ludGVybmFsX2NtZCA9IGF0YV9ibWRtYV9wb3N0X2ludGVybmFsX2NtZCwKKwkuY2FibGVfZGV0ZWN0CT0gYXRhX2NhYmxlXzQwd2lyZSwKIAogCS5xY19wcmVwIAk9IGF0YV9xY19wcmVwLAogCS5xY19pc3N1ZQk9IGF0YV9xY19pc3N1ZV9wcm90LApAQCAtNDAyLDggKzM0OSw5IEBACiAKIAkuZnJlZXplCQk9IGF0YV9ibWRtYV9mcmVlemUsCiAJLnRoYXcJCT0gYXRhX2JtZG1hX3RoYXcsCi0JLmVycm9yX2hhbmRsZXIJPSBhbGlfZWFybHlfZXJyb3JfaGFuZGxlciwKKwkuZXJyb3JfaGFuZGxlcgk9IGF0YV9ibWRtYV9lcnJvcl9oYW5kbGVyLAogCS5wb3N0X2ludGVybmFsX2NtZCA9IGF0YV9ibWRtYV9wb3N0X2ludGVybmFsX2NtZCwKKwkuY2FibGVfZGV0ZWN0CT0gYXRhX2NhYmxlXzQwd2lyZSwKIAogCS5ibWRtYV9zZXR1cCAJPSBhdGFfYm1kbWFfc2V0dXAsCiAJLmJtZG1hX3N0YXJ0IAk9IGF0YV9ibWRtYV9zdGFydCwKQEAgLTQ0MCw4ICszODgsOSBAQAogCiAJLmZyZWV6ZQkJPSBhdGFfYm1kbWFfZnJlZXplLAogCS50aGF3CQk9IGF0YV9ibWRtYV90aGF3LAotCS5lcnJvcl9oYW5kbGVyCT0gYWxpX2MyX2Vycm9yX2hhbmRsZXIsCisJLmVycm9yX2hhbmRsZXIJPSBhdGFfYm1kbWFfZXJyb3JfaGFuZGxlciwKIAkucG9zdF9pbnRlcm5hbF9jbWQgPSBhdGFfYm1kbWFfcG9zdF9pbnRlcm5hbF9jbWQsCisJLmNhYmxlX2RldGVjdAk9IGFsaV9jMl9jYWJsZV9kZXRlY3QsCiAKIAkuYm1kbWFfc2V0dXAgCT0gYXRhX2JtZG1hX3NldHVwLAogCS5ibWRtYV9zdGFydCAJPSBhdGFfYm1kbWFfc3RhcnQsCkBAIC00NzcsOCArNDI2LDkgQEAKIAogCS5mcmVlemUJCT0gYXRhX2JtZG1hX2ZyZWV6ZSwKIAkudGhhdwkJPSBhdGFfYm1kbWFfdGhhdywKLQkuZXJyb3JfaGFuZGxlcgk9IGFsaV9jMl9lcnJvcl9oYW5kbGVyLAorCS5lcnJvcl9oYW5kbGVyCT0gYXRhX2JtZG1hX2Vycm9yX2hhbmRsZXIsCiAJLnBvc3RfaW50ZXJuYWxfY21kID0gYXRhX2JtZG1hX3Bvc3RfaW50ZXJuYWxfY21kLAorCS5jYWJsZV9kZXRlY3QJPSBhbGlfYzJfY2FibGVfZGV0ZWN0LAogCiAJLmJtZG1hX3NldHVwIAk9IGF0YV9ibWRtYV9zZXR1cCwKIAkuYm1kbWFfc3RhcnQgCT0gYXRhX2JtZG1hX3N0YXJ0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9hbWQuYyBiL2RyaXZlcnMvYXRhL3BhdGFfYW1kLmMKaW5kZXggMTgzODE3Ni4uNTM2ZWU4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9hbWQuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX2FtZC5jCkBAIC0yNSw3ICsyNSw3IEBACiAjaW5jbHVkZSA8bGludXgvbGliYXRhLmg+CiAKICNkZWZpbmUgRFJWX05BTUUgInBhdGFfYW1kIgotI2RlZmluZSBEUlZfVkVSU0lPTiAiMC4yLjgiCisjZGVmaW5lIERSVl9WRVJTSU9OICIwLjMuOCIKIAogLyoqCiAgKgl0aW1pbmdfc2V0dXAJCS0Jc2hhcmVkIHRpbWluZyBjb21wdXRhdGlvbiBhbmQgbG9hZApAQCAtMTE5LDMyICsxMTksMjUgQEAKIH0KIAogLyoqCi0gKglhbWRfcHJvYmVfaW5pdAkJLQljYWJsZSBkZXRlY3Rpb24KKyAqCWFtZF9wcm9iZV9pbml0CQktCXBlcmZvcm0gcmVzZXQgaGFuZGxpbmcKICAqCUBhcDogQVRBIHBvcnQKICAqCi0gKglQZXJmb3JtIGNhYmxlIGRldGVjdGlvbi4gVGhlIEJJT1Mgc3RvcmVzIHRoaXMgaW4gUENJIGNvbmZpZwotICoJc3BhY2UgZm9yIHVzLgorICoJUmVzZXQgc2VxdWVuY2UgY2hlY2tpbmcgZW5hYmxlIGJpdHMgdG8gc2VlIHdoaWNoIHBvcnRzIGFyZQorICoJYWN0aXZlLgogICovCiAKIHN0YXRpYyBpbnQgYW1kX3ByZV9yZXNldChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQogewotCXN0YXRpYyBjb25zdCB1MzIgYml0bWFza1syXSA9IHsweDAzLCAweDBDfTsKIAlzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9iaXRzIGFtZF9lbmFibGVfYml0c1tdID0gewogCQl7IDB4NDAsIDEsIDB4MDIsIDB4MDIgfSwKIAkJeyAweDQwLCAxLCAweDAxLCAweDAxIH0KIAl9OwogCiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGFwLT5ob3N0LT5kZXYpOwotCXU4IGF0YTY2OwogCiAJaWYgKCFwY2lfdGVzdF9jb25maWdfYml0cyhwZGV2LCAmYW1kX2VuYWJsZV9iaXRzW2FwLT5wb3J0X25vXSkpCiAJCXJldHVybiAtRU5PRU5UOwogCi0JcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgMHg0MiwgJmF0YTY2KTsKLQlpZiAoYXRhNjYgJiBiaXRtYXNrW2FwLT5wb3J0X25vXSkKLQkJYXAtPmNibCA9IEFUQV9DQkxfUEFUQTgwOwotCWVsc2UKLQkJYXAtPmNibCA9IEFUQV9DQkxfUEFUQTQwOwogCXJldHVybiBhdGFfc3RkX3ByZXJlc2V0KGFwKTsKIAogfQpAQCAtMTU2LDI4ICsxNDksMTYgQEAKIAkJCQkgICAgICBhdGFfc3RkX3Bvc3RyZXNldCk7CiB9CiAKLXN0YXRpYyBpbnQgYW1kX2Vhcmx5X3ByZV9yZXNldChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQorc3RhdGljIGludCBhbWRfY2FibGVfZGV0ZWN0KHN0cnVjdCBhdGFfcG9ydCAqYXApCiB7CisJc3RhdGljIGNvbnN0IHUzMiBiaXRtYXNrWzJdID0gezB4MDMsIDB4MEN9OwogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihhcC0+aG9zdC0+ZGV2KTsKLQlzdGF0aWMgc3RydWN0IHBjaV9iaXRzIGFtZF9lbmFibGVfYml0c1tdID0gewotCQl7IDB4NDAsIDEsIDB4MDIsIDB4MDIgfSwKLQkJeyAweDQwLCAxLCAweDAxLCAweDAxIH0KLQl9OworCXU4IGF0YTY2OwogCi0JaWYgKCFwY2lfdGVzdF9jb25maWdfYml0cyhwZGV2LCAmYW1kX2VuYWJsZV9iaXRzW2FwLT5wb3J0X25vXSkpCi0JCXJldHVybiAtRU5PRU5UOwotCi0JLyogTm8gaG9zdCBzaWRlIGNhYmxlIGRldGVjdGlvbiAqLwotCWFwLT5jYmwgPSBBVEFfQ0JMX1BBVEE4MDsKLQlyZXR1cm4gYXRhX3N0ZF9wcmVyZXNldChhcCk7Ci0KLX0KLQotc3RhdGljIHZvaWQgYW1kX2Vhcmx5X2Vycm9yX2hhbmRsZXIoc3RydWN0IGF0YV9wb3J0ICphcCkKLXsKLQlhdGFfYm1kbWFfZHJpdmVfZWgoYXAsIGFtZF9lYXJseV9wcmVfcmVzZXQsCi0JCQkgICAgICAgYXRhX3N0ZF9zb2Z0cmVzZXQsIE5VTEwsCi0JCQkgICAgICAgYXRhX3N0ZF9wb3N0cmVzZXQpOworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIDB4NDIsICZhdGE2Nik7CisJaWYgKGF0YTY2ICYgYml0bWFza1thcC0+cG9ydF9ub10pCisJCXJldHVybiBBVEFfQ0JMX1BBVEE4MDsKKwlyZXR1cm4gQVRBX0NCTF9QQVRBNDA7CiB9CiAKIC8qKgpAQCAtMjQ3LDMxICsyMjgsMTYgQEAKICAqLwogCiBzdGF0aWMgaW50IG52X3ByZV9yZXNldChzdHJ1Y3QgYXRhX3BvcnQgKmFwKSB7Ci0Jc3RhdGljIGNvbnN0IHU4IGJpdG1hc2tbMl0gPSB7MHgwMywgMHgwQ307CiAJc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfYml0cyBudl9lbmFibGVfYml0c1tdID0gewogCQl7IDB4NTAsIDEsIDB4MDIsIDB4MDIgfSwKIAkJeyAweDUwLCAxLCAweDAxLCAweDAxIH0KIAl9OwogCiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGFwLT5ob3N0LT5kZXYpOwotCXU4IGF0YTY2OwotCXUxNiB1ZG1hOwogCiAJaWYgKCFwY2lfdGVzdF9jb25maWdfYml0cyhwZGV2LCAmbnZfZW5hYmxlX2JpdHNbYXAtPnBvcnRfbm9dKSkKIAkJcmV0dXJuIC1FTk9FTlQ7CiAKLQlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCAweDUyLCAmYXRhNjYpOwotCWlmIChhdGE2NiAmIGJpdG1hc2tbYXAtPnBvcnRfbm9dKQotCQlhcC0+Y2JsID0gQVRBX0NCTF9QQVRBODA7Ci0JZWxzZQotCQlhcC0+Y2JsID0gQVRBX0NCTF9QQVRBNDA7Ci0KLQkvKiBXZSBub3cgaGF2ZSB0byBkb3VibGUgY2hlY2sgYmVjYXVzZSB0aGUgTnZpZGlhIGJveGVzIEJJT1MKLQkgICBkb2Vzbid0IGFsd2F5cyBzZXQgdGhlIGNhYmxlIGJpdHMgYnV0IGRvZXMgc2V0IG1vZGUgYml0cyAqLwotCi0JcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgMHg2MiAtIDIgKiBhcC0+cG9ydF9ubywgJnVkbWEpOwotCWlmICgodWRtYSAmIDB4QzQpID09IDB4QzQgfHwgKHVkbWEgJiAweEM0MDApID09IDB4QzQwMCkKLQkJYXAtPmNibCA9IEFUQV9DQkxfUEFUQTgwOwogCXJldHVybiBhdGFfc3RkX3ByZXJlc2V0KGFwKTsKIH0KIApAQCAtMjgxLDYgKzI0NywyOSBAQAogCQkJICAgICAgIGF0YV9zdGRfc29mdHJlc2V0LCBOVUxMLAogCQkJICAgICAgIGF0YV9zdGRfcG9zdHJlc2V0KTsKIH0KKworc3RhdGljIGludCBudl9jYWJsZV9kZXRlY3Qoc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKKwlzdGF0aWMgY29uc3QgdTggYml0bWFza1syXSA9IHsweDAzLCAweDBDfTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoYXAtPmhvc3QtPmRldik7CisJdTggYXRhNjY7CisJdTE2IHVkbWE7CisJaW50IGNibDsKKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIDB4NTIsICZhdGE2Nik7CisJaWYgKGF0YTY2ICYgYml0bWFza1thcC0+cG9ydF9ub10pCisJCWNibCA9IEFUQV9DQkxfUEFUQTgwOworCWVsc2UKKwkJY2JsID0gQVRBX0NCTF9QQVRBNDA7CisKKyAJLyogV2Ugbm93IGhhdmUgdG8gZG91YmxlIGNoZWNrIGJlY2F1c2UgdGhlIE52aWRpYSBib3hlcyBCSU9TCisgCSAgIGRvZXNuJ3QgYWx3YXlzIHNldCB0aGUgY2FibGUgYml0cyBidXQgZG9lcyBzZXQgbW9kZSBiaXRzICovCisgCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIDB4NjIgLSAyICogYXAtPnBvcnRfbm8sICZ1ZG1hKTsKKyAJaWYgKCh1ZG1hICYgMHhDNCkgPT0gMHhDNCB8fCAodWRtYSAmIDB4QzQwMCkgPT0gMHhDNDAwKQorCQljYmwgPSBBVEFfQ0JMX1BBVEE4MDsKKwlyZXR1cm4gY2JsOworfQorCiAvKioKICAqCW52MTAwX3NldF9waW9tb2RlCS0Jc2V0IGluaXRpYWwgUElPIG1vZGUgZGF0YQogICoJQGFwOiBBVEEgaW50ZXJmYWNlCkBAIC0zNTMsOCArMzQyLDkgQEAKIAogCS5mcmVlemUJCT0gYXRhX2JtZG1hX2ZyZWV6ZSwKIAkudGhhdwkJPSBhdGFfYm1kbWFfdGhhdywKLQkuZXJyb3JfaGFuZGxlcgk9IGFtZF9lYXJseV9lcnJvcl9oYW5kbGVyLAorCS5lcnJvcl9oYW5kbGVyCT0gYW1kX2Vycm9yX2hhbmRsZXIsCiAJLnBvc3RfaW50ZXJuYWxfY21kID0gYXRhX2JtZG1hX3Bvc3RfaW50ZXJuYWxfY21kLAorCS5jYWJsZV9kZXRlY3QJPSBhdGFfY2FibGVfNDB3aXJlLAogCiAJLmJtZG1hX3NldHVwIAk9IGF0YV9ibWRtYV9zZXR1cCwKIAkuYm1kbWFfc3RhcnQgCT0gYXRhX2JtZG1hX3N0YXJ0LApAQCAtMzg3LDggKzM3Nyw5IEBACiAKIAkuZnJlZXplCQk9IGF0YV9ibWRtYV9mcmVlemUsCiAJLnRoYXcJCT0gYXRhX2JtZG1hX3RoYXcsCi0JLmVycm9yX2hhbmRsZXIJPSBhbWRfZWFybHlfZXJyb3JfaGFuZGxlciwKKwkuZXJyb3JfaGFuZGxlcgk9IGFtZF9lcnJvcl9oYW5kbGVyLAogCS5wb3N0X2ludGVybmFsX2NtZCA9IGF0YV9ibWRtYV9wb3N0X2ludGVybmFsX2NtZCwKKwkuY2FibGVfZGV0ZWN0CT0gYXRhX2NhYmxlX3Vua25vd24sCiAKIAkuYm1kbWFfc2V0dXAgCT0gYXRhX2JtZG1hX3NldHVwLAogCS5ibWRtYV9zdGFydCAJPSBhdGFfYm1kbWFfc3RhcnQsCkBAIC00MjMsNiArNDE0LDcgQEAKIAkudGhhdwkJPSBhdGFfYm1kbWFfdGhhdywKIAkuZXJyb3JfaGFuZGxlcgk9IGFtZF9lcnJvcl9oYW5kbGVyLAogCS5wb3N0X2ludGVybmFsX2NtZCA9IGF0YV9ibWRtYV9wb3N0X2ludGVybmFsX2NtZCwKKwkuY2FibGVfZGV0ZWN0CT0gYXRhX2NhYmxlX3Vua25vd24sCiAKIAkuYm1kbWFfc2V0dXAgCT0gYXRhX2JtZG1hX3NldHVwLAogCS5ibWRtYV9zdGFydCAJPSBhdGFfYm1kbWFfc3RhcnQsCkBAIC00NTcsNiArNDQ5LDcgQEAKIAkudGhhdwkJPSBhdGFfYm1kbWFfdGhhdywKIAkuZXJyb3JfaGFuZGxlcgk9IGFtZF9lcnJvcl9oYW5kbGVyLAogCS5wb3N0X2ludGVybmFsX2NtZCA9IGF0YV9ibWRtYV9wb3N0X2ludGVybmFsX2NtZCwKKwkuY2FibGVfZGV0ZWN0CT0gYW1kX2NhYmxlX2RldGVjdCwKIAogCS5ibWRtYV9zZXR1cCAJPSBhdGFfYm1kbWFfc2V0dXAsCiAJLmJtZG1hX3N0YXJ0IAk9IGF0YV9ibWRtYV9zdGFydCwKQEAgLTQ5MSw2ICs0ODQsNyBAQAogCS50aGF3CQk9IGF0YV9ibWRtYV90aGF3LAogCS5lcnJvcl9oYW5kbGVyCT0gbnZfZXJyb3JfaGFuZGxlciwKIAkucG9zdF9pbnRlcm5hbF9jbWQgPSBhdGFfYm1kbWFfcG9zdF9pbnRlcm5hbF9jbWQsCisJLmNhYmxlX2RldGVjdAk9IG52X2NhYmxlX2RldGVjdCwKIAogCS5ibWRtYV9zZXR1cCAJPSBhdGFfYm1kbWFfc2V0dXAsCiAJLmJtZG1hX3N0YXJ0IAk9IGF0YV9ibWRtYV9zdGFydCwKQEAgLTUyNSw2ICs1MTksNyBAQAogCS50aGF3CQk9IGF0YV9ibWRtYV90aGF3LAogCS5lcnJvcl9oYW5kbGVyCT0gbnZfZXJyb3JfaGFuZGxlciwKIAkucG9zdF9pbnRlcm5hbF9jbWQgPSBhdGFfYm1kbWFfcG9zdF9pbnRlcm5hbF9jbWQsCisJLmNhYmxlX2RldGVjdAk9IG52X2NhYmxlX2RldGVjdCwKIAogCS5ibWRtYV9zZXR1cCAJPSBhdGFfYm1kbWFfc2V0dXAsCiAJLmJtZG1hX3N0YXJ0IAk9IGF0YV9ibWRtYV9zdGFydCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfYXJ0b3AuYyBiL2RyaXZlcnMvYXRhL3BhdGFfYXJ0b3AuYwppbmRleCAyMWMzMDI4Li4wMGU5ZWMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX2FydG9wLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9hcnRvcC5jCkBAIC00OSw4ICs0OSw2IEBACiAKIAlpZiAoIXBjaV90ZXN0X2NvbmZpZ19iaXRzKHBkZXYsICZhcnRvcF9lbmFibGVfYml0c1thcC0+cG9ydF9ub10pKQogCQlyZXR1cm4gLUVOT0VOVDsKLQotCWFwLT5jYmwgPSBBVEFfQ0JMX1BBVEE0MDsKIAlyZXR1cm4gYXRhX3N0ZF9wcmVyZXNldChhcCk7CiB9CiAKQEAgLTg1LDE4ICs4MywyOCBAQAogCX07CiAKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoYXAtPmhvc3QtPmRldik7Ci0JdTggdG1wOwogCiAJLyogT2RkIG51bWJlcmVkIGRldmljZSBpZHMgYXJlIHRoZSB1bml0cyB3aXRoIGVuYWJsZSBiaXRzICh0aGUgLVIgY2FyZHMpICovCiAJaWYgKHBkZXYtPmRldmljZSAlIDEgJiYgIXBjaV90ZXN0X2NvbmZpZ19iaXRzKHBkZXYsICZhcnRvcF9lbmFibGVfYml0c1thcC0+cG9ydF9ub10pKQogCQlyZXR1cm4gLUVOT0VOVDsKKwlyZXR1cm4gYXRhX3N0ZF9wcmVyZXNldChhcCk7Cit9CiAKKy8qKgorICoJYXJ0b3A2MjYwX2NhYmxlX2RldGVjdAktCWlkZW50aWZ5IGNhYmxlIHR5cGUKKyAqCUBhcDogUG9ydAorICoKKyAqCUlkZW50aWZ5IHRoZSBjYWJsZSB0eXBlIGZvciB0aGUgQVJUT3AgaW50ZXJmYWNlIGluIHF1ZXN0aW9uCisgKi8KKyAKK3N0YXRpYyBpbnQgYXJ0b3A2MjYwX2NhYmxlX2RldGVjdChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihhcC0+aG9zdC0+ZGV2KTsKKwl1OCB0bXA7CiAJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgMHg0OSwgJnRtcCk7CiAJaWYgKHRtcCAmICgxIDw8IGFwLT5wb3J0X25vKSkKLQkJYXAtPmNibCA9IEFUQV9DQkxfUEFUQTQwOwotCWVsc2UKLQkJYXAtPmNibCA9IEFUQV9DQkxfUEFUQTgwOwotCXJldHVybiBhdGFfc3RkX3ByZXJlc2V0KGFwKTsKKwkJcmV0dXJuIEFUQV9DQkxfUEFUQTQwOworCXJldHVybiBBVEFfQ0JMX1BBVEE4MDsKIH0KIAogLyoqCkBAIC0yMjUsNyArMjMzLDcgQEAKIC8qKgogICoJYXJ0b3A2MjEwX3NldF9kbWFtb2RlIC0gSW5pdGlhbGl6ZSBob3N0IGNvbnRyb2xsZXIgUEFUQSBQSU8gdGltaW5ncwogICoJQGFwOiBQb3J0IHdob3NlIHRpbWluZ3Mgd2UgYXJlIGNvbmZpZ3VyaW5nCi0gKglAYWRldjogdW0KKyAqCUBhZGV2OiBEZXZpY2Ugd2hvc2UgdGltaW5ncyB3ZSBhcmUgY29uZmlndXJpbmcKICAqCiAgKglTZXQgRE1BIG1vZGUgZm9yIGRldmljZSwgaW4gaG9zdCBjb250cm9sbGVyIFBDSSBjb25maWcgc3BhY2UuCiAgKgpAQCAtMzMzLDYgKzM0MSw3IEBACiAJLnRoYXcJCQk9IGF0YV9ibWRtYV90aGF3LAogCS5lcnJvcl9oYW5kbGVyCQk9IGFydG9wNjIxMF9lcnJvcl9oYW5kbGVyLAogCS5wb3N0X2ludGVybmFsX2NtZCAJPSBhdGFfYm1kbWFfcG9zdF9pbnRlcm5hbF9jbWQsCisJLmNhYmxlX2RldGVjdAkJPSBhdGFfY2FibGVfNDB3aXJlLAogCiAJLmJtZG1hX3NldHVwCQk9IGF0YV9ibWRtYV9zZXR1cCwKIAkuYm1kbWFfc3RhcnQJCT0gYXRhX2JtZG1hX3N0YXJ0LApAQCAtMzY2LDYgKzM3NSw3IEBACiAJLnRoYXcJCQk9IGF0YV9ibWRtYV90aGF3LAogCS5lcnJvcl9oYW5kbGVyCQk9IGFydG9wNjI2MF9lcnJvcl9oYW5kbGVyLAogCS5wb3N0X2ludGVybmFsX2NtZCAJPSBhdGFfYm1kbWFfcG9zdF9pbnRlcm5hbF9jbWQsCisJLmNhYmxlX2RldGVjdAkJPSBhcnRvcDYyNjBfY2FibGVfZGV0ZWN0LAogCiAJLmJtZG1hX3NldHVwCQk9IGF0YV9ibWRtYV9zZXR1cCwKIAkuYm1kbWFfc3RhcnQJCT0gYXRhX2JtZG1hX3N0YXJ0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9hdGlpeHAuYyBiL2RyaXZlcnMvYXRhL3BhdGFfYXRpaXhwLmMKaW5kZXggNTFkOTkyMy4uMzljODcxYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9hdGlpeHAuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX2F0aWl4cC5jCkBAIC0yMiw3ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgvbGliYXRhLmg+CiAKICNkZWZpbmUgRFJWX05BTUUgInBhdGFfYXRpaXhwIgotI2RlZmluZSBEUlZfVkVSU0lPTiAiMC40LjQiCisjZGVmaW5lIERSVl9WRVJTSU9OICIwLjQuNSIKIAogZW51bSB7CiAJQVRJSVhQX0lERV9QSU9fVElNSU5HCT0gMHg0MCwKQEAgLTM1LDIzICszNSwxNSBAQAogCiBzdGF0aWMgaW50IGF0aWl4cF9wcmVfcmVzZXQoc3RydWN0IGF0YV9wb3J0ICphcCkKIHsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoYXAtPmhvc3QtPmRldik7CiAJc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfYml0cyBhdGlpeHBfZW5hYmxlX2JpdHNbXSA9IHsKIAkJeyAweDQ4LCAxLCAweDAxLCAweDAwIH0sCiAJCXsgMHg0OCwgMSwgMHgwOCwgMHgwMCB9CiAJfTsKLQl1OCB1ZG1hOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihhcC0+aG9zdC0+ZGV2KTsKIAogCWlmICghcGNpX3Rlc3RfY29uZmlnX2JpdHMocGRldiwgJmF0aWl4cF9lbmFibGVfYml0c1thcC0+cG9ydF9ub10pKQogCQlyZXR1cm4gLUVOT0VOVDsKIAotCS8qIEhhY2sgZnJvbSBkcml2ZXJzL2lkZS9wY2kuIFJlYWxseSB3ZSB3YW50IHRvIGtub3cgaG93IHRvIGRvIHRoZQotCSAgIHJhdyBkZXRlY3Rpb24gbm90IHBsYXkgZm9sbG93IHRoZSBiaW9zIG1vZGUgZ3Vlc3MgKi8KLQlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBBVElJWFBfSURFX1VETUFfTU9ERSArIGFwLT5wb3J0X25vLCAmdWRtYSk7Ci0JaWYgKCh1ZG1hICYgMHgwNykgPj0gMHgwNCB8fCAodWRtYSAmIDB4NzApID49IDB4NDApCi0JCWFwLT5jYmwgPSBBVEFfQ0JMX1BBVEE4MDsKLQllbHNlCi0JCWFwLT5jYmwgPSBBVEFfQ0JMX1BBVEE0MDsKIAlyZXR1cm4gYXRhX3N0ZF9wcmVyZXNldChhcCk7CiB9CiAKQEAgLTYwLDYgKzUyLDE5IEBACiAJYXRhX2JtZG1hX2RyaXZlX2VoKGFwLCBhdGlpeHBfcHJlX3Jlc2V0LCBhdGFfc3RkX3NvZnRyZXNldCwgTlVMTCwgICBhdGFfc3RkX3Bvc3RyZXNldCk7CiB9CiAKK3N0YXRpYyBpbnQgYXRpaXhwX2NhYmxlX2RldGVjdChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihhcC0+aG9zdC0+ZGV2KTsKKwl1OCB1ZG1hOworCisJLyogSGFjayBmcm9tIGRyaXZlcnMvaWRlL3BjaS4gUmVhbGx5IHdlIHdhbnQgdG8ga25vdyBob3cgdG8gZG8gdGhlCisJICAgcmF3IGRldGVjdGlvbiBub3QgcGxheSBmb2xsb3cgdGhlIGJpb3MgbW9kZSBndWVzcyAqLworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIEFUSUlYUF9JREVfVURNQV9NT0RFICsgYXAtPnBvcnRfbm8sICZ1ZG1hKTsKKwlpZiAoKHVkbWEgJiAweDA3KSA+PSAweDA0IHx8ICh1ZG1hICYgMHg3MCkgPj0gMHg0MCkKKwkJcmV0dXJuICBBVEFfQ0JMX1BBVEE4MDsKKwlyZXR1cm4gQVRBX0NCTF9QQVRBNDA7Cit9CisKIC8qKgogICoJYXRpaXhwX3NldF9waW9fdGltaW5nCS0Jc2V0IGluaXRpYWwgUElPIG1vZGUgZGF0YQogICoJQGFwOiBBVEEgaW50ZXJmYWNlCkBAIC0yNDUsNiArMjUwLDcgQEAKIAkudGhhdwkJPSBhdGFfYm1kbWFfdGhhdywKIAkuZXJyb3JfaGFuZGxlcgk9IGF0aWl4cF9lcnJvcl9oYW5kbGVyLAogCS5wb3N0X2ludGVybmFsX2NtZCA9IGF0YV9ibWRtYV9wb3N0X2ludGVybmFsX2NtZCwKKwkuY2FibGVfZGV0ZWN0CT0gYXRpaXhwX2NhYmxlX2RldGVjdCwKIAogCS5ibWRtYV9zZXR1cCAJPSBhdGFfYm1kbWFfc2V0dXAsCiAJLmJtZG1hX3N0YXJ0IAk9IGF0aWl4cF9ibWRtYV9zdGFydCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfY21kNjQwLmMgYi9kcml2ZXJzL2F0YS9wYXRhX2NtZDY0MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMDU5ODUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2F0YS9wYXRhX2NtZDY0MC5jCkBAIC0wLDAgKzEsMzEyIEBACisvKgorICogcGF0YV9jbWQ2NDAuYyAJLSBDTUQ2NDAgUENJIFBBVEEgZm9yIG5ldyBBVEEgbGF5ZXIKKyAqCQkJICAoQykgMjAwNyBSZWQgSGF0IEluYworICoJCQkgIEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+CisgKgorICogQmFzZWQgdXBvbgorICogIGxpbnV4L2RyaXZlcnMvaWRlL3BjaS9jbWQ2NDAuYwkJVmVyc2lvbiAxLjAyICBTZXAgMDEsIDE5OTYKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTYgIExpbnVzIFRvcnZhbGRzICYgYXV0aG9ycyAoc2VlIGRyaXZlcikKKyAqCisgKglUaGlzIGRyaXZlcyBvbmx5IHRoZSBQQ0kgdmVyc2lvbiBvZiB0aGUgY29udHJvbGxlci4gSWYgeW91IGhhdmUgYQorICoJVkxCIG9uZSB0aGVuIHdlIGhhdmUgZW5vdWdoIGRvY3MgdG8gc3VwcG9ydCBpdCBidXQgeW91IGNhbiB3cml0ZQorICoJeW91ciBvd24gY29kZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9saWJhdGEuaD4KKworI2RlZmluZSBEUlZfTkFNRSAicGF0YV9jbWQ2NDAiCisjZGVmaW5lIERSVl9WRVJTSU9OICIwLjAuNSIKKworc3RydWN0IGNtZDY0MF9yZWcgeworCWludCBsYXN0OworCXU4IHJlZzU4W0FUQV9NQVhfREVWSUNFU107Cit9OworCitlbnVtIHsKKwlDRlIgPSAweDUwLAorCUNOVFJMID0gMHg1MSwKKwlDTURUSU0gPSAweDUyLAorCUFSVElNMCA9IDB4NTMsCisJRFJXVElNMCA9IDB4NTQsCisJQVJUSU0yMyA9IDB4NTcsCisJRFJXVElNMjMgPSAweDU4LAorCUJSU1QgPSAweDU5Cit9OworCisvKioKKyAqCWNtZDY0MF9zZXRfcGlvbW9kZQktCXNldCBpbml0aWFsIFBJTyBtb2RlIGRhdGEKKyAqCUBhcDogQVRBIHBvcnQKKyAqCUBhZGV2OiBBVEEgZGV2aWNlCisgKgorICoJQ2FsbGVkIHRvIGRvIHRoZSBQSU8gbW9kZSBzZXR1cC4KKyAqLworCitzdGF0aWMgdm9pZCBjbWQ2NDBfc2V0X3Bpb21vZGUoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV9kZXZpY2UgKmFkZXYpCit7CisJc3RydWN0IGNtZDY0MF9yZWcgKnRpbWluZyA9IGFwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGFwLT5ob3N0LT5kZXYpOworCXN0cnVjdCBhdGFfdGltaW5nIHQ7CisJY29uc3QgdW5zaWduZWQgbG9uZyBUID0gMTAwMDAwMCAvIDMzOworCWNvbnN0IHU4IHNldHVwX2RhdGFbXSA9IHsgMHg0MCwgMHg0MCwgMHg0MCwgMHg4MCwgMHgwMCB9OworCXU4IHJlZzsKKwlpbnQgYXJ0dGltID0gQVJUSU0wICsgMiAqIGFkZXYtPmRldm5vOworCXN0cnVjdCBhdGFfZGV2aWNlICpwYWlyID0gYXRhX2Rldl9wYWlyKGFkZXYpOworCisJaWYgKGF0YV90aW1pbmdfY29tcHV0ZShhZGV2LCBhZGV2LT5waW9fbW9kZSwgJnQsIFQsIDApIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgRFJWX05BTUUgIjogbW9kZSBjb21wdXRhdGlvbiBmYWlsZWQuXG4iKTsKKwkJcmV0dXJuOworCX0KKworCS8qIFRoZSBzZWNvbmQgY2hhbm5lbCBoYXMgc2hhcmVkIHRpbWluZ3MgYW5kIHRoZSBzZXR1cCB0aW1pbmcgaXMKKwkgICBtZXNzeSB0byBzd2l0Y2ggdG8gbWVyZ2UgaXQgZm9yIHdvcnN0IGNhc2UgKi8KKwlpZiAoYXAtPnBvcnRfbm8gJiYgcGFpcikgeworCQlzdHJ1Y3QgYXRhX3RpbWluZyBwOworCQlhdGFfdGltaW5nX2NvbXB1dGUocGFpciwgcGFpci0+cGlvX21vZGUsICZwLCBULCAxKTsKKwkJYXRhX3RpbWluZ19tZXJnZSgmcCwgJnQsICZ0LCBBVEFfVElNSU5HX1NFVFVQKTsKKwl9CisKKwkvKiBNYWtlIHRoZSB0aW1pbmdzIGZpdCAqLworCWlmICh0LnJlY292ZXIgPiAxNikgeworCQl0LmFjdGl2ZSArPSB0LnJlY292ZXIgLSAxNjsKKwkJdC5yZWNvdmVyID0gMTY7CisJfQorCWlmICh0LmFjdGl2ZSA+IDE2KQorCQl0LmFjdGl2ZSA9IDE2OworCisJLyogTm93IGNvbnZlcnQgdGhlIGNsb2NrcyBpbnRvIHZhbHVlcyB3ZSBjYW4gYWN0dWFsbHkgc3R1ZmYgaW50bworCSAgIHRoZSBjaGlwICovCisKKwlpZiAodC5yZWNvdmVyID4gMSkKKwkJdC5yZWNvdmVyLS07CS8qIDY0MEIgb25seSAqLworCWVsc2UKKwkJdC5yZWNvdmVyID0gMTU7CisKKwlpZiAodC5zZXR1cCA+IDQpCisJCXQuc2V0dXAgPSAweEMwOworCWVsc2UKKwkJdC5zZXR1cCA9IHNldHVwX2RhdGFbdC5zZXR1cF07CisKKwlpZiAoYXAtPnBvcnRfbm8gPT0gMCkgeworCQl0LmFjdGl2ZSAmPSAweDBGOwkvKiAwID0gMTYgKi8KKworCQkvKiBMb2FkIHNldHVwIHRpbWluZyAqLworCQlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBhcnR0aW0sICZyZWcpOworCQlyZWcgJj0gMHgzRjsKKwkJcmVnIHw9IHQuc2V0dXA7CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBhcnR0aW0sIHJlZyk7CisKKwkJLyogTG9hZCBhY3RpdmUvcmVjb3ZlcnkgKi8KKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIGFydHRpbSArIDEsICh0LmFjdGl2ZSA8PCA0KSB8IHQucmVjb3Zlcik7CisJfSBlbHNlIHsKKwkJLyogU2F2ZSB0aGUgc2hhcmVkIHRpbWluZ3MgZm9yIGNoYW5uZWwsIHRoZXkgd2lsbCBiZSBsb2FkZWQKKwkJICAgYnkgcWNfaXNzdWVfcHJvdC4gUmVsb2FkaW5nIHRoZSBzZXR1cCB0aW1lIGlzIGV4cGVuc2l2ZSAKKwkJICAgc28gd2Uga2VlcCBhIG1lcmdlZCBvbmUgbG9hZGVkICovCisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIEFSVElNMjMsICZyZWcpOworCQlyZWcgJj0gMHgzRjsKKwkJcmVnIHw9IHQuc2V0dXA7CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBBUlRJTTIzLCByZWcpOworCQl0aW1pbmctPnJlZzU4W2FkZXYtPmRldm5vXSA9ICh0LmFjdGl2ZSA8PCA0KSB8IHQucmVjb3ZlcjsKKwl9Cit9CisKKworLyoqCisgKgljbWQ2NDBfcWNfaXNzdWVfcHJvdAktCWNvbW1hbmQgcHJlcGFyYXRpb24gaG9vaworICoJQHFjOiBDb21tYW5kIHRvIGJlIGlzc3VlZAorICoKKyAqCUNoYW5uZWwgMSBoYXMgc2hhcmVkIHRpbWluZ3MuIFdlIG11c3QgcmVwcm9ncmFtIHRoZQorICoJY2xvY2sgZWFjaCBkcml2ZSAyLzMgc3dpdGNoIHdlIGRvLgorICovCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY21kNjQwX3FjX2lzc3VlX3Byb3Qoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYykKK3sKKwlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gcWMtPmFwOworCXN0cnVjdCBhdGFfZGV2aWNlICphZGV2ID0gcWMtPmRldjsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoYXAtPmhvc3QtPmRldik7CisJc3RydWN0IGNtZDY0MF9yZWcgKnRpbWluZyA9IGFwLT5wcml2YXRlX2RhdGE7CisKKwlpZiAoYXAtPnBvcnRfbm8gIT0gMCAmJiBhZGV2LT5kZXZubyAhPSB0aW1pbmctPmxhc3QpIHsKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIERSV1RJTTIzLCB0aW1pbmctPnJlZzU4W2FkZXYtPmRldm5vXSk7CisJCXRpbWluZy0+bGFzdCA9IGFkZXYtPmRldm5vOworCX0KKwlyZXR1cm4gYXRhX3FjX2lzc3VlX3Byb3QocWMpOworfQorCisvKioKKyAqCWNtZDY0MF9wb3J0X3N0YXJ0CS0JcG9ydCBzZXR1cAorICoJQGFwOiBBVEEgcG9ydCBiZWluZyBzZXQgdXAKKyAqCisgKglUaGUgQ01ENjQwIG5lZWRzIHRvIG1haW50YWluIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmVzIHNvIHdlCisgKglhbGxvY2F0ZSBzcGFjZSBoZXJlLgorICovCisKK3N0YXRpYyBpbnQgY21kNjQwX3BvcnRfc3RhcnQoc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoYXAtPmhvc3QtPmRldik7CisJc3RydWN0IGNtZDY0MF9yZWcgKnRpbWluZzsKKworCWludCByZXQgPSBhdGFfcG9ydF9zdGFydChhcCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwl0aW1pbmcgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCBjbWQ2NDBfcmVnKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHRpbWluZyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwl0aW1pbmctPmxhc3QgPSAtMTsJLyogRm9yY2UgYSBsb2FkICovCisJYXAtPnByaXZhdGVfZGF0YSA9IHRpbWluZzsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBjbWQ2NDBfc2h0ID0geworCS5tb2R1bGUJCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQkJPSBEUlZfTkFNRSwKKwkuaW9jdGwJCQk9IGF0YV9zY3NpX2lvY3RsLAorCS5xdWV1ZWNvbW1hbmQJCT0gYXRhX3Njc2lfcXVldWVjbWQsCisJLmNhbl9xdWV1ZQkJPSBBVEFfREVGX1FVRVVFLAorCS50aGlzX2lkCQk9IEFUQV9TSFRfVEhJU19JRCwKKwkuc2dfdGFibGVzaXplCQk9IExJQkFUQV9NQVhfUFJELAorCS5jbWRfcGVyX2x1bgkJPSBBVEFfU0hUX0NNRF9QRVJfTFVOLAorCS5lbXVsYXRlZAkJPSBBVEFfU0hUX0VNVUxBVEVELAorCS51c2VfY2x1c3RlcmluZwkJPSBBVEFfU0hUX1VTRV9DTFVTVEVSSU5HLAorCS5wcm9jX25hbWUJCT0gRFJWX05BTUUsCisJLmRtYV9ib3VuZGFyeQkJPSBBVEFfRE1BX0JPVU5EQVJZLAorCS5zbGF2ZV9jb25maWd1cmUJPSBhdGFfc2NzaV9zbGF2ZV9jb25maWcsCisJLnNsYXZlX2Rlc3Ryb3kJCT0gYXRhX3Njc2lfc2xhdmVfZGVzdHJveSwKKwkuYmlvc19wYXJhbQkJPSBhdGFfc3RkX2Jpb3NfcGFyYW0sCisjaWZkZWYgQ09ORklHX1BNCisJLnJlc3VtZQkJCT0gYXRhX3Njc2lfZGV2aWNlX3Jlc3VtZSwKKwkuc3VzcGVuZAkJPSBhdGFfc2NzaV9kZXZpY2Vfc3VzcGVuZCwKKyNlbmRpZgorfTsKKworc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIGNtZDY0MF9wb3J0X29wcyA9IHsKKwkucG9ydF9kaXNhYmxlCT0gYXRhX3BvcnRfZGlzYWJsZSwKKwkuc2V0X3Bpb21vZGUJPSBjbWQ2NDBfc2V0X3Bpb21vZGUsCisJLm1vZGVfZmlsdGVyCT0gYXRhX3BjaV9kZWZhdWx0X2ZpbHRlciwKKwkudGZfbG9hZAk9IGF0YV90Zl9sb2FkLAorCS50Zl9yZWFkCT0gYXRhX3RmX3JlYWQsCisJLmNoZWNrX3N0YXR1cyAJPSBhdGFfY2hlY2tfc3RhdHVzLAorCS5leGVjX2NvbW1hbmQJPSBhdGFfZXhlY19jb21tYW5kLAorCS5kZXZfc2VsZWN0IAk9IGF0YV9zdGRfZGV2X3NlbGVjdCwKKworCS5mcmVlemUJCT0gYXRhX2JtZG1hX2ZyZWV6ZSwKKwkudGhhdwkJPSBhdGFfYm1kbWFfdGhhdywKKwkuZXJyb3JfaGFuZGxlcgk9IGF0YV9ibWRtYV9lcnJvcl9oYW5kbGVyLAorCS5wb3N0X2ludGVybmFsX2NtZCA9IGF0YV9ibWRtYV9wb3N0X2ludGVybmFsX2NtZCwKKwkuY2FibGVfZGV0ZWN0CT0gYXRhX2NhYmxlXzQwd2lyZSwKKworCS5ibWRtYV9zZXR1cCAJPSBhdGFfYm1kbWFfc2V0dXAsCisJLmJtZG1hX3N0YXJ0IAk9IGF0YV9ibWRtYV9zdGFydCwKKwkuYm1kbWFfc3RvcAk9IGF0YV9ibWRtYV9zdG9wLAorCS5ibWRtYV9zdGF0dXMgCT0gYXRhX2JtZG1hX3N0YXR1cywKKworCS5xY19wcmVwIAk9IGF0YV9xY19wcmVwLAorCS5xY19pc3N1ZQk9IGNtZDY0MF9xY19pc3N1ZV9wcm90LAorCisJLyogSW4gdGhlb3J5IHRoaXMgaXMgbm90IG5lZWRlZCBvbmNlIHdlIGtpbGwgdGhlIHByZWZldGNoZXIgKi8KKwkuZGF0YV94ZmVyCT0gYXRhX2RhdGFfeGZlcl9ub2lycSwKKworCS5pcnFfaGFuZGxlcgk9IGF0YV9pbnRlcnJ1cHQsCisJLmlycV9jbGVhcgk9IGF0YV9ibWRtYV9pcnFfY2xlYXIsCisJLmlycV9vbgkJPSBhdGFfaXJxX29uLAorCS5pcnFfYWNrCT0gYXRhX2lycV9hY2ssCisKKwkucG9ydF9zdGFydAk9IGNtZDY0MF9wb3J0X3N0YXJ0LAorfTsKKworc3RhdGljIHZvaWQgY21kNjQwX2hhcmR3YXJlX2luaXQoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJdTggcjsKKwl1OCBjdHJsOworCisJLyogQ01ENjQwIGRldGVjdGVkLCBjb21taXNlcmF0aW9ucyAqLworCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCAweDVCLCAweDAwKTsKKwkvKiBHZXQgdmVyc2lvbiBpbmZvICovCisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgQ0ZSLCAmcik7CisJLyogUElPMCBjb21tYW5kIGN5Y2xlcyAqLworCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBDTURUSU0sIDApOworCS8qIDUxMiBieXRlIGJ1cnN0cyAoc2VjdG9yKSAqLworCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBCUlNULCAweDQwKTsKKwkvKiAKKwkgKiBBIHJlcG9ydGVyIGEgbG9uZyB0aW1lIGFnbworCSAqIEhhZCBwcm9ibGVtcyB3aXRoIHRoZSBkYXRhIGZpZm8KKwkgKiBTbyBkb24ndCBydW4gdGhlIHJpc2sKKwkgKiBPZiBwdXR0aW5nIGNyYXAgb24gdGhlIGRpc2sKKwkgKiBGb3IgaXRzIGJldHRlciBqdXN0IHRvIGdvIHNsb3cKKwkgKi8KKwkvKiBEbyBjaGFubmVsIDAgKi8KKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBDTlRSTCwgJmN0cmwpOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBDTlRSTCwgY3RybCB8IDB4QzApOworCS8qIERpdHRvIGZvciBjaGFubmVsIDEgKi8KKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBBUlRJTTIzLCAmY3RybCk7CisJY3RybCB8PSAweDBDOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBBUlRJTTIzLCBjdHJsKTsKK30KKworc3RhdGljIGludCBjbWQ2NDBfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3sKKwlzdGF0aWMgc3RydWN0IGF0YV9wb3J0X2luZm8gaW5mbyA9IHsKKwkJLnNodCA9ICZjbWQ2NDBfc2h0LAorCQkuZmxhZ3MgPSBBVEFfRkxBR19TTEFWRV9QT1NTIHwgQVRBX0ZMQUdfU1JTVCwKKwkJLnBpb19tYXNrID0gMHgxZiwKKwkJLnBvcnRfb3BzID0gJmNtZDY0MF9wb3J0X29wcworCX07CisKKwlzdGF0aWMgc3RydWN0IGF0YV9wb3J0X2luZm8gKnBvcnRfaW5mb1syXSA9IHsgJmluZm8sICZpbmZvIH07CisKKwljbWQ2NDBfaGFyZHdhcmVfaW5pdChwZGV2KTsKKwlyZXR1cm4gYXRhX3BjaV9pbml0X29uZShwZGV2LCBwb3J0X2luZm8sIDIpOworfQorCitzdGF0aWMgaW50IGNtZDY0MF9yZWluaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCWNtZDY0MF9oYXJkd2FyZV9pbml0KHBkZXYpOworI2lmZGVmIENPTkZJR19QTQorCXJldHVybiBhdGFfcGNpX2RldmljZV9yZXN1bWUocGRldik7CisjZWxzZQorCXJldHVybiAwOworI2VuZGlmCit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBjbWQ2NDBbXSA9IHsKKwl7IFBDSV9WREVWSUNFKENNRCwgMHg2NDApLCAwIH0sCisJeyB9LAorfTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGNtZDY0MF9wY2lfZHJpdmVyID0geworCS5uYW1lIAkJPSBEUlZfTkFNRSwKKwkuaWRfdGFibGUJPSBjbWQ2NDAsCisJLnByb2JlIAkJPSBjbWQ2NDBfaW5pdF9vbmUsCisJLnJlbW92ZQkJPSBhdGFfcGNpX3JlbW92ZV9vbmUsCisjaWZkZWYgQ09ORklHX1BNCisJLnN1c3BlbmQJPSBhdGFfcGNpX2RldmljZV9zdXNwZW5kLAorI2VuZGlmCisJLnJlc3VtZQkJPSBjbWQ2NDBfcmVpbml0X29uZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGNtZDY0MF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmNtZDY0MF9wY2lfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGNtZDY0MF9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZjbWQ2NDBfcGNpX2RyaXZlcik7Cit9CisKK01PRFVMRV9BVVRIT1IoIkFsYW4gQ294Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oImxvdy1sZXZlbCBkcml2ZXIgZm9yIENNRDY0MCBQQVRBIGNvbnRyb2xsZXJzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgY21kNjQwKTsKK01PRFVMRV9WRVJTSU9OKERSVl9WRVJTSU9OKTsKKworbW9kdWxlX2luaXQoY21kNjQwX2luaXQpOworbW9kdWxlX2V4aXQoY21kNjQwX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9jbWQ2NHguYyBiL2RyaXZlcnMvYXRhL3BhdGFfY21kNjR4LmMKaW5kZXggNWIxM2JkZC4uMzk4OWNjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9jbWQ2NHguYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX2NtZDY0eC5jCkBAIC03NSwxMyArNzUsNyBAQAogCURUUFIxCQk9IDB4N0MKIH07CiAKLXN0YXRpYyBpbnQgY21kNjR4X3ByZV9yZXNldChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQotewotCWFwLT5jYmwgPSBBVEFfQ0JMX1BBVEE0MDsKLQlyZXR1cm4gYXRhX3N0ZF9wcmVyZXNldChhcCk7Ci19Ci0KLXN0YXRpYyBpbnQgY21kNjQ4X3ByZV9yZXNldChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQorc3RhdGljIGludCBjbWQ2NDhfY2FibGVfZGV0ZWN0KHN0cnVjdCBhdGFfcG9ydCAqYXApCiB7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGFwLT5ob3N0LT5kZXYpOwogCXU4IHI7CkBAIC04OSwyMSArODMsOCBAQAogCS8qIENoZWNrIGNhYmxlIGRldGVjdCBiaXRzICovCiAJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgQk1JREVDU1IsICZyKTsKIAlpZiAociAmICgxIDw8IGFwLT5wb3J0X25vKSkKLQkJYXAtPmNibCA9IEFUQV9DQkxfUEFUQTgwOwotCWVsc2UKLQkJYXAtPmNibCA9IEFUQV9DQkxfUEFUQTQwOwotCi0JcmV0dXJuIGF0YV9zdGRfcHJlcmVzZXQoYXApOwotfQotCi1zdGF0aWMgdm9pZCBjbWQ2NHhfZXJyb3JfaGFuZGxlcihzdHJ1Y3QgYXRhX3BvcnQgKmFwKQotewotCXJldHVybiBhdGFfYm1kbWFfZHJpdmVfZWgoYXAsIGNtZDY0eF9wcmVfcmVzZXQsIGF0YV9zdGRfc29mdHJlc2V0LCBOVUxMLCBhdGFfc3RkX3Bvc3RyZXNldCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGNtZDY0OF9lcnJvcl9oYW5kbGVyKHN0cnVjdCBhdGFfcG9ydCAqYXApCi17Ci0JYXRhX2JtZG1hX2RyaXZlX2VoKGFwLCBjbWQ2NDhfcHJlX3Jlc2V0LCBhdGFfc3RkX3NvZnRyZXNldCwgTlVMTCwgYXRhX3N0ZF9wb3N0cmVzZXQpOworCQlyZXR1cm4gQVRBX0NCTF9QQVRBODA7CisJcmV0dXJuIEFUQV9DQkxfUEFUQTQwOwogfQogCiAvKioKQEAgLTMwNCw4ICsyODUsOSBAQAogCiAJLmZyZWV6ZQkJPSBhdGFfYm1kbWFfZnJlZXplLAogCS50aGF3CQk9IGF0YV9ibWRtYV90aGF3LAotCS5lcnJvcl9oYW5kbGVyCT0gY21kNjR4X2Vycm9yX2hhbmRsZXIsCisJLmVycm9yX2hhbmRsZXIJPSBhdGFfYm1kbWFfZXJyb3JfaGFuZGxlciwKIAkucG9zdF9pbnRlcm5hbF9jbWQgPSBhdGFfYm1kbWFfcG9zdF9pbnRlcm5hbF9jbWQsCisJLmNhYmxlX2RldGVjdAk9IGF0YV9jYWJsZV80MHdpcmUsCiAKIAkuYm1kbWFfc2V0dXAgCT0gYXRhX2JtZG1hX3NldHVwLAogCS5ibWRtYV9zdGFydCAJPSBhdGFfYm1kbWFfc3RhcnQsCkBAIC0zMzgsOCArMzIwLDkgQEAKIAogCS5mcmVlemUJCT0gYXRhX2JtZG1hX2ZyZWV6ZSwKIAkudGhhdwkJPSBhdGFfYm1kbWFfdGhhdywKLQkuZXJyb3JfaGFuZGxlcgk9IGNtZDY0eF9lcnJvcl9oYW5kbGVyLAorCS5lcnJvcl9oYW5kbGVyCT0gYXRhX2JtZG1hX2Vycm9yX2hhbmRsZXIsCiAJLnBvc3RfaW50ZXJuYWxfY21kID0gYXRhX2JtZG1hX3Bvc3RfaW50ZXJuYWxfY21kLAorCS5jYWJsZV9kZXRlY3QJPSBhdGFfY2FibGVfNDB3aXJlLAogCiAJLmJtZG1hX3NldHVwIAk9IGF0YV9ibWRtYV9zZXR1cCwKIAkuYm1kbWFfc3RhcnQgCT0gYXRhX2JtZG1hX3N0YXJ0LApAQCAtMzcyLDggKzM1NSw5IEBACiAKIAkuZnJlZXplCQk9IGF0YV9ibWRtYV9mcmVlemUsCiAJLnRoYXcJCT0gYXRhX2JtZG1hX3RoYXcsCi0JLmVycm9yX2hhbmRsZXIJPSBjbWQ2NDhfZXJyb3JfaGFuZGxlciwKKwkuZXJyb3JfaGFuZGxlcgk9IGF0YV9ibWRtYV9lcnJvcl9oYW5kbGVyLAogCS5wb3N0X2ludGVybmFsX2NtZCA9IGF0YV9ibWRtYV9wb3N0X2ludGVybmFsX2NtZCwKKwkuY2FibGVfZGV0ZWN0CT0gY21kNjQ4X2NhYmxlX2RldGVjdCwKIAogCS5ibWRtYV9zZXR1cCAJPSBhdGFfYm1kbWFfc2V0dXAsCiAJLmJtZG1hX3N0YXJ0IAk9IGF0YV9ibWRtYV9zdGFydCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfY3M1NTIwLmMgYi9kcml2ZXJzL2F0YS9wYXRhX2NzNTUyMC5jCmluZGV4IDU1Y2MyOTMuLjc5YmVmMGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfY3M1NTIwLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9jczU1MjAuYwpAQCAtMTM5LDE4ICsxMzksNiBAQAogCWNzNTUyMF9zZXRfdGltaW5ncyhhcCwgYWRldiwgYWRldi0+cGlvX21vZGUpOwogfQogCi0KLXN0YXRpYyBpbnQgY3M1NTIwX3ByZV9yZXNldChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQotewotCWFwLT5jYmwgPSBBVEFfQ0JMX1BBVEE0MDsKLQlyZXR1cm4gYXRhX3N0ZF9wcmVyZXNldChhcCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGNzNTUyMF9lcnJvcl9oYW5kbGVyKHN0cnVjdCBhdGFfcG9ydCAqYXApCi17Ci0JcmV0dXJuIGF0YV9ibWRtYV9kcml2ZV9laChhcCwgY3M1NTIwX3ByZV9yZXNldCwgYXRhX3N0ZF9zb2Z0cmVzZXQsIE5VTEwsIGF0YV9zdGRfcG9zdHJlc2V0KTsKLX0KLQogc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgY3M1NTIwX3NodCA9IHsKIAkubW9kdWxlCQkJPSBUSElTX01PRFVMRSwKIAkubmFtZQkJCT0gRFJWX05BTUUsCkBAIC0xODYsOCArMTc0LDkgQEAKIAogCS5mcmVlemUJCQk9IGF0YV9ibWRtYV9mcmVlemUsCiAJLnRoYXcJCQk9IGF0YV9ibWRtYV90aGF3LAotCS5lcnJvcl9oYW5kbGVyCQk9IGNzNTUyMF9lcnJvcl9oYW5kbGVyLAorCS5lcnJvcl9oYW5kbGVyCQk9IGF0YV9ibWRtYV9lcnJvcl9oYW5kbGVyLAogCS5wb3N0X2ludGVybmFsX2NtZAk9IGF0YV9ibWRtYV9wb3N0X2ludGVybmFsX2NtZCwKKwkuY2FibGVfZGV0ZWN0CQk9IGF0YV9jYWJsZV80MHdpcmUsCiAKIAkuYm1kbWFfc2V0dXAJCT0gYXRhX2JtZG1hX3NldHVwLAogCS5ibWRtYV9zdGFydAkJPSBhdGFfYm1kbWFfc3RhcnQsCkBAIC0xOTcsNyArMTg2LDYgQEAKIAkucWNfaXNzdWUJCT0gYXRhX3FjX2lzc3VlX3Byb3QsCiAJLmRhdGFfeGZlcgkJPSBhdGFfZGF0YV94ZmVyLAogCi0JLmlycV9oYW5kbGVyCQk9IGF0YV9pbnRlcnJ1cHQsCiAJLmlycV9jbGVhcgkJPSBhdGFfYm1kbWFfaXJxX2NsZWFyLAogCS5pcnFfb24JCQk9IGF0YV9pcnFfb24sCiAJLmlycV9hY2sJCT0gYXRhX2lycV9hY2ssCkBAIC0yMDUsOTEgKzE5MywxMDQgQEAKIAkucG9ydF9zdGFydAkJPSBhdGFfcG9ydF9zdGFydCwKIH07CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IGNzNTUyMF9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBjczU1MjBfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKIHsKKwlzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBwaSA9IHsKKwkJLmZsYWdzCQk9IEFUQV9GTEFHX1NMQVZFX1BPU1MsCisJCS5waW9fbWFzawk9IDB4MWYsCisJCS5wb3J0X29wcwk9ICZjczU1MjBfcG9ydF9vcHMsCisJfTsKKwljb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqcHBpWzJdOwogCXU4IHBjaWNmZzsKLQl2b2lkIF9faW9tZW0gKmlvbWFwWzVdOwotCXN0YXRpYyBzdHJ1Y3QgYXRhX3Byb2JlX2VudCBwcm9iZVsyXTsKLQlpbnQgcG9ydHMgPSAwOworCXZvaWQgKmlvbWFwWzVdOworCXN0cnVjdCBhdGFfaG9zdCAqaG9zdDsKKwlzdHJ1Y3QgYXRhX2lvcG9ydHMgKmlvYWRkcjsKKwlpbnQgaSwgcmM7CiAKIAkvKiBJREUgcG9ydCBlbmFibGUgYml0cyAqLwotCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgMHg2MCwgJnBjaWNmZyk7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgMHg2MCwgJnBjaWNmZyk7CiAKIAkvKiBDaGVjayBpZiB0aGUgQVRBIHBvcnRzIGFyZSBlbmFibGVkICovCiAJaWYgKChwY2ljZmcgJiAzKSA9PSAwKQogCQlyZXR1cm4gLUVOT0RFVjsKIAorCXBwaVswXSA9IHBwaVsxXSA9ICZhdGFfZHVtbXlfcG9ydF9pbmZvOworCWlmIChwY2ljZmcgJiAxKQorCQlwcGlbMF0gPSAmcGk7CisJaWYgKHBjaWNmZyAmIDIpCisJCXBwaVsxXSA9ICZwaTsKKwogCWlmICgocGNpY2ZnICYgMHg0MCkgPT0gMCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9OQU1FICI6IERNQSBtb2RlIGRpc2FibGVkLiBFbmFibGluZy5cbiIpOwotCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDYwLCBwY2ljZmcgfCAweDQwKTsKKwkJZGV2X3ByaW50ayhLRVJOX1dBUk5JTkcsICZwZGV2LT5kZXYsCisJCQkgICAiRE1BIG1vZGUgZGlzYWJsZWQuIEVuYWJsaW5nLlxuIik7CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCAweDYwLCBwY2ljZmcgfCAweDQwKTsKIAl9CiAKKwlwaS5td2RtYV9tYXNrID0gaWQtPmRyaXZlcl9kYXRhOworCisJaG9zdCA9IGF0YV9ob3N0X2FsbG9jX3BpbmZvKCZwZGV2LT5kZXYsIHBwaSwgMik7CisJaWYgKCFob3N0KQorCQlyZXR1cm4gLUVOT01FTTsKKwogCS8qIFBlcmZvcm0gc2V0IHVwIGZvciBETUEgKi8KLQlpZiAocGNpX2VuYWJsZV9kZXZpY2VfYmFycyhkZXYsIDE8PDIpKSB7CisJaWYgKHBjaV9lbmFibGVfZGV2aWNlX2JhcnMocGRldiwgMTw8MikpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FICI6IHVuYWJsZSB0byBjb25maWd1cmUgQkFSMi5cbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9Ci0JcGNpX3NldF9tYXN0ZXIoZGV2KTsKLQlpZiAocGNpX3NldF9kbWFfbWFzayhkZXYsIERNQV8zMkJJVF9NQVNLKSkgeworCisJaWYgKHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BXzMyQklUX01BU0spKSB7CiAJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRSAiOiB1bmFibGUgdG8gY29uZmlndXJlIERNQSBtYXNrLlxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KLQlpZiAocGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKGRldiwgRE1BXzMyQklUX01BU0spKSB7CisJaWYgKHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBETUFfMzJCSVRfTUFTSykpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FICI6IHVuYWJsZSB0byBjb25maWd1cmUgY29uc2lzdGVudCBETUEgbWFzay5cbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQkvKiBNYXAgSU8gcG9ydHMgKi8KLQlpb21hcFswXSA9IGRldm1faW9wb3J0X21hcCgmZGV2LT5kZXYsIDB4MUYwLCA4KTsKLQlpb21hcFsxXSA9IGRldm1faW9wb3J0X21hcCgmZGV2LT5kZXYsIDB4M0Y2LCAxKTsKLQlpb21hcFsyXSA9IGRldm1faW9wb3J0X21hcCgmZGV2LT5kZXYsIDB4MTcwLCA4KTsKLQlpb21hcFszXSA9IGRldm1faW9wb3J0X21hcCgmZGV2LT5kZXYsIDB4Mzc2LCAxKTsKLQlpb21hcFs0XSA9IHBjaW1faW9tYXAoZGV2LCAyLCAwKTsKKwkvKiBNYXAgSU8gcG9ydHMgYW5kIGluaXRpYWxpemUgaG9zdCBhY2NvcmRpbmdseSAqLworCWlvbWFwWzBdID0gZGV2bV9pb3BvcnRfbWFwKCZwZGV2LT5kZXYsIDB4MUYwLCA4KTsKKwlpb21hcFsxXSA9IGRldm1faW9wb3J0X21hcCgmcGRldi0+ZGV2LCAweDNGNiwgMSk7CisJaW9tYXBbMl0gPSBkZXZtX2lvcG9ydF9tYXAoJnBkZXYtPmRldiwgMHgxNzAsIDgpOworCWlvbWFwWzNdID0gZGV2bV9pb3BvcnRfbWFwKCZwZGV2LT5kZXYsIDB4Mzc2LCAxKTsKKwlpb21hcFs0XSA9IHBjaW1faW9tYXAocGRldiwgMiwgMCk7CiAKIAlpZiAoIWlvbWFwWzBdIHx8ICFpb21hcFsxXSB8fCAhaW9tYXBbMl0gfHwgIWlvbWFwWzNdIHx8ICFpb21hcFs0XSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQkvKiBXZSBoYXZlIHRvIGRvIG91ciBvd24gcGx1bWJpbmcgYXMgdGhlIFBDSSBzZXR1cCBmb3IgdGhpcwotCSAgIGNoaXBzZXQgaXMgbm9uLXN0YW5kYXJkIHNvIHdlIGNhbid0IHB1bnQgdG8gdGhlIGxpYmF0YSBjb2RlICovCisJaW9hZGRyID0gJmhvc3QtPnBvcnRzWzBdLT5pb2FkZHI7CisJaW9hZGRyLT5jbWRfYWRkciA9IGlvbWFwWzBdOworCWlvYWRkci0+Y3RsX2FkZHIgPSBpb21hcFsxXTsKKwlpb2FkZHItPmFsdHN0YXR1c19hZGRyID0gaW9tYXBbMV07CisJaW9hZGRyLT5ibWRtYV9hZGRyID0gaW9tYXBbNF07CisJYXRhX3N0ZF9wb3J0cyhpb2FkZHIpOwogCi0JSU5JVF9MSVNUX0hFQUQoJnByb2JlWzBdLm5vZGUpOwotCXByb2JlWzBdLmRldiA9IHBjaV9kZXZfdG9fZGV2KGRldik7Ci0JcHJvYmVbMF0ucG9ydF9vcHMgPSAmY3M1NTIwX3BvcnRfb3BzOwotCXByb2JlWzBdLnNodCA9ICZjczU1MjBfc2h0OwotCXByb2JlWzBdLnBpb19tYXNrID0gMHgxRjsKLQlwcm9iZVswXS5td2RtYV9tYXNrID0gaWQtPmRyaXZlcl9kYXRhOwotCXByb2JlWzBdLmlycSA9IDE0OwotCXByb2JlWzBdLmlycV9mbGFncyA9IDA7Ci0JcHJvYmVbMF0ucG9ydF9mbGFncyA9IEFUQV9GTEFHX1NMQVZFX1BPU1N8QVRBX0ZMQUdfU1JTVDsKLQlwcm9iZVswXS5uX3BvcnRzID0gMTsKLQlwcm9iZVswXS5wb3J0WzBdLmNtZF9hZGRyID0gaW9tYXBbMF07Ci0JcHJvYmVbMF0ucG9ydFswXS5jdGxfYWRkciA9IGlvbWFwWzFdOwotCXByb2JlWzBdLnBvcnRbMF0uYWx0c3RhdHVzX2FkZHIgPSBpb21hcFsxXTsKLQlwcm9iZVswXS5wb3J0WzBdLmJtZG1hX2FkZHIgPSBpb21hcFs0XTsKKwlpb2FkZHIgPSAmaG9zdC0+cG9ydHNbMV0tPmlvYWRkcjsKKwlpb2FkZHItPmNtZF9hZGRyID0gaW9tYXBbMl07CisJaW9hZGRyLT5jdGxfYWRkciA9IGlvbWFwWzNdOworCWlvYWRkci0+YWx0c3RhdHVzX2FkZHIgPSBpb21hcFszXTsKKwlpb2FkZHItPmJtZG1hX2FkZHIgPSBpb21hcFs0XSArIDg7CisJYXRhX3N0ZF9wb3J0cyhpb2FkZHIpOwogCi0JLyogVGhlIHNlY29uZGFyeSBsdXJrcyBhdCBkaWZmZXJlbnQgYWRkcmVzc2VzIGJ1dCBpcyBvdGhlcndpc2UKLQkgICB0aGUgc2FtZSBiZWFzdGllICovCisJLyogYWN0aXZhdGUgdGhlIGhvc3QgKi8KKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKwlyYyA9IGF0YV9ob3N0X3N0YXJ0KGhvc3QpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOwogCi0JcHJvYmVbMV0gPSBwcm9iZVswXTsKLQlJTklUX0xJU1RfSEVBRCgmcHJvYmVbMV0ubm9kZSk7Ci0JcHJvYmVbMV0uaXJxID0gMTU7Ci0JcHJvYmVbMV0ucG9ydFswXS5jbWRfYWRkciA9IGlvbWFwWzJdOwotCXByb2JlWzFdLnBvcnRbMF0uY3RsX2FkZHIgPSBpb21hcFszXTsKLQlwcm9iZVsxXS5wb3J0WzBdLmFsdHN0YXR1c19hZGRyID0gaW9tYXBbM107Ci0JcHJvYmVbMV0ucG9ydFswXS5ibWRtYV9hZGRyID0gaW9tYXBbNF0gKyA4OworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJc3RhdGljIGNvbnN0IGludCBpcnFbXSA9IHsgMTQsIDE1IH07CisJCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBob3N0LT5wb3J0c1swXTsKIAotCS8qIExldCBsaWJhdGEgZmlsbCBpbiB0aGUgcG9ydCBkZXRhaWxzICovCi0JYXRhX3N0ZF9wb3J0cygmcHJvYmVbMF0ucG9ydFswXSk7Ci0JYXRhX3N0ZF9wb3J0cygmcHJvYmVbMV0ucG9ydFswXSk7CisJCWlmIChhdGFfcG9ydF9pc19kdW1teShhcCkpCisJCQljb250aW51ZTsKIAotCS8qIE5vdyBhZGQgdGhlIHBvcnRzIHRoYXQgYXJlIGFjdGl2ZSAqLwotCWlmIChwY2ljZmcgJiAxKQotCQlwb3J0cyArPSBhdGFfZGV2aWNlX2FkZCgmcHJvYmVbMF0pOwotCWlmIChwY2ljZmcgJiAyKQotCQlwb3J0cyArPSBhdGFfZGV2aWNlX2FkZCgmcHJvYmVbMV0pOwotCWlmIChwb3J0cykKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIC1FTk9ERVY7CisJCXJjID0gZGV2bV9yZXF1ZXN0X2lycSgmcGRldi0+ZGV2LCBpcnFbYXAtPnBvcnRfbm9dLAorCQkJCSAgICAgIGF0YV9pbnRlcnJ1cHQsIDAsIERSVl9OQU1FLCBob3N0KTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOworCX0KKworCXJldHVybiBhdGFfaG9zdF9yZWdpc3Rlcihob3N0LCAmY3M1NTIwX3NodCk7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9jczU1MzAuYyBiL2RyaXZlcnMvYXRhL3BhdGFfY3M1NTMwLmMKaW5kZXggZGI2M2U4MC4uMjk2NDJkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9jczU1MzAuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX2NzNTUzMC5jCkBAIC0xNjAsMTggKzE2MCw2IEBACiAJcmV0dXJuIGF0YV9xY19pc3N1ZV9wcm90KHFjKTsKIH0KIAotc3RhdGljIGludCBjczU1MzBfcHJlX3Jlc2V0KHN0cnVjdCBhdGFfcG9ydCAqYXApCi17Ci0JYXAtPmNibCA9IEFUQV9DQkxfUEFUQTQwOwotCXJldHVybiBhdGFfc3RkX3ByZXJlc2V0KGFwKTsKLX0KLQotc3RhdGljIHZvaWQgY3M1NTMwX2Vycm9yX2hhbmRsZXIoc3RydWN0IGF0YV9wb3J0ICphcCkKLXsKLQlyZXR1cm4gYXRhX2JtZG1hX2RyaXZlX2VoKGFwLCBjczU1MzBfcHJlX3Jlc2V0LCBhdGFfc3RkX3NvZnRyZXNldCwgTlVMTCwgYXRhX3N0ZF9wb3N0cmVzZXQpOwotfQotCi0KIHN0YXRpYyBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIGNzNTUzMF9zaHQgPSB7CiAJLm1vZHVsZQkJCT0gVEhJU19NT0RVTEUsCiAJLm5hbWUJCQk9IERSVl9OQU1FLApAQCAtMjEzLDggKzIwMSw5IEBACiAKIAkuZnJlZXplCQk9IGF0YV9ibWRtYV9mcmVlemUsCiAJLnRoYXcJCT0gYXRhX2JtZG1hX3RoYXcsCi0JLmVycm9yX2hhbmRsZXIJPSBjczU1MzBfZXJyb3JfaGFuZGxlciwKKwkuZXJyb3JfaGFuZGxlcgk9IGF0YV9ibWRtYV9lcnJvcl9oYW5kbGVyLAogCS5wb3N0X2ludGVybmFsX2NtZCA9IGF0YV9ibWRtYV9wb3N0X2ludGVybmFsX2NtZCwKKwkuY2FibGVfZGV0ZWN0CT0gYXRhX2NhYmxlXzQwd2lyZSwKIAogCS5xY19wcmVwIAk9IGF0YV9xY19wcmVwLAogCS5xY19pc3N1ZQk9IGNzNTUzMF9xY19pc3N1ZV9wcm90LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9jczU1MzUuYyBiL2RyaXZlcnMvYXRhL3BhdGFfY3M1NTM1LmMKaW5kZXggMTU3MmU1Yy4uMDhjY2NjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9jczU1MzUuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX2NzNTUzNS5jCkBAIC03MCwzNiArNzAsMjMgQEAKICNkZWZpbmUgQ1M1NTM1X0JBRF9QSU8odGltaW5ncykgKCAodGltaW5ncyZ+MHg4MDAwMDAwMFVMKT09MHgwMDAwOTE3MiApCiAKIC8qKgotICoJY3M1NTM1X3ByZV9yZXNldAktCWRldGVjdCBjYWJsZSB0eXBlCisgKgljczU1MzVfY2FibGVfZGV0ZWN0CS0JZGV0ZWN0IGNhYmxlIHR5cGUKICAqCUBhcDogUG9ydCB0byBkZXRlY3Qgb24KICAqCiAgKglQZXJmb3JtIGNhYmxlIGRldGVjdGlvbiBmb3IgQVRBNjYgY2FwYWJsZSBjYWJsZS4gUmV0dXJuIGEgbGliYXRhCiAgKgljYWJsZSB0eXBlLgogICovCiAKLXN0YXRpYyBpbnQgY3M1NTM1X3ByZV9yZXNldChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQorc3RhdGljIGludCBjczU1MzVfY2FibGVfZGV0ZWN0KHN0cnVjdCBhdGFfcG9ydCAqYXApCiB7CiAJdTggY2FibGU7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGFwLT5ob3N0LT5kZXYpOwogCiAJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgQ1M1NTM1X0NBQkxFX0RFVEVDVCwgJmNhYmxlKTsKIAlpZiAoY2FibGUgJiAxKQotCQlhcC0+Y2JsID0gQVRBX0NCTF9QQVRBODA7CisJCXJldHVybiBBVEFfQ0JMX1BBVEE4MDsKIAllbHNlCi0JCWFwLT5jYmwgPSBBVEFfQ0JMX1BBVEE0MDsKLQlyZXR1cm4gYXRhX3N0ZF9wcmVyZXNldChhcCk7Ci19Ci0KLS8qKgotICoJY3M1NTM1X2Vycm9yX2hhbmRsZXIJCS0JcmVzZXQvcHJvYmUKLSAqCUBhcDogUG9ydCB0byByZXNldAotICoKLSAqCVJlc2V0IGFuZCBjb25maWd1cmUgYSBwb3J0Ci0gKi8KLQotc3RhdGljIHZvaWQgY3M1NTM1X2Vycm9yX2hhbmRsZXIoc3RydWN0IGF0YV9wb3J0ICphcCkKLXsKLQlhdGFfYm1kbWFfZHJpdmVfZWgoYXAsIGNzNTUzNV9wcmVfcmVzZXQsIGF0YV9zdGRfc29mdHJlc2V0LCBOVUxMLCBhdGFfc3RkX3Bvc3RyZXNldCk7CisJCXJldHVybiBBVEFfQ0JMX1BBVEE0MDsKIH0KIAogLyoqCkBAIC0yMDUsOCArMTkyLDkgQEAKIAogCS5mcmVlemUJCT0gYXRhX2JtZG1hX2ZyZWV6ZSwKIAkudGhhdwkJPSBhdGFfYm1kbWFfdGhhdywKLQkuZXJyb3JfaGFuZGxlcgk9IGNzNTUzNV9lcnJvcl9oYW5kbGVyLAorCS5lcnJvcl9oYW5kbGVyCT0gYXRhX2JtZG1hX2Vycm9yX2hhbmRsZXIsCiAJLnBvc3RfaW50ZXJuYWxfY21kID0gYXRhX2JtZG1hX3Bvc3RfaW50ZXJuYWxfY21kLAorCS5jYWJsZV9kZXRlY3QJPSBjczU1MzVfY2FibGVfZGV0ZWN0LAogCiAJLmJtZG1hX3NldHVwIAk9IGF0YV9ibWRtYV9zZXR1cCwKIAkuYm1kbWFfc3RhcnQgCT0gYXRhX2JtZG1hX3N0YXJ0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9jeXByZXNzLmMgYi9kcml2ZXJzL2F0YS9wYXRhX2N5cHJlc3MuYwppbmRleCBmNjlkZGU1Li42ZWMwNDljIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX2N5cHJlc3MuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX2N5cHJlc3MuYwpAQCAtNDEsMTcgKzQxLDYgQEAKIAlDWTgyX0lOREVYX1RJTUVPVVQJPSAweDMyCiB9OwogCi1zdGF0aWMgaW50IGN5ODJjNjkzX3ByZV9yZXNldChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQotewotCWFwLT5jYmwgPSBBVEFfQ0JMX1BBVEE0MDsKLQlyZXR1cm4gYXRhX3N0ZF9wcmVyZXNldChhcCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGN5ODJjNjkzX2Vycm9yX2hhbmRsZXIoc3RydWN0IGF0YV9wb3J0ICphcCkKLXsKLQlhdGFfYm1kbWFfZHJpdmVfZWgoYXAsIGN5ODJjNjkzX3ByZV9yZXNldCwgYXRhX3N0ZF9zb2Z0cmVzZXQsIE5VTEwsIGF0YV9zdGRfcG9zdHJlc2V0KTsKLX0KLQogLyoqCiAgKgljeTgyYzY5M19zZXRfcGlvbW9kZQktCXNldCBpbml0aWFsIFBJTyBtb2RlIGRhdGEKICAqCUBhcDogQVRBIGludGVyZmFjZQpAQCAtMTU2LDggKzE0NSw5IEBACiAKIAkuZnJlZXplCQk9IGF0YV9ibWRtYV9mcmVlemUsCiAJLnRoYXcJCT0gYXRhX2JtZG1hX3RoYXcsCi0JLmVycm9yX2hhbmRsZXIJPSBjeTgyYzY5M19lcnJvcl9oYW5kbGVyLAorCS5lcnJvcl9oYW5kbGVyCT0gYXRhX2JtZG1hX2Vycm9yX2hhbmRsZXIsCiAJLnBvc3RfaW50ZXJuYWxfY21kID0gYXRhX2JtZG1hX3Bvc3RfaW50ZXJuYWxfY21kLAorCS5jYWJsZV9kZXRlY3QJPSBhdGFfY2FibGVfNDB3aXJlLAogCiAJLmJtZG1hX3NldHVwIAk9IGF0YV9ibWRtYV9zZXR1cCwKIAkuYm1kbWFfc3RhcnQgCT0gYXRhX2JtZG1hX3N0YXJ0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9lZmFyLmMgYi9kcml2ZXJzL2F0YS9wYXRhX2VmYXIuYwppbmRleCBkYWM3YTY1Li5hMzIxNjg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX2VmYXIuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX2VmYXIuYwpAQCAtMjIsMTAgKzIyLDEwIEBACiAjaW5jbHVkZSA8bGludXgvYXRhLmg+CiAKICNkZWZpbmUgRFJWX05BTUUJInBhdGFfZWZhciIKLSNkZWZpbmUgRFJWX1ZFUlNJT04JIjAuNC4zIgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMC40LjQiCiAKIC8qKgotICoJZWZhcl9wcmVfcmVzZXQJLQljaGVjayBmb3IgNDAvODAgcGluCisgKgllZmFyX3ByZV9yZXNldAktCUVuYWJsZSBiaXRzCiAgKglAYXA6IFBvcnQKICAqCiAgKglQZXJmb3JtIGNhYmxlIGRldGVjdGlvbiBmb3IgdGhlIEVGQVIgQVRBIGludGVyZmFjZS4gVGhpcyBpcwpAQCAtMzgsMTggKzM4LDExIEBACiAJCXsgMHg0MVUsIDFVLCAweDgwVUwsIDB4ODBVTCB9LAkvKiBwb3J0IDAgKi8KIAkJeyAweDQzVSwgMVUsIDB4ODBVTCwgMHg4MFVMIH0sCS8qIHBvcnQgMSAqLwogCX07Ci0KIAlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoYXAtPmhvc3QtPmRldik7Ci0JdTggdG1wOwogCiAJaWYgKCFwY2lfdGVzdF9jb25maWdfYml0cyhwZGV2LCAmZWZhcl9lbmFibGVfYml0c1thcC0+cG9ydF9ub10pKQogCQlyZXR1cm4gLUVOT0VOVDsKIAotCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIDB4NDcsICZ0bXApOwotCWlmICh0bXAgJiAoMiA+PiBhcC0+cG9ydF9ubykpCi0JCWFwLT5jYmwgPSBBVEFfQ0JMX1BBVEE0MDsKLQllbHNlCi0JCWFwLT5jYmwgPSBBVEFfQ0JMX1BBVEE4MDsKIAlyZXR1cm4gYXRhX3N0ZF9wcmVyZXNldChhcCk7CiB9CiAKQEAgLTY3LDYgKzYwLDI1IEBACiB9CiAKIC8qKgorICoJZWZhcl9jYWJsZV9kZXRlY3QJLQljaGVjayBmb3IgNDAvODAgcGluCisgKglAYXA6IFBvcnQKKyAqCisgKglQZXJmb3JtIGNhYmxlIGRldGVjdGlvbiBmb3IgdGhlIEVGQVIgQVRBIGludGVyZmFjZS4gVGhpcyBpcworICoJZGlmZmVyZW50IHRvIHRoZSBQSUlYIGFycmFuZ2VtZW50CisgKi8KKworc3RhdGljIGludCBlZmFyX2NhYmxlX2RldGVjdChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihhcC0+aG9zdC0+ZGV2KTsKKwl1OCB0bXA7CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCAweDQ3LCAmdG1wKTsKKwlpZiAodG1wICYgKDIgPj4gYXAtPnBvcnRfbm8pKQorCQlyZXR1cm4gQVRBX0NCTF9QQVRBNDA7CisJcmV0dXJuIEFUQV9DQkxfUEFUQTgwOworfQorCisvKioKICAqCWVmYXJfc2V0X3Bpb21vZGUgLSBJbml0aWFsaXplIGhvc3QgY29udHJvbGxlciBQQVRBIFBJTyB0aW1pbmdzCiAgKglAYXA6IFBvcnQgd2hvc2UgdGltaW5ncyB3ZSBhcmUgY29uZmlndXJpbmcKICAqCUBhZGV2OiB1bQpAQCAtMjU2LDYgKzI2OCw3IEBACiAJLnRoYXcJCQk9IGF0YV9ibWRtYV90aGF3LAogCS5lcnJvcl9oYW5kbGVyCQk9IGVmYXJfZXJyb3JfaGFuZGxlciwKIAkucG9zdF9pbnRlcm5hbF9jbWQJPSBhdGFfYm1kbWFfcG9zdF9pbnRlcm5hbF9jbWQsCisJLmNhYmxlX2RldGVjdAkJPSBlZmFyX2NhYmxlX2RldGVjdCwKIAogCS5ibWRtYV9zZXR1cAkJPSBhdGFfYm1kbWFfc2V0dXAsCiAJLmJtZG1hX3N0YXJ0CQk9IGF0YV9ibWRtYV9zdGFydCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfaHB0MzY2LmMgYi9kcml2ZXJzL2F0YS9wYXRhX2hwdDM2Ni5jCmluZGV4IGJhZjM1ZjguLjkzY2ZhNmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfaHB0MzY2LmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9ocHQzNjYuYwpAQCAtMjcsNyArMjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpYmF0YS5oPgogCiAjZGVmaW5lIERSVl9OQU1FCSJwYXRhX2hwdDM2NiIKLSNkZWZpbmUgRFJWX1ZFUlNJT04JIjAuNi4wIgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMC42LjEiCiAKIHN0cnVjdCBocHRfY2xvY2sgewogCXU4CXhmZXJfc3BlZWQ7CkBAIC0xNjksMTMgKzE2OSwxMiBAQAogCiAvKioKICAqCWhwdDM2Nl9maWx0ZXIJLQltb2RlIHNlbGVjdGlvbiBmaWx0ZXIKLSAqCUBhcDogQVRBIGludGVyZmFjZQogICoJQGFkZXY6IEFUQSBkZXZpY2UKICAqCiAgKglCbG9jayBVRE1BIG9uIGRldmljZXMgdGhhdCBjYXVzZSB0cm91YmxlIHdpdGggdGhpcyBjb250cm9sbGVyLgogICovCiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGhwdDM2Nl9maWx0ZXIoY29uc3Qgc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV9kZXZpY2UgKmFkZXYsIHVuc2lnbmVkIGxvbmcgbWFzaykKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGhwdDM2Nl9maWx0ZXIoc3RydWN0IGF0YV9kZXZpY2UgKmFkZXYsIHVuc2lnbmVkIGxvbmcgbWFzaykKIHsKIAlpZiAoYWRldi0+Y2xhc3MgPT0gQVRBX0RFVl9BVEEpIHsKIAkJaWYgKGhwdF9kbWFfYmxhY2tsaXN0ZWQoYWRldiwgIlVETUEiLCAgYmFkX2F0YTMzKSkKQEAgLTE4NSw3ICsxODQsNyBAQAogCQlpZiAoaHB0X2RtYV9ibGFja2xpc3RlZChhZGV2LCAiVURNQTQiLCBiYWRfYXRhNjZfNCkpCiAJCQltYXNrICY9IH4oMHgwRiA8PCBBVEFfU0hJRlRfVURNQSk7CiAJfQotCXJldHVybiBhdGFfcGNpX2RlZmF1bHRfZmlsdGVyKGFwLCBhZGV2LCBtYXNrKTsKKwlyZXR1cm4gYXRhX3BjaV9kZWZhdWx0X2ZpbHRlcihhZGV2LCBtYXNrKTsKIH0KIAogLyoqCkBAIC0yMTAsMjQgKzIwOSwyOCBAQAogCXJldHVybiAweGZmZmZmZmZmVTsJLyogc2lsZW5jZSBjb21waWxlciB3YXJuaW5nICovCiB9CiAKK3N0YXRpYyBpbnQgaHB0MzZ4X2NhYmxlX2RldGVjdChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCXU4IGF0YTY2OworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihhcC0+aG9zdC0+ZGV2KTsKKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIDB4NUEsICZhdGE2Nik7CisJaWYgKGF0YTY2ICYgKDEgPDwgYXAtPnBvcnRfbm8pKQorCQlyZXR1cm4gQVRBX0NCTF9QQVRBNDA7CisJcmV0dXJuIEFUQV9DQkxfUEFUQTgwOworfQorCiBzdGF0aWMgaW50IGhwdDM2eF9wcmVfcmVzZXQoc3RydWN0IGF0YV9wb3J0ICphcCkKIHsKIAlzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9iaXRzIGhwdDM2eF9lbmFibGVfYml0c1tdID0gewogCQl7IDB4NTAsIDEsIDB4MDQsIDB4MDQgfSwKIAkJeyAweDU0LCAxLCAweDA0LCAweDA0IH0KIAl9OwotCi0JdTggYXRhNjY7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGFwLT5ob3N0LT5kZXYpOwogCiAJaWYgKCFwY2lfdGVzdF9jb25maWdfYml0cyhwZGV2LCAmaHB0MzZ4X2VuYWJsZV9iaXRzW2FwLT5wb3J0X25vXSkpCiAJCXJldHVybiAtRU5PRU5UOwogCi0JcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgMHg1QSwgJmF0YTY2KTsKLQlpZiAoYXRhNjYgJiAoMSA8PCBhcC0+cG9ydF9ubykpCi0JCWFwLT5jYmwgPSBBVEFfQ0JMX1BBVEE0MDsKLQllbHNlCi0JCWFwLT5jYmwgPSBBVEFfQ0JMX1BBVEE4MDsKIAlyZXR1cm4gYXRhX3N0ZF9wcmVyZXNldChhcCk7CiB9CiAKQEAgLTM1NCw2ICszNTcsNyBAQAogCS50aGF3CQk9IGF0YV9ibWRtYV90aGF3LAogCS5lcnJvcl9oYW5kbGVyCT0gaHB0MzZ4X2Vycm9yX2hhbmRsZXIsCiAJLnBvc3RfaW50ZXJuYWxfY21kID0gYXRhX2JtZG1hX3Bvc3RfaW50ZXJuYWxfY21kLAorCS5jYWJsZV9kZXRlY3QJPSBocHQzNnhfY2FibGVfZGV0ZWN0LAogCiAJLmJtZG1hX3NldHVwIAk9IGF0YV9ibWRtYV9zZXR1cCwKIAkuYm1kbWFfc3RhcnQgCT0gYXRhX2JtZG1hX3N0YXJ0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9ocHQzN3guYyBiL2RyaXZlcnMvYXRhL3BhdGFfaHB0Mzd4LmMKaW5kZXggZjMzMWVlZS4uNDFkODMxMjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfaHB0Mzd4LmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9ocHQzN3guYwpAQCAtOCw2ICs4LDcgQEAKICAqIENvcHlyaWdodCAoQykgMTk5OS0yMDAzCQlBbmRyZSBIZWRyaWNrIDxhbmRyZUBsaW51eC1pZGUub3JnPgogICogUG9ydGlvbnMgQ29weXJpZ2h0IChDKSAyMDAxCSAgICAgICAgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgogICogUG9ydGlvbnMgQ29weXJpZ2h0IChDKSAyMDAzCQlSZWQgSGF0IEluYworICogUG9ydGlvbnMgQ29weXJpZ2h0IChDKSAyMDA1LTIwMDYJTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgogICoKICAqIFRPRE8KICAqCVBMTCBtb2RlCkBAIC0yNSw3ICsyNiw3IEBACiAjaW5jbHVkZSA8bGludXgvbGliYXRhLmg+CiAKICNkZWZpbmUgRFJWX05BTUUJInBhdGFfaHB0Mzd4IgotI2RlZmluZSBEUlZfVkVSU0lPTgkiMC42LjAiCisjZGVmaW5lIERSVl9WRVJTSU9OCSIwLjYuNSIKIAogc3RydWN0IGhwdF9jbG9jayB7CiAJdTgJeGZlcl9zcGVlZDsKQEAgLTYxLDIwMSArNjIsNzUgQEAKICAqIDMxICAgICBGSUZPIGVuYWJsZS4KICAqLwogCi0vKiBmcm9tIGhpZ2hwb2ludCBkb2N1bWVudGF0aW9uLiB0aGVzZSBhcmUgb2xkIHZhbHVlcyAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBocHRfY2xvY2sgaHB0MzcwX3RpbWluZ3NfMzNbXSA9IHsKLS8qCXsJWEZFUl9VRE1BXzUsCTB4MUE4NUY0NDIsCTB4MTY0NTRlMzEJfSwgKi8KLQl7CVhGRVJfVURNQV81LAkweDE2NDU0ZTMxCX0sCi0JewlYRkVSX1VETUFfNCwJMHgxNjQ1NGUzMQl9LAotCXsJWEZFUl9VRE1BXzMsCTB4MTY2ZDRlMzEJfSwKLQl7CVhGRVJfVURNQV8yLAkweDE2NDk0ZTMxCX0sCi0JewlYRkVSX1VETUFfMSwJMHgxNjRkNGUzMQl9LAotCXsJWEZFUl9VRE1BXzAsCTB4MTY1MTRlMzEJfSwKK3N0YXRpYyBzdHJ1Y3QgaHB0X2Nsb2NrIGhwdDM3eF90aW1pbmdzXzMzW10gPSB7CisJeyBYRkVSX1VETUFfNiwJCTB4MTI0NDYyMzEgfSwJLyogMHgxMjY0NjIzMSA/PyAqLworCXsgWEZFUl9VRE1BXzUsCQkweDEyNDQ2MjMxIH0sCisJeyBYRkVSX1VETUFfNCwJCTB4MTI0NDYyMzEgfSwKKwl7IFhGRVJfVURNQV8zLAkJMHgxMjZjNjIzMSB9LAorCXsgWEZFUl9VRE1BXzIsCQkweDEyNDg2MjMxIH0sCisJeyBYRkVSX1VETUFfMSwJCTB4MTI0YzYyMzMgfSwKKwl7IFhGRVJfVURNQV8wLAkJMHgxMjUwNjI5NyB9LAogCi0JewlYRkVSX01XX0RNQV8yLAkweDI2NTE0ZTIxCX0sCi0JewlYRkVSX01XX0RNQV8xLAkweDI2NTE0ZTMzCX0sCi0JewlYRkVSX01XX0RNQV8wLAkweDI2NTE0ZTk3CX0sCisJeyBYRkVSX01XX0RNQV8yLAkweDIyNDA2YzMxIH0sCisJeyBYRkVSX01XX0RNQV8xLAkweDIyNDA2YzMzIH0sCisJeyBYRkVSX01XX0RNQV8wLAkweDIyNDA2Yzk3IH0sCiAKLQl7CVhGRVJfUElPXzQsCTB4MDY1MTRlMjEJfSwKLQl7CVhGRVJfUElPXzMsCTB4MDY1MTRlMjIJfSwKLQl7CVhGRVJfUElPXzIsCTB4MDY1MTRlMzMJfSwKLQl7CVhGRVJfUElPXzEsCTB4MDY5MTRlNDMJfSwKLQl7CVhGRVJfUElPXzAsCTB4MDY5MTRlNTcJfSwKLQl7CTAsCQkweDA2NTE0ZTU3CX0KKwl7IFhGRVJfUElPXzQsCQkweDA2NDE0ZTMxIH0sCisJeyBYRkVSX1BJT18zLAkJMHgwNjQxNGU0MiB9LAorCXsgWEZFUl9QSU9fMiwJCTB4MDY0MTRlNTMgfSwKKwl7IFhGRVJfUElPXzEsCQkweDA2ODE0ZTkzIH0sCisJeyBYRkVSX1BJT18wLAkJMHgwNjgxNGVhNyB9CiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhwdF9jbG9jayBocHQzNzBfdGltaW5nc182NltdID0gewotCXsJWEZFUl9VRE1BXzUsCTB4MTQ4NDYyMzEJfSwKLQl7CVhGRVJfVURNQV80LAkweDE0ODg2MjMxCX0sCi0JewlYRkVSX1VETUFfMywJMHgxNDhjNjIzMQl9LAotCXsJWEZFUl9VRE1BXzIsCTB4MTQ4YzYyMzEJfSwKLQl7CVhGRVJfVURNQV8xLAkweDE0OTA2MjMxCX0sCi0JewlYRkVSX1VETUFfMCwJMHgxNDk4NjIzMQl9LAorc3RhdGljIHN0cnVjdCBocHRfY2xvY2sgaHB0Mzd4X3RpbWluZ3NfNTBbXSA9IHsKKwl7IFhGRVJfVURNQV82LAkJMHgxMjg0ODI0MiB9LAorCXsgWEZFUl9VRE1BXzUsCQkweDEyODQ4MjQyIH0sCisJeyBYRkVSX1VETUFfNCwJCTB4MTJhYzgyNDIgfSwKKwl7IFhGRVJfVURNQV8zLAkJMHgxMjhjODI0MiB9LAorCXsgWEZFUl9VRE1BXzIsCQkweDEyMGM4MjQyIH0sCisJeyBYRkVSX1VETUFfMSwJCTB4MTIxNDgyNTQgfSwKKwl7IFhGRVJfVURNQV8wLAkJMHgxMjE4ODJlYSB9LAogCi0JewlYRkVSX01XX0RNQV8yLAkweDI2NTE0ZTIxCX0sCi0JewlYRkVSX01XX0RNQV8xLAkweDI2NTE0ZTMzCX0sCi0JewlYRkVSX01XX0RNQV8wLAkweDI2NTE0ZTk3CX0sCisJeyBYRkVSX01XX0RNQV8yLAkweDIyODA4MjQyIH0sCisJeyBYRkVSX01XX0RNQV8xLAkweDIyODA4MjU0IH0sCisJeyBYRkVSX01XX0RNQV8wLAkweDIyODA4MmVhIH0sCiAKLQl7CVhGRVJfUElPXzQsCTB4MDY1MTRlMjEJfSwKLQl7CVhGRVJfUElPXzMsCTB4MDY1MTRlMjIJfSwKLQl7CVhGRVJfUElPXzIsCTB4MDY1MTRlMzMJfSwKLQl7CVhGRVJfUElPXzEsCTB4MDY5MTRlNDMJfSwKLQl7CVhGRVJfUElPXzAsCTB4MDY5MTRlNTcJfSwKLQl7CTAsCQkweDA2NTE0ZTU3CX0KKwl7IFhGRVJfUElPXzQsCQkweDBhODFmNDQyIH0sCisJeyBYRkVSX1BJT18zLAkJMHgwYTgxZjQ0MyB9LAorCXsgWEZFUl9QSU9fMiwJCTB4MGE4MWY0NTQgfSwKKwl7IFhGRVJfUElPXzEsCQkweDBhYzFmNDY1IH0sCisJeyBYRkVSX1BJT18wLAkJMHgwYWMxZjQ4YSB9CiB9OwogCi0vKiB0aGVzZSBhcmUgdGhlIGN1cnJlbnQgKDQgc2VwIDIwMDEpIHRpbWluZ3MgZnJvbSBoaWdocG9pbnQgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaHB0X2Nsb2NrIGhwdDM3MGFfdGltaW5nc18zM1tdID0gewotCXsJWEZFUl9VRE1BXzUsCTB4MTI0NDYyMzEJfSwKLQl7CVhGRVJfVURNQV80LAkweDEyNDQ2MjMxCX0sCi0JewlYRkVSX1VETUFfMywJMHgxMjZjNjIzMQl9LAotCXsJWEZFUl9VRE1BXzIsCTB4MTI0ODYyMzEJfSwKLQl7CVhGRVJfVURNQV8xLAkweDEyNGM2MjMzCX0sCi0JewlYRkVSX1VETUFfMCwJMHgxMjUwNjI5Nwl9LAorc3RhdGljIHN0cnVjdCBocHRfY2xvY2sgaHB0Mzd4X3RpbWluZ3NfNjZbXSA9IHsKKwl7IFhGRVJfVURNQV82LAkJMHgxYzg2OWM2MiB9LAorCXsgWEZFUl9VRE1BXzUsCQkweDFjYWU5YzYyIH0sCS8qIDB4MWM4YTljNjIgKi8KKwl7IFhGRVJfVURNQV80LAkJMHgxYzhhOWM2MiB9LAorCXsgWEZFUl9VRE1BXzMsCQkweDFjOGU5YzYyIH0sCisJeyBYRkVSX1VETUFfMiwJCTB4MWM5MjljNjIgfSwKKwl7IFhGRVJfVURNQV8xLAkJMHgxYzlhOWM2MiB9LAorCXsgWEZFUl9VRE1BXzAsCQkweDFjODI5YzYyIH0sCiAKLQl7CVhGRVJfTVdfRE1BXzIsCTB4MjI0MDZjMzEJfSwKLQl7CVhGRVJfTVdfRE1BXzEsCTB4MjI0MDZjMzMJfSwKLQl7CVhGRVJfTVdfRE1BXzAsCTB4MjI0MDZjOTcJfSwKKwl7IFhGRVJfTVdfRE1BXzIsCTB4MmM4MjljNjIgfSwKKwl7IFhGRVJfTVdfRE1BXzEsCTB4MmM4MjljNjYgfSwKKwl7IFhGRVJfTVdfRE1BXzAsCTB4MmM4MjlkMmUgfSwKIAotCXsJWEZFUl9QSU9fNCwJMHgwNjQxNGUzMQl9LAotCXsJWEZFUl9QSU9fMywJMHgwNjQxNGU0Mgl9LAotCXsJWEZFUl9QSU9fMiwJMHgwNjQxNGU1Mwl9LAotCXsJWEZFUl9QSU9fMSwJMHgwNjgxNGU5Mwl9LAotCXsJWEZFUl9QSU9fMCwJMHgwNjgxNGVhNwl9LAotCXsJMCwJCTB4MDY4MTRlYTcJfQorCXsgWEZFUl9QSU9fNCwJCTB4MGM4MjljNjIgfSwKKwl7IFhGRVJfUElPXzMsCQkweDBjODI5Yzg0IH0sCisJeyBYRkVSX1BJT18yLAkJMHgwYzgyOWNhNiB9LAorCXsgWEZFUl9QSU9fMSwJCTB4MGQwMjlkMjYgfSwKKwl7IFhGRVJfUElPXzAsCQkweDBkMDI5ZDVlIH0KIH07CiAKLS8qIDJ4IDMzTUh6IHRpbWluZ3MgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaHB0X2Nsb2NrIGhwdDM3MGFfdGltaW5nc182NltdID0gewotCXsJWEZFUl9VRE1BXzUsCTB4MTQ4OGU2NzMJfSwKLQl7CVhGRVJfVURNQV80LAkweDE0ODhlNjczCX0sCi0JewlYRkVSX1VETUFfMywJMHgxNDk4ZTY3Mwl9LAotCXsJWEZFUl9VRE1BXzIsCTB4MTQ5MGU2NzMJfSwKLQl7CVhGRVJfVURNQV8xLAkweDE0OThlNjc3CX0sCi0JewlYRkVSX1VETUFfMCwJMHgxNGEwZTczZgl9LAotCi0JewlYRkVSX01XX0RNQV8yLAkweDI0ODBmYTczCX0sCi0JewlYRkVSX01XX0RNQV8xLAkweDI0ODBmYTc3CX0sCi0JewlYRkVSX01XX0RNQV8wLAkweDI0ODBmYjNmCX0sCi0KLQl7CVhGRVJfUElPXzQsCTB4MGM4MmJlNzMJfSwKLQl7CVhGRVJfUElPXzMsCTB4MGM4MmJlOTUJfSwKLQl7CVhGRVJfUElPXzIsCTB4MGM4MmJlYjcJfSwKLQl7CVhGRVJfUElPXzEsCTB4MGQwMmJmMzcJfSwKLQl7CVhGRVJfUElPXzAsCTB4MGQwMmJmNWYJfSwKLQl7CTAsCQkweDBkMDJiZjVmCX0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaHB0X2Nsb2NrIGhwdDM3MGFfdGltaW5nc181MFtdID0gewotCXsJWEZFUl9VRE1BXzUsCTB4MTI4NDgyNDIJfSwKLQl7CVhGRVJfVURNQV80LAkweDEyYWM4MjQyCX0sCi0JewlYRkVSX1VETUFfMywJMHgxMjhjODI0Mgl9LAotCXsJWEZFUl9VRE1BXzIsCTB4MTIwYzgyNDIJfSwKLQl7CVhGRVJfVURNQV8xLAkweDEyMTQ4MjU0CX0sCi0JewlYRkVSX1VETUFfMCwJMHgxMjE4ODJlYQl9LAotCi0JewlYRkVSX01XX0RNQV8yLAkweDIyODA4MjQyCX0sCi0JewlYRkVSX01XX0RNQV8xLAkweDIyODA4MjU0CX0sCi0JewlYRkVSX01XX0RNQV8wLAkweDIyODA4MmVhCX0sCi0KLQl7CVhGRVJfUElPXzQsCTB4MGE4MWY0NDIJfSwKLQl7CVhGRVJfUElPXzMsCTB4MGE4MWY0NDMJfSwKLQl7CVhGRVJfUElPXzIsCTB4MGE4MWY0NTQJfSwKLQl7CVhGRVJfUElPXzEsCTB4MGFjMWY0NjUJfSwKLQl7CVhGRVJfUElPXzAsCTB4MGFjMWY0OGEJfSwKLQl7CTAsCQkweDBhYzFmNDhhCX0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaHB0X2Nsb2NrIGhwdDM3Ml90aW1pbmdzXzMzW10gPSB7Ci0JewlYRkVSX1VETUFfNiwJMHgxYzgxZGM2Mgl9LAotCXsJWEZFUl9VRE1BXzUsCTB4MWM2ZGRjNjIJfSwKLQl7CVhGRVJfVURNQV80LAkweDFjOGRkYzYyCX0sCi0JewlYRkVSX1VETUFfMywJMHgxYzhlZGM2Mgl9LAkvKiBjaGVja21lICovCi0JewlYRkVSX1VETUFfMiwJMHgxYzkxZGM2Mgl9LAotCXsJWEZFUl9VRE1BXzEsCTB4MWM5YWRjNjIJfSwJLyogY2hlY2ttZSAqLwotCXsJWEZFUl9VRE1BXzAsCTB4MWM4MmRjNjIJfSwJLyogY2hlY2ttZSAqLwotCi0JewlYRkVSX01XX0RNQV8yLAkweDJjODI5MjYyCX0sCi0JewlYRkVSX01XX0RNQV8xLAkweDJjODI5MjY2CX0sCS8qIGNoZWNrbWUgKi8KLQl7CVhGRVJfTVdfRE1BXzAsCTB4MmM4MjkyMmUJfSwJLyogY2hlY2ttZSAqLwotCi0JewlYRkVSX1BJT180LAkweDBjODI5YzYyCX0sCi0JewlYRkVSX1BJT18zLAkweDBjODI5Yzg0CX0sCi0JewlYRkVSX1BJT18yLAkweDBjODI5Y2E2CX0sCi0JewlYRkVSX1BJT18xLAkweDBkMDI5ZDI2CX0sCi0JewlYRkVSX1BJT18wLAkweDBkMDI5ZDVlCX0sCi0JewkwLAkJMHgwZDAyOWQ1ZQl9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhwdF9jbG9jayBocHQzNzJfdGltaW5nc181MFtdID0gewotCXsJWEZFUl9VRE1BXzUsCTB4MTI4NDgyNDIJfSwKLQl7CVhGRVJfVURNQV80LAkweDEyYWM4MjQyCX0sCi0JewlYRkVSX1VETUFfMywJMHgxMjhjODI0Mgl9LAotCXsJWEZFUl9VRE1BXzIsCTB4MTIwYzgyNDIJfSwKLQl7CVhGRVJfVURNQV8xLAkweDEyMTQ4MjU0CX0sCi0JewlYRkVSX1VETUFfMCwJMHgxMjE4ODJlYQl9LAotCi0JewlYRkVSX01XX0RNQV8yLAkweDIyODA4MjQyCX0sCi0JewlYRkVSX01XX0RNQV8xLAkweDIyODA4MjU0CX0sCi0JewlYRkVSX01XX0RNQV8wLAkweDIyODA4MmVhCX0sCi0KLQl7CVhGRVJfUElPXzQsCTB4MGE4MWY0NDIJfSwKLQl7CVhGRVJfUElPXzMsCTB4MGE4MWY0NDMJfSwKLQl7CVhGRVJfUElPXzIsCTB4MGE4MWY0NTQJfSwKLQl7CVhGRVJfUElPXzEsCTB4MGFjMWY0NjUJfSwKLQl7CVhGRVJfUElPXzAsCTB4MGFjMWY0OGEJfSwKLQl7CTAsCQkweDBhODFmNDQzCX0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaHB0X2Nsb2NrIGhwdDM3Ml90aW1pbmdzXzY2W10gPSB7Ci0JewlYRkVSX1VETUFfNiwJMHgxYzg2OWM2Mgl9LAotCXsJWEZFUl9VRE1BXzUsCTB4MWNhZTljNjIJfSwKLQl7CVhGRVJfVURNQV80LAkweDFjOGE5YzYyCX0sCi0JewlYRkVSX1VETUFfMywJMHgxYzhlOWM2Mgl9LAotCXsJWEZFUl9VRE1BXzIsCTB4MWM5MjljNjIJfSwKLQl7CVhGRVJfVURNQV8xLAkweDFjOWE5YzYyCX0sCi0JewlYRkVSX1VETUFfMCwJMHgxYzgyOWM2Mgl9LAotCi0JewlYRkVSX01XX0RNQV8yLAkweDJjODI5YzYyCX0sCi0JewlYRkVSX01XX0RNQV8xLAkweDJjODI5YzY2CX0sCi0JewlYRkVSX01XX0RNQV8wLAkweDJjODI5ZDJlCX0sCi0KLQl7CVhGRVJfUElPXzQsCTB4MGM4MjljNjIJfSwKLQl7CVhGRVJfUElPXzMsCTB4MGM4MjljODQJfSwKLQl7CVhGRVJfUElPXzIsCTB4MGM4MjljYTYJfSwKLQl7CVhGRVJfUElPXzEsCTB4MGQwMjlkMjYJfSwKLQl7CVhGRVJfUElPXzAsCTB4MGQwMjlkNWUJfSwKLQl7CTAsCQkweDBkMDI5ZDI2CX0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaHB0X2Nsb2NrIGhwdDM3NF90aW1pbmdzXzMzW10gPSB7Ci0JewlYRkVSX1VETUFfNiwJMHgxMjgwODI0Mgl9LAotCXsJWEZFUl9VRE1BXzUsCTB4MTI4NDgyNDIJfSwKLQl7CVhGRVJfVURNQV80LAkweDEyYWM4MjQyCX0sCi0JewlYRkVSX1VETUFfMywJMHgxMjhjODI0Mgl9LAotCXsJWEZFUl9VRE1BXzIsCTB4MTIwYzgyNDIJfSwKLQl7CVhGRVJfVURNQV8xLAkweDEyMTQ4MjU0CX0sCi0JewlYRkVSX1VETUFfMCwJMHgxMjE4ODJlYQl9LAotCi0JewlYRkVSX01XX0RNQV8yLAkweDIyODA4MjQyCX0sCi0JewlYRkVSX01XX0RNQV8xLAkweDIyODA4MjU0CX0sCi0JewlYRkVSX01XX0RNQV8wLAkweDIyODA4MmVhCX0sCi0KLQl7CVhGRVJfUElPXzQsCTB4MGE4MWY0NDIJfSwKLQl7CVhGRVJfUElPXzMsCTB4MGE4MWY0NDMJfSwKLQl7CVhGRVJfUElPXzIsCTB4MGE4MWY0NTQJfSwKLQl7CVhGRVJfUElPXzEsCTB4MGFjMWY0NjUJfSwKLQl7CVhGRVJfUElPXzAsCTB4MGFjMWY0OGEJfSwKLQl7CTAsCQkweDA2ODE0ZTkzCX0KLX07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaHB0X2NoaXAgaHB0MzcwID0gewogCSJIUFQzNzAiLAogCTQ4LAogCXsKLQkJaHB0MzcwX3RpbWluZ3NfMzMsCisJCWhwdDM3eF90aW1pbmdzXzMzLAogCQlOVUxMLAogCQlOVUxMLAotCQlocHQzNzBfdGltaW5nc182NgorCQlOVUxMCiAJfQogfTsKIApAQCAtMjYzLDEwICsxMzgsMTAgQEAKIAkiSFBUMzcwQSIsCiAJNDgsCiAJewotCQlocHQzNzBhX3RpbWluZ3NfMzMsCisJCWhwdDM3eF90aW1pbmdzXzMzLAogCQlOVUxMLAotCQlocHQzNzBhX3RpbWluZ3NfNTAsCi0JCWhwdDM3MGFfdGltaW5nc182NgorCQlocHQzN3hfdGltaW5nc181MCwKKwkJTlVMTAogCX0KIH07CiAKQEAgLTI3NCwxMCArMTQ5LDEwIEBACiAJIkhQVDM3MiIsCiAJNTUsCiAJewotCQlocHQzNzJfdGltaW5nc18zMywKKwkJaHB0Mzd4X3RpbWluZ3NfMzMsCiAJCU5VTEwsCi0JCWhwdDM3Ml90aW1pbmdzXzUwLAotCQlocHQzNzJfdGltaW5nc182NgorCQlocHQzN3hfdGltaW5nc181MCwKKwkJaHB0Mzd4X3RpbWluZ3NfNjYKIAl9CiB9OwogCkBAIC0yODUsMTAgKzE2MCwxMCBAQAogCSJIUFQzMDIiLAogCTY2LAogCXsKLQkJaHB0MzcyX3RpbWluZ3NfMzMsCisJCWhwdDM3eF90aW1pbmdzXzMzLAogCQlOVUxMLAotCQlocHQzNzJfdGltaW5nc181MCwKLQkJaHB0MzcyX3RpbWluZ3NfNjYKKwkJaHB0Mzd4X3RpbWluZ3NfNTAsCisJCWhwdDM3eF90aW1pbmdzXzY2CiAJfQogfTsKIApAQCAtMjk2LDEwICsxNzEsMTAgQEAKIAkiSFBUMzcxIiwKIAk2NiwKIAl7Ci0JCWhwdDM3Ml90aW1pbmdzXzMzLAorCQlocHQzN3hfdGltaW5nc18zMywKIAkJTlVMTCwKLQkJaHB0MzcyX3RpbWluZ3NfNTAsCi0JCWhwdDM3Ml90aW1pbmdzXzY2CisJCWhwdDM3eF90aW1pbmdzXzUwLAorCQlocHQzN3hfdGltaW5nc182NgogCX0KIH07CiAKQEAgLTMwNywxMCArMTgyLDEwIEBACiAJIkhQVDM3MkEiLAogCTY2LAogCXsKLQkJaHB0MzcyX3RpbWluZ3NfMzMsCisJCWhwdDM3eF90aW1pbmdzXzMzLAogCQlOVUxMLAotCQlocHQzNzJfdGltaW5nc181MCwKLQkJaHB0MzcyX3RpbWluZ3NfNjYKKwkJaHB0Mzd4X3RpbWluZ3NfNTAsCisJCWhwdDM3eF90aW1pbmdzXzY2CiAJfQogfTsKIApAQCAtMzE4LDcgKzE5Myw3IEBACiAJIkhQVDM3NCIsCiAJNDgsCiAJewotCQlocHQzNzRfdGltaW5nc18zMywKKwkJaHB0Mzd4X3RpbWluZ3NfMzMsCiAJCU5VTEwsCiAJCU5VTEwsCiAJCU5VTEwKQEAgLTM5NywxMyArMjcyLDEyIEBACiAKIC8qKgogICoJaHB0MzcwX2ZpbHRlcgktCW1vZGUgc2VsZWN0aW9uIGZpbHRlcgotICoJQGFwOiBBVEEgaW50ZXJmYWNlCiAgKglAYWRldjogQVRBIGRldmljZQogICoKICAqCUJsb2NrIFVETUEgb24gZGV2aWNlcyB0aGF0IGNhdXNlIHRyb3VibGUgd2l0aCB0aGlzIGNvbnRyb2xsZXIuCiAgKi8KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgaHB0MzcwX2ZpbHRlcihjb25zdCBzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX2RldmljZSAqYWRldiwgdW5zaWduZWQgbG9uZyBtYXNrKQorc3RhdGljIHVuc2lnbmVkIGxvbmcgaHB0MzcwX2ZpbHRlcihzdHJ1Y3QgYXRhX2RldmljZSAqYWRldiwgdW5zaWduZWQgbG9uZyBtYXNrKQogewogCWlmIChhZGV2LT5jbGFzcyA9PSBBVEFfREVWX0FUQSkgewogCQlpZiAoaHB0X2RtYV9ibGFja2xpc3RlZChhZGV2LCAiVURNQSIsIGJhZF9hdGEzMykpCkBAIC00MTEsMjQgKzI4NSwyMyBAQAogCQlpZiAoaHB0X2RtYV9ibGFja2xpc3RlZChhZGV2LCAiVURNQTEwMCIsIGJhZF9hdGExMDBfNSkpCiAJCQltYXNrICY9IH4oMHgxRiA8PCBBVEFfU0hJRlRfVURNQSk7CiAJfQotCXJldHVybiBhdGFfcGNpX2RlZmF1bHRfZmlsdGVyKGFwLCBhZGV2LCBtYXNrKTsKKwlyZXR1cm4gYXRhX3BjaV9kZWZhdWx0X2ZpbHRlcihhZGV2LCBtYXNrKTsKIH0KIAogLyoqCiAgKglocHQzNzBhX2ZpbHRlcgktCW1vZGUgc2VsZWN0aW9uIGZpbHRlcgotICoJQGFwOiBBVEEgaW50ZXJmYWNlCiAgKglAYWRldjogQVRBIGRldmljZQogICoKICAqCUJsb2NrIFVETUEgb24gZGV2aWNlcyB0aGF0IGNhdXNlIHRyb3VibGUgd2l0aCB0aGlzIGNvbnRyb2xsZXIuCiAgKi8KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgaHB0MzcwYV9maWx0ZXIoY29uc3Qgc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV9kZXZpY2UgKmFkZXYsIHVuc2lnbmVkIGxvbmcgbWFzaykKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGhwdDM3MGFfZmlsdGVyKHN0cnVjdCBhdGFfZGV2aWNlICphZGV2LCB1bnNpZ25lZCBsb25nIG1hc2spCiB7CiAJaWYgKGFkZXYtPmNsYXNzICE9IEFUQV9ERVZfQVRBKSB7CiAJCWlmIChocHRfZG1hX2JsYWNrbGlzdGVkKGFkZXYsICJVRE1BMTAwIiwgYmFkX2F0YTEwMF81KSkKIAkJCW1hc2sgJj0gfiAoMHgxRiA8PCBBVEFfU0hJRlRfVURNQSk7CiAJfQotCXJldHVybiBhdGFfcGNpX2RlZmF1bHRfZmlsdGVyKGFwLCBhZGV2LCBtYXNrKTsKKwlyZXR1cm4gYXRhX3BjaV9kZWZhdWx0X2ZpbHRlcihhZGV2LCBtYXNrKTsKIH0KIAogLyoqCkBAIC00NjIsOCArMzM1LDcgQEAKIAkJYXAtPmNibCA9IEFUQV9DQkxfUEFUQTgwOwogCiAJLyogUmVzZXQgdGhlIHN0YXRlIG1hY2hpbmUgKi8KLQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgMHg1MCwgMHgzNyk7Ci0JcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIDB4NTQsIDB4MzcpOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCAweDUwICsgNCAqIGFwLT5wb3J0X25vLCAweDM3KTsKIAl1ZGVsYXkoMTAwKTsKIAogCXJldHVybiBhdGFfc3RkX3ByZXJlc2V0KGFwKTsKQEAgLTUxMyw4ICszODUsNyBAQAogCQlhcC0+Y2JsID0gQVRBX0NCTF9QQVRBODA7CiAKIAkvKiBSZXNldCB0aGUgc3RhdGUgbWFjaGluZSAqLwotCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCAweDUwLCAweDM3KTsKLQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgMHg1NCwgMHgzNyk7CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIDB4NTAgKyA0ICogYXAtPnBvcnRfbm8sIDB4MzcpOwogCXVkZWxheSgxMDApOwogCiAJcmV0dXJuIGF0YV9zdGRfcHJlcmVzZXQoYXApOwpAQCAtMTAzMiw2ICs5MDMsMjQgQEAKIAkJLnVkbWFfbWFzayA9IDB4M2YsCiAJCS5wb3J0X29wcyA9ICZocHQzNzBhX3BvcnRfb3BzCiAJfTsKKwkvKiBIUFQzNzAgLSBVRE1BMTAwICovCisJc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9pbmZvIGluZm9faHB0MzcwXzMzID0geworCQkuc2h0ID0gJmhwdDM3eF9zaHQsCisJCS5mbGFncyA9IEFUQV9GTEFHX1NMQVZFX1BPU1N8QVRBX0ZMQUdfU1JTVCwKKwkJLnBpb19tYXNrID0gMHgxZiwKKwkJLm13ZG1hX21hc2sgPSAweDA3LAorCQkudWRtYV9tYXNrID0gMHgwZiwKKwkJLnBvcnRfb3BzID0gJmhwdDM3MF9wb3J0X29wcworCX07CisJLyogSFBUMzcwQSAtIFVETUExMDAgKi8KKwlzdGF0aWMgc3RydWN0IGF0YV9wb3J0X2luZm8gaW5mb19ocHQzNzBhXzMzID0geworCQkuc2h0ID0gJmhwdDM3eF9zaHQsCisJCS5mbGFncyA9IEFUQV9GTEFHX1NMQVZFX1BPU1N8QVRBX0ZMQUdfU1JTVCwKKwkJLnBpb19tYXNrID0gMHgxZiwKKwkJLm13ZG1hX21hc2sgPSAweDA3LAorCQkudWRtYV9tYXNrID0gMHgwZiwKKwkJLnBvcnRfb3BzID0gJmhwdDM3MGFfcG9ydF9vcHMKKwl9OwogCS8qIEhQVDM3MSwgMzcyIGFuZCBmcmllbmRzIC0gVURNQTEzMyAqLwogCXN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBpbmZvX2hwdDM3MiA9IHsKIAkJLnNodCA9ICZocHQzN3hfc2h0LApAQCAtMTA2Nyw3ICs5NTYsMTEgQEAKIAogCXU4IGlycW1hc2s7CiAJdTMyIGNsYXNzX3JldjsKKwl1OCBtY3IxOwogCXUzMiBmcmVxOworCWludCBwcmVmZXJfZHBsbCA9IDE7CisJCisJdW5zaWduZWQgbG9uZyBpb2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCA0KTsKIAogCWNvbnN0IHN0cnVjdCBocHRfY2hpcCAqY2hpcF90YWJsZTsKIAlpbnQgY2xvY2tfc2xvdDsKQEAgLTEwODgsMTAgKzk4MSwxMiBAQAogCQkJY2FzZSAzOgogCQkJCXBvcnQgPSAmaW5mb19ocHQzNzA7CiAJCQkJY2hpcF90YWJsZSA9ICZocHQzNzA7CisJCQkJcHJlZmVyX2RwbGwgPSAwOwogCQkJCWJyZWFrOwogCQkJY2FzZSA0OgogCQkJCXBvcnQgPSAmaW5mb19ocHQzNzBhOwogCQkJCWNoaXBfdGFibGUgPSAmaHB0MzcwYTsKKwkJCQlwcmVmZXJfZHBsbCA9IDA7CiAJCQkJYnJlYWs7CiAJCQljYXNlIDU6CiAJCQkJcG9ydCA9ICZpbmZvX2hwdDM3MjsKQEAgLTExMTksOCArMTAxNCwxNiBAQAogCQkJCWNoaXBfdGFibGUgPSAmaHB0MzAyOwogCQkJCWJyZWFrOwogCQkJY2FzZSBQQ0lfREVWSUNFX0lEX1RUSV9IUFQzNzE6CisJCQkJaWYgKGNsYXNzX3JldiA+IDEpCisJCQkJCXJldHVybiAtRU5PREVWOwogCQkJCXBvcnQgPSAmaW5mb19ocHQzNzI7CiAJCQkJY2hpcF90YWJsZSA9ICZocHQzNzE7CisJCQkJLyogU2luZ2xlIGNoYW5uZWwgZGV2aWNlLCBtYXN0ZXIgaXMgbm90IHByZXNlbnQKKwkJCQkgICBidXQgdGhlIEJJT1MgKG9yIHVzIGZvciBub24geDg2KSBtdXN0IG1hcmsgaXQKKwkJCQkgICBhYnNlbnQgKi8KKwkJCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4NTAsICZtY3IxKTsKKwkJCQltY3IxICY9IH4weDA0OworCQkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NTAsIG1jcjEpOwogCQkJCWJyZWFrOwogCQkJY2FzZSBQQ0lfREVWSUNFX0lEX1RUSV9IUFQzNzQ6CiAJCQkJY2hpcF90YWJsZSA9ICZocHQzNzQ7CkBAIC0xMTUwLDggKzEwNTMsMTggQEAKIAkgKi8KIAogCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NWIsIDB4MjMpOworCQorCS8qCisJICogSGlnaFBvaW50IGRvZXMgdGhpcyBmb3IgSFBUMzcyQS4KKwkgKiBOT1RFOiBUaGlzIHJlZ2lzdGVyIGlzIG9ubHkgd3JpdGVhYmxlIHZpYSBJL08gc3BhY2UuCisJICovCisJaWYgKGNoaXBfdGFibGUgPT0gJmhwdDM3MmEpCisJCW91dGIoMHgwZSwgaW9iYXNlICsgMHg5Yyk7CiAKLQlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCAweDcwLCAmZnJlcSk7CisJLyogU29tZSBkZXZpY2VzIGRvIG5vdCBsZXQgdGhpcyB2YWx1ZSBiZSBhY2Nlc3NlZCB2aWEgUENJIHNwYWNlCisJICAgYWNjb3JkaW5nIHRvIHRoZSBvbGQgZHJpdmVyICovCisKKwlmcmVxID0gaW5sKGlvYmFzZSArIDB4OTApOwogCWlmICgoZnJlcSA+PiAxMikgIT0gMHhBQkNERSkgewogCQlpbnQgaTsKIAkJdTggc3I7CkBAIC0xMTYyLDcgKzEwNzUsNyBAQAogCQkvKiBUaGlzIGlzIHRoZSBwcm9jZXNzIHRoZSBIUFQzNzEgQklPUyBpcyByZXBvcnRlZCB0byB1c2UgKi8KIAkJZm9yKGkgPSAwOyBpIDwgMTI4OyBpKyspIHsKIAkJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgMHg3OCwgJnNyKTsKLQkJCXRvdGFsICs9IHNyOworCQkJdG90YWwgKz0gc3IgJiAweDFGRjsKIAkJCXVkZWxheSgxNSk7CiAJCX0KIAkJZnJlcSA9IHRvdGFsIC8gMTI4OwpAQCAtMTE3MywxNSArMTA4NiwyNyBAQAogCSAqCVR1cm4gdGhlIGZyZXF1ZW5jeSBjaGVjayBpbnRvIGEgYmFuZCBhbmQgdGhlbiBmaW5kIGEgdGltaW5nCiAJICoJdGFibGUgdG8gbWF0Y2ggaXQuCiAJICovCi0KKwkgCiAJY2xvY2tfc2xvdCA9IGhwdDM3eF9jbG9ja19zbG90KGZyZXEsIGNoaXBfdGFibGUtPmJhc2UpOwotCWlmIChjaGlwX3RhYmxlLT5jbG9ja3NbY2xvY2tfc2xvdF0gPT0gTlVMTCkgeworCWlmIChjaGlwX3RhYmxlLT5jbG9ja3NbY2xvY2tfc2xvdF0gPT0gTlVMTCB8fCBwcmVmZXJfZHBsbCkgewogCQkvKgogCQkgKglXZSBuZWVkIHRvIHRyeSBQTEwgbW9kZSBpbnN0ZWFkCisJCSAqCisJCSAqCUZvciBub24gVURNQTEzMyBjYXBhYmxlIGRldmljZXMgd2Ugc2hvdWxkCisJCSAqCXVzZSBhIDUwTUh6IERQTEwgYnkgY2hvaWNlCiAJCSAqLwotCQl1bnNpZ25lZCBpbnQgZl9sb3cgPSAoTUh6W2Nsb2NrX3Nsb3RdICogY2hpcF90YWJsZS0+YmFzZSkgLyAxOTI7Ci0JCXVuc2lnbmVkIGludCBmX2hpZ2ggPSBmX2xvdyArIDI7CisJCXVuc2lnbmVkIGludCBmX2xvdywgZl9oaWdoOwogCQlpbnQgYWRqdXN0OworCQkKKwkJY2xvY2tfc2xvdCA9IDI7CisJCWlmIChwb3J0LT51ZG1hX21hc2sgJiAweEUwKQorCQkJY2xvY2tfc2xvdCA9IDM7CisJCQorCQlmX2xvdyA9IChNSHpbY2xvY2tfc2xvdF0gKiBjaGlwX3RhYmxlLT5iYXNlKSAvIDE5MjsKKwkJZl9oaWdoID0gZl9sb3cgKyAyOworCisJCS8qIFNlbGVjdCB0aGUgRFBMTCBjbG9jay4gKi8KKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg1YiwgMHgyMSk7CiAKIAkJZm9yKGFkanVzdCA9IDA7IGFkanVzdCA8IDg7IGFkanVzdCsrKSB7CiAJCQlpZiAoaHB0Mzd4X2NhbGlicmF0ZV9kcGxsKGRldikpCkBAIC0xMTk3LDI1ICsxMTIyLDI3IEBACiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICJocHQzN3g6IERQTEwgZGlkIG5vdCBzdGFiaWxpemUuXG4iKTsKIAkJCXJldHVybiAtRU5PREVWOwogCQl9Ci0JCS8qIENoZWNrIGlmIHRoaXMgd29ya3MgZm9yIGFsbCBjYXNlcyAqLwotCQlwb3J0LT5wcml2YXRlX2RhdGEgPSAodm9pZCAqKWhwdDM3MF90aW1pbmdzXzY2OworCQlpZiAoY2xvY2tfc2xvdCA9PSAzKQorCQkJcG9ydC0+cHJpdmF0ZV9kYXRhID0gKHZvaWQgKilocHQzN3hfdGltaW5nc182NjsKKwkJZWxzZQorCQkJcG9ydC0+cHJpdmF0ZV9kYXRhID0gKHZvaWQgKilocHQzN3hfdGltaW5nc181MDsKIAogCQlwcmludGsoS0VSTl9JTkZPICJocHQzN3g6IEJ1cyBjbG9jayAlZE1IeiwgdXNpbmcgRFBMTC5cbiIsIE1IeltjbG9ja19zbG90XSk7CiAJfSBlbHNlIHsKIAkJcG9ydC0+cHJpdmF0ZV9kYXRhID0gKHZvaWQgKiljaGlwX3RhYmxlLT5jbG9ja3NbY2xvY2tfc2xvdF07CiAJCS8qCi0JCSAqCVBlcmZvcm0gYSBmaW5hbCBmaXh1cC4gVGhlIDM3MSBhbmQgMzcyIGNsb2NrIGRldGVybWluZXMKLQkJICoJaWYgVURNQTEzMyBpcyBhdmFpbGFibGUuCi0JCSAqLworCQkgKglQZXJmb3JtIGEgZmluYWwgZml4dXAuIE5vdGUgdGhhdCB3ZSB3aWxsIGhhdmUgdXNlZCB0aGUKKwkJICoJRFBMTCBvbiB0aGUgSFBUMzcyIHdoaWNoIG1lYW5zIHdlIGRvbid0IGhhdmUgdG8gd29ycnkKKwkJICoJYWJvdXQgbGFjayBvZiBVRE1BMTMzIHN1cHBvcnQgb24gbG93ZXIgY2xvY2tzCisgCQkgKi8KIAotCQlpZiAoY2xvY2tfc2xvdCA9PSAyICYmIGNoaXBfdGFibGUgPT0gJmhwdDM3MikgewkvKiA1ME1oeiAqLwotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAicGF0YV9ocHQzN3g6IE5vIFVETUExMzMgc3VwcG9ydCBhdmFpbGFibGUgd2l0aCA1ME1IeiBidXMgY2xvY2suXG4iKTsKLQkJCWlmIChwb3J0ID09ICZpbmZvX2hwdDM3MikKLQkJCQlwb3J0ID0gJmluZm9faHB0MzcyXzUwOwotCQkJZWxzZSBCVUcoKTsKLQkJfQorCQlpZiAoY2xvY2tfc2xvdCA8IDIgJiYgcG9ydCA9PSAmaW5mb19ocHQzNzApCisJCQlwb3J0ID0gJmluZm9faHB0MzcwXzMzOworCQlpZiAoY2xvY2tfc2xvdCA8IDIgJiYgcG9ydCA9PSAmaW5mb19ocHQzNzBhKQorCQkJcG9ydCA9ICZpbmZvX2hwdDM3MGFfMzM7CiAJCXByaW50ayhLRVJOX0lORk8gImhwdDM3eDogJXM6IEJ1cyBjbG9jayAlZE1Iei5cbiIsIGNoaXBfdGFibGUtPm5hbWUsIE1IeltjbG9ja19zbG90XSk7CiAJfQorCiAJcG9ydF9pbmZvWzBdID0gcG9ydF9pbmZvWzFdID0gcG9ydDsKIAkvKiBOb3cga2ljayBvZmYgQVRBIHNldCB1cCAqLwogCXJldHVybiBhdGFfcGNpX2luaXRfb25lKGRldiwgcG9ydF9pbmZvLCAyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfaHB0M3gybi5jIGIvZHJpdmVycy9hdGEvcGF0YV9ocHQzeDJuLmMKaW5kZXggNjVmMmUxOC4uNmEzNDUyMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9ocHQzeDJuLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9ocHQzeDJuLmMKQEAgLTgsMTAgKzgsMTAgQEAKICAqIENvcHlyaWdodCAoQykgMTk5OS0yMDAzCQlBbmRyZSBIZWRyaWNrIDxhbmRyZUBsaW51eC1pZGUub3JnPgogICogUG9ydGlvbnMgQ29weXJpZ2h0IChDKSAyMDAxCSAgICAgICAgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgogICogUG9ydGlvbnMgQ29weXJpZ2h0IChDKSAyMDAzCQlSZWQgSGF0IEluYworICogUG9ydGlvbnMgQ29weXJpZ2h0IChDKSAyMDA1LTIwMDYJTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgogICoKICAqCiAgKiBUT0RPCi0gKgkzNzFOCiAgKglXb3JrIG91dCBiZXN0IFBMTCBwb2xpY3kKICAqLwogCkBAIC0yNSw3ICsyNSw3IEBACiAjaW5jbHVkZSA8bGludXgvbGliYXRhLmg+CiAKICNkZWZpbmUgRFJWX05BTUUJInBhdGFfaHB0M3gybiIKLSNkZWZpbmUgRFJWX1ZFUlNJT04JIjAuMy4yIgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMC4zLjMiCiAKIGVudW0gewogCUhQVF9QQ0lfRkFTVAk9CSgxIDw8IDMxKSwKQEAgLTExNSwxNCArMTE1LDEzIEBACiB9CiAKIC8qKgotICoJaHB0M3gybl9wcmVfcmVzZXQJLQlyZXNldCB0aGUgaHB0M3gybiBidXMKLSAqCUBhcDogQVRBIHBvcnQgdG8gcmVzZXQKKyAqCWhwdDN4Mm5fY2FibGVfZGV0ZWN0CS0JRGV0ZWN0IHRoZSBjYWJsZSB0eXBlCisgKglAYXA6IEFUQSBwb3J0IHRvIGRldGVjdCBvbgogICoKLSAqCVBlcmZvcm0gdGhlIGluaXRpYWwgcmVzZXQgaGFuZGxpbmcgZm9yIHRoZSAzeDJuIHNlcmllcyBjb250cm9sbGVycy4KLSAqCVJlc2V0IHRoZSBoYXJkd2FyZSBhbmQgc3RhdGUgbWFjaGluZSwgb2J0YWluIHRoZSBjYWJsZSB0eXBlLgorICoJUmV0dXJuIHRoZSBjYWJsZSB0eXBlIGF0dGFjaGVkIHRvIHRoaXMgcG9ydAogICovCiAKLXN0YXRpYyBpbnQgaHB0M3huX3ByZV9yZXNldChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQorc3RhdGljIGludCBocHQzeDJuX2NhYmxlX2RldGVjdChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQogewogCXU4IHNjcjIsIGF0YTY2OwogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihhcC0+aG9zdC0+ZGV2KTsKQEAgLTEzNSwxNSArMTM0LDI2IEBACiAJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIDB4NUIsIHNjcjIpOwogCiAJaWYgKGF0YTY2ICYgKDEgPDwgYXAtPnBvcnRfbm8pKQotCQlhcC0+Y2JsID0gQVRBX0NCTF9QQVRBNDA7CisJCXJldHVybiBBVEFfQ0JMX1BBVEE0MDsKIAllbHNlCi0JCWFwLT5jYmwgPSBBVEFfQ0JMX1BBVEE4MDsKKwkJcmV0dXJuIEFUQV9DQkxfUEFUQTgwOworfQogCisvKioKKyAqCWhwdDN4Mm5fcHJlX3Jlc2V0CS0JcmVzZXQgdGhlIGhwdDN4Mm4gYnVzCisgKglAYXA6IEFUQSBwb3J0IHRvIHJlc2V0CisgKglAZGVhZGxpbmU6IGRlYWRsaW5lIGppZmZpZXMgZm9yIHRoZSBvcGVyYXRpb24KKyAqCisgKglQZXJmb3JtIHRoZSBpbml0aWFsIHJlc2V0IGhhbmRsaW5nIGZvciB0aGUgM3gybiBzZXJpZXMgY29udHJvbGxlcnMuCisgKglSZXNldCB0aGUgaGFyZHdhcmUgYW5kIHN0YXRlIG1hY2hpbmUsCisgKi8KKworc3RhdGljIGludCBocHQzeG5fcHJlX3Jlc2V0KHN0cnVjdCBhdGFfcG9ydCAqYXApCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGFwLT5ob3N0LT5kZXYpOwogCS8qIFJlc2V0IHRoZSBzdGF0ZSBtYWNoaW5lICovCi0JcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIDB4NTAsIDB4MzcpOwotCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCAweDU0LCAweDM3KTsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgMHg1MCArIDQgKiBhcC0+cG9ydF9ubywgMHgzNyk7CiAJdWRlbGF5KDEwMCk7Ci0KIAlyZXR1cm4gYXRhX3N0ZF9wcmVyZXNldChhcCk7CiB9CiAKQEAgLTM2NCw2ICszNzQsNyBAQAogCS50aGF3CQk9IGF0YV9ibWRtYV90aGF3LAogCS5lcnJvcl9oYW5kbGVyCT0gaHB0M3gybl9lcnJvcl9oYW5kbGVyLAogCS5wb3N0X2ludGVybmFsX2NtZCA9IGF0YV9ibWRtYV9wb3N0X2ludGVybmFsX2NtZCwKKwkuY2FibGVfZGV0ZWN0CT0gaHB0M3gybl9jYWJsZV9kZXRlY3QsCiAKIAkuYm1kbWFfc2V0dXAgCT0gYXRhX2JtZG1hX3NldHVwLAogCS5ibWRtYV9zdGFydCAJPSBhdGFfYm1kbWFfc3RhcnQsCkBAIC00MjIsOCArNDMzLDkgQEAKIHsKIAl1bnNpZ25lZCBsb25nIGZyZXE7CiAJdTMyIGZjbnQ7CisJdW5zaWduZWQgbG9uZyBpb2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgNCk7CiAKLQlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgMHg3MC8qQ0hFQ0tNRSovLCAmZmNudCk7CisJZmNudCA9IGlubChpb2Jhc2UgKyAweDkwKTsJLyogTm90IFBDSSByZWFkYWJsZSBmb3Igc29tZSBjaGlwcyAqLwogCWlmICgoZmNudCA+PiAxMikgIT0gMHhBQkNERSkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJocHQzeG46IEJJT1MgY2xvY2sgZGF0YSBub3Qgc2V0LlxuIik7CiAJCXJldHVybiAzMzsJLyogTm90IEJJT1Mgc2V0ICovCkBAIC00OTIsNiArNTA0LDcgQEAKIAl1bnNpZ25lZCBpbnQgcGNpX21oejsKIAl1bnNpZ25lZCBpbnQgZl9sb3csIGZfaGlnaDsKIAlpbnQgYWRqdXN0OworCXVuc2lnbmVkIGxvbmcgaW9iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgNCk7CiAKIAlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBQQ0lfQ0xBU1NfUkVWSVNJT04sICZjbGFzc19yZXYpOwogCWNsYXNzX3JldiAmPSAweEZGOwpAQCAtNTAxLDYgKzUxNCwxMSBAQAogCQkJaWYgKGNsYXNzX3JldiA8IDYpCiAJCQkJcmV0dXJuIC1FTk9ERVY7CiAJCQlicmVhazsKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX1RUSV9IUFQzNzE6CisJCQlpZiAoY2xhc3NfcmV2IDwgMikKKwkJCQlyZXR1cm4gLUVOT0RFVjsKKwkJCS8qIDM3MU4gaWYgcmV2ID4gMSAqLworCQkJYnJlYWs7CiAJCWNhc2UgUENJX0RFVklDRV9JRF9UVElfSFBUMzcyOgogCQkJLyogMzcyTiBpZiByZXYgPj0gMSovCiAJCQlpZiAoY2xhc3NfcmV2ID09IDApCkBAIC01MjgsNiArNTQ2LDE5IEBACiAJaXJxbWFzayAmPSB+MHgxMDsKIAlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDVhLCBpcnFtYXNrKTsKIAorCS8qCisJICogSFBUMzcxIGNoaXBzIHBoeXNpY2FsbHkgaGF2ZSBvbmx5IG9uZSBjaGFubmVsLCB0aGUgc2Vjb25kYXJ5IG9uZSwKKwkgKiBidXQgdGhlIHByaW1hcnkgY2hhbm5lbCByZWdpc3RlcnMgZG8gZXhpc3QhICBHbyBmaWd1cmUuLi4KKwkgKiBTbywgIHdlIG1hbnVhbGx5IGRpc2FibGUgdGhlIG5vbi1leGlzdGluZyBjaGFubmVsIGhlcmUKKwkgKiAoaWYgdGhlIEJJT1MgaGFzbid0IGRvbmUgdGhpcyBhbHJlYWR5KS4KKwkgKi8KKwlpZiAoZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9UVElfSFBUMzcxKSB7CisJCXU4IG1jcjE7CisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgMHg1MCwgJm1jcjEpOworCQltY3IxICY9IH4weDA0OworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDUwLCBtY3IxKTsKKwl9CisKIAkvKiBUdW5lIHRoZSBQTEwuIEhQVCByZWNvbW1lbmQgdXNpbmcgNzUgZm9yIFNBVEEsIDY2IGZvciBVRE1BMTMzIG9yCiAJICAgNTAgZm9yIFVETUExMDAuIFJpZ2h0IG5vdyB3ZSBhbHdheXMgdXNlIDY2ICovCiAKQEAgLTU0NiwxNCArNTc3LDI0IEBACiAJCQlicmVhazsKIAkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIDB4NUMsIChmX2hpZ2ggPDwgMTYpIHwgZl9sb3cpOwogCX0KLQlpZiAoYWRqdXN0ID09IDgpCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgImhwdDN4bjogRFBMTCBkaWQgbm90IHN0YWJpbGl6ZS5cbiIpOworCWlmIChhZGp1c3QgPT0gOCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJocHQzeDJuOiBEUExMIGRpZCBub3Qgc3RhYmlsaXplLlxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KIAogCS8qIFNldCBvdXIgcHJpdmF0ZSBkYXRhIHVwLiBXZSBvbmx5IG5lZWQgYSBmZXcgZmxhZ3Mgc28gd2UgdXNlCiAJICAgaXQgZGlyZWN0bHkgKi8KIAlwb3J0LT5wcml2YXRlX2RhdGEgPSBOVUxMOwotCWlmIChwY2lfbWh6ID4gNjApCisJaWYgKHBjaV9taHogPiA2MCkgewogCQlwb3J0LT5wcml2YXRlX2RhdGEgPSAodm9pZCAqKVBDSTY2OworCQkvKgorCQkgKiBPbiAgSFBUMzcxTiwgaWYgQVRBIGNsb2NrIGlzIDY2IE1IeiB3ZSBtdXN0IHNldCBiaXQgMiBpbgorCQkgKiB0aGUgTUlTQy4gcmVnaXN0ZXIgdG8gc3RyZXRjaCB0aGUgVWx0cmFETUEgVHNzIHRpbWluZy4KKwkJICogTk9URTogVGhpcyByZWdpc3RlciBpcyBvbmx5IHdyaXRlYWJsZSB2aWEgSS9PIHNwYWNlLgorCQkgKi8KKwkJaWYgKGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfVFRJX0hQVDM3MSkKKwkJCW91dGIoaW5iKGlvYmFzZSArIDB4OWMpIHwgMHgwNCwgaW9iYXNlICsgMHg5Yyk7CisJfQogCiAJLyogTm93IGtpY2sgb2ZmIEFUQSBzZXQgdXAgKi8KIAlwb3J0X2luZm9bMF0gPSBwb3J0X2luZm9bMV0gPSBwb3J0OwpAQCAtNTYyLDYgKzYwMyw3IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBocHQzeDJuW10gPSB7CiAJeyBQQ0lfVkRFVklDRShUVEksIFBDSV9ERVZJQ0VfSURfVFRJX0hQVDM2NiksIH0sCisJeyBQQ0lfVkRFVklDRShUVEksIFBDSV9ERVZJQ0VfSURfVFRJX0hQVDM3MSksIH0sCiAJeyBQQ0lfVkRFVklDRShUVEksIFBDSV9ERVZJQ0VfSURfVFRJX0hQVDM3MiksIH0sCiAJeyBQQ0lfVkRFVklDRShUVEksIFBDSV9ERVZJQ0VfSURfVFRJX0hQVDMwMiksIH0sCiAJeyBQQ0lfVkRFVklDRShUVEksIFBDSV9ERVZJQ0VfSURfVFRJX0hQVDM3Mk4pLCB9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9ocHQzeDMuYyBiL2RyaXZlcnMvYXRhL3BhdGFfaHB0M3gzLmMKaW5kZXggODEzNDg1Yy4uYWMyOGVjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9ocHQzeDMuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX2hwdDN4My5jCkBAIC0yNSwyNSArMjUsNiBAQAogI2RlZmluZSBEUlZfTkFNRQkicGF0YV9ocHQzeDMiCiAjZGVmaW5lIERSVl9WRVJTSU9OCSIwLjQuMiIKIAotc3RhdGljIGludCBocHQzeDNfcHJvYmVfaW5pdChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQotewotCWFwLT5jYmwgPSBBVEFfQ0JMX1BBVEE0MDsKLQlyZXR1cm4gYXRhX3N0ZF9wcmVyZXNldChhcCk7Ci19Ci0KLS8qKgotICoJaHB0M3gzX3Byb2JlX3Jlc2V0CS0JcmVzZXQgdGhlIGhwdDN4MyBidXMKLSAqCUBhcDogQVRBIHBvcnQgdG8gcmVzZXQKLSAqCi0gKglQZXJmb3JtIHRoZSBob3VzZWtlZXBpbmcgd2hlbiBkb2luZyBhbiBBVEEgYnVzIHJlZXNldC4gV2UganVzdAotICoJbmVlZCB0byBmb3JjZSB0aGUgY2FibGUgdHlwZS4KLSAqLwotCi1zdGF0aWMgdm9pZCBocHQzeDNfZXJyb3JfaGFuZGxlcihzdHJ1Y3QgYXRhX3BvcnQgKmFwKQotewotCXJldHVybiBhdGFfYm1kbWFfZHJpdmVfZWgoYXAsIGhwdDN4M19wcm9iZV9pbml0LCBhdGFfc3RkX3NvZnRyZXNldCwgTlVMTCwgYXRhX3N0ZF9wb3N0cmVzZXQpOwotfQotCiAvKioKICAqCWhwdDN4M19zZXRfcGlvbW9kZQkJLQlQSU8gc2V0dXAKICAqCUBhcDogQVRBIGludGVyZmFjZQpAQCAtMTM5LDggKzEyMCw5IEBACiAKIAkuZnJlZXplCQk9IGF0YV9ibWRtYV9mcmVlemUsCiAJLnRoYXcJCT0gYXRhX2JtZG1hX3RoYXcsCi0JLmVycm9yX2hhbmRsZXIJPSBocHQzeDNfZXJyb3JfaGFuZGxlciwKKwkuZXJyb3JfaGFuZGxlcgk9IGF0YV9ibWRtYV9lcnJvcl9oYW5kbGVyLAogCS5wb3N0X2ludGVybmFsX2NtZCA9IGF0YV9ibWRtYV9wb3N0X2ludGVybmFsX2NtZCwKKwkuY2FibGVfZGV0ZWN0CT0gYXRhX2NhYmxlXzQwd2lyZSwKIAogCS5ibWRtYV9zZXR1cCAJPSBhdGFfYm1kbWFfc2V0dXAsCiAJLmJtZG1hX3N0YXJ0IAk9IGF0YV9ibWRtYV9zdGFydCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfaXNhcG5wLmMgYi9kcml2ZXJzL2F0YS9wYXRhX2lzYXBucC5jCmluZGV4IDFhNjFjYzguLmQwNDJlZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfaXNhcG5wLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9pc2FwbnAuYwpAQCAtNDksMTMgKzQ5LDEzIEBACiAJLnRoYXcJCT0gYXRhX2JtZG1hX3RoYXcsCiAJLmVycm9yX2hhbmRsZXIJPSBhdGFfYm1kbWFfZXJyb3JfaGFuZGxlciwKIAkucG9zdF9pbnRlcm5hbF9jbWQgPSBhdGFfYm1kbWFfcG9zdF9pbnRlcm5hbF9jbWQsCisJLmNhYmxlX2RldGVjdAk9IGF0YV9jYWJsZV80MHdpcmUsCiAKIAkucWNfcHJlcCAJPSBhdGFfcWNfcHJlcCwKIAkucWNfaXNzdWUJPSBhdGFfcWNfaXNzdWVfcHJvdCwKIAogCS5kYXRhX3hmZXIJPSBhdGFfZGF0YV94ZmVyLAogCi0JLmlycV9oYW5kbGVyCT0gYXRhX2ludGVycnVwdCwKIAkuaXJxX2NsZWFyCT0gYXRhX2JtZG1hX2lycV9jbGVhciwKIAkuaXJxX29uCQk9IGF0YV9pcnFfb24sCiAJLmlycV9hY2sJPSBhdGFfaXJxX2FjaywKQEAgLTc0LDggKzc0LDEwIEBACiAKIHN0YXRpYyBpbnQgaXNhcG5wX2luaXRfb25lKHN0cnVjdCBwbnBfZGV2ICppZGV2LCBjb25zdCBzdHJ1Y3QgcG5wX2RldmljZV9pZCAqZGV2X2lkKQogewotCXN0cnVjdCBhdGFfcHJvYmVfZW50IGFlOworCXN0cnVjdCBhdGFfaG9zdCAqaG9zdDsKKwlzdHJ1Y3QgYXRhX3BvcnQgKmFwOwogCXZvaWQgX19pb21lbSAqY21kX2FkZHIsICpjdGxfYWRkcjsKKwlpbnQgcmM7CiAKIAlpZiAocG5wX3BvcnRfdmFsaWQoaWRldiwgMCkgPT0gMCkKIAkJcmV0dXJuIC1FTk9ERVY7CkBAIC04NCwzNCArODYsMzYgQEAKIAlpZiAocG5wX2lycV92YWxpZChpZGV2LCAwKSA9PSAwKQogCQlyZXR1cm4gLUVOT0RFVjsKIAorCS8qIGFsbG9jYXRlIGhvc3QgKi8KKwlob3N0ID0gYXRhX2hvc3RfYWxsb2MoJmlkZXYtPmRldiwgMSk7CisJaWYgKCFob3N0KQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIGFjcXVpcmUgcmVzb3VyY2VzIGFuZCBmaWxsIGhvc3QgKi8KIAljbWRfYWRkciA9IGRldm1faW9wb3J0X21hcCgmaWRldi0+ZGV2LCBwbnBfcG9ydF9zdGFydChpZGV2LCAwKSwgOCk7CiAJaWYgKCFjbWRfYWRkcikKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQltZW1zZXQoJmFlLCAwLCBzaXplb2Yoc3RydWN0IGF0YV9wcm9iZV9lbnQpKTsKLQlJTklUX0xJU1RfSEVBRCgmYWUubm9kZSk7Ci0JYWUuZGV2ID0gJmlkZXYtPmRldjsKLQlhZS5wb3J0X29wcyA9ICZpc2FwbnBfcG9ydF9vcHM7Ci0JYWUuc2h0ID0gJmlzYXBucF9zaHQ7Ci0JYWUubl9wb3J0cyA9IDE7Ci0JYWUucGlvX21hc2sgPSAxOwkJLyogSVNBIHNvIFBJTyAwIGN5Y2xlcyAqLwotCWFlLmlycSA9IHBucF9pcnEoaWRldiwgMCk7Ci0JYWUuaXJxX2ZsYWdzID0gMDsKLQlhZS5wb3J0X2ZsYWdzID0gQVRBX0ZMQUdfU0xBVkVfUE9TUzsKLQlhZS5wb3J0WzBdLmNtZF9hZGRyID0gY21kX2FkZHI7CisJYXAgPSBob3N0LT5wb3J0c1swXTsKKworCWFwLT5vcHMgPSAmaXNhcG5wX3BvcnRfb3BzOworCWFwLT5waW9fbWFzayA9IDE7CisJYXAtPmZsYWdzIHw9IEFUQV9GTEFHX1NMQVZFX1BPU1M7CisKKwlhcC0+aW9hZGRyLmNtZF9hZGRyID0gY21kX2FkZHI7CiAKIAlpZiAocG5wX3BvcnRfdmFsaWQoaWRldiwgMSkgPT0gMCkgewogCQljdGxfYWRkciA9IGRldm1faW9wb3J0X21hcCgmaWRldi0+ZGV2LAogCQkJCQkgICBwbnBfcG9ydF9zdGFydChpZGV2LCAxKSwgMSk7Ci0JCWFlLnBvcnRbMF0uYWx0c3RhdHVzX2FkZHIgPSBjdGxfYWRkcjsKLQkJYWUucG9ydFswXS5jdGxfYWRkciA9IGN0bF9hZGRyOwotCQlhZS5wb3J0X2ZsYWdzIHw9IEFUQV9GTEFHX1NSU1Q7CisJCWFwLT5pb2FkZHIuYWx0c3RhdHVzX2FkZHIgPSBjdGxfYWRkcjsKKwkJYXAtPmlvYWRkci5jdGxfYWRkciA9IGN0bF9hZGRyOwogCX0KLQlhdGFfc3RkX3BvcnRzKCZhZS5wb3J0WzBdKTsKIAotCWlmIChhdGFfZGV2aWNlX2FkZCgmYWUpID09IDApCi0JCXJldHVybiAtRU5PREVWOwotCXJldHVybiAwOworCWF0YV9zdGRfcG9ydHMoJmFwLT5pb2FkZHIpOworCisJLyogYWN0aXZhdGUgKi8KKwlyZXR1cm4gYXRhX2hvc3RfYWN0aXZhdGUoaG9zdCwgcG5wX2lycShpZGV2LCAwKSwgYXRhX2ludGVycnVwdCwgMCwKKwkJCQkgJmlzYXBucF9zaHQpOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfaXQ4MjEzLmMgYi9kcml2ZXJzL2F0YS9wYXRhX2l0ODIxMy5jCmluZGV4IGVhNzM0NzAuLjAxMTMwNmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfaXQ4MjEzLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9pdDgyMTMuYwpAQCAtMjUsOCArMjUsOCBAQAogICoJaXQ4MjEzX3ByZV9yZXNldAktCWNoZWNrIGZvciA0MC84MCBwaW4KICAqCUBhcDogUG9ydAogICoKLSAqCVBlcmZvcm0gY2FibGUgZGV0ZWN0aW9uIGZvciB0aGUgODIxMyBBVEEgaW50ZXJmYWNlLiBUaGlzIGlzCi0gKglkaWZmZXJlbnQgdG8gdGhlIFBJSVggYXJyYW5nZW1lbnQKKyAqCUZpbHRlciBvdXQgcG9ydHMgYnkgdGhlIGVuYWJsZSBiaXRzIGJlZm9yZSBkb2luZyB0aGUgbm9ybWFsIHJlc2V0CisgKglhbmQgcHJvYmUuCiAgKi8KIAogc3RhdGljIGludCBpdDgyMTNfcHJlX3Jlc2V0KHN0cnVjdCBhdGFfcG9ydCAqYXApCkBAIC0zNCwyMyArMzQsMTQgQEAKIAlzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9iaXRzIGl0ODIxM19lbmFibGVfYml0c1tdID0gewogCQl7IDB4NDFVLCAxVSwgMHg4MFVMLCAweDgwVUwgfSwJLyogcG9ydCAwICovCiAJfTsKLQogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihhcC0+aG9zdC0+ZGV2KTsKLQl1OCB0bXA7Ci0KIAlpZiAoIXBjaV90ZXN0X2NvbmZpZ19iaXRzKHBkZXYsICZpdDgyMTNfZW5hYmxlX2JpdHNbYXAtPnBvcnRfbm9dKSkKIAkJcmV0dXJuIC1FTk9FTlQ7Ci0KLQlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCAweDQyLCAmdG1wKTsKLQlpZiAodG1wICYgMikJLyogVGhlIGluaXRpYWwgZG9jcyBhcmUgaW5jb3JyZWN0ICovCi0JCWFwLT5jYmwgPSBBVEFfQ0JMX1BBVEE0MDsKLQllbHNlCi0JCWFwLT5jYmwgPSBBVEFfQ0JMX1BBVEE4MDsKIAlyZXR1cm4gYXRhX3N0ZF9wcmVyZXNldChhcCk7CiB9CiAKIC8qKgotICoJaXQ4MjEzX3Byb2JlX3Jlc2V0IC0gUHJvYmUgc3BlY2lmaWVkIHBvcnQgb24gUEFUQSBob3N0IGNvbnRyb2xsZXIKKyAqCWl0ODIxM19lcnJvcl9oYW5kbGVyIC0gUHJvYmUgc3BlY2lmaWVkIHBvcnQgb24gUEFUQSBob3N0IGNvbnRyb2xsZXIKICAqCUBhcDogUG9ydCB0byBwcm9iZQogICoKICAqCUxPQ0tJTkc6CkBAIC02Myw5ICs1NCwyNyBAQAogfQogCiAvKioKKyAqCWl0ODIxM19jYWJsZV9kZXRlY3QJLQljaGVjayBmb3IgNDAvODAgcGluCisgKglAYXA6IFBvcnQKKyAqCisgKglQZXJmb3JtIGNhYmxlIGRldGVjdGlvbiBmb3IgdGhlIDgyMTMgQVRBIGludGVyZmFjZS4gVGhpcyBpcworICoJZGlmZmVyZW50IHRvIHRoZSBQSUlYIGFycmFuZ2VtZW50CisgKi8KKworc3RhdGljIGludCBpdDgyMTNfY2FibGVfZGV0ZWN0KHN0cnVjdCBhdGFfcG9ydCAqYXApCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGFwLT5ob3N0LT5kZXYpOworCXU4IHRtcDsKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCAweDQyLCAmdG1wKTsKKwlpZiAodG1wICYgMikJLyogVGhlIGluaXRpYWwgZG9jcyBhcmUgaW5jb3JyZWN0ICovCisJCXJldHVybiBBVEFfQ0JMX1BBVEE0MDsKKwlyZXR1cm4gQVRBX0NCTF9QQVRBODA7Cit9CisKKy8qKgogICoJaXQ4MjEzX3NldF9waW9tb2RlIC0gSW5pdGlhbGl6ZSBob3N0IGNvbnRyb2xsZXIgUEFUQSBQSU8gdGltaW5ncwogICoJQGFwOiBQb3J0IHdob3NlIHRpbWluZ3Mgd2UgYXJlIGNvbmZpZ3VyaW5nCi0gKglAYWRldjogdW0KKyAqCUBhZGV2OiBEZXZpY2Ugd2hvc2UgdGltaW5ncyB3ZSBhcmUgY29uZmlndXJpbmcKICAqCiAgKglTZXQgUElPIG1vZGUgZm9yIGRldmljZSwgaW4gaG9zdCBjb250cm9sbGVyIFBDSSBjb25maWcgc3BhY2UuCiAgKgpAQCAtMjY4LDYgKzI3Nyw3IEBACiAJLnRoYXcJCQk9IGF0YV9ibWRtYV90aGF3LAogCS5lcnJvcl9oYW5kbGVyCQk9IGl0ODIxM19lcnJvcl9oYW5kbGVyLAogCS5wb3N0X2ludGVybmFsX2NtZAk9IGF0YV9ibWRtYV9wb3N0X2ludGVybmFsX2NtZCwKKwkuY2FibGVfZGV0ZWN0CQk9IGl0ODIxM19jYWJsZV9kZXRlY3QsCiAKIAkuYm1kbWFfc2V0dXAJCT0gYXRhX2JtZG1hX3NldHVwLAogCS5ibWRtYV9zdGFydAkJPSBhdGFfYm1kbWFfc3RhcnQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX2l0ODIxeC5jIGIvZHJpdmVycy9hdGEvcGF0YV9pdDgyMXguYwppbmRleCAzNWVjYjJiLi5mMWY4Y2VjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX2l0ODIxeC5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfaXQ4MjF4LmMKQEAgLTgwLDcgKzgwLDcgQEAKIAogCiAjZGVmaW5lIERSVl9OQU1FICJwYXRhX2l0ODIxeCIKLSNkZWZpbmUgRFJWX1ZFUlNJT04gIjAuMy40IgorI2RlZmluZSBEUlZfVkVSU0lPTiAiMC4zLjYiCiAKIHN0cnVjdCBpdDgyMXhfZGV2CiB7CkBAIC0xMTMsMzEgKzExMyw2IEBACiBzdGF0aWMgaW50IGl0ODIxMl9ub3JhaWQ7CiAKIC8qKgotICoJaXQ4MjF4X3ByZV9yZXNldAktCXByb2JlCi0gKglAYXA6IEFUQSBwb3J0Ci0gKgotICoJU2V0IHRoZSBjYWJsZSB0eXBlCi0gKi8KLQotc3RhdGljIGludCBpdDgyMXhfcHJlX3Jlc2V0KHN0cnVjdCBhdGFfcG9ydCAqYXApCi17Ci0JYXAtPmNibCA9IEFUQV9DQkxfUEFUQTgwOwotCXJldHVybiBhdGFfc3RkX3ByZXJlc2V0KGFwKTsKLX0KLQotLyoqCi0gKglpdDgyMXhfZXJyb3JfaGFuZGxlcgktCXByb2JlL3Jlc2V0Ci0gKglAYXA6IEFUQSBwb3J0Ci0gKgotICoJU2V0IHRoZSBjYWJsZSB0eXBlIGFuZCB0cmlnZ2VyIGEgcHJvYmUKLSAqLwotCi1zdGF0aWMgdm9pZCBpdDgyMXhfZXJyb3JfaGFuZGxlcihzdHJ1Y3QgYXRhX3BvcnQgKmFwKQotewotCXJldHVybiBhdGFfYm1kbWFfZHJpdmVfZWgoYXAsIGl0ODIxeF9wcmVfcmVzZXQsIGF0YV9zdGRfc29mdHJlc2V0LCBOVUxMLCBhdGFfc3RkX3Bvc3RyZXNldCk7Ci19Ci0KLS8qKgogICoJaXQ4MjF4X3Byb2dyYW0JLQlwcm9ncmFtIHRoZSBQSU8vTVdETUEgcmVnaXN0ZXJzCiAgKglAYXA6IEFUQSBwb3J0CiAgKglAYWRldjogRGV2aWNlIHRvIHByb2dyYW0KQEAgLTUyMCw3ICs0OTUsNiBAQAogCiAvKioKICAqCWl0ODIxeF9kZXZfY29uZmlnCS0JQ2FsbGVkIGVhY2ggZGV2aWNlIGlkZW50aWZ5Ci0gKglAYXA6IEFUQSBwb3J0CiAgKglAYWRldjogRGV2aWNlIHRoYXQgaGFzIGp1c3QgYmVlbiBpZGVudGlmaWVkCiAgKgogICoJUGVyZm9ybSB0aGUgaW5pdGlhbCBzZXR1cCBuZWVkZWQgZm9yIGVhY2ggZGV2aWNlIHRoYXQgaXMgY2hpcApAQCAtNTMxLDcgKzUwNSw3IEBACiAgKgliYXNpY2FsbHkgd2UgbmVlZCB0byBmaWx0ZXIgY29tbWFuZHMgZm9yIHRoaXMgY2hpcC4KICAqLwogCi1zdGF0aWMgdm9pZCBpdDgyMXhfZGV2X2NvbmZpZyhzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX2RldmljZSAqYWRldikKK3N0YXRpYyB2b2lkIGl0ODIxeF9kZXZfY29uZmlnKHN0cnVjdCBhdGFfZGV2aWNlICphZGV2KQogewogCXVuc2lnbmVkIGNoYXIgbW9kZWxfbnVtW0FUQV9JRF9QUk9EX0xFTiArIDFdOwogCkBAIC02NjcsOCArNjQxLDkgQEAKIAogCS5mcmVlemUJCT0gYXRhX2JtZG1hX2ZyZWV6ZSwKIAkudGhhdwkJPSBhdGFfYm1kbWFfdGhhdywKLQkuZXJyb3JfaGFuZGxlcgk9IGl0ODIxeF9lcnJvcl9oYW5kbGVyLAorCS5lcnJvcl9oYW5kbGVyCT0gYXRhX2JtZG1hX2Vycm9yX2hhbmRsZXIsCiAJLnBvc3RfaW50ZXJuYWxfY21kID0gYXRhX2JtZG1hX3Bvc3RfaW50ZXJuYWxfY21kLAorCS5jYWJsZV9kZXRlY3QJPSBhdGFfY2FibGVfdW5rbm93biwKIAogCS5ibWRtYV9zZXR1cCAJPSBhdGFfYm1kbWFfc2V0dXAsCiAJLmJtZG1hX3N0YXJ0IAk9IGF0YV9ibWRtYV9zdGFydCwKQEAgLTcwMyw4ICs2NzgsOSBAQAogCiAJLmZyZWV6ZQkJPSBhdGFfYm1kbWFfZnJlZXplLAogCS50aGF3CQk9IGF0YV9ibWRtYV90aGF3LAotCS5lcnJvcl9oYW5kbGVyCT0gaXQ4MjF4X2Vycm9yX2hhbmRsZXIsCisJLmVycm9yX2hhbmRsZXIJPSBhdGFfYm1kbWFfZXJyb3JfaGFuZGxlciwKIAkucG9zdF9pbnRlcm5hbF9jbWQgPSBhdGFfYm1kbWFfcG9zdF9pbnRlcm5hbF9jbWQsCisJLmNhYmxlX2RldGVjdAk9IGF0YV9jYWJsZV91bmtub3duLAogCiAJLmJtZG1hX3NldHVwIAk9IGF0YV9ibWRtYV9zZXR1cCwKIAkuYm1kbWFfc3RhcnQgCT0gaXQ4MjF4X3Bhc3N0aHJ1X2JtZG1hX3N0YXJ0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9peHA0eHhfY2YuYyBiL2RyaXZlcnMvYXRhL3BhdGFfaXhwNHh4X2NmLmMKaW5kZXggYzZmMGUxOS4uNDIwYzM0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9peHA0eHhfY2YuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX2l4cDR4eF9jZi5jCkBAIC0xMjksOCArMTI5LDggQEAKIAkucWNfaXNzdWUJPSBhdGFfcWNfaXNzdWVfcHJvdCwKIAkuZW5nX3RpbWVvdXQJPSBhdGFfZW5nX3RpbWVvdXQsCiAJLmRhdGFfeGZlcgk9IGl4cDR4eF9tbWlvX2RhdGFfeGZlciwKKwkuY2FibGVfZGV0ZWN0CT0gYXRhX2NhYmxlXzQwd2lyZSwKIAotCS5pcnFfaGFuZGxlcgk9IGF0YV9pbnRlcnJ1cHQsCiAJLmlycV9jbGVhcgk9IGl4cDR4eF9pcnFfY2xlYXIsCiAJLmlycV9vbgkJPSBhdGFfaXJxX29uLAogCS5pcnFfYWNrCT0gYXRhX2lycV9hY2ssCkBAIC0xNzMsMTIgKzE3MywxMiBAQAogCiBzdGF0aWMgX19kZXZpbml0IGludCBpeHA0eHhfcGF0YV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewotCWludCByZXQ7CiAJdW5zaWduZWQgaW50IGlycTsKIAlzdHJ1Y3QgcmVzb3VyY2UgKmNzMCwgKmNzMTsKLQlzdHJ1Y3QgYXRhX3Byb2JlX2VudCBhZTsKLQorCXN0cnVjdCBhdGFfaG9zdCAqaG9zdDsKKwlzdHJ1Y3QgYXRhX3BvcnQgKmFwOwogCXN0cnVjdCBpeHA0eHhfcGF0YV9kYXRhICpkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJaW50IHJjOwogCiAJY3MwID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKIAljczEgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDEpOwpAQCAtMTg2LDYgKzE4NiwxMiBAQAogCWlmICghY3MwIHx8ICFjczEpCiAJCXJldHVybiAtRUlOVkFMOwogCisJLyogYWxsb2NhdGUgaG9zdCAqLworCWhvc3QgPSBhdGFfaG9zdF9hbGxvYygmcGRldi0+ZGV2LCAxKTsKKwlpZiAoIWhvc3QpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogYWNxdWlyZSByZXNvdXJjZXMgYW5kIGZpbGwgaG9zdCAqLwogCXBkZXYtPmRldi5jb2hlcmVudF9kbWFfbWFzayA9IERNQV8zMkJJVF9NQVNLOwogCiAJZGF0YS0+Y3MwID0gZGV2bV9pb3JlbWFwKCZwZGV2LT5kZXYsIGNzMC0+c3RhcnQsIDB4MTAwMCk7CkBAIC0xOTksMzIgKzIwNSwyMiBAQAogCSpkYXRhLT5jczBfY2ZnID0gZGF0YS0+Y3MwX2JpdHM7CiAJKmRhdGEtPmNzMV9jZmcgPSBkYXRhLT5jczFfYml0czsKIAotCW1lbXNldCgmYWUsIDAsIHNpemVvZihzdHJ1Y3QgYXRhX3Byb2JlX2VudCkpOwotCUlOSVRfTElTVF9IRUFEKCZhZS5ub2RlKTsKKwlhcCA9IGhvc3QtPnBvcnRzWzBdOwogCi0JYWUuZGV2CQk9ICZwZGV2LT5kZXY7Ci0JYWUucG9ydF9vcHMJPSAmaXhwNHh4X3BvcnRfb3BzOwotCWFlLnNodAkJPSAmaXhwNHh4X3NodDsKLQlhZS5uX3BvcnRzCT0gMTsKLQlhZS5waW9fbWFzawk9IDB4MWY7IC8qIFBJTzQgKi8KLQlhZS5pcnEJCT0gaXJxOwotCWFlLmlycV9mbGFncwk9IDA7Ci0JYWUucG9ydF9mbGFncwk9IEFUQV9GTEFHX01NSU8gfCBBVEFfRkxBR19OT19MRUdBQ1kKLQkJCXwgQVRBX0ZMQUdfTk9fQVRBUEkgfCBBVEFfRkxBR19TUlNUOworCWFwLT5vcHMJPSAmaXhwNHh4X3BvcnRfb3BzOworCWFwLT5waW9fbWFzayA9IDB4MWY7IC8qIFBJTzQgKi8KKwlhcC0+ZmxhZ3MgfD0gQVRBX0ZMQUdfTU1JTyB8IEFUQV9GTEFHX05PX0xFR0FDWSB8IEFUQV9GTEFHX05PX0FUQVBJOwogCiAJLyogcnVuIGluIHBvbGxpbmcgbW9kZSBpZiBubyBpcnEgaGFzIGJlZW4gYXNzaWduZWQgKi8KIAlpZiAoIWlycSkKLQkJYWUucG9ydF9mbGFncyB8PSBBVEFfRkxBR19QSU9fUE9MTElORzsKKwkJYXAtPmZsYWdzIHw9IEFUQV9GTEFHX1BJT19QT0xMSU5HOwogCi0JaXhwNHh4X3NldHVwX3BvcnQoJmFlLnBvcnRbMF0sIGRhdGEpOworCWl4cDR4eF9zZXR1cF9wb3J0KCZhcC0+aW9hZGRyLCBkYXRhKTsKIAogCWRldl9wcmludGsoS0VSTl9JTkZPLCAmcGRldi0+ZGV2LCAidmVyc2lvbiAiIERSVl9WRVJTSU9OICJcbiIpOwogCi0JcmV0ID0gYXRhX2RldmljZV9hZGQoJmFlKTsKLQlpZiAocmV0ID09IDApCi0JCXJldHVybiAtRU5PREVWOwotCi0JcmV0dXJuIDA7CisJLyogYWN0aXZhdGUgaG9zdCAqLworCXJldHVybiBhdGFfaG9zdF9hY3RpdmF0ZShob3N0LCBpcnEsIGF0YV9pbnRlcnJ1cHQsIDAsICZpeHA0eHhfc2h0KTsKIH0KIAogc3RhdGljIF9fZGV2ZXhpdCBpbnQgaXhwNHh4X3BhdGFfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfbGVnYWN5LmMgYi9kcml2ZXJzL2F0YS9wYXRhX2xlZ2FjeS5jCmluZGV4IDg2ZmJjZDYuLjcwNzA5OTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfbGVnYWN5LmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9sZWdhY3kuYwpAQCAtMTYyLDYgKzE2Miw3IEBACiAJLnRoYXcJCT0gYXRhX2JtZG1hX3RoYXcsCiAJLmVycm9yX2hhbmRsZXIJPSBhdGFfYm1kbWFfZXJyb3JfaGFuZGxlciwKIAkucG9zdF9pbnRlcm5hbF9jbWQgPSBhdGFfYm1kbWFfcG9zdF9pbnRlcm5hbF9jbWQsCisJLmNhYmxlX2RldGVjdAk9IGF0YV9jYWJsZV80MHdpcmUsCiAKIAkucWNfcHJlcCAJPSBhdGFfcWNfcHJlcCwKIAkucWNfaXNzdWUJPSBhdGFfcWNfaXNzdWVfcHJvdCwKQEAgLTE4NSw2ICsxODYsNyBAQAogCS5jaGVja19zdGF0dXMgCT0gYXRhX2NoZWNrX3N0YXR1cywKIAkuZXhlY19jb21tYW5kCT0gYXRhX2V4ZWNfY29tbWFuZCwKIAkuZGV2X3NlbGVjdCAJPSBhdGFfc3RkX2Rldl9zZWxlY3QsCisJLmNhYmxlX2RldGVjdAk9IGF0YV9jYWJsZV80MHdpcmUsCiAKIAkuZnJlZXplCQk9IGF0YV9ibWRtYV9mcmVlemUsCiAJLnRoYXcJCT0gYXRhX2JtZG1hX3RoYXcsCkBAIC0zMDUsNiArMzA3LDcgQEAKIAkudGhhdwkJPSBhdGFfYm1kbWFfdGhhdywKIAkuZXJyb3JfaGFuZGxlcgk9IGF0YV9ibWRtYV9lcnJvcl9oYW5kbGVyLAogCS5wb3N0X2ludGVybmFsX2NtZCA9IGF0YV9ibWRtYV9wb3N0X2ludGVybmFsX2NtZCwKKwkuY2FibGVfZGV0ZWN0CT0gYXRhX2NhYmxlXzQwd2lyZSwKIAogCS5xY19wcmVwIAk9IGF0YV9xY19wcmVwLAogCS5xY19pc3N1ZQk9IGF0YV9xY19pc3N1ZV9wcm90LApAQCAtMzYwLDYgKzM2Myw3IEBACiAJLnRoYXcJCT0gYXRhX2JtZG1hX3RoYXcsCiAJLmVycm9yX2hhbmRsZXIJPSBhdGFfYm1kbWFfZXJyb3JfaGFuZGxlciwKIAkucG9zdF9pbnRlcm5hbF9jbWQgPSBhdGFfYm1kbWFfcG9zdF9pbnRlcm5hbF9jbWQsCisJLmNhYmxlX2RldGVjdAk9IGF0YV9jYWJsZV80MHdpcmUsCiAKIAkucWNfcHJlcCAJPSBhdGFfcWNfcHJlcCwKIAkucWNfaXNzdWUJPSBhdGFfcWNfaXNzdWVfcHJvdCwKQEAgLTQyNiw2ICs0MzAsNyBAQAogCS50aGF3CQk9IGF0YV9ibWRtYV90aGF3LAogCS5lcnJvcl9oYW5kbGVyCT0gYXRhX2JtZG1hX2Vycm9yX2hhbmRsZXIsCiAJLnBvc3RfaW50ZXJuYWxfY21kID0gYXRhX2JtZG1hX3Bvc3RfaW50ZXJuYWxfY21kLAorCS5jYWJsZV9kZXRlY3QJPSBhdGFfY2FibGVfNDB3aXJlLAogCiAJLnFjX3ByZXAgCT0gYXRhX3FjX3ByZXAsCiAJLnFjX2lzc3VlCT0gYXRhX3FjX2lzc3VlX3Byb3QsCkBAIC01NDcsNiArNTUyLDcgQEAKIAkudGhhdwkJPSBhdGFfYm1kbWFfdGhhdywKIAkuZXJyb3JfaGFuZGxlcgk9IGF0YV9ibWRtYV9lcnJvcl9oYW5kbGVyLAogCS5wb3N0X2ludGVybmFsX2NtZCA9IGF0YV9ibWRtYV9wb3N0X2ludGVybmFsX2NtZCwKKwkuY2FibGVfZGV0ZWN0CT0gYXRhX2NhYmxlXzQwd2lyZSwKIAogCS5xY19wcmVwIAk9IGF0YV9xY19wcmVwLAogCS5xY19pc3N1ZQk9IGF0YV9xY19pc3N1ZV9wcm90LApAQCAtNjgwLDYgKzY4Niw3IEBACiAJLnRoYXcJCT0gYXRhX2JtZG1hX3RoYXcsCiAJLmVycm9yX2hhbmRsZXIJPSBhdGFfYm1kbWFfZXJyb3JfaGFuZGxlciwKIAkucG9zdF9pbnRlcm5hbF9jbWQgPSBhdGFfYm1kbWFfcG9zdF9pbnRlcm5hbF9jbWQsCisJLmNhYmxlX2RldGVjdAk9IGF0YV9jYWJsZV80MHdpcmUsCiAKIAkucWNfcHJlcCAJPSBhdGFfcWNfcHJlcCwKIAkucWNfaXNzdWUJPSBvcHRpODJjNDZ4X3FjX2lzc3VlX3Byb3QsCkBAIC03MDksNyArNzE2LDggQEAKIHN0YXRpYyBfX2luaXQgaW50IGxlZ2FjeV9pbml0X29uZShpbnQgcG9ydCwgdW5zaWduZWQgbG9uZyBpbywgdW5zaWduZWQgbG9uZyBjdHJsLCBpbnQgaXJxKQogewogCXN0cnVjdCBsZWdhY3lfZGF0YSAqbGQgPSAmbGVnYWN5X2RhdGFbbnJfbGVnYWN5X2hvc3RdOwotCXN0cnVjdCBhdGFfcHJvYmVfZW50IGFlOworCXN0cnVjdCBhdGFfaG9zdCAqaG9zdDsKKwlzdHJ1Y3QgYXRhX3BvcnQgKmFwOwogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CiAJc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgKm9wcyA9ICZsZWdhY3lfcG9ydF9vcHM7CiAJdm9pZCBfX2lvbWVtICppb19hZGRyLCAqY3RybF9hZGRyOwpAQCAtNzkxLDI0ICs3OTksMjMgQEAKIAlpZiAob3BzID09ICZsZWdhY3lfcG9ydF9vcHMgJiYgKGF1dG9zcGVlZCAmIG1hc2spKQogCQlvcHMgPSAmc2ltcGxlX3BvcnRfb3BzOwogCi0JbWVtc2V0KCZhZSwgMCwgc2l6ZW9mKHN0cnVjdCBhdGFfcHJvYmVfZW50KSk7Ci0JSU5JVF9MSVNUX0hFQUQoJmFlLm5vZGUpOwotCWFlLmRldiA9ICZwZGV2LT5kZXY7Ci0JYWUucG9ydF9vcHMgPSBvcHM7Ci0JYWUuc2h0ID0gJmxlZ2FjeV9zaHQ7Ci0JYWUubl9wb3J0cyA9IDE7Ci0JYWUucGlvX21hc2sgPSBwaW9fbW9kZXM7Ci0JYWUuaXJxID0gaXJxOwotCWFlLmlycV9mbGFncyA9IDA7Ci0JYWUucG9ydF9mbGFncyA9IEFUQV9GTEFHX1NMQVZFX1BPU1N8QVRBX0ZMQUdfU1JTVHxpb3JkeTsKLQlhZS5wb3J0WzBdLmNtZF9hZGRyID0gaW9fYWRkcjsKLQlhZS5wb3J0WzBdLmFsdHN0YXR1c19hZGRyID0gY3RybF9hZGRyOwotCWFlLnBvcnRbMF0uY3RsX2FkZHIgPSBjdHJsX2FkZHI7Ci0JYXRhX3N0ZF9wb3J0cygmYWUucG9ydFswXSk7Ci0JYWUucHJpdmF0ZV9kYXRhID0gbGQ7CisJcmV0ID0gLUVOT01FTTsKKwlob3N0ID0gYXRhX2hvc3RfYWxsb2MoJnBkZXYtPmRldiwgMSk7CisJaWYgKCFob3N0KQorCQlnb3RvIGZhaWw7CisJYXAgPSBob3N0LT5wb3J0c1swXTsKIAotCXJldCA9IC1FTk9ERVY7Ci0JaWYgKCFhdGFfZGV2aWNlX2FkZCgmYWUpKQorCWFwLT5vcHMgPSBvcHM7CisJYXAtPnBpb19tYXNrID0gcGlvX21vZGVzOworCWFwLT5mbGFncyB8PSBBVEFfRkxBR19TTEFWRV9QT1NTIHwgaW9yZHk7CisJYXAtPmlvYWRkci5jbWRfYWRkciA9IGlvX2FkZHI7CisJYXAtPmlvYWRkci5hbHRzdGF0dXNfYWRkciA9IGN0cmxfYWRkcjsKKwlhcC0+aW9hZGRyLmN0bF9hZGRyID0gY3RybF9hZGRyOworCWF0YV9zdGRfcG9ydHMoJmFwLT5pb2FkZHIpOworCWFwLT5wcml2YXRlX2RhdGEgPSBsZDsKKworCXJldCA9IGF0YV9ob3N0X2FjdGl2YXRlKGhvc3QsIGlycSwgYXRhX2ludGVycnVwdCwgMCwgJmxlZ2FjeV9zaHQpOworCWlmIChyZXQpCiAJCWdvdG8gZmFpbDsKIAogCWxlZ2FjeV9ob3N0W25yX2xlZ2FjeV9ob3N0KytdID0gZGV2X2dldF9kcnZkYXRhKCZwZGV2LT5kZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9tYXJ2ZWxsLmMgYi9kcml2ZXJzL2F0YS9wYXRhX21hcnZlbGwuYwppbmRleCA2ZGQ3YzRlLi5kOWI5NGExIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX21hcnZlbGwuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX21hcnZlbGwuYwpAQCAtMjAsNyArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2F0YS5oPgogCiAjZGVmaW5lIERSVl9OQU1FCSJwYXRhX21hcnZlbGwiCi0jZGVmaW5lIERSVl9WRVJTSU9OCSIwLjEuMSIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjAuMS40IgogCiAvKioKICAqCW1hcnZlbGxfcHJlX3Jlc2V0CS0JY2hlY2sgZm9yIDQwLzgwIHBpbgpAQCAtNTIsMjIgKzUyLDIzIEBACiAJaWYgKChwZGV2LT5kZXZpY2UgPT0gMHg2MTQ1KSAmJiAoYXAtPnBvcnRfbm8gPT0gMCkgJiYKIAkgICAgKCEoZGV2aWNlcyAmIDB4MTApKSkJLyogUEFUQSBlbmFibGUgPyAqLwogCQlyZXR1cm4gLUVOT0VOVDsKKwlyZXR1cm4gYXRhX3N0ZF9wcmVyZXNldChhcCk7Cit9CiAKK3N0YXRpYyBpbnQgbWFydmVsbF9jYWJsZV9kZXRlY3Qoc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKIAkvKiBDYWJsZSB0eXBlICovCiAJc3dpdGNoKGFwLT5wb3J0X25vKQogCXsKIAljYXNlIDA6CiAJCWlmIChpb3JlYWQ4KGFwLT5pb2FkZHIuYm1kbWFfYWRkciArIDEpICYgMSkKLQkJCWFwLT5jYmwgPSBBVEFfQ0JMX1BBVEE0MDsKLQkJZWxzZQotCQkJYXAtPmNibCA9IEFUQV9DQkxfUEFUQTgwOwotCQlicmVhazsKLQorCQkJcmV0dXJuIEFUQV9DQkxfUEFUQTQwOworCQlyZXR1cm4gQVRBX0NCTF9QQVRBODA7CiAJY2FzZSAxOiAvKiBMZWdhY3kgU0FUQSBwb3J0ICovCi0JCWFwLT5jYmwgPSBBVEFfQ0JMX1NBVEE7Ci0JCWJyZWFrOworCQlyZXR1cm4gQVRBX0NCTF9TQVRBOwogCX0KLQlyZXR1cm4gYXRhX3N0ZF9wcmVyZXNldChhcCk7CisJQlVHKCk7CisJcmV0dXJuIDA7CS8qIE91ciBCVUcgbWFjcm8gbmVlZHMgdGhlIHJpZ2h0IG1hcmt1cCAqLwogfQogCiAvKioKQEAgLTEyMyw2ICsxMjQsNyBAQAogCS50aGF3CQkJPSBhdGFfYm1kbWFfdGhhdywKIAkuZXJyb3JfaGFuZGxlcgkJPSBtYXJ2ZWxsX2Vycm9yX2hhbmRsZXIsCiAJLnBvc3RfaW50ZXJuYWxfY21kCT0gYXRhX2JtZG1hX3Bvc3RfaW50ZXJuYWxfY21kLAorCS5jYWJsZV9kZXRlY3QJCT0gbWFydmVsbF9jYWJsZV9kZXRlY3QsCiAKIAkvKiBCTURNQSBoYW5kbGluZyBpcyBQQ0kgQVRBIGZvcm1hdCwgdXNlIGhlbHBlcnMgKi8KIAkuYm1kbWFfc2V0dXAJCT0gYXRhX2JtZG1hX3NldHVwLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9tcGM1Mnh4LmMgYi9kcml2ZXJzL2F0YS9wYXRhX21wYzUyeHguYwppbmRleCA4ODJjMzZlLi45NTg3YTg5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX21wYzUyeHguYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX21wYzUyeHguYwpAQCAtMjQsNyArMjQsNyBAQAogCiAKICNkZWZpbmUgRFJWX05BTUUJIm1wYzUyeHhfYXRhIgotI2RlZmluZSBEUlZfVkVSU0lPTgkiMC4xLjAiCisjZGVmaW5lIERSVl9WRVJTSU9OCSIwLjEuMGFjMiIKIAogCiAvKiBQcml2YXRlIHN0cnVjdHVyZXMgdXNlZCBieSB0aGUgZHJpdmVyICovCkBAIC0yOTcsMzggKzI5NywzNyBAQAogCS5mcmVlemUJCQk9IGF0YV9ibWRtYV9mcmVlemUsCiAJLnRoYXcJCQk9IGF0YV9ibWRtYV90aGF3LAogCS5lcnJvcl9oYW5kbGVyCQk9IG1wYzUyeHhfYXRhX2Vycm9yX2hhbmRsZXIsCisJLmNhYmxlX2RldGVjdAkJPSBhdGFfY2FibGVfNDB3aXJlLAogCS5xY19wcmVwCQk9IGF0YV9xY19wcmVwLAogCS5xY19pc3N1ZQkJPSBhdGFfcWNfaXNzdWVfcHJvdCwKIAkuZGF0YV94ZmVyCQk9IGF0YV9kYXRhX3hmZXIsCi0JLmlycV9oYW5kbGVyCQk9IGF0YV9pbnRlcnJ1cHQsCiAJLmlycV9jbGVhcgkJPSBhdGFfYm1kbWFfaXJxX2NsZWFyLAogCS5pcnFfb24JCQk9IGF0YV9pcnFfb24sCiAJLmlycV9hY2sJCT0gYXRhX2lycV9hY2ssCiAJLnBvcnRfc3RhcnQJCT0gYXRhX3BvcnRfc3RhcnQsCiB9OwogCi1zdGF0aWMgc3RydWN0IGF0YV9wcm9iZV9lbnQgbXBjNTJ4eF9hdGFfcHJvYmVfZW50ID0gewotCS5wb3J0X29wcwk9ICZtcGM1Mnh4X2F0YV9wb3J0X29wcywKLQkuc2h0CQk9ICZtcGM1Mnh4X2F0YV9zaHQsCi0JLm5fcG9ydHMJPSAxLAotCS5waW9fbWFzawk9IDB4MWYsCQkvKiBVcCB0byBQSU80ICovCi0JLm13ZG1hX21hc2sJPSAweDAwLAkJLyogTm8gTVdETUEgICAqLwotCS51ZG1hX21hc2sJPSAweDAwLAkJLyogTm8gVURNQSAgICAqLwotCS5wb3J0X2ZsYWdzCT0gQVRBX0ZMQUdfU0xBVkVfUE9TUyB8IEFUQV9GTEFHX1NSU1QsCi0JLmlycV9mbGFncwk9IDAsCi19OwotCiBzdGF0aWMgaW50IF9fZGV2aW5pdAogbXBjNTJ4eF9hdGFfaW5pdF9vbmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgbXBjNTJ4eF9hdGFfcHJpdiAqcHJpdikKIHsKLQlzdHJ1Y3QgYXRhX3Byb2JlX2VudCAqYWUgPSAmbXBjNTJ4eF9hdGFfcHJvYmVfZW50OwotCXN0cnVjdCBhdGFfaW9wb3J0cyAqYWlvID0gJmFlLT5wb3J0WzBdOwotCWludCBydjsKKwlzdHJ1Y3QgYXRhX2hvc3QgKmhvc3Q7CisJc3RydWN0IGF0YV9wb3J0ICphcDsKKwlzdHJ1Y3QgYXRhX2lvcG9ydHMgKmFpbzsKKwlpbnQgcmM7CiAKLQlJTklUX0xJU1RfSEVBRCgmYWUtPm5vZGUpOwotCWFlLT5kZXYgPSBkZXY7Ci0JYWUtPmlycSA9IHByaXYtPmF0YV9pcnE7CisJaG9zdCA9IGF0YV9ob3N0X2FsbG9jKGRldiwgMSk7CisJaWYgKCFob3N0KQorCQlyZXR1cm4gLUVOT01FTTsKIAorCWFwID0gaG9zdC0+cG9ydHNbMF07CisJYXAtPmZsYWdzCQl8PSBBVEFfRkxBR19TTEFWRV9QT1NTOworCWFwLT5waW9fbWFzawkJPSAweDFmOwkvKiBVcCB0byBQSU80ICovCisJYXAtPm13ZG1hX21hc2sJCT0gMHgwMDsJLyogTm8gTVdETUEgICAqLworCWFwLT51ZG1hX21hc2sJCT0gMHgwMDsJLyogTm8gVURNQSAgICAqLworCWFwLT5vcHMJCQk9ICZtcGM1Mnh4X2F0YV9wb3J0X29wczsKKwlob3N0LT5wcml2YXRlX2RhdGEJPSBwcml2OworCisJYWlvID0gJmFwLT5pb2FkZHI7CiAJYWlvLT5jbWRfYWRkcgkJPSBOVUxMOwkvKiBEb24ndCBoYXZlIGEgY2xhc3NpYyByZWcgYmxvY2sgKi8KIAlhaW8tPmFsdHN0YXR1c19hZGRyCT0gJnByaXYtPmF0YV9yZWdzLT50Zl9jb250cm9sOwogCWFpby0+Y3RsX2FkZHIJCT0gJnByaXYtPmF0YV9yZWdzLT50Zl9jb250cm9sOwpAQCAtMzQzLDExICszNDIsOSBAQAogCWFpby0+c3RhdHVzX2FkZHIJPSAmcHJpdi0+YXRhX3JlZ3MtPnRmX2NvbW1hbmQ7CiAJYWlvLT5jb21tYW5kX2FkZHIJPSAmcHJpdi0+YXRhX3JlZ3MtPnRmX2NvbW1hbmQ7CiAKLQlhZS0+cHJpdmF0ZV9kYXRhID0gcHJpdjsKLQotCXJ2ID0gYXRhX2RldmljZV9hZGQoYWUpOwotCi0JcmV0dXJuIHJ2ID8gMCA6IC1FSU5WQUw7CisJLyogYWN0aXZhdGUgaG9zdCAqLworCXJldHVybiBhdGFfaG9zdF9hY3RpdmF0ZShob3N0LCBwcml2LT5hdGFfaXJxLCBhdGFfaW50ZXJydXB0LCAwLAorCQkJCSAmbXBjNTJ4eF9hdGFfc2h0KTsKIH0KIAogc3RhdGljIHN0cnVjdCBtcGM1Mnh4X2F0YV9wcml2ICoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfbXBpaXguYyBiL2RyaXZlcnMvYXRhL3BhdGFfbXBpaXguYwppbmRleCA0YWJlNDVhLi45ODdjNWZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX21waWl4LmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9tcGlpeC5jCkBAIC0zNSw3ICszNSw3IEBACiAjaW5jbHVkZSA8bGludXgvbGliYXRhLmg+CiAKICNkZWZpbmUgRFJWX05BTUUgInBhdGFfbXBpaXgiCi0jZGVmaW5lIERSVl9WRVJTSU9OICIwLjcuNSIKKyNkZWZpbmUgRFJWX1ZFUlNJT04gIjAuNy42IgogCiBlbnVtIHsKIAlJREVUSU0gPSAweDZDLAkJLyogSURFIGNvbnRyb2wgcmVnaXN0ZXIgKi8KQEAgLTUzLDcgKzUzLDYgQEAKIAogCWlmICghcGNpX3Rlc3RfY29uZmlnX2JpdHMocGRldiwgJm1waWl4X2VuYWJsZV9iaXRzKSkKIAkJcmV0dXJuIC1FTk9FTlQ7Ci0JYXAtPmNibCA9IEFUQV9DQkxfUEFUQTQwOwogCXJldHVybiBhdGFfc3RkX3ByZXJlc2V0KGFwKTsKIH0KIApAQCAtMTg1LDEyICsxODQsMTIgQEAKIAkudGhhdwkJPSBhdGFfYm1kbWFfdGhhdywKIAkuZXJyb3JfaGFuZGxlcgk9IG1waWl4X2Vycm9yX2hhbmRsZXIsCiAJLnBvc3RfaW50ZXJuYWxfY21kID0gYXRhX2JtZG1hX3Bvc3RfaW50ZXJuYWxfY21kLAorCS5jYWJsZV9kZXRlY3QJPSBhdGFfY2FibGVfNDB3aXJlLAogCiAJLnFjX3ByZXAgCT0gYXRhX3FjX3ByZXAsCiAJLnFjX2lzc3VlCT0gbXBpaXhfcWNfaXNzdWVfcHJvdCwKIAkuZGF0YV94ZmVyCT0gYXRhX2RhdGFfeGZlciwKIAotCS5pcnFfaGFuZGxlcgk9IGF0YV9pbnRlcnJ1cHQsCiAJLmlycV9jbGVhcgk9IGF0YV9ibWRtYV9pcnFfY2xlYXIsCiAJLmlycV9vbgkJPSBhdGFfaXJxX29uLAogCS5pcnFfYWNrCT0gYXRhX2lycV9hY2ssCkBAIC0yMDEsOCArMjAwLDkgQEAKIHN0YXRpYyBpbnQgbXBpaXhfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKmRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQogewogCS8qIFNpbmdsZSB0aHJlYWRlZCBieSB0aGUgUENJIHByb2JlIGxvZ2ljICovCi0Jc3RhdGljIHN0cnVjdCBhdGFfcHJvYmVfZW50IHByb2JlOwogCXN0YXRpYyBpbnQgcHJpbnRlZF92ZXJzaW9uOworCXN0cnVjdCBhdGFfaG9zdCAqaG9zdDsKKwlzdHJ1Y3QgYXRhX3BvcnQgKmFwOwogCXZvaWQgX19pb21lbSAqY21kX2FkZHIsICpjdGxfYWRkcjsKIAl1MTYgaWRldGltOwogCWludCBpcnE7CkBAIC0yMTAsNiArMjEwLDEwIEBACiAJaWYgKCFwcmludGVkX3ZlcnNpb24rKykKIAkJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCAmZGV2LT5kZXYsICJ2ZXJzaW9uICIgRFJWX1ZFUlNJT04gIlxuIik7CiAKKwlob3N0ID0gYXRhX2hvc3RfYWxsb2MoJmRldi0+ZGV2LCAxKTsKKwlpZiAoIWhvc3QpCisJCXJldHVybiAtRU5PTUVNOworCiAJLyogTVBJSVggaGFzIG1hbnkgZnVuY3Rpb25zIHdoaWNoIGNhbiBiZSB0dXJuZWQgb24gb3Igb2ZmIGFjY29yZGluZwogCSAgIHRvIG90aGVyIGRldmljZXMgcHJlc2VudC4gTWFrZSBzdXJlIElERSBpcyBlbmFibGVkIGJlZm9yZSB3ZSB0cnkKIAkgICBhbmQgdXNlIGl0ICovCkBAIC0yMzgsMjcgKzI0MiwyMSBAQAogCSAgIHdpdGhvdXQgQkFScyBzZXQgZm9vbHMgdGhlIHNldHVwLiAgIzIgSWYgeW91IHBjaV9kaXNhYmxlX2RldmljZQogCSAgIHRoZSBNUElJWCB5b3VyIGJveCBnb2VzIGNhc3RvcnMgdXAgKi8KIAotCUlOSVRfTElTVF9IRUFEKCZwcm9iZS5ub2RlKTsKLQlwcm9iZS5kZXYgPSBwY2lfZGV2X3RvX2RldihkZXYpOwotCXByb2JlLnBvcnRfb3BzID0gJm1waWl4X3BvcnRfb3BzOwotCXByb2JlLnNodCA9ICZtcGlpeF9zaHQ7Ci0JcHJvYmUucGlvX21hc2sgPSAweDFGOwotCXByb2JlLmlycV9mbGFncyA9IElSUUZfU0hBUkVEOwotCXByb2JlLnBvcnRfZmxhZ3MgPSBBVEFfRkxBR19TTEFWRV9QT1NTIHwgQVRBX0ZMQUdfU1JTVDsKLQlwcm9iZS5uX3BvcnRzID0gMTsKKwlhcCA9IGhvc3QtPnBvcnRzWzBdOworCWFwLT5vcHMgPSAmbXBpaXhfcG9ydF9vcHM7CisJYXAtPnBpb19tYXNrID0gMHgxRjsKKwlhcC0+ZmxhZ3MgfD0gQVRBX0ZMQUdfU0xBVkVfUE9TUzsKIAotCXByb2JlLmlycSA9IGlycTsKLQlwcm9iZS5wb3J0WzBdLmNtZF9hZGRyID0gY21kX2FkZHI7Ci0JcHJvYmUucG9ydFswXS5jdGxfYWRkciA9IGN0bF9hZGRyOwotCXByb2JlLnBvcnRbMF0uYWx0c3RhdHVzX2FkZHIgPSBjdGxfYWRkcjsKKwlhcC0+aW9hZGRyLmNtZF9hZGRyID0gY21kX2FkZHI7CisJYXAtPmlvYWRkci5jdGxfYWRkciA9IGN0bF9hZGRyOworCWFwLT5pb2FkZHIuYWx0c3RhdHVzX2FkZHIgPSBjdGxfYWRkcjsKIAogCS8qIExldCBsaWJhdGEgZmlsbCBpbiB0aGUgcG9ydCBkZXRhaWxzICovCi0JYXRhX3N0ZF9wb3J0cygmcHJvYmUucG9ydFswXSk7CisJYXRhX3N0ZF9wb3J0cygmYXAtPmlvYWRkcik7CiAKLQkvKiBOb3cgYWRkIHRoZSBwb3J0IHRoYXQgaXMgYWN0aXZlICovCi0JaWYgKGF0YV9kZXZpY2VfYWRkKCZwcm9iZSkpCi0JCXJldHVybiAwOwotCXJldHVybiAtRU5PREVWOworCS8qIGFjdGl2YXRlIGhvc3QgKi8KKwlyZXR1cm4gYXRhX2hvc3RfYWN0aXZhdGUoaG9zdCwgaXJxLCBhdGFfaW50ZXJydXB0LCBJUlFGX1NIQVJFRCwKKwkJCQkgJm1waWl4X3NodCk7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBtcGlpeFtdID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9uZXRjZWxsLmMgYi9kcml2ZXJzL2F0YS9wYXRhX25ldGNlbGwuYwppbmRleCAzOGY5OWIzLi5kYmJhNWI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX25ldGNlbGwuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX25ldGNlbGwuYwpAQCAtMTYsMzMgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9hdGEuaD4KIAogI2RlZmluZSBEUlZfTkFNRQkicGF0YV9uZXRjZWxsIgotI2RlZmluZSBEUlZfVkVSU0lPTgkiMC4xLjYiCi0KLS8qKgotICoJbmV0Y2VsbF9wcm9iZV9pbml0CS0JY2hlY2sgZm9yIDQwLzgwIHBpbgotICoJQGFwOiBQb3J0Ci0gKgotICoJQ2FibGVzIGFyZSBoYW5kbGVkIGJ5IHRoZSBSQUlEIGNvbnRyb2xsZXIuIFJlcG9ydCA4MCBwaW4uCi0gKi8KLQotc3RhdGljIGludCBuZXRjZWxsX3ByZV9yZXNldChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQotewotCWFwLT5jYmwgPSBBVEFfQ0JMX1BBVEE4MDsKLQlyZXR1cm4gYXRhX3N0ZF9wcmVyZXNldChhcCk7Ci19Ci0KLS8qKgotICoJbmV0Y2VsbF9wcm9iZV9yZXNldCAtIFByb2JlIHNwZWNpZmllZCBwb3J0IG9uIFBBVEEgaG9zdCBjb250cm9sbGVyCi0gKglAYXA6IFBvcnQgdG8gcHJvYmUKLSAqCi0gKglMT0NLSU5HOgotICoJTm9uZSAoaW5oZXJpdGVkIGZyb20gY2FsbGVyKS4KLSAqLwotCi1zdGF0aWMgdm9pZCBuZXRjZWxsX2Vycm9yX2hhbmRsZXIoc3RydWN0IGF0YV9wb3J0ICphcCkKLXsKLQlyZXR1cm4gYXRhX2JtZG1hX2RyaXZlX2VoKGFwLCBuZXRjZWxsX3ByZV9yZXNldCwgYXRhX3N0ZF9zb2Z0cmVzZXQsIE5VTEwsIGF0YV9zdGRfcG9zdHJlc2V0KTsKLX0KKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjAuMS43IgogCiAvKiBObyBQSU8gb3IgRE1BIG1ldGhvZHMgbmVlZGVkIGZvciB0aGlzIGRldmljZSAqLwogCkBAIC04MSw4ICs1NSw5IEBACiAKIAkuZnJlZXplCQkJPSBhdGFfYm1kbWFfZnJlZXplLAogCS50aGF3CQkJPSBhdGFfYm1kbWFfdGhhdywKLQkuZXJyb3JfaGFuZGxlcgkJPSBuZXRjZWxsX2Vycm9yX2hhbmRsZXIsCisJLmVycm9yX2hhbmRsZXIJCT0gYXRhX2JtZG1hX2Vycm9yX2hhbmRsZXIsCiAJLnBvc3RfaW50ZXJuYWxfY21kCT0gYXRhX2JtZG1hX3Bvc3RfaW50ZXJuYWxfY21kLAorCS5jYWJsZV9kZXRlY3QJCT0gYXRhX2NhYmxlXzgwd2lyZSwKIAogCS8qIEJNRE1BIGhhbmRsaW5nIGlzIFBDSSBBVEEgZm9ybWF0LCB1c2UgaGVscGVycyAqLwogCS5ibWRtYV9zZXR1cAkJPSBhdGFfYm1kbWFfc2V0dXAsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX25zODc0MTAuYyBiL2RyaXZlcnMvYXRhL3BhdGFfbnM4NzQxMC5jCmluZGV4IDk5NDRhMjguLjA3OGFlZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfbnM4NzQxMC5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfbnM4NzQxMC5jCkBAIC0yOCwxMyArMjgsMTMgQEAKICNpbmNsdWRlIDxsaW51eC9saWJhdGEuaD4KIAogI2RlZmluZSBEUlZfTkFNRSAicGF0YV9uczg3NDEwIgotI2RlZmluZSBEUlZfVkVSU0lPTiAiMC40LjMiCisjZGVmaW5lIERSVl9WRVJTSU9OICIwLjQuNiIKIAogLyoqCiAgKgluczg3NDEwX3ByZV9yZXNldAkJLQlwcm9iZSBiZWdpbgogICoJQGFwOiBBVEEgcG9ydAogICoKLSAqCVNldCB1cCBjYWJsZSB0eXBlIGFuZCB1c2UgZ2VuZXJpYyBwcm9iZSBpbml0CisgKglDaGVjayBlbmFibGVkIHBvcnRzCiAgKi8KIAogc3RhdGljIGludCBuczg3NDEwX3ByZV9yZXNldChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQpAQCAtNDcsNyArNDcsNiBAQAogCiAJaWYgKCFwY2lfdGVzdF9jb25maWdfYml0cyhwZGV2LCAmbnM4NzQxMF9lbmFibGVfYml0c1thcC0+cG9ydF9ub10pKQogCQlyZXR1cm4gLUVOT0VOVDsKLQlhcC0+Y2JsID0gQVRBX0NCTF9QQVRBNDA7CiAJcmV0dXJuIGF0YV9zdGRfcHJlcmVzZXQoYXApOwogfQogCkBAIC0xNzcsNiArMTc2LDcgQEAKIAkudGhhdwkJPSBhdGFfYm1kbWFfdGhhdywKIAkuZXJyb3JfaGFuZGxlcgk9IG5zODc0MTBfZXJyb3JfaGFuZGxlciwKIAkucG9zdF9pbnRlcm5hbF9jbWQgPSBhdGFfYm1kbWFfcG9zdF9pbnRlcm5hbF9jbWQsCisJLmNhYmxlX2RldGVjdAk9IGF0YV9jYWJsZV80MHdpcmUsCiAKIAkucWNfcHJlcCAJPSBhdGFfcWNfcHJlcCwKIAkucWNfaXNzdWUJPSBuczg3NDEwX3FjX2lzc3VlX3Byb3QsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX29sZHBpaXguYyBiL2RyaXZlcnMvYXRhL3BhdGFfb2xkcGlpeC5jCmluZGV4IGRhNjhjZDEuLmRlYTQ2OTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfb2xkcGlpeC5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfb2xkcGlpeC5jCkBAIC0yNSw3ICsyNSw3IEBACiAjaW5jbHVkZSA8bGludXgvYXRhLmg+CiAKICNkZWZpbmUgRFJWX05BTUUJInBhdGFfb2xkcGlpeCIKLSNkZWZpbmUgRFJWX1ZFUlNJT04JIjAuNS40IgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMC41LjUiCiAKIC8qKgogICoJb2xkcGlpeF9wcmVfcmVzZXQJCS0JcHJvYmUgYmVnaW4KQEAgLTQ0LDcgKzQ0LDYgQEAKIAogCWlmICghcGNpX3Rlc3RfY29uZmlnX2JpdHMocGRldiwgJm9sZHBpaXhfZW5hYmxlX2JpdHNbYXAtPnBvcnRfbm9dKSkKIAkJcmV0dXJuIC1FTk9FTlQ7Ci0JYXAtPmNibCA9IEFUQV9DQkxfUEFUQTQwOwogCXJldHVybiBhdGFfc3RkX3ByZXJlc2V0KGFwKTsKIH0KIApAQCAtNjUsNyArNjQsNyBAQAogLyoqCiAgKglvbGRwaWl4X3NldF9waW9tb2RlIC0gSW5pdGlhbGl6ZSBob3N0IGNvbnRyb2xsZXIgUEFUQSBQSU8gdGltaW5ncwogICoJQGFwOiBQb3J0IHdob3NlIHRpbWluZ3Mgd2UgYXJlIGNvbmZpZ3VyaW5nCi0gKglAYWRldjogdW0KKyAqCUBhZGV2OiBEZXZpY2Ugd2hvc2UgdGltaW5ncyB3ZSBhcmUgY29uZmlndXJpbmcKICAqCiAgKglTZXQgUElPIG1vZGUgZm9yIGRldmljZSwgaW4gaG9zdCBjb250cm9sbGVyIFBDSSBjb25maWcgc3BhY2UuCiAgKgpAQCAtMjU1LDYgKzI1NCw3IEBACiAJLnRoYXcJCQk9IGF0YV9ibWRtYV90aGF3LAogCS5lcnJvcl9oYW5kbGVyCQk9IG9sZHBpaXhfcGF0YV9lcnJvcl9oYW5kbGVyLAogCS5wb3N0X2ludGVybmFsX2NtZCAJPSBhdGFfYm1kbWFfcG9zdF9pbnRlcm5hbF9jbWQsCisJLmNhYmxlX2RldGVjdAkJPSBhdGFfY2FibGVfNDB3aXJlLAogCiAJLmJtZG1hX3NldHVwCQk9IGF0YV9ibWRtYV9zZXR1cCwKIAkuYm1kbWFfc3RhcnQJCT0gYXRhX2JtZG1hX3N0YXJ0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9vcHRpLmMgYi9kcml2ZXJzL2F0YS9wYXRhX29wdGkuYwppbmRleCAzZmQzYTM1Li4xM2I2M2UyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX29wdGkuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX29wdGkuYwpAQCAtMzQsNyArMzQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpYmF0YS5oPgogCiAjZGVmaW5lIERSVl9OQU1FICJwYXRhX29wdGkiCi0jZGVmaW5lIERSVl9WRVJTSU9OICIwLjIuOCIKKyNkZWZpbmUgRFJWX1ZFUlNJT04gIjAuMi45IgogCiBlbnVtIHsKIAlSRUFEX1JFRwk9IDAsCS8qIGluZGV4IG9mIFJlYWQgY3ljbGUgdGltaW5nIHJlZ2lzdGVyICovCkBAIC02MSw4ICs2MSw2IEBACiAKIAlpZiAoIXBjaV90ZXN0X2NvbmZpZ19iaXRzKHBkZXYsICZvcHRpX2VuYWJsZV9iaXRzW2FwLT5wb3J0X25vXSkpCiAJCXJldHVybiAtRU5PRU5UOwotCi0JYXAtPmNibCA9IEFUQV9DQkxfUEFUQTQwOwogCXJldHVybiBhdGFfc3RkX3ByZXJlc2V0KGFwKTsKIH0KIApAQCAtMTk4LDYgKzE5Niw3IEBACiAJLnRoYXcJCT0gYXRhX2JtZG1hX3RoYXcsCiAJLmVycm9yX2hhbmRsZXIJPSBvcHRpX2Vycm9yX2hhbmRsZXIsCiAJLnBvc3RfaW50ZXJuYWxfY21kID0gYXRhX2JtZG1hX3Bvc3RfaW50ZXJuYWxfY21kLAorCS5jYWJsZV9kZXRlY3QJPSBhdGFfY2FibGVfNDB3aXJlLAogCiAJLmJtZG1hX3NldHVwIAk9IGF0YV9ibWRtYV9zZXR1cCwKIAkuYm1kbWFfc3RhcnQgCT0gYXRhX2JtZG1hX3N0YXJ0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9vcHRpZG1hLmMgYi9kcml2ZXJzL2F0YS9wYXRhX29wdGlkbWEuYwppbmRleCA5NzY0OTA3Li5iNzBlMDRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX29wdGlkbWEuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX29wdGlkbWEuYwpAQCAtMzMsNyArMzMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpYmF0YS5oPgogCiAjZGVmaW5lIERSVl9OQU1FICJwYXRhX29wdGlkbWEiCi0jZGVmaW5lIERSVl9WRVJTSU9OICIwLjIuNCIKKyNkZWZpbmUgRFJWX1ZFUlNJT04gIjAuMy4yIgogCiBlbnVtIHsKIAlSRUFEX1JFRwk9IDAsCS8qIGluZGV4IG9mIFJlYWQgY3ljbGUgdGltaW5nIHJlZ2lzdGVyICovCkBAIC02Miw3ICs2Miw2IEBACiAJaWYgKGFwLT5wb3J0X25vICYmICFwY2lfdGVzdF9jb25maWdfYml0cyhwZGV2LCAmb3B0aWRtYV9lbmFibGVfYml0cykpCiAJCXJldHVybiAtRU5PRU5UOwogCi0JYXAtPmNibCA9IEFUQV9DQkxfUEFUQTQwOwogCXJldHVybiBhdGFfc3RkX3ByZXJlc2V0KGFwKTsKIH0KIApAQCAtMTE1LDcgKzExNCw3IEBACiB9CiAKIC8qKgotICoJb3B0aWRtYV9zZXRfbW9kZQktCXNldCBtb2RlIGRhdGEKKyAqCW9wdGlkbWFfbW9kZV9zZXR1cAktCXNldCBtb2RlIGRhdGEKICAqCUBhcDogQVRBIGludGVyZmFjZQogICoJQGFkZXY6IEFUQSBkZXZpY2UKICAqCUBtb2RlOiBNb2RlIHRvIHNldApAQCAtMTI4LDcgKzEyNyw3IEBACiAgKglJUlEgaGVyZSB3ZSBkZXBlbmQgb24gdGhlIGhvc3Qgc2V0IGxvY2tpbmcgdG8gYXZvaWQgY2F0YXN0cm9waGUuCiAgKi8KIAotc3RhdGljIHZvaWQgb3B0aWRtYV9zZXRfbW9kZShzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX2RldmljZSAqYWRldiwgdTggbW9kZSkKK3N0YXRpYyB2b2lkIG9wdGlkbWFfbW9kZV9zZXR1cChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX2RldmljZSAqYWRldiwgdTggbW9kZSkKIHsKIAlzdHJ1Y3QgYXRhX2RldmljZSAqcGFpciA9IGF0YV9kZXZfcGFpcihhZGV2KTsKIAlpbnQgcGlvID0gYWRldi0+cGlvX21vZGUgLSBYRkVSX1BJT18wOwpAQCAtMjAyLDcgKzIwMSw3IEBACiB9CiAKIC8qKgotICoJb3B0aXBsdXNfc2V0X21vZGUJLQlETUEgc2V0dXAgZm9yIEZpcmVzdGFyIFBsdXMKKyAqCW9wdGlwbHVzX21vZGVfc2V0dXAJLQlETUEgc2V0dXAgZm9yIEZpcmVzdGFyIFBsdXMKICAqCUBhcDogQVRBIHBvcnQKICAqCUBhZGV2OiBkZXZpY2UKICAqCUBtb2RlOiBkZXNpcmVkIG1vZGUKQEAgLTIxMyw3ICsyMTIsNyBAQAogICoJb25lCiAgKi8KIAotc3RhdGljIHZvaWQgb3B0aXBsdXNfc2V0X21vZGUoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV9kZXZpY2UgKmFkZXYsIHU4IG1vZGUpCitzdGF0aWMgdm9pZCBvcHRpcGx1c19tb2RlX3NldHVwKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfZGV2aWNlICphZGV2LCB1OCBtb2RlKQogewogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihhcC0+aG9zdC0+ZGV2KTsKIAl1OCB1ZGNmZzsKQEAgLTIyNSw3ICsyMjQsNyBAQAogCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIDB4NDQsICZ1ZGNmZyk7CiAJaWYgKG1vZGUgPD0gWEZFUl9VRE1BXzApIHsKIAkJdWRjZmcgJj0gfigxIDw8IHVuaXQpOwotCQlvcHRpZG1hX3NldF9tb2RlKGFwLCBhZGV2LCBhZGV2LT5kbWFfbW9kZSk7CisJCW9wdGlkbWFfbW9kZV9zZXR1cChhcCwgYWRldiwgYWRldi0+ZG1hX21vZGUpOwogCX0gZWxzZSB7CiAJCXVkY2ZnIHw9ICAoMSA8PCB1bml0KTsKIAkJaWYgKGFwLT5wb3J0X25vKSB7CkBAIC0yNTMsNyArMjUyLDcgQEAKIAogc3RhdGljIHZvaWQgb3B0aWRtYV9zZXRfcGlvX21vZGUoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV9kZXZpY2UgKmFkZXYpCiB7Ci0Jb3B0aWRtYV9zZXRfbW9kZShhcCwgYWRldiwgYWRldi0+cGlvX21vZGUpOworCW9wdGlkbWFfbW9kZV9zZXR1cChhcCwgYWRldiwgYWRldi0+cGlvX21vZGUpOwogfQogCiAvKioKQEAgLTI2OCw3ICsyNjcsNyBAQAogCiBzdGF0aWMgdm9pZCBvcHRpZG1hX3NldF9kbWFfbW9kZShzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX2RldmljZSAqYWRldikKIHsKLQlvcHRpZG1hX3NldF9tb2RlKGFwLCBhZGV2LCBhZGV2LT5kbWFfbW9kZSk7CisJb3B0aWRtYV9tb2RlX3NldHVwKGFwLCBhZGV2LCBhZGV2LT5kbWFfbW9kZSk7CiB9CiAKIC8qKgpAQCAtMjgzLDcgKzI4Miw3IEBACiAKIHN0YXRpYyB2b2lkIG9wdGlwbHVzX3NldF9waW9fbW9kZShzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX2RldmljZSAqYWRldikKIHsKLQlvcHRpcGx1c19zZXRfbW9kZShhcCwgYWRldiwgYWRldi0+cGlvX21vZGUpOworCW9wdGlwbHVzX21vZGVfc2V0dXAoYXAsIGFkZXYsIGFkZXYtPnBpb19tb2RlKTsKIH0KIAogLyoqCkBAIC0yOTgsNyArMjk3LDcgQEAKIAogc3RhdGljIHZvaWQgb3B0aXBsdXNfc2V0X2RtYV9tb2RlKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfZGV2aWNlICphZGV2KQogewotCW9wdGlwbHVzX3NldF9tb2RlKGFwLCBhZGV2LCBhZGV2LT5kbWFfbW9kZSk7CisJb3B0aXBsdXNfbW9kZV9zZXR1cChhcCwgYWRldiwgYWRldi0+ZG1hX21vZGUpOwogfQogCiAvKioKQEAgLTMyMiwyNiArMzIxLDI5IEBACiB9CiAKIC8qKgotICoJb3B0aWRtYV9wb3N0X3NldF9tb2RlCS0JZmluYWxpemUgUENJIHNldHVwCisgKglvcHRpZG1hX3NldF9tb2RlCS0JbW9kZSBzZXR1cAogICoJQGFwOiBwb3J0IHRvIHNldCB1cAogICoKLSAqCUZpbmFsaXNlIHRoZSBjb25maWd1cmF0aW9uIGJ5IHdyaXRpbmcgdGhlIG5pYmJsZSBvZiBleHRyYSBiaXRzCi0gKglvZiBkYXRhIGludG8gdGhlIGNoaXAuCisgKglVc2UgdGhlIHN0YW5kYXJkIHNldHVwIHRvIHR1bmUgdGhlIGNoaXBzZXQgYW5kIHRoZW4gZmluYWxpc2UgdGhlCisgKgljb25maWd1cmF0aW9uIGJ5IHdyaXRpbmcgdGhlIG5pYmJsZSBvZiBleHRyYSBiaXRzIG9mIGRhdGEgaW50bworICoJdGhlIGNoaXAuCiAgKi8KIAotc3RhdGljIHZvaWQgb3B0aWRtYV9wb3N0X3NldF9tb2RlKHN0cnVjdCBhdGFfcG9ydCAqYXApCitzdGF0aWMgaW50IG9wdGlkbWFfc2V0X21vZGUoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV9kZXZpY2UgKipyX2ZhaWxlZCkKIHsKIAl1OCByOwogCWludCBueWJibGUgPSA0ICogYXAtPnBvcnRfbm87CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGFwLT5ob3N0LT5kZXYpOworCWludCByYyAgPSBhdGFfZG9fc2V0X21vZGUoYXAsIHJfZmFpbGVkKTsKKwlpZiAocmMgPT0gMCkgeworCQlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCAweDQzLCAmcik7CiAKLQlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCAweDQzLCAmcik7Ci0KLQlyICY9ICgweDBGIDw8IG55YmJsZSk7Ci0JciB8PSAob3B0aWRtYV9tYWtlX2JpdHM0MygmYXAtPmRldmljZVswXSkgKwotCSAgICAgKG9wdGlkbWFfbWFrZV9iaXRzNDMoJmFwLT5kZXZpY2VbMF0pIDw8IDIpKSA8PCBueWJibGU7Ci0KLQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgMHg0Mywgcik7CisJCXIgJj0gKDB4MEYgPDwgbnliYmxlKTsKKwkJciB8PSAob3B0aWRtYV9tYWtlX2JpdHM0MygmYXAtPmRldmljZVswXSkgKworCQkgICAgIChvcHRpZG1hX21ha2VfYml0czQzKCZhcC0+ZGV2aWNlWzBdKSA8PCAyKSkgPDwgbnliYmxlOworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgMHg0Mywgcik7CisJfQorCXJldHVybiByYzsKIH0KIAogc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgb3B0aWRtYV9zaHQgPSB7CkBAIC0zODEsNyArMzgzLDggQEAKIAkudGhhdwkJPSBhdGFfYm1kbWFfdGhhdywKIAkucG9zdF9pbnRlcm5hbF9jbWQgPSBhdGFfYm1kbWFfcG9zdF9pbnRlcm5hbF9jbWQsCiAJLmVycm9yX2hhbmRsZXIJPSBvcHRpZG1hX2Vycm9yX2hhbmRsZXIsCi0JLnBvc3Rfc2V0X21vZGUJPSBvcHRpZG1hX3Bvc3Rfc2V0X21vZGUsCisJLnNldF9tb2RlCT0gb3B0aWRtYV9zZXRfbW9kZSwKKwkuY2FibGVfZGV0ZWN0CT0gYXRhX2NhYmxlXzQwd2lyZSwKIAogCS5ibWRtYV9zZXR1cCAJPSBhdGFfYm1kbWFfc2V0dXAsCiAJLmJtZG1hX3N0YXJ0IAk9IGF0YV9ibWRtYV9zdGFydCwKQEAgLTQxNiw3ICs0MTksOCBAQAogCS50aGF3CQk9IGF0YV9ibWRtYV90aGF3LAogCS5wb3N0X2ludGVybmFsX2NtZCA9IGF0YV9ibWRtYV9wb3N0X2ludGVybmFsX2NtZCwKIAkuZXJyb3JfaGFuZGxlcgk9IG9wdGlkbWFfZXJyb3JfaGFuZGxlciwKLQkucG9zdF9zZXRfbW9kZQk9IG9wdGlkbWFfcG9zdF9zZXRfbW9kZSwKKwkuc2V0X21vZGUJPSBvcHRpZG1hX3NldF9tb2RlLAorCS5jYWJsZV9kZXRlY3QJPSBhdGFfY2FibGVfNDB3aXJlLAogCiAJLmJtZG1hX3NldHVwIAk9IGF0YV9ibWRtYV9zZXR1cCwKIAkuYm1kbWFfc3RhcnQgCT0gYXRhX2JtZG1hX3N0YXJ0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9wY21jaWEuYyBiL2RyaXZlcnMvYXRhL3BhdGFfcGNtY2lhLmMKaW5kZXggMTAzNzIwZi4uNzVkYzg0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9wY21jaWEuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX3BjbWNpYS5jCkBAIC00Miw3ICs0Miw3IEBACiAKIAogI2RlZmluZSBEUlZfTkFNRSAicGF0YV9wY21jaWEiCi0jZGVmaW5lIERSVl9WRVJTSU9OICIwLjMuMCIKKyNkZWZpbmUgRFJWX1ZFUlNJT04gIjAuMy4xIgogCiAvKgogICoJUHJpdmF0ZSBkYXRhIHN0cnVjdHVyZSB0byBnbHVlIHN0dWZmIHRvZ2V0aGVyCkBAIC01NCw2ICs1NCwzOSBAQAogCWRldl9ub2RlX3QJbm9kZTsKIH07CiAKKy8qKgorICoJcGNtY2lhX3NldF9tb2RlCS0JUENNQ0lBIHNwZWNpZmljIG1vZGUgc2V0dXAKKyAqCUBhcDogUG9ydAorICoJQHJfZmFpbGVkX2RldjogUmV0dXJuIHBvaW50ZXIgZm9yIGZhaWxlZCBkZXZpY2UKKyAqCisgKglQZXJmb3JtIHRoZSB0dW5pbmcgYW5kIHNldHVwIG9mIHRoZSBkZXZpY2VzIGFuZCB0aW1pbmdzLCB3aGljaAorICoJZm9yIFBDTUNJQSBpcyB0aGUgc2FtZSBhcyBhbnkgb3RoZXIgY29udHJvbGxlci4gV2Ugd3JhcCBpdCBob3dldmVyCisgKglhcyB3ZSBuZWVkIHRvIHNwb3QgaGFyZHdhcmUgd2l0aCBpbmNvcnJlY3Qgb3IgbWlzc2luZyBtYXN0ZXIvc2xhdmUKKyAqCWRlY29kZSwgd2hpY2ggYWxhcyBpcyBlbWJhcnJhc3NpbmdseSBjb21tb24gaW4gdGhlIFBDIHdvcmxkCisgKi8KKworc3RhdGljIGludCBwY21jaWFfc2V0X21vZGUoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV9kZXZpY2UgKipyX2ZhaWxlZF9kZXYpCit7CisJc3RydWN0IGF0YV9kZXZpY2UgKm1hc3RlciA9ICZhcC0+ZGV2aWNlWzBdOworCXN0cnVjdCBhdGFfZGV2aWNlICpzbGF2ZSA9ICZhcC0+ZGV2aWNlWzFdOworCisJaWYgKCFhdGFfZGV2X2VuYWJsZWQobWFzdGVyKSB8fCAhYXRhX2Rldl9lbmFibGVkKHNsYXZlKSkKKwkJcmV0dXJuIGF0YV9kb19zZXRfbW9kZShhcCwgcl9mYWlsZWRfZGV2KTsKKworCWlmIChtZW1jbXAobWFzdGVyLT5pZCArIEFUQV9JRF9GV19SRVYsICBzbGF2ZS0+aWQgKyBBVEFfSURfRldfUkVWLAorCQkJICAgQVRBX0lEX0ZXX1JFVl9MRU4gKyBBVEFfSURfUFJPRF9MRU4pID09IDApCisJeworCQkvKiBTdXNwaWNpb3VzIG1hdGNoLCBidXQgY291bGQgYmUgdHdvIGNhcmRzIGZyb20KKwkJICAgdGhlIHNhbWUgdmVuZG9yIC0gY2hlY2sgc2VyaWFsICovCisJCWlmIChtZW1jbXAobWFzdGVyLT5pZCArIEFUQV9JRF9TRVJOTywgc2xhdmUtPmlkICsgQVRBX0lEX1NFUk5PLAorCQkJICAgQVRBX0lEX1NFUk5PX0xFTikgPT0gMCAmJiBtYXN0ZXItPmlkW0FUQV9JRF9TRVJOT10gPj4gOCkgeworCQkJYXRhX2Rldl9wcmludGsoc2xhdmUsIEtFUk5fV0FSTklORywgImlzIGEgZ2hvc3QgZGV2aWNlLCBpZ25vcmluZy5cbiIpOworCQkJYXRhX2Rldl9kaXNhYmxlKHNsYXZlKTsKKwkJfQorCX0KKwlyZXR1cm4gYXRhX2RvX3NldF9tb2RlKGFwLCByX2ZhaWxlZF9kZXYpOworfQorCiBzdGF0aWMgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBwY21jaWFfc2h0ID0gewogCS5tb2R1bGUJCQk9IFRISVNfTU9EVUxFLAogCS5uYW1lCQkJPSBEUlZfTkFNRSwKQEAgLTczLDYgKzEwNiw3IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgcGNtY2lhX3BvcnRfb3BzID0geworCS5zZXRfbW9kZQk9IHBjbWNpYV9zZXRfbW9kZSwKIAkucG9ydF9kaXNhYmxlCT0gYXRhX3BvcnRfZGlzYWJsZSwKIAkudGZfbG9hZAk9IGF0YV90Zl9sb2FkLAogCS50Zl9yZWFkCT0gYXRhX3RmX3JlYWQsCkBAIC04NCwxMyArMTE4LDEzIEBACiAJLnRoYXcJCT0gYXRhX2JtZG1hX3RoYXcsCiAJLmVycm9yX2hhbmRsZXIJPSBhdGFfYm1kbWFfZXJyb3JfaGFuZGxlciwKIAkucG9zdF9pbnRlcm5hbF9jbWQgPSBhdGFfYm1kbWFfcG9zdF9pbnRlcm5hbF9jbWQsCisJLmNhYmxlX2RldGVjdAk9IGF0YV9jYWJsZV80MHdpcmUsCiAKIAkucWNfcHJlcCAJPSBhdGFfcWNfcHJlcCwKIAkucWNfaXNzdWUJPSBhdGFfcWNfaXNzdWVfcHJvdCwKIAogCS5kYXRhX3hmZXIJPSBhdGFfZGF0YV94ZmVyX25vaXJxLAogCi0JLmlycV9oYW5kbGVyCT0gYXRhX2ludGVycnVwdCwKIAkuaXJxX2NsZWFyCT0gYXRhX2JtZG1hX2lycV9jbGVhciwKIAkuaXJxX29uCQk9IGF0YV9pcnFfb24sCiAJLmlycV9hY2sJPSBhdGFfaXJxX2FjaywKQEAgLTExMSw3ICsxNDUsOCBAQAogCiBzdGF0aWMgaW50IHBjbWNpYV9pbml0X29uZShzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcGRldikKIHsKLQlzdHJ1Y3QgYXRhX3Byb2JlX2VudCBhZTsKKwlzdHJ1Y3QgYXRhX2hvc3QgKmhvc3Q7CisJc3RydWN0IGF0YV9wb3J0ICphcDsKIAlzdHJ1Y3QgYXRhX3BjbWNpYV9pbmZvICppbmZvOwogCXR1cGxlX3QgdHVwbGU7CiAJc3RydWN0IHsKQEAgLTI1NSwyNCArMjkwLDI0IEBACiAgCSAqCUhhdmluZyBkb25lIHRoZSBQQ01DSUEgcGx1bWJpbmcgdGhlIEFUQSBzaWRlIGlzIHJlbGF0aXZlbHkKICAJICoJc2FuZS4KIAkgKi8KKwlyZXQgPSAtRU5PTUVNOworCWhvc3QgPSBhdGFfaG9zdF9hbGxvYygmcGRldi0+ZGV2LCAxKTsKKwlpZiAoIWhvc3QpCisJCWdvdG8gZmFpbGVkOworCWFwID0gaG9zdC0+cG9ydHNbMF07CiAKLQltZW1zZXQoJmFlLCAwLCBzaXplb2Yoc3RydWN0IGF0YV9wcm9iZV9lbnQpKTsKLQlJTklUX0xJU1RfSEVBRCgmYWUubm9kZSk7Ci0JYWUuZGV2ID0gJnBkZXYtPmRldjsKLQlhZS5wb3J0X29wcyA9ICZwY21jaWFfcG9ydF9vcHM7Ci0JYWUuc2h0ID0gJnBjbWNpYV9zaHQ7Ci0JYWUubl9wb3J0cyA9IDE7Ci0JYWUucGlvX21hc2sgPSAxOwkJLyogSVNBIHNvIFBJTyAwIGN5Y2xlcyAqLwotCWFlLmlycSA9IHBkZXYtPmlycS5Bc3NpZ25lZElSUTsKLQlhZS5pcnFfZmxhZ3MgPSBJUlFGX1NIQVJFRDsKLQlhZS5wb3J0X2ZsYWdzID0gQVRBX0ZMQUdfU0xBVkVfUE9TUyB8IEFUQV9GTEFHX1NSU1Q7Ci0JYWUucG9ydFswXS5jbWRfYWRkciA9IGlvX2FkZHI7Ci0JYWUucG9ydFswXS5hbHRzdGF0dXNfYWRkciA9IGN0bF9hZGRyOwotCWFlLnBvcnRbMF0uY3RsX2FkZHIgPSBjdGxfYWRkcjsKLQlhdGFfc3RkX3BvcnRzKCZhZS5wb3J0WzBdKTsKKwlhcC0+b3BzID0gJnBjbWNpYV9wb3J0X29wczsKKwlhcC0+cGlvX21hc2sgPSAxOwkJLyogSVNBIHNvIFBJTyAwIGN5Y2xlcyAqLworCWFwLT5mbGFncyB8PSBBVEFfRkxBR19TTEFWRV9QT1NTOworCWFwLT5pb2FkZHIuY21kX2FkZHIgPSBpb19hZGRyOworCWFwLT5pb2FkZHIuYWx0c3RhdHVzX2FkZHIgPSBjdGxfYWRkcjsKKwlhcC0+aW9hZGRyLmN0bF9hZGRyID0gY3RsX2FkZHI7CisJYXRhX3N0ZF9wb3J0cygmYXAtPmlvYWRkcik7CiAKLQlyZXQgPSAtRU5PREVWOwotCWlmIChhdGFfZGV2aWNlX2FkZCgmYWUpID09IDApCisJLyogYWN0aXZhdGUgKi8KKwlyZXQgPSBhdGFfaG9zdF9hY3RpdmF0ZShob3N0LCBwZGV2LT5pcnEuQXNzaWduZWRJUlEsIGF0YV9pbnRlcnJ1cHQsCisJCQkJSVJRRl9TSEFSRUQsICZwY21jaWFfc2h0KTsKKwlpZiAocmV0KQogCQlnb3RvIGZhaWxlZDsKIAogCWluZm8tPm5kZXYgPSAxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9wZGMyMDI3eC5jIGIvZHJpdmVycy9hdGEvcGF0YV9wZGMyMDI3eC5jCmluZGV4IDkzYmNkYWQuLmE2MWNiYzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfcGRjMjAyN3guYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX3BkYzIwMjd4LmMKQEAgLTM1LDcgKzM1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9saWJhdGEuaD4KIAogI2RlZmluZSBEUlZfTkFNRQkicGF0YV9wZGMyMDI3eCIKLSNkZWZpbmUgRFJWX1ZFUlNJT04JIjAuOCIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjAuOSIKICN1bmRlZiBQRENfREVCVUcKIAogI2lmZGVmIFBEQ19ERUJVRwpAQCAtNjYsOCArNjYsMTAgQEAKIHN0YXRpYyB2b2lkIHBkYzIwMjd4X2Vycm9yX2hhbmRsZXIoc3RydWN0IGF0YV9wb3J0ICphcCk7CiBzdGF0aWMgdm9pZCBwZGMyMDI3eF9zZXRfcGlvbW9kZShzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX2RldmljZSAqYWRldik7CiBzdGF0aWMgdm9pZCBwZGMyMDI3eF9zZXRfZG1hbW9kZShzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX2RldmljZSAqYWRldik7Ci1zdGF0aWMgdm9pZCBwZGMyMDI3eF9wb3N0X3NldF9tb2RlKHN0cnVjdCBhdGFfcG9ydCAqYXApOwogc3RhdGljIGludCBwZGMyMDI3eF9jaGVja19hdGFwaV9kbWEoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYyk7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBwZGMyMDI3eF9tb2RlX2ZpbHRlcihzdHJ1Y3QgYXRhX2RldmljZSAqYWRldiwgdW5zaWduZWQgbG9uZyBtYXNrKTsKK3N0YXRpYyBpbnQgcGRjMjAyN3hfY2FibGVfZGV0ZWN0KHN0cnVjdCBhdGFfcG9ydCAqYXApOworc3RhdGljIGludCBwZGMyMDI3eF9zZXRfbW9kZShzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX2RldmljZSAqKnJfZmFpbGVkKTsKIAogLyoKICAqIEFUQSBUaW1pbmcgVGFibGVzIGJhc2VkIG9uIDEzM01IeiBjb250cm9sbGVyIGNsb2NrLgpAQCAtMTQ2LDYgKzE0OCw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfb3BlcmF0aW9ucyBwZGMyMDI3eF9wYXRhMTAwX29wcyA9IHsKIAkucG9ydF9kaXNhYmxlCQk9IGF0YV9wb3J0X2Rpc2FibGUsCisJLm1vZGVfZmlsdGVyCQk9IGF0YV9wY2lfZGVmYXVsdF9maWx0ZXIsCiAKIAkudGZfbG9hZAkJPSBhdGFfdGZfbG9hZCwKIAkudGZfcmVhZAkJPSBhdGFfdGZfcmVhZCwKQEAgLTE2Niw4ICsxNjksOCBAQAogCS50aGF3CQkJPSBhdGFfYm1kbWFfdGhhdywKIAkuZXJyb3JfaGFuZGxlcgkJPSBwZGMyMDI3eF9lcnJvcl9oYW5kbGVyLAogCS5wb3N0X2ludGVybmFsX2NtZCAJPSBhdGFfYm1kbWFfcG9zdF9pbnRlcm5hbF9jbWQsCisJLmNhYmxlX2RldGVjdAkJPSBwZGMyMDI3eF9jYWJsZV9kZXRlY3QsCiAKLQkuaXJxX2hhbmRsZXIJCT0gYXRhX2ludGVycnVwdCwKIAkuaXJxX2NsZWFyCQk9IGF0YV9ibWRtYV9pcnFfY2xlYXIsCiAJLmlycV9vbgkJCT0gYXRhX2lycV9vbiwKIAkuaXJxX2FjawkJPSBhdGFfaXJxX2FjaywKQEAgLTE3OSw3ICsxODIsOCBAQAogCS5wb3J0X2Rpc2FibGUJCT0gYXRhX3BvcnRfZGlzYWJsZSwKIAkuc2V0X3Bpb21vZGUJCT0gcGRjMjAyN3hfc2V0X3Bpb21vZGUsCiAJLnNldF9kbWFtb2RlCQk9IHBkYzIwMjd4X3NldF9kbWFtb2RlLAotCS5wb3N0X3NldF9tb2RlCQk9IHBkYzIwMjd4X3Bvc3Rfc2V0X21vZGUsCisJLnNldF9tb2RlCQk9IHBkYzIwMjd4X3NldF9tb2RlLAorCS5tb2RlX2ZpbHRlcgkJPSBwZGMyMDI3eF9tb2RlX2ZpbHRlciwKIAogCS50Zl9sb2FkCQk9IGF0YV90Zl9sb2FkLAogCS50Zl9yZWFkCQk9IGF0YV90Zl9yZWFkLApAQCAtMjAwLDggKzIwNCw4IEBACiAJLnRoYXcJCQk9IGF0YV9ibWRtYV90aGF3LAogCS5lcnJvcl9oYW5kbGVyCQk9IHBkYzIwMjd4X2Vycm9yX2hhbmRsZXIsCiAJLnBvc3RfaW50ZXJuYWxfY21kCT0gYXRhX2JtZG1hX3Bvc3RfaW50ZXJuYWxfY21kLAorCS5jYWJsZV9kZXRlY3QJCT0gcGRjMjAyN3hfY2FibGVfZGV0ZWN0LAogCi0JLmlycV9oYW5kbGVyCQk9IGF0YV9pbnRlcnJ1cHQsCiAJLmlycV9jbGVhcgkJPSBhdGFfYm1kbWFfaXJxX2NsZWFyLAogCS5pcnFfb24JCQk9IGF0YV9pcnFfb24sCiAJLmlycV9hY2sJCT0gYXRhX2lycV9hY2ssCkBAIC0yMTIsNyArMjE2LDYgQEAKIHN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBwZGMyMDI3eF9wb3J0X2luZm9bXSA9IHsKIAkvKiBQRENfVURNQV8xMDAgKi8KIAl7Ci0JCS5zaHQJCT0gJnBkYzIwMjd4X3NodCwKIAkJLmZsYWdzCQk9IEFUQV9GTEFHX05PX0xFR0FDWSB8IEFUQV9GTEFHX1NMQVZFX1BPU1MgfAogCQkgICAgICAgICAgICAgICAgICBBVEFfRkxBR19NTUlPLAogCQkucGlvX21hc2sJPSAweDFmLCAvKiBwaW8wLTQgKi8KQEAgLTIyMiw3ICsyMjUsNiBAQAogCX0sCiAJLyogUERDX1VETUFfMTMzICovCiAJewotCQkuc2h0CQk9ICZwZGMyMDI3eF9zaHQsCiAJCS5mbGFncwkJPSBBVEFfRkxBR19OT19MRUdBQ1kgfCBBVEFfRkxBR19TTEFWRV9QT1NTIHwKICAgICAgICAgICAgICAgICAgICAgICAgIAkgIEFUQV9GTEFHX01NSU8sCiAJCS5waW9fbWFzawk9IDB4MWYsIC8qIHBpbzAtNCAqLwpAQCAtMjYxLDcgKzI2Myw3IEBACiB9CiAKIC8qKgotICoJcGRjMjAyN3hfcGF0YV9jYmxfZGV0ZWN0IC0gUHJvYmUgaG9zdCBjb250cm9sbGVyIGNhYmxlIGRldGVjdCBpbmZvCisgKglwZGMyMDI3eF9wYXRhX2NhYmxlX2RldGVjdCAtIFByb2JlIGhvc3QgY29udHJvbGxlciBjYWJsZSBkZXRlY3QgaW5mbwogICoJQGFwOiBQb3J0IGZvciB3aGljaCBjYWJsZSBkZXRlY3QgaW5mbyBpcyBkZXNpcmVkCiAgKgogICoJUmVhZCA4MGMgY2FibGUgaW5kaWNhdG9yIGZyb20gUHJvbWlzZSBleHRlbmRlZCByZWdpc3Rlci4KQEAgLTI3MCw3ICsyNzIsNyBAQAogICoJTE9DS0lORzoKICAqCU5vbmUgKGluaGVyaXRlZCBmcm9tIGNhbGxlcikuCiAgKi8KLXN0YXRpYyB2b2lkIHBkYzIwMjd4X2NibF9kZXRlY3Qoc3RydWN0IGF0YV9wb3J0ICphcCkKK3N0YXRpYyBpbnQgcGRjMjAyN3hfY2FibGVfZGV0ZWN0KHN0cnVjdCBhdGFfcG9ydCAqYXApCiB7CiAJdTMyIGNnY3I7CiAKQEAgLTI4MSwxMyArMjgzLDEwIEBACiAKIAlQRFBSSU5USygiTm8gY2FibGUgb3IgODAtY29uZHVjdG9yIGNhYmxlIG9uIHBvcnQgJWRcbiIsIGFwLT5wb3J0X25vKTsKIAotCWFwLT5jYmwgPSBBVEFfQ0JMX1BBVEE4MDsKLQlyZXR1cm47Ci0KKwlyZXR1cm4gQVRBX0NCTF9QQVRBODA7CiBjYmw0MDoKIAlwcmludGsoS0VSTl9JTkZPIERSVl9OQU1FICI6IDQwLWNvbmR1Y3RvciBjYWJsZSBkZXRlY3RlZCBvbiBwb3J0ICVkXG4iLCBhcC0+cG9ydF9ubyk7Ci0JYXAtPmNibCA9IEFUQV9DQkxfUEFUQTQwOwotCWFwLT51ZG1hX21hc2sgJj0gQVRBX1VETUFfTUFTS180MEM7CisJcmV0dXJuIEFUQV9DQkxfUEFUQTQwOwogfQogCiAvKioKQEAgLTMxNCw3ICszMTMsNiBAQAogCS8qIENoZWNrIHdoZXRoZXIgcG9ydCBlbmFibGVkICovCiAJaWYgKCFwZGMyMDI3eF9wb3J0X2VuYWJsZWQoYXApKQogCQlyZXR1cm4gLUVOT0VOVDsKLQlwZGMyMDI3eF9jYmxfZGV0ZWN0KGFwKTsKIAlyZXR1cm4gYXRhX3N0ZF9wcmVyZXNldChhcCk7CiB9CiAKQEAgLTMzNCw2ICszMzIsMzIgQEAKIH0KIAogLyoqCisgKglwZGMyNzIweF9tb2RlX2ZpbHRlcgktCW1vZGUgc2VsZWN0aW9uIGZpbHRlcgorICoJQGFkZXY6IEFUQSBkZXZpY2UKKyAqCUBtYXNrOiBsaXN0IG9mIG1vZGVzIHByb3Bvc2VkCisgKgorICoJQmxvY2sgVURNQSBvbiBkZXZpY2VzIHRoYXQgY2F1c2UgdHJvdWJsZSB3aXRoIHRoaXMgY29udHJvbGxlci4KKyAqLworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBwZGMyMDI3eF9tb2RlX2ZpbHRlcihzdHJ1Y3QgYXRhX2RldmljZSAqYWRldiwgdW5zaWduZWQgbG9uZyBtYXNrKQoreworCXVuc2lnbmVkIGNoYXIgbW9kZWxfbnVtW0FUQV9JRF9QUk9EX0xFTiArIDFdOworCXN0cnVjdCBhdGFfZGV2aWNlICpwYWlyID0gYXRhX2Rldl9wYWlyKGFkZXYpOworCisJaWYgKGFkZXYtPmNsYXNzICE9IEFUQV9ERVZfQVRBIHx8IGFkZXYtPmRldm5vID09IDAgfHwgcGFpciA9PSBOVUxMKQorCQlyZXR1cm4gYXRhX3BjaV9kZWZhdWx0X2ZpbHRlcihhZGV2LCBtYXNrKTsKKworCS8qIENoZWNrIGZvciBzbGF2ZSBvZiBhIE1heHRvciBhdCBVRE1BNiAqLworCWF0YV9pZF9jX3N0cmluZyhwYWlyLT5pZCwgbW9kZWxfbnVtLCBBVEFfSURfUFJPRCwKKwkJCSAgQVRBX0lEX1BST0RfTEVOICsgMSk7CisJLyogSWYgdGhlIG1hc3RlciBpcyBhIG1heHRvciBpbiBVRE1BNiB0aGVuIHRoZSBzbGF2ZSBzaG91bGQgbm90IHVzZSBVRE1BIDYgKi8KKwlpZihzdHJzdHIobW9kZWxfbnVtLCAiTWF4dG9yIikgPT0gMCAmJiBwYWlyLT5kbWFfbW9kZSA9PSBYRkVSX1VETUFfNikKKwkJbWFzayAmPSB+ICgxIDw8ICg2ICsgQVRBX1NISUZUX1VETUEpKTsKKworCXJldHVybiBhdGFfcGNpX2RlZmF1bHRfZmlsdGVyKGFkZXYsIG1hc2spOworfQorCisvKioKICAqCXBkYzIwMjd4X3NldF9waW9tb2RlIC0gSW5pdGlhbGl6ZSBob3N0IGNvbnRyb2xsZXIgUEFUQSBQSU8gdGltaW5ncwogICoJQGFwOiBQb3J0IHRvIGNvbmZpZ3VyZQogICoJQGFkZXY6IHVtCkBAIC00NDQsMTcgKzQ2OCwyMiBAQAogfQogCiAvKioKLSAqCXBkYzIwMjd4X3Bvc3Rfc2V0X21vZGUgLSBTZXQgdGhlIHRpbWluZyByZWdpc3RlcnMgYmFjayB0byBjb3JyZWN0IHZhbHVlcy4KKyAqCXBkYzIwMjd4X3NldF9tb2RlIC0gU2V0IHRoZSB0aW1pbmcgcmVnaXN0ZXJzIGJhY2sgdG8gY29ycmVjdCB2YWx1ZXMuCiAgKglAYXA6IFBvcnQgdG8gY29uZmlndXJlCisgKglAcl9mYWlsZWQ6IFJldHVybmVkIGRldmljZSBmb3IgZmFpbHVyZQogICoKICAqCVRoZSBwZGMyMDI3eCBoYXJkd2FyZSB3aWxsIGxvb2sgYXQgIlNFVCBGRUFUVVJFUyIgYW5kIGNoYW5nZSB0aGUgdGltaW5nIHJlZ2lzdGVycwogICoJYXV0b21hdGljYWxseS4gVGhlIHZhbHVlcyBzZXQgYnkgdGhlIGhhcmR3YXJlIG1pZ2h0IGJlIGluY29ycmVjdCwgdW5kZXIgMTMzTWh6IFBMTC4KICAqCVRoaXMgZnVuY3Rpb24gb3ZlcndyaXRlcyB0aGUgcG9zc2libHkgaW5jb3JyZWN0IHZhbHVlcyBzZXQgYnkgdGhlIGhhcmR3YXJlIHRvIGJlIGNvcnJlY3QuCiAgKi8KLXN0YXRpYyB2b2lkIHBkYzIwMjd4X3Bvc3Rfc2V0X21vZGUoc3RydWN0IGF0YV9wb3J0ICphcCkKK3N0YXRpYyBpbnQgcGRjMjAyN3hfc2V0X21vZGUoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV9kZXZpY2UgKipyX2ZhaWxlZCkKIHsKIAlpbnQgaTsKIAorCWkgPSBhdGFfZG9fc2V0X21vZGUoYXAsIHJfZmFpbGVkKTsKKwlpZiAoaSA8IDApCisJCXJldHVybiBpOworCiAJZm9yIChpID0gMDsgaSA8IEFUQV9NQVhfREVWSUNFUzsgaSsrKSB7CiAJCXN0cnVjdCBhdGFfZGV2aWNlICpkZXYgPSAmYXAtPmRldmljZVtpXTsKIApAQCAtNDc2LDYgKzUwNSw3IEBACiAJCQl9CiAJCX0KIAl9CisJcmV0dXJuIDA7CiB9CiAKIC8qKgpAQCAtNTIxLDEyICs1NTEsMTIgQEAKIAogLyoqCiAgKiBwZGNfcmVhZF9jb3VudGVyIC0gUmVhZCB0aGUgY3RyIGNvdW50ZXIKLSAqIEBwcm9iZV9lbnQ6IGZvciB0aGUgcG9ydCBhZGRyZXNzCisgKiBAaG9zdDogdGFyZ2V0IEFUQSBob3N0CiAgKi8KIAotc3RhdGljIGxvbmcgcGRjX3JlYWRfY291bnRlcihzdHJ1Y3QgYXRhX3Byb2JlX2VudCAqcHJvYmVfZW50KQorc3RhdGljIGxvbmcgcGRjX3JlYWRfY291bnRlcihzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QpCiB7Ci0Jdm9pZCBfX2lvbWVtICptbWlvX2Jhc2UgPSBwcm9iZV9lbnQtPmlvbWFwW1BEQ19NTUlPX0JBUl07CisJdm9pZCBfX2lvbWVtICptbWlvX2Jhc2UgPSBob3N0LT5pb21hcFtQRENfTU1JT19CQVJdOwogCWxvbmcgY291bnRlcjsKIAlpbnQgcmV0cnkgPSAxOwogCXUzMiBiY2NybCwgYmNjcmgsIGJjY3JsdiwgYmNjcmh2OwpAQCAtNTY0LDEyICs1OTQsMTIgQEAKICAqIGFkanVzdF9wbGwgLSBBZGp1c3QgdGhlIFBMTCBpbnB1dCBjbG9jayBpbiBIei4KICAqCiAgKiBAcGRjX2NvbnRyb2xsZXI6IGNvbnRyb2xsZXIgc3BlY2lmaWMgaW5mb3JtYXRpb24KLSAqIEBwcm9iZV9lbnQ6IEZvciB0aGUgcG9ydCBhZGRyZXNzCisgKiBAaG9zdDogdGFyZ2V0IEFUQSBob3N0CiAgKiBAcGxsX2Nsb2NrOiBUaGUgaW5wdXQgb2YgUExMIGluIEhaCiAgKi8KLXN0YXRpYyB2b2lkIHBkY19hZGp1c3RfcGxsKHN0cnVjdCBhdGFfcHJvYmVfZW50ICpwcm9iZV9lbnQsIGxvbmcgcGxsX2Nsb2NrLCB1bnNpZ25lZCBpbnQgYm9hcmRfaWR4KQorc3RhdGljIHZvaWQgcGRjX2FkanVzdF9wbGwoc3RydWN0IGF0YV9ob3N0ICpob3N0LCBsb25nIHBsbF9jbG9jaywgdW5zaWduZWQgaW50IGJvYXJkX2lkeCkKIHsKLQl2b2lkIF9faW9tZW0gKm1taW9fYmFzZSA9IHByb2JlX2VudC0+aW9tYXBbUERDX01NSU9fQkFSXTsKKwl2b2lkIF9faW9tZW0gKm1taW9fYmFzZSA9IGhvc3QtPmlvbWFwW1BEQ19NTUlPX0JBUl07CiAJdTE2IHBsbF9jdGw7CiAJbG9uZyBwbGxfY2xvY2tfa2h6ID0gcGxsX2Nsb2NrIC8gMTAwMDsKIAlsb25nIHBvdXRfcmVxdWlyZWQgPSBib2FyZF9pZHg/IFBEQ18xMzNfTUhaOlBEQ18xMDBfTUhaOwpAQCAtNjQ5LDE5ICs2NzksMTkgQEAKIAogLyoqCiAgKiBkZXRlY3RfcGxsX2lucHV0X2Nsb2NrIC0gRGV0ZWN0IHRoZSBQTEwgaW5wdXQgY2xvY2sgaW4gSHouCi0gKiBAcHJvYmVfZW50OiBmb3IgdGhlIHBvcnQgYWRkcmVzcworICogQGhvc3Q6IHRhcmdldCBBVEEgaG9zdAogICogRXguIDE2OTQ5MDAwIG9uIDMzTUh6IFBDSSBidXMgZm9yIHBkYzIwMjc1LgogICogICAgIEhhbGYgb2YgdGhlIFBDSSBjbG9jay4KICAqLwotc3RhdGljIGxvbmcgcGRjX2RldGVjdF9wbGxfaW5wdXRfY2xvY2soc3RydWN0IGF0YV9wcm9iZV9lbnQgKnByb2JlX2VudCkKK3N0YXRpYyBsb25nIHBkY19kZXRlY3RfcGxsX2lucHV0X2Nsb2NrKHN0cnVjdCBhdGFfaG9zdCAqaG9zdCkKIHsKLQl2b2lkIF9faW9tZW0gKm1taW9fYmFzZSA9IHByb2JlX2VudC0+aW9tYXBbUERDX01NSU9fQkFSXTsKKwl2b2lkIF9faW9tZW0gKm1taW9fYmFzZSA9IGhvc3QtPmlvbWFwW1BEQ19NTUlPX0JBUl07CiAJdTMyIHNjcjsKIAlsb25nIHN0YXJ0X2NvdW50LCBlbmRfY291bnQ7CiAJbG9uZyBwbGxfY2xvY2s7CiAKIAkvKiBSZWFkIGN1cnJlbnQgY291bnRlciB2YWx1ZSAqLwotCXN0YXJ0X2NvdW50ID0gcGRjX3JlYWRfY291bnRlcihwcm9iZV9lbnQpOworCXN0YXJ0X2NvdW50ID0gcGRjX3JlYWRfY291bnRlcihob3N0KTsKIAogCS8qIFN0YXJ0IHRoZSB0ZXN0IG1vZGUgKi8KIAlzY3IgPSByZWFkbChtbWlvX2Jhc2UgKyBQRENfU1lTX0NUTCk7CkBAIC02NzMsNyArNzAzLDcgQEAKIAltZGVsYXkoMTAwKTsKIAogCS8qIFJlYWQgdGhlIGNvdW50ZXIgdmFsdWVzIGFnYWluICovCi0JZW5kX2NvdW50ID0gcGRjX3JlYWRfY291bnRlcihwcm9iZV9lbnQpOworCWVuZF9jb3VudCA9IHBkY19yZWFkX2NvdW50ZXIoaG9zdCk7CiAKIAkvKiBTdG9wIHRoZSB0ZXN0IG1vZGUgKi8KIAlzY3IgPSByZWFkbChtbWlvX2Jhc2UgKyBQRENfU1lTX0NUTCk7CkBAIC02OTIsMTEgKzcyMiwxMCBAQAogCiAvKioKICAqIHBkY19oYXJkd2FyZV9pbml0IC0gSW5pdGlhbGl6ZSB0aGUgaGFyZHdhcmUuCi0gKiBAcGRldjogaW5zdGFuY2Ugb2YgcGNpX2RldiBmb3VuZAotICogQHBkY19jb250cm9sbGVyOiBjb250cm9sbGVyIHNwZWNpZmljIGluZm9ybWF0aW9uCi0gKiBAcGU6ICBmb3IgdGhlIHBvcnQgYWRkcmVzcworICogQGhvc3Q6IHRhcmdldCBBVEEgaG9zdAorICogQGJvYXJkX2lkeDogYm9hcmQgaWRlbnRpZmllcgogICovCi1zdGF0aWMgaW50IHBkY19oYXJkd2FyZV9pbml0KHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3QgYXRhX3Byb2JlX2VudCAqcGUsIHVuc2lnbmVkIGludCBib2FyZF9pZHgpCitzdGF0aWMgaW50IHBkY19oYXJkd2FyZV9pbml0KHN0cnVjdCBhdGFfaG9zdCAqaG9zdCwgdW5zaWduZWQgaW50IGJvYXJkX2lkeCkKIHsKIAlsb25nIHBsbF9jbG9jazsKIApAQCAtNzA2LDE1ICs3MzUsMTUgQEAKIAkgKiBFeC4gMjVNSHogb3IgNDBNSHosIHdlIGhhdmUgdG8gYWRqdXN0IHRoZSBjeWNsZV90aW1lLgogCSAqIFRoZSBwZGMyMDI3NSBjb250cm9sbGVyIGVtcGxveXMgUExMIGNpcmN1aXQgdG8gaGVscCBjb3JyZWN0IHRpbWluZyByZWdpc3RlcnMgc2V0dGluZy4KIAkgKi8KLQlwbGxfY2xvY2sgPSBwZGNfZGV0ZWN0X3BsbF9pbnB1dF9jbG9jayhwZSk7CisJcGxsX2Nsb2NrID0gcGRjX2RldGVjdF9wbGxfaW5wdXRfY2xvY2soaG9zdCk7CiAKIAlpZiAocGxsX2Nsb2NrIDwgMCkgLyogY291bnRlciBvdmVyZmxvdz8gVHJ5IGFnYWluLiAqLwotCQlwbGxfY2xvY2sgPSBwZGNfZGV0ZWN0X3BsbF9pbnB1dF9jbG9jayhwZSk7CisJCXBsbF9jbG9jayA9IHBkY19kZXRlY3RfcGxsX2lucHV0X2Nsb2NrKGhvc3QpOwogCi0JZGV2X3ByaW50ayhLRVJOX0lORk8sICZwZGV2LT5kZXYsICJQTEwgaW5wdXQgY2xvY2sgJWxkIGtIelxuIiwgcGxsX2Nsb2NrLzEwMDApOworCWRldl9wcmludGsoS0VSTl9JTkZPLCBob3N0LT5kZXYsICJQTEwgaW5wdXQgY2xvY2sgJWxkIGtIelxuIiwgcGxsX2Nsb2NrLzEwMDApOwogCiAJLyogQWRqdXN0IFBMTCBjb250cm9sIHJlZ2lzdGVyICovCi0JcGRjX2FkanVzdF9wbGwocGUsIHBsbF9jbG9jaywgYm9hcmRfaWR4KTsKKwlwZGNfYWRqdXN0X3BsbChob3N0LCBwbGxfY2xvY2ssIGJvYXJkX2lkeCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTc0Niw4ICs3NzUsNyBAQAogICogQ2FsbGVkIHdoZW4gYW4gaW5zdGFuY2Ugb2YgUENJIGFkYXB0ZXIgaXMgaW5zZXJ0ZWQuCiAgKiBUaGlzIGZ1bmN0aW9uIGNoZWNrcyB3aGV0aGVyIHRoZSBoYXJkd2FyZSBpcyBzdXBwb3J0ZWQsCiAgKiBpbml0aWFsaXplIGhhcmR3YXJlIGFuZCByZWdpc3RlciBhbiBpbnN0YW5jZSBvZiBhdGFfaG9zdCB0bwotICogbGliYXRhIGJ5IHByb3ZpZGluZyBzdHJ1Y3QgYXRhX3Byb2JlX2VudCBhbmQgYXRhX2RldmljZV9hZGQoKS4KLSAqIChpbXBsZW1lbnRzIHN0cnVjdCBwY2lfZHJpdmVyLnByb2JlKCkgKQorICogbGliYXRhLiAgKGltcGxlbWVudHMgc3RydWN0IHBjaV9kcml2ZXIucHJvYmUoKSApCiAgKgogICogQHBkZXY6IGluc3RhbmNlIG9mIHBjaV9kZXYgZm91bmQKICAqIEBlbnQ6ICBtYXRjaGluZyBlbnRyeSBpbiB0aGUgaWRfdGJsW10KQEAgLTc1NiwxNCArNzg0LDIxIEBACiB7CiAJc3RhdGljIGludCBwcmludGVkX3ZlcnNpb247CiAJdW5zaWduZWQgaW50IGJvYXJkX2lkeCA9ICh1bnNpZ25lZCBpbnQpIGVudC0+ZHJpdmVyX2RhdGE7Ci0KLQlzdHJ1Y3QgYXRhX3Byb2JlX2VudCAqcHJvYmVfZW50OworCWNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvICpwcGlbXSA9CisJCXsgJnBkYzIwMjd4X3BvcnRfaW5mb1tib2FyZF9pZHhdLCBOVUxMIH07CisJc3RydWN0IGF0YV9ob3N0ICpob3N0OwogCXZvaWQgX19pb21lbSAqbW1pb19iYXNlOwogCWludCByYzsKIAogCWlmICghcHJpbnRlZF92ZXJzaW9uKyspCiAJCWRldl9wcmludGsoS0VSTl9ERUJVRywgJnBkZXYtPmRldiwgInZlcnNpb24gIiBEUlZfVkVSU0lPTiAiXG4iKTsKIAorCS8qIGFsbG9jIGhvc3QgKi8KKwlob3N0ID0gYXRhX2hvc3RfYWxsb2NfcGluZm8oJnBkZXYtPmRldiwgcHBpLCAyKTsKKwlpZiAoIWhvc3QpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogYWNxdWlyZSByZXNvdXJjZXMgYW5kIGZpbGwgaG9zdCAqLwogCXJjID0gcGNpbV9lbmFibGVfZGV2aWNlKHBkZXYpOwogCWlmIChyYykKIAkJcmV0dXJuIHJjOwpAQCAtNzcxLDYgKzgwNiw3IEBACiAJcmMgPSBwY2ltX2lvbWFwX3JlZ2lvbnMocGRldiwgMSA8PCBQRENfTU1JT19CQVIsIERSVl9OQU1FKTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKKwlob3N0LT5pb21hcCA9IHBjaW1faW9tYXBfdGFibGUocGRldik7CiAKIAlyYyA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgQVRBX0RNQV9NQVNLKTsKIAlpZiAocmMpCkBAIC03ODAsNDYgKzgxNiwyMiBAQAogCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCi0JLyogUHJlcGFyZSB0aGUgcHJvYmUgZW50cnkgKi8KLQlwcm9iZV9lbnQgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpwcm9iZV9lbnQpLCBHRlBfS0VSTkVMKTsKLQlpZiAocHJvYmVfZW50ID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOworCW1taW9fYmFzZSA9IGhvc3QtPmlvbWFwW1BEQ19NTUlPX0JBUl07CiAKLQlwcm9iZV9lbnQtPmRldiA9IHBjaV9kZXZfdG9fZGV2KHBkZXYpOwotCUlOSVRfTElTVF9IRUFEKCZwcm9iZV9lbnQtPm5vZGUpOworCXBkY19hdGFfc2V0dXBfcG9ydCgmaG9zdC0+cG9ydHNbMF0tPmlvYWRkciwgbW1pb19iYXNlICsgMHgxN2MwKTsKKwlob3N0LT5wb3J0c1swXS0+aW9hZGRyLmJtZG1hX2FkZHIgPSBtbWlvX2Jhc2UgKyAweDEwMDA7CisJcGRjX2F0YV9zZXR1cF9wb3J0KCZob3N0LT5wb3J0c1sxXS0+aW9hZGRyLCBtbWlvX2Jhc2UgKyAweDE1YzApOworCWhvc3QtPnBvcnRzWzFdLT5pb2FkZHIuYm1kbWFfYWRkciA9IG1taW9fYmFzZSArIDB4MTAwODsKIAotCXByb2JlX2VudC0+c2h0CQk9IHBkYzIwMjd4X3BvcnRfaW5mb1tib2FyZF9pZHhdLnNodDsKLQlwcm9iZV9lbnQtPnBvcnRfZmxhZ3MJPSBwZGMyMDI3eF9wb3J0X2luZm9bYm9hcmRfaWR4XS5mbGFnczsKLQlwcm9iZV9lbnQtPnBpb19tYXNrCT0gcGRjMjAyN3hfcG9ydF9pbmZvW2JvYXJkX2lkeF0ucGlvX21hc2s7Ci0JcHJvYmVfZW50LT5td2RtYV9tYXNrCT0gcGRjMjAyN3hfcG9ydF9pbmZvW2JvYXJkX2lkeF0ubXdkbWFfbWFzazsKLQlwcm9iZV9lbnQtPnVkbWFfbWFzawk9IHBkYzIwMjd4X3BvcnRfaW5mb1tib2FyZF9pZHhdLnVkbWFfbWFzazsKLQlwcm9iZV9lbnQtPnBvcnRfb3BzCT0gcGRjMjAyN3hfcG9ydF9pbmZvW2JvYXJkX2lkeF0ucG9ydF9vcHM7Ci0KLSAgICAgICAJcHJvYmVfZW50LT5pcnEgPSBwZGV2LT5pcnE7Ci0gICAgICAgCXByb2JlX2VudC0+aXJxX2ZsYWdzID0gSVJRRl9TSEFSRUQ7Ci0JcHJvYmVfZW50LT5pb21hcCA9IHBjaW1faW9tYXBfdGFibGUocGRldik7Ci0KLQltbWlvX2Jhc2UgPSBwcm9iZV9lbnQtPmlvbWFwW1BEQ19NTUlPX0JBUl07Ci0KLQlwZGNfYXRhX3NldHVwX3BvcnQoJnByb2JlX2VudC0+cG9ydFswXSwgbW1pb19iYXNlICsgMHgxN2MwKTsKLQlwcm9iZV9lbnQtPnBvcnRbMF0uYm1kbWFfYWRkciA9IG1taW9fYmFzZSArIDB4MTAwMDsKLQlwZGNfYXRhX3NldHVwX3BvcnQoJnByb2JlX2VudC0+cG9ydFsxXSwgbW1pb19iYXNlICsgMHgxNWMwKTsKLQlwcm9iZV9lbnQtPnBvcnRbMV0uYm1kbWFfYWRkciA9IG1taW9fYmFzZSArIDB4MTAwODsKLQotCXByb2JlX2VudC0+bl9wb3J0cyA9IDI7Ci0KLQlwY2lfc2V0X21hc3RlcihwZGV2KTsKIAkvL3BjaV9lbmFibGVfaW50eChwZGV2KTsKIAogCS8qIGluaXRpYWxpemUgYWRhcHRlciAqLwotCWlmIChwZGNfaGFyZHdhcmVfaW5pdChwZGV2LCBwcm9iZV9lbnQsIGJvYXJkX2lkeCkgIT0gMCkKKwlpZiAocGRjX2hhcmR3YXJlX2luaXQoaG9zdCwgYm9hcmRfaWR4KSAhPSAwKQogCQlyZXR1cm4gLUVJTzsKIAotCWlmICghYXRhX2RldmljZV9hZGQocHJvYmVfZW50KSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlkZXZtX2tmcmVlKCZwZGV2LT5kZXYsIHByb2JlX2VudCk7Ci0JcmV0dXJuIDA7CisJcGNpX3NldF9tYXN0ZXIocGRldik7CisJcmV0dXJuIGF0YV9ob3N0X2FjdGl2YXRlKGhvc3QsIHBkZXYtPmlycSwgYXRhX2ludGVycnVwdCwgSVJRRl9TSEFSRUQsCisJCQkJICZwZGMyMDI3eF9zaHQpOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfcGRjMjAyeHhfb2xkLmMgYi9kcml2ZXJzL2F0YS9wYXRhX3BkYzIwMnh4X29sZC5jCmluZGV4IDBhMTQ5MzMuLmVlNjM2YmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfcGRjMjAyeHhfb2xkLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9wZGMyMDJ4eF9vbGQuYwpAQCAtMjIsNDUgKzIyLDE3IEBACiAjaW5jbHVkZSA8bGludXgvbGliYXRhLmg+CiAKICNkZWZpbmUgRFJWX05BTUUgInBhdGFfcGRjMjAyeHhfb2xkIgotI2RlZmluZSBEUlZfVkVSU0lPTiAiMC40LjAiCisjZGVmaW5lIERSVl9WRVJTSU9OICIwLjQuMiIKIAotLyoqCi0gKglwZGMyMDI0eF9wcmVfcmVzZXQJCS0JcHJvYmUgYmVnaW4KLSAqCUBhcDogQVRBIHBvcnQKLSAqCi0gKglTZXQgdXAgY2FibGUgdHlwZSBhbmQgdXNlIGdlbmVyaWMgcHJvYmUgaW5pdAotICovCi0KLXN0YXRpYyBpbnQgcGRjMjAyNHhfcHJlX3Jlc2V0KHN0cnVjdCBhdGFfcG9ydCAqYXApCi17Ci0JYXAtPmNibCA9IEFUQV9DQkxfUEFUQTQwOwotCXJldHVybiBhdGFfc3RkX3ByZXJlc2V0KGFwKTsKLX0KLQotCi1zdGF0aWMgdm9pZCBwZGMyMDI0eF9lcnJvcl9oYW5kbGVyKHN0cnVjdCBhdGFfcG9ydCAqYXApCi17Ci0JYXRhX2JtZG1hX2RyaXZlX2VoKGFwLCBwZGMyMDI0eF9wcmVfcmVzZXQsIGF0YV9zdGRfc29mdHJlc2V0LCBOVUxMLCBhdGFfc3RkX3Bvc3RyZXNldCk7Ci19Ci0KLQotc3RhdGljIGludCBwZGMyMDI2eF9wcmVfcmVzZXQoc3RydWN0IGF0YV9wb3J0ICphcCkKK3N0YXRpYyBpbnQgcGRjMjAyNnhfY2FibGVfZGV0ZWN0KHN0cnVjdCBhdGFfcG9ydCAqYXApCiB7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGFwLT5ob3N0LT5kZXYpOwogCXUxNiBjaXM7CiAKIAlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCAweDUwLCAmY2lzKTsKIAlpZiAoY2lzICYgKDEgPDwgKDEwICsgYXAtPnBvcnRfbm8pKSkKLQkJYXAtPmNibCA9IEFUQV9DQkxfUEFUQTgwOwotCWVsc2UKLQkJYXAtPmNibCA9IEFUQV9DQkxfUEFUQTQwOwotCi0JcmV0dXJuIGF0YV9zdGRfcHJlcmVzZXQoYXApOwotfQotCi1zdGF0aWMgdm9pZCBwZGMyMDI2eF9lcnJvcl9oYW5kbGVyKHN0cnVjdCBhdGFfcG9ydCAqYXApCi17Ci0JYXRhX2JtZG1hX2RyaXZlX2VoKGFwLCBwZGMyMDI2eF9wcmVfcmVzZXQsIGF0YV9zdGRfc29mdHJlc2V0LCBOVUxMLCBhdGFfc3RkX3Bvc3RyZXNldCk7CisJCXJldHVybiBBVEFfQ0JMX1BBVEE4MDsKKwlyZXR1cm4gQVRBX0NCTF9QQVRBNDA7CiB9CiAKIC8qKgpAQCAtMjQ0LDcgKzIxNiw2IEBACiAKIC8qKgogICoJcGRjMjAyNnhfZGV2X2NvbmZpZwktCWRldmljZSBzZXR1cCBob29rCi0gKglAYXA6IEFUQSBwb3J0CiAgKglAYWRldjogbmV3bHkgZm91bmQgZGV2aWNlCiAgKgogICoJUGVyZm9ybSBjaGlwIHNwZWNpZmljIGVhcmx5IHNldHVwLiBXZSBuZWVkIHRvIGxvY2sgdGhlIHRyYW5zZmVyCkBAIC0yNTIsNyArMjIzLDcgQEAKICAqCWJhcmYuCiAgKi8KIAotc3RhdGljIHZvaWQgcGRjMjAyNnhfZGV2X2NvbmZpZyhzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX2RldmljZSAqYWRldikKK3N0YXRpYyB2b2lkIHBkYzIwMjZ4X2Rldl9jb25maWcoc3RydWN0IGF0YV9kZXZpY2UgKmFkZXYpCiB7CiAJYWRldi0+bWF4X3NlY3RvcnMgPSAyNTY7CiB9CkBAIC0yOTIsOCArMjYzLDkgQEAKIAogCS5mcmVlemUJCT0gYXRhX2JtZG1hX2ZyZWV6ZSwKIAkudGhhdwkJPSBhdGFfYm1kbWFfdGhhdywKLQkuZXJyb3JfaGFuZGxlcgk9IHBkYzIwMjR4X2Vycm9yX2hhbmRsZXIsCisJLmVycm9yX2hhbmRsZXIJPSBhdGFfYm1kbWFfZXJyb3JfaGFuZGxlciwKIAkucG9zdF9pbnRlcm5hbF9jbWQgPSBhdGFfYm1kbWFfcG9zdF9pbnRlcm5hbF9jbWQsCisJLmNhYmxlX2RldGVjdAk9IGF0YV9jYWJsZV80MHdpcmUsCiAKIAkuYm1kbWFfc2V0dXAgCT0gYXRhX2JtZG1hX3NldHVwLAogCS5ibWRtYV9zdGFydCAJPSBhdGFfYm1kbWFfc3RhcnQsCkBAIC0zMjYsOCArMjk4LDkgQEAKIAogCS5mcmVlemUJCT0gYXRhX2JtZG1hX2ZyZWV6ZSwKIAkudGhhdwkJPSBhdGFfYm1kbWFfdGhhdywKLQkuZXJyb3JfaGFuZGxlcgk9IHBkYzIwMjZ4X2Vycm9yX2hhbmRsZXIsCisJLmVycm9yX2hhbmRsZXIJPSBhdGFfYm1kbWFfZXJyb3JfaGFuZGxlciwKIAkucG9zdF9pbnRlcm5hbF9jbWQgPSBhdGFfYm1kbWFfcG9zdF9pbnRlcm5hbF9jbWQsCisJLmNhYmxlX2RldGVjdAk9IHBkYzIwMjZ4X2NhYmxlX2RldGVjdCwKIAogCS5ibWRtYV9zZXR1cCAJPSBhdGFfYm1kbWFfc2V0dXAsCiAJLmJtZG1hX3N0YXJ0IAk9IHBkYzIwMjZ4X2JtZG1hX3N0YXJ0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9wbGF0Zm9ybS5jIGIvZHJpdmVycy9hdGEvcGF0YV9wbGF0Zm9ybS5jCmluZGV4IDRiODJhNTQuLmEwYTY1MGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfcGxhdGZvcm0uYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX3BsYXRmb3JtLmMKQEAgLTgwLDEzICs4MCwxMyBAQAogCS50aGF3CQkJPSBhdGFfYm1kbWFfdGhhdywKIAkuZXJyb3JfaGFuZGxlcgkJPSBhdGFfYm1kbWFfZXJyb3JfaGFuZGxlciwKIAkucG9zdF9pbnRlcm5hbF9jbWQJPSBhdGFfYm1kbWFfcG9zdF9pbnRlcm5hbF9jbWQsCisJLmNhYmxlX2RldGVjdAkJPSBhdGFfY2FibGVfdW5rbm93biwKIAogCS5xY19wcmVwCQk9IGF0YV9xY19wcmVwLAogCS5xY19pc3N1ZQkJPSBhdGFfcWNfaXNzdWVfcHJvdCwKIAogCS5kYXRhX3hmZXIJCT0gYXRhX2RhdGFfeGZlcl9ub2lycSwKIAotCS5pcnFfaGFuZGxlcgkJPSBhdGFfaW50ZXJydXB0LAogCS5pcnFfY2xlYXIJCT0gYXRhX2JtZG1hX2lycV9jbGVhciwKIAkuaXJxX29uCQkJPSBhdGFfaXJxX29uLAogCS5pcnFfYWNrCQk9IGF0YV9pcnFfYWNrLApAQCAtMTM1LDcgKzEzNSw4IEBACiBzdGF0aWMgaW50IF9fZGV2aW5pdCBwYXRhX3BsYXRmb3JtX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IHJlc291cmNlICppb19yZXMsICpjdGxfcmVzOwotCXN0cnVjdCBhdGFfcHJvYmVfZW50IGFlOworCXN0cnVjdCBhdGFfaG9zdCAqaG9zdDsKKwlzdHJ1Y3QgYXRhX3BvcnQgKmFwOwogCXVuc2lnbmVkIGludCBtbWlvOwogCiAJLyoKQEAgLTE3NSw0NCArMTc2LDQxIEBACiAJLyoKIAkgKiBOb3cgdGhhdCB0aGF0J3Mgb3V0IG9mIHRoZSB3YXksIHdpcmUgdXAgdGhlIHBvcnQuLgogCSAqLwotCW1lbXNldCgmYWUsIDAsIHNpemVvZihzdHJ1Y3QgYXRhX3Byb2JlX2VudCkpOwotCUlOSVRfTElTVF9IRUFEKCZhZS5ub2RlKTsKLQlhZS5kZXYgPSAmcGRldi0+ZGV2OwotCWFlLnBvcnRfb3BzID0gJnBhdGFfcGxhdGZvcm1fcG9ydF9vcHM7Ci0JYWUuc2h0ID0gJnBhdGFfcGxhdGZvcm1fc2h0OwotCWFlLm5fcG9ydHMgPSAxOwotCWFlLnBpb19tYXNrID0gcGlvX21hc2s7Ci0JYWUuaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKLQlhZS5pcnFfZmxhZ3MgPSAwOwotCWFlLnBvcnRfZmxhZ3MgPSBBVEFfRkxBR19TTEFWRV9QT1NTIHwgQVRBX0ZMQUdfU1JTVDsKKwlob3N0ID0gYXRhX2hvc3RfYWxsb2MoJnBkZXYtPmRldiwgMSk7CisJaWYgKCFob3N0KQorCQlyZXR1cm4gLUVOT01FTTsKKwlhcCA9IGhvc3QtPnBvcnRzWzBdOworCisJYXAtPm9wcyA9ICZwYXRhX3BsYXRmb3JtX3BvcnRfb3BzOworCWFwLT5waW9fbWFzayA9IHBpb19tYXNrOworCWFwLT5mbGFncyB8PSBBVEFfRkxBR19TTEFWRV9QT1NTOwogCiAJLyoKIAkgKiBIYW5kbGUgdGhlIE1NSU8gY2FzZQogCSAqLwogCWlmIChtbWlvKSB7Ci0JCWFlLnBvcnRbMF0uY21kX2FkZHIgPSBkZXZtX2lvcmVtYXAoJnBkZXYtPmRldiwgaW9fcmVzLT5zdGFydCwKKwkJYXAtPmlvYWRkci5jbWRfYWRkciA9IGRldm1faW9yZW1hcCgmcGRldi0+ZGV2LCBpb19yZXMtPnN0YXJ0LAogCQkJCWlvX3Jlcy0+ZW5kIC0gaW9fcmVzLT5zdGFydCArIDEpOwotCQlhZS5wb3J0WzBdLmN0bF9hZGRyID0gZGV2bV9pb3JlbWFwKCZwZGV2LT5kZXYsIGN0bF9yZXMtPnN0YXJ0LAorCQlhcC0+aW9hZGRyLmN0bF9hZGRyID0gZGV2bV9pb3JlbWFwKCZwZGV2LT5kZXYsIGN0bF9yZXMtPnN0YXJ0LAogCQkJCWN0bF9yZXMtPmVuZCAtIGN0bF9yZXMtPnN0YXJ0ICsgMSk7CiAJfSBlbHNlIHsKLQkJYWUucG9ydFswXS5jbWRfYWRkciA9IGRldm1faW9wb3J0X21hcCgmcGRldi0+ZGV2LCBpb19yZXMtPnN0YXJ0LAorCQlhcC0+aW9hZGRyLmNtZF9hZGRyID0gZGV2bV9pb3BvcnRfbWFwKCZwZGV2LT5kZXYsIGlvX3Jlcy0+c3RhcnQsCiAJCQkJaW9fcmVzLT5lbmQgLSBpb19yZXMtPnN0YXJ0ICsgMSk7Ci0JCWFlLnBvcnRbMF0uY3RsX2FkZHIgPSBkZXZtX2lvcG9ydF9tYXAoJnBkZXYtPmRldiwgY3RsX3Jlcy0+c3RhcnQsCisJCWFwLT5pb2FkZHIuY3RsX2FkZHIgPSBkZXZtX2lvcG9ydF9tYXAoJnBkZXYtPmRldiwgY3RsX3Jlcy0+c3RhcnQsCiAJCQkJY3RsX3Jlcy0+ZW5kIC0gY3RsX3Jlcy0+c3RhcnQgKyAxKTsKIAl9Ci0JaWYgKCFhZS5wb3J0WzBdLmNtZF9hZGRyIHx8ICFhZS5wb3J0WzBdLmN0bF9hZGRyKSB7CisJaWYgKCFhcC0+aW9hZGRyLmNtZF9hZGRyIHx8ICFhcC0+aW9hZGRyLmN0bF9hZGRyKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBtYXAgSU8vQ1RMIGJhc2VcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQlhZS5wb3J0WzBdLmFsdHN0YXR1c19hZGRyID0gYWUucG9ydFswXS5jdGxfYWRkcjsKKwlhcC0+aW9hZGRyLmFsdHN0YXR1c19hZGRyID0gYXAtPmlvYWRkci5jdGxfYWRkcjsKIAotCXBhdGFfcGxhdGZvcm1fc2V0dXBfcG9ydCgmYWUucG9ydFswXSwgcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEpOworCXBhdGFfcGxhdGZvcm1fc2V0dXBfcG9ydCgmYXAtPmlvYWRkciwgcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEpOwogCi0JaWYgKHVubGlrZWx5KGF0YV9kZXZpY2VfYWRkKCZhZSkgPT0gMCkpCi0JCXJldHVybiAtRU5PREVWOwotCi0JcmV0dXJuIDA7CisJLyogYWN0aXZhdGUgKi8KKwlyZXR1cm4gYXRhX2hvc3RfYWN0aXZhdGUoaG9zdCwgcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKSwgYXRhX2ludGVycnVwdCwKKwkJCQkgMCwgJnBhdGFfcGxhdGZvcm1fc2h0KTsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX3FkaS5jIGIvZHJpdmVycy9hdGEvcGF0YV9xZGkuYwppbmRleCBjMzgxMDAxLi4yNzY4NWNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX3FkaS5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfcWRpLmMKQEAgLTE4MywxMyArMTgzLDEzIEBACiAJLnRoYXcJCT0gYXRhX2JtZG1hX3RoYXcsCiAJLmVycm9yX2hhbmRsZXIJPSBhdGFfYm1kbWFfZXJyb3JfaGFuZGxlciwKIAkucG9zdF9pbnRlcm5hbF9jbWQgPSBhdGFfYm1kbWFfcG9zdF9pbnRlcm5hbF9jbWQsCisJLmNhYmxlX2RldGVjdAk9IGF0YV9jYWJsZV80MHdpcmUsCiAKIAkucWNfcHJlcCAJPSBhdGFfcWNfcHJlcCwKIAkucWNfaXNzdWUJPSBxZGlfcWNfaXNzdWVfcHJvdCwKIAogCS5kYXRhX3hmZXIJPSBxZGlfZGF0YV94ZmVyLAogCi0JLmlycV9oYW5kbGVyCT0gYXRhX2ludGVycnVwdCwKIAkuaXJxX2NsZWFyCT0gYXRhX2JtZG1hX2lycV9jbGVhciwKIAkuaXJxX29uCQk9IGF0YV9pcnFfb24sCiAJLmlycV9hY2sJPSBhdGFfaXJxX2FjaywKQEAgLTIxMSwxMyArMjExLDEzIEBACiAJLnRoYXcJCT0gYXRhX2JtZG1hX3RoYXcsCiAJLmVycm9yX2hhbmRsZXIJPSBhdGFfYm1kbWFfZXJyb3JfaGFuZGxlciwKIAkucG9zdF9pbnRlcm5hbF9jbWQgPSBhdGFfYm1kbWFfcG9zdF9pbnRlcm5hbF9jbWQsCisJLmNhYmxlX2RldGVjdAk9IGF0YV9jYWJsZV80MHdpcmUsCiAKIAkucWNfcHJlcCAJPSBhdGFfcWNfcHJlcCwKIAkucWNfaXNzdWUJPSBxZGlfcWNfaXNzdWVfcHJvdCwKIAogCS5kYXRhX3hmZXIJPSBxZGlfZGF0YV94ZmVyLAogCi0JLmlycV9oYW5kbGVyCT0gYXRhX2ludGVycnVwdCwKIAkuaXJxX2NsZWFyCT0gYXRhX2JtZG1hX2lycV9jbGVhciwKIAkuaXJxX29uCQk9IGF0YV9pcnFfb24sCiAJLmlycV9hY2sJPSBhdGFfaXJxX2FjaywKQEAgLTIzOCw4ICsyMzgsOSBAQAogCiBzdGF0aWMgX19pbml0IGludCBxZGlfaW5pdF9vbmUodW5zaWduZWQgbG9uZyBwb3J0LCBpbnQgdHlwZSwgdW5zaWduZWQgbG9uZyBpbywgaW50IGlycSwgaW50IGZhc3QpCiB7Ci0Jc3RydWN0IGF0YV9wcm9iZV9lbnQgYWU7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKKwlzdHJ1Y3QgYXRhX2hvc3QgKmhvc3Q7CisJc3RydWN0IGF0YV9wb3J0ICphcDsKIAl2b2lkIF9faW9tZW0gKmlvX2FkZHIsICpjdGxfYWRkcjsKIAlpbnQgcmV0OwogCkBAIC0yNTcsMzQgKzI1OCwzMSBAQAogCWlmICghaW9fYWRkciB8fCAhY3RsX2FkZHIpCiAJCWdvdG8gZmFpbDsKIAotCW1lbXNldCgmYWUsIDAsIHNpemVvZihzdHJ1Y3QgYXRhX3Byb2JlX2VudCkpOwotCUlOSVRfTElTVF9IRUFEKCZhZS5ub2RlKTsKLQlhZS5kZXYgPSAmcGRldi0+ZGV2OworCXJldCA9IC1FTk9NRU07CisJaG9zdCA9IGF0YV9ob3N0X2FsbG9jKCZwZGV2LT5kZXYsIDEpOworCWlmICghaG9zdCkKKwkJZ290byBmYWlsOworCWFwID0gaG9zdC0+cG9ydHNbMF07CiAKIAlpZiAodHlwZSA9PSA2NTgwKSB7Ci0JCWFlLnBvcnRfb3BzID0gJnFkaTY1ODBfcG9ydF9vcHM7Ci0JCWFlLnBpb19tYXNrID0gMHgxRjsKLQkJYWUucG9ydF9mbGFncyA9IEFUQV9GTEFHX1NMQVZFX1BPU1MgfCBBVEFfRkxBR19TUlNUOworCQlhcC0+b3BzID0gJnFkaTY1ODBfcG9ydF9vcHM7CisJCWFwLT5waW9fbWFzayA9IDB4MUY7CisJCWFwLT5mbGFncyB8PSBBVEFfRkxBR19TTEFWRV9QT1NTOwogCX0gZWxzZSB7Ci0JCWFlLnBvcnRfb3BzID0gJnFkaTY1MDBfcG9ydF9vcHM7Ci0JCWFlLnBpb19tYXNrID0gMHgwNzsJLyogQWN0dWFsbHkgUElPMyAhSU9SRFkgaXMgcG9zc2libGUgKi8KLQkJYWUucG9ydF9mbGFncyA9IEFUQV9GTEFHX1NMQVZFX1BPU1MgfCBBVEFfRkxBR19TUlNUIHwKLQkJCQlBVEFfRkxBR19OT19JT1JEWTsKKwkJYXAtPm9wcyA9ICZxZGk2NTAwX3BvcnRfb3BzOworCQlhcC0+cGlvX21hc2sgPSAweDA3OwkvKiBBY3R1YWxseSBQSU8zICFJT1JEWSBpcyBwb3NzaWJsZSAqLworCQlhcC0+ZmxhZ3MgPSBBVEFfRkxBR19TTEFWRV9QT1NTIHwgQVRBX0ZMQUdfTk9fSU9SRFk7CiAJfQogCi0JYWUuc2h0ID0gJnFkaV9zaHQ7Ci0JYWUubl9wb3J0cyA9IDE7Ci0JYWUuaXJxID0gaXJxOwotCWFlLmlycV9mbGFncyA9IDA7Ci0JYWUucG9ydFswXS5jbWRfYWRkciA9IGlvX2FkZHI7Ci0JYWUucG9ydFswXS5hbHRzdGF0dXNfYWRkciA9IGN0bF9hZGRyOwotCWFlLnBvcnRbMF0uY3RsX2FkZHIgPSBjdGxfYWRkcjsKLQlhdGFfc3RkX3BvcnRzKCZhZS5wb3J0WzBdKTsKKwlhcC0+aW9hZGRyLmNtZF9hZGRyID0gaW9fYWRkcjsKKwlhcC0+aW9hZGRyLmFsdHN0YXR1c19hZGRyID0gY3RsX2FkZHI7CisJYXAtPmlvYWRkci5jdGxfYWRkciA9IGN0bF9hZGRyOworCWF0YV9zdGRfcG9ydHMoJmFwLT5pb2FkZHIpOwogCiAJLyoKIAkgKglIb29rIGluIGEgcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZSBwZXIgY2hhbm5lbAogCSAqLwotCWFlLnByaXZhdGVfZGF0YSA9ICZxZGlfZGF0YVtucl9xZGlfaG9zdF07CisJYXAtPnByaXZhdGVfZGF0YSA9ICZxZGlfZGF0YVtucl9xZGlfaG9zdF07CiAKIAlxZGlfZGF0YVtucl9xZGlfaG9zdF0udGltaW5nID0gcG9ydDsKIAlxZGlfZGF0YVtucl9xZGlfaG9zdF0uZmFzdCA9IGZhc3Q7CkBAIC0yOTIsOCArMjkwLDkgQEAKIAogCXByaW50ayhLRVJOX0lORk8gRFJWX05BTUUiOiBxZCVkIGF0IDB4JWx4LlxuIiwgdHlwZSwgaW8pOwogCi0JcmV0ID0gLUVOT0RFVjsKLQlpZiAoIWF0YV9kZXZpY2VfYWRkKCZhZSkpCisJLyogYWN0aXZhdGUgKi8KKwlyZXQgPSBhdGFfaG9zdF9hY3RpdmF0ZShob3N0LCBpcnEsIGF0YV9pbnRlcnJ1cHQsIDAsICZxZGlfc2h0KTsKKwlpZiAocmV0KQogCQlnb3RvIGZhaWw7CiAKIAlxZGlfaG9zdFtucl9xZGlfaG9zdCsrXSA9IGRldl9nZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfcmFkaXN5cy5jIGIvZHJpdmVycy9hdGEvcGF0YV9yYWRpc3lzLmMKaW5kZXggOWE5MTMyYy4uMWM1NDY3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9yYWRpc3lzLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9yYWRpc3lzLmMKQEAgLTI0LDQwICsyNCwxMiBAQAogI2luY2x1ZGUgPGxpbnV4L2F0YS5oPgogCiAjZGVmaW5lIERSVl9OQU1FCSJwYXRhX3JhZGlzeXMiCi0jZGVmaW5lIERSVl9WRVJTSU9OCSIwLjQuMSIKLQotLyoqCi0gKglyYWRpc3lzX3Byb2JlX2luaXQJCS0JcHJvYmUgYmVnaW4KLSAqCUBhcDogQVRBIHBvcnQKLSAqCi0gKglTZXQgdXAgY2FibGUgdHlwZSBhbmQgdXNlIGdlbmVyaWMgcHJvYmUgaW5pdAotICovCi0KLXN0YXRpYyBpbnQgcmFkaXN5c19wcmVfcmVzZXQoc3RydWN0IGF0YV9wb3J0ICphcCkKLXsKLQlhcC0+Y2JsID0gQVRBX0NCTF9QQVRBODA7Ci0JcmV0dXJuIGF0YV9zdGRfcHJlcmVzZXQoYXApOwotfQotCi0KLS8qKgotICoJcmFkaXN5c19wYXRhX2Vycm9yX2hhbmRsZXIgLSBQcm9iZSBzcGVjaWZpZWQgcG9ydCBvbiBQQVRBIGhvc3QgY29udHJvbGxlcgotICoJQGFwOiBQb3J0IHRvIHByb2JlCi0gKglAY2xhc3NlczoKLSAqCi0gKglMT0NLSU5HOgotICoJTm9uZSAoaW5oZXJpdGVkIGZyb20gY2FsbGVyKS4KLSAqLwotCi1zdGF0aWMgdm9pZCByYWRpc3lzX3BhdGFfZXJyb3JfaGFuZGxlcihzdHJ1Y3QgYXRhX3BvcnQgKmFwKQotewotCWF0YV9ibWRtYV9kcml2ZV9laChhcCwgcmFkaXN5c19wcmVfcmVzZXQsIGF0YV9zdGRfc29mdHJlc2V0LCBOVUxMLCBhdGFfc3RkX3Bvc3RyZXNldCk7Ci19CisjZGVmaW5lIERSVl9WRVJTSU9OCSIwLjQuNCIKIAogLyoqCiAgKglyYWRpc3lzX3NldF9waW9tb2RlIC0gSW5pdGlhbGl6ZSBob3N0IGNvbnRyb2xsZXIgUEFUQSBQSU8gdGltaW5ncwotICoJQGFwOiBQb3J0IHdob3NlIHRpbWluZ3Mgd2UgYXJlIGNvbmZpZ3VyaW5nCi0gKglAYWRldjogdW0KKyAqCUBhcDogQVRBIHBvcnQKKyAqCUBhZGV2OiBEZXZpY2Ugd2hvc2UgdGltaW5ncyB3ZSBhcmUgY29uZmlndXJpbmcKICAqCiAgKglTZXQgUElPIG1vZGUgZm9yIGRldmljZSwgaW4gaG9zdCBjb250cm9sbGVyIFBDSSBjb25maWcgc3BhY2UuCiAgKgpAQCAtMjQ4LDggKzIyMCw5IEBACiAKIAkuZnJlZXplCQkJPSBhdGFfYm1kbWFfZnJlZXplLAogCS50aGF3CQkJPSBhdGFfYm1kbWFfdGhhdywKLQkuZXJyb3JfaGFuZGxlcgkJPSByYWRpc3lzX3BhdGFfZXJyb3JfaGFuZGxlciwKKwkuZXJyb3JfaGFuZGxlcgkJPSBhdGFfYm1kbWFfZXJyb3JfaGFuZGxlciwKIAkucG9zdF9pbnRlcm5hbF9jbWQJPSBhdGFfYm1kbWFfcG9zdF9pbnRlcm5hbF9jbWQsCisJLmNhYmxlX2RldGVjdAkJPSBhdGFfY2FibGVfdW5rbm93biwKIAogCS5ibWRtYV9zZXR1cAkJPSBhdGFfYm1kbWFfc2V0dXAsCiAJLmJtZG1hX3N0YXJ0CQk9IGF0YV9ibWRtYV9zdGFydCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfcnoxMDAwLmMgYi9kcml2ZXJzL2F0YS9wYXRhX3J6MTAwMC5jCmluZGV4IGY1MjJkYWEuLjg1YzQ1MjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfcnoxMDAwLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9yejEwMDAuYwpAQCAtMjUsMzEgKzI1LDYgQEAKIAogCiAvKioKLSAqCXJ6MTAwMF9wcmVyZXNldAkJLQlwcm9iZSBiZWdpbgotICoJQGFwOiBBVEEgcG9ydAotICoKLSAqCVNldCB1cCBjYWJsZSB0eXBlIGFuZCB1c2UgZ2VuZXJpY3MKLSAqLwotCi1zdGF0aWMgaW50IHJ6MTAwMF9wcmVyZXNldChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQotewotCWFwLT5jYmwgPSBBVEFfQ0JMX1BBVEE0MDsKLQlyZXR1cm4gYXRhX3N0ZF9wcmVyZXNldChhcCk7Ci19Ci0KLS8qKgotICoJcnoxMDAwX2Vycm9yX2hhbmRsZXIJCS0JcHJvYmUgcmVzZXQKLSAqCUBhcDogQVRBIHBvcnQKLSAqCi0gKglQZXJmb3JtIHRoZSBBVEEgc3RhbmRhcmQgcmVzZXQgc2VxdWVuY2UKLSAqLwotCi1zdGF0aWMgdm9pZCByejEwMDBfZXJyb3JfaGFuZGxlcihzdHJ1Y3QgYXRhX3BvcnQgKmFwKQotewotCWF0YV9ibWRtYV9kcml2ZV9laChhcCwgcnoxMDAwX3ByZXJlc2V0LCBhdGFfc3RkX3NvZnRyZXNldCwgTlVMTCwgYXRhX3N0ZF9wb3N0cmVzZXQpOwotfQotCi0vKioKICAqCXJ6MTAwMF9zZXRfbW9kZQkJLQltb2RlIHNldHRpbmcgZnVuY3Rpb24KICAqCUBhcDogQVRBIGludGVyZmFjZQogICoJQHVudXNlZDogcmV0dXJuZWQgZGV2aWNlIG9uIHNldF9tb2RlIGZhaWx1cmUKQEAgLTEyMiw4ICs5Nyw5IEBACiAKIAkuZnJlZXplCQk9IGF0YV9ibWRtYV9mcmVlemUsCiAJLnRoYXcJCT0gYXRhX2JtZG1hX3RoYXcsCi0JLmVycm9yX2hhbmRsZXIJPSByejEwMDBfZXJyb3JfaGFuZGxlciwKKwkuZXJyb3JfaGFuZGxlcgk9IGF0YV9ibWRtYV9lcnJvcl9oYW5kbGVyLAogCS5wb3N0X2ludGVybmFsX2NtZCA9IGF0YV9ibWRtYV9wb3N0X2ludGVybmFsX2NtZCwKKwkuY2FibGVfZGV0ZWN0CT0gYXRhX2NhYmxlXzQwd2lyZSwKIAogCS5pcnFfaGFuZGxlcgk9IGF0YV9pbnRlcnJ1cHQsCiAJLmlycV9jbGVhcgk9IGF0YV9ibWRtYV9pcnFfY2xlYXIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX3NjMTIwMC5jIGIvZHJpdmVycy9hdGEvcGF0YV9zYzEyMDAuYwppbmRleCA5M2IzZWQwLi42NmU4ZmY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX3NjMTIwMC5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfc2MxMjAwLmMKQEAgLTIxNiw2ICsyMTYsNyBAQAogCS50aGF3CQk9IGF0YV9ibWRtYV90aGF3LAogCS5lcnJvcl9oYW5kbGVyCT0gYXRhX2JtZG1hX2Vycm9yX2hhbmRsZXIsCiAJLnBvc3RfaW50ZXJuYWxfY21kID0gYXRhX2JtZG1hX3Bvc3RfaW50ZXJuYWxfY21kLAorCS5jYWJsZV9kZXRlY3QJPSBhdGFfY2FibGVfNDB3aXJlLAogCiAJLmJtZG1hX3NldHVwIAk9IGF0YV9ibWRtYV9zZXR1cCwKIAkuYm1kbWFfc3RhcnQgCT0gYXRhX2JtZG1hX3N0YXJ0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9zY2MuYyBiL2RyaXZlcnMvYXRhL3BhdGFfc2NjLmMKaW5kZXggZjNlZDE0MS4uNWRmMzU0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9zY2MuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX3NjYy5jCkBAIC0xMDE2LDcgKzEwMTYsNiBAQAogCS5lcnJvcl9oYW5kbGVyCQk9IHNjY19lcnJvcl9oYW5kbGVyLAogCS5wb3N0X2ludGVybmFsX2NtZAk9IHNjY19ibWRtYV9zdG9wLAogCi0JLmlycV9oYW5kbGVyCQk9IGF0YV9pbnRlcnJ1cHQsCiAJLmlycV9jbGVhcgkJPSBzY2NfYm1kbWFfaXJxX2NsZWFyLAogCS5pcnFfb24JCQk9IHNjY19pcnFfb24sCiAJLmlycV9hY2sJCT0gc2NjX2lycV9hY2ssCkBAIC0xMDI3LDcgKzEwMjYsNiBAQAogCiBzdGF0aWMgc3RydWN0IGF0YV9wb3J0X2luZm8gc2NjX3BvcnRfaW5mb1tdID0gewogCXsKLQkJLnNodAkJPSAmc2NjX3NodCwKIAkJLmZsYWdzCQk9IEFUQV9GTEFHX1NMQVZFX1BPU1MgfCBBVEFfRkxBR19NTUlPIHwgQVRBX0ZMQUdfTk9fTEVHQUNZLAogCQkucGlvX21hc2sJPSAweDFmLAkvKiBwaW8wLTQgKi8KIAkJLm13ZG1hX21hc2sJPSAweDAwLApAQCAtMTA0MCwxMCArMTAzOCwxMCBAQAogICoJc2NjX3Jlc2V0X2NvbnRyb2xsZXIgLSBpbml0aWFsaXplIFNDQyBQQVRBIGNvbnRyb2xsZXIuCiAgKi8KIAotc3RhdGljIGludCBzY2NfcmVzZXRfY29udHJvbGxlcihzdHJ1Y3QgYXRhX3Byb2JlX2VudCAqcHJvYmVfZW50KQorc3RhdGljIGludCBzY2NfcmVzZXRfY29udHJvbGxlcihzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QpCiB7Ci0Jdm9pZCBfX2lvbWVtICpjdHJsX2Jhc2UgPSBwcm9iZV9lbnQtPmlvbWFwW1NDQ19DVFJMX0JBUl07Ci0Jdm9pZCBfX2lvbWVtICpibWlkX2Jhc2UgPSBwcm9iZV9lbnQtPmlvbWFwW1NDQ19CTUlEX0JBUl07CisJdm9pZCBfX2lvbWVtICpjdHJsX2Jhc2UgPSBob3N0LT5pb21hcFtTQ0NfQ1RSTF9CQVJdOworCXZvaWQgX19pb21lbSAqYm1pZF9iYXNlID0gaG9zdC0+aW9tYXBbU0NDX0JNSURfQkFSXTsKIAl2b2lkIF9faW9tZW0gKmNja2N0cmxfcG9ydCA9IGN0cmxfYmFzZSArIFNDQ19DVExfQ0NLQ1RSTDsKIAl2b2lkIF9faW9tZW0gKm1vZGVfcG9ydCA9IGN0cmxfYmFzZSArIFNDQ19DVExfTU9ERVJFRzsKIAl2b2lkIF9faW9tZW0gKmVjbW9kZV9wb3J0ID0gY3RybF9iYXNlICsgU0NDX0NUTF9FQ01PREU7CkBAIC0xMTA0LDE3ICsxMTAyLDE1IEBACiAJaW9hZGRyLT5jb21tYW5kX2FkZHIgPSBpb2FkZHItPmNtZF9hZGRyICsgU0NDX1JFR19DTUQ7CiB9CiAKLXN0YXRpYyBpbnQgc2NjX2hvc3RfaW5pdChzdHJ1Y3QgYXRhX3Byb2JlX2VudCAqcHJvYmVfZW50KQorc3RhdGljIGludCBzY2NfaG9zdF9pbml0KHN0cnVjdCBhdGFfaG9zdCAqaG9zdCkKIHsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYocHJvYmVfZW50LT5kZXYpOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2Rldihob3N0LT5kZXYpOwogCWludCByYzsKIAotCXJjID0gc2NjX3Jlc2V0X2NvbnRyb2xsZXIocHJvYmVfZW50KTsKKwlyYyA9IHNjY19yZXNldF9jb250cm9sbGVyKGhvc3QpOwogCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCi0JcHJvYmVfZW50LT5uX3BvcnRzID0gMTsKLQogCXJjID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBBVEFfRE1BX01BU0spOwogCWlmIChyYykKIAkJcmV0dXJuIHJjOwpAQCAtMTEyMiw3ICsxMTE4LDcgQEAKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIAotCXNjY19zZXR1cF9wb3J0cygmcHJvYmVfZW50LT5wb3J0WzBdLCBwcm9iZV9lbnQtPmlvbWFwW1NDQ19CTUlEX0JBUl0pOworCXNjY19zZXR1cF9wb3J0cygmaG9zdC0+cG9ydHNbMF0tPmlvYWRkciwgaG9zdC0+aW9tYXBbU0NDX0JNSURfQkFSXSk7CiAKIAlwY2lfc2V0X21hc3RlcihwZGV2KTsKIApAQCAtMTE0NSwxNCArMTE0MSwxOCBAQAogewogCXN0YXRpYyBpbnQgcHJpbnRlZF92ZXJzaW9uOwogCXVuc2lnbmVkIGludCBib2FyZF9pZHggPSAodW5zaWduZWQgaW50KSBlbnQtPmRyaXZlcl9kYXRhOworCWNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvICpwcGlbXSA9IHsgJnNjY19wb3J0X2luZm9bYm9hcmRfaWR4XSwgTlVMTCB9OwogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7Ci0Jc3RydWN0IGF0YV9wcm9iZV9lbnQgKnByb2JlX2VudDsKIAlpbnQgcmM7CiAKIAlpZiAoIXByaW50ZWRfdmVyc2lvbisrKQogCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZwZGV2LT5kZXYsCiAJCQkgICAidmVyc2lvbiAiIERSVl9WRVJTSU9OICJcbiIpOwogCisJaG9zdCA9IGF0YV9wb3J0X2FsbG9jX3BpbmZvKCZwZGV2LT5kZXYsIHBwaSwgMSk7CisJaWYgKCFob3N0KQorCQlyZXR1cm4gLUVOT01FTTsKKwogCXJjID0gcGNpbV9lbmFibGVfZGV2aWNlKHBkZXYpOwogCWlmIChyYykKIAkJcmV0dXJuIHJjOwpAQCAtMTE2MiwzMyArMTE2MiwxNCBAQAogCQlwY2ltX3Bpbl9kZXZpY2UocGRldik7CiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CisJaG9zdC0+aW9tYXAgPSBwY2ltX2lvbWFwX3RhYmxlKHBkZXYpOwogCi0JcHJvYmVfZW50ID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpwcm9iZV9lbnQpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXByb2JlX2VudCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlwcm9iZV9lbnQtPmRldiA9IGRldjsKLQlJTklUX0xJU1RfSEVBRCgmcHJvYmVfZW50LT5ub2RlKTsKLQotCXByb2JlX2VudC0+c2h0IAkJPSBzY2NfcG9ydF9pbmZvW2JvYXJkX2lkeF0uc2h0OwotCXByb2JlX2VudC0+cG9ydF9mbGFncyAJPSBzY2NfcG9ydF9pbmZvW2JvYXJkX2lkeF0uZmxhZ3M7Ci0JcHJvYmVfZW50LT5waW9fbWFzayAJPSBzY2NfcG9ydF9pbmZvW2JvYXJkX2lkeF0ucGlvX21hc2s7Ci0JcHJvYmVfZW50LT51ZG1hX21hc2sgCT0gc2NjX3BvcnRfaW5mb1tib2FyZF9pZHhdLnVkbWFfbWFzazsKLQlwcm9iZV9lbnQtPnBvcnRfb3BzIAk9IHNjY19wb3J0X2luZm9bYm9hcmRfaWR4XS5wb3J0X29wczsKLQotCXByb2JlX2VudC0+aXJxID0gcGRldi0+aXJxOwotCXByb2JlX2VudC0+aXJxX2ZsYWdzID0gSVJRRl9TSEFSRUQ7Ci0JcHJvYmVfZW50LT5pb21hcCA9IHBjaW1faW9tYXBfdGFibGUocGRldik7Ci0KLQlyYyA9IHNjY19ob3N0X2luaXQocHJvYmVfZW50KTsKKwlyYyA9IHNjY19ob3N0X2luaXQoaG9zdCk7CiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CiAKLQlpZiAoIWF0YV9kZXZpY2VfYWRkKHByb2JlX2VudCkpCi0JCXJldHVybiAtRU5PREVWOwotCi0JZGV2bV9rZnJlZShkZXYsIHByb2JlX2VudCk7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIGF0YV9ob3N0X2FjdGl2YXRlKGhvc3QsIHBkZXYtPmlycSwgYXRhX2ludGVycnVwdCwgSVJRRl9TSEFSRUQsCisJCQkJICZzY2Nfc2h0KTsKIH0KIAogc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHNjY19wY2lfZHJpdmVyID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9zZXJ2ZXJ3b3Jrcy5jIGIvZHJpdmVycy9hdGEvcGF0YV9zZXJ2ZXJ3b3Jrcy5jCmluZGV4IDU5OGVlZjguLjM5NTZlZjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfc2VydmVyd29ya3MuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX3NlcnZlcndvcmtzLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogYXRhLXNlcnZlcndvcmtzLmMgCS0gU2VydmVyd29ya3MgUEFUQSBmb3IgbmV3IEFUQSBsYXllcgorICogcGF0YV9zZXJ2ZXJ3b3Jrcy5jIAktIFNlcnZlcndvcmtzIFBBVEEgZm9yIG5ldyBBVEEgbGF5ZXIKICAqCQkJICAoQykgMjAwNSBSZWQgSGF0IEluYwogICoJCQkgIEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+CiAgKgpAQCAtMTM3LDE0ICsxMzcsMTQgQEAKIH07CiAKIC8qKgotICoJc2VydmVyd29ya3NfcHJlX3Jlc2V0CQktCWNhYmxlIGRldGVjdGlvbgorICoJc2VydmVyd29ya3NfY2FibGVfZGV0ZWN0CS0JY2FibGUgZGV0ZWN0aW9uCiAgKglAYXA6IEFUQSBwb3J0CiAgKgogICoJUGVyZm9ybSBjYWJsZSBkZXRlY3Rpb24gYWNjb3JkaW5nIHRvIHRoZSBkZXZpY2UgYW5kIHN1YnZlbmRvcgogICoJaWRlbnRpZmljYXRpb25zCiAgKi8KIAotc3RhdGljIGludCBzZXJ2ZXJ3b3Jrc19wcmVfcmVzZXQoc3RydWN0IGF0YV9wb3J0ICphcCkgeworc3RhdGljIGludCBzZXJ2ZXJ3b3Jrc19jYWJsZV9kZXRlY3Qoc3RydWN0IGF0YV9wb3J0ICphcCkgewogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihhcC0+aG9zdC0+ZGV2KTsKIAlzdHJ1Y3Qgc3ZfY2FibGVfdGFibGUgKmNiID0gY2FibGVfZGV0ZWN0OwogCkBAIC0xNTIsOCArMTUyLDcgQEAKIAkJaWYgKGNiLT5kZXZpY2UgPT0gcGRldi0+ZGV2aWNlICYmCiAJCSAgICAoY2ItPnN1YnZlbmRvciA9PSBwZGV2LT5zdWJzeXN0ZW1fdmVuZG9yIHx8CiAJCSAgICAgIGNiLT5zdWJ2ZW5kb3IgPT0gUENJX0FOWV9JRCkpIHsKLQkJCWFwLT5jYmwgPSBjYi0+Y2FibGVfZGV0ZWN0KGFwKTsKLQkJCXJldHVybiBhdGFfc3RkX3ByZXJlc2V0KGFwKTsKKwkJCXJldHVybiBjYi0+Y2FibGVfZGV0ZWN0KGFwKTsKIAkJfQogCQljYisrOwogCX0KQEAgLTE2MiwxMSArMTYxLDYgQEAKIAlyZXR1cm4gLTE7CS8qIGtpbGwgY29tcGlsZXIgd2FybmluZyAqLwogfQogCi1zdGF0aWMgdm9pZCBzZXJ2ZXJ3b3Jrc19lcnJvcl9oYW5kbGVyKHN0cnVjdCBhdGFfcG9ydCAqYXApCi17Ci0JcmV0dXJuIGF0YV9ibWRtYV9kcml2ZV9laChhcCwgc2VydmVyd29ya3NfcHJlX3Jlc2V0LCBhdGFfc3RkX3NvZnRyZXNldCwgTlVMTCwgYXRhX3N0ZF9wb3N0cmVzZXQpOwotfQotCiAvKioKICAqCXNlcnZlcndvcmtzX2lzX2NzYgktCUNoZWNrIGZvciBDU0Igb3IgT1NCCiAgKglAcGRldjogUENJIGRldmljZSB0byBjaGVjawpAQCAtMTkxLDMxICsxODUsMzEgQEAKIAogLyoqCiAgKglzZXJ2ZXJ3b3Jrc19vc2I0X2ZpbHRlcgktCW1vZGUgc2VsZWN0aW9uIGZpbHRlcgotICoJQGFwOiBBVEEgaW50ZXJmYWNlCiAgKglAYWRldjogQVRBIGRldmljZQorICoJQG1hc2s6IE1hc2sgb2YgcHJvcG9zZWQgbW9kZXMKICAqCiAgKglGaWx0ZXIgdGhlIG9mZmVyZWQgbW9kZXMgZm9yIHRoZSBkZXZpY2UgdG8gYXBwbHkgY29udHJvbGxlcgogICoJc3BlY2lmaWMgcnVsZXMuIE9TQjQgcmVxdWlyZXMgbm8gVURNQSBmb3IgZGlza3MgZHVlIHRvIGEgRklGTwogICoJYnVnIHdlIGhpdC4KICAqLwogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBzZXJ2ZXJ3b3Jrc19vc2I0X2ZpbHRlcihjb25zdCBzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX2RldmljZSAqYWRldiwgdW5zaWduZWQgbG9uZyBtYXNrKQorc3RhdGljIHVuc2lnbmVkIGxvbmcgc2VydmVyd29ya3Nfb3NiNF9maWx0ZXIoc3RydWN0IGF0YV9kZXZpY2UgKmFkZXYsIHVuc2lnbmVkIGxvbmcgbWFzaykKIHsKIAlpZiAoYWRldi0+Y2xhc3MgPT0gQVRBX0RFVl9BVEEpCiAJCW1hc2sgJj0gfkFUQV9NQVNLX1VETUE7Ci0JcmV0dXJuIGF0YV9wY2lfZGVmYXVsdF9maWx0ZXIoYXAsIGFkZXYsIG1hc2spOworCXJldHVybiBhdGFfcGNpX2RlZmF1bHRfZmlsdGVyKGFkZXYsIG1hc2spOwogfQogCiAKIC8qKgogICoJc2VydmVyd29ya3NfY3NiX2ZpbHRlcgktCW1vZGUgc2VsZWN0aW9uIGZpbHRlcgotICoJQGFwOiBBVEEgaW50ZXJmYWNlCiAgKglAYWRldjogQVRBIGRldmljZQorICoJQG1hc2s6IE1hc2sgb2YgcHJvcG9zZWQgbW9kZXMKICAqCiAgKglDaGVjayB0aGUgYmxhY2tsaXN0IGFuZCBkaXNhYmxlIFVETUE1IGlmIG1hdGNoZWQKICAqLwogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBzZXJ2ZXJ3b3Jrc19jc2JfZmlsdGVyKGNvbnN0IHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfZGV2aWNlICphZGV2LCB1bnNpZ25lZCBsb25nIG1hc2spCitzdGF0aWMgdW5zaWduZWQgbG9uZyBzZXJ2ZXJ3b3Jrc19jc2JfZmlsdGVyKHN0cnVjdCBhdGFfZGV2aWNlICphZGV2LCB1bnNpZ25lZCBsb25nIG1hc2spCiB7CiAJY29uc3QgY2hhciAqcDsKIAljaGFyIG1vZGVsX251bVtBVEFfSURfUFJPRF9MRU4gKyAxXTsKQEAgLTIyMyw3ICsyMTcsNyBAQAogCiAJLyogRGlzaywgVURNQSAqLwogCWlmIChhZGV2LT5jbGFzcyAhPSBBVEFfREVWX0FUQSkKLQkJcmV0dXJuIGF0YV9wY2lfZGVmYXVsdF9maWx0ZXIoYXAsIGFkZXYsIG1hc2spOworCQlyZXR1cm4gYXRhX3BjaV9kZWZhdWx0X2ZpbHRlcihhZGV2LCBtYXNrKTsKIAogCS8qIEFjdHVhbGx5IGRvIG5lZWQgdG8gY2hlY2sgKi8KIAlhdGFfaWRfY19zdHJpbmcoYWRldi0+aWQsIG1vZGVsX251bSwgQVRBX0lEX1BST0QsIHNpemVvZihtb2RlbF9udW0pKTsKQEAgLTIzMiw3ICsyMjYsNyBAQAogCQlpZiAoIXN0cmNtcChwLCBtb2RlbF9udW0pKQogCQkJbWFzayAmPSB+KDB4MUYgPDwgQVRBX1NISUZUX1VETUEpOwogCX0KLQlyZXR1cm4gYXRhX3BjaV9kZWZhdWx0X2ZpbHRlcihhcCwgYWRldiwgbWFzayk7CisJcmV0dXJuIGF0YV9wY2lfZGVmYXVsdF9maWx0ZXIoYWRldiwgbWFzayk7CiB9CiAKIApAQCAtMzM5LDggKzMzMyw5IEBACiAKIAkuZnJlZXplCQk9IGF0YV9ibWRtYV9mcmVlemUsCiAJLnRoYXcJCT0gYXRhX2JtZG1hX3RoYXcsCi0JLmVycm9yX2hhbmRsZXIJPSBzZXJ2ZXJ3b3Jrc19lcnJvcl9oYW5kbGVyLAorCS5lcnJvcl9oYW5kbGVyCT0gYXRhX2JtZG1hX2Vycm9yX2hhbmRsZXIsCiAJLnBvc3RfaW50ZXJuYWxfY21kID0gYXRhX2JtZG1hX3Bvc3RfaW50ZXJuYWxfY21kLAorCS5jYWJsZV9kZXRlY3QJPSBzZXJ2ZXJ3b3Jrc19jYWJsZV9kZXRlY3QsCiAKIAkuYm1kbWFfc2V0dXAgCT0gYXRhX2JtZG1hX3NldHVwLAogCS5ibWRtYV9zdGFydCAJPSBhdGFfYm1kbWFfc3RhcnQsCkBAIC0zNzQsOCArMzY5LDkgQEAKIAogCS5mcmVlemUJCT0gYXRhX2JtZG1hX2ZyZWV6ZSwKIAkudGhhdwkJPSBhdGFfYm1kbWFfdGhhdywKLQkuZXJyb3JfaGFuZGxlcgk9IHNlcnZlcndvcmtzX2Vycm9yX2hhbmRsZXIsCisJLmVycm9yX2hhbmRsZXIJPSBhdGFfYm1kbWFfZXJyb3JfaGFuZGxlciwKIAkucG9zdF9pbnRlcm5hbF9jbWQgPSBhdGFfYm1kbWFfcG9zdF9pbnRlcm5hbF9jbWQsCisJLmNhYmxlX2RldGVjdAk9IHNlcnZlcndvcmtzX2NhYmxlX2RldGVjdCwKIAogCS5ibWRtYV9zZXR1cCAJPSBhdGFfYm1kbWFfc2V0dXAsCiAJLmJtZG1hX3N0YXJ0IAk9IGF0YV9ibWRtYV9zdGFydCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfc2lsNjgwLmMgYi9kcml2ZXJzL2F0YS9wYXRhX3NpbDY4MC5jCmluZGV4IGRhYjI4ODkuLjY3NzA4MjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfc2lsNjgwLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9zaWw2ODAuYwpAQCAtMzMsNyArMzMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpYmF0YS5oPgogCiAjZGVmaW5lIERSVl9OQU1FICJwYXRhX3NpbDY4MCIKLSNkZWZpbmUgRFJWX1ZFUlNJT04gIjAuNC41IgorI2RlZmluZSBEUlZfVkVSU0lPTiAiMC40LjYiCiAKIC8qKgogICoJc2lsNjgwX3NlbHJlZwkJLQlyZXR1cm4gcmVnaXN0ZXIgYmFzZQpAQCAtOTEsMTIgKzkxLDYgQEAKIAkJcmV0dXJuIEFUQV9DQkxfUEFUQTQwOwogfQogCi1zdGF0aWMgaW50IHNpbDY4MF9wcmVfcmVzZXQoc3RydWN0IGF0YV9wb3J0ICphcCkKLXsKLQlhcC0+Y2JsID0gc2lsNjgwX2NhYmxlX2RldGVjdChhcCk7Ci0JcmV0dXJuIGF0YV9zdGRfcHJlcmVzZXQoYXApOwotfQotCiAvKioKICAqCXNpbDY4MF9idXNfcmVzZXQJLQlyZXNldCB0aGUgU0lMNjgwIGJ1cwogICoJQGFwOiBBVEEgcG9ydCB0byByZXNldApAQCAtMTE5LDcgKzExMyw3IEBACiAKIHN0YXRpYyB2b2lkIHNpbDY4MF9lcnJvcl9oYW5kbGVyKHN0cnVjdCBhdGFfcG9ydCAqYXApCiB7Ci0JYXRhX2JtZG1hX2RyaXZlX2VoKGFwLCBzaWw2ODBfcHJlX3Jlc2V0LCBzaWw2ODBfYnVzX3Jlc2V0LCBOVUxMLCBhdGFfc3RkX3Bvc3RyZXNldCk7CisJYXRhX2JtZG1hX2RyaXZlX2VoKGFwLCBhdGFfc3RkX3ByZXJlc2V0LCBzaWw2ODBfYnVzX3Jlc2V0LCBOVUxMLCBhdGFfc3RkX3Bvc3RyZXNldCk7CiB9CiAKIC8qKgpAQCAtMjU3LDYgKzI1MSw3IEBACiAJLnRoYXcJCT0gYXRhX2JtZG1hX3RoYXcsCiAJLmVycm9yX2hhbmRsZXIJPSBzaWw2ODBfZXJyb3JfaGFuZGxlciwKIAkucG9zdF9pbnRlcm5hbF9jbWQgPSBhdGFfYm1kbWFfcG9zdF9pbnRlcm5hbF9jbWQsCisJLmNhYmxlX2RldGVjdAk9IHNpbDY4MF9jYWJsZV9kZXRlY3QsCiAKIAkuYm1kbWFfc2V0dXAgCT0gYXRhX2JtZG1hX3NldHVwLAogCS5ibWRtYV9zdGFydCAJPSBhdGFfYm1kbWFfc3RhcnQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX3Npcy5jIGIvZHJpdmVycy9hdGEvcGF0YV9zaXMuYwppbmRleCA4ZGMzYmM0Li5hM2ZiY2VlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX3Npcy5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfc2lzLmMKQEAgLTM1LDcgKzM1LDcgQEAKICNpbmNsdWRlICJzaXMuaCIKIAogI2RlZmluZSBEUlZfTkFNRQkicGF0YV9zaXMiCi0jZGVmaW5lIERSVl9WRVJTSU9OCSIwLjUuMCIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjAuNS4xIgogCiBzdHJ1Y3Qgc2lzX2NoaXBzZXQgewogCXUxNiBkZXZpY2U7CQkJLyogUENJIGhvc3QgSUQgKi8KQEAgLTg2LDE0ICs4Niw1NSBAQAogfQogCiAvKioKLSAqCXNpc18xMzNfcHJlX3Jlc2V0CS0JY2hlY2sgZm9yIDQwLzgwIHBpbgorICoJc2lzXzEzM19jYWJsZV9kZXRlY3QJLQljaGVjayBmb3IgNDAvODAgcGluCiAgKglAYXA6IFBvcnQKICAqCiAgKglQZXJmb3JtIGNhYmxlIGRldGVjdGlvbiBmb3IgdGhlIGxhdGVyIFVETUExMzMgY2FwYWJsZQogICoJU2lTIGNoaXBzZXQuCiAgKi8KIAotc3RhdGljIGludCBzaXNfMTMzX3ByZV9yZXNldChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQorc3RhdGljIGludCBzaXNfMTMzX2NhYmxlX2RldGVjdChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihhcC0+aG9zdC0+ZGV2KTsKKwl1MTYgdG1wOworCisJLyogVGhlIHRvcCBiaXQgb2YgdGhpcyByZWdpc3RlciBpcyB0aGUgY2FibGUgZGV0ZWN0IGJpdCAqLworCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIDB4NTAgKyAyICogYXAtPnBvcnRfbm8sICZ0bXApOworCWlmICgodG1wICYgMHg4MDAwKSAmJiAhc2lzX3Nob3J0X2F0YTQwKHBkZXYpKQorCQlyZXR1cm4gQVRBX0NCTF9QQVRBNDA7CisJcmV0dXJuIEFUQV9DQkxfUEFUQTgwOworfQorCisvKioKKyAqCXNpc182Nl9jYWJsZV9kZXRlY3QJLQljaGVjayBmb3IgNDAvODAgcGluCisgKglAYXA6IFBvcnQKKyAqCisgKglQZXJmb3JtIGNhYmxlIGRldGVjdGlvbiBvbiB0aGUgVURNQTY2LCBVRE1BMTAwIGFuZCBlYXJseSBVRE1BMTMzCisgKglTaVMgSURFIGNvbnRyb2xsZXJzLgorICovCisKK3N0YXRpYyBpbnQgc2lzXzY2X2NhYmxlX2RldGVjdChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihhcC0+aG9zdC0+ZGV2KTsKKwl1OCB0bXA7CisKKwkvKiBPbGRlciBjaGlwcyBrZWVwIGNhYmxlIGRldGVjdCBpbiBiaXRzIDQvNSBvZiByZWcgMHg0OCAqLworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIDB4NDgsICZ0bXApOworCXRtcCA+Pj0gYXAtPnBvcnRfbm87CisJaWYgKCh0bXAgJiAweDEwKSAmJiAhc2lzX3Nob3J0X2F0YTQwKHBkZXYpKQorCQlyZXR1cm4gQVRBX0NCTF9QQVRBNDA7CisJcmV0dXJuIEFUQV9DQkxfUEFUQTgwOworfQorCisKKy8qKgorICoJc2lzX3ByZV9yZXNldAkJLQlwcm9iZSBiZWdpbgorICoJQGFwOiBBVEEgcG9ydAorICoKKyAqCVNldCB1cCBjYWJsZSB0eXBlIGFuZCB1c2UgZ2VuZXJpYyBwcm9iZSBpbml0CisgKi8KKworc3RhdGljIGludCBzaXNfcHJlX3Jlc2V0KHN0cnVjdCBhdGFfcG9ydCAqYXApCiB7CiAJc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfYml0cyBzaXNfZW5hYmxlX2JpdHNbXSA9IHsKIAkJeyAweDRhVSwgMVUsIDB4MDJVTCwgMHgwMlVMIH0sCS8qIHBvcnQgMCAqLwpAQCAtMTAxLDIxICsxNDIsMTMgQEAKIAl9OwogCiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGFwLT5ob3N0LT5kZXYpOwotCXUxNiB0bXA7CiAKIAlpZiAoIXBjaV90ZXN0X2NvbmZpZ19iaXRzKHBkZXYsICZzaXNfZW5hYmxlX2JpdHNbYXAtPnBvcnRfbm9dKSkKIAkJcmV0dXJuIC1FTk9FTlQ7Ci0KLQkvKiBUaGUgdG9wIGJpdCBvZiB0aGlzIHJlZ2lzdGVyIGlzIHRoZSBjYWJsZSBkZXRlY3QgYml0ICovCi0JcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgMHg1MCArIDIgKiBhcC0+cG9ydF9ubywgJnRtcCk7Ci0JaWYgKCh0bXAgJiAweDgwMDApICYmICFzaXNfc2hvcnRfYXRhNDAocGRldikpCi0JCWFwLT5jYmwgPSBBVEFfQ0JMX1BBVEE0MDsKLQllbHNlCi0JCWFwLT5jYmwgPSBBVEFfQ0JMX1BBVEE4MDsKLQogCXJldHVybiBhdGFfc3RkX3ByZXJlc2V0KGFwKTsKIH0KIAorCiAvKioKICAqCXNpc19lcnJvcl9oYW5kbGVyIC0gUHJvYmUgc3BlY2lmaWVkIHBvcnQgb24gUEFUQSBob3N0IGNvbnRyb2xsZXIKICAqCUBhcDogUG9ydCB0byBwcm9iZQpAQCAtMTI0LDk3ICsxNTcsOSBAQAogICoJTm9uZSAoaW5oZXJpdGVkIGZyb20gY2FsbGVyKS4KICAqLwogCi1zdGF0aWMgdm9pZCBzaXNfMTMzX2Vycm9yX2hhbmRsZXIoc3RydWN0IGF0YV9wb3J0ICphcCkKK3N0YXRpYyB2b2lkIHNpc19lcnJvcl9oYW5kbGVyKHN0cnVjdCBhdGFfcG9ydCAqYXApCiB7Ci0JYXRhX2JtZG1hX2RyaXZlX2VoKGFwLCBzaXNfMTMzX3ByZV9yZXNldCwgYXRhX3N0ZF9zb2Z0cmVzZXQsIE5VTEwsIGF0YV9zdGRfcG9zdHJlc2V0KTsKLX0KLQotCi0vKioKLSAqCXNpc182Nl9wcmVfcmVzZXQJLQljaGVjayBmb3IgNDAvODAgcGluCi0gKglAYXA6IFBvcnQKLSAqCi0gKglQZXJmb3JtIGNhYmxlIGRldGVjdGlvbiBvbiB0aGUgVURNQTY2LCBVRE1BMTAwIGFuZCBlYXJseSBVRE1BMTMzCi0gKglTaVMgSURFIGNvbnRyb2xsZXJzLgotICovCi0KLXN0YXRpYyBpbnQgc2lzXzY2X3ByZV9yZXNldChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQotewotCXN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2JpdHMgc2lzX2VuYWJsZV9iaXRzW10gPSB7Ci0JCXsgMHg0YVUsIDFVLCAweDAyVUwsIDB4MDJVTCB9LAkvKiBwb3J0IDAgKi8KLQkJeyAweDRhVSwgMVUsIDB4MDRVTCwgMHgwNFVMIH0sCS8qIHBvcnQgMSAqLwotCX07Ci0KLQlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoYXAtPmhvc3QtPmRldik7Ci0JdTggdG1wOwotCi0JaWYgKCFwY2lfdGVzdF9jb25maWdfYml0cyhwZGV2LCAmc2lzX2VuYWJsZV9iaXRzW2FwLT5wb3J0X25vXSkpIHsKLQkJYXRhX3BvcnRfZGlzYWJsZShhcCk7Ci0JCWF0YV9wb3J0X3ByaW50ayhhcCwgS0VSTl9JTkZPLCAicG9ydCBkaXNhYmxlZC4gaWdub3JpbmcuXG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCS8qIE9sZGVyIGNoaXBzIGtlZXAgY2FibGUgZGV0ZWN0IGluIGJpdHMgNC81IG9mIHJlZyAweDQ4ICovCi0JcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgMHg0OCwgJnRtcCk7Ci0JdG1wID4+PSBhcC0+cG9ydF9ubzsKLQlpZiAoKHRtcCAmIDB4MTApICYmICFzaXNfc2hvcnRfYXRhNDAocGRldikpCi0JCWFwLT5jYmwgPSBBVEFfQ0JMX1BBVEE0MDsKLQllbHNlCi0JCWFwLT5jYmwgPSBBVEFfQ0JMX1BBVEE4MDsKLQotCXJldHVybiBhdGFfc3RkX3ByZXJlc2V0KGFwKTsKLX0KLQotLyoqCi0gKglzaXNfNjZfZXJyb3JfaGFuZGxlciAtIFByb2JlIHNwZWNpZmllZCBwb3J0IG9uIFBBVEEgaG9zdCBjb250cm9sbGVyCi0gKglAYXA6IFBvcnQgdG8gcHJvYmUKLSAqCUBjbGFzc2VzOgotICoKLSAqCUxPQ0tJTkc6Ci0gKglOb25lIChpbmhlcml0ZWQgZnJvbSBjYWxsZXIpLgotICovCi0KLXN0YXRpYyB2b2lkIHNpc182Nl9lcnJvcl9oYW5kbGVyKHN0cnVjdCBhdGFfcG9ydCAqYXApCi17Ci0JYXRhX2JtZG1hX2RyaXZlX2VoKGFwLCBzaXNfNjZfcHJlX3Jlc2V0LCBhdGFfc3RkX3NvZnRyZXNldCwgTlVMTCwgYXRhX3N0ZF9wb3N0cmVzZXQpOwotfQotCi0vKioKLSAqCXNpc19vbGRfcHJlX3Jlc2V0CQktCXByb2JlIGJlZ2luCi0gKglAYXA6IEFUQSBwb3J0Ci0gKgotICoJU2V0IHVwIGNhYmxlIHR5cGUgYW5kIHVzZSBnZW5lcmljIHByb2JlIGluaXQKLSAqLwotCi1zdGF0aWMgaW50IHNpc19vbGRfcHJlX3Jlc2V0KHN0cnVjdCBhdGFfcG9ydCAqYXApCi17Ci0Jc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfYml0cyBzaXNfZW5hYmxlX2JpdHNbXSA9IHsKLQkJeyAweDRhVSwgMVUsIDB4MDJVTCwgMHgwMlVMIH0sCS8qIHBvcnQgMCAqLwotCQl7IDB4NGFVLCAxVSwgMHgwNFVMLCAweDA0VUwgfSwJLyogcG9ydCAxICovCi0JfTsKLQotCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihhcC0+aG9zdC0+ZGV2KTsKLQotCWlmICghcGNpX3Rlc3RfY29uZmlnX2JpdHMocGRldiwgJnNpc19lbmFibGVfYml0c1thcC0+cG9ydF9ub10pKSB7Ci0JCWF0YV9wb3J0X2Rpc2FibGUoYXApOwotCQlhdGFfcG9ydF9wcmludGsoYXAsIEtFUk5fSU5GTywgInBvcnQgZGlzYWJsZWQuIGlnbm9yaW5nLlxuIik7Ci0JCXJldHVybiAwOwotCX0KLQlhcC0+Y2JsID0gQVRBX0NCTF9QQVRBNDA7Ci0JcmV0dXJuIGF0YV9zdGRfcHJlcmVzZXQoYXApOwotfQotCi0KLS8qKgotICoJc2lzX29sZF9lcnJvcl9oYW5kbGVyIC0gUHJvYmUgc3BlY2lmaWVkIHBvcnQgb24gUEFUQSBob3N0IGNvbnRyb2xsZXIKLSAqCUBhcDogUG9ydCB0byBwcm9iZQotICoKLSAqCUxPQ0tJTkc6Ci0gKglOb25lIChpbmhlcml0ZWQgZnJvbSBjYWxsZXIpLgotICovCi0KLXN0YXRpYyB2b2lkIHNpc19vbGRfZXJyb3JfaGFuZGxlcihzdHJ1Y3QgYXRhX3BvcnQgKmFwKQotewotCWF0YV9ibWRtYV9kcml2ZV9laChhcCwgc2lzX29sZF9wcmVfcmVzZXQsIGF0YV9zdGRfc29mdHJlc2V0LCBOVUxMLCBhdGFfc3RkX3Bvc3RyZXNldCk7CisJYXRhX2JtZG1hX2RyaXZlX2VoKGFwLCBzaXNfcHJlX3Jlc2V0LCBhdGFfc3RkX3NvZnRyZXNldCwgTlVMTCwgYXRhX3N0ZF9wb3N0cmVzZXQpOwogfQogCiAvKioKQEAgLTQ5NCw3ICs0MzksNyBAQAogCWludCBkcml2ZV9wY2kgPSBzaXNfcG9ydF9iYXNlKGFkZXYpOwogCXUxNiB0aW1pbmc7CiAKLQljb25zdCB1MTYgdWRtYV9iaXRzW10gID0geyAweDhGMDAsIDB4OEEwMCwgMHg4NzAwLCAweDg1MDAsIDB4ODMwMCwgMHg4MjAwLCAweDgxMDB9OworCXN0YXRpYyBjb25zdCB1MTYgdWRtYV9iaXRzW10gID0geyAweDhGMDAsIDB4OEEwMCwgMHg4NzAwLCAweDg1MDAsIDB4ODMwMCwgMHg4MjAwLCAweDgxMDB9OwogCiAJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgZHJpdmVfcGNpLCAmdGltaW5nKTsKIApAQCAtNTMxLDggKzQ3Niw4IEBACiAJdTMyIHJlZzU0OwogCiAJLyogYml0cyA0LSBjeWNsZSB0aW1lIDggLSBjdnMgdGltZSAqLwotCWNvbnN0IHUzMiB0aW1pbmdfdTEwMFtdID0geyAweDZCMCwgMHg0NzAsIDB4MzUwLCAweDE0MCwgMHgxMjAsIDB4MTEwLCAweDAwMCB9OwotCWNvbnN0IHUzMiB0aW1pbmdfdTEzM1tdID0geyAweDlGMCwgMHg2QTAsIDB4NDcwLCAweDI1MCwgMHgyMzAsIDB4MjIwLCAweDIxMCB9OworCXN0YXRpYyBjb25zdCB1MzIgdGltaW5nX3UxMDBbXSA9IHsgMHg2QjAsIDB4NDcwLCAweDM1MCwgMHgxNDAsIDB4MTIwLCAweDExMCwgMHgwMDAgfTsKKwlzdGF0aWMgY29uc3QgdTMyIHRpbWluZ191MTMzW10gPSB7IDB4OUYwLCAweDZBMCwgMHg0NzAsIDB4MjUwLCAweDIzMCwgMHgyMjAsIDB4MjEwIH07CiAKIAkvKiBJZiBiaXQgMTQgaXMgc2V0IHRoZW4gdGhlIHJlZ2lzdGVycyBhcmUgbWFwcGVkIGF0IDB4NzAgbm90IDB4NDAgKi8KIAlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgMHg1NCwgJnJlZzU0KTsKQEAgLTU5NSw4ICs1NDAsOSBAQAogCiAJLmZyZWV6ZQkJCT0gYXRhX2JtZG1hX2ZyZWV6ZSwKIAkudGhhdwkJCT0gYXRhX2JtZG1hX3RoYXcsCi0JLmVycm9yX2hhbmRsZXIJCT0gc2lzXzEzM19lcnJvcl9oYW5kbGVyLAorCS5lcnJvcl9oYW5kbGVyCQk9IHNpc19lcnJvcl9oYW5kbGVyLAogCS5wb3N0X2ludGVybmFsX2NtZAk9IGF0YV9ibWRtYV9wb3N0X2ludGVybmFsX2NtZCwKKwkuY2FibGVfZGV0ZWN0CQk9IHNpc18xMzNfY2FibGVfZGV0ZWN0LAogCiAJLmJtZG1hX3NldHVwCQk9IGF0YV9ibWRtYV9zZXR1cCwKIAkuYm1kbWFfc3RhcnQJCT0gYXRhX2JtZG1hX3N0YXJ0LApAQCAtNjI4LDggKzU3NCw5IEBACiAKIAkuZnJlZXplCQkJPSBhdGFfYm1kbWFfZnJlZXplLAogCS50aGF3CQkJPSBhdGFfYm1kbWFfdGhhdywKLQkuZXJyb3JfaGFuZGxlcgkJPSBzaXNfNjZfZXJyb3JfaGFuZGxlciwKKwkuZXJyb3JfaGFuZGxlcgkJPSBzaXNfZXJyb3JfaGFuZGxlciwKIAkucG9zdF9pbnRlcm5hbF9jbWQJPSBhdGFfYm1kbWFfcG9zdF9pbnRlcm5hbF9jbWQsCisJLmNhYmxlX2RldGVjdAkJPSBzaXNfNjZfY2FibGVfZGV0ZWN0LAogCiAJLmJtZG1hX3NldHVwCQk9IGF0YV9ibWRtYV9zZXR1cCwKIAkuYm1kbWFfc3RhcnQJCT0gYXRhX2JtZG1hX3N0YXJ0LApAQCAtNjYxLDkgKzYwOCw5IEBACiAKIAkuZnJlZXplCQkJPSBhdGFfYm1kbWFfZnJlZXplLAogCS50aGF3CQkJPSBhdGFfYm1kbWFfdGhhdywKLQkuZXJyb3JfaGFuZGxlcgkJPSBzaXNfNjZfZXJyb3JfaGFuZGxlciwKKwkuZXJyb3JfaGFuZGxlcgkJPSBzaXNfZXJyb3JfaGFuZGxlciwKIAkucG9zdF9pbnRlcm5hbF9jbWQJPSBhdGFfYm1kbWFfcG9zdF9pbnRlcm5hbF9jbWQsCi0KKwkuY2FibGVfZGV0ZWN0CQk9IHNpc182Nl9jYWJsZV9kZXRlY3QsCiAKIAkuYm1kbWFfc2V0dXAJCT0gYXRhX2JtZG1hX3NldHVwLAogCS5ibWRtYV9zdGFydAkJPSBhdGFfYm1kbWFfc3RhcnQsCkBAIC02OTIsMTAgKzYzOSwxMSBAQAogCS5jaGVja19zdGF0dXMJCT0gYXRhX2NoZWNrX3N0YXR1cywKIAkuZXhlY19jb21tYW5kCQk9IGF0YV9leGVjX2NvbW1hbmQsCiAJLmRldl9zZWxlY3QJCT0gYXRhX3N0ZF9kZXZfc2VsZWN0LAorCS5jYWJsZV9kZXRlY3QJCT0gc2lzXzY2X2NhYmxlX2RldGVjdCwKIAogCS5mcmVlemUJCQk9IGF0YV9ibWRtYV9mcmVlemUsCiAJLnRoYXcJCQk9IGF0YV9ibWRtYV90aGF3LAotCS5lcnJvcl9oYW5kbGVyCQk9IHNpc182Nl9lcnJvcl9oYW5kbGVyLAorCS5lcnJvcl9oYW5kbGVyCQk9IHNpc19lcnJvcl9oYW5kbGVyLAogCS5wb3N0X2ludGVybmFsX2NtZAk9IGF0YV9ibWRtYV9wb3N0X2ludGVybmFsX2NtZCwKIAogCS5ibWRtYV9zZXR1cAkJPSBhdGFfYm1kbWFfc2V0dXAsCkBAIC03MjgsOCArNjc2LDkgQEAKIAogCS5mcmVlemUJCQk9IGF0YV9ibWRtYV9mcmVlemUsCiAJLnRoYXcJCQk9IGF0YV9ibWRtYV90aGF3LAotCS5lcnJvcl9oYW5kbGVyCQk9IHNpc19vbGRfZXJyb3JfaGFuZGxlciwKKwkuZXJyb3JfaGFuZGxlcgkJPSBzaXNfZXJyb3JfaGFuZGxlciwKIAkucG9zdF9pbnRlcm5hbF9jbWQJPSBhdGFfYm1kbWFfcG9zdF9pbnRlcm5hbF9jbWQsCisJLmNhYmxlX2RldGVjdAkJPSBhdGFfY2FibGVfNDB3aXJlLAogCiAJLmJtZG1hX3NldHVwCQk9IGF0YV9ibWRtYV9zZXR1cCwKIAkuYm1kbWFfc3RhcnQJCT0gYXRhX2JtZG1hX3N0YXJ0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9zbDgyYzEwNS5jIGIvZHJpdmVycy9hdGEvcGF0YV9zbDgyYzEwNS5jCmluZGV4IGI2ODE0NDEuLmRhOWUyMmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfc2w4MmMxMDUuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX3NsODJjMTA1LmMKQEAgLTU4LDcgKzU4LDYgQEAKIAogCWlmIChhcC0+cG9ydF9ubyAmJiAhcGNpX3Rlc3RfY29uZmlnX2JpdHMocGRldiwgJnNsODJjMTA1X2VuYWJsZV9iaXRzW2FwLT5wb3J0X25vXSkpCiAJCXJldHVybiAtRU5PRU5UOwotCWFwLT5jYmwgPSBBVEFfQ0JMX1BBVEE0MDsKIAlyZXR1cm4gYXRhX3N0ZF9wcmVyZXNldChhcCk7CiB9CiAKQEAgLTIzOCw2ICsyMzcsNyBAQAogCS50aGF3CQk9IGF0YV9ibWRtYV90aGF3LAogCS5lcnJvcl9oYW5kbGVyCT0gc2w4MmMxMDVfZXJyb3JfaGFuZGxlciwKIAkucG9zdF9pbnRlcm5hbF9jbWQgPSBhdGFfYm1kbWFfcG9zdF9pbnRlcm5hbF9jbWQsCisJLmNhYmxlX2RldGVjdAk9IGF0YV9jYWJsZV80MHdpcmUsCiAKIAkuYm1kbWFfc2V0dXAgCT0gYXRhX2JtZG1hX3NldHVwLAogCS5ibWRtYV9zdGFydCAJPSBzbDgyYzEwNV9ibWRtYV9zdGFydCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfdHJpZmxleC5jIGIvZHJpdmVycy9hdGEvcGF0YV90cmlmbGV4LmMKaW5kZXggNzE0MThmMi4uZTYxOGZmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV90cmlmbGV4LmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV90cmlmbGV4LmMKQEAgLTQzLDcgKzQzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9saWJhdGEuaD4KIAogI2RlZmluZSBEUlZfTkFNRSAicGF0YV90cmlmbGV4IgotI2RlZmluZSBEUlZfVkVSU0lPTiAiMC4yLjciCisjZGVmaW5lIERSVl9WRVJTSU9OICIwLjIuOCIKIAogLyoqCiAgKgl0cmlmbGV4X3ByZXJlc2V0CQktCXByb2JlIGJlZ2luCkBAIC02Myw3ICs2Myw2IEBACiAKIAlpZiAoIXBjaV90ZXN0X2NvbmZpZ19iaXRzKHBkZXYsICZ0cmlmbGV4X2VuYWJsZV9iaXRzW2FwLT5wb3J0X25vXSkpCiAJCXJldHVybiAtRU5PRU5UOwotCWFwLT5jYmwgPSBBVEFfQ0JMX1BBVEE0MDsKIAlyZXR1cm4gYXRhX3N0ZF9wcmVyZXNldChhcCk7CiB9CiAKQEAgLTIxNCw2ICsyMTMsNyBAQAogCS50aGF3CQk9IGF0YV9ibWRtYV90aGF3LAogCS5lcnJvcl9oYW5kbGVyCT0gdHJpZmxleF9lcnJvcl9oYW5kbGVyLAogCS5wb3N0X2ludGVybmFsX2NtZCA9IGF0YV9ibWRtYV9wb3N0X2ludGVybmFsX2NtZCwKKwkuY2FibGVfZGV0ZWN0CT0gYXRhX2NhYmxlXzQwd2lyZSwKIAogCS5ibWRtYV9zZXR1cCAJPSBhdGFfYm1kbWFfc2V0dXAsCiAJLmJtZG1hX3N0YXJ0IAk9IHRyaWZsZXhfYm1kbWFfc3RhcnQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX3ZpYS5jIGIvZHJpdmVycy9hdGEvcGF0YV92aWEuYwppbmRleCA5NDZhZGUwLi45NmI3MTc5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX3ZpYS5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfdmlhLmMKQEAgLTYyLDcgKzYyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9saWJhdGEuaD4KIAogI2RlZmluZSBEUlZfTkFNRSAicGF0YV92aWEiCi0jZGVmaW5lIERSVl9WRVJTSU9OICIwLjIuMSIKKyNkZWZpbmUgRFJWX1ZFUlNJT04gIjAuMy4xIgogCiAvKgogICoJVGhlIGZvbGxvd2luZyBjb21lcyBkaXJlY3RseSBmcm9tIFZvanRlY2ggUGF2bGlrJ3MgaWRlL3BjaS92aWE4MmN4eHgKQEAgLTEzNSwxNiArMTM1LDIzIEBACiAgKi8KIAogc3RhdGljIGludCB2aWFfY2FibGVfZGV0ZWN0KHN0cnVjdCBhdGFfcG9ydCAqYXApIHsKKwljb25zdCBzdHJ1Y3QgdmlhX2lzYV9icmlkZ2UgKmNvbmZpZyA9IGFwLT5ob3N0LT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGFwLT5ob3N0LT5kZXYpOwogCXUzMiBhdGE2NjsKIAorCS8qIEVhcmx5IGNoaXBzIGFyZSA0MCB3aXJlICovCisJaWYgKChjb25maWctPmZsYWdzICYgVklBX1VETUEpIDwgVklBX1VETUFfNjYpCisJCXJldHVybiBBVEFfQ0JMX1BBVEE0MDsKKwkvKiBVRE1BIDY2IGNoaXBzIGhhdmUgb25seSBkcml2ZSBzaWRlIGxvZ2ljICovCisJZWxzZSBpZigoY29uZmlnLT5mbGFncyAmIFZJQV9VRE1BKSA8IFZJQV9VRE1BXzEwMCkKKwkJcmV0dXJuIEFUQV9DQkxfUEFUQV9VTks7CisJLyogVURNQSAxMDAgb3IgbGF0ZXIgKi8KIAlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgMHg1MCwgJmF0YTY2KTsKIAkvKiBDaGVjayBib3RoIHRoZSBkcml2ZSBjYWJsZSByZXBvcnRpbmcgYml0cywgd2UgbWlnaHQgbm90IGhhdmUKIAkgICB0d28gZHJpdmVzICovCiAJaWYgKGF0YTY2ICYgKDB4MTAxMDAwMDAgPj4gKDE2ICogYXAtPnBvcnRfbm8pKSkKIAkJcmV0dXJuIEFUQV9DQkxfUEFUQTgwOwotCWVsc2UKLQkJcmV0dXJuIEFUQV9DQkxfUEFUQTQwOworCXJldHVybiBBVEFfQ0JMX1BBVEE0MDsKIH0KIAogc3RhdGljIGludCB2aWFfcHJlX3Jlc2V0KHN0cnVjdCBhdGFfcG9ydCAqYXApCkBAIC0xNTYsMjIgKzE2MywxMCBAQAogCQkJeyAweDQwLCAxLCAweDAyLCAweDAyIH0sCiAJCQl7IDB4NDAsIDEsIDB4MDEsIDB4MDEgfQogCQl9OwotCiAJCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihhcC0+aG9zdC0+ZGV2KTsKLQogCQlpZiAoIXBjaV90ZXN0X2NvbmZpZ19iaXRzKHBkZXYsICZ2aWFfZW5hYmxlX2JpdHNbYXAtPnBvcnRfbm9dKSkKIAkJCXJldHVybiAtRU5PRU5UOwogCX0KLQotCWlmICgoY29uZmlnLT5mbGFncyAmIFZJQV9VRE1BKSA+PSBWSUFfVURNQV8xMDApCi0JCWFwLT5jYmwgPSB2aWFfY2FibGVfZGV0ZWN0KGFwKTsKLQkvKiBUaGUgVURNQTY2IHNlcmllcyBoYXMgbm8gY2FibGUgZGV0ZWN0IHNvIGRvIGRyaXZlIHNpZGUgZGV0ZWN0ICovCi0JZWxzZSBpZiAoKGNvbmZpZy0+ZmxhZ3MgJiBWSUFfVURNQSkgPCBWSUFfVURNQV82NikKLQkJYXAtPmNibCA9IEFUQV9DQkxfUEFUQTQwOwotCWVsc2UKLQkJYXAtPmNibCA9IEFUQV9DQkxfUEFUQV9VTks7Ci0KLQogCXJldHVybiBhdGFfc3RkX3ByZXJlc2V0KGFwKTsKIH0KIApAQCAtMzI3LDYgKzMyMiw3IEBACiAJLnRoYXcJCT0gYXRhX2JtZG1hX3RoYXcsCiAJLmVycm9yX2hhbmRsZXIJPSB2aWFfZXJyb3JfaGFuZGxlciwKIAkucG9zdF9pbnRlcm5hbF9jbWQgPSBhdGFfYm1kbWFfcG9zdF9pbnRlcm5hbF9jbWQsCisJLmNhYmxlX2RldGVjdAk9IHZpYV9jYWJsZV9kZXRlY3QsCiAKIAkuYm1kbWFfc2V0dXAgCT0gYXRhX2JtZG1hX3NldHVwLAogCS5ibWRtYV9zdGFydCAJPSBhdGFfYm1kbWFfc3RhcnQsCkBAIC0zNjIsNiArMzU4LDcgQEAKIAkudGhhdwkJPSBhdGFfYm1kbWFfdGhhdywKIAkuZXJyb3JfaGFuZGxlcgk9IHZpYV9lcnJvcl9oYW5kbGVyLAogCS5wb3N0X2ludGVybmFsX2NtZCA9IGF0YV9ibWRtYV9wb3N0X2ludGVybmFsX2NtZCwKKwkuY2FibGVfZGV0ZWN0CT0gdmlhX2NhYmxlX2RldGVjdCwKIAogCS5ibWRtYV9zZXR1cCAJPSBhdGFfYm1kbWFfc2V0dXAsCiAJLmJtZG1hX3N0YXJ0IAk9IGF0YV9ibWRtYV9zdGFydCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfd2luYm9uZC5jIGIvZHJpdmVycy9hdGEvcGF0YV93aW5ib25kLmMKaW5kZXggNmMxMTEwMy4uY2M0YWQyNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV93aW5ib25kLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV93aW5ib25kLmMKQEAgLTgsNyArOCw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KQEAgLTM2LDcgKzM1LDcgQEAKIHN0YXRpYyBpbnQgcHJvYmVfd2luYm9uZDsKICNlbmRpZgogCi1zdGF0aWMgc3BpbmxvY2tfdCB3aW5ib25kX2xvY2sgPSBTUElOX0xPQ0tfVU5MT0NLRUQ7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHdpbmJvbmRfbG9jayk7CiAKIHN0YXRpYyB2b2lkIHdpbmJvbmRfd3JpdGVjZmcodW5zaWduZWQgbG9uZyBwb3J0LCB1OCByZWcsIHU4IHZhbCkKIHsKQEAgLTE1MiwxMyArMTUxLDEzIEBACiAJLnRoYXcJCT0gYXRhX2JtZG1hX3RoYXcsCiAJLmVycm9yX2hhbmRsZXIJPSBhdGFfYm1kbWFfZXJyb3JfaGFuZGxlciwKIAkucG9zdF9pbnRlcm5hbF9jbWQgPSBhdGFfYm1kbWFfcG9zdF9pbnRlcm5hbF9jbWQsCisJLmNhYmxlX2RldGVjdAk9IGF0YV9jYWJsZV80MHdpcmUsCiAKIAkucWNfcHJlcCAJPSBhdGFfcWNfcHJlcCwKIAkucWNfaXNzdWUJPSBhdGFfcWNfaXNzdWVfcHJvdCwKIAogCS5kYXRhX3hmZXIJPSB3aW5ib25kX2RhdGFfeGZlciwKIAotCS5pcnFfaGFuZGxlcgk9IGF0YV9pbnRlcnJ1cHQsCiAJLmlycV9jbGVhcgk9IGF0YV9ibWRtYV9pcnFfY2xlYXIsCiAJLmlycV9vbgkJPSBhdGFfaXJxX29uLAogCS5pcnFfYWNrCT0gYXRhX2lycV9hY2ssCkBAIC0xNzksMTEgKzE3OCw5IEBACiAKIHN0YXRpYyBfX2luaXQgaW50IHdpbmJvbmRfaW5pdF9vbmUodW5zaWduZWQgbG9uZyBwb3J0KQogewotCXN0cnVjdCBhdGFfcHJvYmVfZW50IGFlOwogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7Ci0JaW50IHJldDsKIAl1OCByZWc7Ci0JaW50IGk7CisJaW50IGksIHJjOwogCiAJcmVnID0gd2luYm9uZF9yZWFkY2ZnKHBvcnQsIDB4ODEpOwogCXJlZyB8PSAweDgwOwkvKiBqdW1wZXJlZCBtb2RlIG9mZiAqLwpAQCAtMjAyLDU4ICsxOTksNTYgQEAKIAogCWZvciAoaSA9IDA7IGkgPCAyIDsgaSArKykgewogCQl1bnNpZ25lZCBsb25nIGNtZF9wb3J0ID0gMHgxRjAgLSAoMHg4MCAqIGkpOworCQlzdHJ1Y3QgYXRhX2hvc3QgKmhvc3Q7CisJCXN0cnVjdCBhdGFfcG9ydCAqYXA7CiAJCXZvaWQgX19pb21lbSAqY21kX2FkZHIsICpjdGxfYWRkcjsKIAotCQlpZiAocmVnICYgKDEgPDwgaSkpIHsKLQkJCS8qCi0JCQkgKglGaWxsIGluIGEgcHJvYmUgc3RydWN0dXJlIGZpcnN0IG9mIGFsbAotCQkJICovCisJCWlmICghKHJlZyAmICgxIDw8IGkpKSkKKwkJCWNvbnRpbnVlOwogCi0JCQlwZGV2ID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZShEUlZfTkFNRSwgbnJfd2luYm9uZF9ob3N0LCBOVUxMLCAwKTsKLQkJCWlmIChJU19FUlIocGRldikpCi0JCQkJcmV0dXJuIFBUUl9FUlIocGRldik7CisJCXBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKERSVl9OQU1FLCBucl93aW5ib25kX2hvc3QsIE5VTEwsIDApOworCQlpZiAoSVNfRVJSKHBkZXYpKQorCQkJcmV0dXJuIFBUUl9FUlIocGRldik7CiAKLQkJCWNtZF9hZGRyID0gZGV2bV9pb3BvcnRfbWFwKCZwZGV2LT5kZXYsIGNtZF9wb3J0LCA4KTsKLQkJCWN0bF9hZGRyID0gZGV2bV9pb3BvcnRfbWFwKCZwZGV2LT5kZXYsIGNtZF9wb3J0ICsgMHgwMjA2LCAxKTsKLQkJCWlmICghY21kX2FkZHIgfHwgIWN0bF9hZGRyKSB7Ci0JCQkJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIocGRldik7Ci0JCQkJcmV0dXJuIC1FTk9NRU07Ci0JCQl9CisJCXJjID0gLUVOT01FTTsKKwkJaG9zdCA9IGF0YV9ob3N0X2FsbG9jKCZwZGV2LT5kZXYsIDEpOworCQlpZiAoIWhvc3QpCisJCQlnb3RvIGVycl91bnJlZ2lzdGVyOwogCi0JCQltZW1zZXQoJmFlLCAwLCBzaXplb2Yoc3RydWN0IGF0YV9wcm9iZV9lbnQpKTsKLQkJCUlOSVRfTElTVF9IRUFEKCZhZS5ub2RlKTsKLQkJCWFlLmRldiA9ICZwZGV2LT5kZXY7CisJCXJjID0gLUVOT01FTTsKKwkJY21kX2FkZHIgPSBkZXZtX2lvcG9ydF9tYXAoJnBkZXYtPmRldiwgY21kX3BvcnQsIDgpOworCQljdGxfYWRkciA9IGRldm1faW9wb3J0X21hcCgmcGRldi0+ZGV2LCBjbWRfcG9ydCArIDB4MDIwNiwgMSk7CisJCWlmICghY21kX2FkZHIgfHwgIWN0bF9hZGRyKQorCQkJZ290byBlcnJfdW5yZWdpc3RlcjsKIAotCQkJYWUucG9ydF9vcHMgPSAmd2luYm9uZF9wb3J0X29wczsKLQkJCWFlLnBpb19tYXNrID0gMHgxRjsKKwkJYXAgPSBob3N0LT5wb3J0c1swXTsKKwkJYXAtPm9wcyA9ICZ3aW5ib25kX3BvcnRfb3BzOworCQlhcC0+cGlvX21hc2sgPSAweDFGOworCQlhcC0+ZmxhZ3MgfD0gQVRBX0ZMQUdfU0xBVkVfUE9TUzsKKwkJYXAtPmlvYWRkci5jbWRfYWRkciA9IGNtZF9hZGRyOworCQlhcC0+aW9hZGRyLmFsdHN0YXR1c19hZGRyID0gY3RsX2FkZHI7CisJCWFwLT5pb2FkZHIuY3RsX2FkZHIgPSBjdGxfYWRkcjsKKwkJYXRhX3N0ZF9wb3J0cygmYXAtPmlvYWRkcik7CiAKLQkJCWFlLnNodCA9ICZ3aW5ib25kX3NodDsKKwkJLyogaG9vayBpbiBhIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUgcGVyIGNoYW5uZWwgKi8KKwkJaG9zdC0+cHJpdmF0ZV9kYXRhID0gJndpbmJvbmRfZGF0YVtucl93aW5ib25kX2hvc3RdOworCQl3aW5ib25kX2RhdGFbbnJfd2luYm9uZF9ob3N0XS5jb25maWcgPSBwb3J0OworCQl3aW5ib25kX2RhdGFbbnJfd2luYm9uZF9ob3N0XS5wbGF0Zm9ybV9kZXYgPSBwZGV2OwogCi0JCQlhZS5uX3BvcnRzID0gMTsKLQkJCWFlLmlycSA9IDE0ICsgaTsKLQkJCWFlLmlycV9mbGFncyA9IDA7Ci0JCQlhZS5wb3J0X2ZsYWdzID0gQVRBX0ZMQUdfU0xBVkVfUE9TUyB8IEFUQV9GTEFHX1NSU1Q7Ci0JCQlhZS5wb3J0WzBdLmNtZF9hZGRyID0gY21kX2FkZHI7Ci0JCQlhZS5wb3J0WzBdLmFsdHN0YXR1c19hZGRyID0gY3RsX2FkZHI7Ci0JCQlhZS5wb3J0WzBdLmN0bF9hZGRyID0gY3RsX2FkZHI7Ci0JCQlhdGFfc3RkX3BvcnRzKCZhZS5wb3J0WzBdKTsKLQkJCS8qCi0JCQkgKglIb29rIGluIGEgcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZSBwZXIgY2hhbm5lbAotCQkJICovCi0JCQlhZS5wcml2YXRlX2RhdGEgPSAmd2luYm9uZF9kYXRhW25yX3dpbmJvbmRfaG9zdF07Ci0JCQl3aW5ib25kX2RhdGFbbnJfd2luYm9uZF9ob3N0XS5jb25maWcgPSBwb3J0OwotCQkJd2luYm9uZF9kYXRhW25yX3dpbmJvbmRfaG9zdF0ucGxhdGZvcm1fZGV2ID0gcGRldjsKKwkJLyogYWN0aXZhdGUgKi8KKwkJcmMgPSBhdGFfaG9zdF9hY3RpdmF0ZShob3N0LCAxNCArIGksIGF0YV9pbnRlcnJ1cHQsIDAsCisJCQkJICAgICAgICZ3aW5ib25kX3NodCk7CisJCWlmIChyYykKKwkJCWdvdG8gZXJyX3VucmVnaXN0ZXI7CiAKLQkJCXJldCA9IGF0YV9kZXZpY2VfYWRkKCZhZSk7Ci0JCQlpZiAocmV0ID09IDApIHsKLQkJCQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihwZGV2KTsKLQkJCQlyZXR1cm4gLUVOT0RFVjsKLQkJCX0KLQkJCXdpbmJvbmRfaG9zdFtucl93aW5ib25kX2hvc3QrK10gPSBkZXZfZ2V0X2RydmRhdGEoJnBkZXYtPmRldik7Ci0JCX0KKwkJd2luYm9uZF9ob3N0W25yX3dpbmJvbmRfaG9zdCsrXSA9IGRldl9nZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2KTsKIAl9CiAKIAlyZXR1cm4gMDsKKworIGVycl91bnJlZ2lzdGVyOgorCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHBkZXYpOworCXJldHVybiByYzsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wZGNfYWRtYS5jIGIvZHJpdmVycy9hdGEvcGRjX2FkbWEuYwppbmRleCA1ZGQzY2E4Li41MmI2OTUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wZGNfYWRtYS5jCisrKyBiL2RyaXZlcnMvYXRhL3BkY19hZG1hLmMKQEAgLTUyLDkgKzUyLDkgQEAKIC8qIG1hY3JvIHRvIGNhbGN1bGF0ZSBiYXNlIGFkZHJlc3MgZm9yIEFETUEgcmVncyAqLwogI2RlZmluZSBBRE1BX1JFR1MoYmFzZSxwb3J0X25vKQkJKChiYXNlKSArIDB4ODAgKyAoKHBvcnRfbm8pICogMHgyMCkpCiAKLS8qIG1hY3JvIHRvIG9idGFpbiBhZGRyZXNzZXMgZnJvbSBhdGFfaG9zdCAqLwotI2RlZmluZSBBRE1BX0hPU1RfUkVHUyhob3N0LHBvcnRfbm8pIFwKLQlBRE1BX1JFR1MoKGhvc3QpLT5pb21hcFtBRE1BX01NSU9fQkFSXSwgcG9ydF9ubykKKy8qIG1hY3JvIHRvIG9idGFpbiBhZGRyZXNzZXMgZnJvbSBhdGFfcG9ydCAqLworI2RlZmluZSBBRE1BX1BPUlRfUkVHUyhhcCkgXAorCUFETUFfUkVHUygoYXApLT5ob3N0LT5pb21hcFtBRE1BX01NSU9fQkFSXSwgYXAtPnBvcnRfbm8pCiAKIGVudW0gewogCUFETUFfTU1JT19CQVIJCT0gNCwKQEAgLTEyOCw3ICsxMjgsNiBAQAogCiBzdGF0aWMgaW50IGFkbWFfYXRhX2luaXRfb25lIChzdHJ1Y3QgcGNpX2RldiAqcGRldiwKIAkJCQljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KTsKLXN0YXRpYyBpcnFyZXR1cm5fdCBhZG1hX2ludHIgKGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSk7CiBzdGF0aWMgaW50IGFkbWFfcG9ydF9zdGFydChzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKIHN0YXRpYyB2b2lkIGFkbWFfaG9zdF9zdG9wKHN0cnVjdCBhdGFfaG9zdCAqaG9zdCk7CiBzdGF0aWMgdm9pZCBhZG1hX3BvcnRfc3RvcChzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKQEAgLTE3Miw3ICsxNzEsNiBAQAogCS5xY19pc3N1ZQkJPSBhZG1hX3FjX2lzc3VlLAogCS5lbmdfdGltZW91dAkJPSBhZG1hX2VuZ190aW1lb3V0LAogCS5kYXRhX3hmZXIJCT0gYXRhX2RhdGFfeGZlciwKLQkuaXJxX2hhbmRsZXIJCT0gYWRtYV9pbnRyLAogCS5pcnFfY2xlYXIJCT0gYWRtYV9pcnFfY2xlYXIsCiAJLmlycV9vbgkJCT0gYXRhX2lycV9vbiwKIAkuaXJxX2FjawkJPSBhdGFfaXJxX2FjaywKQEAgLTE4Niw3ICsxODQsNiBAQAogc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9pbmZvIGFkbWFfcG9ydF9pbmZvW10gPSB7CiAJLyogYm9hcmRfMTg0MV9pZHggKi8KIAl7Ci0JCS5zaHQJCT0gJmFkbWFfYXRhX3NodCwKIAkJLmZsYWdzCQk9IEFUQV9GTEFHX1NMQVZFX1BPU1MgfCBBVEFfRkxBR19TUlNUIHwKIAkJCQkgIEFUQV9GTEFHX05PX0xFR0FDWSB8IEFUQV9GTEFHX01NSU8gfAogCQkJCSAgQVRBX0ZMQUdfUElPX1BPTExJTkcsCkBAIC0yMjksOCArMjI2LDEwIEBACiAJLyogbm90aGluZyAqLwogfQogCi1zdGF0aWMgdm9pZCBhZG1hX3Jlc2V0X2VuZ2luZSh2b2lkIF9faW9tZW0gKmNoYW4pCitzdGF0aWMgdm9pZCBhZG1hX3Jlc2V0X2VuZ2luZShzdHJ1Y3QgYXRhX3BvcnQgKmFwKQogeworCXZvaWQgX19pb21lbSAqY2hhbiA9IEFETUFfUE9SVF9SRUdTKGFwKTsKKwogCS8qIHJlc2V0IEFETUEgdG8gaWRsZSBzdGF0ZSAqLwogCXdyaXRldyhhUElPTUQ0IHwgYU5JRU4gfCBhUlNUQURNLCBjaGFuICsgQURNQV9DT05UUk9MKTsKIAl1ZGVsYXkoMik7CkBAIC0yNDEsMTQgKzI0MCwxNCBAQAogc3RhdGljIHZvaWQgYWRtYV9yZWluaXRfZW5naW5lKHN0cnVjdCBhdGFfcG9ydCAqYXApCiB7CiAJc3RydWN0IGFkbWFfcG9ydF9wcml2ICpwcCA9IGFwLT5wcml2YXRlX2RhdGE7Ci0Jdm9pZCBfX2lvbWVtICpjaGFuID0gQURNQV9IT1NUX1JFR1MoYXAtPmhvc3QsIGFwLT5wb3J0X25vKTsKKwl2b2lkIF9faW9tZW0gKmNoYW4gPSBBRE1BX1BPUlRfUkVHUyhhcCk7CiAKIAkvKiBtYXNrL2NsZWFyIEFUQSBpbnRlcnJ1cHRzICovCiAJd3JpdGViKEFUQV9OSUVOLCBhcC0+aW9hZGRyLmN0bF9hZGRyKTsKIAlhdGFfY2hlY2tfc3RhdHVzKGFwKTsKIAogCS8qIHJlc2V0IHRoZSBBRE1BIGVuZ2luZSAqLwotCWFkbWFfcmVzZXRfZW5naW5lKGNoYW4pOworCWFkbWFfcmVzZXRfZW5naW5lKGFwKTsKIAogCS8qIHNldCBpbi1GSUZPIHRocmVzaG9sZCB0byAweDEwMCAqLwogCXdyaXRldygweDEwMCwgY2hhbiArIEFETUFfRklGT19JTik7CkBAIC0yNjgsNyArMjY3LDcgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIGFkbWFfZW50ZXJfcmVnX21vZGUoc3RydWN0IGF0YV9wb3J0ICphcCkKIHsKLQl2b2lkIF9faW9tZW0gKmNoYW4gPSBBRE1BX0hPU1RfUkVHUyhhcC0+aG9zdCwgYXAtPnBvcnRfbm8pOworCXZvaWQgX19pb21lbSAqY2hhbiA9IEFETUFfUE9SVF9SRUdTKGFwKTsKIAogCXdyaXRldyhhUElPTUQ0LCBjaGFuICsgQURNQV9DT05UUk9MKTsKIAlyZWFkYihjaGFuICsgQURNQV9TVEFUVVMpOwkvKiBmbHVzaCAqLwpAQCAtNDE1LDcgKzQxNCw3IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgYWRtYV9wYWNrZXRfc3RhcnQoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYykKIHsKIAlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gcWMtPmFwOwotCXZvaWQgX19pb21lbSAqY2hhbiA9IEFETUFfSE9TVF9SRUdTKGFwLT5ob3N0LCBhcC0+cG9ydF9ubyk7CisJdm9pZCBfX2lvbWVtICpjaGFuID0gQURNQV9QT1JUX1JFR1MoYXApOwogCiAJVlBSSU5USygiRU5URVIsIGFwICVwXG4iLCBhcCk7CiAKQEAgLTQ1Myw3ICs0NTIsNyBAQAogCQlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gaG9zdC0+cG9ydHNbcG9ydF9ub107CiAJCXN0cnVjdCBhZG1hX3BvcnRfcHJpdiAqcHA7CiAJCXN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWM7Ci0JCXZvaWQgX19pb21lbSAqY2hhbiA9IEFETUFfSE9TVF9SRUdTKGhvc3QsIHBvcnRfbm8pOworCQl2b2lkIF9faW9tZW0gKmNoYW4gPSBBRE1BX1BPUlRfUkVHUyhhcCk7CiAJCXU4IHN0YXR1cyA9IHJlYWRiKGNoYW4gKyBBRE1BX1NUQVRVUyk7CiAKIAkJaWYgKHN0YXR1cyA9PSAwKQpAQCAtNTc1LDcgKzU3NCw3IEBACiAKIHN0YXRpYyB2b2lkIGFkbWFfcG9ydF9zdG9wKHN0cnVjdCBhdGFfcG9ydCAqYXApCiB7Ci0JYWRtYV9yZXNldF9lbmdpbmUoQURNQV9IT1NUX1JFR1MoYXAtPmhvc3QsIGFwLT5wb3J0X25vKSk7CisJYWRtYV9yZXNldF9lbmdpbmUoYXApOwogfQogCiBzdGF0aWMgdm9pZCBhZG1hX2hvc3Rfc3RvcChzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QpCkBAIC01ODMsMjEgKzU4MiwxOSBAQAogCXVuc2lnbmVkIGludCBwb3J0X25vOwogCiAJZm9yIChwb3J0X25vID0gMDsgcG9ydF9ubyA8IEFETUFfUE9SVFM7ICsrcG9ydF9ubykKLQkJYWRtYV9yZXNldF9lbmdpbmUoQURNQV9IT1NUX1JFR1MoaG9zdCwgcG9ydF9ubykpOworCQlhZG1hX3Jlc2V0X2VuZ2luZShob3N0LT5wb3J0c1twb3J0X25vXSk7CiB9CiAKLXN0YXRpYyB2b2lkIGFkbWFfaG9zdF9pbml0KHVuc2lnbmVkIGludCBjaGlwX2lkLAotCQkJCXN0cnVjdCBhdGFfcHJvYmVfZW50ICpwcm9iZV9lbnQpCitzdGF0aWMgdm9pZCBhZG1hX2hvc3RfaW5pdChzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QsIHVuc2lnbmVkIGludCBjaGlwX2lkKQogewogCXVuc2lnbmVkIGludCBwb3J0X25vOwotCXZvaWQgX19pb21lbSAqbW1pb19iYXNlID0gcHJvYmVfZW50LT5pb21hcFtBRE1BX01NSU9fQkFSXTsKIAogCS8qIGVuYWJsZS9sb2NrIGFHTyBvcGVyYXRpb24gKi8KLQl3cml0ZWIoNywgbW1pb19iYXNlICsgQURNQV9NT0RFX0xPQ0spOworCXdyaXRlYig3LCBob3N0LT5pb21hcFtBRE1BX01NSU9fQkFSXSArIEFETUFfTU9ERV9MT0NLKTsKIAogCS8qIHJlc2V0IHRoZSBBRE1BIGxvZ2ljICovCiAJZm9yIChwb3J0X25vID0gMDsgcG9ydF9ubyA8IEFETUFfUE9SVFM7ICsrcG9ydF9ubykKLQkJYWRtYV9yZXNldF9lbmdpbmUoQURNQV9SRUdTKG1taW9fYmFzZSwgcG9ydF9ubykpOworCQlhZG1hX3Jlc2V0X2VuZ2luZShob3N0LT5wb3J0c1twb3J0X25vXSk7CiB9CiAKIHN0YXRpYyBpbnQgYWRtYV9zZXRfZG1hX21hc2tzKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB2b2lkIF9faW9tZW0gKm1taW9fYmFzZSkKQEAgLTYyMywxNCArNjIwLDIxIEBACiAJCQkgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCiB7CiAJc3RhdGljIGludCBwcmludGVkX3ZlcnNpb247Ci0Jc3RydWN0IGF0YV9wcm9iZV9lbnQgKnByb2JlX2VudCA9IE5VTEw7Ci0Jdm9pZCBfX2lvbWVtICptbWlvX2Jhc2U7CiAJdW5zaWduZWQgaW50IGJvYXJkX2lkeCA9ICh1bnNpZ25lZCBpbnQpIGVudC0+ZHJpdmVyX2RhdGE7CisJY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gKnBwaVtdID0geyAmYWRtYV9wb3J0X2luZm9bYm9hcmRfaWR4XSwgTlVMTCB9OworCXN0cnVjdCBhdGFfaG9zdCAqaG9zdDsKKwl2b2lkIF9faW9tZW0gKm1taW9fYmFzZTsKIAlpbnQgcmMsIHBvcnRfbm87CiAKIAlpZiAoIXByaW50ZWRfdmVyc2lvbisrKQogCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZwZGV2LT5kZXYsICJ2ZXJzaW9uICIgRFJWX1ZFUlNJT04gIlxuIik7CiAKKwkvKiBhbGxvYyBob3N0ICovCisJaG9zdCA9IGF0YV9ob3N0X2FsbG9jX3BpbmZvKCZwZGV2LT5kZXYsIHBwaSwgQURNQV9QT1JUUyk7CisJaWYgKCFob3N0KQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIGFjcXVpcmUgcmVzb3VyY2VzIGFuZCBmaWxsIGhvc3QgKi8KIAlyYyA9IHBjaW1fZW5hYmxlX2RldmljZShwZGV2KTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKQEAgLTY0MSw0NiArNjQ1LDIzIEBACiAJcmMgPSBwY2ltX2lvbWFwX3JlZ2lvbnMocGRldiwgMSA8PCBBRE1BX01NSU9fQkFSLCBEUlZfTkFNRSk7CiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7Ci0JbW1pb19iYXNlID0gcGNpbV9pb21hcF90YWJsZShwZGV2KVtBRE1BX01NSU9fQkFSXTsKKwlob3N0LT5pb21hcCA9IHBjaW1faW9tYXBfdGFibGUocGRldik7CisJbW1pb19iYXNlID0gaG9zdC0+aW9tYXBbQURNQV9NTUlPX0JBUl07CiAKIAlyYyA9IGFkbWFfc2V0X2RtYV9tYXNrcyhwZGV2LCBtbWlvX2Jhc2UpOwogCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCi0JcHJvYmVfZW50ID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqcHJvYmVfZW50KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHByb2JlX2VudCA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXByb2JlX2VudC0+ZGV2ID0gcGNpX2Rldl90b19kZXYocGRldik7Ci0JSU5JVF9MSVNUX0hFQUQoJnByb2JlX2VudC0+bm9kZSk7Ci0KLQlwcm9iZV9lbnQtPnNodAkJPSBhZG1hX3BvcnRfaW5mb1tib2FyZF9pZHhdLnNodDsKLQlwcm9iZV9lbnQtPnBvcnRfZmxhZ3MJPSBhZG1hX3BvcnRfaW5mb1tib2FyZF9pZHhdLmZsYWdzOwotCXByb2JlX2VudC0+cGlvX21hc2sJPSBhZG1hX3BvcnRfaW5mb1tib2FyZF9pZHhdLnBpb19tYXNrOwotCXByb2JlX2VudC0+bXdkbWFfbWFzawk9IGFkbWFfcG9ydF9pbmZvW2JvYXJkX2lkeF0ubXdkbWFfbWFzazsKLQlwcm9iZV9lbnQtPnVkbWFfbWFzawk9IGFkbWFfcG9ydF9pbmZvW2JvYXJkX2lkeF0udWRtYV9tYXNrOwotCXByb2JlX2VudC0+cG9ydF9vcHMJPSBhZG1hX3BvcnRfaW5mb1tib2FyZF9pZHhdLnBvcnRfb3BzOwotCi0JcHJvYmVfZW50LT5pcnEJCT0gcGRldi0+aXJxOwotCXByb2JlX2VudC0+aXJxX2ZsYWdzCT0gSVJRRl9TSEFSRUQ7Ci0JcHJvYmVfZW50LT5uX3BvcnRzCT0gQURNQV9QT1JUUzsKLQlwcm9iZV9lbnQtPmlvbWFwCT0gcGNpbV9pb21hcF90YWJsZShwZGV2KTsKLQotCWZvciAocG9ydF9ubyA9IDA7IHBvcnRfbm8gPCBwcm9iZV9lbnQtPm5fcG9ydHM7ICsrcG9ydF9ubykgewotCQlhZG1hX2F0YV9zZXR1cF9wb3J0KCZwcm9iZV9lbnQtPnBvcnRbcG9ydF9ub10sCisJZm9yIChwb3J0X25vID0gMDsgcG9ydF9ubyA8IEFETUFfUE9SVFM7ICsrcG9ydF9ubykKKwkJYWRtYV9hdGFfc2V0dXBfcG9ydCgmaG9zdC0+cG9ydHNbcG9ydF9ub10tPmlvYWRkciwKIAkJCQkgICAgQURNQV9BVEFfUkVHUyhtbWlvX2Jhc2UsIHBvcnRfbm8pKTsKLQl9Ci0KLQlwY2lfc2V0X21hc3RlcihwZGV2KTsKIAogCS8qIGluaXRpYWxpemUgYWRhcHRlciAqLwotCWFkbWFfaG9zdF9pbml0KGJvYXJkX2lkeCwgcHJvYmVfZW50KTsKKwlhZG1hX2hvc3RfaW5pdChob3N0LCBib2FyZF9pZHgpOwogCi0JaWYgKCFhdGFfZGV2aWNlX2FkZChwcm9iZV9lbnQpKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCWRldm1fa2ZyZWUoJnBkZXYtPmRldiwgcHJvYmVfZW50KTsKLQlyZXR1cm4gMDsKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKwlyZXR1cm4gYXRhX2hvc3RfYWN0aXZhdGUoaG9zdCwgcGRldi0+aXJxLCBhZG1hX2ludHIsIElSUUZfU0hBUkVELAorCQkJCSAmYWRtYV9hdGFfc2h0KTsKIH0KIAogc3RhdGljIGludCBfX2luaXQgYWRtYV9hdGFfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvc2F0YV9pbmljMTYyeC5jIGIvZHJpdmVycy9hdGEvc2F0YV9pbmljMTYyeC5jCmluZGV4IDFlMjE2ODguLmYwOTlhMWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3NhdGFfaW5pYzE2MnguYworKysgYi9kcml2ZXJzL2F0YS9zYXRhX2luaWMxNjJ4LmMKQEAgLTQ4OCwxMSArNDg4LDExIEBACiBzdGF0aWMgdm9pZCBpbmljX3Bvc3RfaW50ZXJuYWxfY21kKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpCiB7CiAJLyogbWFrZSBETUEgZW5naW5lIGZvcmdldCBhYm91dCB0aGUgZmFpbGVkIGNvbW1hbmQgKi8KLQlpZiAocWMtPmVycl9tYXNrKQorCWlmIChxYy0+ZmxhZ3MgJiBBVEFfUUNGTEFHX0ZBSUxFRCkKIAkJaW5pY19yZXNldF9wb3J0KGluaWNfcG9ydF9iYXNlKHFjLT5hcCkpOwogfQogCi1zdGF0aWMgdm9pZCBpbmljX2Rldl9jb25maWcoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV9kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIGluaWNfZGV2X2NvbmZpZyhzdHJ1Y3QgYXRhX2RldmljZSAqZGV2KQogewogCS8qIGluaWMgY2FuIG9ubHkgaGFuZGxlIHVwdG8gTEJBMjggbWF4IHNlY3RvcnMgKi8KIAlpZiAoZGV2LT5tYXhfc2VjdG9ycyA+IEFUQV9NQVhfU0VDVE9SUykKQEAgLTU1OSw3ICs1NTksNiBAQAogCS5ibWRtYV9zdG9wCQk9IGluaWNfYm1kbWFfc3RvcCwKIAkuYm1kbWFfc3RhdHVzCQk9IGluaWNfYm1kbWFfc3RhdHVzLAogCi0JLmlycV9oYW5kbGVyCQk9IGluaWNfaW50ZXJydXB0LAogCS5pcnFfY2xlYXIJCT0gaW5pY19pcnFfY2xlYXIsCiAJLmlycV9vbgkJCT0gYXRhX2lycV9vbiwKIAkuaXJxX2FjawkJPSBhdGFfaXJxX2FjaywKQEAgLTU4MCw3ICs1NzksNiBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9pbmZvIGluaWNfcG9ydF9pbmZvID0gewotCS5zaHQJCQk9ICZpbmljX3NodCwKIAkvKiBGb3Igc29tZSByZWFzb24sIEFUQV9QUk9UX0FUQVBJIGlzIGJyb2tlbiBvbiB0aGlzCiAJICogY29udHJvbGxlciwgYW5kIG5vLCBQSU9fUE9MTElORyBkb2VzJ3QgZml4IGl0LiAgSXQgc29tZWhvdwogCSAqIG1hbmFnZXMgdG8gcmVwb3J0IHRoZSB3cm9uZyBpcmVhc29uIGFuZCBpZ25vcmluZyBpcmVhc29uCkBAIC02NDIsNyArNjQwLDkgQEAKIAl2b2lkIF9faW9tZW0gKm1taW9fYmFzZSA9IGhvc3QtPmlvbWFwW01NSU9fQkFSXTsKIAlpbnQgcmM7CiAKLQlhdGFfcGNpX2RldmljZV9kb19yZXN1bWUocGRldik7CisJcmMgPSBhdGFfcGNpX2RldmljZV9kb19yZXN1bWUocGRldik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CiAKIAlpZiAocGRldi0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlLmV2ZW50ID09IFBNX0VWRU5UX1NVU1BFTkQpIHsKIAkJcmMgPSBpbml0X2NvbnRyb2xsZXIobW1pb19iYXNlLCBocHJpdi0+Y2FjaGVkX2hjdGwpOwpAQCAtNjU5LDggKzY1OSw4IEBACiBzdGF0aWMgaW50IGluaWNfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCiB7CiAJc3RhdGljIGludCBwcmludGVkX3ZlcnNpb247Ci0Jc3RydWN0IGF0YV9wb3J0X2luZm8gKnBpbmZvID0gJmluaWNfcG9ydF9pbmZvOwotCXN0cnVjdCBhdGFfcHJvYmVfZW50ICpwcm9iZV9lbnQ7CisJY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gKnBwaVtdID0geyAmaW5pY19wb3J0X2luZm8sIE5VTEwgfTsKKwlzdHJ1Y3QgYXRhX2hvc3QgKmhvc3Q7CiAJc3RydWN0IGluaWNfaG9zdF9wcml2ICpocHJpdjsKIAl2b2lkIF9faW9tZW0gKiBjb25zdCAqaW9tYXA7CiAJaW50IGksIHJjOwpAQCAtNjY4LDYgKzY2OCwxNSBAQAogCWlmICghcHJpbnRlZF92ZXJzaW9uKyspCiAJCWRldl9wcmludGsoS0VSTl9ERUJVRywgJnBkZXYtPmRldiwgInZlcnNpb24gIiBEUlZfVkVSU0lPTiAiXG4iKTsKIAorCS8qIGFsbG9jIGhvc3QgKi8KKwlob3N0ID0gYXRhX2hvc3RfYWxsb2NfcGluZm8oJnBkZXYtPmRldiwgcHBpLCBOUl9QT1JUUyk7CisJaHByaXYgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpocHJpdiksIEdGUF9LRVJORUwpOworCWlmICghaG9zdCB8fCAhaHByaXYpCisJCXJldHVybiAtRU5PTUVNOworCisJaG9zdC0+cHJpdmF0ZV9kYXRhID0gaHByaXY7CisKKwkvKiBhY3F1aXJlIHJlc291cmNlcyBhbmQgZmlsbCBob3N0ICovCiAJcmMgPSBwY2ltX2VuYWJsZV9kZXZpY2UocGRldik7CiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CkBAIC02NzUsNyArNjg0LDIyIEBACiAJcmMgPSBwY2ltX2lvbWFwX3JlZ2lvbnMocGRldiwgMHgzZiwgRFJWX05BTUUpOwogCWlmIChyYykKIAkJcmV0dXJuIHJjOwotCWlvbWFwID0gcGNpbV9pb21hcF90YWJsZShwZGV2KTsKKwlob3N0LT5pb21hcCA9IGlvbWFwID0gcGNpbV9pb21hcF90YWJsZShwZGV2KTsKKworCWZvciAoaSA9IDA7IGkgPCBOUl9QT1JUUzsgaSsrKSB7CisJCXN0cnVjdCBhdGFfaW9wb3J0cyAqcG9ydCA9ICZob3N0LT5wb3J0c1tpXS0+aW9hZGRyOworCQl2b2lkIF9faW9tZW0gKnBvcnRfYmFzZSA9IGlvbWFwW01NSU9fQkFSXSArIGkgKiBQT1JUX1NJWkU7CisKKwkJcG9ydC0+Y21kX2FkZHIgPSBpb21hcFsyICogaV07CisJCXBvcnQtPmFsdHN0YXR1c19hZGRyID0KKwkJcG9ydC0+Y3RsX2FkZHIgPSAodm9pZCBfX2lvbWVtICopCisJCQkoKHVuc2lnbmVkIGxvbmcpaW9tYXBbMiAqIGkgKyAxXSB8IEFUQV9QQ0lfQ1RMX09GUyk7CisJCXBvcnQtPnNjcl9hZGRyID0gcG9ydF9iYXNlICsgUE9SVF9TQ1I7CisKKwkJYXRhX3N0ZF9wb3J0cyhwb3J0KTsKKwl9CisKKwlocHJpdi0+Y2FjaGVkX2hjdGwgPSByZWFkdyhpb21hcFtNTUlPX0JBUl0gKyBIT1NUX0NUTCk7CiAKIAkvKiBTZXQgZG1hX21hc2suICBUaGlzIGRldmljZXMgZG9lc24ndCBzdXBwb3J0IDY0Yml0IGFkZHJlc3NpbmcuICovCiAJcmMgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV8zMkJJVF9NQVNLKTsKQEAgLTY5Miw0MyArNzE2LDYgQEAKIAkJcmV0dXJuIHJjOwogCX0KIAotCXByb2JlX2VudCA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKnByb2JlX2VudCksIEdGUF9LRVJORUwpOwotCWhwcml2ID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqaHByaXYpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXByb2JlX2VudCB8fCAhaHByaXYpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcHJvYmVfZW50LT5kZXYgPSAmcGRldi0+ZGV2OwotCUlOSVRfTElTVF9IRUFEKCZwcm9iZV9lbnQtPm5vZGUpOwotCi0JcHJvYmVfZW50LT5zaHQJCQk9IHBpbmZvLT5zaHQ7Ci0JcHJvYmVfZW50LT5wb3J0X2ZsYWdzCQk9IHBpbmZvLT5mbGFnczsKLQlwcm9iZV9lbnQtPnBpb19tYXNrCQk9IHBpbmZvLT5waW9fbWFzazsKLQlwcm9iZV9lbnQtPm13ZG1hX21hc2sJCT0gcGluZm8tPm13ZG1hX21hc2s7Ci0JcHJvYmVfZW50LT51ZG1hX21hc2sJCT0gcGluZm8tPnVkbWFfbWFzazsKLQlwcm9iZV9lbnQtPnBvcnRfb3BzCQk9IHBpbmZvLT5wb3J0X29wczsKLQlwcm9iZV9lbnQtPm5fcG9ydHMJCT0gTlJfUE9SVFM7Ci0KLQlwcm9iZV9lbnQtPmlycSA9IHBkZXYtPmlycTsKLQlwcm9iZV9lbnQtPmlycV9mbGFncyA9IElSUUZfU0hBUkVEOwotCi0JcHJvYmVfZW50LT5pb21hcCA9IGlvbWFwOwotCi0JZm9yIChpID0gMDsgaSA8IE5SX1BPUlRTOyBpKyspIHsKLQkJc3RydWN0IGF0YV9pb3BvcnRzICpwb3J0ID0gJnByb2JlX2VudC0+cG9ydFtpXTsKLQkJdm9pZCBfX2lvbWVtICpwb3J0X2Jhc2UgPSBpb21hcFtNTUlPX0JBUl0gKyBpICogUE9SVF9TSVpFOwotCi0JCXBvcnQtPmNtZF9hZGRyID0gaW9tYXBbMiAqIGldOwotCQlwb3J0LT5hbHRzdGF0dXNfYWRkciA9Ci0JCXBvcnQtPmN0bF9hZGRyID0gKHZvaWQgX19pb21lbSAqKQotCQkJKCh1bnNpZ25lZCBsb25nKWlvbWFwWzIgKiBpICsgMV0gfCBBVEFfUENJX0NUTF9PRlMpOwotCQlwb3J0LT5zY3JfYWRkciA9IHBvcnRfYmFzZSArIFBPUlRfU0NSOwotCi0JCWF0YV9zdGRfcG9ydHMocG9ydCk7Ci0JfQotCi0JcHJvYmVfZW50LT5wcml2YXRlX2RhdGEgPSBocHJpdjsKLQlocHJpdi0+Y2FjaGVkX2hjdGwgPSByZWFkdyhpb21hcFtNTUlPX0JBUl0gKyBIT1NUX0NUTCk7Ci0KIAlyYyA9IGluaXRfY29udHJvbGxlcihpb21hcFtNTUlPX0JBUl0sIGhwcml2LT5jYWNoZWRfaGN0bCk7CiAJaWYgKHJjKSB7CiAJCWRldl9wcmludGsoS0VSTl9FUlIsICZwZGV2LT5kZXYsCkBAIC03MzcsMTMgKzcyNCw4IEBACiAJfQogCiAJcGNpX3NldF9tYXN0ZXIocGRldik7Ci0KLQlpZiAoIWF0YV9kZXZpY2VfYWRkKHByb2JlX2VudCkpCi0JCXJldHVybiAtRU5PREVWOwotCi0JZGV2bV9rZnJlZSgmcGRldi0+ZGV2LCBwcm9iZV9lbnQpOwotCi0JcmV0dXJuIDA7CisJcmV0dXJuIGF0YV9ob3N0X2FjdGl2YXRlKGhvc3QsIHBkZXYtPmlycSwgaW5pY19pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAorCQkJCSAmaW5pY19zaHQpOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgaW5pY19wY2lfdGJsW10gPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9zYXRhX212LmMgYi9kcml2ZXJzL2F0YS9zYXRhX212LmMKaW5kZXggYTY1YmE2My4uY2I5YjlhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvc2F0YV9tdi5jCisrKyBiL2RyaXZlcnMvYXRhL3NhdGFfbXYuYwpAQCAtMjUzLDEwICsyNTMsNyBAQAogI2RlZmluZSBJU19HRU5fSUlFKGhwcml2KSAoKGhwcml2KS0+aHBfZmxhZ3MgJiBNVl9IUF9HRU5fSUlFKQogCiBlbnVtIHsKLQkvKiBPdXIgRE1BIGJvdW5kYXJ5IGlzIGRldGVybWluZWQgYnkgYW4gZVBSRCBiZWluZyB1bmFibGUgdG8gaGFuZGxlCi0JICogYW55dGhpbmcgbGFyZ2VyIHRoYW4gNjRLQgotCSAqLwotCU1WX0RNQV9CT1VOREFSWQkJPSAweGZmZmZVLAorCU1WX0RNQV9CT1VOREFSWQkJPSAweGZmZmZmZmZmVSwKIAogCUVETUFfUkVRX1FfQkFTRV9MT19NQVNLCT0gMHhmZmZmZmMwMFUsCiAKQEAgLTM1MCw3ICszNDcsNiBAQAogc3RhdGljIHZvaWQgbXZfcWNfcHJlcChzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKTsKIHN0YXRpYyB2b2lkIG12X3FjX3ByZXBfaWllKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpOwogc3RhdGljIHVuc2lnbmVkIGludCBtdl9xY19pc3N1ZShzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKTsKLXN0YXRpYyBpcnFyZXR1cm5fdCBtdl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlKTsKIHN0YXRpYyB2b2lkIG12X2VuZ190aW1lb3V0KHN0cnVjdCBhdGFfcG9ydCAqYXApOwogc3RhdGljIGludCBtdl9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCk7CiAKQEAgLTM4NCwxMCArMzgwLDEwIEBACiAJLnF1ZXVlY29tbWFuZAkJPSBhdGFfc2NzaV9xdWV1ZWNtZCwKIAkuY2FuX3F1ZXVlCQk9IE1WX1VTRV9RX0RFUFRILAogCS50aGlzX2lkCQk9IEFUQV9TSFRfVEhJU19JRCwKLQkuc2dfdGFibGVzaXplCQk9IE1WX01BWF9TR19DVCAvIDIsCisJLnNnX3RhYmxlc2l6ZQkJPSBNVl9NQVhfU0dfQ1QsCiAJLmNtZF9wZXJfbHVuCQk9IEFUQV9TSFRfQ01EX1BFUl9MVU4sCiAJLmVtdWxhdGVkCQk9IEFUQV9TSFRfRU1VTEFURUQsCi0JLnVzZV9jbHVzdGVyaW5nCQk9IEFUQV9TSFRfVVNFX0NMVVNURVJJTkcsCisJLnVzZV9jbHVzdGVyaW5nCQk9IDEsCiAJLnByb2NfbmFtZQkJPSBEUlZfTkFNRSwKIAkuZG1hX2JvdW5kYXJ5CQk9IE1WX0RNQV9CT1VOREFSWSwKIAkuc2xhdmVfY29uZmlndXJlCT0gYXRhX3Njc2lfc2xhdmVfY29uZmlnLApAQCAtNDA1LDYgKzQwMSw3IEBACiAJLmRldl9zZWxlY3QJCT0gYXRhX3N0ZF9kZXZfc2VsZWN0LAogCiAJLnBoeV9yZXNldAkJPSBtdl9waHlfcmVzZXQsCisJLmNhYmxlX2RldGVjdAkJPSBhdGFfY2FibGVfc2F0YSwKIAogCS5xY19wcmVwCQk9IG12X3FjX3ByZXAsCiAJLnFjX2lzc3VlCQk9IG12X3FjX2lzc3VlLApAQCAtNDEyLDcgKzQwOSw2IEBACiAKIAkuZW5nX3RpbWVvdXQJCT0gbXZfZW5nX3RpbWVvdXQsCiAKLQkuaXJxX2hhbmRsZXIJCT0gbXZfaW50ZXJydXB0LAogCS5pcnFfY2xlYXIJCT0gbXZfaXJxX2NsZWFyLAogCS5pcnFfb24JCQk9IGF0YV9pcnFfb24sCiAJLmlycV9hY2sJCT0gYXRhX2lycV9hY2ssCkBAIC00MzQsNiArNDMwLDcgQEAKIAkuZGV2X3NlbGVjdAkJPSBhdGFfc3RkX2Rldl9zZWxlY3QsCiAKIAkucGh5X3Jlc2V0CQk9IG12X3BoeV9yZXNldCwKKwkuY2FibGVfZGV0ZWN0CQk9IGF0YV9jYWJsZV9zYXRhLAogCiAJLnFjX3ByZXAJCT0gbXZfcWNfcHJlcCwKIAkucWNfaXNzdWUJCT0gbXZfcWNfaXNzdWUsCkBAIC00NDEsNyArNDM4LDYgQEAKIAogCS5lbmdfdGltZW91dAkJPSBtdl9lbmdfdGltZW91dCwKIAotCS5pcnFfaGFuZGxlcgkJPSBtdl9pbnRlcnJ1cHQsCiAJLmlycV9jbGVhcgkJPSBtdl9pcnFfY2xlYXIsCiAJLmlycV9vbgkJCT0gYXRhX2lycV9vbiwKIAkuaXJxX2FjawkJPSBhdGFfaXJxX2FjaywKQEAgLTQ2Myw2ICs0NTksNyBAQAogCS5kZXZfc2VsZWN0CQk9IGF0YV9zdGRfZGV2X3NlbGVjdCwKIAogCS5waHlfcmVzZXQJCT0gbXZfcGh5X3Jlc2V0LAorCS5jYWJsZV9kZXRlY3QJCT0gYXRhX2NhYmxlX3NhdGEsCiAKIAkucWNfcHJlcAkJPSBtdl9xY19wcmVwX2lpZSwKIAkucWNfaXNzdWUJCT0gbXZfcWNfaXNzdWUsCkBAIC00NzAsNyArNDY3LDYgQEAKIAogCS5lbmdfdGltZW91dAkJPSBtdl9lbmdfdGltZW91dCwKIAotCS5pcnFfaGFuZGxlcgkJPSBtdl9pbnRlcnJ1cHQsCiAJLmlycV9jbGVhcgkJPSBtdl9pcnFfY2xlYXIsCiAJLmlycV9vbgkJCT0gYXRhX2lycV9vbiwKIAkuaXJxX2FjawkJPSBhdGFfaXJxX2FjaywKQEAgLTQ4NCwzNSArNDgwLDMwIEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBtdl9wb3J0X2luZm9bXSA9IHsKIAl7ICAvKiBjaGlwXzUwNHggKi8KLQkJLnNodAkJPSAmbXZfc2h0LAogCQkuZmxhZ3MJCT0gTVZfQ09NTU9OX0ZMQUdTLAogCQkucGlvX21hc2sJPSAweDFmLAkvKiBwaW8wLTQgKi8KIAkJLnVkbWFfbWFzawk9IDB4N2YsCS8qIHVkbWEwLTYgKi8KIAkJLnBvcnRfb3BzCT0gJm12NV9vcHMsCiAJfSwKIAl7ICAvKiBjaGlwXzUwOHggKi8KLQkJLnNodAkJPSAmbXZfc2h0LAogCQkuZmxhZ3MJCT0gKE1WX0NPTU1PTl9GTEFHUyB8IE1WX0ZMQUdfRFVBTF9IQyksCiAJCS5waW9fbWFzawk9IDB4MWYsCS8qIHBpbzAtNCAqLwogCQkudWRtYV9tYXNrCT0gMHg3ZiwJLyogdWRtYTAtNiAqLwogCQkucG9ydF9vcHMJPSAmbXY1X29wcywKIAl9LAogCXsgIC8qIGNoaXBfNTA4MCAqLwotCQkuc2h0CQk9ICZtdl9zaHQsCiAJCS5mbGFncwkJPSAoTVZfQ09NTU9OX0ZMQUdTIHwgTVZfRkxBR19EVUFMX0hDKSwKIAkJLnBpb19tYXNrCT0gMHgxZiwJLyogcGlvMC00ICovCiAJCS51ZG1hX21hc2sJPSAweDdmLAkvKiB1ZG1hMC02ICovCiAJCS5wb3J0X29wcwk9ICZtdjVfb3BzLAogCX0sCiAJeyAgLyogY2hpcF82MDR4ICovCi0JCS5zaHQJCT0gJm12X3NodCwKIAkJLmZsYWdzCQk9IChNVl9DT01NT05fRkxBR1MgfCBNVl82WFhYX0ZMQUdTKSwKIAkJLnBpb19tYXNrCT0gMHgxZiwJLyogcGlvMC00ICovCiAJCS51ZG1hX21hc2sJPSAweDdmLAkvKiB1ZG1hMC02ICovCiAJCS5wb3J0X29wcwk9ICZtdjZfb3BzLAogCX0sCiAJeyAgLyogY2hpcF82MDh4ICovCi0JCS5zaHQJCT0gJm12X3NodCwKIAkJLmZsYWdzCQk9IChNVl9DT01NT05fRkxBR1MgfCBNVl82WFhYX0ZMQUdTIHwKIAkJCQkgICBNVl9GTEFHX0RVQUxfSEMpLAogCQkucGlvX21hc2sJPSAweDFmLAkvKiBwaW8wLTQgKi8KQEAgLTUyMCwxNCArNTExLDEyIEBACiAJCS5wb3J0X29wcwk9ICZtdjZfb3BzLAogCX0sCiAJeyAgLyogY2hpcF82MDQyICovCi0JCS5zaHQJCT0gJm12X3NodCwKIAkJLmZsYWdzCQk9IChNVl9DT01NT05fRkxBR1MgfCBNVl82WFhYX0ZMQUdTKSwKIAkJLnBpb19tYXNrCT0gMHgxZiwJLyogcGlvMC00ICovCiAJCS51ZG1hX21hc2sJPSAweDdmLAkvKiB1ZG1hMC02ICovCiAJCS5wb3J0X29wcwk9ICZtdl9paWVfb3BzLAogCX0sCiAJeyAgLyogY2hpcF83MDQyICovCi0JCS5zaHQJCT0gJm12X3NodCwKIAkJLmZsYWdzCQk9IChNVl9DT01NT05fRkxBR1MgfCBNVl82WFhYX0ZMQUdTKSwKIAkJLnBpb19tYXNrCT0gMHgxZiwJLyogcGlvMC00ICovCiAJCS51ZG1hX21hc2sJPSAweDdmLAkvKiB1ZG1hMC02ICovCkBAIC01NTEsNiArNTQwLDkgQEAKIAogCXsgUENJX1ZERVZJQ0UoVFRJLCAweDIzMTApLCBjaGlwXzcwNDIgfSwKIAorCS8qIGFkZCBNYXJ2ZWxsIDcwNDIgc3VwcG9ydCAqLworCXsgUENJX1ZERVZJQ0UoTUFSVkVMTCwgMHg3MDQyKSwgY2hpcF83MDQyIH0sCisKIAl7IH0JCQkvKiB0ZXJtaW5hdGUgbGlzdCAqLwogfTsKIApAQCAtNTg1LDYgKzU3NywzOSBAQAogc3RhdGljIGludCBtc2k7CSAgICAgIC8qIFVzZSBQQ0kgbXNpOyBlaXRoZXIgemVybyAob2ZmLCBkZWZhdWx0KSBvciBub24temVybyAqLwogCiAKKy8qIG1vdmUgdG8gUENJIGxheWVyIG9yIGxpYmF0YSBjb3JlPyAqLworc3RhdGljIGludCBwY2lfZ29fNjQoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJaW50IHJjOworCisJaWYgKCFwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV82NEJJVF9NQVNLKSkgeworCQlyYyA9IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBETUFfNjRCSVRfTUFTSyk7CisJCWlmIChyYykgeworCQkJcmMgPSBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgRE1BXzMyQklUX01BU0spOworCQkJaWYgKHJjKSB7CisJCQkJZGV2X3ByaW50ayhLRVJOX0VSUiwgJnBkZXYtPmRldiwKKwkJCQkJICAgIjY0LWJpdCBETUEgZW5hYmxlIGZhaWxlZFxuIik7CisJCQkJcmV0dXJuIHJjOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJcmMgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV8zMkJJVF9NQVNLKTsKKwkJaWYgKHJjKSB7CisJCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCAmcGRldi0+ZGV2LAorCQkJCSAgICIzMi1iaXQgRE1BIGVuYWJsZSBmYWlsZWRcbiIpOworCQkJcmV0dXJuIHJjOworCQl9CisJCXJjID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV8zMkJJVF9NQVNLKTsKKwkJaWYgKHJjKSB7CisJCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCAmcGRldi0+ZGV2LAorCQkJCSAgICIzMi1iaXQgY29uc2lzdGVudCBETUEgZW5hYmxlIGZhaWxlZFxuIik7CisJCQlyZXR1cm4gcmM7CisJCX0KKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKIC8qCiAgKiBGdW5jdGlvbnMKICAqLwpAQCAtNzk4LDIwICs4MjMsMTggQEAKIHsKIAl1bnNpZ25lZCBpbnQgb2ZzID0gbXZfc2NyX29mZnNldChzY19yZWdfaW4pOwogCi0JaWYgKDB4ZmZmZmZmZmZVICE9IG9mcykgeworCWlmICgweGZmZmZmZmZmVSAhPSBvZnMpCiAJCXJldHVybiByZWFkbChtdl9hcF9iYXNlKGFwKSArIG9mcyk7Ci0JfSBlbHNlIHsKKwllbHNlCiAJCXJldHVybiAodTMyKSBvZnM7Ci0JfQogfQogCiBzdGF0aWMgdm9pZCBtdl9zY3Jfd3JpdGUoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IHNjX3JlZ19pbiwgdTMyIHZhbCkKIHsKIAl1bnNpZ25lZCBpbnQgb2ZzID0gbXZfc2NyX29mZnNldChzY19yZWdfaW4pOwogCi0JaWYgKDB4ZmZmZmZmZmZVICE9IG9mcykgeworCWlmICgweGZmZmZmZmZmVSAhPSBvZnMpCiAJCXdyaXRlbGZsKHZhbCwgbXZfYXBfYmFzZShhcCkgKyBvZnMpOwotCX0KIH0KIAogc3RhdGljIHZvaWQgbXZfZWRtYV9jZmcoc3RydWN0IG12X2hvc3RfcHJpdiAqaHByaXYsIHZvaWQgX19pb21lbSAqcG9ydF9tbWlvKQpAQCAtOTU5LDM4ICs5ODIsMzAgQEAKICAqICAgICAgTE9DS0lORzoKICAqICAgICAgSW5oZXJpdGVkIGZyb20gY2FsbGVyLgogICovCi1zdGF0aWMgdm9pZCBtdl9maWxsX3NnKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpCitzdGF0aWMgdW5zaWduZWQgaW50IG12X2ZpbGxfc2coc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYykKIHsKIAlzdHJ1Y3QgbXZfcG9ydF9wcml2ICpwcCA9IHFjLT5hcC0+cHJpdmF0ZV9kYXRhOwotCXVuc2lnbmVkIGludCBpID0gMDsKKwl1bnNpZ25lZCBpbnQgbl9zZyA9IDA7CiAJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKKwlzdHJ1Y3QgbXZfc2cgKm12X3NnOwogCisJbXZfc2cgPSBwcC0+c2dfdGJsOwogCWF0YV9mb3JfZWFjaF9zZyhzZywgcWMpIHsKLQkJZG1hX2FkZHJfdCBhZGRyOwotCQl1MzIgc2dfbGVuLCBsZW4sIG9mZnNldDsKKwkJZG1hX2FkZHJfdCBhZGRyID0gc2dfZG1hX2FkZHJlc3Moc2cpOworCQl1MzIgc2dfbGVuID0gc2dfZG1hX2xlbihzZyk7CiAKLQkJYWRkciA9IHNnX2RtYV9hZGRyZXNzKHNnKTsKLQkJc2dfbGVuID0gc2dfZG1hX2xlbihzZyk7CisJCW12X3NnLT5hZGRyID0gY3B1X3RvX2xlMzIoYWRkciAmIDB4ZmZmZmZmZmYpOworCQltdl9zZy0+YWRkcl9oaSA9IGNwdV90b19sZTMyKChhZGRyID4+IDE2KSA+PiAxNik7CisJCW12X3NnLT5mbGFnc19zaXplID0gY3B1X3RvX2xlMzIoc2dfbGVuICYgMHhmZmZmKTsKIAotCQl3aGlsZSAoc2dfbGVuKSB7Ci0JCQlvZmZzZXQgPSBhZGRyICYgTVZfRE1BX0JPVU5EQVJZOwotCQkJbGVuID0gc2dfbGVuOwotCQkJaWYgKChvZmZzZXQgKyBzZ19sZW4pID4gMHgxMDAwMCkKLQkJCQlsZW4gPSAweDEwMDAwIC0gb2Zmc2V0OworCQlpZiAoYXRhX3NnX2lzX2xhc3Qoc2csIHFjKSkKKwkJCW12X3NnLT5mbGFnc19zaXplIHw9IGNwdV90b19sZTMyKEVQUkRfRkxBR19FTkRfT0ZfVEJMKTsKIAotCQkJcHAtPnNnX3RibFtpXS5hZGRyID0gY3B1X3RvX2xlMzIoYWRkciAmIDB4ZmZmZmZmZmYpOwotCQkJcHAtPnNnX3RibFtpXS5hZGRyX2hpID0gY3B1X3RvX2xlMzIoKGFkZHIgPj4gMTYpID4+IDE2KTsKLQkJCXBwLT5zZ190YmxbaV0uZmxhZ3Nfc2l6ZSA9IGNwdV90b19sZTMyKGxlbiAmIDB4ZmZmZik7Ci0KLQkJCXNnX2xlbiAtPSBsZW47Ci0JCQlhZGRyICs9IGxlbjsKLQotCQkJaWYgKCFzZ19sZW4gJiYgYXRhX3NnX2lzX2xhc3Qoc2csIHFjKSkKLQkJCQlwcC0+c2dfdGJsW2ldLmZsYWdzX3NpemUgfD0gY3B1X3RvX2xlMzIoRVBSRF9GTEFHX0VORF9PRl9UQkwpOwotCi0JCQlpKys7Ci0JCX0KKwkJbXZfc2crKzsKKwkJbl9zZysrOwogCX0KKworCXJldHVybiBuX3NnOwogfQogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIG12X2luY19xX2luZGV4KHVuc2lnbmVkIGluZGV4KQpAQCAtMTMyMCwxNyArMTMzNSwxNSBAQAogCWludCBzaGlmdCwgcG9ydCwgcG9ydDAsIGhhcmRfcG9ydCwgaGFuZGxlZDsKIAl1bnNpZ25lZCBpbnQgZXJyX21hc2s7CiAKLQlpZiAoaGMgPT0gMCkgeworCWlmIChoYyA9PSAwKQogCQlwb3J0MCA9IDA7Ci0JfSBlbHNlIHsKKwllbHNlCiAJCXBvcnQwID0gTVZfUE9SVFNfUEVSX0hDOwotCX0KIAogCS8qIHdlJ2xsIG5lZWQgdGhlIEhDIHN1Y2Nlc3MgaW50IHJlZ2lzdGVyIGluIG1vc3QgY2FzZXMgKi8KIAloY19pcnFfY2F1c2UgPSByZWFkbChoY19tbWlvICsgSENfSVJRX0NBVVNFX09GUyk7Ci0JaWYgKGhjX2lycV9jYXVzZSkgeworCWlmIChoY19pcnFfY2F1c2UpCiAJCXdyaXRlbGZsKH5oY19pcnFfY2F1c2UsIGhjX21taW8gKyBIQ19JUlFfQ0FVU0VfT0ZTKTsKLQl9CiAKIAlWUFJJTlRLKCJFTlRFUiwgaGMldSByZWxldmFudD0weCUwOHggSEMgSVJRIGNhdXNlPTB4JTA4eFxuIiwKIAkJaGMscmVsZXZhbnQsaGNfaXJxX2NhdXNlKTsKQEAgLTE0MjUsOSArMTQzOCw4IEBACiAJLyogY2hlY2sgdGhlIGNhc2VzIHdoZXJlIHdlIGVpdGhlciBoYXZlIG5vdGhpbmcgcGVuZGluZyBvciBoYXZlIHJlYWQKIAkgKiBhIGJvZ3VzIHJlZ2lzdGVyIHZhbHVlIHdoaWNoIGNhbiBpbmRpY2F0ZSBIVyByZW1vdmFsIG9yIFBDSSBmYXVsdAogCSAqLwotCWlmICghaXJxX3N0YXQgfHwgKDB4ZmZmZmZmZmZVID09IGlycV9zdGF0KSkgeworCWlmICghaXJxX3N0YXQgfHwgKDB4ZmZmZmZmZmZVID09IGlycV9zdGF0KSkKIAkJcmV0dXJuIElSUV9OT05FOwotCX0KIAogCW5faGNzID0gbXZfZ2V0X2hjX2NvdW50KGhvc3QtPnBvcnRzWzBdLT5mbGFncyk7CiAJc3Bpbl9sb2NrKCZob3N0LT5sb2NrKTsKQEAgLTE5NTIsNyArMTk2NCw2IEBACiAJCWF0YV9wb3J0X2Rpc2FibGUoYXApOwogCQlyZXR1cm47CiAJfQotCWFwLT5jYmwgPSBBVEFfQ0JMX1NBVEE7CiAKIAkvKiBldmVuIGFmdGVyIFNTdGF0dXMgcmVmbGVjdHMgdGhhdCBkZXZpY2UgaXMgcmVhZHksCiAJICogaXQgc2VlbXMgdG8gdGFrZSBhIHdoaWxlIGZvciBsaW5rIHRvIGJlIGZ1bGx5CkBAIC0yMDc3LDkgKzIwODgsMTAgQEAKIAkJcmVhZGwocG9ydF9tbWlvICsgRURNQV9FUlJfSVJRX01BU0tfT0ZTKSk7CiB9CiAKLXN0YXRpYyBpbnQgbXZfY2hpcF9pZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IG12X2hvc3RfcHJpdiAqaHByaXYsCi0JCSAgICAgIHVuc2lnbmVkIGludCBib2FyZF9pZHgpCitzdGF0aWMgaW50IG12X2NoaXBfaWQoc3RydWN0IGF0YV9ob3N0ICpob3N0LCB1bnNpZ25lZCBpbnQgYm9hcmRfaWR4KQogeworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2Rldihob3N0LT5kZXYpOworCXN0cnVjdCBtdl9ob3N0X3ByaXYgKmhwcml2ID0gaG9zdC0+cHJpdmF0ZV9kYXRhOwogCXU4IHJldl9pZDsKIAl1MzIgaHBfZmxhZ3MgPSBocHJpdi0+aHBfZmxhZ3M7CiAKQEAgLTIxNzcsOCArMjE4OSw4IEBACiAKIC8qKgogICogICAgICBtdl9pbml0X2hvc3QgLSBQZXJmb3JtIHNvbWUgZWFybHkgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGhvc3QuCi0gKglAcGRldjogaG9zdCBQQ0kgZGV2aWNlCi0gKiAgICAgIEBwcm9iZV9lbnQ6IGVhcmx5IGRhdGEgc3RydWN0IHJlcHJlc2VudGluZyB0aGUgaG9zdAorICoJQGhvc3Q6IEFUQSBob3N0IHRvIGluaXRpYWxpemUKKyAqICAgICAgQGJvYXJkX2lkeDogY29udHJvbGxlciBpbmRleAogICoKICAqICAgICAgSWYgcG9zc2libGUsIGRvIGFuIGVhcmx5IGdsb2JhbCByZXNldCBvZiB0aGUgaG9zdC4gIFRoZW4gZG8KICAqICAgICAgb3VyIHBvcnQgaW5pdCBhbmQgY2xlYXIvdW5tYXNrIGFsbC9yZWxldmFudCBob3N0IGludGVycnVwdHMuCkBAIC0yMTg2LDI0ICsyMTk4LDIzIEBACiAgKiAgICAgIExPQ0tJTkc6CiAgKiAgICAgIEluaGVyaXRlZCBmcm9tIGNhbGxlci4KICAqLwotc3RhdGljIGludCBtdl9pbml0X2hvc3Qoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCBhdGFfcHJvYmVfZW50ICpwcm9iZV9lbnQsCi0JCQl1bnNpZ25lZCBpbnQgYm9hcmRfaWR4KQorc3RhdGljIGludCBtdl9pbml0X2hvc3Qoc3RydWN0IGF0YV9ob3N0ICpob3N0LCB1bnNpZ25lZCBpbnQgYm9hcmRfaWR4KQogewogCWludCByYyA9IDAsIG5faGMsIHBvcnQsIGhjOwotCXZvaWQgX19pb21lbSAqbW1pbyA9IHByb2JlX2VudC0+aW9tYXBbTVZfUFJJTUFSWV9CQVJdOwotCXN0cnVjdCBtdl9ob3N0X3ByaXYgKmhwcml2ID0gcHJvYmVfZW50LT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGhvc3QtPmRldik7CisJdm9pZCBfX2lvbWVtICptbWlvID0gaG9zdC0+aW9tYXBbTVZfUFJJTUFSWV9CQVJdOworCXN0cnVjdCBtdl9ob3N0X3ByaXYgKmhwcml2ID0gaG9zdC0+cHJpdmF0ZV9kYXRhOwogCiAJLyogZ2xvYmFsIGludGVycnVwdCBtYXNrICovCiAJd3JpdGVsKDAsIG1taW8gKyBIQ19NQUlOX0lSUV9NQVNLX09GUyk7CiAKLQlyYyA9IG12X2NoaXBfaWQocGRldiwgaHByaXYsIGJvYXJkX2lkeCk7CisJcmMgPSBtdl9jaGlwX2lkKGhvc3QsIGJvYXJkX2lkeCk7CiAJaWYgKHJjKQogCQlnb3RvIGRvbmU7CiAKLQluX2hjID0gbXZfZ2V0X2hjX2NvdW50KHByb2JlX2VudC0+cG9ydF9mbGFncyk7Ci0JcHJvYmVfZW50LT5uX3BvcnRzID0gTVZfUE9SVFNfUEVSX0hDICogbl9oYzsKKwluX2hjID0gbXZfZ2V0X2hjX2NvdW50KGhvc3QtPnBvcnRzWzBdLT5mbGFncyk7CiAKLQlmb3IgKHBvcnQgPSAwOyBwb3J0IDwgcHJvYmVfZW50LT5uX3BvcnRzOyBwb3J0KyspCisJZm9yIChwb3J0ID0gMDsgcG9ydCA8IGhvc3QtPm5fcG9ydHM7IHBvcnQrKykKIAkJaHByaXYtPm9wcy0+cmVhZF9wcmVhbXAoaHByaXYsIHBvcnQsIG1taW8pOwogCiAJcmMgPSBocHJpdi0+b3BzLT5yZXNldF9oYyhocHJpdiwgbW1pbywgbl9oYyk7CkBAIC0yMjE0LDcgKzIyMjUsNyBAQAogCWhwcml2LT5vcHMtPnJlc2V0X2J1cyhwZGV2LCBtbWlvKTsKIAlocHJpdi0+b3BzLT5lbmFibGVfbGVkcyhocHJpdiwgbW1pbyk7CiAKLQlmb3IgKHBvcnQgPSAwOyBwb3J0IDwgcHJvYmVfZW50LT5uX3BvcnRzOyBwb3J0KyspIHsKKwlmb3IgKHBvcnQgPSAwOyBwb3J0IDwgaG9zdC0+bl9wb3J0czsgcG9ydCsrKSB7CiAJCWlmIChJU182MFhYKGhwcml2KSkgewogCQkJdm9pZCBfX2lvbWVtICpwb3J0X21taW8gPSBtdl9wb3J0X2Jhc2UobW1pbywgcG9ydCk7CiAKQEAgLTIyMjcsOSArMjIzOCw5IEBACiAJCWhwcml2LT5vcHMtPnBoeV9lcnJhdGEoaHByaXYsIG1taW8sIHBvcnQpOwogCX0KIAotCWZvciAocG9ydCA9IDA7IHBvcnQgPCBwcm9iZV9lbnQtPm5fcG9ydHM7IHBvcnQrKykgeworCWZvciAocG9ydCA9IDA7IHBvcnQgPCBob3N0LT5uX3BvcnRzOyBwb3J0KyspIHsKIAkJdm9pZCBfX2lvbWVtICpwb3J0X21taW8gPSBtdl9wb3J0X2Jhc2UobW1pbywgcG9ydCk7Ci0JCW12X3BvcnRfaW5pdCgmcHJvYmVfZW50LT5wb3J0W3BvcnRdLCBwb3J0X21taW8pOworCQltdl9wb3J0X2luaXQoJmhvc3QtPnBvcnRzW3BvcnRdLT5pb2FkZHIsIHBvcnRfbW1pbyk7CiAJfQogCiAJZm9yIChoYyA9IDA7IGhjIDwgbl9oYzsgaGMrKykgewpAQCAtMjI2OCwxNyArMjI3OSwxNyBAQAogCiAvKioKICAqICAgICAgbXZfcHJpbnRfaW5mbyAtIER1bXAga2V5IGluZm8gdG8ga2VybmVsIGxvZyBmb3IgcGVydXNhbC4KLSAqICAgICAgQHByb2JlX2VudDogZWFybHkgZGF0YSBzdHJ1Y3QgcmVwcmVzZW50aW5nIHRoZSBob3N0CisgKiAgICAgIEBob3N0OiBBVEEgaG9zdCB0byBwcmludCBpbmZvIGFib3V0CiAgKgogICogICAgICBGSVhNRTogY29tcGxldGUgdGhpcy4KICAqCiAgKiAgICAgIExPQ0tJTkc6CiAgKiAgICAgIEluaGVyaXRlZCBmcm9tIGNhbGxlci4KICAqLwotc3RhdGljIHZvaWQgbXZfcHJpbnRfaW5mbyhzdHJ1Y3QgYXRhX3Byb2JlX2VudCAqcHJvYmVfZW50KQorc3RhdGljIHZvaWQgbXZfcHJpbnRfaW5mbyhzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QpCiB7Ci0Jc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KHByb2JlX2VudC0+ZGV2KTsKLQlzdHJ1Y3QgbXZfaG9zdF9wcml2ICpocHJpdiA9IHByb2JlX2VudC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2Rldihob3N0LT5kZXYpOworCXN0cnVjdCBtdl9ob3N0X3ByaXYgKmhwcml2ID0gaG9zdC0+cHJpdmF0ZV9kYXRhOwogCXU4IHJldl9pZCwgc2NjOwogCWNvbnN0IGNoYXIgKnNjY19zOwogCkBAIC0yMjk3LDcgKzIzMDgsNyBAQAogCiAJZGV2X3ByaW50ayhLRVJOX0lORk8sICZwZGV2LT5kZXYsCiAJICAgICAgICIldSBzbG90cyAldSBwb3J0cyAlcyBtb2RlIElSUSB2aWEgJXNcbiIsCi0JICAgICAgICh1bnNpZ25lZClNVl9NQVhfUV9ERVBUSCwgcHJvYmVfZW50LT5uX3BvcnRzLAorCSAgICAgICAodW5zaWduZWQpTVZfTUFYX1FfREVQVEgsIGhvc3QtPm5fcG9ydHMsCiAJICAgICAgIHNjY19zLCAoTVZfSFBfRkxBR19NU0kgJiBocHJpdi0+aHBfZmxhZ3MpID8gIk1TSSIgOiAiSU5UeCIpOwogfQogCkBAIC0yMzEyLDUwICsyMzIzLDQyIEBACiBzdGF0aWMgaW50IG12X2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQogewogCXN0YXRpYyBpbnQgcHJpbnRlZF92ZXJzaW9uID0gMDsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OwotCXN0cnVjdCBhdGFfcHJvYmVfZW50ICpwcm9iZV9lbnQ7Ci0Jc3RydWN0IG12X2hvc3RfcHJpdiAqaHByaXY7CiAJdW5zaWduZWQgaW50IGJvYXJkX2lkeCA9ICh1bnNpZ25lZCBpbnQpZW50LT5kcml2ZXJfZGF0YTsKLQlpbnQgcmM7CisJY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gKnBwaVtdID0geyAmbXZfcG9ydF9pbmZvW2JvYXJkX2lkeF0sIE5VTEwgfTsKKwlzdHJ1Y3QgYXRhX2hvc3QgKmhvc3Q7CisJc3RydWN0IG12X2hvc3RfcHJpdiAqaHByaXY7CisJaW50IG5fcG9ydHMsIHJjOwogCiAJaWYgKCFwcmludGVkX3ZlcnNpb24rKykKIAkJZGV2X3ByaW50ayhLRVJOX0lORk8sICZwZGV2LT5kZXYsICJ2ZXJzaW9uICIgRFJWX1ZFUlNJT04gIlxuIik7CiAKKwkvKiBhbGxvY2F0ZSBob3N0ICovCisJbl9wb3J0cyA9IG12X2dldF9oY19jb3VudChwcGlbMF0tPmZsYWdzKSAqIE1WX1BPUlRTX1BFUl9IQzsKKworCWhvc3QgPSBhdGFfaG9zdF9hbGxvY19waW5mbygmcGRldi0+ZGV2LCBwcGksIG5fcG9ydHMpOworCWhwcml2ID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqaHByaXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWhvc3QgfHwgIWhwcml2KQorCQlyZXR1cm4gLUVOT01FTTsKKwlob3N0LT5wcml2YXRlX2RhdGEgPSBocHJpdjsKKworCS8qIGFjcXVpcmUgcmVzb3VyY2VzICovCiAJcmMgPSBwY2ltX2VuYWJsZV9kZXZpY2UocGRldik7CiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7Ci0JcGNpX3NldF9tYXN0ZXIocGRldik7CiAKIAlyYyA9IHBjaW1faW9tYXBfcmVnaW9ucyhwZGV2LCAxIDw8IE1WX1BSSU1BUllfQkFSLCBEUlZfTkFNRSk7CiAJaWYgKHJjID09IC1FQlVTWSkKIAkJcGNpbV9waW5fZGV2aWNlKHBkZXYpOwogCWlmIChyYykKIAkJcmV0dXJuIHJjOworCWhvc3QtPmlvbWFwID0gcGNpbV9pb21hcF90YWJsZShwZGV2KTsKIAotCXByb2JlX2VudCA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqcHJvYmVfZW50KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHByb2JlX2VudCA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXByb2JlX2VudC0+ZGV2ID0gcGNpX2Rldl90b19kZXYocGRldik7Ci0JSU5JVF9MSVNUX0hFQUQoJnByb2JlX2VudC0+bm9kZSk7Ci0KLQlocHJpdiA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqaHByaXYpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWhwcml2KQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXByb2JlX2VudC0+c2h0ID0gbXZfcG9ydF9pbmZvW2JvYXJkX2lkeF0uc2h0OwotCXByb2JlX2VudC0+cG9ydF9mbGFncyA9IG12X3BvcnRfaW5mb1tib2FyZF9pZHhdLmZsYWdzOwotCXByb2JlX2VudC0+cGlvX21hc2sgPSBtdl9wb3J0X2luZm9bYm9hcmRfaWR4XS5waW9fbWFzazsKLQlwcm9iZV9lbnQtPnVkbWFfbWFzayA9IG12X3BvcnRfaW5mb1tib2FyZF9pZHhdLnVkbWFfbWFzazsKLQlwcm9iZV9lbnQtPnBvcnRfb3BzID0gbXZfcG9ydF9pbmZvW2JvYXJkX2lkeF0ucG9ydF9vcHM7Ci0KLQlwcm9iZV9lbnQtPmlycSA9IHBkZXYtPmlycTsKLQlwcm9iZV9lbnQtPmlycV9mbGFncyA9IElSUUZfU0hBUkVEOwotCXByb2JlX2VudC0+aW9tYXAgPSBwY2ltX2lvbWFwX3RhYmxlKHBkZXYpOwotCXByb2JlX2VudC0+cHJpdmF0ZV9kYXRhID0gaHByaXY7CisJcmMgPSBwY2lfZ29fNjQocGRldik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CiAKIAkvKiBpbml0aWFsaXplIGFkYXB0ZXIgKi8KLQlyYyA9IG12X2luaXRfaG9zdChwZGV2LCBwcm9iZV9lbnQsIGJvYXJkX2lkeCk7CisJcmMgPSBtdl9pbml0X2hvc3QoaG9zdCwgYm9hcmRfaWR4KTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIApAQCAtMjM2NCwxMyArMjM2NywxMSBAQAogCQlwY2lfaW50eChwZGV2LCAxKTsKIAogCW12X2R1bXBfcGNpX2NmZyhwZGV2LCAweDY4KTsKLQltdl9wcmludF9pbmZvKHByb2JlX2VudCk7CisJbXZfcHJpbnRfaW5mbyhob3N0KTsKIAotCWlmIChhdGFfZGV2aWNlX2FkZChwcm9iZV9lbnQpID09IDApCi0JCXJldHVybiAtRU5PREVWOwotCi0JZGV2bV9rZnJlZShkZXYsIHByb2JlX2VudCk7Ci0JcmV0dXJuIDA7CisJcGNpX3NldF9tYXN0ZXIocGRldik7CisJcmV0dXJuIGF0YV9ob3N0X2FjdGl2YXRlKGhvc3QsIHBkZXYtPmlycSwgbXZfaW50ZXJydXB0LCBJUlFGX1NIQVJFRCwKKwkJCQkgJm12X3NodCk7CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IG12X2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3NhdGFfbnYuYyBiL2RyaXZlcnMvYXRhL3NhdGFfbnYuYwppbmRleCA5ZDk2NzBhLi4wMjE2OTc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9zYXRhX252LmMKKysrIGIvZHJpdmVycy9hdGEvc2F0YV9udi5jCkBAIC0yNjAsNiArMjYwLDcgQEAKIHN0YXRpYyB2b2lkIG52X2FkbWFfZXJyb3JfaGFuZGxlcihzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKIHN0YXRpYyB2b2lkIG52X2FkbWFfaG9zdF9zdG9wKHN0cnVjdCBhdGFfaG9zdCAqaG9zdCk7CiBzdGF0aWMgdm9pZCBudl9hZG1hX3Bvc3RfaW50ZXJuYWxfY21kKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpOworc3RhdGljIHZvaWQgbnZfYWRtYV90Zl9yZWFkKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfdGFza2ZpbGUgKnRmKTsKIAogZW51bSBudl9ob3N0X3R5cGUKIHsKQEAgLTM2OCw3ICszNjksNiBAQAogCS5lcnJvcl9oYW5kbGVyCQk9IG52X2Vycm9yX2hhbmRsZXIsCiAJLnBvc3RfaW50ZXJuYWxfY21kCT0gYXRhX2JtZG1hX3Bvc3RfaW50ZXJuYWxfY21kLAogCS5kYXRhX3hmZXIJCT0gYXRhX2RhdGFfeGZlciwKLQkuaXJxX2hhbmRsZXIJCT0gbnZfZ2VuZXJpY19pbnRlcnJ1cHQsCiAJLmlycV9jbGVhcgkJPSBhdGFfYm1kbWFfaXJxX2NsZWFyLAogCS5pcnFfb24JCQk9IGF0YV9pcnFfb24sCiAJLmlycV9hY2sJCT0gYXRhX2lycV9hY2ssCkBAIC0zOTUsNyArMzk1LDYgQEAKIAkuZXJyb3JfaGFuZGxlcgkJPSBudl9lcnJvcl9oYW5kbGVyLAogCS5wb3N0X2ludGVybmFsX2NtZAk9IGF0YV9ibWRtYV9wb3N0X2ludGVybmFsX2NtZCwKIAkuZGF0YV94ZmVyCQk9IGF0YV9kYXRhX3hmZXIsCi0JLmlycV9oYW5kbGVyCQk9IG52X25mMl9pbnRlcnJ1cHQsCiAJLmlycV9jbGVhcgkJPSBhdGFfYm1kbWFfaXJxX2NsZWFyLAogCS5pcnFfb24JCQk9IGF0YV9pcnFfb24sCiAJLmlycV9hY2sJCT0gYXRhX2lycV9hY2ssCkBAIC00MjIsNyArNDIxLDYgQEAKIAkuZXJyb3JfaGFuZGxlcgkJPSBudl9lcnJvcl9oYW5kbGVyLAogCS5wb3N0X2ludGVybmFsX2NtZAk9IGF0YV9ibWRtYV9wb3N0X2ludGVybmFsX2NtZCwKIAkuZGF0YV94ZmVyCQk9IGF0YV9kYXRhX3hmZXIsCi0JLmlycV9oYW5kbGVyCQk9IG52X2NrODA0X2ludGVycnVwdCwKIAkuaXJxX2NsZWFyCQk9IGF0YV9ibWRtYV9pcnFfY2xlYXIsCiAJLmlycV9vbgkJCT0gYXRhX2lycV9vbiwKIAkuaXJxX2FjawkJPSBhdGFfaXJxX2FjaywKQEAgLTQzNSw3ICs0MzMsNyBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIG52X2FkbWFfb3BzID0gewogCS5wb3J0X2Rpc2FibGUJCT0gYXRhX3BvcnRfZGlzYWJsZSwKIAkudGZfbG9hZAkJPSBhdGFfdGZfbG9hZCwKLQkudGZfcmVhZAkJPSBhdGFfdGZfcmVhZCwKKwkudGZfcmVhZAkJPSBudl9hZG1hX3RmX3JlYWQsCiAJLmNoZWNrX2F0YXBpX2RtYQk9IG52X2FkbWFfY2hlY2tfYXRhcGlfZG1hLAogCS5leGVjX2NvbW1hbmQJCT0gYXRhX2V4ZWNfY29tbWFuZCwKIAkuY2hlY2tfc3RhdHVzCQk9IGF0YV9jaGVja19zdGF0dXMsCkBAIC00NTEsNyArNDQ5LDYgQEAKIAkuZXJyb3JfaGFuZGxlcgkJPSBudl9hZG1hX2Vycm9yX2hhbmRsZXIsCiAJLnBvc3RfaW50ZXJuYWxfY21kCT0gbnZfYWRtYV9wb3N0X2ludGVybmFsX2NtZCwKIAkuZGF0YV94ZmVyCQk9IGF0YV9kYXRhX3hmZXIsCi0JLmlycV9oYW5kbGVyCQk9IG52X2FkbWFfaW50ZXJydXB0LAogCS5pcnFfY2xlYXIJCT0gbnZfYWRtYV9pcnFfY2xlYXIsCiAJLmlycV9vbgkJCT0gYXRhX2lycV9vbiwKIAkuaXJxX2FjawkJPSBhdGFfaXJxX2FjaywKQEAgLTQ3Niw2ICs0NzMsNyBAQAogCQkubXdkbWFfbWFzawk9IE5WX01XRE1BX01BU0ssCiAJCS51ZG1hX21hc2sJPSBOVl9VRE1BX01BU0ssCiAJCS5wb3J0X29wcwk9ICZudl9nZW5lcmljX29wcywKKwkJLmlycV9oYW5kbGVyCT0gbnZfZ2VuZXJpY19pbnRlcnJ1cHQsCiAJfSwKIAkvKiBuZm9yY2UyLzMgKi8KIAl7CkBAIC00ODYsNiArNDg0LDcgQEAKIAkJLm13ZG1hX21hc2sJPSBOVl9NV0RNQV9NQVNLLAogCQkudWRtYV9tYXNrCT0gTlZfVURNQV9NQVNLLAogCQkucG9ydF9vcHMJPSAmbnZfbmYyX29wcywKKwkJLmlycV9oYW5kbGVyCT0gbnZfbmYyX2ludGVycnVwdCwKIAl9LAogCS8qIGNrODA0ICovCiAJewpAQCAtNDk2LDYgKzQ5NSw3IEBACiAJCS5td2RtYV9tYXNrCT0gTlZfTVdETUFfTUFTSywKIAkJLnVkbWFfbWFzawk9IE5WX1VETUFfTUFTSywKIAkJLnBvcnRfb3BzCT0gJm52X2NrODA0X29wcywKKwkJLmlycV9oYW5kbGVyCT0gbnZfY2s4MDRfaW50ZXJydXB0LAogCX0sCiAJLyogQURNQSAqLwogCXsKQEAgLTUwNyw2ICs1MDcsNyBAQAogCQkubXdkbWFfbWFzawk9IE5WX01XRE1BX01BU0ssCiAJCS51ZG1hX21hc2sJPSBOVl9VRE1BX01BU0ssCiAJCS5wb3J0X29wcwk9ICZudl9hZG1hX29wcywKKwkJLmlycV9oYW5kbGVyCT0gbnZfYWRtYV9pbnRlcnJ1cHQsCiAJfSwKIH07CiAKQEAgLTY2Nyw2ICs2NjgsMTggQEAKIAlyZXR1cm4gIShwcC0+ZmxhZ3MgJiBOVl9BRE1BX0FUQVBJX1NFVFVQX0NPTVBMRVRFKTsKIH0KIAorc3RhdGljIHZvaWQgbnZfYWRtYV90Zl9yZWFkKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfdGFza2ZpbGUgKnRmKQoreworCS8qIFNpbmNlIGNvbW1hbmRzIHdoZXJlIGEgcmVzdWx0IFRGIGlzIHJlcXVlc3RlZCBhcmUgbm90CisJICAgZXhlY3V0ZWQgaW4gQURNQSBtb2RlLCB0aGUgb25seSB0aW1lIHRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQKKwkgICBpbiBBRE1BIG1vZGUgd2lsbCBiZSBpZiBhIGNvbW1hbmQgZmFpbHMuIEluIHRoaXMgY2FzZSB3ZQorCSAgIGRvbid0IGNhcmUgYWJvdXQgZ29pbmcgaW50byByZWdpc3RlciBtb2RlIHdpdGggQURNQSBjb21tYW5kcworCSAgIHBlbmRpbmcsIGFzIHRoZSBjb21tYW5kcyB3aWxsIGFsbCBzaG9ydGx5IGJlIGFib3J0ZWQgYW55d2F5LiAqLworCW52X2FkbWFfcmVnaXN0ZXJfbW9kZShhcCk7CisKKwlhdGFfdGZfcmVhZChhcCwgdGYpOworfQorCiBzdGF0aWMgdW5zaWduZWQgaW50IG52X2FkbWFfdGZfdG9fY3BiKHN0cnVjdCBhdGFfdGFza2ZpbGUgKnRmLCBfX2xlMTYgKmNwYikKIHsKIAl1bnNpZ25lZCBpbnQgaWR4ID0gMDsKQEAgLTczOCwxOSArNzUxLDExIEBACiAJCXJldHVybiAxOwogCX0KIAotCWlmIChmbGFncyAmIE5WX0NQQl9SRVNQX0RPTkUpIHsKKwlpZiAobGlrZWx5KGZsYWdzICYgTlZfQ1BCX1JFU1BfRE9ORSkpIHsKIAkJc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYyA9IGF0YV9xY19mcm9tX3RhZyhhcCwgY3BiX251bSk7CiAJCVZQUklOVEsoIkNQQiBmbGFncyBkb25lLCBmbGFncz0weCV4XG4iLCBmbGFncyk7CiAJCWlmIChsaWtlbHkocWMpKSB7Ci0JCQkvKiBHcmFiIHRoZSBBVEEgcG9ydCBzdGF0dXMgZm9yIG5vbi1OQ1EgY29tbWFuZHMuCi0JCQkgICBGb3IgTkNRIGNvbW1hbmRzIHRoZSBjdXJyZW50IHN0YXR1cyBtYXkgaGF2ZSBub3RoaW5nIHRvIGRvIHdpdGgKLQkJCSAgIHRoZSBjb21tYW5kIGp1c3QgY29tcGxldGVkLiAqLwotCQkJaWYgKHFjLT50Zi5wcm90b2NvbCAhPSBBVEFfUFJPVF9OQ1EpIHsKLQkJCQl1OCBhdGFfc3RhdHVzID0gcmVhZGIocHAtPmN0bF9ibG9jayArIChBVEFfUkVHX1NUQVRVUyAqIDQpKTsKLQkJCQlxYy0+ZXJyX21hc2sgfD0gYWNfZXJyX21hc2soYXRhX3N0YXR1cyk7Ci0JCQl9Ci0JCQlEUFJJTlRLKCJDb21wbGV0aW5nIHFjIGZyb20gdGFnICVkIHdpdGggZXJyX21hc2sgJXVcbiIsY3BiX251bSwKLQkJCQlxYy0+ZXJyX21hc2spOworCQkJRFBSSU5USygiQ29tcGxldGluZyBxYyBmcm9tIHRhZyAlZFxuIixjcGJfbnVtKTsKIAkJCWF0YV9xY19jb21wbGV0ZShxYyk7CiAJCX0gZWxzZSB7CiAJCQlzdHJ1Y3QgYXRhX2VoX2luZm8gKmVoaSA9ICZhcC0+ZWhfaW5mbzsKQEAgLTEwNzQsMTQgKzEwNzksMTQgQEAKIH0KICNlbmRpZgogCi1zdGF0aWMgdm9pZCBudl9hZG1hX3NldHVwX3BvcnQoc3RydWN0IGF0YV9wcm9iZV9lbnQgKnByb2JlX2VudCwgdW5zaWduZWQgaW50IHBvcnQpCitzdGF0aWMgdm9pZCBudl9hZG1hX3NldHVwX3BvcnQoc3RydWN0IGF0YV9wb3J0ICphcCkKIHsKLQl2b2lkIF9faW9tZW0gKm1taW8gPSBwcm9iZV9lbnQtPmlvbWFwW05WX01NSU9fQkFSXTsKLQlzdHJ1Y3QgYXRhX2lvcG9ydHMgKmlvcG9ydCA9ICZwcm9iZV9lbnQtPnBvcnRbcG9ydF07CisJdm9pZCBfX2lvbWVtICptbWlvID0gYXAtPmhvc3QtPmlvbWFwW05WX01NSU9fQkFSXTsKKwlzdHJ1Y3QgYXRhX2lvcG9ydHMgKmlvcG9ydCA9ICZhcC0+aW9hZGRyOwogCiAJVlBSSU5USygiRU5URVJcbiIpOwogCi0JbW1pbyArPSBOVl9BRE1BX1BPUlQgKyBwb3J0ICogTlZfQURNQV9QT1JUX1NJWkU7CisJbW1pbyArPSBOVl9BRE1BX1BPUlQgKyBhcC0+cG9ydF9ubyAqIE5WX0FETUFfUE9SVF9TSVpFOwogCiAJaW9wb3J0LT5jbWRfYWRkcgk9IG1taW87CiAJaW9wb3J0LT5kYXRhX2FkZHIJPSBtbWlvICsgKEFUQV9SRUdfREFUQSAqIDQpOwpAQCAtMTA5OCw5ICsxMTAzLDkgQEAKIAlpb3BvcnQtPmN0bF9hZGRyCT0gbW1pbyArIDB4MjA7CiB9CiAKLXN0YXRpYyBpbnQgbnZfYWRtYV9ob3N0X2luaXQoc3RydWN0IGF0YV9wcm9iZV9lbnQgKnByb2JlX2VudCkKK3N0YXRpYyBpbnQgbnZfYWRtYV9ob3N0X2luaXQoc3RydWN0IGF0YV9ob3N0ICpob3N0KQogewotCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2Rldihwcm9iZV9lbnQtPmRldik7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGhvc3QtPmRldik7CiAJdW5zaWduZWQgaW50IGk7CiAJdTMyIHRtcDMyOwogCkBAIC0xMTE1LDggKzExMjAsOCBAQAogCiAJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCBOVl9NQ1BfU0FUQV9DRkdfMjAsIHRtcDMyKTsKIAotCWZvciAoaSA9IDA7IGkgPCBwcm9iZV9lbnQtPm5fcG9ydHM7IGkrKykKLQkJbnZfYWRtYV9zZXR1cF9wb3J0KHByb2JlX2VudCwgaSk7CisJZm9yIChpID0gMDsgaSA8IGhvc3QtPm5fcG9ydHM7IGkrKykKKwkJbnZfYWRtYV9zZXR1cF9wb3J0KGhvc3QtPnBvcnRzW2ldKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTE2Nyw5ICsxMTcyLDExIEBACiAJc3RydWN0IG52X2FkbWFfcG9ydF9wcml2ICpwcCA9IHFjLT5hcC0+cHJpdmF0ZV9kYXRhOwogCiAJLyogQURNQSBlbmdpbmUgY2FuIG9ubHkgYmUgdXNlZCBmb3Igbm9uLUFUQVBJIERNQSBjb21tYW5kcywKLQkgICBvciBpbnRlcnJ1cHQtZHJpdmVuIG5vLWRhdGEgY29tbWFuZHMuICovCisJICAgb3IgaW50ZXJydXB0LWRyaXZlbiBuby1kYXRhIGNvbW1hbmRzLCB3aGVyZSBhIHJlc3VsdCB0YXNrZmlsZQorCSAgIGlzIG5vdCByZXF1aXJlZC4gKi8KIAlpZigocHAtPmZsYWdzICYgTlZfQURNQV9BVEFQSV9TRVRVUF9DT01QTEVURSkgfHwKLQkgICAocWMtPnRmLmZsYWdzICYgQVRBX1RGTEFHX1BPTExJTkcpKQorCSAgIChxYy0+dGYuZmxhZ3MgJiBBVEFfVEZMQUdfUE9MTElORykgfHwKKwkgICAocWMtPmZsYWdzICYgQVRBX1FDRkxBR19SRVNVTFRfVEYpKQogCQlyZXR1cm4gMTsKIAogCWlmKChxYy0+ZmxhZ3MgJiBBVEFfUUNGTEFHX0RNQU1BUCkgfHwKQEAgLTE0NzMsMTQgKzE0ODAsMTMgQEAKIHN0YXRpYyBpbnQgbnZfaW5pdF9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQogewogCXN0YXRpYyBpbnQgcHJpbnRlZF92ZXJzaW9uID0gMDsKLQlzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqcHBpWzJdOwotCXN0cnVjdCBhdGFfcHJvYmVfZW50ICpwcm9iZV9lbnQ7CisJY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gKnBwaVsyXTsKKwlzdHJ1Y3QgYXRhX2hvc3QgKmhvc3Q7CiAJc3RydWN0IG52X2hvc3RfcHJpdiAqaHByaXY7CiAJaW50IHJjOwogCXUzMiBiYXI7CiAJdm9pZCBfX2lvbWVtICpiYXNlOwogCXVuc2lnbmVkIGxvbmcgdHlwZSA9IGVudC0+ZHJpdmVyX2RhdGE7Ci0JaW50IG1hc2tfc2V0ID0gMDsKIAogICAgICAgICAvLyBNYWtlIHN1cmUgdGhpcyBpcyBhIFNBVEEgY29udHJvbGxlciBieSBjb3VudGluZyB0aGUgbnVtYmVyIG9mIGJhcnMKICAgICAgICAgLy8gKE5WSURJQSBTQVRBIGNvbnRyb2xsZXJzIHdpbGwgYWx3YXlzIGhhdmUgc2l4IGJhcnMpLiAgT3RoZXJ3aXNlLApAQCAtMTQ5Niw1MCArMTUwMiwzOCBAQAogCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCi0JcmMgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIERSVl9OQU1FKTsKLQlpZiAocmMpIHsKLQkJcGNpbV9waW5fZGV2aWNlKHBkZXYpOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JaWYodHlwZSA+PSBDSzgwNCAmJiBhZG1hX2VuYWJsZWQpIHsKKwkvKiBkZXRlcm1pbmUgdHlwZSBhbmQgYWxsb2NhdGUgaG9zdCAqLworCWlmICh0eXBlID49IENLODA0ICYmIGFkbWFfZW5hYmxlZCkgewogCQlkZXZfcHJpbnRrKEtFUk5fTk9USUNFLCAmcGRldi0+ZGV2LCAiVXNpbmcgQURNQSBtb2RlXG4iKTsKIAkJdHlwZSA9IEFETUE7Ci0JCWlmKCFwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV82NEJJVF9NQVNLKSAmJgotCQkgICAhcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV82NEJJVF9NQVNLKSkKLQkJCW1hc2tfc2V0ID0gMTsKIAl9CiAKLQlpZighbWFza19zZXQpIHsKLQkJcmMgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIEFUQV9ETUFfTUFTSyk7Ci0JCWlmIChyYykKLQkJCXJldHVybiByYzsKLQkJcmMgPSBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgQVRBX0RNQV9NQVNLKTsKLQkJaWYgKHJjKQotCQkJcmV0dXJuIHJjOwotCX0KLQotCXJjID0gLUVOT01FTTsKKwlwcGlbMF0gPSBwcGlbMV0gPSAmbnZfcG9ydF9pbmZvW3R5cGVdOworCXJjID0gYXRhX3BjaV9wcmVwYXJlX25hdGl2ZV9ob3N0KHBkZXYsIHBwaSwgMiwgJmhvc3QpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOwogCiAJaHByaXYgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpocHJpdiksIEdGUF9LRVJORUwpOwogCWlmICghaHByaXYpCiAJCXJldHVybiAtRU5PTUVNOwotCi0JcHBpWzBdID0gcHBpWzFdID0gJm52X3BvcnRfaW5mb1t0eXBlXTsKLQlwcm9iZV9lbnQgPSBhdGFfcGNpX2luaXRfbmF0aXZlX21vZGUocGRldiwgcHBpLCBBVEFfUE9SVF9QUklNQVJZIHwgQVRBX1BPUlRfU0VDT05EQVJZKTsKLQlpZiAoIXByb2JlX2VudCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlpZiAoIXBjaW1faW9tYXAocGRldiwgTlZfTU1JT19CQVIsIDApKQotCQlyZXR1cm4gLUVJTzsKLQlwcm9iZV9lbnQtPmlvbWFwID0gcGNpbV9pb21hcF90YWJsZShwZGV2KTsKLQotCXByb2JlX2VudC0+cHJpdmF0ZV9kYXRhID0gaHByaXY7CiAJaHByaXYtPnR5cGUgPSB0eXBlOworCWhvc3QtPnByaXZhdGVfZGF0YSA9IGhwcml2OwogCi0JYmFzZSA9IHByb2JlX2VudC0+aW9tYXBbTlZfTU1JT19CQVJdOwotCXByb2JlX2VudC0+cG9ydFswXS5zY3JfYWRkciA9IGJhc2UgKyBOVl9QT1JUMF9TQ1JfUkVHX09GRlNFVDsKLQlwcm9iZV9lbnQtPnBvcnRbMV0uc2NyX2FkZHIgPSBiYXNlICsgTlZfUE9SVDFfU0NSX1JFR19PRkZTRVQ7CisJLyogc2V0IDY0Yml0IGRtYSBtYXNrcywgbWF5IGZhaWwgKi8KKwlpZiAodHlwZSA9PSBBRE1BKSB7CisJCWlmIChwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV82NEJJVF9NQVNLKSA9PSAwKQorCQkJcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV82NEJJVF9NQVNLKTsKKwl9CisKKwkvKiByZXF1ZXN0IGFuZCBpb21hcCBOVl9NTUlPX0JBUiAqLworCXJjID0gcGNpbV9pb21hcF9yZWdpb25zKHBkZXYsIDEgPDwgTlZfTU1JT19CQVIsIERSVl9OQU1FKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCS8qIGNvbmZpZ3VyZSBTQ1IgYWNjZXNzICovCisJYmFzZSA9IGhvc3QtPmlvbWFwW05WX01NSU9fQkFSXTsKKwlob3N0LT5wb3J0c1swXS0+aW9hZGRyLnNjcl9hZGRyID0gYmFzZSArIE5WX1BPUlQwX1NDUl9SRUdfT0ZGU0VUOworCWhvc3QtPnBvcnRzWzFdLT5pb2FkZHIuc2NyX2FkZHIgPSBiYXNlICsgTlZfUE9SVDFfU0NSX1JFR19PRkZTRVQ7CiAKIAkvKiBlbmFibGUgU0FUQSBzcGFjZSBmb3IgQ0s4MDQgKi8KIAlpZiAodHlwZSA+PSBDSzgwNCkgewpAQCAtMTU1MCwyMCArMTU0NCwxNiBAQAogCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgTlZfTUNQX1NBVEFfQ0ZHXzIwLCByZWd2YWwpOwogCX0KIAotCXBjaV9zZXRfbWFzdGVyKHBkZXYpOwotCisJLyogaW5pdCBBRE1BICovCiAJaWYgKHR5cGUgPT0gQURNQSkgewotCQlyYyA9IG52X2FkbWFfaG9zdF9pbml0KHByb2JlX2VudCk7CisJCXJjID0gbnZfYWRtYV9ob3N0X2luaXQoaG9zdCk7CiAJCWlmIChyYykKIAkJCXJldHVybiByYzsKIAl9CiAKLQlyYyA9IGF0YV9kZXZpY2VfYWRkKHByb2JlX2VudCk7Ci0JaWYgKHJjICE9IE5WX1BPUlRTKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCWRldm1fa2ZyZWUoJnBkZXYtPmRldiwgcHJvYmVfZW50KTsKLQlyZXR1cm4gMDsKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKwlyZXR1cm4gYXRhX2hvc3RfYWN0aXZhdGUoaG9zdCwgcGRldi0+aXJxLCBwcGlbMF0tPmlycV9oYW5kbGVyLAorCQkJCSBJUlFGX1NIQVJFRCwgcHBpWzBdLT5zaHQpOwogfQogCiBzdGF0aWMgdm9pZCBudl9yZW1vdmVfb25lIChzdHJ1Y3QgcGNpX2RldiAqcGRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3NhdGFfcHJvbWlzZS5jIGIvZHJpdmVycy9hdGEvc2F0YV9wcm9taXNlLmMKaW5kZXggMjMzOTgxMy4uZjU2NTQ5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvc2F0YV9wcm9taXNlLmMKKysrIGIvZHJpdmVycy9hdGEvc2F0YV9wcm9taXNlLmMKQEAgLTQ1LDEwICs0NSwxMSBAQAogI2luY2x1ZGUgInNhdGFfcHJvbWlzZS5oIgogCiAjZGVmaW5lIERSVl9OQU1FCSJzYXRhX3Byb21pc2UiCi0jZGVmaW5lIERSVl9WRVJTSU9OCSIyLjAwIgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMi4wNSIKIAogCiBlbnVtIHsKKwlQRENfTUFYX1BPUlRTCQk9IDQsCiAJUERDX01NSU9fQkFSCQk9IDMsCiAKIAkvKiByZWdpc3RlciBvZmZzZXRzICovCkBAIC03MCwxNCArNzEsMzEgQEAKIAlQRENfVEJHX01PREUJCT0gMHg0MUMsIC8qIFRCRyBtb2RlIChub3QgU0FUQUlJKSAqLwogCVBEQ19TTEVXX0NUTAkJPSAweDQ3MCwgLyogc2xldyByYXRlIGNvbnRyb2wgcmVnIChub3QgU0FUQUlJKSAqLwogCi0JUERDX0VSUl9NQVNLCQk9ICgxPDwxOSkgfCAoMTw8MjApIHwgKDE8PDIxKSB8ICgxPDwyMikgfAotCQkJCSAgKDE8PDgpIHwgKDE8PDkpIHwgKDE8PDEwKSwKKwkvKiBQRENfR0xPQkFMX0NUTCBiaXQgZGVmaW5pdGlvbnMgKi8KKwlQRENfUEhfRVJSCQk9ICgxIDw8ICA4KSwgLyogUENJIGVycm9yIHdoaWxlIGxvYWRpbmcgcGFja2V0ICovCisJUERDX1NIX0VSUgkJPSAoMSA8PCAgOSksIC8qIFBDSSBlcnJvciB3aGlsZSBsb2FkaW5nIFMvRyB0YWJsZSAqLworCVBEQ19ESF9FUlIJCT0gKDEgPDwgMTApLCAvKiBQQ0kgZXJyb3Igd2hpbGUgbG9hZGluZyBkYXRhICovCisJUERDMl9IVE9fRVJSCQk9ICgxIDw8IDEyKSwgLyogaG9zdCBidXMgdGltZW91dCAqLworCVBEQzJfQVRBX0hCQV9FUlIJPSAoMSA8PCAxMyksIC8qIGVycm9yIGR1cmluZyBTQVRBIERBVEEgRklTIHRyYW5zbWlzc2lvbiAqLworCVBEQzJfQVRBX0RNQV9DTlRfRVJSCT0gKDEgPDwgMTQpLCAvKiBETUEgREFUQSBGSVMgc2l6ZSBkaWZmZXJzIGZyb20gUy9HIGNvdW50ICovCisJUERDX09WRVJSVU5fRVJSCQk9ICgxIDw8IDE5KSwgLyogUy9HIGJ5dGUgY291bnQgbGFyZ2VyIHRoYW4gSEQgcmVxdWlyZXMgKi8KKwlQRENfVU5ERVJSVU5fRVJSCT0gKDEgPDwgMjApLCAvKiBTL0cgYnl0ZSBjb3VudCBsZXNzIHRoYW4gSEQgcmVxdWlyZXMgKi8KKwlQRENfRFJJVkVfRVJSCQk9ICgxIDw8IDIxKSwgLyogZHJpdmUgZXJyb3IgKi8KKwlQRENfUENJX1NZU19FUlIJCT0gKDEgPDwgMjIpLCAvKiBQQ0kgc3lzdGVtIGVycm9yICovCisJUERDMV9QQ0lfUEFSSVRZX0VSUgk9ICgxIDw8IDIzKSwgLyogUENJIHBhcml0eSBlcnJvciAoZnJvbSBTQVRBMTUwIGRyaXZlcikgKi8KKwlQREMxX0VSUl9NQVNLCQk9IFBEQzFfUENJX1BBUklUWV9FUlIsCisJUERDMl9FUlJfTUFTSwkJPSBQREMyX0hUT19FUlIgfCBQREMyX0FUQV9IQkFfRVJSIHwgUERDMl9BVEFfRE1BX0NOVF9FUlIsCisJUERDX0VSUl9NQVNLCQk9IChQRENfUEhfRVJSIHwgUERDX1NIX0VSUiB8IFBEQ19ESF9FUlIgfCBQRENfT1ZFUlJVTl9FUlIKKwkJCQkgICB8IFBEQ19VTkRFUlJVTl9FUlIgfCBQRENfRFJJVkVfRVJSIHwgUERDX1BDSV9TWVNfRVJSCisJCQkJICAgfCBQREMxX0VSUl9NQVNLIHwgUERDMl9FUlJfTUFTSyksCiAKIAlib2FyZF8yMDM3eAkJPSAwLAkvKiBGYXN0VHJhayBTMTUwIFRYMnBsdXMgKi8KLQlib2FyZF8yMDMxOQkJPSAxLAkvKiBGYXN0VHJhayBTMTUwIFRYNCAqLwotCWJvYXJkXzIwNjE5CQk9IDIsCS8qIEZhc3RUcmFrIFRYNDAwMCAqLwotCWJvYXJkXzIwNTd4CQk9IDMsCS8qIFNBVEFJSTE1MCBUeDJwbHVzICovCi0JYm9hcmRfNDA1MTgJCT0gNCwJLyogU0FUQUlJMTUwIFR4NCAqLworCWJvYXJkXzIwMzd4X3BhdGEJPSAxLAkvKiBGYXN0VHJhayBTMTUwIFRYMnBsdXMgUEFUQSBwb3J0ICovCisJYm9hcmRfMjAzMTkJCT0gMiwJLyogRmFzdFRyYWsgUzE1MCBUWDQgKi8KKwlib2FyZF8yMDYxOQkJPSAzLAkvKiBGYXN0VHJhayBUWDQwMDAgKi8KKwlib2FyZF8yMDU3eAkJPSA0LAkvKiBTQVRBSUkxNTAgVHgycGx1cyAqLworCWJvYXJkXzIwNTd4X3BhdGEJPSA1LAkvKiBTQVRBSUkxNTAgVHgycGx1cyAqLworCWJvYXJkXzQwNTE4CQk9IDYsCS8qIFNBVEFJSTE1MCBUeDQgKi8KIAogCVBEQ19IQVNfUEFUQQkJPSAoMSA8PCAxKSwgLyogUERDMjAzNzUvMjA1NzUgaGFzIFBBVEEgKi8KIApAQCAtMTAwLDggKzExOCwxMCBAQAogCQkJCSAgQVRBX0ZMQUdfTU1JTyB8CiAJCQkJICBBVEFfRkxBR19QSU9fUE9MTElORywKIAotCS8qIGhwLT5mbGFncyBiaXRzICovCi0JUERDX0ZMQUdfR0VOX0lJCQk9ICgxIDw8IDApLAorCS8qIGFwLT5mbGFncyBiaXRzICovCisJUERDX0ZMQUdfR0VOX0lJCQk9ICgxIDw8IDI0KSwKKwlQRENfRkxBR19TQVRBX1BBVEEJPSAoMSA8PCAyNSksIC8qIHN1cHBvcnRzIFNBVEEgKyBQQVRBICovCisJUERDX0ZMQUdfNF9QT1JUUwk9ICgxIDw8IDI2KSwgLyogNCBwb3J0cyAqLwogfTsKIAogCkBAIC0xMTAsMjggKzEzMCwyNSBAQAogCWRtYV9hZGRyX3QJCXBrdF9kbWE7CiB9OwogCi1zdHJ1Y3QgcGRjX2hvc3RfcHJpdiB7Ci0JdW5zaWduZWQgbG9uZwkJZmxhZ3M7Ci0JdW5zaWduZWQgbG9uZwkJcG9ydF9mbGFnc1tBVEFfTUFYX1BPUlRTXTsKLX07Ci0KIHN0YXRpYyB1MzIgcGRjX3NhdGFfc2NyX3JlYWQgKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCBzY19yZWcpOwogc3RhdGljIHZvaWQgcGRjX3NhdGFfc2NyX3dyaXRlIChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgc2NfcmVnLCB1MzIgdmFsKTsKIHN0YXRpYyBpbnQgcGRjX2F0YV9pbml0X29uZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpOwotc3RhdGljIGlycXJldHVybl90IHBkY19pbnRlcnJ1cHQgKGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSk7Ci1zdGF0aWMgaW50IHBkY19wb3J0X3N0YXJ0KHN0cnVjdCBhdGFfcG9ydCAqYXApOworc3RhdGljIGludCBwZGNfY29tbW9uX3BvcnRfc3RhcnQoc3RydWN0IGF0YV9wb3J0ICphcCk7CitzdGF0aWMgaW50IHBkY19zYXRhX3BvcnRfc3RhcnQoc3RydWN0IGF0YV9wb3J0ICphcCk7CiBzdGF0aWMgdm9pZCBwZGNfcWNfcHJlcChzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKTsKIHN0YXRpYyB2b2lkIHBkY190Zl9sb2FkX21taW8oc3RydWN0IGF0YV9wb3J0ICphcCwgY29uc3Qgc3RydWN0IGF0YV90YXNrZmlsZSAqdGYpOwogc3RhdGljIHZvaWQgcGRjX2V4ZWNfY29tbWFuZF9tbWlvKHN0cnVjdCBhdGFfcG9ydCAqYXAsIGNvbnN0IHN0cnVjdCBhdGFfdGFza2ZpbGUgKnRmKTsKIHN0YXRpYyBpbnQgcGRjX2NoZWNrX2F0YXBpX2RtYShzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKTsKLXN0YXRpYyBpbnQgcGRjX29sZF9jaGVja19hdGFwaV9kbWEoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYyk7CitzdGF0aWMgaW50IHBkY19vbGRfc2F0YV9jaGVja19hdGFwaV9kbWEoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYyk7CiBzdGF0aWMgdm9pZCBwZGNfaXJxX2NsZWFyKHN0cnVjdCBhdGFfcG9ydCAqYXApOwogc3RhdGljIHVuc2lnbmVkIGludCBwZGNfcWNfaXNzdWVfcHJvdChzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKTsKIHN0YXRpYyB2b2lkIHBkY19mcmVlemUoc3RydWN0IGF0YV9wb3J0ICphcCk7CiBzdGF0aWMgdm9pZCBwZGNfdGhhdyhzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKLXN0YXRpYyB2b2lkIHBkY19lcnJvcl9oYW5kbGVyKHN0cnVjdCBhdGFfcG9ydCAqYXApOworc3RhdGljIHZvaWQgcGRjX3BhdGFfZXJyb3JfaGFuZGxlcihzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKK3N0YXRpYyB2b2lkIHBkY19zYXRhX2Vycm9yX2hhbmRsZXIoc3RydWN0IGF0YV9wb3J0ICphcCk7CiBzdGF0aWMgdm9pZCBwZGNfcG9zdF9pbnRlcm5hbF9jbWQoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYyk7Ci0KK3N0YXRpYyBpbnQgcGRjX3BhdGFfY2FibGVfZGV0ZWN0KHN0cnVjdCBhdGFfcG9ydCAqYXApOworc3RhdGljIGludCBwZGNfc2F0YV9jYWJsZV9kZXRlY3Qoc3RydWN0IGF0YV9wb3J0ICphcCk7CiAKIHN0YXRpYyBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIHBkY19hdGFfc2h0ID0gewogCS5tb2R1bGUJCQk9IFRISVNfTU9EVUxFLApAQCAtMTY0LDE3ICsxODEsMTcgQEAKIAkucWNfaXNzdWUJCT0gcGRjX3FjX2lzc3VlX3Byb3QsCiAJLmZyZWV6ZQkJCT0gcGRjX2ZyZWV6ZSwKIAkudGhhdwkJCT0gcGRjX3RoYXcsCi0JLmVycm9yX2hhbmRsZXIJCT0gcGRjX2Vycm9yX2hhbmRsZXIsCisJLmVycm9yX2hhbmRsZXIJCT0gcGRjX3NhdGFfZXJyb3JfaGFuZGxlciwKIAkucG9zdF9pbnRlcm5hbF9jbWQJPSBwZGNfcG9zdF9pbnRlcm5hbF9jbWQsCisJLmNhYmxlX2RldGVjdAkJPSBwZGNfc2F0YV9jYWJsZV9kZXRlY3QsCiAJLmRhdGFfeGZlcgkJPSBhdGFfZGF0YV94ZmVyLAotCS5pcnFfaGFuZGxlcgkJPSBwZGNfaW50ZXJydXB0LAogCS5pcnFfY2xlYXIJCT0gcGRjX2lycV9jbGVhciwKIAkuaXJxX29uCQkJPSBhdGFfaXJxX29uLAogCS5pcnFfYWNrCQk9IGF0YV9pcnFfYWNrLAogCiAJLnNjcl9yZWFkCQk9IHBkY19zYXRhX3Njcl9yZWFkLAogCS5zY3Jfd3JpdGUJCT0gcGRjX3NhdGFfc2NyX3dyaXRlLAotCS5wb3J0X3N0YXJ0CQk9IHBkY19wb3J0X3N0YXJ0LAorCS5wb3J0X3N0YXJ0CQk9IHBkY19zYXRhX3BvcnRfc3RhcnQsCiB9OwogCiAvKiBGaXJzdC1nZW5lcmF0aW9uIGNoaXBzIG5lZWQgYSBtb3JlIHJlc3RyaWN0aXZlIC0+Y2hlY2tfYXRhcGlfZG1hIG9wICovCkBAIC0xODUsMjMgKzIwMiwyMyBAQAogCS5jaGVja19zdGF0dXMJCT0gYXRhX2NoZWNrX3N0YXR1cywKIAkuZXhlY19jb21tYW5kCQk9IHBkY19leGVjX2NvbW1hbmRfbW1pbywKIAkuZGV2X3NlbGVjdAkJPSBhdGFfc3RkX2Rldl9zZWxlY3QsCi0JLmNoZWNrX2F0YXBpX2RtYQk9IHBkY19vbGRfY2hlY2tfYXRhcGlfZG1hLAorCS5jaGVja19hdGFwaV9kbWEJPSBwZGNfb2xkX3NhdGFfY2hlY2tfYXRhcGlfZG1hLAogCiAJLnFjX3ByZXAJCT0gcGRjX3FjX3ByZXAsCiAJLnFjX2lzc3VlCQk9IHBkY19xY19pc3N1ZV9wcm90LAogCS5mcmVlemUJCQk9IHBkY19mcmVlemUsCiAJLnRoYXcJCQk9IHBkY190aGF3LAotCS5lcnJvcl9oYW5kbGVyCQk9IHBkY19lcnJvcl9oYW5kbGVyLAorCS5lcnJvcl9oYW5kbGVyCQk9IHBkY19zYXRhX2Vycm9yX2hhbmRsZXIsCiAJLnBvc3RfaW50ZXJuYWxfY21kCT0gcGRjX3Bvc3RfaW50ZXJuYWxfY21kLAorCS5jYWJsZV9kZXRlY3QJCT0gcGRjX3NhdGFfY2FibGVfZGV0ZWN0LAogCS5kYXRhX3hmZXIJCT0gYXRhX2RhdGFfeGZlciwKLQkuaXJxX2hhbmRsZXIJCT0gcGRjX2ludGVycnVwdCwKIAkuaXJxX2NsZWFyCQk9IHBkY19pcnFfY2xlYXIsCiAJLmlycV9vbgkJCT0gYXRhX2lycV9vbiwKIAkuaXJxX2FjawkJPSBhdGFfaXJxX2FjaywKIAogCS5zY3JfcmVhZAkJPSBwZGNfc2F0YV9zY3JfcmVhZCwKIAkuc2NyX3dyaXRlCQk9IHBkY19zYXRhX3Njcl93cml0ZSwKLQkucG9ydF9zdGFydAkJPSBwZGNfcG9ydF9zdGFydCwKKwkucG9ydF9zdGFydAkJPSBwZGNfc2F0YV9wb3J0X3N0YXJ0LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIHBkY19wYXRhX29wcyA9IHsKQEAgLTIxNywzMiArMjM0LDQxIEBACiAJLnFjX2lzc3VlCQk9IHBkY19xY19pc3N1ZV9wcm90LAogCS5mcmVlemUJCQk9IHBkY19mcmVlemUsCiAJLnRoYXcJCQk9IHBkY190aGF3LAotCS5lcnJvcl9oYW5kbGVyCQk9IHBkY19lcnJvcl9oYW5kbGVyLAorCS5lcnJvcl9oYW5kbGVyCQk9IHBkY19wYXRhX2Vycm9yX2hhbmRsZXIsCiAJLnBvc3RfaW50ZXJuYWxfY21kCT0gcGRjX3Bvc3RfaW50ZXJuYWxfY21kLAorCS5jYWJsZV9kZXRlY3QJCT0gcGRjX3BhdGFfY2FibGVfZGV0ZWN0LAogCS5kYXRhX3hmZXIJCT0gYXRhX2RhdGFfeGZlciwKLQkuaXJxX2hhbmRsZXIJCT0gcGRjX2ludGVycnVwdCwKIAkuaXJxX2NsZWFyCQk9IHBkY19pcnFfY2xlYXIsCiAJLmlycV9vbgkJCT0gYXRhX2lycV9vbiwKIAkuaXJxX2FjawkJPSBhdGFfaXJxX2FjaywKIAotCS5wb3J0X3N0YXJ0CQk9IHBkY19wb3J0X3N0YXJ0LAorCS5wb3J0X3N0YXJ0CQk9IHBkY19jb21tb25fcG9ydF9zdGFydCwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBwZGNfcG9ydF9pbmZvW10gPSB7CiAJLyogYm9hcmRfMjAzN3ggKi8KIAl7Ci0JCS5zaHQJCT0gJnBkY19hdGFfc2h0LAotCQkuZmxhZ3MJCT0gUERDX0NPTU1PTl9GTEFHUywKKwkJLmZsYWdzCQk9IFBEQ19DT01NT05fRkxBR1MgfCBBVEFfRkxBR19TQVRBIHwKKwkJCQkgIFBEQ19GTEFHX1NBVEFfUEFUQSwKIAkJLnBpb19tYXNrCT0gMHgxZiwgLyogcGlvMC00ICovCiAJCS5td2RtYV9tYXNrCT0gMHgwNywgLyogbXdkbWEwLTIgKi8KIAkJLnVkbWFfbWFzawk9IDB4N2YsIC8qIHVkbWEwLTYgOyBGSVhNRSAqLwogCQkucG9ydF9vcHMJPSAmcGRjX29sZF9zYXRhX29wcywKIAl9LAogCisJLyogYm9hcmRfMjAzN3hfcGF0YSAqLworCXsKKwkJLmZsYWdzCQk9IFBEQ19DT01NT05fRkxBR1MgfCBBVEFfRkxBR19TTEFWRV9QT1NTLAorCQkucGlvX21hc2sJPSAweDFmLCAvKiBwaW8wLTQgKi8KKwkJLm13ZG1hX21hc2sJPSAweDA3LCAvKiBtd2RtYTAtMiAqLworCQkudWRtYV9tYXNrCT0gMHg3ZiwgLyogdWRtYTAtNiA7IEZJWE1FICovCisJCS5wb3J0X29wcwk9ICZwZGNfcGF0YV9vcHMsCisJfSwKKwogCS8qIGJvYXJkXzIwMzE5ICovCiAJewotCQkuc2h0CQk9ICZwZGNfYXRhX3NodCwKLQkJLmZsYWdzCQk9IFBEQ19DT01NT05fRkxBR1MgfCBBVEFfRkxBR19TQVRBLAorCQkuZmxhZ3MJCT0gUERDX0NPTU1PTl9GTEFHUyB8IEFUQV9GTEFHX1NBVEEgfAorCQkJCSAgUERDX0ZMQUdfNF9QT1JUUywKIAkJLnBpb19tYXNrCT0gMHgxZiwgLyogcGlvMC00ICovCiAJCS5td2RtYV9tYXNrCT0gMHgwNywgLyogbXdkbWEwLTIgKi8KIAkJLnVkbWFfbWFzawk9IDB4N2YsIC8qIHVkbWEwLTYgOyBGSVhNRSAqLwpAQCAtMjUxLDggKzI3Nyw4IEBACiAKIAkvKiBib2FyZF8yMDYxOSAqLwogCXsKLQkJLnNodAkJPSAmcGRjX2F0YV9zaHQsCi0JCS5mbGFncwkJPSBQRENfQ09NTU9OX0ZMQUdTIHwgQVRBX0ZMQUdfU0xBVkVfUE9TUywKKwkJLmZsYWdzCQk9IFBEQ19DT01NT05fRkxBR1MgfCBBVEFfRkxBR19TTEFWRV9QT1NTIHwKKwkJCQkgIFBEQ19GTEFHXzRfUE9SVFMsCiAJCS5waW9fbWFzawk9IDB4MWYsIC8qIHBpbzAtNCAqLwogCQkubXdkbWFfbWFzawk9IDB4MDcsIC8qIG13ZG1hMC0yICovCiAJCS51ZG1hX21hc2sJPSAweDdmLCAvKiB1ZG1hMC02IDsgRklYTUUgKi8KQEAgLTI2MSwxOCArMjg3LDI4IEBACiAKIAkvKiBib2FyZF8yMDU3eCAqLwogCXsKLQkJLnNodAkJPSAmcGRjX2F0YV9zaHQsCi0JCS5mbGFncwkJPSBQRENfQ09NTU9OX0ZMQUdTLAorCQkuZmxhZ3MJCT0gUERDX0NPTU1PTl9GTEFHUyB8IEFUQV9GTEFHX1NBVEEgfAorCQkJCSAgUERDX0ZMQUdfR0VOX0lJIHwgUERDX0ZMQUdfU0FUQV9QQVRBLAogCQkucGlvX21hc2sJPSAweDFmLCAvKiBwaW8wLTQgKi8KIAkJLm13ZG1hX21hc2sJPSAweDA3LCAvKiBtd2RtYTAtMiAqLwogCQkudWRtYV9tYXNrCT0gMHg3ZiwgLyogdWRtYTAtNiA7IEZJWE1FICovCiAJCS5wb3J0X29wcwk9ICZwZGNfc2F0YV9vcHMsCiAJfSwKIAorCS8qIGJvYXJkXzIwNTd4X3BhdGEgKi8KKwl7CisJCS5mbGFncwkJPSBQRENfQ09NTU9OX0ZMQUdTIHwgQVRBX0ZMQUdfU0xBVkVfUE9TUywKKwkJCQkgIFBEQ19GTEFHX0dFTl9JSSwKKwkJLnBpb19tYXNrCT0gMHgxZiwgLyogcGlvMC00ICovCisJCS5td2RtYV9tYXNrCT0gMHgwNywgLyogbXdkbWEwLTIgKi8KKwkJLnVkbWFfbWFzawk9IDB4N2YsIC8qIHVkbWEwLTYgOyBGSVhNRSAqLworCQkucG9ydF9vcHMJPSAmcGRjX3BhdGFfb3BzLAorCX0sCisKIAkvKiBib2FyZF80MDUxOCAqLwogCXsKLQkJLnNodAkJPSAmcGRjX2F0YV9zaHQsCi0JCS5mbGFncwkJPSBQRENfQ09NTU9OX0ZMQUdTIHwgQVRBX0ZMQUdfU0FUQSwKKwkJLmZsYWdzCQk9IFBEQ19DT01NT05fRkxBR1MgfCBBVEFfRkxBR19TQVRBIHwKKwkJCQkgIFBEQ19GTEFHX0dFTl9JSSB8IFBEQ19GTEFHXzRfUE9SVFMsCiAJCS5waW9fbWFzawk9IDB4MWYsIC8qIHBpbzAtNCAqLwogCQkubXdkbWFfbWFzawk9IDB4MDcsIC8qIG13ZG1hMC0yICovCiAJCS51ZG1hX21hc2sJPSAweDdmLCAvKiB1ZG1hMC02IDsgRklYTUUgKi8KQEAgLTMxMywxOCArMzQ5LDEyIEBACiB9OwogCiAKLXN0YXRpYyBpbnQgcGRjX3BvcnRfc3RhcnQoc3RydWN0IGF0YV9wb3J0ICphcCkKK3N0YXRpYyBpbnQgcGRjX2NvbW1vbl9wb3J0X3N0YXJ0KHN0cnVjdCBhdGFfcG9ydCAqYXApCiB7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gYXAtPmhvc3QtPmRldjsKLQlzdHJ1Y3QgcGRjX2hvc3RfcHJpdiAqaHAgPSBhcC0+aG9zdC0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBwZGNfcG9ydF9wcml2ICpwcDsKIAlpbnQgcmM7CiAKLQkvKiBmaXggdXAgcG9ydCBmbGFncyBhbmQgY2FibGUgdHlwZSBmb3IgU0FUQStQQVRBIGNoaXBzICovCi0JYXAtPmZsYWdzIHw9IGhwLT5wb3J0X2ZsYWdzW2FwLT5wb3J0X25vXTsKLQlpZiAoYXAtPmZsYWdzICYgQVRBX0ZMQUdfU0FUQSkKLQkJYXAtPmNibCA9IEFUQV9DQkxfU0FUQTsKLQogCXJjID0gYXRhX3BvcnRfc3RhcnQoYXApOwogCWlmIChyYykKIAkJcmV0dXJuIHJjOwpAQCAtMzM5LDggKzM2OSwxOSBAQAogCiAJYXAtPnByaXZhdGVfZGF0YSA9IHBwOwogCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGRjX3NhdGFfcG9ydF9zdGFydChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCWludCByYzsKKworCXJjID0gcGRjX2NvbW1vbl9wb3J0X3N0YXJ0KGFwKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKwogCS8qIGZpeCB1cCBQSFlNT0RFNCBhbGlnbiB0aW1pbmcgKi8KLQlpZiAoKGhwLT5mbGFncyAmIFBEQ19GTEFHX0dFTl9JSSkgJiYgc2F0YV9zY3JfdmFsaWQoYXApKSB7CisJaWYgKGFwLT5mbGFncyAmIFBEQ19GTEFHX0dFTl9JSSkgewogCQl2b2lkIF9faW9tZW0gKm1taW8gPSAodm9pZCBfX2lvbWVtICopIGFwLT5pb2FkZHIuc2NyX2FkZHI7CiAJCXVuc2lnbmVkIGludCB0bXA7CiAKQEAgLTM3NCwyMyArNDE1LDI1IEBACiAJcmVhZGwobW1pbyk7CS8qIGZsdXNoICovCiB9CiAKLXN0YXRpYyB2b2lkIHBkY19wYXRhX2NibF9kZXRlY3Qoc3RydWN0IGF0YV9wb3J0ICphcCkKK3N0YXRpYyBpbnQgcGRjX3BhdGFfY2FibGVfZGV0ZWN0KHN0cnVjdCBhdGFfcG9ydCAqYXApCiB7CiAJdTggdG1wOwogCXZvaWQgX19pb21lbSAqbW1pbyA9ICh2b2lkIF9faW9tZW0gKikgYXAtPmlvYWRkci5jbWRfYWRkciArIFBEQ19DVExTVEFUICsgMHgwMzsKIAogCXRtcCA9IHJlYWRiKG1taW8pOworCWlmICh0bXAgJiAweDAxKQorCQlyZXR1cm4gQVRBX0NCTF9QQVRBNDA7CisJcmV0dXJuIEFUQV9DQkxfUEFUQTgwOworfQogCi0JaWYgKHRtcCAmIDB4MDEpIHsKLQkJYXAtPmNibCA9IEFUQV9DQkxfUEFUQTQwOwotCQlhcC0+dWRtYV9tYXNrICY9IEFUQV9VRE1BX01BU0tfNDBDOwotCX0gZWxzZQotCQlhcC0+Y2JsID0gQVRBX0NCTF9QQVRBODA7CitzdGF0aWMgaW50IHBkY19zYXRhX2NhYmxlX2RldGVjdChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCXJldHVybiBBVEFfQ0JMX1NBVEE7CiB9CiAKIHN0YXRpYyB1MzIgcGRjX3NhdGFfc2NyX3JlYWQgKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCBzY19yZWcpCiB7Ci0JaWYgKHNjX3JlZyA+IFNDUl9DT05UUk9MIHx8IGFwLT5jYmwgIT0gQVRBX0NCTF9TQVRBKQorCWlmIChzY19yZWcgPiBTQ1JfQ09OVFJPTCkKIAkJcmV0dXJuIDB4ZmZmZmZmZmZVOwogCXJldHVybiByZWFkbChhcC0+aW9hZGRyLnNjcl9hZGRyICsgKHNjX3JlZyAqIDQpKTsKIH0KQEAgLTM5OSw3ICs0NDIsNyBAQAogc3RhdGljIHZvaWQgcGRjX3NhdGFfc2NyX3dyaXRlIChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgc2NfcmVnLAogCQkJICAgICAgIHUzMiB2YWwpCiB7Ci0JaWYgKHNjX3JlZyA+IFNDUl9DT05UUk9MIHx8IGFwLT5jYmwgIT0gQVRBX0NCTF9TQVRBKQorCWlmIChzY19yZWcgPiBTQ1JfQ09OVFJPTCkKIAkJcmV0dXJuOwogCXdyaXRlbCh2YWwsIGFwLT5pb2FkZHIuc2NyX2FkZHIgKyAoc2NfcmVnICogNCkpOwogfQpAQCAtNTU1LDUyICs1OTgsNzkgQEAKIAlyZWFkbChtbWlvICsgUERDX0NUTFNUQVQpOyAvKiBmbHVzaCAqLwogfQogCi1zdGF0aWMgaW50IHBkY19wcmVfcmVzZXQoc3RydWN0IGF0YV9wb3J0ICphcCkKK3N0YXRpYyB2b2lkIHBkY19jb21tb25fZXJyb3JfaGFuZGxlcihzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBhdGFfcmVzZXRfZm5fdCBoYXJkcmVzZXQpCiB7Ci0JaWYgKCFzYXRhX3Njcl92YWxpZChhcCkpCi0JCXBkY19wYXRhX2NibF9kZXRlY3QoYXApOwotCXJldHVybiBhdGFfc3RkX3ByZXJlc2V0KGFwKTsKLX0KLQotc3RhdGljIHZvaWQgcGRjX2Vycm9yX2hhbmRsZXIoc3RydWN0IGF0YV9wb3J0ICphcCkKLXsKLQlhdGFfcmVzZXRfZm5fdCBoYXJkcmVzZXQ7Ci0KIAlpZiAoIShhcC0+cGZsYWdzICYgQVRBX1BGTEFHX0ZST1pFTikpCiAJCXBkY19yZXNldF9wb3J0KGFwKTsKIAotCWhhcmRyZXNldCA9IE5VTEw7Ci0JaWYgKHNhdGFfc2NyX3ZhbGlkKGFwKSkKLQkJaGFyZHJlc2V0ID0gc2F0YV9zdGRfaGFyZHJlc2V0OwotCiAJLyogcGVyZm9ybSByZWNvdmVyeSAqLwotCWF0YV9kb19laChhcCwgcGRjX3ByZV9yZXNldCwgYXRhX3N0ZF9zb2Z0cmVzZXQsIGhhcmRyZXNldCwKKwlhdGFfZG9fZWgoYXAsIGF0YV9zdGRfcHJlcmVzZXQsIGF0YV9zdGRfc29mdHJlc2V0LCBoYXJkcmVzZXQsCiAJCSAgYXRhX3N0ZF9wb3N0cmVzZXQpOwogfQogCitzdGF0aWMgdm9pZCBwZGNfcGF0YV9lcnJvcl9oYW5kbGVyKHN0cnVjdCBhdGFfcG9ydCAqYXApCit7CisJcGRjX2NvbW1vbl9lcnJvcl9oYW5kbGVyKGFwLCBOVUxMKTsKK30KKworc3RhdGljIHZvaWQgcGRjX3NhdGFfZXJyb3JfaGFuZGxlcihzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCXBkY19jb21tb25fZXJyb3JfaGFuZGxlcihhcCwgc2F0YV9zdGRfaGFyZHJlc2V0KTsKK30KKwogc3RhdGljIHZvaWQgcGRjX3Bvc3RfaW50ZXJuYWxfY21kKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpCiB7CiAJc3RydWN0IGF0YV9wb3J0ICphcCA9IHFjLT5hcDsKIAotCWlmIChxYy0+ZmxhZ3MgJiBBVEFfUUNGTEFHX0ZBSUxFRCkKLQkJcWMtPmVycl9tYXNrIHw9IEFDX0VSUl9PVEhFUjsKLQogCS8qIG1ha2UgRE1BIGVuZ2luZSBmb3JnZXQgYWJvdXQgdGhlIGZhaWxlZCBjb21tYW5kICovCi0JaWYgKHFjLT5lcnJfbWFzaykKKwlpZiAocWMtPmZsYWdzICYgQVRBX1FDRkxBR19GQUlMRUQpCiAJCXBkY19yZXNldF9wb3J0KGFwKTsKIH0KIAorc3RhdGljIHZvaWQgcGRjX2Vycm9yX2ludHIoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYywKKwkJCSAgIHUzMiBwb3J0X3N0YXR1cywgdTMyIGVycl9tYXNrKQoreworCXN0cnVjdCBhdGFfZWhfaW5mbyAqZWhpID0gJmFwLT5laF9pbmZvOworCXVuc2lnbmVkIGludCBhY19lcnJfbWFzayA9IDA7CisKKwlhdGFfZWhpX2NsZWFyX2Rlc2MoZWhpKTsKKwlhdGFfZWhpX3B1c2hfZGVzYyhlaGksICJwb3J0X3N0YXR1cyAweCUwOHgiLCBwb3J0X3N0YXR1cyk7CisJcG9ydF9zdGF0dXMgJj0gZXJyX21hc2s7CisKKwlpZiAocG9ydF9zdGF0dXMgJiBQRENfRFJJVkVfRVJSKQorCQlhY19lcnJfbWFzayB8PSBBQ19FUlJfREVWOworCWlmIChwb3J0X3N0YXR1cyAmIChQRENfT1ZFUlJVTl9FUlIgfCBQRENfVU5ERVJSVU5fRVJSKSkKKwkJYWNfZXJyX21hc2sgfD0gQUNfRVJSX0hTTTsKKwlpZiAocG9ydF9zdGF0dXMgJiAoUERDMl9BVEFfSEJBX0VSUiB8IFBEQzJfQVRBX0RNQV9DTlRfRVJSKSkKKwkJYWNfZXJyX21hc2sgfD0gQUNfRVJSX0FUQV9CVVM7CisJaWYgKHBvcnRfc3RhdHVzICYgKFBEQ19QSF9FUlIgfCBQRENfU0hfRVJSIHwgUERDX0RIX0VSUiB8IFBEQzJfSFRPX0VSUgorCQkJICAgfCBQRENfUENJX1NZU19FUlIgfCBQREMxX1BDSV9QQVJJVFlfRVJSKSkKKwkJYWNfZXJyX21hc2sgfD0gQUNfRVJSX0hPU1RfQlVTOworCisJaWYgKHNhdGFfc2NyX3ZhbGlkKGFwKSkKKwkJZWhpLT5zZXJyb3IgfD0gcGRjX3NhdGFfc2NyX3JlYWQoYXAsIFNDUl9FUlJPUik7CisKKwlxYy0+ZXJyX21hc2sgfD0gYWNfZXJyX21hc2s7CisKKwlwZGNfcmVzZXRfcG9ydChhcCk7Cit9CisKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHBkY19ob3N0X2ludHIoIHN0cnVjdCBhdGFfcG9ydCAqYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKQogewogCXVuc2lnbmVkIGludCBoYW5kbGVkID0gMDsKLQl1MzIgdG1wOwotCXZvaWQgX19pb21lbSAqbW1pbyA9IGFwLT5pb2FkZHIuY21kX2FkZHIgKyBQRENfR0xPQkFMX0NUTDsKKwl2b2lkIF9faW9tZW0gKnBvcnRfbW1pbyA9IGFwLT5pb2FkZHIuY21kX2FkZHI7CisJdTMyIHBvcnRfc3RhdHVzLCBlcnJfbWFzazsKIAotCXRtcCA9IHJlYWRsKG1taW8pOwotCWlmICh0bXAgJiBQRENfRVJSX01BU0spIHsKLQkJcWMtPmVycl9tYXNrIHw9IEFDX0VSUl9ERVY7Ci0JCXBkY19yZXNldF9wb3J0KGFwKTsKKwllcnJfbWFzayA9IFBEQ19FUlJfTUFTSzsKKwlpZiAoYXAtPmZsYWdzICYgUERDX0ZMQUdfR0VOX0lJKQorCQllcnJfbWFzayAmPSB+UERDMV9FUlJfTUFTSzsKKwllbHNlCisJCWVycl9tYXNrICY9IH5QREMyX0VSUl9NQVNLOworCXBvcnRfc3RhdHVzID0gcmVhZGwocG9ydF9tbWlvICsgUERDX0dMT0JBTF9DVEwpOworCWlmICh1bmxpa2VseShwb3J0X3N0YXR1cyAmIGVycl9tYXNrKSkgeworCQlwZGNfZXJyb3JfaW50cihhcCwgcWMsIHBvcnRfc3RhdHVzLCBlcnJfbWFzayk7CisJCXJldHVybiAxOwogCX0KIAogCXN3aXRjaCAocWMtPnRmLnByb3RvY29sKSB7CkBAIC03NjcsNDQgKzgzNyw0MCBAQAogCXJldHVybiBwaW87CiB9CiAKLXN0YXRpYyBpbnQgcGRjX29sZF9jaGVja19hdGFwaV9kbWEoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYykKK3N0YXRpYyBpbnQgcGRjX29sZF9zYXRhX2NoZWNrX2F0YXBpX2RtYShzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKQogewotCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBxYy0+YXA7Ci0KIAkvKiBGaXJzdCBnZW5lcmF0aW9uIGNoaXBzIGNhbm5vdCB1c2UgQVRBUEkgRE1BIG9uIFNBVEEgcG9ydHMgKi8KLQlpZiAoc2F0YV9zY3JfdmFsaWQoYXApKQotCQlyZXR1cm4gMTsKLQlyZXR1cm4gcGRjX2NoZWNrX2F0YXBpX2RtYShxYyk7CisJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyB2b2lkIHBkY19hdGFfc2V0dXBfcG9ydChzdHJ1Y3QgYXRhX2lvcG9ydHMgKnBvcnQsIHZvaWQgX19pb21lbSAqYmFzZSwKLQkJCSAgICAgICB2b2lkIF9faW9tZW0gKnNjcl9hZGRyKQorc3RhdGljIHZvaWQgcGRjX2F0YV9zZXR1cF9wb3J0KHN0cnVjdCBhdGFfcG9ydCAqYXAsCisJCQkgICAgICAgdm9pZCBfX2lvbWVtICpiYXNlLCB2b2lkIF9faW9tZW0gKnNjcl9hZGRyKQogewotCXBvcnQtPmNtZF9hZGRyCQk9IGJhc2U7Ci0JcG9ydC0+ZGF0YV9hZGRyCQk9IGJhc2U7Ci0JcG9ydC0+ZmVhdHVyZV9hZGRyCT0KLQlwb3J0LT5lcnJvcl9hZGRyCT0gYmFzZSArIDB4NDsKLQlwb3J0LT5uc2VjdF9hZGRyCT0gYmFzZSArIDB4ODsKLQlwb3J0LT5sYmFsX2FkZHIJCT0gYmFzZSArIDB4YzsKLQlwb3J0LT5sYmFtX2FkZHIJCT0gYmFzZSArIDB4MTA7Ci0JcG9ydC0+bGJhaF9hZGRyCQk9IGJhc2UgKyAweDE0OwotCXBvcnQtPmRldmljZV9hZGRyCT0gYmFzZSArIDB4MTg7Ci0JcG9ydC0+Y29tbWFuZF9hZGRyCT0KLQlwb3J0LT5zdGF0dXNfYWRkcgk9IGJhc2UgKyAweDFjOwotCXBvcnQtPmFsdHN0YXR1c19hZGRyCT0KLQlwb3J0LT5jdGxfYWRkcgkJPSBiYXNlICsgMHgzODsKLQlwb3J0LT5zY3JfYWRkcgkJPSBzY3JfYWRkcjsKKwlhcC0+aW9hZGRyLmNtZF9hZGRyCQk9IGJhc2U7CisJYXAtPmlvYWRkci5kYXRhX2FkZHIJCT0gYmFzZTsKKwlhcC0+aW9hZGRyLmZlYXR1cmVfYWRkcgkJPQorCWFwLT5pb2FkZHIuZXJyb3JfYWRkcgkJPSBiYXNlICsgMHg0OworCWFwLT5pb2FkZHIubnNlY3RfYWRkcgkJPSBiYXNlICsgMHg4OworCWFwLT5pb2FkZHIubGJhbF9hZGRyCQk9IGJhc2UgKyAweGM7CisJYXAtPmlvYWRkci5sYmFtX2FkZHIJCT0gYmFzZSArIDB4MTA7CisJYXAtPmlvYWRkci5sYmFoX2FkZHIJCT0gYmFzZSArIDB4MTQ7CisJYXAtPmlvYWRkci5kZXZpY2VfYWRkcgkJPSBiYXNlICsgMHgxODsKKwlhcC0+aW9hZGRyLmNvbW1hbmRfYWRkcgkJPQorCWFwLT5pb2FkZHIuc3RhdHVzX2FkZHIJCT0gYmFzZSArIDB4MWM7CisJYXAtPmlvYWRkci5hbHRzdGF0dXNfYWRkcgk9CisJYXAtPmlvYWRkci5jdGxfYWRkcgkJPSBiYXNlICsgMHgzODsKKwlhcC0+aW9hZGRyLnNjcl9hZGRyCQk9IHNjcl9hZGRyOwogfQogCiAKLXN0YXRpYyB2b2lkIHBkY19ob3N0X2luaXQodW5zaWduZWQgaW50IGNoaXBfaWQsIHN0cnVjdCBhdGFfcHJvYmVfZW50ICpwZSkKK3N0YXRpYyB2b2lkIHBkY19ob3N0X2luaXQoc3RydWN0IGF0YV9ob3N0ICpob3N0KQogewotCXZvaWQgX19pb21lbSAqbW1pbyA9IHBlLT5pb21hcFtQRENfTU1JT19CQVJdOwotCXN0cnVjdCBwZGNfaG9zdF9wcml2ICpocCA9IHBlLT5wcml2YXRlX2RhdGE7CisJdm9pZCBfX2lvbWVtICptbWlvID0gaG9zdC0+aW9tYXBbUERDX01NSU9fQkFSXTsKKwlpbnQgaXNfZ2VuMiA9IGhvc3QtPnBvcnRzWzBdLT5mbGFncyAmIFBEQ19GTEFHX0dFTl9JSTsKIAlpbnQgaG90cGx1Z19vZmZzZXQ7CiAJdTMyIHRtcDsKIAotCWlmIChocC0+ZmxhZ3MgJiBQRENfRkxBR19HRU5fSUkpCisJaWYgKGlzX2dlbjIpCiAJCWhvdHBsdWdfb2Zmc2V0ID0gUERDMl9TQVRBX1BMVUdfQ1NSOwogCWVsc2UKIAkJaG90cGx1Z19vZmZzZXQgPSBQRENfU0FUQV9QTFVHX0NTUjsKQEAgLTgxOCw3ICs4ODQsNyBAQAogCS8qIGVuYWJsZSBCTVJfQlVSU1QsIG1heWJlIGNoYW5nZSBGSUZPX1NIRCB0byA4IGR3b3JkcyAqLwogCXRtcCA9IHJlYWRsKG1taW8gKyBQRENfRkxBU0hfQ1RMKTsKIAl0bXAgfD0gMHgwMjAwMDsJLyogYml0IDEzIChlbmFibGUgYm1yIGJ1cnN0KSAqLwotCWlmICghKGhwLT5mbGFncyAmIFBEQ19GTEFHX0dFTl9JSSkpCisJaWYgKCFpc19nZW4yKQogCQl0bXAgfD0gMHgxMDAwMDsJLyogYml0IDE2IChmaWZvIHRocmVzaG9sZCBhdCA4IGR3KSAqLwogCXdyaXRlbCh0bXAsIG1taW8gKyBQRENfRkxBU0hfQ1RMKTsKIApAQCAtODMxLDcgKzg5Nyw3IEBACiAJd3JpdGVsKHRtcCB8IDB4ZmYwMDAwLCBtbWlvICsgaG90cGx1Z19vZmZzZXQpOwogCiAJLyogZG9uJ3QgaW5pdGlhbGlzZSBUQkcgb3IgU0xFVyBvbiAybmQgZ2VuZXJhdGlvbiBjaGlwcyAqLwotCWlmIChocC0+ZmxhZ3MgJiBQRENfRkxBR19HRU5fSUkpCisJaWYgKGlzX2dlbjIpCiAJCXJldHVybjsKIAogCS8qIHJlZHVjZSBUQkcgY2xvY2sgdG8gMTMzIE1oei4gKi8KQEAgLTg1MywxNiArOTE5LDE2IEBACiBzdGF0aWMgaW50IHBkY19hdGFfaW5pdF9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQogewogCXN0YXRpYyBpbnQgcHJpbnRlZF92ZXJzaW9uOwotCXN0cnVjdCBhdGFfcHJvYmVfZW50ICpwcm9iZV9lbnQ7Ci0Jc3RydWN0IHBkY19ob3N0X3ByaXYgKmhwOworCWNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvICpwaSA9ICZwZGNfcG9ydF9pbmZvW2VudC0+ZHJpdmVyX2RhdGFdOworCWNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvICpwcGlbUERDX01BWF9QT1JUU107CisJc3RydWN0IGF0YV9ob3N0ICpob3N0OwogCXZvaWQgX19pb21lbSAqYmFzZTsKLQl1bnNpZ25lZCBpbnQgYm9hcmRfaWR4ID0gKHVuc2lnbmVkIGludCkgZW50LT5kcml2ZXJfZGF0YTsKLQlpbnQgcmM7Ci0JdTggdG1wOworCWludCBuX3BvcnRzLCBpLCByYzsKIAogCWlmICghcHJpbnRlZF92ZXJzaW9uKyspCiAJCWRldl9wcmludGsoS0VSTl9ERUJVRywgJnBkZXYtPmRldiwgInZlcnNpb24gIiBEUlZfVkVSU0lPTiAiXG4iKTsKIAorCS8qIGVuYWJsZSBhbmQgYWNxdWlyZSByZXNvdXJjZXMgKi8KIAlyYyA9IHBjaW1fZW5hYmxlX2RldmljZShwZGV2KTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKQEAgLTg3Miw2ICs5MzgsMzcgQEAKIAkJcGNpbV9waW5fZGV2aWNlKHBkZXYpOwogCWlmIChyYykKIAkJcmV0dXJuIHJjOworCWJhc2UgPSBwY2ltX2lvbWFwX3RhYmxlKHBkZXYpW1BEQ19NTUlPX0JBUl07CisKKwkvKiBkZXRlcm1pbmUgcG9ydCBjb25maWd1cmF0aW9uIGFuZCBzZXR1cCBob3N0ICovCisJbl9wb3J0cyA9IDI7CisJaWYgKHBpLT5mbGFncyAmIFBEQ19GTEFHXzRfUE9SVFMpCisJCW5fcG9ydHMgPSA0OworCWZvciAoaSA9IDA7IGkgPCBuX3BvcnRzOyBpKyspCisJCXBwaVtpXSA9IHBpOworCisJaWYgKHBpLT5mbGFncyAmIFBEQ19GTEFHX1NBVEFfUEFUQSkgeworCQl1OCB0bXAgPSByZWFkYihiYXNlICsgUERDX0ZMQVNIX0NUTCsxKTsKKwkJaWYgKCEodG1wICYgMHg4MCkpIHsKKwkJCXBwaVtuX3BvcnRzKytdID0gcGkgKyAxOworCQkJZGV2X3ByaW50ayhLRVJOX0lORk8sICZwZGV2LT5kZXYsICJQQVRBIHBvcnQgZm91bmRcbiIpOworCQl9CisJfQorCisJaG9zdCA9IGF0YV9ob3N0X2FsbG9jX3BpbmZvKCZwZGV2LT5kZXYsIHBwaSwgbl9wb3J0cyk7CisJaWYgKCFob3N0KSB7CisJCWRldl9wcmludGsoS0VSTl9FUlIsICZwZGV2LT5kZXYsICJmYWlsZWQgdG8gYWxsb2NhdGUgaG9zdFxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlob3N0LT5pb21hcCA9IHBjaW1faW9tYXBfdGFibGUocGRldik7CisKKwlmb3IgKGkgPSAwOyBpIDwgaG9zdC0+bl9wb3J0czsgaSsrKQorCQlwZGNfYXRhX3NldHVwX3BvcnQoaG9zdC0+cG9ydHNbaV0sCisJCQkJICAgYmFzZSArIDB4MjAwICsgaSAqIDB4ODAsCisJCQkJICAgYmFzZSArIDB4NDAwICsgaSAqIDB4MTAwKTsKKworCS8qIGluaXRpYWxpemUgYWRhcHRlciAqLworCXBkY19ob3N0X2luaXQoaG9zdCk7CiAKIAlyYyA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgQVRBX0RNQV9NQVNLKTsKIAlpZiAocmMpCkBAIC04ODAsODEgKzk3NywxMCBAQAogCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCi0JcHJvYmVfZW50ID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqcHJvYmVfZW50KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHByb2JlX2VudCA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXByb2JlX2VudC0+ZGV2ID0gcGNpX2Rldl90b19kZXYocGRldik7Ci0JSU5JVF9MSVNUX0hFQUQoJnByb2JlX2VudC0+bm9kZSk7Ci0KLQlocCA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKmhwKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGhwID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcHJvYmVfZW50LT5wcml2YXRlX2RhdGEgPSBocDsKLQotCXByb2JlX2VudC0+c2h0CQk9IHBkY19wb3J0X2luZm9bYm9hcmRfaWR4XS5zaHQ7Ci0JcHJvYmVfZW50LT5wb3J0X2ZsYWdzCT0gcGRjX3BvcnRfaW5mb1tib2FyZF9pZHhdLmZsYWdzOwotCXByb2JlX2VudC0+cGlvX21hc2sJPSBwZGNfcG9ydF9pbmZvW2JvYXJkX2lkeF0ucGlvX21hc2s7Ci0JcHJvYmVfZW50LT5td2RtYV9tYXNrCT0gcGRjX3BvcnRfaW5mb1tib2FyZF9pZHhdLm13ZG1hX21hc2s7Ci0JcHJvYmVfZW50LT51ZG1hX21hc2sJPSBwZGNfcG9ydF9pbmZvW2JvYXJkX2lkeF0udWRtYV9tYXNrOwotCXByb2JlX2VudC0+cG9ydF9vcHMJPSBwZGNfcG9ydF9pbmZvW2JvYXJkX2lkeF0ucG9ydF9vcHM7Ci0KLSAgICAgICAJcHJvYmVfZW50LT5pcnEgPSBwZGV2LT5pcnE7Ci0gICAgICAgCXByb2JlX2VudC0+aXJxX2ZsYWdzID0gSVJRRl9TSEFSRUQ7Ci0JcHJvYmVfZW50LT5pb21hcCA9IHBjaW1faW9tYXBfdGFibGUocGRldik7Ci0KLQliYXNlID0gcHJvYmVfZW50LT5pb21hcFtQRENfTU1JT19CQVJdOwotCi0JcGRjX2F0YV9zZXR1cF9wb3J0KCZwcm9iZV9lbnQtPnBvcnRbMF0sIGJhc2UgKyAweDIwMCwgYmFzZSArIDB4NDAwKTsKLQlwZGNfYXRhX3NldHVwX3BvcnQoJnByb2JlX2VudC0+cG9ydFsxXSwgYmFzZSArIDB4MjgwLCBiYXNlICsgMHg1MDApOwotCi0JLyogbm90aWNlIDQtcG9ydCBib2FyZHMgKi8KLQlzd2l0Y2ggKGJvYXJkX2lkeCkgewotCWNhc2UgYm9hcmRfNDA1MTg6Ci0JCWhwLT5mbGFncyB8PSBQRENfRkxBR19HRU5fSUk7Ci0JCS8qIEZhbGwgdGhyb3VnaCAqLwotCWNhc2UgYm9hcmRfMjAzMTk6Ci0gICAgICAgCQlwcm9iZV9lbnQtPm5fcG9ydHMgPSA0OwotCQlwZGNfYXRhX3NldHVwX3BvcnQoJnByb2JlX2VudC0+cG9ydFsyXSwgYmFzZSArIDB4MzAwLCBiYXNlICsgMHg2MDApOwotCQlwZGNfYXRhX3NldHVwX3BvcnQoJnByb2JlX2VudC0+cG9ydFszXSwgYmFzZSArIDB4MzgwLCBiYXNlICsgMHg3MDApOwotCQlicmVhazsKLQljYXNlIGJvYXJkXzIwNTd4OgotCQlocC0+ZmxhZ3MgfD0gUERDX0ZMQUdfR0VOX0lJOwotCQkvKiBGYWxsIHRocm91Z2ggKi8KLQljYXNlIGJvYXJkXzIwMzd4OgotCQkvKiBUWDJwbHVzIGJvYXJkcyBhbHNvIGhhdmUgYSBQQVRBIHBvcnQgKi8KLQkJdG1wID0gcmVhZGIoYmFzZSArIFBEQ19GTEFTSF9DVEwrMSk7Ci0JCWlmICghKHRtcCAmIDB4ODApKSB7Ci0JCQlwcm9iZV9lbnQtPm5fcG9ydHMgPSAzOwotCQkJcGRjX2F0YV9zZXR1cF9wb3J0KCZwcm9iZV9lbnQtPnBvcnRbMl0sIGJhc2UgKyAweDMwMCwgTlVMTCk7Ci0JCQlocC0+cG9ydF9mbGFnc1syXSA9IEFUQV9GTEFHX1NMQVZFX1BPU1M7Ci0JCQlwcmludGsoS0VSTl9JTkZPIERSVl9OQU1FICIgUEFUQSBwb3J0IGZvdW5kXG4iKTsKLQkJfSBlbHNlCi0JCQlwcm9iZV9lbnQtPm5fcG9ydHMgPSAyOwotCQlocC0+cG9ydF9mbGFnc1swXSA9IEFUQV9GTEFHX1NBVEE7Ci0JCWhwLT5wb3J0X2ZsYWdzWzFdID0gQVRBX0ZMQUdfU0FUQTsKLQkJYnJlYWs7Ci0JY2FzZSBib2FyZF8yMDYxOToKLQkJcHJvYmVfZW50LT5uX3BvcnRzID0gNDsKLQkJcGRjX2F0YV9zZXR1cF9wb3J0KCZwcm9iZV9lbnQtPnBvcnRbMl0sIGJhc2UgKyAweDMwMCwgTlVMTCk7Ci0JCXBkY19hdGFfc2V0dXBfcG9ydCgmcHJvYmVfZW50LT5wb3J0WzNdLCBiYXNlICsgMHgzODAsIE5VTEwpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlCVUcoKTsKLQkJYnJlYWs7Ci0JfQotCisJLyogc3RhcnQgaG9zdCwgcmVxdWVzdCBJUlEgYW5kIGF0dGFjaCAqLwogCXBjaV9zZXRfbWFzdGVyKHBkZXYpOwotCi0JLyogaW5pdGlhbGl6ZSBhZGFwdGVyICovCi0JcGRjX2hvc3RfaW5pdChib2FyZF9pZHgsIHByb2JlX2VudCk7Ci0KLQlpZiAoIWF0YV9kZXZpY2VfYWRkKHByb2JlX2VudCkpCi0JCXJldHVybiAtRU5PREVWOwotCi0JZGV2bV9rZnJlZSgmcGRldi0+ZGV2LCBwcm9iZV9lbnQpOwotCXJldHVybiAwOworCXJldHVybiBhdGFfaG9zdF9hY3RpdmF0ZShob3N0LCBwZGV2LT5pcnEsIHBkY19pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAorCQkJCSAmcGRjX2F0YV9zaHQpOwogfQogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3NhdGFfcXN0b3IuYyBiL2RyaXZlcnMvYXRhL3NhdGFfcXN0b3IuYwppbmRleCA4Nzg2YjQ1Li5mNWEwNWRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9zYXRhX3FzdG9yLmMKKysrIGIvZHJpdmVycy9hdGEvc2F0YV9xc3Rvci5jCkBAIC0xMTQsNyArMTE0LDYgQEAKIHN0YXRpYyB1MzIgcXNfc2NyX3JlYWQgKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCBzY19yZWcpOwogc3RhdGljIHZvaWQgcXNfc2NyX3dyaXRlIChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgc2NfcmVnLCB1MzIgdmFsKTsKIHN0YXRpYyBpbnQgcXNfYXRhX2luaXRfb25lIChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCk7Ci1zdGF0aWMgaXJxcmV0dXJuX3QgcXNfaW50ciAoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlKTsKIHN0YXRpYyBpbnQgcXNfcG9ydF9zdGFydChzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKIHN0YXRpYyB2b2lkIHFzX2hvc3Rfc3RvcChzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QpOwogc3RhdGljIHZvaWQgcXNfcGh5X3Jlc2V0KHN0cnVjdCBhdGFfcG9ydCAqYXApOwpAQCAtMTU4LDcgKzE1Nyw2IEBACiAJLnFjX2lzc3VlCQk9IHFzX3FjX2lzc3VlLAogCS5kYXRhX3hmZXIJCT0gYXRhX2RhdGFfeGZlciwKIAkuZW5nX3RpbWVvdXQJCT0gcXNfZW5nX3RpbWVvdXQsCi0JLmlycV9oYW5kbGVyCQk9IHFzX2ludHIsCiAJLmlycV9jbGVhcgkJPSBxc19pcnFfY2xlYXIsCiAJLmlycV9vbgkJCT0gYXRhX2lycV9vbiwKIAkuaXJxX2FjawkJPSBhdGFfaXJxX2FjaywKQEAgLTE3Myw3ICsxNzEsNiBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvIHFzX3BvcnRfaW5mb1tdID0gewogCS8qIGJvYXJkXzIwNjhfaWR4ICovCiAJewotCQkuc2h0CQk9ICZxc19hdGFfc2h0LAogCQkuZmxhZ3MJCT0gQVRBX0ZMQUdfU0FUQSB8IEFUQV9GTEFHX05PX0xFR0FDWSB8CiAJCQkJICBBVEFfRkxBR19TQVRBX1JFU0VUIHwKIAkJCQkgIC8vRklYTUUgQVRBX0ZMQUdfU1JTVCB8CkBAIC01MzAsMTYgKzUyNywxNiBAQAogCXdyaXRlYihRU19DTkZHM19HU1JTVCwgbW1pb19iYXNlICsgUVNfSENGX0NORkczKTsgLyogZ2xvYmFsIHJlc2V0ICovCiB9CiAKLXN0YXRpYyB2b2lkIHFzX2hvc3RfaW5pdCh1bnNpZ25lZCBpbnQgY2hpcF9pZCwgc3RydWN0IGF0YV9wcm9iZV9lbnQgKnBlKQorc3RhdGljIHZvaWQgcXNfaG9zdF9pbml0KHN0cnVjdCBhdGFfaG9zdCAqaG9zdCwgdW5zaWduZWQgaW50IGNoaXBfaWQpCiB7Ci0Jdm9pZCBfX2lvbWVtICptbWlvX2Jhc2UgPSBwZS0+aW9tYXBbUVNfTU1JT19CQVJdOworCXZvaWQgX19pb21lbSAqbW1pb19iYXNlID0gaG9zdC0+aW9tYXBbUVNfTU1JT19CQVJdOwogCXVuc2lnbmVkIGludCBwb3J0X25vOwogCiAJd3JpdGViKDAsIG1taW9fYmFzZSArIFFTX0hDVF9DVFJMKTsgLyogZGlzYWJsZSBob3N0IGludGVycnVwdHMgKi8KIAl3cml0ZWIoUVNfQ05GRzNfR1NSU1QsIG1taW9fYmFzZSArIFFTX0hDRl9DTkZHMyk7IC8qIGdsb2JhbCByZXNldCAqLwogCiAJLyogcmVzZXQgZWFjaCBjaGFubmVsIGluIHR1cm4gKi8KLQlmb3IgKHBvcnRfbm8gPSAwOyBwb3J0X25vIDwgcGUtPm5fcG9ydHM7ICsrcG9ydF9ubykgeworCWZvciAocG9ydF9ubyA9IDA7IHBvcnRfbm8gPCBob3N0LT5uX3BvcnRzOyArK3BvcnRfbm8pIHsKIAkJdTggX19pb21lbSAqY2hhbiA9IG1taW9fYmFzZSArIChwb3J0X25vICogMHg0MDAwKTsKIAkJd3JpdGViKFFTX0NUUjFfUkRFVnxRU19DVFIxX1JDSE4sIGNoYW4gKyBRU19DQ1RfQ1RSMSk7CiAJCXdyaXRlYihRU19DVFIwX1JFRywgY2hhbiArIFFTX0NDVF9DVFIwKTsKQEAgLTU0Nyw3ICs1NDQsNyBAQAogCX0KIAl3cml0ZWIoUVNfU0VSRDNfUEhZX0VOQSwgbW1pb19iYXNlICsgUVNfSFZTX1NFUkQzKTsgLyogZW5hYmxlIHBoeSAqLwogCi0JZm9yIChwb3J0X25vID0gMDsgcG9ydF9ubyA8IHBlLT5uX3BvcnRzOyArK3BvcnRfbm8pIHsKKwlmb3IgKHBvcnRfbm8gPSAwOyBwb3J0X25vIDwgaG9zdC0+bl9wb3J0czsgKytwb3J0X25vKSB7CiAJCXU4IF9faW9tZW0gKmNoYW4gPSBtbWlvX2Jhc2UgKyAocG9ydF9ubyAqIDB4NDAwMCk7CiAJCS8qIHNldCBGSUZPIGRlcHRocyB0byBzYW1lIHNldHRpbmdzIGFzIFdpbmRvd3MgZHJpdmVyICovCiAJCXdyaXRldygzMiwgY2hhbiArIFFTX0NGQ19IVUZUKTsKQEAgLTYwNywxNCArNjA0LDIwIEBACiAJCQkJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKIHsKIAlzdGF0aWMgaW50IHByaW50ZWRfdmVyc2lvbjsKLQlzdHJ1Y3QgYXRhX3Byb2JlX2VudCAqcHJvYmVfZW50OwotCXZvaWQgX19pb21lbSAqIGNvbnN0ICppb21hcDsKIAl1bnNpZ25lZCBpbnQgYm9hcmRfaWR4ID0gKHVuc2lnbmVkIGludCkgZW50LT5kcml2ZXJfZGF0YTsKKwljb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqcHBpW10gPSB7ICZxc19wb3J0X2luZm9bYm9hcmRfaWR4XSwgTlVMTCB9OworCXN0cnVjdCBhdGFfaG9zdCAqaG9zdDsKIAlpbnQgcmMsIHBvcnRfbm87CiAKIAlpZiAoIXByaW50ZWRfdmVyc2lvbisrKQogCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZwZGV2LT5kZXYsICJ2ZXJzaW9uICIgRFJWX1ZFUlNJT04gIlxuIik7CiAKKwkvKiBhbGxvYyBob3N0ICovCisJaG9zdCA9IGF0YV9ob3N0X2FsbG9jX3BpbmZvKCZwZGV2LT5kZXYsIHBwaSwgUVNfUE9SVFMpOworCWlmICghaG9zdCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBhY3F1aXJlIHJlc291cmNlcyBhbmQgZmlsbCBob3N0ICovCiAJcmMgPSBwY2ltX2VuYWJsZV9kZXZpY2UocGRldik7CiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CkBAIC02MjUsNDcgKzYyOCwyNCBAQAogCXJjID0gcGNpbV9pb21hcF9yZWdpb25zKHBkZXYsIDEgPDwgUVNfTU1JT19CQVIsIERSVl9OQU1FKTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKLQlpb21hcCA9IHBjaW1faW9tYXBfdGFibGUocGRldik7CisJaG9zdC0+aW9tYXAgPSBwY2ltX2lvbWFwX3RhYmxlKHBkZXYpOwogCi0JcmMgPSBxc19zZXRfZG1hX21hc2tzKHBkZXYsIGlvbWFwW1FTX01NSU9fQkFSXSk7CisJcmMgPSBxc19zZXRfZG1hX21hc2tzKHBkZXYsIGhvc3QtPmlvbWFwW1FTX01NSU9fQkFSXSk7CiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CiAKLQlwcm9iZV9lbnQgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpwcm9iZV9lbnQpLCBHRlBfS0VSTkVMKTsKLQlpZiAocHJvYmVfZW50ID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcHJvYmVfZW50LT5kZXYgPSBwY2lfZGV2X3RvX2RldihwZGV2KTsKLQlJTklUX0xJU1RfSEVBRCgmcHJvYmVfZW50LT5ub2RlKTsKLQotCXByb2JlX2VudC0+c2h0CQk9IHFzX3BvcnRfaW5mb1tib2FyZF9pZHhdLnNodDsKLQlwcm9iZV9lbnQtPnBvcnRfZmxhZ3MJPSBxc19wb3J0X2luZm9bYm9hcmRfaWR4XS5mbGFnczsKLQlwcm9iZV9lbnQtPnBpb19tYXNrCT0gcXNfcG9ydF9pbmZvW2JvYXJkX2lkeF0ucGlvX21hc2s7Ci0JcHJvYmVfZW50LT5td2RtYV9tYXNrCT0gcXNfcG9ydF9pbmZvW2JvYXJkX2lkeF0ubXdkbWFfbWFzazsKLQlwcm9iZV9lbnQtPnVkbWFfbWFzawk9IHFzX3BvcnRfaW5mb1tib2FyZF9pZHhdLnVkbWFfbWFzazsKLQlwcm9iZV9lbnQtPnBvcnRfb3BzCT0gcXNfcG9ydF9pbmZvW2JvYXJkX2lkeF0ucG9ydF9vcHM7Ci0KLQlwcm9iZV9lbnQtPmlycQkJPSBwZGV2LT5pcnE7Ci0JcHJvYmVfZW50LT5pcnFfZmxhZ3MJPSBJUlFGX1NIQVJFRDsKLQlwcm9iZV9lbnQtPmlvbWFwCT0gaW9tYXA7Ci0JcHJvYmVfZW50LT5uX3BvcnRzCT0gUVNfUE9SVFM7Ci0KLQlmb3IgKHBvcnRfbm8gPSAwOyBwb3J0X25vIDwgcHJvYmVfZW50LT5uX3BvcnRzOyArK3BvcnRfbm8pIHsKKwlmb3IgKHBvcnRfbm8gPSAwOyBwb3J0X25vIDwgaG9zdC0+bl9wb3J0czsgKytwb3J0X25vKSB7CiAJCXZvaWQgX19pb21lbSAqY2hhbiA9Ci0JCQlwcm9iZV9lbnQtPmlvbWFwW1FTX01NSU9fQkFSXSArIChwb3J0X25vICogMHg0MDAwKTsKLQkJcXNfYXRhX3NldHVwX3BvcnQoJnByb2JlX2VudC0+cG9ydFtwb3J0X25vXSwgY2hhbik7CisJCQlob3N0LT5pb21hcFtRU19NTUlPX0JBUl0gKyAocG9ydF9ubyAqIDB4NDAwMCk7CisJCXFzX2F0YV9zZXR1cF9wb3J0KCZob3N0LT5wb3J0c1twb3J0X25vXS0+aW9hZGRyLCBjaGFuKTsKIAl9CiAKLQlwY2lfc2V0X21hc3RlcihwZGV2KTsKLQogCS8qIGluaXRpYWxpemUgYWRhcHRlciAqLwotCXFzX2hvc3RfaW5pdChib2FyZF9pZHgsIHByb2JlX2VudCk7CisJcXNfaG9zdF9pbml0KGhvc3QsIGJvYXJkX2lkeCk7CiAKLQlpZiAoYXRhX2RldmljZV9hZGQocHJvYmVfZW50KSAhPSBRU19QT1JUUykKLQkJcmV0dXJuIC1FSU87Ci0KLQlkZXZtX2tmcmVlKCZwZGV2LT5kZXYsIHByb2JlX2VudCk7Ci0JcmV0dXJuIDA7CisJcGNpX3NldF9tYXN0ZXIocGRldik7CisJcmV0dXJuIGF0YV9ob3N0X2FjdGl2YXRlKGhvc3QsIHBkZXYtPmlycSwgcXNfaW50ciwgSVJRRl9TSEFSRUQsCisJCQkJICZxc19hdGFfc2h0KTsKIH0KIAogc3RhdGljIGludCBfX2luaXQgcXNfYXRhX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3NhdGFfc2lsLmMgYi9kcml2ZXJzL2F0YS9zYXRhX3NpbC5jCmluZGV4IDkxN2I3ZWEuLjBhMWU0MTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3NhdGFfc2lsLmMKKysrIGIvZHJpdmVycy9hdGEvc2F0YV9zaWwuYwpAQCAtNDYsNyArNDYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpYmF0YS5oPgogCiAjZGVmaW5lIERSVl9OQU1FCSJzYXRhX3NpbCIKLSNkZWZpbmUgRFJWX1ZFUlNJT04JIjIuMSIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjIuMiIKIAogZW51bSB7CiAJU0lMX01NSU9fQkFSCQk9IDUsCkBAIC0xMTQsMTEgKzExNCwxMCBAQAogI2lmZGVmIENPTkZJR19QTQogc3RhdGljIGludCBzaWxfcGNpX2RldmljZV9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBkZXYpOwogI2VuZGlmCi1zdGF0aWMgdm9pZCBzaWxfZGV2X2NvbmZpZyhzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHNpbF9kZXZfY29uZmlnKHN0cnVjdCBhdGFfZGV2aWNlICpkZXYpOwogc3RhdGljIHUzMiBzaWxfc2NyX3JlYWQgKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCBzY19yZWcpOwogc3RhdGljIHZvaWQgc2lsX3Njcl93cml0ZSAoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IHNjX3JlZywgdTMyIHZhbCk7Ci1zdGF0aWMgdm9pZCBzaWxfcG9zdF9zZXRfbW9kZSAoc3RydWN0IGF0YV9wb3J0ICphcCk7Ci1zdGF0aWMgaXJxcmV0dXJuX3Qgc2lsX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UpOworc3RhdGljIGludCBzaWxfc2V0X21vZGUgKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfZGV2aWNlICoqcl9mYWlsZWQpOwogc3RhdGljIHZvaWQgc2lsX2ZyZWV6ZShzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKIHN0YXRpYyB2b2lkIHNpbF90aGF3KHN0cnVjdCBhdGFfcG9ydCAqYXApOwogCkBAIC0xOTcsNyArMTk2LDcgQEAKIAkuY2hlY2tfc3RhdHVzCQk9IGF0YV9jaGVja19zdGF0dXMsCiAJLmV4ZWNfY29tbWFuZAkJPSBhdGFfZXhlY19jb21tYW5kLAogCS5kZXZfc2VsZWN0CQk9IGF0YV9zdGRfZGV2X3NlbGVjdCwKLQkucG9zdF9zZXRfbW9kZQkJPSBzaWxfcG9zdF9zZXRfbW9kZSwKKwkuc2V0X21vZGUJCT0gc2lsX3NldF9tb2RlLAogCS5ibWRtYV9zZXR1cCAgICAgICAgICAgID0gYXRhX2JtZG1hX3NldHVwLAogCS5ibWRtYV9zdGFydCAgICAgICAgICAgID0gYXRhX2JtZG1hX3N0YXJ0LAogCS5ibWRtYV9zdG9wCQk9IGF0YV9ibWRtYV9zdG9wLApAQCAtMjA5LDcgKzIwOCw2IEBACiAJLnRoYXcJCQk9IHNpbF90aGF3LAogCS5lcnJvcl9oYW5kbGVyCQk9IGF0YV9ibWRtYV9lcnJvcl9oYW5kbGVyLAogCS5wb3N0X2ludGVybmFsX2NtZAk9IGF0YV9ibWRtYV9wb3N0X2ludGVybmFsX2NtZCwKLQkuaXJxX2hhbmRsZXIJCT0gc2lsX2ludGVycnVwdCwKIAkuaXJxX2NsZWFyCQk9IGF0YV9ibWRtYV9pcnFfY2xlYXIsCiAJLmlycV9vbgkJCT0gYXRhX2lycV9vbiwKIAkuaXJxX2FjawkJPSBhdGFfaXJxX2FjaywKQEAgLTIyMSw3ICsyMTksNiBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvIHNpbF9wb3J0X2luZm9bXSA9IHsKIAkvKiBzaWxfMzExMiAqLwogCXsKLQkJLnNodAkJPSAmc2lsX3NodCwKIAkJLmZsYWdzCQk9IFNJTF9ERkxfUE9SVF9GTEFHUyB8IFNJTF9GTEFHX01PRDE1V1JJVEUsCiAJCS5waW9fbWFzawk9IDB4MWYsCQkJLyogcGlvMC00ICovCiAJCS5td2RtYV9tYXNrCT0gMHgwNywJCQkvKiBtd2RtYTAtMiAqLwpAQCAtMjMwLDcgKzIyNyw2IEBACiAJfSwKIAkvKiBzaWxfMzExMl9ub19zYXRhX2lycSAqLwogCXsKLQkJLnNodAkJPSAmc2lsX3NodCwKIAkJLmZsYWdzCQk9IFNJTF9ERkxfUE9SVF9GTEFHUyB8IFNJTF9GTEFHX01PRDE1V1JJVEUgfAogCQkJCSAgU0lMX0ZMQUdfTk9fU0FUQV9JUlEsCiAJCS5waW9fbWFzawk9IDB4MWYsCQkJLyogcGlvMC00ICovCkBAIC0yNDAsNyArMjM2LDYgQEAKIAl9LAogCS8qIHNpbF8zNTEyICovCiAJewotCQkuc2h0CQk9ICZzaWxfc2h0LAogCQkuZmxhZ3MJCT0gU0lMX0RGTF9QT1JUX0ZMQUdTIHwgU0lMX0ZMQUdfUkVSUl9PTl9ETUFfQUNULAogCQkucGlvX21hc2sJPSAweDFmLAkJCS8qIHBpbzAtNCAqLwogCQkubXdkbWFfbWFzawk9IDB4MDcsCQkJLyogbXdkbWEwLTIgKi8KQEAgLTI0OSw3ICsyNDQsNiBAQAogCX0sCiAJLyogc2lsXzMxMTQgKi8KIAl7Ci0JCS5zaHQJCT0gJnNpbF9zaHQsCiAJCS5mbGFncwkJPSBTSUxfREZMX1BPUlRfRkxBR1MgfCBTSUxfRkxBR19SRVJSX09OX0RNQV9BQ1QsCiAJCS5waW9fbWFzawk9IDB4MWYsCQkJLyogcGlvMC00ICovCiAJCS5td2RtYV9tYXNrCT0gMHgwNywJCQkvKiBtd2RtYTAtMiAqLwpAQCAtMjk3LDcgKzI5MSwxNiBAQAogCXJldHVybiBjYWNoZV9saW5lOwogfQogCi1zdGF0aWMgdm9pZCBzaWxfcG9zdF9zZXRfbW9kZSAoc3RydWN0IGF0YV9wb3J0ICphcCkKKy8qKgorICoJc2lsX3NldF9tb2RlCQktCXdyYXAgc2V0X21vZGUgZnVuY3Rpb25zCisgKglAYXA6IHBvcnQgdG8gc2V0IHVwCisgKglAcl9mYWlsZWQ6IHJldHVybmVkIGRldmljZSB3aGVuIHdlIGZhaWwKKyAqCisgKglXcmFwIHRoZSBsaWJhdGEgbWV0aG9kIGZvciBkZXZpY2Ugc2V0dXAgYXMgYWZ0ZXIgdGhlIHNldHVwIHdlIG5lZWQKKyAqCXRvIGluc3BlY3QgdGhlIHJlc3VsdHMgYW5kIGRvIHNvbWUgY29uZmlndXJhdGlvbiB3b3JrCisgKi8KKworc3RhdGljIGludCBzaWxfc2V0X21vZGUgKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfZGV2aWNlICoqcl9mYWlsZWQpCiB7CiAJc3RydWN0IGF0YV9ob3N0ICpob3N0ID0gYXAtPmhvc3Q7CiAJc3RydWN0IGF0YV9kZXZpY2UgKmRldjsKQEAgLTMwNSw2ICszMDgsMTEgQEAKIAl2b2lkIF9faW9tZW0gKmFkZHIgPSBtbWlvX2Jhc2UgKyBzaWxfcG9ydFthcC0+cG9ydF9ub10ueGZlcl9tb2RlOwogCXUzMiB0bXAsIGRldl9tb2RlWzJdOwogCXVuc2lnbmVkIGludCBpOworCWludCByYzsKKwkKKwlyYyA9IGF0YV9kb19zZXRfbW9kZShhcCwgcl9mYWlsZWQpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOwogCiAJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewogCQlkZXYgPSAmYXAtPmRldmljZVtpXTsKQEAgLTMyMyw2ICszMzEsNyBAQAogCXRtcCB8PSAoZGV2X21vZGVbMV0gPDwgNCk7CiAJd3JpdGVsKHRtcCwgYWRkcik7CiAJcmVhZGwoYWRkcik7CS8qIGZsdXNoICovCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBfX2lvbWVtICpzaWxfc2NyX2FkZHIoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IHNjX3JlZykKQEAgLTUyMSw3ICs1MzAsNiBAQAogCiAvKioKICAqCXNpbF9kZXZfY29uZmlnIC0gQXBwbHkgZGV2aWNlL2hvc3Qtc3BlY2lmaWMgZXJyYXRhIGZpeHVwcwotICoJQGFwOiBQb3J0IGNvbnRhaW5pbmcgZGV2aWNlIHRvIGJlIGV4YW1pbmVkCiAgKglAZGV2OiBEZXZpY2UgdG8gYmUgZXhhbWluZWQKICAqCiAgKglBZnRlciB0aGUgSURFTlRJRlkgW1BBQ0tFVF0gREVWSUNFIHN0ZXAgaXMgY29tcGxldGUsIGFuZCBhCkBAIC01NDgsOCArNTU2LDkgQEAKICAqCWFwcHJlY2lhdGVkLgogICoJLSBCdXQgdGhlbiBhZ2FpbiBVRE1BNSBpcyBoYXJkbHkgYW55dGhpbmcgdG8gY29tcGxhaW4gYWJvdXQKICAqLwotc3RhdGljIHZvaWQgc2lsX2Rldl9jb25maWcoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV9kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIHNpbF9kZXZfY29uZmlnKHN0cnVjdCBhdGFfZGV2aWNlICpkZXYpCiB7CisJc3RydWN0IGF0YV9wb3J0ICphcCA9IGRldi0+YXA7CiAJaW50IHByaW50X2luZm8gPSBhcC0+ZWhfY29udGV4dC5pLmZsYWdzICYgQVRBX0VISV9QUklOVElORk87CiAJdW5zaWduZWQgaW50IG4sIHF1aXJrcyA9IDA7CiAJdW5zaWduZWQgY2hhciBtb2RlbF9udW1bQVRBX0lEX1BST0RfTEVOICsgMV07CkBAIC01ODMsMTAgKzU5MiwxMCBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgc2lsX2luaXRfY29udHJvbGxlcihzdHJ1Y3QgcGNpX2RldiAqcGRldiwKLQkJCQlpbnQgbl9wb3J0cywgdW5zaWduZWQgbG9uZyBwb3J0X2ZsYWdzLAotCQkJCXZvaWQgX19pb21lbSAqbW1pb19iYXNlKQorc3RhdGljIHZvaWQgc2lsX2luaXRfY29udHJvbGxlcihzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QpCiB7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGhvc3QtPmRldik7CisJdm9pZCBfX2lvbWVtICptbWlvX2Jhc2UgPSBob3N0LT5pb21hcFtTSUxfTU1JT19CQVJdOwogCXU4IGNsczsKIAl1MzIgdG1wOwogCWludCBpOwpAQCAtNTk2LDcgKzYwNSw3IEBACiAJaWYgKGNscykgewogCQljbHMgPj49IDM7CiAJCWNscysrOyAgLyogY2xzID0gKGxpbmVfc2l6ZS84KSsxICovCi0JCWZvciAoaSA9IDA7IGkgPCBuX3BvcnRzOyBpKyspCisJCWZvciAoaSA9IDA7IGkgPCBob3N0LT5uX3BvcnRzOyBpKyspCiAJCQl3cml0ZXcoY2xzIDw8IDggfCBjbHMsCiAJCQkgICAgICAgbW1pb19iYXNlICsgc2lsX3BvcnRbaV0uZmlmb19jZmcpOwogCX0gZWxzZQpAQCAtNjA0LDEwICs2MTMsMTAgQEAKIAkJCSAgICJjYWNoZSBsaW5lIHNpemUgbm90IHNldC4gIERyaXZlciBtYXkgbm90IGZ1bmN0aW9uXG4iKTsKIAogCS8qIEFwcGx5IFJfRVJSIG9uIERNQSBhY3RpdmF0ZSBGSVMgZXJyYXRhIHdvcmthcm91bmQgKi8KLQlpZiAocG9ydF9mbGFncyAmIFNJTF9GTEFHX1JFUlJfT05fRE1BX0FDVCkgeworCWlmIChob3N0LT5wb3J0c1swXS0+ZmxhZ3MgJiBTSUxfRkxBR19SRVJSX09OX0RNQV9BQ1QpIHsKIAkJaW50IGNudDsKIAotCQlmb3IgKGkgPSAwLCBjbnQgPSAwOyBpIDwgbl9wb3J0czsgaSsrKSB7CisJCWZvciAoaSA9IDAsIGNudCA9IDA7IGkgPCBob3N0LT5uX3BvcnRzOyBpKyspIHsKIAkJCXRtcCA9IHJlYWRsKG1taW9fYmFzZSArIHNpbF9wb3J0W2ldLnNmaXNfY2ZnKTsKIAkJCWlmICgodG1wICYgMHgzKSAhPSAweDAxKQogCQkJCWNvbnRpbnVlOwpAQCAtNjIwLDcgKzYyOSw3IEBACiAJCX0KIAl9CiAKLQlpZiAobl9wb3J0cyA9PSA0KSB7CisJaWYgKGhvc3QtPm5fcG9ydHMgPT0gNCkgewogCQkvKiBmbGlwIHRoZSBtYWdpYyAibWFrZSA0IHBvcnRzIHdvcmsiIGJpdCAqLwogCQl0bXAgPSByZWFkbChtbWlvX2Jhc2UgKyBzaWxfcG9ydFsyXS5ibWRtYSk7CiAJCWlmICgodG1wICYgU0lMX0lOVFJfU1RFRVJJTkcpID09IDApCkBAIC02MzIsMTUgKzY0MSwyNiBAQAogc3RhdGljIGludCBzaWxfaW5pdF9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQogewogCXN0YXRpYyBpbnQgcHJpbnRlZF92ZXJzaW9uOwotCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7Ci0Jc3RydWN0IGF0YV9wcm9iZV9lbnQgKnByb2JlX2VudDsKKwlpbnQgYm9hcmRfaWQgPSBlbnQtPmRyaXZlcl9kYXRhOworCWNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvICpwcGlbXSA9IHsgJnNpbF9wb3J0X2luZm9bYm9hcmRfaWRdLCBOVUxMIH07CisJc3RydWN0IGF0YV9ob3N0ICpob3N0OwogCXZvaWQgX19pb21lbSAqbW1pb19iYXNlOwotCWludCByYzsKKwlpbnQgbl9wb3J0cywgcmM7CiAJdW5zaWduZWQgaW50IGk7CiAKIAlpZiAoIXByaW50ZWRfdmVyc2lvbisrKQogCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZwZGV2LT5kZXYsICJ2ZXJzaW9uICIgRFJWX1ZFUlNJT04gIlxuIik7CiAKKwkvKiBhbGxvY2F0ZSBob3N0ICovCisJbl9wb3J0cyA9IDI7CisJaWYgKGJvYXJkX2lkID09IHNpbF8zMTE0KQorCQluX3BvcnRzID0gNDsKKworCWhvc3QgPSBhdGFfaG9zdF9hbGxvY19waW5mbygmcGRldi0+ZGV2LCBwcGksIG5fcG9ydHMpOworCWlmICghaG9zdCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBhY3F1aXJlIHJlc291cmNlcyBhbmQgZmlsbCBob3N0ICovCiAJcmMgPSBwY2ltX2VuYWJsZV9kZXZpY2UocGRldik7CiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CkBAIC02NTAsNiArNjcwLDcgQEAKIAkJcGNpbV9waW5fZGV2aWNlKHBkZXYpOwogCWlmIChyYykKIAkJcmV0dXJuIHJjOworCWhvc3QtPmlvbWFwID0gcGNpbV9pb21hcF90YWJsZShwZGV2KTsKIAogCXJjID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBBVEFfRE1BX01BU0spOwogCWlmIChyYykKQEAgLTY1OCw0NSArNjc5LDI1IEBACiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CiAKLQlwcm9iZV9lbnQgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKnByb2JlX2VudCksIEdGUF9LRVJORUwpOwotCWlmIChwcm9iZV9lbnQgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07CisJbW1pb19iYXNlID0gaG9zdC0+aW9tYXBbU0lMX01NSU9fQkFSXTsKIAotCUlOSVRfTElTVF9IRUFEKCZwcm9iZV9lbnQtPm5vZGUpOwotCXByb2JlX2VudC0+ZGV2ID0gcGNpX2Rldl90b19kZXYocGRldik7Ci0JcHJvYmVfZW50LT5wb3J0X29wcyA9IHNpbF9wb3J0X2luZm9bZW50LT5kcml2ZXJfZGF0YV0ucG9ydF9vcHM7Ci0JcHJvYmVfZW50LT5zaHQgPSBzaWxfcG9ydF9pbmZvW2VudC0+ZHJpdmVyX2RhdGFdLnNodDsKLQlwcm9iZV9lbnQtPm5fcG9ydHMgPSAoZW50LT5kcml2ZXJfZGF0YSA9PSBzaWxfMzExNCkgPyA0IDogMjsKLQlwcm9iZV9lbnQtPnBpb19tYXNrID0gc2lsX3BvcnRfaW5mb1tlbnQtPmRyaXZlcl9kYXRhXS5waW9fbWFzazsKLQlwcm9iZV9lbnQtPm13ZG1hX21hc2sgPSBzaWxfcG9ydF9pbmZvW2VudC0+ZHJpdmVyX2RhdGFdLm13ZG1hX21hc2s7Ci0JcHJvYmVfZW50LT51ZG1hX21hc2sgPSBzaWxfcG9ydF9pbmZvW2VudC0+ZHJpdmVyX2RhdGFdLnVkbWFfbWFzazsKLSAgICAgICAJcHJvYmVfZW50LT5pcnEgPSBwZGV2LT5pcnE7Ci0gICAgICAgCXByb2JlX2VudC0+aXJxX2ZsYWdzID0gSVJRRl9TSEFSRUQ7Ci0JcHJvYmVfZW50LT5wb3J0X2ZsYWdzID0gc2lsX3BvcnRfaW5mb1tlbnQtPmRyaXZlcl9kYXRhXS5mbGFnczsKKwlmb3IgKGkgPSAwOyBpIDwgaG9zdC0+bl9wb3J0czsgaSsrKSB7CisJCXN0cnVjdCBhdGFfaW9wb3J0cyAqaW9hZGRyID0gJmhvc3QtPnBvcnRzW2ldLT5pb2FkZHI7CiAKLQlwcm9iZV9lbnQtPmlvbWFwID0gcGNpbV9pb21hcF90YWJsZShwZGV2KTsKLQotCW1taW9fYmFzZSA9IHByb2JlX2VudC0+aW9tYXBbU0lMX01NSU9fQkFSXTsKLQotCWZvciAoaSA9IDA7IGkgPCBwcm9iZV9lbnQtPm5fcG9ydHM7IGkrKykgewotCQlwcm9iZV9lbnQtPnBvcnRbaV0uY21kX2FkZHIgPSBtbWlvX2Jhc2UgKyBzaWxfcG9ydFtpXS50ZjsKLQkJcHJvYmVfZW50LT5wb3J0W2ldLmFsdHN0YXR1c19hZGRyID0KLQkJcHJvYmVfZW50LT5wb3J0W2ldLmN0bF9hZGRyID0gbW1pb19iYXNlICsgc2lsX3BvcnRbaV0uY3RsOwotCQlwcm9iZV9lbnQtPnBvcnRbaV0uYm1kbWFfYWRkciA9IG1taW9fYmFzZSArIHNpbF9wb3J0W2ldLmJtZG1hOwotCQlwcm9iZV9lbnQtPnBvcnRbaV0uc2NyX2FkZHIgPSBtbWlvX2Jhc2UgKyBzaWxfcG9ydFtpXS5zY3I7Ci0JCWF0YV9zdGRfcG9ydHMoJnByb2JlX2VudC0+cG9ydFtpXSk7CisJCWlvYWRkci0+Y21kX2FkZHIgPSBtbWlvX2Jhc2UgKyBzaWxfcG9ydFtpXS50ZjsKKwkJaW9hZGRyLT5hbHRzdGF0dXNfYWRkciA9CisJCWlvYWRkci0+Y3RsX2FkZHIgPSBtbWlvX2Jhc2UgKyBzaWxfcG9ydFtpXS5jdGw7CisJCWlvYWRkci0+Ym1kbWFfYWRkciA9IG1taW9fYmFzZSArIHNpbF9wb3J0W2ldLmJtZG1hOworCQlpb2FkZHItPnNjcl9hZGRyID0gbW1pb19iYXNlICsgc2lsX3BvcnRbaV0uc2NyOworCQlhdGFfc3RkX3BvcnRzKGlvYWRkcik7CiAJfQogCi0Jc2lsX2luaXRfY29udHJvbGxlcihwZGV2LCBwcm9iZV9lbnQtPm5fcG9ydHMsIHByb2JlX2VudC0+cG9ydF9mbGFncywKLQkJCSAgICBtbWlvX2Jhc2UpOworCS8qIGluaXRpYWxpemUgYW5kIGFjdGl2YXRlICovCisJc2lsX2luaXRfY29udHJvbGxlcihob3N0KTsKIAogCXBjaV9zZXRfbWFzdGVyKHBkZXYpOwotCi0JaWYgKCFhdGFfZGV2aWNlX2FkZChwcm9iZV9lbnQpKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCWRldm1fa2ZyZWUoZGV2LCBwcm9iZV9lbnQpOwotCXJldHVybiAwOworCXJldHVybiBhdGFfaG9zdF9hY3RpdmF0ZShob3N0LCBwZGV2LT5pcnEsIHNpbF9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAorCQkJCSAmc2lsX3NodCk7CiB9CiAKICNpZmRlZiBDT05GSUdfUE0KQEAgLTcwOSw4ICs3MTAsNyBAQAogCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCi0Jc2lsX2luaXRfY29udHJvbGxlcihwZGV2LCBob3N0LT5uX3BvcnRzLCBob3N0LT5wb3J0c1swXS0+ZmxhZ3MsCi0JCQkgICAgaG9zdC0+aW9tYXBbU0lMX01NSU9fQkFSXSk7CisJc2lsX2luaXRfY29udHJvbGxlcihob3N0KTsKIAlhdGFfaG9zdF9yZXN1bWUoaG9zdCk7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3NhdGFfc2lsMjQuYyBiL2RyaXZlcnMvYXRhL3NhdGFfc2lsMjQuYwppbmRleCA1NjE0ZGY4Li5lNjIyM2JhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9zYXRhX3NpbDI0LmMKKysrIGIvZHJpdmVycy9hdGEvc2F0YV9zaWwyNC5jCkBAIC0zMjMsNyArMzIzLDcgQEAKIAlzdHJ1Y3QgYXRhX3Rhc2tmaWxlIHRmOwkJCS8qIENhY2hlZCB0YXNrZmlsZSByZWdpc3RlcnMgKi8KIH07CiAKLXN0YXRpYyB2b2lkIHNpbDI0X2Rldl9jb25maWcoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBzaWwyNF9kZXZfY29uZmlnKHN0cnVjdCBhdGFfZGV2aWNlICpkZXYpOwogc3RhdGljIHU4IHNpbDI0X2NoZWNrX3N0YXR1cyhzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKIHN0YXRpYyB1MzIgc2lsMjRfc2NyX3JlYWQoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgc2NfcmVnKTsKIHN0YXRpYyB2b2lkIHNpbDI0X3Njcl93cml0ZShzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBzY19yZWcsIHUzMiB2YWwpOwpAQCAtMzMxLDcgKzMzMSw2IEBACiBzdGF0aWMgdm9pZCBzaWwyNF9xY19wcmVwKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpOwogc3RhdGljIHVuc2lnbmVkIGludCBzaWwyNF9xY19pc3N1ZShzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKTsKIHN0YXRpYyB2b2lkIHNpbDI0X2lycV9jbGVhcihzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKLXN0YXRpYyBpcnFyZXR1cm5fdCBzaWwyNF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlKTsKIHN0YXRpYyB2b2lkIHNpbDI0X2ZyZWV6ZShzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKIHN0YXRpYyB2b2lkIHNpbDI0X3RoYXcoc3RydWN0IGF0YV9wb3J0ICphcCk7CiBzdGF0aWMgdm9pZCBzaWwyNF9lcnJvcl9oYW5kbGVyKHN0cnVjdCBhdGFfcG9ydCAqYXApOwpAQCAtNDAxLDcgKzQwMCw2IEBACiAJLnFjX3ByZXAJCT0gc2lsMjRfcWNfcHJlcCwKIAkucWNfaXNzdWUJCT0gc2lsMjRfcWNfaXNzdWUsCiAKLQkuaXJxX2hhbmRsZXIJCT0gc2lsMjRfaW50ZXJydXB0LAogCS5pcnFfY2xlYXIJCT0gc2lsMjRfaXJxX2NsZWFyLAogCS5pcnFfb24JCQk9IGF0YV9kdW1teV9pcnFfb24sCiAJLmlycV9hY2sJCT0gYXRhX2R1bW15X2lycV9hY2ssCkBAIC00MjQsMTAgKzQyMiw5IEBACiAjZGVmaW5lIFNJTDI0X05QT1JUUzJGTEFHKG5wb3J0cykJKCgoKHVuc2lnbmVkKShucG9ydHMpIC0gMSkgJiAweDMpIDw8IDMwKQogI2RlZmluZSBTSUwyNF9GTEFHMk5QT1JUUyhmbGFnKQkJKCgoKGZsYWcpID4+IDMwKSAmIDB4MykgKyAxKQogCi1zdGF0aWMgc3RydWN0IGF0YV9wb3J0X2luZm8gc2lsMjRfcG9ydF9pbmZvW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gc2lsMjRfcG9ydF9pbmZvW10gPSB7CiAJLyogc2lsXzMxMjQgKi8KIAl7Ci0JCS5zaHQJCT0gJnNpbDI0X3NodCwKIAkJLmZsYWdzCQk9IFNJTDI0X0NPTU1PTl9GTEFHUyB8IFNJTDI0X05QT1JUUzJGTEFHKDQpIHwKIAkJCQkgIFNJTDI0X0ZMQUdfUENJWF9JUlFfV09DLAogCQkucGlvX21hc2sJPSAweDFmLAkJCS8qIHBpbzAtNCAqLwpAQCAtNDM3LDcgKzQzNCw2IEBACiAJfSwKIAkvKiBzaWxfMzEzMiAqLwogCXsKLQkJLnNodAkJPSAmc2lsMjRfc2h0LAogCQkuZmxhZ3MJCT0gU0lMMjRfQ09NTU9OX0ZMQUdTIHwgU0lMMjRfTlBPUlRTMkZMQUcoMiksCiAJCS5waW9fbWFzawk9IDB4MWYsCQkJLyogcGlvMC00ICovCiAJCS5td2RtYV9tYXNrCT0gMHgwNywJCQkvKiBtd2RtYTAtMiAqLwpAQCAtNDQ2LDcgKzQ0Miw2IEBACiAJfSwKIAkvKiBzaWxfMzEzMS9zaWxfMzUzMSAqLwogCXsKLQkJLnNodAkJPSAmc2lsMjRfc2h0LAogCQkuZmxhZ3MJCT0gU0lMMjRfQ09NTU9OX0ZMQUdTIHwgU0lMMjRfTlBPUlRTMkZMQUcoMSksCiAJCS5waW9fbWFzawk9IDB4MWYsCQkJLyogcGlvMC00ICovCiAJCS5td2RtYV9tYXNrCT0gMHgwNywJCQkvKiBtd2RtYTAtMiAqLwpAQCAtNDYyLDkgKzQ1Nyw5IEBACiAJcmV0dXJuIHRhZzsKIH0KIAotc3RhdGljIHZvaWQgc2lsMjRfZGV2X2NvbmZpZyhzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX2RldmljZSAqZGV2KQorc3RhdGljIHZvaWQgc2lsMjRfZGV2X2NvbmZpZyhzdHJ1Y3QgYXRhX2RldmljZSAqZGV2KQogewotCXZvaWQgX19pb21lbSAqcG9ydCA9IGFwLT5pb2FkZHIuY21kX2FkZHI7CisJdm9pZCBfX2lvbWVtICpwb3J0ID0gZGV2LT5hcC0+aW9hZGRyLmNtZF9hZGRyOwogCiAJaWYgKGRldi0+Y2RiX2xlbiA9PSAxNikKIAkJd3JpdGVsKFBPUlRfQ1NfQ0RCMTYsIHBvcnQgKyBQT1JUX0NUUkxfU1RBVCk7CkBAIC05MjQsMTEgKzkxOSw4IEBACiB7CiAJc3RydWN0IGF0YV9wb3J0ICphcCA9IHFjLT5hcDsKIAotCWlmIChxYy0+ZmxhZ3MgJiBBVEFfUUNGTEFHX0ZBSUxFRCkKLQkJcWMtPmVycl9tYXNrIHw9IEFDX0VSUl9PVEhFUjsKLQogCS8qIG1ha2UgRE1BIGVuZ2luZSBmb3JnZXQgYWJvdXQgdGhlIGZhaWxlZCBjb21tYW5kICovCi0JaWYgKHFjLT5lcnJfbWFzaykKKwlpZiAocWMtPmZsYWdzICYgQVRBX1FDRkxBR19GQUlMRUQpCiAJCXNpbDI0X2luaXRfcG9ydChhcCk7CiB9CiAKQEAgLTk2NCwxMSArOTU2LDEwIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHNpbDI0X2luaXRfY29udHJvbGxlcihzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IG5fcG9ydHMsCi0JCQkJICB1bnNpZ25lZCBsb25nIHBvcnRfZmxhZ3MsCi0JCQkJICB2b2lkIF9faW9tZW0gKmhvc3RfYmFzZSwKLQkJCQkgIHZvaWQgX19pb21lbSAqcG9ydF9iYXNlKQorc3RhdGljIHZvaWQgc2lsMjRfaW5pdF9jb250cm9sbGVyKHN0cnVjdCBhdGFfaG9zdCAqaG9zdCkKIHsKKwl2b2lkIF9faW9tZW0gKmhvc3RfYmFzZSA9IGhvc3QtPmlvbWFwW1NJTDI0X0hPU1RfQkFSXTsKKwl2b2lkIF9faW9tZW0gKnBvcnRfYmFzZSA9IGhvc3QtPmlvbWFwW1NJTDI0X1BPUlRfQkFSXTsKIAl1MzIgdG1wOwogCWludCBpOwogCkBAIC05NzksNyArOTcwLDcgQEAKIAl3cml0ZWwoMCwgaG9zdF9iYXNlICsgSE9TVF9DVFJMKTsKIAogCS8qIGluaXQgcG9ydHMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgbl9wb3J0czsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IGhvc3QtPm5fcG9ydHM7IGkrKykgewogCQl2b2lkIF9faW9tZW0gKnBvcnQgPSBwb3J0X2Jhc2UgKyBpICogUE9SVF9SRUdTX1NJWkU7CiAKIAkJLyogSW5pdGlhbCBQSFkgc2V0dGluZyAqLwpAQCAtOTkzLDEyICs5ODQsMTIgQEAKIAkJCQkJCVBPUlRfQ1NfUE9SVF9SU1QsCiAJCQkJCQlQT1JUX0NTX1BPUlRfUlNULCAxMCwgMTAwKTsKIAkJCWlmICh0bXAgJiBQT1JUX0NTX1BPUlRfUlNUKQotCQkJCWRldl9wcmludGsoS0VSTl9FUlIsICZwZGV2LT5kZXYsCisJCQkJZGV2X3ByaW50ayhLRVJOX0VSUiwgaG9zdC0+ZGV2LAogCQkJCSAgICAgICAgICAgImZhaWxlZCB0byBjbGVhciBwb3J0IFJTVFxuIik7CiAJCX0KIAogCQkvKiBDb25maWd1cmUgSVJRIFdvQyAqLwotCQlpZiAocG9ydF9mbGFncyAmIFNJTDI0X0ZMQUdfUENJWF9JUlFfV09DKQorCQlpZiAoaG9zdC0+cG9ydHNbMF0tPmZsYWdzICYgU0lMMjRfRkxBR19QQ0lYX0lSUV9XT0MpCiAJCQl3cml0ZWwoUE9SVF9DU19JUlFfV09DLCBwb3J0ICsgUE9SVF9DVFJMX1NUQVQpOwogCQllbHNlCiAJCQl3cml0ZWwoUE9SVF9DU19JUlFfV09DLCBwb3J0ICsgUE9SVF9DVFJMX0NMUik7CkBAIC0xMDI2LDE4ICsxMDE3LDE3IEBACiBzdGF0aWMgaW50IHNpbDI0X2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQogewogCXN0YXRpYyBpbnQgcHJpbnRlZF92ZXJzaW9uID0gMDsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OwotCXVuc2lnbmVkIGludCBib2FyZF9pZCA9ICh1bnNpZ25lZCBpbnQpZW50LT5kcml2ZXJfZGF0YTsKLQlzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqcGluZm8gPSAmc2lsMjRfcG9ydF9pbmZvW2JvYXJkX2lkXTsKLQlzdHJ1Y3QgYXRhX3Byb2JlX2VudCAqcHJvYmVfZW50OwotCXZvaWQgX19pb21lbSAqaG9zdF9iYXNlOwotCXZvaWQgX19pb21lbSAqcG9ydF9iYXNlOworCXN0cnVjdCBhdGFfcG9ydF9pbmZvIHBpID0gc2lsMjRfcG9ydF9pbmZvW2VudC0+ZHJpdmVyX2RhdGFdOworCWNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvICpwcGlbXSA9IHsgJnBpLCBOVUxMIH07CisJdm9pZCBfX2lvbWVtICogY29uc3QgKmlvbWFwOworCXN0cnVjdCBhdGFfaG9zdCAqaG9zdDsKIAlpbnQgaSwgcmM7CiAJdTMyIHRtcDsKIAogCWlmICghcHJpbnRlZF92ZXJzaW9uKyspCiAJCWRldl9wcmludGsoS0VSTl9ERUJVRywgJnBkZXYtPmRldiwgInZlcnNpb24gIiBEUlZfVkVSU0lPTiAiXG4iKTsKIAorCS8qIGFjcXVpcmUgcmVzb3VyY2VzICovCiAJcmMgPSBwY2ltX2VuYWJsZV9kZXZpY2UocGRldik7CiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CkBAIC0xMDQ3LDMzICsxMDM3LDM2IEBACiAJCQkJRFJWX05BTUUpOwogCWlmIChyYykKIAkJcmV0dXJuIHJjOworCWlvbWFwID0gcGNpbV9pb21hcF90YWJsZShwZGV2KTsKIAotCS8qIGFsbG9jYXRlICYgaW5pdCBwcm9iZV9lbnQgKi8KLQlwcm9iZV9lbnQgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKnByb2JlX2VudCksIEdGUF9LRVJORUwpOwotCWlmICghcHJvYmVfZW50KQorCS8qIGFwcGx5IHdvcmthcm91bmQgZm9yIGNvbXBsZXRpb24gSVJRIGxvc3Mgb24gUENJLVggZXJyYXRhICovCisJaWYgKHBpLmZsYWdzICYgU0lMMjRfRkxBR19QQ0lYX0lSUV9XT0MpIHsKKwkJdG1wID0gcmVhZGwoaW9tYXBbU0lMMjRfSE9TVF9CQVJdICsgSE9TVF9DVFJMKTsKKwkJaWYgKHRtcCAmIChIT1NUX0NUUkxfVFJEWSB8IEhPU1RfQ1RSTF9TVE9QIHwgSE9TVF9DVFJMX0RFVlNFTCkpCisJCQlkZXZfcHJpbnRrKEtFUk5fSU5GTywgJnBkZXYtPmRldiwKKwkJCQkgICAiQXBwbHlpbmcgY29tcGxldGlvbiBJUlEgbG9zcyBvbiBQQ0ktWCAiCisJCQkJICAgImVycmF0YSBmaXhcbiIpOworCQllbHNlCisJCQlwaS5mbGFncyAmPSB+U0lMMjRfRkxBR19QQ0lYX0lSUV9XT0M7CisJfQorCisJLyogYWxsb2NhdGUgYW5kIGZpbGwgaG9zdCAqLworCWhvc3QgPSBhdGFfaG9zdF9hbGxvY19waW5mbygmcGRldi0+ZGV2LCBwcGksCisJCQkJICAgIFNJTDI0X0ZMQUcyTlBPUlRTKHBwaVswXS0+ZmxhZ3MpKTsKKwlpZiAoIWhvc3QpCiAJCXJldHVybiAtRU5PTUVNOworCWhvc3QtPmlvbWFwID0gaW9tYXA7CiAKLQlwcm9iZV9lbnQtPmRldiA9IHBjaV9kZXZfdG9fZGV2KHBkZXYpOwotCUlOSVRfTElTVF9IRUFEKCZwcm9iZV9lbnQtPm5vZGUpOworCWZvciAoaSA9IDA7IGkgPCBob3N0LT5uX3BvcnRzOyBpKyspIHsKKwkJdm9pZCBfX2lvbWVtICpwb3J0ID0gaW9tYXBbU0lMMjRfUE9SVF9CQVJdICsgaSAqIFBPUlRfUkVHU19TSVpFOwogCi0JcHJvYmVfZW50LT5zaHQJCT0gcGluZm8tPnNodDsKLQlwcm9iZV9lbnQtPnBvcnRfZmxhZ3MJPSBwaW5mby0+ZmxhZ3M7Ci0JcHJvYmVfZW50LT5waW9fbWFzawk9IHBpbmZvLT5waW9fbWFzazsKLQlwcm9iZV9lbnQtPm13ZG1hX21hc2sJPSBwaW5mby0+bXdkbWFfbWFzazsKLQlwcm9iZV9lbnQtPnVkbWFfbWFzawk9IHBpbmZvLT51ZG1hX21hc2s7Ci0JcHJvYmVfZW50LT5wb3J0X29wcwk9IHBpbmZvLT5wb3J0X29wczsKLQlwcm9iZV9lbnQtPm5fcG9ydHMJPSBTSUwyNF9GTEFHMk5QT1JUUyhwaW5mby0+ZmxhZ3MpOworCQlob3N0LT5wb3J0c1tpXS0+aW9hZGRyLmNtZF9hZGRyID0gcG9ydDsKKwkJaG9zdC0+cG9ydHNbaV0tPmlvYWRkci5zY3JfYWRkciA9IHBvcnQgKyBQT1JUX1NDT05UUk9MOwogCi0JcHJvYmVfZW50LT5pcnEgPSBwZGV2LT5pcnE7Ci0JcHJvYmVfZW50LT5pcnFfZmxhZ3MgPSBJUlFGX1NIQVJFRDsKLQlwcm9iZV9lbnQtPmlvbWFwID0gcGNpbV9pb21hcF90YWJsZShwZGV2KTsKKwkJYXRhX3N0ZF9wb3J0cygmaG9zdC0+cG9ydHNbaV0tPmlvYWRkcik7CisJfQogCi0JaG9zdF9iYXNlID0gcHJvYmVfZW50LT5pb21hcFtTSUwyNF9IT1NUX0JBUl07Ci0JcG9ydF9iYXNlID0gcHJvYmVfZW50LT5pb21hcFtTSUwyNF9QT1JUX0JBUl07Ci0KLQkvKgotCSAqIENvbmZpZ3VyZSB0aGUgZGV2aWNlCi0JICovCisJLyogY29uZmlndXJlIGFuZCBhY3RpdmF0ZSB0aGUgZGV2aWNlICovCiAJaWYgKCFwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV82NEJJVF9NQVNLKSkgewogCQlyYyA9IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBETUFfNjRCSVRfTUFTSyk7CiAJCWlmIChyYykgewpAQCAtMTA5OSwzNiArMTA5MiwxMSBAQAogCQl9CiAJfQogCi0JLyogQXBwbHkgd29ya2Fyb3VuZCBmb3IgY29tcGxldGlvbiBJUlEgbG9zcyBvbiBQQ0ktWCBlcnJhdGEgKi8KLQlpZiAocHJvYmVfZW50LT5wb3J0X2ZsYWdzICYgU0lMMjRfRkxBR19QQ0lYX0lSUV9XT0MpIHsKLQkJdG1wID0gcmVhZGwoaG9zdF9iYXNlICsgSE9TVF9DVFJMKTsKLQkJaWYgKHRtcCAmIChIT1NUX0NUUkxfVFJEWSB8IEhPU1RfQ1RSTF9TVE9QIHwgSE9TVF9DVFJMX0RFVlNFTCkpCi0JCQlkZXZfcHJpbnRrKEtFUk5fSU5GTywgJnBkZXYtPmRldiwKLQkJCQkgICAiQXBwbHlpbmcgY29tcGxldGlvbiBJUlEgbG9zcyBvbiBQQ0ktWCAiCi0JCQkJICAgImVycmF0YSBmaXhcbiIpOwotCQllbHNlCi0JCQlwcm9iZV9lbnQtPnBvcnRfZmxhZ3MgJj0gflNJTDI0X0ZMQUdfUENJWF9JUlFfV09DOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBwcm9iZV9lbnQtPm5fcG9ydHM7IGkrKykgewotCQl2b2lkIF9faW9tZW0gKnBvcnQgPSBwb3J0X2Jhc2UgKyBpICogUE9SVF9SRUdTX1NJWkU7Ci0KLQkJcHJvYmVfZW50LT5wb3J0W2ldLmNtZF9hZGRyID0gcG9ydDsKLQkJcHJvYmVfZW50LT5wb3J0W2ldLnNjcl9hZGRyID0gcG9ydCArIFBPUlRfU0NPTlRST0w7Ci0KLQkJYXRhX3N0ZF9wb3J0cygmcHJvYmVfZW50LT5wb3J0W2ldKTsKLQl9Ci0KLQlzaWwyNF9pbml0X2NvbnRyb2xsZXIocGRldiwgcHJvYmVfZW50LT5uX3BvcnRzLCBwcm9iZV9lbnQtPnBvcnRfZmxhZ3MsCi0JCQkgICAgICBob3N0X2Jhc2UsIHBvcnRfYmFzZSk7CisJc2lsMjRfaW5pdF9jb250cm9sbGVyKGhvc3QpOwogCiAJcGNpX3NldF9tYXN0ZXIocGRldik7Ci0KLQlpZiAoIWF0YV9kZXZpY2VfYWRkKHByb2JlX2VudCkpCi0JCXJldHVybiAtRU5PREVWOwotCi0JZGV2bV9rZnJlZShkZXYsIHByb2JlX2VudCk7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIGF0YV9ob3N0X2FjdGl2YXRlKGhvc3QsIHBkZXYtPmlycSwgc2lsMjRfaW50ZXJydXB0LCBJUlFGX1NIQVJFRCwKKwkJCQkgJnNpbDI0X3NodCk7CiB9CiAKICNpZmRlZiBDT05GSUdfUE0KQEAgLTExMzYsNyArMTEwNCw2IEBACiB7CiAJc3RydWN0IGF0YV9ob3N0ICpob3N0ID0gZGV2X2dldF9kcnZkYXRhKCZwZGV2LT5kZXYpOwogCXZvaWQgX19pb21lbSAqaG9zdF9iYXNlID0gaG9zdC0+aW9tYXBbU0lMMjRfSE9TVF9CQVJdOwotCXZvaWQgX19pb21lbSAqcG9ydF9iYXNlID0gaG9zdC0+aW9tYXBbU0lMMjRfUE9SVF9CQVJdOwogCWludCByYzsKIAogCXJjID0gYXRhX3BjaV9kZXZpY2VfZG9fcmVzdW1lKHBkZXYpOwpAQCAtMTE0Niw4ICsxMTEzLDcgQEAKIAlpZiAocGRldi0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlLmV2ZW50ID09IFBNX0VWRU5UX1NVU1BFTkQpCiAJCXdyaXRlbChIT1NUX0NUUkxfR0xPQkFMX1JTVCwgaG9zdF9iYXNlICsgSE9TVF9DVFJMKTsKIAotCXNpbDI0X2luaXRfY29udHJvbGxlcihwZGV2LCBob3N0LT5uX3BvcnRzLCBob3N0LT5wb3J0c1swXS0+ZmxhZ3MsCi0JCQkgICAgICBob3N0X2Jhc2UsIHBvcnRfYmFzZSk7CisJc2lsMjRfaW5pdF9jb250cm9sbGVyKGhvc3QpOwogCiAJYXRhX2hvc3RfcmVzdW1lKGhvc3QpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9zYXRhX3Npcy5jIGIvZHJpdmVycy9hdGEvc2F0YV9zaXMuYwppbmRleCBhNzg3ZjBkLi5kOGVlMDYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9zYXRhX3Npcy5jCisrKyBiL2RyaXZlcnMvYXRhL3NhdGFfc2lzLmMKQEAgLTEyMSw3ICsxMjEsNiBAQAogCS50aGF3CQkJPSBhdGFfYm1kbWFfdGhhdywKIAkuZXJyb3JfaGFuZGxlcgkJPSBhdGFfYm1kbWFfZXJyb3JfaGFuZGxlciwKIAkucG9zdF9pbnRlcm5hbF9jbWQJPSBhdGFfYm1kbWFfcG9zdF9pbnRlcm5hbF9jbWQsCi0JLmlycV9oYW5kbGVyCQk9IGF0YV9pbnRlcnJ1cHQsCiAJLmlycV9jbGVhcgkJPSBhdGFfYm1kbWFfaXJxX2NsZWFyLAogCS5pcnFfb24JCQk9IGF0YV9pcnFfb24sCiAJLmlycV9hY2sJCT0gYXRhX2lycV9hY2ssCkBAIC0xMzEsNyArMTMwLDYgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBzaXNfcG9ydF9pbmZvID0gewotCS5zaHQJCT0gJnNpc19zaHQsCiAJLmZsYWdzCQk9IEFUQV9GTEFHX1NBVEEgfCBBVEFfRkxBR19OT19MRUdBQ1ksCiAJLnBpb19tYXNrCT0gMHgxZiwKIAkubXdkbWFfbWFzawk9IDB4NywKQEAgLTI1NiwxMiArMjU0LDEzIEBACiBzdGF0aWMgaW50IHNpc19pbml0X29uZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCiB7CiAJc3RhdGljIGludCBwcmludGVkX3ZlcnNpb247Ci0Jc3RydWN0IGF0YV9wcm9iZV9lbnQgKnByb2JlX2VudCA9IE5VTEw7Ci0JaW50IHJjOworCXN0cnVjdCBhdGFfcG9ydF9pbmZvIHBpID0gc2lzX3BvcnRfaW5mbzsKKwljb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqcHBpWzJdID0geyAmcGksICZwaSB9OworCXN0cnVjdCBhdGFfaG9zdCAqaG9zdDsKIAl1MzIgZ2VuY3RsLCB2YWw7Ci0Jc3RydWN0IGF0YV9wb3J0X2luZm8gcGkgPSBzaXNfcG9ydF9pbmZvLCAqcHBpWzJdID0geyAmcGksICZwaSB9OwogCXU4IHBtcjsKIAl1OCBwb3J0Ml9zdGFydCA9IDB4MjA7CisJaW50IHJjOwogCiAJaWYgKCFwcmludGVkX3ZlcnNpb24rKykKIAkJZGV2X3ByaW50ayhLRVJOX0lORk8sICZwZGV2LT5kZXYsICJ2ZXJzaW9uICIgRFJWX1ZFUlNJT04gIlxuIik7CkBAIC0yNzAsMTkgKzI2OSw2IEBACiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CiAKLQlyYyA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgRFJWX05BTUUpOwotCWlmIChyYykgewotCQlwY2ltX3Bpbl9kZXZpY2UocGRldik7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQlyYyA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgQVRBX0RNQV9NQVNLKTsKLQlpZiAocmMpCi0JCXJldHVybiByYzsKLQlyYyA9IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBBVEFfRE1BX01BU0spOwotCWlmIChyYykKLQkJcmV0dXJuIHJjOwotCiAJLyogY2hlY2sgYW5kIHNlZSBpZiB0aGUgU0NScyBhcmUgaW4gSU8gc3BhY2Ugb3IgUENJIGNmZyBzcGFjZSAqLwogCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBTSVNfR0VOQ1RMLCAmZ2VuY3RsKTsKIAlpZiAoKGdlbmN0bCAmIEdFTkNUTF9JT01BUFBFRF9TQ1IpID09IDApCkBAIC0zNDksMzAgKzMzNSwyNiBAQAogCQlicmVhazsKIAl9CiAKLQlwcm9iZV9lbnQgPSBhdGFfcGNpX2luaXRfbmF0aXZlX21vZGUocGRldiwgcHBpLCBBVEFfUE9SVF9QUklNQVJZIHwgQVRBX1BPUlRfU0VDT05EQVJZKTsKLQlpZiAoIXByb2JlX2VudCkKLQkJcmV0dXJuIC1FTk9NRU07CisJcmMgPSBhdGFfcGNpX3ByZXBhcmVfbmF0aXZlX2hvc3QocGRldiwgcHBpLCAyLCAmaG9zdCk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CiAKLQlpZiAoIShwcm9iZV9lbnQtPnBvcnRfZmxhZ3MgJiBTSVNfRkxBR19DRkdTQ1IpKSB7CisJaWYgKCEocGkuZmxhZ3MgJiBTSVNfRkxBR19DRkdTQ1IpKSB7CiAJCXZvaWQgX19pb21lbSAqbW1pbzsKIAotCQltbWlvID0gcGNpbV9pb21hcChwZGV2LCBTSVNfU0NSX1BDSV9CQVIsIDApOwotCQlpZiAoIW1taW8pCi0JCQlyZXR1cm4gLUVOT01FTTsKKwkJcmMgPSBwY2ltX2lvbWFwX3JlZ2lvbnMocGRldiwgMSA8PCBTSVNfU0NSX1BDSV9CQVIsIERSVl9OQU1FKTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOworCQltbWlvID0gaG9zdC0+aW9tYXBbU0lTX1NDUl9QQ0lfQkFSXTsKIAotCQlwcm9iZV9lbnQtPnBvcnRbMF0uc2NyX2FkZHIgPSBtbWlvOwotCQlwcm9iZV9lbnQtPnBvcnRbMV0uc2NyX2FkZHIgPSBtbWlvICsgcG9ydDJfc3RhcnQ7CisJCWhvc3QtPnBvcnRzWzBdLT5pb2FkZHIuc2NyX2FkZHIgPSBtbWlvOworCQlob3N0LT5wb3J0c1sxXS0+aW9hZGRyLnNjcl9hZGRyID0gbW1pbyArIHBvcnQyX3N0YXJ0OwogCX0KIAogCXBjaV9zZXRfbWFzdGVyKHBkZXYpOwogCXBjaV9pbnR4KHBkZXYsIDEpOwotCi0JaWYgKCFhdGFfZGV2aWNlX2FkZChwcm9iZV9lbnQpKQotCQlyZXR1cm4gLUVJTzsKLQotCWRldm1fa2ZyZWUoJnBkZXYtPmRldiwgcHJvYmVfZW50KTsKLQlyZXR1cm4gMDsKLQorCXJldHVybiBhdGFfaG9zdF9hY3RpdmF0ZShob3N0LCBwZGV2LT5pcnEsIGF0YV9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAorCQkJCSAmc2lzX3NodCk7CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IHNpc19pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9zYXRhX3N2dy5jIGIvZHJpdmVycy9hdGEvc2F0YV9zdncuYwppbmRleCBiMTIxMTk1Li5jYzA3YWFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9zYXRhX3N2dy5jCisrKyBiL2RyaXZlcnMvYXRhL3NhdGFfc3Z3LmMKQEAgLTU2LDcgKzU2LDkgQEAKICNkZWZpbmUgRFJWX1ZFUlNJT04JIjIuMSIKIAogZW51bSB7Ci0JSzJfRkxBR19OT19BVEFQSV9ETUEJCT0gKDEgPDwgMjkpLAorCS8qIGFwLT5mbGFncyBiaXRzICovCisJSzJfRkxBR19TQVRBXzhfUE9SVFMJCT0gKDEgPDwgMjQpLAorCUsyX0ZMQUdfTk9fQVRBUElfRE1BCQk9ICgxIDw8IDI1KSwKIAogCS8qIFRhc2tmaWxlIHJlZ2lzdGVycyBvZmZzZXRzICovCiAJSzJfU0FUQV9URl9DTURfT0ZGU0VUCQk9IDB4MDAsCkBAIC05MCwxNyArOTIsNiBAQAogCWJvYXJkX3N2dzgJCQk9IDEsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGsyX2JvYXJkX2luZm8gewotCXVuc2lnbmVkIGludAkJbl9wb3J0czsKLQl1bnNpZ25lZCBsb25nCQlwb3J0X2ZsYWdzOwotfSBrMl9ib2FyZF9pbmZvW10gPSB7Ci0JLyogYm9hcmRfc3Z3NCAqLwotCXsgNCwgSzJfRkxBR19OT19BVEFQSV9ETUEgfSwKLQotCS8qIGJvYXJkX3N2dzggKi8KLQl7IDgsIEsyX0ZMQUdfTk9fQVRBUElfRE1BIH0sCi19OwotCiBzdGF0aWMgdTggazJfc3RhdF9jaGVja19zdGF0dXMoc3RydWN0IGF0YV9wb3J0ICphcCk7CiAKIApAQCAtMzU0LDcgKzM0NSw2IEBACiAJLnRoYXcJCQk9IGF0YV9ibWRtYV90aGF3LAogCS5lcnJvcl9oYW5kbGVyCQk9IGF0YV9ibWRtYV9lcnJvcl9oYW5kbGVyLAogCS5wb3N0X2ludGVybmFsX2NtZAk9IGF0YV9ibWRtYV9wb3N0X2ludGVybmFsX2NtZCwKLQkuaXJxX2hhbmRsZXIJCT0gYXRhX2ludGVycnVwdCwKIAkuaXJxX2NsZWFyCQk9IGF0YV9ibWRtYV9pcnFfY2xlYXIsCiAJLmlycV9vbgkJCT0gYXRhX2lycV9vbiwKIAkuaXJxX2FjawkJPSBhdGFfaXJxX2FjaywKQEAgLTM2Myw2ICszNTMsMjggQEAKIAkucG9ydF9zdGFydAkJPSBhdGFfcG9ydF9zdGFydCwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBrMl9wb3J0X2luZm9bXSA9IHsKKwkvKiBib2FyZF9zdnc0ICovCisJeworCQkuZmxhZ3MJCT0gQVRBX0ZMQUdfU0FUQSB8IEFUQV9GTEFHX05PX0xFR0FDWSB8CisJCQkJICBBVEFfRkxBR19NTUlPIHwgSzJfRkxBR19OT19BVEFQSV9ETUEsCisJCS5waW9fbWFzawk9IDB4MWYsCisJCS5td2RtYV9tYXNrCT0gMHgwNywKKwkJLnVkbWFfbWFzawk9IDB4N2YsCisJCS5wb3J0X29wcwk9ICZrMl9zYXRhX29wcywKKwl9LAorCS8qIGJvYXJkX3N2dzggKi8KKwl7CisJCS5mbGFncwkJPSBBVEFfRkxBR19TQVRBIHwgQVRBX0ZMQUdfTk9fTEVHQUNZIHwKKwkJCQkgIEFUQV9GTEFHX01NSU8gfCBLMl9GTEFHX05PX0FUQVBJX0RNQSB8CisJCQkJICBLMl9GTEFHX1NBVEFfOF9QT1JUUywKKwkJLnBpb19tYXNrCT0gMHgxZiwKKwkJLm13ZG1hX21hc2sJPSAweDA3LAorCQkudWRtYV9tYXNrCT0gMHg3ZiwKKwkJLnBvcnRfb3BzCT0gJmsyX3NhdGFfb3BzLAorCX0sCit9OworCiBzdGF0aWMgdm9pZCBrMl9zYXRhX3NldHVwX3BvcnQoc3RydWN0IGF0YV9pb3BvcnRzICpwb3J0LCB2b2lkIF9faW9tZW0gKmJhc2UpCiB7CiAJcG9ydC0+Y21kX2FkZHIJCT0gYmFzZSArIEsyX1NBVEFfVEZfQ01EX09GRlNFVDsKQEAgLTM4NiwxNyArMzk4LDI0IEBACiBzdGF0aWMgaW50IGsyX3NhdGFfaW5pdF9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQogewogCXN0YXRpYyBpbnQgcHJpbnRlZF92ZXJzaW9uOwotCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7Ci0Jc3RydWN0IGF0YV9wcm9iZV9lbnQgKnByb2JlX2VudDsKKwljb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqcHBpW10gPQorCQl7ICZrMl9wb3J0X2luZm9bZW50LT5kcml2ZXJfZGF0YV0sIE5VTEwgfTsKKwlzdHJ1Y3QgYXRhX2hvc3QgKmhvc3Q7CiAJdm9pZCBfX2lvbWVtICptbWlvX2Jhc2U7Ci0JY29uc3Qgc3RydWN0IGsyX2JvYXJkX2luZm8gKmJvYXJkX2luZm8gPQotCQkJJmsyX2JvYXJkX2luZm9bZW50LT5kcml2ZXJfZGF0YV07Ci0JaW50IHJjOwotCWludCBpOworCWludCBuX3BvcnRzLCBpLCByYzsKIAogCWlmICghcHJpbnRlZF92ZXJzaW9uKyspCiAJCWRldl9wcmludGsoS0VSTl9ERUJVRywgJnBkZXYtPmRldiwgInZlcnNpb24gIiBEUlZfVkVSU0lPTiAiXG4iKTsKIAorCS8qIGFsbG9jYXRlIGhvc3QgKi8KKwluX3BvcnRzID0gNDsKKwlpZiAocHBpWzBdLT5mbGFncyAmIEsyX0ZMQUdfU0FUQV84X1BPUlRTKQorCQluX3BvcnRzID0gODsKKworCWhvc3QgPSBhdGFfaG9zdF9hbGxvY19waW5mbygmcGRldi0+ZGV2LCBwcGksIG5fcG9ydHMpOworCWlmICghaG9zdCkKKwkJcmV0dXJuIC1FTk9NRU07CisKIAkvKgogCSAqIElmIHRoaXMgZHJpdmVyIGhhcHBlbnMgdG8gb25seSBiZSB1c2VmdWwgb24gQXBwbGUncyBLMiwgdGhlbgogCSAqIHdlIHNob3VsZCBjaGVjayB0aGF0IGhlcmUgYXMgaXQgaGFzIGEgbm9ybWFsIFNlcnZlcndvcmtzIElECkBAIC00MDQsNiArNDIzLDcgQEAKIAlyYyA9IHBjaW1fZW5hYmxlX2RldmljZShwZGV2KTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKKwogCS8qCiAJICogQ2hlY2sgaWYgd2UgaGF2ZSByZXNvdXJjZXMgbWFwcGVkIGF0IGFsbCAoc2Vjb25kIGZ1bmN0aW9uIG1heQogCSAqIGhhdmUgYmVlbiBkaXNhYmxlZCBieSBmaXJtd2FyZSkKQEAgLTQxNyw2ICs0MzcsMTUgQEAKIAkJcGNpbV9waW5fZGV2aWNlKHBkZXYpOwogCWlmIChyYykKIAkJcmV0dXJuIHJjOworCWhvc3QtPmlvbWFwID0gcGNpbV9pb21hcF90YWJsZShwZGV2KTsKKwltbWlvX2Jhc2UgPSBob3N0LT5pb21hcFs1XTsKKworCS8qIGRpZmZlcmVudCBjb250cm9sbGVycyBoYXZlIGRpZmZlcmVudCBudW1iZXIgb2YgcG9ydHMgLSBjdXJyZW50bHkgNCBvciA4ICovCisJLyogQWxsIHBvcnRzIGFyZSBvbiB0aGUgc2FtZSBmdW5jdGlvbi4gTXVsdGktZnVuY3Rpb24gZGV2aWNlIGlzIG5vCisJICogbG9uZ2VyIGF2YWlsYWJsZS4gVGhpcyBzaG91bGQgbm90IGJlIHNlZW4gaW4gYW55IHN5c3RlbS4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgaG9zdC0+bl9wb3J0czsgaSsrKQorCQlrMl9zYXRhX3NldHVwX3BvcnQoJmhvc3QtPnBvcnRzW2ldLT5pb2FkZHIsCisJCQkJICAgbW1pb19iYXNlICsgaSAqIEsyX1NBVEFfUE9SVF9PRkZTRVQpOwogCiAJcmMgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIEFUQV9ETUFfTUFTSyk7CiAJaWYgKHJjKQpAQCAtNDI1LDM4ICs0NTQsNiBAQAogCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCi0JcHJvYmVfZW50ID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpwcm9iZV9lbnQpLCBHRlBfS0VSTkVMKTsKLQlpZiAocHJvYmVfZW50ID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcHJvYmVfZW50LT5kZXYgPSBwY2lfZGV2X3RvX2RldihwZGV2KTsKLQlJTklUX0xJU1RfSEVBRCgmcHJvYmVfZW50LT5ub2RlKTsKLQotCXByb2JlX2VudC0+c2h0ID0gJmsyX3NhdGFfc2h0OwotCXByb2JlX2VudC0+cG9ydF9mbGFncyA9IEFUQV9GTEFHX1NBVEEgfCBBVEFfRkxBR19OT19MRUdBQ1kgfAotCQkJCUFUQV9GTEFHX01NSU8gfCBib2FyZF9pbmZvLT5wb3J0X2ZsYWdzOwotCXByb2JlX2VudC0+cG9ydF9vcHMgPSAmazJfc2F0YV9vcHM7Ci0JcHJvYmVfZW50LT5uX3BvcnRzID0gNDsKLQlwcm9iZV9lbnQtPmlycSA9IHBkZXYtPmlycTsKLQlwcm9iZV9lbnQtPmlycV9mbGFncyA9IElSUUZfU0hBUkVEOwotCXByb2JlX2VudC0+aW9tYXAgPSBwY2ltX2lvbWFwX3RhYmxlKHBkZXYpOwotCi0JLyogV2UgZG9uJ3QgY2FyZSBtdWNoIGFib3V0IHRoZSBQSU8vVURNQSBtYXNrcywgYnV0IHRoZSBjb3JlIHdvbid0IGxpa2UgdXMKLQkgKiBpZiB3ZSBkb24ndCBmaWxsIHRoZXNlCi0JICovCi0JcHJvYmVfZW50LT5waW9fbWFzayA9IDB4MWY7Ci0JcHJvYmVfZW50LT5td2RtYV9tYXNrID0gMHg3OwotCXByb2JlX2VudC0+dWRtYV9tYXNrID0gMHg3ZjsKLQotCW1taW9fYmFzZSA9IHByb2JlX2VudC0+aW9tYXBbNV07Ci0KLQkvKiBkaWZmZXJlbnQgY29udHJvbGxlcnMgaGF2ZSBkaWZmZXJlbnQgbnVtYmVyIG9mIHBvcnRzIC0gY3VycmVudGx5IDQgb3IgOCAqLwotCS8qIEFsbCBwb3J0cyBhcmUgb24gdGhlIHNhbWUgZnVuY3Rpb24uIE11bHRpLWZ1bmN0aW9uIGRldmljZSBpcyBubwotCSAqIGxvbmdlciBhdmFpbGFibGUuIFRoaXMgc2hvdWxkIG5vdCBiZSBzZWVuIGluIGFueSBzeXN0ZW0uICovCi0JZm9yIChpID0gMDsgaSA8IGJvYXJkX2luZm8tPm5fcG9ydHM7IGkrKykKLQkJazJfc2F0YV9zZXR1cF9wb3J0KCZwcm9iZV9lbnQtPnBvcnRbaV0sCi0JCQkJICAgbW1pb19iYXNlICsgaSAqIEsyX1NBVEFfUE9SVF9PRkZTRVQpOwotCiAJLyogQ2xlYXIgYSBtYWdpYyBiaXQgaW4gU0NSMSBhY2NvcmRpbmcgdG8gRGFyd2luLCB0aG9zZSBoZWxwCiAJICogc29tZSBmdW5reSBzZWFnYXRlIGRyaXZlcyAodGhvdWdoIHNvIGZhciwgdGhvc2Ugd2VyZSBhbHJlYWR5CiAJICogc2V0IGJ5IHRoZSBmaXJtd2FyZSBvbiB0aGUgbWFjaGluZXMgSSBoYWQgYWNjZXNzIHRvKQpAQCAtNDY5LDEyICs0NjYsOCBAQAogCXdyaXRlbCgweDAsIG1taW9fYmFzZSArIEsyX1NBVEFfU0lNX09GRlNFVCk7CiAKIAlwY2lfc2V0X21hc3RlcihwZGV2KTsKLQotCWlmICghYXRhX2RldmljZV9hZGQocHJvYmVfZW50KSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlkZXZtX2tmcmVlKGRldiwgcHJvYmVfZW50KTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gYXRhX2hvc3RfYWN0aXZhdGUoaG9zdCwgcGRldi0+aXJxLCBhdGFfaW50ZXJydXB0LCBJUlFGX1NIQVJFRCwKKwkJCQkgJmsyX3NhdGFfc2h0KTsKIH0KIAogLyogMHgyNDAgaXMgZGV2aWNlIElEIGZvciBBcHBsZSBLMiBkZXZpY2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3NhdGFfc3g0LmMgYi9kcml2ZXJzL2F0YS9zYXRhX3N4NC5jCmluZGV4IDFhMDgxYzMuLjNhNGY0NDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3NhdGFfc3g0LmMKKysrIGIvZHJpdmVycy9hdGEvc2F0YV9zeDQuYwpAQCAtMTUxLDI0ICsxNTEsMjMgQEAKIAogCiBzdGF0aWMgaW50IHBkY19zYXRhX2luaXRfb25lIChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCk7Ci1zdGF0aWMgaXJxcmV0dXJuX3QgcGRjMjA2MjFfaW50ZXJydXB0IChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UpOwogc3RhdGljIHZvaWQgcGRjX2VuZ190aW1lb3V0KHN0cnVjdCBhdGFfcG9ydCAqYXApOwogc3RhdGljIHZvaWQgcGRjXzIwNjIxX3BoeV9yZXNldCAoc3RydWN0IGF0YV9wb3J0ICphcCk7CiBzdGF0aWMgaW50IHBkY19wb3J0X3N0YXJ0KHN0cnVjdCBhdGFfcG9ydCAqYXApOwogc3RhdGljIHZvaWQgcGRjMjA2MjFfcWNfcHJlcChzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKTsKIHN0YXRpYyB2b2lkIHBkY190Zl9sb2FkX21taW8oc3RydWN0IGF0YV9wb3J0ICphcCwgY29uc3Qgc3RydWN0IGF0YV90YXNrZmlsZSAqdGYpOwogc3RhdGljIHZvaWQgcGRjX2V4ZWNfY29tbWFuZF9tbWlvKHN0cnVjdCBhdGFfcG9ydCAqYXAsIGNvbnN0IHN0cnVjdCBhdGFfdGFza2ZpbGUgKnRmKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgcGRjMjA2MjFfZGltbV9pbml0KHN0cnVjdCBhdGFfcHJvYmVfZW50ICpwZSk7Ci1zdGF0aWMgaW50IHBkYzIwNjIxX2RldGVjdF9kaW1tKHN0cnVjdCBhdGFfcHJvYmVfZW50ICpwZSk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IHBkYzIwNjIxX2kyY19yZWFkKHN0cnVjdCBhdGFfcHJvYmVfZW50ICpwZSwKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcGRjMjA2MjFfZGltbV9pbml0KHN0cnVjdCBhdGFfaG9zdCAqaG9zdCk7CitzdGF0aWMgaW50IHBkYzIwNjIxX2RldGVjdF9kaW1tKHN0cnVjdCBhdGFfaG9zdCAqaG9zdCk7CitzdGF0aWMgdW5zaWduZWQgaW50IHBkYzIwNjIxX2kyY19yZWFkKHN0cnVjdCBhdGFfaG9zdCAqaG9zdCwKIAkJCQkgICAgICB1MzIgZGV2aWNlLCB1MzIgc3ViYWRkciwgdTMyICpwZGF0YSk7Ci1zdGF0aWMgaW50IHBkYzIwNjIxX3Byb2dfZGltbTAoc3RydWN0IGF0YV9wcm9iZV9lbnQgKnBlKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgcGRjMjA2MjFfcHJvZ19kaW1tX2dsb2JhbChzdHJ1Y3QgYXRhX3Byb2JlX2VudCAqcGUpOworc3RhdGljIGludCBwZGMyMDYyMV9wcm9nX2RpbW0wKHN0cnVjdCBhdGFfaG9zdCAqaG9zdCk7CitzdGF0aWMgdW5zaWduZWQgaW50IHBkYzIwNjIxX3Byb2dfZGltbV9nbG9iYWwoc3RydWN0IGF0YV9ob3N0ICpob3N0KTsKICNpZmRlZiBBVEFfVkVSQk9TRV9ERUJVRwotc3RhdGljIHZvaWQgcGRjMjA2MjFfZ2V0X2Zyb21fZGltbShzdHJ1Y3QgYXRhX3Byb2JlX2VudCAqcGUsCitzdGF0aWMgdm9pZCBwZGMyMDYyMV9nZXRfZnJvbV9kaW1tKHN0cnVjdCBhdGFfaG9zdCAqaG9zdCwKIAkJCQkgICB2b2lkICpwc291cmNlLCB1MzIgb2Zmc2V0LCB1MzIgc2l6ZSk7CiAjZW5kaWYKLXN0YXRpYyB2b2lkIHBkYzIwNjIxX3B1dF90b19kaW1tKHN0cnVjdCBhdGFfcHJvYmVfZW50ICpwZSwKK3N0YXRpYyB2b2lkIHBkYzIwNjIxX3B1dF90b19kaW1tKHN0cnVjdCBhdGFfaG9zdCAqaG9zdCwKIAkJCQkgdm9pZCAqcHNvdXJjZSwgdTMyIG9mZnNldCwgdTMyIHNpemUpOwogc3RhdGljIHZvaWQgcGRjMjA2MjFfaXJxX2NsZWFyKHN0cnVjdCBhdGFfcG9ydCAqYXApOwogc3RhdGljIHVuc2lnbmVkIGludCBwZGMyMDYyMV9xY19pc3N1ZV9wcm90KHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpOwpAQCAtMjA0LDcgKzIwMyw2IEBACiAJLnFjX2lzc3VlCQk9IHBkYzIwNjIxX3FjX2lzc3VlX3Byb3QsCiAJLmRhdGFfeGZlcgkJPSBhdGFfZGF0YV94ZmVyLAogCS5lbmdfdGltZW91dAkJPSBwZGNfZW5nX3RpbWVvdXQsCi0JLmlycV9oYW5kbGVyCQk9IHBkYzIwNjIxX2ludGVycnVwdCwKIAkuaXJxX2NsZWFyCQk9IHBkYzIwNjIxX2lycV9jbGVhciwKIAkuaXJxX29uCQkJPSBhdGFfaXJxX29uLAogCS5pcnFfYWNrCQk9IGF0YV9pcnFfYWNrLApAQCAtMjE0LDcgKzIxMiw2IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gcGRjX3BvcnRfaW5mb1tdID0gewogCS8qIGJvYXJkXzIwNjIxICovCiAJewotCQkuc2h0CQk9ICZwZGNfc2F0YV9zaHQsCiAJCS5mbGFncwkJPSBBVEFfRkxBR19TQVRBIHwgQVRBX0ZMQUdfTk9fTEVHQUNZIHwKIAkJCQkgIEFUQV9GTEFHX1NSU1QgfCBBVEFfRkxBR19NTUlPIHwKIAkJCQkgIEFUQV9GTEFHX05PX0FUQVBJIHwgQVRBX0ZMQUdfUElPX1BPTExJTkcsCkBAIC04ODIsMTUgKzg3OSwxNSBAQAogCiAKICNpZmRlZiBBVEFfVkVSQk9TRV9ERUJVRwotc3RhdGljIHZvaWQgcGRjMjA2MjFfZ2V0X2Zyb21fZGltbShzdHJ1Y3QgYXRhX3Byb2JlX2VudCAqcGUsIHZvaWQgKnBzb3VyY2UsCitzdGF0aWMgdm9pZCBwZGMyMDYyMV9nZXRfZnJvbV9kaW1tKHN0cnVjdCBhdGFfaG9zdCAqaG9zdCwgdm9pZCAqcHNvdXJjZSwKIAkJCQkgICB1MzIgb2Zmc2V0LCB1MzIgc2l6ZSkKIHsKIAl1MzIgd2luZG93X3NpemU7CiAJdTE2IGlkeDsKIAl1OCBwYWdlX21hc2s7CiAJbG9uZyBkaXN0OwotCXZvaWQgX19pb21lbSAqbW1pbyA9IHBlLT5pb21hcFtQRENfTU1JT19CQVJdOwotCXZvaWQgX19pb21lbSAqZGltbV9tbWlvID0gcGUtPmlvbWFwW1BEQ19ESU1NX0JBUl07CisJdm9pZCBfX2lvbWVtICptbWlvID0gaG9zdC0+aW9tYXBbUERDX01NSU9fQkFSXTsKKwl2b2lkIF9faW9tZW0gKmRpbW1fbW1pbyA9IGhvc3QtPmlvbWFwW1BEQ19ESU1NX0JBUl07CiAKIAkvKiBoYXJkLWNvZGUgY2hpcCAjMCAqLwogCW1taW8gKz0gUERDX0NISVAwX09GUzsKQEAgLTkzNywxNSArOTM0LDE1IEBACiAjZW5kaWYKIAogCi1zdGF0aWMgdm9pZCBwZGMyMDYyMV9wdXRfdG9fZGltbShzdHJ1Y3QgYXRhX3Byb2JlX2VudCAqcGUsIHZvaWQgKnBzb3VyY2UsCitzdGF0aWMgdm9pZCBwZGMyMDYyMV9wdXRfdG9fZGltbShzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QsIHZvaWQgKnBzb3VyY2UsCiAJCQkJIHUzMiBvZmZzZXQsIHUzMiBzaXplKQogewogCXUzMiB3aW5kb3dfc2l6ZTsKIAl1MTYgaWR4OwogCXU4IHBhZ2VfbWFzazsKIAlsb25nIGRpc3Q7Ci0Jdm9pZCBfX2lvbWVtICptbWlvID0gcGUtPmlvbWFwW1BEQ19NTUlPX0JBUl07Ci0Jdm9pZCBfX2lvbWVtICpkaW1tX21taW8gPSBwZS0+aW9tYXBbUERDX0RJTU1fQkFSXTsKKwl2b2lkIF9faW9tZW0gKm1taW8gPSBob3N0LT5pb21hcFtQRENfTU1JT19CQVJdOworCXZvaWQgX19pb21lbSAqZGltbV9tbWlvID0gaG9zdC0+aW9tYXBbUERDX0RJTU1fQkFSXTsKIAogCS8qIGhhcmQtY29kZSBjaGlwICMwICovCiAJbW1pbyArPSBQRENfQ0hJUDBfT0ZTOwpAQCAtOTg3LDEwICs5ODQsMTAgQEAKIH0KIAogCi1zdGF0aWMgdW5zaWduZWQgaW50IHBkYzIwNjIxX2kyY19yZWFkKHN0cnVjdCBhdGFfcHJvYmVfZW50ICpwZSwgdTMyIGRldmljZSwKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcGRjMjA2MjFfaTJjX3JlYWQoc3RydWN0IGF0YV9ob3N0ICpob3N0LCB1MzIgZGV2aWNlLAogCQkJCSAgICAgIHUzMiBzdWJhZGRyLCB1MzIgKnBkYXRhKQogewotCXZvaWQgX19pb21lbSAqbW1pbyA9IHBlLT5pb21hcFtQRENfTU1JT19CQVJdOworCXZvaWQgX19pb21lbSAqbW1pbyA9IGhvc3QtPmlvbWFwW1BEQ19NTUlPX0JBUl07CiAJdTMyIGkyY3JlZyAgPSAwOwogCXUzMiBzdGF0dXM7CiAJdTMyIGNvdW50ID0wOwpAQCAtMTAyMywxNyArMTAyMCwxNyBAQAogfQogCiAKLXN0YXRpYyBpbnQgcGRjMjA2MjFfZGV0ZWN0X2RpbW0oc3RydWN0IGF0YV9wcm9iZV9lbnQgKnBlKQorc3RhdGljIGludCBwZGMyMDYyMV9kZXRlY3RfZGltbShzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QpCiB7CiAJdTMyIGRhdGE9MCA7Ci0gIAlpZiAocGRjMjA2MjFfaTJjX3JlYWQocGUsIFBEQ19ESU1NMF9TUERfREVWX0FERFJFU1MsCisJaWYgKHBkYzIwNjIxX2kyY19yZWFkKGhvc3QsIFBEQ19ESU1NMF9TUERfREVWX0FERFJFU1MsCiAJCQkgICAgIFBEQ19ESU1NX1NQRF9TWVNURU1fRlJFUSwgJmRhdGEpKSB7CiAgICAJCWlmIChkYXRhID09IDEwMCkKIAkJCXJldHVybiAxMDA7CiAgIAl9IGVsc2UKIAkJcmV0dXJuIDA7CiAKLSAgIAlpZiAocGRjMjA2MjFfaTJjX3JlYWQocGUsIFBEQ19ESU1NMF9TUERfREVWX0FERFJFU1MsIDksICZkYXRhKSkgeworCWlmIChwZGMyMDYyMV9pMmNfcmVhZChob3N0LCBQRENfRElNTTBfU1BEX0RFVl9BRERSRVNTLCA5LCAmZGF0YSkpIHsKIAkJaWYoZGF0YSA8PSAweDc1KQogCQkJcmV0dXJuIDEzMzsKICAgIAl9IGVsc2UKQEAgLTEwNDMsMTMgKzEwNDAsMTMgQEAKIH0KIAogCi1zdGF0aWMgaW50IHBkYzIwNjIxX3Byb2dfZGltbTAoc3RydWN0IGF0YV9wcm9iZV9lbnQgKnBlKQorc3RhdGljIGludCBwZGMyMDYyMV9wcm9nX2RpbW0wKHN0cnVjdCBhdGFfaG9zdCAqaG9zdCkKIHsKIAl1MzIgc3BkMFs1MF07CiAJdTMyIGRhdGEgPSAwOwogICAgCWludCBzaXplLCBpOwogICAgCXU4IGJkaW1tc2l6ZTsKLQl2b2lkIF9faW9tZW0gKm1taW8gPSBwZS0+aW9tYXBbUERDX01NSU9fQkFSXTsKKwl2b2lkIF9faW9tZW0gKm1taW8gPSBob3N0LT5pb21hcFtQRENfTU1JT19CQVJdOwogCXN0YXRpYyBjb25zdCBzdHJ1Y3QgewogCQl1bnNpZ25lZCBpbnQgcmVnOwogCQl1bnNpZ25lZCBpbnQgb2ZzOwpAQCAtMTA3Miw3ICsxMDY5LDcgQEAKIAltbWlvICs9IFBEQ19DSElQMF9PRlM7CiAKIAlmb3IoaT0wOyBpPEFSUkFZX1NJWkUocGRjX2kyY19yZWFkX2RhdGEpOyBpKyspCi0JCXBkYzIwNjIxX2kyY19yZWFkKHBlLCBQRENfRElNTTBfU1BEX0RFVl9BRERSRVNTLAorCQlwZGMyMDYyMV9pMmNfcmVhZChob3N0LCBQRENfRElNTTBfU1BEX0RFVl9BRERSRVNTLAogCQkJCSAgcGRjX2kyY19yZWFkX2RhdGFbaV0ucmVnLAogCQkJCSAgJnNwZDBbcGRjX2kyY19yZWFkX2RhdGFbaV0ub2ZzXSk7CiAKQEAgLTExMDgsMTEgKzExMDUsMTEgQEAKIH0KIAogCi1zdGF0aWMgdW5zaWduZWQgaW50IHBkYzIwNjIxX3Byb2dfZGltbV9nbG9iYWwoc3RydWN0IGF0YV9wcm9iZV9lbnQgKnBlKQorc3RhdGljIHVuc2lnbmVkIGludCBwZGMyMDYyMV9wcm9nX2RpbW1fZ2xvYmFsKHN0cnVjdCBhdGFfaG9zdCAqaG9zdCkKIHsKIAl1MzIgZGF0YSwgc3BkMDsKIAlpbnQgZXJyb3IsIGk7Ci0Jdm9pZCBfX2lvbWVtICptbWlvID0gcGUtPmlvbWFwW1BEQ19NTUlPX0JBUl07CisJdm9pZCBfX2lvbWVtICptbWlvID0gaG9zdC0+aW9tYXBbUERDX01NSU9fQkFSXTsKIAogCS8qIGhhcmQtY29kZSBjaGlwICMwICovCiAgICAJbW1pbyArPSBQRENfQ0hJUDBfT0ZTOwpAQCAtMTEyOSw3ICsxMTI2LDcgQEAKIAlyZWFkbChtbWlvICsgUERDX1NEUkFNX0NPTlRST0xfT0ZGU0VUKTsKIAogCS8qIFR1cm4gb24gZm9yIEVDQyAqLwotCXBkYzIwNjIxX2kyY19yZWFkKHBlLCBQRENfRElNTTBfU1BEX0RFVl9BRERSRVNTLAorCXBkYzIwNjIxX2kyY19yZWFkKGhvc3QsIFBEQ19ESU1NMF9TUERfREVWX0FERFJFU1MsCiAJCQkgIFBEQ19ESU1NX1NQRF9UWVBFLCAmc3BkMCk7CiAJaWYgKHNwZDAgPT0gMHgwMikgewogCQlkYXRhIHw9ICgweDAxIDw8IDE2KTsKQEAgLTExNTYsNyArMTE1Myw3IEBACiB9CiAKIAotc3RhdGljIHVuc2lnbmVkIGludCBwZGMyMDYyMV9kaW1tX2luaXQoc3RydWN0IGF0YV9wcm9iZV9lbnQgKnBlKQorc3RhdGljIHVuc2lnbmVkIGludCBwZGMyMDYyMV9kaW1tX2luaXQoc3RydWN0IGF0YV9ob3N0ICpob3N0KQogewogCWludCBzcGVlZCwgc2l6ZSwgbGVuZ3RoOwogCXUzMiBhZGRyLHNwZDAscGNpX3N0YXR1czsKQEAgLTExNjYsNyArMTE2Myw3IEBACiAJdTMyIHRpY2tzPTA7CiAJdTMyIGNsb2NrPTA7CiAJdTMyIGZwYXJhbT0wOwotCXZvaWQgX19pb21lbSAqbW1pbyA9IHBlLT5pb21hcFtQRENfTU1JT19CQVJdOworCXZvaWQgX19pb21lbSAqbW1pbyA9IGhvc3QtPmlvbWFwW1BEQ19NTUlPX0JBUl07CiAKIAkvKiBoYXJkLWNvZGUgY2hpcCAjMCAqLwogICAgCW1taW8gKz0gUERDX0NISVAwX09GUzsKQEAgLTEyMjUsMTggKzEyMjIsMTggQEAKIAkgICBSZWFkIFNQRCBvZiBESU1NIGJ5IEkyQyBpbnRlcmZhY2UsCiAJICAgYW5kIHByb2dyYW0gdGhlIERJTU0gTW9kdWxlIENvbnRyb2xsZXIuCiAJKi8KLSAJaWYgKCEoc3BlZWQgPSBwZGMyMDYyMV9kZXRlY3RfZGltbShwZSkpKSB7CisJaWYgKCEoc3BlZWQgPSBwZGMyMDYyMV9kZXRlY3RfZGltbShob3N0KSkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJEZXRlY3QgTG9jYWwgRElNTSBGYWlsXG4iKTsKIAkJcmV0dXJuIDE7CS8qIERJTU0gZXJyb3IgKi8KICAgIAl9CiAgICAJVlBSSU5USygiTG9jYWwgRElNTSBTcGVlZCA9ICVkXG4iLCBzcGVlZCk7CiAKICAgIAkvKiBQcm9ncmFtbWluZyBESU1NMCBNb2R1bGUgQ29udHJvbCBSZWdpc3RlciAoaW5kZXhfQ0lEMDo4MGgpICovCi0gICAJc2l6ZSA9IHBkYzIwNjIxX3Byb2dfZGltbTAocGUpOworCXNpemUgPSBwZGMyMDYyMV9wcm9nX2RpbW0wKGhvc3QpOwogICAgCVZQUklOVEsoIkxvY2FsIERJTU0gU2l6ZSA9ICVkTUJcbiIsc2l6ZSk7CiAKICAgIAkvKiBQcm9ncmFtbWluZyBESU1NIE1vZHVsZSBHbG9iYWwgQ29udHJvbCBSZWdpc3RlciAoaW5kZXhfQ0lEMDo4OGgpICovCi0gICAJaWYgKHBkYzIwNjIxX3Byb2dfZGltbV9nbG9iYWwocGUpKSB7CisJaWYgKHBkYzIwNjIxX3Byb2dfZGltbV9nbG9iYWwoaG9zdCkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJQcm9ncmFtbWluZyBESU1NIE1vZHVsZSBHbG9iYWwgQ29udHJvbCBSZWdpc3RlciBGYWlsXG4iKTsKIAkJcmV0dXJuIDE7CiAgICAJfQpAQCAtMTI0OSwyMCArMTI0NiwyMCBAQAogICAJCQkJJzknLCc4JywnMCcsJzMnLCcxJywnNicsJzEnLCcyJywwLDB9OwogCQl1OCB0ZXN0X3BhcnR0ZXJuMls0MF0gPSB7MH07CiAKLQkJcGRjMjA2MjFfcHV0X3RvX2RpbW0ocGUsICh2b2lkICopIHRlc3RfcGFydHRlcm4yLCAweDEwMDQwLCA0MCk7Ci0JCXBkYzIwNjIxX3B1dF90b19kaW1tKHBlLCAodm9pZCAqKSB0ZXN0X3BhcnR0ZXJuMiwgMHg0MCwgNDApOworCQlwZGMyMDYyMV9wdXRfdG9fZGltbShob3N0LCAodm9pZCAqKSB0ZXN0X3BhcnR0ZXJuMiwgMHgxMDA0MCwgNDApOworCQlwZGMyMDYyMV9wdXRfdG9fZGltbShob3N0LCAodm9pZCAqKSB0ZXN0X3BhcnR0ZXJuMiwgMHg0MCwgNDApOwogCi0JCXBkYzIwNjIxX3B1dF90b19kaW1tKHBlLCAodm9pZCAqKSB0ZXN0X3BhcnR0ZXJuMSwgMHgxMDA0MCwgNDApOwotCQlwZGMyMDYyMV9nZXRfZnJvbV9kaW1tKHBlLCAodm9pZCAqKSB0ZXN0X3BhcnR0ZXJuMiwgMHg0MCwgNDApOworCQlwZGMyMDYyMV9wdXRfdG9fZGltbShob3N0LCAodm9pZCAqKSB0ZXN0X3BhcnR0ZXJuMSwgMHgxMDA0MCwgNDApOworCQlwZGMyMDYyMV9nZXRfZnJvbV9kaW1tKGhvc3QsICh2b2lkICopIHRlc3RfcGFydHRlcm4yLCAweDQwLCA0MCk7CiAJCXByaW50ayhLRVJOX0VSUiAiJXgsICV4LCAlc1xuIiwgdGVzdF9wYXJ0dGVybjJbMF0sCiAJCSAgICAgICB0ZXN0X3BhcnR0ZXJuMlsxXSwgJih0ZXN0X3BhcnR0ZXJuMlsyXSkpOwotCQlwZGMyMDYyMV9nZXRfZnJvbV9kaW1tKHBlLCAodm9pZCAqKSB0ZXN0X3BhcnR0ZXJuMiwgMHgxMDA0MCwKKwkJcGRjMjA2MjFfZ2V0X2Zyb21fZGltbShob3N0LCAodm9pZCAqKSB0ZXN0X3BhcnR0ZXJuMiwgMHgxMDA0MCwKIAkJCQkgICAgICAgNDApOwogCQlwcmludGsoS0VSTl9FUlIgIiV4LCAleCwgJXNcbiIsIHRlc3RfcGFydHRlcm4yWzBdLAogCQkgICAgICAgdGVzdF9wYXJ0dGVybjJbMV0sICYodGVzdF9wYXJ0dGVybjJbMl0pKTsKIAotCQlwZGMyMDYyMV9wdXRfdG9fZGltbShwZSwgKHZvaWQgKikgdGVzdF9wYXJ0dGVybjEsIDB4NDAsIDQwKTsKLQkJcGRjMjA2MjFfZ2V0X2Zyb21fZGltbShwZSwgKHZvaWQgKikgdGVzdF9wYXJ0dGVybjIsIDB4NDAsIDQwKTsKKwkJcGRjMjA2MjFfcHV0X3RvX2RpbW0oaG9zdCwgKHZvaWQgKikgdGVzdF9wYXJ0dGVybjEsIDB4NDAsIDQwKTsKKwkJcGRjMjA2MjFfZ2V0X2Zyb21fZGltbShob3N0LCAodm9pZCAqKSB0ZXN0X3BhcnR0ZXJuMiwgMHg0MCwgNDApOwogCQlwcmludGsoS0VSTl9FUlIgIiV4LCAleCwgJXNcbiIsIHRlc3RfcGFydHRlcm4yWzBdLAogCQkgICAgICAgdGVzdF9wYXJ0dGVybjJbMV0sICYodGVzdF9wYXJ0dGVybjJbMl0pKTsKIAl9CkBAIC0xMjcwLDE0ICsxMjY3LDE0IEBACiAKIAkvKiBFQ0MgaW5pdGlsaWF6YXRpb24uICovCiAKLQlwZGMyMDYyMV9pMmNfcmVhZChwZSwgUERDX0RJTU0wX1NQRF9ERVZfQUREUkVTUywKKwlwZGMyMDYyMV9pMmNfcmVhZChob3N0LCBQRENfRElNTTBfU1BEX0RFVl9BRERSRVNTLAogCQkJICBQRENfRElNTV9TUERfVFlQRSwgJnNwZDApOwogCWlmIChzcGQwID09IDB4MDIpIHsKIAkJVlBSSU5USygiU3RhcnQgRUNDIGluaXRpYWxpemF0aW9uXG4iKTsKIAkJYWRkciA9IDA7CiAJCWxlbmd0aCA9IHNpemUgKiAxMDI0ICogMTAyNDsKIAkJd2hpbGUgKGFkZHIgPCBsZW5ndGgpIHsKLQkJCXBkYzIwNjIxX3B1dF90b19kaW1tKHBlLCAodm9pZCAqKSAmdG1wLCBhZGRyLAorCQkJcGRjMjA2MjFfcHV0X3RvX2RpbW0oaG9zdCwgKHZvaWQgKikgJnRtcCwgYWRkciwKIAkJCQkJICAgICBzaXplb2YodTMyKSk7CiAJCQlhZGRyICs9IHNpemVvZih1MzIpOwogCQl9CkBAIC0xMjg3LDEwICsxMjg0LDEwIEBACiB9CiAKIAotc3RhdGljIHZvaWQgcGRjXzIwNjIxX2luaXQoc3RydWN0IGF0YV9wcm9iZV9lbnQgKnBlKQorc3RhdGljIHZvaWQgcGRjXzIwNjIxX2luaXQoc3RydWN0IGF0YV9ob3N0ICpob3N0KQogewogCXUzMiB0bXA7Ci0Jdm9pZCBfX2lvbWVtICptbWlvID0gcGUtPmlvbWFwW1BEQ19NTUlPX0JBUl07CisJdm9pZCBfX2lvbWVtICptbWlvID0gaG9zdC0+aW9tYXBbUERDX01NSU9fQkFSXTsKIAogCS8qIGhhcmQtY29kZSBjaGlwICMwICovCiAJbW1pbyArPSBQRENfQ0hJUDBfT0ZTOwpAQCAtMTMyMSwxNSArMTMxOCwyNSBAQAogc3RhdGljIGludCBwZGNfc2F0YV9pbml0X29uZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCiB7CiAJc3RhdGljIGludCBwcmludGVkX3ZlcnNpb247Ci0Jc3RydWN0IGF0YV9wcm9iZV9lbnQgKnByb2JlX2VudDsKKwljb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqcHBpW10gPQorCQl7ICZwZGNfcG9ydF9pbmZvW2VudC0+ZHJpdmVyX2RhdGFdLCBOVUxMIH07CisJc3RydWN0IGF0YV9ob3N0ICpob3N0OwogCXZvaWQgX19pb21lbSAqYmFzZTsKIAlzdHJ1Y3QgcGRjX2hvc3RfcHJpdiAqaHByaXY7Ci0JdW5zaWduZWQgaW50IGJvYXJkX2lkeCA9ICh1bnNpZ25lZCBpbnQpIGVudC0+ZHJpdmVyX2RhdGE7CiAJaW50IHJjOwogCiAJaWYgKCFwcmludGVkX3ZlcnNpb24rKykKIAkJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCAmcGRldi0+ZGV2LCAidmVyc2lvbiAiIERSVl9WRVJTSU9OICJcbiIpOwogCisJLyogYWxsb2NhdGUgaG9zdCAqLworCWhvc3QgPSBhdGFfaG9zdF9hbGxvY19waW5mbygmcGRldi0+ZGV2LCBwcGksIDQpOworCWhwcml2ID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqaHByaXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWhvc3QgfHwgIWhwcml2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWhvc3QtPnByaXZhdGVfZGF0YSA9IGhwcml2OworCisJLyogYWNxdWlyZSByZXNvdXJjZXMgYW5kIGZpbGwgaG9zdCAqLwogCXJjID0gcGNpbV9lbmFibGVfZGV2aWNlKHBkZXYpOwogCWlmIChyYykKIAkJcmV0dXJuIHJjOwpAQCAtMTM0MCw3ICsxMzQ3LDE1IEBACiAJCXBjaW1fcGluX2RldmljZShwZGV2KTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKKwlob3N0LT5pb21hcCA9IHBjaW1faW9tYXBfdGFibGUocGRldik7CiAKKwliYXNlID0gaG9zdC0+aW9tYXBbUERDX01NSU9fQkFSXSArIFBEQ19DSElQMF9PRlM7CisJcGRjX3NhdGFfc2V0dXBfcG9ydCgmaG9zdC0+cG9ydHNbMF0tPmlvYWRkciwgYmFzZSArIDB4MjAwKTsKKwlwZGNfc2F0YV9zZXR1cF9wb3J0KCZob3N0LT5wb3J0c1sxXS0+aW9hZGRyLCBiYXNlICsgMHgyODApOworCXBkY19zYXRhX3NldHVwX3BvcnQoJmhvc3QtPnBvcnRzWzJdLT5pb2FkZHIsIGJhc2UgKyAweDMwMCk7CisJcGRjX3NhdGFfc2V0dXBfcG9ydCgmaG9zdC0+cG9ydHNbM10tPmlvYWRkciwgYmFzZSArIDB4MzgwKTsKKworCS8qIGNvbmZpZ3VyZSBhbmQgYWN0aXZhdGUgKi8KIAlyYyA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgQVRBX0RNQV9NQVNLKTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKQEAgLTEzNDgsNTAgKzEzNjMsMTMgQEAKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIAotCXByb2JlX2VudCA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKnByb2JlX2VudCksIEdGUF9LRVJORUwpOwotCWlmIChwcm9iZV9lbnQgPT0gTlVMTCkKKwlpZiAocGRjMjA2MjFfZGltbV9pbml0KGhvc3QpKQogCQlyZXR1cm4gLUVOT01FTTsKLQotCXByb2JlX2VudC0+ZGV2ID0gcGNpX2Rldl90b19kZXYocGRldik7Ci0JSU5JVF9MSVNUX0hFQUQoJnByb2JlX2VudC0+bm9kZSk7Ci0KLQlocHJpdiA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKmhwcml2KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFocHJpdikKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlwcm9iZV9lbnQtPnNodAkJPSBwZGNfcG9ydF9pbmZvW2JvYXJkX2lkeF0uc2h0OwotCXByb2JlX2VudC0+cG9ydF9mbGFncwk9IHBkY19wb3J0X2luZm9bYm9hcmRfaWR4XS5mbGFnczsKLQlwcm9iZV9lbnQtPnBpb19tYXNrCT0gcGRjX3BvcnRfaW5mb1tib2FyZF9pZHhdLnBpb19tYXNrOwotCXByb2JlX2VudC0+bXdkbWFfbWFzawk9IHBkY19wb3J0X2luZm9bYm9hcmRfaWR4XS5td2RtYV9tYXNrOwotCXByb2JlX2VudC0+dWRtYV9tYXNrCT0gcGRjX3BvcnRfaW5mb1tib2FyZF9pZHhdLnVkbWFfbWFzazsKLQlwcm9iZV9lbnQtPnBvcnRfb3BzCT0gcGRjX3BvcnRfaW5mb1tib2FyZF9pZHhdLnBvcnRfb3BzOwotCi0gICAgICAgCXByb2JlX2VudC0+aXJxID0gcGRldi0+aXJxOwotICAgICAgIAlwcm9iZV9lbnQtPmlycV9mbGFncyA9IElSUUZfU0hBUkVEOwotCXByb2JlX2VudC0+aW9tYXAgPSBwY2ltX2lvbWFwX3RhYmxlKHBkZXYpOwotCi0JcHJvYmVfZW50LT5wcml2YXRlX2RhdGEgPSBocHJpdjsKLQliYXNlID0gcHJvYmVfZW50LT5pb21hcFtQRENfTU1JT19CQVJdICsgUERDX0NISVAwX09GUzsKLQotCXByb2JlX2VudC0+bl9wb3J0cyA9IDQ7Ci0JcGRjX3NhdGFfc2V0dXBfcG9ydCgmcHJvYmVfZW50LT5wb3J0WzBdLCBiYXNlICsgMHgyMDApOwotCXBkY19zYXRhX3NldHVwX3BvcnQoJnByb2JlX2VudC0+cG9ydFsxXSwgYmFzZSArIDB4MjgwKTsKLQlwZGNfc2F0YV9zZXR1cF9wb3J0KCZwcm9iZV9lbnQtPnBvcnRbMl0sIGJhc2UgKyAweDMwMCk7Ci0JcGRjX3NhdGFfc2V0dXBfcG9ydCgmcHJvYmVfZW50LT5wb3J0WzNdLCBiYXNlICsgMHgzODApOworCXBkY18yMDYyMV9pbml0KGhvc3QpOwogCiAJcGNpX3NldF9tYXN0ZXIocGRldik7Ci0KLQkvKiBpbml0aWFsaXplIGFkYXB0ZXIgKi8KLQkvKiBpbml0aWFsaXplIGxvY2FsIGRpbW0gKi8KLQlpZiAocGRjMjA2MjFfZGltbV9pbml0KHByb2JlX2VudCkpCi0JCXJldHVybiAtRU5PTUVNOwotCXBkY18yMDYyMV9pbml0KHByb2JlX2VudCk7Ci0KLQlpZiAoIWF0YV9kZXZpY2VfYWRkKHByb2JlX2VudCkpCi0JCXJldHVybiAtRU5PREVWOwotCi0JZGV2bV9rZnJlZSgmcGRldi0+ZGV2LCBwcm9iZV9lbnQpOwotCXJldHVybiAwOworCXJldHVybiBhdGFfaG9zdF9hY3RpdmF0ZShob3N0LCBwZGV2LT5pcnEsIHBkYzIwNjIxX2ludGVycnVwdCwKKwkJCQkgSVJRRl9TSEFSRUQsICZwZGNfc2F0YV9zaHQpOwogfQogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3NhdGFfdWxpLmMgYi9kcml2ZXJzL2F0YS9zYXRhX3VsaS5jCmluZGV4IGQ2NTlhY2UuLmY3NGUzODMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3NhdGFfdWxpLmMKKysrIGIvZHJpdmVycy9hdGEvc2F0YV91bGkuYwpAQCAtMTE1LDcgKzExNSw2IEBACiAJLmVycm9yX2hhbmRsZXIJCT0gYXRhX2JtZG1hX2Vycm9yX2hhbmRsZXIsCiAJLnBvc3RfaW50ZXJuYWxfY21kCT0gYXRhX2JtZG1hX3Bvc3RfaW50ZXJuYWxfY21kLAogCi0JLmlycV9oYW5kbGVyCQk9IGF0YV9pbnRlcnJ1cHQsCiAJLmlycV9jbGVhcgkJPSBhdGFfYm1kbWFfaXJxX2NsZWFyLAogCS5pcnFfb24JCQk9IGF0YV9pcnFfb24sCiAJLmlycV9hY2sJCT0gYXRhX2lycV9hY2ssCkBAIC0xMjcsNyArMTI2LDYgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyB1bGlfcG9ydF9pbmZvID0gewotCS5zaHQgICAgICAgICAgICA9ICZ1bGlfc2h0LAogCS5mbGFncwkJPSBBVEFfRkxBR19TQVRBIHwgQVRBX0ZMQUdfTk9fTEVHQUNZIHwKIAkJCSAgQVRBX0ZMQUdfSUdOX1NJTVBMRVgsCiAJLnBpb19tYXNrICAgICAgID0gMHgxZiwJCS8qIHBpbzAtNCAqLwpAQCAtMTg1LDEyICsxODMsMTMgQEAKIHN0YXRpYyBpbnQgdWxpX2luaXRfb25lIChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKIHsKIAlzdGF0aWMgaW50IHByaW50ZWRfdmVyc2lvbjsKLQlzdHJ1Y3QgYXRhX3Byb2JlX2VudCAqcHJvYmVfZW50OwotCXN0cnVjdCBhdGFfcG9ydF9pbmZvICpwcGlbMl07Ci0JaW50IHJjOworCWNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvICpwcGlbXSA9IHsgJnVsaV9wb3J0X2luZm8sIE5VTEwgfTsKIAl1bnNpZ25lZCBpbnQgYm9hcmRfaWR4ID0gKHVuc2lnbmVkIGludCkgZW50LT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgYXRhX2hvc3QgKmhvc3Q7CiAJc3RydWN0IHVsaV9wcml2ICpocHJpdjsKIAl2b2lkIF9faW9tZW0gKiBjb25zdCAqaW9tYXA7CisJc3RydWN0IGF0YV9pb3BvcnRzICppb2FkZHI7CisJaW50IG5fcG9ydHMsIHJjOwogCiAJaWYgKCFwcmludGVkX3ZlcnNpb24rKykKIAkJZGV2X3ByaW50ayhLRVJOX0lORk8sICZwZGV2LT5kZXYsICJ2ZXJzaW9uICIgRFJWX1ZFUlNJT04gIlxuIik7CkBAIC0xOTksNTQgKzE5OCw0MiBAQAogCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCi0JcmMgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIERSVl9OQU1FKTsKLQlpZiAocmMpIHsKLQkJcGNpbV9waW5fZGV2aWNlKHBkZXYpOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JcmMgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIEFUQV9ETUFfTUFTSyk7CisJbl9wb3J0cyA9IDI7CisJaWYgKGJvYXJkX2lkeCA9PSB1bGlfNTI4NykKKwkJbl9wb3J0cyA9IDQ7CisJcmMgPSBhdGFfcGNpX3ByZXBhcmVfbmF0aXZlX2hvc3QocGRldiwgcHBpLCBuX3BvcnRzLCAmaG9zdCk7CiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7Ci0JcmMgPSBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgQVRBX0RNQV9NQVNLKTsKLQlpZiAocmMpCi0JCXJldHVybiByYzsKLQotCXBwaVswXSA9IHBwaVsxXSA9ICZ1bGlfcG9ydF9pbmZvOwotCXByb2JlX2VudCA9IGF0YV9wY2lfaW5pdF9uYXRpdmVfbW9kZShwZGV2LCBwcGksIEFUQV9QT1JUX1BSSU1BUlkgfCBBVEFfUE9SVF9TRUNPTkRBUlkpOwotCWlmICghcHJvYmVfZW50KQotCQlyZXR1cm4gLUVOT01FTTsKIAogCWhwcml2ID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqaHByaXYpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWhwcml2KQogCQlyZXR1cm4gLUVOT01FTTsKKwlob3N0LT5wcml2YXRlX2RhdGEgPSBocHJpdjsKIAotCXByb2JlX2VudC0+cHJpdmF0ZV9kYXRhID0gaHByaXY7Ci0KLQlpb21hcCA9IHBjaW1faW9tYXBfdGFibGUocGRldik7CisJaW9tYXAgPSBob3N0LT5pb21hcDsKIAogCXN3aXRjaCAoYm9hcmRfaWR4KSB7CiAJY2FzZSB1bGlfNTI4NzoKIAkJaHByaXYtPnNjcl9jZmdfYWRkclswXSA9IFVMSTUyODdfQkFTRTsKIAkJaHByaXYtPnNjcl9jZmdfYWRkclsxXSA9IFVMSTUyODdfQkFTRSArIFVMSTUyODdfT0ZGUzsKLSAgICAgICAJCXByb2JlX2VudC0+bl9wb3J0cyA9IDQ7CiAKLQkJcHJvYmVfZW50LT5wb3J0WzJdLmNtZF9hZGRyID0gaW9tYXBbMF0gKyA4OwotCQlwcm9iZV9lbnQtPnBvcnRbMl0uYWx0c3RhdHVzX2FkZHIgPQotCQlwcm9iZV9lbnQtPnBvcnRbMl0uY3RsX2FkZHIgPSAodm9pZCBfX2lvbWVtICopCisJCWlvYWRkciA9ICZob3N0LT5wb3J0c1syXS0+aW9hZGRyOworCQlpb2FkZHItPmNtZF9hZGRyID0gaW9tYXBbMF0gKyA4OworCQlpb2FkZHItPmFsdHN0YXR1c19hZGRyID0KKwkJaW9hZGRyLT5jdGxfYWRkciA9ICh2b2lkIF9faW9tZW0gKikKIAkJCSgodW5zaWduZWQgbG9uZylpb21hcFsxXSB8IEFUQV9QQ0lfQ1RMX09GUykgKyA0OwotCQlwcm9iZV9lbnQtPnBvcnRbMl0uYm1kbWFfYWRkciA9IGlvbWFwWzRdICsgMTY7CisJCWlvYWRkci0+Ym1kbWFfYWRkciA9IGlvbWFwWzRdICsgMTY7CiAJCWhwcml2LT5zY3JfY2ZnX2FkZHJbMl0gPSBVTEk1Mjg3X0JBU0UgKyBVTEk1Mjg3X09GRlMqNDsKKwkJYXRhX3N0ZF9wb3J0cyhpb2FkZHIpOwogCi0JCXByb2JlX2VudC0+cG9ydFszXS5jbWRfYWRkciA9IGlvbWFwWzJdICsgODsKLQkJcHJvYmVfZW50LT5wb3J0WzNdLmFsdHN0YXR1c19hZGRyID0KLQkJcHJvYmVfZW50LT5wb3J0WzNdLmN0bF9hZGRyID0gKHZvaWQgX19pb21lbSAqKQorCQlpb2FkZHIgPSAmaG9zdC0+cG9ydHNbM10tPmlvYWRkcjsKKwkJaW9hZGRyLT5jbWRfYWRkciA9IGlvbWFwWzJdICsgODsKKwkJaW9hZGRyLT5hbHRzdGF0dXNfYWRkciA9CisJCWlvYWRkci0+Y3RsX2FkZHIgPSAodm9pZCBfX2lvbWVtICopCiAJCQkoKHVuc2lnbmVkIGxvbmcpaW9tYXBbM10gfCBBVEFfUENJX0NUTF9PRlMpICsgNDsKLQkJcHJvYmVfZW50LT5wb3J0WzNdLmJtZG1hX2FkZHIgPSBpb21hcFs0XSArIDI0OworCQlpb2FkZHItPmJtZG1hX2FkZHIgPSBpb21hcFs0XSArIDI0OwogCQlocHJpdi0+c2NyX2NmZ19hZGRyWzNdID0gVUxJNTI4N19CQVNFICsgVUxJNTI4N19PRkZTKjU7Ci0KLQkJYXRhX3N0ZF9wb3J0cygmcHJvYmVfZW50LT5wb3J0WzJdKTsKLQkJYXRhX3N0ZF9wb3J0cygmcHJvYmVfZW50LT5wb3J0WzNdKTsKKwkJYXRhX3N0ZF9wb3J0cyhpb2FkZHIpOwogCQlicmVhazsKIAogCWNhc2UgdWxpXzUyODk6CkBAIC0yNjYsMTIgKzI1Myw4IEBACiAKIAlwY2lfc2V0X21hc3RlcihwZGV2KTsKIAlwY2lfaW50eChwZGV2LCAxKTsKLQotCWlmICghYXRhX2RldmljZV9hZGQocHJvYmVfZW50KSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlkZXZtX2tmcmVlKCZwZGV2LT5kZXYsIHByb2JlX2VudCk7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIGF0YV9ob3N0X2FjdGl2YXRlKGhvc3QsIHBkZXYtPmlycSwgYXRhX2ludGVycnVwdCwgSVJRRl9TSEFSRUQsCisJCQkJICZ1bGlfc2h0KTsKIH0KIAogc3RhdGljIGludCBfX2luaXQgdWxpX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3NhdGFfdmlhLmMgYi9kcml2ZXJzL2F0YS9zYXRhX3ZpYS5jCmluZGV4IDU5OGU2YTIuLjFkODU1ZjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3NhdGFfdmlhLmMKKysrIGIvZHJpdmVycy9hdGEvc2F0YV92aWEuYwpAQCAtNjQsOCArNjQsNiBAQAogCVBPUlQwCQkJPSAoMSA8PCAxKSwKIAlQT1JUMQkJCT0gKDEgPDwgMCksCiAJQUxMX1BPUlRTCQk9IFBPUlQwIHwgUE9SVDEsCi0JUEFUQV9QT1JUCQk9IDIsCS8qIFBBVEEgaXMgcG9ydCAyICovCi0JTl9QT1JUUwkJCT0gMywKIAogCU5BVElWRV9NT0RFX0FMTAkJPSAoMSA8PCA3KSB8ICgxIDw8IDYpIHwgKDEgPDwgNSkgfCAoMSA8PCA0KSwKIApAQCAtNzgsMTEgKzc2LDkgQEAKIHN0YXRpYyB2b2lkIHN2aWFfc2NyX3dyaXRlIChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgc2NfcmVnLCB1MzIgdmFsKTsKIHN0YXRpYyB2b2lkIHN2aWFfbm9vcF9mcmVlemUoc3RydWN0IGF0YV9wb3J0ICphcCk7CiBzdGF0aWMgdm9pZCB2dDY0MjBfZXJyb3JfaGFuZGxlcihzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKLXN0YXRpYyB2b2lkIHZ0NjQyMV9zYXRhX2Vycm9yX2hhbmRsZXIoc3RydWN0IGF0YV9wb3J0ICphcCk7Ci1zdGF0aWMgdm9pZCB2dDY0MjFfcGF0YV9lcnJvcl9oYW5kbGVyKHN0cnVjdCBhdGFfcG9ydCAqYXApOworc3RhdGljIGludCB2dDY0MjFfcGF0YV9jYWJsZV9kZXRlY3Qoc3RydWN0IGF0YV9wb3J0ICphcCk7CiBzdGF0aWMgdm9pZCB2dDY0MjFfc2V0X3Bpb19tb2RlKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfZGV2aWNlICphZGV2KTsKIHN0YXRpYyB2b2lkIHZ0NjQyMV9zZXRfZG1hX21vZGUoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV9kZXZpY2UgKmFkZXYpOwotc3RhdGljIGludCB2dDY0MjFfcG9ydF9zdGFydChzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIHN2aWFfcGNpX3RibFtdID0gewogCXsgUENJX1ZERVZJQ0UoVklBLCAweDUzMzcpLCB2dDY0MjAgfSwKQEAgLTE0MSw3ICsxMzcsNiBAQAogCS5lcnJvcl9oYW5kbGVyCQk9IHZ0NjQyMF9lcnJvcl9oYW5kbGVyLAogCS5wb3N0X2ludGVybmFsX2NtZAk9IGF0YV9ibWRtYV9wb3N0X2ludGVybmFsX2NtZCwKIAotCS5pcnFfaGFuZGxlcgkJPSBhdGFfaW50ZXJydXB0LAogCS5pcnFfY2xlYXIJCT0gYXRhX2JtZG1hX2lycV9jbGVhciwKIAkuaXJxX29uCQkJPSBhdGFfaXJxX29uLAogCS5pcnFfYWNrCQk9IGF0YV9pcnFfYWNrLApAQCAtMTcyLDE1ICsxNjcsMTUgQEAKIAogCS5mcmVlemUJCQk9IGF0YV9ibWRtYV9mcmVlemUsCiAJLnRoYXcJCQk9IGF0YV9ibWRtYV90aGF3LAotCS5lcnJvcl9oYW5kbGVyCQk9IHZ0NjQyMV9wYXRhX2Vycm9yX2hhbmRsZXIsCisJLmVycm9yX2hhbmRsZXIJCT0gYXRhX2JtZG1hX2Vycm9yX2hhbmRsZXIsCiAJLnBvc3RfaW50ZXJuYWxfY21kCT0gYXRhX2JtZG1hX3Bvc3RfaW50ZXJuYWxfY21kLAorCS5jYWJsZV9kZXRlY3QJCT0gdnQ2NDIxX3BhdGFfY2FibGVfZGV0ZWN0LAogCi0JLmlycV9oYW5kbGVyCQk9IGF0YV9pbnRlcnJ1cHQsCiAJLmlycV9jbGVhcgkJPSBhdGFfYm1kbWFfaXJxX2NsZWFyLAogCS5pcnFfb24JCQk9IGF0YV9pcnFfb24sCiAJLmlycV9hY2sJCT0gYXRhX2lycV9hY2ssCiAKLQkucG9ydF9zdGFydAkJPSB2dDY0MjFfcG9ydF9zdGFydCwKKwkucG9ydF9zdGFydAkJPSBhdGFfcG9ydF9zdGFydCwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfb3BlcmF0aW9ucyB2dDY0MjFfc2F0YV9vcHMgPSB7CkBAIC0yMDMsMTAgKzE5OCwxMCBAQAogCiAJLmZyZWV6ZQkJCT0gYXRhX2JtZG1hX2ZyZWV6ZSwKIAkudGhhdwkJCT0gYXRhX2JtZG1hX3RoYXcsCi0JLmVycm9yX2hhbmRsZXIJCT0gdnQ2NDIxX3NhdGFfZXJyb3JfaGFuZGxlciwKKwkuZXJyb3JfaGFuZGxlcgkJPSBhdGFfYm1kbWFfZXJyb3JfaGFuZGxlciwKIAkucG9zdF9pbnRlcm5hbF9jbWQJPSBhdGFfYm1kbWFfcG9zdF9pbnRlcm5hbF9jbWQsCisJLmNhYmxlX2RldGVjdAkJPSBhdGFfY2FibGVfc2F0YSwKIAotCS5pcnFfaGFuZGxlcgkJPSBhdGFfaW50ZXJydXB0LAogCS5pcnFfY2xlYXIJCT0gYXRhX2JtZG1hX2lycV9jbGVhciwKIAkuaXJxX29uCQkJPSBhdGFfaXJxX29uLAogCS5pcnFfYWNrCQk9IGF0YV9pcnFfYWNrLApAQCAtMjE0LDExICsyMDksMTAgQEAKIAkuc2NyX3JlYWQJCT0gc3ZpYV9zY3JfcmVhZCwKIAkuc2NyX3dyaXRlCQk9IHN2aWFfc2NyX3dyaXRlLAogCi0JLnBvcnRfc3RhcnQJCT0gdnQ2NDIxX3BvcnRfc3RhcnQsCisJLnBvcnRfc3RhcnQJCT0gYXRhX3BvcnRfc3RhcnQsCiB9OwogCi1zdGF0aWMgc3RydWN0IGF0YV9wb3J0X2luZm8gdnQ2NDIwX3BvcnRfaW5mbyA9IHsKLQkuc2h0CQk9ICZzdmlhX3NodCwKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyB2dDY0MjBfcG9ydF9pbmZvID0gewogCS5mbGFncwkJPSBBVEFfRkxBR19TQVRBIHwgQVRBX0ZMQUdfTk9fTEVHQUNZLAogCS5waW9fbWFzawk9IDB4MWYsCiAJLm13ZG1hX21hc2sJPSAweDA3LApAQCAtMjI2LDYgKzIyMCwyMiBAQAogCS5wb3J0X29wcwk9ICZ2dDY0MjBfc2F0YV9vcHMsCiB9OwogCitzdGF0aWMgc3RydWN0IGF0YV9wb3J0X2luZm8gdnQ2NDIxX3Nwb3J0X2luZm8gPSB7CisJLmZsYWdzCQk9IEFUQV9GTEFHX1NBVEEgfCBBVEFfRkxBR19OT19MRUdBQ1ksCisJLnBpb19tYXNrCT0gMHgxZiwKKwkubXdkbWFfbWFzawk9IDB4MDcsCisJLnVkbWFfbWFzawk9IDB4N2YsCisJLnBvcnRfb3BzCT0gJnZ0NjQyMV9zYXRhX29wcywKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyB2dDY0MjFfcHBvcnRfaW5mbyA9IHsKKwkuZmxhZ3MJCT0gQVRBX0ZMQUdfU0xBVkVfUE9TUyB8IEFUQV9GTEFHX05PX0xFR0FDWSwKKwkucGlvX21hc2sJPSAweDFmLAorCS5td2RtYV9tYXNrCT0gMCwKKwkudWRtYV9tYXNrCT0gMHg3ZiwKKwkucG9ydF9vcHMJPSAmdnQ2NDIxX3BhdGFfb3BzLAorfTsKKwogTU9EVUxFX0FVVEhPUigiSmVmZiBHYXJ6aWsiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiU0NTSSBsb3ctbGV2ZWwgZHJpdmVyIGZvciBWSUEgU0FUQSBjb250cm9sbGVycyIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpAQCAtMzMwLDM1ICszNDAsMTUgQEAKIAkJCQkgIE5VTEwsIGF0YV9zdGRfcG9zdHJlc2V0KTsKIH0KIAotc3RhdGljIGludCB2dDY0MjFfcGF0YV9wcmVyZXNldChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQorc3RhdGljIGludCB2dDY0MjFfcGF0YV9jYWJsZV9kZXRlY3Qoc3RydWN0IGF0YV9wb3J0ICphcCkKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoYXAtPmhvc3QtPmRldik7CiAJdTggdG1wOwogCiAJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgUEFUQV9VRE1BX1RJTUlORywgJnRtcCk7CiAJaWYgKHRtcCAmIDB4MTApCi0JCWFwLT5jYmwgPSBBVEFfQ0JMX1BBVEE0MDsKLQllbHNlCi0JCWFwLT5jYmwgPSBBVEFfQ0JMX1BBVEE4MDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgdnQ2NDIxX3BhdGFfZXJyb3JfaGFuZGxlcihzdHJ1Y3QgYXRhX3BvcnQgKmFwKQotewotCXJldHVybiBhdGFfYm1kbWFfZHJpdmVfZWgoYXAsIHZ0NjQyMV9wYXRhX3ByZXJlc2V0LCBhdGFfc3RkX3NvZnRyZXNldCwKLQkJCQkgIE5VTEwsIGF0YV9zdGRfcG9zdHJlc2V0KTsKLX0KLQotc3RhdGljIGludCB2dDY0MjFfc2F0YV9wcmVyZXNldChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQotewotCWFwLT5jYmwgPSBBVEFfQ0JMX1NBVEE7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHZ0NjQyMV9zYXRhX2Vycm9yX2hhbmRsZXIoc3RydWN0IGF0YV9wb3J0ICphcCkKLXsKLQlyZXR1cm4gYXRhX2JtZG1hX2RyaXZlX2VoKGFwLCB2dDY0MjFfc2F0YV9wcmVyZXNldCwgYXRhX3N0ZF9zb2Z0cmVzZXQsCi0JCQkJICBOVUxMLCBhdGFfc3RkX3Bvc3RyZXNldCk7CisJCXJldHVybiBBVEFfQ0JMX1BBVEE0MDsKKwlyZXR1cm4gQVRBX0NCTF9QQVRBODA7CiB9CiAKIHN0YXRpYyB2b2lkIHZ0NjQyMV9zZXRfcGlvX21vZGUoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV9kZXZpY2UgKmFkZXYpCkBAIC0zNzUsMTYgKzM2NSw2IEBACiAJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIFBBVEFfVURNQV9USU1JTkcsIHVkbWFfYml0c1thZGV2LT5waW9fbW9kZSAtIFhGRVJfVURNQV8wXSk7CiB9CiAKLXN0YXRpYyBpbnQgdnQ2NDIxX3BvcnRfc3RhcnQoc3RydWN0IGF0YV9wb3J0ICphcCkKLXsKLQlpZiAoYXAtPnBvcnRfbm8gPT0gUEFUQV9QT1JUKSB7Ci0JCWFwLT5vcHMgPSAmdnQ2NDIxX3BhdGFfb3BzOwotCQlhcC0+bXdkbWFfbWFzayA9IDA7Ci0JCWFwLT5mbGFncyA9IEFUQV9GTEFHX1NMQVZFX1BPU1MgfCBBVEFfRkxBR19OT19MRUdBQ1kgfCBBVEFfRkxBR19TUlNUOwotCX0KLQlyZXR1cm4gYXRhX3BvcnRfc3RhcnQoYXApOwotfQotCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHN2aWFfYmFyX3NpemVzW10gPSB7CiAJOCwgNCwgOCwgNCwgMTYsIDI1NgogfTsKQEAgLTQwMyw3OSArMzgzLDc4IEBACiAJcmV0dXJuIGFkZHIgKyAocG9ydCAqIDY0KTsKIH0KIAotc3RhdGljIHZvaWQgdnQ2NDIxX2luaXRfYWRkcnMoc3RydWN0IGF0YV9wcm9iZV9lbnQgKnByb2JlX2VudCwKLQkJCSAgICAgIHZvaWQgX19pb21lbSAqIGNvbnN0ICppb21hcCwgdW5zaWduZWQgaW50IHBvcnQpCitzdGF0aWMgdm9pZCB2dDY0MjFfaW5pdF9hZGRycyhzdHJ1Y3QgYXRhX3BvcnQgKmFwKQogewotCXZvaWQgX19pb21lbSAqcmVnX2FkZHIgPSBpb21hcFtwb3J0XTsKLQl2b2lkIF9faW9tZW0gKmJtZG1hX2FkZHIgPSBpb21hcFs0XSArIChwb3J0ICogOCk7CisJdm9pZCBfX2lvbWVtICogY29uc3QgKiBpb21hcCA9IGFwLT5ob3N0LT5pb21hcDsKKwl2b2lkIF9faW9tZW0gKnJlZ19hZGRyID0gaW9tYXBbYXAtPnBvcnRfbm9dOworCXZvaWQgX19pb21lbSAqYm1kbWFfYWRkciA9IGlvbWFwWzRdICsgKGFwLT5wb3J0X25vICogOCk7CisJc3RydWN0IGF0YV9pb3BvcnRzICppb2FkZHIgPSAmYXAtPmlvYWRkcjsKIAotCXByb2JlX2VudC0+cG9ydFtwb3J0XS5jbWRfYWRkciA9IHJlZ19hZGRyOwotCXByb2JlX2VudC0+cG9ydFtwb3J0XS5hbHRzdGF0dXNfYWRkciA9Ci0JcHJvYmVfZW50LT5wb3J0W3BvcnRdLmN0bF9hZGRyID0gKHZvaWQgX19pb21lbSAqKQorCWlvYWRkci0+Y21kX2FkZHIgPSByZWdfYWRkcjsKKwlpb2FkZHItPmFsdHN0YXR1c19hZGRyID0KKwlpb2FkZHItPmN0bF9hZGRyID0gKHZvaWQgX19pb21lbSAqKQogCQkoKHVuc2lnbmVkIGxvbmcpKHJlZ19hZGRyICsgOCkgfCBBVEFfUENJX0NUTF9PRlMpOwotCXByb2JlX2VudC0+cG9ydFtwb3J0XS5ibWRtYV9hZGRyID0gYm1kbWFfYWRkcjsKLQlwcm9iZV9lbnQtPnBvcnRbcG9ydF0uc2NyX2FkZHIgPSB2dDY0MjFfc2NyX2FkZHIoaW9tYXBbNV0sIHBvcnQpOworCWlvYWRkci0+Ym1kbWFfYWRkciA9IGJtZG1hX2FkZHI7CisJaW9hZGRyLT5zY3JfYWRkciA9IHZ0NjQyMV9zY3JfYWRkcihpb21hcFs1XSwgYXAtPnBvcnRfbm8pOwogCi0JYXRhX3N0ZF9wb3J0cygmcHJvYmVfZW50LT5wb3J0W3BvcnRdKTsKKwlhdGFfc3RkX3BvcnRzKGlvYWRkcik7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgYXRhX3Byb2JlX2VudCAqdnQ2NDIwX2luaXRfcHJvYmVfZW50KHN0cnVjdCBwY2lfZGV2ICpwZGV2KQorc3RhdGljIGludCB2dDY0MjBfcHJlcGFyZV9ob3N0KHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3QgYXRhX2hvc3QgKipyX2hvc3QpCiB7Ci0Jc3RydWN0IGF0YV9wcm9iZV9lbnQgKnByb2JlX2VudDsKLQlzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqcHBpWzJdOwotCXZvaWQgX19pb21lbSAqYmFyNTsKKwljb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqcHBpW10gPSB7ICZ2dDY0MjBfcG9ydF9pbmZvLCBOVUxMIH07CisJc3RydWN0IGF0YV9ob3N0ICpob3N0OworCWludCByYzsKIAotCXBwaVswXSA9IHBwaVsxXSA9ICZ2dDY0MjBfcG9ydF9pbmZvOwotCXByb2JlX2VudCA9IGF0YV9wY2lfaW5pdF9uYXRpdmVfbW9kZShwZGV2LCBwcGksIEFUQV9QT1JUX1BSSU1BUlkgfCBBVEFfUE9SVF9TRUNPTkRBUlkpOwotCWlmICghcHJvYmVfZW50KQotCQlyZXR1cm4gTlVMTDsKKwlyYyA9IGF0YV9wY2lfcHJlcGFyZV9uYXRpdmVfaG9zdChwZGV2LCBwcGksIDIsICZob3N0KTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKwkqcl9ob3N0ID0gaG9zdDsKIAotCWJhcjUgPSBwY2ltX2lvbWFwKHBkZXYsIDUsIDApOwotCWlmICghYmFyNSkgeworCXJjID0gcGNpbV9pb21hcF9yZWdpb25zKHBkZXYsIDEgPDwgNSwgRFJWX05BTUUpOworCWlmIChyYykgewogCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCAmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGlvbWFwIFBDSSBCQVIgNVxuIik7Ci0JCXJldHVybiBOVUxMOworCQlyZXR1cm4gcmM7CiAJfQogCi0JcHJvYmVfZW50LT5wb3J0WzBdLnNjcl9hZGRyID0gc3ZpYV9zY3JfYWRkcihiYXI1LCAwKTsKLQlwcm9iZV9lbnQtPnBvcnRbMV0uc2NyX2FkZHIgPSBzdmlhX3Njcl9hZGRyKGJhcjUsIDEpOworCWhvc3QtPnBvcnRzWzBdLT5pb2FkZHIuc2NyX2FkZHIgPSBzdmlhX3Njcl9hZGRyKGhvc3QtPmlvbWFwWzVdLCAwKTsKKwlob3N0LT5wb3J0c1sxXS0+aW9hZGRyLnNjcl9hZGRyID0gc3ZpYV9zY3JfYWRkcihob3N0LT5pb21hcFs1XSwgMSk7CiAKLQlyZXR1cm4gcHJvYmVfZW50OworCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IGF0YV9wcm9iZV9lbnQgKnZ0NjQyMV9pbml0X3Byb2JlX2VudChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3N0YXRpYyBpbnQgdnQ2NDIxX3ByZXBhcmVfaG9zdChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IGF0YV9ob3N0ICoqcl9ob3N0KQogewotCXN0cnVjdCBhdGFfcHJvYmVfZW50ICpwcm9iZV9lbnQ7Ci0JdW5zaWduZWQgaW50IGk7CisJY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gKnBwaVtdID0KKwkJeyAmdnQ2NDIxX3Nwb3J0X2luZm8sICZ2dDY0MjFfc3BvcnRfaW5mbywgJnZ0NjQyMV9wcG9ydF9pbmZvIH07CisJc3RydWN0IGF0YV9ob3N0ICpob3N0OworCWludCBpLCByYzsKIAotCXByb2JlX2VudCA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKnByb2JlX2VudCksIEdGUF9LRVJORUwpOwotCWlmICghcHJvYmVfZW50KQotCQlyZXR1cm4gTlVMTDsKKwkqcl9ob3N0ID0gaG9zdCA9IGF0YV9ob3N0X2FsbG9jX3BpbmZvKCZwZGV2LT5kZXYsIHBwaSwgQVJSQVlfU0laRShwcGkpKTsKKwlpZiAoIWhvc3QpIHsKKwkJZGV2X3ByaW50ayhLRVJOX0VSUiwgJnBkZXYtPmRldiwgImZhaWxlZCB0byBhbGxvY2F0ZSBob3N0XG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQogCi0JbWVtc2V0KHByb2JlX2VudCwgMCwgc2l6ZW9mKCpwcm9iZV9lbnQpKTsKLQlwcm9iZV9lbnQtPmRldiA9IHBjaV9kZXZfdG9fZGV2KHBkZXYpOwotCUlOSVRfTElTVF9IRUFEKCZwcm9iZV9lbnQtPm5vZGUpOworCXJjID0gcGNpbV9pb21hcF9yZWdpb25zKHBkZXYsIDB4MWYsIERSVl9OQU1FKTsKKwlpZiAocmMpIHsKKwkJZGV2X3ByaW50ayhLRVJOX0VSUiwgJnBkZXYtPmRldiwgImZhaWxlZCB0byByZXF1ZXN0L2lvbWFwICIKKwkJCSAgICJQQ0kgQkFScyAoZXJybm89JWQpXG4iLCByYyk7CisJCXJldHVybiByYzsKKwl9CisJaG9zdC0+aW9tYXAgPSBwY2ltX2lvbWFwX3RhYmxlKHBkZXYpOwogCi0JcHJvYmVfZW50LT5zaHQJCT0gJnN2aWFfc2h0OwotCXByb2JlX2VudC0+cG9ydF9mbGFncwk9IEFUQV9GTEFHX1NBVEEgfCBBVEFfRkxBR19OT19MRUdBQ1k7Ci0JcHJvYmVfZW50LT5wb3J0X29wcwk9ICZ2dDY0MjFfc2F0YV9vcHM7Ci0JcHJvYmVfZW50LT5uX3BvcnRzCT0gTl9QT1JUUzsKLQlwcm9iZV9lbnQtPmlycQkJPSBwZGV2LT5pcnE7Ci0JcHJvYmVfZW50LT5pcnFfZmxhZ3MJPSBJUlFGX1NIQVJFRDsKLQlwcm9iZV9lbnQtPnBpb19tYXNrCT0gMHgxZjsKLQlwcm9iZV9lbnQtPm13ZG1hX21hc2sJPSAweDA3OwotCXByb2JlX2VudC0+dWRtYV9tYXNrCT0gMHg3ZjsKKwlmb3IgKGkgPSAwOyBpIDwgaG9zdC0+bl9wb3J0czsgaSsrKQorCQl2dDY0MjFfaW5pdF9hZGRycyhob3N0LT5wb3J0c1tpXSk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQotCQlpZiAoIXBjaW1faW9tYXAocGRldiwgaSwgMCkpIHsKLQkJCWRldl9wcmludGsoS0VSTl9FUlIsICZwZGV2LT5kZXYsCi0JCQkJICAgImZhaWxlZCB0byBpb21hcCBQQ0kgQkFSICVkXG4iLCBpKTsKLQkJCXJldHVybiBOVUxMOwotCQl9CisJcmMgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIEFUQV9ETUFfTUFTSyk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisJcmMgPSBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgQVRBX0RNQV9NQVNLKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKIAotCWZvciAoaSA9IDA7IGkgPCBOX1BPUlRTOyBpKyspCi0JCXZ0NjQyMV9pbml0X2FkZHJzKHByb2JlX2VudCwgcGNpbV9pb21hcF90YWJsZShwZGV2KSwgaSk7Ci0KLQlyZXR1cm4gcHJvYmVfZW50OworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBzdmlhX2NvbmZpZ3VyZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKQEAgLTUyMiw3ICs1MDEsNyBAQAogCXN0YXRpYyBpbnQgcHJpbnRlZF92ZXJzaW9uOwogCXVuc2lnbmVkIGludCBpOwogCWludCByYzsKLQlzdHJ1Y3QgYXRhX3Byb2JlX2VudCAqcHJvYmVfZW50OworCXN0cnVjdCBhdGFfaG9zdCAqaG9zdDsKIAlpbnQgYm9hcmRfaWQgPSAoaW50KSBlbnQtPmRyaXZlcl9kYXRhOwogCWNvbnN0IGludCAqYmFyX3NpemVzOwogCXU4IHRtcDg7CkBAIC01MzQsMTIgKzUxMyw2IEBACiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CiAKLQlyYyA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgRFJWX05BTUUpOwotCWlmIChyYykgewotCQlwY2ltX3Bpbl9kZXZpY2UocGRldik7Ci0JCXJldHVybiByYzsKLQl9Ci0KIAlpZiAoYm9hcmRfaWQgPT0gdnQ2NDIwKSB7CiAJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFNBVEFfUEFUQV9TSEFSSU5HLCAmdG1wOCk7CiAJCWlmICh0bXA4ICYgU0FUQV8yREVWKSB7CkBAIC01NjUsMzIgKzUzOCwxOCBAQAogCQkJcmV0dXJuIC1FTk9ERVY7CiAJCX0KIAotCXJjID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBBVEFfRE1BX01BU0spOwotCWlmIChyYykKLQkJcmV0dXJuIHJjOwotCXJjID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIEFUQV9ETUFfTUFTSyk7Ci0JaWYgKHJjKQotCQlyZXR1cm4gcmM7Ci0KIAlpZiAoYm9hcmRfaWQgPT0gdnQ2NDIwKQotCQlwcm9iZV9lbnQgPSB2dDY0MjBfaW5pdF9wcm9iZV9lbnQocGRldik7CisJCXJjID0gdnQ2NDIwX3ByZXBhcmVfaG9zdChwZGV2LCAmaG9zdCk7CiAJZWxzZQotCQlwcm9iZV9lbnQgPSB2dDY0MjFfaW5pdF9wcm9iZV9lbnQocGRldik7Ci0KLQlpZiAoIXByb2JlX2VudCkgewotCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCAmcGRldi0+ZGV2LCAib3V0IG9mIG1lbW9yeVxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KKwkJcmMgPSB2dDY0MjFfcHJlcGFyZV9ob3N0KHBkZXYsICZob3N0KTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKIAogCXN2aWFfY29uZmlndXJlKHBkZXYpOwogCiAJcGNpX3NldF9tYXN0ZXIocGRldik7Ci0KLQlpZiAoIWF0YV9kZXZpY2VfYWRkKHByb2JlX2VudCkpCi0JCXJldHVybiAtRU5PREVWOwotCi0JZGV2bV9rZnJlZSgmcGRldi0+ZGV2LCBwcm9iZV9lbnQpOwotCXJldHVybiAwOworCXJldHVybiBhdGFfaG9zdF9hY3RpdmF0ZShob3N0LCBwZGV2LT5pcnEsIGF0YV9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAorCQkJCSAmc3ZpYV9zaHQpOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCBzdmlhX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3NhdGFfdnNjLmMgYi9kcml2ZXJzL2F0YS9zYXRhX3ZzYy5jCmluZGV4IDE3MGJhZDEuLjgwMTI2ZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3NhdGFfdnNjLmMKKysrIGIvZHJpdmVycy9hdGEvc2F0YV92c2MuYwpAQCAtMzMzLDcgKzMzMyw2IEBACiAJLnRoYXcJCQk9IHZzY190aGF3LAogCS5lcnJvcl9oYW5kbGVyCQk9IGF0YV9ibWRtYV9lcnJvcl9oYW5kbGVyLAogCS5wb3N0X2ludGVybmFsX2NtZAk9IGF0YV9ibWRtYV9wb3N0X2ludGVybmFsX2NtZCwKLQkuaXJxX2hhbmRsZXIJCT0gdnNjX3NhdGFfaW50ZXJydXB0LAogCS5pcnFfY2xlYXIJCT0gYXRhX2JtZG1hX2lycV9jbGVhciwKIAkuaXJxX29uCQkJPSBhdGFfaXJxX29uLAogCS5pcnFfYWNrCQk9IGF0YV9pcnFfYWNrLApAQCAtMzY3LDMwICszNjYsNTAgQEAKIAogc3RhdGljIGludCBfX2RldmluaXQgdnNjX3NhdGFfaW5pdF9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQogeworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBwaSA9IHsKKwkJLmZsYWdzCQk9IEFUQV9GTEFHX1NBVEEgfCBBVEFfRkxBR19OT19MRUdBQ1kgfAorCQkJCSAgQVRBX0ZMQUdfTU1JTywKKwkJLnBpb19tYXNrCT0gMHgxZiwKKwkJLm13ZG1hX21hc2sJPSAweDA3LAorCQkudWRtYV9tYXNrCT0gMHg3ZiwKKwkJLnBvcnRfb3BzCT0gJnZzY19zYXRhX29wcywKKwl9OworCWNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvICpwcGlbXSA9IHsgJnBpLCBOVUxMIH07CiAJc3RhdGljIGludCBwcmludGVkX3ZlcnNpb247Ci0Jc3RydWN0IGF0YV9wcm9iZV9lbnQgKnByb2JlX2VudDsKKwlzdHJ1Y3QgYXRhX2hvc3QgKmhvc3Q7CiAJdm9pZCBfX2lvbWVtICptbWlvX2Jhc2U7Ci0JaW50IHJjOworCWludCBpLCByYzsKIAl1OCBjbHM7CiAKIAlpZiAoIXByaW50ZWRfdmVyc2lvbisrKQogCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZwZGV2LT5kZXYsICJ2ZXJzaW9uICIgRFJWX1ZFUlNJT04gIlxuIik7CiAKKwkvKiBhbGxvY2F0ZSBob3N0ICovCisJaG9zdCA9IGF0YV9ob3N0X2FsbG9jX3BpbmZvKCZwZGV2LT5kZXYsIHBwaSwgNCk7CisJaWYgKCFob3N0KQorCQlyZXR1cm4gLUVOT01FTTsKKwogCXJjID0gcGNpbV9lbmFibGVfZGV2aWNlKHBkZXYpOwogCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCi0JLyoKLQkgKiBDaGVjayBpZiB3ZSBoYXZlIG5lZWRlZCByZXNvdXJjZSBtYXBwZWQuCi0JICovCisJLyogY2hlY2sgaWYgd2UgaGF2ZSBuZWVkZWQgcmVzb3VyY2UgbWFwcGVkICovCiAJaWYgKHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCkgPT0gMCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKKwkvKiBtYXAgSU8gcmVnaW9ucyBhbmQgaW50aWFsaXplIGhvc3QgYWNjb3JkaW5nbHkgKi8KIAlyYyA9IHBjaW1faW9tYXBfcmVnaW9ucyhwZGV2LCAxIDw8IFZTQ19NTUlPX0JBUiwgRFJWX05BTUUpOwogCWlmIChyYyA9PSAtRUJVU1kpCiAJCXBjaW1fcGluX2RldmljZShwZGV2KTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKKwlob3N0LT5pb21hcCA9IHBjaW1faW9tYXBfdGFibGUocGRldik7CisKKwltbWlvX2Jhc2UgPSBob3N0LT5pb21hcFtWU0NfTU1JT19CQVJdOworCisJZm9yIChpID0gMDsgaSA8IGhvc3QtPm5fcG9ydHM7IGkrKykKKwkJdnNjX3NhdGFfc2V0dXBfcG9ydCgmaG9zdC0+cG9ydHNbaV0tPmlvYWRkciwKKwkJCQkgICAgbW1pb19iYXNlICsgKGkgKyAxKSAqIFZTQ19TQVRBX1BPUlRfT0ZGU0VUKTsKIAogCS8qCiAJICogVXNlIDMyIGJpdCBETUEgbWFzaywgYmVjYXVzZSA2NCBiaXQgYWRkcmVzcyBzdXBwb3J0IGlzIHBvb3IuCkBAIC00MDIsMTIgKzQyMSw2IEBACiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CiAKLQlwcm9iZV9lbnQgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpwcm9iZV9lbnQpLCBHRlBfS0VSTkVMKTsKLQlpZiAocHJvYmVfZW50ID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCXByb2JlX2VudC0+ZGV2ID0gcGNpX2Rldl90b19kZXYocGRldik7Ci0JSU5JVF9MSVNUX0hFQUQoJnByb2JlX2VudC0+bm9kZSk7Ci0KIAkvKgogCSAqIER1ZSB0byBhIGJ1ZyBpbiB0aGUgY2hpcCwgdGhlIGRlZmF1bHQgY2FjaGUgbGluZSBzaXplIGNhbid0IGJlCiAJICogdXNlZCAodW5sZXNzIHRoZSBkZWZhdWx0IGlzIG5vbi16ZXJvKS4KQEAgLTQxOCwzMyArNDMxLDYgQEAKIAogCWlmIChwY2lfZW5hYmxlX21zaShwZGV2KSA9PSAwKQogCQlwY2lfaW50eChwZGV2LCAwKTsKLQllbHNlCi0JCXByb2JlX2VudC0+aXJxX2ZsYWdzID0gSVJRRl9TSEFSRUQ7Ci0KLQlwcm9iZV9lbnQtPnNodCA9ICZ2c2Nfc2F0YV9zaHQ7Ci0JcHJvYmVfZW50LT5wb3J0X2ZsYWdzID0gQVRBX0ZMQUdfU0FUQSB8IEFUQV9GTEFHX05PX0xFR0FDWSB8Ci0JCQkJQVRBX0ZMQUdfTU1JTzsKLQlwcm9iZV9lbnQtPnBvcnRfb3BzID0gJnZzY19zYXRhX29wczsKLQlwcm9iZV9lbnQtPm5fcG9ydHMgPSA0OwotCXByb2JlX2VudC0+aXJxID0gcGRldi0+aXJxOwotCXByb2JlX2VudC0+aW9tYXAgPSBwY2ltX2lvbWFwX3RhYmxlKHBkZXYpOwotCi0JLyogV2UgZG9uJ3QgY2FyZSBtdWNoIGFib3V0IHRoZSBQSU8vVURNQSBtYXNrcywgYnV0IHRoZSBjb3JlIHdvbid0IGxpa2UgdXMKLQkgKiBpZiB3ZSBkb24ndCBmaWxsIHRoZXNlCi0JICovCi0JcHJvYmVfZW50LT5waW9fbWFzayA9IDB4MWY7Ci0JcHJvYmVfZW50LT5td2RtYV9tYXNrID0gMHgwNzsKLQlwcm9iZV9lbnQtPnVkbWFfbWFzayA9IDB4N2Y7Ci0KLQltbWlvX2Jhc2UgPSBwcm9iZV9lbnQtPmlvbWFwW1ZTQ19NTUlPX0JBUl07Ci0KLQkvKiBXZSBoYXZlIDQgcG9ydHMgcGVyIFBDSSBmdW5jdGlvbiAqLwotCXZzY19zYXRhX3NldHVwX3BvcnQoJnByb2JlX2VudC0+cG9ydFswXSwgbW1pb19iYXNlICsgMSAqIFZTQ19TQVRBX1BPUlRfT0ZGU0VUKTsKLQl2c2Nfc2F0YV9zZXR1cF9wb3J0KCZwcm9iZV9lbnQtPnBvcnRbMV0sIG1taW9fYmFzZSArIDIgKiBWU0NfU0FUQV9QT1JUX09GRlNFVCk7Ci0JdnNjX3NhdGFfc2V0dXBfcG9ydCgmcHJvYmVfZW50LT5wb3J0WzJdLCBtbWlvX2Jhc2UgKyAzICogVlNDX1NBVEFfUE9SVF9PRkZTRVQpOwotCXZzY19zYXRhX3NldHVwX3BvcnQoJnByb2JlX2VudC0+cG9ydFszXSwgbW1pb19iYXNlICsgNCAqIFZTQ19TQVRBX1BPUlRfT0ZGU0VUKTsKLQotCXBjaV9zZXRfbWFzdGVyKHBkZXYpOwogCiAJLyoKIAkgKiBDb25maWcgb2Zmc2V0IDB4OTggaXMgIkV4dGVuZGVkIENvbnRyb2wgYW5kIFN0YXR1cyBSZWdpc3RlciAwIgpAQCAtNDU0LDExICs0NDAsOSBAQAogCSAqLwogCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgMHg5OCwgMCk7CiAKLQlpZiAoIWF0YV9kZXZpY2VfYWRkKHByb2JlX2VudCkpCi0JCXJldHVybiAtRU5PREVWOwotCi0JZGV2bV9rZnJlZSgmcGRldi0+ZGV2LCBwcm9iZV9lbnQpOwotCXJldHVybiAwOworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCXJldHVybiBhdGFfaG9zdF9hY3RpdmF0ZShob3N0LCBwZGV2LT5pcnEsIHZzY19zYXRhX2ludGVycnVwdCwKKwkJCQkgSVJRRl9TSEFSRUQsICZ2c2Nfc2F0YV9zaHQpOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgdnNjX3NhdGFfcGNpX3RibFtdID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdG0vYW1iYXNzYWRvci5jIGIvZHJpdmVycy9hdG0vYW1iYXNzYWRvci5jCmluZGV4IDNjMzcyZTAuLjU5NjUxYWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRtL2FtYmFzc2Fkb3IuYworKysgYi9kcml2ZXJzL2F0bS9hbWJhc3NhZG9yLmMKQEAgLTgyMSw3ICs4MjEsNyBAQAogICAgIH0KICAgICAvLyBjYXN0IG5lZWRlZCBhcyB0aGVyZSBpcyBubyAlPyBmb3IgcG9pbnRlciBkaWZmZXJlbmNlcwogICAgIFBSSU5URCAoREJHX1NLQiwgImFsbG9jYXRlZCBza2IgYXQgJXAsIGhlYWQgJXAsIGFyZWEgJWxpIiwKLQkgICAgc2tiLCBza2ItPmhlYWQsIChsb25nKSAoc2tiLT5lbmQgLSBza2ItPmhlYWQpKTsKKwkgICAgc2tiLCBza2ItPmhlYWQsIChsb25nKSAoc2tiX2VuZF9wb2ludGVyKHNrYikgLSBza2ItPmhlYWQpKTsKICAgICByeC5oYW5kbGUgPSB2aXJ0X3RvX2J1cyAoc2tiKTsKICAgICByeC5ob3N0X2FkZHJlc3MgPSBjcHVfdG9fYmUzMiAodmlydF90b19idXMgKHNrYi0+ZGF0YSkpOwogICAgIGlmIChyeF9naXZlIChkZXYsICZyeCwgcG9vbCkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0bS9hdG10Y3AuYyBiL2RyaXZlcnMvYXRtL2F0bXRjcC5jCmluZGV4IGZjNTE4ZDguLjAyYWQ4M2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRtL2F0bXRjcC5jCisrKyBiL2RyaXZlcnMvYXRtL2F0bXRjcC5jCkBAIC0yMjEsNyArMjIxLDcgQEAKIAloZHItPnZwaSA9IGh0b25zKHZjYy0+dnBpKTsKIAloZHItPnZjaSA9IGh0b25zKHZjYy0+dmNpKTsKIAloZHItPmxlbmd0aCA9IGh0b25sKHNrYi0+bGVuKTsKLQltZW1jcHkoc2tiX3B1dChuZXdfc2tiLHNrYi0+bGVuKSxza2ItPmRhdGEsc2tiLT5sZW4pOworCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCBza2JfcHV0KG5ld19za2IsIHNrYi0+bGVuKSwgc2tiLT5sZW4pOwogCWlmICh2Y2MtPnBvcCkgdmNjLT5wb3AodmNjLHNrYik7CiAJZWxzZSBkZXZfa2ZyZWVfc2tiKHNrYik7CiAJb3V0X3ZjYy0+cHVzaChvdXRfdmNjLG5ld19za2IpOwpAQCAtMzEwLDcgKzMxMCw3IEBACiAJCWdvdG8gZG9uZTsKIAl9CiAJX19uZXRfdGltZXN0YW1wKG5ld19za2IpOwotCW1lbWNweShza2JfcHV0KG5ld19za2Isc2tiLT5sZW4pLHNrYi0+ZGF0YSxza2ItPmxlbik7CisJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIHNrYl9wdXQobmV3X3NrYiwgc2tiLT5sZW4pLCBza2ItPmxlbik7CiAJb3V0X3ZjYy0+cHVzaChvdXRfdmNjLG5ld19za2IpOwogCWF0b21pY19pbmMoJnZjYy0+c3RhdHMtPnR4KTsKIAlhdG9taWNfaW5jKCZvdXRfdmNjLT5zdGF0cy0+cngpOwpAQCAtMzUyLDcgKzM1Miw3IEBACiAJLm9wcwkJPSAmYXRtdGNwX2NfZGV2X29wcywKIAkudHlwZQkJPSAiYXRtdGNwIiwKIAkubnVtYmVyCQk9IDk5OSwKLQkubG9jawkJPSBTUElOX0xPQ0tfVU5MT0NLRUQKKwkubG9jawkJPSBfX1NQSU5fTE9DS19VTkxPQ0tFRChhdG10Y3BfY29udHJvbF9kZXYubG9jaykKIH07CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdG0vZW5pLmMgYi9kcml2ZXJzL2F0bS9lbmkuYwppbmRleCA4ZmNjZjAxLi4wZDNhMzhiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0bS9lbmkuYworKysgYi9kcml2ZXJzL2F0bS9lbmkuYwpAQCAtNTM2LDcgKzUzNiw3IEBACiAJCXJldHVybiAwOwogCX0KIAlza2JfcHV0KHNrYixsZW5ndGgpOwotCXNrYl9zZXRfdGltZXN0YW1wKHNrYiwgJmVuaV92Y2MtPnRpbWVzdGFtcCk7CisJc2tiLT50c3RhbXAgPSBlbmlfdmNjLT50aW1lc3RhbXA7CiAJRFBSSU5USygiZ290IGxlbiAlbGRcbiIsbGVuZ3RoKTsKIAlpZiAoZG9fcnhfZG1hKHZjYyxza2IsMSxsZW5ndGggPj4gMixsZW5ndGggPj4gMikpIHJldHVybiAxOwogCWVuaV92Y2MtPnJ4aW5nKys7CkBAIC03MDEsNyArNzAxLDcgQEAKIAkJCURQUklOVEsoIkdyciwgc2VydmljaW5nIFZDQyAlbGQgdHdpY2VcbiIsdmNpKTsKIAkJCWNvbnRpbnVlOwogCQl9Ci0JCWRvX2dldHRpbWVvZmRheSgmRU5JX1ZDQyh2Y2MpLT50aW1lc3RhbXApOworCQlFTklfVkNDKHZjYyktPnRpbWVzdGFtcCA9IGt0aW1lX2dldF9yZWFsKCk7CiAJCUVOSV9WQ0ModmNjKS0+bmV4dCA9IE5VTEw7CiAJCWlmICh2Y2MtPnFvcy5yeHRwLnRyYWZmaWNfY2xhc3MgPT0gQVRNX0NCUikgewogCQkJaWYgKGVuaV9kZXYtPmZhc3QpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0bS9lbmkuaCBiL2RyaXZlcnMvYXRtL2VuaS5oCmluZGV4IDM4NTA5MGMuLmQwNGZlZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRtL2VuaS5oCisrKyBiL2RyaXZlcnMvYXRtL2VuaS5oCkBAIC01OSw3ICs1OSw3IEBACiAJaW50IHJ4aW5nOwkJCS8qIG51bWJlciBvZiBwZW5kaW5nIFBEVXMgKi8KIAlpbnQgc2VydmljaW5nOwkJCS8qIG51bWJlciBvZiB3YWl0aW5nIFZDcyAoMCBvciAxKSAqLwogCWludCB0eGluZzsJCQkvKiBudW1iZXIgb2YgcGVuZGluZyBUWCBieXRlcyAqLwotCXN0cnVjdCB0aW1ldmFsIHRpbWVzdGFtcDsJLyogZm9yIFJYIHRpbWluZyAqLworCWt0aW1lX3QgdGltZXN0YW1wOwkJLyogZm9yIFJYIHRpbWluZyAqLwogCXN0cnVjdCBhdG1fdmNjICpuZXh0OwkJLyogbmV4dCBwZW5kaW5nIFJYICovCiAJc3RydWN0IHNrX2J1ZmYgKmxhc3Q7CQkvKiBsYXN0IFBEVSBiZWluZyBETUFlZCAodXNlZCB0byBjYXJyeQogCQkJCQkgICBkaXNjYXJkIGluZm9ybWF0aW9uKSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdG0vZm9yZTIwMGUuYyBiL2RyaXZlcnMvYXRtL2ZvcmUyMDBlLmMKaW5kZXggYTdjMGVkMy4uNDA1ZWU1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdG0vZm9yZTIwMGUuYworKysgYi9kcml2ZXJzL2F0bS9mb3JlMjAwZS5jCkBAIC0xLDYgKzEsNCBAQAogLyoKLSAgJElkOiBmb3JlMjAwZS5jLHYgMS41IDIwMDAvMDQvMTQgMTA6MTA6MzQgZGF2ZW0gRXhwICQKLQogICBBIEZPUkUgU3lzdGVtcyAyMDBFLXNlcmllcyBkcml2ZXIgZm9yIEFUTSBvbiBMaW51eC4KICAgQ2hyaXN0b3BoZSBMaXp6aSAobGl6emlAY25hbS5mciksIE9jdG9iZXIgMTk5OS1NYXJjaCAyMDAzLgogCkBAIC0xNTAyLDkgKzE1MDAsOSBAQAogICAgIC8qIHBzZXVkby1DQlIgYmFuZHdpZHRoIHJlcXVlc3RlZD8gKi8KICAgICBpZiAoKHZjYy0+cW9zLnR4dHAudHJhZmZpY19jbGFzcyA9PSBBVE1fQ0JSKSAmJiAodmNjLT5xb3MudHh0cC5tYXhfcGNyID4gMCkpIHsKIAkKLQlkb3duKCZmb3JlMjAwZS0+cmF0ZV9zZik7CisJbXV0ZXhfbG9jaygmZm9yZTIwMGUtPnJhdGVfbXR4KTsKIAlpZiAoZm9yZTIwMGUtPmF2YWlsYWJsZV9jZWxsX3JhdGUgPCB2Y2MtPnFvcy50eHRwLm1heF9wY3IpIHsKLQkgICAgdXAoJmZvcmUyMDBlLT5yYXRlX3NmKTsKKwkgICAgbXV0ZXhfdW5sb2NrKCZmb3JlMjAwZS0+cmF0ZV9tdHgpOwogCiAJICAgIGtmcmVlKGZvcmUyMDBlX3ZjYyk7CiAJICAgIHZjX21hcC0+dmNjID0gTlVMTDsKQEAgLTE1MTMsNyArMTUxMSw3IEBACiAKIAkvKiByZXNlcnZlIGJhbmR3aWR0aCAqLwogCWZvcmUyMDBlLT5hdmFpbGFibGVfY2VsbF9yYXRlIC09IHZjYy0+cW9zLnR4dHAubWF4X3BjcjsKLQl1cCgmZm9yZTIwMGUtPnJhdGVfc2YpOworCW11dGV4X3VubG9jaygmZm9yZTIwMGUtPnJhdGVfbXR4KTsKICAgICB9CiAgICAgCiAgICAgdmNjLT5pdGYgPSB2Y2MtPmRldi0+bnVtYmVyOwpAQCAtMTU5OSw5ICsxNTk3LDkgQEAKICAgICAvKiByZWxlYXNlIHJlc2VydmVkIGJhbmR3aWR0aCwgaWYgYW55ICovCiAgICAgaWYgKCh2Y2MtPnFvcy50eHRwLnRyYWZmaWNfY2xhc3MgPT0gQVRNX0NCUikgJiYgKHZjYy0+cW9zLnR4dHAubWF4X3BjciA+IDApKSB7CiAKLQlkb3duKCZmb3JlMjAwZS0+cmF0ZV9zZik7CisJbXV0ZXhfbG9jaygmZm9yZTIwMGUtPnJhdGVfbXR4KTsKIAlmb3JlMjAwZS0+YXZhaWxhYmxlX2NlbGxfcmF0ZSArPSB2Y2MtPnFvcy50eHRwLm1heF9wY3I7Ci0JdXAoJmZvcmUyMDBlLT5yYXRlX3NmKTsKKwltdXRleF91bmxvY2soJmZvcmUyMDBlLT5yYXRlX210eCk7CiAKIAljbGVhcl9iaXQoQVRNX1ZGX0hBU1FPUywgJnZjYy0+ZmxhZ3MpOwogICAgIH0KQEAgLTIwNjQsMTYgKzIwNjIsMTYgQEAKIAogICAgIGlmICgocW9zLT50eHRwLnRyYWZmaWNfY2xhc3MgPT0gQVRNX0NCUikgJiYgKHFvcy0+dHh0cC5tYXhfcGNyID4gMCkpIHsKIAotCWRvd24oJmZvcmUyMDBlLT5yYXRlX3NmKTsKKwltdXRleF9sb2NrKCZmb3JlMjAwZS0+cmF0ZV9tdHgpOwogCWlmIChmb3JlMjAwZS0+YXZhaWxhYmxlX2NlbGxfcmF0ZSArIHZjYy0+cW9zLnR4dHAubWF4X3BjciA8IHFvcy0+dHh0cC5tYXhfcGNyKSB7Ci0JICAgIHVwKCZmb3JlMjAwZS0+cmF0ZV9zZik7CisJICAgIG11dGV4X3VubG9jaygmZm9yZTIwMGUtPnJhdGVfbXR4KTsKIAkgICAgcmV0dXJuIC1FQUdBSU47CiAJfQogCiAJZm9yZTIwMGUtPmF2YWlsYWJsZV9jZWxsX3JhdGUgKz0gdmNjLT5xb3MudHh0cC5tYXhfcGNyOwogCWZvcmUyMDBlLT5hdmFpbGFibGVfY2VsbF9yYXRlIC09IHFvcy0+dHh0cC5tYXhfcGNyOwogCi0JdXAoJmZvcmUyMDBlLT5yYXRlX3NmKTsKKwltdXRleF91bmxvY2soJmZvcmUyMDBlLT5yYXRlX210eCk7CiAJCiAJbWVtY3B5KCZ2Y2MtPnFvcywgcW9zLCBzaXplb2Yoc3RydWN0IGF0bV9xb3MpKTsKIAkKQEAgLTI0NTksNyArMjQ1Nyw3IEBACiAKICAgICBEUFJJTlRLKDIsICJkZXZpY2UgJXMgYmVpbmcgaW5pdGlhbGl6ZWRcbiIsIGZvcmUyMDBlLT5uYW1lKTsKIAotICAgIGluaXRfTVVURVgoJmZvcmUyMDBlLT5yYXRlX3NmKTsKKyAgICBtdXRleF9pbml0KCZmb3JlMjAwZS0+cmF0ZV9tdHgpOwogICAgIHNwaW5fbG9ja19pbml0KCZmb3JlMjAwZS0+cV9sb2NrKTsKIAogICAgIGNwcSA9IGZvcmUyMDBlLT5jcF9xdWV1ZXMgPSBmb3JlMjAwZS0+dmlydF9iYXNlICsgRk9SRTIwMEVfQ1BfUVVFVUVTX09GRlNFVDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRtL2ZvcmUyMDBlLmggYi9kcml2ZXJzL2F0bS9mb3JlMjAwZS5oCmluZGV4IGY5YWJmZGEuLmI4NWE1NDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRtL2ZvcmUyMDBlLmgKKysrIGIvZHJpdmVycy9hdG0vZm9yZTIwMGUuaApAQCAtODY5LDcgKzg2OSw3IEBACiAKICAgICBzdHJ1Y3Qgc3RhdHMqICAgICAgICAgICAgICBzdGF0czsgICAgICAgICAgICAgICAgICAvKiBsYXN0IHNuYXBzaG90IG9mIHRoZSBzdGF0cyAgICAgICAgICovCiAgICAgCi0gICAgc3RydWN0IHNlbWFwaG9yZSAgICAgICAgICAgcmF0ZV9zZjsgICAgICAgICAgICAgICAgLyogcHJvdGVjdHMgcmF0ZSByZXNlcnZhdGlvbiBvcHMgICAgICAqLworICAgIHN0cnVjdCBtdXRleCAgICAgICAgICAgICAgIHJhdGVfbXR4OyAgICAgICAgICAgICAgIC8qIHByb3RlY3RzIHJhdGUgcmVzZXJ2YXRpb24gb3BzICAgICAgKi8KICAgICBzcGlubG9ja190ICAgICAgICAgICAgICAgICBxX2xvY2s7ICAgICAgICAgICAgICAgICAvKiBwcm90ZWN0cyBxdWV1ZSBvcHMgICAgICAgICAgICAgICAgICovCiAjaWZkZWYgRk9SRTIwMEVfVVNFX1RBU0tMRVQKICAgICBzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgICAgICB0eF90YXNrbGV0OyAgICAgICAgICAgICAvKiBwZXJmb3JtcyB0eCBpbnRlcnJ1cHQgd29yayAgICAgICAgICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0bS9oZS5jIGIvZHJpdmVycy9hdG0vaGUuYwppbmRleCA4NTEwMDI2Li5kMzNhYmE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0bS9oZS5jCisrKyBiL2RyaXZlcnMvYXRtL2hlLmMKQEAgLTE5MDEsMTMgKzE5MDEsMTMgQEAKIAkJCWNhc2UgQVRNX0FBTDA6CiAJCQkJLyogMi4xMC4xLjUgcmF3IGNlbGwgcmVjZWl2ZSAqLwogCQkJCXNrYi0+bGVuID0gQVRNX0FBTDBfU0RVOwotCQkJCXNrYi0+dGFpbCA9IHNrYi0+ZGF0YSArIHNrYi0+bGVuOworCQkJCXNrYl9zZXRfdGFpbF9wb2ludGVyKHNrYiwgc2tiLT5sZW4pOwogCQkJCWJyZWFrOwogCQkJY2FzZSBBVE1fQUFMNToKIAkJCQkvKiAyLjEwLjEuMiBhYWw1IHJlY2VpdmUgKi8KIAogCQkJCXNrYi0+bGVuID0gQUFMNV9MRU4oc2tiLT5kYXRhLCBoZV92Y2MtPnBkdV9sZW4pOwotCQkJCXNrYi0+dGFpbCA9IHNrYi0+ZGF0YSArIHNrYi0+bGVuOworCQkJCXNrYl9zZXRfdGFpbF9wb2ludGVyKHNrYiwgc2tiLT5sZW4pOwogI2lmZGVmIFVTRV9DSEVDS1NVTV9IVwogCQkJCWlmICh2Y2MtPnZwaSA9PSAwICYmIHZjYy0+dmNpID49IEFUTV9OT1RfUlNWX1ZDSSkgewogCQkJCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX0NPTVBMRVRFOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdG0vaWR0NzcyNTIuYyBiL2RyaXZlcnMvYXRtL2lkdDc3MjUyLmMKaW5kZXggYjRiODAxNDAuLjA1N2VmYmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRtL2lkdDc3MjUyLmMKKysrIGIvZHJpdmVycy9hdG0vaWR0NzcyNTIuYwpAQCAtMTA2NSw3ICsxMDY1LDggQEAKIAl2Y2MgPSB2Yy0+cnhfdmNjOwogCiAJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KGNhcmQtPnBjaWRldiwgSURUNzcyNTJfUFJWX1BBRERSKHNrYiksCi0JCQkJICAgIHNrYi0+ZW5kIC0gc2tiLT5kYXRhLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJCSAgICBza2JfZW5kX3BvaW50ZXIoc2tiKSAtIHNrYi0+ZGF0YSwKKwkJCQkgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKIAogCWlmICgodmNjLT5xb3MuYWFsID09IEFUTV9BQUwwKSB8fAogCSAgICAodmNjLT5xb3MuYWFsID09IEFUTV9BQUwzNCkpIHsKQEAgLTExOTQsNyArMTE5NSw4IEBACiAJCX0KIAogCQlwY2lfdW5tYXBfc2luZ2xlKGNhcmQtPnBjaWRldiwgSURUNzcyNTJfUFJWX1BBRERSKHNrYiksCi0JCQkJIHNrYi0+ZW5kIC0gc2tiLT5kYXRhLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJCSBza2JfZW5kX3BvaW50ZXIoc2tiKSAtIHNrYi0+ZGF0YSwKKwkJCQkgUENJX0RNQV9GUk9NREVWSUNFKTsKIAkJc2JfcG9vbF9yZW1vdmUoY2FyZCwgc2tiKTsKIAogCQlza2JfdHJpbShza2IsIGxlbik7CkBAIC0xMjY3LDcgKzEyNjksNyBAQAogCXRhaWwgPSByZWFkbChTQVJfUkVHX1JBV0NUKTsKIAogCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdShjYXJkLT5wY2lkZXYsIElEVDc3MjUyX1BSVl9QQUREUihxdWV1ZSksCi0JCQkJICAgIHF1ZXVlLT5lbmQgLSBxdWV1ZS0+aGVhZCAtIDE2LAorCQkJCSAgICBza2JfZW5kX3BvaW50ZXIocXVldWUpIC0gcXVldWUtPmhlYWQgLSAxNiwKIAkJCQkgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKIAogCXdoaWxlIChoZWFkICE9IHRhaWwpIHsKQEAgLTEzNjMsNyArMTM2NSw4IEBACiAJCQkJcXVldWUgPSBjYXJkLT5yYXdfY2VsbF9oZWFkOwogCQkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdShjYXJkLT5wY2lkZXYsCiAJCQkJCQkJICAgIElEVDc3MjUyX1BSVl9QQUREUihxdWV1ZSksCi0JCQkJCQkJICAgIHF1ZXVlLT5lbmQgLSBxdWV1ZS0+ZGF0YSwKKwkJCQkJCQkgICAgKHNrYl9lbmRfcG9pbnRlcihxdWV1ZSkgLQorCQkJCQkJCSAgICAgcXVldWUtPmRhdGEpLAogCQkJCQkJCSAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOwogCQkJfSBlbHNlIHsKIAkJCQljYXJkLT5yYXdfY2VsbF9oZWFkID0gTlVMTDsKQEAgLTE4MTYsNyArMTgxOSw4IEBACiAJdTMyIGhhbmRsZTsKIAl1MzIgYWRkcjsKIAotCXNrYi0+ZGF0YSA9IHNrYi0+dGFpbCA9IHNrYi0+aGVhZDsKKwlza2ItPmRhdGEgPSBza2ItPmhlYWQ7CisJc2tiX3Jlc2V0X3RhaWxfcG9pbnRlcihza2IpOwogCXNrYi0+bGVuID0gMDsKIAogCXNrYl9yZXNlcnZlKHNrYiwgMTYpOwpAQCAtMTgzNSw3ICsxODM5LDYgQEAKIAkJc2tiX3B1dChza2IsIFNBUl9GQl9TSVpFXzMpOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlkZXZfa2ZyZWVfc2tiKHNrYik7CiAJCXJldHVybiAtMTsKIAl9CiAKQEAgLTE4NzQsNyArMTg3Nyw3IEBACiAJCX0KIAogCQlwYWRkciA9IHBjaV9tYXBfc2luZ2xlKGNhcmQtPnBjaWRldiwgc2tiLT5kYXRhLAotCQkJCSAgICAgICBza2ItPmVuZCAtIHNrYi0+ZGF0YSwKKwkJCQkgICAgICAgc2tiX2VuZF9wb2ludGVyKHNrYikgLSBza2ItPmRhdGEsCiAJCQkJICAgICAgIFBDSV9ETUFfRlJPTURFVklDRSk7CiAJCUlEVDc3MjUyX1BSVl9QQUREUihza2IpID0gcGFkZHI7CiAKQEAgLTE4ODgsNyArMTg5MSw3IEBACiAKIG91dHVubWFwOgogCXBjaV91bm1hcF9zaW5nbGUoY2FyZC0+cGNpZGV2LCBJRFQ3NzI1Ml9QUlZfUEFERFIoc2tiKSwKLQkJCSBza2ItPmVuZCAtIHNrYi0+ZGF0YSwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCSBza2JfZW5kX3BvaW50ZXIoc2tiKSAtIHNrYi0+ZGF0YSwgUENJX0RNQV9GUk9NREVWSUNFKTsKIAogCWhhbmRsZSA9IElEVDc3MjUyX1BSVl9QT09MKHNrYik7CiAJY2FyZC0+c2Jwb29sW1BPT0xfUVVFVUUoaGFuZGxlKV0uc2tiW1BPT0xfSU5ERVgoaGFuZGxlKV0gPSBOVUxMOwpAQCAtMTkwNSwxMiArMTkwOCwxNCBAQAogCWludCBlcnI7CiAKIAlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UoY2FyZC0+cGNpZGV2LCBJRFQ3NzI1Ml9QUlZfUEFERFIoc2tiKSwKLQkJCQkgICAgICAgc2tiLT5lbmQgLSBza2ItPmRhdGEsIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQkJICAgICAgIHNrYl9lbmRfcG9pbnRlcihza2IpIC0gc2tiLT5kYXRhLAorCQkJCSAgICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOwogCiAJZXJyID0gcHVzaF9yeF9za2IoY2FyZCwgc2tiLCBQT09MX1FVRVVFKGhhbmRsZSkpOwogCWlmIChlcnIpIHsKIAkJcGNpX3VubWFwX3NpbmdsZShjYXJkLT5wY2lkZXYsIElEVDc3MjUyX1BSVl9QQUREUihza2IpLAotCQkJCSBza2ItPmVuZCAtIHNrYi0+ZGF0YSwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCQkgc2tiX2VuZF9wb2ludGVyKHNrYikgLSBza2ItPmRhdGEsCisJCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7CiAJCXNiX3Bvb2xfcmVtb3ZlKGNhcmQsIHNrYik7CiAJCWRldl9rZnJlZV9za2Ioc2tiKTsKIAl9CkBAIC0zMTIyLDcgKzMxMjcsOCBAQAogCQkJaWYgKHNrYikgewogCQkJCXBjaV91bm1hcF9zaW5nbGUoY2FyZC0+cGNpZGV2LAogCQkJCQkJIElEVDc3MjUyX1BSVl9QQUREUihza2IpLAotCQkJCQkJIHNrYi0+ZW5kIC0gc2tiLT5kYXRhLAorCQkJCQkJIChza2JfZW5kX3BvaW50ZXIoc2tiKSAtCisJCQkJCQkgIHNrYi0+ZGF0YSksCiAJCQkJCQkgUENJX0RNQV9GUk9NREVWSUNFKTsKIAkJCQljYXJkLT5zYnBvb2xbaV0uc2tiW2pdID0gTlVMTDsKIAkJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0bS9uaWNzdGFyLmMgYi9kcml2ZXJzL2F0bS9uaWNzdGFyLmMKaW5kZXggYWFiOWIzNy4uMTRjZWQ4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdG0vbmljc3Rhci5jCisrKyBiL2RyaXZlcnMvYXRtL25pY3N0YXIuYwpAQCAtMjIwOCw3ICsyMjA4LDcgQEAKICAgICAgICAgIGlmIChpID09IDEgJiYgbnNfcnNxZV9lb3BkdShyc3FlKSkKICAgICAgICAgICAgICooKHUzMiAqKSBzYi0+ZGF0YSkgfD0gMHgwMDAwMDAwMjsKICAgICAgICAgIHNrYl9wdXQoc2IsIE5TX0FBTDBfSEVBREVSKTsKLSAgICAgICAgIG1lbWNweShzYi0+dGFpbCwgY2VsbCwgQVRNX0NFTExfUEFZTE9BRCk7CisgICAgICAgICBtZW1jcHkoc2tiX3RhaWxfcG9pbnRlcihzYiksIGNlbGwsIEFUTV9DRUxMX1BBWUxPQUQpOwogICAgICAgICAgc2tiX3B1dChzYiwgQVRNX0NFTExfUEFZTE9BRCk7CiAgICAgICAgICBBVE1fU0tCKHNiKS0+dmNjID0gdmNjOwogCSBfX25ldF90aW1lc3RhbXAoc2IpOwpAQCAtMjI1Miw3ICsyMjUyLDggQEAKICAgICAgIHZjLT5yeF9pb3YgPSBpb3ZiOwogICAgICAgTlNfU0tCKGlvdmIpLT5pb3ZjbnQgPSAwOwogICAgICAgaW92Yi0+bGVuID0gMDsKLSAgICAgIGlvdmItPnRhaWwgPSBpb3ZiLT5kYXRhID0gaW92Yi0+aGVhZDsKKyAgICAgIGlvdmItPmRhdGEgPSBpb3ZiLT5oZWFkOworICAgICAgc2tiX3Jlc2V0X3RhaWxfcG9pbnRlcihpb3ZiKTsKICAgICAgIE5TX1NLQihpb3ZiKS0+dmNjID0gdmNjOwogICAgICAgLyogSU1QT1JUQU5UOiBhIHBvaW50ZXIgdG8gdGhlIHNrX2J1ZmYgY29udGFpbmluZyB0aGUgc21hbGwgb3IgbGFyZ2UKICAgICAgICAgICAgICAgICAgICAgYnVmZmVyIGlzIHN0b3JlZCBhcyBpb3ZlYyBiYXNlLCBOT1QgYSBwb2ludGVyIHRvIHRoZSAKQEAgLTIyNjUsNyArMjI2Niw4IEBACiAgICAgICByZWN5Y2xlX2lvdmVjX3J4X2J1ZnMoY2FyZCwgKHN0cnVjdCBpb3ZlYyAqKSBpb3ZiLT5kYXRhLCBOU19NQVhfSU9WRUNTKTsKICAgICAgIE5TX1NLQihpb3ZiKS0+aW92Y250ID0gMDsKICAgICAgIGlvdmItPmxlbiA9IDA7Ci0gICAgICBpb3ZiLT50YWlsID0gaW92Yi0+ZGF0YSA9IGlvdmItPmhlYWQ7CisgICAgICBpb3ZiLT5kYXRhID0gaW92Yi0+aGVhZDsKKyAgICAgIHNrYl9yZXNldF90YWlsX3BvaW50ZXIoaW92Yik7CiAgICAgICBOU19TS0IoaW92YiktPnZjYyA9IHZjYzsKICAgIH0KICAgIGlvdiA9ICYoKHN0cnVjdCBpb3ZlYyAqKSBpb3ZiLT5kYXRhKVtOU19TS0IoaW92YiktPmlvdmNudCsrXTsKQEAgLTIzOTMsNyArMjM5NSw3IEBACiAgICAgICAgICAgICAgICBza2ItPmRlc3RydWN0b3IgPSBuc19sYl9kZXN0cnVjdG9yOwogI2VuZGlmIC8qIE5TX1VTRV9ERVNUUlVDVE9SUyAqLwogICAgICAgICAgICAgICAgc2tiX3B1c2goc2tiLCBOU19TTUJVRlNJWkUpOwotICAgICAgICAgICAgICAgbWVtY3B5KHNrYi0+ZGF0YSwgc2ItPmRhdGEsIE5TX1NNQlVGU0laRSk7CisgICAgICAgICAgICAgICBza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNiLCBza2ItPmRhdGEsIE5TX1NNQlVGU0laRSk7CiAgICAgICAgICAgICAgICBza2JfcHV0KHNrYiwgbGVuIC0gTlNfU01CVUZTSVpFKTsKICAgICAgICAgICAgICAgIEFUTV9TS0Ioc2tiKS0+dmNjID0gdmNjOwogCSAgICAgICBfX25ldF90aW1lc3RhbXAoc2tiKTsKQEAgLTI0NzcsNyArMjQ3OSw3IEBACiAJIHsKICAgICAgICAgICAgIC8qIENvcHkgdGhlIHNtYWxsIGJ1ZmZlciB0byB0aGUgaHVnZSBidWZmZXIgKi8KICAgICAgICAgICAgIHNiID0gKHN0cnVjdCBza19idWZmICopIGlvdi0+aW92X2Jhc2U7Ci0gICAgICAgICAgICBtZW1jcHkoaGItPmRhdGEsIHNiLT5kYXRhLCBpb3YtPmlvdl9sZW4pOworICAgICAgICAgICAgc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShzYiwgaGItPmRhdGEsIGlvdi0+aW92X2xlbik7CiAgICAgICAgICAgICBza2JfcHV0KGhiLCBpb3YtPmlvdl9sZW4pOwogICAgICAgICAgICAgcmVtYWluaW5nID0gbGVuIC0gaW92LT5pb3ZfbGVuOwogICAgICAgICAgICAgaW92Kys7CkBAIC0yNDg5LDcgKzI0OTEsNyBAQAogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbGIgPSAoc3RydWN0IHNrX2J1ZmYgKikgaW92LT5pb3ZfYmFzZTsKICAgICAgICAgICAgICAgIHRvY29weSA9IG1pbl90KGludCwgcmVtYWluaW5nLCBpb3YtPmlvdl9sZW4pOwotICAgICAgICAgICAgICAgbWVtY3B5KGhiLT50YWlsLCBsYi0+ZGF0YSwgdG9jb3B5KTsKKyAgICAgICAgICAgICAgIHNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEobGIsIHNrYl90YWlsX3BvaW50ZXIoaGIpLCB0b2NvcHkpOwogICAgICAgICAgICAgICAgc2tiX3B1dChoYiwgdG9jb3B5KTsKICAgICAgICAgICAgICAgIGlvdisrOwogICAgICAgICAgICAgICAgcmVtYWluaW5nIC09IHRvY29weTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9hdHRyaWJ1dGVfY29udGFpbmVyLmMgYi9kcml2ZXJzL2Jhc2UvYXR0cmlidXRlX2NvbnRhaW5lci5jCmluZGV4IDIyMjIwNzMuLjFlYzA2NTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9hdHRyaWJ1dGVfY29udGFpbmVyLmMKKysrIGIvZHJpdmVycy9iYXNlL2F0dHJpYnV0ZV9jb250YWluZXIuYwpAQCAtNjIsNyArNjIsNyBAQAogCiBzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCBhdHRyaWJ1dGVfY29udGFpbmVyX2xpc3Q7CiAKLXN0YXRpYyBERUNMQVJFX01VVEVYKGF0dHJpYnV0ZV9jb250YWluZXJfbXV0ZXgpOworc3RhdGljIERFRklORV9NVVRFWChhdHRyaWJ1dGVfY29udGFpbmVyX211dGV4KTsKIAogLyoqCiAgKiBhdHRyaWJ1dGVfY29udGFpbmVyX3JlZ2lzdGVyIC0gcmVnaXN0ZXIgYW4gYXR0cmlidXRlIGNvbnRhaW5lcgpAQCAtNzcsOSArNzcsOSBAQAogCWtsaXN0X2luaXQoJmNvbnQtPmNvbnRhaW5lcnMsaW50ZXJuYWxfY29udGFpbmVyX2tsaXN0X2dldCwKIAkJICAgaW50ZXJuYWxfY29udGFpbmVyX2tsaXN0X3B1dCk7CiAJCQotCWRvd24oJmF0dHJpYnV0ZV9jb250YWluZXJfbXV0ZXgpOworCW11dGV4X2xvY2soJmF0dHJpYnV0ZV9jb250YWluZXJfbXV0ZXgpOwogCWxpc3RfYWRkX3RhaWwoJmNvbnQtPm5vZGUsICZhdHRyaWJ1dGVfY29udGFpbmVyX2xpc3QpOwotCXVwKCZhdHRyaWJ1dGVfY29udGFpbmVyX211dGV4KTsKKwltdXRleF91bmxvY2soJmF0dHJpYnV0ZV9jb250YWluZXJfbXV0ZXgpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC05NCw3ICs5NCw3IEBACiBhdHRyaWJ1dGVfY29udGFpbmVyX3VucmVnaXN0ZXIoc3RydWN0IGF0dHJpYnV0ZV9jb250YWluZXIgKmNvbnQpCiB7CiAJaW50IHJldHZhbCA9IC1FQlVTWTsKLQlkb3duKCZhdHRyaWJ1dGVfY29udGFpbmVyX211dGV4KTsKKwltdXRleF9sb2NrKCZhdHRyaWJ1dGVfY29udGFpbmVyX211dGV4KTsKIAlzcGluX2xvY2soJmNvbnQtPmNvbnRhaW5lcnMua19sb2NrKTsKIAlpZiAoIWxpc3RfZW1wdHkoJmNvbnQtPmNvbnRhaW5lcnMua19saXN0KSkKIAkJZ290byBvdXQ7CkBAIC0xMDIsNyArMTAyLDcgQEAKIAlsaXN0X2RlbCgmY29udC0+bm9kZSk7CiAgb3V0OgogCXNwaW5fdW5sb2NrKCZjb250LT5jb250YWluZXJzLmtfbG9jayk7Ci0JdXAoJmF0dHJpYnV0ZV9jb250YWluZXJfbXV0ZXgpOworCW11dGV4X3VubG9jaygmYXR0cmlidXRlX2NvbnRhaW5lcl9tdXRleCk7CiAJcmV0dXJuIHJldHZhbDsKIAkJCiB9CkBAIC0xNDUsNyArMTQ1LDcgQEAKIHsKIAlzdHJ1Y3QgYXR0cmlidXRlX2NvbnRhaW5lciAqY29udDsKIAotCWRvd24oJmF0dHJpYnV0ZV9jb250YWluZXJfbXV0ZXgpOworCW11dGV4X2xvY2soJmF0dHJpYnV0ZV9jb250YWluZXJfbXV0ZXgpOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoY29udCwgJmF0dHJpYnV0ZV9jb250YWluZXJfbGlzdCwgbm9kZSkgewogCQlzdHJ1Y3QgaW50ZXJuYWxfY29udGFpbmVyICppYzsKIApAQCAtMTczLDcgKzE3Myw3IEBACiAJCQlhdHRyaWJ1dGVfY29udGFpbmVyX2FkZF9jbGFzc19kZXZpY2UoJmljLT5jbGFzc2Rldik7CiAJCWtsaXN0X2FkZF90YWlsKCZpYy0+bm9kZSwgJmNvbnQtPmNvbnRhaW5lcnMpOwogCX0KLQl1cCgmYXR0cmlidXRlX2NvbnRhaW5lcl9tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZhdHRyaWJ1dGVfY29udGFpbmVyX211dGV4KTsKIH0KIAogLyogRklYTUU6IGNhbid0IGJyZWFrIG91dCBvZiB0aGlzIHVubGVzcyBrbGlzdF9pdGVyX2V4aXQgaXMgYWxzbwpAQCAtMjExLDcgKzIxMSw3IEBACiB7CiAJc3RydWN0IGF0dHJpYnV0ZV9jb250YWluZXIgKmNvbnQ7CiAKLQlkb3duKCZhdHRyaWJ1dGVfY29udGFpbmVyX211dGV4KTsKKwltdXRleF9sb2NrKCZhdHRyaWJ1dGVfY29udGFpbmVyX211dGV4KTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvbnQsICZhdHRyaWJ1dGVfY29udGFpbmVyX2xpc3QsIG5vZGUpIHsKIAkJc3RydWN0IGludGVybmFsX2NvbnRhaW5lciAqaWM7CiAJCXN0cnVjdCBrbGlzdF9pdGVyIGl0ZXI7CkBAIC0yMzQsNyArMjM0LDcgQEAKIAkJCX0KIAkJfQogCX0KLQl1cCgmYXR0cmlidXRlX2NvbnRhaW5lcl9tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZhdHRyaWJ1dGVfY29udGFpbmVyX211dGV4KTsKIH0KIAogLyoqCkBAIC0yNTUsNyArMjU1LDcgQEAKIHsKIAlzdHJ1Y3QgYXR0cmlidXRlX2NvbnRhaW5lciAqY29udDsKIAotCWRvd24oJmF0dHJpYnV0ZV9jb250YWluZXJfbXV0ZXgpOworCW11dGV4X2xvY2soJmF0dHJpYnV0ZV9jb250YWluZXJfbXV0ZXgpOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoY29udCwgJmF0dHJpYnV0ZV9jb250YWluZXJfbGlzdCwgbm9kZSkgewogCQlzdHJ1Y3QgaW50ZXJuYWxfY29udGFpbmVyICppYzsKIAkJc3RydWN0IGtsaXN0X2l0ZXIgaXRlcjsKQEAgLTI3Myw3ICsyNzMsNyBAQAogCQkJCWZuKGNvbnQsIGRldiwgJmljLT5jbGFzc2Rldik7CiAJCX0KIAl9Ci0JdXAoJmF0dHJpYnV0ZV9jb250YWluZXJfbXV0ZXgpOworCW11dGV4X3VubG9jaygmYXR0cmlidXRlX2NvbnRhaW5lcl9tdXRleCk7CiB9CiAKIC8qKgpAQCAtMjk1LDEyICsyOTUsMTIgQEAKIHsKIAlzdHJ1Y3QgYXR0cmlidXRlX2NvbnRhaW5lciAqY29udDsKIAotCWRvd24oJmF0dHJpYnV0ZV9jb250YWluZXJfbXV0ZXgpOworCW11dGV4X2xvY2soJmF0dHJpYnV0ZV9jb250YWluZXJfbXV0ZXgpOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoY29udCwgJmF0dHJpYnV0ZV9jb250YWluZXJfbGlzdCwgbm9kZSkgewogCQlpZiAoY29udC0+bWF0Y2goY29udCwgZGV2KSkKIAkJCWZuKGNvbnQsIGRldik7CiAJfQotCXVwKCZhdHRyaWJ1dGVfY29udGFpbmVyX211dGV4KTsKKwltdXRleF91bmxvY2soJmF0dHJpYnV0ZV9jb250YWluZXJfbXV0ZXgpOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9iYXNlLmggYi9kcml2ZXJzL2Jhc2UvYmFzZS5oCmluZGV4IGRlN2UxNDQuLmQ1OTdmMjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9iYXNlLmgKKysrIGIvZHJpdmVycy9iYXNlL2Jhc2UuaApAQCAtMTYsNyArMTYsNyBAQAogZXh0ZXJuIGludCBhdHRyaWJ1dGVfY29udGFpbmVyX2luaXQodm9pZCk7CiAKIGV4dGVybiBpbnQgYnVzX2FkZF9kZXZpY2Uoc3RydWN0IGRldmljZSAqIGRldik7Ci1leHRlcm4gaW50IGJ1c19hdHRhY2hfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKiBkZXYpOworZXh0ZXJuIHZvaWQgYnVzX2F0dGFjaF9kZXZpY2Uoc3RydWN0IGRldmljZSAqIGRldik7CiBleHRlcm4gdm9pZCBidXNfcmVtb3ZlX2RldmljZShzdHJ1Y3QgZGV2aWNlICogZGV2KTsKIGV4dGVybiBzdHJ1Y3QgYnVzX3R5cGUgKmdldF9idXMoc3RydWN0IGJ1c190eXBlICogYnVzKTsKIGV4dGVybiB2b2lkIHB1dF9idXMoc3RydWN0IGJ1c190eXBlICogYnVzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9idXMuYyBiL2RyaXZlcnMvYmFzZS9idXMuYwppbmRleCAyNTM4NjhlLi4xZDc2ZTIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvYnVzLmMKKysrIGIvZHJpdmVycy9iYXNlL2J1cy5jCkBAIC0yNyw2ICsyNyw5IEBACiAjZGVmaW5lIHRvX2RyaXZlcihvYmopIGNvbnRhaW5lcl9vZihvYmosIHN0cnVjdCBkZXZpY2VfZHJpdmVyLCBrb2JqKQogCiAKK3N0YXRpYyBpbnQgX19tdXN0X2NoZWNrIGJ1c19yZXNjYW5fZGV2aWNlc19oZWxwZXIoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkJdm9pZCAqZGF0YSk7CisKIHN0YXRpYyBzc2l6ZV90CiBkcnZfYXR0cl9zaG93KHN0cnVjdCBrb2JqZWN0ICoga29iaiwgc3RydWN0IGF0dHJpYnV0ZSAqIGF0dHIsIGNoYXIgKiBidWYpCiB7CkBAIC02MCw4ICs2MywxOSBAQAogCiBzdGF0aWMgdm9pZCBkcml2ZXJfcmVsZWFzZShzdHJ1Y3Qga29iamVjdCAqIGtvYmopCiB7Ci0Jc3RydWN0IGRldmljZV9kcml2ZXIgKiBkcnYgPSB0b19kcml2ZXIoa29iaik7Ci0JY29tcGxldGUoJmRydi0+dW5sb2FkZWQpOworCS8qCisJICogWWVzIHRoaXMgaXMgYW4gZW1wdHkgcmVsZWFzZSBmdW5jdGlvbiwgaXQgaXMgdGhpcyB3YXkgYmVjYXVzZSBzdHJ1Y3QKKwkgKiBkZXZpY2UgaXMgYWx3YXlzIGEgc3RhdGljIG9iamVjdCwgbm90IGEgZHluYW1pYyBvbmUuICBZZXMsIHRoaXMgaXMKKwkgKiBub3QgbmljZSBhbmQgYmFkLCBidXQgcmVtZW1iZXIsIGRyaXZlcnMgYXJlIGNvZGUsIHJlZmVyZW5jZSBjb3VudGVkCisJICogYnkgdGhlIG1vZHVsZSBjb3VudCwgbm90IGEgZGV2aWNlLCB3aGljaCBpcyByZWFsbHkgZGF0YS4gIEFuZCB5ZXMsCisJICogaW4gdGhlIGZ1dHVyZSBJIGRvIHdhbnQgdG8gaGF2ZSBhbGwgZHJpdmVycyBiZSBjcmVhdGVkIGR5bmFtaWNhbGx5LAorCSAqIGFuZCBhbSB3b3JraW5nIHRvd2FyZCB0aGF0IGdvYWwsIGJ1dCBpdCB3aWxsIHRha2UgYSBiaXQgbG9uZ2VyLi4uCisJICoKKwkgKiBCdXQgZG8gbm90IGxldCB0aGlzIGV4YW1wbGUgZ2l2ZSBfYW55b25lXyB0aGUgaWRlYSB0aGF0IHRoZXkgY2FuCisJICogY3JlYXRlIGEgcmVsZWFzZSBmdW5jdGlvbiB3aXRob3V0IGFueSBjb2RlIGluIGl0IGF0IGFsbCwgdG8gZG8gdGhhdAorCSAqIGlzIGFsbW9zdCBhbHdheXMgd3JvbmcuICBJZiB5b3UgaGF2ZSBhbnkgcXVlc3Rpb25zIGFib3V0IHRoaXMsCisJICogcGxlYXNlIHNlbmQgYW4gZW1haWwgdG8gPGdyZWdAa3JvYWguY29tPgorCSAqLwogfQogCiBzdGF0aWMgc3RydWN0IGtvYmpfdHlwZSBrdHlwZV9kcml2ZXIgPSB7CkBAIC0xMzMsNyArMTQ3LDYgQEAKIAogCiAjaWZkZWYgQ09ORklHX0hPVFBMVUcKLQogLyogTWFudWFsbHkgZGV0YWNoIGEgZGV2aWNlIGZyb20gaXRzIGFzc29jaWF0ZWQgZHJpdmVyLiAqLwogc3RhdGljIGludCBkcml2ZXJfaGVscGVyKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKIHsKQEAgLTE5OSw2ICsyMTIsMzMgQEAKIH0KIHN0YXRpYyBEUklWRVJfQVRUUihiaW5kLCBTX0lXVVNSLCBOVUxMLCBkcml2ZXJfYmluZCk7CiAKK3N0YXRpYyBzc2l6ZV90IHNob3dfZHJpdmVyc19hdXRvcHJvYmUoc3RydWN0IGJ1c190eXBlICpidXMsIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgYnVzLT5kcml2ZXJzX2F1dG9wcm9iZSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX2RyaXZlcnNfYXV0b3Byb2JlKHN0cnVjdCBidXNfdHlwZSAqYnVzLAorCQkJCSAgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlpZiAoYnVmWzBdID09ICcwJykKKwkJYnVzLT5kcml2ZXJzX2F1dG9wcm9iZSA9IDA7CisJZWxzZQorCQlidXMtPmRyaXZlcnNfYXV0b3Byb2JlID0gMTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX2RyaXZlcnNfcHJvYmUoc3RydWN0IGJ1c190eXBlICpidXMsCisJCQkJICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGRldmljZSAqZGV2OworCisJZGV2ID0gYnVzX2ZpbmRfZGV2aWNlKGJ1cywgTlVMTCwgKHZvaWQgKilidWYsIGRyaXZlcl9oZWxwZXIpOworCWlmICghZGV2KQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAoYnVzX3Jlc2Nhbl9kZXZpY2VzX2hlbHBlcihkZXYsIE5VTEwpICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiBjb3VudDsKK30KICNlbmRpZgogCiBzdGF0aWMgc3RydWN0IGRldmljZSAqIG5leHRfZGV2aWNlKHN0cnVjdCBrbGlzdF9pdGVyICogaSkKQEAgLTQxOCwyMSArNDU4LDIxIEBACiAgKgktIEFkZCBkZXZpY2UgdG8gYnVzJ3MgbGlzdCBvZiBkZXZpY2VzLgogICoJLSBUcnkgdG8gYXR0YWNoIHRvIGRyaXZlci4KICAqLwotaW50IGJ1c19hdHRhY2hfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKiBkZXYpCit2b2lkIGJ1c19hdHRhY2hfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKiBkZXYpCiB7CiAJc3RydWN0IGJ1c190eXBlICpidXMgPSBkZXYtPmJ1czsKIAlpbnQgcmV0ID0gMDsKIAogCWlmIChidXMpIHsKIAkJZGV2LT5pc19yZWdpc3RlcmVkID0gMTsKLQkJcmV0ID0gZGV2aWNlX2F0dGFjaChkZXYpOwotCQlpZiAocmV0ID49IDApIHsKKwkJaWYgKGJ1cy0+ZHJpdmVyc19hdXRvcHJvYmUpCisJCQlyZXQgPSBkZXZpY2VfYXR0YWNoKGRldik7CisJCVdBUk5fT04ocmV0IDwgMCk7CisJCWlmIChyZXQgPj0gMCkKIAkJCWtsaXN0X2FkZF90YWlsKCZkZXYtPmtub2RlX2J1cywgJmJ1cy0+a2xpc3RfZGV2aWNlcyk7Ci0JCQlyZXQgPSAwOwotCQl9IGVsc2UKKwkJZWxzZQogCQkJZGV2LT5pc19yZWdpc3RlcmVkID0gMDsKIAl9Ci0JcmV0dXJuIHJldDsKIH0KIAogLyoqCkBAIC01MTUsOSArNTU1LDQxIEBACiAJZHJpdmVyX3JlbW92ZV9maWxlKGRydiwgJmRyaXZlcl9hdHRyX2JpbmQpOwogCWRyaXZlcl9yZW1vdmVfZmlsZShkcnYsICZkcml2ZXJfYXR0cl91bmJpbmQpOwogfQorCitzdGF0aWMgaW50IGFkZF9wcm9iZV9maWxlcyhzdHJ1Y3QgYnVzX3R5cGUgKmJ1cykKK3sKKwlpbnQgcmV0dmFsOworCisJYnVzLT5kcml2ZXJzX3Byb2JlX2F0dHIuYXR0ci5uYW1lID0gImRyaXZlcnNfcHJvYmUiOworCWJ1cy0+ZHJpdmVyc19wcm9iZV9hdHRyLmF0dHIubW9kZSA9IFNfSVdVU1I7CisJYnVzLT5kcml2ZXJzX3Byb2JlX2F0dHIuYXR0ci5vd25lciA9IGJ1cy0+b3duZXI7CisJYnVzLT5kcml2ZXJzX3Byb2JlX2F0dHIuc3RvcmUgPSBzdG9yZV9kcml2ZXJzX3Byb2JlOworCXJldHZhbCA9IGJ1c19jcmVhdGVfZmlsZShidXMsICZidXMtPmRyaXZlcnNfcHJvYmVfYXR0cik7CisJaWYgKHJldHZhbCkKKwkJZ290byBvdXQ7CisKKwlidXMtPmRyaXZlcnNfYXV0b3Byb2JlX2F0dHIuYXR0ci5uYW1lID0gImRyaXZlcnNfYXV0b3Byb2JlIjsKKwlidXMtPmRyaXZlcnNfYXV0b3Byb2JlX2F0dHIuYXR0ci5tb2RlID0gU19JV1VTUiB8IFNfSVJVR087CisJYnVzLT5kcml2ZXJzX2F1dG9wcm9iZV9hdHRyLmF0dHIub3duZXIgPSBidXMtPm93bmVyOworCWJ1cy0+ZHJpdmVyc19hdXRvcHJvYmVfYXR0ci5zaG93ID0gc2hvd19kcml2ZXJzX2F1dG9wcm9iZTsKKwlidXMtPmRyaXZlcnNfYXV0b3Byb2JlX2F0dHIuc3RvcmUgPSBzdG9yZV9kcml2ZXJzX2F1dG9wcm9iZTsKKwlyZXR2YWwgPSBidXNfY3JlYXRlX2ZpbGUoYnVzLCAmYnVzLT5kcml2ZXJzX2F1dG9wcm9iZV9hdHRyKTsKKwlpZiAocmV0dmFsKQorCQlidXNfcmVtb3ZlX2ZpbGUoYnVzLCAmYnVzLT5kcml2ZXJzX3Byb2JlX2F0dHIpOworb3V0OgorCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkIHJlbW92ZV9wcm9iZV9maWxlcyhzdHJ1Y3QgYnVzX3R5cGUgKmJ1cykKK3sKKwlidXNfcmVtb3ZlX2ZpbGUoYnVzLCAmYnVzLT5kcml2ZXJzX2F1dG9wcm9iZV9hdHRyKTsKKwlidXNfcmVtb3ZlX2ZpbGUoYnVzLCAmYnVzLT5kcml2ZXJzX3Byb2JlX2F0dHIpOworfQogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgaW50IGFkZF9iaW5kX2ZpbGVzKHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYpIHsgcmV0dXJuIDA7IH0KIHN0YXRpYyBpbmxpbmUgdm9pZCByZW1vdmVfYmluZF9maWxlcyhzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KSB7fQorc3RhdGljIGlubGluZSBpbnQgYWRkX3Byb2JlX2ZpbGVzKHN0cnVjdCBidXNfdHlwZSAqYnVzKSB7IHJldHVybiAwOyB9CitzdGF0aWMgaW5saW5lIHZvaWQgcmVtb3ZlX3Byb2JlX2ZpbGVzKHN0cnVjdCBidXNfdHlwZSAqYnVzKSB7fQogI2VuZGlmCiAKIC8qKgpAQCAtNTMxLDcgKzYwMyw3IEBACiAJaW50IGVycm9yID0gMDsKIAogCWlmICghYnVzKQotCQlyZXR1cm4gMDsKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAlwcl9kZWJ1ZygiYnVzICVzOiBhZGQgZHJpdmVyICVzXG4iLCBidXMtPm5hbWUsIGRydi0+bmFtZSk7CiAJZXJyb3IgPSBrb2JqZWN0X3NldF9uYW1lKCZkcnYtPmtvYmosICIlcyIsIGRydi0+bmFtZSk7CkBAIC01NDEsOSArNjEzLDExIEBACiAJaWYgKChlcnJvciA9IGtvYmplY3RfcmVnaXN0ZXIoJmRydi0+a29iaikpKQogCQlnb3RvIG91dF9wdXRfYnVzOwogCi0JZXJyb3IgPSBkcml2ZXJfYXR0YWNoKGRydik7Ci0JaWYgKGVycm9yKQotCQlnb3RvIG91dF91bnJlZ2lzdGVyOworCWlmIChkcnYtPmJ1cy0+ZHJpdmVyc19hdXRvcHJvYmUpIHsKKwkJZXJyb3IgPSBkcml2ZXJfYXR0YWNoKGRydik7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gb3V0X3VucmVnaXN0ZXI7CisJfQogCWtsaXN0X2FkZF90YWlsKCZkcnYtPmtub2RlX2J1cywgJmJ1cy0+a2xpc3RfZHJpdmVycyk7CiAJbW9kdWxlX2FkZF9kcml2ZXIoZHJ2LT5vd25lciwgZHJ2KTsKIApAQCAtNjA1LDggKzY3OSw2IEBACiAJCXJldCA9IGRldmljZV9hdHRhY2goZGV2KTsKIAkJaWYgKGRldi0+cGFyZW50KQogCQkJdXAoJmRldi0+cGFyZW50LT5zZW0pOwotCQlpZiAocmV0ID4gMCkKLQkJCXJldCA9IDA7CiAJfQogCXJldHVybiByZXQgPCAwID8gcmV0IDogMDsKIH0KQEAgLTc2Miw2ICs4MzQsMTIgQEAKIAogCWtsaXN0X2luaXQoJmJ1cy0+a2xpc3RfZGV2aWNlcywga2xpc3RfZGV2aWNlc19nZXQsIGtsaXN0X2RldmljZXNfcHV0KTsKIAlrbGlzdF9pbml0KCZidXMtPmtsaXN0X2RyaXZlcnMsIE5VTEwsIE5VTEwpOworCisJYnVzLT5kcml2ZXJzX2F1dG9wcm9iZSA9IDE7CisJcmV0dmFsID0gYWRkX3Byb2JlX2ZpbGVzKGJ1cyk7CisJaWYgKHJldHZhbCkKKwkJZ290byBidXNfcHJvYmVfZmlsZXNfZmFpbDsKKwogCXJldHZhbCA9IGJ1c19hZGRfYXR0cnMoYnVzKTsKIAlpZiAocmV0dmFsKQogCQlnb3RvIGJ1c19hdHRyc19mYWlsOwpAQCAtNzcwLDYgKzg0OCw4IEBACiAJcmV0dXJuIDA7CiAKIGJ1c19hdHRyc19mYWlsOgorCXJlbW92ZV9wcm9iZV9maWxlcyhidXMpOworYnVzX3Byb2JlX2ZpbGVzX2ZhaWw6CiAJa3NldF91bnJlZ2lzdGVyKCZidXMtPmRyaXZlcnMpOwogYnVzX2RyaXZlcnNfZmFpbDoKIAlrc2V0X3VucmVnaXN0ZXIoJmJ1cy0+ZGV2aWNlcyk7CkBAIC03NzksNyArODU5LDYgQEAKIAlyZXR1cm4gcmV0dmFsOwogfQogCi0KIC8qKgogICoJYnVzX3VucmVnaXN0ZXIgLSByZW1vdmUgYSBidXMgZnJvbSB0aGUgc3lzdGVtCiAgKglAYnVzOglidXMuCkBAIC03OTEsNiArODcwLDcgQEAKIHsKIAlwcl9kZWJ1ZygiYnVzICVzOiB1bnJlZ2lzdGVyaW5nXG4iLCBidXMtPm5hbWUpOwogCWJ1c19yZW1vdmVfYXR0cnMoYnVzKTsKKwlyZW1vdmVfcHJvYmVfZmlsZXMoYnVzKTsKIAlrc2V0X3VucmVnaXN0ZXIoJmJ1cy0+ZHJpdmVycyk7CiAJa3NldF91bnJlZ2lzdGVyKCZidXMtPmRldmljZXMpOwogCXN1YnN5c3RlbV91bnJlZ2lzdGVyKCZidXMtPnN1YnN5cyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvY2xhc3MuYyBiL2RyaXZlcnMvYmFzZS9jbGFzcy5jCmluZGV4IGQ1OTY4MTIuLjgwYmJiMjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9jbGFzcy5jCisrKyBiL2RyaXZlcnMvYmFzZS9jbGFzcy5jCkBAIC0xNDUsNiArMTQ1LDcgQEAKIAlJTklUX0xJU1RfSEVBRCgmY2xzLT5jaGlsZHJlbik7CiAJSU5JVF9MSVNUX0hFQUQoJmNscy0+ZGV2aWNlcyk7CiAJSU5JVF9MSVNUX0hFQUQoJmNscy0+aW50ZXJmYWNlcyk7CisJa3NldF9pbml0KCZjbHMtPmNsYXNzX2RpcnMpOwogCWluaXRfTVVURVgoJmNscy0+c2VtKTsKIAllcnJvciA9IGtvYmplY3Rfc2V0X25hbWUoJmNscy0+c3Vic3lzLmtzZXQua29iaiwgIiVzIiwgY2xzLT5uYW1lKTsKIAlpZiAoZXJyb3IpCkBAIC0xNjMsNyArMTY0LDYgQEAKIHZvaWQgY2xhc3NfdW5yZWdpc3RlcihzdHJ1Y3QgY2xhc3MgKiBjbHMpCiB7CiAJcHJfZGVidWcoImRldmljZSBjbGFzcyAnJXMnOiB1bnJlZ2lzdGVyaW5nXG4iLCBjbHMtPm5hbWUpOwotCWtvYmplY3RfdW5yZWdpc3RlcihjbHMtPnZpcnR1YWxfZGlyKTsKIAlyZW1vdmVfY2xhc3NfYXR0cnMoY2xzKTsKIAlzdWJzeXN0ZW1fdW5yZWdpc3RlcigmY2xzLT5zdWJzeXMpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2NvcmUuYyBiL2RyaXZlcnMvYmFzZS9jb3JlLmMKaW5kZXggZDdmY2Y4Mi4uOGFhMDkwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL2NvcmUuYworKysgYi9kcml2ZXJzL2Jhc2UvY29yZS5jCkBAIC00Myw3ICs0Myw4IEBACiBjb25zdCBjaGFyICpkZXZfZHJpdmVyX3N0cmluZyhzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJcmV0dXJuIGRldi0+ZHJpdmVyID8gZGV2LT5kcml2ZXItPm5hbWUgOgotCQkJKGRldi0+YnVzID8gZGV2LT5idXMtPm5hbWUgOiAiIik7CisJCQkoZGV2LT5idXMgPyBkZXYtPmJ1cy0+bmFtZSA6CisJCQkoZGV2LT5jbGFzcyA/IGRldi0+Y2xhc3MtPm5hbWUgOiAiIikpOwogfQogRVhQT1JUX1NZTUJPTChkZXZfZHJpdmVyX3N0cmluZyk7CiAKQEAgLTExOSw2ICsxMjAsOCBAQAogCiAJaWYgKGt0eXBlID09ICZrdHlwZV9kZXZpY2UpIHsKIAkJc3RydWN0IGRldmljZSAqZGV2ID0gdG9fZGV2KGtvYmopOworCQlpZiAoZGV2LT51ZXZlbnRfc3VwcHJlc3MpCisJCQlyZXR1cm4gMDsKIAkJaWYgKGRldi0+YnVzKQogCQkJcmV0dXJuIDE7CiAJCWlmIChkZXYtPmNsYXNzKQpAQCAtMTU2LDYgKzE1OSwxMSBAQAogCQkJICAgICAgICJNSU5PUj0ldSIsIE1JTk9SKGRldi0+ZGV2dCkpOwogCX0KIAorCWlmIChkZXYtPnR5cGUgJiYgZGV2LT50eXBlLT5uYW1lKQorCQlhZGRfdWV2ZW50X3ZhcihlbnZwLCBudW1fZW52cCwgJmksCisJCQkgICAgICAgYnVmZmVyLCBidWZmZXJfc2l6ZSwgJmxlbmd0aCwKKwkJCSAgICAgICAiREVWVFlQRT0lcyIsIGRldi0+dHlwZS0+bmFtZSk7CisKIAlpZiAoZGV2LT5kcml2ZXIpCiAJCWFkZF91ZXZlbnRfdmFyKGVudnAsIG51bV9lbnZwLCAmaSwKIAkJCSAgICAgICBidWZmZXIsIGJ1ZmZlcl9zaXplLCAmbGVuZ3RoLApAQCAtMjM4LDcxICsyNDYsMTUyIEBACiAJLnVldmVudCA9CWRldl91ZXZlbnQsCiB9OwogCitzdGF0aWMgc3NpemVfdCBzaG93X3VldmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgY2hhciAqYnVmKQoreworCXN0cnVjdCBrb2JqZWN0ICp0b3Bfa29iajsKKwlzdHJ1Y3Qga3NldCAqa3NldDsKKwljaGFyICplbnZwWzMyXTsKKwljaGFyIGRhdGFbUEFHRV9TSVpFXTsKKwljaGFyICpwb3M7CisJaW50IGk7CisJc2l6ZV90IGNvdW50ID0gMDsKKwlpbnQgcmV0dmFsOworCisJLyogc2VhcmNoIHRoZSBrc2V0LCB0aGUgZGV2aWNlIGJlbG9uZ3MgdG8gKi8KKwl0b3Bfa29iaiA9ICZkZXYtPmtvYmo7CisJaWYgKCF0b3Bfa29iai0+a3NldCAmJiB0b3Bfa29iai0+cGFyZW50KSB7CisJCWRvIHsKKwkJCXRvcF9rb2JqID0gdG9wX2tvYmotPnBhcmVudDsKKwkJfSB3aGlsZSAoIXRvcF9rb2JqLT5rc2V0ICYmIHRvcF9rb2JqLT5wYXJlbnQpOworCX0KKwlpZiAoIXRvcF9rb2JqLT5rc2V0KQorCQlnb3RvIG91dDsKKwlrc2V0ID0gdG9wX2tvYmotPmtzZXQ7CisJaWYgKCFrc2V0LT51ZXZlbnRfb3BzIHx8ICFrc2V0LT51ZXZlbnRfb3BzLT51ZXZlbnQpCisJCWdvdG8gb3V0OworCisJLyogcmVzcGVjdCBmaWx0ZXIgKi8KKwlpZiAoa3NldC0+dWV2ZW50X29wcyAmJiBrc2V0LT51ZXZlbnRfb3BzLT5maWx0ZXIpCisJCWlmICgha3NldC0+dWV2ZW50X29wcy0+ZmlsdGVyKGtzZXQsICZkZXYtPmtvYmopKQorCQkJZ290byBvdXQ7CisKKwkvKiBsZXQgdGhlIGtzZXQgc3BlY2lmaWMgZnVuY3Rpb24gYWRkIGl0cyBrZXlzICovCisJcG9zID0gZGF0YTsKKwlyZXR2YWwgPSBrc2V0LT51ZXZlbnRfb3BzLT51ZXZlbnQoa3NldCwgJmRldi0+a29iaiwKKwkJCQkJICBlbnZwLCBBUlJBWV9TSVpFKGVudnApLAorCQkJCQkgIHBvcywgUEFHRV9TSVpFKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIG91dDsKKworCS8qIGNvcHkga2V5cyB0byBmaWxlICovCisJZm9yIChpID0gMDsgZW52cFtpXTsgaSsrKSB7CisJCXBvcyA9ICZidWZbY291bnRdOworCQljb3VudCArPSBzcHJpbnRmKHBvcywgIiVzXG4iLCBlbnZwW2ldKTsKKwl9CitvdXQ6CisJcmV0dXJuIGNvdW50OworfQorCiBzdGF0aWMgc3NpemVfdCBzdG9yZV91ZXZlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJCSAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKKwlpZiAobWVtY21wKGJ1ZiwgImFkZCIsIDMpICE9IDApCisJCWRldl9lcnIoZGV2LCAidWV2ZW50OiB1bnN1cHBvcnRlZCBhY3Rpb24tc3RyaW5nOyB0aGlzIHdpbGwgIgorCQkJImJlIGlnbm9yZWQgaW4gYSBmdXR1cmUga2VybmVsIHZlcnNpb24iKTsKIAlrb2JqZWN0X3VldmVudCgmZGV2LT5rb2JqLCBLT0JKX0FERCk7CiAJcmV0dXJuIGNvdW50OwogfQogCi1zdGF0aWMgaW50IGRldmljZV9hZGRfZ3JvdXBzKHN0cnVjdCBkZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgZGV2aWNlX2FkZF9hdHRyaWJ1dGVzKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHJzKQogewotCWludCBpOwogCWludCBlcnJvciA9IDA7CisJaW50IGk7CiAKLQlpZiAoZGV2LT5ncm91cHMpIHsKLQkJZm9yIChpID0gMDsgZGV2LT5ncm91cHNbaV07IGkrKykgewotCQkJZXJyb3IgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmRldi0+a29iaiwgZGV2LT5ncm91cHNbaV0pOwotCQkJaWYgKGVycm9yKSB7Ci0JCQkJd2hpbGUgKC0taSA+PSAwKQotCQkJCQlzeXNmc19yZW1vdmVfZ3JvdXAoJmRldi0+a29iaiwgZGV2LT5ncm91cHNbaV0pOwotCQkJCWdvdG8gb3V0OwotCQkJfQorCWlmIChhdHRycykgeworCQlmb3IgKGkgPSAwOyBhdHRyX25hbWUoYXR0cnNbaV0pOyBpKyspIHsKKwkJCWVycm9yID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmF0dHJzW2ldKTsKKwkJCWlmIChlcnJvcikKKwkJCQlicmVhazsKIAkJfQorCQlpZiAoZXJyb3IpCisJCQl3aGlsZSAoLS1pID49IDApCisJCQkJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJmF0dHJzW2ldKTsKIAl9Ci1vdXQ6CiAJcmV0dXJuIGVycm9yOwogfQogCi1zdGF0aWMgdm9pZCBkZXZpY2VfcmVtb3ZlX2dyb3VwcyhzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBkZXZpY2VfcmVtb3ZlX2F0dHJpYnV0ZXMoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHJzKQogewogCWludCBpOwotCWlmIChkZXYtPmdyb3VwcykgewotCQlmb3IgKGkgPSAwOyBkZXYtPmdyb3Vwc1tpXTsgaSsrKSB7Ci0JCQlzeXNmc19yZW1vdmVfZ3JvdXAoJmRldi0+a29iaiwgZGV2LT5ncm91cHNbaV0pOworCisJaWYgKGF0dHJzKQorCQlmb3IgKGkgPSAwOyBhdHRyX25hbWUoYXR0cnNbaV0pOyBpKyspCisJCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmYXR0cnNbaV0pOworfQorCitzdGF0aWMgaW50IGRldmljZV9hZGRfZ3JvdXBzKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqKmdyb3VwcykKK3sKKwlpbnQgZXJyb3IgPSAwOworCWludCBpOworCisJaWYgKGdyb3VwcykgeworCQlmb3IgKGkgPSAwOyBncm91cHNbaV07IGkrKykgeworCQkJZXJyb3IgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmRldi0+a29iaiwgZ3JvdXBzW2ldKTsKKwkJCWlmIChlcnJvcikgeworCQkJCXdoaWxlICgtLWkgPj0gMCkKKwkJCQkJc3lzZnNfcmVtb3ZlX2dyb3VwKCZkZXYtPmtvYmosIGdyb3Vwc1tpXSk7CisJCQkJYnJlYWs7CisJCQl9CiAJCX0KIAl9CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgdm9pZCBkZXZpY2VfcmVtb3ZlX2dyb3VwcyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKipncm91cHMpCit7CisJaW50IGk7CisKKwlpZiAoZ3JvdXBzKQorCQlmb3IgKGkgPSAwOyBncm91cHNbaV07IGkrKykKKwkJCXN5c2ZzX3JlbW92ZV9ncm91cCgmZGV2LT5rb2JqLCBncm91cHNbaV0pOwogfQogCiBzdGF0aWMgaW50IGRldmljZV9hZGRfYXR0cnMoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBjbGFzcyAqY2xhc3MgPSBkZXYtPmNsYXNzOwogCXN0cnVjdCBkZXZpY2VfdHlwZSAqdHlwZSA9IGRldi0+dHlwZTsKLQlpbnQgZXJyb3IgPSAwOwotCWludCBpOworCWludCBlcnJvcjsKIAotCWlmIChjbGFzcyAmJiBjbGFzcy0+ZGV2X2F0dHJzKSB7Ci0JCWZvciAoaSA9IDA7IGF0dHJfbmFtZShjbGFzcy0+ZGV2X2F0dHJzW2ldKTsgaSsrKSB7Ci0JCQllcnJvciA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZjbGFzcy0+ZGV2X2F0dHJzW2ldKTsKLQkJCWlmIChlcnJvcikKLQkJCQlicmVhazsKLQkJfQorCWlmIChjbGFzcykgeworCQllcnJvciA9IGRldmljZV9hZGRfYXR0cmlidXRlcyhkZXYsIGNsYXNzLT5kZXZfYXR0cnMpOwogCQlpZiAoZXJyb3IpCi0JCQl3aGlsZSAoLS1pID49IDApCi0JCQkJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJmNsYXNzLT5kZXZfYXR0cnNbaV0pOworCQkJcmV0dXJuIGVycm9yOwogCX0KIAotCWlmICh0eXBlICYmIHR5cGUtPmF0dHJzKSB7Ci0JCWZvciAoaSA9IDA7IGF0dHJfbmFtZSh0eXBlLT5hdHRyc1tpXSk7IGkrKykgewotCQkJZXJyb3IgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmdHlwZS0+YXR0cnNbaV0pOwotCQkJaWYgKGVycm9yKQotCQkJCWJyZWFrOwotCQl9CisJaWYgKHR5cGUpIHsKKwkJZXJyb3IgPSBkZXZpY2VfYWRkX2dyb3VwcyhkZXYsIHR5cGUtPmdyb3Vwcyk7CiAJCWlmIChlcnJvcikKLQkJCXdoaWxlICgtLWkgPj0gMCkKLQkJCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmdHlwZS0+YXR0cnNbaV0pOworCQkJZ290byBlcnJfcmVtb3ZlX2NsYXNzX2F0dHJzOwogCX0KIAorCWVycm9yID0gZGV2aWNlX2FkZF9ncm91cHMoZGV2LCBkZXYtPmdyb3Vwcyk7CisJaWYgKGVycm9yKQorCQlnb3RvIGVycl9yZW1vdmVfdHlwZV9ncm91cHM7CisKKwlyZXR1cm4gMDsKKworIGVycl9yZW1vdmVfdHlwZV9ncm91cHM6CisJaWYgKHR5cGUpCisJCWRldmljZV9yZW1vdmVfZ3JvdXBzKGRldiwgdHlwZS0+Z3JvdXBzKTsKKyBlcnJfcmVtb3ZlX2NsYXNzX2F0dHJzOgorCWlmIChjbGFzcykKKwkJZGV2aWNlX3JlbW92ZV9hdHRyaWJ1dGVzKGRldiwgY2xhc3MtPmRldl9hdHRycyk7CisKIAlyZXR1cm4gZXJyb3I7CiB9CiAKQEAgLTMxMCwxNyArMzk5LDE0IEBACiB7CiAJc3RydWN0IGNsYXNzICpjbGFzcyA9IGRldi0+Y2xhc3M7CiAJc3RydWN0IGRldmljZV90eXBlICp0eXBlID0gZGV2LT50eXBlOwotCWludCBpOwogCi0JaWYgKGNsYXNzICYmIGNsYXNzLT5kZXZfYXR0cnMpIHsKLQkJZm9yIChpID0gMDsgYXR0cl9uYW1lKGNsYXNzLT5kZXZfYXR0cnNbaV0pOyBpKyspCi0JCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmY2xhc3MtPmRldl9hdHRyc1tpXSk7Ci0JfQorCWRldmljZV9yZW1vdmVfZ3JvdXBzKGRldiwgZGV2LT5ncm91cHMpOwogCi0JaWYgKHR5cGUgJiYgdHlwZS0+YXR0cnMpIHsKLQkJZm9yIChpID0gMDsgYXR0cl9uYW1lKHR5cGUtPmF0dHJzW2ldKTsgaSsrKQotCQkJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJnR5cGUtPmF0dHJzW2ldKTsKLQl9CisJaWYgKHR5cGUpCisJCWRldmljZV9yZW1vdmVfZ3JvdXBzKGRldiwgdHlwZS0+Z3JvdXBzKTsKKworCWlmIChjbGFzcykKKwkJZGV2aWNlX3JlbW92ZV9hdHRyaWJ1dGVzKGRldiwgY2xhc3MtPmRldl9hdHRycyk7CiB9CiAKIApAQCAtMzk0LDkgKzQ4MCwxMCBAQAogRVhQT1JUX1NZTUJPTF9HUEwoZGV2aWNlX3JlbW92ZV9iaW5fZmlsZSk7CiAKIC8qKgotICogZGV2aWNlX3NjaGVkdWxlX2NhbGxiYWNrIC0gaGVscGVyIHRvIHNjaGVkdWxlIGEgY2FsbGJhY2sgZm9yIGEgZGV2aWNlCisgKiBkZXZpY2Vfc2NoZWR1bGVfY2FsbGJhY2tfb3duZXIgLSBoZWxwZXIgdG8gc2NoZWR1bGUgYSBjYWxsYmFjayBmb3IgYSBkZXZpY2UKICAqIEBkZXY6IGRldmljZS4KICAqIEBmdW5jOiBjYWxsYmFjayBmdW5jdGlvbiB0byBpbnZva2UgbGF0ZXIuCisgKiBAb3duZXI6IG1vZHVsZSBvd25pbmcgdGhlIGNhbGxiYWNrIHJvdXRpbmUKICAqCiAgKiBBdHRyaWJ1dGUgbWV0aG9kcyBtdXN0IG5vdCB1bnJlZ2lzdGVyIHRoZW1zZWx2ZXMgb3IgdGhlaXIgcGFyZW50IGRldmljZQogICogKHdoaWNoIHdvdWxkIGFtb3VudCB0byB0aGUgc2FtZSB0aGluZykuICBBdHRlbXB0cyB0byBkbyBzbyB3aWxsIGRlYWRsb2NrLApAQCAtNDA3LDIwICs0OTQsMjMgQEAKICAqIGFyZ3VtZW50IGluIHRoZSB3b3JrcXVldWUncyBwcm9jZXNzIGNvbnRleHQuICBAZGV2IHdpbGwgYmUgcGlubmVkIHVudGlsCiAgKiBAZnVuYyByZXR1cm5zLgogICoKKyAqIFRoaXMgcm91dGluZSBpcyB1c3VhbGx5IGNhbGxlZCB2aWEgdGhlIGlubGluZSBkZXZpY2Vfc2NoZWR1bGVfY2FsbGJhY2soKSwKKyAqIHdoaWNoIGF1dG9tYXRpY2FsbHkgc2V0cyBAb3duZXIgdG8gVEhJU19NT0RVTEUuCisgKgogICogUmV0dXJucyAwIGlmIHRoZSByZXF1ZXN0IHdhcyBzdWJtaXR0ZWQsIC1FTk9NRU0gaWYgc3RvcmFnZSBjb3VsZCBub3QKLSAqIGJlIGFsbG9jYXRlZC4KKyAqIGJlIGFsbG9jYXRlZCwgLUVOT0RFViBpZiBhIHJlZmVyZW5jZSB0byBAb3duZXIgaXNuJ3QgYXZhaWxhYmxlLgogICoKICAqIE5PVEU6IFRoaXMgcm91dGluZSB3b24ndCB3b3JrIGlmIENPTkZJR19TWVNGUyBpc24ndCBzZXQhICBJdCB1c2VzIGFuCiAgKiB1bmRlcmx5aW5nIHN5c2ZzIHJvdXRpbmUgKHNpbmNlIGl0IGlzIGludGVuZGVkIGZvciB1c2UgYnkgYXR0cmlidXRlCiAgKiBtZXRob2RzKSwgYW5kIGlmIHN5c2ZzIGlzbid0IGF2YWlsYWJsZSB5b3UnbGwgZ2V0IG5vdGhpbmcgYnV0IC1FTk9TWVMuCiAgKi8KLWludCBkZXZpY2Vfc2NoZWR1bGVfY2FsbGJhY2soc3RydWN0IGRldmljZSAqZGV2LAotCQl2b2lkICgqZnVuYykoc3RydWN0IGRldmljZSAqKSkKK2ludCBkZXZpY2Vfc2NoZWR1bGVfY2FsbGJhY2tfb3duZXIoc3RydWN0IGRldmljZSAqZGV2LAorCQl2b2lkICgqZnVuYykoc3RydWN0IGRldmljZSAqKSwgc3RydWN0IG1vZHVsZSAqb3duZXIpCiB7CiAJcmV0dXJuIHN5c2ZzX3NjaGVkdWxlX2NhbGxiYWNrKCZkZXYtPmtvYmosCi0JCQkodm9pZCAoKikodm9pZCAqKSkgZnVuYywgZGV2KTsKKwkJCSh2b2lkICgqKSh2b2lkICopKSBmdW5jLCBkZXYsIG93bmVyKTsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKGRldmljZV9zY2hlZHVsZV9jYWxsYmFjayk7CitFWFBPUlRfU1lNQk9MX0dQTChkZXZpY2Vfc2NoZWR1bGVfY2FsbGJhY2tfb3duZXIpOwogCiBzdGF0aWMgdm9pZCBrbGlzdF9jaGlsZHJlbl9nZXQoc3RydWN0IGtsaXN0X25vZGUgKm4pCiB7CkBAIC00NzcsMzQgKzU2Nyw1OCBAQAogCXJldHVybiBOVUxMOwogfQogI2Vsc2UKLXN0YXRpYyBzdHJ1Y3Qga29iamVjdCAqIHZpcnR1YWxfZGV2aWNlX3BhcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0aWMgc3RydWN0IGtvYmplY3QgKnZpcnR1YWxfZGV2aWNlX3BhcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0JaWYgKCFkZXYtPmNsYXNzKQotCQlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKKwlzdGF0aWMgc3RydWN0IGtvYmplY3QgKnZpcnR1YWxfZGlyID0gTlVMTDsKIAotCWlmICghZGV2LT5jbGFzcy0+dmlydHVhbF9kaXIpIHsKLQkJc3RhdGljIHN0cnVjdCBrb2JqZWN0ICp2aXJ0dWFsX2RpciA9IE5VTEw7CisJaWYgKCF2aXJ0dWFsX2RpcikKKwkJdmlydHVhbF9kaXIgPSBrb2JqZWN0X2FkZF9kaXIoJmRldmljZXNfc3Vic3lzLmtzZXQua29iaiwgInZpcnR1YWwiKTsKIAotCQlpZiAoIXZpcnR1YWxfZGlyKQotCQkJdmlydHVhbF9kaXIgPSBrb2JqZWN0X2FkZF9kaXIoJmRldmljZXNfc3Vic3lzLmtzZXQua29iaiwgInZpcnR1YWwiKTsKLQkJZGV2LT5jbGFzcy0+dmlydHVhbF9kaXIgPSBrb2JqZWN0X2FkZF9kaXIodmlydHVhbF9kaXIsIGRldi0+Y2xhc3MtPm5hbWUpOwotCX0KLQotCXJldHVybiBkZXYtPmNsYXNzLT52aXJ0dWFsX2RpcjsKKwlyZXR1cm4gdmlydHVhbF9kaXI7CiB9CiAKIHN0YXRpYyBzdHJ1Y3Qga29iamVjdCAqIGdldF9kZXZpY2VfcGFyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQkJICBzdHJ1Y3QgZGV2aWNlICpwYXJlbnQpCiB7Ci0JLyogaWYgdGhpcyBpcyBhIGNsYXNzIGRldmljZSwgYW5kIGhhcyBubyBwYXJlbnQsIGNyZWF0ZSBvbmUgKi8KLQlpZiAoKGRldi0+Y2xhc3MpICYmIChwYXJlbnQgPT0gTlVMTCkpIHsKLQkJcmV0dXJuIHZpcnR1YWxfZGV2aWNlX3BhcmVudChkZXYpOwotCX0gZWxzZSBpZiAocGFyZW50KQorCWlmIChkZXYtPmNsYXNzKSB7CisJCXN0cnVjdCBrb2JqZWN0ICprb2JqID0gTlVMTDsKKwkJc3RydWN0IGtvYmplY3QgKnBhcmVudF9rb2JqOworCQlzdHJ1Y3Qga29iamVjdCAqazsKKworCQkvKgorCQkgKiBJZiB3ZSBoYXZlIG5vIHBhcmVudCwgd2UgbGl2ZSBpbiAidmlydHVhbCIuCisJCSAqIENsYXNzLWRldmljZXMgd2l0aCBhIGJ1cy1kZXZpY2UgYXMgcGFyZW50LCBsaXZlCisJCSAqIGluIGEgY2xhc3MtZGlyZWN0b3J5IHRvIHByZXZlbnQgbmFtZXNwYWNlIGNvbGxpc2lvbnMuCisJCSAqLworCQlpZiAocGFyZW50ID09IE5VTEwpCisJCQlwYXJlbnRfa29iaiA9IHZpcnR1YWxfZGV2aWNlX3BhcmVudChkZXYpOworCQllbHNlIGlmIChwYXJlbnQtPmNsYXNzKQorCQkJcmV0dXJuICZwYXJlbnQtPmtvYmo7CisJCWVsc2UKKwkJCXBhcmVudF9rb2JqID0gJnBhcmVudC0+a29iajsKKworCQkvKiBmaW5kIG91ciBjbGFzcy1kaXJlY3RvcnkgYXQgdGhlIHBhcmVudCBhbmQgcmVmZXJlbmNlIGl0ICovCisJCXNwaW5fbG9jaygmZGV2LT5jbGFzcy0+Y2xhc3NfZGlycy5saXN0X2xvY2spOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGssICZkZXYtPmNsYXNzLT5jbGFzc19kaXJzLmxpc3QsIGVudHJ5KQorCQkJaWYgKGstPnBhcmVudCA9PSBwYXJlbnRfa29iaikgeworCQkJCWtvYmogPSBrb2JqZWN0X2dldChrKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJc3Bpbl91bmxvY2soJmRldi0+Y2xhc3MtPmNsYXNzX2RpcnMubGlzdF9sb2NrKTsKKwkJaWYgKGtvYmopCisJCQlyZXR1cm4ga29iajsKKworCQkvKiBvciBjcmVhdGUgYSBuZXcgY2xhc3MtZGlyZWN0b3J5IGF0IHRoZSBwYXJlbnQgZGV2aWNlICovCisJCXJldHVybiBrb2JqZWN0X2tzZXRfYWRkX2RpcigmZGV2LT5jbGFzcy0+Y2xhc3NfZGlycywKKwkJCQkJICAgIHBhcmVudF9rb2JqLCBkZXYtPmNsYXNzLT5uYW1lKTsKKwl9CisKKwlpZiAocGFyZW50KQogCQlyZXR1cm4gJnBhcmVudC0+a29iajsKIAlyZXR1cm4gTlVMTDsKIH0KLQogI2VuZGlmCisKIHN0YXRpYyBpbnQgc2V0dXBfcGFyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZSAqcGFyZW50KQogewogCXN0cnVjdCBrb2JqZWN0ICprb2JqOwpAQCAtNTQxLDcgKzY1NSw2IEBACiAJcHJfZGVidWcoIkRFVjogcmVnaXN0ZXJpbmcgZGV2aWNlOiBJRCA9ICclcydcbiIsIGRldi0+YnVzX2lkKTsKIAogCXBhcmVudCA9IGdldF9kZXZpY2UoZGV2LT5wYXJlbnQpOwotCiAJZXJyb3IgPSBzZXR1cF9wYXJlbnQoZGV2LCBwYXJlbnQpOwogCWlmIChlcnJvcikKIAkJZ290byBFcnJvcjsKQEAgLTU2MiwxMCArNjc1LDExIEBACiAJCQkJCSAgICAgQlVTX05PVElGWV9BRERfREVWSUNFLCBkZXYpOwogCiAJZGV2LT51ZXZlbnRfYXR0ci5hdHRyLm5hbWUgPSAidWV2ZW50IjsKLQlkZXYtPnVldmVudF9hdHRyLmF0dHIubW9kZSA9IFNfSVdVU1I7CisJZGV2LT51ZXZlbnRfYXR0ci5hdHRyLm1vZGUgPSBTX0lSVUdPIHwgU19JV1VTUjsKIAlpZiAoZGV2LT5kcml2ZXIpCiAJCWRldi0+dWV2ZW50X2F0dHIuYXR0ci5vd25lciA9IGRldi0+ZHJpdmVyLT5vd25lcjsKIAlkZXYtPnVldmVudF9hdHRyLnN0b3JlID0gc3RvcmVfdWV2ZW50OworCWRldi0+dWV2ZW50X2F0dHIuc2hvdyA9IHNob3dfdWV2ZW50OwogCWVycm9yID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldi0+dWV2ZW50X2F0dHIpOwogCWlmIChlcnJvcikKIAkJZ290byBhdHRyRXJyb3I7CkBAIC02MTQsMTYgKzcyOCwxMiBAQAogCiAJaWYgKChlcnJvciA9IGRldmljZV9hZGRfYXR0cnMoZGV2KSkpCiAJCWdvdG8gQXR0cnNFcnJvcjsKLQlpZiAoKGVycm9yID0gZGV2aWNlX2FkZF9ncm91cHMoZGV2KSkpCi0JCWdvdG8gR3JvdXBFcnJvcjsKIAlpZiAoKGVycm9yID0gZGV2aWNlX3BtX2FkZChkZXYpKSkKIAkJZ290byBQTUVycm9yOwogCWlmICgoZXJyb3IgPSBidXNfYWRkX2RldmljZShkZXYpKSkKIAkJZ290byBCdXNFcnJvcjsKLQlpZiAoIWRldi0+dWV2ZW50X3N1cHByZXNzKQotCQlrb2JqZWN0X3VldmVudCgmZGV2LT5rb2JqLCBLT0JKX0FERCk7Ci0JaWYgKChlcnJvciA9IGJ1c19hdHRhY2hfZGV2aWNlKGRldikpKQotCQlnb3RvIEF0dGFjaEVycm9yOworCWtvYmplY3RfdWV2ZW50KCZkZXYtPmtvYmosIEtPQkpfQUREKTsKKwlidXNfYXR0YWNoX2RldmljZShkZXYpOwogCWlmIChwYXJlbnQpCiAJCWtsaXN0X2FkZF90YWlsKCZkZXYtPmtub2RlX3BhcmVudCwgJnBhcmVudC0+a2xpc3RfY2hpbGRyZW4pOwogCkBAIC02MzksMTkgKzc0OSwxNSBAQAogCQl1cCgmZGV2LT5jbGFzcy0+c2VtKTsKIAl9CiAgRG9uZToKLSAJa2ZyZWUoY2xhc3NfbmFtZSk7CisJa2ZyZWUoY2xhc3NfbmFtZSk7CiAJcHV0X2RldmljZShkZXYpOwogCXJldHVybiBlcnJvcjsKLSBBdHRhY2hFcnJvcjoKLQlidXNfcmVtb3ZlX2RldmljZShkZXYpOwogIEJ1c0Vycm9yOgogCWRldmljZV9wbV9yZW1vdmUoZGV2KTsKICBQTUVycm9yOgogCWlmIChkZXYtPmJ1cykKIAkJYmxvY2tpbmdfbm90aWZpZXJfY2FsbF9jaGFpbigmZGV2LT5idXMtPmJ1c19ub3RpZmllciwKIAkJCQkJICAgICBCVVNfTk9USUZZX0RFTF9ERVZJQ0UsIGRldik7Ci0JZGV2aWNlX3JlbW92ZV9ncm91cHMoZGV2KTsKLSBHcm91cEVycm9yOgogCWRldmljZV9yZW1vdmVfYXR0cnMoZGV2KTsKICBBdHRyc0Vycm9yOgogCWlmIChkZXYtPmRldnRfYXR0cikgewpAQCAtNjc3LDE1ICs3ODMsNiBAQAogI2VuZGlmCiAJCQlzeXNmc19yZW1vdmVfbGluaygmZGV2LT5rb2JqLCAiZGV2aWNlIik7CiAJCX0KLQotCQlkb3duKCZkZXYtPmNsYXNzLT5zZW0pOwotCQkvKiBub3RpZnkgYW55IGludGVyZmFjZXMgdGhhdCB0aGUgZGV2aWNlIGlzIG5vdyBnb25lICovCi0JCWxpc3RfZm9yX2VhY2hfZW50cnkoY2xhc3NfaW50ZiwgJmRldi0+Y2xhc3MtPmludGVyZmFjZXMsIG5vZGUpCi0JCQlpZiAoY2xhc3NfaW50Zi0+cmVtb3ZlX2RldikKLQkJCQljbGFzc19pbnRmLT5yZW1vdmVfZGV2KGRldiwgY2xhc3NfaW50Zik7Ci0JCS8qIHJlbW92ZSB0aGUgZGV2aWNlIGZyb20gdGhlIGNsYXNzIGxpc3QgKi8KLQkJbGlzdF9kZWxfaW5pdCgmZGV2LT5ub2RlKTsKLQkJdXAoJmRldi0+Y2xhc3MtPnNlbSk7CiAJfQogIHVldmVudGF0dHJFcnJvcjoKIAlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2LT51ZXZlbnRfYXR0cik7CkBAIC03OTYsOSArODkzLDMzIEBACiAJCS8qIHJlbW92ZSB0aGUgZGV2aWNlIGZyb20gdGhlIGNsYXNzIGxpc3QgKi8KIAkJbGlzdF9kZWxfaW5pdCgmZGV2LT5ub2RlKTsKIAkJdXAoJmRldi0+Y2xhc3MtPnNlbSk7CisKKwkJLyogSWYgd2UgbGl2ZSBpbiBhIHBhcmVudCBjbGFzcy1kaXJlY3RvcnksIHVucmVmZXJlbmNlIGl0ICovCisJCWlmIChkZXYtPmtvYmoucGFyZW50LT5rc2V0ID09ICZkZXYtPmNsYXNzLT5jbGFzc19kaXJzKSB7CisJCQlzdHJ1Y3QgZGV2aWNlICpkOworCQkJaW50IG90aGVyID0gMDsKKworCQkJLyoKKwkJCSAqIGlmIHdlIGFyZSB0aGUgbGFzdCBjaGlsZCBvZiBvdXIgY2xhc3MsIGRlbGV0ZQorCQkJICogb3VyIGNsYXNzLWRpcmVjdG9yeSBhdCB0aGlzIHBhcmVudAorCQkJICovCisJCQlkb3duKCZkZXYtPmNsYXNzLT5zZW0pOworCQkJbGlzdF9mb3JfZWFjaF9lbnRyeShkLCAmZGV2LT5jbGFzcy0+ZGV2aWNlcywgbm9kZSkgeworCQkJCWlmIChkID09IGRldikKKwkJCQkJY29udGludWU7CisJCQkJaWYgKGQtPmtvYmoucGFyZW50ID09IGRldi0+a29iai5wYXJlbnQpIHsKKwkJCQkJb3RoZXIgPSAxOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlpZiAoIW90aGVyKQorCQkJCWtvYmplY3RfZGVsKGRldi0+a29iai5wYXJlbnQpOworCisJCQlrb2JqZWN0X3B1dChkZXYtPmtvYmoucGFyZW50KTsKKwkJCXVwKCZkZXYtPmNsYXNzLT5zZW0pOworCQl9CiAJfQogCWRldmljZV9yZW1vdmVfZmlsZShkZXYsICZkZXYtPnVldmVudF9hdHRyKTsKLQlkZXZpY2VfcmVtb3ZlX2dyb3VwcyhkZXYpOwogCWRldmljZV9yZW1vdmVfYXR0cnMoZGV2KTsKIAlidXNfcmVtb3ZlX2RldmljZShkZXYpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvZGQuYyBiL2RyaXZlcnMvYmFzZS9kZC5jCmluZGV4IDZhNDg4MjQuLjE4ZGJhOGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9kZC5jCisrKyBiL2RyaXZlcnMvYmFzZS9kZC5jCkBAIC05NCwxOSArOTQsMTEgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdHJ1Y3Qgc3R1cGlkX3RocmVhZF9zdHJ1Y3R1cmUgewotCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnY7Ci0Jc3RydWN0IGRldmljZSAqZGV2OwotfTsKLQogc3RhdGljIGF0b21pY190IHByb2JlX2NvdW50ID0gQVRPTUlDX0lOSVQoMCk7CiBzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQocHJvYmVfd2FpdHF1ZXVlKTsKIAotc3RhdGljIGludCByZWFsbHlfcHJvYmUodm9pZCAqdm9pZF9kYXRhKQorc3RhdGljIGludCByZWFsbHlfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KQogewotCXN0cnVjdCBzdHVwaWRfdGhyZWFkX3N0cnVjdHVyZSAqZGF0YSA9IHZvaWRfZGF0YTsKLQlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2ID0gZGF0YS0+ZHJ2OwotCXN0cnVjdCBkZXZpY2UgKmRldiA9IGRhdGEtPmRldjsKIAlpbnQgcmV0ID0gMDsKIAogCWF0b21pY19pbmMoJnByb2JlX2NvdW50KTsKQEAgLTE1NCw3ICsxNDYsNiBAQAogCSAqLwogCXJldCA9IDA7CiBkb25lOgotCWtmcmVlKGRhdGEpOwogCWF0b21pY19kZWMoJnByb2JlX2NvdW50KTsKIAl3YWtlX3VwKCZwcm9iZV93YWl0cXVldWUpOwogCXJldHVybiByZXQ7CkBAIC0xODYsMTYgKzE3NywxNCBAQAogICogZm9ybWF0IG9mIHRoZSBJRCBzdHJ1Y3R1cmVzLCBub3Igd2hhdCBpcyB0byBiZSBjb25zaWRlcmVkIGEgbWF0Y2ggYW5kCiAgKiB3aGF0IGlzIG5vdC4KICAqCi0gKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgMSBpZiBhIG1hdGNoIGlzIGZvdW5kLCBhbiBlcnJvciBpZiBvbmUgb2NjdXJzCi0gKiAodGhhdCBpcyBub3QgLUVOT0RFViBvciAtRU5YSU8pLCBhbmQgMCBvdGhlcndpc2UuCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgMSBpZiBhIG1hdGNoIGlzIGZvdW5kLCAtRU5PREVWIGlmIHRoZSBkZXZpY2UgaXMKKyAqIG5vdCByZWdpc3RlcmVkLCBhbmQgMCBvdGhlcndpc2UuCiAgKgogICogVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCB3aXRoIEBkZXYtPnNlbSBoZWxkLiAgV2hlbiBjYWxsZWQgZm9yIGEKICAqIFVTQiBpbnRlcmZhY2UsIEBkZXYtPnBhcmVudC0+c2VtIG11c3QgYmUgaGVsZCBhcyB3ZWxsLgogICovCiBpbnQgZHJpdmVyX3Byb2JlX2RldmljZShzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqIGRydiwgc3RydWN0IGRldmljZSAqIGRldikKIHsKLQlzdHJ1Y3Qgc3R1cGlkX3RocmVhZF9zdHJ1Y3R1cmUgKmRhdGE7Ci0Jc3RydWN0IHRhc2tfc3RydWN0ICpwcm9iZV90YXNrOwogCWludCByZXQgPSAwOwogCiAJaWYgKCFkZXZpY2VfaXNfcmVnaXN0ZXJlZChkZXYpKQpAQCAtMjA2LDE5ICsxOTUsNyBAQAogCXByX2RlYnVnKCIlczogTWF0Y2hlZCBEZXZpY2UgJXMgd2l0aCBEcml2ZXIgJXNcbiIsCiAJCSBkcnYtPmJ1cy0+bmFtZSwgZGV2LT5idXNfaWQsIGRydi0+bmFtZSk7CiAKLQlkYXRhID0ga21hbGxvYyhzaXplb2YoKmRhdGEpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRhdGEpCi0JCXJldHVybiAtRU5PTUVNOwotCWRhdGEtPmRydiA9IGRydjsKLQlkYXRhLT5kZXYgPSBkZXY7Ci0KLQlpZiAoZHJ2LT5tdWx0aXRocmVhZF9wcm9iZSkgewotCQlwcm9iZV90YXNrID0ga3RocmVhZF9ydW4ocmVhbGx5X3Byb2JlLCBkYXRhLAotCQkJCQkgInByb2JlLSVzIiwgZGV2LT5idXNfaWQpOwotCQlpZiAoSVNfRVJSKHByb2JlX3Rhc2spKQotCQkJcmV0ID0gcmVhbGx5X3Byb2JlKGRhdGEpOwotCX0gZWxzZQotCQlyZXQgPSByZWFsbHlfcHJvYmUoZGF0YSk7CisJcmV0ID0gcmVhbGx5X3Byb2JlKGRldiwgZHJ2KTsKIAogZG9uZToKIAlyZXR1cm4gcmV0OwpAQCAtMjMwLDMwICsyMDcsNTcgQEAKIAlyZXR1cm4gZHJpdmVyX3Byb2JlX2RldmljZShkcnYsIGRldik7CiB9CiAKK3N0YXRpYyBpbnQgZGV2aWNlX3Byb2JlX2RyaXZlcnModm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBkYXRhOworCWludCByZXQgPSAwOworCisJaWYgKGRldi0+YnVzKSB7CisJCWRvd24oJmRldi0+c2VtKTsKKwkJcmV0ID0gYnVzX2Zvcl9lYWNoX2RydihkZXYtPmJ1cywgTlVMTCwgZGV2LCBfX2RldmljZV9hdHRhY2gpOworCQl1cCgmZGV2LT5zZW0pOworCX0KKwlyZXR1cm4gcmV0OworfQorCiAvKioKICAqCWRldmljZV9hdHRhY2ggLSB0cnkgdG8gYXR0YWNoIGRldmljZSB0byBhIGRyaXZlci4KICAqCUBkZXY6CWRldmljZS4KICAqCiAgKglXYWxrIHRoZSBsaXN0IG9mIGRyaXZlcnMgdGhhdCB0aGUgYnVzIGhhcyBhbmQgY2FsbAogICoJZHJpdmVyX3Byb2JlX2RldmljZSgpIGZvciBlYWNoIHBhaXIuIElmIGEgY29tcGF0aWJsZQotICoJcGFpciBpcyBmb3VuZCwgYnJlYWsgb3V0IGFuZCByZXR1cm4uCisgKglwYWlyIGlzIGZvdW5kLCBicmVhayBvdXQgYW5kIHJldHVybi4gSWYgdGhlIGJ1cyBzcGVjaWZpZXMKKyAqCW11bHRpdGhyZWFkZWQgcHJvYmluZywgd2Fsa2luZyB0aGUgbGlzdCBvZiBkcml2ZXJzIGlzIGRvbmUKKyAqCW9uIGEgcHJvYmluZyB0aHJlYWQuCiAgKgogICoJUmV0dXJucyAxIGlmIHRoZSBkZXZpY2Ugd2FzIGJvdW5kIHRvIGEgZHJpdmVyOwotICoJMCBpZiBubyBtYXRjaGluZyBkZXZpY2Ugd2FzIGZvdW5kOyBlcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqCTAgaWYgbm8gbWF0Y2hpbmcgZGV2aWNlIHdhcyBmb3VuZCBvciBtdWx0aXRocmVhZGVkIHByb2JpbmcgaXMgZG9uZTsKKyAqCS1FTk9ERVYgaWYgdGhlIGRldmljZSBpcyBub3QgcmVnaXN0ZXJlZC4KICAqCiAgKglXaGVuIGNhbGxlZCBmb3IgYSBVU0IgaW50ZXJmYWNlLCBAZGV2LT5wYXJlbnQtPnNlbSBtdXN0IGJlIGhlbGQuCiAgKi8KIGludCBkZXZpY2VfYXR0YWNoKHN0cnVjdCBkZXZpY2UgKiBkZXYpCiB7CiAJaW50IHJldCA9IDA7CisJc3RydWN0IHRhc2tfc3RydWN0ICpwcm9iZV90YXNrID0gRVJSX1BUUigtRU5PTUVNKTsKIAogCWRvd24oJmRldi0+c2VtKTsKIAlpZiAoZGV2LT5kcml2ZXIpIHsKIAkJcmV0ID0gZGV2aWNlX2JpbmRfZHJpdmVyKGRldik7CiAJCWlmIChyZXQgPT0gMCkKIAkJCXJldCA9IDE7Ci0JfSBlbHNlCi0JCXJldCA9IGJ1c19mb3JfZWFjaF9kcnYoZGV2LT5idXMsIE5VTEwsIGRldiwgX19kZXZpY2VfYXR0YWNoKTsKKwkJZWxzZSB7CisJCQlkZXYtPmRyaXZlciA9IE5VTEw7CisJCQlyZXQgPSAwOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKGRldi0+YnVzLT5tdWx0aXRocmVhZF9wcm9iZSkKKwkJCXByb2JlX3Rhc2sgPSBrdGhyZWFkX3J1bihkZXZpY2VfcHJvYmVfZHJpdmVycywgZGV2LAorCQkJCQkJICJwcm9iZS0lcyIsIGRldi0+YnVzX2lkKTsKKwkJaWYoSVNfRVJSKHByb2JlX3Rhc2spKQorCQkJcmV0ID0gYnVzX2Zvcl9lYWNoX2RydihkZXYtPmJ1cywgTlVMTCwgZGV2LAorCQkJCQkgICAgICAgX19kZXZpY2VfYXR0YWNoKTsKKwl9CiAJdXAoJmRldi0+c2VtKTsKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2RtYXBvb2wuYyBiL2RyaXZlcnMvYmFzZS9kbWFwb29sLmMKaW5kZXggY2Q0NjdjOS4uOTQwNjI1OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL2RtYXBvb2wuYworKysgYi9kcml2ZXJzL2Jhc2UvZG1hcG9vbC5jCkBAIC0zNyw3ICszNyw3IEBACiAKICNkZWZpbmUJUE9PTF9USU1FT1VUX0pJRkZJRVMJKCgxMDAgLyogbXNlYyAqLyAqIEhaKSAvIDEwMDApCiAKLXN0YXRpYyBERUNMQVJFX01VVEVYIChwb29sc19sb2NrKTsKK3N0YXRpYyBERUZJTkVfTVVURVggKHBvb2xzX2xvY2spOwogCiBzdGF0aWMgc3NpemVfdAogc2hvd19wb29scyAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQpAQCAtNTUsNyArNTUsNyBAQAogCXNpemUgLT0gdGVtcDsKIAluZXh0ICs9IHRlbXA7CiAKLQlkb3duICgmcG9vbHNfbG9jayk7CisJbXV0ZXhfbG9jaygmcG9vbHNfbG9jayk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShwb29sLCAmZGV2LT5kbWFfcG9vbHMsIHBvb2xzKSB7CiAJCXVuc2lnbmVkIHBhZ2VzID0gMDsKIAkJdW5zaWduZWQgYmxvY2tzID0gMDsKQEAgLTczLDcgKzczLDcgQEAKIAkJc2l6ZSAtPSB0ZW1wOwogCQluZXh0ICs9IHRlbXA7CiAJfQotCXVwICgmcG9vbHNfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZwb29sc19sb2NrKTsKIAogCXJldHVybiBQQUdFX1NJWkUgLSBzaXplOwogfQpAQCAtMTQzLDcgKzE0Myw3IEBACiAJaWYgKGRldikgewogCQlpbnQgcmV0OwogCi0JCWRvd24gKCZwb29sc19sb2NrKTsKKwkJbXV0ZXhfbG9jaygmcG9vbHNfbG9jayk7CiAJCWlmIChsaXN0X2VtcHR5ICgmZGV2LT5kbWFfcG9vbHMpKQogCQkJcmV0ID0gZGV2aWNlX2NyZWF0ZV9maWxlIChkZXYsICZkZXZfYXR0cl9wb29scyk7CiAJCWVsc2UKQEAgLTE1NSw3ICsxNTUsNyBAQAogCQkJa2ZyZWUocmV0dmFsKTsKIAkJCXJldHZhbCA9IE5VTEw7CiAJCX0KLQkJdXAgKCZwb29sc19sb2NrKTsKKwkJbXV0ZXhfdW5sb2NrKCZwb29sc19sb2NrKTsKIAl9IGVsc2UKIAkJSU5JVF9MSVNUX0hFQUQgKCZyZXR2YWwtPnBvb2xzKTsKIApAQCAtMjMxLDExICsyMzEsMTEgQEAKIHZvaWQKIGRtYV9wb29sX2Rlc3Ryb3kgKHN0cnVjdCBkbWFfcG9vbCAqcG9vbCkKIHsKLQlkb3duICgmcG9vbHNfbG9jayk7CisJbXV0ZXhfbG9jaygmcG9vbHNfbG9jayk7CiAJbGlzdF9kZWwgKCZwb29sLT5wb29scyk7CiAJaWYgKHBvb2wtPmRldiAmJiBsaXN0X2VtcHR5ICgmcG9vbC0+ZGV2LT5kbWFfcG9vbHMpKQogCQlkZXZpY2VfcmVtb3ZlX2ZpbGUgKHBvb2wtPmRldiwgJmRldl9hdHRyX3Bvb2xzKTsKLQl1cCAoJnBvb2xzX2xvY2spOworCW11dGV4X3VubG9jaygmcG9vbHNfbG9jayk7CiAKIAl3aGlsZSAoIWxpc3RfZW1wdHkgKCZwb29sLT5wYWdlX2xpc3QpKSB7CiAJCXN0cnVjdCBkbWFfcGFnZQkJKnBhZ2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvZHJpdmVyLmMgYi9kcml2ZXJzL2Jhc2UvZHJpdmVyLmMKaW5kZXggMDgyYmZkZS4uZWIxMTQ3NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL2RyaXZlci5jCisrKyBiL2RyaXZlcnMvYmFzZS9kcml2ZXIuYwpAQCAtMTQ5LDEwICsxNDksNiBAQAogICoJV2UgcGFzcyBvZmYgbW9zdCBvZiB0aGUgd29yayB0byB0aGUgYnVzX2FkZF9kcml2ZXIoKSBjYWxsLAogICoJc2luY2UgbW9zdCBvZiB0aGUgdGhpbmdzIHdlIGhhdmUgdG8gZG8gZGVhbCB3aXRoIHRoZSBidXMKICAqCXN0cnVjdHVyZXMuCi0gKgotICoJVGhlIG9uZSBpbnRlcmVzdGluZyBhc3BlY3QgaXMgdGhhdCB3ZSBzZXR1cCBAZHJ2LT51bmxvYWRlZAotICoJYXMgYSBjb21wbGV0aW9uIHRoYXQgZ2V0cyBjb21wbGV0ZSB3aGVuIHRoZSBkcml2ZXIgcmVmZXJlbmNlCi0gKgljb3VudCByZWFjaGVzIDAuCiAgKi8KIGludCBkcml2ZXJfcmVnaXN0ZXIoc3RydWN0IGRldmljZV9kcml2ZXIgKiBkcnYpCiB7CkBAIC0xNjIsMzUgKzE1OCwxOSBAQAogCQlwcmludGsoS0VSTl9XQVJOSU5HICJEcml2ZXIgJyVzJyBuZWVkcyB1cGRhdGluZyAtIHBsZWFzZSB1c2UgYnVzX3R5cGUgbWV0aG9kc1xuIiwgZHJ2LT5uYW1lKTsKIAl9CiAJa2xpc3RfaW5pdCgmZHJ2LT5rbGlzdF9kZXZpY2VzLCBOVUxMLCBOVUxMKTsKLQlpbml0X2NvbXBsZXRpb24oJmRydi0+dW5sb2FkZWQpOwogCXJldHVybiBidXNfYWRkX2RyaXZlcihkcnYpOwogfQogCi0KIC8qKgogICoJZHJpdmVyX3VucmVnaXN0ZXIgLSByZW1vdmUgZHJpdmVyIGZyb20gc3lzdGVtLgogICoJQGRydjoJZHJpdmVyLgogICoKICAqCUFnYWluLCB3ZSBwYXNzIG9mZiBtb3N0IG9mIHRoZSB3b3JrIHRvIHRoZSBidXMtbGV2ZWwgY2FsbC4KLSAqCi0gKglUaG91Z2gsIG9uY2UgdGhhdCBpcyBkb25lLCB3ZSB3YWl0IHVudGlsIEBkcnYtPnVubG9hZGVkIGlzIGNvbXBsZXRlZC4KLSAqCVRoaXMgd2lsbCBibG9jayB1bnRpbCB0aGUgZHJpdmVyIHJlZmNvdW50IHJlYWNoZXMgMCwgYW5kIGl0IGlzCi0gKglyZWxlYXNlZC4gT25seSBtb2R1bGFyIGRyaXZlcnMgd2lsbCBjYWxsIHRoaXMgZnVuY3Rpb24sIGFuZCB3ZQotICoJaGF2ZSB0byBndWFyYW50ZWUgdGhhdCBpdCB3b24ndCBjb21wbGV0ZSwgbGV0dGluZyB0aGUgZHJpdmVyCi0gKgl1bmxvYWQgdW50aWwgYWxsIHJlZmVyZW5jZXMgYXJlIGdvbmUuCiAgKi8KIAogdm9pZCBkcml2ZXJfdW5yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqIGRydikKIHsKIAlidXNfcmVtb3ZlX2RyaXZlcihkcnYpOwotCS8qCi0JICogSWYgdGhlIGRyaXZlciBpcyBhIG1vZHVsZSwgd2UgYXJlIHByb2JhYmx5IGluCi0JICogdGhlIG1vZHVsZSB1bmxvYWQgcGF0aCwgYW5kIHdlIHdhbnQgdG8gd2FpdAotCSAqIGZvciBldmVyeXRoaW5nIHRvIHVubG9hZCBiZWZvcmUgd2UgY2FuIGFjdHVhbGx5Ci0JICogZmluaXNoIHRoZSB1bmxvYWQuCi0JICovCi0JaWYgKGRydi0+b3duZXIpCi0JCXdhaXRfZm9yX2NvbXBsZXRpb24oJmRydi0+dW5sb2FkZWQpOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9maXJtd2FyZV9jbGFzcy5jIGIvZHJpdmVycy9iYXNlL2Zpcm13YXJlX2NsYXNzLmMKaW5kZXggYzBhOTc5YTUuLjk3YWI1YmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9maXJtd2FyZV9jbGFzcy5jCisrKyBiL2RyaXZlcnMvYmFzZS9maXJtd2FyZV9jbGFzcy5jCkBAIC0zMSw4ICszMSw2IEBACiAJRldfU1RBVFVTX0xPQURJTkcsCiAJRldfU1RBVFVTX0RPTkUsCiAJRldfU1RBVFVTX0FCT1JULAotCUZXX1NUQVRVU19SRUFEWSwKLQlGV19TVEFUVVNfUkVBRFlfTk9IT1RQTFVHLAogfTsKIAogc3RhdGljIGludCBsb2FkaW5nX3RpbWVvdXQgPSA2MDsJLyogSW4gc2Vjb25kcyAqLwpAQCAtOTYsOSArOTQsNiBAQAogCXN0cnVjdCBmaXJtd2FyZV9wcml2ICpmd19wcml2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJaW50IGkgPSAwLCBsZW4gPSAwOwogCi0JaWYgKCF0ZXN0X2JpdChGV19TVEFUVVNfUkVBRFksICZmd19wcml2LT5zdGF0dXMpKQotCQlyZXR1cm4gLUVOT0RFVjsKLQogCWlmIChhZGRfdWV2ZW50X3ZhcihlbnZwLCBudW1fZW52cCwgJmksIGJ1ZmZlciwgYnVmZmVyX3NpemUsICZsZW4sCiAJCQkgICAiRklSTVdBUkU9JXMiLCBmd19wcml2LT5md19pZCkpCiAJCXJldHVybiAtRU5PTUVNOwpAQCAtMzMzLDYgKzMyOCw3IEBACiAJZl9kZXYtPnBhcmVudCA9IGRldmljZTsKIAlmX2Rldi0+Y2xhc3MgPSAmZmlybXdhcmVfY2xhc3M7CiAJZGV2X3NldF9kcnZkYXRhKGZfZGV2LCBmd19wcml2KTsKKwlmX2Rldi0+dWV2ZW50X3N1cHByZXNzID0gMTsKIAlyZXR2YWwgPSBkZXZpY2VfcmVnaXN0ZXIoZl9kZXYpOwogCWlmIChyZXR2YWwpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogZGV2aWNlX3JlZ2lzdGVyIGZhaWxlZFxuIiwKQEAgLTM4Miw5ICszNzgsNyBAQAogCX0KIAogCWlmICh1ZXZlbnQpCi0gICAgICAgICAgICAgICAgc2V0X2JpdChGV19TVEFUVVNfUkVBRFksICZmd19wcml2LT5zdGF0dXMpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgc2V0X2JpdChGV19TVEFUVVNfUkVBRFlfTk9IT1RQTFVHLCAmZndfcHJpdi0+c3RhdHVzKTsKKwkJZl9kZXYtPnVldmVudF9zdXBwcmVzcyA9IDA7CiAJKmRldl9wID0gZl9kZXY7CiAJZ290byBvdXQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9wb3dlci9tYWluLmMgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvbWFpbi5jCmluZGV4IGJiYmI5NzMuLjA1ZGM4NzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9wb3dlci9tYWluLmMKKysrIGIvZHJpdmVycy9iYXNlL3Bvd2VyL21haW4uYwpAQCAtMjksNiArMjksOSBAQAogREVDTEFSRV9NVVRFWChkcG1fc2VtKTsKIERFQ0xBUkVfTVVURVgoZHBtX2xpc3Rfc2VtKTsKIAoraW50ICgqcGxhdGZvcm1fZW5hYmxlX3dha2V1cCkoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgaXNfb24pOworCisKIC8qKgogICoJZGV2aWNlX3BtX3NldF9wYXJlbnQgLSBTcGVjaWZ5IHBvd2VyIGRlcGVuZGVuY3kuCiAgKglAZGV2OgkJRGV2aWNlIHdobyBuZWVkcyBwb3dlci4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9wb3dlci9yZXN1bWUuYyBiL2RyaXZlcnMvYmFzZS9wb3dlci9yZXN1bWUuYwppbmRleCAwMjBiZTM2Li5hMmM2NDE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvcG93ZXIvcmVzdW1lLmMKKysrIGIvZHJpdmVycy9iYXNlL3Bvd2VyL3Jlc3VtZS5jCkBAIC0yNiw3ICsyNiw5IEBACiAKIAlUUkFDRV9ERVZJQ0UoZGV2KTsKIAlUUkFDRV9SRVNVTUUoMCk7CisKIAlkb3duKCZkZXYtPnNlbSk7CisKIAlpZiAoZGV2LT5wb3dlci5wbV9wYXJlbnQKIAkJCSYmIGRldi0+cG93ZXIucG1fcGFyZW50LT5wb3dlci5wb3dlcl9zdGF0ZS5ldmVudCkgewogCQlkZXZfZXJyKGRldiwgIlBNOiByZXN1bWUgZnJvbSAlZCwgcGFyZW50ICVzIHN0aWxsICVkXG4iLApAQCAtMzQsMTUgKzM2LDI0IEBACiAJCQlkZXYtPnBvd2VyLnBtX3BhcmVudC0+YnVzX2lkLAogCQkJZGV2LT5wb3dlci5wbV9wYXJlbnQtPnBvd2VyLnBvd2VyX3N0YXRlLmV2ZW50KTsKIAl9CisKIAlpZiAoZGV2LT5idXMgJiYgZGV2LT5idXMtPnJlc3VtZSkgewogCQlkZXZfZGJnKGRldiwicmVzdW1pbmdcbiIpOwogCQllcnJvciA9IGRldi0+YnVzLT5yZXN1bWUoZGV2KTsKIAl9Ci0JaWYgKGRldi0+Y2xhc3MgJiYgZGV2LT5jbGFzcy0+cmVzdW1lKSB7CisKKwlpZiAoIWVycm9yICYmIGRldi0+dHlwZSAmJiBkZXYtPnR5cGUtPnJlc3VtZSkgeworCQlkZXZfZGJnKGRldiwicmVzdW1pbmdcbiIpOworCQllcnJvciA9IGRldi0+dHlwZS0+cmVzdW1lKGRldik7CisJfQorCisJaWYgKCFlcnJvciAmJiBkZXYtPmNsYXNzICYmIGRldi0+Y2xhc3MtPnJlc3VtZSkgewogCQlkZXZfZGJnKGRldiwiY2xhc3MgcmVzdW1lXG4iKTsKIAkJZXJyb3IgPSBkZXYtPmNsYXNzLT5yZXN1bWUoZGV2KTsKIAl9CisKIAl1cCgmZGV2LT5zZW0pOworCiAJVFJBQ0VfUkVTVU1FKGVycm9yKTsKIAlyZXR1cm4gZXJyb3I7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvcG93ZXIvc2h1dGRvd24uYyBiL2RyaXZlcnMvYmFzZS9wb3dlci9zaHV0ZG93bi5jCmluZGV4IDM0ODNhZTQuLjU4YjZmNzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9wb3dlci9zaHV0ZG93bi5jCisrKyBiL2RyaXZlcnMvYmFzZS9wb3dlci9zaHV0ZG93bi5jCkBAIC0zNiw3ICszNiw2IEBACiB7CiAJc3RydWN0IGRldmljZSAqIGRldiwgKmRldm47CiAKLQlkb3duX3dyaXRlKCZkZXZpY2VzX3N1YnN5cy5yd3NlbSk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlX3JldmVyc2UoZGV2LCBkZXZuLCAmZGV2aWNlc19zdWJzeXMua3NldC5saXN0LAogCQkJCWtvYmouZW50cnkpIHsKIAkJaWYgKGRldi0+YnVzICYmIGRldi0+YnVzLT5zaHV0ZG93bikgewpAQCAtNDcsNyArNDYsNiBAQAogCQkJZGV2LT5kcml2ZXItPnNodXRkb3duKGRldik7CiAJCX0KIAl9Ci0JdXBfd3JpdGUoJmRldmljZXNfc3Vic3lzLnJ3c2VtKTsKIAogCXN5c2Rldl9zaHV0ZG93bigpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3Bvd2VyL3N1c3BlbmQuYyBiL2RyaXZlcnMvYmFzZS9wb3dlci9zdXNwZW5kLmMKaW5kZXggZWNlMTM2Yi4uNDJkMmI4NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3Bvd2VyL3N1c3BlbmQuYworKysgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvc3VzcGVuZC5jCkBAIC03OCw2ICs3OCwxOCBAQAogCQlzdXNwZW5kX3JlcG9ydF9yZXN1bHQoZGV2LT5jbGFzcy0+c3VzcGVuZCwgZXJyb3IpOwogCX0KIAorCWlmICghZXJyb3IgJiYgZGV2LT50eXBlICYmIGRldi0+dHlwZS0+c3VzcGVuZCAmJiAhZGV2LT5wb3dlci5wb3dlcl9zdGF0ZS5ldmVudCkgeworCQlkZXZfZGJnKGRldiwgIiVzJXNcbiIsCisJCQlzdXNwZW5kX3ZlcmIoc3RhdGUuZXZlbnQpLAorCQkJKChzdGF0ZS5ldmVudCA9PSBQTV9FVkVOVF9TVVNQRU5EKQorCQkJCQkmJiBkZXZpY2VfbWF5X3dha2V1cChkZXYpKQorCQkJCT8gIiwgbWF5IHdha2V1cCIKKwkJCQk6ICIiCisJCQkpOworCQllcnJvciA9IGRldi0+dHlwZS0+c3VzcGVuZChkZXYsIHN0YXRlKTsKKwkJc3VzcGVuZF9yZXBvcnRfcmVzdWx0KGRldi0+dHlwZS0+c3VzcGVuZCwgZXJyb3IpOworCX0KKwogCWlmICghZXJyb3IgJiYgZGV2LT5idXMgJiYgZGV2LT5idXMtPnN1c3BlbmQgJiYgIWRldi0+cG93ZXIucG93ZXJfc3RhdGUuZXZlbnQpIHsKIAkJZGV2X2RiZyhkZXYsICIlcyVzXG4iLAogCQkJc3VzcGVuZF92ZXJiKHN0YXRlLmV2ZW50KSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svYW9lL2FvZS5oIGIvZHJpdmVycy9ibG9jay9hb2UvYW9lLmgKaW5kZXggMjMwOGU4My4uMWQ4NDY2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9hb2UvYW9lLmgKKysrIGIvZHJpdmVycy9ibG9jay9hb2UvYW9lLmgKQEAgLTQ4LDYgKzQ4LDE1IEBACiAJX19iZTMyIHRhZzsKIH07CiAKKyNpZmRlZiBfX0tFUk5FTF9fCisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGFvZV9oZHIgKmFvZV9oZHIoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gKHN0cnVjdCBhb2VfaGRyICopc2tiX21hY19oZWFkZXIoc2tiKTsKK30KKyNlbmRpZgorCiBzdHJ1Y3QgYW9lX2F0YWhkciB7CiAJdW5zaWduZWQgY2hhciBhZmxhZ3M7CiAJdW5zaWduZWQgY2hhciBlcnJmZWF0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9hb2UvYW9lY21kLmMgYi9kcml2ZXJzL2Jsb2NrL2FvZS9hb2VjbWQuYwppbmRleCA4ZDE3ZDhkLi4xYTZhZWFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL2FvZS9hb2VjbWQuYworKysgYi9kcml2ZXJzL2Jsb2NrL2FvZS9hb2VjbWQuYwpAQCAtMjcsNyArMjcsOCBAQAogCiAJc2tiID0gYWxsb2Nfc2tiKGxlbiwgR0ZQX0FUT01JQyk7CiAJaWYgKHNrYikgewotCQlza2ItPm5oLnJhdyA9IHNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKwkJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKKwkJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CiAJCXNrYi0+cHJvdG9jb2wgPSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0FPRSk7CiAJCXNrYi0+cHJpb3JpdHkgPSAwOwogCQlza2ItPm5leHQgPSBza2ItPnByZXYgPSBOVUxMOwpAQCAtMTE4LDcgKzExOSw3IEBACiAKIAkvKiBpbml0aWFsaXplIHRoZSBoZWFkZXJzICYgZnJhbWUgKi8KIAlza2IgPSBmLT5za2I7Ci0JaCA9IChzdHJ1Y3QgYW9lX2hkciAqKSBza2ItPm1hYy5yYXc7CisJaCA9IGFvZV9oZHIoc2tiKTsKIAlhaCA9IChzdHJ1Y3QgYW9lX2F0YWhkciAqKSAoaCsxKTsKIAlza2JfcHV0KHNrYiwgc2l6ZW9mICpoICsgc2l6ZW9mICphaCk7CiAJbWVtc2V0KGgsIDAsIHNrYi0+bGVuKTsKQEAgLTIwNyw3ICsyMDgsNyBAQAogCQlza2ItPmRldiA9IGlmcDsKIAkJaWYgKHNsX3RhaWwgPT0gTlVMTCkKIAkJCXNsX3RhaWwgPSBza2I7Ci0JCWggPSAoc3RydWN0IGFvZV9oZHIgKikgc2tiLT5tYWMucmF3OworCQloID0gYW9lX2hkcihza2IpOwogCQltZW1zZXQoaCwgMCwgc2l6ZW9mICpoICsgc2l6ZW9mICpjaCk7CiAKIAkJbWVtc2V0KGgtPmRzdCwgMHhmZiwgc2l6ZW9mIGgtPmRzdCk7CkBAIC0zMDAsNyArMzAxLDcgQEAKIAlhb2VjaHJfZXJyb3IoYnVmKTsKIAogCXNrYiA9IGYtPnNrYjsKLQloID0gKHN0cnVjdCBhb2VfaGRyICopIHNrYi0+bWFjLnJhdzsKKwloID0gYW9lX2hkcihza2IpOwogCWFoID0gKHN0cnVjdCBhb2VfYXRhaGRyICopIChoKzEpOwogCWYtPnRhZyA9IG47CiAJaC0+dGFnID0gY3B1X3RvX2JlMzIobik7CkBAIC01MjksNyArNTMwLDcgQEAKIAljaGFyIGVidWZbMTI4XTsKIAl1MTYgYW9lbWFqb3I7CiAKLQloaW4gPSAoc3RydWN0IGFvZV9oZHIgKikgc2tiLT5tYWMucmF3OworCWhpbiA9IGFvZV9oZHIoc2tiKTsKIAlhb2VtYWpvciA9IGJlMTZfdG9fY3B1KGdldF91bmFsaWduZWQoJmhpbi0+bWFqb3IpKTsKIAlkID0gYW9lZGV2X2J5X2FvZWFkZHIoYW9lbWFqb3IsIGhpbi0+bWlub3IpOwogCWlmIChkID09IE5VTEwpIHsKQEAgLTU2MSw3ICs1NjIsNyBAQAogCWNhbGNfcnR0YXZnKGQsIHRzaW5jZShmLT50YWcpKTsKIAogCWFoaW4gPSAoc3RydWN0IGFvZV9hdGFoZHIgKikgKGhpbisxKTsKLQlob3V0ID0gKHN0cnVjdCBhb2VfaGRyICopIGYtPnNrYi0+bWFjLnJhdzsKKwlob3V0ID0gYW9lX2hkcihmLT5za2IpOwogCWFob3V0ID0gKHN0cnVjdCBhb2VfYXRhaGRyICopIChob3V0KzEpOwogCWJ1ZiA9IGYtPmJ1ZjsKIApAQCAtNjk1LDcgKzY5Niw3IEBACiAKIAkvKiBpbml0aWFsaXplIHRoZSBoZWFkZXJzICYgZnJhbWUgKi8KIAlza2IgPSBmLT5za2I7Ci0JaCA9IChzdHJ1Y3QgYW9lX2hkciAqKSBza2ItPm1hYy5yYXc7CisJaCA9IGFvZV9oZHIoc2tiKTsKIAlhaCA9IChzdHJ1Y3QgYW9lX2F0YWhkciAqKSAoaCsxKTsKIAlza2JfcHV0KHNrYiwgc2l6ZW9mICpoICsgc2l6ZW9mICphaCk7CiAJbWVtc2V0KGgsIDAsIHNrYi0+bGVuKTsKQEAgLTcyNiw3ICs3MjcsNyBAQAogCWVudW0geyBNQVhGUkFNRVMgPSAxNiB9OwogCXUxNiBuOwogCi0JaCA9IChzdHJ1Y3QgYW9lX2hkciAqKSBza2ItPm1hYy5yYXc7CisJaCA9IGFvZV9oZHIoc2tiKTsKIAljaCA9IChzdHJ1Y3QgYW9lX2NmZ2hkciAqKSAoaCsxKTsKIAogCS8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2FvZS9hb2VuZXQuYyBiL2RyaXZlcnMvYmxvY2svYW9lL2FvZW5ldC5jCmluZGV4IGFhYjZkOTEuLmY5ZGRmZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svYW9lL2FvZW5ldC5jCisrKyBiL2RyaXZlcnMvYmxvY2svYW9lL2FvZW5ldC5jCkBAIC0xMjMsNyArMTIzLDcgQEAKIAkJZ290byBleGl0OwogCXNrYl9wdXNoKHNrYiwgRVRIX0hMRU4pOwkvKiAoMSkgKi8KIAotCWggPSAoc3RydWN0IGFvZV9oZHIgKikgc2tiLT5tYWMucmF3OworCWggPSBhb2VfaGRyKHNrYik7CiAJbiA9IGJlMzJfdG9fY3B1KGdldF91bmFsaWduZWQoJmgtPnRhZykpOwogCWlmICgoaC0+dmVyZmwgJiBBT0VGTF9SU1ApID09IDAgfHwgKG4gJiAxPDwzMSkpCiAJCWdvdG8gZXhpdDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svdWIuYyBiL2RyaXZlcnMvYmxvY2svdWIuYwppbmRleCAyMDk4ZWZmLi43NDZhMTE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL3ViLmMKKysrIGIvZHJpdmVycy9ibG9jay91Yi5jCkBAIC0yMTMyLDEwICsyMTMyLDEzIEBACiAJCWlmICgoZXAtPmJtQXR0cmlidXRlcyAmIFVTQl9FTkRQT0lOVF9YRkVSVFlQRV9NQVNLKQogCQkJCT09IFVTQl9FTkRQT0lOVF9YRkVSX0JVTEspIHsKIAkJCS8qIEJVTEsgaW4gb3Igb3V0PyAqLwotCQkJaWYgKGVwLT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0RJUl9JTikKLQkJCQllcF9pbiA9IGVwOwotCQkJZWxzZQotCQkJCWVwX291dCA9IGVwOworCQkJaWYgKGVwLT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0RJUl9JTikgeworCQkJCWlmIChlcF9pbiA9PSBOVUxMKQorCQkJCQllcF9pbiA9IGVwOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoZXBfb3V0ID09IE5VTEwpCisJCQkJCWVwX291dCA9IGVwOworCQkJfQogCQl9CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2JsdWV0b290aC9iZnVzYi5jIGIvZHJpdmVycy9ibHVldG9vdGgvYmZ1c2IuYwppbmRleCA0Yzc2NmYzLi5iOTkwODA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2JsdWV0b290aC9iZnVzYi5jCisrKyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2JmdXNiLmMKQEAgLTUyNyw3ICs1MjcsNyBAQAogCQlidWZbMl0gPSAoc2l6ZSA9PSBCRlVTQl9NQVhfQkxPQ0tfU0laRSkgPyAwIDogc2l6ZTsKIAogCQltZW1jcHkoc2tiX3B1dChuc2tiLCAzKSwgYnVmLCAzKTsKLQkJbWVtY3B5KHNrYl9wdXQobnNrYiwgc2l6ZSksIHNrYi0+ZGF0YSArIHNlbnQsIHNpemUpOworCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhX29mZnNldChza2IsIHNlbnQsIHNrYl9wdXQobnNrYiwgc2l6ZSksIHNpemUpOwogCiAJCXNlbnQgICs9IHNpemU7CiAJCWNvdW50IC09IHNpemU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2JsdWV0b290aC9ibHVlY2FyZF9jcy5jIGIvZHJpdmVycy9ibHVldG9vdGgvYmx1ZWNhcmRfY3MuYwppbmRleCBhY2ZiNmE0Li44NTFkZTRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2JsdWV0b290aC9ibHVlY2FyZF9jcy5jCisrKyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2JsdWVjYXJkX2NzLmMKQEAgLTQ2MSwyMCArNDYxLDIwIEBACiAJCQkJc3dpdGNoIChpbmZvLT5yeF9zdGF0ZSkgewogCiAJCQkJY2FzZSBSRUNWX1dBSVRfRVZFTlRfSEVBREVSOgotCQkJCQllaCA9IChzdHJ1Y3QgaGNpX2V2ZW50X2hkciAqKShpbmZvLT5yeF9za2ItPmRhdGEpOworCQkJCQllaCA9IGhjaV9ldmVudF9oZHIoaW5mby0+cnhfc2tiKTsKIAkJCQkJaW5mby0+cnhfc3RhdGUgPSBSRUNWX1dBSVRfREFUQTsKIAkJCQkJaW5mby0+cnhfY291bnQgPSBlaC0+cGxlbjsKIAkJCQkJYnJlYWs7CiAKIAkJCQljYXNlIFJFQ1ZfV0FJVF9BQ0xfSEVBREVSOgotCQkJCQlhaCA9IChzdHJ1Y3QgaGNpX2FjbF9oZHIgKikoaW5mby0+cnhfc2tiLT5kYXRhKTsKKwkJCQkJYWggPSBoY2lfYWNsX2hkcihpbmZvLT5yeF9za2IpOwogCQkJCQlkbGVuID0gX19sZTE2X3RvX2NwdShhaC0+ZGxlbik7CiAJCQkJCWluZm8tPnJ4X3N0YXRlID0gUkVDVl9XQUlUX0RBVEE7CiAJCQkJCWluZm8tPnJ4X2NvdW50ID0gZGxlbjsKIAkJCQkJYnJlYWs7CiAKIAkJCQljYXNlIFJFQ1ZfV0FJVF9TQ09fSEVBREVSOgotCQkJCQlzaCA9IChzdHJ1Y3QgaGNpX3Njb19oZHIgKikoaW5mby0+cnhfc2tiLT5kYXRhKTsKKwkJCQkJc2ggPSBoY2lfc2NvX2hkcihpbmZvLT5yeF9za2IpOwogCQkJCQlpbmZvLT5yeF9zdGF0ZSA9IFJFQ1ZfV0FJVF9EQVRBOwogCQkJCQlpbmZvLT5yeF9jb3VudCA9IHNoLT5kbGVuOwogCQkJCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmx1ZXRvb3RoL2JwYTEweC5jIGIvZHJpdmVycy9ibHVldG9vdGgvYnBhMTB4LmMKaW5kZXggOWZjYTY1MS4uZThlYmQ1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibHVldG9vdGgvYnBhMTB4LmMKKysrIGIvZHJpdmVycy9ibHVldG9vdGgvYnBhMTB4LmMKQEAgLTIzMSw3ICsyMzEsNyBAQAogCQljciA9IChzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICopIHVyYi0+c2V0dXBfcGFja2V0OwogCQljci0+d0xlbmd0aCA9IF9fY3B1X3RvX2xlMTYoc2tiLT5sZW4pOwogCi0JCW1lbWNweSh1cmItPnRyYW5zZmVyX2J1ZmZlciwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCB1cmItPnRyYW5zZmVyX2J1ZmZlciwgc2tiLT5sZW4pOwogCQl1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBza2ItPmxlbjsKIAogCQllcnIgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOwpAQCAtMjUwLDcgKzI1MCw3IEBACiAJCXNrYiA9IHNrYl9kZXF1ZXVlKCZkYXRhLT50eF9xdWV1ZSk7CiAKIAlpZiAoc2tiKSB7Ci0JCW1lbWNweSh1cmItPnRyYW5zZmVyX2J1ZmZlciwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCB1cmItPnRyYW5zZmVyX2J1ZmZlciwgc2tiLT5sZW4pOwogCQl1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBza2ItPmxlbjsKIAogCQllcnIgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibHVldG9vdGgvYnQzY19jcy5jIGIvZHJpdmVycy9ibHVldG9vdGgvYnQzY19jcy5jCmluZGV4IDE4YjBmMzkuLjM5NTE2MDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmx1ZXRvb3RoL2J0M2NfY3MuYworKysgYi9kcml2ZXJzL2JsdWV0b290aC9idDNjX2NzLmMKQEAgLTMwMywyMCArMzAzLDIwIEBACiAJCQkJc3dpdGNoIChpbmZvLT5yeF9zdGF0ZSkgewogCiAJCQkJY2FzZSBSRUNWX1dBSVRfRVZFTlRfSEVBREVSOgotCQkJCQllaCA9IChzdHJ1Y3QgaGNpX2V2ZW50X2hkciAqKShpbmZvLT5yeF9za2ItPmRhdGEpOworCQkJCQllaCA9IGhjaV9ldmVudF9oZHIoaW5mby0+cnhfc2tiKTsKIAkJCQkJaW5mby0+cnhfc3RhdGUgPSBSRUNWX1dBSVRfREFUQTsKIAkJCQkJaW5mby0+cnhfY291bnQgPSBlaC0+cGxlbjsKIAkJCQkJYnJlYWs7CiAKIAkJCQljYXNlIFJFQ1ZfV0FJVF9BQ0xfSEVBREVSOgotCQkJCQlhaCA9IChzdHJ1Y3QgaGNpX2FjbF9oZHIgKikoaW5mby0+cnhfc2tiLT5kYXRhKTsKKwkJCQkJYWggPSBoY2lfYWNsX2hkcihpbmZvLT5yeF9za2IpOwogCQkJCQlkbGVuID0gX19sZTE2X3RvX2NwdShhaC0+ZGxlbik7CiAJCQkJCWluZm8tPnJ4X3N0YXRlID0gUkVDVl9XQUlUX0RBVEE7CiAJCQkJCWluZm8tPnJ4X2NvdW50ID0gZGxlbjsKIAkJCQkJYnJlYWs7CiAKIAkJCQljYXNlIFJFQ1ZfV0FJVF9TQ09fSEVBREVSOgotCQkJCQlzaCA9IChzdHJ1Y3QgaGNpX3Njb19oZHIgKikoaW5mby0+cnhfc2tiLT5kYXRhKTsKKwkJCQkJc2ggPSBoY2lfc2NvX2hkcihpbmZvLT5yeF9za2IpOwogCQkJCQlpbmZvLT5yeF9zdGF0ZSA9IFJFQ1ZfV0FJVF9EQVRBOwogCQkJCQlpbmZvLT5yeF9jb3VudCA9IHNoLT5kbGVuOwogCQkJCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmx1ZXRvb3RoL2J0dWFydF9jcy5jIGIvZHJpdmVycy9ibHVldG9vdGgvYnR1YXJ0X2NzLmMKaW5kZXggYzFiY2U3NS4uZDdkMmVhMGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmx1ZXRvb3RoL2J0dWFydF9jcy5jCisrKyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2J0dWFydF9jcy5jCkBAIC0yNTAsMjAgKzI1MCwyMCBAQAogCQkJCXN3aXRjaCAoaW5mby0+cnhfc3RhdGUpIHsKIAogCQkJCWNhc2UgUkVDVl9XQUlUX0VWRU5UX0hFQURFUjoKLQkJCQkJZWggPSAoc3RydWN0IGhjaV9ldmVudF9oZHIgKikoaW5mby0+cnhfc2tiLT5kYXRhKTsKKwkJCQkJZWggPSBoY2lfZXZlbnRfaGRyKGluZm8tPnJ4X3NrYik7CiAJCQkJCWluZm8tPnJ4X3N0YXRlID0gUkVDVl9XQUlUX0RBVEE7CiAJCQkJCWluZm8tPnJ4X2NvdW50ID0gZWgtPnBsZW47CiAJCQkJCWJyZWFrOwogCiAJCQkJY2FzZSBSRUNWX1dBSVRfQUNMX0hFQURFUjoKLQkJCQkJYWggPSAoc3RydWN0IGhjaV9hY2xfaGRyICopKGluZm8tPnJ4X3NrYi0+ZGF0YSk7CisJCQkJCWFoID0gaGNpX2FjbF9oZHIoaW5mby0+cnhfc2tiKTsKIAkJCQkJZGxlbiA9IF9fbGUxNl90b19jcHUoYWgtPmRsZW4pOwogCQkJCQlpbmZvLT5yeF9zdGF0ZSA9IFJFQ1ZfV0FJVF9EQVRBOwogCQkJCQlpbmZvLT5yeF9jb3VudCA9IGRsZW47CiAJCQkJCWJyZWFrOwogCiAJCQkJY2FzZSBSRUNWX1dBSVRfU0NPX0hFQURFUjoKLQkJCQkJc2ggPSAoc3RydWN0IGhjaV9zY29faGRyICopKGluZm8tPnJ4X3NrYi0+ZGF0YSk7CisJCQkJCXNoID0gaGNpX3Njb19oZHIoaW5mby0+cnhfc2tiKTsKIAkJCQkJaW5mby0+cnhfc3RhdGUgPSBSRUNWX1dBSVRfREFUQTsKIAkJCQkJaW5mby0+cnhfY291bnQgPSBzaC0+ZGxlbjsKIAkJCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2JsdWV0b290aC9kdGwxX2NzLmMgYi9kcml2ZXJzL2JsdWV0b290aC9kdGwxX2NzLmMKaW5kZXggNDU5YWE5Ny4uN2Y5YzU0YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibHVldG9vdGgvZHRsMV9jcy5jCisrKyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2R0bDFfY3MuYwpAQCAtNDI1LDcgKzQyNSw3IEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJc2tiX3Jlc2VydmUocywgTlNITCk7Ci0JbWVtY3B5KHNrYl9wdXQocywgc2tiLT5sZW4pLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgc2tiX3B1dChzLCBza2ItPmxlbiksIHNrYi0+bGVuKTsKIAlpZiAoc2tiLT5sZW4gJiAweDAwMDEpCiAJCSpza2JfcHV0KHMsIDEpID0gMDsJLyogUEFEICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmx1ZXRvb3RoL2hjaV9oNC5jIGIvZHJpdmVycy9ibHVldG9vdGgvaGNpX2g0LmMKaW5kZXggMzRmMGFmYy4uYmZiYWUxNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibHVldG9vdGgvaGNpX2g0LmMKKysrIGIvZHJpdmVycy9ibHVldG9vdGgvaGNpX2g0LmMKQEAgLTE4OCw3ICsxODgsNyBAQAogCQkJCWNvbnRpbnVlOwogCiAJCQljYXNlIEg0X1c0X0VWRU5UX0hEUjoKLQkJCQllaCA9IChzdHJ1Y3QgaGNpX2V2ZW50X2hkciAqKSBoNC0+cnhfc2tiLT5kYXRhOworCQkJCWVoID0gaGNpX2V2ZW50X2hkcihoNC0+cnhfc2tiKTsKIAogCQkJCUJUX0RCRygiRXZlbnQgaGVhZGVyOiBldnQgMHglMi4yeCBwbGVuICVkIiwgZWgtPmV2dCwgZWgtPnBsZW4pOwogCkBAIC0xOTYsNyArMTk2LDcgQEAKIAkJCQljb250aW51ZTsKIAogCQkJY2FzZSBINF9XNF9BQ0xfSERSOgotCQkJCWFoID0gKHN0cnVjdCBoY2lfYWNsX2hkciAqKSBoNC0+cnhfc2tiLT5kYXRhOworCQkJCWFoID0gaGNpX2FjbF9oZHIoaDQtPnJ4X3NrYik7CiAJCQkJZGxlbiA9IF9fbGUxNl90b19jcHUoYWgtPmRsZW4pOwogCiAJCQkJQlRfREJHKCJBQ0wgaGVhZGVyOiBkbGVuICVkIiwgZGxlbik7CkBAIC0yMDUsNyArMjA1LDcgQEAKIAkJCQljb250aW51ZTsKIAogCQkJY2FzZSBINF9XNF9TQ09fSERSOgotCQkJCXNoID0gKHN0cnVjdCBoY2lfc2NvX2hkciAqKSBoNC0+cnhfc2tiLT5kYXRhOworCQkJCXNoID0gaGNpX3Njb19oZHIoaDQtPnJ4X3NrYik7CiAKIAkJCQlCVF9EQkcoIlNDTyBoZWFkZXI6IGRsZW4gJWQiLCBzaC0+ZGxlbik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9icmlxX3BhbmVsLmMgYi9kcml2ZXJzL2NoYXIvYnJpcV9wYW5lbC5jCmluZGV4IDhkY2Y5ZDIuLmM3MGQ1MmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9icmlxX3BhbmVsLmMKKysrIGIvZHJpdmVycy9jaGFyL2JyaXFfcGFuZWwuYwpAQCAtMjAyLDEzICsyMDIsMTYgQEAKIAogc3RhdGljIGludCBfX2luaXQgYnJpcV9wYW5lbF9pbml0KHZvaWQpCiB7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpyb290ID0gZmluZF9wYXRoX2RldmljZSgiLyIpOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcm9vdCA9IG9mX2ZpbmRfbm9kZV9ieV9wYXRoKCIvIik7CiAJY29uc3QgY2hhciAqbWFjaGluZTsKIAlpbnQgaTsKIAogCW1hY2hpbmUgPSBnZXRfcHJvcGVydHkocm9vdCwgIm1vZGVsIiwgTlVMTCk7Ci0JaWYgKCFtYWNoaW5lIHx8IHN0cm5jbXAobWFjaGluZSwgIlRvdGFsSW1wYWN0LEJSSVEtMSIsIDE4KSAhPSAwKQorCWlmICghbWFjaGluZSB8fCBzdHJuY21wKG1hY2hpbmUsICJUb3RhbEltcGFjdCxCUklRLTEiLCAxOCkgIT0gMCkgeworCQlvZl9ub2RlX3B1dChyb290KTsKIAkJcmV0dXJuIC1FTk9ERVY7CisJfQorCW9mX25vZGVfcHV0KHJvb3QpOwogCiAJcHJpbnRrKEtFUk5fSU5GTwogCQkiYnJpcV9wYW5lbDogdiVzIERyLiBLYXJzdGVuIEplcHBlc2VuIChrakB0b3RhbGltcGFjdC5jb20pXG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2h2Y19jb25zb2xlLmMgYi9kcml2ZXJzL2NoYXIvaHZjX2NvbnNvbGUuYwppbmRleCBhMGE4OGFhMi4uMGY5ZWQ3YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2h2Y19jb25zb2xlLmMKKysrIGIvZHJpdmVycy9jaGFyL2h2Y19jb25zb2xlLmMKQEAgLTQ3LDggKzQ3LDYgQEAKICNkZWZpbmUgSFZDX01BSk9SCTIyOQogI2RlZmluZSBIVkNfTUlOT1IJMAogCi0jZGVmaW5lIFRJTUVPVVQJCSgxMCkKLQogLyoKICAqIFdhaXQgdGhpcyBsb25nIHBlciBpdGVyYXRpb24gd2hpbGUgdHJ5aW5nIHRvIHB1c2ggYnVmZmVyZWQgZGF0YSB0byB0aGUKICAqIGh5cGVydmlzb3IgYmVmb3JlIGFsbG93aW5nIHRoZSB0dHkgdG8gY29tcGxldGUgYSBjbG9zZSBvcGVyYXRpb24uCkBAIC0xMDQsMTIgKzEwMiwxMiBAQAogLyoKICAqIFRoaXMgdmFsdWUgaXMgdXNlZCB0byBhc3NpZ24gYSB0dHktPmluZGV4IHZhbHVlIHRvIGEgaHZjX3N0cnVjdCBiYXNlZAogICogdXBvbiBvcmRlciBvZiBleHBvc3VyZSB2aWEgaHZjX3Byb2JlKCksIHdoZW4gd2UgY2FuIG5vdCBtYXRjaCBpdCB0bwotICogYSBjb25zb2xlIGNhbmlkYXRlIHJlZ2lzdGVyZWQgd2l0aCBodmNfaW5zdGFudGlhdGUoKS4KKyAqIGEgY29uc29sZSBjYW5kaWRhdGUgcmVnaXN0ZXJlZCB3aXRoIGh2Y19pbnN0YW50aWF0ZSgpLgogICovCiBzdGF0aWMgaW50IGxhc3RfaHZjID0gLTE7CiAKIC8qCi0gKiBEbyBub3QgY2FsbCB0aGlzIGZ1bmN0aW9uIHdpdGggZWl0aGVyIHRoZSBodmNfc3RydWNzdF9sb2NrIG9yIHRoZSBodmNfc3RydWN0CisgKiBEbyBub3QgY2FsbCB0aGlzIGZ1bmN0aW9uIHdpdGggZWl0aGVyIHRoZSBodmNfc3RydWN0c19sb2NrIG9yIHRoZSBodmNfc3RydWN0CiAgKiBsb2NrIGhlbGQuICBJZiBzdWNjZXNzZnVsLCB0aGlzIGZ1bmN0aW9uIGluY3JlbWVudHMgdGhlIGtvYmplY3QgcmVmZXJlbmNlCiAgKiBjb3VudCBhZ2FpbnN0IHRoZSB0YXJnZXQgaHZjX3N0cnVjdCBzbyBpdCBzaG91bGQgYmUgcmVsZWFzZWQgd2hlbiBmaW5pc2hlZC4KICAqLwpAQCAtMTYyLDcgKzE2MCw3IEBACiAJaWYgKGluZGV4ID49IE1BWF9OUl9IVkNfQ09OU09MRVMpCiAJCXJldHVybjsKIAotCS8qIFRoaXMgY29uc29sZSBhZGFwdGVyIHdhcyByZW1vdmVkIHNvIGl0IGlzIG5vdCB1c2VhYmxlLiAqLworCS8qIFRoaXMgY29uc29sZSBhZGFwdGVyIHdhcyByZW1vdmVkIHNvIGl0IGlzIG5vdCB1c2FibGUuICovCiAJaWYgKHZ0ZXJtbm9zW2luZGV4XSA8IDApCiAJCXJldHVybjsKIApAQCAtMjIwLDcgKzIxOCw3IEBACiB9OwogCiAvKgotICogRWFybHkgY29uc29sZSBpbml0aWFsaXphdGlvbi4gIFByZWNlZWRzIGRyaXZlciBpbml0aWFsaXphdGlvbi4KKyAqIEVhcmx5IGNvbnNvbGUgaW5pdGlhbGl6YXRpb24uICBQcmVjZWRlcyBkcml2ZXIgaW5pdGlhbGl6YXRpb24uCiAgKgogICogKDEpIHdlIGFyZSBmaXJzdCwgYW5kIHRoZSB1c2VyIHNwZWNpZmllZCBhbm90aGVyIGRyaXZlcgogICogLS0gaW5kZXggd2lsbCByZW1haW4gLTEKQEAgLTI1Nyw3ICsyNTUsNyBAQAogCWlmICh2dGVybW5vc1tpbmRleF0gIT0gLTEpCiAJCXJldHVybiAtMTsKIAotCS8qIG1ha2Ugc3VyZSBubyBubyB0dHkgaGFzIGJlZW4gcmVnaXN0ZXJkIGluIHRoaXMgaW5kZXggKi8KKwkvKiBtYWtlIHN1cmUgbm8gbm8gdHR5IGhhcyBiZWVuIHJlZ2lzdGVyZWQgaW4gdGhpcyBpbmRleCAqLwogCWhwID0gaHZjX2dldF9ieV9pbmRleChpbmRleCk7CiAJaWYgKGhwKSB7CiAJCWtvYmplY3RfcHV0KCZocC0+a29iaik7CkBAIC0yNjcsNyArMjY1LDcgQEAKIAl2dGVybW5vc1tpbmRleF0gPSB2dGVybW5vOwogCWNvbnNfb3BzW2luZGV4XSA9IG9wczsKIAotCS8qIHJlc2VydmUgYWxsIGluZGljZXMgdXB0byBhbmQgaW5jbHVkaW5nIHRoaXMgaW5kZXggKi8KKwkvKiByZXNlcnZlIGFsbCBpbmRpY2VzIHVwIHRvIGFuZCBpbmNsdWRpbmcgdGhpcyBpbmRleCAqLwogCWlmIChsYXN0X2h2YyA8IGluZGV4KQogCQlsYXN0X2h2YyA9IGluZGV4OwogCkBAIC01MjgsNyArNTI2LDcgQEAKIAogLyoKICAqIFRoaXMgaXMgYWN0dWFsbHkgYSBjb250cmFjdCBiZXR3ZWVuIHRoZSBkcml2ZXIgYW5kIHRoZSB0dHkgbGF5ZXIgb3V0bGluaW5nCi0gKiBob3cgbXVjaCB3cml0ZSByb29tIHRoZSBkcml2ZXIgY2FuIGd1YXJlbnRlZSB3aWxsIGJlIHNlbnQgT1IgQlVGRkVSRUQuICBUaGlzCisgKiBob3cgbXVjaCB3cml0ZSByb29tIHRoZSBkcml2ZXIgY2FuIGd1YXJhbnRlZSB3aWxsIGJlIHNlbnQgT1IgQlVGRkVSRUQuICBUaGlzCiAgKiBkcml2ZXIgTVVTVCBob25vciB0aGUgcmV0dXJuIHZhbHVlLgogICovCiBzdGF0aWMgaW50IGh2Y193cml0ZV9yb29tKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCkBAIC01NTAsNiArNTQ4LDE4IEBACiAJcmV0dXJuIGhwLT5uX291dGJ1ZjsKIH0KIAorLyoKKyAqIHRpbWVvdXQgd2lsbCB2YXJ5IGJldHdlZW4gdGhlIE1JTiBhbmQgTUFYIHZhbHVlcyBkZWZpbmVkIGhlcmUuICBCeSBkZWZhdWx0CisgKiBhbmQgZHVyaW5nIGNvbnNvbGUgYWN0aXZpdHkgd2Ugd2lsbCB1c2UgYSBkZWZhdWx0IE1JTl9USU1FT1VUIG9mIDEwLiAgV2hlbgorICogdGhlIGNvbnNvbGUgaXMgaWRsZSwgd2UgaW5jcmVhc2UgdGhlIHRpbWVvdXQgdmFsdWUgb24gZWFjaCBwYXNzIHRocm91Z2gKKyAqIG1zbGVlcCB1bnRpbCB3ZSByZWFjaCB0aGUgbWF4LiAgVGhpcyBtYXkgYmUgbm90aWNlYWJsZSBhcyBhIGJyaWVmIChhdmVyYWdlCisgKiBvbmUgc2Vjb25kKSBkZWxheSBvbiB0aGUgY29uc29sZSBiZWZvcmUgdGhlIGNvbnNvbGUgcmVzcG9uZHMgdG8gaW5wdXQgd2hlbgorICogdGhlcmUgaGFzIGJlZW4gbm8gaW5wdXQgZm9yIHNvbWUgdGltZS4KKyAqLworI2RlZmluZSBNSU5fVElNRU9VVAkJKDEwKQorI2RlZmluZSBNQVhfVElNRU9VVAkJKDIwMDApCitzdGF0aWMgdTMyIHRpbWVvdXQgPSBNSU5fVElNRU9VVDsKKwogI2RlZmluZSBIVkNfUE9MTF9SRUFECTB4MDAwMDAwMDEKICNkZWZpbmUgSFZDX1BPTExfV1JJVEUJMHgwMDAwMDAwMgogCkBAIC02NDIsOSArNjUyLDE0IEBACiAgYmFpbDoKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZocC0+bG9jaywgZmxhZ3MpOwogCi0JaWYgKHJlYWRfdG90YWwpCisJaWYgKHJlYWRfdG90YWwpIHsKKwkJLyogQWN0aXZpdHkgaXMgb2NjdXJyaW5nLCBzbyByZXNldCB0aGUgcG9sbGluZyBiYWNrb2ZmIHZhbHVlIHRvCisJCSAgIGEgbWluaW11bSBmb3IgcGVyZm9ybWFuY2UuICovCisJCXRpbWVvdXQgPSBNSU5fVElNRU9VVDsKKwogCQl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOwotCQorCX0KKwogCXJldHVybiBwb2xsX21hc2s7CiB9CiAKQEAgLTY4OCw4ICs3MDMsMTIgQEAKIAkJaWYgKCFodmNfa2lja2VkKSB7CiAJCQlpZiAocG9sbF9tYXNrID09IDApCiAJCQkJc2NoZWR1bGUoKTsKLQkJCWVsc2UKLQkJCQltc2xlZXBfaW50ZXJydXB0aWJsZShUSU1FT1VUKTsKKwkJCWVsc2UgeworCQkJCWlmICh0aW1lb3V0IDwgTUFYX1RJTUVPVVQpCisJCQkJCXRpbWVvdXQgKz0gKHRpbWVvdXQgPj4gNikgKyAxOworCisJCQkJbXNsZWVwX2ludGVycnVwdGlibGUodGltZW91dCk7CisJCQl9CiAJCX0KIAkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwogCX0gd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpOwpAQCAtNzk0LDcgKzgxMyw3IEBACiAKIAkvKgogCSAqIFdlICdwdXQnIHRoZSBpbnN0YW5jZSB0aGF0IHdhcyBncmFiYmVkIHdoZW4gdGhlIGtvYmplY3QgaW5zdGFuY2UKLQkgKiB3YXMgaW50aWFsaXplZCB1c2luZyBrb2JqZWN0X2luaXQoKS4gIExldCB0aGUgbGFzdCBob2xkZXIgb2YgdGhpcworCSAqIHdhcyBpbml0aWFsaXplZCB1c2luZyBrb2JqZWN0X2luaXQoKS4gIExldCB0aGUgbGFzdCBob2xkZXIgb2YgdGhpcwogCSAqIGtvYmplY3QgY2F1c2UgaXQgdG8gYmUgcmVtb3ZlZCwgd2hpY2ggd2lsbCBwcm9iYWJseSBiZSB0aGUgdHR5X2hhbmd1cAogCSAqIGJlbG93LgogCSAqLwpAQCAtODUwLDcgKzg2OSw3IEBACiB9CiBtb2R1bGVfaW5pdChodmNfaW5pdCk7CiAKLS8qIFRoaXMgaXNuJ3QgcGFydGljdWxhcmlseSBuZWNlc3NhcnkgZHVlIHRvIHRoaXMgYmVpbmcgYSBjb25zb2xlIGRyaXZlcgorLyogVGhpcyBpc24ndCBwYXJ0aWN1bGFybHkgbmVjZXNzYXJ5IGR1ZSB0byB0aGlzIGJlaW5nIGEgY29uc29sZSBkcml2ZXIKICAqIGJ1dCBpdCBpcyBuaWNlIHRvIGJlIHRob3JvdWdoLgogICovCiBzdGF0aWMgdm9pZCBfX2V4aXQgaHZjX2V4aXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9odmNfaXNlcmllcy5jIGIvZHJpdmVycy9jaGFyL2h2Y19pc2VyaWVzLmMKaW5kZXggZjE0NGE5NC4uZWM0MjBmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2h2Y19pc2VyaWVzLmMKKysrIGIvZHJpdmVycy9jaGFyL2h2Y19pc2VyaWVzLmMKQEAgLTU3NSw3ICs1NzUsNyBAQAogCQkJCShudW1fZm91bmQgPj0gVlRUWV9QT1JUUykpCiAJCQlicmVhazsKIAotCQl2dGVybW5vID0gZ2V0X3Byb3BlcnR5KHZ0eSwgInJlZyIsIE5VTEwpOworCQl2dGVybW5vID0gb2ZfZ2V0X3Byb3BlcnR5KHZ0eSwgInJlZyIsIE5VTEwpOwogCQlpZiAoIXZ0ZXJtbm8pCiAJCQljb250aW51ZTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2h2Y192aW8uYyBiL2RyaXZlcnMvY2hhci9odmNfdmlvLmMKaW5kZXggZjljMDA4NC4uOTRhNTQyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2h2Y192aW8uYworKysgYi9kcml2ZXJzL2NoYXIvaHZjX3Zpby5jCkBAIC0xNTMsNyArMTUzLDcgQEAKIAkJaWYgKG51bV9mb3VuZCA+PSBNQVhfTlJfSFZDX0NPTlNPTEVTKQogCQkJYnJlYWs7CiAKLQkJdnRlcm1ubyA9IGdldF9wcm9wZXJ0eSh2dHksICJyZWciLCBOVUxMKTsKKwkJdnRlcm1ubyA9IG9mX2dldF9wcm9wZXJ0eSh2dHksICJyZWciLCBOVUxMKTsKIAkJaWYgKCF2dGVybW5vKQogCQkJY29udGludWU7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9odnNpLmMgYi9kcml2ZXJzL2NoYXIvaHZzaS5jCmluZGV4IDUwMzE1ZDYuLmQ1YTc1MmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9odnNpLmMKKysrIGIvZHJpdmVycy9jaGFyL2h2c2kuYwpAQCAtMTI3OSw4ICsxMjc5LDggQEAKIAkJc3RydWN0IGh2c2lfc3RydWN0ICpocDsKIAkJY29uc3QgdWludDMyX3QgKnZ0ZXJtbm8sICppcnE7CiAKLQkJdnRlcm1ubyA9IGdldF9wcm9wZXJ0eSh2dHksICJyZWciLCBOVUxMKTsKLQkJaXJxID0gZ2V0X3Byb3BlcnR5KHZ0eSwgImludGVycnVwdHMiLCBOVUxMKTsKKwkJdnRlcm1ubyA9IG9mX2dldF9wcm9wZXJ0eSh2dHksICJyZWciLCBOVUxMKTsKKwkJaXJxID0gb2ZfZ2V0X3Byb3BlcnR5KHZ0eSwgImludGVycnVwdHMiLCBOVUxMKTsKIAkJaWYgKCF2dGVybW5vIHx8ICFpcnEpCiAJCQljb250aW51ZTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3BjbWNpYS9zeW5jbGlua19jcy5jIGIvZHJpdmVycy9jaGFyL3BjbWNpYS9zeW5jbGlua19jcy5jCmluZGV4IDhkMDI1ZTkuLjE1N2IxZDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9wY21jaWEvc3luY2xpbmtfY3MuYworKysgYi9kcml2ZXJzL2NoYXIvcGNtY2lhL3N5bmNsaW5rX2NzLmMKQEAgLTQxNjksNyArNDE2OSw3IEBACiAJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwogCiAJLyogY29weSBkYXRhIHRvIGRldmljZSBidWZmZXJzICovCi0JbWVtY3B5KGluZm8tPnR4X2J1Ziwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIGluZm8tPnR4X2J1Ziwgc2tiLT5sZW4pOwogCWluZm8tPnR4X2dldCA9IDA7CiAJaW5mby0+dHhfcHV0ID0gaW5mby0+dHhfY291bnQgPSBza2ItPmxlbjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3JhbmRvbS5jIGIvZHJpdmVycy9jaGFyL3JhbmRvbS5jCmluZGV4IGI5ZGM3YWEuLjQ2YzFiOTc3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3JhbmRvbS5jCisrKyBiL2RyaXZlcnMvY2hhci9yYW5kb20uYwpAQCAtODgxLDE1ICs4ODEsMTUgQEAKICAqLwogc3RhdGljIHZvaWQgaW5pdF9zdGRfZGF0YShzdHJ1Y3QgZW50cm9weV9zdG9yZSAqcikKIHsKLQlzdHJ1Y3QgdGltZXZhbCB0djsKKwlrdGltZV90IG5vdzsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnItPmxvY2ssIGZsYWdzKTsKIAlyLT5lbnRyb3B5X2NvdW50ID0gMDsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyLT5sb2NrLCBmbGFncyk7CiAKLQlkb19nZXR0aW1lb2ZkYXkoJnR2KTsKLQlhZGRfZW50cm9weV93b3JkcyhyLCAoX191MzIgKikmdHYsIHNpemVvZih0dikvNCk7CisJbm93ID0ga3RpbWVfZ2V0X3JlYWwoKTsKKwlhZGRfZW50cm9weV93b3JkcyhyLCAoX191MzIgKikmbm93LCBzaXplb2Yobm93KS80KTsKIAlhZGRfZW50cm9weV93b3JkcyhyLCAoX191MzIgKil1dHNuYW1lKCksCiAJCQkgIHNpemVvZigqKHV0c25hbWUoKSkpLzQpOwogfQpAQCAtOTExLDE0ICs5MTEsMTIgQEAKIAkJcmV0dXJuOwogCiAJLyoKLQkgKiBJZiBrbWFsbG9jIHJldHVybnMgbnVsbCwgd2UganVzdCB3b24ndCB1c2UgdGhhdCBlbnRyb3B5CisJICogSWYga3phbGxvYyByZXR1cm5zIG51bGwsIHdlIGp1c3Qgd29uJ3QgdXNlIHRoYXQgZW50cm9weQogCSAqIHNvdXJjZS4KIAkgKi8KLQlzdGF0ZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB0aW1lcl9yYW5kX3N0YXRlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHN0YXRlKSB7Ci0JCW1lbXNldChzdGF0ZSwgMCwgc2l6ZW9mKHN0cnVjdCB0aW1lcl9yYW5kX3N0YXRlKSk7CisJc3RhdGUgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdGltZXJfcmFuZF9zdGF0ZSksIEdGUF9LRVJORUwpOworCWlmIChzdGF0ZSkKIAkJaXJxX3RpbWVyX3N0YXRlW2lycV0gPSBzdGF0ZTsKLQl9CiB9CiAKICNpZmRlZiBDT05GSUdfQkxPQ0sKQEAgLTkyNywxNCArOTI1LDEyIEBACiAJc3RydWN0IHRpbWVyX3JhbmRfc3RhdGUgKnN0YXRlOwogCiAJLyoKLQkgKiBJZiBrbWFsbG9jIHJldHVybnMgbnVsbCwgd2UganVzdCB3b24ndCB1c2UgdGhhdCBlbnRyb3B5CisJICogSWYga3phbGxvYyByZXR1cm5zIG51bGwsIHdlIGp1c3Qgd29uJ3QgdXNlIHRoYXQgZW50cm9weQogCSAqIHNvdXJjZS4KIAkgKi8KLQlzdGF0ZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB0aW1lcl9yYW5kX3N0YXRlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHN0YXRlKSB7Ci0JCW1lbXNldChzdGF0ZSwgMCwgc2l6ZW9mKHN0cnVjdCB0aW1lcl9yYW5kX3N0YXRlKSk7CisJc3RhdGUgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdGltZXJfcmFuZF9zdGF0ZSksIEdGUF9LRVJORUwpOworCWlmIChzdGF0ZSkKIAkJZGlzay0+cmFuZG9tID0gc3RhdGU7Ci0JfQogfQogI2VuZGlmCiAKQEAgLTE0NjksNyArMTQ2NSw2IEBACiBfX3UzMiBzZWN1cmVfdGNwdjZfc2VxdWVuY2VfbnVtYmVyKF9fYmUzMiAqc2FkZHIsIF9fYmUzMiAqZGFkZHIsCiAJCQkJICAgX19iZTE2IHNwb3J0LCBfX2JlMTYgZHBvcnQpCiB7Ci0Jc3RydWN0IHRpbWV2YWwgdHY7CiAJX191MzIgc2VxOwogCV9fdTMyIGhhc2hbMTJdOwogCXN0cnVjdCBrZXlkYXRhICprZXlwdHIgPSBnZXRfa2V5cHRyKCk7CkBAIC0xNDg1LDggKzE0ODAsNyBAQAogCXNlcSA9IHR3b3RoaXJkc01ENFRyYW5zZm9ybSgoY29uc3QgX191MzIgKilkYWRkciwgaGFzaCkgJiBIQVNIX01BU0s7CiAJc2VxICs9IGtleXB0ci0+Y291bnQ7CiAKLQlkb19nZXR0aW1lb2ZkYXkoJnR2KTsKLQlzZXEgKz0gdHYudHZfdXNlYyArIHR2LnR2X3NlYyAqIDEwMDAwMDA7CisJc2VxICs9IGt0aW1lX2dldF9yZWFsKCkudHY2NDsKIAogCXJldHVybiBzZXE7CiB9CkBAIC0xNTIxLDcgKzE1MTUsNiBAQAogX191MzIgc2VjdXJlX3RjcF9zZXF1ZW5jZV9udW1iZXIoX19iZTMyIHNhZGRyLCBfX2JlMzIgZGFkZHIsCiAJCQkJIF9fYmUxNiBzcG9ydCwgX19iZTE2IGRwb3J0KQogewotCXN0cnVjdCB0aW1ldmFsIHR2OwogCV9fdTMyIHNlcTsKIAlfX3UzMiBoYXNoWzRdOwogCXN0cnVjdCBrZXlkYXRhICprZXlwdHIgPSBnZXRfa2V5cHRyKCk7CkBAIC0xNTQzLDEyICsxNTM2LDExIEBACiAJICoJQXMgY2xvc2UgYXMgcG9zc2libGUgdG8gUkZDIDc5Mywgd2hpY2gKIAkgKglzdWdnZXN0cyB1c2luZyBhIDI1MCBrSHogY2xvY2suCiAJICoJRnVydGhlciByZWFkaW5nIHNob3dzIHRoaXMgYXNzdW1lcyAyIE1iL3MgbmV0d29ya3MuCi0JICoJRm9yIDEwIE1iL3MgRXRoZXJuZXQsIGEgMSBNSHogY2xvY2sgaXMgYXBwcm9wcmlhdGUuCisJICoJRm9yIDEwIEdiL3MgRXRoZXJuZXQsIGEgMSBHSHogY2xvY2sgaXMgYXBwcm9wcmlhdGUuCiAJICoJVGhhdCdzIGZ1bm55LCBMaW51eCBoYXMgb25lIGJ1aWx0IGluISAgVXNlIGl0IQogCSAqCShOZXR3b3JrcyBhcmUgZmFzdGVyIG5vdyAtIHNob3VsZCB0aGlzIGJlIGluY3JlYXNlZD8pCiAJICovCi0JZG9fZ2V0dGltZW9mZGF5KCZ0dik7Ci0Jc2VxICs9IHR2LnR2X3VzZWMgKyB0di50dl9zZWMgKiAxMDAwMDAwOworCXNlcSArPSBrdGltZV9nZXRfcmVhbCgpLnR2NjQ7CiAjaWYgMAogCXByaW50aygiaW5pdF9zZXEoJWx4LCAlbHgsICVkLCAlZCkgPSAlZFxuIiwKIAkgICAgICAgc2FkZHIsIGRhZGRyLCBzcG9ydCwgZHBvcnQsIHNlcSk7CkBAIC0xNTU2LDggKzE1NDgsNiBAQAogCXJldHVybiBzZXE7CiB9CiAKLUVYUE9SVF9TWU1CT0woc2VjdXJlX3RjcF9zZXF1ZW5jZV9udW1iZXIpOwotCiAvKiBHZW5lcmF0ZSBzZWN1cmUgc3RhcnRpbmcgcG9pbnQgZm9yIGVwaGVtZXJhbCBJUFY0IHRyYW5zcG9ydCBwb3J0IHNlYXJjaCAqLwogdTMyIHNlY3VyZV9pcHY0X3BvcnRfZXBoZW1lcmFsKF9fYmUzMiBzYWRkciwgX19iZTMyIGRhZGRyLCBfX2JlMTYgZHBvcnQpCiB7CkBAIC0xNTk4LDcgKzE1ODgsNiBAQAogdTY0IHNlY3VyZV9kY2NwX3NlcXVlbmNlX251bWJlcihfX2JlMzIgc2FkZHIsIF9fYmUzMiBkYWRkciwKIAkJCQlfX2JlMTYgc3BvcnQsIF9fYmUxNiBkcG9ydCkKIHsKLQlzdHJ1Y3QgdGltZXZhbCB0djsKIAl1NjQgc2VxOwogCV9fdTMyIGhhc2hbNF07CiAJc3RydWN0IGtleWRhdGEgKmtleXB0ciA9IGdldF9rZXlwdHIoKTsKQEAgLTE2MTEsOCArMTYwMCw3IEBACiAJc2VxID0gaGFsZl9tZDRfdHJhbnNmb3JtKGhhc2gsIGtleXB0ci0+c2VjcmV0KTsKIAlzZXEgfD0gKCh1NjQpa2V5cHRyLT5jb3VudCkgPDwgKDMyIC0gSEFTSF9CSVRTKTsKIAotCWRvX2dldHRpbWVvZmRheSgmdHYpOwotCXNlcSArPSB0di50dl91c2VjICsgdHYudHZfc2VjICogMTAwMDAwMDsKKwlzZXEgKz0ga3RpbWVfZ2V0X3JlYWwoKS50djY0OwogCXNlcSAmPSAoMXVsbCA8PCA0OCkgLSAxOwogI2lmIDAKIAlwcmludGsoImRjY3AgaW5pdF9zZXEoJWx4LCAlbHgsICVkLCAlZCkgPSAlZFxuIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9zb255cGkuYyBiL2RyaXZlcnMvY2hhci9zb255cGkuYwppbmRleCA3ODIzNzU3Li4zZWY1OTNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvc29ueXBpLmMKKysrIGIvZHJpdmVycy9jaGFyL3NvbnlwaS5jCkBAIC0xLDYgKzEsOCBAQAogLyoKICAqIFNvbnkgUHJvZ3JhbW1hYmxlIEkvTyBDb250cm9sIERldmljZSBkcml2ZXIgZm9yIFZBSU8KICAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWF0dGlhIERvbmdpbGkgPG1hbGF0dGlhQGxpbnV4Lml0PgorICoKICAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA1IFN0ZWxpYW4gUG9wIDxzdGVsaWFuQHBvcGllcy5uZXQ+CiAgKgogICogQ29weXJpZ2h0IChDKSAyMDA1IE5hcmF5YW5hbiBSIFMgPG5hcnNAa2FkYW1iYS5vcmc+CkBAIC05NSw2ICs5NywxMSBAQAogTU9EVUxFX1BBUk1fREVTQyh1c2VpbnB1dCwKIAkJICJzZXQgdGhpcyBpZiB5b3Ugd291bGQgbGlrZSBzb255cGkgdG8gZmVlZCBldmVudHMgdG8gdGhlIGlucHV0IHN1YnN5c3RlbSIpOwogCitzdGF0aWMgaW50IGNoZWNrX2lvcG9ydCA9IDE7Cittb2R1bGVfcGFyYW0oY2hlY2tfaW9wb3J0LCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhjaGVja19pb3BvcnQsCisJCSAic2V0IHRoaXMgdG8gMCBpZiB5b3UgdGhpbmsgdGhlIGF1dG9tYXRpYyBpb3BvcnQgY2hlY2sgZm9yIHNvbnktbGFwdG9wIGlzIHdyb25nIik7CisKICNkZWZpbmUgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMQkxCiAjZGVmaW5lIFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTIJMgogI2RlZmluZSBTT05ZUElfREVWSUNFX01PREVMX1RZUEUzCTMKQEAgLTQ3Nyw3ICs0ODQsNyBAQAogCXUxNiBldnR5cGVfb2Zmc2V0OwogCWludCBjYW1lcmFfcG93ZXI7CiAJaW50IGJsdWV0b290aF9wb3dlcjsKLQlzdHJ1Y3Qgc2VtYXBob3JlIGxvY2s7CisJc3RydWN0IG11dGV4IGxvY2s7CiAJc3RydWN0IGtmaWZvICpmaWZvOwogCXNwaW5sb2NrX3QgZmlmb19sb2NrOwogCXdhaXRfcXVldWVfaGVhZF90IGZpZm9fcHJvY19saXN0OwpAQCAtODg0LDcgKzg5MSw3IEBACiAJaWYgKCFjYW1lcmEpCiAJCXJldHVybiAtRUlPOwogCi0JZG93bigmc29ueXBpX2RldmljZS5sb2NrKTsKKwltdXRleF9sb2NrKCZzb255cGlfZGV2aWNlLmxvY2spOwogCiAJc3dpdGNoIChjb21tYW5kKSB7CiAJY2FzZSBTT05ZUElfQ09NTUFORF9TRVRDQU1FUkE6CkBAIC05MTksNyArOTI2LDcgQEAKIAkJICAgICAgIGNvbW1hbmQpOwogCQlicmVhazsKIAl9Ci0JdXAoJnNvbnlwaV9kZXZpY2UubG9jayk7CisJbXV0ZXhfdW5sb2NrKCZzb255cGlfZGV2aWNlLmxvY2spOwogCXJldHVybiAwOwogfQogCkBAIC05MzgsMjAgKzk0NSwyMCBAQAogc3RhdGljIGludCBzb255cGlfbWlzY19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewogCXNvbnlwaV9taXNjX2Zhc3luYygtMSwgZmlsZSwgMCk7Ci0JZG93bigmc29ueXBpX2RldmljZS5sb2NrKTsKKwltdXRleF9sb2NrKCZzb255cGlfZGV2aWNlLmxvY2spOwogCXNvbnlwaV9kZXZpY2Uub3Blbl9jb3VudC0tOwotCXVwKCZzb255cGlfZGV2aWNlLmxvY2spOworCW11dGV4X3VubG9jaygmc29ueXBpX2RldmljZS5sb2NrKTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBzb255cGlfbWlzY19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewotCWRvd24oJnNvbnlwaV9kZXZpY2UubG9jayk7CisJbXV0ZXhfbG9jaygmc29ueXBpX2RldmljZS5sb2NrKTsKIAkvKiBGbHVzaCBpbnB1dCBxdWV1ZSBvbiBmaXJzdCBvcGVuICovCiAJaWYgKCFzb255cGlfZGV2aWNlLm9wZW5fY291bnQpCiAJCWtmaWZvX3Jlc2V0KHNvbnlwaV9kZXZpY2UuZmlmbyk7CiAJc29ueXBpX2RldmljZS5vcGVuX2NvdW50Kys7Ci0JdXAoJnNvbnlwaV9kZXZpY2UubG9jayk7CisJbXV0ZXhfdW5sb2NrKCZzb255cGlfZGV2aWNlLmxvY2spOwogCXJldHVybiAwOwogfQogCkBAIC0xMDAxLDcgKzEwMDgsNyBAQAogCXU4IHZhbDg7CiAJdTE2IHZhbDE2OwogCi0JZG93bigmc29ueXBpX2RldmljZS5sb2NrKTsKKwltdXRleF9sb2NrKCZzb255cGlfZGV2aWNlLmxvY2spOwogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBTT05ZUElfSU9DR0JSVDoKIAkJaWYgKHNvbnlwaV9lY19yZWFkKFNPTllQSV9MQ0RfTElHSFQsICZ2YWw4KSkgewpAQCAtMTEwMSw3ICsxMTA4LDcgQEAKIAlkZWZhdWx0OgogCQlyZXQgPSAtRUlOVkFMOwogCX0KLQl1cCgmc29ueXBpX2RldmljZS5sb2NrKTsKKwltdXRleF91bmxvY2soJnNvbnlwaV9kZXZpY2UubG9jayk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTI2MCw2ICsxMjY3LDI4IEBACiBzdGF0aWMgaW50IF9fZGV2aW5pdCBzb255cGlfc2V0dXBfaW9wb3J0cyhzdHJ1Y3Qgc29ueXBpX2RldmljZSAqZGV2LAogCQkJCWNvbnN0IHN0cnVjdCBzb255cGlfaW9wb3J0X2xpc3QgKmlvcG9ydF9saXN0KQogeworCS8qIHRyeSB0byBkZXRlY3QgaWYgc29ueS1sYXB0b3AgaXMgYmVpbmcgdXNlZCBhbmQgdGh1cworCSAqIGhhcyBhbHJlYWR5IHJlcXVlc3RlZCBvbmUgb2YgdGhlIGtub3duIGlvcG9ydHMuCisJICogQXMgaW4gdGhlIGRlcHJlY2F0ZWQgY2hlY2tfcmVnaW9uIHRoaXMgaXMgcmFjeSBoYXMgd2UgaGF2ZQorCSAqIG11bHRpcGxlIGlvcG9ydHMgYXZhaWxhYmxlIGFuZCBvbmUgb2YgdGhlbSBjYW4gYmUgcmVxdWVzdGVkCisJICogYmV0d2VlbiB0aGlzIGNoZWNrIGFuZCB0aGUgc3Vic2VxdWVudCByZXF1ZXN0LiBBbnl3YXksIGFzIGFuCisJICogYXR0ZW1wdCB0byBiZSBzb21lIG1vcmUgdXNlci1mcmllbmRseSBhcyB3ZSBjdXJyZW50bHkgYXJlLAorCSAqIHRoaXMgaXMgZW5vdWdoLgorCSAqLworCWNvbnN0IHN0cnVjdCBzb255cGlfaW9wb3J0X2xpc3QgKmNoZWNrID0gaW9wb3J0X2xpc3Q7CisJd2hpbGUgKGNoZWNrX2lvcG9ydCAmJiBjaGVjay0+cG9ydDEpIHsKKwkJaWYgKCFyZXF1ZXN0X3JlZ2lvbihjaGVjay0+cG9ydDEsCisJCQkJICAgc29ueXBpX2RldmljZS5yZWdpb25fc2l6ZSwKKwkJCQkgICAiU29ueSBQcm9ncmFtYWJsZSBJL08gRGV2aWNlIENoZWNrIikpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAic29ueXBpOiBpb3BvcnQgMHglLjR4IGJ1c3ksIHVzaW5nIHNvbnktbGFwdG9wPyAiCisJCQkJCSJpZiBub3QgdXNlIGNoZWNrX2lvcG9ydD0wXG4iLAorCQkJCQljaGVjay0+cG9ydDEpOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCQlyZWxlYXNlX3JlZ2lvbihjaGVjay0+cG9ydDEsIHNvbnlwaV9kZXZpY2UucmVnaW9uX3NpemUpOworCQljaGVjaysrOworCX0KKwogCXdoaWxlIChpb3BvcnRfbGlzdC0+cG9ydDEpIHsKIAogCQlpZiAocmVxdWVzdF9yZWdpb24oaW9wb3J0X2xpc3QtPnBvcnQxLApAQCAtMTMyMSw2ICsxMzUwLDEwIEBACiAJc3RydWN0IHBjaV9kZXYgKnBjaWRldjsKIAlpbnQgZXJyb3I7CiAKKwlwcmludGsoS0VSTl9XQVJOSU5HICJzb255cGk6IHBsZWFzZSB0cnkgdGhlIHNvbnktbGFwdG9wIG1vZHVsZSBpbnN0ZWFkICIKKwkJCSJhbmQgcmVwb3J0IGZhaWx1cmVzLCBzZWUgYWxzbyAiCisJCQkiaHR0cDovL3d3dy5saW51eC5pdC9+bWFsYXR0aWEvd2lraS9pbmRleC5waHAvU29ueV9kcml2ZXJzXG4iKTsKKwogCXNwaW5fbG9ja19pbml0KCZzb255cGlfZGV2aWNlLmZpZm9fbG9jayk7CiAJc29ueXBpX2RldmljZS5maWZvID0ga2ZpZm9fYWxsb2MoU09OWVBJX0JVRl9TSVpFLCBHRlBfS0VSTkVMLAogCQkJCQkgJnNvbnlwaV9kZXZpY2UuZmlmb19sb2NrKTsKQEAgLTEzMzAsNyArMTM2Myw3IEBACiAJfQogCiAJaW5pdF93YWl0cXVldWVfaGVhZCgmc29ueXBpX2RldmljZS5maWZvX3Byb2NfbGlzdCk7Ci0JaW5pdF9NVVRFWCgmc29ueXBpX2RldmljZS5sb2NrKTsKKwltdXRleF9pbml0KCZzb255cGlfZGV2aWNlLmxvY2spOwogCXNvbnlwaV9kZXZpY2UuYmx1ZXRvb3RoX3Bvd2VyID0gLTE7CiAKIAlpZiAoKHBjaWRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfSU5URUwsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdHBtL3RwbV9hdG1lbC5oIGIvZHJpdmVycy9jaGFyL3RwbS90cG1fYXRtZWwuaAppbmRleCBhZWZkNjgzLi4zYzg1MjAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvdHBtL3RwbV9hdG1lbC5oCisrKyBiL2RyaXZlcnMvY2hhci90cG0vdHBtX2F0bWVsLmgKQEAgLTUzLDggKzUzLDggQEAKIAl9CiAKIAlyZWcgPSBnZXRfcHJvcGVydHkoZG4sICJyZWciLCAmcmVnbGVuKTsKLQluYWRkcmMgPSBwcm9tX25fYWRkcl9jZWxscyhkbik7Ci0JbnNpemVjID0gcHJvbV9uX3NpemVfY2VsbHMoZG4pOworCW5hZGRyYyA9IG9mX25fYWRkcl9jZWxscyhkbik7CisJbnNpemVjID0gb2Zfbl9zaXplX2NlbGxzKGRuKTsKIAogCW9mX25vZGVfcHV0KGRuKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3dhdGNoZG9nL0tjb25maWcgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvS2NvbmZpZwppbmRleCBlODEyYWExLi42MDE5OGE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvS2NvbmZpZworKysgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvS2NvbmZpZwpAQCAtNTQ4LDcgKzU0OCw3IEBACiAJZGVwZW5kcyBvbiBXQVRDSERPRyAmJiBNVjY0WDYwCiAKIGNvbmZpZyBCT09LRV9XRFQKLQl0cmlzdGF0ZSAiUG93ZXJQQyBCb29rLUUgV2F0Y2hkb2cgVGltZXIiCisJYm9vbCAiUG93ZXJQQyBCb29rLUUgV2F0Y2hkb2cgVGltZXIiCiAJZGVwZW5kcyBvbiBXQVRDSERPRyAmJiAoQk9PS0UgfHwgNHh4KQogCS0tLWhlbHAtLS0KIAkgIFBsZWFzZSBzZWUgRG9jdW1lbnRhdGlvbi93YXRjaGRvZy93YXRjaGRvZy1hcGkudHh0IGZvcgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbG9ja3NvdXJjZS9hY3BpX3BtLmMgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL2FjcGlfcG0uYwppbmRleCA1YWMzMDllLi41Y2ZjZmY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsb2Nrc291cmNlL2FjcGlfcG0uYworKysgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL2FjcGlfcG0uYwpAQCAtMjYsNyArMjYsNyBAQAogLyoKICAqIFRoZSBJL08gcG9ydCB0aGUgUE1UTVIgcmVzaWRlcyBhdC4KICAqIFRoZSBsb2NhdGlvbiBpcyBkZXRlY3RlZCBkdXJpbmcgc2V0dXBfYXJjaCgpLAotICogaW4gYXJjaC9pMzg2L2FjcGkvYm9vdC5jCisgKiBpbiBhcmNoL2kzODYva2VybmVsL2FjcGkvYm9vdC5jCiAgKi8KIHUzMiBwbXRtcl9pb3BvcnQgX19yZWFkX21vc3RseTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jb25uZWN0b3IvY29ubmVjdG9yLmMgYi9kcml2ZXJzL2Nvbm5lY3Rvci9jb25uZWN0b3IuYwppbmRleCBhOTA1Zjc4Li5hN2I5ZTliIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nvbm5lY3Rvci9jb25uZWN0b3IuYworKysgYi9kcml2ZXJzL2Nvbm5lY3Rvci9jb25uZWN0b3IuYwpAQCAtMjEyLDcgKzIxMiw3IEBACiAJc2tiID0gc2tiX2dldChfX3NrYik7CiAKIAlpZiAoc2tiLT5sZW4gPj0gTkxNU0dfU1BBQ0UoMCkpIHsKLQkJbmxoID0gKHN0cnVjdCBubG1zZ2hkciAqKXNrYi0+ZGF0YTsKKwkJbmxoID0gbmxtc2dfaGRyKHNrYik7CiAKIAkJaWYgKG5saC0+bmxtc2dfbGVuIDwgc2l6ZW9mKHN0cnVjdCBjbl9tc2cpIHx8CiAJCSAgICBza2ItPmxlbiA8IG5saC0+bmxtc2dfbGVuIHx8CkBAIC00NDgsNyArNDQ4LDcgQEAKIAogCWRldi0+bmxzID0gbmV0bGlua19rZXJuZWxfY3JlYXRlKE5FVExJTktfQ09OTkVDVE9SLAogCQkJCQkgQ05fTkVUTElOS19VU0VSUyArIDB4ZiwKLQkJCQkJIGRldi0+aW5wdXQsIFRISVNfTU9EVUxFKTsKKwkJCQkJIGRldi0+aW5wdXQsIE5VTEwsIFRISVNfTU9EVUxFKTsKIAlpZiAoIWRldi0+bmxzKQogCQlyZXR1cm4gLUVJTzsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvS2NvbmZpZyBiL2RyaXZlcnMvaGlkL0tjb25maWcKaW5kZXggODUwNzg4Zi4uOGZiZTlmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvS2NvbmZpZworKysgYi9kcml2ZXJzL2hpZC9LY29uZmlnCkBAIC0zNiw1ICszNiw3IEBACiAKIAlJZiB1bnN1cmUsIHNheSBOCiAKK3NvdXJjZSAiZHJpdmVycy9oaWQvdXNiaGlkL0tjb25maWciCisKIGVuZG1lbnUKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvTWFrZWZpbGUgYi9kcml2ZXJzL2hpZC9NYWtlZmlsZQppbmRleCA1MmU5N2Q4Li42OGQxMzc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2hpZC9NYWtlZmlsZQpAQCAtNiwzICs2LDcgQEAKIG9iai0kKENPTkZJR19ISUQpCQkrPSBoaWQubwogaGlkLSQoQ09ORklHX0hJRF9ERUJVRykJCSs9IGhpZC1kZWJ1Zy5vCiAKK29iai0kKENPTkZJR19VU0JfSElEKQkJKz0gdXNiaGlkLworb2JqLSQoQ09ORklHX1VTQl9NT1VTRSkJCSs9IHVzYmhpZC8KK29iai0kKENPTkZJR19VU0JfS0JEKQkJKz0gdXNiaGlkLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtY29yZS5jIGIvZHJpdmVycy9oaWQvaGlkLWNvcmUuYwppbmRleCAxY2NhMzJmLi42MmUyMWNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtY29yZS5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1jb3JlLmMKQEAgLTQsNyArNCw3IEBACiAgKiAgQ29weXJpZ2h0IChjKSAxOTk5IEFuZHJlYXMgR2FsCiAgKiAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgVm9qdGVjaCBQYXZsaWsgPHZvanRlY2hAc3VzZS5jej4KICAqICBDb3B5cmlnaHQgKGMpIDIwMDUgTWljaGFlbCBIYWJvdXN0YWsgPG1pa2UtQGNpbmNpLnJyLmNvbT4gZm9yIENvbmNlcHQyLCBJbmMKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDYgSmlyaSBLb3NpbmEKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBKaXJpIEtvc2luYQogICovCiAKIC8qCkBAIC0zNyw3ICszNyw3IEBACiAgKi8KIAogI2RlZmluZSBEUklWRVJfVkVSU0lPTiAidjIuNiIKLSNkZWZpbmUgRFJJVkVSX0FVVEhPUiAiQW5kcmVhcyBHYWwsIFZvanRlY2ggUGF2bGlrIgorI2RlZmluZSBEUklWRVJfQVVUSE9SICJBbmRyZWFzIEdhbCwgVm9qdGVjaCBQYXZsaWssIEppcmkgS29zaW5hIgogI2RlZmluZSBEUklWRVJfREVTQyAiSElEIGNvcmUgZHJpdmVyIgogI2RlZmluZSBEUklWRVJfTElDRU5TRSAiR1BMIgogCkBAIC04NzIsOCArODcyLDEzIEBACiAJdW5zaWduZWQgY291bnQgPSBmaWVsZC0+cmVwb3J0X2NvdW50OwogCXVuc2lnbmVkIG9mZnNldCA9IGZpZWxkLT5yZXBvcnRfb2Zmc2V0OwogCXVuc2lnbmVkIHNpemUgPSBmaWVsZC0+cmVwb3J0X3NpemU7CisJdW5zaWduZWQgYml0c3VzZWQgPSBvZmZzZXQgKyBjb3VudCAqIHNpemU7CiAJdW5zaWduZWQgbjsKIAorCS8qIG1ha2Ugc3VyZSB0aGUgdW51c2VkIGJpdHMgaW4gdGhlIGxhc3QgYnl0ZSBhcmUgemVyb3MgKi8KKwlpZiAoY291bnQgPiAwICYmIHNpemUgPiAwICYmIChiaXRzdXNlZCAlIDgpICE9IDApCisJCWRhdGFbKGJpdHN1c2VkLTEpLzhdICY9ICgxIDw8IChiaXRzdXNlZCAlIDgpKSAtIDE7CisKIAlmb3IgKG4gPSAwOyBuIDwgY291bnQ7IG4rKykgewogCQlpZiAoZmllbGQtPmxvZ2ljYWxfbWluaW11bSA8IDApCS8qIHNpZ25lZCB2YWx1ZXMgKi8KIAkJCWltcGxlbWVudChkYXRhLCBvZmZzZXQgKyBuICogc2l6ZSwgc2l6ZSwgczMydG9uKGZpZWxkLT52YWx1ZVtuXSwgc2l6ZSkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLWlucHV0LmMgYi9kcml2ZXJzL2hpZC9oaWQtaW5wdXQuYwppbmRleCBjODQzNDAyLi5hMTliNjVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtaW5wdXQuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtaW5wdXQuYwpAQCAtNDMxLDYgKzQzMSwxNSBAQAogCQkJCWNhc2UgMHgwMDA6IGdvdG8gaWdub3JlOwogCQkJCWNhc2UgMHgwMzQ6IG1hcF9rZXlfY2xlYXIoS0VZX1NMRUVQKTsJCWJyZWFrOwogCQkJCWNhc2UgMHgwMzY6IG1hcF9rZXlfY2xlYXIoQlROX01JU0MpOwkJYnJlYWs7CisJCQkJLyoKKwkJCQkgKiBUaGUgbmV4dCB0aHJlZSBhcmUgcmVwb3J0ZWQgYnkgQmVsa2luIHdpcmVsZXNzCisJCQkJICoga2V5Ym9hcmQgKDEwMjA6MDAwNikuIFRoZXNlIHZhbHVlcyBhcmUgInJlc2VydmVkIgorCQkJCSAqIGluIEhVVCAxLjEyLgorCQkJCSAqLworCQkJCWNhc2UgMHgwM2E6IG1hcF9rZXlfY2xlYXIoS0VZX1NPVU5EKTsgICAgICAgICAgIGJyZWFrOworCQkJCWNhc2UgMHgwM2I6IG1hcF9rZXlfY2xlYXIoS0VZX0NBTUVSQSk7ICAgICAgICAgIGJyZWFrOworCQkJCWNhc2UgMHgwM2M6IG1hcF9rZXlfY2xlYXIoS0VZX0RPQ1VNRU5UUyk7ICAgICAgIGJyZWFrOworCiAJCQkJY2FzZSAweDA0MDogbWFwX2tleV9jbGVhcihLRVlfTUVOVSk7CQlicmVhazsKIAkJCQljYXNlIDB4MDQ1OiBtYXBfa2V5X2NsZWFyKEtFWV9SQURJTyk7CQlicmVhazsKIApAQCAtNTMxLDEwICs1NDAsMjYgQEAKIAkJCQljYXNlIDB4MzAyOiBtYXBfa2V5X2NsZWFyKEtFWV9QUk9HMik7CQlicmVhazsKIAkJCQljYXNlIDB4MzAzOiBtYXBfa2V5X2NsZWFyKEtFWV9QUk9HMyk7CQlicmVhazsKIAotCQkJCS8qIFJlcG9ydGVkIG9uIExvZ2l0ZWNoIFM1MTAgd2lyZWxlc3Mga2V5Ym9hcmQgKi8KKwkJCQkvKiBSZXBvcnRlZCBvbiBjZXJ0YWluIExvZ2l0ZWNoIHdpcmVsZXNzIGtleWJvYXJkcyAqLworCQkJCWNhc2UgMHgxMDAxOiBtYXBfa2V5X2NsZWFyKEtFWV9NRVNTRU5HRVIpOwlicmVhazsKKwkJCQljYXNlIDB4MTAwMzogbWFwX2tleV9jbGVhcihLRVlfU09VTkQpOwkJYnJlYWs7CisJCQkJY2FzZSAweDEwMDQ6IG1hcF9rZXlfY2xlYXIoS0VZX1ZJREVPKTsJCWJyZWFrOworCQkJCWNhc2UgMHgxMDA1OiBtYXBfa2V5X2NsZWFyKEtFWV9BVURJTyk7CQlicmVhazsKKwkJCQljYXNlIDB4MTAwYTogbWFwX2tleV9jbGVhcihLRVlfRE9DVU1FTlRTKTsJYnJlYWs7CisJCQkJY2FzZSAweDEwMTE6IG1hcF9rZXlfY2xlYXIoS0VZX1BSRVZJT1VTU09ORyk7CWJyZWFrOworCQkJCWNhc2UgMHgxMDEyOiBtYXBfa2V5X2NsZWFyKEtFWV9ORVhUU09ORyk7CWJyZWFrOworCQkJCWNhc2UgMHgxMDEzOiBtYXBfa2V5X2NsZWFyKEtFWV9DQU1FUkEpOwkJYnJlYWs7CisJCQkJY2FzZSAweDEwMTQ6IG1hcF9rZXlfY2xlYXIoS0VZX01FU1NFTkdFUik7CWJyZWFrOworCQkJCWNhc2UgMHgxMDE1OiBtYXBfa2V5X2NsZWFyKEtFWV9SRUNPUkQpOwkJYnJlYWs7CisJCQkJY2FzZSAweDEwMTY6IG1hcF9rZXlfY2xlYXIoS0VZX1BMQVlFUik7CQlicmVhazsKKwkJCQljYXNlIDB4MTAxNzogbWFwX2tleV9jbGVhcihLRVlfRUpFQ1RDRCk7CWJyZWFrOworCQkJCWNhc2UgMHgxMDE5OiBtYXBfa2V5X2NsZWFyKEtFWV9QUk9HMSk7CQlicmVhazsKKwkJCQljYXNlIDB4MTAxYTogbWFwX2tleV9jbGVhcihLRVlfUFJPRzIpOwkJYnJlYWs7CisJCQkJY2FzZSAweDEwMWI6IG1hcF9rZXlfY2xlYXIoS0VZX1BST0czKTsJCWJyZWFrOwogCQkJCWNhc2UgMHgxMDFmOiBtYXBfa2V5X2NsZWFyKEtFWV9aT09NSU4pOwkJYnJlYWs7CiAJCQkJY2FzZSAweDEwMjA6IG1hcF9rZXlfY2xlYXIoS0VZX1pPT01PVVQpOwlicmVhazsKIAkJCQljYXNlIDB4MTAyMTogbWFwX2tleV9jbGVhcihLRVlfWk9PTVJFU0VUKTsJYnJlYWs7CisJCQkJY2FzZSAweDEwMjM6IG1hcF9rZXlfY2xlYXIoS0VZX0NMT1NFKTsJCWJyZWFrOwogCQkJCS8qIHRoaXMgb25lIGlzIG1hcmtlZCBhcyAnUm90YXRlJyAqLwogCQkJCWNhc2UgMHgxMDI4OiBtYXBfa2V5X2NsZWFyKEtFWV9BTkdMRSk7CQlicmVhazsKIAkJCQljYXNlIDB4MTAyOTogbWFwX2tleV9jbGVhcihLRVlfU0hVRkZMRSk7CWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvdXNiaGlkL0tjb25maWcgYi9kcml2ZXJzL2hpZC91c2JoaWQvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Yzg3YmRjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9oaWQvdXNiaGlkL0tjb25maWcKQEAgLTAsMCArMSwxNDkgQEAKK2NvbW1lbnQgIlVTQiBJbnB1dCBEZXZpY2VzIgorCWRlcGVuZHMgb24gVVNCCisKK2NvbmZpZyBVU0JfSElECisJdHJpc3RhdGUgIlVTQiBIdW1hbiBJbnRlcmZhY2UgRGV2aWNlIChmdWxsIEhJRCkgc3VwcG9ydCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFVTQiAmJiBJTlBVVAorCXNlbGVjdCBISUQKKwktLS1oZWxwLS0tCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IGZ1bGwgSElEIHN1cHBvcnQgdG8gY29ubmVjdCBVU0Iga2V5Ym9hcmRzLAorCSAgbWljZSwgam95c3RpY2tzLCBncmFwaGljIHRhYmxldHMsIG9yIGFueSBvdGhlciBISUQgYmFzZWQgZGV2aWNlcworCSAgdG8geW91ciBjb21wdXRlciB2aWEgVVNCLCBhcyB3ZWxsIGFzIFVuaW50ZXJydXB0aWJsZSBQb3dlciBTdXBwbHkKKwkgIChVUFMpIGFuZCBtb25pdG9yIGNvbnRyb2wgZGV2aWNlcy4KKworCSAgWW91IGNhbid0IHVzZSB0aGlzIGRyaXZlciBhbmQgdGhlIEhJREJQIChCb290IFByb3RvY29sKSBrZXlib2FyZAorCSAgYW5kIG1vdXNlIGRyaXZlcnMgYXQgdGhlIHNhbWUgdGltZS4gTW9yZSBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGU6CisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL2lucHV0L2lucHV0LnR4dD4uCisKKwkgIElmIHVuc3VyZSwgc2F5IFkuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHVzYmhpZC4KKworY29tbWVudCAiSW5wdXQgY29yZSBzdXBwb3J0IGlzIG5lZWRlZCBmb3IgVVNCIEhJRCBpbnB1dCBsYXllciBvciBISURCUCBzdXBwb3J0IgorCWRlcGVuZHMgb24gVVNCX0hJRCAmJiBJTlBVVD1uCisKK2NvbmZpZyBVU0JfSElESU5QVVRfUE9XRVJCT09LCisJYm9vbCAiRW5hYmxlIHN1cHBvcnQgZm9yIGlCb29rL1Bvd2VyQm9vayBzcGVjaWFsIGtleXMiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBVU0JfSElECisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCBzdXBwb3J0IGZvciB0aGUgc3BlY2lhbCBrZXlzIChGbiwgTnVtbG9jaykgb24KKwkgIEFwcGxlIGlCb29rcyBhbmQgUG93ZXJCb29rcy4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIEhJRF9GRgorCWJvb2wgIkZvcmNlIGZlZWRiYWNrIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBVU0JfSElEICYmIEVYUEVSSU1FTlRBTAorCWhlbHAKKwkgIFNheSBZIGhlcmUgaXMgeW91IHdhbnQgZm9yY2UgZmVlZGJhY2sgc3VwcG9ydCBmb3IgYSBmZXcgSElEIGRldmljZXMuCisJICBTZWUgYmVsb3cgZm9yIGEgbGlzdCBvZiBzdXBwb3J0ZWQgZGV2aWNlcy4KKworCSAgU2VlIDxmaWxlOkRvY3VtZW50YXRpb24vaW5wdXQvZmYudHh0PiBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgZm9yY2UKKwkgIGZlZWRiYWNrIEFQSS4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIEhJRF9QSUQKKwlib29sICJQSUQgZGV2aWNlIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBISURfRkYKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIGEgUElELWNvbXBsaWFudCBkZXZpY2UgYW5kIHdpc2ggdG8gZW5hYmxlIGZvcmNlCisJICBmZWVkYmFjayBmb3IgaXQuIE1pY3Jvc29mdCBTaWRld2luZGVyIEZvcmNlIEZlZWRiYWNrIDIgaXMgb25lIG9mIHN1Y2gKKwkgIGRldmljZXMuCisKK2NvbmZpZyBMT0dJVEVDSF9GRgorCWJvb2wgIkxvZ2l0ZWNoIGRldmljZXMgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEhJRF9GRgorCXNlbGVjdCBJTlBVVF9GRl9NRU1MRVNTIGlmIFVTQl9ISUQKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIG9uZSBvZiB0aGVzZSBkZXZpY2VzOgorCSAgLSBMb2dpdGVjaCBXaW5nTWFuIENvcmRsZXNzIFJ1bWJsZVBhZAorCSAgLSBMb2dpdGVjaCBXaW5nTWFuIENvcmRsZXNzIFJ1bWJsZVBhZCAyCisJICAtIExvZ2l0ZWNoIFdpbmdNYW4gRm9yY2UgM0QKKwkgIC0gTG9naXRlY2ggRm9ybXVsYSBGb3JjZSBFWAorCSAgLSBMb2dpdGVjaCBNT01PIEZvcmNlIHdoZWVsCisKKwkgIGFuZCBpZiB5b3Ugd2FudCB0byBlbmFibGUgZm9yY2UgZmVlZGJhY2sgZm9yIHRoZW0uCisJICBOb3RlOiBpZiB5b3Ugc2F5IE4gaGVyZSwgdGhpcyBkZXZpY2Ugd2lsbCBzdGlsbCBiZSBzdXBwb3J0ZWQsIGJ1dCB3aXRob3V0CisJICBmb3JjZSBmZWVkYmFjay4KKworY29uZmlnIFBBTlRIRVJMT1JEX0ZGCisJYm9vbCAiUGFudGhlckxvcmQgVVNCL1BTMiAyaW4xIEFkYXB0ZXIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEhJRF9GRgorCXNlbGVjdCBJTlBVVF9GRl9NRU1MRVNTIGlmIFVTQl9ISUQKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIGEgUGFudGhlckxvcmQgVVNCL1BTMiAyaW4xIEFkYXB0ZXIgYW5kIHdhbnQKKwkgIHRvIGVuYWJsZSBmb3JjZSBmZWVkYmFjayBzdXBwb3J0IGZvciBpdC4KKworY29uZmlnIFRIUlVTVE1BU1RFUl9GRgorCWJvb2wgIlRocnVzdE1hc3RlciBGaXJlU3Rvcm0gRHVhbCBQb3dlciAyIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBISURfRkYgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IElOUFVUX0ZGX01FTUxFU1MgaWYgVVNCX0hJRAorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgYSBUSFJVU1RNQVNURVIgRmlyZVN0b3JlIER1YWwgUG93ZXIgMiwKKwkgIGFuZCB3YW50IHRvIGVuYWJsZSBmb3JjZSBmZWVkYmFjayBzdXBwb3J0IGZvciBpdC4KKwkgIE5vdGU6IGlmIHlvdSBzYXkgTiBoZXJlLCB0aGlzIGRldmljZSB3aWxsIHN0aWxsIGJlIHN1cHBvcnRlZCwgYnV0IHdpdGhvdXQKKwkgIGZvcmNlIGZlZWRiYWNrLgorCitjb25maWcgWkVST1BMVVNfRkYKKwlib29sICJaZXJvcGx1cyBiYXNlZCBnYW1lIGNvbnRyb2xsZXIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEhJRF9GRgorCXNlbGVjdCBJTlBVVF9GRl9NRU1MRVNTIGlmIFVTQl9ISUQKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIGEgWmVyb3BsdXMgYmFzZWQgZ2FtZSBjb250cm9sbGVyIGFuZCB3YW50IHRvCisJICBlbmFibGUgZm9yY2UgZmVlZGJhY2sgZm9yIGl0LgorCitjb25maWcgVVNCX0hJRERFVgorCWJvb2wgIi9kZXYvaGlkZGV2IHJhdyBISUQgZGV2aWNlIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBVU0JfSElECisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBzdXBwb3J0IEhJRCBkZXZpY2VzIChmcm9tIHRoZSBVU0IKKwkgIHNwZWNpZmljYXRpb24gc3RhbmRwb2ludCkgdGhhdCBhcmVuJ3Qgc3RyaWN0bHkgdXNlciBpbnRlcmZhY2UKKwkgIGRldmljZXMsIGxpa2UgbW9uaXRvciBjb250cm9scyBhbmQgVW5pbnRlcnJ1cHRhYmxlIFBvd2VyIFN1cHBsaWVzLgorCisJICBUaGlzIG1vZHVsZSBzdXBwb3J0cyB0aGVzZSBkZXZpY2VzIHNlcGFyYXRlbHkgdXNpbmcgYSBzZXBhcmF0ZQorCSAgZXZlbnQgaW50ZXJmYWNlIG9uIC9kZXYvdXNiL2hpZGRldlggKGNoYXIgMTgwOjk2IHRvIDE4MDoxMTEpLgorCisJICBJZiB1bnN1cmUsIHNheSBZLgorCittZW51ICJVU0IgSElEIEJvb3QgUHJvdG9jb2wgZHJpdmVycyIKKwlkZXBlbmRzIG9uIFVTQiE9biAmJiBVU0JfSElEIT15CisKK2NvbmZpZyBVU0JfS0JECisJdHJpc3RhdGUgIlVTQiBISURCUCBLZXlib2FyZCAoc2ltcGxlIEJvb3QpIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBVU0IgJiYgSU5QVVQKKwktLS1oZWxwLS0tCisJICBTYXkgWSBoZXJlIG9ubHkgaWYgeW91IGFyZSBhYnNvbHV0ZWx5IHN1cmUgdGhhdCB5b3UgZG9uJ3Qgd2FudAorCSAgdG8gdXNlIHRoZSBnZW5lcmljIEhJRCBkcml2ZXIgZm9yIHlvdXIgVVNCIGtleWJvYXJkIGFuZCBwcmVmZXIKKwkgIHRvIHVzZSB0aGUga2V5Ym9hcmQgaW4gaXRzIGxpbWl0ZWQgQm9vdCBQcm90b2NvbCBtb2RlIGluc3RlYWQuCisKKwkgIFRoaXMgaXMgYWxtb3N0IGNlcnRhaW5seSBub3Qgd2hhdCB5b3Ugd2FudC4gIFRoaXMgaXMgbW9zdGx5CisJICB1c2VmdWwgZm9yIGVtYmVkZGVkIGFwcGxpY2F0aW9ucyBvciBzaW1wbGUga2V5Ym9hcmRzLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB1c2JrYmQuCisKKwkgIElmIGV2ZW4gcmVtb3RlbHkgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIFVTQl9NT1VTRQorCXRyaXN0YXRlICJVU0IgSElEQlAgTW91c2UgKHNpbXBsZSBCb290KSBzdXBwb3J0IgorCWRlcGVuZHMgb24gVVNCICYmIElOUFVUCisJLS0taGVscC0tLQorCSAgU2F5IFkgaGVyZSBvbmx5IGlmIHlvdSBhcmUgYWJzb2x1dGVseSBzdXJlIHRoYXQgeW91IGRvbid0IHdhbnQKKwkgIHRvIHVzZSB0aGUgZ2VuZXJpYyBISUQgZHJpdmVyIGZvciB5b3VyIFVTQiBtb3VzZSBhbmQgcHJlZmVyCisJICB0byB1c2UgdGhlIG1vdXNlIGluIGl0cyBsaW1pdGVkIEJvb3QgUHJvdG9jb2wgbW9kZSBpbnN0ZWFkLgorCisJICBUaGlzIGlzIGFsbW9zdCBjZXJ0YWlubHkgbm90IHdoYXQgeW91IHdhbnQuICBUaGlzIGlzIG1vc3RseQorCSAgdXNlZnVsIGZvciBlbWJlZGRlZCBhcHBsaWNhdGlvbnMgb3Igc2ltcGxlIG1pY2UuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHVzYm1vdXNlLgorCisJICBJZiBldmVuIHJlbW90ZWx5IHVuc3VyZSwgc2F5IE4uCisKK2VuZG1lbnUKKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC91c2JoaWQvTWFrZWZpbGUgYi9kcml2ZXJzL2hpZC91c2JoaWQvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU2YWI1YjEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2hpZC91c2JoaWQvTWFrZWZpbGUKQEAgLTAsMCArMSwzNSBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIFVTQiBpbnB1dCBkcml2ZXJzCisjCisKKyMgTXVsdGlwYXJ0IG9iamVjdHMuCit1c2JoaWQtb2Jqcwk6PSBoaWQtY29yZS5vIGhpZC1xdWlya3MubworCisjIE9wdGlvbmFsIHBhcnRzIG9mIG11bHRpcGFydCBvYmplY3RzLgorCitpZmVxICgkKENPTkZJR19VU0JfSElEREVWKSx5KQorCXVzYmhpZC1vYmpzCSs9IGhpZGRldi5vCitlbmRpZgoraWZlcSAoJChDT05GSUdfSElEX1BJRCkseSkKKwl1c2JoaWQtb2JqcwkrPSBoaWQtcGlkZmYubworZW5kaWYKK2lmZXEgKCQoQ09ORklHX0xPR0lURUNIX0ZGKSx5KQorCXVzYmhpZC1vYmpzCSs9IGhpZC1sZ2ZmLm8KK2VuZGlmCitpZmVxICgkKENPTkZJR19QQU5USEVSTE9SRF9GRikseSkKKwl1c2JoaWQtb2JqcwkrPSBoaWQtcGxmZi5vCitlbmRpZgoraWZlcSAoJChDT05GSUdfVEhSVVNUTUFTVEVSX0ZGKSx5KQorCXVzYmhpZC1vYmpzCSs9IGhpZC10bWZmLm8KK2VuZGlmCitpZmVxICgkKENPTkZJR19aRVJPUExVU19GRikseSkKKwl1c2JoaWQtb2JqcwkrPSBoaWQtenBmZi5vCitlbmRpZgoraWZlcSAoJChDT05GSUdfSElEX0ZGKSx5KQorCXVzYmhpZC1vYmpzCSs9IGhpZC1mZi5vCitlbmRpZgorCitvYmotJChDT05GSUdfVVNCX0hJRCkJCSs9IHVzYmhpZC5vCitvYmotJChDT05GSUdfVVNCX0tCRCkJCSs9IHVzYmtiZC5vCitvYmotJChDT05GSUdfVVNCX01PVVNFKQkJKz0gdXNibW91c2UubworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC91c2JoaWQvaGlkLWNvcmUuYyBiL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWQtY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxZDYxMDMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2hpZC91c2JoaWQvaGlkLWNvcmUuYwpAQCAtMCwwICsxLDExMTQgQEAKKy8qCisgKiAgVVNCIEhJRCBzdXBwb3J0IGZvciBMaW51eAorICoKKyAqICBDb3B5cmlnaHQgKGMpIDE5OTkgQW5kcmVhcyBHYWwKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBWb2p0ZWNoIFBhdmxpayA8dm9qdGVjaEBzdXNlLmN6PgorICogIENvcHlyaWdodCAoYykgMjAwNSBNaWNoYWVsIEhhYm91c3RhayA8bWlrZS1AY2luY2kucnIuY29tPiBmb3IgQ29uY2VwdDIsIEluYworICogIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEppcmkgS29zaW5hCisgKi8KKworLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisKKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKworI2luY2x1ZGUgPGxpbnV4L2hpZC5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZGRldi5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZC1kZWJ1Zy5oPgorI2luY2x1ZGUgInVzYmhpZC5oIgorCisvKgorICogVmVyc2lvbiBJbmZvcm1hdGlvbgorICovCisKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gInYyLjYiCisjZGVmaW5lIERSSVZFUl9BVVRIT1IgIkFuZHJlYXMgR2FsLCBWb2p0ZWNoIFBhdmxpaywgSmlyaSBLb3NpbmEiCisjZGVmaW5lIERSSVZFUl9ERVNDICJVU0IgSElEIGNvcmUgZHJpdmVyIgorI2RlZmluZSBEUklWRVJfTElDRU5TRSAiR1BMIgorCitzdGF0aWMgY2hhciAqaGlkX3R5cGVzW10gPSB7IkRldmljZSIsICJQb2ludGVyIiwgIk1vdXNlIiwgIkRldmljZSIsICJKb3lzdGljayIsCisJCQkJIkdhbWVwYWQiLCAiS2V5Ym9hcmQiLCAiS2V5cGFkIiwgIk11bHRpLUF4aXMgQ29udHJvbGxlciJ9OworLyoKKyAqIE1vZHVsZSBwYXJhbWV0ZXJzLgorICovCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaGlkX21vdXNlcG9sbF9pbnRlcnZhbDsKK21vZHVsZV9wYXJhbV9uYW1lZChtb3VzZXBvbGwsIGhpZF9tb3VzZXBvbGxfaW50ZXJ2YWwsIHVpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhtb3VzZXBvbGwsICJQb2xsaW5nIGludGVydmFsIG9mIG1pY2UiKTsKKworLyogUXVpcmtzIHNwZWNpZmllZCBhdCBtb2R1bGUgbG9hZCB0aW1lICovCitzdGF0aWMgY2hhciAqcXVpcmtzX3BhcmFtW01BWF9VU0JISURfQk9PVF9RVUlSS1NdID0geyBbIDAgLi4uIChNQVhfVVNCSElEX0JPT1RfUVVJUktTIC0gMSkgXSA9IE5VTEwgfTsKK21vZHVsZV9wYXJhbV9hcnJheV9uYW1lZChxdWlya3MsIHF1aXJrc19wYXJhbSwgY2hhcnAsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhxdWlya3MsICJBZGQvbW9kaWZ5IFVTQiBISUQgcXVpcmtzIGJ5IHNwZWNpZnlpbmcgIgorCQkiIHF1aXJrcz12ZW5kb3JJRDpwcm9kdWN0SUQ6cXVpcmtzIgorCQkiIHdoZXJlIHZlbmRvcklELCBwcm9kdWN0SUQsIGFuZCBxdWlya3MgYXJlIGFsbCBpbiIKKwkJIiAweC1wcmVmaXhlZCBoZXgiKTsKKy8qCisgKiBJbnB1dCBzdWJtaXNzaW9uIGFuZCBJL08gZXJyb3IgaGFuZGxlci4KKyAqLworCitzdGF0aWMgdm9pZCBoaWRfaW9fZXJyb3Ioc3RydWN0IGhpZF9kZXZpY2UgKmhpZCk7CisKKy8qIFN0YXJ0IHVwIHRoZSBpbnB1dCBVUkIgKi8KK3N0YXRpYyBpbnQgaGlkX3N0YXJ0X2luKHN0cnVjdCBoaWRfZGV2aWNlICpoaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmMgPSAwOworCXN0cnVjdCB1c2JoaWRfZGV2aWNlICp1c2JoaWQgPSBoaWQtPmRyaXZlcl9kYXRhOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnVzYmhpZC0+aW5sb2NrLCBmbGFncyk7CisJaWYgKGhpZC0+b3BlbiA+IDAgJiYgIXRlc3RfYml0KEhJRF9TVVNQRU5ERUQsICZ1c2JoaWQtPmlvZmwpICYmCisJCQkhdGVzdF9hbmRfc2V0X2JpdChISURfSU5fUlVOTklORywgJnVzYmhpZC0+aW9mbCkpIHsKKwkJcmMgPSB1c2Jfc3VibWl0X3VyYih1c2JoaWQtPnVyYmluLCBHRlBfQVRPTUlDKTsKKwkJaWYgKHJjICE9IDApCisJCQljbGVhcl9iaXQoSElEX0lOX1JVTk5JTkcsICZ1c2JoaWQtPmlvZmwpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1c2JoaWQtPmlubG9jaywgZmxhZ3MpOworCXJldHVybiByYzsKK30KKworLyogSS9PIHJldHJ5IHRpbWVyIHJvdXRpbmUgKi8KK3N0YXRpYyB2b2lkIGhpZF9yZXRyeV90aW1lb3V0KHVuc2lnbmVkIGxvbmcgX2hpZCkKK3sKKwlzdHJ1Y3QgaGlkX2RldmljZSAqaGlkID0gKHN0cnVjdCBoaWRfZGV2aWNlICopIF9oaWQ7CisJc3RydWN0IHVzYmhpZF9kZXZpY2UgKnVzYmhpZCA9IGhpZC0+ZHJpdmVyX2RhdGE7CisKKwlkZXZfZGJnKCZ1c2JoaWQtPmludGYtPmRldiwgInJldHJ5aW5nIGludHIgdXJiXG4iKTsKKwlpZiAoaGlkX3N0YXJ0X2luKGhpZCkpCisJCWhpZF9pb19lcnJvcihoaWQpOworfQorCisvKiBXb3JrcXVldWUgcm91dGluZSB0byByZXNldCB0aGUgZGV2aWNlIG9yIGNsZWFyIGEgaGFsdCAqLworc3RhdGljIHZvaWQgaGlkX3Jlc2V0KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgdXNiaGlkX2RldmljZSAqdXNiaGlkID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB1c2JoaWRfZGV2aWNlLCByZXNldF93b3JrKTsKKwlzdHJ1Y3QgaGlkX2RldmljZSAqaGlkID0gdXNiaGlkLT5oaWQ7CisJaW50IHJjX2xvY2ssIHJjID0gMDsKKworCWlmICh0ZXN0X2JpdChISURfQ0xFQVJfSEFMVCwgJnVzYmhpZC0+aW9mbCkpIHsKKwkJZGV2X2RiZygmdXNiaGlkLT5pbnRmLT5kZXYsICJjbGVhciBoYWx0XG4iKTsKKwkJcmMgPSB1c2JfY2xlYXJfaGFsdChoaWRfdG9fdXNiX2RldihoaWQpLCB1c2JoaWQtPnVyYmluLT5waXBlKTsKKwkJY2xlYXJfYml0KEhJRF9DTEVBUl9IQUxULCAmdXNiaGlkLT5pb2ZsKTsKKwkJaGlkX3N0YXJ0X2luKGhpZCk7CisJfQorCisJZWxzZSBpZiAodGVzdF9iaXQoSElEX1JFU0VUX1BFTkRJTkcsICZ1c2JoaWQtPmlvZmwpKSB7CisJCWRldl9kYmcoJnVzYmhpZC0+aW50Zi0+ZGV2LCAicmVzZXR0aW5nIGRldmljZVxuIik7CisJCXJjID0gcmNfbG9jayA9IHVzYl9sb2NrX2RldmljZV9mb3JfcmVzZXQoaGlkX3RvX3VzYl9kZXYoaGlkKSwgdXNiaGlkLT5pbnRmKTsKKwkJaWYgKHJjX2xvY2sgPj0gMCkgeworCQkJcmMgPSB1c2JfcmVzZXRfY29tcG9zaXRlX2RldmljZShoaWRfdG9fdXNiX2RldihoaWQpLCB1c2JoaWQtPmludGYpOworCQkJaWYgKHJjX2xvY2spCisJCQkJdXNiX3VubG9ja19kZXZpY2UoaGlkX3RvX3VzYl9kZXYoaGlkKSk7CisJCX0KKwkJY2xlYXJfYml0KEhJRF9SRVNFVF9QRU5ESU5HLCAmdXNiaGlkLT5pb2ZsKTsKKwl9CisKKwlzd2l0Y2ggKHJjKSB7CisJY2FzZSAwOgorCQlpZiAoIXRlc3RfYml0KEhJRF9JTl9SVU5OSU5HLCAmdXNiaGlkLT5pb2ZsKSkKKwkJCWhpZF9pb19lcnJvcihoaWQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQllcnIoImNhbid0IHJlc2V0IGRldmljZSwgJXMtJXMvaW5wdXQlZCwgc3RhdHVzICVkIiwKKwkJCQloaWRfdG9fdXNiX2RldihoaWQpLT5idXMtPmJ1c19uYW1lLAorCQkJCWhpZF90b191c2JfZGV2KGhpZCktPmRldnBhdGgsCisJCQkJdXNiaGlkLT5pZm51bSwgcmMpOworCQkvKiBGQUxMVEhST1VHSCAqLworCWNhc2UgLUVIT1NUVU5SRUFDSDoKKwljYXNlIC1FTk9ERVY6CisJY2FzZSAtRUlOVFI6CisJCWJyZWFrOworCX0KK30KKworLyogTWFpbiBJL08gZXJyb3IgaGFuZGxlciAqLworc3RhdGljIHZvaWQgaGlkX2lvX2Vycm9yKHN0cnVjdCBoaWRfZGV2aWNlICpoaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgdXNiaGlkX2RldmljZSAqdXNiaGlkID0gaGlkLT5kcml2ZXJfZGF0YTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ1c2JoaWQtPmlubG9jaywgZmxhZ3MpOworCisJLyogU3RvcCB3aGVuIGRpc2Nvbm5lY3RlZCAqLworCWlmICh1c2JfZ2V0X2ludGZkYXRhKHVzYmhpZC0+aW50ZikgPT0gTlVMTCkKKwkJZ290byBkb25lOworCisJLyogSWYgaXQgaGFzIGJlZW4gYSB3aGlsZSBzaW5jZSB0aGUgbGFzdCBlcnJvciwgd2UnbGwgYXNzdW1lCisJICogdGhpcyBhIGJyYW5kIG5ldyBlcnJvciBhbmQgcmVzZXQgdGhlIHJldHJ5IHRpbWVvdXQuICovCisJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdXNiaGlkLT5zdG9wX3JldHJ5ICsgSFovMikpCisJCXVzYmhpZC0+cmV0cnlfZGVsYXkgPSAwOworCisJLyogV2hlbiBhbiBlcnJvciBvY2N1cnMsIHJldHJ5IGF0IGluY3JlYXNpbmcgaW50ZXJ2YWxzICovCisJaWYgKHVzYmhpZC0+cmV0cnlfZGVsYXkgPT0gMCkgeworCQl1c2JoaWQtPnJldHJ5X2RlbGF5ID0gMTM7CS8qIFRoZW4gMjYsIDUyLCAxMDQsIDEwNCwgLi4uICovCisJCXVzYmhpZC0+c3RvcF9yZXRyeSA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEwMDApOworCX0gZWxzZSBpZiAodXNiaGlkLT5yZXRyeV9kZWxheSA8IDEwMCkKKwkJdXNiaGlkLT5yZXRyeV9kZWxheSAqPSAyOworCisJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdXNiaGlkLT5zdG9wX3JldHJ5KSkgeworCisJCS8qIFJldHJpZXMgZmFpbGVkLCBzbyBkbyBhIHBvcnQgcmVzZXQgKi8KKwkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KEhJRF9SRVNFVF9QRU5ESU5HLCAmdXNiaGlkLT5pb2ZsKSkgeworCQkJc2NoZWR1bGVfd29yaygmdXNiaGlkLT5yZXNldF93b3JrKTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCX0KKworCW1vZF90aW1lcigmdXNiaGlkLT5pb19yZXRyeSwKKwkJCWppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKHVzYmhpZC0+cmV0cnlfZGVsYXkpKTsKK2RvbmU6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdXNiaGlkLT5pbmxvY2ssIGZsYWdzKTsKK30KKworLyoKKyAqIElucHV0IGludGVycnVwdCBjb21wbGV0aW9uIGhhbmRsZXIuCisgKi8KKworc3RhdGljIHZvaWQgaGlkX2lycV9pbihzdHJ1Y3QgdXJiICp1cmIpCit7CisJc3RydWN0IGhpZF9kZXZpY2UJKmhpZCA9IHVyYi0+Y29udGV4dDsKKwlzdHJ1Y3QgdXNiaGlkX2RldmljZSAJKnVzYmhpZCA9IGhpZC0+ZHJpdmVyX2RhdGE7CisJaW50CQkJc3RhdHVzOworCisJc3dpdGNoICh1cmItPnN0YXR1cykgeworCQljYXNlIDA6CQkJLyogc3VjY2VzcyAqLworCQkJdXNiaGlkLT5yZXRyeV9kZWxheSA9IDA7CisJCQloaWRfaW5wdXRfcmVwb3J0KHVyYi0+Y29udGV4dCwgSElEX0lOUFVUX1JFUE9SVCwKKwkJCQkJIHVyYi0+dHJhbnNmZXJfYnVmZmVyLAorCQkJCQkgdXJiLT5hY3R1YWxfbGVuZ3RoLCAxKTsKKwkJCWJyZWFrOworCQljYXNlIC1FUElQRToJCS8qIHN0YWxsICovCisJCQljbGVhcl9iaXQoSElEX0lOX1JVTk5JTkcsICZ1c2JoaWQtPmlvZmwpOworCQkJc2V0X2JpdChISURfQ0xFQVJfSEFMVCwgJnVzYmhpZC0+aW9mbCk7CisJCQlzY2hlZHVsZV93b3JrKCZ1c2JoaWQtPnJlc2V0X3dvcmspOworCQkJcmV0dXJuOworCQljYXNlIC1FQ09OTlJFU0VUOgkvKiB1bmxpbmsgKi8KKwkJY2FzZSAtRU5PRU5UOgorCQljYXNlIC1FU0hVVERPV046CS8qIHVucGx1ZyAqLworCQkJY2xlYXJfYml0KEhJRF9JTl9SVU5OSU5HLCAmdXNiaGlkLT5pb2ZsKTsKKwkJCXJldHVybjsKKwkJY2FzZSAtRUlMU0VROgkJLyogcHJvdG9jb2wgZXJyb3Igb3IgdW5wbHVnICovCisJCWNhc2UgLUVQUk9UTzoJCS8qIHByb3RvY29sIGVycm9yIG9yIHVucGx1ZyAqLworCQljYXNlIC1FVElNRToJCS8qIHByb3RvY29sIGVycm9yIG9yIHVucGx1ZyAqLworCQljYXNlIC1FVElNRURPVVQ6CS8qIFNob3VsZCBuZXZlciBoYXBwZW4sIGJ1dC4uLiAqLworCQkJY2xlYXJfYml0KEhJRF9JTl9SVU5OSU5HLCAmdXNiaGlkLT5pb2ZsKTsKKwkJCWhpZF9pb19lcnJvcihoaWQpOworCQkJcmV0dXJuOworCQlkZWZhdWx0OgkJLyogZXJyb3IgKi8KKwkJCXdhcm4oImlucHV0IGlycSBzdGF0dXMgJWQgcmVjZWl2ZWQiLCB1cmItPnN0YXR1cyk7CisJfQorCisJc3RhdHVzID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKKwlpZiAoc3RhdHVzKSB7CisJCWNsZWFyX2JpdChISURfSU5fUlVOTklORywgJnVzYmhpZC0+aW9mbCk7CisJCWlmIChzdGF0dXMgIT0gLUVQRVJNKSB7CisJCQllcnIoImNhbid0IHJlc3VibWl0IGludHIsICVzLSVzL2lucHV0JWQsIHN0YXR1cyAlZCIsCisJCQkJCWhpZF90b191c2JfZGV2KGhpZCktPmJ1cy0+YnVzX25hbWUsCisJCQkJCWhpZF90b191c2JfZGV2KGhpZCktPmRldnBhdGgsCisJCQkJCXVzYmhpZC0+aWZudW0sIHN0YXR1cyk7CisJCQloaWRfaW9fZXJyb3IoaGlkKTsKKwkJfQorCX0KK30KKworc3RhdGljIGludCBoaWRfc3VibWl0X291dChzdHJ1Y3QgaGlkX2RldmljZSAqaGlkKQoreworCXN0cnVjdCBoaWRfcmVwb3J0ICpyZXBvcnQ7CisJc3RydWN0IHVzYmhpZF9kZXZpY2UgKnVzYmhpZCA9IGhpZC0+ZHJpdmVyX2RhdGE7CisKKwlyZXBvcnQgPSB1c2JoaWQtPm91dFt1c2JoaWQtPm91dHRhaWxdOworCisJaGlkX291dHB1dF9yZXBvcnQocmVwb3J0LCB1c2JoaWQtPm91dGJ1Zik7CisJdXNiaGlkLT51cmJvdXQtPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSAoKHJlcG9ydC0+c2l6ZSAtIDEpID4+IDMpICsgMSArIChyZXBvcnQtPmlkID4gMCk7CisJdXNiaGlkLT51cmJvdXQtPmRldiA9IGhpZF90b191c2JfZGV2KGhpZCk7CisKKwlkYmcoInN1Ym1pdHRpbmcgb3V0IHVyYiIpOworCisJaWYgKHVzYl9zdWJtaXRfdXJiKHVzYmhpZC0+dXJib3V0LCBHRlBfQVRPTUlDKSkgeworCQllcnIoInVzYl9zdWJtaXRfdXJiKG91dCkgZmFpbGVkIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoaWRfc3VibWl0X2N0cmwoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCkKK3sKKwlzdHJ1Y3QgaGlkX3JlcG9ydCAqcmVwb3J0OworCXVuc2lnbmVkIGNoYXIgZGlyOworCWludCBsZW47CisJc3RydWN0IHVzYmhpZF9kZXZpY2UgKnVzYmhpZCA9IGhpZC0+ZHJpdmVyX2RhdGE7CisKKwlyZXBvcnQgPSB1c2JoaWQtPmN0cmxbdXNiaGlkLT5jdHJsdGFpbF0ucmVwb3J0OworCWRpciA9IHVzYmhpZC0+Y3RybFt1c2JoaWQtPmN0cmx0YWlsXS5kaXI7CisKKwlsZW4gPSAoKHJlcG9ydC0+c2l6ZSAtIDEpID4+IDMpICsgMSArIChyZXBvcnQtPmlkID4gMCk7CisJaWYgKGRpciA9PSBVU0JfRElSX09VVCkgeworCQloaWRfb3V0cHV0X3JlcG9ydChyZXBvcnQsIHVzYmhpZC0+Y3RybGJ1Zik7CisJCXVzYmhpZC0+dXJiY3RybC0+cGlwZSA9IHVzYl9zbmRjdHJscGlwZShoaWRfdG9fdXNiX2RldihoaWQpLCAwKTsKKwkJdXNiaGlkLT51cmJjdHJsLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gbGVuOworCX0gZWxzZSB7CisJCWludCBtYXhwYWNrZXQsIHBhZGxlbjsKKworCQl1c2JoaWQtPnVyYmN0cmwtPnBpcGUgPSB1c2JfcmN2Y3RybHBpcGUoaGlkX3RvX3VzYl9kZXYoaGlkKSwgMCk7CisJCW1heHBhY2tldCA9IHVzYl9tYXhwYWNrZXQoaGlkX3RvX3VzYl9kZXYoaGlkKSwgdXNiaGlkLT51cmJjdHJsLT5waXBlLCAwKTsKKwkJaWYgKG1heHBhY2tldCA+IDApIHsKKwkJCXBhZGxlbiA9IChsZW4gKyBtYXhwYWNrZXQgLSAxKSAvIG1heHBhY2tldDsKKwkJCXBhZGxlbiAqPSBtYXhwYWNrZXQ7CisJCQlpZiAocGFkbGVuID4gdXNiaGlkLT5idWZzaXplKQorCQkJCXBhZGxlbiA9IHVzYmhpZC0+YnVmc2l6ZTsKKwkJfSBlbHNlCisJCQlwYWRsZW4gPSAwOworCQl1c2JoaWQtPnVyYmN0cmwtPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBwYWRsZW47CisJfQorCXVzYmhpZC0+dXJiY3RybC0+ZGV2ID0gaGlkX3RvX3VzYl9kZXYoaGlkKTsKKworCXVzYmhpZC0+Y3ItPmJSZXF1ZXN0VHlwZSA9IFVTQl9UWVBFX0NMQVNTIHwgVVNCX1JFQ0lQX0lOVEVSRkFDRSB8IGRpcjsKKwl1c2JoaWQtPmNyLT5iUmVxdWVzdCA9IChkaXIgPT0gVVNCX0RJUl9PVVQpID8gSElEX1JFUV9TRVRfUkVQT1JUIDogSElEX1JFUV9HRVRfUkVQT1JUOworCXVzYmhpZC0+Y3ItPndWYWx1ZSA9IGNwdV90b19sZTE2KCgocmVwb3J0LT50eXBlICsgMSkgPDwgOCkgfCByZXBvcnQtPmlkKTsKKwl1c2JoaWQtPmNyLT53SW5kZXggPSBjcHVfdG9fbGUxNih1c2JoaWQtPmlmbnVtKTsKKwl1c2JoaWQtPmNyLT53TGVuZ3RoID0gY3B1X3RvX2xlMTYobGVuKTsKKworCWRiZygic3VibWl0dGluZyBjdHJsIHVyYjogJXMgd1ZhbHVlPTB4JTA0eCB3SW5kZXg9MHglMDR4IHdMZW5ndGg9JXUiLAorCQl1c2JoaWQtPmNyLT5iUmVxdWVzdCA9PSBISURfUkVRX1NFVF9SRVBPUlQgPyAiU2V0X1JlcG9ydCIgOiAiR2V0X1JlcG9ydCIsCisJCXVzYmhpZC0+Y3ItPndWYWx1ZSwgdXNiaGlkLT5jci0+d0luZGV4LCB1c2JoaWQtPmNyLT53TGVuZ3RoKTsKKworCWlmICh1c2Jfc3VibWl0X3VyYih1c2JoaWQtPnVyYmN0cmwsIEdGUF9BVE9NSUMpKSB7CisJCWVycigidXNiX3N1Ym1pdF91cmIoY3RybCkgZmFpbGVkIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIE91dHB1dCBpbnRlcnJ1cHQgY29tcGxldGlvbiBoYW5kbGVyLgorICovCisKK3N0YXRpYyB2b2lkIGhpZF9pcnFfb3V0KHN0cnVjdCB1cmIgKnVyYikKK3sKKwlzdHJ1Y3QgaGlkX2RldmljZSAqaGlkID0gdXJiLT5jb250ZXh0OworCXN0cnVjdCB1c2JoaWRfZGV2aWNlICp1c2JoaWQgPSBoaWQtPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHVucGx1ZyA9IDA7CisKKwlzd2l0Y2ggKHVyYi0+c3RhdHVzKSB7CisJCWNhc2UgMDoJCQkvKiBzdWNjZXNzICovCisJCQlicmVhazsKKwkJY2FzZSAtRVNIVVRET1dOOgkvKiB1bnBsdWcgKi8KKwkJCXVucGx1ZyA9IDE7CisJCWNhc2UgLUVJTFNFUToJCS8qIHByb3RvY29sIGVycm9yIG9yIHVucGx1ZyAqLworCQljYXNlIC1FUFJPVE86CQkvKiBwcm90b2NvbCBlcnJvciBvciB1bnBsdWcgKi8KKwkJY2FzZSAtRUNPTk5SRVNFVDoJLyogdW5saW5rICovCisJCWNhc2UgLUVOT0VOVDoKKwkJCWJyZWFrOworCQlkZWZhdWx0OgkJLyogZXJyb3IgKi8KKwkJCXdhcm4oIm91dHB1dCBpcnEgc3RhdHVzICVkIHJlY2VpdmVkIiwgdXJiLT5zdGF0dXMpOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZ1c2JoaWQtPm91dGxvY2ssIGZsYWdzKTsKKworCWlmICh1bnBsdWcpCisJCXVzYmhpZC0+b3V0dGFpbCA9IHVzYmhpZC0+b3V0aGVhZDsKKwllbHNlCisJCXVzYmhpZC0+b3V0dGFpbCA9ICh1c2JoaWQtPm91dHRhaWwgKyAxKSAmIChISURfT1VUUFVUX0ZJRk9fU0laRSAtIDEpOworCisJaWYgKHVzYmhpZC0+b3V0aGVhZCAhPSB1c2JoaWQtPm91dHRhaWwpIHsKKwkJaWYgKGhpZF9zdWJtaXRfb3V0KGhpZCkpIHsKKwkJCWNsZWFyX2JpdChISURfT1VUX1JVTk5JTkcsICZ1c2JoaWQtPmlvZmwpOworCQkJd2FrZV91cCgmaGlkLT53YWl0KTsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1c2JoaWQtPm91dGxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCWNsZWFyX2JpdChISURfT1VUX1JVTk5JTkcsICZ1c2JoaWQtPmlvZmwpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVzYmhpZC0+b3V0bG9jaywgZmxhZ3MpOworCXdha2VfdXAoJmhpZC0+d2FpdCk7Cit9CisKKy8qCisgKiBDb250cm9sIHBpcGUgY29tcGxldGlvbiBoYW5kbGVyLgorICovCisKK3N0YXRpYyB2b2lkIGhpZF9jdHJsKHN0cnVjdCB1cmIgKnVyYikKK3sKKwlzdHJ1Y3QgaGlkX2RldmljZSAqaGlkID0gdXJiLT5jb250ZXh0OworCXN0cnVjdCB1c2JoaWRfZGV2aWNlICp1c2JoaWQgPSBoaWQtPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHVucGx1ZyA9IDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdXNiaGlkLT5jdHJsbG9jaywgZmxhZ3MpOworCisJc3dpdGNoICh1cmItPnN0YXR1cykgeworCQljYXNlIDA6CQkJLyogc3VjY2VzcyAqLworCQkJaWYgKHVzYmhpZC0+Y3RybFt1c2JoaWQtPmN0cmx0YWlsXS5kaXIgPT0gVVNCX0RJUl9JTikKKwkJCQloaWRfaW5wdXRfcmVwb3J0KHVyYi0+Y29udGV4dCwgdXNiaGlkLT5jdHJsW3VzYmhpZC0+Y3RybHRhaWxdLnJlcG9ydC0+dHlwZSwKKwkJCQkJCXVyYi0+dHJhbnNmZXJfYnVmZmVyLCB1cmItPmFjdHVhbF9sZW5ndGgsIDApOworCQkJYnJlYWs7CisJCWNhc2UgLUVTSFVURE9XTjoJLyogdW5wbHVnICovCisJCQl1bnBsdWcgPSAxOworCQljYXNlIC1FSUxTRVE6CQkvKiBwcm90b2NvbCBlcnJvciBvciB1bnBsdWcgKi8KKwkJY2FzZSAtRVBST1RPOgkJLyogcHJvdG9jb2wgZXJyb3Igb3IgdW5wbHVnICovCisJCWNhc2UgLUVDT05OUkVTRVQ6CS8qIHVubGluayAqLworCQljYXNlIC1FTk9FTlQ6CisJCWNhc2UgLUVQSVBFOgkJLyogcmVwb3J0IG5vdCBhdmFpbGFibGUgKi8KKwkJCWJyZWFrOworCQlkZWZhdWx0OgkJLyogZXJyb3IgKi8KKwkJCXdhcm4oImN0cmwgdXJiIHN0YXR1cyAlZCByZWNlaXZlZCIsIHVyYi0+c3RhdHVzKTsKKwl9CisKKwlpZiAodW5wbHVnKQorCQl1c2JoaWQtPmN0cmx0YWlsID0gdXNiaGlkLT5jdHJsaGVhZDsKKwllbHNlCisJCXVzYmhpZC0+Y3RybHRhaWwgPSAodXNiaGlkLT5jdHJsdGFpbCArIDEpICYgKEhJRF9DT05UUk9MX0ZJRk9fU0laRSAtIDEpOworCisJaWYgKHVzYmhpZC0+Y3RybGhlYWQgIT0gdXNiaGlkLT5jdHJsdGFpbCkgeworCQlpZiAoaGlkX3N1Ym1pdF9jdHJsKGhpZCkpIHsKKwkJCWNsZWFyX2JpdChISURfQ1RSTF9SVU5OSU5HLCAmdXNiaGlkLT5pb2ZsKTsKKwkJCXdha2VfdXAoJmhpZC0+d2FpdCk7CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdXNiaGlkLT5jdHJsbG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJY2xlYXJfYml0KEhJRF9DVFJMX1JVTk5JTkcsICZ1c2JoaWQtPmlvZmwpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVzYmhpZC0+Y3RybGxvY2ssIGZsYWdzKTsKKwl3YWtlX3VwKCZoaWQtPndhaXQpOworfQorCit2b2lkIHVzYmhpZF9zdWJtaXRfcmVwb3J0KHN0cnVjdCBoaWRfZGV2aWNlICpoaWQsIHN0cnVjdCBoaWRfcmVwb3J0ICpyZXBvcnQsIHVuc2lnbmVkIGNoYXIgZGlyKQoreworCWludCBoZWFkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHVzYmhpZF9kZXZpY2UgKnVzYmhpZCA9IGhpZC0+ZHJpdmVyX2RhdGE7CisKKwlpZiAoKGhpZC0+cXVpcmtzICYgSElEX1FVSVJLX05PR0VUKSAmJiBkaXIgPT0gVVNCX0RJUl9JTikKKwkJcmV0dXJuOworCisJaWYgKHVzYmhpZC0+dXJib3V0ICYmIGRpciA9PSBVU0JfRElSX09VVCAmJiByZXBvcnQtPnR5cGUgPT0gSElEX09VVFBVVF9SRVBPUlQpIHsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmdXNiaGlkLT5vdXRsb2NrLCBmbGFncyk7CisKKwkJaWYgKChoZWFkID0gKHVzYmhpZC0+b3V0aGVhZCArIDEpICYgKEhJRF9PVVRQVVRfRklGT19TSVpFIC0gMSkpID09IHVzYmhpZC0+b3V0dGFpbCkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdXNiaGlkLT5vdXRsb2NrLCBmbGFncyk7CisJCQl3YXJuKCJvdXRwdXQgcXVldWUgZnVsbCIpOworCQkJcmV0dXJuOworCQl9CisKKwkJdXNiaGlkLT5vdXRbdXNiaGlkLT5vdXRoZWFkXSA9IHJlcG9ydDsKKwkJdXNiaGlkLT5vdXRoZWFkID0gaGVhZDsKKworCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoSElEX09VVF9SVU5OSU5HLCAmdXNiaGlkLT5pb2ZsKSkKKwkJCWlmIChoaWRfc3VibWl0X291dChoaWQpKQorCQkJCWNsZWFyX2JpdChISURfT1VUX1JVTk5JTkcsICZ1c2JoaWQtPmlvZmwpOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVzYmhpZC0+b3V0bG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJnVzYmhpZC0+Y3RybGxvY2ssIGZsYWdzKTsKKworCWlmICgoaGVhZCA9ICh1c2JoaWQtPmN0cmxoZWFkICsgMSkgJiAoSElEX0NPTlRST0xfRklGT19TSVpFIC0gMSkpID09IHVzYmhpZC0+Y3RybHRhaWwpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdXNiaGlkLT5jdHJsbG9jaywgZmxhZ3MpOworCQl3YXJuKCJjb250cm9sIHF1ZXVlIGZ1bGwiKTsKKwkJcmV0dXJuOworCX0KKworCXVzYmhpZC0+Y3RybFt1c2JoaWQtPmN0cmxoZWFkXS5yZXBvcnQgPSByZXBvcnQ7CisJdXNiaGlkLT5jdHJsW3VzYmhpZC0+Y3RybGhlYWRdLmRpciA9IGRpcjsKKwl1c2JoaWQtPmN0cmxoZWFkID0gaGVhZDsKKworCWlmICghdGVzdF9hbmRfc2V0X2JpdChISURfQ1RSTF9SVU5OSU5HLCAmdXNiaGlkLT5pb2ZsKSkKKwkJaWYgKGhpZF9zdWJtaXRfY3RybChoaWQpKQorCQkJY2xlYXJfYml0KEhJRF9DVFJMX1JVTk5JTkcsICZ1c2JoaWQtPmlvZmwpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdXNiaGlkLT5jdHJsbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IHVzYl9oaWRpbnB1dF9pbnB1dF9ldmVudChzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYsIHVuc2lnbmVkIGludCB0eXBlLCB1bnNpZ25lZCBpbnQgY29kZSwgaW50IHZhbHVlKQoreworCXN0cnVjdCBoaWRfZGV2aWNlICpoaWQgPSBkZXYtPnByaXZhdGU7CisJc3RydWN0IGhpZF9maWVsZCAqZmllbGQ7CisJaW50IG9mZnNldDsKKworCWlmICh0eXBlID09IEVWX0ZGKQorCQlyZXR1cm4gaW5wdXRfZmZfZXZlbnQoZGV2LCB0eXBlLCBjb2RlLCB2YWx1ZSk7CisKKwlpZiAodHlwZSAhPSBFVl9MRUQpCisJCXJldHVybiAtMTsKKworCWlmICgob2Zmc2V0ID0gaGlkaW5wdXRfZmluZF9maWVsZChoaWQsIHR5cGUsIGNvZGUsICZmaWVsZCkpID09IC0xKSB7CisJCXdhcm4oImV2ZW50IGZpZWxkIG5vdCBmb3VuZCIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaGlkX3NldF9maWVsZChmaWVsZCwgb2Zmc2V0LCB2YWx1ZSk7CisJdXNiaGlkX3N1Ym1pdF9yZXBvcnQoaGlkLCBmaWVsZC0+cmVwb3J0LCBVU0JfRElSX09VVCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHVzYmhpZF93YWl0X2lvKHN0cnVjdCBoaWRfZGV2aWNlICpoaWQpCit7CisJc3RydWN0IHVzYmhpZF9kZXZpY2UgKnVzYmhpZCA9IGhpZC0+ZHJpdmVyX2RhdGE7CisKKwlpZiAoIXdhaXRfZXZlbnRfdGltZW91dChoaWQtPndhaXQsICghdGVzdF9iaXQoSElEX0NUUkxfUlVOTklORywgJnVzYmhpZC0+aW9mbCkgJiYKKwkJCQkJIXRlc3RfYml0KEhJRF9PVVRfUlVOTklORywgJnVzYmhpZC0+aW9mbCkpLAorCQkJCQkxMCpIWikpIHsKKwkJZGJnKCJ0aW1lb3V0IHdhaXRpbmcgZm9yIGN0cmwgb3Igb3V0IHF1ZXVlIHRvIGNsZWFyIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoaWRfc2V0X2lkbGUoc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgaW50IGlmbnVtLCBpbnQgcmVwb3J0LCBpbnQgaWRsZSkKK3sKKwlyZXR1cm4gdXNiX2NvbnRyb2xfbXNnKGRldiwgdXNiX3NuZGN0cmxwaXBlKGRldiwgMCksCisJCUhJRF9SRVFfU0VUX0lETEUsIFVTQl9UWVBFX0NMQVNTIHwgVVNCX1JFQ0lQX0lOVEVSRkFDRSwgKGlkbGUgPDwgOCkgfCByZXBvcnQsCisJCWlmbnVtLCBOVUxMLCAwLCBVU0JfQ1RSTF9TRVRfVElNRU9VVCk7Cit9CisKK3N0YXRpYyBpbnQgaGlkX2dldF9jbGFzc19kZXNjcmlwdG9yKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIGludCBpZm51bSwKKwkJdW5zaWduZWQgY2hhciB0eXBlLCB2b2lkICpidWYsIGludCBzaXplKQoreworCWludCByZXN1bHQsIHJldHJpZXMgPSA0OworCisJbWVtc2V0KGJ1ZiwgMCwgc2l6ZSk7CisKKwlkbyB7CisJCXJlc3VsdCA9IHVzYl9jb250cm9sX21zZyhkZXYsIHVzYl9yY3ZjdHJscGlwZShkZXYsIDApLAorCQkJCVVTQl9SRVFfR0VUX0RFU0NSSVBUT1IsIFVTQl9SRUNJUF9JTlRFUkZBQ0UgfCBVU0JfRElSX0lOLAorCQkJCSh0eXBlIDw8IDgpLCBpZm51bSwgYnVmLCBzaXplLCBVU0JfQ1RSTF9HRVRfVElNRU9VVCk7CisJCXJldHJpZXMtLTsKKwl9IHdoaWxlIChyZXN1bHQgPCBzaXplICYmIHJldHJpZXMpOworCXJldHVybiByZXN1bHQ7Cit9CisKK2ludCB1c2JoaWRfb3BlbihzdHJ1Y3QgaGlkX2RldmljZSAqaGlkKQoreworCSsraGlkLT5vcGVuOworCWlmIChoaWRfc3RhcnRfaW4oaGlkKSkKKwkJaGlkX2lvX2Vycm9yKGhpZCk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgdXNiaGlkX2Nsb3NlKHN0cnVjdCBoaWRfZGV2aWNlICpoaWQpCit7CisJc3RydWN0IHVzYmhpZF9kZXZpY2UgKnVzYmhpZCA9IGhpZC0+ZHJpdmVyX2RhdGE7CisKKwlpZiAoIS0taGlkLT5vcGVuKQorCQl1c2Jfa2lsbF91cmIodXNiaGlkLT51cmJpbik7Cit9CisKKy8qCisgKiBJbml0aWFsaXplIGFsbCByZXBvcnRzCisgKi8KKwordm9pZCB1c2JoaWRfaW5pdF9yZXBvcnRzKHN0cnVjdCBoaWRfZGV2aWNlICpoaWQpCit7CisJc3RydWN0IGhpZF9yZXBvcnQgKnJlcG9ydDsKKwlzdHJ1Y3QgdXNiaGlkX2RldmljZSAqdXNiaGlkID0gaGlkLT5kcml2ZXJfZGF0YTsKKwlpbnQgZXJyLCByZXQ7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlcG9ydCwgJmhpZC0+cmVwb3J0X2VudW1bSElEX0lOUFVUX1JFUE9SVF0ucmVwb3J0X2xpc3QsIGxpc3QpCisJCXVzYmhpZF9zdWJtaXRfcmVwb3J0KGhpZCwgcmVwb3J0LCBVU0JfRElSX0lOKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkocmVwb3J0LCAmaGlkLT5yZXBvcnRfZW51bVtISURfRkVBVFVSRV9SRVBPUlRdLnJlcG9ydF9saXN0LCBsaXN0KQorCQl1c2JoaWRfc3VibWl0X3JlcG9ydChoaWQsIHJlcG9ydCwgVVNCX0RJUl9JTik7CisKKwllcnIgPSAwOworCXJldCA9IHVzYmhpZF93YWl0X2lvKGhpZCk7CisJd2hpbGUgKHJldCkgeworCQllcnIgfD0gcmV0OworCQlpZiAodGVzdF9iaXQoSElEX0NUUkxfUlVOTklORywgJnVzYmhpZC0+aW9mbCkpCisJCQl1c2Jfa2lsbF91cmIodXNiaGlkLT51cmJjdHJsKTsKKwkJaWYgKHRlc3RfYml0KEhJRF9PVVRfUlVOTklORywgJnVzYmhpZC0+aW9mbCkpCisJCQl1c2Jfa2lsbF91cmIodXNiaGlkLT51cmJvdXQpOworCQlyZXQgPSB1c2JoaWRfd2FpdF9pbyhoaWQpOworCX0KKworCWlmIChlcnIpCisJCXdhcm4oInRpbWVvdXQgaW5pdGlhbGl6aW5nIHJlcG9ydHMiKTsKK30KKworLyoKKyAqIFJlc2V0IExFRHMgd2hpY2ggQklPUyBtaWdodCBoYXZlIGxlZnQgb24uIEZvciBub3csIGp1c3QgTnVtTG9jayAoMHgwMSkuCisgKi8KK3N0YXRpYyBpbnQgaGlkX2ZpbmRfZmllbGRfZWFybHkoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCwgdW5zaWduZWQgaW50IHBhZ2UsCisgICAgdW5zaWduZWQgaW50IGhpZF9jb2RlLCBzdHJ1Y3QgaGlkX2ZpZWxkICoqcGZpZWxkKQoreworCXN0cnVjdCBoaWRfcmVwb3J0ICpyZXBvcnQ7CisJc3RydWN0IGhpZF9maWVsZCAqZmllbGQ7CisJc3RydWN0IGhpZF91c2FnZSAqdXNhZ2U7CisJaW50IGksIGo7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlcG9ydCwgJmhpZC0+cmVwb3J0X2VudW1bSElEX09VVFBVVF9SRVBPUlRdLnJlcG9ydF9saXN0LCBsaXN0KSB7CisJCWZvciAoaSA9IDA7IGkgPCByZXBvcnQtPm1heGZpZWxkOyBpKyspIHsKKwkJCWZpZWxkID0gcmVwb3J0LT5maWVsZFtpXTsKKwkJCWZvciAoaiA9IDA7IGogPCBmaWVsZC0+bWF4dXNhZ2U7IGorKykgeworCQkJCXVzYWdlID0gJmZpZWxkLT51c2FnZVtqXTsKKwkJCQlpZiAoKHVzYWdlLT5oaWQgJiBISURfVVNBR0VfUEFHRSkgPT0gcGFnZSAmJgorCQkJCSAgICAodXNhZ2UtPmhpZCAmIDB4RkZGRikgPT0gaGlkX2NvZGUpIHsKKwkJCQkJKnBmaWVsZCA9IGZpZWxkOworCQkJCQlyZXR1cm4gajsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgdm9pZCB1c2JoaWRfc2V0X2xlZHMoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCkKK3sKKwlzdHJ1Y3QgaGlkX2ZpZWxkICpmaWVsZDsKKwlpbnQgb2Zmc2V0OworCisJaWYgKChvZmZzZXQgPSBoaWRfZmluZF9maWVsZF9lYXJseShoaWQsIEhJRF9VUF9MRUQsIDB4MDEsICZmaWVsZCkpICE9IC0xKSB7CisJCWhpZF9zZXRfZmllbGQoZmllbGQsIG9mZnNldCwgMCk7CisJCXVzYmhpZF9zdWJtaXRfcmVwb3J0KGhpZCwgZmllbGQtPnJlcG9ydCwgVVNCX0RJUl9PVVQpOworCX0KK30KKworLyoKKyAqIFRyYXZlcnNlIHRoZSBzdXBwbGllZCBsaXN0IG9mIHJlcG9ydHMgYW5kIGZpbmQgdGhlIGxvbmdlc3QKKyAqLworc3RhdGljIHZvaWQgaGlkX2ZpbmRfbWF4X3JlcG9ydChzdHJ1Y3QgaGlkX2RldmljZSAqaGlkLCB1bnNpZ25lZCBpbnQgdHlwZSwgaW50ICptYXgpCit7CisJc3RydWN0IGhpZF9yZXBvcnQgKnJlcG9ydDsKKwlpbnQgc2l6ZTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkocmVwb3J0LCAmaGlkLT5yZXBvcnRfZW51bVt0eXBlXS5yZXBvcnRfbGlzdCwgbGlzdCkgeworCQlzaXplID0gKChyZXBvcnQtPnNpemUgLSAxKSA+PiAzKSArIDE7CisJCWlmICh0eXBlID09IEhJRF9JTlBVVF9SRVBPUlQgJiYgaGlkLT5yZXBvcnRfZW51bVt0eXBlXS5udW1iZXJlZCkKKwkJCXNpemUrKzsKKwkJaWYgKCptYXggPCBzaXplKQorCQkJKm1heCA9IHNpemU7CisJfQorfQorCitzdGF0aWMgaW50IGhpZF9hbGxvY19idWZmZXJzKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIHN0cnVjdCBoaWRfZGV2aWNlICpoaWQpCit7CisJc3RydWN0IHVzYmhpZF9kZXZpY2UgKnVzYmhpZCA9IGhpZC0+ZHJpdmVyX2RhdGE7CisKKwlpZiAoISh1c2JoaWQtPmluYnVmID0gdXNiX2J1ZmZlcl9hbGxvYyhkZXYsIHVzYmhpZC0+YnVmc2l6ZSwgR0ZQX0FUT01JQywgJnVzYmhpZC0+aW5idWZfZG1hKSkpCisJCXJldHVybiAtMTsKKwlpZiAoISh1c2JoaWQtPm91dGJ1ZiA9IHVzYl9idWZmZXJfYWxsb2MoZGV2LCB1c2JoaWQtPmJ1ZnNpemUsIEdGUF9BVE9NSUMsICZ1c2JoaWQtPm91dGJ1Zl9kbWEpKSkKKwkJcmV0dXJuIC0xOworCWlmICghKHVzYmhpZC0+Y3IgPSB1c2JfYnVmZmVyX2FsbG9jKGRldiwgc2l6ZW9mKCoodXNiaGlkLT5jcikpLCBHRlBfQVRPTUlDLCAmdXNiaGlkLT5jcl9kbWEpKSkKKwkJcmV0dXJuIC0xOworCWlmICghKHVzYmhpZC0+Y3RybGJ1ZiA9IHVzYl9idWZmZXJfYWxsb2MoZGV2LCB1c2JoaWQtPmJ1ZnNpemUsIEdGUF9BVE9NSUMsICZ1c2JoaWQtPmN0cmxidWZfZG1hKSkpCisJCXJldHVybiAtMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBoaWRfZnJlZV9idWZmZXJzKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIHN0cnVjdCBoaWRfZGV2aWNlICpoaWQpCit7CisJc3RydWN0IHVzYmhpZF9kZXZpY2UgKnVzYmhpZCA9IGhpZC0+ZHJpdmVyX2RhdGE7CisKKwlpZiAodXNiaGlkLT5pbmJ1ZikKKwkJdXNiX2J1ZmZlcl9mcmVlKGRldiwgdXNiaGlkLT5idWZzaXplLCB1c2JoaWQtPmluYnVmLCB1c2JoaWQtPmluYnVmX2RtYSk7CisJaWYgKHVzYmhpZC0+b3V0YnVmKQorCQl1c2JfYnVmZmVyX2ZyZWUoZGV2LCB1c2JoaWQtPmJ1ZnNpemUsIHVzYmhpZC0+b3V0YnVmLCB1c2JoaWQtPm91dGJ1Zl9kbWEpOworCWlmICh1c2JoaWQtPmNyKQorCQl1c2JfYnVmZmVyX2ZyZWUoZGV2LCBzaXplb2YoKih1c2JoaWQtPmNyKSksIHVzYmhpZC0+Y3IsIHVzYmhpZC0+Y3JfZG1hKTsKKwlpZiAodXNiaGlkLT5jdHJsYnVmKQorCQl1c2JfYnVmZmVyX2ZyZWUoZGV2LCB1c2JoaWQtPmJ1ZnNpemUsIHVzYmhpZC0+Y3RybGJ1ZiwgdXNiaGlkLT5jdHJsYnVmX2RtYSk7Cit9CisKKy8qCisgKiBDaGVycnkgQ3ltb3Rpb24ga2V5Ym9hcmQgaGF2ZSBhbiBpbnZhbGlkIEhJRCByZXBvcnQgZGVzY3JpcHRvciwKKyAqIHRoYXQgbmVlZHMgZml4aW5nIGJlZm9yZSB3ZSBjYW4gcGFyc2UgaXQuCisgKi8KKworc3RhdGljIHZvaWQgaGlkX2ZpeHVwX2N5bW90aW9uX2Rlc2NyaXB0b3IoY2hhciAqcmRlc2MsIGludCByc2l6ZSkKK3sKKwlpZiAocnNpemUgPj0gMTcgJiYgcmRlc2NbMTFdID09IDB4M2MgJiYgcmRlc2NbMTJdID09IDB4MDIpIHsKKwkJaW5mbygiRml4aW5nIHVwIENoZXJyeSBDeW1vdGlvbiByZXBvcnQgZGVzY3JpcHRvciIpOworCQlyZGVzY1sxMV0gPSByZGVzY1sxNl0gPSAweGZmOworCQlyZGVzY1sxMl0gPSByZGVzY1sxN10gPSAweDAzOworCX0KK30KKworLyoKKyAqIFNlbmRpbmcgSElEX1JFUV9HRVRfUkVQT1JUIGNoYW5nZXMgdGhlIG9wZXJhdGlvbiBtb2RlIG9mIHRoZSBwczMgY29udHJvbGxlcgorICogdG8gIm9wZXJhdGlvbmFsIi4gIFdpdGhvdXQgdGhpcywgdGhlIHBzMyBjb250cm9sbGVyIHdpbGwgbm90IHJlcG9ydCBhbnkKKyAqIGV2ZW50cy4KKyAqLworc3RhdGljIHZvaWQgaGlkX2ZpeHVwX3NvbnlfcHMzX2NvbnRyb2xsZXIoc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgaW50IGlmbnVtKQoreworCWludCByZXN1bHQ7CisJY2hhciAqYnVmID0ga21hbGxvYygxOCwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuOworCisJcmVzdWx0ID0gdXNiX2NvbnRyb2xfbXNnKGRldiwgdXNiX3JjdmN0cmxwaXBlKGRldiwgMCksCisJCQkJIEhJRF9SRVFfR0VUX1JFUE9SVCwKKwkJCQkgVVNCX0RJUl9JTiB8IFVTQl9UWVBFX0NMQVNTIHwKKwkJCQkgVVNCX1JFQ0lQX0lOVEVSRkFDRSwKKwkJCQkgKDMgPDwgOCkgfCAweGYyLCBpZm51bSwgYnVmLCAxNywKKwkJCQkgVVNCX0NUUkxfR0VUX1RJTUVPVVQpOworCisJaWYgKHJlc3VsdCA8IDApCisJCWVycigiJXMgZmFpbGVkOiAlZFxuIiwgX19mdW5jX18sIHJlc3VsdCk7CisKKwlrZnJlZShidWYpOworfQorCisvKgorICogQ2VydGFpbiBMb2dpdGVjaCBrZXlib2FyZHMgc2VuZCBpbiByZXBvcnQgIzMga2V5cyB3aGljaCBhcmUgZmFyCisgKiBhYm92ZSB0aGUgbG9naWNhbCBtYXhpbXVtIGRlc2NyaWJlZCBpbiBkZXNjcmlwdG9yLiBUaGlzIGV4dGVuZHMKKyAqIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiAweDI4YyBvZiBsb2dpY2FsIG1heGltdW0gdG8gMHgxMDRkCisgKi8KK3N0YXRpYyB2b2lkIGhpZF9maXh1cF9sb2dpdGVjaF9kZXNjcmlwdG9yKHVuc2lnbmVkIGNoYXIgKnJkZXNjLCBpbnQgcnNpemUpCit7CisJaWYgKHJzaXplID49IDkwICYmIHJkZXNjWzgzXSA9PSAweDI2CisJCQkmJiByZGVzY1s4NF0gPT0gMHg4YworCQkJJiYgcmRlc2NbODVdID09IDB4MDIpIHsKKwkJaW5mbygiRml4aW5nIHVwIExvZ2l0ZWNoIGtleWJvYXJkIHJlcG9ydCBkZXNjcmlwdG9yIik7CisJCXJkZXNjWzg0XSA9IHJkZXNjWzg5XSA9IDB4NGQ7CisJCXJkZXNjWzg1XSA9IHJkZXNjWzkwXSA9IDB4MTA7CisJfQorfQorCitzdGF0aWMgc3RydWN0IGhpZF9kZXZpY2UgKnVzYl9oaWRfY29uZmlndXJlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreworCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmludGVyZmFjZSA9IGludGYtPmN1cl9hbHRzZXR0aW5nOworCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2IChpbnRmKTsKKwlzdHJ1Y3QgaGlkX2Rlc2NyaXB0b3IgKmhkZXNjOworCXN0cnVjdCBoaWRfZGV2aWNlICpoaWQ7CisJdTMyIHF1aXJrcyA9IDA7CisJdW5zaWduZWQgcnNpemUgPSAwOworCWNoYXIgKnJkZXNjOworCWludCBuLCBsZW4sIGluc2l6ZSA9IDA7CisJc3RydWN0IHVzYmhpZF9kZXZpY2UgKnVzYmhpZDsKKworCXF1aXJrcyA9IHVzYmhpZF9sb29rdXBfcXVpcmsobGUxNl90b19jcHUoZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKSwKKwkJCWxlMTZfdG9fY3B1KGRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpKTsKKworCS8qIE1hbnkga2V5Ym9hcmRzIGFuZCBtaWNlIGRvbid0IGxpa2UgdG8gYmUgcG9sbGVkIGZvciByZXBvcnRzLAorCSAqIHNvIHdlIHdpbGwgYWx3YXlzIHNldCB0aGUgSElEX1FVSVJLX05PR0VUIGZsYWcgZm9yIHRoZW0uICovCisJaWYgKGludGVyZmFjZS0+ZGVzYy5iSW50ZXJmYWNlU3ViQ2xhc3MgPT0gVVNCX0lOVEVSRkFDRV9TVUJDTEFTU19CT09UKSB7CisJCWlmIChpbnRlcmZhY2UtPmRlc2MuYkludGVyZmFjZVByb3RvY29sID09IFVTQl9JTlRFUkZBQ0VfUFJPVE9DT0xfS0VZQk9BUkQgfHwKKwkJCWludGVyZmFjZS0+ZGVzYy5iSW50ZXJmYWNlUHJvdG9jb2wgPT0gVVNCX0lOVEVSRkFDRV9QUk9UT0NPTF9NT1VTRSkKKwkJCQlxdWlya3MgfD0gSElEX1FVSVJLX05PR0VUOworCX0KKworCWlmIChxdWlya3MgJiBISURfUVVJUktfSUdOT1JFKQorCQlyZXR1cm4gTlVMTDsKKworCWlmICgocXVpcmtzICYgSElEX1FVSVJLX0lHTk9SRV9NT1VTRSkgJiYKKwkJKGludGVyZmFjZS0+ZGVzYy5iSW50ZXJmYWNlUHJvdG9jb2wgPT0gVVNCX0lOVEVSRkFDRV9QUk9UT0NPTF9NT1VTRSkpCisJCQlyZXR1cm4gTlVMTDsKKworCisJaWYgKHVzYl9nZXRfZXh0cmFfZGVzY3JpcHRvcihpbnRlcmZhY2UsIEhJRF9EVF9ISUQsICZoZGVzYykgJiYKKwkgICAgKCFpbnRlcmZhY2UtPmRlc2MuYk51bUVuZHBvaW50cyB8fAorCSAgICAgdXNiX2dldF9leHRyYV9kZXNjcmlwdG9yKCZpbnRlcmZhY2UtPmVuZHBvaW50WzBdLCBISURfRFRfSElELCAmaGRlc2MpKSkgeworCQlkYmcoImNsYXNzIGRlc2NyaXB0b3Igbm90IHByZXNlbnRcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlmb3IgKG4gPSAwOyBuIDwgaGRlc2MtPmJOdW1EZXNjcmlwdG9yczsgbisrKQorCQlpZiAoaGRlc2MtPmRlc2Nbbl0uYkRlc2NyaXB0b3JUeXBlID09IEhJRF9EVF9SRVBPUlQpCisJCQlyc2l6ZSA9IGxlMTZfdG9fY3B1KGhkZXNjLT5kZXNjW25dLndEZXNjcmlwdG9yTGVuZ3RoKTsKKworCWlmICghcnNpemUgfHwgcnNpemUgPiBISURfTUFYX0RFU0NSSVBUT1JfU0laRSkgeworCQlkYmcoIndlaXJkIHNpemUgb2YgcmVwb3J0IGRlc2NyaXB0b3IgKCV1KSIsIHJzaXplKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKCEocmRlc2MgPSBrbWFsbG9jKHJzaXplLCBHRlBfS0VSTkVMKSkpIHsKKwkJZGJnKCJjb3VsZG4ndCBhbGxvY2F0ZSByZGVzYyBtZW1vcnkiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaGlkX3NldF9pZGxlKGRldiwgaW50ZXJmYWNlLT5kZXNjLmJJbnRlcmZhY2VOdW1iZXIsIDAsIDApOworCisJaWYgKChuID0gaGlkX2dldF9jbGFzc19kZXNjcmlwdG9yKGRldiwgaW50ZXJmYWNlLT5kZXNjLmJJbnRlcmZhY2VOdW1iZXIsIEhJRF9EVF9SRVBPUlQsIHJkZXNjLCByc2l6ZSkpIDwgMCkgeworCQlkYmcoInJlYWRpbmcgcmVwb3J0IGRlc2NyaXB0b3IgZmFpbGVkIik7CisJCWtmcmVlKHJkZXNjKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKChxdWlya3MgJiBISURfUVVJUktfQ1lNT1RJT04pKQorCQloaWRfZml4dXBfY3ltb3Rpb25fZGVzY3JpcHRvcihyZGVzYywgcnNpemUpOworCisJaWYgKHF1aXJrcyAmIEhJRF9RVUlSS19MT0dJVEVDSF9ERVNDUklQVE9SKQorCQloaWRfZml4dXBfbG9naXRlY2hfZGVzY3JpcHRvcihyZGVzYywgcnNpemUpOworCisjaWZkZWYgQ09ORklHX0hJRF9ERUJVRworCXByaW50ayhLRVJOX0RFQlVHIF9fRklMRV9fICI6IHJlcG9ydCBkZXNjcmlwdG9yIChzaXplICV1LCByZWFkICVkKSA9ICIsIHJzaXplLCBuKTsKKwlmb3IgKG4gPSAwOyBuIDwgcnNpemU7IG4rKykKKwkJcHJpbnRrKCIgJTAyeCIsICh1bnNpZ25lZCBjaGFyKSByZGVzY1tuXSk7CisJcHJpbnRrKCJcbiIpOworI2VuZGlmCisKKwlpZiAoIShoaWQgPSBoaWRfcGFyc2VfcmVwb3J0KHJkZXNjLCBuKSkpIHsKKwkJZGJnKCJwYXJzaW5nIHJlcG9ydCBkZXNjcmlwdG9yIGZhaWxlZCIpOworCQlrZnJlZShyZGVzYyk7CisJCXJldHVybiBOVUxMOworCX0KKworCWtmcmVlKHJkZXNjKTsKKwloaWQtPnF1aXJrcyA9IHF1aXJrczsKKworCWlmICghKHVzYmhpZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB1c2JoaWRfZGV2aWNlKSwgR0ZQX0tFUk5FTCkpKQorCQlnb3RvIGZhaWw7CisKKwloaWQtPmRyaXZlcl9kYXRhID0gdXNiaGlkOworCXVzYmhpZC0+aGlkID0gaGlkOworCisJdXNiaGlkLT5idWZzaXplID0gSElEX01JTl9CVUZGRVJfU0laRTsKKwloaWRfZmluZF9tYXhfcmVwb3J0KGhpZCwgSElEX0lOUFVUX1JFUE9SVCwgJnVzYmhpZC0+YnVmc2l6ZSk7CisJaGlkX2ZpbmRfbWF4X3JlcG9ydChoaWQsIEhJRF9PVVRQVVRfUkVQT1JULCAmdXNiaGlkLT5idWZzaXplKTsKKwloaWRfZmluZF9tYXhfcmVwb3J0KGhpZCwgSElEX0ZFQVRVUkVfUkVQT1JULCAmdXNiaGlkLT5idWZzaXplKTsKKworCWlmICh1c2JoaWQtPmJ1ZnNpemUgPiBISURfTUFYX0JVRkZFUl9TSVpFKQorCQl1c2JoaWQtPmJ1ZnNpemUgPSBISURfTUFYX0JVRkZFUl9TSVpFOworCisJaGlkX2ZpbmRfbWF4X3JlcG9ydChoaWQsIEhJRF9JTlBVVF9SRVBPUlQsICZpbnNpemUpOworCisJaWYgKGluc2l6ZSA+IEhJRF9NQVhfQlVGRkVSX1NJWkUpCisJCWluc2l6ZSA9IEhJRF9NQVhfQlVGRkVSX1NJWkU7CisKKwlpZiAoaGlkX2FsbG9jX2J1ZmZlcnMoZGV2LCBoaWQpKSB7CisJCWhpZF9mcmVlX2J1ZmZlcnMoZGV2LCBoaWQpOworCQlnb3RvIGZhaWw7CisJfQorCisJZm9yIChuID0gMDsgbiA8IGludGVyZmFjZS0+ZGVzYy5iTnVtRW5kcG9pbnRzOyBuKyspIHsKKworCQlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVuZHBvaW50OworCQlpbnQgcGlwZTsKKwkJaW50IGludGVydmFsOworCisJCWVuZHBvaW50ID0gJmludGVyZmFjZS0+ZW5kcG9pbnRbbl0uZGVzYzsKKwkJaWYgKChlbmRwb2ludC0+Ym1BdHRyaWJ1dGVzICYgMykgIT0gMykJCS8qIE5vdCBhbiBpbnRlcnJ1cHQgZW5kcG9pbnQgKi8KKwkJCWNvbnRpbnVlOworCisJCWludGVydmFsID0gZW5kcG9pbnQtPmJJbnRlcnZhbDsKKworCQkvKiBDaGFuZ2UgdGhlIHBvbGxpbmcgaW50ZXJ2YWwgb2YgbWljZS4gKi8KKwkJaWYgKGhpZC0+Y29sbGVjdGlvbi0+dXNhZ2UgPT0gSElEX0dEX01PVVNFICYmIGhpZF9tb3VzZXBvbGxfaW50ZXJ2YWwgPiAwKQorCQkJaW50ZXJ2YWwgPSBoaWRfbW91c2Vwb2xsX2ludGVydmFsOworCisJCWlmICh1c2JfZW5kcG9pbnRfZGlyX2luKGVuZHBvaW50KSkgeworCQkJaWYgKHVzYmhpZC0+dXJiaW4pCisJCQkJY29udGludWU7CisJCQlpZiAoISh1c2JoaWQtPnVyYmluID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKSkpCisJCQkJZ290byBmYWlsOworCQkJcGlwZSA9IHVzYl9yY3ZpbnRwaXBlKGRldiwgZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MpOworCQkJdXNiX2ZpbGxfaW50X3VyYih1c2JoaWQtPnVyYmluLCBkZXYsIHBpcGUsIHVzYmhpZC0+aW5idWYsIGluc2l6ZSwKKwkJCQkJIGhpZF9pcnFfaW4sIGhpZCwgaW50ZXJ2YWwpOworCQkJdXNiaGlkLT51cmJpbi0+dHJhbnNmZXJfZG1hID0gdXNiaGlkLT5pbmJ1Zl9kbWE7CisJCQl1c2JoaWQtPnVyYmluLT50cmFuc2Zlcl9mbGFncyB8PSBVUkJfTk9fVFJBTlNGRVJfRE1BX01BUDsKKwkJfSBlbHNlIHsKKwkJCWlmICh1c2JoaWQtPnVyYm91dCkKKwkJCQljb250aW51ZTsKKwkJCWlmICghKHVzYmhpZC0+dXJib3V0ID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKSkpCisJCQkJZ290byBmYWlsOworCQkJcGlwZSA9IHVzYl9zbmRpbnRwaXBlKGRldiwgZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MpOworCQkJdXNiX2ZpbGxfaW50X3VyYih1c2JoaWQtPnVyYm91dCwgZGV2LCBwaXBlLCB1c2JoaWQtPm91dGJ1ZiwgMCwKKwkJCQkJIGhpZF9pcnFfb3V0LCBoaWQsIGludGVydmFsKTsKKwkJCXVzYmhpZC0+dXJib3V0LT50cmFuc2Zlcl9kbWEgPSB1c2JoaWQtPm91dGJ1Zl9kbWE7CisJCQl1c2JoaWQtPnVyYm91dC0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX05PX1RSQU5TRkVSX0RNQV9NQVA7CisJCX0KKwl9CisKKwlpZiAoIXVzYmhpZC0+dXJiaW4pIHsKKwkJZXJyKCJjb3VsZG4ndCBmaW5kIGFuIGlucHV0IGludGVycnVwdCBlbmRwb2ludCIpOworCQlnb3RvIGZhaWw7CisJfQorCisJaW5pdF93YWl0cXVldWVfaGVhZCgmaGlkLT53YWl0KTsKKworCUlOSVRfV09SSygmdXNiaGlkLT5yZXNldF93b3JrLCBoaWRfcmVzZXQpOworCXNldHVwX3RpbWVyKCZ1c2JoaWQtPmlvX3JldHJ5LCBoaWRfcmV0cnlfdGltZW91dCwgKHVuc2lnbmVkIGxvbmcpIGhpZCk7CisKKwlzcGluX2xvY2tfaW5pdCgmdXNiaGlkLT5pbmxvY2spOworCXNwaW5fbG9ja19pbml0KCZ1c2JoaWQtPm91dGxvY2spOworCXNwaW5fbG9ja19pbml0KCZ1c2JoaWQtPmN0cmxsb2NrKTsKKworCWhpZC0+dmVyc2lvbiA9IGxlMTZfdG9fY3B1KGhkZXNjLT5iY2RISUQpOworCWhpZC0+Y291bnRyeSA9IGhkZXNjLT5iQ291bnRyeUNvZGU7CisJaGlkLT5kZXYgPSAmaW50Zi0+ZGV2OworCXVzYmhpZC0+aW50ZiA9IGludGY7CisJdXNiaGlkLT5pZm51bSA9IGludGVyZmFjZS0+ZGVzYy5iSW50ZXJmYWNlTnVtYmVyOworCisJaGlkLT5uYW1lWzBdID0gMDsKKworCWlmIChkZXYtPm1hbnVmYWN0dXJlcikKKwkJc3RybGNweShoaWQtPm5hbWUsIGRldi0+bWFudWZhY3R1cmVyLCBzaXplb2YoaGlkLT5uYW1lKSk7CisKKwlpZiAoZGV2LT5wcm9kdWN0KSB7CisJCWlmIChkZXYtPm1hbnVmYWN0dXJlcikKKwkJCXN0cmxjYXQoaGlkLT5uYW1lLCAiICIsIHNpemVvZihoaWQtPm5hbWUpKTsKKwkJc3RybGNhdChoaWQtPm5hbWUsIGRldi0+cHJvZHVjdCwgc2l6ZW9mKGhpZC0+bmFtZSkpOworCX0KKworCWlmICghc3RybGVuKGhpZC0+bmFtZSkpCisJCXNucHJpbnRmKGhpZC0+bmFtZSwgc2l6ZW9mKGhpZC0+bmFtZSksICJISUQgJTA0eDolMDR4IiwKKwkJCSBsZTE2X3RvX2NwdShkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IpLAorCQkJIGxlMTZfdG9fY3B1KGRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpKTsKKworCWhpZC0+YnVzID0gQlVTX1VTQjsKKwloaWQtPnZlbmRvciA9IGxlMTZfdG9fY3B1KGRldi0+ZGVzY3JpcHRvci5pZFZlbmRvcik7CisJaGlkLT5wcm9kdWN0ID0gbGUxNl90b19jcHUoZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCk7CisKKwl1c2JfbWFrZV9wYXRoKGRldiwgaGlkLT5waHlzLCBzaXplb2YoaGlkLT5waHlzKSk7CisJc3RybGNhdChoaWQtPnBoeXMsICIvaW5wdXQiLCBzaXplb2YoaGlkLT5waHlzKSk7CisJbGVuID0gc3RybGVuKGhpZC0+cGh5cyk7CisJaWYgKGxlbiA8IHNpemVvZihoaWQtPnBoeXMpIC0gMSkKKwkJc25wcmludGYoaGlkLT5waHlzICsgbGVuLCBzaXplb2YoaGlkLT5waHlzKSAtIGxlbiwKKwkJCSAiJWQiLCBpbnRmLT5hbHRzZXR0aW5nWzBdLmRlc2MuYkludGVyZmFjZU51bWJlcik7CisKKwlpZiAodXNiX3N0cmluZyhkZXYsIGRldi0+ZGVzY3JpcHRvci5pU2VyaWFsTnVtYmVyLCBoaWQtPnVuaXEsIDY0KSA8PSAwKQorCQloaWQtPnVuaXFbMF0gPSAwOworCisJdXNiaGlkLT51cmJjdHJsID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXVzYmhpZC0+dXJiY3RybCkKKwkJZ290byBmYWlsOworCisJdXNiX2ZpbGxfY29udHJvbF91cmIodXNiaGlkLT51cmJjdHJsLCBkZXYsIDAsICh2b2lkICopIHVzYmhpZC0+Y3IsCisJCQkgICAgIHVzYmhpZC0+Y3RybGJ1ZiwgMSwgaGlkX2N0cmwsIGhpZCk7CisJdXNiaGlkLT51cmJjdHJsLT5zZXR1cF9kbWEgPSB1c2JoaWQtPmNyX2RtYTsKKwl1c2JoaWQtPnVyYmN0cmwtPnRyYW5zZmVyX2RtYSA9IHVzYmhpZC0+Y3RybGJ1Zl9kbWE7CisJdXNiaGlkLT51cmJjdHJsLT50cmFuc2Zlcl9mbGFncyB8PSAoVVJCX05PX1RSQU5TRkVSX0RNQV9NQVAgfCBVUkJfTk9fU0VUVVBfRE1BX01BUCk7CisJaGlkLT5oaWRpbnB1dF9pbnB1dF9ldmVudCA9IHVzYl9oaWRpbnB1dF9pbnB1dF9ldmVudDsKKwloaWQtPmhpZF9vcGVuID0gdXNiaGlkX29wZW47CisJaGlkLT5oaWRfY2xvc2UgPSB1c2JoaWRfY2xvc2U7CisjaWZkZWYgQ09ORklHX1VTQl9ISURERVYKKwloaWQtPmhpZGRldl9oaWRfZXZlbnQgPSBoaWRkZXZfaGlkX2V2ZW50OworCWhpZC0+aGlkZGV2X3JlcG9ydF9ldmVudCA9IGhpZGRldl9yZXBvcnRfZXZlbnQ7CisjZW5kaWYKKwlyZXR1cm4gaGlkOworCitmYWlsOgorCXVzYl9mcmVlX3VyYih1c2JoaWQtPnVyYmluKTsKKwl1c2JfZnJlZV91cmIodXNiaGlkLT51cmJvdXQpOworCXVzYl9mcmVlX3VyYih1c2JoaWQtPnVyYmN0cmwpOworCWhpZF9mcmVlX2J1ZmZlcnMoZGV2LCBoaWQpOworCWhpZF9mcmVlX2RldmljZShoaWQpOworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGhpZF9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreworCXN0cnVjdCBoaWRfZGV2aWNlICpoaWQgPSB1c2JfZ2V0X2ludGZkYXRhIChpbnRmKTsKKwlzdHJ1Y3QgdXNiaGlkX2RldmljZSAqdXNiaGlkOworCisJaWYgKCFoaWQpCisJCXJldHVybjsKKworCXVzYmhpZCA9IGhpZC0+ZHJpdmVyX2RhdGE7CisKKwlzcGluX2xvY2tfaXJxKCZ1c2JoaWQtPmlubG9jayk7CS8qIFN5bmMgd2l0aCBlcnJvciBoYW5kbGVyICovCisJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBOVUxMKTsKKwlzcGluX3VubG9ja19pcnEoJnVzYmhpZC0+aW5sb2NrKTsKKwl1c2Jfa2lsbF91cmIodXNiaGlkLT51cmJpbik7CisJdXNiX2tpbGxfdXJiKHVzYmhpZC0+dXJib3V0KTsKKwl1c2Jfa2lsbF91cmIodXNiaGlkLT51cmJjdHJsKTsKKworCWRlbF90aW1lcl9zeW5jKCZ1c2JoaWQtPmlvX3JldHJ5KTsKKwlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworCisJaWYgKGhpZC0+Y2xhaW1lZCAmIEhJRF9DTEFJTUVEX0lOUFVUKQorCQloaWRpbnB1dF9kaXNjb25uZWN0KGhpZCk7CisJaWYgKGhpZC0+Y2xhaW1lZCAmIEhJRF9DTEFJTUVEX0hJRERFVikKKwkJaGlkZGV2X2Rpc2Nvbm5lY3QoaGlkKTsKKworCXVzYl9mcmVlX3VyYih1c2JoaWQtPnVyYmluKTsKKwl1c2JfZnJlZV91cmIodXNiaGlkLT51cmJjdHJsKTsKKwl1c2JfZnJlZV91cmIodXNiaGlkLT51cmJvdXQpOworCisJaGlkX2ZyZWVfYnVmZmVycyhoaWRfdG9fdXNiX2RldihoaWQpLCBoaWQpOworCWhpZF9mcmVlX2RldmljZShoaWQpOworfQorCitzdGF0aWMgaW50IGhpZF9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCBoaWRfZGV2aWNlICpoaWQ7CisJY2hhciBwYXRoWzY0XTsKKwlpbnQgaTsKKwljaGFyICpjOworCisJZGJnKCJISUQgcHJvYmUgY2FsbGVkIGZvciBpZm51bSAlZCIsCisJCQlpbnRmLT5hbHRzZXR0aW5nLT5kZXNjLmJJbnRlcmZhY2VOdW1iZXIpOworCisJaWYgKCEoaGlkID0gdXNiX2hpZF9jb25maWd1cmUoaW50ZikpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXVzYmhpZF9pbml0X3JlcG9ydHMoaGlkKTsKKwloaWRfZHVtcF9kZXZpY2UoaGlkKTsKKwlpZiAoaGlkLT5xdWlya3MgJiBISURfUVVJUktfUkVTRVRfTEVEUykKKwkJdXNiaGlkX3NldF9sZWRzKGhpZCk7CisKKwlpZiAoIWhpZGlucHV0X2Nvbm5lY3QoaGlkKSkKKwkJaGlkLT5jbGFpbWVkIHw9IEhJRF9DTEFJTUVEX0lOUFVUOworCWlmICghaGlkZGV2X2Nvbm5lY3QoaGlkKSkKKwkJaGlkLT5jbGFpbWVkIHw9IEhJRF9DTEFJTUVEX0hJRERFVjsKKworCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgaGlkKTsKKworCWlmICghaGlkLT5jbGFpbWVkKSB7CisJCXByaW50ayAoIkhJRCBkZXZpY2Ugbm90IGNsYWltZWQgYnkgaW5wdXQgb3IgaGlkZGV2XG4iKTsKKwkJaGlkX2Rpc2Nvbm5lY3QoaW50Zik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmICgoaGlkLT5jbGFpbWVkICYgSElEX0NMQUlNRURfSU5QVVQpKQorCQloaWRfZmZfaW5pdChoaWQpOworCisJaWYgKGhpZC0+cXVpcmtzICYgSElEX1FVSVJLX1NPTllfUFMzX0NPTlRST0xMRVIpCisJCWhpZF9maXh1cF9zb255X3BzM19jb250cm9sbGVyKGludGVyZmFjZV90b191c2JkZXYoaW50ZiksCisJCQlpbnRmLT5jdXJfYWx0c2V0dGluZy0+ZGVzYy5iSW50ZXJmYWNlTnVtYmVyKTsKKworCXByaW50ayhLRVJOX0lORk8pOworCisJaWYgKGhpZC0+Y2xhaW1lZCAmIEhJRF9DTEFJTUVEX0lOUFVUKQorCQlwcmludGsoImlucHV0Iik7CisJaWYgKGhpZC0+Y2xhaW1lZCA9PSAoSElEX0NMQUlNRURfSU5QVVQgfCBISURfQ0xBSU1FRF9ISURERVYpKQorCQlwcmludGsoIiwiKTsKKwlpZiAoaGlkLT5jbGFpbWVkICYgSElEX0NMQUlNRURfSElEREVWKQorCQlwcmludGsoImhpZGRldiVkIiwgaGlkLT5taW5vcik7CisKKwljID0gIkRldmljZSI7CisJZm9yIChpID0gMDsgaSA8IGhpZC0+bWF4Y29sbGVjdGlvbjsgaSsrKSB7CisJCWlmIChoaWQtPmNvbGxlY3Rpb25baV0udHlwZSA9PSBISURfQ09MTEVDVElPTl9BUFBMSUNBVElPTiAmJgorCQkgICAgKGhpZC0+Y29sbGVjdGlvbltpXS51c2FnZSAmIEhJRF9VU0FHRV9QQUdFKSA9PSBISURfVVBfR0VOREVTSyAmJgorCQkgICAgKGhpZC0+Y29sbGVjdGlvbltpXS51c2FnZSAmIDB4ZmZmZikgPCBBUlJBWV9TSVpFKGhpZF90eXBlcykpIHsKKwkJCWMgPSBoaWRfdHlwZXNbaGlkLT5jb2xsZWN0aW9uW2ldLnVzYWdlICYgMHhmZmZmXTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJdXNiX21ha2VfcGF0aChpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpLCBwYXRoLCA2Myk7CisKKwlwcmludGsoIjogVVNCIEhJRCB2JXguJTAyeCAlcyBbJXNdIG9uICVzXG4iLAorCQloaWQtPnZlcnNpb24gPj4gOCwgaGlkLT52ZXJzaW9uICYgMHhmZiwgYywgaGlkLT5uYW1lLCBwYXRoKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhpZF9zdXNwZW5kKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBwbV9tZXNzYWdlX3QgbWVzc2FnZSkKK3sKKwlzdHJ1Y3QgaGlkX2RldmljZSAqaGlkID0gdXNiX2dldF9pbnRmZGF0YSAoaW50Zik7CisJc3RydWN0IHVzYmhpZF9kZXZpY2UgKnVzYmhpZCA9IGhpZC0+ZHJpdmVyX2RhdGE7CisKKwlzcGluX2xvY2tfaXJxKCZ1c2JoaWQtPmlubG9jayk7CS8qIFN5bmMgd2l0aCBlcnJvciBoYW5kbGVyICovCisJc2V0X2JpdChISURfU1VTUEVOREVELCAmdXNiaGlkLT5pb2ZsKTsKKwlzcGluX3VubG9ja19pcnEoJnVzYmhpZC0+aW5sb2NrKTsKKwlkZWxfdGltZXIoJnVzYmhpZC0+aW9fcmV0cnkpOworCXVzYl9raWxsX3VyYih1c2JoaWQtPnVyYmluKTsKKwlkZXZfZGJnKCZpbnRmLT5kZXYsICJzdXNwZW5kXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoaWRfcmVzdW1lKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreworCXN0cnVjdCBoaWRfZGV2aWNlICpoaWQgPSB1c2JfZ2V0X2ludGZkYXRhIChpbnRmKTsKKwlzdHJ1Y3QgdXNiaGlkX2RldmljZSAqdXNiaGlkID0gaGlkLT5kcml2ZXJfZGF0YTsKKwlpbnQgc3RhdHVzOworCisJY2xlYXJfYml0KEhJRF9TVVNQRU5ERUQsICZ1c2JoaWQtPmlvZmwpOworCXVzYmhpZC0+cmV0cnlfZGVsYXkgPSAwOworCXN0YXR1cyA9IGhpZF9zdGFydF9pbihoaWQpOworCWRldl9kYmcoJmludGYtPmRldiwgInJlc3VtZSBzdGF0dXMgJWRcbiIsIHN0YXR1cyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyogVHJlYXQgVVNCIHJlc2V0IHByZXR0eSBtdWNoIHRoZSBzYW1lIGFzIHN1c3BlbmQvcmVzdW1lICovCitzdGF0aWMgdm9pZCBoaWRfcHJlX3Jlc2V0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreworCS8qIEZJWE1FOiBXaGF0IGlmIHRoZSBpbnRlcmZhY2UgaXMgYWxyZWFkeSBzdXNwZW5kZWQ/ICovCisJaGlkX3N1c3BlbmQoaW50ZiwgUE1TR19PTik7Cit9CisKK3N0YXRpYyB2b2lkIGhpZF9wb3N0X3Jlc2V0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreworCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2IChpbnRmKTsKKworCWhpZF9zZXRfaWRsZShkZXYsIGludGYtPmN1cl9hbHRzZXR0aW5nLT5kZXNjLmJJbnRlcmZhY2VOdW1iZXIsIDAsIDApOworCS8qIEZJWE1FOiBBbnkgbW9yZSByZWluaXRpYWxpemF0aW9uIG5lZWRlZD8gKi8KKworCWhpZF9yZXN1bWUoaW50Zik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBoaWRfdXNiX2lkcyBbXSA9IHsKKwl7IC5tYXRjaF9mbGFncyA9IFVTQl9ERVZJQ0VfSURfTUFUQ0hfSU5UX0NMQVNTLAorCQkuYkludGVyZmFjZUNsYXNzID0gVVNCX0lOVEVSRkFDRV9DTEFTU19ISUQgfSwKKwl7IH0JCQkJCQkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLworfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRSAodXNiLCBoaWRfdXNiX2lkcyk7CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBoaWRfZHJpdmVyID0geworCS5uYW1lID0JCSJ1c2JoaWQiLAorCS5wcm9iZSA9CWhpZF9wcm9iZSwKKwkuZGlzY29ubmVjdCA9CWhpZF9kaXNjb25uZWN0LAorCS5zdXNwZW5kID0JaGlkX3N1c3BlbmQsCisJLnJlc3VtZSA9CWhpZF9yZXN1bWUsCisJLnByZV9yZXNldCA9CWhpZF9wcmVfcmVzZXQsCisJLnBvc3RfcmVzZXQgPQloaWRfcG9zdF9yZXNldCwKKwkuaWRfdGFibGUgPQloaWRfdXNiX2lkcywKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGhpZF9pbml0KHZvaWQpCit7CisJaW50IHJldHZhbDsKKwlyZXR2YWwgPSB1c2JoaWRfcXVpcmtzX2luaXQocXVpcmtzX3BhcmFtKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIHVzYmhpZF9xdWlya3NfaW5pdF9mYWlsOworCXJldHZhbCA9IGhpZGRldl9pbml0KCk7CisJaWYgKHJldHZhbCkKKwkJZ290byBoaWRkZXZfaW5pdF9mYWlsOworCXJldHZhbCA9IHVzYl9yZWdpc3RlcigmaGlkX2RyaXZlcik7CisJaWYgKHJldHZhbCkKKwkJZ290byB1c2JfcmVnaXN0ZXJfZmFpbDsKKwlpbmZvKERSSVZFUl9WRVJTSU9OICI6IiBEUklWRVJfREVTQyk7CisKKwlyZXR1cm4gMDsKK3VzYl9yZWdpc3Rlcl9mYWlsOgorCWhpZGRldl9leGl0KCk7CitoaWRkZXZfaW5pdF9mYWlsOgorCXVzYmhpZF9xdWlya3NfZXhpdCgpOwordXNiaGlkX3F1aXJrc19pbml0X2ZhaWw6CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGhpZF9leGl0KHZvaWQpCit7CisJdXNiX2RlcmVnaXN0ZXIoJmhpZF9kcml2ZXIpOworCWhpZGRldl9leGl0KCk7CisJdXNiaGlkX3F1aXJrc19leGl0KCk7Cit9CisKK21vZHVsZV9pbml0KGhpZF9pbml0KTsKK21vZHVsZV9leGl0KGhpZF9leGl0KTsKKworTU9EVUxFX0FVVEhPUihEUklWRVJfQVVUSE9SKTsKK01PRFVMRV9ERVNDUklQVElPTihEUklWRVJfREVTQyk7CitNT0RVTEVfTElDRU5TRShEUklWRVJfTElDRU5TRSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9pbnB1dC9oaWQtZmYuYyBiL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWQtZmYuYwpzaW1pbGFyaXR5IGluZGV4IDk2JQpyZW5hbWUgZnJvbSBkcml2ZXJzL3VzYi9pbnB1dC9oaWQtZmYuYwpyZW5hbWUgdG8gZHJpdmVycy9oaWQvdXNiaGlkL2hpZC1mZi5jCmluZGV4IGU0MzFmYWEuLjIzNDMxZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2lucHV0L2hpZC1mZi5jCisrKyBiL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWQtZmYuYwpAQCAtNTYsNiArNTYsNyBAQAogCXsgMHg0NmQsIDB4YzIxMSwgaGlkX2xnZmZfaW5pdCB9LCAvKiBMb2dpdGVjaCBDb3JkbGVzcyBydW1ibGUgcGFkICovCiAJeyAweDQ2ZCwgMHhjMjE5LCBoaWRfbGdmZl9pbml0IH0sIC8qIExvZ2l0ZWNoIENvcmRsZXNzIHJ1bWJsZSBwYWQgMiAqLwogCXsgMHg0NmQsIDB4YzI4MywgaGlkX2xnZmZfaW5pdCB9LCAvKiBMb2dpdGVjaCBXaW5nbWFuIEZvcmNlIDNkICovCisJeyAweDQ2ZCwgMHhjMjg2LCBoaWRfbGdmZl9pbml0IH0sIC8qIExvZ2l0ZWNoIEZvcmNlIDNEIFBybyBKb3lzdGljayAqLwogCXsgMHg0NmQsIDB4YzI5NCwgaGlkX2xnZmZfaW5pdCB9LCAvKiBMb2dpdGVjaCBGb3JtdWxhIEZvcmNlIEVYICovCiAJeyAweDQ2ZCwgMHhjMjk1LCBoaWRfbGdmZl9pbml0IH0sIC8qIExvZ2l0ZWNoIE1PTU8gZm9yY2Ugd2hlZWwgKi8KIAl7IDB4NDZkLCAweGNhMDMsIGhpZF9sZ2ZmX2luaXQgfSwgLyogTG9naXRlY2ggTU9NTyBmb3JjZSB3aGVlbCAqLwpAQCAtNjQsNiArNjUsNyBAQAogCXsgMHg4MTAsIDB4MDAwMSwgaGlkX3BsZmZfaW5pdCB9LAogI2VuZGlmCiAjaWZkZWYgQ09ORklHX1RIUlVTVE1BU1RFUl9GRgorCXsgMHg0NGYsIDB4YjMwMCwgaGlkX3RtZmZfaW5pdCB9LAogCXsgMHg0NGYsIDB4YjMwNCwgaGlkX3RtZmZfaW5pdCB9LAogI2VuZGlmCiAjaWZkZWYgQ09ORklHX1pFUk9QTFVTX0ZGCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9pbnB1dC9oaWQtbGdmZi5jIGIvZHJpdmVycy9oaWQvdXNiaGlkL2hpZC1sZ2ZmLmMKc2ltaWxhcml0eSBpbmRleCA5OCUKcmVuYW1lIGZyb20gZHJpdmVycy91c2IvaW5wdXQvaGlkLWxnZmYuYwpyZW5hbWUgdG8gZHJpdmVycy9oaWQvdXNiaGlkL2hpZC1sZ2ZmLmMKaW5kZXggZTZmM2FmMy4uOTJkMjU1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaW5wdXQvaGlkLWxnZmYuYworKysgYi9kcml2ZXJzL2hpZC91c2JoaWQvaGlkLWxnZmYuYwpAQCAtNTIsNiArNTIsNyBAQAogCXsgMHgwNDZkLCAweGMyMTEsIGZmX3J1bWJsZSB9LAogCXsgMHgwNDZkLCAweGMyMTksIGZmX3J1bWJsZSB9LAogCXsgMHgwNDZkLCAweGMyODMsIGZmX2pveXN0aWNrIH0sCisJeyAweDA0NmQsIDB4YzI4NiwgZmZfam95c3RpY2sgfSwKIAl7IDB4MDQ2ZCwgMHhjMjk0LCBmZl9qb3lzdGljayB9LAogCXsgMHgwNDZkLCAweGMyOTUsIGZmX2pveXN0aWNrIH0sCiAJeyAweDA0NmQsIDB4Y2EwMywgZmZfam95c3RpY2sgfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2lucHV0L2hpZC1waWRmZi5jIGIvZHJpdmVycy9oaWQvdXNiaGlkL2hpZC1waWRmZi5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3VzYi9pbnB1dC9oaWQtcGlkZmYuYwpyZW5hbWUgdG8gZHJpdmVycy9oaWQvdXNiaGlkL2hpZC1waWRmZi5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9pbnB1dC9oaWQtcGxmZi5jIGIvZHJpdmVycy9oaWQvdXNiaGlkL2hpZC1wbGZmLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvdXNiL2lucHV0L2hpZC1wbGZmLmMKcmVuYW1lIHRvIGRyaXZlcnMvaGlkL3VzYmhpZC9oaWQtcGxmZi5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC91c2JoaWQvaGlkLXF1aXJrcy5jIGIvZHJpdmVycy9oaWQvdXNiaGlkL2hpZC1xdWlya3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2E4NzU1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9oaWQvdXNiaGlkL2hpZC1xdWlya3MuYwpAQCAtMCwwICsxLDY4MSBAQAorLyoKKyAqICBVU0IgSElEIHF1aXJrcyBzdXBwb3J0IGZvciBMaW51eAorICoKKyAqICBDb3B5cmlnaHQgKGMpIDE5OTkgQW5kcmVhcyBHYWwKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBWb2p0ZWNoIFBhdmxpayA8dm9qdGVjaEBzdXNlLmN6PgorICogIENvcHlyaWdodCAoYykgMjAwNSBNaWNoYWVsIEhhYm91c3RhayA8bWlrZS1AY2luY2kucnIuY29tPiBmb3IgQ29uY2VwdDIsIEluYworICogIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEppcmkgS29zaW5hCisgKiAgQ29weXJpZ2h0IChjKSAyMDA3IFBhdWwgV2FsbXNsZXkKKyAqLworCisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaGlkLmg+CisKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9BNFRFQ0gJCTB4MDlkYQorI2RlZmluZSBVU0JfREVWSUNFX0lEX0E0VEVDSF9XQ1AzMlBVCTB4MDAwNgorCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfQUFTSElNQQkJMHgwNmQ2CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQUFTSElNQV9HQU1FUEFECTB4MDAyNQorI2RlZmluZSBVU0JfREVWSUNFX0lEX0FBU0hJTUFfUFJFREFUT1IJMHgwMDI2CisKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9BQ0VDQUQJCTB4MDQ2MAorI2RlZmluZSBVU0JfREVWSUNFX0lEX0FDRUNBRF9GTEFJUgkweDAwMDQKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9BQ0VDQURfMzAyCTB4MDAwOAorCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfQUlQVEVLCQkweDA4Y2EKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9BSVBURUtfMDEJCTB4MDAwMQorI2RlZmluZSBVU0JfREVWSUNFX0lEX0FJUFRFS18xMAkJMHgwMDEwCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQUlQVEVLXzIwCQkweDAwMjAKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9BSVBURUtfMjEJCTB4MDAyMQorI2RlZmluZSBVU0JfREVWSUNFX0lEX0FJUFRFS18yMgkJMHgwMDIyCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQUlQVEVLXzIzCQkweDAwMjMKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9BSVBURUtfMjQJCTB4MDAyNAorCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfQUlSQ0FCTEUJCTB4MTZDQQorI2RlZmluZSBVU0JfREVWSUNFX0lEX0FJUkNBQkxFMQkJMHgxNTAyCisKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9BTENPUgkJMHgwNThmCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQUxDT1JfVVNCUlMyMzIJMHg5NzIwCisKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9BTFBTCQkweDA0MzMKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9JQk1fR0FNRVBBRAkweDExMDEKKworI2RlZmluZSBVU0JfVkVORE9SX0lEX0FQUExFCQkweDA1YWMKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9NSUdIVFlNT1VTRQkweDAzMDQKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9GT1VOVEFJTl9BTlNJCTB4MDIwZQorI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX0ZPVU5UQUlOX0lTTwkweDAyMGYKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9HRVlTRVJfQU5TSQkweDAyMTQKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9HRVlTRVJfSVNPCTB4MDIxNQorI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUl9KSVMJMHgwMjE2CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfR0VZU0VSM19BTlNJCTB4MDIxNworI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUjNfSVNPCTB4MDIxOAorI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUjNfSklTCTB4MDIxOQorI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUjRfQU5TSQkweDAyMWEKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9HRVlTRVI0X0lTTwkweDAyMWIKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9HRVlTRVI0X0pJUwkweDAyMWMKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9GT1VOVEFJTl9UUF9PTkxZCTB4MDMwYQorI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUjFfVFBfT05MWQkweDAzMGIKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9JUgkJMHg4MjQwCisKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9BVEVOCQkweDA1NTcKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9BVEVOX1VDMTAwS00JMHgyMDA0CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVRFTl9DUzEyNFUJMHgyMjAyCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVRFTl8yUE9SVEtWTQkweDIyMDQKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9BVEVOXzRQT1JUS1ZNCTB4MjIwNQorI2RlZmluZSBVU0JfREVWSUNFX0lEX0FURU5fNFBPUlRLVk1DCTB4MjIwOAorCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfQkVMS0lOICAgICAgICAgICAweDA1MGQKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9GTElQX0tWTSAgICAgICAgIDB4MzIwMQorCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfQkVSS1NISVJFCQkweDBjOTgKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9CRVJLU0hJUkVfUENXRAkweDExNDAKKworI2RlZmluZSBVU0JfVkVORE9SX0lEX0NIRVJSWQkJMHgwNDZhCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQ0hFUlJZX0NZTU9USU9OCTB4MDAyMworCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfQ0hJQwkJMHgwNWZlCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQ0hJQ19HQU1FUEFECTB4MDAxNAorCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfQ0lEQwkJMHgxNjc3CisKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9DT0RFTUVSQ1MJCTB4MDdjMAorI2RlZmluZSBVU0JfREVWSUNFX0lEX0NPREVNRVJDU19JT1dfRklSU1QJMHgxNTAwCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQ09ERU1FUkNTX0lPV19MQVNUCTB4MTVmZgorCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfQ1lQUkVTUwkJMHgwNGI0CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQ1lQUkVTU19NT1VTRQkweDAwMDEKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9DWVBSRVNTX0hJRENPTQkweDU1MDAKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9DWVBSRVNTX1VMVFJBTU9VU0UJMHg3NDE3CisKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9ERUxMCQkweDQxM2MKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9ERUxMX1c3NjU4CTB4MjAwNQorCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfREVMT1JNRQkJMHgxMTYzCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfREVMT1JNRV9FQVJUSE1BVEUgMHgwMTAwCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfREVMT1JNRV9FTV9MVDIwCTB4MDIwMAorCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfRVNTRU5USUFMX1JFQUxJVFkJMHgwZDdmCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfRVNTRU5USUFMX1JFQUxJVFlfUDUgMHgwMTAwCisKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9HTEFCCQkweDA2YzIKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF80X1BISURHRVRTRVJWT18zMAkweDAwMzgKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF8xX1BISURHRVRTRVJWT18zMAkweDAwMzkKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF8wXzBfNF9JRl9LSVQJMHgwMDQwCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfMF8xNl8xNl9JRl9LSVQJMHgwMDQ0CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfOF84XzhfSUZfS0lUCTB4MDA0NQorI2RlZmluZSBVU0JfREVWSUNFX0lEXzBfOF83X0lGX0tJVAkweDAwNTEKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF8wXzhfOF9JRl9LSVQJMHgwMDUzCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfUEhJREdFVF9NT1RPUkNPTlRST0wJMHgwMDU4CisKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9HUklGRklOCQkweDA3N2QKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9QT1dFUk1BVEUJCTB4MDQxMAorI2RlZmluZSBVU0JfREVWSUNFX0lEX1NPVU5ES05PQgkJMHgwNEFBCisKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9HVENPCQkweDA3OGMKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzkwCQkweDAwOTAKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzEwMAkJMHgwMTAwCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT18xMDEJCTB4MDEwMQorI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fMTAzCQkweDAxMDMKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzEwNAkJMHgwMTA0CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT18xMDUJCTB4MDEwNQorI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fMTA2CQkweDAxMDYKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzEwNwkJMHgwMTA3CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT18xMDgJCTB4MDEwOAorI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fMjAwCQkweDAyMDAKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzIwMQkJMHgwMjAxCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT18yMDIJCTB4MDIwMgorI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fMjAzCQkweDAyMDMKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzIwNAkJMHgwMjA0CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT18yMDUJCTB4MDIwNQorI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fMjA2CQkweDAyMDYKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzIwNwkJMHgwMjA3CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT18zMDAJCTB4MDMwMAorI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fMzAxCQkweDAzMDEKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzMwMgkJMHgwMzAyCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT18zMDMJCTB4MDMwMworI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fMzA0CQkweDAzMDQKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzMwNQkJMHgwMzA1CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT18zMDYJCTB4MDMwNgorI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fMzA3CQkweDAzMDcKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzMwOAkJMHgwMzA4CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT18zMDkJCTB4MDMwOQorI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fNDAwCQkweDA0MDAKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzQwMQkJMHgwNDAxCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT180MDIJCTB4MDQwMgorI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fNDAzCQkweDA0MDMKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzQwNAkJMHgwNDA0CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT180MDUJCTB4MDQwNQorI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fNTAwCQkweDA1MDAKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzUwMQkJMHgwNTAxCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT181MDIJCTB4MDUwMgorI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fNTAzCQkweDA1MDMKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzUwNAkJMHgwNTA0CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT18xMDAwCQkweDEwMDAKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzEwMDEJCTB4MTAwMQorI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fMTAwMgkJMHgxMDAyCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT18xMDAzCQkweDEwMDMKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzEwMDQJCTB4MTAwNAorI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fMTAwNQkJMHgxMDA1CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT18xMDA2CQkweDEwMDYKKworI2RlZmluZSBVU0JfVkVORE9SX0lEX0hBUFAJCTB4MDc4YgorI2RlZmluZSBVU0JfREVWSUNFX0lEX1VHQ0lfRFJJVklORwkweDAwMTAKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9VR0NJX0ZMWUlORwkweDAwMjAKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9VR0NJX0ZJR0hUSU5HCTB4MDAzMAorCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfSU1BVElPTgkJMHgwNzE4CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfRElTQ19TVEFLS0EJMHhkMDAwCisKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9LQkdFQVIJCTB4MDg0ZQorI2RlZmluZSBVU0JfREVWSUNFX0lEX0tCR0VBUl9KQU1TVFVESU8JMHgxMDAxCisKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9MRAkJMHgwZjExCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfTERfQ0FTU1kJCTB4MTAwMAorI2RlZmluZSBVU0JfREVWSUNFX0lEX0xEX1BPQ0tFVENBU1NZCTB4MTAxMAorI2RlZmluZSBVU0JfREVWSUNFX0lEX0xEX01PQklMRUNBU1NZCTB4MTAyMAorI2RlZmluZSBVU0JfREVWSUNFX0lEX0xEX0pXTQkJMHgxMDgwCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfTERfRE1NUAkJMHgxMDgxCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfTERfVU1JUAkJMHgxMDkwCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfTERfWFJBWTEJCTB4MTEwMAorI2RlZmluZSBVU0JfREVWSUNFX0lEX0xEX1hSQVkyCQkweDExMDEKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9MRF9WSURFT0NPTQkweDEyMDAKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9MRF9DT00zTEFCCTB4MjAwMAorI2RlZmluZSBVU0JfREVWSUNFX0lEX0xEX1RFTEVQT1JUCTB4MjAxMAorI2RlZmluZSBVU0JfREVWSUNFX0lEX0xEX05FVFdPUktBTkFMWVNFUiAweDIwMjAKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9MRF9QT1dFUkNPTlRST0wJMHgyMDMwCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfTERfTUFDSElORVRFU1QJMHgyMDQwCisKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSAkJMHgwNDZkCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfUkVDRUlWRVIJMHhjMTAxCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfUzUxMF9SRUNFSVZFUgkweGM1MGMKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9TNTEwX1JFQ0VJVkVSXzIJMHhjNTE3CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfTVgzMDAwX1JFQ0VJVkVSCTB4YzUxMworI2RlZmluZSBVU0JfREVWSUNFX0lEX0RJTk9WT19FREdFCTB4YzcxNAorCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfTUNDCQkweDA5ZGIKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9NQ0NfUE1EMTAyNExTCTB4MDA3NgorI2RlZmluZSBVU0JfREVWSUNFX0lEX01DQ19QTUQxMjA4TFMJMHgwMDdhCisKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9NR0UJCTB4MDQ2MworI2RlZmluZSBVU0JfREVWSUNFX0lEX01HRV9VUFMJCTB4ZmZmZgorI2RlZmluZSBVU0JfREVWSUNFX0lEX01HRV9VUFMxCQkweDAwMDEKKworI2RlZmluZSBVU0JfVkVORE9SX0lEX05FQwkJMHgwNzNlCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfTkVDX1VTQl9HQU1FX1BBRAkweDAzMDEKKworI2RlZmluZSBVU0JfVkVORE9SX0lEX09OVFJBSwkJMHgwYTA3CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfT05UUkFLX0FEVTEwMAkweDAwNjQKKworI2RlZmluZSBVU0JfVkVORE9SX0lEX1BBTkpJVAkJMHgxMzRjCisKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9QQU5USEVSTE9SRAkweDA4MTAKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9QQU5USEVSTE9SRF9UV0lOX1VTQl9KT1lTVElDSwkweDAwMDEKKworI2RlZmluZSBVU0JfVkVORE9SX0lEX1BMQVlET1RDT00JMHgwYjQzCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfUExBWURPVENPTV9FTVNfVVNCSUkJMHgwMDAzCisKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9TQUlURUsJCTB4MDZhMworI2RlZmluZSBVU0JfREVWSUNFX0lEX1NBSVRFS19SVU1CTEVQQUQJMHhmZjE3CisKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9TT05ZCQkJMHgwNTRjCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfU09OWV9QUzNfQ09OVFJPTExFUgkweDAyNjgKKworI2RlZmluZSBVU0JfVkVORE9SX0lEX1NVTgkJMHgwNDMwCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfUkFSSVRBTl9LVk1fRE9OR0xFCTB4Y2RhYgorCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfVE9QTUFYCQkweDA2NjMKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9UT1BNQVhfQ09CUkFQQUQJMHgwMTAzCisKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9UVVJCT1gJCTB4MDYyYQorI2RlZmluZSBVU0JfREVWSUNFX0lEX1RVUkJPWF9LRVlCT0FSRAkweDAyMDEKKworI2RlZmluZSBVU0JfVkVORE9SX0lEX1ZFUk5JRVIJCTB4MDhmNworI2RlZmluZSBVU0JfREVWSUNFX0lEX1ZFUk5JRVJfTEFCUFJPCTB4MDAwMQorI2RlZmluZSBVU0JfREVWSUNFX0lEX1ZFUk5JRVJfR09URU1QCTB4MDAwMgorI2RlZmluZSBVU0JfREVWSUNFX0lEX1ZFUk5JRVJfU0tJUAkweDAwMDMKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9WRVJOSUVSX0NZQ0xPUFMJMHgwMDA0CisKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9XQUNPTQkJMHgwNTZhCisKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9XSVNFR1JPVVAJCTB4MDkyNQorI2RlZmluZSBVU0JfREVWSUNFX0lEXzFfUEhJREdFVFNFUlZPXzIwCTB4ODEwMQorI2RlZmluZSBVU0JfREVWSUNFX0lEXzRfUEhJREdFVFNFUlZPXzIwCTB4ODEwNAorI2RlZmluZSBVU0JfREVWSUNFX0lEXzhfOF80X0lGX0tJVAkweDgyMDEKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9RVUFEX1VTQl9KT1lQQUQJMHg4ODAwCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfRFVBTF9VU0JfSk9ZUEFECTB4ODg2NgorCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfV0lTRUdST1VQX0xURAkweDY2NzcKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9TTUFSVEpPWV9EVUFMX1BMVVMgMHg4ODAyCisKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9ZRUFMSU5LCQkweDY5OTMKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9ZRUFMSU5LX1AxS19QNEtfQjJLCTB4YjAwMQorCisvKgorICogQWxwaGFiZXRpY2FsbHkgc29ydGVkIGJsYWNrbGlzdCBieSBxdWlyayB0eXBlLgorICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGlkX2JsYWNrbGlzdCB7CisJX191MTYgaWRWZW5kb3I7CisJX191MTYgaWRQcm9kdWN0OworCV9fdTMyIHF1aXJrczsKK30gaGlkX2JsYWNrbGlzdFtdID0geworCisJeyBVU0JfVkVORE9SX0lEX0E0VEVDSCwgVVNCX0RFVklDRV9JRF9BNFRFQ0hfV0NQMzJQVSwgSElEX1FVSVJLXzJXSEVFTF9NT1VTRV9IQUNLXzcgfSwKKwl7IFVTQl9WRU5ET1JfSURfQ1lQUkVTUywgVVNCX0RFVklDRV9JRF9DWVBSRVNTX01PVVNFLCBISURfUVVJUktfMldIRUVMX01PVVNFX0hBQ0tfNSB9LAorCisJeyBVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX1JFQ0VJVkVSLCBISURfUVVJUktfQkFEX1JFTEFUSVZFX0tFWVMgfSwKKworCXsgVVNCX1ZFTkRPUl9JRF9BQVNISU1BLCBVU0JfREVWSUNFX0lEX0FBU0hJTUFfR0FNRVBBRCwgSElEX1FVSVJLX0JBRFBBRCB9LAorCXsgVVNCX1ZFTkRPUl9JRF9BQVNISU1BLCBVU0JfREVWSUNFX0lEX0FBU0hJTUFfUFJFREFUT1IsIEhJRF9RVUlSS19CQURQQUQgfSwKKwl7IFVTQl9WRU5ET1JfSURfQUxQUywgVVNCX0RFVklDRV9JRF9JQk1fR0FNRVBBRCwgSElEX1FVSVJLX0JBRFBBRCB9LAorCXsgVVNCX1ZFTkRPUl9JRF9DSElDLCBVU0JfREVWSUNFX0lEX0NISUNfR0FNRVBBRCwgSElEX1FVSVJLX0JBRFBBRCB9LAorCXsgVVNCX1ZFTkRPUl9JRF9IQVBQLCBVU0JfREVWSUNFX0lEX1VHQ0lfRFJJVklORywgSElEX1FVSVJLX0JBRFBBRCB8IEhJRF9RVUlSS19NVUxUSV9JTlBVVCB9LAorCXsgVVNCX1ZFTkRPUl9JRF9IQVBQLCBVU0JfREVWSUNFX0lEX1VHQ0lfRkxZSU5HLCBISURfUVVJUktfQkFEUEFEIHwgSElEX1FVSVJLX01VTFRJX0lOUFVUIH0sCisJeyBVU0JfVkVORE9SX0lEX0hBUFAsIFVTQl9ERVZJQ0VfSURfVUdDSV9GSUdIVElORywgSElEX1FVSVJLX0JBRFBBRCB8IEhJRF9RVUlSS19NVUxUSV9JTlBVVCB9LAorCXsgVVNCX1ZFTkRPUl9JRF9ORUMsIFVTQl9ERVZJQ0VfSURfTkVDX1VTQl9HQU1FX1BBRCwgSElEX1FVSVJLX0JBRFBBRCB9LAorCXsgVVNCX1ZFTkRPUl9JRF9TQUlURUssIFVTQl9ERVZJQ0VfSURfU0FJVEVLX1JVTUJMRVBBRCwgSElEX1FVSVJLX0JBRFBBRCB9LAorCXsgVVNCX1ZFTkRPUl9JRF9UT1BNQVgsIFVTQl9ERVZJQ0VfSURfVE9QTUFYX0NPQlJBUEFELCBISURfUVVJUktfQkFEUEFEIH0sCisJCisJeyBVU0JfVkVORE9SX0lEX0NIRVJSWSwgVVNCX0RFVklDRV9JRF9DSEVSUllfQ1lNT1RJT04sIEhJRF9RVUlSS19DWU1PVElPTiB9LAorCisJeyBVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0RJTk9WT19FREdFLCBISURfUVVJUktfRFVQTElDQVRFX1VTQUdFUyB9LAorCisJeyBVU0JfVkVORE9SX0lEX0JFTEtJTiwgVVNCX0RFVklDRV9JRF9GTElQX0tWTSwgSElEX1FVSVJLX0hJRERFViB9LAorCisJeyBVU0JfVkVORE9SX0lEX0FJUFRFSywgVVNCX0RFVklDRV9JRF9BSVBURUtfMDEsIEhJRF9RVUlSS19JR05PUkUgfSwKKwl7IFVTQl9WRU5ET1JfSURfQUlQVEVLLCBVU0JfREVWSUNFX0lEX0FJUFRFS18xMCwgSElEX1FVSVJLX0lHTk9SRSB9LAorCXsgVVNCX1ZFTkRPUl9JRF9BSVBURUssIFVTQl9ERVZJQ0VfSURfQUlQVEVLXzIwLCBISURfUVVJUktfSUdOT1JFIH0sCisJeyBVU0JfVkVORE9SX0lEX0FJUFRFSywgVVNCX0RFVklDRV9JRF9BSVBURUtfMjEsIEhJRF9RVUlSS19JR05PUkUgfSwKKwl7IFVTQl9WRU5ET1JfSURfQUlQVEVLLCBVU0JfREVWSUNFX0lEX0FJUFRFS18yMiwgSElEX1FVSVJLX0lHTk9SRSB9LAorCXsgVVNCX1ZFTkRPUl9JRF9BSVBURUssIFVTQl9ERVZJQ0VfSURfQUlQVEVLXzIzLCBISURfUVVJUktfSUdOT1JFIH0sCisJeyBVU0JfVkVORE9SX0lEX0FJUFRFSywgVVNCX0RFVklDRV9JRF9BSVBURUtfMjQsIEhJRF9RVUlSS19JR05PUkUgfSwKKwl7IFVTQl9WRU5ET1JfSURfQUlSQ0FCTEUsIFVTQl9ERVZJQ0VfSURfQUlSQ0FCTEUxLCBISURfUVVJUktfSUdOT1JFIH0sCisJeyBVU0JfVkVORE9SX0lEX0FMQ09SLCBVU0JfREVWSUNFX0lEX0FMQ09SX1VTQlJTMjMyLCBISURfUVVJUktfSUdOT1JFIH0sCisJeyBVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0lSLCBISURfUVVJUktfSUdOT1JFIH0sCisJeyBVU0JfVkVORE9SX0lEX0JFUktTSElSRSwgVVNCX0RFVklDRV9JRF9CRVJLU0hJUkVfUENXRCwgSElEX1FVSVJLX0lHTk9SRSB9LAorCXsgVVNCX1ZFTkRPUl9JRF9DSURDLCAweDAxMDMsIEhJRF9RVUlSS19JR05PUkUgfSwKKwl7IFVTQl9WRU5ET1JfSURfQ1lQUkVTUywgVVNCX0RFVklDRV9JRF9DWVBSRVNTX0hJRENPTSwgSElEX1FVSVJLX0lHTk9SRSB9LAorCXsgVVNCX1ZFTkRPUl9JRF9DWVBSRVNTLCBVU0JfREVWSUNFX0lEX0NZUFJFU1NfVUxUUkFNT1VTRSwgSElEX1FVSVJLX0lHTk9SRSB9LAorCXsgVVNCX1ZFTkRPUl9JRF9ERUxPUk1FLCBVU0JfREVWSUNFX0lEX0RFTE9STUVfRUFSVEhNQVRFLCBISURfUVVJUktfSUdOT1JFIH0sCisJeyBVU0JfVkVORE9SX0lEX0RFTE9STUUsIFVTQl9ERVZJQ0VfSURfREVMT1JNRV9FTV9MVDIwLCBISURfUVVJUktfSUdOT1JFIH0sCisJeyBVU0JfVkVORE9SX0lEX0VTU0VOVElBTF9SRUFMSVRZLCBVU0JfREVWSUNFX0lEX0VTU0VOVElBTF9SRUFMSVRZX1A1LCBISURfUVVJUktfSUdOT1JFIH0sCisJeyBVU0JfVkVORE9SX0lEX0dMQUIsIFVTQl9ERVZJQ0VfSURfNF9QSElER0VUU0VSVk9fMzAsIEhJRF9RVUlSS19JR05PUkUgfSwKKwl7IFVTQl9WRU5ET1JfSURfR0xBQiwgVVNCX0RFVklDRV9JRF8xX1BISURHRVRTRVJWT18zMCwgSElEX1FVSVJLX0lHTk9SRSB9LAorCXsgVVNCX1ZFTkRPUl9JRF9HTEFCLCBVU0JfREVWSUNFX0lEXzBfMF80X0lGX0tJVCwgSElEX1FVSVJLX0lHTk9SRSB9LAorCXsgVVNCX1ZFTkRPUl9JRF9HTEFCLCBVU0JfREVWSUNFX0lEXzBfMTZfMTZfSUZfS0lULCBISURfUVVJUktfSUdOT1JFIH0sCisJeyBVU0JfVkVORE9SX0lEX0dMQUIsIFVTQl9ERVZJQ0VfSURfOF84XzhfSUZfS0lULCBISURfUVVJUktfSUdOT1JFIH0sCisJeyBVU0JfVkVORE9SX0lEX0dMQUIsIFVTQl9ERVZJQ0VfSURfMF84XzdfSUZfS0lULCBISURfUVVJUktfSUdOT1JFIH0sCisJeyBVU0JfVkVORE9SX0lEX0dMQUIsIFVTQl9ERVZJQ0VfSURfMF84XzhfSUZfS0lULCBISURfUVVJUktfSUdOT1JFIH0sCisJeyBVU0JfVkVORE9SX0lEX0dMQUIsIFVTQl9ERVZJQ0VfSURfUEhJREdFVF9NT1RPUkNPTlRST0wsIEhJRF9RVUlSS19JR05PUkUgfSwKKwl7IFVTQl9WRU5ET1JfSURfR1JJRkZJTiwgVVNCX0RFVklDRV9JRF9QT1dFUk1BVEUsIEhJRF9RVUlSS19JR05PUkUgfSwKKwl7IFVTQl9WRU5ET1JfSURfR1JJRkZJTiwgVVNCX0RFVklDRV9JRF9TT1VOREtOT0IsIEhJRF9RVUlSS19JR05PUkUgfSwKKwl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzkwLCBISURfUVVJUktfSUdOT1JFIH0sCisJeyBVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT18xMDAsIEhJRF9RVUlSS19JR05PUkUgfSwKKwl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzEwMSwgSElEX1FVSVJLX0lHTk9SRSB9LAorCXsgVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fMTAzLCBISURfUVVJUktfSUdOT1JFIH0sCisJeyBVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT18xMDQsIEhJRF9RVUlSS19JR05PUkUgfSwKKwl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzEwNSwgSElEX1FVSVJLX0lHTk9SRSB9LAorCXsgVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fMTA2LCBISURfUVVJUktfSUdOT1JFIH0sCisJeyBVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT18xMDcsIEhJRF9RVUlSS19JR05PUkUgfSwKKwl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzEwOCwgSElEX1FVSVJLX0lHTk9SRSB9LAorCXsgVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fMjAwLCBISURfUVVJUktfSUdOT1JFIH0sCisJeyBVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT18yMDEsIEhJRF9RVUlSS19JR05PUkUgfSwKKwl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzIwMiwgSElEX1FVSVJLX0lHTk9SRSB9LAorCXsgVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fMjAzLCBISURfUVVJUktfSUdOT1JFIH0sCisJeyBVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT18yMDQsIEhJRF9RVUlSS19JR05PUkUgfSwKKwl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzIwNSwgSElEX1FVSVJLX0lHTk9SRSB9LAorCXsgVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fMjA2LCBISURfUVVJUktfSUdOT1JFIH0sCisJeyBVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT18yMDcsIEhJRF9RVUlSS19JR05PUkUgfSwKKwl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzMwMCwgSElEX1FVSVJLX0lHTk9SRSB9LAorCXsgVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fMzAxLCBISURfUVVJUktfSUdOT1JFIH0sCisJeyBVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT18zMDIsIEhJRF9RVUlSS19JR05PUkUgfSwKKwl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzMwMywgSElEX1FVSVJLX0lHTk9SRSB9LAorCXsgVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fMzA0LCBISURfUVVJUktfSUdOT1JFIH0sCisJeyBVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT18zMDUsIEhJRF9RVUlSS19JR05PUkUgfSwKKwl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzMwNiwgSElEX1FVSVJLX0lHTk9SRSB9LAorCXsgVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fMzA3LCBISURfUVVJUktfSUdOT1JFIH0sCisJeyBVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT18zMDgsIEhJRF9RVUlSS19JR05PUkUgfSwKKwl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzMwOSwgSElEX1FVSVJLX0lHTk9SRSB9LAorCXsgVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fNDAwLCBISURfUVVJUktfSUdOT1JFIH0sCisJeyBVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT180MDEsIEhJRF9RVUlSS19JR05PUkUgfSwKKwl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzQwMiwgSElEX1FVSVJLX0lHTk9SRSB9LAorCXsgVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fNDAzLCBISURfUVVJUktfSUdOT1JFIH0sCisJeyBVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT180MDQsIEhJRF9RVUlSS19JR05PUkUgfSwKKwl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzQwNSwgSElEX1FVSVJLX0lHTk9SRSB9LAorCXsgVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fNTAwLCBISURfUVVJUktfSUdOT1JFIH0sCisJeyBVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT181MDEsIEhJRF9RVUlSS19JR05PUkUgfSwKKwl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzUwMiwgSElEX1FVSVJLX0lHTk9SRSB9LAorCXsgVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fNTAzLCBISURfUVVJUktfSUdOT1JFIH0sCisJeyBVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT181MDQsIEhJRF9RVUlSS19JR05PUkUgfSwKKwl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzEwMDAsIEhJRF9RVUlSS19JR05PUkUgfSwKKwl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzEwMDEsIEhJRF9RVUlSS19JR05PUkUgfSwKKwl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzEwMDIsIEhJRF9RVUlSS19JR05PUkUgfSwKKwl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzEwMDMsIEhJRF9RVUlSS19JR05PUkUgfSwKKwl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzEwMDQsIEhJRF9RVUlSS19JR05PUkUgfSwKKwl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzEwMDUsIEhJRF9RVUlSS19JR05PUkUgfSwKKwl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzEwMDYsIEhJRF9RVUlSS19JR05PUkUgfSwKKwl7IFVTQl9WRU5ET1JfSURfSU1BVElPTiwgVVNCX0RFVklDRV9JRF9ESVNDX1NUQUtLQSwgSElEX1FVSVJLX0lHTk9SRSB9LAorCXsgVVNCX1ZFTkRPUl9JRF9LQkdFQVIsIFVTQl9ERVZJQ0VfSURfS0JHRUFSX0pBTVNUVURJTywgSElEX1FVSVJLX0lHTk9SRSB9LAorCXsgVVNCX1ZFTkRPUl9JRF9MRCwgVVNCX0RFVklDRV9JRF9MRF9DQVNTWSwgSElEX1FVSVJLX0lHTk9SRSB9LAorCXsgVVNCX1ZFTkRPUl9JRF9MRCwgVVNCX0RFVklDRV9JRF9MRF9QT0NLRVRDQVNTWSwgSElEX1FVSVJLX0lHTk9SRSB9LAorCXsgVVNCX1ZFTkRPUl9JRF9MRCwgVVNCX0RFVklDRV9JRF9MRF9NT0JJTEVDQVNTWSwgSElEX1FVSVJLX0lHTk9SRSB9LAorCXsgVVNCX1ZFTkRPUl9JRF9MRCwgVVNCX0RFVklDRV9JRF9MRF9KV00sIEhJRF9RVUlSS19JR05PUkUgfSwKKwl7IFVTQl9WRU5ET1JfSURfTEQsIFVTQl9ERVZJQ0VfSURfTERfRE1NUCwgSElEX1FVSVJLX0lHTk9SRSB9LAorCXsgVVNCX1ZFTkRPUl9JRF9MRCwgVVNCX0RFVklDRV9JRF9MRF9VTUlQLCBISURfUVVJUktfSUdOT1JFIH0sCisJeyBVU0JfVkVORE9SX0lEX0xELCBVU0JfREVWSUNFX0lEX0xEX1hSQVkxLCBISURfUVVJUktfSUdOT1JFIH0sCisJeyBVU0JfVkVORE9SX0lEX0xELCBVU0JfREVWSUNFX0lEX0xEX1hSQVkyLCBISURfUVVJUktfSUdOT1JFIH0sCisJeyBVU0JfVkVORE9SX0lEX0xELCBVU0JfREVWSUNFX0lEX0xEX1ZJREVPQ09NLCBISURfUVVJUktfSUdOT1JFIH0sCisJeyBVU0JfVkVORE9SX0lEX0xELCBVU0JfREVWSUNFX0lEX0xEX0NPTTNMQUIsIEhJRF9RVUlSS19JR05PUkUgfSwKKwl7IFVTQl9WRU5ET1JfSURfTEQsIFVTQl9ERVZJQ0VfSURfTERfVEVMRVBPUlQsIEhJRF9RVUlSS19JR05PUkUgfSwKKwl7IFVTQl9WRU5ET1JfSURfTEQsIFVTQl9ERVZJQ0VfSURfTERfTkVUV09SS0FOQUxZU0VSLCBISURfUVVJUktfSUdOT1JFIH0sCisJeyBVU0JfVkVORE9SX0lEX0xELCBVU0JfREVWSUNFX0lEX0xEX1BPV0VSQ09OVFJPTCwgSElEX1FVSVJLX0lHTk9SRSB9LAorCXsgVVNCX1ZFTkRPUl9JRF9MRCwgVVNCX0RFVklDRV9JRF9MRF9NQUNISU5FVEVTVCwgSElEX1FVSVJLX0lHTk9SRSB9LAorCXsgVVNCX1ZFTkRPUl9JRF9NQ0MsIFVTQl9ERVZJQ0VfSURfTUNDX1BNRDEwMjRMUywgSElEX1FVSVJLX0lHTk9SRSB9LAorCXsgVVNCX1ZFTkRPUl9JRF9NQ0MsIFVTQl9ERVZJQ0VfSURfTUNDX1BNRDEyMDhMUywgSElEX1FVSVJLX0lHTk9SRSB9LAorCXsgVVNCX1ZFTkRPUl9JRF9NR0UsIFVTQl9ERVZJQ0VfSURfTUdFX1VQUywgSElEX1FVSVJLX0lHTk9SRSB9LAorCXsgVVNCX1ZFTkRPUl9JRF9NR0UsIFVTQl9ERVZJQ0VfSURfTUdFX1VQUzEsIEhJRF9RVUlSS19JR05PUkUgfSwKKwl7IFVTQl9WRU5ET1JfSURfT05UUkFLLCBVU0JfREVWSUNFX0lEX09OVFJBS19BRFUxMDAsIEhJRF9RVUlSS19JR05PUkUgfSwKKwl7IFVTQl9WRU5ET1JfSURfT05UUkFLLCBVU0JfREVWSUNFX0lEX09OVFJBS19BRFUxMDAgKyAyMCwgSElEX1FVSVJLX0lHTk9SRSB9LAorCXsgVVNCX1ZFTkRPUl9JRF9PTlRSQUssIFVTQl9ERVZJQ0VfSURfT05UUkFLX0FEVTEwMCArIDMwLCBISURfUVVJUktfSUdOT1JFIH0sCisJeyBVU0JfVkVORE9SX0lEX09OVFJBSywgVVNCX0RFVklDRV9JRF9PTlRSQUtfQURVMTAwICsgMTAwLCBISURfUVVJUktfSUdOT1JFIH0sCisJeyBVU0JfVkVORE9SX0lEX09OVFJBSywgVVNCX0RFVklDRV9JRF9PTlRSQUtfQURVMTAwICsgMTA4LCBISURfUVVJUktfSUdOT1JFIH0sCisJeyBVU0JfVkVORE9SX0lEX09OVFJBSywgVVNCX0RFVklDRV9JRF9PTlRSQUtfQURVMTAwICsgMTE4LCBISURfUVVJUktfSUdOT1JFIH0sCisJeyBVU0JfVkVORE9SX0lEX09OVFJBSywgVVNCX0RFVklDRV9JRF9PTlRSQUtfQURVMTAwICsgMjAwLCBISURfUVVJUktfSUdOT1JFIH0sCisJeyBVU0JfVkVORE9SX0lEX09OVFJBSywgVVNCX0RFVklDRV9JRF9PTlRSQUtfQURVMTAwICsgMzAwLCBISURfUVVJUktfSUdOT1JFIH0sCisJeyBVU0JfVkVORE9SX0lEX09OVFJBSywgVVNCX0RFVklDRV9JRF9PTlRSQUtfQURVMTAwICsgNDAwLCBISURfUVVJUktfSUdOT1JFIH0sCisJeyBVU0JfVkVORE9SX0lEX09OVFJBSywgVVNCX0RFVklDRV9JRF9PTlRSQUtfQURVMTAwICsgNTAwLCBISURfUVVJUktfSUdOT1JFIH0sCisJeyBVU0JfVkVORE9SX0lEX1BBTkpJVCwgMHgwMDAxLCBISURfUVVJUktfSUdOT1JFIH0sCisJeyBVU0JfVkVORE9SX0lEX1BBTkpJVCwgMHgwMDAyLCBISURfUVVJUktfSUdOT1JFIH0sCisJeyBVU0JfVkVORE9SX0lEX1BBTkpJVCwgMHgwMDAzLCBISURfUVVJUktfSUdOT1JFIH0sCisJeyBVU0JfVkVORE9SX0lEX1BBTkpJVCwgMHgwMDA0LCBISURfUVVJUktfSUdOT1JFIH0sCisJeyBVU0JfVkVORE9SX0lEX1ZFUk5JRVIsIFVTQl9ERVZJQ0VfSURfVkVSTklFUl9MQUJQUk8sIEhJRF9RVUlSS19JR05PUkUgfSwKKwl7IFVTQl9WRU5ET1JfSURfVkVSTklFUiwgVVNCX0RFVklDRV9JRF9WRVJOSUVSX0dPVEVNUCwgSElEX1FVSVJLX0lHTk9SRSB9LAorCXsgVVNCX1ZFTkRPUl9JRF9WRVJOSUVSLCBVU0JfREVWSUNFX0lEX1ZFUk5JRVJfU0tJUCwgSElEX1FVSVJLX0lHTk9SRSB9LAorCXsgVVNCX1ZFTkRPUl9JRF9WRVJOSUVSLCBVU0JfREVWSUNFX0lEX1ZFUk5JRVJfQ1lDTE9QUywgSElEX1FVSVJLX0lHTk9SRSB9LAorCXsgVVNCX1ZFTkRPUl9JRF9XSVNFR1JPVVAsIFVTQl9ERVZJQ0VfSURfNF9QSElER0VUU0VSVk9fMjAsIEhJRF9RVUlSS19JR05PUkUgfSwKKwl7IFVTQl9WRU5ET1JfSURfV0lTRUdST1VQLCBVU0JfREVWSUNFX0lEXzFfUEhJREdFVFNFUlZPXzIwLCBISURfUVVJUktfSUdOT1JFIH0sCisJeyBVU0JfVkVORE9SX0lEX1dJU0VHUk9VUCwgVVNCX0RFVklDRV9JRF84XzhfNF9JRl9LSVQsIEhJRF9RVUlSS19JR05PUkUgfSwKKwl7IFVTQl9WRU5ET1JfSURfWUVBTElOSywgVVNCX0RFVklDRV9JRF9ZRUFMSU5LX1AxS19QNEtfQjJLLCBISURfUVVJUktfSUdOT1JFIH0sCisKKwl7IFVTQl9WRU5ET1JfSURfQUNFQ0FELCBVU0JfREVWSUNFX0lEX0FDRUNBRF9GTEFJUiwgSElEX1FVSVJLX0lHTk9SRSB9LAorCXsgVVNCX1ZFTkRPUl9JRF9BQ0VDQUQsIFVTQl9ERVZJQ0VfSURfQUNFQ0FEXzMwMiwgSElEX1FVSVJLX0lHTk9SRSB9LAorCisJeyBVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX01YMzAwMF9SRUNFSVZFUiwgSElEX1FVSVJLX0xPR0lURUNIX0RFU0NSSVBUT1IgfSwKKwl7IFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfUzUxMF9SRUNFSVZFUiwgSElEX1FVSVJLX0xPR0lURUNIX0RFU0NSSVBUT1IgfSwKKwl7IFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfUzUxMF9SRUNFSVZFUl8yLCBISURfUVVJUktfTE9HSVRFQ0hfREVTQ1JJUFRPUiB9LAorCisJeyBVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX01JR0hUWU1PVVNFLCBISURfUVVJUktfTUlHSFRZTU9VU0UgfCBISURfUVVJUktfSU5WRVJUX0hXSEVFTCB9LAorCisJeyBVU0JfVkVORE9SX0lEX1BBTlRIRVJMT1JELCBVU0JfREVWSUNFX0lEX1BBTlRIRVJMT1JEX1RXSU5fVVNCX0pPWVNUSUNLLCBISURfUVVJUktfTVVMVElfSU5QVVQgfCBISURfUVVJUktfU0tJUF9PVVRQVVRfUkVQT1JUUyB9LAorCXsgVVNCX1ZFTkRPUl9JRF9QTEFZRE9UQ09NLCBVU0JfREVWSUNFX0lEX1BMQVlET1RDT01fRU1TX1VTQklJLCBISURfUVVJUktfTVVMVElfSU5QVVQgfSwKKworCXsgVVNCX1ZFTkRPUl9JRF9TT05ZLCBVU0JfREVWSUNFX0lEX1NPTllfUFMzX0NPTlRST0xMRVIsIEhJRF9RVUlSS19TT05ZX1BTM19DT05UUk9MTEVSIH0sCisKKwl7IFVTQl9WRU5ET1JfSURfQVRFTiwgVVNCX0RFVklDRV9JRF9BVEVOX1VDMTAwS00sIEhJRF9RVUlSS19OT0dFVCB9LAorCXsgVVNCX1ZFTkRPUl9JRF9BVEVOLCBVU0JfREVWSUNFX0lEX0FURU5fQ1MxMjRVLCBISURfUVVJUktfTk9HRVQgfSwKKwl7IFVTQl9WRU5ET1JfSURfQVRFTiwgVVNCX0RFVklDRV9JRF9BVEVOXzJQT1JUS1ZNLCBISURfUVVJUktfTk9HRVQgfSwKKwl7IFVTQl9WRU5ET1JfSURfQVRFTiwgVVNCX0RFVklDRV9JRF9BVEVOXzRQT1JUS1ZNLCBISURfUVVJUktfTk9HRVQgfSwKKwl7IFVTQl9WRU5ET1JfSURfQVRFTiwgVVNCX0RFVklDRV9JRF9BVEVOXzRQT1JUS1ZNQywgSElEX1FVSVJLX05PR0VUIH0sCisJeyBVU0JfVkVORE9SX0lEX1NVTiwgVVNCX0RFVklDRV9JRF9SQVJJVEFOX0tWTV9ET05HTEUsIEhJRF9RVUlSS19OT0dFVCB9LAorCXsgVVNCX1ZFTkRPUl9JRF9UVVJCT1gsIFVTQl9ERVZJQ0VfSURfVFVSQk9YX0tFWUJPQVJELCBISURfUVVJUktfTk9HRVQgfSwKKwl7IFVTQl9WRU5ET1JfSURfV0lTRUdST1VQLCBVU0JfREVWSUNFX0lEX0RVQUxfVVNCX0pPWVBBRCwgSElEX1FVSVJLX05PR0VUIHwgSElEX1FVSVJLX01VTFRJX0lOUFVUIH0sCisJeyBVU0JfVkVORE9SX0lEX1dJU0VHUk9VUCwgVVNCX0RFVklDRV9JRF9RVUFEX1VTQl9KT1lQQUQsIEhJRF9RVUlSS19OT0dFVCB8IEhJRF9RVUlSS19NVUxUSV9JTlBVVCB9LAorCisJeyBVU0JfVkVORE9SX0lEX1dJU0VHUk9VUF9MVEQsIFVTQl9ERVZJQ0VfSURfU01BUlRKT1lfRFVBTF9QTFVTLCBISURfUVVJUktfTk9HRVQgfCBISURfUVVJUktfTVVMVElfSU5QVVQgfSwKKworCXsgVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9GT1VOVEFJTl9BTlNJLCBISURfUVVJUktfUE9XRVJCT09LX0hBU19GTiB8IEhJRF9RVUlSS19JR05PUkVfTU9VU0UgfSwKKwl7IFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfRk9VTlRBSU5fSVNPLCBISURfUVVJUktfUE9XRVJCT09LX0hBU19GTiB8IEhJRF9RVUlSS19JR05PUkVfTU9VU0UgfSwKKwl7IFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfR0VZU0VSX0FOU0ksIEhJRF9RVUlSS19QT1dFUkJPT0tfSEFTX0ZOIHwgSElEX1FVSVJLX0lHTk9SRV9NT1VTRSB9LAorCXsgVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9HRVlTRVJfSVNPLCBISURfUVVJUktfUE9XRVJCT09LX0hBU19GTiB8IEhJRF9RVUlSS19JR05PUkVfTU9VU0UgfCBISURfUVVJUktfUE9XRVJCT09LX0lTT19LRVlCT0FSRH0sCisJeyBVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUl9KSVMsIEhJRF9RVUlSS19QT1dFUkJPT0tfSEFTX0ZOIHwgSElEX1FVSVJLX0lHTk9SRV9NT1VTRSB9LAorCXsgVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9HRVlTRVIzX0FOU0ksIEhJRF9RVUlSS19QT1dFUkJPT0tfSEFTX0ZOIHwgSElEX1FVSVJLX0lHTk9SRV9NT1VTRSB9LAorCXsgVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9HRVlTRVIzX0lTTywgSElEX1FVSVJLX1BPV0VSQk9PS19IQVNfRk4gfCBISURfUVVJUktfSUdOT1JFX01PVVNFIHwgSElEX1FVSVJLX1BPV0VSQk9PS19JU09fS0VZQk9BUkR9LAorCXsgVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9HRVlTRVIzX0pJUywgSElEX1FVSVJLX1BPV0VSQk9PS19IQVNfRk4gfCBISURfUVVJUktfSUdOT1JFX01PVVNFIH0sCisJeyBVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUjRfQU5TSSwgSElEX1FVSVJLX1BPV0VSQk9PS19IQVNfRk4gfCBISURfUVVJUktfSUdOT1JFX01PVVNFIH0sCisJeyBVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUjRfSVNPLCBISURfUVVJUktfUE9XRVJCT09LX0hBU19GTiB8IEhJRF9RVUlSS19JR05PUkVfTU9VU0UgfCBISURfUVVJUktfUE9XRVJCT09LX0lTT19LRVlCT0FSRH0sCisJeyBVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUjRfSklTLCBISURfUVVJUktfUE9XRVJCT09LX0hBU19GTiB8IEhJRF9RVUlSS19JR05PUkVfTU9VU0UgfSwKKwl7IFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfRk9VTlRBSU5fVFBfT05MWSwgSElEX1FVSVJLX1BPV0VSQk9PS19IQVNfRk4gfCBISURfUVVJUktfSUdOT1JFX01PVVNFIH0sCisJeyBVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUjFfVFBfT05MWSwgSElEX1FVSVJLX1BPV0VSQk9PS19IQVNfRk4gfCBISURfUVVJUktfSUdOT1JFX01PVVNFIH0sCisKKwl7IFVTQl9WRU5ET1JfSURfREVMTCwgVVNCX0RFVklDRV9JRF9ERUxMX1c3NjU4LCBISURfUVVJUktfUkVTRVRfTEVEUyB9LAorCisJeyAwLCAwIH0KK307CisKKy8qIER5bmFtaWMgSElEIHF1aXJrcyBsaXN0IC0gc3BlY2lmaWVkIGF0IHJ1bnRpbWUgKi8KK3N0cnVjdCBxdWlya3NfbGlzdF9zdHJ1Y3QgeworCXN0cnVjdCBoaWRfYmxhY2tsaXN0IGhpZF9ibF9pdGVtOworCXN0cnVjdCBsaXN0X2hlYWQgbm9kZTsKK307CisKK3N0YXRpYyBMSVNUX0hFQUQoZHF1aXJrc19saXN0KTsKK3N0YXRpYyBERUNMQVJFX1JXU0VNKGRxdWlya3NfcndzZW0pOworCisvKiBSdW50aW1lICgiZHluYW1pYyIpIHF1aXJrcyBtYW5pcHVsYXRpb24gZnVuY3Rpb25zICovCisKKy8qKgorICogdXNiaGlkX2V4aXN0c19kcXVpcms6IGZpbmQgYW55IGR5bmFtaWMgcXVpcmtzIGZvciBhIFVTQiBISUQgZGV2aWNlCisgKiBAaWRWZW5kb3I6IHRoZSAxNi1iaXQgVVNCIHZlbmRvciBJRCwgaW4gbmF0aXZlIGJ5dGVvcmRlcgorICogQGlkUHJvZHVjdDogdGhlIDE2LWJpdCBVU0IgcHJvZHVjdCBJRCwgaW4gbmF0aXZlIGJ5dGVvcmRlcgorICoKKyAqIERlc2NyaXB0aW9uOgorICogICAgICAgICBTY2FucyBkcXVpcmtzX2xpc3QgZm9yIGEgbWF0Y2hpbmcgZHluYW1pYyBxdWlyayBhbmQgcmV0dXJucworICogICAgICAgICB0aGUgcG9pbnRlciB0byB0aGUgcmVsZXZhbnQgc3RydWN0IGhpZF9ibGFja2xpc3QgaWYgZm91bmQuCisgKiAgICAgICAgIE11c3QgYmUgY2FsbGVkIHdpdGggYSByZWFkIGxvY2sgaGVsZCBvbiBkcXVpcmtzX3J3c2VtLgorICoKKyAqIFJldHVybnM6IE5VTEwgaWYgbm8gcXVpcmsgZm91bmQsIHN0cnVjdCBoaWRfYmxhY2tsaXN0ICogaWYgZm91bmQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaGlkX2JsYWNrbGlzdCAqdXNiaGlkX2V4aXN0c19kcXVpcmsoY29uc3QgdTE2IGlkVmVuZG9yLAorCQljb25zdCB1MTYgaWRQcm9kdWN0KQoreworCXN0cnVjdCBxdWlya3NfbGlzdF9zdHJ1Y3QgKnE7CisJc3RydWN0IGhpZF9ibGFja2xpc3QgKmJsX2VudHJ5ID0gTlVMTDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkocSwgJmRxdWlya3NfbGlzdCwgbm9kZSkgeworCQlpZiAocS0+aGlkX2JsX2l0ZW0uaWRWZW5kb3IgPT0gaWRWZW5kb3IgJiYKKwkJCQlxLT5oaWRfYmxfaXRlbS5pZFByb2R1Y3QgPT0gaWRQcm9kdWN0KSB7CisJCQlibF9lbnRyeSA9ICZxLT5oaWRfYmxfaXRlbTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGJsX2VudHJ5ICE9IE5VTEwpCisJCWRiZygiRm91bmQgZHluYW1pYyBxdWlyayAweCV4IGZvciBVU0IgSElEIHZlbmRvciAweCVoeCBwcm9kIDB4JWh4XG4iLAorCQkJCWJsX2VudHJ5LT5xdWlya3MsIGJsX2VudHJ5LT5pZFZlbmRvciwKKwkJCQlibF9lbnRyeS0+aWRQcm9kdWN0KTsKKworCXJldHVybiBibF9lbnRyeTsKK30KKworCisvKioKKyAqIHVzYmhpZF9tb2RpZnlfZHF1aXJrOiBhZGQvcmVwbGFjZSBhIEhJRCBxdWlyaworICogQGlkVmVuZG9yOiB0aGUgMTYtYml0IFVTQiB2ZW5kb3IgSUQsIGluIG5hdGl2ZSBieXRlb3JkZXIKKyAqIEBpZFByb2R1Y3Q6IHRoZSAxNi1iaXQgVVNCIHByb2R1Y3QgSUQsIGluIG5hdGl2ZSBieXRlb3JkZXIKKyAqIEBxdWlya3M6IHRoZSB1MzIgcXVpcmtzIHZhbHVlIHRvIGFkZC9yZXBsYWNlCisgKgorICogRGVzY3JpcHRpb246CisgKiAgICAgICAgIElmIGFuIGR5bmFtaWMgcXVpcmsgZXhpc3RzIGluIG1lbW9yeSBmb3IgdGhpcyAoaWRWZW5kb3IsCisgKiAgICAgICAgIGlkUHJvZHVjdCkgcGFpciwgcmVwbGFjZSBpdHMgcXVpcmtzIHZhbHVlIHdpdGggd2hhdCB3YXMKKyAqICAgICAgICAgcHJvdmlkZWQuICBPdGhlcndpc2UsIGFkZCB0aGUgcXVpcmsgdG8gdGhlIGR5bmFtaWMgcXVpcmtzIGxpc3QuCisgKgorICogUmV0dXJuczogMCBPSywgLWVycm9yIG9uIGZhaWx1cmUuCisgKi8KK2ludCB1c2JoaWRfbW9kaWZ5X2RxdWlyayhjb25zdCB1MTYgaWRWZW5kb3IsIGNvbnN0IHUxNiBpZFByb2R1Y3QsCisJCWNvbnN0IHUzMiBxdWlya3MpCit7CisJc3RydWN0IHF1aXJrc19saXN0X3N0cnVjdCAqcV9uZXcsICpxOworCWludCBsaXN0X2VkaXRlZCA9IDA7CisKKwlpZiAoIWlkVmVuZG9yKSB7CisJCWRiZygiQ2Fubm90IGFkZCBhIHF1aXJrIHdpdGggaWRWZW5kb3IgPSAwIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXFfbmV3ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHF1aXJrc19saXN0X3N0cnVjdCksIEdGUF9LRVJORUwpOworCWlmICghcV9uZXcpIHsKKwkJZGJnKCJDb3VsZCBub3QgYWxsb2NhdGUgcXVpcmtzX2xpc3Rfc3RydWN0Iik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXFfbmV3LT5oaWRfYmxfaXRlbS5pZFZlbmRvciA9IGlkVmVuZG9yOworCXFfbmV3LT5oaWRfYmxfaXRlbS5pZFByb2R1Y3QgPSBpZFByb2R1Y3Q7CisJcV9uZXctPmhpZF9ibF9pdGVtLnF1aXJrcyA9IHF1aXJrczsKKworCWRvd25fd3JpdGUoJmRxdWlya3NfcndzZW0pOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShxLCAmZHF1aXJrc19saXN0LCBub2RlKSB7CisKKwkJaWYgKHEtPmhpZF9ibF9pdGVtLmlkVmVuZG9yID09IGlkVmVuZG9yICYmCisJCQkJcS0+aGlkX2JsX2l0ZW0uaWRQcm9kdWN0ID09IGlkUHJvZHVjdCkgeworCisJCQlsaXN0X3JlcGxhY2UoJnEtPm5vZGUsICZxX25ldy0+bm9kZSk7CisJCQlrZnJlZShxKTsKKwkJCWxpc3RfZWRpdGVkID0gMTsKKwkJCWJyZWFrOworCisJCX0KKworCX0KKworCWlmICghbGlzdF9lZGl0ZWQpCisJCWxpc3RfYWRkX3RhaWwoJnFfbmV3LT5ub2RlLCAmZHF1aXJrc19saXN0KTsKKworCXVwX3dyaXRlKCZkcXVpcmtzX3J3c2VtKTsKKworCXJldHVybiAwOworfQorCisKKy8qKgorICogdXNiaGlkX3JlbW92ZV9hbGxfZHF1aXJrczogcmVtb3ZlIGFsbCBydW50aW1lIEhJRCBxdWlya3MgZnJvbSBtZW1vcnkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgICAgICAgRnJlZSBhbGwgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCBkeW5hbWljIHF1aXJrcyAtIGNhbGxlZCBiZWZvcmUKKyAqICAgICAgICAgbW9kdWxlIHVubG9hZC4KKyAqCisgKi8KK3N0YXRpYyB2b2lkIHVzYmhpZF9yZW1vdmVfYWxsX2RxdWlya3Modm9pZCkKK3sKKwlzdHJ1Y3QgcXVpcmtzX2xpc3Rfc3RydWN0ICpxLCAqdGVtcDsKKworCWRvd25fd3JpdGUoJmRxdWlya3NfcndzZW0pOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShxLCB0ZW1wLCAmZHF1aXJrc19saXN0LCBub2RlKSB7CisJCWxpc3RfZGVsKCZxLT5ub2RlKTsKKwkJa2ZyZWUocSk7CisJfQorCXVwX3dyaXRlKCZkcXVpcmtzX3J3c2VtKTsKKworfQorCisvKiogCisgKiB1c2JoaWRfcXVpcmtzX2luaXQ6IGFwcGx5IFVTQiBISUQgcXVpcmtzIHNwZWNpZmllZCBhdCBtb2R1bGUgbG9hZCB0aW1lCisgKi8KK2ludCB1c2JoaWRfcXVpcmtzX2luaXQoY2hhciAqKnF1aXJrc19wYXJhbSkKK3sKKwl1MTYgaWRWZW5kb3IsIGlkUHJvZHVjdDsKKwl1MzIgcXVpcmtzOworCWludCBuID0gMCwgbTsKKworCWZvciAoOyBxdWlya3NfcGFyYW1bbl0gJiYgbiA8IE1BWF9VU0JISURfQk9PVF9RVUlSS1M7IG4rKykgeworCisJCW0gPSBzc2NhbmYocXVpcmtzX3BhcmFtW25dLCAiMHglaHg6MHglaHg6MHgleCIsCisJCQkJJmlkVmVuZG9yLCAmaWRQcm9kdWN0LCAmcXVpcmtzKTsKKworCQlpZiAobSAhPSAzIHx8CisJCQkJdXNiaGlkX21vZGlmeV9kcXVpcmsoaWRWZW5kb3IsIGlkUHJvZHVjdCwgcXVpcmtzKSAhPSAwKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJCSJDb3VsZCBub3QgcGFyc2UgSElEIHF1aXJrIG1vZHVsZSBwYXJhbSAlc1xuIiwKKwkJCQkJcXVpcmtzX3BhcmFtW25dKTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIHVzYmhpZF9xdWlya3NfZXhpdDogcmVsZWFzZSBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIGR5bmFtaWNfcXVpcmtzCisgKgorICogRGVzY3JpcHRpb246CisgKiAgICAgUmVsZWFzZSBhbGwgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCBkeW5hbWljIHF1aXJrcy4gIENhbGxlZCB1cG9uCisgKiAgICAgbW9kdWxlIHVubG9hZC4KKyAqCisgKiBSZXR1cm5zOiBub3RoaW5nCisgKi8KK3ZvaWQgdXNiaGlkX3F1aXJrc19leGl0KHZvaWQpCit7CisJdXNiaGlkX3JlbW92ZV9hbGxfZHF1aXJrcygpOworfQorCisvKioKKyAqIHVzYmhpZF9leGlzdHNfc3F1aXJrOiByZXR1cm4gYW55IHN0YXRpYyBxdWlya3MgZm9yIGEgVVNCIEhJRCBkZXZpY2UKKyAqIEBpZFZlbmRvcjogdGhlIDE2LWJpdCBVU0IgdmVuZG9yIElELCBpbiBuYXRpdmUgYnl0ZW9yZGVyCisgKiBAaWRQcm9kdWN0OiB0aGUgMTYtYml0IFVTQiBwcm9kdWN0IElELCBpbiBuYXRpdmUgYnl0ZW9yZGVyCisgKgorICogRGVzY3JpcHRpb246CisgKiAgICAgR2l2ZW4gYSBVU0IgdmVuZG9yIElEIGFuZCBwcm9kdWN0IElELCByZXR1cm4gYSBwb2ludGVyIHRvCisgKiAgICAgdGhlIGhpZF9ibGFja2xpc3QgZW50cnkgYXNzb2NpYXRlZCB3aXRoIHRoYXQgZGV2aWNlLgorICoKKyAqIFJldHVybnM6IHBvaW50ZXIgaWYgcXVpcmsgZm91bmQsIG9yIE5VTEwgaWYgbm8gcXVpcmtzIGZvdW5kLgorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGhpZF9ibGFja2xpc3QgKnVzYmhpZF9leGlzdHNfc3F1aXJrKGNvbnN0IHUxNiBpZFZlbmRvciwKKwkJY29uc3QgdTE2IGlkUHJvZHVjdCkKK3sKKwljb25zdCBzdHJ1Y3QgaGlkX2JsYWNrbGlzdCAqYmxfZW50cnkgPSBOVUxMOworCWludCBuID0gMDsKKworCWZvciAoOyBoaWRfYmxhY2tsaXN0W25dLmlkVmVuZG9yOyBuKyspCisJCWlmIChoaWRfYmxhY2tsaXN0W25dLmlkVmVuZG9yID09IGlkVmVuZG9yICYmCisJCQkJaGlkX2JsYWNrbGlzdFtuXS5pZFByb2R1Y3QgPT0gaWRQcm9kdWN0KQorCQkJYmxfZW50cnkgPSAmaGlkX2JsYWNrbGlzdFtuXTsKKworCWlmIChibF9lbnRyeSAhPSBOVUxMKQorCQlkYmcoIkZvdW5kIHNxdWlyayAweCV4IGZvciBVU0IgSElEIHZlbmRvciAweCVoeCBwcm9kIDB4JWh4XG4iLAorCQkJCWJsX2VudHJ5LT5xdWlya3MsIGJsX2VudHJ5LT5pZFZlbmRvciwgCisJCQkJYmxfZW50cnktPmlkUHJvZHVjdCk7CisJcmV0dXJuIGJsX2VudHJ5OworfQorCisvKioKKyAqIHVzYmhpZF9sb29rdXBfcXVpcms6IHJldHVybiBhbnkgcXVpcmtzIGFzc29jaWF0ZWQgd2l0aCBhIFVTQiBISUQgZGV2aWNlCisgKiBAaWRWZW5kb3I6IHRoZSAxNi1iaXQgVVNCIHZlbmRvciBJRCwgaW4gbmF0aXZlIGJ5dGVvcmRlcgorICogQGlkUHJvZHVjdDogdGhlIDE2LWJpdCBVU0IgcHJvZHVjdCBJRCwgaW4gbmF0aXZlIGJ5dGVvcmRlcgorICoKKyAqIERlc2NyaXB0aW9uOgorICogICAgIEdpdmVuIGEgVVNCIHZlbmRvciBJRCBhbmQgcHJvZHVjdCBJRCwgcmV0dXJuIGFueSBxdWlya3MgYXNzb2NpYXRlZAorICogICAgIHdpdGggdGhhdCBkZXZpY2UuCisgKgorICogUmV0dXJuczogYSB1MzIgcXVpcmtzIHZhbHVlLgorICovCit1MzIgdXNiaGlkX2xvb2t1cF9xdWlyayhjb25zdCB1MTYgaWRWZW5kb3IsIGNvbnN0IHUxNiBpZFByb2R1Y3QpCit7CisJdTMyIHF1aXJrcyA9IDA7CisJY29uc3Qgc3RydWN0IGhpZF9ibGFja2xpc3QgKmJsX2VudHJ5ID0gTlVMTDsKKworCS8qIElnbm9yZSBhbGwgV2Fjb20gZGV2aWNlcyAqLworCWlmIChpZFZlbmRvciA9PSBVU0JfVkVORE9SX0lEX1dBQ09NKQorCQlyZXR1cm4gSElEX1FVSVJLX0lHTk9SRTsKKworCS8qIGlnbm9yZSBhbGwgQ29kZSBNZXJjZW5hcmllcyBJT1dhcnJpb3IgZGV2aWNlcyAqLworCWlmIChpZFZlbmRvciA9PSBVU0JfVkVORE9SX0lEX0NPREVNRVJDUykKKwkJaWYgKGlkUHJvZHVjdCA+PSBVU0JfREVWSUNFX0lEX0NPREVNRVJDU19JT1dfRklSU1QgJiYKKwkJCQlpZFByb2R1Y3QgPD0gVVNCX0RFVklDRV9JRF9DT0RFTUVSQ1NfSU9XX0xBU1QpCisJCQlyZXR1cm4gSElEX1FVSVJLX0lHTk9SRTsKKworCWRvd25fcmVhZCgmZHF1aXJrc19yd3NlbSk7CisJYmxfZW50cnkgPSB1c2JoaWRfZXhpc3RzX2RxdWlyayhpZFZlbmRvciwgaWRQcm9kdWN0KTsKKwlpZiAoIWJsX2VudHJ5KQorCQlibF9lbnRyeSA9IHVzYmhpZF9leGlzdHNfc3F1aXJrKGlkVmVuZG9yLCBpZFByb2R1Y3QpOworCWlmIChibF9lbnRyeSkKKwkJcXVpcmtzID0gYmxfZW50cnktPnF1aXJrczsKKwl1cF9yZWFkKCZkcXVpcmtzX3J3c2VtKTsKKworCXJldHVybiBxdWlya3M7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2lucHV0L2hpZC10bWZmLmMgYi9kcml2ZXJzL2hpZC91c2JoaWQvaGlkLXRtZmYuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy91c2IvaW5wdXQvaGlkLXRtZmYuYwpyZW5hbWUgdG8gZHJpdmVycy9oaWQvdXNiaGlkL2hpZC10bWZmLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2lucHV0L2hpZC16cGZmLmMgYi9kcml2ZXJzL2hpZC91c2JoaWQvaGlkLXpwZmYuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy91c2IvaW5wdXQvaGlkLXpwZmYuYwpyZW5hbWUgdG8gZHJpdmVycy9oaWQvdXNiaGlkL2hpZC16cGZmLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2lucHV0L2hpZGRldi5jIGIvZHJpdmVycy9oaWQvdXNiaGlkL2hpZGRldi5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3VzYi9pbnB1dC9oaWRkZXYuYwpyZW5hbWUgdG8gZHJpdmVycy9oaWQvdXNiaGlkL2hpZGRldi5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9pbnB1dC91c2JoaWQuaCBiL2RyaXZlcnMvaGlkL3VzYmhpZC91c2JoaWQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy91c2IvaW5wdXQvdXNiaGlkLmgKcmVuYW1lIHRvIGRyaXZlcnMvaGlkL3VzYmhpZC91c2JoaWQuaApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaW5wdXQvdXNia2JkLmMgYi9kcml2ZXJzL2hpZC91c2JoaWQvdXNia2JkLmMKc2ltaWxhcml0eSBpbmRleCA5NyUKcmVuYW1lIGZyb20gZHJpdmVycy91c2IvaW5wdXQvdXNia2JkLmMKcmVuYW1lIHRvIGRyaXZlcnMvaGlkL3VzYmhpZC91c2JrYmQuYwppbmRleCAzNzQ5ZjRhLi42NWFhMTJlOCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaW5wdXQvdXNia2JkLmMKKysrIGIvZHJpdmVycy9oaWQvdXNiaGlkL3VzYmtiZC5jCkBAIC0yMjgsNiArMjI4LDcgQEAKIAlzdHJ1Y3QgdXNiX2tiZCAqa2JkOwogCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldjsKIAlpbnQgaSwgcGlwZSwgbWF4cDsKKwlpbnQgZXJyb3IgPSAtRU5PTUVNOwogCiAJaW50ZXJmYWNlID0gaWZhY2UtPmN1cl9hbHRzZXR0aW5nOwogCkBAIC0zMDYsMTUgKzMwNywxOSBAQAogCWtiZC0+bGVkLT50cmFuc2Zlcl9kbWEgPSBrYmQtPmxlZHNfZG1hOwogCWtiZC0+bGVkLT50cmFuc2Zlcl9mbGFncyB8PSAoVVJCX05PX1RSQU5TRkVSX0RNQV9NQVAgfCBVUkJfTk9fU0VUVVBfRE1BX01BUCk7CiAKLQlpbnB1dF9yZWdpc3Rlcl9kZXZpY2Uoa2JkLT5kZXYpOworCWVycm9yID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGtiZC0+ZGV2KTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gZmFpbDI7CiAKIAl1c2Jfc2V0X2ludGZkYXRhKGlmYWNlLCBrYmQpOwogCXJldHVybiAwOwogCi1mYWlsMjoJdXNiX2tiZF9mcmVlX21lbShkZXYsIGtiZCk7Ci1mYWlsMToJaW5wdXRfZnJlZV9kZXZpY2UoaW5wdXRfZGV2KTsKK2ZhaWwyOgkKKwl1c2Jfa2JkX2ZyZWVfbWVtKGRldiwga2JkKTsKK2ZhaWwxOgkKKwlpbnB1dF9mcmVlX2RldmljZShpbnB1dF9kZXYpOwogCWtmcmVlKGtiZCk7Ci0JcmV0dXJuIC1FTk9NRU07CisJcmV0dXJuIGVycm9yOwogfQogCiBzdGF0aWMgdm9pZCB1c2Jfa2JkX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9pbnB1dC91c2Jtb3VzZS5jIGIvZHJpdmVycy9oaWQvdXNiaGlkL3VzYm1vdXNlLmMKc2ltaWxhcml0eSBpbmRleCA5NSUKcmVuYW1lIGZyb20gZHJpdmVycy91c2IvaW5wdXQvdXNibW91c2UuYwpyZW5hbWUgdG8gZHJpdmVycy9oaWQvdXNiaGlkL3VzYm1vdXNlLmMKaW5kZXggNjkyZmQ2MC4uNTczNzc2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaW5wdXQvdXNibW91c2UuYworKysgYi9kcml2ZXJzL2hpZC91c2JoaWQvdXNibW91c2UuYwpAQCAtMTIwLDYgKzEyMCw3IEBACiAJc3RydWN0IHVzYl9tb3VzZSAqbW91c2U7CiAJc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2OwogCWludCBwaXBlLCBtYXhwOworCWludCBlcnJvciA9IC1FTk9NRU07CiAKIAlpbnRlcmZhY2UgPSBpbnRmLT5jdXJfYWx0c2V0dGluZzsKIApAQCAtMTg4LDE1ICsxODksMjEgQEAKIAltb3VzZS0+aXJxLT50cmFuc2Zlcl9kbWEgPSBtb3VzZS0+ZGF0YV9kbWE7CiAJbW91c2UtPmlycS0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX05PX1RSQU5TRkVSX0RNQV9NQVA7CiAKLQlpbnB1dF9yZWdpc3Rlcl9kZXZpY2UobW91c2UtPmRldik7CisJZXJyb3IgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UobW91c2UtPmRldik7CisJaWYgKGVycm9yKQorCQlnb3RvIGZhaWwzOwogCiAJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBtb3VzZSk7CiAJcmV0dXJuIDA7CiAKLWZhaWwyOgl1c2JfYnVmZmVyX2ZyZWUoZGV2LCA4LCBtb3VzZS0+ZGF0YSwgbW91c2UtPmRhdGFfZG1hKTsKLWZhaWwxOglpbnB1dF9mcmVlX2RldmljZShpbnB1dF9kZXYpOworZmFpbDM6CQorCXVzYl9mcmVlX3VyYihtb3VzZS0+aXJxKTsKK2ZhaWwyOgkKKwl1c2JfYnVmZmVyX2ZyZWUoZGV2LCA4LCBtb3VzZS0+ZGF0YSwgbW91c2UtPmRhdGFfZG1hKTsKK2ZhaWwxOgkKKwlpbnB1dF9mcmVlX2RldmljZShpbnB1dF9kZXYpOwogCWtmcmVlKG1vdXNlKTsKLQlyZXR1cm4gLUVOT01FTTsKKwlyZXR1cm4gZXJyb3I7CiB9CiAKIHN0YXRpYyB2b2lkIHVzYl9tb3VzZV9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9hbXMvYW1zLWNvcmUuYyBiL2RyaXZlcnMvaHdtb24vYW1zL2Ftcy1jb3JlLmMKaW5kZXggZjFmMGY1ZC4uZjVlYmFkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9hbXMvYW1zLWNvcmUuYworKysgYi9kcml2ZXJzL2h3bW9uL2Ftcy9hbXMtY29yZS5jCkBAIC0xNDEsMTAgKzE0MSwxMCBAQAogaW50IGFtc19zZW5zb3JfYXR0YWNoKHZvaWQpCiB7CiAJaW50IHJlc3VsdDsKLQl1MzIgKnByb3A7CisJY29uc3QgdTMyICpwcm9wOwogCiAJLyogR2V0IG9yaWVudGF0aW9uICovCi0JcHJvcCA9ICh1MzIqKWdldF9wcm9wZXJ0eShhbXNfaW5mby5vZl9ub2RlLCAib3JpZW50YXRpb24iLCBOVUxMKTsKKwlwcm9wID0gZ2V0X3Byb3BlcnR5KGFtc19pbmZvLm9mX25vZGUsICJvcmllbnRhdGlvbiIsIE5VTEwpOwogCWlmICghcHJvcCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAJYW1zX2luZm8ub3JpZW50MSA9ICpwcm9wOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9hbXMvYW1zLWkyYy5jIGIvZHJpdmVycy9od21vbi9hbXMvYW1zLWkyYy5jCmluZGV4IDBkMjRiZGYuLjQ4NWQzMzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vYW1zL2Ftcy1pMmMuYworKysgYi9kcml2ZXJzL2h3bW9uL2Ftcy9hbXMtaTJjLmMKQEAgLTI2Myw3ICsyNjMsNyBAQAogewogCWNoYXIgKnRtcF9idXM7CiAJaW50IHJlc3VsdDsKLQl1MzIgKnByb3A7CisJY29uc3QgdTMyICpwcm9wOwogCiAJbXV0ZXhfbG9jaygmYW1zX2luZm8ubG9jayk7CiAKQEAgLTI3Niw3ICsyNzYsNyBAQAogCWFtc19pbmZvLmJ1c3R5cGUgPSBCVVNfSTJDOwogCiAJLyogbG9vayBmb3IgYnVzIGVpdGhlciB1c2luZyAicmVnIiBvciBieSBwYXRoICovCi0JcHJvcCA9ICh1MzIqKWdldF9wcm9wZXJ0eShhbXNfaW5mby5vZl9ub2RlLCAicmVnIiwgTlVMTCk7CisJcHJvcCA9IGdldF9wcm9wZXJ0eShhbXNfaW5mby5vZl9ub2RlLCAicmVnIiwgTlVMTCk7CiAJaWYgKCFwcm9wKSB7CiAJCXJlc3VsdCA9IC1FTk9ERVY7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vYW1zL2Ftcy1wbXUuYyBiL2RyaXZlcnMvaHdtb24vYW1zL2Ftcy1wbXUuYwppbmRleCA0NjM2YWUwLi4xYjAxYzIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2Ftcy9hbXMtcG11LmMKKysrIGIvZHJpdmVycy9od21vbi9hbXMvYW1zLXBtdS5jCkBAIC0xNDYsNyArMTQ2LDcgQEAKIAogaW50IF9faW5pdCBhbXNfcG11X2luaXQoc3RydWN0IGRldmljZV9ub2RlICpucCkKIHsKLQl1MzIgKnByb3A7CisJY29uc3QgdTMyICpwcm9wOwogCWludCByZXN1bHQ7CiAKIAltdXRleF9sb2NrKCZhbXNfaW5mby5sb2NrKTsKQEAgLTE2MCw3ICsxNjAsNyBAQAogCWFtc19pbmZvLmJ1c3R5cGUgPSBCVVNfSE9TVDsKIAogCS8qIEdldCBQTVUgY29tbWFuZCwgc2hvdWxkIGJlIDB4NGUsIGJ1dCB3ZSBjYW4gbmV2ZXIga25vdyAqLwotCXByb3AgPSAodTMyKilnZXRfcHJvcGVydHkoYW1zX2luZm8ub2Zfbm9kZSwgInJlZyIsIE5VTEwpOworCXByb3AgPSBnZXRfcHJvcGVydHkoYW1zX2luZm8ub2Zfbm9kZSwgInJlZyIsIE5VTEwpOwogCWlmICghcHJvcCkgewogCQlyZXN1bHQgPSAtRU5PREVWOwogCQlnb3RvIGV4aXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtcHJvYy5jIGIvZHJpdmVycy9pZGUvaWRlLXByb2MuYwppbmRleCBhZmI3MWM2Li5hOWUwYjMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtcHJvYy5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS1wcm9jLmMKQEAgLTMxMCwxNCArMzEwLDEyIEBACiAJaWRlX2RyaXZlcl90CSppZGVfZHJ2OwogCWludAkJbGVuOwogCi0JZG93bl9yZWFkKCZkZXYtPmJ1cy0+c3Vic3lzLnJ3c2VtKTsKIAlpZiAoZGV2LT5kcml2ZXIpIHsKIAkJaWRlX2RydiA9IGNvbnRhaW5lcl9vZihkZXYtPmRyaXZlciwgaWRlX2RyaXZlcl90LCBnZW5fZHJpdmVyKTsKIAkJbGVuID0gc3ByaW50ZihwYWdlLCAiJXMgdmVyc2lvbiAlc1xuIiwKIAkJCQlkZXYtPmRyaXZlci0+bmFtZSwgaWRlX2Rydi0+dmVyc2lvbik7CiAJfSBlbHNlCiAJCWxlbiA9IHNwcmludGYocGFnZSwgImlkZS1kZWZhdWx0IHZlcnNpb24gMC45Lm5ld2lkZVxuIik7Ci0JdXBfcmVhZCgmZGV2LT5idXMtPnN1YnN5cy5yd3NlbSk7CiAJUFJPQ19JREVfUkVBRF9SRVRVUk4ocGFnZSxzdGFydCxvZmYsY291bnQsZW9mLGxlbik7CiB9CiAKQEAgLTMyNyw3ICszMjUsNiBAQAogCWludCByZXQgPSAxOwogCWludCBlcnI7CiAKLQlkb3duX3dyaXRlKCZkZXYtPmJ1cy0+c3Vic3lzLnJ3c2VtKTsKIAlkZXZpY2VfcmVsZWFzZV9kcml2ZXIoZGV2KTsKIAkvKiBGSVhNRTogZGV2aWNlIGNhbiBzdGlsbCBiZSBpbiB1c2UgYnkgcHJldmlvdXMgZHJpdmVyICovCiAJc3RybGNweShkcml2ZS0+ZHJpdmVyX3JlcSwgZHJpdmVyLCBzaXplb2YoZHJpdmUtPmRyaXZlcl9yZXEpKTsKQEAgLTM0NSw3ICszNDIsNiBAQAogCX0KIAlpZiAoZGV2LT5kcml2ZXIgJiYgIXN0cmNtcChkZXYtPmRyaXZlci0+bmFtZSwgZHJpdmVyKSkKIAkJcmV0ID0gMDsKLQl1cF93cml0ZSgmZGV2LT5idXMtPnN1YnN5cy5yd3NlbSk7CiAKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC9LY29uZmlnIGIvZHJpdmVycy9pZWVlMTM5NC9LY29uZmlnCmluZGV4IGNkODRhNTUuLjYxZDc4MDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWVlZTEzOTQvS2NvbmZpZworKysgYi9kcml2ZXJzL2llZWUxMzk0L0tjb25maWcKQEAgLTEsMTEgKzEsOCBAQAotIyAtKi0gc2hlbGwtc2NyaXB0IC0qLQotCiBtZW51ICJJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0IgogCiBjb25maWcgSUVFRTEzOTQKIAl0cmlzdGF0ZSAiSUVFRSAxMzk0IChGaXJlV2lyZSkgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFBDSSB8fCBCUk9LRU4KLQlzZWxlY3QgTkVUCiAJaGVscAogCSAgSUVFRSAxMzk0IGRlc2NyaWJlcyBhIGhpZ2ggcGVyZm9ybWFuY2Ugc2VyaWFsIGJ1cywgd2hpY2ggaXMgYWxzbwogCSAga25vd24gYXMgRmlyZVdpcmUodG0pIG9yIGkuTGluayh0bSkgYW5kIGlzIHVzZWQgZm9yIGNvbm5lY3RpbmcgYWxsCkBAIC0zNSwyNCArMzIsNyBAQAogCSAgU2F5IFkgaWYgeW91IHJlYWxseSB3YW50IG9yIG5lZWQgdGhlIGRlYnVnZ2luZyBvdXRwdXQsIGV2ZXJ5b25lCiAJICBlbHNlIHNheXMgTi4KIAotY29uZmlnIElFRUUxMzk0X0VYVFJBX0NPTkZJR19ST01TCi0JYm9vbCAiQnVpbGQgaW4gZXh0cmEgY29uZmlnIHJvbSBlbnRyaWVzIGZvciBjZXJ0YWluIGZ1bmN0aW9uYWxpdHkiCi0JZGVwZW5kcyBvbiBJRUVFMTM5NAotCWhlbHAKLQkgIFNvbWUgSUVFRTEzOTQgZnVuY3Rpb25hbGl0eSBkZXBlbmRzIG9uIGV4dHJhIGNvbmZpZyByb20gZW50cmllcwotCSAgYmVpbmcgYXZhaWxhYmxlIGluIHRoZSBob3N0IGFkYXB0ZXJzIENTUi4gVGhlc2Ugb3B0aW9ucyB3aWxsCi0JICBhbGxvdyB5b3UgdG8gY2hvb3NlIHdoaWNoIG9uZXMuCi0KLWNvbmZpZyBJRUVFMTM5NF9DT05GSUdfUk9NX0lQMTM5NAotCWJvb2wgIklQLTEzOTQgRW50cnkiCi0JZGVwZW5kcyBvbiBJRUVFMTM5NF9FWFRSQV9DT05GSUdfUk9NUyAmJiBJRUVFMTM5NAotCWhlbHAKLQkgIEFkZHMgYW4gZW50cnkgZm9yIHVzaW5nIElQLW92ZXItMTM5NC4gSWYgeW91IHdhbnQgdG8gdXNlIHlvdXIKLQkgIElFRUUxMzk0IGJ1cyBhcyBhIG5ldHdvcmsgZm9yIElQIHN5c3RlbXMgKGluY2x1ZGluZyBpbnRlcmFjdGluZwotCSAgd2l0aCBNYWNPU1ggYW5kIFdpblhQIElQLW92ZXItMTM5NCksIGVuYWJsZSB0aGlzIG9wdGlvbiBhbmQgdGhlCi0JICBldGgxMzk0IG9wdGlvbiBiZWxvdy4KLQotY29tbWVudCAiRGV2aWNlIERyaXZlcnMiCitjb21tZW50ICJDb250cm9sbGVycyIKIAlkZXBlbmRzIG9uIElFRUUxMzk0CiAKIGNvbW1lbnQgIlRleGFzIEluc3RydW1lbnRzIFBDSUx5bnggcmVxdWlyZXMgSTJDIgpAQCAtNzAsNiArNTAsMTAgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIHNheSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHBjaWx5bnguCiAKKwkgIE9ubHkgc29tZSBvbGQgYW5kIG5vdyB2ZXJ5IHJhcmUgUENJIGFuZCBDYXJkQnVzIGNhcmRzIGFuZAorCSAgUG93ZXJNYWNzIEczIEImVyBjb250YWluIHRoZSBQQ0lMeW54IGNvbnRyb2xsZXIuICBUaGVyZWZvcmUKKwkgIGFsbW9zdCBldmVyeWJvZHkgY2FuIHNheSBOIGhlcmUuCisKIGNvbmZpZyBJRUVFMTM5NF9PSENJMTM5NAogCXRyaXN0YXRlICJPSENJLTEzOTQgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFBDSSAmJiBJRUVFMTM5NApAQCAtODMsNyArNjcsNyBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgc2F5IE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgb2hjaTEzOTQuCiAKLWNvbW1lbnQgIlByb3RvY29sIERyaXZlcnMiCitjb21tZW50ICJQcm90b2NvbHMiCiAJZGVwZW5kcyBvbiBJRUVFMTM5NAogCiBjb25maWcgSUVFRTEzOTRfVklERU8xMzk0CkBAIC0xMjEsMTEgKzEwNSwxNSBAQAogCSAgVGhpcyBvcHRpb24gaXMgYnVnZ3kgYW5kIGN1cnJlbnRseSBicm9rZW4gb24gc29tZSBhcmNoaXRlY3R1cmVzLgogCSAgSWYgdW5zdXJlLCBzYXkgTi4KIAorY29uZmlnIElFRUUxMzk0X0VUSDEzOTRfUk9NX0VOVFJZCisJZGVwZW5kcyBvbiBJRUVFMTM5NAorCWJvb2wKKwlkZWZhdWx0IG4KKwogY29uZmlnIElFRUUxMzk0X0VUSDEzOTQKLQl0cmlzdGF0ZSAiRXRoZXJuZXQgb3ZlciAxMzk0IgorCXRyaXN0YXRlICJJUCBvdmVyIDEzOTQiCiAJZGVwZW5kcyBvbiBJRUVFMTM5NCAmJiBFWFBFUklNRU5UQUwgJiYgSU5FVAotCXNlbGVjdCBJRUVFMTM5NF9DT05GSUdfUk9NX0lQMTM5NAotCXNlbGVjdCBJRUVFMTM5NF9FWFRSQV9DT05GSUdfUk9NUworCXNlbGVjdCBJRUVFMTM5NF9FVEgxMzk0X1JPTV9FTlRSWQogCWhlbHAKIAkgIFRoaXMgZHJpdmVyIGltcGxlbWVudHMgYSBmdW5jdGlvbmFsIG1ham9yaXR5IG9mIFJGQyAyNzM0OiBJUHY0IG92ZXIKIAkgIDEzOTQuICBJdCB3aWxsIHByb3ZpZGUgSVAgY29ubmVjdGl2aXR5IHdpdGggaW1wbGVtZW50YXRpb25zIG9mIFJGQwpAQCAtMTM0LDYgKzEyMiw4IEBACiAJICBUaGlzIGRyaXZlciBpcyBzdGlsbCBjb25zaWRlcmVkIGV4cGVyaW1lbnRhbC4gIEl0IGRvZXMgbm90IHlldCBzdXBwb3J0CiAJICBNQ0FQLCB0aGVyZWZvcmUgbXVsdGljYXN0IHN1cHBvcnQgaXMgc2lnbmlmaWNhbnRseSBsaW1pdGVkLgogCisJICBUaGUgbW9kdWxlIGlzIGNhbGxlZCBldGgxMzk0IGFsdGhvdWdoIGl0IGRvZXMgbm90IGVtdWxhdGUgRXRoZXJuZXQuCisKIGNvbmZpZyBJRUVFMTM5NF9EVjEzOTQKIAl0cmlzdGF0ZSAiT0hDSS1EViBJL08gc3VwcG9ydCAoZGVwcmVjYXRlZCkiCiAJZGVwZW5kcyBvbiBJRUVFMTM5NCAmJiBJRUVFMTM5NF9PSENJMTM5NApAQCAtMTQ2LDEyICsxMzYsMTIgQEAKIAl0cmlzdGF0ZSAiUmF3IElFRUUxMzk0IEkvTyBzdXBwb3J0IgogCWRlcGVuZHMgb24gSUVFRTEzOTQKIAloZWxwCi0JICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHN1cHBvcnQgZm9yIHRoZSByYXcgZGV2aWNlLiBUaGlzIGlzIGdlbmVyYWxseQotCSAgYSBnb29kIGlkZWEsIHNvIHlvdSBzaG91bGQgc2F5IFkgaGVyZS4gVGhlIHJhdyBkZXZpY2UgZW5hYmxlcwotCSAgZGlyZWN0IGNvbW11bmljYXRpb24gb2YgdXNlciBwcm9ncmFtcyB3aXRoIHRoZSBJRUVFIDEzOTQgYnVzIGFuZAotCSAgdGh1cyB3aXRoIHRoZSBhdHRhY2hlZCBwZXJpcGhlcmFscy4KKwkgIFRoaXMgb3B0aW9uIGFkZHMgc3VwcG9ydCBmb3IgdGhlIHJhdzEzOTQgZGV2aWNlIGZpbGUgd2hpY2ggZW5hYmxlcworCSAgZGlyZWN0IGNvbW11bmljYXRpb24gb2YgdXNlciBwcm9ncmFtcyB3aXRoIHRoZSBJRUVFIDEzOTQgYnVzIGFuZCB0aHVzCisJICB3aXRoIHRoZSBhdHRhY2hlZCBwZXJpcGhlcmFscy4gIEFsbW9zdCBhbGwgYXBwbGljYXRpb24gcHJvZ3JhbXMgd2hpY2gKKwkgIGFjY2VzcyBGaXJlV2lyZSByZXF1aXJlIHRoaXMgb3B0aW9uLgogCi0JICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBzYXkgTSBoZXJlOiB0aGUKLQkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCByYXcxMzk0LgorCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgc2F5IE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlCisJICBjYWxsZWQgcmF3MTM5NC4KIAogZW5kbWVudQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC9jb25maWdfcm9tcy5jIGIvZHJpdmVycy9pZWVlMTM5NC9jb25maWdfcm9tcy5jCmluZGV4IGUyZGU2ZmEuLjFiOTgxMjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWVlZTEzOTQvY29uZmlnX3JvbXMuYworKysgYi9kcml2ZXJzL2llZWUxMzk0L2NvbmZpZ19yb21zLmMKQEAgLTI2LDEyICsyNiw2IEBACiAJLyogQmFzZSBpbml0aWFsaXphdGlvbiwgY2FsbGVkIGF0IG1vZHVsZSBsb2FkICovCiAJaW50ICgqaW5pdCkodm9pZCk7CiAKLQkvKiBBZGQgZW50cnkgdG8gc3BlY2lmaWVkIGhvc3QgKi8KLQlpbnQgKCphZGQpKHN0cnVjdCBocHNiX2hvc3QgKmhvc3QpOwotCi0JLyogUmVtb3ZlIGVudHJ5IGZyb20gc3BlY2lmaWVkIGhvc3QgKi8KLQl2b2lkICgqcmVtb3ZlKShzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0KTsKLQogCS8qIENsZWFudXAgY2FsbGVkIGF0IG1vZHVsZSBleGl0ICovCiAJdm9pZCAoKmNsZWFudXApKHZvaWQpOwogCkBAIC0zOSw3ICszMyw3IEBACiAJdW5zaWduZWQgaW50IGZsYWc7CiB9OwogCi0KKy8qIFRoZSBkZWZhdWx0IGhvc3QgZW50cnkuIFRoaXMgbXVzdCBzdWNjZWVkLiAqLwogaW50IGhwc2JfZGVmYXVsdF9ob3N0X2VudHJ5KHN0cnVjdCBocHNiX2hvc3QgKmhvc3QpCiB7CiAJc3RydWN0IGNzcjEyMTJfa2V5dmFsICpyb290OwpAQCAtNjMsOSArNTcsOSBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQlyZXQgPSBjc3IxMjEyX2Fzc29jaWF0ZV9rZXl2YWwodmVuZF9pZCwgdGV4dCk7CisJY3NyMTIxMl9hc3NvY2lhdGVfa2V5dmFsKHZlbmRfaWQsIHRleHQpOwogCWNzcjEyMTJfcmVsZWFzZV9rZXl2YWwodGV4dCk7Ci0JcmV0IHw9IGNzcjEyMTJfYXR0YWNoX2tleXZhbF90b19kaXJlY3Rvcnkocm9vdCwgdmVuZF9pZCk7CisJcmV0ID0gY3NyMTIxMl9hdHRhY2hfa2V5dmFsX3RvX2RpcmVjdG9yeShyb290LCB2ZW5kX2lkKTsKIAljc3IxMjEyX3JlbGVhc2Vfa2V5dmFsKHZlbmRfaWQpOwogCWlmIChyZXQgIT0gQ1NSMTIxMl9TVUNDRVNTKSB7CiAJCWNzcjEyMTJfZGVzdHJveV9jc3IoaG9zdC0+Y3NyLnJvbSk7CkBAIC03OCw3ICs3Miw3IEBACiB9CiAKIAotI2lmZGVmIENPTkZJR19JRUVFMTM5NF9DT05GSUdfUk9NX0lQMTM5NAorI2lmZGVmIENPTkZJR19JRUVFMTM5NF9FVEgxMzk0X1JPTV9FTlRSWQogI2luY2x1ZGUgImV0aDEzOTQuaCIKIAogc3RhdGljIHN0cnVjdCBjc3IxMjEyX2tleXZhbCAqaXAxMzk0X3VkOwpAQCAtMTAzLDEwICs5NywxMiBAQAogCWlmICghaXAxMzk0X3VkIHx8ICFzcGVjX2lkIHx8ICFzcGVjX2Rlc2MgfHwgIXZlciB8fCAhdmVyX2Rlc2MpCiAJCWdvdG8gaXAxMzk0X2ZhaWw7CiAKLQlpZiAoY3NyMTIxMl9hc3NvY2lhdGVfa2V5dmFsKHNwZWNfaWQsIHNwZWNfZGVzYykgPT0gQ1NSMTIxMl9TVUNDRVNTICYmCi0JICAgIGNzcjEyMTJfYXNzb2NpYXRlX2tleXZhbCh2ZXIsIHZlcl9kZXNjKSA9PSBDU1IxMjEyX1NVQ0NFU1MgJiYKLQkgICAgY3NyMTIxMl9hdHRhY2hfa2V5dmFsX3RvX2RpcmVjdG9yeShpcDEzOTRfdWQsIHNwZWNfaWQpID09IENTUjEyMTJfU1VDQ0VTUyAmJgotCSAgICBjc3IxMjEyX2F0dGFjaF9rZXl2YWxfdG9fZGlyZWN0b3J5KGlwMTM5NF91ZCwgdmVyKSA9PSBDU1IxMjEyX1NVQ0NFU1MpCisJY3NyMTIxMl9hc3NvY2lhdGVfa2V5dmFsKHNwZWNfaWQsIHNwZWNfZGVzYyk7CisJY3NyMTIxMl9hc3NvY2lhdGVfa2V5dmFsKHZlciwgdmVyX2Rlc2MpOworCWlmIChjc3IxMjEyX2F0dGFjaF9rZXl2YWxfdG9fZGlyZWN0b3J5KGlwMTM5NF91ZCwgc3BlY19pZCkKKwkJCT09IENTUjEyMTJfU1VDQ0VTUyAmJgorCSAgICBjc3IxMjEyX2F0dGFjaF9rZXl2YWxfdG9fZGlyZWN0b3J5KGlwMTM5NF91ZCwgdmVyKQorCQkJPT0gQ1NSMTIxMl9TVUNDRVNTKQogCQlyZXQgPSAwOwogCiBpcDEzOTRfZmFpbDoKQEAgLTEzNSw3ICsxMzEsNyBAQAogCX0KIH0KIAotc3RhdGljIGludCBjb25maWdfcm9tX2lwMTM5NF9hZGQoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCkKK2ludCBocHNiX2NvbmZpZ19yb21faXAxMzk0X2FkZChzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0KQogewogCWlmICghaXAxMzk0X3VkKQogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTE0NCw5MiArMTQwLDU1IEBACiAJCQkJCSAgICAgICBpcDEzOTRfdWQpICE9IENTUjEyMTJfU1VDQ0VTUykKIAkJcmV0dXJuIC1FTk9NRU07CiAKKwlob3N0LT5jb25maWdfcm9tcyB8PSBIUFNCX0NPTkZJR19ST01fRU5UUllfSVAxMzk0OworCWhvc3QtPnVwZGF0ZV9jb25maWdfcm9tID0gMTsKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGhwc2JfY29uZmlnX3JvbV9pcDEzOTRfYWRkKTsKIAotc3RhdGljIHZvaWQgY29uZmlnX3JvbV9pcDEzOTRfcmVtb3ZlKHN0cnVjdCBocHNiX2hvc3QgKmhvc3QpCit2b2lkIGhwc2JfY29uZmlnX3JvbV9pcDEzOTRfcmVtb3ZlKHN0cnVjdCBocHNiX2hvc3QgKmhvc3QpCiB7CiAJY3NyMTIxMl9kZXRhY2hfa2V5dmFsX2Zyb21fZGlyZWN0b3J5KGhvc3QtPmNzci5yb20tPnJvb3Rfa3YsIGlwMTM5NF91ZCk7CisJaG9zdC0+Y29uZmlnX3JvbXMgJj0gfkhQU0JfQ09ORklHX1JPTV9FTlRSWV9JUDEzOTQ7CisJaG9zdC0+dXBkYXRlX2NvbmZpZ19yb20gPSAxOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoaHBzYl9jb25maWdfcm9tX2lwMTM5NF9yZW1vdmUpOwogCiBzdGF0aWMgc3RydWN0IGhwc2JfY29uZmlnX3JvbV9lbnRyeSBpcDEzOTRfZW50cnkgPSB7CiAJLm5hbWUJCT0gImlwMTM5NCIsCiAJLmluaXQJCT0gY29uZmlnX3JvbV9pcDEzOTRfaW5pdCwKLQkuYWRkCQk9IGNvbmZpZ19yb21faXAxMzk0X2FkZCwKLQkucmVtb3ZlCQk9IGNvbmZpZ19yb21faXAxMzk0X3JlbW92ZSwKIAkuY2xlYW51cAk9IGNvbmZpZ19yb21faXAxMzk0X2NsZWFudXAsCiAJLmZsYWcJCT0gSFBTQl9DT05GSUdfUk9NX0VOVFJZX0lQMTM5NCwKIH07Ci0jZW5kaWYgLyogQ09ORklHX0lFRUUxMzk0X0NPTkZJR19ST01fSVAxMzk0ICovCiAKKyNlbmRpZiAvKiBDT05GSUdfSUVFRTEzOTRfRVRIMTM5NF9ST01fRU5UUlkgKi8KIAogc3RhdGljIHN0cnVjdCBocHNiX2NvbmZpZ19yb21fZW50cnkgKmNvbnN0IGNvbmZpZ19yb21fZW50cmllc1tdID0gewotI2lmZGVmIENPTkZJR19JRUVFMTM5NF9DT05GSUdfUk9NX0lQMTM5NAorI2lmZGVmIENPTkZJR19JRUVFMTM5NF9FVEgxMzk0X1JPTV9FTlRSWQogCSZpcDEzOTRfZW50cnksCiAjZW5kaWYKLQlOVUxMLAogfTsKIAotCisvKiBJbml0aWFsaXplIGFsbCBjb25maWcgcm9tcyAqLwogaW50IGhwc2JfaW5pdF9jb25maWdfcm9tcyh2b2lkKQogewogCWludCBpLCBlcnJvciA9IDA7CiAKLQlmb3IgKGkgPSAwOyBjb25maWdfcm9tX2VudHJpZXNbaV07IGkrKykgewotCQlpZiAoIWNvbmZpZ19yb21fZW50cmllc1tpXS0+aW5pdCkKLQkJCWNvbnRpbnVlOwotCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY29uZmlnX3JvbV9lbnRyaWVzKTsgaSsrKQogCQlpZiAoY29uZmlnX3JvbV9lbnRyaWVzW2ldLT5pbml0KCkpIHsKIAkJCUhQU0JfRVJSKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBjb25maWcgcm9tIGVudHJ5IGAlcyciLAogCQkJCSBjb25maWdfcm9tX2VudHJpZXNbaV0tPm5hbWUpOwogCQkJZXJyb3IgPSAtMTsKLQkJfSBlbHNlCi0JCQlIUFNCX0RFQlVHKCJJbml0aWFsaXplZCBjb25maWcgcm9tIGVudHJ5IGAlcyciLAotCQkJCSAgIGNvbmZpZ19yb21fZW50cmllc1tpXS0+bmFtZSk7Ci0JfQorCQl9CiAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKKy8qIENsZWFudXAgYWxsIGNvbmZpZyByb21zICovCiB2b2lkIGhwc2JfY2xlYW51cF9jb25maWdfcm9tcyh2b2lkKQogewogCWludCBpOwogCi0JZm9yIChpID0gMDsgY29uZmlnX3JvbV9lbnRyaWVzW2ldOyBpKyspIHsKLQkJaWYgKGNvbmZpZ19yb21fZW50cmllc1tpXS0+Y2xlYW51cCkKLQkJCWNvbmZpZ19yb21fZW50cmllc1tpXS0+Y2xlYW51cCgpOwotCX0KLX0KLQotaW50IGhwc2JfYWRkX2V4dHJhX2NvbmZpZ19yb21zKHN0cnVjdCBocHNiX2hvc3QgKmhvc3QpCi17Ci0JaW50IGksIGVycm9yID0gMDsKLQotCWZvciAoaSA9IDA7IGNvbmZpZ19yb21fZW50cmllc1tpXTsgaSsrKSB7Ci0JCWlmIChjb25maWdfcm9tX2VudHJpZXNbaV0tPmFkZChob3N0KSkgewotCQkJSFBTQl9FUlIoImZ3LWhvc3QlZDogRmFpbGVkIHRvIGF0dGFjaCBjb25maWcgcm9tIGVudHJ5IGAlcyciLAotCQkJCSBob3N0LT5pZCwgY29uZmlnX3JvbV9lbnRyaWVzW2ldLT5uYW1lKTsKLQkJCWVycm9yID0gLTE7Ci0JCX0gZWxzZSB7Ci0JCQlob3N0LT5jb25maWdfcm9tcyB8PSBjb25maWdfcm9tX2VudHJpZXNbaV0tPmZsYWc7Ci0JCQlob3N0LT51cGRhdGVfY29uZmlnX3JvbSA9IDE7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gZXJyb3I7Ci19Ci0KLXZvaWQgaHBzYl9yZW1vdmVfZXh0cmFfY29uZmlnX3JvbXMoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCkKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGNvbmZpZ19yb21fZW50cmllc1tpXTsgaSsrKSB7Ci0JCWlmICghKGhvc3QtPmNvbmZpZ19yb21zICYgY29uZmlnX3JvbV9lbnRyaWVzW2ldLT5mbGFnKSkKLQkJCWNvbnRpbnVlOwotCi0JCWNvbmZpZ19yb21fZW50cmllc1tpXS0+cmVtb3ZlKGhvc3QpOwotCi0JCWhvc3QtPmNvbmZpZ19yb21zICY9IH5jb25maWdfcm9tX2VudHJpZXNbaV0tPmZsYWc7Ci0JCWhvc3QtPnVwZGF0ZV9jb25maWdfcm9tID0gMTsKLQl9CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY29uZmlnX3JvbV9lbnRyaWVzKTsgaSsrKQorCQljb25maWdfcm9tX2VudHJpZXNbaV0tPmNsZWFudXAoKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvY29uZmlnX3JvbXMuaCBiL2RyaXZlcnMvaWVlZTEzOTQvY29uZmlnX3JvbXMuaAppbmRleCAwYTcwNTQ0Li4xZjVjZDFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWUxMzk0L2NvbmZpZ19yb21zLmgKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9jb25maWdfcm9tcy5oCkBAIC0xLDI3ICsxLDE5IEBACiAjaWZuZGVmIF9JRUVFMTM5NF9DT05GSUdfUk9NU19ICiAjZGVmaW5lIF9JRUVFMTM5NF9DT05GSUdfUk9NU19ICiAKLSNpbmNsdWRlICJpZWVlMTM5NF90eXBlcy5oIgotI2luY2x1ZGUgImhvc3RzLmgiCitzdHJ1Y3QgaHBzYl9ob3N0OwogCi0vKiBUaGUgZGVmYXVsdCBob3N0IGVudHJ5LiBUaGlzIG11c3Qgc3VjY2VlZC4gKi8KIGludCBocHNiX2RlZmF1bHRfaG9zdF9lbnRyeShzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0KTsKLQotLyogSW5pdGlhbGl6ZSBhbGwgY29uZmlnIHJvbXMgKi8KIGludCBocHNiX2luaXRfY29uZmlnX3JvbXModm9pZCk7Ci0KLS8qIENsZWFudXAgYWxsIGNvbmZpZyByb21zICovCiB2b2lkIGhwc2JfY2xlYW51cF9jb25maWdfcm9tcyh2b2lkKTsKIAotLyogQWRkIGV4dHJhIGNvbmZpZyByb21zIHRvIHNwZWNpZmllZCBob3N0ICovCi1pbnQgaHBzYl9hZGRfZXh0cmFfY29uZmlnX3JvbXMoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCk7Ci0KLS8qIFJlbW92ZSBleHRyYSBjb25maWcgcm9tcyBmcm9tIHNwZWNpZmllZCBob3N0ICovCi12b2lkIGhwc2JfcmVtb3ZlX2V4dHJhX2NvbmZpZ19yb21zKHN0cnVjdCBocHNiX2hvc3QgKmhvc3QpOwotCi0KIC8qIExpc3Qgb2YgZmxhZ3MgdG8gY2hlY2sgaWYgYSBob3N0IGNvbnRhaW5zIGEgY2VydGFpbiBleHRyYSBjb25maWcgcm9tCiAgKiBlbnRyeS4gQXZhaWxhYmxlIGluIHRoZSBob3N0LT5jb25maWdfcm9tcyBtZW1iZXIuICovCiAjZGVmaW5lIEhQU0JfQ09ORklHX1JPTV9FTlRSWV9JUDEzOTQJCTB4MDAwMDAwMDEKIAorI2lmZGVmIENPTkZJR19JRUVFMTM5NF9FVEgxMzk0X1JPTV9FTlRSWQoraW50IGhwc2JfY29uZmlnX3JvbV9pcDEzOTRfYWRkKHN0cnVjdCBocHNiX2hvc3QgKmhvc3QpOwordm9pZCBocHNiX2NvbmZpZ19yb21faXAxMzk0X3JlbW92ZShzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0KTsKKyNlbmRpZgorCiAjZW5kaWYgLyogX0lFRUUxMzk0X0NPTkZJR19ST01TX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvY3NyMTIxMi5jIGIvZHJpdmVycy9pZWVlMTM5NC9jc3IxMjEyLmMKaW5kZXggYzI4ZjYzOS4uZDA4MTY2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZWVlMTM5NC9jc3IxMjEyLmMKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9jc3IxMjEyLmMKQEAgLTMxLDEyICszMSwxMyBAQAogLyogVE9ETyBMaXN0OgogICogLSBWZXJpZnkgaW50ZXJmYWNlIGNvbnNpc3RlbmN5OiBpLmUuLCBwdWJsaWMgZnVuY3Rpb25zIHRoYXQgdGFrZSBhIHNpemUKICAqICAgcGFyYW1ldGVyIGV4cGVjdCBzaXplIHRvIGJlIGluIGJ5dGVzLgotICogLSBDb252ZW5pZW5jZSBmdW5jdGlvbnMgZm9yIHJlYWRpbmcgYSBibG9jayBvZiBkYXRhIGZyb20gYSBnaXZlbiBvZmZzZXQuCiAgKi8KIAotI2lmbmRlZiBfX0tFUk5FTF9fCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZW5kaWYKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGFzbS9idWcuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiAKICNpbmNsdWRlICJjc3IxMjEyLmgiCiAKQEAgLTQ2LDcgKzQ3LDcgQEAKICNkZWZpbmUgX19DICgxIDw8IENTUjEyMTJfS1ZfVFlQRV9DU1JfT0ZGU0VUKQogI2RlZmluZSBfX0QgKDEgPDwgQ1NSMTIxMl9LVl9UWVBFX0RJUkVDVE9SWSkKICNkZWZpbmUgX19MICgxIDw8IENTUjEyMTJfS1ZfVFlQRV9MRUFGKQotc3RhdGljIGNvbnN0IHVfaW50OF90IGNzcjEyMTJfa2V5X2lkX3R5cGVfbWFwWzB4MzBdID0geworc3RhdGljIGNvbnN0IHU4IGNzcjEyMTJfa2V5X2lkX3R5cGVfbWFwWzB4MzBdID0gewogCV9fQywJCQkvKiB1c2VkIGJ5IEFwcGxlIGlTaWdodCAqLwogCV9fRCB8IF9fTCwJCS8qIERlc2NyaXB0b3IgKi8KIAlfX0kgfCBfX0QgfCBfX0wsCS8qIEJ1c19EZXBlbmRlbnRfSW5mbyAqLwpAQCAtODIsMTAgKzgzLDEwIEBACiAjdW5kZWYgX19MCiAKIAotI2RlZmluZSBxdWFkc190b19ieXRlcyhfcSkgKChfcSkgKiBzaXplb2YodV9pbnQzMl90KSkKLSNkZWZpbmUgYnl0ZXNfdG9fcXVhZHMoX2IpICgoKF9iKSArIHNpemVvZih1X2ludDMyX3QpIC0gMSkgLyBzaXplb2YodV9pbnQzMl90KSkKKyNkZWZpbmUgcXVhZHNfdG9fYnl0ZXMoX3EpICgoX3EpICogc2l6ZW9mKHUzMikpCisjZGVmaW5lIGJ5dGVzX3RvX3F1YWRzKF9iKSAoKChfYikgKyBzaXplb2YodTMyKSAtIDEpIC8gc2l6ZW9mKHUzMikpCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBmcmVlX2tleXZhbChzdHJ1Y3QgY3NyMTIxMl9rZXl2YWwgKmt2KQorc3RhdGljIHZvaWQgZnJlZV9rZXl2YWwoc3RydWN0IGNzcjEyMTJfa2V5dmFsICprdikKIHsKIAlpZiAoKGt2LT5rZXkudHlwZSA9PSBDU1IxMjEyX0tWX1RZUEVfTEVBRikgJiYKIAkgICAgKGt2LT5rZXkuaWQgIT0gQ1NSMTIxMl9LVl9JRF9FWFRFTkRFRF9ST00pKQpAQCAtOTQsMTQgKzk1LDE0IEBACiAJQ1NSMTIxMl9GUkVFKGt2KTsKIH0KIAotc3RhdGljIHVfaW50MTZfdCBjc3IxMjEyX2NyYzE2KGNvbnN0IHVfaW50MzJfdCAqYnVmZmVyLCBzaXplX3QgbGVuZ3RoKQorc3RhdGljIHUxNiBjc3IxMjEyX2NyYzE2KGNvbnN0IHUzMiAqYnVmZmVyLCBzaXplX3QgbGVuZ3RoKQogewogCWludCBzaGlmdDsKLQl1X2ludDMyX3QgZGF0YTsKLQl1X2ludDE2X3Qgc3VtLCBjcmMgPSAwOworCXUzMiBkYXRhOworCXUxNiBzdW0sIGNyYyA9IDA7CiAKIAlmb3IgKDsgbGVuZ3RoOyBsZW5ndGgtLSkgewotCQlkYXRhID0gQ1NSMTIxMl9CRTMyX1RPX0NQVSgqYnVmZmVyKTsKKwkJZGF0YSA9IGJlMzJfdG9fY3B1KCpidWZmZXIpOwogCQlidWZmZXIrKzsKIAkJZm9yIChzaGlmdCA9IDI4OyBzaGlmdCA+PSAwOyBzaGlmdCAtPSA0ICkgewogCQkJc3VtID0gKChjcmMgPj4gMTIpIF4gKGRhdGEgPj4gc2hpZnQpKSAmIDB4ZjsKQEAgLTExMCwyMSArMTExLDE4IEBACiAJCWNyYyAmPSAweGZmZmY7CiAJfQogCi0JcmV0dXJuIENTUjEyMTJfQ1BVX1RPX0JFMTYoY3JjKTsKKwlyZXR1cm4gY3B1X3RvX2JlMTYoY3JjKTsKIH0KIAotI2lmIDAKLS8qIE1pY3Jvc29mdCBjb21wdXRlcyB0aGUgQ1JDIHdpdGggdGhlIGJ5dGVzIGluIHJldmVyc2Ugb3JkZXIuICBUaGVyZWZvcmUgd2UKLSAqIGhhdmUgYSBzcGVjaWFsIHZlcnNpb24gb2YgdGhlIENSQyBhbGdvcml0aG0gdG8gYWNjb3VudCBmb3IgdGhlaXIgYnVnZ3kKLSAqIHNvZnR3YXJlLiAqLwotc3RhdGljIHVfaW50MTZfdCBjc3IxMjEyX21zZnRfY3JjMTYoY29uc3QgdV9pbnQzMl90ICpidWZmZXIsIHNpemVfdCBsZW5ndGgpCisvKiBNaWNyb3NvZnQgY29tcHV0ZXMgdGhlIENSQyB3aXRoIHRoZSBieXRlcyBpbiByZXZlcnNlIG9yZGVyLiAqLworc3RhdGljIHUxNiBjc3IxMjEyX21zZnRfY3JjMTYoY29uc3QgdTMyICpidWZmZXIsIHNpemVfdCBsZW5ndGgpCiB7CiAJaW50IHNoaWZ0OwotCXVfaW50MzJfdCBkYXRhOwotCXVfaW50MTZfdCBzdW0sIGNyYyA9IDA7CisJdTMyIGRhdGE7CisJdTE2IHN1bSwgY3JjID0gMDsKIAogCWZvciAoOyBsZW5ndGg7IGxlbmd0aC0tKSB7Ci0JCWRhdGEgPSBDU1IxMjEyX0xFMzJfVE9fQ1BVKCpidWZmZXIpOworCQlkYXRhID0gbGUzMl90b19jcHUoKmJ1ZmZlcik7CiAJCWJ1ZmZlcisrOwogCQlmb3IgKHNoaWZ0ID0gMjg7IHNoaWZ0ID49IDA7IHNoaWZ0IC09IDQgKSB7CiAJCQlzdW0gPSAoKGNyYyA+PiAxMikgXiAoZGF0YSA+PiBzaGlmdCkpICYgMHhmOwpAQCAtMTMzLDM4ICsxMzEsMzUgQEAKIAkJY3JjICY9IDB4ZmZmZjsKIAl9CiAKLQlyZXR1cm4gQ1NSMTIxMl9DUFVfVE9fQkUxNihjcmMpOworCXJldHVybiBjcHVfdG9fYmUxNihjcmMpOwogfQotI2VuZGlmCiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IGNzcjEyMTJfZGVudHJ5ICpjc3IxMjEyX2ZpbmRfa2V5dmFsKHN0cnVjdCBjc3IxMjEyX2tleXZhbCAqZGlyLAotCQkJCQkJCSBzdHJ1Y3QgY3NyMTIxMl9rZXl2YWwgKmt2KQorc3RhdGljIHN0cnVjdCBjc3IxMjEyX2RlbnRyeSAqCitjc3IxMjEyX2ZpbmRfa2V5dmFsKHN0cnVjdCBjc3IxMjEyX2tleXZhbCAqZGlyLCBzdHJ1Y3QgY3NyMTIxMl9rZXl2YWwgKmt2KQogewogCXN0cnVjdCBjc3IxMjEyX2RlbnRyeSAqcG9zOwogCiAJZm9yIChwb3MgPSBkaXItPnZhbHVlLmRpcmVjdG9yeS5kZW50cmllc19oZWFkOwotCSAgICAgcG9zICE9IE5VTEw7IHBvcyA9IHBvcy0+bmV4dCkgeworCSAgICAgcG9zICE9IE5VTEw7IHBvcyA9IHBvcy0+bmV4dCkKIAkJaWYgKHBvcy0+a3YgPT0ga3YpCiAJCQlyZXR1cm4gcG9zOwotCX0KIAlyZXR1cm4gTlVMTDsKIH0KIAotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBjc3IxMjEyX2tleXZhbCAqY3NyMTIxMl9maW5kX2tleXZhbF9vZmZzZXQoc3RydWN0IGNzcjEyMTJfa2V5dmFsICprdl9saXN0LAotCQkJCQkJCQl1X2ludDMyX3Qgb2Zmc2V0KQorc3RhdGljIHN0cnVjdCBjc3IxMjEyX2tleXZhbCAqCitjc3IxMjEyX2ZpbmRfa2V5dmFsX29mZnNldChzdHJ1Y3QgY3NyMTIxMl9rZXl2YWwgKmt2X2xpc3QsIHUzMiBvZmZzZXQpCiB7CiAJc3RydWN0IGNzcjEyMTJfa2V5dmFsICprdjsKIAotCWZvciAoa3YgPSBrdl9saXN0LT5uZXh0OyBrdiAmJiAoa3YgIT0ga3ZfbGlzdCk7IGt2ID0ga3YtPm5leHQpIHsKKwlmb3IgKGt2ID0ga3ZfbGlzdC0+bmV4dDsga3YgJiYgKGt2ICE9IGt2X2xpc3QpOyBrdiA9IGt2LT5uZXh0KQogCQlpZiAoa3YtPm9mZnNldCA9PSBvZmZzZXQpCiAJCQlyZXR1cm4ga3Y7Ci0JfQogCXJldHVybiBOVUxMOwogfQogCiAKIC8qIENyZWF0aW9uIFJvdXRpbmVzICovCisKIHN0cnVjdCBjc3IxMjEyX2NzciAqY3NyMTIxMl9jcmVhdGVfY3NyKHN0cnVjdCBjc3IxMjEyX2J1c19vcHMgKm9wcywKIAkJCQkgICAgICAgc2l6ZV90IGJ1c19pbmZvX3NpemUsIHZvaWQgKnByaXZhdGUpCiB7CkBAIC0yMDIsMjcgKzE5NywxNyBAQAogCXJldHVybiBjc3I7CiB9CiAKLQotCiB2b2lkIGNzcjEyMTJfaW5pdF9sb2NhbF9jc3Ioc3RydWN0IGNzcjEyMTJfY3NyICpjc3IsCi0JCQkgICAgY29uc3QgdV9pbnQzMl90ICpidXNfaW5mb19kYXRhLCBpbnQgbWF4X3JvbSkKKwkJCSAgICBjb25zdCB1MzIgKmJ1c19pbmZvX2RhdGEsIGludCBtYXhfcm9tKQogewogCXN0YXRpYyBjb25zdCBpbnQgbXJfbWFwW10gPSB7IDQsIDY0LCAxMDI0LCAwIH07CiAKLSNpZmRlZiBfX0tFUk5FTF9fCiAJQlVHX09OKG1heF9yb20gJiB+MHgzKTsKIAljc3ItPm1heF9yb20gPSBtcl9tYXBbbWF4X3JvbV07Ci0jZWxzZQotCWlmIChtYXhfcm9tICYgfjB4MykgLyogY2FsbGVyIHN1cHBsaWVkIGludmFsaWQgYXJndW1lbnQgKi8KLQkJY3NyLT5tYXhfcm9tID0gMDsKLQllbHNlCi0JCWNzci0+bWF4X3JvbSA9IG1yX21hcFttYXhfcm9tXTsKLSNlbmRpZgogCW1lbWNweShjc3ItPmJ1c19pbmZvX2RhdGEsIGJ1c19pbmZvX2RhdGEsIGNzci0+YnVzX2luZm9fbGVuKTsKIH0KIAotCi1zdGF0aWMgc3RydWN0IGNzcjEyMTJfa2V5dmFsICpjc3IxMjEyX25ld19rZXl2YWwodV9pbnQ4X3QgdHlwZSwgdV9pbnQ4X3Qga2V5KQorc3RhdGljIHN0cnVjdCBjc3IxMjEyX2tleXZhbCAqY3NyMTIxMl9uZXdfa2V5dmFsKHU4IHR5cGUsIHU4IGtleSkKIHsKIAlzdHJ1Y3QgY3NyMTIxMl9rZXl2YWwgKmt2OwogCkBAIC0yNDYsMTAgKzIzMSwxMSBAQAogCXJldHVybiBrdjsKIH0KIAotc3RydWN0IGNzcjEyMTJfa2V5dmFsICpjc3IxMjEyX25ld19pbW1lZGlhdGUodV9pbnQ4X3Qga2V5LCB1X2ludDMyX3QgdmFsdWUpCitzdHJ1Y3QgY3NyMTIxMl9rZXl2YWwgKmNzcjEyMTJfbmV3X2ltbWVkaWF0ZSh1OCBrZXksIHUzMiB2YWx1ZSkKIHsKLQlzdHJ1Y3QgY3NyMTIxMl9rZXl2YWwgKmt2ID0gY3NyMTIxMl9uZXdfa2V5dmFsKENTUjEyMTJfS1ZfVFlQRV9JTU1FRElBVEUsIGtleSk7CisJc3RydWN0IGNzcjEyMTJfa2V5dmFsICprdjsKIAorCWt2ID0gY3NyMTIxMl9uZXdfa2V5dmFsKENTUjEyMTJfS1ZfVFlQRV9JTU1FRElBVEUsIGtleSk7CiAJaWYgKCFrdikKIAkJcmV0dXJuIE5VTEw7CiAKQEAgLTI1OCwxMCArMjQ0LDEyIEBACiAJcmV0dXJuIGt2OwogfQogCi1zdHJ1Y3QgY3NyMTIxMl9rZXl2YWwgKmNzcjEyMTJfbmV3X2xlYWYodV9pbnQ4X3Qga2V5LCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgZGF0YV9sZW4pCitzdGF0aWMgc3RydWN0IGNzcjEyMTJfa2V5dmFsICoKK2NzcjEyMTJfbmV3X2xlYWYodTgga2V5LCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgZGF0YV9sZW4pCiB7Ci0Jc3RydWN0IGNzcjEyMTJfa2V5dmFsICprdiA9IGNzcjEyMTJfbmV3X2tleXZhbChDU1IxMjEyX0tWX1RZUEVfTEVBRiwga2V5KTsKKwlzdHJ1Y3QgY3NyMTIxMl9rZXl2YWwgKmt2OwogCisJa3YgPSBjc3IxMjEyX25ld19rZXl2YWwoQ1NSMTIxMl9LVl9UWVBFX0xFQUYsIGtleSk7CiAJaWYgKCFrdikKIAkJcmV0dXJuIE5VTEw7CiAKQEAgLTI4NSwxMCArMjczLDEyIEBACiAJcmV0dXJuIGt2OwogfQogCi1zdHJ1Y3QgY3NyMTIxMl9rZXl2YWwgKmNzcjEyMTJfbmV3X2Nzcl9vZmZzZXQodV9pbnQ4X3Qga2V5LCB1X2ludDMyX3QgY3NyX29mZnNldCkKK3N0YXRpYyBzdHJ1Y3QgY3NyMTIxMl9rZXl2YWwgKgorY3NyMTIxMl9uZXdfY3NyX29mZnNldCh1OCBrZXksIHUzMiBjc3Jfb2Zmc2V0KQogewotCXN0cnVjdCBjc3IxMjEyX2tleXZhbCAqa3YgPSBjc3IxMjEyX25ld19rZXl2YWwoQ1NSMTIxMl9LVl9UWVBFX0NTUl9PRkZTRVQsIGtleSk7CisJc3RydWN0IGNzcjEyMTJfa2V5dmFsICprdjsKIAorCWt2ID0gY3NyMTIxMl9uZXdfa2V5dmFsKENTUjEyMTJfS1ZfVFlQRV9DU1JfT0ZGU0VULCBrZXkpOwogCWlmICgha3YpCiAJCXJldHVybiBOVUxMOwogCkBAIC0yOTksMTAgKzI4OSwxMSBAQAogCXJldHVybiBrdjsKIH0KIAotc3RydWN0IGNzcjEyMTJfa2V5dmFsICpjc3IxMjEyX25ld19kaXJlY3RvcnkodV9pbnQ4X3Qga2V5KQorc3RydWN0IGNzcjEyMTJfa2V5dmFsICpjc3IxMjEyX25ld19kaXJlY3RvcnkodTgga2V5KQogewotCXN0cnVjdCBjc3IxMjEyX2tleXZhbCAqa3YgPSBjc3IxMjEyX25ld19rZXl2YWwoQ1NSMTIxMl9LVl9UWVBFX0RJUkVDVE9SWSwga2V5KTsKKwlzdHJ1Y3QgY3NyMTIxMl9rZXl2YWwgKmt2OwogCisJa3YgPSBjc3IxMjEyX25ld19rZXl2YWwoQ1NSMTIxMl9LVl9UWVBFX0RJUkVDVE9SWSwga2V5KTsKIAlpZiAoIWt2KQogCQlyZXR1cm4gTlVMTDsKIApAQCAtMzE0LDQzICszMDUsMjkgQEAKIAlyZXR1cm4ga3Y7CiB9CiAKLWludCBjc3IxMjEyX2Fzc29jaWF0ZV9rZXl2YWwoc3RydWN0IGNzcjEyMTJfa2V5dmFsICprdiwKLQkJCSAgICAgc3RydWN0IGNzcjEyMTJfa2V5dmFsICphc3NvY2lhdGUpCit2b2lkIGNzcjEyMTJfYXNzb2NpYXRlX2tleXZhbChzdHJ1Y3QgY3NyMTIxMl9rZXl2YWwgKmt2LAorCQkJICAgICAgc3RydWN0IGNzcjEyMTJfa2V5dmFsICphc3NvY2lhdGUpCiB7Ci0JaWYgKCFrdiB8fCAhYXNzb2NpYXRlKQotCQlyZXR1cm4gQ1NSMTIxMl9FSU5WQUw7Ci0KLQlpZiAoa3YtPmtleS5pZCA9PSBDU1IxMjEyX0tWX0lEX0RFU0NSSVBUT1IgfHwKLQkgICAoYXNzb2NpYXRlLT5rZXkuaWQgIT0gQ1NSMTIxMl9LVl9JRF9ERVNDUklQVE9SICYmCi0JICAgIGFzc29jaWF0ZS0+a2V5LmlkICE9IENTUjEyMTJfS1ZfSURfREVQRU5ERU5UX0lORk8gJiYKLQkgICAgYXNzb2NpYXRlLT5rZXkuaWQgIT0gQ1NSMTIxMl9LVl9JRF9FWFRFTkRFRF9LRVkgJiYKLQkgICAgYXNzb2NpYXRlLT5rZXkuaWQgIT0gQ1NSMTIxMl9LVl9JRF9FWFRFTkRFRF9EQVRBICYmCi0JICAgIGFzc29jaWF0ZS0+a2V5LmlkIDwgMHgzMCkpCi0JCXJldHVybiBDU1IxMjEyX0VJTlZBTDsKLQotCWlmIChrdi0+a2V5LmlkID09IENTUjEyMTJfS1ZfSURfRVhURU5ERURfS0VZX1NQRUNJRklFUl9JRCAmJgotCSAgIGFzc29jaWF0ZS0+a2V5LmlkICE9IENTUjEyMTJfS1ZfSURfRVhURU5ERURfS0VZKQotCQlyZXR1cm4gQ1NSMTIxMl9FSU5WQUw7Ci0KLQlpZiAoa3YtPmtleS5pZCA9PSBDU1IxMjEyX0tWX0lEX0VYVEVOREVEX0tFWSAmJgotCSAgIGFzc29jaWF0ZS0+a2V5LmlkICE9IENTUjEyMTJfS1ZfSURfRVhURU5ERURfREFUQSkKLQkJcmV0dXJuIENTUjEyMTJfRUlOVkFMOwotCi0JaWYgKGFzc29jaWF0ZS0+a2V5LmlkID09IENTUjEyMTJfS1ZfSURfRVhURU5ERURfS0VZICYmCi0JICAga3YtPmtleS5pZCAhPSBDU1IxMjEyX0tWX0lEX0VYVEVOREVEX0tFWV9TUEVDSUZJRVJfSUQpCi0JCXJldHVybiBDU1IxMjEyX0VJTlZBTDsKLQotCWlmIChhc3NvY2lhdGUtPmtleS5pZCA9PSBDU1IxMjEyX0tWX0lEX0VYVEVOREVEX0RBVEEgJiYKLQkgICBrdi0+a2V5LmlkICE9IENTUjEyMTJfS1ZfSURfRVhURU5ERURfS0VZKQotCQlyZXR1cm4gQ1NSMTIxMl9FSU5WQUw7CisJQlVHX09OKCFrdiB8fCAhYXNzb2NpYXRlIHx8IGt2LT5rZXkuaWQgPT0gQ1NSMTIxMl9LVl9JRF9ERVNDUklQVE9SIHx8CisJICAgICAgIChhc3NvY2lhdGUtPmtleS5pZCAhPSBDU1IxMjEyX0tWX0lEX0RFU0NSSVBUT1IgJiYKKwkJYXNzb2NpYXRlLT5rZXkuaWQgIT0gQ1NSMTIxMl9LVl9JRF9ERVBFTkRFTlRfSU5GTyAmJgorCQlhc3NvY2lhdGUtPmtleS5pZCAhPSBDU1IxMjEyX0tWX0lEX0VYVEVOREVEX0tFWSAmJgorCQlhc3NvY2lhdGUtPmtleS5pZCAhPSBDU1IxMjEyX0tWX0lEX0VYVEVOREVEX0RBVEEgJiYKKwkJYXNzb2NpYXRlLT5rZXkuaWQgPCAweDMwKSB8fAorCSAgICAgICAoa3YtPmtleS5pZCA9PSBDU1IxMjEyX0tWX0lEX0VYVEVOREVEX0tFWV9TUEVDSUZJRVJfSUQgJiYKKwkJYXNzb2NpYXRlLT5rZXkuaWQgIT0gQ1NSMTIxMl9LVl9JRF9FWFRFTkRFRF9LRVkpIHx8CisJICAgICAgIChrdi0+a2V5LmlkID09IENTUjEyMTJfS1ZfSURfRVhURU5ERURfS0VZICYmCisJCWFzc29jaWF0ZS0+a2V5LmlkICE9IENTUjEyMTJfS1ZfSURfRVhURU5ERURfREFUQSkgfHwKKwkgICAgICAgKGFzc29jaWF0ZS0+a2V5LmlkID09IENTUjEyMTJfS1ZfSURfRVhURU5ERURfS0VZICYmCisJCWt2LT5rZXkuaWQgIT0gQ1NSMTIxMl9LVl9JRF9FWFRFTkRFRF9LRVlfU1BFQ0lGSUVSX0lEKSB8fAorCSAgICAgICAoYXNzb2NpYXRlLT5rZXkuaWQgPT0gQ1NSMTIxMl9LVl9JRF9FWFRFTkRFRF9EQVRBICYmCisJCWt2LT5rZXkuaWQgIT0gQ1NSMTIxMl9LVl9JRF9FWFRFTkRFRF9LRVkpKTsKIAogCWlmIChrdi0+YXNzb2NpYXRlKQogCQljc3IxMjEyX3JlbGVhc2Vfa2V5dmFsKGt2LT5hc3NvY2lhdGUpOwogCiAJYXNzb2NpYXRlLT5yZWZjbnQrKzsKIAlrdi0+YXNzb2NpYXRlID0gYXNzb2NpYXRlOwotCi0JcmV0dXJuIENTUjEyMTJfU1VDQ0VTUzsKIH0KIAogaW50IGNzcjEyMTJfYXR0YWNoX2tleXZhbF90b19kaXJlY3Rvcnkoc3RydWN0IGNzcjEyMTJfa2V5dmFsICpkaXIsCkBAIC0zNTgsMTIgKzMzNSwxMSBAQAogewogCXN0cnVjdCBjc3IxMjEyX2RlbnRyeSAqZGVudHJ5OwogCi0JaWYgKCFrdiB8fCAhZGlyIHx8IGRpci0+a2V5LnR5cGUgIT0gQ1NSMTIxMl9LVl9UWVBFX0RJUkVDVE9SWSkKLQkJcmV0dXJuIENTUjEyMTJfRUlOVkFMOworCUJVR19PTigha3YgfHwgIWRpciB8fCBkaXItPmtleS50eXBlICE9IENTUjEyMTJfS1ZfVFlQRV9ESVJFQ1RPUlkpOwogCiAJZGVudHJ5ID0gQ1NSMTIxMl9NQUxMT0Moc2l6ZW9mKCpkZW50cnkpKTsKIAlpZiAoIWRlbnRyeSkKLQkJcmV0dXJuIENTUjEyMTJfRU5PTUVNOworCQlyZXR1cm4gLUVOT01FTTsKIAogCWRlbnRyeS0+a3YgPSBrdjsKIApAQCAtMzgyLDY2ICszNTgsMjIgQEAKIAlyZXR1cm4gQ1NSMTIxMl9TVUNDRVNTOwogfQogCi1zdHJ1Y3QgY3NyMTIxMl9rZXl2YWwgKmNzcjEyMTJfbmV3X2V4dGVuZGVkX2ltbWVkaWF0ZSh1X2ludDMyX3Qgc3BlYywgdV9pbnQzMl90IGtleSwKLQkJCQkJCSAgICAgIHVfaW50MzJfdCB2YWx1ZSkKLXsKLQlzdHJ1Y3QgY3NyMTIxMl9rZXl2YWwgKmt2cywgKmt2aywgKmt2djsKKyNkZWZpbmUgQ1NSMTIxMl9ERVNDUklQVE9SX0xFQUZfREFUQShrdikgXAorCSgmKChrdiktPnZhbHVlLmxlYWYuZGF0YVsxXSkpCiAKLQlrdnMgPSBjc3IxMjEyX25ld19pbW1lZGlhdGUoQ1NSMTIxMl9LVl9JRF9FWFRFTkRFRF9LRVlfU1BFQ0lGSUVSX0lELCBzcGVjKTsKLQlrdmsgPSBjc3IxMjEyX25ld19pbW1lZGlhdGUoQ1NSMTIxMl9LVl9JRF9FWFRFTkRFRF9LRVksIGtleSk7Ci0Ja3Z2ID0gY3NyMTIxMl9uZXdfaW1tZWRpYXRlKENTUjEyMTJfS1ZfSURfRVhURU5ERURfREFUQSwgdmFsdWUpOworI2RlZmluZSBDU1IxMjEyX0RFU0NSSVBUT1JfTEVBRl9TRVRfVFlQRShrdiwgdHlwZSkgXAorCSgoa3YpLT52YWx1ZS5sZWFmLmRhdGFbMF0gPSBcCisJIGNwdV90b19iZTMyKENTUjEyMTJfREVTQ1JJUFRPUl9MRUFGX1NQRUNJRklFUl9JRChrdikgfCBcCisJCSAgICAgKCh0eXBlKSA8PCBDU1IxMjEyX0RFU0NSSVBUT1JfTEVBRl9UWVBFX1NISUZUKSkpCisjZGVmaW5lIENTUjEyMTJfREVTQ1JJUFRPUl9MRUFGX1NFVF9TUEVDSUZJRVJfSUQoa3YsIHNwZWNfaWQpIFwKKwkoKGt2KS0+dmFsdWUubGVhZi5kYXRhWzBdID0gXAorCSBjcHVfdG9fYmUzMigoQ1NSMTIxMl9ERVNDUklQVE9SX0xFQUZfVFlQRShrdikgPDwgXAorCQkgICAgICBDU1IxMjEyX0RFU0NSSVBUT1JfTEVBRl9UWVBFX1NISUZUKSB8IFwKKwkJICAgICAoKHNwZWNfaWQpICYgQ1NSMTIxMl9ERVNDUklQVE9SX0xFQUZfU1BFQ0lGSUVSX0lEX01BU0spKSkKIAotCWlmICgha3ZzIHx8ICFrdmsgfHwgIWt2dikgewotCQlpZiAoa3ZzKQotCQkJZnJlZV9rZXl2YWwoa3ZzKTsKLQkJaWYgKGt2aykKLQkJCWZyZWVfa2V5dmFsKGt2ayk7Ci0JCWlmIChrdnYpCi0JCQlmcmVlX2tleXZhbChrdnYpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQkvKiBEb24ndCBrZWVwIGEgbG9jYWwgcmVmZXJlbmNlIHRvIHRoZSBleHRlbmRlZCBrZXkgb3IgdmFsdWUuICovCi0Ja3ZrLT5yZWZjbnQgPSAwOwotCWt2di0+cmVmY250ID0gMDsKLQotCWNzcjEyMTJfYXNzb2NpYXRlX2tleXZhbChrdmssIGt2dik7Ci0JY3NyMTIxMl9hc3NvY2lhdGVfa2V5dmFsKGt2cywga3ZrKTsKLQotCXJldHVybiBrdnM7Ci19Ci0KLXN0cnVjdCBjc3IxMjEyX2tleXZhbCAqY3NyMTIxMl9uZXdfZXh0ZW5kZWRfbGVhZih1X2ludDMyX3Qgc3BlYywgdV9pbnQzMl90IGtleSwKLQkJCQkJCSBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgZGF0YV9sZW4pCi17Ci0Jc3RydWN0IGNzcjEyMTJfa2V5dmFsICprdnMsICprdmssICprdnY7Ci0KLQlrdnMgPSBjc3IxMjEyX25ld19pbW1lZGlhdGUoQ1NSMTIxMl9LVl9JRF9FWFRFTkRFRF9LRVlfU1BFQ0lGSUVSX0lELCBzcGVjKTsKLQlrdmsgPSBjc3IxMjEyX25ld19pbW1lZGlhdGUoQ1NSMTIxMl9LVl9JRF9FWFRFTkRFRF9LRVksIGtleSk7Ci0Ja3Z2ID0gY3NyMTIxMl9uZXdfbGVhZihDU1IxMjEyX0tWX0lEX0VYVEVOREVEX0RBVEEsIGRhdGEsIGRhdGFfbGVuKTsKLQotCWlmICgha3ZzIHx8ICFrdmsgfHwgIWt2dikgewotCQlpZiAoa3ZzKQotCQkJZnJlZV9rZXl2YWwoa3ZzKTsKLQkJaWYgKGt2aykKLQkJCWZyZWVfa2V5dmFsKGt2ayk7Ci0JCWlmIChrdnYpCi0JCQlmcmVlX2tleXZhbChrdnYpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQkvKiBEb24ndCBrZWVwIGEgbG9jYWwgcmVmZXJlbmNlIHRvIHRoZSBleHRlbmRlZCBrZXkgb3IgdmFsdWUuICovCi0Ja3ZrLT5yZWZjbnQgPSAwOwotCWt2di0+cmVmY250ID0gMDsKLQotCWNzcjEyMTJfYXNzb2NpYXRlX2tleXZhbChrdmssIGt2dik7Ci0JY3NyMTIxMl9hc3NvY2lhdGVfa2V5dmFsKGt2cywga3ZrKTsKLQotCXJldHVybiBrdnM7Ci19Ci0KLXN0cnVjdCBjc3IxMjEyX2tleXZhbCAqY3NyMTIxMl9uZXdfZGVzY3JpcHRvcl9sZWFmKHVfaW50OF90IGR0eXBlLCB1X2ludDMyX3Qgc3BlY2lmaWVyX2lkLAotCQkJCQkJICAgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGRhdGFfbGVuKQorc3RhdGljIHN0cnVjdCBjc3IxMjEyX2tleXZhbCAqCitjc3IxMjEyX25ld19kZXNjcmlwdG9yX2xlYWYodTggZHR5cGUsIHUzMiBzcGVjaWZpZXJfaWQsCisJCQkgICAgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGRhdGFfbGVuKQogewogCXN0cnVjdCBjc3IxMjEyX2tleXZhbCAqa3Y7CiAKQEAgLTQ1MywxOTQgKzM4NSw2OSBAQAogCUNTUjEyMTJfREVTQ1JJUFRPUl9MRUFGX1NFVF9UWVBFKGt2LCBkdHlwZSk7CiAJQ1NSMTIxMl9ERVNDUklQVE9SX0xFQUZfU0VUX1NQRUNJRklFUl9JRChrdiwgc3BlY2lmaWVyX2lkKTsKIAotCWlmIChkYXRhKSB7CisJaWYgKGRhdGEpCiAJCW1lbWNweShDU1IxMjEyX0RFU0NSSVBUT1JfTEVBRl9EQVRBKGt2KSwgZGF0YSwgZGF0YV9sZW4pOwotCX0KIAogCXJldHVybiBrdjsKIH0KIAotCi1zdHJ1Y3QgY3NyMTIxMl9rZXl2YWwgKmNzcjEyMTJfbmV3X3RleHR1YWxfZGVzY3JpcHRvcl9sZWFmKHVfaW50OF90IGN3aWR0aCwKLQkJCQkJCQkgICB1X2ludDE2X3QgY3NldCwKLQkJCQkJCQkgICB1X2ludDE2X3QgbGFuZ3VhZ2UsCi0JCQkJCQkJICAgY29uc3Qgdm9pZCAqZGF0YSwKLQkJCQkJCQkgICBzaXplX3QgZGF0YV9sZW4pCi17Ci0Jc3RydWN0IGNzcjEyMTJfa2V5dmFsICprdjsKLQljaGFyICpsc3RyOwotCi0Ja3YgPSBjc3IxMjEyX25ld19kZXNjcmlwdG9yX2xlYWYoMCwgMCwgTlVMTCwgZGF0YV9sZW4gKwotCQkJCQkgQ1NSMTIxMl9URVhUVUFMX0RFU0NSSVBUT1JfTEVBRl9PVkVSSEVBRCk7Ci0JaWYgKCFrdikKLQkJcmV0dXJuIE5VTEw7Ci0KLQlDU1IxMjEyX1RFWFRVQUxfREVTQ1JJUFRPUl9MRUFGX1NFVF9XSURUSChrdiwgY3dpZHRoKTsKLQlDU1IxMjEyX1RFWFRVQUxfREVTQ1JJUFRPUl9MRUFGX1NFVF9DSEFSX1NFVChrdiwgY3NldCk7Ci0JQ1NSMTIxMl9URVhUVUFMX0RFU0NSSVBUT1JfTEVBRl9TRVRfTEFOR1VBR0Uoa3YsIGxhbmd1YWdlKTsKLQotCWxzdHIgPSAoY2hhciopQ1NSMTIxMl9URVhUVUFMX0RFU0NSSVBUT1JfTEVBRl9EQVRBKGt2KTsKLQotCS8qIG1ha2Ugc3VyZSBsYXN0IHF1YWRsZXQgaXMgemVyb2VkIG91dCAqLwotCSooKHVfaW50MzJfdCopJihsc3RyWyhkYXRhX2xlbiAtIDEpICYgfjB4M10pKSA9IDA7Ci0KLQkvKiBkb24ndCBjb3B5IHRoZSBOVUwgdGVybWluYXRvciAqLwotCW1lbWNweShsc3RyLCBkYXRhLCBkYXRhX2xlbik7Ci0KLQlyZXR1cm4ga3Y7Ci19Ci0KKy8qIENoZWNrIGlmIHN0cmluZyBjb25mb3JtcyB0byBtaW5pbWFsIEFTQ0lJIGFzIHBlciBJRUVFIDEyMTIgY2xhdXNlIDcuNCAqLwogc3RhdGljIGludCBjc3IxMjEyX2NoZWNrX21pbmltYWxfYXNjaWkoY29uc3QgY2hhciAqcykKIHsKIAlzdGF0aWMgY29uc3QgY2hhciBtaW5pbWFsX2FzY2lpX3RhYmxlW10gPSB7Ci0JCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDcsCi0JCTB4MDAsIDB4MDAsIDB4MGEsIDB4MDAsIDB4MEMsIDB4MEQsIDB4MDAsIDB4MDAsCi0JCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JCTB4MjAsIDB4MjEsIDB4MjIsIDB4MDAsIDB4MDAsIDB4MjUsIDB4MjYsIDB4MjcsCi0JCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsCi0JCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsCi0JCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsCi0JCTB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsCi0JCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsCi0JCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsCi0JCTB4NTgsIDB4NTksIDB4NWEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NWYsCi0JCTB4MDAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsCi0JCTB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsCi0JCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsCi0JCTB4NzgsIDB4NzksIDB4N2EsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJCQkJCS8qICAxICAgMiAgIDQgICA4ICAxNiAgMzIgIDY0ICAxMjggKi8KKwkJMTI4LAkJCS8qIC0tLCAtLSwgLS0sIC0tLCAtLSwgLS0sIC0tLCAwNywgKi8KKwkJNCArIDE2ICsgMzIsCQkvKiAtLSwgLS0sIDBhLCAtLSwgMEMsIDBELCAtLSwgLS0sICovCisJCTAsCQkJLyogLS0sIC0tLCAtLSwgLS0sIC0tLCAtLSwgLS0sIC0tLCAqLworCQkwLAkJCS8qIC0tLCAtLSwgLS0sIC0tLCAtLSwgLS0sIC0tLCAtLSwgKi8KKwkJMjU1IC0gOCAtIDE2LAkJLyogMjAsIDIxLCAyMiwgLS0sIC0tLCAyNSwgMjYsIDI3LCAqLworCQkyNTUsCQkJLyogMjgsIDI5LCAyYSwgMmIsIDJjLCAyZCwgMmUsIDJmLCAqLworCQkyNTUsCQkJLyogMzAsIDMxLCAzMiwgMzMsIDM0LCAzNSwgMzYsIDM3LCAqLworCQkyNTUsCQkJLyogMzgsIDM5LCAzYSwgM2IsIDNjLCAzZCwgM2UsIDNmLCAqLworCQkyNTUsCQkJLyogNDAsIDQxLCA0MiwgNDMsIDQ0LCA0NSwgNDYsIDQ3LCAqLworCQkyNTUsCQkJLyogNDgsIDQ5LCA0YSwgNGIsIDRjLCA0ZCwgNGUsIDRmLCAqLworCQkyNTUsCQkJLyogNTAsIDUxLCA1MiwgNTMsIDU0LCA1NSwgNTYsIDU3LCAqLworCQkxICsgMiArIDQgKyAxMjgsCS8qIDU4LCA1OSwgNWEsIC0tLCAtLSwgLS0sIC0tLCA1ZiwgKi8KKwkJMjU1IC0gMSwJCS8qIC0tLCA2MSwgNjIsIDYzLCA2NCwgNjUsIDY2LCA2NywgKi8KKwkJMjU1LAkJCS8qIDY4LCA2OSwgNmEsIDZiLCA2YywgNmQsIDZlLCA2ZiwgKi8KKwkJMjU1LAkJCS8qIDcwLCA3MSwgNzIsIDczLCA3NCwgNzUsIDc2LCA3NywgKi8KKwkJMSArIDIgKyA0LAkJLyogNzgsIDc5LCA3YSwgLS0sIC0tLCAtLSwgLS0sIC0tLCAqLwogCX07CisJaW50IGksIGo7CisKIAlmb3IgKDsgKnM7IHMrKykgewotCQlpZiAobWluaW1hbF9hc2NpaV90YWJsZVsqcyAmIDB4N0ZdICE9ICpzKQotCQkJcmV0dXJuIC0xOyAvKiBmYWlsZWQgKi8KKwkJaSA9ICpzID4+IDM7CQkvKiAgaSA9ICpzIC8gODsJCSovCisJCWogPSAxIDw8ICgqcyAmIDMpOwkvKiAgaiA9IDEgPDwgKCpzICUgOCk7CSovCisKKwkJaWYgKGkgPj0gQVJSQVlfU0laRShtaW5pbWFsX2FzY2lpX3RhYmxlKSB8fAorCQkgICAgIShtaW5pbWFsX2FzY2lpX3RhYmxlW2ldICYgaikpCisJCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JLyogU3RyaW5nIGNvbmZvcm1zIHRvIG1pbmltYWwtYXNjaWksIGFzIHNwZWNpZmllZCBieSBJRUVFIDEyMTIsCi0JICogcGFyLiA3LjQgKi8KIAlyZXR1cm4gMDsKIH0KIAorLyogSUVFRSAxMjEyIGNsYXVzZSA3LjUuNC4xIHRleHR1YWwgZGVzY3JpcHRvcnMgKEVuZ2xpc2gsIG1pbmltYWwgQVNDSUkpICovCiBzdHJ1Y3QgY3NyMTIxMl9rZXl2YWwgKmNzcjEyMTJfbmV3X3N0cmluZ19kZXNjcmlwdG9yX2xlYWYoY29uc3QgY2hhciAqcykKIHsKLQkvKiBDaGVjayBpZiBzdHJpbmcgY29uZm9ybSB0byBtaW5pbWFsX2FzY2lpIGZvcm1hdCAqLwotCWlmIChjc3IxMjEyX2NoZWNrX21pbmltYWxfYXNjaWkocykpCi0JCXJldHVybiBOVUxMOwotCi0JLyogSUVFRSAxMjEyLCBwYXIuIDcuNS40LjEgIFRleHR1YWwgZGVzY3JpcHRvcnMgKG1pbmltYWwgQVNDSUkpICovCi0JcmV0dXJuIGNzcjEyMTJfbmV3X3RleHR1YWxfZGVzY3JpcHRvcl9sZWFmKDAsIDAsIDAsIHMsIHN0cmxlbihzKSk7Ci19Ci0KLXN0cnVjdCBjc3IxMjEyX2tleXZhbCAqY3NyMTIxMl9uZXdfaWNvbl9kZXNjcmlwdG9yX2xlYWYodV9pbnQzMl90IHZlcnNpb24sCi0JCQkJCQkJdV9pbnQ4X3QgcGFsZXR0ZV9kZXB0aCwKLQkJCQkJCQl1X2ludDhfdCBjb2xvcl9zcGFjZSwKLQkJCQkJCQl1X2ludDE2X3QgbGFuZ3VhZ2UsCi0JCQkJCQkJdV9pbnQxNl90IGhzY2FuLAotCQkJCQkJCXVfaW50MTZfdCB2c2NhbiwKLQkJCQkJCQl1X2ludDMyX3QgKnBhbGV0dGUsCi0JCQkJCQkJdV9pbnQzMl90ICpwaXhlbHMpCi17Ci0Jc3RhdGljIGNvbnN0IGludCBwZFs0XSA9IHsgMCwgNCwgMTYsIDI1NiB9OwotCXN0YXRpYyBjb25zdCBpbnQgY3NbMTZdID0geyA0LCAyIH07CiAJc3RydWN0IGNzcjEyMTJfa2V5dmFsICprdjsKLQlpbnQgcGFsZXR0ZV9zaXplOwotCWludCBwaXhlbF9zaXplID0gKGhzY2FuICogdnNjYW4gKyAzKSAmIH4weDM7CisJdTMyICp0ZXh0OworCXNpemVfdCBzdHJfbGVuLCBxdWFkczsKIAotCWlmICghcGl4ZWxzIHx8ICghcGFsZXR0ZSAmJiBwYWxldHRlX2RlcHRoKSB8fAotCSAgICAocGFsZXR0ZV9kZXB0aCAmIH4weDMpIHx8IChjb2xvcl9zcGFjZSAmIH4weGYpKQorCWlmICghcyB8fCAhKnMgfHwgY3NyMTIxMl9jaGVja19taW5pbWFsX2FzY2lpKHMpKQogCQlyZXR1cm4gTlVMTDsKIAotCXBhbGV0dGVfc2l6ZSA9IHBkW3BhbGV0dGVfZGVwdGhdICogY3NbY29sb3Jfc3BhY2VdOwotCi0Ja3YgPSBjc3IxMjEyX25ld19kZXNjcmlwdG9yX2xlYWYoMSwgMCwgTlVMTCwKLQkJCQkJIHBhbGV0dGVfc2l6ZSArIHBpeGVsX3NpemUgKwotCQkJCQkgQ1NSMTIxMl9JQ09OX0RFU0NSSVBUT1JfTEVBRl9PVkVSSEVBRCk7CisJc3RyX2xlbiA9IHN0cmxlbihzKTsKKwlxdWFkcyA9IGJ5dGVzX3RvX3F1YWRzKHN0cl9sZW4pOworCWt2ID0gY3NyMTIxMl9uZXdfZGVzY3JpcHRvcl9sZWFmKDAsIDAsIE5VTEwsIHF1YWRzX3RvX2J5dGVzKHF1YWRzKSArCisJCQkJICAgICAgQ1NSMTIxMl9URVhUVUFMX0RFU0NSSVBUT1JfTEVBRl9PVkVSSEVBRCk7CiAJaWYgKCFrdikKIAkJcmV0dXJuIE5VTEw7CiAKLQlDU1IxMjEyX0lDT05fREVTQ1JJUFRPUl9MRUFGX1NFVF9WRVJTSU9OKGt2LCB2ZXJzaW9uKTsKLQlDU1IxMjEyX0lDT05fREVTQ1JJUFRPUl9MRUFGX1NFVF9QQUxFVFRFX0RFUFRIKGt2LCBwYWxldHRlX2RlcHRoKTsKLQlDU1IxMjEyX0lDT05fREVTQ1JJUFRPUl9MRUFGX1NFVF9DT0xPUl9TUEFDRShrdiwgY29sb3Jfc3BhY2UpOwotCUNTUjEyMTJfSUNPTl9ERVNDUklQVE9SX0xFQUZfU0VUX0xBTkdVQUdFKGt2LCBsYW5ndWFnZSk7Ci0JQ1NSMTIxMl9JQ09OX0RFU0NSSVBUT1JfTEVBRl9TRVRfSFNDQU4oa3YsIGhzY2FuKTsKLQlDU1IxMjEyX0lDT05fREVTQ1JJUFRPUl9MRUFGX1NFVF9WU0NBTihrdiwgdnNjYW4pOworCWt2LT52YWx1ZS5sZWFmLmRhdGFbMV0gPSAwOwkvKiB3aWR0aCwgY2hhcmFjdGVyX3NldCwgbGFuZ3VhZ2UgKi8KKwl0ZXh0ID0gQ1NSMTIxMl9URVhUVUFMX0RFU0NSSVBUT1JfTEVBRl9EQVRBKGt2KTsKKwl0ZXh0W3F1YWRzIC0gMV0gPSAwOwkJLyogcGFkZGluZyAqLworCW1lbWNweSh0ZXh0LCBzLCBzdHJfbGVuKTsKIAotCWlmIChwYWxldHRlX3NpemUpCi0JCW1lbWNweShDU1IxMjEyX0lDT05fREVTQ1JJUFRPUl9MRUFGX1BBTEVUVEUoa3YpLCBwYWxldHRlLAotCQkgICAgICAgcGFsZXR0ZV9zaXplKTsKLQotCW1lbWNweShDU1IxMjEyX0lDT05fREVTQ1JJUFRPUl9MRUFGX1BJWEVMUyhrdiksIHBpeGVscywgcGl4ZWxfc2l6ZSk7Ci0KLQlyZXR1cm4ga3Y7Ci19Ci0KLXN0cnVjdCBjc3IxMjEyX2tleXZhbCAqY3NyMTIxMl9uZXdfbW9kaWZpYWJsZV9kZXNjcmlwdG9yX2xlYWYodV9pbnQxNl90IG1heF9zaXplLAotCQkJCQkJCSAgICAgIHVfaW50NjRfdCBhZGRyZXNzKQotewotCXN0cnVjdCBjc3IxMjEyX2tleXZhbCAqa3Y7Ci0KLQkvKiBJRUVFIDEyMTIsIHBhci4gNy41LjQuMyAgTW9kaWZpYWJsZSBkZXNjcmlwdG9ycyAqLwotCWt2ID0gY3NyMTIxMl9uZXdfbGVhZihDU1IxMjEyX0tWX0lEX01PRElGSUFCTEVfREVTQ1JJUFRPUiwgTlVMTCwgc2l6ZW9mKHVfaW50NjRfdCkpOwotCWlmKCFrdikKLQkJcmV0dXJuIE5VTEw7Ci0KLQlDU1IxMjEyX01PRElGSUFCTEVfREVTQ1JJUFRPUl9TRVRfTUFYX1NJWkUoa3YsIG1heF9zaXplKTsKLQlDU1IxMjEyX01PRElGSUFCTEVfREVTQ1JJUFRPUl9TRVRfQUREUkVTU19ISShrdiwgYWRkcmVzcyk7Ci0JQ1NSMTIxMl9NT0RJRklBQkxFX0RFU0NSSVBUT1JfU0VUX0FERFJFU1NfTE8oa3YsIGFkZHJlc3MpOwotCi0JcmV0dXJuIGt2OwotfQotCi1zdGF0aWMgaW50IGNzcjEyMTJfY2hlY2tfa2V5d29yZChjb25zdCBjaGFyICpzKQotewotCWZvciAoOyAqczsgcysrKSB7Ci0KLQkJaWYgKCgnQScgPD0gKnMpICYmICgqcyA8PSAnWicpKQotCQkJY29udGludWU7Ci0JCWlmICgoJzAnIDw9ICpzKSAmJiAoKnMgPD0gJzknKSkKLQkJCWNvbnRpbnVlOwotCQlpZiAoKnMgPT0gJy0nKQotCQkJY29udGludWU7Ci0KLQkJcmV0dXJuIC0xOyAvKiBmYWlsZWQgKi8KLQl9Ci0JLyogU3RyaW5nIGNvbmZvcm1zIHRvIGtleXdvcmQsIGFzIHNwZWNpZmllZCBieSBJRUVFIDEyMTIsCi0JICogcGFyLiA3LjYuNSAqLwotCXJldHVybiBDU1IxMjEyX1NVQ0NFU1M7Ci19Ci0KLXN0cnVjdCBjc3IxMjEyX2tleXZhbCAqY3NyMTIxMl9uZXdfa2V5d29yZF9sZWFmKGludCBzdHJjLCBjb25zdCBjaGFyICpzdHJ2W10pCi17Ci0Jc3RydWN0IGNzcjEyMTJfa2V5dmFsICprdjsKLQljaGFyICpidWZmZXI7Ci0JaW50IGksIGRhdGFfbGVuID0gMDsKLQotCS8qIENoZWNrIGFsbCBrZXl3b3JkcyB0byBzZWUgaWYgdGhleSBjb25mb3JtIHRvIHJlc3RyaWN0aW9uczoKLQkgKiBPbmx5IHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVycyBpcyBhbGxvd2VkIFsnQScuLidaJywnMCcuLic5JywnLSddCi0JICogRWFjaCB3b3JkIGlzIHplcm8tdGVybWluYXRlZC4KLQkgKiBBbHNvIGNhbGN1bGF0ZSB0aGUgdG90YWwgbGVuZ3RoIG9mIHRoZSBrZXl3b3Jkcy4KLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgc3RyYzsgaSsrKSB7Ci0JCWlmICghc3RydltpXSB8fCBjc3IxMjEyX2NoZWNrX2tleXdvcmQoc3RydltpXSkpIHsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWRhdGFfbGVuICs9IHN0cmxlbihzdHJ2W2ldKSArIDE7IC8qIEFkZCB6ZXJvLXRlcm1pbmF0aW9uIGNoYXIuICovCi0JfQotCi0JLyogSUVFRSAxMjEyLCBwYXIuIDcuNi41IEtleXdvcmQgbGVhdmVzICovCi0Ja3YgPSBjc3IxMjEyX25ld19sZWFmKENTUjEyMTJfS1ZfSURfS0VZV09SRCwgTlVMTCwgZGF0YV9sZW4pOwotCWlmICgha3YpCi0JCXJldHVybiBOVUxMOwotCi0JYnVmZmVyID0gKGNoYXIgKilrdi0+dmFsdWUubGVhZi5kYXRhOwotCi0JLyogbWFrZSBzdXJlIGxhc3QgcXVhZGxldCBpcyB6ZXJvZWQgb3V0ICovCi0JKigodV9pbnQzMl90KikmKGJ1ZmZlclsoZGF0YV9sZW4gLSAxKSAmIH4weDNdKSkgPSAwOwotCi0JLyogQ29weSBrZXl3b3JkKHMpIGludG8gbGVhZiBkYXRhIGJ1ZmZlciAqLwotCWZvciAoaSA9IDA7IGkgPCBzdHJjOyBpKyspIHsKLQkJaW50IGxlbiA9IHN0cmxlbihzdHJ2W2ldKSArIDE7Ci0JCW1lbWNweShidWZmZXIsIHN0cnZbaV0sIGxlbik7Ci0JCWJ1ZmZlciArPSBsZW47Ci0JfQogCXJldHVybiBrdjsKIH0KIApAQCAtNjc0LDIzICs0ODEsMTIgQEAKIAljc3IxMjEyX3JlbGVhc2Vfa2V5dmFsKGt2KTsKIH0KIAotCi12b2lkIGNzcjEyMTJfZGlzYXNzb2NpYXRlX2tleXZhbChzdHJ1Y3QgY3NyMTIxMl9rZXl2YWwgKmt2KQotewotCWlmIChrdi0+YXNzb2NpYXRlKSB7Ci0JCWNzcjEyMTJfcmVsZWFzZV9rZXl2YWwoa3YtPmFzc29jaWF0ZSk7Ci0JfQotCi0Ja3YtPmFzc29jaWF0ZSA9IE5VTEw7Ci19Ci0KLQogLyogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGZyZWUgdGhlIG1lbW9yeSB0YWtlbiBieSBhIGtleXZhbC4gIElmIHRoZSBnaXZlbgogICoga2V5dmFsIGlzIGEgZGlyZWN0b3J5IHR5cGUsIHRoZW4gYW55IGtleXZhbHMgY29udGFpbmVkIGluIHRoYXQgZGlyZWN0b3J5CiAgKiB3aWxsIGJlIGRlc3Ryb3llZCBhcyB3ZWxsIGlmIHRoZWlyIHJlc3BlY3RpdmUgcmVmY250cyBhcmUgMC4gIEJ5IG1lYW5zIG9mCiAgKiBsaXN0IG1hbmlwdWxhdGlvbiwgdGhpcyByb3V0aW5lIHdpbGwgZGVzY2VuZCBhIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgaW4gYQogICogbm9uLXJlY3Vyc2l2ZSBtYW5uZXIuICovCi12b2lkIF9jc3IxMjEyX2Rlc3Ryb3lfa2V5dmFsKHN0cnVjdCBjc3IxMjEyX2tleXZhbCAqa3YpCitzdGF0aWMgdm9pZCBjc3IxMjEyX2Rlc3Ryb3lfa2V5dmFsKHN0cnVjdCBjc3IxMjEyX2tleXZhbCAqa3YpCiB7CiAJc3RydWN0IGNzcjEyMTJfa2V5dmFsICprLCAqYTsKIAlzdHJ1Y3QgY3NyMTIxMl9kZW50cnkgZGVudHJ5OwpAQCAtNzE1LDExICs1MTEsMTMgQEAKIAkJCWEgPSBrLT5hc3NvY2lhdGU7CiAKIAkJCWlmIChrLT5rZXkudHlwZSA9PSBDU1IxMjEyX0tWX1RZUEVfRElSRUNUT1JZKSB7Ci0JCQkJLyogSWYgdGhlIGN1cnJlbnQgZW50cnkgaXMgYSBkaXJlY3RvcnksIHRoZW4gbW92ZSBhbGwKKwkJCQkvKiBJZiB0aGUgY3VycmVudCBlbnRyeSBpcyBhIGRpcmVjdG9yeSwgbW92ZSBhbGwKIAkJCQkgKiB0aGUgZW50cmllcyB0byB0aGUgZGVzdHJ1Y3Rpb24gbGlzdC4gKi8KIAkJCQlpZiAoay0+dmFsdWUuZGlyZWN0b3J5LmRlbnRyaWVzX2hlYWQpIHsKLQkJCQkJdGFpbC0+bmV4dCA9IGstPnZhbHVlLmRpcmVjdG9yeS5kZW50cmllc19oZWFkOwotCQkJCQlrLT52YWx1ZS5kaXJlY3RvcnkuZGVudHJpZXNfaGVhZC0+cHJldiA9IHRhaWw7CisJCQkJCXRhaWwtPm5leHQgPQorCQkJCQkgICAgay0+dmFsdWUuZGlyZWN0b3J5LmRlbnRyaWVzX2hlYWQ7CisJCQkJCWstPnZhbHVlLmRpcmVjdG9yeS5kZW50cmllc19oZWFkLT5wcmV2ID0KKwkJCQkJICAgIHRhaWw7CiAJCQkJCXRhaWwgPSBrLT52YWx1ZS5kaXJlY3RvcnkuZGVudHJpZXNfdGFpbDsKIAkJCQl9CiAJCQl9CkBAIC03MjksMTUgKzUyNywyMiBAQAogCiAJCWhlYWQgPSBoZWFkLT5uZXh0OwogCQlpZiAoaGVhZCkgewotCQkJaWYgKGhlYWQtPnByZXYgJiYgaGVhZC0+cHJldiAhPSAmZGVudHJ5KSB7CisJCQlpZiAoaGVhZC0+cHJldiAmJiBoZWFkLT5wcmV2ICE9ICZkZW50cnkpCiAJCQkJQ1NSMTIxMl9GUkVFKGhlYWQtPnByZXYpOwotCQkJfQogCQkJaGVhZC0+cHJldiA9IE5VTEw7Ci0JCX0gZWxzZSBpZiAodGFpbCAhPSAmZGVudHJ5KQorCQl9IGVsc2UgaWYgKHRhaWwgIT0gJmRlbnRyeSkgewogCQkJQ1NSMTIxMl9GUkVFKHRhaWwpOworCQl9CiAJfQogfQogCit2b2lkIGNzcjEyMTJfcmVsZWFzZV9rZXl2YWwoc3RydWN0IGNzcjEyMTJfa2V5dmFsICprdikKK3sKKwlpZiAoa3YtPnJlZmNudCA+IDEpCisJCWt2LT5yZWZjbnQtLTsKKwllbHNlCisJCWNzcjEyMTJfZGVzdHJveV9rZXl2YWwoa3YpOworfQogCiB2b2lkIGNzcjEyMTJfZGVzdHJveV9jc3Ioc3RydWN0IGNzcjEyMTJfY3NyICpjc3IpCiB7CkBAIC03NjMsNDkgKzU2OCw1MSBAQAogfQogCiAKLQogLyogQ1NSIEltYWdlIENyZWF0aW9uICovCiAKIHN0YXRpYyBpbnQgY3NyMTIxMl9hcHBlbmRfbmV3X2NhY2hlKHN0cnVjdCBjc3IxMjEyX2NzciAqY3NyLCBzaXplX3Qgcm9tc2l6ZSkKIHsKIAlzdHJ1Y3QgY3NyMTIxMl9jc3Jfcm9tX2NhY2hlICpjYWNoZTsKLQl1X2ludDY0X3QgY3NyX2FkZHI7CisJdTY0IGNzcl9hZGRyOwogCi0JaWYgKCFjc3IgfHwgIWNzci0+b3BzIHx8ICFjc3ItPm9wcy0+YWxsb2NhdGVfYWRkcl9yYW5nZSB8fAotCSAgICAhY3NyLT5vcHMtPnJlbGVhc2VfYWRkciB8fCBjc3ItPm1heF9yb20gPCAxKQotCQlyZXR1cm4gQ1NSMTIxMl9FSU5WQUw7CisJQlVHX09OKCFjc3IgfHwgIWNzci0+b3BzIHx8ICFjc3ItPm9wcy0+YWxsb2NhdGVfYWRkcl9yYW5nZSB8fAorCSAgICAgICAhY3NyLT5vcHMtPnJlbGVhc2VfYWRkciB8fCBjc3ItPm1heF9yb20gPCAxKTsKIAogCS8qIFJPTSBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiBjc3ItPm1heF9yb20gKi8KIAlyb21zaXplID0gKHJvbXNpemUgKyAoY3NyLT5tYXhfcm9tIC0gMSkpICYgfihjc3ItPm1heF9yb20gLSAxKTsKIAotCWNzcl9hZGRyID0gY3NyLT5vcHMtPmFsbG9jYXRlX2FkZHJfcmFuZ2Uocm9tc2l6ZSwgY3NyLT5tYXhfcm9tLCBjc3ItPnByaXZhdGUpOwotCWlmIChjc3JfYWRkciA9PSBDU1IxMjEyX0lOVkFMSURfQUREUl9TUEFDRSkgewotCQlyZXR1cm4gQ1NSMTIxMl9FTk9NRU07Ci0JfQorCWNzcl9hZGRyID0gY3NyLT5vcHMtPmFsbG9jYXRlX2FkZHJfcmFuZ2Uocm9tc2l6ZSwgY3NyLT5tYXhfcm9tLAorCQkJCQkJIGNzci0+cHJpdmF0ZSk7CisJaWYgKGNzcl9hZGRyID09IENTUjEyMTJfSU5WQUxJRF9BRERSX1NQQUNFKQorCQlyZXR1cm4gLUVOT01FTTsKKwogCWlmIChjc3JfYWRkciA8IENTUjEyMTJfUkVHSVNURVJfU1BBQ0VfQkFTRSkgewogCQkvKiBJbnZhbGlkIGFkZHJlc3MgcmV0dXJuZWQgZnJvbSBhbGxvY2F0ZV9hZGRyX3JhbmdlKCkuICovCiAJCWNzci0+b3BzLT5yZWxlYXNlX2FkZHIoY3NyX2FkZHIsIGNzci0+cHJpdmF0ZSk7Ci0JCXJldHVybiBDU1IxMjEyX0VOT01FTTsKKwkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JY2FjaGUgPSBjc3IxMjEyX3JvbV9jYWNoZV9tYWxsb2MoY3NyX2FkZHIgLSBDU1IxMjEyX1JFR0lTVEVSX1NQQUNFX0JBU0UsIHJvbXNpemUpOworCWNhY2hlID0gY3NyMTIxMl9yb21fY2FjaGVfbWFsbG9jKGNzcl9hZGRyIC0gQ1NSMTIxMl9SRUdJU1RFUl9TUEFDRV9CQVNFLAorCQkJCQkgcm9tc2l6ZSk7CiAJaWYgKCFjYWNoZSkgewogCQljc3ItPm9wcy0+cmVsZWFzZV9hZGRyKGNzcl9hZGRyLCBjc3ItPnByaXZhdGUpOwotCQlyZXR1cm4gQ1NSMTIxMl9FTk9NRU07CisJCXJldHVybiAtRU5PTUVNOwogCX0KIAotCWNhY2hlLT5leHRfcm9tID0gY3NyMTIxMl9uZXdfa2V5dmFsKENTUjEyMTJfS1ZfVFlQRV9MRUFGLCBDU1IxMjEyX0tWX0lEX0VYVEVOREVEX1JPTSk7CisJY2FjaGUtPmV4dF9yb20gPSBjc3IxMjEyX25ld19rZXl2YWwoQ1NSMTIxMl9LVl9UWVBFX0xFQUYsCisJCQkJCSAgICBDU1IxMjEyX0tWX0lEX0VYVEVOREVEX1JPTSk7CiAJaWYgKCFjYWNoZS0+ZXh0X3JvbSkgewogCQljc3ItPm9wcy0+cmVsZWFzZV9hZGRyKGNzcl9hZGRyLCBjc3ItPnByaXZhdGUpOwogCQlDU1IxMjEyX0ZSRUUoY2FjaGUpOwotCQlyZXR1cm4gQ1NSMTIxMl9FTk9NRU07CisJCXJldHVybiAtRU5PTUVNOwogCX0KIAotCWlmIChjc3IxMjEyX2F0dGFjaF9rZXl2YWxfdG9fZGlyZWN0b3J5KGNzci0+cm9vdF9rdiwgY2FjaGUtPmV4dF9yb20pICE9IENTUjEyMTJfU1VDQ0VTUykgeworCWlmIChjc3IxMjEyX2F0dGFjaF9rZXl2YWxfdG9fZGlyZWN0b3J5KGNzci0+cm9vdF9rdiwgY2FjaGUtPmV4dF9yb20pICE9CisJICAgIENTUjEyMTJfU1VDQ0VTUykgewogCQljc3IxMjEyX3JlbGVhc2Vfa2V5dmFsKGNhY2hlLT5leHRfcm9tKTsKIAkJY3NyLT5vcHMtPnJlbGVhc2VfYWRkcihjc3JfYWRkciwgY3NyLT5wcml2YXRlKTsKIAkJQ1NSMTIxMl9GUkVFKGNhY2hlKTsKLQkJcmV0dXJuIENTUjEyMTJfRU5PTUVNOworCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJY2FjaGUtPmV4dF9yb20tPm9mZnNldCA9IGNzcl9hZGRyIC0gQ1NSMTIxMl9SRUdJU1RFUl9TUEFDRV9CQVNFOwogCWNhY2hlLT5leHRfcm9tLT52YWx1ZS5sZWFmLmxlbiA9IC0xOwpAQCAtODE4LDggKzYyNSw4IEBACiAJcmV0dXJuIENTUjEyMTJfU1VDQ0VTUzsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGNzcjEyMTJfcmVtb3ZlX2NhY2hlKHN0cnVjdCBjc3IxMjEyX2NzciAqY3NyLAotCQkJCQlzdHJ1Y3QgY3NyMTIxMl9jc3Jfcm9tX2NhY2hlICpjYWNoZSkKK3N0YXRpYyB2b2lkIGNzcjEyMTJfcmVtb3ZlX2NhY2hlKHN0cnVjdCBjc3IxMjEyX2NzciAqY3NyLAorCQkJCSBzdHJ1Y3QgY3NyMTIxMl9jc3Jfcm9tX2NhY2hlICpjYWNoZSkKIHsKIAlpZiAoY3NyLT5jYWNoZV9oZWFkID09IGNhY2hlKQogCQljc3ItPmNhY2hlX2hlYWQgPSBjYWNoZS0+bmV4dDsKQEAgLTgzMiw3ICs2MzksOCBAQAogCQljYWNoZS0+bmV4dC0+cHJldiA9IGNhY2hlLT5wcmV2OwogCiAJaWYgKGNhY2hlLT5leHRfcm9tKSB7Ci0JCWNzcjEyMTJfZGV0YWNoX2tleXZhbF9mcm9tX2RpcmVjdG9yeShjc3ItPnJvb3Rfa3YsIGNhY2hlLT5leHRfcm9tKTsKKwkJY3NyMTIxMl9kZXRhY2hfa2V5dmFsX2Zyb21fZGlyZWN0b3J5KGNzci0+cm9vdF9rdiwKKwkJCQkJCSAgICAgY2FjaGUtPmV4dF9yb20pOwogCQljc3IxMjEyX3JlbGVhc2Vfa2V5dmFsKGNhY2hlLT5leHRfcm9tKTsKIAl9CiAKQEAgLTg1MiwyOCArNjYwLDI5IEBACiAJICAgICBkZW50cnkgPSBkZW50cnktPm5leHQpIHsKIAkJZm9yIChka3YgPSBkZW50cnktPmt2OyBka3Y7IGRrdiA9IGRrdi0+YXNzb2NpYXRlKSB7CiAJCQkvKiBTcGVjaWFsIENhc2U6IEV4dGVuZGVkIEtleSBTcGVjaWZpZXJfSUQgKi8KLQkJCWlmIChka3YtPmtleS5pZCA9PSBDU1IxMjEyX0tWX0lEX0VYVEVOREVEX0tFWV9TUEVDSUZJRVJfSUQpIHsKLQkJCQlpZiAobGFzdF9leHRrZXlfc3BlYyA9PSBOVUxMKSB7CisJCQlpZiAoZGt2LT5rZXkuaWQgPT0KKwkJCSAgICBDU1IxMjEyX0tWX0lEX0VYVEVOREVEX0tFWV9TUEVDSUZJRVJfSUQpIHsKKwkJCQlpZiAobGFzdF9leHRrZXlfc3BlYyA9PSBOVUxMKQogCQkJCQlsYXN0X2V4dGtleV9zcGVjID0gZGt2OwotCQkJCX0gZWxzZSBpZiAoZGt2LT52YWx1ZS5pbW1lZGlhdGUgIT0gbGFzdF9leHRrZXlfc3BlYy0+dmFsdWUuaW1tZWRpYXRlKSB7CisJCQkJZWxzZSBpZiAoZGt2LT52YWx1ZS5pbW1lZGlhdGUgIT0KKwkJCQkJIGxhc3RfZXh0a2V5X3NwZWMtPnZhbHVlLmltbWVkaWF0ZSkKIAkJCQkJbGFzdF9leHRrZXlfc3BlYyA9IGRrdjsKLQkJCQl9IGVsc2UgeworCQkJCWVsc2UKIAkJCQkJY29udGludWU7Ci0JCQkJfQogCQkJLyogU3BlY2lhbCBDYXNlOiBFeHRlbmRlZCBLZXkgKi8KIAkJCX0gZWxzZSBpZiAoZGt2LT5rZXkuaWQgPT0gQ1NSMTIxMl9LVl9JRF9FWFRFTkRFRF9LRVkpIHsKLQkJCQlpZiAobGFzdF9leHRrZXkgPT0gTlVMTCkgeworCQkJCWlmIChsYXN0X2V4dGtleSA9PSBOVUxMKQogCQkJCQlsYXN0X2V4dGtleSA9IGRrdjsKLQkJCQl9IGVsc2UgaWYgKGRrdi0+dmFsdWUuaW1tZWRpYXRlICE9IGxhc3RfZXh0a2V5LT52YWx1ZS5pbW1lZGlhdGUpIHsKKwkJCQllbHNlIGlmIChka3YtPnZhbHVlLmltbWVkaWF0ZSAhPQorCQkJCQkgbGFzdF9leHRrZXktPnZhbHVlLmltbWVkaWF0ZSkKIAkJCQkJbGFzdF9leHRrZXkgPSBka3Y7Ci0JCQkJfSBlbHNlIHsKKwkJCQllbHNlCiAJCQkJCWNvbnRpbnVlOwotCQkJCX0KIAkJCX0KIAogCQkJbnVtX2VudHJpZXMgKz0gMTsKIAotCQkJc3dpdGNoKGRrdi0+a2V5LnR5cGUpIHsKKwkJCXN3aXRjaCAoZGt2LT5rZXkudHlwZSkgewogCQkJZGVmYXVsdDoKIAkJCWNhc2UgQ1NSMTIxMl9LVl9UWVBFX0lNTUVESUFURToKIAkJCWNhc2UgQ1NSMTIxMl9LVl9UWVBFX0NTUl9PRkZTRVQ6CkBAIC04OTEsOCArNzAwLDkgQEAKIAkJCQkvKiBTcGVjaWFsIGNhc2U6IEV4dGVuZGVkIFJPTSBsZWFmcyAqLwogCQkJCWlmIChka3YtPmtleS5pZCA9PSBDU1IxMjEyX0tWX0lEX0VYVEVOREVEX1JPTSkgewogCQkJCQlka3YtPnZhbHVlLmxlYWYubGVuID0gLTE7Ci0JCQkJCS8qIERvbid0IGFkZCBFeHRlbmRlZCBST00gbGVhZnMgaW4gdGhlIGxheW91dCBsaXN0LAotCQkJCQkgKiB0aGV5IGFyZSBoYW5kbGVkIGRpZmZlcmVudGx5LiAqLworCQkJCQkvKiBEb24ndCBhZGQgRXh0ZW5kZWQgUk9NIGxlYWZzIGluIHRoZQorCQkJCQkgKiBsYXlvdXQgbGlzdCwgdGhleSBhcmUgaGFuZGxlZAorCQkJCQkgKiBkaWZmZXJlbnRseS4gKi8KIAkJCQkJYnJlYWs7CiAJCQkJfQogCkBAIC05MDgsMjAgKzcxOCwyMSBAQAogCXJldHVybiBudW1fZW50cmllczsKIH0KIAotc2l6ZV90IGNzcjEyMTJfZ2VuZXJhdGVfbGF5b3V0X29yZGVyKHN0cnVjdCBjc3IxMjEyX2tleXZhbCAqa3YpCitzdGF0aWMgc2l6ZV90IGNzcjEyMTJfZ2VuZXJhdGVfbGF5b3V0X29yZGVyKHN0cnVjdCBjc3IxMjEyX2tleXZhbCAqa3YpCiB7CiAJc3RydWN0IGNzcjEyMTJfa2V5dmFsICpsdGFpbCA9IGt2OwogCXNpemVfdCBhZ2dfc2l6ZSA9IDA7CiAKLQl3aGlsZShrdikgewotCQlzd2l0Y2goa3YtPmtleS50eXBlKSB7CisJd2hpbGUgKGt2KSB7CisJCXN3aXRjaCAoa3YtPmtleS50eXBlKSB7CiAJCWNhc2UgQ1NSMTIxMl9LVl9UWVBFX0xFQUY6CiAJCQkvKiBBZGQgMSBxdWFkbGV0IGZvciBjcmMvbGVuIGZpZWxkICovCiAJCQlhZ2dfc2l6ZSArPSBrdi0+dmFsdWUubGVhZi5sZW4gKyAxOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBDU1IxMjEyX0tWX1RZUEVfRElSRUNUT1JZOgotCQkJa3YtPnZhbHVlLmRpcmVjdG9yeS5sZW4gPSBjc3IxMjEyX2dlbmVyYXRlX2xheW91dF9zdWJkaXIoa3YsICZsdGFpbCk7CisJCQlrdi0+dmFsdWUuZGlyZWN0b3J5LmxlbiA9CisJCQkJY3NyMTIxMl9nZW5lcmF0ZV9sYXlvdXRfc3ViZGlyKGt2LCAmbHRhaWwpOwogCQkJLyogQWRkIDEgcXVhZGxldCBmb3IgY3JjL2xlbiBmaWVsZCAqLwogCQkJYWdnX3NpemUgKz0ga3YtPnZhbHVlLmRpcmVjdG9yeS5sZW4gKyAxOwogCQkJYnJlYWs7CkBAIC05MzEsOSArNzQyLDkgQEAKIAlyZXR1cm4gcXVhZHNfdG9fYnl0ZXMoYWdnX3NpemUpOwogfQogCi1zdHJ1Y3QgY3NyMTIxMl9rZXl2YWwgKmNzcjEyMTJfZ2VuZXJhdGVfcG9zaXRpb25zKHN0cnVjdCBjc3IxMjEyX2Nzcl9yb21fY2FjaGUgKmNhY2hlLAotCQkJCQkJICBzdHJ1Y3QgY3NyMTIxMl9rZXl2YWwgKnN0YXJ0X2t2LAotCQkJCQkJICBpbnQgc3RhcnRfcG9zKQorc3RhdGljIHN0cnVjdCBjc3IxMjEyX2tleXZhbCAqCitjc3IxMjEyX2dlbmVyYXRlX3Bvc2l0aW9ucyhzdHJ1Y3QgY3NyMTIxMl9jc3Jfcm9tX2NhY2hlICpjYWNoZSwKKwkJCSAgIHN0cnVjdCBjc3IxMjEyX2tleXZhbCAqc3RhcnRfa3YsIGludCBzdGFydF9wb3MpCiB7CiAJc3RydWN0IGNzcjEyMTJfa2V5dmFsICprdiA9IHN0YXJ0X2t2OwogCXN0cnVjdCBjc3IxMjEyX2tleXZhbCAqb2t2ID0gc3RhcnRfa3Y7CkBAIC05NDIsMTMgKzc1MywxMiBAQAogCiAJY2FjaGUtPmxheW91dF9oZWFkID0ga3Y7CiAKLQl3aGlsZShrdiAmJiBwb3MgPCBjYWNoZS0+c2l6ZSkgeworCXdoaWxlIChrdiAmJiBwb3MgPCBjYWNoZS0+c2l6ZSkgewogCQkvKiBTcGVjaWFsIGNhc2U6IEV4dGVuZGVkIFJPTSBsZWFmcyAqLwotCQlpZiAoa3YtPmtleS5pZCAhPSBDU1IxMjEyX0tWX0lEX0VYVEVOREVEX1JPTSkgeworCQlpZiAoa3YtPmtleS5pZCAhPSBDU1IxMjEyX0tWX0lEX0VYVEVOREVEX1JPTSkKIAkJCWt2LT5vZmZzZXQgPSBjYWNoZS0+b2Zmc2V0ICsgcG9zOwotCQl9CiAKLQkJc3dpdGNoKGt2LT5rZXkudHlwZSkgeworCQlzd2l0Y2ggKGt2LT5rZXkudHlwZSkgewogCQljYXNlIENTUjEyMTJfS1ZfVFlQRV9MRUFGOgogCQkJa3ZfbGVuID0ga3YtPnZhbHVlLmxlYWYubGVuOwogCQkJYnJlYWs7CkBAIC05NTksNiArNzY5LDcgQEAKIAogCQlkZWZhdWx0OgogCQkJLyogU2hvdWxkIG5ldmVyIGdldCBoZXJlICovCisJCQlXQVJOX09OKDEpOwogCQkJYnJlYWs7CiAJCX0KIApAQCAtOTcyLDQ2ICs3ODMsNTUgQEAKIAl9CiAKIAljYWNoZS0+bGF5b3V0X3RhaWwgPSBva3Y7Ci0JY2FjaGUtPmxlbiA9IChva3YtPm9mZnNldCAtIGNhY2hlLT5vZmZzZXQpICsgcXVhZHNfdG9fYnl0ZXMob2t2X2xlbiArIDEpOworCWNhY2hlLT5sZW4gPSBva3YtPm9mZnNldCAtIGNhY2hlLT5vZmZzZXQgKyBxdWFkc190b19ieXRlcyhva3ZfbGVuICsgMSk7CiAKIAlyZXR1cm4ga3Y7CiB9CiAKLXN0YXRpYyB2b2lkIGNzcjEyMTJfZ2VuZXJhdGVfdHJlZV9zdWJkaXIoc3RydWN0IGNzcjEyMTJfa2V5dmFsICpkaXIsCi0JCQkJCSB1X2ludDMyX3QgKmRhdGFfYnVmZmVyKQorI2RlZmluZSBDU1IxMjEyX0tWX0tFWV9TSElGVAkJMjQKKyNkZWZpbmUgQ1NSMTIxMl9LVl9LRVlfVFlQRV9TSElGVAk2CisjZGVmaW5lIENTUjEyMTJfS1ZfS0VZX0lEX01BU0sJCTB4M2YKKyNkZWZpbmUgQ1NSMTIxMl9LVl9LRVlfVFlQRV9NQVNLCTB4MwkvKiBhZnRlciBzaGlmdCAqLworCitzdGF0aWMgdm9pZAorY3NyMTIxMl9nZW5lcmF0ZV90cmVlX3N1YmRpcihzdHJ1Y3QgY3NyMTIxMl9rZXl2YWwgKmRpciwgdTMyICpkYXRhX2J1ZmZlcikKIHsKIAlzdHJ1Y3QgY3NyMTIxMl9kZW50cnkgKmRlbnRyeTsKIAlzdHJ1Y3QgY3NyMTIxMl9rZXl2YWwgKmxhc3RfZXh0a2V5X3NwZWMgPSBOVUxMOwogCXN0cnVjdCBjc3IxMjEyX2tleXZhbCAqbGFzdF9leHRrZXkgPSBOVUxMOwogCWludCBpbmRleCA9IDA7CiAKLQlmb3IgKGRlbnRyeSA9IGRpci0+dmFsdWUuZGlyZWN0b3J5LmRlbnRyaWVzX2hlYWQ7IGRlbnRyeTsgZGVudHJ5ID0gZGVudHJ5LT5uZXh0KSB7CisJZm9yIChkZW50cnkgPSBkaXItPnZhbHVlLmRpcmVjdG9yeS5kZW50cmllc19oZWFkOworCSAgICAgZGVudHJ5OworCSAgICAgZGVudHJ5ID0gZGVudHJ5LT5uZXh0KSB7CiAJCXN0cnVjdCBjc3IxMjEyX2tleXZhbCAqYTsKIAogCQlmb3IgKGEgPSBkZW50cnktPmt2OyBhOyBhID0gYS0+YXNzb2NpYXRlKSB7Ci0JCQl1X2ludDMyX3QgdmFsdWUgPSAwOworCQkJdTMyIHZhbHVlID0gMDsKIAogCQkJLyogU3BlY2lhbCBDYXNlOiBFeHRlbmRlZCBLZXkgU3BlY2lmaWVyX0lEICovCi0JCQlpZiAoYS0+a2V5LmlkID09IENTUjEyMTJfS1ZfSURfRVhURU5ERURfS0VZX1NQRUNJRklFUl9JRCkgewotCQkJCWlmIChsYXN0X2V4dGtleV9zcGVjID09IE5VTEwpIHsKKwkJCWlmIChhLT5rZXkuaWQgPT0KKwkJCSAgICBDU1IxMjEyX0tWX0lEX0VYVEVOREVEX0tFWV9TUEVDSUZJRVJfSUQpIHsKKwkJCQlpZiAobGFzdF9leHRrZXlfc3BlYyA9PSBOVUxMKQogCQkJCQlsYXN0X2V4dGtleV9zcGVjID0gYTsKLQkJCQl9IGVsc2UgaWYgKGEtPnZhbHVlLmltbWVkaWF0ZSAhPSBsYXN0X2V4dGtleV9zcGVjLT52YWx1ZS5pbW1lZGlhdGUpIHsKKwkJCQllbHNlIGlmIChhLT52YWx1ZS5pbW1lZGlhdGUgIT0KKwkJCQkJIGxhc3RfZXh0a2V5X3NwZWMtPnZhbHVlLmltbWVkaWF0ZSkKIAkJCQkJbGFzdF9leHRrZXlfc3BlYyA9IGE7Ci0JCQkJfSBlbHNlIHsKKwkJCQllbHNlCiAJCQkJCWNvbnRpbnVlOwotCQkJCX0KKwogCQkJLyogU3BlY2lhbCBDYXNlOiBFeHRlbmRlZCBLZXkgKi8KIAkJCX0gZWxzZSBpZiAoYS0+a2V5LmlkID09IENTUjEyMTJfS1ZfSURfRVhURU5ERURfS0VZKSB7Ci0JCQkJaWYgKGxhc3RfZXh0a2V5ID09IE5VTEwpIHsKKwkJCQlpZiAobGFzdF9leHRrZXkgPT0gTlVMTCkKIAkJCQkJbGFzdF9leHRrZXkgPSBhOwotCQkJCX0gZWxzZSBpZiAoYS0+dmFsdWUuaW1tZWRpYXRlICE9IGxhc3RfZXh0a2V5LT52YWx1ZS5pbW1lZGlhdGUpIHsKKwkJCQllbHNlIGlmIChhLT52YWx1ZS5pbW1lZGlhdGUgIT0KKwkJCQkJIGxhc3RfZXh0a2V5LT52YWx1ZS5pbW1lZGlhdGUpCiAJCQkJCWxhc3RfZXh0a2V5ID0gYTsKLQkJCQl9IGVsc2UgeworCQkJCWVsc2UKIAkJCQkJY29udGludWU7Ci0JCQkJfQogCQkJfQogCi0JCQlzd2l0Y2goYS0+a2V5LnR5cGUpIHsKKwkJCXN3aXRjaCAoYS0+a2V5LnR5cGUpIHsKIAkJCWNhc2UgQ1NSMTIxMl9LVl9UWVBFX0lNTUVESUFURToKIAkJCQl2YWx1ZSA9IGEtPnZhbHVlLmltbWVkaWF0ZTsKIAkJCQlicmVhazsKQEAgLTEwMzAsMzIgKzg1MCw0NiBAQAogCQkJCWJyZWFrOwogCQkJZGVmYXVsdDoKIAkJCQkvKiBTaG91bGQgbmV2ZXIgZ2V0IGhlcmUgKi8KLQkJCQlicmVhazsgLyogR0RCIGJyZWFrcG9pbnQgKi8KKwkJCQlXQVJOX09OKDEpOworCQkJCWJyZWFrOwogCQkJfQogCi0JCQl2YWx1ZSB8PSAoYS0+a2V5LmlkICYgQ1NSMTIxMl9LVl9LRVlfSURfTUFTSykgPDwgQ1NSMTIxMl9LVl9LRVlfU0hJRlQ7CisJCQl2YWx1ZSB8PSAoYS0+a2V5LmlkICYgQ1NSMTIxMl9LVl9LRVlfSURfTUFTSykgPDwKKwkJCQkgQ1NSMTIxMl9LVl9LRVlfU0hJRlQ7CiAJCQl2YWx1ZSB8PSAoYS0+a2V5LnR5cGUgJiBDU1IxMjEyX0tWX0tFWV9UWVBFX01BU0spIDw8Ci0JCQkJKENTUjEyMTJfS1ZfS0VZX1NISUZUICsgQ1NSMTIxMl9LVl9LRVlfVFlQRV9TSElGVCk7Ci0JCQlkYXRhX2J1ZmZlcltpbmRleF0gPSBDU1IxMjEyX0NQVV9UT19CRTMyKHZhbHVlKTsKKwkJCQkgKENTUjEyMTJfS1ZfS0VZX1NISUZUICsKKwkJCQkgIENTUjEyMTJfS1ZfS0VZX1RZUEVfU0hJRlQpOworCQkJZGF0YV9idWZmZXJbaW5kZXhdID0gY3B1X3RvX2JlMzIodmFsdWUpOwogCQkJaW5kZXgrKzsKIAkJfQogCX0KIH0KIAotdm9pZCBjc3IxMjEyX2ZpbGxfY2FjaGUoc3RydWN0IGNzcjEyMTJfY3NyX3JvbV9jYWNoZSAqY2FjaGUpCitzdHJ1Y3QgY3NyMTIxMl9rZXl2YWxfaW1nIHsKKwl1MTYgbGVuZ3RoOworCXUxNiBjcmM7CisKKwkvKiBNdXN0IGJlIGxhc3QgKi8KKwl1MzIgZGF0YVswXTsJLyogb2xkZXIgZ2NjIGNhbid0IGhhbmRsZSBbXSB3aGljaCBpcyBzdGFuZGFyZCAqLworfTsKKworc3RhdGljIHZvaWQgY3NyMTIxMl9maWxsX2NhY2hlKHN0cnVjdCBjc3IxMjEyX2Nzcl9yb21fY2FjaGUgKmNhY2hlKQogewogCXN0cnVjdCBjc3IxMjEyX2tleXZhbCAqa3YsICpua3Y7CiAJc3RydWN0IGNzcjEyMTJfa2V5dmFsX2ltZyAqa3ZpOwogCi0JZm9yIChrdiA9IGNhY2hlLT5sYXlvdXRfaGVhZDsga3YgIT0gY2FjaGUtPmxheW91dF90YWlsLT5uZXh0OyBrdiA9IG5rdikgewotCQlrdmkgPSAoc3RydWN0IGNzcjEyMTJfa2V5dmFsX2ltZyAqKQotCQkJKGNhY2hlLT5kYXRhICsgYnl0ZXNfdG9fcXVhZHMoa3YtPm9mZnNldCAtIGNhY2hlLT5vZmZzZXQpKTsKLQkJc3dpdGNoKGt2LT5rZXkudHlwZSkgeworCWZvciAoa3YgPSBjYWNoZS0+bGF5b3V0X2hlYWQ7CisJICAgICBrdiAhPSBjYWNoZS0+bGF5b3V0X3RhaWwtPm5leHQ7CisJICAgICBrdiA9IG5rdikgeworCQlrdmkgPSAoc3RydWN0IGNzcjEyMTJfa2V5dmFsX2ltZyAqKShjYWNoZS0+ZGF0YSArCisJCQkJYnl0ZXNfdG9fcXVhZHMoa3YtPm9mZnNldCAtIGNhY2hlLT5vZmZzZXQpKTsKKwkJc3dpdGNoIChrdi0+a2V5LnR5cGUpIHsKIAkJZGVmYXVsdDoKIAkJY2FzZSBDU1IxMjEyX0tWX1RZUEVfSU1NRURJQVRFOgogCQljYXNlIENTUjEyMTJfS1ZfVFlQRV9DU1JfT0ZGU0VUOgogCQkJLyogU2hvdWxkIG5ldmVyIGdldCBoZXJlICovCi0JCQlicmVhazsgLyogR0RCIGJyZWFrcG9pbnQgKi8KKwkJCVdBUk5fT04oMSk7CisJCQlicmVhazsKIAogCQljYXNlIENTUjEyMTJfS1ZfVFlQRV9MRUFGOgogCQkJLyogRG9uJ3QgY29weSBvdmVyIEV4dGVuZGVkIFJPTSBhcmVhcywgdGhleSBhcmUKQEAgLTEwNjQsMTUgKzg5OCwxNiBAQAogCQkJCW1lbWNweShrdmktPmRhdGEsIGt2LT52YWx1ZS5sZWFmLmRhdGEsCiAJCQkJICAgICAgIHF1YWRzX3RvX2J5dGVzKGt2LT52YWx1ZS5sZWFmLmxlbikpOwogCi0JCQlrdmktPmxlbmd0aCA9IENTUjEyMTJfQ1BVX1RPX0JFMTYoa3YtPnZhbHVlLmxlYWYubGVuKTsKKwkJCWt2aS0+bGVuZ3RoID0gY3B1X3RvX2JlMTYoa3YtPnZhbHVlLmxlYWYubGVuKTsKIAkJCWt2aS0+Y3JjID0gY3NyMTIxMl9jcmMxNihrdmktPmRhdGEsIGt2LT52YWx1ZS5sZWFmLmxlbik7CiAJCQlicmVhazsKIAogCQljYXNlIENTUjEyMTJfS1ZfVFlQRV9ESVJFQ1RPUlk6CiAJCQljc3IxMjEyX2dlbmVyYXRlX3RyZWVfc3ViZGlyKGt2LCBrdmktPmRhdGEpOwogCi0JCQlrdmktPmxlbmd0aCA9IENTUjEyMTJfQ1BVX1RPX0JFMTYoa3YtPnZhbHVlLmRpcmVjdG9yeS5sZW4pOwotCQkJa3ZpLT5jcmMgPSBjc3IxMjEyX2NyYzE2KGt2aS0+ZGF0YSwga3YtPnZhbHVlLmRpcmVjdG9yeS5sZW4pOworCQkJa3ZpLT5sZW5ndGggPSBjcHVfdG9fYmUxNihrdi0+dmFsdWUuZGlyZWN0b3J5Lmxlbik7CisJCQlrdmktPmNyYyA9IGNzcjEyMTJfY3JjMTYoa3ZpLT5kYXRhLAorCQkJCQkJIGt2LT52YWx1ZS5kaXJlY3RvcnkubGVuKTsKIAkJCWJyZWFrOwogCQl9CiAKQEAgLTEwODYsNiArOTIxLDEwIEBACiAJfQogfQogCisvKiBUaGlzIHNpemUgaXMgYXJiaXRyYXJpbHkgY2hvc2VuLgorICogVGhlIHN0cnVjdCBvdmVyaGVhZCBpcyBzdWJ0cmFjdGVkIGZvciBtb3JlIGVjb25vbWljIGFsbG9jYXRpb25zLiAqLworI2RlZmluZSBDU1IxMjEyX0VYVEVOREVEX1JPTV9TSVpFICgyMDQ4IC0gc2l6ZW9mKHN0cnVjdCBjc3IxMjEyX2Nzcl9yb21fY2FjaGUpKQorCiBpbnQgY3NyMTIxMl9nZW5lcmF0ZV9jc3JfaW1hZ2Uoc3RydWN0IGNzcjEyMTJfY3NyICpjc3IpCiB7CiAJc3RydWN0IGNzcjEyMTJfYnVzX2luZm9fYmxvY2tfaW1nICpiaTsKQEAgLTEwOTUsOCArOTM0LDcgQEAKIAlpbnQgcmV0OwogCWludCBpbml0X29mZnNldDsKIAotCWlmICghY3NyKQotCQlyZXR1cm4gQ1NSMTIxMl9FSU5WQUw7CisJQlVHX09OKCFjc3IpOwogCiAJY2FjaGUgPSBjc3ItPmNhY2hlX2hlYWQ7CiAKQEAgLTExMTMsMTggKzk1MSwyMSBAQAogCiAJaW5pdF9vZmZzZXQgPSBjc3ItPmJ1c19pbmZvX2xlbjsKIAotCWZvciAoa3YgPSBjc3ItPnJvb3Rfa3YsIGNhY2hlID0gY3NyLT5jYWNoZV9oZWFkOyBrdjsgY2FjaGUgPSBjYWNoZS0+bmV4dCkgeworCWZvciAoa3YgPSBjc3ItPnJvb3Rfa3YsIGNhY2hlID0gY3NyLT5jYWNoZV9oZWFkOworCSAgICAga3Y7CisJICAgICBjYWNoZSA9IGNhY2hlLT5uZXh0KSB7CiAJCWlmICghY2FjaGUpIHsKIAkJCS8qIEVzdGltYXRlIGFwcHJveGltYXRlIG51bWJlciBvZiBhZGRpdGlvbmFsIGNhY2hlCiAJCQkgKiByZWdpb25zIG5lZWRlZCAoaXQgYXNzdW1lcyB0aGF0IHRoZSBjYWNoZSBob2xkaW5nCiAJCQkgKiB0aGUgZmlyc3QgMUsgQ29uZmlnIFJPTSBzcGFjZSBhbHdheXMgZXhpc3RzKS4gKi8KIAkJCWludCBlc3RfYyA9IGFnZ19zaXplIC8gKENTUjEyMTJfRVhURU5ERURfUk9NX1NJWkUgLQotCQkJCQkJKDIgKiBzaXplb2YodV9pbnQzMl90KSkpICsgMTsKKwkJCQkJCSgyICogc2l6ZW9mKHUzMikpKSArIDE7CiAKIAkJCS8qIEFkZCBhZGRpdGlvbmFsIGNhY2hlIHJlZ2lvbnMsIGV4dHJhcyB3aWxsIGJlCiAJCQkgKiByZW1vdmVkIGxhdGVyICovCiAJCQlmb3IgKDsgZXN0X2M7IGVzdF9jLS0pIHsKLQkJCQlyZXQgPSBjc3IxMjEyX2FwcGVuZF9uZXdfY2FjaGUoY3NyLCBDU1IxMjEyX0VYVEVOREVEX1JPTV9TSVpFKTsKKwkJCQlyZXQgPSBjc3IxMjEyX2FwcGVuZF9uZXdfY2FjaGUoY3NyLAorCQkJCQkJQ1NSMTIxMl9FWFRFTkRFRF9ST01fU0laRSk7CiAJCQkJaWYgKHJldCAhPSBDU1IxMjEyX1NVQ0NFU1MpCiAJCQkJCXJldHVybiByZXQ7CiAJCQl9CkBAIC0xMTM2LDcgKzk3Nyw3IEBACiAJCX0KIAkJa3YgPSBjc3IxMjEyX2dlbmVyYXRlX3Bvc2l0aW9ucyhjYWNoZSwga3YsIGluaXRfb2Zmc2V0KTsKIAkJYWdnX3NpemUgLT0gY2FjaGUtPmxlbjsKLQkJaW5pdF9vZmZzZXQgPSBzaXplb2YodV9pbnQzMl90KTsKKwkJaW5pdF9vZmZzZXQgPSBzaXplb2YodTMyKTsKIAl9CiAKIAkvKiBSZW1vdmUgdW51c2VkLCBleGNlc3MgY2FjaGUgcmVnaW9ucyAqLwpAQCAtMTE0OSwxNSArOTkwLDE0IEBACiAKIAkvKiBHbyB0aHJvdWdoIHRoZSBsaXN0IGJhY2t3YXJkIHNvIHRoYXQgd2hlbiBkb25lLCB0aGUgY29ycmVjdCBDUkMKIAkgKiB3aWxsIGJlIGNhbGN1bGF0ZWQgZm9yIHRoZSBFeHRlbmRlZCBST00gYXJlYXMuICovCi0JZm9yKGNhY2hlID0gY3NyLT5jYWNoZV90YWlsOyBjYWNoZTsgY2FjaGUgPSBjYWNoZS0+cHJldikgeworCWZvciAoY2FjaGUgPSBjc3ItPmNhY2hlX3RhaWw7IGNhY2hlOyBjYWNoZSA9IGNhY2hlLT5wcmV2KSB7CiAJCS8qIE9ubHkgRXh0ZW5kZWQgUk9NIGNhY2hlcyBzaG91bGQgaGF2ZSB0aGlzIHNldC4gKi8KIAkJaWYgKGNhY2hlLT5leHRfcm9tKSB7CiAJCQlpbnQgbGVhZl9zaXplOwogCiAJCQkvKiBNYWtlIHN1cmUgdGhlIEV4dGVuZGVkIFJPTSBsZWFmIGlzIGEgbXVsdGlwbGUgb2YKIAkJCSAqIG1heF9yb20gaW4gc2l6ZS4gKi8KLQkJCWlmIChjc3ItPm1heF9yb20gPCAxKQotCQkJCXJldHVybiBDU1IxMjEyX0VJTlZBTDsKKwkJCUJVR19PTihjc3ItPm1heF9yb20gPCAxKTsKIAkJCWxlYWZfc2l6ZSA9IChjYWNoZS0+bGVuICsgKGNzci0+bWF4X3JvbSAtIDEpKSAmCiAJCQkJfihjc3ItPm1heF9yb20gLSAxKTsKIApAQCAtMTE2Niw3ICsxMDA2LDcgQEAKIAkJCSAgICAgICBsZWFmX3NpemUgLSBjYWNoZS0+bGVuKTsKIAogCQkJLyogU3VidHJhY3QgbGVhZiBoZWFkZXIgKi8KLQkJCWxlYWZfc2l6ZSAtPSBzaXplb2YodV9pbnQzMl90KTsKKwkJCWxlYWZfc2l6ZSAtPSBzaXplb2YodTMyKTsKIAogCQkJLyogVXBkYXRlIHRoZSBFeHRlbmRlZCBST00gbGVhZiBsZW5ndGggKi8KIAkJCWNhY2hlLT5leHRfcm9tLT52YWx1ZS5sZWFmLmxlbiA9CkBAIC0xMTg0LDMzICsxMDI0LDMxIEBACiAJCQkvKiBTZXQgdGhlIGxlbmd0aCBhbmQgQ1JDIG9mIHRoZSBleHRlbmRlZCBST00uICovCiAJCQlzdHJ1Y3QgY3NyMTIxMl9rZXl2YWxfaW1nICprdmkgPQogCQkJCShzdHJ1Y3QgY3NyMTIxMl9rZXl2YWxfaW1nKiljYWNoZS0+ZGF0YTsKKwkJCXUxNiBsZW4gPSBieXRlc190b19xdWFkcyhjYWNoZS0+bGVuKSAtIDE7CiAKLQkJCWt2aS0+bGVuZ3RoID0gQ1NSMTIxMl9DUFVfVE9fQkUxNihieXRlc190b19xdWFkcyhjYWNoZS0+bGVuKSAtIDEpOwotCQkJa3ZpLT5jcmMgPSBjc3IxMjEyX2NyYzE2KGt2aS0+ZGF0YSwKLQkJCQkJCSBieXRlc190b19xdWFkcyhjYWNoZS0+bGVuKSAtIDEpOwotCisJCQlrdmktPmxlbmd0aCA9IGNwdV90b19iZTE2KGxlbik7CisJCQlrdmktPmNyYyA9IGNzcjEyMTJfY3JjMTYoa3ZpLT5kYXRhLCBsZW4pOwogCQl9CiAJfQogCiAJcmV0dXJuIENTUjEyMTJfU1VDQ0VTUzsKIH0KIAotaW50IGNzcjEyMTJfcmVhZChzdHJ1Y3QgY3NyMTIxMl9jc3IgKmNzciwgdV9pbnQzMl90IG9mZnNldCwgdm9pZCAqYnVmZmVyLCB1X2ludDMyX3QgbGVuKQoraW50IGNzcjEyMTJfcmVhZChzdHJ1Y3QgY3NyMTIxMl9jc3IgKmNzciwgdTMyIG9mZnNldCwgdm9pZCAqYnVmZmVyLCB1MzIgbGVuKQogewogCXN0cnVjdCBjc3IxMjEyX2Nzcl9yb21fY2FjaGUgKmNhY2hlOwogCi0JZm9yIChjYWNoZSA9IGNzci0+Y2FjaGVfaGVhZDsgY2FjaGU7IGNhY2hlID0gY2FjaGUtPm5leHQpIHsKKwlmb3IgKGNhY2hlID0gY3NyLT5jYWNoZV9oZWFkOyBjYWNoZTsgY2FjaGUgPSBjYWNoZS0+bmV4dCkKIAkJaWYgKG9mZnNldCA+PSBjYWNoZS0+b2Zmc2V0ICYmCiAJCSAgICAob2Zmc2V0ICsgbGVuKSA8PSAoY2FjaGUtPm9mZnNldCArIGNhY2hlLT5zaXplKSkgewotCQkJbWVtY3B5KGJ1ZmZlciwKLQkJCSAgICAgICAmY2FjaGUtPmRhdGFbYnl0ZXNfdG9fcXVhZHMob2Zmc2V0IC0gY2FjaGUtPm9mZnNldCldLAorCQkJbWVtY3B5KGJ1ZmZlciwgJmNhY2hlLT5kYXRhWworCQkJCQlieXRlc190b19xdWFkcyhvZmZzZXQgLSBjYWNoZS0+b2Zmc2V0KV0sCiAJCQkgICAgICAgbGVuKTsKIAkJCXJldHVybiBDU1IxMjEyX1NVQ0NFU1M7CiAJCX0KLQl9Ci0JcmV0dXJuIENTUjEyMTJfRU5PRU5UOwotfQogCisJcmV0dXJuIC1FTk9FTlQ7Cit9CiAKIAogLyogUGFyc2UgYSBjaHVuayBvZiBkYXRhIGFzIGEgQ29uZmlnIFJPTSAqLwpAQCAtMTIyNyw0NiArMTA2NSw0MyBAQAogCSAqIFVuZm9ydHVuYXRlbHksIG1hbnkgSUVFRSAxMzk0IGRldmljZXMgZG8gbm90IGFiaWRlIGJ5IHRoYXQsIHNvIHRoZQogCSAqIGJ1cyBpbmZvIGJsb2NrIHdpbGwgYmUgcmVhZCAxIHF1YWRsZXQgYXQgYSB0aW1lLiAgVGhlIHJlc3Qgb2YgdGhlCiAJICogQ29uZmlnUk9NIHdpbGwgYmUgcmVhZCBhY2NvcmRpbmcgdG8gdGhlIG1heF9yb20gZmllbGQuICovCi0JZm9yIChpID0gMDsgaSA8IGNzci0+YnVzX2luZm9fbGVuOyBpICs9IHNpemVvZihjc3IxMjEyX3F1YWRfdCkpIHsKKwlmb3IgKGkgPSAwOyBpIDwgY3NyLT5idXNfaW5mb19sZW47IGkgKz0gc2l6ZW9mKHUzMikpIHsKIAkJcmV0ID0gY3NyLT5vcHMtPmJ1c19yZWFkKGNzciwgQ1NSMTIxMl9DT05GSUdfUk9NX1NQQUNFX0JBU0UgKyBpLAotCQkJCQkgc2l6ZW9mKGNzcjEyMTJfcXVhZF90KSwKLQkJCQkJICZjc3ItPmNhY2hlX2hlYWQtPmRhdGFbYnl0ZXNfdG9fcXVhZHMoaSldLAotCQkJCQkgY3NyLT5wcml2YXRlKTsKKwkJCXNpemVvZih1MzIpLCAmY3NyLT5jYWNoZV9oZWFkLT5kYXRhW2J5dGVzX3RvX3F1YWRzKGkpXSwKKwkJCWNzci0+cHJpdmF0ZSk7CiAJCWlmIChyZXQgIT0gQ1NSMTIxMl9TVUNDRVNTKQogCQkJcmV0dXJuIHJldDsKIAogCQkvKiBjaGVjayBST00gaGVhZGVyJ3MgaW5mb19sZW5ndGggKi8KIAkJaWYgKGkgPT0gMCAmJgotCQkgICAgQ1NSMTIxMl9CRTMyX1RPX0NQVShjc3ItPmNhY2hlX2hlYWQtPmRhdGFbMF0pID4+IDI0ICE9CisJCSAgICBiZTMyX3RvX2NwdShjc3ItPmNhY2hlX2hlYWQtPmRhdGFbMF0pID4+IDI0ICE9CiAJCSAgICBieXRlc190b19xdWFkcyhjc3ItPmJ1c19pbmZvX2xlbikgLSAxKQotCQkJcmV0dXJuIENTUjEyMTJfRUlOVkFMOworCQkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJYmkgPSAoc3RydWN0IGNzcjEyMTJfYnVzX2luZm9fYmxvY2tfaW1nKiljc3ItPmNhY2hlX2hlYWQtPmRhdGE7CiAJY3NyLT5jcmNfbGVuID0gcXVhZHNfdG9fYnl0ZXMoYmktPmNyY19sZW5ndGgpOwogCi0JLyogSUVFRSAxMjEyIHJlY29tbWVuZHMgdGhhdCBjcmNfbGVuIGJlIGVxdWFsIHRvIGJ1c19pbmZvX2xlbiwgYnV0IHRoYXQgaXMgbm90Ci0JICogYWx3YXlzIHRoZSBjYXNlLCBzbyByZWFkIHRoZSByZXN0IG9mIHRoZSBjcmMgYXJlYSAxIHF1YWRsZXQgYXQgYSB0aW1lLiAqLwotCWZvciAoaSA9IGNzci0+YnVzX2luZm9fbGVuOyBpIDw9IGNzci0+Y3JjX2xlbjsgaSArPSBzaXplb2YoY3NyMTIxMl9xdWFkX3QpKSB7CisJLyogSUVFRSAxMjEyIHJlY29tbWVuZHMgdGhhdCBjcmNfbGVuIGJlIGVxdWFsIHRvIGJ1c19pbmZvX2xlbiwgYnV0IHRoYXQKKwkgKiBpcyBub3QgYWx3YXlzIHRoZSBjYXNlLCBzbyByZWFkIHRoZSByZXN0IG9mIHRoZSBjcmMgYXJlYSAxIHF1YWRsZXQgYXQKKwkgKiBhIHRpbWUuICovCisJZm9yIChpID0gY3NyLT5idXNfaW5mb19sZW47IGkgPD0gY3NyLT5jcmNfbGVuOyBpICs9IHNpemVvZih1MzIpKSB7CiAJCXJldCA9IGNzci0+b3BzLT5idXNfcmVhZChjc3IsIENTUjEyMTJfQ09ORklHX1JPTV9TUEFDRV9CQVNFICsgaSwKLQkJCQkJIHNpemVvZihjc3IxMjEyX3F1YWRfdCksCi0JCQkJCSAmY3NyLT5jYWNoZV9oZWFkLT5kYXRhW2J5dGVzX3RvX3F1YWRzKGkpXSwKLQkJCQkJIGNzci0+cHJpdmF0ZSk7CisJCQlzaXplb2YodTMyKSwgJmNzci0+Y2FjaGVfaGVhZC0+ZGF0YVtieXRlc190b19xdWFkcyhpKV0sCisJCQljc3ItPnByaXZhdGUpOwogCQlpZiAocmV0ICE9IENTUjEyMTJfU1VDQ0VTUykKIAkJCXJldHVybiByZXQ7CiAJfQogCi0jaWYgMAotCS8qIEFwcGFyZW50bHkgdGhlcmUgYXJlIHRvbyBtYW55IGRpZmZlcm50IHdyb25nIGltcGxlbWVudGF0aW9ucyBvZiB0aGUKLQkgKiBDUkMgYWxnb3JpdGhtIHRoYXQgdmVyaWZ5aW5nIHRoZW0gaXMgbW9vdC4gKi8KKwkvKiBBcHBhcmVudGx5IHRoZXJlIGFyZSBtYW55IGRpZmZlcmVudCB3cm9uZyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIENSQworCSAqIGFsZ29yaXRobS4gIFdlIGRvbid0IGZhaWwsIHdlIGp1c3Qgd2Fybi4gKi8KIAlpZiAoKGNzcjEyMTJfY3JjMTYoYmktPmRhdGEsIGJpLT5jcmNfbGVuZ3RoKSAhPSBiaS0+Y3JjKSAmJgogCSAgICAoY3NyMTIxMl9tc2Z0X2NyYzE2KGJpLT5kYXRhLCBiaS0+Y3JjX2xlbmd0aCkgIT0gYmktPmNyYykpCi0JCXJldHVybiBDU1IxMjEyX0VJTlZBTDsKLSNlbmRpZgorCQlwcmludGsoS0VSTl9ERUJVRyAiSUVFRSAxMzk0IGRldmljZSBoYXMgUk9NIENSQyBlcnJvclxuIik7CiAKIAljciA9IENTUjEyMTJfTUFMTE9DKHNpemVvZigqY3IpKTsKIAlpZiAoIWNyKQotCQlyZXR1cm4gQ1NSMTIxMl9FTk9NRU07CisJCXJldHVybiAtRU5PTUVNOwogCiAJY3ItPm5leHQgPSBOVUxMOwogCWNyLT5wcmV2ID0gTlVMTDsKQEAgLTEyNzksMjEgKzExMTQsMjYgQEAKIAlyZXR1cm4gQ1NSMTIxMl9TVUNDRVNTOwogfQogCi1zdGF0aWMgaW50IGNzcjEyMTJfcGFyc2VfZGlyX2VudHJ5KHN0cnVjdCBjc3IxMjEyX2tleXZhbCAqZGlyLAotCQkJCSAgIGNzcjEyMTJfcXVhZF90IGtpLAotCQkJCSAgIHVfaW50MzJfdCBrdl9wb3MpCisjZGVmaW5lIENTUjEyMTJfS1ZfS0VZKHEpCShiZTMyX3RvX2NwdShxKSA+PiBDU1IxMjEyX0tWX0tFWV9TSElGVCkKKyNkZWZpbmUgQ1NSMTIxMl9LVl9LRVlfVFlQRShxKQkoQ1NSMTIxMl9LVl9LRVkocSkgPj4gQ1NSMTIxMl9LVl9LRVlfVFlQRV9TSElGVCkKKyNkZWZpbmUgQ1NSMTIxMl9LVl9LRVlfSUQocSkJKENTUjEyMTJfS1ZfS0VZKHEpICYgQ1NSMTIxMl9LVl9LRVlfSURfTUFTSykKKyNkZWZpbmUgQ1NSMTIxMl9LVl9WQUxfTUFTSwkweGZmZmZmZgorI2RlZmluZSBDU1IxMjEyX0tWX1ZBTChxKQkoYmUzMl90b19jcHUocSkgJiBDU1IxMjEyX0tWX1ZBTF9NQVNLKQorCitzdGF0aWMgaW50Citjc3IxMjEyX3BhcnNlX2Rpcl9lbnRyeShzdHJ1Y3QgY3NyMTIxMl9rZXl2YWwgKmRpciwgdTMyIGtpLCB1MzIga3ZfcG9zKQogewogCWludCByZXQgPSBDU1IxMjEyX1NVQ0NFU1M7CiAJc3RydWN0IGNzcjEyMTJfa2V5dmFsICprID0gTlVMTDsKLQl1X2ludDMyX3Qgb2Zmc2V0OworCXUzMiBvZmZzZXQ7CiAKLQlzd2l0Y2goQ1NSMTIxMl9LVl9LRVlfVFlQRShraSkpIHsKKwlzd2l0Y2ggKENTUjEyMTJfS1ZfS0VZX1RZUEUoa2kpKSB7CiAJY2FzZSBDU1IxMjEyX0tWX1RZUEVfSU1NRURJQVRFOgogCQlrID0gY3NyMTIxMl9uZXdfaW1tZWRpYXRlKENTUjEyMTJfS1ZfS0VZX0lEKGtpKSwKIAkJCQkJICBDU1IxMjEyX0tWX1ZBTChraSkpOwogCQlpZiAoIWspIHsKLQkJCXJldCA9IENTUjEyMTJfRU5PTUVNOwotCQkJZ290byBmYWlsOworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0OwogCQl9CiAKIAkJay0+cmVmY250ID0gMDsJLyogRG9uJ3Qga2VlcCBsb2NhbCByZWZlcmVuY2Ugd2hlbiBwYXJzaW5nLiAqLwpAQCAtMTMwMyw4ICsxMTQzLDggQEAKIAkJayA9IGNzcjEyMTJfbmV3X2Nzcl9vZmZzZXQoQ1NSMTIxMl9LVl9LRVlfSUQoa2kpLAogCQkJCQkgICBDU1IxMjEyX0tWX1ZBTChraSkpOwogCQlpZiAoIWspIHsKLQkJCXJldCA9IENTUjEyMTJfRU5PTUVNOwotCQkJZ290byBmYWlsOworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0OwogCQl9CiAJCWstPnJlZmNudCA9IDA7CS8qIERvbid0IGtlZXAgbG9jYWwgcmVmZXJlbmNlIHdoZW4gcGFyc2luZy4gKi8KIAkJYnJlYWs7CkBAIC0xMzE2LDggKzExNTYsOCBAQAogCQkJLyogVWgtb2guICBDYW4ndCBoYXZlIGEgcmVsYXRpdmUgb2Zmc2V0IG9mIDAgZm9yIExlYXZlcwogCQkJICogb3IgRGlyZWN0b3JpZXMuICBUaGUgQ29uZmlnIFJPTSBpbWFnZSBpcyBtb3N0IGxpa2VseQogCQkJICogbWVzc2VkIHVwLCBzbyB3ZSdsbCBqdXN0IGFib3J0IGhlcmUuICovCi0JCQlyZXQgPSBDU1IxMjEyX0VJTzsKLQkJCWdvdG8gZmFpbDsKKwkJCXJldCA9IC1FSU87CisJCQlnb3RvIG91dDsKIAkJfQogCiAJCWsgPSBjc3IxMjEyX2ZpbmRfa2V5dmFsX29mZnNldChkaXIsIG9mZnNldCk7CkBAIC0xMzI1LDE0ICsxMTY1LDE0IEBACiAJCWlmIChrKQogCQkJYnJlYWs7CQkvKiBGb3VuZCBpdC4gKi8KIAotCQlpZiAoQ1NSMTIxMl9LVl9LRVlfVFlQRShraSkgPT0gQ1NSMTIxMl9LVl9UWVBFX0RJUkVDVE9SWSkgeworCQlpZiAoQ1NSMTIxMl9LVl9LRVlfVFlQRShraSkgPT0gQ1NSMTIxMl9LVl9UWVBFX0RJUkVDVE9SWSkKIAkJCWsgPSBjc3IxMjEyX25ld19kaXJlY3RvcnkoQ1NSMTIxMl9LVl9LRVlfSUQoa2kpKTsKLQkJfSBlbHNlIHsKKwkJZWxzZQogCQkJayA9IGNzcjEyMTJfbmV3X2xlYWYoQ1NSMTIxMl9LVl9LRVlfSUQoa2kpLCBOVUxMLCAwKTsKLQkJfQorCiAJCWlmICghaykgewotCQkJcmV0ID0gQ1NSMTIxMl9FTk9NRU07Ci0JCQlnb3RvIGZhaWw7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJZ290byBvdXQ7CiAJCX0KIAkJay0+cmVmY250ID0gMDsJLyogRG9uJ3Qga2VlcCBsb2NhbCByZWZlcmVuY2Ugd2hlbiBwYXJzaW5nLiAqLwogCQlrLT52YWxpZCA9IDA7CS8qIENvbnRlbnRzIG5vdCByZWFkIHlldCBzbyBpdCdzIG5vdCB2YWxpZC4gKi8KQEAgLTEzNDQsMTYgKzExODQsMTIgQEAKIAkJZGlyLT5uZXh0ID0gazsKIAl9CiAJcmV0ID0gY3NyMTIxMl9hdHRhY2hfa2V5dmFsX3RvX2RpcmVjdG9yeShkaXIsIGspOwotCi1mYWlsOgotCWlmIChyZXQgIT0gQ1NSMTIxMl9TVUNDRVNTKSB7Ci0JCWlmIChrKQotCQkJZnJlZV9rZXl2YWwoayk7Ci0JfQorb3V0OgorCWlmIChyZXQgIT0gQ1NSMTIxMl9TVUNDRVNTICYmIGsgIT0gTlVMTCkKKwkJZnJlZV9rZXl2YWwoayk7CiAJcmV0dXJuIHJldDsKIH0KIAotCiBpbnQgY3NyMTIxMl9wYXJzZV9rZXl2YWwoc3RydWN0IGNzcjEyMTJfa2V5dmFsICprdiwKIAkJCSBzdHJ1Y3QgY3NyMTIxMl9jc3Jfcm9tX2NhY2hlICpjYWNoZSkKIHsKQEAgLTEzNjIsMjQgKzExOTgsMjAgQEAKIAlpbnQgcmV0ID0gQ1NSMTIxMl9TVUNDRVNTOwogCWludCBrdmlfbGVuOwogCi0Ja3ZpID0gKHN0cnVjdCBjc3IxMjEyX2tleXZhbF9pbWcqKSZjYWNoZS0+ZGF0YVtieXRlc190b19xdWFkcyhrdi0+b2Zmc2V0IC0KLQkJCQkJCQkJICAgICAgY2FjaGUtPm9mZnNldCldOwotCWt2aV9sZW4gPSBDU1IxMjEyX0JFMTZfVE9fQ1BVKGt2aS0+bGVuZ3RoKTsKKwlrdmkgPSAoc3RydWN0IGNzcjEyMTJfa2V5dmFsX2ltZyopCisJCSZjYWNoZS0+ZGF0YVtieXRlc190b19xdWFkcyhrdi0+b2Zmc2V0IC0gY2FjaGUtPm9mZnNldCldOworCWt2aV9sZW4gPSBiZTE2X3RvX2NwdShrdmktPmxlbmd0aCk7CiAKLSNpZiAwCi0JLyogQXBwYXJlbnRseSB0aGVyZSBhcmUgdG9vIG1hbnkgZGlmZmVybnQgd3JvbmcgaW1wbGVtZW50YXRpb25zIG9mIHRoZQotCSAqIENSQyBhbGdvcml0aG0gdGhhdCB2ZXJpZnlpbmcgdGhlbSBpcyBtb290LiAqLworCS8qIEFwcGFyZW50bHkgdGhlcmUgYXJlIG1hbnkgZGlmZmVyZW50IHdyb25nIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgQ1JDCisJICogYWxnb3JpdGhtLiAgV2UgZG9uJ3QgZmFpbCwgd2UganVzdCB3YXJuLiAqLwogCWlmICgoY3NyMTIxMl9jcmMxNihrdmktPmRhdGEsIGt2aV9sZW4pICE9IGt2aS0+Y3JjKSAmJgotCSAgICAoY3NyMTIxMl9tc2Z0X2NyYzE2KGt2aS0+ZGF0YSwga3ZpX2xlbikgIT0ga3ZpLT5jcmMpKSB7Ci0JCXJldCA9IENTUjEyMTJfRUlOVkFMOwotCQlnb3RvIGZhaWw7Ci0JfQotI2VuZGlmCisJICAgIChjc3IxMjEyX21zZnRfY3JjMTYoa3ZpLT5kYXRhLCBrdmlfbGVuKSAhPSBrdmktPmNyYykpCisJCXByaW50ayhLRVJOX0RFQlVHICJJRUVFIDEzOTQgZGV2aWNlIGhhcyBST00gQ1JDIGVycm9yXG4iKTsKIAotCXN3aXRjaChrdi0+a2V5LnR5cGUpIHsKKwlzd2l0Y2ggKGt2LT5rZXkudHlwZSkgewogCWNhc2UgQ1NSMTIxMl9LVl9UWVBFX0RJUkVDVE9SWToKIAkJZm9yIChpID0gMDsgaSA8IGt2aV9sZW47IGkrKykgewotCQkJY3NyMTIxMl9xdWFkX3Qga2kgPSBrdmktPmRhdGFbaV07CisJCQl1MzIga2kgPSBrdmktPmRhdGFbaV07CiAKIAkJCS8qIFNvbWUgZGV2aWNlcyBwdXQgbnVsbCBlbnRyaWVzIGluIHRoZWlyIHVuaXQKIAkJCSAqIGRpcmVjdG9yaWVzLiAgSWYgd2UgY29tZSBhY3Jvc3Mgc3VjaCBhbiBlbnRyeSwKQEAgLTEzODcsNzYgKzEyMTksNzIgQEAKIAkJCWlmIChraSA9PSAweDApCiAJCQkJY29udGludWU7CiAJCQlyZXQgPSBjc3IxMjEyX3BhcnNlX2Rpcl9lbnRyeShrdiwga2ksCi0JCQkJCQkgICAgICAoa3YtPm9mZnNldCArCi0JCQkJCQkgICAgICAgcXVhZHNfdG9fYnl0ZXMoaSArIDEpKSk7CisJCQkJCWt2LT5vZmZzZXQgKyBxdWFkc190b19ieXRlcyhpICsgMSkpOwogCQl9CiAJCWt2LT52YWx1ZS5kaXJlY3RvcnkubGVuID0ga3ZpX2xlbjsKIAkJYnJlYWs7CiAKIAljYXNlIENTUjEyMTJfS1ZfVFlQRV9MRUFGOgogCQlpZiAoa3YtPmtleS5pZCAhPSBDU1IxMjEyX0tWX0lEX0VYVEVOREVEX1JPTSkgewotCQkJa3YtPnZhbHVlLmxlYWYuZGF0YSA9IENTUjEyMTJfTUFMTE9DKHF1YWRzX3RvX2J5dGVzKGt2aV9sZW4pKTsKKwkJCXNpemVfdCBzaXplID0gcXVhZHNfdG9fYnl0ZXMoa3ZpX2xlbik7CisKKwkJCWt2LT52YWx1ZS5sZWFmLmRhdGEgPSBDU1IxMjEyX01BTExPQyhzaXplKTsKIAkJCWlmICgha3YtPnZhbHVlLmxlYWYuZGF0YSkgewotCQkJCXJldCA9IENTUjEyMTJfRU5PTUVNOwotCQkJCWdvdG8gZmFpbDsKKwkJCQlyZXQgPSAtRU5PTUVNOworCQkJCWdvdG8gb3V0OwogCQkJfQogCiAJCQlrdi0+dmFsdWUubGVhZi5sZW4gPSBrdmlfbGVuOwotCQkJbWVtY3B5KGt2LT52YWx1ZS5sZWFmLmRhdGEsIGt2aS0+ZGF0YSwgcXVhZHNfdG9fYnl0ZXMoa3ZpX2xlbikpOworCQkJbWVtY3B5KGt2LT52YWx1ZS5sZWFmLmRhdGEsIGt2aS0+ZGF0YSwgc2l6ZSk7CiAJCX0KIAkJYnJlYWs7CiAJfQogCiAJa3YtPnZhbGlkID0gMTsKLQotZmFpbDoKK291dDoKIAlyZXR1cm4gcmV0OwogfQogCi0KLWludCBfY3NyMTIxMl9yZWFkX2tleXZhbChzdHJ1Y3QgY3NyMTIxMl9jc3IgKmNzciwgc3RydWN0IGNzcjEyMTJfa2V5dmFsICprdikKK3N0YXRpYyBpbnQKK2NzcjEyMTJfcmVhZF9rZXl2YWwoc3RydWN0IGNzcjEyMTJfY3NyICpjc3IsIHN0cnVjdCBjc3IxMjEyX2tleXZhbCAqa3YpCiB7CiAJc3RydWN0IGNzcjEyMTJfY2FjaGVfcmVnaW9uICpjciwgKm5jciwgKm5ld2NyID0gTlVMTDsKIAlzdHJ1Y3QgY3NyMTIxMl9rZXl2YWxfaW1nICprdmkgPSBOVUxMOwogCXN0cnVjdCBjc3IxMjEyX2Nzcl9yb21fY2FjaGUgKmNhY2hlOwogCWludCBjYWNoZV9pbmRleDsKLQl1X2ludDY0X3QgYWRkcjsKLQl1X2ludDMyX3QgKmNhY2hlX3B0cjsKLQl1X2ludDE2X3Qga3ZfbGVuID0gMDsKKwl1NjQgYWRkcjsKKwl1MzIgKmNhY2hlX3B0cjsKKwl1MTYga3ZfbGVuID0gMDsKIAotCWlmICghY3NyIHx8ICFrdiB8fCBjc3ItPm1heF9yb20gPCAxKQotCQlyZXR1cm4gQ1NSMTIxMl9FSU5WQUw7CisJQlVHX09OKCFjc3IgfHwgIWt2IHx8IGNzci0+bWF4X3JvbSA8IDEpOwogCiAJLyogRmlyc3QgZmluZCB3aGljaCBjYWNoZSB0aGUgZGF0YSBzaG91bGQgYmUgaW4gKG9yIGdvIGluIGlmIG5vdCByZWFkCiAJICogeWV0KS4gKi8KLQlmb3IgKGNhY2hlID0gY3NyLT5jYWNoZV9oZWFkOyBjYWNoZTsgY2FjaGUgPSBjYWNoZS0+bmV4dCkgeworCWZvciAoY2FjaGUgPSBjc3ItPmNhY2hlX2hlYWQ7IGNhY2hlOyBjYWNoZSA9IGNhY2hlLT5uZXh0KQogCQlpZiAoa3YtPm9mZnNldCA+PSBjYWNoZS0+b2Zmc2V0ICYmCiAJCSAgICBrdi0+b2Zmc2V0IDwgKGNhY2hlLT5vZmZzZXQgKyBjYWNoZS0+c2l6ZSkpCiAJCQlicmVhazsKLQl9CiAKIAlpZiAoIWNhY2hlKSB7Ci0JCWNzcjEyMTJfcXVhZF90IHE7Ci0JCXVfaW50MzJfdCBjYWNoZV9zaXplOworCQl1MzIgcSwgY2FjaGVfc2l6ZTsKIAogCQkvKiBPbmx5IGNyZWF0ZSBhIG5ldyBjYWNoZSBmb3IgRXh0ZW5kZWQgUk9NIGxlYXZlcy4gKi8KIAkJaWYgKGt2LT5rZXkuaWQgIT0gQ1NSMTIxMl9LVl9JRF9FWFRFTkRFRF9ST00pCi0JCQlyZXR1cm4gQ1NSMTIxMl9FSU5WQUw7CisJCQlyZXR1cm4gLUVJTlZBTDsKIAogCQlpZiAoY3NyLT5vcHMtPmJ1c19yZWFkKGNzciwKIAkJCQkgICAgICAgQ1NSMTIxMl9SRUdJU1RFUl9TUEFDRV9CQVNFICsga3YtPm9mZnNldCwKLQkJCQkgICAgICAgc2l6ZW9mKGNzcjEyMTJfcXVhZF90KSwgJnEsIGNzci0+cHJpdmF0ZSkpIHsKLQkJCXJldHVybiBDU1IxMjEyX0VJTzsKLQkJfQorCQkJCSAgICAgICBzaXplb2YodTMyKSwgJnEsIGNzci0+cHJpdmF0ZSkpCisJCQlyZXR1cm4gLUVJTzsKIAotCQlrdi0+dmFsdWUubGVhZi5sZW4gPSBDU1IxMjEyX0JFMzJfVE9fQ1BVKHEpID4+IDE2OworCQlrdi0+dmFsdWUubGVhZi5sZW4gPSBiZTMyX3RvX2NwdShxKSA+PiAxNjsKIAogCQljYWNoZV9zaXplID0gKHF1YWRzX3RvX2J5dGVzKGt2LT52YWx1ZS5sZWFmLmxlbiArIDEpICsKIAkJCSAgICAgIChjc3ItPm1heF9yb20gLSAxKSkgJiB+KGNzci0+bWF4X3JvbSAtIDEpOwogCiAJCWNhY2hlID0gY3NyMTIxMl9yb21fY2FjaGVfbWFsbG9jKGt2LT5vZmZzZXQsIGNhY2hlX3NpemUpOwogCQlpZiAoIWNhY2hlKQotCQkJcmV0dXJuIENTUjEyMTJfRU5PTUVNOworCQkJcmV0dXJuIC1FTk9NRU07CiAKIAkJa3YtPnZhbHVlLmxlYWYuZGF0YSA9ICZjYWNoZS0+ZGF0YVsxXTsKIAkJY3NyLT5jYWNoZV90YWlsLT5uZXh0ID0gY2FjaGU7CkBAIC0xNDY1LDEyICsxMjkzLDExIEBACiAJCWNzci0+Y2FjaGVfdGFpbCA9IGNhY2hlOwogCQljYWNoZS0+ZmlsbGVkX2hlYWQgPQogCQkJQ1NSMTIxMl9NQUxMT0Moc2l6ZW9mKCpjYWNoZS0+ZmlsbGVkX2hlYWQpKTsKLQkJaWYgKCFjYWNoZS0+ZmlsbGVkX2hlYWQpIHsKLQkJCXJldHVybiBDU1IxMjEyX0VOT01FTTsKLQkJfQorCQlpZiAoIWNhY2hlLT5maWxsZWRfaGVhZCkKKwkJCXJldHVybiAtRU5PTUVNOwogCiAJCWNhY2hlLT5maWxsZWRfaGVhZC0+b2Zmc2V0X3N0YXJ0ID0gMDsKLQkJY2FjaGUtPmZpbGxlZF9oZWFkLT5vZmZzZXRfZW5kID0gc2l6ZW9mKGNzcjEyMTJfcXVhZF90KTsKKwkJY2FjaGUtPmZpbGxlZF9oZWFkLT5vZmZzZXRfZW5kID0gc2l6ZW9mKHUzMik7CiAJCWNhY2hlLT5maWxsZWRfdGFpbCA9IGNhY2hlLT5maWxsZWRfaGVhZDsKIAkJY2FjaGUtPmZpbGxlZF9oZWFkLT5uZXh0ID0gTlVMTDsKIAkJY2FjaGUtPmZpbGxlZF9oZWFkLT5wcmV2ID0gTlVMTDsKQEAgLTE0ODgsNyArMTMxNSw3IEBACiAJCWlmIChjYWNoZV9pbmRleCA8IGNyLT5vZmZzZXRfc3RhcnQpIHsKIAkJCW5ld2NyID0gQ1NSMTIxMl9NQUxMT0Moc2l6ZW9mKCpuZXdjcikpOwogCQkJaWYgKCFuZXdjcikKLQkJCQlyZXR1cm4gQ1NSMTIxMl9FTk9NRU07CisJCQkJcmV0dXJuIC1FTk9NRU07CiAKIAkJCW5ld2NyLT5vZmZzZXRfc3RhcnQgPSBjYWNoZV9pbmRleCAmIH4oY3NyLT5tYXhfcm9tIC0gMSk7CiAJCQluZXdjci0+b2Zmc2V0X2VuZCA9IG5ld2NyLT5vZmZzZXRfc3RhcnQ7CkBAIC0xNTAxLDE4ICsxMzI4LDE4IEBACiAJCQkgICAoY2FjaGVfaW5kZXggPCBjci0+b2Zmc2V0X2VuZCkpIHsKIAkJCWt2aSA9IChzdHJ1Y3QgY3NyMTIxMl9rZXl2YWxfaW1nKikKIAkJCQkoJmNhY2hlLT5kYXRhW2J5dGVzX3RvX3F1YWRzKGNhY2hlX2luZGV4KV0pOwotCQkJa3ZfbGVuID0gcXVhZHNfdG9fYnl0ZXMoQ1NSMTIxMl9CRTE2X1RPX0NQVShrdmktPmxlbmd0aCkgKwotCQkJCQkJMSk7CisJCQlrdl9sZW4gPSBxdWFkc190b19ieXRlcyhiZTE2X3RvX2NwdShrdmktPmxlbmd0aCkgKyAxKTsKIAkJCWJyZWFrOwotCQl9IGVsc2UgaWYgKGNhY2hlX2luZGV4ID09IGNyLT5vZmZzZXRfZW5kKQorCQl9IGVsc2UgaWYgKGNhY2hlX2luZGV4ID09IGNyLT5vZmZzZXRfZW5kKSB7CiAJCQlicmVhazsKKwkJfQogCX0KIAogCWlmICghY3IpIHsKIAkJY3IgPSBjYWNoZS0+ZmlsbGVkX3RhaWw7CiAJCW5ld2NyID0gQ1NSMTIxMl9NQUxMT0Moc2l6ZW9mKCpuZXdjcikpOwogCQlpZiAoIW5ld2NyKQotCQkJcmV0dXJuIENTUjEyMTJfRU5PTUVNOworCQkJcmV0dXJuIC1FTk9NRU07CiAKIAkJbmV3Y3ItPm9mZnNldF9zdGFydCA9IGNhY2hlX2luZGV4ICYgfihjc3ItPm1heF9yb20gLSAxKTsKIAkJbmV3Y3ItPm9mZnNldF9lbmQgPSBuZXdjci0+b2Zmc2V0X3N0YXJ0OwpAQCAtMTUzNCw3ICsxMzYxLDcgQEAKIAkJCQkgICAgICAgY3NyLT5wcml2YXRlKSkgewogCQkJaWYgKGNzci0+bWF4X3JvbSA9PSA0KQogCQkJCS8qIFdlJ3ZlIGdvdCBwcm9ibGVtcyEgKi8KLQkJCQlyZXR1cm4gQ1NSMTIxMl9FSU87CisJCQkJcmV0dXJuIC1FSU87CiAKIAkJCS8qIEFwcGVyZW50bHkgdGhlIG1heF9yb20gdmFsdWUgd2FzIGEgbGllLCBzZXQgaXQgdG8KIAkJCSAqIGRvIHF1YWRsZXQgcmVhZHMgYW5kIHRyeSBhZ2Fpbi4gKi8KQEAgLTE1NDgsOCArMTM3NSw3IEBACiAJCWlmICgha3ZpICYmIChjci0+b2Zmc2V0X2VuZCA+IGNhY2hlX2luZGV4KSkgewogCQkJa3ZpID0gKHN0cnVjdCBjc3IxMjEyX2tleXZhbF9pbWcqKQogCQkJCSgmY2FjaGUtPmRhdGFbYnl0ZXNfdG9fcXVhZHMoY2FjaGVfaW5kZXgpXSk7Ci0JCQlrdl9sZW4gPSBxdWFkc190b19ieXRlcyhDU1IxMjEyX0JFMTZfVE9fQ1BVKGt2aS0+bGVuZ3RoKSArCi0JCQkJCQkxKTsKKwkJCWt2X2xlbiA9IHF1YWRzX3RvX2J5dGVzKGJlMTZfdG9fY3B1KGt2aS0+bGVuZ3RoKSArIDEpOwogCQl9CiAKIAkJaWYgKChrdl9sZW4gKyAoa3YtPm9mZnNldCAtIGNhY2hlLT5vZmZzZXQpKSA+IGNhY2hlLT5zaXplKSB7CkBAIC0xNTU3LDcgKzEzODMsNyBAQAogCQkJICogYmV5b25kIHRoZSBDb25maWdST00gaW1hZ2UgcmVnaW9uIGFuZCB0aHVzIGJleW9uZCB0aGUKIAkJCSAqIGVuZCBvZiBvdXIgY2FjaGUgcmVnaW9uLiAgVGhlcmVmb3JlLCB3ZSBhYm9ydCBub3cKIAkJCSAqIHJhdGhlciB0aGFuIHNlZyBmYXVsdGluZyBsYXRlci4gKi8KLQkJCXJldHVybiBDU1IxMjEyX0VJTzsKKwkJCXJldHVybiAtRUlPOwogCQl9CiAKIAkJbmNyID0gY3ItPm5leHQ7CkBAIC0xNTc5LDcgKzE0MDUsMTYgQEAKIAlyZXR1cm4gY3NyMTIxMl9wYXJzZV9rZXl2YWwoa3YsIGNhY2hlKTsKIH0KIAotCitzdHJ1Y3QgY3NyMTIxMl9rZXl2YWwgKgorY3NyMTIxMl9nZXRfa2V5dmFsKHN0cnVjdCBjc3IxMjEyX2NzciAqY3NyLCBzdHJ1Y3QgY3NyMTIxMl9rZXl2YWwgKmt2KQoreworCWlmICgha3YpCisJCXJldHVybiBOVUxMOworCWlmICgha3YtPnZhbGlkKQorCQlpZiAoY3NyMTIxMl9yZWFkX2tleXZhbChjc3IsIGt2KSAhPSBDU1IxMjEyX1NVQ0NFU1MpCisJCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4ga3Y7Cit9CiAKIGludCBjc3IxMjEyX3BhcnNlX2NzcihzdHJ1Y3QgY3NyMTIxMl9jc3IgKmNzcikKIHsKQEAgLTE1ODcsMjAgKzE0MjIsMTkgQEAKIAlzdHJ1Y3QgY3NyMTIxMl9kZW50cnkgKmRlbnRyeTsKIAlpbnQgcmV0OwogCi0JaWYgKCFjc3IgfHwgIWNzci0+b3BzIHx8ICFjc3ItPm9wcy0+YnVzX3JlYWQpCi0JCXJldHVybiBDU1IxMjEyX0VJTlZBTDsKKwlCVUdfT04oIWNzciB8fCAhY3NyLT5vcHMgfHwgIWNzci0+b3BzLT5idXNfcmVhZCk7CiAKIAlyZXQgPSBjc3IxMjEyX3BhcnNlX2J1c19pbmZvX2Jsb2NrKGNzcik7CiAJaWYgKHJldCAhPSBDU1IxMjEyX1NVQ0NFU1MpCiAJCXJldHVybiByZXQ7CiAKLQlpZiAoIWNzci0+b3BzLT5nZXRfbWF4X3JvbSkKKwlpZiAoIWNzci0+b3BzLT5nZXRfbWF4X3JvbSkgewogCQljc3ItPm1heF9yb20gPSBtcl9tYXBbMF07CS8qIGRlZmF1bHQgdmFsdWUgKi8KLQllbHNlIHsKKwl9IGVsc2UgewogCQlpbnQgaSA9IGNzci0+b3BzLT5nZXRfbWF4X3JvbShjc3ItPmJ1c19pbmZvX2RhdGEsCiAJCQkJCSAgICAgIGNzci0+cHJpdmF0ZSk7CiAJCWlmIChpICYgfjB4MykKLQkJCXJldHVybiBDU1IxMjEyX0VJTlZBTDsKKwkJCXJldHVybiAtRUlOVkFMOwogCQljc3ItPm1heF9yb20gPSBtcl9tYXBbaV07CiAJfQogCkBAIC0xNjEzLDcgKzE0NDcsNyBAQAogCWNzci0+cm9vdF9rdi0+dmFsaWQgPSAwOwogCWNzci0+cm9vdF9rdi0+bmV4dCA9IGNzci0+cm9vdF9rdjsKIAljc3ItPnJvb3Rfa3YtPnByZXYgPSBjc3ItPnJvb3Rfa3Y7Ci0JcmV0ID0gX2NzcjEyMTJfcmVhZF9rZXl2YWwoY3NyLCBjc3ItPnJvb3Rfa3YpOworCXJldCA9IGNzcjEyMTJfcmVhZF9rZXl2YWwoY3NyLCBjc3ItPnJvb3Rfa3YpOwogCWlmIChyZXQgIT0gQ1NSMTIxMl9TVUNDRVNTKQogCQlyZXR1cm4gcmV0OwogCkBAIC0xNjIzLDcgKzE0NTcsNyBAQAogCSAgICAgZGVudHJ5OyBkZW50cnkgPSBkZW50cnktPm5leHQpIHsKIAkJaWYgKGRlbnRyeS0+a3YtPmtleS5pZCA9PSBDU1IxMjEyX0tWX0lEX0VYVEVOREVEX1JPTSAmJgogCQkJIWRlbnRyeS0+a3YtPnZhbGlkKSB7Ci0JCQlyZXQgPSBfY3NyMTIxMl9yZWFkX2tleXZhbChjc3IsIGRlbnRyeS0+a3YpOworCQkJcmV0ID0gY3NyMTIxMl9yZWFkX2tleXZhbChjc3IsIGRlbnRyeS0+a3YpOwogCQkJaWYgKHJldCAhPSBDU1IxMjEyX1NVQ0NFU1MpCiAJCQkJcmV0dXJuIHJldDsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC9jc3IxMjEyLmggYi9kcml2ZXJzL2llZWUxMzk0L2NzcjEyMTIuaAppbmRleCAxN2RkZDcyLi5kZjkwOWNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWUxMzk0L2NzcjEyMTIuaAorKysgYi9kcml2ZXJzL2llZWUxMzk0L2NzcjEyMTIuaApAQCAtMzAsOTQgKzMwLDEzIEBACiAjaWZuZGVmIF9fQ1NSMTIxMl9IX18KICNkZWZpbmUgX19DU1IxMjEyX0hfXwogCi0KLS8qIENvbXBhdGliaWxpdHkgbGF5ZXIgKi8KLSNpZmRlZiBfX0tFUk5FTF9fCi0KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+Ci0jaW5jbHVkZSA8YXNtL3BnYWxsb2MuaD4KIAotI2RlZmluZSBDU1IxMjEyX01BTExPQyhzaXplKQkJdm1hbGxvYygoc2l6ZSkpCi0jZGVmaW5lIENTUjEyMTJfRlJFRShwdHIpCQl2ZnJlZShwdHIpCi0jZGVmaW5lIENTUjEyMTJfQkUxNl9UT19DUFUocXVhZCkJYmUxNl90b19jcHUocXVhZCkKLSNkZWZpbmUgQ1NSMTIxMl9DUFVfVE9fQkUxNihxdWFkKQljcHVfdG9fYmUxNihxdWFkKQotI2RlZmluZSBDU1IxMjEyX0JFMzJfVE9fQ1BVKHF1YWQpCWJlMzJfdG9fY3B1KHF1YWQpCi0jZGVmaW5lIENTUjEyMTJfQ1BVX1RPX0JFMzIocXVhZCkJY3B1X3RvX2JlMzIocXVhZCkKLSNkZWZpbmUgQ1NSMTIxMl9CRTY0X1RPX0NQVShxdWFkKQliZTY0X3RvX2NwdShxdWFkKQotI2RlZmluZSBDU1IxMjEyX0NQVV9UT19CRTY0KHF1YWQpCWNwdV90b19iZTY0KHF1YWQpCisjZGVmaW5lIENTUjEyMTJfTUFMTE9DKHNpemUpCWttYWxsb2MoKHNpemUpLCBHRlBfS0VSTkVMKQorI2RlZmluZSBDU1IxMjEyX0ZSRUUocHRyKQlrZnJlZShwdHIpCiAKLSNkZWZpbmUgQ1NSMTIxMl9MRTE2X1RPX0NQVShxdWFkKQlsZTE2X3RvX2NwdShxdWFkKQotI2RlZmluZSBDU1IxMjEyX0NQVV9UT19MRTE2KHF1YWQpCWNwdV90b19sZTE2KHF1YWQpCi0jZGVmaW5lIENTUjEyMTJfTEUzMl9UT19DUFUocXVhZCkJbGUzMl90b19jcHUocXVhZCkKLSNkZWZpbmUgQ1NSMTIxMl9DUFVfVE9fTEUzMihxdWFkKQljcHVfdG9fbGUzMihxdWFkKQotI2RlZmluZSBDU1IxMjEyX0xFNjRfVE9fQ1BVKHF1YWQpCWxlNjRfdG9fY3B1KHF1YWQpCi0jZGVmaW5lIENTUjEyMTJfQ1BVX1RPX0xFNjQocXVhZCkJY3B1X3RvX2xlNjQocXVhZCkKLQotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjZGVmaW5lIENTUjEyMTJfU1VDQ0VTUyAoMCkKLSNkZWZpbmUgQ1NSMTIxMl9FSU5WQUwJKC1FSU5WQUwpCi0jZGVmaW5lIENTUjEyMTJfRU5PTUVNCSgtRU5PTUVNKQotI2RlZmluZSBDU1IxMjEyX0VOT0VOVAkoLUVOT0VOVCkKLSNkZWZpbmUgQ1NSMTIxMl9FSU8JKC1FSU8pCi0jZGVmaW5lIENTUjEyMTJfRUJVU1kJKC1FQlVTWSkKLQotI2Vsc2UJLyogVXNlcnNwYWNlICovCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxtYWxsb2MuaD4KLSNkZWZpbmUgQ1NSMTIxMl9NQUxMT0Moc2l6ZSkJCW1hbGxvYyhzaXplKQotI2RlZmluZSBDU1IxMjEyX0ZSRUUocHRyKQkJZnJlZShwdHIpCi0jaW5jbHVkZSA8ZW5kaWFuLmg+Ci0jaWYgX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTgotI2luY2x1ZGUgPGJ5dGVzd2FwLmg+Ci0jZGVmaW5lIENTUjEyMTJfQkUxNl9UT19DUFUocXVhZCkJYnN3YXBfMTYocXVhZCkKLSNkZWZpbmUgQ1NSMTIxMl9DUFVfVE9fQkUxNihxdWFkKQlic3dhcF8xNihxdWFkKQotI2RlZmluZSBDU1IxMjEyX0JFMzJfVE9fQ1BVKHF1YWQpCWJzd2FwXzMyKHF1YWQpCi0jZGVmaW5lIENTUjEyMTJfQ1BVX1RPX0JFMzIocXVhZCkJYnN3YXBfMzIocXVhZCkKLSNkZWZpbmUgQ1NSMTIxMl9CRTY0X1RPX0NQVShxdWFkKQlic3dhcF82NChxdWFkKQotI2RlZmluZSBDU1IxMjEyX0NQVV9UT19CRTY0KHF1YWQpCWJzd2FwXzY0KHF1YWQpCi0KLSNkZWZpbmUgQ1NSMTIxMl9MRTE2X1RPX0NQVShxdWFkKQkocXVhZCkKLSNkZWZpbmUgQ1NSMTIxMl9DUFVfVE9fTEUxNihxdWFkKQkocXVhZCkKLSNkZWZpbmUgQ1NSMTIxMl9MRTMyX1RPX0NQVShxdWFkKQkocXVhZCkKLSNkZWZpbmUgQ1NSMTIxMl9DUFVfVE9fTEUzMihxdWFkKQkocXVhZCkKLSNkZWZpbmUgQ1NSMTIxMl9MRTY0X1RPX0NQVShxdWFkKQkocXVhZCkKLSNkZWZpbmUgQ1NSMTIxMl9DUFVfVE9fTEU2NChxdWFkKQkocXVhZCkKLSNlbHNlCi0jZGVmaW5lIENTUjEyMTJfQkUxNl9UT19DUFUocXVhZCkJKHF1YWQpCi0jZGVmaW5lIENTUjEyMTJfQ1BVX1RPX0JFMTYocXVhZCkJKHF1YWQpCi0jZGVmaW5lIENTUjEyMTJfQkUzMl9UT19DUFUocXVhZCkJKHF1YWQpCi0jZGVmaW5lIENTUjEyMTJfQ1BVX1RPX0JFMzIocXVhZCkJKHF1YWQpCi0jZGVmaW5lIENTUjEyMTJfQkU2NF9UT19DUFUocXVhZCkJKHF1YWQpCi0jZGVmaW5lIENTUjEyMTJfQ1BVX1RPX0JFNjQocXVhZCkJKHF1YWQpCi0KLSNkZWZpbmUgQ1NSMTIxMl9MRTE2X1RPX0NQVShxdWFkKQlic3dhcF8xNihxdWFkKQotI2RlZmluZSBDU1IxMjEyX0NQVV9UT19MRTE2KHF1YWQpCWJzd2FwXzE2KHF1YWQpCi0jZGVmaW5lIENTUjEyMTJfTEUzMl9UT19DUFUocXVhZCkJYnN3YXBfMzIocXVhZCkKLSNkZWZpbmUgQ1NSMTIxMl9DUFVfVE9fTEUzMihxdWFkKQlic3dhcF8zMihxdWFkKQotI2RlZmluZSBDU1IxMjEyX0xFNjRfVE9fQ1BVKHF1YWQpCWJzd2FwXzY0KHF1YWQpCi0jZGVmaW5lIENTUjEyMTJfQ1BVX1RPX0xFNjQocXVhZCkJYnN3YXBfNjQocXVhZCkKLSNlbmRpZgotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNkZWZpbmUgQ1NSMTIxMl9TVUNDRVNTICgwKQotI2RlZmluZSBDU1IxMjEyX0VJTlZBTAkoRUlOVkFMKQotI2RlZmluZSBDU1IxMjEyX0VOT01FTQkoRU5PTUVNKQotI2RlZmluZSBDU1IxMjEyX0VOT0VOVAkoRU5PRU5UKQotI2RlZmluZSBDU1IxMjEyX0VJTwkoRUlPKQotI2RlZmluZSBDU1IxMjEyX0VCVVNZCShFQlVTWSkKLQotI2VuZGlmCi0KLQotI2RlZmluZSBDU1IxMjEyX0tWX1ZBTF9NQVNLCQkJMHhmZmZmZmYKLSNkZWZpbmUgQ1NSMTIxMl9LVl9LRVlfU0hJRlQJCQkyNAotI2RlZmluZSBDU1IxMjEyX0tWX0tFWV9UWVBFX1NISUZUCQk2Ci0jZGVmaW5lIENTUjEyMTJfS1ZfS0VZX0lEX01BU0sJCQkweDNmCi0jZGVmaW5lIENTUjEyMTJfS1ZfS0VZX1RZUEVfTUFTSwkJMHgzCQkvKiBBZnRlciBzaGlmdCAqLwogCiAKIC8qIENTUiAxMjEyIGtleSB0eXBlcyAqLwpAQCAtMTkwLDQ4ICsxMDksMjIgQEAKICNkZWZpbmUgIENTUjEyMTJfVU5JVFNfU1BBQ0VfRU5ECQkoQ1NSMTIxMl9VTklUU19TUEFDRV9CQVNFICsgQ1NSMTIxMl9VTklUU19TUEFDRV9TSVpFKQogI2RlZmluZSAgQ1NSMTIxMl9VTklUU19TUEFDRV9PRkZTRVQJCShDU1IxMjEyX1VOSVRTX1NQQUNFX0JBU0UgLSBDU1IxMjEyX1JFR0lTVEVSX1NQQUNFX0JBU0UpCiAKLSNkZWZpbmUgIENTUjEyMTJfRVhURU5ERURfUk9NX1NJWkUJCSgweDEwMDAwICogc2l6ZW9mKHVfaW50MzJfdCkpCi0KICNkZWZpbmUgIENTUjEyMTJfSU5WQUxJRF9BRERSX1NQQUNFCQktMQogCisKIC8qIENvbmZpZyBST00gaW1hZ2Ugc3RydWN0dXJlcyAqLwogc3RydWN0IGNzcjEyMTJfYnVzX2luZm9fYmxvY2tfaW1nIHsKLQl1X2ludDhfdCBsZW5ndGg7Ci0JdV9pbnQ4X3QgY3JjX2xlbmd0aDsKLQl1X2ludDE2X3QgY3JjOworCXU4IGxlbmd0aDsKKwl1OCBjcmNfbGVuZ3RoOworCXUxNiBjcmM7CiAKIAkvKiBNdXN0IGJlIGxhc3QgKi8KLQl1X2ludDMyX3QgZGF0YVswXTsJLyogb2xkZXIgZ2NjIGNhbid0IGhhbmRsZSBbXSB3aGljaCBpcyBzdGFuZGFyZCAqLwotfTsKLQotI2RlZmluZSBDU1IxMjEyX0tWX0tFWShxdWFkKQkJKENTUjEyMTJfQkUzMl9UT19DUFUocXVhZCkgPj4gQ1NSMTIxMl9LVl9LRVlfU0hJRlQpCi0jZGVmaW5lIENTUjEyMTJfS1ZfS0VZX1RZUEUocXVhZCkJKENTUjEyMTJfS1ZfS0VZKHF1YWQpID4+IENTUjEyMTJfS1ZfS0VZX1RZUEVfU0hJRlQpCi0jZGVmaW5lIENTUjEyMTJfS1ZfS0VZX0lEKHF1YWQpCQkoQ1NSMTIxMl9LVl9LRVkocXVhZCkgJiBDU1IxMjEyX0tWX0tFWV9JRF9NQVNLKQotI2RlZmluZSBDU1IxMjEyX0tWX1ZBTChxdWFkKQkJKENTUjEyMTJfQkUzMl9UT19DUFUocXVhZCkgJiBDU1IxMjEyX0tWX1ZBTF9NQVNLKQotCi0jZGVmaW5lIENTUjEyMTJfU0VUX0tWX0tFWShxdWFkLCBrZXkpCSgocXVhZCkgPSBcCi0JQ1NSMTIxMl9DUFVfVE9fQkUzMihDU1IxMjEyX0tWX1ZBTChxdWFkKSB8ICgoa2V5KSA8PCBDU1IxMjEyX0tWX0tFWV9TSElGVCkpKQotI2RlZmluZSBDU1IxMjEyX1NFVF9LVl9WQUwocXVhZCwgdmFsKQkoKHF1YWQpID0gXAotCUNTUjEyMTJfQ1BVX1RPX0JFMzIoKENTUjEyMTJfS1ZfS0VZKHF1YWQpIDw8IENTUjEyMTJfS1ZfS0VZX1NISUZUKSB8ICh2YWwpKSkKLSNkZWZpbmUgQ1NSMTIxMl9TRVRfS1ZfVFlQRUlEKHF1YWQsIHR5cGUsIGlkKQkoKHF1YWQpID0gXAotCUNTUjEyMTJfQ1BVX1RPX0JFMzIoQ1NSMTIxMl9LVl9WQUwocXVhZCkgfCBcCi0JKCgoKCh0eXBlKSAmIENTUjEyMTJfS1ZfS0VZX1RZUEVfTUFTSykgPDwgQ1NSMTIxMl9LVl9LRVlfVFlQRV9TSElGVCkgfCBcCi0JICAoKGlkKSAmIENTUjEyMTJfS1ZfS0VZX0lEX01BU0spKSA8PCBDU1IxMjEyX0tWX0tFWV9TSElGVCkpKQotCi10eXBlZGVmIHVfaW50MzJfdCBjc3IxMjEyX3F1YWRfdDsKLQotCi1zdHJ1Y3QgY3NyMTIxMl9rZXl2YWxfaW1nIHsKLQl1X2ludDE2X3QgbGVuZ3RoOwotCXVfaW50MTZfdCBjcmM7Ci0KLQkvKiBNdXN0IGJlIGxhc3QgKi8KLQljc3IxMjEyX3F1YWRfdCBkYXRhWzBdOwkvKiBvbGRlciBnY2MgY2FuJ3QgaGFuZGxlIFtdIHdoaWNoIGlzIHN0YW5kYXJkICovCisJdTMyIGRhdGFbMF07CS8qIG9sZGVyIGdjYyBjYW4ndCBoYW5kbGUgW10gd2hpY2ggaXMgc3RhbmRhcmQgKi8KIH07CiAKIHN0cnVjdCBjc3IxMjEyX2xlYWYgewogCWludCBsZW47Ci0JdV9pbnQzMl90ICpkYXRhOworCXUzMiAqZGF0YTsKIH07CiAKIHN0cnVjdCBjc3IxMjEyX2RlbnRyeSB7CkBAIC0yNDYsMTIgKzEzOSwxMiBAQAogCiBzdHJ1Y3QgY3NyMTIxMl9rZXl2YWwgewogCXN0cnVjdCB7Ci0JCXVfaW50OF90IHR5cGU7Ci0JCXVfaW50OF90IGlkOworCQl1OCB0eXBlOworCQl1OCBpZDsKIAl9IGtleTsKIAl1bmlvbiB7Ci0JCXVfaW50MzJfdCBpbW1lZGlhdGU7Ci0JCXVfaW50MzJfdCBjc3Jfb2Zmc2V0OworCQl1MzIgaW1tZWRpYXRlOworCQl1MzIgY3NyX29mZnNldDsKIAkJc3RydWN0IGNzcjEyMTJfbGVhZiBsZWFmOwogCQlzdHJ1Y3QgY3NyMTIxMl9kaXJlY3RvcnkgZGlyZWN0b3J5OwogCX0gdmFsdWU7CkBAIC0yNjAsMTUgKzE1MywxNSBAQAogCiAJLyogdXNlZCBpbiBnZW5lcmF0aW5nIGFuZC9vciBwYXJzaW5nIENTUiBpbWFnZSAqLwogCXN0cnVjdCBjc3IxMjEyX2tleXZhbCAqbmV4dCwgKnByZXY7CS8qIGZsYXQgbGlzdCBvZiBDU1IgZWxlbWVudHMgKi8KLQl1X2ludDMyX3Qgb2Zmc2V0OwkvKiBwb3NpdGlvbiBpbiBDU1IgZnJvbSAweGZmZmYgZjAwMCAwMDAwICovCi0JdV9pbnQ4X3QgdmFsaWQ7CQkvKiBmbGFnIGluZGljYXRpbmcga2V5dmFsIGhhcyB2YWxpZCBkYXRhKi8KKwl1MzIgb2Zmc2V0OwkvKiBwb3NpdGlvbiBpbiBDU1IgZnJvbSAweGZmZmYgZjAwMCAwMDAwICovCisJdTggdmFsaWQ7CS8qIGZsYWcgaW5kaWNhdGluZyBrZXl2YWwgaGFzIHZhbGlkIGRhdGEqLwogfTsKIAogCiBzdHJ1Y3QgY3NyMTIxMl9jYWNoZV9yZWdpb24gewogCXN0cnVjdCBjc3IxMjEyX2NhY2hlX3JlZ2lvbiAqbmV4dCwgKnByZXY7Ci0JdV9pbnQzMl90IG9mZnNldF9zdGFydDsJCS8qIGluY2x1c2l2ZSAqLwotCXVfaW50MzJfdCBvZmZzZXRfZW5kOwkJLyogZXhjbHVzaXZlICovCisJdTMyIG9mZnNldF9zdGFydDsJLyogaW5jbHVzaXZlICovCisJdTMyIG9mZnNldF9lbmQ7CQkvKiBleGNsdXNpdmUgKi8KIH07CiAKIHN0cnVjdCBjc3IxMjEyX2Nzcl9yb21fY2FjaGUgewpAQCAtMjc2LDE4ICsxNjksMTggQEAKIAlzdHJ1Y3QgY3NyMTIxMl9jYWNoZV9yZWdpb24gKmZpbGxlZF9oZWFkLCAqZmlsbGVkX3RhaWw7CiAJc3RydWN0IGNzcjEyMTJfa2V5dmFsICpsYXlvdXRfaGVhZCwgKmxheW91dF90YWlsOwogCXNpemVfdCBzaXplOwotCXVfaW50MzJfdCBvZmZzZXQ7CisJdTMyIG9mZnNldDsKIAlzdHJ1Y3QgY3NyMTIxMl9rZXl2YWwgKmV4dF9yb207CiAJc2l6ZV90IGxlbjsKIAogCS8qIE11c3QgYmUgbGFzdCAqLwotCXVfaW50MzJfdCBkYXRhWzBdOwkvKiBvbGRlciBnY2MgY2FuJ3QgaGFuZGxlIFtdIHdoaWNoIGlzIHN0YW5kYXJkICovCisJdTMyIGRhdGFbMF07CS8qIG9sZGVyIGdjYyBjYW4ndCBoYW5kbGUgW10gd2hpY2ggaXMgc3RhbmRhcmQgKi8KIH07CiAKIHN0cnVjdCBjc3IxMjEyX2NzciB7CiAJc2l6ZV90IGJ1c19pbmZvX2xlbjsJLyogYnVzIGluZm8gYmxvY2sgbGVuZ3RoIGluIGJ5dGVzICovCiAJc2l6ZV90IGNyY19sZW47CQkvKiBjcmMgbGVuZ3RoIGluIGJ5dGVzICovCi0JdV9pbnQzMl90ICpidXNfaW5mb19kYXRhOwkvKiBidXMgaW5mbyBkYXRhIGluY2wgYnVzIG5hbWUgYW5kIEVVSSAqLworCXUzMiAqYnVzX2luZm9fZGF0YTsJLyogYnVzIGluZm8gZGF0YSBpbmNsIGJ1cyBuYW1lIGFuZCBFVUkgKi8KIAogCXZvaWQgKnByaXZhdGU7CQkvKiBwcml2YXRlLCBidXMgc3BlY2lmaWMgZGF0YSAqLwogCXN0cnVjdCBjc3IxMjEyX2J1c19vcHMgKm9wczsKQEAgLTMwNSw1MiArMTk4LDM4IEBACiAJICogZnJvbSByZW1vdGUgbm9kZXMgd2hlbiBwYXJzaW5nIGEgQ29uZmlnIFJPTSAoaS5lLiwgcmVhZCBDb25maWcgUk9NCiAJICogZW50cmllcyBsb2NhdGVkIGluIHRoZSBVbml0cyBTcGFjZS4gIE11c3QgcmV0dXJuIDAgb24gc3VjY2VzcwogCSAqIGFueXRoaW5nIGVsc2UgaW5kaWNhdGVzIGFuIGVycm9yLiAqLwotCWludCAoKmJ1c19yZWFkKSAoc3RydWN0IGNzcjEyMTJfY3NyICpjc3IsIHVfaW50NjRfdCBhZGRyLAotCQkJIHVfaW50MTZfdCBsZW5ndGgsIHZvaWQgKmJ1ZmZlciwgdm9pZCAqcHJpdmF0ZSk7CisJaW50ICgqYnVzX3JlYWQpIChzdHJ1Y3QgY3NyMTIxMl9jc3IgKmNzciwgdTY0IGFkZHIsCisJCQkgdTE2IGxlbmd0aCwgdm9pZCAqYnVmZmVyLCB2b2lkICpwcml2YXRlKTsKIAogCS8qIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSBjc3IxMjEyIHRvIGFsbG9jYXRlIGEgcmVnaW9uIGluIHVuaXRzIHNwYWNlCiAJICogaW4gdGhlIGV2ZW50IHRoYXQgQ29uZmlnIFJPTSBlbnRyaWVzIGRvbid0IGFsbCBmaXQgaW4gdGhlIHByZWRlZmluZWQKIAkgKiAxSyByZWdpb24uICBUaGUgdm9pZCAqcHJpdmF0ZSBwYXJhbWV0ZXIgaXMgcHJpdmF0ZSBtZW1iZXIgb2Ygc3RydWN0CiAJICogY3NyMTIxMl9jc3IuICovCi0JdV9pbnQ2NF90ICgqYWxsb2NhdGVfYWRkcl9yYW5nZSkgKHVfaW50NjRfdCBzaXplLCB1X2ludDMyX3QgYWxpZ25tZW50LAotCQkJCQkgIHZvaWQgKnByaXZhdGUpOwotCisJdTY0ICgqYWxsb2NhdGVfYWRkcl9yYW5nZSkgKHU2NCBzaXplLCB1MzIgYWxpZ25tZW50LCB2b2lkICpwcml2YXRlKTsKIAogCS8qIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSBjc3IxMjEyIHRvIHJlbGVhc2UgYSByZWdpb24gaW4gdW5pdHMgc3BhY2UKIAkgKiB0aGF0IGlzIG5vIGxvbmdlciBuZWVkZWQuICovCi0Jdm9pZCAoKnJlbGVhc2VfYWRkcikgKHVfaW50NjRfdCBhZGRyLCB2b2lkICpwcml2YXRlKTsKKwl2b2lkICgqcmVsZWFzZV9hZGRyKSAodTY0IGFkZHIsIHZvaWQgKnByaXZhdGUpOwogCiAJLyogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IGNzcjEyMTIgdG8gZGV0ZXJtaW5lIHRoZSBtYXggcmVhZCByZXF1ZXN0CiAJICogc3VwcG9ydGVkIGJ5IGEgcmVtb3RlIG5vZGUgd2hlbiByZWFkaW5nIHRoZSBDb25maWdST00gc3BhY2UuICBNdXN0CiAJICogcmV0dXJuIDAsIDEsIG9yIDIgcGVyIElFRUUgMTIxMi4gICovCi0JaW50ICgqZ2V0X21heF9yb20pICh1X2ludDMyX3QgKmJ1c19pbmZvLCB2b2lkICpwcml2YXRlKTsKKwlpbnQgKCpnZXRfbWF4X3JvbSkgKHUzMiAqYnVzX2luZm8sIHZvaWQgKnByaXZhdGUpOwogfTsKIAogCi0KLQogLyogRGVzY3JpcHRvciBMZWFmIG1hbmlwdWxhdGlvbiBtYWNyb3MgKi8KICNkZWZpbmUgQ1NSMTIxMl9ERVNDUklQVE9SX0xFQUZfVFlQRV9TSElGVCAyNAogI2RlZmluZSBDU1IxMjEyX0RFU0NSSVBUT1JfTEVBRl9TUEVDSUZJRVJfSURfTUFTSyAweGZmZmZmZgotI2RlZmluZSBDU1IxMjEyX0RFU0NSSVBUT1JfTEVBRl9PVkVSSEVBRCAoMSAqIHNpemVvZih1X2ludDMyX3QpKQorI2RlZmluZSBDU1IxMjEyX0RFU0NSSVBUT1JfTEVBRl9PVkVSSEVBRCAoMSAqIHNpemVvZih1MzIpKQogCiAjZGVmaW5lIENTUjEyMTJfREVTQ1JJUFRPUl9MRUFGX1RZUEUoa3YpIFwKLQkoQ1NSMTIxMl9CRTMyX1RPX0NQVSgoa3YpLT52YWx1ZS5sZWFmLmRhdGFbMF0pID4+IENTUjEyMTJfREVTQ1JJUFRPUl9MRUFGX1RZUEVfU0hJRlQpCisJKGJlMzJfdG9fY3B1KChrdiktPnZhbHVlLmxlYWYuZGF0YVswXSkgPj4gXAorCSBDU1IxMjEyX0RFU0NSSVBUT1JfTEVBRl9UWVBFX1NISUZUKQogI2RlZmluZSBDU1IxMjEyX0RFU0NSSVBUT1JfTEVBRl9TUEVDSUZJRVJfSUQoa3YpIFwKLQkoQ1NSMTIxMl9CRTMyX1RPX0NQVSgoa3YpLT52YWx1ZS5sZWFmLmRhdGFbMF0pICYgXAorCShiZTMyX3RvX2NwdSgoa3YpLT52YWx1ZS5sZWFmLmRhdGFbMF0pICYgXAogCSBDU1IxMjEyX0RFU0NSSVBUT1JfTEVBRl9TUEVDSUZJRVJfSURfTUFTSykKLSNkZWZpbmUgQ1NSMTIxMl9ERVNDUklQVE9SX0xFQUZfREFUQShrdikgXAotCSgmKChrdiktPnZhbHVlLmxlYWYuZGF0YVsxXSkpCiAKLSNkZWZpbmUgQ1NSMTIxMl9ERVNDUklQVE9SX0xFQUZfU0VUX1RZUEUoa3YsIHR5cGUpIFwKLQkoKGt2KS0+dmFsdWUubGVhZi5kYXRhWzBdID0gXAotCSBDU1IxMjEyX0NQVV9UT19CRTMyKENTUjEyMTJfREVTQ1JJUFRPUl9MRUFGX1NQRUNJRklFUl9JRChrdikgfCBcCi0JCQkgICAgICgodHlwZSkgPDwgQ1NSMTIxMl9ERVNDUklQVE9SX0xFQUZfVFlQRV9TSElGVCkpKQotI2RlZmluZSBDU1IxMjEyX0RFU0NSSVBUT1JfTEVBRl9TRVRfU1BFQ0lGSUVSX0lEKGt2LCBzcGVjX2lkKSBcCi0JKChrdiktPnZhbHVlLmxlYWYuZGF0YVswXSA9IFwKLQkgQ1NSMTIxMl9DUFVfVE9fQkUzMigoQ1NSMTIxMl9ERVNDUklQVE9SX0xFQUZfVFlQRShrdikgPDwgXAotCQkJICAgICAgQ1NSMTIxMl9ERVNDUklQVE9SX0xFQUZfVFlQRV9TSElGVCkgfCBcCi0JCQkgICAgICgoc3BlY19pZCkgJiBDU1IxMjEyX0RFU0NSSVBUT1JfTEVBRl9TUEVDSUZJRVJfSURfTUFTSykpKQogCiAvKiBUZXh0IERlc2NyaXB0b3IgTGVhZiBtYW5pcHVsYXRpb24gbWFjcm9zICovCiAjZGVmaW5lIENTUjEyMTJfVEVYVFVBTF9ERVNDUklQVE9SX0xFQUZfV0lEVEhfU0hJRlQgMjgKQEAgLTM1OCwxODIgKzIzNywyMSBAQAogI2RlZmluZSBDU1IxMjEyX1RFWFRVQUxfREVTQ1JJUFRPUl9MRUFGX0NIQVJfU0VUX1NISUZUIDE2CiAjZGVmaW5lIENTUjEyMTJfVEVYVFVBTF9ERVNDUklQVE9SX0xFQUZfQ0hBUl9TRVRfTUFTSyAweGZmZiAgLyogYWZ0ZXIgc2hpZnQgKi8KICNkZWZpbmUgQ1NSMTIxMl9URVhUVUFMX0RFU0NSSVBUT1JfTEVBRl9MQU5HVUFHRV9NQVNLIDB4ZmZmZgotI2RlZmluZSBDU1IxMjEyX1RFWFRVQUxfREVTQ1JJUFRPUl9MRUFGX09WRVJIRUFEICgxICogc2l6ZW9mKHVfaW50MzJfdCkpCisjZGVmaW5lIENTUjEyMTJfVEVYVFVBTF9ERVNDUklQVE9SX0xFQUZfT1ZFUkhFQUQgKDEgKiBzaXplb2YodTMyKSkKIAogI2RlZmluZSBDU1IxMjEyX1RFWFRVQUxfREVTQ1JJUFRPUl9MRUFGX1dJRFRIKGt2KSBcCi0JKENTUjEyMTJfQkUzMl9UT19DUFUoKGt2KS0+dmFsdWUubGVhZi5kYXRhWzFdKSA+PiBcCisJKGJlMzJfdG9fY3B1KChrdiktPnZhbHVlLmxlYWYuZGF0YVsxXSkgPj4gXAogCSBDU1IxMjEyX1RFWFRVQUxfREVTQ1JJUFRPUl9MRUFGX1dJRFRIX1NISUZUKQogI2RlZmluZSBDU1IxMjEyX1RFWFRVQUxfREVTQ1JJUFRPUl9MRUFGX0NIQVJfU0VUKGt2KSBcCi0JKChDU1IxMjEyX0JFMzJfVE9fQ1BVKChrdiktPnZhbHVlLmxlYWYuZGF0YVsxXSkgPj4gXAotCQkJICAgICBDU1IxMjEyX1RFWFRVQUxfREVTQ1JJUFRPUl9MRUFGX0NIQVJfU0VUX1NISUZUKSAmIFwKLQkJCSAgICBDU1IxMjEyX1RFWFRVQUxfREVTQ1JJUFRPUl9MRUFGX0NIQVJfU0VUX01BU0spCisJKChiZTMyX3RvX2NwdSgoa3YpLT52YWx1ZS5sZWFmLmRhdGFbMV0pID4+IFwKKwkgIENTUjEyMTJfVEVYVFVBTF9ERVNDUklQVE9SX0xFQUZfQ0hBUl9TRVRfU0hJRlQpICYgXAorCSBDU1IxMjEyX1RFWFRVQUxfREVTQ1JJUFRPUl9MRUFGX0NIQVJfU0VUX01BU0spCiAjZGVmaW5lIENTUjEyMTJfVEVYVFVBTF9ERVNDUklQVE9SX0xFQUZfTEFOR1VBR0Uoa3YpIFwKLQkoQ1NSMTIxMl9CRTMyX1RPX0NQVSgoa3YpLT52YWx1ZS5sZWFmLmRhdGFbMV0pICYgXAorCShiZTMyX3RvX2NwdSgoa3YpLT52YWx1ZS5sZWFmLmRhdGFbMV0pICYgXAogCSBDU1IxMjEyX1RFWFRVQUxfREVTQ1JJUFRPUl9MRUFGX0xBTkdVQUdFX01BU0spCiAjZGVmaW5lIENTUjEyMTJfVEVYVFVBTF9ERVNDUklQVE9SX0xFQUZfREFUQShrdikgXAogCSgmKChrdiktPnZhbHVlLmxlYWYuZGF0YVsyXSkpCiAKLSNkZWZpbmUgQ1NSMTIxMl9URVhUVUFMX0RFU0NSSVBUT1JfTEVBRl9TRVRfV0lEVEgoa3YsIHdpZHRoKSBcCi0JKChrdiktPnZhbHVlLmxlYWYuZGF0YVsxXSA9IFwKLQkgKChrdiktPnZhbHVlLmxlYWYuZGF0YVsxXSAmIFwKLQkgIENTUjEyMTJfQ1BVX1RPX0JFMzIofihDU1IxMjEyX1RFWFRVQUxfREVTQ1JJUFRPUl9MRUFGX1dJRFRIX01BU0sgPDwgXAotCQkJCUNTUjEyMTJfVEVYVFVBTF9ERVNDUklQVE9SX0xFQUZfV0lEVEhfU0hJRlQpKSkgfCBcCi0JIENTUjEyMTJfQ1BVX1RPX0JFMzIoKCh3aWR0aCkgJiBcCi0JCQkgICAgICBDU1IxMjEyX1RFWFRVQUxfREVTQ1JJUFRPUl9MRUFGX1dJRFRIX01BU0spIDw8IFwKLQkJCSAgICAgQ1NSMTIxMl9URVhUVUFMX0RFU0NSSVBUT1JfTEVBRl9XSURUSF9TSElGVCkpCi0jZGVmaW5lIENTUjEyMTJfVEVYVFVBTF9ERVNDUklQVE9SX0xFQUZfU0VUX0NIQVJfU0VUKGt2LCBjaGFyX3NldCkgXAotCSgoa3YpLT52YWx1ZS5sZWFmLmRhdGFbMV0gPSBcCi0JICgoa3YpLT52YWx1ZS5sZWFmLmRhdGFbMV0gJiBcCi0JICBDU1IxMjEyX0NQVV9UT19CRTMyKH4oQ1NSMTIxMl9URVhUVUFMX0RFU0NSSVBUT1JfTEVBRl9DSEFSX1NFVF9NQVNLIDw8IFwKLQkJCQlDU1IxMjEyX1RFWFRVQUxfREVTQ1JJUFRPUl9MRUFGX0NIQVJfU0VUX1NISUZUKSkpIHwgXAotCSBDU1IxMjEyX0NQVV9UT19CRTMyKCgoY2hhcl9zZXQpICYgXAotCQkJICAgICAgQ1NSMTIxMl9URVhUVUFMX0RFU0NSSVBUT1JfTEVBRl9DSEFSX1NFVF9NQVNLKSA8PCBcCi0JCQkgICAgIENTUjEyMTJfVEVYVFVBTF9ERVNDUklQVE9SX0xFQUZfQ0hBUl9TRVRfU0hJRlQpKQotI2RlZmluZSBDU1IxMjEyX1RFWFRVQUxfREVTQ1JJUFRPUl9MRUFGX1NFVF9MQU5HVUFHRShrdiwgbGFuZ3VhZ2UpIFwKLQkoKGt2KS0+dmFsdWUubGVhZi5kYXRhWzFdID0gXAotCSAoKGt2KS0+dmFsdWUubGVhZi5kYXRhWzFdICYgXAotCSAgQ1NSMTIxMl9DUFVfVE9fQkUzMih+KENTUjEyMTJfVEVYVFVBTF9ERVNDUklQVE9SX0xFQUZfTEFOR1VBR0VfTUFTSykpKSB8IFwKLQkgQ1NSMTIxMl9DUFVfVE9fQkUzMigoKGxhbmd1YWdlKSAmIFwKLQkJCSAgICAgIENTUjEyMTJfVEVYVFVBTF9ERVNDUklQVE9SX0xFQUZfTEFOR1VBR0VfTUFTSykpKQotCi0KLS8qIEljb24gRGVzY3JpcHRvciBMZWFmIG1hbmlwdWxhdGlvbiBtYWNyb3MgKi8KLSNkZWZpbmUgQ1NSMTIxMl9JQ09OX0RFU0NSSVBUT1JfTEVBRl9WRVJTSU9OX01BU0sgMHhmZmZmZmYKLSNkZWZpbmUgQ1NSMTIxMl9JQ09OX0RFU0NSSVBUT1JfTEVBRl9QQUxFVFRFX0RFUFRIX1NISUZUIDMwCi0jZGVmaW5lIENTUjEyMTJfSUNPTl9ERVNDUklQVE9SX0xFQUZfUEFMRVRURV9ERVBUSF9NQVNLIDB4MyAvKiBhZnRlciBzaGlmdCAqLwotI2RlZmluZSBDU1IxMjEyX0lDT05fREVTQ1JJUFRPUl9MRUFGX0NPTE9SX1NQQUNFX1NISUZUIDE2Ci0jZGVmaW5lIENTUjEyMTJfSUNPTl9ERVNDUklQVE9SX0xFQUZfQ09MT1JfU1BBQ0VfTUFTSyAweGYgLyogYWZ0ZXIgc2hpZnQgKi8KLSNkZWZpbmUgQ1NSMTIxMl9JQ09OX0RFU0NSSVBUT1JfTEVBRl9MQU5HVUFHRV9NQVNLIDB4ZmZmZgotI2RlZmluZSBDU1IxMjEyX0lDT05fREVTQ1JJUFRPUl9MRUFGX0hTQ0FOX1NISUZUIDE2Ci0jZGVmaW5lIENTUjEyMTJfSUNPTl9ERVNDUklQVE9SX0xFQUZfSFNDQU5fTUFTSyAweGZmZmYgLyogYWZ0ZXIgc2hpZnQgKi8KLSNkZWZpbmUgQ1NSMTIxMl9JQ09OX0RFU0NSSVBUT1JfTEVBRl9WU0NBTl9NQVNLIDB4ZmZmZgotI2RlZmluZSBDU1IxMjEyX0lDT05fREVTQ1JJUFRPUl9MRUFGX09WRVJIRUFEICgzICogc2l6ZW9mKHVfaW50MzJfdCkpCi0KLSNkZWZpbmUgQ1NSMTIxMl9JQ09OX0RFU0NSSVBUT1JfTEVBRl9WRVJTSU9OKGt2KSBcCi0JKENTUjEyMTJfQkUzMl9UT19DUFUoKGt2KS0+dmFsdWUubGVhZi5kYXRhWzJdKSAmIFwKLQkgQ1NSMTIxMl9JQ09OX0RFU0NSSVBUT1JfTEVBRl9WRVJTSU9OX01BU0spCi0KLSNkZWZpbmUgQ1NSMTIxMl9JQ09OX0RFU0NSSVBUT1JfTEVBRl9QQUxFVFRFX0RFUFRIKGt2KSBcCi0JKENTUjEyMTJfQkUzMl9UT19DUFUoKGt2KS0+dmFsdWUubGVhZi5kYXRhWzNdKSA+PiBcCi0JIENTUjEyMTJfSUNPTl9ERVNDUklQVE9SX0xFQUZfUEFMRVRURV9ERVBUSF9TSElGVCkKLQotI2RlZmluZSBDU1IxMjEyX0lDT05fREVTQ1JJUFRPUl9MRUFGX0NPTE9SX1NQQUNFKGt2KSBcCi0JKChDU1IxMjEyX0JFMzJfVE9fQ1BVKChrdiktPnZhbHVlLmxlYWYuZGF0YVszXSkgPj4gXAotCSAgQ1NSMTIxMl9JQ09OX0RFU0NSSVBUT1JfTEVBRl9DT0xPUl9TUEFDRV9TSElGVCkgJiBcCi0JIENTUjEyMTJfSUNPTl9ERVNDUklQVE9SX0xFQUZfQ09MT1JfU1BBQ0VfTUFTSykKLQotI2RlZmluZSBDU1IxMjEyX0lDT05fREVTQ1JJUFRPUl9MRUFGX0xBTkdVQUdFKGt2KSBcCi0JKENTUjEyMTJfQkUzMl9UT19DUFUoKGt2KS0+dmFsdWUubGVhZi5kYXRhWzNdKSAmIFwKLQkgQ1NSMTIxMl9JQ09OX0RFU0NSSVBUT1JfTEVBRl9MQU5HVUFHRV9NQVNLKQotCi0jZGVmaW5lIENTUjEyMTJfSUNPTl9ERVNDUklQVE9SX0xFQUZfSFNDQU4oa3YpIFwKLQkoKENTUjEyMTJfQkUzMl9UT19DUFUoKGt2KS0+dmFsdWUubGVhZi5kYXRhWzRdKSA+PiBcCi0JICBDU1IxMjEyX0lDT05fREVTQ1JJUFRPUl9MRUFGX0NPTE9SX0hTQ0FOX1NISUZUKSAmIFwKLQkgQ1NSMTIxMl9JQ09OX0RFU0NSSVBUT1JfTEVBRl9DT0xPUl9IU0NBTl9NQVNLKQotCi0jZGVmaW5lIENTUjEyMTJfSUNPTl9ERVNDUklQVE9SX0xFQUZfVlNDQU4oa3YpIFwKLQkoQ1NSMTIxMl9CRTMyX1RPX0NQVSgoa3YpLT52YWx1ZS5sZWFmLmRhdGFbNF0pICYgXAotCSBDU1IxMjEyX0lDT05fREVTQ1JJUFRPUl9MRUFGX1ZTQ0FOX01BU0spCi0KLSNkZWZpbmUgQ1NSMTIxMl9JQ09OX0RFU0NSSVBUT1JfTEVBRl9QQUxFVFRFKGt2KSBcCi0JKCYoKGt2KS0+dmFsdWUubGVhZi5kYXRhWzVdKSkKLQotc3RhdGljIGlubGluZSB1X2ludDMyX3QgKkNTUjEyMTJfSUNPTl9ERVNDUklQVE9SX0xFQUZfUElYRUxTKHN0cnVjdCBjc3IxMjEyX2tleXZhbCAqa3YpCi17Ci0Jc3RhdGljIGNvbnN0IGludCBwZFs0XSA9IHsgMCwgNCwgMTYsIDI1NiB9OwotCXN0YXRpYyBjb25zdCBpbnQgY3NbMTZdID0geyA0LCAyIH07Ci0JaW50IHBzID0gcGRbQ1NSMTIxMl9JQ09OX0RFU0NSSVBUT1JfTEVBRl9QQUxFVFRFX0RFUFRIKGt2KV07Ci0KLQlyZXR1cm4gJmt2LT52YWx1ZS5sZWFmLmRhdGFbNSArCi0JCQkJICAgIChwcyAqIGNzW0NTUjEyMTJfSUNPTl9ERVNDUklQVE9SX0xFQUZfQ09MT1JfU1BBQ0Uoa3YpXSkgLwotCQkJICAgc2l6ZW9mKHVfaW50MzJfdCldOwotfQotCi0jZGVmaW5lIENTUjEyMTJfSUNPTl9ERVNDUklQVE9SX0xFQUZfU0VUX1ZFUlNJT04oa3YsIHZlcnNpb24pIFwKLQkoKGt2KS0+dmFsdWUubGVhZi5kYXRhWzJdID0gXAotCSAoKGt2KS0+dmFsdWUubGVhZi5kYXRhWzJdICYgXAotCSAgQ1NSMTIxMl9DUFVfVE9fQkUzMih+KENTUjEyMTJfSUNPTl9ERVNDUklQVE9SX0xFQUZfVkVSU0lPTl9NQVNLKSkpIHwgXAotCSBDU1IxMjEyX0NQVV9UT19CRTMyKCgodmVyc2lvbikgJiBcCi0JCQkgICAgICBDU1IxMjEyX0lDT05fREVTQ1JJUFRPUl9MRUFGX1ZFUlNJT05fTUFTSykpKQotCi0jZGVmaW5lIENTUjEyMTJfSUNPTl9ERVNDUklQVE9SX0xFQUZfU0VUX1BBTEVUVEVfREVQVEgoa3YsIHBhbGV0dGVfZGVwdGgpIFwKLQkoKGt2KS0+dmFsdWUubGVhZi5kYXRhWzNdID0gXAotCSAoKGt2KS0+dmFsdWUubGVhZi5kYXRhWzNdICYgXAotCSAgQ1NSMTIxMl9DUFVfVE9fQkUzMih+KENTUjEyMTJfSUNPTl9ERVNDUklQVE9SX0xFQUZfUEFMRVRURV9ERVBUSF9NQVNLIDw8IFwKLQkJCQlDU1IxMjEyX0lDT05fREVTQ1JJUFRPUl9MRUFGX1BBTEVUVEVfREVQVEhfU0hJRlQpKSkgfCBcCi0JIENTUjEyMTJfQ1BVX1RPX0JFMzIoKChwYWxldHRlX2RlcHRoKSAmIFwKLQkJCSAgICAgIENTUjEyMTJfSUNPTl9ERVNDUklQVE9SX0xFQUZfUEFMRVRURV9ERVBUSF9NQVNLKSA8PCBcCi0JCQkgICAgIENTUjEyMTJfSUNPTl9ERVNDUklQVE9SX0xFQUZfUEFMRVRURV9ERVBUSF9TSElGVCkpCi0KLSNkZWZpbmUgQ1NSMTIxMl9JQ09OX0RFU0NSSVBUT1JfTEVBRl9TRVRfQ09MT1JfU1BBQ0Uoa3YsIGNvbG9yX3NwYWNlKSBcCi0JKChrdiktPnZhbHVlLmxlYWYuZGF0YVszXSA9IFwKLQkgKChrdiktPnZhbHVlLmxlYWYuZGF0YVszXSAmIFwKLQkgIENTUjEyMTJfQ1BVX1RPX0JFMzIofihDU1IxMjEyX0lDT05fREVTQ1JJUFRPUl9MRUFGX0NPTE9SX1NQQUNFX01BU0sgPDwgXAotCQkJCUNTUjEyMTJfSUNPTl9ERVNDUklQVE9SX0xFQUZfQ09MT1JfU1BBQ0VfU0hJRlQpKSkgfCBcCi0JIENTUjEyMTJfQ1BVX1RPX0JFMzIoKChjb2xvcl9zcGFjZSkgJiBcCi0JCQkgICAgICBDU1IxMjEyX0lDT05fREVTQ1JJUFRPUl9MRUFGX0NPTE9SX1NQQUNFX01BU0spIDw8IFwKLQkJCSAgICAgQ1NSMTIxMl9JQ09OX0RFU0NSSVBUT1JfTEVBRl9DT0xPUl9TUEFDRV9TSElGVCkpCi0KLSNkZWZpbmUgQ1NSMTIxMl9JQ09OX0RFU0NSSVBUT1JfTEVBRl9TRVRfTEFOR1VBR0Uoa3YsIGxhbmd1YWdlKSBcCi0JKChrdiktPnZhbHVlLmxlYWYuZGF0YVszXSA9IFwKLQkgKChrdiktPnZhbHVlLmxlYWYuZGF0YVszXSAmIFwKLQkgIENTUjEyMTJfQ1BVX1RPX0JFMzIofihDU1IxMjEyX0lDT05fREVTQ1JJUFRPUl9MRUFGX0xBTkdVQUdFX01BU0spKSkgfCBcCi0JIENTUjEyMTJfQ1BVX1RPX0JFMzIoKChsYW5ndWFnZSkgJiBcCi0JCQkgICAgICBDU1IxMjEyX0lDT05fREVTQ1JJUFRPUl9MRUFGX0xBTkdVQUdFX01BU0spKSkKLQotI2RlZmluZSBDU1IxMjEyX0lDT05fREVTQ1JJUFRPUl9MRUFGX1NFVF9IU0NBTihrdiwgaHNjYW4pIFwKLQkoKGt2KS0+dmFsdWUubGVhZi5kYXRhWzRdID0gXAotCSAoKGt2KS0+dmFsdWUubGVhZi5kYXRhWzRdICYgXAotCSAgQ1NSMTIxMl9DUFVfVE9fQkUzMih+KENTUjEyMTJfSUNPTl9ERVNDUklQVE9SX0xFQUZfSFNDQU5fTUFTSyA8PCBcCi0JCQkJQ1NSMTIxMl9JQ09OX0RFU0NSSVBUT1JfTEVBRl9IU0NBTl9TSElGVCkpKSB8IFwKLQkgQ1NSMTIxMl9DUFVfVE9fQkUzMigoKGhzY2FuKSAmIFwKLQkJCSAgICAgIENTUjEyMTJfSUNPTl9ERVNDUklQVE9SX0xFQUZfSFNDQU5fTUFTSykgPDwgXAotCQkJICAgICBDU1IxMjEyX0lDT05fREVTQ1JJUFRPUl9MRUFGX0hTQ0FOX1NISUZUKSkKLQotI2RlZmluZSBDU1IxMjEyX0lDT05fREVTQ1JJUFRPUl9MRUFGX1NFVF9WU0NBTihrdiwgdnNjYW4pIFwKLQkoKGt2KS0+dmFsdWUubGVhZi5kYXRhWzRdID0gXAotCSAoKChrdiktPnZhbHVlLmxlYWYuZGF0YVs0XSAmIFwKLQkgIENTUjEyMTJfQ1BVX1RPX0JFMzIofkNTUjEyMTJfSUNPTl9ERVNDUklQVE9SX0xFQUZfVlNDQU5fTUFTSykpKSB8IFwKLQkgQ1NSMTIxMl9DUFVfVE9fQkUzMigoKHZzY2FuKSAmIFwKLQkJCSAgICAgIENTUjEyMTJfSUNPTl9ERVNDUklQVE9SX0xFQUZfVlNDQU5fTUFTSykpKQotCi0KLS8qIE1vZGlmaWFibGUgRGVzY3JpcHRvciBMZWFmIG1hbmlwdWxhdGlvbiBtYWNyb3MgKi8KLSNkZWZpbmUgQ1NSMTIxMl9NT0RJRklBQkxFX0RFU0NSSVBUT1JfTEVBRl9NQVhfU0laRV9TSElGVCAxNgotI2RlZmluZSBDU1IxMjEyX01PRElGSUFCTEVfREVTQ1JJUFRPUl9MRUFGX01BWF9TSVpFX01BU0sgMHhmZmZmCi0jZGVmaW5lIENTUjEyMTJfTU9ESUZJQUJMRV9ERVNDUklQVE9SX0xFQUZfQUREUl9ISV9TSElGVCAzMgotI2RlZmluZSBDU1IxMjEyX01PRElGSUFCTEVfREVTQ1JJUFRPUl9MRUFGX0FERFJfSElfTUFTSyAweGZmZmYKLSNkZWZpbmUgQ1NSMTIxMl9NT0RJRklBQkxFX0RFU0NSSVBUT1JfTEVBRl9BRERSX0xPX01BU0sgMHhmZmZmZmZmZlVMTAotCi0jZGVmaW5lIENTUjEyMTJfTU9ESUZJQUJMRV9ERVNDUklQVE9SX01BWF9TSVpFKGt2KSBcCi0JQ1NSMTIxMl9CRTE2X1RPX0NQVSgoa3YpLT52YWx1ZS5sZWFmLmRhdGFbMF0gPj4gQ1NSMTIxMl9NT0RJRklBQkxFX0RFU0NSSVBUT1JfTUFYX1NJWkVfU0hJRlQpCi0KLSNkZWZpbmUgQ1NSMTIxMl9NT0RJRklBQkxFX0RFU0NSSVBUT1JfQUREUkVTUyhrdikgXAotCShDU1IxMjEyX0JFMTZfVE9fQ1BVKCgodV9pbnQ2NF90KSgoa3YpLT52YWx1ZS5sZWFmLmRhdGFbMF0pKSA8PCBcCi0JCQkgICAgIENTUjEyMTJfTU9ESUZJQUJMRV9ERVNDUklQVE9SX0FERFJfSElfU0hJRlQpIHwgXAotCSBDU1IxMjEyX0JFMzJfVE9fQ1BVKChrdiktPnZhbHVlLmxlYWYuZGF0YVsxXSkpCi0KLSNkZWZpbmUgQ1NSMTIxMl9NT0RJRklBQkxFX0RFU0NSSVBUT1JfU0VUX01BWF9TSVpFKGt2LCBzaXplKSBcCi0JKChrdiktPnZhbHVlLmxlYWYuZGF0YVswXSA9IFwKLQkgKChrdiktPnZhbHVlLmxlYWYuZGF0YVswXSAmIFwKLQkgIENTUjEyMTJfQ1BVX1RPX0JFMzIofihDU1IxMjEyX01PRElGSUFCTEVfREVTQ1JJUFRPUl9MRUFGX01BWF9TSVpFX01BU0sgPDwgXAotCQkJCUNTUjEyMTJfTU9ESUZJQUJMRV9ERVNDUklQVE9SX0xFQUZfTUFYX1NJWkVfU0hJRlQpKSkgfCBcCi0JIENTUjEyMTJfQ1BVX1RPX0JFMzIoKChzaXplKSAmIFwKLQkJCSAgICAgIENTUjEyMTJfTU9ESUZJQUJMRV9ERVNDUklQVE9SX0xFQUZfTUFYX1NJWkVfTUFTSykgPDwgXAotCQkJICAgICBDU1IxMjEyX01PRElGSUFCTEVfREVTQ1JJUFRPUl9MRUFGX01BWF9TSVpFX1NISUZUKSkKLQotI2RlZmluZSBDU1IxMjEyX01PRElGSUFCTEVfREVTQ1JJUFRPUl9TRVRfQUREUkVTU19ISShrdiwgYWRkcikgXAotCSgoa3YpLT52YWx1ZS5sZWFmLmRhdGFbMF0gPSBcCi0JICgoa3YpLT52YWx1ZS5sZWFmLmRhdGFbMF0gJiBcCi0JICBDU1IxMjEyX0NQVV9UT19CRTMyKH4oQ1NSMTIxMl9NT0RJRklBQkxFX0RFU0NSSVBUT1JfTEVBRl9BRERSX0hJX01BU0spKSkgfCBcCi0JICBDU1IxMjEyX0NQVV9UT19CRTMyKCgoYWRkcikgJiBcCi0JCQkgICAgICAgQ1NSMTIxMl9NT0RJRklBQkxFX0RFU0NSSVBUT1JfTEVBRl9BRERSX0hJX01BU0spKSkKLQotI2RlZmluZSBDU1IxMjEyX01PRElGSUFCTEVfREVTQ1JJUFRPUl9TRVRfQUREUkVTU19MTyhrdiwgYWRkcikgXAotCSgoa3YpLT52YWx1ZS5sZWFmLmRhdGFbMV0gPSBcCi0JIENTUjEyMTJfQ1BVX1RPX0JFMzIoYWRkciAmIENTUjEyMTJfTU9ESUZJQUJMRV9ERVNDUklQVE9SX0xFQUZfQUREUl9MT19NQVNLKSkKLQotCiAKIC8qIFRoZSBmb2xsb3dpbmcgMiBmdW5jdGlvbiBhcmUgZm9yIGNyZWF0aW5nIG5ldyBDb25maWd1cmF0aW9uIFJPTSB0cmVlcy4gIFRoZQogICogZmlyc3QgZnVuY3Rpb24gaXMgdXNlZCBmb3IgYm90aCBjcmVhdGluZyBsb2NhbCB0cmVlcyBhbmQgcGFyc2luZyByZW1vdGUKQEAgLTU0MywxMSArMjYxLDEwIEBACiAJCQkJCSAgICAgIHNpemVfdCBidXNfaW5mb19zaXplLAogCQkJCQkgICAgICB2b2lkICpwcml2YXRlKTsKIGV4dGVybiB2b2lkIGNzcjEyMTJfaW5pdF9sb2NhbF9jc3Ioc3RydWN0IGNzcjEyMTJfY3NyICpjc3IsCi0JCQkJICAgY29uc3QgdV9pbnQzMl90ICpidXNfaW5mb19kYXRhLCBpbnQgbWF4X3JvbSk7CisJCQkJICAgY29uc3QgdTMyICpidXNfaW5mb19kYXRhLCBpbnQgbWF4X3JvbSk7CiAKIAotLyogVGhlIGZvbGxvd2luZyBmdW5jdGlvbiBkZXN0cm95cyBhIENvbmZpZ3VyYXRpb24gUk9NIHRyZWUgYW5kIHJlbGVhc2UgYWxsCi0gKiBtZW1vcnkgdGFrZW4gYnkgdGhlIHRyZWUuICovCisvKiBEZXN0cm95IGEgQ29uZmlndXJhdGlvbiBST00gdHJlZSBhbmQgcmVsZWFzZSBhbGwgbWVtb3J5IHRha2VuIGJ5IHRoZSB0cmVlLiAqLwogZXh0ZXJuIHZvaWQgY3NyMTIxMl9kZXN0cm95X2NzcihzdHJ1Y3QgY3NyMTIxMl9jc3IgKmNzcik7CiAKIApAQCAtNTU1LDUwICsyNzIsMjAgQEAKICAqIGEgQ29uZmlndXJhdGlvbiBST00gdHJlZS4gIENvZGUgdGhhdCBjcmVhdGVzIG5ldyBrZXl2YWxzIHdpdGggdGhlc2UgZnVuY3Rpb25zCiAgKiBtdXN0IHJlbGVhc2UgdGhvc2Uga2V5dmFscyB3aXRoIGNzcjEyMTJfcmVsZWFzZV9rZXl2YWwoKSB3aGVuIHRoZXkgYXJlIG5vCiAgKiBsb25nZXIgbmVlZGVkLiAqLwotZXh0ZXJuIHN0cnVjdCBjc3IxMjEyX2tleXZhbCAqY3NyMTIxMl9uZXdfaW1tZWRpYXRlKHVfaW50OF90IGtleSwgdV9pbnQzMl90IHZhbHVlKTsKLWV4dGVybiBzdHJ1Y3QgY3NyMTIxMl9rZXl2YWwgKmNzcjEyMTJfbmV3X2xlYWYodV9pbnQ4X3Qga2V5LCBjb25zdCB2b2lkICpkYXRhLAotCQkJCQkgICAgICAgc2l6ZV90IGRhdGFfbGVuKTsKLWV4dGVybiBzdHJ1Y3QgY3NyMTIxMl9rZXl2YWwgKmNzcjEyMTJfbmV3X2Nzcl9vZmZzZXQodV9pbnQ4X3Qga2V5LAotCQkJCQkJICAgICB1X2ludDMyX3QgY3NyX29mZnNldCk7Ci1leHRlcm4gc3RydWN0IGNzcjEyMTJfa2V5dmFsICpjc3IxMjEyX25ld19kaXJlY3RvcnkodV9pbnQ4X3Qga2V5KTsKLWV4dGVybiBzdHJ1Y3QgY3NyMTIxMl9rZXl2YWwgKmNzcjEyMTJfbmV3X2V4dGVuZGVkX2ltbWVkaWF0ZSh1X2ludDMyX3Qgc3BlYywKLQkJCQkJCQkgICAgIHVfaW50MzJfdCBrZXksCi0JCQkJCQkJICAgICB1X2ludDMyX3QgdmFsdWUpOwotZXh0ZXJuIHN0cnVjdCBjc3IxMjEyX2tleXZhbCAqY3NyMTIxMl9uZXdfZXh0ZW5kZWRfbGVhZih1X2ludDMyX3Qgc3BlYywKLQkJCQkJCQl1X2ludDMyX3Qga2V5LAotCQkJCQkJCWNvbnN0IHZvaWQgKmRhdGEsCi0JCQkJCQkJc2l6ZV90IGRhdGFfbGVuKTsKLWV4dGVybiBzdHJ1Y3QgY3NyMTIxMl9rZXl2YWwgKmNzcjEyMTJfbmV3X2Rlc2NyaXB0b3JfbGVhZih1X2ludDhfdCBkdHlwZSwKLQkJCQkJCQkgIHVfaW50MzJfdCBzcGVjaWZpZXJfaWQsCi0JCQkJCQkJICBjb25zdCB2b2lkICpkYXRhLAotCQkJCQkJCSAgc2l6ZV90IGRhdGFfbGVuKTsKLWV4dGVybiBzdHJ1Y3QgY3NyMTIxMl9rZXl2YWwgKmNzcjEyMTJfbmV3X3RleHR1YWxfZGVzY3JpcHRvcl9sZWFmKHVfaW50OF90IGN3aWR0aCwKLQkJCQkJCQkJICB1X2ludDE2X3QgY3NldCwKLQkJCQkJCQkJICB1X2ludDE2X3QgbGFuZ3VhZ2UsCi0JCQkJCQkJCSAgY29uc3Qgdm9pZCAqZGF0YSwKLQkJCQkJCQkJICBzaXplX3QgZGF0YV9sZW4pOworZXh0ZXJuIHN0cnVjdCBjc3IxMjEyX2tleXZhbCAqY3NyMTIxMl9uZXdfaW1tZWRpYXRlKHU4IGtleSwgdTMyIHZhbHVlKTsKK2V4dGVybiBzdHJ1Y3QgY3NyMTIxMl9rZXl2YWwgKmNzcjEyMTJfbmV3X2RpcmVjdG9yeSh1OCBrZXkpOwogZXh0ZXJuIHN0cnVjdCBjc3IxMjEyX2tleXZhbCAqY3NyMTIxMl9uZXdfc3RyaW5nX2Rlc2NyaXB0b3JfbGVhZihjb25zdCBjaGFyICpzKTsKLWV4dGVybiBzdHJ1Y3QgY3NyMTIxMl9rZXl2YWwgKmNzcjEyMTJfbmV3X2ljb25fZGVzY3JpcHRvcl9sZWFmKHVfaW50MzJfdCB2ZXJzaW9uLAotCQkJCQkJCSAgICAgICB1X2ludDhfdCBwYWxldHRlX2RlcHRoLAotCQkJCQkJCSAgICAgICB1X2ludDhfdCBjb2xvcl9zcGFjZSwKLQkJCQkJCQkgICAgICAgdV9pbnQxNl90IGxhbmd1YWdlLAotCQkJCQkJCSAgICAgICB1X2ludDE2X3QgaHNjYW4sCi0JCQkJCQkJICAgICAgIHVfaW50MTZfdCB2c2NhbiwKLQkJCQkJCQkgICAgICAgdV9pbnQzMl90ICpwYWxldHRlLAotCQkJCQkJCSAgICAgICB1X2ludDMyX3QgKnBpeGVscyk7Ci1leHRlcm4gc3RydWN0IGNzcjEyMTJfa2V5dmFsICpjc3IxMjEyX25ld19tb2RpZmlhYmxlX2Rlc2NyaXB0b3JfbGVhZih1X2ludDE2X3QgbWF4X3NpemUsCi0JCQkJCQkJCSAgICAgdV9pbnQ2NF90IGFkZHJlc3MpOwotZXh0ZXJuIHN0cnVjdCBjc3IxMjEyX2tleXZhbCAqY3NyMTIxMl9uZXdfa2V5d29yZF9sZWFmKGludCBzdHJjLAotCQkJCQkJICAgICAgIGNvbnN0IGNoYXIgKnN0cnZbXSk7CiAKIAotLyogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgbWFuYWdlIGFzc29jaWF0aW9uIGJldHdlZW4ga2V5dmFscy4gIFR5cGljYWxseSwKKy8qIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gbWFuYWdlcyBhc3NvY2lhdGlvbiBiZXR3ZWVuIGtleXZhbHMuICBUeXBpY2FsbHksCiAgKiBEZXNjcmlwdG9yIExlYXZlcyBhbmQgRGlyZWN0b3JpZXMgd2lsbCBiZSBhc3NvY2lhdGVkIHdpdGggYW5vdGhlciBrZXl2YWwgYW5kCiAgKiBpdCBpcyBkZXNpcmFibGUgZm9yIHRoZSBEZXNjcmlwdG9yIGtleXZhbCB0byBiZSBwbGFjZSBpbW1lZGlhdGVseSBhZnRlciB0aGUKLSAqIGtleXZhbCB0aGF0IGl0IGlzIGFzc29jaWF0ZWQgd2l0aC4qLwotZXh0ZXJuIGludCBjc3IxMjEyX2Fzc29jaWF0ZV9rZXl2YWwoc3RydWN0IGNzcjEyMTJfa2V5dmFsICprdiwKLQkJCQkgICAgc3RydWN0IGNzcjEyMTJfa2V5dmFsICphc3NvY2lhdGUpOwotZXh0ZXJuIHZvaWQgY3NyMTIxMl9kaXNhc3NvY2lhdGVfa2V5dmFsKHN0cnVjdCBjc3IxMjEyX2tleXZhbCAqa3YpOworICoga2V5dmFsIHRoYXQgaXQgaXMgYXNzb2NpYXRlZCB3aXRoLgorICogVGFrZSBjYXJlIHdpdGggc3Vic2VxdWVudCBST00gbW9kaWZpY2F0aW9uczogIFRoZXJlIGlzIG5vIGZ1bmN0aW9uIHRvIHJlbW92ZQorICogcHJldmlvdXNseSBzcGVjaWZpZWQgYXNzb2NpYXRpb25zLgorICovCitleHRlcm4gdm9pZCBjc3IxMjEyX2Fzc29jaWF0ZV9rZXl2YWwoc3RydWN0IGNzcjEyMTJfa2V5dmFsICprdiwKKwkJCQkgICAgIHN0cnVjdCBjc3IxMjEyX2tleXZhbCAqYXNzb2NpYXRlKTsKIAogCiAvKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBtYW5hZ2UgdGhlIGFzc29jaWF0aW9uIG9mIGEga2V5dmFsIGFuZCBkaXJlY3Rvcmllcy4KQEAgLTYwOSwyMyArMjk2LDE1IEBACiAJCQkJCQkgc3RydWN0IGNzcjEyMTJfa2V5dmFsICprdik7CiAKIAotLyogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgY3JlYXRlIGEgQ29uZmlndXJhdGlvbiBST00gaW1hZ2UgZnJvbSB0aGUgdHJlZSBvZgotICoga2V5dmFscyBwcm92aWRlZC4gIGNzcjEyMTJfZ2VuZXJhdGVfY3NyX2ltYWdlKCkgY3JlYXRlcyBhIGNvbXBsZXRlIGltYWdlIGluCi0gKiB0aGUgbGlzdCBvZiBjYWNoZXMgYXZhaWxhYmxlIHZpYSBjc3ItPmNhY2hlX2hlYWQuICBUaGUgb3RoZXIgZnVuY3Rpb25zIGFyZQotICogcHJvdmlkZWQgc2hvdWxkIHRoZXJlIGJlIGEgbmVlZCB0byBjcmVhdGUgYSBmbGF0IGltYWdlIHdpdGhvdXQgcmVzdHJpY3Rpb25zCi0gKiBwbGFjZWQgYnkgSUVFRSAxMjEyLiAqLwotZXh0ZXJuIHN0cnVjdCBjc3IxMjEyX2tleXZhbCAqY3NyMTIxMl9nZW5lcmF0ZV9wb3NpdGlvbnMoc3RydWN0IGNzcjEyMTJfY3NyX3JvbV9jYWNoZSAqY2FjaGUsCi0JCQkJCQkJIHN0cnVjdCBjc3IxMjEyX2tleXZhbCAqc3RhcnRfa3YsCi0JCQkJCQkJIGludCBzdGFydF9wb3MpOwotZXh0ZXJuIHNpemVfdCBjc3IxMjEyX2dlbmVyYXRlX2xheW91dF9vcmRlcihzdHJ1Y3QgY3NyMTIxMl9rZXl2YWwgKmt2KTsKLWV4dGVybiB2b2lkIGNzcjEyMTJfZmlsbF9jYWNoZShzdHJ1Y3QgY3NyMTIxMl9jc3Jfcm9tX2NhY2hlICpjYWNoZSk7CisvKiBDcmVhdGVzIGEgY29tcGxldGUgQ29uZmlndXJhdGlvbiBST00gaW1hZ2UgaW4gdGhlIGxpc3Qgb2YgY2FjaGVzIGF2YWlsYWJsZQorICogdmlhIGNzci0+Y2FjaGVfaGVhZC4gKi8KIGV4dGVybiBpbnQgY3NyMTIxMl9nZW5lcmF0ZV9jc3JfaW1hZ2Uoc3RydWN0IGNzcjEyMTJfY3NyICpjc3IpOwogCiAKIC8qIFRoaXMgaXMgYSBjb252aWVuY2UgZnVuY3Rpb24gZm9yIHJlYWRpbmcgYSBibG9jayBvZiBkYXRhIG91dCBvZiBvbmUgb2YgdGhlCiAgKiBjYWNoZXMgaW4gdGhlIGNzci0+Y2FjaGVfaGVhZCBsaXN0LiAqLwotZXh0ZXJuIGludCBjc3IxMjEyX3JlYWQoc3RydWN0IGNzcjEyMTJfY3NyICpjc3IsIHVfaW50MzJfdCBvZmZzZXQsIHZvaWQgKmJ1ZmZlciwKLQkJCXVfaW50MzJfdCBsZW4pOworZXh0ZXJuIGludCBjc3IxMjEyX3JlYWQoc3RydWN0IGNzcjEyMTJfY3NyICpjc3IsIHUzMiBvZmZzZXQsIHZvaWQgKmJ1ZmZlciwKKwkJCXUzMiBsZW4pOwogCiAKIC8qIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBpbiBwbGFjZSBmb3IgcGFyc2luZyBDb25maWd1cmF0aW9uIFJPTSBpbWFnZXMuCkBAIC02MzUsMTUgKzMxNCwxMSBAQAogCQkJCXN0cnVjdCBjc3IxMjEyX2Nzcl9yb21fY2FjaGUgKmNhY2hlKTsKIGV4dGVybiBpbnQgY3NyMTIxMl9wYXJzZV9jc3Ioc3RydWN0IGNzcjEyMTJfY3NyICpjc3IpOwogCi0vKiBUaGVzZSBhcmUgaW50ZXJuYWwgZnVuY3Rpb25zIHJlZmVyZW5jZWQgYnkgaW5saW5lIGZ1bmN0aW9ucyBiZWxvdy4gKi8KLWV4dGVybiBpbnQgX2NzcjEyMTJfcmVhZF9rZXl2YWwoc3RydWN0IGNzcjEyMTJfY3NyICpjc3IsIHN0cnVjdCBjc3IxMjEyX2tleXZhbCAqa3YpOwotZXh0ZXJuIHZvaWQgX2NzcjEyMTJfZGVzdHJveV9rZXl2YWwoc3RydWN0IGNzcjEyMTJfa2V5dmFsICprdik7Ci0KIAogLyogVGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMgYSBuZXcgY2FjaGUgd2hpY2ggbWF5IGJlIHVzZWQgZm9yIGVpdGhlciBwYXJzaW5nIG9yCiAgKiBnZW5lcmF0aW5nIHN1Yi1zZXRzIG9mIENvbmZpZ3VyYXRpb24gUk9NIGltYWdlcy4gKi8KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGNzcjEyMTJfY3NyX3JvbV9jYWNoZSAqY3NyMTIxMl9yb21fY2FjaGVfbWFsbG9jKHVfaW50MzJfdCBvZmZzZXQsCi0JCQkJCQkJCSAgICAgc2l6ZV90IHNpemUpCitzdGF0aWMgaW5saW5lIHN0cnVjdCBjc3IxMjEyX2Nzcl9yb21fY2FjaGUgKgorY3NyMTIxMl9yb21fY2FjaGVfbWFsbG9jKHUzMiBvZmZzZXQsIHNpemVfdCBzaXplKQogewogCXN0cnVjdCBjc3IxMjEyX2Nzcl9yb21fY2FjaGUgKmNhY2hlOwogCkBAIC02NjcsMTYgKzM0Miw4IEBACiAKIC8qIFRoaXMgZnVuY3Rpb24gZW5zdXJlcyB0aGF0IGEga2V5dmFsIGNvbnRhaW5zIGRhdGEgd2hlbiByZWZlcmVuY2luZyBhIGtleXZhbAogICogY3JlYXRlZCBieSBwYXJzaW5nIGEgQ29uZmlndXJhdGlvbiBST00uICovCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBjc3IxMjEyX2tleXZhbCAqY3NyMTIxMl9nZXRfa2V5dmFsKHN0cnVjdCBjc3IxMjEyX2NzciAqY3NyLAotCQkJCQkJCXN0cnVjdCBjc3IxMjEyX2tleXZhbCAqa3YpCi17Ci0JaWYgKCFrdikKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFrdi0+dmFsaWQpCi0JCWlmIChfY3NyMTIxMl9yZWFkX2tleXZhbChjc3IsIGt2KSAhPSBDU1IxMjEyX1NVQ0NFU1MpCi0JCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4ga3Y7Ci19CitleHRlcm4gc3RydWN0IGNzcjEyMTJfa2V5dmFsICoKK2NzcjEyMTJfZ2V0X2tleXZhbChzdHJ1Y3QgY3NyMTIxMl9jc3IgKmNzciwgc3RydWN0IGNzcjEyMTJfa2V5dmFsICprdik7CiAKIAogLyogVGhpcyBmdW5jdGlvbiBpbmNyZW1lbnRzIHRoZSByZWZlcmVuY2UgY291bnQgZm9yIGEga2V5dmFsIHNob3VsZCB0aGVyZSBiZSBhCkBAIC02OTEsMzcgKzM1OCwyOSBAQAogICoga2V5dmFsIHdoZW4gdGhlcmUgYXJlIG5vIG1vcmUgdXNlcnMgb2YgdGhlIGtleXZhbC4gIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBieQogICogYW55IGNvZGUgdGhhdCBjYWxscyBjc3IxMjEyX2tlZXBfa2V5dmFsKCkgb3IgYW55IG9mIHRoZSBrZXl2YWwgY3JlYXRpb24KICAqIHJvdXRpbmVzIGNzcjEyMTJfbmV3XyooKS4gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBjc3IxMjEyX3JlbGVhc2Vfa2V5dmFsKHN0cnVjdCBjc3IxMjEyX2tleXZhbCAqa3YpCi17Ci0JaWYgKGt2LT5yZWZjbnQgPiAxKQotCQlrdi0+cmVmY250LS07Ci0JZWxzZQotCQlfY3NyMTIxMl9kZXN0cm95X2tleXZhbChrdik7Ci19CitleHRlcm4gdm9pZCBjc3IxMjEyX3JlbGVhc2Vfa2V5dmFsKHN0cnVjdCBjc3IxMjEyX2tleXZhbCAqa3YpOwogCiAKIC8qCiAgKiBUaGlzIG1hY3JvIGFsbG93cyBmb3IgbG9vcGluZyBvdmVyIHRoZSBrZXl2YWwgZW50cmllcyBpbiBhIGRpcmVjdG9yeSBhbmQgaXQKICAqIGVuc3VyZXMgdGhhdCBrZXl2YWxzIGZyb20gcmVtb3RlIENvbmZpZ1JPTXMgYXJlIHBhcnNlZCBwcm9wZXJseS4KICAqCi0gKiBfY3NyIGlzIGEgc3RydWN0IGNzcjEyMTJfY3NyICogdGhhdCBwb2ludHMgdG8gQ1NSIGFzc29jaWF0ZWQgd2l0aCBkaXIuCi0gKiBfa3YgaXMgYSBzdHJ1Y3QgY3NyMTIxMl9rZXl2YWwgKiB0aGF0J2xsIHBvaW50IHRvIHRoZSBjdXJyZW50IGtleXZhbCAobG9vcCBpbmRleCkuCi0gKiBfZGlyIGlzIGEgc3RydWN0IGNzcjEyMTJfa2V5dmFsICogdGhhdCBwb2ludHMgdG8gdGhlIGRpcmVjdG9yeSB0byBiZSBsb29wZWQuCi0gKiBfcG9zIGlzIGEgc3RydWN0IGNzcjEyMTJfZGVudHJ5ICogdGhhdCBpcyB1c2VkIGludGVybmFsbHkgZm9yIGluZGV4aW5nLgorICogc3RydWN0IGNzcjEyMTJfY3NyICpfY3NyIHBvaW50cyB0byB0aGUgQ1NSIGFzc29jaWF0ZWQgd2l0aCBkaXIuCisgKiBzdHJ1Y3QgY3NyMTIxMl9rZXl2YWwgKl9rdiBwb2ludHMgdG8gdGhlIGN1cnJlbnQga2V5dmFsIChsb29wIGluZGV4KS4KKyAqIHN0cnVjdCBjc3IxMjEyX2tleXZhbCAqX2RpciBwb2ludHMgdG8gdGhlIGRpcmVjdG9yeSB0byBiZSBsb29wZWQuCisgKiBzdHJ1Y3QgY3NyMTIxMl9kZW50cnkgKl9wb3MgaXMgdXNlZCBpbnRlcm5hbGx5IGZvciBpbmRleGluZy4KICAqCiAgKiBrdiB3aWxsIGJlIE5VTEwgdXBvbiBleGl0IG9mIHRoZSBsb29wLgogICovCi0jZGVmaW5lIGNzcjEyMTJfZm9yX2VhY2hfZGlyX2VudHJ5KF9jc3IsIF9rdiwgX2RpciwgX3BvcykJCQlcCi0JZm9yIChjc3IxMjEyX2dldF9rZXl2YWwoKF9jc3IpLCAoX2RpcikpLAkJCQlcCi0JICAgICBfcG9zID0gKF9kaXIpLT52YWx1ZS5kaXJlY3RvcnkuZGVudHJpZXNfaGVhZCwJCQlcCi0JICAgICBfa3YgPSAoX3BvcykgPyBjc3IxMjEyX2dldF9rZXl2YWwoKF9jc3IpLCBfcG9zLT5rdikgOiBOVUxMOwlcCi0JICAgICAoX2t2KSAmJiAoX3Bvcyk7CQkJCQkJCVwKLQkgICAgIChfa3YtPmFzc29jaWF0ZSA9PSBOVUxMKSA/CQkJCQkJXAotCQkgICAgICgoX3BvcyA9IF9wb3MtPm5leHQpLCAJCQkJCVwKLQkJICAgICAgKF9rdiA9IChfcG9zKSA/IGNzcjEyMTJfZ2V0X2tleXZhbCgoX2NzciksIF9wb3MtPmt2KSA6CVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpIDoJCQkJCQlcCisjZGVmaW5lIGNzcjEyMTJfZm9yX2VhY2hfZGlyX2VudHJ5KF9jc3IsIF9rdiwgX2RpciwgX3BvcykJCVwKKwlmb3IgKGNzcjEyMTJfZ2V0X2tleXZhbCgoX2NzciksIChfZGlyKSksCQkJXAorCSAgICAgX3BvcyA9IChfZGlyKS0+dmFsdWUuZGlyZWN0b3J5LmRlbnRyaWVzX2hlYWQsCQlcCisJICAgICBfa3YgPSAoX3BvcykgPyBjc3IxMjEyX2dldF9rZXl2YWwoKF9jc3IpLCBfcG9zLT5rdikgOiBOVUxMO1wKKwkgICAgIChfa3YpICYmIChfcG9zKTsJCQkJCQlcCisJICAgICAoX2t2LT5hc3NvY2lhdGUgPT0gTlVMTCkgPwkJCQkJXAorCQkgICAgICgoX3BvcyA9IF9wb3MtPm5leHQpLCAoX2t2ID0gKF9wb3MpID8JCVwKKwkJCQljc3IxMjEyX2dldF9rZXl2YWwoKF9jc3IpLCBfcG9zLT5rdikgOglcCisJCQkJTlVMTCkpIDoJCQkJXAogCQkgICAgIChfa3YgPSBjc3IxMjEyX2dldF9rZXl2YWwoKF9jc3IpLCBfa3YtPmFzc29jaWF0ZSkpKQogCi0KLQogI2VuZGlmIC8qIF9fQ1NSMTIxMl9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvZG1hLmMgYi9kcml2ZXJzL2llZWUxMzk0L2RtYS5jCmluZGV4IGM2OGYzMjguLjQ1ZDYwNTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWVlZTEzOTQvZG1hLmMKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9kbWEuYwpAQCAtNjIsNiArNjIsOSBAQAogCiAvKiBkbWFfcmVnaW9uICovCiAKKy8qKgorICogZG1hX3JlZ2lvbl9pbml0IC0gY2xlYXIgb3V0IGFsbCBmaWVsZHMgYnV0IGRvIG5vdCBhbGxvY2F0ZSBhbnl0aGluZworICovCiB2b2lkIGRtYV9yZWdpb25faW5pdChzdHJ1Y3QgZG1hX3JlZ2lvbiAqZG1hKQogewogCWRtYS0+a3ZpcnQgPSBOVUxMOwpAQCAtNzEsNiArNzQsOSBAQAogCWRtYS0+c2dsaXN0ID0gTlVMTDsKIH0KIAorLyoqCisgKiBkbWFfcmVnaW9uX2FsbG9jIC0gYWxsb2NhdGUgdGhlIGJ1ZmZlciBhbmQgbWFwIGl0IHRvIHRoZSBJT01NVQorICovCiBpbnQgZG1hX3JlZ2lvbl9hbGxvYyhzdHJ1Y3QgZG1hX3JlZ2lvbiAqZG1hLCB1bnNpZ25lZCBsb25nIG5fYnl0ZXMsCiAJCSAgICAgc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IGRpcmVjdGlvbikKIHsKQEAgLTEyOCw2ICsxMzQsOSBAQAogCXJldHVybiAtRU5PTUVNOwogfQogCisvKioKKyAqIGRtYV9yZWdpb25fZnJlZSAtIHVubWFwIGFuZCBmcmVlIHRoZSBidWZmZXIKKyAqLwogdm9pZCBkbWFfcmVnaW9uX2ZyZWUoc3RydWN0IGRtYV9yZWdpb24gKmRtYSkKIHsKIAlpZiAoZG1hLT5uX2RtYV9wYWdlcykgewpAQCAtMTY3LDYgKzE3NiwxMiBAQAogCXJldHVybiBpOwogfQogCisvKioKKyAqIGRtYV9yZWdpb25fb2Zmc2V0X3RvX2J1cyAtIGdldCBidXMgYWRkcmVzcyBvZiBhbiBvZmZzZXQgd2l0aGluIGEgRE1BIHJlZ2lvbgorICoKKyAqIFJldHVybnMgdGhlIERNQSBidXMgYWRkcmVzcyBvZiB0aGUgYnl0ZSB3aXRoIHRoZSBnaXZlbiBAb2Zmc2V0IHJlbGF0aXZlIHRvCisgKiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBAZG1hLgorICovCiBkbWFfYWRkcl90IGRtYV9yZWdpb25fb2Zmc2V0X3RvX2J1cyhzdHJ1Y3QgZG1hX3JlZ2lvbiAqIGRtYSwKIAkJCQkgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQpCiB7CkBAIC0xNzcsNiArMTkyLDkgQEAKIAlyZXR1cm4gc2dfZG1hX2FkZHJlc3Moc2cpICsgcmVtOwogfQogCisvKioKKyAqIGRtYV9yZWdpb25fc3luY19mb3JfY3B1IC0gc3luYyB0aGUgQ1BVJ3MgdmlldyBvZiB0aGUgYnVmZmVyCisgKi8KIHZvaWQgZG1hX3JlZ2lvbl9zeW5jX2Zvcl9jcHUoc3RydWN0IGRtYV9yZWdpb24gKmRtYSwgdW5zaWduZWQgbG9uZyBvZmZzZXQsCiAJCQkgICAgIHVuc2lnbmVkIGxvbmcgbGVuKQogewpAQCAtMTkzLDYgKzIxMSw5IEBACiAJCQkJZG1hLT5kaXJlY3Rpb24pOwogfQogCisvKioKKyAqIGRtYV9yZWdpb25fc3luY19mb3JfZGV2aWNlIC0gc3luYyB0aGUgSU8gYnVzJyB2aWV3IG9mIHRoZSBidWZmZXIKKyAqLwogdm9pZCBkbWFfcmVnaW9uX3N5bmNfZm9yX2RldmljZShzdHJ1Y3QgZG1hX3JlZ2lvbiAqZG1hLCB1bnNpZ25lZCBsb25nIG9mZnNldCwKIAkJCQl1bnNpZ25lZCBsb25nIGxlbikKIHsKQEAgLTI0NCw2ICsyNjUsOSBAQAogCS5ub3BhZ2UgPSBkbWFfcmVnaW9uX3BhZ2VmYXVsdCwKIH07CiAKKy8qKgorICogZG1hX3JlZ2lvbl9tbWFwIC0gbWFwIHRoZSBidWZmZXIgaW50byBhIHVzZXIgc3BhY2UgcHJvY2VzcworICovCiBpbnQgZG1hX3JlZ2lvbl9tbWFwKHN0cnVjdCBkbWFfcmVnaW9uICpkbWEsIHN0cnVjdCBmaWxlICpmaWxlLAogCQkgICAgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L2RtYS5oIGIvZHJpdmVycy9pZWVlMTM5NC9kbWEuaAppbmRleCBhMTY4MmFiLi4yNzI3YmNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWUxMzk0L2RtYS5oCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvZG1hLmgKQEAgLTY2LDM1ICs2NiwyMyBAQAogCWludCBkaXJlY3Rpb247CiB9OwogCi0vKiBjbGVhciBvdXQgYWxsIGZpZWxkcyBidXQgZG8gbm90IGFsbG9jYXRlIGFueXRoaW5nICovCiB2b2lkIGRtYV9yZWdpb25faW5pdChzdHJ1Y3QgZG1hX3JlZ2lvbiAqZG1hKTsKLQotLyogYWxsb2NhdGUgdGhlIGJ1ZmZlciBhbmQgbWFwIGl0IHRvIHRoZSBJT01NVSAqLwogaW50IGRtYV9yZWdpb25fYWxsb2Moc3RydWN0IGRtYV9yZWdpb24gKmRtYSwgdW5zaWduZWQgbG9uZyBuX2J5dGVzLAogCQkgICAgIHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBkaXJlY3Rpb24pOwotCi0vKiB1bm1hcCBhbmQgZnJlZSB0aGUgYnVmZmVyICovCiB2b2lkIGRtYV9yZWdpb25fZnJlZShzdHJ1Y3QgZG1hX3JlZ2lvbiAqZG1hKTsKLQotLyogc3luYyB0aGUgQ1BVJ3MgdmlldyBvZiB0aGUgYnVmZmVyICovCiB2b2lkIGRtYV9yZWdpb25fc3luY19mb3JfY3B1KHN0cnVjdCBkbWFfcmVnaW9uICpkbWEsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAogCQkJICAgICB1bnNpZ25lZCBsb25nIGxlbik7Ci0KLS8qIHN5bmMgdGhlIElPIGJ1cycgdmlldyBvZiB0aGUgYnVmZmVyICovCiB2b2lkIGRtYV9yZWdpb25fc3luY19mb3JfZGV2aWNlKHN0cnVjdCBkbWFfcmVnaW9uICpkbWEsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAogCQkJCXVuc2lnbmVkIGxvbmcgbGVuKTsKLQotLyogbWFwIHRoZSBidWZmZXIgaW50byBhIHVzZXIgc3BhY2UgcHJvY2VzcyAqLwogaW50ICBkbWFfcmVnaW9uX21tYXAoc3RydWN0IGRtYV9yZWdpb24gKmRtYSwgc3RydWN0IGZpbGUgKmZpbGUsCiAJCSAgICAgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpOwotCi0vKiBtYWNybyB0byBpbmRleCBpbnRvIGEgRE1BIHJlZ2lvbiAob3IgZG1hX3Byb2dfcmVnaW9uKSAqLwotI2RlZmluZSBkbWFfcmVnaW9uX2koX2RtYSwgX3R5cGUsIF9pbmRleCkgXAotCSggKChfdHlwZSopICgoX2RtYSktPmt2aXJ0KSkgKyAoX2luZGV4KSApCi0KLS8qIHJldHVybiB0aGUgRE1BIGJ1cyBhZGRyZXNzIG9mIHRoZSBieXRlIHdpdGggdGhlIGdpdmVuIG9mZnNldAotICogcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgZG1hX3JlZ2lvbiAqLwogZG1hX2FkZHJfdCBkbWFfcmVnaW9uX29mZnNldF90b19idXMoc3RydWN0IGRtYV9yZWdpb24gKmRtYSwKIAkJCQkgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQpOwogCisvKioKKyAqIGRtYV9yZWdpb25faSAtIG1hY3JvIHRvIGluZGV4IGludG8gYSBETUEgcmVnaW9uIChvciBkbWFfcHJvZ19yZWdpb24pCisgKi8KKyNkZWZpbmUgZG1hX3JlZ2lvbl9pKF9kbWEsIF90eXBlLCBfaW5kZXgpIFwKKwkoICgoX3R5cGUqKSAoKF9kbWEpLT5rdmlydCkpICsgKF9pbmRleCkgKQorCiAjZW5kaWYgLyogSUVFRTEzOTRfRE1BX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvZXRoMTM5NC5jIGIvZHJpdmVycy9pZWVlMTM5NC9ldGgxMzk0LmMKaW5kZXggMDNlNDRiMy4uMjI5NmQ0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZWVlMTM5NC9ldGgxMzk0LmMKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9ldGgxMzk0LmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogZXRoMTM5NC5jIC0tIEV0aGVybmV0IGRyaXZlciBmb3IgTGludXggSUVFRS0xMzk0IFN1YnN5c3RlbQorICogZXRoMTM5NC5jIC0tIElQdjQgZHJpdmVyIGZvciBMaW51eCBJRUVFLTEzOTQgU3Vic3lzdGVtCiAgKgogICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDMgQmVuIENvbGxpbnMgPGJjb2xsaW5zQGRlYmlhbi5vcmc+CiAgKiAgICAgICAgICAgICAgIDIwMDAgQm9uaW4gRnJhbmNrIDxib25pbmZAZnJlZS5mcj4KQEAgLTIyLDEwICsyMiw5IEBACiAgKiBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgogICovCiAKLS8qIFRoaXMgZHJpdmVyIGludGVuZHMgdG8gc3VwcG9ydCBSRkMgMjczNCwgd2hpY2ggZGVzY3JpYmVzIGEgbWV0aG9kIGZvcgotICogdHJhbnNwb3J0aW5nIElQdjQgZGF0YWdyYW1zIG92ZXIgSUVFRS0xMzk0IHNlcmlhbCBidXNzZXMuIFRoaXMgZHJpdmVyCi0gKiB3aWxsIHVsdGltYXRlbHkgc3VwcG9ydCB0aGF0IG1ldGhvZCwgYnV0IGN1cnJlbnRseSBmYWxscyBzaG9ydCBpbgotICogc2V2ZXJhbCBhcmVhcy4KKy8qCisgKiBUaGlzIGRyaXZlciBpbnRlbmRzIHRvIHN1cHBvcnQgUkZDIDI3MzQsIHdoaWNoIGRlc2NyaWJlcyBhIG1ldGhvZCBmb3IKKyAqIHRyYW5zcG9ydGluZyBJUHY0IGRhdGFncmFtcyBvdmVyIElFRUUtMTM5NCBzZXJpYWwgYnVzc2VzLgogICoKICAqIFRPRE86CiAgKiBSRkMgMjczNCByZWxhdGVkOgpAQCAtNDAsNyArMzksNiBAQAogICogLSBDb25zaWRlciBnYXJiYWdlIGNvbGxlY3Rpbmcgb2xkIHBhcnRpYWwgZGF0YWdyYW1zIGFmdGVyIFggYW1vdW50IG9mIHRpbWUKICAqLwogCi0KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpAQCAtNTIsNyArNTAsNiBAQAogCiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5ldGRldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KICNpbmNsdWRlIDxsaW51eC9pcC5oPgpAQCAtODQsMTAgKzgxLDYgQEAKICNkZWZpbmUgRVRIMTM5NF9QUklOVChsZXZlbCwgZGV2X25hbWUsIGZtdCwgYXJncy4uLikgXAogCXByaW50ayhsZXZlbCAiJXM6ICVzOiAiIGZtdCwgZHJpdmVyX25hbWUsIGRldl9uYW1lLCAjIyBhcmdzKQogCi0jZGVmaW5lIERFQlVHKGZtdCwgYXJncy4uLikgXAotCXByaW50ayhLRVJOX0VSUiAiJXM6JXNbJWRdOiAiIGZtdCAiXG4iLCBkcml2ZXJfbmFtZSwgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgIyMgYXJncykKLSNkZWZpbmUgVFJBQ0UoKSBwcmludGsoS0VSTl9FUlIgIiVzOiVzWyVkXSAtLS0tIFRSQUNFXG4iLCBkcml2ZXJfbmFtZSwgX19GVU5DVElPTl9fLCBfX0xJTkVfXykKLQogc3RydWN0IGZyYWdtZW50X2luZm8gewogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIAlpbnQgb2Zmc2V0OwpAQCAtMTA1LDkgKzk4LDkgQEAKIH07CiAKIHN0cnVjdCBwZGdfbGlzdCB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwkJLyogcGFydGlhbCBkYXRhZ3JhbSBsaXN0IHBlciBub2RlCSovCi0JdW5zaWduZWQgaW50IHN6OwkJLyogcGFydGlhbCBkYXRhZ3JhbSBsaXN0IHNpemUgcGVyIG5vZGUJKi8KLQlzcGlubG9ja190IGxvY2s7CQkvKiBwYXJ0aWFsIGRhdGFncmFtIGxvY2sJCSovCisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwkvKiBwYXJ0aWFsIGRhdGFncmFtIGxpc3QgcGVyIG5vZGUJKi8KKwl1bnNpZ25lZCBpbnQgc3o7CS8qIHBhcnRpYWwgZGF0YWdyYW0gbGlzdCBzaXplIHBlciBub2RlCSovCisJc3BpbmxvY2tfdCBsb2NrOwkvKiBwYXJ0aWFsIGRhdGFncmFtIGxvY2sJCSovCiB9OwogCiBzdHJ1Y3QgZXRoMTM5NF9ob3N0X2luZm8gewpAQCAtMTIxLDE2ICsxMTQsMTQgQEAKIH07CiAKIHN0cnVjdCBldGgxMzk0X25vZGVfaW5mbyB7Ci0JdTE2IG1heHBheWxvYWQ7CQkJLyogTWF4IHBheWxvYWQJCQkqLwotCXU4IHNzcGQ7CQkJLyogTWF4IHNwZWVkCQkJKi8KLQl1NjQgZmlmbzsJCQkvKiBGSUZPIGFkZHJlc3MJCQkqLwotCXN0cnVjdCBwZGdfbGlzdCBwZGc7CQkvKiBwYXJ0aWFsIFJYIGRhdGFncmFtIGxpc3RzCSovCi0JaW50IGRnbDsJCQkvKiBPdXRnb2luZyBkYXRhZ3JhbSBsYWJlbAkqLworCXUxNiBtYXhwYXlsb2FkOwkJLyogbWF4IHBheWxvYWQJCQkqLworCXU4IHNzcGQ7CQkvKiBtYXggc3BlZWQJCQkqLworCXU2NCBmaWZvOwkJLyogRklGTyBhZGRyZXNzCQkJKi8KKwlzdHJ1Y3QgcGRnX2xpc3QgcGRnOwkvKiBwYXJ0aWFsIFJYIGRhdGFncmFtIGxpc3RzCSovCisJaW50IGRnbDsJCS8qIG91dGdvaW5nIGRhdGFncmFtIGxhYmVsCSovCiB9OwogCi0vKiBPdXIgaWVlZTEzOTQgaGlnaGxldmVsIGRyaXZlciAqLwotI2RlZmluZSBFVEgxMzk0X0RSSVZFUl9OQU1FICJldGgxMzk0Igotc3RhdGljIGNvbnN0IGNoYXIgZHJpdmVyX25hbWVbXSA9IEVUSDEzOTRfRFJJVkVSX05BTUU7CitzdGF0aWMgY29uc3QgY2hhciBkcml2ZXJfbmFtZVtdID0gImV0aDEzOTQiOwogCiBzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKnBhY2tldF90YXNrX2NhY2hlOwogCkBAIC0xMzgsMTggKzEyOSwxMiBAQAogCiAvKiBVc2UgY29tbW9uLmxmIHRvIGRldGVybWluZSBoZWFkZXIgbGVuICovCiBzdGF0aWMgY29uc3QgaW50IGhkcl90eXBlX2xlbltdID0gewotCXNpemVvZiAoc3RydWN0IGV0aDEzOTRfdWZfaGRyKSwKLQlzaXplb2YgKHN0cnVjdCBldGgxMzk0X2ZmX2hkciksCi0Jc2l6ZW9mIChzdHJ1Y3QgZXRoMTM5NF9zZl9oZHIpLAotCXNpemVvZiAoc3RydWN0IGV0aDEzOTRfc2ZfaGRyKQorCXNpemVvZihzdHJ1Y3QgZXRoMTM5NF91Zl9oZHIpLAorCXNpemVvZihzdHJ1Y3QgZXRoMTM5NF9mZl9oZHIpLAorCXNpemVvZihzdHJ1Y3QgZXRoMTM5NF9zZl9oZHIpLAorCXNpemVvZihzdHJ1Y3QgZXRoMTM5NF9zZl9oZHIpCiB9OwogCi0vKiBDaGFuZ2UgdGhpcyB0byBJRUVFMTM5NF9TUEVFRF9TMTAwIHRvIG1ha2UgdGVzdGluZyBlYXNpZXIgKi8KLSNkZWZpbmUgRVRIMTM5NF9TUEVFRF9ERUYJSUVFRTEzOTRfU1BFRURfTUFYCi0KLS8qIEZvciBub3csIHRoaXMgbmVlZHMgdG8gYmUgMTUwMCwgc28gdGhhdCBYUCB3b3JrcyB3aXRoIHVzICovCi0jZGVmaW5lIEVUSDEzOTRfREFUQV9MRU4JRVRIX0RBVEFfTEVOCi0KIHN0YXRpYyBjb25zdCB1MTYgZXRoMTM5NF9zcGVlZHRvX21heHBheWxvYWRbXSA9IHsKIC8qICAgICBTMTAwLCBTMjAwLCBTNDAwLCBTODAwLCBTMTYwMCwgUzMyMDAgKi8KIAk1MTIsIDEwMjQsIDIwNDgsIDQwOTYsICA0MDk2LCAgNDA5NgpAQCAtMTU5LDcgKzE0NCw4IEBACiBNT0RVTEVfREVTQ1JJUFRJT04oIklFRUUgMTM5NCBJUHY0IERyaXZlciAoSVB2NC1vdmVyLTEzOTQgYXMgcGVyIFJGQyAyNzM0KSIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCi0vKiBUaGUgbWF4X3BhcnRpYWxfZGF0YWdyYW1zIHBhcmFtZXRlciBpcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgZnJhZ21lbnRlZAorLyoKKyAqIFRoZSBtYXhfcGFydGlhbF9kYXRhZ3JhbXMgcGFyYW1ldGVyIGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBmcmFnbWVudGVkCiAgKiBkYXRhZ3JhbXMgcGVyIG5vZGUgdGhhdCBldGgxMzk0IHdpbGwga2VlcCBpbiBtZW1vcnkuICBQcm92aWRpbmcgYW4gdXBwZXIKICAqIGJvdW5kIGFsbG93cyB1cyB0byBsaW1pdCB0aGUgYW1vdW50IG9mIG1lbW9yeSB0aGF0IHBhcnRpYWwgZGF0YWdyYW1zCiAgKiBjb25zdW1lIGluIHRoZSBldmVudCB0aGF0IHNvbWUgcGFydGlhbCBkYXRhZ3JhbXMgYXJlIG5ldmVyIGNvbXBsZXRlZC4KQEAgLTE3OSwxMCArMTY1LDcgQEAKIHN0YXRpYyBpbnQgZXRoZXIxMzk0X2hlYWRlcl9jYWNoZShzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaCwgc3RydWN0IGhoX2NhY2hlICpoaCk7CiBzdGF0aWMgdm9pZCBldGhlcjEzOTRfaGVhZGVyX2NhY2hlX3VwZGF0ZShzdHJ1Y3QgaGhfY2FjaGUgKmhoLAogCQkJCQkgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJCSAgdW5zaWduZWQgY2hhciAqIGhhZGRyKTsKLXN0YXRpYyBpbnQgZXRoZXIxMzk0X21hY19hZGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKnApOwotCi1zdGF0aWMgdm9pZCBwdXJnZV9wYXJ0aWFsX2RhdGFncmFtKHN0cnVjdCBsaXN0X2hlYWQgKm9sZCk7CisJCQkJCSAgdW5zaWduZWQgY2hhciAqaGFkZHIpOwogc3RhdGljIGludCBldGhlcjEzOTRfdHgoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBzdGF0aWMgdm9pZCBldGhlcjEzOTRfaXNvKHN0cnVjdCBocHNiX2lzbyAqaXNvKTsKIApAQCAtMTkwLDkgKzE3Myw5IEBACiAKIHN0YXRpYyBpbnQgZXRoZXIxMzk0X3dyaXRlKHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsIGludCBzcmNpZCwgaW50IGRlc3RpZCwKIAkJCSAgIHF1YWRsZXRfdCAqZGF0YSwgdTY0IGFkZHIsIHNpemVfdCBsZW4sIHUxNiBmbGFncyk7Ci1zdGF0aWMgdm9pZCBldGhlcjEzOTRfYWRkX2hvc3QgKHN0cnVjdCBocHNiX2hvc3QgKmhvc3QpOwotc3RhdGljIHZvaWQgZXRoZXIxMzk0X3JlbW92ZV9ob3N0IChzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0KTsKLXN0YXRpYyB2b2lkIGV0aGVyMTM5NF9ob3N0X3Jlc2V0IChzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0KTsKK3N0YXRpYyB2b2lkIGV0aGVyMTM5NF9hZGRfaG9zdChzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0KTsKK3N0YXRpYyB2b2lkIGV0aGVyMTM5NF9yZW1vdmVfaG9zdChzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0KTsKK3N0YXRpYyB2b2lkIGV0aGVyMTM5NF9ob3N0X3Jlc2V0KHN0cnVjdCBocHNiX2hvc3QgKmhvc3QpOwogCiAvKiBGdW5jdGlvbiBmb3IgaW5jb21pbmcgMTM5NCBwYWNrZXRzICovCiBzdGF0aWMgc3RydWN0IGhwc2JfYWRkcmVzc19vcHMgYWRkcl9vcHMgPSB7CkBAIC0yMDcsODkgKzE5MCwxMDcgQEAKIAkuaG9zdF9yZXNldCA9CWV0aGVyMTM5NF9ob3N0X3Jlc2V0LAogfTsKIAotCi0vKiBUaGlzIGlzIGNhbGxlZCBhZnRlciBhbiAiaWZ1cCIgKi8KLXN0YXRpYyBpbnQgZXRoZXIxMzk0X29wZW4gKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IGV0aGVyMTM5NF9yZWN2X2luaXQoc3RydWN0IGV0aDEzOTRfcHJpdiAqcHJpdikKIHsKLQlzdHJ1Y3QgZXRoMTM5NF9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBpbnQgaXNvX2J1Zl9zaXplOwogCi0JLyogU29tZXRoaW5nIGJhZCBoYXBwZW5lZCwgZG9uJ3QgZXZlbiB0cnkgKi8KLQlpZiAocHJpdi0+YmNfc3RhdGUgPT0gRVRIRVIxMzk0X0JDX0VSUk9SKSB7Ci0JCS8qIHdlJ2xsIHRyeSBhZ2FpbiAqLwotCQlwcml2LT5pc28gPSBocHNiX2lzb19yZWN2X2luaXQocHJpdi0+aG9zdCwKLQkJCQkJICAgICAgIEVUSEVSMTM5NF9JU09fQlVGX1NJWkUsCi0JCQkJCSAgICAgICBFVEhFUjEzOTRfR0FTUF9CVUZGRVJTLAotCQkJCQkgICAgICAgcHJpdi0+YnJvYWRjYXN0X2NoYW5uZWwsCi0JCQkJCSAgICAgICBIUFNCX0lTT19ETUFfUEFDS0VUX1BFUl9CVUZGRVIsCi0JCQkJCSAgICAgICAxLCBldGhlcjEzOTRfaXNvKTsKLQkJaWYgKHByaXYtPmlzbyA9PSBOVUxMKSB7Ci0JCQlFVEgxMzk0X1BSSU5UKEtFUk5fRVJSLCBkZXYtPm5hbWUsCi0JCQkJICAgICAgIkNvdWxkIG5vdCBhbGxvY2F0ZSBpc29jaHJvbm91cyByZWNlaXZlICIKLQkJCQkgICAgICAiY29udGV4dCBmb3IgdGhlIGJyb2FkY2FzdCBjaGFubmVsXG4iKTsKLQkJCXByaXYtPmJjX3N0YXRlID0gRVRIRVIxMzk0X0JDX0VSUk9SOwotCQkJcmV0ID0gLUVBR0FJTjsKLQkJfSBlbHNlIHsKLQkJCWlmIChocHNiX2lzb19yZWN2X3N0YXJ0KHByaXYtPmlzbywgLTEsICgxIDw8IDMpLCAtMSkgPCAwKQotCQkJCXByaXYtPmJjX3N0YXRlID0gRVRIRVIxMzk0X0JDX1NUT1BQRUQ7Ci0JCQllbHNlCi0JCQkJcHJpdi0+YmNfc3RhdGUgPSBFVEhFUjEzOTRfQkNfUlVOTklORzsKLQkJfQorCS8qIEZJWE1FOiByYXdpc28gbGltaXRzIHVzIHRvIFBBR0VfU0laRSAqLworCWlzb19idWZfc2l6ZSA9IG1pbigodW5zaWduZWQgaW50KVBBR0VfU0laRSwKKwkJCSAgIDIgKiAoMVUgPDwgKHByaXYtPmhvc3QtPmNzci5tYXhfcmVjICsgMSkpKTsKKworCXByaXYtPmlzbyA9IGhwc2JfaXNvX3JlY3ZfaW5pdChwcml2LT5ob3N0LAorCQkJCSAgICAgICBFVEhFUjEzOTRfR0FTUF9CVUZGRVJTICogaXNvX2J1Zl9zaXplLAorCQkJCSAgICAgICBFVEhFUjEzOTRfR0FTUF9CVUZGRVJTLAorCQkJCSAgICAgICBwcml2LT5icm9hZGNhc3RfY2hhbm5lbCwKKwkJCQkgICAgICAgSFBTQl9JU09fRE1BX1BBQ0tFVF9QRVJfQlVGRkVSLAorCQkJCSAgICAgICAxLCBldGhlcjEzOTRfaXNvKTsKKwlpZiAocHJpdi0+aXNvID09IE5VTEwpIHsKKwkJRVRIMTM5NF9QUklOVF9HKEtFUk5fRVJSLCAiRmFpbGVkIHRvIGFsbG9jYXRlIElSIGNvbnRleHRcbiIpOworCQlwcml2LT5iY19zdGF0ZSA9IEVUSEVSMTM5NF9CQ19FUlJPUjsKKwkJcmV0dXJuIC1FQUdBSU47CiAJfQogCi0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKKwlpZiAoaHBzYl9pc29fcmVjdl9zdGFydChwcml2LT5pc28sIC0xLCAoMSA8PCAzKSwgLTEpIDwgMCkKKwkJcHJpdi0+YmNfc3RhdGUgPSBFVEhFUjEzOTRfQkNfU1RPUFBFRDsKKwllbHNlCisJCXByaXYtPmJjX3N0YXRlID0gRVRIRVIxMzk0X0JDX1JVTk5JTkc7CisJcmV0dXJuIDA7Cit9CiAKLQluZXRpZl9zdGFydF9xdWV1ZSAoZGV2KTsKKy8qIFRoaXMgaXMgY2FsbGVkIGFmdGVyIGFuICJpZnVwIiAqLworc3RhdGljIGludCBldGhlcjEzOTRfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBldGgxMzk0X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCByZXQ7CisKKwlpZiAocHJpdi0+YmNfc3RhdGUgPT0gRVRIRVIxMzk0X0JDX0VSUk9SKSB7CisJCXJldCA9IGV0aGVyMTM5NF9yZWN2X2luaXQocHJpdik7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOwogCXJldHVybiAwOwogfQogCiAvKiBUaGlzIGlzIGNhbGxlZCBhZnRlciBhbiAiaWZkb3duIiAqLwotc3RhdGljIGludCBldGhlcjEzOTRfc3RvcCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgZXRoZXIxMzk0X3N0b3Aoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQluZXRpZl9zdG9wX3F1ZXVlIChkZXYpOworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKIAlyZXR1cm4gMDsKIH0KIAogLyogUmV0dXJuIHN0YXRpc3RpY3MgdG8gdGhlIGNhbGxlciAqLwotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpldGhlcjEzOTRfc3RhdHMgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmV0aGVyMTM5NF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXJldHVybiAmKCgoc3RydWN0IGV0aDEzOTRfcHJpdiAqKW5ldGRldl9wcml2KGRldikpLT5zdGF0cyk7CiB9CiAKLS8qIFdoYXQgdG8gZG8gaWYgd2UgdGltZW91dC4gSSB0aGluayBhIGhvc3QgcmVzZXQgaXMgcHJvYmFibHkgaW4gb3JkZXIsIHNvCi0gKiB0aGF0J3Mgd2hhdCB3ZSBkby4gU2hvdWxkIHdlIGluY3JlbWVudCB0aGUgc3RhdCBjb3VudGVycyB0b28/ICAqLwotc3RhdGljIHZvaWQgZXRoZXIxMzk0X3R4X3RpbWVvdXQgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCisvKiBGSVhNRTogV2hhdCB0byBkbyBpZiB3ZSB0aW1lb3V0PyBJIHRoaW5rIGEgaG9zdCByZXNldCBpcyBwcm9iYWJseSBpbiBvcmRlciwKKyAqIHNvIHRoYXQncyB3aGF0IHdlIGRvLiBTaG91bGQgd2UgaW5jcmVtZW50IHRoZSBzdGF0IGNvdW50ZXJzIHRvbz8gICovCitzdGF0aWMgdm9pZCBldGhlcjEzOTRfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCUVUSDEzOTRfUFJJTlQgKEtFUk5fRVJSLCBkZXYtPm5hbWUsICJUaW1lb3V0LCByZXNldHRpbmcgaG9zdCAlc1xuIiwKLQkJICAgICAgICgoc3RydWN0IGV0aDEzOTRfcHJpdiAqKW5ldGRldl9wcml2KGRldikpLT5ob3N0LT5kcml2ZXItPm5hbWUpOworCXN0cnVjdCBocHNiX2hvc3QgKmhvc3QgPQorCQkJKChzdHJ1Y3QgZXRoMTM5NF9wcml2ICopbmV0ZGV2X3ByaXYoZGV2KSktPmhvc3Q7CiAKLQloaWdobGV2ZWxfaG9zdF9yZXNldCAoKChzdHJ1Y3QgZXRoMTM5NF9wcml2ICopbmV0ZGV2X3ByaXYoZGV2KSktPmhvc3QpOworCUVUSDEzOTRfUFJJTlQoS0VSTl9FUlIsIGRldi0+bmFtZSwgIlRpbWVvdXQsIHJlc2V0dGluZyBob3N0XG4iKTsKKwlldGhlcjEzOTRfaG9zdF9yZXNldChob3N0KTsKK30KIAotCW5ldGlmX3dha2VfcXVldWUgKGRldik7CitzdGF0aWMgaW5saW5lIGludCBldGhlcjEzOTRfbWF4X210dShzdHJ1Y3QgaHBzYl9ob3N0KiBob3N0KQoreworCXJldHVybiAoMSA8PCAoaG9zdC0+Y3NyLm1heF9yZWMgKyAxKSkKKwkJCS0gc2l6ZW9mKHVuaW9uIGV0aDEzOTRfaGRyKSAtIEVUSEVSMTM5NF9HQVNQX09WRVJIRUFEOwogfQogCiBzdGF0aWMgaW50IGV0aGVyMTM5NF9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1KQogewotCXN0cnVjdCBldGgxMzk0X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBtYXhfbXR1OwogCi0JaWYgKChuZXdfbXR1IDwgNjgpIHx8Ci0JICAgIChuZXdfbXR1ID4gbWluKEVUSDEzOTRfREFUQV9MRU4sCi0JCQkgICAoaW50KSgoMSA8PCAocHJpdi0+aG9zdC0+Y3NyLm1heF9yZWMgKyAxKSkgLQotCQkJCSAoc2l6ZW9mKHVuaW9uIGV0aDEzOTRfaGRyKSArCi0JCQkJICBFVEhFUjEzOTRfR0FTUF9PVkVSSEVBRCkpKSkpCisJaWYgKG5ld19tdHUgPCA2OCkKIAkJcmV0dXJuIC1FSU5WQUw7CisKKwltYXhfbXR1ID0gZXRoZXIxMzk0X21heF9tdHUoCisJCQkoKHN0cnVjdCBldGgxMzk0X3ByaXYgKiluZXRkZXZfcHJpdihkZXYpKS0+aG9zdCk7CisJaWYgKG5ld19tdHUgPiBtYXhfbXR1KSB7CisJCUVUSDEzOTRfUFJJTlQoS0VSTl9JTkZPLCBkZXYtPm5hbWUsCisJCQkgICAgICAiTG9jYWwgbm9kZSBjb25zdHJhaW5zIE1UVSB0byAlZFxuIiwgbWF4X210dSk7CisJCXJldHVybiAtRVJBTkdFOworCX0KKwogCWRldi0+bXR1ID0gbmV3X210dTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgcHVyZ2VfcGFydGlhbF9kYXRhZ3JhbShzdHJ1Y3QgbGlzdF9oZWFkICpvbGQpCiB7Ci0Jc3RydWN0IHBhcnRpYWxfZGF0YWdyYW0gKnBkID0gbGlzdF9lbnRyeShvbGQsIHN0cnVjdCBwYXJ0aWFsX2RhdGFncmFtLCBsaXN0KTsKKwlzdHJ1Y3QgcGFydGlhbF9kYXRhZ3JhbSAqcGQ7CiAJc3RydWN0IGxpc3RfaGVhZCAqbGgsICpuOworCXN0cnVjdCBmcmFnbWVudF9pbmZvICpmaTsKKworCXBkID0gbGlzdF9lbnRyeShvbGQsIHN0cnVjdCBwYXJ0aWFsX2RhdGFncmFtLCBsaXN0KTsKIAogCWxpc3RfZm9yX2VhY2hfc2FmZShsaCwgbiwgJnBkLT5mcmFnX2luZm8pIHsKLQkJc3RydWN0IGZyYWdtZW50X2luZm8gKmZpID0gbGlzdF9lbnRyeShsaCwgc3RydWN0IGZyYWdtZW50X2luZm8sIGxpc3QpOworCQlmaSA9IGxpc3RfZW50cnkobGgsIHN0cnVjdCBmcmFnbWVudF9pbmZvLCBsaXN0KTsKIAkJbGlzdF9kZWwobGgpOwogCQlrZnJlZShmaSk7CiAJfQpAQCAtMzMwLDM1ICszMzEsMjYgQEAKIAkJCQkJCQkgbm9kZWlkX3Qgbm9kZWlkKQogewogCXN0cnVjdCBldGgxMzk0X25vZGVfcmVmICpub2RlOwotCWxpc3RfZm9yX2VhY2hfZW50cnkobm9kZSwgaW5sLCBsaXN0KSB7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG5vZGUsIGlubCwgbGlzdCkKIAkJaWYgKG5vZGUtPnVkLT5uZS0+bm9kZWlkID09IG5vZGVpZCkKIAkJCXJldHVybiBub2RlOwotCX0KIAogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgaW50IGV0aDEzOTRfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIGludCBldGgxMzk0X25ld19ub2RlKHN0cnVjdCBldGgxMzk0X2hvc3RfaW5mbyAqaGksCisJCQkgICAgc3RydWN0IHVuaXRfZGlyZWN0b3J5ICp1ZCkKIHsKLQlzdHJ1Y3QgdW5pdF9kaXJlY3RvcnkgKnVkOwotCXN0cnVjdCBldGgxMzk0X2hvc3RfaW5mbyAqaGk7CiAJc3RydWN0IGV0aDEzOTRfcHJpdiAqcHJpdjsKIAlzdHJ1Y3QgZXRoMTM5NF9ub2RlX3JlZiAqbmV3X25vZGU7CiAJc3RydWN0IGV0aDEzOTRfbm9kZV9pbmZvICpub2RlX2luZm87CiAKLQl1ZCA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCB1bml0X2RpcmVjdG9yeSwgZGV2aWNlKTsKLQotCWhpID0gaHBzYl9nZXRfaG9zdGluZm8oJmV0aDEzOTRfaGlnaGxldmVsLCB1ZC0+bmUtPmhvc3QpOwotCWlmICghaGkpCi0JCXJldHVybiAtRU5PRU5UOwotCi0JbmV3X25vZGUgPSBrbWFsbG9jKHNpemVvZigqbmV3X25vZGUpLAotCQkJICAgaW5faW50ZXJydXB0KCkgPyBHRlBfQVRPTUlDIDogR0ZQX0tFUk5FTCk7CisJbmV3X25vZGUgPSBrbWFsbG9jKHNpemVvZigqbmV3X25vZGUpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW5ld19ub2RlKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCW5vZGVfaW5mbyA9IGttYWxsb2Moc2l6ZW9mKCpub2RlX2luZm8pLAotCQkJICAgIGluX2ludGVycnVwdCgpID8gR0ZQX0FUT01JQyA6IEdGUF9LRVJORUwpOworCW5vZGVfaW5mbyA9IGttYWxsb2Moc2l6ZW9mKCpub2RlX2luZm8pLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW5vZGVfaW5mbykgewogCQlrZnJlZShuZXdfbm9kZSk7CiAJCXJldHVybiAtRU5PTUVNOwpAQCAtMzc0LDEwICszNjYsMjIgQEAKIAogCXByaXYgPSBuZXRkZXZfcHJpdihoaS0+ZGV2KTsKIAlsaXN0X2FkZF90YWlsKCZuZXdfbm9kZS0+bGlzdCwgJnByaXYtPmlwX25vZGVfbGlzdCk7Ci0KIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBldGgxMzk0X3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdW5pdF9kaXJlY3RvcnkgKnVkOworCXN0cnVjdCBldGgxMzk0X2hvc3RfaW5mbyAqaGk7CisKKwl1ZCA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCB1bml0X2RpcmVjdG9yeSwgZGV2aWNlKTsKKwloaSA9IGhwc2JfZ2V0X2hvc3RpbmZvKCZldGgxMzk0X2hpZ2hsZXZlbCwgdWQtPm5lLT5ob3N0KTsKKwlpZiAoIWhpKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCXJldHVybiBldGgxMzk0X25ld19ub2RlKGhpLCB1ZCk7Cit9CisKIHN0YXRpYyBpbnQgZXRoMTM5NF9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCB1bml0X2RpcmVjdG9yeSAqdWQ7CkBAIC0zOTYsMjQgKzQwMCwyMyBAQAogCXByaXYgPSBuZXRkZXZfcHJpdihoaS0+ZGV2KTsKIAogCW9sZF9ub2RlID0gZXRoMTM5NF9maW5kX25vZGUoJnByaXYtPmlwX25vZGVfbGlzdCwgdWQpOworCWlmICghb2xkX25vZGUpCisJCXJldHVybiAwOwogCi0JaWYgKG9sZF9ub2RlKSB7Ci0JCWxpc3RfZGVsKCZvbGRfbm9kZS0+bGlzdCk7Ci0JCWtmcmVlKG9sZF9ub2RlKTsKKwlsaXN0X2RlbCgmb2xkX25vZGUtPmxpc3QpOworCWtmcmVlKG9sZF9ub2RlKTsKIAotCQlub2RlX2luZm8gPSAoc3RydWN0IGV0aDEzOTRfbm9kZV9pbmZvKil1ZC0+ZGV2aWNlLmRyaXZlcl9kYXRhOworCW5vZGVfaW5mbyA9IChzdHJ1Y3QgZXRoMTM5NF9ub2RlX2luZm8qKXVkLT5kZXZpY2UuZHJpdmVyX2RhdGE7CiAKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJm5vZGVfaW5mby0+cGRnLmxvY2ssIGZsYWdzKTsKLQkJLyogVGhlIHBhcnRpYWwgZGF0YWdyYW0gbGlzdCBzaG91bGQgYmUgZW1wdHksIGJ1dCB3ZSdsbCBqdXN0Ci0JCSAqIG1ha2Ugc3VyZSBhbnl3YXkuLi4gKi8KLQkJbGlzdF9mb3JfZWFjaF9zYWZlKGxoLCBuLCAmbm9kZV9pbmZvLT5wZGcubGlzdCkgewotCQkJcHVyZ2VfcGFydGlhbF9kYXRhZ3JhbShsaCk7Ci0JCX0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbm9kZV9pbmZvLT5wZGcubG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZub2RlX2luZm8tPnBkZy5sb2NrLCBmbGFncyk7CisJLyogVGhlIHBhcnRpYWwgZGF0YWdyYW0gbGlzdCBzaG91bGQgYmUgZW1wdHksIGJ1dCB3ZSdsbCBqdXN0CisJICogbWFrZSBzdXJlIGFueXdheS4uLiAqLworCWxpc3RfZm9yX2VhY2hfc2FmZShsaCwgbiwgJm5vZGVfaW5mby0+cGRnLmxpc3QpCisJCXB1cmdlX3BhcnRpYWxfZGF0YWdyYW0obGgpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5vZGVfaW5mby0+cGRnLmxvY2ssIGZsYWdzKTsKIAotCQlrZnJlZShub2RlX2luZm8pOwotCQl1ZC0+ZGV2aWNlLmRyaXZlcl9kYXRhID0gTlVMTDsKLQl9CisJa2ZyZWUobm9kZV9pbmZvKTsKKwl1ZC0+ZGV2aWNlLmRyaXZlcl9kYXRhID0gTlVMTDsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDIyLDQ0ICs0MjUsMTkgQEAKIAlzdHJ1Y3QgZXRoMTM5NF9ob3N0X2luZm8gKmhpOwogCXN0cnVjdCBldGgxMzk0X3ByaXYgKnByaXY7CiAJc3RydWN0IGV0aDEzOTRfbm9kZV9yZWYgKm5vZGU7Ci0Jc3RydWN0IGV0aDEzOTRfbm9kZV9pbmZvICpub2RlX2luZm87CiAKIAloaSA9IGhwc2JfZ2V0X2hvc3RpbmZvKCZldGgxMzk0X2hpZ2hsZXZlbCwgdWQtPm5lLT5ob3N0KTsKIAlpZiAoIWhpKQogCQlyZXR1cm4gLUVOT0VOVDsKIAogCXByaXYgPSBuZXRkZXZfcHJpdihoaS0+ZGV2KTsKLQogCW5vZGUgPSBldGgxMzk0X2ZpbmRfbm9kZSgmcHJpdi0+aXBfbm9kZV9saXN0LCB1ZCk7CisJaWYgKG5vZGUpCisJCXJldHVybiAwOwogCi0JaWYgKCFub2RlKSB7Ci0JCW5vZGUgPSBrbWFsbG9jKHNpemVvZigqbm9kZSksCi0JCQkgICAgICAgaW5faW50ZXJydXB0KCkgPyBHRlBfQVRPTUlDIDogR0ZQX0tFUk5FTCk7Ci0JCWlmICghbm9kZSkKLQkJCXJldHVybiAtRU5PTUVNOwotCi0JCW5vZGVfaW5mbyA9IGttYWxsb2Moc2l6ZW9mKCpub2RlX2luZm8pLAotCQkJCSAgICBpbl9pbnRlcnJ1cHQoKSA/IEdGUF9BVE9NSUMgOiBHRlBfS0VSTkVMKTsKLQkJaWYgKCFub2RlX2luZm8pIHsKLQkJCWtmcmVlKG5vZGUpOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KLQotCQlzcGluX2xvY2tfaW5pdCgmbm9kZV9pbmZvLT5wZGcubG9jayk7Ci0JCUlOSVRfTElTVF9IRUFEKCZub2RlX2luZm8tPnBkZy5saXN0KTsKLQkJbm9kZV9pbmZvLT5wZGcuc3ogPSAwOwotCi0JCXVkLT5kZXZpY2UuZHJpdmVyX2RhdGEgPSBub2RlX2luZm87Ci0JCW5vZGUtPnVkID0gdWQ7Ci0KLQkJcHJpdiA9IG5ldGRldl9wcml2KGhpLT5kZXYpOwotCQlsaXN0X2FkZF90YWlsKCZub2RlLT5saXN0LCAmcHJpdi0+aXBfbm9kZV9saXN0KTsKLQl9Ci0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gZXRoMTM5NF9uZXdfbm9kZShoaSwgdWQpOwogfQogCi0KIHN0YXRpYyBzdHJ1Y3QgaWVlZTEzOTRfZGV2aWNlX2lkIGV0aDEzOTRfaWRfdGFibGVbXSA9IHsKIAl7CiAJCS5tYXRjaF9mbGFncyA9IChJRUVFMTM5NF9NQVRDSF9TUEVDSUZJRVJfSUQgfApAQCAtNDczLDcgKzQ1MSw3IEBACiBNT0RVTEVfREVWSUNFX1RBQkxFKGllZWUxMzk0LCBldGgxMzk0X2lkX3RhYmxlKTsKIAogc3RhdGljIHN0cnVjdCBocHNiX3Byb3RvY29sX2RyaXZlciBldGgxMzk0X3Byb3RvX2RyaXZlciA9IHsKLQkubmFtZQkJPSBFVEgxMzk0X0RSSVZFUl9OQU1FLAorCS5uYW1lCQk9IGRyaXZlcl9uYW1lLAogCS5pZF90YWJsZQk9IGV0aDEzOTRfaWRfdGFibGUsCiAJLnVwZGF0ZQkJPSBldGgxMzk0X3VwZGF0ZSwKIAkuZHJpdmVyCQk9IHsKQEAgLTQ4Miw0NyArNDYwLDUwIEBACiAJfSwKIH07CiAKLQotc3RhdGljIHZvaWQgZXRoZXIxMzk0X3Jlc2V0X3ByaXYgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBzZXRfbXR1KQorc3RhdGljIHZvaWQgZXRoZXIxMzk0X3Jlc2V0X3ByaXYoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHNldF9tdHUpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgaTsKIAlzdHJ1Y3QgZXRoMTM5NF9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0ID0gcHJpdi0+aG9zdDsKLQl1NjQgZ3VpZCA9IGdldF91bmFsaWduZWQoKHU2NCopJihob3N0LT5jc3Iucm9tLT5idXNfaW5mb19kYXRhWzNdKSk7Ci0JdTE2IG1heHBheWxvYWQgPSAxIDw8IChob3N0LT5jc3IubWF4X3JlYyArIDEpOworCXU2NCBndWlkID0gZ2V0X3VuYWxpZ25lZCgodTY0ICopJihob3N0LT5jc3Iucm9tLT5idXNfaW5mb19kYXRhWzNdKSk7CiAJaW50IG1heF9zcGVlZCA9IElFRUUxMzk0X1NQRUVEX01BWDsKIAotCXNwaW5fbG9ja19pcnFzYXZlICgmcHJpdi0+bG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAKLQltZW1zZXQocHJpdi0+dWRfbGlzdCwgMCwgc2l6ZW9mKHN0cnVjdCBub2RlX2VudHJ5KikgKiBBTExfTk9ERVMpOworCW1lbXNldChwcml2LT51ZF9saXN0LCAwLCBzaXplb2YocHJpdi0+dWRfbGlzdCkpOwogCXByaXYtPmJjX21heHBheWxvYWQgPSA1MTI7CiAKIAkvKiBEZXRlcm1pbmUgc3BlZWQgbGltaXQgKi8KLQlmb3IgKGkgPSAwOyBpIDwgaG9zdC0+bm9kZV9jb3VudDsgaSsrKQorCS8qIEZJWE1FOiBUaGlzIGlzIGJyb2tlbiBmb3Igbm9kZXMgd2l0aCBsaW5rIHNwZWVkIDwgUEhZIHNwZWVkLAorCSAqIGFuZCBpdCBpcyBzdWJvcHRpbWFsIGZvciBTMjAwQi4uLlM4MDBCIGhhcmR3YXJlLgorCSAqIFRoZSByZXN1bHQgb2Ygbm9kZW1ncidzIHNwZWVkIHByb2JlIHNob3VsZCBiZSB1c2VkIHNvbWVob3cuICovCisJZm9yIChpID0gMDsgaSA8IGhvc3QtPm5vZGVfY291bnQ7IGkrKykgeworCQkvKiB0YWtlIGNhcmUgb2YgUzEwMEIuLi5TNDAwQiBQSFkgcG9ydHMgKi8KKwkJaWYgKGhvc3QtPnNwZWVkW2ldID09IFNFTEZJRF9TUEVFRF9VTktOT1dOKSB7CisJCQltYXhfc3BlZWQgPSBJRUVFMTM5NF9TUEVFRF8xMDA7CisJCQlicmVhazsKKwkJfQogCQlpZiAobWF4X3NwZWVkID4gaG9zdC0+c3BlZWRbaV0pCiAJCQltYXhfc3BlZWQgPSBob3N0LT5zcGVlZFtpXTsKKwl9CiAJcHJpdi0+YmNfc3NwZCA9IG1heF9zcGVlZDsKIAotCS8qIFdlJ2xsIHVzZSBvdXIgbWF4cGF5bG9hZCBhcyB0aGUgZGVmYXVsdCBtdHUgKi8KIAlpZiAoc2V0X210dSkgewotCQlkZXYtPm10dSA9IG1pbihFVEgxMzk0X0RBVEFfTEVOLAotCQkJICAgICAgIChpbnQpKG1heHBheWxvYWQgLQotCQkJCSAgICAgKHNpemVvZih1bmlvbiBldGgxMzk0X2hkcikgKwotCQkJCSAgICAgIEVUSEVSMTM5NF9HQVNQX09WRVJIRUFEKSkpOworCQkvKiBVc2UgdGhlIFJGQyAyNzM0IGRlZmF1bHQgMTUwMCBvY3RldHMgb3IgdGhlIG1heGltdW0gcGF5bG9hZAorCQkgKiBhcyBpbml0aWFsIE1UVSAqLworCQlkZXYtPm10dSA9IG1pbigxNTAwLCBldGhlcjEzOTRfbWF4X210dShob3N0KSk7CiAKIAkJLyogU2V0IG91ciBoYXJkd2FyZSBhZGRyZXNzIHdoaWxlIHdlJ3JlIGF0IGl0ICovCiAJCW1lbWNweShkZXYtPmRldl9hZGRyLCAmZ3VpZCwgc2l6ZW9mKHU2NCkpOwogCQltZW1zZXQoZGV2LT5icm9hZGNhc3QsIDB4ZmYsIHNpemVvZih1NjQpKTsKIAl9CiAKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlICgmcHJpdi0+bG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIH0KIAotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgcmlnaHQgYmVmb3JlIHJlZ2lzdGVyX25ldGRldiAqLwotc3RhdGljIHZvaWQgZXRoZXIxMzk0X2luaXRfZGV2IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIHZvaWQgZXRoZXIxMzk0X2luaXRfZGV2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0JLyogT3VyIGZ1bmN0aW9ucyAqLwogCWRldi0+b3BlbgkJPSBldGhlcjEzOTRfb3BlbjsKIAlkZXYtPnN0b3AJCT0gZXRoZXIxMzk0X3N0b3A7CiAJZGV2LT5oYXJkX3N0YXJ0X3htaXQJPSBldGhlcjEzOTRfdHg7CkBAIC01MzUsMTAgKzUxNiw5IEBACiAJZGV2LT5oYXJkX2hlYWRlcl9jYWNoZQk9IGV0aGVyMTM5NF9oZWFkZXJfY2FjaGU7CiAJZGV2LT5oZWFkZXJfY2FjaGVfdXBkYXRlPSBldGhlcjEzOTRfaGVhZGVyX2NhY2hlX3VwZGF0ZTsKIAlkZXYtPmhhcmRfaGVhZGVyX3BhcnNlCT0gZXRoZXIxMzk0X2hlYWRlcl9wYXJzZTsKLQlkZXYtPnNldF9tYWNfYWRkcmVzcwk9IGV0aGVyMTM5NF9tYWNfYWRkcjsKKwogCVNFVF9FVEhUT09MX09QUyhkZXYsICZldGh0b29sX29wcyk7CiAKLQkvKiBTb21lIGNvbnN0YW50cyAqLwogCWRldi0+d2F0Y2hkb2dfdGltZW8JPSBFVEhFUjEzOTRfVElNRU9VVDsKIAlkZXYtPmZsYWdzCQk9IElGRl9CUk9BRENBU1QgfCBJRkZfTVVMVElDQVNUOwogCWRldi0+ZmVhdHVyZXMJCT0gTkVUSUZfRl9ISUdIRE1BOwpAQCAtNTQ2LDcgKzUyNiw4IEBACiAJZGV2LT5oYXJkX2hlYWRlcl9sZW4gCT0gRVRIMTM5NF9ITEVOOwogCWRldi0+dHlwZQkJPSBBUlBIUkRfSUVFRTEzOTQ7CiAKLQlldGhlcjEzOTRfcmVzZXRfcHJpdiAoZGV2LCAxKTsKKwkvKiBGSVhNRTogVGhpcyB2YWx1ZSB3YXMgY29waWVkIGZyb20gZXRoZXJfc2V0dXAoKS4gSXMgaXQgdG9vIG11Y2g/ICovCisJZGV2LT50eF9xdWV1ZV9sZW4JPSAxMDAwOwogfQogCiAvKgpAQCAtNTU0LDM0ICs1MzUsMzMgQEAKICAqIHdoZW4gdGhlIG1vZHVsZSBpcyBpbnN0YWxsZWQuIFRoaXMgaXMgd2hlcmUgd2UgYWRkIGFsbCBvZiBvdXIgZXRoZXJuZXQKICAqIGRldmljZXMuIE9uZSBmb3IgZWFjaCBob3N0LgogICovCi1zdGF0aWMgdm9pZCBldGhlcjEzOTRfYWRkX2hvc3QgKHN0cnVjdCBocHNiX2hvc3QgKmhvc3QpCitzdGF0aWMgdm9pZCBldGhlcjEzOTRfYWRkX2hvc3Qoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCkKIHsKIAlzdHJ1Y3QgZXRoMTM5NF9ob3N0X2luZm8gKmhpID0gTlVMTDsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gTlVMTDsKIAlzdHJ1Y3QgZXRoMTM5NF9wcml2ICpwcml2OwogCXU2NCBmaWZvX2FkZHI7CiAKLQlpZiAoIShob3N0LT5jb25maWdfcm9tcyAmIEhQU0JfQ09ORklHX1JPTV9FTlRSWV9JUDEzOTQpKQorCWlmIChocHNiX2NvbmZpZ19yb21faXAxMzk0X2FkZChob3N0KSAhPSAwKSB7CisJCUVUSDEzOTRfUFJJTlRfRyhLRVJOX0VSUiwgIkNhbid0IGFkZCBJUC1vdmVyLTEzOTQgUk9NIGVudHJ5XG4iKTsKIAkJcmV0dXJuOworCX0KIAogCWZpZm9fYWRkciA9IGhwc2JfYWxsb2NhdGVfYW5kX3JlZ2lzdGVyX2FkZHJzcGFjZSgKIAkJCSZldGgxMzk0X2hpZ2hsZXZlbCwgaG9zdCwgJmFkZHJfb3BzLAogCQkJRVRIRVIxMzk0X1JFR0lPTl9BRERSX0xFTiwgRVRIRVIxMzk0X1JFR0lPTl9BRERSX0xFTiwKIAkJCUNTUjEyMTJfSU5WQUxJRF9BRERSX1NQQUNFLCBDU1IxMjEyX0lOVkFMSURfQUREUl9TUEFDRSk7Ci0JaWYgKGZpZm9fYWRkciA9PSBDU1IxMjEyX0lOVkFMSURfQUREUl9TUEFDRSkKLQkJZ290byBvdXQ7CisJaWYgKGZpZm9fYWRkciA9PSBDU1IxMjEyX0lOVkFMSURfQUREUl9TUEFDRSkgeworCQlFVEgxMzk0X1BSSU5UX0coS0VSTl9FUlIsICJDYW5ub3QgcmVnaXN0ZXIgQ1NSIHNwYWNlXG4iKTsKKwkJaHBzYl9jb25maWdfcm9tX2lwMTM5NF9yZW1vdmUoaG9zdCk7CisJCXJldHVybjsKKwl9CiAKLQkvKiBXZSBzaG91bGQgcmVhbGx5IGhhdmUgb3VyIG93biBhbGxvY19ocHNiZGV2KCkgZnVuY3Rpb24gaW4KLQkgKiBuZXRfaW5pdC5jIGluc3RlYWQgb2YgY2FsbGluZyB0aGUgb25lIGZvciBldGhlcm5ldCB0aGVuIGhpamFja2luZwotCSAqIGl0IGZvciBvdXJzZWx2ZXMuICBUaGF0IHdheSB3ZSdkIGJlIGEgcmVhbCBuZXR3b3JraW5nIGRldmljZS4gKi8KLQlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2YgKHN0cnVjdCBldGgxMzk0X3ByaXYpKTsKLQorCWRldiA9IGFsbG9jX25ldGRldihzaXplb2YoKnByaXYpLCAiZXRoJWQiLCBldGhlcjEzOTRfaW5pdF9kZXYpOwogCWlmIChkZXYgPT0gTlVMTCkgewotCQlFVEgxMzk0X1BSSU5UX0cgKEtFUk5fRVJSLCAiT3V0IG9mIG1lbW9yeSB0cnlpbmcgdG8gYWxsb2NhdGUgIgotCQkJCSAiZXRoZXJkZXZpY2UgZm9yIElFRUUgMTM5NCBkZXZpY2UgJXMtJWRcbiIsCi0JCQkJIGhvc3QtPmRyaXZlci0+bmFtZSwgaG9zdC0+aWQpOworCQlFVEgxMzk0X1BSSU5UX0coS0VSTl9FUlIsICJPdXQgb2YgbWVtb3J5XG4iKTsKIAkJZ290byBvdXQ7Ci0gICAgICAgIH0KKwl9CiAKIAlTRVRfTU9EVUxFX09XTkVSKGRldik7CiAjaWYgMApAQCAtNTkwLDMxICs1NzAsMjYgQEAKICNlbmRpZgogCiAJcHJpdiA9IG5ldGRldl9wcml2KGRldik7Ci0KIAlJTklUX0xJU1RfSEVBRCgmcHJpdi0+aXBfbm9kZV9saXN0KTsKLQogCXNwaW5fbG9ja19pbml0KCZwcml2LT5sb2NrKTsKIAlwcml2LT5ob3N0ID0gaG9zdDsKIAlwcml2LT5sb2NhbF9maWZvID0gZmlmb19hZGRyOwogCiAJaGkgPSBocHNiX2NyZWF0ZV9ob3N0aW5mbygmZXRoMTM5NF9oaWdobGV2ZWwsIGhvc3QsIHNpemVvZigqaGkpKTsKLQogCWlmIChoaSA9PSBOVUxMKSB7Ci0JCUVUSDEzOTRfUFJJTlRfRyAoS0VSTl9FUlIsICJPdXQgb2YgbWVtb3J5IHRyeWluZyB0byBjcmVhdGUgIgotCQkJCSAiaG9zdGluZm8gZm9yIElFRUUgMTM5NCBkZXZpY2UgJXMtJWRcbiIsCi0JCQkJIGhvc3QtPmRyaXZlci0+bmFtZSwgaG9zdC0+aWQpOwotCQlnb3RvIG91dDsKLSAgICAgICAgfQotCi0JZXRoZXIxMzk0X2luaXRfZGV2KGRldik7Ci0KLQlpZiAocmVnaXN0ZXJfbmV0ZGV2IChkZXYpKSB7Ci0JCUVUSDEzOTRfUFJJTlQgKEtFUk5fRVJSLCBkZXYtPm5hbWUsICJFcnJvciByZWdpc3RlcmluZyBuZXR3b3JrIGRyaXZlclxuIik7CisJCUVUSDEzOTRfUFJJTlRfRyhLRVJOX0VSUiwgIk91dCBvZiBtZW1vcnlcbiIpOwogCQlnb3RvIG91dDsKIAl9CiAKLQlFVEgxMzk0X1BSSU5UIChLRVJOX0lORk8sIGRldi0+bmFtZSwgIklFRUUtMTM5NCBJUHY0IG92ZXIgMTM5NCBFdGhlcm5ldCAoZnctaG9zdCVkKVxuIiwKLQkJICAgICAgIGhvc3QtPmlkKTsKKwlldGhlcjEzOTRfcmVzZXRfcHJpdihkZXYsIDEpOworCisJaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpKSB7CisJCUVUSDEzOTRfUFJJTlRfRyhLRVJOX0VSUiwgIkNhbm5vdCByZWdpc3RlciB0aGUgZHJpdmVyXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJRVRIMTM5NF9QUklOVChLRVJOX0lORk8sIGRldi0+bmFtZSwgIklQdjQgb3ZlciBJRUVFIDEzOTQgKGZ3LWhvc3QlZClcbiIsCisJCSAgICAgIGhvc3QtPmlkKTsKIAogCWhpLT5ob3N0ID0gaG9zdDsKIAloaS0+ZGV2ID0gZGV2OwpAQCAtNjIzLDYxICs1OTgsMzcgQEAKIAkgKiBiZSBjaGVja2VkIHdoZW4gdGhlIGV0aCBkZXZpY2UgaXMgb3BlbmVkLiAqLwogCXByaXYtPmJyb2FkY2FzdF9jaGFubmVsID0gaG9zdC0+Y3NyLmJyb2FkY2FzdF9jaGFubmVsICYgMHgzZjsKIAotCXByaXYtPmlzbyA9IGhwc2JfaXNvX3JlY3ZfaW5pdChob3N0LAotCQkJCSAgICAgICBFVEhFUjEzOTRfSVNPX0JVRl9TSVpFLAotCQkJCSAgICAgICBFVEhFUjEzOTRfR0FTUF9CVUZGRVJTLAotCQkJCSAgICAgICBwcml2LT5icm9hZGNhc3RfY2hhbm5lbCwKLQkJCQkgICAgICAgSFBTQl9JU09fRE1BX1BBQ0tFVF9QRVJfQlVGRkVSLAotCQkJCSAgICAgICAxLCBldGhlcjEzOTRfaXNvKTsKLQlpZiAocHJpdi0+aXNvID09IE5VTEwpIHsKLQkJRVRIMTM5NF9QUklOVChLRVJOX0VSUiwgZGV2LT5uYW1lLAotCQkJICAgICAgIkNvdWxkIG5vdCBhbGxvY2F0ZSBpc29jaHJvbm91cyByZWNlaXZlIGNvbnRleHQgIgotCQkJICAgICAgImZvciB0aGUgYnJvYWRjYXN0IGNoYW5uZWxcbiIpOwotCQlwcml2LT5iY19zdGF0ZSA9IEVUSEVSMTM5NF9CQ19FUlJPUjsKLQl9IGVsc2UgewotCQlpZiAoaHBzYl9pc29fcmVjdl9zdGFydChwcml2LT5pc28sIC0xLCAoMSA8PCAzKSwgLTEpIDwgMCkKLQkJCXByaXYtPmJjX3N0YXRlID0gRVRIRVIxMzk0X0JDX1NUT1BQRUQ7Ci0JCWVsc2UKLQkJCXByaXYtPmJjX3N0YXRlID0gRVRIRVIxMzk0X0JDX1JVTk5JTkc7Ci0JfQotCisJZXRoZXIxMzk0X3JlY3ZfaW5pdChwcml2KTsKIAlyZXR1cm47Ci0KIG91dDoKLQlpZiAoZGV2ICE9IE5VTEwpCisJaWYgKGRldikKIAkJZnJlZV9uZXRkZXYoZGV2KTsKIAlpZiAoaGkpCiAJCWhwc2JfZGVzdHJveV9ob3N0aW5mbygmZXRoMTM5NF9oaWdobGV2ZWwsIGhvc3QpOwotCi0JcmV0dXJuOworCWhwc2JfdW5yZWdpc3Rlcl9hZGRyc3BhY2UoJmV0aDEzOTRfaGlnaGxldmVsLCBob3N0LCBmaWZvX2FkZHIpOworCWhwc2JfY29uZmlnX3JvbV9pcDEzOTRfcmVtb3ZlKGhvc3QpOwogfQogCiAvKiBSZW1vdmUgYSBjYXJkIGZyb20gb3VyIGxpc3QgKi8KLXN0YXRpYyB2b2lkIGV0aGVyMTM5NF9yZW1vdmVfaG9zdCAoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCkKK3N0YXRpYyB2b2lkIGV0aGVyMTM5NF9yZW1vdmVfaG9zdChzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0KQogewogCXN0cnVjdCBldGgxMzk0X2hvc3RfaW5mbyAqaGk7CisJc3RydWN0IGV0aDEzOTRfcHJpdiAqcHJpdjsKIAogCWhpID0gaHBzYl9nZXRfaG9zdGluZm8oJmV0aDEzOTRfaGlnaGxldmVsLCBob3N0KTsKLQlpZiAoaGkgIT0gTlVMTCkgewotCQlzdHJ1Y3QgZXRoMTM5NF9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoaGktPmRldik7Ci0KLQkJaHBzYl91bnJlZ2lzdGVyX2FkZHJzcGFjZSgmZXRoMTM5NF9oaWdobGV2ZWwsIGhvc3QsCi0JCQkJCSAgcHJpdi0+bG9jYWxfZmlmbyk7Ci0KLQkJaWYgKHByaXYtPmlzbyAhPSBOVUxMKQotCQkJaHBzYl9pc29fc2h1dGRvd24ocHJpdi0+aXNvKTsKLQotCQlpZiAoaGktPmRldikgewotCQkJdW5yZWdpc3Rlcl9uZXRkZXYgKGhpLT5kZXYpOwotCQkJZnJlZV9uZXRkZXYoaGktPmRldik7Ci0JCX0KLQl9Ci0KLQlyZXR1cm47CisJaWYgKCFoaSkKKwkJcmV0dXJuOworCXByaXYgPSBuZXRkZXZfcHJpdihoaS0+ZGV2KTsKKwlocHNiX3VucmVnaXN0ZXJfYWRkcnNwYWNlKCZldGgxMzk0X2hpZ2hsZXZlbCwgaG9zdCwgcHJpdi0+bG9jYWxfZmlmbyk7CisJaHBzYl9jb25maWdfcm9tX2lwMTM5NF9yZW1vdmUoaG9zdCk7CisJaWYgKHByaXYtPmlzbykKKwkJaHBzYl9pc29fc2h1dGRvd24ocHJpdi0+aXNvKTsKKwl1bnJlZ2lzdGVyX25ldGRldihoaS0+ZGV2KTsKKwlmcmVlX25ldGRldihoaS0+ZGV2KTsKIH0KIAotLyogQSByZXNldCBoYXMganVzdCBhcmlzZW4gKi8KLXN0YXRpYyB2b2lkIGV0aGVyMTM5NF9ob3N0X3Jlc2V0IChzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0KQorLyogQSBidXMgcmVzZXQgaGFwcGVuZWQgKi8KK3N0YXRpYyB2b2lkIGV0aGVyMTM5NF9ob3N0X3Jlc2V0KHN0cnVjdCBocHNiX2hvc3QgKmhvc3QpCiB7CiAJc3RydWN0IGV0aDEzOTRfaG9zdF9pbmZvICpoaTsKIAlzdHJ1Y3QgZXRoMTM5NF9wcml2ICpwcml2OwpAQCAtNjkwLDI0ICs2NDEsMjMgQEAKIAloaSA9IGhwc2JfZ2V0X2hvc3RpbmZvKCZldGgxMzk0X2hpZ2hsZXZlbCwgaG9zdCk7CiAKIAkvKiBUaGlzIGNhbiBoYXBwZW4gZm9yIGhvc3RzIHRoYXQgd2UgZG9uJ3QgdXNlICovCi0JaWYgKGhpID09IE5VTEwpCisJaWYgKCFoaSkKIAkJcmV0dXJuOwogCiAJZGV2ID0gaGktPmRldjsKLQlwcml2ID0gKHN0cnVjdCBldGgxMzk0X3ByaXYgKiluZXRkZXZfcHJpdihkZXYpOworCXByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogCi0JLyogUmVzZXQgb3VyIHByaXZhdGUgaG9zdCBkYXRhLCBidXQgbm90IG91ciBtdHUgKi8KLQluZXRpZl9zdG9wX3F1ZXVlIChkZXYpOwotCWV0aGVyMTM5NF9yZXNldF9wcml2IChkZXYsIDApOworCS8qIFJlc2V0IG91ciBwcml2YXRlIGhvc3QgZGF0YSwgYnV0IG5vdCBvdXIgTVRVICovCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCWV0aGVyMTM5NF9yZXNldF9wcml2KGRldiwgMCk7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KG5vZGUsICZwcml2LT5pcF9ub2RlX2xpc3QsIGxpc3QpIHsKLQkJbm9kZV9pbmZvID0gKHN0cnVjdCBldGgxMzk0X25vZGVfaW5mbyopbm9kZS0+dWQtPmRldmljZS5kcml2ZXJfZGF0YTsKKwkJbm9kZV9pbmZvID0gbm9kZS0+dWQtPmRldmljZS5kcml2ZXJfZGF0YTsKIAogCQlzcGluX2xvY2tfaXJxc2F2ZSgmbm9kZV9pbmZvLT5wZGcubG9jaywgZmxhZ3MpOwogCi0JCWxpc3RfZm9yX2VhY2hfc2FmZShsaCwgbiwgJm5vZGVfaW5mby0+cGRnLmxpc3QpIHsKKwkJbGlzdF9mb3JfZWFjaF9zYWZlKGxoLCBuLCAmbm9kZV9pbmZvLT5wZGcubGlzdCkKIAkJCXB1cmdlX3BhcnRpYWxfZGF0YWdyYW0obGgpOwotCQl9CiAKIAkJSU5JVF9MSVNUX0hFQUQoJihub2RlX2luZm8tPnBkZy5saXN0KSk7CiAJCW5vZGVfaW5mby0+cGRnLnN6ID0gMDsKQEAgLTcxNSw3ICs2NjUsNyBAQAogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZub2RlX2luZm8tPnBkZy5sb2NrLCBmbGFncyk7CiAJfQogCi0JbmV0aWZfd2FrZV9xdWV1ZSAoZGV2KTsKKwluZXRpZl93YWtlX3F1ZXVlKGRldik7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTcyMyw3ICs2NzMsNiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIFRoZXNlIGZ1bmN0aW9ucyBoYXZlIGJlZW4gYWRhcHRlZCBmcm9tIG5ldC9ldGhlcm5ldC9ldGguYyAqLwogCi0KIC8qIENyZWF0ZSBhIGZha2UgTUFDIGhlYWRlciBmb3IgYW4gYXJiaXRyYXJ5IHByb3RvY29sIGxheWVyLgogICogc2FkZHI9TlVMTCBtZWFucyB1c2UgZGV2aWNlIHNvdXJjZSBhZGRyZXNzCiAgKiBkYWRkcj1OVUxMIG1lYW5zIGxlYXZlIGRlc3RpbmF0aW9uIGFkZHJlc3MgKGVnIHVucmVzb2x2ZWQgYXJwKS4gKi8KQEAgLTczMSwyNSArNjgwLDI0IEBACiAJCQkgICAgdW5zaWduZWQgc2hvcnQgdHlwZSwgdm9pZCAqZGFkZHIsIHZvaWQgKnNhZGRyLAogCQkJICAgIHVuc2lnbmVkIGxlbikKIHsKLQlzdHJ1Y3QgZXRoMTM5NGhkciAqZXRoID0gKHN0cnVjdCBldGgxMzk0aGRyICopc2tiX3B1c2goc2tiLCBFVEgxMzk0X0hMRU4pOworCXN0cnVjdCBldGgxMzk0aGRyICpldGggPQorCQkJKHN0cnVjdCBldGgxMzk0aGRyICopc2tiX3B1c2goc2tiLCBFVEgxMzk0X0hMRU4pOwogCiAJZXRoLT5oX3Byb3RvID0gaHRvbnModHlwZSk7CiAKLQlpZiAoZGV2LT5mbGFncyAmIChJRkZfTE9PUEJBQ0t8SUZGX05PQVJQKSkgeworCWlmIChkZXYtPmZsYWdzICYgKElGRl9MT09QQkFDSyB8IElGRl9OT0FSUCkpIHsKIAkJbWVtc2V0KGV0aC0+aF9kZXN0LCAwLCBkZXYtPmFkZHJfbGVuKTsKLQkJcmV0dXJuKGRldi0+aGFyZF9oZWFkZXJfbGVuKTsKKwkJcmV0dXJuIGRldi0+aGFyZF9oZWFkZXJfbGVuOwogCX0KIAogCWlmIChkYWRkcikgewotCQltZW1jcHkoZXRoLT5oX2Rlc3QsZGFkZHIsZGV2LT5hZGRyX2xlbik7CisJCW1lbWNweShldGgtPmhfZGVzdCwgZGFkZHIsIGRldi0+YWRkcl9sZW4pOwogCQlyZXR1cm4gZGV2LT5oYXJkX2hlYWRlcl9sZW47CiAJfQogCiAJcmV0dXJuIC1kZXYtPmhhcmRfaGVhZGVyX2xlbjsKLQogfQogCi0KIC8qIFJlYnVpbGQgdGhlIGZha2VkIE1BQyBoZWFkZXIuIFRoaXMgaXMgY2FsbGVkIGFmdGVyIGFuIEFSUAogICogKG9yIGluIGZ1dHVyZSBvdGhlciBhZGRyZXNzIHJlc29sdXRpb24pIGhhcyBjb21wbGV0ZWQgb24gdGhpcwogICogc2tfYnVmZi4gV2Ugbm93IGxldCBBUlAgZmlsbCBpbiB0aGUgb3RoZXIgZmllbGRzLgpAQCAtNzYwLDM4ICs3MDgsMzAgQEAKIHN0YXRpYyBpbnQgZXRoZXIxMzk0X3JlYnVpbGRfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IGV0aDEzOTRoZHIgKmV0aCA9IChzdHJ1Y3QgZXRoMTM5NGhkciAqKXNrYi0+ZGF0YTsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gc2tiLT5kZXY7CiAKLQlzd2l0Y2ggKGV0aC0+aF9wcm90bykgeworCWlmIChldGgtPmhfcHJvdG8gPT0gaHRvbnMoRVRIX1BfSVApKQorCQlyZXR1cm4gYXJwX2ZpbmQoKHVuc2lnbmVkIGNoYXIgKikmZXRoLT5oX2Rlc3QsIHNrYik7CiAKLSNpZmRlZiBDT05GSUdfSU5FVAotCWNhc2UgX19jb25zdGFudF9odG9ucyhFVEhfUF9JUCk6Ci0gCQlyZXR1cm4gYXJwX2ZpbmQoKHVuc2lnbmVkIGNoYXIqKSZldGgtPmhfZGVzdCwgc2tiKTsKLSNlbmRpZgotCWRlZmF1bHQ6Ci0JCUVUSDEzOTRfUFJJTlQoS0VSTl9ERUJVRywgZGV2LT5uYW1lLAotCQkJICAgICAgInVuYWJsZSB0byByZXNvbHZlIHR5cGUgJTA0eCBhZGRyZXNzZXMuXG4iLAotCQkJICAgICAgbnRvaHMoZXRoLT5oX3Byb3RvKSk7Ci0JCWJyZWFrOwotCX0KLQorCUVUSDEzOTRfUFJJTlQoS0VSTl9ERUJVRywgc2tiLT5kZXYtPm5hbWUsCisJCSAgICAgICJ1bmFibGUgdG8gcmVzb2x2ZSB0eXBlICUwNHggYWRkcmVzc2VzXG4iLAorCQkgICAgICBudG9ocyhldGgtPmhfcHJvdG8pKTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBldGhlcjEzOTRfaGVhZGVyX3BhcnNlKHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGNoYXIgKmhhZGRyKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBza2ItPmRldjsKKwogCW1lbWNweShoYWRkciwgZGV2LT5kZXZfYWRkciwgRVRIMTM5NF9BTEVOKTsKIAlyZXR1cm4gRVRIMTM5NF9BTEVOOwogfQogCi0KIHN0YXRpYyBpbnQgZXRoZXIxMzk0X2hlYWRlcl9jYWNoZShzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaCwgc3RydWN0IGhoX2NhY2hlICpoaCkKIHsKIAl1bnNpZ25lZCBzaG9ydCB0eXBlID0gaGgtPmhoX3R5cGU7Ci0Jc3RydWN0IGV0aDEzOTRoZHIgKmV0aCA9IChzdHJ1Y3QgZXRoMTM5NGhkciopKCgodTgqKWhoLT5oaF9kYXRhKSArCi0JCQkJCQkgICAgICAoMTYgLSBFVEgxMzk0X0hMRU4pKTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbmVpZ2gtPmRldjsKKwlzdHJ1Y3QgZXRoMTM5NGhkciAqZXRoID0KKwkJKHN0cnVjdCBldGgxMzk0aGRyICopKCh1OCAqKWhoLT5oaF9kYXRhICsgMTYgLSBFVEgxMzk0X0hMRU4pOwogCiAJaWYgKHR5cGUgPT0gaHRvbnMoRVRIX1BfODAyXzMpKQogCQlyZXR1cm4gLTE7CkBAIC04MDgsMzggKzc0OCwyNSBAQAogCQkJCQkgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkJCSAgdW5zaWduZWQgY2hhciAqIGhhZGRyKQogewotCW1lbWNweSgoKHU4KiloaC0+aGhfZGF0YSkgKyAoMTYgLSBFVEgxMzk0X0hMRU4pLCBoYWRkciwgZGV2LT5hZGRyX2xlbik7CisJbWVtY3B5KCh1OCAqKWhoLT5oaF9kYXRhICsgMTYgLSBFVEgxMzk0X0hMRU4sIGhhZGRyLCBkZXYtPmFkZHJfbGVuKTsKIH0KIAotc3RhdGljIGludCBldGhlcjEzOTRfbWFjX2FkZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqcCkKLXsKLQlpZiAobmV0aWZfcnVubmluZyhkZXYpKQotCQlyZXR1cm4gLUVCVVNZOwotCi0JLyogTm90IGdvaW5nIHRvIGFsbG93IHNldHRpbmcgdGhlIE1BQyBhZGRyZXNzLCB3ZSByZWFsbHkgbmVlZCB0byB1c2UKLQkgKiB0aGUgcmVhbCBvbmUgc3VwcGxpZWQgYnkgdGhlIGhhcmR3YXJlICovCi0JIHJldHVybiAtRUlOVkFMOwotIH0KLQotCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIERhdGFncmFtIHJlY2VwdGlvbiBjb2RlCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiBDb3BpZWQgZnJvbSBuZXQvZXRoZXJuZXQvZXRoLmMgKi8KLXN0YXRpYyBpbmxpbmUgdTE2IGV0aGVyMTM5NF90eXBlX3RyYW5zKHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgdTE2IGV0aGVyMTM5NF90eXBlX3RyYW5zKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGV0aDEzOTRoZHIgKmV0aDsKIAl1bnNpZ25lZCBjaGFyICpyYXdwOwogCi0Jc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOwotCXNrYl9wdWxsIChza2IsIEVUSDEzOTRfSExFTik7CisJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKKwlza2JfcHVsbChza2IsIEVUSDEzOTRfSExFTik7CiAJZXRoID0gZXRoMTM5NF9oZHIoc2tiKTsKIAogCWlmICgqZXRoLT5oX2Rlc3QgJiAxKSB7Ci0JCWlmIChtZW1jbXAoZXRoLT5oX2Rlc3QsIGRldi0+YnJvYWRjYXN0LCBkZXYtPmFkZHJfbGVuKT09MCkKKwkJaWYgKG1lbWNtcChldGgtPmhfZGVzdCwgZGV2LT5icm9hZGNhc3QsIGRldi0+YWRkcl9sZW4pID09IDApCiAJCQlza2ItPnBrdF90eXBlID0gUEFDS0VUX0JST0FEQ0FTVDsKICNpZiAwCiAJCWVsc2UKQEAgLTg0OCw0NyArNzc1LDQ1IEBACiAJfSBlbHNlIHsKIAkJaWYgKG1lbWNtcChldGgtPmhfZGVzdCwgZGV2LT5kZXZfYWRkciwgZGV2LT5hZGRyX2xlbikpCiAJCQlza2ItPnBrdF90eXBlID0gUEFDS0VUX09USEVSSE9TVDsKLSAgICAgICAgfQorCX0KIAotCWlmIChudG9ocyAoZXRoLT5oX3Byb3RvKSA+PSAxNTM2KQorCWlmIChudG9ocyhldGgtPmhfcHJvdG8pID49IDE1MzYpCiAJCXJldHVybiBldGgtPmhfcHJvdG87CiAKIAlyYXdwID0gc2tiLT5kYXRhOwogCi0gICAgICAgIGlmICgqKHVuc2lnbmVkIHNob3J0ICopcmF3cCA9PSAweEZGRkYpCi0JCXJldHVybiBodG9ucyAoRVRIX1BfODAyXzMpOworCWlmICgqKHVuc2lnbmVkIHNob3J0ICopcmF3cCA9PSAweEZGRkYpCisJCXJldHVybiBodG9ucyhFVEhfUF84MDJfMyk7CiAKLSAgICAgICAgcmV0dXJuIGh0b25zIChFVEhfUF84MDJfMik7CisJcmV0dXJuIGh0b25zKEVUSF9QXzgwMl8yKTsKIH0KIAogLyogUGFyc2UgYW4gZW5jYXBzdWxhdGVkIElQMTM5NCBoZWFkZXIgaW50byBhbiBldGhlcm5ldCBmcmFtZSBwYWNrZXQuCiAgKiBXZSBhbHNvIHBlcmZvcm0gQVJQIHRyYW5zbGF0aW9uIGhlcmUsIGlmIG5lZWQgYmUuICAqLwotc3RhdGljIGlubGluZSB1MTYgZXRoZXIxMzk0X3BhcnNlX2VuY2FwKHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJCW5vZGVpZF90IHNyY2lkLCBub2RlaWRfdCBkZXN0aWQsCi0JCQkJCXUxNiBldGhlcl90eXBlKQorc3RhdGljIHUxNiBldGhlcjEzOTRfcGFyc2VfZW5jYXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgbm9kZWlkX3Qgc3JjaWQsIG5vZGVpZF90IGRlc3RpZCwKKwkJCQkgdTE2IGV0aGVyX3R5cGUpCiB7CiAJc3RydWN0IGV0aDEzOTRfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAJdTY0IGRlc3RfaHc7CiAJdW5zaWduZWQgc2hvcnQgcmV0ID0gMDsKIAotCS8qIFNldHVwIG91ciBodyBhZGRyZXNzZXMuIFdlIHVzZSB0aGVzZSB0byBidWlsZCB0aGUKLQkgKiBldGhlcm5ldCBoZWFkZXIuICAqLworCS8qIFNldHVwIG91ciBodyBhZGRyZXNzZXMuIFdlIHVzZSB0aGVzZSB0byBidWlsZCB0aGUgZXRoZXJuZXQgaGVhZGVyLiAqLwogCWlmIChkZXN0aWQgPT0gKExPQ0FMX0JVUyB8IEFMTF9OT0RFUykpCiAJCWRlc3RfaHcgPSB+MFVMTDsgIC8qIGJyb2FkY2FzdCAqLwogCWVsc2UKLQkJZGVzdF9odyA9IGNwdV90b19iZTY0KCgoKHU2NClwcml2LT5ob3N0LT5jc3IuZ3VpZF9oaSkgPDwgMzIpIHwKKwkJZGVzdF9odyA9IGNwdV90b19iZTY0KCh1NjQpcHJpdi0+aG9zdC0+Y3NyLmd1aWRfaGkgPDwgMzIgfAogCQkJCSAgICAgIHByaXYtPmhvc3QtPmNzci5ndWlkX2xvKTsKIAogCS8qIElmIHRoaXMgaXMgYW4gQVJQIHBhY2tldCwgY29udmVydCBpdC4gRmlyc3QsIHdlIHdhbnQgdG8gbWFrZQogCSAqIHVzZSBvZiBzb21lIG9mIHRoZSBmaWVsZHMsIHNpbmNlIHRoZXkgdGVsbCB1cyBhIGxpdHRsZSBiaXQKIAkgKiBhYm91dCB0aGUgc2VuZGluZyBtYWNoaW5lLiAgKi8KIAlpZiAoZXRoZXJfdHlwZSA9PSBodG9ucyhFVEhfUF9BUlApKSB7Ci0JCXN0cnVjdCBldGgxMzk0X2FycCAqYXJwMTM5NCA9IChzdHJ1Y3QgZXRoMTM5NF9hcnAqKXNrYi0+ZGF0YTsKKwkJc3RydWN0IGV0aDEzOTRfYXJwICphcnAxMzk0ID0gKHN0cnVjdCBldGgxMzk0X2FycCAqKXNrYi0+ZGF0YTsKIAkJc3RydWN0IGFycGhkciAqYXJwID0gKHN0cnVjdCBhcnBoZHIgKilza2ItPmRhdGE7CiAJCXVuc2lnbmVkIGNoYXIgKmFycF9wdHIgPSAodW5zaWduZWQgY2hhciAqKShhcnAgKyAxKTsKIAkJdTY0IGZpZm9fYWRkciA9ICh1NjQpbnRvaHMoYXJwMTM5NC0+Zmlmb19oaSkgPDwgMzIgfAotCQkJbnRvaGwoYXJwMTM5NC0+Zmlmb19sbyk7CisJCQkJCSAgIG50b2hsKGFycDEzOTQtPmZpZm9fbG8pOwogCQl1OCBtYXhfcmVjID0gbWluKHByaXYtPmhvc3QtPmNzci5tYXhfcmVjLAogCQkJCSAodTgpKGFycDEzOTQtPm1heF9yZWMpKTsKIAkJaW50IHNzcGQgPSBhcnAxMzk0LT5zc3BkOwpAQCAtOTAyLDE2ICs4MjcsMTcgQEAKIAkJaWYgKHNzcGQgPiA1IHx8IHNzcGQgPCAwKQogCQkJc3NwZCA9IDA7CiAKLQkJbWF4cGF5bG9hZCA9IG1pbihldGgxMzk0X3NwZWVkdG9fbWF4cGF5bG9hZFtzc3BkXSwgKHUxNikoMSA8PCAobWF4X3JlYyArIDEpKSk7CisJCW1heHBheWxvYWQgPSBtaW4oZXRoMTM5NF9zcGVlZHRvX21heHBheWxvYWRbc3NwZF0sCisJCQkJICh1MTYpKDEgPDwgKG1heF9yZWMgKyAxKSkpOwogCiAJCWd1aWQgPSBnZXRfdW5hbGlnbmVkKCZhcnAxMzk0LT5zX3VuaXFfaWQpOwogCQlub2RlID0gZXRoMTM5NF9maW5kX25vZGVfZ3VpZCgmcHJpdi0+aXBfbm9kZV9saXN0LAogCQkJCQkgICAgICBiZTY0X3RvX2NwdShndWlkKSk7Ci0JCWlmICghbm9kZSkgeworCQlpZiAoIW5vZGUpCiAJCQlyZXR1cm4gMDsKLQkJfQogCi0JCW5vZGVfaW5mbyA9IChzdHJ1Y3QgZXRoMTM5NF9ub2RlX2luZm8qKW5vZGUtPnVkLT5kZXZpY2UuZHJpdmVyX2RhdGE7CisJCW5vZGVfaW5mbyA9CisJCSAgICAoc3RydWN0IGV0aDEzOTRfbm9kZV9pbmZvICopbm9kZS0+dWQtPmRldmljZS5kcml2ZXJfZGF0YTsKIAogCQkvKiBVcGRhdGUgb3VyIHNwZWVkL3BheWxvYWQvZmlmb19vZmZzZXQgdGFibGUgKi8KIAkJbm9kZV9pbmZvLT5tYXhwYXlsb2FkID0JbWF4cGF5bG9hZDsKQEAgLTkzMCw3ICs4NTYsNyBAQAogCiAJCWFycC0+YXJfaGxuID0gODsKIAkJYXJwX3B0ciArPSBhcnAtPmFyX2hsbjsJCS8qIHNraXAgb3ZlciBzZW5kZXIgdW5pcXVlIGlkICovCi0JCSoodTMyKilhcnBfcHRyID0gYXJwMTM5NC0+c2lwOwkvKiBtb3ZlIHNlbmRlciBJUCBhZGRyICovCisJCSoodTMyICopYXJwX3B0ciA9IGFycDEzOTQtPnNpcDsJLyogbW92ZSBzZW5kZXIgSVAgYWRkciAqLwogCQlhcnBfcHRyICs9IGFycC0+YXJfcGxuOwkJLyogc2tpcCBvdmVyIHNlbmRlciBJUCBhZGRyICovCiAKIAkJaWYgKGFycC0+YXJfb3AgPT0gaHRvbnMoQVJQT1BfUkVRVUVTVCkpCkBAIC05NDcsNjUgKzg3Myw2NSBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGZyYWdtZW50X292ZXJsYXAoc3RydWN0IGxpc3RfaGVhZCAqZnJhZ19saXN0LCBpbnQgb2Zmc2V0LCBpbnQgbGVuKQorc3RhdGljIGludCBmcmFnbWVudF9vdmVybGFwKHN0cnVjdCBsaXN0X2hlYWQgKmZyYWdfbGlzdCwgaW50IG9mZnNldCwgaW50IGxlbikKIHsKIAlzdHJ1Y3QgZnJhZ21lbnRfaW5mbyAqZmk7CisJaW50IGVuZCA9IG9mZnNldCArIGxlbjsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkoZmksIGZyYWdfbGlzdCwgbGlzdCkgewotCQlpZiAoICEgKChvZmZzZXQgPiAoZmktPm9mZnNldCArIGZpLT5sZW4gLSAxKSkgfHwKLQkJICAgICAgICgob2Zmc2V0ICsgbGVuIC0gMSkgPCBmaS0+b2Zmc2V0KSkpCisJbGlzdF9mb3JfZWFjaF9lbnRyeShmaSwgZnJhZ19saXN0LCBsaXN0KQorCQlpZiAob2Zmc2V0IDwgZmktPm9mZnNldCArIGZpLT5sZW4gJiYgZW5kID4gZmktPm9mZnNldCkKIAkJCXJldHVybiAxOwotCX0KKwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBsaXN0X2hlYWQgKmZpbmRfcGFydGlhbF9kYXRhZ3JhbShzdHJ1Y3QgbGlzdF9oZWFkICpwZGdsLCBpbnQgZGdsKQorc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgKmZpbmRfcGFydGlhbF9kYXRhZ3JhbShzdHJ1Y3QgbGlzdF9oZWFkICpwZGdsLCBpbnQgZGdsKQogewogCXN0cnVjdCBwYXJ0aWFsX2RhdGFncmFtICpwZDsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkocGQsIHBkZ2wsIGxpc3QpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBkLCBwZGdsLCBsaXN0KQogCQlpZiAocGQtPmRnbCA9PSBkZ2wpCiAJCQlyZXR1cm4gJnBkLT5saXN0OwotCX0KKwogCXJldHVybiBOVUxMOwogfQogCiAvKiBBc3N1bWVzIHRoYXQgbmV3IGZyYWdtZW50IGRvZXMgbm90IG92ZXJsYXAgYW55IGV4aXN0aW5nIGZyYWdtZW50cyAqLwotc3RhdGljIGlubGluZSBpbnQgbmV3X2ZyYWdtZW50KHN0cnVjdCBsaXN0X2hlYWQgKmZyYWdfaW5mbywgaW50IG9mZnNldCwgaW50IGxlbikKK3N0YXRpYyBpbnQgbmV3X2ZyYWdtZW50KHN0cnVjdCBsaXN0X2hlYWQgKmZyYWdfaW5mbywgaW50IG9mZnNldCwgaW50IGxlbikKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpsaDsKIAlzdHJ1Y3QgZnJhZ21lbnRfaW5mbyAqZmksICpmaTIsICpuZXc7CiAKIAlsaXN0X2Zvcl9lYWNoKGxoLCBmcmFnX2luZm8pIHsKIAkJZmkgPSBsaXN0X2VudHJ5KGxoLCBzdHJ1Y3QgZnJhZ21lbnRfaW5mbywgbGlzdCk7Ci0JCWlmICgoZmktPm9mZnNldCArIGZpLT5sZW4pID09IG9mZnNldCkgeworCQlpZiAoZmktPm9mZnNldCArIGZpLT5sZW4gPT0gb2Zmc2V0KSB7CiAJCQkvKiBUaGUgbmV3IGZyYWdtZW50IGNhbiBiZSB0YWNrZWQgb24gdG8gdGhlIGVuZCAqLwogCQkJZmktPmxlbiArPSBsZW47CiAJCQkvKiBEaWQgdGhlIG5ldyBmcmFnbWVudCBwbHVnIGEgaG9sZT8gKi8KIAkJCWZpMiA9IGxpc3RfZW50cnkobGgtPm5leHQsIHN0cnVjdCBmcmFnbWVudF9pbmZvLCBsaXN0KTsKLQkJCWlmICgoZmktPm9mZnNldCArIGZpLT5sZW4pID09IGZpMi0+b2Zmc2V0KSB7CisJCQlpZiAoZmktPm9mZnNldCArIGZpLT5sZW4gPT0gZmkyLT5vZmZzZXQpIHsKIAkJCQkvKiBnbHVlIGZyYWdtZW50cyB0b2dldGhlciAqLwogCQkJCWZpLT5sZW4gKz0gZmkyLT5sZW47CiAJCQkJbGlzdF9kZWwobGgtPm5leHQpOwogCQkJCWtmcmVlKGZpMik7CiAJCQl9CiAJCQlyZXR1cm4gMDsKLQkJfSBlbHNlIGlmICgob2Zmc2V0ICsgbGVuKSA9PSBmaS0+b2Zmc2V0KSB7CisJCX0gZWxzZSBpZiAob2Zmc2V0ICsgbGVuID09IGZpLT5vZmZzZXQpIHsKIAkJCS8qIFRoZSBuZXcgZnJhZ21lbnQgY2FuIGJlIHRhY2tlZCBvbiB0byB0aGUgYmVnaW5uaW5nICovCiAJCQlmaS0+b2Zmc2V0ID0gb2Zmc2V0OwogCQkJZmktPmxlbiArPSBsZW47CiAJCQkvKiBEaWQgdGhlIG5ldyBmcmFnbWVudCBwbHVnIGEgaG9sZT8gKi8KIAkJCWZpMiA9IGxpc3RfZW50cnkobGgtPnByZXYsIHN0cnVjdCBmcmFnbWVudF9pbmZvLCBsaXN0KTsKLQkJCWlmICgoZmkyLT5vZmZzZXQgKyBmaTItPmxlbikgPT0gZmktPm9mZnNldCkgeworCQkJaWYgKGZpMi0+b2Zmc2V0ICsgZmkyLT5sZW4gPT0gZmktPm9mZnNldCkgewogCQkJCS8qIGdsdWUgZnJhZ21lbnRzIHRvZ2V0aGVyICovCiAJCQkJZmkyLT5sZW4gKz0gZmktPmxlbjsKIAkJCQlsaXN0X2RlbChsaCk7CiAJCQkJa2ZyZWUoZmkpOwogCQkJfQogCQkJcmV0dXJuIDA7Ci0JCX0gZWxzZSBpZiAob2Zmc2V0ID4gKGZpLT5vZmZzZXQgKyBmaS0+bGVuKSkgeworCQl9IGVsc2UgaWYgKG9mZnNldCA+IGZpLT5vZmZzZXQgKyBmaS0+bGVuKSB7CiAJCQlicmVhazsKLQkJfSBlbHNlIGlmICgob2Zmc2V0ICsgbGVuKSA8IGZpLT5vZmZzZXQpIHsKKwkJfSBlbHNlIGlmIChvZmZzZXQgKyBsZW4gPCBmaS0+b2Zmc2V0KSB7CiAJCQlsaCA9IGxoLT5wcmV2OwogCQkJYnJlYWs7CiAJCX0KQEAgLTEwMTksMTQgKzk0NSwxMiBAQAogCW5ldy0+bGVuID0gbGVuOwogCiAJbGlzdF9hZGQoJm5ldy0+bGlzdCwgbGgpOwotCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IG5ld19wYXJ0aWFsX2RhdGFncmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJICAgICAgIHN0cnVjdCBsaXN0X2hlYWQgKnBkZ2wsIGludCBkZ2wsCi0JCQkJICAgICAgIGludCBkZ19zaXplLCBjaGFyICpmcmFnX2J1ZiwKLQkJCQkgICAgICAgaW50IGZyYWdfb2ZmLCBpbnQgZnJhZ19sZW4pCitzdGF0aWMgaW50IG5ld19wYXJ0aWFsX2RhdGFncmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBsaXN0X2hlYWQgKnBkZ2wsCisJCQkJaW50IGRnbCwgaW50IGRnX3NpemUsIGNoYXIgKmZyYWdfYnVmLAorCQkJCWludCBmcmFnX29mZiwgaW50IGZyYWdfbGVuKQogewogCXN0cnVjdCBwYXJ0aWFsX2RhdGFncmFtICpuZXc7CiAKQEAgLTEwNTksMzMgKzk4MywzMyBAQAogCW1lbWNweShuZXctPnBidWYgKyBmcmFnX29mZiwgZnJhZ19idWYsIGZyYWdfbGVuKTsKIAogCWxpc3RfYWRkKCZuZXctPmxpc3QsIHBkZ2wpOwotCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHVwZGF0ZV9wYXJ0aWFsX2RhdGFncmFtKHN0cnVjdCBsaXN0X2hlYWQgKnBkZ2wsIHN0cnVjdCBsaXN0X2hlYWQgKmxoLAotCQkJCQkgIGNoYXIgKmZyYWdfYnVmLCBpbnQgZnJhZ19vZmYsIGludCBmcmFnX2xlbikKK3N0YXRpYyBpbnQgdXBkYXRlX3BhcnRpYWxfZGF0YWdyYW0oc3RydWN0IGxpc3RfaGVhZCAqcGRnbCwgc3RydWN0IGxpc3RfaGVhZCAqbGgsCisJCQkJICAgY2hhciAqZnJhZ19idWYsIGludCBmcmFnX29mZiwgaW50IGZyYWdfbGVuKQogewotCXN0cnVjdCBwYXJ0aWFsX2RhdGFncmFtICpwZCA9IGxpc3RfZW50cnkobGgsIHN0cnVjdCBwYXJ0aWFsX2RhdGFncmFtLCBsaXN0KTsKKwlzdHJ1Y3QgcGFydGlhbF9kYXRhZ3JhbSAqcGQgPQorCQkJbGlzdF9lbnRyeShsaCwgc3RydWN0IHBhcnRpYWxfZGF0YWdyYW0sIGxpc3QpOwogCi0JaWYgKG5ld19mcmFnbWVudCgmcGQtPmZyYWdfaW5mbywgZnJhZ19vZmYsIGZyYWdfbGVuKSA8IDApIHsKKwlpZiAobmV3X2ZyYWdtZW50KCZwZC0+ZnJhZ19pbmZvLCBmcmFnX29mZiwgZnJhZ19sZW4pIDwgMCkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCiAJbWVtY3B5KHBkLT5wYnVmICsgZnJhZ19vZmYsIGZyYWdfYnVmLCBmcmFnX2xlbik7CiAKIAkvKiBNb3ZlIGxpc3QgZW50cnkgdG8gYmVnaW5uaWcgb2YgbGlzdCBzbyB0aGF0IG9sZGVzdCBwYXJ0aWFsCiAJICogZGF0YWdyYW1zIHBlcmNvbGF0ZSB0byB0aGUgZW5kIG9mIHRoZSBsaXN0ICovCiAJbGlzdF9tb3ZlKGxoLCBwZGdsKTsKLQogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBpc19kYXRhZ3JhbV9jb21wbGV0ZShzdHJ1Y3QgbGlzdF9oZWFkICpsaCwgaW50IGRnX3NpemUpCitzdGF0aWMgaW50IGlzX2RhdGFncmFtX2NvbXBsZXRlKHN0cnVjdCBsaXN0X2hlYWQgKmxoLCBpbnQgZGdfc2l6ZSkKIHsKLQlzdHJ1Y3QgcGFydGlhbF9kYXRhZ3JhbSAqcGQgPSBsaXN0X2VudHJ5KGxoLCBzdHJ1Y3QgcGFydGlhbF9kYXRhZ3JhbSwgbGlzdCk7Ci0Jc3RydWN0IGZyYWdtZW50X2luZm8gKmZpID0gbGlzdF9lbnRyeShwZC0+ZnJhZ19pbmZvLm5leHQsCi0JCQkJCSAgICAgIHN0cnVjdCBmcmFnbWVudF9pbmZvLCBsaXN0KTsKKwlzdHJ1Y3QgcGFydGlhbF9kYXRhZ3JhbSAqcGQ7CisJc3RydWN0IGZyYWdtZW50X2luZm8gKmZpOworCisJcGQgPSBsaXN0X2VudHJ5KGxoLCBzdHJ1Y3QgcGFydGlhbF9kYXRhZ3JhbSwgbGlzdCk7CisJZmkgPSBsaXN0X2VudHJ5KHBkLT5mcmFnX2luZm8ubmV4dCwgc3RydWN0IGZyYWdtZW50X2luZm8sIGxpc3QpOwogCiAJcmV0dXJuIChmaS0+bGVuID09IGRnX3NpemUpOwogfQpAQCAtMTEwOCw3ICsxMDMyLDcgQEAKIAlpZiAoIXVkKSB7CiAJCXN0cnVjdCBldGgxMzk0X25vZGVfcmVmICpub2RlOwogCQlub2RlID0gZXRoMTM5NF9maW5kX25vZGVfbm9kZWlkKCZwcml2LT5pcF9ub2RlX2xpc3QsIHNyY2lkKTsKLQkJaWYgKCFub2RlKSB7CisJCWlmICh1bmxpa2VseSghbm9kZSkpIHsKIAkJCUhQU0JfUFJJTlQoS0VSTl9FUlIsICJldGhlcjEzOTQgcng6IHNlbmRlciBub2RlaWQgIgogCQkJCSAgICJsb29rdXAgZmFpbHVyZTogIiBOT0RFX0JVU19GTVQsCiAJCQkJICAgTk9ERV9CVVNfQVJHUyhwcml2LT5ob3N0LCBzcmNpZCkpOwpAQCAtMTEyMCw3ICsxMDQ0LDcgQEAKIAkJcHJpdi0+dWRfbGlzdFtOT0RFSURfVE9fTk9ERShzcmNpZCldID0gdWQ7CiAJfQogCi0Jbm9kZV9pbmZvID0gKHN0cnVjdCBldGgxMzk0X25vZGVfaW5mbyopdWQtPmRldmljZS5kcml2ZXJfZGF0YTsKKwlub2RlX2luZm8gPSAoc3RydWN0IGV0aDEzOTRfbm9kZV9pbmZvICopdWQtPmRldmljZS5kcml2ZXJfZGF0YTsKIAogCS8qIEZpcnN0LCBkaWQgd2UgcmVjZWl2ZSBhIGZyYWdtZW50ZWQgb3IgdW5mcmFnbWVudGVkIGRhdGFncmFtPyAqLwogCWhkci0+d29yZHMud29yZDEgPSBudG9ocyhoZHItPndvcmRzLndvcmQxKTsKQEAgLTExMzMsMTMgKzEwNTcsMTQgQEAKIAkJICogaGlnaCBsZXZlbCBuZXR3b3JrIGxheWVyLiAqLwogCiAJCXNrYiA9IGRldl9hbGxvY19za2IobGVuICsgZGV2LT5oYXJkX2hlYWRlcl9sZW4gKyAxNSk7Ci0JCWlmICghc2tiKSB7Ci0JCQlIUFNCX1BSSU5UIChLRVJOX0VSUiwgImV0aGVyMTM5NCByeDogbG93IG9uIG1lbVxuIik7CisJCWlmICh1bmxpa2VseSghc2tiKSkgeworCQkJRVRIMTM5NF9QUklOVF9HKEtFUk5fRVJSLCAiT3V0IG9mIG1lbW9yeVxuIik7CiAJCQlwcml2LT5zdGF0cy5yeF9kcm9wcGVkKys7CiAJCQlyZXR1cm4gLTE7CiAJCX0KIAkJc2tiX3Jlc2VydmUoc2tiLCAoZGV2LT5oYXJkX2hlYWRlcl9sZW4gKyAxNSkgJiB+MTUpOwotCQltZW1jcHkoc2tiX3B1dChza2IsIGxlbiAtIGhkcl9sZW4pLCBidWYgKyBoZHJfbGVuLCBsZW4gLSBoZHJfbGVuKTsKKwkJbWVtY3B5KHNrYl9wdXQoc2tiLCBsZW4gLSBoZHJfbGVuKSwgYnVmICsgaGRyX2xlbiwKKwkJICAgICAgIGxlbiAtIGhkcl9sZW4pOwogCQlldGhlcl90eXBlID0gaGRyLT51Zi5ldGhlcl90eXBlOwogCX0gZWxzZSB7CiAJCS8qIEEgZGF0YWdyYW0gZnJhZ21lbnQgaGFzIGJlZW4gcmVjZWl2ZWQsIG5vdyB0aGUgZnVuIGJlZ2lucy4gKi8KQEAgLTEyMjQsOSArMTE0OSw4IEBACiAKIAkJcGQgPSBsaXN0X2VudHJ5KGxoLCBzdHJ1Y3QgcGFydGlhbF9kYXRhZ3JhbSwgbGlzdCk7CiAKLQkJaWYgKGhkci0+Y29tbW9uLmxmID09IEVUSDEzOTRfSERSX0xGX0ZGKSB7CisJCWlmIChoZHItPmNvbW1vbi5sZiA9PSBFVEgxMzk0X0hEUl9MRl9GRikKIAkJCXBkLT5ldGhlcl90eXBlID0gZXRoZXJfdHlwZTsKLQkJfQogCiAJCWlmIChpc19kYXRhZ3JhbV9jb21wbGV0ZShsaCwgZGdfc2l6ZSkpIHsKIAkJCWV0aGVyX3R5cGUgPSBwZC0+ZXRoZXJfdHlwZTsKQEAgLTEyNTMsOCArMTE3Nyw4IEBACiAJc2tiLT5wcm90b2NvbCA9IGV0aGVyMTM5NF9wYXJzZV9lbmNhcChza2IsIGRldiwgc3JjaWQsIGRlc3RpZCwKIAkJCQkJICAgICAgZXRoZXJfdHlwZSk7CiAKLQogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisKIAlpZiAoIXNrYi0+cHJvdG9jb2wpIHsKIAkJcHJpdi0+c3RhdHMucnhfZXJyb3JzKys7CiAJCXByaXYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKQEAgLTEyODgsOSArMTIxMiw5IEBACiAJc3RydWN0IGV0aDEzOTRfaG9zdF9pbmZvICpoaTsKIAogCWhpID0gaHBzYl9nZXRfaG9zdGluZm8oJmV0aDEzOTRfaGlnaGxldmVsLCBob3N0KTsKLQlpZiAoaGkgPT0gTlVMTCkgewotCQlFVEgxMzk0X1BSSU5UX0coS0VSTl9FUlIsICJDb3VsZCBub3QgZmluZCBuZXQgZGV2aWNlIGZvciBob3N0ICVzXG4iLAotCQkJCWhvc3QtPmRyaXZlci0+bmFtZSk7CisJaWYgKHVubGlrZWx5KCFoaSkpIHsKKwkJRVRIMTM5NF9QUklOVF9HKEtFUk5fRVJSLCAiTm8gbmV0IGRldmljZSBhdCBmdy1ob3N0JWRcbiIsCisJCQkJaG9zdC0+aWQpOwogCQlyZXR1cm4gUkNPREVfQUREUkVTU19FUlJPUjsKIAl9CiAKQEAgLTEzMTQsOSArMTIzOCw5IEBACiAJaW50IG5yZWFkeTsKIAogCWhpID0gaHBzYl9nZXRfaG9zdGluZm8oJmV0aDEzOTRfaGlnaGxldmVsLCBpc28tPmhvc3QpOwotCWlmIChoaSA9PSBOVUxMKSB7Ci0JCUVUSDEzOTRfUFJJTlRfRyhLRVJOX0VSUiwgIkNvdWxkIG5vdCBmaW5kIG5ldCBkZXZpY2UgZm9yIGhvc3QgJXNcbiIsCi0JCQkJaXNvLT5ob3N0LT5kcml2ZXItPm5hbWUpOworCWlmICh1bmxpa2VseSghaGkpKSB7CisJCUVUSDEzOTRfUFJJTlRfRyhLRVJOX0VSUiwgIk5vIG5ldCBkZXZpY2UgYXQgZnctaG9zdCVkXG4iLAorCQkJCWlzby0+aG9zdC0+aWQpOwogCQlyZXR1cm47CiAJfQogCkBAIC0xMzI2LDIwICsxMjUwLDIwIEBACiAJZm9yIChpID0gMDsgaSA8IG5yZWFkeTsgaSsrKSB7CiAJCXN0cnVjdCBocHNiX2lzb19wYWNrZXRfaW5mbyAqaW5mbyA9CiAJCQkmaXNvLT5pbmZvc1soaXNvLT5maXJzdF9wYWNrZXQgKyBpKSAlIGlzby0+YnVmX3BhY2tldHNdOwotCQlkYXRhID0gKHF1YWRsZXRfdCopIChpc28tPmRhdGFfYnVmLmt2aXJ0ICsgaW5mby0+b2Zmc2V0KTsKKwkJZGF0YSA9IChxdWFkbGV0X3QgKikoaXNvLT5kYXRhX2J1Zi5rdmlydCArIGluZm8tPm9mZnNldCk7CiAKIAkJLyogc2tpcCBvdmVyIEdBU1AgaGVhZGVyICovCiAJCWJ1ZiA9IChjaGFyICopZGF0YSArIDg7CiAJCWxlbiA9IGluZm8tPmxlbiAtIDg7CiAKLQkJc3BlY2lmaWVyX2lkID0gKCgoYmUzMl90b19jcHUoZGF0YVswXSkgJiAweGZmZmYpIDw8IDgpIHwKLQkJCQkoKGJlMzJfdG9fY3B1KGRhdGFbMV0pICYgMHhmZjAwMDAwMCkgPj4gMjQpKTsKKwkJc3BlY2lmaWVyX2lkID0gKGJlMzJfdG9fY3B1KGRhdGFbMF0pICYgMHhmZmZmKSA8PCA4IHwKKwkJCSAgICAgICAoYmUzMl90b19jcHUoZGF0YVsxXSkgJiAweGZmMDAwMDAwKSA+PiAyNDsKIAkJc291cmNlX2lkID0gYmUzMl90b19jcHUoZGF0YVswXSkgPj4gMTY7CiAKIAkJcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAKLQkJaWYgKGluZm8tPmNoYW5uZWwgIT0gKGlzby0+aG9zdC0+Y3NyLmJyb2FkY2FzdF9jaGFubmVsICYgMHgzZikgfHwKLQkJICAgc3BlY2lmaWVyX2lkICE9IEVUSEVSMTM5NF9HQVNQX1NQRUNJRklFUl9JRCkgeworCQlpZiAoaW5mby0+Y2hhbm5lbCAhPSAoaXNvLT5ob3N0LT5jc3IuYnJvYWRjYXN0X2NoYW5uZWwgJiAweDNmKQorCQkgICAgfHwgc3BlY2lmaWVyX2lkICE9IEVUSEVSMTM5NF9HQVNQX1NQRUNJRklFUl9JRCkgewogCQkJLyogVGhpcyBwYWNrZXQgaXMgbm90IGZvciB1cyAqLwogCQkJY29udGludWU7CiAJCX0KQEAgLTEzNjcsMzUgKzEyOTEsMzEgQEAKICAqIHNwZWVkLCBhbmQgdW5pY2FzdCBGSUZPIGFkZHJlc3MgaW5mb3JtYXRpb24gYmV0d2VlbiB0aGUgc2VuZGVyX3VuaXF1ZV9pZAogICogYW5kIHRoZSBJUCBhZGRyZXNzZXMuCiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBldGhlcjEzOTRfYXJwX3RvXzEzOTRhcnAoc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkJICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBldGhlcjEzOTRfYXJwX3RvXzEzOTRhcnAoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGV0aDEzOTRfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7Ci0KIAlzdHJ1Y3QgYXJwaGRyICphcnAgPSAoc3RydWN0IGFycGhkciAqKXNrYi0+ZGF0YTsKIAl1bnNpZ25lZCBjaGFyICphcnBfcHRyID0gKHVuc2lnbmVkIGNoYXIgKikoYXJwICsgMSk7CiAJc3RydWN0IGV0aDEzOTRfYXJwICphcnAxMzk0ID0gKHN0cnVjdCBldGgxMzk0X2FycCAqKXNrYi0+ZGF0YTsKIAotCS8qIEJlbGlldmUgaXQgb3Igbm90LCBhbGwgdGhhdCBuZWVkIHRvIGhhcHBlbiBpcyBzZW5kZXIgSVAgZ2V0IG1vdmVkCi0JICogYW5kIHNldCBod19hZGRyX2xlbiwgbWF4X3JlYywgc3NwZCwgZmlmb19oaSBhbmQgZmlmb19sby4gICovCiAJYXJwMTM5NC0+aHdfYWRkcl9sZW4JPSAxNjsKIAlhcnAxMzk0LT5zaXAJCT0gKih1MzIqKShhcnBfcHRyICsgRVRIMTM5NF9BTEVOKTsKIAlhcnAxMzk0LT5tYXhfcmVjCT0gcHJpdi0+aG9zdC0+Y3NyLm1heF9yZWM7CiAJYXJwMTM5NC0+c3NwZAkJPSBwcml2LT5ob3N0LT5jc3IubG5rX3NwZDsKLQlhcnAxMzk0LT5maWZvX2hpCT0gaHRvbnMgKHByaXYtPmxvY2FsX2ZpZm8gPj4gMzIpOwotCWFycDEzOTQtPmZpZm9fbG8JPSBodG9ubCAocHJpdi0+bG9jYWxfZmlmbyAmIH4weDApOwotCi0JcmV0dXJuOworCWFycDEzOTQtPmZpZm9faGkJPSBodG9ucyhwcml2LT5sb2NhbF9maWZvID4+IDMyKTsKKwlhcnAxMzk0LT5maWZvX2xvCT0gaHRvbmwocHJpdi0+bG9jYWxfZmlmbyAmIH4weDApOwogfQogCiAvKiBXZSBuZWVkIHRvIGVuY2Fwc3VsYXRlIHRoZSBzdGFuZGFyZCBoZWFkZXIgd2l0aCBvdXIgb3duLiBXZSB1c2UgdGhlCiAgKiBldGhlcm5ldCBoZWFkZXIncyBwcm90byBmb3Igb3VyIG93bi4gKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGV0aGVyMTM5NF9lbmNhcHN1bGF0ZV9wcmVwKHVuc2lnbmVkIGludCBtYXhfcGF5bG9hZCwKLQkJCQkJCSAgICAgIF9fYmUxNiBwcm90bywKLQkJCQkJCSAgICAgIHVuaW9uIGV0aDEzOTRfaGRyICpoZHIsCi0JCQkJCQkgICAgICB1MTYgZGdfc2l6ZSwgdTE2IGRnbCkKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZXRoZXIxMzk0X2VuY2Fwc3VsYXRlX3ByZXAodW5zaWduZWQgaW50IG1heF9wYXlsb2FkLAorCQkJCQkgICAgICAgX19iZTE2IHByb3RvLAorCQkJCQkgICAgICAgdW5pb24gZXRoMTM5NF9oZHIgKmhkciwKKwkJCQkJICAgICAgIHUxNiBkZ19zaXplLCB1MTYgZGdsKQogewotCXVuc2lnbmVkIGludCBhZGpfbWF4X3BheWxvYWQgPSBtYXhfcGF5bG9hZCAtIGhkcl90eXBlX2xlbltFVEgxMzk0X0hEUl9MRl9VRl07CisJdW5zaWduZWQgaW50IGFkal9tYXhfcGF5bG9hZCA9CisJCQkJbWF4X3BheWxvYWQgLSBoZHJfdHlwZV9sZW5bRVRIMTM5NF9IRFJfTEZfVUZdOwogCiAJLyogRG9lcyBpdCBhbGwgZml0IGluIG9uZSBwYWNrZXQ/ICovCiAJaWYgKGRnX3NpemUgPD0gYWRqX21heF9wYXlsb2FkKSB7CkBAIC0xNDA4LDE5ICsxMzI4LDE5IEBACiAJCWhkci0+ZmYuZGdsID0gZGdsOwogCQlhZGpfbWF4X3BheWxvYWQgPSBtYXhfcGF5bG9hZCAtIGhkcl90eXBlX2xlbltFVEgxMzk0X0hEUl9MRl9GRl07CiAJfQotCXJldHVybigoZGdfc2l6ZSArIChhZGpfbWF4X3BheWxvYWQgLSAxKSkgLyBhZGpfbWF4X3BheWxvYWQpOworCXJldHVybiAoZGdfc2l6ZSArIGFkal9tYXhfcGF5bG9hZCAtIDEpIC8gYWRqX21heF9wYXlsb2FkOwogfQogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBldGhlcjEzOTRfZW5jYXBzdWxhdGUoc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkJCSB1bnNpZ25lZCBpbnQgbWF4X3BheWxvYWQsCi0JCQkJCQkgdW5pb24gZXRoMTM5NF9oZHIgKmhkcikKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZXRoZXIxMzk0X2VuY2Fwc3VsYXRlKHN0cnVjdCBza19idWZmICpza2IsCisJCQkJCSAgdW5zaWduZWQgaW50IG1heF9wYXlsb2FkLAorCQkJCQkgIHVuaW9uIGV0aDEzOTRfaGRyICpoZHIpCiB7CiAJdW5pb24gZXRoMTM5NF9oZHIgKmJ1ZmhkcjsKIAlpbnQgZnR5cGUgPSBoZHItPmNvbW1vbi5sZjsKIAlpbnQgaGRyc3ogPSBoZHJfdHlwZV9sZW5bZnR5cGVdOwogCXVuc2lnbmVkIGludCBhZGpfbWF4X3BheWxvYWQgPSBtYXhfcGF5bG9hZCAtIGhkcnN6OwogCi0Jc3dpdGNoKGZ0eXBlKSB7CisJc3dpdGNoIChmdHlwZSkgewogCWNhc2UgRVRIMTM5NF9IRFJfTEZfVUY6CiAJCWJ1ZmhkciA9ICh1bmlvbiBldGgxMzk0X2hkciAqKXNrYl9wdXNoKHNrYiwgaGRyc3opOwogCQlidWZoZHItPndvcmRzLndvcmQxID0gaHRvbnMoaGRyLT53b3Jkcy53b3JkMSk7CkBAIC0xNDQ5LDExICsxMzY5LDEwIEBACiAJCWJ1Zmhkci0+d29yZHMud29yZDMgPSBodG9ucyhoZHItPndvcmRzLndvcmQzKTsKIAkJYnVmaGRyLT53b3Jkcy53b3JkNCA9IDA7CiAJfQotCiAJcmV0dXJuIG1pbihtYXhfcGF5bG9hZCwgc2tiLT5sZW4pOwogfQogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBocHNiX3BhY2tldCAqZXRoZXIxMzk0X2FsbG9jX2NvbW1vbl9wYWNrZXQoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCkKK3N0YXRpYyBzdHJ1Y3QgaHBzYl9wYWNrZXQgKmV0aGVyMTM5NF9hbGxvY19jb21tb25fcGFja2V0KHN0cnVjdCBocHNiX2hvc3QgKmhvc3QpCiB7CiAJc3RydWN0IGhwc2JfcGFja2V0ICpwOwogCkBAIC0xNDY2LDYxICsxMzg1LDU3IEBACiAJcmV0dXJuIHA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGV0aGVyMTM5NF9wcmVwX3dyaXRlX3BhY2tldChzdHJ1Y3QgaHBzYl9wYWNrZXQgKnAsCi0JCQkJCSAgICAgIHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsCi0JCQkJCSAgICAgIG5vZGVpZF90IG5vZGUsIHU2NCBhZGRyLAotCQkJCQkgICAgICB2b2lkICogZGF0YSwgaW50IHR4X2xlbikKK3N0YXRpYyBpbnQgZXRoZXIxMzk0X3ByZXBfd3JpdGVfcGFja2V0KHN0cnVjdCBocHNiX3BhY2tldCAqcCwKKwkJCQkgICAgICAgc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwgbm9kZWlkX3Qgbm9kZSwKKwkJCQkgICAgICAgdTY0IGFkZHIsIHZvaWQgKmRhdGEsIGludCB0eF9sZW4pCiB7CiAJcC0+bm9kZV9pZCA9IG5vZGU7CiAJcC0+ZGF0YSA9IE5VTEw7CiAKIAlwLT50Y29kZSA9IFRDT0RFX1dSSVRFQjsKLQlwLT5oZWFkZXJbMV0gPSAoaG9zdC0+bm9kZV9pZCA8PCAxNikgfCAoYWRkciA+PiAzMik7CisJcC0+aGVhZGVyWzFdID0gaG9zdC0+bm9kZV9pZCA8PCAxNiB8IGFkZHIgPj4gMzI7CiAJcC0+aGVhZGVyWzJdID0gYWRkciAmIDB4ZmZmZmZmZmY7CiAKIAlwLT5oZWFkZXJfc2l6ZSA9IDE2OwogCXAtPmV4cGVjdF9yZXNwb25zZSA9IDE7CiAKIAlpZiAoaHBzYl9nZXRfdGxhYmVsKHApKSB7Ci0JCUVUSDEzOTRfUFJJTlRfRyhLRVJOX0VSUiwgIk5vIG1vcmUgdGxhYmVscyBsZWZ0IHdoaWxlIHNlbmRpbmcgIgotCQkJCSJ0byBub2RlICIgTk9ERV9CVVNfRk1UICJcbiIsIE5PREVfQlVTX0FSR1MoaG9zdCwgbm9kZSkpOworCQlFVEgxMzk0X1BSSU5UX0coS0VSTl9FUlIsICJPdXQgb2YgdGxhYmVsc1xuIik7CiAJCXJldHVybiAtMTsKIAl9Ci0JcC0+aGVhZGVyWzBdID0gKHAtPm5vZGVfaWQgPDwgMTYpIHwgKHAtPnRsYWJlbCA8PCAxMCkKLQkJfCAoMSA8PCA4KSB8IChUQ09ERV9XUklURUIgPDwgNCk7CisJcC0+aGVhZGVyWzBdID0KKwkJcC0+bm9kZV9pZCA8PCAxNiB8IHAtPnRsYWJlbCA8PCAxMCB8IDEgPDwgOCB8IFRDT0RFX1dSSVRFQiA8PCA0OwogCiAJcC0+aGVhZGVyWzNdID0gdHhfbGVuIDw8IDE2OwogCXAtPmRhdGFfc2l6ZSA9ICh0eF9sZW4gKyAzKSAmIH4zOwotCXAtPmRhdGEgPSAocXVhZGxldF90KilkYXRhOworCXAtPmRhdGEgPSBkYXRhOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBldGhlcjEzOTRfcHJlcF9nYXNwX3BhY2tldChzdHJ1Y3QgaHBzYl9wYWNrZXQgKnAsCi0JCQkJCSAgICAgIHN0cnVjdCBldGgxMzk0X3ByaXYgKnByaXYsCi0JCQkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IsIGludCBsZW5ndGgpCitzdGF0aWMgdm9pZCBldGhlcjEzOTRfcHJlcF9nYXNwX3BhY2tldChzdHJ1Y3QgaHBzYl9wYWNrZXQgKnAsCisJCQkJICAgICAgIHN0cnVjdCBldGgxMzk0X3ByaXYgKnByaXYsCisJCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IsIGludCBsZW5ndGgpCiB7CiAJcC0+aGVhZGVyX3NpemUgPSA0OwogCXAtPnRjb2RlID0gVENPREVfU1RSRUFNX0RBVEE7CiAKLQlwLT5oZWFkZXJbMF0gPSAobGVuZ3RoIDw8IDE2KSB8ICgzIDw8IDE0KQotCQl8ICgocHJpdi0+YnJvYWRjYXN0X2NoYW5uZWwpIDw8IDgpCi0JCXwgKFRDT0RFX1NUUkVBTV9EQVRBIDw8IDQpOworCXAtPmhlYWRlclswXSA9IGxlbmd0aCA8PCAxNiB8IDMgPDwgMTQgfCBwcml2LT5icm9hZGNhc3RfY2hhbm5lbCA8PCA4IHwKKwkJICAgICAgIFRDT0RFX1NUUkVBTV9EQVRBIDw8IDQ7CiAJcC0+ZGF0YV9zaXplID0gbGVuZ3RoOwotCXAtPmRhdGEgPSAoKHF1YWRsZXRfdCopc2tiLT5kYXRhKSAtIDI7Ci0JcC0+ZGF0YVswXSA9IGNwdV90b19iZTMyKChwcml2LT5ob3N0LT5ub2RlX2lkIDw8IDE2KSB8CisJcC0+ZGF0YSA9IChxdWFkbGV0X3QgKilza2ItPmRhdGEgLSAyOworCXAtPmRhdGFbMF0gPSBjcHVfdG9fYmUzMihwcml2LT5ob3N0LT5ub2RlX2lkIDw8IDE2IHwKIAkJCQkgRVRIRVIxMzk0X0dBU1BfU1BFQ0lGSUVSX0lEX0hJKTsKLQlwLT5kYXRhWzFdID0gY3B1X3RvX2JlMzIoKEVUSEVSMTM5NF9HQVNQX1NQRUNJRklFUl9JRF9MTyA8PCAyNCkgfAorCXAtPmRhdGFbMV0gPSBjcHVfdG9fYmUzMihFVEhFUjEzOTRfR0FTUF9TUEVDSUZJRVJfSURfTE8gPDwgMjQgfAogCQkJCSBFVEhFUjEzOTRfR0FTUF9WRVJTSU9OKTsKIAotCS8qIFNldHRpbmcgdGhlIG5vZGUgaWQgdG8gQUxMX05PREVTIChub3QgTE9DQUxfQlVTIHwgQUxMX05PREVTKQotCSAqIHByZXZlbnRzIGhwc2Jfc2VuZF9wYWNrZXQoKSBmcm9tIHNldHRpbmcgdGhlIHNwZWVkIHRvIGFuIGFyYml0cmFyeQotCSAqIHZhbHVlIGJhc2VkIG9uIHBhY2tldC0+bm9kZV9pZCBpZiBwYWNrZXQtPm5vZGVfaWQgaXMgbm90IHNldC4gKi8KLQlwLT5ub2RlX2lkID0gQUxMX05PREVTOwogCXAtPnNwZWVkX2NvZGUgPSBwcml2LT5iY19zc3BkOworCisJLyogcHJldmVudCBocHNiX3NlbmRfcGFja2V0KCkgZnJvbSBvdmVycmlkaW5nIG91ciBzcGVlZCBjb2RlICovCisJcC0+bm9kZV9pZCA9IExPQ0FMX0JVUyB8IEFMTF9OT0RFUzsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGV0aGVyMTM5NF9mcmVlX3BhY2tldChzdHJ1Y3QgaHBzYl9wYWNrZXQgKnBhY2tldCkKK3N0YXRpYyB2b2lkIGV0aGVyMTM5NF9mcmVlX3BhY2tldChzdHJ1Y3QgaHBzYl9wYWNrZXQgKnBhY2tldCkKIHsKIAlpZiAocGFja2V0LT50Y29kZSAhPSBUQ09ERV9TVFJFQU1fREFUQSkKIAkJaHBzYl9mcmVlX3RsYWJlbChwYWNrZXQpOwpAQCAtMTUzOSw3ICsxNDU0LDcgQEAKIAkJcmV0dXJuIC0xOwogCiAJaWYgKHB0YXNrLT50eF90eXBlID09IEVUSDEzOTRfR0FTUCkgewotCQlpbnQgbGVuZ3RoID0gdHhfbGVuICsgKDIgKiBzaXplb2YocXVhZGxldF90KSk7CisJCWludCBsZW5ndGggPSB0eF9sZW4gKyAyICogc2l6ZW9mKHF1YWRsZXRfdCk7CiAKIAkJZXRoZXIxMzk0X3ByZXBfZ2FzcF9wYWNrZXQocGFja2V0LCBwcml2LCBwdGFzay0+c2tiLCBsZW5ndGgpOwogCX0gZWxzZSBpZiAoZXRoZXIxMzk0X3ByZXBfd3JpdGVfcGFja2V0KHBhY2tldCwgcHJpdi0+aG9zdCwKQEAgLTE1NjIsMTMgKzE0NzcsMTEgQEAKIAlyZXR1cm4gMDsKIH0KIAotCiAvKiBUYXNrIGZ1bmN0aW9uIHRvIGJlIHJ1biB3aGVuIGEgZGF0YWdyYW0gdHJhbnNtaXNzaW9uIGlzIGNvbXBsZXRlZCAqLwotc3RhdGljIGlubGluZSB2b2lkIGV0aGVyMTM5NF9kZ19jb21wbGV0ZShzdHJ1Y3QgcGFja2V0X3Rhc2sgKnB0YXNrLCBpbnQgZmFpbCkKK3N0YXRpYyB2b2lkIGV0aGVyMTM5NF9kZ19jb21wbGV0ZShzdHJ1Y3QgcGFja2V0X3Rhc2sgKnB0YXNrLCBpbnQgZmFpbCkKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcHRhc2stPnNrYjsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gc2tiLT5kZXY7Ci0Jc3RydWN0IGV0aDEzOTRfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGV0aDEzOTRfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KHNrYi0+ZGV2KTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJLyogU3RhdGlzdGljcyAqLwpAQCAtMTU4Niw3ICsxNDk5LDYgQEAKIAlrbWVtX2NhY2hlX2ZyZWUocGFja2V0X3Rhc2tfY2FjaGUsIHB0YXNrKTsKIH0KIAotCiAvKiBDYWxsYmFjayBmb3Igd2hlbiBhIHBhY2tldCBoYXMgYmVlbiBzZW50IGFuZCB0aGUgc3RhdHVzIG9mIHRoYXQgcGFja2V0IGlzCiAgKiBrbm93biAqLwogc3RhdGljIHZvaWQgZXRoZXIxMzk0X2NvbXBsZXRlX2NiKHZvaWQgKl9fcHRhc2spCkBAIC0xNjE0LDE5ICsxNTI2LDE1IEBACiAJfQogfQogCi0KLQogLyogVHJhbnNtaXQgYSBwYWNrZXQgKGNhbGxlZCBieSBrZXJuZWwpICovCi1zdGF0aWMgaW50IGV0aGVyMTM5NF90eCAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgZXRoZXIxMzk0X3R4KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0JZ2ZwX3Qga21mbGFncyA9IGluX2ludGVycnVwdCgpID8gR0ZQX0FUT01JQyA6IEdGUF9LRVJORUw7CiAJc3RydWN0IGV0aDEzOTRoZHIgKmV0aDsKIAlzdHJ1Y3QgZXRoMTM5NF9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlfX2JlMTYgcHJvdG87CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlub2RlaWRfdCBkZXN0X25vZGU7CiAJZXRoMTM5NF90eF90eXBlIHR4X3R5cGU7Ci0JaW50IHJldCA9IDA7CiAJdW5zaWduZWQgaW50IHR4X2xlbjsKIAl1bnNpZ25lZCBpbnQgbWF4X3BheWxvYWQ7CiAJdTE2IGRnX3NpemU7CkBAIC0xNjM1LDI5ICsxNTQzLDI0IEBACiAJc3RydWN0IGV0aDEzOTRfbm9kZV9yZWYgKm5vZGU7CiAJc3RydWN0IGV0aDEzOTRfbm9kZV9pbmZvICpub2RlX2luZm8gPSBOVUxMOwogCi0JcHRhc2sgPSBrbWVtX2NhY2hlX2FsbG9jKHBhY2tldF90YXNrX2NhY2hlLCBrbWZsYWdzKTsKLQlpZiAocHRhc2sgPT0gTlVMTCkgewotCQlyZXQgPSAtRU5PTUVNOworCXB0YXNrID0ga21lbV9jYWNoZV9hbGxvYyhwYWNrZXRfdGFza19jYWNoZSwgR0ZQX0FUT01JQyk7CisJaWYgKHB0YXNrID09IE5VTEwpCiAJCWdvdG8gZmFpbDsKLQl9CiAKIAkvKiBYWFggSWdub3JlIHRoaXMgZm9yIG5vdy4gTm90aWNlZCB0aGF0IHdoZW4gTWFjT1NYIGlzIHRoZSBJUk0sCiAJICogaXQgZG9lcyBub3Qgc2V0IG91ciB2YWxpZGl0eSBiaXQuIFdlIG5lZWQgdG8gY29tcGVuc2F0ZSBmb3IKIAkgKiB0aGF0IHNvbWV3aGVyZSBlbHNlLCBidXQgbm90IGluIGV0aDEzOTQuICovCiAjaWYgMAotCWlmICgocHJpdi0+aG9zdC0+Y3NyLmJyb2FkY2FzdF9jaGFubmVsICYgMHhjMDAwMDAwMCkgIT0gMHhjMDAwMDAwMCkgewotCQlyZXQgPSAtRUFHQUlOOworCWlmICgocHJpdi0+aG9zdC0+Y3NyLmJyb2FkY2FzdF9jaGFubmVsICYgMHhjMDAwMDAwMCkgIT0gMHhjMDAwMDAwMCkKIAkJZ290byBmYWlsOwotCX0KICNlbmRpZgogCi0JaWYgKChza2IgPSBza2Jfc2hhcmVfY2hlY2sgKHNrYiwga21mbGFncykpID09IE5VTEwpIHsKLQkJcmV0ID0gLUVOT01FTTsKKwlza2IgPSBza2Jfc2hhcmVfY2hlY2soc2tiLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXNrYikKIAkJZ290byBmYWlsOwotCX0KIAogCS8qIEdldCByaWQgb2YgdGhlIGZha2UgZXRoMTM5NCBoZWFkZXIsIGJ1dCBzYXZlIGEgcG9pbnRlciAqLwotCWV0aCA9IChzdHJ1Y3QgZXRoMTM5NGhkciopc2tiLT5kYXRhOworCWV0aCA9IChzdHJ1Y3QgZXRoMTM5NGhkciAqKXNrYi0+ZGF0YTsKIAlza2JfcHVsbChza2IsIEVUSDEzOTRfSExFTik7CiAKIAlwcm90byA9IGV0aC0+aF9wcm90bzsKQEAgLTE2NjgsMTEgKzE1NzEsMTEgQEAKIAlpZiAobWVtY21wKGV0aC0+aF9kZXN0LCBkZXYtPmJyb2FkY2FzdCwgRVRIMTM5NF9BTEVOKSA9PSAwIHx8CiAJICAgIHByb3RvID09IGh0b25zKEVUSF9QX0FSUCkgfHwKIAkgICAgKHByb3RvID09IGh0b25zKEVUSF9QX0lQKSAmJgotCSAgICAgSU5fTVVMVElDQVNUKG50b2hsKHNrYi0+bmguaXBoLT5kYWRkcikpKSkgeworCSAgICAgSU5fTVVMVElDQVNUKG50b2hsKGlwX2hkcihza2IpLT5kYWRkcikpKSkgewogCQl0eF90eXBlID0gRVRIMTM5NF9HQVNQOwogCQlkZXN0X25vZGUgPSBMT0NBTF9CVVMgfCBBTExfTk9ERVM7CiAJCW1heF9wYXlsb2FkID0gcHJpdi0+YmNfbWF4cGF5bG9hZCAtIEVUSEVSMTM5NF9HQVNQX09WRVJIRUFEOwotCQlCVUdfT04obWF4X3BheWxvYWQgPCAoNTEyIC0gRVRIRVIxMzk0X0dBU1BfT1ZFUkhFQUQpKTsKKwkJQlVHX09OKG1heF9wYXlsb2FkIDwgNTEyIC0gRVRIRVIxMzk0X0dBU1BfT1ZFUkhFQUQpOwogCQlkZ2wgPSBwcml2LT5iY19kZ2w7CiAJCWlmIChtYXhfcGF5bG9hZCA8IGRnX3NpemUgKyBoZHJfdHlwZV9sZW5bRVRIMTM5NF9IRFJfTEZfVUZdKQogCQkJcHJpdi0+YmNfZGdsKys7CkBAIC0xNjgxLDE5ICsxNTg0LDE3IEBACiAKIAkJbm9kZSA9IGV0aDEzOTRfZmluZF9ub2RlX2d1aWQoJnByaXYtPmlwX25vZGVfbGlzdCwKIAkJCQkJICAgICAgYmU2NF90b19jcHUoZ3VpZCkpOwotCQlpZiAoIW5vZGUpIHsKLQkJCXJldCA9IC1FQUdBSU47CisJCWlmICghbm9kZSkKIAkJCWdvdG8gZmFpbDsKLQkJfQotCQlub2RlX2luZm8gPSAoc3RydWN0IGV0aDEzOTRfbm9kZV9pbmZvKilub2RlLT51ZC0+ZGV2aWNlLmRyaXZlcl9kYXRhOwotCQlpZiAobm9kZV9pbmZvLT5maWZvID09IENTUjEyMTJfSU5WQUxJRF9BRERSX1NQQUNFKSB7Ci0JCQlyZXQgPSAtRUFHQUlOOworCisJCW5vZGVfaW5mbyA9CisJCSAgICAoc3RydWN0IGV0aDEzOTRfbm9kZV9pbmZvICopbm9kZS0+dWQtPmRldmljZS5kcml2ZXJfZGF0YTsKKwkJaWYgKG5vZGVfaW5mby0+ZmlmbyA9PSBDU1IxMjEyX0lOVkFMSURfQUREUl9TUEFDRSkKIAkJCWdvdG8gZmFpbDsKLQkJfQogCiAJCWRlc3Rfbm9kZSA9IG5vZGUtPnVkLT5uZS0+bm9kZWlkOwogCQltYXhfcGF5bG9hZCA9IG5vZGVfaW5mby0+bWF4cGF5bG9hZDsKLQkJQlVHX09OKG1heF9wYXlsb2FkIDwgKDUxMiAtIEVUSEVSMTM5NF9HQVNQX09WRVJIRUFEKSk7CisJCUJVR19PTihtYXhfcGF5bG9hZCA8IDUxMiAtIEVUSEVSMTM5NF9HQVNQX09WRVJIRUFEKTsKIAogCQlkZ2wgPSBub2RlX2luZm8tPmRnbDsKIAkJaWYgKG1heF9wYXlsb2FkIDwgZGdfc2l6ZSArIGhkcl90eXBlX2xlbltFVEgxMzk0X0hEUl9MRl9VRl0pCkBAIC0xNzAzLDcgKzE2MDQsNyBAQAogCiAJLyogSWYgdGhpcyBpcyBhbiBBUlAgcGFja2V0LCBjb252ZXJ0IGl0ICovCiAJaWYgKHByb3RvID09IGh0b25zKEVUSF9QX0FSUCkpCi0JCWV0aGVyMTM5NF9hcnBfdG9fMTM5NGFycCAoc2tiLCBkZXYpOworCQlldGhlcjEzOTRfYXJwX3RvXzEzOTRhcnAoc2tiLCBkZXYpOwogCiAJcHRhc2stPmhkci53b3Jkcy53b3JkMSA9IDA7CiAJcHRhc2stPmhkci53b3Jkcy53b3JkMiA9IDA7CkBAIC0xNzI2LDkgKzE2MjcsOCBAQAogCiAJcHRhc2stPnR4X3R5cGUgPSB0eF90eXBlOwogCXB0YXNrLT5tYXhfcGF5bG9hZCA9IG1heF9wYXlsb2FkOwotICAgICAgICBwdGFzay0+b3V0c3RhbmRpbmdfcGt0cyA9IGV0aGVyMTM5NF9lbmNhcHN1bGF0ZV9wcmVwKG1heF9wYXlsb2FkLCBwcm90bywKLQkJCQkJCQkgICAgICZwdGFzay0+aGRyLCBkZ19zaXplLAotCQkJCQkJCSAgICAgZGdsKTsKKwlwdGFzay0+b3V0c3RhbmRpbmdfcGt0cyA9IGV0aGVyMTM5NF9lbmNhcHN1bGF0ZV9wcmVwKG1heF9wYXlsb2FkLAorCQkJCQlwcm90bywgJnB0YXNrLT5oZHIsIGRnX3NpemUsIGRnbCk7CiAKIAkvKiBBZGQgdGhlIGVuY2Fwc3VsYXRpb24gaGVhZGVyIHRvIHRoZSBmcmFnbWVudCAqLwogCXR4X2xlbiA9IGV0aGVyMTM5NF9lbmNhcHN1bGF0ZShza2IsIG1heF9wYXlsb2FkLCAmcHRhc2stPmhkcik7CkBAIC0xNzM3LDcgKzE2MzcsNyBAQAogCQlnb3RvIGZhaWw7CiAKIAluZXRpZl93YWtlX3F1ZXVlKGRldik7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIE5FVERFVl9UWF9PSzsKIGZhaWw6CiAJaWYgKHB0YXNrKQogCQlrbWVtX2NhY2hlX2ZyZWUocGFja2V0X3Rhc2tfY2FjaGUsIHB0YXNrKTsKQEAgLTE3NDUsNDAgKzE2NDUsNTYgQEAKIAlpZiAoc2tiICE9IE5VTEwpCiAJCWRldl9rZnJlZV9za2Ioc2tiKTsKIAotCXNwaW5fbG9ja19pcnFzYXZlICgmcHJpdi0+bG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAJcHJpdi0+c3RhdHMudHhfZHJvcHBlZCsrOwogCXByaXYtPnN0YXRzLnR4X2Vycm9ycysrOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZwcml2LT5sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCiAJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSkKIAkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOwogCi0JcmV0dXJuIDA7ICAvKiByZXR1cm5pbmcgbm9uLXplcm8gY2F1c2VzIHNlcmlvdXMgcHJvYmxlbXMgKi8KKwkvKgorCSAqIEZJWE1FOiBBY2NvcmRpbmcgdG8gYSBwYXRjaCBmcm9tIDIwMDMtMDItMjYsICJyZXR1cm5pbmcgbm9uLXplcm8KKwkgKiBjYXVzZXMgc2VyaW91cyBwcm9ibGVtcyIgaGVyZSwgYWxsZWdlZGx5LiAgQmVmb3JlIHRoYXQgcGF0Y2gsCisJICogLUVSUk5PIHdhcyByZXR1cm5lZCB3aGljaCBpcyBub3QgYXBwcm9wcmlhdGUgdW5kZXIgTGludXggMi42LgorCSAqIFBlcmhhcHMgbW9yZSBuZWVkcyB0byBiZSBkb25lPyAgU3RvcCB0aGUgcXVldWUgaW4gc2VyaW91cworCSAqIGNvbmRpdGlvbnMgYW5kIHJlc3RhcnQgaXQgZWxzZXdoZXJlPworCSAqLworCS8qIHJldHVybiBORVRERVZfVFhfQlVTWTsgKi8KKwlyZXR1cm4gTkVUREVWX1RYX09LOwogfQogCi1zdGF0aWMgdm9pZCBldGhlcjEzOTRfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKK3N0YXRpYyB2b2lkIGV0aGVyMTM5NF9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKIHsKLQlzdHJjcHkgKGluZm8tPmRyaXZlciwgZHJpdmVyX25hbWUpOwotCS8qIEZJWE1FIFhYWCBwcm92aWRlIHNhbmUgYnVzaW5mbyAqLwotCXN0cmNweSAoaW5mby0+YnVzX2luZm8sICJpZWVlMTM5NCIpOworCXN0cmNweShpbmZvLT5kcml2ZXIsIGRyaXZlcl9uYW1lKTsKKwlzdHJjcHkoaW5mby0+YnVzX2luZm8sICJpZWVlMTM5NCIpOyAvKiBGSVhNRSBwcm92aWRlIG1vcmUgZGV0YWlsPyAqLwogfQogCiBzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIGV0aHRvb2xfb3BzID0gewogCS5nZXRfZHJ2aW5mbyA9IGV0aGVyMTM5NF9nZXRfZHJ2aW5mbwogfTsKIAotc3RhdGljIGludCBfX2luaXQgZXRoZXIxMzk0X2luaXRfbW9kdWxlICh2b2lkKQorc3RhdGljIGludCBfX2luaXQgZXRoZXIxMzk0X2luaXRfbW9kdWxlKHZvaWQpCiB7Ci0JcGFja2V0X3Rhc2tfY2FjaGUgPSBrbWVtX2NhY2hlX2NyZWF0ZSgicGFja2V0X3Rhc2siLCBzaXplb2Yoc3RydWN0IHBhY2tldF90YXNrKSwKKwlpbnQgZXJyOworCisJcGFja2V0X3Rhc2tfY2FjaGUgPSBrbWVtX2NhY2hlX2NyZWF0ZSgicGFja2V0X3Rhc2siLAorCQkJCQkgICAgICBzaXplb2Yoc3RydWN0IHBhY2tldF90YXNrKSwKIAkJCQkJICAgICAgMCwgMCwgTlVMTCwgTlVMTCk7CisJaWYgKCFwYWNrZXRfdGFza19jYWNoZSkKKwkJcmV0dXJuIC1FTk9NRU07CiAKLQkvKiBSZWdpc3RlciBvdXJzZWx2ZXMgYXMgYSBoaWdobGV2ZWwgZHJpdmVyICovCiAJaHBzYl9yZWdpc3Rlcl9oaWdobGV2ZWwoJmV0aDEzOTRfaGlnaGxldmVsKTsKLQotCXJldHVybiBocHNiX3JlZ2lzdGVyX3Byb3RvY29sKCZldGgxMzk0X3Byb3RvX2RyaXZlcik7CisJZXJyID0gaHBzYl9yZWdpc3Rlcl9wcm90b2NvbCgmZXRoMTM5NF9wcm90b19kcml2ZXIpOworCWlmIChlcnIpIHsKKwkJaHBzYl91bnJlZ2lzdGVyX2hpZ2hsZXZlbCgmZXRoMTM5NF9oaWdobGV2ZWwpOworCQlrbWVtX2NhY2hlX2Rlc3Ryb3kocGFja2V0X3Rhc2tfY2FjaGUpOworCX0KKwlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgdm9pZCBfX2V4aXQgZXRoZXIxMzk0X2V4aXRfbW9kdWxlICh2b2lkKQorc3RhdGljIHZvaWQgX19leGl0IGV0aGVyMTM5NF9leGl0X21vZHVsZSh2b2lkKQogewogCWhwc2JfdW5yZWdpc3Rlcl9wcm90b2NvbCgmZXRoMTM5NF9wcm90b19kcml2ZXIpOwogCWhwc2JfdW5yZWdpc3Rlcl9oaWdobGV2ZWwoJmV0aDEzOTRfaGlnaGxldmVsKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvZXRoMTM5NC5oIGIvZHJpdmVycy9pZWVlMTM5NC9ldGgxMzk0LmgKaW5kZXggYzQ1Y2JmZi4uYTM0MzllZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZWVlMTM5NC9ldGgxMzk0LmgKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9ldGgxMzk0LmgKQEAgLTI1LDggKzI1LDExIEBACiAjZGVmaW5lIF9fRVRIMTM5NF9ICiAKICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiAKICNpbmNsdWRlICJpZWVlMTM5NC5oIgorI2luY2x1ZGUgImllZWUxMzk0X3R5cGVzLmgiCiAKIC8qIFJlZ2lzdGVyIGZvciBpbmNvbWluZyBwYWNrZXRzLiBUaGlzIGlzIDQwOTYgYnl0ZXMsIHdoaWNoIHN1cHBvcnRzIHVwIHRvCiAgKiBTMzIwMCAocGVyIFRhYmxlIDE2LTMgb2YgSUVFRSAxMzk0Yi0yMDAyKS4gKi8KQEAgLTM0LDIyICszNywxNSBAQAogCiAvKiBHQVNQIGlkZW50aWZpZXIgbnVtYmVycyBmb3IgSVB2NCBvdmVyIElFRUUgMTM5NCAqLwogI2RlZmluZSBFVEhFUjEzOTRfR0FTUF9TUEVDSUZJRVJfSUQJMHgwMDAwNUUKLSNkZWZpbmUgRVRIRVIxMzk0X0dBU1BfU1BFQ0lGSUVSX0lEX0hJCSgoRVRIRVIxMzk0X0dBU1BfU1BFQ0lGSUVSX0lEID4+IDgpICYgMHhmZmZmKQotI2RlZmluZSBFVEhFUjEzOTRfR0FTUF9TUEVDSUZJRVJfSURfTE8JKEVUSEVSMTM5NF9HQVNQX1NQRUNJRklFUl9JRCAmIDB4ZmYpCisjZGVmaW5lIEVUSEVSMTM5NF9HQVNQX1NQRUNJRklFUl9JRF9ISQkoKDB4MDAwMDVFID4+IDgpICYgMHhmZmZmKQorI2RlZmluZSBFVEhFUjEzOTRfR0FTUF9TUEVDSUZJRVJfSURfTE8JKDB4MDAwMDVFICYgMHhmZikKICNkZWZpbmUgRVRIRVIxMzk0X0dBU1BfVkVSU0lPTgkJMQogCi0jZGVmaW5lIEVUSEVSMTM5NF9HQVNQX09WRVJIRUFEICgyICogc2l6ZW9mKHF1YWRsZXRfdCkpICAvKiBHQVNQIGhlYWRlciBvdmVyaGVhZCAqLworI2RlZmluZSBFVEhFUjEzOTRfR0FTUF9PVkVSSEVBRAkoMiAqIHNpemVvZihxdWFkbGV0X3QpKQkvKiBmb3IgR0FTUCBoZWFkZXIgKi8KIAotI2RlZmluZSBFVEhFUjEzOTRfR0FTUF9CVUZGRVJTIDE2CisjZGVmaW5lIEVUSEVSMTM5NF9HQVNQX0JVRkZFUlMJMTYKIAotLyogcmF3aXNvIGJ1ZmZlciBzaXplIC0gZHVlIHRvIGEgbGltaXRhdGlvbiBpbiByYXdpc28sIHdlIG11c3QgbGltaXQgZWFjaAotICogR0FTUCBidWZmZXIgdG8gYmUgbGVzcyB0aGFuIFBBR0VfU0laRS4gKi8KLSNkZWZpbmUgRVRIRVIxMzk0X0lTT19CVUZfU0laRQlFVEhFUjEzOTRfR0FTUF9CVUZGRVJTICogICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQkJICAgbWluKCh1bnNpZ25lZCBpbnQpUEFHRV9TSVpFLCAgICAgICAgICAgICAgICAgXAotCQkJCSAgICAgICAyICogKDFVIDw8IChwcml2LT5ob3N0LT5jc3IubWF4X3JlYyArIDEpKSkKLQotLyogTm9kZSBzZXQgPT0gNjQgKi8KLSNkZWZpbmUgTk9ERV9TRVQJCQkoQUxMX05PREVTICsgMSkKKyNkZWZpbmUgTk9ERV9TRVQJCShBTExfTk9ERVMgKyAxKQkJLyogTm9kZSBzZXQgPT0gNjQgKi8KIAogZW51bSBldGgxMzk0X2JjX3N0YXRlcyB7IEVUSEVSMTM5NF9CQ19FUlJPUiwKIAkJCSBFVEhFUjEzOTRfQkNfUlVOTklORywKQEAgLTg1LDE5ICs4MSwxNCBAQAogCXVuc2lnbmVkIHNob3J0CWhfcHJvdG87CQkvKiBwYWNrZXQgdHlwZSBJRCBmaWVsZAkqLwogfSAgX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKLSNpZmRlZiBfX0tFUk5FTF9fCi0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0KIHN0YXRpYyBpbmxpbmUgc3RydWN0IGV0aDEzOTRoZHIgKmV0aDEzOTRfaGRyKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JcmV0dXJuIChzdHJ1Y3QgZXRoMTM5NGhkciAqKXNrYi0+bWFjLnJhdzsKKwlyZXR1cm4gKHN0cnVjdCBldGgxMzk0aGRyICopc2tiX21hY19oZWFkZXIoc2tiKTsKIH0KLSNlbmRpZgogCiB0eXBlZGVmIGVudW0ge0VUSDEzOTRfR0FTUCwgRVRIMTM5NF9XUlJFUX0gZXRoMTM5NF90eF90eXBlOwogCiAvKiBJUDEzOTQgaGVhZGVycyAqLwotI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KIAogLyogVW5mcmFnbWVudGVkICovCiAjaWYgZGVmaW5lZCBfX0JJR19FTkRJQU5fQklURklFTEQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvaGlnaGxldmVsLmMgYi9kcml2ZXJzL2llZWUxMzk0L2hpZ2hsZXZlbC5jCmluZGV4IDY5NGRhODIuLjgzYTQ5MzMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWUxMzk0L2hpZ2hsZXZlbC5jCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvaGlnaGxldmVsLmMKQEAgLTcwLDggKzcwLDEyIEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLS8qIFJldHVybnMgYSBwZXIgaG9zdC9kcml2ZXIgZGF0YSBzdHJ1Y3R1cmUgdGhhdCB3YXMgcHJldmlvdXNseSBzdG9yZWQgYnkKLSAqIGhwc2JfY3JlYXRlX2hvc3RpbmZvLiAqLworLyoqCisgKiBocHNiX2dldF9ob3N0aW5mbyAtIHJldHJpZXZlIGEgaG9zdGluZm8gcG9pbnRlciBib3VuZCB0byB0aGlzIGRyaXZlci9ob3N0CisgKgorICogUmV0dXJucyBhIHBlciBAaG9zdCBhbmQgQGhsIGRyaXZlciBkYXRhIHN0cnVjdHVyZSB0aGF0IHdhcyBwcmV2aW91c2x5IHN0b3JlZAorICogYnkgaHBzYl9jcmVhdGVfaG9zdGluZm8uCisgKi8KIHZvaWQgKmhwc2JfZ2V0X2hvc3RpbmZvKHN0cnVjdCBocHNiX2hpZ2hsZXZlbCAqaGwsIHN0cnVjdCBocHNiX2hvc3QgKmhvc3QpCiB7CiAJc3RydWN0IGhsX2hvc3RfaW5mbyAqaGkgPSBobF9nZXRfaG9zdGluZm8oaGwsIGhvc3QpOwpAQCAtNzksNyArODMsMTMgQEAKIAlyZXR1cm4gaGkgPyBoaS0+ZGF0YSA6IE5VTEw7CiB9CiAKLS8qIElmIHNpemUgaXMgemVybywgdGhlbiB0aGUgcmV0dXJuIGhlcmUgaXMgb25seSB2YWxpZCBmb3IgZXJyb3IgY2hlY2tpbmcgKi8KKy8qKgorICogaHBzYl9jcmVhdGVfaG9zdGluZm8gLSBhbGxvY2F0ZSBhIGhvc3RpbmZvIHBvaW50ZXIgYm91bmQgdG8gdGhpcyBkcml2ZXIvaG9zdAorICoKKyAqIEFsbG9jYXRlIGEgaG9zdGluZm8gcG9pbnRlciBiYWNrZWQgYnkgbWVtb3J5IHdpdGggQGRhdGFfc2l6ZSBhbmQgYmluZCBpdCB0bworICogdG8gdGhpcyBAaGwgZHJpdmVyIGFuZCBAaG9zdC4gIElmIEBkYXRhX3NpemUgaXMgemVybywgdGhlbiB0aGUgcmV0dXJuIGhlcmUgaXMKKyAqIG9ubHkgdmFsaWQgZm9yIGVycm9yIGNoZWNraW5nLgorICovCiB2b2lkICpocHNiX2NyZWF0ZV9ob3N0aW5mbyhzdHJ1Y3QgaHBzYl9oaWdobGV2ZWwgKmhsLCBzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0LAogCQkJICAgc2l6ZV90IGRhdGFfc2l6ZSkKIHsKQEAgLTExMyw2ICsxMjMsMTEgQEAKIAlyZXR1cm4gZGF0YTsKIH0KIAorLyoqCisgKiBocHNiX3NldF9ob3N0aW5mbyAtIHNldCB0aGUgaG9zdGluZm8gcG9pbnRlciB0byBzb21ldGhpbmcgdXNlZnVsCisgKgorICogVXN1YWxseSBmb2xsb3dzIGEgY2FsbCB0byBocHNiX2NyZWF0ZV9ob3N0aW5mbywgd2hlcmUgdGhlIHNpemUgaXMgMC4KKyAqLwogaW50IGhwc2Jfc2V0X2hvc3RpbmZvKHN0cnVjdCBocHNiX2hpZ2hsZXZlbCAqaGwsIHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsCiAJCSAgICAgIHZvaWQgKmRhdGEpCiB7CkBAIC0xMzIsNiArMTQ3LDExIEBACiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKKy8qKgorICogaHBzYl9kZXN0cm95X2hvc3RpbmZvIC0gZnJlZSBhbmQgcmVtb3ZlIGEgaG9zdGluZm8gcG9pbnRlcgorICoKKyAqIEZyZWUgYW5kIHJlbW92ZSB0aGUgaG9zdGluZm8gcG9pbnRlciBib3VuZCB0byB0aGlzIEBobCBkcml2ZXIgYW5kIEBob3N0LgorICovCiB2b2lkIGhwc2JfZGVzdHJveV9ob3N0aW5mbyhzdHJ1Y3QgaHBzYl9oaWdobGV2ZWwgKmhsLCBzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0KQogewogCXN0cnVjdCBobF9ob3N0X2luZm8gKmhpOwpAQCAtMTQ3LDYgKzE2NywxMiBAQAogCXJldHVybjsKIH0KIAorLyoqCisgKiBocHNiX3NldF9ob3N0aW5mb19rZXkgLSBzZXQgYW4gYWx0ZXJuYXRlIGxvb2t1cCBrZXkgZm9yIGFuIGhvc3RpbmZvCisgKgorICogU2V0cyBhbiBhbHRlcm5hdGUgbG9va3VwIGtleSBmb3IgdGhlIGhvc3RpbmZvIGJvdW5kIHRvIHRoaXMgQGhsIGRyaXZlciBhbmQKKyAqIEBob3N0LgorICovCiB2b2lkIGhwc2Jfc2V0X2hvc3RpbmZvX2tleShzdHJ1Y3QgaHBzYl9oaWdobGV2ZWwgKmhsLCBzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0LAogCQkJICAgdW5zaWduZWQgbG9uZyBrZXkpCiB7CkBAIC0xNTgsNiArMTg0LDkgQEAKIAlyZXR1cm47CiB9CiAKKy8qKgorICogaHBzYl9nZXRfaG9zdGluZm9fYnlrZXkgLSByZXRyaWV2ZSBhIGhvc3RpbmZvIHBvaW50ZXIgYnkgaXRzIGFsdGVybmF0ZSBrZXkKKyAqLwogdm9pZCAqaHBzYl9nZXRfaG9zdGluZm9fYnlrZXkoc3RydWN0IGhwc2JfaGlnaGxldmVsICpobCwgdW5zaWduZWQgbG9uZyBrZXkpCiB7CiAJc3RydWN0IGhsX2hvc3RfaW5mbyAqaGk7CkBAIC0xODksNiArMjE4LDEyIEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qKgorICogaHBzYl9yZWdpc3Rlcl9oaWdobGV2ZWwgLSByZWdpc3RlciBoaWdobGV2ZWwgZHJpdmVyCisgKgorICogVGhlIG5hbWUgcG9pbnRlciBpbiBAaGwgaGFzIHRvIHN0YXkgdmFsaWQgYXQgYWxsIHRpbWVzIGJlY2F1c2UgdGhlIHN0cmluZyBpcworICogbm90IGNvcGllZC4KKyAqLwogdm9pZCBocHNiX3JlZ2lzdGVyX2hpZ2hsZXZlbChzdHJ1Y3QgaHBzYl9oaWdobGV2ZWwgKmhsKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC0yNTgsNiArMjkzLDkgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyoqCisgKiBocHNiX3VucmVnaXN0ZXJfaGlnaGxldmVsIC0gdW5yZWdpc3RlciBoaWdobGV2ZWwgZHJpdmVyCisgKi8KIHZvaWQgaHBzYl91bnJlZ2lzdGVyX2hpZ2hsZXZlbChzdHJ1Y3QgaHBzYl9oaWdobGV2ZWwgKmhsKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC0yNzMsNiArMzExLDE5IEBACiAJbm9kZW1ncl9mb3JfZWFjaF9ob3N0KGhsLCBoaWdobGV2ZWxfZm9yX2VhY2hfaG9zdF91bnJlZyk7CiB9CiAKKy8qKgorICogaHBzYl9hbGxvY2F0ZV9hbmRfcmVnaXN0ZXJfYWRkcnNwYWNlIC0gYWxsb2MnIGFuZCByZWcnIGEgaG9zdCBhZGRyZXNzIHNwYWNlCisgKgorICogQHN0YXJ0IGFuZCBAZW5kIGFyZSA0OCBiaXQgcG9pbnRlcnMgYW5kIGhhdmUgdG8gYmUgcXVhZGxldCBhbGlnbmVkLgorICogQGVuZCBwb2ludHMgdG8gdGhlIGZpcnN0IGFkZHJlc3MgYmVoaW5kIHRoZSBoYW5kbGVkIGFkZHJlc3Nlcy4gIFRoaXMKKyAqIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgZm9yIGEgc2luZ2xlIGhwc2JfaGlnaGxldmVsIEBobCB0bworICogaW1wbGVtZW50IHNwYXJzZSByZWdpc3RlciBzZXRzLiAgVGhlIHJlcXVlc3RlZCByZWdpb24gbXVzdCBub3Qgb3ZlcmxhcCBhbnkKKyAqIHByZXZpb3VzbHkgYWxsb2NhdGVkIHJlZ2lvbiwgb3RoZXJ3aXNlIHJlZ2lzdGVyaW5nIHdpbGwgZmFpbC4KKyAqCisgKiBJdCByZXR1cm5zIHRydWUgZm9yIHN1Y2Nlc3NmdWwgYWxsb2NhdGlvbi4gIEFkZHJlc3Mgc3BhY2VzIGNhbiBiZQorICogdW5yZWdpc3RlcmVkIHdpdGggaHBzYl91bnJlZ2lzdGVyX2FkZHJzcGFjZS4gIEFsbCByZW1haW5pbmcgYWRkcmVzcyBzcGFjZXMKKyAqIGFyZSBhdXRvbWF0aWNhbGx5IGRlYWxsb2NhdGVkIHRvZ2V0aGVyIHdpdGggdGhlIGhwc2JfaGlnaGxldmVsIEBobC4KKyAqLwogdTY0IGhwc2JfYWxsb2NhdGVfYW5kX3JlZ2lzdGVyX2FkZHJzcGFjZShzdHJ1Y3QgaHBzYl9oaWdobGV2ZWwgKmhsLAogCQkJCQkgc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwKIAkJCQkJIHN0cnVjdCBocHNiX2FkZHJlc3Nfb3BzICpvcHMsCkBAIC0zNDgsNiArMzk5LDE5IEBACiAJcmV0dXJuIHJldHZhbDsKIH0KIAorLyoqCisgKiBocHNiX3JlZ2lzdGVyX2FkZHJzcGFjZSAtIHJlZ2lzdGVyIGEgaG9zdCBhZGRyZXNzIHNwYWNlCisgKgorICogQHN0YXJ0IGFuZCBAZW5kIGFyZSA0OCBiaXQgcG9pbnRlcnMgYW5kIGhhdmUgdG8gYmUgcXVhZGxldCBhbGlnbmVkLgorICogQGVuZCBwb2ludHMgdG8gdGhlIGZpcnN0IGFkZHJlc3MgYmVoaW5kIHRoZSBoYW5kbGVkIGFkZHJlc3Nlcy4gIFRoaXMKKyAqIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgZm9yIGEgc2luZ2xlIGhwc2JfaGlnaGxldmVsIEBobCB0bworICogaW1wbGVtZW50IHNwYXJzZSByZWdpc3RlciBzZXRzLiAgVGhlIHJlcXVlc3RlZCByZWdpb24gbXVzdCBub3Qgb3ZlcmxhcCBhbnkKKyAqIHByZXZpb3VzbHkgYWxsb2NhdGVkIHJlZ2lvbiwgb3RoZXJ3aXNlIHJlZ2lzdGVyaW5nIHdpbGwgZmFpbC4KKyAqCisgKiBJdCByZXR1cm5zIHRydWUgZm9yIHN1Y2Nlc3NmdWwgYWxsb2NhdGlvbi4gIEFkZHJlc3Mgc3BhY2VzIGNhbiBiZQorICogdW5yZWdpc3RlcmVkIHdpdGggaHBzYl91bnJlZ2lzdGVyX2FkZHJzcGFjZS4gIEFsbCByZW1haW5pbmcgYWRkcmVzcyBzcGFjZXMKKyAqIGFyZSBhdXRvbWF0aWNhbGx5IGRlYWxsb2NhdGVkIHRvZ2V0aGVyIHdpdGggdGhlIGhwc2JfaGlnaGxldmVsIEBobC4KKyAqLwogaW50IGhwc2JfcmVnaXN0ZXJfYWRkcnNwYWNlKHN0cnVjdCBocHNiX2hpZ2hsZXZlbCAqaGwsIHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsCiAJCQkgICAgc3RydWN0IGhwc2JfYWRkcmVzc19vcHMgKm9wcywgdTY0IHN0YXJ0LCB1NjQgZW5kKQogewpAQCAtNDE5LDYgKzQ4MywxMSBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKKy8qKgorICogaHBzYl9saXN0ZW5fY2hhbm5lbCAtIGVuYWJsZSByZWNldmluZyBhIGNlcnRhaW4gaXNvY2hyb25vdXMgY2hhbm5lbAorICoKKyAqIFJlY2VwdGlvbiBpcyBoYW5kbGVkIHRocm91Z2ggdGhlIEBobCdzIGlzb19yZWNlaXZlIG9wLgorICovCiBpbnQgaHBzYl9saXN0ZW5fY2hhbm5lbChzdHJ1Y3QgaHBzYl9oaWdobGV2ZWwgKmhsLCBzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0LAogCQkJdW5zaWduZWQgaW50IGNoYW5uZWwpCiB7CkBAIC00MzEsNiArNTAwLDkgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyoqCisgKiBocHNiX3VubGlzdGVuX2NoYW5uZWwgLSBkaXNhYmxlIHJlY2V2aW5nIGEgY2VydGFpbiBpc29jaHJvbm91cyBjaGFubmVsCisgKi8KIHZvaWQgaHBzYl91bmxpc3Rlbl9jaGFubmVsKHN0cnVjdCBocHNiX2hpZ2hsZXZlbCAqaGwsIHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsCiAJCQkgICB1bnNpZ25lZCBpbnQgY2hhbm5lbCkKIHsKQEAgLTUyOCw2ICs2MDAsMTcgQEAKIAlyZWFkX3VubG9ja19pcnFyZXN0b3JlKCZobF9pcnFzX2xvY2ssIGZsYWdzKTsKIH0KIAorLyoKKyAqIGhpZ2hsZXZlbF9yZWFkLCBoaWdobGV2ZWxfd3JpdGUsIGhpZ2hsZXZlbF9sb2NrLCBoaWdobGV2ZWxfbG9jazY0OgorICoKKyAqIFRoZXNlIGZ1bmN0aW9ucyBhcmUgY2FsbGVkIHRvIGhhbmRsZSB0cmFuc2FjdGlvbnMuIFRoZXkgYXJlIGNhbGxlZCB3aGVuIGEKKyAqIHBhY2tldCBhcnJpdmVzLiAgVGhlIGZsYWdzIGFyZ3VtZW50IGNvbnRhaW5zIHRoZSBzZWNvbmQgd29yZCBvZiB0aGUgZmlyc3QKKyAqIGhlYWRlciBxdWFkbGV0IG9mIHRoZSBpbmNvbWluZyBwYWNrZXQgKGNvbnRhaW5pbmcgdHJhbnNhY3Rpb24gbGFiZWwsIHJldHJ5CisgKiBjb2RlLCB0cmFuc2FjdGlvbiBjb2RlIGFuZCBwcmlvcml0eSkuICBUaGVzZSBmdW5jdGlvbnMgZWl0aGVyIHJldHVybiBhCisgKiByZXNwb25zZSBjb2RlIG9yIGEgbmVnYXRpdmUgbnVtYmVyLiAgSW4gdGhlIGZpcnN0IGNhc2UgYSByZXNwb25zZSB3aWxsIGJlCisgKiBnZW5lcmF0ZWQuICBJbiB0aGUgbGF0dGVyIGNhc2UsIG5vIHJlc3BvbnNlIHdpbGwgYmUgc2VudCBhbmQgdGhlIGRyaXZlciB3aGljaAorICogaGFuZGxlZCB0aGUgcmVxdWVzdCB3aWxsIHNlbmQgdGhlIHJlc3BvbnNlIGl0c2VsZi4KKyAqLwogaW50IGhpZ2hsZXZlbF9yZWFkKHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsIGludCBub2RlaWQsIHZvaWQgKmRhdGEsIHU2NCBhZGRyLAogCQkgICB1bnNpZ25lZCBpbnQgbGVuZ3RoLCB1MTYgZmxhZ3MpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L2hpZ2hsZXZlbC5oIGIvZHJpdmVycy9pZWVlMTM5NC9oaWdobGV2ZWwuaAppbmRleCA0YjMzMDExLi42MzQ3NGY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWUxMzk0L2hpZ2hsZXZlbC5oCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvaGlnaGxldmVsLmgKQEAgLTk5LDE2ICs5OSw2IEBACiB2b2lkIGhpZ2hsZXZlbF9hZGRfaG9zdChzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0KTsKIHZvaWQgaGlnaGxldmVsX3JlbW92ZV9ob3N0KHN0cnVjdCBocHNiX2hvc3QgKmhvc3QpOwogdm9pZCBoaWdobGV2ZWxfaG9zdF9yZXNldChzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0KTsKLQotLyoKLSAqIFRoZXNlIGZ1bmN0aW9ucyBhcmUgY2FsbGVkIHRvIGhhbmRsZSB0cmFuc2FjdGlvbnMuIFRoZXkgYXJlIGNhbGxlZCB3aGVuIGEKLSAqIHBhY2tldCBhcnJpdmVzLiAgVGhlIGZsYWdzIGFyZ3VtZW50IGNvbnRhaW5zIHRoZSBzZWNvbmQgd29yZCBvZiB0aGUgZmlyc3QKLSAqIGhlYWRlciBxdWFkbGV0IG9mIHRoZSBpbmNvbWluZyBwYWNrZXQgKGNvbnRhaW5pbmcgdHJhbnNhY3Rpb24gbGFiZWwsIHJldHJ5Ci0gKiBjb2RlLCB0cmFuc2FjdGlvbiBjb2RlIGFuZCBwcmlvcml0eSkuICBUaGVzZSBmdW5jdGlvbnMgZWl0aGVyIHJldHVybiBhCi0gKiByZXNwb25zZSBjb2RlIG9yIGEgbmVnYXRpdmUgbnVtYmVyLiAgSW4gdGhlIGZpcnN0IGNhc2UgYSByZXNwb25zZSB3aWxsIGJlCi0gKiBnZW5lcmF0ZWQuICBJbiB0aGUgbGF0dGVyIGNhc2UsIG5vIHJlc3BvbnNlIHdpbGwgYmUgc2VudCBhbmQgdGhlIGRyaXZlciB3aGljaAotICogaGFuZGxlZCB0aGUgcmVxdWVzdCB3aWxsIHNlbmQgdGhlIHJlc3BvbnNlIGl0c2VsZi4KLSAqLwogaW50IGhpZ2hsZXZlbF9yZWFkKHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsIGludCBub2RlaWQsIHZvaWQgKmRhdGEsIHU2NCBhZGRyLAogCQkgICB1bnNpZ25lZCBpbnQgbGVuZ3RoLCB1MTYgZmxhZ3MpOwogaW50IGhpZ2hsZXZlbF93cml0ZShzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0LCBpbnQgbm9kZWlkLCBpbnQgZGVzdGlkLCB2b2lkICpkYXRhLApAQCAtMTE5LDMwICsxMDksMTMgQEAKIGludCBoaWdobGV2ZWxfbG9jazY0KHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsIGludCBub2RlaWQsIG9jdGxldF90ICpzdG9yZSwKIAkJICAgICB1NjQgYWRkciwgb2N0bGV0X3QgZGF0YSwgb2N0bGV0X3QgYXJnLCBpbnQgZXh0X3Rjb2RlLAogCQkgICAgIHUxNiBmbGFncyk7Ci0KIHZvaWQgaGlnaGxldmVsX2lzb19yZWNlaXZlKHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsIHZvaWQgKmRhdGEsIHNpemVfdCBsZW5ndGgpOwogdm9pZCBoaWdobGV2ZWxfZmNwX3JlcXVlc3Qoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwgaW50IG5vZGVpZCwgaW50IGRpcmVjdGlvbiwKIAkJCSAgIHZvaWQgKmRhdGEsIHNpemVfdCBsZW5ndGgpOwogCi0vKgotICogUmVnaXN0ZXIgaGlnaGxldmVsIGRyaXZlci4gIFRoZSBuYW1lIHBvaW50ZXIgaGFzIHRvIHN0YXkgdmFsaWQgYXQgYWxsIHRpbWVzCi0gKiBiZWNhdXNlIHRoZSBzdHJpbmcgaXMgbm90IGNvcGllZC4KLSAqLwogdm9pZCBocHNiX3JlZ2lzdGVyX2hpZ2hsZXZlbChzdHJ1Y3QgaHBzYl9oaWdobGV2ZWwgKmhsKTsKIHZvaWQgaHBzYl91bnJlZ2lzdGVyX2hpZ2hsZXZlbChzdHJ1Y3QgaHBzYl9oaWdobGV2ZWwgKmhsKTsKIAotLyoKLSAqIFJlZ2lzdGVyIGhhbmRsZXJzIGZvciBob3N0IGFkZHJlc3Mgc3BhY2VzLiAgU3RhcnQgYW5kIGVuZCBhcmUgNDggYml0IHBvaW50ZXJzCi0gKiBhbmQgaGF2ZSB0byBiZSBxdWFkbGV0IGFsaWduZWQuICBBcmd1bWVudCAiZW5kIiBwb2ludHMgdG8gdGhlIGZpcnN0IGFkZHJlc3MKLSAqIGJlaGluZCB0aGUgaGFuZGxlZCBhZGRyZXNzZXMuICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgZm9yCi0gKiBhIHNpbmdsZSBocHNiX2hpZ2hsZXZlbCB0byBpbXBsZW1lbnQgc3BhcnNlIHJlZ2lzdGVyIHNldHMuICBUaGUgcmVxdWVzdGVkCi0gKiByZWdpb24gbXVzdCBub3Qgb3ZlcmxhcCBhbnkgcHJldmlvdXNseSBhbGxvY2F0ZWQgcmVnaW9uLCBvdGhlcndpc2UKLSAqIHJlZ2lzdGVyaW5nIHdpbGwgZmFpbC4KLSAqCi0gKiBJdCByZXR1cm5zIHRydWUgZm9yIHN1Y2Nlc3NmdWwgYWxsb2NhdGlvbi4gIEFkZHJlc3Mgc3BhY2VzIGNhbiBiZQotICogdW5yZWdpc3RlcmVkIHdpdGggaHBzYl91bnJlZ2lzdGVyX2FkZHJzcGFjZS4gIEFsbCByZW1haW5pbmcgYWRkcmVzcyBzcGFjZXMKLSAqIGFyZSBhdXRvbWF0aWNhbGx5IGRlYWxsb2NhdGVkIHRvZ2V0aGVyIHdpdGggdGhlIGhwc2JfaGlnaGxldmVsLgotICovCiB1NjQgaHBzYl9hbGxvY2F0ZV9hbmRfcmVnaXN0ZXJfYWRkcnNwYWNlKHN0cnVjdCBocHNiX2hpZ2hsZXZlbCAqaGwsCiAJCQkJCSBzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0LAogCQkJCQkgc3RydWN0IGhwc2JfYWRkcmVzc19vcHMgKm9wcywKQEAgLTE1Miw0NSArMTI1LDE5IEBACiAJCQkgICAgc3RydWN0IGhwc2JfYWRkcmVzc19vcHMgKm9wcywgdTY0IHN0YXJ0LCB1NjQgZW5kKTsKIGludCBocHNiX3VucmVnaXN0ZXJfYWRkcnNwYWNlKHN0cnVjdCBocHNiX2hpZ2hsZXZlbCAqaGwsIHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsCiAJCQkgICAgICB1NjQgc3RhcnQpOwotCi0vKgotICogRW5hYmxlIG9yIGRpc2FibGUgcmVjZXZpbmcgYSBjZXJ0YWluIGlzb2Nocm9ub3VzIGNoYW5uZWwgdGhyb3VnaCB0aGUKLSAqIGlzb19yZWNlaXZlIG9wLgotICovCiBpbnQgaHBzYl9saXN0ZW5fY2hhbm5lbChzdHJ1Y3QgaHBzYl9oaWdobGV2ZWwgKmhsLCBzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0LAotCQkJIHVuc2lnbmVkIGludCBjaGFubmVsKTsKKwkJCXVuc2lnbmVkIGludCBjaGFubmVsKTsKIHZvaWQgaHBzYl91bmxpc3Rlbl9jaGFubmVsKHN0cnVjdCBocHNiX2hpZ2hsZXZlbCAqaGwsIHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsCiAJCQkgICB1bnNpZ25lZCBpbnQgY2hhbm5lbCk7CiAKLS8qIFJldHJpZXZlIGEgaG9zdGluZm8gcG9pbnRlciBib3VuZCB0byB0aGlzIGRyaXZlci9ob3N0ICovCiB2b2lkICpocHNiX2dldF9ob3N0aW5mbyhzdHJ1Y3QgaHBzYl9oaWdobGV2ZWwgKmhsLCBzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0KTsKLQotLyogQWxsb2NhdGUgYSBob3N0aW5mbyBwb2ludGVyIG9mIGRhdGFfc2l6ZSBib3VuZCB0byB0aGlzIGRyaXZlci9ob3N0ICovCiB2b2lkICpocHNiX2NyZWF0ZV9ob3N0aW5mbyhzdHJ1Y3QgaHBzYl9oaWdobGV2ZWwgKmhsLCBzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0LAogCQkJICAgc2l6ZV90IGRhdGFfc2l6ZSk7Ci0KLS8qIEZyZWUgYW5kIHJlbW92ZSB0aGUgaG9zdGluZm8gcG9pbnRlciBib3VuZCB0byB0aGlzIGRyaXZlci9ob3N0ICovCiB2b2lkIGhwc2JfZGVzdHJveV9ob3N0aW5mbyhzdHJ1Y3QgaHBzYl9oaWdobGV2ZWwgKmhsLCBzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0KTsKLQotLyogU2V0IGFuIGFsdGVybmF0ZSBsb29rdXAga2V5IGZvciB0aGUgaG9zdGluZm8gYm91bmQgdG8gdGhpcyBkcml2ZXIvaG9zdCAqLwogdm9pZCBocHNiX3NldF9ob3N0aW5mb19rZXkoc3RydWN0IGhwc2JfaGlnaGxldmVsICpobCwgc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwKIAkJCSAgIHVuc2lnbmVkIGxvbmcga2V5KTsKLQotLyogUmV0cmlldmUgdGhlIGFsdGVybmF0ZSBsb29rdXAga2V5IGZvciB0aGUgaG9zdGluZm8gYm91bmQgdG8gdGhpcwotICogZHJpdmVyL2hvc3QgKi8KLXVuc2lnbmVkIGxvbmcgaHBzYl9nZXRfaG9zdGluZm9fa2V5KHN0cnVjdCBocHNiX2hpZ2hsZXZlbCAqaGwsCi0JCQkJICAgIHN0cnVjdCBocHNiX2hvc3QgKmhvc3QpOwotCi0vKiBSZXRyaWV2ZSBhIGhvc3RpbmZvIHBvaW50ZXIgYm91bmQgdG8gdGhpcyBkcml2ZXIgdXNpbmcgaXRzIGFsdGVybmF0ZSBrZXkgKi8KIHZvaWQgKmhwc2JfZ2V0X2hvc3RpbmZvX2J5a2V5KHN0cnVjdCBocHNiX2hpZ2hsZXZlbCAqaGwsIHVuc2lnbmVkIGxvbmcga2V5KTsKLQotLyogU2V0IHRoZSBob3N0aW5mbyBwb2ludGVyIHRvIHNvbWV0aGluZyB1c2VmdWwuIFVzdWFsbHkgZm9sbG93cyBhIGNhbGwgdG8KLSAqIGhwc2JfY3JlYXRlX2hvc3RpbmZvLCB3aGVyZSB0aGUgc2l6ZSBpcyAwLiAqLwogaW50IGhwc2Jfc2V0X2hvc3RpbmZvKHN0cnVjdCBocHNiX2hpZ2hsZXZlbCAqaGwsIHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsCiAJCSAgICAgIHZvaWQgKmRhdGEpOwogCi0vKiBSZXRyaWV2ZSBocHNiX2hvc3QgdXNpbmcgYSBoaWdobGV2ZWwgaGFuZGxlIGFuZCBhIGtleSAqLwotc3RydWN0IGhwc2JfaG9zdCAqaHBzYl9nZXRfaG9zdF9ieWtleShzdHJ1Y3QgaHBzYl9oaWdobGV2ZWwgKmhsLAotCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcga2V5KTsKLQogI2VuZGlmIC8qIElFRUUxMzk0X0hJR0hMRVZFTF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L2hvc3RzLmMgYi9kcml2ZXJzL2llZWUxMzk0L2hvc3RzLmMKaW5kZXggMzJhMTMwOS4uNjE2NGE5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZWVlMTM5NC9ob3N0cy5jCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvaG9zdHMuYwpAQCAtOTQsMTQgKzk0LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyoKLSAqIFRoZSBwZW5kaW5nX3BhY2tldF9xdWV1ZSBpcyBzcGVjaWFsIGluIHRoYXQgaXQncyBwcm9jZXNzZWQKLSAqIGZyb20gaGFyZGlycSBjb250ZXh0IHRvbyAoc3VjaCBhcyBocHNiX2J1c19yZXNldCgpKS4gSGVuY2UKLSAqIHNwbGl0IHRoZSBsb2NrIGNsYXNzIGZyb20gdGhlIHVzdWFsIG5ldHdvcmtpbmcgc2tiLWhlYWQKLSAqIGxvY2sgY2xhc3MgYnkgdXNpbmcgYSBzZXBhcmF0ZSBrZXkgZm9yIGl0OgotICovCi1zdGF0aWMgc3RydWN0IGxvY2tfY2xhc3Nfa2V5IHBlbmRpbmdfcGFja2V0X3F1ZXVlX2tleTsKLQogc3RhdGljIERFRklORV9NVVRFWChob3N0X251bV9hbGxvYyk7CiAKIC8qKgpAQCAtMTM3LDkgKzEyOSw3IEBACiAJaC0+aG9zdGRhdGEgPSBoICsgMTsKIAloLT5kcml2ZXIgPSBkcnY7CiAKLQlza2JfcXVldWVfaGVhZF9pbml0KCZoLT5wZW5kaW5nX3BhY2tldF9xdWV1ZSk7Ci0JbG9ja2RlcF9zZXRfY2xhc3MoJmgtPnBlbmRpbmdfcGFja2V0X3F1ZXVlLmxvY2ssCi0JCQkgICAmcGVuZGluZ19wYWNrZXRfcXVldWVfa2V5KTsKKwlJTklUX0xJU1RfSEVBRCgmaC0+cGVuZGluZ19wYWNrZXRzKTsKIAlJTklUX0xJU1RfSEVBRCgmaC0+YWRkcl9zcGFjZSk7CiAKIAlmb3IgKGkgPSAyOyBpIDwgMTY7IGkrKykKQEAgLTE5MCw3ICsxODAsNyBAQAogewogCWlmIChocHNiX2RlZmF1bHRfaG9zdF9lbnRyeShob3N0KSkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JaHBzYl9hZGRfZXh0cmFfY29uZmlnX3JvbXMoaG9zdCk7CisKIAloaWdobGV2ZWxfYWRkX2hvc3QoaG9zdCk7CiAJcmV0dXJuIDA7CiB9CkBAIC0yMTIsMTIgKzIwMiwxOSBAQAogCiAJaG9zdC0+ZHJpdmVyID0gJmR1bW15X2RyaXZlcjsKIAloaWdobGV2ZWxfcmVtb3ZlX2hvc3QoaG9zdCk7Ci0JaHBzYl9yZW1vdmVfZXh0cmFfY29uZmlnX3JvbXMoaG9zdCk7CiAKIAljbGFzc19kZXZpY2VfdW5yZWdpc3RlcigmaG9zdC0+Y2xhc3NfZGV2KTsKIAlkZXZpY2VfdW5yZWdpc3RlcigmaG9zdC0+ZGV2aWNlKTsKIH0KIAorLyoqCisgKiBocHNiX3VwZGF0ZV9jb25maWdfcm9tX2ltYWdlIC0gdXBkYXRlcyBjb25maWd1cmF0aW9uIFJPTSBpbWFnZSBvZiBhIGhvc3QKKyAqCisgKiBVcGRhdGVzIHRoZSBjb25maWd1cmF0aW9uIFJPTSBpbWFnZSBvZiBhIGhvc3QuICByb21fdmVyc2lvbiBtdXN0IGJlIHRoZQorICogY3VycmVudCB2ZXJzaW9uLCBvdGhlcndpc2UgaXQgd2lsbCBmYWlsIHdpdGggcmV0dXJuIHZhbHVlIC0xLiBJZiB0aGlzCisgKiBob3N0IGRvZXMgbm90IHN1cHBvcnQgY29uZmlnLXJvbS11cGRhdGUsIGl0IHdpbGwgcmV0dXJuIC0lRUlOVkFMLgorICogUmV0dXJuIHZhbHVlIDAgaW5kaWNhdGVzIHN1Y2Nlc3MuCisgKi8KIGludCBocHNiX3VwZGF0ZV9jb25maWdfcm9tX2ltYWdlKHN0cnVjdCBocHNiX2hvc3QgKmhvc3QpCiB7CiAJdW5zaWduZWQgbG9uZyByZXNldF9kZWxheTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvaG9zdHMuaCBiL2RyaXZlcnMvaWVlZTEzOTQvaG9zdHMuaAppbmRleCA0YmY0ZmI3Li5mZWI1NWQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWUxMzk0L2hvc3RzLmgKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9ob3N0cy5oCkBAIC0zLDcgKzMsNiBAQAogCiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KQEAgLTI1LDggKzI0LDcgQEAKIAogCWF0b21pY190IGdlbmVyYXRpb247CiAKLQlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHBlbmRpbmdfcGFja2V0X3F1ZXVlOwotCisJc3RydWN0IGxpc3RfaGVhZCBwZW5kaW5nX3BhY2tldHM7CiAJc3RydWN0IHRpbWVyX2xpc3QgdGltZW91dDsKIAl1bnNpZ25lZCBsb25nIHRpbWVvdXRfaW50ZXJ2YWw7CiAKQEAgLTIwMiwxMiArMjAwLDYgQEAKIGludCBocHNiX2FkZF9ob3N0KHN0cnVjdCBocHNiX2hvc3QgKmhvc3QpOwogdm9pZCBocHNiX3Jlc3VtZV9ob3N0KHN0cnVjdCBocHNiX2hvc3QgKmhvc3QpOwogdm9pZCBocHNiX3JlbW92ZV9ob3N0KHN0cnVjdCBocHNiX2hvc3QgKmhvc3QpOwotCi0vKiBVcGRhdGVzIHRoZSBjb25maWd1cmF0aW9uIHJvbSBpbWFnZSBvZiBhIGhvc3QuICByb21fdmVyc2lvbiBtdXN0IGJlIHRoZQotICogY3VycmVudCB2ZXJzaW9uLCBvdGhlcndpc2UgaXQgd2lsbCBmYWlsIHdpdGggcmV0dXJuIHZhbHVlIC0xLiBJZiB0aGlzCi0gKiBob3N0IGRvZXMgbm90IHN1cHBvcnQgY29uZmlnLXJvbS11cGRhdGUsIGl0IHdpbGwgcmV0dXJuIC1FSU5WQUwuCi0gKiBSZXR1cm4gdmFsdWUgMCBpbmRpY2F0ZXMgc3VjY2Vzcy4KLSAqLwogaW50IGhwc2JfdXBkYXRlX2NvbmZpZ19yb21faW1hZ2Uoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCk7CiAKICNlbmRpZiAvKiBfSUVFRTEzOTRfSE9TVFNfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC9pZWVlMTM5NF9jb3JlLmMgYi9kcml2ZXJzL2llZWUxMzk0L2llZWUxMzk0X2NvcmUuYwppbmRleCBkNzkxZDA4Li44ZjcxYjZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWUxMzk0L2llZWUxMzk0X2NvcmUuYworKysgYi9kcml2ZXJzL2llZWUxMzk0L2llZWUxMzk0X2NvcmUuYwpAQCAtMzAsNyArMzAsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAjaW5jbHVkZSA8bGludXgva2Rldl90Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KICNpbmNsdWRlIDxsaW51eC9wcmVlbXB0Lmg+CkBAIC05NiwxMyArOTUsMTUgQEAKIAogCiAvKioKLSAqIGhwc2Jfc2V0X3BhY2tldF9jb21wbGV0ZV90YXNrIC0gc2V0IHRoZSB0YXNrIHRoYXQgcnVucyB3aGVuIGEgcGFja2V0Ci0gKiBjb21wbGV0ZXMuIFlvdSBjYW5ub3QgY2FsbCB0aGlzIG1vcmUgdGhhbiBvbmNlIG9uIGEgc2luZ2xlIHBhY2tldAotICogYmVmb3JlIGl0IGlzIHNlbnQuCi0gKgorICogaHBzYl9zZXRfcGFja2V0X2NvbXBsZXRlX3Rhc2sgLSBzZXQgdGFzayB0aGF0IHJ1bnMgd2hlbiBhIHBhY2tldCBjb21wbGV0ZXMKICAqIEBwYWNrZXQ6IHRoZSBwYWNrZXQgd2hvc2UgY29tcGxldGlvbiB3ZSB3YW50IHRoZSB0YXNrIGFkZGVkIHRvCiAgKiBAcm91dGluZTogZnVuY3Rpb24gdG8gY2FsbAogICogQGRhdGE6IGRhdGEgKGlmIGFueSkgdG8gcGFzcyB0byB0aGUgYWJvdmUgZnVuY3Rpb24KKyAqCisgKiBTZXQgdGhlIHRhc2sgdGhhdCBydW5zIHdoZW4gYSBwYWNrZXQgY29tcGxldGVzLiBZb3UgY2Fubm90IGNhbGwgdGhpcyBtb3JlCisgKiB0aGFuIG9uY2Ugb24gYSBzaW5nbGUgcGFja2V0IGJlZm9yZSBpdCBpcyBzZW50LgorICoKKyAqIFR5cGljYWxseSwgdGhlIGNvbXBsZXRlIEByb3V0aW5lIGlzIHJlc3BvbnNpYmxlIHRvIGNhbGwgaHBzYl9mcmVlX3BhY2tldCgpLgogICovCiB2b2lkIGhwc2Jfc2V0X3BhY2tldF9jb21wbGV0ZV90YXNrKHN0cnVjdCBocHNiX3BhY2tldCAqcGFja2V0LAogCQkJCSAgIHZvaWQgKCpyb3V0aW5lKSh2b2lkICopLCB2b2lkICpkYXRhKQpAQCAtMTE1LDEyICsxMTYsMTIgQEAKIAogLyoqCiAgKiBocHNiX2FsbG9jX3BhY2tldCAtIGFsbG9jYXRlIG5ldyBwYWNrZXQgc3RydWN0dXJlCi0gKiBAZGF0YV9zaXplOiBzaXplIG9mIHRoZSBkYXRhIGJsb2NrIHRvIGJlIGFsbG9jYXRlZAorICogQGRhdGFfc2l6ZTogc2l6ZSBvZiB0aGUgZGF0YSBibG9jayB0byBiZSBhbGxvY2F0ZWQsIGluIGJ5dGVzCiAgKgogICogVGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMsIGluaXRpYWxpemVzIGFuZCByZXR1cm5zIGEgbmV3ICZzdHJ1Y3QgaHBzYl9wYWNrZXQuCi0gKiBJdCBjYW4gYmUgdXNlZCBpbiBpbnRlcnJ1cHQgY29udGV4dC4gIEEgaGVhZGVyIGJsb2NrIGlzIGFsd2F5cyBpbmNsdWRlZCwgaXRzCi0gKiBzaXplIGlzIGJpZyBlbm91Z2ggdG8gY29udGFpbiBhbGwgcG9zc2libGUgMTM5NCBoZWFkZXJzLiAgVGhlIGRhdGEgYmxvY2sgaXMKLSAqIG9ubHkgYWxsb2NhdGVkIHdoZW4gQGRhdGFfc2l6ZSBpcyBub3QgemVyby4KKyAqIEl0IGNhbiBiZSB1c2VkIGluIGludGVycnVwdCBjb250ZXh0LiAgQSBoZWFkZXIgYmxvY2sgaXMgYWx3YXlzIGluY2x1ZGVkIGFuZAorICogaW5pdGlhbGl6ZWQgd2l0aCB6ZXJvcy4gIEl0cyBzaXplIGlzIGJpZyBlbm91Z2ggdG8gY29udGFpbiBhbGwgcG9zc2libGUgMTM5NAorICogaGVhZGVycy4gIFRoZSBkYXRhIGJsb2NrIGlzIG9ubHkgYWxsb2NhdGVkIGlmIEBkYXRhX3NpemUgaXMgbm90IHplcm8uCiAgKgogICogRm9yIHBhY2tldHMgZm9yIHdoaWNoIHJlc3BvbnNlcyB3aWxsIGJlIHJlY2VpdmVkIHRoZSBAZGF0YV9zaXplIGhhcyB0byBiZSBiaWcKICAqIGVub3VnaCB0byBjb250YWluIHRoZSByZXNwb25zZSdzIGRhdGEgYmxvY2sgc2luY2Ugbm8gZnVydGhlciBhbGxvY2F0aW9uCkBAIC0xMzUsNTAgKzEzNiw0OSBAQAogICovCiBzdHJ1Y3QgaHBzYl9wYWNrZXQgKmhwc2JfYWxsb2NfcGFja2V0KHNpemVfdCBkYXRhX3NpemUpCiB7Ci0Jc3RydWN0IGhwc2JfcGFja2V0ICpwYWNrZXQgPSBOVUxMOwotCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IGhwc2JfcGFja2V0ICpwYWNrZXQ7CiAKIAlkYXRhX3NpemUgPSAoKGRhdGFfc2l6ZSArIDMpICYgfjMpOwogCi0Jc2tiID0gYWxsb2Nfc2tiKGRhdGFfc2l6ZSArIHNpemVvZigqcGFja2V0KSwgR0ZQX0FUT01JQyk7Ci0JaWYgKHNrYiA9PSBOVUxMKQorCXBhY2tldCA9IGt6YWxsb2Moc2l6ZW9mKCpwYWNrZXQpICsgZGF0YV9zaXplLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXBhY2tldCkKIAkJcmV0dXJuIE5VTEw7CiAKLQltZW1zZXQoc2tiLT5kYXRhLCAwLCBkYXRhX3NpemUgKyBzaXplb2YoKnBhY2tldCkpOwotCi0JcGFja2V0ID0gKHN0cnVjdCBocHNiX3BhY2tldCAqKXNrYi0+ZGF0YTsKLQlwYWNrZXQtPnNrYiA9IHNrYjsKLQotCXBhY2tldC0+aGVhZGVyID0gcGFja2V0LT5lbWJlZGRlZF9oZWFkZXI7CiAJcGFja2V0LT5zdGF0ZSA9IGhwc2JfdW51c2VkOwogCXBhY2tldC0+Z2VuZXJhdGlvbiA9IC0xOwogCUlOSVRfTElTVF9IRUFEKCZwYWNrZXQtPmRyaXZlcl9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmcGFja2V0LT5xdWV1ZSk7CiAJYXRvbWljX3NldCgmcGFja2V0LT5yZWZjbnQsIDEpOwogCiAJaWYgKGRhdGFfc2l6ZSkgewotCQlwYWNrZXQtPmRhdGEgPSAocXVhZGxldF90ICopKHNrYi0+ZGF0YSArIHNpemVvZigqcGFja2V0KSk7Ci0JCXBhY2tldC0+ZGF0YV9zaXplID0gZGF0YV9zaXplOworCQlwYWNrZXQtPmRhdGEgPSBwYWNrZXQtPmVtYmVkZGVkX2RhdGE7CisJCXBhY2tldC0+YWxsb2NhdGVkX2RhdGFfc2l6ZSA9IGRhdGFfc2l6ZTsKIAl9Ci0KIAlyZXR1cm4gcGFja2V0OwogfQogCi0KIC8qKgogICogaHBzYl9mcmVlX3BhY2tldCAtIGZyZWUgcGFja2V0IGFuZCBkYXRhIGFzc29jaWF0ZWQgd2l0aCBpdAogICogQHBhY2tldDogcGFja2V0IHRvIGZyZWUgKGlzIE5VTEwgc2FmZSkKICAqCi0gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgZnJlZSBwYWNrZXQtPmRhdGEgYW5kIGZpbmFsbHkgdGhlIHBhY2tldCBpdHNlbGYuCisgKiBGcmVlcyBAcGFja2V0LT5kYXRhIG9ubHkgaWYgaXQgd2FzIGFsbG9jYXRlZCB0aHJvdWdoIGhwc2JfYWxsb2NfcGFja2V0KCkuCiAgKi8KIHZvaWQgaHBzYl9mcmVlX3BhY2tldChzdHJ1Y3QgaHBzYl9wYWNrZXQgKnBhY2tldCkKIHsKIAlpZiAocGFja2V0ICYmIGF0b21pY19kZWNfYW5kX3Rlc3QoJnBhY2tldC0+cmVmY250KSkgewotCQlCVUdfT04oIWxpc3RfZW1wdHkoJnBhY2tldC0+ZHJpdmVyX2xpc3QpKTsKLQkJa2ZyZWVfc2tiKHBhY2tldC0+c2tiKTsKKwkJQlVHX09OKCFsaXN0X2VtcHR5KCZwYWNrZXQtPmRyaXZlcl9saXN0KSB8fAorCQkgICAgICAgIWxpc3RfZW1wdHkoJnBhY2tldC0+cXVldWUpKTsKKwkJa2ZyZWUocGFja2V0KTsKIAl9CiB9CiAKLQorLyoqCisgKiBocHNiX3Jlc2V0X2J1cyAtIGluaXRpYXRlIGJ1cyByZXNldCBvbiB0aGUgZ2l2ZW4gaG9zdAorICogQGhvc3Q6IGhvc3QgY29udHJvbGxlciB3aG9zZSBidXMgdG8gcmVzZXQKKyAqIEB0eXBlOiBvbmUgb2YgZW51bSByZXNldF90eXBlcworICoKKyAqIFJldHVybnMgMSBpZiBidXMgcmVzZXQgYWxyZWFkeSBpbiBwcm9ncmVzcywgMCBvdGhlcndpc2UuCisgKi8KIGludCBocHNiX3Jlc2V0X2J1cyhzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0LCBpbnQgdHlwZSkKIHsKIAlpZiAoIWhvc3QtPmluX2J1c19yZXNldCkgewpAQCAtMjI5LDYgKzIyOSwxNCBAQAogCXJldHVybiAwOwogfQogCisvKioKKyAqIGhwc2JfYnVzX3Jlc2V0IC0gbm90aWZ5IGEgYnVzIHJlc2V0IHRvIHRoZSBjb3JlCisgKgorICogRm9yIGhvc3QgZHJpdmVyIG1vZHVsZSB1c2FnZS4gIFNhZmUgdG8gdXNlIGluIGludGVycnVwdCBjb250ZXh0LCBhbHRob3VnaAorICogcXVpdGUgY29tcGxleDsgc28geW91IG1heSB3YW50IHRvIHJ1biBpdCBpbiB0aGUgYm90dG9tIHJhdGhlciB0aGFuIHRvcCBoYWxmLgorICoKKyAqIFJldHVybnMgMSBpZiBidXMgcmVzZXQgYWxyZWFkeSBpbiBwcm9ncmVzcywgMCBvdGhlcndpc2UuCisgKi8KIGludCBocHNiX2J1c19yZXNldChzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0KQogewogCWlmIChob3N0LT5pbl9idXNfcmVzZXQpIHsKQEAgLTQwNSw2ICs0MTMsMTQgQEAKIH0KIAogCisvKioKKyAqIGhwc2Jfc2VsZmlkX3JlY2VpdmVkIC0gaGFuZCBvdmVyIHJlY2VpdmVkIHNlbGZpZCBwYWNrZXQgdG8gdGhlIGNvcmUKKyAqCisgKiBGb3IgaG9zdCBkcml2ZXIgbW9kdWxlIHVzYWdlLiAgU2FmZSB0byB1c2UgaW4gaW50ZXJydXB0IGNvbnRleHQuCisgKgorICogVGhlIGhvc3QgZHJpdmVyIHNob3VsZCBoYXZlIGRvbmUgYSBzdWNjZXNzZnVsIGNvbXBsZW1lbnQgY2hlY2sgKHNlY29uZAorICogcXVhZGxldCBpcyBjb21wbGVtZW50IG9mIGZpcnN0KSBiZWZvcmVoYW5kLgorICovCiB2b2lkIGhwc2Jfc2VsZmlkX3JlY2VpdmVkKHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsIHF1YWRsZXRfdCBzaWQpCiB7CiAJaWYgKGhvc3QtPmluX2J1c19yZXNldCkgewpAQCAtNDE2LDYgKzQzMiwxNSBAQAogCX0KIH0KIAorLyoqCisgKiBocHNiX3NlbGZpZF9jb21wbGV0ZSAtIG5vdGlmeSBjb21wbGV0aW9uIG9mIFNlbGZJRCBzdGFnZSB0byB0aGUgY29yZQorICoKKyAqIEZvciBob3N0IGRyaXZlciBtb2R1bGUgdXNhZ2UuICBTYWZlIHRvIHVzZSBpbiBpbnRlcnJ1cHQgY29udGV4dCwgYWx0aG91Z2gKKyAqIHF1aXRlIGNvbXBsZXg7IHNvIHlvdSBtYXkgd2FudCB0byBydW4gaXQgaW4gdGhlIGJvdHRvbSByYXRoZXIgdGhhbiB0b3AgaGFsZi4KKyAqCisgKiBOb3RpZnkgY29tcGxldGlvbiBvZiBTZWxmSUQgc3RhZ2UgdG8gdGhlIGNvcmUgYW5kIHJlcG9ydCBuZXcgcGh5c2ljYWwgSUQKKyAqIGFuZCB3aGV0aGVyIGhvc3QgaXMgcm9vdCBub3cuCisgKi8KIHZvaWQgaHBzYl9zZWxmaWRfY29tcGxldGUoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwgaW50IHBoeWlkLCBpbnQgaXNyb290KQogewogCWlmICghaG9zdC0+aW5fYnVzX3Jlc2V0KQpAQCAtNDYyLDMwICs0ODcsNDEgQEAKIAloaWdobGV2ZWxfaG9zdF9yZXNldChob3N0KTsKIH0KIAorc3RhdGljIHNwaW5sb2NrX3QgcGVuZGluZ19wYWNrZXRzX2xvY2sgPSBTUElOX0xPQ0tfVU5MT0NLRUQ7CiAKKy8qKgorICogaHBzYl9wYWNrZXRfc2VudCAtIG5vdGlmeSBjb3JlIG9mIHNlbmRpbmcgYSBwYWNrZXQKKyAqCisgKiBGb3IgaG9zdCBkcml2ZXIgbW9kdWxlIHVzYWdlLiAgU2FmZSB0byBjYWxsIGZyb20gd2l0aGluIGEgdHJhbnNtaXQgcGFja2V0CisgKiByb3V0aW5lLgorICoKKyAqIE5vdGlmeSBjb3JlIG9mIHNlbmRpbmcgYSBwYWNrZXQuICBBY2tjb2RlIGlzIHRoZSBhY2sgY29kZSByZXR1cm5lZCBmb3IgYXN5bmMKKyAqIHRyYW5zbWl0cyBvciBBQ0tYX1NFTkRfRVJST1IgaWYgdGhlIHRyYW5zbWlzc2lvbiBmYWlsZWQgY29tcGxldGVseTsgQUNLWF9OT05FCisgKiBmb3Igb3RoZXIgY2FzZXMgKGludGVybmFsIGVycm9ycyB0aGF0IGRvbid0IGp1c3RpZnkgYSBwYW5pYykuCisgKi8KIHZvaWQgaHBzYl9wYWNrZXRfc2VudChzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0LCBzdHJ1Y3QgaHBzYl9wYWNrZXQgKnBhY2tldCwKIAkJICAgICAgaW50IGFja2NvZGUpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZob3N0LT5wZW5kaW5nX3BhY2tldF9xdWV1ZS5sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnBlbmRpbmdfcGFja2V0c19sb2NrLCBmbGFncyk7CiAKIAlwYWNrZXQtPmFja19jb2RlID0gYWNrY29kZTsKIAogCWlmIChwYWNrZXQtPm5vX3dhaXRlciB8fCBwYWNrZXQtPnN0YXRlID09IGhwc2JfY29tcGxldGUpIHsKIAkJLyogaWYgcGFja2V0LT5ub193YWl0ZXIsIG11c3Qgbm90IGhhdmUgYSB0bGFiZWwgYWxsb2NhdGVkICovCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhvc3QtPnBlbmRpbmdfcGFja2V0X3F1ZXVlLmxvY2ssIGZsYWdzKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGVuZGluZ19wYWNrZXRzX2xvY2ssIGZsYWdzKTsKIAkJaHBzYl9mcmVlX3BhY2tldChwYWNrZXQpOwogCQlyZXR1cm47CiAJfQogCiAJYXRvbWljX2RlYygmcGFja2V0LT5yZWZjbnQpOwkvKiBkcm9wIEhDJ3MgcmVmZXJlbmNlICovCi0JLyogaGVyZSB0aGUgcGFja2V0IG11c3QgYmUgb24gdGhlIGhvc3QtPnBlbmRpbmdfcGFja2V0X3F1ZXVlICovCisJLyogaGVyZSB0aGUgcGFja2V0IG11c3QgYmUgb24gdGhlIGhvc3QtPnBlbmRpbmdfcGFja2V0cyBxdWV1ZSAqLwogCiAJaWYgKGFja2NvZGUgIT0gQUNLX1BFTkRJTkcgfHwgIXBhY2tldC0+ZXhwZWN0X3Jlc3BvbnNlKSB7CiAJCXBhY2tldC0+c3RhdGUgPSBocHNiX2NvbXBsZXRlOwotCQlfX3NrYl91bmxpbmsocGFja2V0LT5za2IsICZob3N0LT5wZW5kaW5nX3BhY2tldF9xdWV1ZSk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhvc3QtPnBlbmRpbmdfcGFja2V0X3F1ZXVlLmxvY2ssIGZsYWdzKTsKKwkJbGlzdF9kZWxfaW5pdCgmcGFja2V0LT5xdWV1ZSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBlbmRpbmdfcGFja2V0c19sb2NrLCBmbGFncyk7CiAJCXF1ZXVlX3BhY2tldF9jb21wbGV0ZShwYWNrZXQpOwogCQlyZXR1cm47CiAJfQpAQCAtNDkzLDcgKzUyOSw3IEBACiAJcGFja2V0LT5zdGF0ZSA9IGhwc2JfcGVuZGluZzsKIAlwYWNrZXQtPnNlbmR0aW1lID0gamlmZmllczsKIAotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhvc3QtPnBlbmRpbmdfcGFja2V0X3F1ZXVlLmxvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZW5kaW5nX3BhY2tldHNfbG9jaywgZmxhZ3MpOwogCiAJbW9kX3RpbWVyKCZob3N0LT50aW1lb3V0LCBqaWZmaWVzICsgaG9zdC0+dGltZW91dF9pbnRlcnZhbCk7CiB9CkBAIC01MDQsOSArNTQwLDEwIEBACiAgKiBAcm9vdGlkOiByb290IHdob3NlIGZvcmNlX3Jvb3QgYml0IHNob3VsZCBnZXQgc2V0ICgtMSA9IGRvbid0IHNldCBmb3JjZV9yb290KQogICogQGdhcGNudDogZ2FwIGNvdW50IHZhbHVlIHRvIHNldCAoLTEgPSBkb24ndCBzZXQgZ2FwIGNvdW50KQogICoKLSAqIFRoaXMgZnVuY3Rpb24gc2VuZHMgYSBQSFkgY29uZmlnIHBhY2tldCBvbiB0aGUgYnVzIHRocm91Z2ggdGhlIHNwZWNpZmllZCBob3N0LgorICogVGhpcyBmdW5jdGlvbiBzZW5kcyBhIFBIWSBjb25maWcgcGFja2V0IG9uIHRoZSBidXMgdGhyb3VnaCB0aGUgc3BlY2lmaWVkCisgKiBob3N0LgogICoKLSAqIFJldHVybiB2YWx1ZTogMCBmb3Igc3VjY2VzcyBvciBlcnJvciBudW1iZXIgb3RoZXJ3aXNlLgorICogUmV0dXJuIHZhbHVlOiAwIGZvciBzdWNjZXNzIG9yIG5lZ2F0aXZlIGVycm9yIG51bWJlciBvdGhlcndpc2UuCiAgKi8KIGludCBocHNiX3NlbmRfcGh5X2NvbmZpZyhzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0LCBpbnQgcm9vdGlkLCBpbnQgZ2FwY250KQogewpAQCAtNTY3LDEyICs2MDQsMTYgQEAKIAlXQVJOX09OKHBhY2tldC0+bm9fd2FpdGVyICYmIHBhY2tldC0+ZXhwZWN0X3Jlc3BvbnNlKTsKIAogCWlmICghcGFja2V0LT5ub193YWl0ZXIgfHwgcGFja2V0LT5leHBlY3RfcmVzcG9uc2UpIHsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKwogCQlhdG9taWNfaW5jKCZwYWNrZXQtPnJlZmNudCk7CiAJCS8qIFNldCB0aGUgaW5pdGlhbCAic2VuZHRpbWUiIHRvIDEwIHNlY29uZHMgZnJvbSBub3csIHRvCiAJCSAgIHByZXZlbnQgcHJlbWF0dXJlIGV4cGlyeS4gIElmIGEgcGFja2V0IHRha2VzIG1vcmUgdGhhbgogCQkgICAxMCBzZWNvbmRzIHRvIGhpdCB0aGUgd2lyZSwgd2UgaGF2ZSBiaWdnZXIgcHJvYmxlbXMgOikgKi8KIAkJcGFja2V0LT5zZW5kdGltZSA9IGppZmZpZXMgKyAxMCAqIEhaOwotCQlza2JfcXVldWVfdGFpbCgmaG9zdC0+cGVuZGluZ19wYWNrZXRfcXVldWUsIHBhY2tldC0+c2tiKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnBlbmRpbmdfcGFja2V0c19sb2NrLCBmbGFncyk7CisJCWxpc3RfYWRkX3RhaWwoJnBhY2tldC0+cXVldWUsICZob3N0LT5wZW5kaW5nX3BhY2tldHMpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZW5kaW5nX3BhY2tldHNfbG9jaywgZmxhZ3MpOwogCX0KIAogCWlmIChwYWNrZXQtPm5vZGVfaWQgPT0gaG9zdC0+bm9kZV9pZCkgewpAQCAtNjIxLDYgKzY2MiwxMiBAQAogCWNvbXBsZXRlKChzdHJ1Y3QgY29tcGxldGlvbiAqKSBkYXRhKTsKIH0KIAorLyoqCisgKiBocHNiX3NlbmRfcGFja2V0X2FuZF93YWl0IC0gZW5xdWV1ZSBwYWNrZXQsIGJsb2NrIHVudGlsIHRyYW5zYWN0aW9uIGNvbXBsZXRlcworICogQHBhY2tldDogcGFja2V0IHRvIHNlbmQKKyAqCisgKiBSZXR1cm4gdmFsdWU6IDAgb24gc3VjY2VzcywgbmVnYXRpdmUgZXJybm8gb24gZmFpbHVyZS4KKyAqLwogaW50IGhwc2Jfc2VuZF9wYWNrZXRfYW5kX3dhaXQoc3RydWN0IGhwc2JfcGFja2V0ICpwYWNrZXQpCiB7CiAJc3RydWN0IGNvbXBsZXRpb24gZG9uZTsKQEAgLTY0Miw4NiArNjg5LDk3IEBACiAJfQogfQogCitzdGF0aWMgc2l6ZV90IHBhY2tldF9zaXplX3RvX2RhdGFfc2l6ZShzaXplX3QgcGFja2V0X3NpemUsIHNpemVfdCBoZWFkZXJfc2l6ZSwKKwkJCQkgICAgICAgc2l6ZV90IGJ1ZmZlcl9zaXplLCBpbnQgdGNvZGUpCit7CisJc2l6ZV90IHJldCA9IHBhY2tldF9zaXplIDw9IGhlYWRlcl9zaXplID8gMCA6IHBhY2tldF9zaXplIC0gaGVhZGVyX3NpemU7CisKKwlpZiAodW5saWtlbHkocmV0ID4gYnVmZmVyX3NpemUpKQorCQlyZXQgPSBidWZmZXJfc2l6ZTsKKworCWlmICh1bmxpa2VseShyZXQgKyBoZWFkZXJfc2l6ZSAhPSBwYWNrZXRfc2l6ZSkpCisJCUhQU0JfRVJSKCJ1bmV4cGVjdGVkIHBhY2tldCBzaXplICV6ZCAodGNvZGUgJWQpLCBidWc/IiwKKwkJCSBwYWNrZXRfc2l6ZSwgdGNvZGUpOworCXJldHVybiByZXQ7Cit9CiAKIHN0YXRpYyB2b2lkIGhhbmRsZV9wYWNrZXRfcmVzcG9uc2Uoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwgaW50IHRjb2RlLAogCQkJCSAgIHF1YWRsZXRfdCAqZGF0YSwgc2l6ZV90IHNpemUpCiB7Ci0Jc3RydWN0IGhwc2JfcGFja2V0ICpwYWNrZXQgPSBOVUxMOwotCXN0cnVjdCBza19idWZmICpza2I7Ci0JaW50IHRjb2RlX21hdGNoID0gMDsKLQlpbnQgdGxhYmVsOworCXN0cnVjdCBocHNiX3BhY2tldCAqcGFja2V0OworCWludCB0bGFiZWwgPSAoZGF0YVswXSA+PiAxMCkgJiAweDNmOworCXNpemVfdCBoZWFkZXJfc2l6ZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JdGxhYmVsID0gKGRhdGFbMF0gPj4gMTApICYgMHgzZjsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGVuZGluZ19wYWNrZXRzX2xvY2ssIGZsYWdzKTsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZob3N0LT5wZW5kaW5nX3BhY2tldF9xdWV1ZS5sb2NrLCBmbGFncyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShwYWNrZXQsICZob3N0LT5wZW5kaW5nX3BhY2tldHMsIHF1ZXVlKQorCQlpZiAocGFja2V0LT50bGFiZWwgPT0gdGxhYmVsICYmCisJCSAgICBwYWNrZXQtPm5vZGVfaWQgPT0gKGRhdGFbMV0gPj4gMTYpKQorCQkJZ290byBmb3VuZDsKIAotCXNrYl9xdWV1ZV93YWxrKCZob3N0LT5wZW5kaW5nX3BhY2tldF9xdWV1ZSwgc2tiKSB7Ci0JCXBhY2tldCA9IChzdHJ1Y3QgaHBzYl9wYWNrZXQgKilza2ItPmRhdGE7Ci0JCWlmICgocGFja2V0LT50bGFiZWwgPT0gdGxhYmVsKQotCQkgICAgJiYgKHBhY2tldC0+bm9kZV9pZCA9PSAoZGF0YVsxXSA+PiAxNikpKXsKLQkJCWJyZWFrOwotCQl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGVuZGluZ19wYWNrZXRzX2xvY2ssIGZsYWdzKTsKKwlIUFNCX0RFQlVHKCJ1bnNvbGljaXRlZCByZXNwb25zZSBwYWNrZXQgcmVjZWl2ZWQgLSAlcyIsCisJCSAgICJubyB0bGFiZWwgbWF0Y2giKTsKKwlkdW1wX3BhY2tldCgiY29udGVudHMiLCBkYXRhLCAxNiwgLTEpOworCXJldHVybjsKIAotCQlwYWNrZXQgPSBOVUxMOwotCX0KLQotCWlmIChwYWNrZXQgPT0gTlVMTCkgewotCQlIUFNCX0RFQlVHKCJ1bnNvbGljaXRlZCByZXNwb25zZSBwYWNrZXQgcmVjZWl2ZWQgLSBubyB0bGFiZWwgbWF0Y2giKTsKLQkJZHVtcF9wYWNrZXQoImNvbnRlbnRzIiwgZGF0YSwgMTYsIC0xKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG9zdC0+cGVuZGluZ19wYWNrZXRfcXVldWUubG9jaywgZmxhZ3MpOwotCQlyZXR1cm47Ci0JfQotCitmb3VuZDoKIAlzd2l0Y2ggKHBhY2tldC0+dGNvZGUpIHsKIAljYXNlIFRDT0RFX1dSSVRFUToKIAljYXNlIFRDT0RFX1dSSVRFQjoKLQkJaWYgKHRjb2RlICE9IFRDT0RFX1dSSVRFX1JFU1BPTlNFKQorCQlpZiAodW5saWtlbHkodGNvZGUgIT0gVENPREVfV1JJVEVfUkVTUE9OU0UpKQogCQkJYnJlYWs7Ci0JCXRjb2RlX21hdGNoID0gMTsKLQkJbWVtY3B5KHBhY2tldC0+aGVhZGVyLCBkYXRhLCAxMik7Ci0JCWJyZWFrOworCQloZWFkZXJfc2l6ZSA9IDEyOworCQlzaXplID0gMDsKKwkJZ290byBkZXF1ZXVlOworCiAJY2FzZSBUQ09ERV9SRUFEUToKLQkJaWYgKHRjb2RlICE9IFRDT0RFX1JFQURRX1JFU1BPTlNFKQorCQlpZiAodW5saWtlbHkodGNvZGUgIT0gVENPREVfUkVBRFFfUkVTUE9OU0UpKQogCQkJYnJlYWs7Ci0JCXRjb2RlX21hdGNoID0gMTsKLQkJbWVtY3B5KHBhY2tldC0+aGVhZGVyLCBkYXRhLCAxNik7Ci0JCWJyZWFrOworCQloZWFkZXJfc2l6ZSA9IDE2OworCQlzaXplID0gMDsKKwkJZ290byBkZXF1ZXVlOworCiAJY2FzZSBUQ09ERV9SRUFEQjoKLQkJaWYgKHRjb2RlICE9IFRDT0RFX1JFQURCX1JFU1BPTlNFKQorCQlpZiAodW5saWtlbHkodGNvZGUgIT0gVENPREVfUkVBREJfUkVTUE9OU0UpKQogCQkJYnJlYWs7Ci0JCXRjb2RlX21hdGNoID0gMTsKLQkJQlVHX09OKHBhY2tldC0+c2tiLT5sZW4gLSBzaXplb2YoKnBhY2tldCkgPCBzaXplIC0gMTYpOwotCQltZW1jcHkocGFja2V0LT5oZWFkZXIsIGRhdGEsIDE2KTsKLQkJbWVtY3B5KHBhY2tldC0+ZGF0YSwgZGF0YSArIDQsIHNpemUgLSAxNik7Ci0JCWJyZWFrOworCQloZWFkZXJfc2l6ZSA9IDE2OworCQlzaXplID0gcGFja2V0X3NpemVfdG9fZGF0YV9zaXplKHNpemUsIGhlYWRlcl9zaXplLAorCQkJCQkJcGFja2V0LT5hbGxvY2F0ZWRfZGF0YV9zaXplLAorCQkJCQkJdGNvZGUpOworCQlnb3RvIGRlcXVldWU7CisKIAljYXNlIFRDT0RFX0xPQ0tfUkVRVUVTVDoKLQkJaWYgKHRjb2RlICE9IFRDT0RFX0xPQ0tfUkVTUE9OU0UpCisJCWlmICh1bmxpa2VseSh0Y29kZSAhPSBUQ09ERV9MT0NLX1JFU1BPTlNFKSkKIAkJCWJyZWFrOwotCQl0Y29kZV9tYXRjaCA9IDE7Ci0JCXNpemUgPSBtaW4oKHNpemUgLSAxNiksIChzaXplX3QpOCk7Ci0JCUJVR19PTihwYWNrZXQtPnNrYi0+bGVuIC0gc2l6ZW9mKCpwYWNrZXQpIDwgc2l6ZSk7Ci0JCW1lbWNweShwYWNrZXQtPmhlYWRlciwgZGF0YSwgMTYpOwotCQltZW1jcHkocGFja2V0LT5kYXRhLCBkYXRhICsgNCwgc2l6ZSk7Ci0JCWJyZWFrOworCQloZWFkZXJfc2l6ZSA9IDE2OworCQlzaXplID0gcGFja2V0X3NpemVfdG9fZGF0YV9zaXplKG1pbihzaXplLCAoc2l6ZV90KSgxNiArIDgpKSwKKwkJCQkJCWhlYWRlcl9zaXplLAorCQkJCQkJcGFja2V0LT5hbGxvY2F0ZWRfZGF0YV9zaXplLAorCQkJCQkJdGNvZGUpOworCQlnb3RvIGRlcXVldWU7CiAJfQogCi0JaWYgKCF0Y29kZV9tYXRjaCkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZob3N0LT5wZW5kaW5nX3BhY2tldF9xdWV1ZS5sb2NrLCBmbGFncyk7Ci0JCUhQU0JfSU5GTygidW5zb2xpY2l0ZWQgcmVzcG9uc2UgcGFja2V0IHJlY2VpdmVkIC0gdGNvZGUgbWlzbWF0Y2giKTsKLQkJZHVtcF9wYWNrZXQoImNvbnRlbnRzIiwgZGF0YSwgMTYsIC0xKTsKLQkJcmV0dXJuOwotCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZW5kaW5nX3BhY2tldHNfbG9jaywgZmxhZ3MpOworCUhQU0JfREVCVUcoInVuc29saWNpdGVkIHJlc3BvbnNlIHBhY2tldCByZWNlaXZlZCAtICVzIiwKKwkJICAgInRjb2RlIG1pc21hdGNoIik7CisJZHVtcF9wYWNrZXQoImNvbnRlbnRzIiwgZGF0YSwgMTYsIC0xKTsKKwlyZXR1cm47CiAKLQlfX3NrYl91bmxpbmsoc2tiLCAmaG9zdC0+cGVuZGluZ19wYWNrZXRfcXVldWUpOworZGVxdWV1ZToKKwlsaXN0X2RlbF9pbml0KCZwYWNrZXQtPnF1ZXVlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZW5kaW5nX3BhY2tldHNfbG9jaywgZmxhZ3MpOwogCiAJaWYgKHBhY2tldC0+c3RhdGUgPT0gaHBzYl9xdWV1ZWQpIHsKIAkJcGFja2V0LT5zZW5kdGltZSA9IGppZmZpZXM7CiAJCXBhY2tldC0+YWNrX2NvZGUgPSBBQ0tfUEVORElORzsKIAl9Ci0KIAlwYWNrZXQtPnN0YXRlID0gaHBzYl9jb21wbGV0ZTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZob3N0LT5wZW5kaW5nX3BhY2tldF9xdWV1ZS5sb2NrLCBmbGFncyk7CisKKwltZW1jcHkocGFja2V0LT5oZWFkZXIsIGRhdGEsIGhlYWRlcl9zaXplKTsKKwlpZiAoc2l6ZSkKKwkJbWVtY3B5KHBhY2tldC0+ZGF0YSwgZGF0YSArIDQsIHNpemUpOwogCiAJcXVldWVfcGFja2V0X2NvbXBsZXRlKHBhY2tldCk7CiB9CkBAIC03MzUsNiArNzkzLDcgQEAKIAlwID0gaHBzYl9hbGxvY19wYWNrZXQoZHNpemUpOwogCWlmICh1bmxpa2VseShwID09IE5VTEwpKSB7CiAJCS8qIEZJWE1FIC0gc2VuZCBkYXRhX2Vycm9yIHJlc3BvbnNlICovCisJCUhQU0JfRVJSKCJvdXQgb2YgbWVtb3J5LCBjYW5ub3Qgc2VuZCByZXNwb25zZSBwYWNrZXQiKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCkBAIC03ODQsNyArODQzLDYgQEAKIHN0YXRpYyB2b2lkIGZpbGxfYXN5bmNfd3JpdGVfcmVzcChzdHJ1Y3QgaHBzYl9wYWNrZXQgKnBhY2tldCwgaW50IHJjb2RlKQogewogCVBSRVBfQVNZTkNfSEVBRF9SQ09ERShUQ09ERV9XUklURV9SRVNQT05TRSk7Ci0JcGFja2V0LT5oZWFkZXJbMl0gPSAwOwogCXBhY2tldC0+aGVhZGVyX3NpemUgPSAxMjsKIAlwYWNrZXQtPmRhdGFfc2l6ZSA9IDA7CiB9CkBAIC04MDEsMTIgKzg1OSw5IEBACiAJcGFja2V0LT5kYXRhX3NpemUgPSBsZW5ndGg7CiB9CiAKLSNkZWZpbmUgUFJFUF9SRVBMWV9QQUNLRVQobGVuZ3RoKSBcCi0JCXBhY2tldCA9IGNyZWF0ZV9yZXBseV9wYWNrZXQoaG9zdCwgZGF0YSwgbGVuZ3RoKTsgXAotCQlpZiAocGFja2V0ID09IE5VTEwpIGJyZWFrCi0KIHN0YXRpYyB2b2lkIGhhbmRsZV9pbmNvbWluZ19wYWNrZXQoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwgaW50IHRjb2RlLAotCQkJCSAgIHF1YWRsZXRfdCAqZGF0YSwgc2l6ZV90IHNpemUsIGludCB3cml0ZV9hY2tlZCkKKwkJCQkgICBxdWFkbGV0X3QgKmRhdGEsIHNpemVfdCBzaXplLAorCQkJCSAgIGludCB3cml0ZV9hY2tlZCkKIHsKIAlzdHJ1Y3QgaHBzYl9wYWNrZXQgKnBhY2tldDsKIAlpbnQgbGVuZ3RoLCByY29kZSwgZXh0Y29kZTsKQEAgLTgxNiw3NCArODcxLDcyIEBACiAJdTE2IGZsYWdzID0gKHUxNikgZGF0YVswXTsKIAl1NjQgYWRkcjsKIAotCS8qIGJpZyBGSVhNRSAtIG5vIGVycm9yIGNoZWNraW5nIGlzIGRvbmUgZm9yIGFuIG91dCBvZiBib3VuZHMgbGVuZ3RoICovCisJLyogRklYTUU/CisJICogT3V0LW9mLWJvdW5kcyBsZW5ndGhzIGFyZSBsZWZ0IGZvciBoaWdobGV2ZWxfcmVhZHx3cml0ZSB0byBjYXAuICovCiAKIAlzd2l0Y2ggKHRjb2RlKSB7CiAJY2FzZSBUQ09ERV9XUklURVE6CiAJCWFkZHIgPSAoKCh1NjQpKGRhdGFbMV0gJiAweGZmZmYpKSA8PCAzMikgfCBkYXRhWzJdOwotCQlyY29kZSA9IGhpZ2hsZXZlbF93cml0ZShob3N0LCBzb3VyY2UsIGRlc3QsIGRhdGErMywKKwkJcmNvZGUgPSBoaWdobGV2ZWxfd3JpdGUoaG9zdCwgc291cmNlLCBkZXN0LCBkYXRhICsgMywKIAkJCQkJYWRkciwgNCwgZmxhZ3MpOwotCi0JCWlmICghd3JpdGVfYWNrZWQKLQkJICAgICYmIChOT0RFSURfVE9fTk9ERShkYXRhWzBdID4+IDE2KSAhPSBOT0RFX01BU0spCi0JCSAgICAmJiAocmNvZGUgPj0gMCkpIHsKLQkJCS8qIG5vdCBhIGJyb2FkY2FzdCB3cml0ZSwgcmVwbHkgKi8KLQkJCVBSRVBfUkVQTFlfUEFDS0VUKDApOwotCQkJZmlsbF9hc3luY193cml0ZV9yZXNwKHBhY2tldCwgcmNvZGUpOwotCQkJc2VuZF9wYWNrZXRfbm9jYXJlKHBhY2tldCk7Ci0JCX0KLQkJYnJlYWs7CisJCWdvdG8gaGFuZGxlX3dyaXRlX3JlcXVlc3Q7CiAKIAljYXNlIFRDT0RFX1dSSVRFQjoKIAkJYWRkciA9ICgoKHU2NCkoZGF0YVsxXSAmIDB4ZmZmZikpIDw8IDMyKSB8IGRhdGFbMl07Ci0JCXJjb2RlID0gaGlnaGxldmVsX3dyaXRlKGhvc3QsIHNvdXJjZSwgZGVzdCwgZGF0YSs0LAotCQkJCQlhZGRyLCBkYXRhWzNdPj4xNiwgZmxhZ3MpOwotCi0JCWlmICghd3JpdGVfYWNrZWQKLQkJICAgICYmIChOT0RFSURfVE9fTk9ERShkYXRhWzBdID4+IDE2KSAhPSBOT0RFX01BU0spCi0JCSAgICAmJiAocmNvZGUgPj0gMCkpIHsKLQkJCS8qIG5vdCBhIGJyb2FkY2FzdCB3cml0ZSwgcmVwbHkgKi8KLQkJCVBSRVBfUkVQTFlfUEFDS0VUKDApOworCQlyY29kZSA9IGhpZ2hsZXZlbF93cml0ZShob3N0LCBzb3VyY2UsIGRlc3QsIGRhdGEgKyA0LAorCQkJCQlhZGRyLCBkYXRhWzNdID4+IDE2LCBmbGFncyk7CitoYW5kbGVfd3JpdGVfcmVxdWVzdDoKKwkJaWYgKHJjb2RlIDwgMCB8fCB3cml0ZV9hY2tlZCB8fAorCQkgICAgTk9ERUlEX1RPX05PREUoZGF0YVswXSA+PiAxNikgPT0gTk9ERV9NQVNLKQorCQkJcmV0dXJuOworCQkvKiBub3QgYSBicm9hZGNhc3Qgd3JpdGUsIHJlcGx5ICovCisJCXBhY2tldCA9IGNyZWF0ZV9yZXBseV9wYWNrZXQoaG9zdCwgZGF0YSwgMCk7CisJCWlmIChwYWNrZXQpIHsKIAkJCWZpbGxfYXN5bmNfd3JpdGVfcmVzcChwYWNrZXQsIHJjb2RlKTsKIAkJCXNlbmRfcGFja2V0X25vY2FyZShwYWNrZXQpOwogCQl9Ci0JCWJyZWFrOworCQlyZXR1cm47CiAKIAljYXNlIFRDT0RFX1JFQURROgogCQlhZGRyID0gKCgodTY0KShkYXRhWzFdICYgMHhmZmZmKSkgPDwgMzIpIHwgZGF0YVsyXTsKIAkJcmNvZGUgPSBoaWdobGV2ZWxfcmVhZChob3N0LCBzb3VyY2UsICZidWZmZXIsIGFkZHIsIDQsIGZsYWdzKTsKKwkJaWYgKHJjb2RlIDwgMCkKKwkJCXJldHVybjsKIAotCQlpZiAocmNvZGUgPj0gMCkgewotCQkJUFJFUF9SRVBMWV9QQUNLRVQoMCk7CisJCXBhY2tldCA9IGNyZWF0ZV9yZXBseV9wYWNrZXQoaG9zdCwgZGF0YSwgMCk7CisJCWlmIChwYWNrZXQpIHsKIAkJCWZpbGxfYXN5bmNfcmVhZHF1YWRfcmVzcChwYWNrZXQsIHJjb2RlLCBidWZmZXIpOwogCQkJc2VuZF9wYWNrZXRfbm9jYXJlKHBhY2tldCk7CiAJCX0KLQkJYnJlYWs7CisJCXJldHVybjsKIAogCWNhc2UgVENPREVfUkVBREI6CiAJCWxlbmd0aCA9IGRhdGFbM10gPj4gMTY7Ci0JCVBSRVBfUkVQTFlfUEFDS0VUKGxlbmd0aCk7CisJCXBhY2tldCA9IGNyZWF0ZV9yZXBseV9wYWNrZXQoaG9zdCwgZGF0YSwgbGVuZ3RoKTsKKwkJaWYgKCFwYWNrZXQpCisJCQlyZXR1cm47CiAKIAkJYWRkciA9ICgoKHU2NCkoZGF0YVsxXSAmIDB4ZmZmZikpIDw8IDMyKSB8IGRhdGFbMl07CiAJCXJjb2RlID0gaGlnaGxldmVsX3JlYWQoaG9zdCwgc291cmNlLCBwYWNrZXQtPmRhdGEsIGFkZHIsCiAJCQkJICAgICAgIGxlbmd0aCwgZmxhZ3MpOwotCi0JCWlmIChyY29kZSA+PSAwKSB7Ci0JCQlmaWxsX2FzeW5jX3JlYWRibG9ja19yZXNwKHBhY2tldCwgcmNvZGUsIGxlbmd0aCk7Ci0JCQlzZW5kX3BhY2tldF9ub2NhcmUocGFja2V0KTsKLQkJfSBlbHNlIHsKKwkJaWYgKHJjb2RlIDwgMCkgewogCQkJaHBzYl9mcmVlX3BhY2tldChwYWNrZXQpOworCQkJcmV0dXJuOwogCQl9Ci0JCWJyZWFrOworCQlmaWxsX2FzeW5jX3JlYWRibG9ja19yZXNwKHBhY2tldCwgcmNvZGUsIGxlbmd0aCk7CisJCXNlbmRfcGFja2V0X25vY2FyZShwYWNrZXQpOworCQlyZXR1cm47CiAKIAljYXNlIFRDT0RFX0xPQ0tfUkVRVUVTVDoKIAkJbGVuZ3RoID0gZGF0YVszXSA+PiAxNjsKIAkJZXh0Y29kZSA9IGRhdGFbM10gJiAweGZmZmY7CiAJCWFkZHIgPSAoKCh1NjQpKGRhdGFbMV0gJiAweGZmZmYpKSA8PCAzMikgfCBkYXRhWzJdOwogCi0JCVBSRVBfUkVQTFlfUEFDS0VUKDgpOworCQlwYWNrZXQgPSBjcmVhdGVfcmVwbHlfcGFja2V0KGhvc3QsIGRhdGEsIDgpOworCQlpZiAoIXBhY2tldCkKKwkJCXJldHVybjsKIAotCQlpZiAoKGV4dGNvZGUgPT0gMCkgfHwgKGV4dGNvZGUgPj0gNykpIHsKKwkJaWYgKGV4dGNvZGUgPT0gMCB8fCBleHRjb2RlID49IDcpIHsKIAkJCS8qIGxldCBzd2l0Y2ggZGVmYXVsdCBoYW5kbGUgZXJyb3IgKi8KIAkJCWxlbmd0aCA9IDA7CiAJCX0KQEAgLTg5MSwxMiArOTQ0LDEyIEBACiAJCXN3aXRjaCAobGVuZ3RoKSB7CiAJCWNhc2UgNDoKIAkJCXJjb2RlID0gaGlnaGxldmVsX2xvY2soaG9zdCwgc291cmNlLCBwYWNrZXQtPmRhdGEsIGFkZHIsCi0JCQkJCSAgICAgICBkYXRhWzRdLCAwLCBleHRjb2RlLGZsYWdzKTsKKwkJCQkJICAgICAgIGRhdGFbNF0sIDAsIGV4dGNvZGUsIGZsYWdzKTsKIAkJCWZpbGxfYXN5bmNfbG9ja19yZXNwKHBhY2tldCwgcmNvZGUsIGV4dGNvZGUsIDQpOwogCQkJYnJlYWs7CiAJCWNhc2UgODoKLQkJCWlmICgoZXh0Y29kZSAhPSBFWFRDT0RFX0ZFVENIX0FERCkKLQkJCSAgICAmJiAoZXh0Y29kZSAhPSBFWFRDT0RFX0xJVFRMRV9BREQpKSB7CisJCQlpZiAoZXh0Y29kZSAhPSBFWFRDT0RFX0ZFVENIX0FERCAmJgorCQkJICAgIGV4dGNvZGUgIT0gRVhUQ09ERV9MSVRUTEVfQUREKSB7CiAJCQkJcmNvZGUgPSBoaWdobGV2ZWxfbG9jayhob3N0LCBzb3VyY2UsCiAJCQkJCQkgICAgICAgcGFja2V0LT5kYXRhLCBhZGRyLAogCQkJCQkJICAgICAgIGRhdGFbNV0sIGRhdGFbNF0sCkBAIC05MjAsMjkgKzk3MywzOCBAQAogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlyY29kZSA9IFJDT0RFX1RZUEVfRVJST1I7Ci0JCQlmaWxsX2FzeW5jX2xvY2tfcmVzcChwYWNrZXQsIHJjb2RlLAotCQkJCQkgICAgIGV4dGNvZGUsIDApOworCQkJZmlsbF9hc3luY19sb2NrX3Jlc3AocGFja2V0LCByY29kZSwgZXh0Y29kZSwgMCk7CiAJCX0KIAotCQlpZiAocmNvZGUgPj0gMCkgewotCQkJc2VuZF9wYWNrZXRfbm9jYXJlKHBhY2tldCk7Ci0JCX0gZWxzZSB7CisJCWlmIChyY29kZSA8IDApCiAJCQlocHNiX2ZyZWVfcGFja2V0KHBhY2tldCk7Ci0JCX0KLQkJYnJlYWs7CisJCWVsc2UKKwkJCXNlbmRfcGFja2V0X25vY2FyZShwYWNrZXQpOworCQlyZXR1cm47CiAJfQotCiB9Ci0jdW5kZWYgUFJFUF9SRVBMWV9QQUNLRVQKIAotCisvKioKKyAqIGhwc2JfcGFja2V0X3JlY2VpdmVkIC0gaGFuZCBvdmVyIHJlY2VpdmVkIHBhY2tldCB0byB0aGUgY29yZQorICoKKyAqIEZvciBob3N0IGRyaXZlciBtb2R1bGUgdXNhZ2UuCisgKgorICogVGhlIGNvbnRlbnRzIG9mIGRhdGEgYXJlIGV4cGVjdGVkIHRvIGJlIHRoZSBmdWxsIHBhY2tldCBidXQgd2l0aCB0aGUgQ1JDcworICogbGVmdCBvdXQgKGRhdGEgYmxvY2sgZm9sbG93cyBoZWFkZXIgaW1tZWRpYXRlbHkpLCB3aXRoIHRoZSBoZWFkZXIgKGkuZS4gdGhlCisgKiBmaXJzdCBmb3VyIHF1YWRsZXRzKSBpbiBtYWNoaW5lIGJ5dGUgb3JkZXIgYW5kIHRoZSBkYXRhIGJsb2NrIGluIGJpZyBlbmRpYW4uCisgKiAqQGRhdGEgY2FuIGJlIHNhZmVseSBvdmVyd3JpdHRlbiBhZnRlciB0aGlzIGNhbGwuCisgKgorICogSWYgdGhlIHBhY2tldCBpcyBhIHdyaXRlIHJlcXVlc3QsIEB3cml0ZV9hY2tlZCBpcyB0byBiZSBzZXQgdG8gdHJ1ZSBpZiBpdCB3YXMKKyAqIGFja19jb21wbGV0ZSdkIGFscmVhZHksIGZhbHNlIG90aGVyd2lzZS4gIFRoaXMgYXJndW1lbnQgaXMgaWdub3JlZCBmb3IgYW55CisgKiBvdGhlciBwYWNrZXQgdHlwZS4KKyAqLwogdm9pZCBocHNiX3BhY2tldF9yZWNlaXZlZChzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0LCBxdWFkbGV0X3QgKmRhdGEsIHNpemVfdCBzaXplLAogCQkJICBpbnQgd3JpdGVfYWNrZWQpCiB7CiAJaW50IHRjb2RlOwogCi0JaWYgKGhvc3QtPmluX2J1c19yZXNldCkgewotCQlIUFNCX0lORk8oInJlY2VpdmVkIHBhY2tldCBkdXJpbmcgcmVzZXQ7IGlnbm9yaW5nIik7CisJaWYgKHVubGlrZWx5KGhvc3QtPmluX2J1c19yZXNldCkpIHsKKwkJSFBTQl9ERUJVRygicmVjZWl2ZWQgcGFja2V0IGR1cmluZyByZXNldDsgaWdub3JpbmciKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtOTc2LDIzICsxMDM4LDI3IEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJSFBTQl9OT1RJQ0UoInJlY2VpdmVkIHBhY2tldCB3aXRoIGJvZ3VzIHRyYW5zYWN0aW9uIGNvZGUgJWQiLAotCQkJICAgIHRjb2RlKTsKKwkJSFBTQl9ERUJVRygicmVjZWl2ZWQgcGFja2V0IHdpdGggYm9ndXMgdHJhbnNhY3Rpb24gY29kZSAlZCIsCisJCQkgICB0Y29kZSk7CiAJCWJyZWFrOwogCX0KIH0KIAotCiBzdGF0aWMgdm9pZCBhYm9ydF9yZXF1ZXN0cyhzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0KQogewotCXN0cnVjdCBocHNiX3BhY2tldCAqcGFja2V0OwotCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IGhwc2JfcGFja2V0ICpwYWNrZXQsICpwOworCXN0cnVjdCBsaXN0X2hlYWQgdG1wOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlob3N0LT5kcml2ZXItPmRldmN0bChob3N0LCBDQU5DRUxfUkVRVUVTVFMsIDApOwogCi0Jd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZSgmaG9zdC0+cGVuZGluZ19wYWNrZXRfcXVldWUpKSAhPSBOVUxMKSB7Ci0JCXBhY2tldCA9IChzdHJ1Y3QgaHBzYl9wYWNrZXQgKilza2ItPmRhdGE7CisJSU5JVF9MSVNUX0hFQUQoJnRtcCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnBlbmRpbmdfcGFja2V0c19sb2NrLCBmbGFncyk7CisJbGlzdF9zcGxpY2VfaW5pdCgmaG9zdC0+cGVuZGluZ19wYWNrZXRzLCAmdG1wKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZW5kaW5nX3BhY2tldHNfbG9jaywgZmxhZ3MpOwogCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBhY2tldCwgcCwgJnRtcCwgcXVldWUpIHsKKwkJbGlzdF9kZWxfaW5pdCgmcGFja2V0LT5xdWV1ZSk7CiAJCXBhY2tldC0+c3RhdGUgPSBocHNiX2NvbXBsZXRlOwogCQlwYWNrZXQtPmFja19jb2RlID0gQUNLWF9BQk9SVEVEOwogCQlxdWV1ZV9wYWNrZXRfY29tcGxldGUocGFja2V0KTsKQEAgLTEwMDIsODcgKzEwNjgsOTAgQEAKIHZvaWQgYWJvcnRfdGltZWRvdXRzKHVuc2lnbmVkIGxvbmcgX19vcGFxdWUpCiB7CiAJc3RydWN0IGhwc2JfaG9zdCAqaG9zdCA9IChzdHJ1Y3QgaHBzYl9ob3N0ICopX19vcGFxdWU7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgaHBzYl9wYWNrZXQgKnBhY2tldDsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCXVuc2lnbmVkIGxvbmcgZXhwaXJlOworCXN0cnVjdCBocHNiX3BhY2tldCAqcGFja2V0LCAqcDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHRtcDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzLCBleHBpcmUsIGo7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaG9zdC0+Y3NyLmxvY2ssIGZsYWdzKTsKIAlleHBpcmUgPSBob3N0LT5jc3IuZXhwaXJlOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhvc3QtPmNzci5sb2NrLCBmbGFncyk7CiAKLQkvKiBIb2xkIHRoZSBsb2NrIGFyb3VuZCB0aGlzLCBzaW5jZSB3ZSBhcmVuJ3QgZGVxdWV1aW5nIGFsbAotCSAqIHBhY2tldHMsIGp1c3Qgb25lcyB3ZSBuZWVkLiAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZob3N0LT5wZW5kaW5nX3BhY2tldF9xdWV1ZS5sb2NrLCBmbGFncyk7CisJaiA9IGppZmZpZXM7CisJSU5JVF9MSVNUX0hFQUQoJnRtcCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnBlbmRpbmdfcGFja2V0c19sb2NrLCBmbGFncyk7CiAKLQl3aGlsZSAoIXNrYl9xdWV1ZV9lbXB0eSgmaG9zdC0+cGVuZGluZ19wYWNrZXRfcXVldWUpKSB7Ci0JCXNrYiA9IHNrYl9wZWVrKCZob3N0LT5wZW5kaW5nX3BhY2tldF9xdWV1ZSk7Ci0KLQkJcGFja2V0ID0gKHN0cnVjdCBocHNiX3BhY2tldCAqKXNrYi0+ZGF0YTsKLQotCQlpZiAodGltZV9iZWZvcmUocGFja2V0LT5zZW5kdGltZSArIGV4cGlyZSwgamlmZmllcykpIHsKLQkJCV9fc2tiX3VubGluayhza2IsICZob3N0LT5wZW5kaW5nX3BhY2tldF9xdWV1ZSk7Ci0JCQlwYWNrZXQtPnN0YXRlID0gaHBzYl9jb21wbGV0ZTsKLQkJCXBhY2tldC0+YWNrX2NvZGUgPSBBQ0tYX1RJTUVPVVQ7Ci0JCQlxdWV1ZV9wYWNrZXRfY29tcGxldGUocGFja2V0KTsKLQkJfSBlbHNlIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocGFja2V0LCBwLCAmaG9zdC0+cGVuZGluZ19wYWNrZXRzLCBxdWV1ZSkgeworCQlpZiAodGltZV9iZWZvcmUocGFja2V0LT5zZW5kdGltZSArIGV4cGlyZSwgaikpCisJCQlsaXN0X21vdmVfdGFpbCgmcGFja2V0LT5xdWV1ZSwgJnRtcCk7CisJCWVsc2UKIAkJCS8qIFNpbmNlIHBhY2tldHMgYXJlIGFkZGVkIHRvIHRoZSB0YWlsLCB0aGUgb2xkZXN0CiAJCQkgKiBvbmVzIGFyZSBmaXJzdCwgYWx3YXlzLiBXaGVuIHdlIGdldCB0byBvbmUgdGhhdAogCQkJICogaXNuJ3QgdGltZWQgb3V0LCB0aGUgcmVzdCBhcmVuJ3QgZWl0aGVyLiAqLwogCQkJYnJlYWs7Ci0JCX0KIAl9CisJaWYgKCFsaXN0X2VtcHR5KCZob3N0LT5wZW5kaW5nX3BhY2tldHMpKQorCQltb2RfdGltZXIoJmhvc3QtPnRpbWVvdXQsIGogKyBob3N0LT50aW1lb3V0X2ludGVydmFsKTsKIAotCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZob3N0LT5wZW5kaW5nX3BhY2tldF9xdWV1ZSkpCi0JCW1vZF90aW1lcigmaG9zdC0+dGltZW91dCwgamlmZmllcyArIGhvc3QtPnRpbWVvdXRfaW50ZXJ2YWwpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBlbmRpbmdfcGFja2V0c19sb2NrLCBmbGFncyk7CiAKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZob3N0LT5wZW5kaW5nX3BhY2tldF9xdWV1ZS5sb2NrLCBmbGFncyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBhY2tldCwgcCwgJnRtcCwgcXVldWUpIHsKKwkJbGlzdF9kZWxfaW5pdCgmcGFja2V0LT5xdWV1ZSk7CisJCXBhY2tldC0+c3RhdGUgPSBocHNiX2NvbXBsZXRlOworCQlwYWNrZXQtPmFja19jb2RlID0gQUNLWF9USU1FT1VUOworCQlxdWV1ZV9wYWNrZXRfY29tcGxldGUocGFja2V0KTsKKwl9CiB9CiAKLQotLyogS2VybmVsIHRocmVhZCBhbmQgdmFycywgd2hpY2ggaGFuZGxlcyBwYWNrZXRzIHRoYXQgYXJlIGNvbXBsZXRlZC4gT25seQotICogcGFja2V0cyB0aGF0IGhhdmUgYSAiY29tcGxldGUiIGZ1bmN0aW9uIGFyZSBzZW50IGhlcmUuIFRoaXMgd2F5LCB0aGUKLSAqIGNvbXBsZXRpb24gaXMgcnVuIG91dCBvZiBrZXJuZWwgY29udGV4dCwgYW5kIGRvZXNuJ3QgYmxvY2sgdGhlIHJlc3Qgb2YKLSAqIHRoZSBzdGFjay4gKi8KIHN0YXRpYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmtocHNicGt0X3RocmVhZDsKLXN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZl9oZWFkIGhwc2Jwa3RfcXVldWU7CitzdGF0aWMgTElTVF9IRUFEKGhwc2Jwa3RfcXVldWUpOwogCiBzdGF0aWMgdm9pZCBxdWV1ZV9wYWNrZXRfY29tcGxldGUoc3RydWN0IGhwc2JfcGFja2V0ICpwYWNrZXQpCiB7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwogCWlmIChwYWNrZXQtPm5vX3dhaXRlcikgewogCQlocHNiX2ZyZWVfcGFja2V0KHBhY2tldCk7CiAJCXJldHVybjsKIAl9CiAJaWYgKHBhY2tldC0+Y29tcGxldGVfcm91dGluZSAhPSBOVUxMKSB7Ci0JCXNrYl9xdWV1ZV90YWlsKCZocHNicGt0X3F1ZXVlLCBwYWNrZXQtPnNrYik7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZwZW5kaW5nX3BhY2tldHNfbG9jaywgZmxhZ3MpOworCQlsaXN0X2FkZF90YWlsKCZwYWNrZXQtPnF1ZXVlLCAmaHBzYnBrdF9xdWV1ZSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBlbmRpbmdfcGFja2V0c19sb2NrLCBmbGFncyk7CiAJCXdha2VfdXBfcHJvY2VzcyhraHBzYnBrdF90aHJlYWQpOwogCX0KIAlyZXR1cm47CiB9CiAKKy8qCisgKiBLZXJuZWwgdGhyZWFkIHdoaWNoIGhhbmRsZXMgcGFja2V0cyB0aGF0IGFyZSBjb21wbGV0ZWQuICBUaGlzIHdheSB0aGUKKyAqIHBhY2tldCdzICJjb21wbGV0ZSIgZnVuY3Rpb24gaXMgYXN5bmNocm9ub3VzbHkgcnVuIGluIHByb2Nlc3MgY29udGV4dC4KKyAqIE9ubHkgcGFja2V0cyB3aGljaCBoYXZlIGEgImNvbXBsZXRlIiBmdW5jdGlvbiBtYXkgYmUgc2VudCBoZXJlLgorICovCiBzdGF0aWMgaW50IGhwc2Jwa3RfdGhyZWFkKHZvaWQgKl9faGkpCiB7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQlzdHJ1Y3QgaHBzYl9wYWNrZXQgKnBhY2tldDsKLQl2b2lkICgqY29tcGxldGVfcm91dGluZSkodm9pZCopOwotCXZvaWQgKmNvbXBsZXRlX2RhdGE7CisJc3RydWN0IGhwc2JfcGFja2V0ICpwYWNrZXQsICpwOworCXN0cnVjdCBsaXN0X2hlYWQgdG1wOworCWludCBtYXlfc2NoZWR1bGU7CiAKIAljdXJyZW50LT5mbGFncyB8PSBQRl9OT0ZSRUVaRTsKIAogCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7Ci0JCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJmhwc2Jwa3RfcXVldWUpKSAhPSBOVUxMKSB7Ci0JCQlwYWNrZXQgPSAoc3RydWN0IGhwc2JfcGFja2V0ICopc2tiLT5kYXRhOwogCi0JCQljb21wbGV0ZV9yb3V0aW5lID0gcGFja2V0LT5jb21wbGV0ZV9yb3V0aW5lOwotCQkJY29tcGxldGVfZGF0YSA9IHBhY2tldC0+Y29tcGxldGVfZGF0YTsKKwkJSU5JVF9MSVNUX0hFQUQoJnRtcCk7CisJCXNwaW5fbG9ja19pcnEoJnBlbmRpbmdfcGFja2V0c19sb2NrKTsKKwkJbGlzdF9zcGxpY2VfaW5pdCgmaHBzYnBrdF9xdWV1ZSwgJnRtcCk7CisJCXNwaW5fdW5sb2NrX2lycSgmcGVuZGluZ19wYWNrZXRzX2xvY2spOwogCi0JCQlwYWNrZXQtPmNvbXBsZXRlX3JvdXRpbmUgPSBwYWNrZXQtPmNvbXBsZXRlX2RhdGEgPSBOVUxMOwotCi0JCQljb21wbGV0ZV9yb3V0aW5lKGNvbXBsZXRlX2RhdGEpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocGFja2V0LCBwLCAmdG1wLCBxdWV1ZSkgeworCQkJbGlzdF9kZWxfaW5pdCgmcGFja2V0LT5xdWV1ZSk7CisJCQlwYWNrZXQtPmNvbXBsZXRlX3JvdXRpbmUocGFja2V0LT5jb21wbGV0ZV9kYXRhKTsKIAkJfQogCiAJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JCWlmICghc2tiX3BlZWsoJmhwc2Jwa3RfcXVldWUpKQorCQlzcGluX2xvY2tfaXJxKCZwZW5kaW5nX3BhY2tldHNfbG9jayk7CisJCW1heV9zY2hlZHVsZSA9IGxpc3RfZW1wdHkoJmhwc2Jwa3RfcXVldWUpOworCQlzcGluX3VubG9ja19pcnEoJnBlbmRpbmdfcGFja2V0c19sb2NrKTsKKwkJaWYgKG1heV9zY2hlZHVsZSkKIAkJCXNjaGVkdWxlKCk7CiAJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKIAl9CkBAIC0xMDkzLDggKzExNjIsNiBAQAogewogCWludCBpLCByZXQ7CiAKLQlza2JfcXVldWVfaGVhZF9pbml0KCZocHNicGt0X3F1ZXVlKTsKLQogCS8qIG5vbi1mYXRhbCBlcnJvciAqLwogCWlmIChocHNiX2luaXRfY29uZmlnX3JvbXMoKSkgewogCQlIUFNCX0VSUigiRmFpbGVkIHRvIGluaXRpYWxpemUgc29tZSBjb25maWcgcm9tIGVudHJpZXMuXG4iKTsKQEAgLTEyNjgsNyArMTMzNSw2IEBACiBFWFBPUlRfU1lNQk9MKGhwc2Jfc2V0X2hvc3RpbmZvX2tleSk7CiBFWFBPUlRfU1lNQk9MKGhwc2JfZ2V0X2hvc3RpbmZvX2J5a2V5KTsKIEVYUE9SVF9TWU1CT0woaHBzYl9zZXRfaG9zdGluZm8pOwotRVhQT1JUX1NZTUJPTChoaWdobGV2ZWxfaG9zdF9yZXNldCk7CiAKIC8qKiBub2RlbWdyLmMgKiovCiBFWFBPUlRfU1lNQk9MKGhwc2Jfbm9kZV9maWxsX3BhY2tldCk7CkBAIC0xMzExLDExICsxMzc3LDEwIEBACiBFWFBPUlRfU1lNQk9MKGhwc2JfaXNvX3JlY3ZfZmx1c2gpOwogCiAvKiogY3NyMTIxMi5jICoqLwotRVhQT1JUX1NZTUJPTChjc3IxMjEyX25ld19kaXJlY3RvcnkpOwogRVhQT1JUX1NZTUJPTChjc3IxMjEyX2F0dGFjaF9rZXl2YWxfdG9fZGlyZWN0b3J5KTsKIEVYUE9SVF9TWU1CT0woY3NyMTIxMl9kZXRhY2hfa2V5dmFsX2Zyb21fZGlyZWN0b3J5KTsKLUVYUE9SVF9TWU1CT0woY3NyMTIxMl9yZWxlYXNlX2tleXZhbCk7Ci1FWFBPUlRfU1lNQk9MKGNzcjEyMTJfcmVhZCk7CitFWFBPUlRfU1lNQk9MKGNzcjEyMTJfZ2V0X2tleXZhbCk7CitFWFBPUlRfU1lNQk9MKGNzcjEyMTJfbmV3X2RpcmVjdG9yeSk7CiBFWFBPUlRfU1lNQk9MKGNzcjEyMTJfcGFyc2Vfa2V5dmFsKTsKLUVYUE9SVF9TWU1CT0woX2NzcjEyMTJfcmVhZF9rZXl2YWwpOwotRVhQT1JUX1NZTUJPTChfY3NyMTIxMl9kZXN0cm95X2tleXZhbCk7CitFWFBPUlRfU1lNQk9MKGNzcjEyMTJfcmVhZCk7CitFWFBPUlRfU1lNQk9MKGNzcjEyMTJfcmVsZWFzZV9rZXl2YWwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC9pZWVlMTM5NF9jb3JlLmggYi9kcml2ZXJzL2llZWUxMzk0L2llZWUxMzk0X2NvcmUuaAppbmRleCBiZDI5ZDhlLi5hZDUyNjUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWUxMzk0L2llZWUxMzk0X2NvcmUuaAorKysgYi9kcml2ZXJzL2llZWUxMzk0L2llZWUxMzk0X2NvcmUuaApAQCAtNCw3ICs0LDYgQEAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KIApAQCAtMTMsNyArMTIsNyBAQAogCiBzdHJ1Y3QgaHBzYl9wYWNrZXQgewogCS8qIFRoaXMgc3RydWN0IGlzIGJhc2ljYWxseSByZWFkLW9ubHkgZm9yIGhvc3RzIHdpdGggdGhlIGV4Y2VwdGlvbiBvZgotCSAqIHRoZSBkYXRhIGJ1ZmZlciBjb250ZW50cyBhbmQgeG5leHQgLSBzZWUgYmVsb3cuICovCisJICogdGhlIGRhdGEgYnVmZmVyIGNvbnRlbnRzIGFuZCBkcml2ZXJfbGlzdC4gKi8KIAogCS8qIFRoaXMgY2FuIGJlIHVzZWQgZm9yIGhvc3QgZHJpdmVyIGludGVybmFsIGxpbmtpbmcuCiAJICoKQEAgLTQ5LDEzNCArNDgsNjUgQEAKIAkvKiBTcGVlZCB0byB0cmFuc21pdCB3aXRoOiAwID0gMTAwTWJwcywgMSA9IDIwME1icHMsIDIgPSA0MDBNYnBzICovCiAJdW5zaWduZWQgc3BlZWRfY29kZToyOwogCi0JLyoKLQkgKiAqaGVhZGVyIGFuZCAqZGF0YSBhcmUgZ3VhcmFudGVlZCB0byBiZSAzMi1iaXQgRE1BYWJsZSBhbmQgbWF5IGJlCi0JICogb3ZlcndyaXR0ZW4gdG8gYWxsb3cgaW4tcGxhY2UgYnl0ZSBzd2FwcGluZy4gIE5laXRoZXIgb2YgdGhlc2UgaXMKLQkgKiBDUkNlZCAodGhlIHNpemVzIGFsc28gZG9uJ3QgaW5jbHVkZSBDUkMpLCBidXQgY29udGFpbiBzcGFjZSBmb3IgYXQKLQkgKiBsZWFzdCBvbmUgYWRkaXRpb25hbCBxdWFkbGV0IHRvIGFsbG93IGluLXBsYWNlIENSQ2luZy4gIFRoZSBtZW1vcnkgaXMKLQkgKiBhbHNvIGd1YXJhbnRlZWQgdG8gYmUgRE1BIG1hcHBhYmxlLgotCSAqLwotCXF1YWRsZXRfdCAqaGVhZGVyOwotCXF1YWRsZXRfdCAqZGF0YTsKLQlzaXplX3QgaGVhZGVyX3NpemU7Ci0Jc2l6ZV90IGRhdGFfc2l6ZTsKLQogCXN0cnVjdCBocHNiX2hvc3QgKmhvc3Q7CiAJdW5zaWduZWQgaW50IGdlbmVyYXRpb247CiAKIAlhdG9taWNfdCByZWZjbnQ7CisJc3RydWN0IGxpc3RfaGVhZCBxdWV1ZTsKIAogCS8qIEZ1bmN0aW9uIChhbmQgcG9zc2libGUgZGF0YSB0byBwYXNzIHRvIGl0KSB0byBjYWxsIHdoZW4gdGhpcwogCSAqIHBhY2tldCBpcyBjb21wbGV0ZWQuICAqLwogCXZvaWQgKCpjb21wbGV0ZV9yb3V0aW5lKSh2b2lkICopOwogCXZvaWQgKmNvbXBsZXRlX2RhdGE7CiAKLQkvKiBYWFggVGhpcyBpcyBqdXN0IGEgaGFjayBhdCB0aGUgbW9tZW50ICovCi0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQogCS8qIFN0b3JlIGppZmZpZXMgZm9yIGltcGxlbWVudGluZyBidXMgdGltZW91dHMuICovCiAJdW5zaWduZWQgbG9uZyBzZW5kdGltZTsKIAotCXF1YWRsZXRfdCBlbWJlZGRlZF9oZWFkZXJbNV07CisJLyogU2l6ZXMgYXJlIGluIGJ5dGVzLiAqZGF0YSBjYW4gYmUgRE1BLW1hcHBlZC4gKi8KKwlzaXplX3QgYWxsb2NhdGVkX2RhdGFfc2l6ZTsJLyogYXMgYWxsb2NhdGVkICovCisJc2l6ZV90IGRhdGFfc2l6ZTsJCS8qIGFzIGZpbGxlZCBpbiAqLworCXNpemVfdCBoZWFkZXJfc2l6ZTsJCS8qIGFzIGZpbGxlZCBpbiwgbm90IGNvdW50aW5nIHRoZSBDUkMgKi8KKwlxdWFkbGV0X3QgKmRhdGE7CisJcXVhZGxldF90IGhlYWRlcls1XTsKKwlxdWFkbGV0X3QgZW1iZWRkZWRfZGF0YVswXTsJLyoga2VlcCBhcyBsYXN0IG1lbWJlciAqLwogfTsKIAotLyogU2V0IGEgdGFzayBmb3Igd2hlbiBhIHBhY2tldCBjb21wbGV0ZXMgKi8KIHZvaWQgaHBzYl9zZXRfcGFja2V0X2NvbXBsZXRlX3Rhc2soc3RydWN0IGhwc2JfcGFja2V0ICpwYWNrZXQsCiAJCQkJICAgdm9pZCAoKnJvdXRpbmUpKHZvaWQgKiksIHZvaWQgKmRhdGEpOwotCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBocHNiX3BhY2tldCAqZHJpdmVyX3BhY2tldChzdHJ1Y3QgbGlzdF9oZWFkICpsKQogewogCXJldHVybiBsaXN0X2VudHJ5KGwsIHN0cnVjdCBocHNiX3BhY2tldCwgZHJpdmVyX2xpc3QpOwogfQotCiB2b2lkIGFib3J0X3RpbWVkb3V0cyh1bnNpZ25lZCBsb25nIF9fb3BhcXVlKTsKLQogc3RydWN0IGhwc2JfcGFja2V0ICpocHNiX2FsbG9jX3BhY2tldChzaXplX3QgZGF0YV9zaXplKTsKIHZvaWQgaHBzYl9mcmVlX3BhY2tldChzdHJ1Y3QgaHBzYl9wYWNrZXQgKnBhY2tldCk7CiAKLS8qCi0gKiBHZW5lcmF0aW9uIGNvdW50ZXIgZm9yIHRoZSBjb21wbGV0ZSAxMzk0IHN1YnN5c3RlbS4gIEdlbmVyYXRpb24gZ2V0cwotICogaW5jcmVtZW50ZWQgb24gZXZlcnkgY2hhbmdlIGluIHRoZSBzdWJzeXN0ZW0gKGUuZy4gYnVzIHJlc2V0KS4KKy8qKgorICogZ2V0X2hwc2JfZ2VuZXJhdGlvbiAtIGdlbmVyYXRpb24gY291bnRlciBmb3IgdGhlIGNvbXBsZXRlIDEzOTQgc3Vic3lzdGVtCiAgKgotICogVXNlIHRoZSBmdW5jdGlvbnMsIG5vdCB0aGUgdmFyaWFibGUuCisgKiBHZW5lcmF0aW9uIGdldHMgaW5jcmVtZW50ZWQgb24gZXZlcnkgY2hhbmdlIGluIHRoZSBzdWJzeXN0ZW0gKG5vdGFibHkgb24gYnVzCisgKiByZXNldHMpLiBVc2UgdGhlIGZ1bmN0aW9ucywgbm90IHRoZSB2YXJpYWJsZS4KICAqLwogc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZ2V0X2hwc2JfZ2VuZXJhdGlvbihzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0KQogewogCXJldHVybiBhdG9taWNfcmVhZCgmaG9zdC0+Z2VuZXJhdGlvbik7CiB9CiAKLS8qCi0gKiBTZW5kIGEgUEhZIGNvbmZpZ3VyYXRpb24gcGFja2V0LCByZXR1cm4gMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZQotICogZXJybm8gb24gZmFpbHVyZS4KLSAqLwogaW50IGhwc2Jfc2VuZF9waHlfY29uZmlnKHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsIGludCByb290aWQsIGludCBnYXBjbnQpOwotCi0vKgotICogUXVldWUgcGFja2V0IGZvciB0cmFuc21pdHRpbmcsIHJldHVybiAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm5vCi0gKiBvbiBmYWlsdXJlLgotICovCiBpbnQgaHBzYl9zZW5kX3BhY2tldChzdHJ1Y3QgaHBzYl9wYWNrZXQgKnBhY2tldCk7Ci0KLS8qCi0gKiBRdWV1ZSBwYWNrZXQgZm9yIHRyYW5zbWl0dGluZywgYW5kIGJsb2NrIHVudGlsIHRoZSB0cmFuc2FjdGlvbgotICogY29tcGxldGVzLiBSZXR1cm4gMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJubyBvbiBmYWlsdXJlLgotICovCiBpbnQgaHBzYl9zZW5kX3BhY2tldF9hbmRfd2FpdChzdHJ1Y3QgaHBzYl9wYWNrZXQgKnBhY2tldCk7Ci0KLS8qIEluaXRpYXRlIGJ1cyByZXNldCBvbiB0aGUgZ2l2ZW4gaG9zdC4gIFJldHVybnMgMSBpZiBidXMgcmVzZXQgYWxyZWFkeSBpbgotICogcHJvZ3Jlc3MsIDAgb3RoZXJ3aXNlLiAqLwogaW50IGhwc2JfcmVzZXRfYnVzKHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsIGludCB0eXBlKTsKLQogaW50IGhwc2JfcmVhZF9jeWNsZV90aW1lcihzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0LCB1MzIgKmN5Y2xlX3RpbWVyLAogCQkJICB1NjQgKmxvY2FsX3RpbWUpOwogCi0vKgotICogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIGV4cG9ydGVkIGZvciBob3N0IGRyaXZlciBtb2R1bGUgdXNhZ2UuICBBbGwgb2YKLSAqIHRoZW0gYXJlIHNhZmUgdG8gdXNlIGluIGludGVycnVwdCBjb250ZXh0cywgYWx0aG91Z2ggc29tZSBhcmUgcXVpdGUKLSAqIGNvbXBsaWNhdGVkIHNvIHlvdSBtYXkgd2FudCB0byBydW4gdGhlbSBpbiBib3R0b20gaGFsdmVzIGluc3RlYWQgb2YgY2FsbGluZwotICogdGhlbSBkaXJlY3RseS4KLSAqLwotCi0vKiBOb3RpZnkgYSBidXMgcmVzZXQgdG8gdGhlIGNvcmUuICBSZXR1cm5zIDEgaWYgYnVzIHJlc2V0IGFscmVhZHkgaW4gcHJvZ3Jlc3MsCi0gKiAwIG90aGVyd2lzZS4gKi8KIGludCBocHNiX2J1c19yZXNldChzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0KTsKLQotLyoKLSAqIEhhbmQgb3ZlciByZWNlaXZlZCBzZWxmaWQgcGFja2V0IHRvIHRoZSBjb3JlLiAgQ29tcGxlbWVudCBjaGVjayAoc2Vjb25kCi0gKiBxdWFkbGV0IGlzIGNvbXBsZW1lbnQgb2YgZmlyc3QpIGlzIGV4cGVjdGVkIHRvIGJlIGRvbmUgYW5kIHN1Y2Nlc3NmdWwuCi0gKi8KIHZvaWQgaHBzYl9zZWxmaWRfcmVjZWl2ZWQoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwgcXVhZGxldF90IHNpZCk7Ci0KLS8qCi0gKiBOb3RpZnkgY29tcGxldGlvbiBvZiBTZWxmSUQgc3RhZ2UgdG8gdGhlIGNvcmUgYW5kIHJlcG9ydCBuZXcgcGh5c2ljYWwgSUQKLSAqIGFuZCB3aGV0aGVyIGhvc3QgaXMgcm9vdCBub3cuCi0gKi8KIHZvaWQgaHBzYl9zZWxmaWRfY29tcGxldGUoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwgaW50IHBoeWlkLCBpbnQgaXNyb290KTsKLQotLyoKLSAqIE5vdGlmeSBjb3JlIG9mIHNlbmRpbmcgYSBwYWNrZXQuICBBY2tjb2RlIGlzIHRoZSBhY2sgY29kZSByZXR1cm5lZCBmb3IgYXN5bmMKLSAqIHRyYW5zbWl0cyBvciBBQ0tYX1NFTkRfRVJST1IgaWYgdGhlIHRyYW5zbWlzc2lvbiBmYWlsZWQgY29tcGxldGVseTsgQUNLWF9OT05FCi0gKiBmb3Igb3RoZXIgY2FzZXMgKGludGVybmFsIGVycm9ycyB0aGF0IGRvbid0IGp1c3RpZnkgYSBwYW5pYykuICBTYWZlIHRvIGNhbGwKLSAqIGZyb20gd2l0aGluIGEgdHJhbnNtaXQgcGFja2V0IHJvdXRpbmUuCi0gKi8KIHZvaWQgaHBzYl9wYWNrZXRfc2VudChzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0LCBzdHJ1Y3QgaHBzYl9wYWNrZXQgKnBhY2tldCwKIAkJICAgICAgaW50IGFja2NvZGUpOwotCi0vKgotICogSGFuZCBvdmVyIHJlY2VpdmVkIHBhY2tldCB0byB0aGUgY29yZS4gIFRoZSBjb250ZW50cyBvZiBkYXRhIGFyZSBleHBlY3RlZCB0bwotICogYmUgdGhlIGZ1bGwgcGFja2V0IGJ1dCB3aXRoIHRoZSBDUkNzIGxlZnQgb3V0IChkYXRhIGJsb2NrIGZvbGxvd3MgaGVhZGVyCi0gKiBpbW1lZGlhdGVseSksIHdpdGggdGhlIGhlYWRlciAoaS5lLiB0aGUgZmlyc3QgZm91ciBxdWFkbGV0cykgaW4gbWFjaGluZSBieXRlCi0gKiBvcmRlciBhbmQgdGhlIGRhdGEgYmxvY2sgaW4gYmlnIGVuZGlhbi4gICpkYXRhIGNhbiBiZSBzYWZlbHkgb3ZlcndyaXR0ZW4KLSAqIGFmdGVyIHRoaXMgY2FsbC4KLSAqCi0gKiBJZiB0aGUgcGFja2V0IGlzIGEgd3JpdGUgcmVxdWVzdCwgd3JpdGVfYWNrZWQgaXMgdG8gYmUgc2V0IHRvIHRydWUgaWYgaXQgd2FzCi0gKiBhY2tfY29tcGxldGUnZCBhbHJlYWR5LCBmYWxzZSBvdGhlcndpc2UuICBUaGlzIGFyZyBpcyBpZ25vcmVkIGZvciBhbnkgb3RoZXIKLSAqIHBhY2tldCB0eXBlLgotICovCiB2b2lkIGhwc2JfcGFja2V0X3JlY2VpdmVkKHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsIHF1YWRsZXRfdCAqZGF0YSwgc2l6ZV90IHNpemUsCiAJCQkgIGludCB3cml0ZV9hY2tlZCk7CiAKLQogLyoKICAqIENIQVJBQ1RFUiBERVZJQ0UgRElTUEFUQ0hJTkcKICAqCkBAIC0yMTcsNyArMTQ3LDkgQEAKICNkZWZpbmUgSUVFRTEzOTRfRVhQRVJJTUVOVEFMX0RFViBNS0RFVihJRUVFMTM5NF9NQUpPUiwgXAogCQkJCQlJRUVFMTM5NF9NSU5PUl9CTE9DS19FWFBFUklNRU5UQUwgKiAxNikKIAotLyogcmV0dXJuIHRoZSBpbmRleCAod2l0aGluIGEgbWlub3IgbnVtYmVyIGJsb2NrKSBvZiBhIGZpbGUgKi8KKy8qKgorICogaWVlZTEzOTRfZmlsZV90b19pbnN0YW5jZSAtIGdldCB0aGUgaW5kZXggd2l0aGluIGEgbWlub3IgbnVtYmVyIGJsb2NrCisgKi8KIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciBpZWVlMTM5NF9maWxlX3RvX2luc3RhbmNlKHN0cnVjdCBmaWxlICpmaWxlKQogewogCXJldHVybiBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX2NpbmRleDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvaWVlZTEzOTRfdHJhbnNhY3Rpb25zLmMgYi9kcml2ZXJzL2llZWUxMzk0L2llZWUxMzk0X3RyYW5zYWN0aW9ucy5jCmluZGV4IDA4MzNmYzkuLjQwMDc4Y2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWVlZTEzOTQvaWVlZTEzOTRfdHJhbnNhY3Rpb25zLmMKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9pZWVlMTM5NF90cmFuc2FjdGlvbnMuYwpAQCAtMTAsMTEgKzEwLDE2IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4gIC8qIGJlY2F1c2UgbGludXgvd2FpdC5oIGlzIGJyb2tlbiBpZiBDT05GSUdfU01QPW4gKi8KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiAKICNpbmNsdWRlIDxhc20vYnVnLmg+CiAjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogCiAjaW5jbHVkZSAiaWVlZTEzOTQuaCIKICNpbmNsdWRlICJpZWVlMTM5NF90eXBlcy5oIgpAQCAtMzIsNyArMzcsNyBAQAogI2lmbmRlZiBIUFNCX0RFQlVHX1RMQUJFTFMKIHN0YXRpYwogI2VuZGlmCi1zcGlubG9ja190IGhwc2JfdGxhYmVsX2xvY2sgPSBTUElOX0xPQ0tfVU5MT0NLRUQ7CitERUZJTkVfU1BJTkxPQ0soaHBzYl90bGFiZWxfbG9jayk7CiAKIHN0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRCh0bGFiZWxfd3EpOwogCkBAIC0yMTIsNiArMjE3LDE1IEBACiAJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0bGFiZWxfd3EpOwogfQogCisvKioKKyAqIGhwc2JfcGFja2V0X3N1Y2Nlc3MgLSBNYWtlIHNlbnNlIG9mIHRoZSBhY2sgYW5kIHJlcGx5IGNvZGVzCisgKgorICogTWFrZSBzZW5zZSBvZiB0aGUgYWNrIGFuZCByZXBseSBjb2RlcyBhbmQgcmV0dXJuIG1vcmUgY29udmVuaWVudCBlcnJvciBjb2RlczoKKyAqIDAgPSBzdWNjZXNzLiAgLSVFQlVTWSA9IG5vZGUgaXMgYnVzeSwgdHJ5IGFnYWluLiAgLSVFQUdBSU4gPSBlcnJvciB3aGljaCBjYW4KKyAqIHByb2JhYmx5IHJlc29sdmVkIGJ5IHJldHJ5LiAgLSVFUkVNT1RFSU8gPSBub2RlIHN1ZmZlcnMgZnJvbSBhbiBpbnRlcm5hbAorICogZXJyb3IuICAtJUVBQ0NFUyA9IHRoaXMgdHJhbnNhY3Rpb24gaXMgbm90IGFsbG93ZWQgb24gcmVxdWVzdGVkIGFkZHJlc3MuCisgKiAtJUVJTlZBTCA9IGludmFsaWQgYWRkcmVzcyBhdCBub2RlLgorICovCiBpbnQgaHBzYl9wYWNrZXRfc3VjY2VzcyhzdHJ1Y3QgaHBzYl9wYWNrZXQgKnBhY2tldCkKIHsKIAlzd2l0Y2ggKHBhY2tldC0+YWNrX2NvZGUpIHsKQEAgLTM2NCw2ICszNzgsMTMgQEAKIAl9CiAJcGFja2V0LT5ob3N0ID0gaG9zdDsKIAorCS8qIEJlY2F1c2UgaXQgaXMgdG9vIGRpZmZpY3VsdCB0byBkZXRlcm1pbmUgYWxsIFBIWSBzcGVlZHMgYW5kIGxpbmsKKwkgKiBzcGVlZHMgaGVyZSwgd2UgdXNlIFMxMDAuLi4gKi8KKwlwYWNrZXQtPnNwZWVkX2NvZGUgPSBJRUVFMTM5NF9TUEVFRF8xMDA7CisKKwkvKiAuLi5hbmQgcHJldmVudCBocHNiX3NlbmRfcGFja2V0KCkgZnJvbSBvdmVycmlkaW5nIGl0LiAqLworCXBhY2tldC0+bm9kZV9pZCA9IExPQ0FMX0JVUyB8IEFMTF9OT0RFUzsKKwogCWlmIChocHNiX2dldF90bGFiZWwocGFja2V0KSkgewogCQlocHNiX2ZyZWVfcGFja2V0KHBhY2tldCk7CiAJCXJldHVybiBOVUxMOwpAQCAtNDkzLDYgKzUxNCwxNiBAQAogICogYXZvaWQgaW4ga2VybmVsIGJ1ZmZlcnMgZm9yIHVzZXIgc3BhY2UgY2FsbGVycwogICovCiAKKy8qKgorICogaHBzYl9yZWFkIC0gZ2VuZXJpYyByZWFkIGZ1bmN0aW9uCisgKgorICogUmVjb2duaXplcyB0aGUgbG9jYWwgbm9kZSBJRCBhbmQgYWN0IGFjY29yZGluZ2x5LiAgQXV0b21hdGljYWxseSB1c2VzIGEKKyAqIHF1YWRsZXQgcmVhZCByZXF1ZXN0IGlmIEBsZW5ndGggPT0gNCBhbmQgYW5kIGEgYmxvY2sgcmVhZCByZXF1ZXN0IG90aGVyd2lzZS4KKyAqIEl0IGRvZXMgbm90IHlldCBzdXBwb3J0IGxlbmd0aHMgdGhhdCBhcmUgbm90IGEgbXVsdGlwbGUgb2YgNC4KKyAqCisgKiBZb3UgbXVzdCBleHBsaWNpdGx5IHNwZWNpZml5IHRoZSBAZ2VuZXJhdGlvbiBmb3Igd2hpY2ggdGhlIG5vZGUgSUQgaXMgdmFsaWQsCisgKiB0byBhdm9pZCBzZW5kaW5nIHBhY2tldHMgdG8gdGhlIHdyb25nIG5vZGVzIHdoZW4gd2UgcmFjZSB3aXRoIGEgYnVzIHJlc2V0LgorICovCiBpbnQgaHBzYl9yZWFkKHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsIG5vZGVpZF90IG5vZGUsIHVuc2lnbmVkIGludCBnZW5lcmF0aW9uLAogCSAgICAgIHU2NCBhZGRyLCBxdWFkbGV0X3QgKiBidWZmZXIsIHNpemVfdCBsZW5ndGgpCiB7CkBAIC01MzIsNiArNTYzLDE2IEBACiAJcmV0dXJuIHJldHZhbDsKIH0KIAorLyoqCisgKiBocHNiX3dyaXRlIC0gZ2VuZXJpYyB3cml0ZSBmdW5jdGlvbgorICoKKyAqIFJlY29nbml6ZXMgdGhlIGxvY2FsIG5vZGUgSUQgYW5kIGFjdCBhY2NvcmRpbmdseS4gIEF1dG9tYXRpY2FsbHkgdXNlcyBhCisgKiBxdWFkbGV0IHdyaXRlIHJlcXVlc3QgaWYgQGxlbmd0aCA9PSA0IGFuZCBhbmQgYSBibG9jayB3cml0ZSByZXF1ZXN0CisgKiBvdGhlcndpc2UuICBJdCBkb2VzIG5vdCB5ZXQgc3VwcG9ydCBsZW5ndGhzIHRoYXQgYXJlIG5vdCBhIG11bHRpcGxlIG9mIDQuCisgKgorICogWW91IG11c3QgZXhwbGljaXRseSBzcGVjaWZpeSB0aGUgQGdlbmVyYXRpb24gZm9yIHdoaWNoIHRoZSBub2RlIElEIGlzIHZhbGlkLAorICogdG8gYXZvaWQgc2VuZGluZyBwYWNrZXRzIHRvIHRoZSB3cm9uZyBub2RlcyB3aGVuIHdlIHJhY2Ugd2l0aCBhIGJ1cyByZXNldC4KKyAqLwogaW50IGhwc2Jfd3JpdGUoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwgbm9kZWlkX3Qgbm9kZSwgdW5zaWduZWQgaW50IGdlbmVyYXRpb24sCiAJICAgICAgIHU2NCBhZGRyLCBxdWFkbGV0X3QgKiBidWZmZXIsIHNpemVfdCBsZW5ndGgpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L2llZWUxMzk0X3RyYW5zYWN0aW9ucy5oIGIvZHJpdmVycy9pZWVlMTM5NC9pZWVlMTM5NF90cmFuc2FjdGlvbnMuaAppbmRleCBjMTM2OWM0Li44NmI4ZWU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWUxMzk0L2llZWUxMzk0X3RyYW5zYWN0aW9ucy5oCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvaWVlZTEzOTRfdHJhbnNhY3Rpb25zLmgKQEAgLTI3LDI3ICsyNyw3IEBACiBzdHJ1Y3QgaHBzYl9wYWNrZXQgKmhwc2JfbWFrZV9zdHJlYW1wYWNrZXQoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwgdTggKmJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoLCBpbnQgY2hhbm5lbCwgaW50IHRhZywKIAkJCQkJICAgaW50IHN5bmMpOwotCi0vKgotICogaHBzYl9wYWNrZXRfc3VjY2VzcyAtIE1ha2Ugc2Vuc2Ugb2YgdGhlIGFjayBhbmQgcmVwbHkgY29kZXMgYW5kCi0gKiByZXR1cm4gbW9yZSBjb252ZW5pZW50IGVycm9yIGNvZGVzOgotICogMCAgICAgICAgICAgc3VjY2VzcwotICogLUVCVVNZICAgICAgbm9kZSBpcyBidXN5LCB0cnkgYWdhaW4KLSAqIC1FQUdBSU4gICAgIGVycm9yIHdoaWNoIGNhbiBwcm9iYWJseSByZXNvbHZlZCBieSByZXRyeQotICogLUVSRU1PVEVJTyAgbm9kZSBzdWZmZXJzIGZyb20gYW4gaW50ZXJuYWwgZXJyb3IKLSAqIC1FQUNDRVMgICAgIHRoaXMgdHJhbnNhY3Rpb24gaXMgbm90IGFsbG93ZWQgb24gcmVxdWVzdGVkIGFkZHJlc3MKLSAqIC1FSU5WQUwgICAgIGludmFsaWQgYWRkcmVzcyBhdCBub2RlCi0gKi8KIGludCBocHNiX3BhY2tldF9zdWNjZXNzKHN0cnVjdCBocHNiX3BhY2tldCAqcGFja2V0KTsKLQotLyoKLSAqIFRoZSBnZW5lcmljIHJlYWQgYW5kIHdyaXRlIGZ1bmN0aW9ucy4gIEFsbCByZWNvZ25pemUgdGhlIGxvY2FsIG5vZGUgSUQKLSAqIGFuZCBhY3QgYWNjb3JkaW5nbHkuICBSZWFkIGFuZCB3cml0ZSBhdXRvbWF0aWNhbGx5IHVzZSBxdWFkbGV0IGNvbW1hbmRzIGlmCi0gKiBsZW5ndGggPT0gNCBhbmQgYW5kIGJsb2NrIGNvbW1hbmRzIG90aGVyd2lzZSAoaG93ZXZlciwgdGhleSBkbyBub3QgeWV0Ci0gKiBzdXBwb3J0IGxlbmd0aHMgdGhhdCBhcmUgbm90IGEgbXVsdGlwbGUgb2YgNCkuICBZb3UgbXVzdCBleHBsaWNpdGx5IHNwZWNpZml5Ci0gKiB0aGUgZ2VuZXJhdGlvbiBmb3Igd2hpY2ggdGhlIG5vZGUgSUQgaXMgdmFsaWQsIHRvIGF2b2lkIHNlbmRpbmcgcGFja2V0cyB0bwotICogdGhlIHdyb25nIG5vZGVzIHdoZW4gd2UgcmFjZSB3aXRoIGEgYnVzIHJlc2V0LgotICovCiBpbnQgaHBzYl9yZWFkKHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsIG5vZGVpZF90IG5vZGUsIHVuc2lnbmVkIGludCBnZW5lcmF0aW9uLAogCSAgICAgIHU2NCBhZGRyLCBxdWFkbGV0X3QgKmJ1ZmZlciwgc2l6ZV90IGxlbmd0aCk7CiBpbnQgaHBzYl93cml0ZShzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0LCBub2RlaWRfdCBub2RlLCB1bnNpZ25lZCBpbnQgZ2VuZXJhdGlvbiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvaXNvLmMgYi9kcml2ZXJzL2llZWUxMzk0L2lzby5jCmluZGV4IGM2MjI3ZTUuLjA3Y2EzNWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWVlZTEzOTQvaXNvLmMKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9pc28uYwpAQCAtMTAsMTEgKzEwLDE1IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCiAjaW5jbHVkZSAiaG9zdHMuaCIKICNpbmNsdWRlICJpc28uaCIKIAorLyoqCisgKiBocHNiX2lzb19zdG9wIC0gc3RvcCBETUEKKyAqLwogdm9pZCBocHNiX2lzb19zdG9wKHN0cnVjdCBocHNiX2lzbyAqaXNvKQogewogCWlmICghKGlzby0+ZmxhZ3MgJiBIUFNCX0lTT19EUklWRVJfU1RBUlRFRCkpCkBAIC0yNSw2ICsyOSw5IEBACiAJaXNvLT5mbGFncyAmPSB+SFBTQl9JU09fRFJJVkVSX1NUQVJURUQ7CiB9CiAKKy8qKgorICogaHBzYl9pc29fc2h1dGRvd24gLSBkZWFsbG9jYXRlIGJ1ZmZlciBhbmQgRE1BIGNvbnRleHQKKyAqLwogdm9pZCBocHNiX2lzb19zaHV0ZG93bihzdHJ1Y3QgaHBzYl9pc28gKmlzbykKIHsKIAlpZiAoaXNvLT5mbGFncyAmIEhQU0JfSVNPX0RSSVZFUl9JTklUKSB7CkBAIC0xMzAsNiArMTM3LDkgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAorLyoqCisgKiBocHNiX2lzb19uX3JlYWR5IC0gcmV0dXJucyBudW1iZXIgb2YgcGFja2V0cyByZWFkeSB0byBzZW5kIG9yIHJlY2VpdmUKKyAqLwogaW50IGhwc2JfaXNvX25fcmVhZHkoc3RydWN0IGhwc2JfaXNvICppc28pCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTE0Miw2ICsxNTIsOSBAQAogCXJldHVybiB2YWw7CiB9CiAKKy8qKgorICogaHBzYl9pc29feG1pdF9pbml0IC0gYWxsb2NhdGUgdGhlIGJ1ZmZlciBhbmQgRE1BIGNvbnRleHQKKyAqLwogc3RydWN0IGhwc2JfaXNvICpocHNiX2lzb194bWl0X2luaXQoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwKIAkJCQkgICAgdW5zaWduZWQgaW50IGRhdGFfYnVmX3NpemUsCiAJCQkJICAgIHVuc2lnbmVkIGludCBidWZfcGFja2V0cywKQEAgLTE3Miw2ICsxODUsMTEgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAorLyoqCisgKiBocHNiX2lzb19yZWN2X2luaXQgLSBhbGxvY2F0ZSB0aGUgYnVmZmVyIGFuZCBETUEgY29udGV4dAorICoKKyAqIE5vdGUsIGlmIGNoYW5uZWwgPSAtMSwgbXVsdGktY2hhbm5lbCByZWNlaXZlIGlzIGVuYWJsZWQuCisgKi8KIHN0cnVjdCBocHNiX2lzbyAqaHBzYl9pc29fcmVjdl9pbml0KHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsCiAJCQkJICAgIHVuc2lnbmVkIGludCBkYXRhX2J1Zl9zaXplLAogCQkJCSAgICB1bnNpZ25lZCBpbnQgYnVmX3BhY2tldHMsCkBAIC0xOTksNiArMjE3LDExIEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKKy8qKgorICogaHBzYl9pc29fcmVjdl9saXN0ZW5fY2hhbm5lbAorICoKKyAqIG11bHRpLWNoYW5uZWwgb25seQorICovCiBpbnQgaHBzYl9pc29fcmVjdl9saXN0ZW5fY2hhbm5lbChzdHJ1Y3QgaHBzYl9pc28gKmlzbywgdW5zaWduZWQgY2hhciBjaGFubmVsKQogewogCWlmIChpc28tPnR5cGUgIT0gSFBTQl9JU09fUkVDViB8fCBpc28tPmNoYW5uZWwgIT0gLTEgfHwgY2hhbm5lbCA+PSA2NCkKQEAgLTIwNiw2ICsyMjksMTEgQEAKIAlyZXR1cm4gaXNvLT5ob3N0LT5kcml2ZXItPmlzb2N0bChpc28sIFJFQ1ZfTElTVEVOX0NIQU5ORUwsIGNoYW5uZWwpOwogfQogCisvKioKKyAqIGhwc2JfaXNvX3JlY3ZfdW5saXN0ZW5fY2hhbm5lbAorICoKKyAqIG11bHRpLWNoYW5uZWwgb25seQorICovCiBpbnQgaHBzYl9pc29fcmVjdl91bmxpc3Rlbl9jaGFubmVsKHN0cnVjdCBocHNiX2lzbyAqaXNvLCB1bnNpZ25lZCBjaGFyIGNoYW5uZWwpCiB7CiAJaWYgKGlzby0+dHlwZSAhPSBIUFNCX0lTT19SRUNWIHx8IGlzby0+Y2hhbm5lbCAhPSAtMSB8fCBjaGFubmVsID49IDY0KQpAQCAtMjEzLDYgKzI0MSwxMSBAQAogCXJldHVybiBpc28tPmhvc3QtPmRyaXZlci0+aXNvY3RsKGlzbywgUkVDVl9VTkxJU1RFTl9DSEFOTkVMLCBjaGFubmVsKTsKIH0KIAorLyoqCisgKiBocHNiX2lzb19yZWN2X3NldF9jaGFubmVsX21hc2sKKyAqCisgKiBtdWx0aS1jaGFubmVsIG9ubHkKKyAqLwogaW50IGhwc2JfaXNvX3JlY3Zfc2V0X2NoYW5uZWxfbWFzayhzdHJ1Y3QgaHBzYl9pc28gKmlzbywgdTY0IG1hc2spCiB7CiAJaWYgKGlzby0+dHlwZSAhPSBIUFNCX0lTT19SRUNWIHx8IGlzby0+Y2hhbm5lbCAhPSAtMSkKQEAgLTIyMSw2ICsyNTQsMTIgQEAKIAkJCQkJICh1bnNpZ25lZCBsb25nKSZtYXNrKTsKIH0KIAorLyoqCisgKiBocHNiX2lzb19yZWN2X2ZsdXNoIC0gY2hlY2sgZm9yIGFycml2YWwgb2YgbmV3IHBhY2tldHMKKyAqCisgKiBjaGVjayBmb3IgYXJyaXZhbCBvZiBuZXcgcGFja2V0cyBpbW1lZGlhdGVseSAoZXZlbiBpZiBpcnFfaW50ZXJ2YWwKKyAqIGhhcyBub3QgeWV0IGJlZW4gcmVhY2hlZCkKKyAqLwogaW50IGhwc2JfaXNvX3JlY3ZfZmx1c2goc3RydWN0IGhwc2JfaXNvICppc28pCiB7CiAJaWYgKGlzby0+dHlwZSAhPSBIUFNCX0lTT19SRUNWKQpAQCAtMjM4LDYgKzI3Nyw5IEBACiAJcmV0dXJuIHJldHZhbDsKIH0KIAorLyoqCisgKiBocHNiX2lzb194bWl0X3N0YXJ0IC0gc3RhcnQgRE1BCisgKi8KIGludCBocHNiX2lzb194bWl0X3N0YXJ0KHN0cnVjdCBocHNiX2lzbyAqaXNvLCBpbnQgY3ljbGUsIGludCBwcmVidWZmZXIpCiB7CiAJaWYgKGlzby0+dHlwZSAhPSBIUFNCX0lTT19YTUlUKQpAQCAtMjcwLDYgKzMxMiw5IEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qKgorICogaHBzYl9pc29fcmVjdl9zdGFydCAtIHN0YXJ0IERNQQorICovCiBpbnQgaHBzYl9pc29fcmVjdl9zdGFydChzdHJ1Y3QgaHBzYl9pc28gKmlzbywgaW50IGN5Y2xlLCBpbnQgdGFnX21hc2ssIGludCBzeW5jKQogewogCWludCByZXR2YWwgPSAwOwpAQCAtMzA2LDggKzM1MSw3IEBACiB9CiAKIC8qIGNoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgdXNlciBoYXMgbm90IHN1cHBsaWVkIGJvZ3VzIHZhbHVlcyBvZiBvZmZzZXQvbGVuCi0gICB0aGF0IHdvdWxkIGNhdXNlIHRoZSBrZXJuZWwgdG8gYWNjZXNzIG1lbW9yeSBvdXRzaWRlIHRoZSBidWZmZXIgKi8KLQorICogdGhhdCB3b3VsZCBjYXVzZSB0aGUga2VybmVsIHRvIGFjY2VzcyBtZW1vcnkgb3V0c2lkZSB0aGUgYnVmZmVyICovCiBzdGF0aWMgaW50IGhwc2JfaXNvX2NoZWNrX29mZnNldF9sZW4oc3RydWN0IGhwc2JfaXNvICppc28sCiAJCQkJICAgICB1bnNpZ25lZCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBzaG9ydCBsZW4sCiAJCQkJICAgICB1bnNpZ25lZCBpbnQgKm91dF9vZmZzZXQsCkBAIC0zMzEsNiArMzc1LDEyIEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qKgorICogaHBzYl9pc29feG1pdF9xdWV1ZV9wYWNrZXQgLSBxdWV1ZSBhIHBhY2tldCBmb3IgdHJhbnNtaXNzaW9uLgorICoKKyAqIEBvZmZzZXQgaXMgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgRE1BIGJ1ZmZlciwgd2hlcmUgdGhlIHBhY2tldCdzCisgKiBkYXRhIHBheWxvYWQgc2hvdWxkIGFscmVhZHkgaGF2ZSBiZWVuIHBsYWNlZC4KKyAqLwogaW50IGhwc2JfaXNvX3htaXRfcXVldWVfcGFja2V0KHN0cnVjdCBocHNiX2lzbyAqaXNvLCB1MzIgb2Zmc2V0LCB1MTYgbGVuLAogCQkJICAgICAgIHU4IHRhZywgdTggc3kpCiB7CkBAIC0zODAsNiArNDMwLDkgQEAKIAlyZXR1cm4gcnY7CiB9CiAKKy8qKgorICogaHBzYl9pc29feG1pdF9zeW5jIC0gd2FpdCB1bnRpbCBhbGwgcXVldWVkIHBhY2tldHMgaGF2ZSBiZWVuIHRyYW5zbWl0dGVkCisgKi8KIGludCBocHNiX2lzb194bWl0X3N5bmMoc3RydWN0IGhwc2JfaXNvICppc28pCiB7CiAJaWYgKGlzby0+dHlwZSAhPSBIUFNCX0lTT19YTUlUKQpAQCAtMzkwLDYgKzQ0MywxNSBAQAogCQkJCQlpc28tPmJ1Zl9wYWNrZXRzKTsKIH0KIAorLyoqCisgKiBocHNiX2lzb19wYWNrZXRfc2VudAorICoKKyAqIEF2YWlsYWJsZSB0byBsb3ctbGV2ZWwgZHJpdmVycy4KKyAqCisgKiBDYWxsIGFmdGVyIGEgcGFja2V0IGhhcyBiZWVuIHRyYW5zbWl0dGVkIHRvIHRoZSBidXMgKGludGVycnVwdCBjb250ZXh0IGlzCisgKiBPSykuICBAY3ljbGUgaXMgdGhlIF9leGFjdF8gY3ljbGUgdGhlIHBhY2tldCB3YXMgc2VudCBvbi4gIEBlcnJvciBzaG91bGQgYmUKKyAqIG5vbi16ZXJvIGlmIHNvbWUgc29ydCBvZiBlcnJvciBvY2N1cnJlZCB3aGVuIHNlbmRpbmcgdGhlIHBhY2tldC4KKyAqLwogdm9pZCBocHNiX2lzb19wYWNrZXRfc2VudChzdHJ1Y3QgaHBzYl9pc28gKmlzbywgaW50IGN5Y2xlLCBpbnQgZXJyb3IpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTQxMyw2ICs0NzUsMTMgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpc28tPmxvY2ssIGZsYWdzKTsKIH0KIAorLyoqCisgKiBocHNiX2lzb19wYWNrZXRfcmVjZWl2ZWQKKyAqCisgKiBBdmFpbGFibGUgdG8gbG93LWxldmVsIGRyaXZlcnMuCisgKgorICogQ2FsbCBhZnRlciBhIHBhY2tldCBoYXMgYmVlbiByZWNlaXZlZCAoaW50ZXJydXB0IGNvbnRleHQgaXMgT0spLgorICovCiB2b2lkIGhwc2JfaXNvX3BhY2tldF9yZWNlaXZlZChzdHJ1Y3QgaHBzYl9pc28gKmlzbywgdTMyIG9mZnNldCwgdTE2IGxlbiwKIAkJCSAgICAgIHUxNiB0b3RhbF9sZW4sIHUxNiBjeWNsZSwgdTggY2hhbm5lbCwgdTggdGFnLAogCQkJICAgICAgdTggc3kpCkBAIC00NDIsNiArNTExLDExIEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXNvLT5sb2NrLCBmbGFncyk7CiB9CiAKKy8qKgorICogaHBzYl9pc29fcmVjdl9yZWxlYXNlX3BhY2tldHMgLSByZWxlYXNlIHBhY2tldHMsIHJldXNlIGJ1ZmZlcgorICoKKyAqIEBuX3BhY2tldHMgaGF2ZSBiZWVuIHJlYWQgb3V0IG9mIHRoZSBidWZmZXIsIHJlLXVzZSB0aGUgYnVmZmVyIHNwYWNlCisgKi8KIGludCBocHNiX2lzb19yZWN2X3JlbGVhc2VfcGFja2V0cyhzdHJ1Y3QgaHBzYl9pc28gKmlzbywgdW5zaWduZWQgaW50IG5fcGFja2V0cykKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtNDc3LDYgKzU1MSwxMyBAQAogCXJldHVybiBydjsKIH0KIAorLyoqCisgKiBocHNiX2lzb193YWtlCisgKgorICogQXZhaWxhYmxlIHRvIGxvdy1sZXZlbCBkcml2ZXJzLgorICoKKyAqIENhbGwgdG8gd2FrZSB3YWl0aW5nIHByb2Nlc3NlcyBhZnRlciBidWZmZXIgc3BhY2UgaGFzIG9wZW5lZCB1cC4KKyAqLwogdm9pZCBocHNiX2lzb193YWtlKHN0cnVjdCBocHNiX2lzbyAqaXNvKQogewogCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaXNvLT53YWl0cSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L2lzby5oIGIvZHJpdmVycy9pZWVlMTM5NC9pc28uaAppbmRleCAxMjEwYTk3Li5iOTRlNTVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWUxMzk0L2lzby5oCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvaXNvLmgKQEAgLTE1MCw4ICsxNTAsNiBAQAogCiAvKiBmdW5jdGlvbnMgYXZhaWxhYmxlIHRvIGhpZ2gtbGV2ZWwgZHJpdmVycyAoZS5nLiByYXcxMzk0KSAqLwogCi0vKiBhbGxvY2F0ZSB0aGUgYnVmZmVyIGFuZCBETUEgY29udGV4dCAqLwotCiBzdHJ1Y3QgaHBzYl9pc28qIGhwc2JfaXNvX3htaXRfaW5pdChzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0LAogCQkJCSAgICB1bnNpZ25lZCBpbnQgZGF0YV9idWZfc2l6ZSwKIAkJCQkgICAgdW5zaWduZWQgaW50IGJ1Zl9wYWNrZXRzLApAQCAtMTU5LDggKzE1Nyw2IEBACiAJCQkJICAgIGludCBzcGVlZCwKIAkJCQkgICAgaW50IGlycV9pbnRlcnZhbCwKIAkJCQkgICAgdm9pZCAoKmNhbGxiYWNrKShzdHJ1Y3QgaHBzYl9pc28qKSk7Ci0KLS8qIG5vdGU6IGlmIGNoYW5uZWwgPSAtMSwgbXVsdGktY2hhbm5lbCByZWNlaXZlIGlzIGVuYWJsZWQgKi8KIHN0cnVjdCBocHNiX2lzbyogaHBzYl9pc29fcmVjdl9pbml0KHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsCiAJCQkJICAgIHVuc2lnbmVkIGludCBkYXRhX2J1Zl9zaXplLAogCQkJCSAgICB1bnNpZ25lZCBpbnQgYnVmX3BhY2tldHMsCkBAIC0xNjgsNTYgKzE2NCwyOSBAQAogCQkJCSAgICBpbnQgZG1hX21vZGUsCiAJCQkJICAgIGludCBpcnFfaW50ZXJ2YWwsCiAJCQkJICAgIHZvaWQgKCpjYWxsYmFjaykoc3RydWN0IGhwc2JfaXNvKikpOwotCi0vKiBtdWx0aS1jaGFubmVsIG9ubHkgKi8KIGludCBocHNiX2lzb19yZWN2X2xpc3Rlbl9jaGFubmVsKHN0cnVjdCBocHNiX2lzbyAqaXNvLCB1bnNpZ25lZCBjaGFyIGNoYW5uZWwpOwogaW50IGhwc2JfaXNvX3JlY3ZfdW5saXN0ZW5fY2hhbm5lbChzdHJ1Y3QgaHBzYl9pc28gKmlzbywgdW5zaWduZWQgY2hhciBjaGFubmVsKTsKIGludCBocHNiX2lzb19yZWN2X3NldF9jaGFubmVsX21hc2soc3RydWN0IGhwc2JfaXNvICppc28sIHU2NCBtYXNrKTsKLQotLyogc3RhcnQvc3RvcCBETUEgKi8KIGludCBocHNiX2lzb194bWl0X3N0YXJ0KHN0cnVjdCBocHNiX2lzbyAqaXNvLCBpbnQgc3RhcnRfb25fY3ljbGUsCiAJCQlpbnQgcHJlYnVmZmVyKTsKIGludCBocHNiX2lzb19yZWN2X3N0YXJ0KHN0cnVjdCBocHNiX2lzbyAqaXNvLCBpbnQgc3RhcnRfb25fY3ljbGUsCiAJCQlpbnQgdGFnX21hc2ssIGludCBzeW5jKTsKIHZvaWQgaHBzYl9pc29fc3RvcChzdHJ1Y3QgaHBzYl9pc28gKmlzbyk7Ci0KLS8qIGRlYWxsb2NhdGUgYnVmZmVyIGFuZCBETUEgY29udGV4dCAqLwogdm9pZCBocHNiX2lzb19zaHV0ZG93bihzdHJ1Y3QgaHBzYl9pc28gKmlzbyk7Ci0KLS8qIHF1ZXVlIGEgcGFja2V0IGZvciB0cmFuc21pc3Npb24uCi0gKiAnb2Zmc2V0JyBpcyByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBETUEgYnVmZmVyLCB3aGVyZSB0aGUgcGFja2V0J3MKLSAqIGRhdGEgcGF5bG9hZCBzaG91bGQgYWxyZWFkeSBoYXZlIGJlZW4gcGxhY2VkLiAqLwogaW50IGhwc2JfaXNvX3htaXRfcXVldWVfcGFja2V0KHN0cnVjdCBocHNiX2lzbyAqaXNvLCB1MzIgb2Zmc2V0LCB1MTYgbGVuLAogCQkJICAgICAgIHU4IHRhZywgdTggc3kpOwotCi0vKiB3YWl0IHVudGlsIGFsbCBxdWV1ZWQgcGFja2V0cyBoYXZlIGJlZW4gdHJhbnNtaXR0ZWQgdG8gdGhlIGJ1cyAqLwogaW50IGhwc2JfaXNvX3htaXRfc3luYyhzdHJ1Y3QgaHBzYl9pc28gKmlzbyk7Ci0KLS8qIE4gcGFja2V0cyBoYXZlIGJlZW4gcmVhZCBvdXQgb2YgdGhlIGJ1ZmZlciwgcmUtdXNlIHRoZSBidWZmZXIgc3BhY2UgKi8KLWludCAgaHBzYl9pc29fcmVjdl9yZWxlYXNlX3BhY2tldHMoc3RydWN0IGhwc2JfaXNvICpyZWN2LAotCQkJCSAgIHVuc2lnbmVkIGludCBuX3BhY2tldHMpOwotCi0vKiBjaGVjayBmb3IgYXJyaXZhbCBvZiBuZXcgcGFja2V0cyBpbW1lZGlhdGVseSAoZXZlbiBpZiBpcnFfaW50ZXJ2YWwKLSAqIGhhcyBub3QgeWV0IGJlZW4gcmVhY2hlZCkgKi8KK2ludCBocHNiX2lzb19yZWN2X3JlbGVhc2VfcGFja2V0cyhzdHJ1Y3QgaHBzYl9pc28gKnJlY3YsCisJCQkJICB1bnNpZ25lZCBpbnQgbl9wYWNrZXRzKTsKIGludCBocHNiX2lzb19yZWN2X2ZsdXNoKHN0cnVjdCBocHNiX2lzbyAqaXNvKTsKLQotLyogcmV0dXJucyAjIG9mIHBhY2tldHMgcmVhZHkgdG8gc2VuZCBvciByZWNlaXZlICovCiBpbnQgaHBzYl9pc29fbl9yZWFkeShzdHJ1Y3QgaHBzYl9pc28gKmlzbyk7CiAKIC8qIHRoZSBmb2xsb3dpbmcgYXJlIGNhbGxiYWNrcyBhdmFpbGFibGUgdG8gbG93LWxldmVsIGRyaXZlcnMgKi8KIAotLyogY2FsbCBhZnRlciBhIHBhY2tldCBoYXMgYmVlbiB0cmFuc21pdHRlZCB0byB0aGUgYnVzIChpbnRlcnJ1cHQgY29udGV4dCBpcyBPSykKLSAqICdjeWNsZScgaXMgdGhlIF9leGFjdF8gY3ljbGUgdGhlIHBhY2tldCB3YXMgc2VudCBvbgotICogJ2Vycm9yJyBzaG91bGQgYmUgbm9uLXplcm8gaWYgc29tZSBzb3J0IG9mIGVycm9yIG9jY3VycmVkIHdoZW4gc2VuZGluZyB0aGUKLSAqICBwYWNrZXQgKi8KIHZvaWQgaHBzYl9pc29fcGFja2V0X3NlbnQoc3RydWN0IGhwc2JfaXNvICppc28sIGludCBjeWNsZSwgaW50IGVycm9yKTsKLQotLyogY2FsbCBhZnRlciBhIHBhY2tldCBoYXMgYmVlbiByZWNlaXZlZCAoaW50ZXJydXB0IGNvbnRleHQgT0spICovCiB2b2lkIGhwc2JfaXNvX3BhY2tldF9yZWNlaXZlZChzdHJ1Y3QgaHBzYl9pc28gKmlzbywgdTMyIG9mZnNldCwgdTE2IGxlbiwKIAkJCSAgICAgIHUxNiB0b3RhbF9sZW4sIHUxNiBjeWNsZSwgdTggY2hhbm5lbCwgdTggdGFnLAogCQkJICAgICAgdTggc3kpOwotCi0vKiBjYWxsIHRvIHdha2Ugd2FpdGluZyBwcm9jZXNzZXMgYWZ0ZXIgYnVmZmVyIHNwYWNlIGhhcyBvcGVuZWQgdXAuICovCiB2b2lkIGhwc2JfaXNvX3dha2Uoc3RydWN0IGhwc2JfaXNvICppc28pOwogCiAjZW5kaWYgLyogSUVFRTEzOTRfSVNPX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvbm9kZW1nci5jIGIvZHJpdmVycy9pZWVlMTM5NC9ub2RlbWdyLmMKaW5kZXggYzVhY2UxOS4uNmExYTA1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZWVlMTM5NC9ub2RlbWdyLmMKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9ub2RlbWdyLmMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAKQEAgLTExNSw3ICsxMTYsNyBAQAogCiBzdGF0aWMgaW50IG5vZGVtZ3JfZ2V0X21heF9yb20ocXVhZGxldF90ICpidXNfaW5mb19kYXRhLCB2b2lkICpfX2NpKQogewotCXJldHVybiAoQ1NSMTIxMl9CRTMyX1RPX0NQVShidXNfaW5mb19kYXRhWzJdKSA+PiA4KSAmIDB4MzsKKwlyZXR1cm4gKGJlMzJfdG9fY3B1KGJ1c19pbmZvX2RhdGFbMl0pID4+IDgpICYgMHgzOwogfQogCiBzdGF0aWMgc3RydWN0IGNzcjEyMTJfYnVzX29wcyBub2RlbWdyX2Nzcl9vcHMgPSB7CkBAIC0zNzAsOSArMzcxLDcgQEAKIAogCWlmIChzdGF0ZSA9PSAxKSB7CiAJCXVkLT5pZ25vcmVfZHJpdmVyID0gMTsKLQkJZG93bl93cml0ZSgmaWVlZTEzOTRfYnVzX3R5cGUuc3Vic3lzLnJ3c2VtKTsKIAkJZGV2aWNlX3JlbGVhc2VfZHJpdmVyKGRldik7Ci0JCXVwX3dyaXRlKCZpZWVlMTM5NF9idXNfdHlwZS5zdWJzeXMucndzZW0pOwogCX0gZWxzZSBpZiAoc3RhdGUgPT0gMCkKIAkJdWQtPmlnbm9yZV9kcml2ZXIgPSAwOwogCkBAIC01ODIsNyArNTgxLDcgQEAKIAkJCWdvdG8gZmFpbDsKIAlyZXR1cm47CiBmYWlsOgotCUhQU0JfRVJSKCJGYWlsZWQgdG8gYWRkIHN5c2ZzIGF0dHJpYnV0ZSBmb3IgZHJpdmVyICVzIiwgZHJpdmVyLT5uYW1lKTsKKwlIUFNCX0VSUigiRmFpbGVkIHRvIGFkZCBzeXNmcyBhdHRyaWJ1dGUiKTsKIH0KIAogCkBAIC02MDYsOCArNjA1LDcgQEAKIAkJCWdvdG8gZmFpbDsKIAlyZXR1cm47CiBmYWlsOgotCUhQU0JfRVJSKCJGYWlsZWQgdG8gYWRkIHN5c2ZzIGF0dHJpYnV0ZSBmb3Igbm9kZSAlMDE2THgiLAotCQkgKHVuc2lnbmVkIGxvbmcgbG9uZyluZS0+Z3VpZCk7CisJSFBTQl9FUlIoIkZhaWxlZCB0byBhZGQgc3lzZnMgYXR0cmlidXRlIik7CiB9CiAKIApAQCAtNjIxLDcgKzYxOSw3IEBACiAJCQlnb3RvIGZhaWw7CiAJcmV0dXJuOwogZmFpbDoKLQlIUFNCX0VSUigiRmFpbGVkIHRvIGFkZCBzeXNmcyBhdHRyaWJ1dGUgZm9yIGhvc3QgJWQiLCBob3N0LT5pZCk7CisJSFBTQl9FUlIoIkZhaWxlZCB0byBhZGQgc3lzZnMgYXR0cmlidXRlIik7CiB9CiAKIApAQCAtNjgxLDggKzY3OSw3IEBACiAJfQogCXJldHVybjsKIGZhaWw6Ci0JSFBTQl9FUlIoIkZhaWxlZCB0byBhZGQgc3lzZnMgYXR0cmlidXRlcyBmb3IgdW5pdCAlcyIsCi0JCSB1ZC0+ZGV2aWNlLmJ1c19pZCk7CisJSFBTQl9FUlIoIkZhaWxlZCB0byBhZGQgc3lzZnMgYXR0cmlidXRlIik7CiB9CiAKIApAQCAtMTE0NiwxMyArMTE0MywxMyBAQAogCQlsYXN0X2tleV9pZCA9IGt2LT5rZXkuaWQ7CiAJfQogCi0JaWYgKG5lLT52ZW5kb3JfbmFtZV9rdiAmJgotCSAgICBkZXZpY2VfY3JlYXRlX2ZpbGUoJm5lLT5kZXZpY2UsICZkZXZfYXR0cl9uZV92ZW5kb3JfbmFtZV9rdikpCi0JCWdvdG8gZmFpbDsKLQlyZXR1cm47Ci1mYWlsOgotCUhQU0JfRVJSKCJGYWlsZWQgdG8gYWRkIHN5c2ZzIGF0dHJpYnV0ZSBmb3Igbm9kZSAlMDE2THgiLAotCQkgKHVuc2lnbmVkIGxvbmcgbG9uZyluZS0+Z3VpZCk7CisJaWYgKG5lLT52ZW5kb3JfbmFtZV9rdikgeworCQlpbnQgZXJyb3IgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJm5lLT5kZXZpY2UsCisJCQkJCSAgICAgICAmZGV2X2F0dHJfbmVfdmVuZG9yX25hbWVfa3YpOworCisJCWlmIChlcnJvciAmJiBlcnJvciAhPSAtRUVYSVNUKQorCQkJSFBTQl9FUlIoIkZhaWxlZCB0byBhZGQgc3lzZnMgYXR0cmlidXRlIik7CisJfQogfQogCiAjaWZkZWYgQ09ORklHX0hPVFBMVUcKQEAgLTExNjMsNiArMTE2MCw3IEBACiAJc3RydWN0IHVuaXRfZGlyZWN0b3J5ICp1ZDsKIAlpbnQgaSA9IDA7CiAJaW50IGxlbmd0aCA9IDA7CisJaW50IHJldHZhbCA9IDA7CiAJLyogaWVlZTEzOTQ6dmVuTm1vTnNwTnZlck4gKi8KIAljaGFyIGJ1Zls4ICsgMSArIDMgKyA4ICsgMiArIDggKyAyICsgOCArIDMgKyA4ICsgMV07CiAKQEAgLTExNzYsMTQgKzExNzQsMTEgQEAKIAogI2RlZmluZSBQVVRfRU5WUChmbXQsdmFsKSAJCQkJCVwKIGRvIHsJCQkJCQkJCVwKLSAgICAJaW50IHByaW50ZWQ7CQkJCQkJXAotCWVudnBbaSsrXSA9IGJ1ZmZlcjsJCQkJCVwKLQlwcmludGVkID0gc25wcmludGYoYnVmZmVyLCBidWZmZXJfc2l6ZSAtIGxlbmd0aCwJXAotCQkJICAgZm10LCB2YWwpOwkJCQlcCi0JaWYgKChidWZmZXJfc2l6ZSAtIChsZW5ndGgrcHJpbnRlZCkgPD0gMCkgfHwgKGkgPj0gbnVtX2VudnApKQlcCi0JCXJldHVybiAtRU5PTUVNOwkJCQkJXAotCWxlbmd0aCArPSBwcmludGVkKzE7CQkJCQlcCi0JYnVmZmVyICs9IHByaW50ZWQrMTsJCQkJCVwKKwlyZXR2YWwgPSBhZGRfdWV2ZW50X3ZhcihlbnZwLCBudW1fZW52cCwgJmksCQlcCisJCQkJYnVmZmVyLCBidWZmZXJfc2l6ZSwgJmxlbmd0aCwJXAorCQkJCWZtdCwgdmFsKTsJCQlcCisJaWYgKHJldHZhbCkJCQkJCQlcCisJCXJldHVybiByZXR2YWw7CQkJCQlcCiB9IHdoaWxlICgwKQogCiAJUFVUX0VOVlAoIlZFTkRPUl9JRD0lMDZ4IiwgdWQtPnZlbmRvcl9pZCk7CkBAIC0xMzkzLDEyICsxMzg4LDEwIEBACiAJCWlmICh1ZC0+bmUgIT0gbmUpCiAJCQljb250aW51ZTsKIAotCQlkb3duX3dyaXRlKCZpZWVlMTM5NF9idXNfdHlwZS5zdWJzeXMucndzZW0pOwogCQlpZiAodWQtPmRldmljZS5kcml2ZXIgJiYKIAkJICAgICghdWQtPmRldmljZS5kcml2ZXItPnN1c3BlbmQgfHwKIAkJICAgICAgdWQtPmRldmljZS5kcml2ZXItPnN1c3BlbmQoJnVkLT5kZXZpY2UsIFBNU0dfU1VTUEVORCkpKQogCQkJZGV2aWNlX3JlbGVhc2VfZHJpdmVyKCZ1ZC0+ZGV2aWNlKTsKLQkJdXBfd3JpdGUoJmllZWUxMzk0X2J1c190eXBlLnN1YnN5cy5yd3NlbSk7CiAJfQogCXVwKCZub2RlbWdyX3VkX2NsYXNzLnNlbSk7CiB9CkBAIC0xNDE4LDEwICsxNDExLDggQEAKIAkJaWYgKHVkLT5uZSAhPSBuZSkKIAkJCWNvbnRpbnVlOwogCi0JCWRvd25fcmVhZCgmaWVlZTEzOTRfYnVzX3R5cGUuc3Vic3lzLnJ3c2VtKTsKIAkJaWYgKHVkLT5kZXZpY2UuZHJpdmVyICYmIHVkLT5kZXZpY2UuZHJpdmVyLT5yZXN1bWUpCiAJCQl1ZC0+ZGV2aWNlLmRyaXZlci0+cmVzdW1lKCZ1ZC0+ZGV2aWNlKTsKLQkJdXBfcmVhZCgmaWVlZTEzOTRfYnVzX3R5cGUuc3Vic3lzLnJ3c2VtKTsKIAl9CiAJdXAoJm5vZGVtZ3JfdWRfY2xhc3Muc2VtKTsKIApAQCAtMTQ0Miw3ICsxNDMzLDYgQEAKIAkJaWYgKHVkLT5uZSAhPSBuZSkKIAkJCWNvbnRpbnVlOwogCi0JCWRvd25fd3JpdGUoJmllZWUxMzk0X2J1c190eXBlLnN1YnN5cy5yd3NlbSk7CiAJCWlmICh1ZC0+ZGV2aWNlLmRyaXZlcikgewogCQkJcGRydiA9IGNvbnRhaW5lcl9vZih1ZC0+ZGV2aWNlLmRyaXZlciwKIAkJCQkJICAgIHN0cnVjdCBocHNiX3Byb3RvY29sX2RyaXZlciwKQEAgLTE0NTAsNyArMTQ0MCw2IEBACiAJCQlpZiAocGRydi0+dXBkYXRlICYmIHBkcnYtPnVwZGF0ZSh1ZCkpCiAJCQkJZGV2aWNlX3JlbGVhc2VfZHJpdmVyKCZ1ZC0+ZGV2aWNlKTsKIAkJfQotCQl1cF93cml0ZSgmaWVlZTEzOTRfYnVzX3R5cGUuc3Vic3lzLnJ3c2VtKTsKIAl9CiAJdXAoJm5vZGVtZ3JfdWRfY2xhc3Muc2VtKTsKIH0KQEAgLTE3NDgsNyArMTczNywxOSBAQAogCXJldHVybiAwOwogfQogCi1pbnQgbm9kZW1ncl9mb3JfZWFjaF9ob3N0KHZvaWQgKl9fZGF0YSwgaW50ICgqY2IpKHN0cnVjdCBocHNiX2hvc3QgKiwgdm9pZCAqKSkKKy8qKgorICogbm9kZW1ncl9mb3JfZWFjaF9ob3N0IC0gY2FsbCBhIGZ1bmN0aW9uIGZvciBlYWNoIElFRUUgMTM5NCBob3N0CisgKiBAZGF0YTogYW4gYWRkcmVzcyB0byBzdXBwbHkgdG8gdGhlIGNhbGxiYWNrCisgKiBAY2I6IGZ1bmN0aW9uIHRvIGNhbGwgZm9yIGVhY2ggaG9zdAorICoKKyAqIEl0ZXJhdGUgdGhlIGhvc3RzLCBjYWxsaW5nIGEgZ2l2ZW4gZnVuY3Rpb24gd2l0aCBzdXBwbGllZCBkYXRhIGZvciBlYWNoIGhvc3QuCisgKiBJZiB0aGUgY2FsbGJhY2sgZmFpbHMgb24gYSBob3N0LCBpLmUuIGlmIGl0IHJldHVybnMgYSBub24temVybyB2YWx1ZSwgdGhlCisgKiBpdGVyYXRpb24gaXMgc3RvcHBlZC4KKyAqCisgKiBSZXR1cm4gdmFsdWU6IDAgb24gc3VjY2Vzcywgbm9uLXplcm8gb24gZmFpbHVyZSAoc2FtZSBhcyByZXR1cm5lZCBieSBsYXN0IHJ1bgorICogb2YgdGhlIGNhbGxiYWNrKS4KKyAqLworaW50IG5vZGVtZ3JfZm9yX2VhY2hfaG9zdCh2b2lkICpkYXRhLCBpbnQgKCpjYikoc3RydWN0IGhwc2JfaG9zdCAqLCB2b2lkICopKQogewogCXN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXY7CiAJc3RydWN0IGhwc2JfaG9zdCAqaG9zdDsKQEAgLTE3NTgsNyArMTc1OSw3IEBACiAJbGlzdF9mb3JfZWFjaF9lbnRyeShjZGV2LCAmaHBzYl9ob3N0X2NsYXNzLmNoaWxkcmVuLCBub2RlKSB7CiAJCWhvc3QgPSBjb250YWluZXJfb2YoY2Rldiwgc3RydWN0IGhwc2JfaG9zdCwgY2xhc3NfZGV2KTsKIAotCQlpZiAoKGVycm9yID0gY2IoaG9zdCwgX19kYXRhKSkpCisJCWlmICgoZXJyb3IgPSBjYihob3N0LCBkYXRhKSkpCiAJCQlicmVhazsKIAl9CiAJdXAoJmhwc2JfaG9zdF9jbGFzcy5zZW0pOwpAQCAtMTc2Niw3ICsxNzY3LDcgQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKLS8qIFRoZSBmb2xsb3dpbmcgZm91ciBjb252ZW5pZW5jZSBmdW5jdGlvbnMgdXNlIGEgc3RydWN0IG5vZGVfZW50cnkKKy8qIFRoZSBmb2xsb3dpbmcgdHdvIGNvbnZlbmllbmNlIGZ1bmN0aW9ucyB1c2UgYSBzdHJ1Y3Qgbm9kZV9lbnRyeQogICogZm9yIGFkZHJlc3NpbmcgYSBub2RlIG9uIHRoZSBidXMuICBUaGV5IGFyZSBpbnRlbmRlZCBmb3IgdXNlIGJ5IGFueQogICogcHJvY2VzcyBjb250ZXh0LCBub3QganVzdCB0aGUgbm9kZW1nciB0aHJlYWQsIHNvIHdlIG5lZWQgdG8gYmUgYQogICogbGl0dGxlIGNhcmVmdWwgd2hlbiByZWFkaW5nIG91dCB0aGUgbm9kZSBJRCBhbmQgZ2VuZXJhdGlvbi4gIFRoZQpAQCAtMTc4MSwxMiArMTc4MiwyMCBAQAogICogSUQncy4KICAqLwogCi12b2lkIGhwc2Jfbm9kZV9maWxsX3BhY2tldChzdHJ1Y3Qgbm9kZV9lbnRyeSAqbmUsIHN0cnVjdCBocHNiX3BhY2tldCAqcGt0KQorLyoqCisgKiBocHNiX25vZGVfZmlsbF9wYWNrZXQgLSBmaWxsIHNvbWUgZGVzdGluYXRpb24gaW5mb3JtYXRpb24gaW50byBhIHBhY2tldAorICogQG5lOiBkZXN0aW5hdGlvbiBub2RlCisgKiBAcGFja2V0OiBwYWNrZXQgdG8gZmlsbCBpbgorICoKKyAqIFRoaXMgd2lsbCBmaWxsIGluIHRoZSBnaXZlbiwgcHJlLWluaXRpYWxpc2VkIGhwc2JfcGFja2V0IHdpdGggdGhlIGN1cnJlbnQKKyAqIGluZm9ybWF0aW9uIGZyb20gdGhlIG5vZGUgZW50cnkgKGhvc3QsIG5vZGUgSUQsIGJ1cyBnZW5lcmF0aW9uIG51bWJlcikuCisgKi8KK3ZvaWQgaHBzYl9ub2RlX2ZpbGxfcGFja2V0KHN0cnVjdCBub2RlX2VudHJ5ICpuZSwgc3RydWN0IGhwc2JfcGFja2V0ICpwYWNrZXQpCiB7Ci0JcGt0LT5ob3N0ID0gbmUtPmhvc3Q7Ci0JcGt0LT5nZW5lcmF0aW9uID0gbmUtPmdlbmVyYXRpb247CisJcGFja2V0LT5ob3N0ID0gbmUtPmhvc3Q7CisJcGFja2V0LT5nZW5lcmF0aW9uID0gbmUtPmdlbmVyYXRpb247CiAJYmFycmllcigpOwotCXBrdC0+bm9kZV9pZCA9IG5lLT5ub2RlaWQ7CisJcGFja2V0LT5ub2RlX2lkID0gbmUtPm5vZGVpZDsKIH0KIAogaW50IGhwc2Jfbm9kZV93cml0ZShzdHJ1Y3Qgbm9kZV9lbnRyeSAqbmUsIHU2NCBhZGRyLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC9ub2RlbWdyLmggYi9kcml2ZXJzL2llZWUxMzk0L25vZGVtZ3IuaAppbmRleCA0MTQ3MzAzLi5lN2FjNjgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWUxMzk0L25vZGVtZ3IuaAorKysgYi9kcml2ZXJzL2llZWUxMzk0L25vZGVtZ3IuaApAQCAtMTUzLDMwICsxNTMsMTAgQEAKIHsKIAlyZXR1cm4gbmUtPmdlbmVyYXRpb24gPT0gZ2V0X2hwc2JfZ2VuZXJhdGlvbihuZS0+aG9zdCk7CiB9Ci0KLS8qCi0gKiBUaGlzIHdpbGwgZmlsbCBpbiB0aGUgZ2l2ZW4sIHByZS1pbml0aWFsaXNlZCBocHNiX3BhY2tldCB3aXRoIHRoZSBjdXJyZW50Ci0gKiBpbmZvcm1hdGlvbiBmcm9tIHRoZSBub2RlIGVudHJ5IChob3N0LCBub2RlIElELCBnZW5lcmF0aW9uIG51bWJlcikuICBJdCB3aWxsCi0gKiByZXR1cm4gZmFsc2UgaWYgdGhlIG5vZGUgb3duaW5nIHRoZSBHVUlEIGlzIG5vdCBhY2Nlc3NpYmxlIChhbmQgbm90IG1vZGlmeQotICogdGhlIGhwc2JfcGFja2V0KSBhbmQgcmV0dXJuIHRydWUgb3RoZXJ3aXNlLgotICoKLSAqIE5vdGUgdGhhdCBwYWNrZXQgc2VuZGluZyBtYXkgc3RpbGwgZmFpbCBpbiBocHNiX3NlbmRfcGFja2V0IGlmIGEgYnVzIHJlc2V0Ci0gKiBoYXBwZW5zIHdoaWxlIHlvdSBhcmUgdHJ5aW5nIHRvIHNldCB1cCB0aGUgcGFja2V0IChkdWUgdG8gb2Jzb2xldGUgZ2VuZXJhdGlvbgotICogbnVtYmVyKS4gIEl0IHdpbGwgYXQgbGVhc3QgcmVsaWFibHkgZmFpbCBzbyB0aGF0IHlvdSBkb24ndCBhY2NpZGVudGFsbHkgYW5kCi0gKiB1bmtub3dpbmdseSBzZW5kIHlvdXIgcGFja2V0IHRvIHRoZSB3cm9uZyBub2RlLgotICovCi12b2lkIGhwc2Jfbm9kZV9maWxsX3BhY2tldChzdHJ1Y3Qgbm9kZV9lbnRyeSAqbmUsIHN0cnVjdCBocHNiX3BhY2tldCAqcGt0KTsKLQotaW50IGhwc2Jfbm9kZV9yZWFkKHN0cnVjdCBub2RlX2VudHJ5ICpuZSwgdTY0IGFkZHIsCi0JCSAgIHF1YWRsZXRfdCAqYnVmZmVyLCBzaXplX3QgbGVuZ3RoKTsKK3ZvaWQgaHBzYl9ub2RlX2ZpbGxfcGFja2V0KHN0cnVjdCBub2RlX2VudHJ5ICpuZSwgc3RydWN0IGhwc2JfcGFja2V0ICpwYWNrZXQpOwogaW50IGhwc2Jfbm9kZV93cml0ZShzdHJ1Y3Qgbm9kZV9lbnRyeSAqbmUsIHU2NCBhZGRyLAogCQkgICAgcXVhZGxldF90ICpidWZmZXIsIHNpemVfdCBsZW5ndGgpOwotaW50IGhwc2Jfbm9kZV9sb2NrKHN0cnVjdCBub2RlX2VudHJ5ICpuZSwgdTY0IGFkZHIsCi0JCSAgIGludCBleHRjb2RlLCBxdWFkbGV0X3QgKmRhdGEsIHF1YWRsZXRfdCBhcmcpOwotCi0vKiBJdGVyYXRlIHRoZSBob3N0cywgY2FsbGluZyBhIGdpdmVuIGZ1bmN0aW9uIHdpdGggc3VwcGxpZWQgZGF0YSBmb3IgZWFjaAotICogaG9zdC4gKi8KLWludCBub2RlbWdyX2Zvcl9lYWNoX2hvc3Qodm9pZCAqX19kYXRhLCBpbnQgKCpjYikoc3RydWN0IGhwc2JfaG9zdCAqLCB2b2lkICopKTsKK2ludCBub2RlbWdyX2Zvcl9lYWNoX2hvc3Qodm9pZCAqZGF0YSwgaW50ICgqY2IpKHN0cnVjdCBocHNiX2hvc3QgKiwgdm9pZCAqKSk7CiAKIGludCBpbml0X2llZWUxMzk0X25vZGVtZ3Iodm9pZCk7CiB2b2lkIGNsZWFudXBfaWVlZTEzOTRfbm9kZW1ncih2b2lkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvb2hjaTEzOTQuYyBiL2RyaXZlcnMvaWVlZTEzOTQvb2hjaTEzOTQuYwppbmRleCAwNmZhYzBkLi41ZGFkZmQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWUxMzk0L29oY2kxMzk0LmMKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9vaGNpMTM5NC5jCkBAIC01MDcsOSArNTA3LDggQEAKIAkvKiBTZXQgdXAgc2VsZi1pZCBkbWEgYnVmZmVyICovCiAJcmVnX3dyaXRlKG9oY2ksIE9IQ0kxMzk0X1NlbGZJREJ1ZmZlciwgb2hjaS0+c2VsZmlkX2J1Zl9idXMpOwogCi0JLyogZW5hYmxlIHNlbGYtaWQgYW5kIHBoeXMgKi8KLQlyZWdfd3JpdGUob2hjaSwgT0hDSTEzOTRfTGlua0NvbnRyb2xTZXQsIE9IQ0kxMzk0X0xpbmtDb250cm9sX1JjdlNlbGZJRCB8Ci0JCSAgT0hDSTEzOTRfTGlua0NvbnRyb2xfUmN2UGh5UGt0KTsKKwkvKiBlbmFibGUgc2VsZi1pZCAqLworCXJlZ193cml0ZShvaGNpLCBPSENJMTM5NF9MaW5rQ29udHJvbFNldCwgT0hDSTEzOTRfTGlua0NvbnRyb2xfUmN2U2VsZklEKTsKIAogCS8qIFNldCB0aGUgQ29uZmlnIFJPTSBtYXBwaW5nIHJlZ2lzdGVyICovCiAJcmVnX3dyaXRlKG9oY2ksIE9IQ0kxMzk0X0NvbmZpZ1JPTW1hcCwgb2hjaS0+Y3NyX2NvbmZpZ19yb21fYnVzKTsKQEAgLTUxOCw5ICs1MTcsNiBAQAogCW9oY2ktPm1heF9wYWNrZXRfc2l6ZSA9CiAJCTE8PCgoKHJlZ19yZWFkKG9oY2ksIE9IQ0kxMzk0X0J1c09wdGlvbnMpPj4xMikmMHhmKSsxKTsKIAkJCi0JLyogRG9uJ3QgYWNjZXB0IHBoeSBwYWNrZXRzIGludG8gQVIgcmVxdWVzdCBjb250ZXh0ICovCi0JcmVnX3dyaXRlKG9oY2ksIE9IQ0kxMzk0X0xpbmtDb250cm9sQ2xlYXIsIDB4MDAwMDA0MDApOwotCiAJLyogQ2xlYXIgdGhlIGludGVycnVwdCBtYXNrICovCiAJcmVnX3dyaXRlKG9oY2ksIE9IQ0kxMzk0X0lzb1JlY3ZJbnRNYXNrQ2xlYXIsIDB4ZmZmZmZmZmYpOwogCXJlZ193cml0ZShvaGNpLCBPSENJMTM5NF9Jc29SZWN2SW50RXZlbnRDbGVhciwgMHhmZmZmZmZmZik7CkBAIC02MTcsNyArNjEzLDcgQEAKICNlbmRpZgogCiAJCVBSSU5UKEtFUk5fREVCVUcsICJTZXJpYWwgRUVQUk9NIGhhcyBzdXNwaWNpb3VzIHZhbHVlcywgIgotICAgICAgICAgICAgICAgICAgICAgICJhdHRlbXB0aW5nIHRvIHNldHRpbmcgbWF4X3BhY2tldF9zaXplIHRvIDUxMiBieXRlcyIpOworICAgICAgICAgICAgICAgICAgICAgICJhdHRlbXB0aW5nIHRvIHNldCBtYXhfcGFja2V0X3NpemUgdG8gNTEyIGJ5dGVzIik7CiAJCXJlZ193cml0ZShvaGNpLCBPSENJMTM5NF9CdXNPcHRpb25zLAogCQkJICAocmVnX3JlYWQob2hjaSwgT0hDSTEzOTRfQnVzT3B0aW9ucykgJiAweGYwMDcpIHwgMHg4MDAyKTsKIAkJb2hjaS0+bWF4X3BhY2tldF9zaXplID0gNTEyOwpAQCAtMjM3Nyw2ICsyMzczLDcgQEAKIAlpZiAoZXZlbnQgJiBPSENJMTM5NF9wb3N0ZWRXcml0ZUVycikgewogCQlQUklOVChLRVJOX0VSUiwgInBoeXNpY2FsIHBvc3RlZCB3cml0ZSBlcnJvciIpOwogCQkvKiBubyByZWNvdmVyeSBzdHJhdGVneSB5ZXQsIGhhZCB0byBpbnZvbHZlIHByb3RvY29sIGRyaXZlcnMgKi8KKwkJZXZlbnQgJj0gfk9IQ0kxMzk0X3Bvc3RlZFdyaXRlRXJyOwogCX0KIAlpZiAoZXZlbnQgJiBPSENJMTM5NF9jeWNsZVRvb0xvbmcpIHsKIAkJaWYocHJpbnRrX3JhdGVsaW1pdCgpKQpAQCAtMzY1OCw2ICszNjU1LDcgQEAKIC8qIGVzc2VudGlhbGx5IHRoZSBvbmx5IHB1cnBvc2Ugb2YgdGhpcyBjb2RlIGlzIHRvIGFsbG93IGFub3RoZXIKICAgIG1vZHVsZSB0byBob29rIGludG8gb2hjaSdzIGludGVycnVwdCBoYW5kbGVyICovCiAKKy8qIHJldHVybnMgemVybyBpZiBzdWNjZXNzZnVsLCBvbmUgaWYgRE1BIGNvbnRleHQgaXMgbG9ja2VkIHVwICovCiBpbnQgb2hjaTEzOTRfc3RvcF9jb250ZXh0KHN0cnVjdCB0aV9vaGNpICpvaGNpLCBpbnQgcmVnLCBjaGFyICptc2cpCiB7CiAJaW50IGk9MDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvb2hjaTEzOTQuaCBiL2RyaXZlcnMvaWVlZTEzOTQvb2hjaTEzOTQuaAppbmRleCBmYTA1ZjExLi5mMWFkNTM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWUxMzk0L29oY2kxMzk0LmgKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9vaGNpMTM5NC5oCkBAIC00NjEsOSArNDYxLDcgQEAKIAkJCQkgIHN0cnVjdCBvaGNpMTM5NF9pc29fdGFza2xldCAqdGFza2xldCk7CiB2b2lkIG9oY2kxMzk0X3VucmVnaXN0ZXJfaXNvX3Rhc2tsZXQoc3RydWN0IHRpX29oY2kgKm9oY2ksCiAJCQkJICAgICBzdHJ1Y3Qgb2hjaTEzOTRfaXNvX3Rhc2tsZXQgKnRhc2tsZXQpOwotCi0vKiByZXR1cm5zIHplcm8gaWYgc3VjY2Vzc2Z1bCwgb25lIGlmIERNQSBjb250ZXh0IGlzIGxvY2tlZCB1cCAqLwotaW50IG9oY2kxMzk0X3N0b3BfY29udGV4dCAgICAgIChzdHJ1Y3QgdGlfb2hjaSAqb2hjaSwgaW50IHJlZywgY2hhciAqbXNnKTsKK2ludCBvaGNpMTM5NF9zdG9wX2NvbnRleHQoc3RydWN0IHRpX29oY2kgKm9oY2ksIGludCByZWcsIGNoYXIgKm1zZyk7CiBzdHJ1Y3QgdGlfb2hjaSAqb2hjaTEzOTRfZ2V0X3N0cnVjdChpbnQgY2FyZF9udW0pOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvcmF3MTM5NC5jIGIvZHJpdmVycy9pZWVlMTM5NC9yYXcxMzk0LmMKaW5kZXggYmI4OTdhMy4uYzZhZWZkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZWVlMTM5NC9yYXcxMzk0LmMKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9yYXcxMzk0LmMKQEAgLTkzOCw3ICs5MzgsOCBAQAogCWludCBoZWFkZXJfbGVuZ3RoID0gcmVxLT5yZXEubWlzYyAmIDB4ZmZmZjsKIAlpbnQgZXhwZWN0X3Jlc3BvbnNlID0gcmVxLT5yZXEubWlzYyA+PiAxNjsKIAotCWlmICgoaGVhZGVyX2xlbmd0aCA+IHJlcS0+cmVxLmxlbmd0aCkgfHwgKGhlYWRlcl9sZW5ndGggPCAxMikpIHsKKwlpZiAoaGVhZGVyX2xlbmd0aCA+IHJlcS0+cmVxLmxlbmd0aCB8fCBoZWFkZXJfbGVuZ3RoIDwgMTIgfHwKKwkgICAgaGVhZGVyX2xlbmd0aCA+IEZJRUxEX1NJWkVPRihzdHJ1Y3QgaHBzYl9wYWNrZXQsIGhlYWRlcikpIHsKIAkJcmVxLT5yZXEuZXJyb3IgPSBSQVcxMzk0X0VSUk9SX0lOVkFMSURfQVJHOwogCQlyZXEtPnJlcS5sZW5ndGggPSAwOwogCQlxdWV1ZV9jb21wbGV0ZV9yZXEocmVxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvc2JwMi5jIGIvZHJpdmVycy9pZWVlMTM5NC9zYnAyLmMKaW5kZXggNGVkZmZmNC4uNGNiNmZhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZWVlMTM5NC9zYnAyLmMKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9zYnAyLmMKQEAgLTU5LDggKzU5LDEwIEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CkBAIC00NjksMTkgKzQ3MSwxMyBAQAogc3RhdGljIGludCBzYnAydXRpbF9jcmVhdGVfY29tbWFuZF9vcmJfcG9vbChzdHJ1Y3Qgc2JwMl9sdSAqbHUpCiB7CiAJc3RydWN0IHNicDJfZndob3N0X2luZm8gKmhpID0gbHUtPmhpOwotCWludCBpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIG9yYnM7CiAJc3RydWN0IHNicDJfY29tbWFuZF9pbmZvICpjbWQ7CisJaW50IGksIG9yYnMgPSBzYnAyX3NlcmlhbGl6ZV9pbyA/IDIgOiBTQlAyX01BWF9DTURTOwogCi0Jb3JicyA9IHNicDJfc2VyaWFsaXplX2lvID8gMiA6IFNCUDJfTUFYX0NNRFM7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmbHUtPmNtZF9vcmJfbG9jaywgZmxhZ3MpOwogCWZvciAoaSA9IDA7IGkgPCBvcmJzOyBpKyspIHsKLQkJY21kID0ga3phbGxvYyhzaXplb2YoKmNtZCksIEdGUF9BVE9NSUMpOwotCQlpZiAoIWNtZCkgewotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHUtPmNtZF9vcmJfbG9jaywgZmxhZ3MpOworCQljbWQgPSBremFsbG9jKHNpemVvZigqY21kKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghY21kKQogCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KIAkJY21kLT5jb21tYW5kX29yYl9kbWEgPSBkbWFfbWFwX3NpbmdsZShoaS0+aG9zdC0+ZGV2aWNlLnBhcmVudCwKIAkJCQkJCSZjbWQtPmNvbW1hbmRfb3JiLAogCQkJCQkJc2l6ZW9mKHN0cnVjdCBzYnAyX2NvbW1hbmRfb3JiKSwKQEAgLTQ4OSwxMSArNDg1LDEwIEBACiAJCWNtZC0+c2dlX2RtYSA9IGRtYV9tYXBfc2luZ2xlKGhpLT5ob3N0LT5kZXZpY2UucGFyZW50LAogCQkJCQkmY21kLT5zY2F0dGVyX2dhdGhlcl9lbGVtZW50LAogCQkJCQlzaXplb2YoY21kLT5zY2F0dGVyX2dhdGhlcl9lbGVtZW50KSwKLQkJCQkJRE1BX0JJRElSRUNUSU9OQUwpOworCQkJCQlETUFfVE9fREVWSUNFKTsKIAkJSU5JVF9MSVNUX0hFQUQoJmNtZC0+bGlzdCk7CiAJCWxpc3RfYWRkX3RhaWwoJmNtZC0+bGlzdCwgJmx1LT5jbWRfb3JiX2NvbXBsZXRlZCk7CiAJfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmx1LT5jbWRfb3JiX2xvY2ssIGZsYWdzKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNTE0LDcgKzUwOSw3IEBACiAJCQkJCSBETUFfVE9fREVWSUNFKTsKIAkJCWRtYV91bm1hcF9zaW5nbGUoaG9zdC0+ZGV2aWNlLnBhcmVudCwgY21kLT5zZ2VfZG1hLAogCQkJCQkgc2l6ZW9mKGNtZC0+c2NhdHRlcl9nYXRoZXJfZWxlbWVudCksCi0JCQkJCSBETUFfQklESVJFQ1RJT05BTCk7CisJCQkJCSBETUFfVE9fREVWSUNFKTsKIAkJCWtmcmVlKGNtZCk7CiAJCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsdS0+Y21kX29yYl9sb2NrLCBmbGFncyk7CkBAIC03NTcsNiArNzUyLDExIEBACiAJCQlTQlAyX0VSUigiZmFpbGVkIHRvIHJlZ2lzdGVyIGxvd2VyIDRHQiBhZGRyZXNzIHJhbmdlIik7CiAJCQlnb3RvIGZhaWxlZF9hbGxvYzsKIAkJfQorI2Vsc2UKKwkJaWYgKGRtYV9zZXRfbWFzayhoaS0+aG9zdC0+ZGV2aWNlLnBhcmVudCwgRE1BXzMyQklUX01BU0spKSB7CisJCQlTQlAyX0VSUigiZmFpbGVkIHRvIHNldCA0R0IgRE1BIG1hc2siKTsKKwkJCWdvdG8gZmFpbGVkX2FsbG9jOworCQl9CiAjZW5kaWYKIAl9CiAKQEAgLTg2NSwxMSArODY1LDggQEAKIAlpZiAoIWx1LT5sb2dpbl9vcmIpCiAJCWdvdG8gYWxsb2NfZmFpbDsKIAotCWlmIChzYnAydXRpbF9jcmVhdGVfY29tbWFuZF9vcmJfcG9vbChsdSkpIHsKLQkJU0JQMl9FUlIoInNicDJ1dGlsX2NyZWF0ZV9jb21tYW5kX29yYl9wb29sIGZhaWxlZCEiKTsKLQkJc2JwMl9yZW1vdmVfZGV2aWNlKGx1KTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQorCWlmIChzYnAydXRpbF9jcmVhdGVfY29tbWFuZF9vcmJfcG9vbChsdSkpCisJCWdvdG8gYWxsb2NfZmFpbDsKIAogCS8qIFdhaXQgYSBzZWNvbmQgYmVmb3JlIHRyeWluZyB0byBsb2cgaW4uIFByZXZpb3VzbHkgbG9nZ2VkIGluCiAJICogaW5pdGlhdG9ycyBuZWVkIGEgY2hhbmNlIHRvIHJlY29ubmVjdC4gKi8KQEAgLTE2MjgsNyArMTYyNSw3IEBACiAJCQkJICAgRE1BX1RPX0RFVklDRSk7CiAJZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UoaGktPmhvc3QtPmRldmljZS5wYXJlbnQsIGNtZC0+c2dlX2RtYSwKIAkJCQkgICBzaXplb2YoY21kLT5zY2F0dGVyX2dhdGhlcl9lbGVtZW50KSwKLQkJCQkgICBETUFfQklESVJFQ1RJT05BTCk7CisJCQkJICAgRE1BX1RPX0RFVklDRSk7CiAKIAkvKiBjaGVjayB0byBzZWUgaWYgdGhlcmUgYXJlIGFueSBwcmV2aW91cyBvcmJzIHRvIHVzZSAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZsdS0+Y21kX29yYl9sb2NrLCBmbGFncyk7CkBAIC0xNzk0LDcgKzE3OTEsNyBAQAogCQkJCQlETUFfVE9fREVWSUNFKTsKIAkJZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoaGktPmhvc3QtPmRldmljZS5wYXJlbnQsIGNtZC0+c2dlX2RtYSwKIAkJCQkJc2l6ZW9mKGNtZC0+c2NhdHRlcl9nYXRoZXJfZWxlbWVudCksCi0JCQkJCURNQV9CSURJUkVDVElPTkFMKTsKKwkJCQkJRE1BX1RPX0RFVklDRSk7CiAJCS8qIEdyYWIgU0NTSSBjb21tYW5kIHBvaW50ZXJzIGFuZCBjaGVjayBzdGF0dXMuICovCiAJCS8qCiAJCSAqIEZJWE1FOiBJZiB0aGUgc3JjIGZpZWxkIGluIHRoZSBzdGF0dXMgaXMgMSwgdGhlIE9SQiBETUEgbXVzdApAQCAtMTkyNiw3ICsxOTIzLDcgQEAKIAkJCQkJRE1BX1RPX0RFVklDRSk7CiAJCWRtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KGhpLT5ob3N0LT5kZXZpY2UucGFyZW50LCBjbWQtPnNnZV9kbWEsCiAJCQkJCXNpemVvZihjbWQtPnNjYXR0ZXJfZ2F0aGVyX2VsZW1lbnQpLAotCQkJCQlETUFfQklESVJFQ1RJT05BTCk7CisJCQkJCURNQV9UT19ERVZJQ0UpOwogCQlzYnAydXRpbF9tYXJrX2NvbW1hbmRfY29tcGxldGVkKGx1LCBjbWQpOwogCQlpZiAoY21kLT5DdXJyZW50X1NDcG50KSB7CiAJCQljbWQtPkN1cnJlbnRfU0NwbnQtPnJlc3VsdCA9IHN0YXR1cyA8PCAxNjsKQEAgLTIwNTcsNyArMjA1NCw3IEBACiAJCQlkbWFfc3luY19zaW5nbGVfZm9yX2NwdShoaS0+aG9zdC0+ZGV2aWNlLnBhcmVudCwKIAkJCQkJY21kLT5zZ2VfZG1hLAogCQkJCQlzaXplb2YoY21kLT5zY2F0dGVyX2dhdGhlcl9lbGVtZW50KSwKLQkJCQkJRE1BX0JJRElSRUNUSU9OQUwpOworCQkJCQlETUFfVE9fREVWSUNFKTsKIAkJCXNicDJ1dGlsX21hcmtfY29tbWFuZF9jb21wbGV0ZWQobHUsIGNtZCk7CiAJCQlpZiAoY21kLT5DdXJyZW50X1NDcG50KSB7CiAJCQkJY21kLT5DdXJyZW50X1NDcG50LT5yZXN1bHQgPSBESURfQUJPUlQgPDwgMTY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L3NicDIuaCBiL2RyaXZlcnMvaWVlZTEzOTQvc2JwMi5oCmluZGV4IDlhZTg0MjMuLjQ0NDAyYjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWVlZTEzOTQvc2JwMi5oCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvc2JwMi5oCkBAIC0yNTAsMTUgKzI1MCwxNSBAQAogLyogUGVyIFNDU0kgY29tbWFuZCAqLwogc3RydWN0IHNicDJfY29tbWFuZF9pbmZvIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci0Jc3RydWN0IHNicDJfY29tbWFuZF9vcmIgY29tbWFuZF9vcmIgX19fX2NhY2hlbGluZV9hbGlnbmVkOwotCWRtYV9hZGRyX3QgY29tbWFuZF9vcmJfZG1hIF9fX19jYWNoZWxpbmVfYWxpZ25lZDsKKwlzdHJ1Y3Qgc2JwMl9jb21tYW5kX29yYiBjb21tYW5kX29yYjsKKwlkbWFfYWRkcl90IGNvbW1hbmRfb3JiX2RtYTsKIAlzdHJ1Y3Qgc2NzaV9jbW5kICpDdXJyZW50X1NDcG50OwogCXZvaWQgKCpDdXJyZW50X2RvbmUpKHN0cnVjdCBzY3NpX2NtbmQgKik7CiAKIAkvKiBBbHNvIG5lZWQgcy9nIHN0cnVjdHVyZSBmb3IgZWFjaCBzYnAyIGNvbW1hbmQgKi8KIAlzdHJ1Y3Qgc2JwMl91bnJlc3RyaWN0ZWRfcGFnZV90YWJsZQotCQkJc2NhdHRlcl9nYXRoZXJfZWxlbWVudFtTR19BTExdIF9fX19jYWNoZWxpbmVfYWxpZ25lZDsKLQlkbWFfYWRkcl90IHNnZV9kbWEgX19fX2NhY2hlbGluZV9hbGlnbmVkOworCQlzY2F0dGVyX2dhdGhlcl9lbGVtZW50W1NHX0FMTF0gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpOworCWRtYV9hZGRyX3Qgc2dlX2RtYTsKIAl2b2lkICpzZ2VfYnVmZmVyOwogCWRtYV9hZGRyX3QgY21kX2RtYTsKIAllbnVtIHNicDJfZG1hX3R5cGVzIGRtYV90eXBlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvbWFkLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9tYWQuYwppbmRleCAxM2VmZDQxLi42ZWRmZWNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9tYWQuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9tYWQuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgVm9sdGFpcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA3IFZvbHRhaXJlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDUgSW50ZWwgQ29ycG9yYXRpb24uICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogQ29weXJpZ2h0IChjKSAyMDA1IE1lbGxhbm94IFRlY2hub2xvZ2llcyBMdGQuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKQEAgLTMxLDcgKzMxLDYgQEAKICAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKICAqIFNPRlRXQVJFLgogICoKLSAqICRJZDogbWFkLmMgNTU5NiAyMDA2LTAzLTAzIDAxOjAwOjA3WiBzZWFuLmhlZnR5ICQKICAqLwogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8cmRtYS9pYl9jYWNoZS5oPgpAQCAtNjY4LDcgKzY2Nyw3IEBACiBzdGF0aWMgaW50IGhhbmRsZV9vdXRnb2luZ19kcl9zbXAoc3RydWN0IGliX21hZF9hZ2VudF9wcml2YXRlICptYWRfYWdlbnRfcHJpdiwKIAkJCQkgIHN0cnVjdCBpYl9tYWRfc2VuZF93cl9wcml2YXRlICptYWRfc2VuZF93cikKIHsKLQlpbnQgcmV0OworCWludCByZXQgPSAwOwogCXN0cnVjdCBpYl9zbXAgKnNtcCA9IG1hZF9zZW5kX3dyLT5zZW5kX2J1Zi5tYWQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgaWJfbWFkX2xvY2FsX3ByaXZhdGUgKmxvY2FsOwpAQCAtNjg4LDE0ICs2ODcsMTUgQEAKIAkgKi8KIAlpZiAoKGliX2dldF9zbXBfZGlyZWN0aW9uKHNtcCkgPyBzbXAtPmRyX2RsaWQgOiBzbXAtPmRyX3NsaWQpID09CiAJICAgICBJQl9MSURfUEVSTUlTU0lWRSAmJgotCSAgICAhc21pX2hhbmRsZV9kcl9zbXBfc2VuZChzbXAsIGRldmljZS0+bm9kZV90eXBlLCBwb3J0X251bSkpIHsKKwkgICAgIHNtaV9oYW5kbGVfZHJfc21wX3NlbmQoc21wLCBkZXZpY2UtPm5vZGVfdHlwZSwgcG9ydF9udW0pID09CisJICAgICBJQl9TTUlfRElTQ0FSRCkgewogCQlyZXQgPSAtRUlOVkFMOwogCQlwcmludGsoS0VSTl9FUlIgUEZYICJJbnZhbGlkIGRpcmVjdGVkIHJvdXRlXG4iKTsKIAkJZ290byBvdXQ7CiAJfQorCiAJLyogQ2hlY2sgdG8gcG9zdCBzZW5kIG9uIFFQIG9yIHByb2Nlc3MgbG9jYWxseSAqLwotCXJldCA9IHNtaV9jaGVja19sb2NhbF9zbXAoc21wLCBkZXZpY2UpOwotCWlmICghcmV0KQorCWlmIChzbWlfY2hlY2tfbG9jYWxfc21wKHNtcCwgZGV2aWNlKSA9PSBJQl9TTUlfRElTQ0FSRCkKIAkJZ290byBvdXQ7CiAKIAlsb2NhbCA9IGttYWxsb2Moc2l6ZW9mICpsb2NhbCwgR0ZQX0FUT01JQyk7CkBAIC0xODc0LDE4ICsxODc0LDIyIEBACiAKIAlpZiAocmVjdi0+bWFkLm1hZC5tYWRfaGRyLm1nbXRfY2xhc3MgPT0KIAkgICAgSUJfTUdNVF9DTEFTU19TVUJOX0RJUkVDVEVEX1JPVVRFKSB7Ci0JCWlmICghc21pX2hhbmRsZV9kcl9zbXBfcmVjdigmcmVjdi0+bWFkLnNtcCwKLQkJCQkJICAgIHBvcnRfcHJpdi0+ZGV2aWNlLT5ub2RlX3R5cGUsCi0JCQkJCSAgICBwb3J0X3ByaXYtPnBvcnRfbnVtLAotCQkJCQkgICAgcG9ydF9wcml2LT5kZXZpY2UtPnBoeXNfcG9ydF9jbnQpKQorCQlpZiAoc21pX2hhbmRsZV9kcl9zbXBfcmVjdigmcmVjdi0+bWFkLnNtcCwKKwkJCQkJICAgcG9ydF9wcml2LT5kZXZpY2UtPm5vZGVfdHlwZSwKKwkJCQkJICAgcG9ydF9wcml2LT5wb3J0X251bSwKKwkJCQkJICAgcG9ydF9wcml2LT5kZXZpY2UtPnBoeXNfcG9ydF9jbnQpID09CisJCQkJCSAgIElCX1NNSV9ESVNDQVJEKQogCQkJZ290byBvdXQ7Ci0JCWlmICghc21pX2NoZWNrX2ZvcndhcmRfZHJfc21wKCZyZWN2LT5tYWQuc21wKSkKKworCQlpZiAoc21pX2NoZWNrX2ZvcndhcmRfZHJfc21wKCZyZWN2LT5tYWQuc21wKSA9PSBJQl9TTUlfTE9DQUwpCiAJCQlnb3RvIGxvY2FsOwotCQlpZiAoIXNtaV9oYW5kbGVfZHJfc21wX3NlbmQoJnJlY3YtPm1hZC5zbXAsCi0JCQkJCSAgICBwb3J0X3ByaXYtPmRldmljZS0+bm9kZV90eXBlLAotCQkJCQkgICAgcG9ydF9wcml2LT5wb3J0X251bSkpCisKKwkJaWYgKHNtaV9oYW5kbGVfZHJfc21wX3NlbmQoJnJlY3YtPm1hZC5zbXAsCisJCQkJCSAgIHBvcnRfcHJpdi0+ZGV2aWNlLT5ub2RlX3R5cGUsCisJCQkJCSAgIHBvcnRfcHJpdi0+cG9ydF9udW0pID09IElCX1NNSV9ESVNDQVJEKQogCQkJZ290byBvdXQ7Ci0JCWlmICghc21pX2NoZWNrX2xvY2FsX3NtcCgmcmVjdi0+bWFkLnNtcCwgcG9ydF9wcml2LT5kZXZpY2UpKQorCisJCWlmIChzbWlfY2hlY2tfbG9jYWxfc21wKCZyZWN2LT5tYWQuc21wLCBwb3J0X3ByaXYtPmRldmljZSkgPT0gSUJfU01JX0RJU0NBUkQpCiAJCQlnb3RvIG91dDsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3NhX3F1ZXJ5LmMgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9zYV9xdWVyeS5jCmluZGV4IDY4ZGI2MzMuLjlhN2VhYWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3NhX3F1ZXJ5LmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvc2FfcXVlcnkuYwpAQCAtNTcsNiArNTcsNyBAQAogc3RydWN0IGliX3NhX3NtX2FoIHsKIAlzdHJ1Y3QgaWJfYWggICAgICAgICphaDsKIAlzdHJ1Y3Qga3JlZiAgICAgICAgICByZWY7CisJdTgJCSAgICAgc3JjX3BhdGhfbWFzazsKIH07CiAKIHN0cnVjdCBpYl9zYV9wb3J0IHsKQEAgLTM4MCw2ICszODEsNyBAQAogCX0KIAogCWtyZWZfaW5pdCgmbmV3X2FoLT5yZWYpOworCW5ld19haC0+c3JjX3BhdGhfbWFzayA9ICgxIDw8IHBvcnRfYXR0ci5sbWMpIC0gMTsKIAogCW1lbXNldCgmYWhfYXR0ciwgMCwgc2l6ZW9mIGFoX2F0dHIpOwogCWFoX2F0dHIuZGxpZCAgICAgPSBwb3J0X2F0dHIuc21fbGlkOwpAQCAtNDYwLDYgKzQ2MiwyNSBAQAogfQogRVhQT1JUX1NZTUJPTChpYl9zYV9jYW5jZWxfcXVlcnkpOwogCitzdGF0aWMgdTggZ2V0X3NyY19wYXRoX21hc2soc3RydWN0IGliX2RldmljZSAqZGV2aWNlLCB1OCBwb3J0X251bSkKK3sKKwlzdHJ1Y3QgaWJfc2FfZGV2aWNlICpzYV9kZXY7CisJc3RydWN0IGliX3NhX3BvcnQgICAqcG9ydDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXU4IHNyY19wYXRoX21hc2s7CisKKwlzYV9kZXYgPSBpYl9nZXRfY2xpZW50X2RhdGEoZGV2aWNlLCAmc2FfY2xpZW50KTsKKwlpZiAoIXNhX2RldikKKwkJcmV0dXJuIDB4N2Y7CisKKwlwb3J0ICA9ICZzYV9kZXYtPnBvcnRbcG9ydF9udW0gLSBzYV9kZXYtPnN0YXJ0X3BvcnRdOworCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT5haF9sb2NrLCBmbGFncyk7CisJc3JjX3BhdGhfbWFzayA9IHBvcnQtPnNtX2FoID8gcG9ydC0+c21fYWgtPnNyY19wYXRoX21hc2sgOiAweDdmOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmFoX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiBzcmNfcGF0aF9tYXNrOworfQorCiBpbnQgaWJfaW5pdF9haF9mcm9tX3BhdGgoc3RydWN0IGliX2RldmljZSAqZGV2aWNlLCB1OCBwb3J0X251bSwKIAkJCSBzdHJ1Y3QgaWJfc2FfcGF0aF9yZWMgKnJlYywgc3RydWN0IGliX2FoX2F0dHIgKmFoX2F0dHIpCiB7CkBAIC00NjksNyArNDkwLDggQEAKIAltZW1zZXQoYWhfYXR0ciwgMCwgc2l6ZW9mICphaF9hdHRyKTsKIAlhaF9hdHRyLT5kbGlkID0gYmUxNl90b19jcHUocmVjLT5kbGlkKTsKIAlhaF9hdHRyLT5zbCA9IHJlYy0+c2w7Ci0JYWhfYXR0ci0+c3JjX3BhdGhfYml0cyA9IGJlMTZfdG9fY3B1KHJlYy0+c2xpZCkgJiAweDdmOworCWFoX2F0dHItPnNyY19wYXRoX2JpdHMgPSBiZTE2X3RvX2NwdShyZWMtPnNsaWQpICYKKwkJCQkgZ2V0X3NyY19wYXRoX21hc2soZGV2aWNlLCBwb3J0X251bSk7CiAJYWhfYXR0ci0+cG9ydF9udW0gPSBwb3J0X251bTsKIAlhaF9hdHRyLT5zdGF0aWNfcmF0ZSA9IHJlYy0+cmF0ZTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvc21pLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9zbWkuYwppbmRleCA1NGI4MWUxLi4yYmNhNzUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9zbWkuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9zbWkuYwpAQCAtMyw3ICszLDcgQEAKICAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJbmZpbmljb24gQ29ycG9yYXRpb24uICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IEludGVsIENvcnBvcmF0aW9uLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBUb3BzcGluIENvcnBvcmF0aW9uLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBWb2x0YWlyZSBDb3Jwb3JhdGlvbi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNyBWb2x0YWlyZSBDb3Jwb3JhdGlvbi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDUgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCkBAIC0zNCw3ICszNCw2IEBACiAgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCiAgKiBTT0ZUV0FSRS4KICAqCi0gKiAkSWQ6IHNtaS5jIDEzODkgMjAwNC0xMi0yNyAyMjo1Njo0N1ogcm9sYW5kICQKICAqLwogCiAjaW5jbHVkZSA8cmRtYS9pYl9zbWkuaD4KQEAgLTQ0LDkgKzQzLDggQEAKICAqIEZpeHVwIGEgZGlyZWN0ZWQgcm91dGUgU01QIGZvciBzZW5kaW5nCiAgKiBSZXR1cm4gMCBpZiB0aGUgU01QIHNob3VsZCBiZSBkaXNjYXJkZWQKICAqLwotaW50IHNtaV9oYW5kbGVfZHJfc21wX3NlbmQoc3RydWN0IGliX3NtcCAqc21wLAotCQkJICAgdTggbm9kZV90eXBlLAotCQkJICAgaW50IHBvcnRfbnVtKQorZW51bSBzbWlfYWN0aW9uIHNtaV9oYW5kbGVfZHJfc21wX3NlbmQoc3RydWN0IGliX3NtcCAqc21wLAorCQkJCSAgICAgICB1OCBub2RlX3R5cGUsIGludCBwb3J0X251bSkKIHsKIAl1OCBob3BfcHRyLCBob3BfY250OwogCkBAIC01OSwxOCArNTcsMTggQEAKIAkJaWYgKGhvcF9jbnQgJiYgaG9wX3B0ciA9PSAwKSB7CiAJCQlzbXAtPmhvcF9wdHIrKzsKIAkJCXJldHVybiAoc21wLT5pbml0aWFsX3BhdGhbc21wLT5ob3BfcHRyXSA9PQotCQkJCXBvcnRfbnVtKTsKKwkJCQlwb3J0X251bSA/IElCX1NNSV9IQU5ETEUgOiBJQl9TTUlfRElTQ0FSRCk7CiAJCX0KIAogCQkvKiBDMTQtOToyICovCiAJCWlmIChob3BfcHRyICYmIGhvcF9wdHIgPCBob3BfY250KSB7CiAJCQlpZiAobm9kZV90eXBlICE9IFJETUFfTk9ERV9JQl9TV0lUQ0gpCi0JCQkJcmV0dXJuIDA7CisJCQkJcmV0dXJuIElCX1NNSV9ESVNDQVJEOwogCiAJCQkvKiBzbXAtPnJldHVybl9wYXRoIHNldCB3aGVuIHJlY2VpdmVkICovCiAJCQlzbXAtPmhvcF9wdHIrKzsKIAkJCXJldHVybiAoc21wLT5pbml0aWFsX3BhdGhbc21wLT5ob3BfcHRyXSA9PQotCQkJCXBvcnRfbnVtKTsKKwkJCQlwb3J0X251bSA/IElCX1NNSV9IQU5ETEUgOiBJQl9TTUlfRElTQ0FSRCk7CiAJCX0KIAogCQkvKiBDMTQtOTozIC0tIFdlJ3JlIGF0IHRoZSBlbmQgb2YgdGhlIERSIHNlZ21lbnQgb2YgcGF0aCAqLwpAQCAtNzgsMjkgKzc2LDMwIEBACiAJCQkvKiBzbXAtPnJldHVybl9wYXRoIHNldCB3aGVuIHJlY2VpdmVkICovCiAJCQlzbXAtPmhvcF9wdHIrKzsKIAkJCXJldHVybiAobm9kZV90eXBlID09IFJETUFfTk9ERV9JQl9TV0lUQ0ggfHwKLQkJCQlzbXAtPmRyX2RsaWQgPT0gSUJfTElEX1BFUk1JU1NJVkUpOworCQkJCXNtcC0+ZHJfZGxpZCA9PSBJQl9MSURfUEVSTUlTU0lWRSA/CisJCQkJSUJfU01JX0hBTkRMRSA6IElCX1NNSV9ESVNDQVJEKTsKIAkJfQogCiAJCS8qIEMxNC05OjQgLS0gaG9wX3B0ciA9IGhvcF9jbnQgKyAxIC0+IGdpdmUgdG8gU01BL1NNICovCiAJCS8qIEMxNC05OjUgLS0gRmFpbCB1bnJlYXNvbmFibGUgaG9wIHBvaW50ZXIgKi8KLQkJcmV0dXJuIChob3BfcHRyID09IGhvcF9jbnQgKyAxKTsKKwkJcmV0dXJuIChob3BfcHRyID09IGhvcF9jbnQgKyAxID8gSUJfU01JX0hBTkRMRSA6IElCX1NNSV9ESVNDQVJEKTsKIAogCX0gZWxzZSB7CiAJCS8qIEMxNC0xMzoxICovCiAJCWlmIChob3BfY250ICYmIGhvcF9wdHIgPT0gaG9wX2NudCArIDEpIHsKIAkJCXNtcC0+aG9wX3B0ci0tOwogCQkJcmV0dXJuIChzbXAtPnJldHVybl9wYXRoW3NtcC0+aG9wX3B0cl0gPT0KLQkJCQlwb3J0X251bSk7CisJCQkJcG9ydF9udW0gPyBJQl9TTUlfSEFORExFIDogSUJfU01JX0RJU0NBUkQpOwogCQl9CiAKIAkJLyogQzE0LTEzOjIgKi8KIAkJaWYgKDIgPD0gaG9wX3B0ciAmJiBob3BfcHRyIDw9IGhvcF9jbnQpIHsKIAkJCWlmIChub2RlX3R5cGUgIT0gUkRNQV9OT0RFX0lCX1NXSVRDSCkKLQkJCQlyZXR1cm4gMDsKKwkJCQlyZXR1cm4gSUJfU01JX0RJU0NBUkQ7CiAKIAkJCXNtcC0+aG9wX3B0ci0tOwogCQkJcmV0dXJuIChzbXAtPnJldHVybl9wYXRoW3NtcC0+aG9wX3B0cl0gPT0KLQkJCQlwb3J0X251bSk7CisJCQkJcG9ydF9udW0gPyBJQl9TTUlfSEFORExFIDogSUJfU01JX0RJU0NBUkQpOwogCQl9CiAKIAkJLyogQzE0LTEzOjMgLS0gYXQgdGhlIGVuZCBvZiB0aGUgRFIgc2VnbWVudCBvZiBwYXRoICovCkBAIC0xMDgsMTUgKzEwNywxNiBAQAogCQkJc21wLT5ob3BfcHRyLS07CiAJCQkvKiBDMTQtMTM6MyAtLSBTTVBzIGRlc3RpbmVkIGZvciBTTSBzaG91bGRuJ3QgYmUgaGVyZSAqLwogCQkJcmV0dXJuIChub2RlX3R5cGUgPT0gUkRNQV9OT0RFX0lCX1NXSVRDSCB8fAotCQkJCXNtcC0+ZHJfc2xpZCA9PSBJQl9MSURfUEVSTUlTU0lWRSk7CisJCQkJc21wLT5kcl9zbGlkID09IElCX0xJRF9QRVJNSVNTSVZFID8KKwkJCQlJQl9TTUlfSEFORExFIDogSUJfU01JX0RJU0NBUkQpOwogCQl9CiAKIAkJLyogQzE0LTEzOjQgLS0gaG9wX3B0ciA9IDAgLT4gc2hvdWxkIGhhdmUgZ29uZSB0byBTTSAqLwogCQlpZiAoaG9wX3B0ciA9PSAwKQotCQkJcmV0dXJuIDE7CisJCQlyZXR1cm4gSUJfU01JX0hBTkRMRTsKIAogCQkvKiBDMTQtMTM6NSAtLSBDaGVjayBmb3IgdW5yZWFzb25hYmxlIGhvcCBwb2ludGVyICovCi0JCXJldHVybiAwOworCQlyZXR1cm4gSUJfU01JX0RJU0NBUkQ7CiAJfQogfQogCkBAIC0xMjQsMTAgKzEyNCw4IEBACiAgKiBBZGp1c3QgaW5mb3JtYXRpb24gZm9yIGEgcmVjZWl2ZWQgU01QCiAgKiBSZXR1cm4gMCBpZiB0aGUgU01QIHNob3VsZCBiZSBkcm9wcGVkCiAgKi8KLWludCBzbWlfaGFuZGxlX2RyX3NtcF9yZWN2KHN0cnVjdCBpYl9zbXAgKnNtcCwKLQkJCSAgIHU4IG5vZGVfdHlwZSwKLQkJCSAgIGludCBwb3J0X251bSwKLQkJCSAgIGludCBwaHlzX3BvcnRfY250KQorZW51bSBzbWlfYWN0aW9uIHNtaV9oYW5kbGVfZHJfc21wX3JlY3Yoc3RydWN0IGliX3NtcCAqc21wLCB1OCBub2RlX3R5cGUsCisJCQkJICAgICAgIGludCBwb3J0X251bSwgaW50IHBoeXNfcG9ydF9jbnQpCiB7CiAJdTggaG9wX3B0ciwgaG9wX2NudDsKIApAQCAtMTM4LDE2ICsxMzYsMTcgQEAKIAlpZiAoIWliX2dldF9zbXBfZGlyZWN0aW9uKHNtcCkpIHsKIAkJLyogQzE0LTk6MSAtLSBzZW5kZXIgc2hvdWxkIGhhdmUgaW5jcmVtZW50ZWQgaG9wX3B0ciAqLwogCQlpZiAoaG9wX2NudCAmJiBob3BfcHRyID09IDApCi0JCQlyZXR1cm4gMDsKKwkJCXJldHVybiBJQl9TTUlfRElTQ0FSRDsKIAogCQkvKiBDMTQtOToyIC0tIGludGVybWVkaWF0ZSBob3AgKi8KIAkJaWYgKGhvcF9wdHIgJiYgaG9wX3B0ciA8IGhvcF9jbnQpIHsKIAkJCWlmIChub2RlX3R5cGUgIT0gUkRNQV9OT0RFX0lCX1NXSVRDSCkKLQkJCQlyZXR1cm4gMDsKKwkJCQlyZXR1cm4gSUJfU01JX0RJU0NBUkQ7CiAKIAkJCXNtcC0+cmV0dXJuX3BhdGhbaG9wX3B0cl0gPSBwb3J0X251bTsKIAkJCS8qIHNtcC0+aG9wX3B0ciB1cGRhdGVkIHdoZW4gc2VuZGluZyAqLwotCQkJcmV0dXJuIChzbXAtPmluaXRpYWxfcGF0aFtob3BfcHRyKzFdIDw9IHBoeXNfcG9ydF9jbnQpOworCQkJcmV0dXJuIChzbXAtPmluaXRpYWxfcGF0aFtob3BfcHRyKzFdIDw9IHBoeXNfcG9ydF9jbnQgPworCQkJCUlCX1NNSV9IQU5ETEUgOiBJQl9TTUlfRElTQ0FSRCk7CiAJCX0KIAogCQkvKiBDMTQtOTozIC0tIFdlJ3JlIGF0IHRoZSBlbmQgb2YgdGhlIERSIHNlZ21lbnQgb2YgcGF0aCAqLwpAQCAtMTU3LDEyICsxNTYsMTMgQEAKIAkJCS8qIHNtcC0+aG9wX3B0ciB1cGRhdGVkIHdoZW4gc2VuZGluZyAqLwogCiAJCQlyZXR1cm4gKG5vZGVfdHlwZSA9PSBSRE1BX05PREVfSUJfU1dJVENIIHx8Ci0JCQkJc21wLT5kcl9kbGlkID09IElCX0xJRF9QRVJNSVNTSVZFKTsKKwkJCQlzbXAtPmRyX2RsaWQgPT0gSUJfTElEX1BFUk1JU1NJVkUgPworCQkJCUlCX1NNSV9IQU5ETEUgOiBJQl9TTUlfRElTQ0FSRCk7CiAJCX0KIAogCQkvKiBDMTQtOTo0IC0tIGhvcF9wdHIgPSBob3BfY250ICsgMSAtPiBnaXZlIHRvIFNNQS9TTSAqLwogCQkvKiBDMTQtOTo1IC0tIGZhaWwgdW5yZWFzb25hYmxlIGhvcCBwb2ludGVyICovCi0JCXJldHVybiAoaG9wX3B0ciA9PSBob3BfY250ICsgMSk7CisJCXJldHVybiAoaG9wX3B0ciA9PSBob3BfY250ICsgMSA/IElCX1NNSV9IQU5ETEUgOiBJQl9TTUlfRElTQ0FSRCk7CiAKIAl9IGVsc2UgewogCkBAIC0xNzAsMTYgKzE3MCwxNyBAQAogCQlpZiAoaG9wX2NudCAmJiBob3BfcHRyID09IGhvcF9jbnQgKyAxKSB7CiAJCQlzbXAtPmhvcF9wdHItLTsKIAkJCXJldHVybiAoc21wLT5yZXR1cm5fcGF0aFtzbXAtPmhvcF9wdHJdID09Ci0JCQkJcG9ydF9udW0pOworCQkJCXBvcnRfbnVtID8gSUJfU01JX0hBTkRMRSA6IElCX1NNSV9ESVNDQVJEKTsKIAkJfQogCiAJCS8qIEMxNC0xMzoyICovCiAJCWlmICgyIDw9IGhvcF9wdHIgJiYgaG9wX3B0ciA8PSBob3BfY250KSB7CiAJCQlpZiAobm9kZV90eXBlICE9IFJETUFfTk9ERV9JQl9TV0lUQ0gpCi0JCQkJcmV0dXJuIDA7CisJCQkJcmV0dXJuIElCX1NNSV9ESVNDQVJEOwogCiAJCQkvKiBzbXAtPmhvcF9wdHIgdXBkYXRlZCB3aGVuIHNlbmRpbmcgKi8KLQkJCXJldHVybiAoc21wLT5yZXR1cm5fcGF0aFtob3BfcHRyLTFdIDw9IHBoeXNfcG9ydF9jbnQpOworCQkJcmV0dXJuIChzbXAtPnJldHVybl9wYXRoW2hvcF9wdHItMV0gPD0gcGh5c19wb3J0X2NudCA/CisJCQkJSUJfU01JX0hBTkRMRSA6IElCX1NNSV9ESVNDQVJEKTsKIAkJfQogCiAJCS8qIEMxNC0xMzozIC0tIFdlJ3JlIGF0IHRoZSBlbmQgb2YgdGhlIERSIHNlZ21lbnQgb2YgcGF0aCAqLwpAQCAtMTg3LDIzICsxODgsMjAgQEAKIAkJCWlmIChzbXAtPmRyX3NsaWQgPT0gSUJfTElEX1BFUk1JU1NJVkUpIHsKIAkJCQkvKiBnaXZpbmcgU01QIHRvIFNNIC0gdXBkYXRlIGhvcF9wdHIgKi8KIAkJCQlzbXAtPmhvcF9wdHItLTsKLQkJCQlyZXR1cm4gMTsKKwkJCQlyZXR1cm4gSUJfU01JX0hBTkRMRTsKIAkJCX0KIAkJCS8qIHNtcC0+aG9wX3B0ciB1cGRhdGVkIHdoZW4gc2VuZGluZyAqLwotCQkJcmV0dXJuIChub2RlX3R5cGUgPT0gUkRNQV9OT0RFX0lCX1NXSVRDSCk7CisJCQlyZXR1cm4gKG5vZGVfdHlwZSA9PSBSRE1BX05PREVfSUJfU1dJVENIID8KKwkJCQlJQl9TTUlfSEFORExFOiBJQl9TTUlfRElTQ0FSRCk7CiAJCX0KIAogCQkvKiBDMTQtMTM6NCAtLSBob3BfcHRyID0gMCAtPiBnaXZlIHRvIFNNICovCiAJCS8qIEMxNC0xMzo1IC0tIENoZWNrIGZvciB1bnJlYXNvbmFibGUgaG9wIHBvaW50ZXIgKi8KLQkJcmV0dXJuIChob3BfcHRyID09IDApOworCQlyZXR1cm4gKGhvcF9wdHIgPT0gMCA/IElCX1NNSV9IQU5ETEUgOiBJQl9TTUlfRElTQ0FSRCk7CiAJfQogfQogCi0vKgotICogUmV0dXJuIDEgaWYgdGhlIHJlY2VpdmVkIERSIFNNUCBzaG91bGQgYmUgZm9yd2FyZGVkIHRvIHRoZSBzZW5kIHF1ZXVlCi0gKiBSZXR1cm4gMCBpZiB0aGUgU01QIHNob3VsZCBiZSBjb21wbGV0ZWQgdXAgdGhlIHN0YWNrCi0gKi8KLWludCBzbWlfY2hlY2tfZm9yd2FyZF9kcl9zbXAoc3RydWN0IGliX3NtcCAqc21wKQorZW51bSBzbWlfZm9yd2FyZF9hY3Rpb24gc21pX2NoZWNrX2ZvcndhcmRfZHJfc21wKHN0cnVjdCBpYl9zbXAgKnNtcCkKIHsKIAl1OCBob3BfcHRyLCBob3BfY250OwogCkBAIC0yMTMsMjMgKzIxMSwyNSBAQAogCWlmICghaWJfZ2V0X3NtcF9kaXJlY3Rpb24oc21wKSkgewogCQkvKiBDMTQtOToyIC0tIGludGVybWVkaWF0ZSBob3AgKi8KIAkJaWYgKGhvcF9wdHIgJiYgaG9wX3B0ciA8IGhvcF9jbnQpCi0JCQlyZXR1cm4gMTsKKwkJCXJldHVybiBJQl9TTUlfU0VORDsKIAogCQkvKiBDMTQtOTozIC0tIGF0IHRoZSBlbmQgb2YgdGhlIERSIHNlZ21lbnQgb2YgcGF0aCAqLwogCQlpZiAoaG9wX3B0ciA9PSBob3BfY250KQotCQkJcmV0dXJuIChzbXAtPmRyX2RsaWQgPT0gSUJfTElEX1BFUk1JU1NJVkUpOworCQkJcmV0dXJuIChzbXAtPmRyX2RsaWQgPT0gSUJfTElEX1BFUk1JU1NJVkUgPworCQkJCUlCX1NNSV9TRU5EIDogSUJfU01JX0xPQ0FMKTsKIAogCQkvKiBDMTQtOTo0IC0tIGhvcF9wdHIgPSBob3BfY250ICsgMSAtPiBnaXZlIHRvIFNNQS9TTSAqLwogCQlpZiAoaG9wX3B0ciA9PSBob3BfY250ICsgMSkKLQkJCXJldHVybiAxOworCQkJcmV0dXJuIElCX1NNSV9TRU5EOwogCX0gZWxzZSB7Ci0JCS8qIEMxNC0xMzoyICovCisJCS8qIEMxNC0xMzoyICAtLSBpbnRlcm1lZGlhdGUgaG9wICovCiAJCWlmICgyIDw9IGhvcF9wdHIgJiYgaG9wX3B0ciA8PSBob3BfY250KQotCQkJcmV0dXJuIDE7CisJCQlyZXR1cm4gSUJfU01JX1NFTkQ7CiAKIAkJLyogQzE0LTEzOjMgLS0gYXQgdGhlIGVuZCBvZiB0aGUgRFIgc2VnbWVudCBvZiBwYXRoICovCiAJCWlmIChob3BfcHRyID09IDEpCi0JCQlyZXR1cm4gKHNtcC0+ZHJfc2xpZCAhPSBJQl9MSURfUEVSTUlTU0lWRSk7CisJCQlyZXR1cm4gKHNtcC0+ZHJfc2xpZCAhPSBJQl9MSURfUEVSTUlTU0lWRSA/CisJCQkJSUJfU01JX1NFTkQgOiBJQl9TTUlfTE9DQUwpOwogCX0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gSUJfU01JX0xPQ0FMOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvc21pLmggYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9zbWkuaAppbmRleCAzMDExYmZkLi45YTRiMzQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9zbWkuaAorKysgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9zbWkuaApAQCAtMyw3ICszLDcgQEAKICAqIENvcHlyaWdodCAoYykgMjAwNCBJbmZpbmljb24gQ29ycG9yYXRpb24uICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogQ29weXJpZ2h0IChjKSAyMDA0IEludGVsIENvcnBvcmF0aW9uLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIENvcHlyaWdodCAoYykgMjAwNCBUb3BzcGluIENvcnBvcmF0aW9uLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIENvcHlyaWdodCAoYykgMjAwNCBWb2x0YWlyZSBDb3Jwb3JhdGlvbi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNyBWb2x0YWlyZSBDb3Jwb3JhdGlvbi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KICAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKQEAgLTMzLDcgKzMzLDYgQEAKICAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKICAqIFNPRlRXQVJFLgogICoKLSAqICRJZDogc21pLmggMTM4OSAyMDA0LTEyLTI3IDIyOjU2OjQ3WiByb2xhbmQgJAogICovCiAKICNpZm5kZWYgX19TTUlfSF8KQEAgLTQxLDI2ICs0MCwzMyBAQAogCiAjaW5jbHVkZSA8cmRtYS9pYl9zbWkuaD4KIAotaW50IHNtaV9oYW5kbGVfZHJfc21wX3JlY3Yoc3RydWN0IGliX3NtcCAqc21wLAotCQkJICAgdTggbm9kZV90eXBlLAotCQkJICAgaW50IHBvcnRfbnVtLAotCQkJICAgaW50IHBoeXNfcG9ydF9jbnQpOwotZXh0ZXJuIGludCBzbWlfY2hlY2tfZm9yd2FyZF9kcl9zbXAoc3RydWN0IGliX3NtcCAqc21wKTsKLWV4dGVybiBpbnQgc21pX2hhbmRsZV9kcl9zbXBfc2VuZChzdHJ1Y3QgaWJfc21wICpzbXAsCi0JCQkJICB1OCBub2RlX3R5cGUsCi0JCQkJICBpbnQgcG9ydF9udW0pOworZW51bSBzbWlfYWN0aW9uIHsKKwlJQl9TTUlfRElTQ0FSRCwKKwlJQl9TTUlfSEFORExFCit9OworCitlbnVtIHNtaV9mb3J3YXJkX2FjdGlvbiB7CisJSUJfU01JX0xPQ0FMLAkvKiBTTVAgc2hvdWxkIGJlIGNvbXBsZXRlZCB1cCB0aGUgc3RhY2sgKi8KKwlJQl9TTUlfU0VORCwJLyogcmVjZWl2ZWQgRFIgU01QIHNob3VsZCBiZSBmb3J3YXJkZWQgdG8gdGhlIHNlbmQgcXVldWUgKi8KK307CisKK2VudW0gc21pX2FjdGlvbiBzbWlfaGFuZGxlX2RyX3NtcF9yZWN2KHN0cnVjdCBpYl9zbXAgKnNtcCwgdTggbm9kZV90eXBlLAorCQkJCSAgICAgICBpbnQgcG9ydF9udW0sIGludCBwaHlzX3BvcnRfY250KTsKK2V4dGVybiBlbnVtIHNtaV9mb3J3YXJkX2FjdGlvbiBzbWlfY2hlY2tfZm9yd2FyZF9kcl9zbXAoc3RydWN0IGliX3NtcCAqc21wKTsKK2V4dGVybiBlbnVtIHNtaV9hY3Rpb24gc21pX2hhbmRsZV9kcl9zbXBfc2VuZChzdHJ1Y3QgaWJfc21wICpzbXAsCisJCQkJCSAgICAgIHU4IG5vZGVfdHlwZSwgaW50IHBvcnRfbnVtKTsKIAogLyoKICAqIFJldHVybiAxIGlmIHRoZSBTTVAgc2hvdWxkIGJlIGhhbmRsZWQgYnkgdGhlIGxvY2FsIFNNQS9TTSB2aWEgcHJvY2Vzc19tYWQKICAqLwotc3RhdGljIGlubGluZSBpbnQgc21pX2NoZWNrX2xvY2FsX3NtcChzdHJ1Y3QgaWJfc21wICpzbXAsCi0JCQkJICAgICAgc3RydWN0IGliX2RldmljZSAqZGV2aWNlKQorc3RhdGljIGlubGluZSBlbnVtIHNtaV9hY3Rpb24gc21pX2NoZWNrX2xvY2FsX3NtcChzdHJ1Y3QgaWJfc21wICpzbXAsCisJCQkJCQkgIHN0cnVjdCBpYl9kZXZpY2UgKmRldmljZSkKIHsKIAkvKiBDMTQtOTozIC0tIFdlJ3JlIGF0IHRoZSBlbmQgb2YgdGhlIERSIHNlZ21lbnQgb2YgcGF0aCAqLwogCS8qIEMxNC05OjQgLS0gSG9wIFBvaW50ZXIgPSBIb3AgQ291bnQgKyAxIC0+IGdpdmUgdG8gU01BL1NNICovCiAJcmV0dXJuICgoZGV2aWNlLT5wcm9jZXNzX21hZCAmJgogCQkhaWJfZ2V0X3NtcF9kaXJlY3Rpb24oc21wKSAmJgotCQkoc21wLT5ob3BfcHRyID09IHNtcC0+aG9wX2NudCArIDEpKSk7CisJCShzbXAtPmhvcF9wdHIgPT0gc21wLT5ob3BfY250ICsgMSkpID8KKwkJSUJfU01JX0hBTkRMRSA6IElCX1NNSV9ESVNDQVJEKTsKIH0KLQogI2VuZGlmCS8qIF9fU01JX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9zeXNmcy5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvc3lzZnMuYwppbmRleCAwMDBjMDg2Li4wOGMyOTllIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9zeXNmcy5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3N5c2ZzLmMKQEAgLTY4Myw2ICs2ODMsNyBAQAogCiAJY2xhc3NfZGV2LT5jbGFzcyAgICAgID0gJmliX2NsYXNzOwogCWNsYXNzX2Rldi0+Y2xhc3NfZGF0YSA9IGRldmljZTsKKwljbGFzc19kZXYtPmRldgkgICAgICA9IGRldmljZS0+ZG1hX2RldmljZTsKIAlzdHJsY3B5KGNsYXNzX2Rldi0+Y2xhc3NfaWQsIGRldmljZS0+bmFtZSwgQlVTX0lEX1NJWkUpOwogCiAJSU5JVF9MSVNUX0hFQUQoJmRldmljZS0+cG9ydF9saXN0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3VjbS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdWNtLmMKaW5kZXggZWU1MWQ3OS4uMjU4NmEzZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdWNtLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdWNtLmMKQEAgLTQwNywyOSArNDA3LDE4IEBACiAKIAltdXRleF9sb2NrKCZmaWxlLT5maWxlX211dGV4KTsKIAl3aGlsZSAobGlzdF9lbXB0eSgmZmlsZS0+ZXZlbnRzKSkgewotCi0JCWlmIChmaWxlLT5maWxwLT5mX2ZsYWdzICYgT19OT05CTE9DSykgewotCQkJcmVzdWx0ID0gLUVBR0FJTjsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7Ci0JCQlyZXN1bHQgPSAtRVJFU1RBUlRTWVM7Ci0JCQlicmVhazsKLQkJfQotCi0JCXByZXBhcmVfdG9fd2FpdCgmZmlsZS0+cG9sbF93YWl0LCAmd2FpdCwgVEFTS19JTlRFUlJVUFRJQkxFKTsKLQogCQltdXRleF91bmxvY2soJmZpbGUtPmZpbGVfbXV0ZXgpOwotCQlzY2hlZHVsZSgpOworCisJCWlmIChmaWxlLT5maWxwLT5mX2ZsYWdzICYgT19OT05CTE9DSykKKwkJCXJldHVybiAtRUFHQUlOOworCisJCWlmICh3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoZmlsZS0+cG9sbF93YWl0LAorCQkJCQkgICAgICFsaXN0X2VtcHR5KCZmaWxlLT5ldmVudHMpKSkKKwkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisKIAkJbXV0ZXhfbG9jaygmZmlsZS0+ZmlsZV9tdXRleCk7Ci0KLQkJZmluaXNoX3dhaXQoJmZpbGUtPnBvbGxfd2FpdCwgJndhaXQpOwogCX0KIAotCWlmIChyZXN1bHQpCi0JCWdvdG8gZG9uZTsKLQogCXVldmVudCA9IGxpc3RfZW50cnkoZmlsZS0+ZXZlbnRzLm5leHQsIHN0cnVjdCBpYl91Y21fZXZlbnQsIGZpbGVfbGlzdCk7CiAKIAlpZiAoaWJfdWNtX25ld19jbV9pZCh1ZXZlbnQtPnJlc3AuZXZlbnQpKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91Y21hLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91Y21hLmMKaW5kZXggYzg1OTEzNC4uNTNiNGM5NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdWNtYS5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3VjbWEuYwpAQCAtMzA2LDI1ICszMDYsMTcgQEAKIAogCW11dGV4X2xvY2soJmZpbGUtPm11dCk7CiAJd2hpbGUgKGxpc3RfZW1wdHkoJmZpbGUtPmV2ZW50X2xpc3QpKSB7Ci0JCWlmIChmaWxlLT5maWxwLT5mX2ZsYWdzICYgT19OT05CTE9DSykgewotCQkJcmV0ID0gLUVBR0FJTjsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7Ci0JCQlyZXQgPSAtRVJFU1RBUlRTWVM7Ci0JCQlicmVhazsKLQkJfQotCi0JCXByZXBhcmVfdG9fd2FpdCgmZmlsZS0+cG9sbF93YWl0LCAmd2FpdCwgVEFTS19JTlRFUlJVUFRJQkxFKTsKIAkJbXV0ZXhfdW5sb2NrKCZmaWxlLT5tdXQpOwotCQlzY2hlZHVsZSgpOwotCQltdXRleF9sb2NrKCZmaWxlLT5tdXQpOwotCQlmaW5pc2hfd2FpdCgmZmlsZS0+cG9sbF93YWl0LCAmd2FpdCk7Ci0JfQogCi0JaWYgKHJldCkKLQkJZ290byBkb25lOworCQlpZiAoZmlsZS0+ZmlscC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spCisJCQlyZXR1cm4gLUVBR0FJTjsKKworCQlpZiAod2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGZpbGUtPnBvbGxfd2FpdCwKKwkJCQkJICAgICAhbGlzdF9lbXB0eSgmZmlsZS0+ZXZlbnRfbGlzdCkpKQorCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKworCQltdXRleF9sb2NrKCZmaWxlLT5tdXQpOworCX0KIAogCXVldmVudCA9IGxpc3RfZW50cnkoZmlsZS0+ZXZlbnRfbGlzdC5uZXh0LCBzdHJ1Y3QgdWNtYV9ldmVudCwgbGlzdCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3VzZXJfbWFkLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91c2VyX21hZC5jCmluZGV4IGMwNjllYmViLi44MTk5YjgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91c2VyX21hZC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3VzZXJfbWFkLmMKQEAgLTEzNSw3ICsxMzUsNyBAQAogCiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHBvcnRfbG9jayk7CiBzdGF0aWMgc3RydWN0IGliX3VtYWRfcG9ydCAqdW1hZF9wb3J0W0lCX1VNQURfTUFYX1BPUlRTXTsKLXN0YXRpYyBERUNMQVJFX0JJVE1BUChkZXZfbWFwLCBJQl9VTUFEX01BWF9QT1JUUyAqIDIpOworc3RhdGljIERFQ0xBUkVfQklUTUFQKGRldl9tYXAsIElCX1VNQURfTUFYX1BPUlRTKTsKIAogc3RhdGljIHZvaWQgaWJfdW1hZF9hZGRfb25lKHN0cnVjdCBpYl9kZXZpY2UgKmRldmljZSk7CiBzdGF0aWMgdm9pZCBpYl91bWFkX3JlbW92ZV9vbmUoc3RydWN0IGliX2RldmljZSAqZGV2aWNlKTsKQEAgLTIzMSwxMiArMjMxLDE3IEBACiAJcGFja2V0LT5tYWQuaGRyLnBhdGhfYml0cyA9IG1hZF9yZWN2X3djLT53Yy0+ZGxpZF9wYXRoX2JpdHM7CiAJcGFja2V0LT5tYWQuaGRyLmdyaF9wcmVzZW50ID0gISEobWFkX3JlY3Zfd2MtPndjLT53Y19mbGFncyAmIElCX1dDX0dSSCk7CiAJaWYgKHBhY2tldC0+bWFkLmhkci5ncmhfcHJlc2VudCkgewotCQkvKiBYWFggcGFyc2UgR1JIICovCi0JCXBhY2tldC0+bWFkLmhkci5naWRfaW5kZXggCT0gMDsKLQkJcGFja2V0LT5tYWQuaGRyLmhvcF9saW1pdCAJPSAwOwotCQlwYWNrZXQtPm1hZC5oZHIudHJhZmZpY19jbGFzcwk9IDA7Ci0JCW1lbXNldChwYWNrZXQtPm1hZC5oZHIuZ2lkLCAwLCAxNik7Ci0JCXBhY2tldC0+bWFkLmhkci5mbG93X2xhYmVsCT0gMDsKKwkJc3RydWN0IGliX2FoX2F0dHIgYWhfYXR0cjsKKworCQlpYl9pbml0X2FoX2Zyb21fd2MoYWdlbnQtPmRldmljZSwgYWdlbnQtPnBvcnRfbnVtLAorCQkJCSAgIG1hZF9yZWN2X3djLT53YywgbWFkX3JlY3Zfd2MtPnJlY3ZfYnVmLmdyaCwKKwkJCQkgICAmYWhfYXR0cik7CisKKwkJcGFja2V0LT5tYWQuaGRyLmdpZF9pbmRleCA9IGFoX2F0dHIuZ3JoLnNnaWRfaW5kZXg7CisJCXBhY2tldC0+bWFkLmhkci5ob3BfbGltaXQgPSBhaF9hdHRyLmdyaC5ob3BfbGltaXQ7CisJCXBhY2tldC0+bWFkLmhkci50cmFmZmljX2NsYXNzID0gYWhfYXR0ci5ncmgudHJhZmZpY19jbGFzczsKKwkJbWVtY3B5KHBhY2tldC0+bWFkLmhkci5naWQsICZhaF9hdHRyLmdyaC5kZ2lkLCAxNik7CisJCXBhY2tldC0+bWFkLmhkci5mbG93X2xhYmVsID0gY3B1X3RvX2JlMzIoYWhfYXR0ci5ncmguZmxvd19sYWJlbCk7CiAJfQogCiAJaWYgKHF1ZXVlX3BhY2tldChmaWxlLCBhZ2VudCwgcGFja2V0KSkKQEAgLTQ3Myw2ICs0NzgsNyBAQAogCWlmIChwYWNrZXQtPm1hZC5oZHIuZ3JoX3ByZXNlbnQpIHsKIAkJYWhfYXR0ci5haF9mbGFncyA9IElCX0FIX0dSSDsKIAkJbWVtY3B5KGFoX2F0dHIuZ3JoLmRnaWQucmF3LCBwYWNrZXQtPm1hZC5oZHIuZ2lkLCAxNik7CisJCWFoX2F0dHIuZ3JoLnNnaWRfaW5kZXgJICAgPSBwYWNrZXQtPm1hZC5oZHIuZ2lkX2luZGV4OwogCQlhaF9hdHRyLmdyaC5mbG93X2xhYmVsIAkgICA9IGJlMzJfdG9fY3B1KHBhY2tldC0+bWFkLmhkci5mbG93X2xhYmVsKTsKIAkJYWhfYXR0ci5ncmguaG9wX2xpbWl0ICAJICAgPSBwYWNrZXQtPm1hZC5oZHIuaG9wX2xpbWl0OwogCQlhaF9hdHRyLmdyaC50cmFmZmljX2NsYXNzICA9IHBhY2tldC0+bWFkLmhkci50cmFmZmljX2NsYXNzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2Ftc28xMTAwL2MyLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvYW1zbzExMDAvYzIuYwppbmRleCA1OTI0M2Q5Li41OGJjMjcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvYW1zbzExMDAvYzIuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvYW1zbzExMDAvYzIuYwpAQCAtNDM5LDcgKzQzOSw4IEBACiAJfQogCiAJLyogU2V0dXAgdGhlIHNrYiBmb3IgcmV1c2Ugc2luY2Ugd2UncmUgZHJvcHBpbmcgdGhpcyBwa3QgKi8KLQllbGVtLT5za2ItPnRhaWwgPSBlbGVtLT5za2ItPmRhdGEgPSBlbGVtLT5za2ItPmhlYWQ7CisJZWxlbS0+c2tiLT5kYXRhID0gZWxlbS0+c2tiLT5oZWFkOworCXNrYl9yZXNldF90YWlsX3BvaW50ZXIoZWxlbS0+c2tiKTsKIAogCS8qIFplcm8gb3V0IHRoZSByeHAgaGRyIGluIHRoZSBza19idWZmICovCiAJbWVtc2V0KGVsZW0tPnNrYi0+ZGF0YSwgMCwgc2l6ZW9mKCpyeHBfaGRyKSk7CkBAIC01MjEsOSArNTIyLDggQEAKIAkJICogInNpemVvZihzdHJ1Y3QgYzJfcnhwX2hkcikiLgogCQkgKi8KIAkJc2tiLT5kYXRhICs9IHNpemVvZigqcnhwX2hkcik7Ci0JCXNrYi0+dGFpbCA9IHNrYi0+ZGF0YSArIGJ1ZmxlbjsKKwkJc2tiX3NldF90YWlsX3BvaW50ZXIoc2tiLCBidWZsZW4pOwogCQlza2ItPmxlbiA9IGJ1ZmxlbjsKLQkJc2tiLT5kZXYgPSBuZXRkZXY7CiAJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIG5ldGRldik7CiAKIAkJbmV0aWZfcngoc2tiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9hbXNvMTEwMC9jMl9wcm92aWRlci5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2Ftc28xMTAwL2MyX3Byb3ZpZGVyLmMKaW5kZXggZmVmOTcyNy4uNjA3YzA5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2Ftc28xMTAwL2MyX3Byb3ZpZGVyLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2Ftc28xMTAwL2MyX3Byb3ZpZGVyLmMKQEAgLTc5Niw3ICs3OTYsNiBAQAogCW1lbWNweSgmZGV2LT5pYmRldi5ub2RlX2d1aWQsIGRldi0+cHNldWRvX25ldGRldi0+ZGV2X2FkZHIsIDYpOwogCWRldi0+aWJkZXYucGh5c19wb3J0X2NudCA9IDE7CiAJZGV2LT5pYmRldi5kbWFfZGV2aWNlID0gJmRldi0+cGNpZGV2LT5kZXY7Ci0JZGV2LT5pYmRldi5jbGFzc19kZXYuZGV2ID0gJmRldi0+cGNpZGV2LT5kZXY7CiAJZGV2LT5pYmRldi5xdWVyeV9kZXZpY2UgPSBjMl9xdWVyeV9kZXZpY2U7CiAJZGV2LT5pYmRldi5xdWVyeV9wb3J0ID0gYzJfcXVlcnlfcG9ydDsKIAlkZXYtPmliZGV2Lm1vZGlmeV9wb3J0ID0gYzJfbW9kaWZ5X3BvcnQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjMvaXdjaF9jbS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2IzL2l3Y2hfY20uYwppbmRleCAyZDJkZTliLi4zYjRiMGFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjMvaXdjaF9jbS5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiMy9pd2NoX2NtLmMKQEAgLTQ3Nyw3ICs0NzcsNyBAQAogCUJVR19PTihza2JfY2xvbmVkKHNrYikpOwogCiAJbXBhbGVuID0gc2l6ZW9mKCptcGEpICsgZXAtPnBsZW47Ci0JaWYgKHNrYi0+ZGF0YSArIG1wYWxlbiArIHNpemVvZigqcmVxKSA+IHNrYi0+ZW5kKSB7CisJaWYgKHNrYi0+ZGF0YSArIG1wYWxlbiArIHNpemVvZigqcmVxKSA+IHNrYl9lbmRfcG9pbnRlcihza2IpKSB7CiAJCWtmcmVlX3NrYihza2IpOwogCQlza2I9YWxsb2Nfc2tiKG1wYWxlbiArIHNpemVvZigqcmVxKSwgR0ZQX0tFUk5FTCk7CiAJCWlmICghc2tiKSB7CkBAIC01MDcsNyArNTA3LDcgQEAKIAkgKi8KIAlza2JfZ2V0KHNrYik7CiAJc2V0X2FycF9mYWlsdXJlX2hhbmRsZXIoc2tiLCBhcnBfZmFpbHVyZV9kaXNjYXJkKTsKLQlza2ItPmgucmF3ID0gc2tiLT5kYXRhOworCXNrYl9yZXNldF90cmFuc3BvcnRfaGVhZGVyKHNrYik7CiAJbGVuID0gc2tiLT5sZW47CiAJcmVxID0gKHN0cnVjdCB0eF9kYXRhX3dyICopIHNrYl9wdXNoKHNrYiwgc2l6ZW9mKCpyZXEpKTsKIAlyZXEtPndyX2hpID0gaHRvbmwoVl9XUl9PUChGV19XUk9QQ09ERV9PRkxEX1RYX0RBVEEpKTsKQEAgLTU1OSw3ICs1NTksNyBAQAogCXNrYl9nZXQoc2tiKTsKIAlza2ItPnByaW9yaXR5ID0gQ1BMX1BSSU9SSVRZX0RBVEE7CiAJc2V0X2FycF9mYWlsdXJlX2hhbmRsZXIoc2tiLCBhcnBfZmFpbHVyZV9kaXNjYXJkKTsKLQlza2ItPmgucmF3ID0gc2tiLT5kYXRhOworCXNrYl9yZXNldF90cmFuc3BvcnRfaGVhZGVyKHNrYik7CiAJcmVxID0gKHN0cnVjdCB0eF9kYXRhX3dyICopIHNrYl9wdXNoKHNrYiwgc2l6ZW9mKCpyZXEpKTsKIAlyZXEtPndyX2hpID0gaHRvbmwoVl9XUl9PUChGV19XUk9QQ09ERV9PRkxEX1RYX0RBVEEpKTsKIAlyZXEtPndyX2xvID0gaHRvbmwoVl9XUl9USUQoZXAtPmh3dGlkKSk7CkBAIC02MTAsNyArNjEwLDcgQEAKIAkgKi8KIAlza2JfZ2V0KHNrYik7CiAJc2V0X2FycF9mYWlsdXJlX2hhbmRsZXIoc2tiLCBhcnBfZmFpbHVyZV9kaXNjYXJkKTsKLQlza2ItPmgucmF3ID0gc2tiLT5kYXRhOworCXNrYl9yZXNldF90cmFuc3BvcnRfaGVhZGVyKHNrYik7CiAJbGVuID0gc2tiLT5sZW47CiAJcmVxID0gKHN0cnVjdCB0eF9kYXRhX3dyICopIHNrYl9wdXNoKHNrYiwgc2l6ZW9mKCpyZXEpKTsKIAlyZXEtPndyX2hpID0gaHRvbmwoVl9XUl9PUChGV19XUk9QQ09ERV9PRkxEX1RYX0RBVEEpKTsKQEAgLTgyMSw3ICs4MjEsOCBAQAogCS8qCiAJICogY29weSB0aGUgbmV3IGRhdGEgaW50byBvdXIgYWNjdW11bGF0aW9uIGJ1ZmZlci4KIAkgKi8KLQltZW1jcHkoJihlcC0+bXBhX3BrdFtlcC0+bXBhX3BrdF9sZW5dKSwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsICYoZXAtPm1wYV9wa3RbZXAtPm1wYV9wa3RfbGVuXSksCisJCQkJICBza2ItPmxlbik7CiAJZXAtPm1wYV9wa3RfbGVuICs9IHNrYi0+bGVuOwogCiAJLyoKQEAgLTk0MCw3ICs5NDEsOCBAQAogCS8qCiAJICogQ29weSB0aGUgbmV3IGRhdGEgaW50byBvdXIgYWNjdW11bGF0aW9uIGJ1ZmZlci4KIAkgKi8KLQltZW1jcHkoJihlcC0+bXBhX3BrdFtlcC0+bXBhX3BrdF9sZW5dKSwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsICYoZXAtPm1wYV9wa3RbZXAtPm1wYV9wa3RfbGVuXSksCisJCQkJICBza2ItPmxlbik7CiAJZXAtPm1wYV9wa3RfbGVuICs9IHNrYi0+bGVuOwogCiAJLyoKQEAgLTE2MTksNyArMTYyMSw4IEBACiAJUERCRygiJXMgZXAgJXBcbiIsIF9fRlVOQ1RJT05fXywgZXApOwogCXNrYl9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCBjcGxfcmRtYV90ZXJtaW5hdGUpKTsKIAlQREJHKCIlcyBzYXZpbmcgJWQgYnl0ZXMgb2YgdGVybSBtc2dcbiIsIF9fRlVOQ1RJT05fXywgc2tiLT5sZW4pOwotCW1lbWNweShlcC0+Y29tLnFwLT5hdHRyLnRlcm1pbmF0ZV9idWZmZXIsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCBlcC0+Y29tLnFwLT5hdHRyLnRlcm1pbmF0ZV9idWZmZXIsCisJCQkJICBza2ItPmxlbik7CiAJZXAtPmNvbS5xcC0+YXR0ci50ZXJtaW5hdGVfbXNnX2xlbiA9IHNrYi0+bGVuOwogCWVwLT5jb20ucXAtPmF0dHIuaXNfdGVybWluYXRlX2xvY2FsID0gMDsKIAlyZXR1cm4gQ1BMX1JFVF9CVUZfRE9ORTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiMy9pd2NoX3Byb3ZpZGVyLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjMvaXdjaF9wcm92aWRlci5jCmluZGV4IDI0ZTBkZjAuLmFmMjhhMzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiMy9pd2NoX3Byb3ZpZGVyLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2IzL2l3Y2hfcHJvdmlkZXIuYwpAQCAtMTEwOCw3ICsxMTA4LDYgQEAKIAltZW1jcHkoZGV2LT5pYmRldi5ub2RlX2Rlc2MsIElXQ0hfTk9ERV9ERVNDLCBzaXplb2YoSVdDSF9OT0RFX0RFU0MpKTsKIAlkZXYtPmliZGV2LnBoeXNfcG9ydF9jbnQgPSBkZXYtPnJkZXYucG9ydF9pbmZvLm5wb3J0czsKIAlkZXYtPmliZGV2LmRtYV9kZXZpY2UgPSAmKGRldi0+cmRldi5ybmljX2luZm8ucGRldi0+ZGV2KTsKLQlkZXYtPmliZGV2LmNsYXNzX2Rldi5kZXYgPSAmKGRldi0+cmRldi5ybmljX2luZm8ucGRldi0+ZGV2KTsKIAlkZXYtPmliZGV2LnF1ZXJ5X2RldmljZSA9IGl3Y2hfcXVlcnlfZGV2aWNlOwogCWRldi0+aWJkZXYucXVlcnlfcG9ydCA9IGl3Y2hfcXVlcnlfcG9ydDsKIAlkZXYtPmliZGV2Lm1vZGlmeV9wb3J0ID0gaXdjaF9tb2RpZnlfcG9ydDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2VoY2FfY2xhc3Nlcy5oIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2VoY2EvZWhjYV9jbGFzc2VzLmgKaW5kZXggODJkZWQ0NC4uMTBmYjhmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2VoY2EvZWhjYV9jbGFzc2VzLmgKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2VoY2EvZWhjYV9jbGFzc2VzLmgKQEAgLTEwNiw2ICsxMDYsNyBAQAogCXN0cnVjdCBlaGNhX21yICptYXhtcjsKIAlzdHJ1Y3QgZWhjYV9wZCAqcGQ7CiAJc3RydWN0IGhfZ2FscGFzIGdhbHBhczsKKwlzdHJ1Y3QgbXV0ZXggbW9kaWZ5X211dGV4OwogfTsKIAogc3RydWN0IGVoY2FfcGQgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2VoY2EvZWhjYV9oY2EuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2VoY2FfaGNhLmMKaW5kZXggMzBlYjQ1ZC4uMzJiNTVhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2VoY2EvZWhjYV9oY2EuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9laGNhX2hjYS5jCkBAIC0xNDcsNiArMTQ3LDcgQEAKIAkJYnJlYWs7CiAJfQogCisJcHJvcHMtPnBvcnRfY2FwX2ZsYWdzICA9IHJibG9jay0+Y2FwYWJpbGl0eV9tYXNrOwogCXByb3BzLT5naWRfdGJsX2xlbiAgICAgPSByYmxvY2stPmdpZF90YmxfbGVuOwogCXByb3BzLT5tYXhfbXNnX3N6ICAgICAgPSByYmxvY2stPm1heF9tc2dfc3o7CiAJcHJvcHMtPmJhZF9wa2V5X2NudHIgICA9IHJibG9jay0+YmFkX3BrZXlfY250cjsKQEAgLTIzNiwxMCArMjM3LDYwIEBACiAJcmV0dXJuIHJldDsKIH0KIAorY29uc3QgdTMyIGFsbG93ZWRfcG9ydF9jYXBzID0gKAorCUlCX1BPUlRfU00gfCBJQl9QT1JUX0xFRF9JTkZPX1NVUCB8IElCX1BPUlRfQ01fU1VQIHwKKwlJQl9QT1JUX1NOTVBfVFVOTkVMX1NVUCB8IElCX1BPUlRfREVWSUNFX01HTVRfU1VQIHwKKwlJQl9QT1JUX1ZFTkRPUl9DTEFTU19TVVApOworCiBpbnQgZWhjYV9tb2RpZnlfcG9ydChzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiwKIAkJICAgICB1OCBwb3J0LCBpbnQgcG9ydF9tb2RpZnlfbWFzaywKIAkJICAgICBzdHJ1Y3QgaWJfcG9ydF9tb2RpZnkgKnByb3BzKQogewotCS8qIE5vdCBpbXBsZW1lbnRlZCB5ZXQgKi8KLQlyZXR1cm4gLUVGQVVMVDsKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgZWhjYV9zaGNhICpzaGNhID0gY29udGFpbmVyX29mKGliZGV2LCBzdHJ1Y3QgZWhjYV9zaGNhLCBpYl9kZXZpY2UpOworCXN0cnVjdCBoaXB6X3F1ZXJ5X3BvcnQgKnJibG9jazsKKwl1MzIgY2FwOworCXU2NCBocmV0OworCisJaWYgKChwcm9wcy0+c2V0X3BvcnRfY2FwX21hc2sgfCBwcm9wcy0+Y2xyX3BvcnRfY2FwX21hc2spCisJICAgICYgfmFsbG93ZWRfcG9ydF9jYXBzKSB7CisJCWVoY2FfZXJyKCZzaGNhLT5pYl9kZXZpY2UsICJOb24tY2hhbmdlYWJsZSBiaXRzIHNldCBpbiBtYXNrcyAgIgorCQkJICJzZXQ9JXggIGNscj0leCAgYWxsb3dlZD0leCIsIHByb3BzLT5zZXRfcG9ydF9jYXBfbWFzaywKKwkJCSBwcm9wcy0+Y2xyX3BvcnRfY2FwX21hc2ssIGFsbG93ZWRfcG9ydF9jYXBzKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmc2hjYS0+bW9kaWZ5X211dGV4KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVSRVNUQVJUU1lTOworCisJcmJsb2NrID0gZWhjYV9hbGxvY19md19jdHJsYmxvY2soR0ZQX0tFUk5FTCk7CisJaWYgKCFyYmxvY2spIHsKKwkJZWhjYV9lcnIoJnNoY2EtPmliX2RldmljZSwgICJDYW4ndCBhbGxvY2F0ZSByYmxvY2sgbWVtb3J5LiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG1vZGlmeV9wb3J0MTsKKwl9CisKKwlpZiAoaGlwel9oX3F1ZXJ5X3BvcnQoc2hjYS0+aXB6X2hjYV9oYW5kbGUsIHBvcnQsIHJibG9jaykgIT0gSF9TVUNDRVNTKSB7CisJCWVoY2FfZXJyKCZzaGNhLT5pYl9kZXZpY2UsICJDYW4ndCBxdWVyeSBwb3J0IHByb3BlcnRpZXMiKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBtb2RpZnlfcG9ydDI7CisJfQorCisJY2FwID0gKHJibG9jay0+Y2FwYWJpbGl0eV9tYXNrIHwgcHJvcHMtPnNldF9wb3J0X2NhcF9tYXNrKQorCQkmIH5wcm9wcy0+Y2xyX3BvcnRfY2FwX21hc2s7CisKKwlocmV0ID0gaGlwel9oX21vZGlmeV9wb3J0KHNoY2EtPmlwel9oY2FfaGFuZGxlLCBwb3J0LAorCQkJCSAgY2FwLCBwcm9wcy0+aW5pdF90eXBlLCBwb3J0X21vZGlmeV9tYXNrKTsKKwlpZiAoaHJldCAhPSBIX1NVQ0NFU1MpIHsKKwkJZWhjYV9lcnIoJnNoY2EtPmliX2RldmljZSwgIk1vZGlmeSBwb3J0IGZhaWxlZCAgaHJldD0lbHgiLCBocmV0KTsKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisKK21vZGlmeV9wb3J0MjoKKwllaGNhX2ZyZWVfZndfY3RybGJsb2NrKHJibG9jayk7CisKK21vZGlmeV9wb3J0MToKKyAgICAgICAgbXV0ZXhfdW5sb2NrKCZzaGNhLT5tb2RpZnlfbXV0ZXgpOworCisJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2VoY2FfbWFpbi5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2VoY2EvZWhjYV9tYWluLmMKaW5kZXggMDU5ZGE5Ni4uNDcwMDA4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2VoY2EvZWhjYV9tYWluLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2VoY2EvZWhjYV9tYWluLmMKQEAgLTU2NSwxMSArNTY1LDExIEBACiAJCQkJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqaWQpCiB7CiAJc3RydWN0IGVoY2Ffc2hjYSAqc2hjYTsKLQl1NjQgKmhhbmRsZTsKKwljb25zdCB1NjQgKmhhbmRsZTsKIAlzdHJ1Y3QgaWJfcGQgKmlicGQ7CiAJaW50IHJldDsKIAotCWhhbmRsZSA9ICh1NjQgKilnZXRfcHJvcGVydHkoZGV2LT5vZmRldi5ub2RlLCAiaWJtLGhjYS1oYW5kbGUiLCBOVUxMKTsKKwloYW5kbGUgPSBnZXRfcHJvcGVydHkoZGV2LT5vZmRldi5ub2RlLCAiaWJtLGhjYS1oYW5kbGUiLCBOVUxMKTsKIAlpZiAoIWhhbmRsZSkgewogCQllaGNhX2dlbl9lcnIoIkNhbm5vdCBnZXQgZUhDQSBoYW5kbGUgZm9yIGFkYXB0ZXI6ICVzLiIsCiAJCQkgICAgIGRldi0+b2ZkZXYubm9kZS0+ZnVsbF9uYW1lKTsKQEAgLTU4Nyw2ICs1ODcsNyBAQAogCQllaGNhX2dlbl9lcnIoIkNhbm5vdCBhbGxvY2F0ZSBzaGNhIG1lbW9yeS4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQorCW11dGV4X2luaXQoJnNoY2EtPm1vZGlmeV9tdXRleCk7CiAKIAlzaGNhLT5pYm1lYnVzX2RldiA9IGRldjsKIAlzaGNhLT5pcHpfaGNhX2hhbmRsZS5oYW5kbGUgPSAqaGFuZGxlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2VoY2EvaGNwX2lmLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9oY3BfaWYuYwppbmRleCAzZmI0NmU2Li5iNTY0ZmNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9oY3BfaWYuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9oY3BfaWYuYwpAQCAtNzAsNiArNzAsMTAgQEAKICNkZWZpbmUgSF9BTExfUkVTX1FQX1NRVUVVRV9TSVpFX1BBR0VTICBFSENBX0JNQVNLX0lCTSgwLCAzMSkKICNkZWZpbmUgSF9BTExfUkVTX1FQX1JRVUVVRV9TSVpFX1BBR0VTICBFSENBX0JNQVNLX0lCTSgzMiwgNjMpCiAKKyNkZWZpbmUgSF9NUF9JTklUX1RZUEUgICAgICAgICAgICAgICAgICBFSENBX0JNQVNLX0lCTSg0NCwgNDcpCisjZGVmaW5lIEhfTVBfU0hVVERPV04gICAgICAgICAgICAgICAgICAgRUhDQV9CTUFTS19JQk0oNDgsIDQ4KQorI2RlZmluZSBIX01QX1JFU0VUX1FLRVlfQ1RSICAgICAgICAgICAgIEVIQ0FfQk1BU0tfSUJNKDQ5LCA0OSkKKwogLyogZGlyZWN0IGFjY2VzcyBxcCBjb250cm9scyAqLwogI2RlZmluZSBEQVFQX0NUUkxfRU5BQkxFICAgIDB4MDEKICNkZWZpbmUgREFRUF9DVFJMX1NFTkRfQ09NUCAweDIwCkBAIC0zNjQsNiArMzY4LDI2IEBACiAJcmV0dXJuIHJldDsKIH0KIAordTY0IGhpcHpfaF9tb2RpZnlfcG9ydChjb25zdCBzdHJ1Y3QgaXB6X2FkYXB0ZXJfaGFuZGxlIGFkYXB0ZXJfaGFuZGxlLAorCQkgICAgICAgY29uc3QgdTggcG9ydF9pZCwgY29uc3QgdTMyIHBvcnRfY2FwLAorCQkgICAgICAgY29uc3QgdTggaW5pdF90eXBlLCBjb25zdCBpbnQgbW9kaWZ5X21hc2spCit7CisJdTY0IHBvcnRfYXR0cmlidXRlcyA9IHBvcnRfY2FwOworCisJaWYgKG1vZGlmeV9tYXNrICYgSUJfUE9SVF9TSFVURE9XTikKKwkJcG9ydF9hdHRyaWJ1dGVzIHw9IEVIQ0FfQk1BU0tfU0VUKEhfTVBfU0hVVERPV04sIDEpOworCWlmIChtb2RpZnlfbWFzayAmIElCX1BPUlRfSU5JVF9UWVBFKQorCQlwb3J0X2F0dHJpYnV0ZXMgfD0gRUhDQV9CTUFTS19TRVQoSF9NUF9JTklUX1RZUEUsIGluaXRfdHlwZSk7CisJaWYgKG1vZGlmeV9tYXNrICYgSUJfUE9SVF9SRVNFVF9RS0VZX0NOVFIpCisJCXBvcnRfYXR0cmlidXRlcyB8PSBFSENBX0JNQVNLX1NFVChIX01QX1JFU0VUX1FLRVlfQ1RSLCAxKTsKKworCXJldHVybiBlaGNhX3BscGFyX2hjYWxsX25vcmV0cyhIX01PRElGWV9QT1JULAorCQkJCSAgICAgICBhZGFwdGVyX2hhbmRsZS5oYW5kbGUsIC8qIHI0ICovCisJCQkJICAgICAgIHBvcnRfaWQsICAgICAgICAgICAgICAgLyogcjUgKi8KKwkJCQkgICAgICAgcG9ydF9hdHRyaWJ1dGVzLCAgICAgICAvKiByNiAqLworCQkJCSAgICAgICAwLCAwLCAwLCAwKTsKK30KKwogdTY0IGhpcHpfaF9xdWVyeV9oY2EoY29uc3Qgc3RydWN0IGlwel9hZGFwdGVyX2hhbmRsZSBhZGFwdGVyX2hhbmRsZSwKIAkJICAgICBzdHJ1Y3QgaGlwel9xdWVyeV9oY2EgKnF1ZXJ5X2hjYV9yYmxvY2spCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9oY3BfaWYuaCBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2hjcF9pZi5oCmluZGV4IDU4N2ViZDQuLjI4NjlmN2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2hjcF9pZi5oCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2hjcF9pZi5oCkBAIC04NSw2ICs4NSwxMCBAQAogCQkgICAgICBjb25zdCB1OCBwb3J0X2lkLAogCQkgICAgICBzdHJ1Y3QgaGlwel9xdWVyeV9wb3J0ICpxdWVyeV9wb3J0X3Jlc3BvbnNlX2Jsb2NrKTsKIAordTY0IGhpcHpfaF9tb2RpZnlfcG9ydChjb25zdCBzdHJ1Y3QgaXB6X2FkYXB0ZXJfaGFuZGxlIGFkYXB0ZXJfaGFuZGxlLAorCQkgICAgICAgY29uc3QgdTggcG9ydF9pZCwgY29uc3QgdTMyIHBvcnRfY2FwLAorCQkgICAgICAgY29uc3QgdTggaW5pdF90eXBlLCBjb25zdCBpbnQgbW9kaWZ5X21hc2spOworCiB1NjQgaGlwel9oX3F1ZXJ5X2hjYShjb25zdCBzdHJ1Y3QgaXB6X2FkYXB0ZXJfaGFuZGxlIGFkYXB0ZXJfaGFuZGxlLAogCQkgICAgIHN0cnVjdCBoaXB6X3F1ZXJ5X2hjYSAqcXVlcnlfaGNhX3JibG9jayk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9jb21tb24uaCBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9jb21tb24uaAppbmRleCA1NDEzOWQzLi4xMGMwMDhmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfY29tbW9uLmgKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2NvbW1vbi5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNiBRTG9naWMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBRTG9naWMgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYgUGF0aFNjYWxlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KQEAgLTc4LDYgKzc4LDggQEAKICNkZWZpbmUgSVBBVEhfSUJfTElOS0lOSVQJCTMKICNkZWZpbmUgSVBBVEhfSUJfTElOS0RPV05fU0xFRVAJCTQKICNkZWZpbmUgSVBBVEhfSUJfTElOS0RPV05fRElTQUJMRQk1CisjZGVmaW5lIElQQVRIX0lCX0xJTktfTE9PUEJBQ0sJNiAvKiBlbmFibGUgbG9jYWwgbG9vcGJhY2sgKi8KKyNkZWZpbmUgSVBBVEhfSUJfTElOS19FWFRFUk5BTAk3IC8qIG5vcm1hbCwgZGlzYWJsZSBsb2NhbCBsb29wYmFjayAqLwogCiAvKgogICogc3RhdHMgbWFpbnRhaW5lZCBieSB0aGUgZHJpdmVyLiAgRm9yIG5vdywgYXQgbGVhc3QsIHRoaXMgaXMgZ2xvYmFsCkBAIC0zMTYsMTEgKzMxOCwxNyBAQAogCS8qIGFkZHJlc3Mgb2YgcmVhZG9ubHkgbWVtb3J5IGNvcHkgb2YgdGhlIHJjdmhkcnEgdGFpbCByZWdpc3Rlci4gKi8KIAlfX3U2NCBzcGlfcmN2aGRyX3RhaWxhZGRyOwogCi0JLyogc2hhcmVkIG1lbW9yeSBwYWdlcyBmb3Igc3VicG9ydHMgaWYgSVBBVEhfUlVOVElNRV9NQVNURVIgaXMgc2V0ICovCisJLyogc2hhcmVkIG1lbW9yeSBwYWdlcyBmb3Igc3VicG9ydHMgaWYgcG9ydCBpcyBzaGFyZWQgKi8KIAlfX3U2NCBzcGlfc3VicG9ydF91cmVnYmFzZTsKIAlfX3U2NCBzcGlfc3VicG9ydF9yY3ZlZ3JidWY7CiAJX191NjQgc3BpX3N1YnBvcnRfcmN2aGRyX2Jhc2U7CiAKKwkvKiBzaGFyZWQgbWVtb3J5IHBhZ2UgZm9yIGhhcmR3YXJlIHBvcnQgaWYgaXQgaXMgc2hhcmVkICovCisJX191NjQgc3BpX3BvcnRfdXJlZ2Jhc2U7CisJX191NjQgc3BpX3BvcnRfcmN2ZWdyYnVmOworCV9fdTY0IHNwaV9wb3J0X3Jjdmhkcl9iYXNlOworCV9fdTY0IHNwaV9wb3J0X3Jjdmhkcl90YWlsYWRkcjsKKwogfSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCg4KSkpOwogCiAKQEAgLTM0NCw3ICszNTIsNyBAQAogICogbWF5IG5vdCBiZSBpbXBsZW1lbnRlZDsgdGhlIHVzZXIgY29kZSBtdXN0IGRlYWwgd2l0aCB0aGlzIGlmIGl0CiAgKiBjYXJlcywgb3IgaXQgbXVzdCBhYm9ydCBhZnRlciBpbml0aWFsaXphdGlvbiByZXBvcnRzIHRoZSBkaWZmZXJlbmNlLgogICovCi0jZGVmaW5lIElQQVRIX1VTRVJfU1dNSU5PUiAzCisjZGVmaW5lIElQQVRIX1VTRVJfU1dNSU5PUiA1CiAKICNkZWZpbmUgSVBBVEhfVVNFUl9TV1ZFUlNJT04gKChJUEFUSF9VU0VSX1NXTUFKT1I8PDE2KSB8IElQQVRIX1VTRVJfU1dNSU5PUikKIApAQCAtNDE4LDExICs0MjYsMTQgQEAKICNkZWZpbmUgSVBBVEhfQ01EX1RJRF9VUERBVEUJMTkJLyogdXBkYXRlIGV4cGVjdGVkIFRJRCBlbnRyaWVzICovCiAjZGVmaW5lIElQQVRIX0NNRF9USURfRlJFRQkyMAkvKiBmcmVlIGV4cGVjdGVkIFRJRCBlbnRyaWVzICovCiAjZGVmaW5lIElQQVRIX0NNRF9TRVRfUEFSVF9LRVkJMjEJLyogYWRkIHBhcnRpdGlvbiBrZXkgKi8KLSNkZWZpbmUgSVBBVEhfQ01EX1NMQVZFX0lORk8JMjIJLyogcmV0dXJuIGluZm8gb24gc2xhdmUgcHJvY2Vzc2VzICovCisjZGVmaW5lIF9fSVBBVEhfQ01EX1NMQVZFX0lORk8JMjIJLyogcmV0dXJuIGluZm8gb24gc2xhdmUgcHJvY2Vzc2VzIChmb3Igb2xkIHVzZXIgY29kZSkgKi8KICNkZWZpbmUgSVBBVEhfQ01EX0FTU0lHTl9QT1JUCTIzCS8qIGFsbG9jYXRlIEhDQSBhbmQgcG9ydCAqLwogI2RlZmluZSBJUEFUSF9DTURfVVNFUl9JTklUIAkyNAkvKiBzZXQgdXAgdXNlcnNwYWNlICovCisjZGVmaW5lIElQQVRIX0NNRF9VTlVTRURfMQkyNQorI2RlZmluZSBJUEFUSF9DTURfVU5VU0VEXzIJMjYKKyNkZWZpbmUgSVBBVEhfQ01EX1BJT0FWQUlMVVBECTI3CS8qIGZvcmNlIGFuIHVwZGF0ZSBvZiBQSU9BdmFpbCByZWcgKi8KIAotI2RlZmluZSBJUEFUSF9DTURfTUFYCQkyNAorI2RlZmluZSBJUEFUSF9DTURfTUFYCQkyNwogCiBzdHJ1Y3QgaXBhdGhfcG9ydF9pbmZvIHsKIAlfX3UzMiBudW1fYWN0aXZlOwkvKiBudW1iZXIgb2YgYWN0aXZlIHVuaXRzICovCkBAIC00MzAsNyArNDQxLDcgQEAKIAlfX3UxNiBwb3J0OwkJLyogcG9ydCBvbiB1bml0IGFzc2lnbmVkIHRvIGNhbGxlciAqLwogCV9fdTE2IHN1YnBvcnQ7CQkvKiBzdWJwb3J0IG9uIHVuaXQgYXNzaWduZWQgdG8gY2FsbGVyICovCiAJX191MTYgbnVtX3BvcnRzOwkvKiBudW1iZXIgb2YgcG9ydHMgYXZhaWxhYmxlIG9uIHVuaXQgKi8KLQlfX3UxNiBudW1fc3VicG9ydHM7CS8qIG51bWJlciBvZiBzdWJwb3J0IHNsYXZlcyBvcGVuZWQgb24gcG9ydCAqLworCV9fdTE2IG51bV9zdWJwb3J0czsJLyogbnVtYmVyIG9mIHN1YnBvcnRzIG9wZW5lZCBvbiBwb3J0ICovCiB9OwogCiBzdHJ1Y3QgaXBhdGhfdGlkX2luZm8gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2NxLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfY3EuYwppbmRleCA4NzQ2MmUwLi5lYTc4ZTZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfY3EuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfY3EuYwpAQCAtNzYsNyArNzYsMjAgQEAKIAkJfQogCQlyZXR1cm47CiAJfQotCXdjLT5xdWV1ZVtoZWFkXSA9ICplbnRyeTsKKwl3Yy0+cXVldWVbaGVhZF0ud3JfaWQgPSBlbnRyeS0+d3JfaWQ7CisJd2MtPnF1ZXVlW2hlYWRdLnN0YXR1cyA9IGVudHJ5LT5zdGF0dXM7CisJd2MtPnF1ZXVlW2hlYWRdLm9wY29kZSA9IGVudHJ5LT5vcGNvZGU7CisJd2MtPnF1ZXVlW2hlYWRdLnZlbmRvcl9lcnIgPSBlbnRyeS0+dmVuZG9yX2VycjsKKwl3Yy0+cXVldWVbaGVhZF0uYnl0ZV9sZW4gPSBlbnRyeS0+Ynl0ZV9sZW47CisJd2MtPnF1ZXVlW2hlYWRdLmltbV9kYXRhID0gKF9fdTMyIF9fZm9yY2UpZW50cnktPmltbV9kYXRhOworCXdjLT5xdWV1ZVtoZWFkXS5xcF9udW0gPSBlbnRyeS0+cXAtPnFwX251bTsKKwl3Yy0+cXVldWVbaGVhZF0uc3JjX3FwID0gZW50cnktPnNyY19xcDsKKwl3Yy0+cXVldWVbaGVhZF0ud2NfZmxhZ3MgPSBlbnRyeS0+d2NfZmxhZ3M7CisJd2MtPnF1ZXVlW2hlYWRdLnBrZXlfaW5kZXggPSBlbnRyeS0+cGtleV9pbmRleDsKKwl3Yy0+cXVldWVbaGVhZF0uc2xpZCA9IGVudHJ5LT5zbGlkOworCXdjLT5xdWV1ZVtoZWFkXS5zbCA9IGVudHJ5LT5zbDsKKwl3Yy0+cXVldWVbaGVhZF0uZGxpZF9wYXRoX2JpdHMgPSBlbnRyeS0+ZGxpZF9wYXRoX2JpdHM7CisJd2MtPnF1ZXVlW2hlYWRdLnBvcnRfbnVtID0gZW50cnktPnBvcnRfbnVtOwogCXdjLT5oZWFkID0gbmV4dDsKIAogCWlmIChjcS0+bm90aWZ5ID09IElCX0NRX05FWFRfQ09NUCB8fApAQCAtMTIyLDkgKzEzNSwzMCBAQAogCWlmICh0YWlsID4gKHUzMikgY3EtPmliY3EuY3FlKQogCQl0YWlsID0gKHUzMikgY3EtPmliY3EuY3FlOwogCWZvciAobnBvbGxlZCA9IDA7IG5wb2xsZWQgPCBudW1fZW50cmllczsgKytucG9sbGVkLCArK2VudHJ5KSB7CisJCXN0cnVjdCBpcGF0aF9xcCAqcXA7CisKIAkJaWYgKHRhaWwgPT0gd2MtPmhlYWQpCiAJCQlicmVhazsKLQkJKmVudHJ5ID0gd2MtPnF1ZXVlW3RhaWxdOworCisJCXFwID0gaXBhdGhfbG9va3VwX3FwbigmdG9faWRldihjcS0+aWJjcS5kZXZpY2UpLT5xcF90YWJsZSwKKwkJCQkgICAgICB3Yy0+cXVldWVbdGFpbF0ucXBfbnVtKTsKKwkJZW50cnktPnFwID0gJnFwLT5pYnFwOworCQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmcXAtPnJlZmNvdW50KSkKKwkJCXdha2VfdXAoJnFwLT53YWl0KTsKKworCQllbnRyeS0+d3JfaWQgPSB3Yy0+cXVldWVbdGFpbF0ud3JfaWQ7CisJCWVudHJ5LT5zdGF0dXMgPSB3Yy0+cXVldWVbdGFpbF0uc3RhdHVzOworCQllbnRyeS0+b3Bjb2RlID0gd2MtPnF1ZXVlW3RhaWxdLm9wY29kZTsKKwkJZW50cnktPnZlbmRvcl9lcnIgPSB3Yy0+cXVldWVbdGFpbF0udmVuZG9yX2VycjsKKwkJZW50cnktPmJ5dGVfbGVuID0gd2MtPnF1ZXVlW3RhaWxdLmJ5dGVfbGVuOworCQllbnRyeS0+aW1tX2RhdGEgPSB3Yy0+cXVldWVbdGFpbF0uaW1tX2RhdGE7CisJCWVudHJ5LT5zcmNfcXAgPSB3Yy0+cXVldWVbdGFpbF0uc3JjX3FwOworCQllbnRyeS0+d2NfZmxhZ3MgPSB3Yy0+cXVldWVbdGFpbF0ud2NfZmxhZ3M7CisJCWVudHJ5LT5wa2V5X2luZGV4ID0gd2MtPnF1ZXVlW3RhaWxdLnBrZXlfaW5kZXg7CisJCWVudHJ5LT5zbGlkID0gd2MtPnF1ZXVlW3RhaWxdLnNsaWQ7CisJCWVudHJ5LT5zbCA9IHdjLT5xdWV1ZVt0YWlsXS5zbDsKKwkJZW50cnktPmRsaWRfcGF0aF9iaXRzID0gd2MtPnF1ZXVlW3RhaWxdLmRsaWRfcGF0aF9iaXRzOworCQllbnRyeS0+cG9ydF9udW0gPSB3Yy0+cXVldWVbdGFpbF0ucG9ydF9udW07CiAJCWlmICh0YWlsID49IGNxLT5pYmNxLmNxZSkKIAkJCXRhaWwgPSAwOwogCQllbHNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfZGVidWcuaCBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9kZWJ1Zy5oCmluZGV4IGRmNjlmMGQ4Li40MmJmYmRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfZGVidWcuaAorKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfZGVidWcuaApAQCAtNTcsNiArNTcsNyBAQAogI2RlZmluZSBfX0lQQVRIX1BST0NEQkcgICAgIDB4MTAwCiAvKiBwcmludCBtbWFwL25vcGFnZSBzdHVmZiwgbm90IHVzaW5nIFZEQkcgYW55IG1vcmUgKi8KICNkZWZpbmUgX19JUEFUSF9NTURCRyAgICAgICAweDIwMAorI2RlZmluZSBfX0lQQVRIX0VSUlBLVERCRyAgIDB4NDAwCiAjZGVmaW5lIF9fSVBBVEhfVVNFUl9TRU5EICAgMHgxMDAwCS8qIHVzZSB1c2VyIG1vZGUgc2VuZCAqLwogI2RlZmluZSBfX0lQQVRIX0tFUk5FTF9TRU5EIDB4MjAwMAkvKiB1c2Uga2VybmVsIG1vZGUgc2VuZCAqLwogI2RlZmluZSBfX0lQQVRIX0VQS1REQkcgICAgIDB4NDAwMAkvKiBwcmludCBldGhlcm5ldCBwYWNrZXQgZGF0YSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2RpYWcuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9kaWFnLmMKaW5kZXggMGYxM2EyMS4uNjNlODM2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2RpYWcuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfZGlhZy5jCkBAIC0yOTYsNyArMjk2LDcgQEAKIAl9CiAKIAlmcC0+cHJpdmF0ZV9kYXRhID0gZGQ7Ci0JaXBhdGhfZGlhZ19pbnVzZSA9IDE7CisJaXBhdGhfZGlhZ19pbnVzZSA9IC0yOwogCWRpYWdfc2V0X2xpbmsgPSAwOwogCXJldCA9IDA7CiAKQEAgLTQ2MSw2ICs0NjEsOCBAQAogCWVsc2UgaWYgKChjb3VudCAlIDQpIHx8ICgqb2ZmICUgNCkpCiAJCS8qIGFkZHJlc3Mgb3IgbGVuZ3RoIGlzIG5vdCAzMi1iaXQgYWxpZ25lZCwgaGVuY2UgaW52YWxpZCAqLwogCQlyZXQgPSAtRUlOVkFMOworCWVsc2UgaWYgKGlwYXRoX2RpYWdfaW51c2UgPCAxICYmICgqb2ZmIHx8IGNvdW50ICE9IDgpKQorCQlyZXQgPSAtRUlOVkFMOyAgLyogcHJldmVudCBjYXQgL2Rldi9pcGF0aF9kaWFnKiAqLwogCWVsc2UgaWYgKChjb3VudCAlIDgpIHx8ICgqb2ZmICUgOCkpCiAJCS8qIGFkZHJlc3Mgb3IgbGVuZ3RoIG5vdCA2NC1iaXQgYWxpZ25lZDsgZG8gMzItYml0IHJlYWRzICovCiAJCXJldCA9IGlwYXRoX3JlYWRfdW1lbTMyKGRkLCBkYXRhLCBrcmVnX2Jhc2UgKyAqb2ZmLCBjb3VudCk7CkBAIC00NzAsNiArNDcyLDggQEAKIAlpZiAocmV0ID49IDApIHsKIAkJKm9mZiArPSBjb3VudDsKIAkJcmV0ID0gY291bnQ7CisJCWlmIChpcGF0aF9kaWFnX2ludXNlID09IC0yKQorCQkJaXBhdGhfZGlhZ19pbnVzZSsrOwogCX0KIAogCXJldHVybiByZXQ7CkBAIC00ODksNiArNDkzLDkgQEAKIAllbHNlIGlmICgoY291bnQgJSA0KSB8fCAoKm9mZiAlIDQpKQogCQkvKiBhZGRyZXNzIG9yIGxlbmd0aCBpcyBub3QgMzItYml0IGFsaWduZWQsIGhlbmNlIGludmFsaWQgKi8KIAkJcmV0ID0gLUVJTlZBTDsKKwllbHNlIGlmICgoaXBhdGhfZGlhZ19pbnVzZSA9PSAtMSAmJiAoKm9mZiB8fCBjb3VudCAhPSA4KSkgfHwKKwkJIGlwYXRoX2RpYWdfaW51c2UgPT0gLTIpICAvKiByZWFkIHF3IG9mZiAwLCB3cml0ZSBxdyBvZmYgMCAqLworCQlyZXQgPSAtRUlOVkFMOyAgLyogYmVmb3JlIGFueSBvdGhlciB3cml0ZSBhbGxvd2VkICovCiAJZWxzZSBpZiAoKGNvdW50ICUgOCkgfHwgKCpvZmYgJSA4KSkKIAkJLyogYWRkcmVzcyBvciBsZW5ndGggbm90IDY0LWJpdCBhbGlnbmVkOyBkbyAzMi1iaXQgd3JpdGVzICovCiAJCXJldCA9IGlwYXRoX3dyaXRlX3VtZW0zMihkZCwga3JlZ19iYXNlICsgKm9mZiwgZGF0YSwgY291bnQpOwpAQCAtNDk4LDYgKzUwNSw4IEBACiAJaWYgKHJldCA+PSAwKSB7CiAJCSpvZmYgKz0gY291bnQ7CiAJCXJldCA9IGNvdW50OworCQlpZiAoaXBhdGhfZGlhZ19pbnVzZSA9PSAtMSkKKwkJCWlwYXRoX2RpYWdfaW51c2UgPSAxOyAvKiBhbGwgcmVhZC93cml0ZSBPSyBub3cgKi8KIAl9CiAKIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2RyaXZlci5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2RyaXZlci5jCmluZGV4IGFlN2YyMWEuLmUzYTIyMzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9kcml2ZXIuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfZHJpdmVyLmMKQEAgLTM5MCwxNSArMzkwLDIzIEBACiAKIAkvKiBzZXR1cCB0aGUgY2hpcC1zcGVjaWZpYyBmdW5jdGlvbnMsIGFzIGVhcmx5IGFzIHBvc3NpYmxlLiAqLwogCXN3aXRjaCAoZW50LT5kZXZpY2UpIHsKLSNpZmRlZiBDT05GSUdfSFRfSVJRCiAJY2FzZSBQQ0lfREVWSUNFX0lEX0lORklOSVBBVEhfSFQ6CisjaWZkZWYgQ09ORklHX0hUX0lSUQogCQlpcGF0aF9pbml0X2liYTYxMTBfZnVuY3MoZGQpOwogCQlicmVhazsKKyNlbHNlCisJCWlwYXRoX2Rldl9lcnIoZGQsICJRTG9naWMgSFQgZGV2aWNlIDB4JXggY2Fubm90IHdvcmsgaWYgIgorCQkJICAgICAgIkNPTkZJR19IVF9JUlEgaXMgbm90IGVuYWJsZWRcbiIsIGVudC0+ZGV2aWNlKTsKKwkJcmV0dXJuIC1FTk9ERVY7CiAjZW5kaWYKLSNpZmRlZiBDT05GSUdfUENJX01TSQogCWNhc2UgUENJX0RFVklDRV9JRF9JTkZJTklQQVRIX1BFODAwOgorI2lmZGVmIENPTkZJR19QQ0lfTVNJCiAJCWlwYXRoX2luaXRfaWJhNjEyMF9mdW5jcyhkZCk7CiAJCWJyZWFrOworI2Vsc2UKKwkJaXBhdGhfZGV2X2VycihkZCwgIlFMb2dpYyBQQ0lFIGRldmljZSAweCV4IGNhbm5vdCB3b3JrIGlmICIKKwkJCSAgICAgICJDT05GSUdfUENJX01TSSBpcyBub3QgZW5hYmxlZFxuIiwgZW50LT5kZXZpY2UpOworCQlyZXR1cm4gLUVOT0RFVjsKICNlbmRpZgogCWRlZmF1bHQ6CiAJCWlwYXRoX2Rldl9lcnIoZGQsICJGb3VuZCB1bmtub3duIFFMb2dpYyBkZXZpY2VpZCAweCV4LCAiCkBAIC00ODYsNyArNDk0LDcgQEAKIAogCXJldCA9IGlwYXRoX2luaXRfY2hpcChkZCwgMCk7CS8qIGRvIHRoZSBjaGlwLXNwZWNpZmljIGluaXQgKi8KIAlpZiAocmV0KQotCQlnb3RvIGJhaWxfaW91bm1hcDsKKwkJZ290byBiYWlsX2lycXNldHVwOwogCiAJcmV0ID0gaXBhdGhfZW5hYmxlX3djKGRkKTsKIApAQCAtNTA1LDYgKzUxMyw5IEBACiAKIAlnb3RvIGJhaWw7CiAKK2JhaWxfaXJxc2V0dXA6CisJaWYgKHBkZXYtPmlycSkgZnJlZV9pcnEocGRldi0+aXJxLCBkZCk7CisKIGJhaWxfaW91bm1hcDoKIAlpb3VubWFwKCh2b2xhdGlsZSB2b2lkIF9faW9tZW0gKikgZGQtPmlwYXRoX2tyZWdiYXNlKTsKIApAQCAtNTI1LDggKzUzNiw2IEBACiB7CiAJaW50IHBvcnQ7CiAKLQlpcGF0aF9zaHV0ZG93bl9kZXZpY2UoZGQpOwotCiAJaWYgKCpkZC0+aXBhdGhfc3RhdHVzcCAmIElQQVRIX1NUQVRVU19DSElQX1BSRVNFTlQpIHsKIAkJLyogY2FuJ3QgZG8gYW55dGhpbmcgbW9yZSB3aXRoIGNoaXA7IG5lZWRzIHJlLWluaXQgKi8KIAkJKmRkLT5pcGF0aF9zdGF0dXNwICY9IH5JUEFUSF9TVEFUVVNfQ0hJUF9QUkVTRU5UOwpAQCAtNTk0LDggKzYwMyw5IEBACiAKIAkJaXBhdGhfY2RiZyhWRVJCT1NFLCAiRnJlZSBzaGFkb3cgcGFnZSB0aWQgYXJyYXkgYXQgJXBcbiIsCiAJCQkgICBkZC0+aXBhdGhfcGFnZXNoYWRvdyk7Ci0JCXZmcmVlKGRkLT5pcGF0aF9wYWdlc2hhZG93KTsKKwkJdG1wcCA9IGRkLT5pcGF0aF9wYWdlc2hhZG93OwogCQlkZC0+aXBhdGhfcGFnZXNoYWRvdyA9IE5VTEw7CisJCXZmcmVlKHRtcHApOwogCX0KIAogCS8qCkBAIC02MjIsNiArNjMyLDEyIEBACiAKIAlpcGF0aF9jZGJnKFZFUkJPU0UsICJyZW1vdmluZywgcGRldj0lcCwgZGQ9JXBcbiIsIHBkZXYsIGRkKTsKIAorCS8qCisJICogZGlzYWJsZSB0aGUgSUIgbGluayBlYXJseSwgdG8gYmUgc3VyZSBubyBuZXcgcGFja2V0cyBhcnJpdmUsIHdoaWNoCisJICogY29tcGxpY2F0ZXMgdGhlIHNodXRkb3duIHByb2Nlc3MKKwkgKi8KKwlpcGF0aF9zaHV0ZG93bl9kZXZpY2UoZGQpOworCiAJaWYgKGRkLT52ZXJic19kZXYpCiAJCWlwYXRoX3VucmVnaXN0ZXJfaWJfZGV2aWNlKGRkLT52ZXJic19kZXYpOwogCkBAIC03NTQsOSArNzcwLDQyIEBACiAJcmV0dXJuIChkZC0+aXBhdGhfZmxhZ3MgJiBzdGF0ZSkgPyAwIDogLUVUSU1FRE9VVDsKIH0KIAotdm9pZCBpcGF0aF9kZWNvZGVfZXJyKGNoYXIgKmJ1Ziwgc2l6ZV90IGJsZW4sIGlwYXRoX2Vycl90IGVycikKKy8qCisgKiBEZWNvZGUgdGhlIGVycm9yIHN0YXR1cyBpbnRvIHN0cmluZ3MsIGRlY2lkaW5nIHdoZXRoZXIgdG8gYWx3YXlzCisgKiBwcmludCAqIGl0IG9yIG5vdCBkZXBlbmRpbmcgb24gIm5vcm1hbCBwYWNrZXQgZXJyb3JzIiB2cyBldmVyeXRoaW5nCisgKiBlbHNlLiAgIFJldHVybiAxIGlmICJyZWFsIiBlcnJvcnMsIG90aGVyd2lzZSAwIGlmIG9ubHkgcGFja2V0CisgKiBlcnJvcnMsIHNvIGNhbGxlciBjYW4gZGVjaWRlIHdoYXQgdG8gcHJpbnQgd2l0aCB0aGUgc3RyaW5nLgorICovCitpbnQgaXBhdGhfZGVjb2RlX2VycihjaGFyICpidWYsIHNpemVfdCBibGVuLCBpcGF0aF9lcnJfdCBlcnIpCiB7CisJaW50IGlzZXJyID0gMTsKIAkqYnVmID0gJ1wwJzsKKwlpZiAoZXJyICYgSU5GSU5JUEFUSF9FX1BLVEVSUlMpIHsKKwkJaWYgKCEoZXJyICYgfklORklOSVBBVEhfRV9QS1RFUlJTKSkKKwkJCWlzZXJyID0gMDsgLy8gaWYgb25seSBwYWNrZXQgZXJyb3JzLgorCQlpZiAoaXBhdGhfZGVidWcgJiBfX0lQQVRIX0VSUlBLVERCRykgeworCQkJaWYgKGVyciAmIElORklOSVBBVEhfRV9SRUJQKQorCQkJCXN0cmxjYXQoYnVmLCAiRUJQICIsIGJsZW4pOworCQkJaWYgKGVyciAmIElORklOSVBBVEhfRV9SVkNSQykKKwkJCQlzdHJsY2F0KGJ1ZiwgIlZDUkMgIiwgYmxlbik7CisJCQlpZiAoZXJyICYgSU5GSU5JUEFUSF9FX1JJQ1JDKSB7CisJCQkJc3RybGNhdChidWYsICJDUkMgIiwgYmxlbik7CisJCQkJLy8gY2xlYXIgZm9yIGNoZWNrIGJlbG93LCBzbyBvbmx5IG9uY2UKKwkJCQllcnIgJj0gSU5GSU5JUEFUSF9FX1JJQ1JDOworCQkJfQorCQkJaWYgKGVyciAmIElORklOSVBBVEhfRV9SU0hPUlRQS1RMRU4pCisJCQkJc3RybGNhdChidWYsICJyc2hvcnRwa3RsZW4gIiwgYmxlbik7CisJCQlpZiAoZXJyICYgSU5GSU5JUEFUSF9FX1NEUk9QUEVEREFUQVBLVCkKKwkJCQlzdHJsY2F0KGJ1ZiwgInNkcm9wcGVkZGF0YXBrdCAiLCBibGVuKTsKKwkJCWlmIChlcnIgJiBJTkZJTklQQVRIX0VfU1BLVExFTikKKwkJCQlzdHJsY2F0KGJ1ZiwgInNwa3RsZW4gIiwgYmxlbik7CisJCX0KKwkJaWYgKChlcnIgJiBJTkZJTklQQVRIX0VfUklDUkMpICYmCisJCQkhKGVyciYoSU5GSU5JUEFUSF9FX1JWQ1JDfElORklOSVBBVEhfRV9SRUJQKSkpCisJCQlzdHJsY2F0KGJ1ZiwgIkNSQyAiLCBibGVuKTsKKwkJaWYgKCFpc2VycikKKwkJCWdvdG8gZG9uZTsKKwl9CiAJaWYgKGVyciAmIElORklOSVBBVEhfRV9SSERSTEVOKQogCQlzdHJsY2F0KGJ1ZiwgInJoZHJsZW4gIiwgYmxlbik7CiAJaWYgKGVyciAmIElORklOSVBBVEhfRV9SQkFEVElEKQpAQCAtNzY3LDEyICs4MTYsMTIgQEAKIAkJc3RybGNhdChidWYsICJyaGRyICIsIGJsZW4pOwogCWlmIChlcnIgJiBJTkZJTklQQVRIX0VfUkxPTkdQS1RMRU4pCiAJCXN0cmxjYXQoYnVmLCAicmxvbmdwa3RsZW4gIiwgYmxlbik7Ci0JaWYgKGVyciAmIElORklOSVBBVEhfRV9SU0hPUlRQS1RMRU4pCi0JCXN0cmxjYXQoYnVmLCAicnNob3J0cGt0bGVuICIsIGJsZW4pOwogCWlmIChlcnIgJiBJTkZJTklQQVRIX0VfUk1BWFBLVExFTikKIAkJc3RybGNhdChidWYsICJybWF4cGt0bGVuICIsIGJsZW4pOwogCWlmIChlcnIgJiBJTkZJTklQQVRIX0VfUk1JTlBLVExFTikKIAkJc3RybGNhdChidWYsICJybWlucGt0bGVuICIsIGJsZW4pOworCWlmIChlcnIgJiBJTkZJTklQQVRIX0VfU01JTlBLVExFTikKKwkJc3RybGNhdChidWYsICJzbWlucGt0bGVuICIsIGJsZW4pOwogCWlmIChlcnIgJiBJTkZJTklQQVRIX0VfUkZPUk1BVEVSUikKIAkJc3RybGNhdChidWYsICJyZm9ybWF0ZXJyICIsIGJsZW4pOwogCWlmIChlcnIgJiBJTkZJTklQQVRIX0VfUlVOU1VQVkwpCkBAIC03ODEsMzIgKzgzMCwyMCBAQAogCQlzdHJsY2F0KGJ1ZiwgInJ1bmV4cGNoYXIgIiwgYmxlbik7CiAJaWYgKGVyciAmIElORklOSVBBVEhfRV9SSUJGTE9XKQogCQlzdHJsY2F0KGJ1ZiwgInJpYmZsb3cgIiwgYmxlbik7Ci0JaWYgKGVyciAmIElORklOSVBBVEhfRV9SRUJQKQotCQlzdHJsY2F0KGJ1ZiwgIkVCUCAiLCBibGVuKTsKIAlpZiAoZXJyICYgSU5GSU5JUEFUSF9FX1NVTkRFUlJVTikKIAkJc3RybGNhdChidWYsICJzdW5kZXJydW4gIiwgYmxlbik7CiAJaWYgKGVyciAmIElORklOSVBBVEhfRV9TUElPQVJNTEFVTkNIKQogCQlzdHJsY2F0KGJ1ZiwgInNwaW9hcm1sYXVuY2ggIiwgYmxlbik7CiAJaWYgKGVyciAmIElORklOSVBBVEhfRV9TVU5FWFBFUlJQS1ROVU0pCiAJCXN0cmxjYXQoYnVmLCAic3VuZXhwZXJycGt0bnVtICIsIGJsZW4pOwotCWlmIChlcnIgJiBJTkZJTklQQVRIX0VfU0RST1BQRUREQVRBUEtUKQotCQlzdHJsY2F0KGJ1ZiwgInNkcm9wcGVkZGF0YXBrdCAiLCBibGVuKTsKIAlpZiAoZXJyICYgSU5GSU5JUEFUSF9FX1NEUk9QUEVEU01QUEtUKQogCQlzdHJsY2F0KGJ1ZiwgInNkcm9wcGVkc21wcGt0ICIsIGJsZW4pOwogCWlmIChlcnIgJiBJTkZJTklQQVRIX0VfU01BWFBLVExFTikKIAkJc3RybGNhdChidWYsICJzbWF4cGt0bGVuICIsIGJsZW4pOwotCWlmIChlcnIgJiBJTkZJTklQQVRIX0VfU01JTlBLVExFTikKLQkJc3RybGNhdChidWYsICJzbWlucGt0bGVuICIsIGJsZW4pOwogCWlmIChlcnIgJiBJTkZJTklQQVRIX0VfU1VOU1VQVkwpCiAJCXN0cmxjYXQoYnVmLCAic3Vuc3VwVkwgIiwgYmxlbik7Ci0JaWYgKGVyciAmIElORklOSVBBVEhfRV9TUEtUTEVOKQotCQlzdHJsY2F0KGJ1ZiwgInNwa3RsZW4gIiwgYmxlbik7CiAJaWYgKGVyciAmIElORklOSVBBVEhfRV9JTlZBTElEQUREUikKIAkJc3RybGNhdChidWYsICJpbnZhbGlkYWRkciAiLCBibGVuKTsKLQlpZiAoZXJyICYgSU5GSU5JUEFUSF9FX1JJQ1JDKQotCQlzdHJsY2F0KGJ1ZiwgIkNSQyAiLCBibGVuKTsKLQlpZiAoZXJyICYgSU5GSU5JUEFUSF9FX1JWQ1JDKQotCQlzdHJsY2F0KGJ1ZiwgIlZDUkMgIiwgYmxlbik7CiAJaWYgKGVyciAmIElORklOSVBBVEhfRV9SUkNWRUdSRlVMTCkKIAkJc3RybGNhdChidWYsICJyY3ZlZ3JmdWxsICIsIGJsZW4pOwogCWlmIChlcnIgJiBJTkZJTklQQVRIX0VfUlJDVkhEUkZVTEwpCkBAIC04MTksNiArODU2LDggQEAKIAkJc3RybGNhdChidWYsICJoYXJkd2FyZSAiLCBibGVuKTsKIAlpZiAoZXJyICYgSU5GSU5JUEFUSF9FX1JFU0VUKQogCQlzdHJsY2F0KGJ1ZiwgInJlc2V0ICIsIGJsZW4pOworZG9uZToKKwlyZXR1cm4gaXNlcnI7CiB9CiAKIC8qKgpAQCAtMTY2Miw2ICsxNzAxLDIyIEBACiAJCWxzdGF0ZSA9IElQQVRIX0xJTktBQ1RJVkU7CiAJCWJyZWFrOwogCisJY2FzZSBJUEFUSF9JQl9MSU5LX0xPT1BCQUNLOgorCQlkZXZfaW5mbygmZGQtPnBjaWRldi0+ZGV2LCAiRW5hYmxpbmcgSUIgbG9jYWwgbG9vcGJhY2tcbiIpOworCQlkZC0+aXBhdGhfaWJjY3RybCB8PSBJTkZJTklQQVRIX0lCQ0NfTE9PUEJBQ0s7CisJCWlwYXRoX3dyaXRlX2tyZWcoZGQsIGRkLT5pcGF0aF9rcmVncy0+a3JfaWJjY3RybCwKKwkJCQkgZGQtPmlwYXRoX2liY2N0cmwpOworCQlyZXQgPSAwOworCQlnb3RvIGJhaWw7IC8vIG5vIHN0YXRlIGNoYW5nZSB0byB3YWl0IGZvcgorCisJY2FzZSBJUEFUSF9JQl9MSU5LX0VYVEVSTkFMOgorCQlkZXZfaW5mbygmZGQtPnBjaWRldi0+ZGV2LCAiRGlzYWJsaW5nIElCIGxvY2FsIGxvb3BiYWNrIChub3JtYWwpXG4iKTsKKwkJZGQtPmlwYXRoX2liY2N0cmwgJj0gfklORklOSVBBVEhfSUJDQ19MT09QQkFDSzsKKwkJaXBhdGhfd3JpdGVfa3JlZyhkZCwgZGQtPmlwYXRoX2tyZWdzLT5rcl9pYmNjdHJsLAorCQkJCSBkZC0+aXBhdGhfaWJjY3RybCk7CisJCXJldCA9IDA7CisJCWdvdG8gYmFpbDsgLy8gbm8gc3RhdGUgY2hhbmdlIHRvIHdhaXQgZm9yCisKIAlkZWZhdWx0OgogCQlpcGF0aF9kYmcoIkludmFsaWQgbGlua3N0YXRlIDB4JXggcmVxdWVzdGVkXG4iLCBuZXdzdGF0ZSk7CiAJCXJldCA9IC1FSU5WQUw7CkBAIC0xNzY1LDI5ICsxODIwLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyoqCi0gKiBpcGF0aF9yZWFkX2tyZWc2NF9wb3J0IC0gcmVhZCBhIGRldmljZSdzIHBlci1wb3J0IDY0LWJpdCBrZXJuZWwgcmVnaXN0ZXIKLSAqIEBkZDogdGhlIGluZmluaXBhdGggZGV2aWNlCi0gKiBAcmVnbm86IHRoZSByZWdpc3RlciBudW1iZXIgdG8gcmVhZAotICogQHBvcnQ6IHRoZSBwb3J0IGNvbnRhaW5pbmcgdGhlIHJlZ2lzdGVyCi0gKgotICogUmVnaXN0ZXJzIHRoYXQgdmFyeSB3aXRoIHRoZSBjaGlwIGltcGxlbWVudGF0aW9uIGNvbnN0YW50cyAocG9ydCkKLSAqIHVzZSB0aGlzIHJvdXRpbmUuCi0gKi8KLXU2NCBpcGF0aF9yZWFkX2tyZWc2NF9wb3J0KGNvbnN0IHN0cnVjdCBpcGF0aF9kZXZkYXRhICpkZCwgaXBhdGhfa3JlZyByZWdubywKLQkJCSAgIHVuc2lnbmVkIHBvcnQpCi17Ci0JdTE2IHdoZXJlOwotCi0JaWYgKHBvcnQgPCBkZC0+aXBhdGhfcG9ydGNudCAmJgotCSAgICAocmVnbm8gPT0gZGQtPmlwYXRoX2tyZWdzLT5rcl9yY3ZoZHJhZGRyIHx8Ci0JICAgICByZWdubyA9PSBkZC0+aXBhdGhfa3JlZ3MtPmtyX3JjdmhkcnRhaWxhZGRyKSkKLQkJd2hlcmUgPSByZWdubyArIHBvcnQ7Ci0JZWxzZQotCQl3aGVyZSA9IC0xOwotCi0JcmV0dXJuIGlwYXRoX3JlYWRfa3JlZzY0KGRkLCB3aGVyZSk7Ci19CiAKIC8qKgogICogaXBhdGhfd3JpdGVfa3JlZ19wb3J0IC0gd3JpdGUgYSBkZXZpY2UncyBwZXItcG9ydCA2NC1iaXQga2VybmVsIHJlZ2lzdGVyCkBAIC0xOTczLDcgKzIwMDUsOCBAQAogewogCWludCByZXQ7CiAKLQlpcGF0aF9kYmcoS0VSTl9JTkZPIERSSVZFUl9MT0FEX01TRyAiJXMiLCBpYl9pcGF0aF92ZXJzaW9uKTsKKwlpZiAoaXBhdGhfZGVidWcgJiBfX0lQQVRIX0RCRykKKwkJcHJpbnRrKEtFUk5fSU5GTyBEUklWRVJfTE9BRF9NU0cgIiVzIiwgaWJfaXBhdGhfdmVyc2lvbik7CiAKIAkvKgogCSAqIFRoZXNlIG11c3QgYmUgY2FsbGVkIGJlZm9yZSB0aGUgZHJpdmVyIGlzIHJlZ2lzdGVyZWQgd2l0aApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2VlcHJvbS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2VlcHJvbS5jCmluZGV4IGE0MDE5YTYuLjAzMDE4NWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9lZXByb20uYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfZWVwcm9tLmMKQEAgLTYyNiw2ICs2MjYsMTAgQEAKIAl9IGVsc2UKIAkJbWVtY3B5KGRkLT5pcGF0aF9zZXJpYWwsIGlmcC0+aWZfc2VyaWFsLAogCQkgICAgICAgc2l6ZW9mIGlmcC0+aWZfc2VyaWFsKTsKKwlpZiAoIXN0cnN0cihpZnAtPmlmX2NvbW1lbnQsICJUZXN0ZWQgc3VjY2Vzc2Z1bGx5IikpCisJCWlwYXRoX2Rldl9lcnIoZGQsICJCb2FyZCBTTiAlcyBkaWQgbm90IHBhc3MgZnVuY3Rpb25hbCAiCisJCQkidGVzdDogJXNcbiIsIGRkLT5pcGF0aF9zZXJpYWwsCisJCQlpZnAtPmlmX2NvbW1lbnQpOwogCiAJaXBhdGhfY2RiZyhWRVJCT1NFLCAiSW5pdHRlZCBHVUlEIHRvICVsbHggZnJvbSBlZXByb21cbiIsCiAJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpIGJlNjRfdG9fY3B1KGRkLT5pcGF0aF9ndWlkKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfZmlsZV9vcHMuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9maWxlX29wcy5jCmluZGV4IDVkNjRmZjguLjEyNzJhYWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9maWxlX29wcy5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9maWxlX29wcy5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNiBRTG9naWMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBRTG9naWMgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYgUGF0aFNjYWxlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KQEAgLTQxLDEyICs0MSw2IEBACiAjaW5jbHVkZSAiaXBhdGhfa2VybmVsLmgiCiAjaW5jbHVkZSAiaXBhdGhfY29tbW9uLmgiCiAKLS8qCi0gKiBtbWFwNjQgZG9lc24ndCBhbGxvdyBhbGwgNjQgYml0cyBmb3IgMzItYml0IGFwcGxpY2F0aW9ucwotICogc28gb25seSB1c2UgdGhlIGxvdyA0MyBiaXRzLgotICovCi0jZGVmaW5lIE1NQVA2NF9NQVNLCTB4N0ZGRkZGRkZGRkZVTAotCiBzdGF0aWMgaW50IGlwYXRoX29wZW4oc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICopOwogc3RhdGljIGludCBpcGF0aF9jbG9zZShzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKik7CiBzdGF0aWMgc3NpemVfdCBpcGF0aF93cml0ZShzdHJ1Y3QgZmlsZSAqLCBjb25zdCBjaGFyIF9fdXNlciAqLCBzaXplX3QsCkBAIC02Myw2ICs1NywyNCBAQAogCS5tbWFwID0gaXBhdGhfbW1hcAogfTsKIAorLyoKKyAqIENvbnZlcnQga2VybmVsIHZpcnR1YWwgYWRkcmVzc2VzIHRvIHBoeXNpY2FsIGFkZHJlc3NlcyBzbyB0aGV5IGRvbid0CisgKiBwb3RlbnRpYWxseSBjb25mbGljdCB3aXRoIHRoZSBjaGlwIGFkZHJlc3NlcyB1c2VkIGFzIG1tYXAgb2Zmc2V0cy4KKyAqIEl0IGRvZXNuJ3QgcmVhbGx5IG1hdHRlciB3aGF0IG1tYXAgb2Zmc2V0IHdlIHVzZSBhcyBsb25nIGFzIHdlIGNhbgorICogaW50ZXJwcmV0IGl0IGNvcnJlY3RseS4KKyAqLworc3RhdGljIHU2NCBjdnRfa3ZhZGRyKHZvaWQgKnApCit7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJdTY0IHBhZGRyID0gMDsKKworCXBhZ2UgPSB2bWFsbG9jX3RvX3BhZ2UocCk7CisJaWYgKHBhZ2UpCisJCXBhZGRyID0gcGFnZV90b19wZm4ocGFnZSkgPDwgUEFHRV9TSElGVDsKKworCXJldHVybiBwYWRkcjsKK30KKwogc3RhdGljIGludCBpcGF0aF9nZXRfYmFzZV9pbmZvKHN0cnVjdCBmaWxlICpmcCwKIAkJCSAgICAgICB2b2lkIF9fdXNlciAqdWJhc2UsIHNpemVfdCB1YmFzZV9zaXplKQogewpAQCAtODcsNyArOTksNyBAQAogCXN6ID0gc2l6ZW9mKCpraW5mbyk7CiAJLyogSWYgcG9ydCBzaGFyaW5nIGlzIG5vdCByZXF1ZXN0ZWQsIGFsbG93IHRoZSBvbGQgc2l6ZSBzdHJ1Y3R1cmUgKi8KIAlpZiAoIXNoYXJlZCkKLQkJc3ogLT0gMyAqIHNpemVvZih1NjQpOworCQlzeiAtPSA3ICogc2l6ZW9mKHU2NCk7CiAJaWYgKHViYXNlX3NpemUgPCBzeikgewogCQlpcGF0aF9jZGJnKFBST0MsCiAJCQkgICAiQmFzZSBzaXplICV6dSwgbmVlZCAlenUgKHZlcnNpb24gbWlzbWF0Y2g/KVxuIiwKQEAgLTE2NSwyNCArMTc3LDQxIEBACiAJCWtpbmZvLT5zcGlfcGlvYnVmYmFzZSA9ICh1NjQpIHBkLT5wb3J0X3Bpb2J1ZnMgKwogCQkJZGQtPmlwYXRoX3BhbGlnbiAqCiAJCQkoZGQtPmlwYXRoX3BidWZzcG9ydCAtIGtpbmZvLT5zcGlfcGlvY250KTsKLQkJa2luZm8tPl9fc3BpX3VyZWdiYXNlID0gKHU2NCkgZGQtPmlwYXRoX3VyZWdiYXNlICsKLQkJCWRkLT5pcGF0aF9wYWxpZ24gKiBwZC0+cG9ydF9wb3J0OwogCX0gZWxzZSB7CiAJCXVuc2lnbmVkIHNsYXZlID0gc3VicG9ydF9mcChmcCkgLSAxOwogCiAJCWtpbmZvLT5zcGlfcGlvY250ID0gZGQtPmlwYXRoX3BidWZzcG9ydCAvIHN1YnBvcnRfY250OwogCQlraW5mby0+c3BpX3Bpb2J1ZmJhc2UgPSAodTY0KSBwZC0+cG9ydF9waW9idWZzICsKIAkJCWRkLT5pcGF0aF9wYWxpZ24gKiBraW5mby0+c3BpX3Bpb2NudCAqIHNsYXZlOwotCQlraW5mby0+X19zcGlfdXJlZ2Jhc2UgPSAoKHU2NCkgcGQtPnN1YnBvcnRfdXJlZ2Jhc2UgKwotCQkJUEFHRV9TSVpFICogc2xhdmUpICYgTU1BUDY0X01BU0s7CisJfQorCWlmIChzaGFyZWQpIHsKKwkJa2luZm8tPnNwaV9wb3J0X3VyZWdiYXNlID0gKHU2NCkgZGQtPmlwYXRoX3VyZWdiYXNlICsKKwkJCWRkLT5pcGF0aF9wYWxpZ24gKiBwZC0+cG9ydF9wb3J0OworCQlraW5mby0+c3BpX3BvcnRfcmN2ZWdyYnVmID0ga2luZm8tPnNwaV9yY3ZfZWdyYnVmczsKKwkJa2luZm8tPnNwaV9wb3J0X3Jjdmhkcl9iYXNlID0ga2luZm8tPnNwaV9yY3ZoZHJfYmFzZTsKKwkJa2luZm8tPnNwaV9wb3J0X3Jjdmhkcl90YWlsYWRkciA9IGtpbmZvLT5zcGlfcmN2aGRyX3RhaWxhZGRyOwogCi0JCWtpbmZvLT5zcGlfcmN2aGRyX2Jhc2UgPSAoKHU2NCkgcGQtPnN1YnBvcnRfcmN2aGRyX2Jhc2UgKwotCQkJcGQtPnBvcnRfcmN2aGRycV9zaXplICogc2xhdmUpICYgTU1BUDY0X01BU0s7Ci0JCWtpbmZvLT5zcGlfcmN2aGRyX3RhaWxhZGRyID0KLQkJCSh1NjQpIHBkLT5wb3J0X3JjdmhkcnF0YWlsYWRkcl9waHlzICYgTU1BUDY0X01BU0s7Ci0JCWtpbmZvLT5zcGlfcmN2X2VncmJ1ZnMgPSAoKHU2NCkgcGQtPnN1YnBvcnRfcmN2ZWdyYnVmICsKLQkJCWRkLT5pcGF0aF9yY3ZlZ3JjbnQgKiBkZC0+aXBhdGhfcmN2ZWdyYnVmc2l6ZSAqIHNsYXZlKSAmCi0JCQlNTUFQNjRfTUFTSzsKKwkJa2luZm8tPl9fc3BpX3VyZWdiYXNlID0gY3Z0X2t2YWRkcihwZC0+c3VicG9ydF91cmVnYmFzZSArCisJCQlQQUdFX1NJWkUgKiBzdWJwb3J0X2ZwKGZwKSk7CisKKwkJa2luZm8tPnNwaV9yY3ZoZHJfYmFzZSA9IGN2dF9rdmFkZHIocGQtPnN1YnBvcnRfcmN2aGRyX2Jhc2UgKworCQkJcGQtPnBvcnRfcmN2aGRycV9zaXplICogc3VicG9ydF9mcChmcCkpOworCQlraW5mby0+c3BpX3Jjdmhkcl90YWlsYWRkciA9IDA7CisJCWtpbmZvLT5zcGlfcmN2X2VncmJ1ZnMgPSBjdnRfa3ZhZGRyKHBkLT5zdWJwb3J0X3JjdmVncmJ1ZiArCisJCQlwZC0+cG9ydF9yY3ZlZ3JidWZfY2h1bmtzICogcGQtPnBvcnRfcmN2ZWdyYnVmX3NpemUgKgorCQkJc3VicG9ydF9mcChmcCkpOworCisJCWtpbmZvLT5zcGlfc3VicG9ydF91cmVnYmFzZSA9CisJCQljdnRfa3ZhZGRyKHBkLT5zdWJwb3J0X3VyZWdiYXNlKTsKKwkJa2luZm8tPnNwaV9zdWJwb3J0X3JjdmVncmJ1ZiA9CisJCQljdnRfa3ZhZGRyKHBkLT5zdWJwb3J0X3JjdmVncmJ1Zik7CisJCWtpbmZvLT5zcGlfc3VicG9ydF9yY3ZoZHJfYmFzZSA9CisJCQljdnRfa3ZhZGRyKHBkLT5zdWJwb3J0X3Jjdmhkcl9iYXNlKTsKKwkJaXBhdGhfY2RiZyhQUk9DLCAicG9ydCAldSBmbGFncyAleCAlbGx4ICVsbHggJWxseFxuIiwKKwkJCWtpbmZvLT5zcGlfcG9ydCwga2luZm8tPnNwaV9ydW50aW1lX2ZsYWdzLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykga2luZm8tPnNwaV9zdWJwb3J0X3VyZWdiYXNlLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykga2luZm8tPnNwaV9zdWJwb3J0X3JjdmVncmJ1ZiwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpIGtpbmZvLT5zcGlfc3VicG9ydF9yY3ZoZHJfYmFzZSk7CiAJfQogCiAJa2luZm8tPnNwaV9waW9pbmRleCA9IChraW5mby0+c3BpX3Bpb2J1ZmJhc2UgLSBkZC0+aXBhdGhfcGlvYnVmYmFzZSkgLwpAQCAtMTk5LDIwICsyMjgsMTAgQEAKIAogCWlmIChtYXN0ZXIpIHsKIAkJa2luZm8tPnNwaV9ydW50aW1lX2ZsYWdzIHw9IElQQVRIX1JVTlRJTUVfTUFTVEVSOwotCQlraW5mby0+c3BpX3N1YnBvcnRfdXJlZ2Jhc2UgPQotCQkJKHU2NCkgcGQtPnN1YnBvcnRfdXJlZ2Jhc2UgJiBNTUFQNjRfTUFTSzsKLQkJa2luZm8tPnNwaV9zdWJwb3J0X3JjdmVncmJ1ZiA9Ci0JCQkodTY0KSBwZC0+c3VicG9ydF9yY3ZlZ3JidWYgJiBNTUFQNjRfTUFTSzsKLQkJa2luZm8tPnNwaV9zdWJwb3J0X3Jjdmhkcl9iYXNlID0KLQkJCSh1NjQpIHBkLT5zdWJwb3J0X3Jjdmhkcl9iYXNlICYgTU1BUDY0X01BU0s7Ci0JCWlwYXRoX2NkYmcoUFJPQywgInBvcnQgJXUgZmxhZ3MgJXggJWxseCAlbGx4ICVsbHhcbiIsCi0JCQlraW5mby0+c3BpX3BvcnQsIGtpbmZvLT5zcGlfcnVudGltZV9mbGFncywKLQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpIGtpbmZvLT5zcGlfc3VicG9ydF91cmVnYmFzZSwKLQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpIGtpbmZvLT5zcGlfc3VicG9ydF9yY3ZlZ3JidWYsCi0JCQkodW5zaWduZWQgbG9uZyBsb25nKSBraW5mby0+c3BpX3N1YnBvcnRfcmN2aGRyX2Jhc2UpOwogCX0KIAotCWlmIChjb3B5X3RvX3VzZXIodWJhc2UsIGtpbmZvLCBzaXplb2YoKmtpbmZvKSkpCisJc3ogPSAodWJhc2Vfc2l6ZSA8IHNpemVvZigqa2luZm8pKSA/IHViYXNlX3NpemUgOiBzaXplb2YoKmtpbmZvKTsKKwlpZiAoY29weV90b191c2VyKHViYXNlLCBraW5mbywgc3opKQogCQlyZXQgPSAtRUZBVUxUOwogCiBiYWlsOgpAQCAtMTEzMiw2NyArMTE1MSw1NSBAQAogCXN0cnVjdCBpcGF0aF9kZXZkYXRhICpkZDsKIAl2b2lkICphZGRyOwogCXNpemVfdCBzaXplOwotCWludCByZXQ7CisJaW50IHJldCA9IDA7CiAKIAkvKiBJZiB0aGUgcG9ydCBpcyBub3Qgc2hhcmVkLCBhbGwgYWRkcmVzc2VzIHNob3VsZCBiZSBwaHlzaWNhbCAqLwotCWlmICghcGQtPnBvcnRfc3VicG9ydF9jbnQpIHsKLQkJcmV0ID0gLUVJTlZBTDsKKwlpZiAoIXBkLT5wb3J0X3N1YnBvcnRfY250KQogCQlnb3RvIGJhaWw7Ci0JfQogCiAJZGQgPSBwZC0+cG9ydF9kZDsKIAlzaXplID0gcGQtPnBvcnRfcmN2ZWdyYnVmX2NodW5rcyAqIHBkLT5wb3J0X3JjdmVncmJ1Zl9zaXplOwogCiAJLyoKLQkgKiBNYXN0ZXIgaGFzIGFsbCB0aGUgc2xhdmUgdXJlZ2Jhc2UsIHJjdmhkcnEsIGFuZAotCSAqIHJjdmVncmJ1ZnMgbW1hcHBlZC4KKwkgKiBFYWNoIHByb2Nlc3MgaGFzIGFsbCB0aGUgc3VicG9ydCB1cmVnYmFzZSwgcmN2aGRycSwgYW5kCisJICogcmN2ZWdyYnVmcyBtbWFwcGVkIC0gYXMgYW4gYXJyYXkgZm9yIGFsbCB0aGUgcHJvY2Vzc2VzLAorCSAqIGFuZCBhbHNvIHNlcGFyYXRlbHkgZm9yIHRoaXMgcHJvY2Vzcy4KIAkgKi8KLQlpZiAoc3VicG9ydCA9PSAwKSB7Ci0JCXVuc2lnbmVkIG51bV9zbGF2ZXMgPSBwZC0+cG9ydF9zdWJwb3J0X2NudCAtIDE7Ci0KLQkJaWYgKHBnYWRkciA9PSAoKHU2NCkgcGQtPnN1YnBvcnRfdXJlZ2Jhc2UgJiBNTUFQNjRfTUFTSykpIHsKLQkJCWFkZHIgPSBwZC0+c3VicG9ydF91cmVnYmFzZTsKLQkJCXNpemUgPSBQQUdFX1NJWkUgKiBudW1fc2xhdmVzOwotCQl9IGVsc2UgaWYgKHBnYWRkciA9PSAoKHU2NCkgcGQtPnN1YnBvcnRfcmN2aGRyX2Jhc2UgJgotCQkJCSAgICAgIE1NQVA2NF9NQVNLKSkgewotCQkJYWRkciA9IHBkLT5zdWJwb3J0X3Jjdmhkcl9iYXNlOwotCQkJc2l6ZSA9IHBkLT5wb3J0X3JjdmhkcnFfc2l6ZSAqIG51bV9zbGF2ZXM7Ci0JCX0gZWxzZSBpZiAocGdhZGRyID09ICgodTY0KSBwZC0+c3VicG9ydF9yY3ZlZ3JidWYgJgotCQkJCSAgICAgIE1NQVA2NF9NQVNLKSkgewotCQkJYWRkciA9IHBkLT5zdWJwb3J0X3JjdmVncmJ1ZjsKLQkJCXNpemUgKj0gbnVtX3NsYXZlczsKLQkJfSBlbHNlIHsKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCQlnb3RvIGJhaWw7Ci0JCX0KLQl9IGVsc2UgaWYgKHBnYWRkciA9PSAoKCh1NjQpIHBkLT5zdWJwb3J0X3VyZWdiYXNlICsKLQkJCSAgICAgICBQQUdFX1NJWkUgKiAoc3VicG9ydCAtIDEpKSAmIE1NQVA2NF9NQVNLKSkgewotCQlhZGRyID0gcGQtPnN1YnBvcnRfdXJlZ2Jhc2UgKyBQQUdFX1NJWkUgKiAoc3VicG9ydCAtIDEpOwotCQlzaXplID0gUEFHRV9TSVpFOwotCX0gZWxzZSBpZiAocGdhZGRyID09ICgoKHU2NCkgcGQtPnN1YnBvcnRfcmN2aGRyX2Jhc2UgKwotCQkJICAgICAgIHBkLT5wb3J0X3JjdmhkcnFfc2l6ZSAqIChzdWJwb3J0IC0gMSkpICYKLQkJCSAgICAgIE1NQVA2NF9NQVNLKSkgewotCQlhZGRyID0gcGQtPnN1YnBvcnRfcmN2aGRyX2Jhc2UgKwotCQkJcGQtPnBvcnRfcmN2aGRycV9zaXplICogKHN1YnBvcnQgLSAxKTsKLQkJc2l6ZSA9IHBkLT5wb3J0X3JjdmhkcnFfc2l6ZTsKLQl9IGVsc2UgaWYgKHBnYWRkciA9PSAoKCh1NjQpIHBkLT5zdWJwb3J0X3JjdmVncmJ1ZiArCi0JCQkgICAgICAgc2l6ZSAqIChzdWJwb3J0IC0gMSkpICYgTU1BUDY0X01BU0spKSB7Ci0JCWFkZHIgPSBwZC0+c3VicG9ydF9yY3ZlZ3JidWYgKyBzaXplICogKHN1YnBvcnQgLSAxKTsKLQkJLyogcmN2ZWdyYnVmcyBhcmUgcmVhZC1vbmx5IG9uIHRoZSBzbGF2ZSAqLwotCQlpZiAodm1hLT52bV9mbGFncyAmIFZNX1dSSVRFKSB7Ci0JCQlkZXZfaW5mbygmZGQtPnBjaWRldi0+ZGV2LAotCQkJCSAiQ2FuJ3QgbWFwIGVhZ2VyIGJ1ZmZlcnMgYXMgIgotCQkJCSAid3JpdGFibGUgKGZsYWdzPSVseClcbiIsIHZtYS0+dm1fZmxhZ3MpOwotCQkJcmV0ID0gLUVQRVJNOwotCQkJZ290byBiYWlsOwotCQl9Ci0JCS8qCi0JCSAqIERvbid0IGFsbG93IHBlcm1pc3Npb24gdG8gbGF0ZXIgY2hhbmdlIHRvIHdyaXRlYWJsZQotCQkgKiB3aXRoIG1wcm90ZWN0LgotCQkgKi8KLQkJdm1hLT52bV9mbGFncyAmPSB+Vk1fTUFZV1JJVEU7CisJaWYgKHBnYWRkciA9PSBjdnRfa3ZhZGRyKHBkLT5zdWJwb3J0X3VyZWdiYXNlKSkgeworCQlhZGRyID0gcGQtPnN1YnBvcnRfdXJlZ2Jhc2U7CisJCXNpemUgPSBQQUdFX1NJWkUgKiBwZC0+cG9ydF9zdWJwb3J0X2NudDsKKwl9IGVsc2UgaWYgKHBnYWRkciA9PSBjdnRfa3ZhZGRyKHBkLT5zdWJwb3J0X3Jjdmhkcl9iYXNlKSkgeworCQlhZGRyID0gcGQtPnN1YnBvcnRfcmN2aGRyX2Jhc2U7CisJCXNpemUgPSBwZC0+cG9ydF9yY3ZoZHJxX3NpemUgKiBwZC0+cG9ydF9zdWJwb3J0X2NudDsKKwl9IGVsc2UgaWYgKHBnYWRkciA9PSBjdnRfa3ZhZGRyKHBkLT5zdWJwb3J0X3JjdmVncmJ1ZikpIHsKKwkJYWRkciA9IHBkLT5zdWJwb3J0X3JjdmVncmJ1ZjsKKwkJc2l6ZSAqPSBwZC0+cG9ydF9zdWJwb3J0X2NudDsKKyAgICAgICAgfSBlbHNlIGlmIChwZ2FkZHIgPT0gY3Z0X2t2YWRkcihwZC0+c3VicG9ydF91cmVnYmFzZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFHRV9TSVpFICogc3VicG9ydCkpIHsKKyAgICAgICAgICAgICAgICBhZGRyID0gcGQtPnN1YnBvcnRfdXJlZ2Jhc2UgKyBQQUdFX1NJWkUgKiBzdWJwb3J0OworICAgICAgICAgICAgICAgIHNpemUgPSBQQUdFX1NJWkU7CisgICAgICAgIH0gZWxzZSBpZiAocGdhZGRyID09IGN2dF9rdmFkZHIocGQtPnN1YnBvcnRfcmN2aGRyX2Jhc2UgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZC0+cG9ydF9yY3ZoZHJxX3NpemUgKiBzdWJwb3J0KSkgeworICAgICAgICAgICAgICAgIGFkZHIgPSBwZC0+c3VicG9ydF9yY3ZoZHJfYmFzZSArCisgICAgICAgICAgICAgICAgICAgICAgICBwZC0+cG9ydF9yY3ZoZHJxX3NpemUgKiBzdWJwb3J0OworICAgICAgICAgICAgICAgIHNpemUgPSBwZC0+cG9ydF9yY3ZoZHJxX3NpemU7CisgICAgICAgIH0gZWxzZSBpZiAocGdhZGRyID09IGN2dF9rdmFkZHIocGQtPnN1YnBvcnRfcmN2ZWdyYnVmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplICogc3VicG9ydCkpIHsKKyAgICAgICAgICAgICAgICBhZGRyID0gcGQtPnN1YnBvcnRfcmN2ZWdyYnVmICsgc2l6ZSAqIHN1YnBvcnQ7CisgICAgICAgICAgICAgICAgLyogcmN2ZWdyYnVmcyBhcmUgcmVhZC1vbmx5IG9uIHRoZSBzbGF2ZSAqLworICAgICAgICAgICAgICAgIGlmICh2bWEtPnZtX2ZsYWdzICYgVk1fV1JJVEUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRldl9pbmZvKCZkZC0+cGNpZGV2LT5kZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2FuJ3QgbWFwIGVhZ2VyIGJ1ZmZlcnMgYXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndyaXRhYmxlIChmbGFncz0lbHgpXG4iLCB2bWEtPnZtX2ZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IC1FUEVSTTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBEb24ndCBhbGxvdyBwZXJtaXNzaW9uIHRvIGxhdGVyIGNoYW5nZSB0byB3cml0ZWFibGUKKyAgICAgICAgICAgICAgICAgKiB3aXRoIG1wcm90ZWN0LgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIHZtYS0+dm1fZmxhZ3MgJj0gflZNX01BWVdSSVRFOwogCX0gZWxzZSB7Ci0JCXJldCA9IC1FSU5WQUw7CiAJCWdvdG8gYmFpbDsKIAl9CiAJbGVuID0gdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0OwpAQCAtMTIwNSw3ICsxMjEyLDcgQEAKIAl2bWEtPnZtX3Bnb2ZmID0gKHVuc2lnbmVkIGxvbmcpIGFkZHIgPj4gUEFHRV9TSElGVDsKIAl2bWEtPnZtX29wcyA9ICZpcGF0aF9maWxlX3ZtX29wczsKIAl2bWEtPnZtX2ZsYWdzIHw9IFZNX1JFU0VSVkVEIHwgVk1fRE9OVEVYUEFORDsKLQlyZXQgPSAwOworCXJldCA9IDE7CiAKIGJhaWw6CiAJcmV0dXJuIHJldDsKQEAgLTEyNjUsMTkgKzEyNzIsMjAgQEAKIAkgKiBDaGVjayBmb3Iga2VybmVsIHZpcnR1YWwgYWRkcmVzc2VzIGZpcnN0LCBhbnl0aGluZyBlbHNlIG11c3QKIAkgKiBtYXRjaCBhIEhXIG9yIG1lbW9yeSBhZGRyZXNzLgogCSAqLwotCWlmIChwZ2FkZHIgPj0gKDFVTEw8PDQwKSkgewotCQlyZXQgPSBtbWFwX2t2YWRkcih2bWEsIHBnYWRkciwgcGQsIHN1YnBvcnRfZnAoZnApKTsKKwlyZXQgPSBtbWFwX2t2YWRkcih2bWEsIHBnYWRkciwgcGQsIHN1YnBvcnRfZnAoZnApKTsKKwlpZiAocmV0KSB7CisJCWlmIChyZXQgPiAwKQorCQkJcmV0ID0gMDsKIAkJZ290byBiYWlsOwogCX0KIAorCXVyZWcgPSBkZC0+aXBhdGhfdXJlZ2Jhc2UgKyBkZC0+aXBhdGhfcGFsaWduICogcGQtPnBvcnRfcG9ydDsKIAlpZiAoIXBkLT5wb3J0X3N1YnBvcnRfY250KSB7CiAJCS8qIHBvcnQgaXMgbm90IHNoYXJlZCAqLwotCQl1cmVnID0gZGQtPmlwYXRoX3VyZWdiYXNlICsgZGQtPmlwYXRoX3BhbGlnbiAqIHBkLT5wb3J0X3BvcnQ7CiAJCXBpb2NudCA9IGRkLT5pcGF0aF9wYnVmc3BvcnQ7CiAJCXBpb2J1ZnMgPSBwZC0+cG9ydF9waW9idWZzOwogCX0gZWxzZSBpZiAoIXN1YnBvcnRfZnAoZnApKSB7CiAJCS8qIGNhbGxlciBpcyB0aGUgbWFzdGVyICovCi0JCXVyZWcgPSBkZC0+aXBhdGhfdXJlZ2Jhc2UgKyBkZC0+aXBhdGhfcGFsaWduICogcGQtPnBvcnRfcG9ydDsKIAkJcGlvY250ID0gKGRkLT5pcGF0aF9wYnVmc3BvcnQgLyBwZC0+cG9ydF9zdWJwb3J0X2NudCkgKwogCQkJIChkZC0+aXBhdGhfcGJ1ZnNwb3J0ICUgcGQtPnBvcnRfc3VicG9ydF9jbnQpOwogCQlwaW9idWZzID0gcGQtPnBvcnRfcGlvYnVmcyArCkBAIC0xMjg2LDcgKzEyOTQsNiBAQAogCQl1bnNpZ25lZCBzbGF2ZSA9IHN1YnBvcnRfZnAoZnApIC0gMTsKIAogCQkvKiBjYWxsZXIgaXMgYSBzbGF2ZSAqLwotCQl1cmVnID0gMDsKIAkJcGlvY250ID0gZGQtPmlwYXRoX3BidWZzcG9ydCAvIHBkLT5wb3J0X3N1YnBvcnRfY250OwogCQlwaW9idWZzID0gcGQtPnBvcnRfcGlvYnVmcyArIGRkLT5pcGF0aF9wYWxpZ24gKiBwaW9jbnQgKiBzbGF2ZTsKIAl9CkBAIC0xMzAwLDkgKzEzMDcsNiBAQAogCQlyZXQgPSBpcGF0aF9tbWFwX21lbSh2bWEsIHBkLCBQQUdFX1NJWkUsIDAsCiAJCQkgICAgICAJICAgICAodm9pZCAqKSBkZC0+aXBhdGhfcGlvYXZhaWxyZWdzX2RtYSwKIAkJCQkgICAgICJwaW9hdmFpbCByZWdpc3RlcnMiKTsKLQllbHNlIGlmIChzdWJwb3J0X2ZwKGZwKSkKLQkJLyogU3VicG9ydHMgZG9uJ3QgbW1hcCB0aGUgcGh5c2ljYWwgcmVjZWl2ZSBidWZmZXJzICovCi0JCXJldCA9IC1FSU5WQUw7CiAJZWxzZSBpZiAocGdhZGRyID09IHBkLT5wb3J0X3JjdmVncl9waHlzKQogCQlyZXQgPSBtbWFwX3JjdmVncmJ1ZnModm1hLCBwZCk7CiAJZWxzZSBpZiAocGdhZGRyID09ICh1NjQpIHBkLT5wb3J0X3JjdmhkcnFfcGh5cykKQEAgLTE0MDAsMzIgKzE0MDQsNDEgQEAKIAkJCSBjb25zdCBzdHJ1Y3QgaXBhdGhfdXNlcl9pbmZvICp1aW5mbykKIHsKIAlpbnQgcmV0ID0gMDsKLQl1bnNpZ25lZCBudW1fc2xhdmVzOworCXVuc2lnbmVkIG51bV9zdWJwb3J0czsKIAlzaXplX3Qgc2l6ZTsKIAotCS8qIE9sZCB1c2VyIGJpbmFyaWVzIGRvbid0IGtub3cgYWJvdXQgc3VicG9ydHMgKi8KLQlpZiAoKHVpbmZvLT5zcHVfdXNlcnZlcnNpb24gJiAweGZmZmYpICE9IElQQVRIX1VTRVJfU1dNSU5PUikKLQkJZ290byBiYWlsOwogCS8qCiAJICogSWYgdGhlIHVzZXIgaXMgcmVxdWVzdGluZyB6ZXJvIG9yIG9uZSBwb3J0LAogCSAqIHNraXAgdGhlIHN1YnBvcnQgYWxsb2NhdGlvbi4KIAkgKi8KIAlpZiAodWluZm8tPnNwdV9zdWJwb3J0X2NudCA8PSAxKQogCQlnb3RvIGJhaWw7Ci0JaWYgKHVpbmZvLT5zcHVfc3VicG9ydF9jbnQgPiA0KSB7CisKKwkvKiBPbGQgdXNlciBiaW5hcmllcyBkb24ndCBrbm93IGFib3V0IG5ldyBzdWJwb3J0IGltcGxlbWVudGF0aW9uICovCisJaWYgKCh1aW5mby0+c3B1X3VzZXJ2ZXJzaW9uICYgMHhmZmZmKSAhPSBJUEFUSF9VU0VSX1NXTUlOT1IpIHsKKwkJZGV2X2luZm8oJmRkLT5wY2lkZXYtPmRldiwKKwkJCSAiTWlzbWF0Y2hlZCB1c2VyIG1pbm9yIHZlcnNpb24gKCVkKSBhbmQgZHJpdmVyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAibWlub3IgdmVyc2lvbiAoJWQpIHdoaWxlIHBvcnQgc2hhcmluZy4gRW5zdXJlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAidGhhdCBkcml2ZXIgYW5kIGxpYnJhcnkgYXJlIGZyb20gdGhlIHNhbWUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJyZWxlYXNlLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSAodWluZm8tPnNwdV91c2VydmVyc2lvbiAmIDB4ZmZmZiksCisJICAgICAgICAgICAgICAgICBJUEFUSF9VU0VSX1NXTUlOT1IpOworCQlnb3RvIGJhaWw7CisJfQorCWlmICh1aW5mby0+c3B1X3N1YnBvcnRfY250ID4gSU5GSU5JUEFUSF9NQVhfU1VCUE9SVCkgewogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIGJhaWw7CiAJfQogCi0JbnVtX3NsYXZlcyA9IHVpbmZvLT5zcHVfc3VicG9ydF9jbnQgLSAxOwotCXBkLT5zdWJwb3J0X3VyZWdiYXNlID0gdm1hbGxvYyhQQUdFX1NJWkUgKiBudW1fc2xhdmVzKTsKKwludW1fc3VicG9ydHMgPSB1aW5mby0+c3B1X3N1YnBvcnRfY250OworCXBkLT5zdWJwb3J0X3VyZWdiYXNlID0gdm1hbGxvYyhQQUdFX1NJWkUgKiBudW1fc3VicG9ydHMpOwogCWlmICghcGQtPnN1YnBvcnRfdXJlZ2Jhc2UpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBiYWlsOwogCX0KIAkvKiBOb3RlOiBwZC0+cG9ydF9yY3ZoZHJxX3NpemUgaXNuJ3QgaW5pdGlhbGl6ZWQgeWV0LiAqLwogCXNpemUgPSBBTElHTihkZC0+aXBhdGhfcmN2aGRyY250ICogZGQtPmlwYXRoX3JjdmhkcmVudHNpemUgKgotCQkgICAgIHNpemVvZih1MzIpLCBQQUdFX1NJWkUpICogbnVtX3NsYXZlczsKKwkJICAgICBzaXplb2YodTMyKSwgUEFHRV9TSVpFKSAqIG51bV9zdWJwb3J0czsKIAlwZC0+c3VicG9ydF9yY3ZoZHJfYmFzZSA9IHZtYWxsb2Moc2l6ZSk7CiAJaWYgKCFwZC0+c3VicG9ydF9yY3ZoZHJfYmFzZSkgewogCQlyZXQgPSAtRU5PTUVNOwpAQCAtMTQzNCw3ICsxNDQ3LDcgQEAKIAogCXBkLT5zdWJwb3J0X3JjdmVncmJ1ZiA9IHZtYWxsb2MocGQtPnBvcnRfcmN2ZWdyYnVmX2NodW5rcyAqCiAJCQkJCXBkLT5wb3J0X3JjdmVncmJ1Zl9zaXplICoKLQkJCQkJbnVtX3NsYXZlcyk7CisJCQkJCW51bV9zdWJwb3J0cyk7CiAJaWYgKCFwZC0+c3VicG9ydF9yY3ZlZ3JidWYpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBiYWlsX3JoZHI7CkBAIC0xNDQzLDYgKzE0NTYsMTIgQEAKIAlwZC0+cG9ydF9zdWJwb3J0X2NudCA9IHVpbmZvLT5zcHVfc3VicG9ydF9jbnQ7CiAJcGQtPnBvcnRfc3VicG9ydF9pZCA9IHVpbmZvLT5zcHVfc3VicG9ydF9pZDsKIAlwZC0+YWN0aXZlX3NsYXZlcyA9IDE7CisJc2V0X2JpdChJUEFUSF9QT1JUX01BU1RFUl9VTklOSVQsICZwZC0+cG9ydF9mbGFnKTsKKwltZW1zZXQocGQtPnN1YnBvcnRfdXJlZ2Jhc2UsIDAsIFBBR0VfU0laRSAqIG51bV9zdWJwb3J0cyk7CisJbWVtc2V0KHBkLT5zdWJwb3J0X3Jjdmhkcl9iYXNlLCAwLCBzaXplKTsKKwltZW1zZXQocGQtPnN1YnBvcnRfcmN2ZWdyYnVmLCAwLCBwZC0+cG9ydF9yY3ZlZ3JidWZfY2h1bmtzICoKKwkJCQkgICAgICAgICBwZC0+cG9ydF9yY3ZlZ3JidWZfc2l6ZSAqCisJCQkJICAgICAgICAgbnVtX3N1YnBvcnRzKTsKIAlnb3RvIGJhaWw7CiAKIGJhaWxfcmhkcjoKQEAgLTE1NzMsMTggKzE1OTIsMTkgQEAKIAkgKi8KIAlpZiAoIWNwdXNfZW1wdHkoY3VycmVudC0+Y3B1c19hbGxvd2VkKSAmJgogCSAgICAhY3B1c19mdWxsKGN1cnJlbnQtPmNwdXNfYWxsb3dlZCkpIHsKLQkJaW50IG5jcHVzID0gbnVtX29ubGluZV9jcHVzKCksIGN1cmNwdSA9IC0xOworCQlpbnQgbmNwdXMgPSBudW1fb25saW5lX2NwdXMoKSwgY3VyY3B1ID0gLTEsIG5zZXQgPSAwOwogCQlmb3IgKGkgPSAwOyBpIDwgbmNwdXM7IGkrKykKIAkJCWlmIChjcHVfaXNzZXQoaSwgY3VycmVudC0+Y3B1c19hbGxvd2VkKSkgewogCQkJCWlwYXRoX2NkYmcoUFJPQywgIiVzWyV1XSBhZmZpbml0eSBzZXQgZm9yICIKLQkJCQkJICAgImNwdSAlZFxuIiwgY3VycmVudC0+Y29tbSwKLQkJCQkJICAgY3VycmVudC0+cGlkLCBpKTsKKwkJCQkJICAgImNwdSAlZC8lZFxuIiwgY3VycmVudC0+Y29tbSwKKwkJCQkJICAgY3VycmVudC0+cGlkLCBpLCBuY3B1cyk7CiAJCQkJY3VyY3B1ID0gaTsKKwkJCQluc2V0Kys7CiAJCQl9Ci0JCWlmIChjdXJjcHUgIT0gLTEpIHsKKwkJaWYgKGN1cmNwdSAhPSAtMSAmJiBuc2V0ICE9IG5jcHVzKSB7CiAJCQlpZiAobnByZXNlbnQpIHsKIAkJCQlwcmVmdW5pdCA9IGN1cmNwdSAvIChuY3B1cyAvIG5wcmVzZW50KTsKLQkJCQlpcGF0aF9kYmcoIiVzWyV1XSAlZCBjaGlwcywgJWQgY3B1cywgIgorCQkJCWlwYXRoX2NkYmcoUFJPQywiJXNbJXVdICVkIGNoaXBzLCAlZCBjcHVzLCAiCiAJCQkJCSAgIiVkIGNwdXMvY2hpcCwgc2VsZWN0IHVuaXQgJWRcbiIsCiAJCQkJCSAgY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkLAogCQkJCQkgIG5wcmVzZW50LCBuY3B1cywgbmNwdXMgLyBucHJlc2VudCwKQEAgLTE3NjQsMTEgKzE3ODQsMTcgQEAKIAkJCSAgICAgIGNvbnN0IHN0cnVjdCBpcGF0aF91c2VyX2luZm8gKnVpbmZvKQogewogCWludCByZXQ7Ci0Jc3RydWN0IGlwYXRoX3BvcnRkYXRhICpwZDsKKwlzdHJ1Y3QgaXBhdGhfcG9ydGRhdGEgKnBkID0gcG9ydF9mcChmcCk7CiAJc3RydWN0IGlwYXRoX2RldmRhdGEgKmRkOwogCXUzMiBoZWFkMzI7CiAKLQlwZCA9IHBvcnRfZnAoZnApOworCS8qIFN1YnBvcnRzIGRvbid0IG5lZWQgdG8gaW5pdGlhbGl6ZSBhbnl0aGluZyBzaW5jZSBtYXN0ZXIgZGlkIGl0LiAqLworCWlmIChzdWJwb3J0X2ZwKGZwKSkgeworCQlyZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUocGQtPnBvcnRfd2FpdCwKKwkJCSF0ZXN0X2JpdChJUEFUSF9QT1JUX01BU1RFUl9VTklOSVQsICZwZC0+cG9ydF9mbGFnKSk7CisJCWdvdG8gZG9uZTsKKwl9CisKIAlkZCA9IHBkLT5wb3J0X2RkOwogCiAJaWYgKHVpbmZvLT5zcHVfcmN2aGRyc2l6ZSkgewpAQCAtMTgyNiw2ICsxODUyLDExIEBACiAJCQkgZGQtPmlwYXRoX3JjdmN0cmwgJiB+SU5GSU5JUEFUSF9SX1RBSUxVUEQpOwogCWlwYXRoX3dyaXRlX2tyZWcoZGQsIGRkLT5pcGF0aF9rcmVncy0+a3JfcmN2Y3RybCwKIAkJCSBkZC0+aXBhdGhfcmN2Y3RybCk7CisJLyogTm90aWZ5IGFueSB3YWl0aW5nIHNsYXZlcyAqLworCWlmIChwZC0+cG9ydF9zdWJwb3J0X2NudCkgeworCQljbGVhcl9iaXQoSVBBVEhfUE9SVF9NQVNURVJfVU5JTklULCAmcGQtPnBvcnRfZmxhZyk7CisJCXdha2VfdXAoJnBkLT5wb3J0X3dhaXQpOworCX0KIGRvbmU6CiAJcmV0dXJuIHJldDsKIH0KQEAgLTIwMTcsNiArMjA0OCwxNyBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBpbnQgaXBhdGhfZm9yY2VfcGlvX2F2YWlsX3VwZGF0ZShzdHJ1Y3QgaXBhdGhfZGV2ZGF0YSAqZGQpCit7CisJdTY0IHJlZyA9IGRkLT5pcGF0aF9zZW5kY3RybDsKKworCWNsZWFyX2JpdChJUEFUSF9TX1BJT0JVRkFWQUlMVVBELCAmcmVnKTsKKwlpcGF0aF93cml0ZV9rcmVnKGRkLCBkZC0+aXBhdGhfa3JlZ3MtPmtyX3NlbmRjdHJsLCByZWcpOworCWlwYXRoX3dyaXRlX2tyZWcoZGQsIGRkLT5pcGF0aF9rcmVncy0+a3Jfc2VuZGN0cmwsIGRkLT5pcGF0aF9zZW5kY3RybCk7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHNzaXplX3QgaXBhdGhfd3JpdGUoc3RydWN0IGZpbGUgKmZwLCBjb25zdCBjaGFyIF9fdXNlciAqZGF0YSwKIAkJCSAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpvZmYpCiB7CkBAIC0yMDcxLDI3ICsyMTEzLDM1IEBACiAJCWRlc3QgPSAmY21kLmNtZC5wYXJ0X2tleTsKIAkJc3JjID0gJnVjbWQtPmNtZC5wYXJ0X2tleTsKIAkJYnJlYWs7Ci0JY2FzZSBJUEFUSF9DTURfU0xBVkVfSU5GTzoKKwljYXNlIF9fSVBBVEhfQ01EX1NMQVZFX0lORk86CiAJCWNvcHkgPSBzaXplb2YoY21kLmNtZC5zbGF2ZV9tYXNrX2FkZHIpOwogCQlkZXN0ID0gJmNtZC5jbWQuc2xhdmVfbWFza19hZGRyOwogCQlzcmMgPSAmdWNtZC0+Y21kLnNsYXZlX21hc2tfYWRkcjsKIAkJYnJlYWs7CisJY2FzZSBJUEFUSF9DTURfUElPQVZBSUxVUEQ6CS8vIGZvcmNlIGFuIHVwZGF0ZSBvZiBQSU9BdmFpbCByZWcKKwkJY29weSA9IDA7CisJCXNyYyA9IE5VTEw7CisJCWRlc3QgPSBOVUxMOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIGJhaWw7CiAJfQogCi0JaWYgKChjb3VudCAtIGNvbnN1bWVkKSA8IGNvcHkpIHsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBiYWlsOworCWlmIChjb3B5KSB7CisJCWlmICgoY291bnQgLSBjb25zdW1lZCkgPCBjb3B5KSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBiYWlsOworCQl9CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKGRlc3QsIHNyYywgY29weSkpIHsKKwkJCXJldCA9IC1FRkFVTFQ7CisJCQlnb3RvIGJhaWw7CisJCX0KKworCQljb25zdW1lZCArPSBjb3B5OwogCX0KIAotCWlmIChjb3B5X2Zyb21fdXNlcihkZXN0LCBzcmMsIGNvcHkpKSB7Ci0JCXJldCA9IC1FRkFVTFQ7Ci0JCWdvdG8gYmFpbDsKLQl9Ci0KLQljb25zdW1lZCArPSBjb3B5OwogCXBkID0gcG9ydF9mcChmcCk7CiAJaWYgKCFwZCAmJiBjbWQudHlwZSAhPSBfX0lQQVRIX0NNRF9VU0VSX0lOSVQgJiYKIAkJY21kLnR5cGUgIT0gSVBBVEhfQ01EX0FTU0lHTl9QT1JUKSB7CkBAIC0yMTM3LDExICsyMTg3LDE0IEBACiAJY2FzZSBJUEFUSF9DTURfU0VUX1BBUlRfS0VZOgogCQlyZXQgPSBpcGF0aF9zZXRfcGFydF9rZXkocGQsIGNtZC5jbWQucGFydF9rZXkpOwogCQlicmVhazsKLQljYXNlIElQQVRIX0NNRF9TTEFWRV9JTkZPOgorCWNhc2UgX19JUEFUSF9DTURfU0xBVkVfSU5GTzoKIAkJcmV0ID0gaXBhdGhfZ2V0X3NsYXZlX2luZm8ocGQsCiAJCQkJCSAgICh2b2lkIF9fdXNlciAqKSAodW5zaWduZWQgbG9uZykKIAkJCQkJICAgY21kLmNtZC5zbGF2ZV9tYXNrX2FkZHIpOwogCQlicmVhazsKKwljYXNlIElQQVRIX0NNRF9QSU9BVkFJTFVQRDoKKwkJcmV0ID0gaXBhdGhfZm9yY2VfcGlvX2F2YWlsX3VwZGF0ZShwZC0+cG9ydF9kZCk7CisJCWJyZWFrOwogCX0KIAogCWlmIChyZXQgPj0gMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9pYmE2MTEwLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfaWJhNjExMC5jCmluZGV4IDk5MzQ4MjUuLjQxNzExOTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9pYmE2MTEwLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2liYTYxMTAuYwpAQCAtNDMsNiArNDMsOSBAQAogI2luY2x1ZGUgImlwYXRoX2tlcm5lbC5oIgogI2luY2x1ZGUgImlwYXRoX3JlZ2lzdGVycy5oIgogCitzdGF0aWMgdm9pZCBpcGF0aF9zZXR1cF9odF9zZXRleHRsZWQoc3RydWN0IGlwYXRoX2RldmRhdGEgKiwgdTY0LCB1NjQpOworCisKIC8qCiAgKiBUaGlzIGxpc3RzIHRoZSBJbmZpbmlQYXRoIHJlZ2lzdGVycywgaW4gdGhlIGFjdHVhbCBjaGlwIGxheW91dC4KICAqIFRoaXMgc3RydWN0dXJlIHNob3VsZCBuZXZlciBiZSBkaXJlY3RseSBhY2Nlc3NlZC4KQEAgLTIwOCw4ICsyMTEsOCBAQAogCS5rcl9zZXJkZXNzdGF0dXMgPSBJUEFUSF9LUkVHX09GRlNFVChTZXJkZXNTdGF0dXMpLAogCS5rcl94Z3hzY29uZmlnID0gSVBBVEhfS1JFR19PRkZTRVQoWEdYU0NvbmZpZyksCiAJLyoKLQkgKiBUaGVzZSBzaG91bGQgbm90IGJlIHVzZWQgZGlyZWN0bHkgdmlhIGlwYXRoX3JlYWRfa3JlZzY0KCksCi0JICogdXNlIHRoZW0gd2l0aCBpcGF0aF9yZWFkX2tyZWc2NF9wb3J0KCksCisJICogVGhlc2Ugc2hvdWxkIG5vdCBiZSB1c2VkIGRpcmVjdGx5IHZpYSBpcGF0aF93cml0ZV9rcmVnNjQoKSwKKwkgKiB1c2UgdGhlbSB3aXRoIGlwYXRoX3dyaXRlX2tyZWc2NF9wb3J0KCksCiAJICovCiAJLmtyX3JjdmhkcmFkZHIgPSBJUEFUSF9LUkVHX09GRlNFVChSY3ZIZHJBZGRyMCksCiAJLmtyX3JjdmhkcnRhaWxhZGRyID0gSVBBVEhfS1JFR19PRkZTRVQoUmN2SGRyVGFpbEFkZHIwKQpAQCAtMjg0LDYgKzI4NywxNCBAQAogI2RlZmluZSBJTkZJTklQQVRIX0VYVFNfTUVNQklTVF9FTkRURVNUICAgICAweDAwMDAwMDAwMDAwMDQwMDAKICNkZWZpbmUgSU5GSU5JUEFUSF9FWFRTX01FTUJJU1RfQ09SUkVDVCAgICAgMHgwMDAwMDAwMDAwMDA4MDAwCiAKKworLyogVElEIGVudHJpZXMgKG1lbW9yeSksIEhULW9ubHkgKi8KKyNkZWZpbmUgSU5GSU5JUEFUSF9SVF9BRERSX01BU0sgMHhGRkZGRkZGRkZGVUxMCS8qIDQwIGJpdHMgdmFsaWQgKi8KKyNkZWZpbmUgSU5GSU5JUEFUSF9SVF9WQUxJRCAweDgwMDAwMDAwMDAwMDAwMDBVTEwKKyNkZWZpbmUgSU5GSU5JUEFUSF9SVF9BRERSX1NISUZUIDAKKyNkZWZpbmUgSU5GSU5JUEFUSF9SVF9CVUZTSVpFX01BU0sgMHgzRkZGVUxMCisjZGVmaW5lIElORklOSVBBVEhfUlRfQlVGU0laRV9TSElGVCA0OAorCiAvKgogICogbWFza3MgYW5kIGJpdHMgdGhhdCBhcmUgZGlmZmVyZW50IGluIGRpZmZlcmVudCBjaGlwcywgb3IgcHJlc2VudCBvbmx5CiAgKiBpbiBvbmUKQEAgLTQwMiw2ICs0MTMsMTQgQEAKIAlJTkZJTklQQVRIX0hXRV9NU0coU0VSREVTUExMRkFJTEVELCAiU2VyRGVzIFBMTCIpLAogfTsKIAorI2RlZmluZSBUWEVfUElPX1BBUklUWSAoKElORklOSVBBVEhfSFdFX1RYRU1FTVBBUklUWUVSUl9QSU9CVUYgfCBcCisJCSAgICAgICAgSU5GSU5JUEFUSF9IV0VfVFhFTUVNUEFSSVRZRVJSX1BJT1BCQykgXAorCQkgICAgICAgIDw8IElORklOSVBBVEhfSFdFX1RYRU1FTVBBUklUWUVSUl9TSElGVCkKKyNkZWZpbmUgUlhFX0VBR0VSX1BBUklUWSAoSU5GSU5JUEFUSF9IV0VfUlhFTUVNUEFSSVRZRVJSX0VBR0VSVElEIFwKKwkJCSAgPDwgSU5GSU5JUEFUSF9IV0VfUlhFTUVNUEFSSVRZRVJSX1NISUZUKQorCitzdGF0aWMgaW50IGlwYXRoX2h0X3R4ZV9yZWNvdmVyKHN0cnVjdCBpcGF0aF9kZXZkYXRhICopOworCiAvKioKICAqIGlwYXRoX2h0X2hhbmRsZV9od2Vycm9ycyAtIGRpc3BsYXkgaGFyZHdhcmUgZXJyb3JzLgogICogQGRkOiB0aGUgaW5maW5pcGF0aCBkZXZpY2UKQEAgLTQ1MCwxMyArNDY5LDEyIEBACiAKIAkvKgogCSAqIG1ha2Ugc3VyZSB3ZSBnZXQgdGhpcyBtdWNoIG91dCwgdW5sZXNzIHRvbGQgdG8gYmUgcXVpZXQsCisJICogaXQncyBhIHBhcml0eSBlcnJvciB3ZSBtYXkgcmVjb3ZlciBmcm9tLAogCSAqIG9yIGl0J3Mgb2NjdXJyZWQgd2l0aGluIHRoZSBsYXN0IDUgc2Vjb25kcwogCSAqLwotCWlmICgoaHdlcnJzICYgfihkZC0+aXBhdGhfbGFzdGh3ZXJyb3IgfAotCQkJKChJTkZJTklQQVRIX0hXRV9UWEVNRU1QQVJJVFlFUlJfUElPQlVGIHwKLQkJCSAgSU5GSU5JUEFUSF9IV0VfVFhFTUVNUEFSSVRZRVJSX1BJT1BCQykKLQkJCTw8IElORklOSVBBVEhfSFdFX1RYRU1FTVBBUklUWUVSUl9TSElGVCkpKSB8fAotCSAgICAoaXBhdGhfZGVidWcgJiBfX0lQQVRIX1ZFUkJEQkcpKQorCWlmICgoaHdlcnJzICYgfihkZC0+aXBhdGhfbGFzdGh3ZXJyb3IgfCBUWEVfUElPX1BBUklUWSB8CisJCVJYRV9FQUdFUl9QQVJJVFkpKSB8fAorCQkoaXBhdGhfZGVidWcgJiBfX0lQQVRIX1ZFUkJEQkcpKQogCQlkZXZfaW5mbygmZGQtPnBjaWRldi0+ZGV2LCAiSGFyZHdhcmUgZXJyb3I6IGh3ZXJyPTB4JWxseCAiCiAJCQkgIihjbGVhcmVkKVxuIiwgKHVuc2lnbmVkIGxvbmcgbG9uZykgaHdlcnJzKTsKIAlkZC0+aXBhdGhfbGFzdGh3ZXJyb3IgfD0gaHdlcnJzOwpAQCAtNDY3LDcgKzQ4NSw3IEBACiAJCQkgICAgICAoaHdlcnJzICYgfmRkLT5pcGF0aF9od2VfYml0c2V4dGFudCkpOwogCiAJY3RybCA9IGlwYXRoX3JlYWRfa3JlZzMyKGRkLCBkZC0+aXBhdGhfa3JlZ3MtPmtyX2NvbnRyb2wpOwotCWlmIChjdHJsICYgSU5GSU5JUEFUSF9DX0ZSRUVaRU1PREUpIHsKKwlpZiAoKGN0cmwgJiBJTkZJTklQQVRIX0NfRlJFRVpFTU9ERSkgJiYgIWlwYXRoX2RpYWdfaW51c2UpIHsKIAkJLyoKIAkJICogcGFyaXR5IGVycm9ycyBpbiBzZW5kIG1lbW9yeSBhcmUgcmVjb3ZlcmFibGUsCiAJCSAqIGp1c3QgY2FuY2VsIHRoZSBzZW5kIChpZiBpbmRpY2F0ZWQgaW4gKiBzZW5kYnVmZmVyZXJyb3IpLApAQCAtNDc2LDUwICs0OTQsMTQgQEAKIAkJICogb2NjdXIgaWYgYSBwcm9jZXNzb3Igc3BlY3VsYXRpdmUgcmVhZCBpcyBkb25lIHRvIHRoZSBQSU8KIAkJICogYnVmZmVyIHdoaWxlIHdlIGFyZSBzZW5kaW5nIGEgcGFja2V0LCBmb3IgZXhhbXBsZS4KIAkJICovCi0JCWlmIChod2VycnMgJiAoKElORklOSVBBVEhfSFdFX1RYRU1FTVBBUklUWUVSUl9QSU9CVUYgfAotCQkJICAgICAgIElORklOSVBBVEhfSFdFX1RYRU1FTVBBUklUWUVSUl9QSU9QQkMpCi0JCQkgICAgICA8PCBJTkZJTklQQVRIX0hXRV9UWEVNRU1QQVJJVFlFUlJfU0hJRlQpKSB7Ci0JCQlpcGF0aF9zdGF0cy5zcHNfdHhlcGFyaXR5Kys7Ci0JCQlpcGF0aF9kYmcoIlJlY292ZXJpbmcgZnJvbSBUWEUgcGFyaXR5IGVycm9yICglbGx1KSwgIgotCQkJICAgIAkgICJod2VycnN0YXR1cz0lbGx4XG4iLAotCQkJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZykgaXBhdGhfc3RhdHMuc3BzX3R4ZXBhcml0eSwKLQkJCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpIGh3ZXJycyk7Ci0JCQlpcGF0aF9kaXNhcm1fc2VuZGVycmJ1ZnMoZGQpOwotCQkJaHdlcnJzICY9IH4oKElORklOSVBBVEhfSFdFX1RYRU1FTVBBUklUWUVSUl9QSU9CVUYgfAotCQkJCSAgICAgSU5GSU5JUEFUSF9IV0VfVFhFTUVNUEFSSVRZRVJSX1BJT1BCQykKLQkJCQkgICAgPDwgSU5GSU5JUEFUSF9IV0VfVFhFTUVNUEFSSVRZRVJSX1NISUZUKTsKLQkJCWlmICghaHdlcnJzKSB7IC8qIGVsc2UgbGVhdmUgaW4gZnJlZXplIG1vZGUgKi8KLQkJCQlpcGF0aF93cml0ZV9rcmVnKGRkLAotCQkJCQkJIGRkLT5pcGF0aF9rcmVncy0+a3JfY29udHJvbCwKLQkJCQkJCSBkZC0+aXBhdGhfY29udHJvbCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCWlmIChod2VycnMpIHsKLQkJCS8qCi0JCQkgKiBpZiBhbnkgc2V0IHRoYXQgd2UgYXJlbid0IGlnbm9yaW5nOyBvbmx5Ci0JCQkgKiBtYWtlIHRoZSBjb21wbGFpbnQgb25jZSwgaW4gY2FzZSBpdCdzIHN0dWNrCi0JCQkgKiBvciByZWN1cnJpbmcsIGFuZCB3ZSBnZXQgaGVyZSBtdWx0aXBsZQotCQkJICogdGltZXMuCi0JCQkgKi8KLQkJCWlmIChkZC0+aXBhdGhfZmxhZ3MgJiBJUEFUSF9JTklUVEVEKSB7Ci0JCQkJaXBhdGhfZGV2X2VycihkZCwgIkZhdGFsIEhhcmR3YXJlIEVycm9yIChmcmVlemUgIgotCQkJCQkgICAgICAibW9kZSksIG5vIGxvbmdlciB1c2FibGUsIFNOICUuMTZzXG4iLAotCQkJCQkJICBkZC0+aXBhdGhfc2VyaWFsKTsKLQkJCQlpc2ZhdGFsID0gMTsKLQkJCX0KLQkJCSpkZC0+aXBhdGhfc3RhdHVzcCAmPSB+SVBBVEhfU1RBVFVTX0lCX1JFQURZOwotCQkJLyogbWFyayBhcyBoYXZpbmcgaGFkIGVycm9yICovCi0JCQkqZGQtPmlwYXRoX3N0YXR1c3AgfD0gSVBBVEhfU1RBVFVTX0hXRVJST1I7Ci0JCQkvKgotCQkJICogbWFyayBhcyBub3QgdXNhYmxlLCBhdCBhIG1pbmltdW0gdW50aWwgZHJpdmVyCi0JCQkgKiBpcyByZWxvYWRlZCwgcHJvYmFibHkgdW50aWwgcmVib290LCBzaW5jZSBubwotCQkJICogb3RoZXIgcmVzZXQgaXMgcG9zc2libGUuCi0JCQkgKi8KLQkJCWRkLT5pcGF0aF9mbGFncyAmPSB+SVBBVEhfSU5JVFRFRDsKLQkJfSBlbHNlIHsKLQkJCWlwYXRoX2RiZygiQ2xlYXJpbmcgZnJlZXplbW9kZSBvbiBpZ25vcmVkIGhhcmR3YXJlICIKLQkJCQkgICJlcnJvclxuIik7CisJCWlmICgoaHdlcnJzICYgVFhFX1BJT19QQVJJVFkpICYmIGlwYXRoX2h0X3R4ZV9yZWNvdmVyKGRkKSkKKwkJCWh3ZXJycyAmPSB+VFhFX1BJT19QQVJJVFk7CisJCWlmIChod2VycnMgJiBSWEVfRUFHRVJfUEFSSVRZKQorCQkJaXBhdGhfZGV2X2VycihkZCwgIlJYRSBwYXJpdHksIEVhZ2VyIFRJRCBlcnJvciBpcyBub3QgIgorCQkJCSJyZWNvdmVyYWJsZVxuIik7CisJCWlmICghaHdlcnJzKSB7CisJCQlpcGF0aF9kYmcoIkNsZWFyaW5nIGZyZWV6ZW1vZGUgb24gaWdub3JlZCBvciAiCisJCQkJICAicmVjb3ZlcmVkIGhhcmR3YXJlIGVycm9yXG4iKTsKIAkJCWN0cmwgJj0gfklORklOSVBBVEhfQ19GUkVFWkVNT0RFOwogCQkJaXBhdGhfd3JpdGVfa3JlZyhkZCwgZGQtPmlwYXRoX2tyZWdzLT5rcl9jb250cm9sLAogCQkJCQkgY3RybCk7CkBAIC01ODcsNyArNTY5LDM5IEBACiAJCQkJIGRkLT5pcGF0aF9od2Vycm1hc2spOwogCX0KIAotCWlwYXRoX2Rldl9lcnIoZGQsICIlcyBoYXJkd2FyZSBlcnJvclxuIiwgbXNnKTsKKwlpZiAoaHdlcnJzKSB7CisJCS8qCisJCSAqIGlmIGFueSBzZXQgdGhhdCB3ZSBhcmVuJ3QgaWdub3Jpbmc7IG9ubHkKKwkJICogbWFrZSB0aGUgY29tcGxhaW50IG9uY2UsIGluIGNhc2UgaXQncyBzdHVjaworCQkgKiBvciByZWN1cnJpbmcsIGFuZCB3ZSBnZXQgaGVyZSBtdWx0aXBsZQorCQkgKiB0aW1lcy4KKwkJICogZm9yY2UgbGluayBkb3duLCBzbyBzd2l0Y2gga25vd3MsIGFuZAorCQkgKiBMRURzIGFyZSB0dXJuZWQgb2ZmCisJCSAqLworCQlpZiAoZGQtPmlwYXRoX2ZsYWdzICYgSVBBVEhfSU5JVFRFRCkgeworCQkJaXBhdGhfc2V0X2xpbmtzdGF0ZShkZCwgSVBBVEhfSUJfTElOS0RPV04pOworCQkJaXBhdGhfc2V0dXBfaHRfc2V0ZXh0bGVkKGRkLAorCQkJCUlORklOSVBBVEhfSUJDU19MX1NUQVRFX0RPV04sCisJCQkJSU5GSU5JUEFUSF9JQkNTX0xUX1NUQVRFX0RJU0FCTEVEKTsKKwkJCWlwYXRoX2Rldl9lcnIoZGQsICJGYXRhbCBIYXJkd2FyZSBFcnJvciAoZnJlZXplICIKKwkJCQkJICAibW9kZSksIG5vIGxvbmdlciB1c2FibGUsIFNOICUuMTZzXG4iLAorCQkJCQkgIGRkLT5pcGF0aF9zZXJpYWwpOworCQkJaXNmYXRhbCA9IDE7CisJCX0KKwkJKmRkLT5pcGF0aF9zdGF0dXNwICY9IH5JUEFUSF9TVEFUVVNfSUJfUkVBRFk7CisJCS8qIG1hcmsgYXMgaGF2aW5nIGhhZCBlcnJvciAqLworCQkqZGQtPmlwYXRoX3N0YXR1c3AgfD0gSVBBVEhfU1RBVFVTX0hXRVJST1I7CisJCS8qCisJCSAqIG1hcmsgYXMgbm90IHVzYWJsZSwgYXQgYSBtaW5pbXVtIHVudGlsIGRyaXZlcgorCQkgKiBpcyByZWxvYWRlZCwgcHJvYmFibHkgdW50aWwgcmVib290LCBzaW5jZSBubworCQkgKiBvdGhlciByZXNldCBpcyBwb3NzaWJsZS4KKwkJICovCisJCWRkLT5pcGF0aF9mbGFncyAmPSB+SVBBVEhfSU5JVFRFRDsKKwl9CisJZWxzZQorCQkqbXNnID0gMDsgLyogcmVjb3ZlcmVkIGZyb20gYWxsIG9mIHRoZW0gKi8KKwlpZiAoKm1zZykKKwkJaXBhdGhfZGV2X2VycihkZCwgIiVzIGhhcmR3YXJlIGVycm9yXG4iLCBtc2cpOwogCWlmIChpc2ZhdGFsICYmICFpcGF0aF9kaWFnX2ludXNlICYmIGRkLT5pcGF0aF9mcmVlemVtc2cpCiAJCS8qCiAJCSAqIGZvciBzdGF0dXMgZmlsZTsgaWYgbm8gdHJhaWxpbmcgYnJhY2UgaXMgY29waWVkLApAQCAtNjU4LDcgKzY3Miw4IEBACiAJaWYgKG4pCiAJCXNucHJpbnRmKG5hbWUsIG5hbWVsZW4sICIlcyIsIG4pOwogCi0JaWYgKGRkLT5pcGF0aF9tYWpyZXYgIT0gMyB8fCAoZGQtPmlwYXRoX21pbnJldiA8IDIgfHwgZGQtPmlwYXRoX21pbnJldiA+IDMpKSB7CisJaWYgKGRkLT5pcGF0aF9tYWpyZXYgIT0gMyB8fCAoZGQtPmlwYXRoX21pbnJldiA8IDIgfHwKKwkJZGQtPmlwYXRoX21pbnJldiA+IDMpKSB7CiAJCS8qCiAJCSAqIFRoaXMgdmVyc2lvbiBvZiB0aGUgZHJpdmVyIG9ubHkgc3VwcG9ydHMgUmV2IDMuMiBhbmQgMy4zCiAJCSAqLwpAQCAtMTE2Myw2ICsxMTc4LDggQEAKIAogCWlmICghKGV4dHN2YWwgJiBJTkZJTklQQVRIX0VYVFNfTUVNQklTVF9FTkRURVNUKSkKIAkJaXBhdGhfZGV2X2VycihkZCwgIk1lbUJJU1QgZGlkIG5vdCBjb21wbGV0ZSFcbiIpOworCWlmIChleHRzdmFsICYgSU5GSU5JUEFUSF9FWFRTX01FTUJJU1RfQ09SUkVDVCkKKwkJaXBhdGhfZGJnKCJNZW1CSVNUIGNvcnJlY3RlZFxuIik7CiAKIAlpcGF0aF9jaGVja19odGxpbmsoZGQpOwogCkBAIC0xMzY2LDYgKzEzODMsOSBAQAogCQkJICAgICB1NjQgX19pb21lbSAqdGlkcHRyLCB1MzIgdHlwZSwKIAkJCSAgICAgdW5zaWduZWQgbG9uZyBwYSkKIHsKKwlpZiAoIWRkLT5pcGF0aF9rcmVnYmFzZSkKKwkJcmV0dXJuOworCiAJaWYgKHBhICE9IGRkLT5pcGF0aF90aWRpbnZhbGlkKSB7CiAJCWlmICh1bmxpa2VseSgocGEgJiB+SU5GSU5JUEFUSF9SVF9BRERSX01BU0spKSkgewogCQkJZGV2X2luZm8oJmRkLT5wY2lkZXYtPmRldiwKQEAgLTEzODIsMTAgKzE0MDIsMTAgQEAKIAkJCXBhIHw9IGxlbnZhbGlkIHwgSU5GSU5JUEFUSF9SVF9WQUxJRDsKIAkJfQogCX0KLQlpZiAoZGQtPmlwYXRoX2tyZWdiYXNlKQotCQl3cml0ZXEocGEsIHRpZHB0cik7CisJd3JpdGVxKHBhLCB0aWRwdHIpOwogfQogCisKIC8qKgogICogaXBhdGhfaHRfY2xlYXJfdGlkIC0gY2xlYXIgYWxsIFRJRCBlbnRyaWVzIGZvciBhIHBvcnQsIGV4cGVjdGVkIGFuZCBlYWdlcgogICogQGRkOiB0aGUgaW5maW5pcGF0aCBkZXZpY2UKQEAgLTE1MTUsNyArMTUzNSw3IEBACiAJCQkgSU5GSU5JUEFUSF9TX0FCT1JUKTsKIAogCWlwYXRoX2dldF9lZXByb21faW5mbyhkZCk7Ci0JaWYoZGQtPmlwYXRoX2JvYXJkcmV2ID09IDUgJiYgZGQtPmlwYXRoX3NlcmlhbFswXSA9PSAnMScgJiYKKwlpZiAoZGQtPmlwYXRoX2JvYXJkcmV2ID09IDUgJiYgZGQtPmlwYXRoX3NlcmlhbFswXSA9PSAnMScgJiYKIAkJZGQtPmlwYXRoX3NlcmlhbFsxXSA9PSAnMicgJiYgZGQtPmlwYXRoX3NlcmlhbFsyXSA9PSAnOCcpIHsKIAkJLyoKIAkJICogTGF0ZXIgcHJvZHVjdGlvbiBRSFQ3MDQwIGhhcyBzYW1lIGNoYW5nZXMgYXMgUUhUNzE0MCwgc28KQEAgLTE1MjgsNiArMTU0OCwyNCBAQAogCXJldHVybiAwOwogfQogCisKK3N0YXRpYyBpbnQgaXBhdGhfaHRfdHhlX3JlY292ZXIoc3RydWN0IGlwYXRoX2RldmRhdGEgKmRkKQoreworCWludCBjbnQgPSArK2lwYXRoX3N0YXRzLnNwc190eGVwYXJpdHk7CisJaWYgKGNudCA+PSBJUEFUSF9NQVhfUEFSSVRZX0FUVEVNUFRTKSAgeworCQlpZiAoY250ID09IElQQVRIX01BWF9QQVJJVFlfQVRURU1QVFMpCisJCQlpcGF0aF9kZXZfZXJyKGRkLAorCQkJCSJUb28gbWFueSBhdHRlbXB0cyB0byByZWNvdmVyIGZyb20gIgorCQkJCSJUWEUgcGFyaXR5LCBnaXZpbmcgdXBcbiIpOworCQlyZXR1cm4gMDsKKwl9CisJZGV2X2luZm8oJmRkLT5wY2lkZXYtPmRldiwKKwkJIlJlY292ZXJpbmcgZnJvbSBUWEUgUElPIHBhcml0eSBlcnJvclxuIik7CisJaXBhdGhfZGlzYXJtX3NlbmRlcnJidWZzKGRkLCAxKTsKKwlyZXR1cm4gMTsKK30KKworCiAvKioKICAqIGlwYXRoX2luaXRfaHRfZ2V0X2Jhc2VfaW5mbyAtIHNldCBjaGlwLXNwZWNpZmljIGZsYWdzIGZvciB1c2VyIGNvZGUKICAqIEBkZDogdGhlIGluZmluaXBhdGggZGV2aWNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfaWJhNjEyMC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2liYTYxMjAuYwppbmRleCAwNTkxOGUxLi4xYjljMzA4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfaWJhNjEyMC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9pYmE2MTIwLmMKQEAgLTQzLDYgKzQzLDggQEAKICNpbmNsdWRlICJpcGF0aF9rZXJuZWwuaCIKICNpbmNsdWRlICJpcGF0aF9yZWdpc3RlcnMuaCIKIAorc3RhdGljIHZvaWQgaXBhdGhfc2V0dXBfcGVfc2V0ZXh0bGVkKHN0cnVjdCBpcGF0aF9kZXZkYXRhICosIHU2NCwgdTY0KTsKKwogLyoKICAqIFRoaXMgZmlsZSBjb250YWlucyBhbGwgdGhlIGNoaXAtc3BlY2lmaWMgcmVnaXN0ZXIgaW5mb3JtYXRpb24gYW5kCiAgKiBhY2Nlc3MgZnVuY3Rpb25zIGZvciB0aGUgUUxvZ2ljIEluZmluaVBhdGggUENJLUV4cHJlc3MgY2hpcC4KQEAgLTIwNyw4ICsyMDksOCBAQAogCS5rcl9pYnBsbGNmZyA9IElQQVRIX0tSRUdfT0ZGU0VUKElCUExMQ2ZnKSwKIAogCS8qCi0JICogVGhlc2Ugc2hvdWxkIG5vdCBiZSB1c2VkIGRpcmVjdGx5IHZpYSBpcGF0aF9yZWFkX2tyZWc2NCgpLAotCSAqIHVzZSB0aGVtIHdpdGggaXBhdGhfcmVhZF9rcmVnNjRfcG9ydCgpCisJICogVGhlc2Ugc2hvdWxkIG5vdCBiZSB1c2VkIGRpcmVjdGx5IHZpYSBpcGF0aF93cml0ZV9rcmVnNjQoKSwKKwkgKiB1c2UgdGhlbSB3aXRoIGlwYXRoX3dyaXRlX2tyZWc2NF9wb3J0KCksCiAJICovCiAJLmtyX3JjdmhkcmFkZHIgPSBJUEFUSF9LUkVHX09GRlNFVChSY3ZIZHJBZGRyMCksCiAJLmtyX3JjdmhkcnRhaWxhZGRyID0gSVBBVEhfS1JFR19PRkZTRVQoUmN2SGRyVGFpbEFkZHIwKSwKQEAgLTMyMSw2ICszMjMsMTIgQEAKIAlJTkZJTklQQVRIX0hXRV9NU0coU0VSREVTUExMRkFJTEVELCAiU2VyRGVzIFBMTCIpLAogfTsKIAorI2RlZmluZSBUWEVfUElPX1BBUklUWSAoKElORklOSVBBVEhfSFdFX1RYRU1FTVBBUklUWUVSUl9QSU9CVUYgfCBcCisJCSAgICAgICAgSU5GSU5JUEFUSF9IV0VfVFhFTUVNUEFSSVRZRVJSX1BJT1BCQykgXAorCQkgICAgICAgIDw8IElORklOSVBBVEhfSFdFX1RYRU1FTVBBUklUWUVSUl9TSElGVCkKKworc3RhdGljIGludCBpcGF0aF9wZV90eGVfcmVjb3ZlcihzdHJ1Y3QgaXBhdGhfZGV2ZGF0YSAqKTsKKwogLyoqCiAgKiBpcGF0aF9wZV9oYW5kbGVfaHdlcnJvcnMgLSBkaXNwbGF5IGhhcmR3YXJlIGVycm9ycy4KICAqIEBkZDogdGhlIGluZmluaXBhdGggZGV2aWNlCkBAIC0zOTQsMzIgKzQwMiwyMSBAQAogCQkgKiBvY2N1ciBpZiBhIHByb2Nlc3NvciBzcGVjdWxhdGl2ZSByZWFkIGlzIGRvbmUgdG8gdGhlIFBJTwogCQkgKiBidWZmZXIgd2hpbGUgd2UgYXJlIHNlbmRpbmcgYSBwYWNrZXQsIGZvciBleGFtcGxlLgogCQkgKi8KLQkJaWYgKGh3ZXJycyAmICgoSU5GSU5JUEFUSF9IV0VfVFhFTUVNUEFSSVRZRVJSX1BJT0JVRiB8Ci0JCQkgICAgICAgSU5GSU5JUEFUSF9IV0VfVFhFTUVNUEFSSVRZRVJSX1BJT1BCQykKLQkJCSAgICAgIDw8IElORklOSVBBVEhfSFdFX1RYRU1FTVBBUklUWUVSUl9TSElGVCkpIHsKLQkJCWlwYXRoX3N0YXRzLnNwc190eGVwYXJpdHkrKzsKLQkJCWlwYXRoX2RiZygiUmVjb3ZlcmluZyBmcm9tIFRYRSBwYXJpdHkgZXJyb3IgKCVsbHUpLCAiCi0JCQkgICAgCSAgImh3ZXJyc3RhdHVzPSVsbHhcbiIsCi0JCQkJICAodW5zaWduZWQgbG9uZyBsb25nKSBpcGF0aF9zdGF0cy5zcHNfdHhlcGFyaXR5LAotCQkJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZykgaHdlcnJzKTsKLQkJCWlwYXRoX2Rpc2FybV9zZW5kZXJyYnVmcyhkZCk7Ci0JCQlod2VycnMgJj0gfigoSU5GSU5JUEFUSF9IV0VfVFhFTUVNUEFSSVRZRVJSX1BJT0JVRiB8Ci0JCQkJICAgICBJTkZJTklQQVRIX0hXRV9UWEVNRU1QQVJJVFlFUlJfUElPUEJDKQotCQkJCSAgICA8PCBJTkZJTklQQVRIX0hXRV9UWEVNRU1QQVJJVFlFUlJfU0hJRlQpOwotCQkJaWYgKCFod2VycnMpIHsgLyogZWxzZSBsZWF2ZSBpbiBmcmVlemUgbW9kZSAqLwotCQkJCWlwYXRoX3dyaXRlX2tyZWcoZGQsCi0JCQkJCQkgZGQtPmlwYXRoX2tyZWdzLT5rcl9jb250cm9sLAotCQkJCQkJIGRkLT5pcGF0aF9jb250cm9sKTsKLQkJCSAgICByZXR1cm47Ci0JCQl9Ci0JCX0KKwkJaWYgKChod2VycnMgJiBUWEVfUElPX1BBUklUWSkgJiYgaXBhdGhfcGVfdHhlX3JlY292ZXIoZGQpKQorCQkJaHdlcnJzICY9IH5UWEVfUElPX1BBUklUWTsKIAkJaWYgKGh3ZXJycykgewogCQkJLyoKIAkJCSAqIGlmIGFueSBzZXQgdGhhdCB3ZSBhcmVuJ3QgaWdub3Jpbmcgb25seSBtYWtlIHRoZQogCQkJICogY29tcGxhaW50IG9uY2UsIGluIGNhc2UgaXQncyBzdHVjayBvciByZWN1cnJpbmcsCiAJCQkgKiBhbmQgd2UgZ2V0IGhlcmUgbXVsdGlwbGUgdGltZXMKKwkJCSAqIEZvcmNlIGxpbmsgZG93biwgc28gc3dpdGNoIGtub3dzLCBhbmQKKwkJCSAqIExFRHMgYXJlIHR1cm5lZCBvZmYKIAkJCSAqLwogCQkJaWYgKGRkLT5pcGF0aF9mbGFncyAmIElQQVRIX0lOSVRURUQpIHsKKwkJCQlpcGF0aF9zZXRfbGlua3N0YXRlKGRkLCBJUEFUSF9JQl9MSU5LRE9XTik7CisJCQkJaXBhdGhfc2V0dXBfcGVfc2V0ZXh0bGVkKGRkLAorCQkJCQlJTkZJTklQQVRIX0lCQ1NfTF9TVEFURV9ET1dOLAorCQkJCQlJTkZJTklQQVRIX0lCQ1NfTFRfU1RBVEVfRElTQUJMRUQpOwogCQkJCWlwYXRoX2Rldl9lcnIoZGQsICJGYXRhbCBIYXJkd2FyZSBFcnJvciAoZnJlZXplICIKIAkJCQkJICAgICAgIm1vZGUpLCBubyBsb25nZXIgdXNhYmxlLCBTTiAlLjE2c1xuIiwKIAkJCQkJCSAgZGQtPmlwYXRoX3NlcmlhbCk7CkBAIC00OTMsNyArNDkwLDggQEAKIAkJCQkgZGQtPmlwYXRoX2h3ZXJybWFzayk7CiAJfQogCi0JaXBhdGhfZGV2X2VycihkZCwgIiVzIGhhcmR3YXJlIGVycm9yXG4iLCBtc2cpOworCWlmICgqbXNnKQorCQlpcGF0aF9kZXZfZXJyKGRkLCAiJXMgaGFyZHdhcmUgZXJyb3JcbiIsIG1zZyk7CiAJaWYgKGlzZmF0YWwgJiYgIWlwYXRoX2RpYWdfaW51c2UgJiYgZGQtPmlwYXRoX2ZyZWV6ZW1zZykgewogCQkvKgogCQkgKiBmb3IgL3N5cyBzdGF0dXMgZmlsZSA7IGlmIG5vIHRyYWlsaW5nIH0gaXMgY29waWVkLCB3ZSdsbApAQCAtNTgxLDYgKzU3OSw4IEBACiAKIAlpZiAoIShleHRzdmFsICYgSU5GSU5JUEFUSF9FWFRTX01FTUJJU1RfRU5EVEVTVCkpCiAJCWlwYXRoX2Rldl9lcnIoZGQsICJNZW1CSVNUIGRpZCBub3QgY29tcGxldGUhXG4iKTsKKwlpZiAoZXh0c3ZhbCAmIElORklOSVBBVEhfRVhUU19NRU1CSVNUX0ZPVU5EKQorCQlpcGF0aF9kYmcoIk1lbUJJU1QgY29ycmVjdGVkXG4iKTsKIAogCXZhbCA9IH4wVUxMOwkvKiBiYXJyaW5nIGJ1Z3MsIGFsbCBod2Vycm9ycyBiZWNvbWUgaW50ZXJydXB0cywgKi8KIApAQCAtMTMzMCw2ICsxMzMwLDM1IEBACiAJZGQtPmlwYXRoX2lycSA9IDA7CiB9CiAKKy8qCisgKiBPbiBwbGF0Zm9ybXMgdXNpbmcgdGhpcyBjaGlwLCBhbmQgbm90IGhhdmluZyBvcmRlcmVkIFdDIHN0b3Jlcywgd2UKKyAqIGNhbiBnZXQgVFhFIHBhcml0eSBlcnJvcnMgZHVlIHRvIHNwZWN1bGF0aXZlIHJlYWRzIHRvIHRoZSBQSU8gYnVmZmVycywKKyAqIGFuZCB0aGlzLCBkdWUgdG8gYSBjaGlwIGJ1ZyBjYW4gcmVzdWx0IGluIChtYW55KSBmYWxzZSBwYXJpdHkgZXJyb3IKKyAqIHJlcG9ydHMuICBTbyBpdCdzIGEgZGVidWcgcHJpbnQgb24gdGhvc2UsIGFuZCBhbiBpbmZvIHByaW50IG9uIHN5c3RlbXMKKyAqIHdoZXJlIHRoZSBzcGVjdWxhdGl2ZSByZWFkcyBkb24ndCBvY2N1ci4KKyAqIEJlY2F1c2Ugd2UgY2FuIGdldCBsb3RzIG9mIGZhbHNlIGVycm9ycywgd2UgaGF2ZSBubyB1cHBlciBsaW1pdAorICogb24gcmVjb3ZlcnkgYXR0ZW1wdHMgb24gdGhvc2UgcGxhdGZvcm1zLgorICovCitzdGF0aWMgaW50IGlwYXRoX3BlX3R4ZV9yZWNvdmVyKHN0cnVjdCBpcGF0aF9kZXZkYXRhICpkZCkKK3sKKwlpZiAoaXBhdGhfdW5vcmRlcmVkX3djKCkpCisJCWlwYXRoX2RiZygiUmVjb3ZlcmluZyBmcm9tIFRYRSBQSU8gcGFyaXR5IGVycm9yXG4iKTsKKwllbHNlIHsKKwkJaW50IGNudCA9ICsraXBhdGhfc3RhdHMuc3BzX3R4ZXBhcml0eTsKKwkJaWYgKGNudCA+PSBJUEFUSF9NQVhfUEFSSVRZX0FUVEVNUFRTKSAgeworCQkJaWYgKGNudCA9PSBJUEFUSF9NQVhfUEFSSVRZX0FUVEVNUFRTKQorCQkJCWlwYXRoX2Rldl9lcnIoZGQsCisJCQkJCSJUb28gbWFueSBhdHRlbXB0cyB0byByZWNvdmVyIGZyb20gIgorCQkJCQkiVFhFIHBhcml0eSwgZ2l2aW5nIHVwXG4iKTsKKwkJCXJldHVybiAwOworCQl9CisJCWRldl9pbmZvKCZkZC0+cGNpZGV2LT5kZXYsCisJCQkiUmVjb3ZlcmluZyBmcm9tIFRYRSBQSU8gcGFyaXR5IGVycm9yXG4iKTsKKwl9CisJaXBhdGhfZGlzYXJtX3NlbmRlcnJidWZzKGRkLCAxKTsKKwlyZXR1cm4gMTsKK30KKwogLyoqCiAgKiBpcGF0aF9pbml0X2liYTYxMjBfZnVuY3MgLSBzZXQgdXAgdGhlIGNoaXAtc3BlY2lmaWMgZnVuY3Rpb24gcG9pbnRlcnMKICAqIEBkZDogdGhlIGluZmluaXBhdGggZGV2aWNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfaW5pdF9jaGlwLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfaW5pdF9jaGlwLmMKaW5kZXggZDRmNmI1MjMuLjcwNDViYTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9pbml0X2NoaXAuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfaW5pdF9jaGlwLmMKQEAgLTIxNiw2ICsyMTYsMjAgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgc3RydWN0IGlwYXRoX3BvcnRkYXRhICpjcmVhdGVfcG9ydGRhdGEwKHN0cnVjdCBpcGF0aF9kZXZkYXRhICpkZCkKK3sKKwlzdHJ1Y3QgaXBhdGhfcG9ydGRhdGEgKnBkID0gTlVMTDsKKworCXBkID0ga3phbGxvYyhzaXplb2YoKnBkKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHBkKSB7CisJCXBkLT5wb3J0X2RkID0gZGQ7CisJCXBkLT5wb3J0X2NudCA9IDE7CisJCS8qIFRoZSBwb3J0IDAgcGtleSB0YWJsZSBpcyB1c2VkIGJ5IHRoZSBsYXllciBpbnRlcmZhY2UuICovCisJCXBkLT5wb3J0X3BrZXlzWzBdID0gSVBBVEhfREVGQVVMVF9QX0tFWTsKKwl9CisJcmV0dXJuIHBkOworfQorCiBzdGF0aWMgaW50IGluaXRfY2hpcF9maXJzdChzdHJ1Y3QgaXBhdGhfZGV2ZGF0YSAqZGQsCiAJCQkgICBzdHJ1Y3QgaXBhdGhfcG9ydGRhdGEgKipwZHApCiB7CkBAIC0yNzEsMjAgKzI4NSwxNiBAQAogCQlnb3RvIGRvbmU7CiAJfQogCi0JZGQtPmlwYXRoX3BkWzBdID0ga3phbGxvYyhzaXplb2YoKnBkKSwgR0ZQX0tFUk5FTCk7CisJcGQgPSBjcmVhdGVfcG9ydGRhdGEwKGRkKTsKIAotCWlmICghZGQtPmlwYXRoX3BkWzBdKSB7CisJaWYgKCFwZCkgewogCQlpcGF0aF9kZXZfZXJyKGRkLCAiVW5hYmxlIHRvIGFsbG9jYXRlIHBvcnRkYXRhIGZvciBwb3J0ICIKIAkJCSAgICAgICIwLCBmYWlsaW5nXG4iKTsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBkb25lOwogCX0KLQlwZCA9IGRkLT5pcGF0aF9wZFswXTsKLQlwZC0+cG9ydF9kZCA9IGRkOwotCXBkLT5wb3J0X3BvcnQgPSAwOwotCXBkLT5wb3J0X2NudCA9IDE7Ci0JLyogVGhlIHBvcnQgMCBwa2V5IHRhYmxlIGlzIHVzZWQgYnkgdGhlIGxheWVyIGludGVyZmFjZS4gKi8KLQlwZC0+cG9ydF9wa2V5c1swXSA9IElQQVRIX0RFRkFVTFRfUF9LRVk7CisJZGQtPmlwYXRoX3BkWzBdID0gcGQ7CisKIAlkZC0+aXBhdGhfcmN2dGlkY250ID0KIAkJaXBhdGhfcmVhZF9rcmVnMzIoZGQsIGRkLT5pcGF0aF9rcmVncy0+a3JfcmN2dGlkY250KTsKIAlkZC0+aXBhdGhfcmN2dGlkYmFzZSA9CkBAIC01OTAsNiArNjAwLDEwIEBACiAJCWdvdG8gZG9uZTsKIAl9CiAKKworCS8qIGNsZWFyIGRpYWdjdHJsIHJlZ2lzdGVyLCBpbiBjYXNlIGRpYWdzIHdlcmUgcnVubmluZyBhbmQgY3Jhc2hlZCAqLworCWlwYXRoX3dyaXRlX2tyZWcgKGRkLCBkZC0+aXBhdGhfa3JlZ3MtPmtyX2h3ZGlhZ2N0cmwsIDApOworCiAJLyogY2xlYXIgdGhlIGluaXRpYWwgcmVzZXQgZmxhZywgaW4gY2FzZSBmaXJzdCBkcml2ZXIgbG9hZCAqLwogCWlwYXRoX3dyaXRlX2tyZWcoZGQsIGRkLT5pcGF0aF9rcmVncy0+a3JfZXJyb3JjbGVhciwKIAkJCSBJTkZJTklQQVRIX0VfUkVTRVQpOwpAQCAtNjY4LDYgKzY4Miw3IEBACiB7CiAJaW50IHJldCA9IDAsIGk7CiAJdTMyIHZhbDMyLCBrcGlvYnVmczsKKwl1MzIgcGlvYnVmcywgdXBvcnRzOwogCXU2NCB2YWw7CiAJc3RydWN0IGlwYXRoX3BvcnRkYXRhICpwZCA9IE5VTEw7IC8qIGtlZXAgZ2NjNCBoYXBweSAqLwogCWdmcF90IGdmcF9mbGFncyA9IEdGUF9VU0VSIHwgX19HRlBfQ09NUDsKQEAgLTcwMiwxNiArNzE3LDE3IEBACiAJICogdGhlIGluIG1lbW9yeSBETUEnZWQgY29waWVzIG9mIHRoZSByZWdpc3RlcnMuICBUaGlzIGhhcyB0bwogCSAqIGJlIGRvbmUgZWFybHksIGJlZm9yZSB3ZSBjYWxjdWxhdGUgbGFzdHBvcnQsIGV0Yy4KIAkgKi8KLQl2YWwgPSBkZC0+aXBhdGhfcGlvYmNudDJrICsgZGQtPmlwYXRoX3Bpb2JjbnQ0azsKKwlwaW9idWZzID0gZGQtPmlwYXRoX3Bpb2JjbnQyayArIGRkLT5pcGF0aF9waW9iY250NGs7CiAJLyoKIAkgKiBjYWxjIG51bWJlciBvZiBwaW9hdmFpbCByZWdpc3RlcnMsIGFuZCBzYXZlIGl0OyB3ZSBoYXZlIDIKIAkgKiBiaXRzIHBlciBidWZmZXIuCiAJICovCi0JZGQtPmlwYXRoX3Bpb2F2cmVncyA9IEFMSUdOKHZhbCwgc2l6ZW9mKHU2NCkgKiBCSVRTX1BFUl9CWVRFIC8gMikKKwlkZC0+aXBhdGhfcGlvYXZyZWdzID0gQUxJR04ocGlvYnVmcywgc2l6ZW9mKHU2NCkgKiBCSVRTX1BFUl9CWVRFIC8gMikKIAkJLyAoc2l6ZW9mKHU2NCkgKiBCSVRTX1BFUl9CWVRFIC8gMik7CisJdXBvcnRzID0gZGQtPmlwYXRoX2NmZ3BvcnRzID8gZGQtPmlwYXRoX2NmZ3BvcnRzIC0gMSA6IDA7CiAJaWYgKGlwYXRoX2twaW9idWZzID09IDApIHsKIAkJLyogbm90IHNldCBieSB1c2VyICh0aGlzIGlzIGRlZmF1bHQpICovCi0JCWlmICgoZGQtPmlwYXRoX3Bpb2JjbnQyayArIGRkLT5pcGF0aF9waW9iY250NGspID4gMTI4KQorCQlpZiAocGlvYnVmcyA+PSAodXBvcnRzICogSVBBVEhfTUlOX1VTRVJfUE9SVF9CVUZDTlQpICsgMzIpCiAJCQlrcGlvYnVmcyA9IDMyOwogCQllbHNlCiAJCQlrcGlvYnVmcyA9IDE2OwpAQCAtNzE5LDMxICs3MzUsMjUgQEAKIAllbHNlCiAJCWtwaW9idWZzID0gaXBhdGhfa3Bpb2J1ZnM7CiAKLQlpZiAoa3Bpb2J1ZnMgPgotCSAgICAoZGQtPmlwYXRoX3Bpb2JjbnQyayArIGRkLT5pcGF0aF9waW9iY250NGsgLQotCSAgICAgKGRkLT5pcGF0aF9jZmdwb3J0cyAqIElQQVRIX01JTl9VU0VSX1BPUlRfQlVGQ05UKSkpIHsKLQkJaSA9IGRkLT5pcGF0aF9waW9iY250MmsgKyBkZC0+aXBhdGhfcGlvYmNudDRrIC0KLQkJCShkZC0+aXBhdGhfY2ZncG9ydHMgKiBJUEFUSF9NSU5fVVNFUl9QT1JUX0JVRkNOVCk7CisJaWYgKGtwaW9idWZzICsgKHVwb3J0cyAqIElQQVRIX01JTl9VU0VSX1BPUlRfQlVGQ05UKSA+IHBpb2J1ZnMpIHsKKwkJaSA9IChpbnQpIHBpb2J1ZnMgLQorCQkJKGludCkgKHVwb3J0cyAqIElQQVRIX01JTl9VU0VSX1BPUlRfQlVGQ05UKTsKIAkJaWYgKGkgPCAwKQogCQkJaSA9IDA7Ci0JCWRldl9pbmZvKCZkZC0+cGNpZGV2LT5kZXYsICJBbGxvY2F0aW5nICVkIFBJTyBidWZzIGZvciAiCi0JCQkgImtlcm5lbCBsZWF2ZXMgdG9vIGZldyBmb3IgJWQgdXNlciBwb3J0cyAiCisJCWRldl9pbmZvKCZkZC0+cGNpZGV2LT5kZXYsICJBbGxvY2F0aW5nICVkIFBJTyBidWZzIG9mICIKKwkJCSAiJWQgZm9yIGtlcm5lbCBsZWF2ZXMgdG9vIGZldyBmb3IgJWQgdXNlciBwb3J0cyAiCiAJCQkgIiglZCBlYWNoKTsgdXNpbmcgJXVcbiIsIGtwaW9idWZzLAotCQkJIGRkLT5pcGF0aF9jZmdwb3J0cyAtIDEsCi0JCQkgSVBBVEhfTUlOX1VTRVJfUE9SVF9CVUZDTlQsIGkpOworCQkJIHBpb2J1ZnMsIHVwb3J0cywgSVBBVEhfTUlOX1VTRVJfUE9SVF9CVUZDTlQsIGkpOwogCQkvKgogCQkgKiBzaG91bGRuJ3QgY2hhbmdlIGlwYXRoX2twaW9idWZzLCBiZWNhdXNlIGNvdWxkIGJlCiAJCSAqIGRpZmZlcmVudCBmb3IgZGlmZmVyZW50IGRldmljZXMuLi4KIAkJICovCiAJCWtwaW9idWZzID0gaTsKIAl9Ci0JZGQtPmlwYXRoX2xhc3Rwb3J0X3Bpb2J1ZiA9Ci0JCWRkLT5pcGF0aF9waW9iY250MmsgKyBkZC0+aXBhdGhfcGlvYmNudDRrIC0ga3Bpb2J1ZnM7Ci0JZGQtPmlwYXRoX3BidWZzcG9ydCA9IGRkLT5pcGF0aF9jZmdwb3J0cyA+IDEKLQkJPyBkZC0+aXBhdGhfbGFzdHBvcnRfcGlvYnVmIC8gKGRkLT5pcGF0aF9jZmdwb3J0cyAtIDEpCi0JCTogMDsKLQl2YWwzMiA9IGRkLT5pcGF0aF9sYXN0cG9ydF9waW9idWYgLQotCQkoZGQtPmlwYXRoX3BidWZzcG9ydCAqIChkZC0+aXBhdGhfY2ZncG9ydHMgLSAxKSk7CisJZGQtPmlwYXRoX2xhc3Rwb3J0X3Bpb2J1ZiA9IHBpb2J1ZnMgLSBrcGlvYnVmczsKKwlkZC0+aXBhdGhfcGJ1ZnNwb3J0ID0KKwkJdXBvcnRzID8gZGQtPmlwYXRoX2xhc3Rwb3J0X3Bpb2J1ZiAvIHVwb3J0cyA6IDA7CisJdmFsMzIgPSBkZC0+aXBhdGhfbGFzdHBvcnRfcGlvYnVmIC0gKGRkLT5pcGF0aF9wYnVmc3BvcnQgKiB1cG9ydHMpOwogCWlmICh2YWwzMiA+IDApIHsKIAkJaXBhdGhfZGJnKCJhbGxvY2F0aW5nICV1IHBidWZzL3BvcnQgbGVhdmVzICV1IHVudXNlZCwgIgogCQkJICAiYWRkIHRvIGtlcm5lbFxuIiwgZGQtPmlwYXRoX3BidWZzcG9ydCwgdmFsMzIpOwpAQCAtNzU0LDggKzc2NCw3IEBACiAJZGQtPmlwYXRoX2xhc3RwaW9pbmRleCA9IGRkLT5pcGF0aF9sYXN0cG9ydF9waW9idWY7CiAJaXBhdGhfY2RiZyhWRVJCT1NFLCAiJWQgUElPIGJ1ZnMgZm9yIGtlcm5lbCBvdXQgb2YgJWQgdG90YWwgJXUgIgogCQkgICAiZWFjaCBmb3IgJXUgdXNlciBwb3J0c1xuIiwga3Bpb2J1ZnMsCi0JCSAgIGRkLT5pcGF0aF9waW9iY250MmsgKyBkZC0+aXBhdGhfcGlvYmNudDRrLAotCQkgICBkZC0+aXBhdGhfcGJ1ZnNwb3J0LCBkZC0+aXBhdGhfY2ZncG9ydHMgLSAxKTsKKwkJICAgcGlvYnVmcywgZGQtPmlwYXRoX3BidWZzcG9ydCwgdXBvcnRzKTsKIAogCWRkLT5pcGF0aF9mX2Vhcmx5X2luaXQoZGQpOwogCkBAIC04MzksMTEgKzg0OCwyNCBAQAogCSAqIFNldCB1cCB0aGUgcG9ydCAwIChrZXJuZWwpIHJjdmhkciBxIGFuZCBlZ3IgVElEcy4gIElmIGRvaW5nCiAJICogcmUtaW5pdCwgdGhlIHNpbXBsZXN0IHdheSB0byBoYW5kbGUgdGhpcyBpcyB0byBmcmVlCiAJICogZXhpc3RpbmcsIGFuZCByZS1hbGxvY2F0ZS4KKwkgKiBOZWVkIHRvIHJlLWNyZWF0ZSByZXN0IG9mIHBvcnQgMCBwb3J0ZGF0YSBhcyB3ZWxsLgogCSAqLwogCWlmIChyZWluaXQpIHsKLQkJc3RydWN0IGlwYXRoX3BvcnRkYXRhICpwZCA9IGRkLT5pcGF0aF9wZFswXTsKLQkJZGQtPmlwYXRoX3BkWzBdID0gTlVMTDsKLQkJaXBhdGhfZnJlZV9wZGRhdGEoZGQsIHBkKTsKKwkJLyogQWxsb2MgYW5kIGluaXQgbmV3IGlwYXRoX3BvcnRkYXRhIGZvciBwb3J0MCwKKwkJICogVGhlbiBmcmVlIG9sZCBwZC4gQ291bGQgbGVhZCB0byBmcmFnbWVudGF0aW9uLCBidXQgYWxzbworCQkgKiBtYWtlcyBsYXRlciBzdXBwb3J0IGZvciBob3Qtc3dhcCBlYXNpZXIuCisJCSAqLworCQlzdHJ1Y3QgaXBhdGhfcG9ydGRhdGEgKm5wZDsKKwkJbnBkID0gY3JlYXRlX3BvcnRkYXRhMChkZCk7CisJCWlmIChucGQpIHsKKwkJCWlwYXRoX2ZyZWVfcGRkYXRhKGRkLCBwZCk7CisJCQlkZC0+aXBhdGhfcGRbMF0gPSBwZCA9IG5wZDsKKwkJfSBlbHNlIHsKKwkJCWlwYXRoX2Rldl9lcnIoZGQsICJVbmFibGUgdG8gYWxsb2NhdGUgcG9ydGRhdGEgZm9yIgorCQkJCSAgICAgICIgIHBvcnQgMCwgZmFpbGluZ1xuIik7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJZ290byBkb25lOworCQl9CiAJfQogCWRkLT5pcGF0aF9mX3RpZHRlbXBsYXRlKGRkKTsKIAlyZXQgPSBpcGF0aF9jcmVhdGVfcmN2aGRycShkZCwgcGQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2ludHIuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9pbnRyLmMKaW5kZXggNzJiOWUyNy4uNDVkMDMzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2ludHIuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfaW50ci5jCkBAIC0zOCwxMCArMzgsMzkgQEAKICNpbmNsdWRlICJpcGF0aF9jb21tb24uaCIKIAogLyoKKyAqIGNsZWFyICh3cml0ZSkgYSBwaW8gYnVmZmVyLCB0byBjbGVhciBhIHBhcml0eSBlcnJvci4gICBUaGlzIHJvdXRpbmUKKyAqIHNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGVuIGluIGZyZWV6ZSBtb2RlLCBhbmQgdGhlIGJ1ZmZlciBzaG91bGQgYmUKKyAqIGNhbmNlbGVkIGFmdGVyd2FyZHMuCisgKi8KK3N0YXRpYyB2b2lkIGlwYXRoX2NscnBpb2J1ZihzdHJ1Y3QgaXBhdGhfZGV2ZGF0YSAqZGQsIHUzMiBwbnVtKQoreworCXUzMiBfX2lvbWVtICpwYnVmOworCXUzMiBkd2NudDsgLyogZHdvcmQgY291bnQgdG8gd3JpdGUgKi8KKwlpZiAocG51bSA8IGRkLT5pcGF0aF9waW9iY250MmspIHsKKwkJcGJ1ZiA9ICh1MzIgX19pb21lbSAqKSAoZGQtPmlwYXRoX3BpbzJrYmFzZSArIHBudW0gKgorCQkJZGQtPmlwYXRoX3BhbGlnbik7CisJCWR3Y250ID0gZGQtPmlwYXRoX3Bpb3NpemUyayA+PiAyOworCX0KKwllbHNlIHsKKwkJcGJ1ZiA9ICh1MzIgX19pb21lbSAqKSAoZGQtPmlwYXRoX3BpbzRrYmFzZSArCisJCQkocG51bSAtIGRkLT5pcGF0aF9waW9iY250MmspICogZGQtPmlwYXRoXzRrYWxpZ24pOworCQlkd2NudCA9IGRkLT5pcGF0aF9waW9zaXplNGsgPj4gMjsKKwl9CisJZGV2X2luZm8oJmRkLT5wY2lkZXYtPmRldiwKKwkJIlJld3JpdGUgUElPIGJ1ZmZlciAldSwgdG8gcmVjb3ZlciBmcm9tIHBhcml0eSBlcnJvclxuIiwKKwkJcG51bSk7CisJKnBidWYgPSBkd2NudCsxOyAvKiBubyBmbHVzaCByZXF1aXJlZCwgc2luY2UgYWxyZWFkeSBpbiBmcmVlemUgKi8KKwl3aGlsZSgtLWR3Y250KQorCQkqcGJ1ZisrID0gMDsKK30KKworLyoKICAqIENhbGxlZCB3aGVuIHdlIG1pZ2h0IGhhdmUgYW4gZXJyb3IgdGhhdCBpcyBzcGVjaWZpYyB0byBhIHBhcnRpY3VsYXIKICAqIFBJTyBidWZmZXIsIGFuZCBtYXkgbmVlZCB0byBjYW5jZWwgdGhhdCBidWZmZXIsIHNvIGl0IGNhbiBiZSByZS11c2VkLgorICogSWYgcmV3cml0ZSBpcyB0cnVlLCBhbmQgYml0cyBhcmUgc2V0IGluIHRoZSBzZW5kYnVmZmVycm9yIHJlZ2lzdGVycywKKyAqIHdlJ2xsIHdyaXRlIHRvIHRoZSBidWZmZXIsIGZvciBlcnJvciByZWNvdmVyeSBvbiBwYXJpdHkgZXJyb3JzLgogICovCi12b2lkIGlwYXRoX2Rpc2FybV9zZW5kZXJyYnVmcyhzdHJ1Y3QgaXBhdGhfZGV2ZGF0YSAqZGQpCit2b2lkIGlwYXRoX2Rpc2FybV9zZW5kZXJyYnVmcyhzdHJ1Y3QgaXBhdGhfZGV2ZGF0YSAqZGQsIGludCByZXdyaXRlKQogewogCXUzMiBwaW9iY250OwogCXVuc2lnbmVkIGxvbmcgc2J1Zls0XTsKQEAgLTc0LDggKzEwMywxMSBAQAogCQl9CiAKIAkJZm9yIChpID0gMDsgaSA8IHBpb2JjbnQ7IGkrKykKLQkJCWlmICh0ZXN0X2JpdChpLCBzYnVmKSkKKwkJCWlmICh0ZXN0X2JpdChpLCBzYnVmKSkgeworCQkJCWlmIChyZXdyaXRlKQorCQkJCQlpcGF0aF9jbHJwaW9idWYoZGQsIGkpOwogCQkJCWlwYXRoX2Rpc2FybV9waW9idWZzKGRkLCBpLCAxKTsKKwkJCX0KIAkJZGQtPmlwYXRoX2xhc3RjYW5jZWwgPSBqaWZmaWVzKzM7IC8qIG5vIGFybWxhdW5jaCBmb3IgYSBiaXQgKi8KIAl9CiB9CkBAIC0xMTQsNyArMTQ2LDcgQEAKIHsKIAl1NjQgaWdub3JlX3RoaXNfdGltZSA9IDA7CiAKLQlpcGF0aF9kaXNhcm1fc2VuZGVycmJ1ZnMoZGQpOworCWlwYXRoX2Rpc2FybV9zZW5kZXJyYnVmcyhkZCwgMCk7CiAJaWYgKChlcnJzICYgRV9TVU1fTElOS19QS1RFUlJTKSAmJgogCSAgICAhKGRkLT5pcGF0aF9mbGFncyAmIElQQVRIX0xJTktBQ1RJVkUpKSB7CiAJCS8qCkBAIC00MDMsMTAgKzQzNSwxMyBAQAogCSAqIGhhcHBlbnMgc28gb2Z0ZW4gd2UgbmV2ZXIgd2FudCB0byBjb3VudCBpdC4KIAkgKi8KIAlpZiAoZGQtPmlwYXRoX2xhc3RlcnJvciAmIH5JTkZJTklQQVRIX0VfSUJTVEFUVVNDSEFOR0VEKSB7Ci0JCWlwYXRoX2RlY29kZV9lcnIobXNnLCBzaXplb2YgbXNnLCBkZC0+aXBhdGhfbGFzdGVycm9yICYKLQkJCQkgfklORklOSVBBVEhfRV9JQlNUQVRVU0NIQU5HRUQpOworCQlpbnQgaXNlcnI7CisJCWlzZXJyID0gaXBhdGhfZGVjb2RlX2Vycihtc2csIHNpemVvZiBtc2csCisJCQkJZGQtPmlwYXRoX2xhc3RlcnJvciAmCisJCQkJfklORklOSVBBVEhfRV9JQlNUQVRVU0NIQU5HRUQpOwogCQlpZiAoZGQtPmlwYXRoX2xhc3RlcnJvciAmCi0JCSAgICB+KElORklOSVBBVEhfRV9SUkNWRUdSRlVMTCB8IElORklOSVBBVEhfRV9SUkNWSERSRlVMTCkpCisJCQl+KElORklOSVBBVEhfRV9SUkNWRUdSRlVMTCB8CisJCQlJTkZJTklQQVRIX0VfUlJDVkhEUkZVTEwgfCBJTkZJTklQQVRIX0VfUEtURVJSUykpCiAJCQlpcGF0aF9kZXZfZXJyKGRkLCAiU3VwcHJlc3NlZCAldSBtZXNzYWdlcyBmb3IgIgogCQkJCSAgICAgICJmYXN0LXJlcGVhdGluZyBlcnJvcnMgKCVzKSAoJWxseClcbiIsCiAJCQkJICAgICAgc3VwcF9tc2dzLCBtc2csCkBAIC00MjAsOCArNDU1LDEzIEBACiAJCQkgKiB0aGVtLiBTbyBvbmx5IGNvbXBsYWluIGFib3V0IHRoZXNlIGF0IGRlYnVnCiAJCQkgKiBsZXZlbC4KIAkJCSAqLwotCQkJaXBhdGhfZGJnKCJTdXBwcmVzc2VkICV1IG1lc3NhZ2VzIGZvciAlc1xuIiwKLQkJCQkgIHN1cHBfbXNncywgbXNnKTsKKwkJCWlmIChpc2VycikKKwkJCQlpcGF0aF9kYmcoIlN1cHByZXNzZWQgJXUgbWVzc2FnZXMgZm9yICVzXG4iLAorCQkJCQkgIHN1cHBfbXNncywgbXNnKTsKKwkJCWVsc2UKKwkJCQlpcGF0aF9jZGJnKEVSUlBLVCwKKwkJCQkJIlN1cHByZXNzZWQgJXUgbWVzc2FnZXMgZm9yICVzXG4iLAorCQkJCQkgIHN1cHBfbXNncywgbXNnKTsKIAkJfQogCX0KIH0KQEAgLTQ2Miw3ICs1MDIsNyBAQAogewogCWNoYXIgbXNnWzUxMl07CiAJdTY0IGlnbm9yZV90aGlzX3RpbWUgPSAwOwotCWludCBpOworCWludCBpLCBpc2VyciA9IDA7CiAJaW50IGNoa2VycnBrdHMgPSAwLCBub3ByaW50ID0gMDsKIAl1bnNpZ25lZCBzdXBwX21zZ3M7CiAKQEAgLTUwMiw2ICs1NDIsNyBAQAogCX0KIAogCWlmIChzdXBwX21zZ3MgPT0gMjUwMDAwKSB7CisJCWludCBzX2lzZXJyOwogCQkvKgogCQkgKiBJdCdzIG5vdCBlbnRpcmVseSByZWFzb25hYmxlIGFzc3VtaW5nIHRoYXQgdGhlIGVycm9ycyBzZXQKIAkJICogaW4gdGhlIGxhc3QgY2xlYXIgcGVyaW9kIGFyZSBhbGwgcmVzcG9uc2libGUgZm9yIHRoZQpAQCAtNTExLDE3ICs1NTIsMTcgQEAKIAkJZGQtPmlwYXRoX21hc2tlZGVycnMgfD0gZGQtPmlwYXRoX2xhc3RlcnJvciB8IGVycnM7CiAJCWlwYXRoX3dyaXRlX2tyZWcoZGQsIGRkLT5pcGF0aF9rcmVncy0+a3JfZXJyb3JtYXNrLAogCQkJCSB+ZGQtPmlwYXRoX21hc2tlZGVycnMpOwotCQlpcGF0aF9kZWNvZGVfZXJyKG1zZywgc2l6ZW9mIG1zZywKKwkJc19pc2VyciA9IGlwYXRoX2RlY29kZV9lcnIobXNnLCBzaXplb2YgbXNnLAogCQkJCSAoZGQtPmlwYXRoX21hc2tlZGVycnMgJiB+ZGQtPgogCQkJCSAgaXBhdGhfaWdub3JlZGVycnMpKTsKIAogCQlpZiAoKGRkLT5pcGF0aF9tYXNrZWRlcnJzICYgfmRkLT5pcGF0aF9pZ25vcmVkZXJycykgJgotCQkgICAgfihJTkZJTklQQVRIX0VfUlJDVkVHUkZVTEwgfCBJTkZJTklQQVRIX0VfUlJDVkhEUkZVTEwpKQotCQkJaXBhdGhfZGV2X2VycihkZCwgIkRpc2FibGluZyBlcnJvcihzKSAlbGx4IGJlY2F1c2UgIgotCQkJCSAgICAgICJvY2N1cnJpbmcgdG9vIGZyZXF1ZW50bHkgKCVzKVxuIiwKLQkJCQkgICAgICAodW5zaWduZWQgbG9uZyBsb25nKQotCQkJCSAgICAgIChkZC0+aXBhdGhfbWFza2VkZXJycyAmCi0JCQkJICAgICAgIH5kZC0+aXBhdGhfaWdub3JlZGVycnMpLCBtc2cpOworCQkJfihJTkZJTklQQVRIX0VfUlJDVkVHUkZVTEwgfAorCQkJSU5GSU5JUEFUSF9FX1JSQ1ZIRFJGVUxMIHwgSU5GSU5JUEFUSF9FX1BLVEVSUlMpKQorCQkJaXBhdGhfZGV2X2VycihkZCwgIlRlbXBvcmFyaWx5IGRpc2FibGluZyAiCisJCQkgICAgImVycm9yKHMpICVsbHggcmVwb3J0aW5nOyB0b28gZnJlcXVlbnQgKCVzKVxuIiwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKSAoZGQtPmlwYXRoX21hc2tlZGVycnMgJgorCQkJCX5kZC0+aXBhdGhfaWdub3JlZGVycnMpLCBtc2cpOwogCQllbHNlIHsKIAkJCS8qCiAJCQkgKiByY3ZlZ3JmdWxsIGFuZCByY3ZoZHJxZnVsbCBhcmUgIm5vcm1hbCIsCkBAIC01MzAsOCArNTcxLDE1IEBACiAJCQkgKiBwcm9jZXNzaW5nIHRoZW0uICBTbyBvbmx5IGNvbXBsYWluIGFib3V0CiAJCQkgKiB0aGVzZSBhdCBkZWJ1ZyBsZXZlbC4KIAkJCSAqLwotCQkJaXBhdGhfZGJnKCJEaXNhYmxpbmcgZnJlcXVlbnQgcXVldWUgZnVsbCBlcnJvcnMgIgotCQkJCSAgIiglcylcbiIsIG1zZyk7CisJCQlpZiAoc19pc2VycikKKwkJCQlpcGF0aF9kYmcoIlRlbXBvcmFyaWx5IGRpc2FibGluZyByZXBvcnRpbmcgIgorCQkJCSAgICAidG9vIGZyZXF1ZW50IHF1ZXVlIGZ1bGwgZXJyb3JzICglcylcbiIsCisJCQkJICAgIG1zZyk7CisJCQllbHNlCisJCQkJaXBhdGhfY2RiZyhFUlJQS1QsCisJCQkJICAgICJUZW1wb3JhcmlseSBkaXNhYmxpbmcgcmVwb3J0aW5nIHRvbyIKKwkJCQkgICAgIiBmcmVxdWVudCBwYWNrZXQgZXJyb3JzICglcylcbiIsCisJCQkJICAgIG1zZyk7CiAJCX0KIAogCQkvKgpAQCAtNTg5LDYgKzYzNyw4IEBACiAJCWlwYXRoX3N0YXRzLnNwc19jcmNlcnJzKys7CiAJCWNoa2VycnBrdHMgPSAxOwogCX0KKwlpc2VyciA9IGVycnMgJiB+KEVfU1VNX1BLVEVSUlMgfCBJTkZJTklQQVRIX0VfUEtURVJSUyk7CisKIAogCS8qCiAJICogV2UgZG9uJ3Qgd2FudCB0byBwcmludCB0aGVzZSB0d28gYXMgdGhleSBoYXBwZW4sIG9yIHdlIGNhbiBtYWtlCkBAIC02NzcsOCArNzI3LDEzIEBACiAJCSpkZC0+aXBhdGhfc3RhdHVzcCAmPSB+SVBBVEhfU1RBVFVTX0lCX0NPTkY7CiAJfQogCi0JaWYgKCFub3ByaW50ICYmICptc2cpCi0JCWlwYXRoX2Rldl9lcnIoZGQsICIlcyBlcnJvclxuIiwgbXNnKTsKKwlpZiAoIW5vcHJpbnQgJiYgKm1zZykgeworCQlpZiAoaXNlcnIpCisJCQlpcGF0aF9kZXZfZXJyKGRkLCAiJXMgZXJyb3JcbiIsIG1zZyk7CisJCWVsc2UKKwkJCWRldl9pbmZvKCZkZC0+cGNpZGV2LT5kZXYsICIlcyBwYWNrZXQgcHJvYmxlbXNcbiIsCisJCQkJbXNnKTsKKwl9CiAJaWYgKGRkLT5pcGF0aF9zdGF0ZV93YW50ZWQgJiBkZC0+aXBhdGhfZmxhZ3MpIHsKIAkJaXBhdGhfY2RiZyhWRVJCT1NFLCAiZHJpdmVyIHdhbnRlZCBzdGF0ZSAleCwgaWZsYWdzIG5vdyAleCwgIgogCQkJICAgIndha2luZ1xuIiwgZGQtPmlwYXRoX3N0YXRlX3dhbnRlZCwKQEAgLTgxOSwxMSArODc0LDEwIEBACiAJCXN0cnVjdCBpcGF0aF9wb3J0ZGF0YSAqcGQgPSBkZC0+aXBhdGhfcGRbaV07CiAJCWlmIChwb3J0ciAmICgxIDw8IGkpICYmIHBkICYmIHBkLT5wb3J0X2NudCAmJgogCQkJdGVzdF9iaXQoSVBBVEhfUE9SVF9XQUlUSU5HX1JDViwgJnBkLT5wb3J0X2ZsYWcpKSB7Ci0JCQlpbnQgcmNiaXQ7CiAJCQljbGVhcl9iaXQoSVBBVEhfUE9SVF9XQUlUSU5HX1JDViwKIAkJCQkgICZwZC0+cG9ydF9mbGFnKTsKLQkJCXJjYml0ID0gaSArIElORklOSVBBVEhfUl9JTlRSQVZBSUxfU0hJRlQ7Ci0JCQljbGVhcl9iaXQoMVVMIDw8IHJjYml0LCAmZGQtPmlwYXRoX3JjdmN0cmwpOworCQkJY2xlYXJfYml0KGkgKyBJTkZJTklQQVRIX1JfSU5UUkFWQUlMX1NISUZULAorCQkJCSAgJmRkLT5pcGF0aF9yY3ZjdHJsKTsKIAkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcGQtPnBvcnRfd2FpdCk7CiAJCQlyY3ZkaW50ID0gMTsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2tlcm5lbC5oIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2tlcm5lbC5oCmluZGV4IDZkOGQwNWYuLmU5MDBjMjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9rZXJuZWwuaAorKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfa2VybmVsLmgKQEAgLTU5MCw3ICs1OTAsNiBAQAogdm9pZCBpcGF0aF9kaXNhYmxlX3djKHN0cnVjdCBpcGF0aF9kZXZkYXRhICpkZCk7CiBpbnQgaXBhdGhfY291bnRfdW5pdHMoaW50ICpucHJlc2VudHAsIGludCAqbnVwcCwgdTMyICptYXhwb3J0c3ApOwogdm9pZCBpcGF0aF9zaHV0ZG93bl9kZXZpY2Uoc3RydWN0IGlwYXRoX2RldmRhdGEgKik7Ci12b2lkIGlwYXRoX2Rpc2FybV9zZW5kZXJyYnVmcyhzdHJ1Y3QgaXBhdGhfZGV2ZGF0YSAqKTsKIAogc3RydWN0IGZpbGVfb3BlcmF0aW9uczsKIGludCBpcGF0aF9jZGV2X2luaXQoaW50IG1pbm9yLCBjaGFyICpuYW1lLCBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICpmb3BzLApAQCAtNjExLDcgKzYxMCw3IEBACiBleHRlcm4gaW50IGlwYXRoX2RpYWdfaW51c2U7CiAKIGlycXJldHVybl90IGlwYXRoX2ludHIoaW50IGlycSwgdm9pZCAqZGV2aWQpOwotdm9pZCBpcGF0aF9kZWNvZGVfZXJyKGNoYXIgKmJ1Ziwgc2l6ZV90IGJsZW4sIGlwYXRoX2Vycl90IGVycik7CitpbnQgaXBhdGhfZGVjb2RlX2VycihjaGFyICpidWYsIHNpemVfdCBibGVuLCBpcGF0aF9lcnJfdCBlcnIpOwogI2lmIF9fSVBBVEhfSU5GTyB8fCBfX0lQQVRIX0RCRwogZXh0ZXJuIGNvbnN0IGNoYXIgKmlwYXRoX2liY3N0YXR1c19zdHJbXTsKICNlbmRpZgpAQCAtNzAxLDYgKzcwMCw4IEBACiAjZGVmaW5lIElQQVRIX1BPUlRfV0FJVElOR19SQ1YgICAyCiAJCS8qIHdhaXRpbmcgZm9yIGEgUElPIGJ1ZmZlciB0byBiZSBhdmFpbGFibGUgKi8KICNkZWZpbmUgSVBBVEhfUE9SVF9XQUlUSU5HX1BJTyAgIDMKKwkJLyogbWFzdGVyIGhhcyBub3QgZmluaXNoZWQgaW5pdGlhbGl6aW5nICovCisjZGVmaW5lIElQQVRIX1BPUlRfTUFTVEVSX1VOSU5JVCA0CiAKIC8qIGZyZWUgdXAgYW55IGFsbG9jYXRlZCBkYXRhIGF0IGNsb3NlcyAqLwogdm9pZCBpcGF0aF9mcmVlX2RhdGEoc3RydWN0IGlwYXRoX3BvcnRkYXRhICpkZCk7CkBAIC03MTEsNiArNzEyLDcgQEAKIHZvaWQgaXBhdGhfaW5pdF9pYmE2MTEwX2Z1bmNzKHN0cnVjdCBpcGF0aF9kZXZkYXRhICopOwogdm9pZCBpcGF0aF9nZXRfZWVwcm9tX2luZm8oc3RydWN0IGlwYXRoX2RldmRhdGEgKik7CiB1NjQgaXBhdGhfc25hcF9jbnRyKHN0cnVjdCBpcGF0aF9kZXZkYXRhICosIGlwYXRoX2NyZWcpOwordm9pZCBpcGF0aF9kaXNhcm1fc2VuZGVycmJ1ZnMoc3RydWN0IGlwYXRoX2RldmRhdGEgKiwgaW50KTsKIAogLyoKICAqIG51bWJlciBvZiB3b3JkcyB1c2VkIGZvciBwcm90b2NvbCBoZWFkZXIgaWYgbm90IHNldCBieSBpcGF0aF91c2VyaW5pdCgpOwpAQCAtNzU0LDggKzc1Niw2IEBACiAvKiB0aGVzZSBhcmUgdXNlZCBmb3IgdGhlIHJlZ2lzdGVycyB0aGF0IHZhcnkgd2l0aCBwb3J0ICovCiB2b2lkIGlwYXRoX3dyaXRlX2tyZWdfcG9ydChjb25zdCBzdHJ1Y3QgaXBhdGhfZGV2ZGF0YSAqLCBpcGF0aF9rcmVnLAogCQkJICAgdW5zaWduZWQsIHU2NCk7Ci11NjQgaXBhdGhfcmVhZF9rcmVnNjRfcG9ydChjb25zdCBzdHJ1Y3QgaXBhdGhfZGV2ZGF0YSAqLCBpcGF0aF9rcmVnLAotCQkJICAgdW5zaWduZWQpOwogCiAvKgogICogV2UgY291bGQgaGF2ZSBhIHNpbmdsZSByZWdpc3RlciBnZXQvcHV0IHJvdXRpbmUsIHRoYXQgdGFrZXMgYSBncm91cCB0eXBlLApAQCAtODk3LDYgKzg5Nyw4IEBACiAKIGV4dGVybiB1bnNpZ25lZCBpcGF0aF9kZWJ1ZzsgLyogZGVidWdnaW5nIGJpdCBtYXNrICovCiAKKyNkZWZpbmUgSVBBVEhfTUFYX1BBUklUWV9BVFRFTVBUUyAxMDAwMCAvKiBtYXggdGltZXMgdG8gdHJ5IHJlY292ZXJ5ICovCisKIGNvbnN0IGNoYXIgKmlwYXRoX2dldF91bml0X25hbWUoaW50IHVuaXQpOwogCiBleHRlcm4gc3RydWN0IG11dGV4IGlwYXRoX211dGV4OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2tleXMuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9rZXlzLmMKaW5kZXggODUxNzYzZC4uZGQ0ODdjMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2tleXMuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfa2V5cy5jCkBAIC02MSw3ICs2MSw3IEBACiAJCXIgPSAociArIDEpICYgKHJrdC0+bWF4IC0gMSk7CiAJCWlmIChyID09IG4pIHsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJrdC0+bG9jaywgZmxhZ3MpOwotCQkJaXBhdGhfZGJnKEtFUk5fSU5GTyAiTEtFWSB0YWJsZSBmdWxsXG4iKTsKKwkJCWlwYXRoX2RiZygiTEtFWSB0YWJsZSBmdWxsXG4iKTsKIAkJCXJldCA9IDA7CiAJCQlnb3RvIGJhaWw7CiAJCX0KQEAgLTEzMyw2ICsxMzMsMTIgQEAKIAkgKiBiZWluZyByZXZlcnNpYmxlIGJ5IGNhbGxpbmcgYnVzX3RvX3ZpcnQoKS4KIAkgKi8KIAlpZiAoc2dlLT5sa2V5ID09IDApIHsKKwkJc3RydWN0IGlwYXRoX3BkICpwZCA9IHRvX2lwZChxcC0+aWJxcC5wZCk7CisKKwkJaWYgKHBkLT51c2VyKSB7CisJCQlyZXQgPSAwOworCQkJZ290byBiYWlsOworCQl9CiAJCWlzZ2UtPm1yID0gTlVMTDsKIAkJaXNnZS0+dmFkZHIgPSAodm9pZCAqKSBzZ2UtPmFkZHI7CiAJCWlzZ2UtPmxlbmd0aCA9IHNnZS0+bGVuZ3RoOwpAQCAtMjA2LDYgKzIxMiwxMiBAQAogCSAqIChzZWUgaXBhdGhfZ2V0X2RtYV9tciBhbmQgaXBhdGhfZG1hLmMpLgogCSAqLwogCWlmIChya2V5ID09IDApIHsKKwkJc3RydWN0IGlwYXRoX3BkICpwZCA9IHRvX2lwZChxcC0+aWJxcC5wZCk7CisKKwkJaWYgKHBkLT51c2VyKSB7CisJCQlyZXQgPSAwOworCQkJZ290byBiYWlsOworCQl9CiAJCXNnZS0+bXIgPSBOVUxMOwogCQlzZ2UtPnZhZGRyID0gKHZvaWQgKikgdmFkZHI7CiAJCXNnZS0+bGVuZ3RoID0gbGVuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX21yLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfbXIuYwppbmRleCA4Y2M4NTk4Li4zMWU3MDczIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfbXIuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfbXIuYwpAQCAtMjEwLDkgKzIxMCwxNSBAQAogCW0gPSAwOwogCW4gPSAwOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoY2h1bmssICZyZWdpb24tPmNodW5rX2xpc3QsIGxpc3QpIHsKLQkJZm9yIChpID0gMDsgaSA8IGNodW5rLT5ubWFwOyBpKyspIHsKLQkJCW1yLT5tci5tYXBbbV0tPnNlZ3Nbbl0udmFkZHIgPQotCQkJCXBhZ2VfYWRkcmVzcyhjaHVuay0+cGFnZV9saXN0W2ldLnBhZ2UpOworCQlmb3IgKGkgPSAwOyBpIDwgY2h1bmstPm5lbnRzOyBpKyspIHsKKwkJCXZvaWQgKnZhZGRyOworCisJCQl2YWRkciA9IHBhZ2VfYWRkcmVzcyhjaHVuay0+cGFnZV9saXN0W2ldLnBhZ2UpOworCQkJaWYgKCF2YWRkcikgeworCQkJCXJldCA9IEVSUl9QVFIoLUVJTlZBTCk7CisJCQkJZ290byBiYWlsOworCQkJfQorCQkJbXItPm1yLm1hcFttXS0+c2Vnc1tuXS52YWRkciA9IHZhZGRyOwogCQkJbXItPm1yLm1hcFttXS0+c2Vnc1tuXS5sZW5ndGggPSByZWdpb24tPnBhZ2Vfc2l6ZTsKIAkJCW4rKzsKIAkJCWlmIChuID09IElQQVRIX1NFR1NaKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfcXAuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9xcC5jCmluZGV4IDY0ZjA3YjEuLjE2ZGI5YWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9xcC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9xcC5jCkBAIC04MSwxMSArODEsNTEgQEAKIAkzMjc2OAkJCS8qIDFFICovCiB9OwogCi1zdGF0aWMgdTMyIGFsbG9jX3FwbihzdHJ1Y3QgaXBhdGhfcXBfdGFibGUgKnFwdCkKKworc3RhdGljIHZvaWQgZ2V0X21hcF9wYWdlKHN0cnVjdCBpcGF0aF9xcF90YWJsZSAqcXB0LCBzdHJ1Y3QgcXBuX21hcCAqbWFwKQoreworCXVuc2lnbmVkIGxvbmcgcGFnZSA9IGdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyoKKwkgKiBGcmVlIHRoZSBwYWdlIGlmIHNvbWVvbmUgcmFjZWQgd2l0aCB1cyBpbnN0YWxsaW5nIGl0LgorCSAqLworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnFwdC0+bG9jaywgZmxhZ3MpOworCWlmIChtYXAtPnBhZ2UpCisJCWZyZWVfcGFnZShwYWdlKTsKKwllbHNlCisJCW1hcC0+cGFnZSA9ICh2b2lkICopcGFnZTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxcHQtPmxvY2ssIGZsYWdzKTsKK30KKworCitzdGF0aWMgaW50IGFsbG9jX3FwbihzdHJ1Y3QgaXBhdGhfcXBfdGFibGUgKnFwdCwgZW51bSBpYl9xcF90eXBlIHR5cGUpCiB7CiAJdTMyIGksIG9mZnNldCwgbWF4X3NjYW4sIHFwbjsKIAlzdHJ1Y3QgcXBuX21hcCAqbWFwOwotCXUzMiByZXQ7CisJdTMyIHJldCA9IC0xOworCisJaWYgKHR5cGUgPT0gSUJfUVBUX1NNSSkKKwkJcmV0ID0gMDsKKwllbHNlIGlmICh0eXBlID09IElCX1FQVF9HU0kpCisJCXJldCA9IDE7CisKKwlpZiAocmV0ICE9IC0xKSB7CisJCW1hcCA9ICZxcHQtPm1hcFswXTsKKwkJaWYgKHVubGlrZWx5KCFtYXAtPnBhZ2UpKSB7CisJCQlnZXRfbWFwX3BhZ2UocXB0LCBtYXApOworCQkJaWYgKHVubGlrZWx5KCFtYXAtPnBhZ2UpKSB7CisJCQkJcmV0ID0gLUVOT01FTTsKKwkJCQlnb3RvIGJhaWw7CisJCQl9CisJCX0KKwkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KHJldCwgbWFwLT5wYWdlKSkKKwkJCWF0b21pY19kZWMoJm1hcC0+bl9mcmVlKTsKKwkJZWxzZQorCQkJcmV0ID0gLUVCVVNZOworCQlnb3RvIGJhaWw7CisJfQogCiAJcXBuID0gcXB0LT5sYXN0ICsgMTsKIAlpZiAocXBuID49IFFQTl9NQVgpCkBAIC05NSwxOSArMTM1LDcgQEAKIAltYXhfc2NhbiA9IHFwdC0+bm1hcHMgLSAhb2Zmc2V0OwogCWZvciAoaSA9IDA7OykgewogCQlpZiAodW5saWtlbHkoIW1hcC0+cGFnZSkpIHsKLQkJCXVuc2lnbmVkIGxvbmcgcGFnZSA9IGdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKLQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkJCS8qCi0JCQkgKiBGcmVlIHRoZSBwYWdlIGlmIHNvbWVvbmUgcmFjZWQgd2l0aCB1cwotCQkJICogaW5zdGFsbGluZyBpdDoKLQkJCSAqLwotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnFwdC0+bG9jaywgZmxhZ3MpOwotCQkJaWYgKG1hcC0+cGFnZSkKLQkJCQlmcmVlX3BhZ2UocGFnZSk7Ci0JCQllbHNlCi0JCQkJbWFwLT5wYWdlID0gKHZvaWQgKilwYWdlOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcXB0LT5sb2NrLCBmbGFncyk7CisJCQlnZXRfbWFwX3BhZ2UocXB0LCBtYXApOwogCQkJaWYgKHVubGlrZWx5KCFtYXAtPnBhZ2UpKQogCQkJCWJyZWFrOwogCQl9CkBAIC0xNTEsNyArMTc5LDcgQEAKIAkJcXBuID0gbWtfcXBuKHFwdCwgbWFwLCBvZmZzZXQpOwogCX0KIAotCXJldCA9IDA7CisJcmV0ID0gLUVOT01FTTsKIAogYmFpbDoKIAlyZXR1cm4gcmV0OwpAQCAtMTgwLDI5ICsyMDgsMTkgQEAKIAkJCSAgIGVudW0gaWJfcXBfdHlwZSB0eXBlKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdTMyIHFwbjsKIAlpbnQgcmV0OwogCi0JaWYgKHR5cGUgPT0gSUJfUVBUX1NNSSkKLQkJcXBuID0gMDsKLQllbHNlIGlmICh0eXBlID09IElCX1FQVF9HU0kpCi0JCXFwbiA9IDE7Ci0JZWxzZSB7Ci0JCS8qIEFsbG9jYXRlIHRoZSBuZXh0IGF2YWlsYWJsZSBRUE4gKi8KLQkJcXBuID0gYWxsb2NfcXBuKHFwdCk7Ci0JCWlmIChxcG4gPT0gMCkgewotCQkJcmV0ID0gLUVOT01FTTsKLQkJCWdvdG8gYmFpbDsKLQkJfQotCX0KLQlxcC0+aWJxcC5xcF9udW0gPSBxcG47CisJcmV0ID0gYWxsb2NfcXBuKHFwdCwgdHlwZSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gYmFpbDsKKwlxcC0+aWJxcC5xcF9udW0gPSByZXQ7CiAKIAkvKiBBZGQgdGhlIFFQIHRvIHRoZSBoYXNoIHRhYmxlLiAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZxcHQtPmxvY2ssIGZsYWdzKTsKIAotCXFwbiAlPSBxcHQtPm1heDsKLQlxcC0+bmV4dCA9IHFwdC0+dGFibGVbcXBuXTsKLQlxcHQtPnRhYmxlW3Fwbl0gPSBxcDsKKwlyZXQgJT0gcXB0LT5tYXg7CisJcXAtPm5leHQgPSBxcHQtPnRhYmxlW3JldF07CisJcXB0LT50YWJsZVtyZXRdID0gcXA7CiAJYXRvbWljX2luYygmcXAtPnJlZmNvdW50KTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnFwdC0+bG9jaywgZmxhZ3MpOwpAQCAtMjQ1LDkgKzI2Myw3IEBACiAJaWYgKCFmbmQpCiAJCXJldHVybjsKIAotCS8qIElmIFFQTiBpcyBub3QgcmVzZXJ2ZWQsIG1hcmsgUVBOIGZyZWUgaW4gdGhlIGJpdG1hcC4gKi8KLQlpZiAocXAtPmlicXAucXBfbnVtID4gMSkKLQkJZnJlZV9xcG4ocXB0LCBxcC0+aWJxcC5xcF9udW0pOworCWZyZWVfcXBuKHFwdCwgcXAtPmlicXAucXBfbnVtKTsKIAogCXdhaXRfZXZlbnQocXAtPndhaXQsICFhdG9taWNfcmVhZCgmcXAtPnJlZmNvdW50KSk7CiB9CkBAIC0yNzAsMTEgKzI4NiwxMCBAQAogCiAJCXdoaWxlIChxcCkgewogCQkJbnFwID0gcXAtPm5leHQ7Ci0JCQlpZiAocXAtPmlicXAucXBfbnVtID4gMSkKLQkJCQlmcmVlX3FwbihxcHQsIHFwLT5pYnFwLnFwX251bSk7CisJCQlmcmVlX3FwbihxcHQsIHFwLT5pYnFwLnFwX251bSk7CiAJCQlpZiAoIWF0b21pY19kZWNfYW5kX3Rlc3QoJnFwLT5yZWZjb3VudCkgfHwKIAkJCSAgICAhaXBhdGhfZGVzdHJveV9xcCgmcXAtPmlicXApKQotCQkJCWlwYXRoX2RiZyhLRVJOX0lORk8gIlFQIG1lbW9yeSBsZWFrIVxuIik7CisJCQkJaXBhdGhfZGJnKCJRUCBtZW1vcnkgbGVhayFcbiIpOwogCQkJcXAgPSBucXA7CiAJCX0KIAl9CkBAIC0zMjAsNyArMzM1LDggQEAKIAlxcC0+cmVtb3RlX3FwbiA9IDA7CiAJcXAtPnFrZXkgPSAwOwogCXFwLT5xcF9hY2Nlc3NfZmxhZ3MgPSAwOwotCWNsZWFyX2JpdChJUEFUSF9TX0JVU1ksICZxcC0+c19mbGFncyk7CisJcXAtPnNfYnVzeSA9IDA7CisJcXAtPnNfZmxhZ3MgJj0gfklQQVRIX1NfU0lHTkFMX1JFUV9XUjsKIAlxcC0+c19oZHJ3b3JkcyA9IDA7CiAJcXAtPnNfcHNuID0gMDsKIAlxcC0+cl9wc24gPSAwOwpAQCAtMzMzLDcgKzM0OSw2IEBACiAJCXFwLT5yX3N0YXRlID0gSUJfT1BDT0RFX1VDX1NFTkRfTEFTVDsKIAl9CiAJcXAtPnNfYWNrX3N0YXRlID0gSUJfT1BDT0RFX1JDX0FDS05PV0xFREdFOwotCXFwLT5yX2Fja19zdGF0ZSA9IElCX09QQ09ERV9SQ19BQ0tOT1dMRURHRTsKIAlxcC0+cl9uYWtfc3RhdGUgPSAwOwogCXFwLT5yX3dyaWRfdmFsaWQgPSAwOwogCXFwLT5zX3Jucl90aW1lb3V0ID0gMDsKQEAgLTM0NCw2ICszNTksMTAgQEAKIAlxcC0+c19zc24gPSAxOwogCXFwLT5zX2xzbiA9IDA7CiAJcXAtPnNfd2FpdF9jcmVkaXQgPSAwOworCW1lbXNldChxcC0+c19hY2tfcXVldWUsIDAsIHNpemVvZihxcC0+c19hY2tfcXVldWUpKTsKKwlxcC0+cl9oZWFkX2Fja19xdWV1ZSA9IDA7CisJcXAtPnNfdGFpbF9hY2tfcXVldWUgPSAwOworCXFwLT5zX251bV9yZF9hdG9taWMgPSAwOwogCWlmIChxcC0+cl9ycS53cSkgewogCQlxcC0+cl9ycS53cS0+aGVhZCA9IDA7CiAJCXFwLT5yX3JxLndxLT50YWlsID0gMDsKQEAgLTM1Nyw3ICszNzYsNyBAQAogICogQGVycjogdGhlIHJlY2VpdmUgY29tcGxldGlvbiBlcnJvciB0byBzaWduYWwgaWYgYSBSV1FFIGlzIGFjdGl2ZQogICoKICAqIEZsdXNoZXMgYm90aCBzZW5kIGFuZCByZWNlaXZlIHdvcmsgcXVldWVzLgotICogUVAgc19sb2NrIHNob3VsZCBiZSBoZWxkIGFuZCBpbnRlcnJ1cHRzIGRpc2FibGVkLgorICogVGhlIFFQIHNfbG9jayBzaG91bGQgYmUgaGVsZCBhbmQgaW50ZXJydXB0cyBkaXNhYmxlZC4KICAqLwogCiB2b2lkIGlwYXRoX2Vycm9yX3FwKHN0cnVjdCBpcGF0aF9xcCAqcXAsIGVudW0gaWJfd2Nfc3RhdHVzIGVycikKQEAgLTM2NSw3ICszODQsNyBAQAogCXN0cnVjdCBpcGF0aF9pYmRldiAqZGV2ID0gdG9faWRldihxcC0+aWJxcC5kZXZpY2UpOwogCXN0cnVjdCBpYl93YyB3YzsKIAotCWlwYXRoX2RiZyhLRVJOX0lORk8gIlFQJWQvJWQgaW4gZXJyb3Igc3RhdGVcbiIsCisJaXBhdGhfZGJnKCJRUCVkLyVkIGluIGVycm9yIHN0YXRlXG4iLAogCQkgIHFwLT5pYnFwLnFwX251bSwgcXAtPnJlbW90ZV9xcG4pOwogCiAJc3Bpbl9sb2NrKCZkZXYtPnBlbmRpbmdfbG9jayk7CkBAIC0zODksNiArNDA4LDggQEAKIAl3Yy5wb3J0X251bSA9IDA7CiAJaWYgKHFwLT5yX3dyaWRfdmFsaWQpIHsKIAkJcXAtPnJfd3JpZF92YWxpZCA9IDA7CisJCXdjLndyX2lkID0gcXAtPnJfd3JfaWQ7CisJCXdjLm9wY29kZSA9IElCX1dDX1JFQ1Y7CiAJCXdjLnN0YXR1cyA9IGVycjsKIAkJaXBhdGhfY3FfZW50ZXIodG9faWNxKHFwLT5pYnFwLnNlbmRfY3EpLCAmd2MsIDEpOwogCX0KQEAgLTUwMywxMyArNTI0LDE3IEBACiAJCSAgICBhdHRyLT5wYXRoX21pZ19zdGF0ZSAhPSBJQl9NSUdfUkVBUk0pCiAJCQlnb3RvIGludmFsOwogCisJaWYgKGF0dHJfbWFzayAmIElCX1FQX01BWF9ERVNUX1JEX0FUT01JQykKKwkJaWYgKGF0dHItPm1heF9kZXN0X3JkX2F0b21pYyA+IElQQVRIX01BWF9SRE1BX0FUT01JQykKKwkJCWdvdG8gaW52YWw7CisKIAlzd2l0Y2ggKG5ld19zdGF0ZSkgewogCWNhc2UgSUJfUVBTX1JFU0VUOgogCQlpcGF0aF9yZXNldF9xcChxcCk7CiAJCWJyZWFrOwogCiAJY2FzZSBJQl9RUFNfRVJSOgotCQlpcGF0aF9lcnJvcl9xcChxcCwgSUJfV0NfR0VORVJBTF9FUlIpOworCQlpcGF0aF9lcnJvcl9xcChxcCwgSUJfV0NfV1JfRkxVU0hfRVJSKTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpAQCAtNTU5LDYgKzU4NCwxMiBAQAogCWlmIChhdHRyX21hc2sgJiBJQl9RUF9RS0VZKQogCQlxcC0+cWtleSA9IGF0dHItPnFrZXk7CiAKKwlpZiAoYXR0cl9tYXNrICYgSUJfUVBfTUFYX0RFU1RfUkRfQVRPTUlDKQorCQlxcC0+cl9tYXhfcmRfYXRvbWljID0gYXR0ci0+bWF4X2Rlc3RfcmRfYXRvbWljOworCisJaWYgKGF0dHJfbWFzayAmIElCX1FQX01BWF9RUF9SRF9BVE9NSUMpCisJCXFwLT5zX21heF9yZF9hdG9taWMgPSBhdHRyLT5tYXhfcmRfYXRvbWljOworCiAJcXAtPnN0YXRlID0gbmV3X3N0YXRlOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnFwLT5zX2xvY2ssIGZsYWdzKTsKIApAQCAtNTk4LDggKzYyOSw4IEBACiAJYXR0ci0+YWx0X3BrZXlfaW5kZXggPSAwOwogCWF0dHItPmVuX3NxZF9hc3luY19ub3RpZnkgPSAwOwogCWF0dHItPnNxX2RyYWluaW5nID0gMDsKLQlhdHRyLT5tYXhfcmRfYXRvbWljID0gMTsKLQlhdHRyLT5tYXhfZGVzdF9yZF9hdG9taWMgPSAxOworCWF0dHItPm1heF9yZF9hdG9taWMgPSBxcC0+c19tYXhfcmRfYXRvbWljOworCWF0dHItPm1heF9kZXN0X3JkX2F0b21pYyA9IHFwLT5yX21heF9yZF9hdG9taWM7CiAJYXR0ci0+bWluX3Jucl90aW1lciA9IHFwLT5yX21pbl9ybnJfdGltZXI7CiAJYXR0ci0+cG9ydF9udW0gPSAxOwogCWF0dHItPnRpbWVvdXQgPSBxcC0+dGltZW91dDsKQEAgLTYxNCw3ICs2NDUsNyBAQAogCWluaXRfYXR0ci0+cmVjdl9jcSA9IHFwLT5pYnFwLnJlY3ZfY3E7CiAJaW5pdF9hdHRyLT5zcnEgPSBxcC0+aWJxcC5zcnE7CiAJaW5pdF9hdHRyLT5jYXAgPSBhdHRyLT5jYXA7Ci0JaWYgKHFwLT5zX2ZsYWdzICYgKDEgPDwgSVBBVEhfU19TSUdOQUxfUkVRX1dSKSkKKwlpZiAocXAtPnNfZmxhZ3MgJiBJUEFUSF9TX1NJR05BTF9SRVFfV1IpCiAJCWluaXRfYXR0ci0+c3Ffc2lnX3R5cGUgPSBJQl9TSUdOQUxfUkVRX1dSOwogCWVsc2UKIAkJaW5pdF9hdHRyLT5zcV9zaWdfdHlwZSA9IElCX1NJR05BTF9BTExfV1I7CkBAIC03ODYsNyArODE3LDcgQEAKIAkJcXAtPnNfc2l6ZSA9IGluaXRfYXR0ci0+Y2FwLm1heF9zZW5kX3dyICsgMTsKIAkJcXAtPnNfbWF4X3NnZSA9IGluaXRfYXR0ci0+Y2FwLm1heF9zZW5kX3NnZTsKIAkJaWYgKGluaXRfYXR0ci0+c3Ffc2lnX3R5cGUgPT0gSUJfU0lHTkFMX1JFUV9XUikKLQkJCXFwLT5zX2ZsYWdzID0gMSA8PCBJUEFUSF9TX1NJR05BTF9SRVFfV1I7CisJCQlxcC0+c19mbGFncyA9IElQQVRIX1NfU0lHTkFMX1JFUV9XUjsKIAkJZWxzZQogCQkJcXAtPnNfZmxhZ3MgPSAwOwogCQlkZXYgPSB0b19pZGV2KGlicGQtPmRldmljZSk7CkBAIC05NTgsNyArOTg5LDcgQEAKICAqIEB3YzogdGhlIFdDIHJlc3BvbnNpYmxlIGZvciBwdXR0aW5nIHRoZSBRUCBpbiB0aGlzIHN0YXRlCiAgKgogICogRmx1c2hlcyB0aGUgc2VuZCB3b3JrIHF1ZXVlLgotICogVGhlIFFQIHNfbG9jayBzaG91bGQgYmUgaGVsZC4KKyAqIFRoZSBRUCBzX2xvY2sgc2hvdWxkIGJlIGhlbGQgYW5kIGludGVycnVwdHMgZGlzYWJsZWQuCiAgKi8KIAogdm9pZCBpcGF0aF9zcWVycm9yX3FwKHN0cnVjdCBpcGF0aF9xcCAqcXAsIHN0cnVjdCBpYl93YyAqd2MpCkBAIC05NjYsNyArOTk3LDcgQEAKIAlzdHJ1Y3QgaXBhdGhfaWJkZXYgKmRldiA9IHRvX2lkZXYocXAtPmlicXAuZGV2aWNlKTsKIAlzdHJ1Y3QgaXBhdGhfc3dxZSAqd3FlID0gZ2V0X3N3cWVfcHRyKHFwLCBxcC0+c19sYXN0KTsKIAotCWlwYXRoX2RiZyhLRVJOX0lORk8gIlNlbmQgcXVldWUgZXJyb3Igb24gUVAlZC8lZDogZXJyOiAlZFxuIiwKKwlpcGF0aF9kYmcoIlNlbmQgcXVldWUgZXJyb3Igb24gUVAlZC8lZDogZXJyOiAlZFxuIiwKIAkJICBxcC0+aWJxcC5xcF9udW0sIHFwLT5yZW1vdGVfcXBuLCB3Yy0+c3RhdHVzKTsKIAogCXNwaW5fbG9jaygmZGV2LT5wZW5kaW5nX2xvY2spOwpAQCAtOTg0LDEyICsxMDE1LDEyIEBACiAJd2MtPnN0YXR1cyA9IElCX1dDX1dSX0ZMVVNIX0VSUjsKIAogCXdoaWxlIChxcC0+c19sYXN0ICE9IHFwLT5zX2hlYWQpIHsKKwkJd3FlID0gZ2V0X3N3cWVfcHRyKHFwLCBxcC0+c19sYXN0KTsKIAkJd2MtPndyX2lkID0gd3FlLT53ci53cl9pZDsKIAkJd2MtPm9wY29kZSA9IGliX2lwYXRoX3djX29wY29kZVt3cWUtPndyLm9wY29kZV07CiAJCWlwYXRoX2NxX2VudGVyKHRvX2ljcShxcC0+aWJxcC5zZW5kX2NxKSwgd2MsIDEpOwogCQlpZiAoKytxcC0+c19sYXN0ID49IHFwLT5zX3NpemUpCiAJCQlxcC0+c19sYXN0ID0gMDsKLQkJd3FlID0gZ2V0X3N3cWVfcHRyKHFwLCBxcC0+c19sYXN0KTsKIAl9CiAJcXAtPnNfY3VyID0gcXAtPnNfdGFpbCA9IHFwLT5zX2hlYWQ7CiAJcXAtPnN0YXRlID0gSUJfUVBTX1NRRTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9yYy5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX3JjLmMKaW5kZXggNWZmMjBjYi4uYjRiODhkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX3JjLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX3JjLmMKQEAgLTM3LDYgKzM3LDE5IEBACiAvKiBjdXQgZG93biByaWRpY3Vsb3VzbHkgbG9uZyBJQiBtYWNybyBuYW1lcyAqLwogI2RlZmluZSBPUCh4KSBJQl9PUENPREVfUkNfIyN4CiAKK3N0YXRpYyB1MzIgcmVzdGFydF9zZ2Uoc3RydWN0IGlwYXRoX3NnZV9zdGF0ZSAqc3MsIHN0cnVjdCBpcGF0aF9zd3FlICp3cWUsCisJCSAgICAgICB1MzIgcHNuLCB1MzIgcG10dSkKK3sKKwl1MzIgbGVuOworCisJbGVuID0gKChwc24gLSB3cWUtPnBzbikgJiBJUEFUSF9QU05fTUFTSykgKiBwbXR1OworCXNzLT5zZ2UgPSB3cWUtPnNnX2xpc3RbMF07CisJc3MtPnNnX2xpc3QgPSB3cWUtPnNnX2xpc3QgKyAxOworCXNzLT5udW1fc2dlID0gd3FlLT53ci5udW1fc2dlOworCWlwYXRoX3NraXBfc2dlKHNzLCBsZW4pOworCXJldHVybiB3cWUtPmxlbmd0aCAtIGxlbjsKK30KKwogLyoqCiAgKiBpcGF0aF9pbml0X3Jlc3RhcnQtIGluaXRpYWxpemUgdGhlIHFwLT5zX3NnZSBhZnRlciBhIHJlc3RhcnQKICAqIEBxcDogdGhlIFFQIHdobydzIFNHRSB3ZSdyZSByZXN0YXJ0aW5nCkBAIC00NywxNSArNjAsOSBAQAogc3RhdGljIHZvaWQgaXBhdGhfaW5pdF9yZXN0YXJ0KHN0cnVjdCBpcGF0aF9xcCAqcXAsIHN0cnVjdCBpcGF0aF9zd3FlICp3cWUpCiB7CiAJc3RydWN0IGlwYXRoX2liZGV2ICpkZXY7Ci0JdTMyIGxlbjsKIAotCWxlbiA9ICgocXAtPnNfcHNuIC0gd3FlLT5wc24pICYgSVBBVEhfUFNOX01BU0spICoKLQkJaWJfbXR1X2VudW1fdG9faW50KHFwLT5wYXRoX210dSk7Ci0JcXAtPnNfc2dlLnNnZSA9IHdxZS0+c2dfbGlzdFswXTsKLQlxcC0+c19zZ2Uuc2dfbGlzdCA9IHdxZS0+c2dfbGlzdCArIDE7Ci0JcXAtPnNfc2dlLm51bV9zZ2UgPSB3cWUtPndyLm51bV9zZ2U7Ci0JaXBhdGhfc2tpcF9zZ2UoJnFwLT5zX3NnZSwgbGVuKTsKLQlxcC0+c19sZW4gPSB3cWUtPmxlbmd0aCAtIGxlbjsKKwlxcC0+c19sZW4gPSByZXN0YXJ0X3NnZSgmcXAtPnNfc2dlLCB3cWUsIHFwLT5zX3BzbiwKKwkJCQlpYl9tdHVfZW51bV90b19pbnQocXAtPnBhdGhfbXR1KSk7CiAJZGV2ID0gdG9faWRldihxcC0+aWJxcC5kZXZpY2UpOwogCXNwaW5fbG9jaygmZGV2LT5wZW5kaW5nX2xvY2spOwogCWlmIChsaXN0X2VtcHR5KCZxcC0+dGltZXJ3YWl0KSkKQEAgLTcwLDEwNyArNzcsMTIzIEBACiAgKiBAb2hkcjogYSBwb2ludGVyIHRvIHRoZSBJQiBoZWFkZXIgYmVpbmcgY29uc3RydWN0ZWQKICAqIEBwbXR1OiB0aGUgcGF0aCBNVFUKICAqCi0gKiBSZXR1cm4gYnRoMCBpZiBjb25zdHJ1Y3RlZDsgb3RoZXJ3aXNlLCByZXR1cm4gMC4KKyAqIFJldHVybiAxIGlmIGNvbnN0cnVjdGVkOyBvdGhlcndpc2UsIHJldHVybiAwLgorICogTm90ZSB0aGF0IHdlIGFyZSBpbiB0aGUgcmVzcG9uZGVyJ3Mgc2lkZSBvZiB0aGUgUVAgY29udGV4dC4KICAqIE5vdGUgdGhlIFFQIHNfbG9jayBtdXN0IGJlIGhlbGQuCiAgKi8KLXUzMiBpcGF0aF9tYWtlX3JjX2FjayhzdHJ1Y3QgaXBhdGhfcXAgKnFwLAotCQkgICAgICBzdHJ1Y3QgaXBhdGhfb3RoZXJfaGVhZGVycyAqb2hkciwKLQkJICAgICAgdTMyIHBtdHUpCitzdGF0aWMgaW50IGlwYXRoX21ha2VfcmNfYWNrKHN0cnVjdCBpcGF0aF9xcCAqcXAsCisJCQkgICAgIHN0cnVjdCBpcGF0aF9vdGhlcl9oZWFkZXJzICpvaGRyLAorCQkJICAgICB1MzIgcG10dSwgdTMyICpidGgwcCwgdTMyICpidGgycCkKIHsKKwlzdHJ1Y3QgaXBhdGhfYWNrX2VudHJ5ICplOwogCXUzMiBod29yZHM7CiAJdTMyIGxlbjsKIAl1MzIgYnRoMDsKKwl1MzIgYnRoMjsKIAogCS8qIGhlYWRlciBzaXplIGluIDMyLWJpdCB3b3JkcyBMUkgrQlRIID0gKDgrMTIpLzQuICovCiAJaHdvcmRzID0gNTsKIAotCS8qCi0JICogU2VuZCBhIHJlc3BvbnNlLiAgTm90ZSB0aGF0IHdlIGFyZSBpbiB0aGUgcmVzcG9uZGVyJ3MKLQkgKiBzaWRlIG9mIHRoZSBRUCBjb250ZXh0LgotCSAqLwogCXN3aXRjaCAocXAtPnNfYWNrX3N0YXRlKSB7Ci0JY2FzZSBPUChSRE1BX1JFQURfUkVRVUVTVCk6Ci0JCXFwLT5zX2N1cl9zZ2UgPSAmcXAtPnNfcmRtYV9zZ2U7Ci0JCWxlbiA9IHFwLT5zX3JkbWFfbGVuOwotCQlpZiAobGVuID4gcG10dSkgewotCQkJbGVuID0gcG10dTsKLQkJCXFwLT5zX2Fja19zdGF0ZSA9IE9QKFJETUFfUkVBRF9SRVNQT05TRV9GSVJTVCk7Ci0JCX0gZWxzZQotCQkJcXAtPnNfYWNrX3N0YXRlID0gT1AoUkRNQV9SRUFEX1JFU1BPTlNFX09OTFkpOwotCQlxcC0+c19yZG1hX2xlbiAtPSBsZW47CisJY2FzZSBPUChSRE1BX1JFQURfUkVTUE9OU0VfTEFTVCk6CisJY2FzZSBPUChSRE1BX1JFQURfUkVTUE9OU0VfT05MWSk6CisJY2FzZSBPUChBVE9NSUNfQUNLTk9XTEVER0UpOgorCQlxcC0+c19hY2tfc3RhdGUgPSBPUChBQ0tOT1dMRURHRSk7CisJCS8qIEZBTExUSFJPVUdIICovCisJY2FzZSBPUChBQ0tOT1dMRURHRSk6CisJCS8qIENoZWNrIGZvciBubyBuZXh0IGVudHJ5IGluIHRoZSBxdWV1ZS4gKi8KKwkJaWYgKHFwLT5yX2hlYWRfYWNrX3F1ZXVlID09IHFwLT5zX3RhaWxfYWNrX3F1ZXVlKSB7CisJCQlpZiAocXAtPnNfZmxhZ3MgJiBJUEFUSF9TX0FDS19QRU5ESU5HKQorCQkJCWdvdG8gbm9ybWFsOworCQkJZ290byBiYWlsOworCQl9CisKKwkJZSA9ICZxcC0+c19hY2tfcXVldWVbcXAtPnNfdGFpbF9hY2tfcXVldWVdOworCQlpZiAoZS0+b3Bjb2RlID09IE9QKFJETUFfUkVBRF9SRVFVRVNUKSkgeworCQkJLyogQ29weSBTR0Ugc3RhdGUgaW4gY2FzZSB3ZSBuZWVkIHRvIHJlc2VuZCAqLworCQkJcXAtPnNfYWNrX3JkbWFfc2dlID0gZS0+cmRtYV9zZ2U7CisJCQlxcC0+c19jdXJfc2dlID0gJnFwLT5zX2Fja19yZG1hX3NnZTsKKwkJCWxlbiA9IGUtPnJkbWFfc2dlLnNnZS5zZ2VfbGVuZ3RoOworCQkJaWYgKGxlbiA+IHBtdHUpIHsKKwkJCQlsZW4gPSBwbXR1OworCQkJCXFwLT5zX2Fja19zdGF0ZSA9IE9QKFJETUFfUkVBRF9SRVNQT05TRV9GSVJTVCk7CisJCQl9IGVsc2UgeworCQkJCXFwLT5zX2Fja19zdGF0ZSA9IE9QKFJETUFfUkVBRF9SRVNQT05TRV9PTkxZKTsKKwkJCQlpZiAoKytxcC0+c190YWlsX2Fja19xdWV1ZSA+CisJCQkJICAgIElQQVRIX01BWF9SRE1BX0FUT01JQykKKwkJCQkJcXAtPnNfdGFpbF9hY2tfcXVldWUgPSAwOworCQkJfQorCQkJb2hkci0+dS5hZXRoID0gaXBhdGhfY29tcHV0ZV9hZXRoKHFwKTsKKwkJCWh3b3JkcysrOworCQkJcXAtPnNfYWNrX3JkbWFfcHNuID0gZS0+cHNuOworCQkJYnRoMiA9IHFwLT5zX2Fja19yZG1hX3BzbisrICYgSVBBVEhfUFNOX01BU0s7CisJCX0gZWxzZSB7CisJCQkvKiBDT01QQVJFX1NXQVAgb3IgRkVUQ0hfQUREICovCisJCQlxcC0+c19jdXJfc2dlID0gTlVMTDsKKwkJCWxlbiA9IDA7CisJCQlxcC0+c19hY2tfc3RhdGUgPSBPUChBVE9NSUNfQUNLTk9XTEVER0UpOworCQkJb2hkci0+dS5hdC5hZXRoID0gaXBhdGhfY29tcHV0ZV9hZXRoKHFwKTsKKwkJCW9oZHItPnUuYXQuYXRvbWljX2Fja19ldGhbMF0gPQorCQkJCWNwdV90b19iZTMyKGUtPmF0b21pY19kYXRhID4+IDMyKTsKKwkJCW9oZHItPnUuYXQuYXRvbWljX2Fja19ldGhbMV0gPQorCQkJCWNwdV90b19iZTMyKGUtPmF0b21pY19kYXRhKTsKKwkJCWh3b3JkcyArPSBzaXplb2Yob2hkci0+dS5hdCkgLyBzaXplb2YodTMyKTsKKwkJCWJ0aDIgPSBlLT5wc247CisJCQlpZiAoKytxcC0+c190YWlsX2Fja19xdWV1ZSA+IElQQVRIX01BWF9SRE1BX0FUT01JQykKKwkJCQlxcC0+c190YWlsX2Fja19xdWV1ZSA9IDA7CisJCX0KIAkJYnRoMCA9IHFwLT5zX2Fja19zdGF0ZSA8PCAyNDsKLQkJb2hkci0+dS5hZXRoID0gaXBhdGhfY29tcHV0ZV9hZXRoKHFwKTsKLQkJaHdvcmRzKys7CiAJCWJyZWFrOwogCiAJY2FzZSBPUChSRE1BX1JFQURfUkVTUE9OU0VfRklSU1QpOgogCQlxcC0+c19hY2tfc3RhdGUgPSBPUChSRE1BX1JFQURfUkVTUE9OU0VfTUlERExFKTsKIAkJLyogRkFMTFRIUk9VR0ggKi8KIAljYXNlIE9QKFJETUFfUkVBRF9SRVNQT05TRV9NSURETEUpOgotCQlxcC0+c19jdXJfc2dlID0gJnFwLT5zX3JkbWFfc2dlOwotCQlsZW4gPSBxcC0+c19yZG1hX2xlbjsKKwkJbGVuID0gcXAtPnNfYWNrX3JkbWFfc2dlLnNnZS5zZ2VfbGVuZ3RoOwogCQlpZiAobGVuID4gcG10dSkKIAkJCWxlbiA9IHBtdHU7CiAJCWVsc2UgewogCQkJb2hkci0+dS5hZXRoID0gaXBhdGhfY29tcHV0ZV9hZXRoKHFwKTsKIAkJCWh3b3JkcysrOwogCQkJcXAtPnNfYWNrX3N0YXRlID0gT1AoUkRNQV9SRUFEX1JFU1BPTlNFX0xBU1QpOworCQkJaWYgKCsrcXAtPnNfdGFpbF9hY2tfcXVldWUgPiBJUEFUSF9NQVhfUkRNQV9BVE9NSUMpCisJCQkJcXAtPnNfdGFpbF9hY2tfcXVldWUgPSAwOwogCQl9Ci0JCXFwLT5zX3JkbWFfbGVuIC09IGxlbjsKIAkJYnRoMCA9IHFwLT5zX2Fja19zdGF0ZSA8PCAyNDsKLQkJYnJlYWs7Ci0KLQljYXNlIE9QKFJETUFfUkVBRF9SRVNQT05TRV9MQVNUKToKLQljYXNlIE9QKFJETUFfUkVBRF9SRVNQT05TRV9PTkxZKToKLQkJLyoKLQkJICogV2UgaGF2ZSB0byBwcmV2ZW50IG5ldyByZXF1ZXN0cyBmcm9tIGNoYW5naW5nCi0JCSAqIHRoZSByX3NnZSBzdGF0ZSB3aGlsZSBhIGlwYXRoX3ZlcmJzX3NlbmQoKQotCQkgKiBpcyBpbiBwcm9ncmVzcy4KLQkJICovCi0JCXFwLT5zX2Fja19zdGF0ZSA9IE9QKEFDS05PV0xFREdFKTsKLQkJYnRoMCA9IDA7Ci0JCWdvdG8gYmFpbDsKLQotCWNhc2UgT1AoQ09NUEFSRV9TV0FQKToKLQljYXNlIE9QKEZFVENIX0FERCk6Ci0JCXFwLT5zX2N1cl9zZ2UgPSBOVUxMOwotCQlsZW4gPSAwOwotCQkvKgotCQkgKiBTZXQgdGhlIHNfYWNrX3N0YXRlIHNvIHRoZSByZWNlaXZlIGludGVycnVwdCBoYW5kbGVyCi0JCSAqIHdvbid0IHRyeSB0byBzZW5kIGFuIEFDSyAob3V0IG9mIG9yZGVyKSB1bnRpbCB0aGlzIG9uZQotCQkgKiBpcyBhY3R1YWxseSBzZW50LgotCQkgKi8KLQkJcXAtPnNfYWNrX3N0YXRlID0gT1AoUkRNQV9SRUFEX1JFU1BPTlNFX0xBU1QpOwotCQlidGgwID0gT1AoQVRPTUlDX0FDS05PV0xFREdFKSA8PCAyNDsKLQkJb2hkci0+dS5hdC5hZXRoID0gaXBhdGhfY29tcHV0ZV9hZXRoKHFwKTsKLQkJb2hkci0+dS5hdC5hdG9taWNfYWNrX2V0aCA9IGNwdV90b19iZTY0KHFwLT5yX2F0b21pY19kYXRhKTsKLQkJaHdvcmRzICs9IHNpemVvZihvaGRyLT51LmF0KSAvIDQ7CisJCWJ0aDIgPSBxcC0+c19hY2tfcmRtYV9wc24rKyAmIElQQVRIX1BTTl9NQVNLOwogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCS8qIFNlbmQgYSByZWd1bGFyIEFDSy4gKi8KLQkJcXAtPnNfY3VyX3NnZSA9IE5VTEw7Ci0JCWxlbiA9IDA7CisJbm9ybWFsOgogCQkvKgotCQkgKiBTZXQgdGhlIHNfYWNrX3N0YXRlIHNvIHRoZSByZWNlaXZlIGludGVycnVwdCBoYW5kbGVyCi0JCSAqIHdvbid0IHRyeSB0byBzZW5kIGFuIEFDSyAob3V0IG9mIG9yZGVyKSB1bnRpbCB0aGlzIG9uZQotCQkgKiBpcyBhY3R1YWxseSBzZW50LgorCQkgKiBTZW5kIGEgcmVndWxhciBBQ0suCisJCSAqIFNldCB0aGUgc19hY2tfc3RhdGUgc28gd2Ugd2FpdCB1bnRpbCBhZnRlciBzZW5kaW5nCisJCSAqIHRoZSBBQ0sgYmVmb3JlIHNldHRpbmcgc19hY2tfc3RhdGUgdG8gQUNLTk9XTEVER0UKKwkJICogKHNlZSBhYm92ZSkuCiAJCSAqLwotCQlxcC0+c19hY2tfc3RhdGUgPSBPUChSRE1BX1JFQURfUkVTUE9OU0VfTEFTVCk7Ci0JCWJ0aDAgPSBPUChBQ0tOT1dMRURHRSkgPDwgMjQ7CisJCXFwLT5zX2Fja19zdGF0ZSA9IE9QKEFUT01JQ19BQ0tOT1dMRURHRSk7CisJCXFwLT5zX2ZsYWdzICY9IH5JUEFUSF9TX0FDS19QRU5ESU5HOworCQlxcC0+c19jdXJfc2dlID0gTlVMTDsKIAkJaWYgKHFwLT5zX25ha19zdGF0ZSkKLQkJCW9oZHItPnUuYWV0aCA9IGNwdV90b19iZTMyKChxcC0+cl9tc24gJiBJUEFUSF9NU05fTUFTSykgfAotCQkJCQkJICAgIChxcC0+c19uYWtfc3RhdGUgPDwKLQkJCQkJCSAgICAgSVBBVEhfQUVUSF9DUkVESVRfU0hJRlQpKTsKKwkJCW9oZHItPnUuYWV0aCA9CisJCQkJY3B1X3RvX2JlMzIoKHFwLT5yX21zbiAmIElQQVRIX01TTl9NQVNLKSB8CisJCQkJCSAgICAocXAtPnNfbmFrX3N0YXRlIDw8CisJCQkJCSAgICAgSVBBVEhfQUVUSF9DUkVESVRfU0hJRlQpKTsKIAkJZWxzZQogCQkJb2hkci0+dS5hZXRoID0gaXBhdGhfY29tcHV0ZV9hZXRoKHFwKTsKIAkJaHdvcmRzKys7CisJCWxlbiA9IDA7CisJCWJ0aDAgPSBPUChBQ0tOT1dMRURHRSkgPDwgMjQ7CisJCWJ0aDIgPSBxcC0+c19hY2tfcHNuICYgSVBBVEhfUFNOX01BU0s7CiAJfQogCXFwLT5zX2hkcndvcmRzID0gaHdvcmRzOwogCXFwLT5zX2N1cl9zaXplID0gbGVuOworCSpidGgwcCA9IGJ0aDA7CisJKmJ0aDJwID0gYnRoMjsKKwlyZXR1cm4gMTsKIAogYmFpbDoKLQlyZXR1cm4gYnRoMDsKKwlyZXR1cm4gMDsKIH0KIAogLyoqCkBAIC0xOTcsOSArMjIwLDE2IEBACiAJdTMyIGJ0aDI7CiAJY2hhciBuZXdyZXE7CiAKKwkvKiBTZW5kaW5nIHJlc3BvbnNlcyBoYXMgaGlnaGVyIHByaW9yaXR5IG92ZXIgc2VuZGluZyByZXF1ZXN0cy4gKi8KKwlpZiAoKHFwLT5yX2hlYWRfYWNrX3F1ZXVlICE9IHFwLT5zX3RhaWxfYWNrX3F1ZXVlIHx8CisJICAgICAocXAtPnNfZmxhZ3MgJiBJUEFUSF9TX0FDS19QRU5ESU5HKSB8fAorCSAgICAgcXAtPnNfYWNrX3N0YXRlICE9IElCX09QQ09ERV9SQ19BQ0tOT1dMRURHRSkgJiYKKwkgICAgaXBhdGhfbWFrZV9yY19hY2socXAsIG9oZHIsIHBtdHUsIGJ0aDBwLCBidGgycCkpCisJCWdvdG8gZG9uZTsKKwogCWlmICghKGliX2lwYXRoX3N0YXRlX29wc1txcC0+c3RhdGVdICYgSVBBVEhfUFJPQ0VTU19TRU5EX09LKSB8fAogCSAgICBxcC0+c19ybnJfdGltZW91dCkKLQkJZ290byBkb25lOworCQlnb3RvIGJhaWw7CiAKIAkvKiBMaW1pdCB0aGUgbnVtYmVyIG9mIHBhY2tldHMgc2VudCB3aXRob3V0IGFuIEFDSy4gKi8KIAlpZiAoaXBhdGhfY21wMjQocXAtPnNfcHNuLCBxcC0+c19sYXN0X3BzbiArIElQQVRIX1BTTl9DUkVESVQpID4gMCkgewpAQCAtMjEwLDcgKzI0MCw3IEBACiAJCQlsaXN0X2FkZF90YWlsKCZxcC0+dGltZXJ3YWl0LAogCQkJCSAgICAgICZkZXYtPnBlbmRpbmdbZGV2LT5wZW5kaW5nX2luZGV4XSk7CiAJCXNwaW5fdW5sb2NrKCZkZXYtPnBlbmRpbmdfbG9jayk7Ci0JCWdvdG8gZG9uZTsKKwkJZ290byBiYWlsOwogCX0KIAogCS8qIGhlYWRlciBzaXplIGluIDMyLWJpdCB3b3JkcyBMUkgrQlRIID0gKDgrMTIpLzQuICovCkBAIC0yMzIsNyArMjYyLDE2IEBACiAJCWlmIChxcC0+c19jdXIgPT0gcXAtPnNfdGFpbCkgewogCQkJLyogQ2hlY2sgaWYgc2VuZCB3b3JrIHF1ZXVlIGlzIGVtcHR5LiAqLwogCQkJaWYgKHFwLT5zX3RhaWwgPT0gcXAtPnNfaGVhZCkKLQkJCQlnb3RvIGRvbmU7CisJCQkJZ290byBiYWlsOworCQkJLyoKKwkJCSAqIElmIGEgZmVuY2UgaXMgcmVxdWVzdGVkLCB3YWl0IGZvciBwcmV2aW91cworCQkJICogUkRNQSByZWFkIGFuZCBhdG9taWMgb3BlcmF0aW9ucyB0byBmaW5pc2guCisJCQkgKi8KKwkJCWlmICgod3FlLT53ci5zZW5kX2ZsYWdzICYgSUJfU0VORF9GRU5DRSkgJiYKKwkJCSAgICBxcC0+c19udW1fcmRfYXRvbWljKSB7CisJCQkJcXAtPnNfZmxhZ3MgfD0gSVBBVEhfU19GRU5DRV9QRU5ESU5HOworCQkJCWdvdG8gYmFpbDsKKwkJCX0KIAkJCXdxZS0+cHNuID0gcXAtPnNfbmV4dF9wc247CiAJCQluZXdyZXEgPSAxOwogCQl9CkBAIC0yNTAsNyArMjg5LDcgQEAKIAkJCS8qIElmIG5vIGNyZWRpdCwgcmV0dXJuLiAqLwogCQkJaWYgKHFwLT5zX2xzbiAhPSAodTMyKSAtMSAmJgogCQkJICAgIGlwYXRoX2NtcDI0KHdxZS0+c3NuLCBxcC0+c19sc24gKyAxKSA+IDApCi0JCQkJZ290byBkb25lOworCQkJCWdvdG8gYmFpbDsKIAkJCXdxZS0+bHBzbiA9IHdxZS0+cHNuOwogCQkJaWYgKGxlbiA+IHBtdHUpIHsKIAkJCQl3cWUtPmxwc24gKz0gKGxlbiAtIDEpIC8gcG10dTsKQEAgLTI4MSwxMyArMzIwLDEzIEBACiAJCQkvKiBJZiBubyBjcmVkaXQsIHJldHVybi4gKi8KIAkJCWlmIChxcC0+c19sc24gIT0gKHUzMikgLTEgJiYKIAkJCSAgICBpcGF0aF9jbXAyNCh3cWUtPnNzbiwgcXAtPnNfbHNuICsgMSkgPiAwKQotCQkJCWdvdG8gZG9uZTsKKwkJCQlnb3RvIGJhaWw7CiAJCQlvaGRyLT51LnJjLnJldGgudmFkZHIgPQogCQkJCWNwdV90b19iZTY0KHdxZS0+d3Iud3IucmRtYS5yZW1vdGVfYWRkcik7CiAJCQlvaGRyLT51LnJjLnJldGgucmtleSA9CiAJCQkJY3B1X3RvX2JlMzIod3FlLT53ci53ci5yZG1hLnJrZXkpOwogCQkJb2hkci0+dS5yYy5yZXRoLmxlbmd0aCA9IGNwdV90b19iZTMyKGxlbik7Ci0JCQlod29yZHMgKz0gc2l6ZW9mKHN0cnVjdCBpYl9yZXRoKSAvIDQ7CisJCQlod29yZHMgKz0gc2l6ZW9mKHN0cnVjdCBpYl9yZXRoKSAvIHNpemVvZih1MzIpOwogCQkJd3FlLT5scHNuID0gd3FlLT5wc247CiAJCQlpZiAobGVuID4gcG10dSkgewogCQkJCXdxZS0+bHBzbiArPSAobGVuIC0gMSkgLyBwbXR1OwpAQCAtMzEyLDE0ICszNTEsMTcgQEAKIAkJCWJyZWFrOwogCiAJCWNhc2UgSUJfV1JfUkRNQV9SRUFEOgotCQkJb2hkci0+dS5yYy5yZXRoLnZhZGRyID0KLQkJCQljcHVfdG9fYmU2NCh3cWUtPndyLndyLnJkbWEucmVtb3RlX2FkZHIpOwotCQkJb2hkci0+dS5yYy5yZXRoLnJrZXkgPQotCQkJCWNwdV90b19iZTMyKHdxZS0+d3Iud3IucmRtYS5ya2V5KTsKLQkJCW9oZHItPnUucmMucmV0aC5sZW5ndGggPSBjcHVfdG9fYmUzMihsZW4pOwotCQkJcXAtPnNfc3RhdGUgPSBPUChSRE1BX1JFQURfUkVRVUVTVCk7Ci0JCQlod29yZHMgKz0gc2l6ZW9mKG9oZHItPnUucmMucmV0aCkgLyA0OworCQkJLyoKKwkJCSAqIERvbid0IGFsbG93IG1vcmUgb3BlcmF0aW9ucyB0byBiZSBzdGFydGVkCisJCQkgKiB0aGFuIHRoZSBRUCBsaW1pdHMgYWxsb3cuCisJCQkgKi8KIAkJCWlmIChuZXdyZXEpIHsKKwkJCQlpZiAocXAtPnNfbnVtX3JkX2F0b21pYyA+PQorCQkJCSAgICBxcC0+c19tYXhfcmRfYXRvbWljKSB7CisJCQkJCXFwLT5zX2ZsYWdzIHw9IElQQVRIX1NfUkRNQVJfUEVORElORzsKKwkJCQkJZ290byBiYWlsOworCQkJCX0KKwkJCQlxcC0+c19udW1fcmRfYXRvbWljKys7CiAJCQkJaWYgKHFwLT5zX2xzbiAhPSAodTMyKSAtMSkKIAkJCQkJcXAtPnNfbHNuKys7CiAJCQkJLyoKQEAgLTMzMCw2ICszNzIsMTMgQEAKIAkJCQkJcXAtPnNfbmV4dF9wc24gKz0gKGxlbiAtIDEpIC8gcG10dTsKIAkJCQl3cWUtPmxwc24gPSBxcC0+c19uZXh0X3BzbisrOwogCQkJfQorCQkJb2hkci0+dS5yYy5yZXRoLnZhZGRyID0KKwkJCQljcHVfdG9fYmU2NCh3cWUtPndyLndyLnJkbWEucmVtb3RlX2FkZHIpOworCQkJb2hkci0+dS5yYy5yZXRoLnJrZXkgPQorCQkJCWNwdV90b19iZTMyKHdxZS0+d3Iud3IucmRtYS5ya2V5KTsKKwkJCW9oZHItPnUucmMucmV0aC5sZW5ndGggPSBjcHVfdG9fYmUzMihsZW4pOworCQkJcXAtPnNfc3RhdGUgPSBPUChSRE1BX1JFQURfUkVRVUVTVCk7CisJCQlod29yZHMgKz0gc2l6ZW9mKG9oZHItPnUucmMucmV0aCkgLyBzaXplb2YodTMyKTsKIAkJCXNzID0gTlVMTDsKIAkJCWxlbiA9IDA7CiAJCQlpZiAoKytxcC0+c19jdXIgPT0gcXAtPnNfc2l6ZSkKQEAgLTMzOCwzMiArMzg3LDQ4IEBACiAKIAkJY2FzZSBJQl9XUl9BVE9NSUNfQ01QX0FORF9TV1A6CiAJCWNhc2UgSUJfV1JfQVRPTUlDX0ZFVENIX0FORF9BREQ6Ci0JCQlpZiAod3FlLT53ci5vcGNvZGUgPT0gSUJfV1JfQVRPTUlDX0NNUF9BTkRfU1dQKQotCQkJCXFwLT5zX3N0YXRlID0gT1AoQ09NUEFSRV9TV0FQKTsKLQkJCWVsc2UKLQkJCQlxcC0+c19zdGF0ZSA9IE9QKEZFVENIX0FERCk7Ci0JCQlvaGRyLT51LmF0b21pY19ldGgudmFkZHIgPSBjcHVfdG9fYmU2NCgKLQkJCQl3cWUtPndyLndyLmF0b21pYy5yZW1vdGVfYWRkcik7Ci0JCQlvaGRyLT51LmF0b21pY19ldGgucmtleSA9IGNwdV90b19iZTMyKAotCQkJCXdxZS0+d3Iud3IuYXRvbWljLnJrZXkpOwotCQkJb2hkci0+dS5hdG9taWNfZXRoLnN3YXBfZGF0YSA9IGNwdV90b19iZTY0KAotCQkJCXdxZS0+d3Iud3IuYXRvbWljLnN3YXApOwotCQkJb2hkci0+dS5hdG9taWNfZXRoLmNvbXBhcmVfZGF0YSA9IGNwdV90b19iZTY0KAotCQkJCXdxZS0+d3Iud3IuYXRvbWljLmNvbXBhcmVfYWRkKTsKLQkJCWh3b3JkcyArPSBzaXplb2Yoc3RydWN0IGliX2F0b21pY19ldGgpIC8gNDsKKwkJCS8qCisJCQkgKiBEb24ndCBhbGxvdyBtb3JlIG9wZXJhdGlvbnMgdG8gYmUgc3RhcnRlZAorCQkJICogdGhhbiB0aGUgUVAgbGltaXRzIGFsbG93LgorCQkJICovCiAJCQlpZiAobmV3cmVxKSB7CisJCQkJaWYgKHFwLT5zX251bV9yZF9hdG9taWMgPj0KKwkJCQkgICAgcXAtPnNfbWF4X3JkX2F0b21pYykgeworCQkJCQlxcC0+c19mbGFncyB8PSBJUEFUSF9TX1JETUFSX1BFTkRJTkc7CisJCQkJCWdvdG8gYmFpbDsKKwkJCQl9CisJCQkJcXAtPnNfbnVtX3JkX2F0b21pYysrOwogCQkJCWlmIChxcC0+c19sc24gIT0gKHUzMikgLTEpCiAJCQkJCXFwLT5zX2xzbisrOwogCQkJCXdxZS0+bHBzbiA9IHdxZS0+cHNuOwogCQkJfQotCQkJaWYgKCsrcXAtPnNfY3VyID09IHFwLT5zX3NpemUpCi0JCQkJcXAtPnNfY3VyID0gMDsKKwkJCWlmICh3cWUtPndyLm9wY29kZSA9PSBJQl9XUl9BVE9NSUNfQ01QX0FORF9TV1ApIHsKKwkJCQlxcC0+c19zdGF0ZSA9IE9QKENPTVBBUkVfU1dBUCk7CisJCQkJb2hkci0+dS5hdG9taWNfZXRoLnN3YXBfZGF0YSA9IGNwdV90b19iZTY0KAorCQkJCQl3cWUtPndyLndyLmF0b21pYy5zd2FwKTsKKwkJCQlvaGRyLT51LmF0b21pY19ldGguY29tcGFyZV9kYXRhID0gY3B1X3RvX2JlNjQoCisJCQkJCXdxZS0+d3Iud3IuYXRvbWljLmNvbXBhcmVfYWRkKTsKKwkJCX0gZWxzZSB7CisJCQkJcXAtPnNfc3RhdGUgPSBPUChGRVRDSF9BREQpOworCQkJCW9oZHItPnUuYXRvbWljX2V0aC5zd2FwX2RhdGEgPSBjcHVfdG9fYmU2NCgKKwkJCQkJd3FlLT53ci53ci5hdG9taWMuY29tcGFyZV9hZGQpOworCQkJCW9oZHItPnUuYXRvbWljX2V0aC5jb21wYXJlX2RhdGEgPSAwOworCQkJfQorCQkJb2hkci0+dS5hdG9taWNfZXRoLnZhZGRyWzBdID0gY3B1X3RvX2JlMzIoCisJCQkJd3FlLT53ci53ci5hdG9taWMucmVtb3RlX2FkZHIgPj4gMzIpOworCQkJb2hkci0+dS5hdG9taWNfZXRoLnZhZGRyWzFdID0gY3B1X3RvX2JlMzIoCisJCQkJd3FlLT53ci53ci5hdG9taWMucmVtb3RlX2FkZHIpOworCQkJb2hkci0+dS5hdG9taWNfZXRoLnJrZXkgPSBjcHVfdG9fYmUzMigKKwkJCQl3cWUtPndyLndyLmF0b21pYy5ya2V5KTsKKwkJCWh3b3JkcyArPSBzaXplb2Yoc3RydWN0IGliX2F0b21pY19ldGgpIC8gc2l6ZW9mKHUzMik7CiAJCQlzcyA9IE5VTEw7CiAJCQlsZW4gPSAwOworCQkJaWYgKCsrcXAtPnNfY3VyID09IHFwLT5zX3NpemUpCisJCQkJcXAtPnNfY3VyID0gMDsKIAkJCWJyZWFrOwogCiAJCWRlZmF1bHQ6Ci0JCQlnb3RvIGRvbmU7CisJCQlnb3RvIGJhaWw7CiAJCX0KIAkJcXAtPnNfc2dlLnNnZSA9IHdxZS0+c2dfbGlzdFswXTsKIAkJcXAtPnNfc2dlLnNnX2xpc3QgPSB3cWUtPnNnX2xpc3QgKyAxOwpAQCAtMzc5LDcgKzQ0NCw3IEBACiAJCQlxcC0+c19wc24gPSB3cWUtPmxwc24gKyAxOwogCQllbHNlIHsKIAkJCXFwLT5zX3BzbisrOwotCQkJaWYgKChpbnQpKHFwLT5zX3BzbiAtIHFwLT5zX25leHRfcHNuKSA+IDApCisJCQlpZiAoaXBhdGhfY21wMjQocXAtPnNfcHNuLCBxcC0+c19uZXh0X3BzbikgPiAwKQogCQkJCXFwLT5zX25leHRfcHNuID0gcXAtPnNfcHNuOwogCQl9CiAJCS8qCkBAIC00MDYsNyArNDcxLDcgQEAKIAkJLyogRkFMTFRIUk9VR0ggKi8KIAljYXNlIE9QKFNFTkRfTUlERExFKToKIAkJYnRoMiA9IHFwLT5zX3BzbisrICYgSVBBVEhfUFNOX01BU0s7Ci0JCWlmICgoaW50KShxcC0+c19wc24gLSBxcC0+c19uZXh0X3BzbikgPiAwKQorCQlpZiAoaXBhdGhfY21wMjQocXAtPnNfcHNuLCBxcC0+c19uZXh0X3BzbikgPiAwKQogCQkJcXAtPnNfbmV4dF9wc24gPSBxcC0+c19wc247CiAJCXNzID0gJnFwLT5zX3NnZTsKIAkJbGVuID0gcXAtPnNfbGVuOwpAQCAtNDQyLDcgKzUwNyw3IEBACiAJCS8qIEZBTExUSFJPVUdIICovCiAJY2FzZSBPUChSRE1BX1dSSVRFX01JRERMRSk6CiAJCWJ0aDIgPSBxcC0+c19wc24rKyAmIElQQVRIX1BTTl9NQVNLOwotCQlpZiAoKGludCkocXAtPnNfcHNuIC0gcXAtPnNfbmV4dF9wc24pID4gMCkKKwkJaWYgKGlwYXRoX2NtcDI0KHFwLT5zX3BzbiwgcXAtPnNfbmV4dF9wc24pID4gMCkKIAkJCXFwLT5zX25leHRfcHNuID0gcXAtPnNfcHNuOwogCQlzcyA9ICZxcC0+c19zZ2U7CiAJCWxlbiA9IHFwLT5zX2xlbjsKQEAgLTQ3OSw5ICs1NDQsOSBAQAogCQkJY3B1X3RvX2JlMzIod3FlLT53ci53ci5yZG1hLnJrZXkpOwogCQlvaGRyLT51LnJjLnJldGgubGVuZ3RoID0gY3B1X3RvX2JlMzIocXAtPnNfbGVuKTsKIAkJcXAtPnNfc3RhdGUgPSBPUChSRE1BX1JFQURfUkVRVUVTVCk7Ci0JCWh3b3JkcyArPSBzaXplb2Yob2hkci0+dS5yYy5yZXRoKSAvIDQ7CisJCWh3b3JkcyArPSBzaXplb2Yob2hkci0+dS5yYy5yZXRoKSAvIHNpemVvZih1MzIpOwogCQlidGgyID0gcXAtPnNfcHNuKysgJiBJUEFUSF9QU05fTUFTSzsKLQkJaWYgKChpbnQpKHFwLT5zX3BzbiAtIHFwLT5zX25leHRfcHNuKSA+IDApCisJCWlmIChpcGF0aF9jbXAyNChxcC0+c19wc24sIHFwLT5zX25leHRfcHNuKSA+IDApCiAJCQlxcC0+c19uZXh0X3BzbiA9IHFwLT5zX3BzbjsKIAkJc3MgPSBOVUxMOwogCQlsZW4gPSAwOwpAQCAtNDg5LDIwICs1NTQsNiBAQAogCQlpZiAocXAtPnNfY3VyID09IHFwLT5zX3NpemUpCiAJCQlxcC0+c19jdXIgPSAwOwogCQlicmVhazsKLQotCWNhc2UgT1AoUkRNQV9SRUFEX1JFUVVFU1QpOgotCWNhc2UgT1AoQ09NUEFSRV9TV0FQKToKLQljYXNlIE9QKEZFVENIX0FERCk6Ci0JCS8qCi0JCSAqIFdlIHNob3VsZG4ndCBzdGFydCBhbnl0aGluZyBuZXcgdW50aWwgdGhpcyByZXF1ZXN0IGlzCi0JCSAqIGZpbmlzaGVkLiAgVGhlIEFDSyB3aWxsIGhhbmRsZSByZXNjaGVkdWxpbmcgdXMuICBYWFggVGhlCi0JCSAqIG51bWJlciBvZiBvdXRzdGFuZGluZyBvbmVzIGlzIG5lZ290aWF0ZWQgYXQgY29ubmVjdGlvbgotCQkgKiBzZXR1cCB0aW1lIChzZWUgcGcuIDI1OCwyODkpPyAgWFhYIEFsc28sIGlmIHdlIHN1cHBvcnQKLQkJICogbXVsdGlwbGUgb3V0c3RhbmRpbmcgcmVxdWVzdHMsIHdlIG5lZWQgdG8gY2hlY2sgdGhlIFdRRQotCQkgKiBJQl9TRU5EX0ZFTkNFIGZsYWcgYW5kIG5vdCBzZW5kIGEgbmV3IHJlcXVlc3QgaWYgYSBSRE1BCi0JCSAqIHJlYWQgb3IgYXRvbWljIGlzIHBlbmRpbmcuCi0JCSAqLwotCQlnb3RvIGRvbmU7CiAJfQogCWlmIChpcGF0aF9jbXAyNChxcC0+c19wc24sIHFwLT5zX2xhc3RfcHNuICsgSVBBVEhfUFNOX0NSRURJVCAtIDEpID49IDApCiAJCWJ0aDIgfD0gMSA8PCAzMTsJLyogUmVxdWVzdCBBQ0suICovCkBAIC01MTIsOSArNTYzLDEwIEBACiAJcXAtPnNfY3VyX3NpemUgPSBsZW47CiAJKmJ0aDBwID0gYnRoMCB8IChxcC0+c19zdGF0ZSA8PCAyNCk7CiAJKmJ0aDJwID0gYnRoMjsKK2RvbmU6CiAJcmV0dXJuIDE7CiAKLWRvbmU6CitiYWlsOgogCXJldHVybiAwOwogfQogCkBAIC01MjQsNyArNTc2LDggQEAKICAqCiAgKiBUaGlzIGlzIGNhbGxlZCBmcm9tIGlwYXRoX3JjX3JjdigpIGFuZCBvbmx5IHVzZXMgdGhlIHJlY2VpdmUKICAqIHNpZGUgUVAgc3RhdGUuCi0gKiBOb3RlIHRoYXQgUkRNQSByZWFkcyBhcmUgaGFuZGxlZCBpbiB0aGUgc2VuZCBzaWRlIFFQIHN0YXRlIGFuZCB0YXNrbGV0LgorICogTm90ZSB0aGF0IFJETUEgcmVhZHMgYW5kIGF0b21pY3MgYXJlIGhhbmRsZWQgaW4gdGhlCisgKiBzZW5kIHNpZGUgUVAgc3RhdGUgYW5kIHRhc2tsZXQuCiAgKi8KIHN0YXRpYyB2b2lkIHNlbmRfcmNfYWNrKHN0cnVjdCBpcGF0aF9xcCAqcXApCiB7CkBAIC01MzUsNiArNTg4LDEwIEBACiAJc3RydWN0IGlwYXRoX2liX2hlYWRlciBoZHI7CiAJc3RydWN0IGlwYXRoX290aGVyX2hlYWRlcnMgKm9oZHI7CiAKKwkvKiBEb24ndCBzZW5kIEFDSyBvciBOQUsgaWYgYSBSRE1BIHJlYWQgb3IgYXRvbWljIGlzIHBlbmRpbmcuICovCisJaWYgKHFwLT5yX2hlYWRfYWNrX3F1ZXVlICE9IHFwLT5zX3RhaWxfYWNrX3F1ZXVlKQorCQlnb3RvIHF1ZXVlX2FjazsKKwogCS8qIENvbnN0cnVjdCB0aGUgaGVhZGVyLiAqLwogCW9oZHIgPSAmaGRyLnUub3RoOwogCWxyaDAgPSBJUEFUSF9MUkhfQlRIOwpAQCAtNTQ4LDE5ICs2MDUsMTQgQEAKIAkJbHJoMCA9IElQQVRIX0xSSF9HUkg7CiAJfQogCS8qIHJlYWQgcGtleV9pbmRleCB3L28gbG9jayAoaXRzIGF0b21pYykgKi8KLQlidGgwID0gaXBhdGhfZ2V0X3BrZXkoZGV2LT5kZCwgcXAtPnNfcGtleV9pbmRleCk7CisJYnRoMCA9IGlwYXRoX2dldF9wa2V5KGRldi0+ZGQsIHFwLT5zX3BrZXlfaW5kZXgpIHwKKwkJT1AoQUNLTk9XTEVER0UpIDw8IDI0OwogCWlmIChxcC0+cl9uYWtfc3RhdGUpCiAJCW9oZHItPnUuYWV0aCA9IGNwdV90b19iZTMyKChxcC0+cl9tc24gJiBJUEFUSF9NU05fTUFTSykgfAogCQkJCQkgICAgKHFwLT5yX25ha19zdGF0ZSA8PAogCQkJCQkgICAgIElQQVRIX0FFVEhfQ1JFRElUX1NISUZUKSk7CiAJZWxzZQogCQlvaGRyLT51LmFldGggPSBpcGF0aF9jb21wdXRlX2FldGgocXApOwotCWlmIChxcC0+cl9hY2tfc3RhdGUgPj0gT1AoQ09NUEFSRV9TV0FQKSkgewotCQlidGgwIHw9IE9QKEFUT01JQ19BQ0tOT1dMRURHRSkgPDwgMjQ7Ci0JCW9oZHItPnUuYXQuYXRvbWljX2Fja19ldGggPSBjcHVfdG9fYmU2NChxcC0+cl9hdG9taWNfZGF0YSk7Ci0JCWh3b3JkcyArPSBzaXplb2Yob2hkci0+dS5hdC5hdG9taWNfYWNrX2V0aCkgLyA0OwotCX0gZWxzZQotCQlidGgwIHw9IE9QKEFDS05PV0xFREdFKSA8PCAyNDsKIAlscmgwIHw9IHFwLT5yZW1vdGVfYWhfYXR0ci5zbCA8PCA0OwogCWhkci5scmhbMF0gPSBjcHVfdG9fYmUxNihscmgwKTsKIAloZHIubHJoWzFdID0gY3B1X3RvX2JlMTYocXAtPnJlbW90ZV9haF9hdHRyLmRsaWQpOwpAQCAtNTc0LDMxICs2MjYsMzEgQEAKIAkgKiBJZiB3ZSBjYW4gc2VuZCB0aGUgQUNLLCBjbGVhciB0aGUgQUNLIHN0YXRlLgogCSAqLwogCWlmIChpcGF0aF92ZXJic19zZW5kKGRldi0+ZGQsIGh3b3JkcywgKHUzMiAqKSAmaGRyLCAwLCBOVUxMKSA9PSAwKSB7Ci0JCXFwLT5yX2Fja19zdGF0ZSA9IE9QKEFDS05PV0xFREdFKTsKIAkJZGV2LT5uX3VuaWNhc3RfeG1pdCsrOwotCX0gZWxzZSB7Ci0JCS8qCi0JCSAqIFdlIGFyZSBvdXQgb2YgUElPIGJ1ZmZlcnMgYXQgdGhlIG1vbWVudC4KLQkJICogUGFzcyByZXNwb25zaWJpbGl0eSBmb3Igc2VuZGluZyB0aGUgQUNLIHRvIHRoZQotCQkgKiBzZW5kIHRhc2tsZXQgc28gdGhhdCB3aGVuIGEgUElPIGJ1ZmZlciBiZWNvbWVzCi0JCSAqIGF2YWlsYWJsZSwgdGhlIEFDSyBpcyBzZW50IGFoZWFkIG9mIG90aGVyIG91dGdvaW5nCi0JCSAqIHBhY2tldHMuCi0JCSAqLwotCQlkZXYtPm5fcmNfcWFja3MrKzsKLQkJc3Bpbl9sb2NrX2lycSgmcXAtPnNfbG9jayk7Ci0JCS8qIERvbid0IGNvYWxlc2NlIGlmIGEgUkRNQSByZWFkIG9yIGF0b21pYyBpcyBwZW5kaW5nLiAqLwotCQlpZiAocXAtPnNfYWNrX3N0YXRlID09IE9QKEFDS05PV0xFREdFKSB8fAotCQkgICAgcXAtPnNfYWNrX3N0YXRlIDwgT1AoUkRNQV9SRUFEX1JFUVVFU1QpKSB7Ci0JCQlxcC0+c19hY2tfc3RhdGUgPSBxcC0+cl9hY2tfc3RhdGU7Ci0JCQlxcC0+c19uYWtfc3RhdGUgPSBxcC0+cl9uYWtfc3RhdGU7Ci0JCQlxcC0+c19hY2tfcHNuID0gcXAtPnJfYWNrX3BzbjsKLQkJCXFwLT5yX2Fja19zdGF0ZSA9IE9QKEFDS05PV0xFREdFKTsKLQkJfQotCQlzcGluX3VubG9ja19pcnEoJnFwLT5zX2xvY2spOwotCi0JCS8qIENhbGwgaXBhdGhfZG9fcmNfc2VuZCgpIGluIGFub3RoZXIgdGhyZWFkLiAqLwotCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZxcC0+c190YXNrKTsKKwkJZ290byBkb25lOwogCX0KKworCS8qCisJICogV2UgYXJlIG91dCBvZiBQSU8gYnVmZmVycyBhdCB0aGUgbW9tZW50LgorCSAqIFBhc3MgcmVzcG9uc2liaWxpdHkgZm9yIHNlbmRpbmcgdGhlIEFDSyB0byB0aGUKKwkgKiBzZW5kIHRhc2tsZXQgc28gdGhhdCB3aGVuIGEgUElPIGJ1ZmZlciBiZWNvbWVzCisJICogYXZhaWxhYmxlLCB0aGUgQUNLIGlzIHNlbnQgYWhlYWQgb2Ygb3RoZXIgb3V0Z29pbmcKKwkgKiBwYWNrZXRzLgorCSAqLworCWRldi0+bl9yY19xYWNrcysrOworCitxdWV1ZV9hY2s6CisJc3Bpbl9sb2NrX2lycSgmcXAtPnNfbG9jayk7CisJcXAtPnNfZmxhZ3MgfD0gSVBBVEhfU19BQ0tfUEVORElORzsKKwlxcC0+c19uYWtfc3RhdGUgPSBxcC0+cl9uYWtfc3RhdGU7CisJcXAtPnNfYWNrX3BzbiA9IHFwLT5yX2Fja19wc247CisJc3Bpbl91bmxvY2tfaXJxKCZxcC0+c19sb2NrKTsKKworCS8qIENhbGwgaXBhdGhfZG9fcmNfc2VuZCgpIGluIGFub3RoZXIgdGhyZWFkLiAqLworCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnFwLT5zX3Rhc2spOworCitkb25lOgorCXJldHVybjsKIH0KIAogLyoqCkBAIC03MjcsNyArNzc5LDcgQEAKIAlpZiAod3FlLT53ci5vcGNvZGUgPT0gSUJfV1JfUkRNQV9SRUFEKQogCQlkZXYtPm5fcmNfcmVzZW5kcysrOwogCWVsc2UKLQkJZGV2LT5uX3JjX3Jlc2VuZHMgKz0gKGludClxcC0+c19wc24gLSAoaW50KXBzbjsKKwkJZGV2LT5uX3JjX3Jlc2VuZHMgKz0gKHFwLT5zX3BzbiAtIHBzbikgJiBJUEFUSF9QU05fTUFTSzsKIAogCXJlc2V0X3BzbihxcCwgcHNuKTsKIAl0YXNrbGV0X2hpX3NjaGVkdWxlKCZxcC0+c190YXNrKTsKQEAgLTc3NSwxMCArODI3LDYgQEAKIAkJbGlzdF9kZWxfaW5pdCgmcXAtPnRpbWVyd2FpdCk7CiAJc3Bpbl91bmxvY2soJmRldi0+cGVuZGluZ19sb2NrKTsKIAotCS8qIE5vdGhpbmcgaXMgcGVuZGluZyB0byBBQ0svTkFLLiAqLwotCWlmICh1bmxpa2VseShxcC0+c19sYXN0ID09IHFwLT5zX3RhaWwpKQotCQlnb3RvIGJhaWw7Ci0KIAkvKgogCSAqIE5vdGUgdGhhdCBOQUtzIGltcGxpY2l0bHkgQUNLIG91dHN0YW5kaW5nIFNFTkQgYW5kIFJETUEgd3JpdGUKIAkgKiByZXF1ZXN0cyBhbmQgaW1wbGljaXRseSBOQUsgUkRNQSByZWFkIGFuZCBhdG9taWMgcmVxdWVzdHMgaXNzdWVkCkBAIC04MDYsNyArODU0LDcgQEAKIAkJICovCiAJCWlmICgod3FlLT53ci5vcGNvZGUgPT0gSUJfV1JfUkRNQV9SRUFEICYmCiAJCSAgICAgKG9wY29kZSAhPSBPUChSRE1BX1JFQURfUkVTUE9OU0VfTEFTVCkgfHwKLQkJICAgICAgIGlwYXRoX2NtcDI0KGFja19wc24sIHdxZS0+bHBzbikgIT0gMCkpIHx8CisJCSAgICAgIGlwYXRoX2NtcDI0KGFja19wc24sIHdxZS0+bHBzbikgIT0gMCkpIHx8CiAJCSAgICAoKHdxZS0+d3Iub3Bjb2RlID09IElCX1dSX0FUT01JQ19DTVBfQU5EX1NXUCB8fAogCQkgICAgICB3cWUtPndyLm9wY29kZSA9PSBJQl9XUl9BVE9NSUNfRkVUQ0hfQU5EX0FERCkgJiYKIAkJICAgICAob3Bjb2RlICE9IE9QKEFUT01JQ19BQ0tOT1dMRURHRSkgfHwKQEAgLTgyNCwyMCArODcyLDMzIEBACiAJCQkgKi8KIAkJCWdvdG8gYmFpbDsKIAkJfQotCQlpZiAod3FlLT53ci5vcGNvZGUgPT0gSUJfV1JfUkRNQV9SRUFEIHx8Ci0JCSAgICB3cWUtPndyLm9wY29kZSA9PSBJQl9XUl9BVE9NSUNfQ01QX0FORF9TV1AgfHwKLQkJICAgIHdxZS0+d3Iub3Bjb2RlID09IElCX1dSX0FUT01JQ19GRVRDSF9BTkRfQUREKQotCQkJdGFza2xldF9oaV9zY2hlZHVsZSgmcXAtPnNfdGFzayk7CisJCWlmIChxcC0+c19udW1fcmRfYXRvbWljICYmCisJCSAgICAod3FlLT53ci5vcGNvZGUgPT0gSUJfV1JfUkRNQV9SRUFEIHx8CisJCSAgICAgd3FlLT53ci5vcGNvZGUgPT0gSUJfV1JfQVRPTUlDX0NNUF9BTkRfU1dQIHx8CisJCSAgICAgd3FlLT53ci5vcGNvZGUgPT0gSUJfV1JfQVRPTUlDX0ZFVENIX0FORF9BREQpKSB7CisJCQlxcC0+c19udW1fcmRfYXRvbWljLS07CisJCQkvKiBSZXN0YXJ0IHNlbmRpbmcgdGFzayBpZiBmZW5jZSBpcyBjb21wbGV0ZSAqLworCQkJaWYgKChxcC0+c19mbGFncyAmIElQQVRIX1NfRkVOQ0VfUEVORElORykgJiYKKwkJCSAgICAhcXAtPnNfbnVtX3JkX2F0b21pYykgeworCQkJCXFwLT5zX2ZsYWdzICY9IH5JUEFUSF9TX0ZFTkNFX1BFTkRJTkc7CisJCQkJdGFza2xldF9oaV9zY2hlZHVsZSgmcXAtPnNfdGFzayk7CisJCQl9IGVsc2UgaWYgKHFwLT5zX2ZsYWdzICYgSVBBVEhfU19SRE1BUl9QRU5ESU5HKSB7CisJCQkJcXAtPnNfZmxhZ3MgJj0gfklQQVRIX1NfUkRNQVJfUEVORElORzsKKwkJCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZxcC0+c190YXNrKTsKKwkJCX0KKwkJfQogCQkvKiBQb3N0IGEgc2VuZCBjb21wbGV0aW9uIHF1ZXVlIGVudHJ5IGlmIHJlcXVlc3RlZC4gKi8KLQkJaWYgKCF0ZXN0X2JpdChJUEFUSF9TX1NJR05BTF9SRVFfV1IsICZxcC0+c19mbGFncykgfHwKKwkJaWYgKCEocXAtPnNfZmxhZ3MgJiBJUEFUSF9TX1NJR05BTF9SRVFfV1IpIHx8CiAJCSAgICAod3FlLT53ci5zZW5kX2ZsYWdzICYgSUJfU0VORF9TSUdOQUxFRCkpIHsKIAkJCXdjLndyX2lkID0gd3FlLT53ci53cl9pZDsKIAkJCXdjLnN0YXR1cyA9IElCX1dDX1NVQ0NFU1M7CiAJCQl3Yy5vcGNvZGUgPSBpYl9pcGF0aF93Y19vcGNvZGVbd3FlLT53ci5vcGNvZGVdOwogCQkJd2MudmVuZG9yX2VyciA9IDA7CiAJCQl3Yy5ieXRlX2xlbiA9IHdxZS0+bGVuZ3RoOworCQkJd2MuaW1tX2RhdGEgPSAwOwogCQkJd2MucXAgPSAmcXAtPmlicXA7CiAJCQl3Yy5zcmNfcXAgPSBxcC0+cmVtb3RlX3FwbjsKKwkJCXdjLndjX2ZsYWdzID0gMDsKIAkJCXdjLnBrZXlfaW5kZXggPSAwOwogCQkJd2Muc2xpZCA9IHFwLT5yZW1vdGVfYWhfYXR0ci5kbGlkOwogCQkJd2Muc2wgPSBxcC0+cmVtb3RlX2FoX2F0dHIuc2w7CkBAIC04NTQsMTUgKzkxNSwxOSBAQAogCQlpZiAocXAtPnNfbGFzdCA9PSBxcC0+c19jdXIpIHsKIAkJCWlmICgrK3FwLT5zX2N1ciA+PSBxcC0+c19zaXplKQogCQkJCXFwLT5zX2N1ciA9IDA7CisJCQlxcC0+c19sYXN0ID0gcXAtPnNfY3VyOworCQkJaWYgKHFwLT5zX2xhc3QgPT0gcXAtPnNfdGFpbCkKKwkJCQlicmVhazsKIAkJCXdxZSA9IGdldF9zd3FlX3B0cihxcCwgcXAtPnNfY3VyKTsKIAkJCXFwLT5zX3N0YXRlID0gT1AoU0VORF9MQVNUKTsKIAkJCXFwLT5zX3BzbiA9IHdxZS0+cHNuOworCQl9IGVsc2UgeworCQkJaWYgKCsrcXAtPnNfbGFzdCA+PSBxcC0+c19zaXplKQorCQkJCXFwLT5zX2xhc3QgPSAwOworCQkJaWYgKHFwLT5zX2xhc3QgPT0gcXAtPnNfdGFpbCkKKwkJCQlicmVhazsKKwkJCXdxZSA9IGdldF9zd3FlX3B0cihxcCwgcXAtPnNfbGFzdCk7CiAJCX0KLQkJaWYgKCsrcXAtPnNfbGFzdCA+PSBxcC0+c19zaXplKQotCQkJcXAtPnNfbGFzdCA9IDA7Ci0JCXdxZSA9IGdldF9zd3FlX3B0cihxcCwgcXAtPnNfbGFzdCk7Ci0JCWlmIChxcC0+c19sYXN0ID09IHFwLT5zX3RhaWwpCi0JCQlicmVhazsKIAl9CiAKIAlzd2l0Y2ggKGFldGggPj4gMjkpIHsKQEAgLTg3NCw2ICs5MzksMTggQEAKIAkJCWxpc3RfYWRkX3RhaWwoJnFwLT50aW1lcndhaXQsCiAJCQkJICAgICAgJmRldi0+cGVuZGluZ1tkZXYtPnBlbmRpbmdfaW5kZXhdKTsKIAkJCXNwaW5fdW5sb2NrKCZkZXYtPnBlbmRpbmdfbG9jayk7CisJCQkvKgorCQkJICogSWYgd2UgZ2V0IGEgcGFydGlhbCBBQ0sgZm9yIGEgcmVzZW50IG9wZXJhdGlvbiwKKwkJCSAqIHdlIGNhbiBzdG9wIHJlc2VuZGluZyB0aGUgZWFybGllciBwYWNrZXRzIGFuZAorCQkJICogY29udGludWUgd2l0aCB0aGUgbmV4dCBwYWNrZXQgdGhlIHJlY2VpdmVyIHdhbnRzLgorCQkJICovCisJCQlpZiAoaXBhdGhfY21wMjQocXAtPnNfcHNuLCBwc24pIDw9IDApIHsKKwkJCQlyZXNldF9wc24ocXAsIHBzbiArIDEpOworCQkJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnFwLT5zX3Rhc2spOworCQkJfQorCQl9IGVsc2UgaWYgKGlwYXRoX2NtcDI0KHFwLT5zX3BzbiwgcHNuKSA8PSAwKSB7CisJCQlxcC0+c19zdGF0ZSA9IE9QKFNFTkRfTEFTVCk7CisJCQlxcC0+c19wc24gPSBwc24gKyAxOwogCQl9CiAJCWlwYXRoX2dldF9jcmVkaXQocXAsIGFldGgpOwogCQlxcC0+c19ybnJfcmV0cnkgPSBxcC0+c19ybnJfcmV0cnlfY250OwpAQCAtODg0LDIyICs5NjEsMjMgQEAKIAogCWNhc2UgMToJCS8qIFJOUiBOQUsgKi8KIAkJZGV2LT5uX3Jucl9uYWtzKys7CisJCWlmIChxcC0+c19sYXN0ID09IHFwLT5zX3RhaWwpCisJCQlnb3RvIGJhaWw7CiAJCWlmIChxcC0+c19ybnJfcmV0cnkgPT0gMCkgewotCQkJaWYgKHFwLT5zX2xhc3QgPT0gcXAtPnNfdGFpbCkKLQkJCQlnb3RvIGJhaWw7Ci0KIAkJCXdjLnN0YXR1cyA9IElCX1dDX1JOUl9SRVRSWV9FWENfRVJSOwogCQkJZ290byBjbGFzc19iOwogCQl9CiAJCWlmIChxcC0+c19ybnJfcmV0cnlfY250IDwgNykKIAkJCXFwLT5zX3Jucl9yZXRyeS0tOwotCQlpZiAocXAtPnNfbGFzdCA9PSBxcC0+c190YWlsKQotCQkJZ290byBiYWlsOwogCiAJCS8qIFRoZSBsYXN0IHZhbGlkIFBTTiBpcyB0aGUgcHJldmlvdXMgUFNOLiAqLwogCQl1cGRhdGVfbGFzdF9wc24ocXAsIHBzbiAtIDEpOwogCi0JCWRldi0+bl9yY19yZXNlbmRzICs9IChpbnQpcXAtPnNfcHNuIC0gKGludClwc247CisJCWlmICh3cWUtPndyLm9wY29kZSA9PSBJQl9XUl9SRE1BX1JFQUQpCisJCQlkZXYtPm5fcmNfcmVzZW5kcysrOworCQllbHNlCisJCQlkZXYtPm5fcmNfcmVzZW5kcyArPQorCQkJCShxcC0+c19wc24gLSBwc24pICYgSVBBVEhfUFNOX01BU0s7CiAKIAkJcmVzZXRfcHNuKHFwLCBwc24pOwogCkBAIC05MTAsMjYgKzk4OCwyMCBAQAogCQlnb3RvIGJhaWw7CiAKIAljYXNlIDM6CQkvKiBOQUsgKi8KLQkJLyogVGhlIGxhc3QgdmFsaWQgUFNOIHNlZW4gaXMgdGhlIHByZXZpb3VzIHJlcXVlc3Qncy4gKi8KLQkJaWYgKHFwLT5zX2xhc3QgIT0gcXAtPnNfdGFpbCkKLQkJCXVwZGF0ZV9sYXN0X3BzbihxcCwgd3FlLT5wc24gLSAxKTsKKwkJaWYgKHFwLT5zX2xhc3QgPT0gcXAtPnNfdGFpbCkKKwkJCWdvdG8gYmFpbDsKKwkJLyogVGhlIGxhc3QgdmFsaWQgUFNOIGlzIHRoZSBwcmV2aW91cyBQU04uICovCisJCXVwZGF0ZV9sYXN0X3BzbihxcCwgcHNuIC0gMSk7CiAJCXN3aXRjaCAoKGFldGggPj4gSVBBVEhfQUVUSF9DUkVESVRfU0hJRlQpICYKIAkJCUlQQVRIX0FFVEhfQ1JFRElUX01BU0spIHsKIAkJY2FzZSAwOgkvKiBQU04gc2VxdWVuY2UgZXJyb3IgKi8KIAkJCWRldi0+bl9zZXFfbmFrcysrOwogCQkJLyoKLQkJCSAqIEJhY2sgdXAgdG8gdGhlIHJlc3BvbmRlcidzIGV4cGVjdGVkIFBTTi4gIFhYWAorCQkJICogQmFjayB1cCB0byB0aGUgcmVzcG9uZGVyJ3MgZXhwZWN0ZWQgUFNOLgogCQkJICogTm90ZSB0aGF0IHdlIG1pZ2h0IGdldCBhIE5BSyBpbiB0aGUgbWlkZGxlIG9mIGFuCiAJCQkgKiBSRE1BIFJFQUQgcmVzcG9uc2Ugd2hpY2ggdGVybWluYXRlcyB0aGUgUkRNQQogCQkJICogUkVBRC4KIAkJCSAqLwotCQkJaWYgKHFwLT5zX2xhc3QgPT0gcXAtPnNfdGFpbCkKLQkJCQlicmVhazsKLQotCQkJaWYgKGlwYXRoX2NtcDI0KHBzbiwgd3FlLT5wc24pIDwgMCkKLQkJCQlicmVhazsKLQotCQkJLyogUmV0cnkgdGhlIHJlcXVlc3QuICovCiAJCQlpcGF0aF9yZXN0YXJ0X3JjKHFwLCBwc24sICZ3Yyk7CiAJCQlicmVhazsKIApAQCAtMTAwMyw2ICsxMDc1LDcgQEAKIAkJCQkgICAgIHUzMiBwc24sIHUzMiBoZHJzaXplLCB1MzIgcG10dSwKIAkJCQkgICAgIGludCBoZWFkZXJfaW5fZGF0YSkKIHsKKwlzdHJ1Y3QgaXBhdGhfc3dxZSAqd3FlOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IGliX3djIHdjOwogCWludCBkaWZmOwpAQCAtMTAzMiw2ICsxMTA1LDEwIEBACiAJCWdvdG8gYWNrX2RvbmU7CiAJfQogCisJaWYgKHVubGlrZWx5KHFwLT5zX2xhc3QgPT0gcXAtPnNfdGFpbCkpCisJCWdvdG8gYWNrX2RvbmU7CisJd3FlID0gZ2V0X3N3cWVfcHRyKHFwLCBxcC0+c19sYXN0KTsKKwogCXN3aXRjaCAob3Bjb2RlKSB7CiAJY2FzZSBPUChBQ0tOT1dMRURHRSk6CiAJY2FzZSBPUChBVE9NSUNfQUNLTk9XTEVER0UpOgpAQCAtMTA0MiwzOCArMTExOSw0OSBAQAogCQkJYWV0aCA9IGJlMzJfdG9fY3B1KCgoX19iZTMyICopIGRhdGEpWzBdKTsKIAkJCWRhdGEgKz0gc2l6ZW9mKF9fYmUzMik7CiAJCX0KLQkJaWYgKG9wY29kZSA9PSBPUChBVE9NSUNfQUNLTk9XTEVER0UpKQotCQkJKih1NjQgKikgcXAtPnNfc2dlLnNnZS52YWRkciA9ICoodTY0ICopIGRhdGE7CisJCWlmIChvcGNvZGUgPT0gT1AoQVRPTUlDX0FDS05PV0xFREdFKSkgeworCQkJdTY0IHZhbDsKKworCQkJaWYgKCFoZWFkZXJfaW5fZGF0YSkgeworCQkJCV9fYmUzMiAqcCA9IG9oZHItPnUuYXQuYXRvbWljX2Fja19ldGg7CisKKwkJCQl2YWwgPSAoKHU2NCkgYmUzMl90b19jcHUocFswXSkgPDwgMzIpIHwKKwkJCQkJYmUzMl90b19jcHUocFsxXSk7CisJCQl9IGVsc2UKKwkJCQl2YWwgPSBiZTY0X3RvX2NwdSgoKF9fYmU2NCAqKSBkYXRhKVswXSk7CisJCQkqKHU2NCAqKSB3cWUtPnNnX2xpc3RbMF0udmFkZHIgPSB2YWw7CisJCX0KIAkJaWYgKCFkb19yY19hY2socXAsIGFldGgsIHBzbiwgb3Bjb2RlKSB8fAogCQkgICAgb3Bjb2RlICE9IE9QKFJETUFfUkVBRF9SRVNQT05TRV9GSVJTVCkpCiAJCQlnb3RvIGFja19kb25lOwogCQloZHJzaXplICs9IDQ7CisJCWlmICh1bmxpa2VseSh3cWUtPndyLm9wY29kZSAhPSBJQl9XUl9SRE1BX1JFQUQpKQorCQkJZ290byBhY2tfb3BfZXJyOwogCQkvKgotCQkgKiBkb19yY19hY2soKSBoYXMgYWxyZWFkeSBjaGVja2VkIHRoZSBQU04gc28gc2tpcAotCQkgKiB0aGUgc2VxdWVuY2UgY2hlY2suCisJCSAqIElmIHRoaXMgaXMgYSByZXNwb25zZSB0byBhIHJlc2VudCBSRE1BIHJlYWQsIHdlCisJCSAqIGhhdmUgdG8gYmUgY2FyZWZ1bCB0byBjb3B5IHRoZSBkYXRhIHRvIHRoZSByaWdodAorCQkgKiBsb2NhdGlvbi4KIAkJICovCi0JCWdvdG8gcmRtYV9yZWFkOworCQlxcC0+c19yZG1hX3JlYWRfbGVuID0gcmVzdGFydF9zZ2UoJnFwLT5zX3JkbWFfcmVhZF9zZ2UsCisJCQkJCQkgIHdxZSwgcHNuLCBwbXR1KTsKKwkJZ290byByZWFkX21pZGRsZTsKIAogCWNhc2UgT1AoUkRNQV9SRUFEX1JFU1BPTlNFX01JRERMRSk6CiAJCS8qIG5vIEFFVEgsIG5vIEFDSyAqLwogCQlpZiAodW5saWtlbHkoaXBhdGhfY21wMjQocHNuLCBxcC0+c19sYXN0X3BzbiArIDEpKSkgewogCQkJZGV2LT5uX3JkbWFfc2VxKys7Ci0JCQlpZiAocXAtPnNfbGFzdCAhPSBxcC0+c190YWlsKQotCQkJCWlwYXRoX3Jlc3RhcnRfcmMocXAsIHFwLT5zX2xhc3RfcHNuICsgMSwgJndjKTsKKwkJCWlwYXRoX3Jlc3RhcnRfcmMocXAsIHFwLT5zX2xhc3RfcHNuICsgMSwgJndjKTsKIAkJCWdvdG8gYWNrX2RvbmU7CiAJCX0KLQlyZG1hX3JlYWQ6Ci0JCWlmICh1bmxpa2VseShxcC0+c19zdGF0ZSAhPSBPUChSRE1BX1JFQURfUkVRVUVTVCkpKQotCQkJZ290byBhY2tfZG9uZTsKKwkJaWYgKHVubGlrZWx5KHdxZS0+d3Iub3Bjb2RlICE9IElCX1dSX1JETUFfUkVBRCkpCisJCQlnb3RvIGFja19vcF9lcnI7CisJcmVhZF9taWRkbGU6CiAJCWlmICh1bmxpa2VseSh0bGVuICE9IChoZHJzaXplICsgcG10dSArIDQpKSkKLQkJCWdvdG8gYWNrX2RvbmU7Ci0JCWlmICh1bmxpa2VseShwbXR1ID49IHFwLT5zX2xlbikpCi0JCQlnb3RvIGFja19kb25lOworCQkJZ290byBhY2tfbGVuX2VycjsKKwkJaWYgKHVubGlrZWx5KHBtdHUgPj0gcXAtPnNfcmRtYV9yZWFkX2xlbikpCisJCQlnb3RvIGFja19sZW5fZXJyOworCiAJCS8qIFdlIGdvdCBhIHJlc3BvbnNlIHNvIHVwZGF0ZSB0aGUgdGltZW91dC4gKi8KLQkJaWYgKHVubGlrZWx5KHFwLT5zX2xhc3QgPT0gcXAtPnNfdGFpbCB8fAotCQkJICAgICBnZXRfc3dxZV9wdHIocXAsIHFwLT5zX2xhc3QpLT53ci5vcGNvZGUgIT0KLQkJCSAgICAgSUJfV1JfUkRNQV9SRUFEKSkKLQkJCWdvdG8gYWNrX2RvbmU7CiAJCXNwaW5fbG9jaygmZGV2LT5wZW5kaW5nX2xvY2spOwogCQlpZiAocXAtPnNfcm5yX3RpbWVvdXQgPT0gMCAmJiAhbGlzdF9lbXB0eSgmcXAtPnRpbWVyd2FpdCkpCiAJCQlsaXN0X21vdmVfdGFpbCgmcXAtPnRpbWVyd2FpdCwKQEAgLTEwODIsNjcgKzExNzAsOTcgQEAKIAkJLyoKIAkJICogVXBkYXRlIHRoZSBSRE1BIHJlY2VpdmUgc3RhdGUgYnV0IGRvIHRoZSBjb3B5IHcvbwogCQkgKiBob2xkaW5nIHRoZSBsb2NrcyBhbmQgYmxvY2tpbmcgaW50ZXJydXB0cy4KLQkJICogWFhYIFlldCBhbm90aGVyIHBsYWNlIHRoYXQgYWZmZWN0cyByZWxheGVkIFJETUEgb3JkZXIKLQkJICogc2luY2Ugd2UgZG9uJ3Qgd2FudCBzX3NnZSBtb2RpZmllZC4KIAkJICovCi0JCXFwLT5zX2xlbiAtPSBwbXR1OworCQlxcC0+c19yZG1hX3JlYWRfbGVuIC09IHBtdHU7CiAJCXVwZGF0ZV9sYXN0X3BzbihxcCwgcHNuKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcXAtPnNfbG9jaywgZmxhZ3MpOwotCQlpcGF0aF9jb3B5X3NnZSgmcXAtPnNfc2dlLCBkYXRhLCBwbXR1KTsKKwkJaXBhdGhfY29weV9zZ2UoJnFwLT5zX3JkbWFfcmVhZF9zZ2UsIGRhdGEsIHBtdHUpOwogCQlnb3RvIGJhaWw7CiAKKwljYXNlIE9QKFJETUFfUkVBRF9SRVNQT05TRV9PTkxZKToKKwkJaWYgKHVubGlrZWx5KGlwYXRoX2NtcDI0KHBzbiwgcXAtPnNfbGFzdF9wc24gKyAxKSkpIHsKKwkJCWRldi0+bl9yZG1hX3NlcSsrOworCQkJaXBhdGhfcmVzdGFydF9yYyhxcCwgcXAtPnNfbGFzdF9wc24gKyAxLCAmd2MpOworCQkJZ290byBhY2tfZG9uZTsKKwkJfQorCQlpZiAodW5saWtlbHkod3FlLT53ci5vcGNvZGUgIT0gSUJfV1JfUkRNQV9SRUFEKSkKKwkJCWdvdG8gYWNrX29wX2VycjsKKwkJLyogR2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhlIG1lc3NhZ2Ugd2FzIHBhZGRlZCBieS4gKi8KKwkJcGFkID0gKGJlMzJfdG9fY3B1KG9oZHItPmJ0aFswXSkgPj4gMjApICYgMzsKKwkJLyoKKwkJICogQ2hlY2sgdGhhdCB0aGUgZGF0YSBzaXplIGlzID49IDAgJiYgPD0gcG10dS4KKwkJICogUmVtZW1iZXIgdG8gYWNjb3VudCBmb3IgdGhlIEFFVEggaGVhZGVyICg0KSBhbmQKKwkJICogSUNSQyAoNCkuCisJCSAqLworCQlpZiAodW5saWtlbHkodGxlbiA8IChoZHJzaXplICsgcGFkICsgOCkpKQorCQkJZ290byBhY2tfbGVuX2VycjsKKwkJLyoKKwkJICogSWYgdGhpcyBpcyBhIHJlc3BvbnNlIHRvIGEgcmVzZW50IFJETUEgcmVhZCwgd2UKKwkJICogaGF2ZSB0byBiZSBjYXJlZnVsIHRvIGNvcHkgdGhlIGRhdGEgdG8gdGhlIHJpZ2h0CisJCSAqIGxvY2F0aW9uLgorCQkgKi8KKwkJcXAtPnNfcmRtYV9yZWFkX2xlbiA9IHJlc3RhcnRfc2dlKCZxcC0+c19yZG1hX3JlYWRfc2dlLAorCQkJCQkJICB3cWUsIHBzbiwgcG10dSk7CisJCWdvdG8gcmVhZF9sYXN0OworCiAJY2FzZSBPUChSRE1BX1JFQURfUkVTUE9OU0VfTEFTVCk6CiAJCS8qIEFDS3MgUkVBRCByZXEuICovCiAJCWlmICh1bmxpa2VseShpcGF0aF9jbXAyNChwc24sIHFwLT5zX2xhc3RfcHNuICsgMSkpKSB7CiAJCQlkZXYtPm5fcmRtYV9zZXErKzsKLQkJCWlmIChxcC0+c19sYXN0ICE9IHFwLT5zX3RhaWwpCi0JCQkJaXBhdGhfcmVzdGFydF9yYyhxcCwgcXAtPnNfbGFzdF9wc24gKyAxLCAmd2MpOworCQkJaXBhdGhfcmVzdGFydF9yYyhxcCwgcXAtPnNfbGFzdF9wc24gKyAxLCAmd2MpOwogCQkJZ290byBhY2tfZG9uZTsKIAkJfQotCQkvKiBGQUxMVEhST1VHSCAqLwotCWNhc2UgT1AoUkRNQV9SRUFEX1JFU1BPTlNFX09OTFkpOgotCQlpZiAodW5saWtlbHkocXAtPnNfc3RhdGUgIT0gT1AoUkRNQV9SRUFEX1JFUVVFU1QpKSkKLQkJCWdvdG8gYWNrX2RvbmU7Ci0JCS8qCi0JCSAqIEdldCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoZSBtZXNzYWdlIHdhcyBwYWRkZWQgYnkuCi0JCSAqLworCQlpZiAodW5saWtlbHkod3FlLT53ci5vcGNvZGUgIT0gSUJfV1JfUkRNQV9SRUFEKSkKKwkJCWdvdG8gYWNrX29wX2VycjsKKwkJLyogR2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhlIG1lc3NhZ2Ugd2FzIHBhZGRlZCBieS4gKi8KIAkJcGFkID0gKGJlMzJfdG9fY3B1KG9oZHItPmJ0aFswXSkgPj4gMjApICYgMzsKIAkJLyoKIAkJICogQ2hlY2sgdGhhdCB0aGUgZGF0YSBzaXplIGlzID49IDEgJiYgPD0gcG10dS4KIAkJICogUmVtZW1iZXIgdG8gYWNjb3VudCBmb3IgdGhlIEFFVEggaGVhZGVyICg0KSBhbmQKIAkJICogSUNSQyAoNCkuCiAJCSAqLwotCQlpZiAodW5saWtlbHkodGxlbiA8PSAoaGRyc2l6ZSArIHBhZCArIDgpKSkgewotCQkJLyogWFhYIE5lZWQgdG8gZ2VuZXJhdGUgYW4gZXJyb3IgQ1EgZW50cnkuICovCi0JCQlnb3RvIGFja19kb25lOwotCQl9CisJCWlmICh1bmxpa2VseSh0bGVuIDw9IChoZHJzaXplICsgcGFkICsgOCkpKQorCQkJZ290byBhY2tfbGVuX2VycjsKKwlyZWFkX2xhc3Q6CiAJCXRsZW4gLT0gaGRyc2l6ZSArIHBhZCArIDg7Ci0JCWlmICh1bmxpa2VseSh0bGVuICE9IHFwLT5zX2xlbikpIHsKLQkJCS8qIFhYWCBOZWVkIHRvIGdlbmVyYXRlIGFuIGVycm9yIENRIGVudHJ5LiAqLwotCQkJZ290byBhY2tfZG9uZTsKLQkJfQorCQlpZiAodW5saWtlbHkodGxlbiAhPSBxcC0+c19yZG1hX3JlYWRfbGVuKSkKKwkJCWdvdG8gYWNrX2xlbl9lcnI7CiAJCWlmICghaGVhZGVyX2luX2RhdGEpCiAJCQlhZXRoID0gYmUzMl90b19jcHUob2hkci0+dS5hZXRoKTsKIAkJZWxzZSB7CiAJCQlhZXRoID0gYmUzMl90b19jcHUoKChfX2JlMzIgKikgZGF0YSlbMF0pOwogCQkJZGF0YSArPSBzaXplb2YoX19iZTMyKTsKIAkJfQotCQlpcGF0aF9jb3B5X3NnZSgmcXAtPnNfc2dlLCBkYXRhLCB0bGVuKTsKLQkJaWYgKGRvX3JjX2FjayhxcCwgYWV0aCwgcHNuLCBPUChSRE1BX1JFQURfUkVTUE9OU0VfTEFTVCkpKSB7Ci0JCQkvKgotCQkJICogQ2hhbmdlIHRoZSBzdGF0ZSBzbyB3ZSBjb250aW11ZQotCQkJICogcHJvY2Vzc2luZyBuZXcgcmVxdWVzdHMgYW5kIHdha2UgdXAgdGhlCi0JCQkgKiB0YXNrbGV0IGlmIHRoZXJlIGFyZSBwb3N0ZWQgc2VuZHMuCi0JCQkgKi8KLQkJCXFwLT5zX3N0YXRlID0gT1AoU0VORF9MQVNUKTsKLQkJCWlmIChxcC0+c190YWlsICE9IHFwLT5zX2hlYWQpCi0JCQkJdGFza2xldF9oaV9zY2hlZHVsZSgmcXAtPnNfdGFzayk7Ci0JCX0KKwkJaXBhdGhfY29weV9zZ2UoJnFwLT5zX3JkbWFfcmVhZF9zZ2UsIGRhdGEsIHRsZW4pOworCQkodm9pZCkgZG9fcmNfYWNrKHFwLCBhZXRoLCBwc24sIE9QKFJETUFfUkVBRF9SRVNQT05TRV9MQVNUKSk7CiAJCWdvdG8gYWNrX2RvbmU7CiAJfQogCiBhY2tfZG9uZToKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxcC0+c19sb2NrLCBmbGFncyk7CisJZ290byBiYWlsOworCithY2tfb3BfZXJyOgorCXdjLnN0YXR1cyA9IElCX1dDX0xPQ19RUF9PUF9FUlI7CisJZ290byBhY2tfZXJyOworCithY2tfbGVuX2VycjoKKwl3Yy5zdGF0dXMgPSBJQl9XQ19MT0NfTEVOX0VSUjsKK2Fja19lcnI6CisJd2Mud3JfaWQgPSB3cWUtPndyLndyX2lkOworCXdjLm9wY29kZSA9IGliX2lwYXRoX3djX29wY29kZVt3cWUtPndyLm9wY29kZV07CisJd2MudmVuZG9yX2VyciA9IDA7CisJd2MuYnl0ZV9sZW4gPSAwOworCXdjLmltbV9kYXRhID0gMDsKKwl3Yy5xcCA9ICZxcC0+aWJxcDsKKwl3Yy5zcmNfcXAgPSBxcC0+cmVtb3RlX3FwbjsKKwl3Yy53Y19mbGFncyA9IDA7CisJd2MucGtleV9pbmRleCA9IDA7CisJd2Muc2xpZCA9IHFwLT5yZW1vdGVfYWhfYXR0ci5kbGlkOworCXdjLnNsID0gcXAtPnJlbW90ZV9haF9hdHRyLnNsOworCXdjLmRsaWRfcGF0aF9iaXRzID0gMDsKKwl3Yy5wb3J0X251bSA9IDA7CisJaXBhdGhfc3FlcnJvcl9xcChxcCwgJndjKTsKIGJhaWw6CiAJcmV0dXJuOwogfQpAQCAtMTE2Miw3ICsxMjgwLDcgQEAKICAqIGluY29taW5nIFJDIHBhY2tldCBmb3IgdGhlIGdpdmVuIFFQLgogICogQ2FsbGVkIGF0IGludGVycnVwdCBsZXZlbC4KICAqIFJldHVybiAxIGlmIG5vIG1vcmUgcHJvY2Vzc2luZyBpcyBuZWVkZWQ7IG90aGVyd2lzZSByZXR1cm4gMCB0bwotICogc2NoZWR1bGUgYSByZXNwb25zZSB0byBiZSBzZW50IGFuZCB0aGUgc19sb2NrIHVubG9ja2VkLgorICogc2NoZWR1bGUgYSByZXNwb25zZSB0byBiZSBzZW50LgogICovCiBzdGF0aWMgaW5saW5lIGludCBpcGF0aF9yY19yY3ZfZXJyb3Ioc3RydWN0IGlwYXRoX2liZGV2ICpkZXYsCiAJCQkJICAgICBzdHJ1Y3QgaXBhdGhfb3RoZXJfaGVhZGVycyAqb2hkciwKQEAgLTExNzMsMjUgKzEyOTEsMjMgQEAKIAkJCQkgICAgIGludCBkaWZmLAogCQkJCSAgICAgaW50IGhlYWRlcl9pbl9kYXRhKQogewotCXN0cnVjdCBpYl9yZXRoICpyZXRoOworCXN0cnVjdCBpcGF0aF9hY2tfZW50cnkgKmU7CisJdTggaSwgcHJldjsKKwlpbnQgb2xkX3JlcTsKIAogCWlmIChkaWZmID4gMCkgewogCQkvKgogCQkgKiBQYWNrZXQgc2VxdWVuY2UgZXJyb3IuCiAJCSAqIEEgTkFLIHdpbGwgQUNLIGVhcmxpZXIgc2VuZHMgYW5kIFJETUEgd3JpdGVzLgotCQkgKiBEb24ndCBxdWV1ZSB0aGUgTkFLIGlmIGEgUkRNQSByZWFkLCBhdG9taWMsIG9yCi0JCSAqIE5BSyBpcyBwZW5kaW5nIHRob3VnaC4KKwkJICogRG9uJ3QgcXVldWUgdGhlIE5BSyBpZiB3ZSBhbHJlYWR5IHNlbnQgb25lLgogCQkgKi8KLQkJaWYgKHFwLT5zX2Fja19zdGF0ZSAhPSBPUChBQ0tOT1dMRURHRSkgfHwKLQkJICAgIHFwLT5yX25ha19zdGF0ZSAhPSAwKQotCQkJZ290byBkb25lOwotCQlpZiAocXAtPnJfYWNrX3N0YXRlIDwgT1AoQ09NUEFSRV9TV0FQKSkgewotCQkJcXAtPnJfYWNrX3N0YXRlID0gT1AoU0VORF9PTkxZKTsKKwkJaWYgKCFxcC0+cl9uYWtfc3RhdGUpIHsKIAkJCXFwLT5yX25ha19zdGF0ZSA9IElCX05BS19QU05fRVJST1I7CiAJCQkvKiBVc2UgdGhlIGV4cGVjdGVkIFBTTi4gKi8KIAkJCXFwLT5yX2Fja19wc24gPSBxcC0+cl9wc247CisJCQlnb3RvIHNlbmRfYWNrOwogCQl9Ci0JCWdvdG8gc2VuZF9hY2s7CisJCWdvdG8gZG9uZTsKIAl9CiAKIAkvKgpAQCAtMTIwNCw4ICsxMzIwLDQ2IEBACiAJICogY2FuIGNvYWxlc2NlIGFuIG91dHN0YW5kaW5nIGR1cGxpY2F0ZSBBQ0suICBXZSBoYXZlIHRvCiAJICogc2VuZCB0aGUgZWFybGllc3Qgc28gdGhhdCBSRE1BIHJlYWRzIGNhbiBiZSByZXN0YXJ0ZWQgYXQKIAkgKiB0aGUgcmVxdWVzdGVyJ3MgZXhwZWN0ZWQgUFNOLgorCSAqCisJICogRmlyc3QsIGZpbmQgd2hlcmUgdGhpcyBkdXBsaWNhdGUgUFNOIGZhbGxzIHdpdGhpbiB0aGUKKwkgKiBBQ0tzIHByZXZpb3VzbHkgc2VudC4KIAkgKi8KLQlpZiAob3Bjb2RlID09IE9QKFJETUFfUkVBRF9SRVFVRVNUKSkgeworCXBzbiAmPSBJUEFUSF9QU05fTUFTSzsKKwllID0gTlVMTDsKKwlvbGRfcmVxID0gMTsKKwlzcGluX2xvY2tfaXJxKCZxcC0+c19sb2NrKTsKKwlmb3IgKGkgPSBxcC0+cl9oZWFkX2Fja19xdWV1ZTsgOyBpID0gcHJldikgeworCQlpZiAoaSA9PSBxcC0+c190YWlsX2Fja19xdWV1ZSkKKwkJCW9sZF9yZXEgPSAwOworCQlpZiAoaSkKKwkJCXByZXYgPSBpIC0gMTsKKwkJZWxzZQorCQkJcHJldiA9IElQQVRIX01BWF9SRE1BX0FUT01JQzsKKwkJaWYgKHByZXYgPT0gcXAtPnJfaGVhZF9hY2tfcXVldWUpIHsKKwkJCWUgPSBOVUxMOworCQkJYnJlYWs7CisJCX0KKwkJZSA9ICZxcC0+c19hY2tfcXVldWVbcHJldl07CisJCWlmICghZS0+b3Bjb2RlKSB7CisJCQllID0gTlVMTDsKKwkJCWJyZWFrOworCQl9CisJCWlmIChpcGF0aF9jbXAyNChwc24sIGUtPnBzbikgPj0gMCkKKwkJCWJyZWFrOworCX0KKwlzd2l0Y2ggKG9wY29kZSkgeworCWNhc2UgT1AoUkRNQV9SRUFEX1JFUVVFU1QpOiB7CisJCXN0cnVjdCBpYl9yZXRoICpyZXRoOworCQl1MzIgb2Zmc2V0OworCQl1MzIgbGVuOworCisJCS8qCisJCSAqIElmIHdlIGRpZG4ndCBmaW5kIHRoZSBSRE1BIHJlYWQgcmVxdWVzdCBpbiB0aGUgYWNrIHF1ZXVlLAorCQkgKiBvciB0aGUgc2VuZCB0YXNrbGV0IGlzIGFscmVhZHkgYmFja2VkIHVwIHRvIHNlbmQgYW4KKwkJICogZWFybGllciBlbnRyeSwgd2UgY2FuIGlnbm9yZSB0aGlzIHJlcXVlc3QuCisJCSAqLworCQlpZiAoIWUgfHwgZS0+b3Bjb2RlICE9IE9QKFJETUFfUkVBRF9SRVFVRVNUKSB8fCBvbGRfcmVxKQorCQkJZ290byB1bmxvY2tfZG9uZTsKIAkJLyogUkVUSCBjb21lcyBhZnRlciBCVEggKi8KIAkJaWYgKCFoZWFkZXJfaW5fZGF0YSkKIAkJCXJldGggPSAmb2hkci0+dS5yYy5yZXRoOwpAQCAtMTIxNCw4OCArMTM2OCw4NyBAQAogCQkJZGF0YSArPSBzaXplb2YoKnJldGgpOwogCQl9CiAJCS8qCi0JCSAqIElmIHdlIHJlY2VpdmUgYSBkdXBsaWNhdGUgUkRNQSByZXF1ZXN0LCBpdCBtZWFucyB0aGUKLQkJICogcmVxdWVzdGVyIHNhdyBhIHNlcXVlbmNlIGVycm9yIGFuZCBuZWVkcyB0byByZXN0YXJ0Ci0JCSAqIGZyb20gYW4gZWFybGllciBwb2ludC4gIFdlIGNhbiBhYm9ydCB0aGUgY3VycmVudAotCQkgKiBSRE1BIHJlYWQgc2VuZCBpbiB0aGF0IGNhc2UuCisJCSAqIEFkZHJlc3MgcmFuZ2UgbXVzdCBiZSBhIHN1YnNldCBvZiB0aGUgb3JpZ2luYWwKKwkJICogcmVxdWVzdCBhbmQgc3RhcnQgb24gcG10dSBib3VuZGFyaWVzLgorCQkgKiBXZSByZXVzZSB0aGUgb2xkIGFja19xdWV1ZSBzbG90IHNpbmNlIHRoZSByZXF1ZXN0ZXIKKwkJICogc2hvdWxkIG5vdCBiYWNrIHVwIGFuZCByZXF1ZXN0IGFuIGVhcmxpZXIgUFNOIGZvciB0aGUKKwkJICogc2FtZSByZXF1ZXN0LgogCQkgKi8KLQkJc3Bpbl9sb2NrX2lycSgmcXAtPnNfbG9jayk7Ci0JCWlmIChxcC0+c19hY2tfc3RhdGUgIT0gT1AoQUNLTk9XTEVER0UpICYmCi0JCSAgICAocXAtPnNfaGRyd29yZHMgfHwgaXBhdGhfY21wMjQocHNuLCBxcC0+c19hY2tfcHNuKSA+PSAwKSkgewotCQkJLyoKLQkJCSAqIFdlIGFyZSBhbHJlYWR5IHNlbmRpbmcgZWFybGllciByZXF1ZXN0ZWQgZGF0YS4KLQkJCSAqIERvbid0IGFib3J0IGl0IHRvIHNlbmQgbGF0ZXIgb3V0IG9mIHNlcXVlbmNlIGRhdGEuCi0JCQkgKi8KLQkJCXNwaW5fdW5sb2NrX2lycSgmcXAtPnNfbG9jayk7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQkJcXAtPnNfcmRtYV9sZW4gPSBiZTMyX3RvX2NwdShyZXRoLT5sZW5ndGgpOwotCQlpZiAocXAtPnNfcmRtYV9sZW4gIT0gMCkgeworCQlvZmZzZXQgPSAoKHBzbiAtIGUtPnBzbikgJiBJUEFUSF9QU05fTUFTSykgKgorCQkJaWJfbXR1X2VudW1fdG9faW50KHFwLT5wYXRoX210dSk7CisJCWxlbiA9IGJlMzJfdG9fY3B1KHJldGgtPmxlbmd0aCk7CisJCWlmICh1bmxpa2VseShvZmZzZXQgKyBsZW4gPiBlLT5yZG1hX3NnZS5zZ2Uuc2dlX2xlbmd0aCkpCisJCQlnb3RvIHVubG9ja19kb25lOworCQlpZiAobGVuICE9IDApIHsKIAkJCXUzMiBya2V5ID0gYmUzMl90b19jcHUocmV0aC0+cmtleSk7CiAJCQl1NjQgdmFkZHIgPSBiZTY0X3RvX2NwdShyZXRoLT52YWRkcik7CiAJCQlpbnQgb2s7CiAKLQkJCS8qCi0JCQkgKiBBZGRyZXNzIHJhbmdlIG11c3QgYmUgYSBzdWJzZXQgb2YgdGhlIG9yaWdpbmFsCi0JCQkgKiByZXF1ZXN0IGFuZCBzdGFydCBvbiBwbXR1IGJvdW5kYXJpZXMuCi0JCQkgKi8KLQkJCW9rID0gaXBhdGhfcmtleV9vayhxcCwgJnFwLT5zX3JkbWFfc2dlLAotCQkJCQkgICBxcC0+c19yZG1hX2xlbiwgdmFkZHIsIHJrZXksCisJCQlvayA9IGlwYXRoX3JrZXlfb2socXAsICZlLT5yZG1hX3NnZSwKKwkJCQkJICAgbGVuLCB2YWRkciwgcmtleSwKIAkJCQkJICAgSUJfQUNDRVNTX1JFTU9URV9SRUFEKTsKLQkJCWlmICh1bmxpa2VseSghb2spKSB7Ci0JCQkJc3Bpbl91bmxvY2tfaXJxKCZxcC0+c19sb2NrKTsKLQkJCQlnb3RvIGRvbmU7Ci0JCQl9CisJCQlpZiAodW5saWtlbHkoIW9rKSkKKwkJCQlnb3RvIHVubG9ja19kb25lOwogCQl9IGVsc2UgewotCQkJcXAtPnNfcmRtYV9zZ2Uuc2dfbGlzdCA9IE5VTEw7Ci0JCQlxcC0+c19yZG1hX3NnZS5udW1fc2dlID0gMDsKLQkJCXFwLT5zX3JkbWFfc2dlLnNnZS5tciA9IE5VTEw7Ci0JCQlxcC0+c19yZG1hX3NnZS5zZ2UudmFkZHIgPSBOVUxMOwotCQkJcXAtPnNfcmRtYV9zZ2Uuc2dlLmxlbmd0aCA9IDA7Ci0JCQlxcC0+c19yZG1hX3NnZS5zZ2Uuc2dlX2xlbmd0aCA9IDA7CisJCQllLT5yZG1hX3NnZS5zZ19saXN0ID0gTlVMTDsKKwkJCWUtPnJkbWFfc2dlLm51bV9zZ2UgPSAwOworCQkJZS0+cmRtYV9zZ2Uuc2dlLm1yID0gTlVMTDsKKwkJCWUtPnJkbWFfc2dlLnNnZS52YWRkciA9IE5VTEw7CisJCQllLT5yZG1hX3NnZS5zZ2UubGVuZ3RoID0gMDsKKwkJCWUtPnJkbWFfc2dlLnNnZS5zZ2VfbGVuZ3RoID0gMDsKIAkJfQotCQlxcC0+c19hY2tfc3RhdGUgPSBvcGNvZGU7Ci0JCXFwLT5zX2Fja19wc24gPSBwc247Ci0JCXNwaW5fdW5sb2NrX2lycSgmcXAtPnNfbG9jayk7Ci0JCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnFwLT5zX3Rhc2spOwotCQlnb3RvIHNlbmRfYWNrOwotCX0KLQotCS8qCi0JICogQSBwZW5kaW5nIFJETUEgcmVhZCB3aWxsIEFDSyBhbnl0aGluZyBiZWZvcmUgaXQgc28KLQkgKiBpZ25vcmUgZWFybGllciBkdXBsaWNhdGUgcmVxdWVzdHMuCi0JICovCi0JaWYgKHFwLT5zX2Fja19zdGF0ZSAhPSBPUChBQ0tOT1dMRURHRSkpCi0JCWdvdG8gZG9uZTsKLQotCS8qCi0JICogSWYgYW4gQUNLIGlzIHBlbmRpbmcsIGRvbid0IHJlcGxhY2UgdGhlIHBlbmRpbmcgQUNLCi0JICogd2l0aCBhbiBlYXJsaWVyIG9uZSBzaW5jZSB0aGUgbGF0ZXIgb25lIHdpbGwgQUNLIHRoZSBlYXJsaWVyLgotCSAqIEFsc28sIGlmIHdlIGFscmVhZHkgaGF2ZSBhIHBlbmRpbmcgYXRvbWljLCBzZW5kIGl0LgotCSAqLwotCWlmIChxcC0+cl9hY2tfc3RhdGUgIT0gT1AoQUNLTk9XTEVER0UpICYmCi0JICAgIChpcGF0aF9jbXAyNChwc24sIHFwLT5yX2Fja19wc24pIDw9IDAgfHwKLQkgICAgIHFwLT5yX2Fja19zdGF0ZSA+PSBPUChDT01QQVJFX1NXQVApKSkKLQkJZ290byBzZW5kX2FjazsKLQlzd2l0Y2ggKG9wY29kZSkgewotCWNhc2UgT1AoQ09NUEFSRV9TV0FQKToKLQljYXNlIE9QKEZFVENIX0FERCk6Ci0JCS8qCi0JCSAqIENoZWNrIGZvciB0aGUgUFNOIG9mIHRoZSBsYXN0IGF0b21pYyBvcGVyYXRpb24KLQkJICogcGVyZm9ybWVkIGFuZCByZXNlbmQgdGhlIHJlc3VsdCBpZiBmb3VuZC4KLQkJICovCi0JCWlmICgocHNuICYgSVBBVEhfUFNOX01BU0spICE9IHFwLT5yX2F0b21pY19wc24pCi0JCQlnb3RvIGRvbmU7CisJCWUtPnBzbiA9IHBzbjsKKwkJcXAtPnNfYWNrX3N0YXRlID0gT1AoQUNLTk9XTEVER0UpOworCQlxcC0+c190YWlsX2Fja19xdWV1ZSA9IHByZXY7CiAJCWJyZWFrOwogCX0KLQlxcC0+cl9hY2tfc3RhdGUgPSBvcGNvZGU7Ci0JcXAtPnJfbmFrX3N0YXRlID0gMDsKLQlxcC0+cl9hY2tfcHNuID0gcHNuOwotc2VuZF9hY2s6Ci0JcmV0dXJuIDA7CiAKKwljYXNlIE9QKENPTVBBUkVfU1dBUCk6CisJY2FzZSBPUChGRVRDSF9BREQpOiB7CisJCS8qCisJCSAqIElmIHdlIGRpZG4ndCBmaW5kIHRoZSBhdG9taWMgcmVxdWVzdCBpbiB0aGUgYWNrIHF1ZXVlCisJCSAqIG9yIHRoZSBzZW5kIHRhc2tsZXQgaXMgYWxyZWFkeSBiYWNrZWQgdXAgdG8gc2VuZCBhbgorCQkgKiBlYXJsaWVyIGVudHJ5LCB3ZSBjYW4gaWdub3JlIHRoaXMgcmVxdWVzdC4KKwkJICovCisJCWlmICghZSB8fCBlLT5vcGNvZGUgIT0gKHU4KSBvcGNvZGUgfHwgb2xkX3JlcSkKKwkJCWdvdG8gdW5sb2NrX2RvbmU7CisJCXFwLT5zX2Fja19zdGF0ZSA9IE9QKEFDS05PV0xFREdFKTsKKwkJcXAtPnNfdGFpbF9hY2tfcXVldWUgPSBwcmV2OworCQlicmVhazsKKwl9CisKKwlkZWZhdWx0OgorCQlpZiAob2xkX3JlcSkKKwkJCWdvdG8gdW5sb2NrX2RvbmU7CisJCS8qCisJCSAqIFJlc2VuZCB0aGUgbW9zdCByZWNlbnQgQUNLIGlmIHRoaXMgcmVxdWVzdCBpcworCQkgKiBhZnRlciBhbGwgdGhlIHByZXZpb3VzIFJETUEgcmVhZHMgYW5kIGF0b21pY3MuCisJCSAqLworCQlpZiAoaSA9PSBxcC0+cl9oZWFkX2Fja19xdWV1ZSkgeworCQkJc3Bpbl91bmxvY2tfaXJxKCZxcC0+c19sb2NrKTsKKwkJCXFwLT5yX25ha19zdGF0ZSA9IDA7CisJCQlxcC0+cl9hY2tfcHNuID0gcXAtPnJfcHNuIC0gMTsKKwkJCWdvdG8gc2VuZF9hY2s7CisJCX0KKwkJLyoKKwkJICogUmVzZW5kIHRoZSBSRE1BIHJlYWQgb3IgYXRvbWljIG9wIHdoaWNoCisJCSAqIEFDS3MgdGhpcyBkdXBsaWNhdGUgcmVxdWVzdC4KKwkJICovCisJCXFwLT5zX2Fja19zdGF0ZSA9IE9QKEFDS05PV0xFREdFKTsKKwkJcXAtPnNfdGFpbF9hY2tfcXVldWUgPSBpOworCQlicmVhazsKKwl9CisJcXAtPnJfbmFrX3N0YXRlID0gMDsKKwlzcGluX3VubG9ja19pcnEoJnFwLT5zX2xvY2spOworCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnFwLT5zX3Rhc2spOworCit1bmxvY2tfZG9uZToKKwlzcGluX3VubG9ja19pcnEoJnFwLT5zX2xvY2spOwogZG9uZToKIAlyZXR1cm4gMTsKKworc2VuZF9hY2s6CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIGlwYXRoX3JjX2Vycm9yKHN0cnVjdCBpcGF0aF9xcCAqcXAsIGVudW0gaWJfd2Nfc3RhdHVzIGVycikKQEAgLTEzOTEsMTUgKzE1NDQsNyBAQAogCQkgICAgb3Bjb2RlID09IE9QKFNFTkRfTEFTVF9XSVRIX0lNTUVESUFURSkpCiAJCQlicmVhazsKIAluYWNrX2ludjoKLQkJLyoKLQkJICogQSBOQUsgd2lsbCBBQ0sgZWFybGllciBzZW5kcyBhbmQgUkRNQSB3cml0ZXMuCi0JCSAqIERvbid0IHF1ZXVlIHRoZSBOQUsgaWYgYSBSRE1BIHJlYWQsIGF0b21pYywgb3IgTkFLCi0JCSAqIGlzIHBlbmRpbmcgdGhvdWdoLgotCQkgKi8KLQkJaWYgKHFwLT5yX2Fja19zdGF0ZSA+PSBPUChDT01QQVJFX1NXQVApKQotCQkJZ290byBzZW5kX2FjazsKIAkJaXBhdGhfcmNfZXJyb3IocXAsIElCX1dDX1JFTV9JTlZfUkVRX0VSUik7Ci0JCXFwLT5yX2Fja19zdGF0ZSA9IE9QKFNFTkRfT05MWSk7CiAJCXFwLT5yX25ha19zdGF0ZSA9IElCX05BS19JTlZBTElEX1JFUVVFU1Q7CiAJCXFwLT5yX2Fja19wc24gPSBxcC0+cl9wc247CiAJCWdvdG8gc2VuZF9hY2s7CkBAIC0xNDQxLDkgKzE1ODYsOCBAQAogCQkJICogRG9uJ3QgcXVldWUgdGhlIE5BSyBpZiBhIFJETUEgcmVhZCBvciBhdG9taWMKIAkJCSAqIGlzIHBlbmRpbmcgdGhvdWdoLgogCQkJICovCi0JCQlpZiAocXAtPnJfYWNrX3N0YXRlID49IE9QKENPTVBBUkVfU1dBUCkpCi0JCQkJZ290byBzZW5kX2FjazsKLQkJCXFwLT5yX2Fja19zdGF0ZSA9IE9QKFNFTkRfT05MWSk7CisJCQlpZiAocXAtPnJfbmFrX3N0YXRlKQorCQkJCWdvdG8gZG9uZTsKIAkJCXFwLT5yX25ha19zdGF0ZSA9IElCX1JOUl9OQUsgfCBxcC0+cl9taW5fcm5yX3RpbWVyOwogCQkJcXAtPnJfYWNrX3BzbiA9IHFwLT5yX3BzbjsKIAkJCWdvdG8gc2VuZF9hY2s7CkBAIC0xNTY3LDcgKzE3MTEsMTkgQEAKIAkJCWdvdG8gcm5yX25hazsKIAkJZ290byBzZW5kX2xhc3RfaW1tOwogCi0JY2FzZSBPUChSRE1BX1JFQURfUkVRVUVTVCk6CisJY2FzZSBPUChSRE1BX1JFQURfUkVRVUVTVCk6IHsKKwkJc3RydWN0IGlwYXRoX2Fja19lbnRyeSAqZTsKKwkJdTMyIGxlbjsKKwkJdTggbmV4dDsKKworCQlpZiAodW5saWtlbHkoIShxcC0+cXBfYWNjZXNzX2ZsYWdzICYgSUJfQUNDRVNTX1JFTU9URV9SRUFEKSkpCisJCQlnb3RvIG5hY2tfYWNjOworCQluZXh0ID0gcXAtPnJfaGVhZF9hY2tfcXVldWUgKyAxOworCQlpZiAobmV4dCA+IElQQVRIX01BWF9SRE1BX0FUT01JQykKKwkJCW5leHQgPSAwOworCQlpZiAodW5saWtlbHkobmV4dCA9PSBxcC0+c190YWlsX2Fja19xdWV1ZSkpCisJCQlnb3RvIG5hY2tfaW52OworCQllID0gJnFwLT5zX2Fja19xdWV1ZVtxcC0+cl9oZWFkX2Fja19xdWV1ZV07CiAJCS8qIFJFVEggY29tZXMgYWZ0ZXIgQlRIICovCiAJCWlmICghaGVhZGVyX2luX2RhdGEpCiAJCQlyZXRoID0gJm9oZHItPnUucmMucmV0aDsKQEAgLTE1NzUsNzIgKzE3MzEsNzUgQEAKIAkJCXJldGggPSAoc3RydWN0IGliX3JldGggKilkYXRhOwogCQkJZGF0YSArPSBzaXplb2YoKnJldGgpOwogCQl9Ci0JCWlmICh1bmxpa2VseSghKHFwLT5xcF9hY2Nlc3NfZmxhZ3MgJgotCQkJICAgICAgIElCX0FDQ0VTU19SRU1PVEVfUkVBRCkpKQotCQkJZ290byBuYWNrX2FjYzsKLQkJc3Bpbl9sb2NrX2lycSgmcXAtPnNfbG9jayk7Ci0JCXFwLT5zX3JkbWFfbGVuID0gYmUzMl90b19jcHUocmV0aC0+bGVuZ3RoKTsKLQkJaWYgKHFwLT5zX3JkbWFfbGVuICE9IDApIHsKKwkJbGVuID0gYmUzMl90b19jcHUocmV0aC0+bGVuZ3RoKTsKKwkJaWYgKGxlbikgewogCQkJdTMyIHJrZXkgPSBiZTMyX3RvX2NwdShyZXRoLT5ya2V5KTsKIAkJCXU2NCB2YWRkciA9IGJlNjRfdG9fY3B1KHJldGgtPnZhZGRyKTsKIAkJCWludCBvazsKIAogCQkJLyogQ2hlY2sgcmtleSAmIE5BSyAqLwotCQkJb2sgPSBpcGF0aF9ya2V5X29rKHFwLCAmcXAtPnNfcmRtYV9zZ2UsCi0JCQkJCSAgIHFwLT5zX3JkbWFfbGVuLCB2YWRkciwgcmtleSwKLQkJCQkJICAgSUJfQUNDRVNTX1JFTU9URV9SRUFEKTsKLQkJCWlmICh1bmxpa2VseSghb2spKSB7Ci0JCQkJc3Bpbl91bmxvY2tfaXJxKCZxcC0+c19sb2NrKTsKKwkJCW9rID0gaXBhdGhfcmtleV9vayhxcCwgJmUtPnJkbWFfc2dlLCBsZW4sIHZhZGRyLAorCQkJCQkgICBya2V5LCBJQl9BQ0NFU1NfUkVNT1RFX1JFQUQpOworCQkJaWYgKHVubGlrZWx5KCFvaykpCiAJCQkJZ290byBuYWNrX2FjYzsKLQkJCX0KIAkJCS8qCiAJCQkgKiBVcGRhdGUgdGhlIG5leHQgZXhwZWN0ZWQgUFNOLiAgV2UgYWRkIDEgbGF0ZXIKIAkJCSAqIGJlbG93LCBzbyBvbmx5IGFkZCB0aGUgcmVtYWluZGVyIGhlcmUuCiAJCQkgKi8KLQkJCWlmIChxcC0+c19yZG1hX2xlbiA+IHBtdHUpCi0JCQkJcXAtPnJfcHNuICs9IChxcC0+c19yZG1hX2xlbiAtIDEpIC8gcG10dTsKKwkJCWlmIChsZW4gPiBwbXR1KQorCQkJCXFwLT5yX3BzbiArPSAobGVuIC0gMSkgLyBwbXR1OwogCQl9IGVsc2UgewotCQkJcXAtPnNfcmRtYV9zZ2Uuc2dfbGlzdCA9IE5VTEw7Ci0JCQlxcC0+c19yZG1hX3NnZS5udW1fc2dlID0gMDsKLQkJCXFwLT5zX3JkbWFfc2dlLnNnZS5tciA9IE5VTEw7Ci0JCQlxcC0+c19yZG1hX3NnZS5zZ2UudmFkZHIgPSBOVUxMOwotCQkJcXAtPnNfcmRtYV9zZ2Uuc2dlLmxlbmd0aCA9IDA7Ci0JCQlxcC0+c19yZG1hX3NnZS5zZ2Uuc2dlX2xlbmd0aCA9IDA7CisJCQllLT5yZG1hX3NnZS5zZ19saXN0ID0gTlVMTDsKKwkJCWUtPnJkbWFfc2dlLm51bV9zZ2UgPSAwOworCQkJZS0+cmRtYV9zZ2Uuc2dlLm1yID0gTlVMTDsKKwkJCWUtPnJkbWFfc2dlLnNnZS52YWRkciA9IE5VTEw7CisJCQllLT5yZG1hX3NnZS5zZ2UubGVuZ3RoID0gMDsKKwkJCWUtPnJkbWFfc2dlLnNnZS5zZ2VfbGVuZ3RoID0gMDsKIAkJfQorCQllLT5vcGNvZGUgPSBvcGNvZGU7CisJCWUtPnBzbiA9IHBzbjsKIAkJLyoKIAkJICogV2UgbmVlZCB0byBpbmNyZW1lbnQgdGhlIE1TTiBoZXJlIGluc3RlYWQgb2Ygd2hlbiB3ZQogCQkgKiBmaW5pc2ggc2VuZGluZyB0aGUgcmVzdWx0IHNpbmNlIGEgZHVwbGljYXRlIHJlcXVlc3Qgd291bGQKIAkJICogaW5jcmVtZW50IGl0IG1vcmUgdGhhbiBvbmNlLgogCQkgKi8KIAkJcXAtPnJfbXNuKys7Ci0KLQkJcXAtPnNfYWNrX3N0YXRlID0gb3Bjb2RlOwotCQlxcC0+c19hY2tfcHNuID0gcHNuOwotCQlzcGluX3VubG9ja19pcnEoJnFwLT5zX2xvY2spOwotCiAJCXFwLT5yX3BzbisrOwogCQlxcC0+cl9zdGF0ZSA9IG9wY29kZTsKIAkJcXAtPnJfbmFrX3N0YXRlID0gMDsKKwkJYmFycmllcigpOworCQlxcC0+cl9oZWFkX2Fja19xdWV1ZSA9IG5leHQ7CiAKIAkJLyogQ2FsbCBpcGF0aF9kb19yY19zZW5kKCkgaW4gYW5vdGhlciB0aHJlYWQuICovCiAJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnFwLT5zX3Rhc2spOwogCiAJCWdvdG8gZG9uZTsKKwl9CiAKIAljYXNlIE9QKENPTVBBUkVfU1dBUCk6CiAJY2FzZSBPUChGRVRDSF9BREQpOiB7CiAJCXN0cnVjdCBpYl9hdG9taWNfZXRoICphdGV0aDsKKwkJc3RydWN0IGlwYXRoX2Fja19lbnRyeSAqZTsKIAkJdTY0IHZhZGRyOworCQlhdG9taWM2NF90ICptYWRkcjsKIAkJdTY0IHNkYXRhOwogCQl1MzIgcmtleTsKKwkJdTggbmV4dDsKIAorCQlpZiAodW5saWtlbHkoIShxcC0+cXBfYWNjZXNzX2ZsYWdzICYKKwkJCSAgICAgICBJQl9BQ0NFU1NfUkVNT1RFX0FUT01JQykpKQorCQkJZ290byBuYWNrX2FjYzsKKwkJbmV4dCA9IHFwLT5yX2hlYWRfYWNrX3F1ZXVlICsgMTsKKwkJaWYgKG5leHQgPiBJUEFUSF9NQVhfUkRNQV9BVE9NSUMpCisJCQluZXh0ID0gMDsKKwkJaWYgKHVubGlrZWx5KG5leHQgPT0gcXAtPnNfdGFpbF9hY2tfcXVldWUpKQorCQkJZ290byBuYWNrX2ludjsKIAkJaWYgKCFoZWFkZXJfaW5fZGF0YSkKIAkJCWF0ZXRoID0gJm9oZHItPnUuYXRvbWljX2V0aDsKLQkJZWxzZSB7CisJCWVsc2UKIAkJCWF0ZXRoID0gKHN0cnVjdCBpYl9hdG9taWNfZXRoICopZGF0YTsKLQkJCWRhdGEgKz0gc2l6ZW9mKCphdGV0aCk7Ci0JCX0KLQkJdmFkZHIgPSBiZTY0X3RvX2NwdShhdGV0aC0+dmFkZHIpOworCQl2YWRkciA9ICgodTY0KSBiZTMyX3RvX2NwdShhdGV0aC0+dmFkZHJbMF0pIDw8IDMyKSB8CisJCQliZTMyX3RvX2NwdShhdGV0aC0+dmFkZHJbMV0pOwogCQlpZiAodW5saWtlbHkodmFkZHIgJiAoc2l6ZW9mKHU2NCkgLSAxKSkpCiAJCQlnb3RvIG5hY2tfaW52OwogCQlya2V5ID0gYmUzMl90b19jcHUoYXRldGgtPnJrZXkpOwpAQCAtMTY0OSw2MyArMTgwOCw1MCBAQAogCQkJCQkgICAgc2l6ZW9mKHU2NCksIHZhZGRyLCBya2V5LAogCQkJCQkgICAgSUJfQUNDRVNTX1JFTU9URV9BVE9NSUMpKSkKIAkJCWdvdG8gbmFja19hY2M7Ci0JCWlmICh1bmxpa2VseSghKHFwLT5xcF9hY2Nlc3NfZmxhZ3MgJgotCQkJICAgICAgIElCX0FDQ0VTU19SRU1PVEVfQVRPTUlDKSkpCi0JCQlnb3RvIG5hY2tfYWNjOwogCQkvKiBQZXJmb3JtIGF0b21pYyBPUCBhbmQgc2F2ZSByZXN1bHQuICovCisJCW1hZGRyID0gKGF0b21pYzY0X3QgKikgcXAtPnJfc2dlLnNnZS52YWRkcjsKIAkJc2RhdGEgPSBiZTY0X3RvX2NwdShhdGV0aC0+c3dhcF9kYXRhKTsKLQkJc3Bpbl9sb2NrX2lycSgmZGV2LT5wZW5kaW5nX2xvY2spOwotCQlxcC0+cl9hdG9taWNfZGF0YSA9ICoodTY0ICopIHFwLT5yX3NnZS5zZ2UudmFkZHI7Ci0JCWlmIChvcGNvZGUgPT0gT1AoRkVUQ0hfQUREKSkKLQkJCSoodTY0ICopIHFwLT5yX3NnZS5zZ2UudmFkZHIgPQotCQkJCXFwLT5yX2F0b21pY19kYXRhICsgc2RhdGE7Ci0JCWVsc2UgaWYgKHFwLT5yX2F0b21pY19kYXRhID09Ci0JCQkgYmU2NF90b19jcHUoYXRldGgtPmNvbXBhcmVfZGF0YSkpCi0JCQkqKHU2NCAqKSBxcC0+cl9zZ2Uuc2dlLnZhZGRyID0gc2RhdGE7Ci0JCXNwaW5fdW5sb2NrX2lycSgmZGV2LT5wZW5kaW5nX2xvY2spOworCQllID0gJnFwLT5zX2Fja19xdWV1ZVtxcC0+cl9oZWFkX2Fja19xdWV1ZV07CisJCWUtPmF0b21pY19kYXRhID0gKG9wY29kZSA9PSBPUChGRVRDSF9BREQpKSA/CisJCQkodTY0KSBhdG9taWM2NF9hZGRfcmV0dXJuKHNkYXRhLCBtYWRkcikgLSBzZGF0YSA6CisJCQkodTY0KSBjbXB4Y2hnKCh1NjQgKikgcXAtPnJfc2dlLnNnZS52YWRkciwKKwkJCQkgICAgICBiZTY0X3RvX2NwdShhdGV0aC0+Y29tcGFyZV9kYXRhKSwKKwkJCQkgICAgICBzZGF0YSk7CisJCWUtPm9wY29kZSA9IG9wY29kZTsKKwkJZS0+cHNuID0gcHNuICYgSVBBVEhfUFNOX01BU0s7CiAJCXFwLT5yX21zbisrOwotCQlxcC0+cl9hdG9taWNfcHNuID0gcHNuICYgSVBBVEhfUFNOX01BU0s7Ci0JCXBzbiB8PSAxIDw8IDMxOwotCQlicmVhazsKKwkJcXAtPnJfcHNuKys7CisJCXFwLT5yX3N0YXRlID0gb3Bjb2RlOworCQlxcC0+cl9uYWtfc3RhdGUgPSAwOworCQliYXJyaWVyKCk7CisJCXFwLT5yX2hlYWRfYWNrX3F1ZXVlID0gbmV4dDsKKworCQkvKiBDYWxsIGlwYXRoX2RvX3JjX3NlbmQoKSBpbiBhbm90aGVyIHRocmVhZC4gKi8KKwkJdGFza2xldF9oaV9zY2hlZHVsZSgmcXAtPnNfdGFzayk7CisKKwkJZ290byBkb25lOwogCX0KIAogCWRlZmF1bHQ6Ci0JCS8qIERyb3AgcGFja2V0IGZvciB1bmtub3duIG9wY29kZXMuICovCi0JCWdvdG8gZG9uZTsKKwkJLyogTkFLIHVua25vd24gb3Bjb2Rlcy4gKi8KKwkJZ290byBuYWNrX2ludjsKIAl9CiAJcXAtPnJfcHNuKys7CiAJcXAtPnJfc3RhdGUgPSBvcGNvZGU7CisJcXAtPnJfYWNrX3BzbiA9IHBzbjsKIAlxcC0+cl9uYWtfc3RhdGUgPSAwOwogCS8qIFNlbmQgYW4gQUNLIGlmIHJlcXVlc3RlZCBvciByZXF1aXJlZC4gKi8KLQlpZiAocHNuICYgKDEgPDwgMzEpKSB7Ci0JCS8qCi0JCSAqIENvYWxlc2NlIEFDS3MgdW5sZXNzIHRoZXJlIGlzIGEgUkRNQSBSRUFEIG9yCi0JCSAqIEFUT01JQyBwZW5kaW5nLgotCQkgKi8KLQkJaWYgKHFwLT5yX2Fja19zdGF0ZSA8IE9QKENPTVBBUkVfU1dBUCkpIHsKLQkJCXFwLT5yX2Fja19zdGF0ZSA9IG9wY29kZTsKLQkJCXFwLT5yX2Fja19wc24gPSBwc247Ci0JCX0KKwlpZiAocHNuICYgKDEgPDwgMzEpKQogCQlnb3RvIHNlbmRfYWNrOwotCX0KIAlnb3RvIGRvbmU7CiAKIG5hY2tfYWNjOgotCS8qCi0JICogQSBOQUsgd2lsbCBBQ0sgZWFybGllciBzZW5kcyBhbmQgUkRNQSB3cml0ZXMuCi0JICogRG9uJ3QgcXVldWUgdGhlIE5BSyBpZiBhIFJETUEgcmVhZCwgYXRvbWljLCBvciBOQUsKLQkgKiBpcyBwZW5kaW5nIHRob3VnaC4KLQkgKi8KLQlpZiAocXAtPnJfYWNrX3N0YXRlIDwgT1AoQ09NUEFSRV9TV0FQKSkgewotCQlpcGF0aF9yY19lcnJvcihxcCwgSUJfV0NfUkVNX0FDQ0VTU19FUlIpOwotCQlxcC0+cl9hY2tfc3RhdGUgPSBPUChSRE1BX1dSSVRFX09OTFkpOwotCQlxcC0+cl9uYWtfc3RhdGUgPSBJQl9OQUtfUkVNT1RFX0FDQ0VTU19FUlJPUjsKLQkJcXAtPnJfYWNrX3BzbiA9IHFwLT5yX3BzbjsKLQl9CisJaXBhdGhfcmNfZXJyb3IocXAsIElCX1dDX1JFTV9BQ0NFU1NfRVJSKTsKKwlxcC0+cl9uYWtfc3RhdGUgPSBJQl9OQUtfUkVNT1RFX0FDQ0VTU19FUlJPUjsKKwlxcC0+cl9hY2tfcHNuID0gcXAtPnJfcHNuOworCiBzZW5kX2FjazoKLQkvKiBTZW5kIEFDSyByaWdodCBhd2F5IHVubGVzcyB0aGUgc2VuZCB0YXNrbGV0IGhhcyBhIHBlbmRpbmcgQUNLLiAqLwotCWlmIChxcC0+c19hY2tfc3RhdGUgPT0gT1AoQUNLTk9XTEVER0UpKQotCQlzZW5kX3JjX2FjayhxcCk7CisJc2VuZF9yY19hY2socXApOwogCiBkb25lOgogCXJldHVybjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9yZWdpc3RlcnMuaCBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9yZWdpc3RlcnMuaAppbmRleCBkZmZjNzYwLi5jMTgyYmNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfcmVnaXN0ZXJzLmgKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX3JlZ2lzdGVycy5oCkBAIC0xMjYsOSArMTI2LDE4IEBACiAjZGVmaW5lIElORklOSVBBVEhfRV9SRVNFVCAgICAgICAgICAgMHgwMDA0MDAwMDAwMDAwMDAwVUxMCiAjZGVmaW5lIElORklOSVBBVEhfRV9IQVJEV0FSRSAgICAgICAgMHgwMDA4MDAwMDAwMDAwMDAwVUxMCiAKKy8qCisgKiB0aGlzIGlzIHVzZWQgdG8gcHJpbnQgImNvbW1vbiIgcGFja2V0IGVycm9ycyBvbmx5IHdoZW4gdGhlCisgKiBfX0lQQVRIX0VSUlBLVERCRyBiaXQgaXMgc2V0IGluIGlwYXRoX2RlYnVnLgorICovCisjZGVmaW5lIElORklOSVBBVEhfRV9QS1RFUlJTICggSU5GSU5JUEFUSF9FX1NQS1RMRU4gXAorCQl8IElORklOSVBBVEhfRV9TRFJPUFBFRERBVEFQS1QgfCBJTkZJTklQQVRIX0VfUlZDUkMgXAorCQl8IElORklOSVBBVEhfRV9SSUNSQyB8IElORklOSVBBVEhfRV9SU0hPUlRQS1RMRU4gXAorCQl8IElORklOSVBBVEhfRV9SRUJQICkKKwogLyoga3JfaHdlcnJjbGVhciwga3JfaHdlcnJtYXNrLCBrcl9od2VycnN0YXR1cywgYml0cyAqLwogLyogVFhFTUVNUEFSSVRZRVJSIGJpdCAwOiBQSU9idWYsIDE6IFBJT3BiYywgMjogbGF1bmNoZmlmbwotICogUlhFTUVNUEFSSVRZRVJSIGJpdCAwOiByY3ZidWYsIDE6IGxvb2t1cHEsIDI6IGVhZ2VyVElELCAzOiBleHBUSUQKKyAqIFJYRU1FTVBBUklUWUVSUiBiaXQgMDogcmN2YnVmLCAxOiBsb29rdXBxLCAyOiAgZXhwVElELCAzOiBlYWdlclRJRAogICogCQliaXQgNDogZmxhZyBidWZmZXIsIDU6IGRhdGFpbmZvLCA2OiBoZWFkZXIgaW5mbyAqLwogI2RlZmluZSBJTkZJTklQQVRIX0hXRV9UWEVNRU1QQVJJVFlFUlJfTUFTSyAweEZVTEwKICNkZWZpbmUgSU5GSU5JUEFUSF9IV0VfVFhFTUVNUEFSSVRZRVJSX1NISUZUIDQwCkBAIC0xNDMsOCArMTUyLDggQEAKIC8qIHJ4ZSBtZW0gcGFyaXR5IGVycm9ycyAoc2hpZnQgYnkgSU5GSU5JUEFUSF9IV0VfUlhFTUVNUEFSSVRZRVJSX1NISUZUKSAqLwogI2RlZmluZSBJTkZJTklQQVRIX0hXRV9SWEVNRU1QQVJJVFlFUlJfUkNWQlVGICAgMHgwMVVMTAogI2RlZmluZSBJTkZJTklQQVRIX0hXRV9SWEVNRU1QQVJJVFlFUlJfTE9PS1VQUSAgMHgwMlVMTAotI2RlZmluZSBJTkZJTklQQVRIX0hXRV9SWEVNRU1QQVJJVFlFUlJfRUFHRVJUSUQgMHgwNFVMTAotI2RlZmluZSBJTkZJTklQQVRIX0hXRV9SWEVNRU1QQVJJVFlFUlJfRVhQVElEICAgMHgwOFVMTAorI2RlZmluZSBJTkZJTklQQVRIX0hXRV9SWEVNRU1QQVJJVFlFUlJfRVhQVElEICAgMHgwNFVMTAorI2RlZmluZSBJTkZJTklQQVRIX0hXRV9SWEVNRU1QQVJJVFlFUlJfRUFHRVJUSUQgMHgwOFVMTAogI2RlZmluZSBJTkZJTklQQVRIX0hXRV9SWEVNRU1QQVJJVFlFUlJfRkxBR0JVRiAgMHgxMFVMTAogI2RlZmluZSBJTkZJTklQQVRIX0hXRV9SWEVNRU1QQVJJVFlFUlJfREFUQUlORk8gMHgyMFVMTAogI2RlZmluZSBJTkZJTklQQVRIX0hXRV9SWEVNRU1QQVJJVFlFUlJfSERSSU5GTyAgMHg0MFVMTApAQCAtMjk5LDEzICszMDgsNiBAQAogI2RlZmluZSBJTkZJTklQQVRIX1hHWFNfUlhfUE9MX1NISUZUIDE5CiAjZGVmaW5lIElORklOSVBBVEhfWEdYU19SWF9QT0xfTUFTSyAweGZVTEwKIAotI2RlZmluZSBJTkZJTklQQVRIX1JUX0FERFJfTUFTSyAweEZGRkZGRkZGRkZVTEwJLyogNDAgYml0cyB2YWxpZCAqLwotCi0vKiBUSUQgZW50cmllcyAobWVtb3J5KSwgSFQtb25seSAqLwotI2RlZmluZSBJTkZJTklQQVRIX1JUX1ZBTElEIDB4ODAwMDAwMDAwMDAwMDAwMFVMTAotI2RlZmluZSBJTkZJTklQQVRIX1JUX0FERFJfU0hJRlQgMAotI2RlZmluZSBJTkZJTklQQVRIX1JUX0JVRlNJWkVfTUFTSyAweDNGRkYKLSNkZWZpbmUgSU5GSU5JUEFUSF9SVF9CVUZTSVpFX1NISUZUIDQ4CiAKIC8qCiAgKiBJUEFUSF9QSU9fTUFYSUJIRFIgaXMgdGhlIG1heCBJQiBoZWFkZXIgc2l6ZSBhbGxvd2VkIGZvciBpbiBvdXIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9ydWMuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9ydWMuYwppbmRleCBlODZjYjE3Li5kOWMyYTliIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfcnVjLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX3J1Yy5jCkBAIC0yMDIsNiArMjAyLDcgQEAKIAl3cS0+dGFpbCA9IHRhaWw7CiAKIAlyZXQgPSAxOworCXFwLT5yX3dyaWRfdmFsaWQgPSAxOwogCWlmIChoYW5kbGVyKSB7CiAJCXUzMiBuOwogCkBAIC0yMjksNyArMjMwLDYgQEAKIAkJfQogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZycS0+bG9jaywgZmxhZ3MpOwotCXFwLT5yX3dyaWRfdmFsaWQgPSAxOwogCiBiYWlsOgogCXJldHVybiByZXQ7CkBAIC0yNTUsNiArMjU1LDcgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBpYl93YyB3YzsKIAl1NjQgc2RhdGE7CisJYXRvbWljNjRfdCAqbWFkZHI7CiAKIAlxcCA9IGlwYXRoX2xvb2t1cF9xcG4oJmRldi0+cXBfdGFibGUsIHNxcC0+cmVtb3RlX3Fwbik7CiAJaWYgKCFxcCkgewpAQCAtMjY1LDcgKzI2Niw4IEBACiBhZ2FpbjoKIAlzcGluX2xvY2tfaXJxc2F2ZSgmc3FwLT5zX2xvY2ssIGZsYWdzKTsKIAotCWlmICghKGliX2lwYXRoX3N0YXRlX29wc1tzcXAtPnN0YXRlXSAmIElQQVRIX1BST0NFU1NfU0VORF9PSykpIHsKKwlpZiAoIShpYl9pcGF0aF9zdGF0ZV9vcHNbc3FwLT5zdGF0ZV0gJiBJUEFUSF9QUk9DRVNTX1NFTkRfT0spIHx8CisJICAgIHFwLT5zX3Jucl90aW1lb3V0KSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNxcC0+c19sb2NrLCBmbGFncyk7CiAJCWdvdG8gZG9uZTsKIAl9CkBAIC0zMTAsNyArMzEyLDcgQEAKIAkJCQlzcXAtPnNfcm5yX3JldHJ5LS07CiAJCQlkZXYtPm5fcm5yX25ha3MrKzsKIAkJCXNxcC0+c19ybnJfdGltZW91dCA9Ci0JCQkJaWJfaXBhdGhfcm5yX3RhYmxlW3NxcC0+cl9taW5fcm5yX3RpbWVyXTsKKwkJCQlpYl9pcGF0aF9ybnJfdGFibGVbcXAtPnJfbWluX3Jucl90aW1lcl07CiAJCQlpcGF0aF9pbnNlcnRfcm5yX3F1ZXVlKHNxcCk7CiAJCQlnb3RvIGRvbmU7CiAJCX0KQEAgLTM0MywyMCArMzQ1LDIyIEBACiAJCQl3Yy5zbCA9IHNxcC0+cmVtb3RlX2FoX2F0dHIuc2w7CiAJCQl3Yy5kbGlkX3BhdGhfYml0cyA9IDA7CiAJCQl3Yy5wb3J0X251bSA9IDA7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3FwLT5zX2xvY2ssIGZsYWdzKTsKIAkJCWlwYXRoX3NxZXJyb3JfcXAoc3FwLCAmd2MpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3FwLT5zX2xvY2ssIGZsYWdzKTsKIAkJCWdvdG8gZG9uZTsKIAkJfQogCQlicmVhazsKIAogCWNhc2UgSUJfV1JfUkRNQV9SRUFEOgorCQlpZiAodW5saWtlbHkoIShxcC0+cXBfYWNjZXNzX2ZsYWdzICYKKwkJCSAgICAgICBJQl9BQ0NFU1NfUkVNT1RFX1JFQUQpKSkKKwkJCWdvdG8gYWNjX2VycjsKIAkJaWYgKHVubGlrZWx5KCFpcGF0aF9ya2V5X29rKHFwLCAmc3FwLT5zX3NnZSwgd3FlLT5sZW5ndGgsCiAJCQkJCSAgICB3cWUtPndyLndyLnJkbWEucmVtb3RlX2FkZHIsCiAJCQkJCSAgICB3cWUtPndyLndyLnJkbWEucmtleSwKIAkJCQkJICAgIElCX0FDQ0VTU19SRU1PVEVfUkVBRCkpKQogCQkJZ290byBhY2NfZXJyOwotCQlpZiAodW5saWtlbHkoIShxcC0+cXBfYWNjZXNzX2ZsYWdzICYKLQkJCSAgICAgICBJQl9BQ0NFU1NfUkVNT1RFX1JFQUQpKSkKLQkJCWdvdG8gYWNjX2VycjsKIAkJcXAtPnJfc2dlLnNnZSA9IHdxZS0+c2dfbGlzdFswXTsKIAkJcXAtPnJfc2dlLnNnX2xpc3QgPSB3cWUtPnNnX2xpc3QgKyAxOwogCQlxcC0+cl9zZ2UubnVtX3NnZSA9IHdxZS0+d3IubnVtX3NnZTsKQEAgLTM2NCwyMiArMzY4LDIyIEBACiAKIAljYXNlIElCX1dSX0FUT01JQ19DTVBfQU5EX1NXUDoKIAljYXNlIElCX1dSX0FUT01JQ19GRVRDSF9BTkRfQUREOgorCQlpZiAodW5saWtlbHkoIShxcC0+cXBfYWNjZXNzX2ZsYWdzICYKKwkJCSAgICAgICBJQl9BQ0NFU1NfUkVNT1RFX0FUT01JQykpKQorCQkJZ290byBhY2NfZXJyOwogCQlpZiAodW5saWtlbHkoIWlwYXRoX3JrZXlfb2socXAsICZxcC0+cl9zZ2UsIHNpemVvZih1NjQpLAotCQkJCQkgICAgd3FlLT53ci53ci5yZG1hLnJlbW90ZV9hZGRyLAotCQkJCQkgICAgd3FlLT53ci53ci5yZG1hLnJrZXksCisJCQkJCSAgICB3cWUtPndyLndyLmF0b21pYy5yZW1vdGVfYWRkciwKKwkJCQkJICAgIHdxZS0+d3Iud3IuYXRvbWljLnJrZXksCiAJCQkJCSAgICBJQl9BQ0NFU1NfUkVNT1RFX0FUT01JQykpKQogCQkJZ290byBhY2NfZXJyOwogCQkvKiBQZXJmb3JtIGF0b21pYyBPUCBhbmQgc2F2ZSByZXN1bHQuICovCi0JCXNkYXRhID0gd3FlLT53ci53ci5hdG9taWMuc3dhcDsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+cGVuZGluZ19sb2NrLCBmbGFncyk7Ci0JCXFwLT5yX2F0b21pY19kYXRhID0gKih1NjQgKikgcXAtPnJfc2dlLnNnZS52YWRkcjsKLQkJaWYgKHdxZS0+d3Iub3Bjb2RlID09IElCX1dSX0FUT01JQ19GRVRDSF9BTkRfQUREKQotCQkJKih1NjQgKikgcXAtPnJfc2dlLnNnZS52YWRkciA9Ci0JCQkJcXAtPnJfYXRvbWljX2RhdGEgKyBzZGF0YTsKLQkJZWxzZSBpZiAocXAtPnJfYXRvbWljX2RhdGEgPT0gd3FlLT53ci53ci5hdG9taWMuY29tcGFyZV9hZGQpCi0JCQkqKHU2NCAqKSBxcC0+cl9zZ2Uuc2dlLnZhZGRyID0gc2RhdGE7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+cGVuZGluZ19sb2NrLCBmbGFncyk7Ci0JCSoodTY0ICopIHNxcC0+c19zZ2Uuc2dlLnZhZGRyID0gcXAtPnJfYXRvbWljX2RhdGE7CisJCW1hZGRyID0gKGF0b21pYzY0X3QgKikgcXAtPnJfc2dlLnNnZS52YWRkcjsKKwkJc2RhdGEgPSB3cWUtPndyLndyLmF0b21pYy5jb21wYXJlX2FkZDsKKwkJKih1NjQgKikgc3FwLT5zX3NnZS5zZ2UudmFkZHIgPQorCQkJKHdxZS0+d3Iub3Bjb2RlID09IElCX1dSX0FUT01JQ19GRVRDSF9BTkRfQUREKSA/CisJCQkodTY0KSBhdG9taWM2NF9hZGRfcmV0dXJuKHNkYXRhLCBtYWRkcikgLSBzZGF0YSA6CisJCQkodTY0KSBjbXB4Y2hnKCh1NjQgKikgcXAtPnJfc2dlLnNnZS52YWRkciwKKwkJCQkgICAgICBzZGF0YSwgd3FlLT53ci53ci5hdG9taWMuc3dhcCk7CiAJCWdvdG8gc2VuZF9jb21wOwogCiAJZGVmYXVsdDoKQEAgLTQ0MCw3ICs0NDQsNyBAQAogc2VuZF9jb21wOgogCXNxcC0+c19ybnJfcmV0cnkgPSBzcXAtPnNfcm5yX3JldHJ5X2NudDsKIAotCWlmICghdGVzdF9iaXQoSVBBVEhfU19TSUdOQUxfUkVRX1dSLCAmc3FwLT5zX2ZsYWdzKSB8fAorCWlmICghKHNxcC0+c19mbGFncyAmIElQQVRIX1NfU0lHTkFMX1JFUV9XUikgfHwKIAkgICAgKHdxZS0+d3Iuc2VuZF9mbGFncyAmIElCX1NFTkRfU0lHTkFMRUQpKSB7CiAJCXdjLndyX2lkID0gd3FlLT53ci53cl9pZDsKIAkJd2Muc3RhdHVzID0gSUJfV0NfU1VDQ0VTUzsKQEAgLTUwMiw3ICs1MDYsNyBAQAogCSAqIFdlIGNsZWFyIHRoZSB0YXNrbGV0IGZsYWcgbm93IHNpbmNlIHdlIGFyZSBjb21taXR0aW5nIHRvIHJldHVybgogCSAqIGZyb20gdGhlIHRhc2tsZXQgZnVuY3Rpb24uCiAJICovCi0JY2xlYXJfYml0KElQQVRIX1NfQlVTWSwgJnFwLT5zX2ZsYWdzKTsKKwljbGVhcl9iaXQoSVBBVEhfU19CVVNZLCAmcXAtPnNfYnVzeSk7CiAJdGFza2xldF91bmxvY2soJnFwLT5zX3Rhc2spOwogCXdhbnRfYnVmZmVyKGRldi0+ZGQpOwogCWRldi0+bl9waW93YWl0Kys7CkBAIC01NDEsNiArNTQ1LDkgQEAKIAkJICAgIHdyLT5zZ19saXN0WzBdLmFkZHIgJiAoc2l6ZW9mKHU2NCkgLSAxKSkpIHsKIAkJcmV0ID0gLUVJTlZBTDsKIAkJZ290byBiYWlsOworCX0gZWxzZSBpZiAod3ItPm9wY29kZSA+PSBJQl9XUl9SRE1BX1JFQUQgJiYgIXFwLT5zX21heF9yZF9hdG9taWMpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBiYWlsOwogCX0KIAkvKiBJQiBzcGVjIHNheXMgdGhhdCBudW1fc2dlID09IDAgaXMgT0suICovCiAJaWYgKHdyLT5udW1fc2dlID4gcXAtPnNfbWF4X3NnZSkgewpAQCAtNjQ3LDcgKzY1NCw3IEBACiAJdTMyIHBtdHUgPSBpYl9tdHVfZW51bV90b19pbnQocXAtPnBhdGhfbXR1KTsKIAlzdHJ1Y3QgaXBhdGhfb3RoZXJfaGVhZGVycyAqb2hkcjsKIAotCWlmICh0ZXN0X2FuZF9zZXRfYml0KElQQVRIX1NfQlVTWSwgJnFwLT5zX2ZsYWdzKSkKKwlpZiAodGVzdF9hbmRfc2V0X2JpdChJUEFUSF9TX0JVU1ksICZxcC0+c19idXN5KSkKIAkJZ290byBiYWlsOwogCiAJaWYgKHVubGlrZWx5KHFwLT5yZW1vdGVfYWhfYXR0ci5kbGlkID09IGRldi0+ZGQtPmlwYXRoX2xpZCkpIHsKQEAgLTY4MywxOSArNjkwLDE1IEBACiAJICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnFwLT5zX2xvY2ssIGZsYWdzKTsKIAotCS8qIFNlbmRpbmcgcmVzcG9uc2VzIGhhcyBoaWdoZXIgcHJpb3JpdHkgb3ZlciBzZW5kaW5nIHJlcXVlc3RzLiAqLwotCWlmIChxcC0+c19hY2tfc3RhdGUgIT0gSUJfT1BDT0RFX1JDX0FDS05PV0xFREdFICYmCi0JICAgIChidGgwID0gaXBhdGhfbWFrZV9yY19hY2socXAsIG9oZHIsIHBtdHUpKSAhPSAwKQotCQlidGgyID0gcXAtPnNfYWNrX3BzbisrICYgSVBBVEhfUFNOX01BU0s7Ci0JZWxzZSBpZiAoISgocXAtPmlicXAucXBfdHlwZSA9PSBJQl9RUFRfUkMpID8KLQkJICAgaXBhdGhfbWFrZV9yY19yZXEocXAsIG9oZHIsIHBtdHUsICZidGgwLCAmYnRoMikgOgotCQkgICBpcGF0aF9tYWtlX3VjX3JlcShxcCwgb2hkciwgcG10dSwgJmJ0aDAsICZidGgyKSkpIHsKKwlpZiAoISgocXAtPmlicXAucXBfdHlwZSA9PSBJQl9RUFRfUkMpID8KKwkgICAgICAgaXBhdGhfbWFrZV9yY19yZXEocXAsIG9oZHIsIHBtdHUsICZidGgwLCAmYnRoMikgOgorCSAgICAgICBpcGF0aF9tYWtlX3VjX3JlcShxcCwgb2hkciwgcG10dSwgJmJ0aDAsICZidGgyKSkpIHsKIAkJLyoKIAkJICogQ2xlYXIgdGhlIGJ1c3kgYml0IGJlZm9yZSB1bmxvY2tpbmcgdG8gYXZvaWQgcmFjZXMgd2l0aAogCQkgKiBhZGRpbmcgbmV3IHdvcmsgcXVldWUgaXRlbXMgYW5kIHRoZW4gZmFpbGluZyB0byBwcm9jZXNzCiAJCSAqIHRoZW0uCiAJCSAqLwotCQljbGVhcl9iaXQoSVBBVEhfU19CVVNZLCAmcXAtPnNfZmxhZ3MpOworCQljbGVhcl9iaXQoSVBBVEhfU19CVVNZLCAmcXAtPnNfYnVzeSk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnFwLT5zX2xvY2ssIGZsYWdzKTsKIAkJZ290byBiYWlsOwogCX0KQEAgLTcyOCw3ICs3MzEsNyBAQAogCWdvdG8gYWdhaW47CiAKIGNsZWFyOgotCWNsZWFyX2JpdChJUEFUSF9TX0JVU1ksICZxcC0+c19mbGFncyk7CisJY2xlYXJfYml0KElQQVRIX1NfQlVTWSwgJnFwLT5zX2J1c3kpOwogYmFpbDoKIAlyZXR1cm47CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfc3RhdHMuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9zdGF0cy5jCmluZGV4IDMwYTgyNTkuLjkzMDdmNzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9zdGF0cy5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9zdGF0cy5jCkBAIC0yMDcsNyArMjA3LDcgQEAKIAkgKiBkb24ndCBhY2Nlc3MgdGhlIGNoaXAgd2hpbGUgcnVubmluZyBkaWFncywgb3IgbWVtb3J5IGRpYWdzIGNhbgogCSAqIGZhaWwKIAkgKi8KLQlpZiAoIWRkLT5pcGF0aF9rcmVnYmFzZSB8fCAhKGRkLT5pcGF0aF9mbGFncyAmIElQQVRIX1BSRVNFTlQpIHx8CisJaWYgKCFkZC0+aXBhdGhfa3JlZ2Jhc2UgfHwgIShkZC0+aXBhdGhfZmxhZ3MgJiBJUEFUSF9JTklUVEVEKSB8fAogCSAgICBpcGF0aF9kaWFnX2ludXNlKQogCQkvKiBidXQgcmUtYXJtIHRoZSB0aW1lciwgZm9yIGRpYWdzIGNhc2U7IHdvbid0IGh1cnQgb3RoZXIgKi8KIAkJZ290byBkb25lOwpAQCAtMjM3LDExICsyMzcsMTMgQEAKIAlpZiAoKGRkLT5pcGF0aF9tYXNrZWRlcnJzICYgfmRkLT5pcGF0aF9pZ25vcmVkZXJycykKIAkgICAgJiYgdGltZV9hZnRlcihqaWZmaWVzLCBkZC0+aXBhdGhfdW5tYXNrdGltZSkpIHsKIAkJY2hhciBlYnVmWzI1Nl07Ci0JCWlwYXRoX2RlY29kZV9lcnIoZWJ1Ziwgc2l6ZW9mIGVidWYsCisJCWludCBpc2VycjsKKwkJaXNlcnIgPSBpcGF0aF9kZWNvZGVfZXJyKGVidWYsIHNpemVvZiBlYnVmLAogCQkJCSAoZGQtPmlwYXRoX21hc2tlZGVycnMgJiB+ZGQtPgogCQkJCSAgaXBhdGhfaWdub3JlZGVycnMpKTsKIAkJaWYgKChkZC0+aXBhdGhfbWFza2VkZXJycyAmIH5kZC0+aXBhdGhfaWdub3JlZGVycnMpICYKLQkJICAgIH4oSU5GSU5JUEFUSF9FX1JSQ1ZFR1JGVUxMIHwgSU5GSU5JUEFUSF9FX1JSQ1ZIRFJGVUxMKSkKKwkJCQl+KElORklOSVBBVEhfRV9SUkNWRUdSRlVMTCB8IElORklOSVBBVEhfRV9SUkNWSERSRlVMTCB8CisJCQkJSU5GSU5JUEFUSF9FX1BLVEVSUlMgKSkKIAkJCWlwYXRoX2Rldl9lcnIoZGQsICJSZS1lbmFibGluZyBtYXNrZWQgZXJyb3JzICIKIAkJCQkgICAgICAiKCVzKVxuIiwgZWJ1Zik7CiAJCWVsc2UgewpAQCAtMjUyLDggKzI1NCwxMiBAQAogCQkJICogdGhlbS4gIFNvIG9ubHkgY29tcGxhaW4gYWJvdXQgdGhlc2UgYXQgZGVidWcKIAkJCSAqIGxldmVsLgogCQkJICovCi0JCQlpcGF0aF9kYmcoIkRpc2FibGluZyBmcmVxdWVudCBxdWV1ZSBmdWxsIGVycm9ycyAiCi0JCQkJICAiKCVzKVxuIiwgZWJ1Zik7CisJCQlpZiAoaXNlcnIpCisJCQkJCWlwYXRoX2RiZygiUmUtZW5hYmxpbmcgcXVldWUgZnVsbCBlcnJvcnMgKCVzKVxuIiwKKwkJCQkJCQllYnVmKTsKKwkJCWVsc2UKKwkJCQlpcGF0aF9jZGJnKEVSUlBLVCwgIlJlLWVuYWJsaW5nIHBhY2tldCIKKwkJCQkJCSIgcHJvYmxlbSBpbnRlcnJ1cHQgKCVzKVxuIiwgZWJ1Zik7CiAJCX0KIAkJZGQtPmlwYXRoX21hc2tlZGVycnMgPSBkZC0+aXBhdGhfaWdub3JlZGVycnM7CiAJCWlwYXRoX3dyaXRlX2tyZWcoZGQsIGRkLT5pcGF0aF9rcmVncy0+a3JfZXJyb3JtYXNrLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX3VjLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfdWMuYwppbmRleCAzMjVkNjYzLi4xYzJiMDNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfdWMuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfdWMuYwpAQCAtNDIsNyArNDIsNyBAQAogewogCWlmICgrK3FwLT5zX2xhc3QgPT0gcXAtPnNfc2l6ZSkKIAkJcXAtPnNfbGFzdCA9IDA7Ci0JaWYgKCF0ZXN0X2JpdChJUEFUSF9TX1NJR05BTF9SRVFfV1IsICZxcC0+c19mbGFncykgfHwKKwlpZiAoIShxcC0+c19mbGFncyAmIElQQVRIX1NfU0lHTkFMX1JFUV9XUikgfHwKIAkgICAgKHdxZS0+d3Iuc2VuZF9mbGFncyAmIElCX1NFTkRfU0lHTkFMRUQpKSB7CiAJCXdjLT53cl9pZCA9IHdxZS0+d3Iud3JfaWQ7CiAJCXdjLT5zdGF0dXMgPSBJQl9XQ19TVUNDRVNTOwpAQCAtMzQ0LDEzICszNDQsMTMgQEAKIAlzZW5kX2ZpcnN0OgogCQlpZiAocXAtPnJfcmV1c2Vfc2dlKSB7CiAJCQlxcC0+cl9yZXVzZV9zZ2UgPSAwOwotCQkJcXAtPnJfc2dlID0gcXAtPnNfcmRtYV9zZ2U7CisJCQlxcC0+cl9zZ2UgPSBxcC0+c19yZG1hX3JlYWRfc2dlOwogCQl9IGVsc2UgaWYgKCFpcGF0aF9nZXRfcndxZShxcCwgMCkpIHsKIAkJCWRldi0+bl9wa3RfZHJvcHMrKzsKIAkJCWdvdG8gZG9uZTsKIAkJfQogCQkvKiBTYXZlIHRoZSBXUUUgc28gd2UgY2FuIHJldXNlIGl0IGluIGNhc2Ugb2YgYW4gZXJyb3IuICovCi0JCXFwLT5zX3JkbWFfc2dlID0gcXAtPnJfc2dlOworCQlxcC0+c19yZG1hX3JlYWRfc2dlID0gcXAtPnJfc2dlOwogCQlxcC0+cl9yY3ZfbGVuID0gMDsKIAkJaWYgKG9wY29kZSA9PSBPUChTRU5EX09OTFkpKQogCQkJZ290byBzZW5kX2xhc3Q7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfdWQuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF91ZC5jCmluZGV4IDlhM2U1NDYuLmE1MThmN2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF91ZC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF91ZC5jCkBAIC0zMDgsNiArMzA4LDExIEBACiAJCWdvdG8gYmFpbDsKIAl9CiAKKwlpZiAod3ItPndyLnVkLmFoLT5wZCAhPSBxcC0+aWJxcC5wZCkgeworCQlyZXQgPSAtRVBFUk07CisJCWdvdG8gYmFpbDsKKwl9CisKIAkvKiBJQiBzcGVjIHNheXMgdGhhdCBudW1fc2dlID09IDAgaXMgT0suICovCiAJaWYgKHdyLT5udW1fc2dlID4gcXAtPnNfbWF4X3NnZSkgewogCQlyZXQgPSAtRUlOVkFMOwpAQCAtNDY3LDcgKzQ3Miw3IEBACiAKIGRvbmU6CiAJLyogUXVldWUgdGhlIGNvbXBsZXRpb24gc3RhdHVzIGVudHJ5LiAqLwotCWlmICghdGVzdF9iaXQoSVBBVEhfU19TSUdOQUxfUkVRX1dSLCAmcXAtPnNfZmxhZ3MpIHx8CisJaWYgKCEocXAtPnNfZmxhZ3MgJiBJUEFUSF9TX1NJR05BTF9SRVFfV1IpIHx8CiAJICAgICh3ci0+c2VuZF9mbGFncyAmIElCX1NFTkRfU0lHTkFMRUQpKSB7CiAJCXdjLndyX2lkID0gd3ItPndyX2lkOwogCQl3Yy5zdGF0dXMgPSBJQl9XQ19TVUNDRVNTOwpAQCAtNjQ3LDYgKzY1Miw3IEBACiAJCWlwYXRoX3NraXBfc2dlKCZxcC0+cl9zZ2UsIHNpemVvZihzdHJ1Y3QgaWJfZ3JoKSk7CiAJaXBhdGhfY29weV9zZ2UoJnFwLT5yX3NnZSwgZGF0YSwKIAkJICAgICAgIHdjLmJ5dGVfbGVuIC0gc2l6ZW9mKHN0cnVjdCBpYl9ncmgpKTsKKwlxcC0+cl93cmlkX3ZhbGlkID0gMDsKIAl3Yy53cl9pZCA9IHFwLT5yX3dyX2lkOwogCXdjLnN0YXR1cyA9IElCX1dDX1NVQ0NFU1M7CiAJd2Mub3Bjb2RlID0gSUJfV0NfUkVDVjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF92ZXJicy5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX3ZlcmJzLmMKaW5kZXggMmFhYWNkYi4uMThjNmRmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX3ZlcmJzLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX3ZlcmJzLmMKQEAgLTQzOCw2ICs0MzgsMTAgQEAKIAkJc3RydWN0IGlwYXRoX21jYXN0ICptY2FzdDsKIAkJc3RydWN0IGlwYXRoX21jYXN0X3FwICpwOwogCisJCWlmIChsbmggIT0gSVBBVEhfTFJIX0dSSCkgeworCQkJZGV2LT5uX3BrdF9kcm9wcysrOworCQkJZ290byBiYWlsOworCQl9CiAJCW1jYXN0ID0gaXBhdGhfbWNhc3RfZmluZCgmaGRyLT51LmwuZ3JoLmRnaWQpOwogCQlpZiAobWNhc3QgPT0gTlVMTCkgewogCQkJZGV2LT5uX3BrdF9kcm9wcysrOwpAQCAtNDQ1LDggKzQ0OSw3IEBACiAJCX0KIAkJZGV2LT5uX211bHRpY2FzdF9yY3YrKzsKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UocCwgJm1jYXN0LT5xcF9saXN0LCBsaXN0KQotCQkJaXBhdGhfcXBfcmN2KGRldiwgaGRyLCBsbmggPT0gSVBBVEhfTFJIX0dSSCwgZGF0YSwKLQkJCQkgICAgIHRsZW4sIHAtPnFwKTsKKwkJCWlwYXRoX3FwX3JjdihkZXYsIGhkciwgMSwgZGF0YSwgdGxlbiwgcC0+cXApOwogCQkvKgogCQkgKiBOb3RpZnkgaXBhdGhfbXVsdGljYXN0X2RldGFjaCgpIGlmIGl0IGlzIHdhaXRpbmcgZm9yIHVzCiAJCSAqIHRvIGZpbmlzaC4KQEAgLTc3Myw3ICs3NzYsNiBAQAogCS8qICsxIGlzIGZvciB0aGUgcXdvcmQgcGFkZGluZyBvZiBwYmMgKi8KIAlwbGVuID0gaGRyd29yZHMgKyAoKGxlbiArIDMpID4+IDIpICsgMTsKIAlpZiAodW5saWtlbHkoKHBsZW4gPDwgMikgPiBkZC0+aXBhdGhfaWJtYXhsZW4pKSB7Ci0JCWlwYXRoX2RiZygicGFja2V0IGxlbiAweCV4IHRvbyBsb25nLCBmYWlsaW5nXG4iLCBwbGVuKTsKIAkJcmV0ID0gLUVJTlZBTDsKIAkJZ290byBiYWlsOwogCX0KQEAgLTk4MCwxNCArOTgyLDE0IEBACiAJcHJvcHMtPm1heF9jcWUgPSBpYl9pcGF0aF9tYXhfY3FlczsKIAlwcm9wcy0+bWF4X21yID0gZGV2LT5sa190YWJsZS5tYXg7CiAJcHJvcHMtPm1heF9wZCA9IGliX2lwYXRoX21heF9wZHM7Ci0JcHJvcHMtPm1heF9xcF9yZF9hdG9tID0gMTsKLQlwcm9wcy0+bWF4X3FwX2luaXRfcmRfYXRvbSA9IDE7CisJcHJvcHMtPm1heF9xcF9yZF9hdG9tID0gSVBBVEhfTUFYX1JETUFfQVRPTUlDOworCXByb3BzLT5tYXhfcXBfaW5pdF9yZF9hdG9tID0gMjU1OwogCS8qIHByb3BzLT5tYXhfcmVzX3JkX2F0b20gKi8KIAlwcm9wcy0+bWF4X3NycSA9IGliX2lwYXRoX21heF9zcnFzOwogCXByb3BzLT5tYXhfc3JxX3dyID0gaWJfaXBhdGhfbWF4X3NycV93cnM7CiAJcHJvcHMtPm1heF9zcnFfc2dlID0gaWJfaXBhdGhfbWF4X3NycV9zZ2VzOwogCS8qIHByb3BzLT5sb2NhbF9jYV9hY2tfZGVsYXkgKi8KLQlwcm9wcy0+YXRvbWljX2NhcCA9IElCX0FUT01JQ19IQ0E7CisJcHJvcHMtPmF0b21pY19jYXAgPSBJQl9BVE9NSUNfR0xPQjsKIAlwcm9wcy0+bWF4X3BrZXlzID0gaXBhdGhfZ2V0X25wa2V5cyhkZXYtPmRkKTsKIAlwcm9wcy0+bWF4X21jYXN0X2dycCA9IGliX2lwYXRoX21heF9tY2FzdF9ncnBzOwogCXByb3BzLT5tYXhfbWNhc3RfcXBfYXR0YWNoID0gaWJfaXBhdGhfbWF4X21jYXN0X3FwX2F0dGFjaGVkOwpAQCAtMTU1Nyw3ICsxNTU5LDYgQEAKIAlkZXYtPm5vZGVfdHlwZSA9IFJETUFfTk9ERV9JQl9DQTsKIAlkZXYtPnBoeXNfcG9ydF9jbnQgPSAxOwogCWRldi0+ZG1hX2RldmljZSA9ICZkZC0+cGNpZGV2LT5kZXY7Ci0JZGV2LT5jbGFzc19kZXYuZGV2ID0gZGV2LT5kbWFfZGV2aWNlOwogCWRldi0+cXVlcnlfZGV2aWNlID0gaXBhdGhfcXVlcnlfZGV2aWNlOwogCWRldi0+bW9kaWZ5X2RldmljZSA9IGlwYXRoX21vZGlmeV9kZXZpY2U7CiAJZGV2LT5xdWVyeV9wb3J0ID0gaXBhdGhfcXVlcnlfcG9ydDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF92ZXJicy5oIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX3ZlcmJzLmgKaW5kZXggYzBjOGQ1Yi4uN2M0OTI5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX3ZlcmJzLmgKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX3ZlcmJzLmgKQEAgLTQwLDkgKzQwLDEyIEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgva3JlZi5oPgogI2luY2x1ZGUgPHJkbWEvaWJfcGFjay5oPgorI2luY2x1ZGUgPHJkbWEvaWJfdXNlcl92ZXJicy5oPgogCiAjaW5jbHVkZSAiaXBhdGhfbGF5ZXIuaCIKIAorI2RlZmluZSBJUEFUSF9NQVhfUkRNQV9BVE9NSUMJNAorCiAjZGVmaW5lIFFQTl9NQVggICAgICAgICAgICAgICAgICgxIDw8IDI0KQogI2RlZmluZSBRUE5NQVBfRU5UUklFUyAgICAgICAgICAoUVBOX01BWCAvIFBBR0VfU0laRSAvIEJJVFNfUEVSX0JZVEUpCiAKQEAgLTg5LDcgKzkyLDcgQEAKIH0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCiBzdHJ1Y3QgaWJfYXRvbWljX2V0aCB7Ci0JX19iZTY0IHZhZGRyOworCV9fYmUzMiB2YWRkclsyXTsJLyogdW5hbGlnbmVkIHNvIGFjY2VzcyBhcyAyIDMyLWJpdCB3b3JkcyAqLwogCV9fYmUzMiBya2V5OwogCV9fYmU2NCBzd2FwX2RhdGE7CiAJX19iZTY0IGNvbXBhcmVfZGF0YTsKQEAgLTEwOCw3ICsxMTEsNyBAQAogCQl9IHJjOwogCQlzdHJ1Y3QgewogCQkJX19iZTMyIGFldGg7Ci0JCQlfX2JlNjQgYXRvbWljX2Fja19ldGg7CisJCQlfX2JlMzIgYXRvbWljX2Fja19ldGhbMl07CiAJCX0gYXQ7CiAJCV9fYmUzMiBpbW1fZGF0YTsKIAkJX19iZTMyIGFldGg7CkBAIC0xODYsNyArMTg5LDcgQEAKIHN0cnVjdCBpcGF0aF9jcV93YyB7CiAJdTMyIGhlYWQ7CQkvKiBpbmRleCBvZiBuZXh0IGVudHJ5IHRvIGZpbGwgKi8KIAl1MzIgdGFpbDsJCS8qIGluZGV4IG9mIG5leHQgaWJfcG9sbF9jcSgpIGVudHJ5ICovCi0Jc3RydWN0IGliX3djIHF1ZXVlWzFdOwkvKiB0aGlzIGlzIGFjdHVhbGx5IHNpemUgaWJjcS5jcWUgKyAxICovCisJc3RydWN0IGliX3V2ZXJic193YyBxdWV1ZVsxXTsgLyogdGhpcyBpcyBhY3R1YWxseSBzaXplIGliY3EuY3FlICsgMSAqLwogfTsKIAogLyoKQEAgLTMxMiw2ICszMTUsMTkgQEAKIH07CiAKIC8qCisgKiBUaGlzIHN0cnVjdHVyZSBob2xkcyB0aGUgaW5mb3JtYXRpb24gdGhhdCB0aGUgc2VuZCB0YXNrbGV0IG5lZWRzCisgKiB0byBzZW5kIGEgUkRNQSByZWFkIHJlc3BvbnNlIG9yIGF0b21pYyBvcGVyYXRpb24uCisgKi8KK3N0cnVjdCBpcGF0aF9hY2tfZW50cnkgeworCXU4IG9wY29kZTsKKwl1MzIgcHNuOworCXVuaW9uIHsKKwkJc3RydWN0IGlwYXRoX3NnZV9zdGF0ZSByZG1hX3NnZTsKKwkJdTY0IGF0b21pY19kYXRhOworCX07Cit9OworCisvKgogICogVmFyaWFibGVzIHByZWZpeGVkIHdpdGggc18gYXJlIGZvciB0aGUgcmVxdWVzdGVyIChzZW5kZXIpLgogICogVmFyaWFibGVzIHByZWZpeGVkIHdpdGggcl8gYXJlIGZvciB0aGUgcmVzcG9uZGVyIChyZWNlaXZlcikuCiAgKiBWYXJpYWJsZXMgcHJlZml4ZWQgd2l0aCBhY2tfIGFyZSBmb3IgcmVzcG9uZGVyIHJlcGxpZXMuCkBAIC0zMzMsMjQgKzM0OSwyNCBAQAogCXN0cnVjdCBpcGF0aF9tbWFwX2luZm8gKmlwOwogCXN0cnVjdCBpcGF0aF9zZ2Vfc3RhdGUgKnNfY3VyX3NnZTsKIAlzdHJ1Y3QgaXBhdGhfc2dlX3N0YXRlIHNfc2dlOwkvKiBjdXJyZW50IHNlbmQgcmVxdWVzdCBkYXRhICovCi0JLyogY3VycmVudCBSRE1BIHJlYWQgc2VuZCBkYXRhICovCi0Jc3RydWN0IGlwYXRoX3NnZV9zdGF0ZSBzX3JkbWFfc2dlOworCXN0cnVjdCBpcGF0aF9hY2tfZW50cnkgc19hY2tfcXVldWVbSVBBVEhfTUFYX1JETUFfQVRPTUlDICsgMV07CisJc3RydWN0IGlwYXRoX3NnZV9zdGF0ZSBzX2Fja19yZG1hX3NnZTsKKwlzdHJ1Y3QgaXBhdGhfc2dlX3N0YXRlIHNfcmRtYV9yZWFkX3NnZTsKIAlzdHJ1Y3QgaXBhdGhfc2dlX3N0YXRlIHJfc2dlOwkvKiBjdXJyZW50IHJlY2VpdmUgZGF0YSAqLwogCXNwaW5sb2NrX3Qgc19sb2NrOwotCXVuc2lnbmVkIGxvbmcgc19mbGFnczsKKwl1bnNpZ25lZCBsb25nIHNfYnVzeTsKIAl1MzIgc19oZHJ3b3JkczsJCS8qIHNpemUgb2Ygc19oZHIgaW4gMzIgYml0IHdvcmRzICovCiAJdTMyIHNfY3VyX3NpemU7CQkvKiBzaXplIG9mIHNlbmQgcGFja2V0IGluIGJ5dGVzICovCiAJdTMyIHNfbGVuOwkJLyogdG90YWwgbGVuZ3RoIG9mIHNfc2dlICovCi0JdTMyIHNfcmRtYV9sZW47CQkvKiB0b3RhbCBsZW5ndGggb2Ygc19yZG1hX3NnZSAqLworCXUzMiBzX3JkbWFfcmVhZF9sZW47CS8qIHRvdGFsIGxlbmd0aCBvZiBzX3JkbWFfcmVhZF9zZ2UgKi8KIAl1MzIgc19uZXh0X3BzbjsJCS8qIFBTTiBmb3IgbmV4dCByZXF1ZXN0ICovCiAJdTMyIHNfbGFzdF9wc247CQkvKiBsYXN0IHJlc3BvbnNlIFBTTiBwcm9jZXNzZWQgKi8KIAl1MzIgc19wc247CQkvKiBjdXJyZW50IHBhY2tldCBzZXF1ZW5jZSBudW1iZXIgKi8KLQl1MzIgc19hY2tfcHNuOwkJLyogUFNOIGZvciBSRE1BX1JFQUQgKi8KKwl1MzIgc19hY2tfcmRtYV9wc247CS8qIFBTTiBmb3Igc2VuZGluZyBSRE1BIHJlYWQgcmVzcG9uc2VzICovCisJdTMyIHNfYWNrX3BzbjsJCS8qIFBTTiBmb3IgYWNraW5nIHNlbmRzIGFuZCBSRE1BIHdyaXRlcyAqLwogCXUzMiBzX3Jucl90aW1lb3V0OwkvKiBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGZvciBSTlIgdGltZW91dCAqLwogCXUzMiByX2Fja19wc247CQkvKiBQU04gZm9yIG5leHQgQUNLIG9yIGF0b21pYyBBQ0sgKi8KIAl1NjQgcl93cl9pZDsJCS8qIElEIGZvciBjdXJyZW50IHJlY2VpdmUgV1FFICovCi0JdTY0IHJfYXRvbWljX2RhdGE7CS8qIGRhdGEgZm9yIGxhc3QgYXRvbWljIG9wICovCi0JdTMyIHJfYXRvbWljX3BzbjsJLyogUFNOIG9mIGxhc3QgYXRvbWljIG9wICovCiAJdTMyIHJfbGVuOwkJLyogdG90YWwgbGVuZ3RoIG9mIHJfc2dlICovCiAJdTMyIHJfcmN2X2xlbjsJCS8qIHJlY2VpdmUgZGF0YSBsZW4gcHJvY2Vzc2VkICovCiAJdTMyIHJfcHNuOwkJLyogZXhwZWN0ZWQgcmN2IHBhY2tldCBzZXF1ZW5jZSBudW1iZXIgKi8KQEAgLTM2MCwxMiArMzc2LDEzIEBACiAJdTggc19hY2tfc3RhdGU7CQkvKiBvcGNvZGUgb2YgcGFja2V0IHRvIEFDSyAqLwogCXU4IHNfbmFrX3N0YXRlOwkJLyogbm9uLXplcm8gaWYgTkFLIGlzIHBlbmRpbmcgKi8KIAl1OCByX3N0YXRlOwkJLyogb3Bjb2RlIG9mIGxhc3QgcGFja2V0IHJlY2VpdmVkICovCi0JdTggcl9hY2tfc3RhdGU7CQkvKiBvcGNvZGUgb2YgcGFja2V0IHRvIEFDSyAqLwogCXU4IHJfbmFrX3N0YXRlOwkJLyogbm9uLXplcm8gaWYgTkFLIGlzIHBlbmRpbmcgKi8KIAl1OCByX21pbl9ybnJfdGltZXI7CS8qIHJldHJ5IHRpbWVvdXQgdmFsdWUgZm9yIFJOUiBOQUtzICovCiAJdTggcl9yZXVzZV9zZ2U7CQkvKiBmb3IgVUMgcmVjZWl2ZSBlcnJvcnMgKi8KIAl1OCByX3NnZV9pbng7CQkvKiBjdXJyZW50IGluZGV4IGludG8gc2dfbGlzdCAqLwogCXU4IHJfd3JpZF92YWxpZDsJLyogcl93cmlkIHNldCBidXQgQ1EgZW50cnkgbm90IHlldCBtYWRlICovCisJdTggcl9tYXhfcmRfYXRvbWljOwkvKiBtYXggbnVtYmVyIG9mIFJETUEgcmVhZC9hdG9taWMgdG8gcmVjZWl2ZSAqLworCXU4IHJfaGVhZF9hY2tfcXVldWU7CS8qIGluZGV4IGludG8gc19hY2tfcXVldWVbXSAqLwogCXU4IHFwX2FjY2Vzc19mbGFnczsKIAl1OCBzX21heF9zZ2U7CQkvKiBzaXplIG9mIHNfd3EtPnNnX2xpc3QgKi8KIAl1OCBzX3JldHJ5X2NudDsJCS8qIG51bWJlciBvZiB0aW1lcyB0byByZXRyeSAqLwpAQCAtMzc0LDYgKzM5MSwxMCBAQAogCXU4IHNfcm5yX3JldHJ5OwkJLyogcmVxdWVzdGVyIFJOUiByZXRyeSBjb3VudGVyICovCiAJdTggc193YWl0X2NyZWRpdDsJLyogbGltaXQgbnVtYmVyIG9mIHVuYWNrZWQgcGFja2V0cyBzZW50ICovCiAJdTggc19wa2V5X2luZGV4OwkvKiBQS0VZIGluZGV4IHRvIHVzZSAqLworCXU4IHNfbWF4X3JkX2F0b21pYzsJLyogbWF4IG51bWJlciBvZiBSRE1BIHJlYWQvYXRvbWljIHRvIHNlbmQgKi8KKwl1OCBzX251bV9yZF9hdG9taWM7CS8qIG51bWJlciBvZiBSRE1BIHJlYWQvYXRvbWljIHBlbmRpbmcgKi8KKwl1OCBzX3RhaWxfYWNrX3F1ZXVlOwkvKiBpbmRleCBpbnRvIHNfYWNrX3F1ZXVlW10gKi8KKwl1OCBzX2ZsYWdzOwogCXU4IHRpbWVvdXQ7CQkvKiBUaW1lb3V0IGZvciB0aGlzIFFQICovCiAJZW51bSBpYl9tdHUgcGF0aF9tdHU7CiAJdTMyIHJlbW90ZV9xcG47CkBAIC0zOTAsMTEgKzQxMSwxNiBAQAogCXN0cnVjdCBpcGF0aF9zZ2Ugcl9zZ19saXN0WzBdOwkvKiB2ZXJpZmllZCBTR0VzICovCiB9OwogCisvKiBCaXQgZGVmaW5pdGlvbiBmb3Igc19idXN5LiAqLworI2RlZmluZSBJUEFUSF9TX0JVU1kJCTAKKwogLyoKICAqIEJpdCBkZWZpbml0aW9ucyBmb3Igc19mbGFncy4KICAqLwotI2RlZmluZSBJUEFUSF9TX0JVU1kJCTAKLSNkZWZpbmUgSVBBVEhfU19TSUdOQUxfUkVRX1dSCTEKKyNkZWZpbmUgSVBBVEhfU19TSUdOQUxfUkVRX1dSCTB4MDEKKyNkZWZpbmUgSVBBVEhfU19GRU5DRV9QRU5ESU5HCTB4MDIKKyNkZWZpbmUgSVBBVEhfU19SRE1BUl9QRU5ESU5HCTB4MDQKKyNkZWZpbmUgSVBBVEhfU19BQ0tfUEVORElORwkweDA4CiAKICNkZWZpbmUgSVBBVEhfUFNOX0NSRURJVAkyMDQ4CiAKQEAgLTcwNiw4ICs3MzIsNiBAQAogCiBpbnQgaXBhdGhfZGVzdHJveV9zcnEoc3RydWN0IGliX3NycSAqaWJzcnEpOwogCi12b2lkIGlwYXRoX2NxX2VudGVyKHN0cnVjdCBpcGF0aF9jcSAqY3EsIHN0cnVjdCBpYl93YyAqZW50cnksIGludCBzaWcpOwotCiBpbnQgaXBhdGhfcG9sbF9jcShzdHJ1Y3QgaWJfY3EgKmliY3EsIGludCBudW1fZW50cmllcywgc3RydWN0IGliX3djICplbnRyeSk7CiAKIHN0cnVjdCBpYl9jcSAqaXBhdGhfY3JlYXRlX2NxKHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LCBpbnQgZW50cmllcywKQEAgLTc1Nyw5ICs3ODEsNiBAQAogCiB2b2lkIGlwYXRoX2RvX3J1Y19zZW5kKHVuc2lnbmVkIGxvbmcgZGF0YSk7CiAKLXUzMiBpcGF0aF9tYWtlX3JjX2FjayhzdHJ1Y3QgaXBhdGhfcXAgKnFwLCBzdHJ1Y3QgaXBhdGhfb3RoZXJfaGVhZGVycyAqb2hkciwKLQkJICAgICAgdTMyIHBtdHUpOwotCiBpbnQgaXBhdGhfbWFrZV9yY19yZXEoc3RydWN0IGlwYXRoX3FwICpxcCwgc3RydWN0IGlwYXRoX290aGVyX2hlYWRlcnMgKm9oZHIsCiAJCSAgICAgIHUzMiBwbXR1LCB1MzIgKmJ0aDBwLCB1MzIgKmJ0aDJwKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX21haW4uYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9tYWluLmMKaW5kZXggMGQ5YjdkMC4uNzczMTQ1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX21haW4uYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfbWFpbi5jCkBAIC0xMDEzLDE0ICsxMDEzLDE0IEBACiAJdTY0IGxhdGVzdF9mdzsKIAl1MzIgZmxhZ3M7CiB9IG10aGNhX2hjYV90YWJsZVtdID0gewotCVtUQVZPUl0gICAgICAgID0geyAubGF0ZXN0X2Z3ID0gTVRIQ0FfRldfVkVSKDMsIDQsIDApLAorCVtUQVZPUl0gICAgICAgID0geyAubGF0ZXN0X2Z3ID0gTVRIQ0FfRldfVkVSKDMsIDUsIDApLAogCQkJICAgLmZsYWdzICAgICA9IDAgfSwKLQlbQVJCRUxfQ09NUEFUXSA9IHsgLmxhdGVzdF9mdyA9IE1USENBX0ZXX1ZFUig0LCA3LCA2MDApLAorCVtBUkJFTF9DT01QQVRdID0geyAubGF0ZXN0X2Z3ID0gTVRIQ0FfRldfVkVSKDQsIDgsIDIwMCksCiAJCQkgICAuZmxhZ3MgICAgID0gTVRIQ0FfRkxBR19QQ0lFIH0sCi0JW0FSQkVMX05BVElWRV0gPSB7IC5sYXRlc3RfZncgPSBNVEhDQV9GV19WRVIoNSwgMSwgNDAwKSwKKwlbQVJCRUxfTkFUSVZFXSA9IHsgLmxhdGVzdF9mdyA9IE1USENBX0ZXX1ZFUig1LCAyLCAwKSwKIAkJCSAgIC5mbGFncyAgICAgPSBNVEhDQV9GTEFHX01FTUZSRUUgfAogCQkJCQlNVEhDQV9GTEFHX1BDSUUgfSwKLQlbU0lOQUldICAgICAgICA9IHsgLmxhdGVzdF9mdyA9IE1USENBX0ZXX1ZFUigxLCAxLCAwKSwKKwlbU0lOQUldICAgICAgICA9IHsgLmxhdGVzdF9mdyA9IE1USENBX0ZXX1ZFUigxLCAyLCAwKSwKIAkJCSAgIC5mbGFncyAgICAgPSBNVEhDQV9GTEFHX01FTUZSRUUgfAogCQkJCQlNVEhDQV9GTEFHX1BDSUUgICAgfAogCQkJCQlNVEhDQV9GTEFHX1NJTkFJX09QVCB9CkBAIC0xMTM1LDcgKzExMzUsNyBAQAogCQlnb3RvIGVycl9jbWQ7CiAKIAlpZiAobWRldi0+ZndfdmVyIDwgbXRoY2FfaGNhX3RhYmxlW2hjYV90eXBlXS5sYXRlc3RfZncpIHsKLQkJbXRoY2Ffd2FybihtZGV2LCAiSENBIEZXIHZlcnNpb24gJWQuJWQuJWQgaXMgb2xkICglZC4lZC4lZCBpcyBjdXJyZW50KS5cbiIsCisJCW10aGNhX3dhcm4obWRldiwgIkhDQSBGVyB2ZXJzaW9uICVkLiVkLiUzZCBpcyBvbGQgKCVkLiVkLiUzZCBpcyBjdXJyZW50KS5cbiIsCiAJCQkgICAoaW50KSAobWRldi0+ZndfdmVyID4+IDMyKSwgKGludCkgKG1kZXYtPmZ3X3ZlciA+PiAxNikgJiAweGZmZmYsCiAJCQkgICAoaW50KSAobWRldi0+ZndfdmVyICYgMHhmZmZmKSwKIAkJCSAgIChpbnQpIChtdGhjYV9oY2FfdGFibGVbaGNhX3R5cGVdLmxhdGVzdF9mdyA+PiAzMiksCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfbXIuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9tci5jCmluZGV4IGVlNTYxYzUuLmFhNmM3MGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9tci5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9tci5jCkBAIC0yOTcsNyArMjk3LDggQEAKIAogaW50IG10aGNhX3dyaXRlX210dF9zaXplKHN0cnVjdCBtdGhjYV9kZXYgKmRldikKIHsKLQlpZiAoZGV2LT5tcl90YWJsZS5mbXJfbXR0X2J1ZGR5ICE9ICZkZXYtPm1yX3RhYmxlLm10dF9idWRkeSkKKwlpZiAoZGV2LT5tcl90YWJsZS5mbXJfbXR0X2J1ZGR5ICE9ICZkZXYtPm1yX3RhYmxlLm10dF9idWRkeSB8fAorCSAgICAhKGRldi0+bXRoY2FfZmxhZ3MgJiBNVEhDQV9GTEFHX0ZNUikpCiAJCS8qCiAJCSAqIEJlIGZyaWVuZGx5IHRvIFdSSVRFX01UVCBjb21tYW5kCiAJCSAqIGFuZCBsZWF2ZSB0d28gZW1wdHkgc2xvdHMgZm9yIHRoZQpAQCAtMzU1LDcgKzM1Niw4IEBACiAJaW50IHNpemUgPSBtdGhjYV93cml0ZV9tdHRfc2l6ZShkZXYpOwogCWludCBjaHVuazsKIAotCWlmIChkZXYtPm1yX3RhYmxlLmZtcl9tdHRfYnVkZHkgIT0gJmRldi0+bXJfdGFibGUubXR0X2J1ZGR5KQorCWlmIChkZXYtPm1yX3RhYmxlLmZtcl9tdHRfYnVkZHkgIT0gJmRldi0+bXJfdGFibGUubXR0X2J1ZGR5IHx8CisJICAgICEoZGV2LT5tdGhjYV9mbGFncyAmIE1USENBX0ZMQUdfRk1SKSkKIAkJcmV0dXJuIF9fbXRoY2Ffd3JpdGVfbXR0KGRldiwgbXR0LCBzdGFydF9pbmRleCwgYnVmZmVyX2xpc3QsIGxpc3RfbGVuKTsKIAogCXdoaWxlIChsaXN0X2xlbiA+IDApIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9wcm92aWRlci5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX3Byb3ZpZGVyLmMKaW5kZXggMDcyNWFkNy4uNDdlNmZkNDZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfcHJvdmlkZXIuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfcHJvdmlkZXIuYwpAQCAtMTI5Myw3ICsxMjkzLDYgQEAKIAlkZXYtPmliX2Rldi5ub2RlX3R5cGUgICAgICAgICAgICA9IFJETUFfTk9ERV9JQl9DQTsKIAlkZXYtPmliX2Rldi5waHlzX3BvcnRfY250ICAgICAgICA9IGRldi0+bGltaXRzLm51bV9wb3J0czsKIAlkZXYtPmliX2Rldi5kbWFfZGV2aWNlICAgICAgICAgICA9ICZkZXYtPnBkZXYtPmRldjsKLQlkZXYtPmliX2Rldi5jbGFzc19kZXYuZGV2ICAgICAgICA9ICZkZXYtPnBkZXYtPmRldjsKIAlkZXYtPmliX2Rldi5xdWVyeV9kZXZpY2UgICAgICAgICA9IG10aGNhX3F1ZXJ5X2RldmljZTsKIAlkZXYtPmliX2Rldi5xdWVyeV9wb3J0ICAgICAgICAgICA9IG10aGNhX3F1ZXJ5X3BvcnQ7CiAJZGV2LT5pYl9kZXYubW9kaWZ5X2RldmljZSAgICAgICAgPSBtdGhjYV9tb2RpZnlfZGV2aWNlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX3FwLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfcXAuYwppbmRleCAxYzZiNjNhLi44ZmU2ZmVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfcXAuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfcXAuYwpAQCAtMTQxOSwxMSArMTQxOSwxMCBAQAogCSAqIHVucmVmIHRoZSBtZW0tZnJlZSB0YWJsZXMgYW5kIGZyZWUgdGhlIFFQTiBpbiBvdXIgdGFibGUuCiAJICovCiAJaWYgKCFxcC0+aWJxcC51b2JqZWN0KSB7Ci0JCW10aGNhX2NxX2NsZWFuKGRldiwgdG9fbWNxKHFwLT5pYnFwLnNlbmRfY3EpLCBxcC0+cXBuLAorCQltdGhjYV9jcV9jbGVhbihkZXYsIHJlY3ZfY3EsIHFwLT5xcG4sCiAJCQkgICAgICAgcXAtPmlicXAuc3JxID8gdG9fbXNycShxcC0+aWJxcC5zcnEpIDogTlVMTCk7Ci0JCWlmIChxcC0+aWJxcC5zZW5kX2NxICE9IHFwLT5pYnFwLnJlY3ZfY3EpCi0JCQltdGhjYV9jcV9jbGVhbihkZXYsIHRvX21jcShxcC0+aWJxcC5yZWN2X2NxKSwgcXAtPnFwbiwKLQkJCQkgICAgICAgcXAtPmlicXAuc3JxID8gdG9fbXNycShxcC0+aWJxcC5zcnEpIDogTlVMTCk7CisJCWlmIChzZW5kX2NxICE9IHJlY3ZfY3EpCisJCQltdGhjYV9jcV9jbGVhbihkZXYsIHNlbmRfY3EsIHFwLT5xcG4sIE5VTEwpOwogCiAJCW10aGNhX2ZyZWVfbWVtZnJlZShkZXYsIHFwKTsKIAkJbXRoY2FfZnJlZV93cWVfYnVmKGRldiwgcXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9jbS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9jbS5jCmluZGV4IDJiMjQyYTQuLjBjNGU1OWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfY20uYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX2NtLmMKQEAgLTIyOCw3ICsyMjgsNiBAQAogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBjbV9pZC0+Y29udGV4dDsKIAlzdHJ1Y3QgaXBvaWJfZGV2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBpcG9pYl9jbV9yeCAqcDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIHBzbjsKIAlpbnQgcmV0OwogCkBAIC0yNTcsOSArMjU2LDkgQEAKIAogCWNtX2lkLT5jb250ZXh0ID0gcDsKIAlwLT5qaWZmaWVzID0gamlmZmllczsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnEoJnByaXYtPmxvY2spOwogCWxpc3RfYWRkKCZwLT5saXN0LCAmcHJpdi0+Y20ucGFzc2l2ZV9pZHMpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnEoJnByaXYtPmxvY2spOwogCXF1ZXVlX2RlbGF5ZWRfd29yayhpcG9pYl93b3JrcXVldWUsCiAJCQkgICAmcHJpdi0+Y20uc3RhbGVfdGFzaywgSVBPSUJfQ01fUlhfREVMQVkpOwogCXJldHVybiAwOwpAQCAtMjc3LDcgKzI3Niw2IEBACiB7CiAJc3RydWN0IGlwb2liX2NtX3J4ICpwOwogCXN0cnVjdCBpcG9pYl9kZXZfcHJpdiAqcHJpdjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCByZXQ7CiAKIAlzd2l0Y2ggKGV2ZW50LT5ldmVudCkgewpAQCAtMjkwLDE0ICsyODgsMTQgQEAKIAljYXNlIElCX0NNX1JFSl9SRUNFSVZFRDoKIAkJcCA9IGNtX2lkLT5jb250ZXh0OwogCQlwcml2ID0gbmV0ZGV2X3ByaXYocC0+ZGV2KTsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwkJc3Bpbl9sb2NrX2lycSgmcHJpdi0+bG9jayk7CiAJCWlmIChsaXN0X2VtcHR5KCZwLT5saXN0KSkKIAkJCXJldCA9IDA7IC8qIENvbm5lY3Rpb24gaXMgZ29pbmcgYXdheSBhbHJlYWR5LiAqLwogCQllbHNlIHsKIAkJCWxpc3RfZGVsX2luaXQoJnAtPmxpc3QpOwogCQkJcmV0ID0gLUVDT05OUkVTRVQ7CiAJCX0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCQlzcGluX3VubG9ja19pcnEoJnByaXYtPmxvY2spOwogCQlpZiAocmV0KSB7CiAJCQlpYl9kZXN0cm95X3FwKHAtPnFwKTsKIAkJCWtmcmVlKHApOwpAQCAtMzUxLDggKzM0OSw4IEBACiAJdTY0IG1hcHBpbmdbSVBPSUJfQ01fUlhfU0ddOwogCWludCBmcmFnczsKIAotCWlwb2liX2RiZ19kYXRhKHByaXYsICJjbSByZWN2IGNvbXBsZXRpb246IGlkICVkLCBvcCAlZCwgc3RhdHVzOiAlZFxuIiwKLQkJICAgICAgIHdyX2lkLCB3Yy0+b3Bjb2RlLCB3Yy0+c3RhdHVzKTsKKwlpcG9pYl9kYmdfZGF0YShwcml2LCAiY20gcmVjdiBjb21wbGV0aW9uOiBpZCAlZCwgc3RhdHVzOiAlZFxuIiwKKwkJICAgICAgIHdyX2lkLCB3Yy0+c3RhdHVzKTsKIAogCWlmICh1bmxpa2VseSh3cl9pZCA+PSBpcG9pYl9yZWN2cV9zaXplKSkgewogCQlpcG9pYl93YXJuKHByaXYsICJjbSByZWN2IGNvbXBsZXRpb24gZXZlbnQgd2l0aCB3cmlkICVkICg+ICVkKVxuIiwKQEAgLTQwOCw3ICs0MDYsNyBAQAogCXNrYl9wdXRfZnJhZ3Moc2tiLCBJUE9JQl9DTV9IRUFEX1NJWkUsIHdjLT5ieXRlX2xlbiwgbmV3c2tiKTsKIAogCXNrYi0+cHJvdG9jb2wgPSAoKHN0cnVjdCBpcG9pYl9oZWFkZXIgKikgc2tiLT5kYXRhKS0+cHJvdG87Ci0Jc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOworCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CiAJc2tiX3B1bGwoc2tiLCBJUE9JQl9FTkNBUF9MRU4pOwogCiAJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKQEAgLTUwNCw4ICs1MDIsOCBAQAogCXN0cnVjdCBpcG9pYl90eF9idWYgKnR4X3JlcTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JaXBvaWJfZGJnX2RhdGEocHJpdiwgImNtIHNlbmQgY29tcGxldGlvbjogaWQgJWQsIG9wICVkLCBzdGF0dXM6ICVkXG4iLAotCQkgICAgICAgd3JfaWQsIHdjLT5vcGNvZGUsIHdjLT5zdGF0dXMpOworCWlwb2liX2RiZ19kYXRhKHByaXYsICJjbSBzZW5kIGNvbXBsZXRpb246IGlkICVkLCBzdGF0dXM6ICVkXG4iLAorCQkgICAgICAgd3JfaWQsIHdjLT5zdGF0dXMpOwogCiAJaWYgKHVubGlrZWx5KHdyX2lkID49IGlwb2liX3NlbmRxX3NpemUpKSB7CiAJCWlwb2liX3dhcm4ocHJpdiwgImNtIHNlbmQgY29tcGxldGlvbiBldmVudCB3aXRoIHdyaWQgJWQgKD4gJWQpXG4iLApAQCAtNjEyLDIzICs2MTAsMjIgQEAKIHsKIAlzdHJ1Y3QgaXBvaWJfZGV2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBpcG9pYl9jbV9yeCAqcDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJaWYgKCFJUE9JQl9DTV9TVVBQT1JURUQoZGV2LT5kZXZfYWRkcikpCiAJCXJldHVybjsKIAogCWliX2Rlc3Ryb3lfY21faWQocHJpdi0+Y20uaWQpOwotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycSgmcHJpdi0+bG9jayk7CiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZwcml2LT5jbS5wYXNzaXZlX2lkcykpIHsKIAkJcCA9IGxpc3RfZW50cnkocHJpdi0+Y20ucGFzc2l2ZV9pZHMubmV4dCwgdHlwZW9mKCpwKSwgbGlzdCk7CiAJCWxpc3RfZGVsX2luaXQoJnAtPmxpc3QpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJCXNwaW5fdW5sb2NrX2lycSgmcHJpdi0+bG9jayk7CiAJCWliX2Rlc3Ryb3lfY21faWQocC0+aWQpOwogCQlpYl9kZXN0cm95X3FwKHAtPnFwKTsKIAkJa2ZyZWUocCk7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJCXNwaW5fbG9ja19pcnEoJnByaXYtPmxvY2spOwogCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxKCZwcml2LT5sb2NrKTsKIAogCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPmNtLnN0YWxlX3Rhc2spOwogfQpAQCAtNjQyLDcgKzYzOSw2IEBACiAJc3RydWN0IGliX3FwX2F0dHIgcXBfYXR0cjsKIAlpbnQgcXBfYXR0cl9tYXNrLCByZXQ7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJcC0+bXR1ID0gYmUzMl90b19jcHUoZGF0YS0+bXR1KTsKIApAQCAtNjgwLDEyICs2NzYsMTIgQEAKIAogCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnNrcXVldWUpOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxKCZwcml2LT5sb2NrKTsKIAlzZXRfYml0KElQT0lCX0ZMQUdfT1BFUl9VUCwgJnAtPmZsYWdzKTsKIAlpZiAocC0+bmVpZ2gpCiAJCXdoaWxlICgoc2tiID0gX19za2JfZGVxdWV1ZSgmcC0+bmVpZ2gtPnF1ZXVlKSkpCiAJCQlfX3NrYl9xdWV1ZV90YWlsKCZza3F1ZXVlLCBza2IpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnEoJnByaXYtPmxvY2spOwogCiAJd2hpbGUgKChza2IgPSBfX3NrYl9kZXF1ZXVlKCZza3F1ZXVlKSkpIHsKIAkJc2tiLT5kZXYgPSBwLT5kZXY7CkBAIC04OTUsNyArODkxLDYgQEAKIAlzdHJ1Y3QgaXBvaWJfZGV2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdih0eC0+ZGV2KTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcHJpdi0+ZGV2OwogCXN0cnVjdCBpcG9pYl9uZWlnaCAqbmVpZ2g7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmV0OwogCiAJc3dpdGNoIChldmVudC0+ZXZlbnQpIHsKQEAgLTkxNCw3ICs5MDksNyBAQAogCWNhc2UgSUJfQ01fUkVKX1JFQ0VJVkVEOgogCWNhc2UgSUJfQ01fVElNRVdBSVRfRVhJVDoKIAkJaXBvaWJfZGJnKHByaXYsICJDTSBlcnJvciAlZC5cbiIsIGV2ZW50LT5ldmVudCk7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT50eF9sb2NrLCBmbGFncyk7CisJCXNwaW5fbG9ja19pcnEoJnByaXYtPnR4X2xvY2spOwogCQlzcGluX2xvY2soJnByaXYtPmxvY2spOwogCQluZWlnaCA9IHR4LT5uZWlnaDsKIApAQCAtOTM0LDcgKzkyOSw3IEBACiAJCX0KIAogCQlzcGluX3VubG9jaygmcHJpdi0+bG9jayk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnR4X2xvY2ssIGZsYWdzKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZwcml2LT50eF9sb2NrKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJYnJlYWs7CkBAIC0xMDIzLDIxICsxMDE4LDIwIEBACiAJc3RydWN0IGlwb2liX2Rldl9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpcG9pYl9kZXZfcHJpdiwKIAkJCQkJCSAgIGNtLnJlYXBfdGFzayk7CiAJc3RydWN0IGlwb2liX2NtX3R4ICpwOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+dHhfbG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnEoJnByaXYtPnR4X2xvY2spOwogCXNwaW5fbG9jaygmcHJpdi0+bG9jayk7CiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZwcml2LT5jbS5yZWFwX2xpc3QpKSB7CiAJCXAgPSBsaXN0X2VudHJ5KHByaXYtPmNtLnJlYXBfbGlzdC5uZXh0LCB0eXBlb2YoKnApLCBsaXN0KTsKIAkJbGlzdF9kZWwoJnAtPmxpc3QpOwogCQlzcGluX3VubG9jaygmcHJpdi0+bG9jayk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnR4X2xvY2ssIGZsYWdzKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZwcml2LT50eF9sb2NrKTsKIAkJaXBvaWJfY21fdHhfZGVzdHJveShwKTsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnR4X2xvY2ssIGZsYWdzKTsKKwkJc3Bpbl9sb2NrX2lycSgmcHJpdi0+dHhfbG9jayk7CiAJCXNwaW5fbG9jaygmcHJpdi0+bG9jayk7CiAJfQogCXNwaW5fdW5sb2NrKCZwcml2LT5sb2NrKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT50eF9sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxKCZwcml2LT50eF9sb2NrKTsKIH0KIAogc3RhdGljIHZvaWQgaXBvaWJfY21fc2tiX3JlYXAoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQpAQCAtMTA0NiwxNSArMTA0MCwxNCBAQAogCQkJCQkJICAgY20uc2tiX3Rhc2spOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwcml2LT5kZXY7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJdW5zaWduZWQgbXR1ID0gcHJpdi0+bWNhc3RfbXR1OwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnR4X2xvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxKCZwcml2LT50eF9sb2NrKTsKIAlzcGluX2xvY2soJnByaXYtPmxvY2spOwogCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJnByaXYtPmNtLnNrYl9xdWV1ZSkpKSB7CiAJCXNwaW5fdW5sb2NrKCZwcml2LT5sb2NrKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+dHhfbG9jaywgZmxhZ3MpOworCQlzcGluX3VubG9ja19pcnEoJnByaXYtPnR4X2xvY2spOwogCQlpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9JUCkpCiAJCQlpY21wX3NlbmQoc2tiLCBJQ01QX0RFU1RfVU5SRUFDSCwgSUNNUF9GUkFHX05FRURFRCwgaHRvbmwobXR1KSk7CiAjaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCkBAIC0xMDYyLDExICsxMDU1LDExIEBACiAJCQlpY21wdjZfc2VuZChza2IsIElDTVBWNl9QS1RfVE9PQklHLCAwLCBtdHUsIGRldik7CiAjZW5kaWYKIAkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnR4X2xvY2ssIGZsYWdzKTsKKwkJc3Bpbl9sb2NrX2lycSgmcHJpdi0+dHhfbG9jayk7CiAJCXNwaW5fbG9jaygmcHJpdi0+bG9jayk7CiAJfQogCXNwaW5fdW5sb2NrKCZwcml2LT5sb2NrKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT50eF9sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxKCZwcml2LT50eF9sb2NrKTsKIH0KIAogdm9pZCBpcG9pYl9jbV9za2JfdG9vX2xvbmcoc3RydWN0IG5ldF9kZXZpY2UqIGRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKQEAgLTEwODgsOSArMTA4MSw4IEBACiAJc3RydWN0IGlwb2liX2Rldl9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpcG9pYl9kZXZfcHJpdiwKIAkJCQkJCSAgIGNtLnN0YWxlX3Rhc2sud29yayk7CiAJc3RydWN0IGlwb2liX2NtX3J4ICpwOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnEoJnByaXYtPmxvY2spOwogCXdoaWxlICghbGlzdF9lbXB0eSgmcHJpdi0+Y20ucGFzc2l2ZV9pZHMpKSB7CiAJCS8qIExpc3QgaWYgc29ydGVkIGJ5IExSVSwgc3RhcnQgZnJvbSB0YWlsLAogCQkgKiBzdG9wIHdoZW4gd2Ugc2VlIGEgcmVjZW50bHkgdXNlZCBlbnRyeSAqLwpAQCAtMTA5OCwxMyArMTA5MCwxMyBAQAogCQlpZiAodGltZV9iZWZvcmVfZXEoamlmZmllcywgcC0+amlmZmllcyArIElQT0lCX0NNX1JYX1RJTUVPVVQpKQogCQkJYnJlYWs7CiAJCWxpc3RfZGVsX2luaXQoJnAtPmxpc3QpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJCXNwaW5fdW5sb2NrX2lycSgmcHJpdi0+bG9jayk7CiAJCWliX2Rlc3Ryb3lfY21faWQocC0+aWQpOwogCQlpYl9kZXN0cm95X3FwKHAtPnFwKTsKIAkJa2ZyZWUocCk7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJCXNwaW5fbG9ja19pcnEoJnByaXYtPmxvY2spOwogCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxKCZwcml2LT5sb2NrKTsKIH0KIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX2liLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX2liLmMKaW5kZXggYmEwZWU1Yy4uMWJkYjkxMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9pYi5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfaWIuYwpAQCAtMTcyLDggKzE3Miw4IEBACiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAl1NjQgYWRkcjsKIAotCWlwb2liX2RiZ19kYXRhKHByaXYsICJyZWN2IGNvbXBsZXRpb246IGlkICVkLCBvcCAlZCwgc3RhdHVzOiAlZFxuIiwKLQkJICAgICAgIHdyX2lkLCB3Yy0+b3Bjb2RlLCB3Yy0+c3RhdHVzKTsKKwlpcG9pYl9kYmdfZGF0YShwcml2LCAicmVjdiBjb21wbGV0aW9uOiBpZCAlZCwgc3RhdHVzOiAlZFxuIiwKKwkJICAgICAgIHdyX2lkLCB3Yy0+c3RhdHVzKTsKIAogCWlmICh1bmxpa2VseSh3cl9pZCA+PSBpcG9pYl9yZWN2cV9zaXplKSkgewogCQlpcG9pYl93YXJuKHByaXYsICJyZWN2IGNvbXBsZXRpb24gZXZlbnQgd2l0aCB3cmlkICVkICg+ICVkKVxuIiwKQEAgLTIxNiw3ICsyMTYsNyBAQAogCWlmICh3Yy0+c2xpZCAhPSBwcml2LT5sb2NhbF9saWQgfHwKIAkgICAgd2MtPnNyY19xcCAhPSBwcml2LT5xcC0+cXBfbnVtKSB7CiAJCXNrYi0+cHJvdG9jb2wgPSAoKHN0cnVjdCBpcG9pYl9oZWFkZXIgKikgc2tiLT5kYXRhKS0+cHJvdG87Ci0JCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKwkJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKIAkJc2tiX3B1bGwoc2tiLCBJUE9JQl9FTkNBUF9MRU4pOwogCiAJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CkBAIC0yNDUsOCArMjQ1LDggQEAKIAlzdHJ1Y3QgaXBvaWJfdHhfYnVmICp0eF9yZXE7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWlwb2liX2RiZ19kYXRhKHByaXYsICJzZW5kIGNvbXBsZXRpb246IGlkICVkLCBvcCAlZCwgc3RhdHVzOiAlZFxuIiwKLQkJICAgICAgIHdyX2lkLCB3Yy0+b3Bjb2RlLCB3Yy0+c3RhdHVzKTsKKwlpcG9pYl9kYmdfZGF0YShwcml2LCAic2VuZCBjb21wbGV0aW9uOiBpZCAlZCwgc3RhdHVzOiAlZFxuIiwKKwkJICAgICAgIHdyX2lkLCB3Yy0+c3RhdHVzKTsKIAogCWlmICh1bmxpa2VseSh3cl9pZCA+PSBpcG9pYl9zZW5kcV9zaXplKSkgewogCQlpcG9pYl93YXJuKHByaXYsICJzZW5kIGNvbXBsZXRpb24gZXZlbnQgd2l0aCB3cmlkICVkICg+ICVkKVxuIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfbWFpbi5jIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9tYWluLmMKaW5kZXggZjJhNDBhZS4uYjRjMzgwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9tYWluLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9tYWluLmMKQEAgLTM5NSwxNCArMzk1LDEwIEBACiAJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmc2txdWV1ZSk7CiAKIAlpZiAoIXN0YXR1cykgewotCQlzdHJ1Y3QgaWJfYWhfYXR0ciBhdiA9IHsKLQkJCS5kbGlkIAkgICAgICAgPSBiZTE2X3RvX2NwdShwYXRocmVjLT5kbGlkKSwKLQkJCS5zbCAJICAgICAgID0gcGF0aHJlYy0+c2wsCi0JCQkucG9ydF9udW0gICAgICA9IHByaXYtPnBvcnQsCi0JCQkuc3RhdGljX3JhdGUgICA9IHBhdGhyZWMtPnJhdGUKLQkJfTsKKwkJc3RydWN0IGliX2FoX2F0dHIgYXY7CiAKLQkJYWggPSBpcG9pYl9jcmVhdGVfYWgoZGV2LCBwcml2LT5wZCwgJmF2KTsKKwkJaWYgKCFpYl9pbml0X2FoX2Zyb21fcGF0aChwcml2LT5jYSwgcHJpdi0+cG9ydCwgcGF0aHJlYywgJmF2KSkKKwkJCWFoID0gaXBvaWJfY3JlYXRlX2FoKGRldiwgcHJpdi0+cGQsICZhdik7CiAJfQogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvZ2FtZXBvcnQvZ2FtZXBvcnQuYyBiL2RyaXZlcnMvaW5wdXQvZ2FtZXBvcnQvZ2FtZXBvcnQuYwppbmRleCBhMDBmZTQ3Li5iZDY4NmEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2dhbWVwb3J0L2dhbWVwb3J0LmMKKysrIGIvZHJpdmVycy9pbnB1dC9nYW1lcG9ydC9nYW1lcG9ydC5jCkBAIC0xOTAsMTYgKzE5MCwxNCBAQAogICogQmFzaWMgZ2FtZXBvcnQgLT4gZHJpdmVyIGNvcmUgbWFwcGluZ3MKICAqLwogCi1zdGF0aWMgdm9pZCBnYW1lcG9ydF9iaW5kX2RyaXZlcihzdHJ1Y3QgZ2FtZXBvcnQgKmdhbWVwb3J0LCBzdHJ1Y3QgZ2FtZXBvcnRfZHJpdmVyICpkcnYpCitzdGF0aWMgaW50IGdhbWVwb3J0X2JpbmRfZHJpdmVyKHN0cnVjdCBnYW1lcG9ydCAqZ2FtZXBvcnQsIHN0cnVjdCBnYW1lcG9ydF9kcml2ZXIgKmRydikKIHsKIAlpbnQgZXJyb3I7CiAKLQlkb3duX3dyaXRlKCZnYW1lcG9ydF9idXMuc3Vic3lzLnJ3c2VtKTsKLQogCWdhbWVwb3J0LT5kZXYuZHJpdmVyID0gJmRydi0+ZHJpdmVyOwogCWlmIChkcnYtPmNvbm5lY3QoZ2FtZXBvcnQsIGRydikpIHsKIAkJZ2FtZXBvcnQtPmRldi5kcml2ZXIgPSBOVUxMOwotCQlnb3RvIG91dDsKKwkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCiAJZXJyb3IgPSBkZXZpY2VfYmluZF9kcml2ZXIoJmdhbWVwb3J0LT5kZXYpOwpAQCAtMjExLDMxICsyMDksMjEgQEAKIAkJCWRydi0+ZGVzY3JpcHRpb24sIGVycm9yKTsKIAkJZHJ2LT5kaXNjb25uZWN0KGdhbWVwb3J0KTsKIAkJZ2FtZXBvcnQtPmRldi5kcml2ZXIgPSBOVUxMOwotCQlnb3RvIG91dDsKKwkJcmV0dXJuIGVycm9yOwogCX0KIAotIG91dDoKLQl1cF93cml0ZSgmZ2FtZXBvcnRfYnVzLnN1YnN5cy5yd3NlbSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGdhbWVwb3J0X3JlbGVhc2VfZHJpdmVyKHN0cnVjdCBnYW1lcG9ydCAqZ2FtZXBvcnQpCi17Ci0JZG93bl93cml0ZSgmZ2FtZXBvcnRfYnVzLnN1YnN5cy5yd3NlbSk7Ci0JZGV2aWNlX3JlbGVhc2VfZHJpdmVyKCZnYW1lcG9ydC0+ZGV2KTsKLQl1cF93cml0ZSgmZ2FtZXBvcnRfYnVzLnN1YnN5cy5yd3NlbSk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIGdhbWVwb3J0X2ZpbmRfZHJpdmVyKHN0cnVjdCBnYW1lcG9ydCAqZ2FtZXBvcnQpCiB7CiAJaW50IGVycm9yOwogCi0JZG93bl93cml0ZSgmZ2FtZXBvcnRfYnVzLnN1YnN5cy5yd3NlbSk7CiAJZXJyb3IgPSBkZXZpY2VfYXR0YWNoKCZnYW1lcG9ydC0+ZGV2KTsKIAlpZiAoZXJyb3IgPCAwKQogCQlwcmludGsoS0VSTl9XQVJOSU5HCiAJCQkiZ2FtZXBvcnQ6IGRldmljZV9hdHRhY2goKSBmYWlsZWQgZm9yICVzICglcyksIGVycm9yOiAlZFxuIiwKIAkJCWdhbWVwb3J0LT5waHlzLCBnYW1lcG9ydC0+bmFtZSwgZXJyb3IpOwotCXVwX3dyaXRlKCZnYW1lcG9ydF9idXMuc3Vic3lzLnJ3c2VtKTsKIH0KIAogCkBAIC00ODMsMTMgKzQ3MSwxMiBAQAogewogCXN0cnVjdCBnYW1lcG9ydCAqZ2FtZXBvcnQgPSB0b19nYW1lcG9ydF9wb3J0KGRldik7CiAJc3RydWN0IGRldmljZV9kcml2ZXIgKmRydjsKLQlpbnQgcmV0dmFsOworCWludCBlcnJvcjsKIAotCXJldHZhbCA9IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmZ2FtZXBvcnRfbXV0ZXgpOwotCWlmIChyZXR2YWwpCi0JCXJldHVybiByZXR2YWw7CisJZXJyb3IgPSBtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmdhbWVwb3J0X211dGV4KTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKIAotCXJldHZhbCA9IGNvdW50OwogCWlmICghc3RybmNtcChidWYsICJub25lIiwgY291bnQpKSB7CiAJCWdhbWVwb3J0X2Rpc2Nvbm5lY3RfcG9ydChnYW1lcG9ydCk7CiAJfSBlbHNlIGlmICghc3RybmNtcChidWYsICJyZWNvbm5lY3QiLCBjb3VudCkpIHsKQEAgLTQ5OSwxNSArNDg2LDE1IEBACiAJCWdhbWVwb3J0X2ZpbmRfZHJpdmVyKGdhbWVwb3J0KTsKIAl9IGVsc2UgaWYgKChkcnYgPSBkcml2ZXJfZmluZChidWYsICZnYW1lcG9ydF9idXMpKSAhPSBOVUxMKSB7CiAJCWdhbWVwb3J0X2Rpc2Nvbm5lY3RfcG9ydChnYW1lcG9ydCk7Ci0JCWdhbWVwb3J0X2JpbmRfZHJpdmVyKGdhbWVwb3J0LCB0b19nYW1lcG9ydF9kcml2ZXIoZHJ2KSk7CisJCWVycm9yID0gZ2FtZXBvcnRfYmluZF9kcml2ZXIoZ2FtZXBvcnQsIHRvX2dhbWVwb3J0X2RyaXZlcihkcnYpKTsKIAkJcHV0X2RyaXZlcihkcnYpOwogCX0gZWxzZSB7Ci0JCXJldHZhbCA9IC1FSU5WQUw7CisJCWVycm9yID0gLUVJTlZBTDsKIAl9CiAKIAltdXRleF91bmxvY2soJmdhbWVwb3J0X211dGV4KTsKIAotCXJldHVybiByZXR2YWw7CisJcmV0dXJuIGVycm9yID8gZXJyb3IgOiBjb3VudDsKIH0KIAogc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGdhbWVwb3J0X2RldmljZV9hdHRyc1tdID0gewpAQCAtNjU1LDcgKzY0Miw3IEBACiAJCWRvIHsKIAkJCXBhcmVudCA9IHMtPnBhcmVudDsKIAotCQkJZ2FtZXBvcnRfcmVsZWFzZV9kcml2ZXIocyk7CisJCQlkZXZpY2VfcmVsZWFzZV9kcml2ZXIoJnMtPmRldik7CiAJCQlnYW1lcG9ydF9kZXN0cm95X3BvcnQocyk7CiAJCX0gd2hpbGUgKChzID0gcGFyZW50KSAhPSBnYW1lcG9ydCk7CiAJfQpAQCAtNjYzLDcgKzY1MCw3IEBACiAJLyoKIAkgKiBPaywgbm8gY2hpbGRyZW4gbGVmdCwgbm93IGRpc2Nvbm5lY3QgdGhpcyBwb3J0CiAJICovCi0JZ2FtZXBvcnRfcmVsZWFzZV9kcml2ZXIoZ2FtZXBvcnQpOworCWRldmljZV9yZWxlYXNlX2RyaXZlcigmZ2FtZXBvcnQtPmRldik7CiB9CiAKIHZvaWQgZ2FtZXBvcnRfcmVzY2FuKHN0cnVjdCBnYW1lcG9ydCAqZ2FtZXBvcnQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3NlcmlvL3NlcmlvLmMgYi9kcml2ZXJzL2lucHV0L3NlcmlvL3NlcmlvLmMKaW5kZXggYTE1ZTUzMS4uNTg5NTIwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9zZXJpby9zZXJpby5jCisrKyBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vc2VyaW8uYwpAQCAtMTE1LDE4ICsxMTUsMTggQEAKICAqIEJhc2ljIHNlcmlvIC0+IGRyaXZlciBjb3JlIG1hcHBpbmdzCiAgKi8KIAotc3RhdGljIHZvaWQgc2VyaW9fYmluZF9kcml2ZXIoc3RydWN0IHNlcmlvICpzZXJpbywgc3RydWN0IHNlcmlvX2RyaXZlciAqZHJ2KQorc3RhdGljIGludCBzZXJpb19iaW5kX2RyaXZlcihzdHJ1Y3Qgc2VyaW8gKnNlcmlvLCBzdHJ1Y3Qgc2VyaW9fZHJpdmVyICpkcnYpCiB7CiAJaW50IGVycm9yOwogCi0JZG93bl93cml0ZSgmc2VyaW9fYnVzLnN1YnN5cy5yd3NlbSk7Ci0KIAlpZiAoc2VyaW9fbWF0Y2hfcG9ydChkcnYtPmlkX3RhYmxlLCBzZXJpbykpIHsKKwogCQlzZXJpby0+ZGV2LmRyaXZlciA9ICZkcnYtPmRyaXZlcjsKIAkJaWYgKHNlcmlvX2Nvbm5lY3RfZHJpdmVyKHNlcmlvLCBkcnYpKSB7CiAJCQlzZXJpby0+ZGV2LmRyaXZlciA9IE5VTEw7Ci0JCQlnb3RvIG91dDsKKwkJCXJldHVybiAtRU5PREVWOwogCQl9CisKIAkJZXJyb3IgPSBkZXZpY2VfYmluZF9kcml2ZXIoJnNlcmlvLT5kZXYpOwogCQlpZiAoZXJyb3IpIHsKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcKQEAgLTEzNiwzMSArMTM2LDIxIEBACiAJCQkJZHJ2LT5kZXNjcmlwdGlvbiwgZXJyb3IpOwogCQkJc2VyaW9fZGlzY29ubmVjdF9kcml2ZXIoc2VyaW8pOwogCQkJc2VyaW8tPmRldi5kcml2ZXIgPSBOVUxMOwotCQkJZ290byBvdXQ7CisJCQlyZXR1cm4gZXJyb3I7CiAJCX0KIAl9Ci0gb3V0OgotCXVwX3dyaXRlKCZzZXJpb19idXMuc3Vic3lzLnJ3c2VtKTsKLX0KLQotc3RhdGljIHZvaWQgc2VyaW9fcmVsZWFzZV9kcml2ZXIoc3RydWN0IHNlcmlvICpzZXJpbykKLXsKLQlkb3duX3dyaXRlKCZzZXJpb19idXMuc3Vic3lzLnJ3c2VtKTsKLQlkZXZpY2VfcmVsZWFzZV9kcml2ZXIoJnNlcmlvLT5kZXYpOwotCXVwX3dyaXRlKCZzZXJpb19idXMuc3Vic3lzLnJ3c2VtKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgc2VyaW9fZmluZF9kcml2ZXIoc3RydWN0IHNlcmlvICpzZXJpbykKIHsKIAlpbnQgZXJyb3I7CiAKLQlkb3duX3dyaXRlKCZzZXJpb19idXMuc3Vic3lzLnJ3c2VtKTsKIAllcnJvciA9IGRldmljZV9hdHRhY2goJnNlcmlvLT5kZXYpOwogCWlmIChlcnJvciA8IDApCiAJCXByaW50ayhLRVJOX1dBUk5JTkcKIAkJCSJzZXJpbzogZGV2aWNlX2F0dGFjaCgpIGZhaWxlZCBmb3IgJXMgKCVzKSwgZXJyb3I6ICVkXG4iLAogCQkJc2VyaW8tPnBoeXMsIHNlcmlvLT5uYW1lLCBlcnJvcik7Ci0JdXBfd3JpdGUoJnNlcmlvX2J1cy5zdWJzeXMucndzZW0pOwogfQogCiAKQEAgLTQ3MCwxMyArNDYwLDEyIEBACiB7CiAJc3RydWN0IHNlcmlvICpzZXJpbyA9IHRvX3NlcmlvX3BvcnQoZGV2KTsKIAlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2OwotCWludCByZXR2YWw7CisJaW50IGVycm9yOwogCi0JcmV0dmFsID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZzZXJpb19tdXRleCk7Ci0JaWYgKHJldHZhbCkKLQkJcmV0dXJuIHJldHZhbDsKKwllcnJvciA9IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmc2VyaW9fbXV0ZXgpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOwogCi0JcmV0dmFsID0gY291bnQ7CiAJaWYgKCFzdHJuY21wKGJ1ZiwgIm5vbmUiLCBjb3VudCkpIHsKIAkJc2VyaW9fZGlzY29ubmVjdF9wb3J0KHNlcmlvKTsKIAl9IGVsc2UgaWYgKCFzdHJuY21wKGJ1ZiwgInJlY29ubmVjdCIsIGNvdW50KSkgewpAQCAtNDg2LDE1ICs0NzUsMTUgQEAKIAkJc2VyaW9fZmluZF9kcml2ZXIoc2VyaW8pOwogCX0gZWxzZSBpZiAoKGRydiA9IGRyaXZlcl9maW5kKGJ1ZiwgJnNlcmlvX2J1cykpICE9IE5VTEwpIHsKIAkJc2VyaW9fZGlzY29ubmVjdF9wb3J0KHNlcmlvKTsKLQkJc2VyaW9fYmluZF9kcml2ZXIoc2VyaW8sIHRvX3NlcmlvX2RyaXZlcihkcnYpKTsKKwkJZXJyb3IgPSBzZXJpb19iaW5kX2RyaXZlcihzZXJpbywgdG9fc2VyaW9fZHJpdmVyKGRydikpOwogCQlwdXRfZHJpdmVyKGRydik7CiAJfSBlbHNlIHsKLQkJcmV0dmFsID0gLUVJTlZBTDsKKwkJZXJyb3IgPSAtRUlOVkFMOwogCX0KIAogCW11dGV4X3VubG9jaygmc2VyaW9fbXV0ZXgpOwogCi0JcmV0dXJuIHJldHZhbDsKKwlyZXR1cm4gZXJyb3IgPyBlcnJvciA6IGNvdW50OwogfQogCiBzdGF0aWMgc3NpemVfdCBzZXJpb19zaG93X2JpbmRfbW9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCkBAIC02NjUsNyArNjU0LDcgQEAKIAkJZG8gewogCQkJcGFyZW50ID0gcy0+cGFyZW50OwogCi0JCQlzZXJpb19yZWxlYXNlX2RyaXZlcihzKTsKKwkJCWRldmljZV9yZWxlYXNlX2RyaXZlcigmcy0+ZGV2KTsKIAkJCXNlcmlvX2Rlc3Ryb3lfcG9ydChzKTsKIAkJfSB3aGlsZSAoKHMgPSBwYXJlbnQpICE9IHNlcmlvKTsKIAl9CkBAIC02NzMsNyArNjYyLDcgQEAKIAkvKgogCSAqIE9rLCBubyBjaGlsZHJlbiBsZWZ0LCBub3cgZGlzY29ubmVjdCB0aGlzIHBvcnQKIAkgKi8KLQlzZXJpb19yZWxlYXNlX2RyaXZlcihzZXJpbyk7CisJZGV2aWNlX3JlbGVhc2VfZHJpdmVyKCZzZXJpby0+ZGV2KTsKIH0KIAogdm9pZCBzZXJpb19yZXNjYW4oc3RydWN0IHNlcmlvICpzZXJpbykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9hY3QyMDAwL21vZHVsZS5jIGIvZHJpdmVycy9pc2RuL2FjdDIwMDAvbW9kdWxlLmMKaW5kZXggZTNlNWMxMy4uZWUyYjBiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2FjdDIwMDAvbW9kdWxlLmMKKysrIGIvZHJpdmVycy9pc2RuL2FjdDIwMDAvbW9kdWxlLmMKQEAgLTQ0Miw3ICs0NDIsNyBAQAogCQkJcmV0dXJuIDA7CiAJCX0KIAkJc2tiX3Jlc2VydmUoeG1pdF9za2IsIDE5KTsKLQkJbWVtY3B5KHNrYl9wdXQoeG1pdF9za2IsIGxlbiksIHNrYi0+ZGF0YSwgbGVuKTsKKwkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIHNrYl9wdXQoeG1pdF9za2IsIGxlbiksIGxlbik7CiAJfSBlbHNlIHsKIAkJeG1pdF9za2IgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTsKIAkJaWYgKCF4bWl0X3NrYikgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2dpZ2FzZXQvdXNiLWdpZ2FzZXQuYyBiL2RyaXZlcnMvaXNkbi9naWdhc2V0L3VzYi1naWdhc2V0LmMKaW5kZXggMmJhZWYzNC4uYzhlMWMzNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2dpZ2FzZXQvdXNiLWdpZ2FzZXQuYworKysgYi9kcml2ZXJzL2lzZG4vZ2lnYXNldC91c2ItZ2lnYXNldC5jCkBAIC02NTIsNyArNjUyLDcgQEAKIAkgKiB0cmFuc21pdCBkYXRhCiAJICovCiAJY291bnQgPSBtaW4oYmNzLT50eF9za2ItPmxlbiwgKHVuc2lnbmVkKSB1Y3MtPmJ1bGtfb3V0X3NpemUpOwotCW1lbWNweSh1Y3MtPmJ1bGtfb3V0X2J1ZmZlciwgYmNzLT50eF9za2ItPmRhdGEsIGNvdW50KTsKKwlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKGJjcy0+dHhfc2tiLCB1Y3MtPmJ1bGtfb3V0X2J1ZmZlciwgY291bnQpOwogCXNrYl9wdWxsKGJjcy0+dHhfc2tiLCBjb3VudCk7CiAJYXRvbWljX3NldCgmdWNzLT5idXN5LCAxKTsKIAlnaWdfZGJnKERFQlVHX09VVFBVVCwgIndyaXRlX21vZGVtOiBzZW5kICVkIGJ5dGVzIiwgY291bnQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2F2bS9iMWRtYS5jIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2F2bS9iMWRtYS5jCmluZGV4IDFlMmQzOGUuLjQyODg3MmI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvYXZtL2IxZG1hLmMKKysrIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2F2bS9iMWRtYS5jCkBAIC00MDQsNyArNDA0LDggQEAKIAkJcHJpbnRrKEtFUk5fREVCVUcgInR4OiBwdXQgMHgleCBsZW49JWRcbiIsIAogCQkgICAgICAgc2tiLT5kYXRhWzJdLCB0eGxlbik7CiAjZW5kaWYKLQkJbWVtY3B5KGRtYS0+c2VuZGJ1Zi5kbWFidWYsIHNrYi0+ZGF0YSsyLCBza2ItPmxlbi0yKTsKKwkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YV9vZmZzZXQoc2tiLCAyLCBkbWEtPnNlbmRidWYuZG1hYnVmLAorCQkJCQkJIHNrYi0+bGVuIC0gMik7CiAJfQogCXR4bGVuID0gKHR4bGVuICsgMykgJiB+MzsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2F2bS9jNC5jIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2F2bS9jNC5jCmluZGV4IDZmNWVmYThkLi5kNThmOTI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvYXZtL2M0LmMKKysrIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2F2bS9jNC5jCkBAIC00NTcsNyArNDU3LDggQEAKIAkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB0eCBwdXQgMHgleCBsZW49JWRcbiIsCiAJCQkJY2FyZC0+bmFtZSwgc2tiLT5kYXRhWzJdLCB0eGxlbik7CiAjZW5kaWYKLQkJbWVtY3B5KGRtYS0+c2VuZGJ1Zi5kbWFidWYsIHNrYi0+ZGF0YSsyLCBza2ItPmxlbi0yKTsKKwkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YV9vZmZzZXQoc2tiLCAyLCBkbWEtPnNlbmRidWYuZG1hYnVmLAorCQkJCQkJIHNrYi0+bGVuIC0gMik7CiAJfQogCXR4bGVuID0gKHR4bGVuICsgMykgJiB+MzsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hpc2F4L2Vsc2Ffc2VyLmMgYi9kcml2ZXJzL2lzZG4vaGlzYXgvZWxzYV9zZXIuYwppbmRleCBhZTM3N2U4Li4xNjQyZGNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGlzYXgvZWxzYV9zZXIuYworKysgYi9kcml2ZXJzL2lzZG4vaGlzYXgvZWxzYV9zZXIuYwpAQCAtMjU0LDE0ICsyNTQsMTYgQEAKIAljb3VudCA9IGxlbjsKIAlpZiAoY291bnQgPiBNQVhfTU9ERU1fQlVGIC0gZnApIHsKIAkJY291bnQgPSBNQVhfTU9ERU1fQlVGIC0gZnA7Ci0JCW1lbWNweShjcy0+aHcuZWxzYS50cmFuc2J1ZiArIGZwLCBiY3MtPnR4X3NrYi0+ZGF0YSwgY291bnQpOworCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKGJjcy0+dHhfc2tiLAorCQkJCQkgIGNzLT5ody5lbHNhLnRyYW5zYnVmICsgZnAsIGNvdW50KTsKIAkJc2tiX3B1bGwoYmNzLT50eF9za2IsIGNvdW50KTsKIAkJY3MtPmh3LmVsc2EudHJhbnNjbnQgKz0gY291bnQ7CiAJCXJldCA9IGNvdW50OwogCQljb3VudCA9IGxlbiAtIGNvdW50OwogCQlmcCA9IDA7CiAJfQotCW1lbWNweSgoY3MtPmh3LmVsc2EudHJhbnNidWYgKyBmcCksIGJjcy0+dHhfc2tiLT5kYXRhLCBjb3VudCk7CisJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShiY3MtPnR4X3NrYiwKKwkJCQkgIGNzLT5ody5lbHNhLnRyYW5zYnVmICsgZnAsIGNvdW50KTsKIAlza2JfcHVsbChiY3MtPnR4X3NrYiwgY291bnQpOwogCWNzLT5ody5lbHNhLnRyYW5zY250ICs9IGNvdW50OwogCXJldCArPSBjb3VudDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oaXNheC9pc2RubDIuYyBiL2RyaXZlcnMvaXNkbi9oaXNheC9pc2RubDIuYwppbmRleCBjZDNiNWFkLi4zNDQ2ZjI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGlzYXgvaXNkbmwyLmMKKysrIGIvZHJpdmVycy9pc2RuL2hpc2F4L2lzZG5sMi5jCkBAIC0xMjkzLDcgKzEyOTMsOCBAQAogCQlvc2tiID0gc2tiOwogCQlza2IgPSBhbGxvY19za2Iob3NrYi0+bGVuICsgaSwgR0ZQX0FUT01JQyk7CiAJCW1lbWNweShza2JfcHV0KHNrYiwgaSksIGhlYWRlciwgaSk7Ci0JCW1lbWNweShza2JfcHV0KHNrYiwgb3NrYi0+bGVuKSwgb3NrYi0+ZGF0YSwgb3NrYi0+bGVuKTsKKwkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShvc2tiLAorCQkJCQkgIHNrYl9wdXQoc2tiLCBvc2tiLT5sZW4pLCBvc2tiLT5sZW4pOwogCQlkZXZfa2ZyZWVfc2tiKG9za2IpOwogCX0KIAlzdC0+bDIubDJsMShzdCwgUEhfUFVMTCB8IElORElDQVRJT04sIHNrYik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaHlzZG4vaHljYXBpLmMgYi9kcml2ZXJzL2lzZG4vaHlzZG4vaHljYXBpLmMKaW5kZXggYjJhZTRlYy4uZjg1NDUwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2h5c2RuL2h5Y2FwaS5jCisrKyBiL2RyaXZlcnMvaXNkbi9oeXNkbi9oeWNhcGkuYwpAQCAtMzk4LDggKzM5OCw5IEBACiAJCQlfbGVuID0gQ0FQSU1TR19MRU4oc2tiLT5kYXRhKTsKIAkJCWlmIChfbGVuID4gMjIpIHsKIAkJCQlfbGVuMiA9IF9sZW4gLSAyMjsKLQkJCQltZW1jcHkobXNnaGVhZCwgc2tiLT5kYXRhLCAyMik7Ci0JCQkJbWVtY3B5KHNrYi0+ZGF0YSArIF9sZW4yLCBtc2doZWFkLCAyMik7CisJCQkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIG1zZ2hlYWQsIDIyKTsKKwkJCQlza2JfY29weV90b19saW5lYXJfZGF0YV9vZmZzZXQoc2tiLCBfbGVuMiwKKwkJCQkJCQkgICAgICAgbXNnaGVhZCwgMjIpOwogCQkJCXNrYl9wdWxsKHNrYiwgX2xlbjIpOwogCQkJCUNBUElNU0dfU0VUTEVOKHNrYi0+ZGF0YSwgMjIpOwogCQkJCXJldHZhbCA9IGNhcGlsaWJfZGF0YV9iM19yZXEoJmNpbmZvLT5uY2NpX2hlYWQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaHlzZG4vaHlzZG5fbmV0LmMgYi9kcml2ZXJzL2lzZG4vaHlzZG4vaHlzZG5fbmV0LmMKaW5kZXggNTU3ZDk2Yy4uY2ZhOGZhNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2h5c2RuL2h5c2RuX25ldC5jCisrKyBiL2RyaXZlcnMvaXNkbi9oeXNkbi9oeXNkbl9uZXQuYwpAQCAtMjE0LDggKzIxNCw2IEBACiAJCWxwLT5zdGF0cy5yeF9kcm9wcGVkKys7CiAJCXJldHVybjsKIAl9Ci0Jc2tiLT5kZXYgPSAmbHAtPm5ldGRldjsKLQogCS8qIGNvcHkgdGhlIGRhdGEgKi8KIAltZW1jcHkoc2tiX3B1dChza2IsIGxlbiksIGJ1ZiwgbGVuKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2h5c2RuL2h5c2RuX3NjaGVkLmMgYi9kcml2ZXJzL2lzZG4vaHlzZG4vaHlzZG5fc2NoZWQuYwppbmRleCBiN2I1YWE0Li44MWRiNGExIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaHlzZG4vaHlzZG5fc2NoZWQuYworKysgYi9kcml2ZXJzL2lzZG4vaHlzZG4vaHlzZG5fc2NoZWQuYwpAQCAtMTEzLDcgKzExMyw4IEBACiAJICAgIChza2IgPSBoeXNkbl90eF9uZXRnZXQoY2FyZCkpICE9IE5VTEwpIAogCXsKIAkJaWYgKHNrYi0+bGVuIDw9IG1heGxlbikgewotCQkJbWVtY3B5KGJ1Ziwgc2tiLT5kYXRhLCBza2ItPmxlbik7CS8qIGNvcHkgdGhlIHBhY2tldCB0byB0aGUgYnVmZmVyICovCisJCQkvKiBjb3B5IHRoZSBwYWNrZXQgdG8gdGhlIGJ1ZmZlciAqLworCQkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIGJ1Ziwgc2tiLT5sZW4pOwogCQkJKmxlbiA9IHNrYi0+bGVuOwogCQkJKmNoYW4gPSBDSEFOX05ESVNfREFUQTsKIAkJCWNhcmQtPm5ldF90eF9idXN5ID0gMTsJLyogd2UgYXJlIGJ1c3kgc2VuZGluZyBuZXR3b3JrIGRhdGEgKi8KQEAgLTEyNiw3ICsxMjcsNyBAQAogCSAgICAoKHNrYiA9IGh5Y2FwaV90eF9jYXBpZ2V0KGNhcmQpKSAhPSBOVUxMKSApCiAJewogCQlpZiAoc2tiLT5sZW4gPD0gbWF4bGVuKSB7Ci0JCQltZW1jcHkoYnVmLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwkJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCBidWYsIHNrYi0+bGVuKTsKIAkJCSpsZW4gPSBza2ItPmxlbjsKIAkJCSpjaGFuID0gQ0hBTl9DQVBJOwogCQkJaHljYXBpX3R4X2NhcGlhY2soY2FyZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fY29tbW9uLmMgYi9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fY29tbW9uLmMKaW5kZXggOWM5MjZlNC4uYzk3MzMwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2k0bC9pc2RuX2NvbW1vbi5jCisrKyBiL2RyaXZlcnMvaXNkbi9pNGwvaXNkbl9jb21tb24uYwpAQCAtODI5LDcgKzgyOSw3IEBACiAJCQkJZGZsYWcgPSAwOwogCQkJfQogCQkJY291bnRfcHV0ID0gY291bnRfcHVsbDsKLQkJCW1lbWNweShjcCwgc2tiLT5kYXRhLCBjb3VudF9wdXQpOworCQkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIGNwLCBjb3VudF9wdXQpOwogCQkJY3AgKz0gY291bnRfcHV0OwogCQkJbGVuIC09IGNvdW50X3B1dDsKICNpZmRlZiBDT05GSUdfSVNETl9BVURJTwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2k0bC9pc2RuX25ldC5jIGIvZHJpdmVycy9pc2RuL2k0bC9pc2RuX25ldC5jCmluZGV4IDgzOGIzNzMuLmFhODMyNzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9pNGwvaXNkbl9uZXQuYworKysgYi9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fbmV0LmMKQEAgLTg3Miw3ICs4NzIsOCBAQAogc3RhdGljIHZvaWQKIGlzZG5fbmV0X2xvZ19za2Ioc3RydWN0IHNrX2J1ZmYgKiBza2IsIGlzZG5fbmV0X2xvY2FsICogbHApCiB7Ci0JdV9jaGFyICpwID0gc2tiLT5uaC5yYXc7IC8qIGhvcGVmdWxseSwgdGhpcyB3YXMgc2V0IGNvcnJlY3RseSAqLworCS8qIGhvcGVmdWxseSwgdGhpcyB3YXMgc2V0IGNvcnJlY3RseSAqLworCWNvbnN0IHVfY2hhciAqcCA9IHNrYl9uZXR3b3JrX2hlYWRlcihza2IpOwogCXVuc2lnbmVkIHNob3J0IHByb3RvID0gbnRvaHMoc2tiLT5wcm90b2NvbCk7CiAJaW50IGRhdGFfb2ZzOwogCWlwX3BvcnRzICppcHA7CkBAIC04ODAsNyArODgxLDcgQEAKIAogCWFkZGluZm9bMF0gPSAnXDAnOwogCS8qIFRoaXMgY2hlY2sgc3RvbGVuIGZyb20gMi4xLjcyIGRldl9xdWV1ZV94bWl0X25pdCgpICovCi0JaWYgKHNrYi0+bmgucmF3IDwgc2tiLT5kYXRhIHx8IHNrYi0+bmgucmF3ID49IHNrYi0+dGFpbCkgeworCWlmIChwIDwgc2tiLT5kYXRhIHx8IHNrYi0+bmV0d29ya19oZWFkZXIgPj0gc2tiLT50YWlsKSB7CiAJCS8qIGZhbGwgYmFjayB0byBvbGQgaXNkbl9uZXRfbG9nX3BhY2tldCBtZXRob2QoKSAqLwogCQljaGFyICogYnVmID0gc2tiLT5kYXRhOwogCkBAIC0xMTIxLDcgKzExMjIsNyBAQAogCWlmICghc2tiKQogCQlyZXR1cm47CiAJaWYgKGxwLT5wX2VuY2FwID09IElTRE5fTkVUX0VOQ0FQX0VUSEVSKSB7Ci0JCWludCBwdWxsc2l6ZSA9ICh1bG9uZylza2ItPm5oLnJhdyAtICh1bG9uZylza2ItPmRhdGEgLSBFVEhfSExFTjsKKwkJY29uc3QgaW50IHB1bGxzaXplID0gc2tiX25ldHdvcmtfb2Zmc2V0KHNrYikgLSBFVEhfSExFTjsKIAkJaWYgKHB1bGxzaXplID4gMCkgewogCQkJcHJpbnRrKEtFUk5fREVCVUcgImlzZG5fbmV0OiBQdWxsIGp1bmsgJWRcbiIsIHB1bGxzaXplKTsKIAkJCXNrYl9wdWxsKHNrYiwgcHVsbHNpemUpOwpAQCAtMTM2Niw3ICsxMzY3LDcgQEAKIAlzdHJ1Y3QgZXRoaGRyICpldGg7CiAJdW5zaWduZWQgY2hhciAqcmF3cDsKIAotCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKwlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwogCXNrYl9wdWxsKHNrYiwgRVRIX0hMRU4pOwogCWV0aCA9IGV0aF9oZHIoc2tiKTsKIApAQCAtMTc4Niw3ICsxNzg3LDcgQEAKIAl9CiAJc2tiLT5kZXYgPSBuZGV2OwogCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfSE9TVDsKLQlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKICNpZmRlZiBJU0ROX0RFQlVHX05FVF9EVU1QCiAJaXNkbl9kdW1wcGt0KCJSOiIsIHNrYi0+ZGF0YSwgc2tiLT5sZW4sIDQwKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2k0bC9pc2RuX3BwcC5jIGIvZHJpdmVycy9pc2RuL2k0bC9pc2RuX3BwcC5jCmluZGV4IDFiMmRmODAuLjM4NzM5MmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9pNGwvaXNkbl9wcHAuYworKysgYi9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fcHBwLmMKQEAgLTExMDAsNyArMTEwMCw4IEBACiAJCQkJCWdvdG8gZHJvcF9wYWNrZXQ7CiAJCQkJfQogCQkJCXNrYl9wdXQoc2tiLCBza2Jfb2xkLT5sZW4gKyAxMjgpOwotCQkJCW1lbWNweShza2ItPmRhdGEsIHNrYl9vbGQtPmRhdGEsIHNrYl9vbGQtPmxlbik7CisJCQkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2Jfb2xkLCBza2ItPmRhdGEsCisJCQkJCQkJICBza2Jfb2xkLT5sZW4pOwogCQkJCWlmIChuZXRfZGV2LT5sb2NhbC0+cHBwX3Nsb3QgPCAwKSB7CiAJCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IG5ldF9kZXYtPmxvY2FsLT5wcHBfc2xvdCglZCkgb3V0IG9mIHJhbmdlXG4iLAogCQkJCQkJX19GVU5DVElPTl9fLCBuZXRfZGV2LT5sb2NhbC0+cHBwX3Nsb3QpOwpAQCAtMTE2Nyw3ICsxMTY4LDcgQEAKIAkJbWxwLT5odXB0aW1lciA9IDA7CiAjZW5kaWYgLyogQ09ORklHX0lQUFBfRklMVEVSICovCiAJc2tiLT5kZXYgPSBkZXY7Ci0Jc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOworCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CiAJbmV0aWZfcngoc2tiKTsKIAkvKiBuZXRfZGV2LT5sb2NhbC0+c3RhdHMucnhfcGFja2V0cysrOyBkb25lIGluIGlzZG5fbmV0LmMgKi8KIAlyZXR1cm47CkBAIC0xOTAyLDcgKzE5MDMsOSBAQAogCQl3aGlsZSggZnJvbSAhPSB0byApIHsKIAkJCXVuc2lnbmVkIGludCBsZW4gPSBmcm9tLT5sZW4gLSBNUF9IRUFERVJfTEVOOwogCi0JCQltZW1jcHkoc2tiX3B1dChza2IsbGVuKSwgZnJvbS0+ZGF0YStNUF9IRUFERVJfTEVOLCBsZW4pOworCQkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YV9vZmZzZXQoZnJvbSwgTVBfSEVBREVSX0xFTiwKKwkJCQkJCQkgc2tiX3B1dChza2IsbGVuKSwKKwkJCQkJCQkgbGVuKTsKIAkJCWZyYWcgPSBmcm9tLT5uZXh0OwogCQkJaXNkbl9wcHBfbXBfZnJlZV9za2IobXAsIGZyb20pOwogCQkJZnJvbSA9IGZyYWc7IApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2lzZG5sb29wL2lzZG5sb29wLmMgYi9kcml2ZXJzL2lzZG4vaXNkbmxvb3AvaXNkbmxvb3AuYwppbmRleCBlM2FkZDI3Li5lOTNhZDU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaXNkbmxvb3AvaXNkbmxvb3AuYworKysgYi9kcml2ZXJzL2lzZG4vaXNkbmxvb3AvaXNkbmxvb3AuYwpAQCAtNDE1LDcgKzQxNSw4IEBACiAJCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5pc2RubG9vcF9sb2NrLCBmbGFncyk7CiAJCW5za2IgPSBkZXZfYWxsb2Nfc2tiKHNrYi0+bGVuKTsKIAkJaWYgKG5za2IpIHsKLQkJCW1lbWNweShza2JfcHV0KG5za2IsIGxlbiksIHNrYi0+ZGF0YSwgbGVuKTsKKwkJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLAorCQkJCQkJICBza2JfcHV0KG5za2IsIGxlbiksIGxlbik7CiAJCQlza2JfcXVldWVfdGFpbCgmY2FyZC0+YnF1ZXVlW2NoYW5uZWxdLCBuc2tiKTsKIAkJCWRldl9rZnJlZV9za2Ioc2tiKTsKIAkJfSBlbHNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vcGNiaXQvY2FwaS5jIGIvZHJpdmVycy9pc2RuL3BjYml0L2NhcGkuYwppbmRleCA0N2M1OWU5Li43YjU1ZTE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vcGNiaXQvY2FwaS5jCisrKyBiL2RyaXZlcnMvaXNkbi9wY2JpdC9jYXBpLmMKQEAgLTQyOSw4ICs0MjksOSBAQAogCQlpZiAoIShpbmZvLT5kYXRhLnNldHVwLkNhbGxpbmdQTiA9IGttYWxsb2MobGVuIC0gY291bnQgKyAxLCBHRlBfQVRPTUlDKSkpCiAJCQlyZXR1cm4gLTE7CiAgICAgICAgCi0JCW1lbWNweShpbmZvLT5kYXRhLnNldHVwLkNhbGxpbmdQTiwgc2tiLT5kYXRhICsgY291bnQgKyAxLCAKLQkJICAgICAgIGxlbiAtIGNvdW50KTsKKwkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YV9vZmZzZXQoc2tiLCBjb3VudCArIDEsCisJCQkJCQkgaW5mby0+ZGF0YS5zZXR1cC5DYWxsaW5nUE4sCisJCQkJCQkgbGVuIC0gY291bnQpOwogCQlpbmZvLT5kYXRhLnNldHVwLkNhbGxpbmdQTltsZW4gLSBjb3VudF0gPSAwOwogCiAJfQpAQCAtNDU3LDggKzQ1OCw5IEBACiAJCWlmICghKGluZm8tPmRhdGEuc2V0dXAuQ2FsbGVkUE4gPSBrbWFsbG9jKGxlbiAtIGNvdW50ICsgMSwgR0ZQX0FUT01JQykpKQogCQkJcmV0dXJuIC0xOwogICAgICAgICAKLQkJbWVtY3B5KGluZm8tPmRhdGEuc2V0dXAuQ2FsbGVkUE4sIHNrYi0+ZGF0YSArIGNvdW50ICsgMSwgCi0JCSAgICAgICBsZW4gLSBjb3VudCk7IAorCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhX29mZnNldChza2IsIGNvdW50ICsgMSwKKwkJCQkJCSBpbmZvLT5kYXRhLnNldHVwLkNhbGxlZFBOLAorCQkJCQkJIGxlbiAtIGNvdW50KTsKIAkJaW5mby0+ZGF0YS5zZXR1cC5DYWxsZWRQTltsZW4gLSBjb3VudF0gPSAwOwogCiAJfQpAQCAtNTM5LDcgKzU0MSw3IEBACiAKICNpZmRlZiBERUJVRwogCWlmIChsZW4gPiAxICYmIGxlbiA8IDMxKSB7Ci0JCW1lbWNweShzdHIsIHNrYi0+ZGF0YSArIDIsIGxlbiAtIDEpOworCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhX29mZnNldChza2IsIDIsIHN0ciwgbGVuIC0gMSk7CiAJCXN0cltsZW5dID0gMDsKIAkJcHJpbnRrKEtFUk5fREVCVUcgIkNvbm5lY3RlZCBQYXJ0eSBOdW1iZXI6ICVzXG4iLCBzdHIpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWFjaW50b3NoL2FkYi5jIGIvZHJpdmVycy9tYWNpbnRvc2gvYWRiLmMKaW5kZXggZjcyOWVlYi4uYWRmZWEzYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tYWNpbnRvc2gvYWRiLmMKKysrIGIvZHJpdmVycy9tYWNpbnRvc2gvYWRiLmMKQEAgLTkwLDcgKzkwLDcgQEAKIGludCBfX2FkYl9wcm9iZV9zeW5jOwogCiAjaWZkZWYgQ09ORklHX1BNCi1zdGF0aWMgaW50IGFkYl9ub3RpZnlfc2xlZXAoc3RydWN0IHBtdV9zbGVlcF9ub3RpZmllciAqc2VsZiwgaW50IHdoZW4pOworc3RhdGljIHZvaWQgYWRiX25vdGlmeV9zbGVlcChzdHJ1Y3QgcG11X3NsZWVwX25vdGlmaWVyICpzZWxmLCBpbnQgd2hlbik7CiBzdGF0aWMgc3RydWN0IHBtdV9zbGVlcF9ub3RpZmllciBhZGJfc2xlZXBfbm90aWZpZXIgPSB7CiAJYWRiX25vdGlmeV9zbGVlcCwKIAlTTEVFUF9MRVZFTF9BREIsCkBAIC0zNDAsMTEgKzM0MCw5IEBACiAvKgogICogbm90aWZ5IGNsaWVudHMgYmVmb3JlIHNsZWVwIGFuZCByZXNldCBidXMgYWZ0ZXJ3YXJkcwogICovCi1pbnQKK3ZvaWQKIGFkYl9ub3RpZnlfc2xlZXAoc3RydWN0IHBtdV9zbGVlcF9ub3RpZmllciAqc2VsZiwgaW50IHdoZW4pCiB7Ci0JaW50IHJldDsKLQkKIAlzd2l0Y2ggKHdoZW4pIHsKIAljYXNlIFBCT09LX1NMRUVQX1JFUVVFU1Q6CiAJCWFkYl9nb3Rfc2xlZXAgPSAxOwpAQCAtMzUzLDIyICszNTEsOCBAQAogCQkvKiBTdG9wIGF1dG9wb2xsICovCiAJCWlmIChhZGJfY29udHJvbGxlci0+YXV0b3BvbGwpCiAJCQlhZGJfY29udHJvbGxlci0+YXV0b3BvbGwoMCk7Ci0JCXJldCA9IGJsb2NraW5nX25vdGlmaWVyX2NhbGxfY2hhaW4oJmFkYl9jbGllbnRfbGlzdCwKLQkJCQlBREJfTVNHX1BPV0VSRE9XTiwgTlVMTCk7Ci0JCWlmIChyZXQgJiBOT1RJRllfU1RPUF9NQVNLKSB7Ci0JCQl1cCgmYWRiX3Byb2JlX211dGV4KTsKLQkJCXJldHVybiBQQk9PS19TTEVFUF9SRUZVU0U7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBQQk9PS19TTEVFUF9SRUpFQ1Q6Ci0JCWlmIChhZGJfZ290X3NsZWVwKSB7Ci0JCQlhZGJfZ290X3NsZWVwID0gMDsKLQkJCXVwKCZhZGJfcHJvYmVfbXV0ZXgpOwotCQkJYWRiX3Jlc2V0X2J1cygpOwotCQl9Ci0JCWJyZWFrOwotCQkKLQljYXNlIFBCT09LX1NMRUVQX05PVzoKKwkJYmxvY2tpbmdfbm90aWZpZXJfY2FsbF9jaGFpbigmYWRiX2NsaWVudF9saXN0LAorCQkJQURCX01TR19QT1dFUkRPV04sIE5VTEwpOwogCQlicmVhazsKIAljYXNlIFBCT09LX1dBS0U6CiAJCWFkYl9nb3Rfc2xlZXAgPSAwOwpAQCAtMzc2LDE0ICszNjAsMTMgQEAKIAkJYWRiX3Jlc2V0X2J1cygpOwogCQlicmVhazsKIAl9Ci0JcmV0dXJuIFBCT09LX1NMRUVQX09LOwogfQogI2VuZGlmIC8qIENPTkZJR19QTSAqLwogCiBzdGF0aWMgaW50CiBkb19hZGJfcmVzZXRfYnVzKHZvaWQpCiB7Ci0JaW50IHJldCwgbnJldDsKKwlpbnQgcmV0OwogCQogCWlmIChhZGJfY29udHJvbGxlciA9PSBOVUxMKQogCQlyZXR1cm4gLUVOWElPOwpAQCAtMzkxLDEzICszNzQsOCBAQAogCWlmIChhZGJfY29udHJvbGxlci0+YXV0b3BvbGwpCiAJCWFkYl9jb250cm9sbGVyLT5hdXRvcG9sbCgwKTsKIAotCW5yZXQgPSBibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKCZhZGJfY2xpZW50X2xpc3QsCi0JCQlBREJfTVNHX1BSRV9SRVNFVCwgTlVMTCk7Ci0JaWYgKG5yZXQgJiBOT1RJRllfU1RPUF9NQVNLKSB7Ci0JCWlmIChhZGJfY29udHJvbGxlci0+YXV0b3BvbGwpCi0JCQlhZGJfY29udHJvbGxlci0+YXV0b3BvbGwoYXV0b3BvbGxfZGV2cyk7Ci0JCXJldHVybiAtRUJVU1k7Ci0JfQorCWJsb2NraW5nX25vdGlmaWVyX2NhbGxfY2hhaW4oJmFkYl9jbGllbnRfbGlzdCwKKwkJQURCX01TR19QUkVfUkVTRVQsIE5VTEwpOwogCiAJaWYgKHNsZWVweV90cmFja3BhZCkgewogCQkvKiBMZXQgdGhlIHRyYWNrcGFkIHNldHRsZSBkb3duICovCkBAIC00MjcsMTAgKzQwNSw4IEBACiAJfQogCXVwKCZhZGJfaGFuZGxlcl9zZW0pOwogCi0JbnJldCA9IGJsb2NraW5nX25vdGlmaWVyX2NhbGxfY2hhaW4oJmFkYl9jbGllbnRfbGlzdCwKLQkJCUFEQl9NU0dfUE9TVF9SRVNFVCwgTlVMTCk7Ci0JaWYgKG5yZXQgJiBOT1RJRllfU1RPUF9NQVNLKQotCQlyZXR1cm4gLUVCVVNZOworCWJsb2NraW5nX25vdGlmaWVyX2NhbGxfY2hhaW4oJmFkYl9jbGllbnRfbGlzdCwKKwkJQURCX01TR19QT1NUX1JFU0VULCBOVUxMKTsKIAkKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tYWNpbnRvc2gvYW5zLWxjZC5jIGIvZHJpdmVycy9tYWNpbnRvc2gvYW5zLWxjZC5jCmluZGV4IGNkZDVhMGYuLmU1NGM0ZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWFjaW50b3NoL2Fucy1sY2QuYworKysgYi9kcml2ZXJzL21hY2ludG9zaC9hbnMtbGNkLmMKQEAgLTE0NSwxMSArMTQ1LDEyIEBACiAJaW50IHJldHZhbDsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUqIG5vZGU7CiAKLQlub2RlID0gZmluZF9kZXZpY2VzKCJsY2QiKTsKLQlpZiAoIW5vZGUgfHwgIW5vZGUtPnBhcmVudCkKKwlub2RlID0gb2ZfZmluZF9ub2RlX2J5X25hbWUoTlVMTCwgImxjZCIpOworCWlmICghbm9kZSB8fCAhbm9kZS0+cGFyZW50IHx8IHN0cmNtcChub2RlLT5wYXJlbnQtPm5hbWUsICJnYyIpKSB7CisJCW9mX25vZGVfcHV0KG5vZGUpOwogCQlyZXR1cm4gLUVOT0RFVjsKLQlpZiAoc3RyY21wKG5vZGUtPnBhcmVudC0+bmFtZSwgImdjIikpCi0JCXJldHVybiAtRU5PREVWOworCX0KKwlvZl9ub2RlX3B1dChub2RlKTsKIAogCWFuc2xjZF9wdHIgPSBpb3JlbWFwKEFOU0xDRF9BRERSLCAweDIwKTsKIAkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWFjaW50b3NoL2FwbV9lbXUuYyBiL2RyaXZlcnMvbWFjaW50b3NoL2FwbV9lbXUuYwppbmRleCBjNWU0ZDQzLi5jZGIwYmVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21hY2ludG9zaC9hcG1fZW11LmMKKysrIGIvZHJpdmVycy9tYWNpbnRvc2gvYXBtX2VtdS5jCkBAIC05Niw3ICs5Niw3IEBACiBzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQoYXBtX3N1c3BlbmRfd2FpdHF1ZXVlKTsKIHN0YXRpYyBzdHJ1Y3QgYXBtX3VzZXIgKgl1c2VyX2xpc3Q7CiAKLXN0YXRpYyBpbnQgYXBtX25vdGlmeV9zbGVlcChzdHJ1Y3QgcG11X3NsZWVwX25vdGlmaWVyICpzZWxmLCBpbnQgd2hlbik7CitzdGF0aWMgdm9pZCBhcG1fbm90aWZ5X3NsZWVwKHN0cnVjdCBwbXVfc2xlZXBfbm90aWZpZXIgKnNlbGYsIGludCB3aGVuKTsKIHN0YXRpYyBzdHJ1Y3QgcG11X3NsZWVwX25vdGlmaWVyIGFwbV9zbGVlcF9ub3RpZmllciA9IHsKIAlhcG1fbm90aWZ5X3NsZWVwLAogCVNMRUVQX0xFVkVMX1VTRVJMQU5ELApAQCAtMzUyLDcgKzM1Miw3IEBACiAgKiBkb2Vzbid0IHByb3ZpZGUgYSB3YXkgdG8gTkFLLCBidXQgdGhpcyBjb3VsZCBiZSBhZGRlZAogICogaGVyZS4KICAqLwotc3RhdGljIGludCB3YWl0X2FsbF9zdXNwZW5kKHZvaWQpCitzdGF0aWMgdm9pZCB3YWl0X2FsbF9zdXNwZW5kKHZvaWQpCiB7CiAJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CiAKQEAgLTM2NiwyNCArMzY2LDE5IEBACiAJcmVtb3ZlX3dhaXRfcXVldWUoJmFwbV9zdXNwZW5kX3dhaXRxdWV1ZSwgJndhaXQpOwogCiAJREJHKCJhcG1fZW11OiB3YWl0X2FsbF9zdXNwZW5kKCkgLSBjb21wbGV0ZSAhXG4iKTsKLQkKLQlyZXR1cm4gMTsKIH0KIAotc3RhdGljIGludCBhcG1fbm90aWZ5X3NsZWVwKHN0cnVjdCBwbXVfc2xlZXBfbm90aWZpZXIgKnNlbGYsIGludCB3aGVuKQorc3RhdGljIHZvaWQgYXBtX25vdGlmeV9zbGVlcChzdHJ1Y3QgcG11X3NsZWVwX25vdGlmaWVyICpzZWxmLCBpbnQgd2hlbikKIHsKIAlzd2l0Y2god2hlbikgewogCQljYXNlIFBCT09LX1NMRUVQX1JFUVVFU1Q6CiAJCQlxdWV1ZV9ldmVudChBUE1fU1lTX1NVU1BFTkQsIE5VTEwpOwotCQkJaWYgKCF3YWl0X2FsbF9zdXNwZW5kKCkpCi0JCQkJcmV0dXJuIFBCT09LX1NMRUVQX1JFRlVTRTsKKwkJCXdhaXRfYWxsX3N1c3BlbmQoKTsKIAkJCWJyZWFrOwotCQljYXNlIFBCT09LX1NMRUVQX1JFSkVDVDoKIAkJY2FzZSBQQk9PS19XQUtFOgogCQkJcXVldWVfZXZlbnQoQVBNX05PUk1BTF9SRVNVTUUsIE5VTEwpOwogCQkJYnJlYWs7CiAJfQotCXJldHVybiBQQk9PS19TTEVFUF9PSzsKIH0KIAogI2RlZmluZSBBUE1fQ1JJVElDQUwJCTEwCmRpZmYgLS1naXQgYS9kcml2ZXJzL21hY2ludG9zaC9tYWNfaGlkLmMgYi9kcml2ZXJzL21hY2ludG9zaC9tYWNfaGlkLmMKaW5kZXggYzFmZDgxNi4uMTU5OWRjMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tYWNpbnRvc2gvbWFjX2hpZC5jCisrKyBiL2RyaXZlcnMvbWFjaW50b3NoL21hY19oaWQuYwpAQCAtMTAyLDggKzEwMiw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLUVYUE9SVF9TWU1CT0wobWFjX2hpZF9tb3VzZV9lbXVsYXRlX2J1dHRvbnMpOwotCiBzdGF0aWMgaW50IGVtdW1vdXNlYnRuX2lucHV0X3JlZ2lzdGVyKHZvaWQpCiB7CiAJaW50IHJldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWFjaW50b3NoL21hY2lvLWFkYi5jIGIvZHJpdmVycy9tYWNpbnRvc2gvbWFjaW8tYWRiLmMKaW5kZXggMDI2YjY3Zi4uNzkxMTlmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tYWNpbnRvc2gvbWFjaW8tYWRiLmMKKysrIGIvZHJpdmVycy9tYWNpbnRvc2gvbWFjaW8tYWRiLmMKQEAgLTgyLDcgKzgyLDE0IEBACiAKIGludCBtYWNpb19wcm9iZSh2b2lkKQogewotCXJldHVybiBmaW5kX2NvbXBhdGlibGVfZGV2aWNlcygiYWRiIiwgImNocnAsYWRiMCIpPyAwOiAtRU5PREVWOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisKKwlucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsICJhZGIiLCAiY2hycCxhZGIwIik7CisJaWYgKG5wKSB7CisJCW9mX25vZGVfcHV0KG5wKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAtRU5PREVWOwogfQogCiBpbnQgbWFjaW9faW5pdCh2b2lkKQpAQCAtOTEsMTIgKzk4LDE0IEBACiAJc3RydWN0IHJlc291cmNlIHI7CiAJdW5zaWduZWQgaW50IGlycTsKIAotCWFkYnMgPSBmaW5kX2NvbXBhdGlibGVfZGV2aWNlcygiYWRiIiwgImNocnAsYWRiMCIpOworCWFkYnMgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShOVUxMLCAiYWRiIiwgImNocnAsYWRiMCIpOwogCWlmIChhZGJzID09IDApCiAJCXJldHVybiAtRU5YSU87CiAKLQlpZiAob2ZfYWRkcmVzc190b19yZXNvdXJjZShhZGJzLCAwLCAmcikpCisJaWYgKG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UoYWRicywgMCwgJnIpKSB7CisJCW9mX25vZGVfcHV0KGFkYnMpOwogCQlyZXR1cm4gLUVOWElPOworCX0KIAlhZGIgPSBpb3JlbWFwKHIuc3RhcnQsIHNpemVvZihzdHJ1Y3QgYWRiX3JlZ3MpKTsKIAogCW91dF84KCZhZGItPmN0cmwuciwgMCk7CkBAIC0xMDcsNiArMTE2LDcgQEAKIAlvdXRfOCgmYWRiLT5hdXRvcG9sbC5yLCBBUEUpOwogCiAJaXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAoYWRicywgMCk7CisJb2Zfbm9kZV9wdXQoYWRicyk7CiAJaWYgKHJlcXVlc3RfaXJxKGlycSwgbWFjaW9fYWRiX2ludGVycnVwdCwgMCwgIkFEQiIsICh2b2lkICopMCkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJBREI6IGNhbid0IGdldCBpcnEgJWRcbiIsIGlycSk7CiAJCXJldHVybiAtRUFHQUlOOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tYWNpbnRvc2gvbWFjaW9fYXNpYy5jIGIvZHJpdmVycy9tYWNpbnRvc2gvbWFjaW9fYXNpYy5jCmluZGV4IGQ1NjIxNjAuLmM5NmI3ZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWFjaW50b3NoL21hY2lvX2FzaWMuYworKysgYi9kcml2ZXJzL21hY2ludG9zaC9tYWNpb19hc2ljLmMKQEAgLTEzNCwxMDggKzEzNCwxMiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG1hY2lvX3VldmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKiplbnZwLCBpbnQgbnVtX2VudnAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmJ1ZmZlciwgaW50IGJ1ZmZlcl9zaXplKQotewotCXN0cnVjdCBtYWNpb19kZXYgKiBtYWNpb19kZXY7Ci0Jc3RydWN0IG9mX2RldmljZSAqIG9mOwotCWNoYXIgKnNjcmF0Y2g7Ci0JY29uc3QgY2hhciAqY29tcGF0LCAqY29tcGF0MjsKLQotCWludCBpID0gMDsKLQlpbnQgbGVuZ3RoLCBjcGxlbiwgY3BsZW4yLCBzZWVuID0gMDsKLQotCWlmICghZGV2KQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCW1hY2lvX2RldiA9IHRvX21hY2lvX2RldmljZShkZXYpOwotCWlmICghbWFjaW9fZGV2KQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCW9mID0gJm1hY2lvX2Rldi0+b2ZkZXY7Ci0KLQkvKiBzdHVmZiB3ZSB3YW50IHRvIHBhc3MgdG8gL3NiaW4vaG90cGx1ZyAqLwotCWVudnBbaSsrXSA9IHNjcmF0Y2ggPSBidWZmZXI7Ci0JbGVuZ3RoID0gc2NucHJpbnRmIChzY3JhdGNoLCBidWZmZXJfc2l6ZSwgIk9GX05BTUU9JXMiLCBvZi0+bm9kZS0+bmFtZSk7Ci0JKytsZW5ndGg7Ci0JYnVmZmVyX3NpemUgLT0gbGVuZ3RoOwotCWlmICgoYnVmZmVyX3NpemUgPD0gMCkgfHwgKGkgPj0gbnVtX2VudnApKQotCQlyZXR1cm4gLUVOT01FTTsKLQlzY3JhdGNoICs9IGxlbmd0aDsKLQotCWVudnBbaSsrXSA9IHNjcmF0Y2g7Ci0JbGVuZ3RoID0gc2NucHJpbnRmIChzY3JhdGNoLCBidWZmZXJfc2l6ZSwgIk9GX1RZUEU9JXMiLCBvZi0+bm9kZS0+dHlwZSk7Ci0JKytsZW5ndGg7Ci0JYnVmZmVyX3NpemUgLT0gbGVuZ3RoOwotCWlmICgoYnVmZmVyX3NpemUgPD0gMCkgfHwgKGkgPj0gbnVtX2VudnApKQotCQlyZXR1cm4gLUVOT01FTTsKLQlzY3JhdGNoICs9IGxlbmd0aDsKLQotICAgICAgICAvKiBTaW5jZSB0aGUgY29tcGF0aWJsZSBmaWVsZCBjYW4gY29udGFpbiBwcmV0dHkgbXVjaCBhbnl0aGluZwotICAgICAgICAgKiBpdCdzIG5vdCByZWFsbHkgbGVnYWwgdG8gc3BsaXQgaXQgb3V0IHdpdGggY29tbWFzLiBXZSBzcGxpdCBpdAotICAgICAgICAgKiB1cCB1c2luZyBhIG51bWJlciBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgaW5zdGVhZC4gKi8KLQotCWNvbXBhdCA9IGdldF9wcm9wZXJ0eShvZi0+bm9kZSwgImNvbXBhdGlibGUiLCAmY3BsZW4pOwotCWNvbXBhdDIgPSBjb21wYXQ7Ci0JY3BsZW4yPSBjcGxlbjsKLQl3aGlsZSAoY29tcGF0ICYmIGNwbGVuID4gMCkgewotICAgICAgICAgICAgICAgIGVudnBbaSsrXSA9IHNjcmF0Y2g7Ci0JCWxlbmd0aCA9IHNjbnByaW50ZiAoc2NyYXRjaCwgYnVmZmVyX3NpemUsCi0JCSAgICAgICAgICAgICAgICAgICAgICJPRl9DT01QQVRJQkxFXyVkPSVzIiwgc2VlbiwgY29tcGF0KTsKLQkJKytsZW5ndGg7Ci0JCWJ1ZmZlcl9zaXplIC09IGxlbmd0aDsKLQkJaWYgKChidWZmZXJfc2l6ZSA8PSAwKSB8fCAoaSA+PSBudW1fZW52cCkpCi0JCQlyZXR1cm4gLUVOT01FTTsKLQkJc2NyYXRjaCArPSBsZW5ndGg7Ci0JCWxlbmd0aCA9IHN0cmxlbiAoY29tcGF0KSArIDE7Ci0JCWNvbXBhdCArPSBsZW5ndGg7Ci0JCWNwbGVuIC09IGxlbmd0aDsKLQkJc2VlbisrOwotCX0KLQotCWVudnBbaSsrXSA9IHNjcmF0Y2g7Ci0JbGVuZ3RoID0gc2NucHJpbnRmIChzY3JhdGNoLCBidWZmZXJfc2l6ZSwgIk9GX0NPTVBBVElCTEVfTj0lZCIsIHNlZW4pOwotCSsrbGVuZ3RoOwotCWJ1ZmZlcl9zaXplIC09IGxlbmd0aDsKLQlpZiAoKGJ1ZmZlcl9zaXplIDw9IDApIHx8IChpID49IG51bV9lbnZwKSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0Jc2NyYXRjaCArPSBsZW5ndGg7Ci0KLQllbnZwW2krK10gPSBzY3JhdGNoOwotCWxlbmd0aCA9IHNjbnByaW50ZiAoc2NyYXRjaCwgYnVmZmVyX3NpemUsICJNT0RBTElBUz1vZjpOJXNUJXMiLAotCQkJb2YtPm5vZGUtPm5hbWUsIG9mLT5ub2RlLT50eXBlKTsKLQkvKiBvdmVyd3JpdGUgJ1wwJyAqLwotCWJ1ZmZlcl9zaXplIC09IGxlbmd0aDsKLQlpZiAoKGJ1ZmZlcl9zaXplIDw9IDApIHx8IChpID49IG51bV9lbnZwKSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0Jc2NyYXRjaCArPSBsZW5ndGg7Ci0KLQlpZiAoIWNvbXBhdDIpIHsKLQkJY29tcGF0MiA9ICIiOwotCQljcGxlbjIgPSAxOwotCX0KLQl3aGlsZSAoY3BsZW4yID4gMCkgewotCQlsZW5ndGggPSBzbnByaW50ZiAoc2NyYXRjaCwgYnVmZmVyX3NpemUsICJDJXMiLCBjb21wYXQyKTsKLQkJYnVmZmVyX3NpemUgLT0gbGVuZ3RoOwotCQlpZiAoYnVmZmVyX3NpemUgPD0gMCkKLQkJCXJldHVybiAtRU5PTUVNOwotCQlzY3JhdGNoICs9IGxlbmd0aDsKLQkJbGVuZ3RoID0gc3RybGVuIChjb21wYXQyKSArIDE7Ci0JCWNvbXBhdDIgKz0gbGVuZ3RoOwotCQljcGxlbjIgLT0gbGVuZ3RoOwotCX0KLQotCWVudnBbaV0gPSBOVUxMOwotCi0JcmV0dXJuIDA7Ci19Ci0KIGV4dGVybiBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBtYWNpb19kZXZfYXR0cnNbXTsKIAogc3RydWN0IGJ1c190eXBlIG1hY2lvX2J1c190eXBlID0gewogICAgICAgIC5uYW1lCT0gIm1hY2lvIiwKICAgICAgICAubWF0Y2gJPSBtYWNpb19idXNfbWF0Y2gsCi0gICAgICAgLnVldmVudCA9IG1hY2lvX3VldmVudCwKKyAgICAgICAudWV2ZW50ID0gb2ZfZGV2aWNlX3VldmVudCwKICAgICAgICAucHJvYmUJPSBtYWNpb19kZXZpY2VfcHJvYmUsCiAgICAgICAgLnJlbW92ZQk9IG1hY2lvX2RldmljZV9yZW1vdmUsCiAgICAgICAgLnNodXRkb3duID0gbWFjaW9fZGV2aWNlX3NodXRkb3duLApAQCAtNDkxLDcgKzM5NSw3IEBACiAjZW5kaWYKIAkJCU1BWF9OT0RFX05BTUVfU0laRSwgbnAtPm5hbWUpOwogCX0gZWxzZSB7Ci0JCXJlZyA9IGdldF9wcm9wZXJ0eShucCwgInJlZyIsIE5VTEwpOworCQlyZWcgPSBvZl9nZXRfcHJvcGVydHkobnAsICJyZWciLCBOVUxMKTsKIAkJc3ByaW50ZihkZXYtPm9mZGV2LmRldi5idXNfaWQsICIlMWQuJTA4eDolLipzIiwKIAkJCWNoaXAtPmxidXMuaW5kZXgsCiAJCQlyZWcgPyAqcmVnIDogMCwgTUFYX05PREVfTkFNRV9TSVpFLCBucC0+bmFtZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21hY2ludG9zaC9tYWNpb19zeXNmcy5jIGIvZHJpdmVycy9tYWNpbnRvc2gvbWFjaW9fc3lzZnMuYwppbmRleCA4NTY2YmRmLi5jYzgyNjc5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21hY2ludG9zaC9tYWNpb19zeXNmcy5jCisrKyBiL2RyaXZlcnMvbWFjaW50b3NoL21hY2lvX3N5c2ZzLmMKQEAgLTIxLDcgKzIxLDcgQEAKIAlpbnQgbGVuZ3RoID0gMDsKIAogCW9mID0gJnRvX21hY2lvX2RldmljZSAoZGV2KS0+b2ZkZXY7Ci0JY29tcGF0ID0gZ2V0X3Byb3BlcnR5KG9mLT5ub2RlLCAiY29tcGF0aWJsZSIsICZjcGxlbik7CisJY29tcGF0ID0gb2ZfZ2V0X3Byb3BlcnR5KG9mLT5ub2RlLCAiY29tcGF0aWJsZSIsICZjcGxlbik7CiAJaWYgKCFjb21wYXQpIHsKIAkJKmJ1ZiA9ICdcMCc7CiAJCXJldHVybiAwOwpAQCAtNDcsMTggKzQ3LDIwIEBACiAJaW50IGxlbmd0aDsKIAogCW9mID0gJnRvX21hY2lvX2RldmljZSAoZGV2KS0+b2ZkZXY7Ci0JY29tcGF0ID0gZ2V0X3Byb3BlcnR5KG9mLT5ub2RlLCAiY29tcGF0aWJsZSIsICZjcGxlbik7CisJY29tcGF0ID0gb2ZfZ2V0X3Byb3BlcnR5KG9mLT5ub2RlLCAiY29tcGF0aWJsZSIsICZjcGxlbik7CiAJaWYgKCFjb21wYXQpIGNvbXBhdCA9ICIiLCBjcGxlbiA9IDE7CiAJbGVuZ3RoID0gc3ByaW50ZiAoYnVmLCAib2Y6TiVzVCVzIiwgb2YtPm5vZGUtPm5hbWUsIG9mLT5ub2RlLT50eXBlKTsKIAlidWYgKz0gbGVuZ3RoOwogCXdoaWxlIChjcGxlbiA+IDApIHsKIAkJaW50IGw7Ci0JCWxlbmd0aCArPSBzcHJpbnRmIChidWYsICJDJXMiLCBjb21wYXQpOwotCQlidWYgKz0gbGVuZ3RoOworCQlsID0gc3ByaW50ZiAoYnVmLCAiQyVzIiwgY29tcGF0KTsKKwkJbGVuZ3RoICs9IGw7CisJCWJ1ZiArPSBsOwogCQlsID0gc3RybGVuIChjb21wYXQpICsgMTsKIAkJY29tcGF0ICs9IGw7CiAJCWNwbGVuIC09IGw7CiAJfQorCWxlbmd0aCArPSBzcHJpbnRmKGJ1ZiwgIlxuIik7CiAKIAlyZXR1cm4gbGVuZ3RoOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tYWNpbnRvc2gvcmFjay1tZXRlci5jIGIvZHJpdmVycy9tYWNpbnRvc2gvcmFjay1tZXRlci5jCmluZGV4IGY4M2ZhZDIuLjQxNzdmZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWFjaW50b3NoL3JhY2stbWV0ZXIuYworKysgYi9kcml2ZXJzL21hY2ludG9zaC9yYWNrLW1ldGVyLmMKQEAgLTM4Nyw3ICszODcsNyBAQAogCSAgICAgICBpZiAoc3RyY21wKG5wLT5uYW1lLCAibGlnaHRzaG93IikgPT0gMCkKIAkJICAgICAgIGJyZWFrOwogCSAgICAgICBpZiAoKHN0cmNtcChucC0+bmFtZSwgInNvdW5kIikgPT0gMCkgJiYKLQkJICAgZ2V0X3Byb3BlcnR5KG5wLCAidmlydHVhbCIsIE5VTEwpICE9IE5VTEwpCisJCSAgIG9mX2dldF9wcm9wZXJ0eShucCwgInZpcnR1YWwiLCBOVUxMKSAhPSBOVUxMKQogCQkgICAgICAgYnJlYWs7CiAJfQogCWlmIChucCA9PSBOVUxMKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21hY2ludG9zaC9zbXUuYyBiL2RyaXZlcnMvbWFjaW50b3NoL3NtdS5jCmluZGV4IGM5ZjNkYzQuLmE5OGEzMjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWFjaW50b3NoL3NtdS5jCisrKyBiL2RyaXZlcnMvbWFjaW50b3NoL3NtdS5jCkBAIC00OTEsNyArNDkxLDcgQEAKIAkJcHJpbnRrKEtFUk5fRVJSICJTTVU6IENhbid0IGZpbmQgZG9vcmJlbGwgR1BJTyAhXG4iKTsKIAkJZ290byBmYWlsOwogCX0KLQlkYXRhID0gZ2V0X3Byb3BlcnR5KHNtdS0+ZGJfbm9kZSwgInJlZyIsIE5VTEwpOworCWRhdGEgPSBvZl9nZXRfcHJvcGVydHkoc211LT5kYl9ub2RlLCAicmVnIiwgTlVMTCk7CiAJaWYgKGRhdGEgPT0gTlVMTCkgewogCQlvZl9ub2RlX3B1dChzbXUtPmRiX25vZGUpOwogCQlzbXUtPmRiX25vZGUgPSBOVUxMOwpAQCAtNTEyLDcgKzUxMiw3IEBACiAJCXNtdS0+bXNnX25vZGUgPSBvZl9maW5kX25vZGVfYnlfbmFtZShOVUxMLCAic211LWludGVycnVwdCIpOwogCQlpZiAoc211LT5tc2dfbm9kZSA9PSBOVUxMKQogCQkJYnJlYWs7Ci0JCWRhdGEgPSBnZXRfcHJvcGVydHkoc211LT5tc2dfbm9kZSwgInJlZyIsIE5VTEwpOworCQlkYXRhID0gb2ZfZ2V0X3Byb3BlcnR5KHNtdS0+bXNnX25vZGUsICJyZWciLCBOVUxMKTsKIAkJaWYgKGRhdGEgPT0gTlVMTCkgewogCQkJb2Zfbm9kZV9wdXQoc211LT5tc2dfbm9kZSk7CiAJCQlzbXUtPm1zZ19ub2RlID0gTlVMTDsKQEAgLTk1Miw3ICs5NTIsNyBAQAogCXByb3AtPm5hbWUgPSAoKGNoYXIgKilwcm9wKSArIHRsZW4gLSAxODsKIAlzcHJpbnRmKHByb3AtPm5hbWUsICJzZGItcGFydGl0aW9uLSUwMngiLCBpZCk7CiAJcHJvcC0+bGVuZ3RoID0gbGVuOwotCXByb3AtPnZhbHVlID0gKHVuc2lnbmVkIGNoYXIgKiloZHI7CisJcHJvcC0+dmFsdWUgPSBoZHI7CiAJcHJvcC0+bmV4dCA9IE5VTEw7CiAKIAkvKiBSZWFkIHRoZSBkYXRhYmxvY2sgKi8KQEAgLTEwMDQsNyArMTAwNCw3IEBACiAJfSBlbHNlCiAJCW11dGV4X2xvY2soJnNtdV9wYXJ0X2FjY2Vzcyk7CiAKLQlwYXJ0ID0gZ2V0X3Byb3BlcnR5KHNtdS0+b2Zfbm9kZSwgcG5hbWUsIHNpemUpOworCXBhcnQgPSBvZl9nZXRfcHJvcGVydHkoc211LT5vZl9ub2RlLCBwbmFtZSwgc2l6ZSk7CiAJaWYgKHBhcnQgPT0gTlVMTCkgewogCQlEUFJJTlRLKCJ0cnlpbmcgdG8gZXh0cmFjdCBmcm9tIFNNVSAuLi5cbiIpOwogCQlwYXJ0ID0gc211X2NyZWF0ZV9zZGJfcGFydGl0aW9uKGlkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWFjaW50b3NoL3RoZXJtX2FkdDc0NnguYyBiL2RyaXZlcnMvbWFjaW50b3NoL3RoZXJtX2FkdDc0NnguYwppbmRleCBhN2NlNTU5Mi4uMjI4OTAzNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tYWNpbnRvc2gvdGhlcm1fYWR0NzQ2eC5jCisrKyBiL2RyaXZlcnMvbWFjaW50b3NoL3RoZXJtX2FkdDc0NnguYwpAQCAtNTY3LDEzICs1NjcsMTMgQEAKIAllbHNlCiAJCXJldHVybiAtRU5PREVWOwogCi0JcHJvcCA9IGdldF9wcm9wZXJ0eShucCwgImh3c2Vuc29yLXBhcmFtcy12ZXJzaW9uIiwgTlVMTCk7CisJcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShucCwgImh3c2Vuc29yLXBhcmFtcy12ZXJzaW9uIiwgTlVMTCk7CiAJcHJpbnRrKEtFUk5fSU5GTyAiYWR0NzQ2eDogdmVyc2lvbiAlZCAoJXNzdXBwb3J0ZWQpXG4iLCAqcHJvcCwKIAkJCSAoKnByb3AgPT0gMSk/IiI6InVuIik7CiAJaWYgKCpwcm9wICE9IDEpCiAJCXJldHVybiAtRU5PREVWOwogCi0JcHJvcCA9IGdldF9wcm9wZXJ0eShucCwgInJlZyIsIE5VTEwpOworCXByb3AgPSBvZl9nZXRfcHJvcGVydHkobnAsICJyZWciLCBOVUxMKTsKIAlpZiAoIXByb3ApCiAJCXJldHVybiAtRU5PREVWOwogCkBAIC01OTEsOSArNTkxLDkgQEAKIAkJCSAibGltaXRfYWRqdXN0OiAlZCwgZmFuX3NwZWVkOiAlZFxuIiwKIAkJCSB0aGVybV9idXMsIHRoZXJtX2FkZHJlc3MsIGxpbWl0X2FkanVzdCwgZmFuX3NwZWVkKTsKIAotCWlmIChnZXRfcHJvcGVydHkobnAsICJod3NlbnNvci1sb2NhdGlvbiIsIE5VTEwpKSB7CisJaWYgKG9mX2dldF9wcm9wZXJ0eShucCwgImh3c2Vuc29yLWxvY2F0aW9uIiwgTlVMTCkpIHsKIAkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewotCQkJc2Vuc29yX2xvY2F0aW9uW2ldID0gZ2V0X3Byb3BlcnR5KG5wLAorCQkJc2Vuc29yX2xvY2F0aW9uW2ldID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLAogCQkJCQkiaHdzZW5zb3ItbG9jYXRpb24iLCBOVUxMKSArIG9mZnNldDsKIAogCQkJaWYgKHNlbnNvcl9sb2NhdGlvbltpXSA9PSBOVUxMKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tYWNpbnRvc2gvdGhlcm1fcG03Mi5jIGIvZHJpdmVycy9tYWNpbnRvc2gvdGhlcm1fcG03Mi5jCmluZGV4IDJlNGFkNDQuLjc4ZmYxODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWFjaW50b3NoL3RoZXJtX3BtNzIuYworKysgYi9kcml2ZXJzL21hY2ludG9zaC90aGVybV9wbTcyLmMKQEAgLTY3NCw3ICs2NzQsNyBAQAogCQlwcmludGsoS0VSTl9FUlIgInRoZXJtX3BtNzI6IEZhaWxlZCB0byByZXRyaWV2ZSBjcHVpZCBub2RlIGZyb20gZGV2aWNlLXRyZWVcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9Ci0JZGF0YSA9IGdldF9wcm9wZXJ0eShucCwgImNwdWlkIiwgJmxlbik7CisJZGF0YSA9IG9mX2dldF9wcm9wZXJ0eShucCwgImNwdWlkIiwgJmxlbik7CiAJaWYgKGRhdGEgPT0gTlVMTCkgewogCQlwcmludGsoS0VSTl9FUlIgInRoZXJtX3BtNzI6IEZhaWxlZCB0byByZXRyaWV2ZSBjcHVpZCBwcm9wZXJ0eSBmcm9tIGRldmljZS10cmVlXG4iKTsKIAkJb2Zfbm9kZV9wdXQobnApOwpAQCAtMTMzNyw3ICsxMzM3LDcgQEAKIAkgKi8KIAl1MyA9IG9mX2ZpbmRfbm9kZV9ieV9wYXRoKCIvdTNAMCxmODAwMDAwMCIpOwogCWlmICh1MyAhPSBOVUxMKSB7Ci0JCWNvbnN0IHUzMiAqdmVycyA9IGdldF9wcm9wZXJ0eSh1MywgImRldmljZS1yZXYiLCBOVUxMKTsKKwkJY29uc3QgdTMyICp2ZXJzID0gb2ZfZ2V0X3Byb3BlcnR5KHUzLCAiZGV2aWNlLXJldiIsIE5VTEwpOwogCQlpZiAodmVycykKIAkJCWlmICgoKCp2ZXJzKSAmIDB4M2YpIDwgMHgzNCkKIAkJCQl1M2ggPSAwOwpAQCAtMjEyOSw4ICsyMTI5LDggQEAKIAkJCWNvbnRpbnVlOwogCiAJCS8qIExvb2t1cCBmb3IgYSBtYXRjaGluZyBsb2NhdGlvbiAqLwotCQlsb2MgPSBnZXRfcHJvcGVydHkobnAsICJsb2NhdGlvbiIsIE5VTEwpOwotCQlyZWcgPSBnZXRfcHJvcGVydHkobnAsICJyZWciLCBOVUxMKTsKKwkJbG9jID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAibG9jYXRpb24iLCBOVUxMKTsKKwkJcmVnID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAicmVnIiwgTlVMTCk7CiAJCWlmIChsb2MgPT0gTlVMTCB8fCByZWcgPT0gTlVMTCkKIAkJCWNvbnRpbnVlOwogCQlEQkcoIiBtYXRjaGluZyBsb2NhdGlvbjogJXMsIHJlZzogMHglMDh4XG4iLCBsb2MsICpyZWcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tYWNpbnRvc2gvdGhlcm1fd2luZHR1bm5lbC5jIGIvZHJpdmVycy9tYWNpbnRvc2gvdGhlcm1fd2luZHR1bm5lbC5jCmluZGV4IGExZDNhOTguLjM1MjMzZGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWFjaW50b3NoL3RoZXJtX3dpbmR0dW5uZWwuYworKysgYi9kcml2ZXJzL21hY2ludG9zaC90aGVybV93aW5kdHVubmVsLmMKQEAgLTQ5Miw3ICs0OTIsNyBAQAogCiAJaWYoICEobnA9b2ZfZmluZF9ub2RlX2J5X25hbWUoTlVMTCwgInBvd2VyLW1ndCIpKSApCiAJCXJldHVybiAtRU5PREVWOwotCWluZm8gPSBnZXRfcHJvcGVydHkobnAsICJ0aGVybWFsLWluZm8iLCBOVUxMKTsKKwlpbmZvID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAidGhlcm1hbC1pbmZvIiwgTlVMTCk7CiAJb2Zfbm9kZV9wdXQobnApOwogCiAJaWYoICFpbmZvIHx8ICFtYWNoaW5lX2lzX2NvbXBhdGlibGUoIlBvd2VyTWFjMyw2IikgKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tYWNpbnRvc2gvdmlhLWN1ZGEuYyBiL2RyaXZlcnMvbWFjaW50b3NoL3ZpYS1jdWRhLmMKaW5kZXggZDU4ZmNmNi4uNzZkMjE3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tYWNpbnRvc2gvdmlhLWN1ZGEuYworKysgYi9kcml2ZXJzL21hY2ludG9zaC92aWEtY3VkYS5jCkBAIC0xMzEsNyArMTMxLDcgQEAKICAgICBpZiAodmlhcyA9PSAwKQogCXJldHVybiAwOwogCi0gICAgcmVnID0gZ2V0X3Byb3BlcnR5KHZpYXMsICJyZWciLCBOVUxMKTsKKyAgICByZWcgPSBvZl9nZXRfcHJvcGVydHkodmlhcywgInJlZyIsIE5VTEwpOwogICAgIGlmIChyZWcgPT0gTlVMTCkgewogCSAgICBwcmludGsoS0VSTl9FUlIgInZpYS1jdWRhOiBObyBcInJlZ1wiIHByb3BlcnR5ICFcbiIpOwogCSAgICBnb3RvIGZhaWw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21hY2ludG9zaC92aWEtcG11LWxlZC5jIGIvZHJpdmVycy9tYWNpbnRvc2gvdmlhLXBtdS1sZWQuYwppbmRleCAxNzlhZjEwLi5mYzg5YTcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21hY2ludG9zaC92aWEtcG11LWxlZC5jCisrKyBiL2RyaXZlcnMvbWFjaW50b3NoL3ZpYS1wbXUtbGVkLmMKQEAgLTgxLDcgKzgxLDcgQEAKIH07CiAKICNpZmRlZiBDT05GSUdfUE0KLXN0YXRpYyBpbnQgcG11X2xlZF9zbGVlcF9jYWxsKHN0cnVjdCBwbXVfc2xlZXBfbm90aWZpZXIgKnNlbGYsIGludCB3aGVuKQorc3RhdGljIHZvaWQgcG11X2xlZF9zbGVlcF9jYWxsKHN0cnVjdCBwbXVfc2xlZXBfbm90aWZpZXIgKnNlbGYsIGludCB3aGVuKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKQEAgLTk5LDggKzk5LDYgQEAKIAkJYnJlYWs7CiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBtdV9ibGlua19sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gUEJPT0tfU0xFRVBfT0s7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcG11X3NsZWVwX25vdGlmaWVyIHZpYV9wbXVfbGVkX3NsZWVwX25vdGlmID0gewpAQCAtMTIwLDExICsxMTgsMTMgQEAKIAlkdCA9IG9mX2ZpbmRfbm9kZV9ieV9wYXRoKCIvIik7CiAJaWYgKGR0ID09IE5VTEwpCiAJCXJldHVybiAtRU5PREVWOwotCW1vZGVsID0gZ2V0X3Byb3BlcnR5KGR0LCAibW9kZWwiLCBOVUxMKTsKKwltb2RlbCA9IG9mX2dldF9wcm9wZXJ0eShkdCwgIm1vZGVsIiwgTlVMTCk7CiAJaWYgKG1vZGVsID09IE5VTEwpCiAJCXJldHVybiAtRU5PREVWOwogCWlmIChzdHJuY21wKG1vZGVsLCAiUG93ZXJCb29rIiwgc3RybGVuKCJQb3dlckJvb2siKSkgIT0gMCAmJgotCSAgICBzdHJuY21wKG1vZGVsLCAiaUJvb2siLCBzdHJsZW4oImlCb29rIikpICE9IDApIHsKKwkgICAgc3RybmNtcChtb2RlbCwgImlCb29rIiwgc3RybGVuKCJpQm9vayIpKSAhPSAwICYmCisJICAgIHN0cmNtcChtb2RlbCwgIlBvd2VyTWFjNywyIikgIT0gMCAmJgorCSAgICBzdHJjbXAobW9kZWwsICJQb3dlck1hYzcsMyIpICE9IDApIHsKIAkJb2Zfbm9kZV9wdXQoZHQpOwogCQkvKiBpZ25vcmUgKi8KIAkJcmV0dXJuIC1FTk9ERVY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21hY2ludG9zaC92aWEtcG11LmMgYi9kcml2ZXJzL21hY2ludG9zaC92aWEtcG11LmMKaW5kZXggYjYwNzNiZC4uMTcyOWQzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tYWNpbnRvc2gvdmlhLXBtdS5jCisrKyBiL2RyaXZlcnMvbWFjaW50b3NoL3ZpYS1wbXUuYwpAQCAtMjg5LDcgKzI4OSw3IEBACiAJaWYgKHZpYXMgPT0gTlVMTCkKIAkJcmV0dXJuIDA7CiAKLQlyZWcgPSBnZXRfcHJvcGVydHkodmlhcywgInJlZyIsIE5VTEwpOworCXJlZyA9IG9mX2dldF9wcm9wZXJ0eSh2aWFzLCAicmVnIiwgTlVMTCk7CiAJaWYgKHJlZyA9PSBOVUxMKSB7CiAJCXByaW50ayhLRVJOX0VSUiAidmlhLXBtdTogTm8gXCJyZWdcIiBwcm9wZXJ0eSAhXG4iKTsKIAkJZ290byBmYWlsOwpAQCAtMzE5LDEwICszMTksMTMgQEAKIAllbHNlIGlmIChkZXZpY2VfaXNfY29tcGF0aWJsZSh2aWFzLT5wYXJlbnQsICJLZXlsYXJnbyIpCiAJCSB8fCBkZXZpY2VfaXNfY29tcGF0aWJsZSh2aWFzLT5wYXJlbnQsICJLMi1LZXlsYXJnbyIpKSB7CiAJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZ3Bpb3A7CisJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqYWRicDsKIAkJdTY0IGdhZGRyID0gT0ZfQkFEX0FERFI7CiAKIAkJcG11X2tpbmQgPSBQTVVfS0VZTEFSR09fQkFTRUQ7Ci0JCXBtdV9oYXNfYWRiID0gKGZpbmRfdHlwZV9kZXZpY2VzKCJhZGIiKSAhPSBOVUxMKTsKKwkJYWRicCA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKE5VTEwsICJhZGIiKTsKKwkJcG11X2hhc19hZGIgPSAoYWRicCAhPSBOVUxMKTsKKwkJb2Zfbm9kZV9wdXQoYWRicCk7CiAJCXBtdV9pbnRyX21hc2sgPQlQTVVfSU5UX1BDRUpFQ1QgfAogCQkJCVBNVV9JTlRfU05EQlJUIHwKIAkJCQlQTVVfSU5UX0FEQiB8CkBAIC0zMzEsNyArMzM0LDcgQEAKIAkJCiAJCWdwaW9wID0gb2ZfZmluZF9ub2RlX2J5X25hbWUoTlVMTCwgImdwaW8iKTsKIAkJaWYgKGdwaW9wKSB7Ci0JCQlyZWcgPSBnZXRfcHJvcGVydHkoZ3Bpb3AsICJyZWciLCBOVUxMKTsKKwkJCXJlZyA9IG9mX2dldF9wcm9wZXJ0eShncGlvcCwgInJlZyIsIE5VTEwpOwogCQkJaWYgKHJlZykKIAkJCQlnYWRkciA9IG9mX3RyYW5zbGF0ZV9hZGRyZXNzKGdwaW9wLCByZWcpOwogCQkJaWYgKGdhZGRyICE9IE9GX0JBRF9BRERSKQpAQCAtNDg0LDEwICs0ODcsMTEgQEAKIAkJcG11X2JhdHRlcmllc1swXS5mbGFncyB8PSBQTVVfQkFUVF9UWVBFX1NNQVJUOwogCQlwbXVfYmF0dGVyaWVzWzFdLmZsYWdzIHw9IFBNVV9CQVRUX1RZUEVfU01BUlQ7CiAJfSBlbHNlIHsKLQkJc3RydWN0IGRldmljZV9ub2RlKiBwcmltID0gZmluZF9kZXZpY2VzKCJwb3dlci1tZ3QiKTsKKwkJc3RydWN0IGRldmljZV9ub2RlKiBwcmltID0KKwkJCW9mX2ZpbmRfbm9kZV9ieV9uYW1lKE5VTEwsICJwb3dlci1tZ3QiKTsKIAkJY29uc3QgdTMyICpwcmltX2luZm8gPSBOVUxMOwogCQlpZiAocHJpbSkKLQkJCXByaW1faW5mbyA9IGdldF9wcm9wZXJ0eShwcmltLCAicHJpbS1pbmZvIiwgTlVMTCk7CisJCQlwcmltX2luZm8gPSBvZl9nZXRfcHJvcGVydHkocHJpbSwgInByaW0taW5mbyIsIE5VTEwpOwogCQlpZiAocHJpbV9pbmZvKSB7CiAJCQkvKiBPdGhlciBzdHVmZnMgaGVyZSB5ZXQgdW5rbm93biAqLwogCQkJcG11X2JhdHRlcnlfY291bnQgPSAocHJpbV9pbmZvWzZdID4+IDE2KSAmIDB4ZmY7CkBAIC00OTUsNiArNDk5LDcgQEAKIAkJCWlmIChwbXVfYmF0dGVyeV9jb3VudCA+IDEpCiAJCQkJcG11X2JhdHRlcmllc1sxXS5mbGFncyB8PSBQTVVfQkFUVF9UWVBFX1NNQVJUOwogCQl9CisJCW9mX25vZGVfcHV0KHByaW0pOwogCX0KICNlbmRpZiAvKiBDT05GSUdfUFBDMzIgKi8KIApAQCAtMTc2OSwzNSArMTc3NCwyMSBAQAogI2lmIGRlZmluZWQoQ09ORklHX1BNKSAmJiBkZWZpbmVkKENPTkZJR19QUEMzMikKIAogLyogU2xlZXAgaXMgYnJvYWRjYXN0IGxhc3QtdG8tZmlyc3QgKi8KLXN0YXRpYyBpbnQKLWJyb2FkY2FzdF9zbGVlcChpbnQgd2hlbiwgaW50IGZhbGxiYWNrKQorc3RhdGljIHZvaWQgYnJvYWRjYXN0X3NsZWVwKGludCB3aGVuKQogewotCWludCByZXQgPSBQQk9PS19TTEVFUF9PSzsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OwogCXN0cnVjdCBwbXVfc2xlZXBfbm90aWZpZXIgKm5vdGlmaWVyOwogCiAJZm9yIChsaXN0ID0gc2xlZXBfbm90aWZpZXJzLnByZXY7IGxpc3QgIT0gJnNsZWVwX25vdGlmaWVyczsKIAkgICAgIGxpc3QgPSBsaXN0LT5wcmV2KSB7CiAJCW5vdGlmaWVyID0gbGlzdF9lbnRyeShsaXN0LCBzdHJ1Y3QgcG11X3NsZWVwX25vdGlmaWVyLCBsaXN0KTsKLQkJcmV0ID0gbm90aWZpZXItPm5vdGlmaWVyX2NhbGwobm90aWZpZXIsIHdoZW4pOwotCQlpZiAocmV0ICE9IFBCT09LX1NMRUVQX09LKSB7Ci0JCQlwcmludGsoS0VSTl9ERUJVRyAic2xlZXAgJWQgcmVqZWN0ZWQgYnkgJXAgKCVwKVxuIiwKLQkJCSAgICAgICB3aGVuLCBub3RpZmllciwgbm90aWZpZXItPm5vdGlmaWVyX2NhbGwpOwotCQkJZm9yICg7IGxpc3QgIT0gJnNsZWVwX25vdGlmaWVyczsgbGlzdCA9IGxpc3QtPm5leHQpIHsKLQkJCQlub3RpZmllciA9IGxpc3RfZW50cnkobGlzdCwgc3RydWN0IHBtdV9zbGVlcF9ub3RpZmllciwgbGlzdCk7Ci0JCQkJbm90aWZpZXItPm5vdGlmaWVyX2NhbGwobm90aWZpZXIsIGZhbGxiYWNrKTsKLQkJCX0KLQkJCXJldHVybiByZXQ7Ci0JCX0KKwkJbm90aWZpZXItPm5vdGlmaWVyX2NhbGwobm90aWZpZXIsIHdoZW4pOwogCX0KLQlyZXR1cm4gcmV0OwogfQogCiAvKiBXYWtlIGlzIGJyb2FkY2FzdCBmaXJzdC10by1sYXN0ICovCi1zdGF0aWMgaW50Ci1icm9hZGNhc3Rfd2FrZSh2b2lkKQorc3RhdGljIHZvaWQgYnJvYWRjYXN0X3dha2Uodm9pZCkKIHsKLQlpbnQgcmV0ID0gUEJPT0tfU0xFRVBfT0s7CiAJc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKIAlzdHJ1Y3QgcG11X3NsZWVwX25vdGlmaWVyICpub3RpZmllcjsKIApAQCAtMTgwNiw3ICsxNzk3LDYgQEAKIAkJbm90aWZpZXIgPSBsaXN0X2VudHJ5KGxpc3QsIHN0cnVjdCBwbXVfc2xlZXBfbm90aWZpZXIsIGxpc3QpOwogCQlub3RpZmllci0+bm90aWZpZXJfY2FsbChub3RpZmllciwgUEJPT0tfV0FLRSk7CiAJfQotCXJldHVybiByZXQ7CiB9CiAKIC8qCkBAIC0yMDEzLDEyICsyMDAzLDggQEAKIAogCXBtX3ByZXBhcmVfY29uc29sZSgpOwogCQotCS8qIE5vdGlmeSBvbGQtc3R5bGUgZGV2aWNlIGRyaXZlcnMgJiB1c2VybGFuZCAqLwotCXJldCA9IGJyb2FkY2FzdF9zbGVlcChQQk9PS19TTEVFUF9SRVFVRVNULCBQQk9PS19TTEVFUF9SRUpFQ1QpOwotCWlmIChyZXQgIT0gUEJPT0tfU0xFRVBfT0spIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJTbGVlcCByZWplY3RlZCBieSBkcml2ZXJzXG4iKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9CisJLyogTm90aWZ5IG9sZC1zdHlsZSBkZXZpY2UgZHJpdmVycyAqLworCWJyb2FkY2FzdF9zbGVlcChQQk9PS19TTEVFUF9SRVFVRVNUKTsKIAogCS8qIFN5bmMgdGhlIGRpc2tzLiAqLwogCS8qIFhYWCBJdCB3b3VsZCBiZSBuaWNlIHRvIGhhdmUgc29tZSB3YXkgdG8gZW5zdXJlIHRoYXQKQEAgLTIwMjgsMTIgKzIwMTQsNyBAQAogCSAqLwogCXN5c19zeW5jKCk7CiAKLQkvKiBTbGVlcCBjYW4gZmFpbCBub3cuIE1heSBub3QgYmUgdmVyeSByb2J1c3QgYnV0IHVzZWZ1bCBmb3IgZGVidWdnaW5nICovCi0JcmV0ID0gYnJvYWRjYXN0X3NsZWVwKFBCT09LX1NMRUVQX05PVywgUEJPT0tfV0FLRSk7Ci0JaWYgKHJldCAhPSBQQk9PS19TTEVFUF9PSykgewotCQlwcmludGsoS0VSTl9FUlIgIkRyaXZlciBzbGVlcCBmYWlsZWRcbiIpOwotCQlyZXR1cm4gLUVCVVNZOwotCX0KKwlicm9hZGNhc3Rfc2xlZXAoUEJPT0tfU0xFRVBfTk9XKTsKIAogCS8qIFNlbmQgc3VzcGVuZCBjYWxsIHRvIGRldmljZXMsIGhvbGQgdGhlIGRldmljZSBjb3JlJ3MgZHBtX3NlbSAqLwogCXJldCA9IGRldmljZV9zdXNwZW5kKFBNU0dfU1VTUEVORCk7CkBAIC0yMTU0LDcgKzIxMzUsNyBAQAogCWludCByZXQ7CiAJc3RydWN0IHBjaV9kZXYgKmdyYWNrbGU7CiAKLQlncmFja2xlID0gcGNpX2ZpbmRfc2xvdCgwLCAwKTsKKwlncmFja2xlID0gcGNpX2dldF9idXNfYW5kX3Nsb3QoMCwgMCk7CiAJaWYgKCFncmFja2xlKQogCQlyZXR1cm4gLUVOT0RFVjsKIApAQCAtMjIwMiw2ICsyMTgzLDggQEAKIAlwbWNyMSAmPSB+KEdSQUNLTEVfUE18R1JBQ0tMRV9ET1pFfEdSQUNLTEVfU0xFRVB8R1JBQ0tMRV9OQVApOyAKIAlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZ3JhY2tsZSwgMHg3MCwgcG1jcjEpOwogCisJcGNpX2Rldl9wdXQoZ3JhY2tsZSk7CisKIAkvKiBNYWtlIHN1cmUgdGhlIFBNVSBpcyBpZGxlICovCiAJcG1hY19jYWxsX2ZlYXR1cmUoUE1BQ19GVFJfU0xFRVBfU1RBVEUsTlVMTCwwLDApOwogCXJlc3RvcmVfdmlhX3N0YXRlKCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21hY2ludG9zaC93aW5kZmFybV9sbTc1X3NlbnNvci5jIGIvZHJpdmVycy9tYWNpbnRvc2gvd2luZGZhcm1fbG03NV9zZW5zb3IuYwppbmRleCAzZjc5NjdmLi5hYjRkMWI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21hY2ludG9zaC93aW5kZmFybV9sbTc1X3NlbnNvci5jCisrKyBiL2RyaXZlcnMvbWFjaW50b3NoL3dpbmRmYXJtX2xtNzVfc2Vuc29yLmMKQEAgLTE3Niw3ICsxNzYsNyBAQAogCWZvciAoZGV2ID0gTlVMTDsKIAkgICAgIChkZXYgPSBvZl9nZXRfbmV4dF9jaGlsZChidXNub2RlLCBkZXYpKSAhPSBOVUxMOykgewogCQljb25zdCBjaGFyICpsb2MgPQotCQkJZ2V0X3Byb3BlcnR5KGRldiwgImh3c2Vuc29yLWxvY2F0aW9uIiwgTlVMTCk7CisJCQlvZl9nZXRfcHJvcGVydHkoZGV2LCAiaHdzZW5zb3ItbG9jYXRpb24iLCBOVUxMKTsKIAkJdTggYWRkcjsKIAogCQkvKiBXZSBtdXN0IHJlLW1hdGNoIHRoZSBhZGFwdGVyIGluIG9yZGVyIHRvIHByb3Blcmx5IGNoZWNrCmRpZmYgLS1naXQgYS9kcml2ZXJzL21hY2ludG9zaC93aW5kZmFybV9tYXg2NjkwX3NlbnNvci5jIGIvZHJpdmVycy9tYWNpbnRvc2gvd2luZGZhcm1fbWF4NjY5MF9zZW5zb3IuYwppbmRleCBlYWUxMTg5Li5lYWE3NGFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21hY2ludG9zaC93aW5kZmFybV9tYXg2NjkwX3NlbnNvci5jCisrKyBiL2RyaXZlcnMvbWFjaW50b3NoL3dpbmRmYXJtX21heDY2OTBfc2Vuc29yLmMKQEAgLTEzNCw3ICsxMzQsNyBAQAogCQlpZiAoIWRldmljZV9pc19jb21wYXRpYmxlKGRldiwgIm1heDY2OTAiKSkKIAkJCWNvbnRpbnVlOwogCQlhZGRyID0gcG1hY19pMmNfZ2V0X2Rldl9hZGRyKGRldik7Ci0JCWxvYyA9IGdldF9wcm9wZXJ0eShkZXYsICJod3NlbnNvci1sb2NhdGlvbiIsIE5VTEwpOworCQlsb2MgPSBvZl9nZXRfcHJvcGVydHkoZGV2LCAiaHdzZW5zb3ItbG9jYXRpb24iLCBOVUxMKTsKIAkJaWYgKGxvYyA9PSBOVUxMIHx8IGFkZHIgPT0gMCkKIAkJCWNvbnRpbnVlOwogCQlwcmludGsoImZvdW5kIG1heDY2OTAsIGxvYz0lcyBhZGRyPTB4JTAyeFxuIiwgbG9jLCBhZGRyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWFjaW50b3NoL3dpbmRmYXJtX3NtdV9jb250cm9scy5jIGIvZHJpdmVycy9tYWNpbnRvc2gvd2luZGZhcm1fc211X2NvbnRyb2xzLmMKaW5kZXggMzFiNzUwZC4uZmYzOThhZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tYWNpbnRvc2gvd2luZGZhcm1fc211X2NvbnRyb2xzLmMKKysrIGIvZHJpdmVycy9tYWNpbnRvc2gvd2luZGZhcm1fc211X2NvbnRyb2xzLmMKQEAgLTE2Nyw3ICsxNjcsNyBAQAogCWlmIChmY3QgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAJZmN0LT5jdHJsLm9wcyA9ICZzbXVfZmFuX29wczsKLQlsID0gZ2V0X3Byb3BlcnR5KG5vZGUsICJsb2NhdGlvbiIsIE5VTEwpOworCWwgPSBvZl9nZXRfcHJvcGVydHkobm9kZSwgImxvY2F0aW9uIiwgTlVMTCk7CiAJaWYgKGwgPT0gTlVMTCkKIAkJZ290byBmYWlsOwogCkBAIC0yMjQsMTcgKzIyNCwxNyBAQAogCQlnb3RvIGZhaWw7CiAKIAkvKiBHZXQgbWluICYgbWF4IHZhbHVlcyovCi0JdiA9IGdldF9wcm9wZXJ0eShub2RlLCAibWluLXZhbHVlIiwgTlVMTCk7CisJdiA9IG9mX2dldF9wcm9wZXJ0eShub2RlLCAibWluLXZhbHVlIiwgTlVMTCk7CiAJaWYgKHYgPT0gTlVMTCkKIAkJZ290byBmYWlsOwogCWZjdC0+bWluID0gKnY7Ci0JdiA9IGdldF9wcm9wZXJ0eShub2RlLCAibWF4LXZhbHVlIiwgTlVMTCk7CisJdiA9IG9mX2dldF9wcm9wZXJ0eShub2RlLCAibWF4LXZhbHVlIiwgTlVMTCk7CiAJaWYgKHYgPT0gTlVMTCkKIAkJZ290byBmYWlsOwogCWZjdC0+bWF4ID0gKnY7CiAKIAkvKiBHZXQgInJlZyIgdmFsdWUgKi8KLQlyZWcgPSBnZXRfcHJvcGVydHkobm9kZSwgInJlZyIsIE5VTEwpOworCXJlZyA9IG9mX2dldF9wcm9wZXJ0eShub2RlLCAicmVnIiwgTlVMTCk7CiAJaWYgKHJlZyA9PSBOVUxMKQogCQlnb3RvIGZhaWw7CiAJZmN0LT5yZWcgPSAqcmVnOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tYWNpbnRvc2gvd2luZGZhcm1fc211X3NhdC5jIGIvZHJpdmVycy9tYWNpbnRvc2gvd2luZGZhcm1fc211X3NhdC5jCmluZGV4IDgzZjc5ZGUuLjlhNmMyY2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWFjaW50b3NoL3dpbmRmYXJtX3NtdV9zYXQuYworKysgYi9kcml2ZXJzL21hY2ludG9zaC93aW5kZmFybV9zbXVfc2F0LmMKQEAgLTI0MSw3ICsyNDEsNyBAQAogCWNoYXIgKm5hbWU7CiAJaW50IHZzZW5zWzJdLCBpc2Vuc1syXTsKIAotCXJlZyA9IGdldF9wcm9wZXJ0eShkZXYsICJyZWciLCBOVUxMKTsKKwlyZWcgPSBvZl9nZXRfcHJvcGVydHkoZGV2LCAicmVnIiwgTlVMTCk7CiAJaWYgKHJlZyA9PSBOVUxMKQogCQlyZXR1cm47CiAJYWRkciA9ICpyZWc7CkBAIC0yNjgsOSArMjY4LDkgQEAKIAlpc2Vuc1swXSA9IGlzZW5zWzFdID0gLTE7CiAJY2hpbGQgPSBOVUxMOwogCXdoaWxlICgoY2hpbGQgPSBvZl9nZXRfbmV4dF9jaGlsZChkZXYsIGNoaWxkKSkgIT0gTlVMTCkgewotCQlyZWcgPSBnZXRfcHJvcGVydHkoY2hpbGQsICJyZWciLCBOVUxMKTsKLQkJdHlwZSA9IGdldF9wcm9wZXJ0eShjaGlsZCwgImRldmljZV90eXBlIiwgTlVMTCk7Ci0JCWxvYyA9IGdldF9wcm9wZXJ0eShjaGlsZCwgImxvY2F0aW9uIiwgTlVMTCk7CisJCXJlZyA9IG9mX2dldF9wcm9wZXJ0eShjaGlsZCwgInJlZyIsIE5VTEwpOworCQl0eXBlID0gb2ZfZ2V0X3Byb3BlcnR5KGNoaWxkLCAiZGV2aWNlX3R5cGUiLCBOVUxMKTsKKwkJbG9jID0gb2ZfZ2V0X3Byb3BlcnR5KGNoaWxkLCAibG9jYXRpb24iLCBOVUxMKTsKIAkJaWYgKHJlZyA9PSBOVUxMIHx8IGxvYyA9PSBOVUxMKQogCQkJY29udGludWU7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWFjaW50b3NoL3dpbmRmYXJtX3NtdV9zZW5zb3JzLmMgYi9kcml2ZXJzL21hY2ludG9zaC93aW5kZmFybV9zbXVfc2Vuc29ycy5jCmluZGV4IDAxYjRjNTAuLjljNTY3YjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWFjaW50b3NoL3dpbmRmYXJtX3NtdV9zZW5zb3JzLmMKKysrIGIvZHJpdmVycy9tYWNpbnRvc2gvd2luZGZhcm1fc211X3NlbnNvcnMuYwpAQCAtMjA0LDggKzIwNCw4IEBACiAJYWRzID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNtdV9hZF9zZW5zb3IpLCBHRlBfS0VSTkVMKTsKIAlpZiAoYWRzID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwotCWMgPSBnZXRfcHJvcGVydHkobm9kZSwgImRldmljZV90eXBlIiwgTlVMTCk7Ci0JbCA9IGdldF9wcm9wZXJ0eShub2RlLCAibG9jYXRpb24iLCBOVUxMKTsKKwljID0gb2ZfZ2V0X3Byb3BlcnR5KG5vZGUsICJkZXZpY2VfdHlwZSIsIE5VTEwpOworCWwgPSBvZl9nZXRfcHJvcGVydHkobm9kZSwgImxvY2F0aW9uIiwgTlVMTCk7CiAJaWYgKGMgPT0gTlVMTCB8fCBsID09IE5VTEwpCiAJCWdvdG8gZmFpbDsKIApAQCAtMjU1LDcgKzI1NSw3IEBACiAJfSBlbHNlCiAJCWdvdG8gZmFpbDsKIAotCXYgPSBnZXRfcHJvcGVydHkobm9kZSwgInJlZyIsIE5VTEwpOworCXYgPSBvZl9nZXRfcHJvcGVydHkobm9kZSwgInJlZyIsIE5VTEwpOwogCWlmICh2ID09IE5VTEwpCiAJCWdvdG8gZmFpbDsKIAlhZHMtPnJlZyA9ICp2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1jcnlwdC5jIGIvZHJpdmVycy9tZC9kbS1jcnlwdC5jCmluZGV4IDRjMjQ3MWUuLmQ4MTIxMjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0tY3J5cHQuYworKysgYi9kcml2ZXJzL21kL2RtLWNyeXB0LmMKQEAgLTg2Nyw3ICs4NjcsNyBAQAogCQlnb3RvIGJhZDQ7CiAJfQogCi0JY2MtPmJzID0gYmlvc2V0X2NyZWF0ZShNSU5fSU9TLCBNSU5fSU9TLCA0KTsKKwljYy0+YnMgPSBiaW9zZXRfY3JlYXRlKE1JTl9JT1MsIE1JTl9JT1MpOwogCWlmICghY2MtPmJzKSB7CiAJCXRpLT5lcnJvciA9ICJDYW5ub3QgYWxsb2NhdGUgY3J5cHQgYmlvc2V0IjsKIAkJZ290byBiYWRfYnM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLWlvLmMgYi9kcml2ZXJzL21kL2RtLWlvLmMKaW5kZXggNGViNzNkMy4uOGJkYzhhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1pby5jCisrKyBiL2RyaXZlcnMvbWQvZG0taW8uYwpAQCAtNjAsNyArNjAsNyBAQAogCQlpZiAoIV9pb19wb29sKQogCQkJcmV0dXJuIC1FTk9NRU07CiAKLQkJX2Jpb3MgPSBiaW9zZXRfY3JlYXRlKDE2LCAxNiwgNCk7CisJCV9iaW9zID0gYmlvc2V0X2NyZWF0ZSgxNiwgMTYpOwogCQlpZiAoIV9iaW9zKSB7CiAJCQltZW1wb29sX2Rlc3Ryb3koX2lvX3Bvb2wpOwogCQkJX2lvX3Bvb2wgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS5jIGIvZHJpdmVycy9tZC9kbS5jCmluZGV4IDM2NjhiMTcuLjExYTk4ZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0uYworKysgYi9kcml2ZXJzL21kL2RtLmMKQEAgLTEwMTIsNyArMTAxMiw3IEBACiAJaWYgKCFtZC0+dGlvX3Bvb2wpCiAJCWdvdG8gYmFkMzsKIAotCW1kLT5icyA9IGJpb3NldF9jcmVhdGUoMTYsIDE2LCA0KTsKKwltZC0+YnMgPSBiaW9zZXRfY3JlYXRlKDE2LCAxNik7CiAJaWYgKCFtZC0+YnMpCiAJCWdvdG8gYmFkX25vX2Jpb3NldDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9jb21tb24vaXIta2V5bWFwcy5jIGIvZHJpdmVycy9tZWRpYS9jb21tb24vaXIta2V5bWFwcy5jCmluZGV4IDAzYjQ3YTIuLmNiZDExODQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL2lyLWtleW1hcHMuYworKysgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi9pci1rZXltYXBzLmMKQEAgLTY2Nyw3ICs2NjcsNyBAQAogCVsgMHgxZiBdID0gS0VZX0wsCiAJWyAweDJiIF0gPSBLRVlfSSwKIAotCVsgMHgyZCBdID0gS0VZX1pPT00sCisJWyAweDJkIF0gPSBLRVlfU0NSRUVOLAogCVsgMHgxZSBdID0gS0VZX1pPT00sCiAJWyAweDFiIF0gPSBLRVlfVk9MVU1FVVAsCiAJWyAweDBmIF0gPSBLRVlfVk9MVU1FRE9XTiwKQEAgLTY4MiwxMiArNjgyLDEyIEBACiAKIAlbIDB4M2YgXSA9IEtFWV9VUCwKIAlbIDB4M2UgXSA9IEtFWV9ET1dOLAotCVsgMHgxYSBdID0gS0VZX1BBVVNFLAorCVsgMHgxYSBdID0gS0VZX0VOVEVSLAogCiAJWyAweDFkIF0gPSBLRVlfTUVOVSwKLQlbIDB4MTkgXSA9IEtFWV9QTEFZLAotCVsgMHgxNiBdID0gS0VZX1JFV0lORCwKLQlbIDB4MTMgXSA9IEtFWV9GT1JXQVJELAorCVsgMHgxOSBdID0gS0VZX0FHQUlOLAorCVsgMHgxNiBdID0gS0VZX1BSRVZJT1VTU09ORywKKwlbIDB4MTMgXSA9IEtFWV9ORVhUU09ORywKIAlbIDB4MTUgXSA9IEtFWV9QQVVTRSwKIAlbIDB4MGUgXSA9IEtFWV9SRVdJTkQsCiAJWyAweDBkIF0gPSBLRVlfUExBWSwKQEAgLTE3MzksNyArMTczOSw3IEBACiAKIEVYUE9SVF9TWU1CT0xfR1BMKGlyX2NvZGVzX2VuY29yZV9lbmx0dik7CiAKLS8qIGZvciB0aGUgVGVjaG5vdHJlbmQgMTUwMCBidW5kbGVkIHJlbW90ZTogKi8KKy8qIGZvciB0aGUgVGVjaG5vdHJlbmQgMTUwMCBidW5kbGVkIHJlbW90ZXMgKGdyZXkgYW5kIGJsYWNrKTogKi8KIElSX0tFWVRBQl9UWVBFIGlyX2NvZGVzX3R0XzE1MDBbSVJfS0VZVEFCX1NJWkVdID0gewogCVsgMHgwMSBdID0gS0VZX1BPV0VSLAogCVsgMHgwMiBdID0gS0VZX1NIVUZGTEUsCS8qID8gZG91YmxlLWFycm93IGtleSAqLwpAQCAtMTc3NCw2ICsxNzc0LDEyIEBACiAJWyAweDI1IF0gPSBLRVlfVk9MVU1FVVAsCiAJWyAweDI2IF0gPSBLRVlfVk9MVU1FRE9XTiwKIAlbIDB4MjcgXSA9IEtFWV9TRVRVUCwKKwlbIDB4M2EgXSA9IEtFWV9SRUNPUkQsIC8qIHRoZXNlIGtleXMgYXJlIG9ubHkgaW4gdGhlIGJsYWNrIHJlbW90ZSAqLworCVsgMHgzYiBdID0gS0VZX1BMQVksCisJWyAweDNjIF0gPSBLRVlfU1RPUCwKKwlbIDB4M2QgXSA9IEtFWV9SRVdJTkQsCisJWyAweDNlIF0gPSBLRVlfUEFVU0UsCisJWyAweDNmIF0gPSBLRVlfRk9SV0FSRCwKIH07CiAKIEVYUE9SVF9TWU1CT0xfR1BMKGlyX2NvZGVzX3R0XzE1MDApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9jb21tb24vc2FhNzE0Nl92aWRlby5jIGIvZHJpdmVycy9tZWRpYS9jb21tb24vc2FhNzE0Nl92aWRlby5jCmluZGV4IDdlMGNlZGM1Li5lM2QwNGE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2NvbW1vbi9zYWE3MTQ2X3ZpZGVvLmMKKysrIGIvZHJpdmVycy9tZWRpYS9jb21tb24vc2FhNzE0Nl92aWRlby5jCkBAIC0xNDI4LDYgKzE0MjgsNyBAQAogewogCXN0cnVjdCBzYWE3MTQ2X2ZoICpmaCA9IChzdHJ1Y3Qgc2FhNzE0Nl9maCAqKWZpbGUtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3Qgc2FhNzE0Nl92diAqdnYgPSBkZXYtPnZ2X2RhdGE7CisJc3RydWN0IHZpZGVvYnVmX3F1ZXVlICpxID0gJmZoLT52aWRlb19xOwogCWludCBlcnI7CiAKIAlpZiAoSVNfQ0FQVFVSRV9BQ1RJVkUoZmgpICE9IDApIHsKQEAgLTE0MzYsNiArMTQzNywxMSBAQAogCQllcnIgPSBzYWE3MTQ2X3N0b3BfcHJldmlldyhmaCk7CiAJfQogCisJLy8gcmVsZWFzZSBhbGwgY2FwdHVyZSBidWZmZXJzCisJbXV0ZXhfbG9jaygmcS0+bG9jayk7CisJdmlkZW9idWZfcmVhZF9zdG9wKHEpOworCW11dGV4X3VubG9jaygmcS0+bG9jayk7CisKIAkvKiBobW0sIHdoeSBpcyB0aGlzIGZ1bmN0aW9uIGRlY2xhcmVkIHZvaWQ/ICovCiAJLyogcmV0dXJuIGVyciAqLwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9LY29uZmlnCmluZGV4IDc5ODc1OTUuLmEwZGNkNTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvS2NvbmZpZworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL0tjb25maWcKQEAgLTksNyArOSw2IEBACiAJc2VsZWN0IERWQl9TVFYwMjk3IGlmICFEVkJfRkVfQ1VTVE9NSVNFCiAJc2VsZWN0IERWQl9CQ00zNTEwIGlmICFEVkJfRkVfQ1VTVE9NSVNFCiAJc2VsZWN0IERWQl9MR0RUMzMwWCBpZiAhRFZCX0ZFX0NVU1RPTUlTRQotCXNlbGVjdCBEVkJfVFVORVJfTEdIMDZYRiBpZiAhRFZCX0ZFX0NVU1RPTUlTRQogCWhlbHAKIAkgIFN1cHBvcnQgZm9yIHRoZSBkaWdpdGFsIFRWIHJlY2VpdmVyIGNoaXAgbWFkZSBieSBCMkMyIEluYy4gaW5jbHVkZWQgaW4KIAkgIFRlY2huaXNhdHMgUENJIGNhcmRzIGFuZCBVU0IgYm94ZXMuCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AtZmUtdHVuZXIuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcC1mZS10dW5lci5jCmluZGV4IDc1MmNmNzkuLmIwMmMyZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcC1mZS10dW5lci5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcC1mZS10dW5lci5jCkBAIC0xNCw3ICsxNCw2IEBACiAjaW5jbHVkZSAic3R2MDI5Ny5oIgogI2luY2x1ZGUgIm10MzEyLmgiCiAjaW5jbHVkZSAibGdkdDMzMHguaCIKLSNpbmNsdWRlICJsZ2gwNnhmLmgiCiAjaW5jbHVkZSAiZHZiLXBsbC5oIgogCiAvKiBsbmIgY29udHJvbCAqLwpAQCAtNTA3LDcgKzUwNiw3IEBACiAJLyogdHJ5IHRoZSBhaXIgYXRzYyAzbmQgZ2VuZXJhdGlvbiAobGdkdDMzMDMpICovCiAJaWYgKChmYy0+ZmUgPSBkdmJfYXR0YWNoKGxnZHQzMzB4X2F0dGFjaCwgJmFpcjJwY19hdHNjX2hkNTAwMF9jb25maWcsICZmYy0+aTJjX2FkYXApKSAhPSBOVUxMKSB7CiAJCWZjLT5kZXZfdHlwZSAgICAgICAgICA9IEZDX0FJUl9BVFNDMzsKLQkJZHZiX2F0dGFjaChsZ2gwNnhmX2F0dGFjaCwgZmMtPmZlLCAmZmMtPmkyY19hZGFwKTsKKwkJZHZiX2F0dGFjaChkdmJfcGxsX2F0dGFjaCwgZmMtPmZlLCAweDYxLCAmZmMtPmkyY19hZGFwLCAmZHZiX3BsbF9sZ190ZHZzX2gwNnhmKTsKIAkJaW5mbygiZm91bmQgdGhlIGxnZHQzMzAzIGF0IGkyYyBhZGRyZXNzOiAweCUwMngiLGFpcjJwY19hdHNjX2hkNTAwMF9jb25maWcuZGVtb2RfYWRkcmVzcyk7CiAJfSBlbHNlCiAJLyogdHJ5IHRoZSBhaXIgYXRzYyAxbmQgZ2VuZXJhdGlvbiAoYmNtMzUxMCkvcGFuYXNvbmljIGN0MTBzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AtcGNpLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AtcGNpLmMKaW5kZXggNmUxNjY4MC4uMDFhZjRkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLXBjaS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcC1wY2kuYwpAQCAtMTI3LDEwICsxMjcsMTEgQEAKIHsKIAlzdHJ1Y3QgZmxleGNvcF9wY2kgKmZjX3BjaSA9IGRldl9pZDsKIAlzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjID0gZmNfcGNpLT5mY19kZXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlmbGV4Y29wX2liaV92YWx1ZSB2OwogCWlycXJldHVybl90IHJldCA9IElSUV9IQU5ETEVEOwogCi0Jc3Bpbl9sb2NrX2lycSgmZmNfcGNpLT5pcnFfbG9jayk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmZjX3BjaS0+aXJxX2xvY2ssZmxhZ3MpOwogCiAJdiA9IGZjLT5yZWFkX2liaV9yZWcoZmMsaXJxXzIwYyk7CiAKQEAgLTE5NCw3ICsxOTUsNyBAQAogCQlyZXQgPSBJUlFfTk9ORTsKIAl9CiAKLQlzcGluX3VubG9ja19pcnEoJmZjX3BjaS0+aXJxX2xvY2spOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZjX3BjaS0+aXJxX2xvY2ssZmxhZ3MpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTI5MywxMiArMjk0LDEyIEBACiAJfQogCiAJcGNpX3NldF9kcnZkYXRhKGZjX3BjaS0+cGRldiwgZmNfcGNpKTsKLQorCXNwaW5fbG9ja19pbml0KCZmY19wY2ktPmlycV9sb2NrKTsKIAlpZiAoKHJldCA9IHJlcXVlc3RfaXJxKGZjX3BjaS0+cGRldi0+aXJxLCBmbGV4Y29wX3BjaV9pc3IsCiAJCQkJCUlSUUZfU0hBUkVELCBEUklWRVJfTkFNRSwgZmNfcGNpKSkgIT0gMCkKIAkJZ290byBlcnJfcGNpX2lvdW5tYXA7CiAKLQlzcGluX2xvY2tfaW5pdCgmZmNfcGNpLT5pcnFfbG9jayk7CisKIAogCWZjX3BjaS0+aW5pdF9zdGF0ZSB8PSBGQ19QQ0lfSU5JVDsKIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L0tjb25maWcKaW5kZXggZGQ2NmI2MC4uY2ZkNmZiNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvS2NvbmZpZworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9LY29uZmlnCkBAIC03LDcgKzcsNyBAQAogCXNlbGVjdCBEVkJfQ1gyNDExMCBpZiAhRFZCX0ZFX0NVU1RPTUlTRQogCXNlbGVjdCBEVkJfT1I1MTIxMSBpZiAhRFZCX0ZFX0NVU1RPTUlTRQogCXNlbGVjdCBEVkJfTEdEVDMzMFggaWYgIURWQl9GRV9DVVNUT01JU0UKLQlzZWxlY3QgRFZCX1RVTkVSX0xHSDA2WEYgaWYgIURWQl9GRV9DVVNUT01JU0UKKwlzZWxlY3QgRFZCX1BMTAogCXNlbGVjdCBEVkJfWkwxMDM1MyBpZiAhRFZCX0ZFX0NVU1RPTUlTRQogCXNlbGVjdCBGV19MT0FERVIKIAloZWxwCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9idDg3OC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvYnQ4NzguYwppbmRleCA4M2IwOTBlLi5kZjcyYjRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9idDg3OC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2J0ODc4LmMKQEAgLTM5Myw5ICszOTMsNyBAQAogCXsgMHhkYjExMThhYywgQlRUVl9CT0FSRF9EVklDT19EVkJUX0xJVEUsCQkiVWx0cmF2aWV3IERWQi1UIExpdGUiIH0sCiAJeyAweGQ1MDAxOGFjLCBCVFRWX0JPQVJEX0RWSUNPX0ZVU0lPTkhEVFZfNV9MSVRFLAkiRFZpQ08gRnVzaW9uSERUViA1IExpdGUiIH0sCiAJeyAweDIwMDA3MDYzLCBCVFRWX0JPQVJEX1BDX0hEVFYsCQkJInBjSERUViBIRC0yMDAwIFRWIiB9LAotCXsgMHgwMDI2MTgyMiwgQlRUVl9CT0FSRF9UV0lOSEFOX0RTVCwJCQkiRE5UViBMaXZlISBNaW5pIiB9LAotCi0JeyAwLCAtMSwgTlVMTCB9CisJeyAweDAwMjYxODIyLCBCVFRWX0JPQVJEX1RXSU5IQU5fRFNULAkJCSJETlRWIExpdmUhIE1pbmkiIH0KIH07CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvZHZiLWJ0OHh4LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9kdmItYnQ4eHguYwppbmRleCA1OGY2OWY2Li40ZjFjMDliIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9kdmItYnQ4eHguYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9kdmItYnQ4eHguYwpAQCAtNjEwLDcgKzYxMCw4IEBACiAJCWxnZHQzMzB4X3Jlc2V0KGNhcmQpOwogCQljYXJkLT5mZSA9IGR2Yl9hdHRhY2gobGdkdDMzMHhfYXR0YWNoLCAmdGR2c190dWE2MDM0X2NvbmZpZywgY2FyZC0+aTJjX2FkYXB0ZXIpOwogCQlpZiAoY2FyZC0+ZmUgIT0gTlVMTCkgewotCQkJZHZiX2F0dGFjaChsZ2gwNnhmX2F0dGFjaCwgY2FyZC0+ZmUsIGNhcmQtPmkyY19hZGFwdGVyKTsKKwkJCWR2Yl9hdHRhY2goZHZiX3BsbF9hdHRhY2gsIGNhcmQtPmZlLCAweDYxLAorCQkJCSAgIGNhcmQtPmkyY19hZGFwdGVyLCAmZHZiX3BsbF9sZ190ZHZzX2gwNnhmKTsKIAkJCWRwcmludGsgKCJkdmJfYnQ4eHg6IGxnZHQzMzB4IGRldGVjdGVkXG4iKTsKIAkJfQogCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2R2Yi1idDh4eC5oIGIvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvZHZiLWJ0OHh4LmgKaW5kZXggZTc1ZjQxNy4uNDM2ODgwZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvZHZiLWJ0OHh4LmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvZHZiLWJ0OHh4LmgKQEAgLTM3LDggKzM3LDggQEAKICNpbmNsdWRlICJjeDI0MTEwLmgiCiAjaW5jbHVkZSAib3I1MTIxMS5oIgogI2luY2x1ZGUgImxnZHQzMzB4LmgiCi0jaW5jbHVkZSAibGdoMDZ4Zi5oIgogI2luY2x1ZGUgInpsMTAzNTMuaCIKKyNpbmNsdWRlICJkdmItcGxsLmgiCiAKIHN0cnVjdCBkdmJfYnQ4eHhfY2FyZCB7CiAJc3RydWN0IG11dGV4IGxvY2s7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kbXhkZXYuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2RteGRldi5jCmluZGV4IGE1YzBlMWEuLjI3NWRmNjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2RteGRldi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2RteGRldi5jCkBAIC0xMzIsNiArMTMyLDExIEBACiAJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmZG14ZGV2LT5tdXRleCkpCiAJCXJldHVybiAtRVJFU1RBUlRTWVM7CiAKKwlpZiAoZG14ZGV2LT5leGl0KSB7CisJCW11dGV4X3VubG9jaygmZG14ZGV2LT5tdXRleCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwogCWlmICgoZmlsZS0+Zl9mbGFncyAmIE9fQUNDTU9ERSkgPT0gT19SRFdSKSB7CiAJCWlmICghKGRteGRldi0+Y2FwYWJpbGl0aWVzICYgRE1YREVWX0NBUF9EVVBMRVgpKSB7CiAJCQltdXRleF91bmxvY2soJmRteGRldi0+bXV0ZXgpOwpAQCAtMTcxLDYgKzE3Niw3IEBACiAJCWRteGRldi0+ZGVtdXgtPmRpc2Nvbm5lY3RfZnJvbnRlbmQoZG14ZGV2LT5kZW11eCk7CiAJCWRteGRldi0+ZGVtdXgtPmNvbm5lY3RfZnJvbnRlbmQoZG14ZGV2LT5kZW11eCwgZnJvbnQpOwogCX0KKwlkdmJkZXYtPnVzZXJzKys7CiAJbXV0ZXhfdW5sb2NrKCZkbXhkZXYtPm11dGV4KTsKIAlyZXR1cm4gMDsKIH0KQEAgLTE5OCw3ICsyMDQsMTYgQEAKIAkJCXZmcmVlKG1lbSk7CiAJCX0KIAl9Ci0JbXV0ZXhfdW5sb2NrKCZkbXhkZXYtPm11dGV4KTsKKwkvKiBUT0RPICovCisJZHZiZGV2LT51c2Vycy0tOworCWlmKGR2YmRldi0+dXNlcnM9PS0xICYmIGRteGRldi0+ZXhpdD09MSkgeworCQlmb3BzX3B1dChmaWxlLT5mX29wKTsKKwkJZmlsZS0+Zl9vcCA9IE5VTEw7CisJCW11dGV4X3VubG9jaygmZG14ZGV2LT5tdXRleCk7CisJCXdha2VfdXAoJmR2YmRldi0+d2FpdF9xdWV1ZSk7CisJfSBlbHNlCisJCW11dGV4X3VubG9jaygmZG14ZGV2LT5tdXRleCk7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjE1LDYgKzIzMCwxMSBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZkbXhkZXYtPm11dGV4KSkKIAkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKworCWlmIChkbXhkZXYtPmV4aXQpIHsKKwkJbXV0ZXhfdW5sb2NrKCZkbXhkZXYtPm11dGV4KTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQogCXJldCA9IGRteGRldi0+ZGVtdXgtPndyaXRlKGRteGRldi0+ZGVtdXgsIGJ1ZiwgY291bnQpOwogCW11dGV4X3VubG9jaygmZG14ZGV2LT5tdXRleCk7CiAJcmV0dXJuIHJldDsKQEAgLTIyNyw2ICsyNDcsMTEgQEAKIAlzdHJ1Y3QgZG14ZGV2ICpkbXhkZXYgPSBkdmJkZXYtPnByaXY7CiAJaW50IHJldDsKIAorCWlmIChkbXhkZXYtPmV4aXQpIHsKKwkJbXV0ZXhfdW5sb2NrKCZkbXhkZXYtPm11dGV4KTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCiAJLy9tdXRleF9sb2NrKCZkbXhkZXYtPm11dGV4KTsKIAlyZXQgPSBkdmJfZG14ZGV2X2J1ZmZlcl9yZWFkKCZkbXhkZXYtPmR2cl9idWZmZXIsCiAJCQkJICAgICBmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSywKQEAgLTY2NSw2ICs2OTAsOCBAQAogCWRteGRldmZpbHRlci0+ZmVlZC50cyA9IE5VTEw7CiAJaW5pdF90aW1lcigmZG14ZGV2ZmlsdGVyLT50aW1lcik7CiAKKwlkdmJkZXYtPnVzZXJzKys7CisKIAltdXRleF91bmxvY2soJmRteGRldi0+bXV0ZXgpOwogCXJldHVybiAwOwogfQpAQCAtOTQzLDcgKzk3MCwyMSBAQAogCXN0cnVjdCBkbXhkZXZfZmlsdGVyICpkbXhkZXZmaWx0ZXIgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IGRteGRldiAqZG14ZGV2ID0gZG14ZGV2ZmlsdGVyLT5kZXY7CiAKLQlyZXR1cm4gZHZiX2RteGRldl9maWx0ZXJfZnJlZShkbXhkZXYsIGRteGRldmZpbHRlcik7CisJaW50IHJldDsKKworCXJldCA9IGR2Yl9kbXhkZXZfZmlsdGVyX2ZyZWUoZG14ZGV2LCBkbXhkZXZmaWx0ZXIpOworCisJbXV0ZXhfbG9jaygmZG14ZGV2LT5tdXRleCk7CisJZG14ZGV2LT5kdmJkZXYtPnVzZXJzLS07CisJaWYoZG14ZGV2LT5kdmJkZXYtPnVzZXJzPT0xICYmIGRteGRldi0+ZXhpdD09MSkgeworCQlmb3BzX3B1dChmaWxlLT5mX29wKTsKKwkJZmlsZS0+Zl9vcCA9IE5VTEw7CisJCW11dGV4X3VubG9jaygmZG14ZGV2LT5tdXRleCk7CisJCXdha2VfdXAoJmRteGRldi0+ZHZiZGV2LT53YWl0X3F1ZXVlKTsKKwl9IGVsc2UKKwkJbXV0ZXhfdW5sb2NrKCZkbXhkZXYtPm11dGV4KTsKKworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGR2Yl9kZW11eF9mb3BzID0gewpAQCAtMTAyNyw2ICsxMDY4LDcgQEAKIHN0YXRpYyBzdHJ1Y3QgZHZiX2RldmljZSBkdmJkZXZfZHZyID0gewogCS5wcml2ID0gTlVMTCwKIAkucmVhZGVycyA9IDEsCisJLnVzZXJzID0gMSwKIAkuZm9wcyA9ICZkdmJfZHZyX2ZvcHMKIH07CiAKQEAgLTEwNjQsNiArMTEwNiwxNiBAQAogCiB2b2lkIGR2Yl9kbXhkZXZfcmVsZWFzZShzdHJ1Y3QgZG14ZGV2ICpkbXhkZXYpCiB7CisJZG14ZGV2LT5leGl0PTE7CisJaWYgKGRteGRldi0+ZHZiZGV2LT51c2VycyA+IDEpIHsKKwkJd2FpdF9ldmVudChkbXhkZXYtPmR2YmRldi0+d2FpdF9xdWV1ZSwKKwkJCQlkbXhkZXYtPmR2YmRldi0+dXNlcnM9PTEpOworCX0KKwlpZiAoZG14ZGV2LT5kdnJfZHZiZGV2LT51c2VycyA+IDEpIHsKKwkJd2FpdF9ldmVudChkbXhkZXYtPmR2cl9kdmJkZXYtPndhaXRfcXVldWUsCisJCQkJZG14ZGV2LT5kdnJfZHZiZGV2LT51c2Vycz09MSk7CisJfQorCiAJZHZiX3VucmVnaXN0ZXJfZGV2aWNlKGRteGRldi0+ZHZiZGV2KTsKIAlkdmJfdW5yZWdpc3Rlcl9kZXZpY2UoZG14ZGV2LT5kdnJfZHZiZGV2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZG14ZGV2LmggYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kbXhkZXYuaAppbmRleCBkMmJlZTlmLi4yOTc0NmU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kbXhkZXYuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kbXhkZXYuaApAQCAtOTEsNiArOTEsOCBAQAogCiAJaW50IGZpbHRlcm51bTsKIAlpbnQgY2FwYWJpbGl0aWVzOworCisJdW5zaWduZWQgaW50IGV4aXQ6MTsKICNkZWZpbmUgRE1YREVWX0NBUF9EVVBMRVggMQogCXN0cnVjdCBkbXhfZnJvbnRlbmQgKmR2cl9vcmlnX2ZlOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfZnJvbnRlbmQuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9mcm9udGVuZC5jCmluZGV4IGEyMWE4OTQuLmY0ZTRjYTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9mcm9udGVuZC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9mcm9udGVuZC5jCkBAIC02MDYsNiArNjA2LDcgQEAKIAkJcmV0dXJuOwogCiAJa3RocmVhZF9zdG9wKGZlcHJpdi0+dGhyZWFkKTsKKwogCWluaXRfTVVURVggKCZmZXByaXYtPnNlbSk7CiAJZmVwcml2LT5zdGF0ZSA9IEZFU1RBVEVfSURMRTsKIApAQCAtMTAyMyw2ICsxMDI0LDcgQEAKIAlzdHJ1Y3QgZHZiX2RldmljZSAqZHZiZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlID0gZHZiZGV2LT5wcml2OwogCXN0cnVjdCBkdmJfZnJvbnRlbmRfcHJpdmF0ZSAqZmVwcml2ID0gZmUtPmZyb250ZW5kX3ByaXY7CisJaW50IHJldDsKIAogCWRwcmludGsgKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKIApAQCAtMTAzMiw3ICsxMDM0LDE0IEBACiAJaWYgKGZlLT5vcHMudHNfYnVzX2N0cmwpCiAJCWZlLT5vcHMudHNfYnVzX2N0cmwgKGZlLCAwKTsKIAotCXJldHVybiBkdmJfZ2VuZXJpY19yZWxlYXNlIChpbm9kZSwgZmlsZSk7CisJcmV0ID0gZHZiX2dlbmVyaWNfcmVsZWFzZSAoaW5vZGUsIGZpbGUpOworCisJaWYgKGR2YmRldi0+dXNlcnM9PS0xICYmIGZlcHJpdi0+ZXhpdD09MSkgeworCQlmb3BzX3B1dChmaWxlLT5mX29wKTsKKwkJZmlsZS0+Zl9vcCA9IE5VTEw7CisJCXdha2VfdXAoJmR2YmRldi0+d2FpdF9xdWV1ZSk7CisJfQorCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGR2Yl9mcm9udGVuZF9mb3BzID0gewpAQCAtMTA5Miw4ICsxMTAxLDE1IEBACiAJZHByaW50ayAoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOwogCiAJbXV0ZXhfbG9jaygmZnJvbnRlbmRfbXV0ZXgpOwotCWR2Yl91bnJlZ2lzdGVyX2RldmljZSAoZmVwcml2LT5kdmJkZXYpOwogCWR2Yl9mcm9udGVuZF9zdG9wIChmZSk7CisJbXV0ZXhfdW5sb2NrKCZmcm9udGVuZF9tdXRleCk7CisKKwlpZiAoZmVwcml2LT5kdmJkZXYtPnVzZXJzIDwgLTEpCisJCXdhaXRfZXZlbnQoZmVwcml2LT5kdmJkZXYtPndhaXRfcXVldWUsCisJCQkJZmVwcml2LT5kdmJkZXYtPnVzZXJzPT0tMSk7CisKKwltdXRleF9sb2NrKCZmcm9udGVuZF9tdXRleCk7CisJZHZiX3VucmVnaXN0ZXJfZGV2aWNlIChmZXByaXYtPmR2YmRldik7CiAKIAkvKiBmZSBpcyBpbnZhbGlkIG5vdyAqLwogCWtmcmVlKGZlcHJpdik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfbmV0LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfbmV0LmMKaW5kZXggNzZlOWMzNi4uNGViZjMzYTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9uZXQuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfbmV0LmMKQEAgLTE3NCw3ICsxNzQsNyBAQAogCXN0cnVjdCBldGhoZHIgKmV0aDsKIAl1bnNpZ25lZCBjaGFyICpyYXdwOwogCi0Jc2tiLT5tYWMucmF3PXNrYi0+ZGF0YTsKKwlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwogCXNrYl9wdWxsKHNrYixkZXYtPmhhcmRfaGVhZGVyX2xlbik7CiAJZXRoID0gZXRoX2hkcihza2IpOwogCkBAIC02MDAsNiArNjAwLDcgQEAKIAkJCS8qIENoZWNrIENSQzMyLCB3ZSd2ZSBnb3QgaXQgaW4gb3VyIHNrYiBhbHJlYWR5LiAqLwogCQkJdW5zaWduZWQgc2hvcnQgdWxlbiA9IGh0b25zKHByaXYtPnVsZV9zbmR1X2xlbik7CiAJCQl1bnNpZ25lZCBzaG9ydCB1dHlwZSA9IGh0b25zKHByaXYtPnVsZV9zbmR1X3R5cGUpOworCQkJY29uc3QgdTggKnRhaWw7CiAJCQlzdHJ1Y3Qga3ZlYyBpb3ZbM10gPSB7CiAJCQkJeyAmdWxlbiwgc2l6ZW9mIHVsZW4gfSwKIAkJCQl7ICZ1dHlwZSwgc2l6ZW9mIHV0eXBlIH0sCkBAIC02MTMsMTAgKzYxNCwxMSBAQAogCQkJfQogCiAJCQl1bGVfY3JjID0gaW92X2NyYzMyKHVsZV9jcmMsIGlvdiwgMyk7Ci0JCQlleHBlY3RlZF9jcmMgPSAqKCh1OCAqKXByaXYtPnVsZV9za2ItPnRhaWwgLSA0KSA8PCAyNCB8Ci0JCQkJICAgICAgICooKHU4ICopcHJpdi0+dWxlX3NrYi0+dGFpbCAtIDMpIDw8IDE2IHwKLQkJCQkgICAgICAgKigodTggKilwcml2LT51bGVfc2tiLT50YWlsIC0gMikgPDwgOCB8Ci0JCQkJICAgICAgICooKHU4ICopcHJpdi0+dWxlX3NrYi0+dGFpbCAtIDEpOworCQkJdGFpbCA9IHNrYl90YWlsX3BvaW50ZXIocHJpdi0+dWxlX3NrYik7CisJCQlleHBlY3RlZF9jcmMgPSAqKHRhaWwgLSA0KSA8PCAyNCB8CisJCQkJICAgICAgICoodGFpbCAtIDMpIDw8IDE2IHwKKwkJCQkgICAgICAgKih0YWlsIC0gMikgPDwgOCB8CisJCQkJICAgICAgICoodGFpbCAtIDEpOwogCQkJaWYgKHVsZV9jcmMgIT0gZXhwZWN0ZWRfY3JjKSB7CiAJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJWx1OiBDUkMzMiBjaGVjayBGQUlMRUQ6ICUwOHggLyAlMDh4LCBTTkRVIGxlbiAlZCB0eXBlICUjeCwgdHNfcmVtYWluICVkLCBuZXh0IDI6ICV4LlxuIiwKIAkJCQkgICAgICAgcHJpdi0+dHNfY291bnQsIHVsZV9jcmMsIGV4cGVjdGVkX2NyYywgcHJpdi0+dWxlX3NuZHVfbGVuLCBwcml2LT51bGVfc25kdV90eXBlLCB0c19yZW1haW4sIHRzX3JlbWFpbiA+IDIgPyAqKHVuc2lnbmVkIHNob3J0ICopZnJvbV93aGVyZSA6IDApOwpAQCAtNjk1LDcgKzY5Nyw5IEBACiAJCQkJCX0KIAkJCQkJZWxzZQogCQkJCQl7Ci0JCQkJCQltZW1jcHkoZGVzdF9hZGRyLCAgcHJpdi0+dWxlX3NrYi0+ZGF0YSwgRVRIX0FMRU4pOworCQkJCQkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShwcml2LT51bGVfc2tiLAorCQkJCQkJCSAgICAgIGRlc3RfYWRkciwKKwkJCQkJCQkgICAgICBFVEhfQUxFTik7CiAJCQkJCQlza2JfcHVsbChwcml2LT51bGVfc2tiLCBFVEhfQUxFTik7CiAJCQkJCX0KIAkJCQl9CkBAIC0xNDM1LDExICsxNDM5LDM2IEBACiAJcmV0dXJuIGR2Yl91c2VyY29weShpbm9kZSwgZmlsZSwgY21kLCBhcmcsIGR2Yl9uZXRfZG9faW9jdGwpOwogfQogCitzdGF0aWMgaW50IGR2Yl9uZXRfY2xvc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGR2Yl9kZXZpY2UgKmR2YmRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHZiX25ldCAqZHZibmV0ID0gZHZiZGV2LT5wcml2OworCisJaWYgKCFkdmJkZXYpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKChmaWxlLT5mX2ZsYWdzICYgT19BQ0NNT0RFKSA9PSBPX1JET05MWSkgeworCQlkdmJkZXYtPnJlYWRlcnMrKzsKKwl9IGVsc2UgeworCQlkdmJkZXYtPndyaXRlcnMrKzsKKwl9CisKKwlkdmJkZXYtPnVzZXJzKys7CisKKwlpZihkdmJkZXYtPnVzZXJzID09IDEgJiYgZHZibmV0LT5leGl0PT0xKSB7CisJCWZvcHNfcHV0KGZpbGUtPmZfb3ApOworCQlmaWxlLT5mX29wID0gTlVMTDsKKwkJd2FrZV91cCgmZHZiZGV2LT53YWl0X3F1ZXVlKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKwogc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZHZiX25ldF9mb3BzID0gewogCS5vd25lciA9IFRISVNfTU9EVUxFLAogCS5pb2N0bCA9IGR2Yl9uZXRfaW9jdGwsCiAJLm9wZW4gPQlkdmJfZ2VuZXJpY19vcGVuLAotCS5yZWxlYXNlID0gZHZiX2dlbmVyaWNfcmVsZWFzZSwKKwkucmVsZWFzZSA9IGR2Yl9uZXRfY2xvc2UsCiB9OwogCiBzdGF0aWMgc3RydWN0IGR2Yl9kZXZpY2UgZHZiZGV2X25ldCA9IHsKQEAgLTE0NTQsNiArMTQ4MywxMSBAQAogewogCWludCBpOwogCisJZHZibmV0LT5leGl0ID0gMTsKKwlpZiAoZHZibmV0LT5kdmJkZXYtPnVzZXJzIDwgMSkKKwkJd2FpdF9ldmVudChkdmJuZXQtPmR2YmRldi0+d2FpdF9xdWV1ZSwKKwkJCQlkdmJuZXQtPmR2YmRldi0+dXNlcnM9PTEpOworCiAJZHZiX3VucmVnaXN0ZXJfZGV2aWNlKGR2Ym5ldC0+ZHZiZGV2KTsKIAogCWZvciAoaT0wOyBpPERWQl9ORVRfREVWSUNFU19NQVg7IGkrKykgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX25ldC5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX25ldC5oCmluZGV4IGYxNGU0Y2EuLjNhMzEyNmNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfbmV0LmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX25ldC5oCkBAIC0zNiw2ICszNiw3IEBACiAJc3RydWN0IGR2Yl9kZXZpY2UgKmR2YmRldjsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2aWNlW0RWQl9ORVRfREVWSUNFU19NQVhdOwogCWludCBzdGF0ZVtEVkJfTkVUX0RFVklDRVNfTUFYXTsKKwl1bnNpZ25lZCBpbnQgZXhpdDoxOwogCXN0cnVjdCBkbXhfZGVtdXggKmRlbXV4OwogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiZGV2LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJkZXYuYwppbmRleCAxNGEzNzJhLi5lMjNkOGEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJkZXYuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJkZXYuYwpAQCAtMjMzLDYgKzIzMyw3IEBACiAJZHZiZGV2LT5hZGFwdGVyID0gYWRhcDsKIAlkdmJkZXYtPnByaXYgPSBwcml2OwogCWR2YmRldi0+Zm9wcyA9IGR2YmRldmZvcHM7CisJaW5pdF93YWl0cXVldWVfaGVhZCAoJmR2YmRldi0+d2FpdF9xdWV1ZSk7CiAKIAltZW1jcHkoZHZiZGV2LT5mb3BzLCB0ZW1wbGF0ZS0+Zm9wcywgc2l6ZW9mKHN0cnVjdCBmaWxlX29wZXJhdGlvbnMpKTsKIAlkdmJkZXYtPmZvcHMtPm93bmVyID0gYWRhcC0+bW9kdWxlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiZGV2LmggYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJkZXYuaAppbmRleCA2MjBlNzg4Li42ZGZmMTBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJkZXYuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJkZXYuaApAQCAtNjksNiArNjksNyBAQAogCWludCB3cml0ZXJzOwogCWludCB1c2VyczsKIAorCXdhaXRfcXVldWVfaGVhZF90CSAgd2FpdF9xdWV1ZTsKIAkvKiBkb24ndCByZWFsbHkgbmVlZCB0aG9zZSAhPyAtLSBGSVhNRTogdXNlIHZpZGVvX3VzZXJjb3B5ICAqLwogCWludCAoKmtlcm5lbF9pb2N0bCkoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCiAJCQkgICAgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvS2NvbmZpZwppbmRleCA4MGY2N2E1Li41NDQ4ODczIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9LY29uZmlnCkBAIC0zMyw2ICszMyw3IEBACiBjb25maWcgRFZCX1VTQl9ESUJVU0JfTUIKIAl0cmlzdGF0ZSAiRGlCY29tIFVTQiBEVkItVCBkZXZpY2VzIChiYXNlZCBvbiB0aGUgRGlCMzAwME0tQikgKHNlZSBoZWxwIGZvciBkZXZpY2UgbGlzdCkiCiAJZGVwZW5kcyBvbiBEVkJfVVNCCisJc2VsZWN0IERWQl9QTEwKIAlzZWxlY3QgRFZCX0RJQjMwMDBNQgogCXNlbGVjdCBEVkJfVFVORVJfTVQyMDYwIGlmICFEVkJfRkVfQ1VTVE9NSVNFCiAJaGVscApAQCAtODgsNiArODksNyBAQAogY29uZmlnIERWQl9VU0JfVU1UXzAxMAogCXRyaXN0YXRlICJIYW5mVGVrIFVNVC0wMTAgRFZCLVQgVVNCMi4wIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBEVkJfVVNCCisJc2VsZWN0IERWQl9QTEwKIAlzZWxlY3QgRFZCX0RJQjMwMDBNQwogCXNlbGVjdCBEVkJfVFVORVJfTVQyMDYwIGlmICFEVkJfRkVfQ1VTVE9NSVNFCiAJaGVscApAQCAtOTYsOSArOTgsOSBAQAogY29uZmlnIERWQl9VU0JfQ1hVU0IKIAl0cmlzdGF0ZSAiQ29uZXhhbnQgVVNCMi4wIGh5YnJpZCByZWZlcmVuY2UgZGVzaWduIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBEVkJfVVNCCisJc2VsZWN0IERWQl9QTEwKIAlzZWxlY3QgRFZCX0NYMjI3MDIgaWYgIURWQl9GRV9DVVNUT01JU0UKIAlzZWxlY3QgRFZCX0xHRFQzMzBYIGlmICFEVkJfRkVfQ1VTVE9NSVNFCi0Jc2VsZWN0IERWQl9UVU5FUl9MR0gwNlhGIGlmICFEVkJfRkVfQ1VTVE9NSVNFCiAJc2VsZWN0IERWQl9NVDM1MiBpZiAhRFZCX0ZFX0NVU1RPTUlTRQogCXNlbGVjdCBEVkJfWkwxMDM1MyBpZiAhRFZCX0ZFX0NVU1RPTUlTRQogCWhlbHAKQEAgLTE0MCw2ICsxNDIsNyBAQAogY29uZmlnIERWQl9VU0JfRElHSVRWCiAJdHJpc3RhdGUgIk5lYnVsYSBFbGVjdHJvbmljcyB1RGlnaVRWIERWQi1UIFVTQjIuMCBzdXBwb3J0IgogCWRlcGVuZHMgb24gRFZCX1VTQgorCXNlbGVjdCBEVkJfUExMCiAJc2VsZWN0IERWQl9OWFQ2MDAwIGlmICFEVkJfRkVfQ1VTVE9NSVNFCiAJc2VsZWN0IERWQl9NVDM1MiBpZiAhRFZCX0ZFX0NVU1RPTUlTRQogCWhlbHAKQEAgLTIwOCwzICsyMTEsMTAgQEAKIAkgIFRoZSByZWNlaXZlcnMgYXJlIGFsc28ga25vd24gYXMgRFRUMjAwVSAoWWFrdW1vKSBhbmQgVUIzMDAgKFl1YW4pLgogCiAJICBUaGUgV1QtMjIwVSBhbmQgaXRzIGNsb25lcyBhcmUgcGVuLXNpemVkLgorCitjb25maWcgRFZCX1VTQl9PUEVSQTEKKwl0cmlzdGF0ZSAiT3BlcmExIERWQi1TIFVTQjIuMCByZWNlaXZlciIKKwlkZXBlbmRzIG9uIERWQl9VU0IKKwlzZWxlY3QgRFZCX1NUVjAyOTkgaWYgIURWQl9GRV9DVVNUT01JU0UKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIHN1cHBvcnQgdGhlIE9wZXJhIERWQi1TIFVTQjIuMCByZWNlaXZlci4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL01ha2VmaWxlCmluZGV4IDQwZjI4ZjUuLjk3NmY4NDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9NYWtlZmlsZQpAQCAtNTEsNCArNTEsOCBAQAogZHZiLXVzYi1kaWIwNzAwLW9ianMgPSBkaWIwNzAwX2NvcmUubyBkaWIwNzAwX2RldmljZXMubwogb2JqLSQoQ09ORklHX0RWQl9VU0JfRElCMDcwMCkgKz0gZHZiLXVzYi1kaWIwNzAwLm8KIAorZHZiLXVzYi1vcGVyYS1vYmpzID0gb3BlcmExLm8KK29iai0kKENPTkZJR19EVkJfVVNCX09QRVJBMSkgKz0gZHZiLXVzYi1vcGVyYS5vCisKKwogRVhUUkFfQ0ZMQUdTID0gLUlkcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS8gLUlkcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2F1NjYxMC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hdTY2MTAuYwppbmRleCAwZGM2NmE4Li4xOGUwYjE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2F1NjYxMC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYXU2NjEwLmMKQEAgLTQwLDcgKzQwLDcgQEAKIAl9CiAKIAlyZXQgPSB1c2JfY29udHJvbF9tc2coZC0+dWRldiwgdXNiX3JjdmN0cmxwaXBlKGQtPnVkZXYsIDApLCBvcGVyYXRpb24sCi0JCQkgICAgICBVU0JfVFlQRV9WRU5ET1J8VVNCX0RJUl9JTiwgYWRkciwgaW5kZXgsIHVzYl9idWYsCisJCQkgICAgICBVU0JfVFlQRV9WRU5ET1J8VVNCX0RJUl9JTiwgYWRkciA8PCAxLCBpbmRleCwgdXNiX2J1ZiwKIAkJCSAgICAgIHNpemVvZih1c2JfYnVmKSwgQVU2NjEwX1VTQl9USU1FT1VUKTsKIAogCWlmIChyZXQgPCAwKQpAQCAtMTI0LDcgKzEyNCw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgemwxMDM1M19jb25maWcgYXU2NjEwX3psMTAzNTNfY29uZmlnID0gewotCS5kZW1vZF9hZGRyZXNzID0gMHgxZSwKKwkuZGVtb2RfYWRkcmVzcyA9IDB4MGYsCiAJLm5vX3R1bmVyID0gMSwKIAkucGFyYWxsZWxfdHMgPSAxLAogfTsKQEAgLTE0MCw3ICsxNDAsNyBAQAogfQogCiBzdGF0aWMgc3RydWN0IHF0MTAxMF9jb25maWcgYXU2NjEwX3F0MTAxMF9jb25maWcgPSB7Ci0JLmkyY19hZGRyZXNzID0gMHhjNAorCS5pMmNfYWRkcmVzcyA9IDB4NjIKIH07CiAKIHN0YXRpYyBpbnQgYXU2NjEwX3F0MTAxMF90dW5lcl9hdHRhY2goc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqYWRhcCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvY3h1c2IuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvY3h1c2IuYwppbmRleCAxMjdhOTRiLi5iYWMyYWUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2N4dXNiLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9jeHVzYi5jCkBAIC0yNyw3ICsyNyw2IEBACiAKICNpbmNsdWRlICJjeDIyNzAyLmgiCiAjaW5jbHVkZSAibGdkdDMzMHguaCIKLSNpbmNsdWRlICJsZ2gwNnhmLmgiCiAjaW5jbHVkZSAibXQzNTIuaCIKICNpbmNsdWRlICJtdDM1Ml9wcml2LmgiCiAjaW5jbHVkZSAiemwxMDM1My5oIgpAQCAtMzg4LDcgKzM4Nyw4IEBACiAKIHN0YXRpYyBpbnQgY3h1c2JfbGdoMDY0Zl90dW5lcl9hdHRhY2goc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqYWRhcCkKIHsKLQlkdmJfYXR0YWNoKGxnaDA2eGZfYXR0YWNoLCBhZGFwLT5mZSwgJmFkYXAtPmRldi0+aTJjX2FkYXApOworCWR2Yl9hdHRhY2goZHZiX3BsbF9hdHRhY2gsIGFkYXAtPmZlLCAweDYxLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwKKwkJICAgJmR2Yl9wbGxfbGdfdGR2c19oMDZ4Zik7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGliMDcwMF9jb3JlLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpYjA3MDBfY29yZS5jCmluZGV4IDZhNGQxNTAuLmRkZGYxNjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGliMDcwMF9jb3JlLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWIwNzAwX2NvcmUuYwpAQCAtNTYsMTAgKzU2LDYgQEAKIAlpZiAodHhsZW4gPiAzKQogCQlpbmRleCB8PSB0eFszXTsKIAotCS8qIHRoaW5rIGFib3V0IHN3YXBwaW5nIGhlcmUgKi8KLQl2YWx1ZSA9IGxlMTZfdG9fY3B1KHZhbHVlKTsKLQlpbmRleCA9IGxlMTZfdG9fY3B1KGluZGV4KTsKLQogCXN0YXR1cyA9IHVzYl9jb250cm9sX21zZyhkLT51ZGV2LCB1c2JfcmN2Y3RybHBpcGUoZC0+dWRldiwwKSwgdHhbMF0sCiAJCQlVU0JfVFlQRV9WRU5ET1IgfCBVU0JfRElSX0lOLCB2YWx1ZSwgaW5kZXgsIHJ4LCByeGxlbiwKIAkJCVVTQl9DVFJMX0dFVF9USU1FT1VUKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi1pZHMuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi1pZHMuaAppbmRleCAxNDgzODZhLi45NzcxNWY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2ItaWRzLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLWlkcy5oCkBAIC0xMyw2ICsxMyw3IEBACiAjZGVmaW5lIFVTQl9WSURfQURTVEVDSAkJCQkweDA2ZTEKICNkZWZpbmUgVVNCX1ZJRF9BTENPUl9NSUNSTwkJMHgwNThmCiAjZGVmaW5lIFVTQl9WSURfQU5DSE9SCQkJCTB4MDU0NworI2RlZmluZSBVU0JfVklEX0FOVUJJU19FTEVDVFJPTklDCQkweDEwZmQKICNkZWZpbmUgVVNCX1ZJRF9BVkVSTUVESUEJCQkweDA3Y2EKICNkZWZpbmUgVVNCX1ZJRF9DT01QUk8JCQkJMHgxODViCiAjZGVmaW5lIFVTQl9WSURfQ09NUFJPX1VOSwkJCTB4MTQ1ZgpAQCAtMzEsNiArMzIsNyBAQAogI2RlZmluZSBVU0JfVklEX0xJVEVPTgkJCQkweDA0Y2EKICNkZWZpbmUgVVNCX1ZJRF9NRURJT04JCQkJMHgxNjYwCiAjZGVmaW5lIFVTQl9WSURfTVNJCQkJCTB4MGRiMAorI2RlZmluZSBVU0JfVklEX09QRVJBMQkJCQkweDY5NWMKICNkZWZpbmUgVVNCX1ZJRF9QSU5OQUNMRQkJCTB4MjMwNAogI2RlZmluZSBVU0JfVklEX1ZJU0lPTlBMVVMJCQkweDEzZDMKICNkZWZpbmUgVVNCX1ZJRF9UV0lOSEFOCQkJCTB4MTgyMgpAQCAtMTI3LDYgKzEyOSw3IEBACiAjZGVmaW5lIFVTQl9QSURfS1lFX0RWQl9UX1dBUk0JCQkJMHg3MDFmCiAjZGVmaW5lIFVTQl9QSURfUENUVl8yMDBFCQkJCTB4MDIwZQogI2RlZmluZSBVU0JfUElEX1BDVFZfNDAwRQkJCQkweDAyMGYKKyNkZWZpbmUgVVNCX1BJRF9QQ1RWXzQ1MEUJCQkJMHgwMjIyCiAjZGVmaW5lIFVTQl9QSURfTElURU9OX0RWQl9UX0NPTEQJCQkweGYwMDAKICNkZWZpbmUgVVNCX1BJRF9MSVRFT05fRFZCX1RfV0FSTQkJCTB4ZjAwMQogI2RlZmluZSBVU0JfUElEX0RJR0lWT1hfTUlOSV9TTF9DT0xECQkJMHhlMzYwCkBAIC0xMzksNiArMTQyLDkgQEAKICNkZWZpbmUgVVNCX1BJRF9HRU5QSVhfOFBTS19DT0xECQkJMHgwMjAwCiAjZGVmaW5lIFVTQl9QSURfR0VOUElYXzhQU0tfV0FSTQkJCTB4MDIwMQogI2RlZmluZSBVU0JfUElEX1NJR01BVEVLX0RWQl8xMTAJCQkweDY2MTAKKyNkZWZpbmUgVVNCX1BJRF9NU0lfRElHSV9WT1hfTUlOSV9JSQkJCTB4MTUxMworI2RlZmluZSBVU0JfUElEX09QRVJBMV9DT0xECQkJCTB4MjgzMAorI2RlZmluZSBVU0JfUElEX09QRVJBMV9XQVJNCQkJCTB4MzgyOQogCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9nbDg2MS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9nbDg2MS5jCmluZGV4IGM5ZjM4YTUuLmUwNTg3ZTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZ2w4NjEuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2dsODYxLmMKQEAgLTEyLDcgKzEyLDcgQEAKICNpbmNsdWRlICJxdDEwMTAuaCIKIAogLyogZGVidWcgKi8KLWludCBkdmJfdXNiX2dsODYxX2RlYnVnOworc3RhdGljIGludCBkdmJfdXNiX2dsODYxX2RlYnVnOwogbW9kdWxlX3BhcmFtX25hbWVkKGRlYnVnLGR2Yl91c2JfZ2w4NjFfZGVidWcsIGludCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAic2V0IGRlYnVnZ2luZyBsZXZlbCAoMT1yYyAob3ItYWJsZSkpLiIgRFZCX1VTQl9ERUJVR19TVEFUVVMpOwogCkBAIC0yMCw3ICsyMCw3IEBACiAJCQkgdTggKndidWYsIHUxNiB3bGVuLCB1OCAqcmJ1ZiwgdTE2IHJsZW4pCiB7CiAJdTE2IGluZGV4OwotCXUxNiB2YWx1ZSA9IGFkZHIgPDwgODsKKwl1MTYgdmFsdWUgPSBhZGRyIDw8ICg4ICsgMSk7CiAJaW50IHdvID0gKHJidWYgPT0gTlVMTCB8fCBybGVuID09IDApOyAvKiB3cml0ZS1vbmx5ICovCiAJdTggcmVxLCB0eXBlOwogCkBAIC0xMDEsNyArMTAxLDcgQEAKIH0KIAogc3RhdGljIHN0cnVjdCB6bDEwMzUzX2NvbmZpZyBnbDg2MV96bDEwMzUzX2NvbmZpZyA9IHsKLQkuZGVtb2RfYWRkcmVzcyA9IDB4MWUsCisJLmRlbW9kX2FkZHJlc3MgPSAweDBmLAogCS5ub190dW5lciA9IDEsCiAJLnBhcmFsbGVsX3RzID0gMSwKIH07CkBAIC0xMTcsNyArMTE3LDcgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBxdDEwMTBfY29uZmlnIGdsODYxX3F0MTAxMF9jb25maWcgPSB7Ci0JLmkyY19hZGRyZXNzID0gMHhjNAorCS5pMmNfYWRkcmVzcyA9IDB4NjIKIH07CiAKIHN0YXRpYyBpbnQgZ2w4NjFfdHVuZXJfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmFkYXApCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL205MjB4LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL205MjB4LmMKaW5kZXggZDQ4YjI0ZC4uNDVkN2JjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9tOTIweC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvbTkyMHguYwpAQCAtMTQsNiArMTQsOCBAQAogI2luY2x1ZGUgIm10MzUyLmgiCiAjaW5jbHVkZSAibXQzNTJfcHJpdi5oIgogI2luY2x1ZGUgInF0MTAxMC5oIgorI2luY2x1ZGUgInRkYTEwMDR4LmgiCisjaW5jbHVkZSAidGRhODI3eC5oIgogCiAvKiBkZWJ1ZyAqLwogc3RhdGljIGludCBkdmJfdXNiX205MjB4X2RlYnVnOwpAQCAtNDcsMTEgKzQ5LDE1IEBACiAJcmV0ID0gdXNiX2NvbnRyb2xfbXNnKHVkZXYsIHVzYl9yY3ZjdHJscGlwZSh1ZGV2LCAwKSwKIAkJCSAgICAgIHJlcXVlc3QsIFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9ESVJfSU4sCiAJCQkgICAgICB2YWx1ZSwgaW5kZXgsIGRhdGEsIHNpemUsIDIwMDApOwotCWlmIChyZXQgPCAwKQorCWlmIChyZXQgPCAwKSB7CisJCXByaW50ayhLRVJOX0lORk8gIm05MjB4X3JlYWQgPSBlcnJvcjogJWRcbiIsIHJldCk7CiAJCXJldHVybiByZXQ7CisJfQogCi0JaWYgKHJldCAhPSBzaXplKQorCWlmIChyZXQgIT0gc2l6ZSkgeworCQlkZWJfcmMoIm05MjB4X3JlYWQgPSBubyBkYXRhXG4iKTsKIAkJcmV0dXJuIC1FSU87CisJfQogCiAJcmV0dXJuIDA7CiB9CkBAIC02NCwxOSArNzAsMjIgQEAKIAlyZXQgPSB1c2JfY29udHJvbF9tc2codWRldiwgdXNiX3NuZGN0cmxwaXBlKHVkZXYsIDApLAogCQkJICAgICAgcmVxdWVzdCwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX0RJUl9PVVQsCiAJCQkgICAgICB2YWx1ZSwgaW5kZXgsIE5VTEwsIDAsIDIwMDApOworCiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBtOTIwNl9yY19pbml0KHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2KQorc3RhdGljIGludCBtOTIwNl9pbml0KHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCkKIHsKIAlpbnQgcmV0ID0gMDsKIAogCS8qIFJlbW90ZSBjb250cm9sbGVyIGluaXQuICovCi0JaWYgKChyZXQgPSBtOTIwNl93cml0ZSh1ZGV2LCBNOTIwNl9DT1JFLCAweGE4LCBNOTIwNl9SQ19JTklUMikpICE9IDApCi0JCXJldHVybiByZXQ7CisJaWYgKGQtPnByb3BzLnJjX3F1ZXJ5KSB7CisJCWlmICgocmV0ID0gbTkyMDZfd3JpdGUoZC0+dWRldiwgTTkyMDZfQ09SRSwgMHhhOCwgTTkyMDZfUkNfSU5JVDIpKSAhPSAwKQorCQkJcmV0dXJuIHJldDsKIAotCWlmICgocmV0ID0gbTkyMDZfd3JpdGUodWRldiwgTTkyMDZfQ09SRSwgMHg1MSwgTTkyMDZfUkNfSU5JVDEpKSAhPSAwKQotCQlyZXR1cm4gcmV0OworCQlpZiAoKHJldCA9IG05MjA2X3dyaXRlKGQtPnVkZXYsIE05MjA2X0NPUkUsIDB4NTEsIE05MjA2X1JDX0lOSVQxKSkgIT0gMCkKKwkJCXJldHVybiByZXQ7CisJfQogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTg3LDE2ICs5NiwxNSBAQAogCWludCBpLCByZXQgPSAwOwogCXU4IHJjX3N0YXRlWzJdOwogCi0KIAlpZiAoKHJldCA9IG05MjA2X3JlYWQoZC0+dWRldiwgTTkyMDZfQ09SRSwgMHgwLCBNOTIwNl9SQ19TVEFURSwgcmNfc3RhdGUsIDEpKSAhPSAwKQogCQlnb3RvIHVubG9jazsKIAogCWlmICgocmV0ID0gbTkyMDZfcmVhZChkLT51ZGV2LCBNOTIwNl9DT1JFLCAweDAsIE05MjA2X1JDX0tFWSwgcmNfc3RhdGUgKyAxLCAxKSkgIT0gMCkKIAkJZ290byB1bmxvY2s7CiAKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtZWdhc2t5X3JjX2tleXMpOyBpKyspCi0JCWlmIChtZWdhc2t5X3JjX2tleXNbaV0uZGF0YSA9PSByY19zdGF0ZVsxXSkgewotCQkJKmV2ZW50ID0gbWVnYXNreV9yY19rZXlzW2ldLmV2ZW50OworCWZvciAoaSA9IDA7IGkgPCBkLT5wcm9wcy5yY19rZXlfbWFwX3NpemU7IGkrKykKKwkJaWYgKGQtPnByb3BzLnJjX2tleV9tYXBbaV0uZGF0YSA9PSByY19zdGF0ZVsxXSkgeworCQkJKmV2ZW50ID0gZC0+cHJvcHMucmNfa2V5X21hcFtpXS5ldmVudDsKIAogCQkJc3dpdGNoKHJjX3N0YXRlWzBdKSB7CiAJCQljYXNlIDB4ODA6CkBAIC0xMzcsNTMgKzE0NSw1MSBAQAogCQkJICBpbnQgbnVtKQogewogCXN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCA9IGkyY19nZXRfYWRhcGRhdGEoYWRhcCk7Ci0Jc3RydWN0IG05MjA2X3N0YXRlICptID0gZC0+cHJpdjsKLQlpbnQgaTsKKwlpbnQgaSwgajsKIAlpbnQgcmV0ID0gMDsKIAorCWlmICghbnVtKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmQtPmkyY19tdXRleCkgPCAwKQogCQlyZXR1cm4gLUVBR0FJTjsKIAotCWlmIChudW0gPiAyKQotCQlyZXR1cm4gLUVJTlZBTDsKLQogCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgewotCQlpZiAoKHJldCA9IG05MjA2X3dyaXRlKGQtPnVkZXYsIE05MjA2X0kyQywgbXNnW2ldLmFkZHIsIDB4ODApKSAhPSAwKQorCQlpZiAobXNnW2ldLmZsYWdzICYgKEkyQ19NX05PX1JEX0FDS3xJMkNfTV9JR05PUkVfTkFLfEkyQ19NX1RFTikgfHwKKwkJICAgIG1zZ1tpXS5sZW4gPT0gMCkgeworCQkJLyogRm9yIGEgMCBieXRlIG1lc3NhZ2UsIEkgdGhpbmsgc2VuZGluZyB0aGUgYWRkcmVzcyB0byBpbmRleCAweDgwfDB4NDAKKwkJCSAqIHdvdWxkIGJlIHRoZSBjb3JyZWN0IHRoaW5nIHRvIGRvLiAgSG93ZXZlciwgemVybyBieXRlIG1lc3NhZ2VzIGFyZQorCQkJICogb25seSB1c2VkIGZvciBwcm9iaW5nLCBhbmQgc2luY2Ugd2UgZG9uJ3Qga25vdyBob3cgdG8gZ2V0IHRoZSBzbGF2ZSdzCisJCQkgKiBhY2ssIHdlIGNhbid0IHByb2JlLiAqLworCQkJcmV0ID0gLUVOT1RTVVBQOwogCQkJZ290byB1bmxvY2s7Ci0KLQkJaWYgKChyZXQgPSBtOTIwNl93cml0ZShkLT51ZGV2LCBNOTIwNl9JMkMsIG1zZ1tpXS5idWZbMF0sIDB4MCkpICE9IDApCi0JCQlnb3RvIHVubG9jazsKLQotCQlpZiAoaSArIDEgPCBudW0gJiYgbXNnW2kgKyAxXS5mbGFncyAmIEkyQ19NX1JEKSB7Ci0JCQlpbnQgaTJjX2k7Ci0KLQkJCWZvciAoaTJjX2kgPSAwOyBpMmNfaSA8IE05MjA2X0kyQ19NQVg7IGkyY19pKyspCi0JCQkJaWYgKG1zZ1tpXS5hZGRyID09IG0tPmkyY19yW2kyY19pXS5hZGRyKQotCQkJCQlicmVhazsKLQotCQkJaWYgKGkyY19pID49IE05MjA2X0kyQ19NQVgpIHsKLQkJCQlkZWJfcmMoIk5vIG1hZ2ljIGZvciBpMmMgYWRkciFcbiIpOwotCQkJCXJldCA9IC1FSU5WQUw7CisJCX0KKwkJLyogU2VuZCBTVEFSVCAmIGFkZHJlc3MvUlcgYml0ICovCisJCWlmICghKG1zZ1tpXS5mbGFncyAmIEkyQ19NX05PU1RBUlQpKSB7CisJCQlpZiAoKHJldCA9IG05MjA2X3dyaXRlKGQtPnVkZXYsIE05MjA2X0kyQywgKG1zZ1tpXS5hZGRyPDwxKXwobXNnW2ldLmZsYWdzJkkyQ19NX1JEPzB4MDE6MCksIDB4ODApKSAhPSAwKQogCQkJCWdvdG8gdW5sb2NrOworCQkJLyogU2hvdWxkIGNoZWNrIGZvciBhY2sgaGVyZSwgaWYgd2Uga25ldyBob3cuICovCisJCX0KKwkJaWYgKG1zZ1tpXS5mbGFncyAmIEkyQ19NX1JEKSB7CisJCQlmb3IgKGogPSAwOyBqIDwgbXNnW2ldLmxlbjsgaisrKSB7CisJCQkJLyogTGFzdCBieXRlIG9mIHRyYW5zYWN0aW9uPyBTZW5kIFNUT1AsIG90aGVyd2lzZSBzZW5kIEFDSy4gKi8KKwkJCQlpbnQgc3RvcCA9IChpKzEgPT0gbnVtICYmIGorMSA9PSBtc2dbaV0ubGVuKT8weDQwOjB4MDE7CisJCQkJaWYgKChyZXQgPSBtOTIwNl9yZWFkKGQtPnVkZXYsIE05MjA2X0kyQywgMHgwLCAweDIwfHN0b3AsICZtc2dbaV0uYnVmW2pdLCAxKSkgIT0gMCkKKwkJCQkJZ290byB1bmxvY2s7CiAJCQl9Ci0KLQkJCWlmICgocmV0ID0gbTkyMDZfd3JpdGUoZC0+dWRldiwgTTkyMDZfSTJDLCBtLT5pMmNfcltpMmNfaV0ubWFnaWMsIDB4ODApKSAhPSAwKQotCQkJCWdvdG8gdW5sb2NrOwotCi0JCQlpZiAoKHJldCA9IG05MjA2X3JlYWQoZC0+dWRldiwgTTkyMDZfSTJDLCAweDAsIDB4NjAsIG1zZ1tpICsgMV0uYnVmLCBtc2dbaSArIDFdLmxlbikpICE9IDApCi0JCQkJZ290byB1bmxvY2s7Ci0KLQkJCWkrKzsKIAkJfSBlbHNlIHsKLQkJCWlmIChtc2dbaV0ubGVuICE9IDIpCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJCWlmICgocmV0ID0gbTkyMDZfd3JpdGUoZC0+dWRldiwgTTkyMDZfSTJDLCBtc2dbaV0uYnVmWzFdLCAweDQwKSkgIT0gMCkKLQkJCQlnb3RvIHVubG9jazsKKwkJCWZvciAoaiA9IDA7IGogPCBtc2dbaV0ubGVuOyBqKyspIHsKKwkJCQkvKiBMYXN0IGJ5dGUgb2YgdHJhbnNhY3Rpb24/IFRoZW4gc2VuZCBTVE9QLiAqLworCQkJCWludCBzdG9wID0gKGkrMSA9PSBudW0gJiYgaisxID09IG1zZ1tpXS5sZW4pPzB4NDA6MHgwMDsKKwkJCQlpZiAoKHJldCA9IG05MjA2X3dyaXRlKGQtPnVkZXYsIE05MjA2X0kyQywgbXNnW2ldLmJ1ZltqXSwgc3RvcCkpICE9IDApCisJCQkJCWdvdG8gdW5sb2NrOworCQkJCS8qIFNob3VsZCBjaGVjayBmb3IgYWNrIGhlcmUgdG9vLiAqLworCQkJfQogCQl9CiAJfQotCXJldCA9IGk7Ci0JdW5sb2NrOgorCXJldCA9IG51bTsKKwordW5sb2NrOgogCW11dGV4X3VubG9jaygmZC0+aTJjX211dGV4KTsKIAogCXJldHVybiByZXQ7CkBAIC0zMjQsNiArMzMwLDcgQEAKIAkJCWkgKz0gc2l6ZTsKIAkJfQogCQlpZiAoaSAhPSBmdy0+c2l6ZSkgeworCQkJZGViX3JjKCJiYWQgZmlybXdhcmUgZmlsZSFcbiIpOwogCQkJcmV0ID0gLUVJTlZBTDsKIAkJCWdvdG8gZG9uZTsKIAkJfQpAQCAtMzQyLDEwICszNDksMTAgQEAKIH0KIAogLyogQ2FsbGJhY2tzIGZvciBEVkIgVVNCICovCi1zdGF0aWMgaW50IG1lZ2Fza3lfaWRlbnRpZnlfc3RhdGUoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsCi0JCQkJICBzdHJ1Y3QgZHZiX3VzYl9kZXZpY2VfcHJvcGVydGllcyAqcHJvcHMsCi0JCQkJICBzdHJ1Y3QgZHZiX3VzYl9kZXZpY2VfZGVzY3JpcHRpb24gKipkZXNjLAotCQkJCSAgaW50ICpjb2xkKQorc3RhdGljIGludCBtOTIweF9pZGVudGlmeV9zdGF0ZShzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwKKwkJCQlzdHJ1Y3QgZHZiX3VzYl9kZXZpY2VfcHJvcGVydGllcyAqcHJvcHMsCisJCQkJc3RydWN0IGR2Yl91c2JfZGV2aWNlX2Rlc2NyaXB0aW9uICoqZGVzYywKKwkJCQlpbnQgKmNvbGQpCiB7CiAJc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqYWx0OwogCkBAIC0zODEsMjAgKzM4OCwxNSBAQAogfQogCiBzdGF0aWMgc3RydWN0IG10MzUyX2NvbmZpZyBtZWdhc2t5X210MzUyX2NvbmZpZyA9IHsKLQkuZGVtb2RfYWRkcmVzcyA9IDB4MWUsCisJLmRlbW9kX2FkZHJlc3MgPSAweDBmLAogCS5ub190dW5lciA9IDEsCiAJLmRlbW9kX2luaXQgPSBtZWdhc2t5X210MzUyX2RlbW9kX2luaXQsCiB9OwogCiBzdGF0aWMgaW50IG1lZ2Fza3lfbXQzNTJfZnJvbnRlbmRfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmFkYXApCiB7Ci0Jc3RydWN0IG05MjA2X3N0YXRlICptID0gYWRhcC0+ZGV2LT5wcml2OwotCiAJZGViX3JjKCJtZWdhc2t5X2Zyb250ZW5kX2F0dGFjaCFcbiIpOwogCi0JbS0+aTJjX3JbTTkyMDZfSTJDX0RFTU9EXS5hZGRyID0gbWVnYXNreV9tdDM1Ml9jb25maWcuZGVtb2RfYWRkcmVzczsKLQltLT5pMmNfcltNOTIwNl9JMkNfREVNT0RdLm1hZ2ljID0gMHgxZjsKLQogCWlmICgoYWRhcC0+ZmUgPSBkdmJfYXR0YWNoKG10MzUyX2F0dGFjaCwgJm1lZ2Fza3lfbXQzNTJfY29uZmlnLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCkpID09IE5VTEwpCiAJCXJldHVybiAtRUlPOwogCkBAIC00MDIsMTYgKzQwNCwxMSBAQAogfQogCiBzdGF0aWMgc3RydWN0IHF0MTAxMF9jb25maWcgbWVnYXNreV9xdDEwMTBfY29uZmlnID0gewotCS5pMmNfYWRkcmVzcyA9IDB4YzQKKwkuaTJjX2FkZHJlc3MgPSAweDYyCiB9OwogCiBzdGF0aWMgaW50IG1lZ2Fza3lfcXQxMDEwX3R1bmVyX2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwKQogewotCXN0cnVjdCBtOTIwNl9zdGF0ZSAqbSA9IGFkYXAtPmRldi0+cHJpdjsKLQotCW0tPmkyY19yW005MjA2X0kyQ19UVU5FUl0uYWRkciA9IG1lZ2Fza3lfcXQxMDEwX2NvbmZpZy5pMmNfYWRkcmVzczsKLQltLT5pMmNfcltNOTIwNl9JMkNfVFVORVJdLm1hZ2ljID0gMHhjNTsKLQogCWlmIChkdmJfYXR0YWNoKHF0MTAxMF9hdHRhY2gsIGFkYXAtPmZlLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwKIAkJICAgICAgICZtZWdhc2t5X3F0MTAxMF9jb25maWcpID09IE5VTEwpCiAJCXJldHVybiAtRU5PREVWOwpAQCAtNDE5LDggKzQxNiw0MCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgc3RydWN0IHRkYTEwMDR4X2NvbmZpZyBkaWdpdm94X3RkYTEwMDQ2X2NvbmZpZyA9IHsKKwkuZGVtb2RfYWRkcmVzcyA9IDB4MDgsCisJLmludmVydCA9IDAsCisJLmludmVydF9vY2xrID0gMCwKKwkudHNfbW9kZSA9IFREQTEwMDQ2X1RTX1NFUklBTCwKKwkueHRhbF9mcmVxID0gVERBMTAwNDZfWFRBTF8xNk0sCisJLmlmX2ZyZXEgPSBUREExMDA0Nl9GUkVRXzA0NSwKKwkuYWdjX2NvbmZpZyA9IFREQTEwMDQ2X0FHQ19UREE4MjdYLAorCS5ncGlvX2NvbmZpZyA9IFREQTEwMDQ2X0dQVFJJLAorCS5yZXF1ZXN0X2Zpcm13YXJlID0gTlVMTCwKK307CisKK3N0YXRpYyBpbnQgZGlnaXZveF90ZGExMDA0Nl9mcm9udGVuZF9hdHRhY2goc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqYWRhcCkKK3sKKwlkZWJfcmMoImRpZ2l2b3hfdGRhMTAwNDZfZnJvbnRlbmRfYXR0YWNoIVxuIik7CisKKwlpZiAoKGFkYXAtPmZlID0gZHZiX2F0dGFjaCh0ZGExMDA0Nl9hdHRhY2gsICZkaWdpdm94X3RkYTEwMDQ2X2NvbmZpZywKKwkJCQkgICAmYWRhcC0+ZGV2LT5pMmNfYWRhcCkpID09IE5VTEwpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGlnaXZveF90ZGE4Mjc1X3R1bmVyX2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwKQoreworCWlmIChkdmJfYXR0YWNoKHRkYTgyN3hfYXR0YWNoLCBhZGFwLT5mZSwgMHg2MCwgJmFkYXAtPmRldi0+aTJjX2FkYXAsCisJCSAgICAgICBOVUxMKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlyZXR1cm4gMDsKK30KKwogLyogRFZCIFVTQiBEcml2ZXIgc3R1ZmYgKi8KIHN0YXRpYyBzdHJ1Y3QgZHZiX3VzYl9kZXZpY2VfcHJvcGVydGllcyBtZWdhc2t5X3Byb3BlcnRpZXM7CitzdGF0aWMgc3RydWN0IGR2Yl91c2JfZGV2aWNlX3Byb3BlcnRpZXMgZGlnaXZveF9taW5pX2lpX3Byb3BlcnRpZXM7CiAKIHN0YXRpYyBpbnQgbTkyMHhfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCiAJCSAgICAgICBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCkBAIC00MjksMzAgKzQ1OCwzNiBAQAogCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmFsdDsKIAlpbnQgcmV0OwogCi0JaWYgKChyZXQgPSBkdmJfdXNiX2RldmljZV9pbml0KGludGYsICZtZWdhc2t5X3Byb3BlcnRpZXMsIFRISVNfTU9EVUxFLCAmZCkpID09IDApIHsKLQkJZGViX3JjKCJwcm9iZWQhXG4iKTsKKwlkZWJfcmMoIlByb2JlZCFcbiIpOwogCi0JCWFsdCA9IHVzYl9hbHRudW1fdG9fYWx0c2V0dGluZyhpbnRmLCAxKTsKLQkJaWYgKGFsdCA9PSBOVUxMKSB7Ci0JCQlkZWJfcmMoIm5vdCBhbHQgZm91bmQhXG4iKTsKLQkJCXJldHVybiAtRU5PREVWOwotCQl9CisJaWYgKCgocmV0ID0gZHZiX3VzYl9kZXZpY2VfaW5pdChpbnRmLCAmbWVnYXNreV9wcm9wZXJ0aWVzLCBUSElTX01PRFVMRSwgJmQpKSA9PSAwKSB8fAorCSAgICAoKHJldCA9IGR2Yl91c2JfZGV2aWNlX2luaXQoaW50ZiwgJmRpZ2l2b3hfbWluaV9paV9wcm9wZXJ0aWVzLCBUSElTX01PRFVMRSwgJmQpKSA9PSAwKSkKKwkJZ290byBmb3VuZDsKIAotCQlyZXQgPSB1c2Jfc2V0X2ludGVyZmFjZShkLT51ZGV2LCBhbHQtPmRlc2MuYkludGVyZmFjZU51bWJlciwKLQkJCQkJYWx0LT5kZXNjLmJBbHRlcm5hdGVTZXR0aW5nKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OworCXJldHVybiByZXQ7CiAKLQkJZGViX3JjKCJDaGFuZ2VkIHRvIGFsdGVybmF0ZSBzZXR0aW5nIVxuIik7Ci0KLQkJaWYgKChyZXQgPSBtOTIwNl9yY19pbml0KGQtPnVkZXYpKSAhPSAwKQotCQkJcmV0dXJuIHJldDsKK2ZvdW5kOgorCWFsdCA9IHVzYl9hbHRudW1fdG9fYWx0c2V0dGluZyhpbnRmLCAxKTsKKwlpZiAoYWx0ID09IE5VTEwpIHsKKwkJZGViX3JjKCJObyBhbHQgZm91bmQhXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CiAJfQorCisJcmV0ID0gdXNiX3NldF9pbnRlcmZhY2UoZC0+dWRldiwgYWx0LT5kZXNjLmJJbnRlcmZhY2VOdW1iZXIsCisJCQkJYWx0LT5kZXNjLmJBbHRlcm5hdGVTZXR0aW5nKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWlmICgocmV0ID0gbTkyMDZfaW5pdChkKSkgIT0gMCkKKwkJcmV0dXJuIHJldDsKKwogCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBtOTIweF90YWJsZSBbXSA9IHsKIAkJeyBVU0JfREVWSUNFKFVTQl9WSURfTVNJLCBVU0JfUElEX01TSV9NRUdBU0tZNTgwKSB9LAorCQl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9BTlVCSVNfRUxFQ1RST05JQywKKwkJCSAgICAgVVNCX1BJRF9NU0lfRElHSV9WT1hfTUlOSV9JSSkgfSwKIAkJeyB9CQkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLwogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUgKHVzYiwgbTkyMHhfdGFibGUpOwpAQCAtNDcxLDcgKzUwNiw3IEBACiAKIAkuc2l6ZV9vZl9wcml2ICAgICA9IHNpemVvZihzdHJ1Y3QgbTkyMDZfc3RhdGUpLAogCi0JLmlkZW50aWZ5X3N0YXRlICAgPSBtZWdhc2t5X2lkZW50aWZ5X3N0YXRlLAorCS5pZGVudGlmeV9zdGF0ZSAgID0gbTkyMHhfaWRlbnRpZnlfc3RhdGUsCiAJLm51bV9hZGFwdGVycyA9IDEsCiAJLmFkYXB0ZXIgPSB7ewogCQkuY2FwcyA9IERWQl9VU0JfQURBUF9IQVNfUElEX0ZJTFRFUiB8CkBAIC01MDIsNiArNTM3LDUwIEBACiAJCXsgICAiTVNJIE1lZ2EgU2t5IDU4MCBEVkItVCBVU0IyLjAiLAogCQkJeyAmbTkyMHhfdGFibGVbMF0sIE5VTEwgfSwKIAkJCXsgTlVMTCB9LAorCQl9CisJfQorfTsKKworc3RhdGljIHN0cnVjdCBkdmJfdXNiX2RldmljZV9wcm9wZXJ0aWVzIGRpZ2l2b3hfbWluaV9paV9wcm9wZXJ0aWVzID0geworCS5jYXBzID0gRFZCX1VTQl9JU19BTl9JMkNfQURBUFRFUiwKKworCS51c2JfY3RybCA9IERFVklDRV9TUEVDSUZJQywKKwkuZmlybXdhcmUgPSAiZHZiLXVzYi1kaWdpdm94LTAyLmZ3IiwKKwkuZG93bmxvYWRfZmlybXdhcmUgPSBtOTIwNl9maXJtd2FyZV9kb3dubG9hZCwKKworCS5zaXplX29mX3ByaXYgICAgID0gc2l6ZW9mKHN0cnVjdCBtOTIwNl9zdGF0ZSksCisKKwkuaWRlbnRpZnlfc3RhdGUgICA9IG05MjB4X2lkZW50aWZ5X3N0YXRlLAorCS5udW1fYWRhcHRlcnMgPSAxLAorCS5hZGFwdGVyID0ge3sKKwkJLmNhcHMgPSBEVkJfVVNCX0FEQVBfSEFTX1BJRF9GSUxURVIgfAorCQlEVkJfVVNCX0FEQVBfUElEX0ZJTFRFUl9DQU5fQkVfVFVSTkVEX09GRiwKKworCQkucGlkX2ZpbHRlcl9jb3VudCA9IDgsCisJCS5waWRfZmlsdGVyICAgICAgID0gbTkyMDZfcGlkX2ZpbHRlciwKKwkJLnBpZF9maWx0ZXJfY3RybCAgPSBtOTIwNl9waWRfZmlsdGVyX2N0cmwsCisKKwkJLmZyb250ZW5kX2F0dGFjaCAgPSBkaWdpdm94X3RkYTEwMDQ2X2Zyb250ZW5kX2F0dGFjaCwKKwkJLnR1bmVyX2F0dGFjaCAgICAgPSBkaWdpdm94X3RkYTgyNzVfdHVuZXJfYXR0YWNoLAorCisJCS5zdHJlYW0gPSB7CisJCQkudHlwZSA9IFVTQl9CVUxLLAorCQkJLmNvdW50ID0gOCwKKwkJCS5lbmRwb2ludCA9IDB4ODEsCisJCQkudSA9IHsKKwkJCQkuYnVsayA9IHsKKwkJCQkJLmJ1ZmZlcnNpemUgPSAweDQwMDAsCisJCQkJfQorCQkJfQorCQl9LAorCX19LAorCS5pMmNfYWxnbyAgICAgICAgID0gJm05MjA2X2kyY19hbGdvLAorCisJLm51bV9kZXZpY2VfZGVzY3MgPSAxLAorCS5kZXZpY2VzID0geworCQl7ICAgIk1TSSBESUdJIFZPWCBtaW5pIElJIERWQi1UIFVTQjIuMCIsCisJCQl7ICZtOTIweF90YWJsZVsxXSwgTlVMTCB9LAorCQkJeyBOVUxMIH0sCiAJCX0sCiAJfQogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvbTkyMHguaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvbTkyMHguaAppbmRleCBjMzU0MTk2Li43ZGQzZGI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL205MjB4LmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9tOTIweC5oCkBAIC0xOSwxNyArMTksNDkgQEAKIAogI2RlZmluZSBNOTIwNl9NQVhfRklMVEVSUyA4CiAKLSNkZWZpbmUgTTkyMDZfSTJDX1RVTkVSCTAKLSNkZWZpbmUgTTkyMDZfSTJDX0RFTU9ECTEKLSNkZWZpbmUgTTkyMDZfSTJDX01BWAkyCisvKgorc2VxdWVuY2VzIGZvdW5kIGluIGxvZ3M6CitbaW5kZXggdmFsdWVdCisweDgwIHdyaXRlIGFkZHIKKygweDAwIG91dCBieXRlKSoKKzB4NDAgb3V0IGJ5dGUKKworMHg4MCB3cml0ZSBhZGRyCisoMHgwMCBvdXQgYnl0ZSkqCisweDgwIHJlYWQgYWRkcgorKDB4MjEgaW4gYnl0ZSkqCisweDYwIGluIGJ5dGUKKwordGhpcyBzZXF1ZW5jZSB3b3JrczoKKzB4ODAgcmVhZCBhZGRyCisoMHgyMSBpbiBieXRlKSoKKzB4NjAgaW4gYnl0ZQorCitHdWVzcyBhdCBBUEkgb2YgdGhlIEkyQyBmdW5jdGlvbjoKK0kyQyBvcGVyYXRpb24gaXMgZG9uZSBvbmUgYnl0ZSBhdCBhIHRpbWUgd2l0aCBVU0IgY29udHJvbCBtZXNzYWdlcy4gIFRoZQoraW5kZXggdGhlIG1lc3NhZ2VzIGlzIHNlbnQgdG8gaXMgbWFkZSB1cCBvZiBhIHNldCBvZiBmbGFncyB0aGF0IGNvbnRyb2wKK3RoZSBJMkMgYnVzIHN0YXRlOgorMHg4MDogIFNlbmQgU1RBUlQgY29uZGl0aW9uLiAgQWZ0ZXIgYSBTVEFSVCBjb25kaXRpb24sIG9uZSB3b3VsZCBub3JtYWxseQorICAgICAgIGFsd2F5cyBzZW5kIHRoZSA3LWJpdCBzbGF2ZSBJMkMgYWRkcmVzcyBhcyB0aGUgNyBNU0IsIGZvbGxvd2VkIGJ5CisgICAgICAgdGhlIHJlYWQvd3JpdGUgYml0IGFzIHRoZSBMU0IuCisweDQwOiAgU2VuZCBTVE9QIGNvbmRpdGlvbi4gIFRoaXMgc2hvdWxkIGJlIHNldCBvbiB0aGUgbGFzdCBieXRlIG9mIGFuCisgICAgICAgSTJDIHRyYW5zYWN0aW9uLgorMHgyMDogIFJlYWQgYSBieXRlIGZyb20gdGhlIHNsYXZlLiAgQXMgb3Bwb3NlZCB0byB3cml0aW5nIGEgYnl0ZSB0byB0aGUKKyAgICAgICBzbGF2ZS4gIFRoZSBzbGF2ZSB3aWxsIG5vcm1hbGx5IG5vdCBwcm9kdWNlIGFueSBkYXRhIHVubGVzcyB5b3UKKyAgICAgICBzZXQgdGhlIFIvVyBiaXQgdG8gMSB3aGVuIHNlbmRpbmcgdGhlIHNsYXZlJ3MgYWRkcmVzcyBhZnRlciB0aGUKKyAgICAgICBTVEFSVCBjb25kaXRpb24uCisweDAxOiAgUmVzcG9uZCB3aXRoIEFDSywgYXMgb3Bwb3NlZCB0byBhIE5BQ0suICBGb3IgYSBtdWx0aS1ieXRlIHJlYWQsCisgICAgICAgdGhlIG1hc3RlciBzaG91bGQgc2VuZCBhbiBBQ0ssIHRoYXQgaXMgcHVsbCBTREEgbG93IGR1cmluZyB0aGUgOXRoCisgICAgICAgY2xvY2sgY3ljbGUsIGFmdGVyIGV2ZXJ5IGJ5dGUgYnV0IHRoZSBsYXN0LiAgVGhpcyBmbGFncyBvbmx5IG1ha2VzCisgICAgICAgc2Vuc2Ugd2hlbiBiaXQgMHgyMCBpcyBzZXQsIGluZGljYXRpbmcgYSByZWFkLgorCitXaGF0IGFueSBvdGhlciBiaXRzIG1pZ2h0IG1lYW4sIG9yIGhvdyB0byBnZXQgdGhlIHNsYXZlJ3MgQUNLL05BQ0sKK3Jlc3BvbnNlIHRvIGEgd3JpdGUsIGlzIHVua25vd24uCisqLwogCiBzdHJ1Y3QgbTkyMDZfc3RhdGUgewogCXUxNiBmaWx0ZXJzW005MjA2X01BWF9GSUxURVJTXTsKIAlpbnQgZmlsdGVyaW5nX2VuYWJsZWQ7CiAJaW50IHJlcF9jb3VudDsKLQlzdHJ1Y3QgewotCQl1bnNpZ25lZCBjaGFyIGFkZHI7Ci0JCXVuc2lnbmVkIGNoYXIgbWFnaWM7Ci0JfWkyY19yW005MjA2X0kyQ19NQVhdOwogfTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9vcGVyYTEuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2Ivb3BlcmExLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE4ZDdhZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2Ivb3BlcmExLmMKQEAgLTAsMCArMSw1ODEgQEAKKy8qIERWQiBVU0IgZnJhbWV3b3JrIGNvbXBsaWFudCBMaW51eCBkcml2ZXIgZm9yIHRoZSBPcGVyYTEgRFZCLVMgQ2FyZAorKgorKiBDb3B5cmlnaHQgKEMpIDIwMDYgTWFyaW8gSGxhd2l0c2Noa2EgKGRoMXBhQGFtc2F0Lm9yZykKKyogQ29weXJpZ2h0IChDKSAyMDA2IE1hcmNvIEdpdHRsZXIgKGcubWFyY29AZnJlZW5ldC5kZSkKKyoKKyoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyoJdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyoJU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgorKgorKiBzZWUgRG9jdW1lbnRhdGlvbi9kdmIvUkVBRE1FLmR2Yi11c2IgZm9yIG1vcmUgaW5mb3JtYXRpb24KKyovCisKKyNpbmNsdWRlICJvcGVyYTEuaCIKKyNpbmNsdWRlICJzdHYwMjk5LmgiCisKKyNkZWZpbmUgT1BFUkFfUkVBRF9NU0cgMAorI2RlZmluZSBPUEVSQV9XUklURV9NU0cgMQorI2RlZmluZSBPUEVSQV9JMkNfVFVORVIgMHhkMQorCisjZGVmaW5lIFJFQURfRlgyX1JFR19SRVEgIDB4YmEKKyNkZWZpbmUgUkVBRF9NQUNfQUREUiAweDA4CisjZGVmaW5lIE9QRVJBX1dSSVRFX0ZYMiAweGJiCisjZGVmaW5lIE9QRVJBX1RVTkVSX1JFUSAweGIxCisjZGVmaW5lIFJFR18xRl9TWU1CT0xSQVRFX0JZVEUwIDB4MWYKKyNkZWZpbmUgUkVHXzIwX1NZTUJPTFJBVEVfQllURTEgMHgyMAorI2RlZmluZSBSRUdfMjFfU1lNQk9MUkFURV9CWVRFMiAweDIxCisKKyNkZWZpbmUgQUREUl9CNjAwX1ZPTFRBR0VfMTNWICgweDAyKQorI2RlZmluZSBBRERSX0I2MDFfVk9MVEFHRV8xOFYgKDB4MDMpCisjZGVmaW5lIEFERFJfQjFBNl9TVFJFQU1fQ1RSTCAoMHgwNCkKKyNkZWZpbmUgQUREUl9CODgwX1JFQURfUkVNT1RFICgweDA1KQorCitzdHJ1Y3Qgb3BlcmExX3N0YXRlIHsKKwl1MzIgbGFzdF9rZXlfcHJlc3NlZDsKK307CitzdHJ1Y3Qgb3BlcmFfcmNfa2V5cyB7CisJdTMyIGtleWNvZGU7CisJdTMyIGV2ZW50OworfTsKKworaW50IGR2Yl91c2Jfb3BlcmExX2RlYnVnOworbW9kdWxlX3BhcmFtX25hbWVkKGRlYnVnLCBkdmJfdXNiX29wZXJhMV9kZWJ1ZywgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsCisJCSAic2V0IGRlYnVnZ2luZyBsZXZlbCAoMT1pbmZvLHhmZXI9MixwbGw9NCx0cz04LGVycj0xNixyYz0zMixmdz02NCAob3ItYWJsZSkpLiIKKwkJIERWQl9VU0JfREVCVUdfU1RBVFVTKTsKKworc3RhdGljIGludCBvcGVyYTFfeGlsaW54X3J3KHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIHU4IHJlcXVlc3QsIHUxNiB2YWx1ZSwKKwkJCSAgICB1OCAqIGRhdGEsIHUxNiBsZW4sIGludCBmbGFncykKK3sKKwlpbnQgcmV0OworCXU4IHI7CisJdTggdThidWZbbGVuXTsKKworCXVuc2lnbmVkIGludCBwaXBlID0gKGZsYWdzID09IE9QRVJBX1JFQURfTVNHKSA/CisJCXVzYl9yY3ZjdHJscGlwZShkZXYsMCkgOiB1c2Jfc25kY3RybHBpcGUoZGV2LCAwKTsKKwl1OCByZXF1ZXN0X3R5cGUgPSAoZmxhZ3MgPT0gT1BFUkFfUkVBRF9NU0cpID8gVVNCX0RJUl9JTiA6IFVTQl9ESVJfT1VUOworCisJaWYgKGZsYWdzID09IE9QRVJBX1dSSVRFX01TRykKKwkJbWVtY3B5KHU4YnVmLCBkYXRhLCBsZW4pOworCXJldCA9CisJCXVzYl9jb250cm9sX21zZyhkZXYsIHBpcGUsIHJlcXVlc3QsIHJlcXVlc3RfdHlwZSB8IFVTQl9UWVBFX1ZFTkRPUiwKKwkJCXZhbHVlLCAweDAsIHU4YnVmLCBsZW4sIDIwMDApOworCisJaWYgKHJlcXVlc3QgPT0gT1BFUkFfVFVORVJfUkVRKSB7CisJCWlmICh1c2JfY29udHJvbF9tc2coZGV2LCB1c2JfcmN2Y3RybHBpcGUoZGV2LCAwKSwKKwkJCQlPUEVSQV9UVU5FUl9SRVEsIFVTQl9ESVJfSU4gfCBVU0JfVFlQRV9WRU5ET1IsCisJCQkJMHgwMSwgMHgwLCAmciwgMSwgMjAwMCk8MSB8fCByIT0weDA4KQorCQkJCQlyZXR1cm4gMDsKKwl9CisJaWYgKGZsYWdzID09IE9QRVJBX1JFQURfTVNHKQorCQltZW1jcHkoZGF0YSwgdThidWYsIGxlbik7CisJcmV0dXJuIHJldDsKK30KKworLyogSTJDICovCisKK3N0YXRpYyBpbnQgb3BlcmExX3VzYl9pMmNfbXNneGZlcihzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmRldiwgdTE2IGFkZHIsCisJCQkJICB1OCAqIGJ1ZiwgdTE2IGxlbikKK3sKKwlpbnQgcmV0ID0gMDsKKwl1OCByZXF1ZXN0OworCXUxNiB2YWx1ZTsKKworCWlmICghZGV2KSB7CisJCWluZm8oIm5vIHVzYl9kZXZpY2UiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmRldi0+dXNiX211dGV4KSA8IDApCisJCXJldHVybiAtRUFHQUlOOworCisJc3dpdGNoIChhZGRyPj4xKXsKKwkJY2FzZSBBRERSX0I2MDBfVk9MVEFHRV8xM1Y6CisJCQlyZXF1ZXN0PTB4YjY7CisJCQl2YWx1ZT0weDAwOworCQkJYnJlYWs7CisJCWNhc2UgQUREUl9CNjAxX1ZPTFRBR0VfMThWOgorCQkJcmVxdWVzdD0weGI2OworCQkJdmFsdWU9MHgwMTsKKwkJCWJyZWFrOworCQljYXNlIEFERFJfQjFBNl9TVFJFQU1fQ1RSTDoKKwkJCXJlcXVlc3Q9MHhiMTsKKwkJCXZhbHVlPTB4YTY7CisJCQlicmVhazsKKwkJY2FzZSBBRERSX0I4ODBfUkVBRF9SRU1PVEU6CisJCQlyZXF1ZXN0PTB4Yjg7CisJCQl2YWx1ZT0weDgwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXF1ZXN0PTB4YjE7CisJCQl2YWx1ZT1hZGRyOworCX0KKwlyZXQgPSBvcGVyYTFfeGlsaW54X3J3KGRldi0+dWRldiwgcmVxdWVzdCwKKwkJdmFsdWUsIGJ1ZiwgbGVuLAorCQlhZGRyJjB4MDE/T1BFUkFfUkVBRF9NU0c6T1BFUkFfV1JJVEVfTVNHKTsKKworCW11dGV4X3VubG9jaygmZGV2LT51c2JfbXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgb3BlcmExX2kyY194ZmVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwgc3RydWN0IGkyY19tc2cgbXNnW10sCisJCQkgICBpbnQgbnVtKQoreworCXN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCA9IGkyY19nZXRfYWRhcGRhdGEoYWRhcCk7CisJaW50IGkgPSAwLCB0bXAgPSAwOworCisJaWYgKCFkKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZkLT5pMmNfbXV0ZXgpIDwgMCkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKKwkJaWYgKCh0bXAgPSBvcGVyYTFfdXNiX2kyY19tc2d4ZmVyKGQsCisJCQkJCShtc2dbaV0uYWRkcjw8MSl8KG1zZ1tpXS5mbGFncyZJMkNfTV9SRD8weDAxOjApLAorCQkJCQltc2dbaV0uYnVmLAorCQkJCQltc2dbaV0ubGVuCisJCQkJCSkhPSBtc2dbaV0ubGVuKSkgeworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGR2Yl91c2Jfb3BlcmExX2RlYnVnICYgMHgxMCkKKwkJCWluZm8oInNlbmRpbmcgaTJjIG1lc2FnZSAlZCAlZCIsIHRtcCwgbXNnW2ldLmxlbik7CisJfQorCW11dGV4X3VubG9jaygmZC0+aTJjX211dGV4KTsKKwlyZXR1cm4gbnVtOworfQorCitzdGF0aWMgdTMyIG9wZXJhMV9pMmNfZnVuYyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJcmV0dXJuIEkyQ19GVU5DX0kyQzsKK30KKworc3RhdGljIHN0cnVjdCBpMmNfYWxnb3JpdGhtIG9wZXJhMV9pMmNfYWxnbyA9IHsKKwkubWFzdGVyX3hmZXIgPSBvcGVyYTFfaTJjX3hmZXIsCisJLmZ1bmN0aW9uYWxpdHkgPSBvcGVyYTFfaTJjX2Z1bmMsCit9OworCitzdGF0aWMgaW50IG9wZXJhMV9zZXRfdm9sdGFnZShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgZmVfc2VjX3ZvbHRhZ2VfdCB2b2x0YWdlKQoreworCXN0YXRpYyB1OCBjb21tYW5kXzEzdlsxXT17MHgwMH07CisJc3RhdGljIHU4IGNvbW1hbmRfMTh2WzFdPXsweDAxfTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2dbXSA9IHsKKwkJey5hZGRyID0gQUREUl9CNjAwX1ZPTFRBR0VfMTNWLC5mbGFncyA9IDAsLmJ1ZiA9IGNvbW1hbmRfMTN2LC5sZW4gPSAxfSwKKwl9OworCXN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKnVkZXZfYWRhcCA9CisJICAgIChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICopKGZlLT5kdmItPnByaXYpOworCWlmICh2b2x0YWdlID09IFNFQ19WT0xUQUdFXzE4KSB7CisJCW1zZ1swXS5hZGRyID0gQUREUl9CNjAxX1ZPTFRBR0VfMThWOworCQltc2dbMF0uYnVmID0gY29tbWFuZF8xOHY7CisJfQorCWkyY190cmFuc2ZlcigmdWRldl9hZGFwLT5kZXYtPmkyY19hZGFwLCBtc2csIDEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9wZXJhMV9zdHYwMjk5X3NldF9zeW1ib2xfcmF0ZShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTMyIHNyYXRlLAorCQkJCQkgIHUzMiByYXRpbykKK3sKKwlzdHYwMjk5X3dyaXRlcmVnKGZlLCAweDEzLCAweDk4KTsKKwlzdHYwMjk5X3dyaXRlcmVnKGZlLCAweDE0LCAweDk1KTsKKwlzdHYwMjk5X3dyaXRlcmVnKGZlLCBSRUdfMUZfU1lNQk9MUkFURV9CWVRFMCwgKHJhdGlvID4+IDE2KSAmIDB4ZmYpOworCXN0djAyOTlfd3JpdGVyZWcoZmUsIFJFR18yMF9TWU1CT0xSQVRFX0JZVEUxLCAocmF0aW8gPj4gOCkgJiAweGZmKTsKKwlzdHYwMjk5X3dyaXRlcmVnKGZlLCBSRUdfMjFfU1lNQk9MUkFURV9CWVRFMiwgKHJhdGlvKSAmIDB4ZjApOworCXJldHVybiAwOworCit9CitzdGF0aWMgdTggb3BlcmExX2luaXR0YWJbXSA9IHsKKwkweDAwLCAweGExLAorCTB4MDEsIDB4MTUsCisJMHgwMiwgMHgwMCwKKwkweDAzLCAweDAwLAorCTB4MDQsIDB4N2QsCisJMHgwNSwgMHgwNSwKKwkweDA2LCAweDAyLAorCTB4MDcsIDB4MDAsCisJMHgwYiwgMHgwMCwKKwkweDBjLCAweDAxLAorCTB4MGQsIDB4ODEsCisJMHgwZSwgMHg0NCwKKwkweDBmLCAweDE5LAorCTB4MTAsIDB4M2YsCisJMHgxMSwgMHg4NCwKKwkweDEyLCAweGRhLAorCTB4MTMsIDB4OTgsCisJMHgxNCwgMHg5NSwKKwkweDE1LCAweGM5LAorCTB4MTYsIDB4ZWIsCisJMHgxNywgMHgwMCwKKwkweDE4LCAweDE5LAorCTB4MTksIDB4OGIsCisJMHgxYSwgMHgwMCwKKwkweDFiLCAweDgyLAorCTB4MWMsIDB4N2YsCisJMHgxZCwgMHgwMCwKKwkweDFlLCAweDAwLAorCVJFR18xRl9TWU1CT0xSQVRFX0JZVEUwLCAweDA2LAorCVJFR18yMF9TWU1CT0xSQVRFX0JZVEUxLCAweDUwLAorCVJFR18yMV9TWU1CT0xSQVRFX0JZVEUyLCAweDEwLAorCTB4MjIsIDB4MDAsCisJMHgyMywgMHgwMCwKKwkweDI0LCAweDM3LAorCTB4MjUsIDB4YmMsCisJMHgyNiwgMHgwMCwKKwkweDI3LCAweDAwLAorCTB4MjgsIDB4MDAsCisJMHgyOSwgMHgxZSwKKwkweDJhLCAweDE0LAorCTB4MmIsIDB4MWYsCisJMHgyYywgMHgwOSwKKwkweDJkLCAweDBhLAorCTB4MmUsIDB4MDAsCisJMHgyZiwgMHgwMCwKKwkweDMwLCAweDAwLAorCTB4MzEsIDB4MWYsCisJMHgzMiwgMHgxOSwKKwkweDMzLCAweGZjLAorCTB4MzQsIDB4MTMsCisJMHhmZiwgMHhmZiwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3R2MDI5OV9jb25maWcgb3BlcmExX3N0djAyOTlfY29uZmlnID0geworCS5kZW1vZF9hZGRyZXNzID0gMHhkMD4+MSwKKwkubWluX2RlbGF5X21zID0gMTAwLAorCS5tY2xrID0gODgwMDAwMDBVTCwKKwkuaW52ZXJ0ID0gMSwKKwkuc2tpcF9yZWluaXQgPSAwLAorCS5sb2NrX291dHB1dCA9IFNUVjAyMjlfTE9DS09VVFBVVF8wLAorCS52b2x0MTNfb3AwX29wMSA9IFNUVjAyOTlfVk9MVDEzX09QMCwKKwkuaW5pdHRhYiA9IG9wZXJhMV9pbml0dGFiLAorCS5zZXRfc3ltYm9sX3JhdGUgPSBvcGVyYTFfc3R2MDI5OV9zZXRfc3ltYm9sX3JhdGUsCit9OworCitzdGF0aWMgaW50IG9wZXJhMV9mcm9udGVuZF9hdHRhY2goc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqZCkKK3sKKwlpZiAoKGQtPmZlID0KKwkgICAgIGR2Yl9hdHRhY2goc3R2MDI5OV9hdHRhY2gsICZvcGVyYTFfc3R2MDI5OV9jb25maWcsCisJCQkmZC0+ZGV2LT5pMmNfYWRhcCkpICE9IE5VTEwpIHsKKwkJZC0+ZmUtPm9wcy5zZXRfdm9sdGFnZSA9IG9wZXJhMV9zZXRfdm9sdGFnZTsKKwkJcmV0dXJuIDA7CisJfQorCWluZm8oIm5vdCBhdHRhY2hlZCBzdHYwMjk5Iik7CisJcmV0dXJuIC1FSU87Cit9CisKK3N0YXRpYyBpbnQgb3BlcmExX3R1bmVyX2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwKQoreworCWR2Yl9hdHRhY2goCisJCWR2Yl9wbGxfYXR0YWNoLCBhZGFwLT5mZSwgMHhjMD4+MSwKKwkJJmFkYXAtPmRldi0+aTJjX2FkYXAsICZkdmJfcGxsX29wZXJhMQorCSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb3BlcmExX3Bvd2VyX2N0cmwoc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkLCBpbnQgb25vZmYpCit7CisJdTggdmFsID0gb25vZmYgPyAweDAxIDogMHgwMDsKKworCWlmIChkdmJfdXNiX29wZXJhMV9kZWJ1ZykKKwkJaW5mbygicG93ZXIgJXMiLCBvbm9mZiA/ICJvbiIgOiAib2ZmIik7CisJcmV0dXJuIG9wZXJhMV94aWxpbnhfcncoZC0+dWRldiwgMHhiNywgdmFsLAorCQkJCSZ2YWwsIDEsIE9QRVJBX1dSSVRFX01TRyk7Cit9CisKK3N0YXRpYyBpbnQgb3BlcmExX3N0cmVhbWluZ19jdHJsKHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmFkYXAsIGludCBvbm9mZikKK3sKKwlzdGF0aWMgdTggYnVmX3N0YXJ0WzJdID0geyAweGZmLCAweDAzIH07CisJc3RhdGljIHU4IGJ1Zl9zdG9wWzJdID0geyAweGZmLCAweDAwIH07CisJc3RydWN0IGkyY19tc2cgc3RhcnRfdHVuZXJbXSA9IHsKKwkJey5hZGRyID0gQUREUl9CMUE2X1NUUkVBTV9DVFJMLC5idWYgPSBvbm9mZiA/IGJ1Zl9zdGFydCA6IGJ1Zl9zdG9wLC5sZW4gPSAyfSwKKwl9OworCWlmIChkdmJfdXNiX29wZXJhMV9kZWJ1ZykKKwkJaW5mbygic3RyZWFtaW5nICVzIiwgb25vZmYgPyAib24iIDogIm9mZiIpOworCWkyY190cmFuc2ZlcigmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgc3RhcnRfdHVuZXIsIDEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9wZXJhMV9waWRfZmlsdGVyKHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmFkYXAsIGludCBpbmRleCwgdTE2IHBpZCwKKwkJCSAgICAgaW50IG9ub2ZmKQoreworCXU4IGJfcGlkWzNdOworCXN0cnVjdCBpMmNfbXNnIG1zZ1tdID0geworCQl7LmFkZHIgPSBBRERSX0IxQTZfU1RSRUFNX0NUUkwsLmJ1ZiA9IGJfcGlkLC5sZW4gPSAzfSwKKwl9OworCWlmIChkdmJfdXNiX29wZXJhMV9kZWJ1ZykKKwkJaW5mbygicGlkZmlsdGVyIGluZGV4OiAlZCBwaWQ6ICVkICVzIiwgaW5kZXgsIHBpZCwKKwkJCW9ub2ZmID8gIm9uIiA6ICJvZmYiKTsKKwliX3BpZFswXSA9ICgyICogaW5kZXgpICsgNDsKKwliX3BpZFsxXSA9IG9ub2ZmID8gKHBpZCAmIDB4ZmYpIDogKDB4MDApOworCWJfcGlkWzJdID0gb25vZmYgPyAoKHBpZCA+PiA4KSAmIDB4ZmYpIDogKDB4MDApOworCWkyY190cmFuc2ZlcigmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgbXNnLCAxKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvcGVyYTFfcGlkX2ZpbHRlcl9jb250cm9sKHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmFkYXAsIGludCBvbm9mZikKK3sKKwlpbnQgdSA9IDB4MDQ7CisJdTggYl9waWRbM107CisJc3RydWN0IGkyY19tc2cgbXNnW10gPSB7CisJCXsuYWRkciA9IEFERFJfQjFBNl9TVFJFQU1fQ1RSTCwuYnVmID0gYl9waWQsLmxlbiA9IDN9LAorCX07CisJaWYgKGR2Yl91c2Jfb3BlcmExX2RlYnVnKQorCQlpbmZvKCIlcyBody1waWRmaWx0ZXIiLCBvbm9mZiA/ICJlbmFibGUiIDogImRpc2FibGUiKTsKKwlmb3IgKDsgdSA8IDB4N2U7IHUgKz0gMikgeworCQliX3BpZFswXSA9IHU7CisJCWJfcGlkWzFdID0gMDsKKwkJYl9waWRbMl0gPSAweDgwOworCQlpMmNfdHJhbnNmZXIoJmFkYXAtPmRldi0+aTJjX2FkYXAsIG1zZywgMSk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGR2Yl91c2JfcmNfa2V5IG9wZXJhMV9yY19rZXlzW10gPSB7CisJezB4NWYsIDB4YTAsIEtFWV8xfSwKKwl7MHg1MSwgMHhhZiwgS0VZXzJ9LAorCXsweDVkLCAweGEyLCBLRVlfM30sCisJezB4NDEsIDB4YmUsIEtFWV80fSwKKwl7MHgwYiwgMHhmNSwgS0VZXzV9LAorCXsweDQzLCAweGJkLCBLRVlfNn0sCisJezB4NDcsIDB4YjgsIEtFWV83fSwKKwl7MHg0OSwgMHhiNiwgS0VZXzh9LAorCXsweDA1LCAweGZhLCBLRVlfOX0sCisJezB4NDUsIDB4YmEsIEtFWV8wfSwKKwl7MHgwOSwgMHhmNiwgS0VZX1VQfSwJLypjaGFudXAgKi8KKwl7MHgxYiwgMHhlNSwgS0VZX0RPV059LAkvKmNoYW5kb3duICovCisJezB4NWQsIDB4YTMsIEtFWV9MRUZUfSwJLyp2b2xkb3duICovCisJezB4NWYsIDB4YTEsIEtFWV9SSUdIVH0sCS8qdm9sdXAgKi8KKwl7MHgwNywgMHhmOCwgS0VZX1NQQUNFfSwJLyp0YWIgKi8KKwl7MHgxZiwgMHhlMSwgS0VZX0VOVEVSfSwJLypwbGF5IG9rICovCisJezB4MWIsIDB4ZTQsIEtFWV9afSwJLyp6b29tICovCisJezB4NTksIDB4YTYsIEtFWV9NfSwJLyptdXRlICovCisJezB4NWIsIDB4YTUsIEtFWV9GfSwJLyp0di9mICovCisJezB4MTksIDB4ZTcsIEtFWV9SfSwJLypyZWMgKi8KKwl7MHgwMSwgMHhmZSwgS0VZX1N9LAkvKlN0b3AgKi8KKwl7MHgwMywgMHhmZCwgS0VZX1B9LAkvKnBhdXNlICovCisJezB4MDMsIDB4ZmMsIEtFWV9XfSwJLyo8LSAtPiAqLworCXsweDA3LCAweGY5LCBLRVlfQ30sCS8qY2FwdHVyZSAqLworCXsweDQ3LCAweGI5LCBLRVlfUX0sCS8qZXhpdCAqLworCXsweDQzLCAweGJjLCBLRVlfT30sCS8qcG93ZXIgKi8KKworfTsKKworc3RhdGljIGludCBvcGVyYTFfcmNfcXVlcnkoc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkZXYsIHUzMiAqIGV2ZW50LCBpbnQgKnN0YXRlKQoreworCXN0cnVjdCBvcGVyYTFfc3RhdGUgKm9wc3QgPSBkZXYtPnByaXY7CisJdTggcmNidWZmZXJbMzJdOworCWNvbnN0IHUxNiBzdGFydG1hcmtlcjEgPSAweDEwZWQ7CisJY29uc3QgdTE2IHN0YXJ0bWFya2VyMiA9IDB4MTFlYzsKKwlzdHJ1Y3QgaTJjX21zZyByZWFkX3JlbW90ZVtdID0geworCQl7LmFkZHIgPSBBRERSX0I4ODBfUkVBRF9SRU1PVEUsLmJ1ZiA9IHJjYnVmZmVyLC5mbGFncyA9IEkyQ19NX1JELC5sZW4gPSAzMn0sCisJfTsKKwlpbnQgaSA9IDA7CisJdTMyIHNlbmRfa2V5ID0gMDsKKworCWlmIChpMmNfdHJhbnNmZXIoJmRldi0+aTJjX2FkYXAsIHJlYWRfcmVtb3RlLCAxKSA9PSAxKSB7CisJCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisJCQlpZiAocmNidWZmZXJbaV0pCisJCQkJc2VuZF9rZXkgfD0gMTsKKwkJCWlmIChpIDwgMzEpCisJCQkJc2VuZF9rZXkgPSBzZW5kX2tleSA8PCAxOworCQl9CisJCWlmIChzZW5kX2tleSAmIDB4ODAwMCkKKwkJCXNlbmRfa2V5ID0gKHNlbmRfa2V5IDw8IDEpIHwgKHNlbmRfa2V5ID4+IDE1ICYgMHgwMSk7CisKKwkJaWYgKHNlbmRfa2V5ID09IDB4ZmZmZiAmJiBvcHN0LT5sYXN0X2tleV9wcmVzc2VkICE9IDApIHsKKwkJCSpzdGF0ZSA9IFJFTU9URV9LRVlfUkVQRUFUOworCQkJKmV2ZW50ID0gb3BzdC0+bGFzdF9rZXlfcHJlc3NlZDsKKwkJCXJldHVybiAwOworCQl9CisJCWZvciAoOyBzZW5kX2tleSAhPSAwOykgeworCQkJaWYgKHNlbmRfa2V5ID4+IDE2ID09IHN0YXJ0bWFya2VyMikgeworCQkJCWJyZWFrOworCQkJfSBlbHNlIGlmIChzZW5kX2tleSA+PiAxNiA9PSBzdGFydG1hcmtlcjEpIHsKKwkJCQlzZW5kX2tleSA9CisJCQkJCShzZW5kX2tleSAmIDB4ZmZmZWZmZmYpIHwgKHN0YXJ0bWFya2VyMSA8PCAxNik7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UKKwkJCQlzZW5kX2tleSA+Pj0gMTsKKwkJfQorCisJCWlmIChzZW5kX2tleSA9PSAwKQorCQkJcmV0dXJuIDA7CisKKwkJc2VuZF9rZXkgPSAoc2VuZF9rZXkgJiAweGZmZmYpIHwgMHgwMTAwOworCisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG9wZXJhMV9yY19rZXlzKTsgaSsrKSB7CisJCQlpZiAoKG9wZXJhMV9yY19rZXlzW2ldLmN1c3RvbSAqIDI1NiArCisJCQkJCW9wZXJhMV9yY19rZXlzW2ldLmRhdGEpID09IChzZW5kX2tleSAmIDB4ZmZmZikpIHsKKwkJCQkqc3RhdGUgPSBSRU1PVEVfS0VZX1BSRVNTRUQ7CisJCQkJKmV2ZW50ID0gb3BlcmExX3JjX2tleXNbaV0uZXZlbnQ7CisJCQkJb3BzdC0+bGFzdF9rZXlfcHJlc3NlZCA9CisJCQkJCW9wZXJhMV9yY19rZXlzW2ldLmV2ZW50OworCQkJCWJyZWFrOworCQkJfQorCQkJb3BzdC0+bGFzdF9rZXlfcHJlc3NlZCA9IDA7CisJCX0KKwl9IGVsc2UKKwkJKnN0YXRlID0gUkVNT1RFX05PX0tFWV9QUkVTU0VEOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgb3BlcmExX3RhYmxlW10gPSB7CisJe1VTQl9ERVZJQ0UoVVNCX1ZJRF9DWVBSRVNTLCBVU0JfUElEX09QRVJBMV9DT0xEKX0sCisJe1VTQl9ERVZJQ0UoVVNCX1ZJRF9PUEVSQTEsIFVTQl9QSURfT1BFUkExX1dBUk0pfSwKKwl7fQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIG9wZXJhMV90YWJsZSk7CisKK3N0YXRpYyBpbnQgb3BlcmExX3JlYWRfbWFjX2FkZHJlc3Moc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkLCB1OCBtYWNbNl0pCit7CisJdTggY29tbWFuZFtdID0geyBSRUFEX01BQ19BRERSIH07CisJb3BlcmExX3hpbGlueF9ydyhkLT51ZGV2LCAweGIxLCAweGEwLCBjb21tYW5kLCAxLCBPUEVSQV9XUklURV9NU0cpOworCW9wZXJhMV94aWxpbnhfcncoZC0+dWRldiwgMHhiMSwgMHhhMSwgbWFjLCA2LCBPUEVSQV9SRUFEX01TRyk7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW50IG9wZXJhMV94aWxpbnhfbG9hZF9maXJtd2FyZShzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LAorCQkJCSAgICAgICBjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3ID0gTlVMTDsKKwl1OCAqYiwgKnA7CisJaW50IHJldCA9IDAsIGk7CisJdTggdGVzdHZhbDsKKwlpbmZvKCJzdGFydCBkb3dubG9hZGluZyBmcGdhIGZpcm13YXJlIik7CisKKwlpZiAoKHJldCA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3LCBmaWxlbmFtZSwgJmRldi0+ZGV2KSkgIT0gMCkgeworCQllcnIoImRpZCBub3QgZmluZCB0aGUgZmlybXdhcmUgZmlsZS4gKCVzKSAiCisJCQkiUGxlYXNlIHNlZSBsaW51eC9Eb2N1bWVudGF0aW9uL2R2Yi8gZm9yIG1vcmUgZGV0YWlscyBvbiBmaXJtd2FyZS1wcm9ibGVtcy4iLAorCQkJZmlsZW5hbWUpOworCQlyZXR1cm4gcmV0OworCX0gZWxzZSB7CisJCXAgPSBrbWFsbG9jKGZ3LT5zaXplLCBHRlBfS0VSTkVMKTsKKwkJb3BlcmExX3hpbGlueF9ydyhkZXYsIDB4YmMsIDB4MDAsICZ0ZXN0dmFsLCAxLCBPUEVSQV9SRUFEX01TRyk7CisJCWlmIChwICE9IE5VTEwgJiYgdGVzdHZhbCAhPSAweDY3KSB7CisKKwkJCXU4IHJlc2V0ID0gMCwgZnBnYV9jb21tYW5kID0gMDsKKwkJCW1lbWNweShwLCBmdy0+ZGF0YSwgZnctPnNpemUpOworCQkJLyogY2xlYXIgZnBnYSA/ICovCisJCQlvcGVyYTFfeGlsaW54X3J3KGRldiwgMHhiYywgMHhhYSwgJmZwZ2FfY29tbWFuZCwgMSwKKwkJCQkJIE9QRVJBX1dSSVRFX01TRyk7CisJCQlmb3IgKGkgPSAwOyBwW2ldICE9IDAgJiYgaSA8IGZ3LT5zaXplOykgeworCQkJCWIgPSAodTggKikgcCArIGk7CisJCQkJaWYgKG9wZXJhMV94aWxpbnhfcncKKwkJCQkJKGRldiwgT1BFUkFfV1JJVEVfRlgyLCAweDAsIGIgKyAxLCBiWzBdLAorCQkJCQkJT1BFUkFfV1JJVEVfTVNHKSAhPSBiWzBdCisJCQkJCSkgeworCQkJCQllcnIoImVycm9yIHdoaWxlIHRyYW5zZmVycmluZyBmaXJtd2FyZSIpOworCQkJCQlyZXQgPSAtRUlOVkFMOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJaSA9IGkgKyAxICsgYlswXTsKKwkJCX0KKwkJCS8qIHJlc3RhcnQgdGhlIENQVSAqLworCQkJaWYgKHJldCB8fCBvcGVyYTFfeGlsaW54X3J3CisJCQkJCShkZXYsIDB4YTAsIDB4ZTYwMCwgJnJlc2V0LCAxLAorCQkJCQlPUEVSQV9XUklURV9NU0cpICE9IDEpIHsKKwkJCQllcnIoImNvdWxkIG5vdCByZXN0YXJ0IHRoZSBVU0IgY29udHJvbGxlciBDUFUuIik7CisJCQkJcmV0ID0gLUVJTlZBTDsKKwkJCX0KKwkJCWtmcmVlKHApOworCQl9CisJfQorCWlmIChmdykgeworCQlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBkdmJfdXNiX2RldmljZV9wcm9wZXJ0aWVzIG9wZXJhMV9wcm9wZXJ0aWVzID0geworCS5jYXBzID0gRFZCX1VTQl9JU19BTl9JMkNfQURBUFRFUiwKKwkudXNiX2N0cmwgPSBDWVBSRVNTX0ZYMiwKKwkuZmlybXdhcmUgPSAiZHZiLXVzYi1vcGVyYS0wMS5mdyIsCisJLnNpemVfb2ZfcHJpdiA9IHNpemVvZihzdHJ1Y3Qgb3BlcmExX3N0YXRlKSwKKworCS5wb3dlcl9jdHJsID0gb3BlcmExX3Bvd2VyX2N0cmwsCisJLmkyY19hbGdvID0gJm9wZXJhMV9pMmNfYWxnbywKKworCS5yY19rZXlfbWFwID0gb3BlcmExX3JjX2tleXMsCisJLnJjX2tleV9tYXBfc2l6ZSA9IEFSUkFZX1NJWkUob3BlcmExX3JjX2tleXMpLAorCS5yY19pbnRlcnZhbCA9IDIwMCwKKwkucmNfcXVlcnkgPSBvcGVyYTFfcmNfcXVlcnksCisJLnJlYWRfbWFjX2FkZHJlc3MgPSBvcGVyYTFfcmVhZF9tYWNfYWRkcmVzcywKKwkuZ2VuZXJpY19idWxrX2N0cmxfZW5kcG9pbnQgPSAweDAwLAorCS8qIHBhcmFtZXRlciBmb3IgdGhlIE1QRUcyLWRhdGEgdHJhbnNmZXIgKi8KKwkubnVtX2FkYXB0ZXJzID0gMSwKKwkuYWRhcHRlciA9IHsKKwkJeworCQkJLmZyb250ZW5kX2F0dGFjaCA9IG9wZXJhMV9mcm9udGVuZF9hdHRhY2gsCisJCQkuc3RyZWFtaW5nX2N0cmwgPSBvcGVyYTFfc3RyZWFtaW5nX2N0cmwsCisJCQkudHVuZXJfYXR0YWNoID0gb3BlcmExX3R1bmVyX2F0dGFjaCwKKwkJCS5jYXBzID0KKwkJCQlEVkJfVVNCX0FEQVBfSEFTX1BJRF9GSUxURVIgfAorCQkJCURWQl9VU0JfQURBUF9QSURfRklMVEVSX0NBTl9CRV9UVVJORURfT0ZGLAorCQkJLnBpZF9maWx0ZXIgPSBvcGVyYTFfcGlkX2ZpbHRlciwKKwkJCS5waWRfZmlsdGVyX2N0cmwgPSBvcGVyYTFfcGlkX2ZpbHRlcl9jb250cm9sLAorCQkJLnBpZF9maWx0ZXJfY291bnQgPSAyNTIsCisJCQkuc3RyZWFtID0geworCQkJCS50eXBlID0gVVNCX0JVTEssCisJCQkJLmNvdW50ID0gMTAsCisJCQkJLmVuZHBvaW50ID0gMHg4MiwKKwkJCQkudSA9IHsKKwkJCQkJLmJ1bGsgPSB7CisJCQkJCQkuYnVmZmVyc2l6ZSA9IDQwOTYsCisJCQkJCX0KKwkJCQl9CisJCQl9LAorCQl9CisJfSwKKwkubnVtX2RldmljZV9kZXNjcyA9IDEsCisJLmRldmljZXMgPSB7CisJCXsiT3BlcmExIERWQi1TIFVTQjIuMCIsCisJCQl7Jm9wZXJhMV90YWJsZVswXSwgTlVMTH0sCisJCQl7Jm9wZXJhMV90YWJsZVsxXSwgTlVMTH0sCisJCX0sCisJfQorfTsKKworc3RhdGljIGludCBvcGVyYTFfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCisJCQljb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkOworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKKworCWlmICh1ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCA9PSBVU0JfUElEX09QRVJBMV9XQVJNICYmCisJCXVkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IgPT0gVVNCX1ZJRF9PUEVSQTEgJiYKKwkJKGQgPT0gTlVMTAorCQkJfHwgb3BlcmExX3hpbGlueF9sb2FkX2Zpcm13YXJlKHVkZXYsICJkdmItdXNiLW9wZXJhMS1mcGdhLmZ3IikgIT0gMCkKKwkJKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChkdmJfdXNiX2RldmljZV9pbml0KGludGYsICZvcGVyYTFfcHJvcGVydGllcywgVEhJU19NT0RVTEUsICZkKSAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIG9wZXJhMV9kcml2ZXIgPSB7CisJLm5hbWUgPSAib3BlcmExIiwKKwkucHJvYmUgPSBvcGVyYTFfcHJvYmUsCisJLmRpc2Nvbm5lY3QgPSBkdmJfdXNiX2RldmljZV9leGl0LAorCS5pZF90YWJsZSA9IG9wZXJhMV90YWJsZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG9wZXJhMV9tb2R1bGVfaW5pdCh2b2lkKQoreworCWludCByZXN1bHQgPSAwOworCWlmICgocmVzdWx0ID0gdXNiX3JlZ2lzdGVyKCZvcGVyYTFfZHJpdmVyKSkpIHsKKwkJZXJyKCJ1c2JfcmVnaXN0ZXIgZmFpbGVkLiBFcnJvciBudW1iZXIgJWQiLCByZXN1bHQpOworCX0KKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgb3BlcmExX21vZHVsZV9leGl0KHZvaWQpCit7CisJdXNiX2RlcmVnaXN0ZXIoJm9wZXJhMV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChvcGVyYTFfbW9kdWxlX2luaXQpOworbW9kdWxlX2V4aXQob3BlcmExX21vZHVsZV9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiTWFyaW8gSGxhd2l0c2Noa2EgKGMpIGRoMXBhQGFtc2F0Lm9yZyIpOworTU9EVUxFX0FVVEhPUigiTWFyY28gR2l0dGxlciAoYykgZy5tYXJjb0BmcmVlbmV0LmRlIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRyaXZlciBmb3IgT3BlcmExIERWQi1TIGRldmljZSIpOworTU9EVUxFX1ZFUlNJT04oIjAuMSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9vcGVyYTEuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2Ivb3BlcmExLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMxNzQ0MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2Ivb3BlcmExLmgKQEAgLTAsMCArMSw5IEBACisjaWZuZGVmIF9PUEVSQTFfSF8KKyNkZWZpbmUgX09QRVJBMV9IXworCisjZGVmaW5lIERWQl9VU0JfTE9HX1BSRUZJWCAib3BlcmEiCisjaW5jbHVkZSAiZHZiLXVzYi5oIgorCitleHRlcm4gaW50IGR2Yl91c2Jfb3BlcmExX2RlYnVnOworI2RlZmluZSBkZWJfeGZlcihhcmdzLi4uKSBkcHJpbnRrKGR2Yl91c2Jfb3BlcmExX2RlYnVnLDB4MDIsYXJncykKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi90dHVzYjIuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvdHR1c2IyLmMKaW5kZXggOTVkMjk5Ny4uODhkYzQzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi90dHVzYjIuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL3R0dXNiMi5jCkBAIC0xODQsNiArMTg0LDcgQEAKIAogc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIHR0dXNiMl90YWJsZSBbXSA9IHsKIAkJeyBVU0JfREVWSUNFKFVTQl9WSURfUElOTkFDTEUsIFVTQl9QSURfUENUVl80MDBFKSB9LAorCQl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9QSU5OQUNMRSwgVVNCX1BJRF9QQ1RWXzQ1MEUpIH0sCiAJCXt9CQkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLwogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUgKHVzYiwgdHR1c2IyX3RhYmxlKTsKQEAgLTIyNywxMiArMjI4LDE2IEBACiAKIAkuZ2VuZXJpY19idWxrX2N0cmxfZW5kcG9pbnQgPSAweDAxLAogCi0JLm51bV9kZXZpY2VfZGVzY3MgPSAxLAorCS5udW1fZGV2aWNlX2Rlc2NzID0gMiwKIAkuZGV2aWNlcyA9IHsKIAkJeyAgICJQaW5uYWNsZSA0MDBlIERWQi1TIFVTQjIuMCIsCiAJCQl7ICZ0dHVzYjJfdGFibGVbMF0sIE5VTEwgfSwKIAkJCXsgTlVMTCB9LAogCQl9LAorCQl7ICAgIlBpbm5hY2xlIDQ1MGUgRFZCLVMgVVNCMi4wIiwKKwkJCXsgJnR0dXNiMl90YWJsZVsxXSwgTlVMTCB9LAorCQkJeyBOVUxMIH0sCisJCX0sCiAJfQogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL0tjb25maWcgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvS2NvbmZpZwppbmRleCAyMmMyY2YyLi5mZjQ0ODc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvS2NvbmZpZworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvS2NvbmZpZwpAQCAtMjA1LDYgKzIwNSwxMyBAQAogCWhlbHAKIAkgIEEgRFZCLUMgdHVuZXIgbW9kdWxlLiBTYXkgWSB3aGVuIHlvdSB3YW50IHRvIHN1cHBvcnQgdGhpcyBmcm9udGVuZC4KIAorY29uZmlnIERWQl9UREExMDAyMworCXRyaXN0YXRlICJQaGlsaXBzIFREQTEwMDIzIGJhc2VkIgorCWRlcGVuZHMgb24gRFZCX0NPUkUgJiYgSTJDCisJZGVmYXVsdCBtIGlmIERWQl9GRV9DVVNUT01JU0UKKwloZWxwCisJICBBIERWQi1DIHR1bmVyIG1vZHVsZS4gU2F5IFkgd2hlbiB5b3Ugd2FudCB0byBzdXBwb3J0IHRoaXMgZnJvbnRlbmQuCisKIGNvbmZpZyBEVkJfU1RWMDI5NwogCXRyaXN0YXRlICJTVCBTVFYwMjk3IGJhc2VkIgogCWRlcGVuZHMgb24gRFZCX0NPUkUgJiYgSTJDCkBAIC0yODAsOCArMjg3LDEyIEBACiAJZGVwZW5kcyBvbiBEVkJfQ09SRQogCiBjb25maWcgRFZCX1BMTAotCXRyaXN0YXRlCisJdHJpc3RhdGUgIkdlbmVyaWMgSTJDIFBMTCBiYXNlZCB0dW5lcnMiCiAJZGVwZW5kcyBvbiBEVkJfQ09SRSAmJiBJMkMKKwlkZWZhdWx0IG0gaWYgRFZCX0ZFX0NVU1RPTUlTRQorCWhlbHAKKwkgIFRoaXMgbW9kdWxlIGRyaXZlciBhIG51bWJlciBvZiB0dW5lcnMgYmFzZWQgb24gUExMIGNoaXBzIHdpdGggYQorCSAgY29tbW9uIEkyQyBpbnRlcmZhY2UuIFNheSBZIHdoZW4geW91IHdhbnQgdG8gc3VwcG9ydCB0aGVzZSB0dW5lcnMuCiAKIGNvbmZpZyBEVkJfVERBODI2WAogCXRyaXN0YXRlICJQaGlsaXBzIFREQTgyNlggc2lsaWNvbiB0dW5lciIKQEAgLTI5MCw2ICszMDEsMTMgQEAKIAloZWxwCiAJICBBIERWQi1TIHNpbGljb24gdHVuZXIgbW9kdWxlLiBTYXkgWSB3aGVuIHlvdSB3YW50IHRvIHN1cHBvcnQgdGhpcyB0dW5lci4KIAorY29uZmlnIERWQl9UREE4MjdYCisJdHJpc3RhdGUgIlBoaWxpcHMgVERBODI3WCBzaWxpY29uIHR1bmVyIgorCWRlcGVuZHMgb24gRFZCX0NPUkUgJiYgSTJDCisJZGVmYXVsdCBtIGlmIERWQl9GRV9DVVNUT01JU0UKKwloZWxwCisJICBBIERWQi1UIHNpbGljb24gdHVuZXIgbW9kdWxlLiBTYXkgWSB3aGVuIHlvdSB3YW50IHRvIHN1cHBvcnQgdGhpcyB0dW5lci4KKwogY29uZmlnIERWQl9UVU5FUl9RVDEwMTAKIAl0cmlzdGF0ZSAiUXVhbnRlayBRVDEwMTAgc2lsaWNvbiB0dW5lciIKIAlkZXBlbmRzIG9uIERWQl9DT1JFICYmIEkyQwpAQCAtMzA0LDE0ICszMjIsNiBAQAogCWhlbHAKIAkgIEEgZHJpdmVyIGZvciB0aGUgc2lsaWNvbiBJRiB0dW5lciBNVDIwNjAgZnJvbSBNaWNyb3R1bmUuCiAKLWNvbmZpZyBEVkJfVFVORVJfTEdIMDZYRgotCXRyaXN0YXRlICJMRyBURFZTLUgwNnhGIEFUU0MgdHVuZXIiCi0JZGVwZW5kcyBvbiBEVkJfQ09SRSAmJiBJMkMKLQlzZWxlY3QgRFZCX1BMTAotCWRlZmF1bHQgbSBpZiBEVkJfRkVfQ1VTVE9NSVNFCi0JaGVscAotCSAgQSBkcml2ZXIgZm9yIHRoZSBMRyBURFZTLUgwNnhGIEFUU0MgdHVuZXIgZmFtaWx5LgotCiBjb21tZW50ICJNaXNjZWxsYW5lb3VzIGRldmljZXMiCiAJZGVwZW5kcyBvbiBEVkJfQ09SRQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvTWFrZWZpbGUKaW5kZXggYTY0NmQ5OS4uMjdmMzg2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9NYWtlZmlsZQpAQCAtMjUsNiArMjUsNyBAQAogb2JqLSQoQ09ORklHX0RWQl9aTDEwMzUzKSArPSB6bDEwMzUzLm8KIG9iai0kKENPTkZJR19EVkJfQ1gyMjcwMikgKz0gY3gyMjcwMi5vCiBvYmotJChDT05GSUdfRFZCX1REQTEwMDIxKSArPSB0ZGExMDAyMS5vCitvYmotJChDT05GSUdfRFZCX1REQTEwMDIzKSArPSB0ZGExMDAyMy5vCiBvYmotJChDT05GSUdfRFZCX1NUVjAyOTcpICs9IHN0djAyOTcubwogb2JqLSQoQ09ORklHX0RWQl9OWFQyMDBYKSArPSBueHQyMDB4Lm8KIG9iai0kKENPTkZJR19EVkJfT1I1MTIxMSkgKz0gb3I1MTIxMS5vCkBAIC0zNyw3ICszOCw3IEBACiBvYmotJChDT05GSUdfRFZCX0lTTDY0MjEpICs9IGlzbDY0MjEubwogb2JqLSQoQ09ORklHX0RWQl9UREExMDA4NikgKz0gdGRhMTAwODYubwogb2JqLSQoQ09ORklHX0RWQl9UREE4MjZYKSArPSB0ZGE4MjZ4Lm8KK29iai0kKENPTkZJR19EVkJfVERBODI3WCkgKz0gdGRhODI3eC5vCiBvYmotJChDT05GSUdfRFZCX1RVTkVSX01UMjA2MCkgKz0gbXQyMDYwLm8KIG9iai0kKENPTkZJR19EVkJfVFVORVJfUVQxMDEwKSArPSBxdDEwMTAubwogb2JqLSQoQ09ORklHX0RWQl9UVUE2MTAwKSArPSB0dWE2MTAwLm8KLW9iai0kKENPTkZJR19EVkJfVFVORVJfTEdIMDZYRikgKz0gbGdoMDZ4Zi5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZHZiLXBsbC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2R2Yi1wbGwuYwppbmRleCA2MmRlNzYwLi41Zjk2ZmZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZHZiLXBsbC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kdmItcGxsLmMKQEAgLTI3LDE3ICsyNywyOSBAQAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIC8qIGRlc2NyaXB0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKKy8qIFNldCBBR0MgVE9QIHZhbHVlIHRvIDEwMyBkQnVWOgorCTB4ODAgPSBDb250cm9sIEJ5dGUKKwkweDQwID0gMjUwIHVBIGNoYXJnZSBwdW1wIChpcnJlbGV2YW50KQorCTB4MTggPSBBdXggQnl0ZSB0byBmb2xsb3cKKwkweDA2ID0gNjQuNSBrSHogZGl2aWRlciAoaXJyZWxldmFudCkKKwkweDAxID0gRGlzYWJsZSBWdCAoYWthIHNsZWVwKQorCisJMHgwMCA9IEFHQyBUaW1lIGNvbnN0YW50IDJzIElhZ2MgPSAzMDAgbkEgKHZzIDB4ODAgPSA5IG5BKQorCTB4NTAgPSBBR0MgVGFrZSBvdmVyIHBvaW50ID0gMTAzIGRCdVYgKi8KK3N0YXRpYyB1OCB0dWE2MDN4X2FnYzEwM1tdID0geyAyLCAweDgwfDB4NDB8MHgxOHwweDA2fDB4MDEsIDB4MDB8MHg1MCB9OworCiBzdHJ1Y3QgZHZiX3BsbF9kZXNjIGR2Yl9wbGxfdGhvbXNvbl9kdHQ3NTc5ID0gewogCS5uYW1lICA9ICJUaG9tc29uIGR0dDc1NzkiLAogCS5taW4gICA9IDE3NzAwMDAwMCwKIAkubWF4ICAgPSA4NTgwMDAwMDAsCi0JLmNvdW50ID0gNSwKKwkuaWZmcmVxPSAzNjE2NjY2NywKKwkuc2xlZXBkYXRhID0gKHU4W10peyAyLCAweGI0LCAweDAzIH0sCisJLmNvdW50ID0gNCwKIAkuZW50cmllcyA9IHsKLQkJeyAgICAgICAgICAwLCAzNjE2NjY2NywgMTY2NjY2LCAweGI0LCAweDAzIH0sIC8qIGdvIHNsZWVwICovCi0JCXsgIDQ0MzI1MDAwMCwgMzYxNjY2NjcsIDE2NjY2NiwgMHhiNCwgMHgwMiB9LAotCQl7ICA1NDIwMDAwMDAsIDM2MTY2NjY3LCAxNjY2NjYsIDB4YjQsIDB4MDggfSwKLQkJeyAgNzcxMDAwMDAwLCAzNjE2NjY2NywgMTY2NjY2LCAweGJjLCAweDA4IH0sCi0JCXsgIDk5OTk5OTk5OSwgMzYxNjY2NjcsIDE2NjY2NiwgMHhmNCwgMHgwOCB9LAorCQl7ICA0NDMyNTAwMDAsIDE2NjY2NywgMHhiNCwgMHgwMiB9LAorCQl7ICA1NDIwMDAwMDAsIDE2NjY2NywgMHhiNCwgMHgwOCB9LAorCQl7ICA3NzEwMDAwMDAsIDE2NjY2NywgMHhiYywgMHgwOCB9LAorCQl7ICA5OTk5OTk5OTksIDE2NjY2NywgMHhmNCwgMHgwOCB9LAogCX0sCiB9OwogRVhQT1JUX1NZTUJPTChkdmJfcGxsX3Rob21zb25fZHR0NzU3OSk7CkBAIC00NiwxMSArNTgsMTIgQEAKIAkubmFtZSAgPSAiVGhvbXNvbiBkdHQ3NjEwIiwKIAkubWluICAgPSAgNDQwMDAwMDAsCiAJLm1heCAgID0gOTU4MDAwMDAwLAorCS5pZmZyZXE9IDQ0MDAwMDAwLAogCS5jb3VudCA9IDMsCiAJLmVudHJpZXMgPSB7Ci0JCXsgMTU3MjUwMDAwLCA0NDAwMDAwMCwgNjI1MDAsIDB4OGUsIDB4MzkgfSwKLQkJeyA0NTQwMDAwMDAsIDQ0MDAwMDAwLCA2MjUwMCwgMHg4ZSwgMHgzYSB9LAotCQl7IDk5OTk5OTk5OSwgNDQwMDAwMDAsIDYyNTAwLCAweDhlLCAweDNjIH0sCisJCXsgMTU3MjUwMDAwLCA2MjUwMCwgMHg4ZSwgMHgzOSB9LAorCQl7IDQ1NDAwMDAwMCwgNjI1MDAsIDB4OGUsIDB4M2EgfSwKKwkJeyA5OTk5OTk5OTksIDYyNTAwLCAweDhlLCAweDNjIH0sCiAJfSwKIH07CiBFWFBPUlRfU1lNQk9MKGR2Yl9wbGxfdGhvbXNvbl9kdHQ3NjEwKTsKQEAgLTY2LDE0ICs3OSwxNSBAQAogCS5taW4gICA9IDE3NzAwMDAwMCwKIAkubWF4ICAgPSA4OTYwMDAwMDAsCiAJLnNldGJ3ID0gdGhvbXNvbl9kdHQ3NTl4X2J3LAotCS5jb3VudCA9IDYsCisJLmlmZnJlcT0gMzYxNjY2NjcsCisJLnNsZWVwZGF0YSA9ICh1OFtdKXsgMiwgMHg4NCwgMHgwMyB9LAorCS5jb3VudCA9IDUsCiAJLmVudHJpZXMgPSB7Ci0JCXsgICAgICAgICAgMCwgMzYxNjY2NjcsIDE2NjY2NiwgMHg4NCwgMHgwMyB9LAotCQl7ICAyNjQwMDAwMDAsIDM2MTY2NjY3LCAxNjY2NjYsIDB4YjQsIDB4MDIgfSwKLQkJeyAgNDcwMDAwMDAwLCAzNjE2NjY2NywgMTY2NjY2LCAweGJjLCAweDAyIH0sCi0JCXsgIDczNTAwMDAwMCwgMzYxNjY2NjcsIDE2NjY2NiwgMHhiYywgMHgwOCB9LAotCQl7ICA4MzUwMDAwMDAsIDM2MTY2NjY3LCAxNjY2NjYsIDB4ZjQsIDB4MDggfSwKLQkJeyAgOTk5OTk5OTk5LCAzNjE2NjY2NywgMTY2NjY2LCAweGZjLCAweDA4IH0sCisJCXsgIDI2NDAwMDAwMCwgMTY2NjY3LCAweGI0LCAweDAyIH0sCisJCXsgIDQ3MDAwMDAwMCwgMTY2NjY3LCAweGJjLCAweDAyIH0sCisJCXsgIDczNTAwMDAwMCwgMTY2NjY3LCAweGJjLCAweDA4IH0sCisJCXsgIDgzNTAwMDAwMCwgMTY2NjY3LCAweGY0LCAweDA4IH0sCisJCXsgIDk5OTk5OTk5OSwgMTY2NjY3LCAweGZjLCAweDA4IH0sCiAJfSwKIH07CiBFWFBPUlRfU1lNQk9MKGR2Yl9wbGxfdGhvbXNvbl9kdHQ3NTl4KTsKQEAgLTgyLDE0ICs5NiwxNSBAQAogCS5uYW1lICA9ICJMRyB6MjAxIiwKIAkubWluICAgPSAxNzQwMDAwMDAsCiAJLm1heCAgID0gODYyMDAwMDAwLAotCS5jb3VudCA9IDYsCisJLmlmZnJlcT0gMzYxNjY2NjcsCisJLnNsZWVwZGF0YSA9ICh1OFtdKXsgMiwgMHhiYywgMHgwMyB9LAorCS5jb3VudCA9IDUsCiAJLmVudHJpZXMgPSB7Ci0JCXsgICAgICAgICAgMCwgMzYxNjY2NjcsIDE2NjY2NiwgMHhiYywgMHgwMyB9LAotCQl7ICAxNTc1MDAwMDAsIDM2MTY2NjY3LCAxNjY2NjYsIDB4YmMsIDB4MDEgfSwKLQkJeyAgNDQzMjUwMDAwLCAzNjE2NjY2NywgMTY2NjY2LCAweGJjLCAweDAyIH0sCi0JCXsgIDU0MjAwMDAwMCwgMzYxNjY2NjcsIDE2NjY2NiwgMHhiYywgMHgwNCB9LAotCQl7ICA4MzAwMDAwMDAsIDM2MTY2NjY3LCAxNjY2NjYsIDB4ZjQsIDB4MDQgfSwKLQkJeyAgOTk5OTk5OTk5LCAzNjE2NjY2NywgMTY2NjY2LCAweGZjLCAweDA0IH0sCisJCXsgIDE1NzUwMDAwMCwgMTY2NjY3LCAweGJjLCAweDAxIH0sCisJCXsgIDQ0MzI1MDAwMCwgMTY2NjY3LCAweGJjLCAweDAyIH0sCisJCXsgIDU0MjAwMDAwMCwgMTY2NjY3LCAweGJjLCAweDA0IH0sCisJCXsgIDgzMDAwMDAwMCwgMTY2NjY3LCAweGY0LCAweDA0IH0sCisJCXsgIDk5OTk5OTk5OSwgMTY2NjY3LCAweGZjLCAweDA0IH0sCiAJfSwKIH07CiBFWFBPUlRfU1lNQk9MKGR2Yl9wbGxfbGdfejIwMSk7CkBAIC05OCwxMSArMTEzLDEyIEBACiAJLm5hbWUgID0gIk1pY3JvdHVuZSA0MDQyIEZJNSIsCiAJLm1pbiAgID0gIDU3MDAwMDAwLAogCS5tYXggICA9IDg1ODAwMDAwMCwKKwkuaWZmcmVxPSA0NDAwMDAwMCwKIAkuY291bnQgPSAzLAogCS5lbnRyaWVzID0gewotCQl7IDE2MjAwMDAwMCwgNDQwMDAwMDAsIDYyNTAwLCAweDhlLCAweGExIH0sCi0JCXsgNDU3MDAwMDAwLCA0NDAwMDAwMCwgNjI1MDAsIDB4OGUsIDB4OTEgfSwKLQkJeyA5OTk5OTk5OTksIDQ0MDAwMDAwLCA2MjUwMCwgMHg4ZSwgMHgzMSB9LAorCQl7IDE2MjAwMDAwMCwgNjI1MDAsIDB4OGUsIDB4YTEgfSwKKwkJeyA0NTcwMDAwMDAsIDYyNTAwLCAweDhlLCAweDkxIH0sCisJCXsgOTk5OTk5OTk5LCA2MjUwMCwgMHg4ZSwgMHgzMSB9LAogCX0sCiB9OwogRVhQT1JUX1NZTUJPTChkdmJfcGxsX21pY3JvdHVuZV80MDQyKTsKQEAgLTExMiwxMSArMTI4LDEzIEBACiAJLm5hbWUgID0gIlRob21zb24gZHR0NzYxeCIsCiAJLm1pbiAgID0gIDU3MDAwMDAwLAogCS5tYXggICA9IDg2MzAwMDAwMCwKKwkuaWZmcmVxPSA0NDAwMDAwMCwKIAkuY291bnQgPSAzLAorCS5pbml0ZGF0YSA9IHR1YTYwM3hfYWdjMTAzLAogCS5lbnRyaWVzID0gewotCQl7IDE0NzAwMDAwMCwgNDQwMDAwMDAsIDYyNTAwLCAweDhlLCAweDM5IH0sCi0JCXsgNDE3MDAwMDAwLCA0NDAwMDAwMCwgNjI1MDAsIDB4OGUsIDB4M2EgfSwKLQkJeyA5OTk5OTk5OTksIDQ0MDAwMDAwLCA2MjUwMCwgMHg4ZSwgMHgzYyB9LAorCQl7IDE0NzAwMDAwMCwgNjI1MDAsIDB4OGUsIDB4MzkgfSwKKwkJeyA0MTcwMDAwMDAsIDYyNTAwLCAweDhlLCAweDNhIH0sCisJCXsgOTk5OTk5OTk5LCA2MjUwMCwgMHg4ZSwgMHgzYyB9LAogCX0sCiB9OwogRVhQT1JUX1NZTUJPTChkdmJfcGxsX3Rob21zb25fZHR0NzYxeCk7CkBAIC0xMjUsMTcgKzE0MywxOCBAQAogCS5uYW1lICA9ICJ1bmtub3duIDEiLCAvKiB1c2VkIGJ5IGRudHYgbGl2ZSBkdmItdCAqLwogCS5taW4gICA9IDE3NDAwMDAwMCwKIAkubWF4ICAgPSA4NjIwMDAwMDAsCisJLmlmZnJlcT0gMzYxNjY2NjcsCiAJLmNvdW50ID0gOSwKIAkuZW50cmllcyA9IHsKLQkJeyAgMTUwMDAwMDAwLCAzNjE2NjY2NywgMTY2NjY2LCAweGI0LCAweDAxIH0sCi0JCXsgIDE3MzAwMDAwMCwgMzYxNjY2NjcsIDE2NjY2NiwgMHhiYywgMHgwMSB9LAotCQl7ICAyNTAwMDAwMDAsIDM2MTY2NjY3LCAxNjY2NjYsIDB4YjQsIDB4MDIgfSwKLQkJeyAgNDAwMDAwMDAwLCAzNjE2NjY2NywgMTY2NjY2LCAweGJjLCAweDAyIH0sCi0JCXsgIDQyMDAwMDAwMCwgMzYxNjY2NjcsIDE2NjY2NiwgMHhmNCwgMHgwMiB9LAotCQl7ICA0NzAwMDAwMDAsIDM2MTY2NjY3LCAxNjY2NjYsIDB4ZmMsIDB4MDIgfSwKLQkJeyAgNjAwMDAwMDAwLCAzNjE2NjY2NywgMTY2NjY2LCAweGJjLCAweDA4IH0sCi0JCXsgIDczMDAwMDAwMCwgMzYxNjY2NjcsIDE2NjY2NiwgMHhmNCwgMHgwOCB9LAotCQl7ICA5OTk5OTk5OTksIDM2MTY2NjY3LCAxNjY2NjYsIDB4ZmMsIDB4MDggfSwKKwkJeyAgMTUwMDAwMDAwLCAxNjY2NjcsIDB4YjQsIDB4MDEgfSwKKwkJeyAgMTczMDAwMDAwLCAxNjY2NjcsIDB4YmMsIDB4MDEgfSwKKwkJeyAgMjUwMDAwMDAwLCAxNjY2NjcsIDB4YjQsIDB4MDIgfSwKKwkJeyAgNDAwMDAwMDAwLCAxNjY2NjcsIDB4YmMsIDB4MDIgfSwKKwkJeyAgNDIwMDAwMDAwLCAxNjY2NjcsIDB4ZjQsIDB4MDIgfSwKKwkJeyAgNDcwMDAwMDAwLCAxNjY2NjcsIDB4ZmMsIDB4MDIgfSwKKwkJeyAgNjAwMDAwMDAwLCAxNjY2NjcsIDB4YmMsIDB4MDggfSwKKwkJeyAgNzMwMDAwMDAwLCAxNjY2NjcsIDB4ZjQsIDB4MDggfSwKKwkJeyAgOTk5OTk5OTk5LCAxNjY2NjcsIDB4ZmMsIDB4MDggfSwKIAl9LAogfTsKIEVYUE9SVF9TWU1CT0woZHZiX3BsbF91bmtub3duXzEpOwpAQCAtMTQ3LDExICsxNjYsMTIgQEAKIAkubmFtZSAgPSAiSW5maW5lb24gVFVBNjAxMFhTIiwKIAkubWluICAgPSAgNDQyNTAwMDAsCiAJLm1heCAgID0gODU4MDAwMDAwLAorCS5pZmZyZXE9IDM2MTI1MDAwLAogCS5jb3VudCA9IDMsCiAJLmVudHJpZXMgPSB7Ci0JCXsgIDExNTc1MDAwMCwgMzYxMjUwMDAsIDYyNTAwLCAweDhlLCAweDAzIH0sCi0JCXsgIDQwMzI1MDAwMCwgMzYxMjUwMDAsIDYyNTAwLCAweDhlLCAweDA2IH0sCi0JCXsgIDk5OTk5OTk5OSwgMzYxMjUwMDAsIDYyNTAwLCAweDhlLCAweDg1IH0sCisJCXsgIDExNTc1MDAwMCwgNjI1MDAsIDB4OGUsIDB4MDMgfSwKKwkJeyAgNDAzMjUwMDAwLCA2MjUwMCwgMHg4ZSwgMHgwNiB9LAorCQl7ICA5OTk5OTk5OTksIDYyNTAwLCAweDhlLCAweDg1IH0sCiAJfSwKIH07CiBFWFBPUlRfU1lNQk9MKGR2Yl9wbGxfdHVhNjAxMHhzKTsKQEAgLTE2MSwxMiArMTgxLDEzIEBACiAJLm5hbWUgID0gIlBhbmFzb25pYyBFTlY1N0gxWEQ1IiwKIAkubWluICAgPSAgNDQyNTAwMDAsCiAJLm1heCAgID0gODU4MDAwMDAwLAorCS5pZmZyZXE9IDM2MTI1MDAwLAogCS5jb3VudCA9IDQsCiAJLmVudHJpZXMgPSB7Ci0JCXsgIDE1MzAwMDAwMCwgMzYyOTE2NjYsIDE2NjY2NiwgMHhjMiwgMHg0MSB9LAotCQl7ICA0NzAwMDAwMDAsIDM2MjkxNjY2LCAxNjY2NjYsIDB4YzIsIDB4NDIgfSwKLQkJeyAgNTI2MDAwMDAwLCAzNjI5MTY2NiwgMTY2NjY2LCAweGMyLCAweDg0IH0sCi0JCXsgIDk5OTk5OTk5OSwgMzYyOTE2NjYsIDE2NjY2NiwgMHhjMiwgMHhhNCB9LAorCQl7ICAxNTMwMDAwMDAsIDE2NjY2NywgMHhjMiwgMHg0MSB9LAorCQl7ICA0NzAwMDAwMDAsIDE2NjY2NywgMHhjMiwgMHg0MiB9LAorCQl7ICA1MjYwMDAwMDAsIDE2NjY2NywgMHhjMiwgMHg4NCB9LAorCQl7ICA5OTk5OTk5OTksIDE2NjY2NywgMHhjMiwgMHhhNCB9LAogCX0sCiB9OwogRVhQT1JUX1NZTUJPTChkdmJfcGxsX2VudjU3aDF4ZDUpOwpAQCAtMTg1LDIwICsyMDYsMjEgQEAKIAkubWluICAgPSAgNDQyNTAwMDAsCiAJLm1heCAgID0gODU4MDAwMDAwLAogCS5zZXRidyA9IHRkYTY2NXhfYncsCisJLmlmZnJlcT0gMzYxNjY2NjcsCiAJLmNvdW50ID0gMTIsCiAJLmVudHJpZXMgPSB7Ci0JCXsgICA5MzgzNDAwMCwgMzYyNDkzMzMsIDE2NjY2NywgMHhjYSwgMHg2MSAvKiAwMTEgMCAwIDAgIDAxICovIH0sCi0JCXsgIDEyMzgzNDAwMCwgMzYyNDkzMzMsIDE2NjY2NywgMHhjYSwgMHhhMSAvKiAxMDEgMCAwIDAgIDAxICovIH0sCi0JCXsgIDE2MTAwMDAwMCwgMzYyNDkzMzMsIDE2NjY2NywgMHhjYSwgMHhhMSAvKiAxMDEgMCAwIDAgIDAxICovIH0sCi0JCXsgIDE2MzgzNDAwMCwgMzYyNDkzMzMsIDE2NjY2NywgMHhjYSwgMHhjMiAvKiAxMTAgMCAwIDAgIDEwICovIH0sCi0JCXsgIDI1MzgzNDAwMCwgMzYyNDkzMzMsIDE2NjY2NywgMHhjYSwgMHg2MiAvKiAwMTEgMCAwIDAgIDEwICovIH0sCi0JCXsgIDM4MzgzNDAwMCwgMzYyNDkzMzMsIDE2NjY2NywgMHhjYSwgMHhhMiAvKiAxMDEgMCAwIDAgIDEwICovIH0sCi0JCXsgIDQ0MzgzNDAwMCwgMzYyNDkzMzMsIDE2NjY2NywgMHhjYSwgMHhjMiAvKiAxMTAgMCAwIDAgIDEwICovIH0sCi0JCXsgIDQ0NDAwMDAwMCwgMzYyNDkzMzMsIDE2NjY2NywgMHhjYSwgMHhjNCAvKiAxMTAgMCAwIDEgIDAwICovIH0sCi0JCXsgIDU4MzgzNDAwMCwgMzYyNDkzMzMsIDE2NjY2NywgMHhjYSwgMHg2NCAvKiAwMTEgMCAwIDEgIDAwICovIH0sCi0JCXsgIDc5MzgzNDAwMCwgMzYyNDkzMzMsIDE2NjY2NywgMHhjYSwgMHhhNCAvKiAxMDEgMCAwIDEgIDAwICovIH0sCi0JCXsgIDQ0NDgzNDAwMCwgMzYyNDkzMzMsIDE2NjY2NywgMHhjYSwgMHhjNCAvKiAxMTAgMCAwIDEgIDAwICovIH0sCi0JCXsgIDg2MTAwMDAwMCwgMzYyNDkzMzMsIDE2NjY2NywgMHhjYSwgMHhlNCAvKiAxMTEgMCAwIDEgIDAwICovIH0sCisJCXsgICA5MzgzNDAwMCwgMTY2NjY3LCAweGNhLCAweDYxIC8qIDAxMSAwIDAgMCAgMDEgKi8gfSwKKwkJeyAgMTIzODM0MDAwLCAxNjY2NjcsIDB4Y2EsIDB4YTEgLyogMTAxIDAgMCAwICAwMSAqLyB9LAorCQl7ICAxNjEwMDAwMDAsIDE2NjY2NywgMHhjYSwgMHhhMSAvKiAxMDEgMCAwIDAgIDAxICovIH0sCisJCXsgIDE2MzgzNDAwMCwgMTY2NjY3LCAweGNhLCAweGMyIC8qIDExMCAwIDAgMCAgMTAgKi8gfSwKKwkJeyAgMjUzODM0MDAwLCAxNjY2NjcsIDB4Y2EsIDB4NjIgLyogMDExIDAgMCAwICAxMCAqLyB9LAorCQl7ICAzODM4MzQwMDAsIDE2NjY2NywgMHhjYSwgMHhhMiAvKiAxMDEgMCAwIDAgIDEwICovIH0sCisJCXsgIDQ0MzgzNDAwMCwgMTY2NjY3LCAweGNhLCAweGMyIC8qIDExMCAwIDAgMCAgMTAgKi8gfSwKKwkJeyAgNDQ0MDAwMDAwLCAxNjY2NjcsIDB4Y2EsIDB4YzQgLyogMTEwIDAgMCAxICAwMCAqLyB9LAorCQl7ICA1ODM4MzQwMDAsIDE2NjY2NywgMHhjYSwgMHg2NCAvKiAwMTEgMCAwIDEgIDAwICovIH0sCisJCXsgIDc5MzgzNDAwMCwgMTY2NjY3LCAweGNhLCAweGE0IC8qIDEwMSAwIDAgMSAgMDAgKi8gfSwKKwkJeyAgNDQ0ODM0MDAwLCAxNjY2NjcsIDB4Y2EsIDB4YzQgLyogMTEwIDAgMCAxICAwMCAqLyB9LAorCQl7ICA4NjEwMDAwMDAsIDE2NjY2NywgMHhjYSwgMHhlNCAvKiAxMTEgMCAwIDEgIDAwICovIH0sCiAJfQogfTsKIEVYUE9SVF9TWU1CT0woZHZiX3BsbF90ZGE2NjV4KTsKQEAgLTIxNiwxMiArMjM4LDEzIEBACiAJLm5hbWUgID0gIkluZmluZW9uIFRVQTYwMzQiLAogCS5taW4gICA9ICA0NDI1MDAwMCwKIAkubWF4ICAgPSA4NTgwMDAwMDAsCisJLmlmZnJlcT0gMzYxNjY2NjcsCiAJLmNvdW50ID0gMywKIAkuc2V0YncgPSB0dWE2MDM0X2J3LAogCS5lbnRyaWVzID0gewotCQl7ICAxNzQ1MDAwMDAsIDM2MTY2NjY3LCA2MjUwMCwgMHhjZSwgMHgwMSB9LAotCQl7ICAyMzAwMDAwMDAsIDM2MTY2NjY3LCA2MjUwMCwgMHhjZSwgMHgwMiB9LAotCQl7ICA5OTk5OTk5OTksIDM2MTY2NjY3LCA2MjUwMCwgMHhjZSwgMHgwNCB9LAorCQl7ICAxNzQ1MDAwMDAsIDYyNTAwLCAweGNlLCAweDAxIH0sCisJCXsgIDIzMDAwMDAwMCwgNjI1MDAsIDB4Y2UsIDB4MDIgfSwKKwkJeyAgOTk5OTk5OTk5LCA2MjUwMCwgMHhjZSwgMHgwNCB9LAogCX0sCiB9OwogRVhQT1JUX1NZTUJPTChkdmJfcGxsX3R1YTYwMzQpOwpAQCAtMjMzLDExICsyNTYsMTMgQEAKIAkubmFtZSAgPSAiTEcgVERWUy1IMDZ4RiIsCiAJLm1pbiAgID0gIDU0MDAwMDAwLAogCS5tYXggICA9IDg2MzAwMDAwMCwKKwkuaWZmcmVxPSA0NDAwMDAwMCwKKwkuaW5pdGRhdGEgPSB0dWE2MDN4X2FnYzEwMywKIAkuY291bnQgPSAzLAogCS5lbnRyaWVzID0gewotCQl7ICAxNjUwMDAwMDAsIDQ0MDAwMDAwLCA2MjUwMCwgMHhjZSwgMHgwMSB9LAotCQl7ICA0NTAwMDAwMDAsIDQ0MDAwMDAwLCA2MjUwMCwgMHhjZSwgMHgwMiB9LAotCQl7ICA5OTk5OTk5OTksIDQ0MDAwMDAwLCA2MjUwMCwgMHhjZSwgMHgwNCB9LAorCQl7ICAxNjUwMDAwMDAsIDYyNTAwLCAweGNlLCAweDAxIH0sCisJCXsgIDQ1MDAwMDAwMCwgNjI1MDAsIDB4Y2UsIDB4MDIgfSwKKwkJeyAgOTk5OTk5OTk5LCA2MjUwMCwgMHhjZSwgMHgwNCB9LAogCX0sCiB9OwogRVhQT1JUX1NZTUJPTChkdmJfcGxsX2xnX3RkdnNfaDA2eGYpOwpAQCAtMjU1LDE2ICsyODAsMTcgQEAKIAkubmFtZSA9ICJQaGlsaXBzIEZNRDEyMTZNRSIsCiAJLm1pbiA9IDUwODcwMDAwLAogCS5tYXggPSA4NTgwMDAwMDAsCisJLmlmZnJlcT0gMzYxMjUwMDAsCiAJLnNldGJ3ID0gZm1kMTIxNm1lX2J3LAogCS5jb3VudCA9IDcsCiAJLmVudHJpZXMgPSB7Ci0JCXsgMTQzODcwMDAwLCAzNjIxMzMzMywgMTY2NjY3LCAweGJjLCAweDQxIH0sCi0JCXsgMTU4ODcwMDAwLCAzNjIxMzMzMywgMTY2NjY3LCAweGY0LCAweDQxIH0sCi0JCXsgMzI5ODcwMDAwLCAzNjIxMzMzMywgMTY2NjY3LCAweGJjLCAweDQyIH0sCi0JCXsgNDQxODcwMDAwLCAzNjIxMzMzMywgMTY2NjY3LCAweGY0LCAweDQyIH0sCi0JCXsgNjI1ODcwMDAwLCAzNjIxMzMzMywgMTY2NjY3LCAweGJjLCAweDQ0IH0sCi0JCXsgODAzODcwMDAwLCAzNjIxMzMzMywgMTY2NjY3LCAweGY0LCAweDQ0IH0sCi0JCXsgOTk5OTk5OTk5LCAzNjIxMzMzMywgMTY2NjY3LCAweGZjLCAweDQ0IH0sCisJCXsgMTQzODcwMDAwLCAxNjY2NjcsIDB4YmMsIDB4NDEgfSwKKwkJeyAxNTg4NzAwMDAsIDE2NjY2NywgMHhmNCwgMHg0MSB9LAorCQl7IDMyOTg3MDAwMCwgMTY2NjY3LCAweGJjLCAweDQyIH0sCisJCXsgNDQxODcwMDAwLCAxNjY2NjcsIDB4ZjQsIDB4NDIgfSwKKwkJeyA2MjU4NzAwMDAsIDE2NjY2NywgMHhiYywgMHg0NCB9LAorCQl7IDgwMzg3MDAwMCwgMTY2NjY3LCAweGY0LCAweDQ0IH0sCisJCXsgOTk5OTk5OTk5LCAxNjY2NjcsIDB4ZmMsIDB4NDQgfSwKIAl9CiB9OwogRVhQT1JUX1NZTUJPTChkdmJfcGxsX2ZtZDEyMTZtZSk7CkBAIC0yODIsMTMgKzMwOCwxNCBAQAogCS5uYW1lID0gIkFMUFMgVERFRDQiLAogCS5taW4gPSA0NzAwMDAwMCwKIAkubWF4ID0gODYzMDAwMDAwLAorCS5pZmZyZXE9IDM2MTY2NjY3LAogCS5zZXRidyA9IHRkZWQ0X2J3LAogCS5jb3VudCA9IDQsCiAJLmVudHJpZXMgPSB7Ci0JCXsgMTUzMDAwMDAwLCAzNjE2NjY2NywgMTY2NjY3LCAweDg1LCAweDAxIH0sCi0JCXsgNDcwMDAwMDAwLCAzNjE2NjY2NywgMTY2NjY3LCAweDg1LCAweDAyIH0sCi0JCXsgODIzMDAwMDAwLCAzNjE2NjY2NywgMTY2NjY3LCAweDg1LCAweDA4IH0sCi0JCXsgOTk5OTk5OTk5LCAzNjE2NjY2NywgMTY2NjY3LCAweDg1LCAweDg4IH0sCisJCXsgMTUzMDAwMDAwLCAxNjY2NjcsIDB4ODUsIDB4MDEgfSwKKwkJeyA0NzAwMDAwMDAsIDE2NjY2NywgMHg4NSwgMHgwMiB9LAorCQl7IDgyMzAwMDAwMCwgMTY2NjY3LCAweDg1LCAweDA4IH0sCisJCXsgOTk5OTk5OTk5LCAxNjY2NjcsIDB4ODUsIDB4ODggfSwKIAl9CiB9OwogRVhQT1JUX1NZTUJPTChkdmJfcGxsX3RkZWQ0KTsKQEAgLTMwMCwxMiArMzI3LDEzIEBACiAJLm5hbWUgPSAiQUxQUyBUREhVMiIsCiAJLm1pbiA9IDU0MDAwMDAwLAogCS5tYXggPSA4NjQwMDAwMDAsCisJLmlmZnJlcT0gNDQwMDAwMDAsCiAJLmNvdW50ID0gNCwKIAkuZW50cmllcyA9IHsKLQkJeyAxNjIwMDAwMDAsIDQ0MDAwMDAwLCA2MjUwMCwgMHg4NSwgMHgwMSB9LAotCQl7IDQyNjAwMDAwMCwgNDQwMDAwMDAsIDYyNTAwLCAweDg1LCAweDAyIH0sCi0JCXsgNzgyMDAwMDAwLCA0NDAwMDAwMCwgNjI1MDAsIDB4ODUsIDB4MDggfSwKLQkJeyA5OTk5OTk5OTksIDQ0MDAwMDAwLCA2MjUwMCwgMHg4NSwgMHg4OCB9LAorCQl7IDE2MjAwMDAwMCwgNjI1MDAsIDB4ODUsIDB4MDEgfSwKKwkJeyA0MjYwMDAwMDAsIDYyNTAwLCAweDg1LCAweDAyIH0sCisJCXsgNzgyMDAwMDAwLCA2MjUwMCwgMHg4NSwgMHgwOCB9LAorCQl7IDk5OTk5OTk5OSwgNjI1MDAsIDB4ODUsIDB4ODggfSwKIAl9CiB9OwogRVhQT1JUX1NZTUJPTChkdmJfcGxsX3RkaHUyKTsKQEAgLTMxNywxMSArMzQ1LDEyIEBACiAJLm5hbWUgID0gIlBoaWxpcHMgVFVWMTIzNkQiLAogCS5taW4gICA9ICA1NDAwMDAwMCwKIAkubWF4ICAgPSA4NjQwMDAwMDAsCisJLmlmZnJlcT0gNDQwMDAwMDAsCiAJLmNvdW50ID0gMywKIAkuZW50cmllcyA9IHsKLQkJeyAxNTcyNTAwMDAsIDQ0MDAwMDAwLCA2MjUwMCwgMHhjNiwgMHg0MSB9LAotCQl7IDQ1NDAwMDAwMCwgNDQwMDAwMDAsIDYyNTAwLCAweGM2LCAweDQyIH0sCi0JCXsgOTk5OTk5OTk5LCA0NDAwMDAwMCwgNjI1MDAsIDB4YzYsIDB4NDQgfSwKKwkJeyAxNTcyNTAwMDAsIDYyNTAwLCAweGM2LCAweDQxIH0sCisJCXsgNDU0MDAwMDAwLCA2MjUwMCwgMHhjNiwgMHg0MiB9LAorCQl7IDk5OTk5OTk5OSwgNjI1MDAsIDB4YzYsIDB4NDQgfSwKIAl9LAogfTsKIEVYUE9SVF9TWU1CT0woZHZiX3BsbF90dXYxMjM2ZCk7CkBAIC0zMzMsMTQgKzM2MiwxNSBAQAogCS5uYW1lID0gIlNhbXN1bmcgVEJNVjMwMTExSU4gLyBUQk1WMzA3MTJJTjEiLAogCS5taW4gPSA1NDAwMDAwMCwKIAkubWF4ID0gODYwMDAwMDAwLAorCS5pZmZyZXE9IDQ0MDAwMDAwLAogCS5jb3VudCA9IDYsCiAJLmVudHJpZXMgPSB7Ci0JCXsgMTcyMDAwMDAwLCA0NDAwMDAwMCwgMTY2NjY2LCAweGI0LCAweDAxIH0sCi0JCXsgMjE0MDAwMDAwLCA0NDAwMDAwMCwgMTY2NjY2LCAweGI0LCAweDAyIH0sCi0JCXsgNDY3MDAwMDAwLCA0NDAwMDAwMCwgMTY2NjY2LCAweGJjLCAweDAyIH0sCi0JCXsgNzIxMDAwMDAwLCA0NDAwMDAwMCwgMTY2NjY2LCAweGJjLCAweDA4IH0sCi0JCXsgODQxMDAwMDAwLCA0NDAwMDAwMCwgMTY2NjY2LCAweGY0LCAweDA4IH0sCi0JCXsgOTk5OTk5OTk5LCA0NDAwMDAwMCwgMTY2NjY2LCAweGZjLCAweDAyIH0sCisJCXsgMTcyMDAwMDAwLCAxNjY2NjcsIDB4YjQsIDB4MDEgfSwKKwkJeyAyMTQwMDAwMDAsIDE2NjY2NywgMHhiNCwgMHgwMiB9LAorCQl7IDQ2NzAwMDAwMCwgMTY2NjY3LCAweGJjLCAweDAyIH0sCisJCXsgNzIxMDAwMDAwLCAxNjY2NjcsIDB4YmMsIDB4MDggfSwKKwkJeyA4NDEwMDAwMDAsIDE2NjY2NywgMHhmNCwgMHgwOCB9LAorCQl7IDk5OTk5OTk5OSwgMTY2NjY3LCAweGZjLCAweDAyIH0sCiAJfQogfTsKIEVYUE9SVF9TWU1CT0woZHZiX3BsbF9zYW1zdW5nX3RibXYpOwpAQCAtMzUyLDEyICszODIsMTMgQEAKIAkubmFtZSAgPSAiUGhpbGlwcyBTRDE4NzgiLAogCS5taW4gICA9ICA5NTAwMDAsCiAJLm1heCAgID0gMjE1MDAwMCwKKwkuaWZmcmVxPSAyNDksIC8qIHplcm8tSUYsIG9mZnNldCAyNDkgaXMgdG8gcm91bmQgdXAgKi8KIAkuY291bnQgPSA0LAogCS5lbnRyaWVzID0gewotCQl7IDEyNTAwMDAsIDQ5OSwgNTAwLCAweGM0LCAweDAwfSwKLQkJeyAxNTUwMDAwLCA0OTksIDUwMCwgMHhjNCwgMHg0MH0sCi0JCXsgMjA1MDAwMCwgNDk5LCA1MDAsIDB4YzQsIDB4ODB9LAotCQl7IDIxNTAwMDAsIDQ5OSwgNTAwLCAweGM0LCAweGMwfSwKKwkJeyAxMjUwMDAwLCA1MDAsIDB4YzQsIDB4MDB9LAorCQl7IDE1NTAwMDAsIDUwMCwgMHhjNCwgMHg0MH0sCisJCXsgMjA1MDAwMCwgNTAwLCAweGM0LCAweDgwfSwKKwkJeyAyMTUwMDAwLCA1MDAsIDB4YzQsIDB4YzB9LAogCX0sCiB9OwogRVhQT1JUX1NZTUJPTChkdmJfcGxsX3BoaWxpcHNfc2QxODc4X3RkYTgyNjEpOwpAQCAtMzg4LDE4ICs0MTksMTkgQEAKIAkubmFtZSAgPSAiUGhpbGlwcyBURDEzMTYiLAogCS5taW4gICA9ICA4NzAwMDAwMCwKIAkubWF4ICAgPSA4OTUwMDAwMDAsCisJLmlmZnJlcT0gMzYxNjY2NjcsCiAJLnNldGJ3ID0gdGQxMzE2X2J3LAogCS5jb3VudCA9IDksCiAJLmVudHJpZXMgPSB7Ci0JCXsgIDkzODM0MDAwLCAzNjE2NjAwMCwgMTY2NjY2LCAweGNhLCAweDYwfSwKLQkJeyAxMjM4MzQwMDAsIDM2MTY2MDAwLCAxNjY2NjYsIDB4Y2EsIDB4YTB9LAotCQl7IDE2MzgzNDAwMCwgMzYxNjYwMDAsIDE2NjY2NiwgMHhjYSwgMHhjMH0sCi0JCXsgMjUzODM0MDAwLCAzNjE2NjAwMCwgMTY2NjY2LCAweGNhLCAweDYwfSwKLQkJeyAzODM4MzQwMDAsIDM2MTY2MDAwLCAxNjY2NjYsIDB4Y2EsIDB4YTB9LAotCQl7IDQ0MzgzNDAwMCwgMzYxNjYwMDAsIDE2NjY2NiwgMHhjYSwgMHhjMH0sCi0JCXsgNTgzODM0MDAwLCAzNjE2NjAwMCwgMTY2NjY2LCAweGNhLCAweDYwfSwKLQkJeyA3OTM4MzQwMDAsIDM2MTY2MDAwLCAxNjY2NjYsIDB4Y2EsIDB4YTB9LAotCQl7IDg1ODgzNDAwMCwgMzYxNjYwMDAsIDE2NjY2NiwgMHhjYSwgMHhlMH0sCisJCXsgIDkzODM0MDAwLCAxNjY2NjcsIDB4Y2EsIDB4NjB9LAorCQl7IDEyMzgzNDAwMCwgMTY2NjY3LCAweGNhLCAweGEwfSwKKwkJeyAxNjM4MzQwMDAsIDE2NjY2NywgMHhjYSwgMHhjMH0sCisJCXsgMjUzODM0MDAwLCAxNjY2NjcsIDB4Y2EsIDB4NjB9LAorCQl7IDM4MzgzNDAwMCwgMTY2NjY3LCAweGNhLCAweGEwfSwKKwkJeyA0NDM4MzQwMDAsIDE2NjY2NywgMHhjYSwgMHhjMH0sCisJCXsgNTgzODM0MDAwLCAxNjY2NjcsIDB4Y2EsIDB4NjB9LAorCQl7IDc5MzgzNDAwMCwgMTY2NjY3LCAweGNhLCAweGEwfSwKKwkJeyA4NTg4MzQwMDAsIDE2NjY2NywgMHhjYSwgMHhlMH0sCiAJfSwKIH07CiBFWFBPUlRfU1lNQk9MKGR2Yl9wbGxfcGhpbGlwc190ZDEzMTYpOwpAQCAtNDA5LDE1ICs0NDEsNDEgQEAKIAkubmFtZSA9ICJUaG9tc29uIEZFNjYwMCIsCiAJLm1pbiA9ICA0NDI1MDAwMCwKIAkubWF4ID0gODU4MDAwMDAwLAorCS5pZmZyZXE9IDM2MTI1MDAwLAogCS5jb3VudCA9IDQsCiAJLmVudHJpZXMgPSB7Ci0JCXsgMjUwMDAwMDAwLCAzNjIxMzMzMywgMTY2NjY3LCAweGI0LCAweDEyIH0sCi0JCXsgNDU1MDAwMDAwLCAzNjIxMzMzMywgMTY2NjY3LCAweGZlLCAweDExIH0sCi0JCXsgNzc1NTAwMDAwLCAzNjIxMzMzMywgMTY2NjY3LCAweGJjLCAweDE4IH0sCi0JCXsgOTk5OTk5OTk5LCAzNjIxMzMzMywgMTY2NjY3LCAweGY0LCAweDE4IH0sCisJCXsgMjUwMDAwMDAwLCAxNjY2NjcsIDB4YjQsIDB4MTIgfSwKKwkJeyA0NTUwMDAwMDAsIDE2NjY2NywgMHhmZSwgMHgxMSB9LAorCQl7IDc3NTUwMDAwMCwgMTY2NjY3LCAweGJjLCAweDE4IH0sCisJCXsgOTk5OTk5OTk5LCAxNjY2NjcsIDB4ZjQsIDB4MTggfSwKIAl9CiB9OwogRVhQT1JUX1NZTUJPTChkdmJfcGxsX3Rob21zb25fZmU2NjAwKTsKK3N0YXRpYyB2b2lkIG9wZXJhMV9idyh1OCAqYnVmLCB1MzIgZnJlcSwgaW50IGJhbmR3aWR0aCkKK3sKKwlpZiAoYmFuZHdpZHRoID09IEJBTkRXSURUSF84X01IWikKKwkJYnVmWzJdIHw9IDB4MDg7Cit9CisKK3N0cnVjdCBkdmJfcGxsX2Rlc2MgZHZiX3BsbF9vcGVyYTEgPSB7CisJLm5hbWUgID0gIk9wZXJhIFR1bmVyIiwKKwkubWluICAgPSAgOTAwMDAwLAorCS5tYXggICA9IDIyNTAwMDAsCisJLmlmZnJlcT0gMCwKKwkuc2V0YncgPSBvcGVyYTFfYncsCisJLmNvdW50ID0gOCwKKwkuZW50cmllcyA9IHsKKwkJeyAxMDY0MDAwLCA1MDAsIDB4ZTUsIDB4YzYgfSwKKwkJeyAxMTY5MDAwLCA1MDAsIDB4ZTUsIDB4ZTYgfSwKKwkJeyAxMjk5MDAwLCA1MDAsIDB4ZTUsIDB4MjQgfSwKKwkJeyAxNDQ0MDAwLCA1MDAsIDB4ZTUsIDB4NDQgfSwKKwkJeyAxNjA2MDAwLCA1MDAsIDB4ZTUsIDB4NjQgfSwKKwkJeyAxNzc3MDAwLCA1MDAsIDB4ZTUsIDB4ODQgfSwKKwkJeyAxOTQxMDAwLCA1MDAsIDB4ZTUsIDB4YTQgfSwKKwkJeyAyMjUwMDAwLCA1MDAsIDB4ZTUsIDB4YzQgfSwKKwl9Cit9OworRVhQT1JUX1NZTUJPTChkdmJfcGxsX29wZXJhMSk7CiAKIHN0cnVjdCBkdmJfcGxsX3ByaXYgewogCS8qIGkyYyBkZXRhaWxzICovCkBAIC00NTksNyArNTE3LDggQEAKIAlpZiAoaSA9PSBkZXNjLT5jb3VudCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlkaXYgPSAoZnJlcSArIGRlc2MtPmVudHJpZXNbaV0ub2Zmc2V0KSAvIGRlc2MtPmVudHJpZXNbaV0uc3RlcHNpemU7CisJZGl2ID0gKGZyZXEgKyBkZXNjLT5pZmZyZXEgKyBkZXNjLT5lbnRyaWVzW2ldLnN0ZXBzaXplLzIpIC8KKwkgICAgICBkZXNjLT5lbnRyaWVzW2ldLnN0ZXBzaXplOwogCWJ1ZlswXSA9IGRpdiA+PiA4OwogCWJ1ZlsxXSA9IGRpdiAmIDB4ZmY7CiAJYnVmWzJdID0gZGVzYy0+ZW50cmllc1tpXS5jb25maWc7CkBAIC00NzMsNyArNTMyLDcgQEAKIAkJICAgICAgIGRlc2MtPm5hbWUsIGRpdiwgYnVmWzBdLCBidWZbMV0sIGJ1ZlsyXSwgYnVmWzNdKTsKIAogCS8vIGNhbGN1bGF0ZSB0aGUgZnJlcXVlbmN5IHdlIHNldCBpdCB0bwotCXJldHVybiAoZGl2ICogZGVzYy0+ZW50cmllc1tpXS5zdGVwc2l6ZSkgLSBkZXNjLT5lbnRyaWVzW2ldLm9mZnNldDsKKwlyZXR1cm4gKGRpdiAqIGRlc2MtPmVudHJpZXNbaV0uc3RlcHNpemUpIC0gZGVzYy0+aWZmcmVxOwogfQogRVhQT1JUX1NZTUJPTChkdmJfcGxsX2NvbmZpZ3VyZSk7CiAKQEAgLTQ4NywzNSArNTQ2LDI3IEBACiBzdGF0aWMgaW50IGR2Yl9wbGxfc2xlZXAoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCiB7CiAJc3RydWN0IGR2Yl9wbGxfcHJpdiAqcHJpdiA9IGZlLT50dW5lcl9wcml2OwotCXU4IGJ1Zls0XTsKLQlzdHJ1Y3QgaTJjX21zZyBtc2cgPQotCQl7IC5hZGRyID0gcHJpdi0+cGxsX2kyY19hZGRyZXNzLCAuZmxhZ3MgPSAwLAotCQkgIC5idWYgPSBidWYsIC5sZW4gPSBzaXplb2YoYnVmKSB9OwotCWludCBpOwotCWludCByZXN1bHQ7CiAKIAlpZiAocHJpdi0+aTJjID09IE5VTEwpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JZm9yIChpID0gMDsgaSA8IHByaXYtPnBsbF9kZXNjLT5jb3VudDsgaSsrKSB7Ci0JCWlmIChwcml2LT5wbGxfZGVzYy0+ZW50cmllc1tpXS5saW1pdCA9PSAwKQotCQkJYnJlYWs7Ci0JfQotCWlmIChpID09IHByaXYtPnBsbF9kZXNjLT5jb3VudCkKKwlpZiAocHJpdi0+cGxsX2Rlc2MtPnNsZWVwZGF0YSkgeworCQlzdHJ1Y3QgaTJjX21zZyBtc2cgPSB7IC5mbGFncyA9IDAsCisJCQkuYWRkciA9IHByaXYtPnBsbF9pMmNfYWRkcmVzcywKKwkJCS5idWYgPSBwcml2LT5wbGxfZGVzYy0+c2xlZXBkYXRhICsgMSwKKwkJCS5sZW4gPSBwcml2LT5wbGxfZGVzYy0+c2xlZXBkYXRhWzBdIH07CisKKwkJaW50IHJlc3VsdDsKKworCQlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKKwkJaWYgKChyZXN1bHQgPSBpMmNfdHJhbnNmZXIocHJpdi0+aTJjLCAmbXNnLCAxKSkgIT0gMSkgeworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQogCQlyZXR1cm4gMDsKLQotCWJ1ZlswXSA9IDA7Ci0JYnVmWzFdID0gMDsKLQlidWZbMl0gPSBwcml2LT5wbGxfZGVzYy0+ZW50cmllc1tpXS5jb25maWc7Ci0JYnVmWzNdID0gcHJpdi0+cGxsX2Rlc2MtPmVudHJpZXNbaV0uY2I7Ci0KLQlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQotCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDEpOwotCWlmICgocmVzdWx0ID0gaTJjX3RyYW5zZmVyKHByaXYtPmkyYywgJm1zZywgMSkpICE9IDEpIHsKLQkJcmV0dXJuIHJlc3VsdDsKIAl9Ci0KLQlyZXR1cm4gMDsKKwkvKiBTaG91bGRuJ3QgYmUgY2FsbGVkIHdoZW4gaW5pdGRhdGEgaXMgTlVMTCwgbWF5YmUgQlVHKCk/ICovCisJcmV0dXJuIC1FSU5WQUw7CiB9CiAKIHN0YXRpYyBpbnQgZHZiX3BsbF9zZXRfcGFyYW1zKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLApAQCAtNTk5LDkgKzY1MCwzNSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGR2Yl9wbGxfaW5pdChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3sKKwlzdHJ1Y3QgZHZiX3BsbF9wcml2ICpwcml2ID0gZmUtPnR1bmVyX3ByaXY7CisKKwlpZiAocHJpdi0+aTJjID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHByaXYtPnBsbF9kZXNjLT5pbml0ZGF0YSkgeworCQlzdHJ1Y3QgaTJjX21zZyBtc2cgPSB7IC5mbGFncyA9IDAsCisJCQkuYWRkciA9IHByaXYtPnBsbF9pMmNfYWRkcmVzcywKKwkJCS5idWYgPSBwcml2LT5wbGxfZGVzYy0+aW5pdGRhdGEgKyAxLAorCQkJLmxlbiA9IHByaXYtPnBsbF9kZXNjLT5pbml0ZGF0YVswXSB9OworCisJCWludCByZXN1bHQ7CisJCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDEpOworCQlpZiAoKHJlc3VsdCA9IGkyY190cmFuc2Zlcihwcml2LT5pMmMsICZtc2csIDEpKSAhPSAxKSB7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisJCXJldHVybiAwOworCX0KKwkvKiBTaG91bGRuJ3QgYmUgY2FsbGVkIHdoZW4gaW5pdGRhdGEgaXMgTlVMTCwgbWF5YmUgQlVHKCk/ICovCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgZHZiX3R1bmVyX29wcyBkdmJfcGxsX3R1bmVyX29wcyA9IHsKIAkucmVsZWFzZSA9IGR2Yl9wbGxfcmVsZWFzZSwKIAkuc2xlZXAgPSBkdmJfcGxsX3NsZWVwLAorCS5pbml0ID0gZHZiX3BsbF9pbml0LAogCS5zZXRfcGFyYW1zID0gZHZiX3BsbF9zZXRfcGFyYW1zLAogCS5jYWxjX3JlZ3MgPSBkdmJfcGxsX2NhbGNfcmVncywKIAkuZ2V0X2ZyZXF1ZW5jeSA9IGR2Yl9wbGxfZ2V0X2ZyZXF1ZW5jeSwKQEAgLTY0MCw5ICs3MTcsMTQgQEAKIAltZW1jcHkoJmZlLT5vcHMudHVuZXJfb3BzLCAmZHZiX3BsbF90dW5lcl9vcHMsCiAJICAgICAgIHNpemVvZihzdHJ1Y3QgZHZiX3R1bmVyX29wcykpOwogCi0Jc3RybmNweShmZS0+b3BzLnR1bmVyX29wcy5pbmZvLm5hbWUsIGRlc2MtPm5hbWUsIDEyOCk7CisJc3RybmNweShmZS0+b3BzLnR1bmVyX29wcy5pbmZvLm5hbWUsIGRlc2MtPm5hbWUsCisJCXNpemVvZihmZS0+b3BzLnR1bmVyX29wcy5pbmZvLm5hbWUpKTsKIAlmZS0+b3BzLnR1bmVyX29wcy5pbmZvLmZyZXF1ZW5jeV9taW4gPSBkZXNjLT5taW47CiAJZmUtPm9wcy50dW5lcl9vcHMuaW5mby5mcmVxdWVuY3lfbWluID0gZGVzYy0+bWF4OworCWlmICghZGVzYy0+aW5pdGRhdGEpCisJCWZlLT5vcHMudHVuZXJfb3BzLmluaXQgPSBOVUxMOworCWlmICghZGVzYy0+c2xlZXBkYXRhKQorCQlmZS0+b3BzLnR1bmVyX29wcy5zbGVlcCA9IE5VTEw7CiAKIAlmZS0+dHVuZXJfcHJpdiA9IHByaXY7CiAJcmV0dXJuIGZlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2R2Yi1wbGwuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kdmItcGxsLmgKaW5kZXggNjgxMTg2YS4uNTIwOWY0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2R2Yi1wbGwuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZHZiLXBsbC5oCkBAIC0xMiwxMSArMTIsMTMgQEAKIAljaGFyICpuYW1lOwogCXUzMiAgbWluOwogCXUzMiAgbWF4OworCXUzMiAgaWZmcmVxOwogCXZvaWQgKCpzZXRidykodTggKmJ1ZiwgdTMyIGZyZXEsIGludCBiYW5kd2lkdGgpOworCXU4ICAgKmluaXRkYXRhOworCXU4ICAgKnNsZWVwZGF0YTsKIAlpbnQgIGNvdW50OwogCXN0cnVjdCB7CiAJCXUzMiBsaW1pdDsKLQkJdTMyIG9mZnNldDsKIAkJdTMyIHN0ZXBzaXplOwogCQl1OCAgY29uZmlnOwogCQl1OCAgY2I7CkBAIC00Niw2ICs0OCw3IEBACiBleHRlcm4gc3RydWN0IGR2Yl9wbGxfZGVzYyBkdmJfcGxsX3BoaWxpcHNfdGQxMzE2OwogCiBleHRlcm4gc3RydWN0IGR2Yl9wbGxfZGVzYyBkdmJfcGxsX3Rob21zb25fZmU2NjAwOworZXh0ZXJuIHN0cnVjdCBkdmJfcGxsX2Rlc2MgZHZiX3BsbF9vcGVyYTE7CiAKIGV4dGVybiBpbnQgZHZiX3BsbF9jb25maWd1cmUoc3RydWN0IGR2Yl9wbGxfZGVzYyAqZGVzYywgdTggKmJ1ZiwKIAkJCSAgICAgdTMyIGZyZXEsIGludCBiYW5kd2lkdGgpOwpAQCAtNTksOSArNjIsMjAgQEAKICAqIEBwYXJhbSBkZXNjIGR2Yl9wbGxfZGVzYyB0byB1c2UuCiAgKiBAcmV0dXJuIEZyb250ZW5kIHBvaW50ZXIgb24gc3VjY2VzcywgTlVMTCBvbiBmYWlsdXJlCiAgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19EVkJfUExMKSB8fCAoZGVmaW5lZChDT05GSUdfRFZCX1BMTF9NT0RVTEUpICYmIGRlZmluZWQoTU9EVUxFKSkKIGV4dGVybiBzdHJ1Y3QgZHZiX2Zyb250ZW5kICpkdmJfcGxsX2F0dGFjaChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKIAkJCQkJICAgaW50IHBsbF9hZGRyLAogCQkJCQkgICBzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYywKIAkJCQkJICAgc3RydWN0IGR2Yl9wbGxfZGVzYyAqZGVzYyk7CisjZWxzZQorc3RhdGljIGlubGluZSBzdHJ1Y3QgZHZiX2Zyb250ZW5kICpkdmJfcGxsX2F0dGFjaChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwkJCQkJICAgaW50IHBsbF9hZGRyLAorCQkJCQkgICBzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYywKKwkJCQkJICAgc3RydWN0IGR2Yl9wbGxfZGVzYyAqZGVzYykKK3sKKwlwcmludGsoS0VSTl9XQVJOSU5HICIlczogZHJpdmVyIGRpc2FibGVkIGJ5IEtjb25maWdcbiIsIF9fRlVOQ1RJT05fXyk7CisJcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbGdkdDMzMHguYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9sZ2R0MzMweC5jCmluZGV4IDY4YWFkMGYuLmUyNTI4NmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9sZ2R0MzMweC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9sZ2R0MzMweC5jCkBAIC00NzUsNyArNDc1LDcgQEAKIAkJCSpzdGF0dXMgfD0gRkVfSEFTX0NBUlJJRVI7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXByaW50aygiS0VSTl9XQVJOSU5HIGxnZHQzMzB4OiAlczogTW9kdWxhdGlvbiBzZXQgdG8gdW5zdXBwb3J0ZWQgdmFsdWVcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImxnZHQzMzB4OiAlczogTW9kdWxhdGlvbiBzZXQgdG8gdW5zdXBwb3J0ZWQgdmFsdWVcbiIsIF9fRlVOQ1RJT05fXyk7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC01MzQsNyArNTM0LDcgQEAKIAkJfQogCQlicmVhazsKIAlkZWZhdWx0OgotCQlwcmludGsoIktFUk5fV0FSTklORyBsZ2R0MzMweDogJXM6IE1vZHVsYXRpb24gc2V0IHRvIHVuc3VwcG9ydGVkIHZhbHVlXG4iLCBfX0ZVTkNUSU9OX18pOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJsZ2R0MzMweDogJXM6IE1vZHVsYXRpb24gc2V0IHRvIHVuc3VwcG9ydGVkIHZhbHVlXG4iLCBfX0ZVTkNUSU9OX18pOwogCX0KIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9sZ2gwNnhmLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbGdoMDZ4Zi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjAyZDBjLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9sZ2gwNnhmLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoKLSAqICBsZ2gwNnhmLmMgLSBBVFNDIFR1bmVyIHN1cHBvcnQgZm9yIExHIFREVlMtSDA2eEYKLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICovCi0KLSNpbmNsdWRlICJkdmItcGxsLmgiCi0jaW5jbHVkZSAibGdoMDZ4Zi5oIgotCi0jZGVmaW5lIExHX0gwNlhGX1BMTF9JMkNfQUREUiAweDYxCi0KLXN0cnVjdCBsZ2gwNnhmX3ByaXYgewotCXN0cnVjdCBpMmNfYWRhcHRlciAqaTJjOwotCXUzMiBmcmVxdWVuY3k7Ci19OwotCi1zdGF0aWMgaW50IGxnaDA2eGZfcmVsZWFzZShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKLXsKLQlrZnJlZShmZS0+dHVuZXJfcHJpdik7Ci0JZmUtPnR1bmVyX3ByaXYgPSBOVUxMOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGxnaDA2eGZfc2V0X3BhcmFtcyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwKLQkJCSAgICAgIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyogcGFyYW1zKQotewotCXN0cnVjdCBsZ2gwNnhmX3ByaXYgKnByaXYgPSBmZS0+dHVuZXJfcHJpdjsKLQl1OCBidWZbNF07Ci0Jc3RydWN0IGkyY19tc2cgbXNnID0geyAuYWRkciA9IExHX0gwNlhGX1BMTF9JMkNfQUREUiwgLmZsYWdzID0gMCwKLQkJCSAgICAgICAuYnVmID0gYnVmLCAubGVuID0gc2l6ZW9mKGJ1ZikgfTsKLQl1MzIgZnJlcXVlbmN5OwotCWludCByZXN1bHQ7Ci0KLQlpZiAoKHJlc3VsdCA9IGR2Yl9wbGxfY29uZmlndXJlKCZkdmJfcGxsX2xnX3RkdnNfaDA2eGYsIGJ1ZiwKLQkJCQkJcGFyYW1zLT5mcmVxdWVuY3ksIDApKSA8IDApCi0JCXJldHVybiByZXN1bHQ7Ci0JZWxzZQotCQlmcmVxdWVuY3kgPSByZXN1bHQ7Ci0KLQlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQotCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDEpOwotCWlmICgocmVzdWx0ID0gaTJjX3RyYW5zZmVyKHByaXYtPmkyYywgJm1zZywgMSkpICE9IDEpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAibGdoMDZ4ZjogJXMgZXJyb3IgIgotCQkgICAgICAgIihhZGRyICUwMnggPC0gJTAyeCwgcmVzdWx0ID0gJWkpXG4iLAotCQkgICAgICAgX19GVU5DVElPTl9fLCBidWZbMF0sIGJ1ZlsxXSwgcmVzdWx0KTsKLQkJaWYgKHJlc3VsdCA8IDApCi0JCQlyZXR1cm4gcmVzdWx0OwotCQllbHNlCi0JCQlyZXR1cm4gLUVSRU1PVEVJTzsKLQl9Ci0KLQkvKiBTZXQgdGhlIEF1eGlsaWFyeSBCeXRlLiAqLwotCWJ1ZlswXSA9IGJ1ZlsyXTsKLQlidWZbMF0gJj0gfjB4MjA7Ci0JYnVmWzBdIHw9IDB4MTg7Ci0JYnVmWzFdID0gMHg1MDsKLQltc2cubGVuID0gMjsKLQlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQotCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDEpOwotCWlmICgocmVzdWx0ID0gaTJjX3RyYW5zZmVyKHByaXYtPmkyYywgJm1zZywgMSkpICE9IDEpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAibGdoMDZ4ZjogJXMgZXJyb3IgIgotCQkgICAgICAgIihhZGRyICUwMnggPC0gJTAyeCwgcmVzdWx0ID0gJWkpXG4iLAotCQkgICAgICAgX19GVU5DVElPTl9fLCBidWZbMF0sIGJ1ZlsxXSwgcmVzdWx0KTsKLQkJaWYgKHJlc3VsdCA8IDApCi0JCQlyZXR1cm4gcmVzdWx0OwotCQllbHNlCi0JCQlyZXR1cm4gLUVSRU1PVEVJTzsKLQl9Ci0KLQlwcml2LT5mcmVxdWVuY3kgPSBmcmVxdWVuY3k7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBsZ2gwNnhmX2dldF9mcmVxdWVuY3koc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHUzMiAqZnJlcXVlbmN5KQotewotCXN0cnVjdCBsZ2gwNnhmX3ByaXYgKnByaXYgPSBmZS0+dHVuZXJfcHJpdjsKLQkqZnJlcXVlbmN5ID0gcHJpdi0+ZnJlcXVlbmN5OwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IGR2Yl90dW5lcl9vcHMgbGdoMDZ4Zl90dW5lcl9vcHMgPSB7Ci0JLnJlbGVhc2UgICAgICAgPSBsZ2gwNnhmX3JlbGVhc2UsCi0JLnNldF9wYXJhbXMgICAgPSBsZ2gwNnhmX3NldF9wYXJhbXMsCi0JLmdldF9mcmVxdWVuY3kgPSBsZ2gwNnhmX2dldF9mcmVxdWVuY3ksCi19OwotCi1zdHJ1Y3QgZHZiX2Zyb250ZW5kKiBsZ2gwNnhmX2F0dGFjaChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKLQkJCQkgICAgc3RydWN0IGkyY19hZGFwdGVyICppMmMpCi17Ci0Jc3RydWN0IGxnaDA2eGZfcHJpdiAqcHJpdiA9IE5VTEw7Ci0KLQlwcml2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGxnaDA2eGZfcHJpdiksIEdGUF9LRVJORUwpOwotCWlmIChwcml2ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCi0JcHJpdi0+aTJjID0gaTJjOwotCi0JbWVtY3B5KCZmZS0+b3BzLnR1bmVyX29wcywgJmxnaDA2eGZfdHVuZXJfb3BzLAotCSAgICAgICBzaXplb2Yoc3RydWN0IGR2Yl90dW5lcl9vcHMpKTsKLQotCXN0cmxjcHkoZmUtPm9wcy50dW5lcl9vcHMuaW5mby5uYW1lLCBkdmJfcGxsX2xnX3RkdnNfaDA2eGYubmFtZSwKLQkJc2l6ZW9mKGZlLT5vcHMudHVuZXJfb3BzLmluZm8ubmFtZSkpOwotCi0JZmUtPm9wcy50dW5lcl9vcHMuaW5mby5mcmVxdWVuY3lfbWluID0gZHZiX3BsbF9sZ190ZHZzX2gwNnhmLm1pbjsKLQlmZS0+b3BzLnR1bmVyX29wcy5pbmZvLmZyZXF1ZW5jeV9tYXggPSBkdmJfcGxsX2xnX3RkdnNfaDA2eGYubWF4OwotCi0JZmUtPnR1bmVyX3ByaXYgPSBwcml2OwotCXJldHVybiBmZTsKLX0KLQotRVhQT1JUX1NZTUJPTChsZ2gwNnhmX2F0dGFjaCk7Ci0KLU1PRFVMRV9ERVNDUklQVElPTigiTEcgVERWUy1IMDZ4RiBBVFNDIFR1bmVyIHN1cHBvcnQiKTsKLU1PRFVMRV9BVVRIT1IoIk1pY2hhZWwgS3J1Zmt5Iik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KLS8qCi0gKiBMb2NhbCB2YXJpYWJsZXM6Ci0gKiBjLWJhc2ljLW9mZnNldDogOAotICogRW5kOgotICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbGdoMDZ4Zi5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2xnaDA2eGYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTEwYjRiZS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbGdoMDZ4Zi5oCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoKLSAqICBsZ2gwNnhmLmggLSBBVFNDIFR1bmVyIHN1cHBvcnQgZm9yIExHIFREVlMtSDA2eEYKLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICovCi0KLSNpZm5kZWYgX0xHSDA2WEZfSF8KLSNkZWZpbmUgX0xHSDA2WEZfSF8KLSNpbmNsdWRlICJkdmJfZnJvbnRlbmQuaCIKLQotI2lmIGRlZmluZWQoQ09ORklHX0RWQl9UVU5FUl9MR0gwNlhGKSB8fCAoZGVmaW5lZChDT05GSUdfRFZCX1RVTkVSX0xHSDA2WEZfTU9EVUxFKSAmJiBkZWZpbmVkKE1PRFVMRSkpCi1leHRlcm4gc3RydWN0IGR2Yl9mcm9udGVuZCogbGdoMDZ4Zl9hdHRhY2goc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsCi0JCQkJCSAgICBzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYyk7Ci0jZWxzZQotc3RhdGljIGlubGluZSBzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBsZ2gwNnhmX2F0dGFjaChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwKLQkJCQkJCSAgc3RydWN0IGkyY19hZGFwdGVyICppMmMpCi17Ci0JcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGRyaXZlciBkaXNhYmxlZCBieSBLY29uZmlnXG4iLCBfX0ZVTkNUSU9OX18pOwotCXJldHVybiBOVUxMOwotfQotI2VuZGlmIC8qIENPTkZJR19EVkJfVFVORVJfTEdIMDZYRiAqLwotCi0jZW5kaWYgLyogX0xHSDA2WEZfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9vcjUxMTMyLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvb3I1MTEzMi5jCmluZGV4IDVhM2E2ZTUuLjRlMGFjYTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9vcjUxMTMyLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL29yNTExMzIuYwpAQCAtMSw2ICsxLDkgQEAKIC8qCiAgKiAgICBTdXBwb3J0IGZvciBPUjUxMTMyIChwY0hEVFYgSEQtMzAwMCkgLSBWU0IvUUFNCiAgKgorICoKKyAqICAgIENvcHlyaWdodCAoQykgMjAwNyBUcmVudCBQaWVwaG8gPHh5enp5QHNwZWFrZWFzeS5vcmc+CisgKgogICogICAgQ29weXJpZ2h0IChDKSAyMDA1IEtpcmsgTGFwcmF5IDxraXJrX2xhcHJheUBiaWdmb290LmNvbT4KICAqCiAgKiAgICBCYXNlZCBvbiBjb2RlIGZyb20gSmFjayBLZWxsaWhlciAoa2VsbGloZXJAeG1pc3Npb24uY29tKQpAQCAtNjksNDYgKzcyLDcwIEBACiAJdTMyIGN1cnJlbnRfZnJlcXVlbmN5OwogfTsKIAotc3RhdGljIGludCBpMmNfd3JpdGVieXRlcyAoc3RydWN0IG9yNTExMzJfc3RhdGUqIHN0YXRlLCB1OCByZWcsIHU4ICpidWYsIGludCBsZW4pCisKKy8qIFdyaXRlIGJ1ZmZlciB0byBkZW1vZCAqLworc3RhdGljIGludCBvcjUxMTMyX3dyaXRlYnVmKHN0cnVjdCBvcjUxMTMyX3N0YXRlICpzdGF0ZSwgY29uc3QgdTggKmJ1ZiwgaW50IGxlbikKIHsKIAlpbnQgZXJyOwotCXN0cnVjdCBpMmNfbXNnIG1zZzsKLQltc2cuYWRkciAgPSByZWc7Ci0JbXNnLmZsYWdzID0gMDsKLQltc2cubGVuICAgPSBsZW47Ci0JbXNnLmJ1ZiAgID0gYnVmOworCXN0cnVjdCBpMmNfbXNnIG1zZyA9IHsgLmFkZHIgPSBzdGF0ZS0+Y29uZmlnLT5kZW1vZF9hZGRyZXNzLAorCQkJICAgICAgIC5mbGFncyA9IDAsIC5idWYgPSAodTgqKWJ1ZiwgLmxlbiA9IGxlbiB9OwogCisJLyogbXNsZWVwKDIwKTsgKi8gLyogZG9lc24ndCBhcHBlYXIgdG8gYmUgbmVjZXNzYXJ5ICovCiAJaWYgKChlcnIgPSBpMmNfdHJhbnNmZXIoc3RhdGUtPmkyYywgJm1zZywgMSkpICE9IDEpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAib3I1MTEzMjogaTJjX3dyaXRlYnl0ZXMgZXJyb3IgKGFkZHIgJTAyeCwgZXJyID09ICVpKVxuIiwgcmVnLCBlcnIpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJvcjUxMTMyOiBJMkMgd3JpdGUgKGFkZHIgMHglMDJ4IGxlbiAlZCkgZXJyb3I6ICVkXG4iLAorCQkgICAgICAgbXNnLmFkZHIsIG1zZy5sZW4sIGVycik7CiAJCXJldHVybiAtRVJFTU9URUlPOwogCX0KLQogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdTggaTJjX3JlYWRieXRlcyAoc3RydWN0IG9yNTExMzJfc3RhdGUqIHN0YXRlLCB1OCByZWcsIHU4KiBidWYsIGludCBsZW4pCisvKiBXcml0ZSBjb25zdGFudCBieXRlcywgZS5nLiBvcjUxMTMyX3dyaXRlYnl0ZXMoc3RhdGUsIDB4MDQsIDB4NDIsIDB4MDApOworICAgTGVzcyBjb2RlIGFuZCBtb3JlIGVmZmljaWVudCB0aGF0IGxvYWRpbmcgYSBidWZmZXIgb24gdGhlIHN0YWNrIHdpdGgKKyAgIHRoZSBieXRlcyB0byBzZW5kIGFuZCB0aGVuIGNhbGxpbmcgb3I1MTEzMl93cml0ZWJ1ZigpIG9uIHRoYXQuICovCisjZGVmaW5lIG9yNTExMzJfd3JpdGVieXRlcyhzdGF0ZSwgZGF0YS4uLikgIFwKKwkoeyBjb25zdCBzdGF0aWMgdTggX2RhdGFbXSA9IHtkYXRhfTsgXAorCW9yNTExMzJfd3JpdGVidWYoc3RhdGUsIF9kYXRhLCBzaXplb2YoX2RhdGEpKTsgfSkKKworLyogUmVhZCBkYXRhIGZyb20gZGVtb2QgaW50byBidWZmZXIuICBSZXR1cm5zIDAgb24gc3VjY2Vzcy4gKi8KK3N0YXRpYyBpbnQgb3I1MTEzMl9yZWFkYnVmKHN0cnVjdCBvcjUxMTMyX3N0YXRlICpzdGF0ZSwgdTggKmJ1ZiwgaW50IGxlbikKIHsKIAlpbnQgZXJyOwotCXN0cnVjdCBpMmNfbXNnIG1zZzsKLQltc2cuYWRkciAgID0gcmVnOwotCW1zZy5mbGFncyA9IEkyQ19NX1JEOwotCW1zZy5sZW4gPSBsZW47Ci0JbXNnLmJ1ZiA9IGJ1ZjsKKwlzdHJ1Y3QgaTJjX21zZyBtc2cgPSB7IC5hZGRyID0gc3RhdGUtPmNvbmZpZy0+ZGVtb2RfYWRkcmVzcywKKwkJCSAgICAgICAuZmxhZ3MgPSBJMkNfTV9SRCwgLmJ1ZiA9IGJ1ZiwgLmxlbiA9IGxlbiB9OwogCisJLyogbXNsZWVwKDIwKTsgKi8gLyogZG9lc24ndCBhcHBlYXIgdG8gYmUgbmVjZXNzYXJ5ICovCiAJaWYgKChlcnIgPSBpMmNfdHJhbnNmZXIoc3RhdGUtPmkyYywgJm1zZywgMSkpICE9IDEpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAib3I1MTEzMjogaTJjX3JlYWRieXRlcyBlcnJvciAoYWRkciAlMDJ4LCBlcnIgPT0gJWkpXG4iLCByZWcsIGVycik7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm9yNTExMzI6IEkyQyByZWFkIChhZGRyIDB4JTAyeCBsZW4gJWQpIGVycm9yOiAlZFxuIiwKKwkJICAgICAgIG1zZy5hZGRyLCBtc2cubGVuLCBlcnIpOwogCQlyZXR1cm4gLUVSRU1PVEVJTzsKIAl9Ci0KIAlyZXR1cm4gMDsKIH0KIAorLyogUmVhZHMgYSAxNi1iaXQgZGVtb2QgcmVnaXN0ZXIuICBSZXR1cm5zIDwwIG9uIGVycm9yLiAqLworc3RhdGljIGludCBvcjUxMTMyX3JlYWRyZWcoc3RydWN0IG9yNTExMzJfc3RhdGUgKnN0YXRlLCB1OCByZWcpCit7CisJdTggYnVmWzJdID0geyAweDA0LCByZWcgfTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2dbMl0gPSB7CisJCXsuYWRkciA9IHN0YXRlLT5jb25maWctPmRlbW9kX2FkZHJlc3MsIC5mbGFncyA9IDAsCisJCSAuYnVmID0gYnVmLCAubGVuID0gMiB9LAorCQl7LmFkZHIgPSBzdGF0ZS0+Y29uZmlnLT5kZW1vZF9hZGRyZXNzLCAuZmxhZ3MgPSBJMkNfTV9SRCwKKwkJIC5idWYgPSBidWYsIC5sZW4gPSAyIH19OworCWludCBlcnI7CisKKwlpZiAoKGVyciA9IGkyY190cmFuc2ZlcihzdGF0ZS0+aTJjLCBtc2csIDIpKSAhPSAyKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm9yNTExMzI6IEkyQyBlcnJvciByZWFkaW5nIHJlZ2lzdGVyICVkOiAlZFxuIiwKKwkJICAgICAgIHJlZywgZXJyKTsKKwkJcmV0dXJuIC1FUkVNT1RFSU87CisJfQorCXJldHVybiBsZTE2X3RvX2NwdXAoKHUxNiopYnVmKTsKK30KKwogc3RhdGljIGludCBvcjUxMTMyX2xvYWRfZmlybXdhcmUgKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3KQogewogCXN0cnVjdCBvcjUxMTMyX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwotCXN0YXRpYyB1OCBydW5fYnVmW10gPSB7MHg3RiwweDAxfTsKKwljb25zdCBzdGF0aWMgdTggcnVuX2J1ZltdID0gezB4N0YsMHgwMX07CiAJdTggcmVjX2J1Zls4XTsKLQl1OCBjbWRfYnVmWzNdOwogCXUzMiBmaXJtd2FyZUFzaXplLCBmaXJtd2FyZUJzaXplOwogCWludCBpLHJldDsKIApAQCAtMTIxLDMwICsxNDgsMjEgQEAKIAlkcHJpbnRrKCJGaXJtd2FyZUIgaXMgJWkgYnl0ZXNcbiIsZmlybXdhcmVCc2l6ZSk7CiAKIAkvKiBVcGxvYWQgZmlybXdhcmUgKi8KLQlpZiAoKHJldCA9IGkyY193cml0ZWJ5dGVzKHN0YXRlLHN0YXRlLT5jb25maWctPmRlbW9kX2FkZHJlc3MsCi0JCQkJICZmdy0+ZGF0YVs4XSxmaXJtd2FyZUFzaXplKSkpIHsKKwlpZiAoKHJldCA9IG9yNTExMzJfd3JpdGVidWYoc3RhdGUsICZmdy0+ZGF0YVs4XSwgZmlybXdhcmVBc2l6ZSkpKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIm9yNTExMzI6IGxvYWRfZmlybXdhcmUgZXJyb3IgMVxuIik7CiAJCXJldHVybiByZXQ7CiAJfQotCW1zbGVlcCgxKTsgLyogMW1zICovCi0JaWYgKChyZXQgPSBpMmNfd3JpdGVieXRlcyhzdGF0ZSxzdGF0ZS0+Y29uZmlnLT5kZW1vZF9hZGRyZXNzLAotCQkJCSAmZnctPmRhdGFbOCtmaXJtd2FyZUFzaXplXSxmaXJtd2FyZUJzaXplKSkpIHsKKwlpZiAoKHJldCA9IG9yNTExMzJfd3JpdGVidWYoc3RhdGUsICZmdy0+ZGF0YVs4K2Zpcm13YXJlQXNpemVdLAorCQkJCSAgICBmaXJtd2FyZUJzaXplKSkpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAib3I1MTEzMjogbG9hZF9maXJtd2FyZSBlcnJvciAyXG4iKTsKIAkJcmV0dXJuIHJldDsKIAl9Ci0JbXNsZWVwKDEpOyAvKiAxbXMgKi8KIAotCWlmICgocmV0ID0gaTJjX3dyaXRlYnl0ZXMoc3RhdGUsc3RhdGUtPmNvbmZpZy0+ZGVtb2RfYWRkcmVzcywKLQkJCQkgcnVuX2J1ZiwyKSkpIHsKKwlpZiAoKHJldCA9IG9yNTExMzJfd3JpdGVidWYoc3RhdGUsIHJ1bl9idWYsIDIpKSkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJvcjUxMTMyOiBsb2FkX2Zpcm13YXJlIGVycm9yIDNcbiIpOwogCQlyZXR1cm4gcmV0OwogCX0KLQotCS8qIFdhaXQgYXQgbGVhc3QgNSBtc2VjICovCi0JbXNsZWVwKDIwKTsgLyogMTBtcyAqLwotCi0JaWYgKChyZXQgPSBpMmNfd3JpdGVieXRlcyhzdGF0ZSxzdGF0ZS0+Y29uZmlnLT5kZW1vZF9hZGRyZXNzLAotCQkJCSBydW5fYnVmLDIpKSkgeworCWlmICgocmV0ID0gb3I1MTEzMl93cml0ZWJ1ZihzdGF0ZSwgcnVuX2J1ZiwgMikpKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIm9yNTExMzI6IGxvYWRfZmlybXdhcmUgZXJyb3IgNFxuIik7CiAJCXJldHVybiByZXQ7CiAJfQpAQCAtMTU0LDQzICsxNzIsMjUgQEAKIAogCS8qIFJlYWQgYmFjayB1Y29kZSB2ZXJzaW9uIHRvIGJlc3VyZSB3ZSBsb2FkZWQgY29ycmVjdGx5IGFuZCBhcmUgcmVhbGx5IHVwIGFuZCBydW5uaW5nICovCiAJLyogR2V0IHVDb2RlIHZlcnNpb24gKi8KLQljbWRfYnVmWzBdID0gMHgxMDsKLQljbWRfYnVmWzFdID0gMHgxMDsKLQljbWRfYnVmWzJdID0gMHgwMDsKLQltc2xlZXAoMjApOyAvKiAyMG1zICovCi0JaWYgKChyZXQgPSBpMmNfd3JpdGVieXRlcyhzdGF0ZSxzdGF0ZS0+Y29uZmlnLT5kZW1vZF9hZGRyZXNzLAotCQkJCSBjbWRfYnVmLDMpKSkgeworCWlmICgocmV0ID0gb3I1MTEzMl93cml0ZWJ5dGVzKHN0YXRlLCAweDEwLCAweDEwLCAweDAwKSkpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAib3I1MTEzMjogbG9hZF9maXJtd2FyZSBlcnJvciBhXG4iKTsKIAkJcmV0dXJuIHJldDsKIAl9Ci0KLQljbWRfYnVmWzBdID0gMHgwNDsKLQljbWRfYnVmWzFdID0gMHgxNzsKLQltc2xlZXAoMjApOyAvKiAyMG1zICovCi0JaWYgKChyZXQgPSBpMmNfd3JpdGVieXRlcyhzdGF0ZSxzdGF0ZS0+Y29uZmlnLT5kZW1vZF9hZGRyZXNzLAotCQkJCSBjbWRfYnVmLDIpKSkgeworCWlmICgocmV0ID0gb3I1MTEzMl93cml0ZWJ5dGVzKHN0YXRlLCAweDA0LCAweDE3KSkpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAib3I1MTEzMjogbG9hZF9maXJtd2FyZSBlcnJvciBiXG4iKTsKIAkJcmV0dXJuIHJldDsKIAl9Ci0KLQljbWRfYnVmWzBdID0gMHgwMDsKLQljbWRfYnVmWzFdID0gMHgwMDsKLQltc2xlZXAoMjApOyAvKiAyMG1zICovCi0JaWYgKChyZXQgPSBpMmNfd3JpdGVieXRlcyhzdGF0ZSxzdGF0ZS0+Y29uZmlnLT5kZW1vZF9hZGRyZXNzLAotCQkJCSBjbWRfYnVmLDIpKSkgeworCWlmICgocmV0ID0gb3I1MTEzMl93cml0ZWJ5dGVzKHN0YXRlLCAweDAwLCAweDAwKSkpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAib3I1MTEzMjogbG9hZF9maXJtd2FyZSBlcnJvciBjXG4iKTsKIAkJcmV0dXJuIHJldDsKIAl9Ci0KLQlmb3IoaT0wO2k8NDtpKyspIHsKLQkJbXNsZWVwKDIwKTsgLyogMjBtcyAqLworCWZvciAoaT0wO2k8NDtpKyspIHsKIAkJLyogT25jZSB1cG9uIGEgdGltZSwgdGhpcyBjb21tYW5kIG1pZ2h0IGhhdmUgaGFkIHNvbWV0aGluZwogCQkgICB0byBkbyB3aXRoIGdldHRpbmcgdGhlIGZpcm13YXJlIHZlcnNpb24sIGJ1dCBpdCdzCiAJCSAgIG5vdCB1c2VkIGFueW1vcmU6CiAJCSAgIHsweDA0LDB4MDAsMHgzMCwweDAwLGkrMX0gKi8KIAkJLyogUmVhZCA4IGJ5dGVzLCB0d28gYnl0ZXMgYXQgYSB0aW1lICovCi0JCWlmICgocmV0ID0gaTJjX3JlYWRieXRlcyhzdGF0ZSxzdGF0ZS0+Y29uZmlnLT5kZW1vZF9hZGRyZXNzLAotCQkJCQkmcmVjX2J1ZltpKjJdLDIpKSkgeworCQlpZiAoKHJldCA9IG9yNTExMzJfcmVhZGJ1ZihzdGF0ZSwgJnJlY19idWZbaSoyXSwgMikpKSB7CiAJCQlwcmludGsoS0VSTl9XQVJOSU5HCiAJCQkgICAgICAgIm9yNTExMzI6IGxvYWRfZmlybXdhcmUgZXJyb3IgZCAtICVkXG4iLGkpOwogCQkJcmV0dXJuIHJldDsKQEAgLTIwNCwxMiArMjA0LDcgQEAKIAkgICAgICAgcmVjX2J1ZlszXSxyZWNfYnVmWzJdPj40LHJlY19idWZbMl0mMHgwZiwKIAkgICAgICAgcmVjX2J1Zls1XSxyZWNfYnVmWzRdPj40LHJlY19idWZbNF0mMHgwZik7CiAKLQljbWRfYnVmWzBdID0gMHgxMDsKLQljbWRfYnVmWzFdID0gMHgwMDsKLQljbWRfYnVmWzJdID0gMHgwMDsKLQltc2xlZXAoMjApOyAvKiAyMG1zICovCi0JaWYgKChyZXQgPSBpMmNfd3JpdGVieXRlcyhzdGF0ZSxzdGF0ZS0+Y29uZmlnLT5kZW1vZF9hZGRyZXNzLAotCQkJCSBjbWRfYnVmLDMpKSkgeworCWlmICgocmV0ID0gb3I1MTEzMl93cml0ZWJ5dGVzKHN0YXRlLCAweDEwLCAweDAwLCAweDAwKSkpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAib3I1MTEzMjogbG9hZF9maXJtd2FyZSBlcnJvciBlXG4iKTsKIAkJcmV0dXJuIHJldDsKIAl9CkBAIC0yNDEsNzAgKzIzNiw1NSBAQAogc3RhdGljIGludCBvcjUxMTMyX3NldG1vZGUoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCiB7CiAJc3RydWN0IG9yNTExMzJfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7Ci0JdW5zaWduZWQgY2hhciBjbWRfYnVmWzNdOworCXU4IGNtZF9idWYxWzNdID0gezB4MDQsIDB4MDEsIDB4NWZ9OworCXU4IGNtZF9idWYyWzNdID0gezB4MWMsIDB4MDAsIDAgfTsKIAogCWRwcmludGsoInNldG1vZGUgJWRcbiIsKGludClzdGF0ZS0+Y3VycmVudF9tb2R1bGF0aW9uKTsKLQkvKiBzZXQgb3BlcmF0aW9uIG1vZGUgaW4gUmVjZWl2ZXIgMSByZWdpc3RlcjsgKi8KLQljbWRfYnVmWzBdID0gMHgwNDsKLQljbWRfYnVmWzFdID0gMHgwMTsKKwogCXN3aXRjaCAoc3RhdGUtPmN1cnJlbnRfbW9kdWxhdGlvbikgewotCWNhc2UgUUFNXzI1NjoKLQljYXNlIFFBTV82NDoKLQljYXNlIFFBTV9BVVRPOgotCQkvKiBBdXRvLWRlaW50ZXJsZWF2ZTsgTVBFRyBzZXIsIE1QRUcydHIsIHBoYXNlIG5vaXNlLWhpZ2gqLwotCQljbWRfYnVmWzJdID0gMHg1RjsKLQkJYnJlYWs7CiAJY2FzZSBWU0JfODoKLQkJLyogQXV0byBDSCwgQXV0byBOVFNDIHJlaiwgTVBFR3NlciwgTVBFRzJ0ciwgcGhhc2Ugbm9pc2UtaGlnaCovCi0JCWNtZF9idWZbMl0gPSAweDUwOworCQkvKiBBdXRvIENILCBBdXRvIE5UU0MgcmVqLCBNUEVHc2VyLCBNUEVHMnRyLCBwaGFzZSBub2lzZS1oaWdoICovCisJCWNtZF9idWYxWzJdID0gMHg1MDsKKwkJLyogUkVDIE1PREUgaW52IElGIHNwZWN0cnVtLCBOb3JtYWwgKi8KKwkJY21kX2J1ZjJbMV0gPSAweDAzOworCQkvKiBDaGFubmVsIE1PREUgQVRTQy9WU0I4ICovCisJCWNtZF9idWYyWzJdID0gMHgwNjsKKwkJYnJlYWs7CisJLyogQWxsIFFBTSBtb2RlcyBhcmU6CisJICAgQXV0by1kZWludGVybGVhdmU7IE1QRUdzZXIsIE1QRUcydHIsIHBoYXNlIG5vaXNlLWhpZ2gKKwkgICBSRUMgTU9ERSBOb3JtYWwgQ2FycmllciBMb2NrICovCisJY2FzZSBRQU1fQVVUTzoKKwkJLyogQ2hhbm5lbCBNT0RFIEF1dG8gUUFNNjQvMjU2ICovCisJCWNtZF9idWYyWzJdID0gMHg0ZjsKKwkJYnJlYWs7CisJY2FzZSBRQU1fMjU2OgorCQkvKiBDaGFubmVsIE1PREUgUUFNMjU2ICovCisJCWNtZF9idWYyWzJdID0gMHg0NTsKKwkJYnJlYWs7CisJY2FzZSBRQU1fNjQ6CisJCS8qIENoYW5uZWwgTU9ERSBRQU02NCAqLworCQljbWRfYnVmMlsyXSA9IDB4NDM7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXByaW50aygic2V0bW9kZTpNb2R1bGF0aW9uIHNldCB0byB1bnN1cHBvcnRlZCB2YWx1ZVxuIik7Ci0JfTsKLQlpZiAoaTJjX3dyaXRlYnl0ZXMoc3RhdGUsc3RhdGUtPmNvbmZpZy0+ZGVtb2RfYWRkcmVzcywKLQkJCSAgIGNtZF9idWYsMykpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAib3I1MTEzMjogc2V0X21vZGUgZXJyb3IgMVxuIik7Ci0JCXJldHVybiAtMTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgIm9yNTExMzI6IHNldG1vZGU6IE1vZHVsYXRpb24gc2V0IHRvIHVuc3VwcG9ydGVkIHZhbHVlICglZClcbiIsCisJCSAgICAgICBzdGF0ZS0+Y3VycmVudF9tb2R1bGF0aW9uKTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCWRwcmludGsoIm9yNTExMzI6IHNldCAjMSB0byAlMDJ4XG4iLCBjbWRfYnVmWzJdKTsKKworCS8qIFNldCBSZWNlaXZlciAxIHJlZ2lzdGVyICovCisJaWYgKG9yNTExMzJfd3JpdGVidWYoc3RhdGUsIGNtZF9idWYxLCAzKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJvcjUxMTMyOiBzZXRfbW9kZSBlcnJvciAxXG4iKTsKKwkJcmV0dXJuIC1FUkVNT1RFSU87CisJfQorCWRwcmludGsoInNldCAjMSB0byAlMDJ4XG4iLCBjbWRfYnVmMVsyXSk7CiAKIAkvKiBTZXQgb3BlcmF0aW9uIG1vZGUgaW4gUmVjZWl2ZXIgNiByZWdpc3RlciAqLwotCWNtZF9idWZbMF0gPSAweDFDOwotCXN3aXRjaCAoc3RhdGUtPmN1cnJlbnRfbW9kdWxhdGlvbikgewotCWNhc2UgUUFNX0FVVE86Ci0JCS8qIFJFQyBNT0RFIE5vcm1hbCBDYXJyaWVyIExvY2sgKi8KLQkJY21kX2J1ZlsxXSA9IDB4MDA7Ci0JCS8qIENoYW5uZWwgTU9ERSBBdXRvIFFBTTY0LzI1NiAqLwotCQljbWRfYnVmWzJdID0gMHg0ZjsKLQkJYnJlYWs7Ci0JY2FzZSBRQU1fMjU2OgotCQkvKiBSRUMgTU9ERSBOb3JtYWwgQ2FycmllciBMb2NrICovCi0JCWNtZF9idWZbMV0gPSAweDAwOwotCQkvKiBDaGFubmVsIE1PREUgUUFNMjU2ICovCi0JCWNtZF9idWZbMl0gPSAweDQ1OwotCQlicmVhazsKLQljYXNlIFFBTV82NDoKLQkJLyogUkVDIE1PREUgTm9ybWFsIENhcnJpZXIgTG9jayAqLwotCQljbWRfYnVmWzFdID0gMHgwMDsKLQkJLyogQ2hhbm5lbCBNT0RFIFFBTTY0ICovCi0JCWNtZF9idWZbMl0gPSAweDQzOwotCQlicmVhazsKLQljYXNlIFZTQl84OgotCQkgLyogUkVDIE1PREUgaW52IElGIHNwZWN0cnVtLCBOb3JtYWwgKi8KLQkJY21kX2J1ZlsxXSA9IDB4MDM7Ci0JCS8qIENoYW5uZWwgTU9ERSBBVFNDL1ZTQjggKi8KLQkJY21kX2J1ZlsyXSA9IDB4MDY7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByaW50aygic2V0bW9kZTogTW9kdWxhdGlvbiBzZXQgdG8gdW5zdXBwb3J0ZWQgdmFsdWVcbiIpOwotCX07Ci0JbXNsZWVwKDIwKTsgLyogMjBtcyAqLwotCWlmIChpMmNfd3JpdGVieXRlcyhzdGF0ZSxzdGF0ZS0+Y29uZmlnLT5kZW1vZF9hZGRyZXNzLAotCQkJICAgY21kX2J1ZiwzKSkgeworCWlmIChvcjUxMTMyX3dyaXRlYnVmKHN0YXRlLCBjbWRfYnVmMiwgMykpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAib3I1MTEzMjogc2V0X21vZGUgZXJyb3IgMlxuIik7Ci0JCXJldHVybiAtMTsKKwkJcmV0dXJuIC1FUkVNT1RFSU87CiAJfQotCWRwcmludGsoIm9yNTExMzI6IHNldCAjNiB0byAweCUwMnglMDJ4XG4iLCBjbWRfYnVmWzFdLCBjbWRfYnVmWzJdKTsKKwlkcHJpbnRrKCJzZXQgIzYgdG8gMHglMDJ4JTAyeFxuIiwgY21kX2J1ZjJbMV0sIGNtZF9idWYyWzJdKTsKIAogCXJldHVybiAwOwogfQpAQCAtNDAxLDI4ICszODEsMjMgQEAKIAkJCQkgIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcGFyYW0pCiB7CiAJc3RydWN0IG9yNTExMzJfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7Ci0JdTggYnVmWzJdOworCWludCBzdGF0dXM7CisJaW50IHJldHJ5ID0gMTsKIAorc3RhcnQ6CiAJLyogUmVjZWl2ZXIgU3RhdHVzICovCi0JYnVmWzBdPTB4MDQ7Ci0JYnVmWzFdPTB4MDA7Ci0JbXNsZWVwKDMwKTsgLyogMzBtcyAqLwotCWlmIChpMmNfd3JpdGVieXRlcyhzdGF0ZSxzdGF0ZS0+Y29uZmlnLT5kZW1vZF9hZGRyZXNzLGJ1ZiwyKSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJvcjUxMTMyOiBnZXRfcGFyYW1ldGVycyB3cml0ZSBlcnJvclxuIik7CisJaWYgKChzdGF0dXMgPSBvcjUxMTMyX3JlYWRyZWcoc3RhdGUsIDB4MDApKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAib3I1MTEzMjogZ2V0X3BhcmFtZXRlcnM6IGVycm9yIHJlYWRpbmcgcmVjZWl2ZXIgc3RhdHVzXG4iKTsKIAkJcmV0dXJuIC1FUkVNT1RFSU87CiAJfQotCW1zbGVlcCgzMCk7IC8qIDMwbXMgKi8KLQlpZiAoaTJjX3JlYWRieXRlcyhzdGF0ZSxzdGF0ZS0+Y29uZmlnLT5kZW1vZF9hZGRyZXNzLGJ1ZiwyKSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJvcjUxMTMyOiBnZXRfcGFyYW1ldGVycyByZWFkIGVycm9yXG4iKTsKLQkJcmV0dXJuIC1FUkVNT1RFSU87Ci0JfQotCXN3aXRjaChidWZbMF0pIHsKKwlzd2l0Y2goc3RhdHVzJjB4ZmYpIHsKIAkJY2FzZSAweDA2OiBwYXJhbS0+dS52c2IubW9kdWxhdGlvbiA9IFZTQl84OyBicmVhazsKIAkJY2FzZSAweDQzOiBwYXJhbS0+dS52c2IubW9kdWxhdGlvbiA9IFFBTV82NDsgYnJlYWs7CiAJCWNhc2UgMHg0NTogcGFyYW0tPnUudnNiLm1vZHVsYXRpb24gPSBRQU1fMjU2OyBicmVhazsKIAkJZGVmYXVsdDoKKwkJCWlmIChyZXRyeS0tKSBnb3RvIHN0YXJ0OwogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAib3I1MTEzMjogdW5rbm93biBzdGF0dXMgMHglMDJ4XG4iLAotCQkJICAgICAgIGJ1ZlswXSk7CisJCQkgICAgICAgc3RhdHVzJjB4ZmYpOwogCQkJcmV0dXJuIC1FUkVNT1RFSU87CiAJfQogCkBAIC00MzgsMzIgKzQxMywyMSBAQAogc3RhdGljIGludCBvcjUxMTMyX3JlYWRfc3RhdHVzKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBmZV9zdGF0dXNfdCogc3RhdHVzKQogewogCXN0cnVjdCBvcjUxMTMyX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwotCXVuc2lnbmVkIGNoYXIgcmVjX2J1ZlsyXTsKLQl1bnNpZ25lZCBjaGFyIHNuZF9idWZbMl07Ci0JKnN0YXR1cyA9IDA7CisJaW50IHJlZzsKIAogCS8qIFJlY2VpdmVyIFN0YXR1cyAqLwotCXNuZF9idWZbMF09MHgwNDsKLQlzbmRfYnVmWzFdPTB4MDA7Ci0JbXNsZWVwKDMwKTsgLyogMzBtcyAqLwotCWlmIChpMmNfd3JpdGVieXRlcyhzdGF0ZSxzdGF0ZS0+Y29uZmlnLT5kZW1vZF9hZGRyZXNzLHNuZF9idWYsMikpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAib3I1MTEzMjogcmVhZF9zdGF0dXMgd3JpdGUgZXJyb3JcbiIpOwotCQlyZXR1cm4gLTE7CisJaWYgKChyZWcgPSBvcjUxMTMyX3JlYWRyZWcoc3RhdGUsIDB4MDApKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAib3I1MTEzMjogcmVhZF9zdGF0dXM6IGVycm9yIHJlYWRpbmcgcmVjZWl2ZXIgc3RhdHVzOiAlZFxuIiwgcmVnKTsKKwkJKnN0YXR1cyA9IDA7CisJCXJldHVybiAtRVJFTU9URUlPOwogCX0KLQltc2xlZXAoMzApOyAvKiAzMG1zICovCi0JaWYgKGkyY19yZWFkYnl0ZXMoc3RhdGUsc3RhdGUtPmNvbmZpZy0+ZGVtb2RfYWRkcmVzcyxyZWNfYnVmLDIpKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIm9yNTExMzI6IHJlYWRfc3RhdHVzIHJlYWQgZXJyb3JcbiIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWRwcmludGsoInJlYWRfc3RhdHVzICV4ICV4XG4iLHJlY19idWZbMF0scmVjX2J1ZlsxXSk7CisJZHByaW50aygiJXM6IHJlYWRfc3RhdHVzICUwNHhcbiIsIF9fRlVOQ1RJT05fXywgcmVnKTsKIAotCWlmIChyZWNfYnVmWzFdICYgMHgwMSkgeyAvKiBSZWNlaXZlciBMb2NrICovCi0JCSpzdGF0dXMgfD0gRkVfSEFTX1NJR05BTDsKLQkJKnN0YXR1cyB8PSBGRV9IQVNfQ0FSUklFUjsKLQkJKnN0YXR1cyB8PSBGRV9IQVNfVklURVJCSTsKLQkJKnN0YXR1cyB8PSBGRV9IQVNfU1lOQzsKLQkJKnN0YXR1cyB8PSBGRV9IQVNfTE9DSzsKLQl9CisJaWYgKHJlZyAmIDB4MDEwMCkgLyogUmVjZWl2ZXIgTG9jayAqLworCQkqc3RhdHVzID0gRkVfSEFTX1NJR05BTHxGRV9IQVNfQ0FSUklFUnxGRV9IQVNfVklURVJCSXwKKwkJCSAgRkVfSEFTX1NZTkN8RkVfSEFTX0xPQ0s7CisJZWxzZQorCQkqc3RhdHVzID0gMDsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNTA2LDQ3ICs0NzAsMzAgQEAKIHN0YXRpYyBpbnQgb3I1MTEzMl9yZWFkX3NucihzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTE2KiBzbnIpCiB7CiAJc3RydWN0IG9yNTExMzJfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7Ci0JdTggcmVjX2J1ZlsyXTsKLQl1OCBzbmRfYnVmWzJdOwotCXUzMiBub2lzZTsKLQl1MzIgYzsKLQl1MzIgdXNLOworCWludCBub2lzZSwgcmVnOworCXUzMiBjLCB1c0sgPSAwOworCWludCByZXRyeSA9IDE7CiAKLQkvKiBSZWdpc3RlciBpcyBzYW1lIGZvciBWU0Igb3IgUUFNIGZpcm13YXJlICovCi0Jc25kX2J1ZlswXT0weDA0OwotCXNuZF9idWZbMV09MHgwMjsgLyogU05SIGFmdGVyIEVxdWFsaXplciAqLwotCW1zbGVlcCgzMCk7IC8qIDMwbXMgKi8KLQlpZiAoaTJjX3dyaXRlYnl0ZXMoc3RhdGUsc3RhdGUtPmNvbmZpZy0+ZGVtb2RfYWRkcmVzcyxzbmRfYnVmLDIpKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIm9yNTExMzI6IHNuciB3cml0ZSBlcnJvclxuIik7CitzdGFydDoKKwkvKiBTTlIgYWZ0ZXIgRXF1YWxpemVyICovCisJbm9pc2UgPSBvcjUxMTMyX3JlYWRyZWcoc3RhdGUsIDB4MDIpOworCWlmIChub2lzZSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAib3I1MTEzMjogcmVhZF9zbnI6IGVycm9yIHJlYWRpbmcgZXF1YWxpemVyXG4iKTsKIAkJcmV0dXJuIC1FUkVNT1RFSU87CiAJfQotCW1zbGVlcCgzMCk7IC8qIDMwbXMgKi8KLQlpZiAoaTJjX3JlYWRieXRlcyhzdGF0ZSxzdGF0ZS0+Y29uZmlnLT5kZW1vZF9hZGRyZXNzLHJlY19idWYsMikpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAib3I1MTEzMjogc25yIHJlYWQgZXJyb3JcbiIpOwotCQlyZXR1cm4gLUVSRU1PVEVJTzsKLQl9Ci0Jbm9pc2UgPSByZWNfYnVmWzBdIHwgKHJlY19idWZbMV0gPDwgOCk7Ci0JZHByaW50aygicmVhZF9zbnIgbm9pc2UgJXggJXggKCVpKVxuIixyZWNfYnVmWzBdLHJlY19idWZbMV0sbm9pc2UpOworCWRwcmludGsoInJlYWRfc25yIG5vaXNlICglZClcbiIsIG5vaXNlKTsKIAogCS8qIFJlYWQgc3RhdHVzLCBjb250YWlucyBtb2R1bGF0aW9uIHR5cGUgZm9yIFFBTV9BVVRPIGFuZAogCSAgIE5UU0MgZmlsdGVyIGZvciBWU0IgKi8KLQlzbmRfYnVmWzBdPTB4MDQ7Ci0Jc25kX2J1ZlsxXT0weDAwOyAvKiBTdGF0dXMgcmVnaXN0ZXIgKi8KLQltc2xlZXAoMzApOyAvKiAzMG1zICovCi0JaWYgKGkyY193cml0ZWJ5dGVzKHN0YXRlLHN0YXRlLT5jb25maWctPmRlbW9kX2FkZHJlc3Msc25kX2J1ZiwyKSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJvcjUxMTMyOiBzdGF0dXMgd3JpdGUgZXJyb3JcbiIpOwotCQlyZXR1cm4gLUVSRU1PVEVJTzsKLQl9Ci0JbXNsZWVwKDMwKTsgLyogMzBtcyAqLwotCWlmIChpMmNfcmVhZGJ5dGVzKHN0YXRlLHN0YXRlLT5jb25maWctPmRlbW9kX2FkZHJlc3MscmVjX2J1ZiwyKSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJvcjUxMTMyOiBzdGF0dXMgcmVhZCBlcnJvclxuIik7CisJcmVnID0gb3I1MTEzMl9yZWFkcmVnKHN0YXRlLCAweDAwKTsKKwlpZiAocmVnIDwgMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJvcjUxMTMyOiByZWFkX3NucjogZXJyb3IgcmVhZGluZyByZWNlaXZlciBzdGF0dXNcbiIpOwogCQlyZXR1cm4gLUVSRU1PVEVJTzsKIAl9CiAKLQl1c0sgPSAwOwotCXN3aXRjaCAocmVjX2J1ZlswXSkgeworCXN3aXRjaCAocmVnJjB4ZmYpIHsKIAljYXNlIDB4MDY6Ci0JCXVzSyA9IChyZWNfYnVmWzFdICYgMHgxMCkgPyAweDAzMDAwMDAwIDogMDsKKwkJaWYgKHJlZyAmIDB4MTAwMCkgdXNLID0gMyA8PCAyNDsKIAkJLyogRmFsbCB0aHJvdWdoIHRvIFFBTTY0IGNhc2UgKi8KIAljYXNlIDB4NDM6CiAJCWMgPSAxNTAyMDQxNjc7CkBAIC01NTUsMTEgKzUwMiwxMiBAQAogCQljID0gMTUwMjkwMzk2OwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9FUlIgIm9yNTExMzI6IHVua25vd24gc3RhdHVzIDB4JTAyeFxuIiwgcmVjX2J1ZlswXSk7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm9yNTExMzI6IHVua25vd24gc3RhdHVzIDB4JTAyeFxuIiwgcmVnJjB4ZmYpOworCQlpZiAocmV0cnktLSkgZ290byBzdGFydDsKIAkJcmV0dXJuIC1FUkVNT1RFSU87CiAJfQogCWRwcmludGsoIiVzOiBtb2R1bGF0aW9uICUwMngsIE5UU0MgcmVqIE8lc1xuIiwgX19GVU5DVElPTl9fLAotCQlyZWNfYnVmWzBdLCByZWNfYnVmWzFdJjB4MTA/Im4iOiJmZiIpOworCQlyZWcmMHhmZiwgcmVnJjB4MTAwMD8ibiI6ImZmIik7CiAKIAkvKiBDYWxjdWxhdGUgU05SIHVzaW5nIG5vaXNlLCBjLCBhbmQgTlRTQyByZWplY3Rpb24gY29ycmVjdGlvbiAqLwogCXN0YXRlLT5zbnIgPSBjYWxjdWxhdGVfc25yKG5vaXNlLCBjKSAtIHVzSzsKQEAgLTY3MSw2ICs2MTksNyBAQAogCiBNT0RVTEVfREVTQ1JJUFRJT04oIk9SNTExMzIgQVRTQyBbcGNIRFRWIEhELTMwMDBdICg4VlNCICYgSVRVIEo4MyBBbm5leEIgRkVDIFFBTTY0LzI1NikgRGVtb2R1bGF0b3IgRHJpdmVyIik7CiBNT0RVTEVfQVVUSE9SKCJLaXJrIExhcHJheSIpOworTU9EVUxFX0FVVEhPUigiVHJlbnQgUGllcGhvIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKIEVYUE9SVF9TWU1CT0wob3I1MTEzMl9hdHRhY2gpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTEwMDIxLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhMTAwMjEuYwppbmRleCA1YjljNWJiLi4xMTA1MzY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhMTAwMjEuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhMTAwMjEuYwpAQCAtMzAsMTMgKzMwLDEzIEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCiAjaW5jbHVkZSAiZHZiX2Zyb250ZW5kLmgiCi0jaW5jbHVkZSAidGRhMTAwMjEuaCIKKyNpbmNsdWRlICJ0ZGExMDAyeC5oIgogCiAKIHN0cnVjdCB0ZGExMDAyMV9zdGF0ZSB7CiAJc3RydWN0IGkyY19hZGFwdGVyKiBpMmM7CiAJLyogY29uZmlndXJhdGlvbiBzZXR0aW5ncyAqLwotCWNvbnN0IHN0cnVjdCB0ZGExMDAyMV9jb25maWcqIGNvbmZpZzsKKwljb25zdCBzdHJ1Y3QgdGRhMTAwMnhfY29uZmlnKiBjb25maWc7CiAJc3RydWN0IGR2Yl9mcm9udGVuZCBmcm9udGVuZDsKIAogCXU4IHB3bTsKQEAgLTUzLDkgKzUzLDYgQEAKIHN0YXRpYyBpbnQgdmVyYm9zZTsKIAogI2RlZmluZSBYSU4gNTc4NDAwMDBVTAotI2RlZmluZSBESVNBQkxFX0lOVkVSU0lPTihyZWcwKQkJZG8geyByZWcwIHw9IDB4MjA7IH0gd2hpbGUgKDApCi0jZGVmaW5lIEVOQUJMRV9JTlZFUlNJT04ocmVnMCkJCWRvIHsgcmVnMCAmPSB+MHgyMDsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgSEFTX0lOVkVSU0lPTihyZWcwKQkJKCEocmVnMCAmIDB4MjApKQogCiAjZGVmaW5lIEZJTiAoWElOID4+IDQpCiAKQEAgLTY0LDcgKzYxLDcgQEAKIHsKIAkweDczLCAweDZhLCAweDIzLCAweDBhLCAweDAyLCAweDM3LCAweDc3LCAweDFhLAogCTB4MzcsIDB4NmEsIDB4MTcsIDB4OGEsIDB4MWUsIDB4ODYsIDB4NDMsIDB4NDAsCi0JMHhiOCwgMHgzZiwgMHhhMCwgMHgwMCwgMHhjZCwgMHgwMSwgMHgwMCwgMHhmZiwKKwkweGI4LCAweDNmLCAweGExLCAweDAwLCAweGNkLCAweDAxLCAweDAwLCAweGZmLAogCTB4MTEsIDB4MDAsIDB4N2MsIDB4MzEsIDB4MzAsIDB4MjAsIDB4MDAsIDB4MDAsCiAJMHgwMiwgMHgwMCwgMHgwMCwgMHg3ZCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKIAkweDA3LCAweDAwLCAweDMzLCAweDExLCAweDBkLCAweDk1LCAweDA4LCAweDU4LApAQCAtOTcsNyArOTQsOCBAQAogCWludCByZXQ7CiAKIAlyZXQgPSBpMmNfdHJhbnNmZXIgKHN0YXRlLT5pMmMsIG1zZywgMik7Ci0JaWYgKHJldCAhPSAyKQorCS8vIERvbid0IHByaW50IGFuIGVycm9yIG1lc3NhZ2UgaWYgdGhlIGlkIGlzIHJlYWQuCisJaWYgKHJldCAhPSAyICYmIHJlZyAhPSAweDFhKQogCQlwcmludGsoIkRWQjogVERBMTAwMjE6ICVzOiByZWFkcmVnIGVycm9yIChyZXQgPT0gJWkpXG4iLAogCQkJCV9fRlVOQ1RJT05fXywgcmV0KTsKIAlyZXR1cm4gYjFbMF07CkBAIC0xMzYsMTAgKzEzNCwxMCBAQAogewogCXJlZzAgfD0gc3RhdGUtPnJlZzAgJiAweDYzOwogCi0JaWYgKElOVkVSU0lPTl9PTiA9PSBpbnZlcnNpb24pCi0JCUVOQUJMRV9JTlZFUlNJT04ocmVnMCk7Ci0JZWxzZSBpZiAoSU5WRVJTSU9OX09GRiA9PSBpbnZlcnNpb24pCi0JCURJU0FCTEVfSU5WRVJTSU9OKHJlZzApOworCWlmICgoSU5WRVJTSU9OX09OID09IGludmVyc2lvbikgXiAoc3RhdGUtPmNvbmZpZy0+aW52ZXJ0ID09IDApKQorCQlyZWcwICY9IH4weDIwOworCWVsc2UKKwkJcmVnMCB8PSAweDIwOwogCiAJX3RkYTEwMDIxX3dyaXRlcmVnIChzdGF0ZSwgMHgwMCwgcmVnMCAmIDB4ZmUpOwogCV90ZGExMDAyMV93cml0ZXJlZyAoc3RhdGUsIDB4MDAsIHJlZzAgfCAweDAxKTsKQEAgLTIwMSwxNiArMTk5LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB0ZGExMDAyMV93cml0ZShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTggKmJ1ZiwgaW50IGxlbikKLXsKLQlzdHJ1Y3QgdGRhMTAwMjFfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7Ci0KLQlpZiAobGVuICE9IDIpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcmV0dXJuIF90ZGExMDAyMV93cml0ZXJlZyhzdGF0ZSwgYnVmWzBdLCBidWZbMV0pOwotfQotCiBzdGF0aWMgaW50IHRkYTEwMDIxX2luaXQgKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQogewogCXN0cnVjdCB0ZGExMDAyMV9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKQEAgLTI1OCw2ICsyNDYsOSBAQAogCWlmIChxYW0gPCAwIHx8IHFhbSA+IDUpCiAJCXJldHVybiAtRUlOVkFMOwogCisJaWYgKHAtPmludmVyc2lvbiAhPSBJTlZFUlNJT05fT04gJiYgcC0+aW52ZXJzaW9uICE9IElOVkVSU0lPTl9PRkYpCisJCXJldHVybiAtRUlOVkFMOworCiAJLy9wcmludGsoInRkYTEwMDIxOiBzZXQgZnJlcXVlbmN5IHRvICVkIHFhbT0lZCBzeW1yYXRlPSVkXG4iLCBwLT5mcmVxdWVuY3kscWFtLHAtPnUucWFtLnN5bWJvbF9yYXRlKTsKIAogCWlmIChmZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zKSB7CkBAIC0zNjYsNyArMzU3LDcgQEAKIAkJICAgICAgIC0oKHMzMilwLT51LnFhbS5zeW1ib2xfcmF0ZSAqIGFmYykgPj4gMTApOwogCX0KIAotCXAtPmludmVyc2lvbiA9IEhBU19JTlZFUlNJT04oc3RhdGUtPnJlZzApID8gSU5WRVJTSU9OX09OIDogSU5WRVJTSU9OX09GRjsKKwlwLT5pbnZlcnNpb24gPSAoKHN0YXRlLT5yZWcwICYgMHgyMCkgPT0gMHgyMCkgXiAoc3RhdGUtPmNvbmZpZy0+aW52ZXJ0ICE9IDApID8gSU5WRVJTSU9OX09OIDogSU5WRVJTSU9OX09GRjsKIAlwLT51LnFhbS5tb2R1bGF0aW9uID0gKChzdGF0ZS0+cmVnMCA+PiAyKSAmIDcpICsgUUFNXzE2OwogCiAJcC0+dS5xYW0uZmVjX2lubmVyID0gRkVDX05PTkU7CkBAIC00MDgsMTEgKzM5OSwxMiBAQAogCiBzdGF0aWMgc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMgdGRhMTAwMjFfb3BzOwogCi1zdHJ1Y3QgZHZiX2Zyb250ZW5kKiB0ZGExMDAyMV9hdHRhY2goY29uc3Qgc3RydWN0IHRkYTEwMDIxX2NvbmZpZyogY29uZmlnLAorc3RydWN0IGR2Yl9mcm9udGVuZCogdGRhMTAwMjFfYXR0YWNoKGNvbnN0IHN0cnVjdCB0ZGExMDAyeF9jb25maWcqIGNvbmZpZywKIAkJCQkgICAgIHN0cnVjdCBpMmNfYWRhcHRlciogaTJjLAogCQkJCSAgICAgdTggcHdtKQogewogCXN0cnVjdCB0ZGExMDAyMV9zdGF0ZSogc3RhdGUgPSBOVUxMOworCXU4IGlkOwogCiAJLyogYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgaW50ZXJuYWwgc3RhdGUgKi8KIAlzdGF0ZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB0ZGExMDAyMV9zdGF0ZSksIEdGUF9LRVJORUwpOwpAQCAtNDI1LDcgKzQxNywxMSBAQAogCXN0YXRlLT5yZWcwID0gdGRhMTAwMjFfaW5pdHRhYlswXTsKIAogCS8qIGNoZWNrIGlmIHRoZSBkZW1vZCBpcyB0aGVyZSAqLwotCWlmICgodGRhMTAwMjFfcmVhZHJlZyhzdGF0ZSwgMHgxYSkgJiAweGYwKSAhPSAweDcwKSBnb3RvIGVycm9yOworCWlkID0gdGRhMTAwMjFfcmVhZHJlZyhzdGF0ZSwgMHgxYSk7CisJaWYgKChpZCAmIDB4ZjApICE9IDB4NzApIGdvdG8gZXJyb3I7CisKKwlwcmludGsoIlREQTEwMDIxOiBpMmMtYWRkciA9IDB4JTAyeCwgaWQgPSAweCUwMnhcbiIsCisJICAgICAgIHN0YXRlLT5jb25maWctPmRlbW9kX2FkZHJlc3MsIGlkKTsKIAogCS8qIGNyZWF0ZSBkdmJfZnJvbnRlbmQgKi8KIAltZW1jcHkoJnN0YXRlLT5mcm9udGVuZC5vcHMsICZ0ZGExMDAyMV9vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOwpAQCAtNDQ3LDcgKzQ0Myw3IEBACiAJCS5mcmVxdWVuY3lfbWF4ID0gODU4MDAwMDAwLAogCQkuc3ltYm9sX3JhdGVfbWluID0gKFhJTi8yKS82NCwgICAgIC8qIFNBQ0xLLzY0ID09IChYSU4vMikvNjQgKi8KIAkJLnN5bWJvbF9yYXRlX21heCA9IChYSU4vMikvNCwgICAgICAvKiBTQUNMSy80ICovCi0jaWYgMAorCSNpZiAwCiAJCS5mcmVxdWVuY3lfdG9sZXJhbmNlID0gPz8/LAogCQkuc3ltYm9sX3JhdGVfdG9sZXJhbmNlID0gPz8/LCAgLyogcHBtICovICAvKiA9PSA4JSAoc3BlYyBwLiA1KSAqLwogCSNlbmRpZgpAQCAtNDYxLDcgKzQ1Nyw2IEBACiAKIAkuaW5pdCA9IHRkYTEwMDIxX2luaXQsCiAJLnNsZWVwID0gdGRhMTAwMjFfc2xlZXAsCi0JLndyaXRlID0gdGRhMTAwMjFfd3JpdGUsCiAJLmkyY19nYXRlX2N0cmwgPSB0ZGExMDAyMV9pMmNfZ2F0ZV9jdHJsLAogCiAJLnNldF9mcm9udGVuZCA9IHRkYTEwMDIxX3NldF9wYXJhbWV0ZXJzLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTEwMDIzLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhMTAwMjMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTc5NmU3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTEwMDIzLmMKQEAgLTAsMCArMSw1NDAgQEAKKy8qCisgICAgVERBMTAwMjMgIC0gRFZCLUMgZGVjb2RlcgorICAgIChhcyB1c2VkIGluIFBoaWxpcHMgQ1UxMjE2LTMgTklNIGFuZCB0aGUgUmVlbGJveCBEVkItQyB0dW5lciBjYXJkKQorCisgICAgQ29weXJpZ2h0IChDKSAyMDA1IEdlb3JnIEFjaGVyLCBCYXlDb20gR21iSCAoYWNoZXIgYXQgYmF5Y29tIGRvdCBkZSkKKyAgICBDb3B5cmlnaHQgKGMpIDIwMDYgSGFydG11dCBCaXJyIChlOWhhY2sgYXQgZ21haWwgZG90IGNvbSkKKworICAgIFJlbW90ZWx5IGJhc2VkIG9uIHRkYTEwMDIxLmMKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTkgQ29udmVyZ2VuY2UgSW50ZWdyYXRlZCBNZWRpYSBHbWJIIDxyYWxwaEBjb252ZXJnZW5jZS5kZT4KKyAgICBDb3B5cmlnaHQgKEMpIDIwMDQgTWFya3VzIFNjaHVseiA8bXNjQGFudHpzeXN0ZW0uZGU+CisJCSAgIFN1cHBvcnQgZm9yIFREQTEwMDIxCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyovCisKKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgorCisjaW5jbHVkZSAiZHZiX2Zyb250ZW5kLmgiCisjaW5jbHVkZSAidGRhMTAwMnguaCIKKworCitzdHJ1Y3QgdGRhMTAwMjNfc3RhdGUgeworCXN0cnVjdCBpMmNfYWRhcHRlciogaTJjOworCS8qIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgKi8KKwljb25zdCBzdHJ1Y3QgdGRhMTAwMnhfY29uZmlnKiBjb25maWc7CisJc3RydWN0IGR2Yl9mcm9udGVuZCBmcm9udGVuZDsKKworCXU4IHB3bTsKKwl1OCByZWcwOworfTsKKworCisjZGVmaW5lIGRwcmludGsoeC4uLikKKworc3RhdGljIGludCB2ZXJib3NlOworCisjZGVmaW5lIFhUQUwgICAyODkyMDAwMFVMCisjZGVmaW5lIFBMTF9NICA4VUwKKyNkZWZpbmUgUExMX1AgIDRVTAorI2RlZmluZSBQTExfTiAgMVVMCisjZGVmaW5lIFNZU0NMSyAoWFRBTCpQTExfTS8oUExMX04qUExMX1ApKSAgLy8gLT4gNTc4NDAwMDAKKworc3RhdGljIHU4IHRkYTEwMDIzX2luaXR0YWJbXT17CisJLy8gcmVnIG1hc2sgdmFsCisJMHgyYSwweGZmLDB4MDIsICAvLyBQTEwzLCBCeXBhc3MsIFBvd2VyIERvd24KKwkweGZmLDB4NjQsMHgwMCwgIC8vIFNsZWVwIDEwMG1zCisJMHgyYSwweGZmLDB4MDMsICAvLyBQTEwzLCBCeXBhc3MsIFBvd2VyIERvd24KKwkweGZmLDB4NjQsMHgwMCwgIC8vIFNsZWVwIDEwMG1zCisJMHgyOCwweGZmLFBMTF9NLTEsICAvLyBQTEwxIE09OAorCTB4MjksMHhmZiwoKFBMTF9QLTEpPDw2KXwoUExMX04tMSksICAvLyBQTEwyCisJMHgwMCwweGZmLDB4MjMsICAvLyBHUFIgRlNBTVBMSU5HPTEKKwkweDJhLDB4ZmYsMHgwOCwgIC8vIFBMTDMgUFNBQ0xLPTEKKwkweGZmLDB4NjQsMHgwMCwgIC8vIFNsZWVwIDEwMG1zCisJMHgxZiwweGZmLDB4MDAsICAvLyBSRVNFVAorCTB4ZmYsMHg2NCwweDAwLCAgLy8gU2xlZXAgMTAwbXMKKwkweGU2LDB4MGMsMHgwNCwgIC8vIFJTQ0ZHX0lORAorCTB4MTAsMHhjMCwweDgwLCAgLy8gREVDRFZCQ0ZHMSBQQkVSPTEKKworCTB4MGUsMHhmZiwweDgyLCAgLy8gR0FJTjEKKwkweDAzLDB4MDgsMHgwOCwgIC8vIENMS0NPTkYgRFlOPTEKKwkweDJlLDB4YmYsMHgzMCwgIC8vIEFHQ0NPTkYyIFRSSUFHQz0wLFBPU0FHQz1FTkFHQ0lGPTEgUFBXTVRVTj0wIFBQV01JRj0wCisJMHgwMSwweGZmLDB4MzAsICAvLyBBR0NSRUYKKwkweDFlLDB4ODQsMHg4NCwgIC8vIENPTlRST0wgU0FDTEtfT049MQorCTB4MWIsMHhmZiwweGM4LCAgLy8gQURDIFRXT1M9MQorCTB4M2IsMHhmZiwweGZmLCAgLy8gSUZNQVgKKwkweDNjLDB4ZmYsMHgwMCwgIC8vIElGTUlOCisJMHgzNCwweGZmLDB4MDAsICAvLyBQV01SRUYKKwkweDM1LDB4ZmYsMHhmZiwgIC8vIFRVTk1BWAorCTB4MzYsMHhmZiwweDAwLCAgLy8gVFVOTUlOCisJMHgwNiwweGZmLDB4N2YsICAvLyBFUUNPTkYxIFBPU0k9NyBFTkFEQVBUPUVORVFVQUw9REZFPTEgICAgLy8gMHg3NworCTB4MWMsMHgzMCwweDMwLCAgLy8gRVFDT05GMiBTVEVQQUxHTz1TR05BTEdPPTEKKwkweDM3LDB4ZmYsMHhmNiwgIC8vIERFTFRBRl9MU0IKKwkweDM4LDB4ZmYsMHhmZiwgIC8vIERFTFRBRl9NU0IKKwkweDAyLDB4ZmYsMHg5MywgIC8vIEFHQ0NPTkYxICBJRlM9MSBLQUdDSUY9MiBLQUdDVFVOPTMKKwkweDJkLDB4ZmYsMHhmNiwgIC8vIFNXRUVQIFNXUE9TPTEgU1dEWU49NyBTV1NURVA9MSBTV0xFTj0yCisJMHgwNCwweDEwLDB4MDAsICAgLy8gU1dSQU1QPTEKKwkweDEyLDB4ZmYsMHhhMSwgIC8vIElOVFAxIFBPQ0xLUD0xIEZFTD0xIE1GUz0wCisJMHgyYiwweDAxLDB4YTEsICAvLyBJTlRTMQorCTB4MjAsMHhmZiwweDA0LCAgLy8gSU5UUDIgU1dBUFA9PyBNU0JGSVJTVFA9PyBJTlRQU0VMPT8KKwkweDJjLDB4ZmYsMHgwZCwgIC8vIElOVFAvUyBUUklQPTAgVFJJUz0wCisJMHhjNCwweGZmLDB4MDAsCisJMHhjMywweDMwLDB4MDAsCisJMHhiNSwweGZmLDB4MTksICAvLyBFUkFHQ19USEQKKwkweDAwLDB4MDMsMHgwMSwgIC8vIEdQUiwgQ0xCUyBzb2Z0IHJlc2V0CisJMHgwMCwweDAzLDB4MDMsICAvLyBHUFIsIENMQlMgc29mdCByZXNldAorCTB4ZmYsMHg2NCwweDAwLCAgLy8gU2xlZXAgMTAwbXMKKwkweGZmLDB4ZmYsMHhmZgorfTsKKworc3RhdGljIHU4IHRkYTEwMDIzX3JlYWRyZWcgKHN0cnVjdCB0ZGExMDAyM19zdGF0ZSogc3RhdGUsIHU4IHJlZykKK3sKKwl1OCBiMCBbXSA9IHsgcmVnIH07CisJdTggYjEgW10gPSB7IDAgfTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2cgW10gPSB7IHsgLmFkZHIgPSBzdGF0ZS0+Y29uZmlnLT5kZW1vZF9hZGRyZXNzLCAuZmxhZ3MgPSAwLCAuYnVmID0gYjAsIC5sZW4gPSAxIH0sCisJCQkJICB7IC5hZGRyID0gc3RhdGUtPmNvbmZpZy0+ZGVtb2RfYWRkcmVzcywgLmZsYWdzID0gSTJDX01fUkQsIC5idWYgPSBiMSwgLmxlbiA9IDEgfSB9OworCWludCByZXQ7CisKKwlyZXQgPSBpMmNfdHJhbnNmZXIgKHN0YXRlLT5pMmMsIG1zZywgMik7CisJaWYgKHJldCAhPSAyKQorCQlwcmludGsoIkRWQjogVERBMTAwMjM6ICVzOiByZWFkcmVnIGVycm9yIChyZXQgPT0gJWkpXG4iLAorCQkJCSBfX0ZVTkNUSU9OX18sIHJldCk7CisJcmV0dXJuIGIxWzBdOworfQorCitzdGF0aWMgaW50IHRkYTEwMDIzX3dyaXRlcmVnIChzdHJ1Y3QgdGRhMTAwMjNfc3RhdGUqIHN0YXRlLCB1OCByZWcsIHU4IGRhdGEpCit7CisJdTggYnVmW10gPSB7IHJlZywgZGF0YSB9OworCXN0cnVjdCBpMmNfbXNnIG1zZyA9IHsgLmFkZHIgPSBzdGF0ZS0+Y29uZmlnLT5kZW1vZF9hZGRyZXNzLCAuZmxhZ3MgPSAwLCAuYnVmID0gYnVmLCAubGVuID0gMiB9OworCWludCByZXQ7CisKKwlyZXQgPSBpMmNfdHJhbnNmZXIgKHN0YXRlLT5pMmMsICZtc2csIDEpOworCWlmIChyZXQgIT0gMSkKKwkJcHJpbnRrKCJEVkI6IFREQTEwMDIzKCVkKTogJXMsIHdyaXRlcmVnIGVycm9yICIKKwkJCSIocmVnID09IDB4JTAyeCwgdmFsID09IDB4JTAyeCwgcmV0ID09ICVpKVxuIiwKKwkJCXN0YXRlLT5mcm9udGVuZC5kdmItPm51bSwgX19GVU5DVElPTl9fLCByZWcsIGRhdGEsIHJldCk7CisKKwlyZXR1cm4gKHJldCAhPSAxKSA/IC1FUkVNT1RFSU8gOiAwOworfQorCisKK3N0YXRpYyBpbnQgdGRhMTAwMjNfd3JpdGViaXQgKHN0cnVjdCB0ZGExMDAyM19zdGF0ZSogc3RhdGUsIHU4IHJlZywgdTggbWFzayx1OCBkYXRhKQoreworCWlmIChtYXNrPT0weGZmKQorCQlyZXR1cm4gdGRhMTAwMjNfd3JpdGVyZWcoc3RhdGUsIHJlZywgZGF0YSk7CisJZWxzZSB7CisJCXU4IHZhbDsKKwkJdmFsPXRkYTEwMDIzX3JlYWRyZWcoc3RhdGUscmVnKTsKKwkJdmFsJj1+bWFzazsKKwkJdmFsfD0oZGF0YSZtYXNrKTsKKwkJcmV0dXJuIHRkYTEwMDIzX3dyaXRlcmVnKHN0YXRlLCByZWcsIHZhbCk7CisJfQorfQorCitzdGF0aWMgdm9pZCB0ZGExMDAyM193cml0ZXRhYihzdHJ1Y3QgdGRhMTAwMjNfc3RhdGUqIHN0YXRlLCB1OCogdGFiKQoreworCXU4IHIsbSx2OworCXdoaWxlICgxKSB7CisJCXI9KnRhYisrOworCQltPSp0YWIrKzsKKwkJdj0qdGFiKys7CisJCWlmIChyPT0weGZmKSB7CisJCQlpZiAobT09MHhmZikKKwkJCQlicmVhazsKKwkJCWVsc2UKKwkJCQltc2xlZXAobSk7CisJCX0KKwkJZWxzZQorCQkJdGRhMTAwMjNfd3JpdGViaXQoc3RhdGUscixtLHYpOworCX0KK30KKworLy9nZXQgYWNjZXNzIHRvIHR1bmVyCitzdGF0aWMgaW50IGxvY2tfdHVuZXIoc3RydWN0IHRkYTEwMDIzX3N0YXRlKiBzdGF0ZSkKK3sKKwl1OCBidWZbMl0gPSB7IDB4MGYsIDB4YzAgfTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2cgPSB7LmFkZHI9c3RhdGUtPmNvbmZpZy0+ZGVtb2RfYWRkcmVzcywgLmZsYWdzPTAsIC5idWY9YnVmLCAubGVuPTJ9OworCisJaWYoaTJjX3RyYW5zZmVyKHN0YXRlLT5pMmMsICZtc2csIDEpICE9IDEpCisJeworCQlwcmludGsoInRkYTEwMDIzOiBsb2NrIHR1bmVyIGZhaWxzXG4iKTsKKwkJcmV0dXJuIC1FUkVNT1RFSU87CisJfQorCXJldHVybiAwOworfQorCisvL3JlbGVhc2UgYWNjZXNzIGZyb20gdHVuZXIKK3N0YXRpYyBpbnQgdW5sb2NrX3R1bmVyKHN0cnVjdCB0ZGExMDAyM19zdGF0ZSogc3RhdGUpCit7CisJdTggYnVmWzJdID0geyAweDBmLCAweDQwIH07CisJc3RydWN0IGkyY19tc2cgbXNnX3Bvc3Q9ey5hZGRyPXN0YXRlLT5jb25maWctPmRlbW9kX2FkZHJlc3MsIC5mbGFncz0wLCAuYnVmPWJ1ZiwgLmxlbj0yfTsKKworCWlmKGkyY190cmFuc2ZlcihzdGF0ZS0+aTJjLCAmbXNnX3Bvc3QsIDEpICE9IDEpCisJeworCQlwcmludGsoInRkYTEwMDIzOiB1bmxvY2sgdHVuZXIgZmFpbHNcbiIpOworCQlyZXR1cm4gLUVSRU1PVEVJTzsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGRhMTAwMjNfc2V0dXBfcmVnMCAoc3RydWN0IHRkYTEwMDIzX3N0YXRlKiBzdGF0ZSwgdTggcmVnMCkKK3sKKwlyZWcwIHw9IHN0YXRlLT5yZWcwICYgMHg2MzsKKworCXRkYTEwMDIzX3dyaXRlcmVnIChzdGF0ZSwgMHgwMCwgcmVnMCAmIDB4ZmUpOworCXRkYTEwMDIzX3dyaXRlcmVnIChzdGF0ZSwgMHgwMCwgcmVnMCB8IDB4MDEpOworCisJc3RhdGUtPnJlZzAgPSByZWcwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRkYTEwMDIzX3NldF9zeW1ib2xyYXRlIChzdHJ1Y3QgdGRhMTAwMjNfc3RhdGUqIHN0YXRlLCB1MzIgc3IpCit7CisJczMyIEJEUjsKKwlzMzIgQkRSSTsKKwlzMTYgU0ZJTD0wOworCXUxNiBOREVDID0gMDsKKworCWlmIChzciA+IChTWVNDTEsvKDIqNCkpKQorCQlzcj1TWVNDTEsvKDIqNCk7CisKKwlpZiAoc3I8ODcwMDAwKQorCQlzcj04NzAwMDA7CisKKwlpZiAoc3IgPCAodTMyKShTWVNDTEsvOTguNDApKSB7CisJCU5ERUM9MzsKKwkJU0ZJTD0xOworCX0gZWxzZSBpZiAoc3I8KHUzMikoU1lTQ0xLLzY0LjApKSB7CisJCU5ERUM9MzsKKwkJU0ZJTD0wOworCX0gZWxzZSBpZiAoc3I8KHUzMikoU1lTQ0xLLzQ5LjIpKSB7CisJCU5ERUM9MjsKKwkJU0ZJTD0xOworCX0gZWxzZSBpZiAoc3I8KHUzMikoU1lTQ0xLLzMyLjApKSB7CisJCU5ERUM9MjsKKwkJU0ZJTD0wOworCX0gZWxzZSBpZiAoc3I8KHUzMikoU1lTQ0xLLzI0LjYpKSB7CisJCU5ERUM9MTsKKwkJU0ZJTD0xOworCX0gZWxzZSBpZiAoc3I8KHUzMikoU1lTQ0xLLzE2LjApKSB7CisJCU5ERUM9MTsKKwkJU0ZJTD0wOworCX0gZWxzZSBpZiAoc3I8KHUzMikoU1lTQ0xLLzEyLjMpKSB7CisJCU5ERUM9MDsKKwkJU0ZJTD0xOworCX0KKworCUJEUkk9U1lTQ0xLKjE2OworCUJEUkk+Pj1OREVDOworCUJEUkkgKz1zci8yOworCUJEUkkgLz1zcjsKKworCWlmIChCRFJJPjI1NSkKKwkJQkRSST0yNTU7CisKKwl7CisJCXU2NCBCRFJYOworCisJCUJEUlg9MTw8KDI0K05ERUMpOworCQlCRFJYKj1zcjsKKwkJZG9fZGl2KEJEUlgsU1lTQ0xLKTsgCS8vIEJEUlgvPVNZU0NMSzsKKworCQlCRFI9KHMzMilCRFJYOworCX0KKy8vCXByaW50aygiU3ltYm9scmF0ZSAlaSwgQkRSICVpIEJEUkkgJWksIE5ERUMgJWlcbiIsc3IsQkRSLEJEUkksTkRFQyk7CisJdGRhMTAwMjNfd3JpdGViaXQgKHN0YXRlLCAweDAzLCAweGMwLCBOREVDPDw2KTsKKwl0ZGExMDAyM193cml0ZXJlZyAoc3RhdGUsIDB4MGEsIEJEUiYyNTUpOworCXRkYTEwMDIzX3dyaXRlcmVnIChzdGF0ZSwgMHgwYiwgKEJEUj4+OCkmMjU1KTsKKwl0ZGExMDAyM193cml0ZXJlZyAoc3RhdGUsIDB4MGMsIChCRFI+PjE2KSYzMSk7CisJdGRhMTAwMjNfd3JpdGVyZWcgKHN0YXRlLCAweDBkLCBCRFJJKTsKKwl0ZGExMDAyM193cml0ZXJlZyAoc3RhdGUsIDB4M2QsIChTRklMPDw3KSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGRhMTAwMjNfaW5pdCAoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCit7CisJc3RydWN0IHRkYTEwMDIzX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCisJZHByaW50aygiRFZCOiBUREExMDAyMyglZCk6IGluaXQgY2hpcFxuIiwgZmUtPmFkYXB0ZXItPm51bSk7CisKKwl0ZGExMDAyM193cml0ZXRhYihzdGF0ZSwgdGRhMTAwMjNfaW5pdHRhYik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0ZGExMDAyM19zZXRfcGFyYW1ldGVycyAoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCisJCQkgICAgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwKQoreworCXN0cnVjdCB0ZGExMDAyM19zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKworCXN0YXRpYyBpbnQgcWFtdmFsc1s2XVs2XSA9IHsKKwkJLy8gIFFBTSAgIExPQ0tUSFIgIE1TRVRIICAgQVJFRiBBR0NSRUZOWVEgIEVSQUdDTllRX1RIRAorCQl7ICg1PDwyKSwgIDB4NzgsICAgIDB4OGMsICAgMHg5NiwgICAweDc4LCAgIDB4NGMgIH0sICAvLyA0IFFBTQorCQl7ICgwPDwyKSwgIDB4ODcsICAgIDB4YTIsICAgMHg5MSwgICAweDhjLCAgIDB4NTcgIH0sICAvLyAxNiBRQU0KKwkJeyAoMTw8MiksICAweDY0LCAgICAweDc0LCAgIDB4OTYsICAgMHg4YywgICAweDU3ICB9LCAgLy8gMzIgUUFNCisJCXsgKDI8PDIpLCAgMHg0NiwgICAgMHg0MywgICAweDZhLCAgIDB4NmEsICAgMHg0NCAgfSwgIC8vIDY0IFFBTQorCQl7ICgzPDwyKSwgIDB4MzYsICAgIDB4MzQsICAgMHg3ZSwgICAweDc4LCAgIDB4NGMgIH0sICAvLyAxMjggUUFNCisJCXsgKDQ8PDIpLCAgMHgyNiwgICAgMHgyMywgICAweDZjLCAgIDB4NWMsICAgMHgzYyAgfSwgIC8vIDI1NiBRQU0KKwl9OworCisJaW50IHFhbSA9IHAtPnUucWFtLm1vZHVsYXRpb247CisKKwlpZiAocWFtIDwgMCB8fCBxYW0gPiA1KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChmZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zKSB7CisJCWZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMoZmUsIHApOworCQlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKSBmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDApOworCX0KKworCXRkYTEwMDIzX3NldF9zeW1ib2xyYXRlIChzdGF0ZSwgcC0+dS5xYW0uc3ltYm9sX3JhdGUpOworCXRkYTEwMDIzX3dyaXRlcmVnIChzdGF0ZSwgMHgwNSwgcWFtdmFsc1txYW1dWzFdKTsKKwl0ZGExMDAyM193cml0ZXJlZyAoc3RhdGUsIDB4MDgsIHFhbXZhbHNbcWFtXVsyXSk7CisJdGRhMTAwMjNfd3JpdGVyZWcgKHN0YXRlLCAweDA5LCBxYW12YWxzW3FhbV1bM10pOworCXRkYTEwMDIzX3dyaXRlcmVnIChzdGF0ZSwgMHhiNCwgcWFtdmFsc1txYW1dWzRdKTsKKwl0ZGExMDAyM193cml0ZXJlZyAoc3RhdGUsIDB4YjYsIHFhbXZhbHNbcWFtXVs1XSk7CisKKy8vCXRkYTEwMDIzX3dyaXRlcmVnIChzdGF0ZSwgMHgwNCwgKHAtPmludmVyc2lvbj8weDEyOjB4MzIpKTsKKy8vCXRkYTEwMDIzX3dyaXRlYml0IChzdGF0ZSwgMHgwNCwgMHg2MCwgKHAtPmludmVyc2lvbj8wOjB4MjApKTsKKwl0ZGExMDAyM193cml0ZWJpdCAoc3RhdGUsIDB4MDQsIDB4NDAsIDB4NDApOworCXRkYTEwMDIzX3NldHVwX3JlZzAgKHN0YXRlLCBxYW12YWxzW3FhbV1bMF0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGRhMTAwMjNfcmVhZF9zdGF0dXMoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGZlX3N0YXR1c190KiBzdGF0dXMpCit7CisJc3RydWN0IHRkYTEwMDIzX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCWludCBzeW5jOworCisJKnN0YXR1cyA9IDA7CisKKwkvLzB4MTFbMV0gPT0gQ0FSTE9DSyAtPiBDYXJyaWVyIGxvY2tlZAorCS8vMHgxMVsyXSA9PSBGU1lOQyAtPiBGcmFtZSBzeW5jaHJvbmlzYXRpb24KKwkvLzB4MTFbM10gPT0gRkVMIC0+IEZyb250IEVuZCBsb2NrZWQKKwkvLzB4MTFbNl0gPT0gTk9EVkIgLT4gRFZCIE1vZGUgSW5mb3JtYXRpb24KKwlzeW5jID0gdGRhMTAwMjNfcmVhZHJlZyAoc3RhdGUsIDB4MTEpOworCisJaWYgKHN5bmMgJiAyKQorCQkqc3RhdHVzIHw9IEZFX0hBU19TSUdOQUx8RkVfSEFTX0NBUlJJRVI7CisKKwlpZiAoc3luYyAmIDQpCisJCSpzdGF0dXMgfD0gRkVfSEFTX1NZTkN8RkVfSEFTX1ZJVEVSQkk7CisKKwlpZiAoc3luYyAmIDgpCisJCSpzdGF0dXMgfD0gRkVfSEFTX0xPQ0s7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0ZGExMDAyM19yZWFkX2JlcihzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTMyKiBiZXIpCit7CisJc3RydWN0IHRkYTEwMDIzX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXU4IGEsYixjOworCWE9dGRhMTAwMjNfcmVhZHJlZyhzdGF0ZSwgMHgxNCk7CisJYj10ZGExMDAyM19yZWFkcmVnKHN0YXRlLCAweDE1KTsKKwljPXRkYTEwMDIzX3JlYWRyZWcoc3RhdGUsIDB4MTYpJjB4ZjsKKwl0ZGExMDAyM193cml0ZWJpdCAoc3RhdGUsIDB4MTAsIDB4YzAsIDB4MDApOworCisJKmJlciA9IGEgfCAoYjw8OCl8IChjPDwxNik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGRhMTAwMjNfcmVhZF9zaWduYWxfc3RyZW5ndGgoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHUxNiogc3RyZW5ndGgpCit7CisJc3RydWN0IHRkYTEwMDIzX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXU4IGlmZ2Fpbj10ZGExMDAyM19yZWFkcmVnKHN0YXRlLCAweDJmKTsKKworCXUxNiBnYWluID0gKCgyNTUtdGRhMTAwMjNfcmVhZHJlZyhzdGF0ZSwgMHgxNykpKSArICgyNTUtaWZnYWluKS8xNjsKKwkvLyBNYXggcmF3IHZhbHVlIGlzIGFib3V0IDB4YjAgLT4gTm9ybWFsaXplIHRvID4weGYwIGFmdGVyIDB4OTAKKwlpZiAoZ2Fpbj4weDkwKQorCQlnYWluPWdhaW4rMiooZ2Fpbi0weDkwKTsKKwlpZiAoZ2Fpbj4yNTUpCisJCWdhaW49MjU1OworCisJKnN0cmVuZ3RoID0gKGdhaW48PDgpfGdhaW47CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGRhMTAwMjNfcmVhZF9zbnIoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHUxNiogc25yKQoreworCXN0cnVjdCB0ZGExMDAyM19zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKworCXU4IHF1YWxpdHkgPSB+dGRhMTAwMjNfcmVhZHJlZyhzdGF0ZSwgMHgxOCk7CisJKnNuciA9IChxdWFsaXR5IDw8IDgpIHwgcXVhbGl0eTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0ZGExMDAyM19yZWFkX3VjYmxvY2tzKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCB1MzIqIHVjYmxvY2tzKQoreworCXN0cnVjdCB0ZGExMDAyM19zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwl1OCBhLGIsYyxkOworCWE9IHRkYTEwMDIzX3JlYWRyZWcgKHN0YXRlLCAweDc0KTsKKwliPSB0ZGExMDAyM19yZWFkcmVnIChzdGF0ZSwgMHg3NSk7CisJYz0gdGRhMTAwMjNfcmVhZHJlZyAoc3RhdGUsIDB4NzYpOworCWQ9IHRkYTEwMDIzX3JlYWRyZWcgKHN0YXRlLCAweDc3KTsKKwkqdWNibG9ja3MgPSBhIHwgKGI8PDgpfChjPDwxNil8KGQ8PDI0KTsKKworCXRkYTEwMDIzX3dyaXRlYml0IChzdGF0ZSwgMHgxMCwgMHgyMCwweDAwKTsKKwl0ZGExMDAyM193cml0ZWJpdCAoc3RhdGUsIDB4MTAsIDB4MjAsMHgyMCk7CisJdGRhMTAwMjNfd3JpdGViaXQgKHN0YXRlLCAweDEzLCAweDAxLCAweDAwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRkYTEwMDIzX2dldF9mcm9udGVuZChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwKQoreworCXN0cnVjdCB0ZGExMDAyM19zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlpbnQgc3luYyxpbnY7CisJczggYWZjID0gMDsKKworCXN5bmMgPSB0ZGExMDAyM19yZWFkcmVnKHN0YXRlLCAweDExKTsKKwlhZmMgPSB0ZGExMDAyM19yZWFkcmVnKHN0YXRlLCAweDE5KTsKKwlpbnYgPSB0ZGExMDAyM19yZWFkcmVnKHN0YXRlLCAweDA0KTsKKworCWlmICh2ZXJib3NlKSB7CisJCS8qIEFGQyBvbmx5IHZhbGlkIHdoZW4gY2FycmllciBoYXMgYmVlbiByZWNvdmVyZWQgKi8KKwkJcHJpbnRrKHN5bmMgJiAyID8gIkRWQjogVERBMTAwMjMoJWQpOiBBRkMgKCVkKSAlZEh6XG4iIDoKKwkJCQkgICJEVkI6IFREQTEwMDIzKCVkKTogW0FGQyAoJWQpICVkSHpdXG4iLAorCQkJc3RhdGUtPmZyb250ZW5kLmR2Yi0+bnVtLCBhZmMsCisJCSAgICAgICAtKChzMzIpcC0+dS5xYW0uc3ltYm9sX3JhdGUgKiBhZmMpID4+IDEwKTsKKwl9CisKKwlwLT5pbnZlcnNpb24gPSAoaW52JjB4MjA/MDoxKTsKKwlwLT51LnFhbS5tb2R1bGF0aW9uID0gKChzdGF0ZS0+cmVnMCA+PiAyKSAmIDcpICsgUUFNXzE2OworCisJcC0+dS5xYW0uZmVjX2lubmVyID0gRkVDX05PTkU7CisJcC0+ZnJlcXVlbmN5ID0gKChwLT5mcmVxdWVuY3kgKyAzMTI1MCkgLyA2MjUwMCkgKiA2MjUwMDsKKworCWlmIChzeW5jICYgMikKKwkJcC0+ZnJlcXVlbmN5IC09ICgoczMyKXAtPnUucWFtLnN5bWJvbF9yYXRlICogYWZjKSA+PiAxMDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRkYTEwMDIzX3NsZWVwKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKQoreworCXN0cnVjdCB0ZGExMDAyM19zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKworCXRkYTEwMDIzX3dyaXRlcmVnIChzdGF0ZSwgMHgxYiwgMHgwMik7ICAvKiBwZG93biBBREMgKi8KKwl0ZGExMDAyM193cml0ZXJlZyAoc3RhdGUsIDB4MDAsIDB4ODApOyAgLyogc3RhbmRieSAqLworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGRhMTAwMjNfaTJjX2dhdGVfY3RybChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgaW50IGVuYWJsZSkKK3sKKwlzdHJ1Y3QgdGRhMTAwMjNfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisKKwlpZiAoZW5hYmxlKSB7CisJCWxvY2tfdHVuZXIoc3RhdGUpOworCX0gZWxzZSB7CisJCXVubG9ja190dW5lcihzdGF0ZSk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB0ZGExMDAyM19yZWxlYXNlKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKQoreworCXN0cnVjdCB0ZGExMDAyM19zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlrZnJlZShzdGF0ZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyB0ZGExMDAyM19vcHM7CisKK3N0cnVjdCBkdmJfZnJvbnRlbmQqIHRkYTEwMDIzX2F0dGFjaChjb25zdCBzdHJ1Y3QgdGRhMTAwMnhfY29uZmlnKiBjb25maWcsCisJCQkJICAgICBzdHJ1Y3QgaTJjX2FkYXB0ZXIqIGkyYywKKwkJCQkgICAgIHU4IHB3bSkKK3sKKwlzdHJ1Y3QgdGRhMTAwMjNfc3RhdGUqIHN0YXRlID0gTlVMTDsKKwlpbnQgaTsKKworCS8qIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGludGVybmFsIHN0YXRlICovCisJc3RhdGUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdGRhMTAwMjNfc3RhdGUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3RhdGUgPT0gTlVMTCkgZ290byBlcnJvcjsKKworCS8qIHNldHVwIHRoZSBzdGF0ZSAqLworCXN0YXRlLT5jb25maWcgPSBjb25maWc7CisJc3RhdGUtPmkyYyA9IGkyYzsKKwltZW1jcHkoJnN0YXRlLT5mcm9udGVuZC5vcHMsICZ0ZGExMDAyM19vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOworCXN0YXRlLT5wd20gPSBwd207CisJZm9yIChpPTA7IGkgPCBzaXplb2YodGRhMTAwMjNfaW5pdHRhYikvc2l6ZW9mKCp0ZGExMDAyM19pbml0dGFiKTtpKz0zKSB7CisJCWlmICh0ZGExMDAyM19pbml0dGFiW2ldID09IDB4MDApIHsKKwkJCXN0YXRlLT5yZWcwID0gdGRhMTAwMjNfaW5pdHRhYltpKzJdOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvLyBXYWtldXAgaWYgaW4gc3RhbmRieQorCXRkYTEwMDIzX3dyaXRlcmVnIChzdGF0ZSwgMHgwMCwgMHgzMyk7CisJLyogY2hlY2sgaWYgdGhlIGRlbW9kIGlzIHRoZXJlICovCisJaWYgKCh0ZGExMDAyM19yZWFkcmVnKHN0YXRlLCAweDFhKSAmIDB4ZjApICE9IDB4NzApIGdvdG8gZXJyb3I7CisKKwkvKiBjcmVhdGUgZHZiX2Zyb250ZW5kICovCisJbWVtY3B5KCZzdGF0ZS0+ZnJvbnRlbmQub3BzLCAmdGRhMTAwMjNfb3BzLCBzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMpKTsKKwlzdGF0ZS0+ZnJvbnRlbmQuZGVtb2R1bGF0b3JfcHJpdiA9IHN0YXRlOworCXJldHVybiAmc3RhdGUtPmZyb250ZW5kOworCitlcnJvcjoKKwlrZnJlZShzdGF0ZSk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyB0ZGExMDAyM19vcHMgPSB7CisKKwkuaW5mbyA9IHsKKwkJLm5hbWUgPSAiUGhpbGlwcyBUREExMDAyMyBEVkItQyIsCisJCS50eXBlID0gRkVfUUFNLAorCQkuZnJlcXVlbmN5X3N0ZXBzaXplID0gNjI1MDAsCisJCS5mcmVxdWVuY3lfbWluID0gNTEwMDAwMDAsCisJCS5mcmVxdWVuY3lfbWF4ID0gODU4MDAwMDAwLAorCQkuc3ltYm9sX3JhdGVfbWluID0gKFNZU0NMSy8yKS82NCwgICAgIC8qIFNBQ0xLLzY0ID09IChTWVNDTEsvMikvNjQgKi8KKwkJLnN5bWJvbF9yYXRlX21heCA9IChTWVNDTEsvMikvNCwgICAgICAvKiBTQUNMSy80ICovCisJCS5jYXBzID0gMHg0MDAgfCAvL0ZFX0NBTl9RQU1fNAorCQkJRkVfQ0FOX1FBTV8xNiB8IEZFX0NBTl9RQU1fMzIgfCBGRV9DQU5fUUFNXzY0IHwKKwkJCUZFX0NBTl9RQU1fMTI4IHwgRkVfQ0FOX1FBTV8yNTYgfAorCQkJRkVfQ0FOX0ZFQ19BVVRPCisJfSwKKworCS5yZWxlYXNlID0gdGRhMTAwMjNfcmVsZWFzZSwKKworCS5pbml0ID0gdGRhMTAwMjNfaW5pdCwKKwkuc2xlZXAgPSB0ZGExMDAyM19zbGVlcCwKKwkuaTJjX2dhdGVfY3RybCA9IHRkYTEwMDIzX2kyY19nYXRlX2N0cmwsCisKKwkuc2V0X2Zyb250ZW5kID0gdGRhMTAwMjNfc2V0X3BhcmFtZXRlcnMsCisJLmdldF9mcm9udGVuZCA9IHRkYTEwMDIzX2dldF9mcm9udGVuZCwKKworCS5yZWFkX3N0YXR1cyA9IHRkYTEwMDIzX3JlYWRfc3RhdHVzLAorCS5yZWFkX2JlciA9IHRkYTEwMDIzX3JlYWRfYmVyLAorCS5yZWFkX3NpZ25hbF9zdHJlbmd0aCA9IHRkYTEwMDIzX3JlYWRfc2lnbmFsX3N0cmVuZ3RoLAorCS5yZWFkX3NuciA9IHRkYTEwMDIzX3JlYWRfc25yLAorCS5yZWFkX3VjYmxvY2tzID0gdGRhMTAwMjNfcmVhZF91Y2Jsb2NrcywKK307CisKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJQaGlsaXBzIFREQTEwMDIzIERWQi1DIGRlbW9kdWxhdG9yIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiR2VvcmcgQWNoZXIsIEhhcnRtdXQgQmlyciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitFWFBPUlRfU1lNQk9MKHRkYTEwMDIzX2F0dGFjaCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhMTAwMjEuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGExMDAyeC5oCnNpbWlsYXJpdHkgaW5kZXggNjUlCnJlbmFtZSBmcm9tIGRyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGExMDAyMS5oCnJlbmFtZSB0byBkcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhMTAwMnguaAppbmRleCBlM2RhNzgwLi5lOTA5NGQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhMTAwMjEuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhMTAwMnguaApAQCAtMSw2ICsxLDYgQEAKIC8qCi0gICAgVERBMTAwMjEgIC0gU2luZ2xlIENoaXAgQ2FibGUgQ2hhbm5lbCBSZWNlaXZlciBkcml2ZXIgbW9kdWxlCi0JICAgICAgIHVzZWQgb24gdGhlIHRoZSBTaWVtZW5zIERWQi1DIGNhcmRzCisgICAgVERBMTAwMjEvVERBMTAwMjMgIC0gU2luZ2xlIENoaXAgQ2FibGUgQ2hhbm5lbCBSZWNlaXZlciBkcml2ZXIgbW9kdWxlCisJCQkgdXNlZCBvbiB0aGUgdGhlIFNpZW1lbnMgRFZCLUMgY2FyZHMKIAogICAgIENvcHlyaWdodCAoQykgMTk5OSBDb252ZXJnZW5jZSBJbnRlZ3JhdGVkIE1lZGlhIEdtYkggPHJhbHBoQGNvbnZlcmdlbmNlLmRlPgogICAgIENvcHlyaWdodCAoQykgMjAwNCBNYXJrdXMgU2NodWx6IDxtc2NAYW50enN5c3RlbS5kZT4KQEAgLTIxLDIyICsyMSwyMyBAQAogICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogKi8KIAotI2lmbmRlZiBUREExMDAyMV9ICi0jZGVmaW5lIFREQTEwMDIxX0gKKyNpZm5kZWYgVERBMTAwMnhfSAorI2RlZmluZSBUREExMDAyeF9ICiAKICNpbmNsdWRlIDxsaW51eC9kdmIvZnJvbnRlbmQuaD4KIAotc3RydWN0IHRkYTEwMDIxX2NvbmZpZworc3RydWN0IHRkYTEwMDJ4X2NvbmZpZwogewogCS8qIHRoZSBkZW1vZHVsYXRvcidzIGkyYyBhZGRyZXNzICovCiAJdTggZGVtb2RfYWRkcmVzczsKKwl1OCBpbnZlcnQ7CiB9OwogCiAjaWYgZGVmaW5lZChDT05GSUdfRFZCX1REQTEwMDIxKSB8fCAoZGVmaW5lZChDT05GSUdfRFZCX1REQTEwMDIxX01PRFVMRSkgJiYgZGVmaW5lZChNT0RVTEUpKQotZXh0ZXJuIHN0cnVjdCBkdmJfZnJvbnRlbmQqIHRkYTEwMDIxX2F0dGFjaChjb25zdCBzdHJ1Y3QgdGRhMTAwMjFfY29uZmlnKiBjb25maWcsCitleHRlcm4gc3RydWN0IGR2Yl9mcm9udGVuZCogdGRhMTAwMjFfYXR0YWNoKGNvbnN0IHN0cnVjdCB0ZGExMDAyeF9jb25maWcqIGNvbmZpZywKIAkJCQkJICAgIHN0cnVjdCBpMmNfYWRhcHRlciogaTJjLCB1OCBwd20pOwogI2Vsc2UKLXN0YXRpYyBpbmxpbmUgc3RydWN0IGR2Yl9mcm9udGVuZCogdGRhMTAwMjFfYXR0YWNoKGNvbnN0IHN0cnVjdCB0ZGExMDAyMV9jb25maWcqIGNvbmZpZywKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGR2Yl9mcm9udGVuZCogdGRhMTAwMjFfYXR0YWNoKGNvbnN0IHN0cnVjdCB0ZGExMDAyeF9jb25maWcqIGNvbmZpZywKIAkJCQkJICAgIHN0cnVjdCBpMmNfYWRhcHRlciogaTJjLCB1OCBwd20pCiB7CiAJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGRyaXZlciBkaXNhYmxlZCBieSBLY29uZmlnXG4iLCBfX0ZVTkNUSU9OX18pOwpAQCAtNDQsMTIgKzQ1LDE2IEBACiB9CiAjZW5kaWYgLy8gQ09ORklHX0RWQl9UREExMDAyMQogCi1zdGF0aWMgaW5saW5lIGludCB0ZGExMDAyMV93cml0ZXJlZyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTggcmVnLCB1OCB2YWwpIHsKLQlpbnQgciA9IDA7Ci0JdTggYnVmW10gPSB7cmVnLCB2YWx9OwotCWlmIChmZS0+b3BzLndyaXRlKQotCQlyID0gZmUtPm9wcy53cml0ZShmZSwgYnVmLCAyKTsKLQlyZXR1cm4gcjsKKyNpZiBkZWZpbmVkKENPTkZJR19EVkJfVERBMTAwMjMpIHx8IChkZWZpbmVkKENPTkZJR19EVkJfVERBMTAwMjNfTU9EVUxFKSAmJiBkZWZpbmVkKE1PRFVMRSkpCitleHRlcm4gc3RydWN0IGR2Yl9mcm9udGVuZCogdGRhMTAwMjNfYXR0YWNoKGNvbnN0IHN0cnVjdCB0ZGExMDAyeF9jb25maWcqIGNvbmZpZywKKwkJCQkJICAgIHN0cnVjdCBpMmNfYWRhcHRlciogaTJjLCB1OCBwd20pOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGR2Yl9mcm9udGVuZCogdGRhMTAwMjNfYXR0YWNoKGNvbnN0IHN0cnVjdCB0ZGExMDAyeF9jb25maWcqIGNvbmZpZywKKwkJCQkJICAgIHN0cnVjdCBpMmNfYWRhcHRlciogaTJjLCB1OCBwd20pCit7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGRyaXZlciBkaXNhYmxlZCBieSBLY29uZmlnXG4iLCBfX0ZVTkNUSU9OX18pOworCXJldHVybiBOVUxMOwogfQorI2VuZGlmIC8vIENPTkZJR19EVkJfVERBMTAwMjMKIAotI2VuZGlmIC8vIFREQTEwMDIxX0gKKyNlbmRpZiAvLyBUREExMDAyeF9ICmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhMTAwNHguYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGExMDA0eC5jCmluZGV4IGY0YTljZjkuLjMzYTg0MzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGExMDA0eC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGExMDA0eC5jCkBAIC00MCwyMCArNDAsNiBAQAogI2luY2x1ZGUgImR2Yl9mcm9udGVuZC5oIgogI2luY2x1ZGUgInRkYTEwMDR4LmgiCiAKLWVudW0gdGRhMTAwNHhfZGVtb2QgewotCVREQTEwMDRYX0RFTU9EX1REQTEwMDQ1LAotCVREQTEwMDRYX0RFTU9EX1REQTEwMDQ2LAotfTsKLQotc3RydWN0IHRkYTEwMDR4X3N0YXRlIHsKLQlzdHJ1Y3QgaTJjX2FkYXB0ZXIqIGkyYzsKLQljb25zdCBzdHJ1Y3QgdGRhMTAwNHhfY29uZmlnKiBjb25maWc7Ci0Jc3RydWN0IGR2Yl9mcm9udGVuZCBmcm9udGVuZDsKLQotCS8qIHByaXZhdGUgZGVtb2QgZGF0YSAqLwotCWVudW0gdGRhMTAwNHhfZGVtb2QgZGVtb2RfdHlwZTsKLX07Ci0KIHN0YXRpYyBpbnQgZGVidWc7CiAjZGVmaW5lIGRwcmludGsoYXJncy4uLikgXAogCWRvIHsgXApAQCAtNTA3LDM1ICs0OTMsNTEgQEAKIAkJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDRYX0NPTkZDNCwgMHg4MCk7CiAJfQogCXRkYTEwMDR4X3dyaXRlX21hc2soc3RhdGUsIFREQTEwMDQ2SF9DT05GX1RSSVNUQVRFMSwgMSwgMCk7CisJLyogc2V0IEdQSU8gMSBhbmQgMyAqLworCWlmIChzdGF0ZS0+Y29uZmlnLT5ncGlvX2NvbmZpZyAhPSBUREExMDA0Nl9HUFRSSSkgeworCQl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNDZIX0NPTkZfVFJJU1RBVEUyLCAweDMzKTsKKwkJdGRhMTAwNHhfd3JpdGVfbWFzayhzdGF0ZSwgVERBMTAwNDZIX0NPTkZfUE9MQVJJVFksIDB4MGYsIHN0YXRlLT5jb25maWctPmdwaW9fY29uZmlnICYweDBmKTsKKwl9CiAJLyogbGV0IHRoZSBjbG9ja3MgcmVjb3ZlciBmcm9tIHNsZWVwICovCi0JbXNsZWVwKDUpOworCW1zbGVlcCgxMCk7CiAKIAkvKiBUaGUgUExMcyBuZWVkIHRvIGJlIHJlcHJvZ3JhbW1lZCBhZnRlciBzbGVlcCAqLwogCXRkYTEwMDQ2X2luaXRfcGxscyhmZSk7CisJdGRhMTAwNHhfd3JpdGVfbWFzayhzdGF0ZSwgVERBMTAwNFhfQ09ORkFEQzIsIDB4YzAsIDApOwogCiAJLyogZG9uJ3QgcmUtdXBsb2FkIHVubGVzcyBuZWNlc3NhcnkgKi8KIAlpZiAodGRhMTAwNHhfY2hlY2tfdXBsb2FkX29rKHN0YXRlKSA9PSAwKQogCQlyZXR1cm4gMDsKIAorCXByaW50ayhLRVJOX0lORk8gInRkYTEwMDR4OiB0cnlpbmcgdG8gYm9vdCBmcm9tIGVlcHJvbVxuIik7CisJdGRhMTAwNHhfd3JpdGVfbWFzayhzdGF0ZSwgVERBMTAwNFhfQ09ORkM0LCA0LCA0KTsKKwltc2xlZXAoMzAwKTsKKwkvKiBkb24ndCByZS11cGxvYWQgdW5sZXNzIG5lY2Vzc2FyeSAqLworCWlmICh0ZGExMDA0eF9jaGVja191cGxvYWRfb2soc3RhdGUpID09IDApCisJCXJldHVybiAwOworCiAJaWYgKHN0YXRlLT5jb25maWctPnJlcXVlc3RfZmlybXdhcmUgIT0gTlVMTCkgewogCQkvKiByZXF1ZXN0IHRoZSBmaXJtd2FyZSwgdGhpcyB3aWxsIGJsb2NrIHVudGlsIHNvbWVvbmUgdXBsb2FkcyBpdCAqLwogCQlwcmludGsoS0VSTl9JTkZPICJ0ZGExMDA0eDogd2FpdGluZyBmb3IgZmlybXdhcmUgdXBsb2FkLi4uXG4iKTsKIAkJcmV0ID0gc3RhdGUtPmNvbmZpZy0+cmVxdWVzdF9maXJtd2FyZShmZSwgJmZ3LCBUREExMDA0Nl9ERUZBVUxUX0ZJUk1XQVJFKTsKIAkJaWYgKHJldCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJ0ZGExMDA0eDogbm8gZmlybXdhcmUgdXBsb2FkICh0aW1lb3V0IG9yIGZpbGUgbm90IGZvdW5kPylcbiIpOwotCQkJcmV0dXJuIHJldDsKKwkJCS8qIHJlbWFpbiBjb21wYXRpYmxlIHRvIG9sZCBidWc6IHRyeSB0byBsb2FkIHdpdGggdGRhMTAwNDUgaW1hZ2UgbmFtZSAqLworCQkJcmV0ID0gc3RhdGUtPmNvbmZpZy0+cmVxdWVzdF9maXJtd2FyZShmZSwgJmZ3LCBUREExMDA0NV9ERUZBVUxUX0ZJUk1XQVJFKTsKKwkJCWlmIChyZXQpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgInRkYTEwMDR4OiBubyBmaXJtd2FyZSB1cGxvYWQgKHRpbWVvdXQgb3IgZmlsZSBub3QgZm91bmQ/KVxuIik7CisJCQkJcmV0dXJuIHJldDsKKwkJCX0gZWxzZSB7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAidGRhMTAwNHg6IHBsZWFzZSByZW5hbWUgdGhlIGZpcm13YXJlIGZpbGUgdG8gJXNcbiIsCisJCQkJCQkgIFREQTEwMDQ2X0RFRkFVTFRfRklSTVdBUkUpOworCQkJfQogCQl9Ci0JCXRkYTEwMDR4X3dyaXRlX21hc2soc3RhdGUsIFREQTEwMDRYX0NPTkZDNCwgOCwgOCk7IC8vIGdvaW5nIHRvIGJvb3QgZnJvbSBIT1NUCi0JCXJldCA9IHRkYTEwMDR4X2RvX3VwbG9hZChzdGF0ZSwgZnctPmRhdGEsIGZ3LT5zaXplLCBUREExMDA0NkhfQ09ERV9DUFQsIFREQTEwMDQ2SF9DT0RFX0lOKTsKLQkJcmVsZWFzZV9maXJtd2FyZShmdyk7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OwogCX0gZWxzZSB7Ci0JCS8qIGJvb3QgZnJvbSBmaXJtd2FyZSBlZXByb20gKi8KLQkJcHJpbnRrKEtFUk5fSU5GTyAidGRhMTAwNHg6IGJvb3RpbmcgZnJvbSBlZXByb21cbiIpOwotCQl0ZGExMDA0eF93cml0ZV9tYXNrKHN0YXRlLCBUREExMDA0WF9DT05GQzQsIDQsIDQpOwotCQltc2xlZXAoMzAwKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJ0ZGExMDA0eDogbm8gcmVxdWVzdCBmdW5jdGlvbiBkZWZpbmVkLCBjYW4ndCB1cGxvYWQgZnJvbSBmaWxlXG4iKTsKKwkJcmV0dXJuIC1FSU87CiAJfQorCXRkYTEwMDR4X3dyaXRlX21hc2soc3RhdGUsIFREQTEwMDRYX0NPTkZDNCwgOCwgOCk7IC8vIGdvaW5nIHRvIGJvb3QgZnJvbSBIT1NUCisJcmV0ID0gdGRhMTAwNHhfZG9fdXBsb2FkKHN0YXRlLCBmdy0+ZGF0YSwgZnctPnNpemUsIFREQTEwMDQ2SF9DT0RFX0NQVCwgVERBMTAwNDZIX0NPREVfSU4pOworCXJlbGVhc2VfZmlybXdhcmUoZncpOwogCXJldHVybiB0ZGExMDA0eF9jaGVja191cGxvYWRfb2soc3RhdGUpOwogfQogCkBAIC02MzgsMzcgKzY0MCwzMyBAQAogCXN3aXRjaCAoc3RhdGUtPmNvbmZpZy0+YWdjX2NvbmZpZykgewogCWNhc2UgVERBMTAwNDZfQUdDX0RFRkFVTFQ6CiAJCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfQUdDX0NPTkYsIDB4MDApOyAvLyBBR0Mgc2V0dXAKLQkJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9DT05GX1BPTEFSSVRZLCAweDYwKTsgLy8gc2V0IEFHQyBwb2xhcml0aWVzCisJCXRkYTEwMDR4X3dyaXRlX21hc2soc3RhdGUsIFREQTEwMDQ2SF9DT05GX1BPTEFSSVRZLCAweGYwLCAweDYwKTsgIC8vIHNldCBBR0MgcG9sYXJpdGllcwogCQlicmVhazsKIAljYXNlIFREQTEwMDQ2X0FHQ19JRk9fQVVUT19ORUc6CiAJCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfQUdDX0NPTkYsIDB4MGEpOyAvLyBBR0Mgc2V0dXAKLQkJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9DT05GX1BPTEFSSVRZLCAweDYwKTsgLy8gc2V0IEFHQyBwb2xhcml0aWVzCisJCXRkYTEwMDR4X3dyaXRlX21hc2soc3RhdGUsIFREQTEwMDQ2SF9DT05GX1BPTEFSSVRZLCAweGYwLCAweDYwKTsgIC8vIHNldCBBR0MgcG9sYXJpdGllcwogCQlicmVhazsKIAljYXNlIFREQTEwMDQ2X0FHQ19JRk9fQVVUT19QT1M6CiAJCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfQUdDX0NPTkYsIDB4MGEpOyAvLyBBR0Mgc2V0dXAKLQkJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9DT05GX1BPTEFSSVRZLCAweDAwKTsgLy8gc2V0IEFHQyBwb2xhcml0aWVzCisJCXRkYTEwMDR4X3dyaXRlX21hc2soc3RhdGUsIFREQTEwMDQ2SF9DT05GX1BPTEFSSVRZLCAweGYwLCAweDAwKTsgIC8vIHNldCBBR0MgcG9sYXJpdGllcwogCQlicmVhazsKLQljYXNlIFREQTEwMDQ2X0FHQ19UREE4MjdYX0dQMTE6CisJY2FzZSBUREExMDA0Nl9BR0NfVERBODI3WDoKIAkJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9BR0NfQ09ORiwgMHgwMik7ICAgLy8gQUdDIHNldHVwCiAJCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfQUdDX1RIUiwgMHg3MCk7ICAgIC8vIEFHQyBUaHJlc2hvbGQKIAkJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9BR0NfUkVOT1JNLCAweDA4KTsgLy8gR2FpbiBSZW5vcm1hbGl6ZQotCQl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNDZIX0NPTkZfUE9MQVJJVFksIDB4NmEpOyAvLyBzZXQgQUdDIHBvbGFyaXRpZXMKLQkJYnJlYWs7Ci0JY2FzZSBUREExMDA0Nl9BR0NfVERBODI3WF9HUDAwOgotCQl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNDZIX0FHQ19DT05GLCAweDAyKTsgICAvLyBBR0Mgc2V0dXAKLQkJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9BR0NfVEhSLCAweDcwKTsgICAgLy8gQUdDIFRocmVzaG9sZAotCQl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNDZIX0FHQ19SRU5PUk0sIDB4MDgpOyAvLyBHYWluIFJlbm9ybWFsaXplCi0JCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfQ09ORl9QT0xBUklUWSwgMHg2MCk7IC8vIHNldCBBR0MgcG9sYXJpdGllcwotCQlicmVhazsKLQljYXNlIFREQTEwMDQ2X0FHQ19UREE4MjdYX0dQMDE6Ci0JCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfQUdDX0NPTkYsIDB4MDIpOyAgIC8vIEFHQyBzZXR1cAotCQl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNDZIX0FHQ19USFIsIDB4NzApOyAgICAvLyBBR0MgVGhyZXNob2xkCi0JCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfQUdDX1JFTk9STSwgMHgwOCk7IC8vIEdhaW4gUmVub3JtYWxpemUKLQkJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9DT05GX1BPTEFSSVRZLCAweDYyKTsgLy8gc2V0IEFHQyBwb2xhcml0aWVzCisJCXRkYTEwMDR4X3dyaXRlX21hc2soc3RhdGUsIFREQTEwMDQ2SF9DT05GX1BPTEFSSVRZLCAweGYwLCAweDYwKTsgIC8vIHNldCBBR0MgcG9sYXJpdGllcwogCQlicmVhazsKIAl9CisJaWYgKHN0YXRlLT5jb25maWctPnRzX21vZGUgPT0gMCkgeworCQl0ZGExMDA0eF93cml0ZV9tYXNrKHN0YXRlLCBUREExMDA0NkhfQ09ORl9UUklTVEFURTEsIDB4YzAsIDB4NDApOworCQl0ZGExMDA0eF93cml0ZV9tYXNrKHN0YXRlLCAweDNhLCAweDgwLCBzdGF0ZS0+Y29uZmlnLT5pbnZlcnRfb2NsayA8PCA3KTsKKwl9IGVsc2UgeworCQl0ZGExMDA0eF93cml0ZV9tYXNrKHN0YXRlLCBUREExMDA0NkhfQ09ORl9UUklTVEFURTEsIDB4YzAsIDB4ODApOworCQl0ZGExMDA0eF93cml0ZV9tYXNrKHN0YXRlLCBUREExMDA0NkhfQ09ORl9QT0xBUklUWSwgMHgxMCwKKwkJCQkJCQlzdGF0ZS0+Y29uZmlnLT5pbnZlcnRfb2NsayA8PCA0KTsKKwl9CiAJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDRYX0NPTkZBREMyLCAweDM4KTsKLQl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNDZIX0NPTkZfVFJJU1RBVEUxLCAweDYxKTsgLy8gVHVybiBib3RoIEFHQyBvdXRwdXRzIG9uCisJdGRhMTAwNHhfd3JpdGVfbWFzayAoc3RhdGUsIFREQTEwMDQ2SF9DT05GX1RSSVNUQVRFMSwgMHgzZSwgMHgzOCk7IC8vIFR1cm4gSUYgQUdDIG91dHB1dCBvbgogCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfQUdDX1RVTl9NSU4sIDApOwkgIC8vIH0KIAl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNDZIX0FHQ19UVU5fTUFYLCAweGZmKTsgLy8gfSBBR0MgbWluL21heCB2YWx1ZXMKIAl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNDZIX0FHQ19JRl9NSU4sIDApOwkgIC8vIH0KQEAgLTY3OCw3ICs2NzYsNiBAQAogCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0WF9DT05GX1RTMSwgNyk7IC8vIE1QRUcyIGludGVyZmFjZSBjb25maWcKIAl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNFhfQ09ORl9UUzIsIDB4YzApOyAvLyBNUEVHMiBpbnRlcmZhY2UgY29uZmlnCiAJLy8gdGRhMTAwNHhfd3JpdGVfbWFzayhzdGF0ZSwgMHg1MCwgMHg4MCwgMHg4MCk7ICAgICAgICAgLy8gaGFuZGxlIG91dCBvZiBndWFyZCBlY2hvZXMKLQl0ZGExMDA0eF93cml0ZV9tYXNrKHN0YXRlLCAweDNhLCAweDgwLCBzdGF0ZS0+Y29uZmlnLT5pbnZlcnRfb2NsayA8PCA3KTsKIAogCXJldHVybiAwOwogfQpAQCAtNzA1LDcgKzcwMiw4IEBACiAJLy8gc2V0IGZyZXF1ZW5jeQogCWlmIChmZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zKSB7CiAJCWZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMoZmUsIGZlX3BhcmFtcyk7Ci0JCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpIGZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMCk7CisJCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDApOwogCX0KIAogCS8vIEhhcmRjb2RlZCB0byB1c2UgYXV0byBhcyBtdWNoIGFzIHBvc3NpYmxlIG9uIHRoZSBUREExMDA0NSBhcyBpdApAQCAtMTE2NSw2ICsxMTYzLDcgQEAKIHN0YXRpYyBpbnQgdGRhMTAwNHhfc2xlZXAoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCiB7CiAJc3RydWN0IHRkYTEwMDR4X3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCWludCBncGlvX2NvbmY7CiAKIAlzd2l0Y2ggKHN0YXRlLT5kZW1vZF90eXBlKSB7CiAJY2FzZSBUREExMDA0WF9ERU1PRF9UREExMDA0NToKQEAgLTExNzQsNiArMTE3MywxMyBAQAogCWNhc2UgVERBMTAwNFhfREVNT0RfVERBMTAwNDY6CiAJCS8qIHNldCBvdXRwdXRzIHRvIHRyaXN0YXRlICovCiAJCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfQ09ORl9UUklTVEFURTEsIDB4ZmYpOworCQkvKiBpbnZlcnQgR1BJTyAxIGFuZCAzIGlmIGRlc2lyZWQqLworCQlncGlvX2NvbmYgPSBzdGF0ZS0+Y29uZmlnLT5ncGlvX2NvbmZpZzsKKwkJaWYgKGdwaW9fY29uZiA+PSBUREExMDA0Nl9HUDAwX0kpCisJCQl0ZGExMDA0eF93cml0ZV9tYXNrKHN0YXRlLCBUREExMDA0NkhfQ09ORl9QT0xBUklUWSwgMHgwZiwKKwkJCQkJCQkoZ3Bpb19jb25mICYgMHgwZikgXiAweDBhKTsKKworCQl0ZGExMDA0eF93cml0ZV9tYXNrKHN0YXRlLCBUREExMDA0WF9DT05GQURDMiwgMHhjMCwgMHhjMCk7CiAJCXRkYTEwMDR4X3dyaXRlX21hc2soc3RhdGUsIFREQTEwMDRYX0NPTkZDNCwgMSwgMSk7CiAJCWJyZWFrOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGExMDA0eC5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTEwMDR4LmgKaW5kZXggZWM1MDJkNy4uYWJhZTg0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTEwMDR4LmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTEwMDR4LmgKQEAgLTM1LDkgKzM1LDIzIEBACiAJVERBMTAwNDZfQUdDX0RFRkFVTFQsCQkvKiBvcmlnaW5hbCBjb25maWd1cmF0aW9uICovCiAJVERBMTAwNDZfQUdDX0lGT19BVVRPX05FRywJLyogSUYgQUdDIG9ubHksIGF1dG9tYXRpYywgbmVndGl2ZSAqLwogCVREQTEwMDQ2X0FHQ19JRk9fQVVUT19QT1MsCS8qIElGIEFHQyBvbmx5LCBhdXRvbWF0aWMsIHBvc2l0aXZlICovCi0JVERBMTAwNDZfQUdDX1REQTgyN1hfR1AxMSwJLyogSUYgQUdDIG9ubHksIHNwZWNpYWwgc2V0dXAgZm9yIHRkYTgyN3ggKi8KLQlUREExMDA0Nl9BR0NfVERBODI3WF9HUDAwLAkvKiBzYW1lIGFzIGFib3ZlLCBidXQgR1BJT3MgMCAqLwotCVREQTEwMDQ2X0FHQ19UREE4MjdYX0dQMDEsCS8qIHNhbWUgYXMgYWJvdmUsIGJ1dCBHUElPMz0wIEdQSU8xPTEqLworCVREQTEwMDQ2X0FHQ19UREE4MjdYLAkJLyogSUYgQUdDIG9ubHksIHNwZWNpYWwgc2V0dXAgZm9yIHRkYTgyN3ggKi8KK307CisKKy8qIE1hbnkgKGh5YnJpZCkgYm9hcmRzIHVzZSBHUElPIDEgYW5kIDMKKwlHUElPMQlhbmFsb2cgLSBkdmIgc3dpdGNoCisJR1BJTzMJZmlybXdhcmUgZWVwcm9tIGFkZHJlc3Mgc3dpdGNoCisqLworZW51bSB0ZGExMDA0Nl9ncGlvIHsKKwlUREExMDA0Nl9HUFRSSSAgPSAweDAwLAkJLyogQWxsIEdQSU9zIHRyaXN0YXRlICovCisJVERBMTAwNDZfR1AwMCAgID0gMHg0MCwJCS8qIEdQSU8zPTAsIEdQSU8xPTAgKi8KKwlUREExMDA0Nl9HUDAxICAgPSAweDQyLAkJLyogR1BJTzM9MCwgR1BJTzE9MSAqLworCVREQTEwMDQ2X0dQMTAgICA9IDB4NDgsCQkvKiBHUElPMz0xLCBHUElPMT0wICovCisJVERBMTAwNDZfR1AxMSAgID0gMHg0YSwJCS8qIEdQSU8zPTEsIEdQSU8xPTEgKi8KKwlUREExMDA0Nl9HUDAwX0kgPSAweDgwLAkJLyogR1BJTzM9MCwgR1BJTzE9MCwgaW52ZXJ0IGluIHNsZWVwIG1vZGUqLworCVREQTEwMDQ2X0dQMDFfSSA9IDB4ODIsCQkvKiBHUElPMz0wLCBHUElPMT0xLCBpbnZlcnQgaW4gc2xlZXAgbW9kZSAqLworCVREQTEwMDQ2X0dQMTBfSSA9IDB4ODgsCQkvKiBHUElPMz0xLCBHUElPMT0wLCBpbnZlcnQgaW4gc2xlZXAgbW9kZSAqLworCVREQTEwMDQ2X0dQMTFfSSA9IDB4OGEsCQkvKiBHUElPMz0xLCBHUElPMT0xLCBpbnZlcnQgaW4gc2xlZXAgbW9kZSAqLwogfTsKIAogZW51bSB0ZGExMDA0Nl9pZiB7CkBAIC00Nyw2ICs2MSwxMSBAQAogCVREQTEwMDQ2X0ZSRVFfMDUyLAkJLyogbG93IElGLCA1LjE2NjcgTUhaIGZvciB0ZGE5ODg5ICovCiB9OwogCitlbnVtIHRkYTEwMDQ2X3Rzb3V0IHsKKwlUREExMDA0Nl9UU19QQVJBTExFTCAgPSAweDAwLAkvKiBwYXJhbGxlbCB0cmFuc3BvcnQgc3RyZWFtLCBkZWZhdWx0ICovCisJVERBMTAwNDZfVFNfU0VSSUFMICAgID0gMHgwMSwJLyogc2VyaWFsIHRyYW5zcG9ydCBzdHJlYW0gKi8KK307CisKIHN0cnVjdCB0ZGExMDA0eF9jb25maWcKIHsKIAkvKiB0aGUgZGVtb2R1bGF0b3IncyBpMmMgYWRkcmVzcyAqLwpAQCAtNTgsNiArNzcsOSBAQAogCS8qIERvZXMgdGhlIE9DTEsgc2lnbmFsIG5lZWQgaW52ZXJ0ZWQ/ICovCiAJdTggaW52ZXJ0X29jbGs7CiAKKwkvKiBwYXJhbGxlbCBvciBzZXJpYWwgdHJhbnNwb3J0IHN0cmVhbSAqLworCWVudW0gdGRhMTAwNDZfdHNvdXQgdHNfbW9kZTsKKwogCS8qIFh0YWwgZnJlcXVlbmN5LCA0IG9yIDE2TUh6Ki8KIAllbnVtIHRkYTEwMDQ2X3h0YWwgeHRhbF9mcmVxOwogCkBAIC02NywxMSArODksMzUgQEAKIAkvKiBBR0MgY29uZmlndXJhdGlvbiAqLwogCWVudW0gdGRhMTAwNDZfYWdjIGFnY19jb25maWc7CiAKKwkvKiBzZXR0aW5nIG9mIEdQSU8xIGFuZCAzICovCisJZW51bSB0ZGExMDA0Nl9ncGlvIGdwaW9fY29uZmlnOworCisJLyogc2xhdmUgYWRkcmVzcyBhbmQgY29uZmlndXJhdGlvbiBvZiB0aGUgdHVuZXIgKi8KKwl1OCB0dW5lcl9hZGRyZXNzOworCXU4IHR1bmVyX2NvbmZpZzsKKwl1OCBhbnRlbm5hX3N3aXRjaDsKKworCS8qIGlmIHRoZSBib2FyZCB1c2VzIGFub3RoZXIgSTJjIEJyaWRnZSAodGRhODI5MCksIGl0cyBhZGRyZXNzICovCisJdTggaTJjX2dhdGU7CisKIAkvKiByZXF1ZXN0IGZpcm13YXJlIGZvciBkZXZpY2UgKi8KLQkvKiBzZXQgdGhpcyB0byBOVUxMIGlmIHRoZSBjYXJkIGhhcyBhIGZpcm13YXJlIEVFUFJPTSAqLwogCWludCAoKnJlcXVlc3RfZmlybXdhcmUpKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKipmdywgY2hhciogbmFtZSk7CiB9OwogCitlbnVtIHRkYTEwMDR4X2RlbW9kIHsKKwlUREExMDA0WF9ERU1PRF9UREExMDA0NSwKKwlUREExMDA0WF9ERU1PRF9UREExMDA0NiwKK307CisKK3N0cnVjdCB0ZGExMDA0eF9zdGF0ZSB7CisJc3RydWN0IGkyY19hZGFwdGVyKiBpMmM7CisJY29uc3Qgc3RydWN0IHRkYTEwMDR4X2NvbmZpZyogY29uZmlnOworCXN0cnVjdCBkdmJfZnJvbnRlbmQgZnJvbnRlbmQ7CisKKwkvKiBwcml2YXRlIGRlbW9kIGRhdGEgKi8KKwllbnVtIHRkYTEwMDR4X2RlbW9kIGRlbW9kX3R5cGU7Cit9OworCiAjaWYgZGVmaW5lZChDT05GSUdfRFZCX1REQTEwMDRYKSB8fCAoZGVmaW5lZChDT05GSUdfRFZCX1REQTEwMDRYX01PRFVMRSkgJiYgZGVmaW5lZChNT0RVTEUpKQogZXh0ZXJuIHN0cnVjdCBkdmJfZnJvbnRlbmQqIHRkYTEwMDQ1X2F0dGFjaChjb25zdCBzdHJ1Y3QgdGRhMTAwNHhfY29uZmlnKiBjb25maWcsCiAJCQkJCSAgICBzdHJ1Y3QgaTJjX2FkYXB0ZXIqIGkyYyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhODI3eC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTgyN3guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTZmYzRiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTgyN3guYwpAQCAtMCwwICsxLDUxMiBAQAorLyoKKyAqCisgKiAoYykgMjAwNSBIYXJ0bXV0IEhhY2ttYW5uCisgKiAoYykgMjAwNyBNaWNoYWVsIEtydWZreQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2R2Yi9mcm9udGVuZC5oPgorI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorCisjaW5jbHVkZSAidGRhODI3eC5oIgorCitzdGF0aWMgaW50IGRlYnVnID0gMDsKKyNkZWZpbmUgZHByaW50ayhhcmdzLi4uKSBcCisJZG8gewkJCQkJICAgIFwKKwkJaWYgKGRlYnVnKSBwcmludGsoS0VSTl9ERUJVRyAidGRhODI3eDogIiBhcmdzKTsgXAorCX0gd2hpbGUgKDApCisKK3N0cnVjdCB0ZGE4Mjd4X3ByaXYgeworCWludCBpMmNfYWRkcjsKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyY19hZGFwOworCXN0cnVjdCB0ZGE4Mjd4X2NvbmZpZyAqY2ZnOworCXUzMiBmcmVxdWVuY3k7CisJdTMyIGJhbmR3aWR0aDsKK307CisKK3N0cnVjdCB0ZGE4Mjd4X2RhdGEgeworCXUzMiBsb21heDsKKwl1OCAgc3BkOworCXU4ICBiczsKKwl1OCAgYnA7CisJdTggIGNwOworCXU4ICBnYzM7CisJdTggZGl2MXA1OworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB0ZGE4Mjd4X2RhdGEgdGRhODI3eF9kdmJ0W10gPSB7CisJeyAubG9tYXggPSAgNjIwMDAwMDAsIC5zcGQgPSAzLCAuYnMgPSAyLCAuYnAgPSAwLCAuY3AgPSAwLCAuZ2MzID0gMywgLmRpdjFwNSA9IDF9LAorCXsgLmxvbWF4ID0gIDY2MDAwMDAwLCAuc3BkID0gMywgLmJzID0gMywgLmJwID0gMCwgLmNwID0gMCwgLmdjMyA9IDMsIC5kaXYxcDUgPSAxfSwKKwl7IC5sb21heCA9ICA3NjAwMDAwMCwgLnNwZCA9IDMsIC5icyA9IDEsIC5icCA9IDAsIC5jcCA9IDAsIC5nYzMgPSAzLCAuZGl2MXA1ID0gMH0sCisJeyAubG9tYXggPSAgODQwMDAwMDAsIC5zcGQgPSAzLCAuYnMgPSAyLCAuYnAgPSAwLCAuY3AgPSAwLCAuZ2MzID0gMywgLmRpdjFwNSA9IDB9LAorCXsgLmxvbWF4ID0gIDkzMDAwMDAwLCAuc3BkID0gMywgLmJzID0gMiwgLmJwID0gMCwgLmNwID0gMCwgLmdjMyA9IDEsIC5kaXYxcDUgPSAwfSwKKwl7IC5sb21heCA9ICA5ODAwMDAwMCwgLnNwZCA9IDMsIC5icyA9IDMsIC5icCA9IDAsIC5jcCA9IDAsIC5nYzMgPSAxLCAuZGl2MXA1ID0gMH0sCisJeyAubG9tYXggPSAxMDkwMDAwMDAsIC5zcGQgPSAzLCAuYnMgPSAzLCAuYnAgPSAxLCAuY3AgPSAwLCAuZ2MzID0gMSwgLmRpdjFwNSA9IDB9LAorCXsgLmxvbWF4ID0gMTIzMDAwMDAwLCAuc3BkID0gMiwgLmJzID0gMiwgLmJwID0gMSwgLmNwID0gMCwgLmdjMyA9IDEsIC5kaXYxcDUgPSAxfSwKKwl7IC5sb21heCA9IDEzMzAwMDAwMCwgLnNwZCA9IDIsIC5icyA9IDMsIC5icCA9IDEsIC5jcCA9IDAsIC5nYzMgPSAxLCAuZGl2MXA1ID0gMX0sCisJeyAubG9tYXggPSAxNTEwMDAwMDAsIC5zcGQgPSAyLCAuYnMgPSAxLCAuYnAgPSAxLCAuY3AgPSAwLCAuZ2MzID0gMSwgLmRpdjFwNSA9IDB9LAorCXsgLmxvbWF4ID0gMTU0MDAwMDAwLCAuc3BkID0gMiwgLmJzID0gMiwgLmJwID0gMSwgLmNwID0gMCwgLmdjMyA9IDEsIC5kaXYxcDUgPSAwfSwKKwl7IC5sb21heCA9IDE4MTAwMDAwMCwgLnNwZCA9IDIsIC5icyA9IDIsIC5icCA9IDEsIC5jcCA9IDAsIC5nYzMgPSAwLCAuZGl2MXA1ID0gMH0sCisJeyAubG9tYXggPSAxODUwMDAwMDAsIC5zcGQgPSAyLCAuYnMgPSAyLCAuYnAgPSAyLCAuY3AgPSAwLCAuZ2MzID0gMSwgLmRpdjFwNSA9IDB9LAorCXsgLmxvbWF4ID0gMjE3MDAwMDAwLCAuc3BkID0gMiwgLmJzID0gMywgLmJwID0gMiwgLmNwID0gMCwgLmdjMyA9IDEsIC5kaXYxcDUgPSAwfSwKKwl7IC5sb21heCA9IDI0NDAwMDAwMCwgLnNwZCA9IDEsIC5icyA9IDIsIC5icCA9IDIsIC5jcCA9IDAsIC5nYzMgPSAxLCAuZGl2MXA1ID0gMX0sCisJeyAubG9tYXggPSAyNjUwMDAwMDAsIC5zcGQgPSAxLCAuYnMgPSAzLCAuYnAgPSAyLCAuY3AgPSAwLCAuZ2MzID0gMSwgLmRpdjFwNSA9IDF9LAorCXsgLmxvbWF4ID0gMzAyMDAwMDAwLCAuc3BkID0gMSwgLmJzID0gMSwgLmJwID0gMiwgLmNwID0gMCwgLmdjMyA9IDEsIC5kaXYxcDUgPSAwfSwKKwl7IC5sb21heCA9IDMyNDAwMDAwMCwgLnNwZCA9IDEsIC5icyA9IDIsIC5icCA9IDIsIC5jcCA9IDAsIC5nYzMgPSAxLCAuZGl2MXA1ID0gMH0sCisJeyAubG9tYXggPSAzNzAwMDAwMDAsIC5zcGQgPSAxLCAuYnMgPSAyLCAuYnAgPSAzLCAuY3AgPSAwLCAuZ2MzID0gMSwgLmRpdjFwNSA9IDB9LAorCXsgLmxvbWF4ID0gNDU0MDAwMDAwLCAuc3BkID0gMSwgLmJzID0gMywgLmJwID0gMywgLmNwID0gMCwgLmdjMyA9IDEsIC5kaXYxcDUgPSAwfSwKKwl7IC5sb21heCA9IDQ5MzAwMDAwMCwgLnNwZCA9IDAsIC5icyA9IDIsIC5icCA9IDMsIC5jcCA9IDAsIC5nYzMgPSAxLCAuZGl2MXA1ID0gMX0sCisJeyAubG9tYXggPSA1MzAwMDAwMDAsIC5zcGQgPSAwLCAuYnMgPSAzLCAuYnAgPSAzLCAuY3AgPSAwLCAuZ2MzID0gMSwgLmRpdjFwNSA9IDF9LAorCXsgLmxvbWF4ID0gNTU0MDAwMDAwLCAuc3BkID0gMCwgLmJzID0gMSwgLmJwID0gMywgLmNwID0gMCwgLmdjMyA9IDEsIC5kaXYxcDUgPSAwfSwKKwl7IC5sb21heCA9IDYwNDAwMDAwMCwgLnNwZCA9IDAsIC5icyA9IDEsIC5icCA9IDQsIC5jcCA9IDAsIC5nYzMgPSAwLCAuZGl2MXA1ID0gMH0sCisJeyAubG9tYXggPSA2OTYwMDAwMDAsIC5zcGQgPSAwLCAuYnMgPSAyLCAuYnAgPSA0LCAuY3AgPSAwLCAuZ2MzID0gMCwgLmRpdjFwNSA9IDB9LAorCXsgLmxvbWF4ID0gNzQwMDAwMDAwLCAuc3BkID0gMCwgLmJzID0gMiwgLmJwID0gNCwgLmNwID0gMSwgLmdjMyA9IDAsIC5kaXYxcDUgPSAwfSwKKwl7IC5sb21heCA9IDgyMDAwMDAwMCwgLnNwZCA9IDAsIC5icyA9IDMsIC5icCA9IDQsIC5jcCA9IDAsIC5nYzMgPSAwLCAuZGl2MXA1ID0gMH0sCisJeyAubG9tYXggPSA4NjUwMDAwMDAsIC5zcGQgPSAwLCAuYnMgPSAzLCAuYnAgPSA0LCAuY3AgPSAxLCAuZ2MzID0gMCwgLmRpdjFwNSA9IDB9LAorCXsgLmxvbWF4ID0gICAgICAgICAwLCAuc3BkID0gMCwgLmJzID0gMCwgLmJwID0gMCwgLmNwID0gMCwgLmdjMyA9IDAsIC5kaXYxcDUgPSAwfQorfTsKKworc3RhdGljIGludCB0ZGE4Mjd4b19zZXRfcGFyYW1zKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorCQkJICAgICAgIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcGFyYW1zKQoreworCXN0cnVjdCB0ZGE4Mjd4X3ByaXYgKnByaXYgPSBmZS0+dHVuZXJfcHJpdjsKKwl1OCBidWZbMTRdOworCisJc3RydWN0IGkyY19tc2cgbXNnID0geyAuYWRkciA9IHByaXYtPmkyY19hZGRyLCAuZmxhZ3MgPSAwLAorCQkJICAgICAgIC5idWYgPSBidWYsIC5sZW4gPSBzaXplb2YoYnVmKSB9OworCWludCBpLCB0dW5lcl9mcmVxLCBpZl9mcmVxOworCXUzMiBOOworCisJZHByaW50aygiJXM6XG4iLCBfX0ZVTkNUSU9OX18pOworCXN3aXRjaCAocGFyYW1zLT51Lm9mZG0uYmFuZHdpZHRoKSB7CisJY2FzZSBCQU5EV0lEVEhfNl9NSFo6CisJCWlmX2ZyZXEgPSA0MDAwMDAwOworCQlicmVhazsKKwljYXNlIEJBTkRXSURUSF83X01IWjoKKwkJaWZfZnJlcSA9IDQ1MDAwMDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CQkgICAvKiA4IE1IeiBvciBBdXRvICovCisJCWlmX2ZyZXEgPSA1MDAwMDAwOworCQlicmVhazsKKwl9CisJdHVuZXJfZnJlcSA9IHBhcmFtcy0+ZnJlcXVlbmN5ICsgaWZfZnJlcTsKKworCWkgPSAwOworCXdoaWxlICh0ZGE4Mjd4X2R2YnRbaV0ubG9tYXggPCB0dW5lcl9mcmVxKSB7CisJCWlmKHRkYTgyN3hfZHZidFtpICsgMV0ubG9tYXggPT0gMCkKKwkJCWJyZWFrOworCQlpKys7CisJfQorCisJTiA9ICgodHVuZXJfZnJlcSArIDEyNTAwMCkgLyAyNTAwMDApIDw8ICh0ZGE4Mjd4X2R2YnRbaV0uc3BkICsgMik7CisJYnVmWzBdID0gMDsKKwlidWZbMV0gPSAoTj4+OCkgfCAweDQwOworCWJ1ZlsyXSA9IE4gJiAweGZmOworCWJ1ZlszXSA9IDA7CisJYnVmWzRdID0gMHg1MjsKKwlidWZbNV0gPSAodGRhODI3eF9kdmJ0W2ldLnNwZCA8PCA2KSArICh0ZGE4Mjd4X2R2YnRbaV0uZGl2MXA1IDw8IDUpICsKKwkJCQkodGRhODI3eF9kdmJ0W2ldLmJzIDw8IDMpICsgdGRhODI3eF9kdmJ0W2ldLmJwOworCWJ1Zls2XSA9ICh0ZGE4Mjd4X2R2YnRbaV0uZ2MzIDw8IDQpICsgMHg4ZjsKKwlidWZbN10gPSAweGJmOworCWJ1Zls4XSA9IDB4MmE7CisJYnVmWzldID0gMHgwNTsKKwlidWZbMTBdID0gMHhmZjsKKwlidWZbMTFdID0gMHgwMDsKKwlidWZbMTJdID0gMHgwMDsKKwlidWZbMTNdID0gMHg0MDsKKworCW1zZy5sZW4gPSAxNDsKKwlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDEpOworCWlmIChpMmNfdHJhbnNmZXIocHJpdi0+aTJjX2FkYXAsICZtc2csIDEpICE9IDEpIHsKKwkJcHJpbnRrKCIlczogY291bGQgbm90IHdyaXRlIHRvIHR1bmVyIGF0IGFkZHI6IDB4JTAyeFxuIiwKKwkJICAgICAgIF9fRlVOQ1RJT05fXywgcHJpdi0+aTJjX2FkZHIgPDwgMSk7CisJCXJldHVybiAtRUlPOworCX0KKwltc2xlZXAoNTAwKTsKKwkvKiBjb3JyZWN0IENQIHZhbHVlICovCisJYnVmWzBdID0gMHgzMDsKKwlidWZbMV0gPSAweDUwICsgdGRhODI3eF9kdmJ0W2ldLmNwOworCW1zZy5sZW4gPSAyOworCisJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKKwlpMmNfdHJhbnNmZXIocHJpdi0+aTJjX2FkYXAsICZtc2csIDEpOworCisJcHJpdi0+ZnJlcXVlbmN5ID0gdHVuZXJfZnJlcSAtIGlmX2ZyZXE7IC8vIEZJWE1FCisJcHJpdi0+YmFuZHdpZHRoID0gKGZlLT5vcHMuaW5mby50eXBlID09IEZFX09GRE0pID8gcGFyYW1zLT51Lm9mZG0uYmFuZHdpZHRoIDogMDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRkYTgyN3hvX3NsZWVwKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQoreworCXN0cnVjdCB0ZGE4Mjd4X3ByaXYgKnByaXYgPSBmZS0+dHVuZXJfcHJpdjsKKwlzdGF0aWMgdTggYnVmW10gPSB7IDB4MzAsIDB4ZDAgfTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2cgPSB7IC5hZGRyID0gcHJpdi0+aTJjX2FkZHIsIC5mbGFncyA9IDAsCisJCQkgICAgICAgLmJ1ZiA9IGJ1ZiwgLmxlbiA9IHNpemVvZihidWYpIH07CisKKwlkcHJpbnRrKCIlczpcbiIsIF9fRlVOQ1RJT05fXyk7CisJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKKwlpMmNfdHJhbnNmZXIocHJpdi0+aTJjX2FkYXAsICZtc2csIDEpOworCisJaWYgKHByaXYtPmNmZyAmJiBwcml2LT5jZmctPnNsZWVwKQorCQlwcml2LT5jZmctPnNsZWVwKGZlKTsKKworCXJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RydWN0IHRkYTgyN3hhX2RhdGEgeworCXUzMiBsb21heDsKKwl1OCAgc3ZjbzsKKwl1OCAgc3BkOworCXU4ICBzY3I7CisJdTggIHNiczsKKwl1OCAgZ2MzOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB0ZGE4Mjd4YV9kYXRhIHRkYTgyN3hhX2R2YnRbXSA9IHsKKwl7IC5sb21heCA9ICA1Njg3NTAwMCwgLnN2Y28gPSAzLCAuc3BkID0gNCwgLnNjciA9IDAsIC5zYnMgPSAwLCAuZ2MzID0gMX0sCisJeyAubG9tYXggPSAgNjcyNTAwMDAsIC5zdmNvID0gMCwgLnNwZCA9IDMsIC5zY3IgPSAwLCAuc2JzID0gMCwgLmdjMyA9IDF9LAorCXsgLmxvbWF4ID0gIDgxMjUwMDAwLCAuc3ZjbyA9IDEsIC5zcGQgPSAzLCAuc2NyID0gMCwgLnNicyA9IDAsIC5nYzMgPSAxfSwKKwl7IC5sb21heCA9ICA5NzUwMDAwMCwgLnN2Y28gPSAyLCAuc3BkID0gMywgLnNjciA9IDAsIC5zYnMgPSAwLCAuZ2MzID0gMX0sCisJeyAubG9tYXggPSAxMTM3NTAwMDAsIC5zdmNvID0gMywgLnNwZCA9IDMsIC5zY3IgPSAwLCAuc2JzID0gMSwgLmdjMyA9IDF9LAorCXsgLmxvbWF4ID0gMTM0NTAwMDAwLCAuc3ZjbyA9IDAsIC5zcGQgPSAyLCAuc2NyID0gMCwgLnNicyA9IDEsIC5nYzMgPSAxfSwKKwl7IC5sb21heCA9IDE1NDAwMDAwMCwgLnN2Y28gPSAxLCAuc3BkID0gMiwgLnNjciA9IDAsIC5zYnMgPSAxLCAuZ2MzID0gMX0sCisJeyAubG9tYXggPSAxNjI1MDAwMDAsIC5zdmNvID0gMSwgLnNwZCA9IDIsIC5zY3IgPSAwLCAuc2JzID0gMSwgLmdjMyA9IDF9LAorCXsgLmxvbWF4ID0gMTgzMDAwMDAwLCAuc3ZjbyA9IDIsIC5zcGQgPSAyLCAuc2NyID0gMCwgLnNicyA9IDEsIC5nYzMgPSAxfSwKKwl7IC5sb21heCA9IDE5NTAwMDAwMCwgLnN2Y28gPSAyLCAuc3BkID0gMiwgLnNjciA9IDAsIC5zYnMgPSAyLCAuZ2MzID0gMX0sCisJeyAubG9tYXggPSAyMjc1MDAwMDAsIC5zdmNvID0gMywgLnNwZCA9IDIsIC5zY3IgPSAwLCAuc2JzID0gMiwgLmdjMyA9IDF9LAorCXsgLmxvbWF4ID0gMjY5MDAwMDAwLCAuc3ZjbyA9IDAsIC5zcGQgPSAxLCAuc2NyID0gMCwgLnNicyA9IDIsIC5nYzMgPSAxfSwKKwl7IC5sb21heCA9IDI5MDAwMDAwMCwgLnN2Y28gPSAxLCAuc3BkID0gMSwgLnNjciA9IDAsIC5zYnMgPSAyLCAuZ2MzID0gMX0sCisJeyAubG9tYXggPSAzMjUwMDAwMDAsIC5zdmNvID0gMSwgLnNwZCA9IDEsIC5zY3IgPSAwLCAuc2JzID0gMywgLmdjMyA9IDF9LAorCXsgLmxvbWF4ID0gMzkwMDAwMDAwLCAuc3ZjbyA9IDIsIC5zcGQgPSAxLCAuc2NyID0gMCwgLnNicyA9IDMsIC5nYzMgPSAxfSwKKwl7IC5sb21heCA9IDQ1NTAwMDAwMCwgLnN2Y28gPSAzLCAuc3BkID0gMSwgLnNjciA9IDAsIC5zYnMgPSAzLCAuZ2MzID0gMX0sCisJeyAubG9tYXggPSA1MjAwMDAwMDAsIC5zdmNvID0gMCwgLnNwZCA9IDAsIC5zY3IgPSAwLCAuc2JzID0gMywgLmdjMyA9IDF9LAorCXsgLmxvbWF4ID0gNTM4MDAwMDAwLCAuc3ZjbyA9IDAsIC5zcGQgPSAwLCAuc2NyID0gMSwgLnNicyA9IDMsIC5nYzMgPSAxfSwKKwl7IC5sb21heCA9IDU1MDAwMDAwMCwgLnN2Y28gPSAxLCAuc3BkID0gMCwgLnNjciA9IDAsIC5zYnMgPSAzLCAuZ2MzID0gMX0sCisJeyAubG9tYXggPSA2MjAwMDAwMDAsIC5zdmNvID0gMSwgLnNwZCA9IDAsIC5zY3IgPSAwLCAuc2JzID0gNCwgLmdjMyA9IDB9LAorCXsgLmxvbWF4ID0gNjUwMDAwMDAwLCAuc3ZjbyA9IDEsIC5zcGQgPSAwLCAuc2NyID0gMSwgLnNicyA9IDQsIC5nYzMgPSAwfSwKKwl7IC5sb21heCA9IDcwMDAwMDAwMCwgLnN2Y28gPSAyLCAuc3BkID0gMCwgLnNjciA9IDAsIC5zYnMgPSA0LCAuZ2MzID0gMH0sCisJeyAubG9tYXggPSA3ODAwMDAwMDAsIC5zdmNvID0gMiwgLnNwZCA9IDAsIC5zY3IgPSAxLCAuc2JzID0gNCwgLmdjMyA9IDB9LAorCXsgLmxvbWF4ID0gODIwMDAwMDAwLCAuc3ZjbyA9IDMsIC5zcGQgPSAwLCAuc2NyID0gMCwgLnNicyA9IDQsIC5nYzMgPSAwfSwKKwl7IC5sb21heCA9IDg3MDAwMDAwMCwgLnN2Y28gPSAzLCAuc3BkID0gMCwgLnNjciA9IDEsIC5zYnMgPSA0LCAuZ2MzID0gMH0sCisJeyAubG9tYXggPSA5MTEwMDAwMDAsIC5zdmNvID0gMywgLnNwZCA9IDAsIC5zY3IgPSAyLCAuc2JzID0gNCwgLmdjMyA9IDB9LAorCXsgLmxvbWF4ID0gICAgICAgICAwLCAuc3ZjbyA9IDAsIC5zcGQgPSAwLCAuc2NyID0gMCwgLnNicyA9IDAsIC5nYzMgPSAwfQorfTsKKworc3RhdGljIGludCB0ZGE4Mjd4YV9zZXRfcGFyYW1zKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorCQkJICAgICAgIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcGFyYW1zKQoreworCXN0cnVjdCB0ZGE4Mjd4X3ByaXYgKnByaXYgPSBmZS0+dHVuZXJfcHJpdjsKKwl1OCBidWZbMTFdOworCisJc3RydWN0IGkyY19tc2cgbXNnID0geyAuYWRkciA9IHByaXYtPmkyY19hZGRyLCAuZmxhZ3MgPSAwLAorCQkJICAgICAgIC5idWYgPSBidWYsIC5sZW4gPSBzaXplb2YoYnVmKSB9OworCisJaW50IGksIHR1bmVyX2ZyZXEsIGlmX2ZyZXE7CisJdTMyIE47CisKKwlkcHJpbnRrKCIlczpcbiIsIF9fRlVOQ1RJT05fXyk7CisJaWYgKHByaXYtPmNmZyAmJiBwcml2LT5jZmctPmxuYV9nYWluKQorCQlwcml2LT5jZmctPmxuYV9nYWluKGZlLCAxKTsKKwltc2xlZXAoMjApOworCisJc3dpdGNoIChwYXJhbXMtPnUub2ZkbS5iYW5kd2lkdGgpIHsKKwljYXNlIEJBTkRXSURUSF82X01IWjoKKwkJaWZfZnJlcSA9IDQwMDAwMDA7CisJCWJyZWFrOworCWNhc2UgQkFORFdJRFRIXzdfTUhaOgorCQlpZl9mcmVxID0gNDUwMDAwMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoJCSAgIC8qIDggTUh6IG9yIEF1dG8gKi8KKwkJaWZfZnJlcSA9IDUwMDAwMDA7CisJCWJyZWFrOworCX0KKwl0dW5lcl9mcmVxID0gcGFyYW1zLT5mcmVxdWVuY3kgKyBpZl9mcmVxOworCisJaSA9IDA7CisJd2hpbGUgKHRkYTgyN3hhX2R2YnRbaV0ubG9tYXggPCB0dW5lcl9mcmVxKSB7CisJCWlmKHRkYTgyN3hhX2R2YnRbaSArIDFdLmxvbWF4ID09IDApCisJCQlicmVhazsKKwkJaSsrOworCX0KKworCU4gPSAoKHR1bmVyX2ZyZXEgKyAzMTI1MCkgLyA2MjUwMCkgPDwgdGRhODI3eGFfZHZidFtpXS5zcGQ7CisJYnVmWzBdID0gMDsgICAgICAgICAgICAvLyBzdWJhZGRyZXNzCisJYnVmWzFdID0gTiA+PiA4OworCWJ1ZlsyXSA9IE4gJiAweGZmOworCWJ1ZlszXSA9IDA7CisJYnVmWzRdID0gMHgxNjsKKwlidWZbNV0gPSAodGRhODI3eGFfZHZidFtpXS5zcGQgPDwgNSkgKyAodGRhODI3eGFfZHZidFtpXS5zdmNvIDw8IDMpICsKKwkJCXRkYTgyN3hhX2R2YnRbaV0uc2JzOworCWJ1Zls2XSA9IDB4NGIgKyAodGRhODI3eGFfZHZidFtpXS5nYzMgPDwgNCk7CisJYnVmWzddID0gMHgxYzsKKwlidWZbOF0gPSAweDA2OworCWJ1Zls5XSA9IDB4MjQ7CisJYnVmWzEwXSA9IDB4MDA7CisJbXNnLmxlbiA9IDExOworCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMSk7CisJaWYgKGkyY190cmFuc2Zlcihwcml2LT5pMmNfYWRhcCwgJm1zZywgMSkgIT0gMSkgeworCQlwcmludGsoIiVzOiBjb3VsZCBub3Qgd3JpdGUgdG8gdHVuZXIgYXQgYWRkcjogMHglMDJ4XG4iLAorCQkgICAgICAgX19GVU5DVElPTl9fLCBwcml2LT5pMmNfYWRkciA8PCAxKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCWJ1ZlswXSA9IDB4OTA7CisJYnVmWzFdID0gMHhmZjsKKwlidWZbMl0gPSAweDYwOworCWJ1ZlszXSA9IDB4MDA7CisJYnVmWzRdID0gMHg1OTsgIC8vIGxwc2VsLCBmb3IgNk1IeiArIDIKKwltc2cubGVuID0gNTsKKwlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDEpOworCWkyY190cmFuc2Zlcihwcml2LT5pMmNfYWRhcCwgJm1zZywgMSk7CisKKwlidWZbMF0gPSAweGEwOworCWJ1ZlsxXSA9IDB4NDA7CisJbXNnLmxlbiA9IDI7CisJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKKwlpMmNfdHJhbnNmZXIocHJpdi0+aTJjX2FkYXAsICZtc2csIDEpOworCisJbXNsZWVwKDExKTsKKwltc2cuZmxhZ3MgPSBJMkNfTV9SRDsKKwlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDEpOworCWkyY190cmFuc2Zlcihwcml2LT5pMmNfYWRhcCwgJm1zZywgMSk7CisJbXNnLmZsYWdzID0gMDsKKworCWJ1ZlsxXSA+Pj0gNDsKKwlkcHJpbnRrKCJ0ZGE4Mjc1YSBBR0MyIGdhaW4gaXM6ICVkXG4iLCBidWZbMV0pOworCWlmICgoYnVmWzFdKSA8IDIpIHsKKwkJaWYgKHByaXYtPmNmZyAmJiBwcml2LT5jZmctPmxuYV9nYWluKQorCQkJcHJpdi0+Y2ZnLT5sbmFfZ2FpbihmZSwgMCk7CisJCWJ1ZlswXSA9IDB4NjA7CisJCWJ1ZlsxXSA9IDB4MGM7CisJCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDEpOworCQlpMmNfdHJhbnNmZXIocHJpdi0+aTJjX2FkYXAsICZtc2csIDEpOworCX0KKworCWJ1ZlswXSA9IDB4YzA7CisJYnVmWzFdID0gMHg5OTsgICAgLy8gbHBzZWwsIGZvciA2TUh6ICsgMgorCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMSk7CisJaTJjX3RyYW5zZmVyKHByaXYtPmkyY19hZGFwLCAmbXNnLCAxKTsKKworCWJ1ZlswXSA9IDB4NjA7CisJYnVmWzFdID0gMHgzYzsKKwlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDEpOworCWkyY190cmFuc2Zlcihwcml2LT5pMmNfYWRhcCwgJm1zZywgMSk7CisKKwkvKiBjb3JyZWN0IENQIHZhbHVlICovCisJYnVmWzBdID0gMHgzMDsKKwlidWZbMV0gPSAweDEwICsgdGRhODI3eGFfZHZidFtpXS5zY3I7CisJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKKwlpMmNfdHJhbnNmZXIocHJpdi0+aTJjX2FkYXAsICZtc2csIDEpOworCisJbXNsZWVwKDE2Myk7CisJYnVmWzBdID0gMHhjMDsKKwlidWZbMV0gPSAweDM5OyAgLy8gbHBzZWwsIGZvciA2TUh6ICsgMgorCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMSk7CisJaTJjX3RyYW5zZmVyKHByaXYtPmkyY19hZGFwLCAmbXNnLCAxKTsKKworCW1zbGVlcCgzKTsKKwkvKiBmcmVlemUgQUdDMSAqLworCWJ1ZlswXSA9IDB4NTA7CisJYnVmWzFdID0gMHg0ZiArICh0ZGE4Mjd4YV9kdmJ0W2ldLmdjMyA8PCA0KTsKKwlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDEpOworCWkyY190cmFuc2Zlcihwcml2LT5pMmNfYWRhcCwgJm1zZywgMSk7CisKKwlwcml2LT5mcmVxdWVuY3kgPSB0dW5lcl9mcmVxIC0gaWZfZnJlcTsgLy8gRklYTUUKKwlwcml2LT5iYW5kd2lkdGggPSAoZmUtPm9wcy5pbmZvLnR5cGUgPT0gRkVfT0ZETSkgPyBwYXJhbXMtPnUub2ZkbS5iYW5kd2lkdGggOiAwOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGRhODI3eGFfc2xlZXAoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCit7CisJc3RydWN0IHRkYTgyN3hfcHJpdiAqcHJpdiA9IGZlLT50dW5lcl9wcml2OworCXN0YXRpYyB1OCBidWZbXSA9IHsgMHgzMCwgMHg5MCB9OworCXN0cnVjdCBpMmNfbXNnIG1zZyA9IHsgLmFkZHIgPSBwcml2LT5pMmNfYWRkciwgLmZsYWdzID0gMCwKKwkJCSAgICAgICAuYnVmID0gYnVmLCAubGVuID0gc2l6ZW9mKGJ1ZikgfTsKKworCWRwcmludGsoIiVzOlxuIiwgX19GVU5DVElPTl9fKTsKKwlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDEpOworCisJaTJjX3RyYW5zZmVyKHByaXYtPmkyY19hZGFwLCAmbXNnLCAxKTsKKworCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMCk7CisKKwlpZiAocHJpdi0+Y2ZnICYmIHByaXYtPmNmZy0+c2xlZXApCisJCXByaXYtPmNmZy0+c2xlZXAoZmUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGRhODI3eF9yZWxlYXNlKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQoreworCWtmcmVlKGZlLT50dW5lcl9wcml2KTsKKwlmZS0+dHVuZXJfcHJpdiA9IE5VTEw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGRhODI3eF9nZXRfZnJlcXVlbmN5KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCB1MzIgKmZyZXF1ZW5jeSkKK3sKKwlzdHJ1Y3QgdGRhODI3eF9wcml2ICpwcml2ID0gZmUtPnR1bmVyX3ByaXY7CisJKmZyZXF1ZW5jeSA9IHByaXYtPmZyZXF1ZW5jeTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0ZGE4Mjd4X2dldF9iYW5kd2lkdGgoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHUzMiAqYmFuZHdpZHRoKQoreworCXN0cnVjdCB0ZGE4Mjd4X3ByaXYgKnByaXYgPSBmZS0+dHVuZXJfcHJpdjsKKwkqYmFuZHdpZHRoID0gcHJpdi0+YmFuZHdpZHRoOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRkYTgyN3hfaW5pdChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3sKKwlzdHJ1Y3QgdGRhODI3eF9wcml2ICpwcml2ID0gZmUtPnR1bmVyX3ByaXY7CisJZHByaW50aygiJXM6XG4iLCBfX0ZVTkNUSU9OX18pOworCWlmIChwcml2LT5jZmcgJiYgcHJpdi0+Y2ZnLT5pbml0KQorCQlwcml2LT5jZmctPmluaXQoZmUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGRhODI3eF9wcm9iZV92ZXJzaW9uKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKTsKKworc3RhdGljIGludCB0ZGE4Mjd4X2luaXRpYWxfaW5pdChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3sKKwlpbnQgcmV0OworCXJldCA9IHRkYTgyN3hfcHJvYmVfdmVyc2lvbihmZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlyZXR1cm4gZmUtPm9wcy50dW5lcl9vcHMuaW5pdChmZSk7Cit9CisKK3N0YXRpYyBpbnQgdGRhODI3eF9pbml0aWFsX3NsZWVwKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQoreworCWludCByZXQ7CisJcmV0ID0gdGRhODI3eF9wcm9iZV92ZXJzaW9uKGZlKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCXJldHVybiBmZS0+b3BzLnR1bmVyX29wcy5zbGVlcChmZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZHZiX3R1bmVyX29wcyB0ZGE4Mjd4b190dW5lcl9vcHMgPSB7CisJLmluZm8gPSB7CisJCS5uYW1lID0gIlBoaWxpcHMgVERBODI3WCIsCisJCS5mcmVxdWVuY3lfbWluICA9ICA1NTAwMDAwMCwKKwkJLmZyZXF1ZW5jeV9tYXggID0gODYwMDAwMDAwLAorCQkuZnJlcXVlbmN5X3N0ZXAgPSAgICAyNTAwMDAKKwl9LAorCS5yZWxlYXNlID0gdGRhODI3eF9yZWxlYXNlLAorCS5pbml0ID0gdGRhODI3eF9pbml0aWFsX2luaXQsCisJLnNsZWVwID0gdGRhODI3eF9pbml0aWFsX3NsZWVwLAorCS5zZXRfcGFyYW1zID0gdGRhODI3eG9fc2V0X3BhcmFtcywKKwkuZ2V0X2ZyZXF1ZW5jeSA9IHRkYTgyN3hfZ2V0X2ZyZXF1ZW5jeSwKKwkuZ2V0X2JhbmR3aWR0aCA9IHRkYTgyN3hfZ2V0X2JhbmR3aWR0aCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZHZiX3R1bmVyX29wcyB0ZGE4Mjd4YV90dW5lcl9vcHMgPSB7CisJLmluZm8gPSB7CisJCS5uYW1lID0gIlBoaWxpcHMgVERBODI3WEEiLAorCQkuZnJlcXVlbmN5X21pbiAgPSAgNDQwMDAwMDAsCisJCS5mcmVxdWVuY3lfbWF4ICA9IDkwNjAwMDAwMCwKKwkJLmZyZXF1ZW5jeV9zdGVwID0gICAgIDYyNTAwCisJfSwKKwkucmVsZWFzZSA9IHRkYTgyN3hfcmVsZWFzZSwKKwkuaW5pdCA9IHRkYTgyN3hfaW5pdCwKKwkuc2xlZXAgPSB0ZGE4Mjd4YV9zbGVlcCwKKwkuc2V0X3BhcmFtcyA9IHRkYTgyN3hhX3NldF9wYXJhbXMsCisJLmdldF9mcmVxdWVuY3kgPSB0ZGE4Mjd4X2dldF9mcmVxdWVuY3ksCisJLmdldF9iYW5kd2lkdGggPSB0ZGE4Mjd4X2dldF9iYW5kd2lkdGgsCit9OworCitzdGF0aWMgaW50IHRkYTgyN3hfcHJvYmVfdmVyc2lvbihzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3sJdTggZGF0YTsKKwlzdHJ1Y3QgdGRhODI3eF9wcml2ICpwcml2ID0gZmUtPnR1bmVyX3ByaXY7CisJc3RydWN0IGkyY19tc2cgbXNnID0geyAuYWRkciA9IHByaXYtPmkyY19hZGRyLCAuZmxhZ3MgPSBJMkNfTV9SRCwKKwkJCSAgICAgICAuYnVmID0gJmRhdGEsIC5sZW4gPSAxIH07CisJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKKwlpZiAoaTJjX3RyYW5zZmVyKHByaXYtPmkyY19hZGFwLCAmbXNnLCAxKSAhPSAxKSB7CisJCXByaW50aygiJXM6IGNvdWxkIG5vdCByZWFkIGZyb20gdHVuZXIgYXQgYWRkcjogMHglMDJ4XG4iLAorCQkgICAgICAgX19GVU5DVElPTl9fLCBtc2cuYWRkciA8PCAxKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCWlmICgoZGF0YSAmIDB4M2MpID09IDApIHsKKwkJZHByaW50aygidGRhODI3eCB0dW5lciBmb3VuZFxuIik7CisJCWZlLT5vcHMudHVuZXJfb3BzLmluaXQgID0gdGRhODI3eF9pbml0OworCQlmZS0+b3BzLnR1bmVyX29wcy5zbGVlcCA9IHRkYTgyN3hvX3NsZWVwOworCX0gZWxzZSB7CisJCWRwcmludGsoInRkYTgyN3hhIHR1bmVyIGZvdW5kXG4iKTsKKwkJbWVtY3B5KCZmZS0+b3BzLnR1bmVyX29wcywgJnRkYTgyN3hhX3R1bmVyX29wcywgc2l6ZW9mKHN0cnVjdCBkdmJfdHVuZXJfb3BzKSk7CisJfQorCXJldHVybiAwOworfQorCitzdHJ1Y3QgZHZiX2Zyb250ZW5kICp0ZGE4Mjd4X2F0dGFjaChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgaW50IGFkZHIsCisJCQkJICAgIHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjLAorCQkJCSAgICBzdHJ1Y3QgdGRhODI3eF9jb25maWcgKmNmZykKK3sKKwlzdHJ1Y3QgdGRhODI3eF9wcml2ICpwcml2ID0gTlVMTDsKKworCWRwcmludGsoIiVzOlxuIiwgX19GVU5DVElPTl9fKTsKKwlwcml2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHRkYTgyN3hfcHJpdiksIEdGUF9LRVJORUwpOworCWlmIChwcml2ID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJcHJpdi0+aTJjX2FkZHIgPSBhZGRyOworCXByaXYtPmkyY19hZGFwID0gaTJjOworCXByaXYtPmNmZyA9IGNmZzsKKwltZW1jcHkoJmZlLT5vcHMudHVuZXJfb3BzLCAmdGRhODI3eG9fdHVuZXJfb3BzLCBzaXplb2Yoc3RydWN0IGR2Yl90dW5lcl9vcHMpKTsKKworCWZlLT50dW5lcl9wcml2ID0gcHJpdjsKKworCXJldHVybiBmZTsKK30KKworRVhQT1JUX1NZTUJPTCh0ZGE4Mjd4X2F0dGFjaCk7CisKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJUdXJuIG9uL29mZiBmcm9udGVuZCBkZWJ1Z2dpbmcgKGRlZmF1bHQ6b2ZmKS4iKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJEVkIgVERBODI3eCBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIkhhcnRtdXQgSGFja21hbm4gPGhhcnRtdXQuaGFja21hbm5AdC1vbmxpbmUuZGU+Iik7CitNT0RVTEVfQVVUSE9SKCJNaWNoYWVsIEtydWZreSA8bWtydWZreUBsaW51eHR2Lm9yZz4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyoKKyAqIE92ZXJyaWRlcyBmb3IgRW1hY3Mgc28gdGhhdCB3ZSBmb2xsb3cgTGludXMncyB0YWJiaW5nIHN0eWxlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiBjLWJhc2ljLW9mZnNldDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhODI3eC5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTgyN3guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWU4MjYzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTgyN3guaApAQCAtMCwwICsxLDYyIEBACisgIC8qCisgICAgIERWQiBEcml2ZXIgZm9yIFBoaWxpcHMgdGRhODI3eCAvIHRkYTgyN3hhIFNpbGljb24gdHVuZXJzCisKKyAgICAgKGMpIDIwMDUgSGFydG11dCBIYWNrbWFubgorICAgICAoYykgMjAwNyBNaWNoYWVsIEtydWZreQorCisgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKworICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgICovCisKKyNpZm5kZWYgX19EVkJfVERBODI3WF9IX18KKyNkZWZpbmUgX19EVkJfVERBODI3WF9IX18KKworI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgImR2Yl9mcm9udGVuZC5oIgorCitzdHJ1Y3QgdGRhODI3eF9jb25maWcKK3sKKwl2b2lkICgqbG5hX2dhaW4pIChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgaW50IGhpZ2gpOworCWludCAoKmluaXQpIChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSk7CisJaW50ICgqc2xlZXApIChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSk7Cit9OworCisKKy8qKgorICogQXR0YWNoIGEgdGRhODI3eCB0dW5lciB0byB0aGUgc3VwcGxpZWQgZnJvbnRlbmQgc3RydWN0dXJlLgorICoKKyAqIEBwYXJhbSBmZSBGcm9udGVuZCB0byBhdHRhY2ggdG8uCisgKiBAcGFyYW0gYWRkciBpMmMgYWRkcmVzcyBvZiB0aGUgdHVuZXIuCisgKiBAcGFyYW0gaTJjIGkyYyBhZGFwdGVyIHRvIHVzZS4KKyAqIEBwYXJhbSBjZmcgb3B0aW9uYWwgY2FsbGJhY2sgZnVuY3Rpb24gcG9pbnRlcnMuCisgKiBAcmV0dXJuIEZFIHBvaW50ZXIgb24gc3VjY2VzcywgTlVMTCBvbiBmYWlsdXJlLgorICovCisjaWYgZGVmaW5lZChDT05GSUdfRFZCX1REQTgyN1gpIHx8IChkZWZpbmVkKENPTkZJR19EVkJfVERBODI3WF9NT0RVTEUpICYmIGRlZmluZWQoTU9EVUxFKSkKK2V4dGVybiBzdHJ1Y3QgZHZiX2Zyb250ZW5kKiB0ZGE4Mjd4X2F0dGFjaChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgaW50IGFkZHIsCisJCQkJCSAgIHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjLAorCQkJCQkgICBzdHJ1Y3QgdGRhODI3eF9jb25maWcgKmNmZyk7CisjZWxzZQorc3RhdGljIGlubGluZSBzdHJ1Y3QgZHZiX2Zyb250ZW5kKiB0ZGE4Mjd4X2F0dGFjaChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwkJCQkJCSAgaW50IGFkZHIsCisJCQkJCQkgIHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjLAorCQkJCQkJICBzdHJ1Y3QgdGRhODI3eF9jb25maWcgKmNmZykKK3sKKwlwcmludGsoS0VSTl9XQVJOSU5HICIlczogZHJpdmVyIGRpc2FibGVkIGJ5IEtjb25maWdcbiIsIF9fRlVOQ1RJT05fXyk7CisJcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYgLy8gQ09ORklHX0RWQl9UREE4MjdYCisKKyNlbmRpZiAvLyBfX0RWQl9UREE4MjdYX0hfXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvcGx1dG8yL0tjb25maWcgYi9kcml2ZXJzL21lZGlhL2R2Yi9wbHV0bzIvS2NvbmZpZwppbmRleCA5Yjg0YjFiLi43ZDhlNmU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9wbHV0bzIvS2NvbmZpZworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9wbHV0bzIvS2NvbmZpZwpAQCAtMiw3ICsyLDYgQEAKIAl0cmlzdGF0ZSAiUGx1dG8yIGNhcmRzIgogCWRlcGVuZHMgb24gRFZCX0NPUkUgJiYgUENJICYmIEkyQwogCXNlbGVjdCBJMkNfQUxHT0JJVAotCXNlbGVjdCBEVkJfUExMCiAJc2VsZWN0IERWQl9UREExMDA0WAogCWhlbHAKIAkgIFN1cHBvcnQgZm9yIFBDSSBjYXJkcyBiYXNlZCBvbiB0aGUgUGx1dG8yIEZQR0EgbGlrZSB0aGUgU2F0ZWxjbwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL0tjb25maWcKaW5kZXggZWVjN2NjZi4uNzc1MTYyOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvS2NvbmZpZworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9LY29uZmlnCkBAIC0zLDcgKzMsNiBAQAogCWRlcGVuZHMgb24gRFZCX0NPUkUgJiYgUENJICYmIEkyQyAmJiBWSURFT19WNEwxCiAJc2VsZWN0IEZXX0xPQURFUiBpZiAhRFZCX0FWNzExMF9GSVJNV0FSRQogCXNlbGVjdCBWSURFT19TQUE3MTQ2X1ZWCi0Jc2VsZWN0IERWQl9QTEwKIAlzZWxlY3QgRFZCX1ZFUzE4MjAgaWYgIURWQl9GRV9DVVNUT01JU0UKIAlzZWxlY3QgRFZCX1ZFUzFYOTMgaWYgIURWQl9GRV9DVVNUT01JU0UKIAlzZWxlY3QgRFZCX1NUVjAyOTkgaWYgIURWQl9GRV9DVVNUT01JU0UKQEAgLTYyLDEzICs2MSwxMyBAQAogCXRyaXN0YXRlICJCdWRnZXQgY2FyZHMiCiAJZGVwZW5kcyBvbiBEVkJfQ09SRSAmJiBQQ0kgJiYgSTJDICYmIFZJREVPX1Y0TDEKIAlzZWxlY3QgVklERU9fU0FBNzE0NgotCXNlbGVjdCBEVkJfUExMCiAJc2VsZWN0IERWQl9TVFYwMjk5IGlmICFEVkJfRkVfQ1VTVE9NSVNFCiAJc2VsZWN0IERWQl9WRVMxWDkzIGlmICFEVkJfRkVfQ1VTVE9NSVNFCiAJc2VsZWN0IERWQl9WRVMxODIwIGlmICFEVkJfRkVfQ1VTVE9NSVNFCiAJc2VsZWN0IERWQl9MNjQ3ODEgaWYgIURWQl9GRV9DVVNUT01JU0UKIAlzZWxlY3QgRFZCX1REQTgwODMgaWYgIURWQl9GRV9DVVNUT01JU0UKIAlzZWxlY3QgRFZCX1REQTEwMDIxIGlmICFEVkJfRkVfQ1VTVE9NSVNFCisJc2VsZWN0IERWQl9UREExMDAyMyBpZiAhRFZCX0ZFX0NVU1RPTUlTRQogCXNlbGVjdCBEVkJfUzVIMTQyMCBpZiAhRFZCX0ZFX0NVU1RPTUlTRQogCXNlbGVjdCBEVkJfVERBMTAwODYgaWYgIURWQl9GRV9DVVNUT01JU0UKIAlzZWxlY3QgRFZCX1REQTgyNlggaWYgIURWQl9GRV9DVVNUT01JU0UKQEAgLTg3LDcgKzg2LDYgQEAKIAl0cmlzdGF0ZSAiQnVkZ2V0IGNhcmRzIHdpdGggb25ib2FyZCBDSSBjb25uZWN0b3IiCiAJZGVwZW5kcyBvbiBEVkJfQ09SRSAmJiBQQ0kgJiYgSTJDICYmIFZJREVPX1Y0TDEKIAlzZWxlY3QgVklERU9fU0FBNzE0NgotCXNlbGVjdCBEVkJfUExMCiAJc2VsZWN0IERWQl9TVFYwMjk3IGlmICFEVkJfRkVfQ1VTVE9NSVNFCiAJc2VsZWN0IERWQl9TVFYwMjk5IGlmICFEVkJfRkVfQ1VTVE9NSVNFCiAJc2VsZWN0IERWQl9UREExMDA0WCBpZiAhRFZCX0ZFX0NVU1RPTUlTRQpAQCAtMTE0LDYgKzExMiw3IEBACiAJc2VsZWN0IERWQl9TVFYwMjk5IGlmICFEVkJfRkVfQ1VTVE9NSVNFCiAJc2VsZWN0IERWQl9UREExMDA0WCBpZiAhRFZCX0ZFX0NVU1RPTUlTRQogCXNlbGVjdCBEVkJfVERBMTAwMjEgaWYgIURWQl9GRV9DVVNUT01JU0UKKwlzZWxlY3QgRFZCX1REQTEwMDIzIGlmICFEVkJfRkVfQ1VTVE9NSVNFCiAJc2VsZWN0IERWQl9UVUE2MTAwIGlmICFEVkJfRkVfQ1VTVE9NSVNFCiAJc2VsZWN0IEZXX0xPQURFUgogCWhlbHAKQEAgLTEzMCw3ICsxMjksNiBAQAogCXRyaXN0YXRlICJBVjcxMTAgY2FyZHMgd2l0aCBCdWRnZXQgUGF0Y2giCiAJZGVwZW5kcyBvbiBEVkJfQ09SRSAmJiBEVkJfQlVER0VUICYmIFZJREVPX1Y0TDEKIAlzZWxlY3QgRFZCX0FWNzExMAotCXNlbGVjdCBEVkJfUExMCiAJc2VsZWN0IERWQl9TVFYwMjk5IGlmICFEVkJfRkVfQ1VTVE9NSVNFCiAJc2VsZWN0IERWQl9WRVMxWDkzIGlmICFEVkJfRkVfQ1VTVE9NSVNFCiAJc2VsZWN0IERWQl9UREE4MDgzIGlmICFEVkJfRkVfQ1VTVE9NSVNFCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9hdjcxMTAuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMC5jCmluZGV4IDI5ZWQ1MzIuLjY3YmVjZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMC5jCkBAIC0yMTksNyArMjE5LDEwIEBACiAJCWF2NzExMC0+cmVjb3ZlcihhdjcxMTApOwogCiAJcmVzdGFydF9mZWVkcyhhdjcxMTApOwotCWF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX1BJREZJTFRFUiwgU2V0SVIsIDEsIGF2NzExMC0+aXJfY29uZmlnKTsKKworI2lmIGRlZmluZWQoQ09ORklHX0lOUFVUX0VWREVWKSB8fCBkZWZpbmVkKENPTkZJR19JTlBVVF9FVkRFVl9NT0RVTEUpCisJYXY3MTEwX2NoZWNrX2lyX2NvbmZpZyhhdjcxMTAsIHRydWUpOworI2VuZGlmCiB9CiAKIHN0YXRpYyB2b2lkIGF2NzExMF9hcm1fc3luYyhzdHJ1Y3QgYXY3MTEwICphdjcxMTApCkBAIC0yNTAsNiArMjUzLDEwIEBACiAJCWlmICghYXY3MTEwLT5hcm1fcmVhZHkpCiAJCQljb250aW51ZTsKIAorI2lmIGRlZmluZWQoQ09ORklHX0lOUFVUX0VWREVWKSB8fCBkZWZpbmVkKENPTkZJR19JTlBVVF9FVkRFVl9NT0RVTEUpCisJCWF2NzExMF9jaGVja19pcl9jb25maWcoYXY3MTEwLCBmYWxzZSk7CisjZW5kaWYKKwogCQlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZhdjcxMTAtPmRjb21sb2NrKSkKIAkJCWJyZWFrOwogCQluZXdsb29wcyA9IHJkZWJpKGF2NzExMCwgREVCSU5PU1dBUCwgU1RBVFVTX0xPT1BTLCAwLCAyKTsKQEAgLTY2Nyw4ICs2NzQsOCBAQAogCQlyZXR1cm47CiAKIAljYXNlIERBVEFfSVJDT01NQU5EOgotCQlpZiAoYXY3MTEwLT5pcl9oYW5kbGVyKQotCQkJYXY3MTEwLT5pcl9oYW5kbGVyKGF2NzExMCwKKwkJaWYgKGF2NzExMC0+aXIuaXJfaGFuZGxlcikKKwkJCWF2NzExMC0+aXIuaXJfaGFuZGxlcihhdjcxMTAsCiAJCQkJc3dhaHczMihpcmRlYmkoYXY3MTEwLCBERUJJTk9TV0FQLCBSZXNlcnZlZCwgMCwgNCkpKTsKIAkJaXdkZWJpKGF2NzExMCwgREVCSU5PU1dBUCwgUlhfQlVGRiwgMCwgMik7CiAJCWJyZWFrOwpAQCAtMTkwNyw4ICsxOTE0LDEwIEBACiAJaWYgKGF2NzExMC0+ZmVfc3luY2VkID09IHN5bmNlZCkKIAkJcmV0dXJuIDA7CiAKLQlpZiAoYXY3MTEwLT5wbGF5aW5nKQorCWlmIChhdjcxMTAtPnBsYXlpbmcpIHsKKwkJYXY3MTEwLT5mZV9zeW5jZWQgPSBzeW5jZWQ7CiAJCXJldHVybiAwOworCX0KIAogCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmF2NzExMC0+cGlkX211dGV4KSkKIAkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMC5oIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwLmgKaW5kZXggYjk4YmQ0NS4uMTE1MDAyYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwLmgKQEAgLTUsNiArNSw3IEBACiAjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KIAogI2luY2x1ZGUgPGxpbnV4L2R2Yi92aWRlby5oPgogI2luY2x1ZGUgPGxpbnV4L2R2Yi9hdWRpby5oPgpAQCAtNjYsNiArNjcsMjcgQEAKIH07CiAKIAorc3RydWN0IGF2NzExMDsKKworLyogaW5mcmFyZWQgcmVtb3RlIGNvbnRyb2wgKi8KK3N0cnVjdCBpbmZyYXJlZCB7CisJdTE2CWtleV9tYXBbMjU2XTsKKwlzdHJ1Y3QgaW5wdXRfZGV2CSppbnB1dF9kZXY7CisJY2hhcgkJCWlucHV0X3BoeXNbMzJdOworCXN0cnVjdCB0aW1lcl9saXN0CWtleXVwX3RpbWVyOworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdAlpcl90YXNrbGV0OworCXZvaWQJCQkoKmlyX2hhbmRsZXIpKHN0cnVjdCBhdjcxMTAgKmF2NzExMCwgdTMyIGlyY29tKTsKKwl1MzIJCQlpcl9jb21tYW5kOworCXUzMgkJCWlyX2NvbmZpZzsKKwl1MzIJCQlkZXZpY2VfbWFzazsKKwl1OAkJCXByb3RvY29sOworCXU4CQkJaW52ZXJzaW9uOworCXUxNgkJCWxhc3Rfa2V5OworCXUxNgkJCWxhc3RfdG9nZ2xlOworCXU4CQkJZGVsYXlfdGltZXJfZmluaXNoZWQ7Cit9OworCisKIC8qIHBsYWNlIHRvIHN0b3JlIGFsbCB0aGUgbmVjZXNzYXJ5IGRldmljZSBpbmZvcm1hdGlvbiAqLwogc3RydWN0IGF2NzExMCB7CiAKQEAgLTIyNywxMCArMjQ5LDcgQEAKIAl1MTYJCQl3c3NNb2RlOwogCXUxNgkJCXdzc0RhdGE7CiAKLQl1MzIJCQlpcl9jb25maWc7Ci0JdTMyCQkJaXJfY29tbWFuZDsKLQl2b2lkCQkJKCppcl9oYW5kbGVyKShzdHJ1Y3QgYXY3MTEwICphdjcxMTAsIHUzMiBpcmNvbSk7Ci0Jc3RydWN0IHRhc2tsZXRfc3RydWN0CWlyX3Rhc2tsZXQ7CisJc3RydWN0IGluZnJhcmVkCQlpcjsKIAogCS8qIGZpcm13YXJlIHN0dWZmICovCiAJdW5zaWduZWQgY2hhciAqYmluX2Z3OwpAQCAtMjY4LDYgKzI4Nyw3IEBACiBleHRlcm4gaW50IENoYW5nZVBJRHMoc3RydWN0IGF2NzExMCAqYXY3MTEwLCB1MTYgdnBpZCwgdTE2IGFwaWQsIHUxNiB0dHBpZCwKIAkJICAgICAgIHUxNiBzdWJwaWQsIHUxNiBwY3JwaWQpOwogCitleHRlcm4gaW50IGF2NzExMF9jaGVja19pcl9jb25maWcoc3RydWN0IGF2NzExMCAqYXY3MTEwLCBpbnQgZm9yY2UpOwogZXh0ZXJuIGludCBhdjcxMTBfaXJfaW5pdChzdHJ1Y3QgYXY3MTEwICphdjcxMTApOwogZXh0ZXJuIHZvaWQgYXY3MTEwX2lyX2V4aXQoc3RydWN0IGF2NzExMCAqYXY3MTEwKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwX2F2LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9hdjcxMTBfYXYuYwppbmRleCBlNzE5YWY4Li42NTRjOWU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9hdjcxMTBfYXYuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9hdjcxMTBfYXYuYwpAQCAtMTAwOSw3ICsxMDA5LDcgQEAKIAkJaWYgKGF2NzExMC0+dmlkZW9zdGF0ZS5zdHJlYW1fc291cmNlID09IFZJREVPX1NPVVJDRV9NRU1PUlkpCiAJCQlyZXQgPSBhdjcxMTBfYXZfc3RvcChhdjcxMTAsIFJQX1ZJREVPKTsKIAkJZWxzZQotCQkJcmV0ID0gdmlkY29tKGF2NzExMCwgVklERU9fQ01EX1NUT1AsCisJCQlyZXQgPSB2aWRjb20oYXY3MTEwLCBBVl9WSURFT19DTURfU1RPUCwKIAkJCSAgICAgICBhdjcxMTAtPnZpZGVvc3RhdGUudmlkZW9fYmxhbmsgPyAwIDogMSk7CiAJCWlmICghcmV0KQogCQkJYXY3MTEwLT50cmlja21vZGUgPSBUUklDS19OT05FOwpAQCAtMTAxOSw3ICsxMDE5LDcgQEAKIAkJYXY3MTEwLT50cmlja21vZGUgPSBUUklDS19OT05FOwogCQlpZiAoYXY3MTEwLT52aWRlb3N0YXRlLnBsYXlfc3RhdGUgPT0gVklERU9fRlJFRVpFRCkgewogCQkJYXY3MTEwLT52aWRlb3N0YXRlLnBsYXlfc3RhdGUgPSBWSURFT19QTEFZSU5HOwotCQkJcmV0ID0gdmlkY29tKGF2NzExMCwgVklERU9fQ01EX1BMQVksIDApOworCQkJcmV0ID0gdmlkY29tKGF2NzExMCwgQVZfVklERU9fQ01EX1BMQVksIDApOwogCQkJaWYgKHJldCkKIAkJCQlicmVhazsKIAkJfQpAQCAtMTAzNCw3ICsxMDM0LDcgQEAKIAkJCXJldCA9IGF2NzExMF9hdl9zdGFydF9wbGF5KGF2NzExMCwgUlBfVklERU8pOwogCQl9CiAJCWlmICghcmV0KQotCQkJcmV0ID0gdmlkY29tKGF2NzExMCwgVklERU9fQ01EX1BMQVksIDApOworCQkJcmV0ID0gdmlkY29tKGF2NzExMCwgQVZfVklERU9fQ01EX1BMQVksIDApOwogCQlpZiAoIXJldCkKIAkJCWF2NzExMC0+dmlkZW9zdGF0ZS5wbGF5X3N0YXRlID0gVklERU9fUExBWUlORzsKIAkJYnJlYWs7CkBAIC0xMDQ0LDcgKzEwNDQsNyBAQAogCQlpZiAoYXY3MTEwLT5wbGF5aW5nICYgUlBfVklERU8pCiAJCQlyZXQgPSBhdjcxMTBfZndfY21kKGF2NzExMCwgQ09NVFlQRV9SRUNfUExBWSwgX19QYXVzZSwgMCk7CiAJCWVsc2UKLQkJCXJldCA9IHZpZGNvbShhdjcxMTAsIFZJREVPX0NNRF9GUkVFWkUsIDEpOworCQkJcmV0ID0gdmlkY29tKGF2NzExMCwgQVZfVklERU9fQ01EX0ZSRUVaRSwgMSk7CiAJCWlmICghcmV0KQogCQkJYXY3MTEwLT50cmlja21vZGUgPSBUUklDS19GUkVFWkU7CiAJCWJyZWFrOwpAQCAtMTA1Myw3ICsxMDUzLDcgQEAKIAkJaWYgKGF2NzExMC0+cGxheWluZyAmIFJQX1ZJREVPKQogCQkJcmV0ID0gYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfUkVDX1BMQVksIF9fQ29udGludWUsIDApOwogCQlpZiAoIXJldCkKLQkJCXJldCA9IHZpZGNvbShhdjcxMTAsIFZJREVPX0NNRF9QTEFZLCAwKTsKKwkJCXJldCA9IHZpZGNvbShhdjcxMTAsIEFWX1ZJREVPX0NNRF9QTEFZLCAwKTsKIAkJaWYgKCFyZXQpIHsKIAkJCWF2NzExMC0+dmlkZW9zdGF0ZS5wbGF5X3N0YXRlID0gVklERU9fUExBWUlORzsKIAkJCWF2NzExMC0+dHJpY2ttb2RlID0gVFJJQ0tfTk9ORTsKQEAgLTExMzYsNyArMTEzNiw3IEBACiAJCQlyZXQgPSBhdjcxMTBfZndfY21kKGF2NzExMCwgQ09NVFlQRV9SRUNfUExBWSwKIAkJCQkJICAgIF9fU2Nhbl9JLCAyLCBBVl9QRVMsIDApOwogCQllbHNlCi0JCQlyZXQgPSB2aWRjb20oYXY3MTEwLCBWSURFT19DTURfRkZXRCwgYXJnKTsKKwkJCXJldCA9IHZpZGNvbShhdjcxMTAsIEFWX1ZJREVPX0NNRF9GRldELCBhcmcpOwogCQlpZiAoIXJldCkgewogCQkJYXY3MTEwLT50cmlja21vZGUgPSBUUklDS19GQVNUOwogCQkJYXY3MTEwLT52aWRlb3N0YXRlLnBsYXlfc3RhdGUgPSBWSURFT19QTEFZSU5HOwpAQCAtMTE0NywxMyArMTE0NywxMyBAQAogCQlpZiAoYXY3MTEwLT5wbGF5aW5nJlJQX1ZJREVPKSB7CiAJCQlyZXQgPSBhdjcxMTBfZndfY21kKGF2NzExMCwgQ09NVFlQRV9SRUNfUExBWSwgX19TbG93LCAyLCAwLCAwKTsKIAkJCWlmICghcmV0KQotCQkJCXJldCA9IHZpZGNvbShhdjcxMTAsIFZJREVPX0NNRF9TTE9XLCBhcmcpOworCQkJCXJldCA9IHZpZGNvbShhdjcxMTAsIEFWX1ZJREVPX0NNRF9TTE9XLCBhcmcpOwogCQl9IGVsc2UgewotCQkJcmV0ID0gdmlkY29tKGF2NzExMCwgVklERU9fQ01EX1BMQVksIDApOworCQkJcmV0ID0gdmlkY29tKGF2NzExMCwgQVZfVklERU9fQ01EX1BMQVksIDApOwogCQkJaWYgKCFyZXQpCi0JCQkJcmV0ID0gdmlkY29tKGF2NzExMCwgVklERU9fQ01EX1NUT1AsIDApOworCQkJCXJldCA9IHZpZGNvbShhdjcxMTAsIEFWX1ZJREVPX0NNRF9TVE9QLCAwKTsKIAkJCWlmICghcmV0KQotCQkJCXJldCA9IHZpZGNvbShhdjcxMTAsIFZJREVPX0NNRF9TTE9XLCBhcmcpOworCQkJCXJldCA9IHZpZGNvbShhdjcxMTAsIEFWX1ZJREVPX0NNRF9TTE9XLCBhcmcpOwogCQl9CiAJCWlmICghcmV0KSB7CiAJCQlhdjcxMTAtPnRyaWNrbW9kZSA9IFRSSUNLX1NMT1c7CkBAIC0xMTgyLDEwICsxMTgyLDEwIEBACiAJCQkJcmV0ID0gYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfUkVDX1BMQVksCiAJCQkJCQkgICAgX19TbG93LCAyLCAwLCAwKTsKIAkJCQlpZiAoIXJldCkKLQkJCQkJcmV0ID0gdmlkY29tKGF2NzExMCwgVklERU9fQ01EX1NMT1csIGFyZyk7CisJCQkJCXJldCA9IHZpZGNvbShhdjcxMTAsIEFWX1ZJREVPX0NNRF9TTE9XLCBhcmcpOwogCQkJfQogCQkJaWYgKGF2NzExMC0+dHJpY2ttb2RlID09IFRSSUNLX0ZSRUVaRSkKLQkJCQlyZXQgPSB2aWRjb20oYXY3MTEwLCBWSURFT19DTURfU1RPUCwgMSk7CisJCQkJcmV0ID0gdmlkY29tKGF2NzExMCwgQVZfVklERU9fQ01EX1NUT1AsIDEpOwogCQl9CiAJCWJyZWFrOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9hdjcxMTBfaHcuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMF9ody5oCmluZGV4IDRlMTczYzYuLjY3M2Q5YjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMF9ody5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMF9ody5oCkBAIC0yMTYsMTEgKzIxNiwxMSBAQAogI2RlZmluZSBWSURfQ0VOVFJFX0NVVF9QUkVGCTB4MDUJLyogUGFuU2NhbiB3aXRoIHplcm8gdmVjdG9yICovCiAKIC8qIE1QRUcgdmlkZW8gZGVjb2RlciBjb21tYW5kcyAqLwotI2RlZmluZSBWSURFT19DTURfU1RPUAkJMHgwMDBlCi0jZGVmaW5lIFZJREVPX0NNRF9QTEFZCQkweDAwMGQKLSNkZWZpbmUgVklERU9fQ01EX0ZSRUVaRQkweDAxMDIKLSNkZWZpbmUgVklERU9fQ01EX0ZGV0QJCTB4MDAxNgotI2RlZmluZSBWSURFT19DTURfU0xPVwkJMHgwMDIyCisjZGVmaW5lIEFWX1ZJREVPX0NNRF9TVE9QCTB4MDAwZQorI2RlZmluZSBBVl9WSURFT19DTURfUExBWQkweDAwMGQKKyNkZWZpbmUgQVZfVklERU9fQ01EX0ZSRUVaRQkweDAxMDIKKyNkZWZpbmUgQVZfVklERU9fQ01EX0ZGV0QJMHgwMDE2CisjZGVmaW5lIEFWX1ZJREVPX0NNRF9TTE9XCTB4MDAyMgogCiAvKiBNUEVHIGF1ZGlvIGRlY29kZXIgY29tbWFuZHMgKi8KICNkZWZpbmUgQVVESU9fQ01EX01VVEUJCTB4MDAwMQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwX2lyLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9hdjcxMTBfaXIuYwppbmRleCBmNTk0NjViLi5hOTdmMTY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9hdjcxMTBfaXIuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9hdjcxMTBfaXIuYwpAQCAtMSw4ICsxLDMxIEBACisvKgorICogRHJpdmVyIGZvciB0aGUgcmVtb3RlIGNvbnRyb2wgb2YgU0FBNzE0NiBiYXNlZCBBVjcxMTAgY2FyZHMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwMyBIb2xnZXIgV2FlY2h0bGVyIDxob2xnZXJAY29udmVyZ2VuY2UuZGU+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNyBPbGl2ZXIgRW5kcmlzcyA8by5lbmRyaXNzQGdteC5kZT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKyAqIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICogT3IsIHBvaW50IHlvdXIgYnJvd3NlciB0byBodHRwOi8vd3d3LmdudS5vcmcvY29weWxlZnQvZ3BsLmh0bWwKKyAqCisgKi8KKworCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KLSNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxhc20vYml0b3BzLmg+CkBAIC0xMCwxOCArMzMsMzcgQEAKICNpbmNsdWRlICJhdjcxMTAuaCIKICNpbmNsdWRlICJhdjcxMTBfaHcuaCIKIAotI2RlZmluZSBVUF9USU1FT1VUIChIWio3LzI1KQogCi0vKiBlbmFibGUgaXIgZGVidWdnaW5nIGJ5IG9yJ2luZyBkZWJ1ZyB3aXRoIDE2ICovCisjZGVmaW5lIEFWX0NOVAkJNAorCisjZGVmaW5lIElSX1JDNQkJMAorI2RlZmluZSBJUl9SQ01NCQkxCisjZGVmaW5lIElSX1JDNV9FWFQJMiAvKiBpbnRlcm5hbCBvbmx5ICovCisKKyNkZWZpbmUgSVJfQUxMCQkweGZmZmZmZmZmCisKKyNkZWZpbmUgVVBfVElNRU9VVAkoSFoqNy8yNSkKKworCisvKiBOb3RlOiBlbmFibGUgaXIgZGVidWdnaW5nIGJ5IG9yJ2luZyBkZWJ1ZyB3aXRoIDE2ICovCisKK3N0YXRpYyBpbnQgaXJfcHJvdG9jb2xbQVZfQ05UXSA9IHsgSVJfUkNNTSwgSVJfUkNNTSwgSVJfUkNNTSwgSVJfUkNNTX07Cittb2R1bGVfcGFyYW1fYXJyYXkoaXJfcHJvdG9jb2wsIGludCwgTlVMTCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGlyX3Byb3RvY29sLCAiSW5mcmFyZWQgcHJvdG9jb2w6IDAgUkM1LCAxIFJDTU0gKGRlZmF1bHQpIik7CisKK3N0YXRpYyBpbnQgaXJfaW52ZXJzaW9uW0FWX0NOVF07Cittb2R1bGVfcGFyYW1fYXJyYXkoaXJfaW52ZXJzaW9uLCBpbnQsIE5VTEwsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhpcl9pbnZlcnNpb24sICJJbnZlcnNpb24gb2YgaW5mcmFyZWQgc2lnbmFsOiAwIG5vdCBpbnZlcnRlZCAoZGVmYXVsdCksIDEgaW52ZXJ0ZWQiKTsKKworc3RhdGljIHVpbnQgaXJfZGV2aWNlX21hc2tbQVZfQ05UXSA9IHsgSVJfQUxMLCBJUl9BTEwsIElSX0FMTCwgSVJfQUxMIH07Cittb2R1bGVfcGFyYW1fYXJyYXkoaXJfZGV2aWNlX21hc2ssIHVpbnQsIE5VTEwsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhpcl9kZXZpY2VfbWFzaywgIkJpdG1hc2sgb2YgaW5mcmFyZWQgZGV2aWNlczogYml0IDAuLjMxID0gZGV2aWNlIDAuLjMxIChkZWZhdWx0OiBhbGwpIik7CisKIAogc3RhdGljIGludCBhdl9jbnQ7Ci1zdGF0aWMgc3RydWN0IGF2NzExMCAqYXZfbGlzdFs0XTsKLXN0YXRpYyBzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXY7Ci1zdGF0aWMgY2hhciBpbnB1dF9waHlzWzMyXTsKK3N0YXRpYyBzdHJ1Y3QgYXY3MTEwICphdl9saXN0W0FWX0NOVF07CiAKLXN0YXRpYyB1OCBkZWxheV90aW1lcl9maW5pc2hlZDsKLQotc3RhdGljIHUxNiBrZXlfbWFwIFsyNTZdID0geworc3RhdGljIHUxNiBkZWZhdWx0X2tleV9tYXAgWzI1Nl0gPSB7CiAJS0VZXzAsIEtFWV8xLCBLRVlfMiwgS0VZXzMsIEtFWV80LCBLRVlfNSwgS0VZXzYsIEtFWV83LAogCUtFWV84LCBLRVlfOSwgS0VZX0JBQ0ssIDAsIEtFWV9QT1dFUiwgS0VZX01VVEUsIDAsIEtFWV9JTkZPLAogCUtFWV9WT0xVTUVVUCwgS0VZX1ZPTFVNRURPV04sIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCkBAIC00NSwxNDEgKzg3LDE5NCBAQAogfTsKIAogCi1zdGF0aWMgdm9pZCBhdjcxMTBfZW1pdF9rZXl1cCh1bnNpZ25lZCBsb25nIGRhdGEpCisvKiBrZXktdXAgdGltZXIgKi8KK3N0YXRpYyB2b2lkIGF2NzExMF9lbWl0X2tleXVwKHVuc2lnbmVkIGxvbmcgcGFybSkKIHsKLQlpZiAoIWRhdGEgfHwgIXRlc3RfYml0KGRhdGEsIGlucHV0X2Rldi0+a2V5KSkKKwlzdHJ1Y3QgaW5mcmFyZWQgKmlyID0gKHN0cnVjdCBpbmZyYXJlZCAqKSBwYXJtOworCisJaWYgKCFpciB8fCAhdGVzdF9iaXQoaXItPmxhc3Rfa2V5LCBpci0+aW5wdXRfZGV2LT5rZXkpKQogCQlyZXR1cm47CiAKLQlpbnB1dF9yZXBvcnRfa2V5KGlucHV0X2RldiwgZGF0YSwgMCk7Ci0JaW5wdXRfc3luYyhpbnB1dF9kZXYpOworCWlucHV0X3JlcG9ydF9rZXkoaXItPmlucHV0X2RldiwgaXItPmxhc3Rfa2V5LCAwKTsKKwlpbnB1dF9zeW5jKGlyLT5pbnB1dF9kZXYpOwogfQogCiAKLXN0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBrZXl1cF90aW1lciA9IHsgLmZ1bmN0aW9uID0gYXY3MTEwX2VtaXRfa2V5dXAgfTsKLQotCisvKiB0YXNrbGV0ICovCiBzdGF0aWMgdm9pZCBhdjcxMTBfZW1pdF9rZXkodW5zaWduZWQgbG9uZyBwYXJtKQogewotCXN0cnVjdCBhdjcxMTAgKmF2NzExMCA9IChzdHJ1Y3QgYXY3MTEwICopIHBhcm07Ci0JdTMyIGlyX2NvbmZpZyA9IGF2NzExMC0+aXJfY29uZmlnOwotCXUzMiBpcmNvbSA9IGF2NzExMC0+aXJfY29tbWFuZDsKKwlzdHJ1Y3QgaW5mcmFyZWQgKmlyID0gKHN0cnVjdCBpbmZyYXJlZCAqKSBwYXJtOworCXUzMiBpcmNvbSA9IGlyLT5pcl9jb21tYW5kOwogCXU4IGRhdGE7CiAJdTggYWRkcjsKLQlzdGF0aWMgdTE2IG9sZF90b2dnbGUgPSAwOwotCXUxNiBuZXdfdG9nZ2xlOworCXUxNiB0b2dnbGU7CiAJdTE2IGtleWNvZGU7CiAKIAkvKiBleHRyYWN0IGRldmljZSBhZGRyZXNzIGFuZCBkYXRhICovCi0Jc3dpdGNoIChpcl9jb25maWcgJiAweDAwMDMpIHsKLQljYXNlIDA6CS8qIFJDNTogNSBiaXRzIGRldmljZSBhZGRyZXNzLCA2IGJpdHMgZGF0YSAqLworCXN3aXRjaCAoaXItPnByb3RvY29sKSB7CisJY2FzZSBJUl9SQzU6IC8qIFJDNTogNSBiaXRzIGRldmljZSBhZGRyZXNzLCA2IGJpdHMgZGF0YSAqLwogCQlkYXRhID0gaXJjb20gJiAweDNmOwogCQlhZGRyID0gKGlyY29tID4+IDYpICYgMHgxZjsKKwkJdG9nZ2xlID0gaXJjb20gJiAweDA4MDA7CiAJCWJyZWFrOwogCi0JY2FzZSAxOgkvKiBSQ01NOiA4KD8pIGJpdHMgZGV2aWNlIGFkZHJlc3MsIDgoPykgYml0cyBkYXRhICovCisJY2FzZSBJUl9SQ01NOiAvKiBSQ01NOiA/IGJpdHMgZGV2aWNlIGFkZHJlc3MsID8gYml0cyBkYXRhICovCiAJCWRhdGEgPSBpcmNvbSAmIDB4ZmY7Ci0JCWFkZHIgPSAoaXJjb20gPj4gOCkgJiAweGZmOworCQlhZGRyID0gKGlyY29tID4+IDgpICYgMHgxZjsKKwkJdG9nZ2xlID0gaXJjb20gJiAweDgwMDA7CiAJCWJyZWFrOwogCi0JY2FzZSAyOgkvKiBleHRlbmRlZCBSQzU6IDUgYml0cyBkZXZpY2UgYWRkcmVzcywgNyBiaXRzIGRhdGEgKi8KKwljYXNlIElSX1JDNV9FWFQ6IC8qIGV4dGVuZGVkIFJDNTogNSBiaXRzIGRldmljZSBhZGRyZXNzLCA3IGJpdHMgZGF0YSAqLwogCQlkYXRhID0gaXJjb20gJiAweDNmOwogCQlhZGRyID0gKGlyY29tID4+IDYpICYgMHgxZjsKIAkJLyogaW52ZXJ0IDd0aCBkYXRhIGJpdCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIFJDNSBrZXltYXBzICovCiAJCWlmICghKGlyY29tICYgMHgxMDAwKSkKIAkJCWRhdGEgfD0gMHg0MDsKKwkJdG9nZ2xlID0gaXJjb20gJiAweDA4MDA7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJcHJpbnRrKCJpbnZhbGlkIGlyX2NvbmZpZyAleFxuIiwgaXJfY29uZmlnKTsKKwkJcHJpbnRrKCIlcyBpbnZhbGlkIHByb3RvY29sICV4XG4iLCBfX0ZVTkNUSU9OX18sIGlyLT5wcm90b2NvbCk7CiAJCXJldHVybjsKIAl9CiAKLQlrZXljb2RlID0ga2V5X21hcFtkYXRhXTsKKwlpbnB1dF9ldmVudChpci0+aW5wdXRfZGV2LCBFVl9NU0MsIE1TQ19SQVcsIChhZGRyIDw8IDE2KSB8IGRhdGEpOworCWlucHV0X2V2ZW50KGlyLT5pbnB1dF9kZXYsIEVWX01TQywgTVNDX1NDQU4sIGRhdGEpOwogCi0JZHByaW50aygxNiwgImNvZGUgJTA4eCAtPiBhZGRyICVpIGRhdGEgMHglMDJ4IC0+IGtleWNvZGUgJWlcbiIsCi0JCWlyY29tLCBhZGRyLCBkYXRhLCBrZXljb2RlKTsKKwlrZXljb2RlID0gaXItPmtleV9tYXBbZGF0YV07CiAKLQkvKiBjaGVjayBkZXZpY2UgYWRkcmVzcyAoaWYgc2VsZWN0ZWQpICovCi0JaWYgKGlyX2NvbmZpZyAmIDB4NDAwMCkKLQkJaWYgKGFkZHIgIT0gKChpcl9jb25maWcgPj4gMTYpICYgMHhmZikpCi0JCQlyZXR1cm47CisJZHByaW50aygxNiwgIiVzOiBjb2RlICUwOHggLT4gYWRkciAlaSBkYXRhIDB4JTAyeCAtPiBrZXljb2RlICVpXG4iLAorCQlfX0ZVTkNUSU9OX18sIGlyY29tLCBhZGRyLCBkYXRhLCBrZXljb2RlKTsKKworCS8qIGNoZWNrIGRldmljZSBhZGRyZXNzICovCisJaWYgKCEoaXItPmRldmljZV9tYXNrICYgKDEgPDwgYWRkcikpKQorCQlyZXR1cm47CiAKIAlpZiAoIWtleWNvZGUpIHsKLQkJcHJpbnRrICgiJXM6IHVua25vd24ga2V5IDB4JTAyeCEhXG4iLCBfX0ZVTkNUSU9OX18sIGRhdGEpOworCQlwcmludGsgKCIlczogY29kZSAlMDh4IC0+IGFkZHIgJWkgZGF0YSAweCUwMnggLT4gdW5rbm93biBrZXkhXG4iLAorCQkJX19GVU5DVElPTl9fLCBpcmNvbSwgYWRkciwgZGF0YSk7CiAJCXJldHVybjsKIAl9CiAKLQlpZiAoKGlyX2NvbmZpZyAmIDB4MDAwMykgPT0gMSkKLQkJbmV3X3RvZ2dsZSA9IDA7IC8qIFJDTU0gKi8KLQllbHNlCi0JCW5ld190b2dnbGUgPSAoaXJjb20gJiAweDgwMCk7IC8qIFJDNSwgZXh0ZW5kZWQgUkM1ICovCi0KLQlpZiAodGltZXJfcGVuZGluZygma2V5dXBfdGltZXIpKSB7Ci0JCWRlbF90aW1lcigma2V5dXBfdGltZXIpOwotCQlpZiAoa2V5dXBfdGltZXIuZGF0YSAhPSBrZXljb2RlIHx8IG5ld190b2dnbGUgIT0gb2xkX3RvZ2dsZSkgewotCQkJZGVsYXlfdGltZXJfZmluaXNoZWQgPSAwOwotCQkJaW5wdXRfZXZlbnQoaW5wdXRfZGV2LCBFVl9LRVksIGtleXVwX3RpbWVyLmRhdGEsIDApOwotCQkJaW5wdXRfZXZlbnQoaW5wdXRfZGV2LCBFVl9LRVksIGtleWNvZGUsIDEpOwotCQkJaW5wdXRfc3luYyhpbnB1dF9kZXYpOwotCQl9IGVsc2UgaWYgKGRlbGF5X3RpbWVyX2ZpbmlzaGVkKSB7Ci0JCQlpbnB1dF9ldmVudChpbnB1dF9kZXYsIEVWX0tFWSwga2V5Y29kZSwgMik7Ci0JCQlpbnB1dF9zeW5jKGlucHV0X2Rldik7CisJaWYgKHRpbWVyX3BlbmRpbmcoJmlyLT5rZXl1cF90aW1lcikpIHsKKwkJZGVsX3RpbWVyKCZpci0+a2V5dXBfdGltZXIpOworCQlpZiAoaXItPmxhc3Rfa2V5ICE9IGtleWNvZGUgfHwgdG9nZ2xlICE9IGlyLT5sYXN0X3RvZ2dsZSkgeworCQkJaXItPmRlbGF5X3RpbWVyX2ZpbmlzaGVkID0gMDsKKwkJCWlucHV0X2V2ZW50KGlyLT5pbnB1dF9kZXYsIEVWX0tFWSwgaXItPmxhc3Rfa2V5LCAwKTsKKwkJCWlucHV0X2V2ZW50KGlyLT5pbnB1dF9kZXYsIEVWX0tFWSwga2V5Y29kZSwgMSk7CisJCQlpbnB1dF9zeW5jKGlyLT5pbnB1dF9kZXYpOworCQl9IGVsc2UgaWYgKGlyLT5kZWxheV90aW1lcl9maW5pc2hlZCkgeworCQkJaW5wdXRfZXZlbnQoaXItPmlucHV0X2RldiwgRVZfS0VZLCBrZXljb2RlLCAyKTsKKwkJCWlucHV0X3N5bmMoaXItPmlucHV0X2Rldik7CiAJCX0KIAl9IGVsc2UgewotCQlkZWxheV90aW1lcl9maW5pc2hlZCA9IDA7Ci0JCWlucHV0X2V2ZW50KGlucHV0X2RldiwgRVZfS0VZLCBrZXljb2RlLCAxKTsKLQkJaW5wdXRfc3luYyhpbnB1dF9kZXYpOworCQlpci0+ZGVsYXlfdGltZXJfZmluaXNoZWQgPSAwOworCQlpbnB1dF9ldmVudChpci0+aW5wdXRfZGV2LCBFVl9LRVksIGtleWNvZGUsIDEpOworCQlpbnB1dF9zeW5jKGlyLT5pbnB1dF9kZXYpOwogCX0KIAotCWtleXVwX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgVVBfVElNRU9VVDsKLQlrZXl1cF90aW1lci5kYXRhID0ga2V5Y29kZTsKKwlpci0+bGFzdF9rZXkgPSBrZXljb2RlOworCWlyLT5sYXN0X3RvZ2dsZSA9IHRvZ2dsZTsKIAotCWFkZF90aW1lcigma2V5dXBfdGltZXIpOworCWlyLT5rZXl1cF90aW1lci5leHBpcmVzID0gamlmZmllcyArIFVQX1RJTUVPVVQ7CisJYWRkX3RpbWVyKCZpci0+a2V5dXBfdGltZXIpOwogCi0Jb2xkX3RvZ2dsZSA9IG5ld190b2dnbGU7CiB9CiAKLXN0YXRpYyB2b2lkIGlucHV0X3JlZ2lzdGVyX2tleXModm9pZCkKKworLyogcmVnaXN0ZXIgd2l0aCBpbnB1dCBsYXllciAqLworc3RhdGljIHZvaWQgaW5wdXRfcmVnaXN0ZXJfa2V5cyhzdHJ1Y3QgaW5mcmFyZWQgKmlyKQogewogCWludCBpOwogCi0JbWVtc2V0KGlucHV0X2Rldi0+a2V5Yml0LCAwLCBzaXplb2YoaW5wdXRfZGV2LT5rZXliaXQpKTsKKwlzZXRfYml0KEVWX0tFWSwgaXItPmlucHV0X2Rldi0+ZXZiaXQpOworCXNldF9iaXQoRVZfUkVQLCBpci0+aW5wdXRfZGV2LT5ldmJpdCk7CisJc2V0X2JpdChFVl9NU0MsIGlyLT5pbnB1dF9kZXYtPmV2Yml0KTsKIAotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGtleV9tYXApOyBpKyspIHsKLQkJaWYgKGtleV9tYXBbaV0gPiBLRVlfTUFYKQotCQkJa2V5X21hcFtpXSA9IDA7Ci0JCWVsc2UgaWYgKGtleV9tYXBbaV0gPiBLRVlfUkVTRVJWRUQpCi0JCQlzZXRfYml0KGtleV9tYXBbaV0sIGlucHV0X2Rldi0+a2V5Yml0KTsKKwlzZXRfYml0KE1TQ19SQVcsIGlyLT5pbnB1dF9kZXYtPm1zY2JpdCk7CisJc2V0X2JpdChNU0NfU0NBTiwgaXItPmlucHV0X2Rldi0+bXNjYml0KTsKKworCW1lbXNldChpci0+aW5wdXRfZGV2LT5rZXliaXQsIDAsIHNpemVvZihpci0+aW5wdXRfZGV2LT5rZXliaXQpKTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGlyLT5rZXlfbWFwKTsgaSsrKSB7CisJCWlmIChpci0+a2V5X21hcFtpXSA+IEtFWV9NQVgpCisJCQlpci0+a2V5X21hcFtpXSA9IDA7CisJCWVsc2UgaWYgKGlyLT5rZXlfbWFwW2ldID4gS0VZX1JFU0VSVkVEKQorCQkJc2V0X2JpdChpci0+a2V5X21hcFtpXSwgaXItPmlucHV0X2Rldi0+a2V5Yml0KTsKIAl9CisKKwlpci0+aW5wdXRfZGV2LT5rZXljb2RlID0gaXItPmtleV9tYXA7CisJaXItPmlucHV0X2Rldi0+a2V5Y29kZXNpemUgPSBzaXplb2YoaXItPmtleV9tYXBbMF0pOworCWlyLT5pbnB1dF9kZXYtPmtleWNvZGVtYXggPSBBUlJBWV9TSVpFKGlyLT5rZXlfbWFwKTsKIH0KIAogCi1zdGF0aWMgdm9pZCBpbnB1dF9yZXBlYXRfa2V5KHVuc2lnbmVkIGxvbmcgZGF0YSkKKy8qIGNhbGxlZCBieSB0aGUgaW5wdXQgZHJpdmVyIGFmdGVyIHJlcFtSRVBfREVMQVldIG1zICovCitzdGF0aWMgdm9pZCBpbnB1dF9yZXBlYXRfa2V5KHVuc2lnbmVkIGxvbmcgcGFybSkKIHsKLQkvKiBjYWxsZWQgYnkgdGhlIGlucHV0IGRyaXZlciBhZnRlciByZXBbUkVQX0RFTEFZXSBtcyAqLwotCWRlbGF5X3RpbWVyX2ZpbmlzaGVkID0gMTsKKwlzdHJ1Y3QgaW5mcmFyZWQgKmlyID0gKHN0cnVjdCBpbmZyYXJlZCAqKSBwYXJtOworCisJaXItPmRlbGF5X3RpbWVyX2ZpbmlzaGVkID0gMTsKIH0KIAogCi1zdGF0aWMgaW50IGF2NzExMF9zZXR1cF9pcmNfY29uZmlnKHN0cnVjdCBhdjcxMTAgKmF2NzExMCwgdTMyIGlyX2NvbmZpZykKKy8qIGNoZWNrIGZvciBjb25maWd1cmF0aW9uIGNoYW5nZXMgKi8KK2ludCBhdjcxMTBfY2hlY2tfaXJfY29uZmlnKHN0cnVjdCBhdjcxMTAgKmF2NzExMCwgaW50IGZvcmNlKQogewotCWludCByZXQgPSAwOworCWludCBpOworCWludCBtb2RpZmllZCA9IGZvcmNlOworCWludCByZXQgPSAtRU5PREVWOwogCi0JZHByaW50ayg0LCAiJXBcbiIsIGF2NzExMCk7Ci0JaWYgKGF2NzExMCkgewotCQlyZXQgPSBhdjcxMTBfZndfY21kKGF2NzExMCwgQ09NVFlQRV9QSURGSUxURVIsIFNldElSLCAxLCBpcl9jb25maWcpOwotCQlhdjcxMTAtPmlyX2NvbmZpZyA9IGlyX2NvbmZpZzsKKwlmb3IgKGkgPSAwOyBpIDwgYXZfY250OyBpKyspCisJCWlmIChhdjcxMTAgPT0gYXZfbGlzdFtpXSkKKwkJCWJyZWFrOworCisJaWYgKGkgPCBhdl9jbnQgJiYgYXY3MTEwKSB7CisJCWlmICgoYXY3MTEwLT5pci5wcm90b2NvbCAmIDEpICE9IGlyX3Byb3RvY29sW2ldIHx8CisJCSAgICBhdjcxMTAtPmlyLmludmVyc2lvbiAhPSBpcl9pbnZlcnNpb25baV0pCisJCQltb2RpZmllZCA9IHRydWU7CisKKwkJaWYgKG1vZGlmaWVkKSB7CisJCQkvKiBwcm90b2NvbCAqLworCQkJaWYgKGlyX3Byb3RvY29sW2ldKSB7CisJCQkJaXJfcHJvdG9jb2xbaV0gPSAxOworCQkJCWF2NzExMC0+aXIucHJvdG9jb2wgPSBJUl9SQ01NOworCQkJCWF2NzExMC0+aXIuaXJfY29uZmlnID0gMHgwMDAxOworCQkJfSBlbHNlIGlmIChGV19WRVJTSU9OKGF2NzExMC0+YXJtX2FwcCkgPj0gMHgyNjIwKSB7CisJCQkJYXY3MTEwLT5pci5wcm90b2NvbCA9IElSX1JDNV9FWFQ7CisJCQkJYXY3MTEwLT5pci5pcl9jb25maWcgPSAweDAwMDI7CisJCQl9IGVsc2UgeworCQkJCWF2NzExMC0+aXIucHJvdG9jb2wgPSBJUl9SQzU7CisJCQkJYXY3MTEwLT5pci5pcl9jb25maWcgPSAweDAwMDA7CisJCQl9CisJCQkvKiBpbnZlcnNpb24gKi8KKwkJCWlmIChpcl9pbnZlcnNpb25baV0pIHsKKwkJCQlpcl9pbnZlcnNpb25baV0gPSAxOworCQkJCWF2NzExMC0+aXIuaXJfY29uZmlnIHw9IDB4ODAwMDsKKwkJCX0KKwkJCWF2NzExMC0+aXIuaW52ZXJzaW9uID0gaXJfaW52ZXJzaW9uW2ldOworCQkJLyogdXBkYXRlIEFSTSAqLworCQkJcmV0ID0gYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfUElERklMVEVSLCBTZXRJUiwgMSwKKwkJCQkJCWF2NzExMC0+aXIuaXJfY29uZmlnKTsKKwkJfSBlbHNlCisJCQlyZXQgPSAwOworCisJCS8qIGFkZHJlc3MgKi8KKwkJaWYgKGF2NzExMC0+aXIuZGV2aWNlX21hc2sgIT0gaXJfZGV2aWNlX21hc2tbaV0pCisJCQlhdjcxMTAtPmlyLmRldmljZV9tYXNrID0gaXJfZGV2aWNlX21hc2tbaV07CiAJfQorCiAJcmV0dXJuIHJldDsKIH0KIAogCisvKiAvcHJvYy9hdjcxMTBfaXIgaW50ZXJmYWNlICovCiBzdGF0aWMgaW50IGF2NzExMF9pcl93cml0ZV9wcm9jKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAogCQkJCXVuc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEpCiB7CiAJY2hhciAqcGFnZTsKLQlpbnQgc2l6ZSA9IDQgKyAyNTYgKiBzaXplb2YodTE2KTsKIAl1MzIgaXJfY29uZmlnOworCWludCBzaXplID0gc2l6ZW9mIGlyX2NvbmZpZyArIHNpemVvZiBhdl9saXN0WzBdLT5pci5rZXlfbWFwOwogCWludCBpOwogCiAJaWYgKGNvdW50IDwgc2l6ZSkKQEAgLTE5NCw3MSArMjg5LDg2IEBACiAJCXJldHVybiAtRUZBVUxUOwogCX0KIAotCW1lbWNweSgmaXJfY29uZmlnLCBwYWdlLCA0KTsKLQltZW1jcHkoJmtleV9tYXAsIHBhZ2UgKyA0LCAyNTYgKiBzaXplb2YodTE2KSk7CisJbWVtY3B5KCZpcl9jb25maWcsIHBhZ2UsIHNpemVvZiBpcl9jb25maWcpOworCisJZm9yIChpID0gMDsgaSA8IGF2X2NudDsgaSsrKSB7CisJCS8qIGtleW1hcCAqLworCQltZW1jcHkoYXZfbGlzdFtpXS0+aXIua2V5X21hcCwgcGFnZSArIHNpemVvZiBpcl9jb25maWcsCisJCQlzaXplb2YoYXZfbGlzdFtpXS0+aXIua2V5X21hcCkpOworCQkvKiBwcm90b2NvbCwgaW52ZXJzaW9uLCBhZGRyZXNzICovCisJCWlyX3Byb3RvY29sW2ldID0gaXJfY29uZmlnICYgMHgwMDAxOworCQlpcl9pbnZlcnNpb25baV0gPSBpcl9jb25maWcgJiAweDgwMDAgPyAxIDogMDsKKwkJaWYgKGlyX2NvbmZpZyAmIDB4NDAwMCkKKwkJCWlyX2RldmljZV9tYXNrW2ldID0gMSA8PCAoKGlyX2NvbmZpZyA+PiAxNikgJiAweDFmKTsKKwkJZWxzZQorCQkJaXJfZGV2aWNlX21hc2tbaV0gPSBJUl9BTEw7CisJCS8qIHVwZGF0ZSBjb25maWd1cmF0aW9uICovCisJCWF2NzExMF9jaGVja19pcl9jb25maWcoYXZfbGlzdFtpXSwgZmFsc2UpOworCQlpbnB1dF9yZWdpc3Rlcl9rZXlzKCZhdl9saXN0W2ldLT5pcik7CisJfQogCXZmcmVlKHBhZ2UpOwotCWlmIChGV19WRVJTSU9OKGF2X2xpc3RbMF0tPmFybV9hcHApID49IDB4MjYyMCAmJiAhKGlyX2NvbmZpZyAmIDB4MDAwMSkpCi0JCWlyX2NvbmZpZyB8PSAweDAwMDI7IC8qIGVuYWJsZSBleHRlbmRlZCBSQzUgKi8KLQlmb3IgKGkgPSAwOyBpIDwgYXZfY250OyBpKyspCi0JCWF2NzExMF9zZXR1cF9pcmNfY29uZmlnKGF2X2xpc3RbaV0sIGlyX2NvbmZpZyk7Ci0JaW5wdXRfcmVnaXN0ZXJfa2V5cygpOwogCXJldHVybiBjb3VudDsKIH0KIAogCisvKiBpbnRlcnJ1cHQgaGFuZGxlciAqLwogc3RhdGljIHZvaWQgaXJfaGFuZGxlcihzdHJ1Y3QgYXY3MTEwICphdjcxMTAsIHUzMiBpcmNvbSkKIHsKLQlkcHJpbnRrKDQsICJpcmNvbW1hbmQgPSAlMDh4XG4iLCBpcmNvbSk7Ci0JYXY3MTEwLT5pcl9jb21tYW5kID0gaXJjb207Ci0JdGFza2xldF9zY2hlZHVsZSgmYXY3MTEwLT5pcl90YXNrbGV0KTsKKwlkcHJpbnRrKDQsICJpciBjb21tYW5kID0gJTA4eFxuIiwgaXJjb20pOworCWF2NzExMC0+aXIuaXJfY29tbWFuZCA9IGlyY29tOworCXRhc2tsZXRfc2NoZWR1bGUoJmF2NzExMC0+aXIuaXJfdGFza2xldCk7CiB9CiAKIAogaW50IF9fZGV2aW5pdCBhdjcxMTBfaXJfaW5pdChzdHJ1Y3QgYXY3MTEwICphdjcxMTApCiB7CisJc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2OwogCXN0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmU7CiAJaW50IGVycjsKIAogCWlmIChhdl9jbnQgPj0gQVJSQVlfU0laRShhdl9saXN0KSkKIAkJcmV0dXJuIC1FTk9TUEM7CiAKLQlhdjcxMTBfc2V0dXBfaXJjX2NvbmZpZyhhdjcxMTAsIDB4MDAwMSk7CiAJYXZfbGlzdFthdl9jbnQrK10gPSBhdjcxMTA7CisJYXY3MTEwX2NoZWNrX2lyX2NvbmZpZyhhdjcxMTAsIHRydWUpOworCisJaW5pdF90aW1lcigmYXY3MTEwLT5pci5rZXl1cF90aW1lcik7CisJYXY3MTEwLT5pci5rZXl1cF90aW1lci5mdW5jdGlvbiA9IGF2NzExMF9lbWl0X2tleXVwOworCWF2NzExMC0+aXIua2V5dXBfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSAmYXY3MTEwLT5pcjsKKworCWlucHV0X2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOworCWlmICghaW5wdXRfZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWF2NzExMC0+aXIuaW5wdXRfZGV2ID0gaW5wdXRfZGV2OworCXNucHJpbnRmKGF2NzExMC0+aXIuaW5wdXRfcGh5cywgc2l6ZW9mKGF2NzExMC0+aXIuaW5wdXRfcGh5cyksCisJCSJwY2ktJXMvaXIwIiwgcGNpX25hbWUoYXY3MTEwLT5kZXYtPnBjaSkpOworCisJaW5wdXRfZGV2LT5uYW1lID0gIkRWQiBvbi1jYXJkIElSIHJlY2VpdmVyIjsKKworCWlucHV0X2Rldi0+cGh5cyA9IGF2NzExMC0+aXIuaW5wdXRfcGh5czsKKwlpbnB1dF9kZXYtPmlkLmJ1c3R5cGUgPSBCVVNfUENJOworCWlucHV0X2Rldi0+aWQudmVyc2lvbiA9IDI7CisJaWYgKGF2NzExMC0+ZGV2LT5wY2ktPnN1YnN5c3RlbV92ZW5kb3IpIHsKKwkJaW5wdXRfZGV2LT5pZC52ZW5kb3IgPSBhdjcxMTAtPmRldi0+cGNpLT5zdWJzeXN0ZW1fdmVuZG9yOworCQlpbnB1dF9kZXYtPmlkLnByb2R1Y3QgPSBhdjcxMTAtPmRldi0+cGNpLT5zdWJzeXN0ZW1fZGV2aWNlOworCX0gZWxzZSB7CisJCWlucHV0X2Rldi0+aWQudmVuZG9yID0gYXY3MTEwLT5kZXYtPnBjaS0+dmVuZG9yOworCQlpbnB1dF9kZXYtPmlkLnByb2R1Y3QgPSBhdjcxMTAtPmRldi0+cGNpLT5kZXZpY2U7CisJfQorCWlucHV0X2Rldi0+Y2Rldi5kZXYgPSAmYXY3MTEwLT5kZXYtPnBjaS0+ZGV2OworCS8qIGluaXRpYWwga2V5bWFwICovCisJbWVtY3B5KGF2NzExMC0+aXIua2V5X21hcCwgZGVmYXVsdF9rZXlfbWFwLCBzaXplb2YgYXY3MTEwLT5pci5rZXlfbWFwKTsKKwlpbnB1dF9yZWdpc3Rlcl9rZXlzKCZhdjcxMTAtPmlyKTsKKwllcnIgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoaW5wdXRfZGV2KTsKKwlpZiAoZXJyKSB7CisJCWlucHV0X2ZyZWVfZGV2aWNlKGlucHV0X2Rldik7CisJCXJldHVybiBlcnI7CisJfQorCWlucHV0X2Rldi0+dGltZXIuZnVuY3Rpb24gPSBpbnB1dF9yZXBlYXRfa2V5OworCWlucHV0X2Rldi0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSAmYXY3MTEwLT5pcjsKIAogCWlmIChhdl9jbnQgPT0gMSkgewotCQlpbml0X3RpbWVyKCZrZXl1cF90aW1lcik7Ci0JCWtleXVwX3RpbWVyLmRhdGEgPSAwOwotCi0JCWlucHV0X2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOwotCQlpZiAoIWlucHV0X2RldikKLQkJCXJldHVybiAtRU5PTUVNOwotCi0JCXNucHJpbnRmKGlucHV0X3BoeXMsIHNpemVvZihpbnB1dF9waHlzKSwKLQkJCSJwY2ktJXMvaXIwIiwgcGNpX25hbWUoYXY3MTEwLT5kZXYtPnBjaSkpOwotCi0JCWlucHV0X2Rldi0+bmFtZSA9ICJEVkIgb24tY2FyZCBJUiByZWNlaXZlciI7Ci0KLQkJaW5wdXRfZGV2LT5waHlzID0gaW5wdXRfcGh5czsKLQkJaW5wdXRfZGV2LT5pZC5idXN0eXBlID0gQlVTX1BDSTsKLQkJaW5wdXRfZGV2LT5pZC52ZXJzaW9uID0gMTsKLQkJaWYgKGF2NzExMC0+ZGV2LT5wY2ktPnN1YnN5c3RlbV92ZW5kb3IpIHsKLQkJCWlucHV0X2Rldi0+aWQudmVuZG9yID0gYXY3MTEwLT5kZXYtPnBjaS0+c3Vic3lzdGVtX3ZlbmRvcjsKLQkJCWlucHV0X2Rldi0+aWQucHJvZHVjdCA9IGF2NzExMC0+ZGV2LT5wY2ktPnN1YnN5c3RlbV9kZXZpY2U7Ci0JCX0gZWxzZSB7Ci0JCQlpbnB1dF9kZXYtPmlkLnZlbmRvciA9IGF2NzExMC0+ZGV2LT5wY2ktPnZlbmRvcjsKLQkJCWlucHV0X2Rldi0+aWQucHJvZHVjdCA9IGF2NzExMC0+ZGV2LT5wY2ktPmRldmljZTsKLQkJfQotCQlpbnB1dF9kZXYtPmNkZXYuZGV2ID0gJmF2NzExMC0+ZGV2LT5wY2ktPmRldjsKLQkJc2V0X2JpdChFVl9LRVksIGlucHV0X2Rldi0+ZXZiaXQpOwotCQlzZXRfYml0KEVWX1JFUCwgaW5wdXRfZGV2LT5ldmJpdCk7Ci0JCWlucHV0X3JlZ2lzdGVyX2tleXMoKTsKLQkJZXJyID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGlucHV0X2Rldik7Ci0JCWlmIChlcnIpIHsKLQkJCWlucHV0X2ZyZWVfZGV2aWNlKGlucHV0X2Rldik7Ci0JCQlyZXR1cm4gZXJyOwotCQl9Ci0JCWlucHV0X2Rldi0+dGltZXIuZnVuY3Rpb24gPSBpbnB1dF9yZXBlYXRfa2V5OwotCiAJCWUgPSBjcmVhdGVfcHJvY19lbnRyeSgiYXY3MTEwX2lyIiwgU19JRlJFRyB8IFNfSVJVR08gfCBTX0lXVVNSLCBOVUxMKTsKIAkJaWYgKGUpIHsKIAkJCWUtPndyaXRlX3Byb2MgPSBhdjcxMTBfaXJfd3JpdGVfcHJvYzsKQEAgLTI2Niw4ICszNzYsOCBAQAogCQl9CiAJfQogCi0JdGFza2xldF9pbml0KCZhdjcxMTAtPmlyX3Rhc2tsZXQsIGF2NzExMF9lbWl0X2tleSwgKHVuc2lnbmVkIGxvbmcpIGF2NzExMCk7Ci0JYXY3MTEwLT5pcl9oYW5kbGVyID0gaXJfaGFuZGxlcjsKKwl0YXNrbGV0X2luaXQoJmF2NzExMC0+aXIuaXJfdGFza2xldCwgYXY3MTEwX2VtaXRfa2V5LCAodW5zaWduZWQgbG9uZykgJmF2NzExMC0+aXIpOworCWF2NzExMC0+aXIuaXJfaGFuZGxlciA9IGlyX2hhbmRsZXI7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTI4MCw4ICszOTAsMTAgQEAKIAlpZiAoYXZfY250ID09IDApCiAJCXJldHVybjsKIAotCWF2NzExMC0+aXJfaGFuZGxlciA9IE5VTEw7Ci0JdGFza2xldF9raWxsKCZhdjcxMTAtPmlyX3Rhc2tsZXQpOworCWRlbF90aW1lcl9zeW5jKCZhdjcxMTAtPmlyLmtleXVwX3RpbWVyKTsKKwlhdjcxMTAtPmlyLmlyX2hhbmRsZXIgPSBOVUxMOworCXRhc2tsZXRfa2lsbCgmYXY3MTEwLT5pci5pcl90YXNrbGV0KTsKKwogCWZvciAoaSA9IDA7IGkgPCBhdl9jbnQ7IGkrKykKIAkJaWYgKGF2X2xpc3RbaV0gPT0gYXY3MTEwKSB7CiAJCQlhdl9saXN0W2ldID0gYXZfbGlzdFthdl9jbnQtMV07CkBAIC0yODksMTQgKzQwMSwxMyBAQAogCQkJYnJlYWs7CiAJCX0KIAotCWlmIChhdl9jbnQgPT0gMSkgewotCQlkZWxfdGltZXJfc3luYygma2V5dXBfdGltZXIpOworCWlmIChhdl9jbnQgPT0gMSkKIAkJcmVtb3ZlX3Byb2NfZW50cnkoImF2NzExMF9pciIsIE5VTEwpOwotCQlpbnB1dF91bnJlZ2lzdGVyX2RldmljZShpbnB1dF9kZXYpOwotCX0KKworCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKGF2NzExMC0+aXIuaW5wdXRfZGV2KTsKIAogCWF2X2NudC0tOwogfQogCi0vL01PRFVMRV9BVVRIT1IoIkhvbGdlciBXYWVjaHRsZXIgPGhvbGdlckBjb252ZXJnZW5jZS5kZT4iKTsKKy8vTU9EVUxFX0FVVEhPUigiSG9sZ2VyIFdhZWNodGxlciA8aG9sZ2VyQGNvbnZlcmdlbmNlLmRlPiwgT2xpdmVyIEVuZHJpc3MgPG8uZW5kcmlzc0BnbXguZGU+Iik7CiAvL01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC1hdi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LWF2LmMKaW5kZXggMzAzNWIyMi4uMGU4MTdkNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LWF2LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LWF2LmMKQEAgLTM1LDcgKzM1LDcgQEAKIAogI2luY2x1ZGUgImJ1ZGdldC5oIgogI2luY2x1ZGUgInN0djAyOTkuaCIKLSNpbmNsdWRlICJ0ZGExMDAyMS5oIgorI2luY2x1ZGUgInRkYTEwMDJ4LmgiCiAjaW5jbHVkZSAidGRhMTAwNHguaCIKICNpbmNsdWRlICJ0dWE2MTAwLmgiCiAjaW5jbHVkZSAiZHZiLXBsbC5oIgpAQCAtNjYsOSArNjYsNiBAQAogCWludCBzbG90X3N0YXR1czsKIAlzdHJ1Y3QgZHZiX2NhX2VuNTAyMjEgY2E7CiAJdTggcmVpbml0aWFsaXNlX2RlbW9kOjE7Ci0JdTggdGRhMTAwMjFfcG9jbGtwOjE7Ci0JdTggdGRhMTAwMjFfdHNfZW5hYmxlZDsKLQlpbnQgKCp0ZGExMDAyMV9zZXRfZnJvbnRlbmQpKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnApOwogfTsKIAogc3RhdGljIGludCBjaWludGZfc2xvdF9zaHV0ZG93bihzdHJ1Y3QgZHZiX2NhX2VuNTAyMjEgKmNhLCBpbnQgc2xvdCk7CkBAIC0yMzQsMTIgKzIzMSw2IEBACiAJaWYgKGJ1ZGdldF9hdi0+cmVpbml0aWFsaXNlX2RlbW9kKQogCQlkdmJfZnJvbnRlbmRfcmVpbml0aWFsaXNlKGJ1ZGdldF9hdi0+YnVkZ2V0LmR2Yl9mcm9udGVuZCk7CiAKLQkvKiBzZXQgdGRhMTAwMjEgYmFjayB0byBvcmlnaW5hbCBjbG9jayBjb25maWd1cmF0aW9uIG9uIHJlc2V0ICovCi0JaWYgKGJ1ZGdldF9hdi0+dGRhMTAwMjFfcG9jbGtwKSB7Ci0JCXRkYTEwMDIxX3dyaXRlcmVnKGJ1ZGdldF9hdi0+YnVkZ2V0LmR2Yl9mcm9udGVuZCwgMHgxMiwgMHhhMCk7Ci0JCWJ1ZGdldF9hdi0+dGRhMTAwMjFfdHNfZW5hYmxlZCA9IDA7Ci0JfQotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI1NiwxMSArMjQ3LDYgQEAKIAl0dHBjaV9idWRnZXRfc2V0X3ZpZGVvX3BvcnQoc2FhLCBCVURHRVRfVklERU9fUE9SVEIpOwogCWJ1ZGdldF9hdi0+c2xvdF9zdGF0dXMgPSBTTE9UU1RBVFVTX05PTkU7CiAKLQkvKiBzZXQgdGRhMTAwMjEgYmFjayB0byBvcmlnaW5hbCBjbG9jayBjb25maWd1cmF0aW9uIHdoZW4gY2FtIHJlbW92ZWQgKi8KLQlpZiAoYnVkZ2V0X2F2LT50ZGExMDAyMV9wb2Nsa3ApIHsKLQkJdGRhMTAwMjFfd3JpdGVyZWcoYnVkZ2V0X2F2LT5idWRnZXQuZHZiX2Zyb250ZW5kLCAweDEyLCAweGEwKTsKLQkJYnVkZ2V0X2F2LT50ZGExMDAyMV90c19lbmFibGVkID0gMDsKLQl9CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI3NiwxMiArMjYyLDYgQEAKIAogCXR0cGNpX2J1ZGdldF9zZXRfdmlkZW9fcG9ydChzYWEsIEJVREdFVF9WSURFT19QT1JUQSk7CiAKLQkvKiB0ZGExMDAyMSBzZWVtcyB0byBuZWVkIGEgZGlmZmVyZW50IFRTIGNsb2NrIGNvbmZpZyB3aGVuIGRhdGEgaXMgcm91dGVkIHRvIHRoZSBDQU0gKi8KLQlpZiAoYnVkZ2V0X2F2LT50ZGExMDAyMV9wb2Nsa3ApIHsKLQkJdGRhMTAwMjFfd3JpdGVyZWcoYnVkZ2V0X2F2LT5idWRnZXQuZHZiX2Zyb250ZW5kLCAweDEyLCAweGExKTsKLQkJYnVkZ2V0X2F2LT50ZGExMDAyMV90c19lbmFibGVkID0gMTsKLQl9Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtNjMxLDM3ICs2MTEsNjIgQEAKIHN0YXRpYyBpbnQgcGhpbGlwc19jdTEyMTZfdHVuZXJfc2V0X3BhcmFtcyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXMpCiB7CiAJc3RydWN0IGJ1ZGdldCAqYnVkZ2V0ID0gKHN0cnVjdCBidWRnZXQgKikgZmUtPmR2Yi0+cHJpdjsKLQl1OCBidWZbNF07CisJdTggYnVmWzZdOwogCXN0cnVjdCBpMmNfbXNnIG1zZyA9IHsuYWRkciA9IDB4NjAsLmZsYWdzID0gMCwuYnVmID0gYnVmLC5sZW4gPSBzaXplb2YoYnVmKSB9OworCWludCBpOwogCisjZGVmaW5lIENVMTIxNl9JRiAzNjEyNTAwMAogI2RlZmluZSBUVU5FUl9NVUwgNjI1MDAKIAotCXUzMiBkaXYgPSAocGFyYW1zLT5mcmVxdWVuY3kgKyAzNjEyNTAwMCArIFRVTkVSX01VTCAvIDIpIC8gVFVORVJfTVVMOworCXUzMiBkaXYgPSAocGFyYW1zLT5mcmVxdWVuY3kgKyBDVTEyMTZfSUYgKyBUVU5FUl9NVUwgLyAyKSAvIFRVTkVSX01VTDsKIAogCWJ1ZlswXSA9IChkaXYgPj4gOCkgJiAweDdmOwogCWJ1ZlsxXSA9IGRpdiAmIDB4ZmY7Ci0JYnVmWzJdID0gMHg4NjsKKwlidWZbMl0gPSAweGNlOwogCWJ1ZlszXSA9IChwYXJhbXMtPmZyZXF1ZW5jeSA8IDE1MDAwMDAwMCA/IDB4MDEgOgogCQkgIHBhcmFtcy0+ZnJlcXVlbmN5IDwgNDQ1MDAwMDAwID8gMHgwMiA6IDB4MDQpOworCWJ1Zls0XSA9IDB4ZGU7CisJYnVmWzVdID0gMHgyMDsKIAogCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCiAJCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMSk7CiAJaWYgKGkyY190cmFuc2ZlcigmYnVkZ2V0LT5pMmNfYWRhcCwgJm1zZywgMSkgIT0gMSkKIAkJcmV0dXJuIC1FSU87CisKKwkvKiB3YWl0IGZvciB0aGUgcGxsIGxvY2sgKi8KKwltc2cuZmxhZ3MgPSBJMkNfTV9SRDsKKwltc2cubGVuID0gMTsKKwlmb3IgKGkgPSAwOyBpIDwgMjA7IGkrKykgeworCQlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKKwkJaWYgKGkyY190cmFuc2ZlcigmYnVkZ2V0LT5pMmNfYWRhcCwgJm1zZywgMSkgPT0gMSAmJiAoYnVmWzBdICYgMHg0MCkpCisJCQlicmVhazsKKwkJbXNsZWVwKDEwKTsKKwl9CisKKwkvKiBzd2l0Y2ggdGhlIGNoYXJnZSBwdW1wIHRvIHRoZSBsb3dlciBjdXJyZW50ICovCisJbXNnLmZsYWdzID0gMDsKKwltc2cubGVuID0gMjsKKwltc2cuYnVmID0gJmJ1ZlsyXTsKKwlidWZbMl0gJj0gfjB4NDA7CisJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKKwlpZiAoaTJjX3RyYW5zZmVyKCZidWRnZXQtPmkyY19hZGFwLCAmbXNnLCAxKSAhPSAxKQorCQlyZXR1cm4gLUVJTzsKKwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHRkYTEwMDIxX2NvbmZpZyBwaGlsaXBzX2N1MTIxNl9jb25maWcgPSB7CitzdGF0aWMgc3RydWN0IHRkYTEwMDJ4X2NvbmZpZyBwaGlsaXBzX2N1MTIxNl9jb25maWcgPSB7CiAJLmRlbW9kX2FkZHJlc3MgPSAweDBjLAorCS5pbnZlcnQgPSAxLAogfTsKIAotc3RhdGljIHN0cnVjdCB0ZGExMDAyMV9jb25maWcgcGhpbGlwc19jdTEyMTZfY29uZmlnX2FsdGFkZHJlc3MgPSB7CitzdGF0aWMgc3RydWN0IHRkYTEwMDJ4X2NvbmZpZyBwaGlsaXBzX2N1MTIxNl9jb25maWdfYWx0YWRkcmVzcyA9IHsKIAkuZGVtb2RfYWRkcmVzcyA9IDB4MGQsCisJLmludmVydCA9IDAsCiB9OwogCi0KLQotCiBzdGF0aWMgaW50IHBoaWxpcHNfdHUxMjE2X3R1bmVyX2luaXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCiB7CiAJc3RydWN0IGJ1ZGdldCAqYnVkZ2V0ID0gKHN0cnVjdCBidWRnZXQgKikgZmUtPmR2Yi0+cHJpdjsKQEAgLTkwOCw0MSArOTEzLDI4IEBACiAJcmV0dXJuIHB3bTsKIH0KIAotI2RlZmluZSBTVUJJRF9EVkJTX0tOQzEJCTB4MDAxMAotI2RlZmluZSBTVUJJRF9EVkJTX0tOQzFfUExVUwkweDAwMTEKLSNkZWZpbmUgU1VCSURfRFZCU19UWVBIT09OCTB4NGY1NgotI2RlZmluZSBTVUJJRF9EVkJTX0NJTkVSR1kxMjAwCTB4MTE1NAotI2RlZmluZSBTVUJJRF9EVkJTX0NZTkVSR1kxMjAwTiAweDExNTUKKyNkZWZpbmUgU1VCSURfRFZCU19LTkMxCQkJMHgwMDEwCisjZGVmaW5lIFNVQklEX0RWQlNfS05DMV9QTFVTCQkweDAwMTEKKyNkZWZpbmUgU1VCSURfRFZCU19UWVBIT09OCQkweDRmNTYKKyNkZWZpbmUgU1VCSURfRFZCU19DSU5FUkdZMTIwMAkJMHgxMTU0CisjZGVmaW5lIFNVQklEX0RWQlNfQ1lORVJHWTEyMDBOIAkweDExNTUKKyNkZWZpbmUgU1VCSURfRFZCU19UVl9TVEFSCQkweDAwMTQKKyNkZWZpbmUgU1VCSURfRFZCU19UVl9TVEFSX0NJCQkweDAwMTYKKyNkZWZpbmUgU1VCSURfRFZCU19FQVNZV0FUQ0hfMSAgCTB4MDAxYQorI2RlZmluZSBTVUJJRF9EVkJTX0VBU1lXQVRDSAkJMHgwMDFlCiAKLSNkZWZpbmUgU1VCSURfRFZCU19UVl9TVEFSCTB4MDAxNAotI2RlZmluZSBTVUJJRF9EVkJTX1RWX1NUQVJfQ0kJMHgwMDE2Ci0jZGVmaW5lIFNVQklEX0RWQlNfRUFTWVdBVENIXzEgIDB4MDAxYQotI2RlZmluZSBTVUJJRF9EVkJTX0VBU1lXQVRDSAkweDAwMWUKLSNkZWZpbmUgU1VCSURfRFZCQ19FQVNZV0FUQ0gJMHgwMDJhCi0jZGVmaW5lIFNVQklEX0RWQkNfS05DMQkJMHgwMDIwCi0jZGVmaW5lIFNVQklEX0RWQkNfS05DMV9QTFVTCTB4MDAyMQotI2RlZmluZSBTVUJJRF9EVkJDX0NJTkVSR1kxMjAwCTB4MTE1NgorI2RlZmluZSBTVUJJRF9EVkJDX0VBU1lXQVRDSAkJMHgwMDJhCisjZGVmaW5lIFNVQklEX0RWQkNfRUFTWVdBVENIX01LMwkweDAwMmMKKyNkZWZpbmUgU1VCSURfRFZCQ19LTkMxCQkJMHgwMDIwCisjZGVmaW5lIFNVQklEX0RWQkNfS05DMV9QTFVTCQkweDAwMjEKKyNkZWZpbmUgU1VCSURfRFZCQ19LTkMxX01LMwkJMHgwMDIyCisjZGVmaW5lIFNVQklEX0RWQkNfS05DMV9QTFVTX01LMwkweDAwMjMKKyNkZWZpbmUgU1VCSURfRFZCQ19DSU5FUkdZMTIwMAkJMHgxMTU2CisjZGVmaW5lIFNVQklEX0RWQkNfQ0lORVJHWTEyMDBfTUszCTB4MTE3NgogCi0jZGVmaW5lIFNVQklEX0RWQlRfS05DMV9QTFVTCTB4MDAzMQotI2RlZmluZSBTVUJJRF9EVkJUX0tOQzEJCTB4MDAzMAotI2RlZmluZSBTVUJJRF9EVkJUX0NJTkVSR1kxMjAwCTB4MTE1NwotCi0KLXN0YXRpYyBpbnQgdGRhMTAwMjFfc2V0X2Zyb250ZW5kKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAotCQkJCSBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnApCi17Ci0Jc3RydWN0IGJ1ZGdldF9hdiogYnVkZ2V0X2F2ID0gZmUtPmR2Yi0+cHJpdjsKLQlpbnQgcmVzdWx0OwotCi0JcmVzdWx0ID0gYnVkZ2V0X2F2LT50ZGExMDAyMV9zZXRfZnJvbnRlbmQoZmUsIHApOwotCWlmIChidWRnZXRfYXYtPnRkYTEwMDIxX3RzX2VuYWJsZWQpIHsKLQkJdGRhMTAwMjFfd3JpdGVyZWcoYnVkZ2V0X2F2LT5idWRnZXQuZHZiX2Zyb250ZW5kLCAweDEyLCAweGExKTsKLQl9IGVsc2UgewotCQl0ZGExMDAyMV93cml0ZXJlZyhidWRnZXRfYXYtPmJ1ZGdldC5kdmJfZnJvbnRlbmQsIDB4MTIsIDB4YTApOwotCX0KLQotCXJldHVybiByZXN1bHQ7Ci19CisjZGVmaW5lIFNVQklEX0RWQlRfS05DMV9QTFVTCQkweDAwMzEKKyNkZWZpbmUgU1VCSURfRFZCVF9LTkMxCQkJMHgwMDMwCisjZGVmaW5lIFNVQklEX0RWQlRfQ0lORVJHWTEyMDAJCTB4MTE1NwogCiBzdGF0aWMgdm9pZCBmcm9udGVuZF9pbml0KHN0cnVjdCBidWRnZXRfYXYgKmJ1ZGdldF9hdikKIHsKQEAgLTk2MSw2ICs5NTMsNyBAQAogCQljYXNlIFNVQklEX0RWQkNfS05DMV9QTFVTOgogCQljYXNlIFNVQklEX0RWQlRfS05DMV9QTFVTOgogCQljYXNlIFNVQklEX0RWQkNfRUFTWVdBVENIOgorCQljYXNlIFNVQklEX0RWQkNfS05DMV9QTFVTX01LMzoKIAkJCXNhYTcxNDZfc2V0Z3BpbyhzYWEsIDMsIFNBQTcxNDZfR1BJT19PVVRISSk7CiAJCQlicmVhazsKIAl9CkBAIC0xMDE3LDYgKzEwMTAsNyBAQAogCWNhc2UgU1VCSURfRFZCQ19DSU5FUkdZMTIwMDoKIAljYXNlIFNVQklEX0RWQkNfRUFTWVdBVENIOgogCQlidWRnZXRfYXYtPnJlaW5pdGlhbGlzZV9kZW1vZCA9IDE7CisJCWJ1ZGdldF9hdi0+YnVkZ2V0LmRldi0+aTJjX2JpdHJhdGUgPSBTQUE3MTQ2X0kyQ19CVVNfQklUX1JBVEVfMjQwOwogCQlmZSA9IGR2Yl9hdHRhY2godGRhMTAwMjFfYXR0YWNoLCAmcGhpbGlwc19jdTEyMTZfY29uZmlnLAogCQkJCSAgICAgJmJ1ZGdldF9hdi0+YnVkZ2V0LmkyY19hZGFwLAogCQkJCSAgICAgcmVhZF9wd20oYnVkZ2V0X2F2KSk7CkBAIC0xMDI1LDkgKzEwMTksMjAgQEAKIAkJCQkJICAgICAmYnVkZ2V0X2F2LT5idWRnZXQuaTJjX2FkYXAsCiAJCQkJCSAgICAgcmVhZF9wd20oYnVkZ2V0X2F2KSk7CiAJCWlmIChmZSkgewotCQkJYnVkZ2V0X2F2LT50ZGExMDAyMV9wb2Nsa3AgPSAxOwotCQkJYnVkZ2V0X2F2LT50ZGExMDAyMV9zZXRfZnJvbnRlbmQgPSBmZS0+b3BzLnNldF9mcm9udGVuZDsKLQkJCWZlLT5vcHMuc2V0X2Zyb250ZW5kID0gdGRhMTAwMjFfc2V0X2Zyb250ZW5kOworCQkJZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyA9IHBoaWxpcHNfY3UxMjE2X3R1bmVyX3NldF9wYXJhbXM7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFNVQklEX0RWQkNfRUFTWVdBVENIX01LMzoKKwljYXNlIFNVQklEX0RWQkNfQ0lORVJHWTEyMDBfTUszOgorCWNhc2UgU1VCSURfRFZCQ19LTkMxX01LMzoKKwljYXNlIFNVQklEX0RWQkNfS05DMV9QTFVTX01LMzoKKwkJYnVkZ2V0X2F2LT5yZWluaXRpYWxpc2VfZGVtb2QgPSAxOworCQlidWRnZXRfYXYtPmJ1ZGdldC5kZXYtPmkyY19iaXRyYXRlID0gU0FBNzE0Nl9JMkNfQlVTX0JJVF9SQVRFXzI0MDsKKwkJZmUgPSBkdmJfYXR0YWNoKHRkYTEwMDIzX2F0dGFjaCwgJnBoaWxpcHNfY3UxMjE2X2NvbmZpZywKKwkJCQkgICAgICZidWRnZXRfYXYtPmJ1ZGdldC5pMmNfYWRhcCwKKwkJCQkgICAgIHJlYWRfcHdtKGJ1ZGdldF9hdikpOworCQlpZiAoZmUpIHsKIAkJCWZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBwaGlsaXBzX2N1MTIxNl90dW5lcl9zZXRfcGFyYW1zOwogCQl9CiAJCWJyZWFrOwpAQCAtMTI2MCwxMiArMTI2NSwxNiBAQAogTUFLRV9CVURHRVRfSU5GTyhzYXRld3BscywgIlNhdGVsY28gRWFzeVdhdGNoIERWQi1TIGxpZ2h0IiwgQlVER0VUX1RWU1RBUik7CiBNQUtFX0JVREdFVF9JTkZPKHNhdGV3cGxzMSwgIlNhdGVsY28gRWFzeVdhdGNoIERWQi1TIGxpZ2h0IiwgQlVER0VUX0tOQzFTKTsKIE1BS0VfQlVER0VUX0lORk8oc2F0ZXdwbGMsICJTYXRlbGNvIEVhc3lXYXRjaCBEVkItQyIsIEJVREdFVF9LTkMxQ1ApOworTUFLRV9CVURHRVRfSU5GTyhzYXRld2NtazMsICJTYXRlbGNvIEVhc3lXYXRjaCBEVkItQyBNSzMiLCBCVURHRVRfS05DMUNfTUszKTsKIE1BS0VfQlVER0VUX0lORk8oa25jMXNwLCAiS05DMSBEVkItUyBQbHVzIiwgQlVER0VUX0tOQzFTUCk7CiBNQUtFX0JVREdFVF9JTkZPKGtuYzFjcCwgIktOQzEgRFZCLUMgUGx1cyIsIEJVREdFVF9LTkMxQ1ApOworTUFLRV9CVURHRVRfSU5GTyhrbmMxY21rMywgIktOQzEgRFZCLUMgTUszIiwgQlVER0VUX0tOQzFDX01LMyk7CitNQUtFX0JVREdFVF9JTkZPKGtuYzFjcG1rMywgIktOQzEgRFZCLUMgUGx1cyBNSzMiLCBCVURHRVRfS05DMUNQX01LMyk7CiBNQUtFX0JVREdFVF9JTkZPKGtuYzF0cCwgIktOQzEgRFZCLVQgUGx1cyIsIEJVREdFVF9LTkMxVFApOwogTUFLRV9CVURHRVRfSU5GTyhjaW4xMjAwcywgIlRlcnJhVGVjIENpbmVyZ3kgMTIwMCBEVkItUyIsIEJVREdFVF9DSU4xMjAwUyk7CiBNQUtFX0JVREdFVF9JTkZPKGNpbjEyMDBzbiwgIlRlcnJhVGVjIENpbmVyZ3kgMTIwMCBEVkItUyIsIEJVREdFVF9DSU4xMjAwUyk7CiBNQUtFX0JVREdFVF9JTkZPKGNpbjEyMDBjLCAiVGVycmF0ZWMgQ2luZXJneSAxMjAwIERWQi1DIiwgQlVER0VUX0NJTjEyMDBDKTsKK01BS0VfQlVER0VUX0lORk8oY2luMTIwMGNtazMsICJUZXJyYXRlYyBDaW5lcmd5IDEyMDAgRFZCLUMgTUszIiwgQlVER0VUX0NJTjEyMDBDX01LMyk7CiBNQUtFX0JVREdFVF9JTkZPKGNpbjEyMDB0LCAiVGVycmF0ZWMgQ2luZXJneSAxMjAwIERWQi1UIiwgQlVER0VUX0NJTjEyMDBUKTsKIAogc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHBjaV90YmxbXSA9IHsKQEAgLTEyNzksMTMgKzEyODgsMTcgQEAKIAlNQUtFX0VYVEVOU0lPTl9QQ0koc2F0ZXdwbHMsIDB4MTg5NCwgMHgwMDFlKSwKIAlNQUtFX0VYVEVOU0lPTl9QQ0koc2F0ZXdwbHMxLCAweDE4OTQsIDB4MDAxYSksCiAJTUFLRV9FWFRFTlNJT05fUENJKHNhdGV3cGxjLCAweDE4OTQsIDB4MDAyYSksCisJTUFLRV9FWFRFTlNJT05fUENJKHNhdGV3Y21rMywgMHgxODk0LCAweDAwMmMpLAogCU1BS0VfRVhURU5TSU9OX1BDSShrbmMxYywgMHgxODk0LCAweDAwMjApLAogCU1BS0VfRVhURU5TSU9OX1BDSShrbmMxY3AsIDB4MTg5NCwgMHgwMDIxKSwKKwlNQUtFX0VYVEVOU0lPTl9QQ0koa25jMWNtazMsIDB4MTg5NCwgMHgwMDIyKSwKKwlNQUtFX0VYVEVOU0lPTl9QQ0koa25jMWNwbWszLCAweDE4OTQsIDB4MDAyMyksCiAJTUFLRV9FWFRFTlNJT05fUENJKGtuYzF0LCAweDE4OTQsIDB4MDAzMCksCiAJTUFLRV9FWFRFTlNJT05fUENJKGtuYzF0cCwgMHgxODk0LCAweDAwMzEpLAogCU1BS0VfRVhURU5TSU9OX1BDSShjaW4xMjAwcywgMHgxNTNiLCAweDExNTQpLAogCU1BS0VfRVhURU5TSU9OX1BDSShjaW4xMjAwc24sIDB4MTUzYiwgMHgxMTU1KSwKIAlNQUtFX0VYVEVOU0lPTl9QQ0koY2luMTIwMGMsIDB4MTUzYiwgMHgxMTU2KSwKKwlNQUtFX0VYVEVOU0lPTl9QQ0koY2luMTIwMGNtazMsIDB4MTUzYiwgMHgxMTc2KSwKIAlNQUtFX0VYVEVOU0lPTl9QQ0koY2luMTIwMHQsIDB4MTUzYiwgMHgxMTU3KSwKIAl7CiAJIC52ZW5kb3IgPSAwLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LWNpLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQtY2kuYwppbmRleCA0NjRmZWFmLi40ZWQ0NTk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQtY2kuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQtY2kuYwpAQCAtNzMsMjEgKzczLDE1IEBACiAjZGVmaW5lIFNMT1RTVEFUVVNfUkVBRFkJOAogI2RlZmluZSBTTE9UU1RBVFVTX09DQ1VQSUVECShTTE9UU1RBVFVTX1BSRVNFTlR8U0xPVFNUQVRVU19SRVNFVHxTTE9UU1RBVFVTX1JFQURZKQogCi0vKiBNaWxsaXNlY29uZHMgZHVyaW5nIHdoaWNoIGtleSBwcmVzc2VzIGFyZSByZWdhcmRlZCBhcyBrZXkgcmVwZWF0IGFuZCBkdXJpbmcKLSAqIHdoaWNoIHRoZSBkZWJvdW5jZSBsb2dpYyBpcyBhY3RpdmUKKy8qCisgKiBNaWxsaXNlY29uZHMgZHVyaW5nIHdoaWNoIGEga2V5IGlzIHJlZ2FyZGVkIGFzIHByZXNzZWQuCisgKiBJZiBhbiBpZGVudGljYWwgY29tbWFuZCBhcnJpdmVzIHdpdGhpbiB0aGlzIHRpbWUsIHRoZSB0aW1lciB3aWxsIHN0YXJ0IG92ZXIuCiAgKi8KLSNkZWZpbmUgSVJfUkVQRUFUX1RJTUVPVVQJMzUwCisjZGVmaW5lIElSX0tFWVBSRVNTX1RJTUVPVVQJMjUwCiAKIC8qIFJDNSBkZXZpY2Ugd2lsZGNhcmQgKi8KICNkZWZpbmUgSVJfREVWSUNFX0FOWQkJMjU1CiAKLS8qIFNvbWUgcmVtb3RlcyBzZW5kcyBtdWx0aXBsZSBzZXF1ZW5jZXMgcGVyIGtleXByZXNzIChlLmcuIFplbml0aCBzZW5kcyB0d28pLAotICogdGhpcyBzZXR0aW5nIGFsbG93cyB0aGUgc3VwZXJmbG91cyBzZXF1ZW5jZXMgdG8gYmUgaWdub3JlZAotICovCi1zdGF0aWMgaW50IGRlYm91bmNlID0gMDsKLW1vZHVsZV9wYXJhbShkZWJvdW5jZSwgaW50LCAwNjQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MoZGVib3VuY2UsICJpZ25vcmUgcmVwZWF0ZWQgSVIgc2VxdWVuY2VzIChkZWZhdWx0OiAwID0gaWdub3JlIG5vIHNlcXVlbmNlcykiKTsKLQogc3RhdGljIGludCByYzVfZGV2aWNlID0gLTE7CiBtb2R1bGVfcGFyYW0ocmM1X2RldmljZSwgaW50LCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MocmM1X2RldmljZSwgIm9ubHkgSVIgY29tbWFuZHMgdG8gZ2l2ZW4gUkM1IGRldmljZSAoZGV2aWNlID0gMCAtIDMxLCBhbnkgZGV2aWNlID0gMjU1LCBkZWZhdWx0OiBhdXRvZGV0ZWN0KSIpOwpAQCAtOTksMTAgKzkzLDE0IEBACiBzdHJ1Y3QgYnVkZ2V0X2NpX2lyIHsKIAlzdHJ1Y3QgaW5wdXRfZGV2ICpkZXY7CiAJc3RydWN0IHRhc2tsZXRfc3RydWN0IG1zcDQzMF9pcnFfdGFza2xldDsKKwlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcl9rZXl1cDsKIAljaGFyIG5hbWVbNzJdOyAvKiA0MCArIDMyIGZvciAoc3RydWN0IHNhYTcxNDZfZGV2KS5uYW1lICovCiAJY2hhciBwaHlzWzMyXTsKIAlzdHJ1Y3QgaXJfaW5wdXRfc3RhdGUgc3RhdGU7CiAJaW50IHJjNV9kZXZpY2U7CisJdTMyIGxhc3RfcmF3OworCXUzMiBpcl9rZXk7CisJYm9vbCBoYXZlX2NvbW1hbmQ7CiB9OwogCiBzdHJ1Y3QgYnVkZ2V0X2NpIHsKQEAgLTEyNSwxMyArMTIzLDggQEAKIHsKIAlzdHJ1Y3QgYnVkZ2V0X2NpICpidWRnZXRfY2kgPSAoc3RydWN0IGJ1ZGdldF9jaSAqKSBkYXRhOwogCXN0cnVjdCBpbnB1dF9kZXYgKmRldiA9IGJ1ZGdldF9jaS0+aXIuZGV2OwotCXN0YXRpYyBpbnQgYm91bmNlcyA9IDA7Ci0JaW50IGRldmljZTsKLQlpbnQgdG9nZ2xlOwotCXN0YXRpYyBpbnQgcHJldl90b2dnbGUgPSAtMTsKLQlzdGF0aWMgdTMyIGlyX2tleTsKLQlzdGF0aWMgaW50IHN0YXRlID0gMDsKIAl1MzIgY29tbWFuZCA9IHR0cGNpX2J1ZGdldF9kZWJpcmVhZCgmYnVkZ2V0X2NpLT5idWRnZXQsIERFQklOT1NXQVAsIERFQklBRERSX0lSLCAyLCAxLCAwKSA+PiA4OworCXUzMiByYXc7CiAKIAkvKgogCSAqIFRoZSBtc3A0MzAgY2hpcCBjYW4gZ2VuZXJhdGUgdHdvIGRpZmZlcmVudCBieXRlcywgY29tbWFuZCBhbmQgZGV2aWNlCkBAIC0xNDMsNyArMTM2LDcgQEAKIAkgKiBieXRlcyBhbmQgb25lIG9yIG1vcmUgZGV2aWNlIGJ5dGVzLiBGb3IgdGhlIHJlcGVhdGVkIGJ5dGVzLCB0aGUKIAkgKiBoaWdoZXN0IGJpdCAoWCkgaXMgc2V0LiBUaGUgZmlyc3QgY29tbWFuZCBieXRlIGlzIGFsd2F5cyBnZW5lcmF0ZWQKIAkgKiBiZWZvcmUgdGhlIGZpcnN0IGRldmljZSBieXRlLiBPdGhlciB0aGFuIHRoYXQsIG5vIHNwZWNpZmljIG9yZGVyCi0JICogc2VlbXMgdG8gYXBwbHkuCisJICogc2VlbXMgdG8gYXBwbHkuIFRvIG1ha2UgbGlmZSBpbnRlcmVzdGluZywgYnl0ZXMgY2FuIGFsc28gYmUgbG9zdC4KIAkgKgogCSAqIE9ubHkgd2hlbiB3ZSBoYXZlIGEgY29tbWFuZCBhbmQgZGV2aWNlIGJ5dGUsIGEga2V5cHJlc3MgaXMKIAkgKiBnZW5lcmF0ZWQuCkBAIC0xNTIsNTMgKzE0NSwzNSBAQAogCWlmIChpcl9kZWJ1ZykKIAkJcHJpbnRrKCJidWRnZXRfY2k6IHJlY2VpdmVkIGJ5dGUgMHglMDJ4XG4iLCBjb21tYW5kKTsKIAotCS8qIElzIHRoaXMgYSByZXBlYXRlZCBieXRlPyAqLwotCWlmIChjb21tYW5kICYgMHg4MCkKLQkJcmV0dXJuOworCS8qIFJlbW92ZSByZXBlYXQgYml0LCB3ZSB1c2UgZXZlcnkgY29tbWFuZCAqLworCWNvbW1hbmQgPSBjb21tYW5kICYgMHg3ZjsKIAogCS8qIElzIHRoaXMgYSBSQzUgY29tbWFuZCBieXRlPyAqLwogCWlmIChjb21tYW5kICYgMHg0MCkgewotCQlzdGF0ZSA9IDE7Ci0JCWlyX2tleSA9IGNvbW1hbmQgJiAweDNmOworCQlidWRnZXRfY2ktPmlyLmhhdmVfY29tbWFuZCA9IHRydWU7CisJCWJ1ZGdldF9jaS0+aXIuaXJfa2V5ID0gY29tbWFuZCAmIDB4M2Y7CiAJCXJldHVybjsKIAl9CiAKIAkvKiBJdCdzIGEgUkM1IGRldmljZSBieXRlICovCi0JaWYgKCFzdGF0ZSkKKwlpZiAoIWJ1ZGdldF9jaS0+aXIuaGF2ZV9jb21tYW5kKQogCQlyZXR1cm47Ci0Jc3RhdGUgPSAwOwotCWRldmljZSA9IGNvbW1hbmQgJiAweDFmOwotCXRvZ2dsZSA9IGNvbW1hbmQgJiAweDIwOworCWJ1ZGdldF9jaS0+aXIuaGF2ZV9jb21tYW5kID0gZmFsc2U7CiAKLQlpZiAoYnVkZ2V0X2NpLT5pci5yYzVfZGV2aWNlICE9IElSX0RFVklDRV9BTlkgJiYgYnVkZ2V0X2NpLT5pci5yYzVfZGV2aWNlICE9IGRldmljZSkKKwlpZiAoYnVkZ2V0X2NpLT5pci5yYzVfZGV2aWNlICE9IElSX0RFVklDRV9BTlkgJiYKKwkgICAgYnVkZ2V0X2NpLT5pci5yYzVfZGV2aWNlICE9IChjb21tYW5kICYgMHgxZikpCiAJCXJldHVybjsKIAotCS8qIElnbm9yZSByZXBlYXRlZCBrZXkgc2VxdWVuY2VzIGlmIHJlcXVlc3RlZCAqLwotCWlmICh0b2dnbGUgPT0gcHJldl90b2dnbGUgJiYgaXJfa2V5ID09IGRldi0+cmVwZWF0X2tleSAmJgotCSAgICBib3VuY2VzID4gMCAmJiB0aW1lcl9wZW5kaW5nKCZkZXYtPnRpbWVyKSkgewotCQlpZiAoaXJfZGVidWcpCi0JCQlwcmludGsoImJ1ZGdldF9jaTogZGVib3VuY2UgbG9naWMgaWdub3JlZCBJUiBjb21tYW5kXG4iKTsKLQkJYm91bmNlcy0tOwotCQlyZXR1cm47Ci0JfQotCXByZXZfdG9nZ2xlID0gdG9nZ2xlOwotCi0JLyogQXJlIHdlIHN0aWxsIHdhaXRpbmcgZm9yIGEga2V5dXAgZXZlbnQ/ICovCi0JaWYgKGRlbF90aW1lcigmZGV2LT50aW1lcikpCisJLyogSXMgdGhpcyBhIHJlcGVhdGVkIGtleSBzZXF1ZW5jZT8gKHNhbWUgZGV2aWNlLCBjb21tYW5kLCB0b2dnbGUpICovCisJcmF3ID0gYnVkZ2V0X2NpLT5pci5pcl9rZXkgfCAoY29tbWFuZCA8PCA4KTsKKwlpZiAoYnVkZ2V0X2NpLT5pci5sYXN0X3JhdyAhPSByYXcgfHwgIXRpbWVyX3BlbmRpbmcoJmJ1ZGdldF9jaS0+aXIudGltZXJfa2V5dXApKSB7CiAJCWlyX2lucHV0X25va2V5KGRldiwgJmJ1ZGdldF9jaS0+aXIuc3RhdGUpOwotCi0JLyogR2VuZXJhdGUga2V5cHJlc3MgKi8KLQlpZiAoaXJfZGVidWcpCi0JCXByaW50aygiYnVkZ2V0X2NpOiBnZW5lcmF0aW5nIGtleXByZXNzIDB4JTAyeFxuIiwgaXJfa2V5KTsKLQlpcl9pbnB1dF9rZXlkb3duKGRldiwgJmJ1ZGdldF9jaS0+aXIuc3RhdGUsIGlyX2tleSwgKGlyX2tleSAmIChjb21tYW5kIDw8IDgpKSk7Ci0KLQkvKiBEbyB3ZSB3YW50IHRvIGRlbGF5IHRoZSBrZXl1cCBldmVudD8gKi8KLQlpZiAoZGVib3VuY2UpIHsKLQkJYm91bmNlcyA9IGRlYm91bmNlOwotCQltb2RfdGltZXIoJmRldi0+dGltZXIsIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKElSX1JFUEVBVF9USU1FT1VUKSk7Ci0JfSBlbHNlIHsKLQkJaXJfaW5wdXRfbm9rZXkoZGV2LCAmYnVkZ2V0X2NpLT5pci5zdGF0ZSk7CisJCWlyX2lucHV0X2tleWRvd24oZGV2LCAmYnVkZ2V0X2NpLT5pci5zdGF0ZSwKKwkJCQkgYnVkZ2V0X2NpLT5pci5pcl9rZXksIHJhdyk7CisJCWJ1ZGdldF9jaS0+aXIubGFzdF9yYXcgPSByYXc7CiAJfQorCisJbW9kX3RpbWVyKCZidWRnZXRfY2ktPmlyLnRpbWVyX2tleXVwLCBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhJUl9LRVlQUkVTU19USU1FT1VUKSk7CiB9CiAKIHN0YXRpYyBpbnQgbXNwNDMwX2lyX2luaXQoc3RydWN0IGJ1ZGdldF9jaSAqYnVkZ2V0X2NpKQpAQCAtMjcxLDE2ICsyNDYsMjEgQEAKIAkJYnJlYWs7CiAJfQogCi0JLyogaW5pdGlhbGlzZSB0aGUga2V5LXVwIGRlYm91bmNlIHRpbWVvdXQgaGFuZGxlciAqLwotCWlucHV0X2Rldi0+dGltZXIuZnVuY3Rpb24gPSBtc3A0MzBfaXJfa2V5dXA7Ci0JaW5wdXRfZGV2LT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpICZidWRnZXRfY2ktPmlyOwotCisJLyogaW5pdGlhbGlzZSB0aGUga2V5LXVwIHRpbWVvdXQgaGFuZGxlciAqLworCWluaXRfdGltZXIoJmJ1ZGdldF9jaS0+aXIudGltZXJfa2V5dXApOworCWJ1ZGdldF9jaS0+aXIudGltZXJfa2V5dXAuZnVuY3Rpb24gPSBtc3A0MzBfaXJfa2V5dXA7CisJYnVkZ2V0X2NpLT5pci50aW1lcl9rZXl1cC5kYXRhID0gKHVuc2lnbmVkIGxvbmcpICZidWRnZXRfY2ktPmlyOworCWJ1ZGdldF9jaS0+aXIubGFzdF9yYXcgPSAweGZmZmY7IC8qIEFuIGltcG9zc2libGUgdmFsdWUgKi8KIAllcnJvciA9IGlucHV0X3JlZ2lzdGVyX2RldmljZShpbnB1dF9kZXYpOwogCWlmIChlcnJvcikgewogCQlwcmludGsoS0VSTl9FUlIgImJ1ZGdldF9jaTogY291bGQgbm90IGluaXQgZHJpdmVyIGZvciBJUiBkZXZpY2UgKGNvZGUgJWQpXG4iLCBlcnJvcik7CiAJCWdvdG8gb3V0MjsKIAl9CiAKKwkvKiBub3RlOiB0aGVzZSBtdXN0IGJlIGFmdGVyIGlucHV0X3JlZ2lzdGVyX2RldmljZSAqLworCWlucHV0X2Rldi0+cmVwW1JFUF9ERUxBWV0gPSA0MDA7CisJaW5wdXRfZGV2LT5yZXBbUkVQX1BFUklPRF0gPSAyNTA7CisKIAl0YXNrbGV0X2luaXQoJmJ1ZGdldF9jaS0+aXIubXNwNDMwX2lycV90YXNrbGV0LCBtc3A0MzBfaXJfaW50ZXJydXB0LAogCQkgICAgICh1bnNpZ25lZCBsb25nKSBidWRnZXRfY2kpOwogCkBAIC0zMDQsMTAgKzI4NCw4IEBACiAJc2FhNzE0Nl9zZXRncGlvKHNhYSwgMywgU0FBNzE0Nl9HUElPX0lOUFVUKTsKIAl0YXNrbGV0X2tpbGwoJmJ1ZGdldF9jaS0+aXIubXNwNDMwX2lycV90YXNrbGV0KTsKIAotCWlmIChkZWxfdGltZXIoJmRldi0+dGltZXIpKSB7Ci0JCWlyX2lucHV0X25va2V5KGRldiwgJmJ1ZGdldF9jaS0+aXIuc3RhdGUpOwotCQlpbnB1dF9zeW5jKGRldik7Ci0JfQorCWRlbF90aW1lcl9zeW5jKCZkZXYtPnRpbWVyKTsKKwlpcl9pbnB1dF9ub2tleShkZXYsICZidWRnZXRfY2ktPmlyLnN0YXRlKTsKIAogCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKGRldik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQtY29yZS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LWNvcmUuYwppbmRleCBlMTU1NjJmLi42Yjk3ZGMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQtY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC1jb3JlLmMKQEAgLTQxLDExICs0MSwxNCBAQAogCiAjZGVmaW5lIFRTX1dJRFRICQkoMiAqIFRTX1NJWkUpCiAjZGVmaW5lIFRTX1dJRFRIX0FDVElWWQkJVFNfU0laRQorI2RlZmluZSBUU19XSURUSF9EVkJDCQlUU19TSVpFCiAjZGVmaW5lIFRTX0hFSUdIVF9NQVNLCQkweGYwMAogI2RlZmluZSBUU19IRUlHSFRfTUFTS19BQ1RJVlkJMHhjMDAKKyNkZWZpbmUgVFNfSEVJR0hUX01BU0tfRFZCQwkweGUwMAogI2RlZmluZSBUU19NSU5fQlVGU0laRV9LCTE4OAogI2RlZmluZSBUU19NQVhfQlVGU0laRV9LCTE0MTAKICNkZWZpbmUgVFNfTUFYX0JVRlNJWkVfS19BQ1RJVlkJNTY0CisjZGVmaW5lIFRTX01BWF9CVUZTSVpFX0tfRFZCQwkxMzE2CiAjZGVmaW5lIEJVRkZFUl9XQVJOSU5HX1dBSVQJKDMwKkhaKQogCiBpbnQgYnVkZ2V0X2RlYnVnOwpAQCAtMTA2LDYgKzEwOSwxOSBAQAogCQlzYWE3MTQ2X3dyaXRlKGRldiwgTUMyLCAoTUFTS18xMCB8IE1BU0tfMjYpKTsKIAkJc2FhNzE0Nl93cml0ZShkZXYsIEJSU19DVFJMLCAweDYwMDAwMDAwKTsKIAkJYnJlYWs7CisJY2FzZSBCVURHRVRfQ0lOMTIwMENfTUszOgorCWNhc2UgQlVER0VUX0tOQzFDX01LMzoKKwljYXNlIEJVREdFVF9LTkMxQ1BfTUszOgorCQlpZiAoYnVkZ2V0LT52aWRlb19wb3J0ID09IEJVREdFVF9WSURFT19QT1JUQSkgeworCQkJc2FhNzE0Nl93cml0ZShkZXYsIEREMV9JTklULCAweDA2MDAwMjAwKTsKKwkJCXNhYTcxNDZfd3JpdGUoZGV2LCBNQzIsIChNQVNLXzA5IHwgTUFTS18yNSB8IE1BU0tfMTAgfCBNQVNLXzI2KSk7CisJCQlzYWE3MTQ2X3dyaXRlKGRldiwgQlJTX0NUUkwsIDB4MDAwMDAwMDApOworCQl9IGVsc2UgeworCQkJc2FhNzE0Nl93cml0ZShkZXYsIEREMV9JTklULCAweDAwMDAwNjAwKTsKKwkJCXNhYTcxNDZfd3JpdGUoZGV2LCBNQzIsIChNQVNLXzA5IHwgTUFTS18yNSB8IE1BU0tfMTAgfCBNQVNLXzI2KSk7CisJCQlzYWE3MTQ2X3dyaXRlKGRldiwgQlJTX0NUUkwsIDB4NjAwMDAwMDApOworCQl9CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWlmIChidWRnZXQtPnZpZGVvX3BvcnQgPT0gQlVER0VUX1ZJREVPX1BPUlRBKSB7CiAJCQlzYWE3MTQ2X3dyaXRlKGRldiwgREQxX0lOSVQsIDB4MDYwMDAyMDApOwpAQCAtMTIyLDcgKzEzOCwxMyBAQAogCW1kZWxheSgxMCk7CiAKIAlzYWE3MTQ2X3dyaXRlKGRldiwgQkFTRV9PREQzLCAwKTsKLQlzYWE3MTQ2X3dyaXRlKGRldiwgQkFTRV9FVkVOMywgMCk7CisJaWYgKGJ1ZGdldC0+YnVmZmVyX3NpemUgPiBidWRnZXQtPmJ1ZmZlcl9oZWlnaHQgKiBidWRnZXQtPmJ1ZmZlcl93aWR0aCkgeworCQkvLyB1c2luZyBvZGQvZXZlbiBidWZmZXJzCisJCXNhYTcxNDZfd3JpdGUoZGV2LCBCQVNFX0VWRU4zLCBidWRnZXQtPmJ1ZmZlcl9oZWlnaHQgKiBidWRnZXQtPmJ1ZmZlcl93aWR0aCk7CisJfSBlbHNlIHsKKwkJLy8gdXNpbmcgYSBzaW5nbGUgYnVmZmVyCisJCXNhYTcxNDZfd3JpdGUoZGV2LCBCQVNFX0VWRU4zLCAwKTsKKwl9CiAJc2FhNzE0Nl93cml0ZShkZXYsIFBST1RfQUREUjMsIGJ1ZGdldC0+YnVmZmVyX3NpemUpOwogCXNhYTcxNDZfd3JpdGUoZGV2LCBCQVNFX1BBR0UzLCBidWRnZXQtPnB0LmRtYSB8IE1FMSB8IDB4OTApOwogCkBAIC0zOTksMTEgKzQyMSwyNSBAQAogCWJ1ZGdldC0+Y2FyZCA9IGJpOwogCWJ1ZGdldC0+ZGV2ID0gKHN0cnVjdCBzYWE3MTQ2X2RldiAqKSBkZXY7CiAKLQlpZiAoYnVkZ2V0LT5jYXJkLT50eXBlID09IEJVREdFVF9GU19BQ1RJVlkpIHsKKwlzd2l0Y2goYnVkZ2V0LT5jYXJkLT50eXBlKSB7CisJY2FzZSBCVURHRVRfRlNfQUNUSVZZOgogCQlidWRnZXQtPmJ1ZmZlcl93aWR0aCA9IFRTX1dJRFRIX0FDVElWWTsKIAkJbWF4X2J1ZnNpemUgPSBUU19NQVhfQlVGU0laRV9LX0FDVElWWTsKIAkJaGVpZ2h0X21hc2sgPSBUU19IRUlHSFRfTUFTS19BQ1RJVlk7Ci0JfSBlbHNlIHsKKwkJYnJlYWs7CisKKwljYXNlIEJVREdFVF9LTkMxQzoKKwljYXNlIEJVREdFVF9LTkMxQ1A6CisJY2FzZSBCVURHRVRfQ0lOMTIwMEM6CisJY2FzZSBCVURHRVRfS05DMUNfTUszOgorCWNhc2UgQlVER0VUX0tOQzFDUF9NSzM6CisJY2FzZSBCVURHRVRfQ0lOMTIwMENfTUszOgorCQlidWRnZXQtPmJ1ZmZlcl93aWR0aCA9IFRTX1dJRFRIX0RWQkM7CisJCW1heF9idWZzaXplID0gVFNfTUFYX0JVRlNJWkVfS19EVkJDOworCQloZWlnaHRfbWFzayA9IFRTX0hFSUdIVF9NQVNLX0RWQkM7CisJCWJyZWFrOworCisJZGVmYXVsdDoKIAkJYnVkZ2V0LT5idWZmZXJfd2lkdGggPSBUU19XSURUSDsKIAkJbWF4X2J1ZnNpemUgPSBUU19NQVhfQlVGU0laRV9LOwogCQloZWlnaHRfbWFzayA9IFRTX0hFSUdIVF9NQVNLOwpAQCAtNDE1LDE0ICs0NTEsMjIgQEAKIAkJZG1hX2J1ZmZlcl9zaXplID0gbWF4X2J1ZnNpemU7CiAKIAlidWRnZXQtPmJ1ZmZlcl9oZWlnaHQgPSBkbWFfYnVmZmVyX3NpemUgKiAxMDI0IC8gYnVkZ2V0LT5idWZmZXJfd2lkdGg7Ci0JYnVkZ2V0LT5idWZmZXJfaGVpZ2h0ICY9IGhlaWdodF9tYXNrOwotCWJ1ZGdldC0+YnVmZmVyX3NpemUgPSBidWRnZXQtPmJ1ZmZlcl9oZWlnaHQgKiBidWRnZXQtPmJ1ZmZlcl93aWR0aDsKKwlpZiAoYnVkZ2V0LT5idWZmZXJfaGVpZ2h0ID4gMHhmZmYpIHsKKwkJYnVkZ2V0LT5idWZmZXJfaGVpZ2h0IC89IDI7CisJCWJ1ZGdldC0+YnVmZmVyX2hlaWdodCAmPSBoZWlnaHRfbWFzazsKKwkJYnVkZ2V0LT5idWZmZXJfc2l6ZSA9IDIgKiBidWRnZXQtPmJ1ZmZlcl9oZWlnaHQgKiBidWRnZXQtPmJ1ZmZlcl93aWR0aDsKKwl9IGVsc2UgeworCQlidWRnZXQtPmJ1ZmZlcl9oZWlnaHQgJj0gaGVpZ2h0X21hc2s7CisJCWJ1ZGdldC0+YnVmZmVyX3NpemUgPSBidWRnZXQtPmJ1ZmZlcl9oZWlnaHQgKiBidWRnZXQtPmJ1ZmZlcl93aWR0aDsKKwl9CiAJYnVkZ2V0LT5idWZmZXJfd2FybmluZ190aHJlc2hvbGQgPSBidWRnZXQtPmJ1ZmZlcl9zaXplICogODAvMTAwOwogCWJ1ZGdldC0+YnVmZmVyX3dhcm5pbmdzID0gMDsKIAlidWRnZXQtPmJ1ZmZlcl93YXJuaW5nX3RpbWUgPSBqaWZmaWVzOwogCi0JZHByaW50aygyLCAiJXM6IHdpZHRoID0gJWQsIGhlaWdodCA9ICVkXG4iLAotCQlidWRnZXQtPmRldi0+bmFtZSwgYnVkZ2V0LT5idWZmZXJfd2lkdGgsIGJ1ZGdldC0+YnVmZmVyX2hlaWdodCk7CisJZHByaW50aygyLCAiJXM6IGJ1ZmZlciB0eXBlID0gJXMsIHdpZHRoID0gJWQsIGhlaWdodCA9ICVkXG4iLAorCQlidWRnZXQtPmRldi0+bmFtZSwKKwkJYnVkZ2V0LT5idWZmZXJfc2l6ZSA+IGJ1ZGdldC0+YnVmZmVyX3dpZHRoICogYnVkZ2V0LT5idWZmZXJfaGVpZ2h0ID8gIm9kZC9ldmVuIiA6ICJzaW5nbGUiLAorCQlidWRnZXQtPmJ1ZmZlcl93aWR0aCwgYnVkZ2V0LT5idWZmZXJfaGVpZ2h0KTsKIAlwcmludGsoIiVzOiBkbWEgYnVmZmVyIHNpemUgJXVcbiIsIGJ1ZGdldC0+ZGV2LT5uYW1lLCBidWRnZXQtPmJ1ZmZlcl9zaXplKTsKIAogCWlmICgocmV0ID0gZHZiX3JlZ2lzdGVyX2FkYXB0ZXIoJmJ1ZGdldC0+ZHZiX2FkYXB0ZXIsIGJ1ZGdldC0+Y2FyZC0+bmFtZSwgb3duZXIsICZidWRnZXQtPmRldi0+cGNpLT5kZXYpKSA8IDApIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC5oIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LmgKaW5kZXggZThhNWM3OS4uZDc2NGZmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LmgKQEAgLTk5LDYgKzk5LDkgQEAKICNkZWZpbmUgQlVER0VUX0tOQzFDUAkJICAgMTIKICNkZWZpbmUgQlVER0VUX0tOQzFUUAkJICAgMTMKICNkZWZpbmUgQlVER0VUX1RWU1RBUgkJICAgMTQKKyNkZWZpbmUgQlVER0VUX0NJTjEyMDBDX01LMwkgICAxNQorI2RlZmluZSBCVURHRVRfS05DMUNfTUszCSAgIDE2CisjZGVmaW5lIEJVREdFVF9LTkMxQ1BfTUszCSAgIDE3CiAKICNkZWZpbmUgQlVER0VUX1ZJREVPX1BPUlRBICAgICAgICAgMAogI2RlZmluZSBCVURHRVRfVklERU9fUE9SVEIgICAgICAgICAxCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi90dHVzYi1idWRnZXQvS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0dXNiLWJ1ZGdldC9LY29uZmlnCmluZGV4IGU3OGVhOTIuLmY1NDZiY2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0dXNiLWJ1ZGdldC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0dXNiLWJ1ZGdldC9LY29uZmlnCkBAIC0xLDcgKzEsNiBAQAogY29uZmlnIERWQl9UVFVTQl9CVURHRVQKIAl0cmlzdGF0ZSAiVGVjaG5vdHJlbmQvSGF1cHBhdWdlIE5vdmEtVVNCIGRldmljZXMiCiAJZGVwZW5kcyBvbiBEVkJfQ09SRSAmJiBVU0IgJiYgSTJDCi0Jc2VsZWN0IERWQl9QTEwKIAlzZWxlY3QgRFZCX0NYMjI3MDAgaWYgIURWQl9GRV9DVVNUT01JU0UKIAlzZWxlY3QgRFZCX1REQTEwMDRYIGlmICFEVkJfRkVfQ1VTVE9NSVNFCiAJc2VsZWN0IERWQl9WRVMxODIwIGlmICFEVkJfRkVfQ1VTVE9NSVNFCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLWFpbXNsYWIuYyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tYWltc2xhYi5jCmluZGV4IGIyZTg4YWQuLjVhZGMyN2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tYWltc2xhYi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tYWltc2xhYi5jCkBAIC0yMzEsMTI5ICsyMzEsMTQ5IEBACiAJfQogfTsKIAotc3RhdGljIGludCBydF9kb19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKK3N0YXRpYyBpbnQgdmlkaW9jX3F1ZXJ5Y2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICAqcHJpdiwKKwkJCQkJc3RydWN0IHY0bDJfY2FwYWJpbGl0eSAqdikKIHsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwotCXN0cnVjdCBydF9kZXZpY2UgKnJ0PWRldi0+cHJpdjsKLQotCXN3aXRjaChjbWQpCi0JewotCQljYXNlIFZJRElPQ19RVUVSWUNBUDoKLQkJewotCQkJc3RydWN0IHY0bDJfY2FwYWJpbGl0eSAqdiA9IGFyZzsKLQkJCW1lbXNldCh2LDAsc2l6ZW9mKCp2KSk7Ci0JCQlzdHJsY3B5KHYtPmRyaXZlciwgInJhZGlvLWFpbXNsYWIiLCBzaXplb2YgKHYtPmRyaXZlcikpOwotCQkJc3RybGNweSh2LT5jYXJkLCAiUmFkaW9UcmFjayIsIHNpemVvZiAodi0+Y2FyZCkpOwotCQkJc3ByaW50Zih2LT5idXNfaW5mbywiSVNBIik7Ci0JCQl2LT52ZXJzaW9uID0gUkFESU9fVkVSU0lPTjsKLQkJCXYtPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX1RVTkVSOwotCi0JCQlyZXR1cm4gMDsKLQkJfQotCQljYXNlIFZJRElPQ19HX1RVTkVSOgotCQl7Ci0JCQlzdHJ1Y3QgdjRsMl90dW5lciAqdiA9IGFyZzsKLQotCQkJaWYgKHYtPmluZGV4ID4gMCkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQotCQkJbWVtc2V0KHYsMCxzaXplb2YoKnYpKTsKLQkJCXN0cmNweSh2LT5uYW1lLCAiRk0iKTsKLQkJCXYtPnR5cGUgPSBWNEwyX1RVTkVSX1JBRElPOwotCi0JCQl2LT5yYW5nZWxvdz0oODcqMTYwMDApOwotCQkJdi0+cmFuZ2VoaWdoPSgxMDgqMTYwMDApOwotCQkJdi0+cnhzdWJjaGFucyA9VjRMMl9UVU5FUl9TVUJfTU9OTzsKLQkJCXYtPmNhcGFiaWxpdHk9VjRMMl9UVU5FUl9DQVBfTE9XOwotCQkJdi0+YXVkbW9kZSA9IFY0TDJfVFVORVJfTU9ERV9NT05POwotCQkJdi0+c2lnbmFsPTB4RkZGRipydF9nZXRzaWdzdHIocnQpOwotCi0JCQlyZXR1cm4gMDsKLQkJfQotCQljYXNlIFZJRElPQ19TX1RVTkVSOgotCQl7Ci0JCQlzdHJ1Y3QgdjRsMl90dW5lciAqdiA9IGFyZzsKLQotCQkJaWYgKHYtPmluZGV4ID4gMCkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJY2FzZSBWSURJT0NfU19GUkVRVUVOQ1k6Ci0JCXsKLQkJCXN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSAqZiA9IGFyZzsKLQotCQkJcnQtPmN1cmZyZXEgPSBmLT5mcmVxdWVuY3k7Ci0JCQlydF9zZXRmcmVxKHJ0LCBydC0+Y3VyZnJlcSk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQljYXNlIFZJRElPQ19HX0ZSRVFVRU5DWToKLQkJewotCQkJc3RydWN0IHY0bDJfZnJlcXVlbmN5ICpmID0gYXJnOwotCi0JCQlmLT50eXBlID0gVjRMMl9UVU5FUl9SQURJTzsKLQkJCWYtPmZyZXF1ZW5jeSA9IHJ0LT5jdXJmcmVxOwotCi0JCQlyZXR1cm4gMDsKLQkJfQotCQljYXNlIFZJRElPQ19RVUVSWUNUUkw6Ci0JCXsKLQkJCXN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWMgPSBhcmc7Ci0JCQlpbnQgaTsKLQotCQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocmFkaW9fcWN0cmwpOyBpKyspIHsKLQkJCQlpZiAocWMtPmlkICYmIHFjLT5pZCA9PSByYWRpb19xY3RybFtpXS5pZCkgewotCQkJCQltZW1jcHkocWMsICYocmFkaW9fcWN0cmxbaV0pLAotCQkJCQkJCQlzaXplb2YoKnFjKSk7Ci0JCQkJCXJldHVybiAoMCk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJY2FzZSBWSURJT0NfR19DVFJMOgotCQl7Ci0JCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsPSBhcmc7Ci0KLQkJCXN3aXRjaCAoY3RybC0+aWQpIHsKLQkJCQljYXNlIFY0TDJfQ0lEX0FVRElPX01VVEU6Ci0JCQkJCWN0cmwtPnZhbHVlPXJ0LT5tdXRlZDsKLQkJCQkJcmV0dXJuICgwKTsKLQkJCQljYXNlIFY0TDJfQ0lEX0FVRElPX1ZPTFVNRToKLQkJCQkJY3RybC0+dmFsdWU9cnQtPmN1cnZvbCAqIDY1NTQ7Ci0JCQkJCXJldHVybiAoMCk7Ci0JCQl9Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQljYXNlIFZJRElPQ19TX0NUUkw6Ci0JCXsKLQkJCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmw9IGFyZzsKLQotCQkJc3dpdGNoIChjdHJsLT5pZCkgewotCQkJCWNhc2UgVjRMMl9DSURfQVVESU9fTVVURToKLQkJCQkJaWYgKGN0cmwtPnZhbHVlKSB7Ci0JCQkJCQlydF9tdXRlKHJ0KTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXJ0X3NldHZvbChydCxydC0+Y3Vydm9sKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gKDApOwotCQkJCWNhc2UgVjRMMl9DSURfQVVESU9fVk9MVU1FOgotCQkJCQlydF9zZXR2b2wocnQsY3RybC0+dmFsdWUpOwotCQkJCQlyZXR1cm4gKDApOwotCQkJfQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotCQlkZWZhdWx0OgotCQkJcmV0dXJuIHY0bF9jb21wYXRfdHJhbnNsYXRlX2lvY3RsKGlub2RlLGZpbGUsY21kLGFyZywKLQkJCQkJCQkgIHJ0X2RvX2lvY3RsKTsKLQl9CisJc3RybGNweSh2LT5kcml2ZXIsICJyYWRpby1haW1zbGFiIiwgc2l6ZW9mKHYtPmRyaXZlcikpOworCXN0cmxjcHkodi0+Y2FyZCwgIlJhZGlvVHJhY2siLCBzaXplb2Yodi0+Y2FyZCkpOworCXNwcmludGYodi0+YnVzX2luZm8sICJJU0EiKTsKKwl2LT52ZXJzaW9uID0gUkFESU9fVkVSU0lPTjsKKwl2LT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9UVU5FUjsKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBydF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQorc3RhdGljIGludCB2aWRpb2NfZ190dW5lcihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQkJc3RydWN0IHY0bDJfdHVuZXIgKnYpCiB7Ci0JcmV0dXJuIHZpZGVvX3VzZXJjb3B5KGlub2RlLCBmaWxlLCBjbWQsIGFyZywgcnRfZG9faW9jdGwpOworCXN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7CisJc3RydWN0IHJ0X2RldmljZSAqcnQgPSBkZXYtPnByaXY7CisKKwlpZiAodi0+aW5kZXggPiAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN0cmNweSh2LT5uYW1lLCAiRk0iKTsKKwl2LT50eXBlID0gVjRMMl9UVU5FUl9SQURJTzsKKwl2LT5yYW5nZWxvdyA9ICg4NyoxNjAwMCk7CisJdi0+cmFuZ2VoaWdoID0gKDEwOCoxNjAwMCk7CisJdi0+cnhzdWJjaGFucyA9IFY0TDJfVFVORVJfU1VCX01PTk87CisJdi0+Y2FwYWJpbGl0eSA9IFY0TDJfVFVORVJfQ0FQX0xPVzsKKwl2LT5hdWRtb2RlID0gVjRMMl9UVU5FUl9NT0RFX01PTk87CisJdi0+c2lnbmFsID0gMHhmZmZmKnJ0X2dldHNpZ3N0cihydCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX3NfdHVuZXIoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJCXN0cnVjdCB2NGwyX3R1bmVyICp2KQoreworCWlmICh2LT5pbmRleCA+IDApCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpZGlvY19zX2ZyZXF1ZW5jeShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQkJc3RydWN0IHY0bDJfZnJlcXVlbmN5ICpmKQoreworCXN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7CisJc3RydWN0IHJ0X2RldmljZSAqcnQgPSBkZXYtPnByaXY7CisKKwlydC0+Y3VyZnJlcSA9IGYtPmZyZXF1ZW5jeTsKKwlydF9zZXRmcmVxKHJ0LCBydC0+Y3VyZnJlcSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX2dfZnJlcXVlbmN5KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCQlzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgKmYpCit7CisJc3RydWN0IHZpZGVvX2RldmljZSAqZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKKwlzdHJ1Y3QgcnRfZGV2aWNlICpydCA9IGRldi0+cHJpdjsKKworCWYtPnR5cGUgPSBWNEwyX1RVTkVSX1JBRElPOworCWYtPmZyZXF1ZW5jeSA9IHJ0LT5jdXJmcmVxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpZGlvY19xdWVyeWN0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJCXN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWMpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShyYWRpb19xY3RybCk7IGkrKykgeworCQlpZiAocWMtPmlkICYmIHFjLT5pZCA9PSByYWRpb19xY3RybFtpXS5pZCkgeworCQkJbWVtY3B5KHFjLCAmKHJhZGlvX3FjdHJsW2ldKSwKKwkJCQkJCXNpemVvZigqcWMpKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IHZpZGlvY19nX2N0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCit7CisJc3RydWN0IHZpZGVvX2RldmljZSAqZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKKwlzdHJ1Y3QgcnRfZGV2aWNlICpydCA9IGRldi0+cHJpdjsKKworCXN3aXRjaCAoY3RybC0+aWQpIHsKKwljYXNlIFY0TDJfQ0lEX0FVRElPX01VVEU6CisJCWN0cmwtPnZhbHVlID0gcnQtPm11dGVkOworCQlyZXR1cm4gMDsKKwljYXNlIFY0TDJfQ0lEX0FVRElPX1ZPTFVNRToKKwkJY3RybC0+dmFsdWUgPSBydC0+Y3Vydm9sICogNjU1NDsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IHZpZGlvY19zX2N0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCit7CisJc3RydWN0IHZpZGVvX2RldmljZSAqZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKKwlzdHJ1Y3QgcnRfZGV2aWNlICpydCA9IGRldi0+cHJpdjsKKworCXN3aXRjaCAoY3RybC0+aWQpIHsKKwljYXNlIFY0TDJfQ0lEX0FVRElPX01VVEU6CisJCWlmIChjdHJsLT52YWx1ZSkKKwkJCXJ0X211dGUocnQpOworCQllbHNlCisJCQlydF9zZXR2b2wocnQscnQtPmN1cnZvbCk7CisJCXJldHVybiAwOworCWNhc2UgVjRMMl9DSURfQVVESU9fVk9MVU1FOgorCQlydF9zZXR2b2wocnQsY3RybC0+dmFsdWUpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX2dfYXVkaW8gKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCQlzdHJ1Y3QgdjRsMl9hdWRpbyAqYSkKK3sKKwlpZiAoYS0+aW5kZXggPiAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN0cmNweShhLT5uYW1lLCAiUmFkaW8iKTsKKwlhLT5jYXBhYmlsaXR5ID0gVjRMMl9BVURDQVBfU1RFUkVPOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpZGlvY19nX2lucHV0KHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwcml2LCB1bnNpZ25lZCBpbnQgKmkpCit7CisJKmkgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpZGlvY19zX2lucHV0KHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwcml2LCB1bnNpZ25lZCBpbnQgaSkKK3sKKwlpZiAoaSAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2Nfc19hdWRpbyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQkJc3RydWN0IHY0bDJfYXVkaW8gKmEpCit7CisJaWYgKGEtPmluZGV4ICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgc3RydWN0IHJ0X2RldmljZSBydHJhY2tfdW5pdDsKQEAgLTM2Miw3ICszODIsNyBAQAogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkub3BlbiAgICAgICAgICAgPSB2aWRlb19leGNsdXNpdmVfb3BlbiwKIAkucmVsZWFzZSAgICAgICAgPSB2aWRlb19leGNsdXNpdmVfcmVsZWFzZSwKLQkuaW9jdGwJCT0gcnRfaW9jdGwsCisJLmlvY3RsCQk9IHZpZGVvX2lvY3RsMiwKIAkuY29tcGF0X2lvY3RsCT0gdjRsX2NvbXBhdF9pb2N0bDMyLAogCS5sbHNlZWsgICAgICAgICA9IG5vX2xsc2VlaywKIH07CkBAIC0zNzQsNiArMzk0LDE4IEBACiAJLnR5cGUJCT0gVklEX1RZUEVfVFVORVIsCiAJLmhhcmR3YXJlCT0gMCwKIAkuZm9wcyAgICAgICAgICAgPSAmcnRyYWNrX2ZvcHMsCisJLnZpZGlvY19xdWVyeWNhcCAgICA9IHZpZGlvY19xdWVyeWNhcCwKKwkudmlkaW9jX2dfdHVuZXIgICAgID0gdmlkaW9jX2dfdHVuZXIsCisJLnZpZGlvY19zX3R1bmVyICAgICA9IHZpZGlvY19zX3R1bmVyLAorCS52aWRpb2NfZ19hdWRpbyAgICAgPSB2aWRpb2NfZ19hdWRpbywKKwkudmlkaW9jX3NfYXVkaW8gICAgID0gdmlkaW9jX3NfYXVkaW8sCisJLnZpZGlvY19nX2lucHV0ICAgICA9IHZpZGlvY19nX2lucHV0LAorCS52aWRpb2Nfc19pbnB1dCAgICAgPSB2aWRpb2Nfc19pbnB1dCwKKwkudmlkaW9jX2dfZnJlcXVlbmN5ID0gdmlkaW9jX2dfZnJlcXVlbmN5LAorCS52aWRpb2Nfc19mcmVxdWVuY3kgPSB2aWRpb2Nfc19mcmVxdWVuY3ksCisJLnZpZGlvY19xdWVyeWN0cmwgICA9IHZpZGlvY19xdWVyeWN0cmwsCisJLnZpZGlvY19nX2N0cmwgICAgICA9IHZpZGlvY19nX2N0cmwsCisJLnZpZGlvY19zX2N0cmwgICAgICA9IHZpZGlvY19zX2N0cmwsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBydHJhY2tfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1nZW10ZWstcGNpLmMgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLWdlbXRlay1wY2kuYwppbmRleCA3NDk3NmNiYS4uZmRmNWQ2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1nZW10ZWstcGNpLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1nZW10ZWstcGNpLmMKQEAgLTE5MiwxMzEgKzE5MiwxNTggQEAKIAlyZXR1cm4gKCBpbmIoIGNhcmQtPmlvYmFzZSApICYgMHgwOCApID8gMCA6IDE7CiB9CiAKLXN0YXRpYyBpbnQgZ2VtdGVrX3BjaV9kb19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCSAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCitzdGF0aWMgaW50IHZpZGlvY19xdWVyeWNhcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQkJc3RydWN0IHY0bDJfY2FwYWJpbGl0eSAqdikKK3sKKwlzdHJsY3B5KHYtPmRyaXZlciwgInJhZGlvLWdlbXRlay1wY2kiLCBzaXplb2Yodi0+ZHJpdmVyKSk7CisJc3RybGNweSh2LT5jYXJkLCAiR2VtVGVrIFBDSSBSYWRpbyIsIHNpemVvZih2LT5jYXJkKSk7CisJc3ByaW50Zih2LT5idXNfaW5mbywgIklTQSIpOworCXYtPnZlcnNpb24gPSBSQURJT19WRVJTSU9OOworCXYtPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX1RVTkVSOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpZGlvY19nX3R1bmVyKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCQlzdHJ1Y3QgdjRsMl90dW5lciAqdikKIHsKIAlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwogCXN0cnVjdCBnZW10ZWtfcGNpX2NhcmQgKmNhcmQgPSBkZXYtPnByaXY7CiAKLQlzd2l0Y2ggKCBjbWQgKSB7Ci0JCWNhc2UgVklESU9DX1FVRVJZQ0FQOgotCQl7Ci0JCQlzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5ICp2ID0gYXJnOwotCQkJbWVtc2V0KHYsMCxzaXplb2YoKnYpKTsKLQkJCXN0cmxjcHkodi0+ZHJpdmVyLCAicmFkaW8tZ2VtdGVrLXBjaSIsIHNpemVvZiAodi0+ZHJpdmVyKSk7Ci0JCQlzdHJsY3B5KHYtPmNhcmQsICJHZW1UZWsgUENJIFJhZGlvIiwgc2l6ZW9mICh2LT5jYXJkKSk7Ci0JCQlzcHJpbnRmKHYtPmJ1c19pbmZvLCJJU0EiKTsKLQkJCXYtPnZlcnNpb24gPSBSQURJT19WRVJTSU9OOwotCQkJdi0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfVFVORVI7CisJaWYgKHYtPmluZGV4ID4gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKLQkJCXJldHVybiAwOwotCQl9Ci0JCWNhc2UgVklESU9DX0dfVFVORVI6Ci0JCXsKLQkJCXN0cnVjdCB2NGwyX3R1bmVyICp2ID0gYXJnOwotCi0JCQlpZiAodi0+aW5kZXggPiAwKQotCQkJCXJldHVybiAtRUlOVkFMOwotCi0JCQltZW1zZXQodiwwLHNpemVvZigqdikpOwotCQkJc3RyY3B5KHYtPm5hbWUsICJGTSIpOwotCQkJdi0+dHlwZSA9IFY0TDJfVFVORVJfUkFESU87Ci0KLQkJCXYtPnJhbmdlbG93ID0gR0VNVEVLX1BDSV9SQU5HRV9MT1c7Ci0JCQl2LT5yYW5nZWhpZ2ggPSBHRU1URUtfUENJX1JBTkdFX0hJR0g7Ci0JCQl2LT5yeHN1YmNoYW5zID1WNEwyX1RVTkVSX1NVQl9NT05POwotCQkJdi0+Y2FwYWJpbGl0eT1WNEwyX1RVTkVSX0NBUF9MT1c7Ci0JCQl2LT5hdWRtb2RlID0gVjRMMl9UVU5FUl9NT0RFX01PTk87Ci0JCQl2LT5zaWduYWw9MHhGRkZGKmdlbXRla19wY2lfZ2V0c2lnbmFsKCBjYXJkICk7Ci0KLQkJCXJldHVybiAwOwotCQl9Ci0JCWNhc2UgVklESU9DX1NfVFVORVI6Ci0JCXsKLQkJCXN0cnVjdCB2NGwyX3R1bmVyICp2ID0gYXJnOwotCi0JCQlpZiAodi0+aW5kZXggPiAwKQotCQkJCXJldHVybiAtRUlOVkFMOwotCi0JCQlyZXR1cm4gMDsKLQkJfQotCQljYXNlIFZJRElPQ19TX0ZSRVFVRU5DWToKLQkJewotCQkJc3RydWN0IHY0bDJfZnJlcXVlbmN5ICpmID0gYXJnOwotCi0JCQlpZiAoIChmLT5mcmVxdWVuY3kgPCBHRU1URUtfUENJX1JBTkdFX0xPVykgfHwKLQkJCSAgICAgKGYtPmZyZXF1ZW5jeSA+IEdFTVRFS19QQ0lfUkFOR0VfSElHSCkgKQotCQkJCXJldHVybiAtRUlOVkFMOwotCi0KLQkJCWdlbXRla19wY2lfc2V0ZnJlcXVlbmN5KCBjYXJkLCBmLT5mcmVxdWVuY3kgKTsKLQkJCWNhcmQtPmN1cnJlbnRfZnJlcXVlbmN5ID0gZi0+ZnJlcXVlbmN5OwotCQkJY2FyZC0+bXV0ZSA9IGZhbHNlOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJY2FzZSBWSURJT0NfUVVFUllDVFJMOgotCQl7Ci0JCQlzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKnFjID0gYXJnOwotCQkJaW50IGk7Ci0KLQkJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHJhZGlvX3FjdHJsKTsgaSsrKSB7Ci0JCQkJaWYgKHFjLT5pZCAmJiBxYy0+aWQgPT0gcmFkaW9fcWN0cmxbaV0uaWQpIHsKLQkJCQkJbWVtY3B5KHFjLCAmKHJhZGlvX3FjdHJsW2ldKSwKLQkJCQkJCQkJc2l6ZW9mKCpxYykpOwotCQkJCQlyZXR1cm4gKDApOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCWNhc2UgVklESU9DX0dfQ1RSTDoKLQkJewotCQkJc3RydWN0IHY0bDJfY29udHJvbCAqY3RybD0gYXJnOwotCi0JCQlzd2l0Y2ggKGN0cmwtPmlkKSB7Ci0JCQkJY2FzZSBWNEwyX0NJRF9BVURJT19NVVRFOgotCQkJCQljdHJsLT52YWx1ZT1jYXJkLT5tdXRlOwotCQkJCQlyZXR1cm4gKDApOwotCQkJCWNhc2UgVjRMMl9DSURfQVVESU9fVk9MVU1FOgotCQkJCQlpZiAoY2FyZC0+bXV0ZSkKLQkJCQkJCWN0cmwtPnZhbHVlPTA7Ci0JCQkJCWVsc2UKLQkJCQkJCWN0cmwtPnZhbHVlPTY1NTM1OwotCQkJCQlyZXR1cm4gKDApOwotCQkJfQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJY2FzZSBWSURJT0NfU19DVFJMOgotCQl7Ci0JCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsPSBhcmc7Ci0KLQkJCXN3aXRjaCAoY3RybC0+aWQpIHsKLQkJCQljYXNlIFY0TDJfQ0lEX0FVRElPX01VVEU6Ci0JCQkJCWlmIChjdHJsLT52YWx1ZSkgewotCQkJCQkJZ2VtdGVrX3BjaV9tdXRlKGNhcmQpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJZ2VtdGVrX3BjaV91bm11dGUoY2FyZCk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuICgwKTsKLQkJCQljYXNlIFY0TDJfQ0lEX0FVRElPX1ZPTFVNRToKLQkJCQkJaWYgKGN0cmwtPnZhbHVlKSB7Ci0JCQkJCQlnZW10ZWtfcGNpX3VubXV0ZShjYXJkKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWdlbXRla19wY2lfbXV0ZShjYXJkKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gKDApOwotCQkJfQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJZGVmYXVsdDoKLQkJCXJldHVybiB2NGxfY29tcGF0X3RyYW5zbGF0ZV9pb2N0bChpbm9kZSxmaWxlLGNtZCxhcmcsCi0JCQkJCQkJICBnZW10ZWtfcGNpX2RvX2lvY3RsKTsKLQl9CisJc3RyY3B5KHYtPm5hbWUsICJGTSIpOworCXYtPnR5cGUgPSBWNEwyX1RVTkVSX1JBRElPOworCXYtPnJhbmdlbG93ID0gR0VNVEVLX1BDSV9SQU5HRV9MT1c7CisJdi0+cmFuZ2VoaWdoID0gR0VNVEVLX1BDSV9SQU5HRV9ISUdIOworCXYtPnJ4c3ViY2hhbnMgPSBWNEwyX1RVTkVSX1NVQl9NT05POworCXYtPmNhcGFiaWxpdHkgPSBWNEwyX1RVTkVSX0NBUF9MT1c7CisJdi0+YXVkbW9kZSA9IFY0TDJfVFVORVJfTU9ERV9NT05POworCXYtPnNpZ25hbCA9IDB4ZmZmZiAqIGdlbXRla19wY2lfZ2V0c2lnbmFsKGNhcmQpOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGdlbXRla19wY2lfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCitzdGF0aWMgaW50IHZpZGlvY19zX3R1bmVyKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCQlzdHJ1Y3QgdjRsMl90dW5lciAqdikKIHsKLQlyZXR1cm4gdmlkZW9fdXNlcmNvcHkoaW5vZGUsIGZpbGUsIGNtZCwgYXJnLCBnZW10ZWtfcGNpX2RvX2lvY3RsKTsKKwlpZiAodi0+aW5kZXggPiAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2Nfc19mcmVxdWVuY3koc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJCXN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSAqZikKK3sKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOworCXN0cnVjdCBnZW10ZWtfcGNpX2NhcmQgKmNhcmQgPSBkZXYtPnByaXY7CisKKwlpZiAoIChmLT5mcmVxdWVuY3kgPCBHRU1URUtfUENJX1JBTkdFX0xPVykgfHwKKwkJCShmLT5mcmVxdWVuY3kgPiBHRU1URUtfUENJX1JBTkdFX0hJR0gpICkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZ2VtdGVrX3BjaV9zZXRmcmVxdWVuY3koY2FyZCwgZi0+ZnJlcXVlbmN5KTsKKwljYXJkLT5jdXJyZW50X2ZyZXF1ZW5jeSA9IGYtPmZyZXF1ZW5jeTsKKwljYXJkLT5tdXRlID0gZmFsc2U7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX2dfZnJlcXVlbmN5KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCQlzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgKmYpCit7CisJc3RydWN0IHZpZGVvX2RldmljZSAqZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKKwlzdHJ1Y3QgZ2VtdGVrX3BjaV9jYXJkICpjYXJkID0gZGV2LT5wcml2OworCisJZi0+dHlwZSA9IFY0TDJfVFVORVJfUkFESU87CisJZi0+ZnJlcXVlbmN5ID0gY2FyZC0+Y3VycmVudF9mcmVxdWVuY3k7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX3F1ZXJ5Y3RybChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQkJc3RydWN0IHY0bDJfcXVlcnljdHJsICpxYykKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShyYWRpb19xY3RybCk7IGkrKykgeworCQlpZiAocWMtPmlkICYmIHFjLT5pZCA9PSByYWRpb19xY3RybFtpXS5pZCkgeworCQkJbWVtY3B5KHFjLCAmKHJhZGlvX3FjdHJsW2ldKSwKKwkJCQkJCXNpemVvZigqcWMpKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IHZpZGlvY19nX2N0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCit7CisJc3RydWN0IHZpZGVvX2RldmljZSAqZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKKwlzdHJ1Y3QgZ2VtdGVrX3BjaV9jYXJkICpjYXJkID0gZGV2LT5wcml2OworCisJc3dpdGNoIChjdHJsLT5pZCkgeworCWNhc2UgVjRMMl9DSURfQVVESU9fTVVURToKKwkJY3RybC0+dmFsdWUgPSBjYXJkLT5tdXRlOworCQlyZXR1cm4gMDsKKwljYXNlIFY0TDJfQ0lEX0FVRElPX1ZPTFVNRToKKwkJaWYgKGNhcmQtPm11dGUpCisJCQljdHJsLT52YWx1ZSA9IDA7CisJCWVsc2UKKwkJCWN0cmwtPnZhbHVlID0gNjU1MzU7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCB2aWRpb2Nfc19jdHJsKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQoreworCXN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7CisJc3RydWN0IGdlbXRla19wY2lfY2FyZCAqY2FyZCA9IGRldi0+cHJpdjsKKworCXN3aXRjaCAoY3RybC0+aWQpIHsKKwljYXNlIFY0TDJfQ0lEX0FVRElPX01VVEU6CisJCWlmIChjdHJsLT52YWx1ZSkKKwkJCWdlbXRla19wY2lfbXV0ZShjYXJkKTsKKwkJZWxzZQorCQkJZ2VtdGVrX3BjaV91bm11dGUoY2FyZCk7CisJCXJldHVybiAwOworCWNhc2UgVjRMMl9DSURfQVVESU9fVk9MVU1FOgorCQlpZiAoY3RybC0+dmFsdWUpCisJCQlnZW10ZWtfcGNpX3VubXV0ZShjYXJkKTsKKwkJZWxzZQorCQkJZ2VtdGVrX3BjaV9tdXRlKGNhcmQpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX2dfYXVkaW8oc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJCXN0cnVjdCB2NGwyX2F1ZGlvICphKQoreworCWlmIChhLT5pbmRleCA+IDEpCisJCXJldHVybiAtRUlOVkFMOworCisJc3RyY3B5KGEtPm5hbWUsICJSYWRpbyIpOworCWEtPmNhcGFiaWxpdHkgPSBWNEwyX0FVRENBUF9TVEVSRU87CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX2dfaW5wdXQoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnByaXYsIHVuc2lnbmVkIGludCAqaSkKK3sKKwkqaSA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX3NfaW5wdXQoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnByaXYsIHVuc2lnbmVkIGludCBpKQoreworCWlmIChpICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpZGlvY19zX2F1ZGlvKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCQlzdHJ1Y3QgdjRsMl9hdWRpbyAqYSkKK3sKKwlpZiAoYS0+aW5kZXggIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDA7CiB9CiAKIGVudW0gewpAQCAtMzQyLDcgKzM2OSw3IEBACiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCS5vcGVuICAgICAgICAgICA9IHZpZGVvX2V4Y2x1c2l2ZV9vcGVuLAogCS5yZWxlYXNlICAgICAgICA9IHZpZGVvX2V4Y2x1c2l2ZV9yZWxlYXNlLAotCS5pb2N0bAkJPSBnZW10ZWtfcGNpX2lvY3RsLAorCS5pb2N0bAkJPSB2aWRlb19pb2N0bDIsCiAJLmNvbXBhdF9pb2N0bAk9IHY0bF9jb21wYXRfaW9jdGwzMiwKIAkubGxzZWVrICAgICAgICAgPSBub19sbHNlZWssCiB9OwpAQCAtMzUzLDYgKzM4MCwxOCBAQAogCS50eXBlICAgICAgICAgID0gVklEX1RZUEVfVFVORVIsCiAJLmhhcmR3YXJlICAgICAgPSAwLAogCS5mb3BzICAgICAgICAgID0gJmdlbXRla19wY2lfZm9wcywKKwkudmlkaW9jX3F1ZXJ5Y2FwICAgID0gdmlkaW9jX3F1ZXJ5Y2FwLAorCS52aWRpb2NfZ190dW5lciAgICAgPSB2aWRpb2NfZ190dW5lciwKKwkudmlkaW9jX3NfdHVuZXIgICAgID0gdmlkaW9jX3NfdHVuZXIsCisJLnZpZGlvY19nX2F1ZGlvICAgICA9IHZpZGlvY19nX2F1ZGlvLAorCS52aWRpb2Nfc19hdWRpbyAgICAgPSB2aWRpb2Nfc19hdWRpbywKKwkudmlkaW9jX2dfaW5wdXQgICAgID0gdmlkaW9jX2dfaW5wdXQsCisJLnZpZGlvY19zX2lucHV0ICAgICA9IHZpZGlvY19zX2lucHV0LAorCS52aWRpb2NfZ19mcmVxdWVuY3kgPSB2aWRpb2NfZ19mcmVxdWVuY3ksCisJLnZpZGlvY19zX2ZyZXF1ZW5jeSA9IHZpZGlvY19zX2ZyZXF1ZW5jeSwKKwkudmlkaW9jX3F1ZXJ5Y3RybCAgID0gdmlkaW9jX3F1ZXJ5Y3RybCwKKwkudmlkaW9jX2dfY3RybCAgICAgID0gdmlkaW9jX2dfY3RybCwKKwkudmlkaW9jX3NfY3RybCAgICAgID0gdmlkaW9jX3NfY3RybCwKIH07CiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IGdlbXRla19wY2lfcHJvYmUoIHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcGNpX2lkICkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tZ2VtdGVrLmMgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLWdlbXRlay5jCmluZGV4IDM2YzRiZTYuLmIwNGI2YTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tZ2VtdGVrLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1nZW10ZWsuYwpAQCAtMTYxLDEzNyArMTYxLDE1NyBAQAogCXJldHVybiAxOwkJLyogc2lnbmFsIHByZXNlbnQgKi8KIH0KIAotc3RhdGljIGludCBnZW10ZWtfZG9faW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkgICB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCitzdGF0aWMgaW50IHZpZGlvY19xdWVyeWNhcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAgKnByaXYsCisJCQkJCXN0cnVjdCB2NGwyX2NhcGFiaWxpdHkgKnYpCiB7Ci0Jc3RydWN0IHZpZGVvX2RldmljZSAqZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKLQlzdHJ1Y3QgZ2VtdGVrX2RldmljZSAqcnQ9ZGV2LT5wcml2OwotCi0Jc3dpdGNoKGNtZCkKLQl7Ci0JCWNhc2UgVklESU9DX1FVRVJZQ0FQOgotCQl7Ci0JCQlzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5ICp2ID0gYXJnOwotCQkJbWVtc2V0KHYsMCxzaXplb2YoKnYpKTsKLQkJCXN0cmxjcHkodi0+ZHJpdmVyLCAicmFkaW8tZ2VtdGVrIiwgc2l6ZW9mICh2LT5kcml2ZXIpKTsKLQkJCXN0cmxjcHkodi0+Y2FyZCwgIkdlbVRlayIsIHNpemVvZiAodi0+Y2FyZCkpOwotCQkJc3ByaW50Zih2LT5idXNfaW5mbywiSVNBIik7Ci0JCQl2LT52ZXJzaW9uID0gUkFESU9fVkVSU0lPTjsKLQkJCXYtPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX1RVTkVSOwotCi0JCQlyZXR1cm4gMDsKLQkJfQotCQljYXNlIFZJRElPQ19HX1RVTkVSOgotCQl7Ci0JCQlzdHJ1Y3QgdjRsMl90dW5lciAqdiA9IGFyZzsKLQotCQkJaWYgKHYtPmluZGV4ID4gMCkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQotCQkJbWVtc2V0KHYsMCxzaXplb2YoKnYpKTsKLQkJCXN0cmNweSh2LT5uYW1lLCAiRk0iKTsKLQkJCXYtPnR5cGUgPSBWNEwyX1RVTkVSX1JBRElPOwotCi0JCQl2LT5yYW5nZWxvdz0oODcqMTYwMDApOwotCQkJdi0+cmFuZ2VoaWdoPSgxMDgqMTYwMDApOwotCQkJdi0+cnhzdWJjaGFucyA9VjRMMl9UVU5FUl9TVUJfTU9OTzsKLQkJCXYtPmNhcGFiaWxpdHk9VjRMMl9UVU5FUl9DQVBfTE9XOwotCQkJdi0+YXVkbW9kZSA9IFY0TDJfVFVORVJfTU9ERV9NT05POwotCQkJdi0+c2lnbmFsPTB4RkZGRipnZW10ZWtfZ2V0c2lnc3RyKHJ0KTsKLQotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJY2FzZSBWSURJT0NfU19UVU5FUjoKLQkJewotCQkJc3RydWN0IHY0bDJfdHVuZXIgKnYgPSBhcmc7Ci0KLQkJCWlmICh2LT5pbmRleCA+IDApCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJCXJldHVybiAwOwotCQl9Ci0JCWNhc2UgVklESU9DX1NfRlJFUVVFTkNZOgotCQl7Ci0JCQlzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgKmYgPSBhcmc7Ci0KLQkJCXJ0LT5jdXJmcmVxID0gZi0+ZnJlcXVlbmN5OwotCQkJLyogbmVlZHMgdG8gYmUgY2FsbGVkIHR3aWNlIGluIG9yZGVyIGZvciBnZXRzaWdzdHIgdG8gd29yayAqLwotCQkJZ2VtdGVrX3NldGZyZXEocnQsIHJ0LT5jdXJmcmVxKTsKLQkJCWdlbXRla19zZXRmcmVxKHJ0LCBydC0+Y3VyZnJlcSk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQljYXNlIFZJRElPQ19HX0ZSRVFVRU5DWToKLQkJewotCQkJc3RydWN0IHY0bDJfZnJlcXVlbmN5ICpmID0gYXJnOwotCi0JCQlmLT50eXBlID0gVjRMMl9UVU5FUl9SQURJTzsKLQkJCWYtPmZyZXF1ZW5jeSA9IHJ0LT5jdXJmcmVxOwotCi0JCQlyZXR1cm4gMDsKLQkJfQotCQljYXNlIFZJRElPQ19RVUVSWUNUUkw6Ci0JCXsKLQkJCXN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWMgPSBhcmc7Ci0JCQlpbnQgaTsKLQotCQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocmFkaW9fcWN0cmwpOyBpKyspIHsKLQkJCQlpZiAocWMtPmlkICYmIHFjLT5pZCA9PSByYWRpb19xY3RybFtpXS5pZCkgewotCQkJCQltZW1jcHkocWMsICYocmFkaW9fcWN0cmxbaV0pLAotCQkJCQkJCQlzaXplb2YoKnFjKSk7Ci0JCQkJCXJldHVybiAoMCk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJY2FzZSBWSURJT0NfR19DVFJMOgotCQl7Ci0JCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsPSBhcmc7Ci0KLQkJCXN3aXRjaCAoY3RybC0+aWQpIHsKLQkJCQljYXNlIFY0TDJfQ0lEX0FVRElPX01VVEU6Ci0JCQkJCWN0cmwtPnZhbHVlPXJ0LT5tdXRlZDsKLQkJCQkJcmV0dXJuICgwKTsKLQkJCQljYXNlIFY0TDJfQ0lEX0FVRElPX1ZPTFVNRToKLQkJCQkJaWYgKHJ0LT5tdXRlZCkKLQkJCQkJCWN0cmwtPnZhbHVlPTA7Ci0JCQkJCWVsc2UKLQkJCQkJCWN0cmwtPnZhbHVlPTY1NTM1OwotCQkJCQlyZXR1cm4gKDApOwotCQkJfQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJY2FzZSBWSURJT0NfU19DVFJMOgotCQl7Ci0JCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsPSBhcmc7Ci0KLQkJCXN3aXRjaCAoY3RybC0+aWQpIHsKLQkJCQljYXNlIFY0TDJfQ0lEX0FVRElPX01VVEU6Ci0JCQkJCWlmIChjdHJsLT52YWx1ZSkgewotCQkJCQkJZ2VtdGVrX211dGUocnQpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJZ2VtdGVrX3VubXV0ZShydCk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuICgwKTsKLQkJCQljYXNlIFY0TDJfQ0lEX0FVRElPX1ZPTFVNRToKLQkJCQkJaWYgKGN0cmwtPnZhbHVlKSB7Ci0JCQkJCQlnZW10ZWtfdW5tdXRlKHJ0KTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWdlbXRla19tdXRlKHJ0KTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gKDApOwotCQkJfQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJZGVmYXVsdDoKLQkJCXJldHVybiB2NGxfY29tcGF0X3RyYW5zbGF0ZV9pb2N0bChpbm9kZSxmaWxlLGNtZCxhcmcsCi0JCQkJCQkJICBnZW10ZWtfZG9faW9jdGwpOwotCX0KKwlzdHJsY3B5KHYtPmRyaXZlciwgInJhZGlvLWdlbXRlayIsIHNpemVvZih2LT5kcml2ZXIpKTsKKwlzdHJsY3B5KHYtPmNhcmQsICJHZW1UZWsiLCBzaXplb2Yodi0+Y2FyZCkpOworCXNwcmludGYodi0+YnVzX2luZm8sICJJU0EiKTsKKwl2LT52ZXJzaW9uID0gUkFESU9fVkVSU0lPTjsKKwl2LT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9UVU5FUjsKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBnZW10ZWtfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCi0JCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3N0YXRpYyBpbnQgdmlkaW9jX2dfdHVuZXIoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJCXN0cnVjdCB2NGwyX3R1bmVyICp2KQogewotCXJldHVybiB2aWRlb191c2VyY29weShpbm9kZSwgZmlsZSwgY21kLCBhcmcsIGdlbXRla19kb19pb2N0bCk7CisJc3RydWN0IHZpZGVvX2RldmljZSAqZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKKwlzdHJ1Y3QgZ2VtdGVrX2RldmljZSAqcnQgPSBkZXYtPnByaXY7CisKKwlpZiAodi0+aW5kZXggPiAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN0cmNweSh2LT5uYW1lLCAiRk0iKTsKKwl2LT50eXBlID0gVjRMMl9UVU5FUl9SQURJTzsKKwl2LT5yYW5nZWxvdyA9ICg4NyoxNjAwMCk7CisJdi0+cmFuZ2VoaWdoID0gKDEwOCoxNjAwMCk7CisJdi0+cnhzdWJjaGFucyA9IFY0TDJfVFVORVJfU1VCX01PTk87CisJdi0+Y2FwYWJpbGl0eSA9IFY0TDJfVFVORVJfQ0FQX0xPVzsKKwl2LT5hdWRtb2RlID0gVjRMMl9UVU5FUl9NT0RFX01PTk87CisJdi0+c2lnbmFsID0gMHhmZmZmKmdlbXRla19nZXRzaWdzdHIocnQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpZGlvY19zX3R1bmVyKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCQlzdHJ1Y3QgdjRsMl90dW5lciAqdikKK3sKKwlpZiAodi0+aW5kZXggPiAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2Nfc19mcmVxdWVuY3koc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJCXN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSAqZikKK3sKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOworCXN0cnVjdCBnZW10ZWtfZGV2aWNlICpydCA9IGRldi0+cHJpdjsKKworCXJ0LT5jdXJmcmVxID0gZi0+ZnJlcXVlbmN5OworCS8qIG5lZWRzIHRvIGJlIGNhbGxlZCB0d2ljZSBpbiBvcmRlciBmb3IgZ2V0c2lnc3RyIHRvIHdvcmsgKi8KKwlnZW10ZWtfc2V0ZnJlcShydCwgcnQtPmN1cmZyZXEpOworCWdlbXRla19zZXRmcmVxKHJ0LCBydC0+Y3VyZnJlcSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX2dfZnJlcXVlbmN5KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCQlzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgKmYpCit7CisJc3RydWN0IHZpZGVvX2RldmljZSAqZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKKwlzdHJ1Y3QgZ2VtdGVrX2RldmljZSAqcnQgPSBkZXYtPnByaXY7CisKKwlmLT50eXBlID0gVjRMMl9UVU5FUl9SQURJTzsKKwlmLT5mcmVxdWVuY3kgPSBydC0+Y3VyZnJlcTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2NfcXVlcnljdHJsKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCQlzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKnFjKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocmFkaW9fcWN0cmwpOyBpKyspIHsKKwkJaWYgKHFjLT5pZCAmJiBxYy0+aWQgPT0gcmFkaW9fcWN0cmxbaV0uaWQpIHsKKwkJCW1lbWNweShxYywgJihyYWRpb19xY3RybFtpXSksCisJCQkJCQlzaXplb2YoKnFjKSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCB2aWRpb2NfZ19jdHJsKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQoreworCXN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7CisJc3RydWN0IGdlbXRla19kZXZpY2UgKnJ0ID0gZGV2LT5wcml2OworCisJc3dpdGNoIChjdHJsLT5pZCkgeworCWNhc2UgVjRMMl9DSURfQVVESU9fTVVURToKKwkJY3RybC0+dmFsdWUgPSBydC0+bXV0ZWQ7CisJCXJldHVybiAwOworCWNhc2UgVjRMMl9DSURfQVVESU9fVk9MVU1FOgorCQlpZiAocnQtPm11dGVkKQorCQkJY3RybC0+dmFsdWUgPSAwOworCQllbHNlCisJCQljdHJsLT52YWx1ZSA9IDY1NTM1OworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX3NfY3RybChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQkJc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKK3sKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOworCXN0cnVjdCBnZW10ZWtfZGV2aWNlICpydCA9IGRldi0+cHJpdjsKKworCXN3aXRjaCAoY3RybC0+aWQpIHsKKwljYXNlIFY0TDJfQ0lEX0FVRElPX01VVEU6CisJCWlmIChjdHJsLT52YWx1ZSkKKwkJCWdlbXRla19tdXRlKHJ0KTsKKwkJZWxzZQorCQkJZ2VtdGVrX3VubXV0ZShydCk7CisJCXJldHVybiAwOworCWNhc2UgVjRMMl9DSURfQVVESU9fVk9MVU1FOgorCQlpZiAoY3RybC0+dmFsdWUpCisJCQlnZW10ZWtfdW5tdXRlKHJ0KTsKKwkJZWxzZQorCQkJZ2VtdGVrX211dGUocnQpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX2dfYXVkaW8gKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCQlzdHJ1Y3QgdjRsMl9hdWRpbyAqYSkKK3sKKwlpZiAoYS0+aW5kZXggPiAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN0cmNweShhLT5uYW1lLCAiUmFkaW8iKTsKKwlhLT5jYXBhYmlsaXR5ID0gVjRMMl9BVURDQVBfU1RFUkVPOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpZGlvY19nX2lucHV0KHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwcml2LCB1bnNpZ25lZCBpbnQgKmkpCit7CisJKmkgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpZGlvY19zX2lucHV0KHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwcml2LCB1bnNpZ25lZCBpbnQgaSkKK3sKKwlpZiAoaSAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2Nfc19hdWRpbyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQkJc3RydWN0IHY0bDJfYXVkaW8gKmEpCit7CisJaWYgKGEtPmluZGV4ICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgc3RydWN0IGdlbXRla19kZXZpY2UgZ2VtdGVrX3VuaXQ7CkBAIC0zMDAsNyArMzIwLDcgQEAKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLm9wZW4gICAgICAgICAgID0gdmlkZW9fZXhjbHVzaXZlX29wZW4sCiAJLnJlbGVhc2UgICAgICAgID0gdmlkZW9fZXhjbHVzaXZlX3JlbGVhc2UsCi0JLmlvY3RsCQk9IGdlbXRla19pb2N0bCwKKwkuaW9jdGwJCT0gdmlkZW9faW9jdGwyLAogCS5jb21wYXRfaW9jdGwJPSB2NGxfY29tcGF0X2lvY3RsMzIsCiAJLmxsc2VlayAgICAgICAgID0gbm9fbGxzZWVrLAogfTsKQEAgLTMxMiw2ICszMzIsMTggQEAKIAkudHlwZQkJPSBWSURfVFlQRV9UVU5FUiwKIAkuaGFyZHdhcmUJPSAwLAogCS5mb3BzICAgICAgICAgICA9ICZnZW10ZWtfZm9wcywKKwkudmlkaW9jX3F1ZXJ5Y2FwICAgID0gdmlkaW9jX3F1ZXJ5Y2FwLAorCS52aWRpb2NfZ190dW5lciAgICAgPSB2aWRpb2NfZ190dW5lciwKKwkudmlkaW9jX3NfdHVuZXIgICAgID0gdmlkaW9jX3NfdHVuZXIsCisJLnZpZGlvY19nX2F1ZGlvICAgICA9IHZpZGlvY19nX2F1ZGlvLAorCS52aWRpb2Nfc19hdWRpbyAgICAgPSB2aWRpb2Nfc19hdWRpbywKKwkudmlkaW9jX2dfaW5wdXQgICAgID0gdmlkaW9jX2dfaW5wdXQsCisJLnZpZGlvY19zX2lucHV0ICAgICA9IHZpZGlvY19zX2lucHV0LAorCS52aWRpb2NfZ19mcmVxdWVuY3kgPSB2aWRpb2NfZ19mcmVxdWVuY3ksCisJLnZpZGlvY19zX2ZyZXF1ZW5jeSA9IHZpZGlvY19zX2ZyZXF1ZW5jeSwKKwkudmlkaW9jX3F1ZXJ5Y3RybCAgID0gdmlkaW9jX3F1ZXJ5Y3RybCwKKwkudmlkaW9jX2dfY3RybCAgICAgID0gdmlkaW9jX2dfY3RybCwKKwkudmlkaW9jX3NfY3RybCAgICAgID0gdmlkaW9jX3NfY3RybCwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGdlbXRla19pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLW1hZXN0cm8uYyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tbWFlc3Ryby5jCmluZGV4IGU2N2I3ZjIuLjExZjgwY2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tbWFlc3Ryby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tbWFlc3Ryby5jCkBAIC03NSw4ICs3NSw2IEBACiBzdGF0aWMgaW50IHJhZGlvX25yID0gLTE7CiBtb2R1bGVfcGFyYW0ocmFkaW9fbnIsIGludCwgMCk7CiAKLXN0YXRpYyBpbnQgcmFkaW9faW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCi0JdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwogc3RhdGljIGludCBtYWVzdHJvX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KTsKIHN0YXRpYyB2b2lkIG1hZXN0cm9fcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKIApAQCAtMTAyLDE4ICsxMDAsMTEgQEAKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLm9wZW4gICAgICAgICAgID0gdmlkZW9fZXhjbHVzaXZlX29wZW4sCiAJLnJlbGVhc2UgICAgICAgID0gdmlkZW9fZXhjbHVzaXZlX3JlbGVhc2UsCi0JLmlvY3RsCQk9IHJhZGlvX2lvY3RsLAorCS5pb2N0bAkJPSB2aWRlb19pb2N0bDIsCiAJLmNvbXBhdF9pb2N0bAk9IHY0bF9jb21wYXRfaW9jdGwzMiwKIAkubGxzZWVrICAgICAgICAgPSBub19sbHNlZWssCiB9OwogCi1zdGF0aWMgc3RydWN0IHZpZGVvX2RldmljZSBtYWVzdHJvX3JhZGlvID0gewotCS5uYW1lCQk9ICJNYWVzdHJvIHJhZGlvIiwKLQkudHlwZQkJPSBWSURfVFlQRV9UVU5FUiwKLQkuaGFyZHdhcmUJPSAwLAotCS5mb3BzCQk9ICZtYWVzdHJvX2ZvcHMsCi19OwotCiBzdHJ1Y3QgcmFkaW9fZGV2aWNlIHsKIAl1MTYJaW8sCS8qIGJhc2Ugb2YgTWFlc3RybyBjYXJkIHJhZGlvIGlvIChHUElPX0RBVEEpKi8KIAkJbXV0ZWQsCS8qIFZJREVPX0FVRElPX01VVEUgKi8KQEAgLTE5MCwxNDIgKzE4MSwxNTMgQEAKIAltc2xlZXAoMTI1KTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgcmFkaW9fZnVuY3Rpb24oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCi0JdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQorc3RhdGljIGludCB2aWRpb2NfcXVlcnljYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgICpwcml2LAorCQkJCQlzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5ICp2KQogewotCXN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7Ci0Jc3RydWN0IHJhZGlvX2RldmljZSAqY2FyZCA9IHZpZGVvX2dldF9kcnZkYXRhKGRldik7Ci0KLQlzd2l0Y2ggKGNtZCkgewotCQljYXNlIFZJRElPQ19RVUVSWUNBUDoKLQkJewotCQkJc3RydWN0IHY0bDJfY2FwYWJpbGl0eSAqdiA9IGFyZzsKLQkJCW1lbXNldCh2LDAsc2l6ZW9mKCp2KSk7Ci0JCQlzdHJsY3B5KHYtPmRyaXZlciwgInJhZGlvLW1hZXN0cm8iLCBzaXplb2YgKHYtPmRyaXZlcikpOwotCQkJc3RybGNweSh2LT5jYXJkLCAiTWFlc3RybyBSYWRpbyIsIHNpemVvZiAodi0+Y2FyZCkpOwotCQkJc3ByaW50Zih2LT5idXNfaW5mbywiUENJIik7Ci0JCQl2LT52ZXJzaW9uID0gUkFESU9fVkVSU0lPTjsKLQkJCXYtPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX1RVTkVSOwotCi0JCQlyZXR1cm4gMDsKLQkJfQotCQljYXNlIFZJRElPQ19HX1RVTkVSOgotCQl7Ci0JCQlzdHJ1Y3QgdjRsMl90dW5lciAqdiA9IGFyZzsKLQotCQkJaWYgKHYtPmluZGV4ID4gMCkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQotCQkJKHZvaWQpcmFkaW9fYml0c19nZXQoY2FyZCk7Ci0KLQkJCW1lbXNldCh2LDAsc2l6ZW9mKCp2KSk7Ci0JCQlzdHJjcHkodi0+bmFtZSwgIkZNIik7Ci0JCQl2LT50eXBlID0gVjRMMl9UVU5FUl9SQURJTzsKLQotCQkJdi0+cmFuZ2Vsb3cgPSBGUkVRX0xPOwotCQkJdi0+cmFuZ2VoaWdoID0gRlJFUV9ISTsKLQkJCXYtPnJ4c3ViY2hhbnMgPVY0TDJfVFVORVJfU1VCX01PTk98VjRMMl9UVU5FUl9TVUJfU1RFUkVPOwotCQkJdi0+Y2FwYWJpbGl0eT1WNEwyX1RVTkVSX0NBUF9MT1c7Ci0JCQlpZihjYXJkLT5zdGVyZW8pCi0JCQkJdi0+YXVkbW9kZSA9IFY0TDJfVFVORVJfTU9ERV9TVEVSRU87Ci0JCQllbHNlCi0JCQkJdi0+YXVkbW9kZSA9IFY0TDJfVFVORVJfTU9ERV9NT05POwotCQkJdi0+c2lnbmFsPWNhcmQtPnR1bmVkOwotCi0JCQlyZXR1cm4gMDsKLQkJfQotCQljYXNlIFZJRElPQ19TX1RVTkVSOgotCQl7Ci0JCQlzdHJ1Y3QgdjRsMl90dW5lciAqdiA9IGFyZzsKLQotCQkJaWYgKHYtPmluZGV4ID4gMCkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJY2FzZSBWSURJT0NfU19GUkVRVUVOQ1k6Ci0JCXsKLQkJCXN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSAqZiA9IGFyZzsKLQotCQkJaWYgKGYtPmZyZXF1ZW5jeSA8IEZSRVFfTE8gfHwgZi0+ZnJlcXVlbmN5ID4gRlJFUV9ISSkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCXJhZGlvX2JpdHNfc2V0KGNhcmQsIEZSRVEyQklUUyhmLT5mcmVxdWVuY3kpKTsKLQotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJY2FzZSBWSURJT0NfR19GUkVRVUVOQ1k6Ci0JCXsKLQkJCXN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSAqZiA9IGFyZzsKLQotCQkJZi0+dHlwZSA9IFY0TDJfVFVORVJfUkFESU87Ci0JCQlmLT5mcmVxdWVuY3kgPSBCSVRTMkZSRVEocmFkaW9fYml0c19nZXQoY2FyZCkpOwotCi0JCQlyZXR1cm4gMDsKLQkJfQotCQljYXNlIFZJRElPQ19RVUVSWUNUUkw6Ci0JCXsKLQkJCXN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWMgPSBhcmc7Ci0JCQlpbnQgaTsKLQotCQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocmFkaW9fcWN0cmwpOyBpKyspIHsKLQkJCQlpZiAocWMtPmlkICYmIHFjLT5pZCA9PSByYWRpb19xY3RybFtpXS5pZCkgewotCQkJCQltZW1jcHkocWMsICYocmFkaW9fcWN0cmxbaV0pLAotCQkJCQkJCQlzaXplb2YoKnFjKSk7Ci0JCQkJCXJldHVybiAoMCk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJY2FzZSBWSURJT0NfR19DVFJMOgotCQl7Ci0JCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsPSBhcmc7Ci0KLQkJCXN3aXRjaCAoY3RybC0+aWQpIHsKLQkJCQljYXNlIFY0TDJfQ0lEX0FVRElPX01VVEU6Ci0JCQkJCWN0cmwtPnZhbHVlPWNhcmQtPm11dGVkOwotCQkJCQlyZXR1cm4gKDApOwotCQkJfQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJY2FzZSBWSURJT0NfU19DVFJMOgotCQl7Ci0JCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsPSBhcmc7Ci0KLQkJCXN3aXRjaCAoY3RybC0+aWQpIHsKLQkJCQljYXNlIFY0TDJfQ0lEX0FVRElPX01VVEU6Ci0JCQkJewotCQkJCQlyZWdpc3RlciB1MTYgaW8gPSBjYXJkLT5pbzsKLQkJCQkJcmVnaXN0ZXIgdTE2IG9tYXNrID0gaW53KGlvICsgSU9fTUFTSyk7Ci0JCQkJCW91dHcoflNUUl9XUkVOLCBpbyArIElPX01BU0spOwotCQkJCQlvdXR3KChjYXJkLT5tdXRlZCA9IGN0cmwtPnZhbHVlICkgPwotCQkJCQkJU1RSX1dSRU4gOiAwLCBpbyk7Ci0JCQkJCXVkZWxheSg0KTsKLQkJCQkJb3V0dyhvbWFzaywgaW8gKyBJT19NQVNLKTsKLQkJCQkJbXNsZWVwKDEyNSk7Ci0KLQkJCQkJcmV0dXJuICgwKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQlkZWZhdWx0OgotCQkJcmV0dXJuIHY0bF9jb21wYXRfdHJhbnNsYXRlX2lvY3RsKGlub2RlLGZpbGUsY21kLGFyZywKLQkJCQkJCQkgIHJhZGlvX2Z1bmN0aW9uKTsKLQl9CisJc3RybGNweSh2LT5kcml2ZXIsICJyYWRpby1tYWVzdHJvIiwgc2l6ZW9mKHYtPmRyaXZlcikpOworCXN0cmxjcHkodi0+Y2FyZCwgIk1hZXN0cm8gUmFkaW8iLCBzaXplb2Yodi0+Y2FyZCkpOworCXNwcmludGYodi0+YnVzX2luZm8sICJQQ0kiKTsKKwl2LT52ZXJzaW9uID0gUkFESU9fVkVSU0lPTjsKKwl2LT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9UVU5FUjsKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCByYWRpb19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3N0YXRpYyBpbnQgdmlkaW9jX2dfdHVuZXIoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJCXN0cnVjdCB2NGwyX3R1bmVyICp2KQogewogCXN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7CiAJc3RydWN0IHJhZGlvX2RldmljZSAqY2FyZCA9IHZpZGVvX2dldF9kcnZkYXRhKGRldik7Ci0JaW50IHJldDsKIAotCW11dGV4X2xvY2soJmNhcmQtPmxvY2spOwotCXJldCA9IHZpZGVvX3VzZXJjb3B5KGlub2RlLCBmaWxlLCBjbWQsIGFyZywgcmFkaW9fZnVuY3Rpb24pOwotCW11dGV4X3VubG9jaygmY2FyZC0+bG9jayk7CisJaWYgKHYtPmluZGV4ID4gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKLQlyZXR1cm4gcmV0OworCSh2b2lkKXJhZGlvX2JpdHNfZ2V0KGNhcmQpOworCisJc3RyY3B5KHYtPm5hbWUsICJGTSIpOworCXYtPnR5cGUgPSBWNEwyX1RVTkVSX1JBRElPOworCXYtPnJhbmdlbG93ID0gRlJFUV9MTzsKKwl2LT5yYW5nZWhpZ2ggPSBGUkVRX0hJOworCXYtPnJ4c3ViY2hhbnMgPSBWNEwyX1RVTkVSX1NVQl9NT05PfFY0TDJfVFVORVJfU1VCX1NURVJFTzsKKwl2LT5jYXBhYmlsaXR5ID0gVjRMMl9UVU5FUl9DQVBfTE9XOworCWlmKGNhcmQtPnN0ZXJlbykKKwkJdi0+YXVkbW9kZSA9IFY0TDJfVFVORVJfTU9ERV9TVEVSRU87CisJZWxzZQorCQl2LT5hdWRtb2RlID0gVjRMMl9UVU5FUl9NT0RFX01PTk87CisJdi0+c2lnbmFsID0gY2FyZC0+dHVuZWQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX3NfdHVuZXIoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJCXN0cnVjdCB2NGwyX3R1bmVyICp2KQoreworCWlmICh2LT5pbmRleCA+IDApCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpZGlvY19zX2ZyZXF1ZW5jeShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQkJc3RydWN0IHY0bDJfZnJlcXVlbmN5ICpmKQoreworCXN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7CisJc3RydWN0IHJhZGlvX2RldmljZSAqY2FyZCA9IHZpZGVvX2dldF9kcnZkYXRhKGRldik7CisKKwlpZiAoZi0+ZnJlcXVlbmN5IDwgRlJFUV9MTyB8fCBmLT5mcmVxdWVuY3kgPiBGUkVRX0hJKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyYWRpb19iaXRzX3NldChjYXJkLCBGUkVRMkJJVFMoZi0+ZnJlcXVlbmN5KSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX2dfZnJlcXVlbmN5KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCQlzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgKmYpCit7CisJc3RydWN0IHZpZGVvX2RldmljZSAqZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKKwlzdHJ1Y3QgcmFkaW9fZGV2aWNlICpjYXJkID0gdmlkZW9fZ2V0X2RydmRhdGEoZGV2KTsKKworCWYtPnR5cGUgPSBWNEwyX1RVTkVSX1JBRElPOworCWYtPmZyZXF1ZW5jeSA9IEJJVFMyRlJFUShyYWRpb19iaXRzX2dldChjYXJkKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX3F1ZXJ5Y3RybChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQkJc3RydWN0IHY0bDJfcXVlcnljdHJsICpxYykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHJhZGlvX3FjdHJsKTsgaSsrKSB7CisJCWlmIChxYy0+aWQgJiYgcWMtPmlkID09IHJhZGlvX3FjdHJsW2ldLmlkKSB7CisJCQltZW1jcHkocWMsICYocmFkaW9fcWN0cmxbaV0pLAorCQkJCQkJc2l6ZW9mKCpxYykpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX2dfY3RybChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQkJc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKK3sKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOworCXN0cnVjdCByYWRpb19kZXZpY2UgKmNhcmQgPSB2aWRlb19nZXRfZHJ2ZGF0YShkZXYpOworCisJc3dpdGNoIChjdHJsLT5pZCkgeworCWNhc2UgVjRMMl9DSURfQVVESU9fTVVURToKKwkJY3RybC0+dmFsdWUgPSBjYXJkLT5tdXRlZDsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IHZpZGlvY19zX2N0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCit7CisJc3RydWN0IHZpZGVvX2RldmljZSAqZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKKwlzdHJ1Y3QgcmFkaW9fZGV2aWNlICpjYXJkID0gdmlkZW9fZ2V0X2RydmRhdGEoZGV2KTsKKwlyZWdpc3RlciB1MTYgaW8gPSBjYXJkLT5pbzsKKwlyZWdpc3RlciB1MTYgb21hc2sgPSBpbncoaW8gKyBJT19NQVNLKTsKKworCXN3aXRjaCAoY3RybC0+aWQpIHsKKwljYXNlIFY0TDJfQ0lEX0FVRElPX01VVEU6CisJCW91dHcoflNUUl9XUkVOLCBpbyArIElPX01BU0spOworCQlvdXR3KChjYXJkLT5tdXRlZCA9IGN0cmwtPnZhbHVlICkgPworCQkJCVNUUl9XUkVOIDogMCwgaW8pOworCQl1ZGVsYXkoNCk7CisJCW91dHcob21hc2ssIGlvICsgSU9fTUFTSyk7CisJCW1zbGVlcCgxMjUpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX2dfYXVkaW8oc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJCXN0cnVjdCB2NGwyX2F1ZGlvICphKQoreworCWlmIChhLT5pbmRleCA+IDEpCisJCXJldHVybiAtRUlOVkFMOworCisJc3RyY3B5KGEtPm5hbWUsICJSYWRpbyIpOworCWEtPmNhcGFiaWxpdHkgPSBWNEwyX0FVRENBUF9TVEVSRU87CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX2dfaW5wdXQoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnByaXYsIHVuc2lnbmVkIGludCAqaSkKK3sKKwkqaSA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX3NfaW5wdXQoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnByaXYsIHVuc2lnbmVkIGludCBpKQoreworCWlmIChpICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpZGlvY19zX2F1ZGlvKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCQlzdHJ1Y3QgdjRsMl9hdWRpbyAqYSkKK3sKKwlpZiAoYS0+aW5kZXggIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB1MTYgX19kZXZpbml0IHJhZGlvX3Bvd2VyX29uKHN0cnVjdCByYWRpb19kZXZpY2UgKmRldikKQEAgLTM1Miw2ICszNTQsMjQgQEAKIAlyZXR1cm4gKG9mcmVxID09IHJhZGlvX2JpdHNfZ2V0KGRldikpOwogfQogCitzdGF0aWMgc3RydWN0IHZpZGVvX2RldmljZSBtYWVzdHJvX3JhZGlvID0geworCS5uYW1lICAgICAgICAgICA9ICJNYWVzdHJvIHJhZGlvIiwKKwkudHlwZSAgICAgICAgICAgPSBWSURfVFlQRV9UVU5FUiwKKwkuZm9wcyAgICAgICAgICAgPSAmbWFlc3Ryb19mb3BzLAorCS52aWRpb2NfcXVlcnljYXAgICAgPSB2aWRpb2NfcXVlcnljYXAsCisJLnZpZGlvY19nX3R1bmVyICAgICA9IHZpZGlvY19nX3R1bmVyLAorCS52aWRpb2Nfc190dW5lciAgICAgPSB2aWRpb2Nfc190dW5lciwKKwkudmlkaW9jX2dfYXVkaW8gICAgID0gdmlkaW9jX2dfYXVkaW8sCisJLnZpZGlvY19zX2F1ZGlvICAgICA9IHZpZGlvY19zX2F1ZGlvLAorCS52aWRpb2NfZ19pbnB1dCAgICAgPSB2aWRpb2NfZ19pbnB1dCwKKwkudmlkaW9jX3NfaW5wdXQgICAgID0gdmlkaW9jX3NfaW5wdXQsCisJLnZpZGlvY19nX2ZyZXF1ZW5jeSA9IHZpZGlvY19nX2ZyZXF1ZW5jeSwKKwkudmlkaW9jX3NfZnJlcXVlbmN5ID0gdmlkaW9jX3NfZnJlcXVlbmN5LAorCS52aWRpb2NfcXVlcnljdHJsICAgPSB2aWRpb2NfcXVlcnljdHJsLAorCS52aWRpb2NfZ19jdHJsICAgICAgPSB2aWRpb2NfZ19jdHJsLAorCS52aWRpb2Nfc19jdHJsICAgICAgPSB2aWRpb2Nfc19jdHJsLAorfTsKKwogc3RhdGljIGludCBfX2RldmluaXQgbWFlc3Ryb19wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKIAljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1ydHJhY2syLmMgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXJ0cmFjazIuYwppbmRleCBmNjY4Mzg3Li45YjQ5M2IzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXJ0cmFjazIuYworKysgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXJ0cmFjazIuYwpAQCAtMTIyLDYgKzEyMiwyNiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHZpZGlvY19xdWVyeWNhcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQlzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5ICp2KQoreworCXN0cmxjcHkodi0+ZHJpdmVyLCAicmFkaW8tcnRyYWNrMiIsIHNpemVvZih2LT5kcml2ZXIpKTsKKwlzdHJsY3B5KHYtPmNhcmQsICJSYWRpb1RyYWNrIElJIiwgc2l6ZW9mKHYtPmNhcmQpKTsKKwlzcHJpbnRmKHYtPmJ1c19pbmZvLCAiSVNBIik7CisJdi0+dmVyc2lvbiA9IFJBRElPX1ZFUlNJT047CisJdi0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfVFVORVI7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX3NfdHVuZXIoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJc3RydWN0IHY0bDJfdHVuZXIgKnYpCit7CisJaWYgKHYtPmluZGV4ID4gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBydF9nZXRzaWdzdHIoc3RydWN0IHJ0X2RldmljZSAqZGV2KQogewogCWlmIChpbmIoaW8pICYgMikJLyogYml0IHNldCA9IG5vIHNpZ25hbCBwcmVzZW50CSovCkBAIC0xMjksMTM1ICsxNDksMTM2IEBACiAJcmV0dXJuIDE7CQkvKiBzaWduYWwgcHJlc2VudAkJKi8KIH0KIAotc3RhdGljIGludCBydF9kb19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKK3N0YXRpYyBpbnQgdmlkaW9jX2dfdHVuZXIoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJc3RydWN0IHY0bDJfdHVuZXIgKnYpCiB7CiAJc3RydWN0IHZpZGVvX2RldmljZSAqZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKLQlzdHJ1Y3QgcnRfZGV2aWNlICpydD1kZXYtPnByaXY7CisJc3RydWN0IHJ0X2RldmljZSAqcnQgPSBkZXYtPnByaXY7CiAKLQlzd2l0Y2goY21kKQotCXsKLQkJY2FzZSBWSURJT0NfUVVFUllDQVA6Ci0JCXsKLQkJCXN0cnVjdCB2NGwyX2NhcGFiaWxpdHkgKnYgPSBhcmc7Ci0JCQltZW1zZXQodiwwLHNpemVvZigqdikpOwotCQkJc3RybGNweSh2LT5kcml2ZXIsICJyYWRpby1ydHJhY2syIiwgc2l6ZW9mICh2LT5kcml2ZXIpKTsKLQkJCXN0cmxjcHkodi0+Y2FyZCwgIlJhZGlvVHJhY2sgSUkiLCBzaXplb2YgKHYtPmNhcmQpKTsKLQkJCXNwcmludGYodi0+YnVzX2luZm8sIklTQSIpOwotCQkJdi0+dmVyc2lvbiA9IFJBRElPX1ZFUlNJT047Ci0JCQl2LT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9UVU5FUjsKKwlpZiAodi0+aW5kZXggPiAwKQorCQlyZXR1cm4gLUVJTlZBTDsKIAotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJY2FzZSBWSURJT0NfR19UVU5FUjoKLQkJewotCQkJc3RydWN0IHY0bDJfdHVuZXIgKnYgPSBhcmc7Ci0KLQkJCWlmICh2LT5pbmRleCA+IDApCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJCW1lbXNldCh2LDAsc2l6ZW9mKCp2KSk7Ci0JCQlzdHJjcHkodi0+bmFtZSwgIkZNIik7Ci0JCQl2LT50eXBlID0gVjRMMl9UVU5FUl9SQURJTzsKLQotCQkJdi0+cmFuZ2Vsb3c9KDg4KjE2MDAwKTsKLQkJCXYtPnJhbmdlaGlnaD0oMTA4KjE2MDAwKTsKLQkJCXYtPnJ4c3ViY2hhbnMgPVY0TDJfVFVORVJfU1VCX01PTk87Ci0JCQl2LT5jYXBhYmlsaXR5PVY0TDJfVFVORVJfQ0FQX0xPVzsKLQkJCXYtPmF1ZG1vZGUgPSBWNEwyX1RVTkVSX01PREVfTU9OTzsKLQkJCXYtPnNpZ25hbD0weEZGRkYqcnRfZ2V0c2lnc3RyKHJ0KTsKLQotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJY2FzZSBWSURJT0NfU19UVU5FUjoKLQkJewotCQkJc3RydWN0IHY0bDJfdHVuZXIgKnYgPSBhcmc7Ci0KLQkJCWlmICh2LT5pbmRleCA+IDApCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJCXJldHVybiAwOwotCQl9Ci0JCWNhc2UgVklESU9DX1NfRlJFUVVFTkNZOgotCQl7Ci0JCQlzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgKmYgPSBhcmc7Ci0KLQkJCXJ0LT5jdXJmcmVxID0gZi0+ZnJlcXVlbmN5OwotCQkJcnRfc2V0ZnJlcShydCwgcnQtPmN1cmZyZXEpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJY2FzZSBWSURJT0NfR19GUkVRVUVOQ1k6Ci0JCXsKLQkJCXN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSAqZiA9IGFyZzsKLQotCQkJZi0+dHlwZSA9IFY0TDJfVFVORVJfUkFESU87Ci0JCQlmLT5mcmVxdWVuY3kgPSBydC0+Y3VyZnJlcTsKLQotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJY2FzZSBWSURJT0NfUVVFUllDVFJMOgotCQl7Ci0JCQlzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKnFjID0gYXJnOwotCQkJaW50IGk7Ci0KLQkJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHJhZGlvX3FjdHJsKTsgaSsrKSB7Ci0JCQkJaWYgKHFjLT5pZCAmJiBxYy0+aWQgPT0gcmFkaW9fcWN0cmxbaV0uaWQpIHsKLQkJCQkJbWVtY3B5KHFjLCAmKHJhZGlvX3FjdHJsW2ldKSwKLQkJCQkJCQkJc2l6ZW9mKCpxYykpOwotCQkJCQlyZXR1cm4gKDApOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCWNhc2UgVklESU9DX0dfQ1RSTDoKLQkJewotCQkJc3RydWN0IHY0bDJfY29udHJvbCAqY3RybD0gYXJnOwotCi0JCQlzd2l0Y2ggKGN0cmwtPmlkKSB7Ci0JCQkJY2FzZSBWNEwyX0NJRF9BVURJT19NVVRFOgotCQkJCQljdHJsLT52YWx1ZT1ydC0+bXV0ZWQ7Ci0JCQkJCXJldHVybiAoMCk7Ci0JCQkJY2FzZSBWNEwyX0NJRF9BVURJT19WT0xVTUU6Ci0JCQkJCWlmIChydC0+bXV0ZWQpCi0JCQkJCQljdHJsLT52YWx1ZT0wOwotCQkJCQllbHNlCi0JCQkJCQljdHJsLT52YWx1ZT02NTUzNTsKLQkJCQkJcmV0dXJuICgwKTsKLQkJCX0KLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCWNhc2UgVklESU9DX1NfQ1RSTDoKLQkJewotCQkJc3RydWN0IHY0bDJfY29udHJvbCAqY3RybD0gYXJnOwotCi0JCQlzd2l0Y2ggKGN0cmwtPmlkKSB7Ci0JCQkJY2FzZSBWNEwyX0NJRF9BVURJT19NVVRFOgotCQkJCQlpZiAoY3RybC0+dmFsdWUpIHsKLQkJCQkJCXJ0X211dGUocnQpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJcnRfdW5tdXRlKHJ0KTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gKDApOwotCQkJCWNhc2UgVjRMMl9DSURfQVVESU9fVk9MVU1FOgotCQkJCQlpZiAoY3RybC0+dmFsdWUpIHsKLQkJCQkJCXJ0X3VubXV0ZShydCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlydF9tdXRlKHJ0KTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gKDApOwotCQkJfQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJZGVmYXVsdDoKLQkJCXJldHVybiB2NGxfY29tcGF0X3RyYW5zbGF0ZV9pb2N0bChpbm9kZSxmaWxlLGNtZCxhcmcsCi0JCQkJCQkJICBydF9kb19pb2N0bCk7Ci0JfQorCXN0cmNweSh2LT5uYW1lLCAiRk0iKTsKKwl2LT50eXBlID0gVjRMMl9UVU5FUl9SQURJTzsKKwl2LT5yYW5nZWxvdyA9ICg4OCoxNjAwMCk7CisJdi0+cmFuZ2VoaWdoID0gKDEwOCoxNjAwMCk7CisJdi0+cnhzdWJjaGFucyA9IFY0TDJfVFVORVJfU1VCX01PTk87CisJdi0+Y2FwYWJpbGl0eSA9IFY0TDJfVFVORVJfQ0FQX0xPVzsKKwl2LT5hdWRtb2RlID0gVjRMMl9UVU5FUl9NT0RFX01PTk87CisJdi0+c2lnbmFsID0gMHhGRkZGKnJ0X2dldHNpZ3N0cihydCk7CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcnRfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCi0JCSAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3N0YXRpYyBpbnQgdmlkaW9jX3NfZnJlcXVlbmN5KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCXN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSAqZikKIHsKLQlyZXR1cm4gdmlkZW9fdXNlcmNvcHkoaW5vZGUsIGZpbGUsIGNtZCwgYXJnLCBydF9kb19pb2N0bCk7CisJc3RydWN0IHZpZGVvX2RldmljZSAqZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKKwlzdHJ1Y3QgcnRfZGV2aWNlICpydCA9IGRldi0+cHJpdjsKKworCXJ0LT5jdXJmcmVxID0gZi0+ZnJlcXVlbmN5OworCXJ0X3NldGZyZXEocnQsIHJ0LT5jdXJmcmVxKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2NfZ19mcmVxdWVuY3koc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJc3RydWN0IHY0bDJfZnJlcXVlbmN5ICpmKQoreworCXN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7CisJc3RydWN0IHJ0X2RldmljZSAqcnQgPSBkZXYtPnByaXY7CisKKwlmLT50eXBlID0gVjRMMl9UVU5FUl9SQURJTzsKKwlmLT5mcmVxdWVuY3kgPSBydC0+Y3VyZnJlcTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2NfcXVlcnljdHJsKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCXN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWMpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShyYWRpb19xY3RybCk7IGkrKykgeworCQlpZiAocWMtPmlkICYmIHFjLT5pZCA9PSByYWRpb19xY3RybFtpXS5pZCkgeworCQkJbWVtY3B5KHFjLCAmKHJhZGlvX3FjdHJsW2ldKSwKKwkJCQkJCXNpemVvZigqcWMpKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IHZpZGlvY19nX2N0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKK3sKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOworCXN0cnVjdCBydF9kZXZpY2UgKnJ0ID0gZGV2LT5wcml2OworCisJc3dpdGNoIChjdHJsLT5pZCkgeworCWNhc2UgVjRMMl9DSURfQVVESU9fTVVURToKKwkJY3RybC0+dmFsdWUgPSBydC0+bXV0ZWQ7CisJCXJldHVybiAwOworCWNhc2UgVjRMMl9DSURfQVVESU9fVk9MVU1FOgorCQlpZiAocnQtPm11dGVkKQorCQkJY3RybC0+dmFsdWUgPSAwOworCQllbHNlCisJCQljdHJsLT52YWx1ZSA9IDY1NTM1OworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX3NfY3RybChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQoreworCXN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7CisJc3RydWN0IHJ0X2RldmljZSAqcnQgPSBkZXYtPnByaXY7CisKKwlzd2l0Y2ggKGN0cmwtPmlkKSB7CisJY2FzZSBWNEwyX0NJRF9BVURJT19NVVRFOgorCQlpZiAoY3RybC0+dmFsdWUpCisJCQlydF9tdXRlKHJ0KTsKKwkJZWxzZQorCQkJcnRfdW5tdXRlKHJ0KTsKKwkJcmV0dXJuIDA7CisJY2FzZSBWNEwyX0NJRF9BVURJT19WT0xVTUU6CisJCWlmIChjdHJsLT52YWx1ZSkKKwkJCXJ0X3VubXV0ZShydCk7CisJCWVsc2UKKwkJCXJ0X211dGUocnQpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX2dfYXVkaW8oc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJc3RydWN0IHY0bDJfYXVkaW8gKmEpCit7CisJaWYgKGEtPmluZGV4ID4gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzdHJjcHkoYS0+bmFtZSwgIlJhZGlvIik7CisJYS0+Y2FwYWJpbGl0eSA9IFY0TDJfQVVEQ0FQX1NURVJFTzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2NfZ19pbnB1dChzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwgdW5zaWduZWQgaW50ICppKQoreworCSppID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2Nfc19pbnB1dChzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwgdW5zaWduZWQgaW50IGkpCit7CisJaWYgKGkgIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX3NfYXVkaW8oc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJc3RydWN0IHY0bDJfYXVkaW8gKmEpCit7CisJaWYgKGEtPmluZGV4ICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgc3RydWN0IHJ0X2RldmljZSBydHJhY2syX3VuaXQ7CkBAIC0yNjYsNyArMjg3LDcgQEAKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLm9wZW4gICAgICAgICAgID0gdmlkZW9fZXhjbHVzaXZlX29wZW4sCiAJLnJlbGVhc2UgICAgICAgID0gdmlkZW9fZXhjbHVzaXZlX3JlbGVhc2UsCi0JLmlvY3RsCQk9IHJ0X2lvY3RsLAorCS5pb2N0bAkJPSB2aWRlb19pb2N0bDIsCiAJLmNvbXBhdF9pb2N0bAk9IHY0bF9jb21wYXRfaW9jdGwzMiwKIAkubGxzZWVrICAgICAgICAgPSBub19sbHNlZWssCiB9OwpAQCAtMjc4LDYgKzI5OSwxOCBAQAogCS50eXBlCQk9IFZJRF9UWVBFX1RVTkVSLAogCS5oYXJkd2FyZQk9IDAsCiAJLmZvcHMgICAgICAgICAgID0gJnJ0cmFjazJfZm9wcywKKwkudmlkaW9jX3F1ZXJ5Y2FwICAgID0gdmlkaW9jX3F1ZXJ5Y2FwLAorCS52aWRpb2NfZ190dW5lciAgICAgPSB2aWRpb2NfZ190dW5lciwKKwkudmlkaW9jX3NfdHVuZXIgICAgID0gdmlkaW9jX3NfdHVuZXIsCisJLnZpZGlvY19nX2ZyZXF1ZW5jeSA9IHZpZGlvY19nX2ZyZXF1ZW5jeSwKKwkudmlkaW9jX3NfZnJlcXVlbmN5ID0gdmlkaW9jX3NfZnJlcXVlbmN5LAorCS52aWRpb2NfcXVlcnljdHJsICAgPSB2aWRpb2NfcXVlcnljdHJsLAorCS52aWRpb2NfZ19jdHJsICAgICAgPSB2aWRpb2NfZ19jdHJsLAorCS52aWRpb2Nfc19jdHJsICAgICAgPSB2aWRpb2Nfc19jdHJsLAorCS52aWRpb2NfZ19hdWRpbyAgICAgPSB2aWRpb2NfZ19hdWRpbywKKwkudmlkaW9jX3NfYXVkaW8gICAgID0gdmlkaW9jX3NfYXVkaW8sCisJLnZpZGlvY19nX2lucHV0ICAgICA9IHZpZGlvY19nX2lucHV0LAorCS52aWRpb2Nfc19pbnB1dCAgICAgPSB2aWRpb2Nfc19pbnB1dCwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IHJ0cmFjazJfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1zZjE2Zm1pLmMgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXNmMTZmbWkuYwppbmRleCBmNDYxOWU0Li5kYzMzZjE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXNmMTZmbWkuYworKysgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXNmMTZmbWkuYwpAQCAtMTMwLDEzNyArMTMwLDE1NSBAQAogCXJldHVybiAocmVzICYgMikgPyAwIDogMHhGRkZGOwogfQogCi1zdGF0aWMgaW50IGZtaV9kb19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCXVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKK3N0YXRpYyBpbnQgdmlkaW9jX3F1ZXJ5Y2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICAqcHJpdiwKKwkJCQkJc3RydWN0IHY0bDJfY2FwYWJpbGl0eSAqdikKIHsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwotCXN0cnVjdCBmbWlfZGV2aWNlICpmbWk9ZGV2LT5wcml2OwotCi0Jc3dpdGNoKGNtZCkKLQl7Ci0JCWNhc2UgVklESU9DX1FVRVJZQ0FQOgotCQl7Ci0JCQlzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5ICp2ID0gYXJnOwotCQkJbWVtc2V0KHYsMCxzaXplb2YoKnYpKTsKLQkJCXN0cmxjcHkodi0+ZHJpdmVyLCAicmFkaW8tc2YxNmZtaSIsIHNpemVvZiAodi0+ZHJpdmVyKSk7Ci0JCQlzdHJsY3B5KHYtPmNhcmQsICJTRjE2LUZNeCByYWRpbyIsIHNpemVvZiAodi0+Y2FyZCkpOwotCQkJc3ByaW50Zih2LT5idXNfaW5mbywiSVNBIik7Ci0JCQl2LT52ZXJzaW9uID0gUkFESU9fVkVSU0lPTjsKLQkJCXYtPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX1RVTkVSOwotCi0JCQlyZXR1cm4gMDsKLQkJfQotCQljYXNlIFZJRElPQ19HX1RVTkVSOgotCQl7Ci0JCQlzdHJ1Y3QgdjRsMl90dW5lciAqdiA9IGFyZzsKLQkJCWludCBtdWx0OwotCi0JCQlpZiAodi0+aW5kZXggPiAwKQotCQkJCXJldHVybiAtRUlOVkFMOwotCi0JCQltZW1zZXQodiwwLHNpemVvZigqdikpOwotCQkJc3RyY3B5KHYtPm5hbWUsICJGTSIpOwotCQkJdi0+dHlwZSA9IFY0TDJfVFVORVJfUkFESU87Ci0KLQkJCW11bHQgPSAoZm1pLT5mbGFncyAmIFY0TDJfVFVORVJfQ0FQX0xPVykgPyAxIDogMTAwMDsKLQkJCXYtPnJhbmdlbG93ID0gUlNGMTZfTUlORlJFUS9tdWx0OwotCQkJdi0+cmFuZ2VoaWdoID0gUlNGMTZfTUFYRlJFUS9tdWx0OwotCQkJdi0+cnhzdWJjaGFucyA9VjRMMl9UVU5FUl9TVUJfTU9OTyB8IFY0TDJfVFVORVJfTU9ERV9TVEVSRU87Ci0JCQl2LT5jYXBhYmlsaXR5PWZtaS0+ZmxhZ3MmVjRMMl9UVU5FUl9DQVBfTE9XOwotCQkJdi0+YXVkbW9kZSA9IFY0TDJfVFVORVJfTU9ERV9TVEVSRU87Ci0JCQl2LT5zaWduYWwgPSBmbWlfZ2V0c2lnc3RyKGZtaSk7Ci0KLQkJCXJldHVybiAwOwotCQl9Ci0JCWNhc2UgVklESU9DX1NfVFVORVI6Ci0JCXsKLQkJCXN0cnVjdCB2NGwyX3R1bmVyICp2ID0gYXJnOwotCi0JCQlpZiAodi0+aW5kZXggPiAwKQotCQkJCXJldHVybiAtRUlOVkFMOwotCi0JCQlyZXR1cm4gMDsKLQkJfQotCQljYXNlIFZJRElPQ19TX0ZSRVFVRU5DWToKLQkJewotCQkJc3RydWN0IHY0bDJfZnJlcXVlbmN5ICpmID0gYXJnOwotCi0JCQlpZiAoIShmbWktPmZsYWdzICYgVjRMMl9UVU5FUl9DQVBfTE9XKSkKLQkJCQlmLT5mcmVxdWVuY3kgKj0gMTAwMDsKLQkJCWlmIChmLT5mcmVxdWVuY3kgPCBSU0YxNl9NSU5GUkVRIHx8Ci0JCQkJCWYtPmZyZXF1ZW5jeSA+IFJTRjE2X01BWEZSRVEgKQotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJLypyb3VuZGluZyBpbiBzdGVwcyBvZiA4MDAgdG8gbWF0Y2ggdGggZnJlcQotCQkJICB0aGF0IHdpbGwgYmUgdXNlZCAqLwotCQkJZm1pLT5jdXJmcmVxID0gKGYtPmZyZXF1ZW5jeS84MDApKjgwMDsKLQkJCWZtaV9zZXRmcmVxKGZtaSk7Ci0KLQkJCXJldHVybiAwOwotCQl9Ci0JCWNhc2UgVklESU9DX0dfRlJFUVVFTkNZOgotCQl7Ci0JCQlzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgKmYgPSBhcmc7Ci0KLQkJCWYtPnR5cGUgPSBWNEwyX1RVTkVSX1JBRElPOwotCQkJZi0+ZnJlcXVlbmN5ID0gZm1pLT5jdXJmcmVxOwotCQkJaWYgKCEoZm1pLT5mbGFncyAmIFY0TDJfVFVORVJfQ0FQX0xPVykpCi0JCQkJZi0+ZnJlcXVlbmN5IC89IDEwMDA7Ci0KLQkJCXJldHVybiAwOwotCQl9Ci0JCWNhc2UgVklESU9DX1FVRVJZQ1RSTDoKLQkJewotCQkJc3RydWN0IHY0bDJfcXVlcnljdHJsICpxYyA9IGFyZzsKLQkJCWludCBpOwotCi0JCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShyYWRpb19xY3RybCk7IGkrKykgewotCQkJCWlmIChxYy0+aWQgJiYgcWMtPmlkID09IHJhZGlvX3FjdHJsW2ldLmlkKSB7Ci0JCQkJCW1lbWNweShxYywgJihyYWRpb19xY3RybFtpXSksCi0JCQkJCQkJCXNpemVvZigqcWMpKTsKLQkJCQkJcmV0dXJuICgwKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQljYXNlIFZJRElPQ19HX0NUUkw6Ci0JCXsKLQkJCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmw9IGFyZzsKLQotCQkJc3dpdGNoIChjdHJsLT5pZCkgewotCQkJCWNhc2UgVjRMMl9DSURfQVVESU9fTVVURToKLQkJCQkJY3RybC0+dmFsdWU9Zm1pLT5jdXJ2b2w7Ci0JCQkJCXJldHVybiAoMCk7Ci0JCQl9Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQljYXNlIFZJRElPQ19TX0NUUkw6Ci0JCXsKLQkJCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmw9IGFyZzsKLQotCQkJc3dpdGNoIChjdHJsLT5pZCkgewotCQkJCWNhc2UgVjRMMl9DSURfQVVESU9fTVVURToKLQkJCQl7Ci0JCQkJCWlmIChjdHJsLT52YWx1ZSkKLQkJCQkJCWZtaV9tdXRlKGZtaS0+cG9ydCk7Ci0JCQkJCWVsc2UKLQkJCQkJCWZtaV91bm11dGUoZm1pLT5wb3J0KTsKLQotCQkJCQlmbWktPmN1cnZvbD1jdHJsLT52YWx1ZTsKLQkJCQkJcmV0dXJuICgwKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQlkZWZhdWx0OgotCQkJcmV0dXJuIHY0bF9jb21wYXRfdHJhbnNsYXRlX2lvY3RsKGlub2RlLGZpbGUsY21kLGFyZywKLQkJCQkJCQkgIGZtaV9kb19pb2N0bCk7Ci0JfQorCXN0cmxjcHkodi0+ZHJpdmVyLCAicmFkaW8tc2YxNmZtaSIsIHNpemVvZih2LT5kcml2ZXIpKTsKKwlzdHJsY3B5KHYtPmNhcmQsICJTRjE2LUZNeCByYWRpbyIsIHNpemVvZih2LT5jYXJkKSk7CisJc3ByaW50Zih2LT5idXNfaW5mbywgIklTQSIpOworCXYtPnZlcnNpb24gPSBSQURJT19WRVJTSU9OOworCXYtPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX1RVTkVSOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGZtaV9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3N0YXRpYyBpbnQgdmlkaW9jX2dfdHVuZXIoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJCXN0cnVjdCB2NGwyX3R1bmVyICp2KQogewotCXJldHVybiB2aWRlb191c2VyY29weShpbm9kZSwgZmlsZSwgY21kLCBhcmcsIGZtaV9kb19pb2N0bCk7CisJaW50IG11bHQ7CisJc3RydWN0IHZpZGVvX2RldmljZSAqZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKKwlzdHJ1Y3QgZm1pX2RldmljZSAqZm1pID0gZGV2LT5wcml2OworCisJaWYgKHYtPmluZGV4ID4gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzdHJjcHkodi0+bmFtZSwgIkZNIik7CisJdi0+dHlwZSA9IFY0TDJfVFVORVJfUkFESU87CisJbXVsdCA9IChmbWktPmZsYWdzICYgVjRMMl9UVU5FUl9DQVBfTE9XKSA/IDEgOiAxMDAwOworCXYtPnJhbmdlbG93ID0gUlNGMTZfTUlORlJFUS9tdWx0OworCXYtPnJhbmdlaGlnaCA9IFJTRjE2X01BWEZSRVEvbXVsdDsKKwl2LT5yeHN1YmNoYW5zID0gVjRMMl9UVU5FUl9TVUJfTU9OTyB8IFY0TDJfVFVORVJfTU9ERV9TVEVSRU87CisJdi0+Y2FwYWJpbGl0eSA9IGZtaS0+ZmxhZ3MmVjRMMl9UVU5FUl9DQVBfTE9XOworCXYtPmF1ZG1vZGUgPSBWNEwyX1RVTkVSX01PREVfU1RFUkVPOworCXYtPnNpZ25hbCA9IGZtaV9nZXRzaWdzdHIoZm1pKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2Nfc190dW5lcihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQkJc3RydWN0IHY0bDJfdHVuZXIgKnYpCit7CisJaWYgKHYtPmluZGV4ID4gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX3NfZnJlcXVlbmN5KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCQlzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgKmYpCit7CisJc3RydWN0IHZpZGVvX2RldmljZSAqZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKKwlzdHJ1Y3QgZm1pX2RldmljZSAqZm1pID0gZGV2LT5wcml2OworCisJaWYgKCEoZm1pLT5mbGFncyAmIFY0TDJfVFVORVJfQ0FQX0xPVykpCisJCWYtPmZyZXF1ZW5jeSAqPSAxMDAwOworCWlmIChmLT5mcmVxdWVuY3kgPCBSU0YxNl9NSU5GUkVRIHx8CisJCQlmLT5mcmVxdWVuY3kgPiBSU0YxNl9NQVhGUkVRICkKKwkJcmV0dXJuIC1FSU5WQUw7CisJLypyb3VuZGluZyBpbiBzdGVwcyBvZiA4MDAgdG8gbWF0Y2ggdGggZnJlcQorCXRoYXQgd2lsbCBiZSB1c2VkICovCisJZm1pLT5jdXJmcmVxID0gKGYtPmZyZXF1ZW5jeS84MDApKjgwMDsKKwlmbWlfc2V0ZnJlcShmbWkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpZGlvY19nX2ZyZXF1ZW5jeShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQkJc3RydWN0IHY0bDJfZnJlcXVlbmN5ICpmKQoreworCXN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7CisJc3RydWN0IGZtaV9kZXZpY2UgKmZtaSA9IGRldi0+cHJpdjsKKworCWYtPnR5cGUgPSBWNEwyX1RVTkVSX1JBRElPOworCWYtPmZyZXF1ZW5jeSA9IGZtaS0+Y3VyZnJlcTsKKwlpZiAoIShmbWktPmZsYWdzICYgVjRMMl9UVU5FUl9DQVBfTE9XKSkKKwkJZi0+ZnJlcXVlbmN5IC89IDEwMDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX3F1ZXJ5Y3RybChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQkJc3RydWN0IHY0bDJfcXVlcnljdHJsICpxYykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHJhZGlvX3FjdHJsKTsgaSsrKSB7CisJCWlmIChxYy0+aWQgJiYgcWMtPmlkID09IHJhZGlvX3FjdHJsW2ldLmlkKSB7CisJCQltZW1jcHkocWMsICYocmFkaW9fcWN0cmxbaV0pLAorCQkJCQkJc2l6ZW9mKCpxYykpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX2dfY3RybChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQkJc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKK3sKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOworCXN0cnVjdCBmbWlfZGV2aWNlICpmbWkgPSBkZXYtPnByaXY7CisKKwlzd2l0Y2ggKGN0cmwtPmlkKSB7CisJY2FzZSBWNEwyX0NJRF9BVURJT19NVVRFOgorCQljdHJsLT52YWx1ZSA9IGZtaS0+Y3Vydm9sOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX3NfY3RybChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQkJc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKK3sKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOworCXN0cnVjdCBmbWlfZGV2aWNlICpmbWkgPSBkZXYtPnByaXY7CisKKwlzd2l0Y2ggKGN0cmwtPmlkKSB7CisJY2FzZSBWNEwyX0NJRF9BVURJT19NVVRFOgorCQlpZiAoY3RybC0+dmFsdWUpCisJCQlmbWlfbXV0ZShmbWktPnBvcnQpOworCQllbHNlCisJCQlmbWlfdW5tdXRlKGZtaS0+cG9ydCk7CisJCWZtaS0+Y3Vydm9sID0gY3RybC0+dmFsdWU7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCB2aWRpb2NfZ19hdWRpbyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQkJc3RydWN0IHY0bDJfYXVkaW8gKmEpCit7CisJaWYgKGEtPmluZGV4ID4gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzdHJjcHkoYS0+bmFtZSwgIlJhZGlvIik7CisJYS0+Y2FwYWJpbGl0eSA9IFY0TDJfQVVEQ0FQX1NURVJFTzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2NfZ19pbnB1dChzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwgdW5zaWduZWQgaW50ICppKQoreworCSppID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2Nfc19pbnB1dChzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwgdW5zaWduZWQgaW50IGkpCit7CisJaWYgKGkgIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX3NfYXVkaW8oc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJCXN0cnVjdCB2NGwyX2F1ZGlvICphKQoreworCWlmIChhLT5pbmRleCAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHN0cnVjdCBmbWlfZGV2aWNlIGZtaV91bml0OwpAQCAtMjY5LDcgKzI4Nyw3IEBACiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCS5vcGVuICAgICAgICAgICA9IHZpZGVvX2V4Y2x1c2l2ZV9vcGVuLAogCS5yZWxlYXNlICAgICAgICA9IHZpZGVvX2V4Y2x1c2l2ZV9yZWxlYXNlLAotCS5pb2N0bAkJPSBmbWlfaW9jdGwsCisJLmlvY3RsCQk9IHZpZGVvX2lvY3RsMiwKIAkuY29tcGF0X2lvY3RsCT0gdjRsX2NvbXBhdF9pb2N0bDMyLAogCS5sbHNlZWsgICAgICAgICA9IG5vX2xsc2VlaywKIH07CkBAIC0yODEsNiArMjk5LDE4IEBACiAJLnR5cGUJCT0gVklEX1RZUEVfVFVORVIsCiAJLmhhcmR3YXJlCT0gMCwKIAkuZm9wcyAgICAgICAgICAgPSAmZm1pX2ZvcHMsCisJLnZpZGlvY19xdWVyeWNhcCAgICA9IHZpZGlvY19xdWVyeWNhcCwKKwkudmlkaW9jX2dfdHVuZXIgICAgID0gdmlkaW9jX2dfdHVuZXIsCisJLnZpZGlvY19zX3R1bmVyICAgICA9IHZpZGlvY19zX3R1bmVyLAorCS52aWRpb2NfZ19hdWRpbyAgICAgPSB2aWRpb2NfZ19hdWRpbywKKwkudmlkaW9jX3NfYXVkaW8gICAgID0gdmlkaW9jX3NfYXVkaW8sCisJLnZpZGlvY19nX2lucHV0ICAgICA9IHZpZGlvY19nX2lucHV0LAorCS52aWRpb2Nfc19pbnB1dCAgICAgPSB2aWRpb2Nfc19pbnB1dCwKKwkudmlkaW9jX2dfZnJlcXVlbmN5ID0gdmlkaW9jX2dfZnJlcXVlbmN5LAorCS52aWRpb2Nfc19mcmVxdWVuY3kgPSB2aWRpb2Nfc19mcmVxdWVuY3ksCisJLnZpZGlvY19xdWVyeWN0cmwgICA9IHZpZGlvY19xdWVyeWN0cmwsCisJLnZpZGlvY19nX2N0cmwgICAgICA9IHZpZGlvY19nX2N0cmwsCisJLnZpZGlvY19zX2N0cmwgICAgICA9IHZpZGlvY19zX2N0cmwsCiB9OwogCiAvKiBsYWRpczogdGhpcyBpcyBteSBjYXJkLiBkb2VzIGFueSBvdGhlciB0eXBlcyBleGlzdD8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tc2YxNmZtcjIuYyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tc2YxNmZtcjIuYwppbmRleCBiOTZmYWZlLi5lNmMxMjVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXNmMTZmbXIyLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1zZjE2Zm1yMi5jCkBAIC0yMjYsMTg2ICsyMjYsMjA0IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZm1yMl9kb19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJICAgICAgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQorc3RhdGljIGludCB2aWRpb2NfcXVlcnljYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgICpwcml2LAorCQkJCQlzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5ICp2KQoreworCXN0cmxjcHkodi0+ZHJpdmVyLCAicmFkaW8tc2YxNmZtcjIiLCBzaXplb2Yodi0+ZHJpdmVyKSk7CisJc3RybGNweSh2LT5jYXJkLCAiU0YxNi1GTVIyIHJhZGlvIiwgc2l6ZW9mKHYtPmNhcmQpKTsKKwlzcHJpbnRmKHYtPmJ1c19pbmZvLCAiSVNBIik7CisJdi0+dmVyc2lvbiA9IFJBRElPX1ZFUlNJT047CisJdi0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfVFVORVI7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX2dfdHVuZXIoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJCXN0cnVjdCB2NGwyX3R1bmVyICp2KQoreworCWludCBtdWx0OworCXN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7CisJc3RydWN0IGZtcjJfZGV2aWNlICpmbXIyID0gZGV2LT5wcml2OworCisJaWYgKHYtPmluZGV4ID4gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzdHJjcHkodi0+bmFtZSwgIkZNIik7CisJdi0+dHlwZSA9IFY0TDJfVFVORVJfUkFESU87CisKKwltdWx0ID0gKGZtcjItPmZsYWdzICYgVjRMMl9UVU5FUl9DQVBfTE9XKSA/IDEgOiAxMDAwOworCXYtPnJhbmdlbG93ID0gUlNGMTZfTUlORlJFUS9tdWx0OworCXYtPnJhbmdlaGlnaCA9IFJTRjE2X01BWEZSRVEvbXVsdDsKKwl2LT5yeHN1YmNoYW5zID0gVjRMMl9UVU5FUl9TVUJfTU9OTyB8IFY0TDJfVFVORVJfTU9ERV9TVEVSRU87CisJdi0+Y2FwYWJpbGl0eSA9IGZtcjItPmZsYWdzJlY0TDJfVFVORVJfQ0FQX0xPVzsKKwl2LT5hdWRtb2RlID0gZm1yMi0+c3RlcmVvID8gVjRMMl9UVU5FUl9NT0RFX1NURVJFTzoKKwkJCQlWNEwyX1RVTkVSX01PREVfTU9OTzsKKwltdXRleF9sb2NrKCZsb2NrKTsKKwl2LT5zaWduYWwgPSBmbXIyX2dldHNpZ3N0cihmbXIyKTsKKwltdXRleF91bmxvY2soJmxvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpZGlvY19zX3R1bmVyKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCQlzdHJ1Y3QgdjRsMl90dW5lciAqdikKK3sKKwlpZiAodi0+aW5kZXggPiAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2Nfc19mcmVxdWVuY3koc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJCXN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSAqZikKIHsKIAlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwogCXN0cnVjdCBmbXIyX2RldmljZSAqZm1yMiA9IGRldi0+cHJpdjsKLQlkZWJ1Z19wcmludCgoS0VSTl9ERUJVRyAiZnJlcSAlbGQgZmxhZ3MgJWQgdm9sICVkIG11dGUgJWQgIgotCQkic3RlcmVvICVkIHR5cGUgJWRcbiIsCi0JCWZtcjItPmN1cmZyZXEsIGZtcjItPmZsYWdzLCBmbXIyLT5jdXJ2b2wsIGZtcjItPm11dGUsCi0JCWZtcjItPnN0ZXJlbywgZm1yMi0+Y2FyZF90eXBlKSk7CiAKLQlzd2l0Y2goY21kKQotCXsKLQkJY2FzZSBWSURJT0NfUVVFUllDQVA6Ci0JCXsKLQkJCXN0cnVjdCB2NGwyX2NhcGFiaWxpdHkgKnYgPSBhcmc7Ci0JCQltZW1zZXQodiwwLHNpemVvZigqdikpOwotCQkJc3RybGNweSh2LT5kcml2ZXIsICJyYWRpby1zZjE2Zm1yMiIsIHNpemVvZiAodi0+ZHJpdmVyKSk7Ci0JCQlzdHJsY3B5KHYtPmNhcmQsICJTRjE2LUZNUjIgcmFkaW8iLCBzaXplb2YgKHYtPmNhcmQpKTsKLQkJCXNwcmludGYodi0+YnVzX2luZm8sIklTQSIpOwotCQkJdi0+dmVyc2lvbiA9IFJBRElPX1ZFUlNJT047Ci0JCQl2LT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9UVU5FUjsKKwlpZiAoIShmbXIyLT5mbGFncyAmIFY0TDJfVFVORVJfQ0FQX0xPVykpCisJCWYtPmZyZXF1ZW5jeSAqPSAxMDAwOworCWlmIChmLT5mcmVxdWVuY3kgPCBSU0YxNl9NSU5GUkVRIHx8CisJCQlmLT5mcmVxdWVuY3kgPiBSU0YxNl9NQVhGUkVRICkKKwkJcmV0dXJuIC1FSU5WQUw7CisJLypyb3VuZGluZyBpbiBzdGVwcyBvZiAyMDAgdG8gbWF0Y2ggdGggZnJlcQorCXRoYXQgd2lsbCBiZSB1c2VkICovCisJZm1yMi0+Y3VyZnJlcSA9IChmLT5mcmVxdWVuY3kvMjAwKSoyMDA7CiAKLQkJCXJldHVybiAwOwotCQl9Ci0JCWNhc2UgVklESU9DX0dfVFVORVI6Ci0JCXsKLQkJCXN0cnVjdCB2NGwyX3R1bmVyICp2ID0gYXJnOwotCQkJaW50IG11bHQ7Ci0KLQkJCWlmICh2LT5pbmRleCA+IDApCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJCW1lbXNldCh2LDAsc2l6ZW9mKCp2KSk7Ci0JCQlzdHJjcHkodi0+bmFtZSwgIkZNIik7Ci0JCQl2LT50eXBlID0gVjRMMl9UVU5FUl9SQURJTzsKLQotCQkJbXVsdCA9IChmbXIyLT5mbGFncyAmIFY0TDJfVFVORVJfQ0FQX0xPVykgPyAxIDogMTAwMDsKLQkJCXYtPnJhbmdlbG93ID0gUlNGMTZfTUlORlJFUS9tdWx0OwotCQkJdi0+cmFuZ2VoaWdoID0gUlNGMTZfTUFYRlJFUS9tdWx0OwotCQkJdi0+cnhzdWJjaGFucyA9VjRMMl9UVU5FUl9TVUJfTU9OTyB8IFY0TDJfVFVORVJfTU9ERV9TVEVSRU87Ci0JCQl2LT5jYXBhYmlsaXR5PWZtcjItPmZsYWdzJlY0TDJfVFVORVJfQ0FQX0xPVzsKLQotCQkJdi0+YXVkbW9kZSA9IGZtcjItPnN0ZXJlbyA/IFY0TDJfVFVORVJfTU9ERV9TVEVSRU86Ci0JCQkJCQkgICAgVjRMMl9UVU5FUl9NT0RFX01PTk87Ci0JCQltdXRleF9sb2NrKCZsb2NrKTsKLQkJCXYtPnNpZ25hbCA9IGZtcjJfZ2V0c2lnc3RyKGZtcjIpOwotCQkJbXV0ZXhfdW5sb2NrKCZsb2NrKTsKLQotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJY2FzZSBWSURJT0NfU19UVU5FUjoKLQkJewotCQkJc3RydWN0IHY0bDJfdHVuZXIgKnYgPSBhcmc7Ci0KLQkJCWlmICh2LT5pbmRleCA+IDApCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJCXJldHVybiAwOwotCQl9Ci0JCWNhc2UgVklESU9DX1NfRlJFUVVFTkNZOgotCQl7Ci0JCQlzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgKmYgPSBhcmc7Ci0KLQkJCWlmICghKGZtcjItPmZsYWdzICYgVjRMMl9UVU5FUl9DQVBfTE9XKSkKLQkJCQlmLT5mcmVxdWVuY3kgKj0gMTAwMDsKLQkJCWlmIChmLT5mcmVxdWVuY3kgPCBSU0YxNl9NSU5GUkVRIHx8Ci0JCQkJCWYtPmZyZXF1ZW5jeSA+IFJTRjE2X01BWEZSRVEgKQotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJLypyb3VuZGluZyBpbiBzdGVwcyBvZiAyMDAgdG8gbWF0Y2ggdGggZnJlcQotCQkJICB0aGF0IHdpbGwgYmUgdXNlZCAqLwotCQkJZm1yMi0+Y3VyZnJlcSA9IChmLT5mcmVxdWVuY3kvMjAwKSoyMDA7Ci0KLQkJCS8qIHNldCBjYXJkIGZyZXEgKGlmIG5vdCBtdXRlZCkgKi8KLQkJCWlmIChmbXIyLT5jdXJ2b2wgJiYgIWZtcjItPm11dGUpCi0JCQl7Ci0JCQkJbXV0ZXhfbG9jaygmbG9jayk7Ci0JCQkJZm1yMl9zZXRmcmVxKGZtcjIpOwotCQkJCW11dGV4X3VubG9jaygmbG9jayk7Ci0JCQl9Ci0KLQkJCXJldHVybiAwOwotCQl9Ci0JCWNhc2UgVklESU9DX0dfRlJFUVVFTkNZOgotCQl7Ci0JCQlzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgKmYgPSBhcmc7Ci0KLQkJCWYtPnR5cGUgPSBWNEwyX1RVTkVSX1JBRElPOwotCQkJZi0+ZnJlcXVlbmN5ID0gZm1yMi0+Y3VyZnJlcTsKLQkJCWlmICghKGZtcjItPmZsYWdzICYgVjRMMl9UVU5FUl9DQVBfTE9XKSkKLQkJCQlmLT5mcmVxdWVuY3kgLz0gMTAwMDsKLQotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJY2FzZSBWSURJT0NfUVVFUllDVFJMOgotCQl7Ci0JCQlzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKnFjID0gYXJnOwotCQkJaW50IGk7Ci0KLQkJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHJhZGlvX3FjdHJsKTsgaSsrKSB7Ci0JCQkJaWYgKChmbXIyLT5jYXJkX3R5cGUgIT0gMTEpCi0JCQkJCQkmJiBWNEwyX0NJRF9BVURJT19WT0xVTUUpCi0JCQkJCXJhZGlvX3FjdHJsW2ldLnN0ZXA9NjU1MzU7Ci0JCQkJaWYgKHFjLT5pZCAmJiBxYy0+aWQgPT0gcmFkaW9fcWN0cmxbaV0uaWQpIHsKLQkJCQkJbWVtY3B5KHFjLCAmKHJhZGlvX3FjdHJsW2ldKSwKLQkJCQkJCQkJc2l6ZW9mKCpxYykpOwotCQkJCQlyZXR1cm4gKDApOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCWNhc2UgVklESU9DX0dfQ1RSTDoKLQkJewotCQkJc3RydWN0IHY0bDJfY29udHJvbCAqY3RybD0gYXJnOwotCi0JCQlzd2l0Y2ggKGN0cmwtPmlkKSB7Ci0JCQkJY2FzZSBWNEwyX0NJRF9BVURJT19NVVRFOgotCQkJCQljdHJsLT52YWx1ZT1mbXIyLT5tdXRlOwotCQkJCQlyZXR1cm4gKDApOwotCQkJCWNhc2UgVjRMMl9DSURfQVVESU9fVk9MVU1FOgotCQkJCQljdHJsLT52YWx1ZT1mbXIyLT5jdXJ2b2w7Ci0JCQkJCXJldHVybiAoMCk7Ci0JCQl9Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQljYXNlIFZJRElPQ19TX0NUUkw6Ci0JCXsKLQkJCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmw9IGFyZzsKLQotCQkJc3dpdGNoIChjdHJsLT5pZCkgewotCQkJCWNhc2UgVjRMMl9DSURfQVVESU9fTVVURToKLQkJCQkJZm1yMi0+bXV0ZT1jdHJsLT52YWx1ZTsKLQkJCQkJaWYgKGZtcjItPmNhcmRfdHlwZSAhPSAxMSkgewotCQkJCQkJaWYgKCFmbXIyLT5tdXRlKSB7Ci0JCQkJCQkJZm1yMi0+Y3Vydm9sID0gNjU1MzU7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWZtcjItPmN1cnZvbCA9IDA7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBWNEwyX0NJRF9BVURJT19WT0xVTUU6Ci0JCQkJCWZtcjItPmN1cnZvbCA9IGN0cmwtPnZhbHVlOwotCQkJCQlpZiAoZm1yMi0+Y2FyZF90eXBlICE9IDExKSB7Ci0JCQkJCQlpZiAoZm1yMi0+Y3Vydm9sKSB7Ci0JCQkJCQkJZm1yMi0+Y3Vydm9sID0gNjU1MzU7Ci0JCQkJCQkJZm1yMi0+bXV0ZSA9IDA7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWZtcjItPmN1cnZvbCA9IDA7Ci0JCQkJCQkJZm1yMi0+bXV0ZSA9IDE7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl9Ci0jaWZkZWYgREVCVUcKLQkJCWlmIChmbXIyLT5jdXJ2b2wgJiYgIWZtcjItPm11dGUpCi0JCQkJcHJpbnRrKEtFUk5fREVCVUcgInVubXV0ZVxuIik7Ci0JCQllbHNlCi0JCQkJcHJpbnRrKEtFUk5fREVCVUcgIm11dGVcbiIpOwotI2VuZGlmCi0JCQltdXRleF9sb2NrKCZsb2NrKTsKLQkJCWlmIChmbXIyLT5jdXJ2b2wgJiYgIWZtcjItPm11dGUpIHsKLQkJCQlmbXIyX3NldHZvbHVtZShmbXIyKTsKLQkJCQlmbXIyX3NldGZyZXEoZm1yMik7Ci0JCQl9IGVsc2UKLQkJCQlmbXIyX211dGUoZm1yMi0+cG9ydCk7Ci0JCQltdXRleF91bmxvY2soJmxvY2spOwotCQkJcmV0dXJuICgwKTsKLQkJfQotCQlkZWZhdWx0OgotCQkJcmV0dXJuIHY0bF9jb21wYXRfdHJhbnNsYXRlX2lvY3RsKGlub2RlLGZpbGUsY21kLGFyZywKLQkJCQkJCQkgIGZtcjJfZG9faW9jdGwpOwotCisJLyogc2V0IGNhcmQgZnJlcSAoaWYgbm90IG11dGVkKSAqLworCWlmIChmbXIyLT5jdXJ2b2wgJiYgIWZtcjItPm11dGUpIHsKKwkJbXV0ZXhfbG9jaygmbG9jayk7CisJCWZtcjJfc2V0ZnJlcShmbXIyKTsKKwkJbXV0ZXhfdW5sb2NrKCZsb2NrKTsKIAl9CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZm1yMl9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi0gewotCXJldHVybiB2aWRlb191c2VyY29weShpbm9kZSwgZmlsZSwgY21kLCBhcmcsIGZtcjJfZG9faW9jdGwpOworc3RhdGljIGludCB2aWRpb2NfZ19mcmVxdWVuY3koc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJCXN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSAqZikKK3sKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOworCXN0cnVjdCBmbXIyX2RldmljZSAqZm1yMiA9IGRldi0+cHJpdjsKKworCWYtPnR5cGUgPSBWNEwyX1RVTkVSX1JBRElPOworCWYtPmZyZXF1ZW5jeSA9IGZtcjItPmN1cmZyZXE7CisJaWYgKCEoZm1yMi0+ZmxhZ3MgJiBWNEwyX1RVTkVSX0NBUF9MT1cpKQorCQlmLT5mcmVxdWVuY3kgLz0gMTAwMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2NfcXVlcnljdHJsKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCQlzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKnFjKQoreworCWludCBpOworCXN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7CisJc3RydWN0IGZtcjJfZGV2aWNlICpmbXIyID0gZGV2LT5wcml2OworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocmFkaW9fcWN0cmwpOyBpKyspIHsKKwkJaWYgKChmbXIyLT5jYXJkX3R5cGUgIT0gMTEpCisJCQkJJiYgVjRMMl9DSURfQVVESU9fVk9MVU1FKQorCQkJcmFkaW9fcWN0cmxbaV0uc3RlcCA9IDY1NTM1OworCQlpZiAocWMtPmlkICYmIHFjLT5pZCA9PSByYWRpb19xY3RybFtpXS5pZCkgeworCQkJbWVtY3B5KHFjLCAmKHJhZGlvX3FjdHJsW2ldKSwKKwkJCQkJCXNpemVvZigqcWMpKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IHZpZGlvY19nX2N0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCit7CisJc3RydWN0IHZpZGVvX2RldmljZSAqZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKKwlzdHJ1Y3QgZm1yMl9kZXZpY2UgKmZtcjIgPSBkZXYtPnByaXY7CisKKwlzd2l0Y2ggKGN0cmwtPmlkKSB7CisJY2FzZSBWNEwyX0NJRF9BVURJT19NVVRFOgorCQljdHJsLT52YWx1ZSA9IGZtcjItPm11dGU7CisJCXJldHVybiAwOworCWNhc2UgVjRMMl9DSURfQVVESU9fVk9MVU1FOgorCQljdHJsLT52YWx1ZSA9IGZtcjItPmN1cnZvbDsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IHZpZGlvY19zX2N0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCit7CisJc3RydWN0IHZpZGVvX2RldmljZSAqZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKKwlzdHJ1Y3QgZm1yMl9kZXZpY2UgKmZtcjIgPSBkZXYtPnByaXY7CisKKwlzd2l0Y2ggKGN0cmwtPmlkKSB7CisJY2FzZSBWNEwyX0NJRF9BVURJT19NVVRFOgorCQlmbXIyLT5tdXRlID0gY3RybC0+dmFsdWU7CisJCWlmIChmbXIyLT5jYXJkX3R5cGUgIT0gMTEpIHsKKwkJCWlmICghZm1yMi0+bXV0ZSkKKwkJCQlmbXIyLT5jdXJ2b2wgPSA2NTUzNTsKKwkJCWVsc2UKKwkJCQlmbXIyLT5jdXJ2b2wgPSAwOworCQl9CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfQVVESU9fVk9MVU1FOgorCQlmbXIyLT5jdXJ2b2wgPSBjdHJsLT52YWx1ZTsKKwkJaWYgKGZtcjItPmNhcmRfdHlwZSAhPSAxMSkgeworCQkJaWYgKGZtcjItPmN1cnZvbCkgeworCQkJCWZtcjItPmN1cnZvbCA9IDY1NTM1OworCQkJCWZtcjItPm11dGUgPSAwOworCQkJfSBlbHNlIHsKKwkJCQlmbXIyLT5jdXJ2b2wgPSAwOworCQkJCWZtcjItPm11dGUgPSAxOworCQkJfQorCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworI2lmZGVmIERFQlVHCisJaWYgKGZtcjItPmN1cnZvbCAmJiAhZm1yMi0+bXV0ZSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgInVubXV0ZVxuIik7CisJZWxzZQorCQlwcmludGsoS0VSTl9ERUJVRyAibXV0ZVxuIik7CisjZW5kaWYKKworCW11dGV4X2xvY2soJmxvY2spOworCWlmIChmbXIyLT5jdXJ2b2wgJiYgIWZtcjItPm11dGUpIHsKKwkJZm1yMl9zZXR2b2x1bWUoZm1yMik7CisJCWZtcjJfc2V0ZnJlcShmbXIyKTsKKwl9IGVsc2UKKwkJZm1yMl9tdXRlKGZtcjItPnBvcnQpOworCW11dGV4X3VubG9jaygmbG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX2dfYXVkaW8oc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJCXN0cnVjdCB2NGwyX2F1ZGlvICphKQoreworCWlmIChhLT5pbmRleCA+IDEpCisJCXJldHVybiAtRUlOVkFMOworCisJc3RyY3B5KGEtPm5hbWUsICJSYWRpbyIpOworCWEtPmNhcGFiaWxpdHkgPSBWNEwyX0FVRENBUF9TVEVSRU87CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX2dfaW5wdXQoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnByaXYsIHVuc2lnbmVkIGludCAqaSkKK3sKKwkqaSA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX3NfaW5wdXQoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnByaXYsIHVuc2lnbmVkIGludCBpKQoreworCWlmIChpICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpZGlvY19zX2F1ZGlvKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCQlzdHJ1Y3QgdjRsMl9hdWRpbyAqYSkKK3sKKwlpZiAoYS0+aW5kZXggIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZm1yMl9kZXZpY2UgZm1yMl91bml0OwpAQCAtNDE0LDcgKzQzMiw3IEBACiAJLm93bmVyICAgICAgICAgID0gVEhJU19NT0RVTEUsCiAJLm9wZW4gICAgICAgICAgID0gdmlkZW9fZXhjbHVzaXZlX29wZW4sCiAJLnJlbGVhc2UgICAgICAgID0gdmlkZW9fZXhjbHVzaXZlX3JlbGVhc2UsCi0JLmlvY3RsICAgICAgICAgID0gZm1yMl9pb2N0bCwKKwkuaW9jdGwgICAgICAgICAgPSB2aWRlb19pb2N0bDIsCiAJLmNvbXBhdF9pb2N0bAk9IHY0bF9jb21wYXRfaW9jdGwzMiwKIAkubGxzZWVrICAgICAgICAgPSBub19sbHNlZWssCiB9OwpAQCAtNDI2LDYgKzQ0NCwxOCBAQAogCS4gdHlwZQkJPSBWSURfVFlQRV9UVU5FUiwKIAkuaGFyZHdhcmUJPSAwLAogCS5mb3BzCQk9ICZmbXIyX2ZvcHMsCisJLnZpZGlvY19xdWVyeWNhcCAgICA9IHZpZGlvY19xdWVyeWNhcCwKKwkudmlkaW9jX2dfdHVuZXIgICAgID0gdmlkaW9jX2dfdHVuZXIsCisJLnZpZGlvY19zX3R1bmVyICAgICA9IHZpZGlvY19zX3R1bmVyLAorCS52aWRpb2NfZ19hdWRpbyAgICAgPSB2aWRpb2NfZ19hdWRpbywKKwkudmlkaW9jX3NfYXVkaW8gICAgID0gdmlkaW9jX3NfYXVkaW8sCisJLnZpZGlvY19nX2lucHV0ICAgICA9IHZpZGlvY19nX2lucHV0LAorCS52aWRpb2Nfc19pbnB1dCAgICAgPSB2aWRpb2Nfc19pbnB1dCwKKwkudmlkaW9jX2dfZnJlcXVlbmN5ID0gdmlkaW9jX2dfZnJlcXVlbmN5LAorCS52aWRpb2Nfc19mcmVxdWVuY3kgPSB2aWRpb2Nfc19mcmVxdWVuY3ksCisJLnZpZGlvY19xdWVyeWN0cmwgICA9IHZpZGlvY19xdWVyeWN0cmwsCisJLnZpZGlvY19nX2N0cmwgICAgICA9IHZpZGlvY19nX2N0cmwsCisJLnZpZGlvY19zX2N0cmwgICAgICA9IHZpZGlvY19zX2N0cmwsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBmbXIyX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tdGVycmF0ZWMuYyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tdGVycmF0ZWMuYwppbmRleCBkNTlhMjdhLi5lNDNhY2ZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXRlcnJhdGVjLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby10ZXJyYXRlYy5jCkBAIC0yMDUsMTM1ICsyMDUsMTUyIEBACiAJcmV0dXJuIDE7CQkvKiBzaWduYWwgcHJlc2VudAkJKi8KIH0KIAotCi0vKiBpbXBsZW1lbnQgdGhlIHZpZGVvNGxpbnV4IGFwaSAqLwotCi1zdGF0aWMgaW50IHR0X2RvX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAotCQkgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQorc3RhdGljIGludCB2aWRpb2NfcXVlcnljYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJCXN0cnVjdCB2NGwyX2NhcGFiaWxpdHkgKnYpCiB7Ci0Jc3RydWN0IHZpZGVvX2RldmljZSAqZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKLQlzdHJ1Y3QgdHRfZGV2aWNlICp0dD1kZXYtPnByaXY7Ci0KLQlzd2l0Y2goY21kKQotCXsKLQkJY2FzZSBWSURJT0NfUVVFUllDQVA6Ci0JCXsKLQkJCXN0cnVjdCB2NGwyX2NhcGFiaWxpdHkgKnYgPSBhcmc7Ci0JCQltZW1zZXQodiwwLHNpemVvZigqdikpOwotCQkJc3RybGNweSh2LT5kcml2ZXIsICJyYWRpby10ZXJyYXRlYyIsIHNpemVvZiAodi0+ZHJpdmVyKSk7Ci0JCQlzdHJsY3B5KHYtPmNhcmQsICJBY3RpdmVSYWRpbyIsIHNpemVvZiAodi0+Y2FyZCkpOwotCQkJc3ByaW50Zih2LT5idXNfaW5mbywiSVNBIik7Ci0JCQl2LT52ZXJzaW9uID0gUkFESU9fVkVSU0lPTjsKLQkJCXYtPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX1RVTkVSOwotCi0JCQlyZXR1cm4gMDsKLQkJfQotCQljYXNlIFZJRElPQ19HX1RVTkVSOgotCQl7Ci0JCQlzdHJ1Y3QgdjRsMl90dW5lciAqdiA9IGFyZzsKLQotCQkJaWYgKHYtPmluZGV4ID4gMCkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQotCQkJbWVtc2V0KHYsMCxzaXplb2YoKnYpKTsKLQkJCXN0cmNweSh2LT5uYW1lLCAiRk0iKTsKLQkJCXYtPnR5cGUgPSBWNEwyX1RVTkVSX1JBRElPOwotCi0JCQl2LT5yYW5nZWxvdz0oODcqMTYwMDApOwotCQkJdi0+cmFuZ2VoaWdoPSgxMDgqMTYwMDApOwotCQkJdi0+cnhzdWJjaGFucyA9VjRMMl9UVU5FUl9TVUJfTU9OTzsKLQkJCXYtPmNhcGFiaWxpdHk9VjRMMl9UVU5FUl9DQVBfTE9XOwotCQkJdi0+YXVkbW9kZSA9IFY0TDJfVFVORVJfTU9ERV9NT05POwotCQkJdi0+c2lnbmFsPTB4RkZGRip0dF9nZXRzaWdzdHIodHQpOwotCi0JCQlyZXR1cm4gMDsKLQkJfQotCQljYXNlIFZJRElPQ19TX1RVTkVSOgotCQl7Ci0JCQlzdHJ1Y3QgdjRsMl90dW5lciAqdiA9IGFyZzsKLQotCQkJaWYgKHYtPmluZGV4ID4gMCkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJY2FzZSBWSURJT0NfU19GUkVRVUVOQ1k6Ci0JCXsKLQkJCXN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSAqZiA9IGFyZzsKLQotCQkJdHQtPmN1cmZyZXEgPSBmLT5mcmVxdWVuY3k7Ci0JCQl0dF9zZXRmcmVxKHR0LCB0dC0+Y3VyZnJlcSk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQljYXNlIFZJRElPQ19HX0ZSRVFVRU5DWToKLQkJewotCQkJc3RydWN0IHY0bDJfZnJlcXVlbmN5ICpmID0gYXJnOwotCi0JCQlmLT50eXBlID0gVjRMMl9UVU5FUl9SQURJTzsKLQkJCWYtPmZyZXF1ZW5jeSA9IHR0LT5jdXJmcmVxOwotCi0JCQlyZXR1cm4gMDsKLQkJfQotCQljYXNlIFZJRElPQ19RVUVSWUNUUkw6Ci0JCXsKLQkJCXN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWMgPSBhcmc7Ci0JCQlpbnQgaTsKLQotCQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocmFkaW9fcWN0cmwpOyBpKyspIHsKLQkJCQlpZiAocWMtPmlkICYmIHFjLT5pZCA9PSByYWRpb19xY3RybFtpXS5pZCkgewotCQkJCQltZW1jcHkocWMsICYocmFkaW9fcWN0cmxbaV0pLAotCQkJCQkJCQlzaXplb2YoKnFjKSk7Ci0JCQkJCXJldHVybiAoMCk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJY2FzZSBWSURJT0NfR19DVFJMOgotCQl7Ci0JCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsPSBhcmc7Ci0KLQkJCXN3aXRjaCAoY3RybC0+aWQpIHsKLQkJCQljYXNlIFY0TDJfQ0lEX0FVRElPX01VVEU6Ci0JCQkJCWlmICh0dC0+bXV0ZWQpCi0JCQkJCQljdHJsLT52YWx1ZT0xOwotCQkJCQllbHNlCi0JCQkJCQljdHJsLT52YWx1ZT0wOwotCQkJCQlyZXR1cm4gKDApOwotCQkJCWNhc2UgVjRMMl9DSURfQVVESU9fVk9MVU1FOgotCQkJCQljdHJsLT52YWx1ZT10dC0+Y3Vydm9sICogNjU1NDsKLQkJCQkJcmV0dXJuICgwKTsKLQkJCX0KLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCWNhc2UgVklESU9DX1NfQ1RSTDoKLQkJewotCQkJc3RydWN0IHY0bDJfY29udHJvbCAqY3RybD0gYXJnOwotCi0JCQlzd2l0Y2ggKGN0cmwtPmlkKSB7Ci0JCQkJY2FzZSBWNEwyX0NJRF9BVURJT19NVVRFOgotCQkJCQlpZiAoY3RybC0+dmFsdWUpIHsKLQkJCQkJCXR0X211dGUodHQpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJdHRfc2V0dm9sKHR0LHR0LT5jdXJ2b2wpOwotCQkJCQl9Ci0JCQkJCXJldHVybiAoMCk7Ci0JCQkJY2FzZSBWNEwyX0NJRF9BVURJT19WT0xVTUU6Ci0JCQkJCXR0X3NldHZvbCh0dCxjdHJsLT52YWx1ZSk7Ci0JCQkJCXJldHVybiAoMCk7Ci0JCQl9Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCi0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gdjRsX2NvbXBhdF90cmFuc2xhdGVfaW9jdGwoaW5vZGUsZmlsZSxjbWQsYXJnLAotCQkJCQkJCSAgdHRfZG9faW9jdGwpOwotCX0KKwlzdHJsY3B5KHYtPmRyaXZlciwgInJhZGlvLXRlcnJhdGVjIiwgc2l6ZW9mKHYtPmRyaXZlcikpOworCXN0cmxjcHkodi0+Y2FyZCwgIkFjdGl2ZVJhZGlvIiwgc2l6ZW9mKHYtPmNhcmQpKTsKKwlzcHJpbnRmKHYtPmJ1c19pbmZvLCAiSVNBIik7CisJdi0+dmVyc2lvbiA9IFJBRElPX1ZFUlNJT047CisJdi0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfVFVORVI7CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgdHRfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCi0JCSAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3N0YXRpYyBpbnQgdmlkaW9jX2dfdHVuZXIoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJCXN0cnVjdCB2NGwyX3R1bmVyICp2KQogewotCXJldHVybiB2aWRlb191c2VyY29weShpbm9kZSwgZmlsZSwgY21kLCBhcmcsIHR0X2RvX2lvY3RsKTsKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOworCXN0cnVjdCB0dF9kZXZpY2UgKnR0ID0gZGV2LT5wcml2OworCisJaWYgKHYtPmluZGV4ID4gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzdHJjcHkodi0+bmFtZSwgIkZNIik7CisJdi0+dHlwZSA9IFY0TDJfVFVORVJfUkFESU87CisJdi0+cmFuZ2Vsb3cgPSAoODcqMTYwMDApOworCXYtPnJhbmdlaGlnaCA9ICgxMDgqMTYwMDApOworCXYtPnJ4c3ViY2hhbnMgPSBWNEwyX1RVTkVSX1NVQl9NT05POworCXYtPmNhcGFiaWxpdHkgPSBWNEwyX1RVTkVSX0NBUF9MT1c7CisJdi0+YXVkbW9kZSA9IFY0TDJfVFVORVJfTU9ERV9NT05POworCXYtPnNpZ25hbCA9IDB4RkZGRip0dF9nZXRzaWdzdHIodHQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpZGlvY19zX3R1bmVyKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCQlzdHJ1Y3QgdjRsMl90dW5lciAqdikKK3sKKwlpZiAodi0+aW5kZXggPiAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2Nfc19mcmVxdWVuY3koc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJCXN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSAqZikKK3sKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOworCXN0cnVjdCB0dF9kZXZpY2UgKnR0ID0gZGV2LT5wcml2OworCisJdHQtPmN1cmZyZXEgPSBmLT5mcmVxdWVuY3k7CisJdHRfc2V0ZnJlcSh0dCwgdHQtPmN1cmZyZXEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpZGlvY19nX2ZyZXF1ZW5jeShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQkJc3RydWN0IHY0bDJfZnJlcXVlbmN5ICpmKQoreworCXN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7CisJc3RydWN0IHR0X2RldmljZSAqdHQgPSBkZXYtPnByaXY7CisKKwlmLT50eXBlID0gVjRMMl9UVU5FUl9SQURJTzsKKwlmLT5mcmVxdWVuY3kgPSB0dC0+Y3VyZnJlcTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2NfcXVlcnljdHJsKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCQlzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKnFjKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocmFkaW9fcWN0cmwpOyBpKyspIHsKKwkJaWYgKHFjLT5pZCAmJiBxYy0+aWQgPT0gcmFkaW9fcWN0cmxbaV0uaWQpIHsKKwkJCW1lbWNweShxYywgJihyYWRpb19xY3RybFtpXSksCisJCQkJCQlzaXplb2YoKnFjKSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCB2aWRpb2NfZ19jdHJsKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQoreworCXN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7CisJc3RydWN0IHR0X2RldmljZSAqdHQgPSBkZXYtPnByaXY7CisKKwlzd2l0Y2ggKGN0cmwtPmlkKSB7CisJY2FzZSBWNEwyX0NJRF9BVURJT19NVVRFOgorCQlpZiAodHQtPm11dGVkKQorCQkJY3RybC0+dmFsdWUgPSAxOworCQllbHNlCisJCQljdHJsLT52YWx1ZSA9IDA7CisJCXJldHVybiAwOworCWNhc2UgVjRMMl9DSURfQVVESU9fVk9MVU1FOgorCQljdHJsLT52YWx1ZSA9IHR0LT5jdXJ2b2wgKiA2NTU0OworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX3NfY3RybChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQkJc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKK3sKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOworCXN0cnVjdCB0dF9kZXZpY2UgKnR0ID0gZGV2LT5wcml2OworCisJc3dpdGNoIChjdHJsLT5pZCkgeworCWNhc2UgVjRMMl9DSURfQVVESU9fTVVURToKKwkJaWYgKGN0cmwtPnZhbHVlKQorCQkJdHRfbXV0ZSh0dCk7CisJCWVsc2UKKwkJCXR0X3NldHZvbCh0dCx0dC0+Y3Vydm9sKTsKKwkJcmV0dXJuIDA7CisJY2FzZSBWNEwyX0NJRF9BVURJT19WT0xVTUU6CisJCXR0X3NldHZvbCh0dCxjdHJsLT52YWx1ZSk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCB2aWRpb2NfZ19hdWRpbyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQkJc3RydWN0IHY0bDJfYXVkaW8gKmEpCit7CisJaWYgKGEtPmluZGV4ID4gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzdHJjcHkoYS0+bmFtZSwgIlJhZGlvIik7CisJYS0+Y2FwYWJpbGl0eSA9IFY0TDJfQVVEQ0FQX1NURVJFTzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2NfZ19pbnB1dChzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwgdW5zaWduZWQgaW50ICppKQoreworCSppID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2Nfc19pbnB1dChzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwgdW5zaWduZWQgaW50IGkpCit7CisJaWYgKGkgIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX3NfYXVkaW8oc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJCXN0cnVjdCB2NGwyX2F1ZGlvICphKQoreworCWlmIChhLT5pbmRleCAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHN0cnVjdCB0dF9kZXZpY2UgdGVycmF0ZWNfdW5pdDsKQEAgLTM0Miw3ICszNTksNyBAQAogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkub3BlbiAgICAgICAgICAgPSB2aWRlb19leGNsdXNpdmVfb3BlbiwKIAkucmVsZWFzZSAgICAgICAgPSB2aWRlb19leGNsdXNpdmVfcmVsZWFzZSwKLQkuaW9jdGwJCT0gdHRfaW9jdGwsCisJLmlvY3RsCQk9IHZpZGVvX2lvY3RsMiwKIAkuY29tcGF0X2lvY3RsCT0gdjRsX2NvbXBhdF9pb2N0bDMyLAogCS5sbHNlZWsgICAgICAgICA9IG5vX2xsc2VlaywKIH07CkBAIC0zNTQsNiArMzcxLDE4IEBACiAJLnR5cGUJCT0gVklEX1RZUEVfVFVORVIsCiAJLmhhcmR3YXJlCT0gMCwKIAkuZm9wcyAgICAgICAgICAgPSAmdGVycmF0ZWNfZm9wcywKKwkudmlkaW9jX3F1ZXJ5Y2FwICAgID0gdmlkaW9jX3F1ZXJ5Y2FwLAorCS52aWRpb2NfZ190dW5lciAgICAgPSB2aWRpb2NfZ190dW5lciwKKwkudmlkaW9jX3NfdHVuZXIgICAgID0gdmlkaW9jX3NfdHVuZXIsCisJLnZpZGlvY19nX2ZyZXF1ZW5jeSA9IHZpZGlvY19nX2ZyZXF1ZW5jeSwKKwkudmlkaW9jX3NfZnJlcXVlbmN5ID0gdmlkaW9jX3NfZnJlcXVlbmN5LAorCS52aWRpb2NfcXVlcnljdHJsICAgPSB2aWRpb2NfcXVlcnljdHJsLAorCS52aWRpb2NfZ19jdHJsICAgICAgPSB2aWRpb2NfZ19jdHJsLAorCS52aWRpb2Nfc19jdHJsICAgICAgPSB2aWRpb2Nfc19jdHJsLAorCS52aWRpb2NfZ19hdWRpbyAgICAgPSB2aWRpb2NfZ19hdWRpbywKKwkudmlkaW9jX3NfYXVkaW8gICAgID0gdmlkaW9jX3NfYXVkaW8sCisJLnZpZGlvY19nX2lucHV0ICAgICA9IHZpZGlvY19nX2lucHV0LAorCS52aWRpb2Nfc19pbnB1dCAgICAgPSB2aWRpb2Nfc19pbnB1dCwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IHRlcnJhdGVjX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tdHJ1c3QuYyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tdHJ1c3QuYwppbmRleCA2ZDdmMWU3Li5jMjdjNjI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXRydXN0LmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby10cnVzdC5jCkBAIC0xOTIsMTQ0ICsxOTIsMTU0IEBACiAJd3JpdGVfaTJjKDUsIFRTQTYwNjBUX0FERFIsIChmIDw8IDEpIHwgMSwgZiA+PiA3LCAweDYwIHwgKChmID4+IDE1KSAmIDEpLCAwKTsKIH0KIAotc3RhdGljIGludCB0cl9kb19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKK3N0YXRpYyBpbnQgdmlkaW9jX3F1ZXJ5Y2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCXN0cnVjdCB2NGwyX2NhcGFiaWxpdHkgKnYpCiB7Ci0Jc3dpdGNoKGNtZCkKLQl7Ci0JCWNhc2UgVklESU9DX1FVRVJZQ0FQOgotCQl7Ci0JCQlzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5ICp2ID0gYXJnOwotCQkJbWVtc2V0KHYsMCxzaXplb2YoKnYpKTsKLQkJCXN0cmxjcHkodi0+ZHJpdmVyLCAicmFkaW8tdHJ1c3QiLCBzaXplb2YgKHYtPmRyaXZlcikpOwotCQkJc3RybGNweSh2LT5jYXJkLCAiVHJ1c3QgRk0gUmFkaW8iLCBzaXplb2YgKHYtPmNhcmQpKTsKLQkJCXNwcmludGYodi0+YnVzX2luZm8sIklTQSIpOwotCQkJdi0+dmVyc2lvbiA9IFJBRElPX1ZFUlNJT047Ci0JCQl2LT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9UVU5FUjsKLQotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJY2FzZSBWSURJT0NfR19UVU5FUjoKLQkJewotCQkJc3RydWN0IHY0bDJfdHVuZXIgKnYgPSBhcmc7Ci0KLQkJCWlmICh2LT5pbmRleCA+IDApCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJCW1lbXNldCh2LDAsc2l6ZW9mKCp2KSk7Ci0JCQlzdHJjcHkodi0+bmFtZSwgIkZNIik7Ci0JCQl2LT50eXBlID0gVjRMMl9UVU5FUl9SQURJTzsKLQotCQkJdi0+cmFuZ2Vsb3c9KDg3LjUqMTYwMDApOwotCQkJdi0+cmFuZ2VoaWdoPSgxMDgqMTYwMDApOwotCQkJdi0+cnhzdWJjaGFucyA9VjRMMl9UVU5FUl9TVUJfTU9OT3xWNEwyX1RVTkVSX1NVQl9TVEVSRU87Ci0JCQl2LT5jYXBhYmlsaXR5PVY0TDJfVFVORVJfQ0FQX0xPVzsKLQkJCWlmKHRyX2dldHN0ZXJlbygpKQotCQkJCXYtPmF1ZG1vZGUgPSBWNEwyX1RVTkVSX01PREVfU1RFUkVPOwotCQkJZWxzZQotCQkJCXYtPmF1ZG1vZGUgPSBWNEwyX1RVTkVSX01PREVfTU9OTzsKLQkJCXYtPnNpZ25hbD10cl9nZXRzaWdzdHIoKTsKLQotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJY2FzZSBWSURJT0NfU19UVU5FUjoKLQkJewotCQkJc3RydWN0IHY0bDJfdHVuZXIgKnYgPSBhcmc7Ci0KLQkJCWlmICh2LT5pbmRleCA+IDApCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJCXJldHVybiAwOwotCQl9Ci0JCWNhc2UgVklESU9DX1NfRlJFUVVFTkNZOgotCQl7Ci0JCQlzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgKmYgPSBhcmc7Ci0KLQkJCWN1cmZyZXEgPSBmLT5mcmVxdWVuY3k7Ci0JCQl0cl9zZXRmcmVxKGN1cmZyZXEpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJY2FzZSBWSURJT0NfR19GUkVRVUVOQ1k6Ci0JCXsKLQkJCXN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSAqZiA9IGFyZzsKLQotCQkJZi0+dHlwZSA9IFY0TDJfVFVORVJfUkFESU87Ci0JCQlmLT5mcmVxdWVuY3kgPSBjdXJmcmVxOwotCi0JCQlyZXR1cm4gMDsKLQkJfQotCQljYXNlIFZJRElPQ19RVUVSWUNUUkw6Ci0JCXsKLQkJCXN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWMgPSBhcmc7Ci0JCQlpbnQgaTsKLQotCQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocmFkaW9fcWN0cmwpOyBpKyspIHsKLQkJCQlpZiAocWMtPmlkICYmIHFjLT5pZCA9PSByYWRpb19xY3RybFtpXS5pZCkgewotCQkJCQltZW1jcHkocWMsICYocmFkaW9fcWN0cmxbaV0pLAotCQkJCQkJCQlzaXplb2YoKnFjKSk7Ci0JCQkJCXJldHVybiAoMCk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJY2FzZSBWSURJT0NfR19DVFJMOgotCQl7Ci0JCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsPSBhcmc7Ci0KLQkJCXN3aXRjaCAoY3RybC0+aWQpIHsKLQkJCQljYXNlIFY0TDJfQ0lEX0FVRElPX01VVEU6Ci0JCQkJCWN0cmwtPnZhbHVlPWN1cm11dGU7Ci0JCQkJCXJldHVybiAoMCk7Ci0JCQkJY2FzZSBWNEwyX0NJRF9BVURJT19WT0xVTUU6Ci0JCQkJCWN0cmwtPnZhbHVlPSBjdXJ2b2wgKiAyMDQ4OwotCQkJCQlyZXR1cm4gKDApOwotCQkJCWNhc2UgVjRMMl9DSURfQVVESU9fQkFTUzoKLQkJCQkJY3RybC0+dmFsdWU9IGN1cmJhc3MgKiA0MzcwOwotCQkJCQlyZXR1cm4gKDApOwotCQkJCWNhc2UgVjRMMl9DSURfQVVESU9fVFJFQkxFOgotCQkJCQljdHJsLT52YWx1ZT0gY3VydHJlYmxlICogNDM3MDsKLQkJCQkJcmV0dXJuICgwKTsKLQkJCX0KLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCWNhc2UgVklESU9DX1NfQ1RSTDoKLQkJewotCQkJc3RydWN0IHY0bDJfY29udHJvbCAqY3RybD0gYXJnOwotCi0JCQlzd2l0Y2ggKGN0cmwtPmlkKSB7Ci0JCQkJY2FzZSBWNEwyX0NJRF9BVURJT19NVVRFOgotCQkJCQl0cl9zZXRtdXRlKGN0cmwtPnZhbHVlKTsKLQkJCQkJcmV0dXJuIDA7Ci0JCQkJY2FzZSBWNEwyX0NJRF9BVURJT19WT0xVTUU6Ci0JCQkJCXRyX3NldHZvbChjdHJsLT52YWx1ZSk7Ci0JCQkJCXJldHVybiAwOwotCQkJCWNhc2UgVjRMMl9DSURfQVVESU9fQkFTUzoKLQkJCQkJdHJfc2V0YmFzcyhjdHJsLT52YWx1ZSk7Ci0JCQkJCXJldHVybiAwOwotCQkJCWNhc2UgVjRMMl9DSURfQVVESU9fVFJFQkxFOgotCQkJCQl0cl9zZXR0cmVibGUoY3RybC0+dmFsdWUpOwotCQkJCQlyZXR1cm4gKDApOwotCQkJfQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotCQlkZWZhdWx0OgotCQkJcmV0dXJuIHY0bF9jb21wYXRfdHJhbnNsYXRlX2lvY3RsKGlub2RlLGZpbGUsY21kLGFyZywKLQkJCQkJCQkgIHRyX2RvX2lvY3RsKTsKLQl9CisJc3RybGNweSh2LT5kcml2ZXIsICJyYWRpby10cnVzdCIsIHNpemVvZih2LT5kcml2ZXIpKTsKKwlzdHJsY3B5KHYtPmNhcmQsICJUcnVzdCBGTSBSYWRpbyIsIHNpemVvZih2LT5jYXJkKSk7CisJc3ByaW50Zih2LT5idXNfaW5mbywgIklTQSIpOworCXYtPnZlcnNpb24gPSBSQURJT19WRVJTSU9OOworCXYtPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX1RVTkVSOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHRyX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAotCQkgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCitzdGF0aWMgaW50IHZpZGlvY19nX3R1bmVyKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCXN0cnVjdCB2NGwyX3R1bmVyICp2KQogewotCXJldHVybiB2aWRlb191c2VyY29weShpbm9kZSwgZmlsZSwgY21kLCBhcmcsIHRyX2RvX2lvY3RsKTsKKwlpZiAodi0+aW5kZXggPiAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN0cmNweSh2LT5uYW1lLCAiRk0iKTsKKwl2LT50eXBlID0gVjRMMl9UVU5FUl9SQURJTzsKKwl2LT5yYW5nZWxvdyA9ICg4Ny41KjE2MDAwKTsKKwl2LT5yYW5nZWhpZ2ggPSAoMTA4KjE2MDAwKTsKKwl2LT5yeHN1YmNoYW5zID0gVjRMMl9UVU5FUl9TVUJfTU9OT3xWNEwyX1RVTkVSX1NVQl9TVEVSRU87CisJdi0+Y2FwYWJpbGl0eSA9IFY0TDJfVFVORVJfQ0FQX0xPVzsKKwlpZiAodHJfZ2V0c3RlcmVvKCkpCisJCXYtPmF1ZG1vZGUgPSBWNEwyX1RVTkVSX01PREVfU1RFUkVPOworCWVsc2UKKwkJdi0+YXVkbW9kZSA9IFY0TDJfVFVORVJfTU9ERV9NT05POworCXYtPnNpZ25hbCA9IHRyX2dldHNpZ3N0cigpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpZGlvY19zX3R1bmVyKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCXN0cnVjdCB2NGwyX3R1bmVyICp2KQoreworCWlmICh2LT5pbmRleCA+IDApCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX3NfZnJlcXVlbmN5KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCXN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSAqZikKK3sKKwljdXJmcmVxID0gZi0+ZnJlcXVlbmN5OworCXRyX3NldGZyZXEoY3VyZnJlcSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX2dfZnJlcXVlbmN5KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCXN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSAqZikKK3sKKwlmLT50eXBlID0gVjRMMl9UVU5FUl9SQURJTzsKKwlmLT5mcmVxdWVuY3kgPSBjdXJmcmVxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpZGlvY19xdWVyeWN0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJc3RydWN0IHY0bDJfcXVlcnljdHJsICpxYykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHJhZGlvX3FjdHJsKTsgaSsrKSB7CisJCWlmIChxYy0+aWQgJiYgcWMtPmlkID09IHJhZGlvX3FjdHJsW2ldLmlkKSB7CisJCQltZW1jcHkocWMsICYocmFkaW9fcWN0cmxbaV0pLAorCQkJCQkJc2l6ZW9mKCpxYykpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX2dfY3RybChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQoreworCXN3aXRjaCAoY3RybC0+aWQpIHsKKwljYXNlIFY0TDJfQ0lEX0FVRElPX01VVEU6CisJCWN0cmwtPnZhbHVlID0gY3VybXV0ZTsKKwkJcmV0dXJuIDA7CisJY2FzZSBWNEwyX0NJRF9BVURJT19WT0xVTUU6CisJCWN0cmwtPnZhbHVlID0gY3Vydm9sICogMjA0ODsKKwkJcmV0dXJuIDA7CisJY2FzZSBWNEwyX0NJRF9BVURJT19CQVNTOgorCQljdHJsLT52YWx1ZSA9IGN1cmJhc3MgKiA0MzcwOworCQlyZXR1cm4gMDsKKwljYXNlIFY0TDJfQ0lEX0FVRElPX1RSRUJMRToKKwkJY3RybC0+dmFsdWUgPSBjdXJ0cmVibGUgKiA0MzcwOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX3NfY3RybChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQoreworCXN3aXRjaCAoY3RybC0+aWQpIHsKKwljYXNlIFY0TDJfQ0lEX0FVRElPX01VVEU6CisJCXRyX3NldG11dGUoY3RybC0+dmFsdWUpOworCQlyZXR1cm4gMDsKKwljYXNlIFY0TDJfQ0lEX0FVRElPX1ZPTFVNRToKKwkJdHJfc2V0dm9sKGN0cmwtPnZhbHVlKTsKKwkJcmV0dXJuIDA7CisJY2FzZSBWNEwyX0NJRF9BVURJT19CQVNTOgorCQl0cl9zZXRiYXNzKGN0cmwtPnZhbHVlKTsKKwkJcmV0dXJuIDA7CisJY2FzZSBWNEwyX0NJRF9BVURJT19UUkVCTEU6CisJCXRyX3NldHRyZWJsZShjdHJsLT52YWx1ZSk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCB2aWRpb2NfZ19hdWRpbyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQlzdHJ1Y3QgdjRsMl9hdWRpbyAqYSkKK3sKKwlpZiAoYS0+aW5kZXggPiAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN0cmNweShhLT5uYW1lLCAiUmFkaW8iKTsKKwlhLT5jYXBhYmlsaXR5ID0gVjRMMl9BVURDQVBfU1RFUkVPOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpZGlvY19nX2lucHV0KHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwcml2LCB1bnNpZ25lZCBpbnQgKmkpCit7CisJKmkgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpZGlvY19zX2lucHV0KHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwcml2LCB1bnNpZ25lZCBpbnQgaSkKK3sKKwlpZiAoaSAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2Nfc19hdWRpbyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQlzdHJ1Y3QgdjRsMl9hdWRpbyAqYSkKK3sKKwlpZiAoYS0+aW5kZXggIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHRydXN0X2ZvcHMgPSB7CiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCS5vcGVuICAgICAgICAgICA9IHZpZGVvX2V4Y2x1c2l2ZV9vcGVuLAogCS5yZWxlYXNlICAgICAgICA9IHZpZGVvX2V4Y2x1c2l2ZV9yZWxlYXNlLAotCS5pb2N0bAkJPSB0cl9pb2N0bCwKKwkuaW9jdGwJCT0gdmlkZW9faW9jdGwyLAogCS5jb21wYXRfaW9jdGwJPSB2NGxfY29tcGF0X2lvY3RsMzIsCiAJLmxsc2VlayAgICAgICAgID0gbm9fbGxzZWVrLAogfTsKQEAgLTM0MSw2ICszNTEsMTggQEAKIAkudHlwZQkJPSBWSURfVFlQRV9UVU5FUiwKIAkuaGFyZHdhcmUJPSAwLAogCS5mb3BzICAgICAgICAgICA9ICZ0cnVzdF9mb3BzLAorCS52aWRpb2NfcXVlcnljYXAgICAgPSB2aWRpb2NfcXVlcnljYXAsCisJLnZpZGlvY19nX3R1bmVyICAgICA9IHZpZGlvY19nX3R1bmVyLAorCS52aWRpb2Nfc190dW5lciAgICAgPSB2aWRpb2Nfc190dW5lciwKKwkudmlkaW9jX2dfZnJlcXVlbmN5ID0gdmlkaW9jX2dfZnJlcXVlbmN5LAorCS52aWRpb2Nfc19mcmVxdWVuY3kgPSB2aWRpb2Nfc19mcmVxdWVuY3ksCisJLnZpZGlvY19xdWVyeWN0cmwgICA9IHZpZGlvY19xdWVyeWN0cmwsCisJLnZpZGlvY19nX2N0cmwgICAgICA9IHZpZGlvY19nX2N0cmwsCisJLnZpZGlvY19zX2N0cmwgICAgICA9IHZpZGlvY19zX2N0cmwsCisJLnZpZGlvY19nX2F1ZGlvICAgICA9IHZpZGlvY19nX2F1ZGlvLAorCS52aWRpb2Nfc19hdWRpbyAgICAgPSB2aWRpb2Nfc19hdWRpbywKKwkudmlkaW9jX2dfaW5wdXQgICAgID0gdmlkaW9jX2dfaW5wdXQsCisJLnZpZGlvY19zX2lucHV0ICAgICA9IHZpZGlvY19zX2lucHV0LAogfTsKIAogc3RhdGljIGludCBfX2luaXQgdHJ1c3RfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby10eXBob29uLmMgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXR5cGhvb24uYwppbmRleCAzMDMxZmVmLi44ZmY1YTIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXR5cGhvb24uYworKysgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXR5cGhvb24uYwpAQCAtOTMsOCArOTMsNiBAQAogc3RhdGljIHZvaWQgdHlwaG9vbl9tdXRlKHN0cnVjdCB0eXBob29uX2RldmljZSAqZGV2KTsKIHN0YXRpYyB2b2lkIHR5cGhvb25fdW5tdXRlKHN0cnVjdCB0eXBob29uX2RldmljZSAqZGV2KTsKIHN0YXRpYyBpbnQgdHlwaG9vbl9zZXR2b2woc3RydWN0IHR5cGhvb25fZGV2aWNlICpkZXYsIGludCB2b2wpOwotc3RhdGljIGludCB0eXBob29uX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAotCQkJIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKICNpZmRlZiBDT05GSUdfUkFESU9fVFlQSE9PTl9QUk9DX0ZTCiBzdGF0aWMgaW50IHR5cGhvb25fZ2V0X2luZm8oY2hhciAqYnVmLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IGxlbik7CiAjZW5kaWYKQEAgLTE4NiwxMjkgKzE4NCwxNDggQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCB2aWRpb2NfcXVlcnljYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgICpwcml2LAorCQkJCQlzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5ICp2KQoreworCXN0cmxjcHkodi0+ZHJpdmVyLCAicmFkaW8tdHlwaG9vbiIsIHNpemVvZih2LT5kcml2ZXIpKTsKKwlzdHJsY3B5KHYtPmNhcmQsICJUeXBob29uIFJhZGlvIiwgc2l6ZW9mKHYtPmNhcmQpKTsKKwlzcHJpbnRmKHYtPmJ1c19pbmZvLCAiSVNBIik7CisJdi0+dmVyc2lvbiA9IFJBRElPX1ZFUlNJT047CisJdi0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfVFVORVI7CisJcmV0dXJuIDA7Cit9CiAKLXN0YXRpYyBpbnQgdHlwaG9vbl9kb19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCSAgICB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCitzdGF0aWMgaW50IHZpZGlvY19nX3R1bmVyKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCQlzdHJ1Y3QgdjRsMl90dW5lciAqdikKK3sKKwlpZiAodi0+aW5kZXggPiAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN0cmNweSh2LT5uYW1lLCAiRk0iKTsKKwl2LT50eXBlID0gVjRMMl9UVU5FUl9SQURJTzsKKwl2LT5yYW5nZWxvdyA9ICg4Ny41KjE2MDAwKTsKKwl2LT5yYW5nZWhpZ2ggPSAoMTA4KjE2MDAwKTsKKwl2LT5yeHN1YmNoYW5zID0gVjRMMl9UVU5FUl9TVUJfTU9OTzsKKwl2LT5jYXBhYmlsaXR5ID0gVjRMMl9UVU5FUl9DQVBfTE9XOworCXYtPmF1ZG1vZGUgPSBWNEwyX1RVTkVSX01PREVfTU9OTzsKKwl2LT5zaWduYWwgPSAweEZGRkY7ICAgICAvKiBXZSBjYW4ndCBnZXQgdGhlIHNpZ25hbCBzdHJlbmd0aCAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpZGlvY19zX3R1bmVyKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCQlzdHJ1Y3QgdjRsMl90dW5lciAqdikKK3sKKwlpZiAodi0+aW5kZXggPiAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpZGlvY19zX2ZyZXF1ZW5jeShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQkJc3RydWN0IHY0bDJfZnJlcXVlbmN5ICpmKQogewogCXN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7CiAJc3RydWN0IHR5cGhvb25fZGV2aWNlICp0eXBob29uID0gZGV2LT5wcml2OwogCi0Jc3dpdGNoIChjbWQpIHsKLQkJY2FzZSBWSURJT0NfUVVFUllDQVA6Ci0JCXsKLQkJCXN0cnVjdCB2NGwyX2NhcGFiaWxpdHkgKnYgPSBhcmc7Ci0JCQltZW1zZXQodiwwLHNpemVvZigqdikpOwotCQkJc3RybGNweSh2LT5kcml2ZXIsICJyYWRpby10eXBob29uIiwgc2l6ZW9mICh2LT5kcml2ZXIpKTsKLQkJCXN0cmxjcHkodi0+Y2FyZCwgIlR5cGhvb24gUmFkaW8iLCBzaXplb2YgKHYtPmNhcmQpKTsKLQkJCXNwcmludGYodi0+YnVzX2luZm8sIklTQSIpOwotCQkJdi0+dmVyc2lvbiA9IFJBRElPX1ZFUlNJT047Ci0JCQl2LT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9UVU5FUjsKLQotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJY2FzZSBWSURJT0NfR19UVU5FUjoKLQkJewotCQkJc3RydWN0IHY0bDJfdHVuZXIgKnYgPSBhcmc7Ci0KLQkJCWlmICh2LT5pbmRleCA+IDApCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJCW1lbXNldCh2LDAsc2l6ZW9mKCp2KSk7Ci0JCQlzdHJjcHkodi0+bmFtZSwgIkZNIik7Ci0JCQl2LT50eXBlID0gVjRMMl9UVU5FUl9SQURJTzsKLQotCQkJdi0+cmFuZ2Vsb3c9KDg3LjUqMTYwMDApOwotCQkJdi0+cmFuZ2VoaWdoPSgxMDgqMTYwMDApOwotCQkJdi0+cnhzdWJjaGFucyA9VjRMMl9UVU5FUl9TVUJfTU9OTzsKLQkJCXYtPmNhcGFiaWxpdHk9VjRMMl9UVU5FUl9DQVBfTE9XOwotCQkJdi0+YXVkbW9kZSA9IFY0TDJfVFVORVJfTU9ERV9NT05POwotCQkJdi0+c2lnbmFsID0gMHhGRkZGOwkvKiBXZSBjYW4ndCBnZXQgdGhlIHNpZ25hbCBzdHJlbmd0aCAqLwotCi0JCQlyZXR1cm4gMDsKLQkJfQotCQljYXNlIFZJRElPQ19TX1RVTkVSOgotCQl7Ci0JCQlzdHJ1Y3QgdjRsMl90dW5lciAqdiA9IGFyZzsKLQotCQkJaWYgKHYtPmluZGV4ID4gMCkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJY2FzZSBWSURJT0NfU19GUkVRVUVOQ1k6Ci0JCXsKLQkJCXN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSAqZiA9IGFyZzsKLQotCQkJdHlwaG9vbi0+Y3VyZnJlcSA9IGYtPmZyZXF1ZW5jeTsKLQkJCXR5cGhvb25fc2V0ZnJlcSh0eXBob29uLCB0eXBob29uLT5jdXJmcmVxKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JCWNhc2UgVklESU9DX0dfRlJFUVVFTkNZOgotCQl7Ci0JCQlzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgKmYgPSBhcmc7Ci0KLQkJCWYtPnR5cGUgPSBWNEwyX1RVTkVSX1JBRElPOwotCQkJZi0+ZnJlcXVlbmN5ID0gdHlwaG9vbi0+Y3VyZnJlcTsKLQotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJY2FzZSBWSURJT0NfUVVFUllDVFJMOgotCQl7Ci0JCQlzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKnFjID0gYXJnOwotCQkJaW50IGk7Ci0KLQkJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHJhZGlvX3FjdHJsKTsgaSsrKSB7Ci0JCQkJaWYgKHFjLT5pZCAmJiBxYy0+aWQgPT0gcmFkaW9fcWN0cmxbaV0uaWQpIHsKLQkJCQkJbWVtY3B5KHFjLCAmKHJhZGlvX3FjdHJsW2ldKSwKLQkJCQkJCQkJc2l6ZW9mKCpxYykpOwotCQkJCQlyZXR1cm4gKDApOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCWNhc2UgVklESU9DX0dfQ1RSTDoKLQkJewotCQkJc3RydWN0IHY0bDJfY29udHJvbCAqY3RybD0gYXJnOwotCi0JCQlzd2l0Y2ggKGN0cmwtPmlkKSB7Ci0JCQkJY2FzZSBWNEwyX0NJRF9BVURJT19NVVRFOgotCQkJCQljdHJsLT52YWx1ZT10eXBob29uLT5tdXRlZDsKLQkJCQkJcmV0dXJuICgwKTsKLQkJCQljYXNlIFY0TDJfQ0lEX0FVRElPX1ZPTFVNRToKLQkJCQkJY3RybC0+dmFsdWU9dHlwaG9vbi0+Y3Vydm9sOwotCQkJCQlyZXR1cm4gKDApOwotCQkJfQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJY2FzZSBWSURJT0NfU19DVFJMOgotCQl7Ci0JCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsPSBhcmc7Ci0KLQkJCXN3aXRjaCAoY3RybC0+aWQpIHsKLQkJCQljYXNlIFY0TDJfQ0lEX0FVRElPX01VVEU6Ci0JCQkJCWlmIChjdHJsLT52YWx1ZSkgewotCQkJCQkJdHlwaG9vbl9tdXRlKHR5cGhvb24pOwotCQkJCQl9IGVsc2UgewotCQkJCQkJdHlwaG9vbl91bm11dGUodHlwaG9vbik7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuICgwKTsKLQkJCQljYXNlIFY0TDJfQ0lEX0FVRElPX1ZPTFVNRToKLQkJCQkJdHlwaG9vbl9zZXR2b2wodHlwaG9vbiwgY3RybC0+dmFsdWUpOwotCQkJCQlyZXR1cm4gKDApOwotCQkJfQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotCQlkZWZhdWx0OgotCQkJcmV0dXJuIHY0bF9jb21wYXRfdHJhbnNsYXRlX2lvY3RsKGlub2RlLGZpbGUsY21kLGFyZywKLQkJCQkJCQkgIHR5cGhvb25fZG9faW9jdGwpOwotCX0KKwl0eXBob29uLT5jdXJmcmVxID0gZi0+ZnJlcXVlbmN5OworCXR5cGhvb25fc2V0ZnJlcSh0eXBob29uLCB0eXBob29uLT5jdXJmcmVxKTsKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB0eXBob29uX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAotCQkJIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQorc3RhdGljIGludCB2aWRpb2NfZ19mcmVxdWVuY3koc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJCXN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSAqZikKIHsKLQlyZXR1cm4gdmlkZW9fdXNlcmNvcHkoaW5vZGUsIGZpbGUsIGNtZCwgYXJnLCB0eXBob29uX2RvX2lvY3RsKTsKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOworCXN0cnVjdCB0eXBob29uX2RldmljZSAqdHlwaG9vbiA9IGRldi0+cHJpdjsKKworCWYtPnR5cGUgPSBWNEwyX1RVTkVSX1JBRElPOworCWYtPmZyZXF1ZW5jeSA9IHR5cGhvb24tPmN1cmZyZXE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2NfcXVlcnljdHJsKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCQlzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKnFjKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocmFkaW9fcWN0cmwpOyBpKyspIHsKKwkJaWYgKHFjLT5pZCAmJiBxYy0+aWQgPT0gcmFkaW9fcWN0cmxbaV0uaWQpIHsKKwkJCW1lbWNweShxYywgJihyYWRpb19xY3RybFtpXSksCisJCQkJCQlzaXplb2YoKnFjKSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCB2aWRpb2NfZ19jdHJsKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQoreworCXN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7CisJc3RydWN0IHR5cGhvb25fZGV2aWNlICp0eXBob29uID0gZGV2LT5wcml2OworCisJc3dpdGNoIChjdHJsLT5pZCkgeworCWNhc2UgVjRMMl9DSURfQVVESU9fTVVURToKKwkJY3RybC0+dmFsdWUgPSB0eXBob29uLT5tdXRlZDsKKwkJcmV0dXJuIDA7CisJY2FzZSBWNEwyX0NJRF9BVURJT19WT0xVTUU6CisJCWN0cmwtPnZhbHVlID0gdHlwaG9vbi0+Y3Vydm9sOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX3NfY3RybCAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCit7CisJc3RydWN0IHZpZGVvX2RldmljZSAqZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKKwlzdHJ1Y3QgdHlwaG9vbl9kZXZpY2UgKnR5cGhvb24gPSBkZXYtPnByaXY7CisKKwlzd2l0Y2ggKGN0cmwtPmlkKSB7CisJY2FzZSBWNEwyX0NJRF9BVURJT19NVVRFOgorCQlpZiAoY3RybC0+dmFsdWUpCisJCQl0eXBob29uX211dGUodHlwaG9vbik7CisJCWVsc2UKKwkJCXR5cGhvb25fdW5tdXRlKHR5cGhvb24pOworCQlyZXR1cm4gMDsKKwljYXNlIFY0TDJfQ0lEX0FVRElPX1ZPTFVNRToKKwkJdHlwaG9vbl9zZXR2b2wodHlwaG9vbiwgY3RybC0+dmFsdWUpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX2dfYXVkaW8oc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJCXN0cnVjdCB2NGwyX2F1ZGlvICphKQoreworCWlmIChhLT5pbmRleCA+IDEpCisJCXJldHVybiAtRUlOVkFMOworCisJc3RyY3B5KGEtPm5hbWUsICJSYWRpbyIpOworCWEtPmNhcGFiaWxpdHkgPSBWNEwyX0FVRENBUF9TVEVSRU87CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX2dfaW5wdXQoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnByaXYsIHVuc2lnbmVkIGludCAqaSkKK3sKKwkqaSA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX3NfaW5wdXQoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnByaXYsIHVuc2lnbmVkIGludCBpKQoreworCWlmIChpICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpZGlvY19zX2F1ZGlvKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCQlzdHJ1Y3QgdjRsMl9hdWRpbyAqYSkKK3sKKwlpZiAoYS0+aW5kZXggIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgdHlwaG9vbl9kZXZpY2UgdHlwaG9vbl91bml0ID0KQEAgLTMyMiw3ICszMzksNyBAQAogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkub3BlbiAgICAgICAgICAgPSB2aWRlb19leGNsdXNpdmVfb3BlbiwKIAkucmVsZWFzZSAgICAgICAgPSB2aWRlb19leGNsdXNpdmVfcmVsZWFzZSwKLQkuaW9jdGwJCT0gdHlwaG9vbl9pb2N0bCwKKwkuaW9jdGwJCT0gdmlkZW9faW9jdGwyLAogCS5jb21wYXRfaW9jdGwJPSB2NGxfY29tcGF0X2lvY3RsMzIsCiAJLmxsc2VlayAgICAgICAgID0gbm9fbGxzZWVrLAogfTsKQEAgLTMzNCw2ICszNTEsMTggQEAKIAkudHlwZQkJPSBWSURfVFlQRV9UVU5FUiwKIAkuaGFyZHdhcmUJPSAwLAogCS5mb3BzICAgICAgICAgICA9ICZ0eXBob29uX2ZvcHMsCisJLnZpZGlvY19xdWVyeWNhcCAgICA9IHZpZGlvY19xdWVyeWNhcCwKKwkudmlkaW9jX2dfdHVuZXIgICAgID0gdmlkaW9jX2dfdHVuZXIsCisJLnZpZGlvY19zX3R1bmVyICAgICA9IHZpZGlvY19zX3R1bmVyLAorCS52aWRpb2NfZ19hdWRpbyAgICAgPSB2aWRpb2NfZ19hdWRpbywKKwkudmlkaW9jX3NfYXVkaW8gICAgID0gdmlkaW9jX3NfYXVkaW8sCisJLnZpZGlvY19nX2lucHV0ICAgICA9IHZpZGlvY19nX2lucHV0LAorCS52aWRpb2Nfc19pbnB1dCAgICAgPSB2aWRpb2Nfc19pbnB1dCwKKwkudmlkaW9jX2dfZnJlcXVlbmN5ID0gdmlkaW9jX2dfZnJlcXVlbmN5LAorCS52aWRpb2Nfc19mcmVxdWVuY3kgPSB2aWRpb2Nfc19mcmVxdWVuY3ksCisJLnZpZGlvY19xdWVyeWN0cmwgICA9IHZpZGlvY19xdWVyeWN0cmwsCisJLnZpZGlvY19nX2N0cmwgICAgICA9IHZpZGlvY19nX2N0cmwsCisJLnZpZGlvY19zX2N0cmwgICAgICA9IHZpZGlvY19zX2N0cmwsCiB9OwogCiAjaWZkZWYgQ09ORklHX1JBRElPX1RZUEhPT05fUFJPQ19GUwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby16b2x0cml4LmMgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXpvbHRyaXguYwppbmRleCBlYzA4NDkxLi5hNDcxNTkwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXpvbHRyaXguYworKysgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXpvbHRyaXguYwpAQCAtMjMwLDEyMSArMjMwLDEyMyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHpvbF9kb19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCXVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKK3N0YXRpYyBpbnQgdmlkaW9jX3F1ZXJ5Y2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICAqcHJpdiwKKwkJCQkJc3RydWN0IHY0bDJfY2FwYWJpbGl0eSAqdikKK3sKKwlzdHJsY3B5KHYtPmRyaXZlciwgInJhZGlvLXpvbHRyaXgiLCBzaXplb2Yodi0+ZHJpdmVyKSk7CisJc3RybGNweSh2LT5jYXJkLCAiWm9sdHJpeCBSYWRpbyIsIHNpemVvZih2LT5jYXJkKSk7CisJc3ByaW50Zih2LT5idXNfaW5mbywgIklTQSIpOworCXYtPnZlcnNpb24gPSBSQURJT19WRVJTSU9OOworCXYtPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX1RVTkVSOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpZGlvY19nX3R1bmVyKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCQlzdHJ1Y3QgdjRsMl90dW5lciAqdikKIHsKIAlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwogCXN0cnVjdCB6b2xfZGV2aWNlICp6b2wgPSBkZXYtPnByaXY7CiAKLQlzd2l0Y2ggKGNtZCkgewotCQljYXNlIFZJRElPQ19RVUVSWUNBUDoKLQkJewotCQkJc3RydWN0IHY0bDJfY2FwYWJpbGl0eSAqdiA9IGFyZzsKLQkJCW1lbXNldCh2LDAsc2l6ZW9mKCp2KSk7Ci0JCQlzdHJsY3B5KHYtPmRyaXZlciwgInJhZGlvLXpvbHRyaXgiLCBzaXplb2YgKHYtPmRyaXZlcikpOwotCQkJc3RybGNweSh2LT5jYXJkLCAiWm9sdHJpeCBSYWRpbyIsIHNpemVvZiAodi0+Y2FyZCkpOwotCQkJc3ByaW50Zih2LT5idXNfaW5mbywiSVNBIik7Ci0JCQl2LT52ZXJzaW9uID0gUkFESU9fVkVSU0lPTjsKLQkJCXYtPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX1RVTkVSOworCWlmICh2LT5pbmRleCA+IDApCisJCXJldHVybiAtRUlOVkFMOwogCisJc3RyY3B5KHYtPm5hbWUsICJGTSIpOworCXYtPnR5cGUgPSBWNEwyX1RVTkVSX1JBRElPOworCXYtPnJhbmdlbG93ID0gKDg4KjE2MDAwKTsKKwl2LT5yYW5nZWhpZ2ggPSAoMTA4KjE2MDAwKTsKKwl2LT5yeHN1YmNoYW5zID0gVjRMMl9UVU5FUl9TVUJfTU9OT3xWNEwyX1RVTkVSX1NVQl9TVEVSRU87CisJdi0+Y2FwYWJpbGl0eSA9IFY0TDJfVFVORVJfQ0FQX0xPVzsKKwlpZiAoem9sX2lzX3N0ZXJlbyh6b2wpKQorCQl2LT5hdWRtb2RlID0gVjRMMl9UVU5FUl9NT0RFX1NURVJFTzsKKwllbHNlCisJCXYtPmF1ZG1vZGUgPSBWNEwyX1RVTkVSX01PREVfTU9OTzsKKwl2LT5zaWduYWwgPSAweEZGRkYqem9sX2dldHNpZ3N0cih6b2wpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpZGlvY19zX3R1bmVyKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCQlzdHJ1Y3QgdjRsMl90dW5lciAqdikKK3sKKwlpZiAodi0+aW5kZXggPiAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2Nfc19mcmVxdWVuY3koc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJCXN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSAqZikKK3sKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOworCXN0cnVjdCB6b2xfZGV2aWNlICp6b2wgPSBkZXYtPnByaXY7CisKKwl6b2wtPmN1cmZyZXEgPSBmLT5mcmVxdWVuY3k7CisJem9sX3NldGZyZXEoem9sLCB6b2wtPmN1cmZyZXEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpZGlvY19nX2ZyZXF1ZW5jeShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQkJc3RydWN0IHY0bDJfZnJlcXVlbmN5ICpmKQoreworCXN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7CisJc3RydWN0IHpvbF9kZXZpY2UgKnpvbCA9IGRldi0+cHJpdjsKKworCWYtPnR5cGUgPSBWNEwyX1RVTkVSX1JBRElPOworCWYtPmZyZXF1ZW5jeSA9IHpvbC0+Y3VyZnJlcTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2NfcXVlcnljdHJsKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCQlzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKnFjKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocmFkaW9fcWN0cmwpOyBpKyspIHsKKwkJaWYgKHFjLT5pZCAmJiBxYy0+aWQgPT0gcmFkaW9fcWN0cmxbaV0uaWQpIHsKKwkJCW1lbWNweShxYywgJihyYWRpb19xY3RybFtpXSksCisJCQkJCQlzaXplb2YoKnFjKSk7CiAJCQlyZXR1cm4gMDsKIAkJfQotCQljYXNlIFZJRElPQ19HX1RVTkVSOgotCQl7Ci0JCQlzdHJ1Y3QgdjRsMl90dW5lciAqdiA9IGFyZzsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CiAKLQkJCWlmICh2LT5pbmRleCA+IDApCi0JCQkJcmV0dXJuIC1FSU5WQUw7CitzdGF0aWMgaW50IHZpZGlvY19nX2N0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKK3sKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOworCXN0cnVjdCB6b2xfZGV2aWNlICp6b2wgPSBkZXYtPnByaXY7CiAKLQkJCW1lbXNldCh2LDAsc2l6ZW9mKCp2KSk7Ci0JCQlzdHJjcHkodi0+bmFtZSwgIkZNIik7Ci0JCQl2LT50eXBlID0gVjRMMl9UVU5FUl9SQURJTzsKKwlzd2l0Y2ggKGN0cmwtPmlkKSB7CisJY2FzZSBWNEwyX0NJRF9BVURJT19NVVRFOgorCQljdHJsLT52YWx1ZSA9IHpvbC0+bXV0ZWQ7CisJCXJldHVybiAwOworCWNhc2UgVjRMMl9DSURfQVVESU9fVk9MVU1FOgorCQljdHJsLT52YWx1ZSA9IHpvbC0+Y3Vydm9sICogNDA5NjsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAtRUlOVkFMOworfQogCi0JCQl2LT5yYW5nZWxvdz0oODgqMTYwMDApOwotCQkJdi0+cmFuZ2VoaWdoPSgxMDgqMTYwMDApOwotCQkJdi0+cnhzdWJjaGFucyA9VjRMMl9UVU5FUl9TVUJfTU9OT3xWNEwyX1RVTkVSX1NVQl9TVEVSRU87Ci0JCQl2LT5jYXBhYmlsaXR5PVY0TDJfVFVORVJfQ0FQX0xPVzsKLQkJCWlmKHpvbF9pc19zdGVyZW8oem9sKSkKLQkJCQl2LT5hdWRtb2RlID0gVjRMMl9UVU5FUl9NT0RFX1NURVJFTzsKLQkJCWVsc2UKLQkJCQl2LT5hdWRtb2RlID0gVjRMMl9UVU5FUl9NT0RFX01PTk87Ci0JCQl2LT5zaWduYWw9MHhGRkZGKnpvbF9nZXRzaWdzdHIoem9sKTsKK3N0YXRpYyBpbnQgdmlkaW9jX3NfY3RybChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQoreworCXN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7CisJc3RydWN0IHpvbF9kZXZpY2UgKnpvbCA9IGRldi0+cHJpdjsKIAotCQkJcmV0dXJuIDA7CisJc3dpdGNoIChjdHJsLT5pZCkgeworCWNhc2UgVjRMMl9DSURfQVVESU9fTVVURToKKwkJaWYgKGN0cmwtPnZhbHVlKQorCQkJem9sX211dGUoem9sKTsKKwkJZWxzZSB7CisJCQl6b2xfdW5tdXRlKHpvbCk7CisJCQl6b2xfc2V0dm9sKHpvbCx6b2wtPmN1cnZvbCk7CiAJCX0KLQkJY2FzZSBWSURJT0NfU19UVU5FUjoKLQkJewotCQkJc3RydWN0IHY0bDJfdHVuZXIgKnYgPSBhcmc7Ci0KLQkJCWlmICh2LT5pbmRleCA+IDApCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJCXJldHVybiAwOwotCQl9Ci0JCWNhc2UgVklESU9DX1NfRlJFUVVFTkNZOgotCQl7Ci0JCQlzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgKmYgPSBhcmc7Ci0KLQkJCXpvbC0+Y3VyZnJlcSA9IGYtPmZyZXF1ZW5jeTsKLQkJCXpvbF9zZXRmcmVxKHpvbCwgem9sLT5jdXJmcmVxKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JCWNhc2UgVklESU9DX0dfRlJFUVVFTkNZOgotCQl7Ci0JCQlzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgKmYgPSBhcmc7Ci0KLQkJCWYtPnR5cGUgPSBWNEwyX1RVTkVSX1JBRElPOwotCQkJZi0+ZnJlcXVlbmN5ID0gem9sLT5jdXJmcmVxOwotCi0JCQlyZXR1cm4gMDsKLQkJfQotCQljYXNlIFZJRElPQ19RVUVSWUNUUkw6Ci0JCXsKLQkJCXN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWMgPSBhcmc7Ci0JCQlpbnQgaTsKLQotCQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocmFkaW9fcWN0cmwpOyBpKyspIHsKLQkJCQlpZiAocWMtPmlkICYmIHFjLT5pZCA9PSByYWRpb19xY3RybFtpXS5pZCkgewotCQkJCQltZW1jcHkocWMsICYocmFkaW9fcWN0cmxbaV0pLAotCQkJCQkJCQlzaXplb2YoKnFjKSk7Ci0JCQkJCXJldHVybiAoMCk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJY2FzZSBWSURJT0NfR19DVFJMOgotCQl7Ci0JCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsPSBhcmc7Ci0KLQkJCXN3aXRjaCAoY3RybC0+aWQpIHsKLQkJCQljYXNlIFY0TDJfQ0lEX0FVRElPX01VVEU6Ci0JCQkJCWN0cmwtPnZhbHVlPXpvbC0+bXV0ZWQ7Ci0JCQkJCXJldHVybiAoMCk7Ci0JCQkJY2FzZSBWNEwyX0NJRF9BVURJT19WT0xVTUU6Ci0JCQkJCWN0cmwtPnZhbHVlPXpvbC0+Y3Vydm9sICogNDA5NjsKLQkJCQkJcmV0dXJuICgwKTsKLQkJCX0KLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCWNhc2UgVklESU9DX1NfQ1RSTDoKLQkJewotCQkJc3RydWN0IHY0bDJfY29udHJvbCAqY3RybD0gYXJnOwotCi0JCQlzd2l0Y2ggKGN0cmwtPmlkKSB7Ci0JCQkJY2FzZSBWNEwyX0NJRF9BVURJT19NVVRFOgotCQkJCQlpZiAoY3RybC0+dmFsdWUpIHsKLQkJCQkJCXpvbF9tdXRlKHpvbCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl6b2xfdW5tdXRlKHpvbCk7Ci0JCQkJCQl6b2xfc2V0dm9sKHpvbCx6b2wtPmN1cnZvbCk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuICgwKTsKLQkJCQljYXNlIFY0TDJfQ0lEX0FVRElPX1ZPTFVNRToKLQkJCQkJem9sX3NldHZvbCh6b2wsY3RybC0+dmFsdWUvNDA5Nik7Ci0JCQkJCXJldHVybiAoMCk7Ci0JCQl9Ci0JCQl6b2wtPnN0ZXJlbyA9IDE7Ci0JCQl6b2xfc2V0ZnJlcSh6b2wsIHpvbC0+Y3VyZnJlcSk7CisJCXJldHVybiAwOworCWNhc2UgVjRMMl9DSURfQVVESU9fVk9MVU1FOgorCQl6b2xfc2V0dm9sKHpvbCxjdHJsLT52YWx1ZS80MDk2KTsKKwkJcmV0dXJuIDA7CisJfQorCXpvbC0+c3RlcmVvID0gMTsKKwl6b2xfc2V0ZnJlcSh6b2wsIHpvbC0+Y3VyZnJlcSk7CiAjaWYgMAogLyogRklYTUU6IEltcGxlbWVudCBzdGVyZW8vbW9ubyBzd2l0Y2ggb24gVjRMMiAqLwogCQkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9TVEVSRU8pIHsKQEAgLTM1NiwxOSArMzU4LDM5IEBACiAJCQkJem9sX3NldGZyZXEoem9sLCB6b2wtPmN1cmZyZXEpOwogCQkJfQogI2VuZGlmCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCi0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gdjRsX2NvbXBhdF90cmFuc2xhdGVfaW9jdGwoaW5vZGUsZmlsZSxjbWQsYXJnLAotCQkJCQkJCSAgem9sX2RvX2lvY3RsKTsKLQl9CisJcmV0dXJuIC1FSU5WQUw7CiB9CiAKLXN0YXRpYyBpbnQgem9sX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAotCQkgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQorc3RhdGljIGludCB2aWRpb2NfZ19hdWRpbyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQkJc3RydWN0IHY0bDJfYXVkaW8gKmEpCiB7Ci0JcmV0dXJuIHZpZGVvX3VzZXJjb3B5KGlub2RlLCBmaWxlLCBjbWQsIGFyZywgem9sX2RvX2lvY3RsKTsKKwlpZiAoYS0+aW5kZXggPiAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN0cmNweShhLT5uYW1lLCAiUmFkaW8iKTsKKwlhLT5jYXBhYmlsaXR5ID0gVjRMMl9BVURDQVBfU1RFUkVPOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpZGlvY19nX2lucHV0KHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwcml2LCB1bnNpZ25lZCBpbnQgKmkpCit7CisJKmkgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpZGlvY19zX2lucHV0KHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwcml2LCB1bnNpZ25lZCBpbnQgaSkKK3sKKwlpZiAoaSAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2Nfc19hdWRpbyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQkJc3RydWN0IHY0bDJfYXVkaW8gKmEpCit7CisJaWYgKGEtPmluZGV4ICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgc3RydWN0IHpvbF9kZXZpY2Ugem9sdHJpeF91bml0OwpAQCAtMzc4LDcgKzQwMCw3IEBACiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCS5vcGVuICAgICAgICAgICA9IHZpZGVvX2V4Y2x1c2l2ZV9vcGVuLAogCS5yZWxlYXNlICAgICAgICA9IHZpZGVvX2V4Y2x1c2l2ZV9yZWxlYXNlLAotCS5pb2N0bAkJPSB6b2xfaW9jdGwsCisJLmlvY3RsCQk9IHZpZGVvX2lvY3RsMiwKIAkuY29tcGF0X2lvY3RsCT0gdjRsX2NvbXBhdF9pb2N0bDMyLAogCS5sbHNlZWsgICAgICAgICA9IG5vX2xsc2VlaywKIH07CkBAIC0zOTAsNiArNDEyLDE4IEBACiAJLnR5cGUJCT0gVklEX1RZUEVfVFVORVIsCiAJLmhhcmR3YXJlCT0gMCwKIAkuZm9wcyAgICAgICAgICAgPSAmem9sdHJpeF9mb3BzLAorCS52aWRpb2NfcXVlcnljYXAgICAgPSB2aWRpb2NfcXVlcnljYXAsCisJLnZpZGlvY19nX3R1bmVyICAgICA9IHZpZGlvY19nX3R1bmVyLAorCS52aWRpb2Nfc190dW5lciAgICAgPSB2aWRpb2Nfc190dW5lciwKKwkudmlkaW9jX2dfYXVkaW8gICAgID0gdmlkaW9jX2dfYXVkaW8sCisJLnZpZGlvY19zX2F1ZGlvICAgICA9IHZpZGlvY19zX2F1ZGlvLAorCS52aWRpb2NfZ19pbnB1dCAgICAgPSB2aWRpb2NfZ19pbnB1dCwKKwkudmlkaW9jX3NfaW5wdXQgICAgID0gdmlkaW9jX3NfaW5wdXQsCisJLnZpZGlvY19nX2ZyZXF1ZW5jeSA9IHZpZGlvY19nX2ZyZXF1ZW5jeSwKKwkudmlkaW9jX3NfZnJlcXVlbmN5ID0gdmlkaW9jX3NfZnJlcXVlbmN5LAorCS52aWRpb2NfcXVlcnljdHJsICAgPSB2aWRpb2NfcXVlcnljdHJsLAorCS52aWRpb2NfZ19jdHJsICAgICAgPSB2aWRpb2NfZ19jdHJsLAorCS52aWRpb2Nfc19jdHJsICAgICAgPSB2aWRpb2Nfc19jdHJsLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgem9sdHJpeF9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL0tjb25maWcgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL0tjb25maWcKaW5kZXggN2E2MTA1MS4uYmM3NzM3OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vS2NvbmZpZwpAQCAtNTc3LDE0ICs1NzcsMTQgQEAKIAogY29uZmlnIFZJREVPX01FWUUKIAl0cmlzdGF0ZSAiU29ueSBWYWlvIFBpY3R1cmVib29rIE1vdGlvbiBFeWUgVmlkZW8gRm9yIExpbnV4IgotCWRlcGVuZHMgb24gUENJICYmIFNPTllQSSAmJiBWSURFT19WNEwxCisJZGVwZW5kcyBvbiBQQ0kgJiYgU09OWV9MQVBUT1AgJiYgVklERU9fVjRMMQogCS0tLWhlbHAtLS0KIAkgIFRoaXMgaXMgdGhlIHZpZGVvNGxpbnV4IGRyaXZlciBmb3IgdGhlIE1vdGlvbiBFeWUgY2FtZXJhIGZvdW5kCiAJICBpbiB0aGUgVmFpbyBQaWN0dXJlYm9vayBsYXB0b3BzLiBQbGVhc2UgcmVhZCB0aGUgbWF0ZXJpYWwgaW4KIAkgIDxmaWxlOkRvY3VtZW50YXRpb24vdmlkZW80bGludXgvbWV5ZS50eHQ+IGZvciBtb3JlIGluZm9ybWF0aW9uLgogCi0JICBJZiB5b3Ugc2F5IFkgb3IgTSBoZXJlLCB5b3UgbmVlZCB0byBzYXkgWSBvciBNIHRvICJTb255IFByb2dyYW1tYWJsZQotCSAgSS9PIENvbnRyb2wgRGV2aWNlIiBpbiB0aGUgY2hhcmFjdGVyIGRldmljZSBzZWN0aW9uLgorCSAgSWYgeW91IHNheSBZIG9yIE0gaGVyZSwgeW91IG5lZWQgdG8gc2F5IFkgb3IgTSB0byAiU29ueSBMYXB0b3AKKwkgIEV4dHJhcyIgaW4gdGhlIG1pc2MgZGV2aWNlIHNlY3Rpb24uCiAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIG1leWUuCkBAIC02NDcsNiArNjQ3LDggQEAKIAogc291cmNlICJkcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvS2NvbmZpZyIKIAorc291cmNlICJkcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvS2NvbmZpZyIKKwogY29uZmlnIFZJREVPX00zMlJfQVIKIAl0cmlzdGF0ZSAiQVIgZGV2aWNlcyIKIAlkZXBlbmRzIG9uIE0zMlIgJiYgVklERU9fVjRMMQpAQCAtNzYxLDYgKzc2MywxOCBAQAogCiBzb3VyY2UgImRyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL0tjb25maWciCiAKK2NvbmZpZyBVU0JfWlIzNjRYWAorCXRyaXN0YXRlICJVU0IgWlIzNjRYWCBDYW1lcmEgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFVTQiAmJiBWSURFT19WNEwyCisJLS0taGVscC0tLQorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBjb25uZWN0IHRoaXMgdHlwZSBvZiBjYW1lcmEgdG8geW91cgorCSAgY29tcHV0ZXIncyBVU0IgcG9ydC4KKwkgIFNlZSA8ZmlsZTpEb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L3pyMzY0eHgudHh0PiBmb3IgbW9yZSBpbmZvCisJICBhbmQgbGlzdCBvZiBzdXBwb3J0ZWQgY2FtZXJhcy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgenIzNjR4eC4KKwogZW5kbWVudSAjIFY0TCBVU0IgZGV2aWNlcwogCiBlbmRtZW51CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS92aWRlby9NYWtlZmlsZQppbmRleCA0NGNjYWVkLi45YzJkZTUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vTWFrZWZpbGUKQEAgLTYxLDYgKzYxLDcgQEAKIG9iai0kKENPTkZJR19WSURFT19NRVlFKSArPSBtZXllLm8KIG9iai0kKENPTkZJR19WSURFT19TQUE3MTM0KSArPSBpci1rYmQtaTJjLm8gc2FhNzEzNC8KIG9iai0kKENPTkZJR19WSURFT19DWDg4KSArPSBjeDg4Lworb2JqLSQoQ09ORklHX1ZJREVPX0lWVFYpICs9IGl2dHYvCiBvYmotJChDT05GSUdfVklERU9fRU0yOFhYKSArPSBlbTI4eHgvCiBvYmotJChDT05GSUdfVklERU9fVVNCVklTSU9OKSArPSB1c2J2aXNpb24vCiBvYmotJChDT05GSUdfVklERU9fVFZQNTE1MCkgKz0gdHZwNTE1MC5vCkBAIC05OSw2ICsxMDAsNyBAQAogb2JqLSQoQ09ORklHX1VTQl9TRTQwMSkgICAgICAgICArPSBzZTQwMS5vCiBvYmotJChDT05GSUdfVVNCX1NUVjY4MCkgICAgICAgICs9IHN0djY4MC5vCiBvYmotJChDT05GSUdfVVNCX1c5OTY4Q0YpICAgICAgICs9IHc5OTY4Y2Yubworb2JqLSQoQ09ORklHX1VTQl9aUjM2NFhYKSAgICAgICArPSB6cjM2NHh4Lm8KIAogb2JqLSQoQ09ORklHX1VTQl9TTjlDMTAyKSAgICAgICArPSBzbjljMTAyLwogb2JqLSQoQ09ORklHX1VTQl9FVDYxWDI1MSkgICAgICArPSBldDYxeDI1MS8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvYnR0di1jYXJkcy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2LWNhcmRzLmMKaW5kZXggNmFkZGM0Mi4uNmIzMWU1MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2LWNhcmRzLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2LWNhcmRzLmMKQEAgLTI5MSw2ICsyOTEsOSBAQAogCiAJeyAweDE1NDA5NTExLCBCVFRWX0JPQVJEX0FDT1JQX1k4NzhGLCAiQWNvcnAgWTg3OEYiIH0sCiAKKwl7IDB4NTM1MzQxNDksIEJUVFZfQk9BUkRfU1NBSV9TRUNVUklUWSwgIlNTQUkgU2VjdXJpdHkgVmlkZW8gSW50ZXJmYWNlIiB9LAorCXsgMHg1MzUzNDE0YSwgQlRUVl9CT0FSRF9TU0FJX1VMVFJBU09VTkQsICJTU0FJIFVsdHJhc291bmQgVmlkZW8gSW50ZXJmYWNlIiB9LAorCiAJLyogbGlrZWx5IGJyb2tlbiwgdmVuZG9yIGlkIGRvZXNuJ3QgbWF0Y2ggdGhlIG90aGVyIG1hZ2ljIHZpZXdzIC4uLgogCSAqIHsgMHhhMGZjYTA0ZiwgQlRUVl9CT0FSRF9NQUdJQ1RWSUVXMDYzLCAiR3VpbGxlbW90IE1heGkgVFYgVmlkZW8gMyIgfSwgKi8KIApAQCAtMjkwNyw2ICsyOTEwLDI4IEBACiAJCS5oYXNfcmFkaW8gICAgICA9IDEsCiAJCS5oYXNfcmVtb3RlICAgICA9IDEsCiAJfSwKKwlbQlRUVl9CT0FSRF9TU0FJX1NFQ1VSSVRZXSA9IHsKKwkJLm5hbWUJCT0gIlNTQUkgU2VjdXJpdHkgVmlkZW8gSW50ZXJmYWNlIiwKKwkJLnZpZGVvX2lucHV0cwk9IDQsCisJCS5hdWRpb19pbnB1dHMJPSAwLAorCQkudHVuZXIJCT0gLTEsCisJCS5zdmhzCQk9IC0xLAorCQkubXV4c2VsCQk9IHsgMCwgMSwgMiwgMyB9LAorCQkudHVuZXJfdHlwZQk9IC0xLAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCisJfSwKKwlbQlRUVl9CT0FSRF9TU0FJX1VMVFJBU09VTkRdID0geworCQkubmFtZQkJPSAiU1NBSSBVbHRyYXNvdW5kIFZpZGVvIEludGVyZmFjZSIsCisJCS52aWRlb19pbnB1dHMJPSAyLAorCQkuYXVkaW9faW5wdXRzCT0gMCwKKwkJLnR1bmVyCQk9IC0xLAorCQkuc3ZocwkJPSAxLAorCQkubXV4c2VsCQk9IHsgMiwgMCwgMSwgMyB9LAorCQkudHVuZXJfdHlwZQk9IC0xLAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCisJfSwKIH07CiAKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgYnR0dl9udW1fdHZjYXJkcyA9IEFSUkFZX1NJWkUoYnR0dl90dmNhcmRzKTsKQEAgLTI5NzAsMjAgKzI5OTUsMjAgQEAKIAogCWlmIChVTlNFVCAhPSBhdWRpb211eFswXSkgewogCQlncGlvYml0cyA9IDA7Ci0JCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYnR0dl90dmNhcmRzLT5ncGlvbXV4KTsgaSsrKSB7CiAJCQlidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLmdwaW9tdXhbaV0gPSBhdWRpb211eFtpXTsKIAkJCWdwaW9iaXRzIHw9IGF1ZGlvbXV4W2ldOwogCQl9CiAJfSBlbHNlIHsKIAkJZ3Bpb2JpdHMgPSBhdWRpb2FsbDsKLQkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShidHR2X3R2Y2FyZHMtPmdwaW9tdXgpOyBpKyspIHsKIAkJCWJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uZ3Bpb211eFtpXSA9IGF1ZGlvYWxsOwogCQl9CiAJfQogCWJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uZ3Bpb21hc2sgPSAoVU5TRVQgIT0gZ3Bpb21hc2spID8gZ3Bpb21hc2sgOiBncGlvYml0czsKIAlwcmludGsoS0VSTl9JTkZPICJidHR2JWQ6IGdwaW8gY29uZmlnIG92ZXJyaWRlOiBtYXNrPTB4JXgsIG11eD0iLAogCSAgICAgICBidHYtPmMubnIsYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5ncGlvbWFzayk7Ci0JZm9yIChpID0gMDsgaSA8IDU7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGJ0dHZfdHZjYXJkcy0+Z3Bpb211eCk7IGkrKykgewogCQlwcmludGsoIiVzMHgleCIsIGkgPyAiLCIgOiAiIiwgYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5ncGlvbXV4W2ldKTsKIAl9CiAJcHJpbnRrKCJcbiIpOwpAQCAtMzYzOCw3ICszNjYzLDcgQEAKIAogCWZvciAobiA9IDA7IG4gPCBtaWNyb2xlbjsgbisrKSB7CiAJCWJpdHMgPSBtaWNyb1tuXTsKLQkJZm9yICggaSA9IDAgOyBpIDwgOCA7IGkrKyApIHsKKwkJZm9yIChpID0gMCA7IGkgPCA4IDsgaSsrKSB7CiAJCQlncGlvX2JpdHMoQlRUVl9BTFRfRENMSywwKTsKIAkJCWlmIChiaXRzICYgMHgwMSkKIAkJCQlncGlvX2JpdHMoQlRUVl9BTFRfREFUQSxCVFRWX0FMVF9EQVRBKTsKQEAgLTM2OTEsNyArMzcxNiw3IEBACiAJICAgICAgIC8qIHRoaXMgbWlnaHQgYmUgYW4gYW50aXF1ZS4uLiBjaGVjayBmb3IgTU1BQyBsYWJlbCBpbiBlZXByb20gKi8KIAkgICAgICAgaWYgKChlZVswXT09J00nKSAmJiAoZWVbMV09PSdNJykgJiYgKGVlWzJdPT0nQScpICYmIChlZVszXT09J0MnKSkgewogCQkgICAgICAgdW5zaWduZWQgY2hhciBjaGVja3N1bSA9IDA7Ci0JCSAgICAgICBmb3IgKGkgPTA7IGk8MjE7IGkrKykKKwkJICAgICAgIGZvciAoaSA9IDA7IGkgPCAyMTsgaSsrKQogCQkJICAgICAgIGNoZWNrc3VtICs9IGVlW2ldOwogCQkgICAgICAgaWYgKGNoZWNrc3VtICE9IGVlWzIxXSkKIAkJCSAgICAgICByZXR1cm47CkBAIC0zNzAzLDEyICszNzI4LDEzIEBACiAJICAgICAgIHVuc2lnbmVkIHNob3J0IHR5cGU7CiAJICAgICAgIGludCBvZmZzZXQgPSA0KjE2OwogCi0JICAgICAgIGZvcig7IG9mZnNldCA8IDgqMTY7IG9mZnNldCArPSAxNikgeworCSAgICAgICBmb3IgKDsgb2Zmc2V0IDwgOCoxNjsgb2Zmc2V0ICs9IDE2KSB7CiAJCSAgICAgICB1bnNpZ25lZCBzaG9ydCBjaGVja3N1bSA9IDA7CiAJCSAgICAgICAvKiB2ZXJpZnkgdGhlIGNoZWNrc3VtICovCi0JCSAgICAgICBmb3IoaSA9IDA7IGk8MTQ7IGkrKykgY2hlY2tzdW0gKz0gZWVbaStvZmZzZXRdOwotCQkJICAgICAgIGNoZWNrc3VtID0gfmNoZWNrc3VtOyAgLyogbm8gaWRlYSB3aHkgKi8KLQkJCSAgICAgICBpZiAoKCgoY2hlY2tzdW0+PjgpJjB4MEZGKSA9PSBlZVtvZmZzZXQrMTRdKSAmJgorCQkgICAgICAgZm9yIChpID0gMDsgaSA8IDE0OyBpKyspCisJCQkJY2hlY2tzdW0gKz0gZWVbaStvZmZzZXRdOworCQkJY2hlY2tzdW0gPSB+Y2hlY2tzdW07ICAvKiBubyBpZGVhIHdoeSAqLworCQkJaWYgKCgoKGNoZWNrc3VtPj44KSYweDBGRikgPT0gZWVbb2Zmc2V0KzE0XSkgJiYKIAkJCQkgICAoKGNoZWNrc3VtICYgMHgwRkYpID09IGVlW29mZnNldCsxNV0pKSB7CiAJCQkgICAgICAgYnJlYWs7CiAJCSAgICAgICB9CkBAIC0zNzIxLDcgKzM3NDcsNiBAQAogCSAgICAgICB0eXBlID0gKGVlW29mZnNldCs0XTw8OCkgfCAoZWVbb2Zmc2V0KzVdKTsKIAogCSAgICAgICBzd2l0Y2godHlwZSkgewotCiAJICAgICAgIC8qIDg0OCBiYXNlZCAqLwogCSAgICAgICBjYXNlIDB4MDAwNDoKIAkJICAgICAgIGJ0di0+Yy50eXBlID0gQlRUVl9CT0FSRF9PU1BSRVkxeDBfODQ4OwpAQCAtNDE0OSw4ICs0MTc0LDcgQEAKIAl9CiAKIAlkcHJpbnRrKCJidHR2JWQ6IHRlYTU3NTc6IixidHYtPmMubnIpOwotCWZvcihpID0gMDsgaSA8IDI0OyBpKyspCi0JeworCWZvciAoaSA9IDA7IGkgPCAyNDsgaSsrKSB7CiAJCXVkZWxheSg1KTsKIAkJYnVzX2hpZ2goYnR2LGJ0di0+bWJveF9jbGspOwogCQl1ZGVsYXkoNSk7CkBAIC00MTgyLDggKzQyMDYsNyBAQAogCWRwcmludGsoImJ0dHYlZDogdGVhNTc1Nzogd3JpdGUgMHglWFxuIiwgYnR2LT5jLm5yLCB2YWx1ZSk7CiAJYnVzX2xvdyhidHYsYnR2LT5tYm94X2Nsayk7CiAJYnVzX2hpZ2goYnR2LGJ0di0+bWJveF93ZSk7Ci0JZm9yKGkgPSAwOyBpIDwgMjU7IGkrKykKLQl7CisJZm9yIChpID0gMDsgaSA8IDI1OyBpKyspIHsKIAkJaWYgKHJlZyAmIDB4MTAwMDAwMCkKIAkJCWJ1c19oaWdoKGJ0dixidHYtPm1ib3hfZGF0YSk7CiAJCWVsc2UKQEAgLTQ3NTUsNyArNDc3OCw3IEBACiAJZ3Bpb193cml0ZSgxIDw8IDkpOwkvKiByZXNldCBNVVggKi8KIAlncGlvX3dyaXRlKDApOwogCS8qIFByZXNldCBjYW1lcmEgMCB0byB0aGUgNCBjb250cm9sbGVycyAqLwotCWZvciAoaXg9MDsgaXg8NDsgaXgrKykgeworCWZvciAoaXggPSAwOyBpeCA8IDQ7IGl4KyspIHsKIAkJc3dfc3RhdHVzW2l4XSA9IGl4OwogCQlrb2RpY29tNDQwMHJfd3JpdGUoYnR2LCBpeCwgaXgsIDEpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvYnR0di1kcml2ZXIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvYnR0di1kcml2ZXIuYwppbmRleCA1NzIwYjc3Li4xYzM4NzIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYtZHJpdmVyLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2LWRyaXZlci5jCkBAIC0xNjQsNiArMTY0LDI0IEBACiBzdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIoY2FyZCwgU19JUlVHTywgc2hvd19jYXJkLCBOVUxMKTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIGR2YiBhdXRvLWxvYWQgc2V0dXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjaWYgZGVmaW5lZChDT05GSUdfTU9EVUxFUykgJiYgZGVmaW5lZChNT0RVTEUpCitzdGF0aWMgdm9pZCByZXF1ZXN0X21vZHVsZV9hc3luYyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJcmVxdWVzdF9tb2R1bGUoImR2Yi1idDh4eCIpOworfQorCitzdGF0aWMgdm9pZCByZXF1ZXN0X21vZHVsZXMoc3RydWN0IGJ0dHYgKmRldikKK3sKKwlJTklUX1dPUksoJmRldi0+cmVxdWVzdF9tb2R1bGVfd2ssIHJlcXVlc3RfbW9kdWxlX2FzeW5jKTsKKwlzY2hlZHVsZV93b3JrKCZkZXYtPnJlcXVlc3RfbW9kdWxlX3drKTsKK30KKyNlbHNlCisjZGVmaW5lIHJlcXVlc3RfbW9kdWxlcyhkZXYpCisjZW5kaWYgLyogQ09ORklHX01PRFVMRVMgKi8KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogLyogc3RhdGljIGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIAogLyogc3BlY2lhbCB0aW1pbmcgdGFibGVzIGZyb20gY29uZXhhbnQuLi4gKi8KQEAgLTQ3NjksOSArNDc4NywxMSBAQAogCQlkaXNjbGFpbV92aWRlb19saW5lcyhidHYpOwogCX0KIAotCS8qIGFkZCBzdWJkZXZpY2VzICovCi0JaWYgKGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uaGFzX2R2YikKKwkvKiBhZGQgc3ViZGV2aWNlcyBhbmQgYXV0b2xvYWQgZHZiLWJ0OHh4IGlmIG5lZWRlZCAqLworCWlmIChidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLmhhc19kdmIpIHsKIAkJYnR0dl9zdWJfYWRkX2RldmljZSgmYnR2LT5jLCAiZHZiIik7CisJCXJlcXVlc3RfbW9kdWxlcyhidHYpOworCX0KIAogCWJ0dHZfaW5wdXRfaW5pdChidHYpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYtZ3Bpby5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2LWdwaW8uYwppbmRleCBiYTA4MWY2Li44NDE1NGMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYtZ3Bpby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvYnR0di1ncGlvLmMKQEAgLTcxLDcgKzcxLDYgQEAKIAkucHJvYmUgID0gYnR0dl9zdWJfcHJvYmUsCiAJLnJlbW92ZSA9IGJ0dHZfc3ViX3JlbW92ZSwKIH07Ci1FWFBPUlRfU1lNQk9MKGJ0dHZfc3ViX2J1c190eXBlKTsKIAogc3RhdGljIHZvaWQgcmVsZWFzZV9zdWJfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKQEAgLTE1Miw3ICsxNTEsNiBAQAogCWJ0d3JpdGUoZGF0YSxCVDg0OF9HUElPX09VVF9FTik7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnR2LT5ncGlvX2xvY2ssZmxhZ3MpOwogfQotRVhQT1JUX1NZTUJPTChidHR2X2dwaW9faW5vdXQpOwogCiB1MzIgYnR0dl9ncGlvX3JlYWQoc3RydWN0IGJ0dHZfY29yZSAqY29yZSkKIHsKQEAgLTE2Miw3ICsxNjAsNiBAQAogCXZhbHVlID0gYnRyZWFkKEJUODQ4X0dQSU9fREFUQSk7CiAJcmV0dXJuIHZhbHVlOwogfQotRVhQT1JUX1NZTUJPTChidHR2X2dwaW9fcmVhZCk7CiAKIHZvaWQgYnR0dl9ncGlvX3dyaXRlKHN0cnVjdCBidHR2X2NvcmUgKmNvcmUsIHUzMiB2YWx1ZSkKIHsKQEAgLTE3MCw3ICsxNjcsNiBAQAogCiAJYnR3cml0ZSh2YWx1ZSxCVDg0OF9HUElPX0RBVEEpOwogfQotRVhQT1JUX1NZTUJPTChidHR2X2dwaW9fd3JpdGUpOwogCiB2b2lkIGJ0dHZfZ3Bpb19iaXRzKHN0cnVjdCBidHR2X2NvcmUgKmNvcmUsIHUzMiBtYXNrLCB1MzIgYml0cykKIHsKQEAgLTE4NSw3ICsxODEsNiBAQAogCWJ0d3JpdGUoZGF0YSxCVDg0OF9HUElPX0RBVEEpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJ0di0+Z3Bpb19sb2NrLGZsYWdzKTsKIH0KLUVYUE9SVF9TWU1CT0woYnR0dl9ncGlvX2JpdHMpOwogCiAvKgogICogTG9jYWwgdmFyaWFibGVzOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2LWkyYy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2LWkyYy5jCmluZGV4IDYyYjg3MzAuLjBkZmE0OWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvYnR0di1pMmMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYtaTJjLmMKQEAgLTQxMiw3ICs0MTIsNyBAQAogCXVuc2lnbmVkIGNoYXIgYnVmOwogCWludCBpLHJjOwogCi0JZm9yIChpID0gMDsgaSA8IDEyODsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaTJjX2RldnMpOyBpKyspIHsKIAkJYy0+YWRkciA9IGk7CiAJCXJjID0gaTJjX21hc3Rlcl9yZWN2KGMsJmJ1ZiwwKTsKIAkJaWYgKHJjIDwgMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvYnR0di1pZi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2LWlmLmMKaW5kZXggMTliNTY0YS4uZWNmMDc5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2LWlmLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2LWlmLmMKQEAgLTMzLDMyICszMywxNiBAQAogCiAjaW5jbHVkZSAiYnR0dnAuaCIKIAotRVhQT1JUX1NZTUJPTChidHR2X2dldF9jYXJkaW5mbyk7CiBFWFBPUlRfU1lNQk9MKGJ0dHZfZ2V0X3BjaWRldik7Ci1FWFBPUlRfU1lNQk9MKGJ0dHZfZ2V0X2lkKTsKIEVYUE9SVF9TWU1CT0woYnR0dl9ncGlvX2VuYWJsZSk7CiBFWFBPUlRfU1lNQk9MKGJ0dHZfcmVhZF9ncGlvKTsKIEVYUE9SVF9TWU1CT0woYnR0dl93cml0ZV9ncGlvKTsKLUVYUE9SVF9TWU1CT0woYnR0dl9nZXRfZ3Bpb19xdWV1ZSk7Ci1FWFBPUlRfU1lNQk9MKGJ0dHZfaTJjX2NhbGwpOwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0gZm9yIG90aGVyIG1vZHVsZXMgd2hpY2ggd2FudCB0byBhY2Nlc3MgdGhlICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgIGdwaW8gcG9ydHMgKElSIGZvciBleGFtcGxlKSAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICBzZWUgYnR0di5oIGZvciBjb21tZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogCi1pbnQgYnR0dl9nZXRfY2FyZGluZm8odW5zaWduZWQgaW50IGNhcmQsIGludCAqdHlwZSwgdW5zaWduZWQgKmNhcmRpZCkKLXsKLQlwcmludGsoIlRoZSBidHR2XyogaW50ZXJmYWNlIGlzIG9ic29sZXRlIGFuZCB3aWxsIGdvIGF3YXksXG4iCi0JICAgICAgICJwbGVhc2UgdXNlIHRoZSBuZXcsIHN5c2ZzIGJhc2VkIGludGVyZmFjZSBpbnN0ZWFkLlxuIik7Ci0JaWYgKGNhcmQgPj0gYnR0dl9udW0pIHsKLQkJcmV0dXJuIC0xOwotCX0KLQkqdHlwZSAgID0gYnR0dnNbY2FyZF0uYy50eXBlOwotCSpjYXJkaWQgPSBidHR2c1tjYXJkXS5jYXJkaWQ7Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0cnVjdCBwY2lfZGV2KiBidHR2X2dldF9wY2lkZXYodW5zaWduZWQgaW50IGNhcmQpCiB7CiAJaWYgKGNhcmQgPj0gYnR0dl9udW0pCkBAIC02NiwxNiArNTAsNiBAQAogCXJldHVybiBidHR2c1tjYXJkXS5jLnBjaTsKIH0KIAotaW50IGJ0dHZfZ2V0X2lkKHVuc2lnbmVkIGludCBjYXJkKQotewotCXByaW50aygiVGhlIGJ0dHZfKiBpbnRlcmZhY2UgaXMgb2Jzb2xldGUgYW5kIHdpbGwgZ28gYXdheSxcbiIKLQkgICAgICAgInBsZWFzZSB1c2UgdGhlIG5ldywgc3lzZnMgYmFzZWQgaW50ZXJmYWNlIGluc3RlYWQuXG4iKTsKLQlpZiAoY2FyZCA+PSBidHR2X251bSkgewotCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiBidHR2c1tjYXJkXS5jLnR5cGU7Ci19Ci0KIAogaW50IGJ0dHZfZ3Bpb19lbmFibGUodW5zaWduZWQgaW50IGNhcmQsIHVuc2lnbmVkIGxvbmcgbWFzaywgdW5zaWduZWQgbG9uZyBkYXRhKQogewpAQCAtMTMwLDI4ICsxMDQsNiBAQAogCXJldHVybiAwOwogfQogCi13YWl0X3F1ZXVlX2hlYWRfdCogYnR0dl9nZXRfZ3Bpb19xdWV1ZSh1bnNpZ25lZCBpbnQgY2FyZCkKLXsKLQlzdHJ1Y3QgYnR0diAqYnR2OwotCi0JaWYgKGNhcmQgPj0gYnR0dl9udW0pIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JYnR2ID0gJmJ0dHZzW2NhcmRdOwotCWlmIChidHR2c1tjYXJkXS5zaHV0ZG93bikgewotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuICZidHYtPmdwaW9xOwotfQotCi12b2lkIGJ0dHZfaTJjX2NhbGwodW5zaWduZWQgaW50IGNhcmQsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKLXsKLQlpZiAoY2FyZCA+PSBidHR2X251bSkKLQkJcmV0dXJuOwotCWJ0dHZfY2FsbF9pMmNfY2xpZW50cygmYnR0dnNbY2FyZF0sIGNtZCwgYXJnKTsKLX0KLQogLyoKICAqIExvY2FsIHZhcmlhYmxlczoKICAqIGMtYmFzaWMtb2Zmc2V0OiA4CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvYnR0di5oCmluZGV4IDU0OTFhY2IuLmY4MjFiYTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvYnR0di5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvYnR0di5oCkBAIC0xNjgsNiArMTY4LDggQEAKICNkZWZpbmUgQlRUVl9CT0FSRF9TQUJSRU5UX1RWRk0gICAJICAgMHg4ZQogI2RlZmluZSBCVFRWX0JPQVJEX0hBVVBQQVVHRV9JTVBBQ1RWQ0IgICAgIDB4OGYKICNkZWZpbmUgQlRUVl9CT0FSRF9NQUNIVFZfTUFHSUNUViAgICAgICAgICAweDkwCisjZGVmaW5lIEJUVFZfQk9BUkRfU1NBSV9TRUNVUklUWQkgICAweDkxCisjZGVmaW5lIEJUVFZfQk9BUkRfU1NBSV9VTFRSQVNPVU5ECSAgIDB4OTIKIAogLyogbW9yZSBjYXJkLXNwZWNpZmljIGRlZmluZXMgKi8KICNkZWZpbmUgUFQyMjU0X0xfQ0hBTk5FTCAweDEwCkBAIC0yNjAsMTcgKzI2Miw4IEBACiAvKiB0aGlzIG9ic29sZXRlIC0tIHBsZWFzZSB1c2UgdGhlIHN5c2ZzLWJhc2VkCiAgICBpbnRlcmZhY2UgYmVsb3cgZm9yIG5ldyBjb2RlICovCiAKLS8qIHJldHVybnMgY2FyZCB0eXBlICsgY2FyZCBJRCAoZm9yIGJ0ODc4LWJhc2VkIG9uZXMpCi0gICBmb3IgcG9zc2libGUgdmFsdWVzIHNlZSBsaW5lcyBiZWxvdyBiZWdpbm5pbmcgd2l0aCAjZGVmaW5lIEJUVFZfQk9BUkRfVU5LTk9XTgotICAgcmV0dXJucyBuZWdhdGl2ZSB2YWx1ZSBpZiBlcnJvciBvY2N1cnJlZAotKi8KLWV4dGVybiBpbnQgYnR0dl9nZXRfY2FyZGluZm8odW5zaWduZWQgaW50IGNhcmQsIGludCAqdHlwZSwKLQkJCSAgICAgdW5zaWduZWQgaW50ICpjYXJkaWQpOwogZXh0ZXJuIHN0cnVjdCBwY2lfZGV2KiBidHR2X2dldF9wY2lkZXYodW5zaWduZWQgaW50IGNhcmQpOwogCi0vKiBvYnNvbGV0ZSwgdXNlIGJ0dHZfZ2V0X2NhcmRpbmZvIGluc3RlYWQgKi8KLWV4dGVybiBpbnQgYnR0dl9nZXRfaWQodW5zaWduZWQgaW50IGNhcmQpOwotCiAvKiBzZXRzIEdQT0UgcmVnaXN0ZXIgKEJUODQ4X0dQSU9fT1VUX0VOKSB0byBuZXcgdmFsdWU6CiAgICBkYXRhIHwgKGN1cnJlbnRfR1BPRV92YWx1ZSAmIH5tYXNrKQogICAgcmV0dXJucyBuZWdhdGl2ZSB2YWx1ZSBpZiBlcnJvciBvY2N1cnJlZApAQCAtMjkwLDIwICsyODMsNiBAQAogZXh0ZXJuIGludCBidHR2X3dyaXRlX2dwaW8odW5zaWduZWQgaW50IGNhcmQsCiAJCQkgICB1bnNpZ25lZCBsb25nIG1hc2ssIHVuc2lnbmVkIGxvbmcgZGF0YSk7CiAKLS8qIHJldHVybnMgcG9pbnRlciB0byB0YXNrIHF1ZXVlIHdoaWNoIGNhbiBiZSB1c2VkIGFzIHBhcmFtZXRlciB0bwotICAgaW50ZXJydXB0aWJsZV9zbGVlcF9vbgotICAgaW4gaW50ZXJydXB0IGhhbmRsZXIgaWYgQlQ4NDhfSU5UX0dQSU5UIGJpdCBpcyBzZXQgLSB0aGlzIHF1ZXVlIGlzIGFjdGl2YXRlZAotICAgKHdha2VfdXBfaW50ZXJydXB0aWJsZSkgYW5kIGZvbGxvd2luZyBjYWxsIHRvIHRoZSBmdW5jdGlvbiBidHR2X3JlYWRfZ3BpbwotICAgc2hvdWxkIHJldHVybiBuZXcgdmFsdWUgb2YgR1BEQVRBLAotICAgcmV0dXJucyBOVUxMIHZhbHVlIGlmIGVycm9yIG9jY3VycmVkIG9yIHF1ZXVlIGlzIG5vdCBhdmFpbGFibGUKLSAgIFdBUk5JTkc6IGJlY2F1c2UgdGhlcmUgaXMgbm8gYnVmZmVyIGZvciBHUElPIGRhdGEsIG9uZSBNVVNUCi0gICBwcm9jZXNzIGRhdGEgQVNBUAotKi8KLWV4dGVybiB3YWl0X3F1ZXVlX2hlYWRfdCogYnR0dl9nZXRfZ3Bpb19xdWV1ZSh1bnNpZ25lZCBpbnQgY2FyZCk7Ci0KLS8qIGNhbGwgaTJjIGNsaWVudHMKLSovCi1leHRlcm4gdm9pZCBidHR2X2kyY19jYWxsKHVuc2lnbmVkIGludCBjYXJkLCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpOwogCiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2cC5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2cC5oCmluZGV4IGFkNzliOGQuLjhmNDRmMDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvYnR0dnAuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHZwLmgKQEAgLTQzNCw2ICs0MzQsOSBAQAogCXVuc2lnbmVkIGludCB1c2VyczsKIAlzdHJ1Y3QgYnR0dl9maCBpbml0OwogCisJLyogdXNlZCB0byBtYWtlIGR2Yi1idDh4eCBhdXRvbG9hZGFibGUgKi8KKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcmVxdWVzdF9tb2R1bGVfd2s7CisKIAkvKiBEZWZhdWx0ICgwKSBhbmQgY3VycmVudCAoMSkgdmlkZW8gY2FwdHVyaW5nIGFuZCBvdmVybGF5CiAJICAgY3JvcHBpbmcgcGFyYW1ldGVycyBpbiBidHR2X3R2bm9ybS5jcm9wY2FwIHVuaXRzLiBQcm90ZWN0ZWQKIAkgICBieSBidHR2LmxvY2suICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2NhZmVfY2NpYy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jYWZlX2NjaWMuYwppbmRleCA3MTBjMTFhLi45NjI1NGRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2NhZmVfY2NpYy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY2FmZV9jY2ljLmMKQEAgLTQsNiArNCw3IEBACiAgKiBzZW5zb3IuCiAgKgogICogQ29weXJpZ2h0IDIwMDYgT25lIExhcHRvcCBQZXIgQ2hpbGQgQXNzb2NpYXRpb24sIEluYy4KKyAqIENvcHlyaWdodCAyMDA2LTcgSm9uYXRoYW4gQ29yYmV0IDxjb3JiZXRAbHduLm5ldD4KICAqCiAgKiBXcml0dGVuIGJ5IEpvbmF0aGFuIENvcmJldCwgY29yYmV0QGx3bi5uZXQuCiAgKgpAQCAtMjIsNiArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNoaXAtaWRlbnQuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgpAQCAtMzYsNyArMzgsNyBAQAogCiAjaW5jbHVkZSAiY2FmZV9jY2ljLXJlZ3MuaCIKIAotI2RlZmluZSBDQUZFX1ZFUlNJT04gMHgwMDAwMDEKKyNkZWZpbmUgQ0FGRV9WRVJTSU9OIDB4MDAwMDAyCiAKIAogLyoKQEAgLTE2NCw3ICsxNjYsNyBAQAogCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCBzX3Rhc2tsZXQ7CiAKIAkvKiBDdXJyZW50IG9wZXJhdGluZyBwYXJhbWV0ZXJzICovCi0JZW51bSB2NGwyX2NoaXBfaWRlbnQgc2Vuc29yX3R5cGU7CQkvKiBDdXJyZW50bHkgb3Y3NjcwIG9ubHkgKi8KKwl1MzIgc2Vuc29yX3R5cGU7CQkvKiBDdXJyZW50bHkgb3Y3NjcwIG9ubHkgKi8KIAlzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0IHBpeF9mb3JtYXQ7CiAKIAkvKiBMb2NrcyAqLwpAQCAtNzA0LDcgKzcwNiwxMyBAQAogCWNhZmVfcmVnX3dyaXRlKGNhbSwgUkVHX0dMX0NTUiwgR0NTUl9TUlN8R0NTUl9NUlMpOyAvKiBOZWVkZWQ/ICovCiAJY2FmZV9yZWdfd3JpdGUoY2FtLCBSRUdfR0xfQ1NSLCBHQ1NSX1NSQ3xHQ1NSX01SQyk7CiAJY2FmZV9yZWdfd3JpdGUoY2FtLCBSRUdfR0xfQ1NSLCBHQ1NSX1NSQ3xHQ1NSX01SUyk7CisJLyoKKwkgKiBIZXJlIHdlIG11c3Qgd2FpdCBhIGJpdCBmb3IgdGhlIGNvbnRyb2xsZXIgdG8gY29tZSBhcm91bmQuCisJICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOwogCW1kZWxheSg1KTsJLyogRklYTUUgcmV2aXNpdCB0aGlzICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKKwogCWNhZmVfcmVnX3dyaXRlKGNhbSwgUkVHX0dMX0NTUiwgR0NTUl9DQ0lDX0VOfEdDU1JfU1JDfEdDU1JfTVJDKTsKIAljYWZlX3JlZ19zZXRfYml0KGNhbSwgUkVHX0dMX0lNQVNLLCBHSU1TS19DQ0lDX0VOKTsKIAkvKgpAQCAtNzcyLDkgKzc4MCw5IEBACiAJICogQ29udHJvbCAxIGlzIHBvd2VyIGRvd24sIHNldCB0byAwIHRvIG9wZXJhdGUuCiAJICovCiAJY2FmZV9yZWdfd3JpdGUoY2FtLCBSRUdfR1BSLCBHUFJfQzFFTnxHUFJfQzBFTik7IC8qIHB3ciB1cCwgcmVzZXQgKi8KLQltZGVsYXkoMSk7IC8qIE1hcnZlbGwgc2F5cyAxbXMgd2lsbCBkbyBpdCAqLworLy8JbWRlbGF5KDEpOyAvKiBNYXJ2ZWxsIHNheXMgMW1zIHdpbGwgZG8gaXQgKi8KIAljYWZlX3JlZ193cml0ZShjYW0sIFJFR19HUFIsIEdQUl9DMUVOfEdQUl9DMEVOfEdQUl9DMCk7Ci0JbWRlbGF5KDEpOyAvKiBFbm91Z2g/ICovCisvLwltZGVsYXkoMSk7IC8qIEVub3VnaD8gKi8KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYW0tPmRldl9sb2NrLCBmbGFncyk7CiB9CiAKQEAgLTgxOCw2ICs4MjYsNyBAQAogICovCiBzdGF0aWMgaW50IGNhZmVfY2FtX2luaXQoc3RydWN0IGNhZmVfY2FtZXJhICpjYW0pCiB7CisJc3RydWN0IHY0bDJfY2hpcF9pZGVudCBjaGlwID0geyBWNEwyX0NISVBfTUFUQ0hfSTJDX0FERFIsIDAsIDAsIDAgfTsKIAlpbnQgcmV0OwogCiAJbXV0ZXhfbG9jaygmY2FtLT5zX211dGV4KTsKQEAgLTgyNyw5ICs4MzYsMTEgQEAKIAlyZXQgPSBfX2NhZmVfY2FtX3Jlc2V0KGNhbSk7CiAJaWYgKHJldCkKIAkJZ290byBvdXQ7Ci0JcmV0ID0gX19jYWZlX2NhbV9jbWQoY2FtLCBWSURJT0NfSU5UX0dfQ0hJUF9JREVOVCwgJmNhbS0+c2Vuc29yX3R5cGUpOworCWNoaXAubWF0Y2hfY2hpcCA9IGNhbS0+c2Vuc29yLT5hZGRyOworCXJldCA9IF9fY2FmZV9jYW1fY21kKGNhbSwgVklESU9DX0dfQ0hJUF9JREVOVCwgJmNoaXApOwogCWlmIChyZXQpCiAJCWdvdG8gb3V0OworCWNhbS0+c2Vuc29yX3R5cGUgPSBjaGlwLmlkZW50OwogLy8JaWYgKGNhbS0+c2Vuc29yLT5hZGRyICE9IE9WN3h4MF9TSUQpIHsKIAlpZiAoY2FtLT5zZW5zb3JfdHlwZSAhPSBWNEwyX0lERU5UX09WNzY3MCkgewogCQljYW1fZXJyKGNhbSwgIlVuc3VwcG9ydGVkIHNlbnNvciB0eXBlICVkIiwgY2FtLT5zZW5zb3ItPmFkZHIpOwpAQCAtMTc5MiwxOCArMTgwMywxOSBAQAogCQlpZiAobGlzdF9lbXB0eSgmY2FtLT5zYl9hdmFpbCkpCiAJCQlicmVhazsgIC8qIExlYXZlIGl0IHZhbGlkLCBob3BlIGZvciBiZXR0ZXIgbGF0ZXIgKi8KIAkJY2xlYXJfYml0KGJ1Zm5vLCAmY2FtLT5mbGFncyk7Ci0JCS8qCi0JCSAqIFdlIGNvdWxkIHBlcmhhcHMgZHJvcCB0aGUgc3BpbmxvY2sgZHVyaW5nIHRoaXMKLQkJICogYmlnIGNvcHkuICBTb21ldGhpbmcgdG8gY29uc2lkZXIuCi0JCSAqLwogCQlzYnVmID0gbGlzdF9lbnRyeShjYW0tPnNiX2F2YWlsLm5leHQsCiAJCQkJc3RydWN0IGNhZmVfc2lvX2J1ZmZlciwgbGlzdCk7CisJCS8qCisJCSAqIERyb3AgdGhlIGxvY2sgZHVyaW5nIHRoZSBiaWcgY29weS4gIFRoaXMgKnNob3VsZCogYmUgc2FmZS4uLgorCQkgKi8KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOwogCQltZW1jcHkoc2J1Zi0+YnVmZmVyLCBjYW0tPmRtYV9idWZzW2J1Zm5vXSwKIAkJCQljYW0tPnBpeF9mb3JtYXQuc2l6ZWltYWdlKTsKIAkJc2J1Zi0+djRsYnVmLmJ5dGVzdXNlZCA9IGNhbS0+cGl4X2Zvcm1hdC5zaXplaW1hZ2U7CiAJCXNidWYtPnY0bGJ1Zi5zZXF1ZW5jZSA9IGNhbS0+YnVmX3NlcVtidWZub107CiAJCXNidWYtPnY0bGJ1Zi5mbGFncyAmPSB+VjRMMl9CVUZfRkxBR19RVUVVRUQ7CiAJCXNidWYtPnY0bGJ1Zi5mbGFncyB8PSBWNEwyX0JVRl9GTEFHX0RPTkU7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZjYW0tPmRldl9sb2NrLCBmbGFncyk7CiAJCWxpc3RfbW92ZV90YWlsKCZzYnVmLT5saXN0LCAmY2FtLT5zYl9mdWxsKTsKIAl9CiAJaWYgKCEgbGlzdF9lbXB0eSgmY2FtLT5zYl9mdWxsKSkKQEAgLTIxMDcsNiArMjExOSw3IEBACiAJY2FtLT52NGxkZXYgPSBjYWZlX3Y0bF90ZW1wbGF0ZTsKIAljYW0tPnY0bGRldi5kZWJ1ZyA9IDA7CiAvLwljYW0tPnY0bGRldi5kZWJ1ZyA9IFY0TDJfREVCVUdfSU9DVExfQVJHOworCWNhbS0+djRsZGV2LmRldiA9ICZwZGV2LT5kZXY7CiAJcmV0ID0gdmlkZW9fcmVnaXN0ZXJfZGV2aWNlKCZjYW0tPnY0bGRldiwgVkZMX1RZUEVfR1JBQkJFUiwgLTEpOwogCWlmIChyZXQpCiAJCWdvdG8gb3V0X3NtYnVzOwpAQCAtMjE3NiwxMCArMjE4OSw1MiBAQAogfQogCiAKKyNpZmRlZiBDT05GSUdfUE0KKy8qCisgKiBCYXNpYyBwb3dlciBtYW5hZ2VtZW50LgorICovCitzdGF0aWMgaW50IGNhZmVfcGNpX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSA9IGNhZmVfZmluZF9ieV9wZGV2KHBkZXYpOworCWludCByZXQ7CisKKwlyZXQgPSBwY2lfc2F2ZV9zdGF0ZShwZGV2KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCWNhZmVfY3Rscl9zdG9wX2RtYShjYW0pOworCWNhZmVfY3Rscl9wb3dlcl9kb3duKGNhbSk7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgY2FmZV9wY2lfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtID0gY2FmZV9maW5kX2J5X3BkZXYocGRldik7CisJaW50IHJldCA9IDA7CisKKwlyZXQgPSBwY2lfcmVzdG9yZV9zdGF0ZShwZGV2KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCXJldCA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChyZXQpIHsKKwkJY2FtX3dhcm4oY2FtLCAiVW5hYmxlIHRvIHJlLWVuYWJsZSBkZXZpY2Ugb24gcmVzdW1lIVxuIik7CisJCXJldHVybiByZXQ7CisJfQorCWNhZmVfY3Rscl9pbml0KGNhbSk7CisJY2FmZV9jdGxyX3Bvd2VyX3VwKGNhbSk7CisJc2V0X2JpdChDRl9DT05GSUdfTkVFREVELCAmY2FtLT5mbGFncyk7CisJaWYgKGNhbS0+c3RhdGUgPT0gU19TUEVDUkVBRCkKKwkJY2FtLT5zdGF0ZSA9IFNfSURMRTsgIC8qIERvbid0IGJvdGhlciByZXN0YXJ0aW5nICovCisJZWxzZSBpZiAoY2FtLT5zdGF0ZSA9PSBTX1NJTkdMRVJFQUQgfHwgY2FtLT5zdGF0ZSA9PSBTX1NUUkVBTUlORykKKwkJcmV0ID0gY2FmZV9yZWFkX3NldHVwKGNhbSwgY2FtLT5zdGF0ZSk7CisJcmV0dXJuIHJldDsKK30KKworI2VuZGlmICAvKiBDT05GSUdfUE0gKi8KIAogCiBzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgY2FmZV9pZHNbXSA9IHsKLQl7IFBDSV9ERVZJQ0UoMHgxMTQ4LCAweDQzNDApIH0sIC8qIFRlbXBvcmFyeSBJRCBvbiBkZXZlbCBib2FyZCAqLwogCXsgUENJX0RFVklDRSgweDExYWIsIDB4NDEwMCkgfSwgLyogRXZlbnR1YWwgcmVhbCBJRCAqLwogCXsgUENJX0RFVklDRSgweDExYWIsIDB4NDEwMikgfSwgLyogUmVhbGx5IGV2ZW50dWFsIHJlYWwgSUQgKi8KIAl7IDAsIH0KQEAgLTIxOTIsNiArMjI0NywxMCBAQAogCS5pZF90YWJsZSA9IGNhZmVfaWRzLAogCS5wcm9iZSA9IGNhZmVfcGNpX3Byb2JlLAogCS5yZW1vdmUgPSBjYWZlX3BjaV9yZW1vdmUsCisjaWZkZWYgQ09ORklHX1BNCisJLnN1c3BlbmQgPSBjYWZlX3BjaV9zdXNwZW5kLAorCS5yZXN1bWUgPSBjYWZlX3BjaV9yZXN1bWUsCisjZW5kaWYKIH07CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jcGlhX3BwLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2NwaWFfcHAuYwppbmRleCBiMTJjZWM5Li4xOTcxMWFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2NwaWFfcHAuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2NwaWFfcHAuYwpAQCAtNjIsNyArNjIsNiBAQAogI2RlZmluZSBQUENQSUFfUEFSUE9SVF9PRkYgLTIKICNkZWZpbmUgUFBDUElBX1BBUlBPUlRfTk9ORSAtMQogCi0jaWZkZWYgTU9EVUxFCiBzdGF0aWMgaW50IHBhcnBvcnRfbnJbUEFSUE9SVF9NQVhdID0ge1swIC4uLiBQQVJQT1JUX01BWCAtIDFdID0gUFBDUElBX1BBUlBPUlRfVU5TUEVDfTsKIHN0YXRpYyBjaGFyICpwYXJwb3J0W1BBUlBPUlRfTUFYXSA9IHtOVUxMLH07CiAKQEAgLTcyLDExICs3MSw2IEBACiAKIG1vZHVsZV9wYXJhbV9hcnJheShwYXJwb3J0LCBjaGFycCwgTlVMTCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKHBhcnBvcnQsICInYXV0bycgb3IgYSBsaXN0IG9mIHBhcmFsbGVsIHBvcnQgbnVtYmVycy4gSnVzdCBsaWtlIGxwLiIpOwotI2Vsc2UKLXN0YXRpYyBpbnQgcGFycG9ydF9ucltQQVJQT1JUX01BWF0gX19pbml0ZGF0YSA9Ci0Je1swIC4uLiBQQVJQT1JUX01BWCAtIDFdID0gUFBDUElBX1BBUlBPUlRfVU5TUEVDfTsKLXN0YXRpYyBpbnQgcGFycG9ydF9wdHIgPSAwOwotI2VuZGlmCiAKIHN0cnVjdCBwcF9jYW1fZW50cnkgewogCXN0cnVjdCBwYXJkZXZpY2UgKnBkZXY7CkBAIC0xNDEsNyArMTM1LDYgQEAKIAljYW0gPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHBwX2NhbV9lbnRyeSwgY2JfdGFzayk7CiAJY2JfZnVuYyA9IGNhbS0+Y2JfZnVuYzsKIAljYl9kYXRhID0gY2FtLT5jYl9kYXRhOwotCXdvcmtfcmVsZWFzZSh3b3JrKTsKIAogCWNiX2Z1bmMoY2JfZGF0YSk7CiB9CkBAIC02ODIsNyArNjc1LDcgQEAKIAlpZihjYW0tPnBvcnQtPmlycSAhPSBQQVJQT1JUX0lSUV9OT05FKSB7CiAJCWNhbS0+Y2JfZnVuYyA9IGNiOwogCQljYW0tPmNiX2RhdGEgPSBjYmRhdGE7Ci0JCUlOSVRfV09SS19OQVIoJmNhbS0+Y2JfdGFzaywgY3BpYV9wcF9ydW5fY2FsbGJhY2spOworCQlJTklUX1dPUksoJmNhbS0+Y2JfdGFzaywgY3BpYV9wcF9ydW5fY2FsbGJhY2spOwogCX0gZWxzZSB7CiAJCXJldHZhbCA9IC0xOwogCX0KQEAgLTgyMCw3ICs4MTMsNyBAQAogCS5kZXRhY2ggPSBjcGlhX3BwX2RldGFjaCwKIH07CiAKLXN0YXRpYyBpbnQgY3BpYV9wcF9pbml0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBjcGlhX3BwX2luaXQodm9pZCkKIHsKIAlwcmludGsoS0VSTl9JTkZPICIlcyB2JWQuJWQuJWRcbiIsQUJPVVQsCiAJICAgICAgIENQSUFfUFBfTUFKX1ZFUixDUElBX1BQX01JTl9WRVIsQ1BJQV9QUF9QQVRDSF9WRVIpOwpAQCAtODM5LDggKzgzMiw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLSNpZmRlZiBNT0RVTEUKLWludCBpbml0X21vZHVsZSh2b2lkKQorc3RhdGljIGludCBfX2luaXQgY3BpYV9pbml0KHZvaWQpCiB7CiAJaWYgKHBhcnBvcnRbMF0pIHsKIAkJLyogVGhlIHVzZXIgZ2F2ZSBzb21lIHBhcmFtZXRlcnMuICBMZXQncyBzZWUgd2hhdCB0aGV5IHdlcmUuICovCkBAIC04NjcsMzggKzg1OSwxMSBAQAogCXJldHVybiBjcGlhX3BwX2luaXQoKTsKIH0KIAotdm9pZCBjbGVhbnVwX21vZHVsZSh2b2lkKQorc3RhdGljIHZvaWQgX19leGl0IGNwaWFfY2xlYW51cCh2b2lkKQogewotCXBhcnBvcnRfdW5yZWdpc3Rlcl9kcml2ZXIgKCZjcGlhX3BwX2RyaXZlcik7CisJcGFycG9ydF91bnJlZ2lzdGVyX2RyaXZlcigmY3BpYV9wcF9kcml2ZXIpOwogCXJldHVybjsKIH0KIAotI2Vsc2UgLyogIU1PRFVMRSAqLwotCi1zdGF0aWMgaW50IF9faW5pdCBjcGlhX3BwX3NldHVwKGNoYXIgKnN0cikKLXsKLQlpbnQgZXJyOwotCi0JaWYgKCFzdHJuY21wKHN0ciwgInBhcnBvcnQiLCA3KSkgewotCQlpbnQgbiA9IHNpbXBsZV9zdHJ0b3VsKHN0ciArIDcsIE5VTEwsIDEwKTsKLQkJaWYgKHBhcnBvcnRfcHRyIDwgUEFSUE9SVF9NQVgpIHsKLQkJCXBhcnBvcnRfbnJbcGFycG9ydF9wdHIrK10gPSBuOwotCQl9IGVsc2UgewotCQkJTE9HKCJ0b28gbWFueSBwb3J0cywgJXMgaWdub3JlZC5cbiIsIHN0cik7Ci0JCX0KLQl9IGVsc2UgaWYgKCFzdHJjbXAoc3RyLCAiYXV0byIpKSB7Ci0JCXBhcnBvcnRfbnJbMF0gPSBQUENQSUFfUEFSUE9SVF9BVVRPOwotCX0gZWxzZSBpZiAoIXN0cmNtcChzdHIsICJub25lIikpIHsKLQkJcGFycG9ydF9ucltwYXJwb3J0X3B0cisrXSA9IFBQQ1BJQV9QQVJQT1JUX05PTkU7Ci0JfQotCi0JZXJyPWNwaWFfcHBfaW5pdCgpOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0KLQlyZXR1cm4gMTsKLX0KLQotX19zZXR1cCgiY3BpYV9wcD0iLCBjcGlhX3BwX3NldHVwKTsKLQotI2VuZGlmIC8qICFNT0RVTEUgKi8KK21vZHVsZV9pbml0KGNwaWFfaW5pdCk7Cittb2R1bGVfZXhpdChjcGlhX2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jczUzbDMyYS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jczUzbDMyYS5jCmluZGV4IGRlODcyNDcuLmE3M2UyODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3M1M2wzMmEuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2NzNTNsMzJhLmMKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pMmMtaWQuaD4KICNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jaGlwLWlkZW50Lmg+CiAKIE1PRFVMRV9ERVNDUklQVElPTigiaTJjIGRldmljZSBkcml2ZXIgZm9yIGNzNTNsMzJhIEF1ZGlvIEFEQyIpOwogTU9EVUxFX0FVVEhPUigiTWFydGluIFZhdWdoYW4iKTsKQEAgLTEwMyw2ICsxMDQsOSBAQAogCQljczUzbDMyYV93cml0ZShjbGllbnQsIDB4MDUsICh1OCkgY3RybC0+dmFsdWUpOwogCQlicmVhazsKIAorCWNhc2UgVklESU9DX0dfQ0hJUF9JREVOVDoKKwkJcmV0dXJuIHY0bDJfY2hpcF9pZGVudF9pMmNfY2xpZW50KGNsaWVudCwgYXJnLCBWNEwyX0lERU5UX0NTNTNsMzJBLCAwKTsKKwogCWNhc2UgVklESU9DX0xPR19TVEFUVVM6CiAJCXsKIAkJCXU4IHYgPSBjczUzbDMyYV9yZWFkKGNsaWVudCwgMHgwMSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM0MXguYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzQxeC5jCmluZGV4IGQ2MGNkNWUuLjg4ZGJkZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzQxeC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzQxeC5jCkBAIC01MSw2ICs1MSw3IEBACiAJVjRMMl9DSURfTVBFR19BVURJT19NT0RFX0VYVEVOU0lPTiwKIAlWNEwyX0NJRF9NUEVHX0FVRElPX0VNUEhBU0lTLAogCVY0TDJfQ0lEX01QRUdfQVVESU9fQ1JDLAorCVY0TDJfQ0lEX01QRUdfQVVESU9fTVVURSwKIAlWNEwyX0NJRF9NUEVHX1ZJREVPX0VOQ09ESU5HLAogCVY0TDJfQ0lEX01QRUdfVklERU9fQVNQRUNULAogCVY0TDJfQ0lEX01QRUdfVklERU9fQl9GUkFNRVMsCkBAIC02MCw2ICs2MSw4IEBACiAJVjRMMl9DSURfTVBFR19WSURFT19CSVRSQVRFLAogCVY0TDJfQ0lEX01QRUdfVklERU9fQklUUkFURV9QRUFLLAogCVY0TDJfQ0lEX01QRUdfVklERU9fVEVNUE9SQUxfREVDSU1BVElPTiwKKwlWNEwyX0NJRF9NUEVHX1ZJREVPX01VVEUsCisJVjRMMl9DSURfTVBFR19WSURFT19NVVRFX1lVViwKIAlWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fU1BBVElBTF9GSUxURVJfTU9ERSwKIAlWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fU1BBVElBTF9GSUxURVIsCiAJVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX0xVTUFfU1BBVElBTF9GSUxURVJfVFlQRSwKQEAgLTcxLDYgKzc0LDcgQEAKIAlWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fTFVNQV9NRURJQU5fRklMVEVSX1RPUCwKIAlWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fQ0hST01BX01FRElBTl9GSUxURVJfQk9UVE9NLAogCVY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19DSFJPTUFfTUVESUFOX0ZJTFRFUl9UT1AsCisJVjRMMl9DSURfTVBFR19DWDIzNDFYX1NUUkVBTV9JTlNFUlRfTkFWX1BBQ0tFVFMsCiAJMAogfTsKIApAQCAtMTAyLDYgKzEwNiw5IEBACiAJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0NSQzoKIAkJY3RybC0+dmFsdWUgPSBwYXJhbXMtPmF1ZGlvX2NyYzsKIAkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX01VVEU6CisJCWN0cmwtPnZhbHVlID0gcGFyYW1zLT5hdWRpb19tdXRlOworCQlicmVhazsKIAljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fRU5DT0RJTkc6CiAJCWN0cmwtPnZhbHVlID0gcGFyYW1zLT52aWRlb19lbmNvZGluZzsKIAkJYnJlYWs7CkBAIC0xMjksNiArMTM2LDEyIEBACiAJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX1RFTVBPUkFMX0RFQ0lNQVRJT046CiAJCWN0cmwtPnZhbHVlID0gcGFyYW1zLT52aWRlb190ZW1wb3JhbF9kZWNpbWF0aW9uOwogCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fTVVURToKKwkJY3RybC0+dmFsdWUgPSBwYXJhbXMtPnZpZGVvX211dGU7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19NVVRFX1lVVjoKKwkJY3RybC0+dmFsdWUgPSBwYXJhbXMtPnZpZGVvX211dGVfeXV2OworCQlicmVhazsKIAljYXNlIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1RZUEU6CiAJCWN0cmwtPnZhbHVlID0gcGFyYW1zLT5zdHJlYW1fdHlwZTsKIAkJYnJlYWs7CkBAIC0xNjgsNiArMTgxLDkgQEAKIAljYXNlIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19DSFJPTUFfTUVESUFOX0ZJTFRFUl9CT1RUT006CiAJCWN0cmwtPnZhbHVlID0gcGFyYW1zLT52aWRlb19jaHJvbWFfbWVkaWFuX2ZpbHRlcl9ib3R0b207CiAJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19DWDIzNDFYX1NUUkVBTV9JTlNFUlRfTkFWX1BBQ0tFVFM6CisJCWN0cmwtPnZhbHVlID0gcGFyYW1zLT5zdHJlYW1faW5zZXJ0X25hdl9wYWNrZXRzOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC0yMDEsNiArMjE3LDkgQEAKIAljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fQ1JDOgogCQlwYXJhbXMtPmF1ZGlvX2NyYyA9IGN0cmwtPnZhbHVlOwogCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fTVVURToKKwkJcGFyYW1zLT5hdWRpb19tdXRlID0gY3RybC0+dmFsdWU7CisJCWJyZWFrOwogCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19BU1BFQ1Q6CiAJCXBhcmFtcy0+dmlkZW9fYXNwZWN0ID0gY3RybC0+dmFsdWU7CiAJCWJyZWFrOwpAQCAtMjQzLDYgKzI2MiwxMiBAQAogCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19URU1QT1JBTF9ERUNJTUFUSU9OOgogCQlwYXJhbXMtPnZpZGVvX3RlbXBvcmFsX2RlY2ltYXRpb24gPSBjdHJsLT52YWx1ZTsKIAkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX01VVEU6CisJCXBhcmFtcy0+dmlkZW9fbXV0ZSA9IChjdHJsLT52YWx1ZSAhPSAwKTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX01VVEVfWVVWOgorCQlwYXJhbXMtPnZpZGVvX211dGVfeXV2ID0gY3RybC0+dmFsdWU7CisJCWJyZWFrOwogCWNhc2UgVjRMMl9DSURfTVBFR19TVFJFQU1fVFlQRToKIAkJcGFyYW1zLT5zdHJlYW1fdHlwZSA9IGN0cmwtPnZhbHVlOwogCQlwYXJhbXMtPnZpZGVvX2VuY29kaW5nID0KQEAgLTI5MCw2ICszMTUsOSBAQAogCWNhc2UgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX0NIUk9NQV9NRURJQU5fRklMVEVSX0JPVFRPTToKIAkJcGFyYW1zLT52aWRlb19jaHJvbWFfbWVkaWFuX2ZpbHRlcl9ib3R0b20gPSBjdHJsLT52YWx1ZTsKIAkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfU1RSRUFNX0lOU0VSVF9OQVZfUEFDS0VUUzoKKwkJcGFyYW1zLT5zdHJlYW1faW5zZXJ0X25hdl9wYWNrZXRzID0gY3RybC0+dmFsdWU7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTMzNiw2ICszNjQsOSBAQAogCWNhc2UgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX0NIUk9NQV9NRURJQU5fRklMVEVSX0JPVFRPTToKIAkJbmFtZSA9ICJNZWRpYW4gQ2hyb21hIEZpbHRlciBNaW5pbXVtIjsKIAkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfU1RSRUFNX0lOU0VSVF9OQVZfUEFDS0VUUzoKKwkJbmFtZSA9ICJJbnNlcnQgTmF2aWdhdGlvbiBQYWNrZXRzIjsKKwkJYnJlYWs7CiAKIAlkZWZhdWx0OgogCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsIG1pbiwgbWF4LCBzdGVwLCBkZWYpOwpAQCAtMzUwLDYgKzM4MSwxMiBAQAogCQltaW4gPSAwOwogCQlzdGVwID0gMTsKIAkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfU1RSRUFNX0lOU0VSVF9OQVZfUEFDS0VUUzoKKwkJcWN0cmwtPnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOOworCQltaW4gPSAwOworCQltYXggPSAxOworCQlzdGVwID0gMTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcWN0cmwtPnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSOwogCQlicmVhazsKQEAgLTUwNSw2ICs1NDIsOSBAQAogCQkgICAgICAgcWN0cmwtPmZsYWdzIHw9IFY0TDJfQ1RSTF9GTEFHX0lOQUNUSVZFOwogCQlyZXR1cm4gMDsKIAorCWNhc2UgVjRMMl9DSURfTVBFR19DWDIzNDFYX1NUUkVBTV9JTlNFUlRfTkFWX1BBQ0tFVFM6CisJCXJldHVybiBjeDIzNDF4X2N0cmxfcXVlcnlfZmlsbChxY3RybCwgMCwgMSwgMSwgMCk7CisKIAlkZWZhdWx0OgogCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGxfc3RkKHFjdHJsKTsKIApAQCAtNjU2LDYgKzY5Niw3IEBACiAJLyogc3RyZWFtICovCiAJLnN0cmVhbV90eXBlID0gVjRMMl9NUEVHX1NUUkVBTV9UWVBFX01QRUcyX1BTLAogCS5zdHJlYW1fdmJpX2ZtdCA9IFY0TDJfTVBFR19TVFJFQU1fVkJJX0ZNVF9OT05FLAorCS5zdHJlYW1faW5zZXJ0X25hdl9wYWNrZXRzID0gMCwKIAogCS8qIGF1ZGlvICovCiAJLmF1ZGlvX3NhbXBsaW5nX2ZyZXEgPSBWNEwyX01QRUdfQVVESU9fU0FNUExJTkdfRlJFUV80ODAwMCwKQEAgLTY2NSw2ICs3MDYsNyBAQAogCS5hdWRpb19tb2RlX2V4dGVuc2lvbiA9IFY0TDJfTVBFR19BVURJT19NT0RFX0VYVEVOU0lPTl9CT1VORF80LAogCS5hdWRpb19lbXBoYXNpcyA9IFY0TDJfTVBFR19BVURJT19FTVBIQVNJU19OT05FLAogCS5hdWRpb19jcmMgPSBWNEwyX01QRUdfQVVESU9fQ1JDX05PTkUsCisJLmF1ZGlvX211dGUgPSAwLAogCiAJLyogdmlkZW8gKi8KIAkudmlkZW9fZW5jb2RpbmcgPSBWNEwyX01QRUdfVklERU9fRU5DT0RJTkdfTVBFR18yLApAQCAtNjc2LDYgKzcxOCw4IEBACiAJLnZpZGVvX2JpdHJhdGUgPSA2MDAwMDAwLAogCS52aWRlb19iaXRyYXRlX3BlYWsgPSA4MDAwMDAwLAogCS52aWRlb190ZW1wb3JhbF9kZWNpbWF0aW9uID0gMCwKKwkudmlkZW9fbXV0ZSA9IDAsCisJLnZpZGVvX211dGVfeXV2ID0gMHgwMDgwODAsICAvKiBZQ2JDciB2YWx1ZSBmb3IgYmxhY2sgKi8KIAogCS8qIGVuY29kaW5nIGZpbHRlcnMgKi8KIAkudmlkZW9fc3BhdGlhbF9maWx0ZXJfbW9kZSA9IFY0TDJfTVBFR19DWDIzNDFYX1ZJREVPX1NQQVRJQUxfRklMVEVSX01PREVfTUFOVUFMLApAQCAtNzc5LDYgKzgyMywxMCBAQAogCQllcnIgPSBjeDIzNDF4X2FwaShwcml2LCBmdW5jLCBDWDIzNDFYX0VOQ19TRVRfQVVESU9fUFJPUEVSVElFUywgMSwgbmV3LT5hdWRpb19wcm9wZXJ0aWVzKTsKIAkJaWYgKGVycikgcmV0dXJuIGVycjsKIAl9CisJaWYgKG9sZCA9PSBOVUxMIHx8IG9sZC0+YXVkaW9fbXV0ZSAhPSBuZXctPmF1ZGlvX211dGUpIHsKKwkJZXJyID0gY3gyMzQxeF9hcGkocHJpdiwgZnVuYywgQ1gyMzQxWF9FTkNfTVVURV9BVURJTywgMSwgbmV3LT5hdWRpb19tdXRlKTsKKwkJaWYgKGVycikgcmV0dXJuIGVycjsKKwl9CiAJaWYgKG9sZCA9PSBOVUxMIHx8IG9sZC0+dmlkZW9fYml0cmF0ZV9tb2RlICE9IG5ldy0+dmlkZW9fYml0cmF0ZV9tb2RlIHx8CiAJCW9sZC0+dmlkZW9fYml0cmF0ZSAhPSBuZXctPnZpZGVvX2JpdHJhdGUgfHwKIAkJb2xkLT52aWRlb19iaXRyYXRlX3BlYWsgIT0gbmV3LT52aWRlb19iaXRyYXRlX3BlYWspIHsKQEAgLTgyNiw2ICs4NzQsMTUgQEAKIAkJCW5ldy0+dmlkZW9fdGVtcG9yYWxfZGVjaW1hdGlvbik7CiAJCWlmIChlcnIpIHJldHVybiBlcnI7CiAJfQorCWlmIChvbGQgPT0gTlVMTCB8fCBvbGQtPnZpZGVvX211dGUgIT0gbmV3LT52aWRlb19tdXRlIHx8CisJCQkobmV3LT52aWRlb19tdXRlICYmIG9sZC0+dmlkZW9fbXV0ZV95dXYgIT0gbmV3LT52aWRlb19tdXRlX3l1dikpIHsKKwkJZXJyID0gY3gyMzQxeF9hcGkocHJpdiwgZnVuYywgQ1gyMzQxWF9FTkNfTVVURV9WSURFTywgMSwgbmV3LT52aWRlb19tdXRlIHwgKG5ldy0+dmlkZW9fbXV0ZV95dXYgPDwgOCkpOworCQlpZiAoZXJyKSByZXR1cm4gZXJyOworCX0KKwlpZiAob2xkID09IE5VTEwgfHwgb2xkLT5zdHJlYW1faW5zZXJ0X25hdl9wYWNrZXRzICE9IG5ldy0+c3RyZWFtX2luc2VydF9uYXZfcGFja2V0cykgeworCQllcnIgPSBjeDIzNDF4X2FwaShwcml2LCBmdW5jLCBDWDIzNDFYX0VOQ19NSVNDLCAyLCA3LCBuZXctPnN0cmVhbV9pbnNlcnRfbmF2X3BhY2tldHMpOworCQlpZiAoZXJyKSByZXR1cm4gZXJyOworCX0KIAlyZXR1cm4gMDsKIH0KIApAQCAtODU0LDE4ICs5MTEsMjIgQEAKIAlpbnQgdGVtcG9yYWwgPSBwLT52aWRlb190ZW1wb3JhbF9maWx0ZXI7CiAKIAkvKiBTdHJlYW0gKi8KLQlwcmludGsoS0VSTl9JTkZPICIlczogU3RyZWFtOiAlc1xuIiwKKwlwcmludGsoS0VSTl9JTkZPICIlczogU3RyZWFtOiAlcyIsCiAJCXByZWZpeCwKIAkJY3gyMzQxeF9tZW51X2l0ZW0ocCwgVjRMMl9DSURfTVBFR19TVFJFQU1fVFlQRSkpOworCWlmIChwLT5zdHJlYW1faW5zZXJ0X25hdl9wYWNrZXRzKQorCQlwcmludGsoIiAod2l0aCBuYXZpZ2F0aW9uIHBhY2tldHMpIik7CisJcHJpbnRrKCJcbiIpOwogCXByaW50ayhLRVJOX0lORk8gIiVzOiBWQkkgRm9ybWF0OiAlc1xuIiwKIAkJcHJlZml4LAogCQljeDIzNDF4X21lbnVfaXRlbShwLCBWNEwyX0NJRF9NUEVHX1NUUkVBTV9WQklfRk1UKSk7CiAKIAkvKiBWaWRlbyAqLwotCXByaW50ayhLRVJOX0lORk8gIiVzOiBWaWRlbzogICVkeCVkLCAlZCBmcHNcbiIsCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFZpZGVvOiAgJWR4JWQsICVkIGZwcyVzXG4iLAogCQlwcmVmaXgsCiAJCXAtPndpZHRoIC8gKGlzX21wZWcxID8gMiA6IDEpLCBwLT5oZWlnaHQgLyAoaXNfbXBlZzEgPyAyIDogMSksCi0JCXAtPmlzXzUwaHogPyAyNSA6IDMwKTsKKwkJcC0+aXNfNTBoeiA/IDI1IDogMzAsCisJCShwLT52aWRlb19tdXRlKSA/ICIgKG11dGVkKSIgOiAiIik7CiAJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFZpZGVvOiAgJXMsICVzLCAlcywgJWQiLAogCQlwcmVmaXgsCiAJCWN4MjM0MXhfbWVudV9pdGVtKHAsIFY0TDJfQ0lEX01QRUdfVklERU9fRU5DT0RJTkcpLApAQCAtODg2LDEyICs5NDcsMTMgQEAKIAl9CiAKIAkvKiBBdWRpbyAqLwotCXByaW50ayhLRVJOX0lORk8gIiVzOiBBdWRpbzogICVzLCAlcywgJXMsICVzIiwKKwlwcmludGsoS0VSTl9JTkZPICIlczogQXVkaW86ICAlcywgJXMsICVzLCAlcyVzIiwKIAkJcHJlZml4LAogCQljeDIzNDF4X21lbnVfaXRlbShwLCBWNEwyX0NJRF9NUEVHX0FVRElPX1NBTVBMSU5HX0ZSRVEpLAogCQljeDIzNDF4X21lbnVfaXRlbShwLCBWNEwyX0NJRF9NUEVHX0FVRElPX0VOQ09ESU5HKSwKIAkJY3gyMzQxeF9tZW51X2l0ZW0ocCwgVjRMMl9DSURfTVBFR19BVURJT19MMl9CSVRSQVRFKSwKLQkJY3gyMzQxeF9tZW51X2l0ZW0ocCwgVjRMMl9DSURfTVBFR19BVURJT19NT0RFKSk7CisJCWN4MjM0MXhfbWVudV9pdGVtKHAsIFY0TDJfQ0lEX01QRUdfQVVESU9fTU9ERSksCisJCXAtPmF1ZGlvX211dGUgPyAiIChtdXRlZCkiIDogIiIpOwogCWlmIChwLT5hdWRpb19tb2RlID09IFY0TDJfTVBFR19BVURJT19NT0RFX0pPSU5UX1NURVJFTykgewogCQlwcmludGsoIiwgJXMiLAogCQkJY3gyMzQxeF9tZW51X2l0ZW0ocCwgVjRMMl9DSURfTVBFR19BVURJT19NT0RFX0VYVEVOU0lPTikpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODQwL2N4MjU4NDAtY29yZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODQwL2N4MjU4NDAtY29yZS5jCmluZGV4IDc3NGQyNTMuLjE3NTdhNTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyNTg0MC9jeDI1ODQwLWNvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4NDAvY3gyNTg0MC1jb3JlLmMKQEAgLTM1LDYgKzM1LDcgQEAKICNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY2hpcC1pZGVudC5oPgogI2luY2x1ZGUgPG1lZGlhL2N4MjU4NDAuaD4KIAogI2luY2x1ZGUgImN4MjU4NDAtY29yZS5oIgpAQCAtODI3LDkgKzgyOCw4IEBACiAJCQljeDI1ODQwX2luaXRpYWxpemUoY2xpZW50LCAwKTsKIAkJYnJlYWs7CiAKLQljYXNlIFZJRElPQ19JTlRfR19DSElQX0lERU5UOgotCQkqKGVudW0gdjRsMl9jaGlwX2lkZW50ICopYXJnID0gc3RhdGUtPmlkOwotCQlicmVhazsKKwljYXNlIFZJRElPQ19HX0NISVBfSURFTlQ6CisJCXJldHVybiB2NGwyX2NoaXBfaWRlbnRfaTJjX2NsaWVudChjbGllbnQsIGFyZywgc3RhdGUtPmlkLCBzdGF0ZS0+cmV2KTsKIAogCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtODQ3LDcgKzg0Nyw3IEBACiB7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKIAlzdHJ1Y3QgY3gyNTg0MF9zdGF0ZSAqc3RhdGU7Ci0JZW51bSB2NGwyX2NoaXBfaWRlbnQgaWQ7CisJdTMyIGlkOwogCXUxNiBkZXZpY2VfaWQ7CiAKIAkvKiBDaGVjayBpZiB0aGUgYWRhcHRlciBzdXBwb3J0cyB0aGUgbmVlZGVkIGZlYXR1cmVzCkBAIC05MDIsNiArOTAyLDcgQEAKIAlzdGF0ZS0+YXVkbW9kZSA9IFY0TDJfVFVORVJfTU9ERV9MQU5HMTsKIAlzdGF0ZS0+dmJpX2xpbmVfb2Zmc2V0ID0gODsKIAlzdGF0ZS0+aWQgPSBpZDsKKwlzdGF0ZS0+cmV2ID0gZGV2aWNlX2lkOwogCiAJaTJjX2F0dGFjaF9jbGllbnQoY2xpZW50KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODQwL2N4MjU4NDAtY29yZS5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODQwL2N4MjU4NDAtY29yZS5oCmluZGV4IDI4MDQ5MDYuLmY0YjU2ZDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyNTg0MC9jeDI1ODQwLWNvcmUuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4NDAvY3gyNTg0MC1jb3JlLmgKQEAgLTQzLDcgKzQzLDggQEAKIAl1MzIgYXVkY2xrX2ZyZXE7CiAJaW50IGF1ZG1vZGU7CiAJaW50IHZiaV9saW5lX29mZnNldDsKLQllbnVtIHY0bDJfY2hpcF9pZGVudCBpZDsKKwl1MzIgaWQ7CisJdTMyIHJldjsKIAlpbnQgaXNfY3gyNTgzNjsKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyNTg0MC9jeDI1ODQwLWZpcm13YXJlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4NDAvY3gyNTg0MC1maXJtd2FyZS5jCmluZGV4IDBlODZiOWQuLmU4NTIwMjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyNTg0MC9jeDI1ODQwLWZpcm13YXJlLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODQwL2N4MjU4NDAtZmlybXdhcmUuYwpAQCAtMTcsNyArMTcsNiBAQAogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjLWFsZ28tYml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgogI2luY2x1ZGUgPG1lZGlhL2N4MjU4NDAuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L0tjb25maWcKaW5kZXggYjJhNjZiYS4uMGY5ZDk2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L0tjb25maWcKQEAgLTUzLDcgKzUzLDYgQEAKIAlzZWxlY3QgRFZCX09SNTExMzIgaWYgIURWQl9GRV9DVVNUT01JU0UKIAlzZWxlY3QgRFZCX0NYMjI3MDIgaWYgIURWQl9GRV9DVVNUT01JU0UKIAlzZWxlY3QgRFZCX0xHRFQzMzBYIGlmICFEVkJfRkVfQ1VTVE9NSVNFCi0Jc2VsZWN0IERWQl9UVU5FUl9MR0gwNlhGIGlmICFEVkJfRkVfQ1VTVE9NSVNFCiAJc2VsZWN0IERWQl9OWFQyMDBYIGlmICFEVkJfRkVfQ1VTVE9NSVNFCiAJc2VsZWN0IERWQl9DWDI0MTIzIGlmICFEVkJfRkVfQ1VTVE9NSVNFCiAJc2VsZWN0IERWQl9JU0w2NDIxIGlmICFEVkJfRkVfQ1VTVE9NSVNFCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1hbHNhLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1hbHNhLmMKaW5kZXggZTQzNTVmZC4uMzk1NmMyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtYWxzYS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWFsc2EuYwpAQCAtMjMyLDcgKzIzMiw4IEBACiAJY3hfd3JpdGUoTU9fQVVEX0lOVFNUQVQsIHN0YXR1cyk7CiAJaWYgKGRlYnVnID4gMSAgfHwgIChzdGF0dXMgJiBtYXNrICYgfjB4ZmYpKQogCQljeDg4X3ByaW50X2lycWJpdHMoY29yZS0+bmFtZSwgImlycSBhdWQiLAotCQkJCSAgIGN4ODhfYXVkX2lycXMsIHN0YXR1cywgbWFzayk7CisJCQkJICAgY3g4OF9hdWRfaXJxcywgQVJSQVlfU0laRShjeDg4X2F1ZF9pcnFzKSwKKwkJCQkgICBzdGF0dXMsIG1hc2spOwogCS8qIHJpc2Mgb3AgY29kZSBlcnJvciAqLwogCWlmIChzdGF0dXMgJiAoMSA8PCAxNikpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXMvMDogYXVkaW8gcmlzYyBvcCBjb2RlIGVycm9yXG4iLGNvcmUtPm5hbWUpOwpAQCAtNDEzLDExICs0MTQsOSBAQAogCiAJZHByaW50aygxLCJTZXR0aW5nIGJ1ZmZlclxuIik7CiAKLQlidWYgPSBrbWFsbG9jKHNpemVvZigqYnVmKSxHRlBfS0VSTkVMKTsKKwlidWYgPSBremFsbG9jKHNpemVvZigqYnVmKSxHRlBfS0VSTkVMKTsKIAlpZiAoTlVMTCA9PSBidWYpCiAJCXJldHVybiAtRU5PTUVNOwotCW1lbXNldChidWYsMCxzaXplb2YoKmJ1ZikpOwotCiAKIAlidWYtPnZiLm1lbW9yeSA9IFY0TDJfTUVNT1JZX01NQVA7CiAJYnVmLT52Yi53aWR0aCAgPSBjaGlwLT5wZXJpb2Rfc2l6ZTsKQEAgLTY4Miw3ICs2ODEsNyBAQAogCQlyZXR1cm4gZXJyOwogCX0KIAotCWlmICghcGNpX2RtYV9zdXBwb3J0ZWQocGNpLDB4ZmZmZmZmZmYpKSB7CisJaWYgKCFwY2lfZG1hX3N1cHBvcnRlZChwY2ksRE1BXzMyQklUX01BU0spKSB7CiAJCWRwcmludGsoMCwgIiVzLzE6IE9vcHM6IG5vIDMyYml0IFBDSSBETUEgPz8/XG4iLGNvcmUtPm5hbWUpOwogCQllcnIgPSAtRUlPOwogCQljeDg4X2NvcmVfcHV0KGNvcmUscGNpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWNhcmRzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1jYXJkcy5jCmluZGV4IDY1ZTlkODA5Li5lNjExMDJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1jYXJkcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWNhcmRzLmMKQEAgLTg4NSw2ICs4ODUsMTIgQEAKIAkJLmlucHV0ICAgICAgICAgID0ge3sKIAkJCS50eXBlICAgPSBDWDg4X1ZNVVhfRFZCLAogCQkJLnZtdXggICA9IDAsCisJCX0seworCQkJLnR5cGUgICA9IENYODhfVk1VWF9DT01QT1NJVEUxLAorCQkJLnZtdXggICA9IDEsCisJCX0seworCQkJLnR5cGUgICA9IENYODhfVk1VWF9TVklERU8sCisJCQkudm11eCAgID0gMiwKIAkJfX0sCiAJCS5tcGVnICAgICAgICAgICA9IENYODhfTVBFR19EVkIsCiAJfSwKQEAgLTE1MzcsMTAgKzE1NDMsMTAgQEAKIAl9LHsKIAkJLnN1YnZlbmRvciA9IDB4MTdkZSwKIAkJLnN1YmRldmljZSA9IDB4MDg0MCwKLQkgICAgICAgLmNhcmQgICAgICA9IENYODhfQk9BUkRfS1dPUkxEX0hBUkRXQVJFX01QRUdfVFZfWFBFUlQsCi0gICAgICAgfSx7Ci0JICAgICAgIC5zdWJ2ZW5kb3IgPSAweDE0MjEsCi0JICAgICAgIC5zdWJkZXZpY2UgPSAweDAzMDUsCisJCS5jYXJkICAgICAgPSBDWDg4X0JPQVJEX0tXT1JMRF9IQVJEV0FSRV9NUEVHX1RWX1hQRVJULAorCX0seworCQkuc3VidmVuZG9yID0gMHgxNDIxLAorCQkuc3ViZGV2aWNlID0gMHgwMzA1LAogCQkuY2FyZCAgICAgID0gQ1g4OF9CT0FSRF9LV09STERfSEFSRFdBUkVfTVBFR19UVl9YUEVSVCwKIAl9LHsKIAkJLnN1YnZlbmRvciA9IDB4MThhYywKQEAgLTE2MzEsNiArMTYzNywxMCBAQAogCQkuc3VidmVuZG9yID0gMHgwMDcwLAogCQkuc3ViZGV2aWNlID0gMHgxNDAyLAogCQkuY2FyZCAgICAgID0gQ1g4OF9CT0FSRF9IQVVQUEFVR0VfSFZSMzAwMCwKKwl9LHsKKwkJLnN1YnZlbmRvciA9IDB4MTQyMSwKKwkJLnN1YmRldmljZSA9IDB4MDM0MSwgLyogQURTIFRlY2ggSW5zdGFudFRWIERWQi1TICovCisJCS5jYXJkICAgICAgPSBDWDg4X0JPQVJEX0tXT1JMRF9EVkJTXzEwMCwKIAl9LAogfTsKIGNvbnN0IHVuc2lnbmVkIGludCBjeDg4X2lkY291bnQgPSBBUlJBWV9TSVpFKGN4ODhfc3ViaWRzKTsKQEAgLTE3ODYsNyArMTc5Niw3IEBACiAJCXsgMHgwMywgMHgwQyB9LAogCX07CiAKLQlmb3IgKGkgPSAwOyBpIDwgMTM7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGluaXRfYnVmcyk7IGkrKykgewogCQltc2cuYnVmID0gaW5pdF9idWZzW2ldOwogCQltc2cubGVuID0gKGkgIT0gMTIgPyA1IDogMik7CiAJCWVyciA9IGkyY190cmFuc2ZlcigmY29yZS0+aTJjX2FkYXAsICZtc2csIDEpOwpAQCAtMTkxMywxMiArMTkyMywyMSBAQAogCQlpZiAoMCA9PSBjb3JlLT5pMmNfcmMpIHsKIAkJCS8qIGVuYWJsZSB0dW5lciAqLwogCQkJaW50IGk7Ci0JCQlzdGF0aWMgY29uc3QgdTggYnVmZmVyIFtdID0geyAweDEwLDB4MTIsMHgxMywweDA0LDB4MTYsMHgwMCwweDE0LDB4MDQsMHgwMTcsMHgwMCB9OworCQkJc3RhdGljIGNvbnN0IHU4IGJ1ZmZlciBbXVsyXSA9IHsKKwkJCQl7MHgxMCwweDEyfSwKKwkJCQl7MHgxMywweDA0fSwKKwkJCQl7MHgxNiwweDAwfSwKKwkJCQl7MHgxNCwweDA0fSwKKwkJCQl7MHgxNywweDAwfQorCQkJfTsKIAkJCWNvcmUtPmkyY19jbGllbnQuYWRkciA9IDB4MGE7CiAKLQkJCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspCi0JCQkJaWYgKDIgIT0gaTJjX21hc3Rlcl9zZW5kKCZjb3JlLT5pMmNfY2xpZW50LCZidWZmZXJbaSoyXSwyKSkKLQkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFVuYWJsZSB0byBlbmFibGUgdHVuZXIoJWkpLlxuIiwKKwkJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGJ1ZmZlcik7IGkrKykKKwkJCQlpZiAoMiAhPSBpMmNfbWFzdGVyX3NlbmQoJmNvcmUtPmkyY19jbGllbnQsCisJCQkJCQkJYnVmZmVyW2ldLDIpKQorCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJCQkiJXM6IFVuYWJsZSB0byBlbmFibGUgIgorCQkJCQkJInR1bmVyKCVpKS5cbiIsCiAJCQkJCQljb3JlLT5uYW1lLCBpKTsKIAkJfQogCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWNvcmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWNvcmUuYwppbmRleCBkODY4MTNiLi5mMzFlYzk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1jb3JlLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtY29yZS5jCkBAIC00ODksMTIgKzQ4OSwxMiBAQAogfTsKIAogdm9pZCBjeDg4X3ByaW50X2lycWJpdHMoY2hhciAqbmFtZSwgY2hhciAqdGFnLCBjaGFyICoqc3RyaW5ncywKLQkJCXUzMiBiaXRzLCB1MzIgbWFzaykKKwkJCWludCBsZW4sIHUzMiBiaXRzLCB1MzIgbWFzaykKIHsKIAl1bnNpZ25lZCBpbnQgaTsKIAogCXByaW50ayhLRVJOX0RFQlVHICIlczogJXMgWzB4JXhdIiwgbmFtZSwgdGFnLCBiaXRzKTsKLQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewogCQlpZiAoIShiaXRzICYgKDEgPDwgaSkpKQogCQkJY29udGludWU7CiAJCWlmIChzdHJpbmdzW2ldKQpAQCAtNTIwLDggKzUyMCw4IEBACiAJfQogCWlmICghaGFuZGxlZCkKIAkJY3g4OF9wcmludF9pcnFiaXRzKGNvcmUtPm5hbWUsICJpcnEgcGNpIiwKLQkJCQkgICBjeDg4X3BjaV9pcnFzLCBzdGF0dXMsCi0JCQkJICAgY29yZS0+cGNpX2lycW1hc2spOworCQkJCSAgIGN4ODhfcGNpX2lycXMsIEFSUkFZX1NJWkUoY3g4OF9wY2lfaXJxcyksCisJCQkJICAgc3RhdHVzLCBjb3JlLT5wY2lfaXJxbWFzayk7CiAJcmV0dXJuIGhhbmRsZWQ7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWR2Yi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtZHZiLmMKaW5kZXggNGY1NTYwMi4uZGJmZTRkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtZHZiLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtZHZiLmMKQEAgLTQyLDcgKzQyLDYgQEAKICNpbmNsdWRlICJjeDIyNzAyLmgiCiAjaW5jbHVkZSAib3I1MTEzMi5oIgogI2luY2x1ZGUgImxnZHQzMzB4LmgiCi0jaW5jbHVkZSAibGdoMDZ4Zi5oIgogI2luY2x1ZGUgIm54dDIwMHguaCIKICNpbmNsdWRlICJjeDI0MTIzLmgiCiAjaW5jbHVkZSAiaXNsNjQyMS5oIgpAQCAtNDc2LDYgKzQ3NSw4IEBACiAJY2FzZSBDWDg4X0JPQVJEX1dJTkZBU1RfRFRWMjAwMEg6CiAJY2FzZSBDWDg4X0JPQVJEX0hBVVBQQVVHRV9IVlIxMTAwOgogCWNhc2UgQ1g4OF9CT0FSRF9IQVVQUEFVR0VfSFZSMTEwMExQOgorCWNhc2UgQ1g4OF9CT0FSRF9IQVVQUEFVR0VfSFZSMTMwMDoKKwljYXNlIENYODhfQk9BUkRfSEFVUFBBVUdFX0hWUjMwMDA6CiAJCWRldi0+ZHZiLmZyb250ZW5kID0gZHZiX2F0dGFjaChjeDIyNzAyX2F0dGFjaCwKIAkJCQkJICAgICAgICZoYXVwcGF1Z2VfaHZyX2NvbmZpZywKIAkJCQkJICAgICAgICZkZXYtPmNvcmUtPmkyY19hZGFwKTsKQEAgLTYzMSw4ICs2MzIsOSBAQAogCQkJCQkgICAgICAgJmZ1c2lvbmhkdHZfNV9nb2xkLAogCQkJCQkgICAgICAgJmRldi0+Y29yZS0+aTJjX2FkYXApOwogCQlpZiAoZGV2LT5kdmIuZnJvbnRlbmQgIT0gTlVMTCkgewotCQkJZHZiX2F0dGFjaChsZ2gwNnhmX2F0dGFjaCwgZGV2LT5kdmIuZnJvbnRlbmQsCi0JCQkJICAgJmRldi0+Y29yZS0+aTJjX2FkYXApOworCQkJZHZiX2F0dGFjaChkdmJfcGxsX2F0dGFjaCwgZGV2LT5kdmIuZnJvbnRlbmQsIDB4NjEsCisJCQkJICAgJmRldi0+Y29yZS0+aTJjX2FkYXAsCisJCQkJICAgJmR2Yl9wbGxfbGdfdGR2c19oMDZ4Zik7CiAJCX0KIAkJfQogCQlicmVhazsKQEAgLTY1MCw4ICs2NTIsOSBAQAogCQkJCQkgICAgICAgJnBjaGR0dl9oZDU1MDAsCiAJCQkJCSAgICAgICAmZGV2LT5jb3JlLT5pMmNfYWRhcCk7CiAJCWlmIChkZXYtPmR2Yi5mcm9udGVuZCAhPSBOVUxMKSB7Ci0JCQlkdmJfYXR0YWNoKGxnaDA2eGZfYXR0YWNoLCBkZXYtPmR2Yi5mcm9udGVuZCwKLQkJCQkgICAmZGV2LT5jb3JlLT5pMmNfYWRhcCk7CisJCQlkdmJfYXR0YWNoKGR2Yl9wbGxfYXR0YWNoLCBkZXYtPmR2Yi5mcm9udGVuZCwgMHg2MSwKKwkJCQkgICAmZGV2LT5jb3JlLT5pMmNfYWRhcCwKKwkJCQkgICAmZHZiX3BsbF9sZ190ZHZzX2gwNnhmKTsKIAkJfQogCQl9CiAJCWJyZWFrOwpAQCAtNjkyLDI0ICs2OTUsNiBAQAogCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy5zZXRfdm9sdGFnZSA9IGdlbmlhdGVjaF9kdmJzX3NldF92b2x0YWdlOwogCQl9CiAJCWJyZWFrOwotCWNhc2UgQ1g4OF9CT0FSRF9IQVVQUEFVR0VfSFZSMTMwMDoKLQkJZGV2LT5kdmIuZnJvbnRlbmQgPSBkdmJfYXR0YWNoKGN4MjI3MDJfYXR0YWNoLAotCQkJCQkgICAgICAgJmhhdXBwYXVnZV9odnJfY29uZmlnLAotCQkJCQkgICAgICAgJmRldi0+Y29yZS0+aTJjX2FkYXApOwotCQlpZiAoZGV2LT5kdmIuZnJvbnRlbmQgIT0gTlVMTCkgewotCQkJZHZiX2F0dGFjaChkdmJfcGxsX2F0dGFjaCwgZGV2LT5kdmIuZnJvbnRlbmQsIDB4NjEsCi0JCQkJICAgJmRldi0+Y29yZS0+aTJjX2FkYXAsICZkdmJfcGxsX2ZtZDEyMTZtZSk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBDWDg4X0JPQVJEX0hBVVBQQVVHRV9IVlIzMDAwOgotCQlkZXYtPmR2Yi5mcm9udGVuZCA9IGR2Yl9hdHRhY2goY3gyMjcwMl9hdHRhY2gsCi0JCQkJCSAgICAgICAmaGF1cHBhdWdlX2h2cl9jb25maWcsCi0JCQkJCSAgICAgICAmZGV2LT5jb3JlLT5pMmNfYWRhcCk7Ci0JCWlmIChkZXYtPmR2Yi5mcm9udGVuZCAhPSBOVUxMKSB7Ci0JCQlkdmJfYXR0YWNoKGR2Yl9wbGxfYXR0YWNoLCBkZXYtPmR2Yi5mcm9udGVuZCwgMHg2MSwKLQkJCQkgICAmZGV2LT5jb3JlLT5pMmNfYWRhcCwgJmR2Yl9wbGxfZm1kMTIxNm1lKTsKLQkJfQotCQlicmVhazsKIAlkZWZhdWx0OgogCQlwcmludGsoIiVzOiBUaGUgZnJvbnRlbmQgb2YgeW91ciBEVkIvQVRTQyBjYXJkIGlzbid0IHN1cHBvcnRlZCB5ZXRcbiIsCiAJCSAgICAgICBkZXYtPmNvcmUtPm5hbWUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtaTJjLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1pMmMuYwppbmRleCA5ODMwZDVjLi43OTE5YTFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1pMmMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1pMmMuYwpAQCAtMSwzICsxLDQgQEAKKwogLyoKIAogICAgIGN4ODgtaTJjLmMgIC0tICBhbGwgdGhlIGkyYyBjb2RlIGlzIGhlcmUKQEAgLTE5NSw3ICsxOTYsNyBAQAogCXVuc2lnbmVkIGNoYXIgYnVmOwogCWludCBpLHJjOwogCi0JZm9yIChpID0gMDsgaSA8IDEyODsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaTJjX2RldnMpOyBpKyspIHsKIAkJYy0+YWRkciA9IGk7CiAJCXJjID0gaTJjX21hc3Rlcl9yZWN2KGMsJmJ1ZiwwKTsKIAkJaWYgKHJjIDwgMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LW1wZWcuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LW1wZWcuYwppbmRleCAxZmUxYTgzLi5iMmViMzJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1tcGVnLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtbXBlZy5jCkBAIC00OSw2ICs0OSwyNyBAQAogI2RlZmluZSBtcGVnX2RiZyhsZXZlbCxmbXQsIGFyZy4uLikJaWYgKGRlYnVnID49IGxldmVsKSBcCiAJcHJpbnRrKEtFUk5fREVCVUcgIiVzLzItbXBlZzogIiBmbXQsIGNvcmUtPm5hbWUsICMjIGFyZykKIAorI2lmIGRlZmluZWQoQ09ORklHX01PRFVMRVMpICYmIGRlZmluZWQoTU9EVUxFKQorc3RhdGljIHZvaWQgcmVxdWVzdF9tb2R1bGVfYXN5bmMoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBjeDg4MDJfZGV2ICpkZXY9Y29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBjeDg4MDJfZGV2LCByZXF1ZXN0X21vZHVsZV93ayk7CisKKwlpZiAoY3g4OF9ib2FyZHNbZGV2LT5jb3JlLT5ib2FyZF0ubXBlZyAmIENYODhfTVBFR19EVkIpCisJCXJlcXVlc3RfbW9kdWxlKCJjeDg4LWR2YiIpOworCWlmIChjeDg4X2JvYXJkc1tkZXYtPmNvcmUtPmJvYXJkXS5tcGVnICYgQ1g4OF9NUEVHX0JMQUNLQklSRCkKKwkJcmVxdWVzdF9tb2R1bGUoImN4ODgtYmxhY2tiaXJkIik7Cit9CisKK3N0YXRpYyB2b2lkIHJlcXVlc3RfbW9kdWxlcyhzdHJ1Y3QgY3g4ODAyX2RldiAqZGV2KQoreworCUlOSVRfV09SSygmZGV2LT5yZXF1ZXN0X21vZHVsZV93aywgcmVxdWVzdF9tb2R1bGVfYXN5bmMpOworCXNjaGVkdWxlX3dvcmsoJmRldi0+cmVxdWVzdF9tb2R1bGVfd2spOworfQorI2Vsc2UKKyNkZWZpbmUgcmVxdWVzdF9tb2R1bGVzKGRldikKKyNlbmRpZiAvKiBDT05GSUdfTU9EVUxFUyAqLworCisKIHN0YXRpYyBMSVNUX0hFQUQoY3g4ODAyX2Rldmxpc3QpOwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKQEAgLTM0NSw3ICszNjYsOCBAQAogCiAJaWYgKGRlYnVnIHx8IChzdGF0dXMgJiBtYXNrICYgfjB4ZmYpKQogCQljeDg4X3ByaW50X2lycWJpdHMoY29yZS0+bmFtZSwgImlycSBtcGVnICIsCi0JCQkJICAgY3g4OF9tcGVnX2lycXMsIHN0YXR1cywgbWFzayk7CisJCQkJICAgY3g4OF9tcGVnX2lycXMsIEFSUkFZX1NJWkUoY3g4OF9tcGVnX2lycXMpLAorCQkJCSAgIHN0YXR1cywgbWFzayk7CiAKIAkvKiByaXNjIG9wIGNvZGUgZXJyb3IgKi8KIAlpZiAoc3RhdHVzICYgKDEgPDwgMTYpKSB7CkBAIC00MjcsNyArNDQ5LDcgQEAKIAlpZiAocGNpX2VuYWJsZV9kZXZpY2UoZGV2LT5wY2kpKQogCQlyZXR1cm4gLUVJTzsKIAlwY2lfc2V0X21hc3RlcihkZXYtPnBjaSk7Ci0JaWYgKCFwY2lfZG1hX3N1cHBvcnRlZChkZXYtPnBjaSwweGZmZmZmZmZmKSkgeworCWlmICghcGNpX2RtYV9zdXBwb3J0ZWQoZGV2LT5wY2ksRE1BXzMyQklUX01BU0spKSB7CiAJCXByaW50aygiJXMvMjogT29wczogbm8gMzJiaXQgUENJIERNQSA/Pz9cbiIsZGV2LT5jb3JlLT5uYW1lKTsKIAkJcmV0dXJuIC1FSU87CiAJfQpAQCAtNzc4LDYgKzgwMCw5IEBACiAKIAkvKiBNYWludGFpbiBhIHJlZmVyZW5jZSBzbyBjeDg4LXZpZGVvIGNhbiBxdWVyeSB0aGUgODgwMiBkZXZpY2UuICovCiAJY29yZS0+ZHZiZGV2ID0gZGV2OworCisJLyogbm93IGF1dG9sb2FkIGN4ODgtZHZiIG9yIGN4ODgtYmxhY2tiaXJkICovCisJcmVxdWVzdF9tb2R1bGVzKGRldik7CiAJcmV0dXJuIDA7CiAKICBmYWlsX2ZyZWU6CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC12aWRlby5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtdmlkZW8uYwppbmRleCBiZGZlMmFmLi5mYmNlMWQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC12aWRlby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LXZpZGVvLmMKQEAgLTE1NTUsNyArMTU1NSw4IEBACiAJY3hfd3JpdGUoTU9fVklEX0lOVFNUQVQsIHN0YXR1cyk7CiAJaWYgKGlycV9kZWJ1ZyAgfHwgIChzdGF0dXMgJiBtYXNrICYgfjB4ZmYpKQogCQljeDg4X3ByaW50X2lycWJpdHMoY29yZS0+bmFtZSwgImlycSB2aWQiLAotCQkJCSAgIGN4ODhfdmlkX2lycXMsIHN0YXR1cywgbWFzayk7CisJCQkJICAgY3g4OF92aWRfaXJxcywgQVJSQVlfU0laRShjeDg4X3ZpZF9pcnFzKSwKKwkJCQkgICBzdGF0dXMsIG1hc2spOwogCiAJLyogcmlzYyBvcCBjb2RlIGVycm9yICovCiAJaWYgKHN0YXR1cyAmICgxIDw8IDE2KSkgewpAQCAtMTc3OCw3ICsxNzc5LDcgQEAKIAkgICAgICAgZGV2LT5wY2lfbGF0LCh1bnNpZ25lZCBsb25nIGxvbmcpcGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXYsMCkpOwogCiAJcGNpX3NldF9tYXN0ZXIocGNpX2Rldik7Ci0JaWYgKCFwY2lfZG1hX3N1cHBvcnRlZChwY2lfZGV2LDB4ZmZmZmZmZmYpKSB7CisJaWYgKCFwY2lfZG1hX3N1cHBvcnRlZChwY2lfZGV2LERNQV8zMkJJVF9NQVNLKSkgewogCQlwcmludGsoIiVzLzA6IE9vcHM6IG5vIDMyYml0IFBDSSBETUEgPz8/XG4iLGNvcmUtPm5hbWUpOwogCQllcnIgPSAtRUlPOwogCQlnb3RvIGZhaWxfY29yZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC5oCmluZGV4IGE0ZjdiZWYuLjczOGQ0ZjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODguaApAQCAtNDgxLDYgKzQ4MSw4IEBACiAKIAkvKiBMaXN0IG9mIGF0dGFjaGVkIGRyaXZlcnMgKi8KIAlzdHJ1Y3QgY3g4ODAyX2RyaXZlciAgICAgICBkcnZsaXN0OworCXN0cnVjdCB3b3JrX3N0cnVjdCByZXF1ZXN0X21vZHVsZV93azsKKwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTUxMCw3ICs1MTIsNyBAQAogLyogY3g4OC1jb3JlLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIAogZXh0ZXJuIHZvaWQgY3g4OF9wcmludF9pcnFiaXRzKGNoYXIgKm5hbWUsIGNoYXIgKnRhZywgY2hhciAqKnN0cmluZ3MsCi0JCQkgICAgICAgdTMyIGJpdHMsIHUzMiBtYXNrKTsKKwkJCSAgICAgICBpbnQgbGVuLCB1MzIgYml0cywgdTMyIG1hc2spOwogCiBleHRlcm4gaW50IGN4ODhfY29yZV9pcnEoc3RydWN0IGN4ODhfY29yZSAqY29yZSwgdTMyIHN0YXR1cyk7CiBleHRlcm4gdm9pZCBjeDg4X3dha2V1cChzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LWkyYy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LWkyYy5jCmluZGV4IGQ4MjlkOGYuLjU2M2E4MzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1pMmMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtaTJjLmMKQEAgLTUyMyw3ICs1MjMsNyBAQAogCXVuc2lnbmVkIGNoYXIgYnVmOwogCWludCBpLCByYzsKIAotCWZvciAoaSA9IDA7IGkgPCAxMjg7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGkyY19kZXZzKTsgaSsrKSB7CiAJCWMtPmFkZHIgPSBpOwogCQlyYyA9IGkyY19tYXN0ZXJfcmVjdihjLCAmYnVmLCAwKTsKIAkJaWYgKHJjIDwgMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXIta2JkLWkyYy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9pci1rYmQtaTJjLmMKaW5kZXggMjEwNTgyZC4uZWQ5MmI2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9pci1rYmQtaTJjLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9pci1rYmQtaTJjLmMKQEAgLTE3Myw3ICsxNzMsNyBAQAogCQlyZXR1cm4gLUVJTzsKIAl9CiAKLQlmb3IgKHN0YXJ0ID0gMDsgc3RhcnQ8NDsgc3RhcnQrKykgeworCWZvciAoc3RhcnQgPSAwOyBzdGFydCA8IEFSUkFZX1NJWkUoYik7IHN0YXJ0KyspIHsKIAkJaWYgKGJbc3RhcnRdID09IG1hcmtlcikgewogCQkJY29kZT1iWyhzdGFydCtwYXJpdHlfb2Zmc2V0KzEpJTRdOwogCQkJcGFyaXR5PWJbKHN0YXJ0K3Bhcml0eV9vZmZzZXQpJTRdOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L0tjb25maWcgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODU0ZjNmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L0tjb25maWcKQEAgLTAsMCArMSwyNiBAQAorY29uZmlnIFZJREVPX0lWVFYKKwl0cmlzdGF0ZSAiQ29uZXhhbnQgY3gyMzQxNi9jeDIzNDE1IE1QRUcgZW5jb2Rlci9kZWNvZGVyIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBWSURFT19WNEwxICYmIFZJREVPX1Y0TDIgJiYgVVNCICYmIEkyQyAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgRldfTE9BREVSCisJc2VsZWN0IFZJREVPX1RVTkVSCisJc2VsZWN0IFZJREVPX1RWRUVQUk9NCisJc2VsZWN0IFZJREVPX0NYMjM0MVgKKwlzZWxlY3QgVklERU9fQ1gyNTg0MAorCXNlbGVjdCBWSURFT19NU1AzNDAwCisJc2VsZWN0IFZJREVPX1NBQTcxMVgKKwlzZWxlY3QgVklERU9fU0FBNzEyNworCXNlbGVjdCBWSURFT19UVkFVRElPCisJc2VsZWN0IFZJREVPX0NTNTNMMzJBCisJc2VsZWN0IFZJREVPX1dNODc3NQorCXNlbGVjdCBWSURFT19XTTg3MzkKKwlzZWxlY3QgVklERU9fVVBENjQwMzFBCisJc2VsZWN0IFZJREVPX1VQRDY0MDgzCisJLS0taGVscC0tLQorCSAgVGhpcyBpcyBhIHZpZGVvNGxpbnV4IGRyaXZlciBmb3IgQ29uZXhhbnQgY3gyMzQxNiBvciBjeDIzNDE2IGJhc2VkCisJICBQQ0kgcGVyc29uYWwgdmlkZW8gcmVjb3JkZXIgZGV2aWNlcy4KKworCSAgVGhpcyBpcyB1c2VkIGluIGRldmljZXMgc3VjaCBhcyB0aGUgSGF1cHBhdWdlIFBWUi0xNTAvMjUwLzM1MC81MDAKKwkgIGNhcmRzLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBpdnR2LgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlOTUxNDgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvTWFrZWZpbGUKQEAgLTAsMCArMSw3IEBACitpdnR2LW9ianMJOj0gaXZ0di1hdWRpby5vIGl2dHYtY2FyZHMubyBpdnR2LWNvbnRyb2xzLm8gXAorCQkgICBpdnR2LWRyaXZlci5vIGl2dHYtZmlsZW9wcy5vIGl2dHYtZmlybXdhcmUubyBcCisJCSAgIGl2dHYtZ3Bpby5vIGl2dHYtaTJjLm8gaXZ0di1pb2N0bC5vIGl2dHYtaXJxLm8gXAorCQkgICBpdnR2LW1haWxib3gubyBpdnR2LXF1ZXVlLm8gaXZ0di1zdHJlYW1zLm8gaXZ0di11ZG1hLm8gXAorCQkgICBpdnR2LXZiaS5vIGl2dHYtdmlkZW8ubyBpdnR2LXl1di5vCisKK29iai0kKENPTkZJR19WSURFT19JVlRWKSArPSBpdnR2Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWF1ZGlvLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1hdWRpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3MDJiOGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1hdWRpby5jCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgICAgQXVkaW8tcmVsYXRlZCBpdnR2IGZ1bmN0aW9ucy4KKyAgICBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNCAgS2V2aW4gVGhheWVyIDxudWZhbl93ZmsgYXQgeWFob28uY29tPgorICAgIENvcHlyaWdodCAoQykgMjAwNS0yMDA3ICBIYW5zIFZlcmt1aWwgPGh2ZXJrdWlsQHhzNGFsbC5ubD4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSAiaXZ0di1kcml2ZXIuaCIKKyNpbmNsdWRlICJpdnR2LW1haWxib3guaCIKKyNpbmNsdWRlICJpdnR2LWkyYy5oIgorI2luY2x1ZGUgIml2dHYtZ3Bpby5oIgorI2luY2x1ZGUgIml2dHYtY2FyZHMuaCIKKyNpbmNsdWRlICJpdnR2LWF1ZGlvLmgiCisjaW5jbHVkZSA8bWVkaWEvbXNwMzQwMC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CisKKy8qIFNlbGVjdHMgdGhlIGF1ZGlvIGlucHV0IGFuZCBvdXRwdXQgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50CisgICBzZXR0aW5ncy4gKi8KK2ludCBpdnR2X2F1ZGlvX3NldF9pbyhzdHJ1Y3QgaXZ0diAqaXR2KQoreworCXN0cnVjdCB2NGwyX3JvdXRpbmcgcm91dGU7CisJdTMyIGF1ZGlvX2lucHV0OworCWludCBtdXhfaW5wdXQ7CisKKwkvKiBEZXRlcm1pbmUgd2hpY2ggaW5wdXQgdG8gdXNlICovCisJaWYgKHRlc3RfYml0KElWVFZfRl9JX1JBRElPX1VTRVIsICZpdHYtPmlfZmxhZ3MpKSB7CisJCWF1ZGlvX2lucHV0ID0gaXR2LT5jYXJkLT5yYWRpb19pbnB1dC5hdWRpb19pbnB1dDsKKwkJbXV4X2lucHV0ID0gaXR2LT5jYXJkLT5yYWRpb19pbnB1dC5tdXhlcl9pbnB1dDsKKwl9IGVsc2UgeworCQlhdWRpb19pbnB1dCA9IGl0di0+Y2FyZC0+YXVkaW9faW5wdXRzW2l0di0+YXVkaW9faW5wdXRdLmF1ZGlvX2lucHV0OworCQltdXhfaW5wdXQgPSBpdHYtPmNhcmQtPmF1ZGlvX2lucHV0c1tpdHYtPmF1ZGlvX2lucHV0XS5tdXhlcl9pbnB1dDsKKwl9CisKKwkvKiBoYW5kbGUgbXV4ZXIgY2hpcHMgKi8KKwlyb3V0ZS5pbnB1dCA9IG11eF9pbnB1dDsKKwlyb3V0ZS5vdXRwdXQgPSAwOworCWl2dHZfaTJjX2h3KGl0diwgaXR2LT5jYXJkLT5od19tdXhlciwgVklESU9DX0lOVF9TX0FVRElPX1JPVVRJTkcsICZyb3V0ZSk7CisKKwlyb3V0ZS5pbnB1dCA9IGF1ZGlvX2lucHV0OworCWlmIChpdHYtPmNhcmQtPmh3X2F1ZGlvICYgSVZUVl9IV19NU1AzNFhYKSB7CisJCXJvdXRlLm91dHB1dCA9IE1TUF9PVVRQVVQoTVNQX1NDX0lOX0RTUF9TQ0FSVDEpOworCX0KKwlyZXR1cm4gaXZ0dl9pMmNfaHcoaXR2LCBpdHYtPmNhcmQtPmh3X2F1ZGlvLCBWSURJT0NfSU5UX1NfQVVESU9fUk9VVElORywgJnJvdXRlKTsKK30KKwordm9pZCBpdnR2X2F1ZGlvX3NldF9yb3V0ZShzdHJ1Y3QgaXZ0diAqaXR2LCBzdHJ1Y3QgdjRsMl9yb3V0aW5nICpyb3V0ZSkKK3sKKwlpdnR2X2kyY19odyhpdHYsIGl0di0+Y2FyZC0+aHdfYXVkaW8sIFZJRElPQ19JTlRfU19BVURJT19ST1VUSU5HLCByb3V0ZSk7Cit9CisKK3ZvaWQgaXZ0dl9hdWRpb19zZXRfYXVkaW9fY2xvY2tfZnJlcShzdHJ1Y3QgaXZ0diAqaXR2LCB1OCBmcmVxKQoreworCXN0YXRpYyB1MzIgZnJlcXNbM10gPSB7IDQ0MTAwLCA0ODAwMCwgMzIwMDAgfTsKKworCS8qIFRoZSBhdWRpbyBjbG9jayBvZiB0aGUgZGlnaXRpemVyIG11c3QgbWF0Y2ggdGhlIGNvZGVjIHNhbXBsZQorCSAgIHJhdGUgb3RoZXJ3aXNlIHlvdSBnZXQgc29tZSB2ZXJ5IHN0cmFuZ2UgZWZmZWN0cy4gKi8KKwlpZiAoZnJlcSA+IDIpCisJCXJldHVybjsKKwlpdnR2X2NhbGxfaTJjX2NsaWVudHMoaXR2LCBWSURJT0NfSU5UX0FVRElPX0NMT0NLX0ZSRVEsICZmcmVxc1tmcmVxXSk7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWF1ZGlvLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1hdWRpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljNDI4NDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1hdWRpby5oCkBAIC0wLDAgKzEsMjMgQEAKKy8qCisgICAgQXVkaW8tcmVsYXRlZCBpdnR2IGZ1bmN0aW9ucy4KKyAgICBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNCAgS2V2aW4gVGhheWVyIDxudWZhbl93ZmsgYXQgeWFob28uY29tPgorICAgIENvcHlyaWdodCAoQykgMjAwNS0yMDA3ICBIYW5zIFZlcmt1aWwgPGh2ZXJrdWlsQHhzNGFsbC5ubD4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCitpbnQgaXZ0dl9hdWRpb19zZXRfaW8oc3RydWN0IGl2dHYgKml0dik7Cit2b2lkIGl2dHZfYXVkaW9fc2V0X3JvdXRlKHN0cnVjdCBpdnR2ICppdHYsIHN0cnVjdCB2NGwyX3JvdXRpbmcgKnJvdXRlKTsKK3ZvaWQgaXZ0dl9hdWRpb19zZXRfYXVkaW9fY2xvY2tfZnJlcShzdHJ1Y3QgaXZ0diAqaXR2LCB1OCBmcmVxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWNhcmRzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1jYXJkcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlYWIwMjA4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtY2FyZHMuYwpAQCAtMCwwICsxLDk2NCBAQAorLyoKKyAgICBGdW5jdGlvbnMgdG8gcXVlcnkgY2FyZCBoYXJkd2FyZQorICAgIENvcHlyaWdodCAoQykgMjAwMy0yMDA0ICBLZXZpbiBUaGF5ZXIgPG51ZmFuX3dmayBhdCB5YWhvby5jb20+CisgICAgQ29weXJpZ2h0IChDKSAyMDA1LTIwMDcgIEhhbnMgVmVya3VpbCA8aHZlcmt1aWxAeHM0YWxsLm5sPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpbmNsdWRlICJpdnR2LWRyaXZlci5oIgorI2luY2x1ZGUgIml2dHYtY2FyZHMuaCIKKyNpbmNsdWRlICJpdnR2LWkyYy5oIgorCisjaW5jbHVkZSA8bWVkaWEvbXNwMzQwMC5oPgorI2luY2x1ZGUgPG1lZGlhL3dtODc3NS5oPgorI2luY2x1ZGUgPG1lZGlhL2NzNTNsMzJhLmg+CisjaW5jbHVkZSA8bWVkaWEvY3gyNTg0MC5oPgorI2luY2x1ZGUgPG1lZGlhL3VwZDY0MDMxYS5oPgorCisjZGVmaW5lIE1TUF9UVU5FUiAgTVNQX0lOUFVUKE1TUF9JTl9TQ0FSVDEsIE1TUF9JTl9UVU5FUjEsIFwKKwkJCQlNU1BfRFNQX0lOX1RVTkVSLCBNU1BfRFNQX0lOX1RVTkVSKQorI2RlZmluZSBNU1BfU0NBUlQxIE1TUF9JTlBVVChNU1BfSU5fU0NBUlQxLCBNU1BfSU5fVFVORVIxLCBcCisJCQkJTVNQX0RTUF9JTl9TQ0FSVCwgTVNQX0RTUF9JTl9TQ0FSVCkKKyNkZWZpbmUgTVNQX1NDQVJUMiBNU1BfSU5QVVQoTVNQX0lOX1NDQVJUMiwgTVNQX0lOX1RVTkVSMSwgXAorCQkJCU1TUF9EU1BfSU5fU0NBUlQsIE1TUF9EU1BfSU5fU0NBUlQpCisjZGVmaW5lIE1TUF9TQ0FSVDMgTVNQX0lOUFVUKE1TUF9JTl9TQ0FSVDMsIE1TUF9JTl9UVU5FUjEsIFwKKwkJCQlNU1BfRFNQX0lOX1NDQVJULCBNU1BfRFNQX0lOX1NDQVJUKQorI2RlZmluZSBNU1BfTU9OTyAgIE1TUF9JTlBVVChNU1BfSU5fTU9OTywgTVNQX0lOX1RVTkVSMSwgXAorCQkJCU1TUF9EU1BfSU5fU0NBUlQsIE1TUF9EU1BfSU5fU0NBUlQpCisKKy8qKioqKioqKioqKioqKioqKioqKioqIGNhcmQgY29uZmlndXJhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBQbGVhc2UgYWRkIG5ldyBQQ0kgSURzIHRvOiBodHRwOi8vcGNpLWlkcy51Y3cuY3ovaWlpCisgICBUaGlzIGtlZXBzIHRoZSBQQ0kgSUQgZGF0YWJhc2UgdXAgdG8gZGF0ZS4gTm90ZSB0aGF0IHRoZSBlbnRyaWVzCisgICBtdXN0IGJlIGFkZGVkIHVuZGVyIHZlbmRvciAweDQ0NDQgKENvbmV4YW50KSBhcyBzdWJzeXN0ZW0gSURzLgorICAgTmV3IHZlbmRvciBJRHMgc2hvdWxkIHN0aWxsIGJlIGFkZGVkIHRvIHRoZSB2ZW5kb3IgSUQgbGlzdC4gKi8KKworLyogSGF1cHBhdWdlIFBWUi0yNTAgY2FyZHMgKi8KKworLyogTm90ZTogZm9yIEhhdXBwYXVnZSBjYXJkcyB0aGUgdHZlZXByb20gaW5mb3JtYXRpb24gaXMgdXNlZCBpbnN0ZWFkIG9mIFBDSSBJRHMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaXZ0dl9jYXJkIGl2dHZfY2FyZF9wdnIyNTAgPSB7CisJLnR5cGUgPSBJVlRWX0NBUkRfUFZSXzI1MCwKKwkubmFtZSA9ICJIYXVwcGF1Z2UgV2luVFYgUFZSLTI1MCIsCisJLnY0bDJfY2FwYWJpbGl0aWVzID0gSVZUVl9DQVBfRU5DT0RFUiwKKwkuaHdfdmlkZW8gPSBJVlRWX0hXX1NBQTcxMTUsCisJLmh3X2F1ZGlvID0gSVZUVl9IV19NU1AzNFhYLAorCS5od19hdWRpb19jdHJsID0gSVZUVl9IV19NU1AzNFhYLAorCS5od19hbGwgPSBJVlRWX0hXX01TUDM0WFggfCBJVlRWX0hXX1NBQTcxMTUgfAorCQkgIElWVFZfSFdfVFZFRVBST00gfCBJVlRWX0hXX1RVTkVSLAorCS52aWRlb19pbnB1dHMgPSB7CisJCXsgSVZUVl9DQVJEX0lOUFVUX1ZJRF9UVU5FUiwgIDAsIElWVFZfU0FBNzFYWF9DT01QT1NJVEU0IH0sCisJCXsgSVZUVl9DQVJEX0lOUFVUX1NWSURFTzEsICAgIDEsIElWVFZfU0FBNzFYWF9TVklERU8wICAgIH0sCisJCXsgSVZUVl9DQVJEX0lOUFVUX0NPTVBPU0lURTEsIDEsIElWVFZfU0FBNzFYWF9DT01QT1NJVEUwIH0sCisJCXsgSVZUVl9DQVJEX0lOUFVUX1NWSURFTzIsICAgIDIsIElWVFZfU0FBNzFYWF9TVklERU8xICAgIH0sCisJCXsgSVZUVl9DQVJEX0lOUFVUX0NPTVBPU0lURTIsIDIsIElWVFZfU0FBNzFYWF9DT01QT1NJVEUxIH0sCisJCXsgSVZUVl9DQVJEX0lOUFVUX0NPTVBPU0lURTMsIDEsIElWVFZfU0FBNzFYWF9DT01QT1NJVEU1IH0sCisJfSwKKwkuYXVkaW9faW5wdXRzID0geworCQl7IElWVFZfQ0FSRF9JTlBVVF9BVURfVFVORVIsICBNU1BfVFVORVIgIH0sCisJCXsgSVZUVl9DQVJEX0lOUFVUX0xJTkVfSU4xLCAgIE1TUF9TQ0FSVDEgfSwKKwkJeyBJVlRWX0NBUkRfSU5QVVRfTElORV9JTjIsICAgTVNQX1NDQVJUMyB9LAorCX0sCisJLnJhZGlvX2lucHV0ID0geyBJVlRWX0NBUkRfSU5QVVRfQVVEX1RVTkVSLCBNU1BfU0NBUlQyIH0sCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIEhhdXBwYXVnZSBQVlItMzUwIGNhcmRzICovCisKKy8qIE91dHB1dHMgZm9yIEhhdXBwYXVnZSBQVlIzNTAgY2FyZHMgKi8KK3N0YXRpYyBzdHJ1Y3QgaXZ0dl9jYXJkX291dHB1dCBpdnR2X3B2cjM1MF9vdXRwdXRzW10gPSB7CisJeworCQkubmFtZSA9ICJTLVZpZGVvICsgQ29tcG9zaXRlIiwKKwkJLnZpZGVvX291dHB1dCA9IDAsCisJfSwgeworCQkubmFtZSA9ICJDb21wb3NpdGUiLAorCQkudmlkZW9fb3V0cHV0ID0gMSwKKwl9LCB7CisJCS5uYW1lID0gIlMtVmlkZW8iLAorCQkudmlkZW9fb3V0cHV0ID0gMiwKKwl9LCB7CisJCS5uYW1lID0gIlJHQiIsCisJCS52aWRlb19vdXRwdXQgPSAzLAorCX0sIHsKKwkJLm5hbWUgPSAiWVVWIEMiLAorCQkudmlkZW9fb3V0cHV0ID0gNCwKKwl9LCB7CisJCS5uYW1lID0gIllVViBWIiwKKwkJLnZpZGVvX291dHB1dCA9IDUsCisJfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpdnR2X2NhcmQgaXZ0dl9jYXJkX3B2cjM1MCA9IHsKKwkudHlwZSA9IElWVFZfQ0FSRF9QVlJfMzUwLAorCS5uYW1lID0gIkhhdXBwYXVnZSBXaW5UViBQVlItMzUwIiwKKwkudjRsMl9jYXBhYmlsaXRpZXMgPSBJVlRWX0NBUF9FTkNPREVSIHwgSVZUVl9DQVBfREVDT0RFUiwKKwkudmlkZW9fb3V0cHV0cyA9IGl2dHZfcHZyMzUwX291dHB1dHMsCisJLm5vZl9vdXRwdXRzID0gQVJSQVlfU0laRShpdnR2X3B2cjM1MF9vdXRwdXRzKSwKKwkuaHdfdmlkZW8gPSBJVlRWX0hXX1NBQTcxMTUsCisJLmh3X2F1ZGlvID0gSVZUVl9IV19NU1AzNFhYLAorCS5od19hdWRpb19jdHJsID0gSVZUVl9IV19NU1AzNFhYLAorCS5od19hbGwgPSBJVlRWX0hXX01TUDM0WFggfCBJVlRWX0hXX1NBQTcxMTUgfAorCQkgIElWVFZfSFdfU0FBNzEyNyB8IElWVFZfSFdfVFZFRVBST00gfCBJVlRWX0hXX1RVTkVSLAorCS52aWRlb19pbnB1dHMgPSB7CisJCXsgSVZUVl9DQVJEX0lOUFVUX1ZJRF9UVU5FUiwgIDAsIElWVFZfU0FBNzFYWF9DT01QT1NJVEU0IH0sCisJCXsgSVZUVl9DQVJEX0lOUFVUX1NWSURFTzEsICAgIDEsIElWVFZfU0FBNzFYWF9TVklERU8wICAgIH0sCisJCXsgSVZUVl9DQVJEX0lOUFVUX0NPTVBPU0lURTEsIDEsIElWVFZfU0FBNzFYWF9DT01QT1NJVEUwIH0sCisJCXsgSVZUVl9DQVJEX0lOUFVUX1NWSURFTzIsICAgIDIsIElWVFZfU0FBNzFYWF9TVklERU8xICAgIH0sCisJCXsgSVZUVl9DQVJEX0lOUFVUX0NPTVBPU0lURTIsIDIsIElWVFZfU0FBNzFYWF9DT01QT1NJVEUxIH0sCisJCXsgSVZUVl9DQVJEX0lOUFVUX0NPTVBPU0lURTMsIDEsIElWVFZfU0FBNzFYWF9DT01QT1NJVEU1IH0sCisJfSwKKwkuYXVkaW9faW5wdXRzID0geworCQl7IElWVFZfQ0FSRF9JTlBVVF9BVURfVFVORVIsICBNU1BfVFVORVIgIH0sCisJCXsgSVZUVl9DQVJEX0lOUFVUX0xJTkVfSU4xLCAgIE1TUF9TQ0FSVDEgfSwKKwkJeyBJVlRWX0NBUkRfSU5QVVRfTElORV9JTjIsICAgTVNQX1NDQVJUMyB9LAorCX0sCisJLnJhZGlvX2lucHV0ID0geyBJVlRWX0NBUkRfSU5QVVRfQVVEX1RVTkVSLCBNU1BfU0NBUlQyIH0sCit9OworCisvKiBQVlItMzUwIFYxIGJvYXJkcyBoYXZlIGEgZGlmZmVyZW50IGF1ZGlvIHR1bmVyIGlucHV0IGFuZCB1c2UgYQorICAgc2FhNzExNCBpbnN0ZWFkIG9mIGEgc2FhNzExNS4KKyAgIE5vdGUgdGhhdCB0aGUgaW5mbyBiZWxvdyBjb21lcyBmcm9tIGEgcHJlLXByb2R1Y3Rpb24gbW9kZWwgc28gaXQgbWF5CisgICBub3QgYmUgY29ycmVjdC4gRXNwZWNpYWxseSB0aGUgYXVkaW8gYmVoYXZlcyBzdHJhbmdlbHkgKG1vbm8gb25seSBpdCBzZWVtcykgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaXZ0dl9jYXJkIGl2dHZfY2FyZF9wdnIzNTBfdjEgPSB7CisJLnR5cGUgPSBJVlRWX0NBUkRfUFZSXzM1MF9WMSwKKwkubmFtZSA9ICJIYXVwcGF1Z2UgV2luVFYgUFZSLTM1MCAoVjEpIiwKKwkudjRsMl9jYXBhYmlsaXRpZXMgPSBJVlRWX0NBUF9FTkNPREVSIHwgSVZUVl9DQVBfREVDT0RFUiwKKwkudmlkZW9fb3V0cHV0cyA9IGl2dHZfcHZyMzUwX291dHB1dHMsCisJLm5vZl9vdXRwdXRzID0gQVJSQVlfU0laRShpdnR2X3B2cjM1MF9vdXRwdXRzKSwKKwkuaHdfdmlkZW8gPSBJVlRWX0hXX1NBQTcxMTQsCisJLmh3X2F1ZGlvID0gSVZUVl9IV19NU1AzNFhYLAorCS5od19hdWRpb19jdHJsID0gSVZUVl9IV19NU1AzNFhYLAorCS5od19hbGwgPSBJVlRWX0hXX01TUDM0WFggfCBJVlRWX0hXX1NBQTcxMTQgfAorCQkgIElWVFZfSFdfU0FBNzEyNyB8IElWVFZfSFdfVFZFRVBST00gfCBJVlRWX0hXX1RVTkVSLAorCS52aWRlb19pbnB1dHMgPSB7CisJCXsgSVZUVl9DQVJEX0lOUFVUX1ZJRF9UVU5FUiwgIDAsIElWVFZfU0FBNzFYWF9DT01QT1NJVEU0IH0sCisJCXsgSVZUVl9DQVJEX0lOUFVUX1NWSURFTzEsICAgIDEsIElWVFZfU0FBNzFYWF9TVklERU8wICAgIH0sCisJCXsgSVZUVl9DQVJEX0lOUFVUX0NPTVBPU0lURTEsIDEsIElWVFZfU0FBNzFYWF9DT01QT1NJVEUwIH0sCisJCXsgSVZUVl9DQVJEX0lOUFVUX1NWSURFTzIsICAgIDIsIElWVFZfU0FBNzFYWF9TVklERU8xICAgIH0sCisJCXsgSVZUVl9DQVJEX0lOUFVUX0NPTVBPU0lURTIsIDIsIElWVFZfU0FBNzFYWF9DT01QT1NJVEUxIH0sCisJCXsgSVZUVl9DQVJEX0lOUFVUX0NPTVBPU0lURTMsIDEsIElWVFZfU0FBNzFYWF9DT01QT1NJVEU1IH0sCisJfSwKKwkuYXVkaW9faW5wdXRzID0geworCQl7IElWVFZfQ0FSRF9JTlBVVF9BVURfVFVORVIsICBNU1BfTU9OTyAgIH0sCisJCXsgSVZUVl9DQVJEX0lOUFVUX0xJTkVfSU4xLCAgIE1TUF9TQ0FSVDEgfSwKKwkJeyBJVlRWX0NBUkRfSU5QVVRfTElORV9JTjIsICAgTVNQX1NDQVJUMyB9LAorCX0sCisJLnJhZGlvX2lucHV0ID0geyBJVlRWX0NBUkRfSU5QVVRfQVVEX1RVTkVSLCBNU1BfU0NBUlQyIH0sCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIEhhdXBwYXVnZSBQVlItMTUwL1BWUi01MDAgY2FyZHMgKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpdnR2X2NhcmQgaXZ0dl9jYXJkX3B2cjE1MCA9IHsKKwkudHlwZSA9IElWVFZfQ0FSRF9QVlJfMTUwLAorCS5uYW1lID0gIkhhdXBwYXVnZSBXaW5UViBQVlItMTUwIiwKKwkudjRsMl9jYXBhYmlsaXRpZXMgPSBJVlRWX0NBUF9FTkNPREVSLAorCS5od192aWRlbyA9IElWVFZfSFdfQ1gyNTg0MCwKKwkuaHdfYXVkaW8gPSBJVlRWX0hXX0NYMjU4NDAsCisJLmh3X2F1ZGlvX2N0cmwgPSBJVlRWX0hXX0NYMjU4NDAsCisJLmh3X211eGVyID0gSVZUVl9IV19XTTg3NzUsCisJLmh3X2FsbCA9IElWVFZfSFdfV004Nzc1IHwgSVZUVl9IV19DWDI1ODQwIHwKKwkJICBJVlRWX0hXX1RWRUVQUk9NIHwgSVZUVl9IV19UVU5FUiwKKwkudmlkZW9faW5wdXRzID0geworCQl7IElWVFZfQ0FSRF9JTlBVVF9WSURfVFVORVIsICAwLCBDWDI1ODQwX0NPTVBPU0lURTcgfSwKKwkJeyBJVlRWX0NBUkRfSU5QVVRfU1ZJREVPMSwgICAgMSwgQ1gyNTg0MF9TVklERU8xICAgIH0sCisJCXsgSVZUVl9DQVJEX0lOUFVUX0NPTVBPU0lURTEsIDEsIENYMjU4NDBfQ09NUE9TSVRFMyB9LAorCQl7IElWVFZfQ0FSRF9JTlBVVF9TVklERU8yLCAgICAyLCBDWDI1ODQwX1NWSURFTzIgICAgfSwKKwkJeyBJVlRWX0NBUkRfSU5QVVRfQ09NUE9TSVRFMiwgMiwgQ1gyNTg0MF9DT01QT1NJVEU0IH0sCisJfSwKKwkuYXVkaW9faW5wdXRzID0geworCQl7IElWVFZfQ0FSRF9JTlBVVF9BVURfVFVORVIsCisJCSAgQ1gyNTg0MF9BVURJTzgsIFdNODc3NV9BSU4yIH0sCisJCXsgSVZUVl9DQVJEX0lOUFVUX0xJTkVfSU4xLAorCQkgIENYMjU4NDBfQVVESU9fU0VSSUFMLCBXTTg3NzVfQUlOMiB9LAorCQl7IElWVFZfQ0FSRF9JTlBVVF9MSU5FX0lOMiwKKwkJICBDWDI1ODQwX0FVRElPX1NFUklBTCwgV004Nzc1X0FJTjMgfSwKKwl9LAorCS5yYWRpb19pbnB1dCA9IHsgSVZUVl9DQVJEX0lOUFVUX0FVRF9UVU5FUiwKKwkJCSBDWDI1ODQwX0FVRElPX1NFUklBTCwgV004Nzc1X0FJTjQgfSwKKwkvKiBhcHBhcmVudGx5IG5lZWRlZCBmb3IgdGhlIElSIGJsYXN0ZXIgKi8KKwkuZ3Bpb19pbml0ID0geyAuZGlyZWN0aW9uID0gMHgxZjAxLCAuaW5pdGlhbF92YWx1ZSA9IDB4MjZmMyB9LAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBBVmVyTWVkaWEgTTE3OSBjYXJkcyAqLworCitzdGF0aWMgY29uc3Qgc3RydWN0IGl2dHZfY2FyZF9wY2lfaW5mbyBpdnR2X3BjaV9tMTc5W10gPSB7CisJeyBQQ0lfREVWSUNFX0lEX0lWVFYxNSwgSVZUVl9QQ0lfSURfQVZFUk1FRElBLCAweGEzY2YgfSwKKwl7IFBDSV9ERVZJQ0VfSURfSVZUVjE1LCBJVlRWX1BDSV9JRF9BVkVSTUVESUEsIDB4YTNjZSB9LAorCXsgMCwgMCwgMCB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGl2dHZfY2FyZCBpdnR2X2NhcmRfbTE3OSA9IHsKKwkudHlwZSA9IElWVFZfQ0FSRF9NMTc5LAorCS5uYW1lID0gIkFWZXJNZWRpYSBNMTc5IiwKKwkudjRsMl9jYXBhYmlsaXRpZXMgPSBJVlRWX0NBUF9FTkNPREVSLAorCS5od192aWRlbyA9IElWVFZfSFdfU0FBNzExNCwKKwkuaHdfYXVkaW8gPSBJVlRWX0hXX0dQSU8sCisJLmh3X2F1ZGlvX2N0cmwgPSBJVlRWX0hXX0dQSU8sCisJLmh3X2FsbCA9IElWVFZfSFdfR1BJTyB8IElWVFZfSFdfU0FBNzExNCB8IElWVFZfSFdfVFVORVIsCisJLnZpZGVvX2lucHV0cyA9IHsKKwkJeyBJVlRWX0NBUkRfSU5QVVRfVklEX1RVTkVSLCAgMCwgSVZUVl9TQUE3MVhYX0NPTVBPU0lURTQgfSwKKwkJeyBJVlRWX0NBUkRfSU5QVVRfU1ZJREVPMSwgICAgMSwgSVZUVl9TQUE3MVhYX1NWSURFTzAgICAgfSwKKwkJeyBJVlRWX0NBUkRfSU5QVVRfQ09NUE9TSVRFMSwgMSwgSVZUVl9TQUE3MVhYX0NPTVBPU0lURTMgfSwKKwl9LAorCS5hdWRpb19pbnB1dHMgPSB7CisJCXsgSVZUVl9DQVJEX0lOUFVUX0FVRF9UVU5FUiwgIElWVFZfR1BJT19UVU5FUiAgIH0sCisJCXsgSVZUVl9DQVJEX0lOUFVUX0xJTkVfSU4xLCAgIElWVFZfR1BJT19MSU5FX0lOIH0sCisJfSwKKwkuZ3Bpb19pbml0ID0geyAuZGlyZWN0aW9uID0gMHhlMzgwLCAuaW5pdGlhbF92YWx1ZSA9IDB4ODI5MCB9LAorCS5ncGlvX2F1ZGlvX2lucHV0ICA9IHsgLm1hc2sgPSAweDgwNDAsIC50dW5lciAgPSAweDgwMDAsIC5saW5laW4gPSAweDAwMDAgfSwKKwkuZ3Bpb19hdWRpb19tdXRlICAgPSB7IC5tYXNrID0gMHgyMDAwLCAubXV0ZSAgID0gMHgyMDAwIH0sCisJLmdwaW9fYXVkaW9fbW9kZSAgID0geyAubWFzayA9IDB4NDMwMCwgLm1vbm8gICA9IDB4NDAwMCwgLnN0ZXJlbyA9IDB4MDIwMCwKKwkJCSAgICAgIC5sYW5nMSA9IDB4MDIwMCwgLmxhbmcyICA9IDB4MDEwMCwgLmJvdGggICA9IDB4MDAwMCB9LAorCS5ncGlvX2F1ZGlvX2ZyZXEgICA9IHsgLm1hc2sgPSAweDAwMTgsIC5mMzIwMDAgPSAweDAwMDAsCisJCQkgICAgIC5mNDQxMDAgPSAweDAwMDgsIC5mNDgwMDAgPSAweDAwMTAgfSwKKwkuZ3Bpb19hdWRpb19kZXRlY3QgPSB7IC5tYXNrID0gMHg0MDAwLCAuc3RlcmVvID0gMHgwMDAwIH0sCisJLnR1bmVycyA9IHsKKwkJLyogQXMgZmFyIGFzIHdlIGtub3cgYWxsIE0xNzkgY2FyZHMgdXNlIHRoaXMgdHVuZXIgKi8KKwkJeyAuc3RkID0gVjRMMl9TVERfQUxMLCAudHVuZXIgPSBUVU5FUl9QSElMSVBTX05UU0MgfSwKKwl9LAorCS5wY2lfbGlzdCA9IGl2dHZfcGNpX20xNzksCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIFl1YW4gTVBHNjAwL0t1cm91dG9zaGlrb3UgSVRWQzE2LVNUVkxQIGNhcmRzICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaXZ0dl9jYXJkX3BjaV9pbmZvIGl2dHZfcGNpX21wZzYwMFtdID0geworCXsgUENJX0RFVklDRV9JRF9JVlRWMTYsIElWVFZfUENJX0lEX1lVQU4xLCAweGZmZjMgfSwKKwl7IFBDSV9ERVZJQ0VfSURfSVZUVjE2LCBJVlRWX1BDSV9JRF9ZVUFOMSwgMHhmZmZmIH0sCisJeyAwLCAwLCAwIH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaXZ0dl9jYXJkIGl2dHZfY2FyZF9tcGc2MDAgPSB7CisJLnR5cGUgPSBJVlRWX0NBUkRfTVBHNjAwLAorCS5uYW1lID0gIll1YW4gTVBHNjAwLCBLdXJvdXRvc2hpa291IElUVkMxNi1TVFZMUCIsCisJLnY0bDJfY2FwYWJpbGl0aWVzID0gSVZUVl9DQVBfRU5DT0RFUiwKKwkuaHdfdmlkZW8gPSBJVlRWX0hXX1NBQTcxMTUsCisJLmh3X2F1ZGlvID0gSVZUVl9IV19HUElPLAorCS5od19hdWRpb19jdHJsID0gSVZUVl9IV19HUElPLAorCS5od19hbGwgPSBJVlRWX0hXX0dQSU8gfCBJVlRWX0hXX1NBQTcxMTUgfCBJVlRWX0hXX1RVTkVSLAorCS52aWRlb19pbnB1dHMgPSB7CisJCXsgSVZUVl9DQVJEX0lOUFVUX1ZJRF9UVU5FUiwgIDAsIElWVFZfU0FBNzFYWF9DT01QT1NJVEU0IH0sCisJCXsgSVZUVl9DQVJEX0lOUFVUX1NWSURFTzEsICAgIDEsIElWVFZfU0FBNzFYWF9TVklERU8wICAgIH0sCisJCXsgSVZUVl9DQVJEX0lOUFVUX0NPTVBPU0lURTEsIDEsIElWVFZfU0FBNzFYWF9DT01QT1NJVEUzIH0sCisJfSwKKwkuYXVkaW9faW5wdXRzID0geworCQl7IElWVFZfQ0FSRF9JTlBVVF9BVURfVFVORVIsICBJVlRWX0dQSU9fVFVORVIgICB9LAorCQl7IElWVFZfQ0FSRF9JTlBVVF9MSU5FX0lOMSwgICBJVlRWX0dQSU9fTElORV9JTiB9LAorCX0sCisJLmdwaW9faW5pdCA9IHsgLmRpcmVjdGlvbiA9IDB4MzA4MCwgLmluaXRpYWxfdmFsdWUgPSAweDAwMDQgfSwKKwkuZ3Bpb19hdWRpb19pbnB1dCAgPSB7IC5tYXNrID0gMHgzMDAwLCAudHVuZXIgID0gMHgwMDAwLCAubGluZWluID0gMHgyMDAwIH0sCisJLmdwaW9fYXVkaW9fbXV0ZSAgID0geyAubWFzayA9IDB4MDAwMSwgLm11dGUgICA9IDB4MDAwMSB9LAorCS5ncGlvX2F1ZGlvX21vZGUgICA9IHsgLm1hc2sgPSAweDAwMGUsIC5tb25vICAgPSAweDAwMDYsIC5zdGVyZW8gPSAweDAwMDQsCisJCQkgICAgICAubGFuZzEgPSAweDAwMDQsIC5sYW5nMiAgPSAweDAwMDAsIC5ib3RoICAgPSAweDAwMDggfSwKKwkuZ3Bpb19hdWRpb19kZXRlY3QgPSB7IC5tYXNrID0gMHgwOTAwLCAuc3RlcmVvID0gMHgwMTAwIH0sCisJLnR1bmVycyA9IHsKKwkJLyogVGhlIFBBTCB0dW5lciBpcyBjb25maXJtZWQgKi8KKwkJeyAuc3RkID0gVjRMMl9TVERfNjI1XzUwLCAudHVuZXIgPSBUVU5FUl9QSElMSVBTX0ZRMTIxNk1FIH0sCisJCXsgLnN0ZCA9IFY0TDJfU1REX0FMTCwgLnR1bmVyID0gVFVORVJfUEhJTElQU19GUTEyODYgfSwKKwl9LAorCS5wY2lfbGlzdCA9IGl2dHZfcGNpX21wZzYwMCwKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogWXVhbiBNUEcxNjAvS3Vyb3V0b3NoaWtvdSBJVFZDMTUtU1RWTFAgY2FyZHMgKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpdnR2X2NhcmRfcGNpX2luZm8gaXZ0dl9wY2lfbXBnMTYwW10gPSB7CisJeyBQQ0lfREVWSUNFX0lEX0lWVFYxNSwgSVZUVl9QQ0lfSURfWVVBTjEsIDAgfSwKKwl7IFBDSV9ERVZJQ0VfSURfSVZUVjE1LCBJVlRWX1BDSV9JRF9JT0RBVEEsIDB4NDBhMCB9LAorCXsgMCwgMCwgMCB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGl2dHZfY2FyZCBpdnR2X2NhcmRfbXBnMTYwID0geworCS50eXBlID0gSVZUVl9DQVJEX01QRzE2MCwKKwkubmFtZSA9ICJZVUFOIE1QRzE2MCwgS3Vyb3V0b3NoaWtvdSBJVFZDMTUtU1RWTFAsIEkvTyBEYXRhIEdWLU0yVFYvUENJIiwKKwkudjRsMl9jYXBhYmlsaXRpZXMgPSBJVlRWX0NBUF9FTkNPREVSLAorCS5od192aWRlbyA9IElWVFZfSFdfU0FBNzExNCwKKwkuaHdfYXVkaW8gPSBJVlRWX0hXX0dQSU8sCisJLmh3X2F1ZGlvX2N0cmwgPSBJVlRWX0hXX0dQSU8sCisJLmh3X2FsbCA9IElWVFZfSFdfR1BJTyB8IElWVFZfSFdfU0FBNzExNCB8IElWVFZfSFdfVFVORVIsCisJLnZpZGVvX2lucHV0cyA9IHsKKwkJeyBJVlRWX0NBUkRfSU5QVVRfVklEX1RVTkVSLCAgMCwgSVZUVl9TQUE3MVhYX0NPTVBPU0lURTQgfSwKKwkJeyBJVlRWX0NBUkRfSU5QVVRfU1ZJREVPMSwgICAgMSwgSVZUVl9TQUE3MVhYX1NWSURFTzAgICAgfSwKKwkJeyBJVlRWX0NBUkRfSU5QVVRfQ09NUE9TSVRFMSwgMSwgSVZUVl9TQUE3MVhYX0NPTVBPU0lURTMgfSwKKwl9LAorCS5hdWRpb19pbnB1dHMgPSB7CisJCXsgSVZUVl9DQVJEX0lOUFVUX0FVRF9UVU5FUiwgIElWVFZfR1BJT19UVU5FUiAgIH0sCisJCXsgSVZUVl9DQVJEX0lOUFVUX0xJTkVfSU4xLCAgIElWVFZfR1BJT19MSU5FX0lOIH0sCisJfSwKKwkuZ3Bpb19pbml0ID0geyAuZGlyZWN0aW9uID0gMHg3MDgwLCAuaW5pdGlhbF92YWx1ZSA9IDB4NDAwYyB9LAorCS5ncGlvX2F1ZGlvX2lucHV0ICA9IHsgLm1hc2sgPSAweDMwMDAsIC50dW5lciAgPSAweDAwMDAsIC5saW5laW4gPSAweDIwMDAgfSwKKwkuZ3Bpb19hdWRpb19tdXRlICAgPSB7IC5tYXNrID0gMHgwMDAxLCAubXV0ZSAgID0gMHgwMDAxIH0sCisJLmdwaW9fYXVkaW9fbW9kZSAgID0geyAubWFzayA9IDB4MDAwZSwgLm1vbm8gICA9IDB4MDAwNiwgLnN0ZXJlbyA9IDB4MDAwNCwKKwkJCSAgICAgIC5sYW5nMSA9IDB4MDAwNCwgLmxhbmcyICA9IDB4MDAwMCwgLmJvdGggICA9IDB4MDAwOCB9LAorCS5ncGlvX2F1ZGlvX2RldGVjdCA9IHsgLm1hc2sgPSAweDA5MDAsIC5zdGVyZW8gPSAweDAxMDAgfSwKKwkudHVuZXJzID0geworCQl7IC5zdGQgPSBWNEwyX1NURF82MjVfNTAsIC50dW5lciA9IFRVTkVSX1BISUxJUFNfRlExMjE2TUUgfSwKKwkJeyAuc3RkID0gVjRMMl9TVERfQUxMLCAudHVuZXIgPSBUVU5FUl9QSElMSVBTX0ZRMTI4NiB9LAorCX0sCisJLnBjaV9saXN0ID0gaXZ0dl9wY2lfbXBnMTYwLAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBZdWFuIFBHNjAwL0RpYW1vbmQgUFZSLTU1MCBjYXJkcyAqLworCitzdGF0aWMgY29uc3Qgc3RydWN0IGl2dHZfY2FyZF9wY2lfaW5mbyBpdnR2X3BjaV9wZzYwMFtdID0geworCXsgUENJX0RFVklDRV9JRF9JVlRWMTYsIElWVFZfUENJX0lEX0RJQU1PTkRNTSwgMHgwMDcwIH0sCisJeyBQQ0lfREVWSUNFX0lEX0lWVFYxNiwgSVZUVl9QQ0lfSURfWVVBTjMsICAgICAweDA2MDAgfSwKKwl7IDAsIDAsIDAgfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpdnR2X2NhcmQgaXZ0dl9jYXJkX3BnNjAwID0geworCS50eXBlID0gSVZUVl9DQVJEX1BHNjAwLAorCS5uYW1lID0gIll1YW4gUEc2MDAsIERpYW1vbmQgUFZSLTU1MCIsCisJLnY0bDJfY2FwYWJpbGl0aWVzID0gSVZUVl9DQVBfRU5DT0RFUiwKKwkuaHdfdmlkZW8gPSBJVlRWX0hXX0NYMjU4NDAsCisJLmh3X2F1ZGlvID0gSVZUVl9IV19DWDI1ODQwLAorCS5od19hdWRpb19jdHJsID0gSVZUVl9IV19DWDI1ODQwLAorCS5od19hbGwgPSBJVlRWX0hXX0NYMjU4NDAgfCBJVlRWX0hXX1RVTkVSLAorCS52aWRlb19pbnB1dHMgPSB7CisJCXsgSVZUVl9DQVJEX0lOUFVUX1ZJRF9UVU5FUiwgIDAsIENYMjU4NDBfQ09NUE9TSVRFMiB9LAorCQl7IElWVFZfQ0FSRF9JTlBVVF9TVklERU8xLCAgICAxLAorCQkgIENYMjU4NDBfU1ZJREVPX0xVTUEzIHwgQ1gyNTg0MF9TVklERU9fQ0hST01BNCB9LAorCQl7IElWVFZfQ0FSRF9JTlBVVF9DT01QT1NJVEUxLCAxLCBDWDI1ODQwX0NPTVBPU0lURTEgfSwKKwl9LAorCS5hdWRpb19pbnB1dHMgPSB7CisJCXsgSVZUVl9DQVJEX0lOUFVUX0FVRF9UVU5FUiwgIENYMjU4NDBfQVVESU81ICAgICAgIH0sCisJCXsgSVZUVl9DQVJEX0lOUFVUX0xJTkVfSU4xLCAgIENYMjU4NDBfQVVESU9fU0VSSUFMIH0sCisJfSwKKwkudHVuZXJzID0geworCQl7IC5zdGQgPSBWNEwyX1NURF82MjVfNTAsIC50dW5lciA9IFRVTkVSX1BISUxJUFNfRlExMjE2TUUgfSwKKwkJeyAuc3RkID0gVjRMMl9TVERfQUxMLCAudHVuZXIgPSBUVU5FUl9QSElMSVBTX0ZRMTI4NiB9LAorCX0sCisJLnBjaV9saXN0ID0gaXZ0dl9wY2lfcGc2MDAsCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIEFkYXB0ZWMgVmlkZU9oISBBVkMtMjQxMCBjYXJkICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaXZ0dl9jYXJkX3BjaV9pbmZvIGl2dHZfcGNpX2F2YzI0MTBbXSA9IHsKKwl7IFBDSV9ERVZJQ0VfSURfSVZUVjE2LCBJVlRWX1BDSV9JRF9BREFQVEVDLCAweDAwOTMgfSwKKwl7IDAsIDAsIDAgfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpdnR2X2NhcmQgaXZ0dl9jYXJkX2F2YzI0MTAgPSB7CisJLnR5cGUgPSBJVlRWX0NBUkRfQVZDMjQxMCwKKwkubmFtZSA9ICJBZGFwdGVjIFZpZGVPaCEgQVZDLTI0MTAiLAorCS52NGwyX2NhcGFiaWxpdGllcyA9IElWVFZfQ0FQX0VOQ09ERVIsCisJLmh3X3ZpZGVvID0gSVZUVl9IV19TQUE3MTE1LAorCS5od19hdWRpbyA9IElWVFZfSFdfTVNQMzRYWCwKKwkuaHdfYXVkaW9fY3RybCA9IElWVFZfSFdfTVNQMzRYWCwKKwkuaHdfbXV4ZXIgPSBJVlRWX0hXX0NTNTNMMzJBLAorCS5od19hbGwgPSBJVlRWX0hXX01TUDM0WFggfCBJVlRWX0hXX0NTNTNMMzJBIHwKKwkJICBJVlRWX0hXX1NBQTcxMTUgfCBJVlRWX0hXX1RVTkVSLAorCS52aWRlb19pbnB1dHMgPSB7CisJCXsgSVZUVl9DQVJEX0lOUFVUX1ZJRF9UVU5FUiwgIDAsIElWVFZfU0FBNzFYWF9DT01QT1NJVEU0IH0sCisJCXsgSVZUVl9DQVJEX0lOUFVUX1NWSURFTzEsICAgIDEsIElWVFZfU0FBNzFYWF9TVklERU8wICAgIH0sCisJCXsgSVZUVl9DQVJEX0lOUFVUX0NPTVBPU0lURTEsIDEsIElWVFZfU0FBNzFYWF9DT01QT1NJVEUzIH0sCisJfSwKKwkuYXVkaW9faW5wdXRzID0geworCQl7IElWVFZfQ0FSRF9JTlBVVF9BVURfVFVORVIsCisJCSAgTVNQX1RVTkVSLCBDUzUzTDMyQV9JTjAgfSwKKwkJeyBJVlRWX0NBUkRfSU5QVVRfTElORV9JTjEsCisJCSAgTVNQX1NDQVJUMSwgQ1M1M0wzMkFfSU4yIH0sCisJfSwKKwkvKiBUaGlzIGNhcmQgaGFzIG5vIGVlcHJvbSBhbmQgaW4gZmFjdCB0aGUgV2luZG93cyBkcml2ZXIgcmVsaWVzCisJICAgb24gdGhlIGNvdW50cnkvcmVnaW9uIHNldHRpbmcgb2YgdGhlIHVzZXIgdG8gZGVjaWRlIHdoaWNoIHR1bmVyCisJICAgaXMgYXZhaWxhYmxlLiAqLworCS50dW5lcnMgPSB7CisJCS8qIFRoaXMgdHVuZXIgaGFzIGJlZW4gdmVyaWZpZWQgZm9yIHRoZSBBVkMyNDEwICovCisJCXsgLnN0ZCA9IFY0TDJfU1REXzYyNV81MCwgLnR1bmVyID0gVFVORVJfUEhJTElQU19GTTEyMTZNRV9NSzMgfSwKKwkJLyogVGhpcyBpcyBhIGdvb2QgZ3Vlc3MsIGJ1dCBJJ20gbm90IHRvdGFsbHkgc3VyZSB0aGlzIGlzCisJCSAgIHRoZSBjb3JyZWN0IHR1bmVyIGZvciBOVFNDLiAqLworCQl7IC5zdGQgPSBWNEwyX1NURF9BTEwsIC50dW5lciA9IFRVTkVSX1BISUxJUFNfRk0xMjM2X01LMyB9LAorCX0sCisJLnBjaV9saXN0ID0gaXZ0dl9wY2lfYXZjMjQxMCwKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogQWRhcHRlYyBWaWRlT2ghIEFWQy0yMDEwIGNhcmQgKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpdnR2X2NhcmRfcGNpX2luZm8gaXZ0dl9wY2lfYXZjMjAxMFtdID0geworCXsgUENJX0RFVklDRV9JRF9JVlRWMTYsIElWVFZfUENJX0lEX0FEQVBURUMsIDB4MDA5MiB9LAorCXsgMCwgMCwgMCB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGl2dHZfY2FyZCBpdnR2X2NhcmRfYXZjMjAxMCA9IHsKKwkudHlwZSA9IElWVFZfQ0FSRF9BVkMyMDEwLAorCS5uYW1lID0gIkFkYXB0ZWMgVmlkZU9oISBBVkMtMjAxMCIsCisJLnY0bDJfY2FwYWJpbGl0aWVzID0gSVZUVl9DQVBfRU5DT0RFUiwKKwkuaHdfdmlkZW8gPSBJVlRWX0hXX1NBQTcxMTUsCisJLmh3X2F1ZGlvID0gSVZUVl9IV19DUzUzTDMyQSwKKwkuaHdfYXVkaW9fY3RybCA9IElWVFZfSFdfQ1M1M0wzMkEsCisJLmh3X2FsbCA9IElWVFZfSFdfQ1M1M0wzMkEgfCBJVlRWX0hXX1NBQTcxMTUsCisJLnZpZGVvX2lucHV0cyA9IHsKKwkJeyBJVlRWX0NBUkRfSU5QVVRfU1ZJREVPMSwgICAgMCwgSVZUVl9TQUE3MVhYX1NWSURFTzAgICAgfSwKKwkJeyBJVlRWX0NBUkRfSU5QVVRfQ09NUE9TSVRFMSwgMCwgSVZUVl9TQUE3MVhYX0NPTVBPU0lURTMgfSwKKwl9LAorCS5hdWRpb19pbnB1dHMgPSB7CisJCXsgSVZUVl9DQVJEX0lOUFVUX0xJTkVfSU4xLCAgIENTNTNMMzJBX0lOMiB9LAorCX0sCisJLyogRG9lcyBub3QgaGF2ZSBhIHR1bmVyICovCisJLnBjaV9saXN0ID0gaXZ0dl9wY2lfYXZjMjAxMCwKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogTmFnYXNlIFRyYW5zZ2VhciA1MDAwVFYgY2FyZCAqLworCitzdGF0aWMgY29uc3Qgc3RydWN0IGl2dHZfY2FyZF9wY2lfaW5mbyBpdnR2X3BjaV90ZzUwMDB0dltdID0geworCXsgUENJX0RFVklDRV9JRF9JVlRWMTYsIElWVFZfUENJX0lEX0FWRVJNRURJQSwgMHhiZmZmIH0sCisJeyAwLCAwLCAwIH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaXZ0dl9jYXJkIGl2dHZfY2FyZF90ZzUwMDB0diA9IHsKKwkudHlwZSA9IElWVFZfQ0FSRF9URzUwMDBUViwKKwkubmFtZSA9ICJOYWdhc2UgVHJhbnNnZWFyIDUwMDBUViIsCisJLnY0bDJfY2FwYWJpbGl0aWVzID0gSVZUVl9DQVBfRU5DT0RFUiwKKwkuaHdfdmlkZW8gPSBJVlRWX0hXX1NBQTcxMTQgfCBJVlRWX0hXX1VQRDY0MDMxQSB8IElWVFZfSFdfVVBENjQwOFggfAorCUlWVFZfSFdfR1BJTywKKwkuaHdfYXVkaW8gPSBJVlRWX0hXX0dQSU8sCisJLmh3X2F1ZGlvX2N0cmwgPSBJVlRWX0hXX0dQSU8sCisJLmh3X2FsbCA9IElWVFZfSFdfR1BJTyB8IElWVFZfSFdfU0FBNzExNCB8IElWVFZfSFdfVFVORVIgfAorCQkgIElWVFZfSFdfVVBENjQwMzFBIHwgSVZUVl9IV19VUEQ2NDA4WCwKKwkudmlkZW9faW5wdXRzID0geworCQl7IElWVFZfQ0FSRF9JTlBVVF9WSURfVFVORVIsICAwLCBJVlRWX1NBQTcxWFhfU1ZJREVPMCB9LAorCQl7IElWVFZfQ0FSRF9JTlBVVF9TVklERU8xLCAgICAxLCBJVlRWX1NBQTcxWFhfU1ZJREVPMiB9LAorCQl7IElWVFZfQ0FSRF9JTlBVVF9DT01QT1NJVEUxLCAxLCBJVlRWX1NBQTcxWFhfU1ZJREVPMiB9LAorCX0sCisJLmF1ZGlvX2lucHV0cyA9IHsKKwkJeyBJVlRWX0NBUkRfSU5QVVRfQVVEX1RVTkVSLCAgSVZUVl9HUElPX1RVTkVSICAgfSwKKwkJeyBJVlRWX0NBUkRfSU5QVVRfTElORV9JTjEsICAgSVZUVl9HUElPX0xJTkVfSU4gfSwKKwl9LAorCS5ncl9jb25maWcgPSBVUEQ2NDAzMUFfVkVSVElDQUxfRVhURVJOQUwsCisJLmdwaW9faW5pdCA9IHsgLmRpcmVjdGlvbiA9IDB4ZTA4MCwgLmluaXRpYWxfdmFsdWUgPSAweDgwMDAgfSwKKwkuZ3Bpb19hdWRpb19pbnB1dCAgPSB7IC5tYXNrID0gMHg4MDgwLCAudHVuZXIgID0gMHg4MDAwLCAubGluZWluID0gMHgwMDgwIH0sCisJLmdwaW9fYXVkaW9fbXV0ZSAgID0geyAubWFzayA9IDB4NjAwMCwgLm11dGUgICA9IDB4NjAwMCB9LAorCS5ncGlvX2F1ZGlvX21vZGUgICA9IHsgLm1hc2sgPSAweDQzMDAsIC5tb25vICAgPSAweDQwMDAsIC5zdGVyZW8gPSAweDAyMDAsCisJCQkgICAgICAubGFuZzEgPSAweDAzMDAsIC5sYW5nMiAgPSAweDAwMDAsIC5ib3RoICAgPSAweDAyMDAgfSwKKwkuZ3Bpb192aWRlb19pbnB1dCAgPSB7IC5tYXNrID0gMHgwMDMwLCAudHVuZXIgID0gMHgwMDAwLAorCQkJICAuY29tcG9zaXRlID0gMHgwMDEwLCAuc3ZpZGVvID0gMHgwMDIwIH0sCisJLnR1bmVycyA9IHsKKwkJeyAuc3RkID0gVjRMMl9TVERfNTI1XzYwLCAudHVuZXIgPSBUVU5FUl9QSElMSVBTX0ZRMTI4NiB9LAorCX0sCisJLnBjaV9saXN0ID0gaXZ0dl9wY2lfdGc1MDAwdHYsCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIEFPcGVuIFZBMjAwME1BWC1TTlQ2IGNhcmQgKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpdnR2X2NhcmRfcGNpX2luZm8gaXZ0dl9wY2lfdmEyMDAwW10gPSB7CisJeyBQQ0lfREVWSUNFX0lEX0lWVFYxNiwgMCwgMHhmZjVmIH0sCisJeyAwLCAwLCAwIH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaXZ0dl9jYXJkIGl2dHZfY2FyZF92YTIwMDAgPSB7CisJLnR5cGUgPSBJVlRWX0NBUkRfVkEyMDAwTUFYX1NOVDYsCisJLm5hbWUgPSAiQU9wZW4gVkEyMDAwTUFYLVNOVDYiLAorCS52NGwyX2NhcGFiaWxpdGllcyA9IElWVFZfQ0FQX0VOQ09ERVIsCisJLmh3X3ZpZGVvID0gSVZUVl9IV19TQUE3MTE1IHwgSVZUVl9IV19VUEQ2NDA4WCwKKwkuaHdfYXVkaW8gPSBJVlRWX0hXX01TUDM0WFgsCisJLmh3X2F1ZGlvX2N0cmwgPSBJVlRWX0hXX01TUDM0WFgsCisJLmh3X2FsbCA9IElWVFZfSFdfTVNQMzRYWCB8IElWVFZfSFdfU0FBNzExNSB8CisJCSAgSVZUVl9IV19VUEQ2NDA4WCB8IElWVFZfSFdfVFVORVIsCisJLnZpZGVvX2lucHV0cyA9IHsKKwkJeyBJVlRWX0NBUkRfSU5QVVRfVklEX1RVTkVSLCAwLCBJVlRWX1NBQTcxWFhfU1ZJREVPMCB9LAorCX0sCisJLmF1ZGlvX2lucHV0cyA9IHsKKwkJeyBJVlRWX0NBUkRfSU5QVVRfQVVEX1RVTkVSLCBNU1BfVFVORVIgfSwKKwl9LAorCS50dW5lcnMgPSB7CisJCXsgLnN0ZCA9IFY0TDJfU1REXzUyNV82MCwgLnR1bmVyID0gVFVORVJfUEhJTElQU19GUTEyODYgfSwKKwl9LAorCS5wY2lfbGlzdCA9IGl2dHZfcGNpX3ZhMjAwMCwKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogWXVhbiBNUEc2MDBHUi9LdXJvdXRvc2hpa291IENYMjM0MTZHWUMtU1RWTFAgY2FyZHMgKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpdnR2X2NhcmRfcGNpX2luZm8gaXZ0dl9wY2lfY3gyMzQxNmd5Y1tdID0geworCXsgUENJX0RFVklDRV9JRF9JVlRWMTYsIElWVFZfUENJX0lEX1lVQU4xLCAweDA2MDAgfSwKKwl7IFBDSV9ERVZJQ0VfSURfSVZUVjE2LCBJVlRWX1BDSV9JRF9ZVUFONCwgMHgwNjAwIH0sCisJeyBQQ0lfREVWSUNFX0lEX0lWVFYxNiwgSVZUVl9QQ0lfSURfTUVMQ08sIDB4MDUyMyB9LAorCXsgMCwgMCwgMCB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGl2dHZfY2FyZCBpdnR2X2NhcmRfY3gyMzQxNmd5YyA9IHsKKwkudHlwZSA9IElWVFZfQ0FSRF9DWDIzNDE2R1lDLAorCS5uYW1lID0gIll1YW4gTVBHNjAwR1IsIEt1cm91dG9zaGlrb3UgQ1gyMzQxNkdZQy1TVFZMUCIsCisJLnY0bDJfY2FwYWJpbGl0aWVzID0gSVZUVl9DQVBfRU5DT0RFUiwKKwkuaHdfdmlkZW8gPSBJVlRWX0hXX1NBQTcxN1ggfCBJVlRWX0hXX0dQSU8gfAorCQlJVlRWX0hXX1VQRDY0MDMxQSB8IElWVFZfSFdfVVBENjQwOFgsCisJLmh3X2F1ZGlvID0gSVZUVl9IV19TQUE3MTdYLAorCS5od19hdWRpb19jdHJsID0gSVZUVl9IV19TQUE3MTdYLAorCS5od19hbGwgPSBJVlRWX0hXX0dQSU8gfCBJVlRWX0hXX1NBQTcxN1ggfCBJVlRWX0hXX1RVTkVSIHwKKwkJICBJVlRWX0hXX1VQRDY0MDMxQSB8IElWVFZfSFdfVVBENjQwOFgsCisJLnZpZGVvX2lucHV0cyA9IHsKKwkJeyBJVlRWX0NBUkRfSU5QVVRfVklEX1RVTkVSLCAgMCwgSVZUVl9TQUE3MVhYX1NWSURFTzMgfAorCQkJCQkJIElWVFZfU0FBNzE3WF9UVU5FUl9GTEFHIH0sCisJCXsgSVZUVl9DQVJEX0lOUFVUX1NWSURFTzEsICAgIDEsIElWVFZfU0FBNzFYWF9TVklERU8wIH0sCisJCXsgSVZUVl9DQVJEX0lOUFVUX0NPTVBPU0lURTEsIDEsIElWVFZfU0FBNzFYWF9TVklERU8zIH0sCisJfSwKKwkuYXVkaW9faW5wdXRzID0geworCQl7IElWVFZfQ0FSRF9JTlBVVF9BVURfVFVORVIsICBJVlRWX1NBQTcxN1hfSU4yIH0sCisJCXsgSVZUVl9DQVJEX0lOUFVUX0xJTkVfSU4xLCAgIElWVFZfU0FBNzE3WF9JTjAgfSwKKwl9LAorCS5ncl9jb25maWcgPSBVUEQ2NDAzMUFfVkVSVElDQUxfRVhURVJOQUwsCisJLmdwaW9faW5pdCA9IHsgLmRpcmVjdGlvbiA9IDB4Zjg4MCwgLmluaXRpYWxfdmFsdWUgPSAweDg4MDAgfSwKKwkuZ3Bpb192aWRlb19pbnB1dCAgPSB7IC5tYXNrID0gMHgwMDIwLCAudHVuZXIgID0gMHgwMDAwLAorCQkJICAgICAgIC5jb21wb3NpdGUgPSAweDAwMjAsIC5zdmlkZW8gPSAweDAwMjAgfSwKKwkuZ3Bpb19hdWRpb19mcmVxICAgPSB7IC5tYXNrID0gMHhjMDAwLCAuZjMyMDAwID0gMHgwMDAwLAorCQkJICAgICAuZjQ0MTAwID0gMHg0MDAwLCAuZjQ4MDAwID0gMHg4MDAwIH0sCisJLnR1bmVycyA9IHsKKwkJeyAuc3RkID0gVjRMMl9TVERfNjI1XzUwLCAudHVuZXIgPSBUVU5FUl9QSElMSVBTX0ZNMTIxNk1FX01LMyB9LAorCQl7IC5zdGQgPSBWNEwyX1NURF9BTEwsIC50dW5lciA9IFRVTkVSX1BISUxJUFNfRk0xMjM2X01LMyB9LAorCX0sCisJLnBjaV9saXN0ID0gaXZ0dl9wY2lfY3gyMzQxNmd5YywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaXZ0dl9jYXJkIGl2dHZfY2FyZF9jeDIzNDE2Z3ljX25vZ3IgPSB7CisJLnR5cGUgPSBJVlRWX0NBUkRfQ1gyMzQxNkdZQ19OT0dSLAorCS5uYW1lID0gIll1YW4gTVBHNjAwR1IsIEt1cm91dG9zaGlrb3UgQ1gyMzQxNkdZQy1TVFZMUCAobm8gR1IpIiwKKwkudjRsMl9jYXBhYmlsaXRpZXMgPSBJVlRWX0NBUF9FTkNPREVSLAorCS5od192aWRlbyA9IElWVFZfSFdfU0FBNzE3WCB8IElWVFZfSFdfR1BJTyB8IElWVFZfSFdfVVBENjQwOFgsCisJLmh3X2F1ZGlvID0gSVZUVl9IV19TQUE3MTdYLAorCS5od19hdWRpb19jdHJsID0gSVZUVl9IV19TQUE3MTdYLAorCS5od19hbGwgPSBJVlRWX0hXX0dQSU8gfCBJVlRWX0hXX1NBQTcxN1ggfCBJVlRWX0hXX1RVTkVSIHwKKwkJICBJVlRWX0hXX1VQRDY0MDhYLAorCS52aWRlb19pbnB1dHMgPSB7CisJCXsgSVZUVl9DQVJEX0lOUFVUX1ZJRF9UVU5FUiwgIDAsIElWVFZfU0FBNzFYWF9DT01QT1NJVEU0IHwKKwkJCQkJCSBJVlRWX1NBQTcxN1hfVFVORVJfRkxBRyB9LAorCQl7IElWVFZfQ0FSRF9JTlBVVF9TVklERU8xLCAgICAxLCBJVlRWX1NBQTcxWFhfU1ZJREVPMCAgICB9LAorCQl7IElWVFZfQ0FSRF9JTlBVVF9DT01QT1NJVEUxLCAxLCBJVlRWX1NBQTcxWFhfQ09NUE9TSVRFMCB9LAorCX0sCisJLmF1ZGlvX2lucHV0cyA9IHsKKwkJeyBJVlRWX0NBUkRfSU5QVVRfQVVEX1RVTkVSLCAgSVZUVl9TQUE3MTdYX0lOMiB9LAorCQl7IElWVFZfQ0FSRF9JTlBVVF9MSU5FX0lOMSwgICBJVlRWX1NBQTcxN1hfSU4wIH0sCisJfSwKKwkuZ3Bpb19pbml0ID0geyAuZGlyZWN0aW9uID0gMHhmODgwLCAuaW5pdGlhbF92YWx1ZSA9IDB4ODgwMCB9LAorCS5ncGlvX3ZpZGVvX2lucHV0ICA9IHsgLm1hc2sgPSAweDAwMjAsIC50dW5lciAgPSAweDAwMDAsCisJCQkgICAgICAgLmNvbXBvc2l0ZSA9IDB4MDAyMCwgLnN2aWRlbyA9IDB4MDAyMCB9LAorCS5ncGlvX2F1ZGlvX2ZyZXEgICA9IHsgLm1hc2sgPSAweGMwMDAsIC5mMzIwMDAgPSAweDAwMDAsCisJCQkgICAgIC5mNDQxMDAgPSAweDQwMDAsIC5mNDgwMDAgPSAweDgwMDAgfSwKKwkudHVuZXJzID0geworCQl7IC5zdGQgPSBWNEwyX1NURF82MjVfNTAsIC50dW5lciA9IFRVTkVSX1BISUxJUFNfRk0xMjE2TUVfTUszIH0sCisJCXsgLnN0ZCA9IFY0TDJfU1REX0FMTCwgLnR1bmVyID0gVFVORVJfUEhJTElQU19GTTEyMzZfTUszIH0sCisJfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaXZ0dl9jYXJkIGl2dHZfY2FyZF9jeDIzNDE2Z3ljX25vZ3J5Y3MgPSB7CisJLnR5cGUgPSBJVlRWX0NBUkRfQ1gyMzQxNkdZQ19OT0dSWUNTLAorCS5uYW1lID0gIll1YW4gTVBHNjAwR1IsIEt1cm91dG9zaGlrb3UgQ1gyMzQxNkdZQy1TVFZMUCAobm8gR1IvWUNTKSIsCisJLnY0bDJfY2FwYWJpbGl0aWVzID0gSVZUVl9DQVBfRU5DT0RFUiwKKwkuaHdfdmlkZW8gPSBJVlRWX0hXX1NBQTcxN1ggfCBJVlRWX0hXX0dQSU8sCisJLmh3X2F1ZGlvID0gSVZUVl9IV19TQUE3MTdYLAorCS5od19hdWRpb19jdHJsID0gSVZUVl9IV19TQUE3MTdYLAorCS5od19hbGwgPSBJVlRWX0hXX0dQSU8gfCBJVlRWX0hXX1NBQTcxN1ggfCBJVlRWX0hXX1RVTkVSLAorCS52aWRlb19pbnB1dHMgPSB7CisJCXsgSVZUVl9DQVJEX0lOUFVUX1ZJRF9UVU5FUiwgIDAsIElWVFZfU0FBNzFYWF9DT01QT1NJVEU0IHwKKwkJCQkJCSBJVlRWX1NBQTcxN1hfVFVORVJfRkxBRyB9LAorCQl7IElWVFZfQ0FSRF9JTlBVVF9TVklERU8xLCAgICAxLCBJVlRWX1NBQTcxWFhfU1ZJREVPMCAgICB9LAorCQl7IElWVFZfQ0FSRF9JTlBVVF9DT01QT1NJVEUxLCAxLCBJVlRWX1NBQTcxWFhfQ09NUE9TSVRFMCB9LAorCX0sCisJLmF1ZGlvX2lucHV0cyA9IHsKKwkJeyBJVlRWX0NBUkRfSU5QVVRfQVVEX1RVTkVSLCAgSVZUVl9TQUE3MTdYX0lOMiB9LAorCQl7IElWVFZfQ0FSRF9JTlBVVF9MSU5FX0lOMSwgICBJVlRWX1NBQTcxN1hfSU4wIH0sCisJfSwKKwkuZ3Bpb19pbml0ID0geyAuZGlyZWN0aW9uID0gMHhmODgwLCAuaW5pdGlhbF92YWx1ZSA9IDB4ODgwMCB9LAorCS5ncGlvX3ZpZGVvX2lucHV0ICA9IHsgLm1hc2sgPSAweDAwMjAsIC50dW5lciAgPSAweDAwMDAsCisJCQkgICAgICAgLmNvbXBvc2l0ZSA9IDB4MDAyMCwgLnN2aWRlbyA9IDB4MDAyMCB9LAorCS5ncGlvX2F1ZGlvX2ZyZXEgICA9IHsgLm1hc2sgPSAweGMwMDAsIC5mMzIwMDAgPSAweDAwMDAsCisJCQkgICAgIC5mNDQxMDAgPSAweDQwMDAsIC5mNDgwMDAgPSAweDgwMDAgfSwKKwkudHVuZXJzID0geworCQl7IC5zdGQgPSBWNEwyX1NURF82MjVfNTAsIC50dW5lciA9IFRVTkVSX1BISUxJUFNfRk0xMjE2TUVfTUszIH0sCisJCXsgLnN0ZCA9IFY0TDJfU1REX0FMTCwgLnR1bmVyID0gVFVORVJfUEhJTElQU19GTTEyMzZfTUszIH0sCisJfSwKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogSS9PIERhdGEgR1YtTVZQL1JYICYgR1YtTVZQL1JYMlcgKGR1YWwgdHVuZXIpIGNhcmRzICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaXZ0dl9jYXJkX3BjaV9pbmZvIGl2dHZfcGNpX2d2X212cHJ4W10gPSB7CisJeyBQQ0lfREVWSUNFX0lEX0lWVFYxNiwgSVZUVl9QQ0lfSURfSU9EQVRBLCAweGQwMWUgfSwKKwl7IFBDSV9ERVZJQ0VfSURfSVZUVjE2LCBJVlRWX1BDSV9JRF9JT0RBVEEsIDB4ZDAzOCB9LCAvKiAyVyB1bml0ICMxICovCisJeyBQQ0lfREVWSUNFX0lEX0lWVFYxNiwgSVZUVl9QQ0lfSURfSU9EQVRBLCAweGQwMzkgfSwgLyogMlcgdW5pdCAjMiAqLworCXsgMCwgMCwgMCB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGl2dHZfY2FyZCBpdnR2X2NhcmRfZ3ZfbXZwcnggPSB7CisJLnR5cGUgPSBJVlRWX0NBUkRfR1ZfTVZQUlgsCisJLm5hbWUgPSAiSS9PIERhdGEgR1YtTVZQL1JYLCBHVi1NVlAvUlgyVyAoZHVhbCB0dW5lcikiLAorCS52NGwyX2NhcGFiaWxpdGllcyA9IElWVFZfQ0FQX0VOQ09ERVIsCisJLmh3X3ZpZGVvID0gSVZUVl9IV19TQUE3MTE1IHwgSVZUVl9IV19VUEQ2NDAzMUEgfCBJVlRWX0hXX1VQRDY0MDhYLAorCS5od19hdWRpbyA9IElWVFZfSFdfR1BJTywKKwkuaHdfYXVkaW9fY3RybCA9IElWVFZfSFdfV004NzM5LAorCS5od19hbGwgPSBJVlRWX0hXX0dQSU8gfCBJVlRWX0hXX1NBQTcxMTUgfCBJVlRWX0hXX1RWQVVESU8gfAorCQkgIElWVFZfSFdfVFVORVIgfCBJVlRWX0hXX1dNODczOSB8CisJCSAgSVZUVl9IV19VUEQ2NDAzMUEgfCBJVlRWX0hXX1VQRDY0MDhYLAorCS52aWRlb19pbnB1dHMgPSB7CisJCXsgSVZUVl9DQVJEX0lOUFVUX1ZJRF9UVU5FUiwgIDAsIElWVFZfU0FBNzFYWF9TVklERU8wICAgIH0sCisJCXsgSVZUVl9DQVJEX0lOUFVUX1NWSURFTzEsICAgIDEsIElWVFZfU0FBNzFYWF9TVklERU8xICAgIH0sCisJCXsgSVZUVl9DQVJEX0lOUFVUX0NPTVBPU0lURTEsIDEsIElWVFZfU0FBNzFYWF9TVklERU8yICAgIH0sCisJfSwKKwkuYXVkaW9faW5wdXRzID0geworCQl7IElWVFZfQ0FSRF9JTlBVVF9BVURfVFVORVIsICBJVlRWX0dQSU9fVFVORVIgICB9LAorCQl7IElWVFZfQ0FSRF9JTlBVVF9MSU5FX0lOMSwgICBJVlRWX0dQSU9fTElORV9JTiB9LAorCX0sCisJLmdwaW9faW5pdCA9IHsgLmRpcmVjdGlvbiA9IDB4YzMwMSwgLmluaXRpYWxfdmFsdWUgPSAweDAyMDAgfSwKKwkuZ3Bpb19hdWRpb19pbnB1dCAgPSB7IC5tYXNrID0gMHhmZmZmLCAudHVuZXIgID0gMHgwMjAwLCAubGluZWluID0gMHgwMzAwIH0sCisJLnR1bmVycyA9IHsKKwkJLyogVGhpcyBjYXJkIGhhcyB0aGUgUGFuYXNvbmljIFZQMjcgdHVuZXIgKi8KKwkJeyAuc3RkID0gVjRMMl9TVERfNTI1XzYwLCAudHVuZXIgPSBUVU5FUl9QQU5BU09OSUNfVlAyNyB9LAorCX0sCisJLnBjaV9saXN0ID0gaXZ0dl9wY2lfZ3ZfbXZwcngsCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIEkvTyBEYXRhIEdWLU1WUC9SWDJFIGNhcmQgKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpdnR2X2NhcmRfcGNpX2luZm8gaXZ0dl9wY2lfZ3ZfbXZwcngyZVtdID0geworCXsgUENJX0RFVklDRV9JRF9JVlRWMTYsIElWVFZfUENJX0lEX0lPREFUQSwgMHhkMDI1IH0sCisJezAsIDAsIDB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGl2dHZfY2FyZCBpdnR2X2NhcmRfZ3ZfbXZwcngyZSA9IHsKKwkudHlwZSA9IElWVFZfQ0FSRF9HVl9NVlBSWDJFLAorCS5uYW1lID0gIkkvTyBEYXRhIEdWLU1WUC9SWDJFIiwKKwkudjRsMl9jYXBhYmlsaXRpZXMgPSBJVlRWX0NBUF9FTkNPREVSLAorCS5od192aWRlbyA9IElWVFZfSFdfU0FBNzExNSwKKwkuaHdfYXVkaW8gPSBJVlRWX0hXX0dQSU8sCisJLmh3X2F1ZGlvX2N0cmwgPSBJVlRWX0hXX1dNODczOSwKKwkuaHdfYWxsID0gSVZUVl9IV19HUElPIHwgSVZUVl9IV19TQUE3MTE1IHwgSVZUVl9IV19UVU5FUiB8CisJCSAgSVZUVl9IV19UVkFVRElPIHwgSVZUVl9IV19XTTg3MzksCisJLnZpZGVvX2lucHV0cyA9IHsKKwkJeyBJVlRWX0NBUkRfSU5QVVRfVklEX1RVTkVSLCAgMCwgSVZUVl9TQUE3MVhYX0NPTVBPU0lURTQgfSwKKwkJeyBJVlRWX0NBUkRfSU5QVVRfU1ZJREVPMSwgICAgMSwgSVZUVl9TQUE3MVhYX1NWSURFTzAgICAgfSwKKwkJeyBJVlRWX0NBUkRfSU5QVVRfQ09NUE9TSVRFMSwgMSwgSVZUVl9TQUE3MVhYX0NPTVBPU0lURTMgfSwKKwl9LAorCS5hdWRpb19pbnB1dHMgPSB7CisJCXsgSVZUVl9DQVJEX0lOUFVUX0FVRF9UVU5FUiwgIElWVFZfR1BJT19UVU5FUiAgIH0sCisJCXsgSVZUVl9DQVJEX0lOUFVUX0xJTkVfSU4xLCAgIElWVFZfR1BJT19MSU5FX0lOIH0sCisJfSwKKwkuZ3Bpb19pbml0ID0geyAuZGlyZWN0aW9uID0gMHhjMzAxLCAuaW5pdGlhbF92YWx1ZSA9IDB4MDIwMCB9LAorCS5ncGlvX2F1ZGlvX2lucHV0ICA9IHsgLm1hc2sgPSAweGZmZmYsIC50dW5lciAgPSAweDAyMDAsIC5saW5laW4gPSAweDAzMDAgfSwKKwkudHVuZXJzID0geworCQkvKiBUaGlzIGNhcmQgaGFzIHRoZSBQYW5hc29uaWMgVlAyNyB0dW5lciAqLworCQl7IC5zdGQgPSBWNEwyX1NURF81MjVfNjAsIC50dW5lciA9IFRVTkVSX1BBTkFTT05JQ19WUDI3IH0sCisJfSwKKwkucGNpX2xpc3QgPSBpdnR2X3BjaV9ndl9tdnByeDJlLAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBHb3RWSUVXIFBDSSBEVkQgY2FyZCAqLworCitzdGF0aWMgY29uc3Qgc3RydWN0IGl2dHZfY2FyZF9wY2lfaW5mbyBpdnR2X3BjaV9nb3R2aWV3X3BjaV9kdmRbXSA9IHsKKwl7IFBDSV9ERVZJQ0VfSURfSVZUVjE2LCBJVlRWX1BDSV9JRF9ZVUFOMSwgMHgwNjAwIH0sCisJeyAwLCAwLCAwIH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaXZ0dl9jYXJkIGl2dHZfY2FyZF9nb3R2aWV3X3BjaV9kdmQgPSB7CisJLnR5cGUgPSBJVlRWX0NBUkRfR09UVklFV19QQ0lfRFZELAorCS5uYW1lID0gIkdvdFZpZXcgUENJIERWRCIsCisJLnY0bDJfY2FwYWJpbGl0aWVzID0gSVZUVl9DQVBfRU5DT0RFUiwKKwkuaHdfdmlkZW8gPSBJVlRWX0hXX1NBQTcxN1gsCisJLmh3X2F1ZGlvID0gSVZUVl9IV19TQUE3MTdYLAorCS5od19hdWRpb19jdHJsID0gSVZUVl9IV19TQUE3MTdYLAorCS5od19hbGwgPSBJVlRWX0hXX1NBQTcxN1ggfCBJVlRWX0hXX1RVTkVSLAorCS52aWRlb19pbnB1dHMgPSB7CisJCXsgSVZUVl9DQVJEX0lOUFVUX1ZJRF9UVU5FUiwgIDAsIElWVFZfU0FBNzFYWF9DT01QT1NJVEUxIH0sICAvKiBwaW4gMTE2ICovCisJCXsgSVZUVl9DQVJEX0lOUFVUX1NWSURFTzEsICAgIDEsIElWVFZfU0FBNzFYWF9TVklERU8wIH0sICAgICAvKiBwaW4gMTE0LzEwOSAqLworCQl7IElWVFZfQ0FSRF9JTlBVVF9DT01QT1NJVEUxLCAxLCBJVlRWX1NBQTcxWFhfQ09NUE9TSVRFMyB9LCAgLyogcGluIDExOCAqLworCX0sCisJLmF1ZGlvX2lucHV0cyA9IHsKKwkJeyBJVlRWX0NBUkRfSU5QVVRfQVVEX1RVTkVSLCAgSVZUVl9TQUE3MTdYX0lOMCB9LAorCQl7IElWVFZfQ0FSRF9JTlBVVF9MSU5FX0lOMSwgICBJVlRWX1NBQTcxN1hfSU4yIH0sCisJfSwKKwkuZ3Bpb19pbml0ID0geyAuZGlyZWN0aW9uID0gMHhmMDAwLCAuaW5pdGlhbF92YWx1ZSA9IDB4QTAwMCB9LAorCS50dW5lcnMgPSB7CisJCS8qIFRoaXMgY2FyZCBoYXMgYSBQaGlsaXBzIEZRMTIxNk1FIE1LMyB0dW5lciAqLworCQl7IC5zdGQgPSBWNEwyX1NURF82MjVfNTAsIC50dW5lciA9IFRVTkVSX1BISUxJUFNfRk0xMjE2TUVfTUszIH0sCisJfSwKKwkucGNpX2xpc3QgPSBpdnR2X3BjaV9nb3R2aWV3X3BjaV9kdmQsCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIEdvdFZJRVcgUENJIERWRDIgRGVsdXhlIGNhcmQgKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpdnR2X2NhcmRfcGNpX2luZm8gaXZ0dl9wY2lfZ290dmlld19wY2lfZHZkMltdID0geworCXsgUENJX0RFVklDRV9JRF9JVlRWMTYsIElWVFZfUENJX0lEX0dPVFZJRVcxLCAweDA2MDAgfSwKKwl7IDAsIDAsIDAgfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpdnR2X2NhcmQgaXZ0dl9jYXJkX2dvdHZpZXdfcGNpX2R2ZDIgPSB7CisJLnR5cGUgPSBJVlRWX0NBUkRfR09UVklFV19QQ0lfRFZEMiwKKwkubmFtZSA9ICJHb3RWaWV3IFBDSSBEVkQyIERlbHV4ZSIsCisJLnY0bDJfY2FwYWJpbGl0aWVzID0gSVZUVl9DQVBfRU5DT0RFUiwKKwkuaHdfdmlkZW8gPSBJVlRWX0hXX0NYMjU4NDAsCisJLmh3X2F1ZGlvID0gSVZUVl9IV19DWDI1ODQwLAorCS5od19hdWRpb19jdHJsID0gSVZUVl9IV19DWDI1ODQwLAorCS5od19tdXhlciA9IElWVFZfSFdfR1BJTywKKwkuaHdfYWxsID0gSVZUVl9IV19DWDI1ODQwIHwgSVZUVl9IV19UVU5FUiwKKwkudmlkZW9faW5wdXRzID0geworCQl7IElWVFZfQ0FSRF9JTlBVVF9WSURfVFVORVIsICAwLCBDWDI1ODQwX0NPTVBPU0lURTIgfSwKKwkJeyBJVlRWX0NBUkRfSU5QVVRfU1ZJREVPMSwgICAgMSwKKwkJICBDWDI1ODQwX1NWSURFT19MVU1BMyB8IENYMjU4NDBfU1ZJREVPX0NIUk9NQTQgfSwKKwkJeyBJVlRWX0NBUkRfSU5QVVRfQ09NUE9TSVRFMSwgMSwgQ1gyNTg0MF9DT01QT1NJVEUxIH0sCisJfSwKKwkuYXVkaW9faW5wdXRzID0geworCQl7IElWVFZfQ0FSRF9JTlBVVF9BVURfVFVORVIsICBDWDI1ODQwX0FVRElPNSwgICAgICAgMCB9LAorCQl7IElWVFZfQ0FSRF9JTlBVVF9MSU5FX0lOMSwgICBDWDI1ODQwX0FVRElPX1NFUklBTCwgMSB9LAorCX0sCisJLnJhZGlvX2lucHV0ID0geyBJVlRWX0NBUkRfSU5QVVRfQVVEX1RVTkVSLCBDWDI1ODQwX0FVRElPX1NFUklBTCwgMiB9LAorCS5ncGlvX2luaXQgPSB7IC5kaXJlY3Rpb24gPSAweDA4MDAsIC5pbml0aWFsX3ZhbHVlID0gMCB9LAorCS5ncGlvX2F1ZGlvX2lucHV0ICA9IHsgLm1hc2sgPSAweDA4MDAsIC50dW5lciA9IDAsIC5saW5laW4gPSAwLCAucmFkaW8gPSAweDA4MDAgfSwKKwkudHVuZXJzID0geworCQkvKiBUaGlzIGNhcmQgaGFzIGEgUGhpbGlwcyBGUTEyMTZNRSBNSzUgdHVuZXIgKi8KKwkJeyAuc3RkID0gVjRMMl9TVERfNjI1XzUwLCAudHVuZXIgPSBUVU5FUl9QSElMSVBTX0ZNMTIxNk1FX01LMyB9LAorCX0sCisJLnBjaV9saXN0ID0gaXZ0dl9wY2lfZ290dmlld19wY2lfZHZkMiwKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogWXVhbiBNUEM2MjIgbWluaVBDSSBjYXJkICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaXZ0dl9jYXJkX3BjaV9pbmZvIGl2dHZfcGNpX3l1YW5fbXBjNjIyW10gPSB7CisJeyBQQ0lfREVWSUNFX0lEX0lWVFYxNiwgSVZUVl9QQ0lfSURfWVVBTjIsIDB4ZDk5OCB9LAorCXsgMCwgMCwgMCB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGl2dHZfY2FyZCBpdnR2X2NhcmRfeXVhbl9tcGM2MjIgPSB7CisJLnR5cGUgPSBJVlRWX0NBUkRfWVVBTl9NUEM2MjIsCisJLm5hbWUgPSAiWXVhbiBNUEM2MjIiLAorCS52NGwyX2NhcGFiaWxpdGllcyA9IElWVFZfQ0FQX0VOQ09ERVIsCisJLmh3X3ZpZGVvID0gSVZUVl9IV19DWDI1ODQwLAorCS5od19hdWRpbyA9IElWVFZfSFdfQ1gyNTg0MCwKKwkuaHdfYXVkaW9fY3RybCA9IElWVFZfSFdfQ1gyNTg0MCwKKwkuaHdfYWxsID0gSVZUVl9IV19DWDI1ODQwIHwgSVZUVl9IV19UVU5FUiwKKwkudmlkZW9faW5wdXRzID0geworCQl7IElWVFZfQ0FSRF9JTlBVVF9WSURfVFVORVIsICAwLCBDWDI1ODQwX0NPTVBPU0lURTIgfSwKKwkJeyBJVlRWX0NBUkRfSU5QVVRfU1ZJREVPMSwgICAgMSwKKwkJICBDWDI1ODQwX1NWSURFT19MVU1BMyB8IENYMjU4NDBfU1ZJREVPX0NIUk9NQTQgfSwKKwkJeyBJVlRWX0NBUkRfSU5QVVRfQ09NUE9TSVRFMSwgMSwgQ1gyNTg0MF9DT01QT1NJVEUxIH0sCisJfSwKKwkuYXVkaW9faW5wdXRzID0geworCQl7IElWVFZfQ0FSRF9JTlBVVF9BVURfVFVORVIsICBDWDI1ODQwX0FVRElPNSAgICAgICB9LAorCQl7IElWVFZfQ0FSRF9JTlBVVF9MSU5FX0lOMSwgICBDWDI1ODQwX0FVRElPX1NFUklBTCB9LAorCX0sCisJLmdwaW9faW5pdCA9IHsgLmRpcmVjdGlvbiA9IDB4MDBmZiwgLmluaXRpYWxfdmFsdWUgPSAweDAwMDIgfSwKKwkudHVuZXJzID0geworCQkvKiBUaGlzIGNhcmQgaGFzIHRoZSBUREE4MjkwL1REQTgyNzUgdHVuZXIgY2hpcHMgKi8KKwkJeyAuc3RkID0gVjRMMl9TVERfQUxMLCAudHVuZXIgPSBUVU5FUl9QSElMSVBTX1REQTgyOTAgfSwKKwl9LAorCS5wY2lfbGlzdCA9IGl2dHZfcGNpX3l1YW5fbXBjNjIyLAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBESUdJVEFMIENPV0JPWSBEQ1QtTVRWUDEgY2FyZCAqLworCitzdGF0aWMgY29uc3Qgc3RydWN0IGl2dHZfY2FyZF9wY2lfaW5mbyBpdnR2X3BjaV9kY3RtdnR2cDFbXSA9IHsKKwl7IFBDSV9ERVZJQ0VfSURfSVZUVjE2LCBJVlRWX1BDSV9JRF9BVkVSTUVESUEsIDB4YmZmZiB9LAorCXsgMCwgMCwgMCB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGl2dHZfY2FyZCBpdnR2X2NhcmRfZGN0bXZ0dnAxID0geworCS50eXBlID0gSVZUVl9DQVJEX0RDVE1UVlAxLAorCS5uYW1lID0gIkRpZ2l0YWwgQ293Ym95IERDVC1NVFZQMSIsCisJLnY0bDJfY2FwYWJpbGl0aWVzID0gSVZUVl9DQVBfRU5DT0RFUiwKKwkuaHdfdmlkZW8gPSBJVlRWX0hXX1NBQTcxMTUgfCBJVlRWX0hXX1VQRDY0MDMxQSB8IElWVFZfSFdfVVBENjQwOFggfAorCQlJVlRWX0hXX0dQSU8sCisJLmh3X2F1ZGlvID0gSVZUVl9IV19HUElPLAorCS5od19hdWRpb19jdHJsID0gSVZUVl9IV19HUElPLAorCS5od19hbGwgPSBJVlRWX0hXX0dQSU8gfCBJVlRWX0hXX1NBQTcxMTUgfCBJVlRWX0hXX1RVTkVSIHwKKwkJSVZUVl9IV19VUEQ2NDAzMUEgfCBJVlRWX0hXX1VQRDY0MDhYLAorCS52aWRlb19pbnB1dHMgPSB7CisJCXsgSVZUVl9DQVJEX0lOUFVUX1ZJRF9UVU5FUiwgIDAsIElWVFZfU0FBNzFYWF9TVklERU8wICAgIH0sCisJCXsgSVZUVl9DQVJEX0lOUFVUX1NWSURFTzEsICAgIDEsIElWVFZfU0FBNzFYWF9TVklERU8yICAgIH0sCisJCXsgSVZUVl9DQVJEX0lOUFVUX0NPTVBPU0lURTEsIDEsIElWVFZfU0FBNzFYWF9TVklERU8yIH0sCisJfSwKKwkuYXVkaW9faW5wdXRzID0geworCQl7IElWVFZfQ0FSRF9JTlBVVF9BVURfVFVORVIsICBJVlRWX0dQSU9fVFVORVIgICB9LAorCQl7IElWVFZfQ0FSRF9JTlBVVF9MSU5FX0lOMSwgICBJVlRWX0dQSU9fTElORV9JTiB9LAorCX0sCisJLmdwaW9faW5pdCA9IHsgLmRpcmVjdGlvbiA9IDB4ZTA4MCwgLmluaXRpYWxfdmFsdWUgPSAweDgwMDAgfSwKKwkuZ3Bpb19hdWRpb19pbnB1dCAgPSB7IC5tYXNrID0gMHg4MDgwLCAudHVuZXIgID0gMHg4MDAwLCAubGluZWluID0gMHgwMDgwIH0sCisJLmdwaW9fYXVkaW9fbXV0ZSAgID0geyAubWFzayA9IDB4NjAwMCwgLm11dGUgICA9IDB4NjAwMCB9LAorCS5ncGlvX2F1ZGlvX21vZGUgICA9IHsgLm1hc2sgPSAweDQzMDAsIC5tb25vICAgPSAweDQwMDAsIC5zdGVyZW8gPSAweDAyMDAsCisJCQkgICAgICAubGFuZzEgPSAweDAzMDAsIC5sYW5nMiAgPSAweDAwMDAsIC5ib3RoICAgPSAweDAyMDAgfSwKKwkuZ3Bpb192aWRlb19pbnB1dCAgPSB7IC5tYXNrID0gMHgwMDMwLCAudHVuZXIgID0gMHgwMDAwLAorCQkJICAgICAgIC5jb21wb3NpdGUgPSAweDAwMTAsIC5zdmlkZW8gPSAweDAwMjB9LAorCS50dW5lcnMgPSB7CisJCXsgLnN0ZCA9IFY0TDJfU1REXzUyNV82MCwgLnR1bmVyID0gVFVORVJfUEhJTElQU19GUTEyODYgfSwKKwl9LAorCS5wY2lfbGlzdCA9IGl2dHZfcGNpX2RjdG12dHZwMSwKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmZGVmIEhBVkVfWEMzMDI4CisKKy8qIFl1YW4gUEc2MDAtMi9Hb3RWaWV3IFBDSSBEVkQgTGl0ZS9DbHViM0QgWkFQLVRWMXgwMSBjYXJkcyAqLworCitzdGF0aWMgY29uc3Qgc3RydWN0IGl2dHZfY2FyZF9wY2lfaW5mbyBpdnR2X3BjaV9wZzYwMHYyW10gPSB7CisJeyBQQ0lfREVWSUNFX0lEX0lWVFYxNiwgSVZUVl9QQ0lfSURfWVVBTjMsICAgICAweDA2MDAgfSwKKwl7IFBDSV9ERVZJQ0VfSURfSVZUVjE2LCBJVlRWX1BDSV9JRF9HT1RWSUVXMiwgIDB4MDYwMCB9LAorCXsgMCwgMCwgMCB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGl2dHZfY2FyZCBpdnR2X2NhcmRfcGc2MDB2MiA9IHsKKwkudHlwZSA9IElWVFZfQ0FSRF9QRzYwMFYyLAorCS5uYW1lID0gIll1YW4gUEc2MDAtMiwgR290VmlldyBQQ0kgRFZEIExpdGUsIENsdWIzRCBaQVAtVFYxeDAxIiwKKwkudjRsMl9jYXBhYmlsaXRpZXMgPSBJVlRWX0NBUF9FTkNPREVSLAorCS5od192aWRlbyA9IElWVFZfSFdfQ1gyNTg0MCwKKwkuaHdfYXVkaW8gPSBJVlRWX0hXX0NYMjU4NDAsCisJLmh3X2F1ZGlvX2N0cmwgPSBJVlRWX0hXX0NYMjU4NDAsCisJLmh3X2FsbCA9IElWVFZfSFdfQ1gyNTg0MCB8IElWVFZfSFdfVFVORVIsCisJLnZpZGVvX2lucHV0cyA9IHsKKwkJeyBJVlRWX0NBUkRfSU5QVVRfVklEX1RVTkVSLCAgMCwgQ1gyNTg0MF9DT01QT1NJVEUyIH0sCisJCXsgSVZUVl9DQVJEX0lOUFVUX1NWSURFTzEsICAgIDEsCisJCSAgQ1gyNTg0MF9TVklERU9fTFVNQTMgfCBDWDI1ODQwX1NWSURFT19DSFJPTUE0IH0sCisJfSwKKwkuYXVkaW9faW5wdXRzID0geworCQl7IElWVFZfQ0FSRF9JTlBVVF9BVURfVFVORVIsICBDWDI1ODQwX0FVRElPNSAgICAgICB9LAorCQl7IElWVFZfQ0FSRF9JTlBVVF9MSU5FX0lOMSwgICBDWDI1ODQwX0FVRElPX1NFUklBTCB9LAorCX0sCisJLnJhZGlvX2lucHV0ID0geyBJVlRWX0NBUkRfSU5QVVRfQVVEX1RVTkVSLCBDWDI1ODQwX0FVRElPNSB9LAorCS50dW5lcnMgPSB7CisJCXsgLnN0ZCA9IFY0TDJfU1REX0FMTCwgLnR1bmVyID0gVFVORVJfWENFSVZFX1hDMzAyOCB9LAorCX0sCisJLmdwaW9faW5pdCA9IHsgLmRpcmVjdGlvbiA9IDB4MTAwMCwgLmluaXRpYWxfdmFsdWUgPSAweDEwMDAgfSwgLyogdHVuZXIgcmVzZXQgKi8KKwkucGNpX2xpc3QgPSBpdnR2X3BjaV9wZzYwMHYyLAorfTsKKyNlbmRpZgorCitzdGF0aWMgY29uc3Qgc3RydWN0IGl2dHZfY2FyZCAqaXZ0dl9jYXJkX2xpc3RbXSA9IHsKKwkmaXZ0dl9jYXJkX3B2cjI1MCwKKwkmaXZ0dl9jYXJkX3B2cjM1MCwKKwkmaXZ0dl9jYXJkX3B2cjE1MCwKKwkmaXZ0dl9jYXJkX20xNzksCisJJml2dHZfY2FyZF9tcGc2MDAsCisJJml2dHZfY2FyZF9tcGcxNjAsCisJJml2dHZfY2FyZF9wZzYwMCwKKwkmaXZ0dl9jYXJkX2F2YzI0MTAsCisJJml2dHZfY2FyZF9hdmMyMDEwLAorCSZpdnR2X2NhcmRfdGc1MDAwdHYsCisJJml2dHZfY2FyZF92YTIwMDAsCisJJml2dHZfY2FyZF9jeDIzNDE2Z3ljLAorCSZpdnR2X2NhcmRfZ3ZfbXZwcngsCisJJml2dHZfY2FyZF9ndl9tdnByeDJlLAorCSZpdnR2X2NhcmRfZ290dmlld19wY2lfZHZkLAorCSZpdnR2X2NhcmRfZ290dmlld19wY2lfZHZkMiwKKwkmaXZ0dl9jYXJkX3l1YW5fbXBjNjIyLAorCSZpdnR2X2NhcmRfZGN0bXZ0dnAxLAorI2lmZGVmIEhBVkVfWEMzMDI4CisJJml2dHZfY2FyZF9wZzYwMHYyLAorI2VuZGlmCisKKwkvKiBWYXJpYXRpb25zIG9mIHN0YW5kYXJkIGNhcmRzIGJ1dCB3aXRoIHRoZSBzYW1lIFBDSSBJRHMuCisJICAgVGhlc2UgY2FyZHMgbXVzdCBjb21lIGxhc3QgaW4gdGhpcyBsaXN0LiAqLworCSZpdnR2X2NhcmRfcHZyMzUwX3YxLAorCSZpdnR2X2NhcmRfY3gyMzQxNmd5Y19ub2dyLAorCSZpdnR2X2NhcmRfY3gyMzQxNmd5Y19ub2dyeWNzLAorfTsKKworY29uc3Qgc3RydWN0IGl2dHZfY2FyZCAqaXZ0dl9nZXRfY2FyZCh1MTYgaW5kZXgpCit7CisJaWYgKGluZGV4ID49IEFSUkFZX1NJWkUoaXZ0dl9jYXJkX2xpc3QpKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gaXZ0dl9jYXJkX2xpc3RbaW5kZXhdOworfQorCitpbnQgaXZ0dl9nZXRfaW5wdXQoc3RydWN0IGl2dHYgKml0diwgdTE2IGluZGV4LCBzdHJ1Y3QgdjRsMl9pbnB1dCAqaW5wdXQpCit7CisJY29uc3Qgc3RydWN0IGl2dHZfY2FyZF92aWRlb19pbnB1dCAqY2FyZF9pbnB1dCA9IGl0di0+Y2FyZC0+dmlkZW9faW5wdXRzICsgaW5kZXg7CisJc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpbnB1dF9zdHJzW10gPSB7CisJCSJUdW5lciAxIiwKKwkJIlMtVmlkZW8gMSIsCisJCSJTLVZpZGVvIDIiLAorCQkiQ29tcG9zaXRlIDEiLAorCQkiQ29tcG9zaXRlIDIiLAorCQkiQ29tcG9zaXRlIDMiCisJfTsKKworCW1lbXNldChpbnB1dCwgMCwgc2l6ZW9mKCppbnB1dCkpOworCWlmIChpbmRleCA+PSBpdHYtPm5vZl9pbnB1dHMpCisJCXJldHVybiAtRUlOVkFMOworCWlucHV0LT5pbmRleCA9IGluZGV4OworCXN0cmNweShpbnB1dC0+bmFtZSwgaW5wdXRfc3Ryc1tjYXJkX2lucHV0LT52aWRlb190eXBlIC0gMV0pOworCWlucHV0LT50eXBlID0gKGNhcmRfaW5wdXQtPnZpZGVvX3R5cGUgPT0gSVZUVl9DQVJEX0lOUFVUX1ZJRF9UVU5FUiA/CisJCQlWNEwyX0lOUFVUX1RZUEVfVFVORVIgOiBWNEwyX0lOUFVUX1RZUEVfQ0FNRVJBKTsKKwlpbnB1dC0+YXVkaW9zZXQgPSAoMSA8PCBpdHYtPm5vZl9hdWRpb19pbnB1dHMpIC0gMTsKKwlpbnB1dC0+c3RkID0gKGlucHV0LT50eXBlID09IFY0TDJfSU5QVVRfVFlQRV9UVU5FUikgPworCQkJCWl0di0+dHVuZXJfc3RkIDogVjRMMl9TVERfQUxMOworCXJldHVybiAwOworfQorCitpbnQgaXZ0dl9nZXRfb3V0cHV0KHN0cnVjdCBpdnR2ICppdHYsIHUxNiBpbmRleCwgc3RydWN0IHY0bDJfb3V0cHV0ICpvdXRwdXQpCit7CisJY29uc3Qgc3RydWN0IGl2dHZfY2FyZF9vdXRwdXQgKmNhcmRfb3V0cHV0ID0gaXR2LT5jYXJkLT52aWRlb19vdXRwdXRzICsgaW5kZXg7CisKKwltZW1zZXQob3V0cHV0LCAwLCBzaXplb2YoKm91dHB1dCkpOworCWlmIChpbmRleCA+PSBpdHYtPmNhcmQtPm5vZl9vdXRwdXRzKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlvdXRwdXQtPmluZGV4ID0gaW5kZXg7CisJc3RyY3B5KG91dHB1dC0+bmFtZSwgY2FyZF9vdXRwdXQtPm5hbWUpOworCW91dHB1dC0+dHlwZSA9IFY0TDJfT1VUUFVUX1RZUEVfQU5BTE9HOworCW91dHB1dC0+YXVkaW9zZXQgPSAxOworCW91dHB1dC0+c3RkID0gVjRMMl9TVERfQUxMOworCXJldHVybiAwOworfQorCitpbnQgaXZ0dl9nZXRfYXVkaW9faW5wdXQoc3RydWN0IGl2dHYgKml0diwgdTE2IGluZGV4LCBzdHJ1Y3QgdjRsMl9hdWRpbyAqYXVkaW8pCit7CisJY29uc3Qgc3RydWN0IGl2dHZfY2FyZF9hdWRpb19pbnB1dCAqYXVkX2lucHV0ID0gaXR2LT5jYXJkLT5hdWRpb19pbnB1dHMgKyBpbmRleDsKKwlzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGlucHV0X3N0cnNbXSA9IHsKKwkJIlR1bmVyIDEiLAorCQkiTGluZSBJbiAxIiwKKwkJIkxpbmUgSW4gMiIKKwl9OworCisJbWVtc2V0KGF1ZGlvLCAwLCBzaXplb2YoKmF1ZGlvKSk7CisJaWYgKGluZGV4ID49IGl0di0+bm9mX2F1ZGlvX2lucHV0cykKKwkJcmV0dXJuIC1FSU5WQUw7CisJc3RyY3B5KGF1ZGlvLT5uYW1lLCBpbnB1dF9zdHJzW2F1ZF9pbnB1dC0+YXVkaW9fdHlwZSAtIDFdKTsKKwlhdWRpby0+aW5kZXggPSBpbmRleDsKKwlhdWRpby0+Y2FwYWJpbGl0eSA9IFY0TDJfQVVEQ0FQX1NURVJFTzsKKwlyZXR1cm4gMDsKK30KKworaW50IGl2dHZfZ2V0X2F1ZGlvX291dHB1dChzdHJ1Y3QgaXZ0diAqaXR2LCB1MTYgaW5kZXgsIHN0cnVjdCB2NGwyX2F1ZGlvb3V0ICphdWRfb3V0cHV0KQoreworCW1lbXNldChhdWRfb3V0cHV0LCAwLCBzaXplb2YoKmF1ZF9vdXRwdXQpKTsKKwlpZiAoaXR2LT5jYXJkLT52aWRlb19vdXRwdXRzID09IE5VTEwgfHwgaW5kZXggIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJc3RyY3B5KGF1ZF9vdXRwdXQtPm5hbWUsICJBL1YgQXVkaW8gT3V0Iik7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1jYXJkcy5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtY2FyZHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTAxMmY4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtY2FyZHMuaApAQCAtMCwwICsxLDIwNyBAQAorLyoKKyAgICBGdW5jdGlvbnMgdG8gcXVlcnkgY2FyZCBoYXJkd2FyZQorICAgIENvcHlyaWdodCAoQykgMjAwMy0yMDA0ICBLZXZpbiBUaGF5ZXIgPG51ZmFuX3dmayBhdCB5YWhvby5jb20+CisgICAgQ29weXJpZ2h0IChDKSAyMDA1LTIwMDcgIEhhbnMgVmVya3VpbCA8aHZlcmt1aWxAeHM0YWxsLm5sPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKy8qIGhhcmR3YXJlIGZsYWdzICovCisjZGVmaW5lIElWVFZfSFdfQ1gyNTg0MCAgICgxIDw8IDApCisjZGVmaW5lIElWVFZfSFdfU0FBNzExNSAgICgxIDw8IDEpCisjZGVmaW5lIElWVFZfSFdfU0FBNzEyNyAgICgxIDw8IDIpCisjZGVmaW5lIElWVFZfSFdfTVNQMzRYWCAgICgxIDw8IDMpCisjZGVmaW5lIElWVFZfSFdfVFVORVIgICAgICgxIDw8IDQpCisjZGVmaW5lIElWVFZfSFdfV004Nzc1ICAgICgxIDw8IDUpCisjZGVmaW5lIElWVFZfSFdfQ1M1M0wzMkEgICgxIDw8IDYpCisjZGVmaW5lIElWVFZfSFdfVFZFRVBST00gICgxIDw8IDcpCisjZGVmaW5lIElWVFZfSFdfU0FBNzExNCAgICgxIDw8IDgpCisjZGVmaW5lIElWVFZfSFdfVFZBVURJTyAgICgxIDw8IDkpCisjZGVmaW5lIElWVFZfSFdfVVBENjQwMzFBICgxIDw8IDEwKQorI2RlZmluZSBJVlRWX0hXX1VQRDY0MDhYICAoMSA8PCAxMSkKKyNkZWZpbmUgSVZUVl9IV19TQUE3MTdYICAgKDEgPDwgMTIpCisjZGVmaW5lIElWVFZfSFdfV004NzM5ICAgICgxIDw8IDEzKQorI2RlZmluZSBJVlRWX0hXX0dQSU8gICAgICAoMSA8PCAxNCkKKworI2RlZmluZSBJVlRWX0hXX1NBQTcxMVggICAoSVZUVl9IV19TQUE3MTE1IHwgSVZUVl9IV19TQUE3MTE0KQorCisvKiB2aWRlbyBpbnB1dHMgKi8KKyNkZWZpbmUJSVZUVl9DQVJEX0lOUFVUX1ZJRF9UVU5FUgkxCisjZGVmaW5lCUlWVFZfQ0FSRF9JTlBVVF9TVklERU8xIAkyCisjZGVmaW5lCUlWVFZfQ0FSRF9JTlBVVF9TVklERU8yIAkzCisjZGVmaW5lCUlWVFZfQ0FSRF9JTlBVVF9DT01QT1NJVEUxIAk0CisjZGVmaW5lCUlWVFZfQ0FSRF9JTlBVVF9DT01QT1NJVEUyIAk1CisjZGVmaW5lCUlWVFZfQ0FSRF9JTlBVVF9DT01QT1NJVEUzIAk2CisKKy8qIGF1ZGlvIGlucHV0cyAqLworI2RlZmluZQlJVlRWX0NBUkRfSU5QVVRfQVVEX1RVTkVSCTEKKyNkZWZpbmUJSVZUVl9DQVJEX0lOUFVUX0xJTkVfSU4xIAkyCisjZGVmaW5lCUlWVFZfQ0FSRF9JTlBVVF9MSU5FX0lOMiAJMworCisjZGVmaW5lIElWVFZfQ0FSRF9NQVhfVklERU9fSU5QVVRTIDYKKyNkZWZpbmUgSVZUVl9DQVJEX01BWF9BVURJT19JTlBVVFMgMworI2RlZmluZSBJVlRWX0NBUkRfTUFYX1RVTkVSUyAgCSAgIDIKKworLyogU0FBNzFYWCBIVyBpbnB1dHMgKi8KKyNkZWZpbmUgSVZUVl9TQUE3MVhYX0NPTVBPU0lURTAgMAorI2RlZmluZSBJVlRWX1NBQTcxWFhfQ09NUE9TSVRFMSAxCisjZGVmaW5lIElWVFZfU0FBNzFYWF9DT01QT1NJVEUyIDIKKyNkZWZpbmUgSVZUVl9TQUE3MVhYX0NPTVBPU0lURTMgMworI2RlZmluZSBJVlRWX1NBQTcxWFhfQ09NUE9TSVRFNCA0CisjZGVmaW5lIElWVFZfU0FBNzFYWF9DT01QT1NJVEU1IDUKKyNkZWZpbmUgSVZUVl9TQUE3MVhYX1NWSURFTzAgICAgNgorI2RlZmluZSBJVlRWX1NBQTcxWFhfU1ZJREVPMSAgICA3CisjZGVmaW5lIElWVFZfU0FBNzFYWF9TVklERU8yICAgIDgKKyNkZWZpbmUgSVZUVl9TQUE3MVhYX1NWSURFTzMgICAgOQorCisvKiBTQUE3MTdYIG5lZWRzIHRvIG1hcmsgdGhlIHR1bmVyIGlucHV0IGJ5IE9SaW5nIHdpdGggdGhpcyBmbGFnICovCisjZGVmaW5lIElWVFZfU0FBNzE3WF9UVU5FUl9GTEFHIDB4ODAKKworLyogRHVtbXkgSFcgaW5wdXQgKi8KKyNkZWZpbmUgSVZUVl9EVU1NWV9BVURJTyAgICAgICAgMAorCisvKiBHUElPIEhXIGlucHV0cyAqLworI2RlZmluZSBJVlRWX0dQSU9fVFVORVIgICAwCisjZGVmaW5lIElWVFZfR1BJT19MSU5FX0lOIDEKKworLyogU0FBNzE3WCBIVyBpbnB1dHMgKi8KKyNkZWZpbmUgSVZUVl9TQUE3MTdYX0lOMCAwCisjZGVmaW5lIElWVFZfU0FBNzE3WF9JTjEgMQorI2RlZmluZSBJVlRWX1NBQTcxN1hfSU4yIDIKKworLyogVjRMMiBjYXBhYmlsaXR5IGFsaWFzZXMgKi8KKyNkZWZpbmUgSVZUVl9DQVBfRU5DT0RFUiAoVjRMMl9DQVBfVklERU9fQ0FQVFVSRSB8IFY0TDJfQ0FQX1RVTkVSIHwgXAorCQkJICBWNEwyX0NBUF9BVURJTyB8IFY0TDJfQ0FQX1JFQURXUklURSB8IFY0TDJfQ0FQX1ZCSV9DQVBUVVJFIHwgXAorCQkJICBWNEwyX0NBUF9TTElDRURfVkJJX0NBUFRVUkUpCisjZGVmaW5lIElWVFZfQ0FQX0RFQ09ERVIgKFY0TDJfQ0FQX1ZCSV9PVVRQVVQgfCBWNEwyX0NBUF9WSURFT19PVVRQVVQgfCBcCisJCQkgIFY0TDJfQ0FQX1NMSUNFRF9WQklfT1VUUFVUIHwgVjRMMl9DQVBfVklERU9fT1VUUFVUX09WRVJMQVkgfCBWNEwyX0NBUF9WSURFT19PVVRQVVRfUE9TKQorCitzdHJ1Y3QgaXZ0dl9jYXJkX3ZpZGVvX2lucHV0IHsKKwl1OCAgdmlkZW9fdHlwZTsgCS8qIHZpZGVvIGlucHV0IHR5cGUgKi8KKwl1OCAgYXVkaW9faW5kZXg7CS8qIGluZGV4IGluIGl2dHZfY2FyZF9hdWRpb19pbnB1dCBhcnJheSAqLworCXUxNiB2aWRlb19pbnB1dDsJLyogaGFyZHdhcmUgdmlkZW8gaW5wdXQgKi8KK307CisKK3N0cnVjdCBpdnR2X2NhcmRfYXVkaW9faW5wdXQgeworCXU4ICBhdWRpb190eXBlOwkJLyogYXVkaW8gaW5wdXQgdHlwZSAqLworCXUzMiBhdWRpb19pbnB1dDsJLyogaGFyZHdhcmUgYXVkaW8gaW5wdXQgKi8KKwl1MTYgbXV4ZXJfaW5wdXQ7CS8qIGhhcmR3YXJlIG11eGVyIGlucHV0IGZvciBib2FyZHMgd2l0aCBhCisJCQkJICAgbXVsdGlwbGV4ZXIgY2hpcCAqLworfTsKKworc3RydWN0IGl2dHZfY2FyZF9vdXRwdXQgeworCXU4ICBuYW1lWzMyXTsKKwl1MTYgdmlkZW9fb3V0cHV0OyAgLyogaGFyZHdhcmUgdmlkZW8gb3V0cHV0ICovCit9OworCitzdHJ1Y3QgaXZ0dl9jYXJkX3BjaV9pbmZvIHsKKwl1MTYgZGV2aWNlOworCXUxNiBzdWJzeXN0ZW1fdmVuZG9yOworCXUxNiBzdWJzeXN0ZW1fZGV2aWNlOworfTsKKworLyogR1BJTyBkZWZpbml0aW9ucyAqLworCisvKiBUaGUgbWFzayBpcyB0aGUgc2V0IG9mIGJpdHMgdXNlZCBieSB0aGUgb3BlcmF0aW9uICovCisKK3N0cnVjdCBpdnR2X2dwaW9faW5pdCB7IAkvKiBzZXQgaW5pdGlhbCBHUElPIERJUiBhbmQgT1VUIHZhbHVlcyAqLworCXUxNiBkaXJlY3Rpb247IAkJLyogRElSIHNldHRpbmcuIExlYXZlIHRvIDAgaWYgbm8gaW5pdCBpcyBuZWVkZWQgKi8KKwl1MTYgaW5pdGlhbF92YWx1ZTsKK307CisKK3N0cnVjdCBpdnR2X2dwaW9fdmlkZW9faW5wdXQgeyAJLyogc2VsZWN0IHR1bmVyL2xpbmUgaW4gaW5wdXQgKi8KKwl1MTYgbWFzazsgCQkvKiBsZWF2ZSB0byAwIGlmIG5vdCBzdXBwb3J0ZWQgKi8KKwl1MTYgdHVuZXI7CisJdTE2IGNvbXBvc2l0ZTsKKwl1MTYgc3ZpZGVvOworfTsKKworc3RydWN0IGl2dHZfZ3Bpb19hdWRpb19pbnB1dCB7IAkvKiBzZWxlY3QgdHVuZXIvbGluZSBpbiBpbnB1dCAqLworCXUxNiBtYXNrOyAJCS8qIGxlYXZlIHRvIDAgaWYgbm90IHN1cHBvcnRlZCAqLworCXUxNiB0dW5lcjsKKwl1MTYgbGluZWluOworCXUxNiByYWRpbzsKK307CisKK3N0cnVjdCBpdnR2X2dwaW9fYXVkaW9fbXV0ZSB7CisJdTE2IG1hc2s7IAkJLyogbGVhdmUgdG8gMCBpZiBub3Qgc3VwcG9ydGVkICovCisJdTE2IG11dGU7CQkvKiBzZXQgdGhpcyB2YWx1ZSB0byBtdXRlLCAwIHRvIHVubXV0ZSAqLworfTsKKworc3RydWN0IGl2dHZfZ3Bpb19hdWRpb19tb2RlIHsKKwl1MTYgbWFzazsgCQkvKiBsZWF2ZSB0byAwIGlmIG5vdCBzdXBwb3J0ZWQgKi8KKwl1MTYgbW9ubzsgCQkvKiBzZXQgYXVkaW8gdG8gbW9ubyAqLworCXUxNiBzdGVyZW87IAkJLyogc2V0IGF1ZGlvIHRvIHN0ZXJlbyAqLworCXUxNiBsYW5nMTsJCS8qIHNldCBhdWRpbyB0byB0aGUgZmlyc3QgbGFuZ3VhZ2UgKi8KKwl1MTYgbGFuZzI7CQkvKiBzZXQgYXVkaW8gdG8gdGhlIHNlY29uZCBsYW5ndWFnZSAqLworCXUxNiBib3RoOyAJCS8qIGJvdGggbGFuZ3VhZ2VzIGFyZSBvdXRwdXQgKi8KK307CisKK3N0cnVjdCBpdnR2X2dwaW9fYXVkaW9fZnJlcSB7CisJdTE2IG1hc2s7IAkJLyogbGVhdmUgdG8gMCBpZiBub3Qgc3VwcG9ydGVkICovCisJdTE2IGYzMjAwMDsKKwl1MTYgZjQ0MTAwOworCXUxNiBmNDgwMDA7Cit9OworCitzdHJ1Y3QgaXZ0dl9ncGlvX2F1ZGlvX2RldGVjdCB7CisJdTE2IG1hc2s7IAkJLyogbGVhdmUgdG8gMCBpZiBub3Qgc3VwcG9ydGVkICovCisJdTE2IHN0ZXJlbzsgCQkvKiBpZiB0aGUgaW5wdXQgbWF0Y2hlcyB0aGlzIHZhbHVlIHRoZW4KKwkJCQkgICBzdGVyZW8gaXMgZGV0ZWN0ZWQgKi8KK307CisKK3N0cnVjdCBpdnR2X2NhcmRfdHVuZXIgeworCXY0bDJfc3RkX2lkIHN0ZDsgCS8qIHN0YW5kYXJkIGZvciB3aGljaCB0aGUgdHVuZXIgaXMgc3VpdGFibGUgKi8KKwlpbnQgCSAgICB0dW5lcjsgCS8qIHR1bmVyIElEIChmcm9tIHR1bmVyLmgpICovCit9OworCisvKiBmb3IgY2FyZCBpbmZvcm1hdGlvbi9wYXJhbWV0ZXJzICovCitzdHJ1Y3QgaXZ0dl9jYXJkIHsKKwlpbnQgdHlwZTsKKwljaGFyICpuYW1lOworCXUzMiB2NGwyX2NhcGFiaWxpdGllczsKKwl1MzIgaHdfdmlkZW87CQkvKiBoYXJkd2FyZSB1c2VkIHRvIHByb2Nlc3MgdmlkZW8gKi8KKwl1MzIgaHdfYXVkaW87CQkvKiBoYXJkd2FyZSB1c2VkIHRvIHByb2Nlc3MgYXVkaW8gKi8KKwl1MzIgaHdfYXVkaW9fY3RybDsJLyogaGFyZHdhcmUgdXNlZCBmb3IgdGhlIFY0TDIgY29udHJvbHMgKG9ubHkgMSBkZXYgYWxsb3dlZCkgKi8KKwl1MzIgaHdfbXV4ZXI7CQkvKiBoYXJkd2FyZSB1c2VkIHRvIG11bHRpcGxleCBhdWRpbyBpbnB1dCAqLworCXUzMiBod19hbGw7CQkvKiBhbGwgaGFyZHdhcmUgdXNlZCBieSB0aGUgYm9hcmQgKi8KKwlzdHJ1Y3QgaXZ0dl9jYXJkX3ZpZGVvX2lucHV0IHZpZGVvX2lucHV0c1tJVlRWX0NBUkRfTUFYX1ZJREVPX0lOUFVUU107CisJc3RydWN0IGl2dHZfY2FyZF9hdWRpb19pbnB1dCBhdWRpb19pbnB1dHNbSVZUVl9DQVJEX01BWF9BVURJT19JTlBVVFNdOworCXN0cnVjdCBpdnR2X2NhcmRfYXVkaW9faW5wdXQgcmFkaW9faW5wdXQ7CisJaW50IG5vZl9vdXRwdXRzOworCWNvbnN0IHN0cnVjdCBpdnR2X2NhcmRfb3V0cHV0ICp2aWRlb19vdXRwdXRzOworCXU4IGdyX2NvbmZpZzsgCQkvKiBjb25maWcgYnl0ZSBmb3IgdGhlIGdob3N0IHJlZHVjdGlvbiBkZXZpY2UgKi8KKworCS8qIEdQSU8gY2FyZC1zcGVjaWZpYyBzZXR0aW5ncyAqLworCXN0cnVjdCBpdnR2X2dwaW9faW5pdCAJCWdwaW9faW5pdDsKKwlzdHJ1Y3QgaXZ0dl9ncGlvX3ZpZGVvX2lucHV0CWdwaW9fdmlkZW9faW5wdXQ7CisJc3RydWN0IGl2dHZfZ3Bpb19hdWRpb19pbnB1dCAJZ3Bpb19hdWRpb19pbnB1dDsKKwlzdHJ1Y3QgaXZ0dl9ncGlvX2F1ZGlvX211dGUgCWdwaW9fYXVkaW9fbXV0ZTsKKwlzdHJ1Y3QgaXZ0dl9ncGlvX2F1ZGlvX21vZGUgCWdwaW9fYXVkaW9fbW9kZTsKKwlzdHJ1Y3QgaXZ0dl9ncGlvX2F1ZGlvX2ZyZXEgCWdwaW9fYXVkaW9fZnJlcTsKKwlzdHJ1Y3QgaXZ0dl9ncGlvX2F1ZGlvX2RldGVjdCAJZ3Bpb19hdWRpb19kZXRlY3Q7CisKKwlzdHJ1Y3QgaXZ0dl9jYXJkX3R1bmVyIHR1bmVyc1tJVlRWX0NBUkRfTUFYX1RVTkVSU107CisKKwkvKiBsaXN0IG9mIGRldmljZSBhbmQgc3Vic3lzdGVtIHZlbmRvci9kZXZpY2VzIHRoYXQKKwkgICBjb3JyZXNwb25kIHRvIHRoaXMgY2FyZCB0eXBlLiAqLworCWNvbnN0IHN0cnVjdCBpdnR2X2NhcmRfcGNpX2luZm8gKnBjaV9saXN0OworfTsKKworaW50IGl2dHZfZ2V0X2lucHV0KHN0cnVjdCBpdnR2ICppdHYsIHUxNiBpbmRleCwgc3RydWN0IHY0bDJfaW5wdXQgKmlucHV0KTsKK2ludCBpdnR2X2dldF9vdXRwdXQoc3RydWN0IGl2dHYgKml0diwgdTE2IGluZGV4LCBzdHJ1Y3QgdjRsMl9vdXRwdXQgKm91dHB1dCk7CitpbnQgaXZ0dl9nZXRfYXVkaW9faW5wdXQoc3RydWN0IGl2dHYgKml0diwgdTE2IGluZGV4LCBzdHJ1Y3QgdjRsMl9hdWRpbyAqaW5wdXQpOworaW50IGl2dHZfZ2V0X2F1ZGlvX291dHB1dChzdHJ1Y3QgaXZ0diAqaXR2LCB1MTYgaW5kZXgsIHN0cnVjdCB2NGwyX2F1ZGlvb3V0ICpvdXRwdXQpOworY29uc3Qgc3RydWN0IGl2dHZfY2FyZCAqaXZ0dl9nZXRfY2FyZCh1MTYgaW5kZXgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtY29udHJvbHMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWNvbnRyb2xzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E4NzZjMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWNvbnRyb2xzLmMKQEAgLTAsMCArMSwzMDMgQEAKKy8qCisgICAgaW9jdGwgY29udHJvbCBmdW5jdGlvbnMKKyAgICBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNCAgS2V2aW4gVGhheWVyIDxudWZhbl93ZmsgYXQgeWFob28uY29tPgorICAgIENvcHlyaWdodCAoQykgMjAwNS0yMDA3ICBIYW5zIFZlcmt1aWwgPGh2ZXJrdWlsQHhzNGFsbC5ubD4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSAiaXZ0di1kcml2ZXIuaCIKKyNpbmNsdWRlICJpdnR2LWNhcmRzLmgiCisjaW5jbHVkZSAiaXZ0di1pb2N0bC5oIgorI2luY2x1ZGUgIml2dHYtYXVkaW8uaCIKKyNpbmNsdWRlICJpdnR2LWkyYy5oIgorI2luY2x1ZGUgIml2dHYtbWFpbGJveC5oIgorI2luY2x1ZGUgIml2dHYtY29udHJvbHMuaCIKKworc3RhdGljIGNvbnN0IHUzMiB1c2VyX2N0cmxzW10gPSB7CisJVjRMMl9DSURfVVNFUl9DTEFTUywKKwlWNEwyX0NJRF9CUklHSFRORVNTLAorCVY0TDJfQ0lEX0NPTlRSQVNULAorCVY0TDJfQ0lEX1NBVFVSQVRJT04sCisJVjRMMl9DSURfSFVFLAorCVY0TDJfQ0lEX0FVRElPX1ZPTFVNRSwKKwlWNEwyX0NJRF9BVURJT19CQUxBTkNFLAorCVY0TDJfQ0lEX0FVRElPX0JBU1MsCisJVjRMMl9DSURfQVVESU9fVFJFQkxFLAorCVY0TDJfQ0lEX0FVRElPX01VVEUsCisJVjRMMl9DSURfQVVESU9fTE9VRE5FU1MsCisJMAorfTsKKworc3RhdGljIGNvbnN0IHUzMiAqY3RybF9jbGFzc2VzW10gPSB7CisJdXNlcl9jdHJscywKKwljeDIzNDF4X21wZWdfY3RybHMsCisJTlVMTAorfTsKKworc3RhdGljIGludCBpdnR2X3F1ZXJ5Y3RybChzdHJ1Y3QgaXZ0diAqaXR2LCBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKnFjdHJsKQoreworCWNvbnN0IGNoYXIgKm5hbWU7CisKKwlJVlRWX0RFQlVHX0lPQ1RMKCJWSURJT0NfUVVFUllDVFJMKCUwOHgpXG4iLCBxY3RybC0+aWQpOworCisJcWN0cmwtPmlkID0gdjRsMl9jdHJsX25leHQoY3RybF9jbGFzc2VzLCBxY3RybC0+aWQpOworCWlmIChxY3RybC0+aWQgPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzd2l0Y2ggKHFjdHJsLT5pZCkgeworCS8qIFN0YW5kYXJkIFY0TDIgY29udHJvbHMgKi8KKwljYXNlIFY0TDJfQ0lEX0JSSUdIVE5FU1M6CisJY2FzZSBWNEwyX0NJRF9IVUU6CisJY2FzZSBWNEwyX0NJRF9TQVRVUkFUSU9OOgorCWNhc2UgVjRMMl9DSURfQ09OVFJBU1Q6CisJCWlmIChpdHYtPnZpZGVvX2RlY19mdW5jKGl0diwgVklESU9DX1FVRVJZQ1RSTCwgcWN0cmwpKQorCQkJcWN0cmwtPmZsYWdzIHw9IFY0TDJfQ1RSTF9GTEFHX0RJU0FCTEVEOworCQlyZXR1cm4gMDsKKworCWNhc2UgVjRMMl9DSURfQVVESU9fVk9MVU1FOgorCWNhc2UgVjRMMl9DSURfQVVESU9fTVVURToKKwljYXNlIFY0TDJfQ0lEX0FVRElPX0JBTEFOQ0U6CisJY2FzZSBWNEwyX0NJRF9BVURJT19CQVNTOgorCWNhc2UgVjRMMl9DSURfQVVESU9fVFJFQkxFOgorCWNhc2UgVjRMMl9DSURfQVVESU9fTE9VRE5FU1M6CisJCWlmIChpdnR2X2kyY19odyhpdHYsIGl0di0+Y2FyZC0+aHdfYXVkaW9fY3RybCwgVklESU9DX1FVRVJZQ1RSTCwgcWN0cmwpKQorCQkJcWN0cmwtPmZsYWdzIHw9IFY0TDJfQ1RSTF9GTEFHX0RJU0FCTEVEOworCQlyZXR1cm4gMDsKKworCWRlZmF1bHQ6CisJCWlmIChjeDIzNDF4X2N0cmxfcXVlcnkoJml0di0+cGFyYW1zLCBxY3RybCkpCisJCQlxY3RybC0+ZmxhZ3MgfD0gVjRMMl9DVFJMX0ZMQUdfRElTQUJMRUQ7CisJCXJldHVybiAwOworCX0KKwlzdHJuY3B5KHFjdHJsLT5uYW1lLCBuYW1lLCBzaXplb2YocWN0cmwtPm5hbWUpIC0gMSk7CisJcWN0cmwtPm5hbWVbc2l6ZW9mKHFjdHJsLT5uYW1lKSAtIDFdID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpdnR2X3F1ZXJ5bWVudShzdHJ1Y3QgaXZ0diAqaXR2LCBzdHJ1Y3QgdjRsMl9xdWVyeW1lbnUgKnFtZW51KQoreworCXN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCBxY3RybDsKKworCXFjdHJsLmlkID0gcW1lbnUtPmlkOworCWl2dHZfcXVlcnljdHJsKGl0diwgJnFjdHJsKTsKKwlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X21lbnUocW1lbnUsICZxY3RybCwgY3gyMzQxeF9jdHJsX2dldF9tZW51KHFtZW51LT5pZCkpOworfQorCitzdGF0aWMgaW50IGl2dHZfc19jdHJsKHN0cnVjdCBpdnR2ICppdHYsIHN0cnVjdCB2NGwyX2NvbnRyb2wgKnZjdHJsKQoreworCXMzMiB2ID0gdmN0cmwtPnZhbHVlOworCisJSVZUVl9ERUJVR19JT0NUTCgiVklESU9DX1NfQ1RSTCglMDh4LCAleClcbiIsIHZjdHJsLT5pZCwgdik7CisKKwlzd2l0Y2ggKHZjdHJsLT5pZCkgeworCQkvKiBTdGFuZGFyZCBWNEwyIGNvbnRyb2xzICovCisJY2FzZSBWNEwyX0NJRF9CUklHSFRORVNTOgorCWNhc2UgVjRMMl9DSURfSFVFOgorCWNhc2UgVjRMMl9DSURfU0FUVVJBVElPTjoKKwljYXNlIFY0TDJfQ0lEX0NPTlRSQVNUOgorCQlyZXR1cm4gaXR2LT52aWRlb19kZWNfZnVuYyhpdHYsIFZJRElPQ19TX0NUUkwsIHZjdHJsKTsKKworCWNhc2UgVjRMMl9DSURfQVVESU9fVk9MVU1FOgorCWNhc2UgVjRMMl9DSURfQVVESU9fTVVURToKKwljYXNlIFY0TDJfQ0lEX0FVRElPX0JBTEFOQ0U6CisJY2FzZSBWNEwyX0NJRF9BVURJT19CQVNTOgorCWNhc2UgVjRMMl9DSURfQVVESU9fVFJFQkxFOgorCWNhc2UgVjRMMl9DSURfQVVESU9fTE9VRE5FU1M6CisJCXJldHVybiBpdnR2X2kyY19odyhpdHYsIGl0di0+Y2FyZC0+aHdfYXVkaW9fY3RybCwgVklESU9DX1NfQ1RSTCwgdmN0cmwpOworCisJZGVmYXVsdDoKKwkJSVZUVl9ERUJVR19JT0NUTCgiaW52YWxpZCBjb250cm9sICV4XG4iLCB2Y3RybC0+aWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXZ0dl9nX2N0cmwoc3RydWN0IGl2dHYgKml0diwgc3RydWN0IHY0bDJfY29udHJvbCAqdmN0cmwpCit7CisJSVZUVl9ERUJVR19JT0NUTCgiVklESU9DX0dfQ1RSTCglMDh4KVxuIiwgdmN0cmwtPmlkKTsKKworCXN3aXRjaCAodmN0cmwtPmlkKSB7CisJCS8qIFN0YW5kYXJkIFY0TDIgY29udHJvbHMgKi8KKwljYXNlIFY0TDJfQ0lEX0JSSUdIVE5FU1M6CisJY2FzZSBWNEwyX0NJRF9IVUU6CisJY2FzZSBWNEwyX0NJRF9TQVRVUkFUSU9OOgorCWNhc2UgVjRMMl9DSURfQ09OVFJBU1Q6CisJCXJldHVybiBpdHYtPnZpZGVvX2RlY19mdW5jKGl0diwgVklESU9DX0dfQ1RSTCwgdmN0cmwpOworCisJY2FzZSBWNEwyX0NJRF9BVURJT19WT0xVTUU6CisJY2FzZSBWNEwyX0NJRF9BVURJT19NVVRFOgorCWNhc2UgVjRMMl9DSURfQVVESU9fQkFMQU5DRToKKwljYXNlIFY0TDJfQ0lEX0FVRElPX0JBU1M6CisJY2FzZSBWNEwyX0NJRF9BVURJT19UUkVCTEU6CisJY2FzZSBWNEwyX0NJRF9BVURJT19MT1VETkVTUzoKKwkJcmV0dXJuIGl2dHZfaTJjX2h3KGl0diwgaXR2LT5jYXJkLT5od19hdWRpb19jdHJsLCBWSURJT0NfR19DVFJMLCB2Y3RybCk7CisJZGVmYXVsdDoKKwkJSVZUVl9ERUJVR19JT0NUTCgiaW52YWxpZCBjb250cm9sICV4XG4iLCB2Y3RybC0+aWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXZ0dl9zZXR1cF92YmlfZm10KHN0cnVjdCBpdnR2ICppdHYsIGVudW0gdjRsMl9tcGVnX3N0cmVhbV92YmlfZm10IGZtdCkKK3sKKwlpZiAoIShpdHYtPnY0bDJfY2FwICYgVjRMMl9DQVBfU0xJQ0VEX1ZCSV9DQVBUVVJFKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGF0b21pY19yZWFkKCZpdHYtPmNhcHR1cmluZykgPiAwKQorCQlyZXR1cm4gLUVCVVNZOworCisJLyogRmlyc3QgdHJ5IHRvIGFsbG9jYXRlIHNsaWNlZCBWQkkgYnVmZmVycyBpZiBuZWVkZWQuICovCisJaWYgKGZtdCAmJiBpdHYtPnZiaS5zbGljZWRfbXBlZ19kYXRhWzBdID09IE5VTEwpIHsKKwkJaW50IGk7CisKKwkJZm9yIChpID0gMDsgaSA8IElWVFZfVkJJX0ZSQU1FUzsgaSsrKSB7CisJCQkvKiBZdWNrLCBoYXJkY29kZWQuIE5lZWRzIHRvIGJlIGEgZGVmaW5lICovCisJCQlpdHYtPnZiaS5zbGljZWRfbXBlZ19kYXRhW2ldID0ga21hbGxvYygyMDQ5LCBHRlBfS0VSTkVMKTsKKwkJCWlmIChpdHYtPnZiaS5zbGljZWRfbXBlZ19kYXRhW2ldID09IE5VTEwpIHsKKwkJCQl3aGlsZSAoLS1pID49IDApIHsKKwkJCQkJa2ZyZWUoaXR2LT52Ymkuc2xpY2VkX21wZWdfZGF0YVtpXSk7CisJCQkJCWl0di0+dmJpLnNsaWNlZF9tcGVnX2RhdGFbaV0gPSBOVUxMOworCQkJCX0KKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCX0KKwkJfQorCX0KKworCWl0di0+dmJpLmluc2VydF9tcGVnID0gZm10OworCisJaWYgKGl0di0+dmJpLmluc2VydF9tcGVnID09IDApIHsKKwkJcmV0dXJuIDA7CisJfQorCS8qIE5lZWQgc2xpY2VkIGRhdGEgZm9yIG1wZWcgaW5zZXJ0aW9uICovCisJaWYgKGdldF9zZXJ2aWNlX3NldChpdHYtPnZiaS5zbGljZWRfaW4pID09IDApIHsKKwkJaWYgKGl0di0+aXNfNjBoeikKKwkJCWl0di0+dmJpLnNsaWNlZF9pbi0+c2VydmljZV9zZXQgPSBWNEwyX1NMSUNFRF9DQVBUSU9OXzUyNTsKKwkJZWxzZQorCQkJaXR2LT52Ymkuc2xpY2VkX2luLT5zZXJ2aWNlX3NldCA9IFY0TDJfU0xJQ0VEX1dTU182MjU7CisJCWV4cGFuZF9zZXJ2aWNlX3NldChpdHYtPnZiaS5zbGljZWRfaW4sIGl0di0+aXNfNTBoeik7CisJfQorCXJldHVybiAwOworfQorCitpbnQgaXZ0dl9jb250cm9sX2lvY3RscyhzdHJ1Y3QgaXZ0diAqaXR2LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCit7CisJc3RydWN0IHY0bDJfY29udHJvbCBjdHJsOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFZJRElPQ19RVUVSWU1FTlU6CisJCUlWVFZfREVCVUdfSU9DVEwoIlZJRElPQ19RVUVSWU1FTlVcbiIpOworCQlyZXR1cm4gaXZ0dl9xdWVyeW1lbnUoaXR2LCBhcmcpOworCisJY2FzZSBWSURJT0NfUVVFUllDVFJMOgorCQlyZXR1cm4gaXZ0dl9xdWVyeWN0cmwoaXR2LCBhcmcpOworCisJY2FzZSBWSURJT0NfU19DVFJMOgorCQlyZXR1cm4gaXZ0dl9zX2N0cmwoaXR2LCBhcmcpOworCisJY2FzZSBWSURJT0NfR19DVFJMOgorCQlyZXR1cm4gaXZ0dl9nX2N0cmwoaXR2LCBhcmcpOworCisJY2FzZSBWSURJT0NfU19FWFRfQ1RSTFM6CisJeworCQlzdHJ1Y3QgdjRsMl9leHRfY29udHJvbHMgKmMgPSBhcmc7CisKKwkJaWYgKGMtPmN0cmxfY2xhc3MgPT0gVjRMMl9DVFJMX0NMQVNTX1VTRVIpIHsKKwkJCWludCBpOworCQkJaW50IGVyciA9IDA7CisKKwkJCWZvciAoaSA9IDA7IGkgPCBjLT5jb3VudDsgaSsrKSB7CisJCQkJY3RybC5pZCA9IGMtPmNvbnRyb2xzW2ldLmlkOworCQkJCWN0cmwudmFsdWUgPSBjLT5jb250cm9sc1tpXS52YWx1ZTsKKwkJCQllcnIgPSBpdnR2X3NfY3RybChpdHYsICZjdHJsKTsKKwkJCQljLT5jb250cm9sc1tpXS52YWx1ZSA9IGN0cmwudmFsdWU7CisJCQkJaWYgKGVycikgeworCQkJCQljLT5lcnJvcl9pZHggPSBpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gZXJyOworCQl9CisJCUlWVFZfREVCVUdfSU9DVEwoIlZJRElPQ19TX0VYVF9DVFJMU1xuIik7CisJCWlmIChjLT5jdHJsX2NsYXNzID09IFY0TDJfQ1RSTF9DTEFTU19NUEVHKSB7CisJCQlzdHJ1Y3QgY3gyMzQxeF9tcGVnX3BhcmFtcyBwID0gaXR2LT5wYXJhbXM7CisJCQlpbnQgZXJyID0gY3gyMzQxeF9leHRfY3RybHMoJnAsIGFyZywgY21kKTsKKworCQkJaWYgKGVycikKKwkJCQlyZXR1cm4gZXJyOworCisJCQlpZiAocC52aWRlb19lbmNvZGluZyAhPSBpdHYtPnBhcmFtcy52aWRlb19lbmNvZGluZykgeworCQkJCWludCBpc19tcGVnMSA9IHAudmlkZW9fZW5jb2RpbmcgPT0KKwkJCQkJCVY0TDJfTVBFR19WSURFT19FTkNPRElOR19NUEVHXzE7CisJCQkJc3RydWN0IHY0bDJfZm9ybWF0IGZtdDsKKworCQkJCS8qIGZpeCB2aWRlb2RlY29kZXIgcmVzb2x1dGlvbiAqLworCQkJCWZtdC50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOworCQkJCWZtdC5mbXQucGl4LndpZHRoID0gaXR2LT5wYXJhbXMud2lkdGggLyAoaXNfbXBlZzEgPyAyIDogMSk7CisJCQkJZm10LmZtdC5waXguaGVpZ2h0ID0gaXR2LT5wYXJhbXMuaGVpZ2h0OworCQkJCWl0di0+dmlkZW9fZGVjX2Z1bmMoaXR2LCBWSURJT0NfU19GTVQsICZmbXQpOworCQkJfQorCQkJZXJyID0gY3gyMzQxeF91cGRhdGUoaXR2LCBpdnR2X2FwaV9mdW5jLCAmaXR2LT5wYXJhbXMsICZwKTsKKwkJCWlmICghZXJyICYmIGl0di0+cGFyYW1zLnN0cmVhbV92YmlfZm10ICE9IHAuc3RyZWFtX3ZiaV9mbXQpIHsKKwkJCQllcnIgPSBpdnR2X3NldHVwX3ZiaV9mbXQoaXR2LCBwLnN0cmVhbV92YmlfZm10KTsKKwkJCX0KKwkJCWl0di0+cGFyYW1zID0gcDsKKwkJCWl0di0+ZHVhbHdhdGNoX3N0ZXJlb19tb2RlID0gcC5hdWRpb19wcm9wZXJ0aWVzICYgMHgwMzAwOworCQkJaXZ0dl9hdWRpb19zZXRfYXVkaW9fY2xvY2tfZnJlcShpdHYsIHAuYXVkaW9fcHJvcGVydGllcyAmIDB4MDMpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwljYXNlIFZJRElPQ19HX0VYVF9DVFJMUzoKKwl7CisJCXN0cnVjdCB2NGwyX2V4dF9jb250cm9scyAqYyA9IGFyZzsKKworCQlpZiAoYy0+Y3RybF9jbGFzcyA9PSBWNEwyX0NUUkxfQ0xBU1NfVVNFUikgeworCQkJaW50IGk7CisJCQlpbnQgZXJyID0gMDsKKworCQkJZm9yIChpID0gMDsgaSA8IGMtPmNvdW50OyBpKyspIHsKKwkJCQljdHJsLmlkID0gYy0+Y29udHJvbHNbaV0uaWQ7CisJCQkJY3RybC52YWx1ZSA9IGMtPmNvbnRyb2xzW2ldLnZhbHVlOworCQkJCWVyciA9IGl2dHZfZ19jdHJsKGl0diwgJmN0cmwpOworCQkJCWMtPmNvbnRyb2xzW2ldLnZhbHVlID0gY3RybC52YWx1ZTsKKwkJCQlpZiAoZXJyKSB7CisJCQkJCWMtPmVycm9yX2lkeCA9IGk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCXJldHVybiBlcnI7CisJCX0KKwkJSVZUVl9ERUJVR19JT0NUTCgiVklESU9DX0dfRVhUX0NUUkxTXG4iKTsKKwkJaWYgKGMtPmN0cmxfY2xhc3MgPT0gVjRMMl9DVFJMX0NMQVNTX01QRUcpCisJCQlyZXR1cm4gY3gyMzQxeF9leHRfY3RybHMoJml0di0+cGFyYW1zLCBhcmcsIGNtZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWNhc2UgVklESU9DX1RSWV9FWFRfQ1RSTFM6CisJeworCQlzdHJ1Y3QgdjRsMl9leHRfY29udHJvbHMgKmMgPSBhcmc7CisKKwkJSVZUVl9ERUJVR19JT0NUTCgiVklESU9DX1RSWV9FWFRfQ1RSTFNcbiIpOworCQlpZiAoYy0+Y3RybF9jbGFzcyA9PSBWNEwyX0NUUkxfQ0xBU1NfTVBFRykKKwkJCXJldHVybiBjeDIzNDF4X2V4dF9jdHJscygmaXR2LT5wYXJhbXMsIGFyZywgY21kKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtY29udHJvbHMuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWNvbnRyb2xzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWExMTE0OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWNvbnRyb2xzLmgKQEAgLTAsMCArMSwyMSBAQAorLyoKKyAgICBpb2N0bCBjb250cm9sIGZ1bmN0aW9ucworICAgIENvcHlyaWdodCAoQykgMjAwMy0yMDA0ICBLZXZpbiBUaGF5ZXIgPG51ZmFuX3dmayBhdCB5YWhvby5jb20+CisgICAgQ29weXJpZ2h0IChDKSAyMDA1LTIwMDcgIEhhbnMgVmVya3VpbCA8aHZlcmt1aWxAeHM0YWxsLm5sPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKK2ludCBpdnR2X2NvbnRyb2xfaW9jdGxzKHN0cnVjdCBpdnR2ICppdHYsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1kcml2ZXIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWRyaXZlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1YjkzMjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1kcml2ZXIuYwpAQCAtMCwwICsxLDEzNzQgQEAKKy8qCisgICAgaXZ0diBkcml2ZXIgaW5pdGlhbGl6YXRpb24gYW5kIGNhcmQgcHJvYmluZworICAgIENvcHlyaWdodCAoQykgMjAwMy0yMDA0ICBLZXZpbiBUaGF5ZXIgPG51ZmFuX3dmayBhdCB5YWhvby5jb20+CisgICAgQ29weXJpZ2h0IChDKSAyMDA0ICBDaHJpcyBLZW5uZWR5IDxjQGdyb292eS5vcmc+CisgICAgQ29weXJpZ2h0IChDKSAyMDA1LTIwMDcgIEhhbnMgVmVya3VpbCA8aHZlcmt1aWxAeHM0YWxsLm5sPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKy8qIE1haW4gRHJpdmVyIGZpbGUgZm9yIHRoZSBpdnR2IHByb2plY3Q6CisgKiBEcml2ZXIgZm9yIHRoZSBDb25leGFudCBDWDIzNDE1L0NYMjM0MTYgY2hpcC4KKyAqIEF1dGhvcjogS2V2aW4gVGhheWVyIChudWZhbl93ZmsgYXQgeWFob28uY29tKQorICogTGljZW5zZTogR1BMCisgKiBodHRwOi8vd3d3Lml2dHZkcml2ZXIub3JnCisgKgorICogLS0tLS0KKyAqIE1QRzYwMC9NUEcxNjAgc3VwcG9ydCBieSAgVC5BZGFjaGkgPHRhZGFjaGlAdGFkYWNoaS1uZXQuY29tPgorICogICAgICAgICAgICAgICAgICAgICAgYW5kIFRha2VydSBLT01PUklZQTxrb21vcml5YUBwYWtlbi5vcmc+CisgKgorICogQVZlck1lZGlhIE0xNzkgR1BJTyBpbmZvIGJ5IENocmlzIFBpbmtoYW0gPGNwaW5raGFtQGJjMnZhLm9yZz4KKyAqICAgICAgICAgICAgICAgIHVzaW5nIGluZm9ybWF0aW9uIHByb3ZpZGVkIGJ5IEppdW4tS3VlaSBKdW5nIEAgQVZlck1lZGlhLgorICoKKyAqIEt1cm91dG8gU2lrb3UgQ1gyMzQxNkdZQy1TVFZMUCB0ZXN0ZWQgYnkgSy5PaHRhIDxhbHBoYTI5MkBicmVtZW4ub3IuanA+CisgKiAgICAgICAgICAgICAgICB1c2luZyBpbmZvcm1hdGlvbiBmcm9tIFQuQWRhY2hpLFRha2VydSBLT01PUklZQSBhbmQgb3RoZXJzIDotKQorICoKKyAqIE5hZ2FzZSBUUkFOU0dFQVIgNTAwMFRWLCBBb3BlbiBWQTIwMDBNQVgtU1RONiBhbmQgSS9PIGRhdGEgR1YtTVZQL1JYCisgKiAgICAgICAgICAgICAgICB2ZXJzaW9uIGJ5IFQuQWRhY2hpLiBTcGVjaWFsIHRoYW5rcyAgTXIuU3V6dWtpCisgKi8KKworI2luY2x1ZGUgIml2dHYtZHJpdmVyLmgiCisjaW5jbHVkZSAiaXZ0di12ZXJzaW9uLmgiCisjaW5jbHVkZSAiaXZ0di1maWxlb3BzLmgiCisjaW5jbHVkZSAiaXZ0di1pMmMuaCIKKyNpbmNsdWRlICJpdnR2LWZpcm13YXJlLmgiCisjaW5jbHVkZSAiaXZ0di1xdWV1ZS5oIgorI2luY2x1ZGUgIml2dHYtdWRtYS5oIgorI2luY2x1ZGUgIml2dHYtaXJxLmgiCisjaW5jbHVkZSAiaXZ0di1tYWlsYm94LmgiCisjaW5jbHVkZSAiaXZ0di1zdHJlYW1zLmgiCisjaW5jbHVkZSAiaXZ0di1pb2N0bC5oIgorI2luY2x1ZGUgIml2dHYtY2FyZHMuaCIKKyNpbmNsdWRlICJpdnR2LXZiaS5oIgorI2luY2x1ZGUgIml2dHYtYXVkaW8uaCIKKyNpbmNsdWRlICJpdnR2LWdwaW8uaCIKKyNpbmNsdWRlICJpdnR2LXl1di5oIgorCisjaW5jbHVkZSA8bGludXgvdmVybWFnaWMuaD4KKyNpbmNsdWRlIDxtZWRpYS90dmVlcHJvbS5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY2hpcC1pZGVudC5oPgorCisvKiB2YXIgdG8ga2VlcCB0cmFjayBvZiB0aGUgbnVtYmVyIG9mIGFycmF5IGVsZW1lbnRzIGluIHVzZSAqLworaW50IGl2dHZfY2FyZHNfYWN0aXZlID0gMDsKKworLyogSWYgeW91IGhhdmUgYWxyZWFkeSBYIHY0bCBjYXJkcywgdGhlbiBzZXQgdGhpcyB0byBYLiBUaGlzIHdheQorICAgdGhlIGRldmljZSBudW1iZXJzIHN0YXkgbWF0Y2hlZC4gRXhhbXBsZTogeW91IGhhdmUgYSBXaW5UViBjYXJkCisgICB3aXRob3V0IHJhZGlvIGFuZCBhIFBWUi0zNTAgd2l0aC4gTm9ybWFsbHkgdGhpcyB3b3VsZCBnaXZlIGEKKyAgIHZpZGVvMSBkZXZpY2UgdG9nZXRoZXIgd2l0aCBhIHJhZGlvMCBkZXZpY2UgZm9yIHRoZSBQVlIuIEJ5CisgICBzZXR0aW5nIHRoaXMgdG8gMSB5b3UgZW5zdXJlIHRoYXQgcmFkaW8wIGlzIG5vdyBhbHNvIHJhZGlvMS4gKi8KK2ludCBpdnR2X2ZpcnN0X21pbm9yID0gMDsKKworLyogTWFzdGVyIHZhcmlhYmxlIGZvciBhbGwgaXZ0diBpbmZvICovCitzdHJ1Y3QgaXZ0diAqaXZ0dl9jYXJkc1tJVlRWX01BWF9DQVJEU107CisKKy8qIFByb3RlY3RzIGl2dHZfY2FyZHNfYWN0aXZlICovCitzcGlubG9ja190IGl2dHZfY2FyZHNfbG9jayA9IFNQSU5fTE9DS19VTkxPQ0tFRDsKKworLyogYWRkIHlvdXIgcmV2aXNpb24gYW5kIHdoYXRub3QgaGVyZSAqLworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGl2dHZfcGNpX3RibFtdIF9fZGV2aW5pdGRhdGEgPSB7CisJe1BDSV9WRU5ET1JfSURfSUNPTVAsIFBDSV9ERVZJQ0VfSURfSVZUVjE1LAorCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9JQ09NUCwgUENJX0RFVklDRV9JRF9JVlRWMTYsCisJIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXswLH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLGl2dHZfcGNpX3RibCk7CisKK2NvbnN0IHUzMiB5dXZfb2Zmc2V0WzRdID0geworCUlWVFZfWVVWX0JVRkZFUl9PRkZTRVQsCisJSVZUVl9ZVVZfQlVGRkVSX09GRlNFVF8xLAorCUlWVFZfWVVWX0JVRkZFUl9PRkZTRVRfMiwKKwlJVlRWX1lVVl9CVUZGRVJfT0ZGU0VUXzMKK307CisKKy8qIFBhcmFtZXRlciBkZWNsYXJhdGlvbnMgKi8KK3N0YXRpYyBpbnQgY2FyZHR5cGVbSVZUVl9NQVhfQ0FSRFNdOworc3RhdGljIGludCB0dW5lcltJVlRWX01BWF9DQVJEU10gPSB7IC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEgfTsKK3N0YXRpYyBpbnQgcmFkaW9bSVZUVl9NQVhfQ0FSRFNdID0geyAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xIH07CisKK3N0YXRpYyBpbnQgY2FyZHR5cGVfYyA9IDE7CitzdGF0aWMgaW50IHR1bmVyX2MgPSAxOworc3RhdGljIGludCByYWRpb19jID0gMTsKK3N0YXRpYyBjaGFyIHBhbFtdID0gIi0tIjsKK3N0YXRpYyBjaGFyIHNlY2FtW10gPSAiLS0iOworc3RhdGljIGNoYXIgbnRzY1tdID0gIi0iOworCisvKiBCdWZmZXJzICovCitzdGF0aWMgaW50IGVuY19tcGdfYnVmZmVycyA9IElWVFZfREVGQVVMVF9FTkNfTVBHX0JVRkZFUlM7CitzdGF0aWMgaW50IGVuY195dXZfYnVmZmVycyA9IElWVFZfREVGQVVMVF9FTkNfWVVWX0JVRkZFUlM7CitzdGF0aWMgaW50IGVuY192YmlfYnVmZmVycyA9IElWVFZfREVGQVVMVF9FTkNfVkJJX0JVRkZFUlM7CitzdGF0aWMgaW50IGVuY19wY21fYnVmZmVycyA9IElWVFZfREVGQVVMVF9FTkNfUENNX0JVRkZFUlM7CitzdGF0aWMgaW50IGRlY19tcGdfYnVmZmVycyA9IElWVFZfREVGQVVMVF9ERUNfTVBHX0JVRkZFUlM7CitzdGF0aWMgaW50IGRlY195dXZfYnVmZmVycyA9IElWVFZfREVGQVVMVF9ERUNfWVVWX0JVRkZFUlM7CitzdGF0aWMgaW50IGRlY192YmlfYnVmZmVycyA9IElWVFZfREVGQVVMVF9ERUNfVkJJX0JVRkZFUlM7CisKK3N0YXRpYyBpbnQgaXZ0dl95dXZfbW9kZSA9IDA7CitzdGF0aWMgaW50IGl2dHZfeXV2X3RocmVzaG9sZD0tMTsKK3N0YXRpYyBpbnQgaXZ0dl9wY2lfbGF0ZW5jeSA9IDE7CisKK2ludCBpdnR2X2RlYnVnID0gMDsKKworc3RhdGljIGludCBuZXdpMmMgPSAtMTsKKworbW9kdWxlX3BhcmFtX2FycmF5KHR1bmVyLCBpbnQsICZ0dW5lcl9jLCAwNjQ0KTsKK21vZHVsZV9wYXJhbV9hcnJheShyYWRpbywgYm9vbCwgJnJhZGlvX2MsIDA2NDQpOworbW9kdWxlX3BhcmFtX2FycmF5KGNhcmR0eXBlLCBpbnQsICZjYXJkdHlwZV9jLCAwNjQ0KTsKK21vZHVsZV9wYXJhbV9zdHJpbmcocGFsLCBwYWwsIHNpemVvZihwYWwpLCAwNjQ0KTsKK21vZHVsZV9wYXJhbV9zdHJpbmcoc2VjYW0sIHNlY2FtLCBzaXplb2Yoc2VjYW0pLCAwNjQ0KTsKK21vZHVsZV9wYXJhbV9zdHJpbmcobnRzYywgbnRzYywgc2l6ZW9mKG50c2MpLCAwNjQ0KTsKK21vZHVsZV9wYXJhbV9uYW1lZChkZWJ1ZyxpdnR2X2RlYnVnLCBpbnQsIDA2NDQpOworbW9kdWxlX3BhcmFtKGl2dHZfcGNpX2xhdGVuY3ksIGludCwgMDY0NCk7Cittb2R1bGVfcGFyYW0oaXZ0dl95dXZfbW9kZSwgaW50LCAwNjQ0KTsKK21vZHVsZV9wYXJhbShpdnR2X3l1dl90aHJlc2hvbGQsIGludCwgMDY0NCk7Cittb2R1bGVfcGFyYW0oaXZ0dl9maXJzdF9taW5vciwgaW50LCAwNjQ0KTsKKworbW9kdWxlX3BhcmFtKGVuY19tcGdfYnVmZmVycywgaW50LCAwNjQ0KTsKK21vZHVsZV9wYXJhbShlbmNfeXV2X2J1ZmZlcnMsIGludCwgMDY0NCk7Cittb2R1bGVfcGFyYW0oZW5jX3ZiaV9idWZmZXJzLCBpbnQsIDA2NDQpOworbW9kdWxlX3BhcmFtKGVuY19wY21fYnVmZmVycywgaW50LCAwNjQ0KTsKK21vZHVsZV9wYXJhbShkZWNfbXBnX2J1ZmZlcnMsIGludCwgMDY0NCk7Cittb2R1bGVfcGFyYW0oZGVjX3l1dl9idWZmZXJzLCBpbnQsIDA2NDQpOworbW9kdWxlX3BhcmFtKGRlY192YmlfYnVmZmVycywgaW50LCAwNjQ0KTsKKworbW9kdWxlX3BhcmFtKG5ld2kyYywgaW50LCAwNjQ0KTsKKworTU9EVUxFX1BBUk1fREVTQyh0dW5lciwgIlR1bmVyIHR5cGUgc2VsZWN0aW9uLFxuIgorCQkJIlx0XHRcdHNlZSB0dW5lci5oIGZvciB2YWx1ZXMiKTsKK01PRFVMRV9QQVJNX0RFU0MocmFkaW8sCisJCSAiRW5hYmxlIG9yIGRpc2FibGUgdGhlIHJhZGlvLiBVc2Ugb25seSBpZiBhdXRvZGV0ZWN0aW9uXG4iCisJCSAiXHRcdFx0ZmFpbHMuIDAgPSBkaXNhYmxlLCAxID0gZW5hYmxlIik7CitNT0RVTEVfUEFSTV9ERVNDKGNhcmR0eXBlLAorCQkgIk9ubHkgdXNlIHRoaXMgb3B0aW9uIGlmIHlvdXIgY2FyZCBpcyBub3QgZGV0ZWN0ZWQgcHJvcGVybHkuXG4iCisJCSAiXHRcdFNwZWNpZnkgY2FyZCB0eXBlOlxuIgorCQkgIlx0XHRcdCAxID0gV2luVFYgUFZSIDI1MFxuIgorCQkgIlx0XHRcdCAyID0gV2luVFYgUFZSIDM1MFxuIgorCQkgIlx0XHRcdCAzID0gV2luVFYgUFZSLTE1MCBvciBQVlItNTAwXG4iCisJCSAiXHRcdFx0IDQgPSBBVmVyTWVkaWEgTTE3OVxuIgorCQkgIlx0XHRcdCA1ID0gWVVBTiBNUEc2MDAvS3Vyb3V0b3NoaWtvdSBpVFZDMTYtU1RWTFBcbiIKKwkJICJcdFx0XHQgNiA9IFlVQU4gTVBHMTYwL0t1cm91dG9zaGlrb3UgaVRWQzE1LVNUVkxQXG4iCisJCSAiXHRcdFx0IDcgPSBZVUFOIFBHNjAwL0RJQU1PTkRNTSBQVlItNTUwIChDWCBGYWxjb24gMilcbiIKKwkJICJcdFx0XHQgOCA9IEFkYXB0ZWMgQVZDLTI0MTBcbiIKKwkJICJcdFx0XHQgOSA9IEFkYXB0ZWMgQVZDLTIwMTBcbiIKKwkJICJcdFx0XHQxMCA9IE5BR0FTRSBUUkFOU0dFQVIgNTAwMFRWXG4iCisJCSAiXHRcdFx0MTEgPSBBT3BlbiBWQTIwMDBNQVgtU1RONlxuIgorCQkgIlx0XHRcdDEyID0gWVVBTiBNUEc2MDBHUi9LdXJvdXRvc2hpa291IENYMjM0MTZHWUMtU1RWTFBcbiIKKwkJICJcdFx0XHQxMyA9IEkvTyBEYXRhIEdWLU1WUC9SWFxuIgorCQkgIlx0XHRcdDE0ID0gSS9PIERhdGEgR1YtTVZQL1JYMkVcbiIKKwkJICJcdFx0XHQxNSA9IEdPVFZJRVcgUENJIERWRFxuIgorCQkgIlx0XHRcdDE2ID0gR09UVklFVyBQQ0kgRFZEMiBEZWx1eGVcbiIKKwkJICJcdFx0XHQxNyA9IFl1YW4gTVBDNjIyXG4iCisJCSAiXHRcdFx0MTggPSBEaWdpdGFsIENvd2JveSBEQ1QtTVRWUDFcbiIKKyNpZmRlZiBIQVZFX1hDMzAyOAorCQkgIlx0XHRcdDE5ID0gWXVhbiBQRzYwMFYyL0dvdFZpZXcgUENJIERWRCBMaXRlL0NsdWIzRCBaQVAtVFYxeDAxXG4iCisjZW5kaWYKKwkJICJcdFx0XHQgMCA9IEF1dG9kZXRlY3QgKGRlZmF1bHQpXG4iCisJCSAiXHRcdFx0LTEgPSBJZ25vcmUgdGhpcyBjYXJkXG5cdFx0Iik7CitNT0RVTEVfUEFSTV9ERVNDKHBhbCwgIlNldCBQQUwgc3RhbmRhcmQ6IEIsIEcsIEgsIEQsIEssIEksIE0sIE4sIE5jLCA2MCIpOworTU9EVUxFX1BBUk1fREVTQyhzZWNhbSwgIlNldCBTRUNBTSBzdGFuZGFyZDogQiwgRywgSCwgRCwgSywgTCwgTEMiKTsKK01PRFVMRV9QQVJNX0RFU0MobnRzYywgIlNldCBOVFNDIHN0YW5kYXJkOiBNLCBKLCBLIik7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLAorCQkgIkRlYnVnIGxldmVsIChiaXRtYXNrKS4gRGVmYXVsdDogZXJyb3JzIG9ubHlcbiIKKwkJICJcdFx0XHQoZGVidWcgPSA1MTEgZ2l2ZXMgZnVsbCBkZWJ1Z2dpbmcpIik7CitNT0RVTEVfUEFSTV9ERVNDKGl2dHZfcGNpX2xhdGVuY3ksCisJCSAiQ2hhbmdlIHRoZSBQQ0kgbGF0ZW5jeSB0byA2NCBpZiBsb3dlcjogMCA9IE5vLCAxID0gWWVzLFxuIgorCQkgIlx0XHRcdERlZmF1bHQ6IFllcyIpOworTU9EVUxFX1BBUk1fREVTQyhpdnR2X3l1dl9tb2RlLAorCQkgIlNwZWNpZnkgdGhlIHl1diBwbGF5YmFjayBtb2RlOlxuIgorCQkgIlx0XHRcdDAgPSBpbnRlcmxhY2VkXG5cdFx0XHQxID0gcHJvZ3Jlc3NpdmVcblx0XHRcdDIgPSBhdXRvXG4iCisJCSAiXHRcdFx0RGVmYXVsdDogMCAoaW50ZXJsYWNlZCkiKTsKK01PRFVMRV9QQVJNX0RFU0MoaXZ0dl95dXZfdGhyZXNob2xkLAorCQkgIklmIGl2dHZfeXV2X21vZGUgaXMgMiAoYXV0bykgdGhlbiBwbGF5YmFjayBjb250ZW50IGFzXG5cdFx0cHJvZ3Jlc3NpdmUgaWYgc3JjIGhlaWdodCA8PSBpdnR2X3l1dnRocmVzaG9sZFxuIgorCQkgIlx0XHRcdERlZmF1bHQ6IDQ4MCIpOzsKK01PRFVMRV9QQVJNX0RFU0MoZW5jX21wZ19idWZmZXJzLAorCQkgIkVuY29kZXIgTVBHIEJ1ZmZlcnMgKGluIE1CKVxuIgorCQkgIlx0XHRcdERlZmF1bHQ6ICIgX19zdHJpbmdpZnkoSVZUVl9ERUZBVUxUX0VOQ19NUEdfQlVGRkVSUykpOworTU9EVUxFX1BBUk1fREVTQyhlbmNfeXV2X2J1ZmZlcnMsCisJCSAiRW5jb2RlciBZVVYgQnVmZmVycyAoaW4gTUIpXG4iCisJCSAiXHRcdFx0RGVmYXVsdDogIiBfX3N0cmluZ2lmeShJVlRWX0RFRkFVTFRfRU5DX1lVVl9CVUZGRVJTKSk7CitNT0RVTEVfUEFSTV9ERVNDKGVuY192YmlfYnVmZmVycywKKwkJICJFbmNvZGVyIFZCSSBCdWZmZXJzIChpbiBNQilcbiIKKwkJICJcdFx0XHREZWZhdWx0OiAiIF9fc3RyaW5naWZ5KElWVFZfREVGQVVMVF9FTkNfVkJJX0JVRkZFUlMpKTsKK01PRFVMRV9QQVJNX0RFU0MoZW5jX3BjbV9idWZmZXJzLAorCQkgIkVuY29kZXIgUENNIGJ1ZmZlcnMgKGluIE1CKVxuIgorCQkgIlx0XHRcdERlZmF1bHQ6ICIgX19zdHJpbmdpZnkoSVZUVl9ERUZBVUxUX0VOQ19QQ01fQlVGRkVSUykpOworTU9EVUxFX1BBUk1fREVTQyhkZWNfbXBnX2J1ZmZlcnMsCisJCSAiRGVjb2RlciBNUEcgYnVmZmVycyAoaW4gTUIpXG4iCisJCSAiXHRcdFx0RGVmYXVsdDogIiBfX3N0cmluZ2lmeShJVlRWX0RFRkFVTFRfREVDX01QR19CVUZGRVJTKSk7CitNT0RVTEVfUEFSTV9ERVNDKGRlY195dXZfYnVmZmVycywKKwkJICJEZWNvZGVyIFlVViBidWZmZXJzIChpbiBNQilcbiIKKwkJICJcdFx0XHREZWZhdWx0OiAiIF9fc3RyaW5naWZ5KElWVFZfREVGQVVMVF9ERUNfWVVWX0JVRkZFUlMpKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVjX3ZiaV9idWZmZXJzLAorCQkgIkRlY29kZXIgVkJJIGJ1ZmZlcnMgKGluIE1CKVxuIgorCQkgIlx0XHRcdERlZmF1bHQ6ICIgX19zdHJpbmdpZnkoSVZUVl9ERUZBVUxUX0RFQ19WQklfQlVGRkVSUykpOworTU9EVUxFX1BBUk1fREVTQyhuZXdpMmMsCisJCSAiVXNlIG5ldyBJMkMgaW1wbGVtZW50YXRpb25cbiIKKwkJICJcdFx0XHQtMSBpcyBhdXRvZGV0ZWN0LCAwIGlzIG9mZiwgMSBpcyBvblxuIgorCQkgIlx0XHRcdERlZmF1bHQgaXMgYXV0b2RldGVjdCIpOworCitNT0RVTEVfUEFSTV9ERVNDKGl2dHZfZmlyc3RfbWlub3IsICJTZXQgbWlub3IgYXNzaWduZWQgdG8gZmlyc3QgY2FyZCIpOworCitNT0RVTEVfQVVUSE9SKCJLZXZpbiBUaGF5ZXIsIENocmlzIEtlbm5lZHksIEhhbnMgVmVya3VpbCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJDWDIzNDE1L0NYMjM0MTYgZHJpdmVyIik7CitNT0RVTEVfU1VQUE9SVEVEX0RFVklDRQorICAgICgiQ1gyMzQxNS9DWDIzNDE2IE1QRUcyIGVuY29kZXIgKFdpblRWIFBWUi0xNTAvMjUwLzM1MC81MDAsXG4iCisJCSJcdFx0XHRZdWFuIE1QRyBzZXJpZXMgYW5kIHNpbWlsYXIpIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK01PRFVMRV9WRVJTSU9OKElWVFZfVkVSU0lPTik7CisKK3ZvaWQgaXZ0dl9jbGVhcl9pcnFfbWFzayhzdHJ1Y3QgaXZ0diAqaXR2LCB1MzIgbWFzaykKK3sKKwlpdHYtPmlycW1hc2sgJj0gfm1hc2s7CisJd3JpdGVfcmVnX3N5bmMoaXR2LT5pcnFtYXNrLCBJVlRWX1JFR19JUlFNQVNLKTsKK30KKwordm9pZCBpdnR2X3NldF9pcnFfbWFzayhzdHJ1Y3QgaXZ0diAqaXR2LCB1MzIgbWFzaykKK3sKKwlpdHYtPmlycW1hc2sgfD0gbWFzazsKKwl3cml0ZV9yZWdfc3luYyhpdHYtPmlycW1hc2ssIElWVFZfUkVHX0lSUU1BU0spOworfQorCitpbnQgaXZ0dl9zZXRfb3V0cHV0X21vZGUoc3RydWN0IGl2dHYgKml0diwgaW50IG1vZGUpCit7CisgICAgaW50IG9sZF9tb2RlOworCisgICAgc3Bpbl9sb2NrKCZpdHYtPmxvY2spOworICAgIG9sZF9tb2RlID0gaXR2LT5vdXRwdXRfbW9kZTsKKyAgICBpZiAob2xkX21vZGUgPT0gMCkKKwlpdHYtPm91dHB1dF9tb2RlID0gb2xkX21vZGUgPSBtb2RlOworICAgIHNwaW5fdW5sb2NrKCZpdHYtPmxvY2spOworICAgIHJldHVybiBvbGRfbW9kZTsKK30KKworc3RydWN0IGl2dHZfc3RyZWFtICppdnR2X2dldF9vdXRwdXRfc3RyZWFtKHN0cnVjdCBpdnR2ICppdHYpCit7CisJc3dpdGNoIChpdHYtPm91dHB1dF9tb2RlKSB7CisJY2FzZSBPVVRfTVBHOgorCQlyZXR1cm4gJml0di0+c3RyZWFtc1tJVlRWX0RFQ19TVFJFQU1fVFlQRV9NUEddOworCWNhc2UgT1VUX1lVVjoKKwkJcmV0dXJuICZpdHYtPnN0cmVhbXNbSVZUVl9ERUNfU1RSRUFNX1RZUEVfWVVWXTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gTlVMTDsKKwl9Cit9CisKK2ludCBpdnR2X3dhaXRxKHdhaXRfcXVldWVfaGVhZF90ICp3YWl0cSkKK3sKKwlERUZJTkVfV0FJVCh3YWl0KTsKKworCXByZXBhcmVfdG9fd2FpdCh3YWl0cSwgJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSk7CisJc2NoZWR1bGUoKTsKKwlmaW5pc2hfd2FpdCh3YWl0cSwgJndhaXQpOworCXJldHVybiBzaWduYWxfcGVuZGluZyhjdXJyZW50KSA/IC1FSU5UUiA6IDA7Cit9CisKKy8qIEdlbmVyaWMgdXRpbGl0eSBmdW5jdGlvbnMgKi8KK2ludCBpdnR2X3NsZWVwX3RpbWVvdXQoaW50IHRpbWVvdXQsIGludCBpbnRyKQoreworCWludCByZXQ7CisKKwlkbyB7CisJCXNldF9jdXJyZW50X3N0YXRlKGludHIgPyBUQVNLX0lOVEVSUlVQVElCTEUgOiBUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCXRpbWVvdXQgPSBzY2hlZHVsZV90aW1lb3V0KHRpbWVvdXQpOworCQlpZiAoaW50ciAmJiAocmV0ID0gc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpKQorCQkJcmV0dXJuIHJldDsKKwl9IHdoaWxlICh0aW1lb3V0KTsKKwlyZXR1cm4gMDsKK30KKworLyogUmVsZWFzZSBpb3JlbWFwcGVkIG1lbW9yeSAqLworc3RhdGljIHZvaWQgaXZ0dl9pb3VubWFwKHN0cnVjdCBpdnR2ICppdHYpCit7CisJaWYgKGl0diA9PSBOVUxMKQorCQlyZXR1cm47CisKKwkvKiBSZWxlYXNlIHJlZ2lzdGVycyBtZW1vcnkgKi8KKwlpZiAoaXR2LT5yZWdfbWVtICE9IE5VTEwpIHsKKwkJSVZUVl9ERUJVR19JTkZPKCJyZWxlYXNpbmcgcmVnX21lbVxuIik7CisJCWlvdW5tYXAoaXR2LT5yZWdfbWVtKTsKKwkJaXR2LT5yZWdfbWVtID0gTlVMTDsKKwl9CisJLyogUmVsZWFzZSBpbyBtZW1vcnkgKi8KKwlpZiAoaXR2LT5oYXNfY3gyMzQxNSAmJiBpdHYtPmRlY19tZW0gIT0gTlVMTCkgeworCQlJVlRWX0RFQlVHX0lORk8oInJlbGVhc2luZyBkZWNfbWVtXG4iKTsKKwkJaW91bm1hcChpdHYtPmRlY19tZW0pOworCX0KKwlpdHYtPmRlY19tZW0gPSBOVUxMOworCisJLyogUmVsZWFzZSBpbyBtZW1vcnkgKi8KKwlpZiAoaXR2LT5lbmNfbWVtICE9IE5VTEwpIHsKKwkJSVZUVl9ERUJVR19JTkZPKCJyZWxlYXNpbmcgZW5jX21lbVxuIik7CisJCWlvdW5tYXAoaXR2LT5lbmNfbWVtKTsKKwkJaXR2LT5lbmNfbWVtID0gTlVMTDsKKwl9Cit9CisKKy8qIEhhdXBwYXVnZSBjYXJkPyBnZXQgdmFsdWVzIGZyb20gdHZlZXByb20gKi8KK3ZvaWQgaXZ0dl9yZWFkX2VlcHJvbShzdHJ1Y3QgaXZ0diAqaXR2LCBzdHJ1Y3QgdHZlZXByb20gKnR2KQoreworCXU4IGVlZGF0YVsyNTZdOworCisJaXR2LT5pMmNfY2xpZW50LmFkZHIgPSAweEEwID4+IDE7CisJdHZlZXByb21fcmVhZCgmaXR2LT5pMmNfY2xpZW50LCBlZWRhdGEsIHNpemVvZihlZWRhdGEpKTsKKwl0dmVlcHJvbV9oYXVwcGF1Z2VfYW5hbG9nKCZpdHYtPmkyY19jbGllbnQsIHR2LCBlZWRhdGEpOworfQorCitzdGF0aWMgdm9pZCBpdnR2X3Byb2Nlc3NfZWVwcm9tKHN0cnVjdCBpdnR2ICppdHYpCit7CisJc3RydWN0IHR2ZWVwcm9tIHR2OworCWludCBwY2lfc2xvdCA9IFBDSV9TTE9UKGl0di0+ZGV2LT5kZXZmbik7CisKKwlpdnR2X3JlYWRfZWVwcm9tKGl0diwgJnR2KTsKKworCS8qIE1hbnkgdGhhbmtzIHRvIFN0ZXZlbiBUb3RoIGZyb20gSGF1cHBhdWdlIGZvciBwcm92aWRpbmcgdGhlCisJICAgbW9kZWwgbnVtYmVycyAqLworCXN3aXRjaCAodHYubW9kZWwpIHsKKwkJLyogSW4gYSBmZXcgY2FzZXMgdGhlIFBDSSBzdWJzeXN0ZW0gSURzIGRvIG5vdCBjb3JyZWN0bHkKKwkJICAgaWRlbnRpZnkgdGhlIGNhcmQuIEEgYmV0dGVyIG1ldGhvZCBpcyB0byBjaGVjayB0aGUKKwkJICAgbW9kZWwgbnVtYmVyIGZyb20gdGhlIGVlcHJvbSBpbnN0ZWFkLiAqLworCQljYXNlIDMyMDAwIC4uLiAzMjk5OToKKwkJY2FzZSA0ODAwMCAuLi4gNDgwOTk6ICAvKiA0OD8/PyByYW5nZSBhcmUgUFZSMjUwcyB3aXRoIGEgY3gyMzQxNSAqLworCQljYXNlIDQ4NDAwIC4uLiA0ODU5OToKKwkJCWl0di0+Y2FyZCA9IGl2dHZfZ2V0X2NhcmQoSVZUVl9DQVJEX1BWUl8yNTApOworCQkJYnJlYWs7CisJCWNhc2UgNDgxMDAgLi4uIDQ4Mzk5OgorCQljYXNlIDQ4NjAwIC4uLiA0ODk5OToKKwkJCWl0di0+Y2FyZCA9IGl2dHZfZ2V0X2NhcmQoSVZUVl9DQVJEX1BWUl8zNTApOworCQkJYnJlYWs7CisJCWNhc2UgMjMwMDAgLi4uIDIzOTk5OiAgLyogUFZSNTAwICovCisJCWNhc2UgMjUwMDAgLi4uIDI1OTk5OiAgLyogTG93IHByb2ZpbGUgUFZSMTUwICovCisJCWNhc2UgMjYwMDAgLi4uIDI2OTk5OiAgLyogUmVndWxhciBQVlIxNTAgKi8KKwkJCWl0di0+Y2FyZCA9IGl2dHZfZ2V0X2NhcmQoSVZUVl9DQVJEX1BWUl8xNTApOworCQkJYnJlYWs7CisJCWNhc2UgMDoKKwkJCUlWVFZfRVJSKCJJbnZhbGlkIEVFUFJPTVxuIik7CisJCQlyZXR1cm47CisJCWRlZmF1bHQ6CisJCQlJVlRWX0VSUigiVW5rbm93biBtb2RlbCAlZCwgZGVmYXVsdGluZyB0byBQVlItMTUwXG4iLCB0di5tb2RlbCk7CisJCQlpdHYtPmNhcmQgPSBpdnR2X2dldF9jYXJkKElWVFZfQ0FSRF9QVlJfMTUwKTsKKwkJCWJyZWFrOworCX0KKworCXN3aXRjaCAodHYubW9kZWwpIHsKKwkJLyogT2xkIHN0eWxlIFBWUjM1MCAod2l0aCBhbiBzYWE3MTE0KSB1c2VzIHRoaXMgaW5wdXQgZm9yCisJCSAgIHRoZSB0dW5lci4gKi8KKwkJY2FzZSA0ODI1NDoKKwkJCWl0di0+Y2FyZCA9IGl2dHZfZ2V0X2NhcmQoSVZUVl9DQVJEX1BWUl8zNTBfVjEpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwl9CisKKwlpdHYtPnY0bDJfY2FwID0gaXR2LT5jYXJkLT52NGwyX2NhcGFiaWxpdGllczsKKwlpdHYtPmNhcmRfbmFtZSA9IGl0di0+Y2FyZC0+bmFtZTsKKworCS8qIElmIHRoaXMgaXMgYSBQVlI1MDAgdGhlbiBpdCBzaG91bGQgYmUgcG9zc2libGUgdG8gZGV0ZWN0IHdoZXRoZXIgaXQgaXMgdGhlCisJICAgZmlyc3Qgb3Igc2Vjb25kIHVuaXQgYnkgbG9va2luZyBhdCB0aGUgc3Vic3lzdGVtIGRldmljZSBJRDogaXMgYml0IDQgaXMKKwkgICBzZXQsIHRoZW4gaXQgaXMgdGhlIHNlY29uZCB1bml0IChhY2NvcmRpbmcgdG8gaW5mbyBmcm9tIEhhdXBwYXVnZSkuCisKKwkgICBIb3dldmVyLCB3aGlsZSB0aGlzIHdvcmtzIGZvciBtb3N0IGNhcmRzLCBJIGhhdmUgc2VlbiBhIGZldyBQVlI1MDAgY2FyZHMKKwkgICB3aGVyZSBib3RoIHVuaXRzIGhhdmUgdGhlIHNhbWUgc3Vic3lzdGVtIElELgorCisJICAgU28gaW5zdGVhZCBJIGxvb2sgYXQgdGhlIHJlcG9ydGVkICdQQ0kgc2xvdCcgKHdoaWNoIGlzIHRoZSBzbG90IG9uIHRoZSBQVlI1MDAKKwkgICBQQ0kgYnJpZGdlKSBhbmQgaWYgaXQgaXMgOCwgdGhlbiBpdCBpcyBhc3N1bWVkIHRvIGJlIHRoZSBmaXJzdCB1bml0LCBvdGhlcndpc2UKKwkgICBpdCBpcyB0aGUgc2Vjb25kIHVuaXQuIEl0IGlzIHBvc3NpYmxlIHRoYXQgaXQgaXMgYSBkaWZmZXJlbnQgc2xvdCB3aGVuIGl2dHYgaXMKKwkgICB1c2VkIGluIFhlbiwgaW4gdGhhdCBjYXNlIEkgaWdub3JlIHRoaXMgY2FyZCBoZXJlLiBUaGUgd29yc3QgdGhhdCBjYW4gaGFwcGVuCisJICAgaXMgdGhhdCB0aGUgY2FyZCBwcmVzZW50cyBpdHNlbGYgd2l0aCBhIG5vbi13b3JraW5nIHJhZGlvIGRldmljZS4KKworCSAgIFRoaXMgZGV0ZWN0aW9uIGlzIG5lZWRlZCBzaW5jZSB0aGUgZWVwcm9tIHJlcG9ydHMgaW5jb3JyZWN0bHkgdGhhdCBhIHJhZGlvIGlzCisJICAgcHJlc2VudCBvbiB0aGUgc2Vjb25kIHVuaXQuICovCisJaWYgKHR2Lm1vZGVsIC8gMTAwMCA9PSAyMykgeworCQlpdHYtPmNhcmRfbmFtZSA9ICJXaW5UViBQVlIgNTAwIjsKKwkJaWYgKHBjaV9zbG90ID09IDggfHwgcGNpX3Nsb3QgPT0gOSkgeworCQkJaW50IGlzX2ZpcnN0ID0gKHBjaV9zbG90ICYgMSkgPT0gMDsKKworCQkJaXR2LT5jYXJkX25hbWUgPSBpc19maXJzdCA/ICJXaW5UViBQVlIgNTAwICh1bml0ICMxKSIgOgorCQkJCQkJICAgICJXaW5UViBQVlIgNTAwICh1bml0ICMyKSI7CisJCQlpZiAoIWlzX2ZpcnN0KSB7CisJCQkJSVZUVl9JTkZPKCJDb3JyZWN0aW5nIHR2ZWVwcm9tIGRhdGE6IG5vIHJhZGlvIHByZXNlbnQgb24gc2Vjb25kIHVuaXRcbiIpOworCQkJCXR2Lmhhc19yYWRpbyA9IDA7CisJCQl9CisJCX0KKwl9CisJSVZUVl9JTkZPKCJBdXRvZGV0ZWN0ZWQgJXNcbiIsIGl0di0+Y2FyZF9uYW1lKTsKKworCXN3aXRjaCAodHYudHVuZXJfaGF1cHBhdWdlX21vZGVsKSB7CisJCWNhc2UgODU6CisJCWNhc2UgOTk6CisJCWNhc2UgMTEyOgorCQkJaXR2LT5wdnIxNTBfd29ya2Fyb3VuZCA9IDE7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCX0KKwlpZiAodHYudHVuZXJfdHlwZSA9PSBUVU5FUl9BQlNFTlQpCisJCUlWVFZfRVJSKCJ0dmVlcHJvbSBjYW5ub3QgYXV0b2RldGVjdCB0dW5lciEiKTsKKworCWlmIChpdHYtPm9wdGlvbnMudHVuZXIgPT0gLTEpCisJCWl0di0+b3B0aW9ucy50dW5lciA9IHR2LnR1bmVyX3R5cGU7CisJaWYgKGl0di0+b3B0aW9ucy5yYWRpbyA9PSAtMSkKKwkJaXR2LT5vcHRpb25zLnJhZGlvID0gKHR2Lmhhc19yYWRpbyAhPSAwKTsKKwkvKiBvbmx5IGVuYWJsZSBuZXdpMmMgaWYgYW4gSVIgYmxhc3RlciBpcyBwcmVzZW50ICovCisJLyogRklYTUU6IGZvciAyLjYuMjAgdGhlIHRlc3QgYWdhaW5zdCAyIHNob3VsZCBiZSByZW1vdmVkICovCisJaWYgKGl0di0+b3B0aW9ucy5uZXdpMmMgPT0gLTEgJiYgdHYuaGFzX2lyICE9IC0xICYmIHR2Lmhhc19pciAhPSAyKSB7CisJCWl0di0+b3B0aW9ucy5uZXdpMmMgPSAodHYuaGFzX2lyICYgMikgPyAxIDogMDsKKwkJaWYgKGl0di0+b3B0aW9ucy5uZXdpMmMpIHsKKwkJICAgIElWVFZfSU5GTygicmVvcGVuIGkyYyBidXMgZm9yIElSLWJsYXN0ZXIgc3VwcG9ydFxuIik7CisJCSAgICBleGl0X2l2dHZfaTJjKGl0dik7CisJCSAgICBpbml0X2l2dHZfaTJjKGl0dik7CisJCX0KKwl9CisKKwlpZiAoaXR2LT5zdGQgIT0gMCkKKwkJLyogdXNlciBzcGVjaWZpZWQgdHVuZXIgc3RhbmRhcmQgKi8KKwkJcmV0dXJuOworCisJLyogYXV0b2RldGVjdCB0dW5lciBzdGFuZGFyZCAqLworCWlmICh0di50dW5lcl9mb3JtYXRzICYgVjRMMl9TVERfUEFMKSB7CisJCUlWVFZfREVCVUdfSU5GTygiUEFMIHR1bmVyIGRldGVjdGVkXG4iKTsKKwkJaXR2LT5zdGQgfD0gVjRMMl9TVERfUEFMX0JHIHwgVjRMMl9TVERfUEFMX0g7CisJfSBlbHNlIGlmICh0di50dW5lcl9mb3JtYXRzICYgVjRMMl9TVERfTlRTQykgeworCQlJVlRWX0RFQlVHX0lORk8oIk5UU0MgdHVuZXIgZGV0ZWN0ZWRcbiIpOworCQlpdHYtPnN0ZCB8PSBWNEwyX1NURF9OVFNDX007CisJfSBlbHNlIGlmICh0di50dW5lcl9mb3JtYXRzICYgVjRMMl9TVERfU0VDQU0pIHsKKwkJSVZUVl9ERUJVR19JTkZPKCJTRUNBTSB0dW5lciBkZXRlY3RlZFxuIik7CisJCWl0di0+c3RkIHw9IFY0TDJfU1REX1NFQ0FNX0w7CisJfSBlbHNlIHsKKwkJSVZUVl9JTkZPKCJObyB0dW5lciBkZXRlY3RlZCwgZGVmYXVsdCB0byBOVFNDLU1cbiIpOworCQlpdHYtPnN0ZCB8PSBWNEwyX1NURF9OVFNDX007CisJfQorfQorCitzdGF0aWMgdjRsMl9zdGRfaWQgaXZ0dl9wYXJzZV9zdGQoc3RydWN0IGl2dHYgKml0dikKK3sKKwlzd2l0Y2ggKHBhbFswXSkgeworCQljYXNlICc2JzoKKwkJCXJldHVybiBWNEwyX1NURF9QQUxfNjA7CisJCWNhc2UgJ2InOgorCQljYXNlICdCJzoKKwkJY2FzZSAnZyc6CisJCWNhc2UgJ0cnOgorCQkJcmV0dXJuIFY0TDJfU1REX1BBTF9CRzsKKwkJY2FzZSAnaCc6CisJCWNhc2UgJ0gnOgorCQkJcmV0dXJuIFY0TDJfU1REX1BBTF9IOworCQljYXNlICduJzoKKwkJY2FzZSAnTic6CisJCQlpZiAocGFsWzFdID09ICdjJyB8fCBwYWxbMV0gPT0gJ0MnKQorCQkJCXJldHVybiBWNEwyX1NURF9QQUxfTmM7CisJCQlyZXR1cm4gVjRMMl9TVERfUEFMX047CisJCWNhc2UgJ2knOgorCQljYXNlICdJJzoKKwkJCXJldHVybiBWNEwyX1NURF9QQUxfSTsKKwkJY2FzZSAnZCc6CisJCWNhc2UgJ0QnOgorCQljYXNlICdrJzoKKwkJY2FzZSAnSyc6CisJCQlyZXR1cm4gVjRMMl9TVERfUEFMX0RLOworCQljYXNlICdNJzoKKwkJY2FzZSAnbSc6CisJCQlyZXR1cm4gVjRMMl9TVERfUEFMX007CisJCWNhc2UgJy0nOgorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlJVlRWX1dBUk4oInBhbD0gYXJndW1lbnQgbm90IHJlY29nbmlzZWRcbiIpOworCQkJcmV0dXJuIDA7CisJfQorCisJc3dpdGNoIChzZWNhbVswXSkgeworCQljYXNlICdiJzoKKwkJY2FzZSAnQic6CisJCWNhc2UgJ2cnOgorCQljYXNlICdHJzoKKwkJY2FzZSAnaCc6CisJCWNhc2UgJ0gnOgorCQkJcmV0dXJuIFY0TDJfU1REX1NFQ0FNX0IgfCBWNEwyX1NURF9TRUNBTV9HIHwgVjRMMl9TVERfU0VDQU1fSDsKKwkJY2FzZSAnZCc6CisJCWNhc2UgJ0QnOgorCQljYXNlICdrJzoKKwkJY2FzZSAnSyc6CisJCQlyZXR1cm4gVjRMMl9TVERfU0VDQU1fREs7CisJCWNhc2UgJ2wnOgorCQljYXNlICdMJzoKKwkJCWlmIChzZWNhbVsxXSA9PSAnQycgfHwgc2VjYW1bMV0gPT0gJ2MnKQorCQkJCXJldHVybiBWNEwyX1NURF9TRUNBTV9MQzsKKwkJCXJldHVybiBWNEwyX1NURF9TRUNBTV9MOworCQljYXNlICctJzoKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJSVZUVl9XQVJOKCJzZWNhbT0gYXJndW1lbnQgbm90IHJlY29nbmlzZWRcbiIpOworCQkJcmV0dXJuIDA7CisJfQorCisJc3dpdGNoIChudHNjWzBdKSB7CisJCWNhc2UgJ20nOgorCQljYXNlICdNJzoKKwkJCXJldHVybiBWNEwyX1NURF9OVFNDX007CisJCWNhc2UgJ2onOgorCQljYXNlICdKJzoKKwkJCXJldHVybiBWNEwyX1NURF9OVFNDX01fSlA7CisJCWNhc2UgJ2snOgorCQljYXNlICdLJzoKKwkJCXJldHVybiBWNEwyX1NURF9OVFNDX01fS1I7CisJCWNhc2UgJy0nOgorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlJVlRWX1dBUk4oIm50c2M9IGFyZ3VtZW50IG5vdCByZWNvZ25pc2VkXG4iKTsKKwkJCXJldHVybiAwOworCX0KKworCS8qIG5vIG1hdGNoIGZvdW5kICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGl2dHZfcHJvY2Vzc19vcHRpb25zKHN0cnVjdCBpdnR2ICppdHYpCit7CisJY29uc3QgY2hhciAqY2hpcG5hbWU7CisJaW50IGksIGo7CisKKwlpdHYtPm9wdGlvbnMubWVnYWJ5dGVzW0lWVFZfRU5DX1NUUkVBTV9UWVBFX01QR10gPSBlbmNfbXBnX2J1ZmZlcnM7CisJaXR2LT5vcHRpb25zLm1lZ2FieXRlc1tJVlRWX0VOQ19TVFJFQU1fVFlQRV9ZVVZdID0gZW5jX3l1dl9idWZmZXJzOworCWl0di0+b3B0aW9ucy5tZWdhYnl0ZXNbSVZUVl9FTkNfU1RSRUFNX1RZUEVfVkJJXSA9IGVuY192YmlfYnVmZmVyczsKKwlpdHYtPm9wdGlvbnMubWVnYWJ5dGVzW0lWVFZfRU5DX1NUUkVBTV9UWVBFX1BDTV0gPSBlbmNfcGNtX2J1ZmZlcnM7CisJaXR2LT5vcHRpb25zLm1lZ2FieXRlc1tJVlRWX0RFQ19TVFJFQU1fVFlQRV9NUEddID0gZGVjX21wZ19idWZmZXJzOworCWl0di0+b3B0aW9ucy5tZWdhYnl0ZXNbSVZUVl9ERUNfU1RSRUFNX1RZUEVfWVVWXSA9IGRlY195dXZfYnVmZmVyczsKKwlpdHYtPm9wdGlvbnMubWVnYWJ5dGVzW0lWVFZfREVDX1NUUkVBTV9UWVBFX1ZCSV0gPSBkZWNfdmJpX2J1ZmZlcnM7CisJaXR2LT5vcHRpb25zLmNhcmR0eXBlID0gY2FyZHR5cGVbaXR2LT5udW1dOworCWl0di0+b3B0aW9ucy50dW5lciA9IHR1bmVyW2l0di0+bnVtXTsKKwlpdHYtPm9wdGlvbnMucmFkaW8gPSByYWRpb1tpdHYtPm51bV07CisJaXR2LT5vcHRpb25zLm5ld2kyYyA9IG5ld2kyYzsKKworCWl0di0+c3RkID0gaXZ0dl9wYXJzZV9zdGQoaXR2KTsKKwlpdHYtPmhhc19jeDIzNDE1ID0gKGl0di0+ZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9JVlRWMTUpOworCWNoaXBuYW1lID0gaXR2LT5oYXNfY3gyMzQxNSA/ICJjeDIzNDE1IiA6ICJjeDIzNDE2IjsKKwlpZiAoaXR2LT5vcHRpb25zLmNhcmR0eXBlID09IC0xKSB7CisJCUlWVFZfSU5GTygiSWdub3JlIGNhcmQgKGRldGVjdGVkICVzIGJhc2VkIGNoaXApXG4iLCBjaGlwbmFtZSk7CisJCXJldHVybjsKKwl9CisJaWYgKChpdHYtPmNhcmQgPSBpdnR2X2dldF9jYXJkKGl0di0+b3B0aW9ucy5jYXJkdHlwZSAtIDEpKSkgeworCQlJVlRWX0lORk8oIlVzZXIgc3BlY2lmaWVkICVzIGNhcmQgKGRldGVjdGVkICVzIGJhc2VkIGNoaXApXG4iLAorCQkJCWl0di0+Y2FyZC0+bmFtZSwgY2hpcG5hbWUpOworCX0gZWxzZSBpZiAoaXR2LT5vcHRpb25zLmNhcmR0eXBlICE9IDApIHsKKwkJSVZUVl9FUlIoIlVua25vd24gdXNlciBzcGVjaWZpZWQgdHlwZSwgdHJ5aW5nIHRvIGF1dG9kZXRlY3QgY2FyZFxuIik7CisJfQorCWlmIChpdHYtPmNhcmQgPT0gTlVMTCkgeworCQlpZiAoaXR2LT5kZXYtPnN1YnN5c3RlbV92ZW5kb3IgPT0gSVZUVl9QQ0lfSURfSEFVUFBBVUdFIHx8CisJCSAgICBpdHYtPmRldi0+c3Vic3lzdGVtX3ZlbmRvciA9PSBJVlRWX1BDSV9JRF9IQVVQUEFVR0VfQUxUMSB8fAorCQkgICAgaXR2LT5kZXYtPnN1YnN5c3RlbV92ZW5kb3IgPT0gSVZUVl9QQ0lfSURfSEFVUFBBVUdFX0FMVDIpIHsKKwkJCWl0di0+Y2FyZCA9IGl2dHZfZ2V0X2NhcmQoaXR2LT5oYXNfY3gyMzQxNSA/IElWVFZfQ0FSRF9QVlJfMzUwIDogSVZUVl9DQVJEX1BWUl8xNTApOworCQkJSVZUVl9JTkZPKCJBdXRvZGV0ZWN0ZWQgSGF1cHBhdWdlIGNhcmQgKCVzIGJhc2VkKVxuIiwKKwkJCQkJY2hpcG5hbWUpOworCQl9CisJfQorCWlmIChpdHYtPmNhcmQgPT0gTlVMTCkgeworCQlmb3IgKGkgPSAwOyAoaXR2LT5jYXJkID0gaXZ0dl9nZXRfY2FyZChpKSk7IGkrKykgeworCQkJaWYgKGl0di0+Y2FyZC0+cGNpX2xpc3QgPT0gTlVMTCkKKwkJCQljb250aW51ZTsKKwkJCWZvciAoaiA9IDA7IGl0di0+Y2FyZC0+cGNpX2xpc3Rbal0uZGV2aWNlOyBqKyspIHsKKwkJCQlpZiAoaXR2LT5kZXYtPmRldmljZSAhPQorCQkJCSAgICBpdHYtPmNhcmQtPnBjaV9saXN0W2pdLmRldmljZSkKKwkJCQkJY29udGludWU7CisJCQkJaWYgKGl0di0+ZGV2LT5zdWJzeXN0ZW1fdmVuZG9yICE9CisJCQkJICAgIGl0di0+Y2FyZC0+cGNpX2xpc3Rbal0uc3Vic3lzdGVtX3ZlbmRvcikKKwkJCQkJY29udGludWU7CisJCQkJaWYgKGl0di0+ZGV2LT5zdWJzeXN0ZW1fZGV2aWNlICE9CisJCQkJICAgIGl0di0+Y2FyZC0+cGNpX2xpc3Rbal0uc3Vic3lzdGVtX2RldmljZSkKKwkJCQkJY29udGludWU7CisJCQkJSVZUVl9JTkZPKCJBdXRvZGV0ZWN0ZWQgJXMgY2FyZCAoJXMgYmFzZWQpXG4iLAorCQkJCQkJaXR2LT5jYXJkLT5uYW1lLCBjaGlwbmFtZSk7CisJCQkJZ290byBkb25lOworCQkJfQorCQl9CisJfQorZG9uZToKKworCWlmIChpdHYtPmNhcmQgPT0gTlVMTCkgeworCQlpdHYtPmNhcmQgPSBpdnR2X2dldF9jYXJkKElWVFZfQ0FSRF9QVlJfMTUwKTsKKwkJSVZUVl9FUlIoIlVua25vd24gY2FyZDogdmVuZG9yL2RldmljZTogJTA0eC8lMDR4XG4iLAorCQkgICAgIGl0di0+ZGV2LT52ZW5kb3IsIGl0di0+ZGV2LT5kZXZpY2UpOworCQlJVlRWX0VSUigiICAgICAgICAgICAgICBzdWJzeXN0ZW0gdmVuZG9yL2RldmljZTogJTA0eC8lMDR4XG4iLAorCQkgICAgIGl0di0+ZGV2LT5zdWJzeXN0ZW1fdmVuZG9yLCBpdHYtPmRldi0+c3Vic3lzdGVtX2RldmljZSk7CisJCUlWVFZfRVJSKCIgICAgICAgICAgICAgICVzIGJhc2VkXG4iLCBjaGlwbmFtZSk7CisJCUlWVFZfRVJSKCJEZWZhdWx0aW5nIHRvICVzIGNhcmRcbiIsIGl0di0+Y2FyZC0+bmFtZSk7CisJCUlWVFZfRVJSKCJQbGVhc2UgbWFpbCB0aGUgdmVuZG9yL2RldmljZSBhbmQgc3Vic3lzdGVtIHZlbmRvci9kZXZpY2UgSURzIGFuZCB3aGF0IGtpbmQgb2ZcbiIpOworCQlJVlRWX0VSUigiY2FyZCB5b3UgaGF2ZSB0byB0aGUgaXZ0di1kZXZlbCBtYWlsaW5nbGlzdCAod3d3Lml2dHZkcml2ZXIub3JnKVxuIik7CisJCUlWVFZfRVJSKCJQcmVmaXggeW91ciBzdWJqZWN0IGxpbmUgd2l0aCBbVU5LTk9XTiBDQVJEXS5cbiIpOworCX0KKwlpdHYtPnY0bDJfY2FwID0gaXR2LT5jYXJkLT52NGwyX2NhcGFiaWxpdGllczsKKwlpdHYtPmNhcmRfbmFtZSA9IGl0di0+Y2FyZC0+bmFtZTsKK30KKworLyogUHJlY29uZGl0aW9uOiB0aGUgaXZ0diBzdHJ1Y3R1cmUgaGFzIGJlZW4gbWVtc2V0IHRvIDAuIE9ubHkKKyAgIHRoZSBkZXYgYW5kIG51bSBmaWVsZHMgaGF2ZSBiZWVuIGZpbGxlZCBpbi4KKyAgIE5vIGFzc3VtcHRpb25zIG9uIHRoZSBjYXJkIHR5cGUgbWF5IGJlIG1hZGUgaGVyZSAoc2VlIGl2dHZfaW5pdF9zdHJ1Y3QyCisgICBmb3IgdGhhdCkuCisgKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IGl2dHZfaW5pdF9zdHJ1Y3QxKHN0cnVjdCBpdnR2ICppdHYpCit7CisJaXR2LT5iYXNlX2FkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoaXR2LT5kZXYsIDApOworCWl0di0+ZW5jX21ib3gubWF4X21ib3ggPSAyOyAvKiB0aGUgZW5jb2RlciBoYXMgMyBtYWlsYm94ZXMgKDAtMikgKi8KKwlpdHYtPmRlY19tYm94Lm1heF9tYm94ID0gMTsgLyogdGhlIGRlY29kZXIgaGFzIDIgbWFpbGJveGVzICgwLTEpICovCisKKwltdXRleF9pbml0KCZpdHYtPmkyY19idXNfbG9jayk7CisJbXV0ZXhfaW5pdCgmaXR2LT51ZG1hLmxvY2spOworCisJc3Bpbl9sb2NrX2luaXQoJml0di0+bG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJml0di0+ZG1hX3JlZ19sb2NrKTsKKworCWl0di0+aXJxX3dvcmtfcXVldWVzID0gY3JlYXRlX3dvcmtxdWV1ZShpdHYtPm5hbWUpOworCWlmIChpdHYtPmlycV93b3JrX3F1ZXVlcyA9PSBOVUxMKSB7CisJCUlWVFZfRVJSKCJDb3VsZCBub3QgY3JlYXRlIGl2dHYgd29ya3F1ZXVlXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCUlOSVRfV09SSygmaXR2LT5pcnFfd29ya19xdWV1ZSwgaXZ0dl9pcnFfd29ya19oYW5kbGVyKTsKKworCS8qIHN0YXJ0IGNvdW50aW5nIG9wZW5faWQgYXQgMSAqLworCWl0di0+b3Blbl9pZCA9IDE7CisKKwkvKiBJbml0aWFsIHNldHRpbmdzICovCisJY3gyMzQxeF9maWxsX2RlZmF1bHRzKCZpdHYtPnBhcmFtcyk7CisJaXR2LT5wYXJhbXMucG9ydCA9IENYMjM0MVhfUE9SVF9NRU1PUlk7CisJaXR2LT5wYXJhbXMuY2FwYWJpbGl0aWVzID0gQ1gyMzQxWF9DQVBfSEFTX1NMSUNFRF9WQkk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmaXR2LT5jYXBfdyk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmaXR2LT5ldmVudF93YWl0cSk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmaXR2LT52c3luY193YWl0cSk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmaXR2LT5kbWFfd2FpdHEpOworCWluaXRfdGltZXIoJml0di0+ZG1hX3RpbWVyKTsKKwlpdHYtPmRtYV90aW1lci5mdW5jdGlvbiA9IGl2dHZfdW5maW5pc2hlZF9kbWE7CisJaXR2LT5kbWFfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWl0djsKKworCWl0di0+Y3VyX2RtYV9zdHJlYW0gPSAtMTsKKwlpdHYtPmF1ZGlvX3N0ZXJlb19tb2RlID0gQVVESU9fU1RFUkVPOworCWl0di0+YXVkaW9fYmlsaW5ndWFsX21vZGUgPSBBVURJT19NT05PX0xFRlQ7CisKKwkvKiBDdHJscyAqLworCWl0di0+c3BlZWQgPSAxMDAwOworCisJLyogVkJJICovCisJaXR2LT52YmkuaW4udHlwZSA9IFY0TDJfQlVGX1RZUEVfU0xJQ0VEX1ZCSV9DQVBUVVJFOworCWl0di0+dmJpLnNsaWNlZF9pbiA9ICZpdHYtPnZiaS5pbi5mbXQuc2xpY2VkOworCisJLyogT1NEICovCisJaXR2LT5vc2RfZ2xvYmFsX2FscGhhX3N0YXRlID0gMTsKKwlpdHYtPm9zZF9nbG9iYWxfYWxwaGEgPSAyNTU7CisKKwkvKiBZVVYgKi8KKwlhdG9taWNfc2V0KCZpdHYtPnl1dl9pbmZvLm5leHRfZG1hX2ZyYW1lLCAtMSk7CisJaXR2LT55dXZfaW5mby5sYWNlX21vZGUgPSBpdnR2X3l1dl9tb2RlOworCWl0di0+eXV2X2luZm8ubGFjZV90aHJlc2hvbGQgPSBpdnR2X3l1dl90aHJlc2hvbGQ7CisJcmV0dXJuIDA7Cit9CisKKy8qIFNlY29uZCBpbml0aWFsaXphdGlvbiBwYXJ0LiBIZXJlIHRoZSBjYXJkIHR5cGUgaGFzIGJlZW4KKyAgIGF1dG9kZXRlY3RlZC4gKi8KK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBpdnR2X2luaXRfc3RydWN0MihzdHJ1Y3QgaXZ0diAqaXR2KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IElWVFZfQ0FSRF9NQVhfVklERU9fSU5QVVRTOyBpKyspCisJCWlmIChpdHYtPmNhcmQtPnZpZGVvX2lucHV0c1tpXS52aWRlb190eXBlID09IDApCisJCQlicmVhazsKKwlpdHYtPm5vZl9pbnB1dHMgPSBpOworCWZvciAoaSA9IDA7IGkgPCBJVlRWX0NBUkRfTUFYX0FVRElPX0lOUFVUUzsgaSsrKQorCQlpZiAoaXR2LT5jYXJkLT5hdWRpb19pbnB1dHNbaV0uYXVkaW9fdHlwZSA9PSAwKQorCQkJYnJlYWs7CisJaXR2LT5ub2ZfYXVkaW9faW5wdXRzID0gaTsKKworCS8qIDB4MDBFRiA9IHNhYTcxMTQoMjM5KSAweDAwRjAgPSBzYWE3MTE1KDI0MCkgMHgwMTA2ID0gbWljcm8gKi8KKwlpZiAoaXR2LT5jYXJkLT5od19hbGwgJiAoSVZUVl9IV19TQUE3MTE1IHwgSVZUVl9IV19TQUE3MTdYKSkKKwkJaXR2LT5kaWdpdGl6ZXIgPSAweEYxOworCWVsc2UgaWYgKGl0di0+Y2FyZC0+aHdfYWxsICYgSVZUVl9IV19TQUE3MTE0KQorCQlpdHYtPmRpZ2l0aXplciA9IDB4RUY7CisJZWxzZSAvKiBjeDI1ODQwICovCisJCWl0di0+ZGlnaXRpemVyID0gMHgxNDA7CisKKwlpZiAoaXR2LT5jYXJkLT5od19hbGwgJiBJVlRWX0hXX0NYMjU4NDApIHsKKwkJaXR2LT52Ymkuc2xpY2VkX3NpemUgPSAyODg7ICAvKiBtdWx0aXBsZSBvZiAxNiwgcmVhbCBzaXplID0gMjg0ICovCisJfSBlbHNlIHsKKwkJaXR2LT52Ymkuc2xpY2VkX3NpemUgPSA2NDsgICAvKiBtdWx0aXBsZSBvZiAxNiwgcmVhbCBzaXplID0gNTIgKi8KKwl9CisKKwkvKiBGaW5kIHR1bmVyIGlucHV0ICovCisJZm9yIChpID0gMDsgaSA8IGl0di0+bm9mX2lucHV0czsgaSsrKSB7CisJCWlmIChpdHYtPmNhcmQtPnZpZGVvX2lucHV0c1tpXS52aWRlb190eXBlID09CisJCQkJSVZUVl9DQVJEX0lOUFVUX1ZJRF9UVU5FUikKKwkJCWJyZWFrOworCX0KKwlpZiAoaSA9PSBpdHYtPm5vZl9pbnB1dHMpCisJCWkgPSAwOworCWl0di0+YWN0aXZlX2lucHV0ID0gaTsKKwlpdHYtPmF1ZGlvX2lucHV0ID0gaXR2LT5jYXJkLT52aWRlb19pbnB1dHNbaV0uYXVkaW9faW5kZXg7CisJaWYgKGl0di0+Y2FyZC0+aHdfYWxsICYgSVZUVl9IV19DWDI1ODQwKQorCQlpdHYtPnZpZGVvX2RlY19mdW5jID0gaXZ0dl9jeDI1ODQwOworCWVsc2UgaWYgKGl0di0+Y2FyZC0+aHdfYWxsICYgSVZUVl9IV19TQUE3MTdYKQorCQlpdHYtPnZpZGVvX2RlY19mdW5jID0gaXZ0dl9zYWE3MTd4OworCWVsc2UKKwkJaXR2LT52aWRlb19kZWNfZnVuYyA9IGl2dHZfc2FhNzExNTsKK30KKworc3RhdGljIGludCBpdnR2X3NldHVwX3BjaShzdHJ1Y3QgaXZ0diAqaXR2LCBzdHJ1Y3QgcGNpX2RldiAqZGV2LAorCQkJICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcGNpX2lkKQoreworCXUxNiBjbWQ7CisJdW5zaWduZWQgY2hhciBwY2lfbGF0ZW5jeTsKKworCUlWVFZfREVCVUdfSU5GTygiRW5hYmxpbmcgcGNpIGRldmljZVxuIik7CisKKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UoZGV2KSkgeworCQlJVlRWX0VSUigiQ2FuJ3QgZW5hYmxlIGRldmljZSAlZCFcbiIsIGl0di0+bnVtKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCWlmIChwY2lfc2V0X2RtYV9tYXNrKGRldiwgMHhmZmZmZmZmZikpIHsKKwkJSVZUVl9FUlIoIk5vIHN1aXRhYmxlIERNQSBhdmFpbGFibGUgb24gY2FyZCAlZC5cbiIsIGl0di0+bnVtKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKGl0di0+YmFzZV9hZGRyLCBJVlRWX0VOQ09ERVJfU0laRSwgIml2dHYgZW5jb2RlciIpKSB7CisJCUlWVFZfRVJSKCJDYW5ub3QgcmVxdWVzdCBlbmNvZGVyIG1lbW9yeSByZWdpb24gb24gY2FyZCAlZC5cbiIsIGl0di0+bnVtKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oaXR2LT5iYXNlX2FkZHIgKyBJVlRWX1JFR19PRkZTRVQsCisJCQkJSVZUVl9SRUdfU0laRSwgIml2dHYgcmVnaXN0ZXJzIikpIHsKKwkJSVZUVl9FUlIoIkNhbm5vdCByZXF1ZXN0IHJlZ2lzdGVyIG1lbW9yeSByZWdpb24gb24gY2FyZCAlZC5cbiIsIGl0di0+bnVtKTsKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKGl0di0+YmFzZV9hZGRyLCBJVlRWX0VOQ09ERVJfU0laRSk7CisJCXJldHVybiAtRUlPOworCX0KKworCWlmIChpdHYtPmhhc19jeDIzNDE1ICYmCisJICAgICFyZXF1ZXN0X21lbV9yZWdpb24oaXR2LT5iYXNlX2FkZHIgKyBJVlRWX0RFQ09ERVJfT0ZGU0VULAorCQkJCUlWVFZfREVDT0RFUl9TSVpFLCAiaXZ0diBkZWNvZGVyIikpIHsKKwkJSVZUVl9FUlIoIkNhbm5vdCByZXF1ZXN0IGRlY29kZXIgbWVtb3J5IHJlZ2lvbiBvbiBjYXJkICVkLlxuIiwgaXR2LT5udW0pOworCQlyZWxlYXNlX21lbV9yZWdpb24oaXR2LT5iYXNlX2FkZHIsIElWVFZfRU5DT0RFUl9TSVpFKTsKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKGl0di0+YmFzZV9hZGRyICsgSVZUVl9SRUdfT0ZGU0VULCBJVlRWX1JFR19TSVpFKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogQ2hlY2sgZm9yIGJ1cyBtYXN0ZXJpbmcgKi8KKwlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIFBDSV9DT01NQU5ELCAmY21kKTsKKwlpZiAoIShjbWQgJiBQQ0lfQ09NTUFORF9NQVNURVIpKSB7CisJCUlWVFZfREVCVUdfSU5GTygiQXR0ZW1wdGluZyB0byBlbmFibGUgQnVzIE1hc3RlcmluZ1xuIik7CisJCXBjaV9zZXRfbWFzdGVyKGRldik7CisJCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgUENJX0NPTU1BTkQsICZjbWQpOworCQlpZiAoIShjbWQgJiBQQ0lfQ09NTUFORF9NQVNURVIpKSB7CisJCQlJVlRWX0VSUigiQnVzIE1hc3RlcmluZyBpcyBub3QgZW5hYmxlZFxuIik7CisJCQlyZXR1cm4gLUVOWElPOworCQl9CisJfQorCUlWVFZfREVCVUdfSU5GTygiQnVzIE1hc3RlcmluZyBFbmFibGVkLlxuIik7CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIFBDSV9DTEFTU19SRVZJU0lPTiwgJml0di0+Y2FyZF9yZXYpOworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgUENJX0xBVEVOQ1lfVElNRVIsICZwY2lfbGF0ZW5jeSk7CisKKwlpZiAocGNpX2xhdGVuY3kgPCA2NCAmJiBpdnR2X3BjaV9sYXRlbmN5KSB7CisJCUlWVFZfSU5GTygiVW5yZWFzb25hYmx5IGxvdyBsYXRlbmN5IHRpbWVyLCAiCisJCQkgICAgICAgInNldHRpbmcgdG8gNjQgKHdhcyAlZClcbiIsIHBjaV9sYXRlbmN5KTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX0xBVEVOQ1lfVElNRVIsIDY0KTsKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBQQ0lfTEFURU5DWV9USU1FUiwgJnBjaV9sYXRlbmN5KTsKKwl9CisJLyogVGhpcyBjb25maWcgc3BhY2UgdmFsdWUgcmVsYXRlcyB0byBETUEgbGF0ZW5jaWVzLiBUaGUKKwkgICBkZWZhdWx0IHZhbHVlIDB4ODA4MCBpcyB0b28gbG93IGhvd2V2ZXIgYW5kIHdpbGwgbGVhZAorCSAgIHRvIERNQSBlcnJvcnMuIDB4ZmZmZiBpcyB0aGUgbWF4IHZhbHVlIHdoaWNoIHNvbHZlcworCSAgIHRoZXNlIHByb2JsZW1zLiAqLworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCAweDQwLCAweGZmZmYpOworCisJSVZUVl9ERUJVR19JTkZPKCIlZCAocmV2ICVkKSBhdCAlMDJ4OiUwMnguJXgsICIKKwkJICAgImlycTogJWQsIGxhdGVuY3k6ICVkLCBtZW1vcnk6IDB4JWx4XG4iLAorCQkgICBpdHYtPmRldi0+ZGV2aWNlLCBpdHYtPmNhcmRfcmV2LCBkZXYtPmJ1cy0+bnVtYmVyLAorCQkgICBQQ0lfU0xPVChkZXYtPmRldmZuKSwgUENJX0ZVTkMoZGV2LT5kZXZmbiksCisJCSAgIGl0di0+ZGV2LT5pcnEsIHBjaV9sYXRlbmN5LCAodW5zaWduZWQgbG9uZylpdHYtPmJhc2VfYWRkcik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaXZ0dl9yZXF1ZXN0X21vZHVsZShzdHJ1Y3QgaXZ0diAqaXR2LCBjb25zdCBjaGFyICpuYW1lKQoreworCWlmIChyZXF1ZXN0X21vZHVsZShuYW1lKSAhPSAwKSB7CisJCUlWVFZfRVJSKCJGYWlsZWQgdG8gbG9hZCBtb2R1bGUgJXNcbiIsIG5hbWUpOworCX0gZWxzZSB7CisJCUlWVFZfREVCVUdfSU5GTygiTG9hZGVkIG1vZHVsZSAlc1xuIiwgbmFtZSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBpdnR2X2xvYWRfYW5kX2luaXRfbW9kdWxlcyhzdHJ1Y3QgaXZ0diAqaXR2KQoreworCXN0cnVjdCB2NGwyX2NvbnRyb2wgY3RybDsKKwl1MzIgaHcgPSBpdHYtPmNhcmQtPmh3X2FsbDsKKwlpbnQgaTsKKworCS8qIGxvYWQgbW9kdWxlcyAqLworI2lmbmRlZiBDT05GSUdfVklERU9fVFVORVIKKwlpZiAoaHcgJiBJVlRWX0hXX1RVTkVSKSB7CisJCWl2dHZfcmVxdWVzdF9tb2R1bGUoaXR2LCAidHVuZXIiKTsKKyNpZmRlZiBIQVZFX1hDMzAyOAorCQlpZiAoaXR2LT5vcHRpb25zLnR1bmVyID09IFRVTkVSX1hDRUlWRV9YQzMwMjgpCisJCQlpdnR2X3JlcXVlc3RfbW9kdWxlKGl0diwgInhjMzAyOC10dW5lciIpOworI2VuZGlmCisJfQorI2VuZGlmCisjaWZuZGVmIENPTkZJR19WSURFT19DWDI1ODQwCisJaWYgKGh3ICYgSVZUVl9IV19DWDI1ODQwKQorCQlpdnR2X3JlcXVlc3RfbW9kdWxlKGl0diwgImN4MjU4NDAiKTsKKyNlbmRpZgorI2lmbmRlZiBDT05GSUdfVklERU9fU0FBNzExWAorCWlmIChodyAmIElWVFZfSFdfU0FBNzExWCkKKwkJaXZ0dl9yZXF1ZXN0X21vZHVsZShpdHYsICJzYWE3MTE1Iik7CisjZW5kaWYKKyNpZm5kZWYgQ09ORklHX1ZJREVPX1NBQTcxMjcKKwlpZiAoaHcgJiBJVlRWX0hXX1NBQTcxMjcpCisJCWl2dHZfcmVxdWVzdF9tb2R1bGUoaXR2LCAic2FhNzEyNyIpOworI2VuZGlmCisJaWYgKGh3ICYgSVZUVl9IV19TQUE3MTdYKQorCQlpdnR2X3JlcXVlc3RfbW9kdWxlKGl0diwgInNhYTcxN3giKTsKKyNpZm5kZWYgQ09ORklHX1ZJREVPX1VQRDY0MDMxQQorCWlmIChodyAmIElWVFZfSFdfVVBENjQwMzFBKQorCQlpdnR2X3JlcXVlc3RfbW9kdWxlKGl0diwgInVwZDY0MDMxYSIpOworI2VuZGlmCisjaWZuZGVmIENPTkZJR19WSURFT19VUEQ2NDA4MworCWlmIChodyAmIElWVFZfSFdfVVBENjQwOFgpCisJCWl2dHZfcmVxdWVzdF9tb2R1bGUoaXR2LCAidXBkNjQwODMiKTsKKyNlbmRpZgorI2lmbmRlZiBDT05GSUdfVklERU9fTVNQMzQwMAorCWlmIChodyAmIElWVFZfSFdfTVNQMzRYWCkKKwkJaXZ0dl9yZXF1ZXN0X21vZHVsZShpdHYsICJtc3AzNDAwIik7CisjZW5kaWYKKwlpZiAoaHcgJiBJVlRWX0hXX1RWQVVESU8pCisJCWl2dHZfcmVxdWVzdF9tb2R1bGUoaXR2LCAidHZhdWRpbyIpOworI2lmbmRlZiBDT05GSUdfVklERU9fV004Nzc1CisJaWYgKGh3ICYgSVZUVl9IV19XTTg3NzUpCisJCWl2dHZfcmVxdWVzdF9tb2R1bGUoaXR2LCAid204Nzc1Iik7CisjZW5kaWYKKyNpZm5kZWYgQ09ORklHX1ZJREVPX1dNODczOQorCWlmIChodyAmIElWVFZfSFdfV004NzM5KQorCQlpdnR2X3JlcXVlc3RfbW9kdWxlKGl0diwgIndtODczOSIpOworI2VuZGlmCisjaWZuZGVmIENPTkZJR19WSURFT19DUzUzTDMyQQorCWlmIChodyAmIElWVFZfSFdfQ1M1M0wzMkEpCisJCWl2dHZfcmVxdWVzdF9tb2R1bGUoaXR2LCAiY3M1M2wzMmEiKTsKKyNlbmRpZgorCisJLyogY2hlY2sgd2hpY2ggaTJjIGRldmljZXMgYXJlIGFjdHVhbGx5IGZvdW5kICovCisJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHsKKwkJdTMyIGRldmljZSA9IDEgPDwgaTsKKworCQlpZiAoIShkZXZpY2UgJiBodykpCisJCQljb250aW51ZTsKKwkJaWYgKGRldmljZSA9PSBJVlRWX0hXX0dQSU8pIHsKKwkJCS8qIEdQSU8gaXMgYWx3YXlzIGF2YWlsYWJsZSAqLworCQkJaXR2LT5od19mbGFncyB8PSBJVlRWX0hXX0dQSU87CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoaXZ0dl9pMmNfaHdfYWRkcihpdHYsIGRldmljZSkgPiAwKQorCQkJaXR2LT5od19mbGFncyB8PSBkZXZpY2U7CisJfQorCisJaHcgPSBpdHYtPmh3X2ZsYWdzOworCisJaWYgKGl0di0+Y2FyZC0+dHlwZSA9PSBJVlRWX0NBUkRfQ1gyMzQxNkdZQykgeworCQkvKiBTZXZlcmFsIHZhcmlhdGlvbnMgb2YgdGhpcyBjYXJkIGV4aXN0LCBkZXRlY3Qgd2hpY2ggY2FyZAorCQkgICB0eXBlIHNob3VsZCBiZSB1c2VkLiAqLworCQlpZiAoKGh3ICYgKElWVFZfSFdfVVBENjQwMzFBIHwgSVZUVl9IV19VUEQ2NDA4WCkpID09IDApCisJCQlpdHYtPmNhcmQgPSBpdnR2X2dldF9jYXJkKElWVFZfQ0FSRF9DWDIzNDE2R1lDX05PR1JZQ1MpOworCQllbHNlIGlmICgoaHcgJiBJVlRWX0hXX1VQRDY0MDMxQSkgPT0gMCkKKwkJCWl0di0+Y2FyZCA9IGl2dHZfZ2V0X2NhcmQoSVZUVl9DQVJEX0NYMjM0MTZHWUNfTk9HUik7CisJfQorCisJaWYgKGh3ICYgSVZUVl9IV19DWDI1ODQwKSB7CisJCS8qIENYMjU4NDBfQ0lEX0VOQUJMRV9QVlIxNTBfV09SS0FST1VORCAqLworCQljdHJsLmlkID0gVjRMMl9DSURfUFJJVkFURV9CQVNFOworCQljdHJsLnZhbHVlID0gaXR2LT5wdnIxNTBfd29ya2Fyb3VuZDsKKwkJaXR2LT52aWRlb19kZWNfZnVuYyhpdHYsIFZJRElPQ19TX0NUUkwsICZjdHJsKTsKKworCQlpdHYtPnZiaS5yYXdfZGVjb2Rlcl9saW5lX3NpemUgPSAxNDQ0OworCQlpdHYtPnZiaS5yYXdfZGVjb2Rlcl9zYXZfb2RkX2ZpZWxkID0gMHgyMDsKKwkJaXR2LT52YmkucmF3X2RlY29kZXJfc2F2X2V2ZW5fZmllbGQgPSAweDYwOworCQlpdHYtPnZiaS5zbGljZWRfZGVjb2Rlcl9saW5lX3NpemUgPSAyNzI7CisJCWl0di0+dmJpLnNsaWNlZF9kZWNvZGVyX3Nhdl9vZGRfZmllbGQgPSAweEIwOworCQlpdHYtPnZiaS5zbGljZWRfZGVjb2Rlcl9zYXZfZXZlbl9maWVsZCA9IDB4RjA7CisJfQorCisJaWYgKGh3ICYgSVZUVl9IV19TQUE3MTFYKSB7CisJCXN0cnVjdCB2NGwyX2NoaXBfaWRlbnQgdiA9IHsgVjRMMl9DSElQX01BVENIX0kyQ19EUklWRVIsIEkyQ19EUklWRVJJRF9TQUE3MTFYIH07CisKKwkJLyogZGV0ZXJtaW5lIHRoZSBleGFjdCBzYWE3MTF4IG1vZGVsICovCisJCWl0di0+aHdfZmxhZ3MgJj0gfklWVFZfSFdfU0FBNzExWDsKKworCQlpdnR2X3NhYTcxMTUoaXR2LCBWSURJT0NfR19DSElQX0lERU5ULCAmdik7CisJCWlmICh2LmlkZW50ID09IFY0TDJfSURFTlRfU0FBNzExNCkgeworCQkJaXR2LT5od19mbGFncyB8PSBJVlRWX0hXX1NBQTcxMTQ7CisJCQkvKiBWQkkgaXMgbm90IHlldCBzdXBwb3J0ZWQgYnkgdGhlIHNhYTcxMTQgZHJpdmVyLiAqLworCQkJaXR2LT52NGwyX2NhcCAmPSB+KFY0TDJfQ0FQX1NMSUNFRF9WQklfQ0FQVFVSRXxWNEwyX0NBUF9WQklfQ0FQVFVSRSk7CisJCX0KKwkJZWxzZSB7CisJCQlpdHYtPmh3X2ZsYWdzIHw9IElWVFZfSFdfU0FBNzExNTsKKwkJfQorCQlpdHYtPnZiaS5yYXdfZGVjb2Rlcl9saW5lX3NpemUgPSAxNDQzOworCQlpdHYtPnZiaS5yYXdfZGVjb2Rlcl9zYXZfb2RkX2ZpZWxkID0gMHgyNTsKKwkJaXR2LT52YmkucmF3X2RlY29kZXJfc2F2X2V2ZW5fZmllbGQgPSAweDYyOworCQlpdHYtPnZiaS5zbGljZWRfZGVjb2Rlcl9saW5lX3NpemUgPSA1MTsKKwkJaXR2LT52Ymkuc2xpY2VkX2RlY29kZXJfc2F2X29kZF9maWVsZCA9IDB4QUI7CisJCWl0di0+dmJpLnNsaWNlZF9kZWNvZGVyX3Nhdl9ldmVuX2ZpZWxkID0gMHhFQzsKKwl9CisKKwlpZiAoaHcgJiBJVlRWX0hXX1NBQTcxN1gpIHsKKwkJaXR2LT52YmkucmF3X2RlY29kZXJfbGluZV9zaXplID0gMTQ0MzsKKwkJaXR2LT52YmkucmF3X2RlY29kZXJfc2F2X29kZF9maWVsZCA9IDB4MjU7CisJCWl0di0+dmJpLnJhd19kZWNvZGVyX3Nhdl9ldmVuX2ZpZWxkID0gMHg2MjsKKwkJaXR2LT52Ymkuc2xpY2VkX2RlY29kZXJfbGluZV9zaXplID0gNTE7CisJCWl0di0+dmJpLnNsaWNlZF9kZWNvZGVyX3Nhdl9vZGRfZmllbGQgPSAweEFCOworCQlpdHYtPnZiaS5zbGljZWRfZGVjb2Rlcl9zYXZfZXZlbl9maWVsZCA9IDB4RUM7CisJfQorfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBpdnR2X3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpkZXYsCisJCQkJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBjaV9pZCkKK3sKKwlpbnQgcmV0dmFsID0gMDsKKwlpbnQgdmlkZW9faW5wdXQ7CisJaW50IHl1dl9idWZfc2l6ZTsKKwlpbnQgdmJpX2J1Zl9zaXplOworCWludCBmd19yZXRyeV9jb3VudCA9IDM7CisJc3RydWN0IGl2dHYgKml0djsKKwlzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgdmY7CisKKwlzcGluX2xvY2soJml2dHZfY2FyZHNfbG9jayk7CisKKwkvKiBNYWtlIHN1cmUgd2UndmUgZ290IGEgcGxhY2UgZm9yIHRoaXMgY2FyZCAqLworCWlmIChpdnR2X2NhcmRzX2FjdGl2ZSA9PSBJVlRWX01BWF9DQVJEUykgeworCQlwcmludGsoS0VSTl9FUlIgIml2dHY6ICBNYXhpbXVtIG51bWJlciBvZiBjYXJkcyBkZXRlY3RlZCAoJWQpLlxuIiwKKwkJCSAgICAgIGl2dHZfY2FyZHNfYWN0aXZlKTsKKwkJc3Bpbl91bmxvY2soJml2dHZfY2FyZHNfbG9jayk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWl0diA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpdnR2KSwgR0ZQX0FUT01JQyk7CisJaWYgKGl0diA9PSAwKSB7CisJCXNwaW5fdW5sb2NrKCZpdnR2X2NhcmRzX2xvY2spOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJaXZ0dl9jYXJkc1tpdnR2X2NhcmRzX2FjdGl2ZV0gPSBpdHY7CisJaXR2LT5kZXYgPSBkZXY7CisJaXR2LT5udW0gPSBpdnR2X2NhcmRzX2FjdGl2ZSsrOworCXNucHJpbnRmKGl0di0+bmFtZSwgc2l6ZW9mKGl0di0+bmFtZSkgLSAxLCAiaXZ0diVkIiwgaXR2LT5udW0pOworCWlmIChpdHYtPm51bSkgeworCQlwcmludGsoS0VSTl9JTkZPICJpdnR2OiAgPT09PT09PT09PT09PT09PT09PT09PSAgTkVYVCBDQVJEICA9PT09PT09PT09PT09PT09PT09PT09XG4iKTsKKwl9CisKKwlzcGluX3VubG9jaygmaXZ0dl9jYXJkc19sb2NrKTsKKworCWl2dHZfcHJvY2Vzc19vcHRpb25zKGl0dik7CisJaWYgKGl0di0+b3B0aW9ucy5jYXJkdHlwZSA9PSAtMSkgeworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIGVycjsKKwl9CisJaWYgKGl2dHZfaW5pdF9zdHJ1Y3QxKGl0dikpIHsKKwkJcmV0dmFsID0gLUVOT01FTTsKKwkJZ290byBlcnI7CisJfQorCisJSVZUVl9ERUJVR19JTkZPKCJiYXNlIGFkZHI6IDB4JTA4eFxuIiwgaXR2LT5iYXNlX2FkZHIpOworCisJLyogUENJIERldmljZSBTZXR1cCAqLworCWlmICgocmV0dmFsID0gaXZ0dl9zZXR1cF9wY2koaXR2LCBkZXYsIHBjaV9pZCkpICE9IDApIHsKKwkJaWYgKHJldHZhbCA9PSAtRUlPKQorCQkJZ290byBmcmVlX3dvcmtxdWV1ZTsKKwkJZWxzZSBpZiAocmV0dmFsID09IC1FTlhJTykKKwkJCWdvdG8gZnJlZV9tZW07CisJfQorCS8qIHNhdmUgaXR2IGluIHRoZSBwY2kgc3RydWN0IGZvciBsYXRlciB1c2UgKi8KKwlwY2lfc2V0X2RydmRhdGEoZGV2LCBpdHYpOworCisJLyogbWFwIGlvIG1lbW9yeSAqLworCUlWVFZfREVCVUdfSU5GTygiYXR0ZW1wdGluZyBpb3JlbWFwIGF0IDB4JTA4eCBsZW4gMHglMDh4XG4iLAorCQkgICBpdHYtPmJhc2VfYWRkciArIElWVFZfRU5DT0RFUl9PRkZTRVQsIElWVFZfRU5DT0RFUl9TSVpFKTsKKwlpdHYtPmVuY19tZW0gPSBpb3JlbWFwX25vY2FjaGUoaXR2LT5iYXNlX2FkZHIgKyBJVlRWX0VOQ09ERVJfT0ZGU0VULAorCQkJCSAgICAgICBJVlRWX0VOQ09ERVJfU0laRSk7CisJaWYgKCFpdHYtPmVuY19tZW0pIHsKKwkJSVZUVl9FUlIoImlvcmVtYXAgZmFpbGVkLCBwZXJoYXBzIGluY3JlYXNpbmcgX19WTUFMTE9DX1JFU0VSVkUgaW4gcGFnZS5oXG4iKTsKKwkJSVZUVl9FUlIoIm9yIGRpc2FibGluZyBDT05GSUdfSElNRU00RyBpbnRvIHRoZSBrZXJuZWwgd291bGQgaGVscFxuIik7CisJCXJldHZhbCA9IC1FTk9NRU07CisJCWdvdG8gZnJlZV9tZW07CisJfQorCisJaWYgKGl0di0+aGFzX2N4MjM0MTUpIHsKKwkJSVZUVl9ERUJVR19JTkZPKCJhdHRlbXB0aW5nIGlvcmVtYXAgYXQgMHglMDh4IGxlbiAweCUwOHhcbiIsCisJCQkJaXR2LT5iYXNlX2FkZHIgKyBJVlRWX0RFQ09ERVJfT0ZGU0VULCBJVlRWX0RFQ09ERVJfU0laRSk7CisJCWl0di0+ZGVjX21lbSA9IGlvcmVtYXBfbm9jYWNoZShpdHYtPmJhc2VfYWRkciArIElWVFZfREVDT0RFUl9PRkZTRVQsCisJCQkJSVZUVl9ERUNPREVSX1NJWkUpOworCQlpZiAoIWl0di0+ZGVjX21lbSkgeworCQkJSVZUVl9FUlIoImlvcmVtYXAgZmFpbGVkLCBwZXJoYXBzIGluY3JlYXNpbmcgX19WTUFMTE9DX1JFU0VSVkUgaW4gcGFnZS5oXG4iKTsKKwkJCUlWVFZfRVJSKCJvciBkaXNhYmxpbmcgQ09ORklHX0hJTUVNNEcgaW50byB0aGUga2VybmVsIHdvdWxkIGhlbHBcbiIpOworCQkJcmV0dmFsID0gLUVOT01FTTsKKwkJCWdvdG8gZnJlZV9tZW07CisJCX0KKwl9CisJZWxzZSB7CisJCWl0di0+ZGVjX21lbSA9IGl0di0+ZW5jX21lbTsKKwl9CisKKwkvKiBtYXAgcmVnaXN0ZXJzIG1lbW9yeSAqLworCUlWVFZfREVCVUdfSU5GTygiYXR0ZW1wdGluZyBpb3JlbWFwIGF0IDB4JTA4eCBsZW4gMHglMDh4XG4iLAorCQkgICBpdHYtPmJhc2VfYWRkciArIElWVFZfUkVHX09GRlNFVCwgSVZUVl9SRUdfU0laRSk7CisJaXR2LT5yZWdfbWVtID0KKwkgICAgaW9yZW1hcF9ub2NhY2hlKGl0di0+YmFzZV9hZGRyICsgSVZUVl9SRUdfT0ZGU0VULCBJVlRWX1JFR19TSVpFKTsKKwlpZiAoIWl0di0+cmVnX21lbSkgeworCQlJVlRWX0VSUigiaW9yZW1hcCBmYWlsZWQsIHBlcmhhcHMgaW5jcmVhc2luZyBfX1ZNQUxMT0NfUkVTRVJWRSBpbiBwYWdlLmhcbiIpOworCQlJVlRWX0VSUigib3IgZGlzYWJsaW5nIENPTkZJR19ISU1FTTRHIGludG8gdGhlIGtlcm5lbCB3b3VsZCBoZWxwXG4iKTsKKwkJcmV0dmFsID0gLUVOT01FTTsKKwkJZ290byBmcmVlX2lvOworCX0KKworCXdoaWxlICgtLWZ3X3JldHJ5X2NvdW50ID4gMCkgeworCQkvKiBsb2FkIGZpcm13YXJlICovCisJCWlmIChpdnR2X2Zpcm13YXJlX2luaXQoaXR2KSA9PSAwKQorCQkJYnJlYWs7CisJCWlmIChmd19yZXRyeV9jb3VudCA+IDEpCisJCQlJVlRWX1dBUk4oIlJldHJ5IGxvYWRpbmcgZmlybXdhcmVcbiIpOworCX0KKwlpZiAoZndfcmV0cnlfY291bnQgPT0gMCkgeworCQlJVlRWX0VSUigiRXJyb3IgaW5pdGlhbGl6aW5nIGZpcm13YXJlXG4iKTsKKwkJZ290byBmcmVlX2kyYzsKKwl9CisKKwkvKiBUcnkgYW5kIGdldCBmaXJtd2FyZSB2ZXJzaW9ucyAqLworCUlWVFZfREVCVUdfSU5GTygiR2V0dGluZyBmaXJtd2FyZSB2ZXJzaW9uLi5cbiIpOworCWl2dHZfZmlybXdhcmVfdmVyc2lvbnMoaXR2KTsKKworCS8qIENoZWNrIHl1diBvdXRwdXQgZmlsdGVyIHRhYmxlICovCisJaWYgKGl0di0+aGFzX2N4MjM0MTUpIGl2dHZfeXV2X2ZpbHRlcl9jaGVjayhpdHYpOworCisJaXZ0dl9ncGlvX2luaXQoaXR2KTsKKworCS8qIGFjdGl2ZSBpMmMgICovCisJSVZUVl9ERUJVR19JTkZPKCJhY3RpdmF0aW5nIGkyYy4uLlxuIik7CisJaWYgKGluaXRfaXZ0dl9pMmMoaXR2KSkgeworCQlJVlRWX0VSUigiQ291bGQgbm90IGluaXRpYWxpemUgaTJjXG4iKTsKKwkJZ290byBmcmVlX2lycTsKKwl9CisKKwlJVlRWX0RFQlVHX0lORk8oIkFjdGl2ZSBjYXJkIGNvdW50OiAlZC5cbiIsIGl2dHZfY2FyZHNfYWN0aXZlKTsKKworCWlmIChpdHYtPmNhcmQtPmh3X2FsbCAmIElWVFZfSFdfVFZFRVBST00pIHsKKyNpZmRlZiBDT05GSUdfVklERU9fVFZFRVBST01fTU9EVUxFCisJCWl2dHZfcmVxdWVzdF9tb2R1bGUoaXR2LCAidHZlZXByb20iKTsKKyNlbmRpZgorCQkvKiBCYXNlZCBvbiB0aGUgbW9kZWwgbnVtYmVyIHRoZSBjYXJkdHlwZSBtYXkgYmUgY2hhbmdlZC4KKwkJICAgVGhlIFBDSSBJRHMgYXJlIG5vdCBhbHdheXMgcmVsaWFibGUuICovCisJCWl2dHZfcHJvY2Vzc19lZXByb20oaXR2KTsKKwl9CisKKwlpZiAoaXR2LT5zdGQgPT0gMCkgeworCQlpdHYtPnN0ZCA9IFY0TDJfU1REX05UU0NfTTsKKwl9CisKKwlpZiAoaXR2LT5vcHRpb25zLnR1bmVyID09IC0xKSB7CisJCWludCBpOworCisJCWZvciAoaSA9IDA7IGkgPCBJVlRWX0NBUkRfTUFYX1RVTkVSUzsgaSsrKSB7CisJCQlpZiAoKGl0di0+c3RkICYgaXR2LT5jYXJkLT50dW5lcnNbaV0uc3RkKSA9PSAwKQorCQkJCWNvbnRpbnVlOworCQkJaXR2LT5vcHRpb25zLnR1bmVyID0gaXR2LT5jYXJkLT50dW5lcnNbaV0udHVuZXI7CisJCQlicmVhazsKKwkJfQorCX0KKwkvKiBpZiBubyB0dW5lciB3YXMgZm91bmQsIHRoZW4gcGljayB0aGUgZmlyc3QgdHVuZXIgaW4gdGhlIGNhcmQgbGlzdCAqLworCWlmIChpdHYtPm9wdGlvbnMudHVuZXIgPT0gLTEgJiYgaXR2LT5jYXJkLT50dW5lcnNbMF0uc3RkKSB7CisJCWl0di0+c3RkID0gaXR2LT5jYXJkLT50dW5lcnNbMF0uc3RkOworCQlpdHYtPm9wdGlvbnMudHVuZXIgPSBpdHYtPmNhcmQtPnR1bmVyc1swXS50dW5lcjsKKwl9CisJaWYgKGl0di0+b3B0aW9ucy5yYWRpbyA9PSAtMSkKKwkJaXR2LT5vcHRpb25zLnJhZGlvID0gKGl0di0+Y2FyZC0+cmFkaW9faW5wdXQuYXVkaW9fdHlwZSAhPSAwKTsKKworCS8qIFRoZSBjYXJkIGlzIG5vdyBmdWxseSBpZGVudGlmaWVkLCBjb250aW51ZSB3aXRoIGNhcmQtc3BlY2lmaWMKKwkgICBpbml0aWFsaXphdGlvbi4gKi8KKwlpdnR2X2luaXRfc3RydWN0MihpdHYpOworCisJaXZ0dl9sb2FkX2FuZF9pbml0X21vZHVsZXMoaXR2KTsKKworCWlmIChpdHYtPnN0ZCAmIFY0TDJfU1REXzUyNV82MCkgeworCQlpdHYtPmlzXzYwaHogPSAxOworCQlpdHYtPmlzX291dF82MGh6ID0gMTsKKwl9IGVsc2UgeworCQlpdHYtPmlzXzUwaHogPSAxOworCQlpdHYtPmlzX291dF81MGh6ID0gMTsKKwl9CisJaXR2LT5wYXJhbXMudmlkZW9fZ29wX3NpemUgPSBpdHYtPmlzXzYwaHogPyAxNSA6IDEyOworCisJaXR2LT5zdHJlYW1fYnVmX3NpemVbSVZUVl9FTkNfU1RSRUFNX1RZUEVfTVBHXSA9IDB4MDgwMDA7CisJaXR2LT5zdHJlYW1fYnVmX3NpemVbSVZUVl9FTkNfU1RSRUFNX1RZUEVfUENNXSA9IDB4MDEyMDA7CisJaXR2LT5zdHJlYW1fYnVmX3NpemVbSVZUVl9ERUNfU1RSRUFNX1RZUEVfTVBHXSA9IDB4MTAwMDA7CisKKwkvKiAweDE1MTgwID09IDcyMCAqIDQ4MCAvIDQsIDB4MTk1MDAgPT0gNzIwICogNTc2IC8gNCAqLworCXl1dl9idWZfc2l6ZSA9IGl0di0+aXNfNjBoeiA/IDB4MTUxODAgOiAweDE5NTAwOworCWl0di0+c3RyZWFtX2J1Zl9zaXplW0lWVFZfREVDX1NUUkVBTV9UWVBFX1lVVl0gPSB5dXZfYnVmX3NpemUgLyAyOworCWl0di0+c3RyZWFtX2J1Zl9zaXplW0lWVFZfRU5DX1NUUkVBTV9UWVBFX1lVVl0gPSB5dXZfYnVmX3NpemUgLyA4OworCisJLyogU2V0dXAgVkJJIFJhdyBTaXplLiBTaG91bGQgYmUgYmlnIGVub3VnaCB0byBob2xkIFBBTC4KKwkgICBJdCBpcyBwb3NzaWJsZSB0byBzd2l0Y2ggYmV0d2VlbiBQQUwgYW5kIE5UU0MsIHNvIHdlIG5lZWQgdG8KKwkgICB0YWtlIHRoZSBsYXJnZXN0IHNpemUgaGVyZS4gKi8KKwkvKiAxNDU2IGlzIG11bHRpcGxlIG9mIDE2LCByZWFsIHNpemUgPSAxNDQ0ICovCisJaXR2LT52YmkucmF3X3NpemUgPSAxNDU2OworCS8qIFdlIHVzZSBhIGJ1ZmZlciBzaXplIG9mIDEvMiBvZiB0aGUgdG90YWwgc2l6ZSBuZWVkZWQgZm9yIGEKKwkgICBmcmFtZS4gVGhpcyBpcyBhY3R1YWxseSB2ZXJ5IHVzZWZ1bCwgc2luY2Ugd2Ugbm93IHJlY2VpdmUKKwkgICBhIGZpZWxkIGF0IGEgdGltZSBhbmQgdGhhdCBtYWtlcyAnY29tcHJlc3NpbmcnIHRoZSByYXcgZGF0YQorCSAgIGRvd24gdG8gc2l6ZSBieSBzdHJpcHBpbmcgb2ZmIHRoZSBTQVYgY29kZXMgYSBsb3QgZWFzaWVyLgorCSAgIE5vdGU6IGhhdmluZyB0d28gZGlmZmVyZW50IGJ1ZmZlciBzaXplcyBwcmV2ZW50cyBzdGFuZGFyZAorCSAgIHN3aXRjaGluZyBvbiB0aGUgZmx5LiBXZSBuZWVkIHRvIGZpbmQgYSBiZXR0ZXIgc29sdXRpb24uLi4gKi8KKwl2YmlfYnVmX3NpemUgPSBpdHYtPnZiaS5yYXdfc2l6ZSAqIChpdHYtPmlzXzYwaHogPyAyNCA6IDM2KSAvIDI7CisJaXR2LT5zdHJlYW1fYnVmX3NpemVbSVZUVl9FTkNfU1RSRUFNX1RZUEVfVkJJXSA9IHZiaV9idWZfc2l6ZTsKKwlpdHYtPnN0cmVhbV9idWZfc2l6ZVtJVlRWX0RFQ19TVFJFQU1fVFlQRV9WQkldID0gc2l6ZW9mKHN0cnVjdCB2NGwyX3NsaWNlZF92YmlfZGF0YSkgKiAzNjsKKworCWlmIChpdHYtPm9wdGlvbnMucmFkaW8gPiAwKQorCQlpdHYtPnY0bDJfY2FwIHw9IFY0TDJfQ0FQX1JBRElPOworCisJaWYgKGl0di0+b3B0aW9ucy50dW5lciA+IC0xKSB7CisJCXN0cnVjdCB0dW5lcl9zZXR1cCBzZXR1cDsKKworCQlzZXR1cC5hZGRyID0gQUREUl9VTlNFVDsKKwkJc2V0dXAudHlwZSA9IGl0di0+b3B0aW9ucy50dW5lcjsKKwkJc2V0dXAubW9kZV9tYXNrID0gVF9BTkFMT0dfVFY7ICAvKiBtYXRjaGVzIFRWIHR1bmVycyAqLworI2lmZGVmIEhBVkVfWEMzMDI4CisJCXNldHVwLmluaXRtb2RlID0gVjRMMl9UVU5FUl9BTkFMT0dfVFY7CisJCWlmIChpdHYtPm9wdGlvbnMudHVuZXIgPT0gVFVORVJfWENFSVZFX1hDMzAyOCkgeworCQkJc2V0dXAuZ3Bpb193cml0ZSA9IGl2dHZfcmVzZXRfdHVuZXJfZ3BpbzsKKwkJCXNldHVwLmdwaW9fcHJpdiA9IGl0djsKKwkJfQorI2VuZGlmCisJCWl2dHZfY2FsbF9pMmNfY2xpZW50cyhpdHYsIFRVTkVSX1NFVF9UWVBFX0FERFIsICZzZXR1cCk7CisJfQorCisJdmYudHVuZXIgPSAwOworCXZmLnR5cGUgPSBWNEwyX1RVTkVSX0FOQUxPR19UVjsKKwl2Zi5mcmVxdWVuY3kgPSA2NDAwOyAvKiB0aGUgdHVuZXIgJ2Jhc2VsaW5lJyBmcmVxdWVuY3kgKi8KKwlpZiAoaXR2LT5zdGQgJiBWNEwyX1NURF9OVFNDX00pIHsKKwkJLyogV2h5IG9uIGVhcnRoPyAqLworCQl2Zi5mcmVxdWVuY3kgPSAxMDc2OwkvKiBjaC4gNCA2NzI1MCoxNi8xMDAwICovCisJfQorCisJLyogVGhlIHR1bmVyIGlzIGZpeGVkIHRvIHRoZSBzdGFuZGFyZC4gVGhlIG90aGVyIGlucHV0cyAoZS5nLiBTLVZpZGVvKQorCSAgIGFyZSBub3QuICovCisJaXR2LT50dW5lcl9zdGQgPSBpdHYtPnN0ZDsKKworCXZpZGVvX2lucHV0ID0gaXR2LT5hY3RpdmVfaW5wdXQ7CisJaXR2LT5hY3RpdmVfaW5wdXQrKzsJLyogRm9yY2UgdXBkYXRlIG9mIGlucHV0ICovCisJaXZ0dl92NGwyX2lvY3RscyhpdHYsIE5VTEwsIFZJRElPQ19TX0lOUFVULCAmdmlkZW9faW5wdXQpOworCisJLyogTGV0IHRoZSBWSURJT0NfU19TVEQgaW9jdGwgZG8gYWxsIHRoZSB3b3JrLCBrZWVwcyB0aGUgY29kZQorCSAgIGluIG9uZSBwbGFjZS4gKi8KKwlpdHYtPnN0ZCsrOwkJLyogRm9yY2UgZnVsbCBzdGFuZGFyZCBpbml0aWFsaXphdGlvbiAqLworCWl0di0+c3RkX291dCA9IGl0di0+c3RkOworCWl2dHZfdjRsMl9pb2N0bHMoaXR2LCBOVUxMLCBWSURJT0NfU19GUkVRVUVOQ1ksICZ2Zik7CisKKwlyZXR2YWwgPSBpdnR2X3N0cmVhbXNfc2V0dXAoaXR2KTsKKwlpZiAocmV0dmFsKSB7CisJCUlWVFZfRVJSKCJFcnJvciAlZCBzZXR0aW5nIHVwIHN0cmVhbXNcbiIsIHJldHZhbCk7CisJCWdvdG8gZnJlZV9pMmM7CisJfQorCisJaWYgKGl0di0+Y2FyZC0+djRsMl9jYXBhYmlsaXRpZXMgJiBWNEwyX0NBUF9WSURFT19PVVRQVVQpIHsKKwkJaXZ0dl9pbml0X21wZWdfZGVjb2RlcihpdHYpOworCX0KKwlpdnR2X3Y0bDJfaW9jdGxzKGl0diwgTlVMTCwgVklESU9DX1NfU1RELCAmaXR2LT50dW5lcl9zdGQpOworCisJSVZUVl9ERUJVR19JUlEoIk1hc2tpbmcgaW50ZXJydXB0c1xuIik7CisJLyogY2xlYXIgaW50ZXJydXB0IG1hc2ssIGVmZmVjdGl2ZWx5IGRpc2FibGluZyBpbnRlcnJ1cHRzICovCisJaXZ0dl9zZXRfaXJxX21hc2soaXR2LCAweGZmZmZmZmZmKTsKKworCS8qIFJlZ2lzdGVyIElSUSAqLworCXJldHZhbCA9IHJlcXVlc3RfaXJxKGl0di0+ZGV2LT5pcnEsIGl2dHZfaXJxX2hhbmRsZXIsCisJCQkgICAgIElSUUZfU0hBUkVEIHwgSVJRRl9ESVNBQkxFRCwgaXR2LT5uYW1lLCAodm9pZCAqKWl0dik7CisJaWYgKHJldHZhbCkgeworCQlJVlRWX0VSUigiRmFpbGVkIHRvIHJlZ2lzdGVyIGlycSAlZFxuIiwgcmV0dmFsKTsKKwkJZ290byBmcmVlX3N0cmVhbXM7CisJfQorCisJLyogT24gYSBjeDIzNDE2IHRoaXMgc2VlbXMgdG8gYmUgYWJsZSB0byBlbmFibGUgRE1BIHRvIHRoZSBjaGlwPyAqLworCWlmICghaXR2LT5oYXNfY3gyMzQxNSkKKwkJd3JpdGVfcmVnX3N5bmMoMHgwMywgSVZUVl9SRUdfRE1BQ09OVFJPTCk7CisKKwkvKiBEZWZhdWx0IGludGVycnVwdHMgZW5hYmxlZC4gRm9yIHRoZSBQVlIzNTAgdGhpcyBpbmNsdWRlcyB0aGUKKwkgICBkZWNvZGVyIFZTWU5DIGludGVycnVwdCwgd2hpY2ggaXMgYWx3YXlzIG9uLiBJdCBpcyBub3Qgb25seSB1c2VkCisJICAgZHVyaW5nIGRlY29kaW5nIGJ1dCBhbHNvIGJ5IHRoZSBPU0QuCisJICAgU29tZSBvbGQgUFZSMjUwIGNhcmRzIGhhZCBhIGN4MjM0MTUsIHNvIHRlc3RpbmcgZm9yIHRoYXQgaXMgdG9vCisJICAgZ2VuZXJhbC4gSW5zdGVhZCB0ZXN0IGlmIHRoZSBjYXJkIGhhcyB2aWRlbyBvdXRwdXQgY2FwYWJpbGl0eS4gKi8KKwlpZiAoaXR2LT52NGwyX2NhcCAmIFY0TDJfQ0FQX1ZJREVPX09VVFBVVCkKKwkJaXZ0dl9jbGVhcl9pcnFfbWFzayhpdHYsIElWVFZfSVJRX01BU0tfSU5JVCB8IElWVFZfSVJRX0RFQ19WU1lOQyk7CisJZWxzZQorCQlpdnR2X2NsZWFyX2lycV9tYXNrKGl0diwgSVZUVl9JUlFfTUFTS19JTklUKTsKKworCWlmIChpdHYtPmhhc19jeDIzNDE1KQorCQlpdnR2X3NldF9vc2RfYWxwaGEoaXR2KTsKKworCUlWVFZfSU5GTygiSW5pdGlhbGl6ZWQgJXMsIGNhcmQgIyVkXG4iLCBpdHYtPmNhcmRfbmFtZSwgaXR2LT5udW0pOworCisJcmV0dXJuIDA7CisKKyAgICAgIGZyZWVfaXJxOgorCWZyZWVfaXJxKGl0di0+ZGV2LT5pcnEsICh2b2lkICopaXR2KTsKKyAgICAgIGZyZWVfc3RyZWFtczoKKwlpdnR2X3N0cmVhbXNfY2xlYW51cChpdHYpOworICAgICAgZnJlZV9pMmM6CisJZXhpdF9pdnR2X2kyYyhpdHYpOworICAgICAgZnJlZV9pbzoKKwlpdnR2X2lvdW5tYXAoaXR2KTsKKyAgICAgIGZyZWVfbWVtOgorCXJlbGVhc2VfbWVtX3JlZ2lvbihpdHYtPmJhc2VfYWRkciwgSVZUVl9FTkNPREVSX1NJWkUpOworCXJlbGVhc2VfbWVtX3JlZ2lvbihpdHYtPmJhc2VfYWRkciArIElWVFZfUkVHX09GRlNFVCwgSVZUVl9SRUdfU0laRSk7CisJaWYgKGl0di0+aGFzX2N4MjM0MTUpCisJCXJlbGVhc2VfbWVtX3JlZ2lvbihpdHYtPmJhc2VfYWRkciArIElWVFZfREVDT0RFUl9PRkZTRVQsIElWVFZfREVDT0RFUl9TSVpFKTsKKyAgICAgIGZyZWVfd29ya3F1ZXVlOgorCWRlc3Ryb3lfd29ya3F1ZXVlKGl0di0+aXJxX3dvcmtfcXVldWVzKTsKKyAgICAgIGVycjoKKwlpZiAocmV0dmFsID09IDApCisJCXJldHZhbCA9IC1FTk9ERVY7CisJSVZUVl9FUlIoIkVycm9yICVkIG9uIGluaXRpYWxpemF0aW9uXG4iLCByZXR2YWwpOworCisJa2ZyZWUoaXZ0dl9jYXJkc1tpdnR2X2NhcmRzX2FjdGl2ZV0pOworCWl2dHZfY2FyZHNbaXZ0dl9jYXJkc19hY3RpdmVdID0gTlVMTDsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdm9pZCBpdnR2X3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldikKK3sKKwlzdHJ1Y3QgaXZ0diAqaXR2ID0gcGNpX2dldF9kcnZkYXRhKHBjaV9kZXYpOworCisJSVZUVl9ERUJVR19JTkZPKCJSZW1vdmluZyBDYXJkICMlZC5cbiIsIGl0di0+bnVtKTsKKworCS8qIFN0b3AgYWxsIGNhcHR1cmVzICovCisJSVZUVl9ERUJVR19JTkZPKCIgU3RvcHBpbmcgYWxsIHN0cmVhbXMuXG4iKTsKKwlpZiAoYXRvbWljX3JlYWQoJml0di0+Y2FwdHVyaW5nKSA+IDApCisJCWl2dHZfc3RvcF9hbGxfY2FwdHVyZXMoaXR2KTsKKworCS8qIFN0b3AgYWxsIGRlY29kaW5nICovCisJSVZUVl9ERUJVR19JTkZPKCIgU3RvcHBpbmcgZGVjb2RpbmcuXG4iKTsKKwlpZiAoYXRvbWljX3JlYWQoJml0di0+ZGVjb2RpbmcpID4gMCkgeworCQlpbnQgdHlwZTsKKworCQlpZiAodGVzdF9iaXQoSVZUVl9GX0lfREVDX1lVViwgJml0di0+aV9mbGFncykpCisJCQl0eXBlID0gSVZUVl9ERUNfU1RSRUFNX1RZUEVfWVVWOworCQllbHNlCisJCQl0eXBlID0gSVZUVl9ERUNfU1RSRUFNX1RZUEVfTVBHOworCQlpdnR2X3N0b3BfdjRsMl9kZWNvZGVfc3RyZWFtKCZpdHYtPnN0cmVhbXNbdHlwZV0sCisJCQlWSURFT19DTURfU1RPUF9UT19CTEFDSyB8IFZJREVPX0NNRF9TVE9QX0lNTUVESUFURUxZLCAwKTsKKwl9CisKKwkvKiBJbnRlcnJ1cHRzICovCisJSVZUVl9ERUJVR19JTkZPKCIgRGlzYWJsaW5nIGludGVycnVwdHMuXG4iKTsKKwlpdnR2X3NldF9pcnFfbWFzayhpdHYsIDB4ZmZmZmZmZmYpOworCWRlbF90aW1lcl9zeW5jKCZpdHYtPmRtYV90aW1lcik7CisKKwkvKiBTdG9wIGFsbCBXb3JrIFF1ZXVlcyAqLworCUlWVFZfREVCVUdfSU5GTygiIFN0b3AgV29yayBRdWV1ZXMuXG4iKTsKKwlmbHVzaF93b3JrcXVldWUoaXR2LT5pcnFfd29ya19xdWV1ZXMpOworCWRlc3Ryb3lfd29ya3F1ZXVlKGl0di0+aXJxX3dvcmtfcXVldWVzKTsKKworCUlWVFZfREVCVUdfSU5GTygiIFN0b3BwaW5nIEZpcm13YXJlLlxuIik7CisJaXZ0dl9oYWx0X2Zpcm13YXJlKGl0dik7CisKKwlJVlRWX0RFQlVHX0lORk8oIiBVbnJlZ2lzdGVyaW5nIHY0bCBkZXZpY2VzLlxuIik7CisJaXZ0dl9zdHJlYW1zX2NsZWFudXAoaXR2KTsKKwlJVlRWX0RFQlVHX0lORk8oIiBGcmVlaW5nIGRtYSByZXNvdXJjZXMuXG4iKTsKKwlpdnR2X3VkbWFfZnJlZShpdHYpOworCisJZXhpdF9pdnR2X2kyYyhpdHYpOworCisJSVZUVl9ERUJVR19JTkZPKCIgUmVsZWFzaW5nIGlycS5cbiIpOworCWZyZWVfaXJxKGl0di0+ZGV2LT5pcnEsICh2b2lkICopaXR2KTsKKworCWlmIChpdHYtPmRldikgeworCQlpdnR2X2lvdW5tYXAoaXR2KTsKKwl9CisKKwlJVlRWX0RFQlVHX0lORk8oIiBSZWxlYXNpbmcgbWVtLlxuIik7CisJcmVsZWFzZV9tZW1fcmVnaW9uKGl0di0+YmFzZV9hZGRyLCBJVlRWX0VOQ09ERVJfU0laRSk7CisJcmVsZWFzZV9tZW1fcmVnaW9uKGl0di0+YmFzZV9hZGRyICsgSVZUVl9SRUdfT0ZGU0VULCBJVlRWX1JFR19TSVpFKTsKKwlpZiAoaXR2LT5oYXNfY3gyMzQxNSkKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKGl0di0+YmFzZV9hZGRyICsgSVZUVl9ERUNPREVSX09GRlNFVCwgSVZUVl9ERUNPREVSX1NJWkUpOworCisJcGNpX2Rpc2FibGVfZGV2aWNlKGl0di0+ZGV2KTsKKworCUlWVFZfSU5GTygiUmVtb3ZlZCAlcywgY2FyZCAjJWRcbiIsIGl0di0+Y2FyZF9uYW1lLCBpdHYtPm51bSk7Cit9CisKKy8qIGRlZmluZSBhIHBjaV9kcml2ZXIgZm9yIGNhcmQgZGV0ZWN0aW9uICovCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgaXZ0dl9wY2lfZHJpdmVyID0geworICAgICAgLm5hbWUgPSAgICAgIml2dHYiLAorICAgICAgLmlkX3RhYmxlID0gaXZ0dl9wY2lfdGJsLAorICAgICAgLnByb2JlID0gICAgaXZ0dl9wcm9iZSwKKyAgICAgIC5yZW1vdmUgPSAgIGl2dHZfcmVtb3ZlLAorfTsKKworc3RhdGljIGludCBtb2R1bGVfc3RhcnQodm9pZCkKK3sKKwlwcmludGsoS0VSTl9JTkZPICJpdnR2OiAgPT09PT09PT09PT09PT09PT09PT0gU1RBUlQgSU5JVCBJVlRWID09PT09PT09PT09PT09PT09PT09XG4iKTsKKwlwcmludGsoS0VSTl9JTkZPICJpdnR2OiAgdmVyc2lvbiAlcyAoIiBWRVJNQUdJQ19TVFJJTkcgIikgbG9hZGluZ1xuIiwgSVZUVl9WRVJTSU9OKTsKKworCW1lbXNldChpdnR2X2NhcmRzLCAwLCBzaXplb2YoaXZ0dl9jYXJkcykpOworCisJLyogVmFsaWRhdGUgcGFyYW1ldGVycyAqLworCWlmIChpdnR2X2ZpcnN0X21pbm9yIDwgMCB8fCBpdnR2X2ZpcnN0X21pbm9yID49IElWVFZfTUFYX0NBUkRTKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaXZ0djogIGl2dHZfZmlyc3RfbWlub3IgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kICVkLiBFeGl0aW5nLi4uXG4iLAorCQkgICAgIElWVFZfTUFYX0NBUkRTIC0gMSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoaXZ0dl9kZWJ1ZyA8IDAgfHwgaXZ0dl9kZWJ1ZyA+IDUxMSkgeworCQlpdnR2X2RlYnVnID0gMDsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiaXZ0djogIGRlYnVnIHZhbHVlIG11c3QgYmUgPj0gMCBhbmQgPD0gNTExIVxuIik7CisJfQorCisJaWYgKHBjaV9yZWdpc3Rlcl9kcml2ZXIoJml2dHZfcGNpX2RyaXZlcikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpdnR2OiAgRXJyb3IgZGV0ZWN0aW5nIFBDSSBjYXJkXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXByaW50ayhLRVJOX0lORk8gIml2dHY6ICA9PT09PT09PT09PT09PT09PT09PSAgRU5EIElOSVQgSVZUViAgPT09PT09PT09PT09PT09PT09PT1cbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBtb2R1bGVfY2xlYW51cCh2b2lkKQoreworCWludCBpLCBqOworCisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZpdnR2X3BjaV9kcml2ZXIpOworCisJZm9yIChpID0gMDsgaSA8IGl2dHZfY2FyZHNfYWN0aXZlOyBpKyspIHsKKwkJaWYgKGl2dHZfY2FyZHNbaV0gPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCQlmb3IgKGogPSAwOyBqIDwgSVZUVl9WQklfRlJBTUVTOyBqKyspIHsKKwkJCWtmcmVlKGl2dHZfY2FyZHNbaV0tPnZiaS5zbGljZWRfbXBlZ19kYXRhW2pdKTsKKwkJfQorCQlrZnJlZShpdnR2X2NhcmRzW2ldKTsKKwl9Cit9CisKKy8qIE5vdGU6IFRoZXNlIHN5bWJvbHMgYXJlIGV4cG9ydGVkIGJlY2F1c2UgdGhleSBhcmUgdXNlZCBieSB0aGUgaXZ0di1mYgorICAgZnJhbWVidWZmZXIgbW9kdWxlIGFuZCBhbiBpbmZyYXJlZCBtb2R1bGUgZm9yIHRoZSBJUi1ibGFzdGVyLiAqLworRVhQT1JUX1NZTUJPTChpdnR2X3NldF9pcnFfbWFzayk7CitFWFBPUlRfU1lNQk9MKGl2dHZfY2FyZHNfYWN0aXZlKTsKK0VYUE9SVF9TWU1CT0woaXZ0dl9jYXJkcyk7CitFWFBPUlRfU1lNQk9MKGl2dHZfYXBpKTsKK0VYUE9SVF9TWU1CT0woaXZ0dl92YXBpKTsKK0VYUE9SVF9TWU1CT0woaXZ0dl92YXBpX3Jlc3VsdCk7CitFWFBPUlRfU1lNQk9MKGl2dHZfY2xlYXJfaXJxX21hc2spOworRVhQT1JUX1NZTUJPTChpdnR2X2RlYnVnKTsKK0VYUE9SVF9TWU1CT0woaXZ0dl9yZXNldF9pcl9ncGlvKTsKK0VYUE9SVF9TWU1CT0woaXZ0dl91ZG1hX3NldHVwKTsKK0VYUE9SVF9TWU1CT0woaXZ0dl91ZG1hX3VubWFwKTsKK0VYUE9SVF9TWU1CT0woaXZ0dl91ZG1hX2FsbG9jKTsKK0VYUE9SVF9TWU1CT0woaXZ0dl91ZG1hX3ByZXBhcmUpOworCittb2R1bGVfaW5pdChtb2R1bGVfc3RhcnQpOworbW9kdWxlX2V4aXQobW9kdWxlX2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtZHJpdmVyLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1kcml2ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTQxMmQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtZHJpdmVyLmgKQEAgLTAsMCArMSw4NjggQEAKKy8qCisgICAgaXZ0diBkcml2ZXIgaW50ZXJuYWwgZGVmaW5lcyBhbmQgc3RydWN0dXJlcworICAgIENvcHlyaWdodCAoQykgMjAwMy0yMDA0ICBLZXZpbiBUaGF5ZXIgPG51ZmFuX3dmayBhdCB5YWhvby5jb20+CisgICAgQ29weXJpZ2h0IChDKSAyMDA0ICBDaHJpcyBLZW5uZWR5IDxjQGdyb292eS5vcmc+CisgICAgQ29weXJpZ2h0IChDKSAyMDA1LTIwMDcgIEhhbnMgVmVya3VpbCA8aHZlcmt1aWxAeHM0YWxsLm5sPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpZm5kZWYgSVZUVl9EUklWRVJfSAorI2RlZmluZSBJVlRWX0RSSVZFUl9ICisKKy8qIEludGVybmFsIGhlYWRlciBmb3IgaXZ0diBwcm9qZWN0OgorICogRHJpdmVyIGZvciB0aGUgY3gyMzQxNS82IGNoaXAuCisgKiBBdXRob3I6IEtldmluIFRoYXllciAobnVmYW5fd2ZrIGF0IHlhaG9vLmNvbSkKKyAqIExpY2Vuc2U6IEdQTAorICogaHR0cDovL3d3dy5pdnR2ZHJpdmVyLm9yZworICoKKyAqIC0tLS0tCisgKiBNUEc2MDAvTVBHMTYwIHN1cHBvcnQgYnkgIFQuQWRhY2hpIDx0YWRhY2hpQHRhZGFjaGktbmV0LmNvbT4KKyAqICAgICAgICAgICAgICAgICAgICAgIGFuZCBUYWtlcnUgS09NT1JJWUE8a29tb3JpeWFAcGFrZW4ub3JnPgorICoKKyAqIEFWZXJNZWRpYSBNMTc5IEdQSU8gaW5mbyBieSBDaHJpcyBQaW5raGFtIDxjcGlua2hhbUBiYzJ2YS5vcmc+CisgKiAgICAgICAgICAgICAgICB1c2luZyBpbmZvcm1hdGlvbiBwcm92aWRlZCBieSBKaXVuLUt1ZWkgSnVuZyBAIEFWZXJNZWRpYS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLWFsZ28tYml0Lmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgorI2luY2x1ZGUgPGxpbnV4L2J5dGVvcmRlci9zd2FiLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKyNpbmNsdWRlIDxsaW51eC9kdmIvdmlkZW8uaD4KKyNpbmNsdWRlIDxsaW51eC9kdmIvYXVkaW8uaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgorI2luY2x1ZGUgPG1lZGlhL3R1bmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvY3gyMzQxeC5oPgorCisvKiAjZGVmaW5lIEhBVkVfWEMzMDI4IDEgKi8KKworI2luY2x1ZGUgPG1lZGlhL2l2dHYuaD4KKworI2lmZGVmIENPTkZJR19MSVJDX0kyQworIyAgZXJyb3IgIlRoaXMgZHJpdmVyIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIExJUkMgSTJDIGtlcm5lbCBjb25maWd1cmF0aW9uIG9wdGlvbi4iCisjZW5kaWYgLyogQ09ORklHX0xJUkNfSTJDICovCisKKyNpZm5kZWYgQ09ORklHX1BDSQorIyAgZXJyb3IgIlRoaXMgZHJpdmVyIHJlcXVpcmVzIGtlcm5lbCBQQ0kgc3VwcG9ydC4iCisjZW5kaWYgLyogQ09ORklHX1BDSSAqLworCisjZGVmaW5lIElWVFZfRU5DT0RFUl9PRkZTRVQJMHgwMDAwMDAwMAorI2RlZmluZSBJVlRWX0VOQ09ERVJfU0laRQkweDAwODAwMDAwCS8qIExhc3QgaGFsZiBpc24ndCBuZWVkZWQgMHgwMTAwMDAwMCAqLworCisjZGVmaW5lIElWVFZfREVDT0RFUl9PRkZTRVQJMHgwMTAwMDAwMAorI2RlZmluZSBJVlRWX0RFQ09ERVJfU0laRQkweDAwODAwMDAwCS8qIExhc3QgaGFsZiBpc24ndCBuZWVkZWQgMHgwMTAwMDAwMCAqLworCisjZGVmaW5lIElWVFZfUkVHX09GRlNFVCAJMHgwMjAwMDAwMAorI2RlZmluZSBJVlRWX1JFR19TSVpFCQkweDAwMDEwMDAwCisKKy8qIEJ1ZmZlcnMgb24gaGFyZHdhcmUgb2Zmc2V0cyAqLworI2RlZmluZSBJVlRWX1lVVl9CVUZGRVJfT0ZGU0VUICAgIDB4MDAxYTg2MDAJLyogRmlyc3QgWVVWIEJ1ZmZlciAqLworI2RlZmluZSBJVlRWX1lVVl9CVUZGRVJfT0ZGU0VUXzEgIDB4MDAyNDA0MDAJLyogU2Vjb25kIFlVViBCdWZmZXIgKi8KKyNkZWZpbmUgSVZUVl9ZVVZfQlVGRkVSX09GRlNFVF8yICAweDAwMmQ4MjAwCS8qIFRoaXJkIFlVViBCdWZmZXIgKi8KKyNkZWZpbmUgSVZUVl9ZVVZfQlVGRkVSX09GRlNFVF8zICAweDAwMzcwMDAwCS8qIEZvdXJ0aCBZVVYgQnVmZmVyICovCisjZGVmaW5lIElWVFZfWVVWX0JVRkZFUl9VVl9PRkZTRVQgMHg2NTQwMAkvKiBPZmZzZXQgdG8gVVYgQnVmZmVyICovCisKKy8qIE9mZnNldCB0byBmaWx0ZXIgdGFibGUgaW4gZmlybXdhcmUgKi8KKyNkZWZpbmUgSVZUVl9ZVVZfSE9SSVpPTlRBTF9GSUxURVJfT0ZGU0VUIDB4MDI1ZDgKKyNkZWZpbmUgSVZUVl9ZVVZfVkVSVElDQUxfRklMVEVSX09GRlNFVCAweDAzMzU4CisKK2V4dGVybiBjb25zdCB1MzIgeXV2X29mZnNldFs0XTsKKworLyogTWF4aW11bSBpdnR2IGRyaXZlciBpbnN0YW5jZXMuCisgICBCYXNlZCBvbiA2IFBWUjUwMHMgZWFjaCB3aXRoIHR3byBQVlIxNXMuLi4KKyAgIFRPRE86IG1ha2UgdGhpcyBkeW5hbWljLiBJIGJlbGlldmUgaXQgaXMgb25seSBhIGdsb2JhbCBpbiBvcmRlciB0byBzdXBwb3J0CisgICAgaXZ0di1mYi4gVGhlcmUgbXVzdCBiZSBhIGJldHRlciB3YXkgdG8gZG8gdGhhdC4gKi8KKyNkZWZpbmUgSVZUVl9NQVhfQ0FSRFMgMTIKKworLyogU3VwcG9ydGVkIGNhcmRzICovCisjZGVmaW5lIElWVFZfQ0FSRF9QVlJfMjUwIAkgICAgICAwCS8qIFdpblRWIFBWUiAyNTAgKi8KKyNkZWZpbmUgSVZUVl9DQVJEX1BWUl8zNTAgCSAgICAgIDEJLyogZW5jb2RlciwgZGVjb2RlciwgdHYtb3V0ICovCisjZGVmaW5lIElWVFZfQ0FSRF9QVlJfMTUwIAkgICAgICAyCS8qIFdpblRWIFBWUiAxNTAgYW5kIFBWUiA1MDAgKHJlYWxseSBqdXN0IHR3bworCQkJCQkgICBQVlIxNTBzIG9uIG9uZSBQQ0kgYm9hcmQpICovCisjZGVmaW5lIElWVFZfQ0FSRF9NMTc5ICAgIAkgICAgICAzCS8qIEFWZXJNZWRpYSBNMTc5IChlbmNvZGVyIG9ubHkpICovCisjZGVmaW5lIElWVFZfQ0FSRF9NUEc2MDAgIAkgICAgICA0CS8qIEt1cm91dG9zaGlrb3UgSVRWQzE2LVNUVkxQL1lVQU4gTVBHNjAwLCBlbmNvZGVyIG9ubHkgKi8KKyNkZWZpbmUgSVZUVl9DQVJEX01QRzE2MCAgCSAgICAgIDUJLyogS3Vyb3V0b3NoaWtvdSBJVFZDMTUtU1RWTFAvWVVBTiBNUEcxNjAKKwkJCQkJICAgY3gyMzQxNSBiYXNlZCwgYnV0IGRvZXMgbm90IGhhdmUgdHYtb3V0ICovCisjZGVmaW5lIElWVFZfQ0FSRF9QRzYwMCAJICAgICAgNgkvKiBZVUFOIFBHNjAwL0RJQU1PTkRNTSBQVlItNTUwIGJhc2VkIG9uIHRoZSBDWCBGYWxjb24gMiAqLworI2RlZmluZSBJVlRWX0NBUkRfQVZDMjQxMCAJICAgICAgNwkvKiBBZGFwdGVjIEFWQy0yNDEwICovCisjZGVmaW5lIElWVFZfQ0FSRF9BVkMyMDEwIAkgICAgICA4CS8qIEFkYXB0ZWMgQVZELTIwMTAgKE5vIFR1bmVyKSAqLworI2RlZmluZSBJVlRWX0NBUkRfVEc1MDAwVFYgICAJICAgICAgOSAvKiBOQUdBU0UgVFJBTlNHRUFSIDUwMDBUViwgZW5jb2RlciBvbmx5ICovCisjZGVmaW5lIElWVFZfQ0FSRF9WQTIwMDBNQVhfU05UNiAgICAgMTAgLyogVkEyMDAwTUFYLVNUTjYgKi8KKyNkZWZpbmUgSVZUVl9DQVJEX0NYMjM0MTZHWUMgCSAgICAgMTEgLyogS3Vyb3V0b3NoaWtvdSBDWDIzNDE2R1lDLVNUVkxQIChZdWFuIE1QRzYwMEdSIE9FTSkgKi8KKyNkZWZpbmUgSVZUVl9DQVJEX0dWX01WUFJYICAgCSAgICAgMTIgLyogSS9PIERhdGEgR1YtTVZQL1JYLCBSWDIsIFJYMlcgKi8KKyNkZWZpbmUgSVZUVl9DQVJEX0dWX01WUFJYMkUgCSAgICAgMTMgLyogSS9PIERhdGEgR1YtTVZQL1JYMkUgKi8KKyNkZWZpbmUgSVZUVl9DQVJEX0dPVFZJRVdfUENJX0RWRCAgICAxNAkvKiBHb3RWaWV3IFBDSSBEVkQgKi8KKyNkZWZpbmUgSVZUVl9DQVJEX0dPVFZJRVdfUENJX0RWRDIgICAxNQkvKiBHb3RWaWV3IFBDSSBEVkQyICovCisjZGVmaW5lIElWVFZfQ0FSRF9ZVUFOX01QQzYyMiAgICAgICAgMTYJLyogWXVhbiBNUEM2MjIgbWluaVBDSSAqLworI2RlZmluZSBJVlRWX0NBUkRfRENUTVRWUDEgCSAgICAgMTcgLyogRElHSVRBTCBDT1dCT1kgRENULU1UVlAxICovCisjaWZkZWYgSEFWRV9YQzMwMjgKKyNkZWZpbmUgSVZUVl9DQVJEX1BHNjAwVjIJICAgICAxOCAvKiBZdWFuIFBHNjAwVjIvR290VmlldyBQQ0kgRFZEIExpdGUvQ2x1YjNEIFpBUC1UVjF4MDEgKi8KKyNkZWZpbmUgSVZUVl9DQVJEX0xBU1QgCQkgICAgIDE4CisjZWxzZQorI2RlZmluZSBJVlRWX0NBUkRfTEFTVCAJCSAgICAgMTcKKyNlbmRpZgorCisvKiBWYXJpYW50cyBvZiBleGlzdGluZyBjYXJkcyBidXQgd2l0aCB0aGUgc2FtZSBQQ0kgSURzLiBUaGUgZHJpdmVyCisgICBkZXRlY3RzIHRoZXNlIGJhc2VkIG9uIG90aGVyIGRldmljZSBpbmZvcm1hdGlvbi4KKyAgIFRoZXNlIGNhcmRzIG11c3QgYWx3YXlzIGNvbWUgbGFzdC4KKyAgIE5ldyBjYXJkcyBtdXN0IGJlIGluc2VydGVkIGFib3ZlLCBhbmQgdGhlIGluZGljZXMgb2YgdGhlIGNhcmRzIGJlbG93CisgICBtdXN0IGJlIGFkanVzdGVkIGFjY29yZGluZ2x5LiAqLworCisvKiBQVlItMzUwIFYxICh1c2VzIHNhYTcxMTQpICovCisjZGVmaW5lIElWVFZfQ0FSRF9QVlJfMzUwX1YxIAkgICAgIChJVlRWX0NBUkRfTEFTVCsxKQorLyogMiB2YXJpYW50cyBvZiBLdXJvdXRvc2hpa291IENYMjM0MTZHWUMtU1RWTFAgKFl1YW4gTVBHNjAwR1IgT0VNKSAqLworI2RlZmluZSBJVlRWX0NBUkRfQ1gyMzQxNkdZQ19OT0dSICAgIChJVlRWX0NBUkRfTEFTVCsyKQorI2RlZmluZSBJVlRWX0NBUkRfQ1gyMzQxNkdZQ19OT0dSWUNTIChJVlRWX0NBUkRfTEFTVCszKQorCisjZGVmaW5lIElWVFZfRU5DX1NUUkVBTV9UWVBFX01QRyAgMAorI2RlZmluZSBJVlRWX0VOQ19TVFJFQU1fVFlQRV9ZVVYgIDEKKyNkZWZpbmUgSVZUVl9FTkNfU1RSRUFNX1RZUEVfVkJJICAyCisjZGVmaW5lIElWVFZfRU5DX1NUUkVBTV9UWVBFX1BDTSAgMworI2RlZmluZSBJVlRWX0VOQ19TVFJFQU1fVFlQRV9SQUQgIDQKKyNkZWZpbmUgSVZUVl9ERUNfU1RSRUFNX1RZUEVfTVBHICA1CisjZGVmaW5lIElWVFZfREVDX1NUUkVBTV9UWVBFX1ZCSSAgNgorI2RlZmluZSBJVlRWX0RFQ19TVFJFQU1fVFlQRV9WT1VUIDcKKyNkZWZpbmUgSVZUVl9ERUNfU1RSRUFNX1RZUEVfWVVWICA4CisjZGVmaW5lIElWVFZfTUFYX1NUUkVBTVMJICA5CisKKyNkZWZpbmUgSVZUVl9WNEwyX0RFQ19NUEdfT0ZGU0VUICAxNgkvKiBvZmZzZXQgZnJvbSAwIHRvIHJlZ2lzdGVyIGRlY29kZXIgbXBnIHY0bDIgbWlub3JzIG9uICovCisjZGVmaW5lIElWVFZfVjRMMl9FTkNfUENNX09GRlNFVCAgMjQJLyogb2Zmc2V0IGZyb20gMCB0byByZWdpc3RlciBwY20gdjRsMiBtaW5vcnMgb24gKi8KKyNkZWZpbmUgSVZUVl9WNEwyX0VOQ19ZVVZfT0ZGU0VUICAzMgkvKiBvZmZzZXQgZnJvbSAwIHRvIHJlZ2lzdGVyIHl1diB2NGwyIG1pbm9ycyBvbiAqLworI2RlZmluZSBJVlRWX1Y0TDJfREVDX1lVVl9PRkZTRVQgIDQ4CS8qIG9mZnNldCBmcm9tIDAgdG8gcmVnaXN0ZXIgZGVjb2RlciB5dXYgdjRsMiBtaW5vcnMgb24gKi8KKyNkZWZpbmUgSVZUVl9WNEwyX0RFQ19WQklfT0ZGU0VUICAgOAkvKiBvZmZzZXQgZnJvbSAwIHRvIHJlZ2lzdGVyIGRlY29kZXIgdmJpIGlucHV0IHY0bDIgbWlub3JzIG9uICovCisjZGVmaW5lIElWVFZfVjRMMl9ERUNfVk9VVF9PRkZTRVQgMTYJLyogb2Zmc2V0IGZyb20gMCB0byByZWdpc3RlciB2Ymkgb3V0cHV0IHY0bDIgbWlub3JzIG9uICovCisKKyNkZWZpbmUgSVZUVl9FTkNfTUVNX1NUQVJUIDB4MDAwMDAwMDAKKyNkZWZpbmUgSVZUVl9ERUNfTUVNX1NUQVJUIDB4MDEwMDAwMDAKKworLyogc3lzdGVtIHZlbmRvciBhbmQgZGV2aWNlIElEcyAqLworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0lDT01QICAweDQ0NDQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JVlRWMTUgMHgwODAzCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSVZUVjE2IDB4MDAxNgorCisvKiBzdWJzeXN0ZW0gdmVuZG9yIElEICovCisjZGVmaW5lIElWVFZfUENJX0lEX0hBVVBQQVVHRSAJCTB4MDA3MAorI2RlZmluZSBJVlRWX1BDSV9JRF9IQVVQUEFVR0VfQUxUMSAJMHgwMjcwCisjZGVmaW5lIElWVFZfUENJX0lEX0hBVVBQQVVHRV9BTFQyIAkweDQwNzAKKyNkZWZpbmUgSVZUVl9QQ0lfSURfQURBUFRFQyAJCTB4OTAwNQorI2RlZmluZSBJVlRWX1BDSV9JRF9BVkVSTUVESUEgCQkweDE0NjEKKyNkZWZpbmUgSVZUVl9QQ0lfSURfWVVBTjEJCTB4MTJhYgorI2RlZmluZSBJVlRWX1BDSV9JRF9ZVUFOMiAJCTB4ZmYwMQorI2RlZmluZSBJVlRWX1BDSV9JRF9ZVUFOMyAJCTB4ZmZhYgorI2RlZmluZSBJVlRWX1BDSV9JRF9ZVUFONCAJCTB4ZmJhYgorI2RlZmluZSBJVlRWX1BDSV9JRF9ESUFNT05ETU0gCQkweGZmOTIKKyNkZWZpbmUgSVZUVl9QQ0lfSURfSU9EQVRBIAkJMHgxMGZjCisjZGVmaW5lIElWVFZfUENJX0lEX01FTENPIAkJMHgxMTU0CisjZGVmaW5lIElWVFZfUENJX0lEX0dPVFZJRVcxCQkweGZmYWMKKyNkZWZpbmUgSVZUVl9QQ0lfSURfR09UVklFVzIgCQkweGZmYWQKKworLyogRGVjb2RlciBCdWZmZXIgaGFyZHdhcmUgc2l6ZSBvbiBDaGlwICovCisjZGVmaW5lIElWVFZfREVDX01BWF9CVUYgICAgICAgIDB4MDAxMDAwMDAJLyogbWF4IGJ5dGVzIGluIGRlY29kZXIgYnVmZmVyICovCisjZGVmaW5lIElWVFZfREVDX01JTl9CVUYgICAgICAgIDB4MDAwMTAwMDAJLyogbWluIGJ5dGVzIGluIGRlYyBidWZmZXIgKi8KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PSBTVEFSVCBVU0VSIFNFVFRBQkxFIERNQSBWQVJJQUJMRVMgPT09PT09PT09PT0gKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisjZGVmaW5lIElWVFZfRE1BX1NHX09TRF9FTlQJKDI4ODM1ODQvUEFHRV9TSVpFKQkvKiBzZyBlbnRpdGllcyAqLworCisvKiBETUEgQnVmZmVycywgRGVmYXVsdCBzaXplIGluIE1CIGFsbG9jYXRlZCAqLworI2RlZmluZSBJVlRWX0RFRkFVTFRfRU5DX01QR19CVUZGRVJTIDQKKyNkZWZpbmUgSVZUVl9ERUZBVUxUX0VOQ19ZVVZfQlVGRkVSUyAyCisjZGVmaW5lIElWVFZfREVGQVVMVF9FTkNfVkJJX0JVRkZFUlMgMQorI2RlZmluZSBJVlRWX0RFRkFVTFRfRU5DX1BDTV9CVUZGRVJTIDEKKyNkZWZpbmUgSVZUVl9ERUZBVUxUX0RFQ19NUEdfQlVGRkVSUyAxCisjZGVmaW5lIElWVFZfREVGQVVMVF9ERUNfWVVWX0JVRkZFUlMgMQorI2RlZmluZSBJVlRWX0RFRkFVTFRfREVDX1ZCSV9CVUZGRVJTIDEKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PSBFTkQgVVNFUiBTRVRUQUJMRSBETUEgVkFSSUFCTEVTID09PT09PT09PT09PT0gKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKiBEZWNvZGVyIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBJVlRWX0RNQV9FUlJfTElTVCAJMHgwMDAwMDAxMAorI2RlZmluZSBJVlRWX0RNQV9FUlJfV1JJVEUgCTB4MDAwMDAwMDgKKyNkZWZpbmUgSVZUVl9ETUFfRVJSX1JFQUQgCTB4MDAwMDAwMDQKKyNkZWZpbmUgSVZUVl9ETUFfU1VDQ0VTU19XUklURSAJMHgwMDAwMDAwMgorI2RlZmluZSBJVlRWX0RNQV9TVUNDRVNTX1JFQUQgCTB4MDAwMDAwMDEKKyNkZWZpbmUgSVZUVl9ETUFfUkVBRF9FUlIgCShJVlRWX0RNQV9FUlJfTElTVCB8IElWVFZfRE1BX0VSUl9SRUFEKQorI2RlZmluZSBJVlRWX0RNQV9XUklURV9FUlIgCShJVlRWX0RNQV9FUlJfTElTVCB8IElWVFZfRE1BX0VSUl9XUklURSkKKyNkZWZpbmUgSVZUVl9ETUFfRVJSIAkJKElWVFZfRE1BX0VSUl9MSVNUIHwgSVZUVl9ETUFfRVJSX1dSSVRFIHwgSVZUVl9ETUFfRVJSX1JFQUQpCisKKy8qIERNQSBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgSVZUVl9SRUdfRE1BWEZFUiAJKDB4MDAwMCkKKyNkZWZpbmUgSVZUVl9SRUdfRE1BU1RBVFVTIAkoMHgwMDA0KQorI2RlZmluZSBJVlRWX1JFR19ERUNETUFBRERSIAkoMHgwMDA4KQorI2RlZmluZSBJVlRWX1JFR19FTkNETUFBRERSIAkoMHgwMDBjKQorI2RlZmluZSBJVlRWX1JFR19ETUFDT05UUk9MIAkoMHgwMDEwKQorI2RlZmluZSBJVlRWX1JFR19JUlFTVEFUVVMgCSgweDAwNDApCisjZGVmaW5lIElWVFZfUkVHX0lSUU1BU0sgCSgweDAwNDgpCisKKy8qIFNldHVwIFJlZ2lzdGVycyAqLworI2RlZmluZSBJVlRWX1JFR19FTkNfU0RSQU1fUkVGUkVTSCAJKDB4MDdGOCkKKyNkZWZpbmUgSVZUVl9SRUdfRU5DX1NEUkFNX1BSRUNIQVJHRSAJKDB4MDdGQykKKyNkZWZpbmUgSVZUVl9SRUdfREVDX1NEUkFNX1JFRlJFU0ggCSgweDA4RjgpCisjZGVmaW5lIElWVFZfUkVHX0RFQ19TRFJBTV9QUkVDSEFSR0UgCSgweDA4RkMpCisjZGVmaW5lIElWVFZfUkVHX1ZETSAJCQkoMHgyODAwKQorI2RlZmluZSBJVlRWX1JFR19BTyAJCQkoMHgyRDAwKQorI2RlZmluZSBJVlRWX1JFR19CWVRFRkxVU0ggCQkoMHgyRDI0KQorI2RlZmluZSBJVlRWX1JFR19TUFUgCQkJKDB4OTA1MCkKKyNkZWZpbmUgSVZUVl9SRUdfSFdfQkxPQ0tTIAkJKDB4OTA1NCkKKyNkZWZpbmUgSVZUVl9SRUdfVlBVIAkJCSgweDkwNTgpCisjZGVmaW5lIElWVFZfUkVHX0FQVSAJCQkoMHhBMDY0KQorCisjZGVmaW5lIElWVFZfSVJRX0VOQ19TVEFSVF9DQVAJCSgweDEgPDwgMzEpCisjZGVmaW5lIElWVFZfSVJRX0VOQ19FT1MJCSgweDEgPDwgMzApCisjZGVmaW5lIElWVFZfSVJRX0VOQ19WQklfQ0FQCQkoMHgxIDw8IDI5KQorI2RlZmluZSBJVlRWX0lSUV9FTkNfVklNX1JTVAkJKDB4MSA8PCAyOCkKKyNkZWZpbmUgSVZUVl9JUlFfRU5DX0RNQV9DT01QTEVURQkoMHgxIDw8IDI3KQorI2RlZmluZSBJVlRWX0lSUV9ERUNfQVVEX01PREVfQ0hHCSgweDEgPDwgMjQpCisjZGVmaW5lIElWVFZfSVJRX0RFQ19EQVRBX1JFUQkJKDB4MSA8PCAyMikKKyNkZWZpbmUgSVZUVl9JUlFfREVDX0RNQV9DT01QTEVURQkoMHgxIDw8IDIwKQorI2RlZmluZSBJVlRWX0lSUV9ERUNfVkJJX1JFX0lOU0VSVAkoMHgxIDw8IDE5KQorI2RlZmluZSBJVlRWX0lSUV9ETUFfRVJSCQkoMHgxIDw8IDE4KQorI2RlZmluZSBJVlRWX0lSUV9ETUFfV1JJVEUJCSgweDEgPDwgMTcpCisjZGVmaW5lIElWVFZfSVJRX0RNQV9SRUFECQkoMHgxIDw8IDE2KQorI2RlZmluZSBJVlRWX0lSUV9ERUNfVlNZTkMJCSgweDEgPDwgMTApCisKKy8qIElSUSBNYXNrcyAqLworI2RlZmluZSBJVlRWX0lSUV9NQVNLX0lOSVQgKElWVFZfSVJRX0RNQV9FUlJ8SVZUVl9JUlFfRU5DX0RNQV9DT01QTEVURXxJVlRWX0lSUV9ETUFfUkVBRCkKKworI2RlZmluZSBJVlRWX0lSUV9NQVNLX0NBUFRVUkUgKElWVFZfSVJRX0VOQ19TVEFSVF9DQVAgfCBJVlRWX0lSUV9FTkNfRU9TKQorI2RlZmluZSBJVlRWX0lSUV9NQVNLX0RFQ09ERSAgKElWVFZfSVJRX0RFQ19EQVRBX1JFUXxJVlRWX0lSUV9ERUNfQVVEX01PREVfQ0hHKQorCisvKiBpMmMgc3R1ZmYgKi8KKyNkZWZpbmUgSTJDX0NMSUVOVFNfTUFYIDE2CisKKy8qIGRlYnVnZ2luZyAqLworCisjZGVmaW5lIElWVFZfREJHRkxHX1dBUk4gICgxIDw8IDApCisjZGVmaW5lIElWVFZfREJHRkxHX0lORk8gICgxIDw8IDEpCisjZGVmaW5lIElWVFZfREJHRkxHX0FQSSAgICgxIDw8IDIpCisjZGVmaW5lIElWVFZfREJHRkxHX0RNQSAgICgxIDw8IDMpCisjZGVmaW5lIElWVFZfREJHRkxHX0lPQ1RMICgxIDw8IDQpCisjZGVmaW5lIElWVFZfREJHRkxHX0kyQyAgICgxIDw8IDUpCisjZGVmaW5lIElWVFZfREJHRkxHX0lSUSAgICgxIDw8IDYpCisjZGVmaW5lIElWVFZfREJHRkxHX0RFQyAgICgxIDw8IDcpCisjZGVmaW5lIElWVFZfREJHRkxHX1lVViAgICgxIDw8IDgpCisKKy8qIE5PVEU6IGV4dHJhIHNwYWNlIGJlZm9yZSBjb21tYSBpbiAnaXR2LT5udW0gLCAjIyBhcmdzJyBpcyByZXF1aXJlZCBmb3IKKyAgIGdjYy0yLjk1LCBvdGhlcndpc2UgaXQgd29uJ3QgY29tcGlsZS4gKi8KKyNkZWZpbmUgSVZUVl9ERUJVRyh4LCB0eXBlLCBmbXQsIGFyZ3MuLi4pIFwKKwlkbyB7IFwKKwkJaWYgKCh4KSAmIGl2dHZfZGVidWcpIFwKKwkJCXByaW50ayhLRVJOX0lORk8gIml2dHYlZCAiIHR5cGUgIjogIiBmbXQsIGl0di0+bnVtICwgIyMgYXJncyk7IFwKKwl9IHdoaWxlICgwKQorI2RlZmluZSBJVlRWX0RFQlVHX1dBUk4oZm10LCBhcmdzLi4uKSAgSVZUVl9ERUJVRyhJVlRWX0RCR0ZMR19XQVJOLCAid2FybmluZyIsIGZtdCAsICMjIGFyZ3MpCisjZGVmaW5lIElWVFZfREVCVUdfSU5GTyhmbXQsIGFyZ3MuLi4pICBJVlRWX0RFQlVHKElWVFZfREJHRkxHX0lORk8sICJpbmZvIixmbXQgLCAjIyBhcmdzKQorI2RlZmluZSBJVlRWX0RFQlVHX0FQSShmbXQsIGFyZ3MuLi4pICAgSVZUVl9ERUJVRyhJVlRWX0RCR0ZMR19BUEksICJhcGkiLCBmbXQgLCAjIyBhcmdzKQorI2RlZmluZSBJVlRWX0RFQlVHX0RNQShmbXQsIGFyZ3MuLi4pICAgSVZUVl9ERUJVRyhJVlRWX0RCR0ZMR19ETUEsICJkbWEiLCBmbXQgLCAjIyBhcmdzKQorI2RlZmluZSBJVlRWX0RFQlVHX0lPQ1RMKGZtdCwgYXJncy4uLikgSVZUVl9ERUJVRyhJVlRWX0RCR0ZMR19JT0NUTCwgImlvY3RsIiwgZm10ICwgIyMgYXJncykKKyNkZWZpbmUgSVZUVl9ERUJVR19JMkMoZm10LCBhcmdzLi4uKSAgIElWVFZfREVCVUcoSVZUVl9EQkdGTEdfSTJDLCAiaTJjIiwgZm10ICwgIyMgYXJncykKKyNkZWZpbmUgSVZUVl9ERUJVR19JUlEoZm10LCBhcmdzLi4uKSAgIElWVFZfREVCVUcoSVZUVl9EQkdGTEdfSVJRLCAiaXJxIiwgZm10ICwgIyMgYXJncykKKyNkZWZpbmUgSVZUVl9ERUJVR19ERUMoZm10LCBhcmdzLi4uKSAgIElWVFZfREVCVUcoSVZUVl9EQkdGTEdfREVDLCAiZGVjIiwgZm10ICwgIyMgYXJncykKKyNkZWZpbmUgSVZUVl9ERUJVR19ZVVYoZm10LCBhcmdzLi4uKSAgIElWVFZfREVCVUcoSVZUVl9EQkdGTEdfWVVWLCAieXV2IiwgZm10ICwgIyMgYXJncykKKworI2RlZmluZSBJVlRWX0ZCX0RFQlVHKHgsIHR5cGUsIGZtdCwgYXJncy4uLikgXAorCWRvIHsgXAorCQlpZiAoKHgpICYgaXZ0dl9kZWJ1ZykgXAorCQkJcHJpbnRrKEtFUk5fSU5GTyAiaXZ0diVkLWZiICIgdHlwZSAiOiAiIGZtdCwgaXR2LT5udW0gLCAjIyBhcmdzKTsgXAorCX0gd2hpbGUgKDApCisjZGVmaW5lIElWVFZfRkJfREVCVUdfV0FSTihmbXQsIGFyZ3MuLi4pICBJVlRWX0ZCX0RFQlVHKElWVFZfREJHRkxHX1dBUk4sICJ3YXJuaW5nIiwgZm10ICwgIyMgYXJncykKKyNkZWZpbmUgSVZUVl9GQl9ERUJVR19JTkZPKGZtdCwgYXJncy4uLikgIElWVFZfRkJfREVCVUcoSVZUVl9EQkdGTEdfSU5GTywgImluZm8iLCBmbXQgLCAjIyBhcmdzKQorI2RlZmluZSBJVlRWX0ZCX0RFQlVHX0FQSShmbXQsIGFyZ3MuLi4pICAgSVZUVl9GQl9ERUJVRyhJVlRWX0RCR0ZMR19BUEksICJhcGkiLCBmbXQgLCAjIyBhcmdzKQorI2RlZmluZSBJVlRWX0ZCX0RFQlVHX0RNQShmbXQsIGFyZ3MuLi4pICAgSVZUVl9GQl9ERUJVRyhJVlRWX0RCR0ZMR19ETUEsICJkbWEiLCBmbXQgLCAjIyBhcmdzKQorI2RlZmluZSBJVlRWX0ZCX0RFQlVHX0lPQ1RMKGZtdCwgYXJncy4uLikgSVZUVl9GQl9ERUJVRyhJVlRWX0RCR0ZMR19JT0NUTCwgImlvY3RsIiwgZm10ICwgIyMgYXJncykKKyNkZWZpbmUgSVZUVl9GQl9ERUJVR19JMkMoZm10LCBhcmdzLi4uKSAgIElWVFZfRkJfREVCVUcoSVZUVl9EQkdGTEdfSTJDLCAiaTJjIiwgZm10ICwgIyMgYXJncykKKyNkZWZpbmUgSVZUVl9GQl9ERUJVR19JUlEoZm10LCBhcmdzLi4uKSAgIElWVFZfRkJfREVCVUcoSVZUVl9EQkdGTEdfSVJRLCAiaXJxIiwgZm10ICwgIyMgYXJncykKKyNkZWZpbmUgSVZUVl9GQl9ERUJVR19ERUMoZm10LCBhcmdzLi4uKSAgIElWVFZfRkJfREVCVUcoSVZUVl9EQkdGTEdfREVDLCAiZGVjIiwgZm10ICwgIyMgYXJncykKKyNkZWZpbmUgSVZUVl9GQl9ERUJVR19ZVVYoZm10LCBhcmdzLi4uKSAgIElWVFZfRkJfREVCVUcoSVZUVl9EQkdGTEdfWVVWLCAieXV2IiwgZm10ICwgIyMgYXJncykKKworLyogU3RhbmRhcmQga2VybmVsIG1lc3NhZ2VzICovCisjZGVmaW5lIElWVFZfRVJSKGZtdCwgYXJncy4uLikgICAgICBwcmludGsoS0VSTl9FUlIgICJpdnR2JWQ6ICIgZm10LCBpdHYtPm51bSAsICMjIGFyZ3MpCisjZGVmaW5lIElWVFZfV0FSTihmbXQsIGFyZ3MuLi4pICAgICBwcmludGsoS0VSTl9XQVJOSU5HICJpdnR2JWQ6ICIgZm10LCBpdHYtPm51bSAsICMjIGFyZ3MpCisjZGVmaW5lIElWVFZfSU5GTyhmbXQsIGFyZ3MuLi4pICAgICBwcmludGsoS0VSTl9JTkZPICJpdnR2JWQ6ICIgZm10LCBpdHYtPm51bSAsICMjIGFyZ3MpCisjZGVmaW5lIElWVFZfRkJfRVJSKGZtdCwgYXJncy4uLikgICBwcmludGsoS0VSTl9FUlIgICJpdnR2JWQtZmI6ICIgZm10LCBpdHYtPm51bSAsICMjIGFyZ3MpCisjZGVmaW5lIElWVFZfRkJfV0FSTihmbXQsIGFyZ3MuLi4pICBwcmludGsoS0VSTl9XQVJOSU5HICAiaXZ0diVkLWZiOiAiIGZtdCwgaXR2LT5udW0gLCAjIyBhcmdzKQorI2RlZmluZSBJVlRWX0ZCX0lORk8oZm10LCBhcmdzLi4uKSAgcHJpbnRrKEtFUk5fSU5GTyAiaXZ0diVkLWZiOiAiIGZtdCwgaXR2LT5udW0gLCAjIyBhcmdzKQorCisvKiBWYWx1ZXMgZm9yIElWVFZfQVBJX0RFQ19QTEFZQkFDS19TUEVFRCBtcGVnX2ZyYW1lX3R5cGVfbWFzayBwYXJhbWV0ZXI6ICovCisjZGVmaW5lIE1QRUdfRlJBTUVfVFlQRV9JRlJBTUUgMQorI2RlZmluZSBNUEVHX0ZSQU1FX1RZUEVfSUZSQU1FX1BGUkFNRSAzCisjZGVmaW5lIE1QRUdfRlJBTUVfVFlQRV9BTEwgNworCisvKiBvdXRwdXQgbW9kZXMgKGN4MjM0MTUgb25seSkgKi8KKyNkZWZpbmUgT1VUX05PTkUgICAgICAgIDAKKyNkZWZpbmUgT1VUX01QRyAgICAgICAgIDEKKyNkZWZpbmUgT1VUX1lVViAgICAgICAgIDIKKyNkZWZpbmUgT1VUX1VETUFfWVVWICAgIDMKKyNkZWZpbmUgT1VUX1BBU1NUSFJPVUdIIDQKKworI2RlZmluZSBJVlRWX01BWF9QR01fSU5ERVggKDQwMCkKKworZXh0ZXJuIGludCBpdnR2X2RlYnVnOworCisKK3N0cnVjdCBpdnR2X29wdGlvbnMgeworCWludCBtZWdhYnl0ZXNbSVZUVl9NQVhfU1RSRUFNU107IC8qIFNpemUgaW4gbWVnYWJ5dGVzIG9mIGVhY2ggc3RyZWFtICovCisJaW50IGNhcmR0eXBlOwkJLyogZm9yY2UgY2FyZCB0eXBlIG9uIGxvYWQgKi8KKwlpbnQgdHVuZXI7CQkvKiBzZXQgdHVuZXIgb24gbG9hZCAqLworCWludCByYWRpbzsJCS8qIGVuYWJsZS9kaXNhYmxlIHJhZGlvICovCisJaW50IG5ld2kyYzsJCS8qIE5ldyBJMkMgYWxnb3JpdGhtICovCit9OworCisjZGVmaW5lIElWVFZfTUJPWF9ETUFfU1RBUlQgNgorI2RlZmluZSBJVlRWX01CT1hfRE1BX0VORCA4CisjZGVmaW5lIElWVFZfTUJPWF9ETUEgOQorI2RlZmluZSBJVlRWX01CT1hfRklFTERfRElTUExBWUVEIDgKKworLyogaXZ0di1zcGVjaWZpYyBtYWlsYm94IHRlbXBsYXRlICovCitzdHJ1Y3QgaXZ0dl9tYWlsYm94IHsKKwl1MzIgZmxhZ3M7CisJdTMyIGNtZDsKKwl1MzIgcmV0dmFsOworCXUzMiB0aW1lb3V0OworCXUzMiBkYXRhW0NYMjM0MVhfTUJPWF9NQVhfREFUQV07Cit9OworCitzdHJ1Y3QgaXZ0dl9hcGlfY2FjaGUgeworCXVuc2lnbmVkIGxvbmcgbGFzdF9qaWZmaWVzOwkJLyogd2hlbiBsYXN0IGNvbW1hbmQgd2FzIGlzc3VlZCAqLworCXUzMiBkYXRhW0NYMjM0MVhfTUJPWF9NQVhfREFUQV07CS8qIGxhc3Qgc2VudCBhcGkgZGF0YSAqLworfTsKKworc3RydWN0IGl2dHZfbWFpbGJveF9kYXRhIHsKKwl2b2xhdGlsZSBzdHJ1Y3QgaXZ0dl9tYWlsYm94IF9faW9tZW0gKm1ib3g7CisJLyogQml0cyAwLTIgYXJlIGZvciB0aGUgZW5jb2RlciBtYWlsYm94ZXMsIDAtMSBhcmUgZm9yIHRoZSBkZWNvZGVyIG1haWxib3hlcy4KKwkgICBJZiB0aGUgYml0IGlzIHNldCwgdGhlbiB0aGUgY29ycmVzcG9uZGluZyBtYWlsYm94IGlzIGluIHVzZSBieSB0aGUgZHJpdmVyLiAqLworCXVuc2lnbmVkIGxvbmcgYnVzeTsKKwl1OCBtYXhfbWJveDsKK307CisKKy8qIHBlci1idWZmZXIgYml0IGZsYWdzICovCisjZGVmaW5lIElWVFZfRl9CX05FRURfQlVGX1NXQVAgIDAJLyogdGhpcyBidWZmZXIgc2hvdWxkIGJlIGJ5dGUgc3dhcHBlZCAqLworCisvKiBwZXItc3RyZWFtLCBzX2ZsYWdzICovCisjZGVmaW5lIElWVFZfRl9TX0RNQV9QRU5ESU5HCTAJLyogdGhpcyBzdHJlYW0gaGFzIHBlbmRpbmcgRE1BICovCisjZGVmaW5lIElWVFZfRl9TX0RNQV9IQVNfVkJJCTEgICAgICAgLyogdGhlIGN1cnJlbnQgRE1BIHJlcXVlc3QgYWxzbyByZXF1ZXN0cyBWQkkgZGF0YSAqLworI2RlZmluZSBJVlRWX0ZfU19ORUVEU19EQVRBCTIgCS8qIHRoaXMgZGVjb2Rpbmcgc3RyZWFtIG5lZWRzIG1vcmUgZGF0YSAqLworCisjZGVmaW5lIElWVFZfRl9TX0NMQUlNRUQgCTMJLyogdGhpcyBzdHJlYW0gaXMgY2xhaW1lZCAqLworI2RlZmluZSBJVlRWX0ZfU19TVFJFQU1JTkcgICAgICA0CS8qIHRoZSBmdyBpcyBkZWNvZGluZy9lbmNvZGluZyB0aGlzIHN0cmVhbSAqLworI2RlZmluZSBJVlRWX0ZfU19JTlRFUk5BTF9VU0UJNQkvKiB0aGlzIHN0cmVhbSBpcyB1c2VkIGludGVybmFsbHkgKHNsaWNlZCBWQkkgcHJvY2Vzc2luZykgKi8KKyNkZWZpbmUgSVZUVl9GX1NfUEFTU1RIUk9VR0gJNgkvKiB0aGlzIHN0cmVhbSBpcyBpbiBwYXNzdGhyb3VnaCBtb2RlICovCisjZGVmaW5lIElWVFZfRl9TX1NUUkVBTU9GRgk3CS8qIHNpZ25hbCBlbmQgb2Ygc3RyZWFtIEVPUyAqLworI2RlZmluZSBJVlRWX0ZfU19BUFBMX0lPICAgICAgICA4CS8qIHRoaXMgc3RyZWFtIGlzIHVzZWQgcmVhZC93cml0dGVuIGJ5IGFuIGFwcGxpY2F0aW9uICovCisKKy8qIHBlci1pdnR2LCBpX2ZsYWdzICovCisjZGVmaW5lIElWVFZfRl9JX0RNQQkJICAgMCAJLyogRE1BIGluIHByb2dyZXNzICovCisjZGVmaW5lIElWVFZfRl9JX1VETUEJCSAgIDEgCS8qIFVETUEgaW4gcHJvZ3Jlc3MgKi8KKyNkZWZpbmUgSVZUVl9GX0lfVURNQV9QRU5ESU5HCSAgIDIgCS8qIFVETUEgcGVuZGluZyAqLworI2RlZmluZSBJVlRWX0ZfSV9TUEVFRF9DSEFOR0UJICAgMyAJLyogQSBzcGVlZCBjaGFuZ2UgaXMgaW4gcHJvZ3Jlc3MgKi8KKyNkZWZpbmUgSVZUVl9GX0lfRU9TCQkgICA0IAkvKiBFbmQgb2YgZW5jb2RlciBzdHJlYW0gcmVhY2hlZCAqLworI2RlZmluZSBJVlRWX0ZfSV9SQURJT19VU0VSCSAgIDUgCS8qIFRoZSByYWRpbyB0dW5lciBpcyBzZWxlY3RlZCAqLworI2RlZmluZSBJVlRWX0ZfSV9ESUdfUlNUCSAgIDYgCS8qIFJlc2V0IGRpZ2l0aXplciAqLworI2RlZmluZSBJVlRWX0ZfSV9ERUNfWVVWCSAgIDcgCS8qIFlVViBpbnN0ZWFkIG9mIE1QRyBpcyBiZWluZyBkZWNvZGVkICovCisjZGVmaW5lIElWVFZfRl9JX0VOQ19WQkkJICAgOCAJLyogVkJJIERNQSAqLworI2RlZmluZSBJVlRWX0ZfSV9VUERBVEVfQ0MJICAgOSAgCS8qIENDIHNob3VsZCBiZSB1cGRhdGVkICovCisjZGVmaW5lIElWVFZfRl9JX1VQREFURV9XU1MJICAgMTAgCS8qIFdTUyBzaG91bGQgYmUgdXBkYXRlZCAqLworI2RlZmluZSBJVlRWX0ZfSV9VUERBVEVfVlBTCSAgIDExIAkvKiBWUFMgc2hvdWxkIGJlIHVwZGF0ZWQgKi8KKyNkZWZpbmUgSVZUVl9GX0lfREVDT0RJTkdfWVVWCSAgIDEyIAkvKiB0aGlzIHN0cmVhbSBpcyBZVVYgZnJhbWUgZGVjb2RpbmcgKi8KKyNkZWZpbmUgSVZUVl9GX0lfRU5DX1BBVVNFRAkgICAxMyAJLyogdGhlIGVuY29kZXIgaXMgcGF1c2VkICovCisjZGVmaW5lIElWVFZfRl9JX1ZBTElEX0RFQ19USU1JTkdTIDE0IAkvKiBsYXN0X2RlY190aW1pbmcgaXMgdmFsaWQgKi8KKyNkZWZpbmUgSVZUVl9GX0lfV09SS19IQU5ETEVSX1ZCSSAgMTUJLyogdGhlcmUgaXMgd29yayB0byBiZSBkb25lIGZvciBWQkkgKi8KKyNkZWZpbmUgSVZUVl9GX0lfV09SS19IQU5ETEVSX1lVViAgMTYJLyogdGhlcmUgaXMgd29yayB0byBiZSBkb25lIGZvciBZVVYgKi8KKworLyogRXZlbnQgbm90aWZpY2F0aW9ucyAqLworI2RlZmluZSBJVlRWX0ZfSV9FVl9ERUNfU1RPUFBFRAkgICAyOAkvKiBkZWNvZGVyIHN0b3BwZWQgZXZlbnQgKi8KKyNkZWZpbmUgSVZUVl9GX0lfRVZfVlNZTkMJICAgMjkgCS8qIFZTWU5DIGV2ZW50ICovCisjZGVmaW5lIElWVFZfRl9JX0VWX1ZTWU5DX0ZJRUxEICAgIDMwIAkvKiBWU1lOQyBldmVudCBmaWVsZCAoMCA9IGZpcnN0LCAxID0gc2Vjb25kIGZpZWxkKSAqLworI2RlZmluZSBJVlRWX0ZfSV9FVl9WU1lOQ19FTkFCTEVEICAzMSAJLyogVlNZTkMgZXZlbnQgZW5hYmxlZCAqLworCisvKiBTY2F0dGVyLUdhdGhlciBhcnJheSBlbGVtZW50LCB1c2VkIGluIERNQSB0cmFuc2ZlcnMgKi8KK3N0cnVjdCBpdnR2X1NHX2VsZW1lbnQgeworCXUzMiBzcmM7CisJdTMyIGRzdDsKKwl1MzIgc2l6ZTsKK307CisKK3N0cnVjdCBpdnR2X3VzZXJfZG1hIHsKKwlzdHJ1Y3QgbXV0ZXggbG9jazsKKwlpbnQgcGFnZV9jb3VudDsKKwlzdHJ1Y3QgcGFnZSAqbWFwW0lWVFZfRE1BX1NHX09TRF9FTlRdOworCisJLyogQmFzZSBEZXYgU0cgQXJyYXkgZm9yIGN4MjM0MTUvNiAqLworCXN0cnVjdCBpdnR2X1NHX2VsZW1lbnQgU0dhcnJheVtJVlRWX0RNQV9TR19PU0RfRU5UXTsKKwlkbWFfYWRkcl90IFNHX2hhbmRsZTsKKwlpbnQgU0dfbGVuZ3RoOworCisJLyogU0cgTGlzdCBvZiBCdWZmZXJzICovCisJc3RydWN0IHNjYXR0ZXJsaXN0IFNHbGlzdFtJVlRWX0RNQV9TR19PU0RfRU5UXTsKK307CisKK3N0cnVjdCBpdnR2X2RtYV9wYWdlX2luZm8geworCXVuc2lnbmVkIGxvbmcgdWFkZHI7CisJdW5zaWduZWQgbG9uZyBmaXJzdDsKKwl1bnNpZ25lZCBsb25nIGxhc3Q7CisJdW5zaWduZWQgaW50IG9mZnNldDsKKwl1bnNpZ25lZCBpbnQgdGFpbDsKKwlpbnQgcGFnZV9jb3VudDsKK307CisKK3N0cnVjdCBpdnR2X2J1ZmZlciB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCWRtYV9hZGRyX3QgZG1hX2hhbmRsZTsKKwl1bnNpZ25lZCBsb25nIGJfZmxhZ3M7CisJY2hhciAqYnVmOworCisJdTMyIGJ5dGVzdXNlZDsKKwl1MzIgcmVhZHBvczsKK307CisKK3N0cnVjdCBpdnR2X3F1ZXVlIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJdTMyIGJ1ZmZlcnM7CisJdTMyIGxlbmd0aDsKKwl1MzIgYnl0ZXN1c2VkOworfTsKKworc3RydWN0IGl2dHY7CS8qIGZvcndhcmQgcmVmZXJlbmNlICovCisKK3N0cnVjdCBpdnR2X3N0cmVhbSB7CisJLyogVGhlc2UgZmlyc3QgZm91ciBmaWVsZHMgYXJlIGFsd2F5cyBzZXQsIGV2ZW4gaWYgdGhlIHN0cmVhbQorCSAgIGlzIG5vdCBhY3R1YWxseSBjcmVhdGVkLiAqLworCXN0cnVjdCB2aWRlb19kZXZpY2UgKnY0bDJkZXY7CS8qIE5VTEwgd2hlbiBzdHJlYW0gbm90IGNyZWF0ZWQgKi8KKwlzdHJ1Y3QgaXZ0diAqaXR2OyAJCS8qIGZvciBlYXNlIG9mIHVzZSAqLworCWNvbnN0IGNoYXIgKm5hbWU7CQkvKiBuYW1lIG9mIHRoZSBzdHJlYW0gKi8KKwlpbnQgdHlwZTsJCQkvKiBzdHJlYW0gdHlwZSAqLworCisJdTMyIGlkOworCXNwaW5sb2NrX3QgcWxvY2s7IAkvKiBsb2NrcyBhY2Nlc3MgdG8gdGhlIHF1ZXVlcyAqLworCXVuc2lnbmVkIGxvbmcgc19mbGFnczsJLyogc3RhdHVzIGZsYWdzLCBzZWUgYWJvdmUgKi8KKwlpbnQgZG1hOwkJLyogY2FuIGJlIFBDSV9ETUFfVE9ERVZJQ0UsCisJCQkJICAgUENJX0RNQV9GUk9NREVWSUNFIG9yCisJCQkJICAgUENJX0RNQV9OT05FICovCisJdTMyIGRtYV9vZmZzZXQ7CisJdTMyIGRtYV9iYWNrdXA7CisJdTY0IGRtYV9wdHM7CisKKwlpbnQgc3VidHlwZTsKKwl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0cTsKKwl1MzIgZG1hX2xhc3Rfb2Zmc2V0OworCisJLyogQnVmZmVyIFN0YXRzICovCisJdTMyIGJ1ZmZlcnM7CisJdTMyIGJ1Zl9zaXplOworCXUzMiBidWZmZXJzX3N0b2xlbjsKKworCS8qIEJ1ZmZlciBRdWV1ZXMgKi8KKwlzdHJ1Y3QgaXZ0dl9xdWV1ZSBxX2ZyZWU7CS8qIGZyZWUgYnVmZmVycyAqLworCXN0cnVjdCBpdnR2X3F1ZXVlIHFfZnVsbDsJLyogZnVsbCBidWZmZXJzICovCisJc3RydWN0IGl2dHZfcXVldWUgcV9pbzsJCS8qIHdhaXRpbmcgZm9yIEkvTyAqLworCXN0cnVjdCBpdnR2X3F1ZXVlIHFfZG1hOwkvKiB3YWl0aW5nIGZvciBETUEgKi8KKwlzdHJ1Y3QgaXZ0dl9xdWV1ZSBxX3ByZWRtYTsJLyogd2FpdGluZyBmb3IgRE1BICovCisKKwkvKiBCYXNlIERldiBTRyBBcnJheSBmb3IgY3gyMzQxNS82ICovCisJc3RydWN0IGl2dHZfU0dfZWxlbWVudCAqU0dhcnJheTsKKwlkbWFfYWRkcl90IFNHX2hhbmRsZTsKKwlpbnQgU0dfbGVuZ3RoOworCisJLyogU0cgTGlzdCBvZiBCdWZmZXJzICovCisJc3RydWN0IHNjYXR0ZXJsaXN0ICpTR2xpc3Q7Cit9OworCitzdHJ1Y3QgaXZ0dl9vcGVuX2lkIHsKKwl1MzIgb3Blbl9pZDsKKwlpbnQgdHlwZTsKKwllbnVtIHY0bDJfcHJpb3JpdHkgcHJpbzsKKwlzdHJ1Y3QgaXZ0diAqaXR2OworfTsKKworI2RlZmluZSBJVlRWX1lVVl9VUERBVEVfSE9SSVpPTlRBTCAgMHgwMQorI2RlZmluZSBJVlRWX1lVVl9VUERBVEVfVkVSVElDQUwgICAgMHgwMgorCitzdHJ1Y3QgeXV2X2ZyYW1lX2luZm8KK3sKKwl1MzIgdXBkYXRlOworCWludCBzcmNfeDsKKwlpbnQgc3JjX3k7CisJdW5zaWduZWQgaW50IHNyY193OworCXVuc2lnbmVkIGludCBzcmNfaDsKKwlpbnQgZHN0X3g7CisJaW50IGRzdF95OworCXVuc2lnbmVkIGludCBkc3RfdzsKKwl1bnNpZ25lZCBpbnQgZHN0X2g7CisJaW50IHBhbl94OworCWludCBwYW5feTsKKwl1MzIgdmlzX3c7CisJdTMyIHZpc19oOworCXUzMiBpbnRlcmxhY2VkX3k7CisJdTMyIGludGVybGFjZWRfdXY7CisJaW50IHRydV94OworCXUzMiB0cnVfdzsKKwl1MzIgdHJ1X2g7CisJdTMyIG9mZnNldF95OworfTsKKworI2RlZmluZSBJVlRWX1lVVl9NT0RFX0lOVEVSTEFDRUQJMHgwMAorI2RlZmluZSBJVlRWX1lVVl9NT0RFX1BST0dSRVNTSVZFCTB4MDEKKyNkZWZpbmUgSVZUVl9ZVVZfTU9ERV9BVVRPCQkweDAyCisjZGVmaW5lIElWVFZfWVVWX01PREVfTUFTSwkJMHgwMworCisjZGVmaW5lIElWVFZfWVVWX1NZTkNfRVZFTgkJMHgwMAorI2RlZmluZSBJVlRWX1lVVl9TWU5DX09ERAkJMHgwNAorI2RlZmluZSBJVlRWX1lVVl9TWU5DX01BU0sJCTB4MDQKKworc3RydWN0IHl1dl9wbGF5YmFja19pbmZvCit7CisJdTMyIHJlZ18yODM0OworCXUzMiByZWdfMjgzODsKKwl1MzIgcmVnXzI4M2M7CisJdTMyIHJlZ18yODQwOworCXUzMiByZWdfMjg0NDsKKwl1MzIgcmVnXzI4NDg7CisJdTMyIHJlZ18yODU0OworCXUzMiByZWdfMjg1YzsKKwl1MzIgcmVnXzI4NjQ7CisKKwl1MzIgcmVnXzI4NzA7CisJdTMyIHJlZ18yODc0OworCXUzMiByZWdfMjg5MDsKKwl1MzIgcmVnXzI4OTg7CisJdTMyIHJlZ18yODljOworCisJdTMyIHJlZ18yOTE4OworCXUzMiByZWdfMjkxYzsKKwl1MzIgcmVnXzI5MjA7CisJdTMyIHJlZ18yOTI0OworCXUzMiByZWdfMjkyODsKKwl1MzIgcmVnXzI5MmM7CisJdTMyIHJlZ18yOTMwOworCisJdTMyIHJlZ18yOTM0OworCisJdTMyIHJlZ18yOTM4OworCXUzMiByZWdfMjkzYzsKKwl1MzIgcmVnXzI5NDA7CisJdTMyIHJlZ18yOTQ0OworCXUzMiByZWdfMjk0ODsKKwl1MzIgcmVnXzI5NGM7CisJdTMyIHJlZ18yOTUwOworCXUzMiByZWdfMjk1NDsKKwl1MzIgcmVnXzI5NTg7CisJdTMyIHJlZ18yOTVjOworCXUzMiByZWdfMjk2MDsKKwl1MzIgcmVnXzI5NjQ7CisJdTMyIHJlZ18yOTY4OworCXUzMiByZWdfMjk2YzsKKworCXUzMiByZWdfMjk3MDsKKworCWludCB2X2ZpbHRlcl8xOworCWludCB2X2ZpbHRlcl8yOworCWludCBoX2ZpbHRlcjsKKworCXUzMiBvc2RfeF9vZmZzZXQ7CisJdTMyIG9zZF95X29mZnNldDsKKworCXUzMiBvc2RfeF9wYW47CisJdTMyIG9zZF95X3BhbjsKKworCXUzMiBvc2RfdmlzX3c7CisJdTMyIG9zZF92aXNfaDsKKworCWludCBkZWNvZGVfaGVpZ2h0OworCisJaW50IGZyYW1lX2ludGVybGFjZWQ7CisJaW50IGZyYW1lX2ludGVybGFjZWRfbGFzdDsKKworCWludCBsYWNlX21vZGU7CisJaW50IGxhY2VfdGhyZXNob2xkOworCWludCBsYWNlX3N5bmNfZmllbGQ7CisKKwlhdG9taWNfdCBuZXh0X2RtYV9mcmFtZTsKKwlhdG9taWNfdCBuZXh0X2ZpbGxfZnJhbWU7CisKKwl1MzIgeXV2X2ZvcmNlZF91cGRhdGU7CisJaW50IHVwZGF0ZV9mcmFtZTsKKwlzdHJ1Y3QgeXV2X2ZyYW1lX2luZm8gbmV3X2ZyYW1lX2luZm9bNF07CisJc3RydWN0IHl1dl9mcmFtZV9pbmZvIG9sZF9mcmFtZV9pbmZvOworCXN0cnVjdCB5dXZfZnJhbWVfaW5mbyBvbGRfZnJhbWVfaW5mb19hcmdzOworCisJdm9pZCAqYmxhbmtpbmdfcHRyOworCWRtYV9hZGRyX3QgYmxhbmtpbmdfZG1hcHRyOworfTsKKworI2RlZmluZSBJVlRWX1ZCSV9GUkFNRVMgMzIKKworLyogVkJJIGRhdGEgKi8KK3N0cnVjdCB2YmlfaW5mbyB7CisJdTMyIGRlY19zdGFydDsKKwl1MzIgZW5jX3N0YXJ0LCBlbmNfc2l6ZTsKKwlpbnQgZnBpOworCXUzMiBmcmFtZTsKKwl1MzIgZG1hX29mZnNldDsKKwl1OCBjY19kYXRhX29kZFsyNTZdOworCXU4IGNjX2RhdGFfZXZlblsyNTZdOworCWludCBjY19wb3M7CisJdTggY2Nfbm9fdXBkYXRlOworCXU4IHZwc1s1XTsKKwl1OCB2cHNfZm91bmQ7CisJaW50IHdzczsKKwl1OCB3c3NfZm91bmQ7CisJdTggd3NzX25vX3VwZGF0ZTsKKwl1MzIgcmF3X2RlY29kZXJfbGluZV9zaXplOworCXU4IHJhd19kZWNvZGVyX3Nhdl9vZGRfZmllbGQ7CisJdTggcmF3X2RlY29kZXJfc2F2X2V2ZW5fZmllbGQ7CisJdTMyIHNsaWNlZF9kZWNvZGVyX2xpbmVfc2l6ZTsKKwl1OCBzbGljZWRfZGVjb2Rlcl9zYXZfb2RkX2ZpZWxkOworCXU4IHNsaWNlZF9kZWNvZGVyX3Nhdl9ldmVuX2ZpZWxkOworCXN0cnVjdCB2NGwyX2Zvcm1hdCBpbjsKKwkvKiBjb252ZW5pZW5jZSBwb2ludGVyIHRvIHNsaWNlZCBzdHJ1Y3QgaW4gdmJpX2luIHVuaW9uICovCisJc3RydWN0IHY0bDJfc2xpY2VkX3ZiaV9mb3JtYXQgKnNsaWNlZF9pbjsKKwl1MzIgc2VydmljZV9zZXRfaW47CisJdTMyIHNlcnZpY2Vfc2V0X291dDsKKwlpbnQgaW5zZXJ0X21wZWc7CisKKwkvKiBCdWZmZXIgZm9yIHRoZSBtYXhpbXVtIG9mIDIgKiAxOCAqIHBhY2tldF9zaXplIHNsaWNlZCBWQkkgbGluZXMuCisJICAgT25lIGZvciAvZGV2L3ZiaTAgYW5kIG9uZSBmb3IgL2Rldi92Ymk4ICovCisJc3RydWN0IHY0bDJfc2xpY2VkX3ZiaV9kYXRhIHNsaWNlZF9kYXRhWzM2XTsKKwlzdHJ1Y3QgdjRsMl9zbGljZWRfdmJpX2RhdGEgc2xpY2VkX2RlY19kYXRhWzM2XTsKKworCS8qIEJ1ZmZlciBmb3IgVkJJIGRhdGEgaW5zZXJ0ZWQgaW50byBNUEVHIHN0cmVhbS4KKwkgICBUaGUgZmlyc3QgYnl0ZSBpcyBhIGR1bW15IGJ5dGUgdGhhdCdzIG5ldmVyIHVzZWQuCisJICAgVGhlIG5leHQgMTYgYnl0ZXMgY29udGFpbiB0aGUgTVBFRyBoZWFkZXIgZm9yIHRoZSBWQkkgZGF0YSwKKwkgICB0aGUgcmVtYWluZGVyIGlzIHRoZSBhY3R1YWwgVkJJIGRhdGEuCisJICAgVGhlIG1heCBzaXplIGFjY2VwdGVkIGJ5IHRoZSBNUEVHIFZCSSByZWluc2VydGlvbiB0dXJucyBvdXQKKwkgICB0byBiZSAxNTUyIGJ5dGVzLCB3aGljaCBoYXBwZW5zIHRvIGJlIDQgKyAoMSArIDQyKSAqICgyICogMTgpIGJ5dGVzLAorCSAgIHdoZXJlIDQgaXMgYSBmb3VyIGJ5dGUgaGVhZGVyLCA0MiBpcyB0aGUgbWF4IHNsaWNlZCBWQkkgcGF5bG9hZCwgMSBpcworCSAgIGEgc2luZ2xlIGxpbmUgaGVhZGVyIGJ5dGUgYW5kIDIgKiAxOCBpcyB0aGUgbnVtYmVyIG9mIFZCSSBsaW5lcyBwZXIgZnJhbWUuCisKKwkgICBIb3dldmVyLCBpdCBzZWVtcyB0aGF0IHRoZSBkYXRhIG11c3QgYmUgMUsgYWxpZ25lZCwgc28gd2UgaGF2ZSB0bworCSAgIHBhZCB0aGUgZGF0YSB1bnRpbCB0aGUgMSBvciAyIEsgYm91bmRhcnkuCisKKwkgICBUaGlzIHBvaW50ZXIgYXJyYXkgd2lsbCBhbGxvY2F0ZSAyMDQ5IGJ5dGVzIHRvIHN0b3JlIGVhY2ggVkJJIGZyYW1lLiAqLworCXU4ICpzbGljZWRfbXBlZ19kYXRhW0lWVFZfVkJJX0ZSQU1FU107CisJdTMyIHNsaWNlZF9tcGVnX3NpemVbSVZUVl9WQklfRlJBTUVTXTsKKwlzdHJ1Y3QgaXZ0dl9idWZmZXIgc2xpY2VkX21wZWdfYnVmOworCXUzMiBpbnNlcnRlZF9mcmFtZTsKKworCXUzMiBzdGFydFsyXSwgY291bnQ7CisJdTMyIHJhd19zaXplOworCXUzMiBzbGljZWRfc2l6ZTsKK307CisKKy8qIGZvcndhcmQgZGVjbGFyYXRpb24gb2Ygc3RydWN0IGRlZmluZWQgaW4gaXZ0di1jYXJkcy5oICovCitzdHJ1Y3QgaXZ0dl9jYXJkOworCisvKiBTdHJ1Y3QgdG8gaG9sZCBpbmZvIGFib3V0IGl2dHYgY2FyZHMgKi8KK3N0cnVjdCBpdnR2IHsKKwlpbnQgbnVtOwkJLyogYm9hcmQgbnVtYmVyLCAtMSBkdXJpbmcgaW5pdCEgKi8KKwljaGFyIG5hbWVbOF07CQkvKiBib2FyZCBuYW1lIGZvciBwcmludGsgYW5kIGludGVycnVwdHMgKGUuZy4gJ2l2dHYwJykgKi8KKwlzdHJ1Y3QgcGNpX2RldiAqZGV2OwkvKiBQQ0kgZGV2aWNlICovCisJY29uc3Qgc3RydWN0IGl2dHZfY2FyZCAqY2FyZDsJLyogY2FyZCBpbmZvcm1hdGlvbiAqLworCWNvbnN0IGNoYXIgKmNhcmRfbmFtZTsgIC8qIGZ1bGwgbmFtZSBvZiB0aGUgY2FyZCAqLworCXU4IGhhc19jeDIzNDE1OwkJLyogMSBpZiBpdCBpcyBhIGN4MjM0MTUgYmFzZWQgY2FyZCwgMCBmb3IgY3gyMzQxNiAqLworCXU4IGlzXzUwaHo7CisJdTggaXNfNjBoejsKKwl1OCBpc19vdXRfNTBoejsKKwl1OCBpc19vdXRfNjBoejsKKwl1OCBwdnIxNTBfd29ya2Fyb3VuZDsgICAvKiAxIGlmIHRoZSBjeDI1ODQwIG5lZWRzIHRvIHdvcmthcm91bmQgYSBQVlIxNTAgYnVnICovCisJdTggbm9mX2lucHV0czsJCS8qIG51bWJlciBvZiB2aWRlbyBpbnB1dHMgKi8KKwl1OCBub2ZfYXVkaW9faW5wdXRzOwkvKiBudW1iZXIgb2YgYXVkaW8gaW5wdXRzICovCisJdTMyIHY0bDJfY2FwOwkJLyogVjRMMiBjYXBhYmlsaXRpZXMgb2YgY2FyZCAqLworCXUzMiBod19mbGFnczsgCQkvKiBIYXJkd2FyZSBkZXNjcmlwdGlvbiBvZiB0aGUgYm9hcmQgKi8KKworCS8qIGNvbnRyb2xsaW5nIFZpZGVvIGRlY29kZXIgZnVuY3Rpb24gKi8KKwlpbnQgKCp2aWRlb19kZWNfZnVuYykoc3RydWN0IGl2dHYgKiwgdW5zaWduZWQgaW50LCB2b2lkICopOworCisJc3RydWN0IGl2dHZfb3B0aW9ucyBvcHRpb25zOyAJLyogVXNlciBvcHRpb25zICovCisJaW50IHN0cmVhbV9idWZfc2l6ZVtJVlRWX01BWF9TVFJFQU1TXTsgLyogU3RyZWFtIGJ1ZmZlciBzaXplICovCisJc3RydWN0IGl2dHZfc3RyZWFtIHN0cmVhbXNbSVZUVl9NQVhfU1RSRUFNU107IAkvKiBTdHJlYW0gZGF0YSAqLworCWludCBzcGVlZDsKKwl1OCBzcGVlZF9tdXRlX2F1ZGlvOworCXVuc2lnbmVkIGxvbmcgaV9mbGFnczsgIC8qIGdsb2JhbCBpdnR2IGZsYWdzICovCisJYXRvbWljX3QgY2FwdHVyaW5nOwkvKiBjb3VudCBudW1iZXIgb2YgYWN0aXZlIGNhcHR1cmUgc3RyZWFtcyAqLworCWF0b21pY190IGRlY29kaW5nOwkvKiBjb3VudCBudW1iZXIgb2YgYWN0aXZlIGRlY29kaW5nIHN0cmVhbXMgKi8KKwl1MzIgaXJxX3JyX2lkeDsgLyogUm91bmQtcm9iaW4gc3RyZWFtIGluZGV4ICovCisJaW50IGN1cl9kbWFfc3RyZWFtOwkvKiBpbmRleCBvZiBzdHJlYW0gZG9pbmcgRE1BICovCisJdTMyIGRtYV9kYXRhX3JlcV9vZmZzZXQ7CisJdTMyIGRtYV9kYXRhX3JlcV9zaXplOworCWludCBvdXRwdXRfbW9kZTsgICAgICAgIC8qIE5PTkUsIE1QRywgWVVWLCBVRE1BIFlVViwgcGFzc3Rocm91Z2ggKi8KKwlzcGlubG9ja190IGxvY2s7ICAgICAgICAvKiBsb2NrIGFjY2VzcyB0byB0aGlzIHN0cnVjdCAqLworCWludCBzZWFyY2hfcGFja19oZWFkZXI7CisKKwlzcGlubG9ja190IGRtYV9yZWdfbG9jazsgLyogbG9jayBhY2Nlc3MgdG8gRE1BIGVuZ2luZSByZWdpc3RlcnMgKi8KKworCS8qIFVzZXIgYmFzZWQgRE1BIGZvciBPU0QgKi8KKwlzdHJ1Y3QgaXZ0dl91c2VyX2RtYSB1ZG1hOworCisJaW50IG9wZW5faWQ7CQkvKiBpbmNyZW1lbnRlZCBlYWNoIHRpbWUgYW4gb3BlbiBvY2N1cnMsIHVzZWQgYXMgdW5pcXVlIElELgorCQkJCSAgIHN0YXJ0cyBhdCAxLCBzbyAwIGNhbiBiZSB1c2VkIGFzIHVuaW5pdGlhbGl6ZWQgdmFsdWUKKwkJCQkgICBpbiB0aGUgc3RyZWFtLT5pZC4gKi8KKworCXUzMiBiYXNlX2FkZHI7CisJdTMyIGlycW1hc2s7CisKKwlzdHJ1Y3QgdjRsMl9wcmlvX3N0YXRlIHByaW87CisJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmlycV93b3JrX3F1ZXVlczsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgaXJxX3dvcmtfcXVldWU7CisJc3RydWN0IHRpbWVyX2xpc3QgZG1hX3RpbWVyOyAvKiBUaW1lciB1c2VkIHRvIGNhdGNoIHVuZmluaXNoZWQgRE1BcyAqLworCisJc3RydWN0IHZiaV9pbmZvIHZiaTsKKworCXN0cnVjdCBpdnR2X21haWxib3hfZGF0YSBlbmNfbWJveDsKKwlzdHJ1Y3QgaXZ0dl9tYWlsYm94X2RhdGEgZGVjX21ib3g7CisJc3RydWN0IGl2dHZfYXBpX2NhY2hlIGFwaV9jYWNoZVsyNTZdOyAJLyogQ2FjaGVkIEFQSSBDb21tYW5kcyAqLworCisJdTggY2FyZF9yZXY7CisJdm9sYXRpbGUgdm9pZCBfX2lvbWVtICplbmNfbWVtLCAqZGVjX21lbSwgKnJlZ19tZW07CisKKwl1MzIgcGdtX2luZm9fb2Zmc2V0OworCXUzMiBwZ21faW5mb19udW07CisJdTMyIHBnbV9pbmZvX3dyaXRlX2lkeDsKKwl1MzIgcGdtX2luZm9fcmVhZF9pZHg7CisJc3RydWN0IHY0bDJfZW5jX2lkeF9lbnRyeSBwZ21faW5mb1tJVlRWX01BWF9QR01fSU5ERVhdOworCisJdTY0IG1wZ19kYXRhX3JlY2VpdmVkOworCXU2NCB2YmlfZGF0YV9pbnNlcnRlZDsKKworCXdhaXRfcXVldWVfaGVhZF90IGNhcF93OworCS8qIHdoZW4gdGhlIG5leHQgZGVjb2RlciBldmVudCBhcnJpdmVzIHRoaXMgcXVldWUgaXMgd29rZW4gdXAgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCBldmVudF93YWl0cTsKKwkvKiB3aGVuIHRoZSBuZXh0IGRlY29kZXIgdnN5bmMgYXJyaXZlcyB0aGlzIHF1ZXVlIGlzIHdva2VuIHVwICovCisJd2FpdF9xdWV1ZV9oZWFkX3QgdnN5bmNfd2FpdHE7CisJLyogd2hlbiB0aGUgY3VycmVudCBETUEgaXMgZmluaXNoZWQgdGhpcyBxdWV1ZSBpcyB3b2tlbiB1cCAqLworCXdhaXRfcXVldWVfaGVhZF90IGRtYV93YWl0cTsKKworCS8qIE9TRCBzdXBwb3J0ICovCisJdW5zaWduZWQgbG9uZyBvc2RfdmlkZW9fcGJhc2U7CisJaW50IG9zZF9nbG9iYWxfYWxwaGFfc3RhdGU7IC8qIDA9b2ZmIDogMT1vbiAqLworCWludCBvc2RfbG9jYWxfYWxwaGFfc3RhdGU7ICAvKiAwPW9mZiA6IDE9b24gKi8KKwlpbnQgb3NkX2NvbG9yX2tleV9zdGF0ZTsgICAgLyogMD1vZmYgOiAxPW9uICovCisJdTggIG9zZF9nbG9iYWxfYWxwaGE7ICAgICAgIC8qIEN1cnJlbnQgZ2xvYmFsIGFscGhhICovCisJdTMyIG9zZF9jb2xvcl9rZXk7ICAgICAgICAgIC8qIEN1cnJlbnQgY29sb3Iga2V5ICovCisJdTMyIG9zZF9waXhlbGZvcm1hdDsgCSAgICAvKiBDdXJyZW50IHBpeGVsIGZvcm1hdCAqLworCXN0cnVjdCB2NGwyX3JlY3Qgb3NkX3JlY3Q7ICAvKiBDdXJyZW50IE9TRCBwb3NpdGlvbiBhbmQgc2l6ZSAqLworCXN0cnVjdCB2NGwyX3JlY3QgbWFpbl9yZWN0OyAvKiBDdXJyZW50IE1haW4gd2luZG93IHBvc2l0aW9uIGFuZCBzaXplICovCisKKwl1MzIgbGFzdF9kZWNfdGltaW5nWzNdOyAgICAgLyogU3RvcmUgbGFzdCByZXRyaWV2ZWQgcHRzL3Njci9mcmFtZSB2YWx1ZXMgKi8KKworCS8qIGkyYyAqLworCXN0cnVjdCBpMmNfYWRhcHRlciBpMmNfYWRhcDsKKwlzdHJ1Y3QgaTJjX2FsZ29fYml0X2RhdGEgaTJjX2FsZ287CisJc3RydWN0IGkyY19jbGllbnQgaTJjX2NsaWVudDsKKwlzdHJ1Y3QgbXV0ZXggaTJjX2J1c19sb2NrOworCWludCBpMmNfc3RhdGU7CisJc3RydWN0IGkyY19jbGllbnQgKmkyY19jbGllbnRzW0kyQ19DTElFTlRTX01BWF07CisKKwkvKiB2NGwyIGFuZCBVc2VyIHNldHRpbmdzICovCisKKwkvKiBjb2RlYyBzZXR0aW5ncyAqLworCXN0cnVjdCBjeDIzNDF4X21wZWdfcGFyYW1zIHBhcmFtczsKKwl1MzIgYXVkaW9faW5wdXQ7CisJdTMyIGFjdGl2ZV9pbnB1dDsKKwl1MzIgYWN0aXZlX291dHB1dDsKKwl2NGwyX3N0ZF9pZCBzdGQ7CisJdjRsMl9zdGRfaWQgc3RkX291dDsKKwl2NGwyX3N0ZF9pZCB0dW5lcl9zdGQ7CS8qIFRoZSBub3JtIG9mIHRoZSB0dW5lciAoZml4ZWQpICovCisJdTggYXVkaW9fc3RlcmVvX21vZGU7CisJdTggYXVkaW9fYmlsaW5ndWFsX21vZGU7CisKKwkvKiBkdWFsd2F0Y2ggKi8KKwl1bnNpZ25lZCBsb25nIGR1YWx3YXRjaF9qaWZmaWVzOworCXUxNiBkdWFsd2F0Y2hfc3RlcmVvX21vZGU7CisKKwkvKiBEaWdpdGl6ZXIgdHlwZSAqLworCWludCBkaWdpdGl6ZXI7CQkvKiAweDAwRUYgPSBzYWE3MTE0IDB4MDBGTyA9IHNhYTcxMTUgMHgwMTA2ID0gbWljICovCisKKwl1MzIgbGFzdFZzeW5jRnJhbWU7CisKKwlzdHJ1Y3QgeXV2X3BsYXliYWNrX2luZm8geXV2X2luZm87CisJc3RydWN0IG9zZF9pbmZvICpvc2RfaW5mbzsKK307CisKKy8qIEdsb2JhbHMgKi8KK2V4dGVybiBzdHJ1Y3QgaXZ0diAqaXZ0dl9jYXJkc1tdOworZXh0ZXJuIGludCBpdnR2X2NhcmRzX2FjdGl2ZTsKK2V4dGVybiBpbnQgaXZ0dl9maXJzdF9taW5vcjsKK2V4dGVybiBzcGlubG9ja190IGl2dHZfY2FyZHNfbG9jazsKKworLyo9PT09PT09PT09PT09PVByb3RvdHlwZXM9PT09PT09PT09PT09PT09PT0qLworCisvKiBIYXJkd2FyZS9JUlEgKi8KK3ZvaWQgaXZ0dl9zZXRfaXJxX21hc2soc3RydWN0IGl2dHYgKml0diwgdTMyIG1hc2spOwordm9pZCBpdnR2X2NsZWFyX2lycV9tYXNrKHN0cnVjdCBpdnR2ICppdHYsIHUzMiBtYXNrKTsKKworLyogdHJ5IHRvIHNldCBvdXRwdXQgbW9kZSwgcmV0dXJuIGN1cnJlbnQgbW9kZS4gKi8KK2ludCBpdnR2X3NldF9vdXRwdXRfbW9kZShzdHJ1Y3QgaXZ0diAqaXR2LCBpbnQgbW9kZSk7CisKKy8qIHJldHVybiBjdXJyZW50IG91dHB1dCBzdHJlYW0gYmFzZWQgb24gY3VycmVudCBtb2RlICovCitzdHJ1Y3QgaXZ0dl9zdHJlYW0gKml2dHZfZ2V0X291dHB1dF9zdHJlYW0oc3RydWN0IGl2dHYgKml0dik7CisKKy8qIFJldHVybiBub24temVybyBpZiBhIHNpZ25hbCBpcyBwZW5kaW5nICovCitpbnQgaXZ0dl9zbGVlcF90aW1lb3V0KGludCB0aW1lb3V0LCBpbnQgaW50cik7CisKKy8qIFdhaXQgb24gcXVldWUsIHJldHVybnMgLUVJTlRSIGlmIGludGVycnVwdGVkICovCitpbnQgaXZ0dl93YWl0cSh3YWl0X3F1ZXVlX2hlYWRfdCAqd2FpdHEpOworCisvKiBSZWFkIEhhdXBwYXVnZSBlZXByb20gKi8KK3N0cnVjdCB0dmVlcHJvbTsgLyogZm9yd2FyZCByZWZlcmVuY2UgKi8KK3ZvaWQgaXZ0dl9yZWFkX2VlcHJvbShzdHJ1Y3QgaXZ0diAqaXR2LCBzdHJ1Y3QgdHZlZXByb20gKnR2KTsKKworLyogVGhpcyBpcyBhIFBDSSBwb3N0IHRoaW5nLCB3aGVyZSBpZiB0aGUgcGNpIHJlZ2lzdGVyIGlzIG5vdCByZWFkLCB0aGVuCisgICB0aGUgd3JpdGUgZG9lc24ndCBhbHdheXMgdGFrZSBlZmZlY3QgcmlnaHQgYXdheS4gQnkgcmVhZGluZyBiYWNrIHRoZQorICAgcmVnaXN0ZXIgYW55IHBlbmRpbmcgUENJIHdyaXRlcyB3aWxsIGJlIHBlcmZvcm1lZCAoaW4gb3JkZXIpLCBhbmQgc28KKyAgIHlvdSBjYW4gYmUgc3VyZSB0aGF0IHRoZSB3cml0ZXMgYXJlIGd1YXJhbnRlZWQgdG8gYmUgZG9uZS4KKworICAgUmFyZWx5IG5lZWRlZCwgb25seSBpbiBzb21lIHRpbWluZyBzZW5zaXRpdmUgY2FzZXMuCisgICBBcHBhcmVudGx5IGlmIHRoaXMgaXMgbm90IGRvbmUgc29tZSBtb3RoZXJib2FyZHMgc2VlbQorICAgdG8ga2lsbCB0aGUgZmlybXdhcmUgYW5kIGdldCBpbnRvIHRoZSBicm9rZW4gc3RhdGUgdW50aWwgY29tcHV0ZXIgaXMKKyAgIHJlYm9vdGVkLiAqLworI2RlZmluZSB3cml0ZV9zeW5jKHZhbCwgcmVnKSBcCisJZG8geyB3cml0ZWwodmFsLCByZWcpOyByZWFkbChyZWcpOyB9IHdoaWxlICgwKQorCisjZGVmaW5lIHJlYWRfcmVnKHJlZykgcmVhZGwoaXR2LT5yZWdfbWVtICsgKHJlZykpCisjZGVmaW5lIHdyaXRlX3JlZyh2YWwsIHJlZykgd3JpdGVsKHZhbCwgaXR2LT5yZWdfbWVtICsgKHJlZykpCisjZGVmaW5lIHdyaXRlX3JlZ19zeW5jKHZhbCwgcmVnKSBcCisJZG8geyB3cml0ZV9yZWcodmFsLCByZWcpOyByZWFkX3JlZyhyZWcpOyB9IHdoaWxlICgwKQorCisjZGVmaW5lIHJlYWRfZW5jKGFkZHIpIHJlYWRsKGl0di0+ZW5jX21lbSArICh1MzIpKGFkZHIpKQorI2RlZmluZSB3cml0ZV9lbmModmFsLCBhZGRyKSB3cml0ZWwodmFsLCBpdHYtPmVuY19tZW0gKyAodTMyKShhZGRyKSkKKyNkZWZpbmUgd3JpdGVfZW5jX3N5bmModmFsLCBhZGRyKSBcCisJZG8geyB3cml0ZV9lbmModmFsLCBhZGRyKTsgcmVhZF9lbmMoYWRkcik7IH0gd2hpbGUgKDApCisKKyNkZWZpbmUgcmVhZF9kZWMoYWRkcikgcmVhZGwoaXR2LT5kZWNfbWVtICsgKHUzMikoYWRkcikpCisjZGVmaW5lIHdyaXRlX2RlYyh2YWwsIGFkZHIpIHdyaXRlbCh2YWwsIGl0di0+ZGVjX21lbSArICh1MzIpKGFkZHIpKQorI2RlZmluZSB3cml0ZV9kZWNfc3luYyh2YWwsIGFkZHIpIFwKKwlkbyB7IHdyaXRlX2RlYyh2YWwsIGFkZHIpOyByZWFkX2RlYyhhZGRyKTsgfSB3aGlsZSAoMCkKKworI2VuZGlmIC8qIElWVFZfRFJJVkVSX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWZpbGVvcHMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWZpbGVvcHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjM3MDk3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtZmlsZW9wcy5jCkBAIC0wLDAgKzEsOTIxIEBACisvKgorICAgIGZpbGUgb3BlcmF0aW9uIGZ1bmN0aW9ucworICAgIENvcHlyaWdodCAoQykgMjAwMy0yMDA0ICBLZXZpbiBUaGF5ZXIgPG51ZmFuX3dmayBhdCB5YWhvby5jb20+CisgICAgQ29weXJpZ2h0IChDKSAyMDA0ICBDaHJpcyBLZW5uZWR5IDxjQGdyb292eS5vcmc+CisgICAgQ29weXJpZ2h0IChDKSAyMDA1LTIwMDcgIEhhbnMgVmVya3VpbCA8aHZlcmt1aWxAeHM0YWxsLm5sPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpbmNsdWRlICJpdnR2LWRyaXZlci5oIgorI2luY2x1ZGUgIml2dHYtZmlsZW9wcy5oIgorI2luY2x1ZGUgIml2dHYtaTJjLmgiCisjaW5jbHVkZSAiaXZ0di1xdWV1ZS5oIgorI2luY2x1ZGUgIml2dHYtdWRtYS5oIgorI2luY2x1ZGUgIml2dHYtaXJxLmgiCisjaW5jbHVkZSAiaXZ0di12YmkuaCIKKyNpbmNsdWRlICJpdnR2LW1haWxib3guaCIKKyNpbmNsdWRlICJpdnR2LWF1ZGlvLmgiCisjaW5jbHVkZSAiaXZ0di1zdHJlYW1zLmgiCisjaW5jbHVkZSAiaXZ0di15dXYuaCIKKyNpbmNsdWRlICJpdnR2LWNvbnRyb2xzLmgiCisjaW5jbHVkZSAiaXZ0di1pb2N0bC5oIgorCisvKiBUaGlzIGZ1bmN0aW9uIHRyaWVzIHRvIGNsYWltIHRoZSBzdHJlYW0gZm9yIGEgc3BlY2lmaWMgZmlsZSBkZXNjcmlwdG9yLgorICAgSWYgbm8gb25lIGVsc2UgaXMgdXNpbmcgdGhpcyBzdHJlYW0gdGhlbiB0aGUgc3RyZWFtIGlzIGNsYWltZWQgYW5kCisgICBhc3NvY2lhdGVkIFZCSSBzdHJlYW1zIGFyZSBhbHNvIGF1dG9tYXRpY2FsbHkgY2xhaW1lZC4KKyAgIFBvc3NpYmxlIGVycm9yIHJldHVybnM6IC1FQlVTWSBpZiBzb21lb25lIGVsc2UgaGFzIGNsYWltZWQKKyAgIHRoZSBzdHJlYW0gb3IgMCBvbiBzdWNjZXNzLiAqLworaW50IGl2dHZfY2xhaW1fc3RyZWFtKHN0cnVjdCBpdnR2X29wZW5faWQgKmlkLCBpbnQgdHlwZSkKK3sKKwlzdHJ1Y3QgaXZ0diAqaXR2ID0gaWQtPml0djsKKwlzdHJ1Y3QgaXZ0dl9zdHJlYW0gKnMgPSAmaXR2LT5zdHJlYW1zW3R5cGVdOworCXN0cnVjdCBpdnR2X3N0cmVhbSAqc192Ymk7CisJaW50IHZiaV90eXBlOworCisJaWYgKHRlc3RfYW5kX3NldF9iaXQoSVZUVl9GX1NfQ0xBSU1FRCwgJnMtPnNfZmxhZ3MpKSB7CisJCS8qIHNvbWVvbmUgYWxyZWFkeSBjbGFpbWVkIHRoaXMgc3RyZWFtICovCisJCWlmIChzLT5pZCA9PSBpZC0+b3Blbl9pZCkgeworCQkJLyogeWVzLCB0aGlzIGZpbGUgZGVzY3JpcHRvciBkaWQuIFNvIHRoYXQncyBPSy4gKi8KKwkJCXJldHVybiAwOworCQl9CisJCWlmIChzLT5pZCA9PSAtMSAmJiAodHlwZSA9PSBJVlRWX0RFQ19TVFJFQU1fVFlQRV9WQkkgfHwKKwkJCQkJIHR5cGUgPT0gSVZUVl9FTkNfU1RSRUFNX1RZUEVfVkJJKSkgeworCQkJLyogVkJJIGlzIGhhbmRsZWQgYWxyZWFkeSBpbnRlcm5hbGx5LCBub3cgYWxzbyBhc3NpZ24KKwkJCSAgIHRoZSBmaWxlIGRlc2NyaXB0b3IgdG8gdGhpcyBzdHJlYW0gZm9yIGV4dGVybmFsCisJCQkgICByZWFkaW5nIG9mIHRoZSBzdHJlYW0uICovCisJCQlzLT5pZCA9IGlkLT5vcGVuX2lkOworCQkJSVZUVl9ERUJVR19JTkZPKCJTdGFydCBSZWFkIFZCSVxuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQkvKiBzb21lb25lIGVsc2UgaXMgdXNpbmcgdGhpcyBzdHJlYW0gYWxyZWFkeSAqLworCQlJVlRWX0RFQlVHX0lORk8oIlN0cmVhbSAlZCBpcyBidXN5XG4iLCB0eXBlKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJcy0+aWQgPSBpZC0+b3Blbl9pZDsKKwlpZiAodHlwZSA9PSBJVlRWX0RFQ19TVFJFQU1fVFlQRV9WQkkpIHsKKwkJLyogRW5hYmxlIHJlaW5zZXJ0aW9uIGludGVycnVwdCAqLworCQlpdnR2X2NsZWFyX2lycV9tYXNrKGl0diwgSVZUVl9JUlFfREVDX1ZCSV9SRV9JTlNFUlQpOworCX0KKworCS8qIElWVFZfREVDX1NUUkVBTV9UWVBFX01QRyBuZWVkcyB0byBjbGFpbSBJVlRWX0RFQ19TVFJFQU1fVFlQRV9WQkksCisJICAgSVZUVl9FTkNfU1RSRUFNX1RZUEVfTVBHIG5lZWRzIHRvIGNsYWltIElWVFZfRU5DX1NUUkVBTV9UWVBFX1ZCSQorCSAgIChwcm92aWRlZCBWQkkgaW5zZXJ0aW9uIGlzIG9uIGFuZCBzbGljZWQgVkJJIGlzIHNlbGVjdGVkKSwgZm9yIGFsbAorCSAgIG90aGVyIHN0cmVhbXMgd2UncmUgZG9uZSAqLworCWlmICh0eXBlID09IElWVFZfREVDX1NUUkVBTV9UWVBFX01QRykgeworCQl2YmlfdHlwZSA9IElWVFZfREVDX1NUUkVBTV9UWVBFX1ZCSTsKKwl9IGVsc2UgaWYgKHR5cGUgPT0gSVZUVl9FTkNfU1RSRUFNX1RZUEVfTVBHICYmCisJCSAgIGl0di0+dmJpLmluc2VydF9tcGVnICYmIGl0di0+dmJpLnNsaWNlZF9pbi0+c2VydmljZV9zZXQpIHsKKwkJdmJpX3R5cGUgPSBJVlRWX0VOQ19TVFJFQU1fVFlQRV9WQkk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIDA7CisJfQorCXNfdmJpID0gJml0di0+c3RyZWFtc1t2YmlfdHlwZV07CisKKwlpZiAoIXRlc3RfYW5kX3NldF9iaXQoSVZUVl9GX1NfQ0xBSU1FRCwgJnNfdmJpLT5zX2ZsYWdzKSkgeworCQkvKiBFbmFibGUgcmVpbnNlcnRpb24gaW50ZXJydXB0ICovCisJCWlmICh2YmlfdHlwZSA9PSBJVlRWX0RFQ19TVFJFQU1fVFlQRV9WQkkpCisJCQlpdnR2X2NsZWFyX2lycV9tYXNrKGl0diwgSVZUVl9JUlFfREVDX1ZCSV9SRV9JTlNFUlQpOworCX0KKwkvKiBtYXJrIHRoYXQgaXQgaXMgdXNlZCBpbnRlcm5hbGx5ICovCisJc2V0X2JpdChJVlRWX0ZfU19JTlRFUk5BTF9VU0UsICZzX3ZiaS0+c19mbGFncyk7CisJcmV0dXJuIDA7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gcmVsZWFzZXMgYSBwcmV2aW91c2x5IGNsYWltZWQgc3RyZWFtLiBJdCB3aWxsIHRha2UgaW50bworICAgYWNjb3VudCBhc3NvY2lhdGVkIFZCSSBzdHJlYW1zLiAqLwordm9pZCBpdnR2X3JlbGVhc2Vfc3RyZWFtKHN0cnVjdCBpdnR2X3N0cmVhbSAqcykKK3sKKwlzdHJ1Y3QgaXZ0diAqaXR2ID0gcy0+aXR2OworCXN0cnVjdCBpdnR2X3N0cmVhbSAqc192Ymk7CisKKwlzLT5pZCA9IC0xOworCWlmICgocy0+dHlwZSA9PSBJVlRWX0RFQ19TVFJFQU1fVFlQRV9WQkkgfHwgcy0+dHlwZSA9PSBJVlRWX0VOQ19TVFJFQU1fVFlQRV9WQkkpICYmCisJCXRlc3RfYml0KElWVFZfRl9TX0lOVEVSTkFMX1VTRSwgJnMtPnNfZmxhZ3MpKSB7CisJCS8qIHRoaXMgc3RyZWFtIGlzIHN0aWxsIGluIHVzZSBpbnRlcm5hbGx5ICovCisJCXJldHVybjsKKwl9CisJaWYgKCF0ZXN0X2FuZF9jbGVhcl9iaXQoSVZUVl9GX1NfQ0xBSU1FRCwgJnMtPnNfZmxhZ3MpKSB7CisJCUlWVFZfREVCVUdfV0FSTigiUmVsZWFzZSBzdHJlYW0gJXMgbm90IGluIHVzZSFcbiIsIHMtPm5hbWUpOworCQlyZXR1cm47CisJfQorCisJaXZ0dl9mbHVzaF9xdWV1ZXMocyk7CisKKwkvKiBkaXNhYmxlIHJlaW5zZXJ0aW9uIGludGVycnVwdCAqLworCWlmIChzLT50eXBlID09IElWVFZfREVDX1NUUkVBTV9UWVBFX1ZCSSkKKwkJaXZ0dl9zZXRfaXJxX21hc2soaXR2LCBJVlRWX0lSUV9ERUNfVkJJX1JFX0lOU0VSVCk7CisKKwkvKiBJVlRWX0RFQ19TVFJFQU1fVFlQRV9NUEcgbmVlZHMgdG8gcmVsZWFzZSBJVlRWX0RFQ19TVFJFQU1fVFlQRV9WQkksCisJICAgSVZUVl9FTkNfU1RSRUFNX1RZUEVfTVBHIG5lZWRzIHRvIHJlbGVhc2UgSVZUVl9FTkNfU1RSRUFNX1RZUEVfVkJJLAorCSAgIGZvciBhbGwgb3RoZXIgc3RyZWFtcyB3ZSdyZSBkb25lICovCisJaWYgKHMtPnR5cGUgPT0gSVZUVl9ERUNfU1RSRUFNX1RZUEVfTVBHKQorCQlzX3ZiaSA9ICZpdHYtPnN0cmVhbXNbSVZUVl9ERUNfU1RSRUFNX1RZUEVfVkJJXTsKKwllbHNlIGlmIChzLT50eXBlID09IElWVFZfRU5DX1NUUkVBTV9UWVBFX01QRykKKwkJc192YmkgPSAmaXR2LT5zdHJlYW1zW0lWVFZfRU5DX1NUUkVBTV9UWVBFX1ZCSV07CisJZWxzZQorCQlyZXR1cm47CisKKwkvKiBjbGVhciBpbnRlcm5hbCB1c2UgZmxhZyAqLworCWlmICghdGVzdF9hbmRfY2xlYXJfYml0KElWVFZfRl9TX0lOVEVSTkFMX1VTRSwgJnNfdmJpLT5zX2ZsYWdzKSkgeworCQkvKiB3YXMgYWxyZWFkeSBjbGVhcmVkICovCisJCXJldHVybjsKKwl9CisJaWYgKHNfdmJpLT5pZCAhPSAtMSkgeworCQkvKiBWQkkgc3RyZWFtIHN0aWxsIGNsYWltZWQgYnkgYSBmaWxlIGRlc2NyaXB0b3IgKi8KKwkJcmV0dXJuOworCX0KKwkvKiBkaXNhYmxlIHJlaW5zZXJ0aW9uIGludGVycnVwdCAqLworCWlmIChzX3ZiaS0+dHlwZSA9PSBJVlRWX0RFQ19TVFJFQU1fVFlQRV9WQkkpCisJCWl2dHZfc2V0X2lycV9tYXNrKGl0diwgSVZUVl9JUlFfREVDX1ZCSV9SRV9JTlNFUlQpOworCWNsZWFyX2JpdChJVlRWX0ZfU19DTEFJTUVELCAmc192YmktPnNfZmxhZ3MpOworCWl2dHZfZmx1c2hfcXVldWVzKHNfdmJpKTsKK30KKworc3RhdGljIHZvaWQgaXZ0dl9kdWFsd2F0Y2goc3RydWN0IGl2dHYgKml0dikKK3sKKwlzdHJ1Y3QgdjRsMl90dW5lciB2dDsKKwl1MTYgbmV3X2JpdG1hcDsKKwl1MTYgbmV3X3N0ZXJlb19tb2RlOworCWNvbnN0IHUxNiBzdGVyZW9fbWFzayA9IDB4MDMwMDsKKwljb25zdCB1MTYgZHVhbCA9IDB4MDIwMDsKKworCW5ld19zdGVyZW9fbW9kZSA9IGl0di0+cGFyYW1zLmF1ZGlvX3Byb3BlcnRpZXMgJiBzdGVyZW9fbWFzazsKKwltZW1zZXQoJnZ0LCAwLCBzaXplb2YodnQpKTsKKwlpdnR2X2NhbGxfaTJjX2NsaWVudHMoaXR2LCBWSURJT0NfR19UVU5FUiwgJnZ0KTsKKwlpZiAodnQuYXVkbW9kZSA9PSBWNEwyX1RVTkVSX01PREVfTEFORzFfTEFORzIgJiYgKHZ0LnJ4c3ViY2hhbnMgJiBWNEwyX1RVTkVSX1NVQl9MQU5HMikpCisJCW5ld19zdGVyZW9fbW9kZSA9IGR1YWw7CisKKwlpZiAobmV3X3N0ZXJlb19tb2RlID09IGl0di0+ZHVhbHdhdGNoX3N0ZXJlb19tb2RlKQorCQlyZXR1cm47CisKKwluZXdfYml0bWFwID0gbmV3X3N0ZXJlb19tb2RlIHwgKGl0di0+cGFyYW1zLmF1ZGlvX3Byb3BlcnRpZXMgJiB+c3RlcmVvX21hc2spOworCisJSVZUVl9ERUJVR19JTkZPKCJkdWFsd2F0Y2g6IGNoYW5nZSBzdGVyZW8gZmxhZyBmcm9tIDB4JXggdG8gMHgleC4gbmV3IGF1ZGlvX2JpdG1hc2s9MHgldXhcbiIsCisJCQkgICBpdHYtPmR1YWx3YXRjaF9zdGVyZW9fbW9kZSwgbmV3X3N0ZXJlb19tb2RlLCBuZXdfYml0bWFwKTsKKworCWlmIChpdnR2X3ZhcGkoaXR2LCBDWDIzNDFYX0VOQ19TRVRfQVVESU9fUFJPUEVSVElFUywgMSwgbmV3X2JpdG1hcCkgPT0gMCkgeworCQlpdHYtPmR1YWx3YXRjaF9zdGVyZW9fbW9kZSA9IG5ld19zdGVyZW9fbW9kZTsKKwkJcmV0dXJuOworCX0KKwlJVlRWX0RFQlVHX0lORk8oImR1YWx3YXRjaDogY2hhbmdpbmcgc3RlcmVvIGZsYWcgZmFpbGVkXG4iKTsKK30KKworc3RhdGljIHZvaWQgaXZ0dl91cGRhdGVfcGdtX2luZm8oc3RydWN0IGl2dHYgKml0dikKK3sKKwl1MzIgd3JfaWR4ID0gKHJlYWRfZW5jKGl0di0+cGdtX2luZm9fb2Zmc2V0KSAtIGl0di0+cGdtX2luZm9fb2Zmc2V0IC0gNCkgLyAyNDsKKwlpbnQgY250OworCWludCBpID0gMDsKKworCWlmICh3cl9pZHggPj0gaXR2LT5wZ21faW5mb19udW0pIHsKKwkJSVZUVl9ERUJVR19XQVJOKCJJbnZhbGlkIFBHTSBpbmRleCAlZCAoPj0gJWQpXG4iLCB3cl9pZHgsIGl0di0+cGdtX2luZm9fbnVtKTsKKwkJcmV0dXJuOworCX0KKwljbnQgPSAod3JfaWR4ICsgaXR2LT5wZ21faW5mb19udW0gLSBpdHYtPnBnbV9pbmZvX3dyaXRlX2lkeCkgJSBpdHYtPnBnbV9pbmZvX251bTsKKwl3aGlsZSAoaSA8IGNudCkgeworCQlpbnQgaWR4ID0gKGl0di0+cGdtX2luZm9fd3JpdGVfaWR4ICsgaSkgJSBpdHYtPnBnbV9pbmZvX251bTsKKwkJc3RydWN0IHY0bDJfZW5jX2lkeF9lbnRyeSAqZSA9IGl0di0+cGdtX2luZm8gKyBpZHg7CisJCXUzMiBhZGRyID0gaXR2LT5wZ21faW5mb19vZmZzZXQgKyA0ICsgaWR4ICogMjQ7CisJCWNvbnN0IGludCBtYXBwaW5nW10gPSB7IFY0TDJfRU5DX0lEWF9GUkFNRV9QLCBWNEwyX0VOQ19JRFhfRlJBTUVfSSwgVjRMMl9FTkNfSURYX0ZSQU1FX0IsIDAgfTsKKworCQllLT5vZmZzZXQgPSByZWFkX2VuYyhhZGRyICsgNCkgKyAoKHU2NClyZWFkX2VuYyhhZGRyICsgOCkgPDwgMzIpOworCQlpZiAoZS0+b2Zmc2V0ID4gaXR2LT5tcGdfZGF0YV9yZWNlaXZlZCkgeworCQkJYnJlYWs7CisJCX0KKwkJZS0+b2Zmc2V0ICs9IGl0di0+dmJpX2RhdGFfaW5zZXJ0ZWQ7CisJCWUtPmxlbmd0aCA9IHJlYWRfZW5jKGFkZHIpOworCQllLT5wdHMgPSByZWFkX2VuYyhhZGRyICsgMTYpICsgKCh1NjQpKHJlYWRfZW5jKGFkZHIgKyAyMCkgJiAxKSA8PCAzMik7CisJCWUtPmZsYWdzID0gbWFwcGluZ1tyZWFkX2VuYyhhZGRyICsgMTIpICYgM107CisJCWkrKzsKKwl9CisJaXR2LT5wZ21faW5mb193cml0ZV9pZHggPSAoaXR2LT5wZ21faW5mb193cml0ZV9pZHggKyBpKSAlIGl0di0+cGdtX2luZm9fbnVtOworfQorCitzdGF0aWMgc3RydWN0IGl2dHZfYnVmZmVyICppdnR2X2dldF9idWZmZXIoc3RydWN0IGl2dHZfc3RyZWFtICpzLCBpbnQgbm9uX2Jsb2NrLCBpbnQgKmVycikKK3sKKwlzdHJ1Y3QgaXZ0diAqaXR2ID0gcy0+aXR2OworCXN0cnVjdCBpdnR2X3N0cmVhbSAqc192YmkgPSAmaXR2LT5zdHJlYW1zW0lWVFZfRU5DX1NUUkVBTV9UWVBFX1ZCSV07CisJc3RydWN0IGl2dHZfYnVmZmVyICpidWY7CisJREVGSU5FX1dBSVQod2FpdCk7CisKKwkqZXJyID0gMDsKKwl3aGlsZSAoMSkgeworCQlpZiAocy0+dHlwZSA9PSBJVlRWX0VOQ19TVFJFQU1fVFlQRV9NUEcpIHsKKwkJCS8qIFByb2Nlc3MgcGVuZGluZyBwcm9ncmFtIGluZm8gdXBkYXRlcyBhbmQgcGVuZGluZyBWQkkgZGF0YSAqLworCQkJaXZ0dl91cGRhdGVfcGdtX2luZm8oaXR2KTsKKworCQkJaWYgKGppZmZpZXMgLSBpdHYtPmR1YWx3YXRjaF9qaWZmaWVzID4gSFopIHsKKwkJCQlpdHYtPmR1YWx3YXRjaF9qaWZmaWVzID0gamlmZmllczsKKwkJCQlpdnR2X2R1YWx3YXRjaChpdHYpOworCQkJfQorCisJCQlpZiAodGVzdF9iaXQoSVZUVl9GX1NfSU5URVJOQUxfVVNFLCAmc192YmktPnNfZmxhZ3MpICYmCisJCQkgICAgIXRlc3RfYml0KElWVFZfRl9TX0FQUExfSU8sICZzX3ZiaS0+c19mbGFncykpIHsKKwkJCQl3aGlsZSAoKGJ1ZiA9IGl2dHZfZGVxdWV1ZShzX3ZiaSwgJnNfdmJpLT5xX2Z1bGwpKSkgeworCQkJCQkvKiBieXRlc3dhcCBhbmQgcHJvY2VzcyBWQkkgZGF0YSAqLworCQkJCQlpdnR2X3Byb2Nlc3NfdmJpX2RhdGEoaXR2LCBidWYsIHNfdmJpLT5kbWFfcHRzLCBzX3ZiaS0+dHlwZSk7CisJCQkJCWl2dHZfZW5xdWV1ZShzX3ZiaSwgYnVmLCAmc192YmktPnFfZnJlZSk7CisJCQkJfQorCQkJfQorCQkJYnVmID0gJml0di0+dmJpLnNsaWNlZF9tcGVnX2J1ZjsKKwkJCWlmIChidWYtPnJlYWRwb3MgIT0gYnVmLT5ieXRlc3VzZWQpIHsKKwkJCQlyZXR1cm4gYnVmOworCQkJfQorCQl9CisKKwkJLyogZG8gd2UgaGF2ZSBsZWZ0b3ZlciBkYXRhPyAqLworCQlidWYgPSBpdnR2X2RlcXVldWUocywgJnMtPnFfaW8pOworCQlpZiAoYnVmKQorCQkJcmV0dXJuIGJ1ZjsKKworCQkvKiBkbyB3ZSBoYXZlIG5ldyBkYXRhPyAqLworCQlidWYgPSBpdnR2X2RlcXVldWUocywgJnMtPnFfZnVsbCk7CisJCWlmIChidWYpIHsKKwkJCWlmICghdGVzdF9hbmRfY2xlYXJfYml0KElWVFZfRl9CX05FRURfQlVGX1NXQVAsICZidWYtPmJfZmxhZ3MpKQorCQkJCXJldHVybiBidWY7CisJCQlpZiAocy0+dHlwZSA9PSBJVlRWX0VOQ19TVFJFQU1fVFlQRV9NUEcpCisJCQkJLyogYnl0ZXN3YXAgTVBHIGRhdGEgKi8KKwkJCQlpdnR2X2J1Zl9zd2FwKGJ1Zik7CisJCQllbHNlIGlmIChzLT50eXBlICE9IElWVFZfREVDX1NUUkVBTV9UWVBFX1ZCSSkgeworCQkJCS8qIGJ5dGVzd2FwIGFuZCBwcm9jZXNzIFZCSSBkYXRhICovCisJCQkJaXZ0dl9wcm9jZXNzX3ZiaV9kYXRhKGl0diwgYnVmLCBzLT5kbWFfcHRzLCBzLT50eXBlKTsKKwkJCX0KKwkJCXJldHVybiBidWY7CisJCX0KKwkJLyogcmV0dXJuIGlmIGZpbGUgd2FzIG9wZW5lZCB3aXRoIE9fTk9OQkxPQ0sgKi8KKwkJaWYgKG5vbl9ibG9jaykgeworCQkJKmVyciA9IC1FQUdBSU47CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCS8qIHJldHVybiBpZiBlbmQgb2Ygc3RyZWFtICovCisJCWlmIChzLT50eXBlICE9IElWVFZfREVDX1NUUkVBTV9UWVBFX1ZCSSAmJiAhdGVzdF9iaXQoSVZUVl9GX1NfU1RSRUFNSU5HLCAmcy0+c19mbGFncykpIHsKKwkJCWNsZWFyX2JpdChJVlRWX0ZfU19TVFJFQU1PRkYsICZzLT5zX2ZsYWdzKTsKKwkJCUlWVFZfREVCVUdfSU5GTygiRU9TICVzXG4iLCBzLT5uYW1lKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJLyogd2FpdCBmb3IgbW9yZSBkYXRhIHRvIGFycml2ZSAqLworCQlwcmVwYXJlX3RvX3dhaXQoJnMtPndhaXRxLCAmd2FpdCwgVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJLyogTmV3IGJ1ZmZlcnMgbWlnaHQgaGF2ZSBiZWNvbWUgYXZhaWxhYmxlIGJlZm9yZSB3ZSB3ZXJlIGFkZGVkIHRvIHRoZSB3YWl0cXVldWUgKi8KKwkJaWYgKCFzLT5xX2Z1bGwuYnVmZmVycykKKwkJCXNjaGVkdWxlKCk7CisJCWZpbmlzaF93YWl0KCZzLT53YWl0cSwgJndhaXQpOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCS8qIHJldHVybiBpZiBhIHNpZ25hbCB3YXMgcmVjZWl2ZWQgKi8KKwkJCUlWVFZfREVCVUdfSU5GTygiVXNlciBzdG9wcGVkICVzXG4iLCBzLT5uYW1lKTsKKwkJCSplcnIgPSAtRUlOVFI7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgaXZ0dl9zZXR1cF9zbGljZWRfdmJpX2J1ZihzdHJ1Y3QgaXZ0diAqaXR2KQoreworCWludCBpZHggPSBpdHYtPnZiaS5pbnNlcnRlZF9mcmFtZSAlIElWVFZfVkJJX0ZSQU1FUzsKKworCWl0di0+dmJpLnNsaWNlZF9tcGVnX2J1Zi5idWYgPSBpdHYtPnZiaS5zbGljZWRfbXBlZ19kYXRhW2lkeF07CisJaXR2LT52Ymkuc2xpY2VkX21wZWdfYnVmLmJ5dGVzdXNlZCA9IGl0di0+dmJpLnNsaWNlZF9tcGVnX3NpemVbaWR4XTsKKwlpdHYtPnZiaS5zbGljZWRfbXBlZ19idWYucmVhZHBvcyA9IDA7Cit9CisKK3N0YXRpYyBzaXplX3QgaXZ0dl9jb3B5X2J1Zl90b191c2VyKHN0cnVjdCBpdnR2X3N0cmVhbSAqcywgc3RydWN0IGl2dHZfYnVmZmVyICpidWYsCisJCWNoYXIgX191c2VyICp1YnVmLCBzaXplX3QgdWNvdW50KQoreworCXN0cnVjdCBpdnR2ICppdHYgPSBzLT5pdHY7CisJc2l6ZV90IGxlbiA9IGJ1Zi0+Ynl0ZXN1c2VkIC0gYnVmLT5yZWFkcG9zOworCisJaWYgKGxlbiA+IHVjb3VudCkgbGVuID0gdWNvdW50OworCWlmIChpdHYtPnZiaS5pbnNlcnRfbXBlZyAmJiBzLT50eXBlID09IElWVFZfRU5DX1NUUkVBTV9UWVBFX01QRyAmJgorCSAgICBpdHYtPnZiaS5zbGljZWRfaW4tPnNlcnZpY2Vfc2V0ICYmIGJ1ZiAhPSAmaXR2LT52Ymkuc2xpY2VkX21wZWdfYnVmKSB7CisJCWNvbnN0IGNoYXIgKnN0YXJ0ID0gYnVmLT5idWYgKyBidWYtPnJlYWRwb3M7CisJCWNvbnN0IGNoYXIgKnAgPSBzdGFydCArIDE7CisJCWNvbnN0IHU4ICpxOworCQl1OCBjaCA9IGl0di0+c2VhcmNoX3BhY2tfaGVhZGVyID8gMHhiYSA6IDB4ZTA7CisJCWludCBzdHVmZmluZywgaTsKKworCQl3aGlsZSAoc3RhcnQgKyBsZW4gPiBwICYmIChxID0gbWVtY2hyKHAsIDAsIHN0YXJ0ICsgbGVuIC0gcCkpKSB7CisJCQlwID0gcSArIDE7CisJCQlpZiAoKGNoYXIgKilxICsgMTUgPj0gYnVmLT5idWYgKyBidWYtPmJ5dGVzdXNlZCB8fAorCQkJICAgIHFbMV0gIT0gMCB8fCBxWzJdICE9IDEgfHwgcVszXSAhPSBjaCkgeworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFpdHYtPnNlYXJjaF9wYWNrX2hlYWRlcikgeworCQkJCWlmICgocVs2XSAmIDB4YzApICE9IDB4ODApCisJCQkJCWNvbnRpbnVlOworCQkJCWlmICgoKHFbN10gJiAweGMwKSA9PSAweDgwICYmIChxWzldICYgMHhmMCkgPT0gMHgyMCkgfHwKKwkJCQkgICAgKChxWzddICYgMHhjMCkgPT0gMHhjMCAmJiAocVs5XSAmIDB4ZjApID09IDB4MzApKSB7CisJCQkJCWNoID0gMHhiYTsKKwkJCQkJaXR2LT5zZWFyY2hfcGFja19oZWFkZXIgPSAxOworCQkJCQlwID0gcSArIDk7CisJCQkJfQorCQkJCWNvbnRpbnVlOworCQkJfQorCQkJc3R1ZmZpbmcgPSBxWzEzXSAmIDc7CisJCQkvKiBhbGwgc3R1ZmZpbmcgYnl0ZXMgbXVzdCBiZSAweGZmICovCisJCQlmb3IgKGkgPSAwOyBpIDwgc3R1ZmZpbmc7IGkrKykKKwkJCQlpZiAocVsxNCArIGldICE9IDB4ZmYpCisJCQkJCWJyZWFrOworCQkJaWYgKGkgPT0gc3R1ZmZpbmcgJiYgKHFbNF0gJiAweGM0KSA9PSAweDQ0ICYmIChxWzEyXSAmIDMpID09IDMgJiYKKwkJCQkJcVsxNCArIHN0dWZmaW5nXSA9PSAwICYmIHFbMTUgKyBzdHVmZmluZ10gPT0gMCAmJgorCQkJCQlxWzE2ICsgc3R1ZmZpbmddID09IDEpIHsKKwkJCQlpdHYtPnNlYXJjaF9wYWNrX2hlYWRlciA9IDA7CisJCQkJbGVuID0gKGNoYXIgKilxIC0gc3RhcnQ7CisJCQkJaXZ0dl9zZXR1cF9zbGljZWRfdmJpX2J1ZihpdHYpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCWlmIChjb3B5X3RvX3VzZXIodWJ1ZiwgKHU4ICopYnVmLT5idWYgKyBidWYtPnJlYWRwb3MsIGxlbikpIHsKKwkJSVZUVl9ERUJVR19XQVJOKCJjb3B5ICV6ZCBieXRlcyB0byB1c2VyIGZhaWxlZCBmb3IgJXNcbiIsIGxlbiwgcy0+bmFtZSk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwkvKklWVFZfSU5GTygiY29waWVkICVsbGQgJWQgJWQgJWQgJWQgJWQgdmJpICVkXG4iLCBpdHYtPm1wZ19kYXRhX3JlY2VpdmVkLCBsZW4sIHVjb3VudCwKKwkJCWJ1Zi0+cmVhZHBvcywgYnVmLT5ieXRlc3VzZWQsIGJ1Zi0+Ynl0ZXN1c2VkIC0gYnVmLT5yZWFkcG9zIC0gbGVuLAorCQkJYnVmID09ICZpdHYtPnZiaS5zbGljZWRfbXBlZ19idWYpOyAqLworCWJ1Zi0+cmVhZHBvcyArPSBsZW47CisJaWYgKHMtPnR5cGUgPT0gSVZUVl9FTkNfU1RSRUFNX1RZUEVfTVBHICYmIGJ1ZiAhPSAmaXR2LT52Ymkuc2xpY2VkX21wZWdfYnVmKQorCQlpdHYtPm1wZ19kYXRhX3JlY2VpdmVkICs9IGxlbjsKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgc3NpemVfdCBpdnR2X3JlYWQoc3RydWN0IGl2dHZfc3RyZWFtICpzLCBjaGFyIF9fdXNlciAqdWJ1Ziwgc2l6ZV90IHRvdF9jb3VudCwgaW50IG5vbl9ibG9jaykKK3sKKwlzdHJ1Y3QgaXZ0diAqaXR2ID0gcy0+aXR2OworCXNpemVfdCB0b3Rfd3JpdHRlbiA9IDA7CisJaW50IHNpbmdsZV9mcmFtZSA9IDA7CisKKwlpZiAoYXRvbWljX3JlYWQoJml0di0+Y2FwdHVyaW5nKSA9PSAwICYmIHMtPmlkID09IC0xKSB7CisJCS8qIHNob3VsZG4ndCBoYXBwZW4gKi8KKwkJSVZUVl9ERUJVR19XQVJOKCJTdHJlYW0gJXMgbm90IGluaXRpYWxpemVkIGJlZm9yZSByZWFkXG4iLCBzLT5uYW1lKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogRWFjaCBWQkkgYnVmZmVyIGlzIG9uZSBmcmFtZSwgdGhlIHY0bDIgQVBJIHNheXMgdGhhdCBmb3IgVkJJIHRoZSBmcmFtZXMgc2hvdWxkCisJICAgYXJyaXZlIG9uZS1ieS1vbmUsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciBvdXRwdXQgbW9yZSB0aGFuIG9uZSBWQkkgZnJhbWUgYXQgYSB0aW1lICovCisJaWYgKHMtPnR5cGUgPT0gSVZUVl9ERUNfU1RSRUFNX1RZUEVfVkJJIHx8CisJCQkocy0+dHlwZSA9PSBJVlRWX0VOQ19TVFJFQU1fVFlQRV9WQkkgJiYgaXR2LT52Ymkuc2xpY2VkX2luLT5zZXJ2aWNlX3NldCkpCisJCXNpbmdsZV9mcmFtZSA9IDE7CisKKwlmb3IgKDs7KSB7CisJCXN0cnVjdCBpdnR2X2J1ZmZlciAqYnVmOworCQlpbnQgcmM7CisKKwkJYnVmID0gaXZ0dl9nZXRfYnVmZmVyKHMsIG5vbl9ibG9jaywgJnJjKTsKKwkJaWYgKGJ1ZiA9PSBOVUxMICYmIHJjID09IC1FQUdBSU4gJiYgdG90X3dyaXR0ZW4pCisJCQlicmVhazsKKwkJaWYgKGJ1ZiA9PSBOVUxMKQorCQkJcmV0dXJuIHJjOworCQlyYyA9IGl2dHZfY29weV9idWZfdG9fdXNlcihzLCBidWYsIHVidWYgKyB0b3Rfd3JpdHRlbiwgdG90X2NvdW50IC0gdG90X3dyaXR0ZW4pOworCQlpZiAoYnVmICE9ICZpdHYtPnZiaS5zbGljZWRfbXBlZ19idWYpIHsKKwkJCWl2dHZfZW5xdWV1ZShzLCBidWYsIChidWYtPnJlYWRwb3MgPT0gYnVmLT5ieXRlc3VzZWQpID8gJnMtPnFfZnJlZSA6ICZzLT5xX2lvKTsKKwkJfQorCQllbHNlIGlmIChidWYtPnJlYWRwb3MgPT0gYnVmLT5ieXRlc3VzZWQpIHsKKwkJCWludCBpZHggPSBpdHYtPnZiaS5pbnNlcnRlZF9mcmFtZSAlIElWVFZfVkJJX0ZSQU1FUzsKKwkJCWl0di0+dmJpLnNsaWNlZF9tcGVnX3NpemVbaWR4XSA9IDA7CisJCQlpdHYtPnZiaS5pbnNlcnRlZF9mcmFtZSsrOworCQkJaXR2LT52YmlfZGF0YV9pbnNlcnRlZCArPSBidWYtPmJ5dGVzdXNlZDsKKwkJfQorCQlpZiAocmMgPCAwKQorCQkJcmV0dXJuIHJjOworCQl0b3Rfd3JpdHRlbiArPSByYzsKKworCQlpZiAodG90X3dyaXR0ZW4gPT0gdG90X2NvdW50IHx8IHNpbmdsZV9mcmFtZSkKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gdG90X3dyaXR0ZW47Cit9CisKK3N0YXRpYyBzc2l6ZV90IGl2dHZfcmVhZF9wb3Moc3RydWN0IGl2dHZfc3RyZWFtICpzLCBjaGFyIF9fdXNlciAqdWJ1Ziwgc2l6ZV90IGNvdW50LAorCQkJbG9mZl90ICpwb3MsIGludCBub25fYmxvY2spCit7CisJc3NpemVfdCByYyA9IGNvdW50ID8gaXZ0dl9yZWFkKHMsIHVidWYsIGNvdW50LCBub25fYmxvY2spIDogMDsKKwlzdHJ1Y3QgaXZ0diAqaXR2ID0gcy0+aXR2OworCisJSVZUVl9ERUJVR19JTkZPKCJyZWFkICV6ZCBmcm9tICVzLCBnb3QgJXpkXG4iLCBjb3VudCwgcy0+bmFtZSwgcmMpOworCWlmIChyYyA+IDApCisJCXBvcyArPSByYzsKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBpdnR2X3N0YXJ0X2NhcHR1cmUoc3RydWN0IGl2dHZfb3Blbl9pZCAqaWQpCit7CisJc3RydWN0IGl2dHYgKml0diA9IGlkLT5pdHY7CisJc3RydWN0IGl2dHZfc3RyZWFtICpzID0gJml0di0+c3RyZWFtc1tpZC0+dHlwZV07CisJc3RydWN0IGl2dHZfc3RyZWFtICpzX3ZiaTsKKworCWlmIChzLT50eXBlID09IElWVFZfRU5DX1NUUkVBTV9UWVBFX1JBRCB8fAorCSAgICBzLT50eXBlID09IElWVFZfREVDX1NUUkVBTV9UWVBFX01QRyB8fAorCSAgICBzLT50eXBlID09IElWVFZfREVDX1NUUkVBTV9UWVBFX1lVViB8fAorCSAgICBzLT50eXBlID09IElWVFZfREVDX1NUUkVBTV9UWVBFX1ZPVVQpIHsKKwkJLyogeW91IGNhbm5vdCByZWFkIGZyb20gdGhlc2Ugc3RyZWFtIHR5cGVzLiAqLworCQlyZXR1cm4gLUVQRVJNOworCX0KKworCS8qIFRyeSB0byBjbGFpbSB0aGlzIHN0cmVhbS4gKi8KKwlpZiAoaXZ0dl9jbGFpbV9zdHJlYW0oaWQsIHMtPnR5cGUpKQorCQlyZXR1cm4gLUVCVVNZOworCisJLyogVGhpcyBzdHJlYW0gZG9lcyBub3QgbmVlZCB0byBzdGFydCBjYXB0dXJpbmcgKi8KKwlpZiAocy0+dHlwZSA9PSBJVlRWX0RFQ19TVFJFQU1fVFlQRV9WQkkpIHsKKwkJc2V0X2JpdChJVlRWX0ZfU19BUFBMX0lPLCAmcy0+c19mbGFncyk7CisJCXJldHVybiAwOworCX0KKworCS8qIElmIGNhcHR1cmUgaXMgYWxyZWFkeSBpbiBwcm9ncmVzcywgdGhlbiB3ZSBhbHNvIGhhdmUgdG8KKwkgICBkbyBub3RoaW5nIGV4dHJhLiAqLworCWlmICh0ZXN0X2JpdChJVlRWX0ZfU19TVFJFQU1PRkYsICZzLT5zX2ZsYWdzKSB8fCB0ZXN0X2FuZF9zZXRfYml0KElWVFZfRl9TX1NUUkVBTUlORywgJnMtPnNfZmxhZ3MpKSB7CisJCXNldF9iaXQoSVZUVl9GX1NfQVBQTF9JTywgJnMtPnNfZmxhZ3MpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBTdGFydCBWQkkgY2FwdHVyZSBpZiByZXF1aXJlZCAqLworCXNfdmJpID0gJml0di0+c3RyZWFtc1tJVlRWX0VOQ19TVFJFQU1fVFlQRV9WQkldOworCWlmIChzLT50eXBlID09IElWVFZfRU5DX1NUUkVBTV9UWVBFX01QRyAmJgorCSAgICB0ZXN0X2JpdChJVlRWX0ZfU19JTlRFUk5BTF9VU0UsICZzX3ZiaS0+c19mbGFncykgJiYKKwkgICAgIXRlc3RfYW5kX3NldF9iaXQoSVZUVl9GX1NfU1RSRUFNSU5HLCAmc192YmktPnNfZmxhZ3MpKSB7CisJCS8qIE5vdGU6IHRoZSBJVlRWX0VOQ19TVFJFQU1fVFlQRV9WQkkgaXMgY2xhaW1lZAorCQkgICBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIE1QRyBzdHJlYW0gaXMgY2xhaW1lZC4KKwkJICAgV2Ugb25seSBuZWVkIHRvIHN0YXJ0IHRoZSBWQkkgY2FwdHVyaW5nLiAqLworCQlpZiAoaXZ0dl9zdGFydF92NGwyX2VuY29kZV9zdHJlYW0oc192YmkpKSB7CisJCQlJVlRWX0RFQlVHX1dBUk4oIlZCSSBjYXB0dXJlIHN0YXJ0IGZhaWxlZFxuIik7CisKKwkJCS8qIEZhaWx1cmUsIGNsZWFuIHVwIGFuZCByZXR1cm4gYW4gZXJyb3IgKi8KKwkJCWNsZWFyX2JpdChJVlRWX0ZfU19TVFJFQU1JTkcsICZzX3ZiaS0+c19mbGFncyk7CisJCQljbGVhcl9iaXQoSVZUVl9GX1NfU1RSRUFNSU5HLCAmcy0+c19mbGFncyk7CisJCQkvKiBhbHNvIHJlbGVhc2VzIHRoZSBhc3NvY2lhdGVkIFZCSSBzdHJlYW0gKi8KKwkJCWl2dHZfcmVsZWFzZV9zdHJlYW0ocyk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQlJVlRWX0RFQlVHX0lORk8oIlZCSSBpbnNlcnRpb24gc3RhcnRlZFxuIik7CisJfQorCisJLyogVGVsbCB0aGUgY2FyZCB0byBzdGFydCBjYXB0dXJpbmcgKi8KKwlpZiAoIWl2dHZfc3RhcnRfdjRsMl9lbmNvZGVfc3RyZWFtKHMpKSB7CisJCS8qIFdlJ3JlIGRvbmUgKi8KKwkJc2V0X2JpdChJVlRWX0ZfU19BUFBMX0lPLCAmcy0+c19mbGFncyk7CisJCS8qIFJlc3VtZSBhIHBvc3NpYmx5IHBhdXNlZCBlbmNvZGVyICovCisJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoSVZUVl9GX0lfRU5DX1BBVVNFRCwgJml0di0+aV9mbGFncykpCisJCQlpdnR2X3ZhcGkoaXR2LCBDWDIzNDFYX0VOQ19QQVVTRV9FTkNPREVSLCAxLCAxKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogZmFpbHVyZSwgY2xlYW4gdXAgKi8KKwlJVlRWX0RFQlVHX1dBUk4oIkZhaWxlZCB0byBzdGFydCBjYXB0dXJpbmcgZm9yIHN0cmVhbSAlc1xuIiwgcy0+bmFtZSk7CisKKwkvKiBOb3RlOiB0aGUgSVZUVl9FTkNfU1RSRUFNX1RZUEVfVkJJIGlzIHJlbGVhc2VkCisJICAgYXV0b21hdGljYWxseSB3aGVuIHRoZSBNUEcgc3RyZWFtIGlzIHJlbGVhc2VkLgorCSAgIFdlIG9ubHkgbmVlZCB0byBzdG9wIHRoZSBWQkkgY2FwdHVyaW5nLiAqLworCWlmIChzLT50eXBlID09IElWVFZfRU5DX1NUUkVBTV9UWVBFX01QRyAmJgorCSAgICB0ZXN0X2JpdChJVlRWX0ZfU19TVFJFQU1JTkcsICZzX3ZiaS0+c19mbGFncykpIHsKKwkJaXZ0dl9zdG9wX3Y0bDJfZW5jb2RlX3N0cmVhbShzX3ZiaSwgMCk7CisJCWNsZWFyX2JpdChJVlRWX0ZfU19TVFJFQU1JTkcsICZzX3ZiaS0+c19mbGFncyk7CisJfQorCWNsZWFyX2JpdChJVlRWX0ZfU19TVFJFQU1JTkcsICZzLT5zX2ZsYWdzKTsKKwlpdnR2X3JlbGVhc2Vfc3RyZWFtKHMpOworCXJldHVybiAtRUlPOworfQorCitzc2l6ZV90IGl2dHZfdjRsMl9yZWFkKHN0cnVjdCBmaWxlICogZmlscCwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKiBwb3MpCit7CisJc3RydWN0IGl2dHZfb3Blbl9pZCAqaWQgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGl2dHYgKml0diA9IGlkLT5pdHY7CisJc3RydWN0IGl2dHZfc3RyZWFtICpzID0gJml0di0+c3RyZWFtc1tpZC0+dHlwZV07CisJaW50IHJjOworCisJSVZUVl9ERUJVR19JT0NUTCgicmVhZCAlemQgYnl0ZXMgZnJvbSAlc1xuIiwgY291bnQsIHMtPm5hbWUpOworCisJcmMgPSBpdnR2X3N0YXJ0X2NhcHR1cmUoaWQpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCXJldHVybiBpdnR2X3JlYWRfcG9zKHMsIGJ1ZiwgY291bnQsIHBvcywgZmlscC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOworfQorCitpbnQgaXZ0dl9zdGFydF9kZWNvZGluZyhzdHJ1Y3QgaXZ0dl9vcGVuX2lkICppZCwgaW50IHNwZWVkKQoreworCXN0cnVjdCBpdnR2ICppdHYgPSBpZC0+aXR2OworCXN0cnVjdCBpdnR2X3N0cmVhbSAqcyA9ICZpdHYtPnN0cmVhbXNbaWQtPnR5cGVdOworCisJaWYgKGF0b21pY19yZWFkKCZpdHYtPmRlY29kaW5nKSA9PSAwKSB7CisJCWlmIChpdnR2X2NsYWltX3N0cmVhbShpZCwgcy0+dHlwZSkpIHsKKwkJCS8qIHNvbWVvbmUgZWxzZSBpcyB1c2luZyB0aGlzIHN0cmVhbSBhbHJlYWR5ICovCisJCQlJVlRWX0RFQlVHX1dBUk4oInN0YXJ0IGRlY29kZSwgc3RyZWFtIGFscmVhZHkgY2xhaW1lZFxuIik7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisJCWl2dHZfc3RhcnRfdjRsMl9kZWNvZGVfc3RyZWFtKHMsIDApOworCX0KKwlpZiAocy0+dHlwZSA9PSBJVlRWX0RFQ19TVFJFQU1fVFlQRV9NUEcpCisJCXJldHVybiBpdnR2X3NldF9zcGVlZChpdHYsIHNwZWVkKTsKKwlyZXR1cm4gMDsKK30KKworc3NpemVfdCBpdnR2X3Y0bDJfd3JpdGUoc3RydWN0IGZpbGUgKmZpbHAsIGNvbnN0IGNoYXIgX191c2VyICp1c2VyX2J1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3QgaXZ0dl9vcGVuX2lkICppZCA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgaXZ0diAqaXR2ID0gaWQtPml0djsKKwlzdHJ1Y3QgaXZ0dl9zdHJlYW0gKnMgPSAmaXR2LT5zdHJlYW1zW2lkLT50eXBlXTsKKwlzdHJ1Y3QgaXZ0dl9idWZmZXIgKmJ1ZjsKKwlzdHJ1Y3QgaXZ0dl9xdWV1ZSBxOworCWludCBieXRlc193cml0dGVuID0gMDsKKwlpbnQgbW9kZTsKKwlpbnQgcmM7CisJREVGSU5FX1dBSVQod2FpdCk7CisKKwlJVlRWX0RFQlVHX0lPQ1RMKCJ3cml0ZSAlemQgYnl0ZXMgdG8gJXNcbiIsIGNvdW50LCBzLT5uYW1lKTsKKworCWlmIChzLT50eXBlICE9IElWVFZfREVDX1NUUkVBTV9UWVBFX01QRyAmJgorCSAgICBzLT50eXBlICE9IElWVFZfREVDX1NUUkVBTV9UWVBFX1lVViAmJgorCSAgICBzLT50eXBlICE9IElWVFZfREVDX1NUUkVBTV9UWVBFX1ZPVVQpCisJCS8qIG5vdCBkZWNvZGVyIHN0cmVhbXMgKi8KKwkJcmV0dXJuIC1FUEVSTTsKKworCS8qIFRyeSB0byBjbGFpbSB0aGlzIHN0cmVhbSAqLworCWlmIChpdnR2X2NsYWltX3N0cmVhbShpZCwgcy0+dHlwZSkpCisJCXJldHVybiAtRUJVU1k7CisKKwkvKiBUaGlzIHN0cmVhbSBkb2VzIG5vdCBuZWVkIHRvIHN0YXJ0IGFueSBkZWNvZGluZyAqLworCWlmIChzLT50eXBlID09IElWVFZfREVDX1NUUkVBTV9UWVBFX1ZPVVQpIHsKKwkJc2V0X2JpdChJVlRWX0ZfU19BUFBMX0lPLCAmcy0+c19mbGFncyk7CisJCXJldHVybiBpdnR2X3dyaXRlX3ZiaShpdHYsIHVzZXJfYnVmLCBjb3VudCk7CisJfQorCisJbW9kZSA9IHMtPnR5cGUgPT0gSVZUVl9ERUNfU1RSRUFNX1RZUEVfTVBHID8gT1VUX01QRyA6IE9VVF9ZVVY7CisKKwlpZiAoaXZ0dl9zZXRfb3V0cHV0X21vZGUoaXR2LCBtb2RlKSAhPSBtb2RlKSB7CisJICAgIGl2dHZfcmVsZWFzZV9zdHJlYW0ocyk7CisJICAgIHJldHVybiAtRUJVU1k7CisJfQorCWl2dHZfcXVldWVfaW5pdCgmcSk7CisJc2V0X2JpdChJVlRWX0ZfU19BUFBMX0lPLCAmcy0+c19mbGFncyk7CisKK3JldHJ5OgorCWZvciAoOzspIHsKKwkJLyogR2F0aGVyIGJ1ZmZlcnMgKi8KKwkJd2hpbGUgKHEubGVuZ3RoIC0gcS5ieXRlc3VzZWQgPCBjb3VudCAmJiAoYnVmID0gaXZ0dl9kZXF1ZXVlKHMsICZzLT5xX2lvKSkpCisJCQlpdnR2X2VucXVldWUocywgYnVmLCAmcSk7CisJCXdoaWxlIChxLmxlbmd0aCAtIHEuYnl0ZXN1c2VkIDwgY291bnQgJiYgKGJ1ZiA9IGl2dHZfZGVxdWV1ZShzLCAmcy0+cV9mcmVlKSkpIHsKKwkJCWl2dHZfZW5xdWV1ZShzLCBidWYsICZxKTsKKwkJfQorCQlpZiAocS5idWZmZXJzKQorCQkJYnJlYWs7CisJCWlmIChmaWxwLT5mX2ZsYWdzICYgT19OT05CTE9DSykKKwkJCXJldHVybiAtRUFHQUlOOworCQlwcmVwYXJlX3RvX3dhaXQoJnMtPndhaXRxLCAmd2FpdCwgVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJLyogTmV3IGJ1ZmZlcnMgbWlnaHQgaGF2ZSBiZWNvbWUgZnJlZSBiZWZvcmUgd2Ugd2VyZSBhZGRlZCB0byB0aGUgd2FpdHF1ZXVlICovCisJCWlmICghcy0+cV9mcmVlLmJ1ZmZlcnMpCisJCQlzY2hlZHVsZSgpOworCQlmaW5pc2hfd2FpdCgmcy0+d2FpdHEsICZ3YWl0KTsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlJVlRWX0RFQlVHX0lORk8oIlVzZXIgc3RvcHBlZCAlc1xuIiwgcy0+bmFtZSk7CisJCQlyZXR1cm4gLUVJTlRSOworCQl9CisJfQorCisJLyogY29weSB1c2VyIGRhdGEgaW50byBidWZmZXJzICovCisJd2hpbGUgKChidWYgPSBpdnR2X2RlcXVldWUocywgJnEpKSkgeworCQkvKiBNYWtlIHN1cmUgd2UgcmVhbGx5IGdvdCBhbGwgdGhlIHVzZXIgZGF0YSAqLworCQlyYyA9IGl2dHZfYnVmX2NvcHlfZnJvbV91c2VyKHMsIGJ1ZiwgdXNlcl9idWYsIGNvdW50KTsKKworCQlpZiAocmMgPCAwKSB7CisJCQlpdnR2X3F1ZXVlX21vdmUocywgJnEsIE5VTEwsICZzLT5xX2ZyZWUsIDApOworCQkJcmV0dXJuIHJjOworCQl9CisJCXVzZXJfYnVmICs9IHJjOworCQljb3VudCAtPSByYzsKKwkJYnl0ZXNfd3JpdHRlbiArPSByYzsKKworCQlpZiAoYnVmLT5ieXRlc3VzZWQgIT0gcy0+YnVmX3NpemUpIHsKKwkJCS8qIGluY29tcGxldGUsIGxlYXZlIGluIHFfaW8gZm9yIG5leHQgdGltZSAqLworCQkJaXZ0dl9lbnF1ZXVlKHMsIGJ1ZiwgJnMtPnFfaW8pOworCQkJYnJlYWs7CisJCX0KKwkJLyogQnl0ZXN3YXAgTVBFRyBidWZmZXIgKi8KKwkJaWYgKHMtPnR5cGUgPT0gSVZUVl9ERUNfU1RSRUFNX1RZUEVfTVBHKQorCQkJaXZ0dl9idWZfc3dhcChidWYpOworCQlpdnR2X2VucXVldWUocywgYnVmLCAmcy0+cV9mdWxsKTsKKwl9CisKKwkvKiBTdGFydCBkZWNvZGVyIChyZXR1cm5zIDAgaWYgYWxyZWFkeSBzdGFydGVkKSAqLworCXJjID0gaXZ0dl9zdGFydF9kZWNvZGluZyhpZCwgaXR2LT5zcGVlZCk7CisJaWYgKHJjKSB7CisJCUlWVFZfREVCVUdfV0FSTigiRmFpbGVkIHN0YXJ0IGRlY29kZSBzdHJlYW0gJXNcbiIsIHMtPm5hbWUpOworCisJCS8qIGZhaWx1cmUsIGNsZWFuIHVwICovCisJCWNsZWFyX2JpdChJVlRWX0ZfU19TVFJFQU1JTkcsICZzLT5zX2ZsYWdzKTsKKwkJY2xlYXJfYml0KElWVFZfRl9TX0FQUExfSU8sICZzLT5zX2ZsYWdzKTsKKwkJcmV0dXJuIHJjOworCX0KKwlpZiAodGVzdF9iaXQoSVZUVl9GX1NfTkVFRFNfREFUQSwgJnMtPnNfZmxhZ3MpKSB7CisJCWlmIChzLT5xX2Z1bGwubGVuZ3RoID49IGl0di0+ZG1hX2RhdGFfcmVxX3NpemUpIHsKKwkJCWludCBnb3Rfc2lnOworCisJCQlwcmVwYXJlX3RvX3dhaXQoJml0di0+ZG1hX3dhaXRxLCAmd2FpdCwgVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCXdoaWxlICghKGdvdF9zaWcgPSBzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgJiYKKwkJCQkJdGVzdF9iaXQoSVZUVl9GX1NfRE1BX1BFTkRJTkcsICZzLT5zX2ZsYWdzKSkgeworCQkJCXNjaGVkdWxlKCk7CisJCQl9CisJCQlmaW5pc2hfd2FpdCgmaXR2LT5kbWFfd2FpdHEsICZ3YWl0KTsKKwkJCWlmIChnb3Rfc2lnKSB7CisJCQkJSVZUVl9ERUJVR19JTkZPKCJVc2VyIGludGVycnVwdGVkICVzXG4iLCBzLT5uYW1lKTsKKwkJCQlyZXR1cm4gLUVJTlRSOworCQkJfQorCisJCQljbGVhcl9iaXQoSVZUVl9GX1NfTkVFRFNfREFUQSwgJnMtPnNfZmxhZ3MpOworCQkJaXZ0dl9xdWV1ZV9tb3ZlKHMsICZzLT5xX2Z1bGwsIE5VTEwsICZzLT5xX3ByZWRtYSwgaXR2LT5kbWFfZGF0YV9yZXFfc2l6ZSk7CisJCQlpdnR2X2RtYV9zdHJlYW1fZGVjX3ByZXBhcmUocywgaXR2LT5kbWFfZGF0YV9yZXFfb2Zmc2V0ICsgSVZUVl9ERUNPREVSX09GRlNFVCwgMSk7CisJCX0KKwl9CisJLyogbW9yZSB1c2VyIGRhdGEgaXMgYXZhaWxhYmxlLCB3YWl0IHVudGlsIGJ1ZmZlcnMgYmVjb21lIGZyZWUKKwkgICB0byB0cmFuc2ZlciB0aGUgcmVzdC4gKi8KKwlpZiAoY291bnQgJiYgIShmaWxwLT5mX2ZsYWdzICYgT19OT05CTE9DSykpCisJCWdvdG8gcmV0cnk7CisJSVZUVl9ERUJVR19JTkZPKCJXcm90ZSAlZCBieXRlcyB0byAlcyAoJWQpXG4iLCBieXRlc193cml0dGVuLCBzLT5uYW1lLCBzLT5xX2Z1bGwuYnl0ZXN1c2VkKTsKKwlyZXR1cm4gYnl0ZXNfd3JpdHRlbjsKK30KKwordW5zaWduZWQgaW50IGl2dHZfdjRsMl9kZWNfcG9sbChzdHJ1Y3QgZmlsZSAqZmlscCwgcG9sbF90YWJsZSAqd2FpdCkKK3sKKwlzdHJ1Y3QgaXZ0dl9vcGVuX2lkICppZCA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgaXZ0diAqaXR2ID0gaWQtPml0djsKKwlzdHJ1Y3QgaXZ0dl9zdHJlYW0gKnMgPSAmaXR2LT5zdHJlYW1zW2lkLT50eXBlXTsKKwlpbnQgcmVzID0gMDsKKworCS8qIGFkZCBzdHJlYW0ncyB3YWl0cSB0byB0aGUgcG9sbCBsaXN0ICovCisJcG9sbF93YWl0KGZpbHAsICZzLT53YWl0cSwgd2FpdCk7CisKKwlzZXRfYml0KElWVFZfRl9JX0VWX1ZTWU5DX0VOQUJMRUQsICZpdHYtPmlfZmxhZ3MpOworCWlmICh0ZXN0X2JpdChJVlRWX0ZfSV9FVl9WU1lOQywgJml0di0+aV9mbGFncykgfHwKKwkgICAgdGVzdF9iaXQoSVZUVl9GX0lfRVZfREVDX1NUT1BQRUQsICZpdHYtPmlfZmxhZ3MpKQorCQlyZXMgPSBQT0xMUFJJOworCisJLyogQWxsb3cgd3JpdGUgaWYgYnVmZmVycyBhcmUgYXZhaWxhYmxlIGZvciB3cml0aW5nICovCisJaWYgKHMtPnFfZnJlZS5idWZmZXJzKQorCQlyZXMgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk07CisJcmV0dXJuIHJlczsKK30KKwordW5zaWduZWQgaW50IGl2dHZfdjRsMl9lbmNfcG9sbChzdHJ1Y3QgZmlsZSAqZmlscCwgcG9sbF90YWJsZSAqIHdhaXQpCit7CisJc3RydWN0IGl2dHZfb3Blbl9pZCAqaWQgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGl2dHYgKml0diA9IGlkLT5pdHY7CisJc3RydWN0IGl2dHZfc3RyZWFtICpzID0gJml0di0+c3RyZWFtc1tpZC0+dHlwZV07CisJaW50IGVvZiA9IHRlc3RfYml0KElWVFZfRl9TX1NUUkVBTU9GRiwgJnMtPnNfZmxhZ3MpOworCisJLyogU3RhcnQgYSBjYXB0dXJlIGlmIHRoZXJlIGlzIG5vbmUgKi8KKwlpZiAoIWVvZiAmJiAhdGVzdF9iaXQoSVZUVl9GX1NfU1RSRUFNSU5HLCAmcy0+c19mbGFncykpIHsKKwkJaW50IHJjID0gaXZ0dl9zdGFydF9jYXB0dXJlKGlkKTsKKworCQlpZiAocmMpIHsKKwkJCUlWVFZfREVCVUdfSU5GTygiQ291bGQgbm90IHN0YXJ0IGNhcHR1cmUgZm9yICVzICglZClcbiIsCisJCQkJCXMtPm5hbWUsIHJjKTsKKwkJCXJldHVybiBQT0xMRVJSOworCQl9CisJfQorCisJLyogYWRkIHN0cmVhbSdzIHdhaXRxIHRvIHRoZSBwb2xsIGxpc3QgKi8KKwlwb2xsX3dhaXQoZmlscCwgJnMtPndhaXRxLCB3YWl0KTsKKworCWlmIChlb2YgfHwgcy0+cV9mdWxsLmxlbmd0aCkKKwkJcmV0dXJuIFBPTExJTiB8IFBPTExSRE5PUk07CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgaXZ0dl9zdG9wX2NhcHR1cmUoc3RydWN0IGl2dHZfb3Blbl9pZCAqaWQsIGludCBnb3BfZW5kKQoreworCXN0cnVjdCBpdnR2ICppdHYgPSBpZC0+aXR2OworCXN0cnVjdCBpdnR2X3N0cmVhbSAqcyA9ICZpdHYtPnN0cmVhbXNbaWQtPnR5cGVdOworCisJSVZUVl9ERUJVR19JT0NUTCgiY2xvc2UoKSBvZiAlc1xuIiwgcy0+bmFtZSk7CisKKwkvKiAnVW5jbGFpbScgdGhpcyBzdHJlYW0gKi8KKworCS8qIFN0b3AgY2FwdHVyaW5nICovCisJaWYgKHRlc3RfYml0KElWVFZfRl9TX1NUUkVBTUlORywgJnMtPnNfZmxhZ3MpKSB7CisJCXN0cnVjdCBpdnR2X3N0cmVhbSAqc192YmkgPSAmaXR2LT5zdHJlYW1zW0lWVFZfRU5DX1NUUkVBTV9UWVBFX1ZCSV07CisKKwkJSVZUVl9ERUJVR19JTkZPKCJjbG9zZSBzdG9wcGluZyBjYXB0dXJlXG4iKTsKKwkJLyogU3BlY2lhbCBjYXNlOiBhIHJ1bm5pbmcgVkJJIGNhcHR1cmUgZm9yIFZCSSBpbnNlcnRpb24KKwkJICAgaW4gdGhlIG1wZWcgc3RyZWFtLiBOZWVkIHRvIHN0b3AgdGhhdCB0b28uICovCisJCWlmIChpZC0+dHlwZSA9PSBJVlRWX0VOQ19TVFJFQU1fVFlQRV9NUEcgJiYKKwkJICAgIHRlc3RfYml0KElWVFZfRl9TX1NUUkVBTUlORywgJnNfdmJpLT5zX2ZsYWdzKSAmJgorCQkgICAgIXRlc3RfYml0KElWVFZfRl9TX0FQUExfSU8sICZzX3ZiaS0+c19mbGFncykpIHsKKwkJCUlWVFZfREVCVUdfSU5GTygiY2xvc2Ugc3RvcHBpbmcgZW1iZWRkZWQgVkJJIGNhcHR1cmVcbiIpOworCQkJaXZ0dl9zdG9wX3Y0bDJfZW5jb2RlX3N0cmVhbShzX3ZiaSwgMCk7CisJCX0KKwkJaWYgKChpZC0+dHlwZSA9PSBJVlRWX0RFQ19TVFJFQU1fVFlQRV9WQkkgfHwKKwkJICAgICBpZC0+dHlwZSA9PSBJVlRWX0VOQ19TVFJFQU1fVFlQRV9WQkkpICYmCisJCSAgICB0ZXN0X2JpdChJVlRWX0ZfU19JTlRFUk5BTF9VU0UsICZzLT5zX2ZsYWdzKSkgeworCQkJLyogQWxzbyB1c2VkIGludGVybmFsbHksIGRvbid0IHN0b3AgY2FwdHVyaW5nICovCisJCQlzLT5pZCA9IC0xOworCQl9CisJCWVsc2UgeworCQkJaXZ0dl9zdG9wX3Y0bDJfZW5jb2RlX3N0cmVhbShzLCBnb3BfZW5kKTsKKwkJfQorCX0KKwljbGVhcl9iaXQoSVZUVl9GX1NfQVBQTF9JTywgJnMtPnNfZmxhZ3MpOworCWNsZWFyX2JpdChJVlRWX0ZfU19TVFJFQU1PRkYsICZzLT5zX2ZsYWdzKTsKKworCWl2dHZfcmVsZWFzZV9zdHJlYW0ocyk7Cit9CisKK3N0YXRpYyB2b2lkIGl2dHZfc3RvcF9kZWNvZGluZyhzdHJ1Y3QgaXZ0dl9vcGVuX2lkICppZCwgaW50IGZsYWdzLCB1NjQgcHRzKQoreworCXN0cnVjdCBpdnR2ICppdHYgPSBpZC0+aXR2OworCXN0cnVjdCBpdnR2X3N0cmVhbSAqcyA9ICZpdHYtPnN0cmVhbXNbaWQtPnR5cGVdOworCisJSVZUVl9ERUJVR19JT0NUTCgiY2xvc2UoKSBvZiAlc1xuIiwgcy0+bmFtZSk7CisKKwkvKiBTdG9wIGRlY29kaW5nICovCisJaWYgKHRlc3RfYml0KElWVFZfRl9TX1NUUkVBTUlORywgJnMtPnNfZmxhZ3MpKSB7CisJCUlWVFZfREVCVUdfSU5GTygiY2xvc2Ugc3RvcHBpbmcgZGVjb2RlXG4iKTsKKworCQlpdnR2X3N0b3BfdjRsMl9kZWNvZGVfc3RyZWFtKHMsIGZsYWdzLCBwdHMpOworCX0KKwljbGVhcl9iaXQoSVZUVl9GX1NfQVBQTF9JTywgJnMtPnNfZmxhZ3MpOworCWNsZWFyX2JpdChJVlRWX0ZfU19TVFJFQU1PRkYsICZzLT5zX2ZsYWdzKTsKKwlpZiAoaWQtPnR5cGUgPT0gSVZUVl9ERUNfU1RSRUFNX1RZUEVfWVVWICYmIHRlc3RfYml0KElWVFZfRl9JX0RFQ09ESU5HX1lVViwgJml0di0+aV9mbGFncykpIHsKKwkJLyogUmVzdG9yZSByZWdpc3RlcnMgd2UndmUgY2hhbmdlZCAmIGNsZWFuIHVwIGFueSBtZXNzIHdlJ3ZlIG1hZGUgKi8KKwkJaXZ0dl95dXZfY2xvc2UoaXR2KTsKKwl9CisJaWYgKHMtPnR5cGUgPT0gSVZUVl9ERUNfU1RSRUFNX1RZUEVfWVVWICYmIGl0di0+b3V0cHV0X21vZGUgPT0gT1VUX1lVVikKKwkgICAgaXR2LT5vdXRwdXRfbW9kZSA9IE9VVF9OT05FOworCWVsc2UgaWYgKHMtPnR5cGUgPT0gSVZUVl9ERUNfU1RSRUFNX1RZUEVfTVBHICYmIGl0di0+b3V0cHV0X21vZGUgPT0gT1VUX01QRykKKwkgICAgaXR2LT5vdXRwdXRfbW9kZSA9IE9VVF9OT05FOworCisJaXR2LT5zcGVlZCA9IDA7CisJaXZ0dl9yZWxlYXNlX3N0cmVhbShzKTsKK30KKworaW50IGl2dHZfdjRsMl9jbG9zZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3QgaXZ0dl9vcGVuX2lkICppZCA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgaXZ0diAqaXR2ID0gaWQtPml0djsKKwlzdHJ1Y3QgaXZ0dl9zdHJlYW0gKnMgPSAmaXR2LT5zdHJlYW1zW2lkLT50eXBlXTsKKworCUlWVFZfREVCVUdfSU9DVEwoImNsb3NlKCkgb2YgJXNcbiIsIHMtPm5hbWUpOworCisJdjRsMl9wcmlvX2Nsb3NlKCZpdHYtPnByaW8sICZpZC0+cHJpbyk7CisKKwkvKiBFYXN5IGNhc2UgZmlyc3Q6IHRoaXMgc3RyZWFtIHdhcyBuZXZlciBjbGFpbWVkIGJ5IHVzICovCisJaWYgKHMtPmlkICE9IGlkLT5vcGVuX2lkKSB7CisJCWtmcmVlKGlkKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogJ1VuY2xhaW0nIHRoaXMgc3RyZWFtICovCisKKwkvKiBTdG9wIHJhZGlvICovCisJaWYgKGlkLT50eXBlID09IElWVFZfRU5DX1NUUkVBTV9UWVBFX1JBRCkgeworCQkvKiBDbG9zaW5nIHJhZGlvIGRldmljZSwgcmV0dXJuIHRvIFRWIG1vZGUgKi8KKwkJaXZ0dl9tdXRlKGl0dik7CisJCS8qIE1hcmsgdGhhdCB0aGUgcmFkaW8gaXMgbm8gbG9uZ2VyIGluIHVzZSAqLworCQljbGVhcl9iaXQoSVZUVl9GX0lfUkFESU9fVVNFUiwgJml0di0+aV9mbGFncyk7CisJCS8qIFN3aXRjaCB0dW5lciB0byBUViAqLworCQlpdnR2X2NhbGxfaTJjX2NsaWVudHMoaXR2LCBWSURJT0NfU19TVEQsICZpdHYtPnN0ZCk7CisJCS8qIFNlbGVjdCBjb3JyZWN0IGF1ZGlvIGlucHV0IChpLmUuIFRWIHR1bmVyIG9yIExpbmUgaW4pICovCisJCWl2dHZfYXVkaW9fc2V0X2lvKGl0dik7CisJCS8qIERvbmUhIFVubXV0ZSBhbmQgY29udGludWUuICovCisJCWl2dHZfdW5tdXRlKGl0dik7CisJCWl2dHZfcmVsZWFzZV9zdHJlYW0ocyk7CisJfSBlbHNlIGlmIChzLT50eXBlID49IElWVFZfREVDX1NUUkVBTV9UWVBFX01QRykgeworCQlpdnR2X3N0b3BfZGVjb2RpbmcoaWQsIFZJREVPX0NNRF9TVE9QX1RPX0JMQUNLIHwgVklERU9fQ01EX1NUT1BfSU1NRURJQVRFTFksIDApOworCX0gZWxzZSB7CisJCWl2dHZfc3RvcF9jYXB0dXJlKGlkLCAwKTsKKwl9CisJa2ZyZWUoaWQpOworCXJldHVybiAwOworfQorCitpbnQgaXZ0dl92NGwyX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJaW50IHgsIHkgPSAwOworCXN0cnVjdCBpdnR2X29wZW5faWQgKml0ZW07CisJc3RydWN0IGl2dHYgKml0diA9IE5VTEw7CisJc3RydWN0IGl2dHZfc3RyZWFtICpzID0gTlVMTDsKKwlpbnQgbWlub3IgPSBNSU5PUihpbm9kZS0+aV9yZGV2KTsKKworCS8qIEZpbmQgd2hpY2ggY2FyZCB0aGlzIG9wZW4gd2FzIG9uICovCisJc3Bpbl9sb2NrKCZpdnR2X2NhcmRzX2xvY2spOworCWZvciAoeCA9IDA7IGl0diA9PSBOVUxMICYmIHggPCBpdnR2X2NhcmRzX2FjdGl2ZTsgeCsrKSB7CisJCS8qIGZpbmQgb3V0IHdoaWNoIHN0cmVhbSB0aGlzIG9wZW4gd2FzIG9uICovCisJCWZvciAoeSA9IDA7IHkgPCBJVlRWX01BWF9TVFJFQU1TOyB5KyspIHsKKwkJCXMgPSAmaXZ0dl9jYXJkc1t4XS0+c3RyZWFtc1t5XTsKKwkJCWlmIChzLT52NGwyZGV2ICYmIHMtPnY0bDJkZXYtPm1pbm9yID09IG1pbm9yKSB7CisJCQkJaXR2ID0gaXZ0dl9jYXJkc1t4XTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwlzcGluX3VubG9jaygmaXZ0dl9jYXJkc19sb2NrKTsKKworCWlmIChpdHYgPT0gTlVMTCkgeworCQkvKiBDb3VsZG4ndCBmaW5kIGEgZGV2aWNlIHJlZ2lzdGVyZWQKKwkJICAgb24gdGhhdCBtaW5vciwgc2hvdWxkbid0IGhhcHBlbiEgKi8KKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiaXZ0djogbm8gaXZ0diBkZXZpY2UgZm91bmQgb24gbWlub3IgJWRcbiIsIG1pbm9yKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwlpZiAoeSA9PSBJVlRWX0RFQ19TVFJFQU1fVFlQRV9NUEcgJiYKKwkJdGVzdF9iaXQoSVZUVl9GX1NfQ0xBSU1FRCwgJml0di0+c3RyZWFtc1tJVlRWX0RFQ19TVFJFQU1fVFlQRV9ZVVZdLnNfZmxhZ3MpKQorCQlyZXR1cm4gLUVCVVNZOworCisJaWYgKHkgPT0gSVZUVl9ERUNfU1RSRUFNX1RZUEVfWVVWICYmCisJCXRlc3RfYml0KElWVFZfRl9TX0NMQUlNRUQsICZpdHYtPnN0cmVhbXNbSVZUVl9ERUNfU1RSRUFNX1RZUEVfTVBHXS5zX2ZsYWdzKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWlmICh5ID09IElWVFZfREVDX1NUUkVBTV9UWVBFX1lVVikgeworCQlpZiAocmVhZF9yZWcoMHg4MmMpID09IDApIHsKKwkJCUlWVFZfRVJSKCJUcmllZCB0byBvcGVuIFlVViBvdXRwdXQgZGV2aWNlIGJ1dCBuZWVkIHRvIHNlbmQgZGF0YSB0byBtcGVnIGRlY29kZXIgYmVmb3JlIGl0IGNhbiBiZSB1c2VkXG4iKTsKKwkJCS8qIHJldHVybiAtRU5PREVWOyAqLworCQl9CisJCWl2dHZfdWRtYV9hbGxvYyhpdHYpOworCX0KKworCS8qIEFsbG9jYXRlIG1lbW9yeSAqLworCWl0ZW0gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaXZ0dl9vcGVuX2lkKSwgR0ZQX0tFUk5FTCk7CisJaWYgKE5VTEwgPT0gaXRlbSkgeworCQlJVlRWX0RFQlVHX1dBUk4oIm5vbWVtIG9uIHY0bDIgb3BlblxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlpdGVtLT5pdHYgPSBpdHY7CisJaXRlbS0+dHlwZSA9IHk7CisJdjRsMl9wcmlvX29wZW4oJml0di0+cHJpbywgJml0ZW0tPnByaW8pOworCisJaXRlbS0+b3Blbl9pZCA9IGl0di0+b3Blbl9pZCsrOworCWZpbHAtPnByaXZhdGVfZGF0YSA9IGl0ZW07CisKKwlpZiAoaXRlbS0+dHlwZSA9PSBJVlRWX0VOQ19TVFJFQU1fVFlQRV9SQUQpIHsKKwkJLyogVHJ5IHRvIGNsYWltIHRoaXMgc3RyZWFtICovCisJCWlmIChpdnR2X2NsYWltX3N0cmVhbShpdGVtLCBpdGVtLT50eXBlKSkgeworCQkJLyogTm8sIGl0J3MgYWxyZWFkeSBpbiB1c2UgKi8KKwkJCWtmcmVlKGl0ZW0pOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCisJCS8qIFdlIGhhdmUgdGhlIHJhZGlvICovCisJCWl2dHZfbXV0ZShpdHYpOworCQkvKiBTd2l0Y2ggdHVuZXIgdG8gcmFkaW8gKi8KKwkJaXZ0dl9jYWxsX2kyY19jbGllbnRzKGl0diwgQVVEQ19TRVRfUkFESU8sIE5VTEwpOworCQkvKiBNYXJrIHRoYXQgdGhlIHJhZGlvIGlzIGJlaW5nIHVzZWQuICovCisJCXNldF9iaXQoSVZUVl9GX0lfUkFESU9fVVNFUiwgJml0di0+aV9mbGFncyk7CisJCS8qIFNlbGVjdCB0aGUgY29ycmVjdCBhdWRpbyBpbnB1dCAoaS5lLiByYWRpbyB0dW5lcikgKi8KKwkJaXZ0dl9hdWRpb19zZXRfaW8oaXR2KTsKKwkJLyogRG9uZSEgVW5tdXRlIGFuZCBjb250aW51ZS4gKi8KKwkJaXZ0dl91bm11dGUoaXR2KTsKKwl9CisKKwkvKiBZVVYgb3IgTVBHIERlY29kaW5nIE1vZGU/ICovCisJaWYgKHkgPT0gSVZUVl9ERUNfU1RSRUFNX1RZUEVfTVBHKQorCQljbGVhcl9iaXQoSVZUVl9GX0lfREVDX1lVViwgJml0di0+aV9mbGFncyk7CisJZWxzZSBpZiAoeSA9PSBJVlRWX0RFQ19TVFJFQU1fVFlQRV9ZVVYpCisJeworCQlzZXRfYml0KElWVFZfRl9JX0RFQ19ZVVYsICZpdHYtPmlfZmxhZ3MpOworCX0KKworCXJldHVybiAwOworfQorCit2b2lkIGl2dHZfbXV0ZShzdHJ1Y3QgaXZ0diAqaXR2KQoreworCXN0cnVjdCB2NGwyX2NvbnRyb2wgY3RybCA9IHsgVjRMMl9DSURfQVVESU9fTVVURSwgMSB9OworCisJLyogTXV0ZSBzb3VuZCB0byBhdm9pZCBwb3AgKi8KKwlpdnR2X2NvbnRyb2xfaW9jdGxzKGl0diwgVklESU9DX1NfQ1RSTCwgJmN0cmwpOworCisJaWYgKGF0b21pY19yZWFkKCZpdHYtPmNhcHR1cmluZykpCisJCWl2dHZfdmFwaShpdHYsIENYMjM0MVhfRU5DX01VVEVfQVVESU8sIDEsIDEpOworCisJSVZUVl9ERUJVR19JTkZPKCJNdXRlXG4iKTsKK30KKwordm9pZCBpdnR2X3VubXV0ZShzdHJ1Y3QgaXZ0diAqaXR2KQoreworCXN0cnVjdCB2NGwyX2NvbnRyb2wgY3RybCA9IHsgVjRMMl9DSURfQVVESU9fTVVURSwgMCB9OworCisJLyogaW5pdGlhbGl6ZSBvciByZWZyZXNoIGlucHV0ICovCisJaWYgKGF0b21pY19yZWFkKCZpdHYtPmNhcHR1cmluZykgPT0gMCkKKwkJaXZ0dl92YXBpKGl0diwgQ1gyMzQxWF9FTkNfSU5JVElBTElaRV9JTlBVVCwgMCk7CisKKwlpdnR2X3NsZWVwX3RpbWVvdXQoSFogLyAxMCwgMCk7CisKKwlpZiAoYXRvbWljX3JlYWQoJml0di0+Y2FwdHVyaW5nKSkgeworCQlpdnR2X3ZhcGkoaXR2LCBDWDIzNDFYX0VOQ19NSVNDLCAxLCAxMik7CisJCWl2dHZfdmFwaShpdHYsIENYMjM0MVhfRU5DX01VVEVfQVVESU8sIDEsIDApOworCX0KKworCS8qIFVubXV0ZSAqLworCWl2dHZfY29udHJvbF9pb2N0bHMoaXR2LCBWSURJT0NfU19DVFJMLCAmY3RybCk7CisJSVZUVl9ERUJVR19JTkZPKCJVbm11dGVcbiIpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtZmlsZW9wcy5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtZmlsZW9wcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0YTE3NDUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1maWxlb3BzLmgKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAgICBmaWxlIG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAgICBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNCAgS2V2aW4gVGhheWVyIDxudWZhbl93ZmsgYXQgeWFob28uY29tPgorICAgIENvcHlyaWdodCAoQykgMjAwNS0yMDA3ICBIYW5zIFZlcmt1aWwgPGh2ZXJrdWlsQHhzNGFsbC5ubD4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisvKiBUZXN0aW5nL0RlYnVnZ2luZyAqLworaW50IGl2dHZfdjRsMl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKTsKK3NzaXplX3QgaXZ0dl92NGwyX3JlYWQoc3RydWN0IGZpbGUgKmZpbHAsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwKKwkJICAgICAgbG9mZl90ICogcG9zKTsKK3NzaXplX3QgaXZ0dl92NGwyX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxwLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsCisJCSAgICAgICBsb2ZmX3QgKiBwb3MpOworaW50IGl2dHZfdjRsMl9jbG9zZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCk7Cit1bnNpZ25lZCBpbnQgaXZ0dl92NGwyX2VuY19wb2xsKHN0cnVjdCBmaWxlICpmaWxwLCBwb2xsX3RhYmxlICogd2FpdCk7Cit1bnNpZ25lZCBpbnQgaXZ0dl92NGwyX2RlY19wb2xsKHN0cnVjdCBmaWxlICpmaWxwLCBwb2xsX3RhYmxlICogd2FpdCk7CitpbnQgaXZ0dl9zdGFydF9jYXB0dXJlKHN0cnVjdCBpdnR2X29wZW5faWQgKmlkKTsKK3ZvaWQgaXZ0dl9zdG9wX2NhcHR1cmUoc3RydWN0IGl2dHZfb3Blbl9pZCAqaWQsIGludCBnb3BfZW5kKTsKK2ludCBpdnR2X3N0YXJ0X2RlY29kaW5nKHN0cnVjdCBpdnR2X29wZW5faWQgKmlkLCBpbnQgc3BlZWQpOwordm9pZCBpdnR2X211dGUoc3RydWN0IGl2dHYgKml0dik7Cit2b2lkIGl2dHZfdW5tdXRlKHN0cnVjdCBpdnR2ICppdHYpOworCisvKiBVdGlsaXRpZXMgKi8KKworLyogVHJ5IHRvIGNsYWltIGEgc3RyZWFtIGZvciB0aGUgZmlsZWhhbmRsZS4gUmV0dXJuIDAgb24gc3VjY2VzcywKKyAgIC1FQlVTWSBpZiBzdHJlYW0gYWxyZWFkeSBjbGFpbWVkLiBPbmNlIGEgc3RyZWFtIGlzIGNsYWltZWQsIGl0CisgICByZW1haW5zIGNsYWltZWQgdW50aWwgdGhlIGFzc29jaWF0ZWQgZmlsZWhhbmRsZSBpcyBjbG9zZWQuICovCitpbnQgaXZ0dl9jbGFpbV9zdHJlYW0oc3RydWN0IGl2dHZfb3Blbl9pZCAqaWQsIGludCB0eXBlKTsKKworLyogUmVsZWFzZSBhIHByZXZpb3VzbHkgY2xhaW1lZCBzdHJlYW0uICovCit2b2lkIGl2dHZfcmVsZWFzZV9zdHJlYW0oc3RydWN0IGl2dHZfc3RyZWFtICpzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWZpcm13YXJlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1maXJtd2FyZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0YzkxMGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1maXJtd2FyZS5jCkBAIC0wLDAgKzEsMjcyIEBACisvKgorICAgIGl2dHYgZmlybXdhcmUgZnVuY3Rpb25zLgorICAgIENvcHlyaWdodCAoQykgMjAwMy0yMDA0ICBLZXZpbiBUaGF5ZXIgPG51ZmFuX3dmayBhdCB5YWhvby5jb20+CisgICAgQ29weXJpZ2h0IChDKSAyMDA0ICBDaHJpcyBLZW5uZWR5IDxjQGdyb292eS5vcmc+CisgICAgQ29weXJpZ2h0IChDKSAyMDA1LTIwMDcgIEhhbnMgVmVya3VpbCA8aHZlcmt1aWxAeHM0YWxsLm5sPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpbmNsdWRlICJpdnR2LWRyaXZlci5oIgorI2luY2x1ZGUgIml2dHYtbWFpbGJveC5oIgorI2luY2x1ZGUgIml2dHYtZmlybXdhcmUuaCIKKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorCisjZGVmaW5lIElWVFZfTUFTS19TUFVfRU5BQkxFIAkJMHhGRkZGRkZGRQorI2RlZmluZSBJVlRWX01BU0tfVlBVX0VOQUJMRTE1IAkJMHhGRkZGRkZGNgorI2RlZmluZSBJVlRWX01BU0tfVlBVX0VOQUJMRTE2IAkJMHhGRkZGRkZGQgorI2RlZmluZSBJVlRWX0NNRF9WRE1fU1RPUCAJCTB4MDAwMDAwMDAKKyNkZWZpbmUgSVZUVl9DTURfQU9fU1RPUCAJCTB4MDAwMDAwMDUKKyNkZWZpbmUgSVZUVl9DTURfQVBVX1BJTkcgCQkweDAwMDAwMDAwCisjZGVmaW5lIElWVFZfQ01EX1ZQVV9TVE9QMTUgCQkweEZGRkZGRkZFCisjZGVmaW5lIElWVFZfQ01EX1ZQVV9TVE9QMTYgCQkweEZGRkZGRkVFCisjZGVmaW5lIElWVFZfQ01EX0hXX0JMT0NLU19SU1QgCQkweEZGRkZGRkZGCisjZGVmaW5lIElWVFZfQ01EX1NQVV9TVE9QIAkJMHgwMDAwMDAwMQorI2RlZmluZSBJVlRWX0NNRF9TRFJBTV9QUkVDSEFSR0VfSU5JVCAJMHgwMDAwMDAxQQorI2RlZmluZSBJVlRWX0NNRF9TRFJBTV9SRUZSRVNIX0lOSVQgCTB4ODAwMDA2NDAKKyNkZWZpbmUgSVZUVl9TRFJBTV9TTEVFUFRJTUUgCQkoNjAgKiBIWiAvIDEwMCkJLyogNjAwIG1zICovCisKKyNkZWZpbmUgSVZUVl9ERUNPREVfSU5JVF9NUEVHX0ZJTEVOQU1FIAkidjRsLWN4MjM0MXgtaW5pdC5tcGciCisjZGVmaW5lIElWVFZfREVDT0RFX0lOSVRfTVBFR19TSVpFIAkoMTUyKjEwMjQpCisKKy8qIEVuY29kZXIvZGVjb2RlciBmaXJtd2FyZSBzaXplcyAqLworI2RlZmluZSBJVlRWX0ZXX0VOQ19TSVpFIAkJKDM3NjgzNikKKyNkZWZpbmUgSVZUVl9GV19ERUNfU0laRSAJCSgyNTYqMTAyNCkKKworc3RhdGljIGludCBsb2FkX2Z3X2RpcmVjdChjb25zdCBjaGFyICpmbiwgdm9sYXRpbGUgdTggX19pb21lbSAqbWVtLCBzdHJ1Y3QgaXZ0diAqaXR2LCBsb25nIHNpemUpCit7CisJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdyA9IE5VTEw7CisJaW50IHJldHJpZXMgPSAzOworCityZXRyeToKKwlpZiAocmV0cmllcyAmJiByZXF1ZXN0X2Zpcm13YXJlKCZmdywgZm4sICZpdHYtPmRldi0+ZGV2KSA9PSAwKSB7CisJCWludCBpOworCQl2b2xhdGlsZSB1MzIgX19pb21lbSAqZHN0ID0gKHZvbGF0aWxlIHUzMiBfX2lvbWVtICopbWVtOworCQljb25zdCB1MzIgKnNyYyA9IChjb25zdCB1MzIgKilmdy0+ZGF0YTsKKworCQkvKiB0ZW1wb3JhcmlseSBhbGxvdyAyNTYgS0IgZW5jb2RpbmcgZmlybXdhcmVzIGFzIHdlbGwgZm9yCisJCSAgIGNvbXBhdGliaWxpdHkgd2l0aCBibGFja2JpcmQgY2FyZHMgKi8KKwkJaWYgKGZ3LT5zaXplICE9IHNpemUgJiYgZnctPnNpemUgIT0gMjU2ICogMTAyNCkgeworCQkJLyogRHVlIHRvIHJhY2UgY29uZGl0aW9ucyBpbiBmaXJtd2FyZSBsb2FkaW5nIChlc3AuIHdpdGggdWRldiA8MC45NSkKKwkJCSAgIHRoZSB3cm9uZyBmaWxlIHdhcyBzb21ldGltZXMgbG9hZGVkLiBTbyB3ZSBjaGVjayBmaWxlc2l6ZXMgdG8KKwkJCSAgIHNlZSBpZiBhdCBsZWFzdCB0aGUgcmlnaHQtc2l6ZWQgZmlsZSB3YXMgbG9hZGVkLiBJZiBub3QsIHRoZW4gd2UKKwkJCSAgIHJldHJ5LiAqLworCQkJSVZUVl9JTkZPKCJyZXRyeTogZmlsZSBsb2FkZWQgd2FzIG5vdCAlcyAoZXhwZWN0ZWQgc2l6ZSAlbGQsIGdvdCAlemQpXG4iLCBmbiwgc2l6ZSwgZnctPnNpemUpOworCQkJcmVsZWFzZV9maXJtd2FyZShmdyk7CisJCQlyZXRyaWVzLS07CisJCQlnb3RvIHJldHJ5OworCQl9CisJCWZvciAoaSA9IDA7IGkgPCBmdy0+c2l6ZTsgaSArPSA0KSB7CisJCQkvKiBubyBuZWVkIGZvciBlbmRpYW5uZXNzIGNvbnZlcnNpb24gb24gdGhlIHBwYyAqLworCQkJX19yYXdfd3JpdGVsKCpzcmMsIGRzdCk7CisJCQlkc3QrKzsKKwkJCXNyYysrOworCQl9CisJCXJlbGVhc2VfZmlybXdhcmUoZncpOworCQlJVlRWX0lORk8oImxvYWRlZCAlcyBmaXJtd2FyZSAoJXpkIGJ5dGVzKVxuIiwgZm4sIGZ3LT5zaXplKTsKKwkJcmV0dXJuIHNpemU7CisJfQorCUlWVFZfRVJSKCJ1bmFibGUgdG8gb3BlbiBmaXJtd2FyZSAlcyAobXVzdCBiZSAlbGQgYnl0ZXMpXG4iLCBmbiwgc2l6ZSk7CisJSVZUVl9FUlIoImRpZCB5b3UgcHV0IHRoZSBmaXJtd2FyZSBpbiB0aGUgaG90cGx1ZyBmaXJtd2FyZSBkaXJlY3Rvcnk/XG4iKTsKKwlyZXR1cm4gLUVOT01FTTsKK30KKwordm9pZCBpdnR2X2hhbHRfZmlybXdhcmUoc3RydWN0IGl2dHYgKml0dikKK3sKKwlJVlRWX0RFQlVHX0lORk8oIlByZXBhcmluZyBmb3IgZmlybXdhcmUgaGFsdC5cbiIpOworCWlmIChpdHYtPmhhc19jeDIzNDE1ICYmIGl0di0+ZGVjX21ib3gubWJveCkKKwkJaXZ0dl92YXBpKGl0diwgQ1gyMzQxWF9ERUNfSEFMVF9GVywgMCk7CisJaWYgKGl0di0+ZW5jX21ib3gubWJveCkKKwkJaXZ0dl92YXBpKGl0diwgQ1gyMzQxWF9FTkNfSEFMVF9GVywgMCk7CisKKwlpdnR2X3NsZWVwX3RpbWVvdXQoSFogLyAxMDAsIDApOworCWl0di0+ZW5jX21ib3gubWJveCA9IGl0di0+ZGVjX21ib3gubWJveCA9IE5VTEw7CisKKwlJVlRWX0RFQlVHX0lORk8oIlN0b3BwaW5nIFZETVxuIik7CisJd3JpdGVfcmVnKElWVFZfQ01EX1ZETV9TVE9QLCBJVlRWX1JFR19WRE0pOworCisJSVZUVl9ERUJVR19JTkZPKCJTdG9wcGluZyBBT1xuIik7CisJd3JpdGVfcmVnKElWVFZfQ01EX0FPX1NUT1AsIElWVFZfUkVHX0FPKTsKKworCUlWVFZfREVCVUdfSU5GTygicGluZ2luZyAoPykgQVBVXG4iKTsKKwl3cml0ZV9yZWcoSVZUVl9DTURfQVBVX1BJTkcsIElWVFZfUkVHX0FQVSk7CisKKwlJVlRWX0RFQlVHX0lORk8oIlN0b3BwaW5nIFZQVVxuIik7CisJaWYgKCFpdHYtPmhhc19jeDIzNDE1KQorCQl3cml0ZV9yZWcoSVZUVl9DTURfVlBVX1NUT1AxNiwgSVZUVl9SRUdfVlBVKTsKKwllbHNlCisJCXdyaXRlX3JlZyhJVlRWX0NNRF9WUFVfU1RPUDE1LCBJVlRWX1JFR19WUFUpOworCisJSVZUVl9ERUJVR19JTkZPKCJSZXNldHRpbmcgSHcgQmxvY2tzXG4iKTsKKwl3cml0ZV9yZWcoSVZUVl9DTURfSFdfQkxPQ0tTX1JTVCwgSVZUVl9SRUdfSFdfQkxPQ0tTKTsKKworCUlWVFZfREVCVUdfSU5GTygiU3RvcHBpbmcgU1BVXG4iKTsKKwl3cml0ZV9yZWcoSVZUVl9DTURfU1BVX1NUT1AsIElWVFZfUkVHX1NQVSk7CisKKwlpdnR2X3NsZWVwX3RpbWVvdXQoSFogLyAxMDAsIDApOworCisJSVZUVl9ERUJVR19JTkZPKCJpbml0IEVuY29kZXIgU0RSQU0gcHJlLWNoYXJnZVxuIik7CisJd3JpdGVfcmVnKElWVFZfQ01EX1NEUkFNX1BSRUNIQVJHRV9JTklULCBJVlRWX1JFR19FTkNfU0RSQU1fUFJFQ0hBUkdFKTsKKworCUlWVFZfREVCVUdfSU5GTygiaW5pdCBFbmNvZGVyIFNEUkFNIHJlZnJlc2ggdG8gMXVzXG4iKTsKKwl3cml0ZV9yZWcoSVZUVl9DTURfU0RSQU1fUkVGUkVTSF9JTklULCBJVlRWX1JFR19FTkNfU0RSQU1fUkVGUkVTSCk7CisKKwlpZiAoaXR2LT5oYXNfY3gyMzQxNSkgeworCQlJVlRWX0RFQlVHX0lORk8oImluaXQgRGVjb2RlciBTRFJBTSBwcmUtY2hhcmdlXG4iKTsKKwkJd3JpdGVfcmVnKElWVFZfQ01EX1NEUkFNX1BSRUNIQVJHRV9JTklULCBJVlRWX1JFR19ERUNfU0RSQU1fUFJFQ0hBUkdFKTsKKworCQlJVlRWX0RFQlVHX0lORk8oImluaXQgRGVjb2RlciBTRFJBTSByZWZyZXNoIHRvIDF1c1xuIik7CisJCXdyaXRlX3JlZyhJVlRWX0NNRF9TRFJBTV9SRUZSRVNIX0lOSVQsIElWVFZfUkVHX0RFQ19TRFJBTV9SRUZSRVNIKTsKKwl9CisKKwlJVlRWX0RFQlVHX0lORk8oIlNsZWVwaW5nIGZvciAlZG1zICg2MDAgcmVjb21tZW5kZWQpXG4iLAorCQkgICAoaW50KShJVlRWX1NEUkFNX1NMRUVQVElNRSAqIDEwMDAgLyBIWikpOworCWl2dHZfc2xlZXBfdGltZW91dChJVlRWX1NEUkFNX1NMRUVQVElNRSwgMCk7Cit9CisKK3ZvaWQgaXZ0dl9maXJtd2FyZV92ZXJzaW9ucyhzdHJ1Y3QgaXZ0diAqaXR2KQoreworCXUzMiBkYXRhW0NYMjM0MVhfTUJPWF9NQVhfREFUQV07CisKKwkvKiBFbmNvZGVyICovCisJaXZ0dl92YXBpX3Jlc3VsdChpdHYsIGRhdGEsIENYMjM0MVhfRU5DX0dFVF9WRVJTSU9OLCAwKTsKKwlJVlRWX0lORk8oIkVuY29kZXIgcmV2aXNpb246IDB4JTA4eFxuIiwgZGF0YVswXSk7CisKKwlpZiAoZGF0YVswXSAhPSAweDAyMDYwMDM5KQorCQlJVlRWX1dBUk4oIlJlY29tbWVuZGVkIGZpcm13YXJlIHZlcnNpb24gaXMgMHgwMjA2MDAzOS5cbiIpOworCisJaWYgKGl0di0+aGFzX2N4MjM0MTUpIHsKKwkJLyogRGVjb2RlciAqLworCQlpdnR2X3ZhcGlfcmVzdWx0KGl0diwgZGF0YSwgQ1gyMzQxWF9ERUNfR0VUX1ZFUlNJT04sIDApOworCQlJVlRWX0lORk8oIkRlY29kZXIgcmV2aXNpb246IDB4JTA4eFxuIiwgZGF0YVswXSk7CisJfQorfQorCitzdGF0aWMgaW50IGl2dHZfZmlybXdhcmVfY29weShzdHJ1Y3QgaXZ0diAqaXR2KQoreworCUlWVFZfREVCVUdfSU5GTygiTG9hZGluZyBlbmNvZGVyIGltYWdlXG4iKTsKKwlpZiAobG9hZF9md19kaXJlY3QoQ1gyMzQxWF9GSVJNX0VOQ19GSUxFTkFNRSwKKwkJICAgaXR2LT5lbmNfbWVtLCBpdHYsIElWVFZfRldfRU5DX1NJWkUpICE9IElWVFZfRldfRU5DX1NJWkUpIHsKKwkJSVZUVl9ERUJVR19XQVJOKCJmYWlsZWQgbG9hZGluZyBlbmNvZGVyIGZpcm13YXJlXG4iKTsKKwkJcmV0dXJuIC0zOworCX0KKwlpZiAoIWl0di0+aGFzX2N4MjM0MTUpCisJCXJldHVybiAwOworCisJSVZUVl9ERUJVR19JTkZPKCJMb2FkaW5nIGRlY29kZXIgaW1hZ2VcbiIpOworCWlmIChsb2FkX2Z3X2RpcmVjdChDWDIzNDFYX0ZJUk1fREVDX0ZJTEVOQU1FLAorCQkgICBpdHYtPmRlY19tZW0sIGl0diwgSVZUVl9GV19ERUNfU0laRSkgIT0gSVZUVl9GV19ERUNfU0laRSkgeworCQlJVlRWX0RFQlVHX1dBUk4oImZhaWxlZCBsb2FkaW5nIGRlY29kZXIgZmlybXdhcmVcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9sYXRpbGUgc3RydWN0IGl2dHZfbWFpbGJveCBfX2lvbWVtICppdnR2X3NlYXJjaF9tYWlsYm94KGNvbnN0IHZvbGF0aWxlIHU4IF9faW9tZW0gKm1lbSwgdTMyIHNpemUpCit7CisJaW50IGk7CisKKwkvKiBtYWlsYm94IGlzIHByZWNlZWRlZCBieSBhIDE2IGJ5dGUgJ21hZ2ljIGNvb2tpZScgc3RhcnRpbmcgYXQgYSAyNTYtYnl0ZQorCSAgIGFkZHJlc3MgYm91bmRhcnkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSArPSAweDEwMCkgeworCQlpZiAocmVhZGwobWVtICsgaSkgICAgICA9PSAweDEyMzQ1Njc4ICYmCisJCSAgICByZWFkbChtZW0gKyBpICsgNCkgID09IDB4MzQ1Njc4MTIgJiYKKwkJICAgIHJlYWRsKG1lbSArIGkgKyA4KSAgPT0gMHg1Njc4MTIzNCAmJgorCQkgICAgcmVhZGwobWVtICsgaSArIDEyKSA9PSAweDc4MTIzNDU2KSB7CisJCQlyZXR1cm4gKHZvbGF0aWxlIHN0cnVjdCBpdnR2X21haWxib3ggX19pb21lbSAqKShtZW0gKyBpICsgMTYpOworCQl9CisJfQorCXJldHVybiBOVUxMOworfQorCitpbnQgaXZ0dl9maXJtd2FyZV9pbml0KHN0cnVjdCBpdnR2ICppdHYpCit7CisJaW50IGVycjsKKworCWl2dHZfaGFsdF9maXJtd2FyZShpdHYpOworCisJLyogbG9hZCBmaXJtd2FyZSAqLworCWVyciA9IGl2dHZfZmlybXdhcmVfY29weShpdHYpOworCWlmIChlcnIpIHsKKwkJSVZUVl9ERUJVR19XQVJOKCJFcnJvciAlZCBsb2FkaW5nIGZpcm13YXJlXG4iLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKworCS8qIHN0YXJ0IGZpcm13YXJlICovCisJd3JpdGVfcmVnKHJlYWRfcmVnKElWVFZfUkVHX1NQVSkgJiBJVlRWX01BU0tfU1BVX0VOQUJMRSwgSVZUVl9SRUdfU1BVKTsKKwlpdnR2X3NsZWVwX3RpbWVvdXQoSFogLyAxMCwgMCk7CisJaWYgKGl0di0+aGFzX2N4MjM0MTUpCisJCXdyaXRlX3JlZyhyZWFkX3JlZyhJVlRWX1JFR19WUFUpICYgSVZUVl9NQVNLX1ZQVV9FTkFCTEUxNSwgSVZUVl9SRUdfVlBVKTsKKwllbHNlCisJCXdyaXRlX3JlZyhyZWFkX3JlZyhJVlRWX1JFR19WUFUpICYgSVZUVl9NQVNLX1ZQVV9FTkFCTEUxNiwgSVZUVl9SRUdfVlBVKTsKKwlpdnR2X3NsZWVwX3RpbWVvdXQoSFogLyAxMCwgMCk7CisKKwkvKiBmaW5kIG1haWxib3hlcyBhbmQgcGluZyBmaXJtd2FyZSAqLworCWl0di0+ZW5jX21ib3gubWJveCA9IGl2dHZfc2VhcmNoX21haWxib3goaXR2LT5lbmNfbWVtLCBJVlRWX0VOQ09ERVJfU0laRSk7CisJaWYgKGl0di0+ZW5jX21ib3gubWJveCA9PSBOVUxMKQorCQlJVlRWX0VSUigiRW5jb2RlciBtYWlsYm94IG5vdCBmb3VuZFxuIik7CisJZWxzZSBpZiAoaXZ0dl92YXBpKGl0diwgQ1gyMzQxWF9FTkNfUElOR19GVywgMCkpIHsKKwkJSVZUVl9FUlIoIkVuY29kZXIgZmlybXdhcmUgZGVhZCFcbiIpOworCQlpdHYtPmVuY19tYm94Lm1ib3ggPSBOVUxMOworCX0KKwlpZiAoaXR2LT5lbmNfbWJveC5tYm94ID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKCFpdHYtPmhhc19jeDIzNDE1KQorCQlyZXR1cm4gMDsKKworCWl0di0+ZGVjX21ib3gubWJveCA9IGl2dHZfc2VhcmNoX21haWxib3goaXR2LT5kZWNfbWVtLCBJVlRWX0RFQ09ERVJfU0laRSk7CisJaWYgKGl0di0+ZGVjX21ib3gubWJveCA9PSBOVUxMKQorCQlJVlRWX0VSUigiRGVjb2RlciBtYWlsYm94IG5vdCBmb3VuZFxuIik7CisJZWxzZSBpZiAoaXR2LT5oYXNfY3gyMzQxNSAmJiBpdnR2X3ZhcGkoaXR2LCBDWDIzNDFYX0RFQ19QSU5HX0ZXLCAwKSkgeworCQlJVlRWX0VSUigiRGVjb2RlciBmaXJtd2FyZSBkZWFkIVxuIik7CisJCWl0di0+ZGVjX21ib3gubWJveCA9IE5VTEw7CisJfQorCXJldHVybiBpdHYtPmRlY19tYm94Lm1ib3ggPyAwIDogLUVOT0RFVjsKK30KKwordm9pZCBpdnR2X2luaXRfbXBlZ19kZWNvZGVyKHN0cnVjdCBpdnR2ICppdHYpCit7CisJdTMyIGRhdGFbQ1gyMzQxWF9NQk9YX01BWF9EQVRBXTsKKwlsb25nIHJlYWRieXRlczsKKwl2b2xhdGlsZSB1OCBfX2lvbWVtICptZW1fb2Zmc2V0OworCisJZGF0YVswXSA9IDA7CisJZGF0YVsxXSA9IGl0di0+cGFyYW1zLndpZHRoOwkvKiBZVVYgc291cmNlIHdpZHRoICovCisJZGF0YVsyXSA9IGl0di0+cGFyYW1zLmhlaWdodDsKKwlkYXRhWzNdID0gaXR2LT5wYXJhbXMuYXVkaW9fcHJvcGVydGllczsJLyogQXVkaW8gc2V0dGluZ3MgdG8gdXNlLAorCQkJCQkJCSAgIGJpdG1hcC4gc2VlIGRvY3MuICovCisJaWYgKGl2dHZfYXBpKGl0diwgQ1gyMzQxWF9ERUNfU0VUX0RFQ09ERVJfU09VUkNFLCA0LCBkYXRhKSkgeworCQlJVlRWX0VSUigiaXZ0dl9pbml0X21wZWdfZGVjb2RlciBmYWlsZWQgdG8gc2V0IGRlY29kZXIgc291cmNlXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChpdnR2X3ZhcGkoaXR2LCBDWDIzNDFYX0RFQ19TVEFSVF9QTEFZQkFDSywgMiwgMCwgMSkgIT0gMCkgeworCQlJVlRWX0VSUigiaXZ0dl9pbml0X21wZWdfZGVjb2RlciBmYWlsZWQgdG8gc3RhcnQgcGxheWJhY2tcbiIpOworCQlyZXR1cm47CisJfQorCWl2dHZfYXBpX2dldF9kYXRhKCZpdHYtPmRlY19tYm94LCBJVlRWX01CT1hfRE1BLCBkYXRhKTsKKwltZW1fb2Zmc2V0ID0gaXR2LT5kZWNfbWVtICsgZGF0YVsxXTsKKworCWlmICgocmVhZGJ5dGVzID0gbG9hZF9md19kaXJlY3QoSVZUVl9ERUNPREVfSU5JVF9NUEVHX0ZJTEVOQU1FLAorCQltZW1fb2Zmc2V0LCBpdHYsIElWVFZfREVDT0RFX0lOSVRfTVBFR19TSVpFKSkgPD0gMCkgeworCQlJVlRWX0RFQlVHX1dBUk4oImZhaWxlZCB0byByZWFkIG1wZWcgZGVjb2RlciBpbml0aWFsaXNhdGlvbiBmaWxlICVzXG4iLAorCQkJCUlWVFZfREVDT0RFX0lOSVRfTVBFR19GSUxFTkFNRSk7CisJfSBlbHNlIHsKKwkJaXZ0dl92YXBpKGl0diwgQ1gyMzQxWF9ERUNfU0NIRURfRE1BX0ZST01fSE9TVCwgMywgMCwgcmVhZGJ5dGVzLCAwKTsKKwkJaXZ0dl9zbGVlcF90aW1lb3V0KEhaIC8gMTAsIDApOworCX0KKwlpdnR2X3ZhcGkoaXR2LCBDWDIzNDFYX0RFQ19TVE9QX1BMQVlCQUNLLCA0LCAwLCAwLCAwLCAxKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWZpcm13YXJlLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1maXJtd2FyZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiMmZmZTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1maXJtd2FyZS5oCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgICAgaXZ0diBmaXJtd2FyZSBmdW5jdGlvbnMuCisgICAgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDQgIEtldmluIFRoYXllciA8bnVmYW5fd2ZrIGF0IHlhaG9vLmNvbT4KKyAgICBDb3B5cmlnaHQgKEMpIDIwMDQgIENocmlzIEtlbm5lZHkgPGNAZ3Jvb3Z5Lm9yZz4KKyAgICBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNyAgSGFucyBWZXJrdWlsIDxodmVya3VpbEB4czRhbGwubmw+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworaW50IGl2dHZfZmlybXdhcmVfaW5pdChzdHJ1Y3QgaXZ0diAqaXR2KTsKK3ZvaWQgaXZ0dl9maXJtd2FyZV92ZXJzaW9ucyhzdHJ1Y3QgaXZ0diAqaXR2KTsKK3ZvaWQgaXZ0dl9oYWx0X2Zpcm13YXJlKHN0cnVjdCBpdnR2ICppdHYpOwordm9pZCBpdnR2X2luaXRfbXBlZ19kZWNvZGVyKHN0cnVjdCBpdnR2ICppdHYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtZ3Bpby5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtZ3Bpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjOGY4Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1ncGlvLmMKQEAgLTAsMCArMSwzMDcgQEAKKy8qCisgICAgZ3BpbyBmdW5jdGlvbnMuCisgICAgTWVyZ2luZyBHUElPIHN1cHBvcnQgaW50byBkcml2ZXI6CisgICAgQ29weXJpZ2h0IChDKSAyMDA0ICBDaHJpcyBLZW5uZWR5IDxjQGdyb292eS5vcmc+CisgICAgQ29weXJpZ2h0IChDKSAyMDA1LTIwMDcgIEhhbnMgVmVya3VpbCA8aHZlcmt1aWxAeHM0YWxsLm5sPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpbmNsdWRlICJpdnR2LWRyaXZlci5oIgorI2luY2x1ZGUgIml2dHYtY2FyZHMuaCIKKyNpbmNsdWRlICJpdnR2LWdwaW8uaCIKKyNpbmNsdWRlIDxtZWRpYS90dW5lci5oPgorCisvKgorICogR1BJTyBhc3NpZ25tZW50IG9mIFl1YW4gTVBHNjAwL01QRzE2MAorICoKKyAqICAgIGJpdCAxNSAgMTQgIDEzICAxMiB8ICAxMSAgMTAgICA5ICAgOCB8ICAgNyAgIDYgICA1ICAgNCB8ICAgMyAgIDIgICAxICAgMAorICogT1VUUFVUICAgICAgICAgSU4xIElOMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNMyBBTTIgQU0xIEFNMAorICogIElOUFVUICAgICAgICAgICAgICAgICAgIERNMSAgICAgICAgIERNMAorICoKKyAqICAgSU4qIDogSW5wdXQgc2VsZWN0aW9uCisgKiAgICAgICAgICBJTjEgSU4wCisgKiAgICAgICAgICAgMSAgIDEgIE4vQQorICogICAgICAgICAgIDEgICAwICBMaW5lCisgKiAgICAgICAgICAgMCAgIDEgIE4vQQorICogICAgICAgICAgIDAgICAwICBUdW5lcgorICoKKyAqICAgQU0qIDogQXVkaW8gTW9kZQorICogICAgICAgICAgQU0zICAwOiBOb3JtYWwgICAgICAgIDE6IE1peGVkKFN1YitNYWluIGNoYW5uZWwpCisgKiAgICAgICAgICBBTTIgIDA6IFN1YmNoYW5uZWwgICAgMTogTWFpbiBjaGFubmVsCisgKiAgICAgICAgICBBTTEgIDA6IFN0ZXJlbyAgICAgICAgMTogTW9ubworICogICAgICAgICAgQU0wICAwOiBOb3JtYWwgICAgICAgIDE6IE11dGUKKyAqCisgKiAgIERNKiA6IERldGVjdGVkIHR1bmVyIGF1ZGlvIE1vZGUKKyAqICAgICAgICAgIERNMSAgMDogU3RlcmVvICAgICAgICAxOiBNb25vCisgKiAgICAgICAgICBETTAgIDA6IE11bHRpcGxleCAgICAgMTogTm9ybWFsCisgKgorICogR1BJTyBJbml0aWFsIFNldHRpbmdzCisgKiAgICAgICAgICAgTVBHNjAwICAgTVBHMTYwCisgKiAgICAgRElSICAgMHgzMDgwICAgMHg3MDgwCisgKiAgT1VUUFVUICAgMHgwMDBDICAgMHg0MDBDCisgKgorICogIFNwZWNpYWwgdGhhbmtzIHRvIE1ha290byBJZ3VjaGkgPGlndWNoaUB0YWhvby5vcmc+IGFuZCBNci4gQW5vbnltb3VzCisgKiAgZm9yIGFuYWx5emluZyBHUElPIG9mIE1QRzE2MC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBHUElPIGFzc2lnbm1lbnQgb2YgQXZlcm1lZGlhIE0xNzkgKHBlciBpbmZvcm1hdGlvbiBkaXJlY3QgZnJvbSBBVmVyTWVkaWEpCisgKgorICogICAgYml0IDE1ICAxNCAgMTMgIDEyIHwgIDExICAxMCAgIDkgICA4IHwgICA3ICAgNiAgIDUgICA0IHwgICAzICAgMiAgIDEgICAwCisgKiBPVVRQVVQgSU4wIEFNMCBJTjEgICAgICAgICAgICAgICBBTTEgQU0yICAgICAgIElOMiAgICAgQlIwICAgQlIxCisgKiAgSU5QVVQKKyAqCisgKiAgIElOKiA6IElucHV0IHNlbGVjdGlvbgorICogICAgICAgICAgSU4wIElOMSBJTjIKKyAqICAgICAgICAgICAqICAgMSAgICogIE11dGUKKyAqICAgICAgICAgICAwICAgMCAgIDAgIExpbmUtSW4KKyAqICAgICAgICAgICAxICAgMCAgIDAgIFRWIFR1bmVyIEF1ZGlvCisgKiAgICAgICAgICAgMCAgIDAgICAxICBGTSBBdWRpbworICogICAgICAgICAgIDEgICAwICAgMSAgTXV0ZQorICoKKyAqICAgQU0qIDogQXVkaW8gTW9kZQorICogICAgICAgICAgQU0wIEFNMSBBTTIKKyAqICAgICAgICAgICAwICAgMCAgIDAgIFRWIFR1bmVyIEF1ZGlvOiBMX09VVD0oTCtSKS8yLCBSX09VVD1TQVAKKyAqICAgICAgICAgICAwICAgMCAgIDEgIFRWIFR1bmVyIEF1ZGlvOiBMX09VVD1SX09VVD1TQVAgICAoU0FQKQorICogICAgICAgICAgIDAgICAxICAgMCAgVFYgVHVuZXIgQXVkaW86IExfT1VUPUwsIFJfT1VUPVIgICAoc3RlcmVvKQorICogICAgICAgICAgIDAgICAxICAgMSAgVFYgVHVuZXIgQXVkaW86IG11dGUKKyAqICAgICAgICAgICAxICAgKiAgICogIFRWIFR1bmVyIEF1ZGlvOiBMX09VVD1SX09VVD0oTCtSKS8yICAgKG1vbm8pCisgKgorICogICBCUiogOiBBdWRpbyBTYW1wbGUgUmF0ZSAoQlIgc3RhbmRzIGZvciBiaXRyYXRlIGZvciBzb21lIHJlYXNvbikKKyAqICAgICAgICAgIEJSMCBCUjEKKyAqICAgICAgICAgICAwICAgMCAgIDMyIGtIegorICogICAgICAgICAgIDAgICAxICAgNDQuMSBrSHoKKyAqICAgICAgICAgICAxICAgMCAgIDQ4IGtIegorICoKKyAqICAgRE0qIDogRGV0ZWN0ZWQgdHVuZXIgYXVkaW8gTW9kZQorICogICAgICAgICBVbmtub3duIGN1cnJlbnRseQorICoKKyAqIFNwZWNpYWwgdGhhbmtzIHRvIEFWZXJNZWRpYSBUZWNobm9sb2dpZXMsIEluYy4gYW5kIEppdW4tS3VlaSBKdW5nIGF0CisgKiBBVmVyTWVkaWEgZm9yIHByb3ZpZGluZyB0aGUgR1BJTyBpbmZvcm1hdGlvbiB1c2VkIHRvIGFkZCBzdXBwb3J0CisgKiBmb3IgdGhlIE0xNzkgY2FyZHMuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKiBHUElPIHN0dWZmcyAqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEdQSU8gcmVnaXN0ZXJzICovCisjZGVmaW5lIElWVFZfUkVHX0dQSU9fSU4gICAgMHg5MDA4CisjZGVmaW5lIElWVFZfUkVHX0dQSU9fT1VUICAgMHg5MDBjCisjZGVmaW5lIElWVFZfUkVHX0dQSU9fRElSICAgMHg5MDIwCisKK3ZvaWQgaXZ0dl9yZXNldF9pcl9ncGlvKHN0cnVjdCBpdnR2ICppdHYpCit7CisJaW50IGN1cmRpciwgY3Vyb3V0OworCisJaWYgKGl0di0+Y2FyZC0+dHlwZSAhPSBJVlRWX0NBUkRfUFZSXzE1MCkKKwkJcmV0dXJuOworCUlWVFZfREVCVUdfSU5GTygiUmVzZXR0aW5nIFBWUjE1MCBJUlxuIik7CisJY3Vyb3V0ID0gcmVhZF9yZWcoSVZUVl9SRUdfR1BJT19PVVQpOworCWN1cmRpciA9IHJlYWRfcmVnKElWVFZfUkVHX0dQSU9fRElSKTsKKwljdXJkaXIgfD0gMHg4MDsKKwl3cml0ZV9yZWcoY3VyZGlyLCBJVlRWX1JFR19HUElPX0RJUik7CisJY3Vyb3V0ID0gKGN1cm91dCAmIH4weEYpIHwgMTsKKwl3cml0ZV9yZWcoY3Vyb3V0LCBJVlRWX1JFR19HUElPX09VVCk7CisJLyogV2UgY291bGQgdXNlIHNvbWV0aGluZyBlbHNlIGZvciBzbWFsbGVyIHRpbWUgKi8KKwljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKKwlzY2hlZHVsZV90aW1lb3V0KDEpOworCWN1cm91dCB8PSAyOworCXdyaXRlX3JlZyhjdXJvdXQsIElWVFZfUkVHX0dQSU9fT1VUKTsKKwljdXJkaXIgJj0gfjB4ODA7CisJd3JpdGVfcmVnKGN1cmRpciwgSVZUVl9SRUdfR1BJT19ESVIpOworfQorCisjaWZkZWYgSEFWRV9YQzMwMjgKK2ludCBpdnR2X3Jlc2V0X3R1bmVyX2dwaW8oZW51bSB2NGwyX3R1bmVyX3R5cGUgbW9kZSwgdm9pZCAqcHJpdiwgaW50IHB0cikKK3sKKwlpbnQgY3VyZGlyLCBjdXJvdXQ7CisJc3RydWN0IGl2dHYgKml0diA9IChzdHJ1Y3QgaXZ0diAqKSBwcml2OworCisJaWYgKGl0di0+Y2FyZC0+dHlwZSAhPSBJVlRWX0NBUkRfUEc2MDBWMiB8fCBpdHYtPm9wdGlvbnMudHVuZXIgIT0gVFVORVJfWENFSVZFX1hDMzAyOCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJSVZUVl9JTkZPKCJSZXNldHRpbmcgdHVuZXIuXG4iKTsKKwljdXJvdXQgPSByZWFkX3JlZyhJVlRWX1JFR19HUElPX09VVCk7CisJY3VyZGlyID0gcmVhZF9yZWcoSVZUVl9SRUdfR1BJT19ESVIpOworCWN1cmRpciB8PSAoMSA8PCAxMik7ICAvKiBHUElPIGJpdCAxMiAqLworCisJY3Vyb3V0ICY9IH4oMSA8PCAxMik7CisJd3JpdGVfcmVnKGN1cm91dCwgSVZUVl9SRUdfR1BJT19PVVQpOworCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOworCXNjaGVkdWxlX3RpbWVvdXQoMSk7CisKKwljdXJvdXQgfD0gKDEgPDwgMTIpOworCXdyaXRlX3JlZyhjdXJvdXQsIElWVFZfUkVHX0dQSU9fT1VUKTsKKwljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKKwlzY2hlZHVsZV90aW1lb3V0KDEpOworCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKwordm9pZCBpdnR2X2dwaW9faW5pdChzdHJ1Y3QgaXZ0diAqaXR2KQoreworCWlmIChpdHYtPmNhcmQtPmdwaW9faW5pdC5kaXJlY3Rpb24gPT0gMCkKKwkJcmV0dXJuOworCisJSVZUVl9ERUJVR19JTkZPKCJHUElPIGluaXRpYWwgZGlyOiAlMDh4IG91dDogJTA4eFxuIiwKKwkJICAgcmVhZF9yZWcoSVZUVl9SRUdfR1BJT19ESVIpLCByZWFkX3JlZyhJVlRWX1JFR19HUElPX09VVCkpOworCisJLyogaW5pdCBvdXRwdXQgZGF0YSB0aGVuIGRpcmVjdGlvbiAqLworCXdyaXRlX3JlZyhpdHYtPmNhcmQtPmdwaW9faW5pdC5pbml0aWFsX3ZhbHVlLCBJVlRWX1JFR19HUElPX09VVCk7CisJd3JpdGVfcmVnKGl0di0+Y2FyZC0+Z3Bpb19pbml0LmRpcmVjdGlvbiwgSVZUVl9SRUdfR1BJT19ESVIpOworfQorCitzdGF0aWMgc3RydWN0IHY0bDJfcXVlcnljdHJsIGdwaW9fY3RybF9tdXRlID0geworCS5pZCAgICAgICAgICAgID0gVjRMMl9DSURfQVVESU9fTVVURSwKKwkudHlwZSAgICAgICAgICA9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCisJLm5hbWUgICAgICAgICAgPSAiTXV0ZSIsCisJLm1pbmltdW0gICAgICAgPSAwLAorCS5tYXhpbXVtICAgICAgID0gMSwKKwkuc3RlcCAgICAgICAgICA9IDEsCisJLmRlZmF1bHRfdmFsdWUgPSAxLAorCS5mbGFncyAgICAgICAgID0gMCwKK307CisKK2ludCBpdnR2X2dwaW8oc3RydWN0IGl2dHYgKml0diwgdW5zaWduZWQgaW50IGNvbW1hbmQsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgdjRsMl90dW5lciAqdHVuZXIgPSBhcmc7CisJc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCA9IGFyZzsKKwlzdHJ1Y3QgdjRsMl9yb3V0aW5nICpyb3V0ZSA9IGFyZzsKKwl1MTYgbWFzaywgZGF0YTsKKworCXN3aXRjaCAoY29tbWFuZCkgeworCWNhc2UgVklESU9DX0lOVF9BVURJT19DTE9DS19GUkVROgorCQltYXNrID0gaXR2LT5jYXJkLT5ncGlvX2F1ZGlvX2ZyZXEubWFzazsKKwkJc3dpdGNoICgqKHUzMiAqKWFyZykgeworCQljYXNlIDMyMDAwOgorCQkJZGF0YSA9IGl0di0+Y2FyZC0+Z3Bpb19hdWRpb19mcmVxLmYzMjAwMDsKKwkJCWJyZWFrOworCQljYXNlIDQ0MTAwOgorCQkJZGF0YSA9IGl0di0+Y2FyZC0+Z3Bpb19hdWRpb19mcmVxLmY0NDEwMDsKKwkJCWJyZWFrOworCQljYXNlIDQ4MDAwOgorCQlkZWZhdWx0OgorCQkJZGF0YSA9IGl0di0+Y2FyZC0+Z3Bpb19hdWRpb19mcmVxLmY0ODAwMDsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCisJY2FzZSBWSURJT0NfR19UVU5FUjoKKwkJbWFzayA9IGl0di0+Y2FyZC0+Z3Bpb19hdWRpb19kZXRlY3QubWFzazsKKwkJaWYgKG1hc2sgPT0gMCB8fCAocmVhZF9yZWcoSVZUVl9SRUdfR1BJT19JTikgJiBtYXNrKSkKKwkJCXR1bmVyLT5yeHN1YmNoYW5zID0gVjRMMl9UVU5FUl9NT0RFX1NURVJFTyB8CisJCQkgICAgICAgVjRMMl9UVU5FUl9NT0RFX0xBTkcxIHwgVjRMMl9UVU5FUl9NT0RFX0xBTkcyOworCQllbHNlCisJCQl0dW5lci0+cnhzdWJjaGFucyA9IFY0TDJfVFVORVJfU1VCX01PTk87CisJCXJldHVybiAwOworCisJY2FzZSBWSURJT0NfU19UVU5FUjoKKwkJbWFzayA9IGl0di0+Y2FyZC0+Z3Bpb19hdWRpb19tb2RlLm1hc2s7CisJCXN3aXRjaCAodHVuZXItPmF1ZG1vZGUpIHsKKwkJY2FzZSBWNEwyX1RVTkVSX01PREVfTEFORzE6CisJCQlkYXRhID0gaXR2LT5jYXJkLT5ncGlvX2F1ZGlvX21vZGUubGFuZzE7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX1RVTkVSX01PREVfTEFORzI6CisJCQlkYXRhID0gaXR2LT5jYXJkLT5ncGlvX2F1ZGlvX21vZGUubGFuZzI7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX1RVTkVSX01PREVfTU9OTzoKKwkJCWRhdGEgPSBpdHYtPmNhcmQtPmdwaW9fYXVkaW9fbW9kZS5tb25vOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9UVU5FUl9NT0RFX1NURVJFTzoKKwkJY2FzZSBWNEwyX1RVTkVSX01PREVfTEFORzFfTEFORzI6CisJCWRlZmF1bHQ6CisJCQlkYXRhID0gaXR2LT5jYXJkLT5ncGlvX2F1ZGlvX21vZGUuc3RlcmVvOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEFVRENfU0VUX1JBRElPOgorCQltYXNrID0gaXR2LT5jYXJkLT5ncGlvX2F1ZGlvX2lucHV0Lm1hc2s7CisJCWRhdGEgPSBpdHYtPmNhcmQtPmdwaW9fYXVkaW9faW5wdXQucmFkaW87CisJCWJyZWFrOworCisJY2FzZSBWSURJT0NfU19TVEQ6CisJCW1hc2sgPSBpdHYtPmNhcmQtPmdwaW9fYXVkaW9faW5wdXQubWFzazsKKwkJZGF0YSA9IGl0di0+Y2FyZC0+Z3Bpb19hdWRpb19pbnB1dC50dW5lcjsKKwkJYnJlYWs7CisKKwljYXNlIFZJRElPQ19JTlRfU19BVURJT19ST1VUSU5HOgorCQlpZiAocm91dGUtPmlucHV0ID4gMikKKwkJCXJldHVybiAtRUlOVkFMOworCQltYXNrID0gaXR2LT5jYXJkLT5ncGlvX2F1ZGlvX2lucHV0Lm1hc2s7CisJCXN3aXRjaCAocm91dGUtPmlucHV0KSB7CisJCQljYXNlIDA6CisJCQkJZGF0YSA9IGl0di0+Y2FyZC0+Z3Bpb19hdWRpb19pbnB1dC50dW5lcjsKKwkJCQlicmVhazsKKwkJCWNhc2UgMToKKwkJCQlkYXRhID0gaXR2LT5jYXJkLT5ncGlvX2F1ZGlvX2lucHV0LmxpbmVpbjsKKwkJCQlicmVhazsKKwkJCWNhc2UgMjoKKwkJCWRlZmF1bHQ6CisJCQkJZGF0YSA9IGl0di0+Y2FyZC0+Z3Bpb19hdWRpb19pbnB1dC5yYWRpbzsKKwkJCQlicmVhazsKKwkJfQorCQlicmVhazsKKworCWNhc2UgVklESU9DX0dfQ1RSTDoKKwkJaWYgKGN0cmwtPmlkICE9IFY0TDJfQ0lEX0FVRElPX01VVEUpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJbWFzayA9IGl0di0+Y2FyZC0+Z3Bpb19hdWRpb19tdXRlLm1hc2s7CisJCWRhdGEgPSBpdHYtPmNhcmQtPmdwaW9fYXVkaW9fbXV0ZS5tdXRlOworCQljdHJsLT52YWx1ZSA9IChyZWFkX3JlZyhJVlRWX1JFR19HUElPX09VVCkgJiBtYXNrKSA9PSBkYXRhOworCQlyZXR1cm4gMDsKKworCWNhc2UgVklESU9DX1NfQ1RSTDoKKwkJaWYgKGN0cmwtPmlkICE9IFY0TDJfQ0lEX0FVRElPX01VVEUpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJbWFzayA9IGl0di0+Y2FyZC0+Z3Bpb19hdWRpb19tdXRlLm1hc2s7CisJCWRhdGEgPSBjdHJsLT52YWx1ZSA/IGl0di0+Y2FyZC0+Z3Bpb19hdWRpb19tdXRlLm11dGUgOiAwOworCQlicmVhazsKKworCWNhc2UgVklESU9DX1FVRVJZQ1RSTDoKKwl7CisJCXN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWMgPSBhcmc7CisKKwkJaWYgKHFjLT5pZCAhPSBWNEwyX0NJRF9BVURJT19NVVRFKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCSpxYyA9IGdwaW9fY3RybF9tdXRlOworCQlyZXR1cm4gMDsKKwl9CisKKwljYXNlIFZJRElPQ19MT0dfU1RBVFVTOgorCQlJVlRWX0lORk8oIkdQSU8gc3RhdHVzOiBESVI9MHglMDR4IE9VVD0weCUwNHggSU49MHglMDR4XG4iLAorCQkJcmVhZF9yZWcoSVZUVl9SRUdfR1BJT19ESVIpLCByZWFkX3JlZyhJVlRWX1JFR19HUElPX09VVCksCisJCQlyZWFkX3JlZyhJVlRWX1JFR19HUElPX0lOKSk7CisJCXJldHVybiAwOworCisJY2FzZSBWSURJT0NfSU5UX1NfVklERU9fUk9VVElORzoKKwkJaWYgKHJvdXRlLT5pbnB1dCA+IDIpIC8qIDA6VHVuZXIgMTpDb21wb3NpdGUgMjpTLVZpZGVvICovCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJbWFzayA9IGl0di0+Y2FyZC0+Z3Bpb192aWRlb19pbnB1dC5tYXNrOworCQlpZiAgKHJvdXRlLT5pbnB1dCA9PSAwKQorCQkJZGF0YSA9IGl0di0+Y2FyZC0+Z3Bpb192aWRlb19pbnB1dC50dW5lcjsKKwkJZWxzZSBpZiAgKHJvdXRlLT5pbnB1dCA9PSAxKQorCQkJZGF0YSA9IGl0di0+Y2FyZC0+Z3Bpb192aWRlb19pbnB1dC5jb21wb3NpdGU7CisJCWVsc2UKKwkJCWRhdGEgPSBpdHYtPmNhcmQtPmdwaW9fdmlkZW9faW5wdXQuc3ZpZGVvOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAobWFzaykKKwkJd3JpdGVfcmVnKChyZWFkX3JlZyhJVlRWX1JFR19HUElPX09VVCkgJiB+bWFzaykgfCAoZGF0YSAmIG1hc2spLCBJVlRWX1JFR19HUElPX09VVCk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1ncGlvLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1ncGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzMwMWQyYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWdwaW8uaApAQCAtMCwwICsxLDI1IEBACisvKgorICAgIGdwaW8gZnVuY3Rpb25zLgorICAgIENvcHlyaWdodCAoQykgMjAwNCAgQ2hyaXMgS2VubmVkeSA8Y0Bncm9vdnkub3JnPgorICAgIENvcHlyaWdodCAoQykgMjAwNS0yMDA3ICBIYW5zIFZlcmt1aWwgPGh2ZXJrdWlsQHhzNGFsbC5ubD4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisvKiBHUElPIHN0dWZmICovCit2b2lkIGl2dHZfZ3Bpb19pbml0KHN0cnVjdCBpdnR2ICppdHYpOwordm9pZCBpdnR2X3Jlc2V0X2lyX2dwaW8oc3RydWN0IGl2dHYgKml0dik7CitpbnQgaXZ0dl9yZXNldF90dW5lcl9ncGlvKGVudW0gdjRsMl90dW5lcl90eXBlIG1vZGUsIHZvaWQgKnByaXYsIGludCBwdHIpOworaW50IGl2dHZfZ3BpbyhzdHJ1Y3QgaXZ0diAqaXR2LCB1bnNpZ25lZCBpbnQgY29tbWFuZCwgdm9pZCAqYXJnKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWkyYy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtaTJjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA2MjRjNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWkyYy5jCkBAIC0wLDAgKzEsNzQ4IEBACisvKgorICAgIEkyQyBmdW5jdGlvbnMKKyAgICBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNCAgS2V2aW4gVGhheWVyIDxudWZhbl93ZmsgYXQgeWFob28uY29tPgorICAgIENvcHlyaWdodCAoQykgMjAwNS0yMDA3ICBIYW5zIFZlcmt1aWwgPGh2ZXJrdWlsQHhzNGFsbC5ubD4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisvKgorICAgIFRoaXMgZmlsZSBpbmNsdWRlcyBhbiBpMmMgaW1wbGVtZW50YXRpb24gdGhhdCB3YXMgcmV2ZXJzZSBlbmdpbmVlcmVkCisgICAgZnJvbSB0aGUgSGF1cHBhdWdlIHdpbmRvd3MgZHJpdmVyLiAgT2xkZXIgaXZ0diB2ZXJzaW9ucyB1c2VkIGkyYy1hbGdvLWJpdCwKKyAgICB3aGljaCB3aGlsc3QgZmluZSB1bmRlciBtb3N0IGNpcmN1bXN0YW5jZXMsIGhhZCB0cm91YmxlIHdpdGggdGhlIFppbG9nCisgICAgQ1BVIG9uIHRoZSBQVlItMTUwIHdoaWNoIGhhbmRsZXMgSVIgZnVuY3Rpb25zIChvY2Nhc2lvbmFsIGluYWJpbGl0eSB0bworICAgIGNvbW11bmljYXRlIHdpdGggdGhlIGNoaXAgdW50aWwgaXQgd2FzIHJlc2V0KSBhbmQgYWxzbyB3aXRoIHRoZSBpMmMKKyAgICBidXMgYmVpbmcgY29tcGxldGVseSB1bnJlYWNoYWJsZSB3aGVuIG11bHRpcGxlIFBWUiBjYXJkcyB3ZXJlIHByZXNlbnQuCisKKyAgICBUaGUgaW1wbGVtZW50YXRpb24gaXMgdmVyeSBzaW1pbGFyIHRvIGkyYy1hbGdvLWJpdCwgYnV0IHRoZXJlIGFyZSBlbm91Z2gKKyAgICBzdWJ0bGUgZGlmZmVyZW5jZXMgdGhhdCB0aGUgdHdvIGFyZSBoYXJkIHRvIG1lcmdlLiAgVGhlIGdlbmVyYWwgc3RyYXRlZ3kKKyAgICBlbXBsb3llZCBieSBpMmMtYWxnby1iaXQgaXMgdG8gdXNlIHVkZWxheSgpIHRvIGltcGxlbWVudCB0aGUgdGltaW5nCisgICAgd2hlbiBwdXR0aW5nIG91dCBiaXRzIG9uIHRoZSBzY2wvc2RhIGxpbmVzLiAgVGhlIGdlbmVyYWwgc3RyYXRlZ3kgdGFrZW4KKyAgICBoZXJlIGlzIHRvIHBvbGwgdGhlIGxpbmVzIGZvciBzdGF0ZSBjaGFuZ2VzIChzZWUgaXZ0dl93YWl0c2NsIGFuZAorICAgIGl2dHZfd2FpdHNkYSkuICBJbiBhZGRpdGlvbiB0aGVyZSBhcmUgc21hbGwgZGVsYXlzIGF0IHZhcmlvdXMgbG9jYXRpb25zCisgICAgd2hpY2ggcG9sbCB0aGUgU0NMIGxpbmUgNSB0aW1lcyAoaXZ0dl9zY2xkZWxheSkuICBJIHdvdWxkIGd1ZXNzIHRoYXQKKyAgICBzaW5jZSB0aGlzIGlzIG1lbW9yeSBtYXBwZWQgSS9PIHRoYXQgdGhlIGxlbmd0aCBvZiB0aG9zZSBkZWxheXMgaXMgdGllZAorICAgIHRvIHRoZSBQQ0kgYnVzIGNsb2NrLiAgVGhlcmUgaXMgc29tZSBleHRyYSBjb2RlIHRvIGRvIHdpdGggcmVjb3ZlcnkKKyAgICBhbmQgcmV0cmllcy4gIFNpbmNlIGl0IGlzIG5vdCBrbm93biB3aGF0IGNhdXNlcyB0aGUgYWN0dWFsIGkyYyBwcm9ibGVtcworICAgIGluIHRoZSBmaXJzdCBwbGFjZSwgdGhlIG9ubHkgZ29hbCBpZiBvbmUgd2FzIHRvIGF0dGVtcHQgdG8gdXNlCisgICAgaTJjLWFsZ28tYml0IHdvdWxkIGJlIHRvIHRyeSB0byBtYWtlIGl0IGZvbGxvdyB0aGUgc2FtZSBjb2RlIHBhdGguCisgICAgVGhpcyB3b3VsZCBiZSBhIGxvdCBvZiB3b3JrLCBhbmQgSSdtIGFsc28gbm90IGNvbnZpbmNlZCB0aGF0IGl0IHdvdWxkCisgICAgcHJvdmlkZSBhIGdlbmVyaWMgYmVuZWZpdCB0byBpMmMtYWxnby1iaXQuICBUaGVyZWZvcmUgY29uc2lkZXIgdGhpcworICAgIGFuIGVuZ2luZWVyaW5nIHNvbHV0aW9uIC0tIG5vdCBwcmV0dHksIGJ1dCBpdCB3b3Jrcy4KKworICAgIFNvbWUgbW9yZSBnZW5lcmFsIGNvbW1lbnRzIGFib3V0IHdoYXQgd2UgYXJlIGRvaW5nOgorCisgICAgVGhlIGkyYyBidXMgaXMgYSAyIHdpcmUgc2VyaWFsIGJ1cywgd2l0aCBjbG9jayAoU0NMKSBhbmQgZGF0YSAoU0RBKQorICAgIGxpbmVzLiAgVG8gY29tbXVuaWNhdGUgb24gdGhlIGJ1cyAoYXMgYSBtYXN0ZXIsIHdlIGRvbid0IGFjdCBhcyBhIHNsYXZlKSwKKyAgICB3ZSBmaXJzdCBpbml0aWF0ZSBhIHN0YXJ0IGNvbmRpdGlvbiAoaXZ0dl9zdGFydCkuICBXZSB0aGVuIHdyaXRlIHRoZQorICAgIGFkZHJlc3Mgb2YgdGhlIGRldmljZSB0aGF0IHdlIHdhbnQgdG8gY29tbXVuaWNhdGUgd2l0aCwgYWxvbmcgd2l0aCBhIGZsYWcKKyAgICB0aGF0IGluZGljYXRlcyB3aGV0aGVyIHRoaXMgaXMgYSByZWFkIG9yIGEgd3JpdGUuICBUaGUgc2xhdmUgdGhlbiBpc3N1ZXMKKyAgICBhbiBBQ0sgc2lnbmFsIChpdnR2X2FjayksIHdoaWNoIHRlbGxzIHVzIHRoYXQgaXQgaXMgcmVhZHkgZm9yIHJlYWRpbmcgLworICAgIHdyaXRpbmcuICBXZSB0aGVuIHByb2NlZWQgd2l0aCByZWFkaW5nIG9yIHdyaXRpbmcgKGl2dHZfcmVhZC9pdnR2X3dyaXRlKSwKKyAgICBhbmQgZmluYWxseSBpc3N1ZSBhIHN0b3AgY29uZGl0aW9uIChpdnR2X3N0b3ApIHRvIG1ha2UgdGhlIGJ1cyBhdmFpbGFibGUKKyAgICB0byBvdGhlciBtYXN0ZXJzLgorCisgICAgVGhlcmUgaXMgYW4gYWRkaXRpb25hbCBmb3JtIG9mIHRyYW5zYWN0aW9uIHdoZXJlIGEgd3JpdGUgbWF5IGJlCisgICAgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYSByZWFkLiAgSW4gdGhpcyBjYXNlLCB0aGVyZSBpcyBubyBpbnRlcnZlbmluZworICAgIHN0b3AgY29uZGl0aW9uLiAgKE9ubHkgdGhlIG1zcDM0MDAgY2hpcCB1c2VzIHRoaXMgbWV0aG9kIG9mIGRhdGEgdHJhbnNmZXIpLgorICovCisKKyNpbmNsdWRlICJpdnR2LWRyaXZlci5oIgorI2luY2x1ZGUgIml2dHYtY2FyZHMuaCIKKyNpbmNsdWRlICJpdnR2LWdwaW8uaCIKKyNpbmNsdWRlICJpdnR2LWkyYy5oIgorCisjaW5jbHVkZSA8bWVkaWEvaXIta2JkLWkyYy5oPgorCisvKiBpMmMgaW1wbGVtZW50YXRpb24gZm9yIGN4MjM0MTUvNiBjaGlwLCBpdnR2IHByb2plY3QuCisgKiBBdXRob3I6IEtldmluIFRoYXllciAobnVmYW5fd2ZrIGF0IHlhaG9vLmNvbSkKKyAqLworLyogaTJjIHN0dWZmICovCisjZGVmaW5lIElWVFZfUkVHX0kyQ19TRVRTQ0xfT0ZGU0VUIDB4NzAwMAorI2RlZmluZSBJVlRWX1JFR19JMkNfU0VUU0RBX09GRlNFVCAweDcwMDQKKyNkZWZpbmUgSVZUVl9SRUdfSTJDX0dFVFNDTF9PRkZTRVQgMHg3MDA4CisjZGVmaW5lIElWVFZfUkVHX0kyQ19HRVRTREFfT0ZGU0VUIDB4NzAwYworCisjaWZuZGVmIEkyQ19BREFQX0NMQVNTX1RWX0FOQUxPRworI2RlZmluZSBJMkNfQURBUF9DTEFTU19UVl9BTkFMT0cgSTJDX0NMQVNTX1RWX0FOQUxPRworI2VuZGlmIC8qIEkyQ19BREFQX0NMQVNTX1RWX0FOQUxPRyAqLworCisjZGVmaW5lIElWVFZfQ1M1M0wzMkFfSTJDX0FERFIJCTB4MTEKKyNkZWZpbmUgSVZUVl9DWDI1ODQwX0kyQ19BRERSIAkJMHg0NAorI2RlZmluZSBJVlRWX1NBQTcxMTVfSTJDX0FERFIgCQkweDIxCisjZGVmaW5lIElWVFZfU0FBNzEyN19JMkNfQUREUiAJCTB4NDQKKyNkZWZpbmUgSVZUVl9TQUE3MTd4X0kyQ19BRERSIAkJMHgyMQorI2RlZmluZSBJVlRWX01TUDM0MDBfSTJDX0FERFIgCQkweDQwCisjZGVmaW5lIElWVFZfSEFVUFBBVUdFX0kyQ19BRERSIAkweDUwCisjZGVmaW5lIElWVFZfV004NzM5X0kyQ19BRERSIAkJMHgxYQorI2RlZmluZSBJVlRWX1dNODc3NV9JMkNfQUREUgkJMHgxYgorI2RlZmluZSBJVlRWX1RFQTU3NjdfSTJDX0FERFIJCTB4NjAKKyNkZWZpbmUgSVZUVl9VUEQ2NDAzMUFfSTJDX0FERFIgCTB4MTIKKyNkZWZpbmUgSVZUVl9VUEQ2NDA4M19JMkNfQUREUiAJCTB4NWMKKyNkZWZpbmUgSVZUVl9UREE5ODVYX0kyQ19BRERSICAgICAgCTB4NWIKKworLyogVGhpcyBhcnJheSBzaG91bGQgbWF0Y2ggdGhlIElWVFZfSFdfIGRlZmluZXMgKi8KK3N0YXRpYyBjb25zdCB1OCBod19kcml2ZXJpZHNbXSA9IHsKKwlJMkNfRFJJVkVSSURfQ1gyNTg0MCwKKwlJMkNfRFJJVkVSSURfU0FBNzExWCwKKwlJMkNfRFJJVkVSSURfU0FBNzEyNywKKwlJMkNfRFJJVkVSSURfTVNQMzQwMCwKKwlJMkNfRFJJVkVSSURfVFVORVIsCisJSTJDX0RSSVZFUklEX1dNODc3NSwKKwlJMkNfRFJJVkVSSURfQ1M1M0wzMkEsCisJSTJDX0RSSVZFUklEX1RWRUVQUk9NLAorCUkyQ19EUklWRVJJRF9TQUE3MTFYLAorCUkyQ19EUklWRVJJRF9UVkFVRElPLAorCUkyQ19EUklWRVJJRF9VUEQ2NDAzMUEsCisJSTJDX0RSSVZFUklEX1VQRDY0MDgzLAorCUkyQ19EUklWRVJJRF9TQUE3MTdYLAorCUkyQ19EUklWRVJJRF9XTTg3MzksCisJMCAJCS8qIElWVFZfSFdfR1BJTyBkdW1teSBkcml2ZXIgSUQgKi8KK307CisKKy8qIFRoaXMgYXJyYXkgc2hvdWxkIG1hdGNoIHRoZSBJVlRWX0hXXyBkZWZpbmVzICovCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGh3X2RyaXZlcm5hbWVzW10gPSB7CisJImN4MjU4NHgiLAorCSJzYWE3MTE1IiwKKwkic2FhNzEyNyIsCisJIm1zcDM0MDAiLAorCSJ0dW5lciIsCisJIndtODc3NSIsCisJImNzNTNsMzJhIiwKKwkidHZlZXByb20iLAorCSJzYWE3MTE0IiwKKwkidHZhdWRpbyIsCisJInVwZDY0MDMxYSIsCisJInVwZDY0MDgzIiwKKwkic2FhNzE3eCIsCisJIndtODczOSIsCisJImdwaW8iLAorfTsKKworc3RhdGljIGludCBhdHRhY2hfaW5mb3JtKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IGl2dHYgKml0diA9IChzdHJ1Y3QgaXZ0diAqKWkyY19nZXRfYWRhcGRhdGEoY2xpZW50LT5hZGFwdGVyKTsKKwlpbnQgaTsKKworCUlWVFZfREVCVUdfSTJDKCJpMmMgY2xpZW50IGF0dGFjaFxuIik7CisJZm9yIChpID0gMDsgaSA8IEkyQ19DTElFTlRTX01BWDsgaSsrKSB7CisJCWlmIChpdHYtPmkyY19jbGllbnRzW2ldID09IE5VTEwpIHsKKwkJCWl0di0+aTJjX2NsaWVudHNbaV0gPSBjbGllbnQ7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoaSA9PSBJMkNfQ0xJRU5UU19NQVgpIHsKKwkJSVZUVl9FUlIoImluc3VmZmljaWVudCByb29tIGZvciBuZXcgSTJDIGNsaWVudCFcbiIpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZXRhY2hfaW5mb3JtKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJaW50IGk7CisJc3RydWN0IGl2dHYgKml0diA9IChzdHJ1Y3QgaXZ0diAqKWkyY19nZXRfYWRhcGRhdGEoY2xpZW50LT5hZGFwdGVyKTsKKworCUlWVFZfREVCVUdfSTJDKCJpMmMgY2xpZW50IGRldGFjaFxuIik7CisJZm9yIChpID0gMDsgaSA8IEkyQ19DTElFTlRTX01BWDsgaSsrKSB7CisJCWlmIChpdHYtPmkyY19jbGllbnRzW2ldID09IGNsaWVudCkgeworCQkJaXR2LT5pMmNfY2xpZW50c1tpXSA9IE5VTEw7CisJCQlicmVhazsKKwkJfQorCX0KKwlJVlRWX0RFQlVHX0kyQygiaTJjIGRldGFjaCBbY2xpZW50PSVzLCVzXVxuIiwKKwkJICAgY2xpZW50LT5uYW1lLCAoaSA8IEkyQ19DTElFTlRTX01BWCkgPyAib2siIDogImZhaWxlZCIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFNldCB0aGUgc2VyaWFsIGNsb2NrIGxpbmUgdG8gdGhlIGRlc2lyZWQgc3RhdGUgKi8KK3N0YXRpYyB2b2lkIGl2dHZfc2V0c2NsKHN0cnVjdCBpdnR2ICppdHYsIGludCBzdGF0ZSkKK3sKKwkvKiB3cml0ZSB0aGVtIG91dCAqLworCS8qIHdyaXRlIGJpdHMgYXJlIGludmVydGVkICovCisJd3JpdGVfcmVnKH5zdGF0ZSwgSVZUVl9SRUdfSTJDX1NFVFNDTF9PRkZTRVQpOworfQorCisvKiBTZXQgdGhlIHNlcmlhbCBkYXRhIGxpbmUgdG8gdGhlIGRlc2lyZWQgc3RhdGUgKi8KK3N0YXRpYyB2b2lkIGl2dHZfc2V0c2RhKHN0cnVjdCBpdnR2ICppdHYsIGludCBzdGF0ZSkKK3sKKwkvKiB3cml0ZSB0aGVtIG91dCAqLworCS8qIHdyaXRlIGJpdHMgYXJlIGludmVydGVkICovCisJd3JpdGVfcmVnKH5zdGF0ZSAmIDEsIElWVFZfUkVHX0kyQ19TRVRTREFfT0ZGU0VUKTsKK30KKworLyogUmVhZCB0aGUgc2VyaWFsIGNsb2NrIGxpbmUgKi8KK3N0YXRpYyBpbnQgaXZ0dl9nZXRzY2woc3RydWN0IGl2dHYgKml0dikKK3sKKwlyZXR1cm4gcmVhZF9yZWcoSVZUVl9SRUdfSTJDX0dFVFNDTF9PRkZTRVQpICYgMTsKK30KKworLyogUmVhZCB0aGUgc2VyaWFsIGRhdGEgbGluZSAqLworc3RhdGljIGludCBpdnR2X2dldHNkYShzdHJ1Y3QgaXZ0diAqaXR2KQoreworCXJldHVybiByZWFkX3JlZyhJVlRWX1JFR19JMkNfR0VUU0RBX09GRlNFVCkgJiAxOworfQorCisvKiBJbXBsZW1lbnQgYSBzaG9ydCBkZWxheSBieSBwb2xsaW5nIHRoZSBzZXJpYWwgY2xvY2sgbGluZSAqLworc3RhdGljIHZvaWQgaXZ0dl9zY2xkZWxheShzdHJ1Y3QgaXZ0diAqaXR2KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDU7ICsraSkKKwkJaXZ0dl9nZXRzY2woaXR2KTsKK30KKworLyogV2FpdCBmb3IgdGhlIHNlcmlhbCBjbG9jayBsaW5lIHRvIGJlY29tZSBzZXQgdG8gYSBzcGVjaWZpYyB2YWx1ZSAqLworc3RhdGljIGludCBpdnR2X3dhaXRzY2woc3RydWN0IGl2dHYgKml0diwgaW50IHZhbCkKK3sKKwlpbnQgaTsKKworCWl2dHZfc2NsZGVsYXkoaXR2KTsKKwlmb3IgKGkgPSAwOyBpIDwgMTAwMDsgKytpKSB7CisJCWlmIChpdnR2X2dldHNjbChpdHYpID09IHZhbCkKKwkJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogV2FpdCBmb3IgdGhlIHNlcmlhbCBkYXRhIGxpbmUgdG8gYmVjb21lIHNldCB0byBhIHNwZWNpZmljIHZhbHVlICovCitzdGF0aWMgaW50IGl2dHZfd2FpdHNkYShzdHJ1Y3QgaXZ0diAqaXR2LCBpbnQgdmFsKQoreworCWludCBpOworCisJaXZ0dl9zY2xkZWxheShpdHYpOworCWZvciAoaSA9IDA7IGkgPCAxMDAwOyArK2kpIHsKKwkJaWYgKGl2dHZfZ2V0c2RhKGl0dikgPT0gdmFsKQorCQkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCisvKiBXYWl0IGZvciB0aGUgc2xhdmUgdG8gaXNzdWUgYW4gQUNLICovCitzdGF0aWMgaW50IGl2dHZfYWNrKHN0cnVjdCBpdnR2ICppdHYpCit7CisJaW50IHJldCA9IDA7CisKKwlpZiAoaXZ0dl9nZXRzY2woaXR2KSA9PSAxKSB7CisJCUlWVFZfREVCVUdfSTJDKCJTQ0wgd2FzIGhpZ2ggc3RhcnRpbmcgYW4gYWNrXG4iKTsKKwkJaXZ0dl9zZXRzY2woaXR2LCAwKTsKKwkJaWYgKCFpdnR2X3dhaXRzY2woaXR2LCAwKSkgeworCQkJSVZUVl9ERUJVR19JMkMoIkNvdWxkIG5vdCBzZXQgU0NMIGxvdyBzdGFydGluZyBhbiBhY2tcbiIpOworCQkJcmV0dXJuIC1FUkVNT1RFSU87CisJCX0KKwl9CisJaXZ0dl9zZXRzZGEoaXR2LCAxKTsKKwlpdnR2X3NjbGRlbGF5KGl0dik7CisJaXZ0dl9zZXRzY2woaXR2LCAxKTsKKwlpZiAoIWl2dHZfd2FpdHNkYShpdHYsIDApKSB7CisJCUlWVFZfREVCVUdfSTJDKCJTbGF2ZSBkaWQgbm90IGFja1xuIik7CisJCXJldCA9IC1FUkVNT1RFSU87CisJfQorCWl2dHZfc2V0c2NsKGl0diwgMCk7CisJaWYgKCFpdnR2X3dhaXRzY2woaXR2LCAwKSkgeworCQlJVlRWX0RFQlVHX0kyQygiRmFpbGVkIHRvIHNldCBTQ0wgbG93IGFmdGVyIEFDS1xuIik7CisJCXJldCA9IC1FUkVNT1RFSU87CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qIFdyaXRlIGEgc2luZ2xlIGJ5dGUgdG8gdGhlIGkyYyBidXMgYW5kIHdhaXQgZm9yIHRoZSBzbGF2ZSB0byBBQ0sgKi8KK3N0YXRpYyBpbnQgaXZ0dl9zZW5kYnl0ZShzdHJ1Y3QgaXZ0diAqaXR2LCB1bnNpZ25lZCBjaGFyIGJ5dGUpCit7CisJaW50IGksIGJpdDsKKworCUlWVFZfREVCVUdfSTJDKCJ3cml0ZSAleFxuIixieXRlKTsKKwlmb3IgKGkgPSAwOyBpIDwgODsgKytpLCBieXRlPDw9MSkgeworCQlpdnR2X3NldHNjbChpdHYsIDApOworCQlpZiAoIWl2dHZfd2FpdHNjbChpdHYsIDApKSB7CisJCQlJVlRWX0RFQlVHX0kyQygiRXJyb3Igc2V0dGluZyBTQ0wgbG93XG4iKTsKKwkJCXJldHVybiAtRVJFTU9URUlPOworCQl9CisJCWJpdCA9IChieXRlPj43KSYxOworCQlpdnR2X3NldHNkYShpdHYsIGJpdCk7CisJCWlmICghaXZ0dl93YWl0c2RhKGl0diwgYml0KSkgeworCQkJSVZUVl9ERUJVR19JMkMoIkVycm9yIHNldHRpbmcgU0RBXG4iKTsKKwkJCXJldHVybiAtRVJFTU9URUlPOworCQl9CisJCWl2dHZfc2V0c2NsKGl0diwgMSk7CisJCWlmICghaXZ0dl93YWl0c2NsKGl0diwgMSkpIHsKKwkJCUlWVFZfREVCVUdfSTJDKCJTbGF2ZSBub3QgcmVhZHkgZm9yIGJpdFxuIik7CisJCQlyZXR1cm4gLUVSRU1PVEVJTzsKKwkJfQorCX0KKwlpdnR2X3NldHNjbChpdHYsIDApOworCWlmICghaXZ0dl93YWl0c2NsKGl0diwgMCkpIHsKKwkJSVZUVl9ERUJVR19JMkMoIkVycm9yIHNldHRpbmcgU0NMIGxvd1xuIik7CisJCXJldHVybiAtRVJFTU9URUlPOworCX0KKwlyZXR1cm4gaXZ0dl9hY2soaXR2KTsKK30KKworLyogUmVhZCBhIGJ5dGUgZnJvbSB0aGUgaTJjIGJ1cyBhbmQgc2VuZCBhIE5BQ0sgaWYgYXBwbGljYWJsZSAoaS5lLiBmb3IgdGhlCisgICBmaW5hbCBieXRlKSAqLworc3RhdGljIGludCBpdnR2X3JlYWRieXRlKHN0cnVjdCBpdnR2ICppdHYsIHVuc2lnbmVkIGNoYXIgKmJ5dGUsIGludCBuYWNrKQoreworCWludCBpOworCisJKmJ5dGUgPSAwOworCisJaXZ0dl9zZXRzZGEoaXR2LCAxKTsKKwlpdnR2X3NjbGRlbGF5KGl0dik7CisJZm9yIChpID0gMDsgaSA8IDg7ICsraSkgeworCQlpdnR2X3NldHNjbChpdHYsIDApOworCQlpdnR2X3NjbGRlbGF5KGl0dik7CisJCWl2dHZfc2V0c2NsKGl0diwgMSk7CisJCWlmICghaXZ0dl93YWl0c2NsKGl0diwgMSkpIHsKKwkJCUlWVFZfREVCVUdfSTJDKCJFcnJvciBzZXR0aW5nIFNDTCBoaWdoXG4iKTsKKwkJCXJldHVybiAtRVJFTU9URUlPOworCQl9CisJCSpieXRlID0gKCgqYnl0ZSk8PDEpfGl2dHZfZ2V0c2RhKGl0dik7CisJfQorCWl2dHZfc2V0c2NsKGl0diwgMCk7CisJaXZ0dl9zY2xkZWxheShpdHYpOworCWl2dHZfc2V0c2RhKGl0diwgbmFjayk7CisJaXZ0dl9zY2xkZWxheShpdHYpOworCWl2dHZfc2V0c2NsKGl0diwgMSk7CisJaXZ0dl9zY2xkZWxheShpdHYpOworCWl2dHZfc2V0c2NsKGl0diwgMCk7CisJaXZ0dl9zY2xkZWxheShpdHYpOworCUlWVFZfREVCVUdfSTJDKCJyZWFkICV4XG4iLCpieXRlKTsKKwlyZXR1cm4gMDsKK30KKworLyogSXNzdWUgYSBzdGFydCBjb25kaXRpb24gb24gdGhlIGkyYyBidXMgdG8gYWxlcnQgc2xhdmVzIHRvIHByZXBhcmUgZm9yCisgICBhbiBhZGRyZXNzIHdyaXRlICovCitzdGF0aWMgaW50IGl2dHZfc3RhcnQoc3RydWN0IGl2dHYgKml0dikKK3sKKwlpbnQgc2RhOworCisJc2RhID0gaXZ0dl9nZXRzZGEoaXR2KTsKKwlpZiAoc2RhICE9IDEpIHsKKwkJSVZUVl9ERUJVR19JMkMoIlNEQSB3YXMgbG93IGF0IHN0YXJ0XG4iKTsKKwkJaXZ0dl9zZXRzZGEoaXR2LCAxKTsKKwkJaWYgKCFpdnR2X3dhaXRzZGEoaXR2LCAxKSkgeworCQkJSVZUVl9ERUJVR19JMkMoIlNEQSBzdHVjayBsb3dcbiIpOworCQkJcmV0dXJuIC1FUkVNT1RFSU87CisJCX0KKwl9CisJaWYgKGl2dHZfZ2V0c2NsKGl0dikgIT0gMSkgeworCQlpdnR2X3NldHNjbChpdHYsIDEpOworCQlpZiAoIWl2dHZfd2FpdHNjbChpdHYsIDEpKSB7CisJCQlJVlRWX0RFQlVHX0kyQygiU0NMIHN0dWNrIGxvdyBhdCBzdGFydFxuIik7CisJCQlyZXR1cm4gLUVSRU1PVEVJTzsKKwkJfQorCX0KKwlpdnR2X3NldHNkYShpdHYsIDApOworCWl2dHZfc2NsZGVsYXkoaXR2KTsKKwlyZXR1cm4gMDsKK30KKworLyogSXNzdWUgYSBzdG9wIGNvbmRpdGlvbiBvbiB0aGUgaTJjIGJ1cyB0byByZWxlYXNlIGl0ICovCitzdGF0aWMgaW50IGl2dHZfc3RvcChzdHJ1Y3QgaXZ0diAqaXR2KQoreworCWludCBpOworCisJaWYgKGl2dHZfZ2V0c2NsKGl0dikgIT0gMCkgeworCQlJVlRWX0RFQlVHX0kyQygiU0NMIG5vdCBsb3cgd2hlbiBzdG9wcGluZ1xuIik7CisJCWl2dHZfc2V0c2NsKGl0diwgMCk7CisJCWlmICghaXZ0dl93YWl0c2NsKGl0diwgMCkpIHsKKwkJCUlWVFZfREVCVUdfSTJDKCJTQ0wgY291bGQgbm90IGJlIHNldCBsb3dcbiIpOworCQl9CisJfQorCWl2dHZfc2V0c2RhKGl0diwgMCk7CisJaXZ0dl9zY2xkZWxheShpdHYpOworCWl2dHZfc2V0c2NsKGl0diwgMSk7CisJaWYgKCFpdnR2X3dhaXRzY2woaXR2LCAxKSkgeworCQlJVlRWX0RFQlVHX0kyQygiU0NMIGNvdWxkIG5vdCBiZSBzZXQgaGlnaFxuIik7CisJCXJldHVybiAtRVJFTU9URUlPOworCX0KKwlpdnR2X3NjbGRlbGF5KGl0dik7CisJaXZ0dl9zZXRzZGEoaXR2LCAxKTsKKwlpZiAoIWl2dHZfd2FpdHNkYShpdHYsIDEpKSB7CisJCUlWVFZfREVCVUdfSTJDKCJyZXNldHRpbmcgSTJDXG4iKTsKKwkJZm9yIChpID0gMDsgaSA8IDE2OyArK2kpIHsKKwkJCWl2dHZfc2V0c2NsKGl0diwgMCk7CisJCQlpdnR2X3NjbGRlbGF5KGl0dik7CisJCQlpdnR2X3NldHNjbChpdHYsIDEpOworCQkJaXZ0dl9zY2xkZWxheShpdHYpOworCQkJaXZ0dl9zZXRzZGEoaXR2LCAxKTsKKwkJfQorCQlpdnR2X3dhaXRzZGEoaXR2LCAxKTsKKwkJcmV0dXJuIC1FUkVNT1RFSU87CisJfQorCXJldHVybiAwOworfQorCisvKiBXcml0ZSBhIG1lc3NhZ2UgdG8gdGhlIGdpdmVuIGkyYyBzbGF2ZS4gIGRvX3N0b3AgbWF5IGJlIDAgdG8gcHJldmVudAorICAgaXNzdWluZyB0aGUgaTJjIHN0b3AgY29uZGl0aW9uICh3aGVuIGZvbGxvd2luZyB3aXRoIGEgcmVhZCkgKi8KK3N0YXRpYyBpbnQgaXZ0dl93cml0ZShzdHJ1Y3QgaXZ0diAqaXR2LCB1bnNpZ25lZCBjaGFyIGFkZHIsIHVuc2lnbmVkIGNoYXIgKmRhdGEsIHUzMiBsZW4sIGludCBkb19zdG9wKQoreworCWludCByZXRyeSwgcmV0ID0gLUVSRU1PVEVJTzsKKwl1MzIgaTsKKworCWZvciAocmV0cnkgPSAwOyByZXQgIT0gMCAmJiByZXRyeSA8IDg7ICsrcmV0cnkpIHsKKwkJcmV0ID0gaXZ0dl9zdGFydChpdHYpOworCisJCWlmIChyZXQgPT0gMCkgeworCQkJcmV0ID0gaXZ0dl9zZW5kYnl0ZShpdHYsIGFkZHI8PDEpOworCQkJZm9yIChpID0gMDsgcmV0ID09IDAgJiYgaSA8IGxlbjsgKytpKQorCQkJCXJldCA9IGl2dHZfc2VuZGJ5dGUoaXR2LCBkYXRhW2ldKTsKKwkJfQorCQlpZiAocmV0ICE9IDAgfHwgZG9fc3RvcCkgeworCQkJaXZ0dl9zdG9wKGl0dik7CisJCX0KKwl9CisJaWYgKHJldCkKKwkJSVZUVl9ERUJVR19JMkMoImkyYyB3cml0ZSB0byAleCBmYWlsZWRcbiIsIGFkZHIpOworCXJldHVybiByZXQ7Cit9CisKKy8qIFJlYWQgZGF0YSBmcm9tIHRoZSBnaXZlbiBpMmMgc2xhdmUuICBBIHN0b3AgY29uZGl0aW9uIGlzIGFsd2F5cyBpc3N1ZWQuICovCitzdGF0aWMgaW50IGl2dHZfcmVhZChzdHJ1Y3QgaXZ0diAqaXR2LCB1bnNpZ25lZCBjaGFyIGFkZHIsIHVuc2lnbmVkIGNoYXIgKmRhdGEsIHUzMiBsZW4pCit7CisJaW50IHJldHJ5LCByZXQgPSAtRVJFTU9URUlPOworCXUzMiBpOworCisJZm9yIChyZXRyeSA9IDA7IHJldCAhPSAwICYmIHJldHJ5IDwgODsgKytyZXRyeSkgeworCQlyZXQgPSBpdnR2X3N0YXJ0KGl0dik7CisJCWlmIChyZXQgPT0gMCkKKwkJCXJldCA9IGl2dHZfc2VuZGJ5dGUoaXR2LCAoYWRkciA8PCAxKSB8IDEpOworCQlmb3IgKGkgPSAwOyByZXQgPT0gMCAmJiBpIDwgbGVuOyArK2kpIHsKKwkJCXJldCA9IGl2dHZfcmVhZGJ5dGUoaXR2LCAmZGF0YVtpXSwgaSA9PSBsZW4gLSAxKTsKKwkJfQorCQlpdnR2X3N0b3AoaXR2KTsKKwl9CisJaWYgKHJldCkKKwkJSVZUVl9ERUJVR19JMkMoImkyYyByZWFkIGZyb20gJXggZmFpbGVkXG4iLCBhZGRyKTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBLZXJuZWwgaTJjIHRyYW5zZmVyIGltcGxlbWVudGF0aW9uLiAgVGFrZXMgYSBudW1iZXIgb2YgbWVzc2FnZXMgdG8gYmUgcmVhZAorICAgb3Igd3JpdHRlbi4gIElmIGEgcmVhZCBmb2xsb3dzIGEgd3JpdGUsIHRoaXMgd2lsbCBvY2N1ciB3aXRob3V0IGFuCisgICBpbnRlcnZlbmluZyBzdG9wIGNvbmRpdGlvbiAqLworc3RhdGljIGludCBpdnR2X3hmZXIoc3RydWN0IGkyY19hZGFwdGVyICppMmNfYWRhcCwgc3RydWN0IGkyY19tc2cgKm1zZ3MsIGludCBudW0pCit7CisJc3RydWN0IGl2dHYgKml0diA9IGkyY19nZXRfYWRhcGRhdGEoaTJjX2FkYXApOworCWludCByZXR2YWw7CisJaW50IGk7CisKKwltdXRleF9sb2NrKCZpdHYtPmkyY19idXNfbG9jayk7CisJZm9yIChpID0gcmV0dmFsID0gMDsgcmV0dmFsID09IDAgJiYgaSA8IG51bTsgaSsrKSB7CisJCWlmIChtc2dzW2ldLmZsYWdzICYgSTJDX01fUkQpCisJCQlyZXR2YWwgPSBpdnR2X3JlYWQoaXR2LCBtc2dzW2ldLmFkZHIsIG1zZ3NbaV0uYnVmLCBtc2dzW2ldLmxlbik7CisJCWVsc2UgeworCQkJLyogaWYgZm9sbG93ZWQgYnkgYSByZWFkLCBkb24ndCBzdG9wICovCisJCQlpbnQgc3RvcCA9ICEoaSArIDEgPCBudW0gJiYgbXNnc1tpICsgMV0uZmxhZ3MgPT0gSTJDX01fUkQpOworCisJCQlyZXR2YWwgPSBpdnR2X3dyaXRlKGl0diwgbXNnc1tpXS5hZGRyLCBtc2dzW2ldLmJ1ZiwgbXNnc1tpXS5sZW4sIHN0b3ApOworCQl9CisJfQorCW11dGV4X3VubG9jaygmaXR2LT5pMmNfYnVzX2xvY2spOworCXJldHVybiByZXR2YWwgPyByZXR2YWwgOiBudW07Cit9CisKKy8qIEtlcm5lbCBpMmMgY2FwYWJpbGl0aWVzICovCitzdGF0aWMgdTMyIGl2dHZfZnVuY3Rpb25hbGl0eShzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCit7CisJcmV0dXJuIEkyQ19GVU5DX0kyQyB8IEkyQ19GVU5DX1NNQlVTX0VNVUw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBpdnR2X2FsZ28gPSB7CisJLm1hc3Rlcl94ZmVyICAgPSBpdnR2X3hmZXIsCisJLmZ1bmN0aW9uYWxpdHkgPSBpdnR2X2Z1bmN0aW9uYWxpdHksCit9OworCisvKiB0ZW1wbGF0ZSBmb3Igb3VyLWJpdCBiYW5nZXIgKi8KK3N0YXRpYyBzdHJ1Y3QgaTJjX2FkYXB0ZXIgaXZ0dl9pMmNfYWRhcF9od190ZW1wbGF0ZSA9IHsKKwkubmFtZSA9ICJpdnR2IGkyYyBkcml2ZXIiLAorCS5pZCA9IEkyQ19IV19CX0NYMjM0MVgsCisJLmFsZ28gPSAmaXZ0dl9hbGdvLAorCS5hbGdvX2RhdGEgPSBOVUxMLAkJCS8qIGZpbGxlZCBmcm9tIHRlbXBsYXRlICovCisJLmNsaWVudF9yZWdpc3RlciA9IGF0dGFjaF9pbmZvcm0sCisJLmNsaWVudF91bnJlZ2lzdGVyID0gZGV0YWNoX2luZm9ybSwKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKyNpZmRlZiBJMkNfQURBUF9DTEFTU19UVl9BTkFMT0cKKwkuY2xhc3MgPSBJMkNfQURBUF9DTEFTU19UVl9BTkFMT0csCisjZW5kaWYKK307CisKK3N0YXRpYyB2b2lkIGl2dHZfc2V0c2NsX29sZCh2b2lkICpkYXRhLCBpbnQgc3RhdGUpCit7CisJc3RydWN0IGl2dHYgKml0diA9IChzdHJ1Y3QgaXZ0diAqKWRhdGE7CisKKwlpZiAoc3RhdGUpCisJCWl0di0+aTJjX3N0YXRlIHw9IDB4MDE7CisJZWxzZQorCQlpdHYtPmkyY19zdGF0ZSAmPSB+MHgwMTsKKworCS8qIHdyaXRlIHRoZW0gb3V0ICovCisJLyogd3JpdGUgYml0cyBhcmUgaW52ZXJ0ZWQgKi8KKwl3cml0ZV9yZWcofml0di0+aTJjX3N0YXRlLCBJVlRWX1JFR19JMkNfU0VUU0NMX09GRlNFVCk7Cit9CisKK3N0YXRpYyB2b2lkIGl2dHZfc2V0c2RhX29sZCh2b2lkICpkYXRhLCBpbnQgc3RhdGUpCit7CisJc3RydWN0IGl2dHYgKml0diA9IChzdHJ1Y3QgaXZ0diAqKWRhdGE7CisKKwlpZiAoc3RhdGUpCisJCWl0di0+aTJjX3N0YXRlIHw9IDB4MDE7CisJZWxzZQorCQlpdHYtPmkyY19zdGF0ZSAmPSB+MHgwMTsKKworCS8qIHdyaXRlIHRoZW0gb3V0ICovCisJLyogd3JpdGUgYml0cyBhcmUgaW52ZXJ0ZWQgKi8KKwl3cml0ZV9yZWcofml0di0+aTJjX3N0YXRlLCBJVlRWX1JFR19JMkNfU0VUU0RBX09GRlNFVCk7Cit9CisKK3N0YXRpYyBpbnQgaXZ0dl9nZXRzY2xfb2xkKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGl2dHYgKml0diA9IChzdHJ1Y3QgaXZ0diAqKWRhdGE7CisKKwlyZXR1cm4gcmVhZF9yZWcoSVZUVl9SRUdfSTJDX0dFVFNDTF9PRkZTRVQpICYgMTsKK30KKworc3RhdGljIGludCBpdnR2X2dldHNkYV9vbGQodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaXZ0diAqaXR2ID0gKHN0cnVjdCBpdnR2ICopZGF0YTsKKworCXJldHVybiByZWFkX3JlZyhJVlRWX1JFR19JMkNfR0VUU0RBX09GRlNFVCkgJiAxOworfQorCisvKiB0ZW1wbGF0ZSBmb3IgaTJjLWJpdC1hbGdvICovCitzdGF0aWMgc3RydWN0IGkyY19hZGFwdGVyIGl2dHZfaTJjX2FkYXBfdGVtcGxhdGUgPSB7CisJLm5hbWUgPSAiaXZ0diBpMmMgZHJpdmVyIiwKKwkuaWQgPSBJMkNfSFdfQl9DWDIzNDFYLCAgCS8qIGFsZ28tYml0IGlzIE9SJ2Qgd2l0aCB0aGlzICovCisJLmFsZ28gPSBOVUxMLCAgICAgICAgICAgICAgICAgICAvKiBzZXQgYnkgaTJjLWFsZ28tYml0ICovCisJLmFsZ29fZGF0YSA9IE5VTEwsICAgICAgICAgICAgICAvKiBmaWxsZWQgZnJvbSB0ZW1wbGF0ZSAqLworCS5jbGllbnRfcmVnaXN0ZXIgPSBhdHRhY2hfaW5mb3JtLAorCS5jbGllbnRfdW5yZWdpc3RlciA9IGRldGFjaF9pbmZvcm0sCisJLm93bmVyID0gVEhJU19NT0RVTEUsCisjaWZkZWYgSTJDX0FEQVBfQ0xBU1NfVFZfQU5BTE9HCisJLmNsYXNzID0gSTJDX0FEQVBfQ0xBU1NfVFZfQU5BTE9HLAorI2VuZGlmCit9OworCitzdGF0aWMgc3RydWN0IGkyY19hbGdvX2JpdF9kYXRhIGl2dHZfaTJjX2FsZ29fdGVtcGxhdGUgPSB7CisJTlVMTCwgICAgICAgICAgICAgICAgICAgLyogPz8gKi8KKwlpdnR2X3NldHNkYV9vbGQsICAgICAgICAvKiBzZXRzZGEgZnVuY3Rpb24gKi8KKwlpdnR2X3NldHNjbF9vbGQsICAgICAgICAvKiAiICovCisJaXZ0dl9nZXRzZGFfb2xkLCAgICAgICAgLyogIiAqLworCWl2dHZfZ2V0c2NsX29sZCwgICAgICAgIC8qICIgKi8KKwkxMCwgICAgICAgICAgICAgICAgICAgICAvKiB1ZGVsYXkgKi8KKwkyMDAgICAgICAgICAgICAgICAgICAgICAvKiB0aW1lb3V0ICovCit9OworCitzdGF0aWMgc3RydWN0IGkyY19jbGllbnQgaXZ0dl9pMmNfY2xpZW50X3RlbXBsYXRlID0geworCS5uYW1lID0gIml2dHYgaW50ZXJuYWwiLAorfTsKKworaW50IGl2dHZfY2FsbF9pMmNfY2xpZW50KHN0cnVjdCBpdnR2ICppdHYsIGludCBhZGRyLCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKKwlpbnQgcmV0dmFsOworCWludCBpOworCisJSVZUVl9ERUJVR19JMkMoImNhbGxfaTJjX2NsaWVudCBhZGRyPSUwMnhcbiIsIGFkZHIpOworCWZvciAoaSA9IDA7IGkgPCBJMkNfQ0xJRU5UU19NQVg7IGkrKykgeworCQljbGllbnQgPSBpdHYtPmkyY19jbGllbnRzW2ldOworCQlpZiAoY2xpZW50ID09IE5VTEwpIHsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChjbGllbnQtPmRyaXZlci0+Y29tbWFuZCA9PSBOVUxMKSB7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoYWRkciA9PSBjbGllbnQtPmFkZHIpIHsKKwkJCXJldHZhbCA9IGNsaWVudC0+ZHJpdmVyLT5jb21tYW5kKGNsaWVudCwgY21kLCBhcmcpOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCX0KKwlpZiAoY21kICE9IFZJRElPQ19HX0NISVBfSURFTlQpCisJCUlWVFZfRVJSKCJpMmMgYWRkciAweCUwMnggbm90IGZvdW5kIGZvciBjb21tYW5kIDB4JXghXG4iLCBhZGRyLCBjbWQpOworCXJldHVybiAtRU5PREVWOworfQorCisvKiBGaW5kIHRoZSBpMmMgZGV2aWNlIGJhc2VkIG9uIHRoZSBkcml2ZXIgSUQgYW5kIHJldHVybgorICAgaXRzIGkyYyBhZGRyZXNzIG9yIC1FTk9ERVYgaWYgbm8gbWF0Y2hpbmcgZGV2aWNlIHdhcyBmb3VuZC4gKi8KK3N0YXRpYyBpbnQgaXZ0dl9pMmNfaWRfYWRkcihzdHJ1Y3QgaXZ0diAqaXR2LCB1MzIgaWQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKKwlpbnQgcmV0dmFsID0gLUVOT0RFVjsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBJMkNfQ0xJRU5UU19NQVg7IGkrKykgeworCQljbGllbnQgPSBpdHYtPmkyY19jbGllbnRzW2ldOworCQlpZiAoY2xpZW50ID09IE5VTEwpCisJCQljb250aW51ZTsKKwkJaWYgKGlkID09IGNsaWVudC0+ZHJpdmVyLT5pZCkgeworCQkJcmV0dmFsID0gY2xpZW50LT5hZGRyOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIHJldHZhbDsKK30KKworLyogRmluZCB0aGUgaTJjIGRldmljZSBuYW1lIG1hdGNoaW5nIHRoZSBEUklWRVJJRCAqLworc3RhdGljIGNvbnN0IGNoYXIgKml2dHZfaTJjX2lkX25hbWUodTMyIGlkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaHdfZHJpdmVyaWRzKTsgaSsrKQorCQlpZiAoaHdfZHJpdmVyaWRzW2ldID09IGlkKQorCQkJcmV0dXJuIGh3X2RyaXZlcm5hbWVzW2ldOworCXJldHVybiAidW5rbm93biBkZXZpY2UiOworfQorCisvKiBGaW5kIHRoZSBpMmMgZGV2aWNlIG5hbWUgbWF0Y2hpbmcgdGhlIElWVFZfSFdfIGZsYWcgKi8KK3N0YXRpYyBjb25zdCBjaGFyICppdnR2X2kyY19od19uYW1lKHUzMiBodykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGh3X2RyaXZlcmlkcyk7IGkrKykKKwkJaWYgKDEgPDwgaSA9PSBodykKKwkJCXJldHVybiBod19kcml2ZXJuYW1lc1tpXTsKKwlyZXR1cm4gInVua25vd24gZGV2aWNlIjsKK30KKworLyogRmluZCB0aGUgaTJjIGRldmljZSBtYXRjaGluZyB0aGUgSVZUVl9IV18gZmxhZyBhbmQgcmV0dXJuCisgICBpdHMgaTJjIGFkZHJlc3Mgb3IgLUVOT0RFViBpZiBubyBtYXRjaGluZyBkZXZpY2Ugd2FzIGZvdW5kLiAqLworaW50IGl2dHZfaTJjX2h3X2FkZHIoc3RydWN0IGl2dHYgKml0diwgdTMyIGh3KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaHdfZHJpdmVyaWRzKTsgaSsrKQorCQlpZiAoMSA8PCBpID09IGh3KQorCQkJcmV0dXJuIGl2dHZfaTJjX2lkX2FkZHIoaXR2LCBod19kcml2ZXJpZHNbaV0pOworCXJldHVybiAtRU5PREVWOworfQorCisvKiBDYWxscyBpMmMgZGV2aWNlIGJhc2VkIG9uIElWVFZfSFdfIGZsYWcuIElmIGh3ID09IDAsIHRoZW4gZG8gbm90aGluZy4KKyAgIElmIGh3ID09IElWVFZfSFdfR1BJTyB0aGVuIGNhbGwgdGhlIGdwaW8gaGFuZGxlci4gKi8KK2ludCBpdnR2X2kyY19odyhzdHJ1Y3QgaXZ0diAqaXR2LCB1MzIgaHcsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKK3sKKwlpbnQgYWRkcjsKKworCWlmIChodyA9PSBJVlRWX0hXX0dQSU8pCisJCXJldHVybiBpdnR2X2dwaW8oaXR2LCBjbWQsIGFyZyk7CisJaWYgKGh3ID09IDApCisJCXJldHVybiAwOworCisJYWRkciA9IGl2dHZfaTJjX2h3X2FkZHIoaXR2LCBodyk7CisJaWYgKGFkZHIgPCAwKSB7CisJCUlWVFZfRVJSKCJpMmMgaGFyZHdhcmUgMHglMDh4ICglcykgbm90IGZvdW5kIGZvciBjb21tYW5kIDB4JXghXG4iLAorCQkJICAgICAgIGh3LCBpdnR2X2kyY19od19uYW1lKGh3KSwgY21kKTsKKwkJcmV0dXJuIGFkZHI7CisJfQorCXJldHVybiBpdnR2X2NhbGxfaTJjX2NsaWVudChpdHYsIGFkZHIsIGNtZCwgYXJnKTsKK30KKworLyogQ2FsbHMgaTJjIGRldmljZSBiYXNlZCBvbiBJMkMgZHJpdmVyIElELiAqLworaW50IGl2dHZfaTJjX2lkKHN0cnVjdCBpdnR2ICppdHYsIHUzMiBpZCwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQoreworCWludCBhZGRyOworCisJYWRkciA9IGl2dHZfaTJjX2lkX2FkZHIoaXR2LCBpZCk7CisJaWYgKGFkZHIgPCAwKSB7CisJCWlmIChjbWQgIT0gVklESU9DX0dfQ0hJUF9JREVOVCkKKwkJCUlWVFZfRVJSKCJpMmMgSUQgMHglMDh4ICglcykgbm90IGZvdW5kIGZvciBjb21tYW5kIDB4JXghXG4iLAorCQkJCWlkLCBpdnR2X2kyY19pZF9uYW1lKGlkKSwgY21kKTsKKwkJcmV0dXJuIGFkZHI7CisJfQorCXJldHVybiBpdnR2X2NhbGxfaTJjX2NsaWVudChpdHYsIGFkZHIsIGNtZCwgYXJnKTsKK30KKworaW50IGl2dHZfY3gyNTg0MChzdHJ1Y3QgaXZ0diAqaXR2LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCit7CisJcmV0dXJuIGl2dHZfY2FsbF9pMmNfY2xpZW50KGl0diwgSVZUVl9DWDI1ODQwX0kyQ19BRERSLCBjbWQsIGFyZyk7Cit9CisKK2ludCBpdnR2X3NhYTcxMTUoc3RydWN0IGl2dHYgKml0diwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQoreworCXJldHVybiBpdnR2X2NhbGxfaTJjX2NsaWVudChpdHYsIElWVFZfU0FBNzExNV9JMkNfQUREUiwgY21kLCBhcmcpOworfQorCitpbnQgaXZ0dl9zYWE3MTI3KHN0cnVjdCBpdnR2ICppdHYsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKK3sKKwlyZXR1cm4gaXZ0dl9jYWxsX2kyY19jbGllbnQoaXR2LCBJVlRWX1NBQTcxMjdfSTJDX0FERFIsIGNtZCwgYXJnKTsKK30KKworaW50IGl2dHZfc2FhNzE3eChzdHJ1Y3QgaXZ0diAqaXR2LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCit7CisJcmV0dXJuIGl2dHZfY2FsbF9pMmNfY2xpZW50KGl0diwgSVZUVl9TQUE3MTd4X0kyQ19BRERSLCBjbWQsIGFyZyk7Cit9CisKK2ludCBpdnR2X3VwZDY0MDMxYShzdHJ1Y3QgaXZ0diAqaXR2LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCit7CisJcmV0dXJuIGl2dHZfY2FsbF9pMmNfY2xpZW50KGl0diwgSVZUVl9VUEQ2NDAzMUFfSTJDX0FERFIsIGNtZCwgYXJnKTsKK30KKworaW50IGl2dHZfdXBkNjQwODMoc3RydWN0IGl2dHYgKml0diwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQoreworCXJldHVybiBpdnR2X2NhbGxfaTJjX2NsaWVudChpdHYsIElWVFZfVVBENjQwODNfSTJDX0FERFIsIGNtZCwgYXJnKTsKK30KKworLyogYnJvYWRjYXN0IGNtZCBmb3IgYWxsIEkyQyBjbGllbnRzIGFuZCBmb3IgdGhlIGdwaW8gc3Vic3lzdGVtICovCit2b2lkIGl2dHZfY2FsbF9pMmNfY2xpZW50cyhzdHJ1Y3QgaXZ0diAqaXR2LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCit7CisJaWYgKGl0di0+aTJjX2FkYXAuYWxnbyA9PSBOVUxMKSB7CisJCUlWVFZfRVJSKCJhZGFwdGVyIGlzIG5vdCBzZXQiKTsKKwkJcmV0dXJuOworCX0KKwlpMmNfY2xpZW50c19jb21tYW5kKCZpdHYtPmkyY19hZGFwLCBjbWQsIGFyZyk7CisJaWYgKGl0di0+aHdfZmxhZ3MgJiBJVlRWX0hXX0dQSU8pCisJCWl2dHZfZ3BpbyhpdHYsIGNtZCwgYXJnKTsKK30KKworLyogaW5pdCArIHJlZ2lzdGVyIGkyYyBhbGdvLWJpdCBhZGFwdGVyICovCitpbnQgX19kZXZpbml0IGluaXRfaXZ0dl9pMmMoc3RydWN0IGl2dHYgKml0dikKK3sKKwlJVlRWX0RFQlVHX0kyQygiaTJjIGluaXRcbiIpOworCisJaWYgKGl0di0+b3B0aW9ucy5uZXdpMmMgPiAwKSB7CisJCW1lbWNweSgmaXR2LT5pMmNfYWRhcCwgJml2dHZfaTJjX2FkYXBfaHdfdGVtcGxhdGUsCisJCSAgICAgICBzaXplb2Yoc3RydWN0IGkyY19hZGFwdGVyKSk7CisJfSBlbHNlIHsKKwkJbWVtY3B5KCZpdHYtPmkyY19hZGFwLCAmaXZ0dl9pMmNfYWRhcF90ZW1wbGF0ZSwKKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgaTJjX2FkYXB0ZXIpKTsKKwkJbWVtY3B5KCZpdHYtPmkyY19hbGdvLCAmaXZ0dl9pMmNfYWxnb190ZW1wbGF0ZSwKKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgaTJjX2FsZ29fYml0X2RhdGEpKTsKKwkJaXR2LT5pMmNfYWxnby5kYXRhID0gaXR2OworCQlpdHYtPmkyY19hZGFwLmFsZ29fZGF0YSA9ICZpdHYtPmkyY19hbGdvOworCX0KKworCXNwcmludGYoaXR2LT5pMmNfYWRhcC5uYW1lICsgc3RybGVuKGl0di0+aTJjX2FkYXAubmFtZSksICIgIyVkIiwKKwkJaXR2LT5udW0pOworCWkyY19zZXRfYWRhcGRhdGEoJml0di0+aTJjX2FkYXAsIGl0dik7CisKKwltZW1jcHkoJml0di0+aTJjX2NsaWVudCwgJml2dHZfaTJjX2NsaWVudF90ZW1wbGF0ZSwKKwkgICAgICAgc2l6ZW9mKHN0cnVjdCBpMmNfY2xpZW50KSk7CisJaXR2LT5pMmNfY2xpZW50LmFkYXB0ZXIgPSAmaXR2LT5pMmNfYWRhcDsKKwlpdHYtPmkyY19hZGFwLmRldi5wYXJlbnQgPSAmaXR2LT5kZXYtPmRldjsKKworCUlWVFZfREVCVUdfSTJDKCJzZXR0aW5nIHNjbCBhbmQgc2RhIHRvIDFcbiIpOworCWl2dHZfc2V0c2NsKGl0diwgMSk7CisJaXZ0dl9zZXRzZGEoaXR2LCAxKTsKKworCWlmIChpdHYtPm9wdGlvbnMubmV3aTJjID4gMCkKKwkJcmV0dXJuIGkyY19hZGRfYWRhcHRlcigmaXR2LT5pMmNfYWRhcCk7CisJZWxzZQorCQlyZXR1cm4gaTJjX2JpdF9hZGRfYnVzKCZpdHYtPmkyY19hZGFwKTsKK30KKwordm9pZCBfX2RldmV4aXQgZXhpdF9pdnR2X2kyYyhzdHJ1Y3QgaXZ0diAqaXR2KQoreworCUlWVFZfREVCVUdfSTJDKCJpMmMgZXhpdFxuIik7CisKKwlpMmNfZGVsX2FkYXB0ZXIoJml0di0+aTJjX2FkYXApOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtaTJjLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1pMmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDIxMGFkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtaTJjLmgKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAgICBJMkMgZnVuY3Rpb25zCisgICAgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDQgIEtldmluIFRoYXllciA8bnVmYW5fd2ZrIGF0IHlhaG9vLmNvbT4KKyAgICBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNyAgSGFucyBWZXJrdWlsIDxodmVya3VpbEB4czRhbGwubmw+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworaW50IGl2dHZfY3gyNTg0MChzdHJ1Y3QgaXZ0diAqaXR2LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpOworaW50IGl2dHZfc2FhNzExNShzdHJ1Y3QgaXZ0diAqaXR2LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpOworaW50IGl2dHZfc2FhNzEyNyhzdHJ1Y3QgaXZ0diAqaXR2LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpOworaW50IGl2dHZfc2FhNzE3eChzdHJ1Y3QgaXZ0diAqaXR2LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpOworaW50IGl2dHZfdXBkNjQwMzFhKHN0cnVjdCBpdnR2ICppdHYsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZyk7CitpbnQgaXZ0dl91cGQ2NDA4MyhzdHJ1Y3QgaXZ0diAqaXR2LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpOworCitpbnQgaXZ0dl9pMmNfaHdfYWRkcihzdHJ1Y3QgaXZ0diAqaXR2LCB1MzIgaHcpOworaW50IGl2dHZfaTJjX2h3KHN0cnVjdCBpdnR2ICppdHYsIHUzMiBodywgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKTsKK2ludCBpdnR2X2kyY19pZChzdHJ1Y3QgaXZ0diAqaXR2LCB1MzIgaWQsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZyk7CitpbnQgaXZ0dl9jYWxsX2kyY19jbGllbnQoc3RydWN0IGl2dHYgKml0diwgaW50IGFkZHIsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZyk7Cit2b2lkIGl2dHZfY2FsbF9pMmNfY2xpZW50cyhzdHJ1Y3QgaXZ0diAqaXR2LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpOworCisvKiBpbml0ICsgcmVnaXN0ZXIgaTJjIGFsZ28tYml0IGFkYXB0ZXIgKi8KK2ludCBfX2RldmluaXQgaW5pdF9pdnR2X2kyYyhzdHJ1Y3QgaXZ0diAqaXR2KTsKK3ZvaWQgX19kZXZleGl0IGV4aXRfaXZ0dl9pMmMoc3RydWN0IGl2dHYgKml0dik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1pb2N0bC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtaW9jdGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTRhNmEwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtaW9jdGwuYwpAQCAtMCwwICsxLDE1NjcgQEAKKy8qCisgICAgaW9jdGwgc3lzdGVtIGNhbGwKKyAgICBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNCAgS2V2aW4gVGhheWVyIDxudWZhbl93ZmsgYXQgeWFob28uY29tPgorICAgIENvcHlyaWdodCAoQykgMjAwNS0yMDA3ICBIYW5zIFZlcmt1aWwgPGh2ZXJrdWlsQHhzNGFsbC5ubD4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSAiaXZ0di1kcml2ZXIuaCIKKyNpbmNsdWRlICJpdnR2LXZlcnNpb24uaCIKKyNpbmNsdWRlICJpdnR2LW1haWxib3guaCIKKyNpbmNsdWRlICJpdnR2LWkyYy5oIgorI2luY2x1ZGUgIml2dHYtcXVldWUuaCIKKyNpbmNsdWRlICJpdnR2LWZpbGVvcHMuaCIKKyNpbmNsdWRlICJpdnR2LXZiaS5oIgorI2luY2x1ZGUgIml2dHYtYXVkaW8uaCIKKyNpbmNsdWRlICJpdnR2LXZpZGVvLmgiCisjaW5jbHVkZSAiaXZ0di1zdHJlYW1zLmgiCisjaW5jbHVkZSAiaXZ0di15dXYuaCIKKyNpbmNsdWRlICJpdnR2LWlvY3RsLmgiCisjaW5jbHVkZSAiaXZ0di1ncGlvLmgiCisjaW5jbHVkZSAiaXZ0di1jb250cm9scy5oIgorI2luY2x1ZGUgIml2dHYtY2FyZHMuaCIKKyNpbmNsdWRlIDxtZWRpYS9zYWE3MTI3Lmg+CisjaW5jbHVkZSA8bWVkaWEvdHZlZXByb20uaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNoaXAtaWRlbnQuaD4KKyNpbmNsdWRlIDxsaW51eC9kdmIvYXVkaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMtaWQuaD4KKwordTE2IHNlcnZpY2UydmJpKGludCB0eXBlKQoreworCXN3aXRjaCAodHlwZSkgeworCQljYXNlIFY0TDJfU0xJQ0VEX1RFTEVURVhUX0I6CisJCQlyZXR1cm4gSVZUVl9TTElDRURfVFlQRV9URUxFVEVYVF9COworCQljYXNlIFY0TDJfU0xJQ0VEX0NBUFRJT05fNTI1OgorCQkJcmV0dXJuIElWVFZfU0xJQ0VEX1RZUEVfQ0FQVElPTl81MjU7CisJCWNhc2UgVjRMMl9TTElDRURfV1NTXzYyNToKKwkJCXJldHVybiBJVlRWX1NMSUNFRF9UWVBFX1dTU182MjU7CisJCWNhc2UgVjRMMl9TTElDRURfVlBTOgorCQkJcmV0dXJuIElWVFZfU0xJQ0VEX1RZUEVfVlBTOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIDA7CisJfQorfQorCitzdGF0aWMgaW50IHZhbGlkX3NlcnZpY2VfbGluZShpbnQgZmllbGQsIGludCBsaW5lLCBpbnQgaXNfcGFsKQoreworCXJldHVybiAoaXNfcGFsICYmIGxpbmUgPj0gNiAmJiAobGluZSAhPSAyMyB8fCBmaWVsZCA9PSAwKSkgfHwKKwkgICAgICAgKCFpc19wYWwgJiYgbGluZSA+PSAxMCAmJiBsaW5lIDwgMjIpOworfQorCitzdGF0aWMgdTE2IHNlbGVjdF9zZXJ2aWNlX2Zyb21fc2V0KGludCBmaWVsZCwgaW50IGxpbmUsIHUxNiBzZXQsIGludCBpc19wYWwpCit7CisJdTE2IHZhbGlkX3NldCA9IChpc19wYWwgPyBWNEwyX1NMSUNFRF9WQklfNjI1IDogVjRMMl9TTElDRURfVkJJXzUyNSk7CisJaW50IGk7CisKKwlzZXQgPSBzZXQgJiB2YWxpZF9zZXQ7CisJaWYgKHNldCA9PSAwIHx8ICF2YWxpZF9zZXJ2aWNlX2xpbmUoZmllbGQsIGxpbmUsIGlzX3BhbCkpIHsKKwkJcmV0dXJuIDA7CisJfQorCWlmICghaXNfcGFsKSB7CisJCWlmIChsaW5lID09IDIxICYmIChzZXQgJiBWNEwyX1NMSUNFRF9DQVBUSU9OXzUyNSkpCisJCQlyZXR1cm4gVjRMMl9TTElDRURfQ0FQVElPTl81MjU7CisJfQorCWVsc2UgeworCQlpZiAobGluZSA9PSAxNiAmJiBmaWVsZCA9PSAwICYmIChzZXQgJiBWNEwyX1NMSUNFRF9WUFMpKQorCQkJcmV0dXJuIFY0TDJfU0xJQ0VEX1ZQUzsKKwkJaWYgKGxpbmUgPT0gMjMgJiYgZmllbGQgPT0gMCAmJiAoc2V0ICYgVjRMMl9TTElDRURfV1NTXzYyNSkpCisJCQlyZXR1cm4gVjRMMl9TTElDRURfV1NTXzYyNTsKKwkJaWYgKGxpbmUgPT0gMjMpCisJCQlyZXR1cm4gMDsKKwl9CisJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHsKKwkJaWYgKCgxIDw8IGkpICYgc2V0KQorCQkJcmV0dXJuIDEgPDwgaTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgZXhwYW5kX3NlcnZpY2Vfc2V0KHN0cnVjdCB2NGwyX3NsaWNlZF92YmlfZm9ybWF0ICpmbXQsIGludCBpc19wYWwpCit7CisJdTE2IHNldCA9IGZtdC0+c2VydmljZV9zZXQ7CisJaW50IGYsIGw7CisKKwlmbXQtPnNlcnZpY2Vfc2V0ID0gMDsKKwlmb3IgKGYgPSAwOyBmIDwgMjsgZisrKSB7CisJCWZvciAobCA9IDA7IGwgPCAyNDsgbCsrKSB7CisJCQlmbXQtPnNlcnZpY2VfbGluZXNbZl1bbF0gPSBzZWxlY3Rfc2VydmljZV9mcm9tX3NldChmLCBsLCBzZXQsIGlzX3BhbCk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfc2VydmljZV9zZXQoc3RydWN0IHY0bDJfc2xpY2VkX3ZiaV9mb3JtYXQgKmZtdCwgaW50IGlzX3BhbCkKK3sKKwlpbnQgZiwgbDsKKwl1MTYgc2V0ID0gMDsKKworCWZvciAoZiA9IDA7IGYgPCAyOyBmKyspIHsKKwkJZm9yIChsID0gMDsgbCA8IDI0OyBsKyspIHsKKwkJCWZtdC0+c2VydmljZV9saW5lc1tmXVtsXSA9IHNlbGVjdF9zZXJ2aWNlX2Zyb21fc2V0KGYsIGwsIGZtdC0+c2VydmljZV9saW5lc1tmXVtsXSwgaXNfcGFsKTsKKwkJCXNldCB8PSBmbXQtPnNlcnZpY2VfbGluZXNbZl1bbF07CisJCX0KKwl9CisJcmV0dXJuIHNldCAhPSAwOworfQorCit1MTYgZ2V0X3NlcnZpY2Vfc2V0KHN0cnVjdCB2NGwyX3NsaWNlZF92YmlfZm9ybWF0ICpmbXQpCit7CisJaW50IGYsIGw7CisJdTE2IHNldCA9IDA7CisKKwlmb3IgKGYgPSAwOyBmIDwgMjsgZisrKSB7CisJCWZvciAobCA9IDA7IGwgPCAyNDsgbCsrKSB7CisJCQlzZXQgfD0gZm10LT5zZXJ2aWNlX2xpbmVzW2ZdW2xdOworCQl9CisJfQorCXJldHVybiBzZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworCXY0bDJfc3RkX2lkICBzdGQ7CisJY2hhciAgICAgICAgKm5hbWU7Cit9IGVudW1fc3Rkc1tdID0geworCXsgVjRMMl9TVERfUEFMX0JHIHwgVjRMMl9TVERfUEFMX0gsICJQQUwtQkdIIiB9LAorCXsgVjRMMl9TVERfUEFMX0RLLCAgICAiUEFMLURLIiAgICB9LAorCXsgVjRMMl9TVERfUEFMX0ksICAgICAiUEFMLUkiICAgICB9LAorCXsgVjRMMl9TVERfUEFMX00sICAgICAiUEFMLU0iICAgICB9LAorCXsgVjRMMl9TVERfUEFMX04sICAgICAiUEFMLU4iICAgICB9LAorCXsgVjRMMl9TVERfUEFMX05jLCAgICAiUEFMLU5jIiAgICB9LAorCXsgVjRMMl9TVERfU0VDQU1fQiB8IFY0TDJfU1REX1NFQ0FNX0cgfCBWNEwyX1NURF9TRUNBTV9ILCAiU0VDQU0tQkdIIiB9LAorCXsgVjRMMl9TVERfU0VDQU1fREssICAiU0VDQU0tREsiICB9LAorCXsgVjRMMl9TVERfU0VDQU1fTCwgICAiU0VDQU0tTCIgICB9LAorCXsgVjRMMl9TVERfU0VDQU1fTEMsICAiU0VDQU0tTCciICB9LAorCXsgVjRMMl9TVERfTlRTQ19NLCAgICAiTlRTQy1NIiAgICB9LAorCXsgVjRMMl9TVERfTlRTQ19NX0pQLCAiTlRTQy1KIiAgICB9LAorCXsgVjRMMl9TVERfTlRTQ19NX0tSLCAiTlRTQy1LIiAgICB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N0YW5kYXJkIGl2dHZfc3RkXzYwaHogPQoreworCS5mcmFtZXBlcmlvZCA9IHsubnVtZXJhdG9yID0gMTAwMSwgLmRlbm9taW5hdG9yID0gMzAwMDB9LAorCS5mcmFtZWxpbmVzID0gNTI1LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N0YW5kYXJkIGl2dHZfc3RkXzUwaHogPQoreworCS5mcmFtZXBlcmlvZCA9IHsubnVtZXJhdG9yID0gMSwgLmRlbm9taW5hdG9yID0gMjV9LAorCS5mcmFtZWxpbmVzID0gNjI1LAorfTsKKwordm9pZCBpdnR2X3NldF9vc2RfYWxwaGEoc3RydWN0IGl2dHYgKml0dikKK3sKKwlpdnR2X3ZhcGkoaXR2LCBDWDIzNDFYX09TRF9TRVRfR0xPQkFMX0FMUEhBLCAzLAorCQlpdHYtPm9zZF9nbG9iYWxfYWxwaGFfc3RhdGUsIGl0di0+b3NkX2dsb2JhbF9hbHBoYSwgIWl0di0+b3NkX2xvY2FsX2FscGhhX3N0YXRlKTsKKwlpdnR2X3ZhcGkoaXR2LCBDWDIzNDFYX09TRF9TRVRfQ0hST01BX0tFWSwgMiwgaXR2LT5vc2RfY29sb3Jfa2V5X3N0YXRlLCBpdHYtPm9zZF9jb2xvcl9rZXkpOworfQorCitpbnQgaXZ0dl9zZXRfc3BlZWQoc3RydWN0IGl2dHYgKml0diwgaW50IHNwZWVkKQoreworCXUzMiBkYXRhW0NYMjM0MVhfTUJPWF9NQVhfREFUQV07CisJc3RydWN0IGl2dHZfc3RyZWFtICpzOworCWludCBzaW5nbGVfc3RlcCA9IChzcGVlZCA9PSAxIHx8IHNwZWVkID09IC0xKTsKKwlERUZJTkVfV0FJVCh3YWl0KTsKKworCWlmIChzcGVlZCA9PSAwKSBzcGVlZCA9IDEwMDA7CisKKwkvKiBObyBjaGFuZ2U/ICovCisJaWYgKHNwZWVkID09IGl0di0+c3BlZWQgJiYgIXNpbmdsZV9zdGVwKQorCQlyZXR1cm4gMDsKKworCXMgPSAmaXR2LT5zdHJlYW1zW0lWVFZfREVDX1NUUkVBTV9UWVBFX01QR107CisKKwlpZiAoc2luZ2xlX3N0ZXAgJiYgKHNwZWVkIDwgMCkgPT0gKGl0di0+c3BlZWQgPCAwKSkgeworCQkvKiBTaW5nbGUgc3RlcCB2aWRlbyBhbmQgbm8gbmVlZCB0byBjaGFuZ2UgZGlyZWN0aW9uICovCisJCWl2dHZfdmFwaShpdHYsIENYMjM0MVhfREVDX1NURVBfVklERU8sIDEsIDApOworCQlpdHYtPnNwZWVkID0gc3BlZWQ7CisJCXJldHVybiAwOworCX0KKwlpZiAoc2luZ2xlX3N0ZXApCisJCS8qIE5lZWQgdG8gY2hhbmdlIGRpcmVjdGlvbiAqLworCQlzcGVlZCA9IHNwZWVkIDwgMCA/IC0xMDAwIDogMTAwMDsKKworCWRhdGFbMF0gPSAoc3BlZWQgPiAxMDAwIHx8IHNwZWVkIDwgLTEwMDApID8gMHg4MDAwMDAwMCA6IDA7CisJZGF0YVswXSB8PSAoc3BlZWQgPiAxMDAwIHx8IHNwZWVkIDwgLTE1MDApID8gMHg0MDAwMDAwMCA6IDA7CisJZGF0YVsxXSA9IChzcGVlZCA8IDApOworCWRhdGFbMl0gPSBzcGVlZCA8IDAgPyAzIDogNzsKKwlkYXRhWzNdID0gaXR2LT5wYXJhbXMudmlkZW9fYl9mcmFtZXM7CisJZGF0YVs0XSA9IChzcGVlZCA9PSAxNTAwIHx8IHNwZWVkID09IDUwMCkgPyBpdHYtPnNwZWVkX211dGVfYXVkaW8gOiAwOworCWRhdGFbNV0gPSAwOworCWRhdGFbNl0gPSAwOworCisJaWYgKHNwZWVkID09IDE1MDAgfHwgc3BlZWQgPT0gLTE1MDApIGRhdGFbMF0gfD0gMTsKKwllbHNlIGlmIChzcGVlZCA9PSAyMDAwIHx8IHNwZWVkID09IC0yMDAwKSBkYXRhWzBdIHw9IDI7CisJZWxzZSBpZiAoc3BlZWQgPiAtMTAwMCAmJiBzcGVlZCA8IDApIGRhdGFbMF0gfD0gKC0xMDAwIC8gc3BlZWQpOworCWVsc2UgaWYgKHNwZWVkIDwgMTAwMCAmJiBzcGVlZCA+IDApIGRhdGFbMF0gfD0gKDEwMDAgLyBzcGVlZCk7CisKKwkvKiBJZiBub3QgZGVjb2RpbmcsIGp1c3QgY2hhbmdlIHNwZWVkIHNldHRpbmcgKi8KKwlpZiAoYXRvbWljX3JlYWQoJml0di0+ZGVjb2RpbmcpID4gMCkgeworCQlpbnQgZ290X3NpZyA9IDA7CisKKwkJLyogU3RvcCBhbGwgRE1BIGFuZCBkZWNvZGluZyBhY3Rpdml0eSAqLworCQlpdnR2X3ZhcGkoaXR2LCBDWDIzNDFYX0RFQ19QQVVTRV9QTEFZQkFDSywgMSwgMCk7CisKKwkJLyogV2FpdCBmb3IgYW55IERNQSB0byBmaW5pc2ggKi8KKwkJcHJlcGFyZV90b193YWl0KCZpdHYtPmRtYV93YWl0cSwgJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXdoaWxlIChpdHYtPmlfZmxhZ3MgJiBJVlRWX0ZfSV9ETUEpIHsKKwkJCWdvdF9zaWcgPSBzaWduYWxfcGVuZGluZyhjdXJyZW50KTsKKwkJCWlmIChnb3Rfc2lnKQorCQkJCWJyZWFrOworCQkJZ290X3NpZyA9IDA7CisJCQlzY2hlZHVsZSgpOworCQl9CisJCWZpbmlzaF93YWl0KCZpdHYtPmRtYV93YWl0cSwgJndhaXQpOworCQlpZiAoZ290X3NpZykKKwkJCXJldHVybiAtRUlOVFI7CisKKwkJLyogQ2hhbmdlIFNwZWVkIHNhZmVseSAqLworCQlpdnR2X2FwaShpdHYsIENYMjM0MVhfREVDX1NFVF9QTEFZQkFDS19TUEVFRCwgNywgZGF0YSk7CisJCUlWVFZfREVCVUdfSU5GTygiU2V0dGluZyBTcGVlZCB0byAweCUwOHggMHglMDh4IDB4JTA4eCAweCUwOHggMHglMDh4IDB4JTA4eCAweCUwOHhcbiIsCisJCQkJZGF0YVswXSwgZGF0YVsxXSwgZGF0YVsyXSwgZGF0YVszXSwgZGF0YVs0XSwgZGF0YVs1XSwgZGF0YVs2XSk7CisJfQorCWlmIChzaW5nbGVfc3RlcCkgeworCQlzcGVlZCA9IChzcGVlZCA8IDApID8gLTEgOiAxOworCQlpdnR2X3ZhcGkoaXR2LCBDWDIzNDFYX0RFQ19TVEVQX1ZJREVPLCAxLCAwKTsKKwl9CisJaXR2LT5zcGVlZCA9IHNwZWVkOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGl2dHZfdmFsaWRhdGVfc3BlZWQoaW50IGN1cl9zcGVlZCwgaW50IG5ld19zcGVlZCkKK3sKKwlpbnQgZmFjdCA9IG5ld19zcGVlZCA8IDAgPyAtMSA6IDE7CisJaW50IHM7CisKKwlpZiAobmV3X3NwZWVkIDwgMCkgbmV3X3NwZWVkID0gLW5ld19zcGVlZDsKKwlpZiAoY3VyX3NwZWVkIDwgMCkgY3VyX3NwZWVkID0gLWN1cl9zcGVlZDsKKworCWlmIChjdXJfc3BlZWQgPD0gbmV3X3NwZWVkKSB7CisJCWlmIChuZXdfc3BlZWQgPiAxNTAwKSByZXR1cm4gZmFjdCAqIDIwMDA7CisJCWlmIChuZXdfc3BlZWQgPiAxMDAwKSByZXR1cm4gZmFjdCAqIDE1MDA7CisJfQorCWVsc2UgeworCQlpZiAobmV3X3NwZWVkID49IDIwMDApIHJldHVybiBmYWN0ICogMjAwMDsKKwkJaWYgKG5ld19zcGVlZCA+PSAxNTAwKSByZXR1cm4gZmFjdCAqIDE1MDA7CisJCWlmIChuZXdfc3BlZWQgPj0gMTAwMCkgcmV0dXJuIGZhY3QgKiAxMDAwOworCX0KKwlpZiAobmV3X3NwZWVkID09IDApIHJldHVybiAxMDAwOworCWlmIChuZXdfc3BlZWQgPT0gMSB8fCBuZXdfc3BlZWQgPT0gMTAwMCkgcmV0dXJuIGZhY3QgKiBuZXdfc3BlZWQ7CisKKwlzID0gbmV3X3NwZWVkOworCW5ld19zcGVlZCA9IDEwMDAgLyBuZXdfc3BlZWQ7CisJaWYgKDEwMDAgLyBjdXJfc3BlZWQgPT0gbmV3X3NwZWVkKQorCQluZXdfc3BlZWQgKz0gKGN1cl9zcGVlZCA8IHMpID8gLTEgOiAxOworCWlmIChuZXdfc3BlZWQgPiA2MCkgcmV0dXJuIDEwMDAgLyAoZmFjdCAqIDYwKTsKKwlyZXR1cm4gMTAwMCAvIChmYWN0ICogbmV3X3NwZWVkKTsKK30KKworc3RhdGljIGludCBpdnR2X3ZpZGVvX2NvbW1hbmQoc3RydWN0IGl2dHYgKml0diwgc3RydWN0IGl2dHZfb3Blbl9pZCAqaWQsCisJCXN0cnVjdCB2aWRlb19jb21tYW5kICp2YywgaW50IHRyeSkKK3sKKwlzdHJ1Y3QgaXZ0dl9zdHJlYW0gKnMgPSAmaXR2LT5zdHJlYW1zW0lWVFZfREVDX1NUUkVBTV9UWVBFX01QR107CisKKwlpZiAoIShpdHYtPnY0bDJfY2FwICYgVjRMMl9DQVBfVklERU9fT1VUUFVUKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzd2l0Y2ggKHZjLT5jbWQpIHsKKwljYXNlIFZJREVPX0NNRF9QTEFZOiB7CisJCXZjLT5mbGFncyA9IDA7CisJCXZjLT5wbGF5LnNwZWVkID0gaXZ0dl92YWxpZGF0ZV9zcGVlZChpdHYtPnNwZWVkLCB2Yy0+cGxheS5zcGVlZCk7CisJCWlmICh2Yy0+cGxheS5zcGVlZCA8IDApCisJCQl2Yy0+cGxheS5mb3JtYXQgPSBWSURFT19QTEFZX0ZNVF9HT1A7CisJCWlmICh0cnkpIGJyZWFrOworCisJCWlmIChpdnR2X3NldF9vdXRwdXRfbW9kZShpdHYsIE9VVF9NUEcpICE9IE9VVF9NUEcpCisJCQlyZXR1cm4gLUVCVVNZOworCQlyZXR1cm4gaXZ0dl9zdGFydF9kZWNvZGluZyhpZCwgdmMtPnBsYXkuc3BlZWQpOworCX0KKworCWNhc2UgVklERU9fQ01EX1NUT1A6CisJCXZjLT5mbGFncyAmPSBWSURFT19DTURfU1RPUF9JTU1FRElBVEVMWXxWSURFT19DTURfU1RPUF9UT19CTEFDSzsKKwkJaWYgKHZjLT5mbGFncyAmIFZJREVPX0NNRF9TVE9QX0lNTUVESUFURUxZKQorCQkJdmMtPnN0b3AucHRzID0gMDsKKwkJaWYgKHRyeSkgYnJlYWs7CisJCWlmIChhdG9taWNfcmVhZCgmaXR2LT5kZWNvZGluZykgPT0gMCkKKwkJCXJldHVybiAwOworCQlpZiAoaXR2LT5vdXRwdXRfbW9kZSAhPSBPVVRfTVBHKQorCQkJcmV0dXJuIC1FQlVTWTsKKworCQlpdHYtPm91dHB1dF9tb2RlID0gT1VUX05PTkU7CisJCXJldHVybiBpdnR2X3N0b3BfdjRsMl9kZWNvZGVfc3RyZWFtKHMsIHZjLT5mbGFncywgdmMtPnN0b3AucHRzKTsKKworCWNhc2UgVklERU9fQ01EX0ZSRUVaRToKKwkJdmMtPmZsYWdzICY9IFZJREVPX0NNRF9GUkVFWkVfVE9fQkxBQ0s7CisJCWlmICh0cnkpIGJyZWFrOworCQlpZiAoaXR2LT5vdXRwdXRfbW9kZSAhPSBPVVRfTVBHKQorCQkJcmV0dXJuIC1FQlVTWTsKKwkJaWYgKGF0b21pY19yZWFkKCZpdHYtPmRlY29kaW5nKSA+IDApIHsKKwkJCWl2dHZfdmFwaShpdHYsIENYMjM0MVhfREVDX1BBVVNFX1BMQVlCQUNLLCAxLAorCQkJCSh2Yy0+ZmxhZ3MgJiBWSURFT19DTURfRlJFRVpFX1RPX0JMQUNLKSA/IDEgOiAwKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgVklERU9fQ01EX0NPTlRJTlVFOgorCQl2Yy0+ZmxhZ3MgPSAwOworCQlpZiAodHJ5KSBicmVhazsKKwkJaWYgKGl0di0+b3V0cHV0X21vZGUgIT0gT1VUX01QRykKKwkJCXJldHVybiAtRUJVU1k7CisJCWlmIChhdG9taWNfcmVhZCgmaXR2LT5kZWNvZGluZykgPiAwKSB7CisJCQlpdnR2X3ZhcGkoaXR2LCBDWDIzNDFYX0RFQ19TVEFSVF9QTEFZQkFDSywgMiwgMCwgMCk7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXZ0dl9pdHZjKHN0cnVjdCBpdnR2ICppdHYsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgdjRsMl9yZWdpc3RlciAqcmVncyA9IGFyZzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXZvbGF0aWxlIHU4IF9faW9tZW0gKnJlZ19zdGFydDsKKworCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJcmV0dXJuIC1FUEVSTTsKKwlpZiAocmVncy0+cmVnID49IElWVFZfUkVHX09GRlNFVCAmJiByZWdzLT5yZWcgPCBJVlRWX1JFR19PRkZTRVQgKyBJVlRWX1JFR19TSVpFKQorCQlyZWdfc3RhcnQgPSBpdHYtPnJlZ19tZW0gLSBJVlRWX1JFR19PRkZTRVQ7CisJZWxzZSBpZiAoaXR2LT5oYXNfY3gyMzQxNSAmJiByZWdzLT5yZWcgPj0gSVZUVl9ERUNPREVSX09GRlNFVCAmJgorCQkJcmVncy0+cmVnIDwgSVZUVl9ERUNPREVSX09GRlNFVCArIElWVFZfREVDT0RFUl9TSVpFKQorCQlyZWdfc3RhcnQgPSBpdHYtPmRlY19tZW0gLSBJVlRWX0RFQ09ERVJfT0ZGU0VUOworCWVsc2UgaWYgKHJlZ3MtPnJlZyA+PSAwICYmIHJlZ3MtPnJlZyA8IElWVFZfRU5DT0RFUl9TSVpFKQorCQlyZWdfc3RhcnQgPSBpdHYtPmVuY19tZW07CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpdnR2X2NhcmRzX2xvY2ssIGZsYWdzKTsKKwlpZiAoY21kID09IFZJRElPQ19EQkdfR19SRUdJU1RFUikgeworCQlyZWdzLT52YWwgPSByZWFkbChyZWdzLT5yZWcgKyByZWdfc3RhcnQpOworCX0gZWxzZSB7CisJCXdyaXRlbChyZWdzLT52YWwsIHJlZ3MtPnJlZyArIHJlZ19zdGFydCk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJml2dHZfY2FyZHNfbG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGl2dHZfZ2V0X2ZtdChzdHJ1Y3QgaXZ0diAqaXR2LCBpbnQgc3RyZWFtdHlwZSwgc3RydWN0IHY0bDJfZm9ybWF0ICpmbXQpCit7CisJc3dpdGNoIChmbXQtPnR5cGUpIHsKKwljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUOgorCQlpZiAoIShpdHYtPnY0bDJfY2FwICYgVjRMMl9DQVBfVklERU9fT1VUUFVUKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlmbXQtPmZtdC5waXgubGVmdCA9IGl0di0+bWFpbl9yZWN0LmxlZnQ7CisJCWZtdC0+Zm10LnBpeC50b3AgPSBpdHYtPm1haW5fcmVjdC50b3A7CisJCWZtdC0+Zm10LnBpeC53aWR0aCA9IGl0di0+bWFpbl9yZWN0LndpZHRoOworCQlmbXQtPmZtdC5waXguaGVpZ2h0ID0gaXR2LT5tYWluX3JlY3QuaGVpZ2h0OworCQlmbXQtPmZtdC5waXguY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9TTVBURTE3ME07CisJCWZtdC0+Zm10LnBpeC5maWVsZCA9IFY0TDJfRklFTERfSU5URVJMQUNFRDsKKwkJaWYgKGl0di0+b3V0cHV0X21vZGUgPT0gT1VUX1VETUFfWVVWKSB7CisJCQlzd2l0Y2ggKGl0di0+eXV2X2luZm8ubGFjZV9tb2RlICYgSVZUVl9ZVVZfTU9ERV9NQVNLKSB7CisJCQljYXNlIElWVFZfWVVWX01PREVfSU5URVJMQUNFRDoKKwkJCQlmbXQtPmZtdC5waXguZmllbGQgPSAoaXR2LT55dXZfaW5mby5sYWNlX21vZGUgJiBJVlRWX1lVVl9TWU5DX01BU0spID8KKwkJCQkJVjRMMl9GSUVMRF9JTlRFUkxBQ0VEX0JUIDogVjRMMl9GSUVMRF9JTlRFUkxBQ0VEX1RCOworCQkJCWJyZWFrOworCQkJY2FzZSBJVlRWX1lVVl9NT0RFX1BST0dSRVNTSVZFOgorCQkJCWZtdC0+Zm10LnBpeC5maWVsZCA9IFY0TDJfRklFTERfTk9ORTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJZm10LT5mbXQucGl4LmZpZWxkID0gVjRMMl9GSUVMRF9BTlk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlmbXQtPmZtdC5waXgucGl4ZWxmb3JtYXQgPSBWNEwyX1BJWF9GTVRfSE0xMjsKKwkJCS8qIFlVViBzaXplIGlzIChZPShoKncpICsgVVY9KGgqKHcvMikpKSAqLworCQkJZm10LT5mbXQucGl4LnNpemVpbWFnZSA9CisJCQkJZm10LT5mbXQucGl4LmhlaWdodCAqIGZtdC0+Zm10LnBpeC53aWR0aCArCisJCQkJZm10LT5mbXQucGl4LmhlaWdodCAqIChmbXQtPmZtdC5waXgud2lkdGggLyAyKTsKKwkJfQorCQllbHNlIGlmIChpdHYtPm91dHB1dF9tb2RlID09IE9VVF9ZVVYgfHwKKwkJCQlzdHJlYW10eXBlID09IElWVFZfRU5DX1NUUkVBTV9UWVBFX1lVViB8fAorCQkJCXN0cmVhbXR5cGUgPT0gSVZUVl9ERUNfU1RSRUFNX1RZUEVfWVVWKSB7CisJCQlmbXQtPmZtdC5waXgucGl4ZWxmb3JtYXQgPSBWNEwyX1BJWF9GTVRfSE0xMjsKKwkJCS8qIFlVViBzaXplIGlzIChZPShoKncpICsgVVY9KGgqKHcvMikpKSAqLworCQkJZm10LT5mbXQucGl4LnNpemVpbWFnZSA9CisJCQkJZm10LT5mbXQucGl4LmhlaWdodCAqIGZtdC0+Zm10LnBpeC53aWR0aCArCisJCQkJZm10LT5mbXQucGl4LmhlaWdodCAqIChmbXQtPmZtdC5waXgud2lkdGggLyAyKTsKKwkJfSBlbHNlIHsKKwkJCWZtdC0+Zm10LnBpeC5waXhlbGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9NUEVHOworCQkJZm10LT5mbXQucGl4LnNpemVpbWFnZSA9IDEyOCAqIDEwMjQ7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRToKKwkJZm10LT5mbXQucGl4LmxlZnQgPSAwOworCQlmbXQtPmZtdC5waXgudG9wID0gMDsKKwkJZm10LT5mbXQucGl4LndpZHRoID0gaXR2LT5wYXJhbXMud2lkdGg7CisJCWZtdC0+Zm10LnBpeC5oZWlnaHQgPSBpdHYtPnBhcmFtcy5oZWlnaHQ7CisJCWZtdC0+Zm10LnBpeC5jb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX1NNUFRFMTcwTTsKKwkJZm10LT5mbXQucGl4LmZpZWxkID0gVjRMMl9GSUVMRF9JTlRFUkxBQ0VEOworCQlpZiAoc3RyZWFtdHlwZSA9PSBJVlRWX0VOQ19TVFJFQU1fVFlQRV9ZVVYgfHwKKwkJCQlzdHJlYW10eXBlID09IElWVFZfREVDX1NUUkVBTV9UWVBFX1lVVikgeworCQkJZm10LT5mbXQucGl4LnBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX0hNMTI7CisJCQkvKiBZVVYgc2l6ZSBpcyAoWT0oaCp3KSArIFVWPShoKih3LzIpKSkgKi8KKwkJCWZtdC0+Zm10LnBpeC5zaXplaW1hZ2UgPQorCQkJCWZtdC0+Zm10LnBpeC5oZWlnaHQgKiBmbXQtPmZtdC5waXgud2lkdGggKworCQkJCWZtdC0+Zm10LnBpeC5oZWlnaHQgKiAoZm10LT5mbXQucGl4LndpZHRoIC8gMik7CisJCX0gZWxzZSB7CisJCQlmbXQtPmZtdC5waXgucGl4ZWxmb3JtYXQgPSBWNEwyX1BJWF9GTVRfTVBFRzsKKwkJCWZtdC0+Zm10LnBpeC5zaXplaW1hZ2UgPSAxMjggKiAxMDI0OworCQl9CisJCWJyZWFrOworCisJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9PVkVSTEFZOgorCQlpZiAoIShpdHYtPnY0bDJfY2FwICYgVjRMMl9DQVBfVklERU9fT1VUUFVUKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlmbXQtPmZtdC53aW4uY2hyb21ha2V5ID0gaXR2LT5vc2RfY29sb3Jfa2V5OworCQlmbXQtPmZtdC53aW4uZ2xvYmFsX2FscGhhID0gaXR2LT5vc2RfZ2xvYmFsX2FscGhhOworCQlicmVhazsKKworCWNhc2UgVjRMMl9CVUZfVFlQRV9WQklfQ0FQVFVSRToKKwkJZm10LT5mbXQudmJpLnNhbXBsaW5nX3JhdGUgPSAyNzAwMDAwMDsKKwkJZm10LT5mbXQudmJpLm9mZnNldCA9IDI0ODsKKwkJZm10LT5mbXQudmJpLnNhbXBsZXNfcGVyX2xpbmUgPSBpdHYtPnZiaS5yYXdfZGVjb2Rlcl9saW5lX3NpemUgLSA0OworCQlmbXQtPmZtdC52Ymkuc2FtcGxlX2Zvcm1hdCA9IFY0TDJfUElYX0ZNVF9HUkVZOworCQlmbXQtPmZtdC52Ymkuc3RhcnRbMF0gPSBpdHYtPnZiaS5zdGFydFswXTsKKwkJZm10LT5mbXQudmJpLnN0YXJ0WzFdID0gaXR2LT52Ymkuc3RhcnRbMV07CisJCWZtdC0+Zm10LnZiaS5jb3VudFswXSA9IGZtdC0+Zm10LnZiaS5jb3VudFsxXSA9IGl0di0+dmJpLmNvdW50OworCQlicmVhazsKKworCWNhc2UgVjRMMl9CVUZfVFlQRV9TTElDRURfVkJJX09VVFBVVDoKKwl7CisJCXN0cnVjdCB2NGwyX3NsaWNlZF92YmlfZm9ybWF0ICp2YmlmbXQgPSAmZm10LT5mbXQuc2xpY2VkOworCisJCWlmICghKGl0di0+djRsMl9jYXAgJiBWNEwyX0NBUF9TTElDRURfVkJJX09VVFBVVCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJdmJpZm10LT5pb19zaXplID0gc2l6ZW9mKHN0cnVjdCB2NGwyX3NsaWNlZF92YmlfZGF0YSkgKiAzNjsKKwkJbWVtc2V0KHZiaWZtdC0+cmVzZXJ2ZWQsIDAsIHNpemVvZih2YmlmbXQtPnJlc2VydmVkKSk7CisJCW1lbXNldCh2YmlmbXQtPnNlcnZpY2VfbGluZXMsIDAsIHNpemVvZih2YmlmbXQtPnNlcnZpY2VfbGluZXMpKTsKKwkJaWYgKGl0di0+aXNfNjBoeikgeworCQkJdmJpZm10LT5zZXJ2aWNlX2xpbmVzWzBdWzIxXSA9IFY0TDJfU0xJQ0VEX0NBUFRJT05fNTI1OworCQkJdmJpZm10LT5zZXJ2aWNlX2xpbmVzWzFdWzIxXSA9IFY0TDJfU0xJQ0VEX0NBUFRJT05fNTI1OworCQl9IGVsc2UgeworCQkJdmJpZm10LT5zZXJ2aWNlX2xpbmVzWzBdWzIzXSA9IFY0TDJfU0xJQ0VEX1dTU182MjU7CisJCQl2YmlmbXQtPnNlcnZpY2VfbGluZXNbMF1bMTZdID0gVjRMMl9TTElDRURfVlBTOworCQl9CisJCXZiaWZtdC0+c2VydmljZV9zZXQgPSBnZXRfc2VydmljZV9zZXQodmJpZm10KTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBWNEwyX0JVRl9UWVBFX1NMSUNFRF9WQklfQ0FQVFVSRToKKwl7CisJCXN0cnVjdCB2NGwyX3NsaWNlZF92YmlfZm9ybWF0ICp2YmlmbXQgPSAmZm10LT5mbXQuc2xpY2VkOworCisJCXZiaWZtdC0+aW9fc2l6ZSA9IHNpemVvZihzdHJ1Y3QgdjRsMl9zbGljZWRfdmJpX2RhdGEpICogMzY7CisJCW1lbXNldCh2YmlmbXQtPnJlc2VydmVkLCAwLCBzaXplb2YodmJpZm10LT5yZXNlcnZlZCkpOworCQltZW1zZXQodmJpZm10LT5zZXJ2aWNlX2xpbmVzLCAwLCBzaXplb2YodmJpZm10LT5zZXJ2aWNlX2xpbmVzKSk7CisKKwkJaWYgKHN0cmVhbXR5cGUgPT0gSVZUVl9ERUNfU1RSRUFNX1RZUEVfVkJJKSB7CisJCQl2YmlmbXQtPnNlcnZpY2Vfc2V0ID0gaXR2LT5pc181MGh6ID8gVjRMMl9TTElDRURfVkJJXzYyNSA6CisJCQkJCQkgVjRMMl9TTElDRURfVkJJXzUyNTsKKwkJCWV4cGFuZF9zZXJ2aWNlX3NldCh2YmlmbXQsIGl0di0+aXNfNTBoeik7CisJCQlicmVhazsKKwkJfQorCisJCWl0di0+dmlkZW9fZGVjX2Z1bmMoaXR2LCBWSURJT0NfR19GTVQsIGZtdCk7CisJCXZiaWZtdC0+c2VydmljZV9zZXQgPSBnZXRfc2VydmljZV9zZXQodmJpZm10KTsKKwkJYnJlYWs7CisJfQorCWNhc2UgVjRMMl9CVUZfVFlQRV9WQklfT1VUUFVUOgorCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19PVkVSTEFZOgorCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpdnR2X3RyeV9vcl9zZXRfZm10KHN0cnVjdCBpdnR2ICppdHYsIGludCBzdHJlYW10eXBlLAorCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmZtdCwgaW50IHNldF9mbXQpCit7CisJc3RydWN0IHY0bDJfc2xpY2VkX3ZiaV9mb3JtYXQgKnZiaWZtdCA9ICZmbXQtPmZtdC5zbGljZWQ7CisJdTE2IHNldDsKKworCWlmIChmbXQtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQpIHsKKwkJc3RydWN0IHY0bDJfcmVjdCByOworCQlpbnQgZmllbGQ7CisKKwkJaWYgKCEoaXR2LT52NGwyX2NhcCAmIFY0TDJfQ0FQX1ZJREVPX09VVFBVVCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJZmllbGQgPSBmbXQtPmZtdC5waXguZmllbGQ7CisJCXIudG9wID0gZm10LT5mbXQucGl4LnRvcDsKKwkJci5sZWZ0ID0gZm10LT5mbXQucGl4LmxlZnQ7CisJCXIud2lkdGggPSBmbXQtPmZtdC5waXgud2lkdGg7CisJCXIuaGVpZ2h0ID0gZm10LT5mbXQucGl4LmhlaWdodDsKKwkJaXZ0dl9nZXRfZm10KGl0diwgc3RyZWFtdHlwZSwgZm10KTsKKwkJaWYgKGl0di0+b3V0cHV0X21vZGUgIT0gT1VUX1VETUFfWVVWKSB7CisJCQkvKiBUT0RPOiB3b3VsZCBzZXR0aW5nIHRoZSByZWN0IGFsc28gYmUgdmFsaWQgZm9yIHRoaXMgbW9kZT8gKi8KKwkJCWZtdC0+Zm10LnBpeC50b3AgPSByLnRvcDsKKwkJCWZtdC0+Zm10LnBpeC5sZWZ0ID0gci5sZWZ0OworCQkJZm10LT5mbXQucGl4LndpZHRoID0gci53aWR0aDsKKwkJCWZtdC0+Zm10LnBpeC5oZWlnaHQgPSByLmhlaWdodDsKKwkJfQorCQlpZiAoaXR2LT5vdXRwdXRfbW9kZSA9PSBPVVRfVURNQV9ZVVYpIHsKKwkJCS8qIFRPRE86IGFkZCBjaGVja3MgZm9yIHZhbGlkaXR5ICovCisJCQlmbXQtPmZtdC5waXguZmllbGQgPSBmaWVsZDsKKwkJfQorCQlpZiAoc2V0X2ZtdCkgeworCQkJaWYgKGl0di0+b3V0cHV0X21vZGUgPT0gT1VUX1VETUFfWVVWKSB7CisJCQkJc3dpdGNoIChmaWVsZCkgeworCQkJCWNhc2UgVjRMMl9GSUVMRF9OT05FOgorCQkJCQlpdHYtPnl1dl9pbmZvLmxhY2VfbW9kZSA9IElWVFZfWVVWX01PREVfUFJPR1JFU1NJVkU7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgVjRMMl9GSUVMRF9BTlk6CisJCQkJCWl0di0+eXV2X2luZm8ubGFjZV9tb2RlID0gSVZUVl9ZVVZfTU9ERV9BVVRPOworCQkJCQlicmVhazsKKwkJCQljYXNlIFY0TDJfRklFTERfSU5URVJMQUNFRF9CVDoKKwkJCQkJaXR2LT55dXZfaW5mby5sYWNlX21vZGUgPQorCQkJCQkJSVZUVl9ZVVZfTU9ERV9JTlRFUkxBQ0VEfElWVFZfWVVWX1NZTkNfT0REOworCQkJCQlicmVhazsKKwkJCQljYXNlIFY0TDJfRklFTERfSU5URVJMQUNFRF9UQjoKKwkJCQlkZWZhdWx0OgorCQkJCQlpdHYtPnl1dl9pbmZvLmxhY2VfbW9kZSA9IElWVFZfWVVWX01PREVfSU5URVJMQUNFRDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWl0di0+eXV2X2luZm8ubGFjZV9zeW5jX2ZpZWxkID0gKGl0di0+eXV2X2luZm8ubGFjZV9tb2RlICYgSVZUVl9ZVVZfU1lOQ19NQVNLKSA9PSBJVlRWX1lVVl9TWU5DX0VWRU4gPyAwIDogMTsKKworCQkJCS8qIEZvcmNlIHVwZGF0ZSBvZiB5dXYgcmVnaXN0ZXJzICovCisJCQkJaXR2LT55dXZfaW5mby55dXZfZm9yY2VkX3VwZGF0ZSA9IDE7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlpZiAoIWl2dHZfdmFwaShpdHYsIENYMjM0MVhfT1NEX1NFVF9GUkFNRUJVRkZFUl9XSU5ET1csIDQsCisJCQkJIHIud2lkdGgsIHIuaGVpZ2h0LCByLmxlZnQsIHIudG9wKSkKKwkJCQlpdHYtPm1haW5fcmVjdCA9IHI7CisJCQllbHNlCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGZtdC0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9PVkVSTEFZKSB7CisJCWlmICghKGl0di0+djRsMl9jYXAgJiBWNEwyX0NBUF9WSURFT19PVVRQVVQpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChzZXRfZm10KSB7CisJCQlpdHYtPm9zZF9jb2xvcl9rZXkgPSBmbXQtPmZtdC53aW4uY2hyb21ha2V5OworCQkJaXR2LT5vc2RfZ2xvYmFsX2FscGhhID0gZm10LT5mbXQud2luLmdsb2JhbF9hbHBoYTsKKwkJCWl2dHZfc2V0X29zZF9hbHBoYShpdHYpOworCQl9CisJCXJldHVybiAwOworCX0KKworCS8qIHNldCB3aW5kb3cgc2l6ZSAqLworCWlmIChmbXQtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKSB7CisJCWludCB3ID0gZm10LT5mbXQucGl4LndpZHRoOworCQlpbnQgaCA9IGZtdC0+Zm10LnBpeC5oZWlnaHQ7CisKKwkJaWYgKHcgPiA3MjApIHcgPSA3MjA7CisJCWVsc2UgaWYgKHcgPCAxKSB3ID0gMTsKKwkJaWYgKGggPiAoaXR2LT5pc181MGh6ID8gNTc2IDogNDgwKSkgaCA9IChpdHYtPmlzXzUwaHogPyA1NzYgOiA0ODApOworCQllbHNlIGlmIChoIDwgMikgaCA9IDI7CisJCWl2dHZfZ2V0X2ZtdChpdHYsIHN0cmVhbXR5cGUsIGZtdCk7CisJCWZtdC0+Zm10LnBpeC53aWR0aCA9IHc7CisJCWZtdC0+Zm10LnBpeC5oZWlnaHQgPSBoOworCisJCWlmICghc2V0X2ZtdCB8fCAoaXR2LT5wYXJhbXMud2lkdGggPT0gdyAmJiBpdHYtPnBhcmFtcy5oZWlnaHQgPT0gaCkpCisJCQlyZXR1cm4gMDsKKwkJaWYgKGF0b21pY19yZWFkKCZpdHYtPmNhcHR1cmluZykgPiAwKQorCQkJcmV0dXJuIC1FQlVTWTsKKworCQlpdHYtPnBhcmFtcy53aWR0aCA9IHc7CisJCWl0di0+cGFyYW1zLmhlaWdodCA9IGg7CisJCWlmICh3ICE9IDcyMCB8fCBoICE9IChpdHYtPmlzXzUwaHogPyA1NzYgOiA0ODApKQorCQkJaXR2LT5wYXJhbXMudmlkZW9fdGVtcG9yYWxfZmlsdGVyID0gMDsKKwkJZWxzZQorCQkJaXR2LT5wYXJhbXMudmlkZW9fdGVtcG9yYWxfZmlsdGVyID0gODsKKwkJaXR2LT52aWRlb19kZWNfZnVuYyhpdHYsIFZJRElPQ19TX0ZNVCwgZm10KTsKKwkJcmV0dXJuIGl2dHZfZ2V0X2ZtdChpdHYsIHN0cmVhbXR5cGUsIGZtdCk7CisJfQorCisJLyogc2V0IHJhdyBWQkkgZm9ybWF0ICovCisJaWYgKGZtdC0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZCSV9DQVBUVVJFKSB7CisJCWlmIChzZXRfZm10ICYmIHN0cmVhbXR5cGUgPT0gSVZUVl9FTkNfU1RSRUFNX1RZUEVfVkJJICYmCisJCSAgICBpdHYtPnZiaS5zbGljZWRfaW4tPnNlcnZpY2Vfc2V0ICYmCisJCSAgICBhdG9taWNfcmVhZCgmaXR2LT5jYXB0dXJpbmcpID4gMCkgeworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCQlpZiAoc2V0X2ZtdCkgeworCQkJaXR2LT52Ymkuc2xpY2VkX2luLT5zZXJ2aWNlX3NldCA9IDA7CisJCQlpdHYtPnZpZGVvX2RlY19mdW5jKGl0diwgVklESU9DX1NfRk1ULCAmaXR2LT52YmkuaW4pOworCQl9CisJCXJldHVybiBpdnR2X2dldF9mbXQoaXR2LCBzdHJlYW10eXBlLCBmbXQpOworCX0KKworCS8qIHNldCBzbGljZWQgVkJJIG91dHB1dAorCSAgIEluIHByaW5jaXBsZSB0aGUgdXNlciBjb3VsZCByZXF1ZXN0IHRoYXQgb25seSBjZXJ0YWluCisJICAgVkJJIHR5cGVzIGFyZSBvdXRwdXQgYW5kIHRoYXQgdGhlIG90aGVycyBhcmUgaWdub3JlZC4KKwkgICBJLmUuLCBzdXBwcmVzcyBDQyBpbiB0aGUgZXZlbiBmaWVsZHMgb3Igb25seSBvdXRwdXQKKwkgICBXU1MgYW5kIG5vIFZQUy4gQ3VycmVudGx5IHRob3VnaCB0aGVyZSBpcyBubyBjaG9pY2UuICovCisJaWYgKGZtdC0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1NMSUNFRF9WQklfT1VUUFVUKQorCQlyZXR1cm4gaXZ0dl9nZXRfZm10KGl0diwgc3RyZWFtdHlwZSwgZm10KTsKKworCS8qIGFueSBlbHNlIGJ1dCBzbGljZWQgVkJJIGNhcHR1cmUgaXMgYW4gZXJyb3IgKi8KKwlpZiAoZm10LT50eXBlICE9IFY0TDJfQlVGX1RZUEVfU0xJQ0VEX1ZCSV9DQVBUVVJFKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChzdHJlYW10eXBlID09IElWVFZfREVDX1NUUkVBTV9UWVBFX1ZCSSkKKwkJcmV0dXJuIGl2dHZfZ2V0X2ZtdChpdHYsIHN0cmVhbXR5cGUsIGZtdCk7CisKKwkvKiBzZXQgc2xpY2VkIFZCSSBjYXB0dXJlIGZvcm1hdCAqLworCXZiaWZtdC0+aW9fc2l6ZSA9IHNpemVvZihzdHJ1Y3QgdjRsMl9zbGljZWRfdmJpX2RhdGEpICogMzY7CisJbWVtc2V0KHZiaWZtdC0+cmVzZXJ2ZWQsIDAsIHNpemVvZih2YmlmbXQtPnJlc2VydmVkKSk7CisKKwlpZiAodmJpZm10LT5zZXJ2aWNlX3NldCkKKwkJZXhwYW5kX3NlcnZpY2Vfc2V0KHZiaWZtdCwgaXR2LT5pc181MGh6KTsKKwlzZXQgPSBjaGVja19zZXJ2aWNlX3NldCh2YmlmbXQsIGl0di0+aXNfNTBoeik7CisJdmJpZm10LT5zZXJ2aWNlX3NldCA9IGdldF9zZXJ2aWNlX3NldCh2YmlmbXQpOworCisJaWYgKCFzZXRfZm10KQorCQlyZXR1cm4gMDsKKwlpZiAoc2V0ID09IDApCisJCXJldHVybiAtRUlOVkFMOworCWlmIChhdG9taWNfcmVhZCgmaXR2LT5jYXB0dXJpbmcpID4gMCAmJiBpdHYtPnZiaS5zbGljZWRfaW4tPnNlcnZpY2Vfc2V0ID09IDApIHsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJaXR2LT52aWRlb19kZWNfZnVuYyhpdHYsIFZJRElPQ19TX0ZNVCwgZm10KTsKKwltZW1jcHkoaXR2LT52Ymkuc2xpY2VkX2luLCB2YmlmbXQsIHNpemVvZigqaXR2LT52Ymkuc2xpY2VkX2luKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXZ0dl9kZWJ1Z19pb2N0bHMoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgaXZ0dl9vcGVuX2lkICppZCA9IChzdHJ1Y3QgaXZ0dl9vcGVuX2lkICopZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBpdnR2ICppdHYgPSBpZC0+aXR2OworCXN0cnVjdCB2NGwyX3JlZ2lzdGVyICpyZWcgPSBhcmc7CisKKwlzd2l0Y2ggKGNtZCkgeworCS8qIGlvY3RscyB0byBhbGxvdyBkaXJlY3QgYWNjZXNzIHRvIHRoZSBlbmNvZGVyIHJlZ2lzdGVycyBmb3IgdGVzdGluZyAqLworCWNhc2UgVklESU9DX0RCR19HX1JFR0lTVEVSOgorCQlpZiAodjRsMl9jaGlwX21hdGNoX2hvc3QocmVnLT5tYXRjaF90eXBlLCByZWctPm1hdGNoX2NoaXApKQorCQkJcmV0dXJuIGl2dHZfaXR2YyhpdHYsIGNtZCwgYXJnKTsKKwkJaWYgKHJlZy0+bWF0Y2hfdHlwZSA9PSBWNEwyX0NISVBfTUFUQ0hfSTJDX0RSSVZFUikKKwkJCXJldHVybiBpdnR2X2kyY19pZChpdHYsIHJlZy0+bWF0Y2hfY2hpcCwgY21kLCBhcmcpOworCQlyZXR1cm4gaXZ0dl9jYWxsX2kyY19jbGllbnQoaXR2LCByZWctPm1hdGNoX2NoaXAsIGNtZCwgYXJnKTsKKworCWNhc2UgVklESU9DX0RCR19TX1JFR0lTVEVSOgorCQlpZiAodjRsMl9jaGlwX21hdGNoX2hvc3QocmVnLT5tYXRjaF90eXBlLCByZWctPm1hdGNoX2NoaXApKQorCQkJcmV0dXJuIGl2dHZfaXR2YyhpdHYsIGNtZCwgYXJnKTsKKwkJaWYgKHJlZy0+bWF0Y2hfdHlwZSA9PSBWNEwyX0NISVBfTUFUQ0hfSTJDX0RSSVZFUikKKwkJCXJldHVybiBpdnR2X2kyY19pZChpdHYsIHJlZy0+bWF0Y2hfY2hpcCwgY21kLCBhcmcpOworCQlyZXR1cm4gaXZ0dl9jYWxsX2kyY19jbGllbnQoaXR2LCByZWctPm1hdGNoX2NoaXAsIGNtZCwgYXJnKTsKKworCWNhc2UgVklESU9DX0dfQ0hJUF9JREVOVDogeworCQlzdHJ1Y3QgdjRsMl9jaGlwX2lkZW50ICpjaGlwID0gYXJnOworCisJCWNoaXAtPmlkZW50ID0gVjRMMl9JREVOVF9OT05FOworCQljaGlwLT5yZXZpc2lvbiA9IDA7CisJCWlmIChyZWctPm1hdGNoX3R5cGUgPT0gVjRMMl9DSElQX01BVENIX0hPU1QpIHsKKwkJCWlmICh2NGwyX2NoaXBfbWF0Y2hfaG9zdChyZWctPm1hdGNoX3R5cGUsIHJlZy0+bWF0Y2hfY2hpcCkpIHsKKwkJCQlzdHJ1Y3QgdjRsMl9jaGlwX2lkZW50ICpjaGlwID0gYXJnOworCisJCQkJY2hpcC0+aWRlbnQgPSBpdHYtPmhhc19jeDIzNDE1ID8gVjRMMl9JREVOVF9DWDIzNDE1IDogVjRMMl9JREVOVF9DWDIzNDE2OworCQkJfQorCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKHJlZy0+bWF0Y2hfdHlwZSA9PSBWNEwyX0NISVBfTUFUQ0hfSTJDX0RSSVZFUikKKwkJCXJldHVybiBpdnR2X2kyY19pZChpdHYsIHJlZy0+bWF0Y2hfY2hpcCwgY21kLCBhcmcpOworCQlpZiAocmVnLT5tYXRjaF90eXBlID09IFY0TDJfQ0hJUF9NQVRDSF9JMkNfQUREUikKKwkJCXJldHVybiBpdnR2X2NhbGxfaTJjX2NsaWVudChpdHYsIHJlZy0+bWF0Y2hfY2hpcCwgY21kLCBhcmcpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwljYXNlIFZJRElPQ19JTlRfU19BVURJT19ST1VUSU5HOiB7CisJCXN0cnVjdCB2NGwyX3JvdXRpbmcgKnJvdXRlID0gYXJnOworCisJCWl2dHZfYXVkaW9fc2V0X3JvdXRlKGl0diwgcm91dGUpOworCQlicmVhazsKKwl9CisKKwljYXNlIFZJRElPQ19JTlRfUkVTRVQ6CisJCWl2dHZfcmVzZXRfaXJfZ3BpbyhpdHYpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IGl2dHZfdjRsMl9pb2N0bHMoc3RydWN0IGl2dHYgKml0diwgc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgaXZ0dl9vcGVuX2lkICppZCA9IE5VTEw7CisKKwlpZiAoZmlscCkgaWQgPSAoc3RydWN0IGl2dHZfb3Blbl9pZCAqKWZpbHAtPnByaXZhdGVfZGF0YTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBWSURJT0NfR19QUklPUklUWToKKwl7CisJCWVudW0gdjRsMl9wcmlvcml0eSAqcCA9IGFyZzsKKworCQkqcCA9IHY0bDJfcHJpb19tYXgoJml0di0+cHJpbyk7CisJCWJyZWFrOworCX0KKworCWNhc2UgVklESU9DX1NfUFJJT1JJVFk6CisJeworCQllbnVtIHY0bDJfcHJpb3JpdHkgKnByaW8gPSBhcmc7CisKKwkJcmV0dXJuIHY0bDJfcHJpb19jaGFuZ2UoJml0di0+cHJpbywgJmlkLT5wcmlvLCAqcHJpbyk7CisJfQorCisJY2FzZSBWSURJT0NfUVVFUllDQVA6eworCQlzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5ICp2Y2FwID0gYXJnOworCisJCW1lbXNldCh2Y2FwLCAwLCBzaXplb2YoKnZjYXApKTsKKwkJc3RyY3B5KHZjYXAtPmRyaXZlciwgSVZUVl9EUklWRVJfTkFNRSk7ICAgICAvKiBkcml2ZXIgbmFtZSAqLworCQlzdHJjcHkodmNhcC0+Y2FyZCwgaXR2LT5jYXJkX25hbWUpOyAJICAgIC8qIGNhcmQgdHlwZSAqLworCQlzdHJjcHkodmNhcC0+YnVzX2luZm8sIHBjaV9uYW1lKGl0di0+ZGV2KSk7IC8qIGJ1cyBpbmZvLi4uICovCisJCXZjYXAtPnZlcnNpb24gPSBJVlRWX0RSSVZFUl9WRVJTSU9OOyAJICAgIC8qIHZlcnNpb24gKi8KKwkJdmNhcC0+Y2FwYWJpbGl0aWVzID0gaXR2LT52NGwyX2NhcDsgCSAgICAvKiBjYXBhYmlsaXRpZXMgKi8KKworCQkvKiByZXNlcnZlZC4uIG11c3Qgc2V0IHRvIDAhICovCisJCXZjYXAtPnJlc2VydmVkWzBdID0gdmNhcC0+cmVzZXJ2ZWRbMV0gPQorCQkJdmNhcC0+cmVzZXJ2ZWRbMl0gPSB2Y2FwLT5yZXNlcnZlZFszXSA9IDA7CisJCWJyZWFrOworCX0KKworCWNhc2UgVklESU9DX0VOVU1BVURJTzp7CisJCXN0cnVjdCB2NGwyX2F1ZGlvICp2aW4gPSBhcmc7CisKKwkJcmV0dXJuIGl2dHZfZ2V0X2F1ZGlvX2lucHV0KGl0diwgdmluLT5pbmRleCwgdmluKTsKKwl9CisKKwljYXNlIFZJRElPQ19HX0FVRElPOnsKKwkJc3RydWN0IHY0bDJfYXVkaW8gKnZpbiA9IGFyZzsKKworCQl2aW4tPmluZGV4ID0gaXR2LT5hdWRpb19pbnB1dDsKKwkJcmV0dXJuIGl2dHZfZ2V0X2F1ZGlvX2lucHV0KGl0diwgdmluLT5pbmRleCwgdmluKTsKKwl9CisKKwljYXNlIFZJRElPQ19TX0FVRElPOnsKKwkJc3RydWN0IHY0bDJfYXVkaW8gKnZvdXQgPSBhcmc7CisKKwkJaWYgKHZvdXQtPmluZGV4ID49IGl0di0+bm9mX2F1ZGlvX2lucHV0cykKKwkJCXJldHVybiAtRUlOVkFMOworCQlpdHYtPmF1ZGlvX2lucHV0ID0gdm91dC0+aW5kZXg7CisJCWl2dHZfYXVkaW9fc2V0X2lvKGl0dik7CisJCWJyZWFrOworCX0KKworCWNhc2UgVklESU9DX0VOVU1BVURPVVQ6eworCQlzdHJ1Y3QgdjRsMl9hdWRpb291dCAqdmluID0gYXJnOworCisJCS8qIHNldCBpdCB0byBkZWZhdWx0cyBmcm9tIG91ciB0YWJsZSAqLworCQlyZXR1cm4gaXZ0dl9nZXRfYXVkaW9fb3V0cHV0KGl0diwgdmluLT5pbmRleCwgdmluKTsKKwl9CisKKwljYXNlIFZJRElPQ19HX0FVRE9VVDp7CisJCXN0cnVjdCB2NGwyX2F1ZGlvb3V0ICp2aW4gPSBhcmc7CisKKwkJdmluLT5pbmRleCA9IDA7CisJCXJldHVybiBpdnR2X2dldF9hdWRpb19vdXRwdXQoaXR2LCB2aW4tPmluZGV4LCB2aW4pOworCX0KKworCWNhc2UgVklESU9DX1NfQVVET1VUOnsKKwkJc3RydWN0IHY0bDJfYXVkaW9vdXQgKnZvdXQgPSBhcmc7CisKKwkJcmV0dXJuIGl2dHZfZ2V0X2F1ZGlvX291dHB1dChpdHYsIHZvdXQtPmluZGV4LCB2b3V0KTsKKwl9CisKKwljYXNlIFZJRElPQ19FTlVNSU5QVVQ6eworCQlzdHJ1Y3QgdjRsMl9pbnB1dCAqdmluID0gYXJnOworCisJCS8qIHNldCBpdCB0byBkZWZhdWx0cyBmcm9tIG91ciB0YWJsZSAqLworCQlyZXR1cm4gaXZ0dl9nZXRfaW5wdXQoaXR2LCB2aW4tPmluZGV4LCB2aW4pOworCX0KKworCWNhc2UgVklESU9DX0VOVU1PVVRQVVQ6eworCQlzdHJ1Y3QgdjRsMl9vdXRwdXQgKnZvdXQgPSBhcmc7CisKKwkJcmV0dXJuIGl2dHZfZ2V0X291dHB1dChpdHYsIHZvdXQtPmluZGV4LCB2b3V0KTsKKwl9CisKKwljYXNlIFZJRElPQ19UUllfRk1UOgorCWNhc2UgVklESU9DX1NfRk1UOiB7CisJCXN0cnVjdCB2NGwyX2Zvcm1hdCAqZm10ID0gYXJnOworCisJCXJldHVybiBpdnR2X3RyeV9vcl9zZXRfZm10KGl0diwgaWQtPnR5cGUsIGZtdCwgY21kID09IFZJRElPQ19TX0ZNVCk7CisJfQorCisJY2FzZSBWSURJT0NfR19GTVQ6IHsKKwkJc3RydWN0IHY0bDJfZm9ybWF0ICpmbXQgPSBhcmc7CisJCWludCB0eXBlID0gZm10LT50eXBlOworCisJCW1lbXNldChmbXQsIDAsIHNpemVvZigqZm10KSk7CisJCWZtdC0+dHlwZSA9IHR5cGU7CisJCXJldHVybiBpdnR2X2dldF9mbXQoaXR2LCBpZC0+dHlwZSwgZm10KTsKKwl9CisKKwljYXNlIFZJRElPQ19TX0NST1A6IHsKKwkJc3RydWN0IHY0bDJfY3JvcCAqY3JvcCA9IGFyZzsKKworCQlpZiAoY3JvcC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuIGl0di0+dmlkZW9fZGVjX2Z1bmMoaXR2LCBWSURJT0NfU19DUk9QLCBhcmcpOworCX0KKworCWNhc2UgVklESU9DX0dfQ1JPUDogeworCQlzdHJ1Y3QgdjRsMl9jcm9wICpjcm9wID0gYXJnOworCisJCWlmIChjcm9wLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gaXR2LT52aWRlb19kZWNfZnVuYyhpdHYsIFZJRElPQ19HX0NST1AsIGFyZyk7CisJfQorCisJY2FzZSBWSURJT0NfRU5VTV9GTVQ6IHsKKwkJc3RhdGljIHN0cnVjdCB2NGwyX2ZtdGRlc2MgZm9ybWF0c1tdID0geworCQkJeyAwLCAwLCAwLAorCQkJICAiSE0xMiAoWVVWIDQ6MToxKSIsIFY0TDJfUElYX0ZNVF9ITTEyLAorCQkJICB7IDAsIDAsIDAsIDAgfQorCQkJfSwKKwkJCXsgMSwgMCwgVjRMMl9GTVRfRkxBR19DT01QUkVTU0VELAorCQkJICAiTVBFRyIsIFY0TDJfUElYX0ZNVF9NUEVHLAorCQkJICB7IDAsIDAsIDAsIDAgfQorCQkJfQorCQl9OworCQlzdHJ1Y3QgdjRsMl9mbXRkZXNjICpmbXQgPSBhcmc7CisJCWVudW0gdjRsMl9idWZfdHlwZSB0eXBlID0gZm10LT50eXBlOworCisJCXN3aXRjaCAodHlwZSkgeworCQljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRToKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUOgorCQkJaWYgKCEoaXR2LT52NGwyX2NhcCAmIFY0TDJfQ0FQX1ZJREVPX09VVFBVVCkpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWlmIChmbXQtPmluZGV4ID4gMSkKKwkJCXJldHVybiAtRUlOVkFMOworCQkqZm10ID0gZm9ybWF0c1tmbXQtPmluZGV4XTsKKwkJZm10LT50eXBlID0gdHlwZTsKKwkJcmV0dXJuIDA7CisJfQorCisJY2FzZSBWSURJT0NfR19JTlBVVDp7CisJCSooaW50ICopYXJnID0gaXR2LT5hY3RpdmVfaW5wdXQ7CisJCWJyZWFrOworCX0KKworCWNhc2UgVklESU9DX1NfSU5QVVQ6eworCQlpbnQgaW5wID0gKihpbnQgKilhcmc7CisKKwkJaWYgKGlucCA8IDAgfHwgaW5wID49IGl0di0+bm9mX2lucHV0cykKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWlmIChpbnAgPT0gaXR2LT5hY3RpdmVfaW5wdXQpIHsKKwkJCUlWVFZfREVCVUdfSU5GTygiSW5wdXQgdW5jaGFuZ2VkXG4iKTsKKwkJCWJyZWFrOworCQl9CisJCUlWVFZfREVCVUdfSU5GTygiQ2hhbmdpbmcgaW5wdXQgZnJvbSAlZCB0byAlZFxuIiwKKwkJCQlpdHYtPmFjdGl2ZV9pbnB1dCwgaW5wKTsKKworCQlpdHYtPmFjdGl2ZV9pbnB1dCA9IGlucDsKKwkJLyogU2V0IHRoZSBhdWRpbyBpbnB1dCB0byB3aGF0ZXZlciBpcyBhcHByb3ByaWF0ZSBmb3IgdGhlCisJCSAgIGlucHV0IHR5cGUuICovCisJCWl0di0+YXVkaW9faW5wdXQgPSBpdHYtPmNhcmQtPnZpZGVvX2lucHV0c1tpbnBdLmF1ZGlvX2luZGV4OworCisJCS8qIHByZXZlbnQgb3RoZXJzIGZyb20gbWVzc2luZyB3aXRoIHRoZSBzdHJlYW1zIHVudGlsCisJCSAgIHdlJ3JlIGZpbmlzaGVkIGNoYW5naW5nIGlucHV0cy4gKi8KKwkJaXZ0dl9tdXRlKGl0dik7CisJCWl2dHZfdmlkZW9fc2V0X2lvKGl0dik7CisJCWl2dHZfYXVkaW9fc2V0X2lvKGl0dik7CisJCWl2dHZfdW5tdXRlKGl0dik7CisJCWJyZWFrOworCX0KKworCWNhc2UgVklESU9DX0dfT1VUUFVUOnsKKwkJaWYgKCEoaXR2LT52NGwyX2NhcCAmIFY0TDJfQ0FQX1ZJREVPX09VVFBVVCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJKihpbnQgKilhcmcgPSBpdHYtPmFjdGl2ZV9vdXRwdXQ7CisJCWJyZWFrOworCX0KKworCWNhc2UgVklESU9DX1NfT1VUUFVUOnsKKwkJaW50IG91dHAgPSAqKGludCAqKWFyZzsKKwkJc3RydWN0IHY0bDJfcm91dGluZyByb3V0ZTsKKworCQlpZiAob3V0cCA+PSBpdHYtPmNhcmQtPm5vZl9vdXRwdXRzKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaWYgKG91dHAgPT0gaXR2LT5hY3RpdmVfb3V0cHV0KSB7CisJCQlJVlRWX0RFQlVHX0lORk8oIk91dHB1dCB1bmNoYW5nZWRcbiIpOworCQkJYnJlYWs7CisJCX0KKwkJSVZUVl9ERUJVR19JTkZPKCJDaGFuZ2luZyBvdXRwdXQgZnJvbSAlZCB0byAlZFxuIiwKKwkJCSAgIGl0di0+YWN0aXZlX291dHB1dCwgb3V0cCk7CisKKwkJaXR2LT5hY3RpdmVfb3V0cHV0ID0gb3V0cDsKKwkJcm91dGUuaW5wdXQgPSBTQUE3MTI3X0lOUFVUX1RZUEVfTk9STUFMOworCQlyb3V0ZS5vdXRwdXQgPSBpdHYtPmNhcmQtPnZpZGVvX291dHB1dHNbb3V0cF0udmlkZW9fb3V0cHV0OworCQlpdnR2X3NhYTcxMjcoaXR2LCBWSURJT0NfSU5UX1NfVklERU9fUk9VVElORywgJnJvdXRlKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBWSURJT0NfR19GUkVRVUVOQ1k6eworCQlzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgKnZmID0gYXJnOworCisJCWlmICh2Zi0+dHVuZXIgIT0gMCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpdnR2X2NhbGxfaTJjX2NsaWVudHMoaXR2LCBjbWQsIGFyZyk7CisJCWJyZWFrOworCX0KKworCWNhc2UgVklESU9DX1NfRlJFUVVFTkNZOnsKKwkJc3RydWN0IHY0bDJfZnJlcXVlbmN5IHZmID0gKihzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgKilhcmc7CisKKwkJaWYgKHZmLnR1bmVyICE9IDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlpdnR2X211dGUoaXR2KTsKKwkJSVZUVl9ERUJVR19JTkZPKCJ2NGwyIGlvY3RsOiBzZXQgZnJlcXVlbmN5ICVkXG4iLCB2Zi5mcmVxdWVuY3kpOworCQlpdnR2X2NhbGxfaTJjX2NsaWVudHMoaXR2LCBjbWQsICZ2Zik7CisJCWl2dHZfdW5tdXRlKGl0dik7CisJCWJyZWFrOworCX0KKworCWNhc2UgVklESU9DX0VOVU1TVEQ6eworCQlzdHJ1Y3QgdjRsMl9zdGFuZGFyZCAqdnMgPSBhcmc7CisJCWludCBpZHggPSB2cy0+aW5kZXg7CisKKwkJaWYgKGlkeCA8IDAgfHwgaWR4ID49IEFSUkFZX1NJWkUoZW51bV9zdGRzKSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCSp2cyA9IChlbnVtX3N0ZHNbaWR4XS5zdGQgJiBWNEwyX1NURF81MjVfNjApID8KKwkJCQlpdnR2X3N0ZF82MGh6IDogaXZ0dl9zdGRfNTBoejsKKwkJdnMtPmluZGV4ID0gaWR4OworCQl2cy0+aWQgPSBlbnVtX3N0ZHNbaWR4XS5zdGQ7CisJCXN0cmNweSh2cy0+bmFtZSwgZW51bV9zdGRzW2lkeF0ubmFtZSk7CisJCWJyZWFrOworCX0KKworCWNhc2UgVklESU9DX0dfU1REOnsKKwkJKih2NGwyX3N0ZF9pZCAqKSBhcmcgPSBpdHYtPnN0ZDsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBWSURJT0NfU19TVEQ6IHsKKwkJdjRsMl9zdGRfaWQgc3RkID0gKih2NGwyX3N0ZF9pZCAqKSBhcmc7CisKKwkJaWYgKChzdGQgJiBWNEwyX1NURF9BTEwpID09IDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlpZiAoc3RkID09IGl0di0+c3RkKQorCQkJYnJlYWs7CisKKwkJaWYgKHRlc3RfYml0KElWVFZfRl9JX1JBRElPX1VTRVIsICZpdHYtPmlfZmxhZ3MpIHx8CisJCSAgICBhdG9taWNfcmVhZCgmaXR2LT5jYXB0dXJpbmcpID4gMCB8fAorCQkgICAgYXRvbWljX3JlYWQoJml0di0+ZGVjb2RpbmcpID4gMCkgeworCQkJLyogU3dpdGNoaW5nIHN0YW5kYXJkIHdvdWxkIHR1cm4gb2ZmIHRoZSByYWRpbyBvciBtZXNzCisJCQkgICB3aXRoIGFscmVhZHkgcnVubmluZyBzdHJlYW1zLCBwcmV2ZW50IHRoYXQgYnkKKwkJCSAgIHJldHVybmluZyBFQlVTWS4gKi8KKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKworCQlpdHYtPnN0ZCA9IHN0ZDsKKwkJaXR2LT5pc182MGh6ID0gKHN0ZCAmIFY0TDJfU1REXzUyNV82MCkgPyAxIDogMDsKKwkJaXR2LT5wYXJhbXMuaXNfNTBoeiA9IGl0di0+aXNfNTBoeiA9ICFpdHYtPmlzXzYwaHo7CisJCWl0di0+cGFyYW1zLndpZHRoID0gNzIwOworCQlpdHYtPnBhcmFtcy5oZWlnaHQgPSBpdHYtPmlzXzUwaHogPyA1NzYgOiA0ODA7CisJCWl0di0+dmJpLmNvdW50ID0gaXR2LT5pc181MGh6ID8gMTggOiAxMjsKKwkJaXR2LT52Ymkuc3RhcnRbMF0gPSBpdHYtPmlzXzUwaHogPyA2IDogMTA7CisJCWl0di0+dmJpLnN0YXJ0WzFdID0gaXR2LT5pc181MGh6ID8gMzE4IDogMjczOworCQlpZiAoaXR2LT5od19mbGFncyAmIElWVFZfSFdfQ1gyNTg0MCkgeworCQkJaXR2LT52Ymkuc2xpY2VkX2RlY29kZXJfbGluZV9zaXplID0gaXR2LT5pc182MGh6ID8gMjcyIDogMjg0OworCQl9CisJCUlWVFZfREVCVUdfSU5GTygiU3dpdGNoaW5nIHN0YW5kYXJkIHRvICVsbHguXG4iLCBpdHYtPnN0ZCk7CisKKwkJLyogVHVuZXIgKi8KKwkJaXZ0dl9jYWxsX2kyY19jbGllbnRzKGl0diwgVklESU9DX1NfU1RELCAmaXR2LT5zdGQpOworCisJCWlmIChpdHYtPnY0bDJfY2FwICYgVjRMMl9DQVBfVklERU9fT1VUUFVUKSB7CisJCQkvKiBzZXQgZGlzcGxheSBzdGFuZGFyZCAqLworCQkJaXR2LT5zdGRfb3V0ID0gc3RkOworCQkJaXR2LT5pc19vdXRfNjBoeiA9IGl0di0+aXNfNjBoejsKKwkJCWl0di0+aXNfb3V0XzUwaHogPSBpdHYtPmlzXzUwaHo7CisJCQlpdnR2X2NhbGxfaTJjX2NsaWVudHMoaXR2LCBWSURJT0NfSU5UX1NfU1REX09VVFBVVCwgJml0di0+c3RkX291dCk7CisJCQlpdnR2X3ZhcGkoaXR2LCBDWDIzNDFYX0RFQ19TRVRfU1RBTkRBUkQsIDEsIGl0di0+aXNfb3V0XzUwaHopOworCQkJaXR2LT5tYWluX3JlY3QubGVmdCA9IGl0di0+bWFpbl9yZWN0LnRvcCA9IDA7CisJCQlpdHYtPm1haW5fcmVjdC53aWR0aCA9IDcyMDsKKwkJCWl0di0+bWFpbl9yZWN0LmhlaWdodCA9IGl0di0+cGFyYW1zLmhlaWdodDsKKwkJCWl2dHZfdmFwaShpdHYsIENYMjM0MVhfT1NEX1NFVF9GUkFNRUJVRkZFUl9XSU5ET1csIDQsCisJCQkJNzIwLCBpdHYtPm1haW5fcmVjdC5oZWlnaHQsIDAsIDApOworCQl9CisJCWJyZWFrOworCX0KKworCWNhc2UgVklESU9DX1NfVFVORVI6IHsJLyogU2V0dGluZyB0dW5lciBjYW4gb25seSBzZXQgYXVkaW8gbW9kZSAqLworCQlzdHJ1Y3QgdjRsMl90dW5lciAqdnQgPSBhcmc7CisKKwkJaWYgKHZ0LT5pbmRleCAhPSAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaXZ0dl9jYWxsX2kyY19jbGllbnRzKGl0diwgVklESU9DX1NfVFVORVIsIHZ0KTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBWSURJT0NfR19UVU5FUjogeworCQlzdHJ1Y3QgdjRsMl90dW5lciAqdnQgPSBhcmc7CisKKwkJaWYgKHZ0LT5pbmRleCAhPSAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJbWVtc2V0KHZ0LCAwLCBzaXplb2YoKnZ0KSk7CisJCWl2dHZfY2FsbF9pMmNfY2xpZW50cyhpdHYsIFZJRElPQ19HX1RVTkVSLCB2dCk7CisKKwkJaWYgKHRlc3RfYml0KElWVFZfRl9JX1JBRElPX1VTRVIsICZpdHYtPmlfZmxhZ3MpKSB7CisJCQlzdHJjcHkodnQtPm5hbWUsICJpdnR2IFJhZGlvIFR1bmVyIik7CisJCQl2dC0+dHlwZSA9IFY0TDJfVFVORVJfUkFESU87CisJCX0gZWxzZSB7CisJCQlzdHJjcHkodnQtPm5hbWUsICJpdnR2IFRWIFR1bmVyIik7CisJCQl2dC0+dHlwZSA9IFY0TDJfVFVORVJfQU5BTE9HX1RWOworCQl9CisJCWJyZWFrOworCX0KKworCWNhc2UgVklESU9DX0dfU0xJQ0VEX1ZCSV9DQVA6IHsKKwkJc3RydWN0IHY0bDJfc2xpY2VkX3ZiaV9jYXAgKmNhcCA9IGFyZzsKKwkJaW50IHNldCA9IGl0di0+aXNfNTBoeiA/IFY0TDJfU0xJQ0VEX1ZCSV82MjUgOiBWNEwyX1NMSUNFRF9WQklfNTI1OworCQlpbnQgZiwgbDsKKwkJZW51bSB2NGwyX2J1Zl90eXBlIHR5cGUgPSBjYXAtPnR5cGU7CisKKwkJbWVtc2V0KGNhcCwgMCwgc2l6ZW9mKCpjYXApKTsKKwkJY2FwLT50eXBlID0gdHlwZTsKKwkJaWYgKHR5cGUgPT0gVjRMMl9CVUZfVFlQRV9TTElDRURfVkJJX0NBUFRVUkUpIHsKKwkJCWZvciAoZiA9IDA7IGYgPCAyOyBmKyspIHsKKwkJCQlmb3IgKGwgPSAwOyBsIDwgMjQ7IGwrKykgeworCQkJCQlpZiAodmFsaWRfc2VydmljZV9saW5lKGYsIGwsIGl0di0+aXNfNTBoeikpIHsKKwkJCQkJCWNhcC0+c2VydmljZV9saW5lc1tmXVtsXSA9IHNldDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCXJldHVybiAwOworCQl9CisJCWlmICh0eXBlID09IFY0TDJfQlVGX1RZUEVfU0xJQ0VEX1ZCSV9PVVRQVVQpIHsKKwkJCWlmICghKGl0di0+djRsMl9jYXAgJiBWNEwyX0NBUF9TTElDRURfVkJJX09VVFBVVCkpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlpZiAoaXR2LT5pc182MGh6KSB7CisJCQkJY2FwLT5zZXJ2aWNlX2xpbmVzWzBdWzIxXSA9IFY0TDJfU0xJQ0VEX0NBUFRJT05fNTI1OworCQkJCWNhcC0+c2VydmljZV9saW5lc1sxXVsyMV0gPSBWNEwyX1NMSUNFRF9DQVBUSU9OXzUyNTsKKwkJCX0gZWxzZSB7CisJCQkJY2FwLT5zZXJ2aWNlX2xpbmVzWzBdWzIzXSA9IFY0TDJfU0xJQ0VEX1dTU182MjU7CisJCQkJY2FwLT5zZXJ2aWNlX2xpbmVzWzBdWzE2XSA9IFY0TDJfU0xJQ0VEX1ZQUzsKKwkJCX0KKwkJCXJldHVybiAwOworCQl9CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWNhc2UgVklESU9DX0dfRU5DX0lOREVYOiB7CisJCXN0cnVjdCB2NGwyX2VuY19pZHggKmlkeCA9IGFyZzsKKwkJaW50IGk7CisKKwkJaWR4LT5lbnRyaWVzID0gKGl0di0+cGdtX2luZm9fd3JpdGVfaWR4ICsgSVZUVl9NQVhfUEdNX0lOREVYIC0gaXR2LT5wZ21faW5mb19yZWFkX2lkeCkgJQorCQkJCQlJVlRWX01BWF9QR01fSU5ERVg7CisJCWlmIChpZHgtPmVudHJpZXMgPiBWNEwyX0VOQ19JRFhfRU5UUklFUykKKwkJCWlkeC0+ZW50cmllcyA9IFY0TDJfRU5DX0lEWF9FTlRSSUVTOworCQlmb3IgKGkgPSAwOyBpIDwgaWR4LT5lbnRyaWVzOyBpKyspIHsKKwkJCWlkeC0+ZW50cnlbaV0gPSBpdHYtPnBnbV9pbmZvWyhpdHYtPnBnbV9pbmZvX3JlYWRfaWR4ICsgaSkgJSBJVlRWX01BWF9QR01fSU5ERVhdOworCQl9CisJCWl0di0+cGdtX2luZm9fcmVhZF9pZHggPSAoaXR2LT5wZ21faW5mb19yZWFkX2lkeCArIGlkeC0+ZW50cmllcykgJSBJVlRWX01BWF9QR01fSU5ERVg7CisJCWJyZWFrOworCX0KKworCWNhc2UgVklESU9DX0VOQ09ERVJfQ01EOgorCWNhc2UgVklESU9DX1RSWV9FTkNPREVSX0NNRDogeworCQlzdHJ1Y3QgdjRsMl9lbmNvZGVyX2NtZCAqZW5jID0gYXJnOworCQlpbnQgdHJ5ID0gY21kID09IFZJRElPQ19UUllfRU5DT0RFUl9DTUQ7CisKKwkJbWVtc2V0KCZlbmMtPnJhdywgMCwgc2l6ZW9mKGVuYy0+cmF3KSk7CisJCXN3aXRjaCAoZW5jLT5jbWQpIHsKKwkJY2FzZSBWNEwyX0VOQ19DTURfU1RBUlQ6CisJCQllbmMtPmZsYWdzID0gMDsKKwkJCWlmICh0cnkpCisJCQkJcmV0dXJuIDA7CisJCQlyZXR1cm4gaXZ0dl9zdGFydF9jYXB0dXJlKGlkKTsKKworCQljYXNlIFY0TDJfRU5DX0NNRF9TVE9QOgorCQkJZW5jLT5mbGFncyAmPSBWNEwyX0VOQ19DTURfU1RPUF9BVF9HT1BfRU5EOworCQkJaWYgKHRyeSkKKwkJCQlyZXR1cm4gMDsKKwkJCWl2dHZfc3RvcF9jYXB0dXJlKGlkLCBlbmMtPmZsYWdzICYgVjRMMl9FTkNfQ01EX1NUT1BfQVRfR09QX0VORCk7CisJCQlyZXR1cm4gMDsKKworCQljYXNlIFY0TDJfRU5DX0NNRF9QQVVTRToKKwkJCWVuYy0+ZmxhZ3MgPSAwOworCQkJaWYgKHRyeSkKKwkJCQlyZXR1cm4gMDsKKwkJCWlmICghYXRvbWljX3JlYWQoJml0di0+Y2FwdHVyaW5nKSkKKwkJCQlyZXR1cm4gLUVQRVJNOworCQkJaWYgKHRlc3RfYW5kX3NldF9iaXQoSVZUVl9GX0lfRU5DX1BBVVNFRCwgJml0di0+aV9mbGFncykpCisJCQkJcmV0dXJuIDA7CisJCQlpdnR2X211dGUoaXR2KTsKKwkJCWl2dHZfdmFwaShpdHYsIENYMjM0MVhfRU5DX1BBVVNFX0VOQ09ERVIsIDEsIDApOworCQkJYnJlYWs7CisKKwkJY2FzZSBWNEwyX0VOQ19DTURfUkVTVU1FOgorCQkJZW5jLT5mbGFncyA9IDA7CisJCQlpZiAodHJ5KQorCQkJCXJldHVybiAwOworCQkJaWYgKCFhdG9taWNfcmVhZCgmaXR2LT5jYXB0dXJpbmcpKQorCQkJCXJldHVybiAtRVBFUk07CisJCQlpZiAoIXRlc3RfYW5kX2NsZWFyX2JpdChJVlRWX0ZfSV9FTkNfUEFVU0VELCAmaXR2LT5pX2ZsYWdzKSkKKwkJCQlyZXR1cm4gMDsKKwkJCWl2dHZfdmFwaShpdHYsIENYMjM0MVhfRU5DX1BBVVNFX0VOQ09ERVIsIDEsIDEpOworCQkJaXZ0dl91bm11dGUoaXR2KTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJYnJlYWs7CisJfQorCisJY2FzZSBWSURJT0NfR19GQlVGOiB7CisJCXN0cnVjdCB2NGwyX2ZyYW1lYnVmZmVyICpmYiA9IGFyZzsKKworCQltZW1zZXQoZmIsIDAsIHNpemVvZigqZmIpKTsKKwkJaWYgKCEoaXR2LT52NGwyX2NhcCAmIFY0TDJfQ0FQX1ZJREVPX09VVFBVVF9PVkVSTEFZKSkKKwkJCWJyZWFrOworCQlmYi0+Y2FwYWJpbGl0eSA9IFY0TDJfRkJVRl9DQVBfRVhURVJOT1ZFUkxBWSB8IFY0TDJfRkJVRl9DQVBfQ0hST01BS0VZIHwKKwkJCVY0TDJfRkJVRl9DQVBfTE9DQUxfQUxQSEEgfCBWNEwyX0ZCVUZfQ0FQX0dMT0JBTF9BTFBIQTsKKwkJZmItPmZtdC5waXhlbGZvcm1hdCA9IGl0di0+b3NkX3BpeGVsZm9ybWF0OworCQlmYi0+Zm10LndpZHRoID0gaXR2LT5vc2RfcmVjdC53aWR0aDsKKwkJZmItPmZtdC5oZWlnaHQgPSBpdHYtPm9zZF9yZWN0LmhlaWdodDsKKwkJZmItPmZtdC5sZWZ0ID0gaXR2LT5vc2RfcmVjdC5sZWZ0OworCQlmYi0+Zm10LnRvcCA9IGl0di0+b3NkX3JlY3QudG9wOworCQlmYi0+YmFzZSA9ICh2b2lkICopaXR2LT5vc2RfdmlkZW9fcGJhc2U7CisJCWlmIChpdHYtPm9zZF9nbG9iYWxfYWxwaGFfc3RhdGUpCisJCQlmYi0+ZmxhZ3MgfD0gVjRMMl9GQlVGX0ZMQUdfR0xPQkFMX0FMUEhBOworCQlpZiAoaXR2LT5vc2RfbG9jYWxfYWxwaGFfc3RhdGUpCisJCQlmYi0+ZmxhZ3MgfD0gVjRMMl9GQlVGX0ZMQUdfTE9DQUxfQUxQSEE7CisJCWlmIChpdHYtPm9zZF9jb2xvcl9rZXlfc3RhdGUpCisJCQlmYi0+ZmxhZ3MgfD0gVjRMMl9GQlVGX0ZMQUdfQ0hST01BS0VZOworCQlicmVhazsKKwl9CisKKwljYXNlIFZJRElPQ19TX0ZCVUY6IHsKKwkJc3RydWN0IHY0bDJfZnJhbWVidWZmZXIgKmZiID0gYXJnOworCisJCWlmICghKGl0di0+djRsMl9jYXAgJiBWNEwyX0NBUF9WSURFT19PVVRQVVRfT1ZFUkxBWSkpCisJCQlicmVhazsKKwkJaXR2LT5vc2RfZ2xvYmFsX2FscGhhX3N0YXRlID0gKGZiLT5mbGFncyAmIFY0TDJfRkJVRl9GTEFHX0dMT0JBTF9BTFBIQSkgIT0gMDsKKwkJaXR2LT5vc2RfbG9jYWxfYWxwaGFfc3RhdGUgPSAoZmItPmZsYWdzICYgVjRMMl9GQlVGX0ZMQUdfTE9DQUxfQUxQSEEpICE9IDA7CisJCWl0di0+b3NkX2NvbG9yX2tleV9zdGF0ZSA9IChmYi0+ZmxhZ3MgJiBWNEwyX0ZCVUZfRkxBR19DSFJPTUFLRVkpICE9IDA7CisJCWJyZWFrOworCX0KKworCWNhc2UgVklESU9DX0xPR19TVEFUVVM6CisJeworCQlpbnQgaGFzX291dHB1dCA9IGl0di0+djRsMl9jYXAgJiBWNEwyX0NBUF9WSURFT19PVVRQVVQ7CisJCXN0cnVjdCB2NGwyX2lucHV0IHZpZGluOworCQlzdHJ1Y3QgdjRsMl9hdWRpbyBhdWRpbjsKKwkJaW50IGk7CisKKwkJSVZUVl9JTkZPKCI9PT09PT09PT09PT09PT09PSAgU1RBUlQgU1RBVFVTIENBUkQgIyVkICA9PT09PT09PT09PT09PT09PVxuIiwgaXR2LT5udW0pOworCQlpZiAoaXR2LT5od19mbGFncyAmIElWVFZfSFdfVFZFRVBST00pIHsKKwkJCXN0cnVjdCB0dmVlcHJvbSB0djsKKworCQkJaXZ0dl9yZWFkX2VlcHJvbShpdHYsICZ0dik7CisJCX0KKwkJaXZ0dl9jYWxsX2kyY19jbGllbnRzKGl0diwgVklESU9DX0xPR19TVEFUVVMsIE5VTEwpOworCQlpdnR2X2dldF9pbnB1dChpdHYsIGl0di0+YWN0aXZlX2lucHV0LCAmdmlkaW4pOworCQlpdnR2X2dldF9hdWRpb19pbnB1dChpdHYsIGl0di0+YXVkaW9faW5wdXQsICZhdWRpbik7CisJCUlWVFZfSU5GTygiVmlkZW8gSW5wdXQ6ICVzXG4iLCB2aWRpbi5uYW1lKTsKKwkJSVZUVl9JTkZPKCJBdWRpbyBJbnB1dDogJXNcbiIsIGF1ZGluLm5hbWUpOworCQlpZiAoaGFzX291dHB1dCkgeworCQkJc3RydWN0IHY0bDJfb3V0cHV0IHZpZG91dDsKKwkJCXN0cnVjdCB2NGwyX2F1ZGlvb3V0IGF1ZG91dDsKKwkJCWludCBtb2RlID0gaXR2LT5vdXRwdXRfbW9kZTsKKwkJCXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgb3V0cHV0X21vZGVzW10gPSB7CisJCQkJIk5vbmUiLAorCQkJCSJNUEVHIFN0cmVhbWluZyIsCisJCQkJIllVViBTdHJlYW1pbmciLAorCQkJCSJZVVYgRnJhbWVzIiwKKwkJCQkiUGFzc3Rocm91Z2giLAorCQkJfTsKKworCQkJaXZ0dl9nZXRfb3V0cHV0KGl0diwgaXR2LT5hY3RpdmVfb3V0cHV0LCAmdmlkb3V0KTsKKwkJCWl2dHZfZ2V0X2F1ZGlvX291dHB1dChpdHYsIDAsICZhdWRvdXQpOworCQkJSVZUVl9JTkZPKCJWaWRlbyBPdXRwdXQ6ICVzXG4iLCB2aWRvdXQubmFtZSk7CisJCQlJVlRWX0lORk8oIkF1ZGlvIE91dHB1dDogJXNcbiIsIGF1ZG91dC5uYW1lKTsKKwkJCWlmIChtb2RlIDwgMCB8fCBtb2RlID4gT1VUX1BBU1NUSFJPVUdIKQorCQkJCW1vZGUgPSBPVVRfTk9ORTsKKwkJCUlWVFZfSU5GTygiT3V0cHV0IE1vZGU6ICVzXG4iLCBvdXRwdXRfbW9kZXNbbW9kZV0pOworCQl9CisJCUlWVFZfSU5GTygiVHVuZXI6ICVzXG4iLAorCQkJdGVzdF9iaXQoSVZUVl9GX0lfUkFESU9fVVNFUiwgJml0di0+aV9mbGFncykgPyAiUmFkaW8iIDogIlRWIik7CisJCWN4MjM0MXhfbG9nX3N0YXR1cygmaXR2LT5wYXJhbXMsIGl0di0+bmFtZSk7CisJCUlWVFZfSU5GTygiU3RhdHVzIGZsYWdzOiAweCUwOGx4XG4iLCBpdHYtPmlfZmxhZ3MpOworCQlmb3IgKGkgPSAwOyBpIDwgSVZUVl9NQVhfU1RSRUFNUzsgaSsrKSB7CisJCQlzdHJ1Y3QgaXZ0dl9zdHJlYW0gKnMgPSAmaXR2LT5zdHJlYW1zW2ldOworCisJCQlpZiAocy0+djRsMmRldiA9PSBOVUxMIHx8IHMtPmJ1ZmZlcnMgPT0gMCkKKwkJCQljb250aW51ZTsKKwkJCUlWVFZfSU5GTygiU3RyZWFtICVzOiBzdGF0dXMgMHglMDRseCwgJWQlJSBvZiAlZCBLaUIgKCVkIGJ1ZmZlcnMpIGluIHVzZVxuIiwgcy0+bmFtZSwgcy0+c19mbGFncywKKwkJCQkJKHMtPmJ1ZmZlcnMgLSBzLT5xX2ZyZWUuYnVmZmVycykgKiAxMDAgLyBzLT5idWZmZXJzLAorCQkJCQkocy0+YnVmZmVycyAqIHMtPmJ1Zl9zaXplKSAvIDEwMjQsIHMtPmJ1ZmZlcnMpOworCQl9CisJCUlWVFZfSU5GTygiUmVhZCBNUEVHL1ZCSTogJWxsZC8lbGxkIGJ5dGVzXG4iLCBpdHYtPm1wZ19kYXRhX3JlY2VpdmVkLCBpdHYtPnZiaV9kYXRhX2luc2VydGVkKTsKKwkJSVZUVl9JTkZPKCI9PT09PT09PT09PT09PT09PT0gIEVORCBTVEFUVVMgQ0FSRCAjJWQgID09PT09PT09PT09PT09PT09PVxuIiwgaXR2LT5udW0pOworCQlicmVhazsKKwl9CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXZ0dl9kZWNvZGVyX2lvY3RscyhzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQoreworCXN0cnVjdCBpdnR2X29wZW5faWQgKmlkID0gKHN0cnVjdCBpdnR2X29wZW5faWQgKilmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGl2dHYgKml0diA9IGlkLT5pdHY7CisJaW50IG5vbmJsb2NraW5nID0gZmlscC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0s7CisJc3RydWN0IGl2dHZfc3RyZWFtICpzID0gJml0di0+c3RyZWFtc1tpZC0+dHlwZV07CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgSVZUVl9JT0NfRE1BX0ZSQU1FOiB7CisJCXN0cnVjdCBpdnR2X2RtYV9mcmFtZSAqYXJncyA9IGFyZzsKKworCQlJVlRWX0RFQlVHX0lPQ1RMKCJJVlRWX0lPQ19ETUFfRlJBTUVcbiIpOworCQlpZiAoIShpdHYtPnY0bDJfY2FwICYgVjRMMl9DQVBfVklERU9fT1VUUFVUKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoYXJncy0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoaXR2LT5vdXRwdXRfbW9kZSA9PSBPVVRfVURNQV9ZVVYgJiYgYXJncy0+eV9zb3VyY2UgPT0gTlVMTCkKKwkJCXJldHVybiAwOworCQlpZiAoaXZ0dl9jbGFpbV9zdHJlYW0oaWQsIGlkLT50eXBlKSkgeworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCQlpZiAoaXZ0dl9zZXRfb3V0cHV0X21vZGUoaXR2LCBPVVRfVURNQV9ZVVYpICE9IE9VVF9VRE1BX1lVVikgeworCQkJaXZ0dl9yZWxlYXNlX3N0cmVhbShzKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKwkJaWYgKGFyZ3MtPnlfc291cmNlID09IE5VTEwpCisJCQlyZXR1cm4gMDsKKwkJcmV0dXJuIGl2dHZfeXV2X3ByZXBfZnJhbWUoaXR2LCBhcmdzKTsKKwl9CisKKwljYXNlIFZJREVPX0dFVF9QVFM6IHsKKwkJdTMyIGRhdGFbQ1gyMzQxWF9NQk9YX01BWF9EQVRBXTsKKwkJdTY0ICpwdHMgPSBhcmc7CisKKwkJSVZUVl9ERUJVR19JT0NUTCgiVklERU9fR0VUX1BUU1xuIik7CisJCWlmIChzLT50eXBlIDwgSVZUVl9ERUNfU1RSRUFNX1RZUEVfTVBHKSB7CisJCQkqcHRzID0gcy0+ZG1hX3B0czsKKwkJCWJyZWFrOworCQl9CisJCWlmICghKGl0di0+djRsMl9jYXAgJiBWNEwyX0NBUF9WSURFT19PVVRQVVQpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaWYgKHRlc3RfYml0KElWVFZfRl9JX1ZBTElEX0RFQ19USU1JTkdTLCAmaXR2LT5pX2ZsYWdzKSkgeworCQkJKnB0cyA9ICh1NjQpICgodTY0KWl0di0+bGFzdF9kZWNfdGltaW5nWzJdIDw8IDMyKSB8CisJCQkJCSh1NjQpaXR2LT5sYXN0X2RlY190aW1pbmdbMV07CisJCQlicmVhazsKKwkJfQorCQkqcHRzID0gMDsKKwkJaWYgKGF0b21pY19yZWFkKCZpdHYtPmRlY29kaW5nKSkgeworCQkJaWYgKGl2dHZfYXBpKGl0diwgQ1gyMzQxWF9ERUNfR0VUX1RJTUlOR19JTkZPLCA1LCBkYXRhKSkgeworCQkJCUlWVFZfREVCVUdfV0FSTigiR0VUX1RJTUlORzogY291bGRuJ3QgcmVhZCBjbG9ja1xuIik7CisJCQkJcmV0dXJuIC1FSU87CisJCQl9CisJCQltZW1jcHkoaXR2LT5sYXN0X2RlY190aW1pbmcsIGRhdGEsIHNpemVvZihpdHYtPmxhc3RfZGVjX3RpbWluZykpOworCQkJc2V0X2JpdChJVlRWX0ZfSV9WQUxJRF9ERUNfVElNSU5HUywgJml0di0+aV9mbGFncyk7CisJCQkqcHRzID0gKHU2NCkgKCh1NjQpIGRhdGFbMl0gPDwgMzIpIHwgKHU2NCkgZGF0YVsxXTsKKwkJCS8qdGltaW5nLT5zY3IgPSAodTY0KSAoKCh1NjQpIGRhdGFbNF0gPDwgMzIpIHwgKHU2NCkgKGRhdGFbM10pKTsqLworCQl9CisJCWJyZWFrOworCX0KKworCWNhc2UgVklERU9fR0VUX0ZSQU1FX0NPVU5UOiB7CisJCXUzMiBkYXRhW0NYMjM0MVhfTUJPWF9NQVhfREFUQV07CisJCXU2NCAqZnJhbWUgPSBhcmc7CisKKwkJSVZUVl9ERUJVR19JT0NUTCgiVklERU9fR0VUX0ZSQU1FX0NPVU5UXG4iKTsKKwkJaWYgKHMtPnR5cGUgPCBJVlRWX0RFQ19TVFJFQU1fVFlQRV9NUEcpIHsKKwkJCSpmcmFtZSA9IDA7CisJCQlicmVhazsKKwkJfQorCQlpZiAoIShpdHYtPnY0bDJfY2FwICYgVjRMMl9DQVBfVklERU9fT1VUUFVUKSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWlmICh0ZXN0X2JpdChJVlRWX0ZfSV9WQUxJRF9ERUNfVElNSU5HUywgJml0di0+aV9mbGFncykpIHsKKwkJCSpmcmFtZSA9IGl0di0+bGFzdF9kZWNfdGltaW5nWzBdOworCQkJYnJlYWs7CisJCX0KKwkJKmZyYW1lID0gMDsKKwkJaWYgKGF0b21pY19yZWFkKCZpdHYtPmRlY29kaW5nKSkgeworCQkJaWYgKGl2dHZfYXBpKGl0diwgQ1gyMzQxWF9ERUNfR0VUX1RJTUlOR19JTkZPLCA1LCBkYXRhKSkgeworCQkJCUlWVFZfREVCVUdfV0FSTigiR0VUX1RJTUlORzogY291bGRuJ3QgcmVhZCBjbG9ja1xuIik7CisJCQkJcmV0dXJuIC1FSU87CisJCQl9CisJCQltZW1jcHkoaXR2LT5sYXN0X2RlY190aW1pbmcsIGRhdGEsIHNpemVvZihpdHYtPmxhc3RfZGVjX3RpbWluZykpOworCQkJc2V0X2JpdChJVlRWX0ZfSV9WQUxJRF9ERUNfVElNSU5HUywgJml0di0+aV9mbGFncyk7CisJCQkqZnJhbWUgPSBkYXRhWzBdOworCQl9CisJCWJyZWFrOworCX0KKworCWNhc2UgVklERU9fUExBWTogeworCQlzdHJ1Y3QgdmlkZW9fY29tbWFuZCB2YzsKKworCQlJVlRWX0RFQlVHX0lPQ1RMKCJWSURFT19QTEFZXG4iKTsKKwkJbWVtc2V0KCZ2YywgMCwgc2l6ZW9mKHZjKSk7CisJCXZjLmNtZCA9IFZJREVPX0NNRF9QTEFZOworCQlyZXR1cm4gaXZ0dl92aWRlb19jb21tYW5kKGl0diwgaWQsICZ2YywgMCk7CisJfQorCisJY2FzZSBWSURFT19TVE9QOiB7CisJCXN0cnVjdCB2aWRlb19jb21tYW5kIHZjOworCisJCUlWVFZfREVCVUdfSU9DVEwoIlZJREVPX1NUT1BcbiIpOworCQltZW1zZXQoJnZjLCAwLCBzaXplb2YodmMpKTsKKwkJdmMuY21kID0gVklERU9fQ01EX1NUT1A7CisJCXZjLmZsYWdzID0gVklERU9fQ01EX1NUT1BfVE9fQkxBQ0sgfCBWSURFT19DTURfU1RPUF9JTU1FRElBVEVMWTsKKwkJcmV0dXJuIGl2dHZfdmlkZW9fY29tbWFuZChpdHYsIGlkLCAmdmMsIDApOworCX0KKworCWNhc2UgVklERU9fRlJFRVpFOiB7CisJCXN0cnVjdCB2aWRlb19jb21tYW5kIHZjOworCisJCUlWVFZfREVCVUdfSU9DVEwoIlZJREVPX0ZSRUVaRVxuIik7CisJCW1lbXNldCgmdmMsIDAsIHNpemVvZih2YykpOworCQl2Yy5jbWQgPSBWSURFT19DTURfRlJFRVpFOworCQlyZXR1cm4gaXZ0dl92aWRlb19jb21tYW5kKGl0diwgaWQsICZ2YywgMCk7CisJfQorCisJY2FzZSBWSURFT19DT05USU5VRTogeworCQlzdHJ1Y3QgdmlkZW9fY29tbWFuZCB2YzsKKworCQlJVlRWX0RFQlVHX0lPQ1RMKCJWSURFT19DT05USU5VRVxuIik7CisJCW1lbXNldCgmdmMsIDAsIHNpemVvZih2YykpOworCQl2Yy5jbWQgPSBWSURFT19DTURfQ09OVElOVUU7CisJCXJldHVybiBpdnR2X3ZpZGVvX2NvbW1hbmQoaXR2LCBpZCwgJnZjLCAwKTsKKwl9CisKKwljYXNlIFZJREVPX0NPTU1BTkQ6CisJY2FzZSBWSURFT19UUllfQ09NTUFORDogeworCQlzdHJ1Y3QgdmlkZW9fY29tbWFuZCAqdmMgPSBhcmc7CisJCWludCB0cnkgPSAoY21kID09IFZJREVPX1RSWV9DT01NQU5EKTsKKworCQlpZiAodHJ5KQorCQkJSVZUVl9ERUJVR19JT0NUTCgiVklERU9fVFJZX0NPTU1BTkRcbiIpOworCQllbHNlCisJCQlJVlRWX0RFQlVHX0lPQ1RMKCJWSURFT19DT01NQU5EXG4iKTsKKwkJcmV0dXJuIGl2dHZfdmlkZW9fY29tbWFuZChpdHYsIGlkLCB2YywgdHJ5KTsKKwl9CisKKwljYXNlIFZJREVPX0dFVF9FVkVOVDogeworCQlzdHJ1Y3QgdmlkZW9fZXZlbnQgKmV2ID0gYXJnOworCQlERUZJTkVfV0FJVCh3YWl0KTsKKworCQlJVlRWX0RFQlVHX0lPQ1RMKCJWSURFT19HRVRfRVZFTlRcbiIpOworCQlpZiAoIShpdHYtPnY0bDJfY2FwICYgVjRMMl9DQVBfVklERU9fT1VUUFVUKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQltZW1zZXQoZXYsIDAsIHNpemVvZigqZXYpKTsKKwkJc2V0X2JpdChJVlRWX0ZfSV9FVl9WU1lOQ19FTkFCTEVELCAmaXR2LT5pX2ZsYWdzKTsKKworCQl3aGlsZSAoMSkgeworCQkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChJVlRWX0ZfSV9FVl9ERUNfU1RPUFBFRCwgJml0di0+aV9mbGFncykpCisJCQkJZXYtPnR5cGUgPSBWSURFT19FVkVOVF9ERUNPREVSX1NUT1BQRUQ7CisJCQllbHNlIGlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoSVZUVl9GX0lfRVZfVlNZTkMsICZpdHYtPmlfZmxhZ3MpKSB7CisJCQkJZXYtPnR5cGUgPSBWSURFT19FVkVOVF9WU1lOQzsKKwkJCQlldi0+dS52c3luY19maWVsZCA9IHRlc3RfYml0KElWVFZfRl9JX0VWX1ZTWU5DX0ZJRUxELCAmaXR2LT5pX2ZsYWdzKSA/CisJCQkJCVZJREVPX1ZTWU5DX0ZJRUxEX09ERCA6IFZJREVPX1ZTWU5DX0ZJRUxEX0VWRU47CisJCQkJaWYgKGl0di0+b3V0cHV0X21vZGUgPT0gT1VUX1VETUFfWVVWICYmCisJCQkJCShpdHYtPnl1dl9pbmZvLmxhY2VfbW9kZSAmIElWVFZfWVVWX01PREVfTUFTSykgPT0KKwkJCQkJCQkJSVZUVl9ZVVZfTU9ERV9QUk9HUkVTU0lWRSkgeworCQkJCQlldi0+dS52c3luY19maWVsZCA9IFZJREVPX1ZTWU5DX0ZJRUxEX1BST0dSRVNTSVZFOworCQkJCX0KKwkJCX0KKwkJCWlmIChldi0+dHlwZSkKKwkJCQlyZXR1cm4gMDsKKwkJCWlmIChub25ibG9ja2luZykKKwkJCQlyZXR1cm4gLUVBR0FJTjsKKwkJCS8qIHdhaXQgZm9yIGV2ZW50ICovCisJCQlwcmVwYXJlX3RvX3dhaXQoJml0di0+ZXZlbnRfd2FpdHEsICZ3YWl0LCBUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJaWYgKChpdHYtPmlfZmxhZ3MgJiAoSVZUVl9GX0lfRVZfREVDX1NUT1BQRUR8SVZUVl9GX0lfRVZfVlNZTkMpKSA9PSAwKQorCQkJCXNjaGVkdWxlKCk7CisJCQlmaW5pc2hfd2FpdCgmaXR2LT5ldmVudF93YWl0cSwgJndhaXQpOworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJLyogcmV0dXJuIGlmIGEgc2lnbmFsIHdhcyByZWNlaXZlZCAqLworCQkJCUlWVFZfREVCVUdfSU5GTygiVXNlciBzdG9wcGVkIHdhaXQgZm9yIGV2ZW50XG4iKTsKKwkJCQlyZXR1cm4gLUVJTlRSOworCQkJfQorCQl9CisJCWJyZWFrOworCX0KKworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpdnR2X3Y0bDJfZG9faW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCit7CisJc3RydWN0IGl2dHZfb3Blbl9pZCAqaWQgPSAoc3RydWN0IGl2dHZfb3Blbl9pZCAqKWZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgaXZ0diAqaXR2ID0gaWQtPml0djsKKwlpbnQgcmV0OworCisJLyogY2hlY2sgcHJpb3JpdHkgKi8KKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgVklESU9DX1NfQ1RSTDoKKwljYXNlIFZJRElPQ19TX1NURDoKKwljYXNlIFZJRElPQ19TX0lOUFVUOgorCWNhc2UgVklESU9DX1NfT1VUUFVUOgorCWNhc2UgVklESU9DX1NfVFVORVI6CisJY2FzZSBWSURJT0NfU19GUkVRVUVOQ1k6CisJY2FzZSBWSURJT0NfU19GTVQ6CisJY2FzZSBWSURJT0NfU19DUk9QOgorCWNhc2UgVklESU9DX1NfQVVESU86CisJY2FzZSBWSURJT0NfU19BVURPVVQ6CisJY2FzZSBWSURJT0NfU19FWFRfQ1RSTFM6CisJY2FzZSBWSURJT0NfU19GQlVGOgorCQlyZXQgPSB2NGwyX3ByaW9fY2hlY2soJml0di0+cHJpbywgJmlkLT5wcmlvKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFZJRElPQ19EQkdfR19SRUdJU1RFUjoKKwljYXNlIFZJRElPQ19EQkdfU19SRUdJU1RFUjoKKwljYXNlIFZJRElPQ19HX0NISVBfSURFTlQ6CisJY2FzZSBWSURJT0NfSU5UX1NfQVVESU9fUk9VVElORzoKKwljYXNlIFZJRElPQ19JTlRfUkVTRVQ6CisJCWlmIChpdnR2X2RlYnVnICYgSVZUVl9EQkdGTEdfSU9DVEwpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIml2dHYlZCBpb2N0bDogIiwgaXR2LT5udW0pOworCQkJdjRsX3ByaW50a19pb2N0bChjbWQpOworCQl9CisJCXJldHVybiBpdnR2X2RlYnVnX2lvY3RscyhmaWxwLCBjbWQsIGFyZyk7CisKKwljYXNlIFZJRElPQ19HX1BSSU9SSVRZOgorCWNhc2UgVklESU9DX1NfUFJJT1JJVFk6CisJY2FzZSBWSURJT0NfUVVFUllDQVA6CisJY2FzZSBWSURJT0NfRU5VTUlOUFVUOgorCWNhc2UgVklESU9DX0dfSU5QVVQ6CisJY2FzZSBWSURJT0NfU19JTlBVVDoKKwljYXNlIFZJRElPQ19FTlVNT1VUUFVUOgorCWNhc2UgVklESU9DX0dfT1VUUFVUOgorCWNhc2UgVklESU9DX1NfT1VUUFVUOgorCWNhc2UgVklESU9DX0dfRk1UOgorCWNhc2UgVklESU9DX1NfRk1UOgorCWNhc2UgVklESU9DX1RSWV9GTVQ6CisJY2FzZSBWSURJT0NfRU5VTV9GTVQ6CisJY2FzZSBWSURJT0NfR19DUk9QOgorCWNhc2UgVklESU9DX1NfQ1JPUDoKKwljYXNlIFZJRElPQ19HX0ZSRVFVRU5DWToKKwljYXNlIFZJRElPQ19TX0ZSRVFVRU5DWToKKwljYXNlIFZJRElPQ19FTlVNU1REOgorCWNhc2UgVklESU9DX0dfU1REOgorCWNhc2UgVklESU9DX1NfU1REOgorCWNhc2UgVklESU9DX1NfVFVORVI6CisJY2FzZSBWSURJT0NfR19UVU5FUjoKKwljYXNlIFZJRElPQ19FTlVNQVVESU86CisJY2FzZSBWSURJT0NfU19BVURJTzoKKwljYXNlIFZJRElPQ19HX0FVRElPOgorCWNhc2UgVklESU9DX0VOVU1BVURPVVQ6CisJY2FzZSBWSURJT0NfU19BVURPVVQ6CisJY2FzZSBWSURJT0NfR19BVURPVVQ6CisJY2FzZSBWSURJT0NfR19TTElDRURfVkJJX0NBUDoKKwljYXNlIFZJRElPQ19MT0dfU1RBVFVTOgorCWNhc2UgVklESU9DX0dfRU5DX0lOREVYOgorCWNhc2UgVklESU9DX0VOQ09ERVJfQ01EOgorCWNhc2UgVklESU9DX1RSWV9FTkNPREVSX0NNRDoKKwljYXNlIFZJRElPQ19HX0ZCVUY6CisJY2FzZSBWSURJT0NfU19GQlVGOgorCQlpZiAoaXZ0dl9kZWJ1ZyAmIElWVFZfREJHRkxHX0lPQ1RMKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJpdnR2JWQgaW9jdGw6ICIsIGl0di0+bnVtKTsKKwkJCXY0bF9wcmludGtfaW9jdGwoY21kKTsKKwkJfQorCQlyZXR1cm4gaXZ0dl92NGwyX2lvY3RscyhpdHYsIGZpbHAsIGNtZCwgYXJnKTsKKworCWNhc2UgVklESU9DX1FVRVJZTUVOVToKKwljYXNlIFZJRElPQ19RVUVSWUNUUkw6CisJY2FzZSBWSURJT0NfU19DVFJMOgorCWNhc2UgVklESU9DX0dfQ1RSTDoKKwljYXNlIFZJRElPQ19TX0VYVF9DVFJMUzoKKwljYXNlIFZJRElPQ19HX0VYVF9DVFJMUzoKKwljYXNlIFZJRElPQ19UUllfRVhUX0NUUkxTOgorCQlpZiAoaXZ0dl9kZWJ1ZyAmIElWVFZfREJHRkxHX0lPQ1RMKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJpdnR2JWQgaW9jdGw6ICIsIGl0di0+bnVtKTsKKwkJCXY0bF9wcmludGtfaW9jdGwoY21kKTsKKwkJfQorCQlyZXR1cm4gaXZ0dl9jb250cm9sX2lvY3RscyhpdHYsIGNtZCwgYXJnKTsKKworCWNhc2UgSVZUVl9JT0NfRE1BX0ZSQU1FOgorCWNhc2UgVklERU9fR0VUX1BUUzoKKwljYXNlIFZJREVPX0dFVF9GUkFNRV9DT1VOVDoKKwljYXNlIFZJREVPX0dFVF9FVkVOVDoKKwljYXNlIFZJREVPX1BMQVk6CisJY2FzZSBWSURFT19TVE9QOgorCWNhc2UgVklERU9fRlJFRVpFOgorCWNhc2UgVklERU9fQ09OVElOVUU6CisJY2FzZSBWSURFT19DT01NQU5EOgorCWNhc2UgVklERU9fVFJZX0NPTU1BTkQ6CisJCXJldHVybiBpdnR2X2RlY29kZXJfaW9jdGxzKGZpbHAsIGNtZCwgYXJnKTsKKworCWNhc2UgMHgwMDAwNTQwMToJLyogSGFuZGxlIGlzYXR0eSgpIGNhbGxzICovCisJCXJldHVybiAtRUlOVkFMOworCWRlZmF1bHQ6CisJCXJldHVybiB2NGxfY29tcGF0X3RyYW5zbGF0ZV9pb2N0bChpbm9kZSwgZmlscCwgY21kLCBhcmcsCisJCQkJCQkgICBpdnR2X3Y0bDJfZG9faW9jdGwpOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IGl2dHZfdjRsMl9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwKKwkJICAgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBpdnR2X29wZW5faWQgKmlkID0gKHN0cnVjdCBpdnR2X29wZW5faWQgKilmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGl2dHYgKml0diA9IGlkLT5pdHY7CisKKwkvKiBGaWx0ZXIgZHZiIGlvY3RscyB0aGF0IGNhbm5vdCBiZSBoYW5kbGVkIGJ5IHZpZGVvX3VzZXJjb3B5ICovCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFZJREVPX1NFTEVDVF9TT1VSQ0U6CisJCUlWVFZfREVCVUdfSU9DVEwoIlZJREVPX1NFTEVDVF9TT1VSQ0VcbiIpOworCQlpZiAoIShpdHYtPnY0bDJfY2FwICYgVjRMMl9DQVBfVklERU9fT1VUUFVUKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gaXZ0dl9wYXNzdGhyb3VnaF9tb2RlKGl0diwgYXJnID09IFZJREVPX1NPVVJDRV9ERU1VWCk7CisKKwljYXNlIEFVRElPX1NFVF9NVVRFOgorCQlJVlRWX0RFQlVHX0lPQ1RMKCJBVURJT19TRVRfTVVURVxuIik7CisJCWl0di0+c3BlZWRfbXV0ZV9hdWRpbyA9IGFyZzsKKwkJcmV0dXJuIDA7CisKKwljYXNlIEFVRElPX0NIQU5ORUxfU0VMRUNUOgorCQlJVlRWX0RFQlVHX0lPQ1RMKCJBVURJT19DSEFOTkVMX1NFTEVDVFxuIik7CisJCWlmIChhcmcgPiBBVURJT19TVEVSRU9fU1dBUFBFRCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpdHYtPmF1ZGlvX3N0ZXJlb19tb2RlID0gYXJnOworCQlpdnR2X3ZhcGkoaXR2LCBDWDIzNDFYX0RFQ19TRVRfQVVESU9fTU9ERSwgMiwgaXR2LT5hdWRpb19iaWxpbmd1YWxfbW9kZSwgaXR2LT5hdWRpb19zdGVyZW9fbW9kZSk7CisJCXJldHVybiAwOworCisJY2FzZSBBVURJT19CSUxJTkdVQUxfQ0hBTk5FTF9TRUxFQ1Q6CisJCUlWVFZfREVCVUdfSU9DVEwoIkFVRElPX0JJTElOR1VBTF9DSEFOTkVMX1NFTEVDVFxuIik7CisJCWlmIChhcmcgPiBBVURJT19TVEVSRU9fU1dBUFBFRCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpdHYtPmF1ZGlvX2JpbGluZ3VhbF9tb2RlID0gYXJnOworCQlpdnR2X3ZhcGkoaXR2LCBDWDIzNDFYX0RFQ19TRVRfQVVESU9fTU9ERSwgMiwgaXR2LT5hdWRpb19iaWxpbmd1YWxfbW9kZSwgaXR2LT5hdWRpb19zdGVyZW9fbW9kZSk7CisJCXJldHVybiAwOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXJldHVybiB2aWRlb191c2VyY29weShpbm9kZSwgZmlscCwgY21kLCBhcmcsIGl2dHZfdjRsMl9kb19pb2N0bCk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1pb2N0bC5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtaW9jdGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmNjZjdhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtaW9jdGwuaApAQCAtMCwwICsxLDI4IEBACisvKgorICAgIGlvY3RsIHN5c3RlbSBjYWxsCisgICAgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDQgIEtldmluIFRoYXllciA8bnVmYW5fd2ZrIGF0IHlhaG9vLmNvbT4KKyAgICBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNyAgSGFucyBWZXJrdWlsIDxodmVya3VpbEB4czRhbGwubmw+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKwordTE2IHNlcnZpY2UydmJpKGludCB0eXBlKTsKK3ZvaWQgZXhwYW5kX3NlcnZpY2Vfc2V0KHN0cnVjdCB2NGwyX3NsaWNlZF92YmlfZm9ybWF0ICpmbXQsIGludCBpc19wYWwpOwordTE2IGdldF9zZXJ2aWNlX3NldChzdHJ1Y3QgdjRsMl9zbGljZWRfdmJpX2Zvcm1hdCAqZm10KTsKK2ludCBpdnR2X3Y0bDJfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsCisJCSAgICB1bnNpZ25lZCBsb25nIGFyZyk7CitpbnQgaXZ0dl92NGwyX2lvY3RscyhzdHJ1Y3QgaXZ0diAqaXR2LCBzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKTsKK3ZvaWQgaXZ0dl9zZXRfb3NkX2FscGhhKHN0cnVjdCBpdnR2ICppdHYpOworaW50IGl2dHZfc2V0X3NwZWVkKHN0cnVjdCBpdnR2ICppdHYsIGludCBzcGVlZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1pcnEuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWlycS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzYTA0N2IKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1pcnEuYwpAQCAtMCwwICsxLDgzOCBAQAorLyogaW50ZXJydXB0IGhhbmRsaW5nCisgICAgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDQgIEtldmluIFRoYXllciA8bnVmYW5fd2ZrIGF0IHlhaG9vLmNvbT4KKyAgICBDb3B5cmlnaHQgKEMpIDIwMDQgIENocmlzIEtlbm5lZHkgPGNAZ3Jvb3Z5Lm9yZz4KKyAgICBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNyAgSGFucyBWZXJrdWlsIDxodmVya3VpbEB4czRhbGwubmw+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgIml2dHYtZHJpdmVyLmgiCisjaW5jbHVkZSAiaXZ0di1maXJtd2FyZS5oIgorI2luY2x1ZGUgIml2dHYtZmlsZW9wcy5oIgorI2luY2x1ZGUgIml2dHYtcXVldWUuaCIKKyNpbmNsdWRlICJpdnR2LXVkbWEuaCIKKyNpbmNsdWRlICJpdnR2LWlycS5oIgorI2luY2x1ZGUgIml2dHYtaW9jdGwuaCIKKyNpbmNsdWRlICJpdnR2LW1haWxib3guaCIKKyNpbmNsdWRlICJpdnR2LXZiaS5oIgorI2luY2x1ZGUgIml2dHYteXV2LmgiCisKKyNkZWZpbmUgRE1BX01BR0lDX0NPT0tJRSAweDAwMDAwMWZlCisKKyNkZWZpbmUgU0xJQ0VEX1ZCSV9QSU8gMQorCitzdGF0aWMgdm9pZCBpdnR2X2RtYV9kZWNfc3RhcnQoc3RydWN0IGl2dHZfc3RyZWFtICpzKTsKKworc3RhdGljIGNvbnN0IGludCBpdnR2X3N0cmVhbV9tYXBbXSA9IHsKKwlJVlRWX0VOQ19TVFJFQU1fVFlQRV9NUEcsCisJSVZUVl9FTkNfU1RSRUFNX1RZUEVfWVVWLAorCUlWVFZfRU5DX1NUUkVBTV9UWVBFX1BDTSwKKwlJVlRWX0VOQ19TVFJFQU1fVFlQRV9WQkksCit9OworCitzdGF0aWMgaW5saW5lIGludCBpdnR2X3VzZV9waW8oc3RydWN0IGl2dHZfc3RyZWFtICpzKQoreworCXN0cnVjdCBpdnR2ICppdHYgPSBzLT5pdHY7CisKKwlyZXR1cm4gcy0+ZG1hID09IFBDSV9ETUFfTk9ORSB8fAorCSAgICAoU0xJQ0VEX1ZCSV9QSU8gJiYgcy0+dHlwZSA9PSBJVlRWX0VOQ19TVFJFQU1fVFlQRV9WQkkgJiYgaXR2LT52Ymkuc2xpY2VkX2luLT5zZXJ2aWNlX3NldCk7Cit9CisKK3ZvaWQgaXZ0dl9pcnFfd29ya19oYW5kbGVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgaXZ0diAqaXR2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpdnR2LCBpcnFfd29ya19xdWV1ZSk7CisKKwlERUZJTkVfV0FJVCh3YWl0KTsKKworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoSVZUVl9GX0lfV09SS19IQU5ETEVSX1ZCSSwgJml0di0+aV9mbGFncykpCisJCXZiaV93b3JrX2hhbmRsZXIoaXR2KTsKKworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoSVZUVl9GX0lfV09SS19IQU5ETEVSX1lVViwgJml0di0+aV9mbGFncykpCisJCWl2dHZfeXV2X3dvcmtfaGFuZGxlcihpdHYpOworfQorCisvKiBEZXRlcm1pbmUgdGhlIHJlcXVpcmVkIERNQSBzaXplLCBzZXR1cCBlbm91Z2ggYnVmZmVycyBpbiB0aGUgcHJlZG1hIHF1ZXVlIGFuZAorICAgYWN0dWFsbHkgY29weSB0aGUgZGF0YSBmcm9tIHRoZSBjYXJkIHRvIHRoZSBidWZmZXJzIGluIGNhc2UgYSBQSU8gdHJhbnNmZXIgaXMKKyAgIHJlcXVpcmVkIGZvciB0aGlzIHN0cmVhbS4KKyAqLworc3RhdGljIGludCBzdHJlYW1fZW5jX2RtYV9hcHBlbmQoc3RydWN0IGl2dHZfc3RyZWFtICpzLCB1MzIgZGF0YVtDWDIzNDFYX01CT1hfTUFYX0RBVEFdKQoreworCXN0cnVjdCBpdnR2ICppdHYgPSBzLT5pdHY7CisJc3RydWN0IGl2dHZfYnVmZmVyICpidWY7CisJc3RydWN0IGxpc3RfaGVhZCAqcDsKKwl1MzIgYnl0ZXNfbmVlZGVkID0gMDsKKwl1MzIgb2Zmc2V0LCBzaXplOworCXUzMiBVVm9mZnNldCA9IDAsIFVWc2l6ZSA9IDA7CisJaW50IHNraXBfYnVmcyA9IHMtPnFfcHJlZG1hLmJ1ZmZlcnM7CisJaW50IGlkeCA9IHMtPlNHX2xlbmd0aDsKKwlpbnQgcmM7CisKKwkvKiBzYW5pdHkgY2hlY2tzICovCisJaWYgKHMtPnY0bDJkZXYgPT0gTlVMTCkgeworCQlJVlRWX0RFQlVHX1dBUk4oIlN0cmVhbSAlcyBub3Qgc3RhcnRlZFxuIiwgcy0+bmFtZSk7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKCF0ZXN0X2JpdChJVlRWX0ZfU19DTEFJTUVELCAmcy0+c19mbGFncykpIHsKKwkJSVZUVl9ERUJVR19XQVJOKCJTdHJlYW0gJXMgbm90IG9wZW5cbiIsIHMtPm5hbWUpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogZGV0ZXJtaW5lIG9mZnNldCwgc2l6ZSBhbmQgUFRTIGZvciB0aGUgdmFyaW91cyBzdHJlYW1zICovCisJc3dpdGNoIChzLT50eXBlKSB7CisJCWNhc2UgSVZUVl9FTkNfU1RSRUFNX1RZUEVfTVBHOgorCQkJb2Zmc2V0ID0gZGF0YVsxXTsKKwkJCXNpemUgPSBkYXRhWzJdOworCQkJcy0+ZG1hX3B0cyA9IDA7CisJCQlicmVhazsKKworCQljYXNlIElWVFZfRU5DX1NUUkVBTV9UWVBFX1lVVjoKKwkJCW9mZnNldCA9IGRhdGFbMV07CisJCQlzaXplID0gZGF0YVsyXTsKKwkJCVVWb2Zmc2V0ID0gZGF0YVszXTsKKwkJCVVWc2l6ZSA9IGRhdGFbNF07CisJCQlzLT5kbWFfcHRzID0gKCh1NjQpIGRhdGFbNV0gPDwgMzIpIHwgZGF0YVs2XTsKKwkJCWJyZWFrOworCisJCWNhc2UgSVZUVl9FTkNfU1RSRUFNX1RZUEVfUENNOgorCQkJb2Zmc2V0ID0gZGF0YVsxXSArIDEyOworCQkJc2l6ZSA9IGRhdGFbMl0gLSAxMjsKKwkJCXMtPmRtYV9wdHMgPSByZWFkX2RlYyhvZmZzZXQgLSA4KSB8CisJCQkJKCh1NjQpKHJlYWRfZGVjKG9mZnNldCAtIDEyKSkgPDwgMzIpOworCQkJaWYgKGl0di0+aGFzX2N4MjM0MTUpCisJCQkJb2Zmc2V0ICs9IElWVFZfREVDT0RFUl9PRkZTRVQ7CisJCQlicmVhazsKKworCQljYXNlIElWVFZfRU5DX1NUUkVBTV9UWVBFX1ZCSToKKwkJCXNpemUgPSBpdHYtPnZiaS5lbmNfc2l6ZSAqIGl0di0+dmJpLmZwaTsKKwkJCW9mZnNldCA9IHJlYWRfZW5jKGl0di0+dmJpLmVuY19zdGFydCAtIDQpICsgMTI7CisJCQlpZiAob2Zmc2V0ID09IDEyKSB7CisJCQkJSVZUVl9ERUJVR19JTkZPKCJWQkkgb2Zmc2V0ID09IDBcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXMtPmRtYV9wdHMgPSByZWFkX2VuYyhvZmZzZXQgLSA0KSB8ICgodTY0KXJlYWRfZW5jKG9mZnNldCAtIDgpIDw8IDMyKTsKKwkJCWJyZWFrOworCisJCWNhc2UgSVZUVl9ERUNfU1RSRUFNX1RZUEVfVkJJOgorCQkJc2l6ZSA9IHJlYWRfZGVjKGl0di0+dmJpLmRlY19zdGFydCArIDQpICsgODsKKwkJCW9mZnNldCA9IHJlYWRfZGVjKGl0di0+dmJpLmRlY19zdGFydCkgKyBpdHYtPnZiaS5kZWNfc3RhcnQ7CisJCQlzLT5kbWFfcHRzID0gMDsKKwkJCW9mZnNldCArPSBJVlRWX0RFQ09ERVJfT0ZGU0VUOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQkvKiBzaG91bGRuJ3QgaGFwcGVuICovCisJCQlyZXR1cm4gLTE7CisJfQorCisJLyogaWYgdGhpcyBpcyB0aGUgc3RhcnQgb2YgdGhlIERNQSB0aGVuIGZpbGwgaW4gdGhlIG1hZ2ljIGNvb2tpZSAqLworCWlmIChzLT5TR19sZW5ndGggPT0gMCkgeworCQlpZiAoaXR2LT5oYXNfY3gyMzQxNSAmJiAocy0+dHlwZSA9PSBJVlRWX0VOQ19TVFJFQU1fVFlQRV9QQ00gfHwKKwkJICAgIHMtPnR5cGUgPT0gSVZUVl9ERUNfU1RSRUFNX1RZUEVfVkJJKSkgeworCQkJcy0+ZG1hX2JhY2t1cCA9IHJlYWRfZGVjKG9mZnNldCAtIElWVFZfREVDT0RFUl9PRkZTRVQpOworCQkJd3JpdGVfZGVjX3N5bmMoY3B1X3RvX2xlMzIoRE1BX01BR0lDX0NPT0tJRSksIG9mZnNldCAtIElWVFZfREVDT0RFUl9PRkZTRVQpOworCQl9CisJCWVsc2UgeworCQkJcy0+ZG1hX2JhY2t1cCA9IHJlYWRfZW5jKG9mZnNldCk7CisJCQl3cml0ZV9lbmNfc3luYyhjcHVfdG9fbGUzMihETUFfTUFHSUNfQ09PS0lFKSwgb2Zmc2V0KTsKKwkJfQorCQlzLT5kbWFfb2Zmc2V0ID0gb2Zmc2V0OworCX0KKworCWJ5dGVzX25lZWRlZCA9IHNpemU7CisJaWYgKHMtPnR5cGUgPT0gSVZUVl9FTkNfU1RSRUFNX1RZUEVfWVVWKSB7CisJCS8qIFRoZSBzaXplIGZvciB0aGUgWSBzYW1wbGVzIG5lZWRzIHRvIGJlIHJvdW5kZWQgdXB3YXJkcyB0byBhCisJCSAgIG11bHRpcGxlIG9mIHRoZSBidWZfc2l6ZS4gVGhlIFVWIHNhbXBsZXMgdGhlbiBzdGFydCBpbiB0aGUKKwkJICAgbmV4dCBidWZmZXIuICovCisJCWJ5dGVzX25lZWRlZCA9IHMtPmJ1Zl9zaXplICogKChieXRlc19uZWVkZWQgKyBzLT5idWZfc2l6ZSAtIDEpIC8gcy0+YnVmX3NpemUpOworCQlieXRlc19uZWVkZWQgKz0gVVZzaXplOworCX0KKworCUlWVFZfREVCVUdfRE1BKCIlcyAlczogMHglMDh4IGJ5dGVzIGF0IDB4JTA4eFxuIiwKKwkJaXZ0dl91c2VfcGlvKHMpID8gIlBJTyIgOiAiRE1BIiwgcy0+bmFtZSwgYnl0ZXNfbmVlZGVkLCBvZmZzZXQpOworCisJcmMgPSBpdnR2X3F1ZXVlX21vdmUocywgJnMtPnFfZnJlZSwgJnMtPnFfZnVsbCwgJnMtPnFfcHJlZG1hLCBieXRlc19uZWVkZWQpOworCWlmIChyYyA8IDApIHsgLyogSW5zdWZmaWNpZW50IGJ1ZmZlcnMgKi8KKwkJSVZUVl9ERUJVR19XQVJOKCJDYW5ub3Qgb2J0YWluICVkIGJ5dGVzIGZvciAlcyBkYXRhIHRyYW5zZmVyXG4iLAorCQkJCWJ5dGVzX25lZWRlZCwgcy0+bmFtZSk7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKHJjICYmICFzLT5idWZmZXJzX3N0b2xlbiAmJiAocy0+c19mbGFncyAmIElWVFZfRl9TX0FQUExfSU8pKSB7CisJCUlWVFZfV0FSTigiQWxsICVzIHN0cmVhbSBidWZmZXJzIGFyZSBmdWxsLiBEcm9wcGluZyBkYXRhLlxuIiwgcy0+bmFtZSk7CisJCUlWVFZfV0FSTigiQ2F1c2U6IHRoZSBhcHBsaWNhdGlvbiBpcyBub3QgcmVhZGluZyBmYXN0IGVub3VnaC5cbiIpOworCX0KKwlzLT5idWZmZXJzX3N0b2xlbiA9IHJjOworCisJLyogZ290IHRoZSBidWZmZXJzLCBub3cgZmlsbCBpbiBTR2FycmF5IChETUEpIG9yIGNvcHkgdGhlIGRhdGEgZnJvbSB0aGUgY2FyZAorCSAgIHRvIHRoZSBidWZmZXJzIChQSU8pLiAqLworCWJ1ZiA9IGxpc3RfZW50cnkocy0+cV9wcmVkbWEubGlzdC5uZXh0LCBzdHJ1Y3QgaXZ0dl9idWZmZXIsIGxpc3QpOworCW1lbXNldChidWYtPmJ1ZiwgMCwgMTI4KTsKKwlsaXN0X2Zvcl9lYWNoKHAsICZzLT5xX3ByZWRtYS5saXN0KSB7CisJCXN0cnVjdCBpdnR2X2J1ZmZlciAqYnVmID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgaXZ0dl9idWZmZXIsIGxpc3QpOworCisJCWlmIChza2lwX2J1ZnMtLSA+IDApCisJCQljb250aW51ZTsKKwkJaWYgKCFpdnR2X3VzZV9waW8ocykpIHsKKwkJCXMtPlNHYXJyYXlbaWR4XS5kc3QgPSBjcHVfdG9fbGUzMihidWYtPmRtYV9oYW5kbGUpOworCQkJcy0+U0dhcnJheVtpZHhdLnNyYyA9IGNwdV90b19sZTMyKG9mZnNldCk7CisJCQlzLT5TR2FycmF5W2lkeF0uc2l6ZSA9IGNwdV90b19sZTMyKHMtPmJ1Zl9zaXplKTsKKwkJfQorCQlidWYtPmJ5dGVzdXNlZCA9IChzaXplIDwgcy0+YnVmX3NpemUpID8gc2l6ZSA6IHMtPmJ1Zl9zaXplOworCisJCS8qIElmIFBJTywgdGhlbiBjb3B5IHRoZSBkYXRhIGZyb20gdGhlIGNhcmQgdG8gdGhlIGJ1ZmZlciAqLworCQlpZiAocy0+dHlwZSA9PSBJVlRWX0RFQ19TVFJFQU1fVFlQRV9WQkkpIHsKKwkJCW1lbWNweV9mcm9taW8oYnVmLT5idWYsIGl0di0+ZGVjX21lbSArIG9mZnNldCAtIElWVFZfREVDT0RFUl9PRkZTRVQsIGJ1Zi0+Ynl0ZXN1c2VkKTsKKwkJfQorCQllbHNlIGlmIChpdnR2X3VzZV9waW8ocykpIHsKKwkJCW1lbWNweV9mcm9taW8oYnVmLT5idWYsIGl0di0+ZW5jX21lbSArIG9mZnNldCwgYnVmLT5ieXRlc3VzZWQpOworCQl9CisKKwkJcy0+cV9wcmVkbWEuYnl0ZXN1c2VkICs9IGJ1Zi0+Ynl0ZXN1c2VkOworCQlzaXplIC09IGJ1Zi0+Ynl0ZXN1c2VkOworCQlvZmZzZXQgKz0gcy0+YnVmX3NpemU7CisKKwkJLyogU3luYyBTRyBidWZmZXJzICovCisJCWl2dHZfYnVmX3N5bmNfZm9yX2RldmljZShzLCBidWYpOworCisJCWlmIChzaXplID09IDApIHsJLyogWVVWICovCisJCQkvKiBwcm9jZXNzIHRoZSBVViBzZWN0aW9uICovCisJCQlvZmZzZXQgPSBVVm9mZnNldDsKKwkJCXNpemUgPSBVVnNpemU7CisJCX0KKwkJaWR4Kys7CisJfQorCXMtPlNHX2xlbmd0aCA9IGlkeDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZG1hX3Bvc3Qoc3RydWN0IGl2dHZfc3RyZWFtICpzKQoreworCXN0cnVjdCBpdnR2ICppdHYgPSBzLT5pdHY7CisJc3RydWN0IGl2dHZfYnVmZmVyICpidWYgPSBOVUxMOworCXN0cnVjdCBsaXN0X2hlYWQgKnA7CisJdTMyIG9mZnNldDsKKwl1MzIgKnUzMmJ1ZjsKKwlpbnQgeCA9IDA7CisKKwlpZiAoaXZ0dl91c2VfcGlvKHMpKSB7CisJCWlmIChzLT5xX3ByZWRtYS5ieXRlc3VzZWQpCisJCQlpdnR2X3F1ZXVlX21vdmUocywgJnMtPnFfcHJlZG1hLCBOVUxMLCAmcy0+cV9kbWEsIHMtPnFfcHJlZG1hLmJ5dGVzdXNlZCk7CisJCXMtPlNHX2xlbmd0aCA9IDA7CisJfQorCUlWVFZfREVCVUdfRE1BKCIlcyAlcyBjb21wbGV0ZWQgKCV4KVxuIiwgaXZ0dl91c2VfcGlvKHMpID8gIlBJTyIgOiAiRE1BIiwKKwkJCXMtPm5hbWUsIHMtPmRtYV9vZmZzZXQpOworCWxpc3RfZm9yX2VhY2gocCwgJnMtPnFfZG1hLmxpc3QpIHsKKwkJYnVmID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgaXZ0dl9idWZmZXIsIGxpc3QpOworCQl1MzJidWYgPSAodTMyICopYnVmLT5idWY7CisKKwkJLyogU3luYyBCdWZmZXIgKi8KKwkJaXZ0dl9idWZfc3luY19mb3JfY3B1KHMsIGJ1Zik7CisKKwkJaWYgKHggPT0gMCkgeworCQkJb2Zmc2V0ID0gcy0+ZG1hX2xhc3Rfb2Zmc2V0OworCQkJaWYgKHUzMmJ1ZltvZmZzZXQgLyA0XSAhPSBETUFfTUFHSUNfQ09PS0lFKQorCQkJeworCQkJCWZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgNjQ7IG9mZnNldCsrKSB7CisJCQkJCWlmICh1MzJidWZbb2Zmc2V0XSA9PSBETUFfTUFHSUNfQ09PS0lFKSB7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCQlvZmZzZXQgKj0gNDsKKwkJCQlpZiAob2Zmc2V0ID09IDI1NikgeworCQkJCQlJVlRWX0RFQlVHX1dBUk4oIiVzOiBDb3VsZG4ndCBmaW5kIHN0YXJ0IG9mIGJ1ZmZlciB3aXRoaW4gdGhlIGZpcnN0IDI1NiBieXRlc1xuIiwgcy0+bmFtZSk7CisJCQkJCW9mZnNldCA9IHMtPmRtYV9sYXN0X29mZnNldDsKKwkJCQl9CisJCQkJaWYgKHMtPmRtYV9sYXN0X29mZnNldCAhPSBvZmZzZXQpCisJCQkJCUlWVFZfREVCVUdfV0FSTigiJXM6IG9mZnNldCAlZCAtPiAlZFxuIiwgcy0+bmFtZSwgcy0+ZG1hX2xhc3Rfb2Zmc2V0LCBvZmZzZXQpOworCQkJCXMtPmRtYV9sYXN0X29mZnNldCA9IG9mZnNldDsKKwkJCX0KKwkJCWlmIChpdHYtPmhhc19jeDIzNDE1ICYmIChzLT50eXBlID09IElWVFZfRU5DX1NUUkVBTV9UWVBFX1BDTSB8fAorCQkJCQkJcy0+dHlwZSA9PSBJVlRWX0RFQ19TVFJFQU1fVFlQRV9WQkkpKSB7CisJCQkJd3JpdGVfZGVjX3N5bmMoMCwgcy0+ZG1hX29mZnNldCAtIElWVFZfREVDT0RFUl9PRkZTRVQpOworCQkJfQorCQkJZWxzZSB7CisJCQkJd3JpdGVfZW5jX3N5bmMoMCwgcy0+ZG1hX29mZnNldCk7CisJCQl9CisJCQlpZiAob2Zmc2V0KSB7CisJCQkJYnVmLT5ieXRlc3VzZWQgLT0gb2Zmc2V0OworCQkJCW1lbWNweShidWYtPmJ1ZiwgYnVmLT5idWYgKyBvZmZzZXQsIGJ1Zi0+Ynl0ZXN1c2VkICsgb2Zmc2V0KTsKKwkJCX0KKwkJCSp1MzJidWYgPSBjcHVfdG9fbGUzMihzLT5kbWFfYmFja3VwKTsKKwkJfQorCQl4Kys7CisJCS8qIGZsYWcgYnl0ZXN3YXAgQUJDRCAtPiBEQ0JBIGZvciBNUEcgJiBWQkkgZGF0YSBvdXRzaWRlIGlycSAqLworCQlpZiAocy0+dHlwZSA9PSBJVlRWX0VOQ19TVFJFQU1fVFlQRV9NUEcgfHwKKwkJICAgIHMtPnR5cGUgPT0gSVZUVl9FTkNfU1RSRUFNX1RZUEVfVkJJKQorCQkJc2V0X2JpdChJVlRWX0ZfQl9ORUVEX0JVRl9TV0FQLCAmYnVmLT5iX2ZsYWdzKTsKKwl9CisJaWYgKGJ1ZikKKwkJYnVmLT5ieXRlc3VzZWQgKz0gcy0+ZG1hX2xhc3Rfb2Zmc2V0OworCWlmIChidWYgJiYgcy0+dHlwZSA9PSBJVlRWX0RFQ19TVFJFQU1fVFlQRV9WQkkpIHsKKwkJLyogUGFyc2UgYW5kIEdyb29tIFZCSSBEYXRhICovCisJCXMtPnFfZG1hLmJ5dGVzdXNlZCAtPSBidWYtPmJ5dGVzdXNlZDsKKwkJaXZ0dl9wcm9jZXNzX3ZiaV9kYXRhKGl0diwgYnVmLCAwLCBzLT50eXBlKTsKKwkJcy0+cV9kbWEuYnl0ZXN1c2VkICs9IGJ1Zi0+Ynl0ZXN1c2VkOworCQlpZiAocy0+aWQgPT0gLTEpIHsKKwkJCWl2dHZfcXVldWVfbW92ZShzLCAmcy0+cV9kbWEsIE5VTEwsICZzLT5xX2ZyZWUsIDApOworCQkJcmV0dXJuOworCQl9CisJfQorCWl2dHZfcXVldWVfbW92ZShzLCAmcy0+cV9kbWEsIE5VTEwsICZzLT5xX2Z1bGwsIHMtPnFfZG1hLmJ5dGVzdXNlZCk7CisJaWYgKHMtPmlkICE9IC0xKQorCQl3YWtlX3VwKCZzLT53YWl0cSk7Cit9CisKK3ZvaWQgaXZ0dl9kbWFfc3RyZWFtX2RlY19wcmVwYXJlKHN0cnVjdCBpdnR2X3N0cmVhbSAqcywgdTMyIG9mZnNldCwgaW50IGxvY2spCit7CisJc3RydWN0IGl2dHYgKml0diA9IHMtPml0djsKKwlzdHJ1Y3QgaXZ0dl9idWZmZXIgKmJ1ZjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwOworCXUzMiB5X3NpemUgPSBpdHYtPnBhcmFtcy5oZWlnaHQgKiBpdHYtPnBhcmFtcy53aWR0aDsKKwl1MzIgdXZfb2Zmc2V0ID0gb2Zmc2V0ICsgSVZUVl9ZVVZfQlVGRkVSX1VWX09GRlNFVDsKKwlpbnQgeV9kb25lID0gMDsKKwlpbnQgYnl0ZXNfd3JpdHRlbiA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CisJaW50IGlkeCA9IDA7CisKKwlJVlRWX0RFQlVHX0RNQSgiREVDIFBSRVBBUkUgRE1BICVzOiAlMDh4ICUwOHhcbiIsIHMtPm5hbWUsIHMtPnFfcHJlZG1hLmJ5dGVzdXNlZCwgb2Zmc2V0KTsKKwlidWYgPSBsaXN0X2VudHJ5KHMtPnFfcHJlZG1hLmxpc3QubmV4dCwgc3RydWN0IGl2dHZfYnVmZmVyLCBsaXN0KTsKKwlsaXN0X2Zvcl9lYWNoKHAsICZzLT5xX3ByZWRtYS5saXN0KSB7CisJCXN0cnVjdCBpdnR2X2J1ZmZlciAqYnVmID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgaXZ0dl9idWZmZXIsIGxpc3QpOworCisJCS8qIFlVViBVViBPZmZzZXQgZnJvbSBZIEJ1ZmZlciAqLworCQlpZiAocy0+dHlwZSA9PSBJVlRWX0RFQ19TVFJFQU1fVFlQRV9ZVVYgJiYgIXlfZG9uZSAmJiBieXRlc193cml0dGVuID49IHlfc2l6ZSkgeworCQkJb2Zmc2V0ID0gdXZfb2Zmc2V0OworCQkJeV9kb25lID0gMTsKKwkJfQorCQlzLT5TR2FycmF5W2lkeF0uc3JjID0gY3B1X3RvX2xlMzIoYnVmLT5kbWFfaGFuZGxlKTsKKwkJcy0+U0dhcnJheVtpZHhdLmRzdCA9IGNwdV90b19sZTMyKG9mZnNldCk7CisJCXMtPlNHYXJyYXlbaWR4XS5zaXplID0gY3B1X3RvX2xlMzIoYnVmLT5ieXRlc3VzZWQpOworCisJCW9mZnNldCArPSBidWYtPmJ5dGVzdXNlZDsKKwkJYnl0ZXNfd3JpdHRlbiArPSBidWYtPmJ5dGVzdXNlZDsKKworCQkvKiBTeW5jIFNHIGJ1ZmZlcnMgKi8KKwkJaXZ0dl9idWZfc3luY19mb3JfZGV2aWNlKHMsIGJ1Zik7CisJCWlkeCsrOworCX0KKwlzLT5TR19sZW5ndGggPSBpZHg7CisKKwkvKiBNYXJrIGxhc3QgYnVmZmVyIHNpemUgZm9yIEludGVycnVwdCBmbGFnICovCisJcy0+U0dhcnJheVtzLT5TR19sZW5ndGggLSAxXS5zaXplIHw9IGNwdV90b19sZTMyKDB4ODAwMDAwMDApOworCisJLyogU3luYyBIYXJkd2FyZSBTRyBMaXN0IG9mIGJ1ZmZlcnMgKi8KKwlpdnR2X3N0cmVhbV9zeW5jX2Zvcl9kZXZpY2Uocyk7CisJaWYgKGxvY2spCisJCXNwaW5fbG9ja19pcnFzYXZlKCZpdHYtPmRtYV9yZWdfbG9jaywgZmxhZ3MpOworCWlmICghdGVzdF9iaXQoSVZUVl9GX0lfRE1BLCAmaXR2LT5pX2ZsYWdzKSkgeworCQlpdnR2X2RtYV9kZWNfc3RhcnQocyk7CisJfQorCWVsc2UgeworCQlzZXRfYml0KElWVFZfRl9TX0RNQV9QRU5ESU5HLCAmcy0+c19mbGFncyk7CisJfQorCWlmIChsb2NrKQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpdHYtPmRtYV9yZWdfbG9jaywgZmxhZ3MpOworfQorCisvKiBzdGFydCB0aGUgZW5jb2RlciBETUEgKi8KK3N0YXRpYyB2b2lkIGl2dHZfZG1hX2VuY19zdGFydChzdHJ1Y3QgaXZ0dl9zdHJlYW0gKnMpCit7CisJc3RydWN0IGl2dHYgKml0diA9IHMtPml0djsKKwlzdHJ1Y3QgaXZ0dl9zdHJlYW0gKnNfdmJpID0gJml0di0+c3RyZWFtc1tJVlRWX0VOQ19TVFJFQU1fVFlQRV9WQkldOworCWludCBpOworCisJaWYgKHMtPnFfcHJlZG1hLmJ5dGVzdXNlZCkKKwkJaXZ0dl9xdWV1ZV9tb3ZlKHMsICZzLT5xX3ByZWRtYSwgTlVMTCwgJnMtPnFfZG1hLCBzLT5xX3ByZWRtYS5ieXRlc3VzZWQpOworCUlWVFZfREVCVUdfRE1BKCJzdGFydCBETUEgZm9yICVzXG4iLCBzLT5uYW1lKTsKKwlzLT5TR2FycmF5W3MtPlNHX2xlbmd0aCAtIDFdLnNpemUgPSBjcHVfdG9fbGUzMihsZTMyX3RvX2NwdShzLT5TR2FycmF5W3MtPlNHX2xlbmd0aCAtIDFdLnNpemUpICsgMjU2KTsKKworCS8qIElmIHRoaXMgaXMgYW4gTVBFRyBzdHJlYW0sIGFuZCBWQkkgZGF0YSBpcyBhbHNvIHBlbmRpbmcsIHRoZW4gYXBwZW5kIHRoZQorCSAgIFZCSSBETUEgdG8gdGhlIE1QRUcgRE1BIGFuZCB0cmFuc2ZlciBib3RoIHNldHMgb2YgZGF0YSBhdCBvbmNlLgorCisJICAgVkJJIERNQSBpcyBhIHNlY29uZCBjbGFzcyBjaXRpemVuIGNvbXBhcmVkIHRvIE1QRUcgYW5kIG1peGluZyB0aGVtIHRvZ2V0aGVyCisJICAgd2lsbCBjb25mdXNlIHRoZSBmaXJtd2FyZSAodGhlIGVuZCBvZiBhIFZCSSBETUEgaXMgc2VlbiBhcyB0aGUgZW5kIG9mIGEKKwkgICBNUEVHIERNQSwgdGh1cyBlZmZlY3RpdmVseSBkcm9wcGluZyBhbiBNUEVHIGZyYW1lKS4gU28gaW5zdGVhZCB3ZSBtYWtlCisJICAgc3VyZSB3ZSBvbmx5IHVzZSB0aGUgTVBFRyBETUEgdG8gdHJhbnNmZXIgdGhlIFZCSSBETUEgaWYgYm90aCBhcmUgaW4KKwkgICB1c2UuIFRoaXMgd2F5IG5vIGNvbmZsaWN0cyBvY2N1ci4gKi8KKwljbGVhcl9iaXQoSVZUVl9GX1NfRE1BX0hBU19WQkksICZzLT5zX2ZsYWdzKTsKKwlpZiAocy0+dHlwZSA9PSBJVlRWX0VOQ19TVFJFQU1fVFlQRV9NUEcgJiYgc192YmktPlNHX2xlbmd0aCAmJgorCQkJcy0+U0dfbGVuZ3RoICsgc192YmktPlNHX2xlbmd0aCA8PSBzLT5idWZmZXJzKSB7CisJCWl2dHZfcXVldWVfbW92ZShzX3ZiaSwgJnNfdmJpLT5xX3ByZWRtYSwgTlVMTCwgJnNfdmJpLT5xX2RtYSwgc192YmktPnFfcHJlZG1hLmJ5dGVzdXNlZCk7CisJCXNfdmJpLT5TR2FycmF5W3NfdmJpLT5TR19sZW5ndGggLSAxXS5zaXplID0gY3B1X3RvX2xlMzIobGUzMl90b19jcHUoc192YmktPlNHYXJyYXlbcy0+U0dfbGVuZ3RoIC0gMV0uc2l6ZSkgKyAyNTYpOworCQlmb3IgKGkgPSAwOyBpIDwgc192YmktPlNHX2xlbmd0aDsgaSsrKSB7CisJCQlzLT5TR2FycmF5W3MtPlNHX2xlbmd0aCsrXSA9IHNfdmJpLT5TR2FycmF5W2ldOworCQl9CisJCWl0di0+dmJpLmRtYV9vZmZzZXQgPSBzX3ZiaS0+ZG1hX29mZnNldDsKKwkJc192YmktPlNHX2xlbmd0aCA9IDA7CisJCXNldF9iaXQoSVZUVl9GX1NfRE1BX0hBU19WQkksICZzLT5zX2ZsYWdzKTsKKwkJSVZUVl9ERUJVR19ETUEoImluY2x1ZGUgRE1BIGZvciAlc1xuIiwgcy0+bmFtZSk7CisJfQorCisJLyogTWFyayBsYXN0IGJ1ZmZlciBzaXplIGZvciBJbnRlcnJ1cHQgZmxhZyAqLworCXMtPlNHYXJyYXlbcy0+U0dfbGVuZ3RoIC0gMV0uc2l6ZSB8PSBjcHVfdG9fbGUzMigweDgwMDAwMDAwKTsKKworCS8qIFN5bmMgSGFyZHdhcmUgU0cgTGlzdCBvZiBidWZmZXJzICovCisJaXZ0dl9zdHJlYW1fc3luY19mb3JfZGV2aWNlKHMpOworCXdyaXRlX3JlZyhzLT5TR19oYW5kbGUsIElWVFZfUkVHX0VOQ0RNQUFERFIpOworCXdyaXRlX3JlZ19zeW5jKHJlYWRfcmVnKElWVFZfUkVHX0RNQVhGRVIpIHwgMHgwMiwgSVZUVl9SRUdfRE1BWEZFUik7CisJc2V0X2JpdChJVlRWX0ZfSV9ETUEsICZpdHYtPmlfZmxhZ3MpOworCWl0di0+Y3VyX2RtYV9zdHJlYW0gPSBzLT50eXBlOworCWl0di0+ZG1hX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgSFogLyAxMDsKKwlhZGRfdGltZXIoJml0di0+ZG1hX3RpbWVyKTsKK30KKworc3RhdGljIHZvaWQgaXZ0dl9kbWFfZGVjX3N0YXJ0KHN0cnVjdCBpdnR2X3N0cmVhbSAqcykKK3sKKwlzdHJ1Y3QgaXZ0diAqaXR2ID0gcy0+aXR2OworCisJaWYgKHMtPnFfcHJlZG1hLmJ5dGVzdXNlZCkKKwkJaXZ0dl9xdWV1ZV9tb3ZlKHMsICZzLT5xX3ByZWRtYSwgTlVMTCwgJnMtPnFfZG1hLCBzLT5xX3ByZWRtYS5ieXRlc3VzZWQpOworCUlWVFZfREVCVUdfRE1BKCJzdGFydCBETUEgZm9yICVzXG4iLCBzLT5uYW1lKTsKKwkvKiBwdXQgU0cgSGFuZGxlIGludG8gcmVnaXN0ZXIgMHgwYyAqLworCXdyaXRlX3JlZyhzLT5TR19oYW5kbGUsIElWVFZfUkVHX0RFQ0RNQUFERFIpOworCXdyaXRlX3JlZ19zeW5jKHJlYWRfcmVnKElWVFZfUkVHX0RNQVhGRVIpIHwgMHgwMSwgSVZUVl9SRUdfRE1BWEZFUik7CisJc2V0X2JpdChJVlRWX0ZfSV9ETUEsICZpdHYtPmlfZmxhZ3MpOworCWl0di0+Y3VyX2RtYV9zdHJlYW0gPSBzLT50eXBlOworCWl0di0+ZG1hX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgSFogLyAxMDsKKwlhZGRfdGltZXIoJml0di0+ZG1hX3RpbWVyKTsKK30KKworc3RhdGljIHZvaWQgaXZ0dl9pcnFfZG1hX3JlYWQoc3RydWN0IGl2dHYgKml0dikKK3sKKwlzdHJ1Y3QgaXZ0dl9zdHJlYW0gKnMgPSBOVUxMOworCXN0cnVjdCBpdnR2X2J1ZmZlciAqYnVmOworCWludCBod19zdHJlYW1fdHlwZTsKKworCUlWVFZfREVCVUdfSVJRKCJERUMgRE1BIFJFQURcbiIpOworCWRlbF90aW1lcigmaXR2LT5kbWFfdGltZXIpOworCWlmIChyZWFkX3JlZyhJVlRWX1JFR19ETUFTVEFUVVMpICYgMHgxNCkgeworCQlJVlRWX0RFQlVHX1dBUk4oIkRFQyBETUEgRVJST1IgJXhcbiIsIHJlYWRfcmVnKElWVFZfUkVHX0RNQVNUQVRVUykpOworCQl3cml0ZV9yZWcocmVhZF9yZWcoSVZUVl9SRUdfRE1BU1RBVFVTKSAmIDMsIElWVFZfUkVHX0RNQVNUQVRVUyk7CisJfQorCWlmICghdGVzdF9iaXQoSVZUVl9GX0lfVURNQSwgJml0di0+aV9mbGFncykpIHsKKwkJaWYgKHRlc3RfYml0KElWVFZfRl9JX0RFQ19ZVVYsICZpdHYtPmlfZmxhZ3MpKSB7CisJCQlzID0gJml0di0+c3RyZWFtc1tJVlRWX0RFQ19TVFJFQU1fVFlQRV9ZVVZdOworCQkJaHdfc3RyZWFtX3R5cGUgPSAyOworCQl9CisJCWVsc2UgeworCQkJcyA9ICZpdHYtPnN0cmVhbXNbSVZUVl9ERUNfU1RSRUFNX1RZUEVfTVBHXTsKKwkJCWh3X3N0cmVhbV90eXBlID0gMDsKKwkJfQorCQlJVlRWX0RFQlVHX0RNQSgiREVDIERBVEEgUkVBRCAlczogJWRcbiIsIHMtPm5hbWUsIHMtPnFfZG1hLmJ5dGVzdXNlZCk7CisKKwkJaXZ0dl9zdHJlYW1fc3luY19mb3JfY3B1KHMpOworCisJCS8qIEZvciBzb21lIHJlYXNvbiBtdXN0IGtpY2sgdGhlIGZpcm13YXJlLCBsaWtlIFBJTyBtb2RlLAorCQkgICBJIHRoaW5rIHRoaXMgdGVsbHMgdGhlIGZpcm13YXJlIHdlIGFyZSBkb25lIGFuZCB0aGUgc2l6ZQorCQkgICBvZiB0aGUgeGZlciBzbyBpdCBjYW4gY2FsY3VsYXRlIHdoYXQgd2UgbmVlZCBuZXh0LgorCQkgICBJIHRoaW5rIHdlIGNhbiBkbyB0aGlzIHBhcnQgb3Vyc2VsdmVzIGJ1dCB3b3VsZCBoYXZlIHRvCisJCSAgIGZ1bGx5IGNhbGN1bGF0ZSB4ZmVyIGluZm8gb3Vyc2VsdmVzIGFuZCBub3QgdXNlIGludGVycnVwdHMKKwkJICovCisJCWl2dHZfdmFwaShpdHYsIENYMjM0MVhfREVDX1NDSEVEX0RNQV9GUk9NX0hPU1QsIDMsIDAsIHMtPnFfZG1hLmJ5dGVzdXNlZCwKKwkJCQlod19zdHJlYW1fdHlwZSk7CisKKwkJLyogRnJlZSBsYXN0IERNQSBjYWxsICovCisJCXdoaWxlICgoYnVmID0gaXZ0dl9kZXF1ZXVlKHMsICZzLT5xX2RtYSkpICE9IE5VTEwpIHsKKwkJCWl2dHZfYnVmX3N5bmNfZm9yX2NwdShzLCBidWYpOworCQkJaXZ0dl9lbnF1ZXVlKHMsIGJ1ZiwgJnMtPnFfZnJlZSk7CisJCX0KKwkJd2FrZV91cCgmcy0+d2FpdHEpOworCX0KKwljbGVhcl9iaXQoSVZUVl9GX0lfVURNQSwgJml0di0+aV9mbGFncyk7CisJY2xlYXJfYml0KElWVFZfRl9JX0RNQSwgJml0di0+aV9mbGFncyk7CisJaXR2LT5jdXJfZG1hX3N0cmVhbSA9IC0xOworCXdha2VfdXAoJml0di0+ZG1hX3dhaXRxKTsKK30KKworc3RhdGljIHZvaWQgaXZ0dl9pcnFfZW5jX2RtYV9jb21wbGV0ZShzdHJ1Y3QgaXZ0diAqaXR2KQoreworCXUzMiBkYXRhW0NYMjM0MVhfTUJPWF9NQVhfREFUQV07CisJc3RydWN0IGl2dHZfc3RyZWFtICpzOworCisJZGVsX3RpbWVyKCZpdHYtPmRtYV90aW1lcik7CisJaXZ0dl9hcGlfZ2V0X2RhdGEoJml0di0+ZW5jX21ib3gsIElWVFZfTUJPWF9ETUFfRU5ELCBkYXRhKTsKKwlJVlRWX0RFQlVHX0lSUSgiRU5DIERNQSBDT01QTEVURSAleCAlZFxuIiwgZGF0YVswXSwgZGF0YVsxXSk7CisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChJVlRWX0ZfSV9FTkNfVkJJLCAmaXR2LT5pX2ZsYWdzKSkKKwkJZGF0YVsxXSA9IDM7CisJZWxzZSBpZiAoZGF0YVsxXSA+IDIpCisJCXJldHVybjsKKwlzID0gJml0di0+c3RyZWFtc1tpdnR2X3N0cmVhbV9tYXBbZGF0YVsxXV1dOworCWlmIChkYXRhWzBdICYgMHgxOCkgeworCQlJVlRWX0RFQlVHX1dBUk4oIkVOQyBETUEgRVJST1IgJXhcbiIsIGRhdGFbMF0pOworCQl3cml0ZV9yZWcocmVhZF9yZWcoSVZUVl9SRUdfRE1BU1RBVFVTKSAmIDMsIElWVFZfUkVHX0RNQVNUQVRVUyk7CisJCWl2dHZfdmFwaShpdHYsIENYMjM0MVhfRU5DX1NDSEVEX0RNQV9UT19IT1NULCAzLCAwLCAwLCBkYXRhWzFdKTsKKwl9CisJcy0+U0dfbGVuZ3RoID0gMDsKKwljbGVhcl9iaXQoSVZUVl9GX0lfRE1BLCAmaXR2LT5pX2ZsYWdzKTsKKwlpdHYtPmN1cl9kbWFfc3RyZWFtID0gLTE7CisJZG1hX3Bvc3Qocyk7CisJaXZ0dl9zdHJlYW1fc3luY19mb3JfY3B1KHMpOworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoSVZUVl9GX1NfRE1BX0hBU19WQkksICZzLT5zX2ZsYWdzKSkgeworCQl1MzIgdG1wOworCisJCXMgPSAmaXR2LT5zdHJlYW1zW0lWVFZfRU5DX1NUUkVBTV9UWVBFX1ZCSV07CisJCXRtcCA9IHMtPmRtYV9vZmZzZXQ7CisJCXMtPmRtYV9vZmZzZXQgPSBpdHYtPnZiaS5kbWFfb2Zmc2V0OworCQlkbWFfcG9zdChzKTsKKwkJcy0+ZG1hX29mZnNldCA9IHRtcDsKKwl9CisJd2FrZV91cCgmaXR2LT5kbWFfd2FpdHEpOworfQorCitzdGF0aWMgdm9pZCBpdnR2X2lycV9kbWFfZXJyKHN0cnVjdCBpdnR2ICppdHYpCit7CisJdTMyIGRhdGFbQ1gyMzQxWF9NQk9YX01BWF9EQVRBXTsKKworCWRlbF90aW1lcigmaXR2LT5kbWFfdGltZXIpOworCWl2dHZfYXBpX2dldF9kYXRhKCZpdHYtPmVuY19tYm94LCBJVlRWX01CT1hfRE1BX0VORCwgZGF0YSk7CisJSVZUVl9ERUJVR19XQVJOKCJETUEgRVJST1IgJTA4eCAlMDh4ICUwOHggJWRcbiIsIGRhdGFbMF0sIGRhdGFbMV0sCisJCQkJCXJlYWRfcmVnKElWVFZfUkVHX0RNQVNUQVRVUyksIGl0di0+Y3VyX2RtYV9zdHJlYW0pOworCWlmICghdGVzdF9iaXQoSVZUVl9GX0lfVURNQSwgJml0di0+aV9mbGFncykgJiYKKwkgICAgaXR2LT5jdXJfZG1hX3N0cmVhbSA+PSAwICYmIGl0di0+Y3VyX2RtYV9zdHJlYW0gPCBJVlRWX01BWF9TVFJFQU1TKSB7CisJCXN0cnVjdCBpdnR2X3N0cmVhbSAqcyA9ICZpdHYtPnN0cmVhbXNbaXR2LT5jdXJfZG1hX3N0cmVhbV07CisKKwkJLyogcmV0cnkgKi8KKwkJd3JpdGVfcmVnKHJlYWRfcmVnKElWVFZfUkVHX0RNQVNUQVRVUykgJiAzLCBJVlRWX1JFR19ETUFTVEFUVVMpOworCQlpZiAocy0+dHlwZSA+PSBJVlRWX0RFQ19TVFJFQU1fVFlQRV9NUEcpCisJCQlpdnR2X2RtYV9kZWNfc3RhcnQocyk7CisJCWVsc2UKKwkJCWl2dHZfZG1hX2VuY19zdGFydChzKTsKKwkJcmV0dXJuOworCX0KKwljbGVhcl9iaXQoSVZUVl9GX0lfVURNQSwgJml0di0+aV9mbGFncyk7CisJY2xlYXJfYml0KElWVFZfRl9JX0RNQSwgJml0di0+aV9mbGFncyk7CisJaXR2LT5jdXJfZG1hX3N0cmVhbSA9IC0xOworCXdha2VfdXAoJml0di0+ZG1hX3dhaXRxKTsKK30KKworc3RhdGljIHZvaWQgaXZ0dl9pcnFfZW5jX3N0YXJ0X2NhcChzdHJ1Y3QgaXZ0diAqaXR2KQoreworCXUzMiBkYXRhW0NYMjM0MVhfTUJPWF9NQVhfREFUQV07CisJc3RydWN0IGl2dHZfc3RyZWFtICpzOworCisJLyogR2V0IERNQSBkZXN0aW5hdGlvbiBhbmQgc2l6ZSBhcmd1bWVudHMgZnJvbSBjYXJkICovCisJaXZ0dl9hcGlfZ2V0X2RhdGEoJml0di0+ZW5jX21ib3gsIElWVFZfTUJPWF9ETUEsIGRhdGEpOworCUlWVFZfREVCVUdfSVJRKCJFTkMgU1RBUlQgQ0FQICVkOiAlMDh4ICUwOHhcbiIsIGRhdGFbMF0sIGRhdGFbMV0sIGRhdGFbMl0pOworCisJaWYgKGRhdGFbMF0gPiAyIHx8IGRhdGFbMV0gPT0gMCB8fCBkYXRhWzJdID09IDApIHsKKwkJSVZUVl9ERUJVR19XQVJOKCJVbmtub3duIGlucHV0OiAlMDh4ICUwOHggJTA4eFxuIiwKKwkJCQlkYXRhWzBdLCBkYXRhWzFdLCBkYXRhWzJdKTsKKwkJcmV0dXJuOworCX0KKwljbGVhcl9iaXQoSVZUVl9GX0lfRU5DX1ZCSSwgJml0di0+aV9mbGFncyk7CisJcyA9ICZpdHYtPnN0cmVhbXNbaXZ0dl9zdHJlYW1fbWFwW2RhdGFbMF1dXTsKKwlpZiAoIXN0cmVhbV9lbmNfZG1hX2FwcGVuZChzLCBkYXRhKSkgeworCQlpZiAoaXZ0dl91c2VfcGlvKHMpKSB7CisJCQlkbWFfcG9zdChzKTsKKwkJCWl2dHZfdmFwaShpdHYsIENYMjM0MVhfRU5DX1NDSEVEX0RNQV9UT19IT1NULCAzLCAwLCAwLCBkYXRhWzBdKTsKKwkJfQorCQllbHNlIHsKKwkJCXNldF9iaXQoSVZUVl9GX1NfRE1BX1BFTkRJTkcsICZzLT5zX2ZsYWdzKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgaXZ0dl9pcnFfZW5jX3ZiaV9jYXAoc3RydWN0IGl2dHYgKml0dikKK3sKKwlzdHJ1Y3QgaXZ0dl9zdHJlYW0gKnNfbXBnID0gJml0di0+c3RyZWFtc1tJVlRWX0VOQ19TVFJFQU1fVFlQRV9NUEddOworCXUzMiBkYXRhW0NYMjM0MVhfTUJPWF9NQVhfREFUQV07CisJc3RydWN0IGl2dHZfc3RyZWFtICpzOworCisJSVZUVl9ERUJVR19JUlEoIkVOQyBTVEFSVCBWQkkgQ0FQXG4iKTsKKwlzID0gJml0di0+c3RyZWFtc1tJVlRWX0VOQ19TVFJFQU1fVFlQRV9WQkldOworCisJaWYgKGl2dHZfdXNlX3BpbyhzKSkgeworCQlpZiAoc3RyZWFtX2VuY19kbWFfYXBwZW5kKHMsIGRhdGEpKQorCQkJcmV0dXJuOworCQlpZiAocy0+cV9wcmVkbWEuYnl0ZXN1c2VkKQorCQkJaXZ0dl9xdWV1ZV9tb3ZlKHMsICZzLT5xX3ByZWRtYSwgTlVMTCwgJnMtPnFfZG1hLCBzLT5xX3ByZWRtYS5ieXRlc3VzZWQpOworCQlzLT5TR19sZW5ndGggPSAwOworCQlkbWFfcG9zdChzKTsKKwkJcmV0dXJuOworCX0KKwkvKiBJZiBtb3JlIHRoYW4gdHdvIFZCSSBidWZmZXJzIGFyZSBwZW5kaW5nLCB0aGVuCisJICAgY2xlYXIgdGhlIG9sZCBvbmVzIGFuZCBzdGFydCB3aXRoIHRoaXMgbmV3IG9uZS4KKwkgICBUaGlzIGNhbiBoYXBwZW4gZHVyaW5nIHRyYW5zaXRpb24gc3RhZ2VzIHdoZW4gTVBFRyBjYXB0dXJpbmcgaXMKKwkgICBzdGFydGVkLCBidXQgdGhlIGZpcnN0IGludGVycnVwdHMgaGF2ZW4ndCBhcnJpdmVkIHlldC4gRHVyaW5nCisJICAgdGhhdCBwZXJpb2QgVkJJIHJlcXVlc3RzIGNhbiBhY2N1bXVsYXRlIHdpdGhvdXQgYmVpbmcgYWJsZSB0bworCSAgIERNQSB0aGUgZGF0YS4gU2luY2UgYXQgbW9zdCBmb3VyIFZCSSBETUEgYnVmZmVycyBhcmUgYXZhaWxhYmxlLAorCSAgIHdlIGp1c3QgZHJvcCB0aGUgb2xkIHJlcXVlc3RzIHdoZW4gdGhlcmUgYXJlIGFscmVhZHkgdGhyZWUKKwkgICByZXF1ZXN0cyBxdWV1ZWQuICovCisJaWYgKHMtPlNHX2xlbmd0aCA+IDIpIHsKKwkJc3RydWN0IGxpc3RfaGVhZCAqcDsKKwkJbGlzdF9mb3JfZWFjaChwLCAmcy0+cV9wcmVkbWEubGlzdCkgeworCQkJc3RydWN0IGl2dHZfYnVmZmVyICpidWYgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBpdnR2X2J1ZmZlciwgbGlzdCk7CisJCQlpdnR2X2J1Zl9zeW5jX2Zvcl9jcHUocywgYnVmKTsKKwkJfQorCQlpdnR2X3F1ZXVlX21vdmUocywgJnMtPnFfcHJlZG1hLCBOVUxMLCAmcy0+cV9mcmVlLCAwKTsKKwkJcy0+U0dfbGVuZ3RoID0gMDsKKwl9CisJLyogaWYgd2UgY2FuIGFwcGVuZCB0aGUgZGF0YSwgYW5kIHRoZSBNUEVHIHN0cmVhbSBpc24ndCBjYXB0dXJpbmcsCisJICAgdGhlbiBzdGFydCBhIERNQSByZXF1ZXN0IGZvciBqdXN0IHRoZSBWQkkgZGF0YS4gKi8KKwlpZiAoIXN0cmVhbV9lbmNfZG1hX2FwcGVuZChzLCBkYXRhKSAmJgorCQkJIXRlc3RfYml0KElWVFZfRl9TX1NUUkVBTUlORywgJnNfbXBnLT5zX2ZsYWdzKSkgeworCQlzZXRfYml0KElWVFZfRl9JX0VOQ19WQkksICZpdHYtPmlfZmxhZ3MpOworCQlzZXRfYml0KElWVFZfRl9TX0RNQV9QRU5ESU5HLCAmcy0+c19mbGFncyk7CisJfQorfQorCitzdGF0aWMgdm9pZCBpdnR2X2lycV9kZXZfdmJpX3JlaW5zZXJ0KHN0cnVjdCBpdnR2ICppdHYpCit7CisJdTMyIGRhdGFbQ1gyMzQxWF9NQk9YX01BWF9EQVRBXTsKKwlzdHJ1Y3QgaXZ0dl9zdHJlYW0gKnMgPSAmaXR2LT5zdHJlYW1zW0lWVFZfREVDX1NUUkVBTV9UWVBFX1ZCSV07CisKKwlJVlRWX0RFQlVHX0lSUSgiREVDIFZCSSBSRUlOU0VSVFxuIik7CisJaWYgKHRlc3RfYml0KElWVFZfRl9TX0NMQUlNRUQsICZzLT5zX2ZsYWdzKSAmJgorCQkJIXN0cmVhbV9lbmNfZG1hX2FwcGVuZChzLCBkYXRhKSkgeworCQlkbWFfcG9zdChzKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGl2dHZfaXJxX2RlY19kYXRhX3JlcShzdHJ1Y3QgaXZ0diAqaXR2KQoreworCXUzMiBkYXRhW0NYMjM0MVhfTUJPWF9NQVhfREFUQV07CisJc3RydWN0IGl2dHZfc3RyZWFtICpzOworCisJLyogWVVWIG9yIE1QRyAqLworCWl2dHZfYXBpX2dldF9kYXRhKCZpdHYtPmRlY19tYm94LCBJVlRWX01CT1hfRE1BLCBkYXRhKTsKKworCWlmICh0ZXN0X2JpdChJVlRWX0ZfSV9ERUNfWVVWLCAmaXR2LT5pX2ZsYWdzKSkgeworCQlpdHYtPmRtYV9kYXRhX3JlcV9zaXplID0gaXR2LT5wYXJhbXMud2lkdGggKiBpdHYtPnBhcmFtcy5oZWlnaHQgKiAzIC8gMjsKKwkJaXR2LT5kbWFfZGF0YV9yZXFfb2Zmc2V0ID0gZGF0YVsxXSA/IGRhdGFbMV0gOiB5dXZfb2Zmc2V0WzBdOworCQlzID0gJml0di0+c3RyZWFtc1tJVlRWX0RFQ19TVFJFQU1fVFlQRV9ZVVZdOworCX0KKwllbHNlIHsKKwkJaXR2LT5kbWFfZGF0YV9yZXFfc2l6ZSA9IGRhdGFbMl0gPj0gMHgxMDAwMCA/IDB4MTAwMDAgOiBkYXRhWzJdOworCQlpdHYtPmRtYV9kYXRhX3JlcV9vZmZzZXQgPSBkYXRhWzFdOworCQlzID0gJml0di0+c3RyZWFtc1tJVlRWX0RFQ19TVFJFQU1fVFlQRV9NUEddOworCX0KKwlJVlRWX0RFQlVHX0lSUSgiREVDIERBVEEgUkVRICVzOiAlZCAlMDh4ICV1XG4iLCBzLT5uYW1lLCBzLT5xX2Z1bGwuYnl0ZXN1c2VkLAorCQkgICAgICAgaXR2LT5kbWFfZGF0YV9yZXFfb2Zmc2V0LCBpdHYtPmRtYV9kYXRhX3JlcV9zaXplKTsKKwlpZiAoaXR2LT5kbWFfZGF0YV9yZXFfc2l6ZSA9PSAwIHx8IHMtPnFfZnVsbC5ieXRlc3VzZWQgPCBpdHYtPmRtYV9kYXRhX3JlcV9zaXplKSB7CisJCXNldF9iaXQoSVZUVl9GX1NfTkVFRFNfREFUQSwgJnMtPnNfZmxhZ3MpOworCX0KKwllbHNlIHsKKwkJY2xlYXJfYml0KElWVFZfRl9TX05FRURTX0RBVEEsICZzLT5zX2ZsYWdzKTsKKwkJaXZ0dl9xdWV1ZV9tb3ZlKHMsICZzLT5xX2Z1bGwsIE5VTEwsICZzLT5xX3ByZWRtYSwgaXR2LT5kbWFfZGF0YV9yZXFfc2l6ZSk7CisJCWl2dHZfZG1hX3N0cmVhbV9kZWNfcHJlcGFyZShzLCBpdHYtPmRtYV9kYXRhX3JlcV9vZmZzZXQgKyBJVlRWX0RFQ09ERVJfT0ZGU0VULCAwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGl2dHZfaXJxX3ZzeW5jKHN0cnVjdCBpdnR2ICppdHYpCit7CisJLyogVGhlIHZzeW5jIGludGVycnVwdCBpcyB1bnVzdWFsIGluIHRoYXQgaXQgd29uJ3QgY2xlYXIgdW50aWwKKwkgKiB0aGUgZW5kIG9mIHRoZSBmaXJzdCBsaW5lIGZvciB0aGUgY3VycmVudCBmaWVsZCwgYXQgd2hpY2gKKwkgKiBwb2ludCBpdCBjbGVhcnMgaXRzZWxmLiBUaGlzIGNhbiByZXN1bHQgaW4gcmVwZWF0ZWQgdnN5bmMKKwkgKiBpbnRlcnJ1cHRzLCBvciBhIG1pc3NlZCB2c3luYy4gUmVhZCBzb21lIG9mIHRoZSByZWdpc3RlcnMKKwkgKiB0byBkZXRlcm1pbmUgdGhlIGxpbmUgYmVpbmcgZGlzcGxheWVkIGFuZCBlbnN1cmUgd2UgaGFuZGxlCisJICogb25lIHZzeW5jIHBlciBmcmFtZS4KKwkgKi8KKwl1bnNpZ25lZCBpbnQgZnJhbWUgPSByZWFkX3JlZygweDI4YzApICYgMTsKKwlpbnQgbGFzdF9kbWFfZnJhbWUgPSBhdG9taWNfcmVhZCgmaXR2LT55dXZfaW5mby5uZXh0X2RtYV9mcmFtZSk7CisKKwlpZiAoMCkgSVZUVl9ERUJVR19JUlEoIkRFQyBWU1lOQ1xuIik7CisKKwlpZiAoKChmcmFtZSBeIGl0di0+eXV2X2luZm8ubGFjZV9zeW5jX2ZpZWxkKSA9PSAwICYmICgoaXR2LT5sYXN0VnN5bmNGcmFtZSAmIDEpIF4gaXR2LT55dXZfaW5mby5sYWNlX3N5bmNfZmllbGQpKSB8fAorCQkJKGZyYW1lICE9IChpdHYtPmxhc3RWc3luY0ZyYW1lICYgMSkgJiYgIWl0di0+eXV2X2luZm8uZnJhbWVfaW50ZXJsYWNlZCkpIHsKKwkJaW50IG5leHRfZG1hX2ZyYW1lID0gbGFzdF9kbWFfZnJhbWU7CisKKwkJaWYgKG5leHRfZG1hX2ZyYW1lID49IDAgJiYgbmV4dF9kbWFfZnJhbWUgIT0gYXRvbWljX3JlYWQoJml0di0+eXV2X2luZm8ubmV4dF9maWxsX2ZyYW1lKSkgeworCQkJd3JpdGVfcmVnKHl1dl9vZmZzZXRbbmV4dF9kbWFfZnJhbWVdID4+IDQsIDB4ODJjKTsKKwkJCXdyaXRlX3JlZygoeXV2X29mZnNldFtuZXh0X2RtYV9mcmFtZV0gKyBJVlRWX1lVVl9CVUZGRVJfVVZfT0ZGU0VUKSA+PiA0LCAweDgzMCk7CisJCQl3cml0ZV9yZWcoeXV2X29mZnNldFtuZXh0X2RtYV9mcmFtZV0gPj4gNCwgMHg4MzQpOworCQkJd3JpdGVfcmVnKCh5dXZfb2Zmc2V0W25leHRfZG1hX2ZyYW1lXSArIElWVFZfWVVWX0JVRkZFUl9VVl9PRkZTRVQpID4+IDQsIDB4ODM4KTsKKwkJCW5leHRfZG1hX2ZyYW1lID0gKG5leHRfZG1hX2ZyYW1lICsgMSkgJiAweDM7CisJCQlhdG9taWNfc2V0KCZpdHYtPnl1dl9pbmZvLm5leHRfZG1hX2ZyYW1lLCBuZXh0X2RtYV9mcmFtZSk7CisJCX0KKwl9CisJaWYgKGZyYW1lICE9IChpdHYtPmxhc3RWc3luY0ZyYW1lICYgMSkpIHsKKwkJc3RydWN0IGl2dHZfc3RyZWFtICpzID0gaXZ0dl9nZXRfb3V0cHV0X3N0cmVhbShpdHYpOworCQlpbnQgd29yayA9IDA7CisKKwkJaXR2LT5sYXN0VnN5bmNGcmFtZSArPSAxOworCQlpZiAoZnJhbWUgPT0gMCkgeworCQkJY2xlYXJfYml0KElWVFZfRl9JX1ZBTElEX0RFQ19USU1JTkdTLCAmaXR2LT5pX2ZsYWdzKTsKKwkJCWNsZWFyX2JpdChJVlRWX0ZfSV9FVl9WU1lOQ19GSUVMRCwgJml0di0+aV9mbGFncyk7CisJCX0KKwkJZWxzZSB7CisJCQlzZXRfYml0KElWVFZfRl9JX0VWX1ZTWU5DX0ZJRUxELCAmaXR2LT5pX2ZsYWdzKTsKKwkJfQorCQlpZiAodGVzdF9iaXQoSVZUVl9GX0lfRVZfVlNZTkNfRU5BQkxFRCwgJml0di0+aV9mbGFncykpIHsKKwkJCXNldF9iaXQoSVZUVl9GX0lfRVZfVlNZTkMsICZpdHYtPmlfZmxhZ3MpOworCQkJd2FrZV91cCgmaXR2LT5ldmVudF93YWl0cSk7CisJCX0KKwkJd2FrZV91cCgmaXR2LT52c3luY193YWl0cSk7CisJCWlmIChzKQorCQkJd2FrZV91cCgmcy0+d2FpdHEpOworCisJCS8qIFNlbmQgVkJJIHRvIHNhYTcxMjcgKi8KKwkJaWYgKGZyYW1lKSB7CisJCQlzZXRfYml0KElWVFZfRl9JX1dPUktfSEFORExFUl9WQkksICZpdHYtPmlfZmxhZ3MpOworCQkJd29yayA9IDE7CisJCX0KKworCQkvKiBDaGVjayBpZiB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgeXV2IHJlZ2lzdGVycyAqLworCQlpZiAoKGl0di0+eXV2X2luZm8ueXV2X2ZvcmNlZF91cGRhdGUgfHwgaXR2LT55dXZfaW5mby5uZXdfZnJhbWVfaW5mb1tsYXN0X2RtYV9mcmFtZV0udXBkYXRlKSAmJiBsYXN0X2RtYV9mcmFtZSAhPSAtMSkgeworCQkJaWYgKCFpdHYtPnl1dl9pbmZvLm5ld19mcmFtZV9pbmZvW2xhc3RfZG1hX2ZyYW1lXS51cGRhdGUpCisJCQkJbGFzdF9kbWFfZnJhbWUgPSAobGFzdF9kbWFfZnJhbWUgLSAxKSAmIDM7CisKKwkJCWlmIChpdHYtPnl1dl9pbmZvLm5ld19mcmFtZV9pbmZvW2xhc3RfZG1hX2ZyYW1lXS5zcmNfdykgeworCQkJCWl0di0+eXV2X2luZm8udXBkYXRlX2ZyYW1lID0gbGFzdF9kbWFfZnJhbWU7CisJCQkJaXR2LT55dXZfaW5mby5uZXdfZnJhbWVfaW5mb1tsYXN0X2RtYV9mcmFtZV0udXBkYXRlID0gMDsKKwkJCQlpdHYtPnl1dl9pbmZvLnl1dl9mb3JjZWRfdXBkYXRlID0gMDsKKwkJCQlzZXRfYml0KElWVFZfRl9JX1dPUktfSEFORExFUl9ZVVYsICZpdHYtPmlfZmxhZ3MpOworCQkJCXdvcmsgPSAxOworCQkJfQorCQl9CisJCWlmICh3b3JrKQorCQkJcXVldWVfd29yayhpdHYtPmlycV93b3JrX3F1ZXVlcywgJml0di0+aXJxX3dvcmtfcXVldWUpOworCX0KK30KKworI2RlZmluZSBJVlRWX0lSUV9ETUEgKElWVFZfSVJRX0RNQV9SRUFEIHwgSVZUVl9JUlFfRU5DX0RNQV9DT01QTEVURSB8IElWVFZfSVJRX0RNQV9FUlIgfCBJVlRWX0lSUV9FTkNfU1RBUlRfQ0FQIHwgSVZUVl9JUlFfRU5DX1ZCSV9DQVAgfCBJVlRWX0lSUV9ERUNfREFUQV9SRVEpCisKK2lycXJldHVybl90IGl2dHZfaXJxX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBpdnR2ICppdHYgPSAoc3RydWN0IGl2dHYgKilkZXZfaWQ7CisJdTMyIGNvbWJvOworCXUzMiBzdGF0OworCWludCBpOworCXU4IHZzeW5jX2ZvcmNlID0gMDsKKworCXNwaW5fbG9jaygmaXR2LT5kbWFfcmVnX2xvY2spOworCS8qIGdldCBjb250ZW50cyBvZiBpcnEgc3RhdHVzIHJlZ2lzdGVyICovCisJc3RhdCA9IHJlYWRfcmVnKElWVFZfUkVHX0lSUVNUQVRVUyk7CisKKwljb21ibyA9IH5pdHYtPmlycW1hc2sgJiBzdGF0OworCisJLyogQ2xlYXIgb3V0IElSUSAqLworCWlmIChjb21ibykgd3JpdGVfcmVnKGNvbWJvLCBJVlRWX1JFR19JUlFTVEFUVVMpOworCisJaWYgKDAgPT0gY29tYm8pIHsKKwkJLyogVGhlIHZzeW5jIGludGVycnVwdCBpcyB1bnVzdWFsIGFuZCBjbGVhcnMgaXRzZWxmLiBJZiB3ZQorCQkgKiB0b29rIHRvbyBsb25nLCB3ZSBtYXkgaGF2ZSBtaXNzZWQgaXQuIERvIHNvbWUgY2hlY2tzCisJCSAqLworCQlpZiAofml0di0+aXJxbWFzayAmIElWVFZfSVJRX0RFQ19WU1lOQykgeworCQkJLyogdnN5bmMgaXMgZW5hYmxlZCwgc2VlIGlmIHdlJ3JlIGluIGEgbmV3IGZpZWxkICovCisJCQlpZiAoKGl0di0+bGFzdFZzeW5jRnJhbWUgJiAxKSAhPSAocmVhZF9yZWcoMHgyOGMwKSAmIDEpKSB7CisJCQkJLyogTmV3IGZpZWxkLCBsb29rcyBsaWtlIHdlIG1pc3NlZCBpdCAqLworCQkJCUlWVFZfREVCVUdfWVVWKCJWU3luYyBpbnRlcnJ1cHQgbWlzc2VkICVkXG4iLHJlYWRfcmVnKDB4MjhjMCk+PjE2KTsKKwkJCQl2c3luY19mb3JjZSA9IDE7CisJCQl9CisJCX0KKworCQlpZiAoIXZzeW5jX2ZvcmNlKSB7CisJCQkvKiBObyBWc3luYyBleHBlY3RlZCwgd2Fzbid0IGZvciB1cyAqLworCQkJc3Bpbl91bmxvY2soJml0di0+ZG1hX3JlZ19sb2NrKTsKKwkJCXJldHVybiBJUlFfTk9ORTsKKwkJfQorCX0KKworCS8qIEV4Y2x1ZGUgaW50ZXJydXB0cyBub3RlZCBiZWxvdyBmcm9tIHRoZSBvdXRwdXQsIG90aGVyd2lzZSB0aGUgbG9nIGlzIGZsb29kZWQgd2l0aAorCSAgIHRoZXNlIG1lc3NhZ2VzICovCisJaWYgKGNvbWJvICYgfjB4ZmY2ZDA0MDApCisJCUlWVFZfREVCVUdfSVJRKCI9PT09PT09IHZhbGlkIElSUSBiaXRzOiAweCUwOHggPT09PT09XG4iLCBjb21ibyk7CisKKwlpZiAoY29tYm8gJiBJVlRWX0lSUV9ERUNfRE1BX0NPTVBMRVRFKSB7CisJCUlWVFZfREVCVUdfSVJRKCJERUMgRE1BIENPTVBMRVRFXG4iKTsKKwl9CisKKwlpZiAoY29tYm8gJiBJVlRWX0lSUV9ETUFfUkVBRCkgeworCQlpdnR2X2lycV9kbWFfcmVhZChpdHYpOworCX0KKworCWlmIChjb21ibyAmIElWVFZfSVJRX0VOQ19ETUFfQ09NUExFVEUpIHsKKwkJaXZ0dl9pcnFfZW5jX2RtYV9jb21wbGV0ZShpdHYpOworCX0KKworCWlmIChjb21ibyAmIElWVFZfSVJRX0RNQV9FUlIpIHsKKwkJaXZ0dl9pcnFfZG1hX2VycihpdHYpOworCX0KKworCWlmIChjb21ibyAmIElWVFZfSVJRX0VOQ19TVEFSVF9DQVApIHsKKwkJaXZ0dl9pcnFfZW5jX3N0YXJ0X2NhcChpdHYpOworCX0KKworCWlmIChjb21ibyAmIElWVFZfSVJRX0VOQ19WQklfQ0FQKSB7CisJCWl2dHZfaXJxX2VuY192YmlfY2FwKGl0dik7CisJfQorCisJaWYgKGNvbWJvICYgSVZUVl9JUlFfREVDX1ZCSV9SRV9JTlNFUlQpIHsKKwkJaXZ0dl9pcnFfZGV2X3ZiaV9yZWluc2VydChpdHYpOworCX0KKworCWlmIChjb21ibyAmIElWVFZfSVJRX0VOQ19FT1MpIHsKKwkJSVZUVl9ERUJVR19JUlEoIkVOQyBFT1NcbiIpOworCQlzZXRfYml0KElWVFZfRl9JX0VPUywgJml0di0+aV9mbGFncyk7CisJCXdha2VfdXAoJml0di0+Y2FwX3cpOworCX0KKworCWlmIChjb21ibyAmIElWVFZfSVJRX0RFQ19EQVRBX1JFUSkgeworCQlpdnR2X2lycV9kZWNfZGF0YV9yZXEoaXR2KTsKKwl9CisKKwkvKiBEZWNvZGVyIFZlcnRpY2FsIFN5bmMgLSBXZSBjYW4ndCByZWx5IG9uICdjb21ibycsIHNvIGNoZWNrIGlmIHZzeW5jIGVuYWJsZWQgKi8KKwlpZiAofml0di0+aXJxbWFzayAmIElWVFZfSVJRX0RFQ19WU1lOQykgeworCQlpdnR2X2lycV92c3luYyhpdHYpOworCX0KKworCWlmIChjb21ibyAmIElWVFZfSVJRX0VOQ19WSU1fUlNUKSB7CisJCUlWVFZfREVCVUdfSVJRKCJWSU0gUlNUXG4iKTsKKwkJLyppdnR2X3ZhcGkoaXR2LCBDWDIzNDFYX0VOQ19SRUZSRVNIX0lOUFVULCAwKTsgKi8KKwl9CisKKwlpZiAoY29tYm8gJiBJVlRWX0lSUV9ERUNfQVVEX01PREVfQ0hHKSB7CisJCUlWVFZfREVCVUdfSU5GTygiU3RlcmVvIG1vZGUgY2hhbmdlZFxuIik7CisJfQorCisJaWYgKChjb21ibyAmIElWVFZfSVJRX0RNQSkgJiYgIXRlc3RfYml0KElWVFZfRl9JX0RNQSwgJml0di0+aV9mbGFncykpIHsKKwkJZm9yIChpID0gMDsgaSA8IElWVFZfTUFYX1NUUkVBTVM7IGkrKykgeworCQkJaW50IGlkeCA9IChpICsgaXR2LT5pcnFfcnJfaWR4KyspICUgSVZUVl9NQVhfU1RSRUFNUzsKKwkJCXN0cnVjdCBpdnR2X3N0cmVhbSAqcyA9ICZpdHYtPnN0cmVhbXNbaWR4XTsKKworCQkJaWYgKCF0ZXN0X2FuZF9jbGVhcl9iaXQoSVZUVl9GX1NfRE1BX1BFTkRJTkcsICZzLT5zX2ZsYWdzKSkKKwkJCQljb250aW51ZTsKKwkJCWlmIChzLT50eXBlID49IElWVFZfREVDX1NUUkVBTV9UWVBFX01QRykKKwkJCQlpdnR2X2RtYV9kZWNfc3RhcnQocyk7CisJCQllbHNlCisJCQkJaXZ0dl9kbWFfZW5jX3N0YXJ0KHMpOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGkgPT0gSVZUVl9NQVhfU1RSRUFNUyAmJiB0ZXN0X2FuZF9jbGVhcl9iaXQoSVZUVl9GX0lfVURNQV9QRU5ESU5HLCAmaXR2LT5pX2ZsYWdzKSkgeworCQkJaXZ0dl91ZG1hX3N0YXJ0KGl0dik7CisJCX0KKwl9CisKKwlzcGluX3VubG9jaygmaXR2LT5kbWFfcmVnX2xvY2spOworCisJLyogSWYgd2UndmUganVzdCBoYW5kbGVkIGEgJ2ZvcmNlZCcgdnN5bmMsIGl0J3Mgc2FmZXN0IHRvIHNheSBpdAorCSAqIHdhc24ndCBvdXJzLiBBbm90aGVyIGRldmljZSBtYXkgaGF2ZSB0cmlnZ2VyZWQgaXQgYXQganVzdAorCSAqIHRoZSByaWdodCB0aW1lLgorCSAqLworCXJldHVybiB2c3luY19mb3JjZSA/IElSUV9OT05FIDogSVJRX0hBTkRMRUQ7Cit9CisKK3ZvaWQgaXZ0dl91bmZpbmlzaGVkX2RtYSh1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgaXZ0diAqaXR2ID0gKHN0cnVjdCBpdnR2ICopYXJnOworCisJaWYgKCF0ZXN0X2JpdChJVlRWX0ZfSV9ETUEsICZpdHYtPmlfZmxhZ3MpKQorCQlyZXR1cm47CisJSVZUVl9FUlIoIkRNQSBUSU1FT1VUICUwOHggJWRcbiIsIHJlYWRfcmVnKElWVFZfUkVHX0RNQVNUQVRVUyksIGl0di0+Y3VyX2RtYV9zdHJlYW0pOworCisJd3JpdGVfcmVnKHJlYWRfcmVnKElWVFZfUkVHX0RNQVNUQVRVUykgJiAzLCBJVlRWX1JFR19ETUFTVEFUVVMpOworCWNsZWFyX2JpdChJVlRWX0ZfSV9VRE1BLCAmaXR2LT5pX2ZsYWdzKTsKKwljbGVhcl9iaXQoSVZUVl9GX0lfRE1BLCAmaXR2LT5pX2ZsYWdzKTsKKwlpdHYtPmN1cl9kbWFfc3RyZWFtID0gLTE7CisJd2FrZV91cCgmaXR2LT5kbWFfd2FpdHEpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtaXJxLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1pcnEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDMzNDhhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtaXJxLmgKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAgICBpbnRlcnJ1cHQgaGFuZGxpbmcKKyAgICBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNCAgS2V2aW4gVGhheWVyIDxudWZhbl93ZmsgYXQgeWFob28uY29tPgorICAgIENvcHlyaWdodCAoQykgMjAwNCAgQ2hyaXMgS2VubmVkeSA8Y0Bncm9vdnkub3JnPgorICAgIENvcHlyaWdodCAoQykgMjAwNS0yMDA3ICBIYW5zIFZlcmt1aWwgPGh2ZXJrdWlsQHhzNGFsbC5ubD4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCitpcnFyZXR1cm5fdCBpdnR2X2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCk7CisKK3ZvaWQgaXZ0dl9pcnFfd29ya19oYW5kbGVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7Cit2b2lkIGl2dHZfZG1hX3N0cmVhbV9kZWNfcHJlcGFyZShzdHJ1Y3QgaXZ0dl9zdHJlYW0gKnMsIHUzMiBvZmZzZXQsIGludCBsb2NrKTsKK3ZvaWQgaXZ0dl91bmZpbmlzaGVkX2RtYSh1bnNpZ25lZCBsb25nIGFyZyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1tYWlsYm94LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1tYWlsYm94LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFlNDJhMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LW1haWxib3guYwpAQCAtMCwwICsxLDM2MCBAQAorLyoKKyAgICBtYWlsYm94IGZ1bmN0aW9ucworICAgIENvcHlyaWdodCAoQykgMjAwMy0yMDA0ICBLZXZpbiBUaGF5ZXIgPG51ZmFuX3dmayBhdCB5YWhvby5jb20+CisgICAgQ29weXJpZ2h0IChDKSAyMDA0ICBDaHJpcyBLZW5uZWR5IDxjQGdyb292eS5vcmc+CisgICAgQ29weXJpZ2h0IChDKSAyMDA1LTIwMDcgIEhhbnMgVmVya3VpbCA8aHZlcmt1aWxAeHM0YWxsLm5sPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworI2luY2x1ZGUgIml2dHYtZHJpdmVyLmgiCisjaW5jbHVkZSAiaXZ0di1tYWlsYm94LmgiCisKKy8qIEZpcm13YXJlIG1haWxib3ggZmxhZ3MqLworI2RlZmluZSBJVlRWX01CT1hfRklSTVdBUkVfRE9ORSAweDAwMDAwMDA0CisjZGVmaW5lIElWVFZfTUJPWF9EUklWRVJfRE9ORSAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgSVZUVl9NQk9YX0RSSVZFUl9CVVNZICAgMHgwMDAwMDAwMQorI2RlZmluZSBJVlRWX01CT1hfRlJFRSAJCTB4MDAwMDAwMDAKKworLyogRmlybXdhcmUgbWFpbGJveCBzdGFuZGFyZCB0aW1lb3V0ICovCisjZGVmaW5lIElWVFZfQVBJX1NURF9USU1FT1VUIAkweDAyMDAwMDAwCisKKyNkZWZpbmUgQVBJX0NBQ0hFIAkgKDEgPDwgMCkgCS8qIEFsbG93IHRoZSBjb21tYW5kIHRvIGJlIHN0b3JlZCBpbiB0aGUgY2FjaGUgKi8KKyNkZWZpbmUgQVBJX1JFU1VMVAkgKDEgPDwgMSkgCS8qIEFsbG93IDEgc2Vjb25kIGZvciB0aGlzIGNtZCB0byBlbmQgKi8KKyNkZWZpbmUgQVBJX0ZBU1RfUkVTVUxUCSAoMyA8PCAxKQkvKiBBbGxvdyAwLjEgc2Vjb25kIGZvciB0aGlzIGNtZCB0byBlbmQgKi8KKyNkZWZpbmUgQVBJX0RNQSAJICgxIDw8IDMpCS8qIERNQSBtYWlsYm94LCBoYXMgc3BlY2lhbCBoYW5kbGluZyAqLworI2RlZmluZSBBUElfTk9fV0FJVF9NQiAJICgxIDw8IDQpCS8qIENvbW1hbmQgbWF5IG5vdCB3YWl0IGZvciBhIGZyZWUgbWFpbGJveCAqLworI2RlZmluZSBBUElfTk9fV0FJVF9SRVMJICgxIDw8IDUpCS8qIENvbW1hbmQgbWF5IG5vdCB3YWl0IGZvciB0aGUgcmVzdWx0ICovCisKK3N0cnVjdCBpdnR2X2FwaV9pbmZvIHsKKwlpbnQgZmxhZ3M7CQkvKiBGbGFncywgc2VlIGFib3ZlICovCisJY29uc3QgY2hhciAqbmFtZTsgCS8qIFRoZSBuYW1lIG9mIHRoZSBjb21tYW5kICovCit9OworCisjZGVmaW5lIEFQSV9FTlRSWSh4LCBmKSBbeF0gPSB7IChmKSwgI3ggfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGl2dHZfYXBpX2luZm8gYXBpX2luZm9bMjU2XSA9IHsKKwkvKiBNUEVHIGVuY29kZXIgQVBJICovCisJQVBJX0VOVFJZKENYMjM0MVhfRU5DX1BJTkdfRlcsIAkJCUFQSV9GQVNUX1JFU1VMVCksCisJQVBJX0VOVFJZKENYMjM0MVhfRU5DX1NUQVJUX0NBUFRVUkUsIAkJQVBJX1JFU1VMVCksCisJQVBJX0VOVFJZKENYMjM0MVhfRU5DX1NUT1BfQ0FQVFVSRSwgCQlBUElfUkVTVUxUKSwKKwlBUElfRU5UUlkoQ1gyMzQxWF9FTkNfU0VUX0FVRElPX0lELCAJCUFQSV9DQUNIRSksCisJQVBJX0VOVFJZKENYMjM0MVhfRU5DX1NFVF9WSURFT19JRCwgCQlBUElfQ0FDSEUpLAorCUFQSV9FTlRSWShDWDIzNDFYX0VOQ19TRVRfUENSX0lELCAJCUFQSV9DQUNIRSksCisJQVBJX0VOVFJZKENYMjM0MVhfRU5DX1NFVF9GUkFNRV9SQVRFLCAJCUFQSV9DQUNIRSksCisJQVBJX0VOVFJZKENYMjM0MVhfRU5DX1NFVF9GUkFNRV9TSVpFLCAJCUFQSV9DQUNIRSksCisJQVBJX0VOVFJZKENYMjM0MVhfRU5DX1NFVF9CSVRfUkFURSwgCQlBUElfQ0FDSEUpLAorCUFQSV9FTlRSWShDWDIzNDFYX0VOQ19TRVRfR09QX1BST1BFUlRJRVMsIAlBUElfQ0FDSEUpLAorCUFQSV9FTlRSWShDWDIzNDFYX0VOQ19TRVRfQVNQRUNUX1JBVElPLCAJQVBJX0NBQ0hFKSwKKwlBUElfRU5UUlkoQ1gyMzQxWF9FTkNfU0VUX0ROUl9GSUxURVJfTU9ERSwgCUFQSV9DQUNIRSksCisJQVBJX0VOVFJZKENYMjM0MVhfRU5DX1NFVF9ETlJfRklMVEVSX1BST1BTLCAJQVBJX0NBQ0hFKSwKKwlBUElfRU5UUlkoQ1gyMzQxWF9FTkNfU0VUX0NPUklOR19MRVZFTFMsIAlBUElfQ0FDSEUpLAorCUFQSV9FTlRSWShDWDIzNDFYX0VOQ19TRVRfU1BBVElBTF9GSUxURVJfVFlQRSwgCUFQSV9DQUNIRSksCisJQVBJX0VOVFJZKENYMjM0MVhfRU5DX1NFVF9WQklfTElORSwgCQlBUElfUkVTVUxUKSwKKwlBUElfRU5UUlkoQ1gyMzQxWF9FTkNfU0VUX1NUUkVBTV9UWVBFLCAJCUFQSV9DQUNIRSksCisJQVBJX0VOVFJZKENYMjM0MVhfRU5DX1NFVF9PVVRQVVRfUE9SVCwgCQlBUElfQ0FDSEUpLAorCUFQSV9FTlRSWShDWDIzNDFYX0VOQ19TRVRfQVVESU9fUFJPUEVSVElFUywgCUFQSV9DQUNIRSksCisJQVBJX0VOVFJZKENYMjM0MVhfRU5DX0hBTFRfRlcsIAkJCUFQSV9GQVNUX1JFU1VMVCksCisJQVBJX0VOVFJZKENYMjM0MVhfRU5DX0dFVF9WRVJTSU9OLCAJCUFQSV9GQVNUX1JFU1VMVCksCisJQVBJX0VOVFJZKENYMjM0MVhfRU5DX1NFVF9HT1BfQ0xPU1VSRSwgCQlBUElfQ0FDSEUpLAorCUFQSV9FTlRSWShDWDIzNDFYX0VOQ19HRVRfU0VRX0VORCwgCQlBUElfUkVTVUxUKSwKKwlBUElfRU5UUlkoQ1gyMzQxWF9FTkNfU0VUX1BHTV9JTkRFWF9JTkZPLCAJQVBJX0ZBU1RfUkVTVUxUKSwKKwlBUElfRU5UUlkoQ1gyMzQxWF9FTkNfU0VUX1ZCSV9DT05GSUcsIAkJQVBJX1JFU1VMVCksCisJQVBJX0VOVFJZKENYMjM0MVhfRU5DX1NFVF9ETUFfQkxPQ0tfU0laRSwgCUFQSV9DQUNIRSksCisJQVBJX0VOVFJZKENYMjM0MVhfRU5DX0dFVF9QUkVWX0RNQV9JTkZPX01CXzEwLCAJQVBJX0ZBU1RfUkVTVUxUKSwKKwlBUElfRU5UUlkoQ1gyMzQxWF9FTkNfR0VUX1BSRVZfRE1BX0lORk9fTUJfOSwgCUFQSV9GQVNUX1JFU1VMVCksCisJQVBJX0VOVFJZKENYMjM0MVhfRU5DX1NDSEVEX0RNQV9UT19IT1NULCAJQVBJX0RNQSksCisJQVBJX0VOVFJZKENYMjM0MVhfRU5DX0lOSVRJQUxJWkVfSU5QVVQsIAlBUElfUkVTVUxUKSwKKwlBUElfRU5UUlkoQ1gyMzQxWF9FTkNfU0VUX0ZSQU1FX0RST1BfUkFURSwgCUFQSV9DQUNIRSksCisJQVBJX0VOVFJZKENYMjM0MVhfRU5DX1BBVVNFX0VOQ09ERVIsIAkJQVBJX1JFU1VMVCksCisJQVBJX0VOVFJZKENYMjM0MVhfRU5DX1JFRlJFU0hfSU5QVVQsIAkJQVBJX05PX1dBSVRfTUIpLAorCUFQSV9FTlRSWShDWDIzNDFYX0VOQ19TRVRfQ09QWVJJR0hULCAJCUFQSV9DQUNIRSksCisJQVBJX0VOVFJZKENYMjM0MVhfRU5DX1NFVF9FVkVOVF9OT1RJRklDQVRJT04sIAlBUElfUkVTVUxUKSwKKwlBUElfRU5UUlkoQ1gyMzQxWF9FTkNfU0VUX05VTV9WU1lOQ19MSU5FUywgCUFQSV9DQUNIRSksCisJQVBJX0VOVFJZKENYMjM0MVhfRU5DX1NFVF9QTEFDRUhPTERFUiwgCQlBUElfQ0FDSEUpLAorCUFQSV9FTlRSWShDWDIzNDFYX0VOQ19NVVRFX1ZJREVPLCAJCUFQSV9SRVNVTFQpLAorCUFQSV9FTlRSWShDWDIzNDFYX0VOQ19NVVRFX0FVRElPLCAJCUFQSV9SRVNVTFQpLAorCUFQSV9FTlRSWShDWDIzNDFYX0VOQ19TRVRfVkVSVF9DUk9QX0xJTkUsCUFQSV9GQVNUX1JFU1VMVCksCisJQVBJX0VOVFJZKENYMjM0MVhfRU5DX01JU0MsIAkJCUFQSV9GQVNUX1JFU1VMVCksCisJLyogT2Jzb2xldGUgUFVMTERPV04gQVBJIGNvbW1hbmQgKi8KKwlBUElfRU5UUlkoMHhiMSwgCQkJCUFQSV9DQUNIRSksCisKKwkvKiBNUEVHIGRlY29kZXIgQVBJICovCisJQVBJX0VOVFJZKENYMjM0MVhfREVDX1BJTkdfRlcsIAkJCUFQSV9GQVNUX1JFU1VMVCksCisJQVBJX0VOVFJZKENYMjM0MVhfREVDX1NUQVJUX1BMQVlCQUNLLCAJCUFQSV9SRVNVTFQpLAorCUFQSV9FTlRSWShDWDIzNDFYX0RFQ19TVE9QX1BMQVlCQUNLLCAJCUFQSV9SRVNVTFQpLAorCUFQSV9FTlRSWShDWDIzNDFYX0RFQ19TRVRfUExBWUJBQ0tfU1BFRUQsIAlBUElfUkVTVUxUKSwKKwlBUElfRU5UUlkoQ1gyMzQxWF9ERUNfU1RFUF9WSURFTywgCQlBUElfUkVTVUxUKSwKKwlBUElfRU5UUlkoQ1gyMzQxWF9ERUNfU0VUX0RNQV9CTE9DS19TSVpFLCAJQVBJX0NBQ0hFKSwKKwlBUElfRU5UUlkoQ1gyMzQxWF9ERUNfR0VUX1hGRVJfSU5GTywgCQlBUElfRkFTVF9SRVNVTFQpLAorCUFQSV9FTlRSWShDWDIzNDFYX0RFQ19HRVRfRE1BX1NUQVRVUywgCQlBUElfRkFTVF9SRVNVTFQpLAorCUFQSV9FTlRSWShDWDIzNDFYX0RFQ19TQ0hFRF9ETUFfRlJPTV9IT1NULCAJQVBJX0RNQSksCisJQVBJX0VOVFJZKENYMjM0MVhfREVDX1BBVVNFX1BMQVlCQUNLLCAJCUFQSV9SRVNVTFQpLAorCUFQSV9FTlRSWShDWDIzNDFYX0RFQ19IQUxUX0ZXLCAJCQlBUElfRkFTVF9SRVNVTFQpLAorCUFQSV9FTlRSWShDWDIzNDFYX0RFQ19TRVRfU1RBTkRBUkQsIAkJQVBJX0NBQ0hFKSwKKwlBUElfRU5UUlkoQ1gyMzQxWF9ERUNfR0VUX1ZFUlNJT04sIAkJQVBJX0ZBU1RfUkVTVUxUKSwKKwlBUElfRU5UUlkoQ1gyMzQxWF9ERUNfU0VUX1NUUkVBTV9JTlBVVCwgCUFQSV9DQUNIRSksCisJQVBJX0VOVFJZKENYMjM0MVhfREVDX0dFVF9USU1JTkdfSU5GTywgCQlBUElfUkVTVUxUIC8qfCBBUElfTk9fV0FJVF9SRVMqLyksCisJQVBJX0VOVFJZKENYMjM0MVhfREVDX1NFVF9BVURJT19NT0RFLCAJCUFQSV9DQUNIRSksCisJQVBJX0VOVFJZKENYMjM0MVhfREVDX1NFVF9FVkVOVF9OT1RJRklDQVRJT04sIAlBUElfUkVTVUxUKSwKKwlBUElfRU5UUlkoQ1gyMzQxWF9ERUNfU0VUX0RJU1BMQVlfQlVGRkVSUywgCUFQSV9DQUNIRSksCisJQVBJX0VOVFJZKENYMjM0MVhfREVDX0VYVFJBQ1RfVkJJLCAJCUFQSV9SRVNVTFQpLAorCUFQSV9FTlRSWShDWDIzNDFYX0RFQ19TRVRfREVDT0RFUl9TT1VSQ0UsIAlBUElfRkFTVF9SRVNVTFQpLAorCUFQSV9FTlRSWShDWDIzNDFYX0RFQ19TRVRfUFJFQlVGRkVSSU5HLCAJQVBJX0NBQ0hFKSwKKworCS8qIE9TRCBBUEkgKi8KKwlBUElfRU5UUlkoQ1gyMzQxWF9PU0RfR0VUX0ZSQU1FQlVGRkVSLCAJCUFQSV9GQVNUX1JFU1VMVCksCisJQVBJX0VOVFJZKENYMjM0MVhfT1NEX0dFVF9QSVhFTF9GT1JNQVQsIAlBUElfRkFTVF9SRVNVTFQpLAorCUFQSV9FTlRSWShDWDIzNDFYX09TRF9TRVRfUElYRUxfRk9STUFULCAJQVBJX0NBQ0hFKSwKKwlBUElfRU5UUlkoQ1gyMzQxWF9PU0RfR0VUX1NUQVRFLCAJCUFQSV9GQVNUX1JFU1VMVCksCisJQVBJX0VOVFJZKENYMjM0MVhfT1NEX1NFVF9TVEFURSwgCQlBUElfQ0FDSEUpLAorCUFQSV9FTlRSWShDWDIzNDFYX09TRF9HRVRfT1NEX0NPT1JEUywgCQlBUElfRkFTVF9SRVNVTFQpLAorCUFQSV9FTlRSWShDWDIzNDFYX09TRF9TRVRfT1NEX0NPT1JEUywgCQlBUElfQ0FDSEUpLAorCUFQSV9FTlRSWShDWDIzNDFYX09TRF9HRVRfU0NSRUVOX0NPT1JEUywgCUFQSV9GQVNUX1JFU1VMVCksCisJQVBJX0VOVFJZKENYMjM0MVhfT1NEX1NFVF9TQ1JFRU5fQ09PUkRTLCAJQVBJX0NBQ0hFKSwKKwlBUElfRU5UUlkoQ1gyMzQxWF9PU0RfR0VUX0dMT0JBTF9BTFBIQSwgCUFQSV9GQVNUX1JFU1VMVCksCisJQVBJX0VOVFJZKENYMjM0MVhfT1NEX1NFVF9HTE9CQUxfQUxQSEEsIAlBUElfQ0FDSEUpLAorCUFQSV9FTlRSWShDWDIzNDFYX09TRF9TRVRfQkxFTkRfQ09PUkRTLCAJQVBJX0NBQ0hFKSwKKwlBUElfRU5UUlkoQ1gyMzQxWF9PU0RfR0VUX0ZMSUNLRVJfU1RBVEUsIAlBUElfRkFTVF9SRVNVTFQpLAorCUFQSV9FTlRSWShDWDIzNDFYX09TRF9TRVRfRkxJQ0tFUl9TVEFURSwgCUFQSV9DQUNIRSksCisJQVBJX0VOVFJZKENYMjM0MVhfT1NEX0JMVF9DT1BZLCAJCUFQSV9SRVNVTFQpLAorCUFQSV9FTlRSWShDWDIzNDFYX09TRF9CTFRfRklMTCwgCQlBUElfUkVTVUxUKSwKKwlBUElfRU5UUlkoQ1gyMzQxWF9PU0RfQkxUX1RFWFQsIAkJQVBJX1JFU1VMVCksCisJQVBJX0VOVFJZKENYMjM0MVhfT1NEX1NFVF9GUkFNRUJVRkZFUl9XSU5ET1csIAlBUElfQ0FDSEUpLAorCUFQSV9FTlRSWShDWDIzNDFYX09TRF9TRVRfQ0hST01BX0tFWSwgCQlBUElfQ0FDSEUpLAorCUFQSV9FTlRSWShDWDIzNDFYX09TRF9HRVRfQUxQSEFfQ09OVEVOVF9JTkRFWCwgCUFQSV9GQVNUX1JFU1VMVCksCisJQVBJX0VOVFJZKENYMjM0MVhfT1NEX1NFVF9BTFBIQV9DT05URU5UX0lOREVYLCAJQVBJX0NBQ0hFKQorfTsKKworc3RhdGljIGludCB0cnlfbWFpbGJveChzdHJ1Y3QgaXZ0diAqaXR2LCBzdHJ1Y3QgaXZ0dl9tYWlsYm94X2RhdGEgKm1iZGF0YSwgaW50IG1iKQoreworCXUzMiBmbGFncyA9IHJlYWRsKCZtYmRhdGEtPm1ib3hbbWJdLmZsYWdzKTsKKwlpbnQgaXNfZnJlZSA9IGZsYWdzID09IElWVFZfTUJPWF9GUkVFIHx8IChmbGFncyAmIElWVFZfTUJPWF9GSVJNV0FSRV9ET05FKTsKKworCS8qIGlmIHRoZSBtYWlsYm94IGlzIGZyZWUsIHRoZW4gdHJ5IHRvIGNsYWltIGl0ICovCisJaWYgKGlzX2ZyZWUgJiYgIXRlc3RfYW5kX3NldF9iaXQobWIsICZtYmRhdGEtPmJ1c3kpKSB7CisJCXdyaXRlX3N5bmMoSVZUVl9NQk9YX0RSSVZFUl9CVVNZLCAmbWJkYXRhLT5tYm94W21iXS5mbGFncyk7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogVHJ5IHRvIGZpbmQgYSBmcmVlIG1haWxib3guIE5vdGUgbWFpbGJveCAwIGlzIHJlc2VydmVkIGZvciBETUEgYW5kIHNvIGlzIG5vdAorICAgYXR0ZW1wdGVkIGhlcmUuICovCitzdGF0aWMgaW50IGdldF9tYWlsYm94KHN0cnVjdCBpdnR2ICppdHYsIHN0cnVjdCBpdnR2X21haWxib3hfZGF0YSAqbWJkYXRhLCBpbnQgZmxhZ3MpCit7CisJdW5zaWduZWQgbG9uZyB0aGVuID0gamlmZmllczsKKwlpbnQgaSwgbWI7CisJaW50IG1heF9tYm94ID0gbWJkYXRhLT5tYXhfbWJveDsKKwlpbnQgcmV0cmllcyA9IDEwMDsKKworCS8qIEFsbCBzbG93IGNvbW1hbmRzIHVzZSB0aGUgc2FtZSBtYWlsYm94LCBzZXJpYWxpemluZyB0aGVtIGFuZCBhbHNvCisJICAgbGVhdmluZyB0aGUgb3RoZXIgbWFpbGJveCBmcmVlIGZvciBzaW1wbGUgZmFzdCBjb21tYW5kcy4gKi8KKwlpZiAoKGZsYWdzICYgQVBJX0ZBU1RfUkVTVUxUKSA9PSBBUElfUkVTVUxUKQorCQltYXhfbWJveCA9IDE7CisKKwkvKiBmaW5kIGZyZWUgbm9uLURNQSBtYWlsYm94ICovCisJZm9yIChpID0gMDsgaSA8IHJldHJpZXM7IGkrKykgeworCQlmb3IgKG1iID0gMTsgbWIgPD0gbWF4X21ib3g7IG1iKyspCisJCQlpZiAodHJ5X21haWxib3goaXR2LCBtYmRhdGEsIG1iKSkKKwkJCQlyZXR1cm4gbWI7CisKKwkJLyogU2xlZXAgYmVmb3JlIGEgcmV0cnksIGlmIG5vdCBhdG9taWMgKi8KKwkJaWYgKCEoZmxhZ3MgJiBBUElfTk9fV0FJVF9NQikpIHsKKwkJCWlmIChqaWZmaWVzIC0gdGhlbiA+IHJldHJpZXMgKiBIWiAvIDEwMCkKKwkJCSAgICAgICBicmVhazsKKwkJCWl2dHZfc2xlZXBfdGltZW91dChIWiAvIDEwMCwgMCk7CisJCX0KKwl9CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyB2b2lkIHdyaXRlX21haWxib3godm9sYXRpbGUgc3RydWN0IGl2dHZfbWFpbGJveCBfX2lvbWVtICptYm94LCBpbnQgY21kLCBpbnQgYXJncywgdTMyIGRhdGFbXSkKK3sKKwlpbnQgaTsKKworCXdyaXRlX3N5bmMoY21kLCAmbWJveC0+Y21kKTsKKwl3cml0ZV9zeW5jKElWVFZfQVBJX1NURF9USU1FT1VULCAmbWJveC0+dGltZW91dCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQ1gyMzQxWF9NQk9YX01BWF9EQVRBOyBpKyspCisJCXdyaXRlX3N5bmMoZGF0YVtpXSwgJm1ib3gtPmRhdGFbaV0pOworCisJd3JpdGVfc3luYyhJVlRWX01CT1hfRFJJVkVSX0RPTkUgfCBJVlRWX01CT1hfRFJJVkVSX0JVU1ksICZtYm94LT5mbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFyX2FsbF9tYWlsYm94ZXMoc3RydWN0IGl2dHYgKml0diwgc3RydWN0IGl2dHZfbWFpbGJveF9kYXRhICptYmRhdGEpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDw9IG1iZGF0YS0+bWF4X21ib3g7IGkrKykgeworCQlJVlRWX0RFQlVHX1dBUk4oIkNsZWFyaW5nIG1haWxib3ggJWQ6IGNtZCAweCUwOHggZmxhZ3MgMHglMDh4XG4iLAorCQkJaSwgcmVhZGwoJm1iZGF0YS0+bWJveFtpXS5jbWQpLCByZWFkbCgmbWJkYXRhLT5tYm94W2ldLmZsYWdzKSk7CisJCXdyaXRlX3N5bmMoMCwgJm1iZGF0YS0+bWJveFtpXS5mbGFncyk7CisJCWNsZWFyX2JpdChpLCAmbWJkYXRhLT5idXN5KTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgaXZ0dl9hcGlfY2FsbChzdHJ1Y3QgaXZ0diAqaXR2LCBpbnQgY21kLCBpbnQgYXJncywgdTMyIGRhdGFbXSkKK3sKKwlzdHJ1Y3QgaXZ0dl9tYWlsYm94X2RhdGEgKm1iZGF0YSA9IChjbWQgPj0gMTI4KSA/ICZpdHYtPmVuY19tYm94IDogJml0di0+ZGVjX21ib3g7CisJdm9sYXRpbGUgc3RydWN0IGl2dHZfbWFpbGJveCBfX2lvbWVtICptYm94OworCWludCBhcGlfdGltZW91dCA9IEhaOworCWludCBmbGFncywgbWIsIGk7CisJdW5zaWduZWQgbG9uZyB0aGVuOworCisJLyogc2FuaXR5IGNoZWNrcyAqLworCWlmIChOVUxMID09IG1iZGF0YSkgeworCQlJVlRWX0VSUigiTm8gbWFpbGJveCBhbGxvY2F0ZWRcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJaWYgKGFyZ3MgPCAwIHx8IGFyZ3MgPiBDWDIzNDFYX01CT1hfTUFYX0RBVEEgfHwKKwkgICAgY21kIDwgMCB8fCBjbWQgPiAyNTUgfHwgYXBpX2luZm9bY21kXS5uYW1lID09IE5VTEwpIHsKKwkJSVZUVl9FUlIoIkludmFsaWQgQVBJIGNhbGw6IGNtZCA9IDB4JTAyeCwgYXJncyA9ICVkXG4iLCBjbWQsIGFyZ3MpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlJVlRWX0RFQlVHX0FQSSgiQVBJIENhbGw6ICVzXG4iLCBhcGlfaW5mb1tjbWRdLm5hbWUpOworCisJLyogY2xlYXIgcG9zc2libHkgdW5pbml0aWFsaXplZCBwYXJ0IG9mIGRhdGEgYXJyYXkgKi8KKwlmb3IgKGkgPSBhcmdzOyBpIDwgQ1gyMzQxWF9NQk9YX01BWF9EQVRBOyBpKyspCisJCWRhdGFbaV0gPSAwOworCisJLyogSWYgdGhpcyBjb21tYW5kIHdhcyBpc3N1ZWQgd2l0aGluIHRoZSBsYXN0IDMwIG1pbnV0ZXMgYW5kIHdpdGggaWRlbnRpY2FsCisJICAgZGF0YSwgdGhlbiBqdXN0IHJldHVybiAwIGFzIHRoZXJlIGlzIG5vIG5lZWQgdG8gaXNzdWUgdGhpcyBjb21tYW5kIGFnYWluLgorCSAgIEp1c3QgYW4gb3B0aW1pemF0aW9uIHRvIHByZXZlbnQgdW5uZWNlc3NhcnkgdXNlIG9mIG1haWxib3hlcy4gKi8KKwlpZiAoaXR2LT5hcGlfY2FjaGVbY21kXS5sYXN0X2ppZmZpZXMgJiYKKwkgICAgamlmZmllcyAtIGl0di0+YXBpX2NhY2hlW2NtZF0ubGFzdF9qaWZmaWVzIDwgSFogKiAxODAwICYmCisJICAgICFtZW1jbXAoZGF0YSwgaXR2LT5hcGlfY2FjaGVbY21kXS5kYXRhLCBzaXplb2YoaXR2LT5hcGlfY2FjaGVbY21kXS5kYXRhKSkpIHsKKwkJaXR2LT5hcGlfY2FjaGVbY21kXS5sYXN0X2ppZmZpZXMgPSBqaWZmaWVzOworCQlyZXR1cm4gMDsKKwl9CisKKwlmbGFncyA9IGFwaV9pbmZvW2NtZF0uZmxhZ3M7CisKKwlpZiAoZmxhZ3MgJiBBUElfRE1BKSB7CisJCWZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykgeworCQkJbWIgPSBpICUgKG1iZGF0YS0+bWF4X21ib3ggKyAxKTsKKwkJCWlmICh0cnlfbWFpbGJveChpdHYsIG1iZGF0YSwgbWIpKSB7CisJCQkJd3JpdGVfbWFpbGJveCgmbWJkYXRhLT5tYm94W21iXSwgY21kLCBhcmdzLCBkYXRhKTsKKwkJCQljbGVhcl9iaXQobWIsICZtYmRhdGEtPmJ1c3kpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJSVZUVl9ERUJVR19XQVJOKCIlczogbWFpbGJveCAlZCBub3QgZnJlZSAlMDh4XG4iLAorCQkJCQlhcGlfaW5mb1tjbWRdLm5hbWUsIG1iLCByZWFkbCgmbWJkYXRhLT5tYm94W21iXS5mbGFncykpOworCQl9CisJCUlWVFZfV0FSTigiQ291bGQgbm90IGZpbmQgZnJlZSBETUEgbWFpbGJveCBmb3IgJXNcbiIsIGFwaV9pbmZvW2NtZF0ubmFtZSk7CisJCWNsZWFyX2FsbF9tYWlsYm94ZXMoaXR2LCBtYmRhdGEpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWlmICgoZmxhZ3MgJiBBUElfRkFTVF9SRVNVTFQpID09IEFQSV9GQVNUX1JFU1VMVCkKKwkJYXBpX3RpbWVvdXQgPSBIWiAvIDEwOworCisJbWIgPSBnZXRfbWFpbGJveChpdHYsIG1iZGF0YSwgZmxhZ3MpOworCWlmIChtYiA8IDApIHsKKwkJSVZUVl9ERUJVR19XQVJOKCJObyBmcmVlIG1haWxib3ggZm91bmQgKCVzKVxuIiwgYXBpX2luZm9bY21kXS5uYW1lKTsKKwkJY2xlYXJfYWxsX21haWxib3hlcyhpdHYsIG1iZGF0YSk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCW1ib3ggPSAmbWJkYXRhLT5tYm94W21iXTsKKwl3cml0ZV9tYWlsYm94KG1ib3gsIGNtZCwgYXJncywgZGF0YSk7CisJaWYgKGZsYWdzICYgQVBJX0NBQ0hFKSB7CisJCW1lbWNweShpdHYtPmFwaV9jYWNoZVtjbWRdLmRhdGEsIGRhdGEsIHNpemVvZihpdHYtPmFwaV9jYWNoZVtjbWRdLmRhdGEpKTsKKwkJaXR2LT5hcGlfY2FjaGVbY21kXS5sYXN0X2ppZmZpZXMgPSBqaWZmaWVzOworCX0KKwlpZiAoKGZsYWdzICYgQVBJX1JFU1VMVCkgPT0gMCkgeworCQljbGVhcl9iaXQobWIsICZtYmRhdGEtPmJ1c3kpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBHZXQgcmVzdWx0cyAqLworCXRoZW4gPSBqaWZmaWVzOworCisJd2hpbGUgKCEocmVhZGwoJm1ib3gtPmZsYWdzKSAmIElWVFZfTUJPWF9GSVJNV0FSRV9ET05FKSkgeworCQlpZiAoamlmZmllcyAtIHRoZW4gPiBhcGlfdGltZW91dCkgeworCQkJSVZUVl9ERUJVR19XQVJOKCJDb3VsZCBub3QgZ2V0IHJlc3VsdCAoJXMpXG4iLCBhcGlfaW5mb1tjbWRdLm5hbWUpOworCQkJLyogcmVzZXQgdGhlIG1haWxib3gsIGJ1dCBpdCBpcyBsaWtlbHkgdG9vIGxhdGUgYWxyZWFkeSAqLworCQkJd3JpdGVfc3luYygwLCAmbWJveC0+ZmxhZ3MpOworCQkJY2xlYXJfYml0KG1iLCAmbWJkYXRhLT5idXN5KTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJCWlmIChmbGFncyAmIEFQSV9OT19XQUlUX1JFUykKKwkJCW1kZWxheSgxKTsKKwkJZWxzZQorCQkJaXZ0dl9zbGVlcF90aW1lb3V0KEhaIC8gMTAwLCAwKTsKKwl9CisJaWYgKGppZmZpZXMgLSB0aGVuID4gSFogLyAxMCkKKwkJSVZUVl9ERUJVR19XQVJOKCIlcyB0b29rICVsdSBqaWZmaWVzICglZCBwZXIgSFopXG4iLAorCQkJCWFwaV9pbmZvW2NtZF0ubmFtZSwgamlmZmllcyAtIHRoZW4sIEhaKTsKKworCWZvciAoaSA9IDA7IGkgPCBDWDIzNDFYX01CT1hfTUFYX0RBVEE7IGkrKykKKwkJZGF0YVtpXSA9IHJlYWRsKCZtYm94LT5kYXRhW2ldKTsKKwl3cml0ZV9zeW5jKDAsICZtYm94LT5mbGFncyk7CisJY2xlYXJfYml0KG1iLCAmbWJkYXRhLT5idXN5KTsKKwlyZXR1cm4gMDsKK30KKworaW50IGl2dHZfYXBpKHN0cnVjdCBpdnR2ICppdHYsIGludCBjbWQsIGludCBhcmdzLCB1MzIgZGF0YVtdKQoreworCWludCByZXMgPSBpdnR2X2FwaV9jYWxsKGl0diwgY21kLCBhcmdzLCBkYXRhKTsKKworCS8qIEFsbG93IGEgc2luZ2xlIHJldHJ5LCBwcm9iYWJseSBhbHJlYWR5IHRvbyBsYXRlIHRob3VnaC4KKwkgICBJZiB0aGVyZSBpcyBubyBmcmVlIG1haWxib3ggdGhlbiB0aGF0IGlzIHVzdWFsbHkgYW4gaW5kaWNhdGlvbgorCSAgIG9mIGEgbW9yZSBzZXJpb3VzIHByb2JsZW0uICovCisJcmV0dXJuIChyZXMgPT0gLUVCVVNZKSA/IGl2dHZfYXBpX2NhbGwoaXR2LCBjbWQsIGFyZ3MsIGRhdGEpIDogcmVzOworfQorCitpbnQgaXZ0dl9hcGlfZnVuYyh2b2lkICpwcml2LCBpbnQgY21kLCBpbnQgaW4sIGludCBvdXQsIHUzMiBkYXRhW0NYMjM0MVhfTUJPWF9NQVhfREFUQV0pCit7CisJcmV0dXJuIGl2dHZfYXBpKHByaXYsIGNtZCwgaW4sIGRhdGEpOworfQorCitpbnQgaXZ0dl92YXBpX3Jlc3VsdChzdHJ1Y3QgaXZ0diAqaXR2LCB1MzIgZGF0YVtDWDIzNDFYX01CT1hfTUFYX0RBVEFdLCBpbnQgY21kLCBpbnQgYXJncywgLi4uKQoreworCXZhX2xpc3QgYXA7CisJaW50IGk7CisKKwl2YV9zdGFydChhcCwgYXJncyk7CisJZm9yIChpID0gMDsgaSA8IGFyZ3M7IGkrKykgeworCQlkYXRhW2ldID0gdmFfYXJnKGFwLCB1MzIpOworCX0KKwl2YV9lbmQoYXApOworCXJldHVybiBpdnR2X2FwaShpdHYsIGNtZCwgYXJncywgZGF0YSk7Cit9CisKK2ludCBpdnR2X3ZhcGkoc3RydWN0IGl2dHYgKml0diwgaW50IGNtZCwgaW50IGFyZ3MsIC4uLikKK3sKKwl1MzIgZGF0YVtDWDIzNDFYX01CT1hfTUFYX0RBVEFdOworCXZhX2xpc3QgYXA7CisJaW50IGk7CisKKwl2YV9zdGFydChhcCwgYXJncyk7CisJZm9yIChpID0gMDsgaSA8IGFyZ3M7IGkrKykgeworCQlkYXRhW2ldID0gdmFfYXJnKGFwLCB1MzIpOworCX0KKwl2YV9lbmQoYXApOworCXJldHVybiBpdnR2X2FwaShpdHYsIGNtZCwgYXJncywgZGF0YSk7Cit9CisKKy8qIFRoaXMgb25lIGlzIGZvciBzdHVmZiB0aGF0IGNhbid0IHNsZWVwLi4gaXJxIGhhbmRsZXJzLCBldGMuLiAqLwordm9pZCBpdnR2X2FwaV9nZXRfZGF0YShzdHJ1Y3QgaXZ0dl9tYWlsYm94X2RhdGEgKm1iZGF0YSwgaW50IG1iLCB1MzIgZGF0YVtdKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IENYMjM0MVhfTUJPWF9NQVhfREFUQTsgaSsrKQorCQlkYXRhW2ldID0gcmVhZGwoJm1iZGF0YS0+bWJveFttYl0uZGF0YVtpXSk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1tYWlsYm94LmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1tYWlsYm94LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzliOGFlYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LW1haWxib3guaApAQCAtMCwwICsxLDI1IEBACisvKgorICAgIG1haWxib3ggZnVuY3Rpb25zCisgICAgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDQgIEtldmluIFRoYXllciA8bnVmYW5fd2ZrIGF0IHlhaG9vLmNvbT4KKyAgICBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNyAgSGFucyBWZXJrdWlsIDxodmVya3VpbEB4czRhbGwubmw+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKwordm9pZCBpdnR2X2FwaV9nZXRfZGF0YShzdHJ1Y3QgaXZ0dl9tYWlsYm94X2RhdGEgKm1ib3gsIGludCBtYiwgdTMyIGRhdGFbXSk7CitpbnQgaXZ0dl9hcGkoc3RydWN0IGl2dHYgKml0diwgaW50IGNtZCwgaW50IGFyZ3MsIHUzMiBkYXRhW10pOworaW50IGl2dHZfdmFwaV9yZXN1bHQoc3RydWN0IGl2dHYgKml0diwgdTMyIGRhdGFbQ1gyMzQxWF9NQk9YX01BWF9EQVRBXSwgaW50IGNtZCwgaW50IGFyZ3MsIC4uLik7CitpbnQgaXZ0dl92YXBpKHN0cnVjdCBpdnR2ICppdHYsIGludCBjbWQsIGludCBhcmdzLCAuLi4pOworaW50IGl2dHZfYXBpX2Z1bmModm9pZCAqcHJpdiwgaW50IGNtZCwgaW50IGluLCBpbnQgb3V0LCB1MzIgZGF0YVtDWDIzNDFYX01CT1hfTUFYX0RBVEFdKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LXF1ZXVlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1xdWV1ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjZmNlZjEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1xdWV1ZS5jCkBAIC0wLDAgKzEsMjYyIEBACisvKgorICAgIGJ1ZmZlciBxdWV1ZXMuCisgICAgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDQgIEtldmluIFRoYXllciA8bnVmYW5fd2ZrIGF0IHlhaG9vLmNvbT4KKyAgICBDb3B5cmlnaHQgKEMpIDIwMDQgIENocmlzIEtlbm5lZHkgPGNAZ3Jvb3Z5Lm9yZz4KKyAgICBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNyAgSGFucyBWZXJrdWlsIDxodmVya3VpbEB4czRhbGwubmw+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgIml2dHYtZHJpdmVyLmgiCisjaW5jbHVkZSAiaXZ0di1zdHJlYW1zLmgiCisjaW5jbHVkZSAiaXZ0di1xdWV1ZS5oIgorI2luY2x1ZGUgIml2dHYtbWFpbGJveC5oIgorCitpbnQgaXZ0dl9idWZfY29weV9mcm9tX3VzZXIoc3RydWN0IGl2dHZfc3RyZWFtICpzLCBzdHJ1Y3QgaXZ0dl9idWZmZXIgKmJ1ZiwgY29uc3QgY2hhciBfX3VzZXIgKnNyYywgaW50IGNvcHlieXRlcykKK3sKKwlpZiAocy0+YnVmX3NpemUgLSBidWYtPmJ5dGVzdXNlZCA8IGNvcHlieXRlcykKKwkJY29weWJ5dGVzID0gcy0+YnVmX3NpemUgLSBidWYtPmJ5dGVzdXNlZDsKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLT5idWYgKyBidWYtPmJ5dGVzdXNlZCwgc3JjLCBjb3B5Ynl0ZXMpKSB7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwlidWYtPmJ5dGVzdXNlZCArPSBjb3B5Ynl0ZXM7CisJcmV0dXJuIGNvcHlieXRlczsKK30KKwordm9pZCBpdnR2X2J1Zl9zd2FwKHN0cnVjdCBpdnR2X2J1ZmZlciAqYnVmKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGJ1Zi0+Ynl0ZXN1c2VkOyBpICs9IDQpCisJCXN3YWIzMnMoKHUzMiAqKShidWYtPmJ1ZiArIGkpKTsKK30KKwordm9pZCBpdnR2X3F1ZXVlX2luaXQoc3RydWN0IGl2dHZfcXVldWUgKnEpCit7CisJSU5JVF9MSVNUX0hFQUQoJnEtPmxpc3QpOworCXEtPmJ1ZmZlcnMgPSAwOworCXEtPmxlbmd0aCA9IDA7CisJcS0+Ynl0ZXN1c2VkID0gMDsKK30KKwordm9pZCBpdnR2X2VucXVldWUoc3RydWN0IGl2dHZfc3RyZWFtICpzLCBzdHJ1Y3QgaXZ0dl9idWZmZXIgKmJ1Ziwgc3RydWN0IGl2dHZfcXVldWUgKnEpCit7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CisKKwkvKiBjbGVhciB0aGUgYnVmZmVyIGlmIGl0IGlzIGdvaW5nIHRvIGJlIGVucXVldWVkIHRvIHRoZSBmcmVlIHF1ZXVlICovCisJaWYgKHEgPT0gJnMtPnFfZnJlZSkgeworCQlidWYtPmJ5dGVzdXNlZCA9IDA7CisJCWJ1Zi0+cmVhZHBvcyA9IDA7CisJCWJ1Zi0+Yl9mbGFncyA9IDA7CisJfQorCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5xbG9jaywgZmxhZ3MpOworCWxpc3RfYWRkX3RhaWwoJmJ1Zi0+bGlzdCwgJnEtPmxpc3QpOworCXEtPmJ1ZmZlcnMrKzsKKwlxLT5sZW5ndGggKz0gcy0+YnVmX3NpemU7CisJcS0+Ynl0ZXN1c2VkICs9IGJ1Zi0+Ynl0ZXN1c2VkIC0gYnVmLT5yZWFkcG9zOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPnFsb2NrLCBmbGFncyk7Cit9CisKK3N0cnVjdCBpdnR2X2J1ZmZlciAqaXZ0dl9kZXF1ZXVlKHN0cnVjdCBpdnR2X3N0cmVhbSAqcywgc3RydWN0IGl2dHZfcXVldWUgKnEpCit7CisJc3RydWN0IGl2dHZfYnVmZmVyICpidWYgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPnFsb2NrLCBmbGFncyk7CisJaWYgKCFsaXN0X2VtcHR5KCZxLT5saXN0KSkgeworCQlidWYgPSBsaXN0X2VudHJ5KHEtPmxpc3QubmV4dCwgc3RydWN0IGl2dHZfYnVmZmVyLCBsaXN0KTsKKwkJbGlzdF9kZWxfaW5pdChxLT5saXN0Lm5leHQpOworCQlxLT5idWZmZXJzLS07CisJCXEtPmxlbmd0aCAtPSBzLT5idWZfc2l6ZTsKKwkJcS0+Ynl0ZXN1c2VkIC09IGJ1Zi0+Ynl0ZXN1c2VkIC0gYnVmLT5yZWFkcG9zOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5xbG9jaywgZmxhZ3MpOworCXJldHVybiBidWY7Cit9CisKK3N0YXRpYyB2b2lkIGl2dHZfcXVldWVfbW92ZV9idWYoc3RydWN0IGl2dHZfc3RyZWFtICpzLCBzdHJ1Y3QgaXZ0dl9xdWV1ZSAqZnJvbSwKKwkJc3RydWN0IGl2dHZfcXVldWUgKnRvLCBpbnQgY2xlYXIsIGludCBmdWxsKQoreworCXN0cnVjdCBpdnR2X2J1ZmZlciAqYnVmID0gbGlzdF9lbnRyeShmcm9tLT5saXN0Lm5leHQsIHN0cnVjdCBpdnR2X2J1ZmZlciwgbGlzdCk7CisKKwlsaXN0X21vdmVfdGFpbChmcm9tLT5saXN0Lm5leHQsICZ0by0+bGlzdCk7CisJZnJvbS0+YnVmZmVycy0tOworCWZyb20tPmxlbmd0aCAtPSBzLT5idWZfc2l6ZTsKKwlmcm9tLT5ieXRlc3VzZWQgLT0gYnVmLT5ieXRlc3VzZWQgLSBidWYtPnJlYWRwb3M7CisJLyogc3BlY2lhbCBoYW5kbGluZyBmb3IgcV9mcmVlICovCisJaWYgKGNsZWFyKQorCQlidWYtPmJ5dGVzdXNlZCA9IGJ1Zi0+cmVhZHBvcyA9IGJ1Zi0+Yl9mbGFncyA9IDA7CisJZWxzZSBpZiAoZnVsbCkgeworCQkvKiBzcGVjaWFsIGhhbmRsaW5nIGZvciBzdG9sZW4gYnVmZmVycywgYXNzdW1lCisJCSAgIGFsbCBieXRlcyBhcmUgdXNlZC4gKi8KKwkJYnVmLT5ieXRlc3VzZWQgPSBzLT5idWZfc2l6ZTsKKwkJYnVmLT5yZWFkcG9zID0gYnVmLT5iX2ZsYWdzID0gMDsKKwl9CisJdG8tPmJ1ZmZlcnMrKzsKKwl0by0+bGVuZ3RoICs9IHMtPmJ1Zl9zaXplOworCXRvLT5ieXRlc3VzZWQgKz0gYnVmLT5ieXRlc3VzZWQgLSBidWYtPnJlYWRwb3M7Cit9CisKKy8qIE1vdmUgJ25lZWRlZF9ieXRlcycgd29ydGggb2YgYnVmZmVycyBmcm9tIHF1ZXVlICdmcm9tJyBpbnRvIHF1ZXVlICd0bycuCisgICBJZiAnbmVlZGVkX2J5dGVzJyA9PSAwLCB0aGVuIG1vdmUgYWxsIGJ1ZmZlcnMgZnJvbSAnZnJvbScgaW50byAndG8nLgorICAgSWYgJ3N0ZWFsJyAhPSBOVUxMLCB0aGVuIGJ1ZmZlcnMgbWF5IGFsc28gdGFrZW4gZnJvbSB0aGF0IHF1ZXVlIGlmCisgICBuZWVkZWQuCisKKyAgIFRoZSBidWZmZXIgaXMgYXV0b21hdGljYWxseSBjbGVhcmVkIGlmIGl0IGdvZXMgdG8gdGhlIGZyZWUgcXVldWUuIEl0IGlzCisgICBhbHNvIGNsZWFyZWQgaWYgYnVmZmVycyBuZWVkIHRvIGJlIHRha2VuIGZyb20gdGhlICdzdGVhbCcgcXVldWUgYW5kCisgICB0aGUgJ2Zyb20nIHF1ZXVlIGlzIHRoZSBmcmVlIHF1ZXVlLgorCisgICBXaGVuICdmcm9tJyBpcyBxX2ZyZWUsIHRoZW4gbmVlZGVkX2J5dGVzIGlzIGNvbXBhcmVkIHRvIHRoZSB0b3RhbAorICAgYXZhaWxhYmxlIGJ1ZmZlciBsZW5ndGgsIG90aGVyd2lzZSBuZWVkZWRfYnl0ZXMgaXMgY29tcGFyZWQgdG8gdGhlCisgICBieXRlc3VzZWQgdmFsdWUuIEZvciB0aGUgJ3N0ZWFsJyBxdWV1ZSB0aGUgdG90YWwgYXZhaWxhYmxlIGJ1ZmZlcgorICAgbGVuZ3RoIGlzIGFsd2F5cyB1c2VkLgorCisgICAtRU5PTUVNIGlzIHJldHVybmVkIGlmIHRoZSBidWZmZXJzIGNvdWxkIG5vdCBiZSBvYnRhaW5lZCwgMCBpZiBhbGwKKyAgIGJ1ZmZlcnMgd2hlcmUgb2J0YWluZWQgZnJvbSB0aGUgJ2Zyb20nIGxpc3QgYW5kIGlmIG5vbi16ZXJvIHRoZW4KKyAgIHRoZSBudW1iZXIgb2Ygc3RvbGVuIGJ1ZmZlcnMgaXMgcmV0dXJuZWQuICovCitpbnQgaXZ0dl9xdWV1ZV9tb3ZlKHN0cnVjdCBpdnR2X3N0cmVhbSAqcywgc3RydWN0IGl2dHZfcXVldWUgKmZyb20sIHN0cnVjdCBpdnR2X3F1ZXVlICpzdGVhbCwKKwkJICAgIHN0cnVjdCBpdnR2X3F1ZXVlICp0bywgaW50IG5lZWRlZF9ieXRlcykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByYyA9IDA7CisJaW50IGZyb21fZnJlZSA9IGZyb20gPT0gJnMtPnFfZnJlZTsKKwlpbnQgdG9fZnJlZSA9IHRvID09ICZzLT5xX2ZyZWU7CisJaW50IGJ5dGVzX2F2YWlsYWJsZTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5xbG9jaywgZmxhZ3MpOworCWlmIChuZWVkZWRfYnl0ZXMgPT0gMCkgeworCQlmcm9tX2ZyZWUgPSAxOworCQluZWVkZWRfYnl0ZXMgPSBmcm9tLT5sZW5ndGg7CisJfQorCisJYnl0ZXNfYXZhaWxhYmxlID0gZnJvbV9mcmVlID8gZnJvbS0+bGVuZ3RoIDogZnJvbS0+Ynl0ZXN1c2VkOworCWJ5dGVzX2F2YWlsYWJsZSArPSBzdGVhbCA/IHN0ZWFsLT5sZW5ndGggOiAwOworCisJaWYgKGJ5dGVzX2F2YWlsYWJsZSA8IG5lZWRlZF9ieXRlcykgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5xbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJaWYgKGZyb21fZnJlZSkgeworCQl1MzIgb2xkX2xlbmd0aCA9IHRvLT5sZW5ndGg7CisKKwkJd2hpbGUgKHRvLT5sZW5ndGggLSBvbGRfbGVuZ3RoIDwgbmVlZGVkX2J5dGVzKSB7CisJCQlpZiAobGlzdF9lbXB0eSgmZnJvbS0+bGlzdCkpCisJCQkJZnJvbSA9IHN0ZWFsOworCQkJaWYgKGZyb20gPT0gc3RlYWwpCisJCQkJcmMrKzsgCQkvKiBrZWVwIHRyYWNrIG9mICdzdG9sZW4nIGJ1ZmZlcnMgKi8KKwkJCWl2dHZfcXVldWVfbW92ZV9idWYocywgZnJvbSwgdG8sIDEsIDApOworCQl9CisJfQorCWVsc2UgeworCQl1MzIgb2xkX2J5dGVzdXNlZCA9IHRvLT5ieXRlc3VzZWQ7CisKKwkJd2hpbGUgKHRvLT5ieXRlc3VzZWQgLSBvbGRfYnl0ZXN1c2VkIDwgbmVlZGVkX2J5dGVzKSB7CisJCQlpZiAobGlzdF9lbXB0eSgmZnJvbS0+bGlzdCkpCisJCQkJZnJvbSA9IHN0ZWFsOworCQkJaWYgKGZyb20gPT0gc3RlYWwpCisJCQkJcmMrKzsgCQkvKiBrZWVwIHRyYWNrIG9mICdzdG9sZW4nIGJ1ZmZlcnMgKi8KKwkJCWl2dHZfcXVldWVfbW92ZV9idWYocywgZnJvbSwgdG8sIHRvX2ZyZWUsIHJjKTsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5xbG9jaywgZmxhZ3MpOworCXJldHVybiByYzsKK30KKwordm9pZCBpdnR2X2ZsdXNoX3F1ZXVlcyhzdHJ1Y3QgaXZ0dl9zdHJlYW0gKnMpCit7CisJaXZ0dl9xdWV1ZV9tb3ZlKHMsICZzLT5xX2lvLCBOVUxMLCAmcy0+cV9mcmVlLCAwKTsKKwlpdnR2X3F1ZXVlX21vdmUocywgJnMtPnFfZnVsbCwgTlVMTCwgJnMtPnFfZnJlZSwgMCk7CisJaXZ0dl9xdWV1ZV9tb3ZlKHMsICZzLT5xX2RtYSwgTlVMTCwgJnMtPnFfZnJlZSwgMCk7CisJaXZ0dl9xdWV1ZV9tb3ZlKHMsICZzLT5xX3ByZWRtYSwgTlVMTCwgJnMtPnFfZnJlZSwgMCk7Cit9CisKK2ludCBpdnR2X3N0cmVhbV9hbGxvYyhzdHJ1Y3QgaXZ0dl9zdHJlYW0gKnMpCit7CisJc3RydWN0IGl2dHYgKml0diA9IHMtPml0djsKKwlpbnQgU0dzaXplID0gc2l6ZW9mKHN0cnVjdCBpdnR2X1NHX2VsZW1lbnQpICogcy0+YnVmZmVyczsKKwlpbnQgaTsKKworCWlmIChzLT5idWZmZXJzID09IDApCisJCXJldHVybiAwOworCisJSVZUVl9ERUJVR19JTkZPKCJBbGxvY2F0ZSAlcyVzIHN0cmVhbTogJWQgeCAlZCBidWZmZXJzICglZGtCIHRvdGFsKVxuIiwKKwkJcy0+ZG1hICE9IFBDSV9ETUFfTk9ORSA/ICJETUEgIiA6ICIiLAorCQlzLT5uYW1lLCBzLT5idWZmZXJzLCBzLT5idWZfc2l6ZSwgcy0+YnVmZmVycyAqIHMtPmJ1Zl9zaXplIC8gMTAyNCk7CisKKwkvKiBBbGxvY2F0ZSBETUEgU0cgQXJyYXlzICovCisJaWYgKHMtPmRtYSAhPSBQQ0lfRE1BX05PTkUpIHsKKwkJcy0+U0dhcnJheSA9IChzdHJ1Y3QgaXZ0dl9TR19lbGVtZW50ICopa3phbGxvYyhTR3NpemUsIEdGUF9LRVJORUwpOworCQlpZiAocy0+U0dhcnJheSA9PSBOVUxMKSB7CisJCQlJVlRWX0VSUigiQ291bGQgbm90IGFsbG9jYXRlIFNHYXJyYXkgZm9yICVzIHN0cmVhbVxuIiwgcy0+bmFtZSk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQlzLT5TR19sZW5ndGggPSAwOworCQlzLT5TR19oYW5kbGUgPSBwY2lfbWFwX3NpbmdsZShpdHYtPmRldiwgcy0+U0dhcnJheSwgU0dzaXplLCBzLT5kbWEpOworCQlpdnR2X3N0cmVhbV9zeW5jX2Zvcl9jcHUocyk7CisJfQorCisJLyogYWxsb2NhdGUgc3RyZWFtIGJ1ZmZlcnMuIEluaXRpYWxseSBhbGwgYnVmZmVycyBhcmUgaW4gcV9mcmVlLiAqLworCWZvciAoaSA9IDA7IGkgPCBzLT5idWZmZXJzOyBpKyspIHsKKwkJc3RydWN0IGl2dHZfYnVmZmVyICpidWYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaXZ0dl9idWZmZXIpLCBHRlBfS0VSTkVMKTsKKworCQlpZiAoYnVmID09IE5VTEwpCisJCQlicmVhazsKKwkJYnVmLT5idWYgPSBrbWFsbG9jKHMtPmJ1Zl9zaXplICsgMjU2LCBHRlBfS0VSTkVMKTsKKwkJaWYgKGJ1Zi0+YnVmID09IE5VTEwpIHsKKwkJCWtmcmVlKGJ1Zik7CisJCQlicmVhazsKKwkJfQorCQlJTklUX0xJU1RfSEVBRCgmYnVmLT5saXN0KTsKKwkJaWYgKHMtPmRtYSAhPSBQQ0lfRE1BX05PTkUpIHsKKwkJCWJ1Zi0+ZG1hX2hhbmRsZSA9IHBjaV9tYXBfc2luZ2xlKHMtPml0di0+ZGV2LAorCQkJCWJ1Zi0+YnVmLCBzLT5idWZfc2l6ZSArIDI1Niwgcy0+ZG1hKTsKKwkJCWl2dHZfYnVmX3N5bmNfZm9yX2NwdShzLCBidWYpOworCQl9CisJCWl2dHZfZW5xdWV1ZShzLCBidWYsICZzLT5xX2ZyZWUpOworCX0KKwlpZiAoaSA9PSBzLT5idWZmZXJzKQorCQlyZXR1cm4gMDsKKwlJVlRWX0VSUigiQ291bGRuJ3QgYWxsb2NhdGUgYnVmZmVycyBmb3IgJXMgc3RyZWFtXG4iLCBzLT5uYW1lKTsKKwlpdnR2X3N0cmVhbV9mcmVlKHMpOworCXJldHVybiAtRU5PTUVNOworfQorCit2b2lkIGl2dHZfc3RyZWFtX2ZyZWUoc3RydWN0IGl2dHZfc3RyZWFtICpzKQoreworCXN0cnVjdCBpdnR2X2J1ZmZlciAqYnVmOworCisJLyogbW92ZSBhbGwgYnVmZmVycyB0byBxX2ZyZWUgKi8KKwlpdnR2X2ZsdXNoX3F1ZXVlcyhzKTsKKworCS8qIGVtcHR5IHFfZnJlZSAqLworCXdoaWxlICgoYnVmID0gaXZ0dl9kZXF1ZXVlKHMsICZzLT5xX2ZyZWUpKSkgeworCQlpZiAocy0+ZG1hICE9IFBDSV9ETUFfTk9ORSkKKwkJCXBjaV91bm1hcF9zaW5nbGUocy0+aXR2LT5kZXYsIGJ1Zi0+ZG1hX2hhbmRsZSwKKwkJCQlzLT5idWZfc2l6ZSArIDI1Niwgcy0+ZG1hKTsKKwkJa2ZyZWUoYnVmLT5idWYpOworCQlrZnJlZShidWYpOworCX0KKworCS8qIEZyZWUgU0cgQXJyYXkvTGlzdHMgKi8KKwlpZiAocy0+U0dhcnJheSAhPSBOVUxMKSB7CisJCWlmIChzLT5TR19oYW5kbGUgIT0gSVZUVl9ETUFfVU5NQVBQRUQpIHsKKwkJCXBjaV91bm1hcF9zaW5nbGUocy0+aXR2LT5kZXYsIHMtPlNHX2hhbmRsZSwKKwkJCQkgc2l6ZW9mKHN0cnVjdCBpdnR2X1NHX2VsZW1lbnQpICogcy0+YnVmZmVycywgUENJX0RNQV9UT0RFVklDRSk7CisJCQlzLT5TR19oYW5kbGUgPSBJVlRWX0RNQV9VTk1BUFBFRDsKKwkJfQorCQlzLT5TR2FycmF5ID0gTlVMTDsKKwkJcy0+U0dfbGVuZ3RoID0gMDsKKwl9Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1xdWV1ZS5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtcXVldWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDNlZGQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtcXVldWUuaApAQCAtMCwwICsxLDY0IEBACisvKgorICAgIGJ1ZmZlciBxdWV1ZXMuCisgICAgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDQgIEtldmluIFRoYXllciA8bnVmYW5fd2ZrIGF0IHlhaG9vLmNvbT4KKyAgICBDb3B5cmlnaHQgKEMpIDIwMDQgIENocmlzIEtlbm5lZHkgPGNAZ3Jvb3Z5Lm9yZz4KKyAgICBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNyAgSGFucyBWZXJrdWlsIDxodmVya3VpbEB4czRhbGwubmw+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2RlZmluZSBJVlRWX0RNQV9VTk1BUFBFRAkoKHUzMikgLTEpCisKKy8qIGl2dHZfYnVmZmVyIHV0aWxpdHkgZnVuY3Rpb25zICovCitzdGF0aWMgaW5saW5lIHZvaWQgaXZ0dl9idWZfc3luY19mb3JfY3B1KHN0cnVjdCBpdnR2X3N0cmVhbSAqcywgc3RydWN0IGl2dHZfYnVmZmVyICpidWYpCit7CisJaWYgKHMtPmRtYSAhPSBQQ0lfRE1BX05PTkUpCisJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdShzLT5pdHYtPmRldiwgYnVmLT5kbWFfaGFuZGxlLAorCQkJCXMtPmJ1Zl9zaXplICsgMjU2LCBzLT5kbWEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaXZ0dl9idWZfc3luY19mb3JfZGV2aWNlKHN0cnVjdCBpdnR2X3N0cmVhbSAqcywgc3RydWN0IGl2dHZfYnVmZmVyICpidWYpCit7CisJaWYgKHMtPmRtYSAhPSBQQ0lfRE1BX05PTkUpCisJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShzLT5pdHYtPmRldiwgYnVmLT5kbWFfaGFuZGxlLAorCQkJCXMtPmJ1Zl9zaXplICsgMjU2LCBzLT5kbWEpOworfQorCitpbnQgaXZ0dl9idWZfY29weV9mcm9tX3VzZXIoc3RydWN0IGl2dHZfc3RyZWFtICpzLCBzdHJ1Y3QgaXZ0dl9idWZmZXIgKmJ1ZiwgY29uc3QgY2hhciBfX3VzZXIgKnNyYywgaW50IGNvcHlieXRlcyk7Cit2b2lkIGl2dHZfYnVmX3N3YXAoc3RydWN0IGl2dHZfYnVmZmVyICpidWYpOworCisvKiBpdnR2X3F1ZXVlIHV0aWxpdHkgZnVuY3Rpb25zICovCit2b2lkIGl2dHZfcXVldWVfaW5pdChzdHJ1Y3QgaXZ0dl9xdWV1ZSAqcSk7Cit2b2lkIGl2dHZfZW5xdWV1ZShzdHJ1Y3QgaXZ0dl9zdHJlYW0gKnMsIHN0cnVjdCBpdnR2X2J1ZmZlciAqYnVmLCBzdHJ1Y3QgaXZ0dl9xdWV1ZSAqcSk7CitzdHJ1Y3QgaXZ0dl9idWZmZXIgKml2dHZfZGVxdWV1ZShzdHJ1Y3QgaXZ0dl9zdHJlYW0gKnMsIHN0cnVjdCBpdnR2X3F1ZXVlICpxKTsKK2ludCBpdnR2X3F1ZXVlX21vdmUoc3RydWN0IGl2dHZfc3RyZWFtICpzLCBzdHJ1Y3QgaXZ0dl9xdWV1ZSAqZnJvbSwgc3RydWN0IGl2dHZfcXVldWUgKnN0ZWFsLAorCQkgICAgc3RydWN0IGl2dHZfcXVldWUgKnRvLCBpbnQgbmVlZGVkX2J5dGVzKTsKK3ZvaWQgaXZ0dl9mbHVzaF9xdWV1ZXMoc3RydWN0IGl2dHZfc3RyZWFtICpzKTsKKworLyogaXZ0dl9zdHJlYW0gdXRpbGl0eSBmdW5jdGlvbnMgKi8KK2ludCBpdnR2X3N0cmVhbV9hbGxvYyhzdHJ1Y3QgaXZ0dl9zdHJlYW0gKnMpOwordm9pZCBpdnR2X3N0cmVhbV9mcmVlKHN0cnVjdCBpdnR2X3N0cmVhbSAqcyk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpdnR2X3N0cmVhbV9zeW5jX2Zvcl9jcHUoc3RydWN0IGl2dHZfc3RyZWFtICpzKQoreworCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdShzLT5pdHYtPmRldiwgcy0+U0dfaGFuZGxlLAorCQlzaXplb2Yoc3RydWN0IGl2dHZfU0dfZWxlbWVudCkgKiBzLT5idWZmZXJzLCBQQ0lfRE1BX1RPREVWSUNFKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGl2dHZfc3RyZWFtX3N5bmNfZm9yX2RldmljZShzdHJ1Y3QgaXZ0dl9zdHJlYW0gKnMpCit7CisJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHMtPml0di0+ZGV2LCBzLT5TR19oYW5kbGUsCisJCXNpemVvZihzdHJ1Y3QgaXZ0dl9TR19lbGVtZW50KSAqIHMtPmJ1ZmZlcnMsIFBDSV9ETUFfVE9ERVZJQ0UpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtc3RyZWFtcy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtc3RyZWFtcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxYTQxYTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1zdHJlYW1zLmMKQEAgLTAsMCArMSw5NzcgQEAKKy8qCisgICAgaW5pdC9zdGFydC9zdG9wL2V4aXQgc3RyZWFtIGZ1bmN0aW9ucworICAgIENvcHlyaWdodCAoQykgMjAwMy0yMDA0ICBLZXZpbiBUaGF5ZXIgPG51ZmFuX3dmayBhdCB5YWhvby5jb20+CisgICAgQ29weXJpZ2h0IChDKSAyMDA0ICBDaHJpcyBLZW5uZWR5IDxjQGdyb292eS5vcmc+CisgICAgQ29weXJpZ2h0IChDKSAyMDA1LTIwMDcgIEhhbnMgVmVya3VpbCA8aHZlcmt1aWxAeHM0YWxsLm5sPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKy8qIExpY2Vuc2U6IEdQTAorICogQXV0aG9yOiBLZXZpbiBUaGF5ZXIgPG51ZmFuX3dmayBhdCB5YWhvbyBkb3QgY29tPgorICoKKyAqIFRoaXMgZmlsZSB3aWxsIGhvbGQgQVBJIHJlbGF0ZWQgZnVuY3Rpb25zLCBib3RoIGludGVybmFsIChmaXJtd2FyZSBhcGkpCisgKiBhbmQgZXh0ZXJuYWwgKHY0bDIsIGV0YykKKyAqCisgKiAtLS0tLQorICogTVBHNjAwL01QRzE2MCBzdXBwb3J0IGJ5ICBULkFkYWNoaSA8dGFkYWNoaUB0YWRhY2hpLW5ldC5jb20+CisgKiAgICAgICAgICAgICAgICAgICAgICBhbmQgVGFrZXJ1IEtPTU9SSVlBPGtvbW9yaXlhQHBha2VuLm9yZz4KKyAqCisgKiBBVmVyTWVkaWEgTTE3OSBHUElPIGluZm8gYnkgQ2hyaXMgUGlua2hhbSA8Y3BpbmtoYW1AYmMydmEub3JnPgorICogICAgICAgICAgICAgICAgdXNpbmcgaW5mb3JtYXRpb24gcHJvdmlkZWQgYnkgSml1bi1LdWVpIEp1bmcgQCBBVmVyTWVkaWEuCisgKi8KKworI2luY2x1ZGUgIml2dHYtZHJpdmVyLmgiCisjaW5jbHVkZSAiaXZ0di1maWxlb3BzLmgiCisjaW5jbHVkZSAiaXZ0di1pMmMuaCIKKyNpbmNsdWRlICJpdnR2LXF1ZXVlLmgiCisjaW5jbHVkZSAiaXZ0di1tYWlsYm94LmgiCisjaW5jbHVkZSAiaXZ0di1hdWRpby5oIgorI2luY2x1ZGUgIml2dHYtdmlkZW8uaCIKKyNpbmNsdWRlICJpdnR2LXZiaS5oIgorI2luY2x1ZGUgIml2dHYtaW9jdGwuaCIKKyNpbmNsdWRlICJpdnR2LWlycS5oIgorI2luY2x1ZGUgIml2dHYtc3RyZWFtcy5oIgorI2luY2x1ZGUgIml2dHYtY2FyZHMuaCIKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaXZ0dl92NGwyX2VuY19mb3BzID0geworICAgICAgLm93bmVyID0gVEhJU19NT0RVTEUsCisgICAgICAucmVhZCA9IGl2dHZfdjRsMl9yZWFkLAorICAgICAgLndyaXRlID0gaXZ0dl92NGwyX3dyaXRlLAorICAgICAgLm9wZW4gPSBpdnR2X3Y0bDJfb3BlbiwKKyAgICAgIC5pb2N0bCA9IGl2dHZfdjRsMl9pb2N0bCwKKyAgICAgIC5yZWxlYXNlID0gaXZ0dl92NGwyX2Nsb3NlLAorICAgICAgLnBvbGwgPSBpdnR2X3Y0bDJfZW5jX3BvbGwsCit9OworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpdnR2X3Y0bDJfZGVjX2ZvcHMgPSB7CisgICAgICAub3duZXIgPSBUSElTX01PRFVMRSwKKyAgICAgIC5yZWFkID0gaXZ0dl92NGwyX3JlYWQsCisgICAgICAud3JpdGUgPSBpdnR2X3Y0bDJfd3JpdGUsCisgICAgICAub3BlbiA9IGl2dHZfdjRsMl9vcGVuLAorICAgICAgLmlvY3RsID0gaXZ0dl92NGwyX2lvY3RsLAorICAgICAgLnJlbGVhc2UgPSBpdnR2X3Y0bDJfY2xvc2UsCisgICAgICAucG9sbCA9IGl2dHZfdjRsMl9kZWNfcG9sbCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJaW50IHZmbF90eXBlOworCWludCBtaW5vcl9vZmZzZXQ7CisJaW50IGRtYSwgcGlvOworCWVudW0gdjRsMl9idWZfdHlwZSBidWZfdHlwZTsKKwlzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICpmb3BzOworfSBpdnR2X3N0cmVhbV9pbmZvW10gPSB7CisJewkvKiBJVlRWX0VOQ19TVFJFQU1fVFlQRV9NUEcgKi8KKwkJImVuY29kZXIgTVBFRyIsCisJCVZGTF9UWVBFX0dSQUJCRVIsIDAsCisJCVBDSV9ETUFfRlJPTURFVklDRSwgMCwgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFLAorCQkmaXZ0dl92NGwyX2VuY19mb3BzCisJfSwKKwl7CS8qIElWVFZfRU5DX1NUUkVBTV9UWVBFX1lVViAqLworCQkiZW5jb2RlciBZVVYiLAorCQlWRkxfVFlQRV9HUkFCQkVSLCBJVlRWX1Y0TDJfRU5DX1lVVl9PRkZTRVQsCisJCVBDSV9ETUFfRlJPTURFVklDRSwgMCwgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFLAorCQkmaXZ0dl92NGwyX2VuY19mb3BzCisJfSwKKwl7CS8qIElWVFZfRU5DX1NUUkVBTV9UWVBFX1ZCSSAqLworCQkiZW5jb2RlciBWQkkiLAorCQlWRkxfVFlQRV9WQkksIDAsCisJCVBDSV9ETUFfRlJPTURFVklDRSwgMCwgVjRMMl9CVUZfVFlQRV9WQklfQ0FQVFVSRSwKKwkJJml2dHZfdjRsMl9lbmNfZm9wcworCX0sCisJewkvKiBJVlRWX0VOQ19TVFJFQU1fVFlQRV9QQ00gKi8KKwkJImVuY29kZXIgUENNIGF1ZGlvIiwKKwkJVkZMX1RZUEVfR1JBQkJFUiwgSVZUVl9WNEwyX0VOQ19QQ01fT0ZGU0VULAorCQlQQ0lfRE1BX0ZST01ERVZJQ0UsIDAsIFY0TDJfQlVGX1RZUEVfUFJJVkFURSwKKwkJJml2dHZfdjRsMl9lbmNfZm9wcworCX0sCisJewkvKiBJVlRWX0VOQ19TVFJFQU1fVFlQRV9SQUQgKi8KKwkJImVuY29kZXIgcmFkaW8iLAorCQlWRkxfVFlQRV9SQURJTywgMCwKKwkJUENJX0RNQV9OT05FLCAxLCBWNEwyX0JVRl9UWVBFX1BSSVZBVEUsCisJCSZpdnR2X3Y0bDJfZW5jX2ZvcHMKKwl9LAorCXsJLyogSVZUVl9ERUNfU1RSRUFNX1RZUEVfTVBHICovCisJCSJkZWNvZGVyIE1QRUciLAorCQlWRkxfVFlQRV9HUkFCQkVSLCBJVlRWX1Y0TDJfREVDX01QR19PRkZTRVQsCisJCVBDSV9ETUFfVE9ERVZJQ0UsIDAsIFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVULAorCQkmaXZ0dl92NGwyX2RlY19mb3BzCisJfSwKKwl7CS8qIElWVFZfREVDX1NUUkVBTV9UWVBFX1ZCSSAqLworCQkiZGVjb2RlciBWQkkiLAorCQlWRkxfVFlQRV9WQkksIElWVFZfVjRMMl9ERUNfVkJJX09GRlNFVCwKKwkJUENJX0RNQV9OT05FLCAxLCBWNEwyX0JVRl9UWVBFX1ZCSV9DQVBUVVJFLAorCQkmaXZ0dl92NGwyX2VuY19mb3BzCisJfSwKKwl7CS8qIElWVFZfREVDX1NUUkVBTV9UWVBFX1ZPVVQgKi8KKwkJImRlY29kZXIgVk9VVCIsCisJCVZGTF9UWVBFX1ZCSSwgSVZUVl9WNEwyX0RFQ19WT1VUX09GRlNFVCwKKwkJUENJX0RNQV9OT05FLCAxLCBWNEwyX0JVRl9UWVBFX1ZCSV9PVVRQVVQsCisJCSZpdnR2X3Y0bDJfZGVjX2ZvcHMKKwl9LAorCXsJLyogSVZUVl9ERUNfU1RSRUFNX1RZUEVfWVVWICovCisJCSJkZWNvZGVyIFlVViIsCisJCVZGTF9UWVBFX0dSQUJCRVIsIElWVFZfVjRMMl9ERUNfWVVWX09GRlNFVCwKKwkJUENJX0RNQV9UT0RFVklDRSwgMCwgVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQsCisJCSZpdnR2X3Y0bDJfZGVjX2ZvcHMKKwl9Cit9OworCitzdGF0aWMgdm9pZCBpdnR2X3N0cmVhbV9pbml0KHN0cnVjdCBpdnR2ICppdHYsIGludCB0eXBlKQoreworCXN0cnVjdCBpdnR2X3N0cmVhbSAqcyA9ICZpdHYtPnN0cmVhbXNbdHlwZV07CisJc3RydWN0IHZpZGVvX2RldmljZSAqZGV2ID0gcy0+djRsMmRldjsKKworCS8qIHdlIG5lZWQgdG8ga2VlcCB2NGwyZGV2LCBzbyByZXN0b3JlIGl0IGFmdGVyd2FyZHMgKi8KKwltZW1zZXQocywgMCwgc2l6ZW9mKCpzKSk7CisJcy0+djRsMmRldiA9IGRldjsKKworCS8qIGluaXRpYWxpemUgaXZ0dl9zdHJlYW0gZmllbGRzICovCisJcy0+aXR2ID0gaXR2OworCXMtPnR5cGUgPSB0eXBlOworCXMtPm5hbWUgPSBpdnR2X3N0cmVhbV9pbmZvW3R5cGVdLm5hbWU7CisKKwlpZiAoaXZ0dl9zdHJlYW1faW5mb1t0eXBlXS5waW8pCisJCXMtPmRtYSA9IFBDSV9ETUFfTk9ORTsKKwllbHNlCisJCXMtPmRtYSA9IGl2dHZfc3RyZWFtX2luZm9bdHlwZV0uZG1hOworCXMtPmJ1Zl9zaXplID0gaXR2LT5zdHJlYW1fYnVmX3NpemVbdHlwZV07CisJaWYgKHMtPmJ1Zl9zaXplKQorCQlzLT5idWZmZXJzID0gaXR2LT5vcHRpb25zLm1lZ2FieXRlc1t0eXBlXSAqIDEwMjQgKiAxMDI0IC8gcy0+YnVmX3NpemU7CisJc3Bpbl9sb2NrX2luaXQoJnMtPnFsb2NrKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzLT53YWl0cSk7CisJcy0+aWQgPSAtMTsKKwlzLT5TR19oYW5kbGUgPSBJVlRWX0RNQV9VTk1BUFBFRDsKKwlpdnR2X3F1ZXVlX2luaXQoJnMtPnFfZnJlZSk7CisJaXZ0dl9xdWV1ZV9pbml0KCZzLT5xX2Z1bGwpOworCWl2dHZfcXVldWVfaW5pdCgmcy0+cV9kbWEpOworCWl2dHZfcXVldWVfaW5pdCgmcy0+cV9wcmVkbWEpOworCWl2dHZfcXVldWVfaW5pdCgmcy0+cV9pbyk7Cit9CisKK3N0YXRpYyBpbnQgaXZ0dl9yZWdfZGV2KHN0cnVjdCBpdnR2ICppdHYsIGludCB0eXBlKQoreworCXN0cnVjdCBpdnR2X3N0cmVhbSAqcyA9ICZpdHYtPnN0cmVhbXNbdHlwZV07CisJaW50IHZmbF90eXBlID0gaXZ0dl9zdHJlYW1faW5mb1t0eXBlXS52ZmxfdHlwZTsKKwlpbnQgbWlub3Jfb2Zmc2V0ID0gaXZ0dl9zdHJlYW1faW5mb1t0eXBlXS5taW5vcl9vZmZzZXQ7CisJaW50IG1pbm9yOworCisJLyogVGhlc2UgZm91ciBmaWVsZHMgYXJlIGFsd2F5cyBpbml0aWFsaXplZC4gSWYgdjRsMmRldiA9PSBOVUxMLCB0aGVuCisJICAgdGhpcyBzdHJlYW0gaXMgbm90IGluIHVzZS4gSW4gdGhhdCBjYXNlIG5vIG90aGVyIGZpZWxkcyBidXQgdGhlc2UKKwkgICBmb3VyIGNhbiBiZSB1c2VkLiAqLworCXMtPnY0bDJkZXYgPSBOVUxMOworCXMtPml0diA9IGl0djsKKwlzLT50eXBlID0gdHlwZTsKKwlzLT5uYW1lID0gaXZ0dl9zdHJlYW1faW5mb1t0eXBlXS5uYW1lOworCisJLyogQ2hlY2sgd2hldGhlciB0aGUgcmFkaW8gaXMgc3VwcG9ydGVkICovCisJaWYgKHR5cGUgPT0gSVZUVl9FTkNfU1RSRUFNX1RZUEVfUkFEICYmICEoaXR2LT52NGwyX2NhcCAmIFY0TDJfQ0FQX1JBRElPKSkKKwkJcmV0dXJuIDA7CisJaWYgKHR5cGUgPj0gSVZUVl9ERUNfU1RSRUFNX1RZUEVfTVBHICYmICEoaXR2LT52NGwyX2NhcCAmIFY0TDJfQ0FQX1ZJREVPX09VVFBVVCkpCisJCXJldHVybiAwOworCisJaWYgKG1pbm9yX29mZnNldCA+PSAwKQorCQkvKiBjYXJkIG51bWJlciArIHVzZXIgZGVmaW5lZCBvZmZzZXQgKyBkZXZpY2Ugb2Zmc2V0ICovCisJCW1pbm9yID0gaXR2LT5udW0gKyBpdnR2X2ZpcnN0X21pbm9yICsgbWlub3Jfb2Zmc2V0OworCWVsc2UKKwkJbWlub3IgPSAtMTsKKworCS8qIFVzZXIgZXhwbGljaXRseSBzZWxlY3RlZCAwIGJ1ZmZlcnMgZm9yIHRoZXNlIHN0cmVhbXMsIHNvIGRvbid0CisJICAgY3JlYXRlIHRoZW0uICovCisJaWYgKG1pbm9yID49IDAgJiYgaXZ0dl9zdHJlYW1faW5mb1t0eXBlXS5kbWEgIT0gUENJX0RNQV9OT05FICYmCisJICAgIGl0di0+b3B0aW9ucy5tZWdhYnl0ZXNbdHlwZV0gPT0gMCkgeworCQlJVlRWX0lORk8oIkRpc2FibGVkICVzIGRldmljZVxuIiwgaXZ0dl9zdHJlYW1faW5mb1t0eXBlXS5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaXZ0dl9zdHJlYW1faW5pdChpdHYsIHR5cGUpOworCisJLyogYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgdGhlIHY0bDIgdmlkZW8gZGV2aWNlIHN0cnVjdHVyZSAqLworCXMtPnY0bDJkZXYgPSB2aWRlb19kZXZpY2VfYWxsb2MoKTsKKwlpZiAocy0+djRsMmRldiA9PSBOVUxMKSB7CisJCUlWVFZfRVJSKCJDb3VsZG4ndCBhbGxvY2F0ZSB2NGwyIHZpZGVvX2RldmljZSBmb3IgJXNcbiIsIHMtPm5hbWUpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlzLT52NGwyZGV2LT50eXBlID0gVklEX1RZUEVfQ0FQVFVSRSB8IFZJRF9UWVBFX1RVTkVSIHwgVklEX1RZUEVfVEVMRVRFWFQgfAorCQkgICAgVklEX1RZUEVfQ0xJUFBJTkcgfCBWSURfVFlQRV9TQ0FMRVMgfCBWSURfVFlQRV9NUEVHX0VOQ09ERVI7CisJaWYgKGl0di0+djRsMl9jYXAgJiBWNEwyX0NBUF9WSURFT19PVVRQVVQpIHsKKwkJcy0+djRsMmRldi0+dHlwZSB8PSBWSURfVFlQRV9NUEVHX0RFQ09ERVI7CisJfQorCXNucHJpbnRmKHMtPnY0bDJkZXYtPm5hbWUsIHNpemVvZihzLT52NGwyZGV2LT5uYW1lKSwgIml2dHYlZCAlcyIsCisJCQlpdHYtPm51bSwgcy0+bmFtZSk7CisKKwlzLT52NGwyZGV2LT5taW5vciA9IG1pbm9yOworCXMtPnY0bDJkZXYtPmRldiA9ICZpdHYtPmRldi0+ZGV2OworCXMtPnY0bDJkZXYtPmZvcHMgPSBpdnR2X3N0cmVhbV9pbmZvW3R5cGVdLmZvcHM7CisJcy0+djRsMmRldi0+cmVsZWFzZSA9IHZpZGVvX2RldmljZV9yZWxlYXNlOworCisJaWYgKG1pbm9yID49IDApIHsKKwkJLyogUmVnaXN0ZXIgZGV2aWNlLiBGaXJzdCB0cnkgdGhlIGRlc2lyZWQgbWlub3IsIHRoZW4gYW55IGZyZWUgb25lLiAqLworCQlpZiAodmlkZW9fcmVnaXN0ZXJfZGV2aWNlKHMtPnY0bDJkZXYsIHZmbF90eXBlLCBtaW5vcikgJiYKKwkJICAgIHZpZGVvX3JlZ2lzdGVyX2RldmljZShzLT52NGwyZGV2LCB2ZmxfdHlwZSwgLTEpKSB7CisJCQlJVlRWX0VSUigiQ291bGRuJ3QgcmVnaXN0ZXIgdjRsMiBkZXZpY2UgZm9yICVzIG1pbm9yICVkXG4iLAorCQkJCQlzLT5uYW1lLCBtaW5vcik7CisJCQl2aWRlb19kZXZpY2VfcmVsZWFzZShzLT52NGwyZGV2KTsKKwkJCXMtPnY0bDJkZXYgPSBOVUxMOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwl9CisJZWxzZSB7CisJCS8qIERvbid0IHJlZ2lzdGVyIGEgJ2hpZGRlbicgc3RyZWFtIChPU0QpICovCisJCUlWVFZfSU5GTygiQ3JlYXRlZCBmcmFtZWJ1ZmZlciBzdHJlYW0gZm9yICVzXG4iLCBzLT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJc3dpdGNoICh2ZmxfdHlwZSkgeworCWNhc2UgVkZMX1RZUEVfR1JBQkJFUjoKKwkJSVZUVl9JTkZPKCJSZWdpc3RlcmVkIGRldmljZSB2aWRlbyVkIGZvciAlcyAoJWQgTUIpXG4iLAorCQkJcy0+djRsMmRldi0+bWlub3IsIHMtPm5hbWUsIGl0di0+b3B0aW9ucy5tZWdhYnl0ZXNbdHlwZV0pOworCQlicmVhazsKKwljYXNlIFZGTF9UWVBFX1JBRElPOgorCQlJVlRWX0lORk8oIlJlZ2lzdGVyZWQgZGV2aWNlIHJhZGlvJWQgZm9yICVzXG4iLAorCQkJcy0+djRsMmRldi0+bWlub3IgLSBNSU5PUl9WRkxfVFlQRV9SQURJT19NSU4sIHMtPm5hbWUpOworCQlicmVhazsKKwljYXNlIFZGTF9UWVBFX1ZCSToKKwkJaWYgKGl0di0+b3B0aW9ucy5tZWdhYnl0ZXNbdHlwZV0pCisJCQlJVlRWX0lORk8oIlJlZ2lzdGVyZWQgZGV2aWNlIHZiaSVkIGZvciAlcyAoJWQgTUIpXG4iLAorCQkJCXMtPnY0bDJkZXYtPm1pbm9yIC0gTUlOT1JfVkZMX1RZUEVfVkJJX01JTiwKKwkJCQlzLT5uYW1lLCBpdHYtPm9wdGlvbnMubWVnYWJ5dGVzW3R5cGVdKTsKKwkJZWxzZQorCQkJSVZUVl9JTkZPKCJSZWdpc3RlcmVkIGRldmljZSB2YmklZCBmb3IgJXNcbiIsCisJCQkJcy0+djRsMmRldi0+bWlub3IgLSBNSU5PUl9WRkxfVFlQRV9WQklfTUlOLCBzLT5uYW1lKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCisvKiBJbml0aWFsaXplIHY0bDIgdmFyaWFibGVzIGFuZCByZWdpc3RlciB2NGwyIGRldmljZXMgKi8KK2ludCBpdnR2X3N0cmVhbXNfc2V0dXAoc3RydWN0IGl2dHYgKml0dikKK3sKKwlpbnQgdHlwZTsKKworCS8qIFNldHVwIFY0TDIgRGV2aWNlcyAqLworCWZvciAodHlwZSA9IDA7IHR5cGUgPCBJVlRWX01BWF9TVFJFQU1TOyB0eXBlKyspIHsKKwkJLyogUmVnaXN0ZXIgRGV2aWNlICovCisJCWlmIChpdnR2X3JlZ19kZXYoaXR2LCB0eXBlKSkKKwkJCWJyZWFrOworCisJCWlmIChpdHYtPnN0cmVhbXNbdHlwZV0udjRsMmRldiA9PSBOVUxMKQorCQkJY29udGludWU7CisKKwkJLyogQWxsb2NhdGUgU3RyZWFtICovCisJCWlmIChpdnR2X3N0cmVhbV9hbGxvYygmaXR2LT5zdHJlYW1zW3R5cGVdKSkKKwkJCWJyZWFrOworCX0KKwlpZiAodHlwZSA9PSBJVlRWX01BWF9TVFJFQU1TKSB7CisJCXJldHVybiAwOworCX0KKworCS8qIE9uZSBvciBtb3JlIHN0cmVhbXMgY291bGQgbm90IGJlIGluaXRpYWxpemVkLiBDbGVhbiAnZW0gYWxsIHVwLiAqLworCWl2dHZfc3RyZWFtc19jbGVhbnVwKGl0dik7CisJcmV0dXJuIC1FTk9NRU07Cit9CisKKy8qIFVucmVnaXN0ZXIgdjRsMiBkZXZpY2VzICovCit2b2lkIGl2dHZfc3RyZWFtc19jbGVhbnVwKHN0cnVjdCBpdnR2ICppdHYpCit7CisJaW50IHR5cGU7CisKKwkvKiBUZWFyZG93biBhbGwgc3RyZWFtcyAqLworCWZvciAodHlwZSA9IDA7IHR5cGUgPCBJVlRWX01BWF9TVFJFQU1TOyB0eXBlKyspIHsKKwkJc3RydWN0IHZpZGVvX2RldmljZSAqdmRldiA9IGl0di0+c3RyZWFtc1t0eXBlXS52NGwyZGV2OworCisJCWl0di0+c3RyZWFtc1t0eXBlXS52NGwyZGV2ID0gTlVMTDsKKwkJaWYgKHZkZXYgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCisJCWl2dHZfc3RyZWFtX2ZyZWUoJml0di0+c3RyZWFtc1t0eXBlXSk7CisJCS8qIEZyZWUgRGV2aWNlICovCisJCWlmICh2ZGV2LT5taW5vciA9PSAtMSkgLyogJ0hpZGRlbicgbmV2ZXIgcmVnaXN0ZXJlZCBzdHJlYW0gKE9TRCkgKi8KKwkJCXZpZGVvX2RldmljZV9yZWxlYXNlKHZkZXYpOworCQllbHNlICAgIC8qIEFsbCBvdGhlcnMsIGp1c3QgdW5yZWdpc3Rlci4gKi8KKwkJCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKHZkZXYpOworCX0KK30KKworc3RhdGljIHZvaWQgaXZ0dl92Ymlfc2V0dXAoc3RydWN0IGl2dHYgKml0dikKK3sKKwlpbnQgcmF3ID0gaXR2LT52Ymkuc2xpY2VkX2luLT5zZXJ2aWNlX3NldCA9PSAwOworCXUzMiBkYXRhW0NYMjM0MVhfTUJPWF9NQVhfREFUQV07CisJaW50IGxpbmVzOworCWludCBpOworCisJLyogSWYgRW1iZWQgdGhlbiBzdHJlYW10eXBlIG11c3QgYmUgUHJvZ3JhbSAqLworCS8qIFRPRE86IHNob3VsZCB3ZSByZWFsbHkgZG8gdGhpcz8gKi8KKwlpZiAoMCAmJiAhcmF3ICYmIGl0di0+dmJpLmluc2VydF9tcGVnKSB7CisJCWl0di0+cGFyYW1zLnN0cmVhbV90eXBlID0gMDsKKworCQkvKiBhc3NpZ24gc3RyZWFtIHR5cGUgKi8KKwkJaXZ0dl92YXBpKGl0diwgQ1gyMzQxWF9FTkNfU0VUX1NUUkVBTV9UWVBFLCAxLCBpdHYtPnBhcmFtcy5zdHJlYW1fdHlwZSk7CisJfQorCisJLyogUmVzZXQgVkJJICovCisJaXZ0dl92YXBpKGl0diwgQ1gyMzQxWF9FTkNfU0VUX1ZCSV9MSU5FLCA1LCAweGZmZmYgLCAwLCAwLCAwLCAwKTsKKworCWlmIChpdHYtPmlzXzYwaHopIHsKKwkJaXR2LT52YmkuY291bnQgPSAxMjsKKwkJaXR2LT52Ymkuc3RhcnRbMF0gPSAxMDsKKwkJaXR2LT52Ymkuc3RhcnRbMV0gPSAyNzM7CisJfSBlbHNlIHsgICAgICAgIC8qIFBBTC9TRUNBTSAqLworCQlpdHYtPnZiaS5jb3VudCA9IDE4OworCQlpdHYtPnZiaS5zdGFydFswXSA9IDY7CisJCWl0di0+dmJpLnN0YXJ0WzFdID0gMzE4OworCX0KKworCS8qIHNldHVwIFZCSSByZWdpc3RlcnMgKi8KKwlpdHYtPnZpZGVvX2RlY19mdW5jKGl0diwgVklESU9DX1NfRk1ULCAmaXR2LT52YmkuaW4pOworCisJLyogZGV0ZXJtaW5lIG51bWJlciBvZiBsaW5lcyBhbmQgdG90YWwgbnVtYmVyIG9mIFZCSSBieXRlcy4KKwkgICBBIHJhdyBsaW5lIHRha2VzIDE0NDMgYnl0ZXM6IDIgKiA3MjAgKyA0IGJ5dGUgZnJhbWUgaGVhZGVyIC0gMQorCSAgIFRoZSAnLSAxJyBieXRlIGlzIHByb2JhYmx5IGFuIHVudXNlZCBVIG9yIFYgYnl0ZS4gT3Igc29tZXRoaW5nLi4uCisJICAgQSBzbGljZWQgbGluZSB0YWtlcyA1MSBieXRlczogNCBieXRlIGZyYW1lIGhlYWRlciwgNCBieXRlIGludGVybmFsCisJICAgaGVhZGVyLCA0MiBkYXRhIGJ5dGVzICsgY2hlY2tzdW0gKHRvIGJlIGNvbmZpcm1lZCkgKi8KKwlpZiAocmF3KSB7CisJCWxpbmVzID0gaXR2LT52YmkuY291bnQgKiAyOworCX0gZWxzZSB7CisJCWxpbmVzID0gaXR2LT5pc182MGh6ID8gMjQgOiAzODsKKwkJaWYgKGl0di0+aXNfNjBoeiAmJiAoaXR2LT5od19mbGFncyAmIElWVFZfSFdfQ1gyNTg0MCkpCisJCQlsaW5lcyArPSAyOworCX0KKworCWl0di0+dmJpLmVuY19zaXplID0gbGluZXMgKiAocmF3ID8gaXR2LT52YmkucmF3X3NpemUgOiBpdHYtPnZiaS5zbGljZWRfc2l6ZSk7CisKKwkvKiBOb3RlOiBzbGljZWQgdnMgcmF3IGZsYWcgZG9lc24ndCBzZWVtIHRvIGhhdmUgYW55IGVmZmVjdAorCSAgIFRPRE86IGNoZWNrIG1vZGUgKDB4MDIpIHZhbHVlIHdpdGggb2xkZXIgaXZ0diB2ZXJzaW9ucy4gKi8KKwlkYXRhWzBdID0gcmF3IHwgMHgwMiB8ICgweGJkIDw8IDgpOworCisJLyogRXZlcnkgWCBudW1iZXIgb2YgZnJhbWVzIGEgVkJJIGludGVycnVwdCBhcnJpdmVzIChmcmFtZXMgYXMgaW4gMjUgb3IgMzAgZnBzKSAqLworCWRhdGFbMV0gPSAxOworCS8qIFRoZSBWQkkgZnJhbWVzIGFyZSBzdG9yZWQgaW4gYSByaW5nYnVmZmVyIHdpdGggdGhpcyBzaXplICh3aXRoIGEgVkJJIGZyYW1lIGFzIHVuaXQpICovCisJZGF0YVsyXSA9IHJhdyA/IDQgOiA4OworCS8qIFRoZSBzdGFydC9zdG9wIGNvZGVzIGRldGVybWluZSB3aGljaCBWQkkgbGluZXMgZW5kIHVwIGluIHRoZSByYXcgVkJJIGRhdGEgYXJlYS4KKwkgICBUaGUgY29kZXMgYXJlIGZyb20gdGFibGUgMjQgaW4gdGhlIHNhYTcxMTUgZGF0YXNoZWV0LiBFYWNoIHJhdy9zbGljZWQvdmlkZW8gbGluZQorCSAgIGlzIGZyYW1lZCB3aXRoIGNvZGVzIEZGMDAwMFhYIHdoZXJlIFhYIGlzIHRoZSBTQVYvRUFWIChTdGFydC9FbmQgb2YgQWN0aXZlIFZpZGVvKQorCSAgIGNvZGUuIFRoZXNlIHZhbHVlcyBmb3IgcmF3IFZCSSBhcmUgb2J0YWluZWQgZnJvbSBhIGRyaXZlciBkaXNhc3NlbWJseS4gVGhlIHNsaWNlZAorCSAgIHN0YXJ0L3N0b3AgY29kZXMgd2FzIGRlZHVjZWQgZnJvbSB0aGlzLCBidXQgdGhleSBkbyBub3QgYXBwZWFyIGluIHRoZSBkcml2ZXIuCisJICAgT3RoZXIgY29kZSBwYWlycyB0aGF0IEkgZm91bmQgYXJlOiAweDI1MEU2MjQ5LzB4MTM1NDU0NTQgYW5kIDB4MjUyNTYyNjIvMHgzODEzN0Y1NC4KKwkgICBIb3dldmVyLCBJIGhhdmUgbm8gaWRlYSB3aGF0IHRoZXNlIHZhbHVlcyBhcmUgZm9yLiAqLworCWlmIChpdHYtPmh3X2ZsYWdzICYgSVZUVl9IV19DWDI1ODQwKSB7CisJCS8qIFNldHVwIFZCSSBmb3IgdGhlIGN4MjU4NDAgZGlnaXRpemVyICovCisJCWlmIChyYXcpIHsKKwkJCWRhdGFbM10gPSAweDIwNjAyMDYwOworCQkJZGF0YVs0XSA9IDB4MzA3MDMwNzA7CisJCX0gZWxzZSB7CisJCQlkYXRhWzNdID0gMHhCMEYwQjBGMDsKKwkJCWRhdGFbNF0gPSAweEEwRTBBMEUwOworCQl9CisJCS8qIExpbmVzIHBlciBmcmFtZSAqLworCQlkYXRhWzVdID0gbGluZXM7CisJCS8qIGJ5dGVzIHBlciBsaW5lICovCisJCWRhdGFbNl0gPSAocmF3ID8gaXR2LT52YmkucmF3X3NpemUgOiBpdHYtPnZiaS5zbGljZWRfc2l6ZSk7CisJfSBlbHNlIHsKKwkJLyogU2V0dXAgVkJJIGZvciB0aGUgc2FhNzExNSBkaWdpdGl6ZXIgKi8KKwkJaWYgKHJhdykgeworCQkJZGF0YVszXSA9IDB4MjUyNTYyNjI7CisJCQlkYXRhWzRdID0gMHgzODdGN0Y3RjsKKwkJfSBlbHNlIHsKKwkJCWRhdGFbM10gPSAweEFCQUJFQ0VDOworCQkJZGF0YVs0XSA9IDB4QjZGMUYxRjE7CisJCX0KKwkJLyogTGluZXMgcGVyIGZyYW1lICovCisJCWRhdGFbNV0gPSBsaW5lczsKKwkJLyogYnl0ZXMgcGVyIGxpbmUgKi8KKwkJZGF0YVs2XSA9IGl0di0+dmJpLmVuY19zaXplIC8gbGluZXM7CisJfQorCisJSVZUVl9ERUJVR19JTkZPKAorCQkiU2V0dXAgVkJJIEFQSSBoZWFkZXIgMHglMDh4IHBrdHMgJWQgYnVmZnMgJWQgbG4gJWQgc3ogJWRcbiIsCisJCQlkYXRhWzBdLCBkYXRhWzFdLCBkYXRhWzJdLCBkYXRhWzVdLCBkYXRhWzZdKTsKKworCWl2dHZfYXBpKGl0diwgQ1gyMzQxWF9FTkNfU0VUX1ZCSV9DT05GSUcsIDcsIGRhdGEpOworCisJLyogcmV0dXJucyB0aGUgVkJJIGVuY29kZXIgbWVtb3J5IGFyZWEuICovCisJaXR2LT52YmkuZW5jX3N0YXJ0ID0gZGF0YVsyXTsKKwlpdHYtPnZiaS5mcGkgPSBkYXRhWzBdOworCWlmICghaXR2LT52YmkuZnBpKQorCQlpdHYtPnZiaS5mcGkgPSAxOworCisJSVZUVl9ERUJVR19JTkZPKCJTZXR1cCBWQkkgc3RhcnQgMHglMDh4IGZyYW1lcyAlZCBmcGkgJWQgbGluZXMgMHglMDh4XG4iLAorCQlpdHYtPnZiaS5lbmNfc3RhcnQsIGRhdGFbMV0sIGl0di0+dmJpLmZwaSwgaXR2LT5kaWdpdGl6ZXIpOworCisJLyogc2VsZWN0IFZCSSBsaW5lcy4KKwkgICBOb3RlIHRoYXQgdGhlIHNsaWNlZCBhcmd1bWVudCBzZWVtcyB0byBoYXZlIG5vIGVmZmVjdC4gKi8KKwlmb3IgKGkgPSAyOyBpIDw9IDI0OyBpKyspIHsKKwkJaW50IHZhbGlkOworCisJCWlmIChpdHYtPmlzXzYwaHopIHsKKwkJCXZhbGlkID0gaSA+PSAxMCAmJiBpIDwgMjI7CisJCX0gZWxzZSB7CisJCQl2YWxpZCA9IGkgPj0gNiAmJiBpIDwgMjQ7CisJCX0KKwkJaXZ0dl92YXBpKGl0diwgQ1gyMzQxWF9FTkNfU0VUX1ZCSV9MSU5FLCA1LCBpIC0gMSwKKwkJCQl2YWxpZCwgMCAsIDAsIDApOworCQlpdnR2X3ZhcGkoaXR2LCBDWDIzNDFYX0VOQ19TRVRfVkJJX0xJTkUsIDUsIChpIC0gMSkgfCAweDgwMDAwMDAwLAorCQkJCXZhbGlkLCAwLCAwLCAwKTsKKwl9CisKKwkvKiBSZW1haW5pbmcgVkJJIHF1ZXN0aW9uczoKKwkgICAtIElzIGl0IHBvc3NpYmxlIHRvIHNlbGVjdCBwYXJ0aWN1bGFyIFZCSSBsaW5lcyBvbmx5IGZvciBpbmNsdXNpb24gaW4gdGhlIE1QRUcKKwkgICBzdHJlYW0/IEN1cnJlbnRseSB5b3UgY2FuIG9ubHkgZ2V0IHRoZSBmaXJzdCBYIGxpbmVzLgorCSAgIC0gSXMgbWl4ZWQgcmF3IGFuZCBzbGljZWQgVkJJIHBvc3NpYmxlPworCSAgIC0gV2hhdCdzIHRoZSBtZWFuaW5nIG9mIHRoZSByYXcvc2xpY2VkIGZsYWc/CisJICAgLSBXaGF0J3MgdGhlIG1lYW5pbmcgb2YgcGFyYW1zIDIsIDMgJiA0IG9mIHRoZSBTZWxlY3QgVkJJIGNvbW1hbmQ/ICovCit9CisKK2ludCBpdnR2X3N0YXJ0X3Y0bDJfZW5jb2RlX3N0cmVhbShzdHJ1Y3QgaXZ0dl9zdHJlYW0gKnMpCit7CisJdTMyIGRhdGFbQ1gyMzQxWF9NQk9YX01BWF9EQVRBXTsKKwlzdHJ1Y3QgaXZ0diAqaXR2ID0gcy0+aXR2OworCWludCBjYXB0eXBlID0gMCwgc3VidHlwZSA9IDA7CisJaW50IGVuYWJsZV9wYXNzdGhyb3VnaCA9IDA7CisKKwlpZiAocy0+djRsMmRldiA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCUlWVFZfREVCVUdfSU5GTygiU3RhcnQgZW5jb2RlciBzdHJlYW0gJXNcbiIsIHMtPm5hbWUpOworCisJc3dpdGNoIChzLT50eXBlKSB7CisJY2FzZSBJVlRWX0VOQ19TVFJFQU1fVFlQRV9NUEc6CisJCWNhcHR5cGUgPSAwOworCQlzdWJ0eXBlID0gMzsKKworCQkvKiBTdG9wIFBhc3N0aHJvdWdoICovCisJCWlmIChpdHYtPm91dHB1dF9tb2RlID09IE9VVF9QQVNTVEhST1VHSCkgeworCQkJaXZ0dl9wYXNzdGhyb3VnaF9tb2RlKGl0diwgMCk7CisJCQllbmFibGVfcGFzc3Rocm91Z2ggPSAxOworCQl9CisJCWl0di0+bXBnX2RhdGFfcmVjZWl2ZWQgPSBpdHYtPnZiaV9kYXRhX2luc2VydGVkID0gMDsKKwkJaXR2LT5kdWFsd2F0Y2hfamlmZmllcyA9IGppZmZpZXM7CisJCWl0di0+ZHVhbHdhdGNoX3N0ZXJlb19tb2RlID0gaXR2LT5wYXJhbXMuYXVkaW9fcHJvcGVydGllcyAmIDB4MDMwMDsKKwkJaXR2LT5zZWFyY2hfcGFja19oZWFkZXIgPSAwOworCQlicmVhazsKKworCWNhc2UgSVZUVl9FTkNfU1RSRUFNX1RZUEVfWVVWOgorCQlpZiAoaXR2LT5vdXRwdXRfbW9kZSA9PSBPVVRfUEFTU1RIUk9VR0gpIHsKKwkJCWNhcHR5cGUgPSAyOworCQkJc3VidHlwZSA9IDExOwkvKiB2aWRlbythdWRpbytkZWNvZGVyICovCisJCQlicmVhazsKKwkJfQorCQljYXB0eXBlID0gMTsKKwkJc3VidHlwZSA9IDE7CisJCWJyZWFrOworCWNhc2UgSVZUVl9FTkNfU1RSRUFNX1RZUEVfUENNOgorCQljYXB0eXBlID0gMTsKKwkJc3VidHlwZSA9IDI7CisJCWJyZWFrOworCWNhc2UgSVZUVl9FTkNfU1RSRUFNX1RZUEVfVkJJOgorCQljYXB0eXBlID0gMTsKKwkJc3VidHlwZSA9IDQ7CisKKwkJaXR2LT52YmkuZnJhbWUgPSAwOworCQlpdHYtPnZiaS5pbnNlcnRlZF9mcmFtZSA9IDA7CisJCW1lbXNldChpdHYtPnZiaS5zbGljZWRfbXBlZ19zaXplLAorCQkJMCwgc2l6ZW9mKGl0di0+dmJpLnNsaWNlZF9tcGVnX3NpemUpKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXMtPnN1YnR5cGUgPSBzdWJ0eXBlOworCXMtPmJ1ZmZlcnNfc3RvbGVuID0gMDsKKworCS8qIG11dGUvdW5tdXRlIHZpZGVvICovCisJaXZ0dl92YXBpKGl0diwgQ1gyMzQxWF9FTkNfTVVURV9WSURFTywgMSwgdGVzdF9iaXQoSVZUVl9GX0lfUkFESU9fVVNFUiwgJml0di0+aV9mbGFncykgPyAxIDogMCk7CisKKwkvKiBDbGVhciBTdHJlYW1vZmYgZmxhZ3MgaW4gY2FzZSBsZWZ0IGZyb20gbGFzdCBjYXB0dXJlICovCisJY2xlYXJfYml0KElWVFZfRl9TX1NUUkVBTU9GRiwgJnMtPnNfZmxhZ3MpOworCisJaWYgKGF0b21pY19yZWFkKCZpdHYtPmNhcHR1cmluZykgPT0gMCkgeworCQkvKiBBbHdheXMgdXNlIGZyYW1lIGJhc2VkIG1vZGUuIEV4cGVyaW1lbnRzIGhhdmUgZGVtb25zdHJhdGVkIHRoYXQgYnl0ZQorCQkgICBzdHJlYW0gYmFzZWQgbW9kZSByZXN1bHRzIGluIGRyb3BwZWQgZnJhbWVzIGFuZCBjb3JydXB0aW9uLiBOb3Qgb2Z0ZW4sCisJCSAgIGJ1dCBvY2Nhc2lvbmFsbHkuIE1hbnkgdGhhbmtzIGdvIHRvIExlb25hcmQgT3JiIHdobyBzcGVudCBhIGxvdCBvZgorCQkgICBlZmZvcnQgYW5kIHRpbWUgdHJ5aW5nIHRvIHRyYWNlIHRoZSBjYXVzZSBvZiB0aGUgZHJvcCBvdXRzLiAqLworCQkvKiAxIGZyYW1lIHBlciBETUEgKi8KKwkJLyppdnR2X3ZhcGkoaXR2LCBDWDIzNDFYX0VOQ19TRVRfRE1BX0JMT0NLX1NJWkUsIDIsIDEyOCwgMCk7ICovCisJCWl2dHZfdmFwaShpdHYsIENYMjM0MVhfRU5DX1NFVF9ETUFfQkxPQ0tfU0laRSwgMiwgMSwgMSk7CisKKwkJLyogU3R1ZmYgZnJvbSBXaW5kb3dzLCB3ZSBkb24ndCBrbm93IHdoYXQgaXQgaXMgKi8KKwkJaXZ0dl92YXBpKGl0diwgQ1gyMzQxWF9FTkNfU0VUX1ZFUlRfQ1JPUF9MSU5FLCAxLCAwKTsKKwkJLyogQWNjb3JkaW5nIHRvIHRoZSBkb2NzLCB0aGlzIHNob3VsZCBiZSBjb3JyZWN0LiBIb3dldmVyLCB0aGlzIGlzCisJCSAgIHVudGVzdGVkLiBJIGRvbid0IGRhcmUgZW5hYmxlIHRoaXMgd2l0aG91dCBoYXZpbmcgdGVzdGVkIGl0LgorCQkgICBPbmx5IHZlcnkgZmV3IG9sZCBjYXJkcyBhY3R1YWxseSBoYXZlIHRoaXMgaGFyZHdhcmUgY29tYmluYXRpb24uCisJCWl2dHZfdmFwaShpdHYsIENYMjM0MVhfRU5DX1NFVF9WRVJUX0NST1BfTElORSwgMSwKKwkJCSgoaXR2LT5od19mbGFncyAmIElWVFZfSFdfU0FBNzExNCkgJiYgaXR2LT5pc182MGh6KSA/IDEwMDAxIDogMCk7CisJCSovCisJCWl2dHZfdmFwaShpdHYsIENYMjM0MVhfRU5DX01JU0MsIDIsIDMsICFpdHYtPmhhc19jeDIzNDE1KTsKKwkJaXZ0dl92YXBpKGl0diwgQ1gyMzQxWF9FTkNfTUlTQywgMiwgOCwgMCk7CisJCWl2dHZfdmFwaShpdHYsIENYMjM0MVhfRU5DX01JU0MsIDIsIDQsIDEpOworCQlpdnR2X3ZhcGkoaXR2LCBDWDIzNDFYX0VOQ19NSVNDLCAxLCAxMik7CisKKwkJLyogYXNzaWduIHBsYWNlaG9sZGVyICovCisJCWl2dHZfdmFwaShpdHYsIENYMjM0MVhfRU5DX1NFVF9QTEFDRUhPTERFUiwgMTIsCisJCQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwKTsKKworCQlpdnR2X3ZhcGkoaXR2LCBDWDIzNDFYX0VOQ19TRVRfTlVNX1ZTWU5DX0xJTkVTLCAyLCBpdHYtPmRpZ2l0aXplciwgaXR2LT5kaWdpdGl6ZXIpOworCisJCS8qIFNldHVwIFZCSSAqLworCQlpZiAoaXR2LT52NGwyX2NhcCAmIFY0TDJfQ0FQX1ZCSV9DQVBUVVJFKSB7CisJCQlpdnR2X3ZiaV9zZXR1cChpdHYpOworCQl9CisKKwkJLyogYXNzaWduIHByb2dyYW0gaW5kZXggaW5mby4gTWFzayA3OiBzZWxlY3QgSS9QL0IsIE51bV9yZXE6IDQwMCBtYXggKi8KKwkJaXZ0dl92YXBpX3Jlc3VsdChpdHYsIGRhdGEsIENYMjM0MVhfRU5DX1NFVF9QR01fSU5ERVhfSU5GTywgMiwgNywgNDAwKTsKKwkJaXR2LT5wZ21faW5mb19vZmZzZXQgPSBkYXRhWzBdOworCQlpdHYtPnBnbV9pbmZvX251bSA9IGRhdGFbMV07CisJCWl0di0+cGdtX2luZm9fd3JpdGVfaWR4ID0gMDsKKwkJaXR2LT5wZ21faW5mb19yZWFkX2lkeCA9IDA7CisKKwkJSVZUVl9ERUJVR19JTkZPKCJQR00gSW5kZXggYXQgMHglMDh4IHdpdGggJWQgZWxlbWVudHNcbiIsCisJCQkJaXR2LT5wZ21faW5mb19vZmZzZXQsIGl0di0+cGdtX2luZm9fbnVtKTsKKworCQkvKiBTZXR1cCBBUEkgZm9yIFN0cmVhbSAqLworCQljeDIzNDF4X3VwZGF0ZShpdHYsIGl2dHZfYXBpX2Z1bmMsIE5VTEwsICZpdHYtPnBhcmFtcyk7CisJfQorCisJLyogVnN5bmMgU2V0dXAgKi8KKwlpZiAoaXR2LT5oYXNfY3gyMzQxNSAmJiAhdGVzdF9hbmRfc2V0X2JpdChJVlRWX0ZfSV9ESUdfUlNULCAmaXR2LT5pX2ZsYWdzKSkgeworCQkvKiBldmVudCBub3RpZmljYXRpb24gKG9uKSAqLworCQlpdnR2X3ZhcGkoaXR2LCBDWDIzNDFYX0VOQ19TRVRfRVZFTlRfTk9USUZJQ0FUSU9OLCA0LCAwLCAxLCBJVlRWX0lSUV9FTkNfVklNX1JTVCwgLTEpOworCQlpdnR2X2NsZWFyX2lycV9tYXNrKGl0diwgSVZUVl9JUlFfRU5DX1ZJTV9SU1QpOworCX0KKworCWlmIChhdG9taWNfcmVhZCgmaXR2LT5jYXB0dXJpbmcpID09IDApIHsKKwkJLyogQ2xlYXIgYWxsIFBlbmRpbmcgSW50ZXJydXB0cyAqLworCQlpdnR2X3NldF9pcnFfbWFzayhpdHYsIElWVFZfSVJRX01BU0tfQ0FQVFVSRSk7CisKKwkJY2xlYXJfYml0KElWVFZfRl9JX0VPUywgJml0di0+aV9mbGFncyk7CisKKwkJLyogSW5pdGlhbGl6ZSBEaWdpdGl6ZXIgZm9yIENhcHR1cmUgKi8KKwkJaXZ0dl92YXBpKGl0diwgQ1gyMzQxWF9FTkNfSU5JVElBTElaRV9JTlBVVCwgMCk7CisKKwkJaXZ0dl9zbGVlcF90aW1lb3V0KEhaIC8gMTAsIDApOworCX0KKworCS8qIGJlZ2luX2NhcHR1cmUgKi8KKwlpZiAoaXZ0dl92YXBpKGl0diwgQ1gyMzQxWF9FTkNfU1RBUlRfQ0FQVFVSRSwgMiwgY2FwdHlwZSwgc3VidHlwZSkpCisJeworCQlJVlRWX0RFQlVHX1dBUk4oICJFcnJvciBzdGFydGluZyBjYXB0dXJlIVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIFN0YXJ0IFBhc3N0aHJvdWdoICovCisJaWYgKGVuYWJsZV9wYXNzdGhyb3VnaCkgeworCQlpdnR2X3Bhc3N0aHJvdWdoX21vZGUoaXR2LCAxKTsKKwl9CisKKwlpZiAocy0+dHlwZSA9PSBJVlRWX0VOQ19TVFJFQU1fVFlQRV9WQkkpCisJCWl2dHZfY2xlYXJfaXJxX21hc2soaXR2LCBJVlRWX0lSUV9FTkNfVkJJX0NBUCk7CisJZWxzZQorCQlpdnR2X2NsZWFyX2lycV9tYXNrKGl0diwgSVZUVl9JUlFfTUFTS19DQVBUVVJFKTsKKworCS8qIHlvdSdyZSBsaXZlISBzaXQgYmFjayBhbmQgYXdhaXQgaW50ZXJydXB0cyA6KSAqLworCWF0b21pY19pbmMoJml0di0+Y2FwdHVyaW5nKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpdnR2X3NldHVwX3Y0bDJfZGVjb2RlX3N0cmVhbShzdHJ1Y3QgaXZ0dl9zdHJlYW0gKnMpCit7CisJdTMyIGRhdGFbQ1gyMzQxWF9NQk9YX01BWF9EQVRBXTsKKwlzdHJ1Y3QgaXZ0diAqaXR2ID0gcy0+aXR2OworCWludCBkYXRhdHlwZTsKKworCWlmIChzLT52NGwyZGV2ID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJSVZUVl9ERUJVR19JTkZPKCJTZXR0aW5nIHNvbWUgaW5pdGlhbCBkZWNvZGVyIHNldHRpbmdzXG4iKTsKKworCS8qIGRpc2FibGUgVkJJIHNpZ25hbHMsIGlmIHRoZSBNUEVHIHN0cmVhbSBjb250YWlucyBWQkkgZGF0YSwKKwkgICB0aGVuIHRoYXQgZGF0YSB3aWxsIGJlIHByb2Nlc3NlZCBhdXRvbWF0aWNhbGx5IGZvciB5b3UuICovCisJaXZ0dl9kaXNhYmxlX3ZiaShpdHYpOworCisJLyogc2V0IGF1ZGlvIG1vZGUgdG8gbGVmdC9zdGVyZW8gIGZvciBkdWFsL3N0ZXJlbyBtb2RlLiAqLworCWl2dHZfdmFwaShpdHYsIENYMjM0MVhfREVDX1NFVF9BVURJT19NT0RFLCAyLCBpdHYtPmF1ZGlvX2JpbGluZ3VhbF9tb2RlLCBpdHYtPmF1ZGlvX3N0ZXJlb19tb2RlKTsKKworCS8qIHNldCBudW1iZXIgb2YgaW50ZXJuYWwgZGVjb2RlciBidWZmZXJzICovCisJaXZ0dl92YXBpKGl0diwgQ1gyMzQxWF9ERUNfU0VUX0RJU1BMQVlfQlVGRkVSUywgMSwgMCk7CisKKwkvKiBwcmVidWZmZXJpbmcgKi8KKwlpdnR2X3ZhcGkoaXR2LCBDWDIzNDFYX0RFQ19TRVRfUFJFQlVGRkVSSU5HLCAxLCAxKTsKKworCS8qIGV4dHJhY3QgZnJvbSB1c2VyIHBhY2tldHMgKi8KKwlpdnR2X3ZhcGlfcmVzdWx0KGl0diwgZGF0YSwgQ1gyMzQxWF9ERUNfRVhUUkFDVF9WQkksIDEsIDEpOworCWl0di0+dmJpLmRlY19zdGFydCA9IGRhdGFbMF07CisKKwlJVlRWX0RFQlVHX0lORk8oIkRlY29kZXIgVkJJIFJFLUluc2VydCBzdGFydCAweCUwOHggc2l6ZSAweCUwOHhcbiIsCisJCWl0di0+dmJpLmRlY19zdGFydCwgZGF0YVsxXSk7CisKKwkvKiBzZXQgZGVjb2RlciBzb3VyY2Ugc2V0dGluZ3MgKi8KKwkvKiBEYXRhIHR5cGU6IDAgPSBtcGVnIGZyb20gaG9zdCwKKwkgICAxID0geXV2IGZyb20gZW5jb2RlciwKKwkgICAyID0geXV2X2Zyb21faG9zdCAqLworCXN3aXRjaCAocy0+dHlwZSkgeworCWNhc2UgSVZUVl9ERUNfU1RSRUFNX1RZUEVfWVVWOgorCQlkYXRhdHlwZSA9IGl0di0+b3V0cHV0X21vZGUgPT0gT1VUX1BBU1NUSFJPVUdIID8gMSA6IDI7CisJCUlWVFZfREVCVUdfSU5GTygiU2V0dXAgREVDIFlVViBTdHJlYW0gZGF0YVswXSA9ICVkXG4iLCBkYXRhdHlwZSk7CisJCWJyZWFrOworCWNhc2UgSVZUVl9ERUNfU1RSRUFNX1RZUEVfTVBHOgorCWRlZmF1bHQ6CisJCWRhdGF0eXBlID0gMDsKKwkJYnJlYWs7CisJfQorCWlmIChpdnR2X3ZhcGkoaXR2LCBDWDIzNDFYX0RFQ19TRVRfREVDT0RFUl9TT1VSQ0UsIDQsIGRhdGF0eXBlLAorCQkJaXR2LT5wYXJhbXMud2lkdGgsIGl0di0+cGFyYW1zLmhlaWdodCwgaXR2LT5wYXJhbXMuYXVkaW9fcHJvcGVydGllcykpIHsKKwkJSVZUVl9ERUJVR19XQVJOKCJDT1VMRE4nVCBJTklUSUFMSVpFIERFQ09ERVIgU09VUkNFXG4iKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBpdnR2X3N0YXJ0X3Y0bDJfZGVjb2RlX3N0cmVhbShzdHJ1Y3QgaXZ0dl9zdHJlYW0gKnMsIGludCBnb3Bfb2Zmc2V0KQoreworCXN0cnVjdCBpdnR2ICppdHYgPSBzLT5pdHY7CisKKwlpZiAocy0+djRsMmRldiA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICh0ZXN0X2FuZF9zZXRfYml0KElWVFZfRl9TX1NUUkVBTUlORywgJnMtPnNfZmxhZ3MpKQorCQlyZXR1cm4gMDsJLyogYWxyZWFkeSBzdGFydGVkICovCisKKwlJVlRWX0RFQlVHX0lORk8oIlN0YXJ0aW5nIGRlY29kZSBzdHJlYW0gJXMgKGdvcF9vZmZzZXQgJWQpXG4iLCBzLT5uYW1lLCBnb3Bfb2Zmc2V0KTsKKworCS8qIENsZWFyIFN0cmVhbW9mZiAqLworCWlmIChzLT50eXBlID09IElWVFZfREVDX1NUUkVBTV9UWVBFX1lVVikgeworCQkvKiBJbml0aWFsaXplIERlY29kZXIgKi8KKwkJLyogUmVwcm9ncmFtIERlY29kZXIgWVVWIEJ1ZmZlcnMgZm9yIFlVViAqLworCQl3cml0ZV9yZWcoeXV2X29mZnNldFswXSA+PiA0LCAweDgyYyk7CisJCXdyaXRlX3JlZygoeXV2X29mZnNldFswXSArIElWVFZfWVVWX0JVRkZFUl9VVl9PRkZTRVQpID4+IDQsIDB4ODMwKTsKKwkJd3JpdGVfcmVnKHl1dl9vZmZzZXRbMF0gPj4gNCwgMHg4MzQpOworCQl3cml0ZV9yZWcoKHl1dl9vZmZzZXRbMF0gKyBJVlRWX1lVVl9CVUZGRVJfVVZfT0ZGU0VUKSA+PiA0LCAweDgzOCk7CisKKwkJd3JpdGVfcmVnX3N5bmMoMHgwMDAwMDAwMCB8ICgweDBjIDw8IDE2KSB8ICgweDBiIDw8IDgpLCAweDJkMjQpOworCisJCXdyaXRlX3JlZ19zeW5jKDB4MDAxMDgwODAsIDB4Mjg5OCk7CisJCS8qIEVuYWJsZSBZVVYgZGVjb2RlciBvdXRwdXQgKi8KKwkJd3JpdGVfcmVnX3N5bmMoMHgwMSwgSVZUVl9SRUdfVkRNKTsKKwl9CisKKwlpdnR2X3NldHVwX3Y0bDJfZGVjb2RlX3N0cmVhbShzKTsKKworCS8qIHNldCBkbWEgc2l6ZSB0byA2NTUzNiBieXRlcyAqLworCWl2dHZfdmFwaShpdHYsIENYMjM0MVhfREVDX1NFVF9ETUFfQkxPQ0tfU0laRSwgMSwgNjU1MzYpOworCisJY2xlYXJfYml0KElWVFZfRl9TX1NUUkVBTU9GRiwgJnMtPnNfZmxhZ3MpOworCisJLyogWmVybyBvdXQgZGVjb2RlciBjb3VudGVycyAqLworCXdyaXRlbCgwLCAmaXR2LT5kZWNfbWJveC5tYm94W0lWVFZfTUJPWF9GSUVMRF9ESVNQTEFZRURdLmRhdGFbMF0pOworCXdyaXRlbCgwLCAmaXR2LT5kZWNfbWJveC5tYm94W0lWVFZfTUJPWF9GSUVMRF9ESVNQTEFZRURdLmRhdGFbMV0pOworCXdyaXRlbCgwLCAmaXR2LT5kZWNfbWJveC5tYm94W0lWVFZfTUJPWF9GSUVMRF9ESVNQTEFZRURdLmRhdGFbMl0pOworCXdyaXRlbCgwLCAmaXR2LT5kZWNfbWJveC5tYm94W0lWVFZfTUJPWF9GSUVMRF9ESVNQTEFZRURdLmRhdGFbM10pOworCXdyaXRlbCgwLCAmaXR2LT5kZWNfbWJveC5tYm94W0lWVFZfTUJPWF9ETUFdLmRhdGFbMF0pOworCXdyaXRlbCgwLCAmaXR2LT5kZWNfbWJveC5tYm94W0lWVFZfTUJPWF9ETUFdLmRhdGFbMV0pOworCXdyaXRlbCgwLCAmaXR2LT5kZWNfbWJveC5tYm94W0lWVFZfTUJPWF9ETUFdLmRhdGFbMl0pOworCXdyaXRlbCgwLCAmaXR2LT5kZWNfbWJveC5tYm94W0lWVFZfTUJPWF9ETUFdLmRhdGFbM10pOworCisJLyogdHVybiBvbiBub3RpZmljYXRpb24gb2YgZHVhbC9zdGVyZW8gbW9kZSBjaGFuZ2UgKi8KKwlpdnR2X3ZhcGkoaXR2LCBDWDIzNDFYX0RFQ19TRVRfRVZFTlRfTk9USUZJQ0FUSU9OLCA0LCAwLCAxLCBJVlRWX0lSUV9ERUNfQVVEX01PREVfQ0hHLCAtMSk7CisKKwkvKiBzdGFydCBwbGF5YmFjayAqLworCWl2dHZfdmFwaShpdHYsIENYMjM0MVhfREVDX1NUQVJUX1BMQVlCQUNLLCAyLCBnb3Bfb2Zmc2V0LCAwKTsKKworCS8qIENsZWFyIHRoZSBmb2xsb3dpbmcgSW50ZXJydXB0IG1hc2sgYml0cyBmb3IgZGVjb2RpbmcgKi8KKwlpdnR2X2NsZWFyX2lycV9tYXNrKGl0diwgSVZUVl9JUlFfTUFTS19ERUNPREUpOworCUlWVFZfREVCVUdfSVJRKCJJUlEgTWFzayBpcyBub3c6IDB4JTA4eFxuIiwgaXR2LT5pcnFtYXNrKTsKKworCS8qIHlvdSdyZSBsaXZlISBzaXQgYmFjayBhbmQgYXdhaXQgaW50ZXJydXB0cyA6KSAqLworCWF0b21pY19pbmMoJml0di0+ZGVjb2RpbmcpOworCXJldHVybiAwOworfQorCit2b2lkIGl2dHZfc3RvcF9hbGxfY2FwdHVyZXMoc3RydWN0IGl2dHYgKml0dikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IElWVFZfTUFYX1NUUkVBTVMgLSAxOyBpID49IDA7IGktLSkgeworCQlzdHJ1Y3QgaXZ0dl9zdHJlYW0gKnMgPSAmaXR2LT5zdHJlYW1zW2ldOworCisJCWlmIChzLT52NGwyZGV2ID09IE5VTEwpCisJCQljb250aW51ZTsKKwkJaWYgKHRlc3RfYml0KElWVFZfRl9TX1NUUkVBTUlORywgJnMtPnNfZmxhZ3MpKSB7CisJCQlpdnR2X3N0b3BfdjRsMl9lbmNvZGVfc3RyZWFtKHMsIDApOworCQl9CisJfQorfQorCitpbnQgaXZ0dl9zdG9wX3Y0bDJfZW5jb2RlX3N0cmVhbShzdHJ1Y3QgaXZ0dl9zdHJlYW0gKnMsIGludCBnb3BfZW5kKQoreworCXN0cnVjdCBpdnR2ICppdHYgPSBzLT5pdHY7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJaW50IGNhcF90eXBlOworCXVuc2lnbmVkIGxvbmcgdGhlbjsKKwlpbnQgc3RvcG1vZGU7CisJdTMyIGRhdGFbQ1gyMzQxWF9NQk9YX01BWF9EQVRBXTsKKworCWlmIChzLT52NGwyZGV2ID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogVGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgeW91IGFyZSBhbGxvd2VkIHRvIHN0b3AgdGhlIGNhcHR1cmUKKwkgICBhbmQgdGhhdCB3ZSBhcmUgYWN0dWFsbHkgY2FwdHVyaW5nICovCisKKwlJVlRWX0RFQlVHX0lORk8oIlN0b3AgQ2FwdHVyZVxuIik7CisKKwlpZiAocy0+dHlwZSA9PSBJVlRWX0RFQ19TVFJFQU1fVFlQRV9WT1VUKQorCQlyZXR1cm4gMDsKKwlpZiAoYXRvbWljX3JlYWQoJml0di0+Y2FwdHVyaW5nKSA9PSAwKQorCQlyZXR1cm4gMDsKKworCXN3aXRjaCAocy0+dHlwZSkgeworCWNhc2UgSVZUVl9FTkNfU1RSRUFNX1RZUEVfWVVWOgorCQljYXBfdHlwZSA9IDE7CisJCWJyZWFrOworCWNhc2UgSVZUVl9FTkNfU1RSRUFNX1RZUEVfUENNOgorCQljYXBfdHlwZSA9IDE7CisJCWJyZWFrOworCWNhc2UgSVZUVl9FTkNfU1RSRUFNX1RZUEVfVkJJOgorCQljYXBfdHlwZSA9IDE7CisJCWJyZWFrOworCWNhc2UgSVZUVl9FTkNfU1RSRUFNX1RZUEVfTVBHOgorCWRlZmF1bHQ6CisJCWNhcF90eXBlID0gMDsKKwkJYnJlYWs7CisJfQorCisJLyogU3RvcCBDYXB0dXJlIE1vZGUgKi8KKwlpZiAocy0+dHlwZSA9PSBJVlRWX0VOQ19TVFJFQU1fVFlQRV9NUEcgJiYgZ29wX2VuZCkgeworCQlzdG9wbW9kZSA9IDA7CisJfSBlbHNlIHsKKwkJc3RvcG1vZGUgPSAxOworCX0KKworCS8qIGVuZF9jYXB0dXJlICovCisJLyogd2hlbjogMCA9ICBlbmQgb2YgR09QICAxID0gTk9XISwgdHlwZTogMCA9IG1wZWcsIHN1YnR5cGU6IDMgPSB2aWRlbythdWRpbyAqLworCWl2dHZfdmFwaShpdHYsIENYMjM0MVhfRU5DX1NUT1BfQ0FQVFVSRSwgMywgc3RvcG1vZGUsIGNhcF90eXBlLCBzLT5zdWJ0eXBlKTsKKworCS8qIG9ubHkgcnVuIHRoZXNlIGlmIHdlJ3JlIHNodXR0aW5nIGRvd24gdGhlIGxhc3QgY2FwICovCisJaWYgKGF0b21pY19yZWFkKCZpdHYtPmNhcHR1cmluZykgLSAxID09IDApIHsKKwkJLyogZXZlbnQgbm90aWZpY2F0aW9uIChvZmYpICovCisJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoSVZUVl9GX0lfRElHX1JTVCwgJml0di0+aV9mbGFncykpIHsKKwkJCS8qIHR5cGU6IDAgPSByZWZyZXNoICovCisJCQkvKiBvbi9vZmY6IDAgPSBvZmYsIGludHI6IDB4MTAwMDAwMDAsIG1ib3hfaWQ6IC0xOiBub25lICovCisJCQlpdnR2X3ZhcGkoaXR2LCBDWDIzNDFYX0VOQ19TRVRfRVZFTlRfTk9USUZJQ0FUSU9OLCA0LCAwLCAwLCBJVlRWX0lSUV9FTkNfVklNX1JTVCwgLTEpOworCQkJaXZ0dl9zZXRfaXJxX21hc2soaXR2LCBJVlRWX0lSUV9FTkNfVklNX1JTVCk7CisJCX0KKwl9CisKKwl0aGVuID0gamlmZmllczsKKworCWlmICghdGVzdF9iaXQoSVZUVl9GX1NfUEFTU1RIUk9VR0gsICZzLT5zX2ZsYWdzKSkgeworCQlpZiAocy0+dHlwZSA9PSBJVlRWX0VOQ19TVFJFQU1fVFlQRV9NUEcgJiYgZ29wX2VuZCkgeworCQkJLyogb25seSBydW4gdGhlc2UgaWYgd2UncmUgc2h1dHRpbmcgZG93biB0aGUgbGFzdCBjYXAgKi8KKwkJCXVuc2lnbmVkIGxvbmcgZHVyYXRpb247CisKKwkJCXRoZW4gPSBqaWZmaWVzOworCQkJYWRkX3dhaXRfcXVldWUoJml0di0+Y2FwX3csICZ3YWl0KTsKKworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKworCQkJLyogd2FpdCAycyBmb3IgRU9TIGludGVycnVwdCAqLworCQkJd2hpbGUgKCF0ZXN0X2JpdChJVlRWX0ZfSV9FT1MsICZpdHYtPmlfZmxhZ3MpICYmIGppZmZpZXMgPCB0aGVuICsgMiAqIEhaKSB7CisJCQkJc2NoZWR1bGVfdGltZW91dChIWiAvIDEwMCk7CisJCQl9CisKKwkJCS8qIFRvIGNvbnZlcnQgamlmZmllcyB0byBtcywgd2UgbXVzdCBtdWx0aXBseSBieSAxMDAwCisJCQkgKiBhbmQgZGl2aWRlIGJ5IEhaLiAgVG8gYXZvaWQgcnVudGltZSBkaXZpc2lvbiwgd2UKKwkJCSAqIGNvbnZlcnQgdGhpcyB0byBtdWx0aXBsaWNhdGlvbiBieSAxMDAwL0haLgorCQkJICogU2luY2UgaW50ZWdlciBkaXZpc2lvbiB0cnVuY2F0ZXMsIHdlIGdldCB0aGUgYmVzdAorCQkJICogYWNjdXJhY3kgaWYgd2UgZG8gYSByb3VuZGluZyBjYWxjdWxhdGlvbiBvZiB0aGUgY29uc3RhbnQuCisJCQkgKiBUaGluayBvZiB0aGUgY2FzZSB3aGVyZSBIWiBpcyAxMDI0LgorCQkJICovCisJCQlkdXJhdGlvbiA9ICgoMTAwMCArIEhaIC8gMikgLyBIWikgKiAoamlmZmllcyAtIHRoZW4pOworCisJCQlpZiAoIXRlc3RfYml0KElWVFZfRl9JX0VPUywgJml0di0+aV9mbGFncykpIHsKKwkJCQlJVlRWX0RFQlVHX1dBUk4oIiVzOiBFT1MgaW50ZXJydXB0IG5vdCByZWNlaXZlZCEgc3RvcHBpbmcgYW55d2F5LlxuIiwgcy0+bmFtZSk7CisJCQkJSVZUVl9ERUJVR19XQVJOKCIlczogd2FpdGVkICVsdSBtcy5cbiIsIHMtPm5hbWUsIGR1cmF0aW9uKTsKKwkJCX0gZWxzZSB7CisJCQkJSVZUVl9ERUJVR19JTkZPKCIlczogRU9TIHRvb2sgJWx1IG1zIHRvIG9jY3VyLlxuIiwgcy0+bmFtZSwgZHVyYXRpb24pOworCQkJfQorCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwkJCXJlbW92ZV93YWl0X3F1ZXVlKCZpdHYtPmNhcF93LCAmd2FpdCk7CisJCX0KKworCQl0aGVuID0gamlmZmllczsKKwkJLyogTWFrZSBzdXJlIERNQSBpcyBjb21wbGV0ZSAqLworCQlhZGRfd2FpdF9xdWV1ZSgmcy0+d2FpdHEsICZ3YWl0KTsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJZG8geworCQkJLyogY2hlY2sgaWYgRE1BIGlzIHBlbmRpbmcgKi8KKwkJCWlmICgocy0+dHlwZSA9PSBJVlRWX0VOQ19TVFJFQU1fVFlQRV9NUEcpICYmCS8qIE1QRyBPbmx5ICovCisJCQkgICAgKHJlYWRfcmVnKElWVFZfUkVHX0RNQVNUQVRVUykgJiAweDAyKSkgeworCQkJCS8qIENoZWNrIGZvciBsYXN0IERNQSAqLworCQkJCWl2dHZfdmFwaV9yZXN1bHQoaXR2LCBkYXRhLCBDWDIzNDFYX0VOQ19HRVRfU0VRX0VORCwgMiwgMCwgMCk7CisKKwkJCQlpZiAoZGF0YVswXSA9PSAxKSB7CisJCQkJCUlWVFZfREVCVUdfRE1BKCIlczogTGFzdCBETUEgb2Ygc2l6ZSAweCUwOHhcbiIsIHMtPm5hbWUsIGRhdGFbMV0pOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKHJlYWRfcmVnKElWVFZfUkVHX0RNQVNUQVRVUykgJiAweDAyKSB7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWl2dHZfc2xlZXBfdGltZW91dChIWiAvIDEwMCwgMSk7CisJCX0gd2hpbGUgKHRoZW4gKyBIWiAqIDIgPiBqaWZmaWVzKTsKKworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCQlyZW1vdmVfd2FpdF9xdWV1ZSgmcy0+d2FpdHEsICZ3YWl0KTsKKwl9CisKKwlhdG9taWNfZGVjKCZpdHYtPmNhcHR1cmluZyk7CisKKwkvKiBDbGVhciBjYXB0dXJlIGFuZCBuby1yZWFkIGJpdHMgKi8KKwljbGVhcl9iaXQoSVZUVl9GX1NfU1RSRUFNSU5HLCAmcy0+c19mbGFncyk7CisKKwlpZiAocy0+dHlwZSA9PSBJVlRWX0VOQ19TVFJFQU1fVFlQRV9WQkkpCisJCWl2dHZfc2V0X2lycV9tYXNrKGl0diwgSVZUVl9JUlFfRU5DX1ZCSV9DQVApOworCisJaWYgKGF0b21pY19yZWFkKCZpdHYtPmNhcHR1cmluZykgPiAwKSB7CisJCXJldHVybiAwOworCX0KKworCS8qIFNldCB0aGUgZm9sbG93aW5nIEludGVycnVwdCBtYXNrIGJpdHMgZm9yIGNhcHR1cmUgKi8KKwlpdnR2X3NldF9pcnFfbWFzayhpdHYsIElWVFZfSVJRX01BU0tfQ0FQVFVSRSk7CisKKwl3YWtlX3VwKCZzLT53YWl0cSk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGl2dHZfc3RvcF92NGwyX2RlY29kZV9zdHJlYW0oc3RydWN0IGl2dHZfc3RyZWFtICpzLCBpbnQgZmxhZ3MsIHU2NCBwdHMpCit7CisJc3RydWN0IGl2dHYgKml0diA9IHMtPml0djsKKworCWlmIChzLT52NGwyZGV2ID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHMtPnR5cGUgIT0gSVZUVl9ERUNfU1RSRUFNX1RZUEVfWVVWICYmIHMtPnR5cGUgIT0gSVZUVl9ERUNfU1RSRUFNX1RZUEVfTVBHKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghdGVzdF9iaXQoSVZUVl9GX1NfU1RSRUFNSU5HLCAmcy0+c19mbGFncykpCisJCXJldHVybiAwOworCisJSVZUVl9ERUJVR19JTkZPKCJTdG9wIERlY29kZSBhdCAlbGx1LCBmbGFnczogJXhcbiIsIHB0cywgZmxhZ3MpOworCisJLyogU3RvcCBEZWNvZGVyICovCisJaWYgKCEoZmxhZ3MgJiBWSURFT19DTURfU1RPUF9JTU1FRElBVEVMWSkgfHwgcHRzKSB7CisJCXUzMiB0bXAgPSAwOworCisJCS8qIFdhaXQgdW50aWwgdGhlIGRlY29kZXIgaXMgbm8gbG9uZ2VyIHJ1bm5pbmcgKi8KKwkJaWYgKHB0cykgeworCQkJaXZ0dl92YXBpKGl0diwgQ1gyMzQxWF9ERUNfU1RPUF9QTEFZQkFDSywgMywKKwkJCQkwLCAodTMyKShwdHMgJiAweGZmZmZmZmZmKSwgKHUzMikocHRzID4+IDMyKSk7CisJCX0KKwkJd2hpbGUgKDEpIHsKKwkJCXUzMiBkYXRhW0NYMjM0MVhfTUJPWF9NQVhfREFUQV07CisJCQlpdnR2X3ZhcGlfcmVzdWx0KGl0diwgZGF0YSwgQ1gyMzQxWF9ERUNfR0VUX1hGRVJfSU5GTywgMCk7CisJCQlpZiAocy0+cV9mdWxsLmJ1ZmZlcnMgKyBzLT5xX2RtYS5idWZmZXJzID09IDApIHsKKwkJCQlpZiAodG1wID09IGRhdGFbM10pCisJCQkJCWJyZWFrOworCQkJCXRtcCA9IGRhdGFbM107CisJCQl9CisJCQlpZiAoaXZ0dl9zbGVlcF90aW1lb3V0KEhaLzEwLCAxKSkKKwkJCQlicmVhazsKKwkJfQorCX0KKwlpdnR2X3ZhcGkoaXR2LCBDWDIzNDFYX0RFQ19TVE9QX1BMQVlCQUNLLCAzLCBmbGFncyAmIFZJREVPX0NNRF9TVE9QX1RPX0JMQUNLLCAwLCAwKTsKKworCS8qIHR1cm4gb2ZmIG5vdGlmaWNhdGlvbiBvZiBkdWFsL3N0ZXJlbyBtb2RlIGNoYW5nZSAqLworCWl2dHZfdmFwaShpdHYsIENYMjM0MVhfREVDX1NFVF9FVkVOVF9OT1RJRklDQVRJT04sIDQsIDAsIDAsIElWVFZfSVJRX0RFQ19BVURfTU9ERV9DSEcsIC0xKTsKKworCWl2dHZfc2V0X2lycV9tYXNrKGl0diwgSVZUVl9JUlFfTUFTS19ERUNPREUpOworCisJY2xlYXJfYml0KElWVFZfRl9TX05FRURTX0RBVEEsICZzLT5zX2ZsYWdzKTsKKwljbGVhcl9iaXQoSVZUVl9GX1NfU1RSRUFNSU5HLCAmcy0+c19mbGFncyk7CisJaXZ0dl9mbHVzaF9xdWV1ZXMocyk7CisKKwlpZiAoIXRlc3RfYml0KElWVFZfRl9TX1BBU1NUSFJPVUdILCAmcy0+c19mbGFncykpIHsKKwkJLyogZGlzYWJsZSBWQkkgb24gVFYtb3V0ICovCisJCWl2dHZfZGlzYWJsZV92YmkoaXR2KTsKKwl9CisKKwkvKiBkZWNyZW1lbnQgZGVjb2RpbmcgKi8KKwlhdG9taWNfZGVjKCZpdHYtPmRlY29kaW5nKTsKKworCXNldF9iaXQoSVZUVl9GX0lfRVZfREVDX1NUT1BQRUQsICZpdHYtPmlfZmxhZ3MpOworCXdha2VfdXAoJml0di0+ZXZlbnRfd2FpdHEpOworCisJLyogd2FrZSB1cCB3YWl0IHF1ZXVlcyAqLworCXdha2VfdXAoJnMtPndhaXRxKTsKKworCXJldHVybiAwOworfQorCitpbnQgaXZ0dl9wYXNzdGhyb3VnaF9tb2RlKHN0cnVjdCBpdnR2ICppdHYsIGludCBlbmFibGUpCit7CisJc3RydWN0IGl2dHZfc3RyZWFtICp5dXZfc3RyZWFtID0gJml0di0+c3RyZWFtc1tJVlRWX0VOQ19TVFJFQU1fVFlQRV9ZVVZdOworCXN0cnVjdCBpdnR2X3N0cmVhbSAqZGVjX3N0cmVhbSA9ICZpdHYtPnN0cmVhbXNbSVZUVl9ERUNfU1RSRUFNX1RZUEVfWVVWXTsKKworCWlmICh5dXZfc3RyZWFtLT52NGwyZGV2ID09IE5VTEwgfHwgZGVjX3N0cmVhbS0+djRsMmRldiA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCUlWVFZfREVCVUdfSU5GTygiaXZ0diBpb2N0bDogU2VsZWN0IHBhc3N0aHJvdWdoIG1vZGVcbiIpOworCisJLyogUHJldmVudCBvdGhlcnMgZnJvbSBzdGFydGluZy9zdG9wcGluZyBzdHJlYW1zIHdoaWxlIHdlCisJICAgaW5pdGlhdGUvdGVybWluYXRlIHBhc3N0aHJvdWdoIG1vZGUgKi8KKwlpZiAoZW5hYmxlKSB7CisJCWlmIChpdHYtPm91dHB1dF9tb2RlID09IE9VVF9QQVNTVEhST1VHSCkgeworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKGl2dHZfc2V0X291dHB1dF9tb2RlKGl0diwgT1VUX1BBU1NUSFJPVUdIKSAhPSBPVVRfUEFTU1RIUk9VR0gpCisJCQlyZXR1cm4gLUVCVVNZOworCisJCS8qIEZ1bGx5IGluaXRpYWxpemUgc3RyZWFtLCBhbmQgdGhlbiB1bmZsYWcgaW5pdCAqLworCQlzZXRfYml0KElWVFZfRl9TX1BBU1NUSFJPVUdILCAmZGVjX3N0cmVhbS0+c19mbGFncyk7CisJCXNldF9iaXQoSVZUVl9GX1NfU1RSRUFNSU5HLCAmZGVjX3N0cmVhbS0+c19mbGFncyk7CisKKwkJLyogU2V0dXAgWVVWIERlY29kZXIgKi8KKwkJaXZ0dl9zZXR1cF92NGwyX2RlY29kZV9zdHJlYW0oZGVjX3N0cmVhbSk7CisKKwkJLyogU3RhcnQgRGVjb2RlciAqLworCQlpdnR2X3ZhcGkoaXR2LCBDWDIzNDFYX0RFQ19TVEFSVF9QTEFZQkFDSywgMiwgMCwgMSk7CisJCWF0b21pY19pbmMoJml0di0+ZGVjb2RpbmcpOworCisJCS8qIFNldHVwIGNhcHR1cmUgaWYgbm90IGFscmVhZHkgZG9uZSAqLworCQlpZiAoYXRvbWljX3JlYWQoJml0di0+Y2FwdHVyaW5nKSA9PSAwKSB7CisJCQljeDIzNDF4X3VwZGF0ZShpdHYsIGl2dHZfYXBpX2Z1bmMsIE5VTEwsICZpdHYtPnBhcmFtcyk7CisJCX0KKworCQkvKiBTdGFydCBQYXNzdGhyb3VnaCBNb2RlICovCisJCWl2dHZfdmFwaShpdHYsIENYMjM0MVhfRU5DX1NUQVJUX0NBUFRVUkUsIDIsIDIsIDExKTsKKwkJYXRvbWljX2luYygmaXR2LT5jYXB0dXJpbmcpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoaXR2LT5vdXRwdXRfbW9kZSAhPSBPVVRfUEFTU1RIUk9VR0gpCisJCXJldHVybiAwOworCisJLyogU3RvcCBQYXNzdGhyb3VnaCBNb2RlICovCisJaXZ0dl92YXBpKGl0diwgQ1gyMzQxWF9FTkNfU1RPUF9DQVBUVVJFLCAzLCAxLCAyLCAxMSk7CisJaXZ0dl92YXBpKGl0diwgQ1gyMzQxWF9ERUNfU1RPUF9QTEFZQkFDSywgMywgMSwgMCwgMCk7CisKKwlhdG9taWNfZGVjKCZpdHYtPmNhcHR1cmluZyk7CisJYXRvbWljX2RlYygmaXR2LT5kZWNvZGluZyk7CisJY2xlYXJfYml0KElWVFZfRl9TX1BBU1NUSFJPVUdILCAmZGVjX3N0cmVhbS0+c19mbGFncyk7CisJY2xlYXJfYml0KElWVFZfRl9TX1NUUkVBTUlORywgJmRlY19zdHJlYW0tPnNfZmxhZ3MpOworCWl0di0+b3V0cHV0X21vZGUgPSBPVVRfTk9ORTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtc3RyZWFtcy5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtc3RyZWFtcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1OTdiNzUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1zdHJlYW1zLmgKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAgICBpbml0L3N0YXJ0L3N0b3AvZXhpdCBzdHJlYW0gZnVuY3Rpb25zCisgICAgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDQgIEtldmluIFRoYXllciA8bnVmYW5fd2ZrIGF0IHlhaG9vLmNvbT4KKyAgICBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNyAgSGFucyBWZXJrdWlsIDxodmVya3VpbEB4czRhbGwubmw+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworaW50IGl2dHZfc3RyZWFtc19zZXR1cChzdHJ1Y3QgaXZ0diAqaXR2KTsKK3ZvaWQgaXZ0dl9zdHJlYW1zX2NsZWFudXAoc3RydWN0IGl2dHYgKml0dik7CisKKy8qIENhcHR1cmUgcmVsYXRlZCAqLworaW50IGl2dHZfc3RhcnRfdjRsMl9lbmNvZGVfc3RyZWFtKHN0cnVjdCBpdnR2X3N0cmVhbSAqcyk7CitpbnQgaXZ0dl9zdG9wX3Y0bDJfZW5jb2RlX3N0cmVhbShzdHJ1Y3QgaXZ0dl9zdHJlYW0gKnMsIGludCBnb3BfZW5kKTsKK2ludCBpdnR2X3N0YXJ0X3Y0bDJfZGVjb2RlX3N0cmVhbShzdHJ1Y3QgaXZ0dl9zdHJlYW0gKnMsIGludCBnb3Bfb2Zmc2V0KTsKK2ludCBpdnR2X3N0b3BfdjRsMl9kZWNvZGVfc3RyZWFtKHN0cnVjdCBpdnR2X3N0cmVhbSAqcywgaW50IGZsYWdzLCB1NjQgcHRzKTsKKwordm9pZCBpdnR2X3N0b3BfYWxsX2NhcHR1cmVzKHN0cnVjdCBpdnR2ICppdHYpOworaW50IGl2dHZfcGFzc3Rocm91Z2hfbW9kZShzdHJ1Y3QgaXZ0diAqaXR2LCBpbnQgZW5hYmxlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LXVkbWEuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LXVkbWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDY0MmUxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtdWRtYS5jCkBAIC0wLDAgKzEsMjAwIEBACisvKgorICAgIFVzZXIgRE1BCisKKyAgICBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNCAgS2V2aW4gVGhheWVyIDxudWZhbl93ZmsgYXQgeWFob28uY29tPgorICAgIENvcHlyaWdodCAoQykgMjAwNCAgQ2hyaXMgS2VubmVkeSA8Y0Bncm9vdnkub3JnPgorICAgIENvcHlyaWdodCAoQykgMjAwNS0yMDA3ICBIYW5zIFZlcmt1aWwgPGh2ZXJrdWlsQHhzNGFsbC5ubD4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSAiaXZ0di1kcml2ZXIuaCIKKyNpbmNsdWRlICJpdnR2LXN0cmVhbXMuaCIKKyNpbmNsdWRlICJpdnR2LXVkbWEuaCIKKwordm9pZCBpdnR2X3VkbWFfZ2V0X3BhZ2VfaW5mbyhzdHJ1Y3QgaXZ0dl9kbWFfcGFnZV9pbmZvICpkbWFfcGFnZSwgdW5zaWduZWQgbG9uZyBmaXJzdCwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCWRtYV9wYWdlLT51YWRkciA9IGZpcnN0ICYgUEFHRV9NQVNLOworCWRtYV9wYWdlLT5vZmZzZXQgPSBmaXJzdCAmIH5QQUdFX01BU0s7CisJZG1hX3BhZ2UtPnRhaWwgPSAxICsgKChmaXJzdCtzaXplLTEpICYgflBBR0VfTUFTSyk7CisJZG1hX3BhZ2UtPmZpcnN0ID0gKGZpcnN0ICYgUEFHRV9NQVNLKSA+PiBQQUdFX1NISUZUOworCWRtYV9wYWdlLT5sYXN0ID0gKChmaXJzdCtzaXplLTEpICYgUEFHRV9NQVNLKSA+PiBQQUdFX1NISUZUOworCWRtYV9wYWdlLT5wYWdlX2NvdW50ID0gZG1hX3BhZ2UtPmxhc3QgLSBkbWFfcGFnZS0+Zmlyc3QgKyAxOworCWlmIChkbWFfcGFnZS0+cGFnZV9jb3VudCA9PSAxKSBkbWFfcGFnZS0+dGFpbCAtPSBkbWFfcGFnZS0+b2Zmc2V0OworfQorCitpbnQgaXZ0dl91ZG1hX2ZpbGxfc2dfbGlzdCAoc3RydWN0IGl2dHZfdXNlcl9kbWEgKmRtYSwgc3RydWN0IGl2dHZfZG1hX3BhZ2VfaW5mbyAqZG1hX3BhZ2UsIGludCBtYXBfb2Zmc2V0KQoreworCWludCBpLCBvZmZzZXQ7CisKKwlvZmZzZXQgPSBkbWFfcGFnZS0+b2Zmc2V0OworCisJLyogRmlsbCBTRyBBcnJheSB3aXRoIG5ldyB2YWx1ZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgZG1hX3BhZ2UtPnBhZ2VfY291bnQ7IGkrKykgeworCQlpZiAoaSA9PSBkbWFfcGFnZS0+cGFnZV9jb3VudCAtIDEpIHsKKwkJCWRtYS0+U0dsaXN0W21hcF9vZmZzZXRdLmxlbmd0aCA9IGRtYV9wYWdlLT50YWlsOworCQl9CisJCWVsc2UgeworCQkJZG1hLT5TR2xpc3RbbWFwX29mZnNldF0ubGVuZ3RoID0gUEFHRV9TSVpFIC0gb2Zmc2V0OworCQl9CisJCWRtYS0+U0dsaXN0W21hcF9vZmZzZXRdLm9mZnNldCA9IG9mZnNldDsKKwkJZG1hLT5TR2xpc3RbbWFwX29mZnNldF0ucGFnZSA9IGRtYS0+bWFwW21hcF9vZmZzZXRdOworCQlvZmZzZXQgPSAwOworCQltYXBfb2Zmc2V0Kys7CisJfQorCXJldHVybiBtYXBfb2Zmc2V0OworfQorCit2b2lkIGl2dHZfdWRtYV9maWxsX3NnX2FycmF5IChzdHJ1Y3QgaXZ0dl91c2VyX2RtYSAqZG1hLCB1MzIgYnVmZmVyX29mZnNldCwgdTMyIGJ1ZmZlcl9vZmZzZXRfMiwgdTMyIHNwbGl0KSB7CisJaW50IGk7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKKworCWZvciAoaSA9IDAsIHNnID0gZG1hLT5TR2xpc3Q7IGkgPCBkbWEtPlNHX2xlbmd0aDsgaSsrLCBzZysrKSB7CisJCWRtYS0+U0dhcnJheVtpXS5zaXplID0gY3B1X3RvX2xlMzIoc2dfZG1hX2xlbihzZykpOworCQlkbWEtPlNHYXJyYXlbaV0uc3JjID0gY3B1X3RvX2xlMzIoc2dfZG1hX2FkZHJlc3Moc2cpKTsKKwkJZG1hLT5TR2FycmF5W2ldLmRzdCA9IGNwdV90b19sZTMyKGJ1ZmZlcl9vZmZzZXQpOworCQlidWZmZXJfb2Zmc2V0ICs9IHNnX2RtYV9sZW4oc2cpOworCisJCXNwbGl0IC09IHNnX2RtYV9sZW4oc2cpOworCQlpZiAoc3BsaXQgPT0gMCkKKwkJCWJ1ZmZlcl9vZmZzZXQgPSBidWZmZXJfb2Zmc2V0XzI7CisJfQorfQorCisvKiBVc2VyIERNQSBCdWZmZXJzICovCit2b2lkIGl2dHZfdWRtYV9hbGxvYyhzdHJ1Y3QgaXZ0diAqaXR2KQoreworCWlmIChpdHYtPnVkbWEuU0dfaGFuZGxlID09IDApIHsKKwkJLyogTWFwIERNQSBQYWdlIEFycmF5IEJ1ZmZlciAqLworCQlpdHYtPnVkbWEuU0dfaGFuZGxlID0gcGNpX21hcF9zaW5nbGUoaXR2LT5kZXYsIGl0di0+dWRtYS5TR2FycmF5LAorCQkJICAgc2l6ZW9mKGl0di0+dWRtYS5TR2FycmF5KSwgUENJX0RNQV9UT0RFVklDRSk7CisJCWl2dHZfdWRtYV9zeW5jX2Zvcl9jcHUoaXR2KTsKKwl9Cit9CisKK2ludCBpdnR2X3VkbWFfc2V0dXAoc3RydWN0IGl2dHYgKml0diwgdW5zaWduZWQgbG9uZyBpdnR2X2Rlc3RfYWRkciwKKwkJICAgICAgIHZvaWQgX191c2VyICp1c2VyYnVmLCBpbnQgc2l6ZV9pbl9ieXRlcykKK3sKKwlzdHJ1Y3QgaXZ0dl9kbWFfcGFnZV9pbmZvIHVzZXJfZG1hOworCXN0cnVjdCBpdnR2X3VzZXJfZG1hICpkbWEgPSAmaXR2LT51ZG1hOworCWludCBlcnI7CisKKwlJVlRWX0RFQlVHX0RNQSgiaXZ0dl91ZG1hX3NldHVwLCBkc3Q6IDB4JTA4eFxuIiwgKHVuc2lnbmVkIGludClpdnR2X2Rlc3RfYWRkcik7CisKKwkvKiBTdGlsbCBpbiBVU0UgKi8KKwlpZiAoZG1hLT5TR19sZW5ndGggfHwgZG1hLT5wYWdlX2NvdW50KSB7CisJCUlWVFZfREVCVUdfV0FSTigiaXZ0dl91ZG1hX3NldHVwOiBTR19sZW5ndGggJWQgcGFnZV9jb3VudCAlZCBzdGlsbCBmdWxsP1xuIiwKKwkJCSAgIGRtYS0+U0dfbGVuZ3RoLCBkbWEtPnBhZ2VfY291bnQpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWl2dHZfdWRtYV9nZXRfcGFnZV9pbmZvKCZ1c2VyX2RtYSwgKHVuc2lnbmVkIGxvbmcpdXNlcmJ1Ziwgc2l6ZV9pbl9ieXRlcyk7CisKKwlpZiAodXNlcl9kbWEucGFnZV9jb3VudCA8PSAwKSB7CisJCUlWVFZfREVCVUdfV0FSTigiaXZ0dl91ZG1hX3NldHVwOiBFcnJvciAlZCBwYWdlX2NvdW50IGZyb20gJWQgYnl0ZXMgJWQgb2Zmc2V0XG4iLAorCQkJICAgdXNlcl9kbWEucGFnZV9jb3VudCwgc2l6ZV9pbl9ieXRlcywgdXNlcl9kbWEub2Zmc2V0KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogR2V0IHVzZXIgcGFnZXMgZm9yIERNQSBYZmVyICovCisJZG93bl9yZWFkKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCWVyciA9IGdldF91c2VyX3BhZ2VzKGN1cnJlbnQsIGN1cnJlbnQtPm1tLAorCQkJdXNlcl9kbWEudWFkZHIsIHVzZXJfZG1hLnBhZ2VfY291bnQsIDAsIDEsIGRtYS0+bWFwLCBOVUxMKTsKKwl1cF9yZWFkKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCisJaWYgKHVzZXJfZG1hLnBhZ2VfY291bnQgIT0gZXJyKSB7CisJCUlWVFZfREVCVUdfV0FSTigiZmFpbGVkIHRvIG1hcCB1c2VyIHBhZ2VzLCByZXR1cm5lZCAlZCBpbnN0ZWFkIG9mICVkXG4iLAorCQkJICAgZXJyLCB1c2VyX2RtYS5wYWdlX2NvdW50KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZG1hLT5wYWdlX2NvdW50ID0gdXNlcl9kbWEucGFnZV9jb3VudDsKKworCS8qIEZpbGwgU0cgTGlzdCB3aXRoIG5ldyB2YWx1ZXMgKi8KKwlpdnR2X3VkbWFfZmlsbF9zZ19saXN0KGRtYSwgJnVzZXJfZG1hLCAwKTsKKworCS8qIE1hcCBTRyBMaXN0ICovCisJZG1hLT5TR19sZW5ndGggPSBwY2lfbWFwX3NnKGl0di0+ZGV2LCBkbWEtPlNHbGlzdCwgZG1hLT5wYWdlX2NvdW50LCBQQ0lfRE1BX1RPREVWSUNFKTsKKworCS8qIEZpbGwgU0cgQXJyYXkgd2l0aCBuZXcgdmFsdWVzICovCisJaXZ0dl91ZG1hX2ZpbGxfc2dfYXJyYXkgKGRtYSwgaXZ0dl9kZXN0X2FkZHIsIDAsIC0xKTsKKworCS8qIFRhZyBTRyBBcnJheSB3aXRoIEludGVycnVwdCBCaXQgKi8KKwlkbWEtPlNHYXJyYXlbZG1hLT5TR19sZW5ndGggLSAxXS5zaXplIHw9IGNwdV90b19sZTMyKDB4ODAwMDAwMDApOworCisJaXZ0dl91ZG1hX3N5bmNfZm9yX2RldmljZShpdHYpOworCXJldHVybiBkbWEtPnBhZ2VfY291bnQ7Cit9CisKK3ZvaWQgaXZ0dl91ZG1hX3VubWFwKHN0cnVjdCBpdnR2ICppdHYpCit7CisJc3RydWN0IGl2dHZfdXNlcl9kbWEgKmRtYSA9ICZpdHYtPnVkbWE7CisJaW50IGk7CisKKwlJVlRWX0RFQlVHX0lORk8oIml2dHZfdW5tYXBfdXNlcl9kbWFcbiIpOworCisJLyogTm90aGluZyB0byBmcmVlICovCisJaWYgKGRtYS0+cGFnZV9jb3VudCA9PSAwKQorCQlyZXR1cm47CisKKwkvKiBVbm1hcCBTY2F0dGVybGlzdCAqLworCWlmIChkbWEtPlNHX2xlbmd0aCkgeworCQlwY2lfdW5tYXBfc2coaXR2LT5kZXYsIGRtYS0+U0dsaXN0LCBkbWEtPnBhZ2VfY291bnQsIFBDSV9ETUFfVE9ERVZJQ0UpOworCQlkbWEtPlNHX2xlbmd0aCA9IDA7CisJfQorCS8qIHN5bmMgRE1BICovCisJaXZ0dl91ZG1hX3N5bmNfZm9yX2NwdShpdHYpOworCisJLyogUmVsZWFzZSBVc2VyIFBhZ2VzICovCisJZm9yIChpID0gMDsgaSA8IGRtYS0+cGFnZV9jb3VudDsgaSsrKSB7CisJCXB1dF9wYWdlKGRtYS0+bWFwW2ldKTsKKwl9CisJZG1hLT5wYWdlX2NvdW50ID0gMDsKK30KKwordm9pZCBpdnR2X3VkbWFfZnJlZShzdHJ1Y3QgaXZ0diAqaXR2KQoreworCS8qIFVubWFwIFNHIEFycmF5ICovCisJaWYgKGl0di0+dWRtYS5TR19oYW5kbGUpIHsKKwkJcGNpX3VubWFwX3NpbmdsZShpdHYtPmRldiwgaXR2LT51ZG1hLlNHX2hhbmRsZSwKKwkJCSBzaXplb2YoaXR2LT51ZG1hLlNHYXJyYXkpLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwl9CisKKwkvKiBVbm1hcCBTY2F0dGVybGlzdCAqLworCWlmIChpdHYtPnVkbWEuU0dfbGVuZ3RoKSB7CisJCXBjaV91bm1hcF9zZyhpdHYtPmRldiwgaXR2LT51ZG1hLlNHbGlzdCwgaXR2LT51ZG1hLnBhZ2VfY291bnQsIFBDSV9ETUFfVE9ERVZJQ0UpOworCX0KK30KKwordm9pZCBpdnR2X3VkbWFfc3RhcnQoc3RydWN0IGl2dHYgKml0dikKK3sKKwlJVlRWX0RFQlVHX0RNQSgic3RhcnQgVURNQVxuIik7CisJd3JpdGVfcmVnKGl0di0+dWRtYS5TR19oYW5kbGUsIElWVFZfUkVHX0RFQ0RNQUFERFIpOworCXdyaXRlX3JlZ19zeW5jKHJlYWRfcmVnKElWVFZfUkVHX0RNQVhGRVIpIHwgMHgwMSwgSVZUVl9SRUdfRE1BWEZFUik7CisJc2V0X2JpdChJVlRWX0ZfSV9ETUEsICZpdHYtPmlfZmxhZ3MpOworCXNldF9iaXQoSVZUVl9GX0lfVURNQSwgJml0di0+aV9mbGFncyk7Cit9CisKK3ZvaWQgaXZ0dl91ZG1hX3ByZXBhcmUoc3RydWN0IGl2dHYgKml0dikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJml0di0+ZG1hX3JlZ19sb2NrLCBmbGFncyk7CisJaWYgKCF0ZXN0X2JpdChJVlRWX0ZfSV9ETUEsICZpdHYtPmlfZmxhZ3MpKQorCQlpdnR2X3VkbWFfc3RhcnQoaXR2KTsKKwllbHNlCisJCXNldF9iaXQoSVZUVl9GX0lfVURNQV9QRU5ESU5HLCAmaXR2LT5pX2ZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpdHYtPmRtYV9yZWdfbG9jaywgZmxhZ3MpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtdWRtYS5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtdWRtYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxMzFiY2MKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di11ZG1hLmgKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAgICBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNCAgS2V2aW4gVGhheWVyIDxudWZhbl93ZmsgYXQgeWFob28uY29tPgorICAgIENvcHlyaWdodCAoQykgMjAwNCAgQ2hyaXMgS2VubmVkeSA8Y0Bncm9vdnkub3JnPgorICAgIENvcHlyaWdodCAoQykgMjAwNi0yMDA3ICBIYW5zIFZlcmt1aWwgPGh2ZXJrdWlsQHhzNGFsbC5ubD4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisvKiBVc2VyIERNQSBmdW5jdGlvbnMgKi8KK3ZvaWQgaXZ0dl91ZG1hX2dldF9wYWdlX2luZm8oc3RydWN0IGl2dHZfZG1hX3BhZ2VfaW5mbyAqZG1hX3BhZ2UsIHVuc2lnbmVkIGxvbmcgZmlyc3QsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7CitpbnQgaXZ0dl91ZG1hX2ZpbGxfc2dfbGlzdChzdHJ1Y3QgaXZ0dl91c2VyX2RtYSAqZG1hLCBzdHJ1Y3QgaXZ0dl9kbWFfcGFnZV9pbmZvICpkbWFfcGFnZSwgaW50IG1hcF9vZmZzZXQpOwordm9pZCBpdnR2X3VkbWFfZmlsbF9zZ19hcnJheShzdHJ1Y3QgaXZ0dl91c2VyX2RtYSAqZG1hLCB1MzIgYnVmZmVyX29mZnNldCwgdTMyIGJ1ZmZlcl9vZmZzZXRfMiwgdTMyIHNwbGl0KTsKK2ludCBpdnR2X3VkbWFfc2V0dXAoc3RydWN0IGl2dHYgKml0diwgdW5zaWduZWQgbG9uZyBpdnR2X2Rlc3RfYWRkciwKKwkJICAgICAgIHZvaWQgX191c2VyICp1c2VyYnVmLCBpbnQgc2l6ZV9pbl9ieXRlcyk7Cit2b2lkIGl2dHZfdWRtYV91bm1hcChzdHJ1Y3QgaXZ0diAqaXR2KTsKK3ZvaWQgaXZ0dl91ZG1hX2ZyZWUoc3RydWN0IGl2dHYgKml0dik7Cit2b2lkIGl2dHZfdWRtYV9hbGxvYyhzdHJ1Y3QgaXZ0diAqaXR2KTsKK3ZvaWQgaXZ0dl91ZG1hX3ByZXBhcmUoc3RydWN0IGl2dHYgKml0dik7Cit2b2lkIGl2dHZfdWRtYV9zdGFydChzdHJ1Y3QgaXZ0diAqaXR2KTsKKworc3RhdGljIGlubGluZSB2b2lkIGl2dHZfdWRtYV9zeW5jX2Zvcl9kZXZpY2Uoc3RydWN0IGl2dHYgKml0dikKK3sKKwlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UoKHN0cnVjdCBwY2lfZGV2ICopaXR2LT5kZXYsIGl0di0+dWRtYS5TR19oYW5kbGUsCisJCXNpemVvZihpdHYtPnVkbWEuU0dhcnJheSksIFBDSV9ETUFfVE9ERVZJQ0UpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaXZ0dl91ZG1hX3N5bmNfZm9yX2NwdShzdHJ1Y3QgaXZ0diAqaXR2KQoreworCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdSgoc3RydWN0IHBjaV9kZXYgKilpdHYtPmRldiwgaXR2LT51ZG1hLlNHX2hhbmRsZSwKKwkJc2l6ZW9mKGl0di0+dWRtYS5TR2FycmF5KSwgUENJX0RNQV9UT0RFVklDRSk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di12YmkuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LXZiaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlZmE1YTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di12YmkuYwpAQCAtMCwwICsxLDUzOCBAQAorLyoKKyAgICBWZXJ0aWNhbCBCbGFuayBJbnRlcnZhbCBzdXBwb3J0IGZ1bmN0aW9ucworICAgIENvcHlyaWdodCAoQykgMjAwNC0yMDA3ICBIYW5zIFZlcmt1aWwgPGh2ZXJrdWlsQHhzNGFsbC5ubD4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSAiaXZ0di1kcml2ZXIuaCIKKyNpbmNsdWRlICJpdnR2LXZpZGVvLmgiCisjaW5jbHVkZSAiaXZ0di12YmkuaCIKKyNpbmNsdWRlICJpdnR2LWlvY3RsLmgiCisjaW5jbHVkZSAiaXZ0di1xdWV1ZS5oIgorCitzdGF0aWMgaW50IG9kZF9wYXJpdHkodTggYykKK3sKKwljIF49IChjID4+IDQpOworCWMgXj0gKGMgPj4gMik7CisJYyBePSAoYyA+PiAxKTsKKworCXJldHVybiBjICYgMTsKK30KKworc3RhdGljIHZvaWQgcGFzc3Rocm91Z2hfdmJpX2RhdGEoc3RydWN0IGl2dHYgKml0diwgaW50IGNudCkKK3sKKwlpbnQgd3NzID0gMDsKKwl1OCBjY1s0XSA9IHsgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCB9OworCXU4IHZwc1sxM107CisJaW50IGZvdW5kX2NjID0gMDsKKwlpbnQgZm91bmRfd3NzID0gMDsKKwlpbnQgZm91bmRfdnBzID0gMDsKKwlpbnQgY2NfcG9zID0gaXR2LT52YmkuY2NfcG9zOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGNudDsgaSsrKSB7CisJCXN0cnVjdCB2NGwyX3NsaWNlZF92YmlfZGF0YSAqZCA9IGl0di0+dmJpLnNsaWNlZF9kZWNfZGF0YSArIGk7CisKKwkJaWYgKGQtPmlkID09IFY0TDJfU0xJQ0VEX0NBUFRJT05fNTI1ICYmIGQtPmxpbmUgPT0gMjEpIHsKKwkJCWZvdW5kX2NjID0gMTsKKwkJCWlmIChkLT5maWVsZCkgeworCQkJCWNjWzJdID0gZC0+ZGF0YVswXTsKKwkJCQljY1szXSA9IGQtPmRhdGFbMV07CisJCQl9IGVsc2UgeworCQkJCWNjWzBdID0gZC0+ZGF0YVswXTsKKwkJCQljY1sxXSA9IGQtPmRhdGFbMV07CisJCQl9CisJCX0KKwkJZWxzZSBpZiAoZC0+aWQgPT0gVjRMMl9TTElDRURfVlBTICYmIGQtPmxpbmUgPT0gMTYgJiYgZC0+ZmllbGQgPT0gMCkgeworCQkJbWVtY3B5KHZwcywgZC0+ZGF0YSwgc2l6ZW9mKHZwcykpOworCQkJZm91bmRfdnBzID0gMTsKKwkJfQorCQllbHNlIGlmIChkLT5pZCA9PSBWNEwyX1NMSUNFRF9XU1NfNjI1ICYmIGQtPmxpbmUgPT0gMjMgJiYgZC0+ZmllbGQgPT0gMCkgeworCQkJd3NzID0gZC0+ZGF0YVswXSB8IGQtPmRhdGFbMV0gPDwgODsKKwkJCWZvdW5kX3dzcyA9IDE7CisJCX0KKwl9CisKKwlpZiAoaXR2LT52Ymkud3NzX2ZvdW5kICE9IGZvdW5kX3dzcyB8fCBpdHYtPnZiaS53c3MgIT0gd3NzKSB7CisJCWl0di0+dmJpLndzcyA9IHdzczsKKwkJaXR2LT52Ymkud3NzX2ZvdW5kID0gZm91bmRfd3NzOworCQlzZXRfYml0KElWVFZfRl9JX1VQREFURV9XU1MsICZpdHYtPmlfZmxhZ3MpOworCX0KKworCWlmIChmb3VuZF92cHMgfHwgaXR2LT52YmkudnBzX2ZvdW5kKSB7CisJCWl0di0+dmJpLnZwc1swXSA9IHZwc1syXTsKKwkJaXR2LT52YmkudnBzWzFdID0gdnBzWzhdOworCQlpdHYtPnZiaS52cHNbMl0gPSB2cHNbOV07CisJCWl0di0+dmJpLnZwc1szXSA9IHZwc1sxMF07CisJCWl0di0+dmJpLnZwc1s0XSA9IHZwc1sxMV07CisJCWl0di0+dmJpLnZwc19mb3VuZCA9IGZvdW5kX3ZwczsKKwkJc2V0X2JpdChJVlRWX0ZfSV9VUERBVEVfVlBTLCAmaXR2LT5pX2ZsYWdzKTsKKwl9CisKKwlpZiAoZm91bmRfY2MgJiYgY2NfcG9zIDwgc2l6ZW9mKGl0di0+dmJpLmNjX2RhdGFfZXZlbikpIHsKKwkJaXR2LT52YmkuY2NfZGF0YV9vZGRbY2NfcG9zXSA9IGNjWzBdOworCQlpdHYtPnZiaS5jY19kYXRhX29kZFtjY19wb3MgKyAxXSA9IGNjWzFdOworCQlpdHYtPnZiaS5jY19kYXRhX2V2ZW5bY2NfcG9zXSA9IGNjWzJdOworCQlpdHYtPnZiaS5jY19kYXRhX2V2ZW5bY2NfcG9zICsgMV0gPSBjY1szXTsKKwkJaXR2LT52YmkuY2NfcG9zID0gY2NfcG9zICsgMjsKKwkJc2V0X2JpdChJVlRWX0ZfSV9VUERBVEVfQ0MsICZpdHYtPmlfZmxhZ3MpOworCX0KK30KKworc3RhdGljIHZvaWQgY29weV92YmlfZGF0YShzdHJ1Y3QgaXZ0diAqaXR2LCBpbnQgbGluZXMsIHUzMiBwdHNfc3RhbXApCit7CisJaW50IGxpbmUgPSAwOworCWludCBpOworCXUzMiBsaW5lbWFza1syXSA9IHsgMCwgMCB9OworCXVuc2lnbmVkIHNob3J0IHNpemU7CisJc3RhdGljIGNvbnN0IHU4IG1wZWdfaGRyX2RhdGFbXSA9IHsKKwkJMHgwMCwgMHgwMCwgMHgwMSwgMHhiYSwgMHg0NCwgMHgwMCwgMHgwYywgMHg2NiwKKwkJMHgyNCwgMHgwMSwgMHgwMSwgMHhkMSwgMHhkMywgMHhmYSwgMHhmZiwgMHhmZiwKKwkJMHgwMCwgMHgwMCwgMHgwMSwgMHhiZCwgMHgwMCwgMHgxYSwgMHg4NCwgMHg4MCwKKwkJMHgwNywgMHgyMSwgMHgwMCwgMHg1ZCwgMHg2MywgMHhhNywgMHhmZiwgMHhmZgorCX07CisJY29uc3QgaW50IHNkID0gc2l6ZW9mKG1wZWdfaGRyX2RhdGEpOwkvKiBzdGFydCBvZiB2YmkgZGF0YSAqLworCWludCBpZHggPSBpdHYtPnZiaS5mcmFtZSAlIElWVFZfVkJJX0ZSQU1FUzsKKwl1OCAqZHN0ID0gJml0di0+dmJpLnNsaWNlZF9tcGVnX2RhdGFbaWR4XVswXTsKKworCWZvciAoaSA9IDA7IGkgPCBsaW5lczsgaSsrKSB7CisJCWludCBmLCBsOworCisJCWlmIChpdHYtPnZiaS5zbGljZWRfZGF0YVtpXS5pZCA9PSAwKQorCQkJY29udGludWU7CisKKwkJbCA9IGl0di0+dmJpLnNsaWNlZF9kYXRhW2ldLmxpbmUgLSA2OworCQlmID0gaXR2LT52Ymkuc2xpY2VkX2RhdGFbaV0uZmllbGQ7CisJCWlmIChmKQorCQkJbCArPSAxODsKKwkJaWYgKGwgPCAzMikKKwkJCWxpbmVtYXNrWzBdIHw9ICgxIDw8IGwpOworCQllbHNlCisJCQlsaW5lbWFza1sxXSB8PSAoMSA8PCAobCAtIDMyKSk7CisJCWRzdFtzZCArIDEyICsgbGluZSAqIDQzXSA9IHNlcnZpY2UydmJpKGl0di0+dmJpLnNsaWNlZF9kYXRhW2ldLmlkKTsKKwkJbWVtY3B5KGRzdCArIHNkICsgMTIgKyBsaW5lICogNDMgKyAxLCBpdHYtPnZiaS5zbGljZWRfZGF0YVtpXS5kYXRhLCA0Mik7CisJCWxpbmUrKzsKKwl9CisJbWVtY3B5KGRzdCwgbXBlZ19oZHJfZGF0YSwgc2l6ZW9mKG1wZWdfaGRyX2RhdGEpKTsKKwlpZiAobGluZSA9PSAzNikgeworCQkvKiBBbGwgbGluZXMgYXJlIHVzZWQsIHNvIHRoZXJlIGlzIG5vIHNwYWNlIGZvciB0aGUgbGluZW1hc2sKKwkJICAgKHRoZSBtYXggc2l6ZSBvZiB0aGUgVkJJIGRhdGEgaXMgMzYgKiA0MyArIDQgYnl0ZXMpLgorCQkgICBTbyBpbiB0aGlzIGNhc2Ugd2UgdXNlIHRoZSBtYWdpYyBudW1iZXIgJ0lUVjAnLiAqLworCQltZW1jcHkoZHN0ICsgc2QsICJJVFYwIiwgNCk7CisJCW1lbWNweShkc3QgKyBzZCArIDQsIGRzdCArIHNkICsgMTIsIGxpbmUgKiA0Myk7CisJCXNpemUgPSA0ICsgKCg0MyAqIGxpbmUgKyAzKSAmIH4zKTsKKwl9IGVsc2UgeworCQltZW1jcHkoZHN0ICsgc2QsICJpdHYwIiwgNCk7CisJCW1lbWNweShkc3QgKyBzZCArIDQsICZsaW5lbWFza1swXSwgOCk7CisJCXNpemUgPSAxMiArICgoNDMgKiBsaW5lICsgMykgJiB+Myk7CisJfQorCWRzdFs0KzE2XSA9IChzaXplICsgMTApID4+IDg7CisJZHN0WzUrMTZdID0gKHNpemUgKyAxMCkgJiAweGZmOworCWRzdFs5KzE2XSA9IDB4MjEgfCAoKHB0c19zdGFtcCA+PiAyOSkgJiAweDYpOworCWRzdFsxMCsxNl0gPSAocHRzX3N0YW1wID4+IDIyKSAmIDB4ZmY7CisJZHN0WzExKzE2XSA9IDEgfCAoKHB0c19zdGFtcCA+PiAxNCkgJiAweGZmKTsKKwlkc3RbMTIrMTZdID0gKHB0c19zdGFtcCA+PiA3KSAmIDB4ZmY7CisJZHN0WzEzKzE2XSA9IDEgfCAoKHB0c19zdGFtcCAmIDB4N2YpIDw8IDEpOworCWl0di0+dmJpLnNsaWNlZF9tcGVnX3NpemVbaWR4XSA9IHNkICsgc2l6ZTsKK30KKworc3RhdGljIGludCBpdnR2X2NvbnZlcnRfaXZ0dl92Ymkoc3RydWN0IGl2dHYgKml0diwgdTggKnApCit7CisJdTMyIGxpbmVtYXNrWzJdOworCWludCBpLCBsLCBpZDI7CisJaW50IGxpbmUgPSAwOworCisJaWYgKCFtZW1jbXAocCwgIml0djAiLCA0KSkgeworCQltZW1jcHkobGluZW1hc2ssIHAgKyA0LCA4KTsKKwkJcCArPSAxMjsKKwl9IGVsc2UgaWYgKCFtZW1jbXAocCwgIklUVjAiLCA0KSkgeworCQlsaW5lbWFza1swXSA9IDB4ZmZmZmZmZmY7CisJCWxpbmVtYXNrWzFdID0gMHhmOworCQlwICs9IDQ7CisJfSBlbHNlIHsKKwkJLyogdW5rbm93biBWQkkgZGF0YSBzdHJlYW0gKi8KKwkJcmV0dXJuIDA7CisJfQorCWZvciAoaSA9IDA7IGkgPCAzNjsgaSsrKSB7CisJCWludCBlcnIgPSAwOworCisJCWlmIChpIDwgMzIgJiYgIShsaW5lbWFza1swXSAmICgxIDw8IGkpKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoaSA+PSAzMiAmJiAhKGxpbmVtYXNrWzFdICYgKDEgPDwgKGkgLSAzMikpKSkKKwkJCWNvbnRpbnVlOworCQlpZDIgPSAqcCAmIDB4ZjsKKwkJc3dpdGNoIChpZDIpIHsKKwkJY2FzZSBJVlRWX1NMSUNFRF9UWVBFX1RFTEVURVhUX0I6CisJCQlpZDIgPSBWNEwyX1NMSUNFRF9URUxFVEVYVF9COworCQkJYnJlYWs7CisJCWNhc2UgSVZUVl9TTElDRURfVFlQRV9DQVBUSU9OXzUyNToKKwkJCWlkMiA9IFY0TDJfU0xJQ0VEX0NBUFRJT05fNTI1OworCQkJZXJyID0gIW9kZF9wYXJpdHkocFsxXSkgfHwgIW9kZF9wYXJpdHkocFsyXSk7CisJCQlicmVhazsKKwkJY2FzZSBJVlRWX1NMSUNFRF9UWVBFX1ZQUzoKKwkJCWlkMiA9IFY0TDJfU0xJQ0VEX1ZQUzsKKwkJCWJyZWFrOworCQljYXNlIElWVFZfU0xJQ0VEX1RZUEVfV1NTXzYyNToKKwkJCWlkMiA9IFY0TDJfU0xJQ0VEX1dTU182MjU7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWlkMiA9IDA7CisJCQlicmVhazsKKwkJfQorCQlpZiAoZXJyID09IDApIHsKKwkJCWwgPSAoaSA8IDE4KSA/IGkgKyA2IDogaSAtIDE4ICsgNjsKKwkJCWl0di0+dmJpLnNsaWNlZF9kZWNfZGF0YVtsaW5lXS5saW5lID0gbDsKKwkJCWl0di0+dmJpLnNsaWNlZF9kZWNfZGF0YVtsaW5lXS5maWVsZCA9IGkgPj0gMTg7CisJCQlpdHYtPnZiaS5zbGljZWRfZGVjX2RhdGFbbGluZV0uaWQgPSBpZDI7CisJCQltZW1jcHkoaXR2LT52Ymkuc2xpY2VkX2RlY19kYXRhW2xpbmVdLmRhdGEsIHAgKyAxLCA0Mik7CisJCQlsaW5lKys7CisJCX0KKwkJcCArPSA0MzsKKwl9CisJd2hpbGUgKGxpbmUgPCAzNikgeworCQlpdHYtPnZiaS5zbGljZWRfZGVjX2RhdGFbbGluZV0uaWQgPSAwOworCQlpdHYtPnZiaS5zbGljZWRfZGVjX2RhdGFbbGluZV0ubGluZSA9IDA7CisJCWl0di0+dmJpLnNsaWNlZF9kZWNfZGF0YVtsaW5lXS5maWVsZCA9IDA7CisJCWxpbmUrKzsKKwl9CisJcmV0dXJuIGxpbmUgKiBzaXplb2YoaXR2LT52Ymkuc2xpY2VkX2RlY19kYXRhWzBdKTsKK30KKworc3NpemVfdCBpdnR2X3dyaXRlX3ZiaShzdHJ1Y3QgaXZ0diAqaXR2LCBjb25zdCBjaGFyIF9fdXNlciAqdWJ1Ziwgc2l6ZV90IGNvdW50KQoreworCS8qIFNob3VsZCBiZSBhIF9fdXNlciBwb2ludGVyLCBidXQgc3BhcnNlIGRvZXNuJ3QgcGFyc2UgdGhpcyBiaXQgY29ycmVjdGx5LiAqLworCWNvbnN0IHN0cnVjdCB2NGwyX3NsaWNlZF92YmlfZGF0YSAqcCA9IChjb25zdCBzdHJ1Y3QgdjRsMl9zbGljZWRfdmJpX2RhdGEgKil1YnVmOworCXU4IGNjWzRdID0geyAweDgwLCAweDgwLCAweDgwLCAweDgwIH07CisJaW50IGZvdW5kX2NjID0gMDsKKwlpbnQgY2NfcG9zID0gaXR2LT52YmkuY2NfcG9zOworCisJaWYgKGl0di0+dmJpLnNlcnZpY2Vfc2V0X291dCA9PSAwKQorCQlyZXR1cm4gLUVQRVJNOworCisJd2hpbGUgKGNvdW50ID49IHNpemVvZihzdHJ1Y3QgdjRsMl9zbGljZWRfdmJpX2RhdGEpKSB7CisJCXN3aXRjaCAocC0+aWQpIHsKKwkJY2FzZSBWNEwyX1NMSUNFRF9DQVBUSU9OXzUyNToKKwkJCWlmIChwLT5pZCA9PSBWNEwyX1NMSUNFRF9DQVBUSU9OXzUyNSAmJgorCQkJICAgIHAtPmxpbmUgPT0gMjEgJiYKKwkJCSAgICAoaXR2LT52Ymkuc2VydmljZV9zZXRfb3V0ICYKKwkJCQlWNEwyX1NMSUNFRF9DQVBUSU9OXzUyNSkgPT0gMCkgeworCQkJCWJyZWFrOworCQkJfQorCQkJZm91bmRfY2MgPSAxOworCQkJaWYgKHAtPmZpZWxkKSB7CisJCQkJY2NbMl0gPSBwLT5kYXRhWzBdOworCQkJCWNjWzNdID0gcC0+ZGF0YVsxXTsKKwkJCX0gZWxzZSB7CisJCQkJY2NbMF0gPSBwLT5kYXRhWzBdOworCQkJCWNjWzFdID0gcC0+ZGF0YVsxXTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgVjRMMl9TTElDRURfVlBTOgorCQkJaWYgKHAtPmxpbmUgPT0gMTYgJiYgcC0+ZmllbGQgPT0gMCAmJgorCQkJICAgIChpdHYtPnZiaS5zZXJ2aWNlX3NldF9vdXQgJiBWNEwyX1NMSUNFRF9WUFMpKSB7CisJCQkJaXR2LT52YmkudnBzWzBdID0gcC0+ZGF0YVsyXTsKKwkJCQlpdHYtPnZiaS52cHNbMV0gPSBwLT5kYXRhWzhdOworCQkJCWl0di0+dmJpLnZwc1syXSA9IHAtPmRhdGFbOV07CisJCQkJaXR2LT52YmkudnBzWzNdID0gcC0+ZGF0YVsxMF07CisJCQkJaXR2LT52YmkudnBzWzRdID0gcC0+ZGF0YVsxMV07CisJCQkJaXR2LT52YmkudnBzX2ZvdW5kID0gMTsKKwkJCQlzZXRfYml0KElWVFZfRl9JX1VQREFURV9WUFMsICZpdHYtPmlfZmxhZ3MpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBWNEwyX1NMSUNFRF9XU1NfNjI1OgorCQkJaWYgKHAtPmxpbmUgPT0gMjMgJiYgcC0+ZmllbGQgPT0gMCAmJgorCQkJICAgIChpdHYtPnZiaS5zZXJ2aWNlX3NldF9vdXQgJiBWNEwyX1NMSUNFRF9XU1NfNjI1KSkgeworCQkJCS8qIE5vIGxvY2sgbmVlZGVkIGZvciBXU1MgKi8KKwkJCQlpdHYtPnZiaS53c3MgPSBwLT5kYXRhWzBdIHwgKHAtPmRhdGFbMV0gPDwgOCk7CisJCQkJaXR2LT52Ymkud3NzX2ZvdW5kID0gMTsKKwkJCQlzZXRfYml0KElWVFZfRl9JX1VQREFURV9XU1MsICZpdHYtPmlfZmxhZ3MpOworCQkJfQorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJCWNvdW50IC09IHNpemVvZigqcCk7CisJCXArKzsKKwl9CisKKwlpZiAoZm91bmRfY2MgJiYgY2NfcG9zIDwgc2l6ZW9mKGl0di0+dmJpLmNjX2RhdGFfZXZlbikpIHsKKwkJaXR2LT52YmkuY2NfZGF0YV9vZGRbY2NfcG9zXSA9IGNjWzBdOworCQlpdHYtPnZiaS5jY19kYXRhX29kZFtjY19wb3MgKyAxXSA9IGNjWzFdOworCQlpdHYtPnZiaS5jY19kYXRhX2V2ZW5bY2NfcG9zXSA9IGNjWzJdOworCQlpdHYtPnZiaS5jY19kYXRhX2V2ZW5bY2NfcG9zICsgMV0gPSBjY1szXTsKKwkJaXR2LT52YmkuY2NfcG9zID0gY2NfcG9zICsgMjsKKwkJc2V0X2JpdChJVlRWX0ZfSV9VUERBVEVfQ0MsICZpdHYtPmlfZmxhZ3MpOworCX0KKworCXJldHVybiAoY29uc3QgY2hhciBfX3VzZXIgKilwIC0gdWJ1ZjsKK30KKworLyogQ29tcHJlc3MgcmF3IFZCSSBmb3JtYXQsIHJlbW92ZXMgbGVhZGluZyBTQVYgY29kZXMgYW5kIHN1cnBsdXMgc3BhY2UgYWZ0ZXIgdGhlCisgICBmaWVsZC4KKyAgIFJldHVybnMgbmV3IGNvbXByZXNzZWQgc2l6ZS4gKi8KK3N0YXRpYyB1MzIgY29tcHJlc3NfcmF3X2J1ZihzdHJ1Y3QgaXZ0diAqaXR2LCB1OCAqYnVmLCB1MzIgc2l6ZSkKK3sKKwl1MzIgbGluZV9zaXplID0gaXR2LT52YmkucmF3X2RlY29kZXJfbGluZV9zaXplOworCXUzMiBsaW5lcyA9IGl0di0+dmJpLmNvdW50OworCXU4IHNhdjEgPSBpdHYtPnZiaS5yYXdfZGVjb2Rlcl9zYXZfb2RkX2ZpZWxkOworCXU4IHNhdjIgPSBpdHYtPnZiaS5yYXdfZGVjb2Rlcl9zYXZfZXZlbl9maWVsZDsKKwl1OCAqcSA9IGJ1ZjsKKwl1OCAqcDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBsaW5lczsgaSsrKSB7CisJCXAgPSBidWYgKyBpICogbGluZV9zaXplOworCisJCS8qIExvb2sgZm9yIFNBViBjb2RlICovCisJCWlmIChwWzBdICE9IDB4ZmYgfHwgcFsxXSB8fCBwWzJdIHx8IChwWzNdICE9IHNhdjEgJiYgcFszXSAhPSBzYXYyKSkgeworCQkJYnJlYWs7CisJCX0KKwkJbWVtY3B5KHEsIHAgKyA0LCBsaW5lX3NpemUgLSA0KTsKKwkJcSArPSBsaW5lX3NpemUgLSA0OworCX0KKwlyZXR1cm4gbGluZXMgKiAobGluZV9zaXplIC0gNCk7Cit9CisKKworLyogQ29tcHJlc3NlZCBWQkkgZm9ybWF0LCBhbGwgZm91bmQgc2xpY2VkIGJsb2NrcyBwdXQgbmV4dCB0byBvbmUgYW5vdGhlcgorICAgUmV0dXJucyBuZXcgY29tcHJlc3NlZCBzaXplICovCitzdGF0aWMgdTMyIGNvbXByZXNzX3NsaWNlZF9idWYoc3RydWN0IGl2dHYgKml0diwgdTMyIGxpbmUsIHU4ICpidWYsIHUzMiBzaXplLCB1OCBzYXYpCit7CisJdTMyIGxpbmVfc2l6ZSA9IGl0di0+dmJpLnNsaWNlZF9kZWNvZGVyX2xpbmVfc2l6ZTsKKwlzdHJ1Y3QgdjRsMl9kZWNvZGVfdmJpX2xpbmUgdmJpOworCWludCBpOworCisJLyogZmluZCB0aGUgZmlyc3QgdmFsaWQgbGluZSAqLworCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyssIGJ1ZisrKSB7CisJCWlmIChidWZbMF0gPT0gMHhmZiAmJiAhYnVmWzFdICYmICFidWZbMl0gJiYgYnVmWzNdID09IHNhdikKKwkJCWJyZWFrOworCX0KKworCXNpemUgLT0gaTsKKwlpZiAoc2l6ZSA8IGxpbmVfc2l6ZSkgeworCQlyZXR1cm4gbGluZTsKKwl9CisJZm9yIChpID0gMDsgaSA8IHNpemUgLyBsaW5lX3NpemU7IGkrKykgeworCQl1OCAqcCA9IGJ1ZiArIGkgKiBsaW5lX3NpemU7CisKKwkJLyogTG9vayBmb3IgU0FWIGNvZGUgICovCisJCWlmIChwWzBdICE9IDB4ZmYgfHwgcFsxXSB8fCBwWzJdIHx8IHBbM10gIT0gc2F2KSB7CisJCQljb250aW51ZTsKKwkJfQorCQl2YmkucCA9IHAgKyA0OworCQlpdHYtPnZpZGVvX2RlY19mdW5jKGl0diwgVklESU9DX0lOVF9ERUNPREVfVkJJX0xJTkUsICZ2YmkpOworCQlpZiAodmJpLnR5cGUpIHsKKwkJCWl0di0+dmJpLnNsaWNlZF9kYXRhW2xpbmVdLmlkID0gdmJpLnR5cGU7CisJCQlpdHYtPnZiaS5zbGljZWRfZGF0YVtsaW5lXS5maWVsZCA9IHZiaS5pc19zZWNvbmRfZmllbGQ7CisJCQlpdHYtPnZiaS5zbGljZWRfZGF0YVtsaW5lXS5saW5lID0gdmJpLmxpbmU7CisJCQltZW1jcHkoaXR2LT52Ymkuc2xpY2VkX2RhdGFbbGluZV0uZGF0YSwgdmJpLnAsIDQyKTsKKwkJCWxpbmUrKzsKKwkJfQorCX0KKwlyZXR1cm4gbGluZTsKK30KKwordm9pZCBpdnR2X3Byb2Nlc3NfdmJpX2RhdGEoc3RydWN0IGl2dHYgKml0diwgc3RydWN0IGl2dHZfYnVmZmVyICpidWYsCisJCQkgICB1NjQgcHRzX3N0YW1wLCBpbnQgc3RyZWFtdHlwZSkKK3sKKwl1OCAqcCA9ICh1OCAqKSBidWYtPmJ1ZjsKKwl1MzIgc2l6ZSA9IGJ1Zi0+Ynl0ZXN1c2VkOworCWludCB5OworCisJLyogUmF3IFZCSSBkYXRhICovCisJaWYgKHN0cmVhbXR5cGUgPT0gSVZUVl9FTkNfU1RSRUFNX1RZUEVfVkJJICYmIGl0di0+dmJpLnNsaWNlZF9pbi0+c2VydmljZV9zZXQgPT0gMCkgeworCQl1OCB0eXBlOworCisJCWl2dHZfYnVmX3N3YXAoYnVmKTsKKworCQl0eXBlID0gcFszXTsKKworCQlzaXplID0gYnVmLT5ieXRlc3VzZWQgPSBjb21wcmVzc19yYXdfYnVmKGl0diwgcCwgc2l6ZSk7CisKKwkJLyogc2Vjb25kIGZpZWxkIG9mIHRoZSBmcmFtZT8gKi8KKwkJaWYgKHR5cGUgPT0gaXR2LT52YmkucmF3X2RlY29kZXJfc2F2X2V2ZW5fZmllbGQpIHsKKwkJCS8qIERpcnR5IGhhY2sgbmVlZGVkIGZvciBiYWNrd2FyZHMKKwkJCSAgIGNvbXBhdGliaWxpdHkgb2Ygb2xkIFZCSSBzb2Z0d2FyZS4gKi8KKwkJCXAgKz0gc2l6ZSAtIDQ7CisJCQltZW1jcHkocCwgJml0di0+dmJpLmZyYW1lLCA0KTsKKwkJCWl0di0+dmJpLmZyYW1lKys7CisJCX0KKwkJcmV0dXJuOworCX0KKworCS8qIFNsaWNlZCBWQkkgZGF0YSB3aXRoIGRhdGEgaW5zZXJ0aW9uICovCisJaWYgKHN0cmVhbXR5cGUgPT0gSVZUVl9FTkNfU1RSRUFNX1RZUEVfVkJJKSB7CisJCWludCBsaW5lczsKKworCQlpdnR2X2J1Zl9zd2FwKGJ1Zik7CisKKwkJLyogZmlyc3QgZmllbGQgKi8KKwkJbGluZXMgPSBjb21wcmVzc19zbGljZWRfYnVmKGl0diwgMCwgcCwgc2l6ZSAvIDIsCisJCQlpdHYtPnZiaS5zbGljZWRfZGVjb2Rlcl9zYXZfb2RkX2ZpZWxkKTsKKwkJLyogc2Vjb25kIGZpZWxkICovCisJCS8qIGV4cGVyaW1lbnRhdGlvbiBzaG93cyB0aGF0IHRoZSBzZWNvbmQgaGFsZiBkb2VzIG5vdCBhbHdheXMgYmVnaW4KKwkJICAgYXQgdGhlIGV4YWN0IGFkZHJlc3MuIFNvIHN0YXJ0IGEgYml0IGVhcmxpZXIgKGhlbmNlIDMyKS4gKi8KKwkJbGluZXMgPSBjb21wcmVzc19zbGljZWRfYnVmKGl0diwgbGluZXMsIHAgKyBzaXplIC8gMiAtIDMyLCBzaXplIC8gMiArIDMyLAorCQkJaXR2LT52Ymkuc2xpY2VkX2RlY29kZXJfc2F2X2V2ZW5fZmllbGQpOworCQkvKiBhbHdheXMgcmV0dXJuIGF0IGxlYXN0IG9uZSBlbXB0eSBsaW5lICovCisJCWlmIChsaW5lcyA9PSAwKSB7CisJCQlpdHYtPnZiaS5zbGljZWRfZGF0YVswXS5pZCA9IDA7CisJCQlpdHYtPnZiaS5zbGljZWRfZGF0YVswXS5saW5lID0gMDsKKwkJCWl0di0+dmJpLnNsaWNlZF9kYXRhWzBdLmZpZWxkID0gMDsKKwkJCWxpbmVzID0gMTsKKwkJfQorCQlidWYtPmJ5dGVzdXNlZCA9IHNpemUgPSBsaW5lcyAqIHNpemVvZihpdHYtPnZiaS5zbGljZWRfZGF0YVswXSk7CisJCW1lbWNweShwLCAmaXR2LT52Ymkuc2xpY2VkX2RhdGFbMF0sIHNpemUpOworCisJCWlmIChpdHYtPnZiaS5pbnNlcnRfbXBlZykgeworCQkJY29weV92YmlfZGF0YShpdHYsIGxpbmVzLCBwdHNfc3RhbXApOworCQl9CisJCWl0di0+dmJpLmZyYW1lKys7CisJCXJldHVybjsKKwl9CisKKwkvKiBTbGljZWQgVkJJIHJlLWluc2VydGVkIGZyb20gYW4gTVBFRyBzdHJlYW0gKi8KKwlpZiAoc3RyZWFtdHlwZSA9PSBJVlRWX0RFQ19TVFJFQU1fVFlQRV9WQkkpIHsKKwkJLyogSWYgdGhlIHNpemUgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLCB0aGVuIHRoZSBzdGFydGluZyBhZGRyZXNzCisJCSAgIGZvciB0aGUgc3dhcHBpbmcgaXMgYWxzbyBzaGlmdGVkLiBBZnRlciBzd2FwcGluZyB0aGUgZGF0YSB0aGUKKwkJICAgcmVhbCBzdGFydCBhZGRyZXNzIG9mIHRoZSBWQkkgZGF0YSBpcyBleGFjdGx5IDQgYnl0ZXMgYWZ0ZXIgdGhlCisJCSAgIG9yaWdpbmFsIHN0YXJ0LiBJdCdzIGEgYml0IGZpZGRseSBidXQgaXQgd29ya3MgbGlrZSBhIGNoYXJtLgorCQkgICBOb24tNC1ieXRlIGFsaWdubWVudCBoYXBwZW5zIHdoZW4gYW4gbHNlZWsgaXMgZG9uZSBvbiB0aGUgaW5wdXQKKwkJICAgbXBlZyBmaWxlIHRvIGEgbm9uLTQtYnl0ZSBhbGlnbmVkIHBvc2l0aW9uLiBTbyBvbiBhcnJpdmFsIGhlcmUKKwkJICAgdGhlIFZCSSBkYXRhIGlzIGFsc28gbm9uLTQtYnl0ZSBhbGlnbmVkLiAqLworCQlpbnQgb2Zmc2V0ID0gc2l6ZSAmIDM7CisJCWludCBjbnQ7CisKKwkJaWYgKG9mZnNldCkgeworCQkJcCArPSA0IC0gb2Zmc2V0OworCQl9CisJCS8qIFN3YXAgQnVmZmVyICovCisJCWZvciAoeSA9IDA7IHkgPCBzaXplOyB5ICs9IDQpIHsKKwkJICAgICAgIHN3YWIzMnMoKHUzMiAqKShwICsgeSkpOworCQl9CisKKwkJY250ID0gaXZ0dl9jb252ZXJ0X2l2dHZfdmJpKGl0diwgcCArIG9mZnNldCk7CisJCW1lbWNweShidWYtPmJ1ZiwgaXR2LT52Ymkuc2xpY2VkX2RlY19kYXRhLCBjbnQpOworCQlidWYtPmJ5dGVzdXNlZCA9IGNudDsKKworCQlwYXNzdGhyb3VnaF92YmlfZGF0YShpdHYsIGNudCAvIHNpemVvZihpdHYtPnZiaS5zbGljZWRfZGVjX2RhdGFbMF0pKTsKKwkJcmV0dXJuOworCX0KK30KKwordm9pZCBpdnR2X2Rpc2FibGVfdmJpKHN0cnVjdCBpdnR2ICppdHYpCit7CisJY2xlYXJfYml0KElWVFZfRl9JX1VQREFURV9XU1MsICZpdHYtPmlfZmxhZ3MpOworCWNsZWFyX2JpdChJVlRWX0ZfSV9VUERBVEVfVlBTLCAmaXR2LT5pX2ZsYWdzKTsKKwljbGVhcl9iaXQoSVZUVl9GX0lfVVBEQVRFX0NDLCAmaXR2LT5pX2ZsYWdzKTsKKwlpdnR2X3NldF93c3MoaXR2LCAwLCAwKTsKKwlpdnR2X3NldF9jYyhpdHYsIDAsIDAsIDAsIDAsIDApOworCWl2dHZfc2V0X3ZwcyhpdHYsIDAsIDAsIDAsIDAsIDAsIDApOworCWl0di0+dmJpLnZwc19mb3VuZCA9IGl0di0+dmJpLndzc19mb3VuZCA9IDA7CisJaXR2LT52Ymkud3NzID0gMDsKKwlpdHYtPnZiaS5jY19wb3MgPSAwOworfQorCisKK3ZvaWQgdmJpX3dvcmtfaGFuZGxlcihzdHJ1Y3QgaXZ0diAqaXR2KQoreworCXN0cnVjdCB2NGwyX3NsaWNlZF92YmlfZGF0YSBkYXRhOworCisJLyogTG9jayAqLworCWlmIChpdHYtPm91dHB1dF9tb2RlID09IE9VVF9QQVNTVEhST1VHSCkgeworCQkvKiBOb3RlOiBjdXJyZW50bHkgb25seSB0aGUgc2FhNzExNSBpcyB1c2VkIGluIGEgUFZSMzUwLAorCQkgICBzbyB0aGVzZSBjb21tYW5kcyBhcmUgZm9yIG5vdyBzYWE3MTE1IHNwZWNpZmljLiAqLworCQlpZiAoaXR2LT5pc181MGh6KSB7CisJCQlkYXRhLmlkID0gVjRMMl9TTElDRURfV1NTXzYyNTsKKwkJCWRhdGEuZmllbGQgPSAwOworCisJCQlpZiAoaXR2LT52aWRlb19kZWNfZnVuYyhpdHYsIFZJRElPQ19JTlRfR19WQklfREFUQSwgJmRhdGEpID09IDApIHsKKwkJCQlpdnR2X3NldF93c3MoaXR2LCAxLCBkYXRhLmRhdGFbMF0gJiAweGYpOworCQkJCWl0di0+dmJpLndzc19ub191cGRhdGUgPSAwOworCQkJfSBlbHNlIGlmIChpdHYtPnZiaS53c3Nfbm9fdXBkYXRlID09IDQpIHsKKwkJCQlpdnR2X3NldF93c3MoaXR2LCAxLCAweDgpOyAgLyogNHgzIGZ1bGwgZm9ybWF0ICovCisJCQl9IGVsc2UgeworCQkJCWl0di0+dmJpLndzc19ub191cGRhdGUrKzsKKwkJCX0KKwkJfQorCQllbHNlIHsKKwkJCXU4IGMxID0gMCwgYzIgPSAwLCBjMyA9IDAsIGM0ID0gMDsKKwkJCWludCBtb2RlID0gMDsKKworCQkJZGF0YS5pZCA9IFY0TDJfU0xJQ0VEX0NBUFRJT05fNTI1OworCQkJZGF0YS5maWVsZCA9IDA7CisJCQlpZiAoaXR2LT52aWRlb19kZWNfZnVuYyhpdHYsIFZJRElPQ19JTlRfR19WQklfREFUQSwgJmRhdGEpID09IDApIHsKKwkJCQltb2RlIHw9IDE7CisJCQkJYzEgPSBkYXRhLmRhdGFbMF07CisJCQkJYzIgPSBkYXRhLmRhdGFbMV07CisJCQl9CisJCQlkYXRhLmZpZWxkID0gMTsKKwkJCWlmIChpdHYtPnZpZGVvX2RlY19mdW5jKGl0diwgVklESU9DX0lOVF9HX1ZCSV9EQVRBLCAmZGF0YSkgPT0gMCkgeworCQkJCW1vZGUgfD0gMjsKKwkJCQljMyA9IGRhdGEuZGF0YVswXTsKKwkJCQljNCA9IGRhdGEuZGF0YVsxXTsKKwkJCX0KKwkJCWlmIChtb2RlKSB7CisJCQkJaXR2LT52YmkuY2Nfbm9fdXBkYXRlID0gMDsKKwkJCQlpdnR2X3NldF9jYyhpdHYsIG1vZGUsIGMxLCBjMiwgYzMsIGM0KTsKKwkJCX0gZWxzZSBpZiAoaXR2LT52YmkuY2Nfbm9fdXBkYXRlID09IDQpIHsKKwkJCQlpdnR2X3NldF9jYyhpdHYsIDAsIDAsIDAsIDAsIDApOworCQkJfSBlbHNlIHsKKwkJCQlpdHYtPnZiaS5jY19ub191cGRhdGUrKzsKKwkJCX0KKwkJfQorCQlyZXR1cm47CisJfQorCisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChJVlRWX0ZfSV9VUERBVEVfV1NTLCAmaXR2LT5pX2ZsYWdzKSkgeworCQkvKiBMb2NrICovCisJCWl2dHZfc2V0X3dzcyhpdHYsIGl0di0+dmJpLndzc19mb3VuZCwgaXR2LT52Ymkud3NzICYgMHhmKTsKKwl9CisKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KElWVFZfRl9JX1VQREFURV9DQywgJml0di0+aV9mbGFncykpIHsKKwkJaWYgKGl0di0+dmJpLmNjX3BvcyA9PSAwKSB7CisJCQlpdnR2X3NldF9jYyhpdHYsIDMsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODApOworCQl9CisJCXdoaWxlIChpdHYtPnZiaS5jY19wb3MpIHsKKwkJCXU4IGNjX29kZDAgPSBpdHYtPnZiaS5jY19kYXRhX29kZFswXTsKKwkJCXU4IGNjX29kZDEgPSBpdHYtPnZiaS5jY19kYXRhX29kZFsxXTsKKwkJCXU4IGNjX2V2ZW4wID0gaXR2LT52YmkuY2NfZGF0YV9ldmVuWzBdOworCQkJdTggY2NfZXZlbjEgPSBpdHYtPnZiaS5jY19kYXRhX2V2ZW5bMV07CisKKwkJCW1lbWNweShpdHYtPnZiaS5jY19kYXRhX29kZCwgaXR2LT52YmkuY2NfZGF0YV9vZGQgKyAyLCBzaXplb2YoaXR2LT52YmkuY2NfZGF0YV9vZGQpIC0gMik7CisJCQltZW1jcHkoaXR2LT52YmkuY2NfZGF0YV9ldmVuLCBpdHYtPnZiaS5jY19kYXRhX2V2ZW4gKyAyLCBzaXplb2YoaXR2LT52YmkuY2NfZGF0YV9ldmVuKSAtIDIpOworCQkJaXR2LT52YmkuY2NfcG9zIC09IDI7CisJCQlpZiAoaXR2LT52YmkuY2NfcG9zICYmIGNjX29kZDAgPT0gMHg4MCAmJiBjY19vZGQxID09IDB4ODApCisJCQkJY29udGludWU7CisKKwkJCS8qIFNlbmQgdG8gU2FhNzEyNyAqLworCQkJaXZ0dl9zZXRfY2MoaXR2LCAzLCBjY19vZGQwLCBjY19vZGQxLCBjY19ldmVuMCwgY2NfZXZlbjEpOworCQkJaWYgKGl0di0+dmJpLmNjX3BvcyA9PSAwKQorCQkJCXNldF9iaXQoSVZUVl9GX0lfVVBEQVRFX0NDLCAmaXR2LT5pX2ZsYWdzKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChJVlRWX0ZfSV9VUERBVEVfVlBTLCAmaXR2LT5pX2ZsYWdzKSkgeworCQkvKiBMb2NrICovCisJCWl2dHZfc2V0X3ZwcyhpdHYsIGl0di0+dmJpLnZwc19mb3VuZCwKKwkJCWl0di0+dmJpLnZwc1swXSwgaXR2LT52YmkudnBzWzFdLAorCQkJaXR2LT52YmkudnBzWzJdLCBpdHYtPnZiaS52cHNbM10sIGl0di0+dmJpLnZwc1s0XSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtdmJpLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di12YmkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGFlYTY5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtdmJpLmgKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAgICBWZXJ0aWNhbCBCbGFuayBJbnRlcnZhbCBzdXBwb3J0IGZ1bmN0aW9ucworICAgIENvcHlyaWdodCAoQykgMjAwNC0yMDA3ICBIYW5zIFZlcmt1aWwgPGh2ZXJrdWlsQHhzNGFsbC5ubD4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCitzc2l6ZV90IGl2dHZfd3JpdGVfdmJpKHN0cnVjdCBpdnR2ICppdHYsIGNvbnN0IGNoYXIgX191c2VyICp1YnVmLCBzaXplX3QgY291bnQpOwordm9pZCBpdnR2X3Byb2Nlc3NfdmJpX2RhdGEoc3RydWN0IGl2dHYgKml0diwgc3RydWN0IGl2dHZfYnVmZmVyICpidWYsCisJCQkgICB1NjQgcHRzX3N0YW1wLCBpbnQgc3RyZWFtdHlwZSk7CitpbnQgaXZ0dl91c2VkX2xpbmUoc3RydWN0IGl2dHYgKml0diwgaW50IGxpbmUsIGludCBmaWVsZCk7Cit2b2lkIGl2dHZfZGlzYWJsZV92Ymkoc3RydWN0IGl2dHYgKml0dik7Cit2b2lkIGl2dHZfc2V0X3ZiaSh1bnNpZ25lZCBsb25nIGFyZyk7Cit2b2lkIHZiaV93b3JrX2hhbmRsZXIoc3RydWN0IGl2dHYgKml0dik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di12ZXJzaW9uLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di12ZXJzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU1MzBhMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LXZlcnNpb24uaApAQCAtMCwwICsxLDI2IEBACisvKgorICAgIGl2dHYgZHJpdmVyIHZlcnNpb24gaW5mb3JtYXRpb24KKyAgICBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNyAgSGFucyBWZXJrdWlsIDxodmVya3VpbEB4czRhbGwubmw+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2RlZmluZSBJVlRWX0RSSVZFUl9OQU1FICJpdnR2IgorI2RlZmluZSBJVlRWX0RSSVZFUl9WRVJTSU9OX01BSk9SIDEKKyNkZWZpbmUgSVZUVl9EUklWRVJfVkVSU0lPTl9NSU5PUiAwCisjZGVmaW5lIElWVFZfRFJJVkVSX1ZFUlNJT05fUEFUQ0hMRVZFTCAwCisKKyNkZWZpbmUgSVZUVl9WRVJTSU9OIF9fc3RyaW5naWZ5KElWVFZfRFJJVkVSX1ZFUlNJT05fTUFKT1IpICIuIiBfX3N0cmluZ2lmeShJVlRWX0RSSVZFUl9WRVJTSU9OX01JTk9SKSAiLiIgX19zdHJpbmdpZnkoSVZUVl9EUklWRVJfVkVSU0lPTl9QQVRDSExFVkVMKQorI2RlZmluZSBJVlRWX0RSSVZFUl9WRVJTSU9OIEtFUk5FTF9WRVJTSU9OKElWVFZfRFJJVkVSX1ZFUlNJT05fTUFKT1IsSVZUVl9EUklWRVJfVkVSU0lPTl9NSU5PUixJVlRWX0RSSVZFUl9WRVJTSU9OX1BBVENITEVWRUwpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di12aWRlby5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtdmlkZW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODU4YjE5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtdmlkZW8uYwpAQCAtMCwwICsxLDE0MiBAQAorLyoKKyAgICBzYWE3MTI3IGludGVyZmFjZSBmdW5jdGlvbnMKKyAgICBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNyAgSGFucyBWZXJrdWlsIDxodmVya3VpbEB4czRhbGwubmw+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgIml2dHYtZHJpdmVyLmgiCisjaW5jbHVkZSAiaXZ0di12aWRlby5oIgorI2luY2x1ZGUgIml2dHYtaTJjLmgiCisjaW5jbHVkZSAiaXZ0di1ncGlvLmgiCisjaW5jbHVkZSAiaXZ0di1jYXJkcy5oIgorI2luY2x1ZGUgPG1lZGlhL3VwZDY0MDMxYS5oPgorI2luY2x1ZGUgPG1lZGlhL3VwZDY0MDgzLmg+CisKK3ZvaWQgaXZ0dl9zZXRfdnBzKHN0cnVjdCBpdnR2ICppdHYsIGludCBlbmFibGVkLCB1OCB2cHMxLCB1OCB2cHMyLCB1OCB2cHMzLAorCQkgIHU4IHZwczQsIHU4IHZwczUpCit7CisJc3RydWN0IHY0bDJfc2xpY2VkX3ZiaV9kYXRhIGRhdGE7CisKKwlpZiAoIShpdHYtPnY0bDJfY2FwICYgVjRMMl9DQVBfVklERU9fT1VUUFVUKSkKKwkJcmV0dXJuOworCWRhdGEuaWQgPSBWNEwyX1NMSUNFRF9WUFM7CisJZGF0YS5maWVsZCA9IDA7CisJZGF0YS5saW5lID0gZW5hYmxlZCA/IDE2IDogMDsKKwlkYXRhLmRhdGFbNF0gPSB2cHMxOworCWRhdGEuZGF0YVsxMF0gPSB2cHMyOworCWRhdGEuZGF0YVsxMV0gPSB2cHMzOworCWRhdGEuZGF0YVsxMl0gPSB2cHM0OworCWRhdGEuZGF0YVsxM10gPSB2cHM1OworCWl2dHZfc2FhNzEyNyhpdHYsIFZJRElPQ19JTlRfU19WQklfREFUQSwgJmRhdGEpOworfQorCit2b2lkIGl2dHZfc2V0X2NjKHN0cnVjdCBpdnR2ICppdHYsIGludCBtb2RlLCB1OCBjYzEsIHU4IGNjMiwgdTggY2MzLCB1OCBjYzQpCit7CisJc3RydWN0IHY0bDJfc2xpY2VkX3ZiaV9kYXRhIGRhdGE7CisKKwlpZiAoIShpdHYtPnY0bDJfY2FwICYgVjRMMl9DQVBfVklERU9fT1VUUFVUKSkKKwkJcmV0dXJuOworCWRhdGEuaWQgPSBWNEwyX1NMSUNFRF9DQVBUSU9OXzUyNTsKKwlkYXRhLmZpZWxkID0gMDsKKwlkYXRhLmxpbmUgPSAobW9kZSAmIDEpID8gMjEgOiAwOworCWRhdGEuZGF0YVswXSA9IGNjMTsKKwlkYXRhLmRhdGFbMV0gPSBjYzI7CisJaXZ0dl9zYWE3MTI3KGl0diwgVklESU9DX0lOVF9TX1ZCSV9EQVRBLCAmZGF0YSk7CisJZGF0YS5maWVsZCA9IDE7CisJZGF0YS5saW5lID0gKG1vZGUgJiAyKSA/IDIxIDogMDsKKwlkYXRhLmRhdGFbMF0gPSBjYzM7CisJZGF0YS5kYXRhWzFdID0gY2M0OworCWl2dHZfc2FhNzEyNyhpdHYsIFZJRElPQ19JTlRfU19WQklfREFUQSwgJmRhdGEpOworfQorCit2b2lkIGl2dHZfc2V0X3dzcyhzdHJ1Y3QgaXZ0diAqaXR2LCBpbnQgZW5hYmxlZCwgaW50IG1vZGUpCit7CisJc3RydWN0IHY0bDJfc2xpY2VkX3ZiaV9kYXRhIGRhdGE7CisKKwlpZiAoIShpdHYtPnY0bDJfY2FwICYgVjRMMl9DQVBfVklERU9fT1VUUFVUKSkKKwkJcmV0dXJuOworCS8qIFdoZW4gdXNpbmcgYSA1MCBIeiBzeXN0ZW0sIGFsd2F5cyB0dXJuIG9uIHRoZQorCSAgIHdpZGUgc2NyZWVuIHNpZ25hbCB3aXRoIDR4MyByYXRpbyBhcyB0aGUgZGVmYXVsdC4KKwkgICBUdXJuaW5nIHRoaXMgc2lnbmFsIG9uIGFuZCBvZmYgY2FuIGNvbmZ1c2UgY2VydGFpbgorCSAgIFRWcy4gQXMgZmFyIGFzIEkgY2FuIHRlbGwgdGhlcmUgaXMgbm8gcmVhc29uIG5vdCB0bworCSAgIHRyYW5zbWl0IHRoaXMgc2lnbmFsLiAqLworCWlmICgoaXR2LT5zdGQgJiBWNEwyX1NURF82MjVfNTApICYmICFlbmFibGVkKSB7CisJCWVuYWJsZWQgPSAxOworCQltb2RlID0gMHgwODsgIC8qIDR4MyBmdWxsIGZvcm1hdCAqLworCX0KKwlkYXRhLmlkID0gVjRMMl9TTElDRURfV1NTXzYyNTsKKwlkYXRhLmZpZWxkID0gMDsKKwlkYXRhLmxpbmUgPSBlbmFibGVkID8gMjMgOiAwOworCWRhdGEuZGF0YVswXSA9IG1vZGUgJiAweGZmOworCWRhdGEuZGF0YVsxXSA9IChtb2RlID4+IDgpICYgMHhmZjsKKwlpdnR2X3NhYTcxMjcoaXR2LCBWSURJT0NfSU5UX1NfVkJJX0RBVEEsICZkYXRhKTsKK30KKwordm9pZCBpdnR2X3ZpZGVvX3NldF9pbyhzdHJ1Y3QgaXZ0diAqaXR2KQoreworCXN0cnVjdCB2NGwyX3JvdXRpbmcgcm91dGU7CisJaW50IGlucCA9IGl0di0+YWN0aXZlX2lucHV0OworCXUzMiB0eXBlOworCisJcm91dGUuaW5wdXQgPSBpdHYtPmNhcmQtPnZpZGVvX2lucHV0c1tpbnBdLnZpZGVvX2lucHV0OworCXJvdXRlLm91dHB1dCA9IDA7CisJaXR2LT52aWRlb19kZWNfZnVuYyhpdHYsIFZJRElPQ19JTlRfU19WSURFT19ST1VUSU5HLCAmcm91dGUpOworCisJdHlwZSA9IGl0di0+Y2FyZC0+dmlkZW9faW5wdXRzW2lucF0udmlkZW9fdHlwZTsKKworCWlmICh0eXBlID09IElWVFZfQ0FSRF9JTlBVVF9WSURfVFVORVIpIHsKKwkJcm91dGUuaW5wdXQgPSAwOyAgLyogVHVuZXIgKi8KKwl9IGVsc2UgaWYgKHR5cGUgPCBJVlRWX0NBUkRfSU5QVVRfQ09NUE9TSVRFMSkgeworCQlyb3V0ZS5pbnB1dCA9IDI7ICAvKiBTLVZpZGVvICovCisJfSBlbHNlIHsKKwkJcm91dGUuaW5wdXQgPSAxOyAgLyogQ29tcG9zaXRlICovCisJfQorCisJaWYgKGl0di0+Y2FyZC0+aHdfdmlkZW8gJiBJVlRWX0hXX0dQSU8pCisJCWl2dHZfZ3BpbyhpdHYsIFZJRElPQ19JTlRfU19WSURFT19ST1VUSU5HLCAmcm91dGUpOworCisJaWYgKGl0di0+Y2FyZC0+aHdfdmlkZW8gJiBJVlRWX0hXX1VQRDY0MDMxQSkgeworCQlpZiAodHlwZSA9PSBJVlRWX0NBUkRfSU5QVVRfVklEX1RVTkVSIHx8CisJCSAgICB0eXBlID49IElWVFZfQ0FSRF9JTlBVVF9DT01QT1NJVEUxKSB7CisJCQkvKiBDb21wb3NpdGU6IEdSIG9uLCBjb25uZWN0IHRvIDNEWUNTICovCisJCQlyb3V0ZS5pbnB1dCA9IFVQRDY0MDMxQV9HUl9PTiB8IFVQRDY0MDMxQV8zRFlDU19DT01QT1NJVEU7CisJCX0gZWxzZSB7CisJCQkvKiBTLVZpZGVvOiBHUiBieXBhc3NlZCwgdHVybiBpdCBvZmYgKi8KKwkJCXJvdXRlLmlucHV0ID0gVVBENjQwMzFBX0dSX09GRiB8IFVQRDY0MDMxQV8zRFlDU19ESVNBQkxFOworCQl9CisJCXJvdXRlLmlucHV0IHw9IGl0di0+Y2FyZC0+Z3JfY29uZmlnOworCisJCWl2dHZfdXBkNjQwMzFhKGl0diwgVklESU9DX0lOVF9TX1ZJREVPX1JPVVRJTkcsICZyb3V0ZSk7CisJfQorCisJaWYgKGl0di0+Y2FyZC0+aHdfdmlkZW8gJiBJVlRWX0hXX1VQRDY0MDhYKSB7CisJCXJvdXRlLmlucHV0ID0gVVBENjQwODNfWUNTX01PREU7CisJCWlmICh0eXBlID4gSVZUVl9DQVJEX0lOUFVUX1ZJRF9UVU5FUiAmJgorCQkgICAgdHlwZSA8IElWVFZfQ0FSRF9JTlBVVF9DT01QT1NJVEUxKSB7CisJCQkvKiBTLVZpZGVvIHVzZXMgWUNOUiBtb2RlIGFuZCBpbnRlcm5hbCBZLUFEQywgdGhlIHVwZDY0MDMxYQorCQkJICAgaXMgbm90IHVzZWQuICovCisJCQlyb3V0ZS5pbnB1dCB8PSBVUEQ2NDA4M19ZQ05SX01PREU7CisJCX0KKwkJZWxzZSBpZiAoaXR2LT5jYXJkLT5od192aWRlbyAmIElWVFZfSFdfVVBENjQwMzFBKSB7CisJCSAgLyogVXNlIHVwZDY0MDMxYSBvdXRwdXQgZm9yIHR1bmVyIGFuZCBjb21wb3NpdGUoQ1gyMzQxNkdZQyBvbmx5KSBpbnB1dHMgKi8KKwkJICBpZiAoKHR5cGUgPT0gSVZUVl9DQVJEX0lOUFVUX1ZJRF9UVU5FUil8fAorCQkgICAgICAoaXR2LT5jYXJkLT50eXBlID09IElWVFZfQ0FSRF9DWDIzNDE2R1lDKSkgeworCQkgICAgcm91dGUuaW5wdXQgfD0gVVBENjQwODNfRVhUX1lfQURDOworCQkgIH0KKwkJfQorCQlpdnR2X3VwZDY0MDgzKGl0diwgVklESU9DX0lOVF9TX1ZJREVPX1JPVVRJTkcsICZyb3V0ZSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtdmlkZW8uaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LXZpZGVvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhhZGU1ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LXZpZGVvLmgKQEAgLTAsMCArMSwyNCBAQAorLyoKKyAgICBzYWE3MTI3IGludGVyZmFjZSBmdW5jdGlvbnMKKyAgICBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNyAgSGFucyBWZXJrdWlsIDxodmVya3VpbEB4czRhbGwubmw+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKwordm9pZCBpdnR2X3NldF93c3Moc3RydWN0IGl2dHYgKml0diwgaW50IGVuYWJsZWQsIGludCBtb2RlKTsKK3ZvaWQgaXZ0dl9zZXRfY2Moc3RydWN0IGl2dHYgKml0diwgaW50IG1vZGUsIHU4IGNjMSwgdTggY2MyLCB1OCBjYzMsIHU4IGNjNCk7Cit2b2lkIGl2dHZfc2V0X3ZwcyhzdHJ1Y3QgaXZ0diAqaXR2LCBpbnQgZW5hYmxlZCwgdTggdnBzMSwgdTggdnBzMiwgdTggdnBzMywKKwkJICB1OCB2cHM0LCB1OCB2cHM1KTsKK3ZvaWQgaXZ0dl92aWRlb19zZXRfaW8oc3RydWN0IGl2dHYgKml0dik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di15dXYuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LXl1di5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjZWEwOTU0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYteXV2LmMKQEAgLTAsMCArMSwxMTI5IEBACisvKgorICAgIHl1diBzdXBwb3J0CisKKyAgICBDb3B5cmlnaHQgKEMpIDIwMDcgIElhbiBBcm1zdHJvbmcgPGlhbkBpYXJtc3QuZGVtb24uY28udWs+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgIml2dHYtZHJpdmVyLmgiCisjaW5jbHVkZSAiaXZ0di1xdWV1ZS5oIgorI2luY2x1ZGUgIml2dHYtdWRtYS5oIgorI2luY2x1ZGUgIml2dHYtaXJxLmgiCisjaW5jbHVkZSAiaXZ0di15dXYuaCIKKworc3RhdGljIGludCBpdnR2X3l1dl9wcmVwX3VzZXJfZG1hKHN0cnVjdCBpdnR2ICppdHYsIHN0cnVjdCBpdnR2X3VzZXJfZG1hICpkbWEsCisJCQkJIHN0cnVjdCBpdnR2X2RtYV9mcmFtZSAqYXJncykKK3sKKwlzdHJ1Y3QgaXZ0dl9kbWFfcGFnZV9pbmZvIHlfZG1hOworCXN0cnVjdCBpdnR2X2RtYV9wYWdlX2luZm8gdXZfZG1hOworCisJaW50IGk7CisJaW50IHlfcGFnZXMsIHV2X3BhZ2VzOworCisJdW5zaWduZWQgbG9uZyB5X2J1ZmZlcl9vZmZzZXQsIHV2X2J1ZmZlcl9vZmZzZXQ7CisJaW50IHlfZGVjb2RlX2hlaWdodCwgdXZfZGVjb2RlX2hlaWdodCwgeV9zaXplOworCWludCBmcmFtZSA9IGF0b21pY19yZWFkKCZpdHYtPnl1dl9pbmZvLm5leHRfZmlsbF9mcmFtZSk7CisKKwl5X2J1ZmZlcl9vZmZzZXQgPSBJVlRWX0RFQ19NRU1fU1RBUlQgKyB5dXZfb2Zmc2V0W2ZyYW1lXTsKKwl1dl9idWZmZXJfb2Zmc2V0ID0geV9idWZmZXJfb2Zmc2V0ICsgSVZUVl9ZVVZfQlVGRkVSX1VWX09GRlNFVDsKKworCXlfZGVjb2RlX2hlaWdodCA9IHV2X2RlY29kZV9oZWlnaHQgPSBhcmdzLT5zcmMuaGVpZ2h0ICsgYXJncy0+c3JjLnRvcDsKKworCWlmICh5X2RlY29kZV9oZWlnaHQgPCA1MTItMTYpCisJCXlfYnVmZmVyX29mZnNldCArPSA3MjAgKiAxNjsKKworCWlmICh5X2RlY29kZV9oZWlnaHQgJiAxNSkKKwkJeV9kZWNvZGVfaGVpZ2h0ID0gKHlfZGVjb2RlX2hlaWdodCArIDE2KSAmIH4xNTsKKworCWlmICh1dl9kZWNvZGVfaGVpZ2h0ICYgMzEpCisJCXV2X2RlY29kZV9oZWlnaHQgPSAodXZfZGVjb2RlX2hlaWdodCArIDMyKSAmIH4zMTsKKworCXlfc2l6ZSA9IDcyMCAqIHlfZGVjb2RlX2hlaWdodDsKKworCS8qIFN0aWxsIGluIFVTRSAqLworCWlmIChkbWEtPlNHX2xlbmd0aCB8fCBkbWEtPnBhZ2VfY291bnQpIHsKKwkJSVZUVl9ERUJVR19XQVJOKCJwcmVwX3VzZXJfZG1hOiBTR19sZW5ndGggJWQgcGFnZV9jb3VudCAlZCBzdGlsbCBmdWxsP1xuIiwKKwkJCQlkbWEtPlNHX2xlbmd0aCwgZG1hLT5wYWdlX2NvdW50KTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlpdnR2X3VkbWFfZ2V0X3BhZ2VfaW5mbyAoJnlfZG1hLCAodW5zaWduZWQgbG9uZylhcmdzLT55X3NvdXJjZSwgNzIwICogeV9kZWNvZGVfaGVpZ2h0KTsKKwlpdnR2X3VkbWFfZ2V0X3BhZ2VfaW5mbyAoJnV2X2RtYSwgKHVuc2lnbmVkIGxvbmcpYXJncy0+dXZfc291cmNlLCAzNjAgKiB1dl9kZWNvZGVfaGVpZ2h0KTsKKworCS8qIEdldCB1c2VyIHBhZ2VzIGZvciBETUEgWGZlciAqLworCWRvd25fcmVhZCgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKwl5X3BhZ2VzID0gZ2V0X3VzZXJfcGFnZXMoY3VycmVudCwgY3VycmVudC0+bW0sIHlfZG1hLnVhZGRyLCB5X2RtYS5wYWdlX2NvdW50LCAwLCAxLCAmZG1hLT5tYXBbMF0sIE5VTEwpOworCXV2X3BhZ2VzID0gZ2V0X3VzZXJfcGFnZXMoY3VycmVudCwgY3VycmVudC0+bW0sIHV2X2RtYS51YWRkciwgdXZfZG1hLnBhZ2VfY291bnQsIDAsIDEsICZkbWEtPm1hcFt5X3BhZ2VzXSwgTlVMTCk7CisJdXBfcmVhZCgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKworCWRtYS0+cGFnZV9jb3VudCA9IHlfZG1hLnBhZ2VfY291bnQgKyB1dl9kbWEucGFnZV9jb3VudDsKKworCWlmICh5X3BhZ2VzICsgdXZfcGFnZXMgIT0gZG1hLT5wYWdlX2NvdW50KSB7CisJCUlWVFZfREVCVUdfV0FSTigiZmFpbGVkIHRvIG1hcCB1c2VyIHBhZ2VzLCByZXR1cm5lZCAlZCBpbnN0ZWFkIG9mICVkXG4iLAorCQkJCXlfcGFnZXMgKyB1dl9wYWdlcywgZG1hLT5wYWdlX2NvdW50KTsKKworCQlmb3IgKGkgPSAwOyBpIDwgZG1hLT5wYWdlX2NvdW50OyBpKyspIHsKKwkJCXB1dF9wYWdlKGRtYS0+bWFwW2ldKTsKKwkJfQorCQlkbWEtPnBhZ2VfY291bnQgPSAwOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBGaWxsICYgbWFwIFNHIExpc3QgKi8KKwlpdnR2X3VkbWFfZmlsbF9zZ19saXN0IChkbWEsICZ1dl9kbWEsIGl2dHZfdWRtYV9maWxsX3NnX2xpc3QgKGRtYSwgJnlfZG1hLCAwKSk7CisJZG1hLT5TR19sZW5ndGggPSBwY2lfbWFwX3NnKGl0di0+ZGV2LCBkbWEtPlNHbGlzdCwgZG1hLT5wYWdlX2NvdW50LCBQQ0lfRE1BX1RPREVWSUNFKTsKKworCS8qIEZpbGwgU0cgQXJyYXkgd2l0aCBuZXcgdmFsdWVzICovCisJaXZ0dl91ZG1hX2ZpbGxfc2dfYXJyYXkgKGRtYSwgeV9idWZmZXJfb2Zmc2V0LCB1dl9idWZmZXJfb2Zmc2V0LCB5X3NpemUpOworCisJLyogSWYgd2UndmUgb2Zmc2V0IHRoZSB5IHBsYW5lLCBlbnN1cmUgdG9wIGFyZWEgaXMgYmxhbmtlZCAqLworCWlmIChhcmdzLT5zcmMuaGVpZ2h0ICsgYXJncy0+c3JjLnRvcCA8IDUxMi0xNikgeworCQlpZiAoaXR2LT55dXZfaW5mby5ibGFua2luZ19kbWFwdHIpIHsKKwkJCWRtYS0+U0dhcnJheVtkbWEtPlNHX2xlbmd0aF0uc2l6ZSA9IGNwdV90b19sZTMyKDcyMCoxNik7CisJCQlkbWEtPlNHYXJyYXlbZG1hLT5TR19sZW5ndGhdLnNyYyA9IGNwdV90b19sZTMyKGl0di0+eXV2X2luZm8uYmxhbmtpbmdfZG1hcHRyKTsKKwkJCWRtYS0+U0dhcnJheVtkbWEtPlNHX2xlbmd0aF0uZHN0ID0gY3B1X3RvX2xlMzIoSVZUVl9ERUNfTUVNX1NUQVJUICsgeXV2X29mZnNldFtmcmFtZV0pOworCQkJZG1hLT5TR19sZW5ndGgrKzsKKwkJfQorCX0KKworCS8qIFRhZyBTRyBBcnJheSB3aXRoIEludGVycnVwdCBCaXQgKi8KKwlkbWEtPlNHYXJyYXlbZG1hLT5TR19sZW5ndGggLSAxXS5zaXplIHw9IGNwdV90b19sZTMyKDB4ODAwMDAwMDApOworCisJaXZ0dl91ZG1hX3N5bmNfZm9yX2RldmljZShpdHYpOworCXJldHVybiAwOworfQorCisvKiBXZSByZWx5IG9uIGEgdGFibGUgaGVsZCBpbiB0aGUgZmlybXdhcmUgLSBRdWljayBjaGVjay4gKi8KK2ludCBpdnR2X3l1dl9maWx0ZXJfY2hlY2soc3RydWN0IGl2dHYgKml0dikKK3sKKwlpbnQgaSwgb2Zmc2V0X3ksIG9mZnNldF91djsKKworCWZvciAoaT0wLCBvZmZzZXRfeSA9IDE2LCBvZmZzZXRfdXYgPSA0OyBpPDE2OyBpKyssIG9mZnNldF95ICs9IDI0LCBvZmZzZXRfdXYgKz0gMTIpIHsKKwkJaWYgKChyZWFkX2RlYyhJVlRWX1lVVl9IT1JJWk9OVEFMX0ZJTFRFUl9PRkZTRVQgKyBvZmZzZXRfeSkgIT0gaSA8PCAxNikgfHwKKwkJICAgIChyZWFkX2RlYyhJVlRWX1lVVl9WRVJUSUNBTF9GSUxURVJfT0ZGU0VUICsgb2Zmc2V0X3V2KSAhPSBpIDw8IDE2KSkgeworCQkJSVZUVl9XQVJOICgiWVVWIGZpbHRlciB0YWJsZSBub3QgZm91bmQgaW4gZmlybXdhcmUuXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaXZ0dl95dXZfZmlsdGVyKHN0cnVjdCBpdnR2ICppdHYsIGludCBoX2ZpbHRlciwgaW50IHZfZmlsdGVyXzEsIGludCB2X2ZpbHRlcl8yKQoreworCWludCBmaWx0ZXJfaW5kZXgsIGZpbHRlcl9saW5lOworCisJLyogSWYgYW55IGZpbHRlciBpcyAtMSwgdGhlbiBkb24ndCB1cGRhdGUgaXQgKi8KKwlpZiAoaF9maWx0ZXIgPiAtMSkgeworCQlpZiAoaF9maWx0ZXIgPiA0KSBoX2ZpbHRlciA9IDQ7CisJCWZpbHRlcl9pbmRleCA9IGhfZmlsdGVyICogMzg0OworCQlmaWx0ZXJfbGluZSA9IDA7CisJCXdoaWxlIChmaWx0ZXJfbGluZSA8IDE2KSB7CisJCQl3cml0ZV9yZWcocmVhZF9kZWMoSVZUVl9ZVVZfSE9SSVpPTlRBTF9GSUxURVJfT0ZGU0VUICsgZmlsdGVyX2luZGV4KSwgMHgwMjgwNCk7CisJCQl3cml0ZV9yZWcocmVhZF9kZWMoSVZUVl9ZVVZfSE9SSVpPTlRBTF9GSUxURVJfT0ZGU0VUICsgZmlsdGVyX2luZGV4KSwgMHgwMjgxYyk7CisJCQlmaWx0ZXJfaW5kZXggKz0gNDsKKwkJCXdyaXRlX3JlZyhyZWFkX2RlYyhJVlRWX1lVVl9IT1JJWk9OVEFMX0ZJTFRFUl9PRkZTRVQgKyBmaWx0ZXJfaW5kZXgpLCAweDAyODA4KTsKKwkJCXdyaXRlX3JlZyhyZWFkX2RlYyhJVlRWX1lVVl9IT1JJWk9OVEFMX0ZJTFRFUl9PRkZTRVQgKyBmaWx0ZXJfaW5kZXgpLCAweDAyODIwKTsKKwkJCWZpbHRlcl9pbmRleCArPSA0OworCQkJd3JpdGVfcmVnKHJlYWRfZGVjKElWVFZfWVVWX0hPUklaT05UQUxfRklMVEVSX09GRlNFVCArIGZpbHRlcl9pbmRleCksIDB4MDI4MGMpOworCQkJd3JpdGVfcmVnKHJlYWRfZGVjKElWVFZfWVVWX0hPUklaT05UQUxfRklMVEVSX09GRlNFVCArIGZpbHRlcl9pbmRleCksIDB4MDI4MjQpOworCQkJZmlsdGVyX2luZGV4ICs9IDQ7CisJCQl3cml0ZV9yZWcocmVhZF9kZWMoSVZUVl9ZVVZfSE9SSVpPTlRBTF9GSUxURVJfT0ZGU0VUICsgZmlsdGVyX2luZGV4KSwgMHgwMjgxMCk7CisJCQl3cml0ZV9yZWcocmVhZF9kZWMoSVZUVl9ZVVZfSE9SSVpPTlRBTF9GSUxURVJfT0ZGU0VUICsgZmlsdGVyX2luZGV4KSwgMHgwMjgyOCk7CisJCQlmaWx0ZXJfaW5kZXggKz0gNDsKKwkJCXdyaXRlX3JlZyhyZWFkX2RlYyhJVlRWX1lVVl9IT1JJWk9OVEFMX0ZJTFRFUl9PRkZTRVQgKyBmaWx0ZXJfaW5kZXgpLCAweDAyODE0KTsKKwkJCXdyaXRlX3JlZyhyZWFkX2RlYyhJVlRWX1lVVl9IT1JJWk9OVEFMX0ZJTFRFUl9PRkZTRVQgKyBmaWx0ZXJfaW5kZXgpLCAweDAyODJjKTsKKwkJCWZpbHRlcl9pbmRleCArPSA4OworCQkJd3JpdGVfcmVnKDAsIDB4MDI4MTgpOworCQkJd3JpdGVfcmVnKDAsIDB4MDI4MzApOworCQkJZmlsdGVyX2xpbmUgKys7CisJCX0KKwkJSVZUVl9ERUJVR19ZVVYoImhfZmlsdGVyIC0+ICVkXG4iLGhfZmlsdGVyKTsKKwl9CisKKwlpZiAodl9maWx0ZXJfMSA+IC0xKSB7CisJCWlmICh2X2ZpbHRlcl8xID4gNCkgdl9maWx0ZXJfMSA9IDQ7CisJCWZpbHRlcl9pbmRleCA9IHZfZmlsdGVyXzEgKiAxOTI7CisJCWZpbHRlcl9saW5lID0gMDsKKwkJd2hpbGUgKGZpbHRlcl9saW5lIDwgMTYpIHsKKwkJCXdyaXRlX3JlZyhyZWFkX2RlYyhJVlRWX1lVVl9WRVJUSUNBTF9GSUxURVJfT0ZGU0VUICsgZmlsdGVyX2luZGV4KSwgMHgwMjkwMCk7CisJCQlmaWx0ZXJfaW5kZXggKz0gNDsKKwkJCXdyaXRlX3JlZyhyZWFkX2RlYyhJVlRWX1lVVl9WRVJUSUNBTF9GSUxURVJfT0ZGU0VUICsgZmlsdGVyX2luZGV4KSwgMHgwMjkwNCk7CisJCQlmaWx0ZXJfaW5kZXggKz0gODsKKwkJCXdyaXRlX3JlZygwLCAweDAyOTA4KTsKKwkJCWZpbHRlcl9saW5lICsrOworCQl9CisJCUlWVFZfREVCVUdfWVVWKCJ2X2ZpbHRlcl8xIC0+ICVkXG4iLHZfZmlsdGVyXzEpOworCX0KKworCWlmICh2X2ZpbHRlcl8yID4gLTEpIHsKKwkJaWYgKHZfZmlsdGVyXzIgPiA0KSB2X2ZpbHRlcl8yID0gNDsKKwkJZmlsdGVyX2luZGV4ID0gdl9maWx0ZXJfMiAqIDE5MjsKKwkJZmlsdGVyX2xpbmUgPSAwOworCQl3aGlsZSAoZmlsdGVyX2xpbmUgPCAxNikgeworCQkJd3JpdGVfcmVnKHJlYWRfZGVjKElWVFZfWVVWX1ZFUlRJQ0FMX0ZJTFRFUl9PRkZTRVQgKyBmaWx0ZXJfaW5kZXgpLCAweDAyOTBjKTsKKwkJCWZpbHRlcl9pbmRleCArPSA0OworCQkJd3JpdGVfcmVnKHJlYWRfZGVjKElWVFZfWVVWX1ZFUlRJQ0FMX0ZJTFRFUl9PRkZTRVQgKyBmaWx0ZXJfaW5kZXgpLCAweDAyOTEwKTsKKwkJCWZpbHRlcl9pbmRleCArPSA4OworCQkJd3JpdGVfcmVnKDAsIDB4MDI5MTQpOworCQkJZmlsdGVyX2xpbmUgKys7CisJCX0KKwkJSVZUVl9ERUJVR19ZVVYoInZfZmlsdGVyXzIgLT4gJWRcbiIsdl9maWx0ZXJfMik7CisJfQorfQorCitzdGF0aWMgdm9pZCBpdnR2X3l1dl9oYW5kbGVfaG9yaXpvbnRhbChzdHJ1Y3QgaXZ0diAqaXR2LCBzdHJ1Y3QgeXV2X2ZyYW1lX2luZm8gKndpbmRvdykKK3sKKwl1MzIgcmVnXzI4MzQsIHJlZ18yODM4LCByZWdfMjgzYzsKKwl1MzIgcmVnXzI4NDQsIHJlZ18yODU0LCByZWdfMjg1YzsKKwl1MzIgcmVnXzI4NjQsIHJlZ18yODc0LCByZWdfMjg5MDsKKwl1MzIgcmVnXzI4NzAsIHJlZ18yODcwX2Jhc2UsIHJlZ18yODcwX29mZnNldDsKKwlpbnQgeF9jdXRvZmY7CisJaW50IGhfZmlsdGVyOworCXUzMiBtYXN0ZXJfd2lkdGg7CisKKwlJVlRWX0RFQlVHX1dBUk4oICJOZWVkIHRvIGFkanVzdCB0byB3aWR0aCAlZCBzcmNfdyAlZCBkc3RfdyAlZCBzcmNfeCAlZCBkc3RfeCAlZFxuIiwKKwkJCSB3aW5kb3ctPnRydV93LCB3aW5kb3ctPnNyY193LCB3aW5kb3ctPmRzdF93LHdpbmRvdy0+c3JjX3gsIHdpbmRvdy0+ZHN0X3gpOworCisJLyogSG93IHdpZGUgaXMgdGhlIHNyYyBpbWFnZSAqLworCXhfY3V0b2ZmICA9IHdpbmRvdy0+c3JjX3cgKyB3aW5kb3ctPnNyY194OworCisJLyogU2V0IHRoZSBkaXNwbGF5IHdpZHRoICovCisJcmVnXzI4MzQgPSB3aW5kb3ctPmRzdF93OworCXJlZ18yODM4ID0gcmVnXzI4MzQ7CisKKwkvKiBTZXQgdGhlIGRpc3BsYXkgcG9zaXRpb24gKi8KKwlyZWdfMjg5MCA9IHdpbmRvdy0+ZHN0X3g7CisKKwkvKiBJbmRleCBpbnRvIHRoZSBpbWFnZSBob3Jpem9udGFsbHkgKi8KKwlyZWdfMjg3MCA9IDA7CisKKwkvKiAyODcwIGlzIG5vcm1hbGx5IGZ1ZGdlZCB0byBhbGlnbiB2aWRlbyBjb29yZHMgd2l0aCBvc2QgY29vcmRzLgorCSAgIElmIHJ1bm5pbmcgZnVsbCBzY3JlZW4sIGl0IGNhdXNlcyBhbiB1bndhbnRlZCBsZWZ0IHNoaWZ0CisJICAgUmVtb3ZlIHRoZSBmdWRnZSBpZiB3ZSBhbG1vc3QgZmlsbCB0aGUgc2NyZWVuLgorCSAgIEdyYWR1YWxseSBhZGp1c3QgdGhlIG9mZnNldCB0byBhdm9pZCB0aGUgdmlkZW8gJ3NuYXBwaW5nJworCSAgIGxlZnQvcmlnaHQgaWYgaXQgZ2V0cyBkcmFnZ2VkIHRocm91Z2ggdGhpcyByZWdpb24uCisJICAgT25seSBkbyB0aGlzIGlmIG9zZCBpcyBmdWxsIHdpZHRoLiAqLworCWlmICh3aW5kb3ctPnZpc193ID09IDcyMCkgeworCQlpZiAoKHdpbmRvdy0+dHJ1X3ggLSB3aW5kb3ctPnBhbl94ID4gLTEpICYmICh3aW5kb3ctPnRydV94IC0gd2luZG93LT5wYW5feCA8PSA0MCkgJiYgKHdpbmRvdy0+ZHN0X3cgPj0gNjgwKSl7CisJCQlyZWdfMjg3MCA9IDEwIC0gKHdpbmRvdy0+dHJ1X3ggLSB3aW5kb3ctPnBhbl94KSAvIDQ7CisJCX0KKwkJZWxzZSBpZiAoKHdpbmRvdy0+dHJ1X3ggLSB3aW5kb3ctPnBhbl94IDwgMCkgJiYgKHdpbmRvdy0+dHJ1X3ggLSB3aW5kb3ctPnBhbl94ID49IC0yMCkgJiYgKHdpbmRvdy0+ZHN0X3cgPj0gNjYwKSkgeworCQkJcmVnXzI4NzAgPSAoMTAgKyAod2luZG93LT50cnVfeCAtIHdpbmRvdy0+cGFuX3gpIC8gMik7CisJCX0KKworCQlpZiAod2luZG93LT5kc3RfdyA+PSB3aW5kb3ctPnNyY193KQorCQkJcmVnXzI4NzAgPSByZWdfMjg3MCA8PCAxNiB8IHJlZ18yODcwOworCQllbHNlCisJCQlyZWdfMjg3MCA9ICgocmVnXzI4NzAgJiB+MSkgPDwgMTUpIHwgKHJlZ18yODcwICYgfjEpOworCX0KKworCWlmICh3aW5kb3ctPmRzdF93IDwgd2luZG93LT5zcmNfdykKKwkJcmVnXzI4NzAgPSAweDAwMGQwMDBlIC0gcmVnXzI4NzA7CisJZWxzZQorCQlyZWdfMjg3MCA9IDB4MDAxMjAwMGUgLSByZWdfMjg3MDsKKworCS8qIFdlJ3JlIGFsc28gdXNpbmcgMjg3MCB0byBzaGlmdCB0aGUgaW1hZ2UgbGVmdCAoc3JjX3ggJiBuZWdhdGl2ZSBkc3RfeCkgKi8KKwlyZWdfMjg3MF9vZmZzZXQgPSAod2luZG93LT5zcmNfeCooKHdpbmRvdy0+ZHN0X3cgPDwgMjEpL3dpbmRvdy0+c3JjX3cpKT4+MTk7CisKKwlpZiAod2luZG93LT5kc3RfdyA+PSB3aW5kb3ctPnNyY193KSB7CisJCXhfY3V0b2ZmICY9IH4xOworCQltYXN0ZXJfd2lkdGggPSAod2luZG93LT5zcmNfdyAqIDB4MDAyMDAwMDApIC8gKHdpbmRvdy0+ZHN0X3cpOworCQlpZiAobWFzdGVyX3dpZHRoICogd2luZG93LT5kc3RfdyAhPSB3aW5kb3ctPnNyY193ICogMHgwMDIwMDAwMCkgbWFzdGVyX3dpZHRoICsrOworCQlyZWdfMjgzNCA9IChyZWdfMjgzNCA8PCAxNikgfCB4X2N1dG9mZjsKKwkJcmVnXzI4MzggPSAocmVnXzI4MzggPDwgMTYpIHwgeF9jdXRvZmY7CisJCXJlZ18yODNjID0gbWFzdGVyX3dpZHRoID4+IDI7CisJCXJlZ18yODQ0ID0gbWFzdGVyX3dpZHRoID4+IDI7CisJCXJlZ18yODU0ID0gbWFzdGVyX3dpZHRoOworCQlyZWdfMjg1YyA9IG1hc3Rlcl93aWR0aCA+PiAxOworCQlyZWdfMjg2NCA9IG1hc3Rlcl93aWR0aCA+PiAxOworCisJCS8qIFdlIGFsc28gbmVlZCB0byBmYWN0b3IgaW4gdGhlIHNjYWxpbmcKKwkJICAgKHNyY193IC0gZHN0X3cpIC8gKHNyY193IC8gNCkgKi8KKwkJaWYgKHdpbmRvdy0+ZHN0X3cgPiB3aW5kb3ctPnNyY193KQorCQkJcmVnXzI4NzBfYmFzZSA9ICgod2luZG93LT5kc3RfdyAtIHdpbmRvdy0+c3JjX3cpPDwxNikgLyAod2luZG93LT5zcmNfdyA8PDE0KTsKKwkJZWxzZQorCQkJcmVnXzI4NzBfYmFzZSA9IDA7CisKKwkJcmVnXzI4NzAgKz0gKCgocmVnXzI4NzBfb2Zmc2V0IDw8IDE0KSAmIDB4RkZGRjAwMDApIHwgcmVnXzI4NzBfb2Zmc2V0ID4+IDIpICsgKHJlZ18yODcwX2Jhc2UgPDwgMTcgfCByZWdfMjg3MF9iYXNlKTsKKwkJcmVnXzI4NzQgPSAwOworCX0KKwllbHNlIGlmICh3aW5kb3ctPmRzdF93IDwgd2luZG93LT5zcmNfdyAvIDIpIHsKKwkJbWFzdGVyX3dpZHRoID0gKHdpbmRvdy0+c3JjX3cgKiAweDAwMDgwMDAwKSAvIHdpbmRvdy0+ZHN0X3c7CisJCWlmIChtYXN0ZXJfd2lkdGggKiB3aW5kb3ctPmRzdF93ICE9IHdpbmRvdy0+c3JjX3cgKiAweDAwMDgwMDAwKSBtYXN0ZXJfd2lkdGggKys7CisJCXJlZ18yODM0ID0gKHJlZ18yODM0IDw8IDE2KSB8IHhfY3V0b2ZmOworCQlyZWdfMjgzOCA9IChyZWdfMjgzOCA8PCAxNikgfCB4X2N1dG9mZjsKKwkJcmVnXzI4M2MgPSBtYXN0ZXJfd2lkdGggPj4gMjsKKwkJcmVnXzI4NDQgPSBtYXN0ZXJfd2lkdGggPj4gMTsKKwkJcmVnXzI4NTQgPSBtYXN0ZXJfd2lkdGg7CisJCXJlZ18yODVjID0gbWFzdGVyX3dpZHRoID4+IDE7CisJCXJlZ18yODY0ID0gbWFzdGVyX3dpZHRoID4+IDE7CisJCXJlZ18yODcwICs9ICgoKHJlZ18yODcwX29mZnNldCA8PCAxNSkgJiAweEZGRkYwMDAwKSB8IHJlZ18yODcwX29mZnNldCk7CisJCXJlZ18yODcwICs9ICg1IC0gKCgod2luZG93LT5zcmNfdyArIHdpbmRvdy0+c3JjX3cgLyAyKSAtIDEpIC8gd2luZG93LT5kc3RfdykpIDw8IDE2OworCQlyZWdfMjg3NCA9IDB4MDAwMDAwMTI7CisJfQorCWVsc2UgeworCQltYXN0ZXJfd2lkdGggPSAod2luZG93LT5zcmNfdyAqIDB4MDAxMDAwMDApIC8gd2luZG93LT5kc3RfdzsKKwkJaWYgKG1hc3Rlcl93aWR0aCAqIHdpbmRvdy0+ZHN0X3cgIT0gd2luZG93LT5zcmNfdyAqIDB4MDAxMDAwMDApIG1hc3Rlcl93aWR0aCArKzsKKwkJcmVnXzI4MzQgPSAocmVnXzI4MzQgPDwgMTYpIHwgeF9jdXRvZmY7CisJCXJlZ18yODM4ID0gKHJlZ18yODM4IDw8IDE2KSB8IHhfY3V0b2ZmOworCQlyZWdfMjgzYyA9IG1hc3Rlcl93aWR0aCA+PiAyOworCQlyZWdfMjg0NCA9IG1hc3Rlcl93aWR0aCA+PiAxOworCQlyZWdfMjg1NCA9IG1hc3Rlcl93aWR0aDsKKwkJcmVnXzI4NWMgPSBtYXN0ZXJfd2lkdGggPj4gMTsKKwkJcmVnXzI4NjQgPSBtYXN0ZXJfd2lkdGggPj4gMTsKKwkJcmVnXzI4NzAgKz0gKCgocmVnXzI4NzBfb2Zmc2V0IDw8IDE0KSAmIDB4RkZGRjAwMDApIHwgcmVnXzI4NzBfb2Zmc2V0ID4+IDEpOworCQlyZWdfMjg3MCArPSAoNSAtICgoKHdpbmRvdy0+c3JjX3cgKiAzKSAtIDEpIC8gd2luZG93LT5kc3RfdykpIDw8IDE2OworCQlyZWdfMjg3NCA9IDB4MDAwMDAwMDE7CisJfQorCisJLyogU2VsZWN0IHRoZSBob3Jpem9udGFsIGZpbHRlciAqLworCWlmICh3aW5kb3ctPnNyY193ID09IHdpbmRvdy0+ZHN0X3cpIHsKKwkJLyogQW4gZXhhY3Qgc2l6ZSBtYXRjaCB1c2VzIGZpbHRlciAwICovCisJCWhfZmlsdGVyID0gMDsKKwl9CisJZWxzZSB7CisJCS8qIEZpZ3VyZSBvdXQgd2hpY2ggZmlsdGVyIHRvIHVzZSAqLworCQloX2ZpbHRlciA9ICgod2luZG93LT5zcmNfdyA8PCAxNikgLyB3aW5kb3ctPmRzdF93KSA+PiAxNTsKKwkJaF9maWx0ZXIgPSAoaF9maWx0ZXIgPj4gMSkgKyAoaF9maWx0ZXIgJiAxKTsKKwkJLyogT25seSBhbiBleGFjdCBzaXplIG1hdGNoIGNhbiB1c2UgZmlsdGVyIDAgKi8KKwkJaWYgKGhfZmlsdGVyID09IDApIGhfZmlsdGVyID0gMTsKKwl9CisKKwl3cml0ZV9yZWcocmVnXzI4MzQsIDB4MDI4MzQpOworCXdyaXRlX3JlZyhyZWdfMjgzOCwgMHgwMjgzOCk7CisJSVZUVl9ERUJVR19ZVVYoIlVwZGF0ZSByZWcgMHgyODM0ICUwOHgtPiUwOHggMHgyODM4ICUwOHgtPiUwOHhcbiIsaXR2LT55dXZfaW5mby5yZWdfMjgzNCwgcmVnXzI4MzQsIGl0di0+eXV2X2luZm8ucmVnXzI4MzgsIHJlZ18yODM4KTsKKworCXdyaXRlX3JlZyhyZWdfMjgzYywgMHgwMjgzYyk7CisJd3JpdGVfcmVnKHJlZ18yODQ0LCAweDAyODQ0KTsKKworCUlWVFZfREVCVUdfWVVWKCJVcGRhdGUgcmVnIDB4MjgzYyAlMDh4LT4lMDh4IDB4Mjg0NCAlMDh4LT4lMDh4XG4iLGl0di0+eXV2X2luZm8ucmVnXzI4M2MsIHJlZ18yODNjLCBpdHYtPnl1dl9pbmZvLnJlZ18yODQ0LCByZWdfMjg0NCk7CisKKwl3cml0ZV9yZWcoMHgwMDA4MDUxNCwgMHgwMjg0MCk7CisJd3JpdGVfcmVnKDB4MDAxMDA1MTQsIDB4MDI4NDgpOworCUlWVFZfREVCVUdfWVVWKCJVcGRhdGUgcmVnIDB4Mjg0MCAlMDh4LT4lMDh4IDB4Mjg0OCAlMDh4LT4lMDh4XG4iLGl0di0+eXV2X2luZm8ucmVnXzI4NDAsIDB4MDAwODA1MTQsIGl0di0+eXV2X2luZm8ucmVnXzI4NDgsIDB4MDAxMDA1MTQpOworCisJd3JpdGVfcmVnKHJlZ18yODU0LCAweDAyODU0KTsKKwlJVlRWX0RFQlVHX1lVVigiVXBkYXRlIHJlZyAweDI4NTQgJTA4eC0+JTA4eCBcbiIsaXR2LT55dXZfaW5mby5yZWdfMjg1NCwgcmVnXzI4NTQpOworCisJd3JpdGVfcmVnKHJlZ18yODVjLCAweDAyODVjKTsKKwl3cml0ZV9yZWcocmVnXzI4NjQsIDB4MDI4NjQpOworCUlWVFZfREVCVUdfWVVWKCJVcGRhdGUgcmVnIDB4Mjg1YyAlMDh4LT4lMDh4IDB4Mjg2NCAlMDh4LT4lMDh4XG4iLGl0di0+eXV2X2luZm8ucmVnXzI4NWMsIHJlZ18yODVjLCBpdHYtPnl1dl9pbmZvLnJlZ18yODY0LCByZWdfMjg2NCk7CisKKwl3cml0ZV9yZWcocmVnXzI4NzQsIDB4MDI4NzQpOworCUlWVFZfREVCVUdfWVVWKCJVcGRhdGUgcmVnIDB4Mjg3NCAlMDh4LT4lMDh4XG4iLGl0di0+eXV2X2luZm8ucmVnXzI4NzQsIHJlZ18yODc0KTsKKworCXdyaXRlX3JlZyhyZWdfMjg3MCwgMHgwMjg3MCk7CisJSVZUVl9ERUJVR19ZVVYoIlVwZGF0ZSByZWcgMHgyODcwICUwOHgtPiUwOHhcbiIsaXR2LT55dXZfaW5mby5yZWdfMjg3MCwgcmVnXzI4NzApOworCisJd3JpdGVfcmVnKCByZWdfMjg5MCwweDAyODkwKTsKKwlJVlRWX0RFQlVHX1lVVigiVXBkYXRlIHJlZyAweDI4OTAgJTA4eC0+JTA4eFxuIixpdHYtPnl1dl9pbmZvLnJlZ18yODkwLCByZWdfMjg5MCk7CisKKwkvKiBPbmx5IHVwZGF0ZSB0aGUgZmlsdGVyIGlmIHdlIHJlYWxseSBuZWVkIHRvICovCisJaWYgKGhfZmlsdGVyICE9IGl0di0+eXV2X2luZm8uaF9maWx0ZXIpIHsKKwkJaXZ0dl95dXZfZmlsdGVyIChpdHYsaF9maWx0ZXIsLTEsLTEpOworCQlpdHYtPnl1dl9pbmZvLmhfZmlsdGVyID0gaF9maWx0ZXI7CisJfQorfQorCitzdGF0aWMgdm9pZCBpdnR2X3l1dl9oYW5kbGVfdmVydGljYWwoc3RydWN0IGl2dHYgKml0diwgc3RydWN0IHl1dl9mcmFtZV9pbmZvICp3aW5kb3cpCit7CisJdTMyIG1hc3Rlcl9oZWlnaHQ7CisJdTMyIHJlZ18yOTE4LCByZWdfMjkxYywgcmVnXzI5MjAsIHJlZ18yOTI4OworCXUzMiByZWdfMjkzMCwgcmVnXzI5MzQsIHJlZ18yOTNjOworCXUzMiByZWdfMjk0MCwgcmVnXzI5NDQsIHJlZ18yOTRjOworCXUzMiByZWdfMjk1MCwgcmVnXzI5NTQsIHJlZ18yOTU4LCByZWdfMjk1YzsKKwl1MzIgcmVnXzI5NjAsIHJlZ18yOTY0LCByZWdfMjk2OCwgcmVnXzI5NmM7CisJdTMyIHJlZ18yODljOworCXUzMiBzcmNfeV9tYWpvcl95LCBzcmNfeV9taW5vcl95OworCXUzMiBzcmNfeV9tYWpvcl91diwgc3JjX3lfbWlub3JfdXY7CisJdTMyIHJlZ18yOTY0X2Jhc2UsIHJlZ18yOTY4X2Jhc2U7CisJaW50IHZfZmlsdGVyXzEsIHZfZmlsdGVyXzI7CisKKwlJVlRWX0RFQlVHX1dBUk4oIk5lZWQgdG8gYWRqdXN0IHRvIGhlaWdodCAlZCBzcmNfaCAlZCBkc3RfaCAlZCBzcmNfeSAlZCBkc3RfeSAlZFxuIiwKKwkJd2luZG93LT50cnVfaCwgd2luZG93LT5zcmNfaCwgd2luZG93LT5kc3RfaCx3aW5kb3ctPnNyY195LCB3aW5kb3ctPmRzdF95KTsKKworCS8qIFdoYXQgc2NhbGluZyBtb2RlIGlzIGJlaW5nIHVzZWQuLi4gKi8KKwlpZiAod2luZG93LT5pbnRlcmxhY2VkX3kpIHsKKwkJSVZUVl9ERUJVR19ZVVYoIlNjYWxpbmcgbW9kZSBZOiBJbnRlcmxhY2VkXG4iKTsKKwl9CisJZWxzZSB7CisJCUlWVFZfREVCVUdfWVVWKCJTY2FsaW5nIG1vZGUgWTogUHJvZ3Jlc3NpdmVcbiIpOworCX0KKworCWlmICh3aW5kb3ctPmludGVybGFjZWRfdXYpIHsKKwkJSVZUVl9ERUJVR19ZVVYoIlNjYWxpbmcgbW9kZSBVVjogSW50ZXJsYWNlZFxuIik7CisJfQorCWVsc2UgeworCQlJVlRWX0RFQlVHX1lVVigiU2NhbGluZyBtb2RlIFVWOiBQcm9ncmVzc2l2ZVxuIik7CisJfQorCisJLyogV2hhdCBpcyB0aGUgc291cmNlIHZpZGVvIGJlaW5nIHRyZWF0ZWQgYXMuLi4gKi8KKwlpZiAoaXR2LT55dXZfaW5mby5mcmFtZV9pbnRlcmxhY2VkKSB7CisJCUlWVFZfREVCVUdfV0FSTigiU291cmNlIHZpZGVvOiBJbnRlcmxhY2VkXG4iKTsKKwl9CisJZWxzZSB7CisJCUlWVFZfREVCVUdfV0FSTigiU291cmNlIHZpZGVvOiBOb24taW50ZXJsYWNlZFxuIik7CisJfQorCisJLyogV2Ugb2Zmc2V0IGludG8gdGhlIGltYWdlIHVzaW5nIHR3byBkaWZmZXJlbnQgaW5kZXggbWV0aG9kcywgc28gc3BsaXQKKwkgICB0aGUgeSBzb3VyY2UgY29vcmQgaW50byB0d28gcGFydHMuICovCisJaWYgKHdpbmRvdy0+c3JjX3kgPCA4KSB7CisJCXNyY195X21pbm9yX3V2ID0gd2luZG93LT5zcmNfeTsKKwkJc3JjX3lfbWFqb3JfdXYgPSAwOworCX0KKwllbHNlIHsKKwkJc3JjX3lfbWlub3JfdXYgPSA4OworCQlzcmNfeV9tYWpvcl91diA9IHdpbmRvdy0+c3JjX3kgLSA4OworCX0KKworCXNyY195X21pbm9yX3kgPSBzcmNfeV9taW5vcl91djsKKwlzcmNfeV9tYWpvcl95ID0gc3JjX3lfbWFqb3JfdXY7CisKKwlpZiAod2luZG93LT5vZmZzZXRfeSkgc3JjX3lfbWlub3JfeSArPSAxNjsKKworCWlmICh3aW5kb3ctPmludGVybGFjZWRfeSkKKwkJcmVnXzI5MTggPSAod2luZG93LT5kc3RfaCA8PCAxNikgfCAod2luZG93LT5zcmNfaCArIHNyY195X21pbm9yX3kpOworCWVsc2UKKwkJcmVnXzI5MTggPSAod2luZG93LT5kc3RfaCA8PCAxNikgfCAoKHdpbmRvdy0+c3JjX2ggKyBzcmNfeV9taW5vcl95KSA8PCAxKTsKKworCWlmICh3aW5kb3ctPmludGVybGFjZWRfdXYpCisJCXJlZ18yOTFjID0gKHdpbmRvdy0+ZHN0X2ggPDwgMTYpIHwgKCh3aW5kb3ctPnNyY19oICsgc3JjX3lfbWlub3JfdXYpID4+IDEpOworCWVsc2UKKwkJcmVnXzI5MWMgPSAod2luZG93LT5kc3RfaCA8PCAxNikgfCAod2luZG93LT5zcmNfaCArIHNyY195X21pbm9yX3V2KTsKKworCXJlZ18yOTY0X2Jhc2UgPSAoc3JjX3lfbWlub3JfeSAqICgod2luZG93LT5kc3RfaCA8PCAxNikvd2luZG93LT5zcmNfaCkpID4+IDE0OworCXJlZ18yOTY4X2Jhc2UgPSAoc3JjX3lfbWlub3JfdXYgKiAoKHdpbmRvdy0+ZHN0X2ggPDwgMTYpL3dpbmRvdy0+c3JjX2gpKSA+PiAxNDsKKworCWlmICh3aW5kb3ctPmRzdF9oIC8gMiA+PSB3aW5kb3ctPnNyY19oICYmICF3aW5kb3ctPmludGVybGFjZWRfeSkgeworCQltYXN0ZXJfaGVpZ2h0ID0gKHdpbmRvdy0+c3JjX2ggKiAweDAwNDAwMDAwKSAvIHdpbmRvdy0+ZHN0X2g7CisJCWlmICgod2luZG93LT5zcmNfaCAqIDB4MDA0MDAwMDApIC0gKG1hc3Rlcl9oZWlnaHQgKiB3aW5kb3ctPmRzdF9oKSA+PSB3aW5kb3ctPmRzdF9oIC8gMikgbWFzdGVyX2hlaWdodCArKzsKKwkJcmVnXzI5MjAgPSBtYXN0ZXJfaGVpZ2h0ID4+IDI7CisJCXJlZ18yOTI4ID0gbWFzdGVyX2hlaWdodCA+PiAzOworCQlyZWdfMjkzMCA9IG1hc3Rlcl9oZWlnaHQ7CisJCXJlZ18yOTQwID0gbWFzdGVyX2hlaWdodCA+PiAxOworCQlyZWdfMjk2NF9iYXNlID4+PSAzOworCQlyZWdfMjk2OF9iYXNlID4+PSAzOworCQlyZWdfMjk2YyA9IDB4MDAwMDAwMDA7CisJfQorCWVsc2UgaWYgKHdpbmRvdy0+ZHN0X2ggPj0gd2luZG93LT5zcmNfaCkgeworCQltYXN0ZXJfaGVpZ2h0ID0gKHdpbmRvdy0+c3JjX2ggKiAweDAwNDAwMDAwKSAvIHdpbmRvdy0+ZHN0X2g7CisJCW1hc3Rlcl9oZWlnaHQgPSAobWFzdGVyX2hlaWdodCA+PiAxKSArIChtYXN0ZXJfaGVpZ2h0ICYgMSk7CisJCXJlZ18yOTIwID0gbWFzdGVyX2hlaWdodCA+PiAyOworCQlyZWdfMjkyOCA9IG1hc3Rlcl9oZWlnaHQgPj4gMjsKKwkJcmVnXzI5MzAgPSBtYXN0ZXJfaGVpZ2h0OworCQlyZWdfMjk0MCA9IG1hc3Rlcl9oZWlnaHQgPj4gMTsKKwkJcmVnXzI5NmMgPSAweDAwMDAwMDAwOworCQlpZiAod2luZG93LT5pbnRlcmxhY2VkX3kpIHsKKwkJCXJlZ18yOTY0X2Jhc2UgPj49IDM7CisJCX0KKwkJZWxzZSB7CisJCQlyZWdfMjk2YyArKzsKKwkJCXJlZ18yOTY0X2Jhc2UgPj49IDI7CisJCX0KKwkJaWYgKHdpbmRvdy0+aW50ZXJsYWNlZF91dikgcmVnXzI5MjggPj49IDE7CisJCXJlZ18yOTY4X2Jhc2UgPj49IDM7CisJfQorCWVsc2UgaWYgKHdpbmRvdy0+ZHN0X2ggPj0gd2luZG93LT5zcmNfaCAvIDIpIHsKKwkJbWFzdGVyX2hlaWdodCA9ICh3aW5kb3ctPnNyY19oICogMHgwMDIwMDAwMCkgLyB3aW5kb3ctPmRzdF9oOworCQltYXN0ZXJfaGVpZ2h0ID0gKG1hc3Rlcl9oZWlnaHQgPj4gMSkgKyAobWFzdGVyX2hlaWdodCAmIDEpOworCQlyZWdfMjkyMCA9IG1hc3Rlcl9oZWlnaHQgPj4gMjsKKwkJcmVnXzI5MjggPSBtYXN0ZXJfaGVpZ2h0ID4+IDI7CisJCXJlZ18yOTMwID0gbWFzdGVyX2hlaWdodDsKKwkJcmVnXzI5NDAgPSBtYXN0ZXJfaGVpZ2h0OworCQlyZWdfMjk2YyA9IDB4MDAwMDAxMDE7CisJCWlmICh3aW5kb3ctPmludGVybGFjZWRfeSkgeworCQkJcmVnXzI5NjRfYmFzZSA+Pj0gMjsKKwkJfQorCQllbHNlIHsKKwkJCXJlZ18yOTZjICsrOworCQkJcmVnXzI5NjRfYmFzZSA+Pj0gMTsKKwkJfQorCQlpZiAod2luZG93LT5pbnRlcmxhY2VkX3V2KSByZWdfMjkyOCA+Pj0gMTsKKwkJcmVnXzI5NjhfYmFzZSA+Pj0gMjsKKwl9CisJZWxzZSB7CisJCW1hc3Rlcl9oZWlnaHQgPSAod2luZG93LT5zcmNfaCAqIDB4MDAxMDAwMDApIC8gd2luZG93LT5kc3RfaDsKKwkJbWFzdGVyX2hlaWdodCA9IChtYXN0ZXJfaGVpZ2h0ID4+IDEpICsgKG1hc3Rlcl9oZWlnaHQgJiAxKTsKKwkJcmVnXzI5MjAgPSBtYXN0ZXJfaGVpZ2h0ID4+IDI7CisJCXJlZ18yOTI4ID0gbWFzdGVyX2hlaWdodCA+PiAyOworCQlyZWdfMjkzMCA9IG1hc3Rlcl9oZWlnaHQ7CisJCXJlZ18yOTQwID0gbWFzdGVyX2hlaWdodDsKKwkJcmVnXzI5NjRfYmFzZSA+Pj0gMTsKKwkJcmVnXzI5NjhfYmFzZSA+Pj0gMjsKKwkJcmVnXzI5NmMgPSAweDAwMDAwMTAyOworCX0KKworCS8qIEZJWE1FIFRoZXNlIHJlZ2lzdGVycyBjaGFuZ2UgZGVwZW5kaW5nIG9uIHNjYWxlZCAvIHVuc2NhbGVkIG91dHB1dAorCSAgIFdlIHJlYWxseSBuZWVkIHRvIHdvcmsgb3V0IHdoYXQgdGhleSBzaG91bGQgYmUgKi8KKwlpZiAod2luZG93LT5zcmNfaCA9PSB3aW5kb3ctPmRzdF9oKXsKKwkJcmVnXzI5MzQgPSAweDAwMDIwMDAwOworCQlyZWdfMjkzYyA9IDB4MDAxMDAwMDA7CisJCXJlZ18yOTQ0ID0gMHgwMDA0MDAwMDsKKwkJcmVnXzI5NGMgPSAweDAwMGIwMDAwOworCX0KKwllbHNlIHsKKwkJcmVnXzI5MzQgPSAweDAwMDAwRkYwOworCQlyZWdfMjkzYyA9IDB4MDAwMDBGRjA7CisJCXJlZ18yOTQ0ID0gMHgwMDAwMEZGMDsKKwkJcmVnXzI5NGMgPSAweDAwMDAwRkYwOworCX0KKworCS8qIFRoZSBmaXJzdCBsaW5lIHRvIGJlIGRpc3BsYXllZCAqLworCXJlZ18yOTUwID0gMHgwMDAxMDAwMCArIHNyY195X21ham9yX3k7CisJaWYgKHdpbmRvdy0+aW50ZXJsYWNlZF95KSByZWdfMjk1MCArPSAweDAwMDEwMDAwOworCXJlZ18yOTU0ID0gcmVnXzI5NTAgKyAxOworCisJcmVnXzI5NTggPSAweDAwMDEwMDAwICsgKHNyY195X21ham9yX3kgPj4gMSk7CisJaWYgKHdpbmRvdy0+aW50ZXJsYWNlZF91dikgcmVnXzI5NTggKz0gMHgwMDAxMDAwMDsKKwlyZWdfMjk1YyA9IHJlZ18yOTU4ICsgMTsKKworCWlmIChpdHYtPnl1dl9pbmZvLmRlY29kZV9oZWlnaHQgPT0gNDgwKQorCQlyZWdfMjg5YyA9IDB4MDExZTAwMTc7CisJZWxzZQorCQlyZWdfMjg5YyA9IDB4MDE1MDAwMTc7CisKKwlpZiAod2luZG93LT5kc3RfeSA8IDApCisJCXJlZ18yODljID0gKHJlZ18yODljIC0gKCh3aW5kb3ctPmRzdF95ICYgfjEpPDwxNSkpLSh3aW5kb3ctPmRzdF95ID4+MSk7CisJZWxzZQorCQlyZWdfMjg5YyA9IChyZWdfMjg5YyArICgod2luZG93LT5kc3RfeSAmIH4xKTw8MTUpKSsod2luZG93LT5kc3RfeSA+PjEpOworCisJLyogSG93IG11Y2ggb2YgdGhlIHNvdXJjZSB0byBkZWNvZGUuCisJICAgVGFrZSBpbnRvIGFjY291bnQgdGhlIHNvdXJjZSBvZmZzZXQgKi8KKwlyZWdfMjk2MCA9ICgoc3JjX3lfbWlub3JfeSArIHdpbmRvdy0+c3JjX2ggKyBzcmNfeV9tYWpvcl95KSAtIDEgKSB8CisJCQkoKCgoc3JjX3lfbWlub3JfdXYgKyB3aW5kb3ctPnNyY19oICsgc3JjX3lfbWFqb3JfdXYpIC0gMSkgJiB+MSkgPDwgMTUpOworCisJLyogQ2FsY3VsYXRlIGNvcnJlY3QgdmFsdWUgZm9yIHJlZ2lzdGVyIDI5NjQgKi8KKwlpZiAod2luZG93LT5zcmNfaCA9PSB3aW5kb3ctPmRzdF9oKQorCQlyZWdfMjk2NCA9IDE7CisJZWxzZSB7CisJCXJlZ18yOTY0ID0gMiArICgod2luZG93LT5kc3RfaCA8PCAxKSAvIHdpbmRvdy0+c3JjX2gpOworCQlyZWdfMjk2NCA9IChyZWdfMjk2NCA+PiAxKSArIChyZWdfMjk2NCAmIDEpOworCX0KKwlyZWdfMjk2OCA9IChyZWdfMjk2NCA8PCAxNikgKyByZWdfMjk2NCArIChyZWdfMjk2NCA+PiAxKTsKKwlyZWdfMjk2NCA9IChyZWdfMjk2NCA8PCAxNikgKyByZWdfMjk2NCArIChyZWdfMjk2NCAqIDQ2IC8gOTQpOworCisJLyogT2theSwgd2UndmUgd2FzdGVkIHRpbWUgd29ya2luZyBvdXQgdGhlIGNvcnJlY3QgdmFsdWUsCisJICAgYnV0IGlmIHdlIHVzZSBpdCwgaXQgZm91bHMgdGhlIHRoZSB3aW5kb3cgYWxpZ25tZW50LgorCSAgIEZ1ZGdlIGl0IHRvIHdoYXQgd2Ugd2FudC4uLiAqLworCXJlZ18yOTY0ID0gMHgwMDAxMDAwMSArICgocmVnXzI5NjQgJiAweDAwMDBGRkZGKSAtIChyZWdfMjk2NCA+PiAxNikpOworCXJlZ18yOTY4ID0gMHgwMDAxMDAwMSArICgocmVnXzI5NjggJiAweDAwMDBGRkZGKSAtIChyZWdfMjk2OCA+PiAxNikpOworCisJLyogRGV2aWF0ZSBmdXJ0aGVyIGZyb20gd2hhdCBpdCBzaG91bGQgYmUuIEkgZmluZCB0aGUgZmxpY2tlciBoZWFkYWNoZQorCSAgIGluZHVjaW5nIHNvIHRyeSB0byByZWR1Y2UgaXQgc2xpZ2h0bHkuIExlYXZlIDI5NjggYXMtaXMgb3RoZXJ3aXNlCisJICAgY29sb3VycyBmb3VsLiAqLworCWlmICgocmVnXzI5NjQgIT0gMHgwMDAxMDAwMSkgJiYgKHdpbmRvdy0+ZHN0X2ggLyAyIDw9IHdpbmRvdy0+c3JjX2gpKQorCQlyZWdfMjk2NCA9IChyZWdfMjk2NCAmIDB4RkZGRjAwMDApICsgKChyZWdfMjk2NCAmIDB4MDAwMEZGRkYpLzIpOworCisJaWYgKCF3aW5kb3ctPmludGVybGFjZWRfeSkgcmVnXzI5NjQgLT0gMHgwMDAxMDAwMTsKKwlpZiAoIXdpbmRvdy0+aW50ZXJsYWNlZF91dikgcmVnXzI5NjggLT0gMHgwMDAxMDAwMTsKKworCXJlZ18yOTY0ICs9ICgocmVnXzI5NjRfYmFzZSA8PCAxNikgfCByZWdfMjk2NF9iYXNlKTsKKwlyZWdfMjk2OCArPSAoKHJlZ18yOTY4X2Jhc2UgPDwgMTYpIHwgcmVnXzI5NjhfYmFzZSk7CisKKwkvKiBTZWxlY3QgdGhlIHZlcnRpY2FsIGZpbHRlciAqLworCWlmICh3aW5kb3ctPnNyY19oID09IHdpbmRvdy0+ZHN0X2gpIHsKKwkJLyogQW4gZXhhY3Qgc2l6ZSBtYXRjaCB1c2VzIGZpbHRlciAwLzEgKi8KKwkJdl9maWx0ZXJfMSA9IDA7CisJCXZfZmlsdGVyXzIgPSAxOworCX0KKwllbHNlIHsKKwkJLyogRmlndXJlIG91dCB3aGljaCBmaWx0ZXIgdG8gdXNlICovCisJCXZfZmlsdGVyXzEgPSAoKHdpbmRvdy0+c3JjX2ggPDwgMTYpIC8gd2luZG93LT5kc3RfaCkgPj4gMTU7CisJCXZfZmlsdGVyXzEgPSAodl9maWx0ZXJfMSA+PiAxKSArICh2X2ZpbHRlcl8xICYgMSk7CisJCS8qIE9ubHkgYW4gZXhhY3Qgc2l6ZSBtYXRjaCBjYW4gdXNlIGZpbHRlciAwICovCisJCWlmICh2X2ZpbHRlcl8xID09IDApIHZfZmlsdGVyXzEgPSAxOworCQl2X2ZpbHRlcl8yID0gdl9maWx0ZXJfMTsKKwl9CisKKwl3cml0ZV9yZWcocmVnXzI5MzQsIDB4MDI5MzQpOworCXdyaXRlX3JlZyhyZWdfMjkzYywgMHgwMjkzYyk7CisJSVZUVl9ERUJVR19ZVVYoIlVwZGF0ZSByZWcgMHgyOTM0ICUwOHgtPiUwOHggMHgyOTNjICUwOHgtPiUwOHhcbiIsaXR2LT55dXZfaW5mby5yZWdfMjkzNCwgcmVnXzI5MzQsIGl0di0+eXV2X2luZm8ucmVnXzI5M2MsIHJlZ18yOTNjKTsKKwl3cml0ZV9yZWcocmVnXzI5NDQsIDB4MDI5NDQpOworCXdyaXRlX3JlZyhyZWdfMjk0YywgMHgwMjk0Yyk7CisJSVZUVl9ERUJVR19ZVVYoIlVwZGF0ZSByZWcgMHgyOTQ0ICUwOHgtPiUwOHggMHgyOTRjICUwOHgtPiUwOHhcbiIsaXR2LT55dXZfaW5mby5yZWdfMjk0NCwgcmVnXzI5NDQsIGl0di0+eXV2X2luZm8ucmVnXzI5NGMsIHJlZ18yOTRjKTsKKworCS8qIEVuc3VyZSAyOTcwIGlzIDAgKGRvZXMgaXQgZXZlciBjaGFuZ2UgPykgKi8KKy8qCXdyaXRlX3JlZygwLDB4MDI5NzApOyAqLworLyoJSVZUVl9ERUJVR19ZVVYoIlVwZGF0ZSByZWcgMHgyOTcwICUwOHgtPiUwOHhcbiIsaXR2LT55dXZfaW5mby5yZWdfMjk3MCwgMCk7ICovCisKKwl3cml0ZV9yZWcocmVnXzI5MzAsIDB4MDI5MzgpOworCXdyaXRlX3JlZyhyZWdfMjkzMCwgMHgwMjkzMCk7CisJSVZUVl9ERUJVR19ZVVYoIlVwZGF0ZSByZWcgMHgyOTMwICUwOHgtPiUwOHggMHgyOTM4ICUwOHgtPiUwOHhcbiIsaXR2LT55dXZfaW5mby5yZWdfMjkzMCwgcmVnXzI5MzAsIGl0di0+eXV2X2luZm8ucmVnXzI5MzgsIHJlZ18yOTMwKTsKKworCXdyaXRlX3JlZyhyZWdfMjkyOCwgMHgwMjkyOCk7CisJd3JpdGVfcmVnKHJlZ18yOTI4KzB4NTE0LCAweDAyOTJDKTsKKwlJVlRWX0RFQlVHX1lVVigiVXBkYXRlIHJlZyAweDI5MjggJTA4eC0+JTA4eCAweDI5MmMgJTA4eC0+JTA4eFxuIixpdHYtPnl1dl9pbmZvLnJlZ18yOTI4LCByZWdfMjkyOCwgaXR2LT55dXZfaW5mby5yZWdfMjkyYywgcmVnXzI5MjgrMHg1MTQpOworCisJd3JpdGVfcmVnKHJlZ18yOTIwLCAweDAyOTIwKTsKKwl3cml0ZV9yZWcocmVnXzI5MjArMHg1MTQsIDB4MDI5MjQpOworCUlWVFZfREVCVUdfWVVWKCJVcGRhdGUgcmVnIDB4MjkyMCAlMDh4LT4lMDh4IDB4MjkyNCAlMDh4LT4lMDh4XG4iLGl0di0+eXV2X2luZm8ucmVnXzI5MjAsIHJlZ18yOTIwLCBpdHYtPnl1dl9pbmZvLnJlZ18yOTI0LCAweDUxNCtyZWdfMjkyMCk7CisKKwl3cml0ZV9yZWcgKHJlZ18yOTE4LDB4MDI5MTgpOworCXdyaXRlX3JlZyAocmVnXzI5MWMsMHgwMjkxQyk7CisJSVZUVl9ERUJVR19ZVVYoIlVwZGF0ZSByZWcgMHgyOTE4ICUwOHgtPiUwOHggMHgyOTFDICUwOHgtPiUwOHhcbiIsaXR2LT55dXZfaW5mby5yZWdfMjkxOCxyZWdfMjkxOCxpdHYtPnl1dl9pbmZvLnJlZ18yOTFjLHJlZ18yOTFjKTsKKworCXdyaXRlX3JlZyhyZWdfMjk2YywgMHgwMjk2Yyk7CisJSVZUVl9ERUJVR19ZVVYoIlVwZGF0ZSByZWcgMHgyOTZjICUwOHgtPiUwOHhcbiIsaXR2LT55dXZfaW5mby5yZWdfMjk2YywgcmVnXzI5NmMpOworCisJd3JpdGVfcmVnKHJlZ18yOTQwLCAweDAyOTQ4KTsKKwl3cml0ZV9yZWcocmVnXzI5NDAsIDB4MDI5NDApOworCUlWVFZfREVCVUdfWVVWKCJVcGRhdGUgcmVnIDB4Mjk0MCAlMDh4LT4lMDh4IDB4Mjk0OCAlMDh4LT4lMDh4XG4iLGl0di0+eXV2X2luZm8ucmVnXzI5NDAsIHJlZ18yOTQwLCBpdHYtPnl1dl9pbmZvLnJlZ18yOTQ4LCByZWdfMjk0MCk7CisKKwl3cml0ZV9yZWcocmVnXzI5NTAsIDB4MDI5NTApOworCXdyaXRlX3JlZyhyZWdfMjk1NCwgMHgwMjk1NCk7CisJSVZUVl9ERUJVR19ZVVYoIlVwZGF0ZSByZWcgMHgyOTUwICUwOHgtPiUwOHggMHgyOTU0ICUwOHgtPiUwOHhcbiIsaXR2LT55dXZfaW5mby5yZWdfMjk1MCwgcmVnXzI5NTAsIGl0di0+eXV2X2luZm8ucmVnXzI5NTQsIHJlZ18yOTU0KTsKKworCXdyaXRlX3JlZyhyZWdfMjk1OCwgMHgwMjk1OCk7CisJd3JpdGVfcmVnKHJlZ18yOTVjLCAweDAyOTVDKTsKKwlJVlRWX0RFQlVHX1lVVigiVXBkYXRlIHJlZyAweDI5NTggJTA4eC0+JTA4eCAweDI5NUMgJTA4eC0+JTA4eFxuIixpdHYtPnl1dl9pbmZvLnJlZ18yOTU4LCByZWdfMjk1OCwgaXR2LT55dXZfaW5mby5yZWdfMjk1YywgcmVnXzI5NWMpOworCisJd3JpdGVfcmVnKHJlZ18yOTYwLCAweDAyOTYwKTsKKwlJVlRWX0RFQlVHX1lVVigiVXBkYXRlIHJlZyAweDI5NjAgJTA4eC0+JTA4eCBcbiIsaXR2LT55dXZfaW5mby5yZWdfMjk2MCwgcmVnXzI5NjApOworCisJd3JpdGVfcmVnKHJlZ18yOTY0LCAweDAyOTY0KTsKKwl3cml0ZV9yZWcocmVnXzI5NjgsIDB4MDI5NjgpOworCUlWVFZfREVCVUdfWVVWKCJVcGRhdGUgcmVnIDB4Mjk2NCAlMDh4LT4lMDh4IDB4Mjk2OCAlMDh4LT4lMDh4XG4iLGl0di0+eXV2X2luZm8ucmVnXzI5NjQsIHJlZ18yOTY0LCBpdHYtPnl1dl9pbmZvLnJlZ18yOTY4LCByZWdfMjk2OCk7CisKKwl3cml0ZV9yZWcoIHJlZ18yODljLDB4MDI4OWMpOworCUlWVFZfREVCVUdfWVVWKCJVcGRhdGUgcmVnIDB4Mjg5YyAlMDh4LT4lMDh4XG4iLGl0di0+eXV2X2luZm8ucmVnXzI4OWMsIHJlZ18yODljKTsKKworCS8qIE9ubHkgdXBkYXRlIGZpbHRlciAxIGlmIHdlIHJlYWxseSBuZWVkIHRvICovCisJaWYgKHZfZmlsdGVyXzEgIT0gaXR2LT55dXZfaW5mby52X2ZpbHRlcl8xKSB7CisJCWl2dHZfeXV2X2ZpbHRlciAoaXR2LC0xLHZfZmlsdGVyXzEsLTEpOworCQlpdHYtPnl1dl9pbmZvLnZfZmlsdGVyXzEgPSB2X2ZpbHRlcl8xOworCX0KKworCS8qIE9ubHkgdXBkYXRlIGZpbHRlciAyIGlmIHdlIHJlYWxseSBuZWVkIHRvICovCisJaWYgKHZfZmlsdGVyXzIgIT0gaXR2LT55dXZfaW5mby52X2ZpbHRlcl8yKSB7CisJCWl2dHZfeXV2X2ZpbHRlciAoaXR2LC0xLC0xLHZfZmlsdGVyXzIpOworCQlpdHYtPnl1dl9pbmZvLnZfZmlsdGVyXzIgPSB2X2ZpbHRlcl8yOworCX0KKworCWl0di0+eXV2X2luZm8uZnJhbWVfaW50ZXJsYWNlZF9sYXN0ID0gaXR2LT55dXZfaW5mby5mcmFtZV9pbnRlcmxhY2VkOworfQorCisvKiBNb2RpZnkgdGhlIHN1cHBsaWVkIGNvb3JkaW5hdGUgaW5mb3JtYXRpb24gdG8gZml0IHRoZSB2aXNpYmxlIG9zZCBhcmVhICovCitzdGF0aWMgdTMyIGl2dHZfeXV2X3dpbmRvd19zZXR1cCAoc3RydWN0IGl2dHYgKml0diwgc3RydWN0IHl1dl9mcmFtZV9pbmZvICp3aW5kb3cpCit7CisJaW50IG9zZF9jcm9wLCBsYWNlX3RocmVzaG9sZDsKKwl1MzIgb3NkX3NjYWxlOworCXUzMiB5dXZfdXBkYXRlID0gMDsKKworCWxhY2VfdGhyZXNob2xkID0gaXR2LT55dXZfaW5mby5sYWNlX3RocmVzaG9sZDsKKwlpZiAobGFjZV90aHJlc2hvbGQgPCAwKQorCQlsYWNlX3RocmVzaG9sZCA9IGl0di0+eXV2X2luZm8uZGVjb2RlX2hlaWdodCAtIDE7CisKKwkvKiBXb3JrIG91dCB0aGUgbGFjZSBzZXR0aW5ncyAqLworCXN3aXRjaCAoaXR2LT55dXZfaW5mby5sYWNlX21vZGUpIHsKKwkJY2FzZSBJVlRWX1lVVl9NT0RFX1BST0dSRVNTSVZFOiAvKiBQcm9ncmVzc2l2ZSBtb2RlICovCisJCQlpdHYtPnl1dl9pbmZvLmZyYW1lX2ludGVybGFjZWQgPSAwOworCQkJaWYgKHdpbmRvdy0+dHJ1X2ggPCA1MTIgfHwgKHdpbmRvdy0+dHJ1X2ggPiA1NzYgJiYgd2luZG93LT50cnVfaCA8IDEwMjEpKQorCQkJCXdpbmRvdy0+aW50ZXJsYWNlZF95ID0gMDsKKwkJCWVsc2UKKwkJCQl3aW5kb3ctPmludGVybGFjZWRfeSA9IDE7CisKKwkJCWlmICh3aW5kb3ctPnRydV9oIDwgMTAyMSAmJiAod2luZG93LT5kc3RfaCA+PSB3aW5kb3ctPnNyY19oIC8yKSkKKwkJCQl3aW5kb3ctPmludGVybGFjZWRfdXYgPSAwOworCQkJZWxzZQorCQkJCXdpbmRvdy0+aW50ZXJsYWNlZF91diA9IDE7CisJCQlicmVhazsKKworCQljYXNlIElWVFZfWVVWX01PREVfQVVUTzoKKwkJCWlmICh3aW5kb3ctPnRydV9oIDw9IGxhY2VfdGhyZXNob2xkIHx8IHdpbmRvdy0+dHJ1X2ggPiA1NzYgfHwgd2luZG93LT50cnVfdyA+IDcyMCl7CisJCQkJaXR2LT55dXZfaW5mby5mcmFtZV9pbnRlcmxhY2VkID0gMDsKKwkJCQlpZiAoKHdpbmRvdy0+dHJ1X2ggPCA1MTIpIHx8CisJCQkJICAod2luZG93LT50cnVfaCA+IDU3NiAmJiB3aW5kb3ctPnRydV9oIDwgMTAyMSkgfHwKKwkJCQkgICh3aW5kb3ctPnRydV93ID4gNzIwICYmIHdpbmRvdy0+dHJ1X2ggPCAxMDIxKSkKKwkJCQkJd2luZG93LT5pbnRlcmxhY2VkX3kgPSAwOworCQkJCWVsc2UKKwkJCQkJd2luZG93LT5pbnRlcmxhY2VkX3kgPSAxOworCisJCQkJaWYgKHdpbmRvdy0+dHJ1X2ggPCAxMDIxICYmICh3aW5kb3ctPmRzdF9oID49IHdpbmRvdy0+c3JjX2ggLzIpKQorCQkJCQl3aW5kb3ctPmludGVybGFjZWRfdXYgPSAwOworCQkJCWVsc2UKKwkJCQkJd2luZG93LT5pbnRlcmxhY2VkX3V2ID0gMTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCWl0di0+eXV2X2luZm8uZnJhbWVfaW50ZXJsYWNlZCA9IDE7CisJCQkJd2luZG93LT5pbnRlcmxhY2VkX3kgPSAxOworCQkJCXdpbmRvdy0+aW50ZXJsYWNlZF91diA9IDE7CisJCQl9CisJCQlicmVhazsKKworCQkJY2FzZSBJVlRWX1lVVl9NT0RFX0lOVEVSTEFDRUQ6IC8qIEludGVybGFjZSBtb2RlICovCisJCWRlZmF1bHQ6CisJCQlpdHYtPnl1dl9pbmZvLmZyYW1lX2ludGVybGFjZWQgPSAxOworCQkJd2luZG93LT5pbnRlcmxhY2VkX3kgPSAxOworCQkJd2luZG93LT5pbnRlcmxhY2VkX3V2ID0gMTsKKwkJCWJyZWFrOworCX0KKworCS8qIFNvcnJ5LCBidXQgbm8gbmVnYXRpdmUgY29vcmRzIGZvciBzcmMgKi8KKwlpZiAod2luZG93LT5zcmNfeCA8IDApIHdpbmRvdy0+c3JjX3ggPSAwOworCWlmICh3aW5kb3ctPnNyY195IDwgMCkgd2luZG93LT5zcmNfeSA9IDA7CisKKwkvKiBDYW4gb25seSByZWR1Y2Ugd2lkdGggZG93biB0byAxLzQgb3JpZ2luYWwgc2l6ZSAqLworCWlmICgob3NkX2Nyb3AgPSB3aW5kb3ctPnNyY193IC0gKCA0ICogd2luZG93LT5kc3RfdyApKSA+IDApIHsKKwkJd2luZG93LT5zcmNfeCArPSBvc2RfY3JvcCAvIDI7CisJCXdpbmRvdy0+c3JjX3cgPSAod2luZG93LT5zcmNfdyAtIG9zZF9jcm9wKSAmIH4zOworCQl3aW5kb3ctPmRzdF93ID0gd2luZG93LT5zcmNfdyAvIDQ7CisJCXdpbmRvdy0+ZHN0X3cgKz0gd2luZG93LT5kc3RfdyAmIDE7CisJfQorCisJLyogQ2FuIG9ubHkgcmVkdWNlIGhlaWdodCBkb3duIHRvIDEvNCBvcmlnaW5hbCBzaXplICovCisJaWYgKHdpbmRvdy0+c3JjX2ggLyB3aW5kb3ctPmRzdF9oID49IDIpIHsKKwkJLyogT3ZlcmZsb3cgbWF5IGJlIGJlY2F1c2Ugd2UncmUgcnVubmluZyBwcm9ncmVzc2l2ZSwgc28gZm9yY2UgbW9kZSBzd2l0Y2ggKi8KKwkJd2luZG93LT5pbnRlcmxhY2VkX3kgPSAxOworCQkvKiBNYWtlIHN1cmUgd2UncmUgc3RpbGwgd2l0aGluIGxpbWl0cyBmb3IgaW50ZXJsYWNlICovCisJCWlmICgob3NkX2Nyb3AgPSB3aW5kb3ctPnNyY19oIC0gKCA0ICogd2luZG93LT5kc3RfaCApKSA+IDApIHsKKwkJCS8qIElmIHdlIHJlYWNoIGhlcmUgd2UnbGwgaGF2ZSB0byBmb3JjZSB0aGUgaGVpZ2h0LiAqLworCQkJd2luZG93LT5zcmNfeSArPSBvc2RfY3JvcCAvIDI7CisJCQl3aW5kb3ctPnNyY19oID0gKHdpbmRvdy0+c3JjX2ggLSBvc2RfY3JvcCkgJiB+MzsKKwkJCXdpbmRvdy0+ZHN0X2ggPSB3aW5kb3ctPnNyY19oIC8gNDsKKwkJCXdpbmRvdy0+ZHN0X2ggKz0gd2luZG93LT5kc3RfaCAmIDE7CisJCX0KKwl9CisKKwkvKiBJZiB0aGVyZSdzIG5vdGhpbmcgdG8gc2FmZSB0byBkaXNwbGF5LCB3ZSBtYXkgYXMgd2VsbCBzdG9wIG5vdyAqLworCWlmICgoaW50KXdpbmRvdy0+ZHN0X3cgPD0gMiB8fCAoaW50KXdpbmRvdy0+ZHN0X2ggPD0gMiB8fCAoaW50KXdpbmRvdy0+c3JjX3cgPD0gMiB8fCAoaW50KXdpbmRvdy0+c3JjX2ggPD0gMikgeworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBFbnN1cmUgdmlkZW8gcmVtYWlucyBpbnNpZGUgT1NEIGFyZWEgKi8KKwlvc2Rfc2NhbGUgPSAod2luZG93LT5zcmNfaCA8PCAxNikgLyB3aW5kb3ctPmRzdF9oOworCisJaWYgKChvc2RfY3JvcCA9IHdpbmRvdy0+cGFuX3kgLSB3aW5kb3ctPmRzdF95KSA+IDApIHsKKwkJLyogRmFsbHMgb2ZmIHRoZSB1cHBlciBlZGdlIC0gY3JvcCAqLworCQl3aW5kb3ctPnNyY195ICs9IChvc2Rfc2NhbGUgKiBvc2RfY3JvcCkgPj4gMTY7CisJCXdpbmRvdy0+c3JjX2ggLT0gKG9zZF9zY2FsZSAqIG9zZF9jcm9wKSA+PiAxNjsKKwkJd2luZG93LT5kc3RfaCAtPSBvc2RfY3JvcDsKKwkJd2luZG93LT5kc3RfeSA9IDA7CisJfQorCWVsc2UgeworCQl3aW5kb3ctPmRzdF95IC09IHdpbmRvdy0+cGFuX3k7CisJfQorCisJaWYgKChvc2RfY3JvcCA9IHdpbmRvdy0+ZHN0X2ggKyB3aW5kb3ctPmRzdF95IC0gd2luZG93LT52aXNfaCkgPiAwKSB7CisJCS8qIEZhbGxzIG9mZiB0aGUgbG93ZXIgZWRnZSAtIGNyb3AgKi8KKwkJd2luZG93LT5kc3RfaCAtPSBvc2RfY3JvcDsKKwkJd2luZG93LT5zcmNfaCAtPSAob3NkX3NjYWxlICogb3NkX2Nyb3ApID4+IDE2OworCX0KKworCW9zZF9zY2FsZSA9ICh3aW5kb3ctPnNyY193IDw8IDE2KSAvIHdpbmRvdy0+ZHN0X3c7CisKKwlpZiAoKG9zZF9jcm9wID0gd2luZG93LT5wYW5feCAtIHdpbmRvdy0+ZHN0X3gpID4gMCkgeworCQkvKiBGYWxsIG9mZiB0aGUgbGVmdCBlZGdlIC0gY3JvcCAqLworCQl3aW5kb3ctPnNyY194ICs9IChvc2Rfc2NhbGUgKiBvc2RfY3JvcCkgPj4gMTY7CisJCXdpbmRvdy0+c3JjX3cgLT0gKG9zZF9zY2FsZSAqIG9zZF9jcm9wKSA+PiAxNjsKKwkJd2luZG93LT5kc3RfdyAtPSBvc2RfY3JvcDsKKwkJd2luZG93LT5kc3RfeCA9IDA7CisJfQorCWVsc2UgeworCQl3aW5kb3ctPmRzdF94IC09IHdpbmRvdy0+cGFuX3g7CisJfQorCisJaWYgKChvc2RfY3JvcCA9IHdpbmRvdy0+ZHN0X3cgKyB3aW5kb3ctPmRzdF94IC0gd2luZG93LT52aXNfdykgPiAwKSB7CisJCS8qIEZhbGxzIG9mZiB0aGUgcmlnaHQgZWRnZSAtIGNyb3AgKi8KKwkJd2luZG93LT5kc3RfdyAtPSBvc2RfY3JvcDsKKwkJd2luZG93LT5zcmNfdyAtPSAob3NkX3NjYWxlICogb3NkX2Nyb3ApID4+IDE2OworCX0KKworCS8qIFRoZSBPU0QgY2FuIGJlIG1vdmVkLiBUcmFjayB0byBpdCAqLworCXdpbmRvdy0+ZHN0X3ggKz0gaXR2LT55dXZfaW5mby5vc2RfeF9vZmZzZXQ7CisJd2luZG93LT5kc3RfeSArPSBpdHYtPnl1dl9pbmZvLm9zZF95X29mZnNldDsKKworCS8qIFdpZHRoICYgaGVpZ2h0IGZvciBib3RoIHNyYyAmIGRzdCBtdXN0IGJlIGV2ZW4uCisJICAgU2FtZSBmb3IgY29vcmRpbmF0ZXMuICovCisJd2luZG93LT5kc3RfdyAmPSB+MTsKKwl3aW5kb3ctPmRzdF94ICY9IH4xOworCisJd2luZG93LT5zcmNfdyArPSB3aW5kb3ctPnNyY194ICYgMTsKKwl3aW5kb3ctPnNyY194ICY9IH4xOworCisJd2luZG93LT5zcmNfdyAmPSB+MTsKKwl3aW5kb3ctPmRzdF93ICY9IH4xOworCisJd2luZG93LT5kc3RfaCAmPSB+MTsKKwl3aW5kb3ctPmRzdF95ICY9IH4xOworCisJd2luZG93LT5zcmNfaCArPSB3aW5kb3ctPnNyY195ICYgMTsKKwl3aW5kb3ctPnNyY195ICY9IH4xOworCisJd2luZG93LT5zcmNfaCAmPSB+MTsKKwl3aW5kb3ctPmRzdF9oICY9IH4xOworCisJLyogRHVlIHRvIHJvdW5kaW5nLCB3ZSBtYXkgaGF2ZSByZWR1Y2VkIHRoZSBvdXRwdXQgc2l6ZSB0byA8MS80IG9mIHRoZSBzb3VyY2UKKwkgICBDaGVjayBhZ2FpbiwgYnV0IHRoaXMgdGltZSBqdXN0IHJlc2l6ZS4gRG9uJ3QgY2hhbmdlIHNvdXJjZSBjb29yZGluYXRlcyAqLworCWlmICh3aW5kb3ctPmRzdF93IDwgd2luZG93LT5zcmNfdyAvIDQpIHsKKwkJd2luZG93LT5zcmNfdyAmPSB+MzsKKwkJd2luZG93LT5kc3RfdyA9IHdpbmRvdy0+c3JjX3cgLyA0OworCQl3aW5kb3ctPmRzdF93ICs9IHdpbmRvdy0+ZHN0X3cgJiAxOworCX0KKwlpZiAod2luZG93LT5kc3RfaCA8IHdpbmRvdy0+c3JjX2ggLyA0KSB7CisJCXdpbmRvdy0+c3JjX2ggJj0gfjM7CisJCXdpbmRvdy0+ZHN0X2ggPSB3aW5kb3ctPnNyY19oIC8gNDsKKwkJd2luZG93LT5kc3RfaCArPSB3aW5kb3ctPmRzdF9oICYgMTsKKwl9CisKKwkvKiBDaGVjayBhZ2Fpbi4gSWYgdGhlcmUncyBub3RoaW5nIHRvIHNhZmUgdG8gZGlzcGxheSwgc3RvcCBub3cgKi8KKwlpZiAoKGludCl3aW5kb3ctPmRzdF93IDw9IDIgfHwgKGludCl3aW5kb3ctPmRzdF9oIDw9IDIgfHwgKGludCl3aW5kb3ctPnNyY193IDw9IDIgfHwgKGludCl3aW5kb3ctPnNyY19oIDw9IDIpIHsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogQm90aCB4IG9mZnNldCAmIHdpZHRoIGFyZSBsaW5rZWQsIHNvIHRoZXkgaGF2ZSB0byBiZSBkb25lIHRvZ2V0aGVyICovCisJaWYgKChpdHYtPnl1dl9pbmZvLm9sZF9mcmFtZV9pbmZvLmRzdF93ICE9IHdpbmRvdy0+ZHN0X3cpIHx8CisJICAgIChpdHYtPnl1dl9pbmZvLm9sZF9mcmFtZV9pbmZvLnNyY193ICE9IHdpbmRvdy0+c3JjX3cpIHx8CisJICAgIChpdHYtPnl1dl9pbmZvLm9sZF9mcmFtZV9pbmZvLmRzdF94ICE9IHdpbmRvdy0+ZHN0X3gpIHx8CisJICAgIChpdHYtPnl1dl9pbmZvLm9sZF9mcmFtZV9pbmZvLnNyY194ICE9IHdpbmRvdy0+c3JjX3gpIHx8CisJICAgIChpdHYtPnl1dl9pbmZvLm9sZF9mcmFtZV9pbmZvLnBhbl94ICE9IHdpbmRvdy0+cGFuX3gpIHx8CisJICAgIChpdHYtPnl1dl9pbmZvLm9sZF9mcmFtZV9pbmZvLnZpc193ICE9IHdpbmRvdy0+dmlzX3cpKSB7CisJCXl1dl91cGRhdGUgfD0gSVZUVl9ZVVZfVVBEQVRFX0hPUklaT05UQUw7CisJfQorCisJaWYgKChpdHYtPnl1dl9pbmZvLm9sZF9mcmFtZV9pbmZvLnNyY19oICE9IHdpbmRvdy0+c3JjX2gpIHx8CisJICAgIChpdHYtPnl1dl9pbmZvLm9sZF9mcmFtZV9pbmZvLmRzdF9oICE9IHdpbmRvdy0+ZHN0X2gpIHx8CisJICAgIChpdHYtPnl1dl9pbmZvLm9sZF9mcmFtZV9pbmZvLmRzdF95ICE9IHdpbmRvdy0+ZHN0X3kpIHx8CisJICAgIChpdHYtPnl1dl9pbmZvLm9sZF9mcmFtZV9pbmZvLnNyY195ICE9IHdpbmRvdy0+c3JjX3kpIHx8CisJICAgIChpdHYtPnl1dl9pbmZvLm9sZF9mcmFtZV9pbmZvLnBhbl95ICE9IHdpbmRvdy0+cGFuX3kpIHx8CisJICAgIChpdHYtPnl1dl9pbmZvLm9sZF9mcmFtZV9pbmZvLnZpc19oICE9IHdpbmRvdy0+dmlzX2gpIHx8CisJICAgIChpdHYtPnl1dl9pbmZvLm9sZF9mcmFtZV9pbmZvLmludGVybGFjZWRfeSAhPSB3aW5kb3ctPmludGVybGFjZWRfeSkgfHwKKwkgICAgKGl0di0+eXV2X2luZm8ub2xkX2ZyYW1lX2luZm8uaW50ZXJsYWNlZF91diAhPSB3aW5kb3ctPmludGVybGFjZWRfdXYpKSB7CisJCXl1dl91cGRhdGUgfD0gSVZUVl9ZVVZfVVBEQVRFX1ZFUlRJQ0FMOworCX0KKworCXJldHVybiB5dXZfdXBkYXRlOworfQorCisvKiBVcGRhdGUgdGhlIHNjYWxpbmcgcmVnaXN0ZXIgdG8gdGhlIHJlcXVlc3RlZCB2YWx1ZSAqLwordm9pZCBpdnR2X3l1dl93b3JrX2hhbmRsZXIgKHN0cnVjdCBpdnR2ICppdHYpCit7CisJc3RydWN0IHl1dl9mcmFtZV9pbmZvIHdpbmRvdzsKKwl1MzIgeXV2X3VwZGF0ZTsKKworCWludCBmcmFtZSA9IGl0di0+eXV2X2luZm8udXBkYXRlX2ZyYW1lOworCisvKglJVlRWX0RFQlVHX1lVVigiVXBkYXRlIHl1diByZWdpc3RlcnMgZm9yIGZyYW1lICVkXG4iLGZyYW1lKTsgKi8KKwltZW1jcHkoJndpbmRvdywgJml0di0+eXV2X2luZm8ubmV3X2ZyYW1lX2luZm9bZnJhbWVdLCBzaXplb2YgKHdpbmRvdykpOworCisJLyogVXBkYXRlIHRoZSBvc2QgcGFuIGluZm8gKi8KKwl3aW5kb3cucGFuX3ggPSBpdHYtPnl1dl9pbmZvLm9zZF94X3BhbjsKKwl3aW5kb3cucGFuX3kgPSBpdHYtPnl1dl9pbmZvLm9zZF95X3BhbjsKKwl3aW5kb3cudmlzX3cgPSBpdHYtPnl1dl9pbmZvLm9zZF92aXNfdzsKKwl3aW5kb3cudmlzX2ggPSBpdHYtPnl1dl9pbmZvLm9zZF92aXNfaDsKKworCS8qIENhbGN1bGF0ZSB0aGUgZGlzcGxheSB3aW5kb3cgY29vcmRpbmF0ZXMuIEV4aXQgaWYgbm90aGluZyBsZWZ0ICovCisJaWYgKCEoeXV2X3VwZGF0ZSA9IGl2dHZfeXV2X3dpbmRvd19zZXR1cCAoaXR2LCAmd2luZG93KSkpCisJCXJldHVybjsKKworCS8qIFVwZGF0ZSBob3Jpem9udGFsIHNldHRpbmdzICovCisJaWYgKHl1dl91cGRhdGUgJiBJVlRWX1lVVl9VUERBVEVfSE9SSVpPTlRBTCkKKwkJaXZ0dl95dXZfaGFuZGxlX2hvcml6b250YWwoaXR2LCAmd2luZG93KTsKKworCWlmICh5dXZfdXBkYXRlICYgSVZUVl9ZVVZfVVBEQVRFX1ZFUlRJQ0FMKQorCQlpdnR2X3l1dl9oYW5kbGVfdmVydGljYWwoaXR2LCAmd2luZG93KTsKKworCW1lbWNweSgmaXR2LT55dXZfaW5mby5vbGRfZnJhbWVfaW5mbywgJndpbmRvdywgc2l6ZW9mIChpdHYtPnl1dl9pbmZvLm9sZF9mcmFtZV9pbmZvKSk7Cit9CisKK3N0YXRpYyB2b2lkIGl2dHZfeXV2X2luaXQgKHN0cnVjdCBpdnR2ICppdHYpCit7CisJSVZUVl9ERUJVR19ZVVYoIml2dHZfeXV2X2luaXRcbiIpOworCisJLyogVGFrZSBhIHNuYXBzaG90IG9mIHRoZSBjdXJyZW50IHJlZ2lzdGVyIHNldHRpbmdzICovCisJaXR2LT55dXZfaW5mby5yZWdfMjgzNCA9IHJlYWRfcmVnKDB4MDI4MzQpOworCWl0di0+eXV2X2luZm8ucmVnXzI4MzggPSByZWFkX3JlZygweDAyODM4KTsKKwlpdHYtPnl1dl9pbmZvLnJlZ18yODNjID0gcmVhZF9yZWcoMHgwMjgzYyk7CisJaXR2LT55dXZfaW5mby5yZWdfMjg0MCA9IHJlYWRfcmVnKDB4MDI4NDApOworCWl0di0+eXV2X2luZm8ucmVnXzI4NDQgPSByZWFkX3JlZygweDAyODQ0KTsKKwlpdHYtPnl1dl9pbmZvLnJlZ18yODQ4ID0gcmVhZF9yZWcoMHgwMjg0OCk7CisJaXR2LT55dXZfaW5mby5yZWdfMjg1NCA9IHJlYWRfcmVnKDB4MDI4NTQpOworCWl0di0+eXV2X2luZm8ucmVnXzI4NWMgPSByZWFkX3JlZygweDAyODVjKTsKKwlpdHYtPnl1dl9pbmZvLnJlZ18yODY0ID0gcmVhZF9yZWcoMHgwMjg2NCk7CisJaXR2LT55dXZfaW5mby5yZWdfMjg3MCA9IHJlYWRfcmVnKDB4MDI4NzApOworCWl0di0+eXV2X2luZm8ucmVnXzI4NzQgPSByZWFkX3JlZygweDAyODc0KTsKKwlpdHYtPnl1dl9pbmZvLnJlZ18yODk4ID0gcmVhZF9yZWcoMHgwMjg5OCk7CisJaXR2LT55dXZfaW5mby5yZWdfMjg5MCA9IHJlYWRfcmVnKDB4MDI4OTApOworCisJaXR2LT55dXZfaW5mby5yZWdfMjg5YyA9IHJlYWRfcmVnKDB4MDI4OWMpOworCWl0di0+eXV2X2luZm8ucmVnXzI5MTggPSByZWFkX3JlZygweDAyOTE4KTsKKwlpdHYtPnl1dl9pbmZvLnJlZ18yOTFjID0gcmVhZF9yZWcoMHgwMjkxYyk7CisJaXR2LT55dXZfaW5mby5yZWdfMjkyMCA9IHJlYWRfcmVnKDB4MDI5MjApOworCWl0di0+eXV2X2luZm8ucmVnXzI5MjQgPSByZWFkX3JlZygweDAyOTI0KTsKKwlpdHYtPnl1dl9pbmZvLnJlZ18yOTI4ID0gcmVhZF9yZWcoMHgwMjkyOCk7CisJaXR2LT55dXZfaW5mby5yZWdfMjkyYyA9IHJlYWRfcmVnKDB4MDI5MmMpOworCWl0di0+eXV2X2luZm8ucmVnXzI5MzAgPSByZWFkX3JlZygweDAyOTMwKTsKKwlpdHYtPnl1dl9pbmZvLnJlZ18yOTM0ID0gcmVhZF9yZWcoMHgwMjkzNCk7CisJaXR2LT55dXZfaW5mby5yZWdfMjkzOCA9IHJlYWRfcmVnKDB4MDI5MzgpOworCWl0di0+eXV2X2luZm8ucmVnXzI5M2MgPSByZWFkX3JlZygweDAyOTNjKTsKKwlpdHYtPnl1dl9pbmZvLnJlZ18yOTQwID0gcmVhZF9yZWcoMHgwMjk0MCk7CisJaXR2LT55dXZfaW5mby5yZWdfMjk0NCA9IHJlYWRfcmVnKDB4MDI5NDQpOworCWl0di0+eXV2X2luZm8ucmVnXzI5NDggPSByZWFkX3JlZygweDAyOTQ4KTsKKwlpdHYtPnl1dl9pbmZvLnJlZ18yOTRjID0gcmVhZF9yZWcoMHgwMjk0Yyk7CisJaXR2LT55dXZfaW5mby5yZWdfMjk1MCA9IHJlYWRfcmVnKDB4MDI5NTApOworCWl0di0+eXV2X2luZm8ucmVnXzI5NTQgPSByZWFkX3JlZygweDAyOTU0KTsKKwlpdHYtPnl1dl9pbmZvLnJlZ18yOTU4ID0gcmVhZF9yZWcoMHgwMjk1OCk7CisJaXR2LT55dXZfaW5mby5yZWdfMjk1YyA9IHJlYWRfcmVnKDB4MDI5NWMpOworCWl0di0+eXV2X2luZm8ucmVnXzI5NjAgPSByZWFkX3JlZygweDAyOTYwKTsKKwlpdHYtPnl1dl9pbmZvLnJlZ18yOTY0ID0gcmVhZF9yZWcoMHgwMjk2NCk7CisJaXR2LT55dXZfaW5mby5yZWdfMjk2OCA9IHJlYWRfcmVnKDB4MDI5NjgpOworCWl0di0+eXV2X2luZm8ucmVnXzI5NmMgPSByZWFkX3JlZygweDAyOTZjKTsKKwlpdHYtPnl1dl9pbmZvLnJlZ18yOTcwID0gcmVhZF9yZWcoMHgwMjk3MCk7CisKKwlpdHYtPnl1dl9pbmZvLnZfZmlsdGVyXzEgPSAtMTsKKwlpdHYtPnl1dl9pbmZvLnZfZmlsdGVyXzIgPSAtMTsKKwlpdHYtPnl1dl9pbmZvLmhfZmlsdGVyID0gLTE7CisKKwkvKiBTZXQgc29tZSB2YWxpZCBzaXplIGluZm8gKi8KKwlpdHYtPnl1dl9pbmZvLm9zZF94X29mZnNldCA9IHJlYWRfcmVnKDB4MDJhMDQpICYgMHgwMDAwMEZGRjsKKwlpdHYtPnl1dl9pbmZvLm9zZF95X29mZnNldCA9IChyZWFkX3JlZygweDAyYTA0KSA+PiAxNikgJiAweDAwMDAwRkZGOworCisJLyogQml0IDIgb2YgcmVnIDI4NzggaW5kaWNhdGVzIGN1cnJlbnQgZGVjb2RlciBvdXRwdXQgZm9ybWF0CisJICAgMCA6IE5UU0MgICAgMSA6IFBBTCAqLworCWlmIChyZWFkX3JlZygweDI4NzgpICYgNCkKKwkJaXR2LT55dXZfaW5mby5kZWNvZGVfaGVpZ2h0ID0gNTc2OworCWVsc2UKKwkJaXR2LT55dXZfaW5mby5kZWNvZGVfaGVpZ2h0ID0gNDgwOworCisJLyogSWYgbm8gdmlzaWJsZSBzaXplIHNldCwgYXNzdW1lIGZ1bGwgc2l6ZSAqLworCWlmICghaXR2LT55dXZfaW5mby5vc2RfdmlzX3cpIGl0di0+eXV2X2luZm8ub3NkX3Zpc193ID0gNzIwIC0gaXR2LT55dXZfaW5mby5vc2RfeF9vZmZzZXQ7CisJaWYgKCFpdHYtPnl1dl9pbmZvLm9zZF92aXNfaCkgaXR2LT55dXZfaW5mby5vc2RfdmlzX2ggPSBpdHYtPnl1dl9pbmZvLmRlY29kZV9oZWlnaHQgLSBpdHYtPnl1dl9pbmZvLm9zZF95X29mZnNldDsKKworCS8qIFdlIG5lZWQgYSBidWZmZXIgZm9yIGJsYW5raW5nIHdoZW4gWSBwbGFuZSBpcyBvZmZzZXQgLSBub24tZmF0YWwgaWYgd2UgY2FuJ3QgZ2V0IG9uZSAqLworCWl0di0+eXV2X2luZm8uYmxhbmtpbmdfcHRyID0ga3phbGxvYyg3MjAqMTYsR0ZQX0tFUk5FTCk7CisJaWYgKGl0di0+eXV2X2luZm8uYmxhbmtpbmdfcHRyKSB7CisJCWl0di0+eXV2X2luZm8uYmxhbmtpbmdfZG1hcHRyID0gcGNpX21hcF9zaW5nbGUoaXR2LT5kZXYsIGl0di0+eXV2X2luZm8uYmxhbmtpbmdfcHRyLCA3MjAqMTYsIFBDSV9ETUFfVE9ERVZJQ0UpOworCX0KKwllbHNlIHsKKwkJaXR2LT55dXZfaW5mby5ibGFua2luZ19kbWFwdHIgPSAwOworCQlJVlRWX0RFQlVHX1dBUk4gKCJGYWlsZWQgdG8gYWxsb2NhdGUgeXV2IGJsYW5raW5nIGJ1ZmZlclxuIik7CisJfQorCisJSVZUVl9ERUJVR19XQVJOKCJFbmFibGUgdmlkZW8gb3V0cHV0XG4iKTsKKwl3cml0ZV9yZWdfc3luYygweDAwMTA4MDgwLCAweDI4OTgpOworCisJLyogRW5hYmxlIFlVViBkZWNvZGVyIG91dHB1dCAqLworCXdyaXRlX3JlZ19zeW5jKDB4MDEsIElWVFZfUkVHX1ZETSk7CisKKwlzZXRfYml0KElWVFZfRl9JX0RFQ09ESU5HX1lVViwgJml0di0+aV9mbGFncyk7CisJYXRvbWljX3NldCgmaXR2LT55dXZfaW5mby5uZXh0X2RtYV9mcmFtZSwwKTsKK30KKworaW50IGl2dHZfeXV2X3ByZXBfZnJhbWUoc3RydWN0IGl2dHYgKml0diwgc3RydWN0IGl2dHZfZG1hX2ZyYW1lICphcmdzKQoreworCURFRklORV9XQUlUKHdhaXQpOworCWludCByYyA9IDA7CisJaW50IGdvdF9zaWcgPSAwOworCWludCBmcmFtZSwgbmV4dF9maWxsX2ZyYW1lLCBsYXN0X2ZpbGxfZnJhbWU7CisKKwlJVlRWX0RFQlVHX0lORk8oInl1dl9wcmVwX2ZyYW1lXG4iKTsKKworCWlmIChhdG9taWNfcmVhZCgmaXR2LT55dXZfaW5mby5uZXh0X2RtYV9mcmFtZSkgPT0gLTEpIGl2dHZfeXV2X2luaXQoaXR2KTsKKworCWZyYW1lID0gYXRvbWljX3JlYWQoJml0di0+eXV2X2luZm8ubmV4dF9maWxsX2ZyYW1lKTsKKwluZXh0X2ZpbGxfZnJhbWUgPSAoZnJhbWUgKyAxKSAmIDB4MzsKKwlsYXN0X2ZpbGxfZnJhbWUgPSAoYXRvbWljX3JlYWQoJml0di0+eXV2X2luZm8ubmV4dF9kbWFfZnJhbWUpKzEpICYgMHgzOworCisJaWYgKG5leHRfZmlsbF9mcmFtZSAhPSBsYXN0X2ZpbGxfZnJhbWUgJiYgbGFzdF9maWxsX2ZyYW1lICE9IGZyYW1lKSB7CisJCS8qIEJ1ZmZlcnMgYXJlIGZ1bGwgLSBPdmVyd3JpdGUgdGhlIGxhc3QgZnJhbWUgKi8KKwkJbmV4dF9maWxsX2ZyYW1lID0gZnJhbWU7CisJCWZyYW1lID0gKGZyYW1lIC0gMSkgJiAzOworCX0KKworCS8qIFRha2UgYSBzbmFwc2hvdCBvZiB0aGUgeXV2IGNvb3JkaW5hdGUgaW5mb3JtYXRpb24gKi8KKwlpdHYtPnl1dl9pbmZvLm5ld19mcmFtZV9pbmZvW2ZyYW1lXS5zcmNfeCA9IGFyZ3MtPnNyYy5sZWZ0OworCWl0di0+eXV2X2luZm8ubmV3X2ZyYW1lX2luZm9bZnJhbWVdLnNyY195ID0gYXJncy0+c3JjLnRvcDsKKwlpdHYtPnl1dl9pbmZvLm5ld19mcmFtZV9pbmZvW2ZyYW1lXS5zcmNfdyA9IGFyZ3MtPnNyYy53aWR0aDsKKwlpdHYtPnl1dl9pbmZvLm5ld19mcmFtZV9pbmZvW2ZyYW1lXS5zcmNfaCA9IGFyZ3MtPnNyYy5oZWlnaHQ7CisJaXR2LT55dXZfaW5mby5uZXdfZnJhbWVfaW5mb1tmcmFtZV0uZHN0X3ggPSBhcmdzLT5kc3QubGVmdDsKKwlpdHYtPnl1dl9pbmZvLm5ld19mcmFtZV9pbmZvW2ZyYW1lXS5kc3RfeSA9IGFyZ3MtPmRzdC50b3A7CisJaXR2LT55dXZfaW5mby5uZXdfZnJhbWVfaW5mb1tmcmFtZV0uZHN0X3cgPSBhcmdzLT5kc3Qud2lkdGg7CisJaXR2LT55dXZfaW5mby5uZXdfZnJhbWVfaW5mb1tmcmFtZV0uZHN0X2ggPSBhcmdzLT5kc3QuaGVpZ2h0OworCWl0di0+eXV2X2luZm8ubmV3X2ZyYW1lX2luZm9bZnJhbWVdLnRydV94ID0gYXJncy0+ZHN0LmxlZnQ7CisJaXR2LT55dXZfaW5mby5uZXdfZnJhbWVfaW5mb1tmcmFtZV0udHJ1X3cgPSBhcmdzLT5zcmNfd2lkdGg7CisJaXR2LT55dXZfaW5mby5uZXdfZnJhbWVfaW5mb1tmcmFtZV0udHJ1X2ggPSBhcmdzLT5zcmNfaGVpZ2h0OworCisJLyogQXJlIHdlIGdvaW5nIHRvIG9mZnNldCB0aGUgWSBwbGFuZSAqLworCWlmIChhcmdzLT5zcmMuaGVpZ2h0ICsgYXJncy0+c3JjLnRvcCA8IDUxMi0xNikKKwkJaXR2LT55dXZfaW5mby5uZXdfZnJhbWVfaW5mb1tmcmFtZV0ub2Zmc2V0X3kgPSAxOworCWVsc2UKKwkJaXR2LT55dXZfaW5mby5uZXdfZnJhbWVfaW5mb1tmcmFtZV0ub2Zmc2V0X3kgPSAwOworCisJLyogU25hcHNob3QgdGhlIG9zZCBwYW4gaW5mbyAqLworCWl0di0+eXV2X2luZm8ubmV3X2ZyYW1lX2luZm9bZnJhbWVdLnBhbl94ID0gaXR2LT55dXZfaW5mby5vc2RfeF9wYW47CisJaXR2LT55dXZfaW5mby5uZXdfZnJhbWVfaW5mb1tmcmFtZV0ucGFuX3kgPSBpdHYtPnl1dl9pbmZvLm9zZF95X3BhbjsKKwlpdHYtPnl1dl9pbmZvLm5ld19mcmFtZV9pbmZvW2ZyYW1lXS52aXNfdyA9IGl0di0+eXV2X2luZm8ub3NkX3Zpc193OworCWl0di0+eXV2X2luZm8ubmV3X2ZyYW1lX2luZm9bZnJhbWVdLnZpc19oID0gaXR2LT55dXZfaW5mby5vc2RfdmlzX2g7CisKKwlpdHYtPnl1dl9pbmZvLm5ld19mcmFtZV9pbmZvW2ZyYW1lXS51cGRhdGUgPSAwOworCWl0di0+eXV2X2luZm8ubmV3X2ZyYW1lX2luZm9bZnJhbWVdLmludGVybGFjZWRfeSA9IDA7CisJaXR2LT55dXZfaW5mby5uZXdfZnJhbWVfaW5mb1tmcmFtZV0uaW50ZXJsYWNlZF91diA9IDA7CisKKwlpZiAobWVtY21wICgmaXR2LT55dXZfaW5mby5vbGRfZnJhbWVfaW5mb19hcmdzLCAmaXR2LT55dXZfaW5mby5uZXdfZnJhbWVfaW5mb1tmcmFtZV0sCisJICAgIHNpemVvZiAoaXR2LT55dXZfaW5mby5uZXdfZnJhbWVfaW5mb1tmcmFtZV0pKSkgeworCQltZW1jcHkoJml0di0+eXV2X2luZm8ub2xkX2ZyYW1lX2luZm9fYXJncywgJml0di0+eXV2X2luZm8ubmV3X2ZyYW1lX2luZm9bZnJhbWVdLCBzaXplb2YgKGl0di0+eXV2X2luZm8ub2xkX2ZyYW1lX2luZm9fYXJncykpOworCQlpdHYtPnl1dl9pbmZvLm5ld19mcmFtZV9pbmZvW2ZyYW1lXS51cGRhdGUgPSAxOworLyoJCUlWVFZfREVCVUdfWVVWICgiUmVxdWVzdGluZyByZWdpc3RlciB1cGRhdGUgZm9yIGZyYW1lICVkXG4iLGZyYW1lKTsgKi8KKwl9CisKKwkvKiBETUEgdGhlIGZyYW1lICovCisJbXV0ZXhfbG9jaygmaXR2LT51ZG1hLmxvY2spOworCisJaWYgKChyYyA9IGl2dHZfeXV2X3ByZXBfdXNlcl9kbWEoaXR2LCAmaXR2LT51ZG1hLCBhcmdzKSkgIT0gMCkgeworCQltdXRleF91bmxvY2soJml0di0+dWRtYS5sb2NrKTsKKwkJcmV0dXJuIHJjOworCX0KKworCWl2dHZfdWRtYV9wcmVwYXJlKGl0dik7CisJcHJlcGFyZV90b193YWl0KCZpdHYtPmRtYV93YWl0cSwgJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSk7CisJLyogaWYgbm8gVURNQSBpcyBwZW5kaW5nIGFuZCBubyBVRE1BIGlzIGluIHByb2dyZXNzLCB0aGVuIHRoZSBETUEKKwlpcyBmaW5pc2hlZCAqLworCXdoaWxlIChpdHYtPmlfZmxhZ3MgJiAoSVZUVl9GX0lfVURNQV9QRU5ESU5HIHwgSVZUVl9GX0lfVURNQSkpIHsKKwkJLyogZG9uJ3QgaW50ZXJydXB0IGlmIHRoZSBETUEgaXMgaW4gcHJvZ3Jlc3MgYnV0IGJyZWFrIG9mZgorCQlhIHN0aWxsIHBlbmRpbmcgRE1BLiAqLworCQlnb3Rfc2lnID0gc2lnbmFsX3BlbmRpbmcoY3VycmVudCk7CisJCWlmIChnb3Rfc2lnICYmIHRlc3RfYW5kX2NsZWFyX2JpdChJVlRWX0ZfSV9VRE1BX1BFTkRJTkcsICZpdHYtPmlfZmxhZ3MpKQorCQkJYnJlYWs7CisJCWdvdF9zaWcgPSAwOworCQlzY2hlZHVsZSgpOworCX0KKwlmaW5pc2hfd2FpdCgmaXR2LT5kbWFfd2FpdHEsICZ3YWl0KTsKKworCS8qIFVubWFwIExhc3QgRE1BIFhmZXIgKi8KKwlpdnR2X3VkbWFfdW5tYXAoaXR2KTsKKworCWlmIChnb3Rfc2lnKSB7CisJCUlWVFZfREVCVUdfSU5GTygiVXNlciBzdG9wcGVkIFlVViBVRE1BXG4iKTsKKwkJbXV0ZXhfdW5sb2NrKCZpdHYtPnVkbWEubG9jayk7CisJCXJldHVybiAtRUlOVFI7CisJfQorCisJYXRvbWljX3NldCgmaXR2LT55dXZfaW5mby5uZXh0X2ZpbGxfZnJhbWUsIG5leHRfZmlsbF9mcmFtZSk7CisKKwltdXRleF91bmxvY2soJml0di0+dWRtYS5sb2NrKTsKKwlyZXR1cm4gcmM7Cit9CisKK3ZvaWQgaXZ0dl95dXZfY2xvc2Uoc3RydWN0IGl2dHYgKml0dikKK3sKKwlpbnQgaF9maWx0ZXIsIHZfZmlsdGVyXzEsIHZfZmlsdGVyXzI7CisKKwlJVlRWX0RFQlVHX1lVVigiaXZ0dl95dXZfY2xvc2VcbiIpOworCWl2dHZfd2FpdHEoJml0di0+dnN5bmNfd2FpdHEpOworCisJYXRvbWljX3NldCgmaXR2LT55dXZfaW5mby5uZXh0X2RtYV9mcmFtZSwgLTEpOworCWF0b21pY19zZXQoJml0di0+eXV2X2luZm8ubmV4dF9maWxsX2ZyYW1lLCAwKTsKKworCS8qIFJlc2V0IHJlZ2lzdGVycyB3ZSBoYXZlIGNoYW5nZWQgc28gbXBlZyBwbGF5YmFjayB3b3JrcyAqLworCisJLyogSWYgd2UgZnVsbHkgcmVzdG9yZSB0aGlzIHJlZ2lzdGVyLCB0aGUgZGlzcGxheSBtYXkgcmVtYWluIGFjdGl2ZS4KKwkgICBSZXN0b3JlLCBidXQgc2V0IG9uZSBiaXQgdG8gYmxhbmsgdGhlIHZpZGVvLiBGaXJtd2FyZSB3aWxsIGFsd2F5cworCSAgIGNsZWFyIHRoaXMgYml0IHdoZW4gbmVlZGVkLCBzbyBub3QgYSBwcm9ibGVtLiAqLworCXdyaXRlX3JlZyhpdHYtPnl1dl9pbmZvLnJlZ18yODk4IHwgMHgwMTAwMDAwMCwgMHgyODk4KTsKKworCXdyaXRlX3JlZyhpdHYtPnl1dl9pbmZvLnJlZ18yODM0LCAweDAyODM0KTsKKwl3cml0ZV9yZWcoaXR2LT55dXZfaW5mby5yZWdfMjgzOCwgMHgwMjgzOCk7CisJd3JpdGVfcmVnKGl0di0+eXV2X2luZm8ucmVnXzI4M2MsIDB4MDI4M2MpOworCXdyaXRlX3JlZyhpdHYtPnl1dl9pbmZvLnJlZ18yODQwLCAweDAyODQwKTsKKwl3cml0ZV9yZWcoaXR2LT55dXZfaW5mby5yZWdfMjg0NCwgMHgwMjg0NCk7CisJd3JpdGVfcmVnKGl0di0+eXV2X2luZm8ucmVnXzI4NDgsIDB4MDI4NDgpOworCXdyaXRlX3JlZyhpdHYtPnl1dl9pbmZvLnJlZ18yODU0LCAweDAyODU0KTsKKwl3cml0ZV9yZWcoaXR2LT55dXZfaW5mby5yZWdfMjg1YywgMHgwMjg1Yyk7CisJd3JpdGVfcmVnKGl0di0+eXV2X2luZm8ucmVnXzI4NjQsIDB4MDI4NjQpOworCXdyaXRlX3JlZyhpdHYtPnl1dl9pbmZvLnJlZ18yODcwLCAweDAyODcwKTsKKwl3cml0ZV9yZWcoaXR2LT55dXZfaW5mby5yZWdfMjg3NCwgMHgwMjg3NCk7CisJd3JpdGVfcmVnKGl0di0+eXV2X2luZm8ucmVnXzI4OTAsIDB4MDI4OTApOworCXdyaXRlX3JlZyhpdHYtPnl1dl9pbmZvLnJlZ18yODljLCAweDAyODljKTsKKworCXdyaXRlX3JlZyhpdHYtPnl1dl9pbmZvLnJlZ18yOTE4LCAweDAyOTE4KTsKKwl3cml0ZV9yZWcoaXR2LT55dXZfaW5mby5yZWdfMjkxYywgMHgwMjkxYyk7CisJd3JpdGVfcmVnKGl0di0+eXV2X2luZm8ucmVnXzI5MjAsIDB4MDI5MjApOworCXdyaXRlX3JlZyhpdHYtPnl1dl9pbmZvLnJlZ18yOTI0LCAweDAyOTI0KTsKKwl3cml0ZV9yZWcoaXR2LT55dXZfaW5mby5yZWdfMjkyOCwgMHgwMjkyOCk7CisJd3JpdGVfcmVnKGl0di0+eXV2X2luZm8ucmVnXzI5MmMsIDB4MDI5MmMpOworCXdyaXRlX3JlZyhpdHYtPnl1dl9pbmZvLnJlZ18yOTMwLCAweDAyOTMwKTsKKwl3cml0ZV9yZWcoaXR2LT55dXZfaW5mby5yZWdfMjkzNCwgMHgwMjkzNCk7CisJd3JpdGVfcmVnKGl0di0+eXV2X2luZm8ucmVnXzI5MzgsIDB4MDI5MzgpOworCXdyaXRlX3JlZyhpdHYtPnl1dl9pbmZvLnJlZ18yOTNjLCAweDAyOTNjKTsKKwl3cml0ZV9yZWcoaXR2LT55dXZfaW5mby5yZWdfMjk0MCwgMHgwMjk0MCk7CisJd3JpdGVfcmVnKGl0di0+eXV2X2luZm8ucmVnXzI5NDQsIDB4MDI5NDQpOworCXdyaXRlX3JlZyhpdHYtPnl1dl9pbmZvLnJlZ18yOTQ4LCAweDAyOTQ4KTsKKwl3cml0ZV9yZWcoaXR2LT55dXZfaW5mby5yZWdfMjk0YywgMHgwMjk0Yyk7CisJd3JpdGVfcmVnKGl0di0+eXV2X2luZm8ucmVnXzI5NTAsIDB4MDI5NTApOworCXdyaXRlX3JlZyhpdHYtPnl1dl9pbmZvLnJlZ18yOTU0LCAweDAyOTU0KTsKKwl3cml0ZV9yZWcoaXR2LT55dXZfaW5mby5yZWdfMjk1OCwgMHgwMjk1OCk7CisJd3JpdGVfcmVnKGl0di0+eXV2X2luZm8ucmVnXzI5NWMsIDB4MDI5NWMpOworCXdyaXRlX3JlZyhpdHYtPnl1dl9pbmZvLnJlZ18yOTYwLCAweDAyOTYwKTsKKwl3cml0ZV9yZWcoaXR2LT55dXZfaW5mby5yZWdfMjk2NCwgMHgwMjk2NCk7CisJd3JpdGVfcmVnKGl0di0+eXV2X2luZm8ucmVnXzI5NjgsIDB4MDI5NjgpOworCXdyaXRlX3JlZyhpdHYtPnl1dl9pbmZvLnJlZ18yOTZjLCAweDAyOTZjKTsKKwl3cml0ZV9yZWcoaXR2LT55dXZfaW5mby5yZWdfMjk3MCwgMHgwMjk3MCk7CisKKwkvKiBQcmVwYXJlIHRvIHJlc3RvcmUgZmlsdGVycyAqLworCisJLyogRmlyc3QgdGhlIGhvcml6b250YWwgZmlsdGVyICovCisJaWYgKChpdHYtPnl1dl9pbmZvLnJlZ18yODM0ICYgMHgwMDAwRkZGRikgPT0gKGl0di0+eXV2X2luZm8ucmVnXzI4MzQgPj4gMTYpKSB7CisJCS8qIEFuIGV4YWN0IHNpemUgbWF0Y2ggdXNlcyBmaWx0ZXIgMCAqLworCQloX2ZpbHRlciA9IDA7CisJfQorCWVsc2UgeworCQkvKiBGaWd1cmUgb3V0IHdoaWNoIGZpbHRlciB0byB1c2UgKi8KKwkJaF9maWx0ZXIgPSAoKGl0di0+eXV2X2luZm8ucmVnXzI4MzQgPDwgMTYpIC8gKGl0di0+eXV2X2luZm8ucmVnXzI4MzQgPj4gMTYpKSA+PiAxNTsKKwkJaF9maWx0ZXIgPSAoaF9maWx0ZXIgPj4gMSkgKyAoaF9maWx0ZXIgJiAxKTsKKwkJLyogT25seSBhbiBleGFjdCBzaXplIG1hdGNoIGNhbiB1c2UgZmlsdGVyIDAuICovCisJCWlmIChoX2ZpbHRlciA8IDEpIGhfZmlsdGVyID0gMTsKKwl9CisKKwkvKiBOb3cgdGhlIHZlcnRpY2FsIGZpbHRlciAqLworCWlmICgoaXR2LT55dXZfaW5mby5yZWdfMjkxOCAmIDB4MDAwMEZGRkYpID09IChpdHYtPnl1dl9pbmZvLnJlZ18yOTE4ID4+IDE2KSkgeworCQkvKiBBbiBleGFjdCBzaXplIG1hdGNoIHVzZXMgZmlsdGVyIDAvMSAqLworCQl2X2ZpbHRlcl8xID0gMDsKKwkJdl9maWx0ZXJfMiA9IDE7CisJfQorCWVsc2UgeworCQkvKiBGaWd1cmUgb3V0IHdoaWNoIGZpbHRlciB0byB1c2UgKi8KKwkJdl9maWx0ZXJfMSA9ICgoaXR2LT55dXZfaW5mby5yZWdfMjkxOCA8PCAxNikgLyAoaXR2LT55dXZfaW5mby5yZWdfMjkxOCA+PiAxNikpID4+IDE1OworCQl2X2ZpbHRlcl8xID0gKHZfZmlsdGVyXzEgPj4gMSkgKyAodl9maWx0ZXJfMSAmIDEpOworCQkvKiBPbmx5IGFuIGV4YWN0IHNpemUgbWF0Y2ggY2FuIHVzZSBmaWx0ZXIgMCAqLworCQlpZiAodl9maWx0ZXJfMSA9PSAwKSB2X2ZpbHRlcl8xID0gMTsKKwkJdl9maWx0ZXJfMiA9IHZfZmlsdGVyXzE7CisJfQorCisJLyogTm93IHJlc3RvcmUgdGhlIGZpbHRlcnMgKi8KKwlpdnR2X3l1dl9maWx0ZXIgKGl0dixoX2ZpbHRlcix2X2ZpbHRlcl8xLHZfZmlsdGVyXzIpOworCisJLyogYW5kIGNsZWFyIGEgZmV3IHJlZ2lzdGVycyAqLworCXdyaXRlX3JlZygwLCAweDAyODE0KTsKKwl3cml0ZV9yZWcoMCwgMHgwMjgyYyk7CisJd3JpdGVfcmVnKDAsIDB4MDI5MDQpOworCXdyaXRlX3JlZygwLCAweDAyOTEwKTsKKworCS8qIFJlbGVhc2UgdGhlIGJsYW5raW5nIGJ1ZmZlciAqLworCWlmIChpdHYtPnl1dl9pbmZvLmJsYW5raW5nX3B0cikgeworCQlrZnJlZSAoaXR2LT55dXZfaW5mby5ibGFua2luZ19wdHIpOworCQlpdHYtPnl1dl9pbmZvLmJsYW5raW5nX3B0ciA9IE5VTEw7CisJCXBjaV91bm1hcF9zaW5nbGUoaXR2LT5kZXYsIGl0di0+eXV2X2luZm8uYmxhbmtpbmdfZG1hcHRyLCA3MjAqMTYsIFBDSV9ETUFfVE9ERVZJQ0UpOworCX0KKworCS8qIEludmFsaWRhdGUgdGhlIG9sZCBkaW1lbnNpb24gaW5mb3JtYXRpb24gKi8KKwlpdHYtPnl1dl9pbmZvLm9sZF9mcmFtZV9pbmZvLnNyY193ID0gMDsKKwlpdHYtPnl1dl9pbmZvLm9sZF9mcmFtZV9pbmZvLnNyY19oID0gMDsKKwlpdHYtPnl1dl9pbmZvLm9sZF9mcmFtZV9pbmZvX2FyZ3Muc3JjX3cgPSAwOworCWl0di0+eXV2X2luZm8ub2xkX2ZyYW1lX2luZm9fYXJncy5zcmNfaCA9IDA7CisKKwkvKiBBbGwgZG9uZS4gKi8KKwljbGVhcl9iaXQoSVZUVl9GX0lfREVDT0RJTkdfWVVWLCAmaXR2LT5pX2ZsYWdzKTsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYteXV2LmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di15dXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODk3MmQzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYteXV2LmgKQEAgLTAsMCArMSwyNCBAQAorLyoKKyAgICB5dXYgc3VwcG9ydAorCisgICAgQ29weXJpZ2h0IChDKSAyMDA3ICBJYW4gQXJtc3Ryb25nIDxpYW5AaWFybXN0LmRlbW9uLmNvLnVrPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKK2ludCBpdnR2X3l1dl9maWx0ZXJfY2hlY2soc3RydWN0IGl2dHYgKml0dik7CitpbnQgaXZ0dl95dXZfcHJlcF9mcmFtZShzdHJ1Y3QgaXZ0diAqaXR2LCBzdHJ1Y3QgaXZ0dl9kbWFfZnJhbWUgKmFyZ3MpOwordm9pZCBpdnR2X3l1dl9jbG9zZShzdHJ1Y3QgaXZ0diAqaXR2KTsKK3ZvaWQgaXZ0dl95dXZfd29ya19oYW5kbGVyIChzdHJ1Y3QgaXZ0diAqaXR2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbWV5ZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9tZXllLmMKaW5kZXggOTg2ODFkYS4uNjY0YWJhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9tZXllLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9tZXllLmMKQEAgLTkyNSwxMyArOTI1LDEzIEBACiAJCWlmIChwLT5wYWxldHRlICE9IFZJREVPX1BBTEVUVEVfWVVWNDIyICYmIHAtPnBhbGV0dGUgIT0gVklERU9fUEFMRVRURV9ZVVlWKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCW11dGV4X2xvY2soJm1leWUubG9jayk7Ci0JCXNvbnlwaV9jYW1lcmFfY29tbWFuZChTT05ZUElfQ09NTUFORF9TRVRDQU1FUkFCUklHSFRORVNTLAorCQlzb255X3BpY19jYW1lcmFfY29tbWFuZChTT05ZX1BJQ19DT01NQU5EX1NFVENBTUVSQUJSSUdIVE5FU1MsCiAJCQkJICAgICAgcC0+YnJpZ2h0bmVzcyA+PiAxMCk7Ci0JCXNvbnlwaV9jYW1lcmFfY29tbWFuZChTT05ZUElfQ09NTUFORF9TRVRDQU1FUkFIVUUsCisJCXNvbnlfcGljX2NhbWVyYV9jb21tYW5kKFNPTllfUElDX0NPTU1BTkRfU0VUQ0FNRVJBSFVFLAogCQkJCSAgICAgIHAtPmh1ZSA+PiAxMCk7Ci0JCXNvbnlwaV9jYW1lcmFfY29tbWFuZChTT05ZUElfQ09NTUFORF9TRVRDQU1FUkFDT0xPUiwKKwkJc29ueV9waWNfY2FtZXJhX2NvbW1hbmQoU09OWV9QSUNfQ09NTUFORF9TRVRDQU1FUkFDT0xPUiwKIAkJCQkgICAgICBwLT5jb2xvdXIgPj4gMTApOwotCQlzb255cGlfY2FtZXJhX2NvbW1hbmQoU09OWVBJX0NPTU1BTkRfU0VUQ0FNRVJBQ09OVFJBU1QsCisJCXNvbnlfcGljX2NhbWVyYV9jb21tYW5kKFNPTllfUElDX0NPTU1BTkRfU0VUQ0FNRVJBQ09OVFJBU1QsCiAJCQkJICAgICAgcC0+Y29udHJhc3QgPj4gMTApOwogCQltZXllLnBpY3R1cmUgPSAqcDsKIAkJbXV0ZXhfdW5sb2NrKCZtZXllLmxvY2spOwpAQCAtMTA0MywxMSArMTA0MywxMSBAQAogCQkgICAgbWV5ZS5wYXJhbXMucXVhbGl0eSAhPSBqcC0+cXVhbGl0eSkKIAkJCW1jaGlwX2hpY19zdG9wKCk7CS8qIG5lZWQgcmVzdGFydCAqLwogCQltZXllLnBhcmFtcyA9ICpqcDsKLQkJc29ueXBpX2NhbWVyYV9jb21tYW5kKFNPTllQSV9DT01NQU5EX1NFVENBTUVSQVNIQVJQTkVTUywKKwkJc29ueV9waWNfY2FtZXJhX2NvbW1hbmQoU09OWV9QSUNfQ09NTUFORF9TRVRDQU1FUkFTSEFSUE5FU1MsCiAJCQkJICAgICAgbWV5ZS5wYXJhbXMuc2hhcnBuZXNzKTsKLQkJc29ueXBpX2NhbWVyYV9jb21tYW5kKFNPTllQSV9DT01NQU5EX1NFVENBTUVSQUFHQywKKwkJc29ueV9waWNfY2FtZXJhX2NvbW1hbmQoU09OWV9QSUNfQ09NTUFORF9TRVRDQU1FUkFBR0MsCiAJCQkJICAgICAgbWV5ZS5wYXJhbXMuYWdjKTsKLQkJc29ueXBpX2NhbWVyYV9jb21tYW5kKFNPTllQSV9DT01NQU5EX1NFVENBTUVSQVBJQ1RVUkUsCisJCXNvbnlfcGljX2NhbWVyYV9jb21tYW5kKFNPTllfUElDX0NPTU1BTkRfU0VUQ0FNRVJBUElDVFVSRSwKIAkJCQkgICAgICBtZXllLnBhcmFtcy5waWN0dXJlKTsKIAkJbXV0ZXhfdW5sb2NrKCZtZXllLmxvY2spOwogCQlicmVhazsKQEAgLTEyODcsMzggKzEyODcsMzggQEAKIAkJbXV0ZXhfbG9jaygmbWV5ZS5sb2NrKTsKIAkJc3dpdGNoIChjLT5pZCkgewogCQljYXNlIFY0TDJfQ0lEX0JSSUdIVE5FU1M6Ci0JCQlzb255cGlfY2FtZXJhX2NvbW1hbmQoCi0JCQkJU09OWVBJX0NPTU1BTkRfU0VUQ0FNRVJBQlJJR0hUTkVTUywgYy0+dmFsdWUpOworCQkJc29ueV9waWNfY2FtZXJhX2NvbW1hbmQoCisJCQkJU09OWV9QSUNfQ09NTUFORF9TRVRDQU1FUkFCUklHSFRORVNTLCBjLT52YWx1ZSk7CiAJCQltZXllLnBpY3R1cmUuYnJpZ2h0bmVzcyA9IGMtPnZhbHVlIDw8IDEwOwogCQkJYnJlYWs7CiAJCWNhc2UgVjRMMl9DSURfSFVFOgotCQkJc29ueXBpX2NhbWVyYV9jb21tYW5kKAotCQkJCVNPTllQSV9DT01NQU5EX1NFVENBTUVSQUhVRSwgYy0+dmFsdWUpOworCQkJc29ueV9waWNfY2FtZXJhX2NvbW1hbmQoCisJCQkJU09OWV9QSUNfQ09NTUFORF9TRVRDQU1FUkFIVUUsIGMtPnZhbHVlKTsKIAkJCW1leWUucGljdHVyZS5odWUgPSBjLT52YWx1ZSA8PCAxMDsKIAkJCWJyZWFrOwogCQljYXNlIFY0TDJfQ0lEX0NPTlRSQVNUOgotCQkJc29ueXBpX2NhbWVyYV9jb21tYW5kKAotCQkJCVNPTllQSV9DT01NQU5EX1NFVENBTUVSQUNPTlRSQVNULCBjLT52YWx1ZSk7CisJCQlzb255X3BpY19jYW1lcmFfY29tbWFuZCgKKwkJCQlTT05ZX1BJQ19DT01NQU5EX1NFVENBTUVSQUNPTlRSQVNULCBjLT52YWx1ZSk7CiAJCQltZXllLnBpY3R1cmUuY29udHJhc3QgPSBjLT52YWx1ZSA8PCAxMDsKIAkJCWJyZWFrOwogCQljYXNlIFY0TDJfQ0lEX1NBVFVSQVRJT046Ci0JCQlzb255cGlfY2FtZXJhX2NvbW1hbmQoCi0JCQkJU09OWVBJX0NPTU1BTkRfU0VUQ0FNRVJBQ09MT1IsIGMtPnZhbHVlKTsKKwkJCXNvbnlfcGljX2NhbWVyYV9jb21tYW5kKAorCQkJCVNPTllfUElDX0NPTU1BTkRfU0VUQ0FNRVJBQ09MT1IsIGMtPnZhbHVlKTsKIAkJCW1leWUucGljdHVyZS5jb2xvdXIgPSBjLT52YWx1ZSA8PCAxMDsKIAkJCWJyZWFrOwogCQljYXNlIFY0TDJfQ0lEX0FHQzoKLQkJCXNvbnlwaV9jYW1lcmFfY29tbWFuZCgKLQkJCQlTT05ZUElfQ09NTUFORF9TRVRDQU1FUkFBR0MsIGMtPnZhbHVlKTsKKwkJCXNvbnlfcGljX2NhbWVyYV9jb21tYW5kKAorCQkJCVNPTllfUElDX0NPTU1BTkRfU0VUQ0FNRVJBQUdDLCBjLT52YWx1ZSk7CiAJCQltZXllLnBhcmFtcy5hZ2MgPSBjLT52YWx1ZTsKIAkJCWJyZWFrOwogCQljYXNlIFY0TDJfQ0lEX1NIQVJQTkVTUzoKLQkJCXNvbnlwaV9jYW1lcmFfY29tbWFuZCgKLQkJCQlTT05ZUElfQ09NTUFORF9TRVRDQU1FUkFTSEFSUE5FU1MsIGMtPnZhbHVlKTsKKwkJCXNvbnlfcGljX2NhbWVyYV9jb21tYW5kKAorCQkJCVNPTllfUElDX0NPTU1BTkRfU0VUQ0FNRVJBU0hBUlBORVNTLCBjLT52YWx1ZSk7CiAJCQltZXllLnBhcmFtcy5zaGFycG5lc3MgPSBjLT52YWx1ZTsKIAkJCWJyZWFrOwogCQljYXNlIFY0TDJfQ0lEX1BJQ1RVUkU6Ci0JCQlzb255cGlfY2FtZXJhX2NvbW1hbmQoCi0JCQkJU09OWVBJX0NPTU1BTkRfU0VUQ0FNRVJBUElDVFVSRSwgYy0+dmFsdWUpOworCQkJc29ueV9waWNfY2FtZXJhX2NvbW1hbmQoCisJCQkJU09OWV9QSUNfQ09NTUFORF9TRVRDQU1FUkFQSUNUVVJFLCBjLT52YWx1ZSk7CiAJCQltZXllLnBhcmFtcy5waWN0dXJlID0gYy0+dmFsdWU7CiAJCQlicmVhazsKIAkJY2FzZSBWNEwyX0NJRF9KUEVHUVVBTDoKQEAgLTE4NDgsNyArMTg0OCw3IEBACiAJbWVtY3B5KG1leWUudmlkZW9fZGV2LCAmbWV5ZV90ZW1wbGF0ZSwgc2l6ZW9mKG1leWVfdGVtcGxhdGUpKTsKIAltZXllLnZpZGVvX2Rldi0+ZGV2ID0gJm1leWUubWNoaXBfZGV2LT5kZXY7CiAKLQlpZiAoKHJldCA9IHNvbnlwaV9jYW1lcmFfY29tbWFuZChTT05ZUElfQ09NTUFORF9TRVRDQU1FUkEsIDEpKSkgeworCWlmICgocmV0ID0gc29ueV9waWNfY2FtZXJhX2NvbW1hbmQoU09OWV9QSUNfQ09NTUFORF9TRVRDQU1FUkEsIDEpKSkgewogCQlwcmludGsoS0VSTl9FUlIgIm1leWU6IHVuYWJsZSB0byBwb3dlciBvbiB0aGUgY2FtZXJhXG4iKTsKIAkJcHJpbnRrKEtFUk5fRVJSICJtZXllOiBkaWQgeW91IGVuYWJsZSB0aGUgY2FtZXJhIGluICIKIAkJCQkic29ueXBpIHVzaW5nIHRoZSBtb2R1bGUgb3B0aW9ucyA/XG4iKTsKQEAgLTE5MjgsMTMgKzE5MjgsMTMgQEAKIAltZXllLnBhcmFtcy5waWN0dXJlID0gMDsKIAltZXllLnBhcmFtcy5mcmFtZXJhdGUgPSAwOwogCi0Jc29ueXBpX2NhbWVyYV9jb21tYW5kKFNPTllQSV9DT01NQU5EX1NFVENBTUVSQUJSSUdIVE5FU1MsIDMyKTsKLQlzb255cGlfY2FtZXJhX2NvbW1hbmQoU09OWVBJX0NPTU1BTkRfU0VUQ0FNRVJBSFVFLCAzMik7Ci0Jc29ueXBpX2NhbWVyYV9jb21tYW5kKFNPTllQSV9DT01NQU5EX1NFVENBTUVSQUNPTE9SLCAzMik7Ci0Jc29ueXBpX2NhbWVyYV9jb21tYW5kKFNPTllQSV9DT01NQU5EX1NFVENBTUVSQUNPTlRSQVNULCAzMik7Ci0Jc29ueXBpX2NhbWVyYV9jb21tYW5kKFNPTllQSV9DT01NQU5EX1NFVENBTUVSQVNIQVJQTkVTUywgMzIpOwotCXNvbnlwaV9jYW1lcmFfY29tbWFuZChTT05ZUElfQ09NTUFORF9TRVRDQU1FUkFQSUNUVVJFLCAwKTsKLQlzb255cGlfY2FtZXJhX2NvbW1hbmQoU09OWVBJX0NPTU1BTkRfU0VUQ0FNRVJBQUdDLCA0OCk7CisJc29ueV9waWNfY2FtZXJhX2NvbW1hbmQoU09OWV9QSUNfQ09NTUFORF9TRVRDQU1FUkFCUklHSFRORVNTLCAzMik7CisJc29ueV9waWNfY2FtZXJhX2NvbW1hbmQoU09OWV9QSUNfQ09NTUFORF9TRVRDQU1FUkFIVUUsIDMyKTsKKwlzb255X3BpY19jYW1lcmFfY29tbWFuZChTT05ZX1BJQ19DT01NQU5EX1NFVENBTUVSQUNPTE9SLCAzMik7CisJc29ueV9waWNfY2FtZXJhX2NvbW1hbmQoU09OWV9QSUNfQ09NTUFORF9TRVRDQU1FUkFDT05UUkFTVCwgMzIpOworCXNvbnlfcGljX2NhbWVyYV9jb21tYW5kKFNPTllfUElDX0NPTU1BTkRfU0VUQ0FNRVJBU0hBUlBORVNTLCAzMik7CisJc29ueV9waWNfY2FtZXJhX2NvbW1hbmQoU09OWV9QSUNfQ09NTUFORF9TRVRDQU1FUkFQSUNUVVJFLCAwKTsKKwlzb255X3BpY19jYW1lcmFfY29tbWFuZChTT05ZX1BJQ19DT01NQU5EX1NFVENBTUVSQUFHQywgNDgpOwogCiAJcHJpbnRrKEtFUk5fSU5GTyAibWV5ZTogTW90aW9uIEV5ZSBDYW1lcmEgRHJpdmVyIHYlcy5cbiIsCiAJICAgICAgIE1FWUVfRFJJVkVSX1ZFUlNJT04pOwpAQCAtMTk1Myw3ICsxOTUzLDcgQEAKIG91dHJlZ2lvbnM6CiAJcGNpX2Rpc2FibGVfZGV2aWNlKG1leWUubWNoaXBfZGV2KTsKIG91dGVuYWJsZWRldjoKLQlzb255cGlfY2FtZXJhX2NvbW1hbmQoU09OWVBJX0NPTU1BTkRfU0VUQ0FNRVJBLCAwKTsKKwlzb255X3BpY19jYW1lcmFfY29tbWFuZChTT05ZX1BJQ19DT01NQU5EX1NFVENBTUVSQSwgMCk7CiBvdXRzb255cGllbmFibGU6CiAJa2ZpZm9fZnJlZShtZXllLmRvbmVxKTsKIG91dGtmaWZvYWxsb2MyOgpAQCAtMTk4Niw3ICsxOTg2LDcgQEAKIAogCXBjaV9kaXNhYmxlX2RldmljZShtZXllLm1jaGlwX2Rldik7CiAKLQlzb255cGlfY2FtZXJhX2NvbW1hbmQoU09OWVBJX0NPTU1BTkRfU0VUQ0FNRVJBLCAwKTsKKwlzb255X3BpY19jYW1lcmFfY29tbWFuZChTT05ZX1BJQ19DT01NQU5EX1NFVENBTUVSQSwgMCk7CiAKIAlrZmlmb19mcmVlKG1leWUuZG9uZXEpOwogCWtmaWZvX2ZyZWUobWV5ZS5ncmFicSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL21leWUuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbWV5ZS5oCmluZGV4IGVhMTA3Y2IuLjMyM2QwMDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbWV5ZS5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbWV5ZS5oCkBAIC0yNTUsNyArMjU1LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiBTb255IFByb2dyYW1tYWJsZSBJL08gQ29udHJvbGxlciBmb3IgYWNjZXNzaW5nIHRoZSBjYW1lcmEgY29tbWFuZHMgKi8KLSNpbmNsdWRlIDxsaW51eC9zb255cGkuaD4KKyNpbmNsdWRlIDxsaW51eC9zb255LWxhcHRvcC5oPgogCiAvKiBwcml2YXRlIEFQSSBkZWZpbml0aW9ucyAqLwogI2luY2x1ZGUgPGxpbnV4L21leWUuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXNwMzQwMC1kcml2ZXIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXNwMzQwMC1kcml2ZXIuYwppbmRleCBiYTFhZjNjLi4zYmI3ZDY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL21zcDM0MDAtZHJpdmVyLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9tc3AzNDAwLWRyaXZlci5jCkBAIC03NzMsNiArNzczLDkgQEAKIAkJYnJlYWs7CiAJfQogCisJY2FzZSBWSURJT0NfR19DSElQX0lERU5UOgorCQlyZXR1cm4gdjRsMl9jaGlwX2lkZW50X2kyY19jbGllbnQoY2xpZW50LCBhcmcsIHN0YXRlLT5pZGVudCwgKHN0YXRlLT5yZXYxIDw8IDE2KSB8IHN0YXRlLT5yZXYyKTsKKwogCWRlZmF1bHQ6CiAJCS8qIHVua25vd24gKi8KIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC04NzIsNiArODc1LDggQEAKIAlzbnByaW50ZihjbGllbnQtPm5hbWUsIHNpemVvZihjbGllbnQtPm5hbWUpLCAiTVNQJWQ0JTAyZCVjLSVjJWQiLAogCQkJbXNwX2ZhbWlseSwgbXNwX3Byb2R1Y3QsCiAJCQltc3BfcmV2aXNpb24sIG1zcF9oYXJkLCBtc3Bfcm9tKTsKKwkvKiBSZXYgQj0yLCBDPTMsIEQ9NCwgRz03ICovCisJc3RhdGUtPmlkZW50ID0gbXNwX2ZhbWlseSAqIDEwMDAwICsgNDAwMCArIG1zcF9wcm9kdWN0ICogMTAgKyBtc3BfcmV2aXNpb24gLSAnQCc7CiAKIAkvKiBIYXMgTklDQU0gc3VwcG9ydDogYWxsIG1zcHg0MXggYW5kIG1zcHg0NXggcHJvZHVjdHMgaGF2ZSBOSUNBTSAqLwogCXN0YXRlLT5oYXNfbmljYW0gPSBtc3BfcHJvZF9oaSA9PSAxIHx8IG1zcF9wcm9kX2hpID09IDU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL21zcDM0MDAtZHJpdmVyLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL21zcDM0MDAtZHJpdmVyLmgKaW5kZXggNzUzMWVmYS4uYWI2OWEyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9tc3AzNDAwLWRyaXZlci5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXNwMzQwMC1kcml2ZXIuaApAQCAtNTAsNiArNTAsNyBAQAogCiBzdHJ1Y3QgbXNwX3N0YXRlIHsKIAlpbnQgcmV2MSwgcmV2MjsKKwlpbnQgaWRlbnQ7CiAJdTggaGFzX25pY2FtOwogCXU4IGhhc19yYWRpbzsKIAl1OCBoYXNfaGVhZHBob25lczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3Y3NjcwLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL292NzY3MC5jCmluZGV4IDVlZDBhZGMuLjAzYmMzNjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3Y3NjcwLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9vdjc2NzAuYwpAQCAtNSw2ICs1LDggQEAKICAqIGJ5IEpvbmF0aGFuIENvcmJldCB3aXRoIHN1YnN0YW50aWFsIGluc3BpcmF0aW9uIGZyb20gTWFyawogICogTWNDbGVsbGFuZCdzIG92Y2FtY2hpcCBjb2RlLgogICoKKyAqIENvcHlyaWdodCAyMDA2LTcgSm9uYXRoYW4gQ29yYmV0IDxjb3JiZXRAbHduLm5ldD4KKyAqCiAgKiBUaGlzIGZpbGUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwKICAqIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIuCiAgKi8KQEAgLTE1LDYgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNoaXAtaWRlbnQuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KIAogCkBAIC0xNjIsNiArMTY1LDEwIEBACiAKICNkZWZpbmUgUkVHX0dGSVgJMHg2OQkvKiBGaXggZ2FpbiBjb250cm9sICovCiAKKyNkZWZpbmUgUkVHX1JFRzc2CTB4NzYJLyogT1YncyBuYW1lICovCisjZGVmaW5lICAgUjc2X0JMS1BDT1IJICAweDgwCSAgLyogQmxhY2sgcGl4ZWwgY29ycmVjdGlvbiBlbmFibGUgKi8KKyNkZWZpbmUgICBSNzZfV0hUUENPUgkgIDB4NDAJICAvKiBXaGl0ZSBwaXhlbCBjb3JyZWN0aW9uIGVuYWJsZSAqLworCiAjZGVmaW5lIFJFR19SR0I0NDQJMHg4YwkvKiBSR0IgNDQ0IGNvbnRyb2wgKi8KICNkZWZpbmUgICBSNDQ0X0VOQUJMRQkgIDB4MDIJICAvKiBUdXJuIG9uIFJHQjQ0NCwgb3ZlcnJpZGVzIDV4NSAqLwogI2RlZmluZSAgIFI0NDRfUkdCWAkgIDB4MDEJICAvKiBFbXB0eSBuaWJibGUgYXQgZW5kICovCkBAIC0yNTUsNyArMjYyLDcgQEAKIAogCS8qIEFsbW9zdCBhbGwgb2YgdGhlc2UgYXJlIG1hZ2ljICJyZXNlcnZlZCIgdmFsdWVzLiAgKi8KIAl7IFJFR19DT001LCAweDYxIH0sCXsgUkVHX0NPTTYsIDB4NGIgfSwKLQl7IDB4MTYsIDB4MDIgfSwJCXsgUkVHX01WRlAsIDB4MDd8TVZGUF9NSVJST1IgfSwKKwl7IDB4MTYsIDB4MDIgfSwJCXsgUkVHX01WRlAsIDB4MDcgfSwKIAl7IDB4MjEsIDB4MDIgfSwJCXsgMHgyMiwgMHg5MSB9LAogCXsgMHgyOSwgMHgwNyB9LAkJeyAweDMzLCAweDBiIH0sCiAJeyAweDM1LCAweDBiIH0sCQl7IDB4MzcsIDB4MWQgfSwKQEAgLTM4MCw2ICszODcsMTMgQEAKIAl7IDB4ZmYsIDB4ZmYgfSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgcmVndmFsX2xpc3Qgb3Y3NjcwX2ZtdF9yYXdbXSA9IHsKKwl7IFJFR19DT003LCBDT003X0JBWUVSIH0sCisJeyBSRUdfQ09NMTMsIDB4MDggfSwgLyogTm8gZ2FtbWEsIG1hZ2ljIHJzdmQgYml0ICovCisJeyBSRUdfQ09NMTYsIDB4M2QgfSwgLyogRWRnZSBlbmhhbmNlbWVudCwgZGVub2lzZSAqLworCXsgUkVHX1JFRzc2LCAweGUxIH0sIC8qIFBpeCBjb3JyZWN0aW9uLCBtYWdpYyByc3ZkICovCisJeyAweGZmLCAweGZmIH0sCit9OwogCiAKIApAQCAtNDgzLDMyICs0OTcsMzkgQEAKIAlfX3UzMiBwaXhlbGZvcm1hdDsKIAlzdHJ1Y3QgcmVndmFsX2xpc3QgKnJlZ3M7CiAJaW50IGNtYXRyaXhbQ01BVFJJWF9MRU5dOworCWludCBicHA7ICAgLyogQnl0ZXMgcGVyIHBpeGVsICovCiB9IG92NzY3MF9mb3JtYXRzW10gPSB7CiAJewogCQkuZGVzYwkJPSAiWVVZViA0OjI6MiIsCiAJCS5waXhlbGZvcm1hdAk9IFY0TDJfUElYX0ZNVF9ZVVlWLAogCQkucmVncyAJCT0gb3Y3NjcwX2ZtdF95dXY0MjIsCiAJCS5jbWF0cml4CT0geyAxMjgsIC0xMjgsIDAsIC0zNCwgLTk0LCAxMjggfSwKKwkJLmJwcAkJPSAyLAogCX0sCiAJewogCQkuZGVzYwkJPSAiUkdCIDQ0NCIsCiAJCS5waXhlbGZvcm1hdAk9IFY0TDJfUElYX0ZNVF9SR0I0NDQsCiAJCS5yZWdzCQk9IG92NzY3MF9mbXRfcmdiNDQ0LAogCQkuY21hdHJpeAk9IHsgMTc5LCAtMTc5LCAwLCAtNjEsIC0xNzYsIDIyOCB9LAorCQkuYnBwCQk9IDIsCiAJfSwKIAl7CiAJCS5kZXNjCQk9ICJSR0IgNTY1IiwKIAkJLnBpeGVsZm9ybWF0CT0gVjRMMl9QSVhfRk1UX1JHQjU2NSwKIAkJLnJlZ3MJCT0gb3Y3NjcwX2ZtdF9yZ2I1NjUsCiAJCS5jbWF0cml4CT0geyAxNzksIC0xNzksIDAsIC02MSwgLTE3NiwgMjI4IH0sCisJCS5icHAJCT0gMiwKKwl9LAorCXsKKwkJLmRlc2MJCT0gIlJhdyBSR0IgQmF5ZXIiLAorCQkucGl4ZWxmb3JtYXQJPSBWNEwyX1BJWF9GTVRfU0JHR1I4LAorCQkucmVncyAJCT0gb3Y3NjcwX2ZtdF9yYXcsCisJCS5jbWF0cml4CT0geyAwLCAwLCAwLCAwLCAwLCAwIH0sCisJCS5icHAJCT0gMQogCX0sCiB9OwotI2RlZmluZSBOX09WNzY3MF9GTVRTIChzaXplb2Yob3Y3NjcwX2Zvcm1hdHMpL3NpemVvZihvdjc2NzBfZm9ybWF0c1swXSkpCisjZGVmaW5lIE5fT1Y3NjcwX0ZNVFMgQVJSQVlfU0laRShvdjc2NzBfZm9ybWF0cykKIAotLyoKLSAqIEFsbCBmb3JtYXRzIHdlIHN1cHBvcnQgYXJlIDIgYnl0ZXMvcGl4ZWwuCi0gKi8KLSNkZWZpbmUgQllURVNfUEVSX1BJWEVMIDIKIAogLyoKICAqIFRoZW4gdGhlcmUgaXMgdGhlIGlzc3VlIG9mIHdpbmRvdyBzaXplcy4gIFRyeSB0byBjYXB0dXJlIHRoZSBpbmZvIGhlcmUuCkBAIC02ODUsNyArNzA2LDcgQEAKIAkgKi8KIAlwaXgtPndpZHRoID0gd3NpemUtPndpZHRoOwogCXBpeC0+aGVpZ2h0ID0gd3NpemUtPmhlaWdodDsKLQlwaXgtPmJ5dGVzcGVybGluZSA9IHBpeC0+d2lkdGgqQllURVNfUEVSX1BJWEVMOworCXBpeC0+Ynl0ZXNwZXJsaW5lID0gcGl4LT53aWR0aCpvdjc2NzBfZm9ybWF0c1tpbmRleF0uYnBwOwogCXBpeC0+c2l6ZWltYWdlID0gcGl4LT5oZWlnaHQqcGl4LT5ieXRlc3BlcmxpbmU7CiAJcmV0dXJuIDA7CiB9CkBAIC0xMjcwLDkgKzEyOTEsOCBAQAogCQl2b2lkICphcmcpCiB7CiAJc3dpdGNoIChjbWQpIHsKLQljYXNlIFZJRElPQ19JTlRfR19DSElQX0lERU5UOgotCQkqIChlbnVtIHY0bDJfY2hpcF9pZGVudCAqKSBhcmcgPSBWNEwyX0lERU5UX09WNzY3MDsKLQkJcmV0dXJuIDA7CisJY2FzZSBWSURJT0NfR19DSElQX0lERU5UOgorCQlyZXR1cm4gdjRsMl9jaGlwX2lkZW50X2kyY19jbGllbnQoY2xpZW50LCBhcmcsIFY0TDJfSURFTlRfT1Y3NjcwLCAwKTsKIAogCWNhc2UgVklESU9DX0lOVF9SRVNFVDoKIAkJb3Y3NjcwX3Jlc2V0KGNsaWVudCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3BsYW5iLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3BsYW5iLmMKaW5kZXggODZkMjg4NC4uMTQ1NWE4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9wbGFuYi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcGxhbmIuYwpAQCAtMjE2MCw3ICsyMTYwLDcgQEAKIAlpZiAoIW1hY2hpbmVfaXMocG93ZXJtYWMpKQogCQlyZXR1cm4gMDsKIAotCXBsYW5iX2RldmljZXMgPSBmaW5kX2RldmljZXMoInBsYW5iIik7CisJcGxhbmJfZGV2aWNlcyA9IG9mX2ZpbmRfbm9kZV9ieV9uYW1lKE5VTEwsICJwbGFuYiIpOwogCWlmIChwbGFuYl9kZXZpY2VzID09IDApIHsKIAkJcGxhbmJfbnVtPTA7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIlBsYW5COiBubyBkZXZpY2UgZm91bmQhXG4iKTsKQEAgLTIxNzUsMTIgKzIxNzUsMTQgQEAKIAlpZiAocGxhbmJfZGV2aWNlcy0+bl9hZGRycyAhPSAxKSB7CiAJCXByaW50ayAoS0VSTl9XQVJOSU5HICJQbGFuQjogZXhwZWN0aW5nIDEgYWRkcmVzcyBmb3IgcGxhbmIgIgogCQkJIihnb3QgJWQpIiwgcGxhbmJfZGV2aWNlcy0+bl9hZGRycyk7CisJCW9mX25vZGVfcHV0KHBsYW5iX2RldmljZXMpOwogCQlyZXR1cm4gMDsKIAl9CiAKIAlpZiAocGxhbmJfZGV2aWNlcy0+bl9pbnRycyA9PSAwKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIlBsYW5COiBubyBpbnRycyBmb3IgZGV2aWNlICVzXG4iLAogCQkgICAgICAgcGxhbmJfZGV2aWNlcy0+ZnVsbF9uYW1lKTsKKwkJb2Zfbm9kZV9wdXQocGxhbmJfZGV2aWNlcyk7CiAJCXJldHVybiAwOwogCX0gZWxzZSB7CiAJCWlycSA9IHBsYW5iX2RldmljZXMtPmludHJzWzBdLmxpbmU7CkBAIC0yMjAyLDEyICsyMjA0LDEzIEBACiAJY29uZnJlZyA9IHBsYW5iX2RldmljZXMtPmFkZHJzWzBdLnNwYWNlICYgMHhmZjsKIAlvbGRfYmFzZSA9IHBsYW5iX2RldmljZXMtPmFkZHJzWzBdLmFkZHJlc3M7CiAJbmV3X2Jhc2UgPSAweGYxMDAwMDAwOworCW9mX25vZGVfcHV0KHBsYW5iX2RldmljZXMpOwogCiAJREVCVUcoIlBsYW5COiBGb3VuZCBvbiBidXMgJWQsIGRldiAlZCwgZnVuYyAlZCwgIgogCQkibWVtYmFzZSAweCV4IChiYXNlIHJlZy4gMHgleClcbiIsCiAJCWJ1cywgUENJX1NMT1QoZGV2X2ZuKSwgUENJX0ZVTkMoZGV2X2ZuKSwgb2xkX2Jhc2UsIGNvbmZyZWcpOwogCi0JcGRldiA9IHBjaV9maW5kX3Nsb3QgKGJ1cywgZGV2X2ZuKTsKKwlwZGV2ID0gcGNpX2dldF9idXNfYW5kX3Nsb3QoYnVzLCBkZXZfZm4pOwogCWlmICghcGRldikgewogCQlwcmludGsoS0VSTl9FUlIgInBsYW5iOiBjYW5ub3QgZmluZCBzbG90XG4iKTsKIAkJZ290byBlcnJfb3V0OwpAQCAtMjIzNyw2ICsyMjQwLDcgQEAKIAlwYi0+cGxhbmJfYmFzZSA9IHBsYW5iX3JlZ3M7CiAJcGItPnBsYW5iX2Jhc2VfcGh5cyA9IChzdHJ1Y3QgcGxhbmJfcmVnaXN0ZXJzICopbmV3X2Jhc2U7CiAJcGItPmlycQk9IGlycTsKKwlwYi0+ZGV2ID0gcGRldjsKIAogCXJldHVybiBwbGFuYl9udW07CiAKQEAgLTIyNDQsNiArMjI0OCw3IEBACiAJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwogZXJyX291dDoKIAkvKiBGSVhNRSBoYW5kbGUgZXJyb3IgKi8gICAvKiBjb21tZW50IG1vdmVkIGZyb20gcGNpX2ZpbmRfc2xvdCwgYWJvdmUgKi8KKwlwY2lfZGV2X3B1dChwZGV2KTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjI3MSw2ICsyMjc2LDggQEAKIAkJcHJpbnRrKEtFUk5fSU5GTyAiUGxhbkI6IHVucmVnaXN0ZXJpbmcgd2l0aCB2NGxcbiIpOwogCQl2aWRlb191bnJlZ2lzdGVyX2RldmljZSgmcGItPnZpZGVvX2Rldik7CiAKKwkJcGNpX2Rldl9wdXQocGItPmRldik7CisKIAkJLyogbm90ZSB0aGF0IGlvdW5tYXAoKSBkb2VzIG5vdGhpbmcgb24gdGhlIFBQQyByaWdodCBub3cgKi8KIAkJaW91bm1hcCAoKHZvaWQgKilwYi0+cGxhbmJfYmFzZSk7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9wbGFuYi5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9wbGFuYi5oCmluZGV4IDkyODIzMjEuLmUyMWI1NzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcGxhbmIuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3BsYW5iLmgKQEAgLTE3Nyw2ICsxNzcsNyBAQAogCXN0cnVjdCBtdXRleCBsb2NrOwogCXVuc2lnbmVkIGludAlpcnE7CQkJLyogaW50ZXJydXB0IG51bWJlciAqLwogCXZvbGF0aWxlIHVuc2lnbmVkIGludCBpbnRyX21hc2s7CisJc3RydWN0IHBjaV9kZXYgKmRldjsJCQkvKiBPdXIgUENJIGRldmljZSAqLwogCiAJaW50CW92ZXJsYXk7CQkJLyogb3ZlcmxheSBydW5uaW5nPyAqLwogCXN0cnVjdAlwbGFuYl93aW5kb3cgd2luOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItZW5jb2Rlci5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItZW5jb2Rlci5jCmluZGV4IDU3ODZmYWYuLjU2NjljOGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWVuY29kZXIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi1lbmNvZGVyLmMKQEAgLTMyNCw3ICszMjQsNyBAQAogCiAvKiBUaGlzIGltcGxlbWVudHMgc29tZSBleHRyYSBzZXR1cCBmb3IgdGhlIGVuY29kZXIgdGhhdCBzZWVtcyB0byBiZQogICAgc3BlY2lmaWMgdG8gdGhlIFBWUiBVU0IyIGhhcmR3YXJlLiAqLwotaW50IHB2cjJfZW5jb2Rlcl9wcmVwX2NvbmZpZyhzdHJ1Y3QgcHZyMl9oZHcgKmhkdykKK3N0YXRpYyBpbnQgcHZyMl9lbmNvZGVyX3ByZXBfY29uZmlnKHN0cnVjdCBwdnIyX2hkdyAqaGR3KQogewogCWludCByZXQgPSAwOwogCWludCBlbmNNaXNjM0FyZyA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi1oZHctaW50ZXJuYWwuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWhkdy1pbnRlcm5hbC5oCmluZGV4IDE2YmQ3NDEuLmNlNjZhYjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWhkdy1pbnRlcm5hbC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWhkdy1pbnRlcm5hbC5oCkBAIC0yODMsNiArMjgzLDggQEAKIAlpbnQgdW5pdF9udW1iZXI7ICAgICAgICAgICAgIC8qIElEIGZvciBkcml2ZXIgaW5zdGFuY2UgKi8KIAl1bnNpZ25lZCBsb25nIHNlcmlhbF9udW1iZXI7IC8qIElEIGZvciBoYXJkd2FyZSBpdHNlbGYgKi8KIAorCWNoYXIgYnVzX2luZm9bMzJdOyAvKiBCdXMgbG9jYXRpb24gaW5mbyAqLworCiAJLyogTWlub3IgbnVtYmVycyB1c2VkIGJ5IHY0bCBsb2dpYyAoeWVzLCB0aGlzIGlzIGEgaGFjaywgYXMgdGhlcmUKIAkgICBzaG91bGQgYmUgbm8gdjRsIGp1bmsgaGVyZSkuICBQcm9iYWJseSBhIGJldHRlciB3YXkgdG8gZG8gdGhpcy4gKi8KIAlpbnQgdjRsX21pbm9yX251bWJlcl92aWRlbzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWhkdy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItaGR3LmMKaW5kZXggOTkxNmNmMy4uYWNmNjUxZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItaGR3LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItaGR3LmMKQEAgLTEwMDgsNiArMTAwOCwxMyBAQAogCXJldHVybiBoZHctPnNlcmlhbF9udW1iZXI7CiB9CiAKKworY29uc3QgY2hhciAqcHZyMl9oZHdfZ2V0X2J1c19pbmZvKHN0cnVjdCBwdnIyX2hkdyAqaGR3KQoreworCXJldHVybiBoZHctPmJ1c19pbmZvOworfQorCisKIHVuc2lnbmVkIGxvbmcgcHZyMl9oZHdfZ2V0X2N1cl9mcmVxKHN0cnVjdCBwdnIyX2hkdyAqaGR3KQogewogCXJldHVybiBoZHctPmZyZXFTZWxlY3RvciA/IGhkdy0+ZnJlcVZhbFRlbGV2aXNpb24gOiBoZHctPmZyZXFWYWxSYWRpbzsKQEAgLTIxMDUsNiArMjExMiwxMSBAQAogCWhkdy0+dXNiX2ludGYgPSBpbnRmOwogCWhkdy0+dXNiX2RldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CiAKKwlzY25wcmludGYoaGR3LT5idXNfaW5mbyxzaXplb2YoaGR3LT5idXNfaW5mbyksCisJCSAgInVzYiAlcyBhZGRyZXNzICVkIiwKKwkJICBoZHctPnVzYl9kZXYtPmRldi5idXNfaWQsCisJCSAgaGR3LT51c2JfZGV2LT5kZXZudW0pOworCiAJaWZudW0gPSBoZHctPnVzYl9pbnRmLT5jdXJfYWx0c2V0dGluZy0+ZGVzYy5iSW50ZXJmYWNlTnVtYmVyOwogCXVzYl9zZXRfaW50ZXJmYWNlKGhkdy0+dXNiX2RldixpZm51bSwwKTsKIApAQCAtMzI3NSw3ICszMjg3LDkgQEAKIAltdXRleF9sb2NrKCZoZHctPmkyY19saXN0X2xvY2spOyBkbyB7CiAJCWxpc3RfZm9yX2VhY2goaXRlbSwmaGR3LT5pMmNfY2xpZW50cykgewogCQkJY3AgPSBsaXN0X2VudHJ5KGl0ZW0sc3RydWN0IHB2cjJfaTJjX2NsaWVudCxsaXN0KTsKLQkJCWlmICghdjRsMl9jaGlwX21hdGNoX2kyY19jbGllbnQoY3AtPmNsaWVudCwgcmVxLm1hdGNoX3R5cGUsIHJlcS5tYXRjaF9jaGlwKSkgeworCQkJaWYgKCF2NGwyX2NoaXBfbWF0Y2hfaTJjX2NsaWVudCgKKwkJCQkgICAgY3AtPmNsaWVudCwKKwkJCQkgICAgcmVxLm1hdGNoX3R5cGUsIHJlcS5tYXRjaF9jaGlwKSkgewogCQkJCWNvbnRpbnVlOwogCQkJfQogCQkJc3RhdCA9IHB2cjJfaTJjX2NsaWVudF9jbWQoCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi1oZHcuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWhkdy5oCmluZGV4IDBjOWNjYTQuLjRkYmE4ZDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWhkdy5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWhkdy5oCkBAIC0xMjQsNiArMTI0LDkgQEAKIC8qIFJldHJpZXZlIHNlcmlhbCBudW1iZXIgb2YgZGV2aWNlICovCiB1bnNpZ25lZCBsb25nIHB2cjJfaGR3X2dldF9zbihzdHJ1Y3QgcHZyMl9oZHcgKik7CiAKKy8qIFJldHJpZXZlIGJ1cyBsb2NhdGlvbiBpbmZvIG9mIGRldmljZSAqLworY29uc3QgY2hhciAqcHZyMl9oZHdfZ2V0X2J1c19pbmZvKHN0cnVjdCBwdnIyX2hkdyAqKTsKKwogLyogQ2FsbGVkIHdoZW4gaGFyZHdhcmUgaGFzIGJlZW4gdW5wbHVnZ2VkICovCiB2b2lkIHB2cjJfaGR3X2Rpc2Nvbm5lY3Qoc3RydWN0IHB2cjJfaGR3ICopOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi1zeXNmcy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItc3lzZnMuYwppbmRleCA5MTM5NmZkLi5hNzQxYzU1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItc3lzZnMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi1zeXNmcy5jCkBAIC00Miw5ICs0MiwxMSBAQAogCXN0cnVjdCBjbGFzc19kZXZpY2VfYXR0cmlidXRlIGF0dHJfdjRsX21pbm9yX251bWJlcjsKIAlzdHJ1Y3QgY2xhc3NfZGV2aWNlX2F0dHJpYnV0ZSBhdHRyX3Y0bF9yYWRpb19taW5vcl9udW1iZXI7CiAJc3RydWN0IGNsYXNzX2RldmljZV9hdHRyaWJ1dGUgYXR0cl91bml0X251bWJlcjsKKwlzdHJ1Y3QgY2xhc3NfZGV2aWNlX2F0dHJpYnV0ZSBhdHRyX2J1c19pbmZvOwogCWludCB2NGxfbWlub3JfbnVtYmVyX2NyZWF0ZWRfb2s7CiAJaW50IHY0bF9yYWRpb19taW5vcl9udW1iZXJfY3JlYXRlZF9vazsKIAlpbnQgdW5pdF9udW1iZXJfY3JlYXRlZF9vazsKKwlpbnQgYnVzX2luZm9fY3JlYXRlZF9vazsKIH07CiAKICNpZmRlZiBDT05GSUdfVklERU9fUFZSVVNCMl9ERUJVR0lGQwpAQCAtNzA1LDYgKzcwNywxMCBAQAogCXB2cjJfc3lzZnNfdGVhcl9kb3duX2RlYnVnaWZjKHNmcCk7CiAjZW5kaWYgLyogQ09ORklHX1ZJREVPX1BWUlVTQjJfREVCVUdJRkMgKi8KIAlwdnIyX3N5c2ZzX3RlYXJfZG93bl9jb250cm9scyhzZnApOworCWlmIChzZnAtPmJ1c19pbmZvX2NyZWF0ZWRfb2spIHsKKwkJY2xhc3NfZGV2aWNlX3JlbW92ZV9maWxlKHNmcC0+Y2xhc3NfZGV2LAorCQkJCQkgJnNmcC0+YXR0cl9idXNfaW5mbyk7CisJfQogCWlmIChzZnAtPnY0bF9taW5vcl9udW1iZXJfY3JlYXRlZF9vaykgewogCQljbGFzc19kZXZpY2VfcmVtb3ZlX2ZpbGUoc2ZwLT5jbGFzc19kZXYsCiAJCQkJCSAmc2ZwLT5hdHRyX3Y0bF9taW5vcl9udW1iZXIpOwpAQCAtNzM1LDYgKzc0MSwxNiBAQAogfQogCiAKK3N0YXRpYyBzc2l6ZV90IGJ1c19pbmZvX3Nob3coc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2LGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgcHZyMl9zeXNmcyAqc2ZwOworCXNmcCA9IChzdHJ1Y3QgcHZyMl9zeXNmcyAqKWNsYXNzX2Rldi0+Y2xhc3NfZGF0YTsKKwlpZiAoIXNmcCkgcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIHNjbnByaW50ZihidWYsUEFHRV9TSVpFLCIlc1xuIiwKKwkJCSBwdnIyX2hkd19nZXRfYnVzX2luZm8oc2ZwLT5jaGFubmVsLmhkdykpOworfQorCisKIHN0YXRpYyBzc2l6ZV90IHY0bF9yYWRpb19taW5vcl9udW1iZXJfc2hvdyhzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXYsCiAJCQkJCSAgIGNoYXIgKmJ1ZikKIHsKQEAgLTgzNiw2ICs4NTIsMjAgQEAKIAkJc2ZwLT51bml0X251bWJlcl9jcmVhdGVkX29rID0gITA7CiAJfQogCisJc2ZwLT5hdHRyX2J1c19pbmZvLmF0dHIub3duZXIgPSBUSElTX01PRFVMRTsKKwlzZnAtPmF0dHJfYnVzX2luZm8uYXR0ci5uYW1lID0gImJ1c19pbmZvX3N0ciI7CisJc2ZwLT5hdHRyX2J1c19pbmZvLmF0dHIubW9kZSA9IFNfSVJVR087CisJc2ZwLT5hdHRyX2J1c19pbmZvLnNob3cgPSBidXNfaW5mb19zaG93OworCXNmcC0+YXR0cl9idXNfaW5mby5zdG9yZSA9IE5VTEw7CisJcmV0ID0gY2xhc3NfZGV2aWNlX2NyZWF0ZV9maWxlKHNmcC0+Y2xhc3NfZGV2LAorCQkJCSAgICAgICAmc2ZwLT5hdHRyX2J1c19pbmZvKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogY2xhc3NfZGV2aWNlX2NyZWF0ZV9maWxlIGVycm9yOiAlZFxuIiwKKwkJICAgICAgIF9fRlVOQ1RJT05fXywgcmV0KTsKKwl9IGVsc2UgeworCQlzZnAtPmJ1c19pbmZvX2NyZWF0ZWRfb2sgPSAhMDsKKwl9CisKIAlwdnIyX3N5c2ZzX2FkZF9jb250cm9scyhzZnApOwogI2lmZGVmIENPTkZJR19WSURFT19QVlJVU0IyX0RFQlVHSUZDCiAJcHZyMl9zeXNmc19hZGRfZGVidWdpZmMoc2ZwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLXY0bDIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLXY0bDIuYwppbmRleCAyNWQzODMwLi40NTYzYjNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi12NGwyLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItdjRsMi5jCkBAIC0yMDMsNiArMjAzLDggQEAKIAkJc3RydWN0IHY0bDJfY2FwYWJpbGl0eSAqY2FwID0gYXJnOwogCiAJCW1lbWNweShjYXAsICZwdnJfY2FwYWJpbGl0eSwgc2l6ZW9mKHN0cnVjdCB2NGwyX2NhcGFiaWxpdHkpKTsKKwkJc3RybGNweShjYXAtPmJ1c19pbmZvLHB2cjJfaGR3X2dldF9idXNfaW5mbyhoZHcpLAorCQkJc2l6ZW9mKGNhcC0+YnVzX2luZm8pKTsKIAogCQlyZXQgPSAwOwogCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy1jdHJsLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtY3RybC5jCmluZGV4IDBiZDExNTUuLjMzOGNlZDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy1jdHJsLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLWN0cmwuYwpAQCAtMTQwLDYgKzE0MCw4IEBACiAgICBBbiBhbHRlcm5hdGUgdmFsdWUgb2YgMCBtZWFucyB0aGlzIG1vZGUgaXMgbm90IGF2YWlsYWJsZSBhdCBhbGwuCiAgKi8KIAorI2RlZmluZSBQV0NfRlBTX01BWF9OQUxBIDgKKwogc3RydWN0IE5hbGFfdGFibGVfZW50cnkgewogCWNoYXIgYWx0ZXJuYXRlOwkJCS8qIFVTQiBhbHRlcm5hdGUgc2V0dGluZyAqLwogCWludCBjb21wcmVzc2VkOwkJCS8qIENvbXByZXNzZWQgeWVzL25vICovCkBAIC0xNDcsNyArMTQ5LDkgQEAKIAl1bnNpZ25lZCBjaGFyIG1vZGVbM107CQkvKiBwcmVjb21wdXRlZCBtb2RlIHRhYmxlICovCiB9OwogCi1zdGF0aWMgc3RydWN0IE5hbGFfdGFibGVfZW50cnkgTmFsYV90YWJsZVtQU1pfTUFYXVs4XSA9CitzdGF0aWMgdW5zaWduZWQgaW50IE5hbGFfZnBzX3ZlY3RvcltQV0NfRlBTX01BWF9OQUxBXSA9IHsgNCwgNSwgNywgMTAsIDEyLCAxNSwgMjAsIDI0IH07CisKK3N0YXRpYyBzdHJ1Y3QgTmFsYV90YWJsZV9lbnRyeSBOYWxhX3RhYmxlW1BTWl9NQVhdW1BXQ19GUFNfTUFYX05BTEFdID0KIHsKICNpbmNsdWRlICJwd2MtbmFsYS5oIgogfTsKQEAgLTQyMyw2ICs0MjcsNTkgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHVuc2lnbmVkIGludCBwd2NfZ2V0X2Zwc19OYWxhKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCB1bnNpZ25lZCBpbnQgaW5kZXgsIHVuc2lnbmVkIGludCBzaXplKQoreworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IFBXQ19GUFNfTUFYX05BTEE7IGkrKykgeworCQlpZiAoTmFsYV90YWJsZVtzaXplXVtpXS5hbHRlcm5hdGUpIHsKKwkJCWlmIChpbmRleC0tPT0wKSByZXR1cm4gTmFsYV9mcHNfdmVjdG9yW2ldOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHB3Y19nZXRfZnBzX0tpYXJhKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCB1bnNpZ25lZCBpbnQgaW5kZXgsIHVuc2lnbmVkIGludCBzaXplKQoreworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IFBXQ19GUFNfTUFYX0tJQVJBOyBpKyspIHsKKwkJaWYgKEtpYXJhX3RhYmxlW3NpemVdW2ldWzNdLmFsdGVybmF0ZSkgeworCQkJaWYgKGluZGV4LS09PTApIHJldHVybiBLaWFyYV9mcHNfdmVjdG9yW2ldOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHB3Y19nZXRfZnBzX1RpbW9uKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCB1bnNpZ25lZCBpbnQgaW5kZXgsIHVuc2lnbmVkIGludCBzaXplKQoreworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpPTA7IGkgPCBQV0NfRlBTX01BWF9USU1PTjsgaSsrKSB7CisJCWlmIChUaW1vbl90YWJsZVtzaXplXVtpXVszXS5hbHRlcm5hdGUpIHsKKwkJCWlmIChpbmRleC0tPT0wKSByZXR1cm4gVGltb25fZnBzX3ZlY3RvcltpXTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKwordW5zaWduZWQgaW50IHB3Y19nZXRfZnBzKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCB1bnNpZ25lZCBpbnQgaW5kZXgsIHVuc2lnbmVkIGludCBzaXplKQoreworCXVuc2lnbmVkIGludCByZXQ7CisKKwlpZiAoREVWSUNFX1VTRV9DT0RFQzEocGRldi0+dHlwZSkpIHsKKwkJcmV0ID0gcHdjX2dldF9mcHNfTmFsYShwZGV2LCBpbmRleCwgc2l6ZSk7CisKKwl9IGVsc2UgaWYgKERFVklDRV9VU0VfQ09ERUMzKHBkZXYtPnR5cGUpKSB7CisJCXJldCA9IHB3Y19nZXRfZnBzX0tpYXJhKHBkZXYsIGluZGV4LCBzaXplKTsKKworCX0gZWxzZSB7CisJCXJldCA9IHB3Y19nZXRfZnBzX1RpbW9uKHBkZXYsIGluZGV4LCBzaXplKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCiAjZGVmaW5lIEJMQUNLX1kgMAogI2RlZmluZSBCTEFDS19VIDEyOAogI2RlZmluZSBCTEFDS19WIDEyOApAQCAtMTM0Myw3ICsxNDAwLDcgQEAKIAkJCQlyZXQgPSBwd2NfcmVhZF9yZWRfZ2FpbihwZGV2LCAmQVJHUih3YikucmVhZF9yZWQpOwogCQkJCWlmIChyZXQgPCAwKQogCQkJCQlicmVhazsKLQkJCQlyZXQgPXB3Y19yZWFkX2JsdWVfZ2FpbihwZGV2LCAmQVJHUih3YikucmVhZF9ibHVlKTsKKwkJCQlyZXQgPSBwd2NfcmVhZF9ibHVlX2dhaW4ocGRldiwgJkFSR1Iod2IpLnJlYWRfYmx1ZSk7CiAJCQkJaWYgKHJldCA8IDApCiAJCQkJCWJyZWFrOwogCQkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLWlmLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtaWYuYwppbmRleCAyN2VkNzY5Li4wODUzMzJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtaWYuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtaWYuYwpAQCAtOTUsOCArOTUsOCBAQAogCXsgVVNCX0RFVklDRSgweDA0NkQsIDB4MDhCMykgfSwgLyogTG9naXRlY2ggUXVpY2tDYW0gWm9vbSAob2xkIG1vZGVsKSAqLwogCXsgVVNCX0RFVklDRSgweDA0NkQsIDB4MDhCNCkgfSwgLyogTG9naXRlY2ggUXVpY2tDYW0gWm9vbSAobmV3IG1vZGVsKSAqLwogCXsgVVNCX0RFVklDRSgweDA0NkQsIDB4MDhCNSkgfSwgLyogTG9naXRlY2ggUXVpY2tDYW0gT3JiaXQvU3BoZXJlICovCi0JeyBVU0JfREVWSUNFKDB4MDQ2RCwgMHgwOEI2KSB9LCAvKiBMb2dpdGVjaCAocmVzZXJ2ZWQpICovCi0JeyBVU0JfREVWSUNFKDB4MDQ2RCwgMHgwOEI3KSB9LCAvKiBMb2dpdGVjaCAocmVzZXJ2ZWQpICovCisJeyBVU0JfREVWSUNFKDB4MDQ2RCwgMHgwOEI2KSB9LCAvKiBDaXNjbyBWVCBDYW1lcmEgKi8KKwl7IFVTQl9ERVZJQ0UoMHgwNDZELCAweDA4QjcpIH0sIC8qIExvZ2l0ZWNoIFZpZXdQb3J0IEFWIDEwMCAqLwogCXsgVVNCX0RFVklDRSgweDA0NkQsIDB4MDhCOCkgfSwgLyogTG9naXRlY2ggKHJlc2VydmVkKSAqLwogCXsgVVNCX0RFVklDRSgweDA1NUQsIDB4OTAwMCkgfSwgLyogU2Ftc3VuZyBNUEMtQzEwICovCiAJeyBVU0JfREVWSUNFKDB4MDU1RCwgMHg5MDAxKSB9LCAvKiBTYW1zdW5nIE1QQy1DMzAgKi8KQEAgLTE0OTMsNyArMTQ5Myw3IEBACiAJCWNhc2UgMHgwMzI5OgogCQkJUFdDX0lORk8oIlBoaWxpcHMgU1BDIDkwME5DIFVTQiB3ZWJjYW0gZGV0ZWN0ZWQuXG4iKTsKIAkJCW5hbWUgPSAiUGhpbGlwcyBTUEMgOTAwTkMgd2ViY2FtIjsKLQkJCXR5cGVfaWQgPSA3MjA7CisJCQl0eXBlX2lkID0gNzQwOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTE1NDcsOCArMTU0NywxNiBAQAogCQkJZmVhdHVyZXMgfD0gRkVBVFVSRV9NT1RPUl9QQU5USUxUOwogCQkJYnJlYWs7CiAJCWNhc2UgMHgwOGI2OgorCQkJUFdDX0lORk8oIkxvZ2l0ZWNoL0Npc2NvIFZUIENhbWVyYSB3ZWJjYW0gZGV0ZWN0ZWQuXG4iKTsKKwkJCW5hbWUgPSAiQ2lzY28gVlQgQ2FtZXJhIjsKKwkJCXR5cGVfaWQgPSA3NDA7IC8qIENDRCBzZW5zb3IgKi8KKwkJCWJyZWFrOwogCQljYXNlIDB4MDhiNzoKLQkJY2FzZSAweDA4Yjg6CisJCQlQV0NfSU5GTygiTG9naXRlY2ggVmlld1BvcnQgQVYgMTAwIHdlYmNhbSBkZXRlY3RlZC5cbiIpOworCQkJbmFtZSA9ICJMb2dpdGVjaCBWaWV3UG9ydCBBViAxMDAiOworCQkJdHlwZV9pZCA9IDc0MDsgLyogQ0NEIHNlbnNvciAqLworCQkJYnJlYWs7CisJCWNhc2UgMHgwOGI4OiAvKiBXaGVyZSB0aGlzIHJlbGVhc2VkPyAqLwogCQkJUFdDX0lORk8oIkxvZ2l0ZWNoIFF1aWNrQ2FtIGRldGVjdGVkIChyZXNlcnZlZCBJRCkuXG4iKTsKIAkJCW5hbWUgPSAiTG9naXRlY2ggUXVpY2tDYW0gKHJlcy4pIjsKIAkJCXR5cGVfaWQgPSA3MzA7IC8qIEFzc3VtaW5nIENNT1MgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy1pb2N0bC5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLWlvY3RsLmgKaW5kZXggNzg0YmM3Mi4uY2VjNjYwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLWlvY3RsLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLWlvY3RsLmgKQEAgLTIsNyArMiw3IEBACiAjZGVmaW5lIFBXQ19JT0NUTF9ICiAKIC8qIChDKSAyMDAxLTIwMDQgTmVtb3NvZnQgVW52LgotICAgKEMpIDIwMDQgICAgICBMdWMgU2FpbGxhcmQgKGx1Y0BzYWlsbGFyZC5vcmcpCisgICAoQykgMjAwNC0yMDA2IEx1YyBTYWlsbGFyZCAobHVjQHNhaWxsYXJkLm9yZykKIAogICAgTk9URTogdGhpcyB2ZXJzaW9uIG9mIHB3YyBpcyBhbiB1bm9mZmljaWFsIChtb2RpZmllZCkgcmVsZWFzZSBvZiBwd2MgJiBwY3d4CiAgICBkcml2ZXIgYW5kIHRodXMgbWF5IGhhdmUgYnVncyB0aGF0IGFyZSBub3QgcHJlc2VudCBpbiB0aGUgb3JpZ2luYWwgdmVyc2lvbi4KQEAgLTI1LDcgKzI1LDcgQEAKICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICovCiAKLS8qIFRoaXMgaXMgcHdjLWlvY3RsLmggYmVsb25naW5nIHRvIFBXQyA4LjEyLjEKKy8qIFRoaXMgaXMgcHdjLWlvY3RsLmggYmVsb25naW5nIHRvIFBXQyAxMC4wLjEwCiAgICBJdCBjb250YWlucyBzdHJ1Y3R1cmVzIGFuZCBkZWZpbmVzIHRvIGNvbW11bmljYXRlIGZyb20gdXNlciBzcGFjZQogICAgZGlyZWN0bHkgdG8gdGhlIGRyaXZlci4KICAqLwpAQCAtNTEsNiArNTEsOSBAQAogCSAgICAgLi4uIAl0aGUgZnVuY3Rpb24KICAqLwogCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisKIAogIC8qIEVudW1lcmF0aW9uIG9mIGltYWdlIHNpemVzICovCiAjZGVmaW5lIFBTWl9TUUNJRgkweDAwCkBAIC02NSw2ICs2OCw4IEBACiAvKiBUaGUgZnJhbWUgcmF0ZSBpcyBlbmNvZGVkIGluIHRoZSB2aWRlb193aW5kb3cuZmxhZ3MgcGFyYW1ldGVyIHVzaW5nCiAgICB0aGUgdXBwZXIgMTYgYml0cywgc2luY2Ugc29tZSBmbGFncyBhcmUgZGVmaW5lZCBub3dhZGF5cy4gVGhlIGZvbGxvd2luZwogICAgZGVmaW5lcyBwcm92aWRlIGEgbWFzayBhbmQgc2hpZnQgdG8gZmlsdGVyIG91dCB0aGlzIHZhbHVlLgorICAgVGhpcyB2YWx1ZSBjYW4gYWxzbyBiZSBwYXNzaW5nIHVzaW5nIHRoZSBwcml2YXRlIGZsYWcgd2hlbiB1c2luZyB2NGwyIGFuZAorICAgVklESU9DX1NfRk1UIGlvY3RsLgogCiAgICBJbiAnU25hcHNob3QnIG1vZGUgdGhlIGNhbWVyYSBmcmVlemVzIGl0cyBhdXRvbWF0aWMgZXhwb3N1cmUgYW5kIGNvbG91cgogICAgYmFsYW5jZSBjb250cm9scy4KQEAgLTczLDYgKzc4LDggQEAKICNkZWZpbmUgUFdDX0ZQU19NQVNLCQkweDAwRkYwMDAwCiAjZGVmaW5lIFBXQ19GUFNfRlJNQVNLCQkweDAwM0YwMDAwCiAjZGVmaW5lIFBXQ19GUFNfU05BUFNIT1QJMHgwMDQwMDAwMAorI2RlZmluZSBQV0NfUUxUX01BU0sJCTB4MDMwMDAwMDAKKyNkZWZpbmUgUFdDX1FMVF9TSElGVAkJMjQKIAogCiAvKiBzdHJ1Y3R1cmUgZm9yIHRyYW5zZmVycmluZyB4ICYgeSBjb29yZGluYXRlcyAqLwpAQCAtMjg5LDQgKzI5NiwyOSBAQAogfTsKICNkZWZpbmUgVklESU9DUFdDR1ZJRFRBQkxFCV9JT1IoJ3YnLCAyMTYsIHN0cnVjdCBwd2NfdGFibGVfaW5pdF9idWZmZXIpCiAKKy8qCisgKiBUaGlzIGlzIHByaXZhdGUgY29tbWFuZCB1c2VkIHdoZW4gY29tbXVuaWNhdGluZyB3aXRoIHY0bDIuCisgKiBJbiB0aGUgZnV0dXJlIGFsbCBwcml2YXRlIGlvY3RsIHdpbGwgYmUgcmVtb3ZlL3JlcGxhY2UgdG8KKyAqIHVzZSBpbnRlcmZhY2Ugb2ZmZXIgYnkgdjRsMi4KKyAqLworCisjZGVmaW5lIFY0TDJfQ0lEX1BSSVZBVEVfU0FWRV9VU0VSICAgICAgIChWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyAwKQorI2RlZmluZSBWNEwyX0NJRF9QUklWQVRFX1JFU1RPUkVfVVNFUiAgICAoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgMSkKKyNkZWZpbmUgVjRMMl9DSURfUFJJVkFURV9SRVNUT1JFX0ZBQ1RPUlkgKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDIpCisjZGVmaW5lIFY0TDJfQ0lEX1BSSVZBVEVfQ09MT1VSX01PREUgICAgIChWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyAzKQorI2RlZmluZSBWNEwyX0NJRF9QUklWQVRFX0FVVE9DT05UT1VSICAgICAoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgNCkKKyNkZWZpbmUgVjRMMl9DSURfUFJJVkFURV9DT05UT1VSICAgICAgICAgKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDUpCisjZGVmaW5lIFY0TDJfQ0lEX1BSSVZBVEVfQkFDS0xJR0hUICAgICAgIChWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyA2KQorI2RlZmluZSBWNEwyX0NJRF9QUklWQVRFX0ZMSUNLRVJMRVNTICAgICAoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgNykKKyNkZWZpbmUgVjRMMl9DSURfUFJJVkFURV9OT0lTRV9SRURVQ1RJT04gKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDgpCisKK3N0cnVjdCBwd2NfcmF3X2ZyYW1lIHsKKyAgIF9fbGUxNiB0eXBlOwkJLyogdHlwZSBvZiB0aGUgd2ViY2FtICovCisgICBfX2xlMTYgdmJhbmRsZW5ndGg7CS8qIFNpemUgb2YgNGxpbmVzIGNvbXByZXNzZWQgKHVzZWQgYnkgdGhlIGRlY29tcHJlc3NvcikgKi8KKyAgIF9fdTggICBjbWRbNF07CS8qIHRoZSBmb3VyIGJ5dGUgb2YgdGhlIGNvbW1hbmQgKGluIGNhc2Ugb2YgbmFsYSwKKwkJCSAgIG9ubHkgdGhlIGZpcnN0IDMgYnl0ZXMgaXMgZmlsbGVkKSAqLworICAgX191OCAgIHJhd2ZyYW1lWzBdOwkvKiBmcmFtZV9zaXplID0gSC80KnZiYW5kbGVuZ3RoICovCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy1raWFyYS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLWtpYXJhLmMKaW5kZXggZmVjMzljYy4uZjRhZTgzYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLWtpYXJhLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLWtpYXJhLmMKQEAgLTQyLDYgKzQyLDggQEAKICNpbmNsdWRlICJwd2Mta2lhcmEuaCIKICNpbmNsdWRlICJwd2MtdW5jb21wcmVzcy5oIgogCitjb25zdCB1bnNpZ25lZCBpbnQgS2lhcmFfZnBzX3ZlY3RvcltQV0NfRlBTX01BWF9LSUFSQV0gPSB7IDUsIDEwLCAxNSwgMjAsIDI1LCAzMCB9OworCiBjb25zdCBzdHJ1Y3QgS2lhcmFfdGFibGVfZW50cnkgS2lhcmFfdGFibGVbUFNaX01BWF1bNl1bNF0gPQogewogICAgLyogU1FDSUYgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy1raWFyYS5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLWtpYXJhLmgKaW5kZXggMGJkYjIyNS4uMDQ3ZGFkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLWtpYXJhLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLWtpYXJhLmgKQEAgLTI5LDYgKzI5LDggQEAKIAogI2luY2x1ZGUgPG1lZGlhL3B3Yy1pb2N0bC5oPgogCisjZGVmaW5lIFBXQ19GUFNfTUFYX0tJQVJBIDYKKwogc3RydWN0IEtpYXJhX3RhYmxlX2VudHJ5CiB7CiAJY2hhciBhbHRlcm5hdGU7CQkJLyogVVNCIGFsdGVybmF0ZSBpbnRlcmZhY2UgKi8KQEAgLTM3LDggKzM5LDkgQEAKIAl1bnNpZ25lZCBjaGFyIG1vZGVbMTJdOwkJLyogcHJlY29tcHV0ZWQgbW9kZSBzZXR0aW5ncyBmb3IgY2FtICovCiB9OwogCi1leHRlcm4gY29uc3Qgc3RydWN0IEtpYXJhX3RhYmxlX2VudHJ5IEtpYXJhX3RhYmxlW1BTWl9NQVhdWzZdWzRdOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBLaWFyYV90YWJsZV9lbnRyeSBLaWFyYV90YWJsZVtQU1pfTUFYXVtQV0NfRlBTX01BWF9LSUFSQV1bNF07CiBleHRlcm4gY29uc3QgdW5zaWduZWQgaW50IEtpYXJhUm9tVGFibGVbOF1bMl1bMTZdWzhdOworZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGludCBLaWFyYV9mcHNfdmVjdG9yW1BXQ19GUFNfTUFYX0tJQVJBXTsKIAogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy10aW1vbi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLXRpbW9uLmMKaW5kZXggYmU2NWJkYy4uYzU2YzE3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLXRpbW9uLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLXRpbW9uLmMKQEAgLTQwLDcgKzQwLDkgQEAKIAogI2luY2x1ZGUgInB3Yy10aW1vbi5oIgogCi1jb25zdCBzdHJ1Y3QgVGltb25fdGFibGVfZW50cnkgVGltb25fdGFibGVbUFNaX01BWF1bNl1bNF0gPQorY29uc3QgdW5zaWduZWQgaW50IFRpbW9uX2Zwc192ZWN0b3JbUFdDX0ZQU19NQVhfVElNT05dID0geyA1LCAxMCwgMTUsIDIwLCAyNSwgMzAgfTsKKworY29uc3Qgc3RydWN0IFRpbW9uX3RhYmxlX2VudHJ5IFRpbW9uX3RhYmxlW1BTWl9NQVhdW1BXQ19GUFNfTUFYX1RJTU9OXVs0XSA9CiB7CiAgICAvKiBTUUNJRiAqLwogICAgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLXRpbW9uLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtdGltb24uaAppbmRleCBlZWY5ZTJjLi5hNmUyMjIyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLXRpbW9uLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLXRpbW9uLmgKQEAgLTQ0LDYgKzQ0LDggQEAKIAogI2luY2x1ZGUgPG1lZGlhL3B3Yy1pb2N0bC5oPgogCisjZGVmaW5lIFBXQ19GUFNfTUFYX1RJTU9OIDYKKwogc3RydWN0IFRpbW9uX3RhYmxlX2VudHJ5CiB7CiAJY2hhciBhbHRlcm5hdGU7CQkJLyogVVNCIGFsdGVybmF0ZSBpbnRlcmZhY2UgKi8KQEAgLTUyLDkgKzU0LDkgQEAKIAl1bnNpZ25lZCBjaGFyIG1vZGVbMTNdOwkJLyogcHJlY29tcHV0ZWQgbW9kZSBzZXR0aW5ncyBmb3IgY2FtICovCiB9OwogCi1leHRlcm4gY29uc3Qgc3RydWN0IFRpbW9uX3RhYmxlX2VudHJ5IFRpbW9uX3RhYmxlW1BTWl9NQVhdWzZdWzRdOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBUaW1vbl90YWJsZV9lbnRyeSBUaW1vbl90YWJsZVtQU1pfTUFYXVtQV0NfRlBTX01BWF9USU1PTl1bNF07CiBleHRlcm4gY29uc3QgdW5zaWduZWQgaW50IFRpbW9uUm9tVGFibGUgWzE2XVsyXVsxNl1bOF07Ci0KK2V4dGVybiBjb25zdCB1bnNpZ25lZCBpbnQgVGltb25fZnBzX3ZlY3RvcltQV0NfRlBTX01BWF9USU1PTl07CiAKICNlbmRpZgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtdjRsLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtdjRsLmMKaW5kZXggZDVlNmJjOC4uMzJmYmUxYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLXY0bC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy12NGwuYwpAQCAtMTE2OCw3ICsxMTY4LDcgQEAKIAkJCWJ1Zi0+c2VxdWVuY2UgPSAwOwogCQkJYnVmLT5tZW1vcnkgPSBWNEwyX01FTU9SWV9NTUFQOwogCQkJYnVmLT5tLm9mZnNldCA9IHBkZXYtPmZpbGxfaW1hZ2UgKiBwZGV2LT5sZW5fcGVyX2ltYWdlOwotCQkJYnVmLT5sZW5ndGggPSBidWYtPmJ5dGVzdXNlZDsKKwkJCWJ1Zi0+bGVuZ3RoID0gcGRldi0+bGVuX3Blcl9pbWFnZTsKIAkJCXB3Y19uZXh0X2ltYWdlKHBkZXYpOwogCiAJCQlQV0NfREVCVUdfSU9DVEwoIlZJRElPQ19EUUJVRjogYnVmLT5pbmRleD0lZFxuIixidWYtPmluZGV4KTsKQEAgLTExOTMsNiArMTE5Myw2NCBAQAogCQkJcmV0dXJuIDA7CiAJCX0KIAorCQljYXNlIFZJRElPQ19FTlVNX0ZSQU1FU0laRVM6CisJCXsKKwkJCXN0cnVjdCB2NGwyX2ZybXNpemVlbnVtICpmc2l6ZSA9IGFyZzsKKwkJCXVuc2lnbmVkIGludCBpID0gMCwgaW5kZXggPSBmc2l6ZS0+aW5kZXg7CisKKwkJCWlmIChmc2l6ZS0+cGl4ZWxfZm9ybWF0ID09IFY0TDJfUElYX0ZNVF9ZVVY0MjApIHsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgUFNaX01BWDsgaSsrKSB7CisJCQkJCWlmIChwZGV2LT5pbWFnZV9tYXNrICYgKDFVTCA8PCBpKSkgeworCQkJCQkJaWYgKCFpbmRleC0tKSB7CisJCQkJCQkJZnNpemUtPnR5cGUgPSBWNEwyX0ZSTVNJWkVfVFlQRV9ESVNDUkVURTsKKwkJCQkJCQlmc2l6ZS0+ZGlzY3JldGUud2lkdGggPSBwd2NfaW1hZ2Vfc2l6ZXNbaV0ueDsKKwkJCQkJCQlmc2l6ZS0+ZGlzY3JldGUuaGVpZ2h0ID0gcHdjX2ltYWdlX3NpemVzW2ldLnk7CisJCQkJCQkJcmV0dXJuIDA7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2UgaWYgKGZzaXplLT5pbmRleCA9PSAwICYmCisJCQkJICAgKChmc2l6ZS0+cGl4ZWxfZm9ybWF0ID09IFY0TDJfUElYX0ZNVF9QV0MxICYmIERFVklDRV9VU0VfQ09ERUMxKHBkZXYtPnR5cGUpKSB8fAorCQkJCSAgICAoZnNpemUtPnBpeGVsX2Zvcm1hdCA9PSBWNEwyX1BJWF9GTVRfUFdDMiAmJiBERVZJQ0VfVVNFX0NPREVDMjMocGRldi0+dHlwZSkpKSkgeworCisJCQkJZnNpemUtPnR5cGUgPSBWNEwyX0ZSTVNJWkVfVFlQRV9ESVNDUkVURTsKKwkJCQlmc2l6ZS0+ZGlzY3JldGUud2lkdGggPSBwZGV2LT5hYnNfbWF4Lng7CisJCQkJZnNpemUtPmRpc2NyZXRlLmhlaWdodCA9IHBkZXYtPmFic19tYXgueTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJY2FzZSBWSURJT0NfRU5VTV9GUkFNRUlOVEVSVkFMUzoKKwkJeworCQkJc3RydWN0IHY0bDJfZnJtaXZhbGVudW0gKmZpdmFsID0gYXJnOworCQkJaW50IHNpemUgPSAtMTsKKwkJCXVuc2lnbmVkIGludCBpOworCisJCQlmb3IgKGkgPSAwOyBpIDwgUFNaX01BWDsgaSsrKSB7CisJCQkJaWYgKHB3Y19pbWFnZV9zaXplc1tpXS54ID09IGZpdmFsLT53aWR0aCAmJgorCQkJCSAgICBwd2NfaW1hZ2Vfc2l6ZXNbaV0ueSA9PSBmaXZhbC0+aGVpZ2h0KSB7CisJCQkJCXNpemUgPSBpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCS8qIFRPRE86IFN1cHBvcnQgcmF3IGZvcm1hdCAqLworCQkJaWYgKHNpemUgPCAwIHx8IGZpdmFsLT5waXhlbF9mb3JtYXQgIT0gVjRMMl9QSVhfRk1UX1lVVjQyMCkgeworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCisJCQlpID0gcHdjX2dldF9mcHMocGRldiwgZml2YWwtPmluZGV4LCBzaXplKTsKKwkJCWlmICghaSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJZml2YWwtPnR5cGUgPSBWNEwyX0ZSTUlWQUxfVFlQRV9ESVNDUkVURTsKKwkJCWZpdmFsLT5kaXNjcmV0ZS5udW1lcmF0b3IgPSAxOworCQkJZml2YWwtPmRpc2NyZXRlLmRlbm9taW5hdG9yID0gaTsKKworCQkJcmV0dXJuIDA7CisJCX0KKwogCQlkZWZhdWx0OgogCQkJcmV0dXJuIHB3Y19pb2N0bChwZGV2LCBjbWQsIGFyZyk7CiAJfSAvKiAuLnN3aXRjaCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MuaAppbmRleCBlNzc4YTJiLi5hY2JiOTMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MuaApAQCAtNDQsNyArNDQsNyBAQAogI2RlZmluZSBQV0NfTUlOT1IJMAogI2RlZmluZSBQV0NfRVhUUkFNSU5PUgkxMgogI2RlZmluZSBQV0NfVkVSU0lPTl9DT0RFIEtFUk5FTF9WRVJTSU9OKFBXQ19NQUpPUixQV0NfTUlOT1IsUFdDX0VYVFJBTUlOT1IpCi0jZGVmaW5lIFBXQ19WRVJTSU9OIAkiMTAuMC4xMiIKKyNkZWZpbmUgUFdDX1ZFUlNJT04gCSIxMC4wLjEzIgogI2RlZmluZSBQV0NfTkFNRSAJInB3YyIKICNkZWZpbmUgUEZYCQlQV0NfTkFNRSAiOiAiCiAKQEAgLTg1LDcgKzg1LDcgQEAKICNkZWZpbmUgUFdDX0lORk8oZm10LCBhcmdzLi4uKSBwcmludGsoS0VSTl9JTkZPIFBGWCBmbXQsICMjYXJncykKICNkZWZpbmUgUFdDX1RSQUNFKGZtdCwgYXJncy4uLikgUFdDX0RFQlVHKFRSQUNFLCBmbXQsICMjYXJncykKIAotI2Vsc2UgLyogaWYgISBDT05GSUdfUFdDX0RFQlVHICovCisjZWxzZSAvKiBpZiAhIENPTkZJR19VU0JfUFdDX0RFQlVHICovCiAKICNkZWZpbmUgUFdDX0VSUk9SKGZtdCwgYXJncy4uLikgcHJpbnRrKEtFUk5fRVJSIFBGWCBmbXQsICMjYXJncykKICNkZWZpbmUgUFdDX1dBUk5JTkcoZm10LCBhcmdzLi4uKSBwcmludGsoS0VSTl9XQVJOSU5HIFBGWCBmbXQsICMjYXJncykKQEAgLTI4Nyw2ICsyODcsNyBAQAogLyoqIEZ1bmN0aW9ucyBpbiBwd2MtY3RybC5jICovCiAvKiBSZXF1ZXN0IGEgY2VydGFpbiB2aWRlbyBtb2RlLiBSZXR1cm5zIDwgMCBpZiBub3QgcG9zc2libGUgKi8KIGV4dGVybiBpbnQgcHdjX3NldF92aWRlb19tb2RlKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBmcmFtZXMsIGludCBjb21wcmVzc2lvbiwgaW50IHNuYXBzaG90KTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgcHdjX2dldF9mcHMoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIHVuc2lnbmVkIGludCBpbmRleCwgdW5zaWduZWQgaW50IHNpemUpOwogLyogQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgcGVyIGltYWdlIChub3QgZnJhbWUpICovCiBleHRlcm4gaW50IHB3Y19tcHRfcmVzZXQoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCBmbGFncyk7CiBleHRlcm4gaW50IHB3Y19tcHRfc2V0X2FuZ2xlKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgcGFuLCBpbnQgdGlsdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMTUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzExNS5jCmluZGV4IDRkNWJiZDg1Li4yZDE4ZjAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMTUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMTUuYwpAQCAtNDUsNiArNDUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jaGlwLWlkZW50Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc2FhNzExNS5oPgogI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgogCkBAIC04MCw3ICs4MSw3IEBACiAJaW50IHNhdDsKIAlpbnQgd2lkdGg7CiAJaW50IGhlaWdodDsKLQllbnVtIHY0bDJfY2hpcF9pZGVudCBpZGVudDsKKwl1MzIgaWRlbnQ7CiAJdTMyIGF1ZGNsa19mcmVxOwogCXUzMiBjcnlzdGFsX2ZyZXE7CiAJdTggdWNnYzsKQEAgLTEyMzIsNyArMTIzMyw2IEBACiBzdGF0aWMgaW50IHNhYTcxMXhfY29tbWFuZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCiB7CiAJc3RydWN0IHNhYTcxMXhfc3RhdGUgKnN0YXRlID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Ci0JaW50ICppYXJnID0gYXJnOwogCiAJLyogaW9jdGxzIHRvIGFsbG93IGRpcmVjdCBhY2Nlc3MgdG8gdGhlIHNhYTcxMTUgcmVnaXN0ZXJzIGZvciB0ZXN0aW5nICovCiAJc3dpdGNoIChjbWQpIHsKQEAgLTE0MzcsOSArMTQzNyw4IEBACiAJfQogI2VuZGlmCiAKLQljYXNlIFZJRElPQ19JTlRfR19DSElQX0lERU5UOgotCQkqaWFyZyA9IHN0YXRlLT5pZGVudDsKLQkJYnJlYWs7CisJY2FzZSBWSURJT0NfR19DSElQX0lERU5UOgorCQlyZXR1cm4gdjRsMl9jaGlwX2lkZW50X2kyY19jbGllbnQoY2xpZW50LCBhcmcsIHN0YXRlLT5pZGVudCwgMCk7CiAKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTE0ODcsNiArMTQ4Niw3IEBACiAJaWYgKG1lbWNtcChuYW1lLCAiMWY3MTEiLCA1KSkgewogCQl2NGxfZGJnKDEsIGRlYnVnLCBjbGllbnQsICJjaGlwIGZvdW5kIEAgMHgleCAoSUQgJXMpIGRvZXMgbm90IG1hdGNoIGEga25vd24gc2FhNzExeCBjaGlwLlxuIiwKIAkJCWFkZHJlc3MgPDwgMSwgbmFtZSk7CisJCWtmcmVlKGNsaWVudCk7CiAJCXJldHVybiAwOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTI3LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMjcuYwppbmRleCA2NTQ4NjNkLi45Zjk4NjkzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMjcuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMjcuYwpAQCAtNTQsNiArNTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jaGlwLWlkZW50Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc2FhNzEyNy5oPgogCiBzdGF0aWMgaW50IGRlYnVnID0gMDsKQEAgLTIzNCw3ICsyMzUsNyBAQAogCiBzdHJ1Y3Qgc2FhNzEyN19zdGF0ZSB7CiAJdjRsMl9zdGRfaWQgc3RkOwotCWVudW0gdjRsMl9jaGlwX2lkZW50IGlkZW50OworCXUzMiBpZGVudDsKIAllbnVtIHNhYTcxMjdfaW5wdXRfdHlwZSBpbnB1dF90eXBlOwogCWVudW0gc2FhNzEyN19vdXRwdXRfdHlwZSBvdXRwdXRfdHlwZTsKIAlpbnQgdmlkZW9fZW5hYmxlOwpAQCAtNTUwLDEyICs1NTEsMTIgQEAKIAlzdHJ1Y3QgdjRsMl9yb3V0aW5nICpyb3V0ZSA9IGFyZzsKIAogCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBWSURJT0NfU19TVEQ6CisJY2FzZSBWSURJT0NfSU5UX1NfU1REX09VVFBVVDoKIAkJaWYgKHN0YXRlLT5zdGQgPT0gKih2NGwyX3N0ZF9pZCAqKWFyZykKIAkJCWJyZWFrOwogCQlyZXR1cm4gc2FhNzEyN19zZXRfc3RkKGNsaWVudCwgKih2NGwyX3N0ZF9pZCAqKWFyZyk7CiAKLQljYXNlIFZJRElPQ19HX1NURDoKKwljYXNlIFZJRElPQ19JTlRfR19TVERfT1VUUFVUOgogCQkqKHY0bDJfc3RkX2lkICopYXJnID0gc3RhdGUtPnN0ZDsKIAkJYnJlYWs7CiAKQEAgLTY1MCw5ICs2NTEsOCBAQAogCQlicmVhazsKIAl9CiAKLQljYXNlIFZJRElPQ19JTlRfR19DSElQX0lERU5UOgotCQkqKGVudW0gdjRsMl9jaGlwX2lkZW50ICopYXJnID0gc3RhdGUtPmlkZW50OwotCQlicmVhazsKKwljYXNlIFZJRElPQ19HX0NISVBfSURFTlQ6CisJCXJldHVybiB2NGwyX2NoaXBfaWRlbnRfaTJjX2NsaWVudChjbGllbnQsIGFyZywgc3RhdGUtPmlkZW50LCAwKTsKIAogCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L0tjb25maWcgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvS2NvbmZpZwppbmRleCA1OWRhNzljLi4zMDlkY2EzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvS2NvbmZpZworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvS2NvbmZpZwpAQCAtNDYsNiArNDYsNyBAQAogCXNlbGVjdCBEVkJfTlhUMjAwWCBpZiAhRFZCX0ZFX0NVU1RPTUlTRQogCXNlbGVjdCBEVkJfVERBMTAwODYgaWYgIURWQl9GRV9DVVNUT01JU0UKIAlzZWxlY3QgRFZCX1REQTgyNlggaWYgIURWQl9GRV9DVVNUT01JU0UKKwlzZWxlY3QgRFZCX1REQTgyN1ggaWYgIURWQl9GRV9DVVNUT01JU0UKIAlzZWxlY3QgRFZCX0lTTDY0MjEgaWYgIURWQl9GRV9DVVNUT01JU0UKIAktLS1oZWxwLS0tCiAJICBUaGlzIGFkZHMgc3VwcG9ydCBmb3IgRFZCIGNhcmRzIGJhc2VkIG9uIHRoZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtY2FyZHMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWNhcmRzLmMKaW5kZXggODlmMzIxMC4uNGVhNDc5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtY2FyZHMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1jYXJkcy5jCkBAIC0xNTQzLDEyICsxNTQzLDEyIEBACiAJCX0sewogCQkJLm5hbWUgPSBuYW1lX2NvbXAxLAogCQkJLnZtdXggPSAwLAotCQkJLmFtdXggPSBMSU5FMiwKKwkJCS5hbXV4ID0gTElORTEsCiAJCQkuZ3BpbyA9IDB4MDIsCiAJCX0sewogCQkJLm5hbWUgPSBuYW1lX3N2aWRlbywKIAkJCS52bXV4ID0gNiwKLQkJCS5hbXV4ID0gTElORTIsCisJCQkuYW11eCA9IExJTkUxLAogCQkJLmdwaW8gPSAweDAyLAogCQl9fSwKIAkJLnJhZGlvID0gewpAQCAtMTc3OCwxNyArMTc3OCwxOSBAQAogCVtTQUE3MTM0X0JPQVJEX0ZMWURWQlREVU9dID0gewogCQkvKiBMaWZlVmlldyBGbHlEVkItVCBEVU8gKi8KIAkJLyogIk5pY28gU2FiYmkgPG5zYWJiaUB0aXNjYWxpLml0PiAgSGFydG11dCBIYWNrbWFubiBoYXJ0bXV0LmhhY2ttYW5uQHQtb25saW5lLmRlKi8KLQkJLm5hbWUgICAgICAgICAgID0gIkxpZmVWaWV3IEZseURWQi1UIERVTyIsCisJCS5uYW1lICAgICAgICAgICA9ICJMaWZlVmlldyBGbHlEVkItVCBEVU8gLyBNU0kgVFZAbnl3aGVyZSBEdW8iLAogCQkuYXVkaW9fY2xvY2sgICAgPSAweDAwMjAwMDAwLAogCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1REQTgyOTAsCiAJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAogCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiAJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKKwkJLmdwaW9tYXNrCT0gMHgwMDIwMDAwMCwKIAkJLm1wZWcgICAgICAgICAgID0gU0FBNzEzNF9NUEVHX0RWQiwKIAkJLmlucHV0cyAgICAgICAgID0ge3sKIAkJCS5uYW1lID0gbmFtZV90diwKIAkJCS52bXV4ID0gMSwKIAkJCS5hbXV4ID0gVFYsCisJCQkuZ3BpbyA9IDB4MjAwMDAwLAkvKiBHUElPMjE9SGlnaCBmb3IgVFYgaW5wdXQgKi8KIAkJCS50diAgID0gMSwKIAkJfSx7CiAJCQkubmFtZSA9IG5hbWVfY29tcDEsCS8qIENvbXBvc2l0ZSBzaWduYWwgb24gUy1WaWRlbyBpbnB1dCAqLwpAQCAtMTgwMyw2ICsxODA1LDExIEBACiAJCQkudm11eCA9IDgsCiAJCQkuYW11eCA9IExJTkUyLAogCQl9fSwKKwkJLnJhZGlvID0geworCQkJLm5hbWUgPSBuYW1lX3JhZGlvLAorCQkJLmFtdXggPSBUViwKKwkJCS5ncGlvID0gMHgwMDAwMDAsCS8qIEdQSU8yMT1Mb3cgZm9yIEZNIHJhZGlvIGFudGVubmEgKi8KKwkJfSwKIAl9LAogCVtTQUE3MTM0X0JPQVJEX1BISUxJUFNfVE9VR0hdID0gewogCQkubmFtZSAgICAgICAgICAgPSAiUGhpbGlwcyBUT1VHSCBEVkItVCByZWZlcmVuY2UgZGVzaWduIiwKQEAgLTI1NDYsOCArMjU1Myw5IEBACiAJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAogCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiAJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnR1bmVyX2NvbmZpZyAgID0gMCwKIAkJLm1wZWcgICAgICAgICAgID0gU0FBNzEzNF9NUEVHX0RWQiwKLQkJLmdwaW9tYXNrICAgICAgID0gMSA8PCAyMSwKKwkJLmdwaW9tYXNrICAgICAgID0gMHgwMjAwMDAwLAogCQkuaW5wdXRzID0ge3sKIAkJCS5uYW1lICAgPSBuYW1lX3R2LAogCQkJLnZtdXggICA9IDEsCkBAIC0yNjI0LDcgKzI2MzIsNyBAQAogCQl9fSwKIAkJLnJhZGlvID0gewogCQkJLm5hbWUgICA9IG5hbWVfcmFkaW8sCi0JCQkuYW11eCAgID0gTElORTEsCisJCQkuYW11eCAgID0gVFYsCiAJCQkuZ3BpbyAgID0gMHgwMjAwMDAwLAogCQl9LAogCX0sCkBAIC0zMDQzLDYgKzMwNTEsNyBAQAogCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKIAkJLnR1bmVyX2FkZHIgICAgID0gQUREUl9VTlNFVCwKIAkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKKwkJLnR1bmVyX2NvbmZpZyAgID0gMSwKIAkJLm1wZWcgICAgICAgICAgID0gU0FBNzEzNF9NUEVHX0RWQiwKIAkJLmdwaW9tYXNrICAgICAgID0gMHgwMDAyMDAwMDAsCiAJCS5pbnB1dHMgICAgICAgICA9IHt7CkBAIC0zMjg5LDYgKzMyOTgsMTE1IEBACiAJCQkuYW11eCAgID0gTElORTEsCiAJCX19LAogCX0sCisJW1NBQTcxMzRfQk9BUkRfUEhJTElQU19USUdFUl9TXSA9IHsKKwkJLm5hbWUgICAgICAgICAgID0gIlBoaWxpcHMgVGlnZXIgLSBTIFJlZmVyZW5jZSBkZXNpZ24iLAorCQkuYXVkaW9fY2xvY2sgICAgPSAweDAwMTg3ZGU3LAorCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1REQTgyOTAsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnR1bmVyX2NvbmZpZyAgID0gMiwKKwkJLm1wZWcgICAgICAgICAgID0gU0FBNzEzNF9NUEVHX0RWQiwKKwkJLmdwaW9tYXNrICAgICAgID0gMHgwMjAwMDAwLAorCQkuaW5wdXRzID0ge3sKKwkJCS5uYW1lICAgPSBuYW1lX3R2LAorCQkJLnZtdXggICA9IDEsCisJCQkuYW11eCAgID0gVFYsCisJCQkudHYgICAgID0gMSwKKwkJfSx7CisJCQkubmFtZSAgID0gbmFtZV9jb21wMSwKKwkJCS52bXV4ICAgPSAzLAorCQkJLmFtdXggICA9IExJTkUxLAorCQl9LHsKKwkJCS5uYW1lICAgPSBuYW1lX3N2aWRlbywKKwkJCS52bXV4ICAgPSA4LAorCQkJLmFtdXggICA9IExJTkUxLAorCQl9fSwKKwkJLnJhZGlvID0geworCQkJLm5hbWUgICA9IG5hbWVfcmFkaW8sCisJCQkuYW11eCAgID0gVFYsCisJCQkuZ3BpbyAgID0gMHgwMjAwMDAwLAorCQl9LAorCX0sCisJW1NBQTcxMzRfQk9BUkRfQVZFUk1FRElBX00xMDJdID0geworCQkubmFtZSAgICAgICAgICAgPSAiQXZlcm1lZGlhIE0xMDIiLAorCQkuYXVkaW9fY2xvY2sgICAgPSAweDAwMTg3ZGU3LAorCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1REQTgyOTAsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKKwkJLmdwaW9tYXNrICAgICAgID0gMTw8MjEsCisJCS5pbnB1dHMgICAgICAgICA9IHt7CisJCQkubmFtZSA9IG5hbWVfdHYsCisJCQkudm11eCA9IDEsCisJCQkuYW11eCA9IFRWLAorCQkJLnR2ICAgPSAxLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9jb21wMSwKKwkJCS52bXV4ID0gMCwKKwkJCS5hbXV4ID0gTElORTIsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX3N2aWRlbywKKwkJCS52bXV4ID0gNiwKKwkJCS5hbXV4ID0gTElORTIsCisJCX19LAorCX0sCisJW1NBQTcxMzRfQk9BUkRfQVNVU19QNzEzMV80ODcxXSA9IHsKKwkJLm5hbWUgICAgICAgICAgID0gIkFTVVMgUDcxMzEgNDg3MSIsCisJCS5hdWRpb19jbG9jayAgICA9IDB4MDAxODdkZTcsCisJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfVERBODI5MCwKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAorCQkudHVuZXJfY29uZmlnICAgPSAyLAorCQkubXBlZyAgICAgICAgICAgPSBTQUE3MTM0X01QRUdfRFZCLAorCQkuZ3Bpb21hc2sgICAgICAgPSAweDAyMDAwMDAsCisJCS5pbnB1dHMgPSB7eworCQkJLm5hbWUgICA9IG5hbWVfdHYsCisJCQkudm11eCAgID0gMSwKKwkJCS5hbXV4ICAgPSBUViwKKwkJCS50diAgICAgPSAxLAorCQkJLmdwaW8gICA9IDB4MDIwMDAwMCwKKwkJfX0sCisJfSwKKwlbU0FBNzEzNF9CT0FSRF9BU1VTVGVLX1A3MTMxX0hZQlJJRF9MTkFdID0geworCQkubmFtZSAgICAgICAgICAgPSAiQVNVU1RlSyBQNzEzMSBIeWJyaWQiLAorCQkuYXVkaW9fY2xvY2sgICAgPSAweDAwMTg3ZGU3LAorCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1REQTgyOTAsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnR1bmVyX2NvbmZpZyAgID0gMiwKKwkJLmdwaW9tYXNrCT0gMSA8PCAyMSwKKwkJLm1wZWcgICAgICAgICAgID0gU0FBNzEzNF9NUEVHX0RWQiwKKwkJLmlucHV0cyAgICAgICAgID0ge3sKKwkJCS5uYW1lID0gbmFtZV90diwKKwkJCS52bXV4ID0gMSwKKwkJCS5hbXV4ID0gVFYsCisJCQkudHYgICA9IDEsCisJCQkuZ3BpbyA9IDB4MDAwMDAwMCwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfY29tcDEsCisJCQkudm11eCA9IDMsCisJCQkuYW11eCA9IExJTkUyLAorCQkJLmdwaW8gPSAweDAyMDAwMDAsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX2NvbXAyLAorCQkJLnZtdXggPSAwLAorCQkJLmFtdXggPSBMSU5FMiwKKwkJCS5ncGlvID0gMHgwMjAwMDAwLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9zdmlkZW8sCisJCQkudm11eCA9IDgsCisJCQkuYW11eCA9IExJTkUyLAorCQkJLmdwaW8gPSAweDAyMDAwMDAsCisJCX19LAorCQkucmFkaW8gPSB7CisJCQkubmFtZSA9IG5hbWVfcmFkaW8sCisJCQkuYW11eCA9IFRWLAorCQkJLmdwaW8gPSAweDAyMDAwMDAsCisJCX0sCisJfSwKIH07CiAKIGNvbnN0IHVuc2lnbmVkIGludCBzYWE3MTM0X2Jjb3VudCA9IEFSUkFZX1NJWkUoc2FhNzEzNF9ib2FyZHMpOwpAQCAtMzkxNCw3ICs0MDMyLDcgQEAKIAkJLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTMzLAogCQkuc3VidmVuZG9yICAgID0gMHgxMDQzLAogCQkuc3ViZGV2aWNlICAgID0gMHg0ODc2LAotCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9BU1VTVGVLX1A3MTMxX0RVQUwsCisJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX0FTVVNUZUtfUDcxMzFfSFlCUklEX0xOQSwKIAl9LHsKIAkJLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKIAkJLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTMzLApAQCAtMzk1OCw2ICs0MDc2LDMwIEBACiAJCS5zdWJkZXZpY2UgICAgPSAweDExNzUsCiAJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX0NJTkVSR1lfSFRfUENJLAogCX0seworCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAorCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzMsCisJCS5zdWJ2ZW5kb3IgICAgPSAweDE0NjEsIC8qIEF2ZXJtZWRpYSBUZWNobm9sb2dpZXMgSW5jICovCisJCS5zdWJkZXZpY2UgICAgPSAweGYzMWUsCisJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX0FWRVJNRURJQV9NMTAyLAorCX0seworCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAorCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzMsCisJCS5zdWJ2ZW5kb3IgICAgPSAweDRFNDIsICAgICAgICAgLyogTVNJICovCisJCS5zdWJkZXZpY2UgICAgPSAweDAzMDYsICAgICAgICAgLyogVFZAbnl3aGVyZSBEVU8gKi8KKwkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfRkxZRFZCVERVTywKKwl9LHsKKwkJLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKKwkJLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTMzLAorCQkuc3VidmVuZG9yICAgID0gMHgxMDQzLAorCQkuc3ViZGV2aWNlICAgID0gMHg0ODcxLAorCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9BU1VTX1A3MTMxXzQ4NzEsCisJfSx7CisJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCisJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzMywKKwkJLnN1YnZlbmRvciAgICA9IDB4MTA0MywKKwkJLnN1YmRldmljZSAgICA9IDB4NDg1NywKKwkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfQVNVU1RlS19QNzEzMV9EVUFMLAorCX0sewogCQkvKiAtLS0gYm9hcmRzIHdpdGhvdXQgZWVwcm9tICsgc3Vic3lzdGVtIElEIC0tLSAqLwogCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAogCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzQsCkBAIC0zOTcxLDcgKzQxMTMsNiBAQAogCQkuc3ViZGV2aWNlICAgID0gMCwKIAkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfTk9BVVRPLAogCX0sewotCiAJCS8qIC0tLSBkZWZhdWx0IGNhdGNoIC0tLSAqLwogCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAogCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzAsCkBAIC00MDYzLDYgKzQyMDQsNyBAQAogCWNhc2UgU0FBNzEzNF9CT0FSRF9TRUROQV9QQ19UVl9DQVJEQlVTOgogCWNhc2UgU0FBNzEzNF9CT0FSRF9GTFlEVkJUX0xSMzAxOgogCWNhc2UgU0FBNzEzNF9CT0FSRF9BU1VTVGVLX1A3MTMxX0RVQUw6CisJY2FzZSBTQUE3MTM0X0JPQVJEX0FTVVNUZUtfUDcxMzFfSFlCUklEX0xOQToKIAljYXNlIFNBQTcxMzRfQk9BUkRfRkxZRFZCVERVTzoKIAljYXNlIFNBQTcxMzRfQk9BUkRfUFJPVEVVU18yMzA5OgogCWNhc2UgU0FBNzEzNF9CT0FSRF9BVkVSTUVESUFfQTE2QVI6CkBAIC00MTAzLDggKzQyNDUsOCBAQAogCQlicmVhazsKIAljYXNlIFNBQTcxMzRfQk9BUkRfQURTX0RVT19DQVJEQlVTX1BUVjMzMToKIAljYXNlIFNBQTcxMzRfQk9BUkRfRkxZRFZCVF9IWUJSSURfQ0FSREJVUzoKLQkJc2FhX3dyaXRlYihTQUE3MTM0X0dQSU9fR1BNT0RFMywgMHgwOCk7Ci0JCXNhYV93cml0ZWIoU0FBNzEzNF9HUElPX0dQU1RBVFVTMywgMHgwMCk7CisJCXNhYV9hbmRvcmwoU0FBNzEzNF9HUElPX0dQTU9ERTAgPj4gMiwgMHgwODAwMDAwMCwgMHgwODAwMDAwMCk7CisJCXNhYV9hbmRvcmwoU0FBNzEzNF9HUElPX0dQU1RBVFVTMCA+PiAyLCAweDA4MDAwMDAwLCAweDAwMDAwMDAwKTsKIAkJYnJlYWs7CiAJY2FzZSBTQUE3MTM0X0JPQVJEX0FWRVJNRURJQV9DQVJEQlVTOgogCQkvKiBwb3dlci11cCB0dW5lciBjaGlwICovCkBAIC00MTM3LDYgKzQyNzksMTEgQEAKIAkJICAgICAgICIlczogRHVhbCBkZWNvZGVyIGZ1bmN0aW9uYWxpdHkgaXMgZGlzYWJsZWQgZm9yIG5vdywgdXNlIHRoZSBvdGhlciBjaGlwLlxuIiwKIAkJICAgICAgIGRldi0+bmFtZSxjYXJkKGRldikubmFtZSxkZXYtPm5hbWUsZGV2LT5uYW1lKTsKIAkJYnJlYWs7CisJY2FzZSBTQUE3MTM0X0JPQVJEX0FWRVJNRURJQV9NMTAyOgorCQkvKiBlbmFibGUgdHVuZXIgKi8KKwkJc2FhX2FuZG9ybChTQUE3MTM0X0dQSU9fR1BNT0RFMCA+PiAyLCAgIDB4OGMwNDAwMDcsIDB4OGMwNDAwMDcpOworCQlzYWFfYW5kb3JsKFNBQTcxMzRfR1BJT19HUFNUQVRVUzAgPj4gMiwgMHgwYzAwMDdjZCwgMHgwYzAwMDdjZCk7CisJCWJyZWFrOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTQxNDYsNiArNDI5Myw5IEBACiB7CiAJdW5zaWduZWQgY2hhciBidWY7CiAJaW50IGJvYXJkOworCXN0cnVjdCB0dW5lcl9zZXR1cCB0dW5fc2V0dXA7CisJdHVuX3NldHVwLmNvbmZpZyA9IDA7CisJdHVuX3NldHVwLnR1bmVyX2NhbGxiYWNrID0gc2FhNzEzNF90dW5lcl9jYWxsYmFjazsKIAogCXN3aXRjaCAoZGV2LT5ib2FyZCkgewogCWNhc2UgU0FBNzEzNF9CT0FSRF9CTUtfTVBFWF9OT1RVTkVSOgpAQCAtNDE2Miw4ICs0MzEyLDYgQEAKIAkJZGV2LT50dW5lcl90eXBlID0gc2FhNzEzNF9ib2FyZHNbZGV2LT5ib2FyZF0udHVuZXJfdHlwZTsKIAogCQlpZiAoVFVORVJfQUJTRU5UICE9IGRldi0+dHVuZXJfdHlwZSkgewotCQkJCXN0cnVjdCB0dW5lcl9zZXR1cCB0dW5fc2V0dXA7Ci0KIAkJCQl0dW5fc2V0dXAubW9kZV9tYXNrID0gVF9SQURJTyB8IFRfQU5BTE9HX1RWIHwgVF9ESUdJVEFMX1RWOwogCQkJCXR1bl9zZXR1cC50eXBlID0gZGV2LT50dW5lcl90eXBlOwogCQkJCXR1bl9zZXR1cC5hZGRyID0gQUREUl9VTlNFVDsKQEAgLTQxNzMsNyArNDMyMSw2IEBACiAJCWJyZWFrOwogCWNhc2UgU0FBNzEzNF9CT0FSRF9NRDcxMzQ6CiAJCXsKLQkJc3RydWN0IHR1bmVyX3NldHVwIHR1bl9zZXR1cDsKIAkJdTggc3ViYWRkcjsKIAkJdTggZGF0YVszXTsKIAkJaW50IHJldCwgdHVuZXJfdDsKQEAgLTQyNDUsNyArNDM5Miw2IEBACiAJCSAqIHRoZSBjaGFubmVsIGRlY29kZXIuIFdlIGhhdmUgdG8gbWFrZSBpdCB0cmFuc3BhcmVudCB0byBmaW5kIGl0CiAJCSAqLwogCQl7Ci0JCXN0cnVjdCB0dW5lcl9zZXR1cCB0dW5fc2V0dXA7CiAJCXU4IGRhdGFbXSA9IHsgMHgwNywgMHgwMn07CiAJCXN0cnVjdCBpMmNfbXNnIG1zZyA9IHsuYWRkcj0weDA4LCAuZmxhZ3M9MCwgLmJ1Zj1kYXRhLCAubGVuID0gc2l6ZW9mKGRhdGEpfTsKIAkJaTJjX3RyYW5zZmVyKCZkZXYtPmkyY19hZGFwLCAmbXNnLCAxKTsKQEAgLTQyNTgsMTYgKzQ0MDQsMzggQEAKIAkJfQogCQlicmVhazsKIAljYXNlIFNBQTcxMzRfQk9BUkRfUEhJTElQU19USUdFUjoKKwljYXNlIFNBQTcxMzRfQk9BUkRfUEhJTElQU19USUdFUl9TOgorCQl7CisJCXU4IGRhdGFbXSA9IHsgMHgzYywgMHgzMywgMHg2MH07CisJCXN0cnVjdCBpMmNfbXNnIG1zZyA9IHsuYWRkcj0weDA4LCAuZmxhZ3M9MCwgLmJ1Zj1kYXRhLCAubGVuID0gc2l6ZW9mKGRhdGEpfTsKKwkJaWYoZGV2LT5hdXRvZGV0ZWN0ZWQgJiYgKGRldi0+ZWVkYXRhWzB4NDldID09IDB4NTApKSB7CisJCQlkZXYtPmJvYXJkID0gU0FBNzEzNF9CT0FSRF9QSElMSVBTX1RJR0VSX1M7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogUmVjb25maWd1cmVkIGJvYXJkIGFzICVzXG4iLAorCQkJCWRldi0+bmFtZSwgc2FhNzEzNF9ib2FyZHNbZGV2LT5ib2FyZF0ubmFtZSk7CisJCX0KKwkJaWYoZGV2LT5ib2FyZCA9PSBTQUE3MTM0X0JPQVJEX1BISUxJUFNfVElHRVJfUykgeworCQkJdHVuX3NldHVwLm1vZGVfbWFzayA9IFRfQU5BTE9HX1RWIHwgVF9ESUdJVEFMX1RWOworCQkJdHVuX3NldHVwLnR5cGUgPSBUVU5FUl9QSElMSVBTX1REQTgyOTA7CisJCQl0dW5fc2V0dXAuYWRkciA9IDB4NGI7CisJCQl0dW5fc2V0dXAuY29uZmlnID0gMjsKKworCQkJc2FhNzEzNF9pMmNfY2FsbF9jbGllbnRzIChkZXYsIFRVTkVSX1NFVF9UWVBFX0FERFIsJnR1bl9zZXR1cCk7CisJCQlkYXRhWzJdID0gMHg2ODsKKwkJfQorCQlpMmNfdHJhbnNmZXIoJmRldi0+aTJjX2FkYXAsICZtc2csIDEpOworCQl9CisJCWJyZWFrOwogCWNhc2UgU0FBNzEzNF9CT0FSRF9QSU5OQUNMRV9QQ1RWXzMxMGk6CiAJY2FzZSBTQUE3MTM0X0JPQVJEX1RFVklPTl9EVkJUXzIyMFJGOgogCWNhc2UgU0FBNzEzNF9CT0FSRF9BU1VTVGVLX1A3MTMxX0RVQUw6CisJY2FzZSBTQUE3MTM0X0JPQVJEX0FTVVNUZUtfUDcxMzFfSFlCUklEX0xOQToKIAljYXNlIFNBQTcxMzRfQk9BUkRfTUVESU9OX01EODgwMF9RVUFEUk86CiAJY2FzZSBTQUE3MTM0X0JPQVJEX0hBVVBQQVVHRV9IVlIxMTEwOgogCQkvKiB0aGlzIGlzIGEgaHlicmlkIGJvYXJkLCBpbml0aWFsaXplIHRvIGFuYWxvZyBtb2RlCiAJCSAqIGFuZCBjb25maWd1cmUgZmlybXdhcmUgZWVwcm9tIGFkZHJlc3MKIAkJICovCiAJCXsKLQkJdTggZGF0YVtdID0geyAweDNjLCAweDMzLCAweDY4fTsKKwkJdTggZGF0YVtdID0geyAweDNjLCAweDMzLCAweDYwfTsKIAkJc3RydWN0IGkyY19tc2cgbXNnID0gey5hZGRyPTB4MDgsIC5mbGFncz0wLCAuYnVmPWRhdGEsIC5sZW4gPSBzaXplb2YoZGF0YSl9OwogCQlpMmNfdHJhbnNmZXIoJmRldi0+aTJjX2FkYXAsICZtc2csIDEpOwogCQl9CkBAIC00MjgxLDE4ICs0NDQ5LDE4IEBACiAJCWJyZWFrOwogCWNhc2UgU0FBNzEzNF9CT0FSRF9BRFNfRFVPX0NBUkRCVVNfUFRWMzMxOgogCWNhc2UgU0FBNzEzNF9CT0FSRF9GTFlEVkJUX0hZQlJJRF9DQVJEQlVTOgotCQkvKiBtYWtlIHRoZSB0ZGExMDA0NiBmaW5kIGl0cyBlZXByb20gKi8KKwkJLyogaW5pdGlhbGl6ZSBhbmFsb2cgbW9kZSAgKi8KIAkJewotCQl1OCBkYXRhW10gPSB7IDB4M2MsIDB4MzMsIDB4NjJ9OworCQl1OCBkYXRhW10gPSB7IDB4M2MsIDB4MzMsIDB4NmF9OwogCQlzdHJ1Y3QgaTJjX21zZyBtc2cgPSB7LmFkZHI9MHgwOCwgLmZsYWdzPTAsIC5idWY9ZGF0YSwgLmxlbiA9IHNpemVvZihkYXRhKX07CiAJCWkyY190cmFuc2ZlcigmZGV2LT5pMmNfYWRhcCwgJm1zZywgMSk7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBTQUE3MTM0X0JPQVJEX0NJTkVSR1lfSFRfUENNQ0lBOgogCWNhc2UgU0FBNzEzNF9CT0FSRF9DSU5FUkdZX0hUX1BDSToKLQkJLyogbWFrZSB0aGUgdGRhMTAwNDYgZmluZCBpdHMgZWVwcm9tICovCisJCS8qIGluaXRpYWxpemUgYW5hbG9nIG1vZGUgKi8KIAkJewotCQl1OCBkYXRhW10gPSB7IDB4M2MsIDB4MzMsIDB4NjB9OworCQl1OCBkYXRhW10gPSB7IDB4M2MsIDB4MzMsIDB4Njh9OwogCQlzdHJ1Y3QgaTJjX21zZyBtc2cgPSB7LmFkZHI9MHgwOCwgLmZsYWdzPTAsIC5idWY9ZGF0YSwgLmxlbiA9IHNpemVvZihkYXRhKX07CiAJCWkyY190cmFuc2ZlcigmZGV2LT5pMmNfYWRhcCwgJm1zZywgMSk7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWNvcmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWNvcmUuYwppbmRleCBlZDAzOGZmLi4yNWY4NDcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1jb3JlLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtY29yZS5jCkBAIC0xMTcsNiArMTE3LDY0IEBACiAJICAgICAgIGRldi0+bmFtZSwgbW9kZSwgKH5tb2RlKSAmIHN0YXR1cywgbW9kZSAmIHN0YXR1cywgbXNnKTsKIH0KIAordm9pZCBzYWE3MTM0X3NldF9ncGlvKHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2LCBpbnQgYml0X25vLCBpbnQgdmFsdWUpCit7CisJdTMyIGluZGV4LCBiaXR2YWw7CisKKwlpbmRleCA9IDEgPDwgYml0X25vOworCXN3aXRjaCAodmFsdWUpIHsKKwljYXNlIDA6IC8qIHN0YXRpYyB2YWx1ZSAqLworCWNhc2UgMToJZHByaW50aygic2V0dGluZyBHUElPJWQgdG8gc3RhdGljICVkXG4iLCBiaXRfbm8sIHZhbHVlKTsKKwkJLyogdHVybiBzeW5jIG1vZGUgb2ZmIGlmIG5lY2Vzc2FyeSAqLworCQlpZiAoaW5kZXggJiAweDAwYzAwMDAwKQorCQkJc2FhX2FuZG9yYihTQUE3MTM0X1ZJREVPX1BPUlRfQ1RSTDYsIDB4MGYsIDB4MDApOworCQlpZiAodmFsdWUpCisJCQliaXR2YWwgPSBpbmRleDsKKwkJZWxzZQorCQkJYml0dmFsID0gMDsKKwkJc2FhX2FuZG9ybChTQUE3MTM0X0dQSU9fR1BNT0RFMCA+PiAyLCBpbmRleCwgaW5kZXgpOworCQlzYWFfYW5kb3JsKFNBQTcxMzRfR1BJT19HUFNUQVRVUzAgPj4gMiwgaW5kZXgsIGJpdHZhbCk7CisJCWJyZWFrOworCWNhc2UgMzoJLyogdHJpc3RhdGUgKi8KKwkJZHByaW50aygic2V0dGluZyBHUElPJWQgdG8gdHJpc3RhdGVcbiIsIGJpdF9ubyk7CisJCXNhYV9hbmRvcmwoU0FBNzEzNF9HUElPX0dQTU9ERTAgPj4gMiwgaW5kZXgsIDApOworCQlicmVhazsKKwl9Cit9CisKK2ludCBzYWE3MTM0X3R1bmVyX2NhbGxiYWNrKHZvaWQgKnB0ciwgaW50IGNvbW1hbmQsIGludCBhcmcpCit7CisJdTggc3luY19jb250cm9sOworCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gcHRyOworCisJc3dpdGNoIChkZXYtPnR1bmVyX3R5cGUpIHsKKwljYXNlIFRVTkVSX1BISUxJUFNfVERBODI5MDoKKwkJc3dpdGNoIChjb21tYW5kKSB7CisJCWNhc2UgMDogLyogc3dpdGNoIExOQSBnYWluIHRocm91Z2ggR1BJTyAyMiovCisJCQlzYWE3MTM0X3NldF9ncGlvKGRldiwgMjIsIGFyZykgOworCQkJYnJlYWs7CisJCWNhc2UgMTogLyogdnN5bmMgb3V0cHV0IGF0IEdQSU8yMi4gNTAgLyA2MEh6ICovCisJCQlkcHJpbnRrKCJzZXR0aW5nIEdQSU8yMiB0byB2c3luYyAlZFxuIiwgYXJnKTsKKwkJCXNhYV9hbmRvcmIoU0FBNzEzNF9WSURFT19QT1JUX0NUUkwzLCAweDgwLCAweDgwKTsKKwkJCXNhYV9hbmRvcmIoU0FBNzEzNF9WSURFT19QT1JUX0NUUkw2LCAweDBmLCAweDAzKTsKKwkJCWlmIChhcmcgPT0gMSkKKwkJCQlzeW5jX2NvbnRyb2wgPSAxMTsKKwkJCWVsc2UKKwkJCQlzeW5jX2NvbnRyb2wgPSAxNzsKKwkJCXNhYV93cml0ZWIoU0FBNzEzNF9WR0FURV9TVEFSVCwgc3luY19jb250cm9sKTsKKwkJCXNhYV93cml0ZWIoU0FBNzEzNF9WR0FURV9TVE9QLCBzeW5jX2NvbnRyb2wgKyAxKTsKKwkJCXNhYV9hbmRvcmIoU0FBNzEzNF9NSVNDX1ZHQVRFX01TQiwgMHgwMywgMHgwMCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PREVWOworCX0KKwlyZXR1cm4gMDsKK30KKwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIApAQCAtMTI0LDU1ICsxODIsMjggQEAKIC8qIGRlbGF5ZWQgcmVxdWVzdF9tb2R1bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKICNpZiBkZWZpbmVkKENPTkZJR19NT0RVTEVTKSAmJiBkZWZpbmVkKE1PRFVMRSkKLXN0YXRpYyBpbnQgbmVlZF9lbXByZXNzOwotc3RhdGljIGludCBuZWVkX2R2YjsKLXN0YXRpYyBpbnQgbmVlZF9hbHNhOwotc3RhdGljIGludCBuZWVkX29zczsKIAotc3RhdGljIGludCBwZW5kaW5nX2NhbGwoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLCB1bnNpZ25lZCBsb25nIHN0YXRlLAotCQkJdm9pZCAqbW9kdWxlKQotewotCWlmIChtb2R1bGUgIT0gVEhJU19NT0RVTEUgfHwgc3RhdGUgIT0gTU9EVUxFX1NUQVRFX0xJVkUpCi0JCXJldHVybiBOT1RJRllfRE9ORTsKIAotCWlmIChuZWVkX2VtcHJlc3MpCitzdGF0aWMgdm9pZCByZXF1ZXN0X21vZHVsZV9hc3luYyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspeworCXN0cnVjdCBzYWE3MTM0X2RldiogZGV2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBzYWE3MTM0X2RldiwgcmVxdWVzdF9tb2R1bGVfd2spOworCWlmIChjYXJkX2lzX2VtcHJlc3MoZGV2KSkKIAkJcmVxdWVzdF9tb2R1bGUoInNhYTcxMzQtZW1wcmVzcyIpOwotCWlmIChuZWVkX2R2YikKKwlpZiAoY2FyZF9pc19kdmIoZGV2KSkKIAkJcmVxdWVzdF9tb2R1bGUoInNhYTcxMzQtZHZiIik7Ci0JaWYgKG5lZWRfYWxzYSkKKwlpZiAoYWxzYSkKIAkJcmVxdWVzdF9tb2R1bGUoInNhYTcxMzQtYWxzYSIpOwotCWlmIChuZWVkX29zcykKKwlpZiAob3NzKQogCQlyZXF1ZXN0X21vZHVsZSgic2FhNzEzNC1vc3MiKTsKLQlyZXR1cm4gTk9USUZZX0RPTkU7CiB9CiAKLXN0YXRpYyBpbnQgcGVuZGluZ19yZWdpc3RlcmVkOwotc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBwZW5kaW5nX25vdGlmaWVyID0gewotCS5ub3RpZmllcl9jYWxsID0gcGVuZGluZ19jYWxsLAotfTsKLQotc3RhdGljIHZvaWQgcmVxdWVzdF9tb2R1bGVfZGVwZW5kKGNoYXIgKm5hbWUsIGludCAqZmxhZykKK3N0YXRpYyB2b2lkIHJlcXVlc3Rfc3VibW9kdWxlcyhzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldikKIHsKLQlpbnQgZXJyOwotCXN3aXRjaCAoVEhJU19NT0RVTEUtPnN0YXRlKSB7Ci0JY2FzZSBNT0RVTEVfU1RBVEVfQ09NSU5HOgotCQlpZiAoIXBlbmRpbmdfcmVnaXN0ZXJlZCkgewotCQkJZXJyID0gcmVnaXN0ZXJfbW9kdWxlX25vdGlmaWVyKCZwZW5kaW5nX25vdGlmaWVyKTsKLQkJCXBlbmRpbmdfcmVnaXN0ZXJlZCA9IDE7Ci0JCX0KLQkJKmZsYWcgPSAxOwotCQlicmVhazsKLQljYXNlIE1PRFVMRV9TVEFURV9MSVZFOgotCQlyZXF1ZXN0X21vZHVsZShuYW1lKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJLyogbm90aGluZyAqLzsKLQkJYnJlYWs7Ci0JfQorCUlOSVRfV09SSygmZGV2LT5yZXF1ZXN0X21vZHVsZV93aywgcmVxdWVzdF9tb2R1bGVfYXN5bmMpOworCXNjaGVkdWxlX3dvcmsoJmRldi0+cmVxdWVzdF9tb2R1bGVfd2spOwogfQogCiAjZWxzZQotI2RlZmluZSByZXF1ZXN0X21vZHVsZV9kZXBlbmQobmFtZSxmbGFnKQorI2RlZmluZSByZXF1ZXN0X3N1Ym1vZHVsZXMoZGV2KQogI2VuZGlmIC8qIENPTkZJR19NT0RVTEVTICovCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtNzAzLDcgKzczNCw2IEBACiAJCXNhYTcxMzRfdHNfZmluaShkZXYpOwogCXNhYTcxMzRfaW5wdXRfZmluaShkZXYpOwogCXNhYTcxMzRfdmJpX2ZpbmkoZGV2KTsKLQlzYWE3MTM0X3ZpZGVvX2ZpbmkoZGV2KTsKIAlzYWE3MTM0X3R2YXVkaW9fZmluaShkZXYpOwogCXJldHVybiAwOwogfQpAQCAtOTQ0LDE4ICs5NzQsOSBAQAogCQlyZXF1ZXN0X21vZHVsZSgidHVuZXIiKTsKIAlpZiAoY2FyZF9pc19lbXByZXNzKGRldikpIHsKIAkJcmVxdWVzdF9tb2R1bGUoInNhYTY3NTJocyIpOwotCQlyZXF1ZXN0X21vZHVsZV9kZXBlbmQoInNhYTcxMzQtZW1wcmVzcyIsJm5lZWRfZW1wcmVzcyk7CiAJfQogCi0JaWYgKGNhcmRfaXNfZHZiKGRldikpCi0JCXJlcXVlc3RfbW9kdWxlX2RlcGVuZCgic2FhNzEzNC1kdmIiLCZuZWVkX2R2Yik7Ci0KLQotCWlmIChhbHNhKQotCQlyZXF1ZXN0X21vZHVsZV9kZXBlbmQoInNhYTcxMzQtYWxzYSIsJm5lZWRfYWxzYSk7Ci0KLQlpZiAob3NzKQotCQlyZXF1ZXN0X21vZHVsZV9kZXBlbmQoInNhYTcxMzQtb3NzIiwmbmVlZF9vc3MpOworCXJlcXVlc3Rfc3VibW9kdWxlcyhkZXYpOwogCiAJdjRsMl9wcmlvX2luaXQoJmRldi0+cHJpbyk7CiAKQEAgLTEwMTMsNiArMTAzNCw5IEBACiAJCXNhYTcxMzRfZG1hc291bmRfaW5pdChkZXYpOwogCX0KIAorCWlmIChUVU5FUl9BQlNFTlQgIT0gZGV2LT50dW5lcl90eXBlKQorCQlzYWE3MTM0X2kyY19jYWxsX2NsaWVudHMoZGV2LCBUVU5FUl9TRVRfU1RBTkRCWSwgTlVMTCk7CisKIAlyZXR1cm4gMDsKIAogIGZhaWw0OgpAQCAtMTE1MiwxMCArMTE3Niw2IEBACiAKIHN0YXRpYyB2b2lkIHNhYTcxMzRfZmluaSh2b2lkKQogewotI2lmIGRlZmluZWQoQ09ORklHX01PRFVMRVMpICYmIGRlZmluZWQoTU9EVUxFKQotCWlmIChwZW5kaW5nX3JlZ2lzdGVyZWQpCi0JCXVucmVnaXN0ZXJfbW9kdWxlX25vdGlmaWVyKCZwZW5kaW5nX25vdGlmaWVyKTsKLSNlbmRpZiAvKiBDT05GSUdfTU9EVUxFUyAqLwogCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmc2FhNzEzNF9wY2lfZHJpdmVyKTsKIH0KIApAQCAtMTE2NCw2ICsxMTg0LDcgQEAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAorRVhQT1JUX1NZTUJPTChzYWE3MTM0X3NldF9ncGlvKTsKIEVYUE9SVF9TWU1CT0woc2FhNzEzNF9pMmNfY2FsbF9jbGllbnRzKTsKIEVYUE9SVF9TWU1CT0woc2FhNzEzNF9kZXZsaXN0KTsKIEVYUE9SVF9TWU1CT0woc2FhNzEzNF9ib2FyZHMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtZHZiLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1kdmIuYwppbmRleCBlMzA1OWZkLi42NWFlYzg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1kdmIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1kdmIuYwpAQCAtNDEsNyArNDEsOSBAQAogCiAjaW5jbHVkZSAidGRhMTAwODYuaCIKICNpbmNsdWRlICJ0ZGE4MjZ4LmgiCisjaW5jbHVkZSAidGRhODI3eC5oIgogI2luY2x1ZGUgImlzbDY0MjEuaCIKKwogTU9EVUxFX0FVVEhPUigiR2VyZCBLbm9yciA8a3JheGVsQGJ5dGVzZXgub3JnPiBbU3VTRSBMYWJzXSIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCkBAIC01NCw3ICs1NiwyMSBAQAogbW9kdWxlX3BhcmFtKHVzZV9mcm9udGVuZCwgaW50LCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0ModXNlX2Zyb250ZW5kLCJmb3IgY2FyZHMgd2l0aCBtdWx0aXBsZSBmcm9udGVuZHMgKDA6IHRlcnJlc3RyaWFsLCAxOiBzYXRlbGxpdGUpIik7CiAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIGludCBkZWJ1ZyA9IDA7Cittb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiVHVybiBvbi9vZmYgbW9kdWxlIGRlYnVnZ2luZyAoZGVmYXVsdDpvZmYpLiIpOworCisjZGVmaW5lIGRwcmludGsoZm10LCBhcmcuLi4pCWRvIHsgaWYgKGRlYnVnKSBcCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzL2R2YjogIiBmbXQsIGRldi0+bmFtZSAsICMjIGFyZyk7IH0gd2hpbGUoMCkKKworLyogUHJpbnQgYSB3YXJuaW5nICovCisjZGVmaW5lIHdwcmludGsoZm10LCBhcmcuLi4pIFwKKwlwcmludGsoS0VSTl9XQVJOSU5HICIlcy9kdmI6ICIgZm10LCBkZXYtPm5hbWUsICMjIGFyZykKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBtdDM1MiBiYXNlZCBEVkItVCBjYXJkcworICovCisKIHN0YXRpYyBpbnQgcGlubmFjbGVfYW50ZW5uYV9wd3Ioc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYsIGludCBvbikKIHsKIAl1MzIgb2s7CkBAIC03NSw4ICs5MSw3IEBACiAJc2FhX3NldGwoU0FBNzEzNF9HUElPX0dQU1RBVFVTMCA+PiAyLCAgICgxIDw8IDI4KSk7CiAJdWRlbGF5KDEwKTsKIAlvayA9IHNhYV9yZWFkbChTQUE3MTM0X0dQSU9fR1BTVEFUVVMwKSAmICgxIDw8IDI3KTsKLQlwcmludGsoIiVzOiAlcyAlc1xuIiwgZGV2LT5uYW1lLCBfX0ZVTkNUSU9OX18sCi0JICAgICAgIG9rID8gIm9uIiA6ICJvZmYiKTsKKwlkcHJpbnRrKCIlcyAlc1xuIiwgX19GVU5DVElPTl9fLCBvayA/ICJvbiIgOiAib2ZmIik7CiAKIAlpZiAoIW9rKQogCQlzYWFfY2xlYXJsKFNBQTcxMzRfR1BJT19HUFNUQVRVUzAgPj4gMiwgICAoMSA8PCAyNikpOwpAQCAtOTYsNyArMTExLDcgQEAKIAlzdGF0aWMgdTggaXJxX2NmZyBbXSAgICAgICA9IHsgSU5URVJSVVBUX0VOXzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfTsKIAlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldj0gZmUtPmR2Yi0+cHJpdjsKIAotCXByaW50aygiJXM6ICVzIGNhbGxlZFxuIixkZXYtPm5hbWUsX19GVU5DVElPTl9fKTsKKwlkcHJpbnRrKCIlcyBjYWxsZWRcbiIsIF9fRlVOQ1RJT05fXyk7CiAKIAltdDM1Ml93cml0ZShmZSwgY2xvY2tfY29uZmlnLCAgIHNpemVvZihjbG9ja19jb25maWcpKTsKIAl1ZGVsYXkoMjAwKTsKQEAgLTE4NSwxMCArMjAwLDI2IEBACiAJLmRlbW9kX2luaXQgICAgPSBtdDM1Ml9hdmVyNzc3X2luaXQsCiB9OwogCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXN0YXRpYyBpbnQgcGhpbGlwc190ZGE2NjUxX3BsbF9zZXQodTggYWRkciwgc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcGFyYW1zKQorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiB0ZGExMDA0eCBiYXNlZCBEVkItVCBjYXJkcywgaGVscGVyIGZ1bmN0aW9ucworICovCisKK3N0YXRpYyBpbnQgcGhpbGlwc190ZGExMDA0eF9yZXF1ZXN0X2Zpcm13YXJlKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorCQkJCQkgICBjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKipmdywgY2hhciAqbmFtZSkKIHsKIAlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IGZlLT5kdmItPnByaXY7CisJcmV0dXJuIHJlcXVlc3RfZmlybXdhcmUoZncsIG5hbWUsICZkZXYtPnBjaS0+ZGV2KTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB0aGVzZSB0dW5lcnMgYXJlIHR1MTIxNiwgdGQxMzE2KGEpCisgKi8KKworc3RhdGljIGludCBwaGlsaXBzX3RkYTY2NTFfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXMpCit7CisJc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSBmZS0+ZHZiLT5wcml2OworCXN0cnVjdCB0ZGExMDA0eF9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwl1OCBhZGRyID0gc3RhdGUtPmNvbmZpZy0+dHVuZXJfYWRkcmVzczsKIAl1OCB0dW5lcl9idWZbNF07CiAJc3RydWN0IGkyY19tc2cgdHVuZXJfbXNnID0gey5hZGRyID0gYWRkciwuZmxhZ3MgPSAwLC5idWYgPSB0dW5lcl9idWYsLmxlbiA9CiAJCQlzaXplb2YodHVuZXJfYnVmKSB9OwpAQCAtMjYzLDE1ICsyOTQsMjAgQEAKIAogCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCiAJCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMSk7Ci0JaWYgKGkyY190cmFuc2ZlcigmZGV2LT5pMmNfYWRhcCwgJnR1bmVyX21zZywgMSkgIT0gMSkKKwlpZiAoaTJjX3RyYW5zZmVyKCZkZXYtPmkyY19hZGFwLCAmdHVuZXJfbXNnLCAxKSAhPSAxKSB7CisJCXdwcmludGsoImNvdWxkIG5vdCB3cml0ZSB0byB0dW5lciBhdCBhZGRyOiAweCUwMnhcbiIsCisJCQlhZGRyIDw8IDEpOwogCQlyZXR1cm4gLUVJTzsKKwl9CiAJbXNsZWVwKDEpOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHBoaWxpcHNfdGRhNjY1MV9wbGxfaW5pdCh1OCBhZGRyLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3N0YXRpYyBpbnQgcGhpbGlwc190dTEyMTZfaW5pdChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKIHsKIAlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IGZlLT5kdmItPnByaXY7CisJc3RydWN0IHRkYTEwMDR4X3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXU4IGFkZHIgPSBzdGF0ZS0+Y29uZmlnLT50dW5lcl9hZGRyZXNzOwogCXN0YXRpYyB1OCB0dTEyMTZfaW5pdFtdID0geyAweDBiLCAweGY1LCAweDg1LCAweGFiIH07CiAJc3RydWN0IGkyY19tc2cgdHVuZXJfbXNnID0gey5hZGRyID0gYWRkciwuZmxhZ3MgPSAwLC5idWYgPSB0dTEyMTZfaW5pdCwubGVuID0gc2l6ZW9mKHR1MTIxNl9pbml0KSB9OwogCkBAIC0yODcsNDYgKzMyMywxNyBAQAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotc3RhdGljIGludCBwaGlsaXBzX3R1MTIxNl90dW5lcl82MF9pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQotewotCXJldHVybiBwaGlsaXBzX3RkYTY2NTFfcGxsX2luaXQoMHg2MCwgZmUpOwotfQotCi1zdGF0aWMgaW50IHBoaWxpcHNfdHUxMjE2X3R1bmVyXzYwX3NldF9wYXJhbXMoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcGFyYW1zKQotewotCXJldHVybiBwaGlsaXBzX3RkYTY2NTFfcGxsX3NldCgweDYwLCBmZSwgcGFyYW1zKTsKLX0KLQotc3RhdGljIGludCBwaGlsaXBzX3RkYTEwMDR4X3JlcXVlc3RfZmlybXdhcmUoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCi0JCQkJCSAgIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqKmZ3LCBjaGFyICpuYW1lKQotewotCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gZmUtPmR2Yi0+cHJpdjsKLQlyZXR1cm4gcmVxdWVzdF9maXJtd2FyZShmdywgbmFtZSwgJmRldi0+cGNpLT5kZXYpOwotfQotCiBzdGF0aWMgc3RydWN0IHRkYTEwMDR4X2NvbmZpZyBwaGlsaXBzX3R1MTIxNl82MF9jb25maWcgPSB7Ci0KIAkuZGVtb2RfYWRkcmVzcyA9IDB4OCwKIAkuaW52ZXJ0ICAgICAgICA9IDEsCiAJLmludmVydF9vY2xrICAgPSAwLAogCS54dGFsX2ZyZXEgICAgID0gVERBMTAwNDZfWFRBTF80TSwKIAkuYWdjX2NvbmZpZyAgICA9IFREQTEwMDQ2X0FHQ19ERUZBVUxULAogCS5pZl9mcmVxICAgICAgID0gVERBMTAwNDZfRlJFUV8zNjE3LAotCS5yZXF1ZXN0X2Zpcm13YXJlID0gcGhpbGlwc190ZGExMDA0eF9yZXF1ZXN0X2Zpcm13YXJlLAorCS50dW5lcl9hZGRyZXNzID0gMHg2MCwKKwkucmVxdWVzdF9maXJtd2FyZSA9IHBoaWxpcHNfdGRhMTAwNHhfcmVxdWVzdF9maXJtd2FyZQogfTsKIAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLXN0YXRpYyBpbnQgcGhpbGlwc190dTEyMTZfdHVuZXJfNjFfaW5pdChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKLXsKLQlyZXR1cm4gcGhpbGlwc190ZGE2NjUxX3BsbF9pbml0KDB4NjEsIGZlKTsKLX0KLQotc3RhdGljIGludCBwaGlsaXBzX3R1MTIxNl90dW5lcl82MV9zZXRfcGFyYW1zKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnBhcmFtcykKLXsKLQlyZXR1cm4gcGhpbGlwc190ZGE2NjUxX3BsbF9zZXQoMHg2MSwgZmUsIHBhcmFtcyk7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgdGRhMTAwNHhfY29uZmlnIHBoaWxpcHNfdHUxMjE2XzYxX2NvbmZpZyA9IHsKIAogCS5kZW1vZF9hZGRyZXNzID0gMHg4LApAQCAtMzM1LDcgKzM0Miw4IEBACiAJLnh0YWxfZnJlcSAgICAgPSBUREExMDA0Nl9YVEFMXzRNLAogCS5hZ2NfY29uZmlnICAgID0gVERBMTAwNDZfQUdDX0RFRkFVTFQsCiAJLmlmX2ZyZXEgICAgICAgPSBUREExMDA0Nl9GUkVRXzM2MTcsCi0JLnJlcXVlc3RfZmlybXdhcmUgPSBwaGlsaXBzX3RkYTEwMDR4X3JlcXVlc3RfZmlybXdhcmUsCisJLnR1bmVyX2FkZHJlc3MgPSAweDYxLAorCS5yZXF1ZXN0X2Zpcm13YXJlID0gcGhpbGlwc190ZGExMDA0eF9yZXF1ZXN0X2Zpcm13YXJlCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTM0MywyNCArMzUxLDQyIEBACiBzdGF0aWMgaW50IHBoaWxpcHNfdGQxMzE2X3R1bmVyX2luaXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCiB7CiAJc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSBmZS0+ZHZiLT5wcml2OworCXN0cnVjdCB0ZGExMDA0eF9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwl1OCBhZGRyID0gc3RhdGUtPmNvbmZpZy0+dHVuZXJfYWRkcmVzczsKIAlzdGF0aWMgdTggbXNnW10gPSB7IDB4MGIsIDB4ZjUsIDB4ODYsIDB4YWIgfTsKLQlzdHJ1Y3QgaTJjX21zZyBpbml0X21zZyA9IHsuYWRkciA9IDB4NjEsLmZsYWdzID0gMCwuYnVmID0gbXNnLC5sZW4gPSBzaXplb2YobXNnKSB9OworCXN0cnVjdCBpMmNfbXNnIGluaXRfbXNnID0gey5hZGRyID0gYWRkciwuZmxhZ3MgPSAwLC5idWYgPSBtc2csLmxlbiA9IHNpemVvZihtc2cpIH07CiAKIAkvKiBzZXR1cCBQTEwgY29uZmlndXJhdGlvbiAqLwogCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCiAJCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMSk7CiAJaWYgKGkyY190cmFuc2ZlcigmZGV2LT5pMmNfYWRhcCwgJmluaXRfbXNnLCAxKSAhPSAxKQogCQlyZXR1cm4gLUVJTzsKLQlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQotCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDApOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHBoaWxpcHNfdGQxMzE2X3R1bmVyX3NldF9wYXJhbXMoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcGFyYW1zKQogewotCXJldHVybiBwaGlsaXBzX3RkYTY2NTFfcGxsX3NldCgweDYxLCBmZSwgcGFyYW1zKTsKKwlyZXR1cm4gcGhpbGlwc190ZGE2NjUxX3BsbF9zZXQoZmUsIHBhcmFtcyk7CiB9CiAKK3N0YXRpYyBpbnQgcGhpbGlwc190ZDEzMTZfdHVuZXJfc2xlZXAoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCit7CisJc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSBmZS0+ZHZiLT5wcml2OworCXN0cnVjdCB0ZGExMDA0eF9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwl1OCBhZGRyID0gc3RhdGUtPmNvbmZpZy0+dHVuZXJfYWRkcmVzczsKKwlzdGF0aWMgdTggbXNnW10gPSB7IDB4MGIsIDB4ZGMsIDB4ODYsIDB4YTQgfTsKKwlzdHJ1Y3QgaTJjX21zZyBhbmFsb2dfbXNnID0gey5hZGRyID0gYWRkciwuZmxhZ3MgPSAwLC5idWYgPSBtc2csLmxlbiA9IHNpemVvZihtc2cpIH07CisKKwkvKiBzd2l0Y2ggdGhlIHR1bmVyIHRvIGFuYWxvZyBtb2RlICovCisJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKKwlpZiAoaTJjX3RyYW5zZmVyKCZkZXYtPmkyY19hZGFwLCAmYW5hbG9nX21zZywgMSkgIT0gMSkKKwkJcmV0dXJuIC1FSU87CisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCiBzdGF0aWMgaW50IHBoaWxpcHNfZXVyb3BhX3R1bmVyX2luaXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCiB7CiAJc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSBmZS0+ZHZiLT5wcml2OwpAQCAtMzgwLDE4ICs0MDYsMTQgQEAKIHN0YXRpYyBpbnQgcGhpbGlwc19ldXJvcGFfdHVuZXJfc2xlZXAoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCiB7CiAJc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSBmZS0+ZHZiLT5wcml2OwotCS8qIHRoaXMgbWVzc2FnZSBhY3R1YWxseSB0dXJucyB0aGUgdHVuZXIgYmFjayB0byBhbmFsb2cgbW9kZSAqLwotCXN0YXRpYyB1OCBtc2dbXSA9IHsgMHgwYiwgMHhkYywgMHg4NiwgMHhhNCB9OwotCXN0cnVjdCBpMmNfbXNnIGFuYWxvZ19tc2cgPSB7LmFkZHIgPSAweDYxLC5mbGFncyA9IDAsLmJ1ZiA9IG1zZywubGVuID0gc2l6ZW9mKG1zZykgfTsKIAotCWkyY190cmFuc2ZlcigmZGV2LT5pMmNfYWRhcCwgJmFuYWxvZ19tc2csIDEpOwotCW1zbGVlcCgxKTsKKwlzdGF0aWMgdTggbXNnW10gPSB7IDB4MDAsIDB4MTQgfTsKKwlzdHJ1Y3QgaTJjX21zZyBhbmFsb2dfbXNnID0gey5hZGRyID0gMHg0MywuZmxhZ3MgPSAwLC5idWYgPSBtc2csLmxlbiA9IHNpemVvZihtc2cpIH07CisKKwlpZiAocGhpbGlwc190ZDEzMTZfdHVuZXJfc2xlZXAoZmUpKQorCQlyZXR1cm4gLUVJTzsKIAogCS8qIHN3aXRjaCB0aGUgYm9hcmQgdG8gYW5hbG9nIG1vZGUgKi8KLQlhbmFsb2dfbXNnLmFkZHIgPSAweDQzOwotCWFuYWxvZ19tc2cubGVuICA9IDB4MDI7Ci0JbXNnWzBdID0gMHgwMDsKLQltc2dbMV0gPSAweDE0OwogCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCiAJCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMSk7CiAJaTJjX3RyYW5zZmVyKCZkZXYtPmkyY19hZGFwLCAmYW5hbG9nX21zZywgMSk7CkBAIC00MTYsNyArNDM4LDggQEAKIAkueHRhbF9mcmVxICAgICA9IFREQTEwMDQ2X1hUQUxfNE0sCiAJLmFnY19jb25maWcgICAgPSBUREExMDA0Nl9BR0NfSUZPX0FVVE9fUE9TLAogCS5pZl9mcmVxICAgICAgID0gVERBMTAwNDZfRlJFUV8wNTIsCi0JLnJlcXVlc3RfZmlybXdhcmUgPSBOVUxMLAorCS50dW5lcl9hZGRyZXNzID0gMHg2MSwKKwkucmVxdWVzdF9maXJtd2FyZSA9IHBoaWxpcHNfdGRhMTAwNHhfcmVxdWVzdF9maXJtd2FyZQogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC00MjQsOSArNDQ3LDExIEBACiBzdGF0aWMgaW50IHBoaWxpcHNfZm1kMTIxNl90dW5lcl9pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQogewogCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gZmUtPmR2Yi0+cHJpdjsKKwlzdHJ1Y3QgdGRhMTAwNHhfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJdTggYWRkciA9IHN0YXRlLT5jb25maWctPnR1bmVyX2FkZHJlc3M7CiAJLyogdGhpcyBtZXNzYWdlIGlzIHRvIHNldCB1cCBBVEMgYW5kIEFMQyAqLwogCXN0YXRpYyB1OCBmbWQxMjE2X2luaXRbXSA9IHsgMHgwYiwgMHhkYywgMHg5YywgMHhhMCB9OwotCXN0cnVjdCBpMmNfbXNnIHR1bmVyX21zZyA9IHsuYWRkciA9IDB4NjEsLmZsYWdzID0gMCwuYnVmID0gZm1kMTIxNl9pbml0LC5sZW4gPSBzaXplb2YoZm1kMTIxNl9pbml0KSB9OworCXN0cnVjdCBpMmNfbXNnIHR1bmVyX21zZyA9IHsuYWRkciA9IGFkZHIsLmZsYWdzID0gMCwuYnVmID0gZm1kMTIxNl9pbml0LC5sZW4gPSBzaXplb2YoZm1kMTIxNl9pbml0KSB9OwogCiAJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKIAkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKQEAgLTQ0MCw5ICs0NjUsMTEgQEAKIHN0YXRpYyBpbnQgcGhpbGlwc19mbWQxMjE2X3R1bmVyX3NsZWVwKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQogewogCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gZmUtPmR2Yi0+cHJpdjsKKwlzdHJ1Y3QgdGRhMTAwNHhfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJdTggYWRkciA9IHN0YXRlLT5jb25maWctPnR1bmVyX2FkZHJlc3M7CiAJLyogdGhpcyBtZXNzYWdlIGFjdHVhbGx5IHR1cm5zIHRoZSB0dW5lciBiYWNrIHRvIGFuYWxvZyBtb2RlICovCi0Jc3RhdGljIHU4IGZtZDEyMTZfaW5pdFtdID0geyAweDBiLCAweGRjLCAweDljLCAweDYwIH07Ci0Jc3RydWN0IGkyY19tc2cgdHVuZXJfbXNnID0gey5hZGRyID0gMHg2MSwuZmxhZ3MgPSAwLC5idWYgPSBmbWQxMjE2X2luaXQsLmxlbiA9IHNpemVvZihmbWQxMjE2X2luaXQpIH07CisJdTggZm1kMTIxNl9pbml0W10gPSB7IDB4MGIsIDB4ZGMsIDB4OWMsIDB4NjAgfTsKKwlzdHJ1Y3QgaTJjX21zZyB0dW5lcl9tc2cgPSB7LmFkZHIgPSBhZGRyLC5mbGFncyA9IDAsLmJ1ZiA9IGZtZDEyMTZfaW5pdCwubGVuID0gc2l6ZW9mKGZtZDEyMTZfaW5pdCkgfTsKIAogCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCiAJCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMSk7CkBAIC00NjAsOCArNDg3LDEwIEBACiBzdGF0aWMgaW50IHBoaWxpcHNfZm1kMTIxNl90dW5lcl9zZXRfcGFyYW1zKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnBhcmFtcykKIHsKIAlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IGZlLT5kdmItPnByaXY7CisJc3RydWN0IHRkYTEwMDR4X3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXU4IGFkZHIgPSBzdGF0ZS0+Y29uZmlnLT50dW5lcl9hZGRyZXNzOwogCXU4IHR1bmVyX2J1Zls0XTsKLQlzdHJ1Y3QgaTJjX21zZyB0dW5lcl9tc2cgPSB7LmFkZHIgPSAweDYxLC5mbGFncyA9IDAsLmJ1ZiA9IHR1bmVyX2J1ZiwubGVuID0KKwlzdHJ1Y3QgaTJjX21zZyB0dW5lcl9tc2cgPSB7LmFkZHIgPSBhZGRyLC5mbGFncyA9IDAsLmJ1ZiA9IHR1bmVyX2J1ZiwubGVuID0KIAkJCXNpemVvZih0dW5lcl9idWYpIH07CiAJaW50IHR1bmVyX2ZyZXF1ZW5jeSA9IDA7CiAJaW50IGRpdmlkZXIgPSAwOwpAQCAtNTM2LDggKzU2NSwxMSBAQAogCiAJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKIAkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKLQlpZiAoaTJjX3RyYW5zZmVyKCZkZXYtPmkyY19hZGFwLCAmdHVuZXJfbXNnLCAxKSAhPSAxKQorCWlmIChpMmNfdHJhbnNmZXIoJmRldi0+aTJjX2FkYXAsICZ0dW5lcl9tc2csIDEpICE9IDEpIHsKKwkJd3ByaW50aygiY291bGQgbm90IHdyaXRlIHRvIHR1bmVyIGF0IGFkZHI6IDB4JTAyeFxuIiwKKwkJCWFkZHIgPDwgMSk7CiAJCXJldHVybiAtRUlPOworCX0KIAlyZXR1cm4gMDsKIH0KIApAQCAtNTQ4LDQ4NCArNTgwLDMyMyBAQAogCS54dGFsX2ZyZXEgICAgID0gVERBMTAwNDZfWFRBTF8xNk0sCiAJLmFnY19jb25maWcgICAgPSBUREExMDA0Nl9BR0NfSUZPX0FVVE9fTkVHLAogCS5pZl9mcmVxICAgICAgID0gVERBMTAwNDZfRlJFUV8zNjEzLAotCS5yZXF1ZXN0X2Zpcm13YXJlID0gTlVMTCwKKwkudHVuZXJfYWRkcmVzcyA9IDB4NjEsCisJLnJlcXVlc3RfZmlybXdhcmUgPSBwaGlsaXBzX3RkYTEwMDR4X3JlcXVlc3RfZmlybXdhcmUKIH07CiAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB0ZGEgMTAwNHggYmFzZWQgY2FyZHMgd2l0aCBwaGlsaXBzIHNpbGljb24gdHVuZXIKKyAqLwogCi1zdHJ1Y3QgdGRhODI3eF9kYXRhIHsKLQl1MzIgbG9tYXg7Ci0JdTggIHNwZDsKLQl1OCAgYnM7Ci0JdTggIGJwOwotCXU4ICBjcDsKLQl1OCAgZ2MzOwotCXU4IGRpdjFwNTsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdGRhODI3eF9kYXRhIHRkYTgyN3hfZHZidFtdID0gewotCXsgLmxvbWF4ID0gIDYyMDAwMDAwLCAuc3BkID0gMywgLmJzID0gMiwgLmJwID0gMCwgLmNwID0gMCwgLmdjMyA9IDMsIC5kaXYxcDUgPSAxfSwKLQl7IC5sb21heCA9ICA2NjAwMDAwMCwgLnNwZCA9IDMsIC5icyA9IDMsIC5icCA9IDAsIC5jcCA9IDAsIC5nYzMgPSAzLCAuZGl2MXA1ID0gMX0sCi0JeyAubG9tYXggPSAgNzYwMDAwMDAsIC5zcGQgPSAzLCAuYnMgPSAxLCAuYnAgPSAwLCAuY3AgPSAwLCAuZ2MzID0gMywgLmRpdjFwNSA9IDB9LAotCXsgLmxvbWF4ID0gIDg0MDAwMDAwLCAuc3BkID0gMywgLmJzID0gMiwgLmJwID0gMCwgLmNwID0gMCwgLmdjMyA9IDMsIC5kaXYxcDUgPSAwfSwKLQl7IC5sb21heCA9ICA5MzAwMDAwMCwgLnNwZCA9IDMsIC5icyA9IDIsIC5icCA9IDAsIC5jcCA9IDAsIC5nYzMgPSAxLCAuZGl2MXA1ID0gMH0sCi0JeyAubG9tYXggPSAgOTgwMDAwMDAsIC5zcGQgPSAzLCAuYnMgPSAzLCAuYnAgPSAwLCAuY3AgPSAwLCAuZ2MzID0gMSwgLmRpdjFwNSA9IDB9LAotCXsgLmxvbWF4ID0gMTA5MDAwMDAwLCAuc3BkID0gMywgLmJzID0gMywgLmJwID0gMSwgLmNwID0gMCwgLmdjMyA9IDEsIC5kaXYxcDUgPSAwfSwKLQl7IC5sb21heCA9IDEyMzAwMDAwMCwgLnNwZCA9IDIsIC5icyA9IDIsIC5icCA9IDEsIC5jcCA9IDAsIC5nYzMgPSAxLCAuZGl2MXA1ID0gMX0sCi0JeyAubG9tYXggPSAxMzMwMDAwMDAsIC5zcGQgPSAyLCAuYnMgPSAzLCAuYnAgPSAxLCAuY3AgPSAwLCAuZ2MzID0gMSwgLmRpdjFwNSA9IDF9LAotCXsgLmxvbWF4ID0gMTUxMDAwMDAwLCAuc3BkID0gMiwgLmJzID0gMSwgLmJwID0gMSwgLmNwID0gMCwgLmdjMyA9IDEsIC5kaXYxcDUgPSAwfSwKLQl7IC5sb21heCA9IDE1NDAwMDAwMCwgLnNwZCA9IDIsIC5icyA9IDIsIC5icCA9IDEsIC5jcCA9IDAsIC5nYzMgPSAxLCAuZGl2MXA1ID0gMH0sCi0JeyAubG9tYXggPSAxODEwMDAwMDAsIC5zcGQgPSAyLCAuYnMgPSAyLCAuYnAgPSAxLCAuY3AgPSAwLCAuZ2MzID0gMCwgLmRpdjFwNSA9IDB9LAotCXsgLmxvbWF4ID0gMTg1MDAwMDAwLCAuc3BkID0gMiwgLmJzID0gMiwgLmJwID0gMiwgLmNwID0gMCwgLmdjMyA9IDEsIC5kaXYxcDUgPSAwfSwKLQl7IC5sb21heCA9IDIxNzAwMDAwMCwgLnNwZCA9IDIsIC5icyA9IDMsIC5icCA9IDIsIC5jcCA9IDAsIC5nYzMgPSAxLCAuZGl2MXA1ID0gMH0sCi0JeyAubG9tYXggPSAyNDQwMDAwMDAsIC5zcGQgPSAxLCAuYnMgPSAyLCAuYnAgPSAyLCAuY3AgPSAwLCAuZ2MzID0gMSwgLmRpdjFwNSA9IDF9LAotCXsgLmxvbWF4ID0gMjY1MDAwMDAwLCAuc3BkID0gMSwgLmJzID0gMywgLmJwID0gMiwgLmNwID0gMCwgLmdjMyA9IDEsIC5kaXYxcDUgPSAxfSwKLQl7IC5sb21heCA9IDMwMjAwMDAwMCwgLnNwZCA9IDEsIC5icyA9IDEsIC5icCA9IDIsIC5jcCA9IDAsIC5nYzMgPSAxLCAuZGl2MXA1ID0gMH0sCi0JeyAubG9tYXggPSAzMjQwMDAwMDAsIC5zcGQgPSAxLCAuYnMgPSAyLCAuYnAgPSAyLCAuY3AgPSAwLCAuZ2MzID0gMSwgLmRpdjFwNSA9IDB9LAotCXsgLmxvbWF4ID0gMzcwMDAwMDAwLCAuc3BkID0gMSwgLmJzID0gMiwgLmJwID0gMywgLmNwID0gMCwgLmdjMyA9IDEsIC5kaXYxcDUgPSAwfSwKLQl7IC5sb21heCA9IDQ1NDAwMDAwMCwgLnNwZCA9IDEsIC5icyA9IDMsIC5icCA9IDMsIC5jcCA9IDAsIC5nYzMgPSAxLCAuZGl2MXA1ID0gMH0sCi0JeyAubG9tYXggPSA0OTMwMDAwMDAsIC5zcGQgPSAwLCAuYnMgPSAyLCAuYnAgPSAzLCAuY3AgPSAwLCAuZ2MzID0gMSwgLmRpdjFwNSA9IDF9LAotCXsgLmxvbWF4ID0gNTMwMDAwMDAwLCAuc3BkID0gMCwgLmJzID0gMywgLmJwID0gMywgLmNwID0gMCwgLmdjMyA9IDEsIC5kaXYxcDUgPSAxfSwKLQl7IC5sb21heCA9IDU1NDAwMDAwMCwgLnNwZCA9IDAsIC5icyA9IDEsIC5icCA9IDMsIC5jcCA9IDAsIC5nYzMgPSAxLCAuZGl2MXA1ID0gMH0sCi0JeyAubG9tYXggPSA2MDQwMDAwMDAsIC5zcGQgPSAwLCAuYnMgPSAxLCAuYnAgPSA0LCAuY3AgPSAwLCAuZ2MzID0gMCwgLmRpdjFwNSA9IDB9LAotCXsgLmxvbWF4ID0gNjk2MDAwMDAwLCAuc3BkID0gMCwgLmJzID0gMiwgLmJwID0gNCwgLmNwID0gMCwgLmdjMyA9IDAsIC5kaXYxcDUgPSAwfSwKLQl7IC5sb21heCA9IDc0MDAwMDAwMCwgLnNwZCA9IDAsIC5icyA9IDIsIC5icCA9IDQsIC5jcCA9IDEsIC5nYzMgPSAwLCAuZGl2MXA1ID0gMH0sCi0JeyAubG9tYXggPSA4MjAwMDAwMDAsIC5zcGQgPSAwLCAuYnMgPSAzLCAuYnAgPSA0LCAuY3AgPSAwLCAuZ2MzID0gMCwgLmRpdjFwNSA9IDB9LAotCXsgLmxvbWF4ID0gODY1MDAwMDAwLCAuc3BkID0gMCwgLmJzID0gMywgLmJwID0gNCwgLmNwID0gMSwgLmdjMyA9IDAsIC5kaXYxcDUgPSAwfSwKLQl7IC5sb21heCA9ICAgICAgICAgMCwgLnNwZCA9IDAsIC5icyA9IDAsIC5icCA9IDAsIC5jcCA9IDAsIC5nYzMgPSAwLCAuZGl2MXA1ID0gMH0KLX07Ci0KLXN0YXRpYyBpbnQgcGhpbGlwc190ZGE4Mjd4X3R1bmVyX2luaXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcGhpbGlwc190ZGE4Mjd4X3R1bmVyX3NldF9wYXJhbXMoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcGFyYW1zKQorc3RhdGljIHZvaWQgcGhpbGlwc190ZGE4Mjd4X2xuYV9nYWluKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBpbnQgaGlnaCkKIHsKIAlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IGZlLT5kdmItPnByaXY7Ci0JdTggdHVuZXJfYnVmWzE0XTsKKwlzdHJ1Y3QgdGRhMTAwNHhfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJdTggYWRkciA9IHN0YXRlLT5jb25maWctPmkyY19nYXRlOworCXU4IGNvbmZpZyA9IHN0YXRlLT5jb25maWctPnR1bmVyX2NvbmZpZzsKKwl1OCBHUDAwX0NGW10gPSB7MHgyMCwgMHgwMX07CisJdTggR1AwMF9MRVZbXSA9IHsweDIyLCAweDAwfTsKIAotCXN0cnVjdCBpMmNfbXNnIHR1bmVyX21zZyA9IHsuYWRkciA9IDB4NjAsLmZsYWdzID0gMCwuYnVmID0gdHVuZXJfYnVmLAotCQkJCQkubGVuID0gc2l6ZW9mKHR1bmVyX2J1ZikgfTsKLQlpbnQgaSwgdHVuZXJfZnJlcSwgaWZfZnJlcTsKLQl1MzIgTjsKLQlzd2l0Y2ggKHBhcmFtcy0+dS5vZmRtLmJhbmR3aWR0aCkgewotCWNhc2UgQkFORFdJRFRIXzZfTUhaOgotCQlpZl9mcmVxID0gNDAwMDAwMDsKKwlzdHJ1Y3QgaTJjX21zZyBtc2cgPSB7LmFkZHIgPSBhZGRyLC5mbGFncyA9IDAsLmJ1ZiA9IEdQMDBfQ0YsIC5sZW4gPSAyfTsKKwlpZiAoY29uZmlnKSB7CisJCWlmIChoaWdoKSB7CisJCQlkcHJpbnRrKCJzZXR0aW5nIExOQSB0byBoaWdoIGdhaW5cbiIpOworCQl9IGVsc2UgeworCQkJZHByaW50aygic2V0dGluZyBMTkEgdG8gbG93IGdhaW5cbiIpOworCQl9CisJfQorCXN3aXRjaCAoY29uZmlnKSB7CisJY2FzZSAwOiAvKiBubyBMTkEgKi8KIAkJYnJlYWs7Ci0JY2FzZSBCQU5EV0lEVEhfN19NSFo6Ci0JCWlmX2ZyZXEgPSA0NTAwMDAwOworCWNhc2UgMTogLyogc3dpdGNoIGlzIEdQSU8gMCBvZiB0ZGE4MjkwICovCisJY2FzZSAyOgorCQkvKiB0dXJuIFZzeW5jIG9mZiAqLworCQlzYWE3MTM0X3NldF9ncGlvKGRldiwgMjIsIDApOworCQlHUDAwX0xFVlsxXSA9IGhpZ2ggPyAwIDogMTsKKwkJaWYgKGkyY190cmFuc2ZlcigmZGV2LT5pMmNfYWRhcCwgJm1zZywgMSkgIT0gMSkgeworCQkJd3ByaW50aygiY291bGQgbm90IGFjY2VzcyB0ZGE4MjkwIGF0IGFkZHI6IDB4JTAyeFxuIiwKKwkJCQlhZGRyIDw8IDEpOworCQkJcmV0dXJuOworCQl9CisJCW1zZy5idWYgPSBHUDAwX0xFVjsKKwkJaWYgKGNvbmZpZyA9PSAyKQorCQkJR1AwMF9MRVZbMV0gPSBoaWdoID8gMSA6IDA7CisJCWkyY190cmFuc2ZlcigmZGV2LT5pMmNfYWRhcCwgJm1zZywgMSk7CiAJCWJyZWFrOwotCWRlZmF1bHQ6CQkgICAvKiA4IE1IeiBvciBBdXRvICovCi0JCWlmX2ZyZXEgPSA1MDAwMDAwOworCWNhc2UgMzogLyogc3dpdGNoIHdpdGggR1BJTyBvZiBzYWE3MTN4ICovCisJCXNhYTcxMzRfc2V0X2dwaW8oZGV2LCAyMiwgaGlnaCk7CiAJCWJyZWFrOwogCX0KLQl0dW5lcl9mcmVxID0gcGFyYW1zLT5mcmVxdWVuY3kgKyBpZl9mcmVxOwotCi0JaSA9IDA7Ci0Jd2hpbGUgKHRkYTgyN3hfZHZidFtpXS5sb21heCA8IHR1bmVyX2ZyZXEpIHsKLQkJaWYodGRhODI3eF9kdmJ0W2kgKyAxXS5sb21heCA9PSAwKQotCQkJYnJlYWs7Ci0JCWkrKzsKLQl9Ci0KLQlOID0gKCh0dW5lcl9mcmVxICsgMTI1MDAwKSAvIDI1MDAwMCkgPDwgKHRkYTgyN3hfZHZidFtpXS5zcGQgKyAyKTsKLQl0dW5lcl9idWZbMF0gPSAwOwotCXR1bmVyX2J1ZlsxXSA9IChOPj44KSB8IDB4NDA7Ci0JdHVuZXJfYnVmWzJdID0gTiAmIDB4ZmY7Ci0JdHVuZXJfYnVmWzNdID0gMDsKLQl0dW5lcl9idWZbNF0gPSAweDUyOwotCXR1bmVyX2J1Zls1XSA9ICh0ZGE4Mjd4X2R2YnRbaV0uc3BkIDw8IDYpICsgKHRkYTgyN3hfZHZidFtpXS5kaXYxcDUgPDwgNSkgKwotCQkJCSAgICh0ZGE4Mjd4X2R2YnRbaV0uYnMgPDwgMykgKyB0ZGE4Mjd4X2R2YnRbaV0uYnA7Ci0JdHVuZXJfYnVmWzZdID0gKHRkYTgyN3hfZHZidFtpXS5nYzMgPDwgNCkgKyAweDhmOwotCXR1bmVyX2J1Zls3XSA9IDB4YmY7Ci0JdHVuZXJfYnVmWzhdID0gMHgyYTsKLQl0dW5lcl9idWZbOV0gPSAweDA1OwotCXR1bmVyX2J1ZlsxMF0gPSAweGZmOwotCXR1bmVyX2J1ZlsxMV0gPSAweDAwOwotCXR1bmVyX2J1ZlsxMl0gPSAweDAwOwotCXR1bmVyX2J1ZlsxM10gPSAweDQwOwotCi0JdHVuZXJfbXNnLmxlbiA9IDE0OwotCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCi0JCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMSk7Ci0JaWYgKGkyY190cmFuc2ZlcigmZGV2LT5pMmNfYWRhcCwgJnR1bmVyX21zZywgMSkgIT0gMSkKLQkJcmV0dXJuIC1FSU87Ci0KLQltc2xlZXAoNTAwKTsKLQkvKiBjb3JyZWN0IENQIHZhbHVlICovCi0JdHVuZXJfYnVmWzBdID0gMHgzMDsKLQl0dW5lcl9idWZbMV0gPSAweDUwICsgdGRhODI3eF9kdmJ0W2ldLmNwOwotCXR1bmVyX21zZy5sZW4gPSAyOwotCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCi0JCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMSk7Ci0JaTJjX3RyYW5zZmVyKCZkZXYtPmkyY19hZGFwLCAmdHVuZXJfbXNnLCAxKTsKLQotCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHBoaWxpcHNfdGRhODI3eF90dW5lcl9zbGVlcChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3N0YXRpYyBpbnQgdGRhODI5MF9pMmNfZ2F0ZV9jdHJsKCBzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgaW50IGVuYWJsZSkKIHsKLQlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IGZlLT5kdmItPnByaXY7Ci0Jc3RhdGljIHU4IHRkYTgyN3hfc2xlZXBbXSA9IHsgMHgzMCwgMHhkMH07Ci0Jc3RydWN0IGkyY19tc2cgdHVuZXJfbXNnID0gey5hZGRyID0gMHg2MCwuZmxhZ3MgPSAwLC5idWYgPSB0ZGE4Mjd4X3NsZWVwLAotCQkJCSAgICAubGVuID0gc2l6ZW9mKHRkYTgyN3hfc2xlZXApIH07Ci0JaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKLQkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKLQlpMmNfdHJhbnNmZXIoJmRldi0+aTJjX2FkYXAsICZ0dW5lcl9tc2csIDEpOwotCXJldHVybiAwOwotfQorCXN0cnVjdCB0ZGExMDA0eF9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAotc3RhdGljIHN0cnVjdCB0ZGExMDA0eF9jb25maWcgdGRhODI3eF9saWZldmlld19jb25maWcgPSB7Ci0JLmRlbW9kX2FkZHJlc3MgPSAweDA4LAotCS5pbnZlcnQgICAgICAgID0gMSwKLQkuaW52ZXJ0X29jbGsgICA9IDAsCi0JLnh0YWxfZnJlcSAgICAgPSBUREExMDA0Nl9YVEFMXzE2TSwKLQkuYWdjX2NvbmZpZyAgICA9IFREQTEwMDQ2X0FHQ19UREE4MjdYX0dQMTEsCi0JLmlmX2ZyZXEgICAgICAgPSBUREExMDA0Nl9GUkVRXzA0NSwKLQkucmVxdWVzdF9maXJtd2FyZSA9IE5VTEwsCi19OwotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotc3RydWN0IHRkYTgyN3hhX2RhdGEgewotCXUzMiBsb21heDsKLQl1OCAgc3ZjbzsKLQl1OCAgc3BkOwotCXU4ICBzY3I7Ci0JdTggIHNiczsKLQl1OCAgZ2MzOwotfTsKLQotc3RhdGljIHN0cnVjdCB0ZGE4Mjd4YV9kYXRhIHRkYTgyN3hhX2R2YnRbXSA9IHsKLQl7IC5sb21heCA9ICA1Njg3NTAwMCwgLnN2Y28gPSAzLCAuc3BkID0gNCwgLnNjciA9IDAsIC5zYnMgPSAwLCAuZ2MzID0gMX0sCi0JeyAubG9tYXggPSAgNjcyNTAwMDAsIC5zdmNvID0gMCwgLnNwZCA9IDMsIC5zY3IgPSAwLCAuc2JzID0gMCwgLmdjMyA9IDF9LAotCXsgLmxvbWF4ID0gIDgxMjUwMDAwLCAuc3ZjbyA9IDEsIC5zcGQgPSAzLCAuc2NyID0gMCwgLnNicyA9IDAsIC5nYzMgPSAxfSwKLQl7IC5sb21heCA9ICA5NzUwMDAwMCwgLnN2Y28gPSAyLCAuc3BkID0gMywgLnNjciA9IDAsIC5zYnMgPSAwLCAuZ2MzID0gMX0sCi0JeyAubG9tYXggPSAxMTM3NTAwMDAsIC5zdmNvID0gMywgLnNwZCA9IDMsIC5zY3IgPSAwLCAuc2JzID0gMSwgLmdjMyA9IDF9LAotCXsgLmxvbWF4ID0gMTM0NTAwMDAwLCAuc3ZjbyA9IDAsIC5zcGQgPSAyLCAuc2NyID0gMCwgLnNicyA9IDEsIC5nYzMgPSAxfSwKLQl7IC5sb21heCA9IDE1NDAwMDAwMCwgLnN2Y28gPSAxLCAuc3BkID0gMiwgLnNjciA9IDAsIC5zYnMgPSAxLCAuZ2MzID0gMX0sCi0JeyAubG9tYXggPSAxNjI1MDAwMDAsIC5zdmNvID0gMSwgLnNwZCA9IDIsIC5zY3IgPSAwLCAuc2JzID0gMSwgLmdjMyA9IDF9LAotCXsgLmxvbWF4ID0gMTgzMDAwMDAwLCAuc3ZjbyA9IDIsIC5zcGQgPSAyLCAuc2NyID0gMCwgLnNicyA9IDEsIC5nYzMgPSAxfSwKLQl7IC5sb21heCA9IDE5NTAwMDAwMCwgLnN2Y28gPSAyLCAuc3BkID0gMiwgLnNjciA9IDAsIC5zYnMgPSAyLCAuZ2MzID0gMX0sCi0JeyAubG9tYXggPSAyMjc1MDAwMDAsIC5zdmNvID0gMywgLnNwZCA9IDIsIC5zY3IgPSAwLCAuc2JzID0gMiwgLmdjMyA9IDF9LAotCXsgLmxvbWF4ID0gMjY5MDAwMDAwLCAuc3ZjbyA9IDAsIC5zcGQgPSAxLCAuc2NyID0gMCwgLnNicyA9IDIsIC5nYzMgPSAxfSwKLQl7IC5sb21heCA9IDI5MDAwMDAwMCwgLnN2Y28gPSAxLCAuc3BkID0gMSwgLnNjciA9IDAsIC5zYnMgPSAyLCAuZ2MzID0gMX0sCi0JeyAubG9tYXggPSAzMjUwMDAwMDAsIC5zdmNvID0gMSwgLnNwZCA9IDEsIC5zY3IgPSAwLCAuc2JzID0gMywgLmdjMyA9IDF9LAotCXsgLmxvbWF4ID0gMzkwMDAwMDAwLCAuc3ZjbyA9IDIsIC5zcGQgPSAxLCAuc2NyID0gMCwgLnNicyA9IDMsIC5nYzMgPSAxfSwKLQl7IC5sb21heCA9IDQ1NTAwMDAwMCwgLnN2Y28gPSAzLCAuc3BkID0gMSwgLnNjciA9IDAsIC5zYnMgPSAzLCAuZ2MzID0gMX0sCi0JeyAubG9tYXggPSA1MjAwMDAwMDAsIC5zdmNvID0gMCwgLnNwZCA9IDAsIC5zY3IgPSAwLCAuc2JzID0gMywgLmdjMyA9IDF9LAotCXsgLmxvbWF4ID0gNTM4MDAwMDAwLCAuc3ZjbyA9IDAsIC5zcGQgPSAwLCAuc2NyID0gMSwgLnNicyA9IDMsIC5nYzMgPSAxfSwKLQl7IC5sb21heCA9IDU1MDAwMDAwMCwgLnN2Y28gPSAxLCAuc3BkID0gMCwgLnNjciA9IDAsIC5zYnMgPSAzLCAuZ2MzID0gMX0sCi0JeyAubG9tYXggPSA2MjAwMDAwMDAsIC5zdmNvID0gMSwgLnNwZCA9IDAsIC5zY3IgPSAwLCAuc2JzID0gNCwgLmdjMyA9IDB9LAotCXsgLmxvbWF4ID0gNjUwMDAwMDAwLCAuc3ZjbyA9IDEsIC5zcGQgPSAwLCAuc2NyID0gMSwgLnNicyA9IDQsIC5nYzMgPSAwfSwKLQl7IC5sb21heCA9IDcwMDAwMDAwMCwgLnN2Y28gPSAyLCAuc3BkID0gMCwgLnNjciA9IDAsIC5zYnMgPSA0LCAuZ2MzID0gMH0sCi0JeyAubG9tYXggPSA3ODAwMDAwMDAsIC5zdmNvID0gMiwgLnNwZCA9IDAsIC5zY3IgPSAxLCAuc2JzID0gNCwgLmdjMyA9IDB9LAotCXsgLmxvbWF4ID0gODIwMDAwMDAwLCAuc3ZjbyA9IDMsIC5zcGQgPSAwLCAuc2NyID0gMCwgLnNicyA9IDQsIC5nYzMgPSAwfSwKLQl7IC5sb21heCA9IDg3MDAwMDAwMCwgLnN2Y28gPSAzLCAuc3BkID0gMCwgLnNjciA9IDEsIC5zYnMgPSA0LCAuZ2MzID0gMH0sCi0JeyAubG9tYXggPSA5MTEwMDAwMDAsIC5zdmNvID0gMywgLnNwZCA9IDAsIC5zY3IgPSAyLCAuc2JzID0gNCwgLmdjMyA9IDB9LAotCXsgLmxvbWF4ID0gICAgICAgICAwLCAuc3ZjbyA9IDAsIC5zcGQgPSAwLCAuc2NyID0gMCwgLnNicyA9IDAsIC5nYzMgPSAwfX07Ci0KLQotc3RhdGljIGludCBwaGlsaXBzX3RkYTgyN3hhX3BsbF9zZXQodTggYWRkciwgc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcGFyYW1zKQotewotCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gZmUtPmR2Yi0+cHJpdjsKLQl1OCB0dW5lcl9idWZbMTRdOwotCXVuc2lnbmVkIGNoYXIgcmVnMlsyXTsKLQotCXN0cnVjdCBpMmNfbXNnIG1zZyA9IHsuYWRkciA9IGFkZHIsLmZsYWdzID0gMCwuYnVmID0gdHVuZXJfYnVmfTsKLQlpbnQgaSwgdHVuZXJfZnJlcSwgaWZfZnJlcTsKLQl1MzIgTjsKLQotCXN3aXRjaCAocGFyYW1zLT51Lm9mZG0uYmFuZHdpZHRoKSB7Ci0JY2FzZSBCQU5EV0lEVEhfNl9NSFo6Ci0JCWlmX2ZyZXEgPSA0MDAwMDAwOwotCQlicmVhazsKLQljYXNlIEJBTkRXSURUSF83X01IWjoKLQkJaWZfZnJlcSA9IDQ1MDAwMDA7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6CQkgICAvKiA4IE1IeiBvciBBdXRvICovCi0JCWlmX2ZyZXEgPSA1MDAwMDAwOwotCQlicmVhazsKLQl9Ci0JdHVuZXJfZnJlcSA9IHBhcmFtcy0+ZnJlcXVlbmN5ICsgaWZfZnJlcTsKLQotCWkgPSAwOwotCXdoaWxlICh0ZGE4Mjd4YV9kdmJ0W2ldLmxvbWF4IDwgdHVuZXJfZnJlcSkgewotCQlpZih0ZGE4Mjd4YV9kdmJ0W2kgKyAxXS5sb21heCA9PSAwKQotCQkJYnJlYWs7Ci0JCWkrKzsKLQl9Ci0KLQlOID0gKCh0dW5lcl9mcmVxICsgMzEyNTApIC8gNjI1MDApIDw8IHRkYTgyN3hhX2R2YnRbaV0uc3BkOwotCXR1bmVyX2J1ZlswXSA9IDA7ICAgICAgICAgICAgLy8gc3ViYWRkcmVzcwotCXR1bmVyX2J1ZlsxXSA9IE4gPj4gODsKLQl0dW5lcl9idWZbMl0gPSBOICYgMHhmZjsKLQl0dW5lcl9idWZbM10gPSAwOwotCXR1bmVyX2J1Zls0XSA9IDB4MTY7Ci0JdHVuZXJfYnVmWzVdID0gKHRkYTgyN3hhX2R2YnRbaV0uc3BkIDw8IDUpICsgKHRkYTgyN3hhX2R2YnRbaV0uc3ZjbyA8PCAzKSArCi0JCQl0ZGE4Mjd4YV9kdmJ0W2ldLnNiczsKLQl0dW5lcl9idWZbNl0gPSAweDRiICsgKHRkYTgyN3hhX2R2YnRbaV0uZ2MzIDw8IDQpOwotCXR1bmVyX2J1Zls3XSA9IDB4MGM7Ci0JdHVuZXJfYnVmWzhdID0gMHgwNjsKLQl0dW5lcl9idWZbOV0gPSAweDI0OwotCXR1bmVyX2J1ZlsxMF0gPSAweGZmOwotCXR1bmVyX2J1ZlsxMV0gPSAweDYwOwotCXR1bmVyX2J1ZlsxMl0gPSAweDAwOwotCXR1bmVyX2J1ZlsxM10gPSAweDM5OyAgLy8gbHBzZWwKLQltc2cubGVuID0gMTQ7Ci0JaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKLQkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKLQlpZiAoaTJjX3RyYW5zZmVyKCZkZXYtPmkyY19hZGFwLCAmbXNnLCAxKSAhPSAxKQotCQlyZXR1cm4gLUVJTzsKLQotCW1zZy5idWY9IHJlZzI7Ci0JbXNnLmxlbiA9IDI7Ci0JcmVnMlswXSA9IDB4NjA7Ci0JcmVnMlsxXSA9IDB4M2M7Ci0JaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKLQkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKLQlpMmNfdHJhbnNmZXIoJmRldi0+aTJjX2FkYXAsICZtc2csIDEpOwotCi0JcmVnMlswXSA9IDB4YTA7Ci0JcmVnMlsxXSA9IDB4NDA7Ci0JaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKLQkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKLQlpMmNfdHJhbnNmZXIoJmRldi0+aTJjX2FkYXAsICZtc2csIDEpOwotCi0JbXNsZWVwKDIpOwotCS8qIGNvcnJlY3QgQ1AgdmFsdWUgKi8KLQlyZWcyWzBdID0gMHgzMDsKLQlyZWcyWzFdID0gMHgxMCArIHRkYTgyN3hhX2R2YnRbaV0uc2NyOwotCW1zZy5sZW4gPSAyOwotCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCi0JCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMSk7Ci0JaTJjX3RyYW5zZmVyKCZkZXYtPmkyY19hZGFwLCAmbXNnLCAxKTsKLQotCW1zbGVlcCg1NTApOwotCXJlZzJbMF0gPSAweDUwOwotCXJlZzJbMV0gPSAweDRmICsgKHRkYTgyN3hhX2R2YnRbaV0uZ2MzIDw8IDQpOwotCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCi0JCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMSk7Ci0JaTJjX3RyYW5zZmVyKCZkZXYtPmkyY19hZGFwLCAmbXNnLCAxKTsKLQotCXJldHVybiAwOwotCi19Ci0KLXN0YXRpYyBpbnQgcGhpbGlwc190ZGE4Mjd4YV90dW5lcl9zbGVlcCh1OCBhZGRyLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKLXsKLQlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IGZlLT5kdmItPnByaXY7Ci0Jc3RhdGljIHU4IHRkYTgyN3hhX3NsZWVwW10gPSB7IDB4MzAsIDB4OTB9OwotCXN0cnVjdCBpMmNfbXNnIHR1bmVyX21zZyA9IHsuYWRkciA9IGFkZHIsLmZsYWdzID0gMCwuYnVmID0gdGRhODI3eGFfc2xlZXAsCi0JCQkJICAgIC5sZW4gPSBzaXplb2YodGRhODI3eGFfc2xlZXApIH07Ci0JaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKLQkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKLQlpMmNfdHJhbnNmZXIoJmRldi0+aTJjX2FkYXAsICZ0dW5lcl9tc2csIDEpOwotCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCi0JCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi1zdGF0aWMgaW50IHRkYTgyOTBfaTJjX2dhdGVfY3RybChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgaW50IGVuYWJsZSkKLXsKLQlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IGZlLT5kdmItPnByaXY7CisJdTggYWRkciA9IHN0YXRlLT5jb25maWctPmkyY19nYXRlOwogCXN0YXRpYyB1OCB0ZGE4MjkwX2Nsb3NlW10gPSB7IDB4MjEsIDB4YzB9OwogCXN0YXRpYyB1OCB0ZGE4MjkwX29wZW5bXSAgPSB7IDB4MjEsIDB4ODB9OwotCXN0cnVjdCBpMmNfbXNnIHRkYTgyOTBfbXNnID0gey5hZGRyID0gMHg0YiwuZmxhZ3MgPSAwLCAubGVuID0gMn07CisJc3RydWN0IGkyY19tc2cgdGRhODI5MF9tc2cgPSB7LmFkZHIgPSBhZGRyLC5mbGFncyA9IDAsIC5sZW4gPSAyfTsKIAlpZiAoZW5hYmxlKSB7CiAJCXRkYTgyOTBfbXNnLmJ1ZiA9IHRkYTgyOTBfY2xvc2U7CiAJfSBlbHNlIHsKIAkJdGRhODI5MF9tc2cuYnVmID0gdGRhODI5MF9vcGVuOwogCX0KLQlpZiAoaTJjX3RyYW5zZmVyKCZkZXYtPmkyY19hZGFwLCAmdGRhODI5MF9tc2csIDEpICE9IDEpCisJaWYgKGkyY190cmFuc2ZlcihzdGF0ZS0+aTJjLCAmdGRhODI5MF9tc2csIDEpICE9IDEpIHsKKwkJc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSBmZS0+ZHZiLT5wcml2OworCQl3cHJpbnRrKCJjb3VsZCBub3QgYWNjZXNzIHRkYTgyOTAgSTJDIGdhdGVcbiIpOwogCQlyZXR1cm4gLUVJTzsKKwl9CiAJbXNsZWVwKDIwKTsKIAlyZXR1cm4gMDsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXN0YXRpYyBpbnQgcGhpbGlwc190aWdlcl90dW5lcl9zZXRfcGFyYW1zKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnBhcmFtcykKLXsKLQlpbnQgcmV0OwotCi0JcmV0ID0gcGhpbGlwc190ZGE4Mjd4YV9wbGxfc2V0KDB4NjEsIGZlLCBwYXJhbXMpOwotCWlmIChyZXQgIT0gMCkKLQkJcmV0dXJuIHJldDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBwaGlsaXBzX3RpZ2VyX3R1bmVyX2luaXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCitzdGF0aWMgaW50IHBoaWxpcHNfdGRhODI3eF90dW5lcl9pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQogewogCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gZmUtPmR2Yi0+cHJpdjsKLQlzdGF0aWMgdTggZGF0YVtdID0geyAweDNjLCAweDMzLCAweDZhfTsKLQlzdHJ1Y3QgaTJjX21zZyBtc2cgPSB7LmFkZHI9MHgwOCwgLmZsYWdzPTAsIC5idWY9ZGF0YSwgLmxlbiA9IHNpemVvZihkYXRhKX07CisJc3RydWN0IHRkYTEwMDR4X3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCi0JaWYgKGkyY190cmFuc2ZlcigmZGV2LT5pMmNfYWRhcCwgJm1zZywgMSkgIT0gMSkKLQkJcmV0dXJuIC1FSU87CisJc3dpdGNoIChzdGF0ZS0+Y29uZmlnLT5hbnRlbm5hX3N3aXRjaCkgeworCWNhc2UgMDogYnJlYWs7CisJY2FzZSAxOglkcHJpbnRrKCJzZXR0aW5nIEdQSU8yMSB0byAwIChUViBhbnRlbm5hPylcbiIpOworCQlzYWE3MTM0X3NldF9ncGlvKGRldiwgMjEsIDApOworCQlicmVhazsKKwljYXNlIDI6IGRwcmludGsoInNldHRpbmcgR1BJTzIxIHRvIDEgKFJhZGlvIGFudGVubmE/KVxuIik7CisJCXNhYTcxMzRfc2V0X2dwaW8oZGV2LCAyMSwgMSk7CisJCWJyZWFrOworCX0KIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBwaGlsaXBzX3RpZ2VyX3R1bmVyX3NsZWVwKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQorc3RhdGljIGludCBwaGlsaXBzX3RkYTgyN3hfdHVuZXJfc2xlZXAoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCiB7CiAJc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSBmZS0+ZHZiLT5wcml2OwotCXN0YXRpYyB1OCBkYXRhW10gPSB7IDB4M2MsIDB4MzMsIDB4Njh9OwotCXN0cnVjdCBpMmNfbXNnIG1zZyA9IHsuYWRkcj0weDA4LCAuZmxhZ3M9MCwgLmJ1Zj1kYXRhLCAubGVuID0gc2l6ZW9mKGRhdGEpfTsKKwlzdHJ1Y3QgdGRhMTAwNHhfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAKLQlpMmNfdHJhbnNmZXIoJmRldi0+aTJjX2FkYXAsICZtc2csIDEpOwotCXBoaWxpcHNfdGRhODI3eGFfdHVuZXJfc2xlZXAoIDB4NjEsIGZlKTsKKwlzd2l0Y2ggKHN0YXRlLT5jb25maWctPmFudGVubmFfc3dpdGNoKSB7CisJY2FzZSAwOiBicmVhazsKKwljYXNlIDE6IGRwcmludGsoInNldHRpbmcgR1BJTzIxIHRvIDEgKFJhZGlvIGFudGVubmE/KVxuIik7CisJCXNhYTcxMzRfc2V0X2dwaW8oZGV2LCAyMSwgMSk7CisJCWJyZWFrOworCWNhc2UgMjoJZHByaW50aygic2V0dGluZyBHUElPMjEgdG8gMCAoVFYgYW50ZW5uYT8pXG4iKTsKKwkJc2FhNzEzNF9zZXRfZ3BpbyhkZXYsIDIxLCAwKTsKKwkJYnJlYWs7CisJfQogCXJldHVybiAwOwogfQogCitzdGF0aWMgc3RydWN0IHRkYTgyN3hfY29uZmlnIHRkYTgyN3hfY2ZnID0geworCS5sbmFfZ2FpbiA9IHBoaWxpcHNfdGRhODI3eF9sbmFfZ2FpbiwKKwkuaW5pdCA9IHBoaWxpcHNfdGRhODI3eF90dW5lcl9pbml0LAorCS5zbGVlcCA9IHBoaWxpcHNfdGRhODI3eF90dW5lcl9zbGVlcAorfTsKKworc3RhdGljIHZvaWQgY29uZmlndXJlX3RkYTgyN3hfZmUoc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYsIHN0cnVjdCB0ZGExMDA0eF9jb25maWcgKnRkYV9jb25mKQoreworCWRldi0+ZHZiLmZyb250ZW5kID0gZHZiX2F0dGFjaCh0ZGExMDA0Nl9hdHRhY2gsIHRkYV9jb25mLCAmZGV2LT5pMmNfYWRhcCk7CisJaWYgKGRldi0+ZHZiLmZyb250ZW5kKSB7CisJCWlmICh0ZGFfY29uZi0+aTJjX2dhdGUpCisJCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLmkyY19nYXRlX2N0cmwgPSB0ZGE4MjkwX2kyY19nYXRlX2N0cmw7CisJCWlmIChkdmJfYXR0YWNoKHRkYTgyN3hfYXR0YWNoLCBkZXYtPmR2Yi5mcm9udGVuZCwgdGRhX2NvbmYtPnR1bmVyX2FkZHJlc3MsCisJCQkJCQkmZGV2LT5pMmNfYWRhcCwmdGRhODI3eF9jZmcpID09IE5VTEwpIHsKKwkJCXdwcmludGsoIm5vIHRkYTgyN3ggdHVuZXIgZm91bmQgYXQgYWRkcjogJTAyeFxuIiwKKwkJCQl0ZGFfY29uZi0+dHVuZXJfYWRkcmVzcyk7CisJCX0KKwl9Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIHN0cnVjdCB0ZGExMDA0eF9jb25maWcgdGRhODI3eF9saWZldmlld19jb25maWcgPSB7CisJLmRlbW9kX2FkZHJlc3MgPSAweDA4LAorCS5pbnZlcnQgICAgICAgID0gMSwKKwkuaW52ZXJ0X29jbGsgICA9IDAsCisJLnh0YWxfZnJlcSAgICAgPSBUREExMDA0Nl9YVEFMXzE2TSwKKwkuYWdjX2NvbmZpZyAgICA9IFREQTEwMDQ2X0FHQ19UREE4MjdYLAorCS5ncGlvX2NvbmZpZyAgID0gVERBMTAwNDZfR1AxMV9JLAorCS5pZl9mcmVxICAgICAgID0gVERBMTAwNDZfRlJFUV8wNDUsCisJLnR1bmVyX2FkZHJlc3MgPSAweDYwLAorCS5yZXF1ZXN0X2Zpcm13YXJlID0gcGhpbGlwc190ZGExMDA0eF9yZXF1ZXN0X2Zpcm13YXJlCit9OworCiBzdGF0aWMgc3RydWN0IHRkYTEwMDR4X2NvbmZpZyBwaGlsaXBzX3RpZ2VyX2NvbmZpZyA9IHsKIAkuZGVtb2RfYWRkcmVzcyA9IDB4MDgsCiAJLmludmVydCAgICAgICAgPSAxLAogCS5pbnZlcnRfb2NsayAgID0gMCwKIAkueHRhbF9mcmVxICAgICA9IFREQTEwMDQ2X1hUQUxfMTZNLAotCS5hZ2NfY29uZmlnICAgID0gVERBMTAwNDZfQUdDX1REQTgyN1hfR1AxMSwKKwkuYWdjX2NvbmZpZyAgICA9IFREQTEwMDQ2X0FHQ19UREE4MjdYLAorCS5ncGlvX2NvbmZpZyAgID0gVERBMTAwNDZfR1AxMV9JLAogCS5pZl9mcmVxICAgICAgID0gVERBMTAwNDZfRlJFUV8wNDUsCi0JLnJlcXVlc3RfZmlybXdhcmUgPSBOVUxMLAorCS5pMmNfZ2F0ZSAgICAgID0gMHg0YiwKKwkudHVuZXJfYWRkcmVzcyA9IDB4NjEsCisJLnR1bmVyX2NvbmZpZyAgPSAwLAorCS5hbnRlbm5hX3N3aXRjaD0gMSwKKwkucmVxdWVzdF9maXJtd2FyZSA9IHBoaWxpcHNfdGRhMTAwNHhfcmVxdWVzdF9maXJtd2FyZQogfTsKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi1zdGF0aWMgaW50IGNpbmVyZ3lfaHRfdHVuZXJfaW5pdChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKLXsKLQlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IGZlLT5kdmItPnByaXY7Ci0Jc3RhdGljIHU4IGRhdGFbXSA9IHsgMHgzYywgMHgzMywgMHg2Mn07Ci0Jc3RydWN0IGkyY19tc2cgbXNnID0gey5hZGRyPTB4MDgsIC5mbGFncz0wLCAuYnVmPWRhdGEsIC5sZW4gPSBzaXplb2YoZGF0YSl9OwotCi0JaWYgKGkyY190cmFuc2ZlcigmZGV2LT5pMmNfYWRhcCwgJm1zZywgMSkgIT0gMSkKLQkJcmV0dXJuIC1FSU87Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgY2luZXJneV9odF90dW5lcl9zbGVlcChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKLXsKLQlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IGZlLT5kdmItPnByaXY7Ci0Jc3RhdGljIHU4IGRhdGFbXSA9IHsgMHgzYywgMHgzMywgMHg2MH07Ci0Jc3RydWN0IGkyY19tc2cgbXNnID0gey5hZGRyPTB4MDgsIC5mbGFncz0wLCAuYnVmPWRhdGEsIC5sZW4gPSBzaXplb2YoZGF0YSl9OwotCi0JaTJjX3RyYW5zZmVyKCZkZXYtPmkyY19hZGFwLCAmbXNnLCAxKTsKLQlwaGlsaXBzX3RkYTgyN3hhX3R1bmVyX3NsZWVwKCAweDYxLCBmZSk7Ci0JcmV0dXJuIDA7Ci19CiAKIHN0YXRpYyBzdHJ1Y3QgdGRhMTAwNHhfY29uZmlnIGNpbmVyZ3lfaHRfY29uZmlnID0gewogCS5kZW1vZF9hZGRyZXNzID0gMHgwOCwKIAkuaW52ZXJ0ICAgICAgICA9IDEsCiAJLmludmVydF9vY2xrICAgPSAwLAogCS54dGFsX2ZyZXEgICAgID0gVERBMTAwNDZfWFRBTF8xNk0sCi0JLmFnY19jb25maWcgICAgPSBUREExMDA0Nl9BR0NfVERBODI3WF9HUDAxLAorCS5hZ2NfY29uZmlnICAgID0gVERBMTAwNDZfQUdDX1REQTgyN1gsCisJLmdwaW9fY29uZmlnICAgPSBUREExMDA0Nl9HUDAxX0ksCiAJLmlmX2ZyZXEgICAgICAgPSBUREExMDA0Nl9GUkVRXzA0NSwKLQkucmVxdWVzdF9maXJtd2FyZSA9IE5VTEwsCisJLmkyY19nYXRlICAgICAgPSAweDRiLAorCS50dW5lcl9hZGRyZXNzID0gMHg2MSwKKwkudHVuZXJfY29uZmlnICA9IDAsCisJLnJlcXVlc3RfZmlybXdhcmUgPSBwaGlsaXBzX3RkYTEwMDR4X3JlcXVlc3RfZmlybXdhcmUKIH07CiAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIHN0cnVjdCB0ZGExMDA0eF9jb25maWcgY2luZXJneV9odF9wY2lfY29uZmlnID0geworCS5kZW1vZF9hZGRyZXNzID0gMHgwOCwKKwkuaW52ZXJ0ICAgICAgICA9IDEsCisJLmludmVydF9vY2xrICAgPSAwLAorCS54dGFsX2ZyZXEgICAgID0gVERBMTAwNDZfWFRBTF8xNk0sCisJLmFnY19jb25maWcgICAgPSBUREExMDA0Nl9BR0NfVERBODI3WCwKKwkuZ3Bpb19jb25maWcgICA9IFREQTEwMDQ2X0dQMDFfSSwKKwkuaWZfZnJlcSAgICAgICA9IFREQTEwMDQ2X0ZSRVFfMDQ1LAorCS5pMmNfZ2F0ZSAgICAgID0gMHg0YiwKKwkudHVuZXJfYWRkcmVzcyA9IDB4NjAsCisJLnR1bmVyX2NvbmZpZyAgPSAwLAorCS5yZXF1ZXN0X2Zpcm13YXJlID0gcGhpbGlwc190ZGExMDA0eF9yZXF1ZXN0X2Zpcm13YXJlCit9OworCitzdGF0aWMgc3RydWN0IHRkYTEwMDR4X2NvbmZpZyBwaGlsaXBzX3RpZ2VyX3NfY29uZmlnID0geworCS5kZW1vZF9hZGRyZXNzID0gMHgwOCwKKwkuaW52ZXJ0ICAgICAgICA9IDEsCisJLmludmVydF9vY2xrICAgPSAwLAorCS54dGFsX2ZyZXEgICAgID0gVERBMTAwNDZfWFRBTF8xNk0sCisJLmFnY19jb25maWcgICAgPSBUREExMDA0Nl9BR0NfVERBODI3WCwKKwkuZ3Bpb19jb25maWcgICA9IFREQTEwMDQ2X0dQMDFfSSwKKwkuaWZfZnJlcSAgICAgICA9IFREQTEwMDQ2X0ZSRVFfMDQ1LAorCS5pMmNfZ2F0ZSAgICAgID0gMHg0YiwKKwkudHVuZXJfYWRkcmVzcyA9IDB4NjEsCisJLnR1bmVyX2NvbmZpZyAgPSAyLAorCS5hbnRlbm5hX3N3aXRjaD0gMSwKKwkucmVxdWVzdF9maXJtd2FyZSA9IHBoaWxpcHNfdGRhMTAwNHhfcmVxdWVzdF9maXJtd2FyZQorfTsKIAogc3RhdGljIHN0cnVjdCB0ZGExMDA0eF9jb25maWcgcGlubmFjbGVfcGN0dl8zMTBpX2NvbmZpZyA9IHsKIAkuZGVtb2RfYWRkcmVzcyA9IDB4MDgsCiAJLmludmVydCAgICAgICAgPSAxLAogCS5pbnZlcnRfb2NsayAgID0gMCwKIAkueHRhbF9mcmVxICAgICA9IFREQTEwMDQ2X1hUQUxfMTZNLAotCS5hZ2NfY29uZmlnICAgID0gVERBMTAwNDZfQUdDX1REQTgyN1hfR1AxMSwKKwkuYWdjX2NvbmZpZyAgICA9IFREQTEwMDQ2X0FHQ19UREE4MjdYLAorCS5ncGlvX2NvbmZpZyAgID0gVERBMTAwNDZfR1AxMV9JLAogCS5pZl9mcmVxICAgICAgID0gVERBMTAwNDZfRlJFUV8wNDUsCi0JLnJlcXVlc3RfZmlybXdhcmUgPSBwaGlsaXBzX3RkYTEwMDR4X3JlcXVlc3RfZmlybXdhcmUsCisJLmkyY19nYXRlICAgICAgPSAweDRiLAorCS50dW5lcl9hZGRyZXNzID0gMHg2MSwKKwkudHVuZXJfY29uZmlnICA9IDEsCisJLnJlcXVlc3RfZmlybXdhcmUgPSBwaGlsaXBzX3RkYTEwMDR4X3JlcXVlc3RfZmlybXdhcmUKIH07CiAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCiBzdGF0aWMgc3RydWN0IHRkYTEwMDR4X2NvbmZpZyBoYXVwcGF1Z2VfaHZyXzExMTBfY29uZmlnID0gewogCS5kZW1vZF9hZGRyZXNzID0gMHgwOCwKIAkuaW52ZXJ0ICAgICAgICA9IDEsCiAJLmludmVydF9vY2xrICAgPSAwLAogCS54dGFsX2ZyZXEgICAgID0gVERBMTAwNDZfWFRBTF8xNk0sCi0JLmFnY19jb25maWcgICAgPSBUREExMDA0Nl9BR0NfVERBODI3WF9HUDExLAorCS5hZ2NfY29uZmlnICAgID0gVERBMTAwNDZfQUdDX1REQTgyN1gsCisJLmdwaW9fY29uZmlnICAgPSBUREExMDA0Nl9HUDExX0ksCiAJLmlmX2ZyZXEgICAgICAgPSBUREExMDA0Nl9GUkVRXzA0NSwKLQkucmVxdWVzdF9maXJtd2FyZSA9IHBoaWxpcHNfdGRhMTAwNHhfcmVxdWVzdF9maXJtd2FyZSwKKwkuaTJjX2dhdGUgICAgICA9IDB4NGIsCisJLnR1bmVyX2FkZHJlc3MgPSAweDYxLAorCS5yZXF1ZXN0X2Zpcm13YXJlID0gcGhpbGlwc190ZGExMDA0eF9yZXF1ZXN0X2Zpcm13YXJlCiB9OwogCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQogc3RhdGljIHN0cnVjdCB0ZGExMDA0eF9jb25maWcgYXN1c19wNzEzMV9kdWFsX2NvbmZpZyA9IHsKIAkuZGVtb2RfYWRkcmVzcyA9IDB4MDgsCiAJLmludmVydCAgICAgICAgPSAxLAogCS5pbnZlcnRfb2NsayAgID0gMCwKIAkueHRhbF9mcmVxICAgICA9IFREQTEwMDQ2X1hUQUxfMTZNLAotCS5hZ2NfY29uZmlnICAgID0gVERBMTAwNDZfQUdDX1REQTgyN1hfR1AxMSwKKwkuYWdjX2NvbmZpZyAgICA9IFREQTEwMDQ2X0FHQ19UREE4MjdYLAorCS5ncGlvX2NvbmZpZyAgID0gVERBMTAwNDZfR1AxMV9JLAogCS5pZl9mcmVxICAgICAgID0gVERBMTAwNDZfRlJFUV8wNDUsCi0JLnJlcXVlc3RfZmlybXdhcmUgPSBwaGlsaXBzX3RkYTEwMDR4X3JlcXVlc3RfZmlybXdhcmUsCisJLmkyY19nYXRlICAgICAgPSAweDRiLAorCS50dW5lcl9hZGRyZXNzID0gMHg2MSwKKwkudHVuZXJfY29uZmlnICA9IDAsCisJLmFudGVubmFfc3dpdGNoPSAyLAorCS5yZXF1ZXN0X2Zpcm13YXJlID0gcGhpbGlwc190ZGExMDA0eF9yZXF1ZXN0X2Zpcm13YXJlCiB9OwogCi1zdGF0aWMgaW50IGFzdXNfcDcxMzFfZHVhbF90dW5lcl9pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQotewotCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gZmUtPmR2Yi0+cHJpdjsKLQlzdGF0aWMgdTggZGF0YVtdID0geyAweDNjLCAweDMzLCAweDZhfTsKLQlzdHJ1Y3QgaTJjX21zZyBtc2cgPSB7LmFkZHI9MHgwOCwgLmZsYWdzPTAsIC5idWY9ZGF0YSwgLmxlbiA9IHNpemVvZihkYXRhKX07Ci0KLQlpZiAoaTJjX3RyYW5zZmVyKCZkZXYtPmkyY19hZGFwLCAmbXNnLCAxKSAhPSAxKQotCQlyZXR1cm4gLUVJTzsKLQkvKiBtYWtlIHN1cmUgdGhlIERWQi1UIGFudGVubmEgaW5wdXQgaXMgc2V0ICovCi0Jc2FhX3NldGwoU0FBNzEzNF9HUElPX0dQU1RBVFVTMCA+PiAyLCAweDAyMDAwMDApOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGFzdXNfcDcxMzFfZHVhbF90dW5lcl9zbGVlcChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKLXsKLQlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IGZlLT5kdmItPnByaXY7Ci0Jc3RhdGljIHU4IGRhdGFbXSA9IHsgMHgzYywgMHgzMywgMHg2OH07Ci0Jc3RydWN0IGkyY19tc2cgbXNnID0gey5hZGRyPTB4MDgsIC5mbGFncz0wLCAuYnVmPWRhdGEsIC5sZW4gPSBzaXplb2YoZGF0YSl9OwotCi0JaTJjX3RyYW5zZmVyKCZkZXYtPmkyY19hZGFwLCAmbXNnLCAxKTsKLQlwaGlsaXBzX3RkYTgyN3hhX3R1bmVyX3NsZWVwKCAweDYxLCBmZSk7Ci0JLyogcmVzZXQgYW50ZW5uYSBpbnB1dHMgZm9yIGFuYWxvZyB1c2FnZSAqLwotCXNhYV9jbGVhcmwoU0FBNzEzNF9HUElPX0dQU1RBVFVTMCA+PiAyLCAweDAyMDAwMDApOwotCXJldHVybiAwOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotc3RhdGljIGludCBsaWZldmlld190cmlvX3R1bmVyX3NldF9wYXJhbXMoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcGFyYW1zKQotewotCWludCByZXQ7Ci0KLQlyZXQgPSBwaGlsaXBzX3RkYTgyN3hhX3BsbF9zZXQoMHg2MCwgZmUsIHBhcmFtcyk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBsaWZldmlld190cmlvX3R1bmVyX3NsZWVwKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQotewotCXBoaWxpcHNfdGRhODI3eGFfdHVuZXJfc2xlZXAoMHg2MCwgZmUpOwotCXJldHVybiAwOwotfQotCiBzdGF0aWMgc3RydWN0IHRkYTEwMDR4X2NvbmZpZyBsaWZldmlld190cmlvX2NvbmZpZyA9IHsKIAkuZGVtb2RfYWRkcmVzcyA9IDB4MDksCiAJLmludmVydCAgICAgICAgPSAxLAogCS5pbnZlcnRfb2NsayAgID0gMCwKIAkueHRhbF9mcmVxICAgICA9IFREQTEwMDQ2X1hUQUxfMTZNLAotCS5hZ2NfY29uZmlnICAgID0gVERBMTAwNDZfQUdDX1REQTgyN1hfR1AwMCwKKwkuYWdjX2NvbmZpZyAgICA9IFREQTEwMDQ2X0FHQ19UREE4MjdYLAorCS5ncGlvX2NvbmZpZyAgID0gVERBMTAwNDZfR1AwMF9JLAogCS5pZl9mcmVxICAgICAgID0gVERBMTAwNDZfRlJFUV8wNDUsCi0JLnJlcXVlc3RfZmlybXdhcmUgPSBOVUxMLAorCS50dW5lcl9hZGRyZXNzID0gMHg2MCwKKwkucmVxdWVzdF9maXJtd2FyZSA9IHBoaWxpcHNfdGRhMTAwNHhfcmVxdWVzdF9maXJtd2FyZQogfTsKIAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgc3RydWN0IHRkYTEwMDR4X2NvbmZpZyB0ZXZpb25fZHZidDIyMHJmX2NvbmZpZyA9IHsKKwkuZGVtb2RfYWRkcmVzcyA9IDB4MDgsCisJLmludmVydCAgICAgICAgPSAxLAorCS5pbnZlcnRfb2NsayAgID0gMCwKKwkueHRhbF9mcmVxICAgICA9IFREQTEwMDQ2X1hUQUxfMTZNLAorCS5hZ2NfY29uZmlnICAgID0gVERBMTAwNDZfQUdDX1REQTgyN1gsCisJLmdwaW9fY29uZmlnICAgPSBUREExMDA0Nl9HUDExX0ksCisJLmlmX2ZyZXEgICAgICAgPSBUREExMDA0Nl9GUkVRXzA0NSwKKwkudHVuZXJfYWRkcmVzcyA9IDB4NjAsCisJLnJlcXVlc3RfZmlybXdhcmUgPSBwaGlsaXBzX3RkYTEwMDR4X3JlcXVlc3RfZmlybXdhcmUKK307CiAKLXN0YXRpYyBpbnQgYWRzX2R1b190dW5lcl9zZXRfcGFyYW1zKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnBhcmFtcykKLXsKLQlpbnQgcmV0Oworc3RhdGljIHN0cnVjdCB0ZGExMDA0eF9jb25maWcgbWQ4ODAwX2R2YnRfY29uZmlnID0geworCS5kZW1vZF9hZGRyZXNzID0gMHgwOCwKKwkuaW52ZXJ0ICAgICAgICA9IDEsCisJLmludmVydF9vY2xrICAgPSAwLAorCS54dGFsX2ZyZXEgICAgID0gVERBMTAwNDZfWFRBTF8xNk0sCisJLmFnY19jb25maWcgICAgPSBUREExMDA0Nl9BR0NfVERBODI3WCwKKwkuZ3Bpb19jb25maWcgICA9IFREQTEwMDQ2X0dQMDFfSSwKKwkuaWZfZnJlcSAgICAgICA9IFREQTEwMDQ2X0ZSRVFfMDQ1LAorCS5pMmNfZ2F0ZSAgICAgID0gMHg0YiwKKwkudHVuZXJfYWRkcmVzcyA9IDB4NjAsCisJLnR1bmVyX2NvbmZpZyAgPSAwLAorCS5yZXF1ZXN0X2Zpcm13YXJlID0gcGhpbGlwc190ZGExMDA0eF9yZXF1ZXN0X2Zpcm13YXJlCit9OwogCi0JcmV0ID0gcGhpbGlwc190ZGE4Mjd4YV9wbGxfc2V0KDB4NjEsIGZlLCBwYXJhbXMpOwotCXJldHVybiByZXQ7Ci19CitzdGF0aWMgc3RydWN0IHRkYTEwMDR4X2NvbmZpZyBhc3VzX3A3MTMxXzQ4NzFfY29uZmlnID0geworCS5kZW1vZF9hZGRyZXNzID0gMHgwOCwKKwkuaW52ZXJ0ICAgICAgICA9IDEsCisJLmludmVydF9vY2xrICAgPSAwLAorCS54dGFsX2ZyZXEgICAgID0gVERBMTAwNDZfWFRBTF8xNk0sCisJLmFnY19jb25maWcgICAgPSBUREExMDA0Nl9BR0NfVERBODI3WCwKKwkuZ3Bpb19jb25maWcgICA9IFREQTEwMDQ2X0dQMDFfSSwKKwkuaWZfZnJlcSAgICAgICA9IFREQTEwMDQ2X0ZSRVFfMDQ1LAorCS5pMmNfZ2F0ZSAgICAgID0gMHg0YiwKKwkudHVuZXJfYWRkcmVzcyA9IDB4NjEsCisJLnR1bmVyX2NvbmZpZyAgPSAyLAorCS5hbnRlbm5hX3N3aXRjaD0gMiwKKwkucmVxdWVzdF9maXJtd2FyZSA9IHBoaWxpcHNfdGRhMTAwNHhfcmVxdWVzdF9maXJtd2FyZQorfTsKKworc3RhdGljIHN0cnVjdCB0ZGExMDA0eF9jb25maWcgYXN1c19wNzEzMV9oeWJyaWRfbG5hX2NvbmZpZyA9IHsKKwkuZGVtb2RfYWRkcmVzcyA9IDB4MDgsCisJLmludmVydCAgICAgICAgPSAxLAorCS5pbnZlcnRfb2NsayAgID0gMCwKKwkueHRhbF9mcmVxICAgICA9IFREQTEwMDQ2X1hUQUxfMTZNLAorCS5hZ2NfY29uZmlnICAgID0gVERBMTAwNDZfQUdDX1REQTgyN1gsCisJLmdwaW9fY29uZmlnICAgPSBUREExMDA0Nl9HUDExX0ksCisJLmlmX2ZyZXEgICAgICAgPSBUREExMDA0Nl9GUkVRXzA0NSwKKwkuaTJjX2dhdGUgICAgICA9IDB4NGIsCisJLnR1bmVyX2FkZHJlc3MgPSAweDYxLAorCS50dW5lcl9jb25maWcgID0gMiwKKwkuYW50ZW5uYV9zd2l0Y2g9IDIsCisJLnJlcXVlc3RfZmlybXdhcmUgPSBwaGlsaXBzX3RkYTEwMDR4X3JlcXVlc3RfZmlybXdhcmUKK307CisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHNwZWNpYWwgY2FzZTogdGhpcyBjYXJkIHVzZXMgc2FhNzEzeCBHUElPMjIgZm9yIHRoZSBtb2RlIHN3aXRjaAorICovCiAKIHN0YXRpYyBpbnQgYWRzX2R1b190dW5lcl9pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQogewogCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gZmUtPmR2Yi0+cHJpdjsKKwlwaGlsaXBzX3RkYTgyN3hfdHVuZXJfaW5pdChmZSk7CiAJLyogcm91dGUgVERBODI3NWEgQUdDIGlucHV0IHRvIHRoZSBjaGFubmVsIGRlY29kZXIgKi8KLQlzYWFfd3JpdGViKFNBQTcxMzRfR1BJT19HUFNUQVRVUzIsIDB4NjApOworCXNhYTcxMzRfc2V0X2dwaW8oZGV2LCAyMiwgMSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEwMzMsOTcgKzkwNCw0MSBAQAogewogCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gZmUtPmR2Yi0+cHJpdjsKIAkvKiByb3V0ZSBUREE4Mjc1YSBBR0MgaW5wdXQgdG8gdGhlIGFuYWxvZyBJRiBjaGlwKi8KLQlzYWFfd3JpdGViKFNBQTcxMzRfR1BJT19HUFNUQVRVUzIsIDB4MjApOwotCXBoaWxpcHNfdGRhODI3eGFfdHVuZXJfc2xlZXAoIDB4NjEsIGZlKTsKKwlzYWE3MTM0X3NldF9ncGlvKGRldiwgMjIsIDApOworCXBoaWxpcHNfdGRhODI3eF90dW5lcl9zbGVlcChmZSk7CiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgdGRhODI3eF9jb25maWcgYWRzX2R1b19jZmcgPSB7CisJLmxuYV9nYWluID0gcGhpbGlwc190ZGE4Mjd4X2xuYV9nYWluLAorCS5pbml0ID0gYWRzX2R1b190dW5lcl9pbml0LAorCS5zbGVlcCA9IGFkc19kdW9fdHVuZXJfc2xlZXAKK307CisKIHN0YXRpYyBzdHJ1Y3QgdGRhMTAwNHhfY29uZmlnIGFkc190ZWNoX2R1b19jb25maWcgPSB7CiAJLmRlbW9kX2FkZHJlc3MgPSAweDA4LAogCS5pbnZlcnQgICAgICAgID0gMSwKIAkuaW52ZXJ0X29jbGsgICA9IDAsCiAJLnh0YWxfZnJlcSAgICAgPSBUREExMDA0Nl9YVEFMXzE2TSwKLQkuYWdjX2NvbmZpZyAgICA9IFREQTEwMDQ2X0FHQ19UREE4MjdYX0dQMDAsCisJLmFnY19jb25maWcgICAgPSBUREExMDA0Nl9BR0NfVERBODI3WCwKKwkuZ3Bpb19jb25maWcgICA9IFREQTEwMDQ2X0dQMDBfSSwKIAkuaWZfZnJlcSAgICAgICA9IFREQTEwMDQ2X0ZSRVFfMDQ1LAotCS5yZXF1ZXN0X2Zpcm13YXJlID0gTlVMTCwKKwkudHVuZXJfYWRkcmVzcyA9IDB4NjEsCisJLnJlcXVlc3RfZmlybXdhcmUgPSBwaGlsaXBzX3RkYTEwMDR4X3JlcXVlc3RfZmlybXdhcmUKIH07CiAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi1zdGF0aWMgaW50IHRldmlvbl9kdmIyMjByZl90dW5lcl9zZXRfcGFyYW1zKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnBhcmFtcykKLXsKLQlpbnQgcmV0OwotCXJldCA9IHBoaWxpcHNfdGRhODI3eGFfcGxsX3NldCgweDYwLCBmZSwgcGFyYW1zKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHRldmlvbl9kdmIyMjByZl90dW5lcl9zbGVlcChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKLXsKLQlwaGlsaXBzX3RkYTgyN3hhX3R1bmVyX3NsZWVwKCAweDYxLCBmZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgdGRhMTAwNHhfY29uZmlnIHRldmlvbl9kdmJ0MjIwcmZfY29uZmlnID0gewotCS5kZW1vZF9hZGRyZXNzID0gMHgwOCwKLQkuaW52ZXJ0ICAgICAgICA9IDEsCi0JLmludmVydF9vY2xrICAgPSAwLAotCS54dGFsX2ZyZXEgICAgID0gVERBMTAwNDZfWFRBTF8xNk0sCi0JLmFnY19jb25maWcgICAgPSBUREExMDA0Nl9BR0NfVERBODI3WF9HUDExLAotCS5pZl9mcmVxICAgICAgID0gVERBMTAwNDZfRlJFUV8wNDUsCi0JLnJlcXVlc3RfZmlybXdhcmUgPSBOVUxMLAotfTsKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLXN0YXRpYyBpbnQgbWQ4ODAwX2R2YnRfYW5hbG9nX21vZGUoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCi17Ci0Jc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSBmZS0+ZHZiLT5wcml2OwotCXN0YXRpYyB1OCBkYXRhW10gPSB7IDB4M2MsIDB4MzMsIDB4Njh9OwotCXN0cnVjdCBpMmNfbXNnIG1zZyA9IHsuYWRkcj0weDA4LCAuZmxhZ3M9MCwgLmJ1Zj1kYXRhLCAubGVuID0gc2l6ZW9mKGRhdGEpfTsKLQotCWkyY190cmFuc2ZlcigmZGV2LT5pMmNfYWRhcCwgJm1zZywgMSk7Ci0JcGhpbGlwc190ZGE4Mjd4YV90dW5lcl9zbGVlcCggMHg2MSwgZmUpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1kODgwMF9kdmJ0X3BsbF9zZXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcGFyYW1zKQotewotCWludCByZXQ7Ci0Jc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSBmZS0+ZHZiLT5wcml2OwotCXN0YXRpYyB1OCB0ZGE4MjkwX2Nsb3NlW10gPSB7IDB4MjEsIDB4YzB9OwotCXN0YXRpYyB1OCB0ZGE4MjkwX29wZW5bXSAgPSB7IDB4MjEsIDB4ODB9OwotCXN0cnVjdCBpMmNfbXNnIHRkYTgyOTBfbXNnID0gey5hZGRyID0gMHg0YiwuZmxhZ3MgPSAwLCAubGVuID0gMn07Ci0JLyogY2xvc2UgdGRhODI5MCBpMmMgYnJpZGdlICovCi0JdGRhODI5MF9tc2cuYnVmID0gdGRhODI5MF9jbG9zZTsKLQlyZXQgPSBpMmNfdHJhbnNmZXIoJmRldi0+aTJjX2FkYXAsICZ0ZGE4MjkwX21zZywgMSk7Ci0JaWYgKHJldCAhPSAxKQotCQlyZXR1cm4gLUVJTzsKLQltc2xlZXAoMjApOwotCXJldCA9IHBoaWxpcHNfdGRhODI3eGFfcGxsX3NldCgweDYwLCBmZSwgcGFyYW1zKTsKLQlpZiAocmV0ICE9IDApCi0JCXJldHVybiByZXQ7Ci0JLyogb3BlbiB0ZGE4MjkwIGkyYyBicmlkZ2UgKi8KLQl0ZGE4MjkwX21zZy5idWYgPSB0ZGE4MjkwX29wZW47Ci0JaTJjX3RyYW5zZmVyKCZkZXYtPmkyY19hZGFwLCAmdGRhODI5MF9tc2csIDEpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgdGRhMTAwNHhfY29uZmlnIG1kODgwMF9kdmJ0X2NvbmZpZyA9IHsKLQkuZGVtb2RfYWRkcmVzcyA9IDB4MDgsCi0JLmludmVydCAgICAgICAgPSAxLAotCS5pbnZlcnRfb2NsayAgID0gMCwKLQkueHRhbF9mcmVxICAgICA9IFREQTEwMDQ2X1hUQUxfMTZNLAotCS5hZ2NfY29uZmlnICAgID0gVERBMTAwNDZfQUdDX1REQTgyN1hfR1AxMSwKLQkuaWZfZnJlcSAgICAgICA9IFREQTEwMDQ2X0ZSRVFfMDQ1LAotCS5yZXF1ZXN0X2Zpcm13YXJlID0gTlVMTCwKLX07CisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIHRkYTEwMDg2IGJhc2VkIERWQi1TIGNhcmRzLCBoZWxwZXIgZnVuY3Rpb25zCisgKi8KIAogc3RhdGljIHN0cnVjdCB0ZGExMDA4Nl9jb25maWcgZmx5ZHZicyA9IHsKIAkuZGVtb2RfYWRkcmVzcyA9IDB4MGUsCiAJLmludmVydCA9IDAsCiB9OwogCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogbnh0MjAweCBiYXNlZCBBVFNDIGNhcmRzLCBoZWxwZXIgZnVuY3Rpb25zCisgKi8KIAogc3RhdGljIHN0cnVjdCBueHQyMDB4X2NvbmZpZyBhdmVydHZoZGExODAgPSB7CiAJLmRlbW9kX2FkZHJlc3MgICAgPSAweDBhLApAQCAtMTE0MywxMCArOTU4LDEzIEBACiAJLnNldF9wbGxfaW5wdXQgICAgPSBueHQyMDB4X3NldF9wbGxfaW5wdXQsCiB9OwogCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29yZSBjb2RlCisgKi8KIAogc3RhdGljIGludCBkdmJfaW5pdChzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldikKIHsKKwlpbnQgcmV0OwogCS8qIGluaXQgc3RydWN0IHZpZGVvYnVmX2R2YiAqLwogCWRldi0+dHMubnJfYnVmcyAgICA9IDMyOwogCWRldi0+dHMubnJfcGFja2V0cyA9IDMyKjQ7CkBAIC0xMTYwLDcgKzk3OCw3IEBACiAKIAlzd2l0Y2ggKGRldi0+Ym9hcmQpIHsKIAljYXNlIFNBQTcxMzRfQk9BUkRfUElOTkFDTEVfMzAwSV9EVkJUX1BBTDoKLQkJcHJpbnRrKCIlczogcGlubmFjbGUgMzAwaSBkdmIgc2V0dXBcbiIsZGV2LT5uYW1lKTsKKwkJZHByaW50aygicGlubmFjbGUgMzAwaSBkdmIgc2V0dXBcbiIpOwogCQlkZXYtPmR2Yi5mcm9udGVuZCA9IGR2Yl9hdHRhY2gobXQzNTJfYXR0YWNoLCAmcGlubmFjbGVfMzAwaSwKIAkJCQkJICAgICAgICZkZXYtPmkyY19hZGFwKTsKIAkJaWYgKGRldi0+ZHZiLmZyb250ZW5kKSB7CkBAIC0xMTY5LDcgKzk4Nyw3IEBACiAJCWJyZWFrOwogCWNhc2UgU0FBNzEzNF9CT0FSRF9BVkVSTUVESUFfNzc3OgogCWNhc2UgU0FBNzEzNF9CT0FSRF9BVkVSTUVESUFfQTE2QVI6Ci0JCXByaW50aygiJXM6IGF2ZXJ0diA3NzcgZHZiIHNldHVwXG4iLGRldi0+bmFtZSk7CisJCWRwcmludGsoImF2ZXJ0diA3NzcgZHZiIHNldHVwXG4iKTsKIAkJZGV2LT5kdmIuZnJvbnRlbmQgPSBkdmJfYXR0YWNoKG10MzUyX2F0dGFjaCwgJmF2ZXJtZWRpYV83NzcsCiAJCQkJCSAgICAgICAmZGV2LT5pMmNfYWRhcCk7CiAJCWlmIChkZXYtPmR2Yi5mcm9udGVuZCkgewpAQCAtMTE5MSw0MiArMTAwOSwxNSBAQAogCQkJCQkgICAgICAgJnBoaWxpcHNfdHUxMjE2XzYwX2NvbmZpZywKIAkJCQkJICAgICAgICZkZXYtPmkyY19hZGFwKTsKIAkJaWYgKGRldi0+ZHZiLmZyb250ZW5kKSB7Ci0JCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5pbml0ID0gcGhpbGlwc190dTEyMTZfdHVuZXJfNjBfaW5pdDsKLQkJCWRldi0+ZHZiLmZyb250ZW5kLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBwaGlsaXBzX3R1MTIxNl90dW5lcl82MF9zZXRfcGFyYW1zOworCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuaW5pdCA9IHBoaWxpcHNfdHUxMjE2X2luaXQ7CisJCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zID0gcGhpbGlwc190ZGE2NjUxX3BsbF9zZXQ7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBTQUE3MTM0X0JPQVJEX0ZMWURWQlREVU86Ci0JCWRldi0+ZHZiLmZyb250ZW5kID0gZHZiX2F0dGFjaCh0ZGExMDA0Nl9hdHRhY2gsCi0JCQkJCSAgICAgICAmdGRhODI3eF9saWZldmlld19jb25maWcsCi0JCQkJCSAgICAgICAmZGV2LT5pMmNfYWRhcCk7Ci0JCWlmIChkZXYtPmR2Yi5mcm9udGVuZCkgewotCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuaW5pdCA9IHBoaWxpcHNfdGRhODI3eF90dW5lcl9pbml0OwotCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuc2xlZXAgPSBwaGlsaXBzX3RkYTgyN3hfdHVuZXJfc2xlZXA7Ci0JCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zID0gcGhpbGlwc190ZGE4Mjd4X3R1bmVyX3NldF9wYXJhbXM7Ci0JCX0KLQkJYnJlYWs7CiAJY2FzZSBTQUE3MTM0X0JPQVJEX0ZMWURWQlRfRFVPX0NBUkRCVVM6Ci0JCWRldi0+ZHZiLmZyb250ZW5kID0gZHZiX2F0dGFjaCh0ZGExMDA0Nl9hdHRhY2gsCi0JCQkJCSAgICAgICAmdGRhODI3eF9saWZldmlld19jb25maWcsCi0JCQkJCSAgICAgICAmZGV2LT5pMmNfYWRhcCk7Ci0JCWlmIChkZXYtPmR2Yi5mcm9udGVuZCkgewotCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuaW5pdCA9IHBoaWxpcHNfdGRhODI3eF90dW5lcl9pbml0OwotCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuc2xlZXAgPSBwaGlsaXBzX3RkYTgyN3hfdHVuZXJfc2xlZXA7Ci0JCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zID0gcGhpbGlwc190ZGE4Mjd4X3R1bmVyX3NldF9wYXJhbXM7Ci0JCX0KKwkJY29uZmlndXJlX3RkYTgyN3hfZmUoZGV2LCAmdGRhODI3eF9saWZldmlld19jb25maWcpOwogCQlicmVhazsKIAljYXNlIFNBQTcxMzRfQk9BUkRfUEhJTElQU19FVVJPUEE6Ci0JCWRldi0+ZHZiLmZyb250ZW5kID0gZHZiX2F0dGFjaCh0ZGExMDA0Nl9hdHRhY2gsCi0JCQkJCSAgICAgICAmcGhpbGlwc19ldXJvcGFfY29uZmlnLAotCQkJCQkgICAgICAgJmRldi0+aTJjX2FkYXApOwotCQlpZiAoZGV2LT5kdmIuZnJvbnRlbmQpIHsKLQkJCWRldi0+b3JpZ2luYWxfZGVtb2Rfc2xlZXAgPSBkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLnNsZWVwOwotCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy5zbGVlcCA9IHBoaWxpcHNfZXVyb3BhX2RlbW9kX3NsZWVwOwotCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuaW5pdCA9IHBoaWxpcHNfZXVyb3BhX3R1bmVyX2luaXQ7Ci0JCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5zbGVlcCA9IHBoaWxpcHNfZXVyb3BhX3R1bmVyX3NsZWVwOwotCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyA9IHBoaWxpcHNfdGQxMzE2X3R1bmVyX3NldF9wYXJhbXM7Ci0JCX0KLQkJYnJlYWs7CiAJY2FzZSBTQUE3MTM0X0JPQVJEX1ZJREVPTUFURV9EVkJUXzMwMDoKIAkJZGV2LT5kdmIuZnJvbnRlbmQgPSBkdmJfYXR0YWNoKHRkYTEwMDQ2X2F0dGFjaCwKIAkJCQkJICAgICAgICZwaGlsaXBzX2V1cm9wYV9jb25maWcsCkBAIC0xMjQ0LDEyNSArMTAzNSw2MSBAQAogCQkJCQkgICAgICAgJnBoaWxpcHNfdHUxMjE2XzYxX2NvbmZpZywKIAkJCQkJICAgICAgICZkZXYtPmkyY19hZGFwKTsKIAkJaWYgKGRldi0+ZHZiLmZyb250ZW5kKSB7Ci0JCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5pbml0ID0gcGhpbGlwc190dTEyMTZfdHVuZXJfNjFfaW5pdDsKLQkJCWRldi0+ZHZiLmZyb250ZW5kLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBwaGlsaXBzX3R1MTIxNl90dW5lcl82MV9zZXRfcGFyYW1zOworCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuaW5pdCA9IHBoaWxpcHNfdHUxMjE2X2luaXQ7CisJCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zID0gcGhpbGlwc190ZGE2NjUxX3BsbF9zZXQ7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBTQUE3MTM0X0JPQVJEX1BISUxJUFNfVElHRVI6Ci0JCWRldi0+ZHZiLmZyb250ZW5kID0gZHZiX2F0dGFjaCh0ZGExMDA0Nl9hdHRhY2gsCi0JCQkJCSAgICAgICAmcGhpbGlwc190aWdlcl9jb25maWcsCi0JCQkJCSAgICAgICAmZGV2LT5pMmNfYWRhcCk7Ci0JCWlmIChkZXYtPmR2Yi5mcm9udGVuZCkgewotCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy5pMmNfZ2F0ZV9jdHJsID0gdGRhODI5MF9pMmNfZ2F0ZV9jdHJsOwotCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuaW5pdCA9IHBoaWxpcHNfdGlnZXJfdHVuZXJfaW5pdDsKLQkJCWRldi0+ZHZiLmZyb250ZW5kLT5vcHMudHVuZXJfb3BzLnNsZWVwID0gcGhpbGlwc190aWdlcl90dW5lcl9zbGVlcDsKLQkJCWRldi0+ZHZiLmZyb250ZW5kLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBwaGlsaXBzX3RpZ2VyX3R1bmVyX3NldF9wYXJhbXM7Ci0JCX0KKwkJY29uZmlndXJlX3RkYTgyN3hfZmUoZGV2LCAmcGhpbGlwc190aWdlcl9jb25maWcpOwogCQlicmVhazsKIAljYXNlIFNBQTcxMzRfQk9BUkRfUElOTkFDTEVfUENUVl8zMTBpOgotCQlkZXYtPmR2Yi5mcm9udGVuZCA9IGR2Yl9hdHRhY2godGRhMTAwNDZfYXR0YWNoLAotCQkJCQkgICAgICAgJnBpbm5hY2xlX3BjdHZfMzEwaV9jb25maWcsCi0JCQkJCSAgICAgICAmZGV2LT5pMmNfYWRhcCk7Ci0JCWlmIChkZXYtPmR2Yi5mcm9udGVuZCkgewotCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy5pMmNfZ2F0ZV9jdHJsID0gdGRhODI5MF9pMmNfZ2F0ZV9jdHJsOwotCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuaW5pdCA9IHBoaWxpcHNfdGlnZXJfdHVuZXJfaW5pdDsKLQkJCWRldi0+ZHZiLmZyb250ZW5kLT5vcHMudHVuZXJfb3BzLnNsZWVwID0gcGhpbGlwc190aWdlcl90dW5lcl9zbGVlcDsKLQkJCWRldi0+ZHZiLmZyb250ZW5kLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBwaGlsaXBzX3RpZ2VyX3R1bmVyX3NldF9wYXJhbXM7Ci0JCX0KKwkJY29uZmlndXJlX3RkYTgyN3hfZmUoZGV2LCAmcGlubmFjbGVfcGN0dl8zMTBpX2NvbmZpZyk7CiAJCWJyZWFrOwogCWNhc2UgU0FBNzEzNF9CT0FSRF9IQVVQUEFVR0VfSFZSMTExMDoKLQkJZGV2LT5kdmIuZnJvbnRlbmQgPSBkdmJfYXR0YWNoKHRkYTEwMDQ2X2F0dGFjaCwKLQkJCQkJICAgICAgICZoYXVwcGF1Z2VfaHZyXzExMTBfY29uZmlnLAotCQkJCQkgICAgICAgJmRldi0+aTJjX2FkYXApOwotCQlpZiAoZGV2LT5kdmIuZnJvbnRlbmQpIHsKLQkJCWRldi0+ZHZiLmZyb250ZW5kLT5vcHMuaTJjX2dhdGVfY3RybCA9IHRkYTgyOTBfaTJjX2dhdGVfY3RybDsKLQkJCWRldi0+ZHZiLmZyb250ZW5kLT5vcHMudHVuZXJfb3BzLmluaXQgPSBwaGlsaXBzX3RpZ2VyX3R1bmVyX2luaXQ7Ci0JCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5zbGVlcCA9IHBoaWxpcHNfdGlnZXJfdHVuZXJfc2xlZXA7Ci0JCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zID0gcGhpbGlwc190aWdlcl90dW5lcl9zZXRfcGFyYW1zOwotCQl9CisJCWNvbmZpZ3VyZV90ZGE4Mjd4X2ZlKGRldiwgJmhhdXBwYXVnZV9odnJfMTExMF9jb25maWcpOwogCQlicmVhazsKIAljYXNlIFNBQTcxMzRfQk9BUkRfQVNVU1RlS19QNzEzMV9EVUFMOgotCQlkZXYtPmR2Yi5mcm9udGVuZCA9IGR2Yl9hdHRhY2godGRhMTAwNDZfYXR0YWNoLAotCQkJCQkgICAgICAgJmFzdXNfcDcxMzFfZHVhbF9jb25maWcsCi0JCQkJCSAgICAgICAmZGV2LT5pMmNfYWRhcCk7Ci0JCWlmIChkZXYtPmR2Yi5mcm9udGVuZCkgewotCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy5pMmNfZ2F0ZV9jdHJsID0gdGRhODI5MF9pMmNfZ2F0ZV9jdHJsOwotCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuaW5pdCA9IGFzdXNfcDcxMzFfZHVhbF90dW5lcl9pbml0OwotCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuc2xlZXAgPSBhc3VzX3A3MTMxX2R1YWxfdHVuZXJfc2xlZXA7Ci0JCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zID0gcGhpbGlwc190aWdlcl90dW5lcl9zZXRfcGFyYW1zOwotCQl9CisJCWNvbmZpZ3VyZV90ZGE4Mjd4X2ZlKGRldiwgJmFzdXNfcDcxMzFfZHVhbF9jb25maWcpOwogCQlicmVhazsKIAljYXNlIFNBQTcxMzRfQk9BUkRfRkxZRFZCVF9MUjMwMToKLQkJZGV2LT5kdmIuZnJvbnRlbmQgPSBkdmJfYXR0YWNoKHRkYTEwMDQ2X2F0dGFjaCwKLQkJCQkJICAgICAgICZ0ZGE4Mjd4X2xpZmV2aWV3X2NvbmZpZywKLQkJCQkJICAgICAgICZkZXYtPmkyY19hZGFwKTsKLQkJaWYgKGRldi0+ZHZiLmZyb250ZW5kKSB7Ci0JCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5pbml0ID0gcGhpbGlwc190ZGE4Mjd4X3R1bmVyX2luaXQ7Ci0JCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5zbGVlcCA9IHBoaWxpcHNfdGRhODI3eF90dW5lcl9zbGVlcDsKLQkJCWRldi0+ZHZiLmZyb250ZW5kLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBwaGlsaXBzX3RkYTgyN3hfdHVuZXJfc2V0X3BhcmFtczsKLQkJfQorCQljb25maWd1cmVfdGRhODI3eF9mZShkZXYsICZ0ZGE4Mjd4X2xpZmV2aWV3X2NvbmZpZyk7CiAJCWJyZWFrOwogCWNhc2UgU0FBNzEzNF9CT0FSRF9GTFlEVkJfVFJJTzoKIAkJaWYoISB1c2VfZnJvbnRlbmQpIHsJLy90ZXJyZXN0cmlhbAotCQkJZGV2LT5kdmIuZnJvbnRlbmQgPSBkdmJfYXR0YWNoKHRkYTEwMDQ2X2F0dGFjaCwKLQkJCQkJCSAgICAgICAmbGlmZXZpZXdfdHJpb19jb25maWcsCi0JCQkJCQkgICAgICAgJmRldi0+aTJjX2FkYXApOwotCQkJaWYgKGRldi0+ZHZiLmZyb250ZW5kKSB7Ci0JCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuc2xlZXAgPSBsaWZldmlld190cmlvX3R1bmVyX3NsZWVwOwotCQkJCWRldi0+ZHZiLmZyb250ZW5kLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPQotCQkJCQkJCQlsaWZldmlld190cmlvX3R1bmVyX3NldF9wYXJhbXM7Ci0JCQl9CisJCQljb25maWd1cmVfdGRhODI3eF9mZShkZXYsICZsaWZldmlld190cmlvX2NvbmZpZyk7CiAJCX0gZWxzZSB7ICAJICAgICAgLy9zYXRlbGxpdGUKIAkJCWRldi0+ZHZiLmZyb250ZW5kID0gZHZiX2F0dGFjaCh0ZGExMDA4Nl9hdHRhY2gsICZmbHlkdmJzLCAmZGV2LT5pMmNfYWRhcCk7CiAJCQlpZiAoZGV2LT5kdmIuZnJvbnRlbmQpIHsKIAkJCQlpZiAoZHZiX2F0dGFjaCh0ZGE4MjZ4X2F0dGFjaCwgZGV2LT5kdmIuZnJvbnRlbmQsIDB4NjMsCiAJCQkJCQkJCQkmZGV2LT5pMmNfYWRhcCwgMCkgPT0gTlVMTCkgewotCQkJCQlwcmludGsoIiVzOiBMaWZldmlldyBUcmlvLCBObyB0ZGE4MjZ4IGZvdW5kIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJCQkJd3ByaW50aygiJXM6IExpZmV2aWV3IFRyaW8sIE5vIHRkYTgyNnggZm91bmQhXG4iLCBfX0ZVTkNUSU9OX18pOwogCQkJCX0KIAkJCQlpZiAoZHZiX2F0dGFjaChpc2w2NDIxX2F0dGFjaCwgZGV2LT5kdmIuZnJvbnRlbmQsICZkZXYtPmkyY19hZGFwLAogCQkJCQkJCQkJCTB4MDgsIDAsIDApID09IE5VTEwpIHsKLQkJCQkJcHJpbnRrKCIlczogTGlmZXZpZXcgVHJpbywgTm8gSVNMNjQyMSBmb3VuZCFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQkJCXdwcmludGsoIiVzOiBMaWZldmlldyBUcmlvLCBObyBJU0w2NDIxIGZvdW5kIVxuIiwgX19GVU5DVElPTl9fKTsKIAkJCQl9CiAJCQl9CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBTQUE3MTM0X0JPQVJEX0FEU19EVU9fQ0FSREJVU19QVFYzMzE6Ci0JCWRldi0+ZHZiLmZyb250ZW5kID0gZHZiX2F0dGFjaCh0ZGExMDA0Nl9hdHRhY2gsCi0JCQkJCSAgICAgICAmYWRzX3RlY2hfZHVvX2NvbmZpZywKLQkJCQkJICAgICAgICZkZXYtPmkyY19hZGFwKTsKLQkJaWYgKGRldi0+ZHZiLmZyb250ZW5kKSB7Ci0JCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5pbml0ID0gYWRzX2R1b190dW5lcl9pbml0OwotCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuc2xlZXAgPSBhZHNfZHVvX3R1bmVyX3NsZWVwOwotCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyA9IGFkc19kdW9fdHVuZXJfc2V0X3BhcmFtczsKLQkJfQotCQlicmVhazsKLQljYXNlIFNBQTcxMzRfQk9BUkRfVEVWSU9OX0RWQlRfMjIwUkY6Ci0JCWRldi0+ZHZiLmZyb250ZW5kID0gZHZiX2F0dGFjaCh0ZGExMDA0Nl9hdHRhY2gsCi0JCQkJCSAgICAgICAmdGV2aW9uX2R2YnQyMjByZl9jb25maWcsCi0JCQkJCSAgICAgICAmZGV2LT5pMmNfYWRhcCk7Ci0JCWlmIChkZXYtPmR2Yi5mcm9udGVuZCkgewotCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuc2xlZXAgPSB0ZXZpb25fZHZiMjIwcmZfdHVuZXJfc2xlZXA7Ci0JCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zID0gdGV2aW9uX2R2YjIyMHJmX3R1bmVyX3NldF9wYXJhbXM7Ci0JCX0KLQkJYnJlYWs7CiAJY2FzZSBTQUE3MTM0X0JPQVJEX0ZMWURWQlRfSFlCUklEX0NBUkRCVVM6CiAJCWRldi0+ZHZiLmZyb250ZW5kID0gZHZiX2F0dGFjaCh0ZGExMDA0Nl9hdHRhY2gsCiAJCQkJCSAgICAgICAmYWRzX3RlY2hfZHVvX2NvbmZpZywKIAkJCQkJICAgICAgICZkZXYtPmkyY19hZGFwKTsKIAkJaWYgKGRldi0+ZHZiLmZyb250ZW5kKSB7Ci0JCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5pbml0ID0gYWRzX2R1b190dW5lcl9pbml0OwotCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuc2xlZXAgPSBhZHNfZHVvX3R1bmVyX3NsZWVwOwotCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyA9IGFkc19kdW9fdHVuZXJfc2V0X3BhcmFtczsKKwkJCWlmIChkdmJfYXR0YWNoKHRkYTgyN3hfYXR0YWNoLGRldi0+ZHZiLmZyb250ZW5kLAorCQkJCSAgIGFkc190ZWNoX2R1b19jb25maWcudHVuZXJfYWRkcmVzcywKKwkJCQkgICAmZGV2LT5pMmNfYWRhcCwmYWRzX2R1b19jZmcpID09IE5VTEwpIHsKKwkJCQl3cHJpbnRrKCJubyB0ZGE4Mjd4IHR1bmVyIGZvdW5kIGF0IGFkZHI6ICUwMnhcbiIsCisJCQkJCWFkc190ZWNoX2R1b19jb25maWcudHVuZXJfYWRkcmVzcyk7CisJCQl9CiAJCX0KIAkJYnJlYWs7CisJY2FzZSBTQUE3MTM0X0JPQVJEX1RFVklPTl9EVkJUXzIyMFJGOgorCQljb25maWd1cmVfdGRhODI3eF9mZShkZXYsICZ0ZXZpb25fZHZidDIyMHJmX2NvbmZpZyk7CisJCWJyZWFrOwogCWNhc2UgU0FBNzEzNF9CT0FSRF9NRURJT05fTUQ4ODAwX1FVQURSTzoKLQkJZGV2LT5kdmIuZnJvbnRlbmQgPSB0ZGExMDA0Nl9hdHRhY2goJm1kODgwMF9kdmJ0X2NvbmZpZywKLQkJCQkJCSAgICAmZGV2LT5pMmNfYWRhcCk7Ci0JCWlmIChkZXYtPmR2Yi5mcm9udGVuZCkgewotCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuaW5pdCA9IHBoaWxpcHNfdGlnZXJfdHVuZXJfaW5pdDsKLQkJCWRldi0+ZHZiLmZyb250ZW5kLT5vcHMudHVuZXJfb3BzLnNsZWVwID0gbWQ4ODAwX2R2YnRfYW5hbG9nX21vZGU7Ci0JCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zID0gbWQ4ODAwX2R2YnRfcGxsX3NldDsKLQkJfQorCQljb25maWd1cmVfdGRhODI3eF9mZShkZXYsICZtZDg4MDBfZHZidF9jb25maWcpOwogCQlicmVhazsKIAljYXNlIFNBQTcxMzRfQk9BUkRfQVZFUk1FRElBX0FWRVJUVkhEX0ExODA6CiAJCWRldi0+ZHZiLmZyb250ZW5kID0gZHZiX2F0dGFjaChueHQyMDB4X2F0dGFjaCwgJmF2ZXJ0dmhkYTE4MCwKQEAgLTEzODYsMTEgKzExMTMsMTEgQEAKIAkJaWYgKGRldi0+ZHZiLmZyb250ZW5kKSB7CiAJCQlpZiAoZHZiX2F0dGFjaCh0ZGE4MjZ4X2F0dGFjaCwgZGV2LT5kdmIuZnJvbnRlbmQsIDB4NjAsCiAJCQkJICAgICAgICZkZXYtPmkyY19hZGFwLCAwKSA9PSBOVUxMKSB7Ci0JCQkJcHJpbnRrKCIlczogTm8gdGRhODI2eCBmb3VuZCFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQkJd3ByaW50aygiJXM6IE5vIHRkYTgyNnggZm91bmQhXG4iLCBfX0ZVTkNUSU9OX18pOwogCQkJfQogCQkJaWYgKGR2Yl9hdHRhY2goaXNsNjQyMV9hdHRhY2gsIGRldi0+ZHZiLmZyb250ZW5kLAogCQkJCSAgICAgICAmZGV2LT5pMmNfYWRhcCwgMHgwOCwgMCwgMCkgPT0gTlVMTCkgewotCQkJCXByaW50aygiJXM6IE5vIElTTDY0MjEgZm91bmQhXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJCXdwcmludGsoIiVzOiBObyBJU0w2NDIxIGZvdW5kIVxuIiwgX19GVU5DVElPTl9fKTsKIAkJCX0KIAkJfQogCQlicmVhazsKQEAgLTE0MTUsNDEgKzExNDIsNDUgQEAKIAkJfQogCQlicmVhazsKIAljYXNlIFNBQTcxMzRfQk9BUkRfQ0lORVJHWV9IVF9QQ01DSUE6Ci0JCWRldi0+ZHZiLmZyb250ZW5kID0gZHZiX2F0dGFjaCh0ZGExMDA0Nl9hdHRhY2gsCi0JCQkJCSAgICAgICAmY2luZXJneV9odF9jb25maWcsCi0JCQkJCSAgICAgICAmZGV2LT5pMmNfYWRhcCk7Ci0JCWlmIChkZXYtPmR2Yi5mcm9udGVuZCkgewotCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy5pMmNfZ2F0ZV9jdHJsID0gdGRhODI5MF9pMmNfZ2F0ZV9jdHJsOwotCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuaW5pdCA9IGNpbmVyZ3lfaHRfdHVuZXJfaW5pdDsKLQkJCWRldi0+ZHZiLmZyb250ZW5kLT5vcHMudHVuZXJfb3BzLnNsZWVwID0gY2luZXJneV9odF90dW5lcl9zbGVlcDsKLQkJCWRldi0+ZHZiLmZyb250ZW5kLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBwaGlsaXBzX3RpZ2VyX3R1bmVyX3NldF9wYXJhbXM7Ci0KLQkJfQorCQljb25maWd1cmVfdGRhODI3eF9mZShkZXYsICZjaW5lcmd5X2h0X2NvbmZpZyk7CiAJCWJyZWFrOwogCWNhc2UgU0FBNzEzNF9CT0FSRF9DSU5FUkdZX0hUX1BDSToKLQkJZGV2LT5kdmIuZnJvbnRlbmQgPSBkdmJfYXR0YWNoKHRkYTEwMDQ2X2F0dGFjaCwKLQkJCQkJICAgICAgICZjaW5lcmd5X2h0X2NvbmZpZywKLQkJCQkJICAgICAgICZkZXYtPmkyY19hZGFwKTsKLQkJaWYgKGRldi0+ZHZiLmZyb250ZW5kKSB7Ci0JCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLmkyY19nYXRlX2N0cmwgPSB0ZGE4MjkwX2kyY19nYXRlX2N0cmw7Ci0JCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5pbml0ID0gY2luZXJneV9odF90dW5lcl9pbml0OwotCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuc2xlZXAgPSBjaW5lcmd5X2h0X3R1bmVyX3NsZWVwOwotCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyA9IG1kODgwMF9kdmJ0X3BsbF9zZXQ7Ci0KLQkJfQorCQljb25maWd1cmVfdGRhODI3eF9mZShkZXYsICZjaW5lcmd5X2h0X3BjaV9jb25maWcpOworCQlicmVhazsKKwljYXNlIFNBQTcxMzRfQk9BUkRfUEhJTElQU19USUdFUl9TOgorCQljb25maWd1cmVfdGRhODI3eF9mZShkZXYsICZwaGlsaXBzX3RpZ2VyX3NfY29uZmlnKTsKKwkJYnJlYWs7CisJY2FzZSBTQUE3MTM0X0JPQVJEX0FTVVNfUDcxMzFfNDg3MToKKwkJY29uZmlndXJlX3RkYTgyN3hfZmUoZGV2LCAmYXN1c19wNzEzMV80ODcxX2NvbmZpZyk7CisJCWJyZWFrOworCWNhc2UgU0FBNzEzNF9CT0FSRF9BU1VTVGVLX1A3MTMxX0hZQlJJRF9MTkE6CisJCWNvbmZpZ3VyZV90ZGE4Mjd4X2ZlKGRldiwgJmFzdXNfcDcxMzFfaHlicmlkX2xuYV9jb25maWcpOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlwcmludGsoIiVzOiBIdWg/IHVua25vd24gRFZCIGNhcmQ/XG4iLGRldi0+bmFtZSk7CisJCXdwcmludGsoIkh1aD8gdW5rbm93biBEVkIgY2FyZD9cbiIpOwogCQlicmVhazsKIAl9CiAKIAlpZiAoTlVMTCA9PSBkZXYtPmR2Yi5mcm9udGVuZCkgewotCQlwcmludGsoIiVzOiBmcm9udGVuZCBpbml0aWFsaXphdGlvbiBmYWlsZWRcbiIsZGV2LT5uYW1lKTsKKwkJcHJpbnRrKEtFUk5fRVJSICIlcy9kdmI6IGZyb250ZW5kIGluaXRpYWxpemF0aW9uIGZhaWxlZFxuIiwgZGV2LT5uYW1lKTsKIAkJcmV0dXJuIC0xOwogCX0KIAogCS8qIHJlZ2lzdGVyIGV2ZXJ5dGhpbmcgZWxzZSAqLwotCXJldHVybiB2aWRlb2J1Zl9kdmJfcmVnaXN0ZXIoJmRldi0+ZHZiLCBUSElTX01PRFVMRSwgZGV2LCAmZGV2LT5wY2ktPmRldik7CisJcmV0ID0gdmlkZW9idWZfZHZiX3JlZ2lzdGVyKCZkZXYtPmR2YiwgVEhJU19NT0RVTEUsIGRldiwgJmRldi0+cGNpLT5kZXYpOworCisJLyogdGhpcyBzZXF1ZW5jZSBpcyBuZWNlc3NhcnkgdG8gbWFrZSB0aGUgdGRhMTAwNHggbG9hZCBpdHMgZmlybXdhcmUKKwkgKiBhbmQgdG8gZW50ZXIgYW5hbG9nIG1vZGUgb2YgaHlicmlkIGJvYXJkcworCSAqLworCWlmICghcmV0KSB7CisJCWlmIChkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLmluaXQpCisJCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLmluaXQoZGV2LT5kdmIuZnJvbnRlbmQpOworCQlpZiAoZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy5zbGVlcCkKKwkJCWRldi0+ZHZiLmZyb250ZW5kLT5vcHMuc2xlZXAoZGV2LT5kdmIuZnJvbnRlbmQpOworCQlpZiAoZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuc2xlZXApCisJCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5zbGVlcChkZXYtPmR2Yi5mcm9udGVuZCk7CisJfQorCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgZHZiX2Zpbmkoc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1pMmMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWkyYy5jCmluZGV4IGNjZThkYTYuLjFjYjhjNzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWkyYy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWkyYy5jCkBAIC0zNzAsNiArMzcwLDggQEAKIAogCQl0dW5fc2V0dXAudHlwZSA9IHR1bmVyOwogCQl0dW5fc2V0dXAuYWRkciA9IHNhYTcxMzRfYm9hcmRzW2Rldi0+Ym9hcmRdLnR1bmVyX2FkZHI7CisJCXR1bl9zZXR1cC5jb25maWcgPSBzYWE3MTM0X2JvYXJkc1tkZXYtPmJvYXJkXS50dW5lcl9jb25maWc7CisJCXR1bl9zZXR1cC50dW5lcl9jYWxsYmFjayA9IHNhYTcxMzRfdHVuZXJfY2FsbGJhY2s7CiAKIAkJaWYgKCh0dW5fc2V0dXAuYWRkciA9PSBBRERSX1VOU0VUKXx8KHR1bl9zZXR1cC5hZGRyID09IGNsaWVudC0+YWRkcikpIHsKIApAQCAtNDQ1LDcgKzQ0Nyw3IEBACiAJdW5zaWduZWQgY2hhciBidWY7CiAJaW50IGkscmM7CiAKLQlmb3IgKGkgPSAwOyBpIDwgMTI4OyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpMmNfZGV2cyk7IGkrKykgewogCQljLT5hZGRyID0gaTsKIAkJcmMgPSBpMmNfbWFzdGVyX3JlY3YoYywmYnVmLDApOwogCQlpZiAocmMgPCAwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtaW5wdXQuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWlucHV0LmMKaW5kZXggNDZjNTgzZi4uYzBkZTM3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtaW5wdXQuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1pbnB1dC5jCkBAIC0zMjEsNiArMzIxLDcgQEAKIAkJbWFza19rZXlkb3duID0gMHgwMDQwMDAwOwogCQlicmVhazsKIAljYXNlIFNBQTcxMzRfQk9BUkRfQVNVU1RlS19QNzEzMV9EVUFMOgorCWNhc2UgU0FBNzEzNF9CT0FSRF9BU1VTVGVLX1A3MTMxX0hZQlJJRF9MTkE6CiAJCWlyX2NvZGVzICAgICA9IGlyX2NvZGVzX2FzdXNfcGMzOTsKIAkJbWFza19rZXlkb3duID0gMHgwMDQwMDAwOwogCQlyYzVfZ3BpbyA9IDE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC12aWRlby5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtdmlkZW8uYwppbmRleCBmMmNiNjMwLi45OTg1ZGVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC12aWRlby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LXZpZGVvLmMKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zb3J0Lmg+CiAKICNpbmNsdWRlICJzYWE3MTM0LXJlZy5oIgogI2luY2x1ZGUgInNhYTcxMzQuaCIKQEAgLTUxNiwxNCArNTE3LDEyIEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYwotaW50IHJlc19jaGVjayhzdHJ1Y3Qgc2FhNzEzNF9maCAqZmgsIHVuc2lnbmVkIGludCBiaXQpCitzdGF0aWMgaW50IHJlc19jaGVjayhzdHJ1Y3Qgc2FhNzEzNF9maCAqZmgsIHVuc2lnbmVkIGludCBiaXQpCiB7CiAJcmV0dXJuIChmaC0+cmVzb3VyY2VzICYgYml0KTsKIH0KIAotc3RhdGljCi1pbnQgcmVzX2xvY2tlZChzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiwgdW5zaWduZWQgaW50IGJpdCkKK3N0YXRpYyBpbnQgcmVzX2xvY2tlZChzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiwgdW5zaWduZWQgaW50IGJpdCkKIHsKIAlyZXR1cm4gKGRldi0+cmVzb3VyY2VzICYgYml0KTsKIH0KQEAgLTYwMyw3ICs2MDIsMTQgQEAKIAlzYWFfd3JpdGViKFNBQTcxMzRfUkFXX0RBVEFfR0FJTiwgICAgICAgICAweDQwKTsKIAlzYWFfd3JpdGViKFNBQTcxMzRfUkFXX0RBVEFfT0ZGU0VULCAgICAgICAweDgwKTsKIAotCXNhYTcxMzRfaTJjX2NhbGxfY2xpZW50cyhkZXYsVklESU9DX1NfU1RELCZub3JtLT5pZCk7CisJLyogb25seSB0ZWxsIHRoZSB0dW5lciBpZiB0aGlzIGlzIGEgdHYgaW5wdXQgKi8KKwlpZiAoY2FyZF9pbihkZXYsZGV2LT5jdGxfaW5wdXQpLnR2KSB7CisJCWlmICgoY2FyZChkZXYpLnR1bmVyX3R5cGUgPT0gVFVORVJfUEhJTElQU19UREE4MjkwKQorCQkJCSYmICgoY2FyZChkZXYpLnR1bmVyX2NvbmZpZyA9PSAxKQorCQkJCXx8ICAoY2FyZChkZXYpLnR1bmVyX2NvbmZpZyA9PSAyKSkpCisJCQlzYWE3MTM0X3NldF9ncGlvKGRldiwgMjIsIDUpOworCQlzYWE3MTM0X2kyY19jYWxsX2NsaWVudHMoZGV2LFZJRElPQ19TX1NURCwmbm9ybS0+aWQpOworCX0KIH0KIAogc3RhdGljIHZvaWQgdmlkZW9fbXV4KHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2LCBpbnQgaW5wdXQpCkBAIC03MzIsMjUgKzczOCw2IEBACiAJX191OCAgZGlzYWJsZTsKIH07CiAKLXN0YXRpYyB2b2lkIHNvcnRfY2xpcGxpc3Qoc3RydWN0IGNsaXBsaXN0ICpjbCwgaW50IGVudHJpZXMpCi17Ci0Jc3RydWN0IGNsaXBsaXN0IHN3YXA7Ci0JaW50IGksaixuOwotCi0JZm9yIChpID0gZW50cmllcy0yOyBpID49IDA7IGktLSkgewotCQlmb3IgKG4gPSAwLCBqID0gMDsgaiA8PSBpOyBqKyspIHsKLQkJCWlmIChjbFtqXS5wb3NpdGlvbiA+IGNsW2orMV0ucG9zaXRpb24pIHsKLQkJCQlzd2FwID0gY2xbal07Ci0JCQkJY2xbal0gPSBjbFtqKzFdOwotCQkJCWNsW2orMV0gPSBzd2FwOwotCQkJCW4rKzsKLQkJCX0KLQkJfQotCQlpZiAoMCA9PSBuKQotCQkJYnJlYWs7Ci0JfQotfQotCiBzdGF0aWMgdm9pZCBzZXRfY2xpcGxpc3Qoc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYsIGludCByZWcsCiAJCQlzdHJ1Y3QgY2xpcGxpc3QgKmNsLCBpbnQgZW50cmllcywgY2hhciAqbmFtZSkKIHsKQEAgLTc4NCwxNSArNzcxLDI3IEBACiAJcmV0dXJuIHZhbDsKIH0KIAorLyogU29ydCBpbnRvIHNtYWxsZXN0IHBvc2l0aW9uIGZpcnN0IG9yZGVyICovCitzdGF0aWMgaW50IGNsaXBsaXN0X2NtcChjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQoreworCWNvbnN0IHN0cnVjdCBjbGlwbGlzdCAqY2xhID0gYTsKKwljb25zdCBzdHJ1Y3QgY2xpcGxpc3QgKmNsYiA9IGI7CisJaWYgKGNsYS0+cG9zaXRpb24gPCBjbGItPnBvc2l0aW9uKQorCQlyZXR1cm4gLTE7CisJaWYgKGNsYS0+cG9zaXRpb24gPiBjbGItPnBvc2l0aW9uKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBzZXR1cF9jbGlwcGluZyhzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiwgc3RydWN0IHY0bDJfY2xpcCAqY2xpcHMsCiAJCQkgIGludCBuY2xpcHMsIGludCBpbnRlcmxhY2UpCiB7CiAJc3RydWN0IGNsaXBsaXN0IGNvbFsxNl0sIHJvd1sxNl07Ci0JaW50IGNvbHMsIHJvd3MsIGk7CisJaW50IGNvbHMgPSAwLCByb3dzID0gMCwgaTsKIAlpbnQgZGl2ID0gaW50ZXJsYWNlID8gMiA6IDE7CiAKLQltZW1zZXQoY29sLDAsc2l6ZW9mKGNvbCkpOyBjb2xzID0gMDsKLQltZW1zZXQocm93LDAsc2l6ZW9mKHJvdykpOyByb3dzID0gMDsKKwltZW1zZXQoY29sLCAwLCBzaXplb2YoY29sKSk7CisJbWVtc2V0KHJvdywgMCwgc2l6ZW9mKHJvdykpOwogCWZvciAoaSA9IDA7IGkgPCBuY2xpcHMgJiYgaSA8IDg7IGkrKykgewogCQljb2xbY29sc10ucG9zaXRpb24gPSBjbGlwX3JhbmdlKGNsaXBzW2ldLmMubGVmdCk7CiAJCWNvbFtjb2xzXS5lbmFibGUgICA9ICgxIDw8IGkpOwpAQCAtODA4LDggKzgwNyw4IEBACiAJCXJvd1tyb3dzXS5kaXNhYmxlICA9ICgxIDw8IGkpOwogCQlyb3dzKys7CiAJfQotCXNvcnRfY2xpcGxpc3QoY29sLGNvbHMpOwotCXNvcnRfY2xpcGxpc3Qocm93LHJvd3MpOworCXNvcnQoY29sLCBjb2xzLCBzaXplb2YgY29sWzBdLCBjbGlwbGlzdF9jbXAsIE5VTEwpOworCXNvcnQocm93LCByb3dzLCBzaXplb2Ygcm93WzBdLCBjbGlwbGlzdF9jbXAsIE5VTEwpOwogCXNldF9jbGlwbGlzdChkZXYsMHgzODAsY29sLGNvbHMsImNvbHMiKTsKIAlzZXRfY2xpcGxpc3QoZGV2LDB4Mzg0LHJvdyxyb3dzLCJyb3dzIik7CiAJcmV0dXJuIDA7CkBAIC0xMjYxLDE5ICsxMjYwLDE0IEBACiAKIHN0YXRpYyBpbnQgc2FhNzEzNF9yZXNvdXJjZShzdHJ1Y3Qgc2FhNzEzNF9maCAqZmgpCiB7Ci0JaW50IHJlcyA9IDA7CisJaWYgKGZoLT50eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKKwkJcmV0dXJuIFJFU09VUkNFX1ZJREVPOwogCi0Jc3dpdGNoIChmaC0+dHlwZSkgewotCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOgotCQlyZXMgPSBSRVNPVVJDRV9WSURFTzsKLQkJYnJlYWs7Ci0JY2FzZSBWNEwyX0JVRl9UWVBFX1ZCSV9DQVBUVVJFOgotCQlyZXMgPSBSRVNPVVJDRV9WQkk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCUJVRygpOwotCX0KLQlyZXR1cm4gcmVzOworCWlmIChmaC0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZCSV9DQVBUVVJFKQorCQlyZXR1cm4gUkVTT1VSQ0VfVkJJOworCisJQlVHKCk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgdmlkZW9fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKQEAgLTE0NjEsOCArMTQ1NSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQKLXZpZGVvX21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqIHZtYSkKK3N0YXRpYyBpbnQgdmlkZW9fbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICogdm1hKQogewogCXN0cnVjdCBzYWE3MTM0X2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIApAQCAtMjQ2MSwxMiArMjQ1NCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBzYWE3MTM0X3ZpZGVvX2Zpbmkoc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYpCi17Ci0JLyogbm90aGluZyAqLwotCXJldHVybiAwOwotfQotCiB2b2lkIHNhYTcxMzRfaXJxX3ZpZGVvX2ludGwoc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYpCiB7CiAJc3RhdGljIGNvbnN0IGNoYXIgKnN0W10gPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQuaAppbmRleCBiM2UzOTU3Li42MjIyNGNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LmgKQEAgLTIzMSw2ICsyMzEsMTAgQEAKICNkZWZpbmUgU0FBNzEzNF9CT0FSRF9FTkNPUkVfRU5MVFYgICAgICAgICAxMDYKICNkZWZpbmUgU0FBNzEzNF9CT0FSRF9FTkNPUkVfRU5MVFZfRk0gICAgICAxMDcKICNkZWZpbmUgU0FBNzEzNF9CT0FSRF9DSU5FUkdZX0hUX1BDSSAgICAgICAxMDgKKyNkZWZpbmUgU0FBNzEzNF9CT0FSRF9QSElMSVBTX1RJR0VSX1MgICAgICAxMDkKKyNkZWZpbmUgU0FBNzEzNF9CT0FSRF9BVkVSTUVESUFfTTEwMgkgICAxMTAKKyNkZWZpbmUgU0FBNzEzNF9CT0FSRF9BU1VTX1A3MTMxXzQ4NzEJICAgMTExCisjZGVmaW5lIFNBQTcxMzRfQk9BUkRfQVNVU1RlS19QNzEzMV9IWUJSSURfTE5BIDExMgogCiAjZGVmaW5lIFNBQTcxMzRfTUFYQk9BUkRTIDgKICNkZWZpbmUgU0FBNzEzNF9JTlBVVF9NQVggOApAQCAtMjgwLDYgKzI4NCw3IEBACiAJdW5zaWduZWQgY2hhcgkJcmFkaW9fYWRkcjsKIAogCXVuc2lnbmVkIGludCAgICAgICAgICAgIHRkYTk4ODdfY29uZjsKKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICB0dW5lcl9jb25maWc7CiAKIAkvKiBwZXJpcGhlcmFsIEkvTyAqLwogCWVudW0gc2FhNzEzNF92aWRlb19vdXQgIHZpZGVvX291dDsKQEAgLTQzNSw2ICs0NDAsOCBAQAogI2lmZGVmIFZJRElPQ19HX1BSSU9SSVRZCiAJc3RydWN0IHY0bDJfcHJpb19zdGF0ZSAgICAgcHJpbzsKICNlbmRpZgorCS8qIHdvcmtzdHJ1Y3QgZm9yIGxvYWRpbmcgbW9kdWxlcyAqLworCXN0cnVjdCB3b3JrX3N0cnVjdCByZXF1ZXN0X21vZHVsZV93azsKIAogCS8qIGluc21vZCBvcHRpb24vYXV0b2RldGVjdGVkICovCiAJaW50ICAgICAgICAgICAgICAgICAgICAgICAgYXV0b2RldGVjdGVkOwpAQCAtNTYyLDYgKzU2OSw4IEBACiBleHRlcm4gaW50IHNhYTcxMzRfbm9fb3ZlcmxheTsKIAogdm9pZCBzYWE3MTM0X3RyYWNrX2dwaW8oc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYsIGNoYXIgKm1zZyk7Cit2b2lkIHNhYTcxMzRfc2V0X2dwaW8oc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYsIGludCBiaXRfbm8sIGludCB2YWx1ZSk7CitpbnQgc2FhNzEzNF90dW5lcl9jYWxsYmFjayh2b2lkICpwdHIsIGludCBjb21tYW5kLCBpbnQgYXJnKTsKIAogI2RlZmluZSBTQUE3MTM0X1BHVEFCTEVfU0laRSA0MDk2CiAKQEAgLTYyMCw3ICs2MjksNiBAQAogCiBpbnQgc2FhNzEzNF92aWRlb19pbml0MShzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldik7CiBpbnQgc2FhNzEzNF92aWRlb19pbml0MihzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldik7Ci1pbnQgc2FhNzEzNF92aWRlb19maW5pKHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2KTsKIHZvaWQgc2FhNzEzNF9pcnFfdmlkZW9faW50bChzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldik7CiB2b2lkIHNhYTcxMzRfaXJxX3ZpZGVvX2RvbmUoc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYsIHVuc2lnbmVkIGxvbmcgc3RhdHVzKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zZTQwMS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zZTQwMS5jCmluZGV4IDAzODQ0OGYuLjkzZmIwNGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2U0MDEuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NlNDAxLmMKQEAgLTQ1MCw2ICs0NTAsMTMgQEAKIAl9CiAJZm9yIChpPTA7IGk8U0U0MDFfTlVNU0JVRjsgaSsrKSB7CiAJCXNlNDAxLT5zYnVmW2ldLmRhdGE9a21hbGxvYyhTRTQwMV9QQUNLRVRTSVpFLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFzZTQwMS0+c2J1ZltpXS5kYXRhKSB7CisJCQlmb3IoaSA9IGkgLSAxOyBpID49IDA7IGktLSkgeworCQkJCWtmcmVlKHNlNDAxLT5zYnVmW2ldLmRhdGEpOworCQkJCXNlNDAxLT5zYnVmW2ldLmRhdGEgPSBOVUxMOworCQkJfQorCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KIAl9CiAKIAlzZTQwMS0+YmF5ZXJvZmZzZXQ9MDsKQEAgLTQ1OCwxMyArNDY1LDI2IEBACiAJc2U0MDEtPnNjcmF0Y2hfb3ZlcmZsb3c9MDsKIAlmb3IgKGk9MDsgaTxTRTQwMV9OVU1TQ1JBVENIOyBpKyspIHsKIAkJc2U0MDEtPnNjcmF0Y2hbaV0uZGF0YT1rbWFsbG9jKFNFNDAxX1BBQ0tFVFNJWkUsIEdGUF9LRVJORUwpOworCQlpZiAoIXNlNDAxLT5zY3JhdGNoW2ldLmRhdGEpIHsKKwkJCWZvcihpID0gaSAtIDE7IGkgPj0gMDsgaS0tKSB7CisJCQkJa2ZyZWUoc2U0MDEtPnNjcmF0Y2hbaV0uZGF0YSk7CisJCQkJc2U0MDEtPnNjcmF0Y2hbaV0uZGF0YSA9IE5VTEw7CisJCQl9CisJCQlnb3RvIG5vbWVtX3NidWY7CisJCX0KIAkJc2U0MDEtPnNjcmF0Y2hbaV0uc3RhdGU9QlVGRkVSX1VOVVNFRDsKIAl9CiAKIAlmb3IgKGk9MDsgaTxTRTQwMV9OVU1TQlVGOyBpKyspIHsKIAkJdXJiPXVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7Ci0JCWlmKCF1cmIpCi0JCQlyZXR1cm4gLUVOT01FTTsKKwkJaWYoIXVyYikgeworCQkJZm9yKGkgPSBpIC0gMTsgaSA+PSAwOyBpLS0pIHsKKwkJCQl1c2Jfa2lsbF91cmIoc2U0MDEtPnVyYltpXSk7CisJCQkJdXNiX2ZyZWVfdXJiKHNlNDAxLT51cmJbaV0pOworCQkJCXNlNDAxLT51cmJbaV0gPSBOVUxMOworCQkJfQorCQkJZ290byBub21lbV9zY3JhdGNoOworCQl9CiAKIAkJdXNiX2ZpbGxfYnVsa191cmIodXJiLCBzZTQwMS0+ZGV2LAogCQkJdXNiX3JjdmJ1bGtwaXBlKHNlNDAxLT5kZXYsIFNFNDAxX1ZJREVPX0VORFBPSU5UKSwKQEAgLTQ4Miw2ICs1MDIsMTggQEAKIAlzZTQwMS0+ZnJhbWVjb3VudD0wOwogCiAJcmV0dXJuIDA7CisKKyBub21lbV9zY3JhdGNoOgorCWZvciAoaT0wOyBpPFNFNDAxX05VTVNDUkFUQ0g7IGkrKykgeworCQlrZnJlZShzZTQwMS0+c2NyYXRjaFtpXS5kYXRhKTsKKwkJc2U0MDEtPnNjcmF0Y2hbaV0uZGF0YSA9IE5VTEw7CisJfQorIG5vbWVtX3NidWY6CisJZm9yIChpPTA7IGk8U0U0MDFfTlVNU0JVRjsgaSsrKSB7CisJCWtmcmVlKHNlNDAxLT5zYnVmW2ldLmRhdGEpOworCQlzZTQwMS0+c2J1ZltpXS5kYXRhID0gTlVMTDsKKwl9CisJcmV0dXJuIC1FTk9NRU07CiB9CiAKIHN0YXRpYyBpbnQgc2U0MDFfc3RvcF9zdHJlYW0oc3RydWN0IHVzYl9zZTQwMSAqc2U0MDEpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9LY29uZmlnCmluZGV4IDFhN2NjYjY2Li4xOTIwNGY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvS2NvbmZpZworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvS2NvbmZpZwpAQCAtMSw2ICsxLDYgQEAKIGNvbmZpZyBVU0JfU045QzEwMgogCXRyaXN0YXRlICJVU0IgU045QzF4eCBQQyBDYW1lcmEgQ29udHJvbGxlciBzdXBwb3J0IgotCWRlcGVuZHMgb24gVVNCICYmIFZJREVPX1Y0TDEKKwlkZXBlbmRzIG9uIFVTQiAmJiBWSURFT19WNEwyCiAJLS0taGVscC0tLQogCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCBzdXBwb3J0IGZvciBjYW1lcmFzIGJhc2VkIG9uIFNPTmlYIFNOOUMxMDEsCiAJICBTTjlDMTAyLCBTTjlDMTAzLCBTTjlDMTA1IGFuZCBTTjlDMTIwIFBDIENhbWVyYSBDb250cm9sbGVycy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9NYWtlZmlsZQppbmRleCAzMGUzZGZlLi5hNTZkMTZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zbjljMTAyL01ha2VmaWxlCkBAIC0xLDcgKzEsMTQgQEAKLXNuOWMxMDItb2JqcyAgICA6PSBzbjljMTAyX2NvcmUubyBzbjljMTAyX2h2NzEzMWQubyBzbjljMTAyX21pMDM0My5vIFwKLQkJICAgc245YzEwMl9vdjc2MzAubyBzbjljMTAyX292NzY2MC5vIHNuOWMxMDJfcGFzMTA2Yi5vIFwKLQkJICAgc245YzEwMl9wYXMyMDJiY2IubyBzbjljMTAyX3RhczUxMTBjMWIubyBcCi0JCSAgIHNuOWMxMDJfdGFzNTEzMGQxYi5vCitzbjljMTAyLW9ianMgOj0gc245YzEwMl9jb3JlLm8gXAorCQlzbjljMTAyX2h2NzEzMWQubyBcCisJCXNuOWMxMDJfaHY3MTMxci5vIFwKKwkJc245YzEwMl9taTAzNDMubyBcCisJCXNuOWMxMDJfbWkwMzYwLm8gXAorCQlzbjljMTAyX292NzYzMC5vIFwKKwkJc245YzEwMl9vdjc2NjAubyBcCisJCXNuOWMxMDJfcGFzMTA2Yi5vIFwKKwkJc245YzEwMl9wYXMyMDJiY2IubyBcCisJCXNuOWMxMDJfdGFzNTExMGMxYi5vIFwKKwkJc245YzEwMl90YXM1MTEwZC5vIFwKKwkJc245YzEwMl90YXM1MTMwZDFiLm8KIAogb2JqLSQoQ09ORklHX1VTQl9TTjlDMTAyKSAgICAgICArPSBzbjljMTAyLm8KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zbjljMTAyL3NuOWMxMDIuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyLmgKaW5kZXggNTQyOGYzNC4uNjgwZTc0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zbjljMTAyL3NuOWMxMDIuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvc245YzEwMi5oCkBAIC03OCw4ICs3OCwxMyBAQAogCiB0eXBlZGVmIGNoYXIgc245YzEwMl9zb2ZfaGVhZGVyX3RbNjJdOwogCitzdHJ1Y3Qgc245YzEwMl9zb2ZfdCB7CisJc245YzEwMl9zb2ZfaGVhZGVyX3QgaGVhZGVyOworCXUxNiBieXRlc3JlYWQ7Cit9OworCiBzdHJ1Y3Qgc245YzEwMl9zeXNmc19hdHRyIHsKLQl1OCByZWcsIGkyY19yZWc7CisJdTE2IHJlZywgaTJjX3JlZzsKIAlzbjljMTAyX3NvZl9oZWFkZXJfdCBmcmFtZV9oZWFkZXI7CiB9OwogCkBAIC0xMTIsNyArMTE3LDcgQEAKIAlzdHJ1Y3QgdjRsMl9qcGVnY29tcHJlc3Npb24gY29tcHJlc3Npb247CiAKIAlzdHJ1Y3Qgc245YzEwMl9zeXNmc19hdHRyIHN5c2ZzOwotCXNuOWMxMDJfc29mX2hlYWRlcl90IHNvZl9oZWFkZXI7CisJc3RydWN0IHNuOWMxMDJfc29mX3Qgc29mOwogCXUxNiByZWdbMzg0XTsKIAogCXN0cnVjdCBzbjljMTAyX21vZHVsZV9wYXJhbSBtb2R1bGVfcGFyYW07CkBAIC0xODIsOCArMTg3LDggQEAKIAkJaWYgKChsZXZlbCkgPT0gMSB8fCAobGV2ZWwpID09IDIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAJCQlwcl9pbmZvKCJzbjljMTAyOiAiIGZtdCAiXG4iLCAjIyBhcmdzKTsgICAgICAgICAgICAgICBcCiAJCWVsc2UgaWYgKChsZXZlbCkgPT0gMykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJcHJfZGVidWcoInNuOWMxMDI6IFslczolZF0gIiBmbXQgIlxuIiwgX19GVU5DVElPTl9fLCAgXAotCQkJCSBfX0xJTkVfXyAsICMjIGFyZ3MpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQlwcl9kZWJ1Zygic245YzEwMjogWyVzOiVkXSAiIGZtdCAiXG4iLCAgICAgICAgICAgICAgICBcCisJCQkJIF9fRlVOQ1RJT05fXywgX19MSU5FX18gLCAjIyBhcmdzKTsgICAgICAgICAgIFwKIAl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogfSB3aGlsZSAoMCkKICNlbHNlCkBAIC0xOTQsOCArMTk5LDggQEAKIAogI3VuZGVmIFBEQkcKICNkZWZpbmUgUERCRyhmbXQsIGFyZ3MuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLWRldl9pbmZvKCZjYW0tPnVzYmRldi0+ZGV2LCAiWyVzOiVkXSAiIGZtdCAiXG4iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkgX19GVU5DVElPTl9fLCBfX0xJTkVfXyAsICMjIGFyZ3MpCitkZXZfaW5mbygmY2FtLT51c2JkZXYtPmRldiwgIlslczolczolZF0gIiBmbXQgIlxuIiwgX19GSUxFX18sIF9fRlVOQ1RJT05fXywgICBcCisJIF9fTElORV9fICwgIyMgYXJncykKIAogI3VuZGVmIFBEQkdHCiAjZGVmaW5lIFBEQkdHKGZtdCwgYXJncy4uLikgZG8gezt9IHdoaWxlKDApIC8qIHBsYWNlaG9sZGVyICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvc245YzEwMl9jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvc245YzEwMl9jb3JlLmMKaW5kZXggZDBlMmI0MC4uODlmODMzNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zbjljMTAyL3NuOWMxMDJfY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX2NvcmUuYwpAQCAtNDQsMTEgKzQ0LDEyIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNkZWZpbmUgU045QzEwMl9NT0RVTEVfTkFNRSAgICAgIlY0TDIgZHJpdmVyIGZvciBTTjlDMXh4IFBDIENhbWVyYSBDb250cm9sbGVycyIKLSNkZWZpbmUgU045QzEwMl9NT0RVTEVfQVVUSE9SICAgIihDKSAyMDA0LTIwMDYgTHVjYSBSaXNvbGlhIgorI2RlZmluZSBTTjlDMTAyX01PRFVMRV9BTElBUyAgICAic245YzF4eCIKKyNkZWZpbmUgU045QzEwMl9NT0RVTEVfQVVUSE9SICAgIihDKSAyMDA0LTIwMDcgTHVjYSBSaXNvbGlhIgogI2RlZmluZSBTTjlDMTAyX0FVVEhPUl9FTUFJTCAgICAiPGx1Y2Eucmlzb2xpYUBzdHVkaW8udW5pYm8uaXQ+IgogI2RlZmluZSBTTjlDMTAyX01PRFVMRV9MSUNFTlNFICAiR1BMIgotI2RlZmluZSBTTjlDMTAyX01PRFVMRV9WRVJTSU9OICAiMToxLjM0IgotI2RlZmluZSBTTjlDMTAyX01PRFVMRV9WRVJTSU9OX0NPREUgIEtFUk5FTF9WRVJTSU9OKDEsIDEsIDM0KQorI2RlZmluZSBTTjlDMTAyX01PRFVMRV9WRVJTSU9OICAiMToxLjM5IgorI2RlZmluZSBTTjlDMTAyX01PRFVMRV9WRVJTSU9OX0NPREUgIEtFUk5FTF9WRVJTSU9OKDEsIDEsIDM5KQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKQEAgLTU2LDYgKzU3LDcgQEAKIAogTU9EVUxFX0FVVEhPUihTTjlDMTAyX01PRFVMRV9BVVRIT1IgIiAiIFNOOUMxMDJfQVVUSE9SX0VNQUlMKTsKIE1PRFVMRV9ERVNDUklQVElPTihTTjlDMTAyX01PRFVMRV9OQU1FKTsKK01PRFVMRV9BTElBUyhTTjlDMTAyX01PRFVMRV9BTElBUyk7CiBNT0RVTEVfVkVSU0lPTihTTjlDMTAyX01PRFVMRV9WRVJTSU9OKTsKIE1PRFVMRV9MSUNFTlNFKFNOOUMxMDJfTU9EVUxFX0xJQ0VOU0UpOwogCkBAIC0xMDYsOCArMTA4LDcgQEAKIAkJICJcbjEgPSBjcml0aWNhbCBlcnJvcnMiCiAJCSAiXG4yID0gc2lnbmlmaWNhbnQgaW5mb3JtYXRpb25zIgogCQkgIlxuMyA9IG1vcmUgdmVyYm9zZSBtZXNzYWdlcyIKLQkJICJcbkxldmVsIDMgaXMgdXNlZnVsIGZvciB0ZXN0aW5nIG9ubHksIHdoZW4gb25seSAiCi0JCSAib25lIGRldmljZSBpcyB1c2VkLiIKKwkJICJcbkxldmVsIDMgaXMgdXNlZnVsIGZvciB0ZXN0aW5nIG9ubHkuIgogCQkgIlxuRGVmYXVsdCB2YWx1ZSBpcyAiX19NT0RVTEVfU1RSSU5HKFNOOUMxMDJfREVCVUdfTEVWRUwpIi4iCiAJCSAiXG4iKTsKICNlbmRpZgpAQCAtMTIxLDggKzEyMiw4IEBACiAJc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCogcCA9ICYoY2FtLT5zZW5zb3IucGl4X2Zvcm1hdCk7CiAJc3RydWN0IHY0bDJfcmVjdCogciA9ICYoY2FtLT5zZW5zb3IuY3JvcGNhcC5ib3VuZHMpOwogCXNpemVfdCBpbWFnZXNpemUgPSBjYW0tPm1vZHVsZV9wYXJhbS5mb3JjZV9tdW5tYXAgfHwgaW8gPT0gSU9fUkVBRCA/Ci0JCQkJIChwLT53aWR0aCAqIHAtPmhlaWdodCAqIHAtPnByaXYpIC8gOCA6Ci0JCQkJIChyLT53aWR0aCAqIHItPmhlaWdodCAqIHAtPnByaXYpIC8gODsKKwkJCSAgIChwLT53aWR0aCAqIHAtPmhlaWdodCAqIHAtPnByaXYpIC8gOCA6CisJCQkgICAoci0+d2lkdGggKiByLT5oZWlnaHQgKiBwLT5wcml2KSAvIDg7CiAJdm9pZCogYnVmZiA9IE5VTEw7CiAJdTMyIGk7CiAKQEAgLTIwOCwyNyArMjA5LDQwIEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotaW50IHNuOWMxMDJfd3JpdGVfcmVncyhzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSwgdTgqIGJ1ZmYsIHUxNiBpbmRleCkKKy8qCisgKiBXcml0ZSBhIHNlcXVlbmNlIG9mIGNvdW50IHZhbHVlL3JlZ2lzdGVyIHBhaXJzLiAgUmV0dXJucyAtMSBhZnRlciB0aGUKKyAqIGZpcnN0IGZhaWxlZCB3cml0ZSwgb3IgMCBmb3Igbm8gZXJyb3JzLgorICovCitpbnQgc245YzEwMl93cml0ZV9yZWdzKHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtLCBjb25zdCB1OCB2YWxyZWdbXVsyXSwKKwkJICAgICAgIGludCBjb3VudCkKIHsKIAlzdHJ1Y3QgdXNiX2RldmljZSogdWRldiA9IGNhbS0+dXNiZGV2OworCXU4KiB2YWx1ZSA9IGNhbS0+Y29udHJvbF9idWZmZXI7ICAvKiBOZWVkZWQgZm9yIERNQSdhYmxlIG1lbW9yeSAqLwogCWludCBpLCByZXM7CiAKLQlpZiAoaW5kZXggKyBzaXplb2YoYnVmZikgPj0gQVJSQVlfU0laRShjYW0tPnJlZykpCi0JCXJldHVybiAtMTsKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQl1OCBpbmRleCA9IHZhbHJlZ1tpXVsxXTsKIAotCXJlcyA9IHVzYl9jb250cm9sX21zZyh1ZGV2LCB1c2Jfc25kY3RybHBpcGUodWRldiwgMCksIDB4MDgsIDB4NDEsCi0JCQkgICAgICBpbmRleCwgMCwgYnVmZiwgc2l6ZW9mKGJ1ZmYpLAotCQkJICAgICAgU045QzEwMl9DVFJMX1RJTUVPVVQqc2l6ZW9mKGJ1ZmYpKTsKLQlpZiAocmVzIDwgMCkgewotCQlEQkcoMywgIkZhaWxlZCB0byB3cml0ZSByZWdpc3RlcnMgKGluZGV4IDB4JTAyWCwgZXJyb3IgJWQpIiwKLQkJICAgIGluZGV4LCByZXMpOwotCQlyZXR1cm4gLTE7CisJCS8qCisJCSAqIGluZGV4IGlzIGEgdTgsIHNvIGl0IG11c3QgYmUgPDI1NiBhbmQgY2FuJ3QgYmUgb3V0IG9mIHJhbmdlLgorCQkgKiBJZiB3ZSBwdXQgaW4gYSBjaGVjayBhbnl3YXksIGdjYyBhbm5veXMgdXMgd2l0aCBhIHdhcm5pbmcKKwkJICogdGhhdCBvdXIgY2hlY2sgaXMgdXNlbGVzcy4gIFBlb3BsZSBnZXQgYWxsIHVwcGl0eSB3aGVuIHRoZXkKKwkJICogc2VlIHdhcm5pbmdzIGluIHRoZSBrZXJuZWwgY29tcGlsZS4KKwkJICovCisKKwkJKnZhbHVlID0gdmFscmVnW2ldWzBdOworCQlyZXMgPSB1c2JfY29udHJvbF9tc2codWRldiwgdXNiX3NuZGN0cmxwaXBlKHVkZXYsIDApLAorCQkJCSAgICAgIDB4MDgsIDB4NDEsIGluZGV4LCAwLAorCQkJCSAgICAgIHZhbHVlLCAxLCBTTjlDMTAyX0NUUkxfVElNRU9VVCk7CisJCWlmIChyZXMgPCAwKSB7CisJCQlEQkcoMywgIkZhaWxlZCB0byB3cml0ZSBhIHJlZ2lzdGVyICh2YWx1ZSAweCUwMlgsICIKKwkJCSAgICAgICAiaW5kZXggMHglMDJYLCBlcnJvciAlZCkiLCAqdmFsdWUsIGluZGV4LCByZXMpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJY2FtLT5yZWdbaW5kZXhdID0gKnZhbHVlOwogCX0KIAotCWZvciAoaSA9IDA7IGkgPCBzaXplb2YoYnVmZik7IGkrKykKLQkJY2FtLT5yZWdbaW5kZXgraV0gPSBidWZmW2ldOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQ4NSwxOCArNDk5LDQzIEBACiBzdGF0aWMgdm9pZCoKIHNuOWMxMDJfZmluZF9zb2ZfaGVhZGVyKHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtLCB2b2lkKiBtZW0sIHNpemVfdCBsZW4pCiB7Ci0JY2hhciBzb2ZfaGVhZGVyWzZdID0gezB4ZmYsIDB4ZmYsIDB4MDAsIDB4YzQsIDB4YzQsIDB4OTZ9OwotCXNpemVfdCBzb2ZsZW4gPSAwLCBpOworCXN0YXRpYyBjb25zdCBjaGFyIG1hcmtlcls2XSA9IHsweGZmLCAweGZmLCAweDAwLCAweGM0LCAweGM0LCAweDk2fTsKKwljb25zdCBjaGFyICptID0gbWVtOworCXNpemVfdCBzb2ZsZW4gPSAwLCBpLCBqOwogCiAJc29mbGVuID0gc245YzEwMl9zb2ZfbGVuZ3RoKGNhbSk7CiAKLQlmb3IgKGkgPSAwOyAobGVuID49IHNvZmxlbikgJiYgKGkgPD0gbGVuIC0gc29mbGVuKTsgaSsrKQotCQlpZiAoIW1lbWNtcChtZW0gKyBpLCBzb2ZfaGVhZGVyLCBzaXplb2Yoc29mX2hlYWRlcikpKSB7Ci0JCQltZW1jcHkoY2FtLT5zb2ZfaGVhZGVyLCBtZW0gKyBpLAotCQkJICAgICAgIHNpemVvZihzbjljMTAyX3NvZl9oZWFkZXJfdCkpOwotCQkJCS8qIFNraXAgdGhlIGhlYWRlciAqLwotCQkJCXJldHVybiBtZW0gKyBpICsgc29mbGVuOworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQlzaXplX3QgYjsKKworCQkvKiBSZWFkIHRoZSB2YXJpYWJsZSBwYXJ0IG9mIHRoZSBoZWFkZXIgKi8KKwkJaWYgKHVubGlrZWx5KGNhbS0+c29mLmJ5dGVzcmVhZCA+PSBzaXplb2YobWFya2VyKSkpIHsKKwkJCWNhbS0+c29mLmhlYWRlcltjYW0tPnNvZi5ieXRlc3JlYWRdID0gKihtK2kpOworCQkJaWYgKCsrY2FtLT5zb2YuYnl0ZXNyZWFkID09IHNvZmxlbikgeworCQkJCWNhbS0+c29mLmJ5dGVzcmVhZCA9IDA7CisJCQkJcmV0dXJuIG1lbSArIGk7CiAJCQl9CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIFNlYXJjaCBmb3IgdGhlIFNPRiBtYXJrZXIgKGZpeGVkIHBhcnQpIGluIHRoZSBoZWFkZXIgKi8KKwkJZm9yIChqID0gMCwgYj1jYW0tPnNvZi5ieXRlc3JlYWQ7IGorYiA8IHNpemVvZihtYXJrZXIpOyBqKyspIHsKKwkJCWlmICh1bmxpa2VseShpK2opID09IGxlbikKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCWlmICgqKG0raStqKSA9PSBtYXJrZXJbY2FtLT5zb2YuYnl0ZXNyZWFkXSkgeworCQkJCWNhbS0+c29mLmhlYWRlcltjYW0tPnNvZi5ieXRlc3JlYWRdID0gKihtK2kraik7CisJCQkJaWYgKCsrY2FtLT5zb2YuYnl0ZXNyZWFkID09IHNpemVvZihtYXJrZXIpKSB7CisJCQkJCVBEQkdHKCJCeXRlcyB0byBhbmFseXplOiAlemQuIFNPRiAiCisJCQkJCSAgICAgICJzdGFydHMgYXQgYnl0ZSAjJXpkIiwgbGVuLCBpKTsKKwkJCQkJaSArPSBqKzE7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJY2FtLT5zb2YuYnl0ZXNyZWFkID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KIAogCXJldHVybiBOVUxMOwogfQpAQCAtNTA1LDcgKzU0NCw3IEBACiBzdGF0aWMgdm9pZCoKIHNuOWMxMDJfZmluZF9lb2ZfaGVhZGVyKHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtLCB2b2lkKiBtZW0sIHNpemVfdCBsZW4pCiB7Ci0JY2hhciBlb2ZfaGVhZGVyWzRdWzRdID0geworCXN0YXRpYyBjb25zdCB1OCBlb2ZfaGVhZGVyWzRdWzRdID0gewogCQl7MHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sCiAJCXsweDQwLCAweDAwLCAweDAwLCAweDAwfSwKIAkJezB4ODAsIDB4MDAsIDB4MDAsIDB4MDB9LApAQCAtNTEzLDEwICs1NTIsMTYgQEAKIAl9OwogCXNpemVfdCBpLCBqOwogCisJLyogVGhlIEVPRiBoZWFkZXIgZG9lcyBub3QgZXhpc3QgaW4gY29tcHJlc3NlZCBkYXRhICovCiAJaWYgKGNhbS0+c2Vuc29yLnBpeF9mb3JtYXQucGl4ZWxmb3JtYXQgPT0gVjRMMl9QSVhfRk1UX1NOOUMxMFggfHwKIAkgICAgY2FtLT5zZW5zb3IucGl4X2Zvcm1hdC5waXhlbGZvcm1hdCA9PSBWNEwyX1BJWF9GTVRfSlBFRykKLQkJcmV0dXJuIE5VTEw7IC8qIEVPRiBoZWFkZXIgZG9lcyBub3QgZXhpc3QgaW4gY29tcHJlc3NlZCBkYXRhICovCisJCXJldHVybiBOVUxMOwogCisJLyoKKwkgICBUaGUgRU9GIGhlYWRlciBtaWdodCBjcm9zcyB0aGUgcGFja2V0IGJvdW5kYXJ5LCBidXQgdGhpcyBpcyBub3QgYQorCSAgIHByb2JsZW0sIHNpbmNlIHRoZSBlbmQgb2YgYSBmcmFtZSBpcyBkZXRlcm1pbmVkIGJ5IGNoZWNraW5nIGl0cyBzaXplCisJICAgaW4gdGhlIGZpcnN0IHBsYWNlLgorCSovCiAJZm9yIChpID0gMDsgKGxlbiA+PSA0KSAmJiAoaSA8PSBsZW4gLSA0KTsgaSsrKQogCQlmb3IgKGogPSAwOyBqIDwgQVJSQVlfU0laRShlb2ZfaGVhZGVyKTsgaisrKQogCQkJaWYgKCFtZW1jbXAobWVtICsgaSwgZW9mX2hlYWRlcltqXSwgNCkpCkBAIC01MjksNyArNTc0LDcgQEAKIHN0YXRpYyB2b2lkCiBzbjljMTAyX3dyaXRlX2pwZWdoZWFkZXIoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0sIHN0cnVjdCBzbjljMTAyX2ZyYW1lX3QqIGYpCiB7Ci0Jc3RhdGljIHU4IGpwZWdfaGVhZGVyWzU4OV0gPSB7CisJc3RhdGljIGNvbnN0IHU4IGpwZWdfaGVhZGVyWzU4OV0gPSB7CiAJCTB4ZmYsIDB4ZDgsIDB4ZmYsIDB4ZGIsIDB4MDAsIDB4ODQsIDB4MDAsIDB4MDYsIDB4MDQsIDB4MDUsCiAJCTB4MDYsIDB4MDUsIDB4MDQsIDB4MDYsIDB4MDYsIDB4MDUsIDB4MDYsIDB4MDcsIDB4MDcsIDB4MDYsCiAJCTB4MDgsIDB4MGEsIDB4MTAsIDB4MGEsIDB4MGEsIDB4MDksIDB4MDksIDB4MGEsIDB4MTQsIDB4MGUsCkBAIC02MzksNiArNjg0LDcgQEAKIAkJY2FtLT5zdHJlYW0gPSBTVFJFQU1fT0ZGOwogCQlpZiAoKCpmKSkKIAkJCSgqZiktPnN0YXRlID0gRl9RVUVVRUQ7CisJCWNhbS0+c29mLmJ5dGVzcmVhZCA9IDA7CiAJCURCRygzLCAiU3RyZWFtIGludGVycnVwdGVkIGJ5IGFwcGxpY2F0aW9uIik7CiAJCXdha2VfdXAoJmNhbS0+d2FpdF9zdHJlYW0pOwogCX0KQEAgLTY3Niw2ICs3MjIsNyBAQAogCQlpZiAoc3RhdHVzKSB7CiAJCQlEQkcoMywgIkVycm9yIGluIGlzb2Nocm9ub3VzIGZyYW1lIik7CiAJCQkoKmYpLT5zdGF0ZSA9IEZfRVJST1I7CisJCQljYW0tPnNvZi5ieXRlc3JlYWQgPSAwOwogCQkJY29udGludWU7CiAJCX0KIApAQCAtNjkyLDEzICs3MzksMTMgQEAKIAkJCQlpZiAoZW9mKQogCQkJCQlpbWcgPSAoZW9mID4gcG9zKSA/IGVvZiAtIHBvcyAtIDEgOiAwOwogCi0JCQkJaWYgKCgqZiktPmJ1Zi5ieXRlc3VzZWQraW1nID4gaW1hZ2VzaXplKSB7CisJCQkJaWYgKCgqZiktPmJ1Zi5ieXRlc3VzZWQgKyBpbWcgPiBpbWFnZXNpemUpIHsKIAkJCQkJdTMyIGI7CiAJCQkJCWIgPSAoKmYpLT5idWYuYnl0ZXN1c2VkICsgaW1nIC0KIAkJCQkJICAgIGltYWdlc2l6ZTsKIAkJCQkJaW1nID0gaW1hZ2VzaXplIC0gKCpmKS0+YnVmLmJ5dGVzdXNlZDsKLQkJCQkJREJHKDMsICJFeHBlY3RlZCBFT0Ygbm90IGZvdW5kOiAiCi0JCQkJCSAgICAgICAidmlkZW8gZnJhbWUgY3V0Iik7CisJCQkJCVBEQkdHKCJFeHBlY3RlZCBFT0Ygbm90IGZvdW5kOiB2aWRlbyAiCisJCQkJCSAgICAgICJmcmFtZSBjdXQiKTsKIAkJCQkJaWYgKGVvZikKIAkJCQkJCURCRygzLCAiRXhjZWVkZWQgbGltaXQ6ICsldSAiCiAJCQkJCQkgICAgICAgImJ5dGVzIiwgKHVuc2lnbmVkKShiKSk7CkBAIC03MTksMTEgKzc2Niw2IEBACiAJCQkJICAgICAgVjRMMl9QSVhfRk1UX0pQRUcpICYmIGVvZikpIHsKIAkJCQkJdTMyIGI7CiAKLQkJCQkJaWYgKGNhbS0+c2Vuc29yLnBpeF9mb3JtYXQucGl4ZWxmb3JtYXQKLQkJCQkJICAgID09IFY0TDJfUElYX0ZNVF9KUEVHKQotCQkJCQkJc245YzEwMl93cml0ZV9lb2ltYXJrZXIoY2FtLAotCQkJCQkJCQkJKCpmKSk7Ci0KIAkJCQkJYiA9ICgqZiktPmJ1Zi5ieXRlc3VzZWQ7CiAJCQkJCSgqZiktPnN0YXRlID0gRl9ET05FOwogCQkJCQkoKmYpLT5idWYuc2VxdWVuY2U9ICsrY2FtLT5mcmFtZV9jb3VudDsKQEAgLTc0MSw3ICs3ODMsNyBAQAogCQkJCQlzcGluX3VubG9jaygmY2FtLT5xdWV1ZV9sb2NrKTsKIAogCQkJCQltZW1jcHkoY2FtLT5zeXNmcy5mcmFtZV9oZWFkZXIsCi0JCQkJCSAgICAgICBjYW0tPnNvZl9oZWFkZXIsIHNvZmxlbik7CisJCQkJCSAgICAgICBjYW0tPnNvZi5oZWFkZXIsIHNvZmxlbik7CiAKIAkJCQkJREJHKDMsICJWaWRlbyBmcmFtZSBjYXB0dXJlZDogJWx1ICIKIAkJCQkJICAgICAgICJieXRlcyIsICh1bnNpZ25lZCBsb25nKShiKSk7CkBAIC03OTEsNyArODMzLDEzIEBACiAJCQkJICAgIFY0TDJfUElYX0ZNVF9TTjlDMTBYIHx8CiAJCQkJICAgIGNhbS0+c2Vuc29yLnBpeF9mb3JtYXQucGl4ZWxmb3JtYXQgPT0KIAkJCQkgICAgVjRMMl9QSVhfRk1UX0pQRUcpIHsKLQkJCQkJZW9mID0gc29mIC0gc29mbGVuOworCQkJCQlpZiAoc29mIC0gcG9zID49IHNvZmxlbikgeworCQkJCQkJZW9mID0gc29mIC0gc29mbGVuOworCQkJCQl9IGVsc2UgeyAvKiByZW1vdmUgaGVhZGVyICovCisJCQkJCQllb2YgPSBwb3M7CisJCQkJCQkoKmYpLT5idWYuYnl0ZXN1c2VkIC09CisJCQkJCQkJKHNvZmxlbiAtIChzb2YgLSBwb3MpKTsKKwkJCQkJfQogCQkJCQlnb3RvIGVuZF9vZl9mcmFtZTsKIAkJCQl9IGVsc2UgewogCQkJCQlEQkcoMywgIlNPRiBiZWZvcmUgZXhwZWN0ZWQgRU9GIGFmdGVyICIKQEAgLTg3OCw2ICs5MjYsNyBAQAogCX0KIAogCWNhbS0+ZnJhbWVfY3VycmVudCA9IE5VTEw7CisJY2FtLT5zb2YuYnl0ZXNyZWFkID0gMDsKIAogCWZvciAoaSA9IDA7IGkgPCBTTjlDMTAyX1VSQlM7IGkrKykgewogCQllcnIgPSB1c2Jfc3VibWl0X3VyYihjYW0tPnVyYltpXSwgR0ZQX0tFUk5FTCk7CkBAIC05NTksOSArMTAwOCw5IEBACiAKIAlpZiAobGVuIDwgNikgewogCQlzdHJuY3B5KHN0ciwgYnVmZiwgbGVuKTsKLQkJc3RyW2xlbisxXSA9ICdcMCc7CisJCXN0cltsZW5dID0gJ1wwJzsKIAl9IGVsc2UgewotCQlzdHJuY3B5KHN0ciwgYnVmZiwgNCk7CisJCXN0cm5jcHkoc3RyLCBidWZmLCA2KTsKIAkJc3RyWzZdID0gJ1wwJzsKIAl9CiAKQEAgLTEwNjIsNyArMTExMSw3IEBACiAKIAljb3VudCA9IHNwcmludGYoYnVmLCAiJWRcbiIsIHZhbCk7CiAKLQlEQkcoMywgIlJlYWQgYnl0ZXM6ICV6ZCIsIGNvdW50KTsKKwlEQkcoMywgIlJlYWQgYnl0ZXM6ICV6ZCwgdmFsdWU6ICVkIiwgY291bnQsIHZhbCk7CiAKIAltdXRleF91bmxvY2soJnNuOWMxMDJfc3lzZnNfbG9jayk7CiAKQEAgLTExOTcsNyArMTI0Niw3IEBACiAKIAljb3VudCA9IHNwcmludGYoYnVmLCAiJWRcbiIsIHZhbCk7CiAKLQlEQkcoMywgIlJlYWQgYnl0ZXM6ICV6ZCIsIGNvdW50KTsKKwlEQkcoMywgIlJlYWQgYnl0ZXM6ICV6ZCwgdmFsdWU6ICVkIiwgY291bnQsIHZhbCk7CiAKIAltdXRleF91bmxvY2soJnNuOWMxMDJfc3lzZnNfbG9jayk7CiAKQEAgLTEzNzEsMzUgKzE0MjAsMzUgQEAKIAogc3RhdGljIGludCBzbjljMTAyX2NyZWF0ZV9zeXNmcyhzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSkKIHsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2NGxkZXYgPSBjYW0tPnY0bGRldjsKKwlzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc2RldiA9ICYoY2FtLT52NGxkZXYtPmNsYXNzX2Rldik7CiAJaW50IGVyciA9IDA7CiAKLQlpZiAoKGVyciA9IHZpZGVvX2RldmljZV9jcmVhdGVfZmlsZSh2NGxkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9yZWcpKSkKKwlpZiAoKGVyciA9IGNsYXNzX2RldmljZV9jcmVhdGVfZmlsZShjbGFzc2RldiwgJmNsYXNzX2RldmljZV9hdHRyX3JlZykpKQogCQlnb3RvIGVycl9vdXQ7Ci0JaWYgKChlcnIgPSB2aWRlb19kZXZpY2VfY3JlYXRlX2ZpbGUodjRsZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfdmFsKSkpCisJaWYgKChlcnIgPSBjbGFzc19kZXZpY2VfY3JlYXRlX2ZpbGUoY2xhc3NkZXYsICZjbGFzc19kZXZpY2VfYXR0cl92YWwpKSkKIAkJZ290byBlcnJfcmVnOwotCWlmICgoZXJyID0gdmlkZW9fZGV2aWNlX2NyZWF0ZV9maWxlKHY0bGRldiwKKwlpZiAoKGVyciA9IGNsYXNzX2RldmljZV9jcmVhdGVfZmlsZShjbGFzc2RldiwKIAkJCQkJICAgICZjbGFzc19kZXZpY2VfYXR0cl9mcmFtZV9oZWFkZXIpKSkKIAkJZ290byBlcnJfdmFsOwogCiAJaWYgKGNhbS0+c2Vuc29yLnN5c2ZzX29wcykgewotCQlpZiAoKGVyciA9IHZpZGVvX2RldmljZV9jcmVhdGVfZmlsZSh2NGxkZXYsCisJCWlmICgoZXJyID0gY2xhc3NfZGV2aWNlX2NyZWF0ZV9maWxlKGNsYXNzZGV2LAogCQkJCQkJICAmY2xhc3NfZGV2aWNlX2F0dHJfaTJjX3JlZykpKQogCQkJZ290byBlcnJfZnJhbWVfaGVhZGVyOwotCQlpZiAoKGVyciA9IHZpZGVvX2RldmljZV9jcmVhdGVfZmlsZSh2NGxkZXYsCisJCWlmICgoZXJyID0gY2xhc3NfZGV2aWNlX2NyZWF0ZV9maWxlKGNsYXNzZGV2LAogCQkJCQkJICAmY2xhc3NfZGV2aWNlX2F0dHJfaTJjX3ZhbCkpKQogCQkJZ290byBlcnJfaTJjX3JlZzsKIAl9CiAKIAlpZiAoY2FtLT5icmlkZ2UgPT0gQlJJREdFX1NOOUMxMDEgfHwgY2FtLT5icmlkZ2UgPT0gQlJJREdFX1NOOUMxMDIpIHsKLQkJaWYgKChlcnIgPSB2aWRlb19kZXZpY2VfY3JlYXRlX2ZpbGUodjRsZGV2LAorCQlpZiAoKGVyciA9IGNsYXNzX2RldmljZV9jcmVhdGVfZmlsZShjbGFzc2RldiwKIAkJCQkJCSAgICAmY2xhc3NfZGV2aWNlX2F0dHJfZ3JlZW4pKSkKIAkJCWdvdG8gZXJyX2kyY192YWw7CiAJfSBlbHNlIHsKLQkJaWYgKChlcnIgPSB2aWRlb19kZXZpY2VfY3JlYXRlX2ZpbGUodjRsZGV2LAorCQlpZiAoKGVyciA9IGNsYXNzX2RldmljZV9jcmVhdGVfZmlsZShjbGFzc2RldiwKIAkJCQkJCSAgICAmY2xhc3NfZGV2aWNlX2F0dHJfYmx1ZSkpKQogCQkJZ290byBlcnJfaTJjX3ZhbDsKLQkJaWYgKChlcnIgPSB2aWRlb19kZXZpY2VfY3JlYXRlX2ZpbGUodjRsZGV2LAorCQlpZiAoKGVyciA9IGNsYXNzX2RldmljZV9jcmVhdGVfZmlsZShjbGFzc2RldiwKIAkJCQkJCSAgICAmY2xhc3NfZGV2aWNlX2F0dHJfcmVkKSkpCiAJCQlnb3RvIGVycl9ibHVlOwogCX0KQEAgLTE0MDcsMTkgKzE0NTYsMTkgQEAKIAlyZXR1cm4gMDsKIAogZXJyX2JsdWU6Ci0JdmlkZW9fZGV2aWNlX3JlbW92ZV9maWxlKHY0bGRldiwgJmNsYXNzX2RldmljZV9hdHRyX2JsdWUpOworCWNsYXNzX2RldmljZV9yZW1vdmVfZmlsZShjbGFzc2RldiwgJmNsYXNzX2RldmljZV9hdHRyX2JsdWUpOwogZXJyX2kyY192YWw6CiAJaWYgKGNhbS0+c2Vuc29yLnN5c2ZzX29wcykKLQkJdmlkZW9fZGV2aWNlX3JlbW92ZV9maWxlKHY0bGRldiwgJmNsYXNzX2RldmljZV9hdHRyX2kyY192YWwpOworCQljbGFzc19kZXZpY2VfcmVtb3ZlX2ZpbGUoY2xhc3NkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9pMmNfdmFsKTsKIGVycl9pMmNfcmVnOgogCWlmIChjYW0tPnNlbnNvci5zeXNmc19vcHMpCi0JCXZpZGVvX2RldmljZV9yZW1vdmVfZmlsZSh2NGxkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9pMmNfcmVnKTsKKwkJY2xhc3NfZGV2aWNlX3JlbW92ZV9maWxlKGNsYXNzZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfaTJjX3JlZyk7CiBlcnJfZnJhbWVfaGVhZGVyOgotCXZpZGVvX2RldmljZV9yZW1vdmVfZmlsZSh2NGxkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9mcmFtZV9oZWFkZXIpOworCWNsYXNzX2RldmljZV9yZW1vdmVfZmlsZShjbGFzc2RldiwgJmNsYXNzX2RldmljZV9hdHRyX2ZyYW1lX2hlYWRlcik7CiBlcnJfdmFsOgotCXZpZGVvX2RldmljZV9yZW1vdmVfZmlsZSh2NGxkZXYsICZjbGFzc19kZXZpY2VfYXR0cl92YWwpOworCWNsYXNzX2RldmljZV9yZW1vdmVfZmlsZShjbGFzc2RldiwgJmNsYXNzX2RldmljZV9hdHRyX3ZhbCk7CiBlcnJfcmVnOgotCXZpZGVvX2RldmljZV9yZW1vdmVfZmlsZSh2NGxkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9yZWcpOworCWNsYXNzX2RldmljZV9yZW1vdmVfZmlsZShjbGFzc2RldiwgJmNsYXNzX2RldmljZV9hdHRyX3JlZyk7CiBlcnJfb3V0OgogCXJldHVybiBlcnI7CiB9CkBAIC0xNDc3LDEwICsxNTI2LDEwIEBACiAJY2FzZSBCUklER0VfU045QzEwMToKIAljYXNlIEJSSURHRV9TTjlDMTAyOgogCWNhc2UgQlJJREdFX1NOOUMxMDM6Ci0JaWYgKGNvbXByZXNzaW9uLT5xdWFsaXR5ID09IDApCisJCWlmIChjb21wcmVzc2lvbi0+cXVhbGl0eSA9PSAwKQogCQkJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgY2FtLT5yZWdbMHgxN10gfCAweDAxLAogCQkJCQkJIDB4MTcpOwotCWVsc2UgaWYgKGNvbXByZXNzaW9uLT5xdWFsaXR5ID09IDEpCisJCWVsc2UgaWYgKGNvbXByZXNzaW9uLT5xdWFsaXR5ID09IDEpCiAJCQllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCBjYW0tPnJlZ1sweDE3XSAmIDB4ZmUsCiAJCQkJCQkgMHgxNyk7CiAJCWJyZWFrOwpAQCAtMTQ4OSwxMCArMTUzOCwxMCBAQAogCQlpZiAoY29tcHJlc3Npb24tPnF1YWxpdHkgPT0gMCkgewogCQkJZm9yIChpID0gMDsgaSA8PSA2MzsgaSsrKSB7CiAJCQkJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwKLQkJCQkJCQkgU045QzEwMl9ZX1FUQUJMRTBbaV0sCisJCQkJCQkJIFNOOUMxMDJfWV9RVEFCTEUxW2ldLAogCQkJCQkJCSAweDEwMCArIGkpOwogCQkJCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sCi0JCQkJCQkJIFNOOUMxMDJfVVZfUVRBQkxFMFtpXSwKKwkJCQkJCQkgU045QzEwMl9VVl9RVEFCTEUxW2ldLAogCQkJCQkJCSAweDE0MCArIGkpOwogCQkJfQogCQkJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgY2FtLT5yZWdbMHgxOF0gJiAweGJmLApAQCAtMTU5Nyw5ICsxNjQ2LDEzIEBACiAJCWlmIChjYW0tPmJyaWRnZSA9PSBCUklER0VfU045QzEwMSB8fAogCQkgICAgY2FtLT5icmlkZ2UgPT0gQlJJREdFX1NOOUMxMDIgfHwKIAkJICAgIGNhbS0+YnJpZGdlID09IEJSSURHRV9TTjlDMTAzKSB7CisJCQlpZiAocy0+cGl4X2Zvcm1hdC5waXhlbGZvcm1hdCA9PSBWNEwyX1BJWF9GTVRfSlBFRykKKwkJCQlzLT5waXhfZm9ybWF0LnBpeGVsZm9ybWF0PSBWNEwyX1BJWF9GTVRfU0JHR1I4OwogCQkJY2FtLT5jb21wcmVzc2lvbi5xdWFsaXR5ID0gIGNhbS0+cmVnWzB4MTddICYgMHgwMSA/CiAJCQkJCQkgICAgMCA6IDE7CiAJCX0gZWxzZSB7CisJCQlpZiAocy0+cGl4X2Zvcm1hdC5waXhlbGZvcm1hdCA9PSBWNEwyX1BJWF9GTVRfU045QzEwWCkKKwkJCQlzLT5waXhfZm9ybWF0LnBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX0pQRUc7CiAJCQljYW0tPmNvbXByZXNzaW9uLnF1YWxpdHkgPSAgY2FtLT5yZWdbMHgxOF0gJiAweDQwID8KIAkJCQkJCSAgICAwIDogMTsKIAkJCWVyciArPSBzbjljMTAyX3NldF9jb21wcmVzc2lvbihjYW0sICZjYW0tPmNvbXByZXNzaW9uKTsKQEAgLTE4MDUsNyArMTg1OCw3IEBACiAJCURCRygzLCAiQ2xvc2UgYW5kIG9wZW4gdGhlIGRldmljZSBhZ2FpbiB0byBjaG9vc2UgIgogCQkgICAgICAgInRoZSByZWFkIG1ldGhvZCIpOwogCQltdXRleF91bmxvY2soJmNhbS0+ZmlsZW9wX211dGV4KTsKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiAtRUJVU1k7CiAJfQogCiAJaWYgKGNhbS0+aW8gPT0gSU9fTk9ORSkgewpAQCAtMTg0NSwxNiArMTg5OCwxNiBAQAogCQkJCXJldHVybiBlcnI7CiAJCQl9CiAJCX0gZWxzZSB7Ci0JCXRpbWVvdXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dAotCQkJICAoIGNhbS0+d2FpdF9mcmFtZSwKLQkJCSAgICAoIWxpc3RfZW1wdHkoJmNhbS0+b3V0cXVldWUpKSB8fAotCQkJICAgIChjYW0tPnN0YXRlICYgREVWX0RJU0NPTk5FQ1RFRCkgfHwKLQkJCSAgICAoY2FtLT5zdGF0ZSAmIERFVl9NSVNDT05GSUdVUkVEKSwKLQkJCSAgICBjYW0tPm1vZHVsZV9wYXJhbS5mcmFtZV90aW1lb3V0ICoKLQkJCSAgICAxMDAwICogbXNlY3NfdG9famlmZmllcygxKSApOwotCQlpZiAodGltZW91dCA8IDApIHsKLQkJCW11dGV4X3VubG9jaygmY2FtLT5maWxlb3BfbXV0ZXgpOwotCQkJcmV0dXJuIHRpbWVvdXQ7CisJCQl0aW1lb3V0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQKKwkJCQkgICggY2FtLT53YWl0X2ZyYW1lLAorCQkJCSAgICAoIWxpc3RfZW1wdHkoJmNhbS0+b3V0cXVldWUpKSB8fAorCQkJCSAgICAoY2FtLT5zdGF0ZSAmIERFVl9ESVNDT05ORUNURUQpIHx8CisJCQkJICAgIChjYW0tPnN0YXRlICYgREVWX01JU0NPTkZJR1VSRUQpLAorCQkJCSAgICBjYW0tPm1vZHVsZV9wYXJhbS5mcmFtZV90aW1lb3V0ICoKKwkJCQkgICAgMTAwMCAqIG1zZWNzX3RvX2ppZmZpZXMoMSkgKTsKKwkJCWlmICh0aW1lb3V0IDwgMCkgeworCQkJCW11dGV4X3VubG9jaygmY2FtLT5maWxlb3BfbXV0ZXgpOworCQkJCXJldHVybiB0aW1lb3V0OwogCQkJfSBlbHNlIGlmICh0aW1lb3V0ID09IDAgJiYKIAkJCQkgICAhKGNhbS0+c3RhdGUgJiBERVZfRElTQ09OTkVDVEVEKSkgewogCQkJCURCRygxLCAiVmlkZW8gZnJhbWUgdGltZW91dCBlbGFwc2VkIik7CkBAIC0yMDAxLDcgKzIwNTQsMTIgQEAKIAkJcmV0dXJuIC1FSU87CiAJfQogCi0JaWYgKGNhbS0+aW8gIT0gSU9fTU1BUCB8fCAhKHZtYS0+dm1fZmxhZ3MgJiBWTV9XUklURSkgfHwKKwlpZiAoISh2bWEtPnZtX2ZsYWdzICYgKFZNX1dSSVRFIHwgVk1fUkVBRCkpKSB7CisJCW11dGV4X3VubG9jaygmY2FtLT5maWxlb3BfbXV0ZXgpOworCQlyZXR1cm4gLUVBQ0NFUzsKKwl9CisKKwlpZiAoY2FtLT5pbyAhPSBJT19NTUFQIHx8CiAJICAgIHNpemUgIT0gUEFHRV9BTElHTihjYW0tPmZyYW1lWzBdLmJ1Zi5sZW5ndGgpKSB7CiAJCW11dGV4X3VubG9jaygmY2FtLT5maWxlb3BfbXV0ZXgpOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTIyNjcsNyArMjMyNSw3IEBACiAJCQlpZiAoY2FtLT5mcmFtZVtpXS52bWFfdXNlX2NvdW50KSB7CiAJCQkJREJHKDMsICJWSURJT0NfU19DUk9QIGZhaWxlZC4gIgogCQkJCSAgICAgICAiVW5tYXAgdGhlIGJ1ZmZlcnMgZmlyc3QuIik7Ci0JCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJcmV0dXJuIC1FQlVTWTsKIAkJCX0KIAogCS8qIFByZXNlcnZlIFIsRyBvciBCIG9yaWdpbiAqLwpAQCAtMjQxMCw4ICsyNDY4LDggQEAKIAkJY2FzZSBCUklER0VfU045QzEwMToKIAkJY2FzZSBCUklER0VfU045QzEwMjoKIAkJY2FzZSBCUklER0VfU045QzEwMzoKLQkJc3RyY3B5KGZtdGQuZGVzY3JpcHRpb24sICJjb21wcmVzc2VkIik7Ci0JCWZtdGQucGl4ZWxmb3JtYXQgPSBWNEwyX1BJWF9GTVRfU045QzEwWDsKKwkJCXN0cmNweShmbXRkLmRlc2NyaXB0aW9uLCAiY29tcHJlc3NlZCIpOworCQkJZm10ZC5waXhlbGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9TTjlDMTBYOwogCQkJYnJlYWs7CiAJCWNhc2UgQlJJREdFX1NOOUMxMDU6CiAJCWNhc2UgQlJJREdFX1NOOUMxMjA6CkBAIC0yNDQ1LDggKzI1MDMsMTAgQEAKIAlpZiAoZm9ybWF0LnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXBmbXQtPmJ5dGVzcGVybGluZSA9IChwZm10LT5waXhlbGZvcm1hdD09VjRMMl9QSVhfRk1UX1NOOUMxMFggfHwKLQkJCSAgICAgIHBmbXQtPnBpeGVsZm9ybWF0PT1WNEwyX1BJWF9GTVRfSlBFRykKKwlwZm10LT5jb2xvcnNwYWNlID0gKHBmbXQtPnBpeGVsZm9ybWF0ID09IFY0TDJfUElYX0ZNVF9KUEVHKSA/CisJCQkgICBWNEwyX0NPTE9SU1BBQ0VfSlBFRyA6IFY0TDJfQ09MT1JTUEFDRV9TUkdCOworCXBmbXQtPmJ5dGVzcGVybGluZSA9IChwZm10LT5waXhlbGZvcm1hdCA9PSBWNEwyX1BJWF9GTVRfU045QzEwWCB8fAorCQkJICAgICAgcGZtdC0+cGl4ZWxmb3JtYXQgPT0gVjRMMl9QSVhfRk1UX0pQRUcpCiAJCQkgICAgID8gMCA6IChwZm10LT53aWR0aCAqIHBmbXQtPnByaXYpIC8gODsKIAlwZm10LT5zaXplaW1hZ2UgPSBwZm10LT5oZWlnaHQgKiAoKHBmbXQtPndpZHRoKnBmbXQtPnByaXYpLzgpOwogCXBmbXQtPmZpZWxkID0gVjRMMl9GSUVMRF9OT05FOwpAQCAtMjUyMSw5ICsyNTgxLDkgQEAKIAljYXNlIEJSSURHRV9TTjlDMTAxOgogCWNhc2UgQlJJREdFX1NOOUMxMDI6CiAJY2FzZSBCUklER0VfU045QzEwMzoKLQlpZiAocGl4LT5waXhlbGZvcm1hdCAhPSBWNEwyX1BJWF9GTVRfU045QzEwWCAmJgotCSAgICBwaXgtPnBpeGVsZm9ybWF0ICE9IFY0TDJfUElYX0ZNVF9TQkdHUjgpCi0JCXBpeC0+cGl4ZWxmb3JtYXQgPSBwZm10LT5waXhlbGZvcm1hdDsKKwkJaWYgKHBpeC0+cGl4ZWxmb3JtYXQgIT0gVjRMMl9QSVhfRk1UX1NOOUMxMFggJiYKKwkJICAgIHBpeC0+cGl4ZWxmb3JtYXQgIT0gVjRMMl9QSVhfRk1UX1NCR0dSOCkKKwkJCXBpeC0+cGl4ZWxmb3JtYXQgPSBwZm10LT5waXhlbGZvcm1hdDsKIAkJYnJlYWs7CiAJY2FzZSBCUklER0VfU045QzEwNToKIAljYXNlIEJSSURHRV9TTjlDMTIwOgpAQCAtMjUzMyw3ICsyNTkzLDggQEAKIAkJYnJlYWs7CiAJfQogCXBpeC0+cHJpdiA9IHBmbXQtPnByaXY7IC8qIGJwcCAqLwotCXBpeC0+Y29sb3JzcGFjZSA9IHBmbXQtPmNvbG9yc3BhY2U7CisJcGl4LT5jb2xvcnNwYWNlID0gKHBpeC0+cGl4ZWxmb3JtYXQgPT0gVjRMMl9QSVhfRk1UX0pQRUcpID8KKwkJCSAgVjRMMl9DT0xPUlNQQUNFX0pQRUcgOiBWNEwyX0NPTE9SU1BBQ0VfU1JHQjsKIAlwaXgtPmJ5dGVzcGVybGluZSA9IChwaXgtPnBpeGVsZm9ybWF0ID09IFY0TDJfUElYX0ZNVF9TTjlDMTBYIHx8CiAJCQkgICAgIHBpeC0+cGl4ZWxmb3JtYXQgPT0gVjRMMl9QSVhfRk1UX0pQRUcpCiAJCQkgICAgPyAwIDogKHBpeC0+d2lkdGggKiBwaXgtPnByaXYpIC8gODsKQEAgLTI1NTEsNyArMjYxMiw3IEBACiAJCQlpZiAoY2FtLT5mcmFtZVtpXS52bWFfdXNlX2NvdW50KSB7CiAJCQkJREJHKDMsICJWSURJT0NfU19GTVQgZmFpbGVkLiBVbm1hcCB0aGUgIgogCQkJCSAgICAgICAiYnVmZmVycyBmaXJzdC4iKTsKLQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQlyZXR1cm4gLUVCVVNZOwogCQkJfQogCiAJaWYgKGNhbS0+c3RyZWFtID09IFNUUkVBTV9PTikKQEAgLTI2NjYsMTQgKzI3MjcsMTQgQEAKIAlpZiAoY2FtLT5pbyA9PSBJT19SRUFEKSB7CiAJCURCRygzLCAiQ2xvc2UgYW5kIG9wZW4gdGhlIGRldmljZSBhZ2FpbiB0byBjaG9vc2UgdGhlIG1tYXAgIgogCQkgICAgICAgIkkvTyBtZXRob2QiKTsKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiAtRUJVU1k7CiAJfQogCiAJZm9yIChpID0gMDsgaSA8IGNhbS0+bmJ1ZmZlcnM7IGkrKykKIAkJaWYgKGNhbS0+ZnJhbWVbaV0udm1hX3VzZV9jb3VudCkgewogCQkJREJHKDMsICJWSURJT0NfUkVRQlVGUyBmYWlsZWQuIFByZXZpb3VzIGJ1ZmZlcnMgYXJlICIKIAkJCSAgICAgICAic3RpbGwgbWFwcGVkLiIpOwotCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlyZXR1cm4gLUVCVVNZOwogCQl9CiAKIAlpZiAoY2FtLT5zdHJlYW0gPT0gU1RSRUFNX09OKQpAQCAtMjc4NSwxNSArMjg0NiwxNSBAQAogCQkJaWYgKGVycikKIAkJCQlyZXR1cm4gZXJyOwogCQl9IGVsc2UgewotCQl0aW1lb3V0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQKLQkJCSAgKCBjYW0tPndhaXRfZnJhbWUsCi0JCQkgICAgKCFsaXN0X2VtcHR5KCZjYW0tPm91dHF1ZXVlKSkgfHwKLQkJCSAgICAoY2FtLT5zdGF0ZSAmIERFVl9ESVNDT05ORUNURUQpIHx8Ci0JCQkgICAgKGNhbS0+c3RhdGUgJiBERVZfTUlTQ09ORklHVVJFRCksCi0JCQkgICAgY2FtLT5tb2R1bGVfcGFyYW0uZnJhbWVfdGltZW91dCAqCi0JCQkgICAgMTAwMCAqIG1zZWNzX3RvX2ppZmZpZXMoMSkgKTsKLQkJaWYgKHRpbWVvdXQgPCAwKQotCQkJcmV0dXJuIHRpbWVvdXQ7CisJCQl0aW1lb3V0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQKKwkJCQkgICggY2FtLT53YWl0X2ZyYW1lLAorCQkJCSAgICAoIWxpc3RfZW1wdHkoJmNhbS0+b3V0cXVldWUpKSB8fAorCQkJCSAgICAoY2FtLT5zdGF0ZSAmIERFVl9ESVNDT05ORUNURUQpIHx8CisJCQkJICAgIChjYW0tPnN0YXRlICYgREVWX01JU0NPTkZJR1VSRUQpLAorCQkJCSAgICBjYW0tPm1vZHVsZV9wYXJhbS5mcmFtZV90aW1lb3V0ICoKKwkJCQkgICAgMTAwMCAqIG1zZWNzX3RvX2ppZmZpZXMoMSkgKTsKKwkJCWlmICh0aW1lb3V0IDwgMCkKKwkJCQlyZXR1cm4gdGltZW91dDsKIAkJCWVsc2UgaWYgKHRpbWVvdXQgPT0gMCAmJgogCQkJCSAhKGNhbS0+c3RhdGUgJiBERVZfRElTQ09OTkVDVEVEKSkgewogCQkJCURCRygxLCAiVmlkZW8gZnJhbWUgdGltZW91dCBlbGFwc2VkIik7CkBAIC0yODM3LDkgKzI4OTgsNiBAQAogCWlmICh0eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSB8fCBjYW0tPmlvICE9IElPX01NQVApCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKGxpc3RfZW1wdHkoJmNhbS0+aW5xdWV1ZSkpCi0JCXJldHVybiAtRUlOVkFMOwotCiAJY2FtLT5zdHJlYW0gPSBTVFJFQU1fT047CiAKIAlEQkcoMywgIlN0cmVhbSBvbiIpOwpAQCAtMzE2Niw4ICszMjI0LDggQEAKIAogCXIgPSBzbjljMTAyX3JlYWRfcmVnKGNhbSwgMHgwMCk7CiAJaWYgKHIgPCAwIHx8IChyICE9IDB4MTAgJiYgciAhPSAweDExICYmIHIgIT0gMHgxMikpIHsKLQkJREJHKDEsICJTb3JyeSwgdGhpcyBpcyBub3QgYSBTTjlDMXh4IGJhc2VkIGNhbWVyYSAiCi0JCSAgICAgICAiKHZpZC9waWQgMHglMDRYOjB4JTA0WCkiLCBpZC0+aWRWZW5kb3IsIGlkLT5pZFByb2R1Y3QpOworCQlEQkcoMSwgIlNvcnJ5LCB0aGlzIGlzIG5vdCBhIFNOOUMxeHgtYmFzZWQgY2FtZXJhICIKKwkJICAgICAgICIodmlkOnBpZCAweCUwNFg6MHglMDRYKSIsIGlkLT5pZFZlbmRvciwgaWQtPmlkUHJvZHVjdCk7CiAJCWVyciA9IC1FTk9ERVY7CiAJCWdvdG8gZmFpbDsKIAl9CkBAIC0zMTc3LDE5ICszMjM1LDE5IEBACiAJY2FzZSBCUklER0VfU045QzEwMToKIAljYXNlIEJSSURHRV9TTjlDMTAyOgogCQlEQkcoMiwgIlNOOUMxMFsxMl0gUEMgQ2FtZXJhIENvbnRyb2xsZXIgZGV0ZWN0ZWQgIgotCQkgICAgICAgIih2aWQvcGlkIDB4JTA0WDoweCUwNFgpIiwgaWQtPmlkVmVuZG9yLCBpZC0+aWRQcm9kdWN0KTsKKwkJICAgICAgICIodmlkOnBpZCAweCUwNFg6MHglMDRYKSIsIGlkLT5pZFZlbmRvciwgaWQtPmlkUHJvZHVjdCk7CiAJCWJyZWFrOwogCWNhc2UgQlJJREdFX1NOOUMxMDM6CiAJCURCRygyLCAiU045QzEwMyBQQyBDYW1lcmEgQ29udHJvbGxlciBkZXRlY3RlZCAiCi0JCSAgICAgICAiKHZpZC9waWQgMHglMDRYOjB4JTA0WCkiLCBpZC0+aWRWZW5kb3IsIGlkLT5pZFByb2R1Y3QpOworCQkgICAgICAgIih2aWQ6cGlkIDB4JTA0WDoweCUwNFgpIiwgaWQtPmlkVmVuZG9yLCBpZC0+aWRQcm9kdWN0KTsKIAkJYnJlYWs7CiAJY2FzZSBCUklER0VfU045QzEwNToKIAkJREJHKDIsICJTTjlDMTA1IFBDIENhbWVyYSBDb250cm9sbGVyIGRldGVjdGVkICIKLQkJICAgICAgICIodmlkL3BpZCAweCUwNFg6MHglMDRYKSIsIGlkLT5pZFZlbmRvciwgaWQtPmlkUHJvZHVjdCk7CisJCSAgICAgICAiKHZpZDpwaWQgMHglMDRYOjB4JTA0WCkiLCBpZC0+aWRWZW5kb3IsIGlkLT5pZFByb2R1Y3QpOwogCQlicmVhazsKIAljYXNlIEJSSURHRV9TTjlDMTIwOgogCQlEQkcoMiwgIlNOOUMxMjAgUEMgQ2FtZXJhIENvbnRyb2xsZXIgZGV0ZWN0ZWQgIgotCQkgICAgICAgIih2aWQvcGlkIDB4JTA0WDoweCUwNFgpIiwgaWQtPmlkVmVuZG9yLCBpZC0+aWRQcm9kdWN0KTsKKwkJICAgICAgICIodmlkOnBpZCAweCUwNFg6MHglMDRYKSIsIGlkLT5pZFZlbmRvciwgaWQtPmlkUHJvZHVjdCk7CiAJCWJyZWFrOwogCX0KIApAQCAtMzI2MCw2ICszMzE4LDggQEAKIAkJICAgICAgICJkZXZpY2UgY29udHJvbGxpbmcuIEVycm9yICMlZCIsIGVycik7CiAjZWxzZQogCURCRygyLCAiT3B0aW9uYWwgZGV2aWNlIGNvbnRyb2wgdGhyb3VnaCAnc3lzZnMnIGludGVyZmFjZSBkaXNhYmxlZCIpOworCURCRygzLCAiQ29tcGlsZSB0aGUga2VybmVsIHdpdGggdGhlICdDT05GSUdfVklERU9fQURWX0RFQlVHJyAiCisJICAgICAgICJjb25maWd1cmF0aW9uIG9wdGlvbiB0byBlbmFibGUgaXQuIik7CiAjZW5kaWYKIAogCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgY2FtKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX2RldnRhYmxlLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvc245YzEwMl9kZXZ0YWJsZS5oCmluZGV4IDNhNjgyZWMuLmY0OWJkOGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX2RldnRhYmxlLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zbjljMTAyL3NuOWMxMDJfZGV2dGFibGUuaApAQCAtODksMTYgKzg5LDIyIEBACiAJeyBTTjlDMTAyX1VTQl9ERVZJQ0UoMHgwNDcxLCAweDAzMjcsIEJSSURHRV9TTjlDMTA1KSwgfSwKIAl7IFNOOUMxMDJfVVNCX0RFVklDRSgweDA0NzEsIDB4MDMyOCwgQlJJREdFX1NOOUMxMDUpLCB9LAogCXsgU045QzEwMl9VU0JfREVWSUNFKDB4MGM0NSwgMHg2MGMwLCBCUklER0VfU045QzEwNSksIH0sCisJeyBTTjlDMTAyX1VTQl9ERVZJQ0UoMHgwYzQ1LCAweDYwYzIsIEJSSURHRV9TTjlDMTA1KSwgfSwKIAl7IFNOOUMxMDJfVVNCX0RFVklDRSgweDBjNDUsIDB4NjBjOCwgQlJJREdFX1NOOUMxMDUpLCB9LAogCXsgU045QzEwMl9VU0JfREVWSUNFKDB4MGM0NSwgMHg2MGNjLCBCUklER0VfU045QzEwNSksIH0sCiAJeyBTTjlDMTAyX1VTQl9ERVZJQ0UoMHgwYzQ1LCAweDYwZWEsIEJSSURHRV9TTjlDMTA1KSwgfSwKIAl7IFNOOUMxMDJfVVNCX0RFVklDRSgweDBjNDUsIDB4NjBlYywgQlJJREdFX1NOOUMxMDUpLCB9LAorCXsgU045QzEwMl9VU0JfREVWSUNFKDB4MGM0NSwgMHg2MGVmLCBCUklER0VfU045QzEwNSksIH0sCiAJeyBTTjlDMTAyX1VTQl9ERVZJQ0UoMHgwYzQ1LCAweDYwZmEsIEJSSURHRV9TTjlDMTA1KSwgfSwKIAl7IFNOOUMxMDJfVVNCX0RFVklDRSgweDBjNDUsIDB4NjBmYiwgQlJJREdFX1NOOUMxMDUpLCB9LAogCXsgU045QzEwMl9VU0JfREVWSUNFKDB4MGM0NSwgMHg2MGZjLCBCUklER0VfU045QzEwNSksIH0sCiAJeyBTTjlDMTAyX1VTQl9ERVZJQ0UoMHgwYzQ1LCAweDYwZmUsIEJSSURHRV9TTjlDMTA1KSwgfSwKIAkvKiBTTjlDMTIwICovCisJeyBTTjlDMTAyX1VTQl9ERVZJQ0UoMHgwYzQ1LCAweDYxMDIsIEJSSURHRV9TTjlDMTIwKSwgfSwKKwl7IFNOOUMxMDJfVVNCX0RFVklDRSgweDBjNDUsIDB4NjEwOCwgQlJJREdFX1NOOUMxMjApLCB9LAorCXsgU045QzEwMl9VU0JfREVWSUNFKDB4MGM0NSwgMHg2MTBmLCBCUklER0VfU045QzEyMCksIH0sCiAJeyBTTjlDMTAyX1VTQl9ERVZJQ0UoMHgwYzQ1LCAweDYxMzAsIEJSSURHRV9TTjlDMTIwKSwgfSwKKwl7IFNOOUMxMDJfVVNCX0RFVklDRSgweDBjNDUsIDB4NjEzOCwgQlJJREdFX1NOOUMxMjApLCB9LAogCXsgU045QzEwMl9VU0JfREVWSUNFKDB4MGM0NSwgMHg2MTNhLCBCUklER0VfU045QzEyMCksIH0sCiAJeyBTTjlDMTAyX1VTQl9ERVZJQ0UoMHgwYzQ1LCAweDYxM2IsIEJSSURHRV9TTjlDMTIwKSwgfSwKIAl7IFNOOUMxMDJfVVNCX0RFVklDRSgweDBjNDUsIDB4NjEzYywgQlJJREdFX1NOOUMxMjApLCB9LApAQCAtMTE0LDEyICsxMjAsMTUgQEAKICAgIEZ1bmN0aW9ucyBtdXN0IHJldHVybiAwIG9uIHN1Y2Nlc3MsIHRoZSBhcHByb3ByaWF0ZSBlcnJvciBvdGhlcndpc2UuCiAqLwogZXh0ZXJuIGludCBzbjljMTAyX3Byb2JlX2h2NzEzMWQoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0pOworZXh0ZXJuIGludCBzbjljMTAyX3Byb2JlX2h2NzEzMXIoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0pOwogZXh0ZXJuIGludCBzbjljMTAyX3Byb2JlX21pMDM0MyhzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSk7CitleHRlcm4gaW50IHNuOWMxMDJfcHJvYmVfbWkwMzYwKHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtKTsKIGV4dGVybiBpbnQgc245YzEwMl9wcm9iZV9vdjc2MzAoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0pOwogZXh0ZXJuIGludCBzbjljMTAyX3Byb2JlX292NzY2MChzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSk7CiBleHRlcm4gaW50IHNuOWMxMDJfcHJvYmVfcGFzMTA2YihzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSk7CiBleHRlcm4gaW50IHNuOWMxMDJfcHJvYmVfcGFzMjAyYmNiKHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtKTsKIGV4dGVybiBpbnQgc245YzEwMl9wcm9iZV90YXM1MTEwYzFiKHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtKTsKK2V4dGVybiBpbnQgc245YzEwMl9wcm9iZV90YXM1MTEwZChzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSk7CiBleHRlcm4gaW50IHNuOWMxMDJfcHJvYmVfdGFzNTEzMGQxYihzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSk7CiAKIC8qCkBAIC0xMjgsMTMgKzEzNywxNiBAQAogICAgdGhlIG9yZGVyIG9mIHRoZSBsaXN0IGJlbG93LCBmcm9tIHRvcCB0byBib3R0b20uCiAqLwogc3RhdGljIGludCAoKnNuOWMxMDJfc2Vuc29yX3RhYmxlW10pKHN0cnVjdCBzbjljMTAyX2RldmljZSopID0geworCSZzbjljMTAyX3Byb2JlX2h2NzEzMWQsIC8qIHN0cm9uZyBkZXRlY3Rpb24gYmFzZWQgb24gU0VOU09SIGlkcyAqLworCSZzbjljMTAyX3Byb2JlX2h2NzEzMXIsIC8qIHN0cm9uZyBkZXRlY3Rpb24gYmFzZWQgb24gU0VOU09SIGlkcyAqLwogCSZzbjljMTAyX3Byb2JlX21pMDM0MywgLyogc3Ryb25nIGRldGVjdGlvbiBiYXNlZCBvbiBTRU5TT1IgaWRzICovCisJJnNuOWMxMDJfcHJvYmVfbWkwMzYwLCAvKiBzdHJvbmcgZGV0ZWN0aW9uIGJhc2VkIG9uIFNFTlNPUiBpZHMgKi8KIAkmc245YzEwMl9wcm9iZV9wYXMxMDZiLCAvKiBzdHJvbmcgZGV0ZWN0aW9uIGJhc2VkIG9uIFNFTlNPUiBpZHMgKi8KIAkmc245YzEwMl9wcm9iZV9wYXMyMDJiY2IsIC8qIHN0cm9uZyBkZXRlY3Rpb24gYmFzZWQgb24gU0VOU09SIGlkcyAqLwotCSZzbjljMTAyX3Byb2JlX2h2NzEzMWQsIC8qIHN0cm9uZyBkZXRlY3Rpb24gYmFzZWQgb24gU0VOU09SIGlkcyAqLwogCSZzbjljMTAyX3Byb2JlX292NzYzMCwgLyogc3Ryb25nIGRldGVjdGlvbiBiYXNlZCBvbiBTRU5TT1IgaWRzICovCiAJJnNuOWMxMDJfcHJvYmVfb3Y3NjYwLCAvKiBzdHJvbmcgZGV0ZWN0aW9uIGJhc2VkIG9uIFNFTlNPUiBpZHMgKi8KIAkmc245YzEwMl9wcm9iZV90YXM1MTEwYzFiLCAvKiBkZXRlY3Rpb24gYmFzZWQgb24gVVNCIHBpZC92aWQgKi8KKwkmc245YzEwMl9wcm9iZV90YXM1MTEwZCwgLyogZGV0ZWN0aW9uIGJhc2VkIG9uIFVTQiBwaWQvdmlkICovCiAJJnNuOWMxMDJfcHJvYmVfdGFzNTEzMGQxYiwgLyogZGV0ZWN0aW9uIGJhc2VkIG9uIFVTQiBwaWQvdmlkICovCiAJTlVMTCwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvc245YzEwMl9odjcxMzFkLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvc245YzEwMl9odjcxMzFkLmMKaW5kZXggN2FlMzY4Zi4uMjhhODYxYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zbjljMTAyL3NuOWMxMDJfaHY3MTMxZC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX2h2NzEzMWQuYwpAQCAtMjIsMTkgKzIyLDEzIEBACiAjaW5jbHVkZSAic245YzEwMl9zZW5zb3IuaCIKIAogCi1zdGF0aWMgc3RydWN0IHNuOWMxMDJfc2Vuc29yIGh2NzEzMWQ7Ci0KLQogc3RhdGljIGludCBodjcxMzFkX2luaXQoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0pCiB7Ci0JaW50IGVyciA9IDA7CisJaW50IGVycjsKIAotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDAsIDB4MTApOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDAsIDB4MTEpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDAsIDB4MTQpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4NjAsIDB4MTcpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MGUsIDB4MTgpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4ZjIsIDB4MTkpOworCWVyciA9IHNuOWMxMDJfd3JpdGVfY29uc3RfcmVncyhjYW0sIHsweDAwLCAweDEwfSwgezB4MDAsIDB4MTF9LAorCQkJCSAgICAgICB7MHgwMCwgMHgxNH0sIHsweDYwLCAweDE3fSwKKwkJCQkgICAgICAgezB4MGUsIDB4MTh9LCB7MHhmMiwgMHgxOX0pOwogCiAJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgwMSwgMHgwNCk7CiAJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgwMiwgMHgwMCk7CkBAIC0xNTMsNyArMTQ3LDcgQEAKIHN0YXRpYyBzdHJ1Y3Qgc245YzEwMl9zZW5zb3IgaHY3MTMxZCA9IHsKIAkubmFtZSA9ICJIVjcxMzFEIiwKIAkubWFpbnRhaW5lciA9ICJMdWNhIFJpc29saWEgPGx1Y2Eucmlzb2xpYUBzdHVkaW8udW5pYm8uaXQ+IiwKLQkuc3VwcG9ydGVkX2JyaWRnZSA9IEJSSURHRV9TTjlDMTAxIHwgQlJJREdFX1NOOUMxMDIgfCBCUklER0VfU045QzEwMywKKwkuc3VwcG9ydGVkX2JyaWRnZSA9IEJSSURHRV9TTjlDMTAxIHwgQlJJREdFX1NOOUMxMDIsCiAJLnN5c2ZzX29wcyA9IFNOOUMxMDJfSTJDX1JFQUQgfCBTTjlDMTAyX0kyQ19XUklURSwKIAkuZnJlcXVlbmN5ID0gU045QzEwMl9JMkNfMTAwS0haLAogCS5pbnRlcmZhY2UgPSBTTjlDMTAyX0kyQ18yV0lSRVMsCkBAIC0yNTAsMTEgKzI0NCwxMCBAQAogCiBpbnQgc245YzEwMl9wcm9iZV9odjcxMzFkKHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtKQogewotCWludCByMCA9IDAsIHIxID0gMCwgZXJyID0gMDsKKwlpbnQgcjAgPSAwLCByMSA9IDAsIGVycjsKIAotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDEsIDB4MDEpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDAsIDB4MDEpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MjgsIDB4MTcpOworCWVyciA9IHNuOWMxMDJfd3JpdGVfY29uc3RfcmVncyhjYW0sIHsweDAxLCAweDAxfSwgezB4MDAsIDB4MDF9LAorCQkJCSAgICAgICB7MHgyOCwgMHgxN30pOwogCWlmIChlcnIpCiAJCXJldHVybiAtRUlPOwogCkBAIC0yNjMsNyArMjU2LDcgQEAKIAlpZiAocjAgPCAwIHx8IHIxIDwgMCkKIAkJcmV0dXJuIC1FSU87CiAKLQlpZiAocjAgIT0gMHgwMCAmJiByMSAhPSAweDA0KQorCWlmIChyMCAhPSAweDAwIHx8IHIxICE9IDB4MDQpCiAJCXJldHVybiAtRU5PREVWOwogCiAJc245YzEwMl9hdHRhY2hfc2Vuc29yKGNhbSwgJmh2NzEzMWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zbjljMTAyL3NuOWMxMDJfaHY3MTMxci5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zbjljMTAyL3NuOWMxMDJfaHY3MTMxci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhNDk1YmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvc245YzEwMl9odjcxMzFyLmMKQEAgLTAsMCArMSwzNjYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFBsdWctaW4gZm9yIEhWNzEzMVIgaW1hZ2Ugc2Vuc29yIGNvbm5lY3RlZCB0byB0aGUgU045QzF4eCBQQyBDYW1lcmEgICAgICoKKyAqIENvbnRyb2xsZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBieSBMdWNhIFJpc29saWEgPGx1Y2Eucmlzb2xpYUBzdHVkaW8udW5pYm8uaXQ+ICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlICAgICAgICAgICAgICoKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLiAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJzbjljMTAyX3NlbnNvci5oIgorCisKK3N0YXRpYyBpbnQgaHY3MTMxcl9pbml0KHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtKQoreworCWludCBlcnIgPSAwOworCisJc3dpdGNoIChzbjljMTAyX2dldF9icmlkZ2UoY2FtKSkgeworCWNhc2UgQlJJREdFX1NOOUMxMDM6CisJCWVyciA9IHNuOWMxMDJfd3JpdGVfY29uc3RfcmVncyhjYW0sIHsweDAwLCAweDAzfSwgezB4MWEsIDB4MDR9LAorCQkJCQkgICAgICAgezB4MjAsIDB4MDV9LCB7MHgyMCwgMHgwNn0sCisJCQkJCSAgICAgICB7MHgwMywgMHgxMH0sIHsweDAwLCAweDE0fSwKKwkJCQkJICAgICAgIHsweDYwLCAweDE3fSwgezB4MGEsIDB4MTh9LAorCQkJCQkgICAgICAgezB4ZjAsIDB4MTl9LCB7MHgxZCwgMHgxYX0sCisJCQkJCSAgICAgICB7MHgxMCwgMHgxYn0sIHsweDAyLCAweDFjfSwKKwkJCQkJICAgICAgIHsweDAzLCAweDFkfSwgezB4MGYsIDB4MWV9LAorCQkJCQkgICAgICAgezB4MGMsIDB4MWZ9LCB7MHgwMCwgMHgyMH0sCisJCQkJCSAgICAgICB7MHgxMCwgMHgyMX0sIHsweDIwLCAweDIyfSwKKwkJCQkJICAgICAgIHsweDMwLCAweDIzfSwgezB4NDAsIDB4MjR9LAorCQkJCQkgICAgICAgezB4NTAsIDB4MjV9LCB7MHg2MCwgMHgyNn0sCisJCQkJCSAgICAgICB7MHg3MCwgMHgyN30sIHsweDgwLCAweDI4fSwKKwkJCQkJICAgICAgIHsweDkwLCAweDI5fSwgezB4YTAsIDB4MmF9LAorCQkJCQkgICAgICAgezB4YjAsIDB4MmJ9LCB7MHhjMCwgMHgyY30sCisJCQkJCSAgICAgICB7MHhkMCwgMHgyZH0sIHsweGUwLCAweDJlfSwKKwkJCQkJICAgICAgIHsweGYwLCAweDJmfSwgezB4ZmYsIDB4MzB9KTsKKworCQlicmVhazsKKwljYXNlIEJSSURHRV9TTjlDMTA1OgorCWNhc2UgQlJJREdFX1NOOUMxMjA6CisJCWVyciA9IHNuOWMxMDJfd3JpdGVfY29uc3RfcmVncyhjYW0sIHsweDQ0LCAweDAxfSwgezB4NDAsIDB4MDJ9LAorCQkJCQkgICAgICAgezB4MDAsIDB4MDN9LCB7MHgxYSwgMHgwNH0sCisJCQkJCSAgICAgICB7MHg0NCwgMHgwNX0sIHsweDNlLCAweDA2fSwKKwkJCQkJICAgICAgIHsweDFhLCAweDA3fSwgezB4MDMsIDB4MTB9LAorCQkJCQkgICAgICAgezB4MDgsIDB4MTR9LCB7MHhhMywgMHgxN30sCisJCQkJCSAgICAgICB7MHg0YiwgMHgxOH0sIHsweDAwLCAweDE5fSwKKwkJCQkJICAgICAgIHsweDFkLCAweDFhfSwgezB4MTAsIDB4MWJ9LAorCQkJCQkgICAgICAgezB4MDIsIDB4MWN9LCB7MHgwMywgMHgxZH0sCisJCQkJCSAgICAgICB7MHgwZiwgMHgxZX0sIHsweDBjLCAweDFmfSwKKwkJCQkJICAgICAgIHsweDAwLCAweDIwfSwgezB4MjksIDB4MjF9LAorCQkJCQkgICAgICAgezB4NDAsIDB4MjJ9LCB7MHg1NCwgMHgyM30sCisJCQkJCSAgICAgICB7MHg2NiwgMHgyNH0sIHsweDc2LCAweDI1fSwKKwkJCQkJICAgICAgIHsweDg1LCAweDI2fSwgezB4OTQsIDB4Mjd9LAorCQkJCQkgICAgICAgezB4YTEsIDB4Mjh9LCB7MHhhZSwgMHgyOX0sCisJCQkJCSAgICAgICB7MHhiYiwgMHgyYX0sIHsweGM3LCAweDJifSwKKwkJCQkJICAgICAgIHsweGQzLCAweDJjfSwgezB4ZGUsIDB4MmR9LAorCQkJCQkgICAgICAgezB4ZWEsIDB4MmV9LCB7MHhmNCwgMHgyZn0sCisJCQkJCSAgICAgICB7MHhmZiwgMHgzMH0sIHsweDAwLCAweDNGfSwKKwkJCQkJICAgICAgIHsweEM3LCAweDQwfSwgezB4MDEsIDB4NDF9LAorCQkJCQkgICAgICAgezB4NDQsIDB4NDJ9LCB7MHgwMCwgMHg0M30sCisJCQkJCSAgICAgICB7MHg0NCwgMHg0NH0sIHsweDAwLCAweDQ1fSwKKwkJCQkJICAgICAgIHsweDQ0LCAweDQ2fSwgezB4MDAsIDB4NDd9LAorCQkJCQkgICAgICAgezB4QzcsIDB4NDh9LCB7MHgwMSwgMHg0OX0sCisJCQkJCSAgICAgICB7MHhDNywgMHg0QX0sIHsweDAxLCAweDRCfSwKKwkJCQkJICAgICAgIHsweEM3LCAweDRDfSwgezB4MDEsIDB4NER9LAorCQkJCQkgICAgICAgezB4NDQsIDB4NEV9LCB7MHgwMCwgMHg0Rn0sCisJCQkJCSAgICAgICB7MHg0NCwgMHg1MH0sIHsweDAwLCAweDUxfSwKKwkJCQkJICAgICAgIHsweDQ0LCAweDUyfSwgezB4MDAsIDB4NTN9LAorCQkJCQkgICAgICAgezB4QzcsIDB4NTR9LCB7MHgwMSwgMHg1NX0sCisJCQkJCSAgICAgICB7MHhDNywgMHg1Nn0sIHsweDAxLCAweDU3fSwKKwkJCQkJICAgICAgIHsweEM3LCAweDU4fSwgezB4MDEsIDB4NTl9LAorCQkJCQkgICAgICAgezB4NDQsIDB4NUF9LCB7MHgwMCwgMHg1Qn0sCisJCQkJCSAgICAgICB7MHg0NCwgMHg1Q30sIHsweDAwLCAweDVEfSwKKwkJCQkJICAgICAgIHsweDQ0LCAweDVFfSwgezB4MDAsIDB4NUZ9LAorCQkJCQkgICAgICAgezB4QzcsIDB4NjB9LCB7MHgwMSwgMHg2MX0sCisJCQkJCSAgICAgICB7MHhDNywgMHg2Mn0sIHsweDAxLCAweDYzfSwKKwkJCQkJICAgICAgIHsweEM3LCAweDY0fSwgezB4MDEsIDB4NjV9LAorCQkJCQkgICAgICAgezB4NDQsIDB4NjZ9LCB7MHgwMCwgMHg2N30sCisJCQkJCSAgICAgICB7MHg0NCwgMHg2OH0sIHsweDAwLCAweDY5fSwKKwkJCQkJICAgICAgIHsweDQ0LCAweDZBfSwgezB4MDAsIDB4NkJ9LAorCQkJCQkgICAgICAgezB4QzcsIDB4NkN9LCB7MHgwMSwgMHg2RH0sCisJCQkJCSAgICAgICB7MHhDNywgMHg2RX0sIHsweDAxLCAweDZGfSwKKwkJCQkJICAgICAgIHsweEM3LCAweDcwfSwgezB4MDEsIDB4NzF9LAorCQkJCQkgICAgICAgezB4NDQsIDB4NzJ9LCB7MHgwMCwgMHg3M30sCisJCQkJCSAgICAgICB7MHg0NCwgMHg3NH0sIHsweDAwLCAweDc1fSwKKwkJCQkJICAgICAgIHsweDQ0LCAweDc2fSwgezB4MDAsIDB4Nzd9LAorCQkJCQkgICAgICAgezB4QzcsIDB4Nzh9LCB7MHgwMSwgMHg3OX0sCisJCQkJCSAgICAgICB7MHhDNywgMHg3QX0sIHsweDAxLCAweDdCfSwKKwkJCQkJICAgICAgIHsweEM3LCAweDdDfSwgezB4MDEsIDB4N0R9LAorCQkJCQkgICAgICAgezB4NDQsIDB4N0V9LCB7MHgwMCwgMHg3Rn0sCisJCQkJCSAgICAgICB7MHgxNCwgMHg4NH0sIHsweDAwLCAweDg1fSwKKwkJCQkJICAgICAgIHsweDI3LCAweDg2fSwgezB4MDAsIDB4ODd9LAorCQkJCQkgICAgICAgezB4MDcsIDB4ODh9LCB7MHgwMCwgMHg4OX0sCisJCQkJCSAgICAgICB7MHhFQywgMHg4QX0sIHsweDBmLCAweDhCfSwKKwkJCQkJICAgICAgIHsweEQ4LCAweDhDfSwgezB4MGYsIDB4OER9LAorCQkJCQkgICAgICAgezB4M0QsIDB4OEV9LCB7MHgwMCwgMHg4Rn0sCisJCQkJCSAgICAgICB7MHgzRCwgMHg5MH0sIHsweDAwLCAweDkxfSwKKwkJCQkJICAgICAgIHsweENELCAweDkyfSwgezB4MGYsIDB4OTN9LAorCQkJCQkgICAgICAgezB4ZjcsIDB4OTR9LCB7MHgwZiwgMHg5NX0sCisJCQkJCSAgICAgICB7MHgwQywgMHg5Nn0sIHsweDAwLCAweDk3fSwKKwkJCQkJICAgICAgIHsweDAwLCAweDk4fSwgezB4NjYsIDB4OTl9LAorCQkJCQkgICAgICAgezB4MDUsIDB4OUF9LCB7MHgwMCwgMHg5Qn0sCisJCQkJCSAgICAgICB7MHgwNCwgMHg5Q30sIHsweDAwLCAweDlEfSwKKwkJCQkJICAgICAgIHsweDA4LCAweDlFfSwgezB4MDAsIDB4OUZ9LAorCQkJCQkgICAgICAgezB4MkQsIDB4QzB9LCB7MHgyRCwgMHhDMX0sCisJCQkJCSAgICAgICB7MHgzQSwgMHhDMn0sIHsweDA1LCAweEMzfSwKKwkJCQkJICAgICAgIHsweDA0LCAweEM0fSwgezB4M0YsIDB4QzV9LAorCQkJCQkgICAgICAgezB4MDAsIDB4QzZ9LCB7MHgwMCwgMHhDN30sCisJCQkJCSAgICAgICB7MHg1MCwgMHhDOH0sIHsweDNDLCAweEM5fSwKKwkJCQkJICAgICAgIHsweDI4LCAweENBfSwgezB4RDgsIDB4Q0J9LAorCQkJCQkgICAgICAgezB4MTQsIDB4Q0N9LCB7MHhFQywgMHhDRH0sCisJCQkJCSAgICAgICB7MHgzMiwgMHhDRX0sIHsweERELCAweENGfSwKKwkJCQkJICAgICAgIHsweDMyLCAweEQwfSwgezB4REQsIDB4RDF9LAorCQkJCQkgICAgICAgezB4NkEsIDB4RDJ9LCB7MHg1MCwgMHhEM30sCisJCQkJCSAgICAgICB7MHgwMCwgMHhENH0sIHsweDAwLCAweEQ1fSwKKwkJCQkJICAgICAgIHsweDAwLCAweEQ2fSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MjAsIDB4MDApOworCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MjEsIDB4ZDYpOworCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MjUsIDB4MDYpOworCisJcmV0dXJuIGVycjsKK30KKworCitzdGF0aWMgaW50IGh2NzEzMXJfZ2V0X2N0cmwoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0sCisJCQkgICAgc3RydWN0IHY0bDJfY29udHJvbCogY3RybCkKK3sKKwlzd2l0Y2ggKGN0cmwtPmlkKSB7CisJY2FzZSBWNEwyX0NJRF9HQUlOOgorCQlpZiAoKGN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MzApKSA8IDApCisJCQlyZXR1cm4gLUVJTzsKKwkJcmV0dXJuIDA7CisJY2FzZSBWNEwyX0NJRF9SRURfQkFMQU5DRToKKwkJaWYgKChjdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDMxKSkgPCAwKQorCQkJcmV0dXJuIC1FSU87CisJCWN0cmwtPnZhbHVlID0gY3RybC0+dmFsdWUgJiAweDNmOworCQlyZXR1cm4gMDsKKwljYXNlIFY0TDJfQ0lEX0JMVUVfQkFMQU5DRToKKwkJaWYgKChjdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDMzKSkgPCAwKQorCQkJcmV0dXJuIC1FSU87CisJCWN0cmwtPnZhbHVlID0gY3RybC0+dmFsdWUgJiAweDNmOworCQlyZXR1cm4gMDsKKwljYXNlIFNOOUMxMDJfVjRMMl9DSURfR1JFRU5fQkFMQU5DRToKKwkJaWYgKChjdHJsLT52YWx1ZSA9IHNuOWMxMDJfaTJjX3JlYWQoY2FtLCAweDMyKSkgPCAwKQorCQkJcmV0dXJuIC1FSU87CisJCWN0cmwtPnZhbHVlID0gY3RybC0+dmFsdWUgJiAweDNmOworCQlyZXR1cm4gMDsKKwljYXNlIFY0TDJfQ0lEX0JMQUNLX0xFVkVMOgorCQlpZiAoKGN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MDEpKSA8IDApCisJCQlyZXR1cm4gLUVJTzsKKwkJY3RybC0+dmFsdWUgPSAoY3RybC0+dmFsdWUgJiAweDA4KSA/IDEgOiAwOworCQlyZXR1cm4gMDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKKworc3RhdGljIGludCBodjcxMzFyX3NldF9jdHJsKHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtLAorCQkJICAgIGNvbnN0IHN0cnVjdCB2NGwyX2NvbnRyb2wqIGN0cmwpCit7CisJaW50IGVyciA9IDA7CisKKwlzd2l0Y2ggKGN0cmwtPmlkKSB7CisJY2FzZSBWNEwyX0NJRF9HQUlOOgorCQllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDMwLCBjdHJsLT52YWx1ZSk7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfUkVEX0JBTEFOQ0U6CisJCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MzEsIGN0cmwtPnZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9CTFVFX0JBTEFOQ0U6CisJCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MzMsIGN0cmwtPnZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSBTTjlDMTAyX1Y0TDJfQ0lEX0dSRUVOX0JBTEFOQ0U6CisJCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MzIsIGN0cmwtPnZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9CTEFDS19MRVZFTDoKKwkJeworCQkJaW50IHIgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgwMSk7CisJCQlpZiAociA8IDApCisJCQkJcmV0dXJuIC1FSU87CisJCQllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDAxLAorCQkJCQkJIChjdHJsLT52YWx1ZTw8MykgfCAociYweGY3KSk7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIGVyciA/IC1FSU8gOiAwOworfQorCisKK3N0YXRpYyBpbnQgaHY3MTMxcl9zZXRfY3JvcChzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSwKKwkJCSAgICBjb25zdCBzdHJ1Y3QgdjRsMl9yZWN0KiByZWN0KQoreworCXN0cnVjdCBzbjljMTAyX3NlbnNvciogcyA9IHNuOWMxMDJfZ2V0X3NlbnNvcihjYW0pOworCWludCBlcnIgPSAwOworCXU4IGhfc3RhcnQgPSAodTgpKHJlY3QtPmxlZnQgLSBzLT5jcm9wY2FwLmJvdW5kcy5sZWZ0KSArIDEsCisJICAgdl9zdGFydCA9ICh1OCkocmVjdC0+dG9wIC0gcy0+Y3JvcGNhcC5ib3VuZHMudG9wKSArIDE7CisKKwllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCBoX3N0YXJ0LCAweDEyKTsKKwllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCB2X3N0YXJ0LCAweDEzKTsKKworCXJldHVybiBlcnI7Cit9CisKKworc3RhdGljIGludCBodjcxMzFyX3NldF9waXhfZm9ybWF0KHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtLAorCQkJCSAgY29uc3Qgc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCogcGl4KQoreworCWludCBlcnIgPSAwOworCisJc3dpdGNoIChzbjljMTAyX2dldF9icmlkZ2UoY2FtKSkgeworCWNhc2UgQlJJREdFX1NOOUMxMDM6CisJCWlmIChwaXgtPnBpeGVsZm9ybWF0ID09IFY0TDJfUElYX0ZNVF9TQkdHUjgpIHsKKwkJCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4YTAsIDB4MTkpOworCQkJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgwMSwgMHgwNCk7CisJCX0gZWxzZSB7CisJCQllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDMwLCAweDE5KTsKKwkJCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MDEsIDB4MDQpOworCQl9CisJCWJyZWFrOworCWNhc2UgQlJJREdFX1NOOUMxMDU6CisJY2FzZSBCUklER0VfU045QzEyMDoKKwkJaWYgKHBpeC0+cGl4ZWxmb3JtYXQgPT0gVjRMMl9QSVhfRk1UX1NCR0dSOCkgeworCQkJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHhhNSwgMHgxNyk7CisJCQllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDAxLCAweDI0KTsKKwkJfSBlbHNlIHsKKwkJCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4YTMsIDB4MTcpOworCQkJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgwMSwgMHgwNCk7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworCitzdGF0aWMgc3RydWN0IHNuOWMxMDJfc2Vuc29yIGh2NzEzMXIgPSB7CisJLm5hbWUgPSAiSFY3MTMxUiIsCisJLm1haW50YWluZXIgPSAiTHVjYSBSaXNvbGlhIDxsdWNhLnJpc29saWFAc3R1ZGlvLnVuaWJvLml0PiIsCisJLnN1cHBvcnRlZF9icmlkZ2UgPSBCUklER0VfU045QzEwMyB8IEJSSURHRV9TTjlDMTA1IHwgQlJJREdFX1NOOUMxMjAsCisJLnN5c2ZzX29wcyA9IFNOOUMxMDJfSTJDX1JFQUQgfCBTTjlDMTAyX0kyQ19XUklURSwKKwkuZnJlcXVlbmN5ID0gU045QzEwMl9JMkNfMTAwS0haLAorCS5pbnRlcmZhY2UgPSBTTjlDMTAyX0kyQ18yV0lSRVMsCisJLmkyY19zbGF2ZV9pZCA9IDB4MTEsCisJLmluaXQgPSAmaHY3MTMxcl9pbml0LAorCS5xY3RybCA9IHsKKwkJeworCQkJLmlkID0gVjRMMl9DSURfR0FJTiwKKwkJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJCS5uYW1lID0gImdsb2JhbCBnYWluIiwKKwkJCS5taW5pbXVtID0gMHgwMCwKKwkJCS5tYXhpbXVtID0gMHhmZiwKKwkJCS5zdGVwID0gMHgwMSwKKwkJCS5kZWZhdWx0X3ZhbHVlID0gMHg0MCwKKwkJCS5mbGFncyA9IDAsCisJCX0sCisJCXsKKwkJCS5pZCA9IFY0TDJfQ0lEX1JFRF9CQUxBTkNFLAorCQkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkJLm5hbWUgPSAicmVkIGJhbGFuY2UiLAorCQkJLm1pbmltdW0gPSAweDAwLAorCQkJLm1heGltdW0gPSAweDNmLAorCQkJLnN0ZXAgPSAweDAxLAorCQkJLmRlZmF1bHRfdmFsdWUgPSAweDA4LAorCQkJLmZsYWdzID0gMCwKKwkJfSwKKwkJeworCQkJLmlkID0gVjRMMl9DSURfQkxVRV9CQUxBTkNFLAorCQkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkJLm5hbWUgPSAiYmx1ZSBiYWxhbmNlIiwKKwkJCS5taW5pbXVtID0gMHgwMCwKKwkJCS5tYXhpbXVtID0gMHgzZiwKKwkJCS5zdGVwID0gMHgwMSwKKwkJCS5kZWZhdWx0X3ZhbHVlID0gMHgxYSwKKwkJCS5mbGFncyA9IDAsCisJCX0sCisJCXsKKwkJCS5pZCA9IFNOOUMxMDJfVjRMMl9DSURfR1JFRU5fQkFMQU5DRSwKKwkJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJCS5uYW1lID0gImdyZWVuIGJhbGFuY2UiLAorCQkJLm1pbmltdW0gPSAweDAwLAorCQkJLm1heGltdW0gPSAweDNmLAorCQkJLnN0ZXAgPSAweDAxLAorCQkJLmRlZmF1bHRfdmFsdWUgPSAweDJmLAorCQkJLmZsYWdzID0gMCwKKwkJfSwKKwkJeworCQkJLmlkID0gVjRMMl9DSURfQkxBQ0tfTEVWRUwsCisJCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCisJCQkubmFtZSA9ICJhdXRvIGJsYWNrIGxldmVsIGNvbXBlbnNhdGlvbiIsCisJCQkubWluaW11bSA9IDB4MDAsCisJCQkubWF4aW11bSA9IDB4MDEsCisJCQkuc3RlcCA9IDB4MDEsCisJCQkuZGVmYXVsdF92YWx1ZSA9IDB4MDAsCisJCQkuZmxhZ3MgPSAwLAorCQl9LAorCX0sCisJLmdldF9jdHJsID0gJmh2NzEzMXJfZ2V0X2N0cmwsCisJLnNldF9jdHJsID0gJmh2NzEzMXJfc2V0X2N0cmwsCisJLmNyb3BjYXAgPSB7CisJCS5ib3VuZHMgPSB7CisJCQkubGVmdCA9IDAsCisJCQkudG9wID0gMCwKKwkJCS53aWR0aCA9IDY0MCwKKwkJCS5oZWlnaHQgPSA0ODAsCisJCX0sCisJCS5kZWZyZWN0ID0geworCQkJLmxlZnQgPSAwLAorCQkJLnRvcCA9IDAsCisJCQkud2lkdGggPSA2NDAsCisJCQkuaGVpZ2h0ID0gNDgwLAorCQl9LAorCX0sCisJLnNldF9jcm9wID0gJmh2NzEzMXJfc2V0X2Nyb3AsCisJLnBpeF9mb3JtYXQgPSB7CisJCS53aWR0aCA9IDY0MCwKKwkJLmhlaWdodCA9IDQ4MCwKKwkJLnBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX1NCR0dSOCwKKwkJLnByaXYgPSA4LAorCX0sCisJLnNldF9waXhfZm9ybWF0ID0gJmh2NzEzMXJfc2V0X3BpeF9mb3JtYXQKK307CisKKworaW50IHNuOWMxMDJfcHJvYmVfaHY3MTMxcihzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSkKK3sKKwlpbnQgZGV2aWQsIGVycjsKKworCWVyciA9IHNuOWMxMDJfd3JpdGVfY29uc3RfcmVncyhjYW0sIHsweDA5LCAweDAxfSwgezB4NDQsIDB4MDJ9LAorCQkJCSAgICAgICB7MHgzNCwgMHgwMX0sIHsweDIwLCAweDE3fSwKKwkJCQkgICAgICAgezB4MzQsIDB4MDF9LCB7MHg0NiwgMHgwMX0pOworCisJaWYgKGVycikKKwkJcmV0dXJuIC1FSU87CisKKwlkZXZpZCA9IHNuOWMxMDJfaTJjX3RyeV9yZWFkKGNhbSwgJmh2NzEzMXIsIDB4MDApOworCWlmIChkZXZpZCA8IDApCisJCXJldHVybiAtRUlPOworCisJaWYgKGRldmlkICE9IDB4MDIpCisJCXJldHVybiAtRU5PREVWOworCisJc245YzEwMl9hdHRhY2hfc2Vuc29yKGNhbSwgJmh2NzEzMXIpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvc245YzEwMl9taTAzNDMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX21pMDM0My5jCmluZGV4IGEzM2QxYmMuLjkyMDA4NDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX21pMDM0My5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX21pMDM0My5jCkBAIC0yMiwzNiArMjIsMzAgQEAKICNpbmNsdWRlICJzbjljMTAyX3NlbnNvci5oIgogCiAKLXN0YXRpYyBzdHJ1Y3Qgc245YzEwMl9zZW5zb3IgbWkwMzQzOwotc3RhdGljIHU4IG1pMDM0M19pMmNfZGF0YVs1KzFdOwotCi0KIHN0YXRpYyBpbnQgbWkwMzQzX2luaXQoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0pCiB7CisJc3RydWN0IHNuOWMxMDJfc2Vuc29yKiBzID0gc245YzEwMl9nZXRfc2Vuc29yKGNhbSk7CiAJaW50IGVyciA9IDA7CiAKLQllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDAwLCAweDEwKTsKLQllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDAwLCAweDExKTsKLQllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDBhLCAweDE0KTsKLQllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDQwLCAweDAxKTsKLQllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDIwLCAweDE3KTsKLQllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDA3LCAweDE4KTsKLQllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweGEwLCAweDE5KTsKKwllcnIgPSBzbjljMTAyX3dyaXRlX2NvbnN0X3JlZ3MoY2FtLCB7MHgwMCwgMHgxMH0sIHsweDAwLCAweDExfSwKKwkJCQkgICAgICAgezB4MGEsIDB4MTR9LCB7MHg0MCwgMHgwMX0sCisJCQkJICAgICAgIHsweDIwLCAweDE3fSwgezB4MDcsIDB4MTh9LAorCQkJCSAgICAgICB7MHhhMCwgMHgxOX0pOwogCi0JZXJyICs9IHNuOWMxMDJfaTJjX3RyeV9yYXdfd3JpdGUoY2FtLCAmbWkwMzQzLCA0LCBtaTAzNDMuaTJjX3NsYXZlX2lkLAotCQkJCQkgMHgwZCwgMHgwMCwgMHgwMSwgMCwgMCk7Ci0JZXJyICs9IHNuOWMxMDJfaTJjX3RyeV9yYXdfd3JpdGUoY2FtLCAmbWkwMzQzLCA0LCBtaTAzNDMuaTJjX3NsYXZlX2lkLAotCQkJCQkgMHgwZCwgMHgwMCwgMHgwMCwgMCwgMCk7Ci0JZXJyICs9IHNuOWMxMDJfaTJjX3RyeV9yYXdfd3JpdGUoY2FtLCAmbWkwMzQzLCA0LCBtaTAzNDMuaTJjX3NsYXZlX2lkLAotCQkJCQkgMHgwMywgMHgwMSwgMHhlMSwgMCwgMCk7Ci0JZXJyICs9IHNuOWMxMDJfaTJjX3RyeV9yYXdfd3JpdGUoY2FtLCAmbWkwMzQzLCA0LCBtaTAzNDMuaTJjX3NsYXZlX2lkLAotCQkJCQkgMHgwNCwgMHgwMiwgMHg4MSwgMCwgMCk7Ci0JZXJyICs9IHNuOWMxMDJfaTJjX3RyeV9yYXdfd3JpdGUoY2FtLCAmbWkwMzQzLCA0LCBtaTAzNDMuaTJjX3NsYXZlX2lkLAotCQkJCQkgMHgwNSwgMHgwMCwgMHgxNywgMCwgMCk7Ci0JZXJyICs9IHNuOWMxMDJfaTJjX3RyeV9yYXdfd3JpdGUoY2FtLCAmbWkwMzQzLCA0LCBtaTAzNDMuaTJjX3NsYXZlX2lkLAotCQkJCQkgMHgwNiwgMHgwMCwgMHgxMSwgMCwgMCk7Ci0JZXJyICs9IHNuOWMxMDJfaTJjX3RyeV9yYXdfd3JpdGUoY2FtLCAmbWkwMzQzLCA0LCBtaTAzNDMuaTJjX3NsYXZlX2lkLAotCQkJCQkgMHg2MiwgMHgwNCwgMHg5YSwgMCwgMCk7CisJZXJyICs9IHNuOWMxMDJfaTJjX3RyeV9yYXdfd3JpdGUoY2FtLCBzLCA0LCBzLT5pMmNfc2xhdmVfaWQsIDB4MGQsCisJCQkJCSAweDAwLCAweDAxLCAwLCAwKTsKKwllcnIgKz0gc245YzEwMl9pMmNfdHJ5X3Jhd193cml0ZShjYW0sIHMsIDQsIHMtPmkyY19zbGF2ZV9pZCwgMHgwZCwKKwkJCQkJIDB4MDAsIDB4MDAsIDAsIDApOworCWVyciArPSBzbjljMTAyX2kyY190cnlfcmF3X3dyaXRlKGNhbSwgcywgNCwgcy0+aTJjX3NsYXZlX2lkLCAweDAzLAorCQkJCQkgMHgwMSwgMHhlMSwgMCwgMCk7CisJZXJyICs9IHNuOWMxMDJfaTJjX3RyeV9yYXdfd3JpdGUoY2FtLCBzLCA0LCBzLT5pMmNfc2xhdmVfaWQsIDB4MDQsCisJCQkJCSAweDAyLCAweDgxLCAwLCAwKTsKKwllcnIgKz0gc245YzEwMl9pMmNfdHJ5X3Jhd193cml0ZShjYW0sIHMsIDQsIHMtPmkyY19zbGF2ZV9pZCwgMHgwNSwKKwkJCQkJIDB4MDAsIDB4MTcsIDAsIDApOworCWVyciArPSBzbjljMTAyX2kyY190cnlfcmF3X3dyaXRlKGNhbSwgcywgNCwgcy0+aTJjX3NsYXZlX2lkLCAweDA2LAorCQkJCQkgMHgwMCwgMHgxMSwgMCwgMCk7CisJZXJyICs9IHNuOWMxMDJfaTJjX3RyeV9yYXdfd3JpdGUoY2FtLCBzLCA0LCBzLT5pMmNfc2xhdmVfaWQsIDB4NjIsCisJCQkJCSAweDA0LCAweDlhLCAwLCAwKTsKIAogCXJldHVybiBlcnI7CiB9CkBAIC02MCw0MyArNTQsNDYgQEAKIHN0YXRpYyBpbnQgbWkwMzQzX2dldF9jdHJsKHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtLAogCQkJICAgc3RydWN0IHY0bDJfY29udHJvbCogY3RybCkKIHsKKwlzdHJ1Y3Qgc245YzEwMl9zZW5zb3IqIHMgPSBzbjljMTAyX2dldF9zZW5zb3IoY2FtKTsKKwl1OCBkYXRhWzUrMV07CisKIAlzd2l0Y2ggKGN0cmwtPmlkKSB7CiAJY2FzZSBWNEwyX0NJRF9FWFBPU1VSRToKLQkJaWYgKHNuOWMxMDJfaTJjX3RyeV9yYXdfcmVhZChjYW0sICZtaTAzNDMsIG1pMDM0My5pMmNfc2xhdmVfaWQsCi0JCQkJCSAgICAgMHgwOSwgMisxLCBtaTAzNDNfaTJjX2RhdGEpIDwgMCkKKwkJaWYgKHNuOWMxMDJfaTJjX3RyeV9yYXdfcmVhZChjYW0sIHMsIHMtPmkyY19zbGF2ZV9pZCwgMHgwOSwKKwkJCQkJICAgICAyKzEsIGRhdGEpIDwgMCkKIAkJCXJldHVybiAtRUlPOwotCQljdHJsLT52YWx1ZSA9IG1pMDM0M19pMmNfZGF0YVsyXTsKKwkJY3RybC0+dmFsdWUgPSBkYXRhWzJdOwogCQlyZXR1cm4gMDsKIAljYXNlIFY0TDJfQ0lEX0dBSU46Ci0JCWlmIChzbjljMTAyX2kyY190cnlfcmF3X3JlYWQoY2FtLCAmbWkwMzQzLCBtaTAzNDMuaTJjX3NsYXZlX2lkLAotCQkJCQkgICAgIDB4MzUsIDIrMSwgbWkwMzQzX2kyY19kYXRhKSA8IDApCisJCWlmIChzbjljMTAyX2kyY190cnlfcmF3X3JlYWQoY2FtLCBzLCBzLT5pMmNfc2xhdmVfaWQsIDB4MzUsCisJCQkJCSAgICAgMisxLCBkYXRhKSA8IDApCiAJCQlyZXR1cm4gLUVJTzsKIAkJYnJlYWs7CiAJY2FzZSBWNEwyX0NJRF9IRkxJUDoKLQkJaWYgKHNuOWMxMDJfaTJjX3RyeV9yYXdfcmVhZChjYW0sICZtaTAzNDMsIG1pMDM0My5pMmNfc2xhdmVfaWQsCi0JCQkJCSAgICAgMHgyMCwgMisxLCBtaTAzNDNfaTJjX2RhdGEpIDwgMCkKKwkJaWYgKHNuOWMxMDJfaTJjX3RyeV9yYXdfcmVhZChjYW0sIHMsIHMtPmkyY19zbGF2ZV9pZCwgMHgyMCwKKwkJCQkJICAgICAyKzEsIGRhdGEpIDwgMCkKIAkJCXJldHVybiAtRUlPOwotCQljdHJsLT52YWx1ZSA9IG1pMDM0M19pMmNfZGF0YVszXSAmIDB4MjAgPyAxIDogMDsKKwkJY3RybC0+dmFsdWUgPSBkYXRhWzNdICYgMHgyMCA/IDEgOiAwOwogCQlyZXR1cm4gMDsKIAljYXNlIFY0TDJfQ0lEX1ZGTElQOgotCQlpZiAoc245YzEwMl9pMmNfdHJ5X3Jhd19yZWFkKGNhbSwgJm1pMDM0MywgbWkwMzQzLmkyY19zbGF2ZV9pZCwKLQkJCQkJICAgICAweDIwLCAyKzEsIG1pMDM0M19pMmNfZGF0YSkgPCAwKQorCQlpZiAoc245YzEwMl9pMmNfdHJ5X3Jhd19yZWFkKGNhbSwgcywgcy0+aTJjX3NsYXZlX2lkLCAweDIwLAorCQkJCQkgICAgIDIrMSwgZGF0YSkgPCAwKQogCQkJcmV0dXJuIC1FSU87Ci0JCWN0cmwtPnZhbHVlID0gbWkwMzQzX2kyY19kYXRhWzNdICYgMHg4MCA/IDEgOiAwOworCQljdHJsLT52YWx1ZSA9IGRhdGFbM10gJiAweDgwID8gMSA6IDA7CiAJCXJldHVybiAwOwogCWNhc2UgVjRMMl9DSURfUkVEX0JBTEFOQ0U6Ci0JCWlmIChzbjljMTAyX2kyY190cnlfcmF3X3JlYWQoY2FtLCAmbWkwMzQzLCBtaTAzNDMuaTJjX3NsYXZlX2lkLAotCQkJCQkgICAgIDB4MmQsIDIrMSwgbWkwMzQzX2kyY19kYXRhKSA8IDApCisJCWlmIChzbjljMTAyX2kyY190cnlfcmF3X3JlYWQoY2FtLCBzLCBzLT5pMmNfc2xhdmVfaWQsIDB4MmQsCisJCQkJCSAgICAgMisxLCBkYXRhKSA8IDApCiAJCQlyZXR1cm4gLUVJTzsKIAkJYnJlYWs7CiAJY2FzZSBWNEwyX0NJRF9CTFVFX0JBTEFOQ0U6Ci0JCWlmIChzbjljMTAyX2kyY190cnlfcmF3X3JlYWQoY2FtLCAmbWkwMzQzLCBtaTAzNDMuaTJjX3NsYXZlX2lkLAotCQkJCQkgICAgIDB4MmMsIDIrMSwgbWkwMzQzX2kyY19kYXRhKSA8IDApCisJCWlmIChzbjljMTAyX2kyY190cnlfcmF3X3JlYWQoY2FtLCBzLCBzLT5pMmNfc2xhdmVfaWQsIDB4MmMsCisJCQkJCSAgICAgMisxLCBkYXRhKSA8IDApCiAJCQlyZXR1cm4gLUVJTzsKIAkJYnJlYWs7CiAJY2FzZSBTTjlDMTAyX1Y0TDJfQ0lEX0dSRUVOX0JBTEFOQ0U6Ci0JCWlmIChzbjljMTAyX2kyY190cnlfcmF3X3JlYWQoY2FtLCAmbWkwMzQzLCBtaTAzNDMuaTJjX3NsYXZlX2lkLAotCQkJCQkgICAgIDB4MmUsIDIrMSwgbWkwMzQzX2kyY19kYXRhKSA8IDApCisJCWlmIChzbjljMTAyX2kyY190cnlfcmF3X3JlYWQoY2FtLCBzLCBzLT5pMmNfc2xhdmVfaWQsIDB4MmUsCisJCQkJCSAgICAgMisxLCBkYXRhKSA8IDApCiAJCQlyZXR1cm4gLUVJTzsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKQEAgLTEwOCw3ICsxMDUsNyBAQAogCWNhc2UgVjRMMl9DSURfUkVEX0JBTEFOQ0U6CiAJY2FzZSBWNEwyX0NJRF9CTFVFX0JBTEFOQ0U6CiAJY2FzZSBTTjlDMTAyX1Y0TDJfQ0lEX0dSRUVOX0JBTEFOQ0U6Ci0JCWN0cmwtPnZhbHVlID0gbWkwMzQzX2kyY19kYXRhWzNdIHwgKG1pMDM0M19pMmNfZGF0YVsyXSA8PCA4KTsKKwkJY3RybC0+dmFsdWUgPSBkYXRhWzNdIHwgKGRhdGFbMl0gPDwgOCk7CiAJCWlmIChjdHJsLT52YWx1ZSA+PSAweDEwICYmIGN0cmwtPnZhbHVlIDw9IDB4M2YpCiAJCQljdHJsLT52YWx1ZSAtPSAweDEwOwogCQllbHNlIGlmIChjdHJsLT52YWx1ZSA+PSAweDYwICYmIGN0cmwtPnZhbHVlIDw9IDB4N2YpCkBAIC0xMjQsNiArMTIxLDcgQEAKIHN0YXRpYyBpbnQgbWkwMzQzX3NldF9jdHJsKHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtLAogCQkJICAgY29uc3Qgc3RydWN0IHY0bDJfY29udHJvbCogY3RybCkKIHsKKwlzdHJ1Y3Qgc245YzEwMl9zZW5zb3IqIHMgPSBzbjljMTAyX2dldF9zZW5zb3IoY2FtKTsKIAl1MTYgcmVnID0gMDsKIAlpbnQgZXJyID0gMDsKIApAQCAtMTQzLDUwICsxNDEsNDIgQEAKIAogCXN3aXRjaCAoY3RybC0+aWQpIHsKIAljYXNlIFY0TDJfQ0lEX0VYUE9TVVJFOgotCQllcnIgKz0gc245YzEwMl9pMmNfdHJ5X3Jhd193cml0ZShjYW0sICZtaTAzNDMsIDQsCi0JCQkJCQkgbWkwMzQzLmkyY19zbGF2ZV9pZCwKKwkJZXJyICs9IHNuOWMxMDJfaTJjX3RyeV9yYXdfd3JpdGUoY2FtLCBzLCA0LCBzLT5pMmNfc2xhdmVfaWQsCiAJCQkJCQkgMHgwOSwgY3RybC0+dmFsdWUsIDB4MDAsCiAJCQkJCQkgMCwgMCk7CiAJCWJyZWFrOwogCWNhc2UgVjRMMl9DSURfR0FJTjoKLQkJZXJyICs9IHNuOWMxMDJfaTJjX3RyeV9yYXdfd3JpdGUoY2FtLCAmbWkwMzQzLCA0LAotCQkJCQkJIG1pMDM0My5pMmNfc2xhdmVfaWQsCisJCWVyciArPSBzbjljMTAyX2kyY190cnlfcmF3X3dyaXRlKGNhbSwgcywgNCwgcy0+aTJjX3NsYXZlX2lkLAogCQkJCQkJIDB4MzUsIHJlZyA+PiA4LCByZWcgJiAweGZmLAogCQkJCQkJIDAsIDApOwogCQlicmVhazsKIAljYXNlIFY0TDJfQ0lEX0hGTElQOgotCQllcnIgKz0gc245YzEwMl9pMmNfdHJ5X3Jhd193cml0ZShjYW0sICZtaTAzNDMsIDQsCi0JCQkJCQkgbWkwMzQzLmkyY19zbGF2ZV9pZCwKKwkJZXJyICs9IHNuOWMxMDJfaTJjX3RyeV9yYXdfd3JpdGUoY2FtLCBzLCA0LCBzLT5pMmNfc2xhdmVfaWQsCiAJCQkJCQkgMHgyMCwgY3RybC0+dmFsdWUgPyAweDQwOjB4MDAsCiAJCQkJCQkgY3RybC0+dmFsdWUgPyAweDIwOjB4MDAsCiAJCQkJCQkgMCwgMCk7CiAJCWJyZWFrOwogCWNhc2UgVjRMMl9DSURfVkZMSVA6Ci0JCWVyciArPSBzbjljMTAyX2kyY190cnlfcmF3X3dyaXRlKGNhbSwgJm1pMDM0MywgNCwKLQkJCQkJCSBtaTAzNDMuaTJjX3NsYXZlX2lkLAorCQllcnIgKz0gc245YzEwMl9pMmNfdHJ5X3Jhd193cml0ZShjYW0sIHMsIDQsIHMtPmkyY19zbGF2ZV9pZCwKIAkJCQkJCSAweDIwLCBjdHJsLT52YWx1ZSA/IDB4ODA6MHgwMCwKIAkJCQkJCSBjdHJsLT52YWx1ZSA/IDB4ODA6MHgwMCwKIAkJCQkJCSAwLCAwKTsKIAkJYnJlYWs7CiAJY2FzZSBWNEwyX0NJRF9SRURfQkFMQU5DRToKLQkJZXJyICs9IHNuOWMxMDJfaTJjX3RyeV9yYXdfd3JpdGUoY2FtLCAmbWkwMzQzLCA0LAotCQkJCQkJIG1pMDM0My5pMmNfc2xhdmVfaWQsCisJCWVyciArPSBzbjljMTAyX2kyY190cnlfcmF3X3dyaXRlKGNhbSwgcywgNCwgcy0+aTJjX3NsYXZlX2lkLAogCQkJCQkJIDB4MmQsIHJlZyA+PiA4LCByZWcgJiAweGZmLAogCQkJCQkJIDAsIDApOwogCQlicmVhazsKIAljYXNlIFY0TDJfQ0lEX0JMVUVfQkFMQU5DRToKLQkJZXJyICs9IHNuOWMxMDJfaTJjX3RyeV9yYXdfd3JpdGUoY2FtLCAmbWkwMzQzLCA0LAotCQkJCQkJIG1pMDM0My5pMmNfc2xhdmVfaWQsCisJCWVyciArPSBzbjljMTAyX2kyY190cnlfcmF3X3dyaXRlKGNhbSwgcywgNCwgcy0+aTJjX3NsYXZlX2lkLAogCQkJCQkJIDB4MmMsIHJlZyA+PiA4LCByZWcgJiAweGZmLAogCQkJCQkJIDAsIDApOwogCQlicmVhazsKIAljYXNlIFNOOUMxMDJfVjRMMl9DSURfR1JFRU5fQkFMQU5DRToKLQkJZXJyICs9IHNuOWMxMDJfaTJjX3RyeV9yYXdfd3JpdGUoY2FtLCAmbWkwMzQzLCA0LAotCQkJCQkJIG1pMDM0My5pMmNfc2xhdmVfaWQsCisJCWVyciArPSBzbjljMTAyX2kyY190cnlfcmF3X3dyaXRlKGNhbSwgcywgNCwgcy0+aTJjX3NsYXZlX2lkLAogCQkJCQkJIDB4MmIsIHJlZyA+PiA4LCByZWcgJiAweGZmLAogCQkJCQkJIDAsIDApOwotCQllcnIgKz0gc245YzEwMl9pMmNfdHJ5X3Jhd193cml0ZShjYW0sICZtaTAzNDMsIDQsCi0JCQkJCQkgbWkwMzQzLmkyY19zbGF2ZV9pZCwKKwkJZXJyICs9IHNuOWMxMDJfaTJjX3RyeV9yYXdfd3JpdGUoY2FtLCBzLCA0LCBzLT5pMmNfc2xhdmVfaWQsCiAJCQkJCQkgMHgyZSwgcmVnID4+IDgsIHJlZyAmIDB4ZmYsCiAJCQkJCQkgMCwgMCk7CiAJCWJyZWFrOwpAQCAtMjE2LDE2ICsyMDYsMTUgQEAKIHN0YXRpYyBpbnQgbWkwMzQzX3NldF9waXhfZm9ybWF0KHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtLAogCQkJCSBjb25zdCBzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0KiBwaXgpCiB7CisJc3RydWN0IHNuOWMxMDJfc2Vuc29yKiBzID0gc245YzEwMl9nZXRfc2Vuc29yKGNhbSk7CiAJaW50IGVyciA9IDA7CiAKIAlpZiAocGl4LT5waXhlbGZvcm1hdCA9PSBWNEwyX1BJWF9GTVRfU045QzEwWCkgewotCQllcnIgKz0gc245YzEwMl9pMmNfdHJ5X3Jhd193cml0ZShjYW0sICZtaTAzNDMsIDQsCi0JCQkJCQkgbWkwMzQzLmkyY19zbGF2ZV9pZCwKKwkJZXJyICs9IHNuOWMxMDJfaTJjX3RyeV9yYXdfd3JpdGUoY2FtLCBzLCA0LCBzLT5pMmNfc2xhdmVfaWQsCiAJCQkJCQkgMHgwYSwgMHgwMCwgMHgwMywgMCwgMCk7CiAJCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MjAsIDB4MTkpOwogCX0gZWxzZSB7Ci0JCWVyciArPSBzbjljMTAyX2kyY190cnlfcmF3X3dyaXRlKGNhbSwgJm1pMDM0MywgNCwKLQkJCQkJCSBtaTAzNDMuaTJjX3NsYXZlX2lkLAorCQllcnIgKz0gc245YzEwMl9pMmNfdHJ5X3Jhd193cml0ZShjYW0sIHMsIDQsIHMtPmkyY19zbGF2ZV9pZCwKIAkJCQkJCSAweDBhLCAweDAwLCAweDA1LCAwLCAwKTsKIAkJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHhhMCwgMHgxOSk7CiAJfQpAQCAtMjM3LDcgKzIyNiw3IEBACiBzdGF0aWMgc3RydWN0IHNuOWMxMDJfc2Vuc29yIG1pMDM0MyA9IHsKIAkubmFtZSA9ICJNSS0wMzQzIiwKIAkubWFpbnRhaW5lciA9ICJMdWNhIFJpc29saWEgPGx1Y2Eucmlzb2xpYUBzdHVkaW8udW5pYm8uaXQ+IiwKLQkuc3VwcG9ydGVkX2JyaWRnZSA9IEJSSURHRV9TTjlDMTAxIHwgQlJJREdFX1NOOUMxMDIgfCBCUklER0VfU045QzEwMywKKwkuc3VwcG9ydGVkX2JyaWRnZSA9IEJSSURHRV9TTjlDMTAxIHwgQlJJREdFX1NOOUMxMDIsCiAJLmZyZXF1ZW5jeSA9IFNOOUMxMDJfSTJDXzEwMEtIWiwKIAkuaW50ZXJmYWNlID0gU045QzEwMl9JMkNfMldJUkVTLAogCS5pMmNfc2xhdmVfaWQgPSAweDVkLApAQCAtMzQzLDE5ICszMzIsMjAgQEAKIAogaW50IHNuOWMxMDJfcHJvYmVfbWkwMzQzKHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtKQogeworCXU4IGRhdGFbNSsxXTsKIAlpbnQgZXJyID0gMDsKIAotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDEsIDB4MDEpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDAsIDB4MDEpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MjgsIDB4MTcpOworCWVyciA9IHNuOWMxMDJfd3JpdGVfY29uc3RfcmVncyhjYW0sIHsweDAxLCAweDAxfSwgezB4MDAsIDB4MDF9LAorCQkJCSAgICAgICB7MHgyOCwgMHgxN30pOworCiAJaWYgKGVycikKIAkJcmV0dXJuIC1FSU87CiAKIAlpZiAoc245YzEwMl9pMmNfdHJ5X3Jhd19yZWFkKGNhbSwgJm1pMDM0MywgbWkwMzQzLmkyY19zbGF2ZV9pZCwgMHgwMCwKLQkJCQkgICAgIDIsIG1pMDM0M19pMmNfZGF0YSkgPCAwKQorCQkJCSAgICAgMiwgZGF0YSkgPCAwKQogCQlyZXR1cm4gLUVJTzsKIAotCWlmIChtaTAzNDNfaTJjX2RhdGFbNF0gIT0gMHgzMiAmJiBtaTAzNDNfaTJjX2RhdGFbM10gIT0gMHhlMykKKwlpZiAoZGF0YVs0XSAhPSAweDMyIHx8IGRhdGFbM10gIT0gMHhlMykKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAlzbjljMTAyX2F0dGFjaF9zZW5zb3IoY2FtLCAmbWkwMzQzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX21pMDM2MC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zbjljMTAyL3NuOWMxMDJfbWkwMzYwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ2OThhYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX21pMDM2MC5jCkBAIC0wLDAgKzEsMzM4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQbHVnLWluIGZvciBNSS0wMzYwIGltYWdlIHNlbnNvciBjb25uZWN0ZWQgdG8gdGhlIFNOOUMxeHggUEMgQ2FtZXJhICAgICAqCisgKiBDb250cm9sbGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgYnkgTHVjYSBSaXNvbGlhIDxsdWNhLnJpc29saWFAc3R1ZGlvLnVuaWJvLml0PiAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAgICAgICAgICAgICAqCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4gICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAic245YzEwMl9zZW5zb3IuaCIKKworCitzdGF0aWMgaW50IG1pMDM2MF9pbml0KHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtKQoreworCXN0cnVjdCBzbjljMTAyX3NlbnNvciogcyA9IHNuOWMxMDJfZ2V0X3NlbnNvcihjYW0pOworCWludCBlcnIgPSAwOworCisJZXJyID0gc245YzEwMl93cml0ZV9jb25zdF9yZWdzKGNhbSwgezB4MDAsIDB4MTB9LCB7MHgwMCwgMHgxMX0sCisJCQkJICAgICAgIHsweDBhLCAweDE0fSwgezB4NDAsIDB4MDF9LAorCQkJCSAgICAgICB7MHgyMCwgMHgxN30sIHsweDA3LCAweDE4fSwKKwkJCQkgICAgICAgezB4YTAsIDB4MTl9LCB7MHgwMiwgMHgxY30sCisJCQkJICAgICAgIHsweDAzLCAweDFkfSwgezB4MGYsIDB4MWV9LAorCQkJCSAgICAgICB7MHgwYywgMHgxZn0sIHsweDAwLCAweDIwfSwKKwkJCQkgICAgICAgezB4MTAsIDB4MjF9LCB7MHgyMCwgMHgyMn0sCisJCQkJICAgICAgIHsweDMwLCAweDIzfSwgezB4NDAsIDB4MjR9LAorCQkJCSAgICAgICB7MHg1MCwgMHgyNX0sIHsweDYwLCAweDI2fSwKKwkJCQkgICAgICAgezB4NzAsIDB4Mjd9LCB7MHg4MCwgMHgyOH0sCisJCQkJICAgICAgIHsweDkwLCAweDI5fSwgezB4YTAsIDB4MmF9LAorCQkJCSAgICAgICB7MHhiMCwgMHgyYn0sIHsweGMwLCAweDJjfSwKKwkJCQkgICAgICAgezB4ZDAsIDB4MmR9LCB7MHhlMCwgMHgyZX0sCisJCQkJICAgICAgIHsweGYwLCAweDJmfSwgezB4ZmYsIDB4MzB9KTsKKworCWVyciArPSBzbjljMTAyX2kyY190cnlfcmF3X3dyaXRlKGNhbSwgcywgNCwgcy0+aTJjX3NsYXZlX2lkLCAweDBkLAorCQkJCQkgMHgwMCwgMHgwMSwgMCwgMCk7CisJZXJyICs9IHNuOWMxMDJfaTJjX3RyeV9yYXdfd3JpdGUoY2FtLCBzLCA0LCBzLT5pMmNfc2xhdmVfaWQsIDB4MGQsCisJCQkJCSAweDAwLCAweDAwLCAwLCAwKTsKKwllcnIgKz0gc245YzEwMl9pMmNfdHJ5X3Jhd193cml0ZShjYW0sIHMsIDQsIHMtPmkyY19zbGF2ZV9pZCwgMHgwMywKKwkJCQkJIDB4MDEsIDB4ZTEsIDAsIDApOworCWVyciArPSBzbjljMTAyX2kyY190cnlfcmF3X3dyaXRlKGNhbSwgcywgNCwgcy0+aTJjX3NsYXZlX2lkLCAweDA0LAorCQkJCQkgMHgwMiwgMHg4MSwgMCwgMCk7CisJZXJyICs9IHNuOWMxMDJfaTJjX3RyeV9yYXdfd3JpdGUoY2FtLCBzLCA0LCBzLT5pMmNfc2xhdmVfaWQsIDB4MDUsCisJCQkJCSAweDAwLCAweDE3LCAwLCAwKTsKKwllcnIgKz0gc245YzEwMl9pMmNfdHJ5X3Jhd193cml0ZShjYW0sIHMsIDQsIHMtPmkyY19zbGF2ZV9pZCwgMHgwNiwKKwkJCQkJIDB4MDAsIDB4MTEsIDAsIDApOworCWVyciArPSBzbjljMTAyX2kyY190cnlfcmF3X3dyaXRlKGNhbSwgcywgNCwgcy0+aTJjX3NsYXZlX2lkLCAweDYyLAorCQkJCQkgMHgwNCwgMHg5YSwgMCwgMCk7CisKKwlyZXR1cm4gZXJyOworfQorCisKK3N0YXRpYyBpbnQgbWkwMzYwX2dldF9jdHJsKHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtLAorCQkJICAgc3RydWN0IHY0bDJfY29udHJvbCogY3RybCkKK3sKKwlzdHJ1Y3Qgc245YzEwMl9zZW5zb3IqIHMgPSBzbjljMTAyX2dldF9zZW5zb3IoY2FtKTsKKwl1OCBkYXRhWzUrMV07CisKKwlzd2l0Y2ggKGN0cmwtPmlkKSB7CisJY2FzZSBWNEwyX0NJRF9FWFBPU1VSRToKKwkJaWYgKHNuOWMxMDJfaTJjX3RyeV9yYXdfcmVhZChjYW0sIHMsIHMtPmkyY19zbGF2ZV9pZCwgMHgwOSwKKwkJCQkJICAgICAyKzEsIGRhdGEpIDwgMCkKKwkJCXJldHVybiAtRUlPOworCQljdHJsLT52YWx1ZSA9IGRhdGFbMl07CisJCXJldHVybiAwOworCWNhc2UgVjRMMl9DSURfR0FJTjoKKwkJaWYgKHNuOWMxMDJfaTJjX3RyeV9yYXdfcmVhZChjYW0sIHMsIHMtPmkyY19zbGF2ZV9pZCwgMHgzNSwKKwkJCQkJICAgICAyKzEsIGRhdGEpIDwgMCkKKwkJCXJldHVybiAtRUlPOworCQljdHJsLT52YWx1ZSA9IGRhdGFbM107CisJCXJldHVybiAwOworCWNhc2UgVjRMMl9DSURfUkVEX0JBTEFOQ0U6CisJCWlmIChzbjljMTAyX2kyY190cnlfcmF3X3JlYWQoY2FtLCBzLCBzLT5pMmNfc2xhdmVfaWQsIDB4MmMsCisJCQkJCSAgICAgMisxLCBkYXRhKSA8IDApCisJCQlyZXR1cm4gLUVJTzsKKwkJY3RybC0+dmFsdWUgPSBkYXRhWzNdOworCQlyZXR1cm4gMDsKKwljYXNlIFY0TDJfQ0lEX0JMVUVfQkFMQU5DRToKKwkJaWYgKHNuOWMxMDJfaTJjX3RyeV9yYXdfcmVhZChjYW0sIHMsIHMtPmkyY19zbGF2ZV9pZCwgMHgyZCwKKwkJCQkJICAgICAyKzEsIGRhdGEpIDwgMCkKKwkJCXJldHVybiAtRUlPOworCQljdHJsLT52YWx1ZSA9IGRhdGFbM107CisJCXJldHVybiAwOworCWNhc2UgU045QzEwMl9WNEwyX0NJRF9HUkVFTl9CQUxBTkNFOgorCQlpZiAoc245YzEwMl9pMmNfdHJ5X3Jhd19yZWFkKGNhbSwgcywgcy0+aTJjX3NsYXZlX2lkLCAweDJlLAorCQkJCQkgICAgIDIrMSwgZGF0YSkgPCAwKQorCQkJcmV0dXJuIC1FSU87CisJCWN0cmwtPnZhbHVlID0gZGF0YVszXTsKKwkJcmV0dXJuIDA7CisJY2FzZSBWNEwyX0NJRF9IRkxJUDoKKwkJaWYgKHNuOWMxMDJfaTJjX3RyeV9yYXdfcmVhZChjYW0sIHMsIHMtPmkyY19zbGF2ZV9pZCwgMHgyMCwKKwkJCQkJICAgICAyKzEsIGRhdGEpIDwgMCkKKwkJCXJldHVybiAtRUlPOworCQljdHJsLT52YWx1ZSA9IGRhdGFbM10gJiAweDIwID8gMSA6IDA7CisJCXJldHVybiAwOworCWNhc2UgVjRMMl9DSURfVkZMSVA6CisJCWlmIChzbjljMTAyX2kyY190cnlfcmF3X3JlYWQoY2FtLCBzLCBzLT5pMmNfc2xhdmVfaWQsIDB4MjAsCisJCQkJCSAgICAgMisxLCBkYXRhKSA8IDApCisJCQlyZXR1cm4gLUVJTzsKKwkJY3RybC0+dmFsdWUgPSBkYXRhWzNdICYgMHg4MCA/IDEgOiAwOworCQlyZXR1cm4gMDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IG1pMDM2MF9zZXRfY3RybChzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSwKKwkJCSAgIGNvbnN0IHN0cnVjdCB2NGwyX2NvbnRyb2wqIGN0cmwpCit7CisJc3RydWN0IHNuOWMxMDJfc2Vuc29yKiBzID0gc245YzEwMl9nZXRfc2Vuc29yKGNhbSk7CisJaW50IGVyciA9IDA7CisKKwlzd2l0Y2ggKGN0cmwtPmlkKSB7CisJY2FzZSBWNEwyX0NJRF9FWFBPU1VSRToKKwkJZXJyICs9IHNuOWMxMDJfaTJjX3RyeV9yYXdfd3JpdGUoY2FtLCBzLCA0LCBzLT5pMmNfc2xhdmVfaWQsCisJCQkJCQkgMHgwOSwgY3RybC0+dmFsdWUsIDB4MDAsCisJCQkJCQkgMCwgMCk7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfR0FJTjoKKwkJZXJyICs9IHNuOWMxMDJfaTJjX3RyeV9yYXdfd3JpdGUoY2FtLCBzLCA0LCBzLT5pMmNfc2xhdmVfaWQsCisJCQkJCQkgMHgzNSwgMHgwMywgY3RybC0+dmFsdWUsCisJCQkJCQkgMCwgMCk7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfUkVEX0JBTEFOQ0U6CisJCWVyciArPSBzbjljMTAyX2kyY190cnlfcmF3X3dyaXRlKGNhbSwgcywgNCwgcy0+aTJjX3NsYXZlX2lkLAorCQkJCQkJIDB4MmMsIDB4MDMsIGN0cmwtPnZhbHVlLAorCQkJCQkJIDAsIDApOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX0JMVUVfQkFMQU5DRToKKwkJZXJyICs9IHNuOWMxMDJfaTJjX3RyeV9yYXdfd3JpdGUoY2FtLCBzLCA0LCBzLT5pMmNfc2xhdmVfaWQsCisJCQkJCQkgMHgyZCwgMHgwMywgY3RybC0+dmFsdWUsCisJCQkJCQkgMCwgMCk7CisJCWJyZWFrOworCWNhc2UgU045QzEwMl9WNEwyX0NJRF9HUkVFTl9CQUxBTkNFOgorCQllcnIgKz0gc245YzEwMl9pMmNfdHJ5X3Jhd193cml0ZShjYW0sIHMsIDQsIHMtPmkyY19zbGF2ZV9pZCwKKwkJCQkJCSAweDJiLCAweDAzLCBjdHJsLT52YWx1ZSwKKwkJCQkJCSAwLCAwKTsKKwkJZXJyICs9IHNuOWMxMDJfaTJjX3RyeV9yYXdfd3JpdGUoY2FtLCBzLCA0LCBzLT5pMmNfc2xhdmVfaWQsCisJCQkJCQkgMHgyZSwgMHgwMywgY3RybC0+dmFsdWUsCisJCQkJCQkgMCwgMCk7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfSEZMSVA6CisJCWVyciArPSBzbjljMTAyX2kyY190cnlfcmF3X3dyaXRlKGNhbSwgcywgNCwgcy0+aTJjX3NsYXZlX2lkLAorCQkJCQkJIDB4MjAsIGN0cmwtPnZhbHVlID8gMHg0MDoweDAwLAorCQkJCQkJIGN0cmwtPnZhbHVlID8gMHgyMDoweDAwLAorCQkJCQkJIDAsIDApOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX1ZGTElQOgorCQllcnIgKz0gc245YzEwMl9pMmNfdHJ5X3Jhd193cml0ZShjYW0sIHMsIDQsIHMtPmkyY19zbGF2ZV9pZCwKKwkJCQkJCSAweDIwLCBjdHJsLT52YWx1ZSA/IDB4ODA6MHgwMCwKKwkJCQkJCSBjdHJsLT52YWx1ZSA/IDB4ODA6MHgwMCwKKwkJCQkJCSAwLCAwKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIGVyciA/IC1FSU8gOiAwOworfQorCisKK3N0YXRpYyBpbnQgbWkwMzYwX3NldF9jcm9wKHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtLAorCQkJICAgIGNvbnN0IHN0cnVjdCB2NGwyX3JlY3QqIHJlY3QpCit7CisJc3RydWN0IHNuOWMxMDJfc2Vuc29yKiBzID0gc245YzEwMl9nZXRfc2Vuc29yKGNhbSk7CisJaW50IGVyciA9IDA7CisJdTggaF9zdGFydCA9ICh1OCkocmVjdC0+bGVmdCAtIHMtPmNyb3BjYXAuYm91bmRzLmxlZnQpICsgMCwKKwkgICB2X3N0YXJ0ID0gKHU4KShyZWN0LT50b3AgLSBzLT5jcm9wY2FwLmJvdW5kcy50b3ApICsgMTsKKworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIGhfc3RhcnQsIDB4MTIpOworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIHZfc3RhcnQsIDB4MTMpOworCisJcmV0dXJuIGVycjsKK30KKworCitzdGF0aWMgaW50IG1pMDM2MF9zZXRfcGl4X2Zvcm1hdChzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSwKKwkJCQkgY29uc3Qgc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCogcGl4KQoreworCXN0cnVjdCBzbjljMTAyX3NlbnNvciogcyA9IHNuOWMxMDJfZ2V0X3NlbnNvcihjYW0pOworCWludCBlcnIgPSAwOworCisJaWYgKHBpeC0+cGl4ZWxmb3JtYXQgPT0gVjRMMl9QSVhfRk1UX1NOOUMxMFgpIHsKKwkJZXJyICs9IHNuOWMxMDJfaTJjX3RyeV9yYXdfd3JpdGUoY2FtLCBzLCA0LCBzLT5pMmNfc2xhdmVfaWQsCisJCQkJCQkgMHgwYSwgMHgwMCwgMHgwMiwgMCwgMCk7CisJCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MjAsIDB4MTkpOworCX0gZWxzZSB7CisJCWVyciArPSBzbjljMTAyX2kyY190cnlfcmF3X3dyaXRlKGNhbSwgcywgNCwgcy0+aTJjX3NsYXZlX2lkLAorCQkJCQkJIDB4MGEsIDB4MDAsIDB4MDUsIDAsIDApOworCQllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDYwLCAweDE5KTsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCisKK3N0YXRpYyBzdHJ1Y3Qgc245YzEwMl9zZW5zb3IgbWkwMzYwID0geworCS5uYW1lID0gIk1JLTAzNjAiLAorCS5tYWludGFpbmVyID0gIkx1Y2EgUmlzb2xpYSA8bHVjYS5yaXNvbGlhQHN0dWRpby51bmliby5pdD4iLAorCS5zdXBwb3J0ZWRfYnJpZGdlID0gQlJJREdFX1NOOUMxMDMsCisJLmZyZXF1ZW5jeSA9IFNOOUMxMDJfSTJDXzEwMEtIWiwKKwkuaW50ZXJmYWNlID0gU045QzEwMl9JMkNfMldJUkVTLAorCS5pMmNfc2xhdmVfaWQgPSAweDVkLAorCS5pbml0ID0gJm1pMDM2MF9pbml0LAorCS5xY3RybCA9IHsKKwkJeworCQkJLmlkID0gVjRMMl9DSURfRVhQT1NVUkUsCisJCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCQkubmFtZSA9ICJleHBvc3VyZSIsCisJCQkubWluaW11bSA9IDB4MDAsCisJCQkubWF4aW11bSA9IDB4MGYsCisJCQkuc3RlcCA9IDB4MDEsCisJCQkuZGVmYXVsdF92YWx1ZSA9IDB4MDUsCisJCQkuZmxhZ3MgPSAwLAorCQl9LAorCQl7CisJCQkuaWQgPSBWNEwyX0NJRF9HQUlOLAorCQkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkJLm5hbWUgPSAiZ2xvYmFsIGdhaW4iLAorCQkJLm1pbmltdW0gPSAweDAwLAorCQkJLm1heGltdW0gPSAweDdmLAorCQkJLnN0ZXAgPSAweDAxLAorCQkJLmRlZmF1bHRfdmFsdWUgPSAweDI1LAorCQkJLmZsYWdzID0gMCwKKwkJfSwKKwkJeworCQkJLmlkID0gVjRMMl9DSURfSEZMSVAsCisJCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCisJCQkubmFtZSA9ICJob3Jpem9udGFsIG1pcnJvciIsCisJCQkubWluaW11bSA9IDAsCisJCQkubWF4aW11bSA9IDEsCisJCQkuc3RlcCA9IDEsCisJCQkuZGVmYXVsdF92YWx1ZSA9IDAsCisJCQkuZmxhZ3MgPSAwLAorCQl9LAorCQl7CisJCQkuaWQgPSBWNEwyX0NJRF9WRkxJUCwKKwkJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKKwkJCS5uYW1lID0gInZlcnRpY2FsIG1pcnJvciIsCisJCQkubWluaW11bSA9IDAsCisJCQkubWF4aW11bSA9IDEsCisJCQkuc3RlcCA9IDEsCisJCQkuZGVmYXVsdF92YWx1ZSA9IDAsCisJCQkuZmxhZ3MgPSAwLAorCQl9LAorCQl7CisJCQkuaWQgPSBWNEwyX0NJRF9CTFVFX0JBTEFOQ0UsCisJCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCQkubmFtZSA9ICJibHVlIGJhbGFuY2UiLAorCQkJLm1pbmltdW0gPSAweDAwLAorCQkJLm1heGltdW0gPSAweDdmLAorCQkJLnN0ZXAgPSAweDAxLAorCQkJLmRlZmF1bHRfdmFsdWUgPSAweDBmLAorCQkJLmZsYWdzID0gMCwKKwkJfSwKKwkJeworCQkJLmlkID0gVjRMMl9DSURfUkVEX0JBTEFOQ0UsCisJCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCQkubmFtZSA9ICJyZWQgYmFsYW5jZSIsCisJCQkubWluaW11bSA9IDB4MDAsCisJCQkubWF4aW11bSA9IDB4N2YsCisJCQkuc3RlcCA9IDB4MDEsCisJCQkuZGVmYXVsdF92YWx1ZSA9IDB4MzIsCisJCQkuZmxhZ3MgPSAwLAorCQl9LAorCQl7CisJCQkuaWQgPSBTTjlDMTAyX1Y0TDJfQ0lEX0dSRUVOX0JBTEFOQ0UsCisJCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCQkubmFtZSA9ICJncmVlbiBiYWxhbmNlIiwKKwkJCS5taW5pbXVtID0gMHgwMCwKKwkJCS5tYXhpbXVtID0gMHg3ZiwKKwkJCS5zdGVwID0gMHgwMSwKKwkJCS5kZWZhdWx0X3ZhbHVlID0gMHgyNSwKKwkJCS5mbGFncyA9IDAsCisJCX0sCisJfSwKKwkuZ2V0X2N0cmwgPSAmbWkwMzYwX2dldF9jdHJsLAorCS5zZXRfY3RybCA9ICZtaTAzNjBfc2V0X2N0cmwsCisJLmNyb3BjYXAgPSB7CisJCS5ib3VuZHMgPSB7CisJCQkubGVmdCA9IDAsCisJCQkudG9wID0gMCwKKwkJCS53aWR0aCA9IDY0MCwKKwkJCS5oZWlnaHQgPSA0ODAsCisJCX0sCisJCS5kZWZyZWN0ID0geworCQkJLmxlZnQgPSAwLAorCQkJLnRvcCA9IDAsCisJCQkud2lkdGggPSA2NDAsCisJCQkuaGVpZ2h0ID0gNDgwLAorCQl9LAorCX0sCisJLnNldF9jcm9wID0gJm1pMDM2MF9zZXRfY3JvcCwKKwkucGl4X2Zvcm1hdCA9IHsKKwkJLndpZHRoID0gNjQwLAorCQkuaGVpZ2h0ID0gNDgwLAorCQkucGl4ZWxmb3JtYXQgPSBWNEwyX1BJWF9GTVRfU0JHR1I4LAorCQkucHJpdiA9IDgsCisJfSwKKwkuc2V0X3BpeF9mb3JtYXQgPSAmbWkwMzYwX3NldF9waXhfZm9ybWF0Cit9OworCisKK2ludCBzbjljMTAyX3Byb2JlX21pMDM2MChzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSkKK3sKKwl1OCBkYXRhWzUrMV07CisJaW50IGVycjsKKworCWVyciA9IHNuOWMxMDJfd3JpdGVfY29uc3RfcmVncyhjYW0sIHsweDAxLCAweDAxfSwgezB4MDAsIDB4MDF9LAorCQkJCSAgICAgICB7MHgyOCwgMHgxN30pOworCWlmIChlcnIpCisJCXJldHVybiAtRUlPOworCisJaWYgKHNuOWMxMDJfaTJjX3RyeV9yYXdfcmVhZChjYW0sICZtaTAzNjAsIG1pMDM2MC5pMmNfc2xhdmVfaWQsIDB4MDAsCisJCQkJICAgICAyKzEsIGRhdGEpIDwgMCkKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAoZGF0YVsyXSAhPSAweDgyIHx8IGRhdGFbM10gIT0gMHg0MykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlzbjljMTAyX2F0dGFjaF9zZW5zb3IoY2FtLCAmbWkwMzYwKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zbjljMTAyL3NuOWMxMDJfb3Y3NjMwLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvc245YzEwMl9vdjc2MzAuYwppbmRleCA3ZGYwOWZmLi4zMWI2MDgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvc245YzEwMl9vdjc2MzAuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvc245YzEwMl9vdjc2MzAuYwpAQCAtMjIsOSArMjIsNiBAQAogI2luY2x1ZGUgInNuOWMxMDJfc2Vuc29yLmgiCiAKIAotc3RhdGljIHN0cnVjdCBzbjljMTAyX3NlbnNvciBvdjc2MzA7Ci0KLQogc3RhdGljIGludCBvdjc2MzBfaW5pdChzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSkKIHsKIAlpbnQgZXJyID0gMDsKQEAgLTMyLDIxICsyOSwyMCBAQAogCXN3aXRjaCAoc245YzEwMl9nZXRfYnJpZGdlKGNhbSkpIHsKIAljYXNlIEJSSURHRV9TTjlDMTAxOgogCWNhc2UgQlJJREdFX1NOOUMxMDI6Ci0JZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgwMCwgMHgxNCk7Ci0JZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHg2MCwgMHgxNyk7Ci0JZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgwZiwgMHgxOCk7Ci0JZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHg1MCwgMHgxOSk7CisJCWVyciA9IHNuOWMxMDJfd3JpdGVfY29uc3RfcmVncyhjYW0sIHsweDAwLCAweDE0fSwKKwkJCQkJICAgICAgIHsweDYwLCAweDE3fSwgezB4MGYsIDB4MTh9LAorCQkJCQkgICAgICAgezB4NTAsIDB4MTl9KTsKIAogCQllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDEyLCAweDhkKTsKIAkJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgxMiwgMHgwZCk7CiAJCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MTEsIDB4MDApOwotCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MTUsIDB4MzQpOwotCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MTYsIDB4MDMpOwotCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MTcsIDB4MWMpOwotCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MTgsIDB4YmQpOwotCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MTksIDB4MDYpOwotCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MWEsIDB4ZjYpOwotCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MWIsIDB4MDQpOworCQllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDE1LCAweDM1KTsKKwkJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgxNiwgMHgwMyk7CisJCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MTcsIDB4MWMpOworCQllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDE4LCAweGJkKTsKKwkJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgxOSwgMHgwNik7CisJCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MWEsIDB4ZjYpOworCQllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDFiLCAweDA0KTsKIAkJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgyMCwgMHg0NCk7CiAJCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MjMsIDB4ZWUpOwogCQllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDI2LCAweGEwKTsKQEAgLTY1LDQyICs2MSwyNiBAQAogCQllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDcxLCAweDAwKTsKIAkJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHg3NCwgMHgyMSk7CiAJCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4N2QsIDB4ZjcpOworCiAJCWJyZWFrOwogCWNhc2UgQlJJREdFX1NOOUMxMDM6Ci0JCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDAsIDB4MDIpOwotCQllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDAwLCAweDAzKTsKLQkJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgxYSwgMHgwNCk7Ci0JCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MjAsIDB4MDUpOwotCQllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDIwLCAweDA2KTsKLQkJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgyMCwgMHgwNyk7Ci0JCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDMsIDB4MTApOwotCQllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDBhLCAweDE0KTsKLQkJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHg2MCwgMHgxNyk7Ci0JCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MGYsIDB4MTgpOwotCQllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDUwLCAweDE5KTsKLQkJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgxZCwgMHgxYSk7Ci0JCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MTAsIDB4MWIpOwotCQllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDAyLCAweDFjKTsKLQkJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgwMywgMHgxZCk7Ci0JCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MGYsIDB4MWUpOwotCQllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDBjLCAweDFmKTsKLQkJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgwMCwgMHgyMCk7Ci0JCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MTAsIDB4MjEpOwotCQllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDIwLCAweDIyKTsKLQkJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgzMCwgMHgyMyk7Ci0JCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4NDAsIDB4MjQpOwotCQllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDUwLCAweDI1KTsKLQkJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHg2MCwgMHgyNik7Ci0JCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4NzAsIDB4MjcpOwotCQllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDgwLCAweDI4KTsKLQkJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHg5MCwgMHgyOSk7Ci0JCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4YTAsIDB4MmEpOwotCQllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweGIwLCAweDJiKTsKLQkJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHhjMCwgMHgyYyk7Ci0JCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4ZDAsIDB4MmQpOwotCQllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweGUwLCAweDJlKTsKLQkJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHhmMCwgMHgyZik7Ci0JCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4ZmYsIDB4MzApOworCQllcnIgPSBzbjljMTAyX3dyaXRlX2NvbnN0X3JlZ3MoY2FtLCB7MHgwMCwgMHgwMn0sIHsweDAwLCAweDAzfSwKKwkJCQkJICAgICAgIHsweDFhLCAweDA0fSwgezB4MjAsIDB4MDV9LAorCQkJCQkgICAgICAgezB4MjAsIDB4MDZ9LCB7MHgyMCwgMHgwN30sCisJCQkJCSAgICAgICB7MHgwMywgMHgxMH0sIHsweDBhLCAweDE0fSwKKwkJCQkJICAgICAgIHsweDYwLCAweDE3fSwgezB4MGYsIDB4MTh9LAorCQkJCQkgICAgICAgezB4NTAsIDB4MTl9LCB7MHgxZCwgMHgxYX0sCisJCQkJCSAgICAgICB7MHgxMCwgMHgxYn0sIHsweDAyLCAweDFjfSwKKwkJCQkJICAgICAgIHsweDAzLCAweDFkfSwgezB4MGYsIDB4MWV9LAorCQkJCQkgICAgICAgezB4MGMsIDB4MWZ9LCB7MHgwMCwgMHgyMH0sCisJCQkJCSAgICAgICB7MHgxMCwgMHgyMX0sIHsweDIwLCAweDIyfSwKKwkJCQkJICAgICAgIHsweDMwLCAweDIzfSwgezB4NDAsIDB4MjR9LAorCQkJCQkgICAgICAgezB4NTAsIDB4MjV9LCB7MHg2MCwgMHgyNn0sCisJCQkJCSAgICAgICB7MHg3MCwgMHgyN30sIHsweDgwLCAweDI4fSwKKwkJCQkJICAgICAgIHsweDkwLCAweDI5fSwgezB4YTAsIDB4MmF9LAorCQkJCQkgICAgICAgezB4YjAsIDB4MmJ9LCB7MHhjMCwgMHgyY30sCisJCQkJCSAgICAgICB7MHhkMCwgMHgyZH0sIHsweGUwLCAweDJlfSwKKwkJCQkJICAgICAgIHsweGYwLCAweDJmfSwgezB4ZmYsIDB4MzB9KTsKIAogCQllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDEyLCAweDhkKTsKIAkJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgxMiwgMHgwZCk7CkBAIC0xMDgsMjMgKzg4LDIzIEBACiAJCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MTEsIDB4MDEpOwogCQllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDFiLCAweDA0KTsKIAkJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgyMCwgMHg0NCk7Ci0JZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgyMywgMHhlZSk7Ci0JZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgyNiwgMHhhMCk7Ci0JZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgyNywgMHg5YSk7CisJCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MjMsIDB4ZWUpOworCQllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDI2LCAweGEwKTsKKwkJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgyNywgMHg5YSk7CiAJCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MjgsIDB4MjApOwotCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MjksIDB4MzApOwotCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MmYsIDB4M2QpOwotCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MzAsIDB4MjQpOwotCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MzIsIDB4ODYpOwotCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4NjAsIDB4YTkpOwotCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4NjEsIDB4NDIpOwotCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4NjUsIDB4MDApOwotCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4NjksIDB4MzgpOwotCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4NmYsIDB4ODgpOwotCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4NzAsIDB4MGIpOwotCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4NzEsIDB4MDApOwotCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4NzQsIDB4MjEpOwotCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4N2QsIDB4ZjcpOworCQllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDI5LCAweDMwKTsKKwkJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgyZiwgMHgzZCk7CisJCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MzAsIDB4MjQpOworCQllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDMyLCAweDg2KTsKKwkJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHg2MCwgMHhhOSk7CisJCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4NjEsIDB4NDIpOworCQllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDY1LCAweDAwKTsKKwkJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHg2OSwgMHgzOCk7CisJCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4NmYsIDB4ODgpOworCQllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDcwLCAweDBiKTsKKwkJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHg3MSwgMHgwMCk7CisJCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4NzQsIDB4MjEpOworCQllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDdkLCAweGY3KTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJYnJlYWs7CkBAIC00MjgsMTUgKzQwOCwxNCBAQAogCXN3aXRjaCAoc245YzEwMl9nZXRfYnJpZGdlKGNhbSkpIHsKIAljYXNlIEJSSURHRV9TTjlDMTAxOgogCWNhc2UgQlJJREdFX1NOOUMxMDI6Ci0JZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgwMSwgMHgwMSk7Ci0JZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgwMCwgMHgwMSk7Ci0JZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgyOCwgMHgxNyk7CisJCWVyciA9IHNuOWMxMDJfd3JpdGVfY29uc3RfcmVncyhjYW0sIHsweDAxLCAweDAxfSwKKwkJCQkJICAgICAgIHsweDAwLCAweDAxfSwgezB4MjgsIDB4MTd9KTsKKwogCQlicmVhazsKIAljYXNlIEJSSURHRV9TTjlDMTAzOiAvKiBkbyBfbm90XyBjaGFuZ2UgYW55dGhpbmchICovCi0JCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDksIDB4MDEpOwotCQllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDQyLCAweDAxKTsKLQkJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgyOCwgMHgxNyk7Ci0JCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4NDQsIDB4MDIpOworCQllcnIgPSBzbjljMTAyX3dyaXRlX2NvbnN0X3JlZ3MoY2FtLCB7MHgwOSwgMHgwMX0sCisJCQkJCSAgICAgICB7MHg0MiwgMHgwMX0sIHsweDI4LCAweDE3fSwKKwkJCQkJICAgICAgIHsweDQ0LCAweDAyfSk7CiAJCXBpZCA9IHNuOWMxMDJfaTJjX3RyeV9yZWFkKGNhbSwgJm92NzYzMCwgMHgwYSk7CiAJCWlmIChlcnIgfHwgcGlkIDwgMCkgeyAvKiB0cnkgYSBkaWZmZXJlbnQgaW5pdGlhbGl6YXRpb24gKi8KIAkJCWVyciA9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgwMSwgMHgwMSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvc245YzEwMl9vdjc2NjAuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX292NzY2MC5jCmluZGV4IGQ2NzBjMjQuLmM4OThlOTQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvc245YzEwMl9vdjc2NjAuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvc245YzEwMl9vdjc2NjAuYwpAQCAtMjIsMTYwICsyMiw4NCBAQAogI2luY2x1ZGUgInNuOWMxMDJfc2Vuc29yLmgiCiAKIAotc3RhdGljIHN0cnVjdCBzbjljMTAyX3NlbnNvciBvdjc2NjA7Ci0KLQogc3RhdGljIGludCBvdjc2NjBfaW5pdChzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSkKIHsKIAlpbnQgZXJyID0gMDsKIAotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4NDAsIDB4MDIpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDAsIDB4MDMpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MWEsIDB4MDQpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDMsIDB4MTApOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDgsIDB4MTQpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MjAsIDB4MTcpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4OGIsIDB4MTgpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDAsIDB4MTkpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MWQsIDB4MWEpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MTAsIDB4MWIpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDIsIDB4MWMpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDMsIDB4MWQpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MGYsIDB4MWUpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MGMsIDB4MWYpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDAsIDB4MjApOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MjksIDB4MjEpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4NDAsIDB4MjIpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4NTQsIDB4MjMpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4NjYsIDB4MjQpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4NzYsIDB4MjUpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4ODUsIDB4MjYpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4OTQsIDB4MjcpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4YTEsIDB4MjgpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4YWUsIDB4MjkpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4YmIsIDB4MmEpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4YzcsIDB4MmIpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4ZDMsIDB4MmMpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4ZGUsIDB4MmQpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4ZWEsIDB4MmUpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4ZjQsIDB4MmYpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4ZmYsIDB4MzApOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDAsIDB4M0YpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4QzcsIDB4NDApOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDEsIDB4NDEpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4NDQsIDB4NDIpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDAsIDB4NDMpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4NDQsIDB4NDQpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDAsIDB4NDUpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4NDQsIDB4NDYpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDAsIDB4NDcpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4QzcsIDB4NDgpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDEsIDB4NDkpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4QzcsIDB4NEEpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDEsIDB4NEIpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4QzcsIDB4NEMpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDEsIDB4NEQpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4NDQsIDB4NEUpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDAsIDB4NEYpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4NDQsIDB4NTApOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDAsIDB4NTEpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4NDQsIDB4NTIpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDAsIDB4NTMpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4QzcsIDB4NTQpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDEsIDB4NTUpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4QzcsIDB4NTYpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDEsIDB4NTcpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4QzcsIDB4NTgpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDEsIDB4NTkpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4NDQsIDB4NUEpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDAsIDB4NUIpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4NDQsIDB4NUMpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDAsIDB4NUQpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4NDQsIDB4NUUpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDAsIDB4NUYpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4QzcsIDB4NjApOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDEsIDB4NjEpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4QzcsIDB4NjIpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDEsIDB4NjMpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4QzcsIDB4NjQpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDEsIDB4NjUpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4NDQsIDB4NjYpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDAsIDB4NjcpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4NDQsIDB4NjgpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDAsIDB4NjkpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4NDQsIDB4NkEpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDAsIDB4NkIpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4QzcsIDB4NkMpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDEsIDB4NkQpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4QzcsIDB4NkUpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDEsIDB4NkYpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4QzcsIDB4NzApOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDEsIDB4NzEpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4NDQsIDB4NzIpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDAsIDB4NzMpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4NDQsIDB4NzQpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDAsIDB4NzUpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4NDQsIDB4NzYpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDAsIDB4NzcpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4QzcsIDB4NzgpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDEsIDB4NzkpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4QzcsIDB4N0EpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDEsIDB4N0IpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4QzcsIDB4N0MpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDEsIDB4N0QpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4NDQsIDB4N0UpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDAsIDB4N0YpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MTQsIDB4ODQpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDAsIDB4ODUpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MjcsIDB4ODYpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDAsIDB4ODcpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDcsIDB4ODgpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDAsIDB4ODkpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4RUMsIDB4OEEpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MGYsIDB4OEIpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4RDgsIDB4OEMpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MGYsIDB4OEQpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4M0QsIDB4OEUpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDAsIDB4OEYpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4M0QsIDB4OTApOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDAsIDB4OTEpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4Q0QsIDB4OTIpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MGYsIDB4OTMpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4ZjcsIDB4OTQpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MGYsIDB4OTUpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MEMsIDB4OTYpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDAsIDB4OTcpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDAsIDB4OTgpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4NjYsIDB4OTkpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDUsIDB4OUEpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDAsIDB4OUIpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDQsIDB4OUMpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDAsIDB4OUQpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDgsIDB4OUUpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDAsIDB4OUYpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MkQsIDB4QzApOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MkQsIDB4QzEpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4M0EsIDB4QzIpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDUsIDB4QzMpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDQsIDB4QzQpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4M0YsIDB4QzUpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDAsIDB4QzYpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDAsIDB4QzcpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4NTAsIDB4QzgpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4M0MsIDB4QzkpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MjgsIDB4Q0EpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4RDgsIDB4Q0IpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MTQsIDB4Q0MpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4RUMsIDB4Q0QpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MzIsIDB4Q0UpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4REQsIDB4Q0YpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MzIsIDB4RDApOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4REQsIDB4RDEpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4NkEsIDB4RDIpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4NTAsIDB4RDMpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDAsIDB4RDQpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDAsIDB4RDUpOwotCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDAsIDB4RDYpOworCWVyciA9IHNuOWMxMDJfd3JpdGVfY29uc3RfcmVncyhjYW0sIHsweDQwLCAweDAyfSwgezB4MDAsIDB4MDN9LAorCQkJCSAgICAgICB7MHgxYSwgMHgwNH0sIHsweDAzLCAweDEwfSwKKwkJCQkgICAgICAgezB4MDgsIDB4MTR9LCB7MHgyMCwgMHgxN30sCisJCQkJICAgICAgIHsweDhiLCAweDE4fSwgezB4MDAsIDB4MTl9LAorCQkJCSAgICAgICB7MHgxZCwgMHgxYX0sIHsweDEwLCAweDFifSwKKwkJCQkgICAgICAgezB4MDIsIDB4MWN9LCB7MHgwMywgMHgxZH0sCisJCQkJICAgICAgIHsweDBmLCAweDFlfSwgezB4MGMsIDB4MWZ9LAorCQkJCSAgICAgICB7MHgwMCwgMHgyMH0sIHsweDI5LCAweDIxfSwKKwkJCQkgICAgICAgezB4NDAsIDB4MjJ9LCB7MHg1NCwgMHgyM30sCisJCQkJICAgICAgIHsweDY2LCAweDI0fSwgezB4NzYsIDB4MjV9LAorCQkJCSAgICAgICB7MHg4NSwgMHgyNn0sIHsweDk0LCAweDI3fSwKKwkJCQkgICAgICAgezB4YTEsIDB4Mjh9LCB7MHhhZSwgMHgyOX0sCisJCQkJICAgICAgIHsweGJiLCAweDJhfSwgezB4YzcsIDB4MmJ9LAorCQkJCSAgICAgICB7MHhkMywgMHgyY30sIHsweGRlLCAweDJkfSwKKwkJCQkgICAgICAgezB4ZWEsIDB4MmV9LCB7MHhmNCwgMHgyZn0sCisJCQkJICAgICAgIHsweGZmLCAweDMwfSwgezB4MDAsIDB4M0Z9LAorCQkJCSAgICAgICB7MHhDNywgMHg0MH0sIHsweDAxLCAweDQxfSwKKwkJCQkgICAgICAgezB4NDQsIDB4NDJ9LCB7MHgwMCwgMHg0M30sCisJCQkJICAgICAgIHsweDQ0LCAweDQ0fSwgezB4MDAsIDB4NDV9LAorCQkJCSAgICAgICB7MHg0NCwgMHg0Nn0sIHsweDAwLCAweDQ3fSwKKwkJCQkgICAgICAgezB4QzcsIDB4NDh9LCB7MHgwMSwgMHg0OX0sCisJCQkJICAgICAgIHsweEM3LCAweDRBfSwgezB4MDEsIDB4NEJ9LAorCQkJCSAgICAgICB7MHhDNywgMHg0Q30sIHsweDAxLCAweDREfSwKKwkJCQkgICAgICAgezB4NDQsIDB4NEV9LCB7MHgwMCwgMHg0Rn0sCisJCQkJICAgICAgIHsweDQ0LCAweDUwfSwgezB4MDAsIDB4NTF9LAorCQkJCSAgICAgICB7MHg0NCwgMHg1Mn0sIHsweDAwLCAweDUzfSwKKwkJCQkgICAgICAgezB4QzcsIDB4NTR9LCB7MHgwMSwgMHg1NX0sCisJCQkJICAgICAgIHsweEM3LCAweDU2fSwgezB4MDEsIDB4NTd9LAorCQkJCSAgICAgICB7MHhDNywgMHg1OH0sIHsweDAxLCAweDU5fSwKKwkJCQkgICAgICAgezB4NDQsIDB4NUF9LCB7MHgwMCwgMHg1Qn0sCisJCQkJICAgICAgIHsweDQ0LCAweDVDfSwgezB4MDAsIDB4NUR9LAorCQkJCSAgICAgICB7MHg0NCwgMHg1RX0sIHsweDAwLCAweDVGfSwKKwkJCQkgICAgICAgezB4QzcsIDB4NjB9LCB7MHgwMSwgMHg2MX0sCisJCQkJICAgICAgIHsweEM3LCAweDYyfSwgezB4MDEsIDB4NjN9LAorCQkJCSAgICAgICB7MHhDNywgMHg2NH0sIHsweDAxLCAweDY1fSwKKwkJCQkgICAgICAgezB4NDQsIDB4NjZ9LCB7MHgwMCwgMHg2N30sCisJCQkJICAgICAgIHsweDQ0LCAweDY4fSwgezB4MDAsIDB4Njl9LAorCQkJCSAgICAgICB7MHg0NCwgMHg2QX0sIHsweDAwLCAweDZCfSwKKwkJCQkgICAgICAgezB4QzcsIDB4NkN9LCB7MHgwMSwgMHg2RH0sCisJCQkJICAgICAgIHsweEM3LCAweDZFfSwgezB4MDEsIDB4NkZ9LAorCQkJCSAgICAgICB7MHhDNywgMHg3MH0sIHsweDAxLCAweDcxfSwKKwkJCQkgICAgICAgezB4NDQsIDB4NzJ9LCB7MHgwMCwgMHg3M30sCisJCQkJICAgICAgIHsweDQ0LCAweDc0fSwgezB4MDAsIDB4NzV9LAorCQkJCSAgICAgICB7MHg0NCwgMHg3Nn0sIHsweDAwLCAweDc3fSwKKwkJCQkgICAgICAgezB4QzcsIDB4Nzh9LCB7MHgwMSwgMHg3OX0sCisJCQkJICAgICAgIHsweEM3LCAweDdBfSwgezB4MDEsIDB4N0J9LAorCQkJCSAgICAgICB7MHhDNywgMHg3Q30sIHsweDAxLCAweDdEfSwKKwkJCQkgICAgICAgezB4NDQsIDB4N0V9LCB7MHgwMCwgMHg3Rn0sCisJCQkJICAgICAgIHsweDE0LCAweDg0fSwgezB4MDAsIDB4ODV9LAorCQkJCSAgICAgICB7MHgyNywgMHg4Nn0sIHsweDAwLCAweDg3fSwKKwkJCQkgICAgICAgezB4MDcsIDB4ODh9LCB7MHgwMCwgMHg4OX0sCisJCQkJICAgICAgIHsweEVDLCAweDhBfSwgezB4MGYsIDB4OEJ9LAorCQkJCSAgICAgICB7MHhEOCwgMHg4Q30sIHsweDBmLCAweDhEfSwKKwkJCQkgICAgICAgezB4M0QsIDB4OEV9LCB7MHgwMCwgMHg4Rn0sCisJCQkJICAgICAgIHsweDNELCAweDkwfSwgezB4MDAsIDB4OTF9LAorCQkJCSAgICAgICB7MHhDRCwgMHg5Mn0sIHsweDBmLCAweDkzfSwKKwkJCQkgICAgICAgezB4ZjcsIDB4OTR9LCB7MHgwZiwgMHg5NX0sCisJCQkJICAgICAgIHsweDBDLCAweDk2fSwgezB4MDAsIDB4OTd9LAorCQkJCSAgICAgICB7MHgwMCwgMHg5OH0sIHsweDY2LCAweDk5fSwKKwkJCQkgICAgICAgezB4MDUsIDB4OUF9LCB7MHgwMCwgMHg5Qn0sCisJCQkJICAgICAgIHsweDA0LCAweDlDfSwgezB4MDAsIDB4OUR9LAorCQkJCSAgICAgICB7MHgwOCwgMHg5RX0sIHsweDAwLCAweDlGfSwKKwkJCQkgICAgICAgezB4MkQsIDB4QzB9LCB7MHgyRCwgMHhDMX0sCisJCQkJICAgICAgIHsweDNBLCAweEMyfSwgezB4MDUsIDB4QzN9LAorCQkJCSAgICAgICB7MHgwNCwgMHhDNH0sIHsweDNGLCAweEM1fSwKKwkJCQkgICAgICAgezB4MDAsIDB4QzZ9LCB7MHgwMCwgMHhDN30sCisJCQkJICAgICAgIHsweDUwLCAweEM4fSwgezB4M0MsIDB4Qzl9LAorCQkJCSAgICAgICB7MHgyOCwgMHhDQX0sIHsweEQ4LCAweENCfSwKKwkJCQkgICAgICAgezB4MTQsIDB4Q0N9LCB7MHhFQywgMHhDRH0sCisJCQkJICAgICAgIHsweDMyLCAweENFfSwgezB4REQsIDB4Q0Z9LAorCQkJCSAgICAgICB7MHgzMiwgMHhEMH0sIHsweERELCAweEQxfSwKKwkJCQkgICAgICAgezB4NkEsIDB4RDJ9LCB7MHg1MCwgMHhEM30sCisJCQkJICAgICAgIHsweDAwLCAweEQ0fSwgezB4MDAsIDB4RDV9LAorCQkJCSAgICAgICB7MHgwMCwgMHhENn0pOwogCiAJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgxMiwgMHg4MCk7CiAJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgxMSwgMHgwOSk7CkBAIC01NzIsMTMgKzQ5NiwxMSBAQAogCiBpbnQgc245YzEwMl9wcm9iZV9vdjc2NjAoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0pCiB7Ci0JaW50IHBpZCwgdmVyLCBlcnIgPSAwOworCWludCBwaWQsIHZlciwgZXJyOwogCi0JZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgwMSwgMHhmMSk7Ci0JZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgwMCwgMHhmMSk7Ci0JZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgwMSwgMHgwMSk7Ci0JZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgwMCwgMHgwMSk7Ci0JZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgyOCwgMHgxNyk7CisJZXJyID0gc245YzEwMl93cml0ZV9jb25zdF9yZWdzKGNhbSwgezB4MDEsIDB4ZjF9LCB7MHgwMCwgMHhmMX0sCisJCQkJICAgICAgIHsweDAxLCAweDAxfSwgezB4MDAsIDB4MDF9LAorCQkJCSAgICAgICB7MHgyOCwgMHgxN30pOwogCiAJcGlkID0gc245YzEwMl9pMmNfdHJ5X3JlYWQoY2FtLCAmb3Y3NjYwLCAweDBhKTsKIAl2ZXIgPSBzbjljMTAyX2kyY190cnlfcmVhZChjYW0sICZvdjc2NjAsIDB4MGIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zbjljMTAyL3NuOWMxMDJfcGFzMTA2Yi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zbjljMTAyL3NuOWMxMDJfcGFzMTA2Yi5jCmluZGV4IDhkNzlhNWYuLjY3MTUxOTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX3BhczEwNmIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvc245YzEwMl9wYXMxMDZiLmMKQEAgLTIzLDE5ICsyMywxMyBAQAogI2luY2x1ZGUgInNuOWMxMDJfc2Vuc29yLmgiCiAKIAotc3RhdGljIHN0cnVjdCBzbjljMTAyX3NlbnNvciBwYXMxMDZiOwotCi0KIHN0YXRpYyBpbnQgcGFzMTA2Yl9pbml0KHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtKQogewogCWludCBlcnIgPSAwOwogCi0JZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgwMCwgMHgxMCk7Ci0JZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgwMCwgMHgxMSk7Ci0JZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgwMCwgMHgxNCk7Ci0JZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgyMCwgMHgxNyk7Ci0JZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgyMCwgMHgxOSk7Ci0JZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgwOSwgMHgxOCk7CisJZXJyID0gc245YzEwMl93cml0ZV9jb25zdF9yZWdzKGNhbSwgezB4MDAsIDB4MTB9LCB7MHgwMCwgMHgxMX0sCisJCQkJICAgICAgIHsweDAwLCAweDE0fSwgezB4MjAsIDB4MTd9LAorCQkJCSAgICAgICB7MHgyMCwgMHgxOX0sIHsweDA5LCAweDE4fSk7CiAKIAllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDAyLCAweDBjKTsKIAllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDA1LCAweDVhKTsKQEAgLTE3Miw3ICsxNjYsNyBAQAogc3RhdGljIHN0cnVjdCBzbjljMTAyX3NlbnNvciBwYXMxMDZiID0gewogCS5uYW1lID0gIlBBUzEwNkIiLAogCS5tYWludGFpbmVyID0gIkx1Y2EgUmlzb2xpYSA8bHVjYS5yaXNvbGlhQHN0dWRpby51bmliby5pdD4iLAotCS5zdXBwb3J0ZWRfYnJpZGdlID0gQlJJREdFX1NOOUMxMDEgfCBCUklER0VfU045QzEwMiB8IEJSSURHRV9TTjlDMTAzLAorCS5zdXBwb3J0ZWRfYnJpZGdlID0gQlJJREdFX1NOOUMxMDEgfCBCUklER0VfU045QzEwMiwKIAkuc3lzZnNfb3BzID0gU045QzEwMl9JMkNfUkVBRCB8IFNOOUMxMDJfSTJDX1dSSVRFLAogCS5mcmVxdWVuY3kgPSBTTjlDMTAyX0kyQ180MDBLSFogfCBTTjlDMTAyX0kyQ18xMDBLSFosCiAJLmludGVyZmFjZSA9IFNOOUMxMDJfSTJDXzJXSVJFUywKQEAgLTI3OSwxNiArMjczLDE3IEBACiAKIGludCBzbjljMTAyX3Byb2JlX3BhczEwNmIoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0pCiB7Ci0JaW50IHIwID0gMCwgcjEgPSAwLCBlcnIgPSAwOworCWludCByMCA9IDAsIHIxID0gMCwgZXJyOwogCXVuc2lnbmVkIGludCBwaWQgPSAwOwogCiAJLyoKIAkgICBNaW5pbWFsIGluaXRpYWxpemF0aW9uIHRvIGVuYWJsZSB0aGUgSTJDIGNvbW11bmljYXRpb24KIAkgICBOT1RFOiBkbyBOT1QgY2hhbmdlIHRoZSB2YWx1ZXMhCiAJKi8KLQllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDAxLCAweDAxKTsgLyogc2Vuc29yIHBvd2VyIGRvd24gKi8KLQllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDAwLCAweDAxKTsgLyogc2Vuc29yIHBvd2VyIG9uICovCi0JZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgyOCwgMHgxNyk7IC8qIHNlbnNvciBjbG9jayBhdCAyNCBNSHogKi8KKwllcnIgPSBzbjljMTAyX3dyaXRlX2NvbnN0X3JlZ3MoY2FtLAorCQkJCSAgICAgICB7MHgwMSwgMHgwMX0sIC8qIHNlbnNvciBwb3dlciBkb3duICovCisJCQkJICAgICAgIHsweDAwLCAweDAxfSwgLyogc2Vuc29yIHBvd2VyIG9uICovCisJCQkJICAgICAgIHsweDI4LCAweDE3fSk7Lyogc2Vuc29yIGNsb2NrIDI0IE1IeiAqLwogCWlmIChlcnIpCiAJCXJldHVybiAtRUlPOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvc245YzEwMl9wYXMyMDJiY2IuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX3BhczIwMmJjYi5jCmluZGV4IDc4OTRmMDEuLmMxYjhkNmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX3BhczIwMmJjYi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX3BhczIwMmJjYi5jCkBAIC0yOCw5ICsyOCw2IEBACiAjaW5jbHVkZSAic245YzEwMl9zZW5zb3IuaCIKIAogCi1zdGF0aWMgc3RydWN0IHNuOWMxMDJfc2Vuc29yIHBhczIwMmJjYjsKLQotCiBzdGF0aWMgaW50IHBhczIwMmJjYl9pbml0KHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtKQogewogCWludCBlcnIgPSAwOwpAQCAtMzgsNDcgKzM1LDI5IEBACiAJc3dpdGNoIChzbjljMTAyX2dldF9icmlkZ2UoY2FtKSkgewogCWNhc2UgQlJJREdFX1NOOUMxMDE6CiAJY2FzZSBCUklER0VfU045QzEwMjoKLQllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDAwLCAweDEwKTsKLQllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDAwLCAweDExKTsKLQllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDAwLCAweDE0KTsKLQllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDIwLCAweDE3KTsKLQllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDMwLCAweDE5KTsKLQllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDA5LCAweDE4KTsKKwkJZXJyID0gc245YzEwMl93cml0ZV9jb25zdF9yZWdzKGNhbSwgezB4MDAsIDB4MTB9LAorCQkJCQkgICAgICAgezB4MDAsIDB4MTF9LCB7MHgwMCwgMHgxNH0sCisJCQkJCSAgICAgICB7MHgyMCwgMHgxN30sIHsweDMwLCAweDE5fSwKKwkJCQkJICAgICAgIHsweDA5LCAweDE4fSk7CiAJCWJyZWFrOwogCWNhc2UgQlJJREdFX1NOOUMxMDM6Ci0JCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDAsIDB4MDIpOwotCQllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDAwLCAweDAzKTsKLQkJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgxYSwgMHgwNCk7Ci0JCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MjAsIDB4MDUpOwotCQllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDIwLCAweDA2KTsKLQkJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgyMCwgMHgwNyk7Ci0JCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDAsIDB4MTApOwotCQllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDAwLCAweDExKTsKLQkJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgwMCwgMHgxNCk7Ci0JCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MjAsIDB4MTcpOwotCQllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDMwLCAweDE5KTsKLQkJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgwOSwgMHgxOCk7Ci0JCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDIsIDB4MWMpOwotCQllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDAzLCAweDFkKTsKLQkJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgwZiwgMHgxZSk7Ci0JCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MGMsIDB4MWYpOwotCQllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDAwLCAweDIwKTsKLQkJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgxMCwgMHgyMSk7Ci0JCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MjAsIDB4MjIpOwotCQllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDMwLCAweDIzKTsKLQkJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHg0MCwgMHgyNCk7Ci0JCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4NTAsIDB4MjUpOwotCQllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDYwLCAweDI2KTsKLQkJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHg3MCwgMHgyNyk7Ci0JCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4ODAsIDB4MjgpOwotCQllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDkwLCAweDI5KTsKLQkJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHhhMCwgMHgyYSk7Ci0JCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4YjAsIDB4MmIpOwotCQllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweGMwLCAweDJjKTsKLQkJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHhkMCwgMHgyZCk7Ci0JCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4ZTAsIDB4MmUpOwotCQllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweGYwLCAweDJmKTsKLQkJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHhmZiwgMHgzMCk7CisJCWVyciA9IHNuOWMxMDJfd3JpdGVfY29uc3RfcmVncyhjYW0sIHsweDAwLCAweDAyfSwKKwkJCQkJICAgICAgIHsweDAwLCAweDAzfSwgezB4MWEsIDB4MDR9LAorCQkJCQkgICAgICAgezB4MjAsIDB4MDV9LCB7MHgyMCwgMHgwNn0sCisJCQkJCSAgICAgICB7MHgyMCwgMHgwN30sIHsweDAwLCAweDEwfSwKKwkJCQkJICAgICAgIHsweDAwLCAweDExfSwgezB4MDAsIDB4MTR9LAorCQkJCQkgICAgICAgezB4MjAsIDB4MTd9LCB7MHgzMCwgMHgxOX0sCisJCQkJCSAgICAgICB7MHgwOSwgMHgxOH0sIHsweDAyLCAweDFjfSwKKwkJCQkJICAgICAgIHsweDAzLCAweDFkfSwgezB4MGYsIDB4MWV9LAorCQkJCQkgICAgICAgezB4MGMsIDB4MWZ9LCB7MHgwMCwgMHgyMH0sCisJCQkJCSAgICAgICB7MHgxMCwgMHgyMX0sIHsweDIwLCAweDIyfSwKKwkJCQkJICAgICAgIHsweDMwLCAweDIzfSwgezB4NDAsIDB4MjR9LAorCQkJCQkgICAgICAgezB4NTAsIDB4MjV9LCB7MHg2MCwgMHgyNn0sCisJCQkJCSAgICAgICB7MHg3MCwgMHgyN30sIHsweDgwLCAweDI4fSwKKwkJCQkJICAgICAgIHsweDkwLCAweDI5fSwgezB4YTAsIDB4MmF9LAorCQkJCQkgICAgICAgezB4YjAsIDB4MmJ9LCB7MHhjMCwgMHgyY30sCisJCQkJCSAgICAgICB7MHhkMCwgMHgyZH0sIHsweGUwLCAweDJlfSwKKwkJCQkJICAgICAgIHsweGYwLCAweDJmfSwgezB4ZmYsIDB4MzB9KTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJYnJlYWs7CkBAIC0zMjgsMTUgKzMwNywxNSBAQAogCXN3aXRjaCAoc245YzEwMl9nZXRfYnJpZGdlKGNhbSkpIHsKIAljYXNlIEJSSURHRV9TTjlDMTAxOgogCWNhc2UgQlJJREdFX1NOOUMxMDI6Ci0JCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDEsIDB4MDEpOyAvKiBwb3dlciBkb3duICovCi0JCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4NDAsIDB4MDEpOyAvKiBwb3dlciBvbiAqLwotCQllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDI4LCAweDE3KTsgLyogY2xvY2sgMjQgTUh6ICovCisJCWVyciA9IHNuOWMxMDJfd3JpdGVfY29uc3RfcmVncyhjYW0sCisJCQkJCSAgICAgICB7MHgwMSwgMHgwMX0sIC8qIHBvd2VyIGRvd24gKi8KKwkJCQkJICAgICAgIHsweDQwLCAweDAxfSwgLyogcG93ZXIgb24gKi8KKwkJCQkJICAgICAgIHsweDI4LCAweDE3fSk7LyogY2xvY2sgMjQgTUh6ICovCiAJCWJyZWFrOwogCWNhc2UgQlJJREdFX1NOOUMxMDM6IC8qIGRvIF9ub3RfIGNoYW5nZSBhbnl0aGluZyEgKi8KLQkJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgwOSwgMHgwMSk7Ci0JCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4NDQsIDB4MDEpOwotCQllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDQ0LCAweDAyKTsKLQkJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgyOSwgMHgxNyk7CisJCWVyciA9IHNuOWMxMDJfd3JpdGVfY29uc3RfcmVncyhjYW0sIHsweDA5LCAweDAxfSwKKwkJCQkJICAgICAgIHsweDQ0LCAweDAxfSwgezB4NDQsIDB4MDJ9LAorCQkJCQkgICAgICAgezB4MjksIDB4MTd9KTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvc245YzEwMl9zZW5zb3IuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX3NlbnNvci5oCmluZGV4IDA1ZjI5NDIuLjFiYmY2NGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX3NlbnNvci5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX3NlbnNvci5oCkBAIC0xMTQsOSArMTE0LDE3IEBACiBleHRlcm4gaW50IHNuOWMxMDJfaTJjX3JlYWQoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiwgdTggYWRkcmVzcyk7CiAKIC8qIEkvTyBvbiByZWdpc3RlcnMgaW4gdGhlIGJyaWRnZS4gQ291bGQgYmUgdXNlZCBieSB0aGUgc2Vuc29yIG1ldGhvZHMgdG9vICovCi1leHRlcm4gaW50IHNuOWMxMDJfd3JpdGVfcmVncyhzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqLCB1OCogYnVmZiwgdTE2IGluZGV4KTsKLWV4dGVybiBpbnQgc245YzEwMl93cml0ZV9yZWcoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiwgdTggdmFsdWUsIHUxNiBpbmRleCk7CiBleHRlcm4gaW50IHNuOWMxMDJfcHJlYWRfcmVnKHN0cnVjdCBzbjljMTAyX2RldmljZSosIHUxNiBpbmRleCk7CitleHRlcm4gaW50IHNuOWMxMDJfd3JpdGVfcmVnKHN0cnVjdCBzbjljMTAyX2RldmljZSosIHU4IHZhbHVlLCB1MTYgaW5kZXgpOworZXh0ZXJuIGludCBzbjljMTAyX3dyaXRlX3JlZ3Moc3RydWN0IHNuOWMxMDJfZGV2aWNlKiwgY29uc3QgdTggdmFscmVnW11bMl0sCisJCQkgICAgICBpbnQgY291bnQpOworLyoKKyAqIFdyaXRlIG11bHRpcGxlIHJlZ2lzdGVycyB3aXRoIGNvbnN0YW50IHZhbHVlcy4gIEZvciBleGFtcGxlOgorICogc245YzEwMl93cml0ZV9jb25zdF9yZWdzKGNhbSwgezB4MDAsIDB4MTR9LCB7MHg2MCwgMHgxN30sIHsweDBmLCAweDE4fSk7CisgKi8KKyNkZWZpbmUgc245YzEwMl93cml0ZV9jb25zdF9yZWdzKGRldmljZSwgZGF0YS4uLikgXAorCSh7IGNvbnN0IHN0YXRpYyB1OCBfZGF0YVtdWzJdID0ge2RhdGF9OyBcCisJc245YzEwMl93cml0ZV9yZWdzKGRldmljZSwgX2RhdGEsIEFSUkFZX1NJWkUoX2RhdGEpKTsgfSkKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvc245YzEwMl90YXM1MTEwYzFiLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvc245YzEwMl90YXM1MTEwYzFiLmMKaW5kZXggOTAwMjNhZC4uMGU3ZWM4NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zbjljMTAyL3NuOWMxMDJfdGFzNTExMGMxYi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX3RhczUxMTBjMWIuYwpAQCAtMjIsMjEgKzIyLDE0IEBACiAjaW5jbHVkZSAic245YzEwMl9zZW5zb3IuaCIKIAogCi1zdGF0aWMgc3RydWN0IHNuOWMxMDJfc2Vuc29yIHRhczUxMTBjMWI7Ci0KLQogc3RhdGljIGludCB0YXM1MTEwYzFiX2luaXQoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0pCiB7CiAJaW50IGVyciA9IDA7CiAKLQllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDAxLCAweDAxKTsKLQllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDQ0LCAweDAxKTsKLQllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDAwLCAweDEwKTsKLQllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDAwLCAweDExKTsKLQllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDBhLCAweDE0KTsKLQllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDYwLCAweDE3KTsKLQllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDA2LCAweDE4KTsKLQllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweGZiLCAweDE5KTsKKwllcnIgPSBzbjljMTAyX3dyaXRlX2NvbnN0X3JlZ3MoY2FtLCB7MHgwMSwgMHgwMX0sIHsweDQ0LCAweDAxfSwKKwkJCQkgICAgICAgezB4MDAsIDB4MTB9LCB7MHgwMCwgMHgxMX0sCisJCQkJICAgICAgIHsweDBhLCAweDE0fSwgezB4NjAsIDB4MTd9LAorCQkJCSAgICAgICB7MHgwNiwgMHgxOH0sIHsweGZiLCAweDE5fSk7CiAKIAllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweGMwLCAweDgwKTsKIApAQCAtOTgsNyArOTEsNyBAQAogc3RhdGljIHN0cnVjdCBzbjljMTAyX3NlbnNvciB0YXM1MTEwYzFiID0gewogCS5uYW1lID0gIlRBUzUxMTBDMUIiLAogCS5tYWludGFpbmVyID0gIkx1Y2EgUmlzb2xpYSA8bHVjYS5yaXNvbGlhQHN0dWRpby51bmliby5pdD4iLAotCS5zdXBwb3J0ZWRfYnJpZGdlID0gQlJJREdFX1NOOUMxMDEgfCBCUklER0VfU045QzEwMiB8IEJSSURHRV9TTjlDMTAzLAorCS5zdXBwb3J0ZWRfYnJpZGdlID0gQlJJREdFX1NOOUMxMDEgfCBCUklER0VfU045QzEwMiwKIAkuc3lzZnNfb3BzID0gU045QzEwMl9JMkNfV1JJVEUsCiAJLmZyZXF1ZW5jeSA9IFNOOUMxMDJfSTJDXzEwMEtIWiwKIAkuaW50ZXJmYWNlID0gU045QzEwMl9JMkNfM1dJUkVTLApAQCAtMTQ2LDcgKzEzOSw2IEBACiAJY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgdGFzNTExMGMxYl9pZF90YWJsZVtdID0gewogCQl7IFVTQl9ERVZJQ0UoMHgwYzQ1LCAweDYwMDEpLCB9LAogCQl7IFVTQl9ERVZJQ0UoMHgwYzQ1LCAweDYwMDUpLCB9LAotCQl7IFVTQl9ERVZJQ0UoMHgwYzQ1LCAweDYwMDcpLCB9LAogCQl7IFVTQl9ERVZJQ0UoMHgwYzQ1LCAweDYwYWIpLCB9LAogCQl7IH0KIAl9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zbjljMTAyL3NuOWMxMDJfdGFzNTExMGQuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX3RhczUxMTBkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNhMzllOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX3RhczUxMTBkLmMKQEAgLTAsMCArMSwxMTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFBsdWctaW4gZm9yIFRBUzUxMTBEIGltYWdlIHNlbnNvciBjb25uZWN0ZWQgdG8gdGhlIFNOOUMxeHggUEMgQ2FtZXJhICAgICoKKyAqIENvbnRyb2xsZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBieSBMdWNhIFJpc29saWEgPGx1Y2Eucmlzb2xpYUBzdHVkaW8udW5pYm8uaXQ+ICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlICAgICAgICAgICAgICoKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLiAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJzbjljMTAyX3NlbnNvci5oIgorCisKK3N0YXRpYyBpbnQgdGFzNTExMGRfaW5pdChzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSkKK3sKKwlpbnQgZXJyOworCisJZXJyID0gc245YzEwMl93cml0ZV9jb25zdF9yZWdzKGNhbSwgezB4MDEsIDB4MDF9LCB7MHgwNCwgMHgwMX0sCisJCQkJICAgICAgIHsweDBhLCAweDE0fSwgezB4NjAsIDB4MTd9LAorCQkJCSAgICAgICB7MHgwNiwgMHgxOH0sIHsweGZiLCAweDE5fSk7CisKKwllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDlhLCAweGNhKTsKKworCXJldHVybiBlcnI7Cit9CisKKworc3RhdGljIGludCB0YXM1MTEwZF9zZXRfY3JvcChzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSwKKwkJCSAgICAgY29uc3Qgc3RydWN0IHY0bDJfcmVjdCogcmVjdCkKK3sKKwlzdHJ1Y3Qgc245YzEwMl9zZW5zb3IqIHMgPSBzbjljMTAyX2dldF9zZW5zb3IoY2FtKTsKKwlpbnQgZXJyID0gMDsKKwl1OCBoX3N0YXJ0ID0gKHU4KShyZWN0LT5sZWZ0IC0gcy0+Y3JvcGNhcC5ib3VuZHMubGVmdCkgKyA2OSwKKwkgICB2X3N0YXJ0ID0gKHU4KShyZWN0LT50b3AgLSBzLT5jcm9wY2FwLmJvdW5kcy50b3ApICsgOTsKKworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIGhfc3RhcnQsIDB4MTIpOworCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIHZfc3RhcnQsIDB4MTMpOworCisJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgxNCwgMHgxYSk7CisJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgwYSwgMHgxYik7CisKKwlyZXR1cm4gZXJyOworfQorCisKK3N0YXRpYyBpbnQgdGFzNTExMGRfc2V0X3BpeF9mb3JtYXQoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0sCisJCQkJICAgICBjb25zdCBzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0KiBwaXgpCit7CisJaW50IGVyciA9IDA7CisKKwlpZiAocGl4LT5waXhlbGZvcm1hdCA9PSBWNEwyX1BJWF9GTVRfU045QzEwWCkKKwkJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgzYiwgMHgxOSk7CisJZWxzZQorCQllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweGZiLCAweDE5KTsKKworCXJldHVybiBlcnI7Cit9CisKKworc3RhdGljIHN0cnVjdCBzbjljMTAyX3NlbnNvciB0YXM1MTEwZCA9IHsKKwkubmFtZSA9ICJUQVM1MTEwRCIsCisJLm1haW50YWluZXIgPSAiTHVjYSBSaXNvbGlhIDxsdWNhLnJpc29saWFAc3R1ZGlvLnVuaWJvLml0PiIsCisJLnN1cHBvcnRlZF9icmlkZ2UgPSBCUklER0VfU045QzEwMSB8IEJSSURHRV9TTjlDMTAyLAorCS5zeXNmc19vcHMgPSBTTjlDMTAyX0kyQ19XUklURSwKKwkuZnJlcXVlbmN5ID0gU045QzEwMl9JMkNfMTAwS0haLAorCS5pbnRlcmZhY2UgPSBTTjlDMTAyX0kyQ18yV0lSRVMsCisJLmkyY19zbGF2ZV9pZCA9IDB4NjEsCisJLmluaXQgPSAmdGFzNTExMGRfaW5pdCwKKwkuY3JvcGNhcCA9IHsKKwkJLmJvdW5kcyA9IHsKKwkJCS5sZWZ0ID0gMCwKKwkJCS50b3AgPSAwLAorCQkJLndpZHRoID0gMzUyLAorCQkJLmhlaWdodCA9IDI4OCwKKwkJfSwKKwkJLmRlZnJlY3QgPSB7CisJCQkubGVmdCA9IDAsCisJCQkudG9wID0gMCwKKwkJCS53aWR0aCA9IDM1MiwKKwkJCS5oZWlnaHQgPSAyODgsCisJCX0sCisJfSwKKwkuc2V0X2Nyb3AgPSAmdGFzNTExMGRfc2V0X2Nyb3AsCisJLnBpeF9mb3JtYXQgPSB7CisJCS53aWR0aCA9IDM1MiwKKwkJLmhlaWdodCA9IDI4OCwKKwkJLnBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX1NCR0dSOCwKKwkJLnByaXYgPSA4LAorCX0sCisJLnNldF9waXhfZm9ybWF0ID0gJnRhczUxMTBkX3NldF9waXhfZm9ybWF0Cit9OworCisKK2ludCBzbjljMTAyX3Byb2JlX3RhczUxMTBkKHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtKQoreworCWNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkIHRhczUxMTBkX2lkX3RhYmxlW10gPSB7CisJCXsgVVNCX0RFVklDRSgweDBjNDUsIDB4NjAwNyksIH0sCisJCXsgfQorCX07CisKKwlpZiAoIXNuOWMxMDJfbWF0Y2hfaWQoY2FtLCB0YXM1MTEwZF9pZF90YWJsZSkpCisJCXJldHVybiAtRU5PREVWOworCisJc245YzEwMl9hdHRhY2hfc2Vuc29yKGNhbSwgJnRhczUxMTBkKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zbjljMTAyL3NuOWMxMDJfdGFzNTEzMGQxYi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zbjljMTAyL3NuOWMxMDJfdGFzNTEzMGQxYi5jCmluZGV4IGNiMWIzMTguLjUwNDA2NTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX3RhczUxMzBkMWIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvc245YzEwMl90YXM1MTMwZDFiLmMKQEAgLTIyLDIxICsyMiwxNCBAQAogI2luY2x1ZGUgInNuOWMxMDJfc2Vuc29yLmgiCiAKIAotc3RhdGljIHN0cnVjdCBzbjljMTAyX3NlbnNvciB0YXM1MTMwZDFiOwotCi0KIHN0YXRpYyBpbnQgdGFzNTEzMGQxYl9pbml0KHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtKQogewotCWludCBlcnIgPSAwOworCWludCBlcnI7CiAKLQllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDAxLCAweDAxKTsKLQllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDIwLCAweDE3KTsKLQllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDA0LCAweDAxKTsKLQllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDAxLCAweDEwKTsKLQllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDAwLCAweDExKTsKLQllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDAwLCAweDE0KTsKLQllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDYwLCAweDE3KTsKLQllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweDA3LCAweDE4KTsKKwllcnIgPSBzbjljMTAyX3dyaXRlX2NvbnN0X3JlZ3MoY2FtLCB7MHgwMSwgMHgwMX0sIHsweDIwLCAweDE3fSwKKwkJCQkgICAgICAgezB4MDQsIDB4MDF9LCB7MHgwMSwgMHgxMH0sCisJCQkJICAgICAgIHsweDAwLCAweDExfSwgezB4MDAsIDB4MTR9LAorCQkJCSAgICAgICB7MHg2MCwgMHgxN30sIHsweDA3LCAweDE4fSk7CiAKIAlyZXR1cm4gZXJyOwogfQpAQCAtOTksNyArOTIsNyBAQAogc3RhdGljIHN0cnVjdCBzbjljMTAyX3NlbnNvciB0YXM1MTMwZDFiID0gewogCS5uYW1lID0gIlRBUzUxMzBEMUIiLAogCS5tYWludGFpbmVyID0gIkx1Y2EgUmlzb2xpYSA8bHVjYS5yaXNvbGlhQHN0dWRpby51bmliby5pdD4iLAotCS5zdXBwb3J0ZWRfYnJpZGdlID0gQlJJREdFX1NOOUMxMDEgfCBCUklER0VfU045QzEwMiB8IEJSSURHRV9TTjlDMTAzLAorCS5zdXBwb3J0ZWRfYnJpZGdlID0gQlJJREdFX1NOOUMxMDEgfCBCUklER0VfU045QzEwMiwKIAkuc3lzZnNfb3BzID0gU045QzEwMl9JMkNfV1JJVEUsCiAJLmZyZXF1ZW5jeSA9IFNOOUMxMDJfSTJDXzEwMEtIWiwKIAkuaW50ZXJmYWNlID0gU045QzEwMl9JMkNfM1dJUkVTLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby90ZGE3NDMyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3RkYTc0MzIuYwppbmRleCBkMWNjYzA2Li40MzIyNTgwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby90ZGE3NDMyLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby90ZGE3NDMyLmMKQEAgLTQ1LDcgKzQ1LDYgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KLSNpbmNsdWRlIDxsaW51eC9pMmMtYWxnby1iaXQuaD4KIAogI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CiAjaW5jbHVkZSA8bWVkaWEvaTJjLWFkZHIuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGRhODI5MC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby90ZGE4MjkwLmMKaW5kZXggMDI3YzhhMC4uMWExYmVmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby90ZGE4MjkwLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby90ZGE4MjkwLmMKQEAgLTE5MiwxNCArMTkyLDUyIEBACiAJeyAubG9tYXggPSAgICAgMCwgLnN2Y28gPSAwLCAuc3BkID0gMCwgLnNjciA9IDAsIC5zYnMgPSAwLCAuZ2MzID0gMH0gICAvKiBFbmQgKi8KIH07CiAKK3N0YXRpYyB2b2lkIHRkYTgyN3hhX2xuYV9nYWluKHN0cnVjdCBpMmNfY2xpZW50ICpjLCBpbnQgaGlnaCkKK3sKKwlzdHJ1Y3QgdHVuZXIgKnQgPSBpMmNfZ2V0X2NsaWVudGRhdGEoYyk7CisJdW5zaWduZWQgY2hhciBidWZbXSA9IHsweDIyLCAweDAxfTsKKwlpbnQgYXJnOworCXN0cnVjdCBpMmNfbXNnIG1zZyA9IHsuYWRkciA9IGMtPmFkZHIsIC5mbGFncyA9IDAsIC5idWYgPSBidWYsIC5sZW4gPSBzaXplb2YoYnVmKX07CisJaWYgKHQtPmNvbmZpZykgeworCQlpZiAoaGlnaCkKKwkJCXR1bmVyX2RiZygic2V0dGluZyBMTkEgdG8gaGlnaCBnYWluXG4iKTsKKwkJZWxzZQorCQkJdHVuZXJfZGJnKCJzZXR0aW5nIExOQSB0byBsb3cgZ2FpblxuIik7CisJfQorCXN3aXRjaCAodC0+Y29uZmlnKSB7CisJY2FzZSAwOiAvKiBubyBMTkEgKi8KKwkJYnJlYWs7CisJY2FzZSAxOiAvKiBzd2l0Y2ggaXMgR1BJTyAwIG9mIHRkYTgyOTAgKi8KKwljYXNlIDI6CisJCS8qIHR1cm4gVnN5bmMgb24gKi8KKwkJaWYgKHQtPnN0ZCAmIFY0TDJfU1REX01OKQorCQkJYXJnID0gMTsKKwkJZWxzZQorCQkJYXJnID0gMDsKKwkJaWYgKHQtPnR1bmVyX2NhbGxiYWNrKQorCQkJdC0+dHVuZXJfY2FsbGJhY2soYy0+YWRhcHRlci0+YWxnb19kYXRhLCAxLCBhcmcpOworCQlidWZbMV0gPSBoaWdoID8gMCA6IDE7CisJCWlmICh0LT5jb25maWcgPT0gMikKKwkJCWJ1ZlsxXSA9IGhpZ2ggPyAxIDogMDsKKwkJaTJjX3RyYW5zZmVyKGMtPmFkYXB0ZXIsICZtc2csIDEpOworCQlicmVhazsKKwljYXNlIDM6IC8qIHN3aXRjaCB3aXRoIEdQSU8gb2Ygc2FhNzEzeCAqLworCQlpZiAodC0+dHVuZXJfY2FsbGJhY2spCisJCQl0LT50dW5lcl9jYWxsYmFjayhjLT5hZGFwdGVyLT5hbGdvX2RhdGEsIDAsIGhpZ2gpOworCQlicmVhazsKKwl9Cit9CisKIHN0YXRpYyB2b2lkIHRkYTgyN3hhX3R1bmUoc3RydWN0IGkyY19jbGllbnQgKmMsIHUxNiBpZmMsIHVuc2lnbmVkIGludCBmcmVxKQogewotCXVuc2lnbmVkIGNoYXIgdHVuZXJfcmVnWzE0XTsKLQl1bnNpZ25lZCBjaGFyIHJlZzJbMl07CisJdW5zaWduZWQgY2hhciB0dW5lcl9yZWdbMTFdOwogCXUzMiBOOwogCWludCBpOwogCXN0cnVjdCB0dW5lciAqdCA9IGkyY19nZXRfY2xpZW50ZGF0YShjKTsKLQlzdHJ1Y3QgaTJjX21zZyBtc2cgPSB7LmFkZHIgPSB0LT50ZGE4Mjd4X2FkZHIsIC5mbGFncyA9IDB9OworCXN0cnVjdCBpMmNfbXNnIG1zZyA9IHsuYWRkciA9IHQtPnRkYTgyN3hfYWRkciwgLmZsYWdzID0gMCwgLmJ1ZiA9IHR1bmVyX3JlZ307CisKKwl0ZGE4Mjd4YV9sbmFfZ2FpbiggYywgMSk7CisJbXNsZWVwKDEwKTsKIAogCWlmICh0LT5tb2RlID09IFY0TDJfVFVORVJfUkFESU8pCiAJCWZyZXEgPSBmcmVxIC8gMTAwMDsKQEAgLTIyMiw0OCArMjYwLDU4IEBACiAJdHVuZXJfcmVnWzVdID0gKHRkYTgyN3hhX2FuYWxvZ1tpXS5zcGQgPDwgNSkgKyAodGRhODI3eGFfYW5hbG9nW2ldLnN2Y28gPDwgMykgKwogCQkJdGRhODI3eGFfYW5hbG9nW2ldLnNiczsKIAl0dW5lcl9yZWdbNl0gPSAweDhiICsgKHRkYTgyN3hhX2FuYWxvZ1tpXS5nYzMgPDwgNCk7Ci0JdHVuZXJfcmVnWzddID0gMHgwYzsKKwl0dW5lcl9yZWdbN10gPSAweDFjOwogCXR1bmVyX3JlZ1s4XSA9IDQ7CiAJdHVuZXJfcmVnWzldID0gMHgyMDsKLQl0dW5lcl9yZWdbMTBdID0gMHhmZjsKLQl0dW5lcl9yZWdbMTFdID0gMHhlMDsKLQl0dW5lcl9yZWdbMTJdID0gMDsKLQl0dW5lcl9yZWdbMTNdID0gMHgzOSArICh0LT50ZGE4Mjd4X2xwc2VsIDw8IDEpOwotCi0JbXNnLmJ1ZiA9IHR1bmVyX3JlZzsKLQltc2cubGVuID0gMTQ7CisJdHVuZXJfcmVnWzEwXSA9IDB4MDA7CisJbXNnLmxlbiA9IDExOwogCWkyY190cmFuc2ZlcihjLT5hZGFwdGVyLCAmbXNnLCAxKTsKIAotCW1zZy5idWY9IHJlZzI7CisJdHVuZXJfcmVnWzBdID0gMHg5MDsKKwl0dW5lcl9yZWdbMV0gPSAweGZmOworCXR1bmVyX3JlZ1syXSA9IDB4ZTA7CisJdHVuZXJfcmVnWzNdID0gMDsKKwl0dW5lcl9yZWdbNF0gPSAweDk5ICsgKHQtPnRkYTgyN3hfbHBzZWwgPDwgMSk7CisJbXNnLmxlbiA9IDU7CisJaTJjX3RyYW5zZmVyKGMtPmFkYXB0ZXIsICZtc2csIDEpOworCisJdHVuZXJfcmVnWzBdID0gMHhhMDsKKwl0dW5lcl9yZWdbMV0gPSAweGMwOwogCW1zZy5sZW4gPSAyOwotCXJlZzJbMF0gPSAweDYwOwotCXJlZzJbMV0gPSAweDNjOwogCWkyY190cmFuc2ZlcihjLT5hZGFwdGVyLCAmbXNnLCAxKTsKIAotCXJlZzJbMF0gPSAweGEwOwotCXJlZzJbMV0gPSAweGMwOworCXR1bmVyX3JlZ1swXSA9IDB4MzA7CisJdHVuZXJfcmVnWzFdID0gMHgxMCArIHRkYTgyN3hhX2FuYWxvZ1tpXS5zY3I7CiAJaTJjX3RyYW5zZmVyKGMtPmFkYXB0ZXIsICZtc2csIDEpOwogCi0JbXNsZWVwKDIpOwotCXJlZzJbMF0gPSAweDMwOwotCXJlZzJbMV0gPSAweDEwICsgdGRhODI3eGFfYW5hbG9nW2ldLnNjcjsKKwltc2cuZmxhZ3MgPSBJMkNfTV9SRDsKKwlpMmNfdHJhbnNmZXIoYy0+YWRhcHRlciwgJm1zZywgMSk7CisJbXNnLmZsYWdzID0gMDsKKwl0dW5lcl9yZWdbMV0gPj49IDQ7CisJdHVuZXJfZGJnKCJBR0MyIGdhaW4gaXM6ICVkXG4iLCB0dW5lcl9yZWdbMV0pOworCWlmICh0dW5lcl9yZWdbMV0gPCAxKQorCQl0ZGE4Mjd4YV9sbmFfZ2FpbiggYywgMCk7CisKKwltc2xlZXAoMTAwKTsKKwl0dW5lcl9yZWdbMF0gPSAweDYwOworCXR1bmVyX3JlZ1sxXSA9IDB4M2M7CiAJaTJjX3RyYW5zZmVyKGMtPmFkYXB0ZXIsICZtc2csIDEpOwogCi0JbXNsZWVwKDU1MCk7Ci0JcmVnMlswXSA9IDB4NTA7Ci0JcmVnMlsxXSA9IDB4OGYgKyAodGRhODI3eGFfYW5hbG9nW2ldLmdjMyA8PCA0KTsKKwltc2xlZXAoMTYzKTsKKwl0dW5lcl9yZWdbMF0gPSAweDUwOworCXR1bmVyX3JlZ1sxXSA9IDB4OGYgKyAodGRhODI3eGFfYW5hbG9nW2ldLmdjMyA8PCA0KTsKIAlpMmNfdHJhbnNmZXIoYy0+YWRhcHRlciwgJm1zZywgMSk7CiAKLQlyZWcyWzBdID0gMHg4MDsKLQlyZWcyWzFdID0gMHgyODsKKwl0dW5lcl9yZWdbMF0gPSAweDgwOworCXR1bmVyX3JlZ1sxXSA9IDB4Mjg7CiAJaTJjX3RyYW5zZmVyKGMtPmFkYXB0ZXIsICZtc2csIDEpOwogCi0JcmVnMlswXSA9IDB4YjA7Ci0JcmVnMlsxXSA9IDB4MDE7CisJdHVuZXJfcmVnWzBdID0gMHhiMDsKKwl0dW5lcl9yZWdbMV0gPSAweDAxOwogCWkyY190cmFuc2ZlcihjLT5hZGFwdGVyLCAmbXNnLCAxKTsKIAotCXJlZzJbMF0gPSAweGMwOwotCXJlZzJbMV0gPSAweDE5ICsgKHQtPnRkYTgyN3hfbHBzZWwgPDwgMSk7CisJdHVuZXJfcmVnWzBdID0gMHhjMDsKKwl0dW5lcl9yZWdbMV0gPSAweDE5ICsgKHQtPnRkYTgyN3hfbHBzZWwgPDwgMSk7CiAJaTJjX3RyYW5zZmVyKGMtPmFkYXB0ZXIsICZtc2csIDEpOwogfQogCkBAIC0zMTksNyArMzY3LDkgQEAKIAl1bnNpZ25lZCBjaGFyIGFkZHJfcGxsX3N0YXQgPSAweDFiOwogCXVuc2lnbmVkIGNoYXIgYWRjX3NhdCwgYWdjX3N0YXQsCiAJCSAgICAgIHBsbF9zdGF0OworCWludCBpOwogCisJdHVuZXJfZGJnKCJ0ZGE4Mjd4YSBjb25maWcgaXMgMHglMDJ4XG4iLCB0LT5jb25maWcpOwogCWkyY19tYXN0ZXJfc2VuZChjLCBlYXN5X21vZGUsIDIpOwogCWkyY19tYXN0ZXJfc2VuZChjLCBhZ2Nfb3V0X29uLCAyKTsKIAlpMmNfbWFzdGVyX3NlbmQoYywgc29mdF9yZXNldCwgMik7CkBAIC0zNDAsMTcgKzM5MCwyMiBAQAogCQl0ZGE4Mjd4YV90dW5lKGMsIGlmYywgZnJlcSk7CiAJZWxzZQogCQl0ZGE4Mjd4X3R1bmUoYywgaWZjLCBmcmVxKTsKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCWkyY19tYXN0ZXJfc2VuZChjLCAmYWRkcl9wbGxfc3RhdCwgMSk7CisJCWkyY19tYXN0ZXJfcmVjdihjLCAmcGxsX3N0YXQsIDEpOworCQlpZiAocGxsX3N0YXQgJiAweDgwKSB7CisJCQlpMmNfbWFzdGVyX3NlbmQoYywgJmFkZHJfYWRjX3NhdCwgMSk7CisJCQlpMmNfbWFzdGVyX3JlY3YoYywgJmFkY19zYXQsIDEpOworCQkJaTJjX21hc3Rlcl9zZW5kKGMsICZhZGRyX2FnY19zdGF0LCAxKTsKKwkJCWkyY19tYXN0ZXJfcmVjdihjLCAmYWdjX3N0YXQsIDEpOworCQkJdHVuZXJfZGJnKCJ0ZGE4MjkwIGlzIGxvY2tlZCwgQUdDOiAlZFxuIiwgYWdjX3N0YXQpOworCQkJYnJlYWs7CisJCX0gZWxzZSB7CisJCQl0dW5lcl9kYmcoInRkYTgyOTAgbm90IGxvY2tlZCwgbm8gc2lnbmFsP1xuIik7CisJCQltc2xlZXAoMTAwKTsKKwkJfQorCX0KIAkvKiBhZGp1c3QgaGVhZHJvb20gcmVzcC4gZ2FpbiAqLwotCWkyY19tYXN0ZXJfc2VuZChjLCAmYWRkcl9hZGNfc2F0LCAxKTsKLQlpMmNfbWFzdGVyX3JlY3YoYywgJmFkY19zYXQsIDEpOwotCWkyY19tYXN0ZXJfc2VuZChjLCAmYWRkcl9hZ2Nfc3RhdCwgMSk7Ci0JaTJjX21hc3Rlcl9yZWN2KGMsICZhZ2Nfc3RhdCwgMSk7Ci0JaTJjX21hc3Rlcl9zZW5kKGMsICZhZGRyX3BsbF9zdGF0LCAxKTsKLQlpMmNfbWFzdGVyX3JlY3YoYywgJnBsbF9zdGF0LCAxKTsKLQlpZiAocGxsX3N0YXQgJiAweDgwKQotCQl0dW5lcl9kYmcoInRkYTgyOTAgaXMgbG9ja2VkLCBBR0M6ICVkXG4iLCBhZ2Nfc3RhdCk7Ci0JZWxzZQotCQl0dW5lcl9kYmcoInRkYTgyOTAgbm90IGxvY2tlZCwgbm8gc2lnbmFsP1xuIik7CiAJaWYgKChhZ2Nfc3RhdCA+IDExNSkgfHwgKCEocGxsX3N0YXQgJiAweDgwKSAmJiAoYWRjX3NhdCA8IDIwKSkpIHsKIAkJdHVuZXJfZGJnKCJhZGp1c3QgZ2Fpbiwgc3RlcCAxLiBBZ2M6ICVkLCBBREMgc3RhdDogJWQsIGxvY2s6ICVkXG4iLAogCQkJICAgYWdjX3N0YXQsIGFkY19zYXQsIHBsbF9zdGF0ICYgMHg4MCk7CkBAIC00MDcsNyArNDYyLDYgQEAKIAljaGFyKiBtb2RlOwogCiAJdC0+dGRhODI3eF9scHNlbCA9IDA7Ci0JbW9kZSA9ICJ4eCI7CiAJaWYgKHQtPnN0ZCAmIFY0TDJfU1REX01OKSB7CiAJCXQtPnNnSUYgPSA5MjsKIAkJdC0+dGRhODI5MF9lYXN5X21vZGUgPSAweDAxOwpAQCAtNDM3LDggKzQ5MSwxMiBAQAogCQl0LT5zZ0lGID0gMjA7CiAJCXQtPnRkYTgyOTBfZWFzeV9tb2RlID0gMHg0MDsKIAkJbW9kZSA9ICJMQyI7CisJfSBlbHNlIHsKKwkJdC0+c2dJRiA9IDEyNDsKKwkJdC0+dGRhODI5MF9lYXN5X21vZGUgPSAweDEwOworCQltb2RlID0gInh4IjsKIAl9Ci0gICAgdHVuZXJfZGJnKCJzZXR0aW5nIHRkYTgyOTAgdG8gc3lzdGVtICVzXG4iLCBtb2RlKTsKKwl0dW5lcl9kYmcoInNldHRpbmcgdGRhODI5MCB0byBzeXN0ZW0gJXNcbiIsIG1vZGUpOwogfQogCiBzdGF0aWMgdm9pZCBzZXRfdHZfZnJlcShzdHJ1Y3QgaTJjX2NsaWVudCAqYywgdW5zaWduZWQgaW50IGZyZXEpCkBAIC00ODcsMTEgKzU0NSwxNiBAQAogCiBzdGF0aWMgdm9pZCB0ZGE4MjkwX2luaXRfaWYoc3RydWN0IGkyY19jbGllbnQgKmMpCiB7CisJc3RydWN0IHR1bmVyICp0ID0gaTJjX2dldF9jbGllbnRkYXRhKGMpOwogCXVuc2lnbmVkIGNoYXIgc2V0X1ZTW10gPSB7IDB4MzAsIDB4NkYgfTsKKwl1bnNpZ25lZCBjaGFyIHNldF9HUDAwX0NGW10gPSB7IDB4MjAsIDB4MDEgfTsKIAl1bnNpZ25lZCBjaGFyIHNldF9HUDAxX0NGW10gPSB7IDB4MjAsIDB4MEIgfTsKIAorCWlmICgodC0+Y29uZmlnID09IDEpIHx8ICh0LT5jb25maWcgPT0gMikpCisJCWkyY19tYXN0ZXJfc2VuZChjLCBzZXRfR1AwMF9DRiwgMik7CisJZWxzZQorCQlpMmNfbWFzdGVyX3NlbmQoYywgc2V0X0dQMDFfQ0YsIDIpOwogCWkyY19tYXN0ZXJfc2VuZChjLCBzZXRfVlMsIDIpOwotCWkyY19tYXN0ZXJfc2VuZChjLCBzZXRfR1AwMV9DRiwgMik7CiB9CiAKIHN0YXRpYyB2b2lkIHRkYTgyOTBfaW5pdF90dW5lcihzdHJ1Y3QgaTJjX2NsaWVudCAqYykKQEAgLTU3Niw2ICs2MzksNyBAQAogCXQtPmhhc19zaWduYWwgPSBoYXNfc2lnbmFsOwogCXQtPnN0YW5kYnkgPSBzdGFuZGJ5OwogCXQtPnRkYTgyN3hfbHBzZWwgPSAwOworCXQtPm1vZGUgPSBWNEwyX1RVTkVSX0FOQUxPR19UVjsKIAogCXRkYTgyOTBfaW5pdF90dW5lcihjKTsKIAl0ZGE4MjkwX2luaXRfaWYoYyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3RkYTk4NzUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGRhOTg3NS5jCmluZGV4IDAwZjBlOGIuLmQxMTA0NDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGRhOTg3NS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGRhOTg3NS5jCkBAIC0yNyw3ICsyNyw2IEBACiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy1hbGdvLWJpdC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3R1bmVyLWNvcmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHVuZXItY29yZS5jCmluZGV4IDE1ZGJjNmIuLjUwNTU5MWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHVuZXItY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHVuZXItY29yZS5jCkBAIC0xNDQsNyArMTQ0LDggQEAKIH0KIAogc3RhdGljIHZvaWQgc2V0X3R5cGUoc3RydWN0IGkyY19jbGllbnQgKmMsIHVuc2lnbmVkIGludCB0eXBlLAotCQkgICAgIHVuc2lnbmVkIGludCBuZXdfbW9kZV9tYXNrKQorCQkgICAgIHVuc2lnbmVkIGludCBuZXdfbW9kZV9tYXNrLCB1bnNpZ25lZCBpbnQgbmV3X2NvbmZpZywKKwkJICAgICBpbnQgKCp0dW5lcl9jYWxsYmFjaykgKHZvaWQgKmRldiwgaW50IGNvbW1hbmQsaW50IGFyZykpCiB7CiAJc3RydWN0IHR1bmVyICp0ID0gaTJjX2dldF9jbGllbnRkYXRhKGMpOwogCXVuc2lnbmVkIGNoYXIgYnVmZmVyWzRdOwpAQCAtMTU5LDE1ICsxNjAsMjAgQEAKIAkJcmV0dXJuOwogCX0KIAorCXQtPnR5cGUgPSB0eXBlOworCXQtPmNvbmZpZyA9IG5ld19jb25maWc7CisJaWYgKHR1bmVyX2NhbGxiYWNrICE9IE5VTEwpIHsKKwkJdHVuZXJfZGJnKCJkZWZpbmluZyBHUElPIGNhbGxiYWNrXG4iKTsKKwkJdC0+dHVuZXJfY2FsbGJhY2sgPSB0dW5lcl9jYWxsYmFjazsKKwl9CisKIAkvKiBUaGlzIGNvZGUgZGV0ZWN0cyBjYWxscyBieSBjYXJkIGF0dGFjaF9pbmZvcm0gKi8KIAlpZiAoTlVMTCA9PSB0LT5pMmMuZGV2LmRyaXZlcikgewogCQl0dW5lcl9kYmcgKCJ0dW5lciAweCUwMng6IGNhbGxlZCBkdXJpbmcgaTJjX2NsaWVudCByZWdpc3RlciBieSBhZGFwdGVyJ3MgYXR0YWNoX2luZm9ybVxuIiwgYy0+YWRkcik7CiAKLQkJdC0+dHlwZT10eXBlOwogCQlyZXR1cm47CiAJfQogCi0JdC0+dHlwZSA9IHR5cGU7CiAJc3dpdGNoICh0LT50eXBlKSB7CiAJY2FzZSBUVU5FUl9NVDIwMzI6CiAJCW1pY3JvdHVuZV9pbml0KGMpOwpAQCAtMjM0LDEwICsyNDAsMTEgQEAKIAogCXR1bmVyX2RiZygic2V0IGFkZHIgZm9yIHR5cGUgJWlcbiIsIHQtPnR5cGUpOwogCi0JaWYgKCB0LT50eXBlID09IFVOU0VUICYmICgodHVuX3NldHVwLT5hZGRyID09IEFERFJfVU5TRVQgJiYKLQkJKHQtPm1vZGVfbWFzayAmIHR1bl9zZXR1cC0+bW9kZV9tYXNrKSkgfHwKLQkJdHVuX3NldHVwLT5hZGRyID09IGMtPmFkZHIpKSB7Ci0JCQlzZXRfdHlwZShjLCB0dW5fc2V0dXAtPnR5cGUsIHR1bl9zZXR1cC0+bW9kZV9tYXNrKTsKKwlpZiAoICh0LT50eXBlID09IFVOU0VUICYmICgodHVuX3NldHVwLT5hZGRyID09IEFERFJfVU5TRVQpICYmCisJCSh0LT5tb2RlX21hc2sgJiB0dW5fc2V0dXAtPm1vZGVfbWFzaykpKSB8fAorCQkodHVuX3NldHVwLT5hZGRyID09IGMtPmFkZHIpKSB7CisJCQlzZXRfdHlwZShjLCB0dW5fc2V0dXAtPnR5cGUsIHR1bl9zZXR1cC0+bW9kZV9tYXNrLAorCQkJCSB0dW5fc2V0dXAtPmNvbmZpZywgdHVuX3NldHVwLT50dW5lcl9jYWxsYmFjayk7CiAJfQogfQogCkBAIC00OTYsNyArNTAzLDcgQEAKIHJlZ2lzdGVyX2NsaWVudDoKIAl0dW5lcl9pbmZvKCJjaGlwIGZvdW5kIEAgMHgleCAoJXMpXG4iLCBhZGRyIDw8IDEsIGFkYXAtPm5hbWUpOwogCWkyY19hdHRhY2hfY2xpZW50ICgmdC0+aTJjKTsKLQlzZXRfdHlwZSAoJnQtPmkyYyx0LT50eXBlLCB0LT5tb2RlX21hc2spOworCXNldF90eXBlICgmdC0+aTJjLHQtPnR5cGUsIHQtPm1vZGVfbWFzaywgdC0+Y29uZmlnLCB0LT50dW5lcl9jYWxsYmFjayk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTU3NiwxMCArNTgzLDExIEBACiAJc3dpdGNoIChjbWQpIHsKIAkvKiAtLS0gY29uZmlndXJhdGlvbiAtLS0gKi8KIAljYXNlIFRVTkVSX1NFVF9UWVBFX0FERFI6Ci0JCXR1bmVyX2RiZyAoIkNhbGxpbmcgc2V0X3R5cGVfYWRkciBmb3IgdHlwZT0lZCwgYWRkcj0weCUwMngsIG1vZGU9MHglMDJ4XG4iLAorCQl0dW5lcl9kYmcgKCJDYWxsaW5nIHNldF90eXBlX2FkZHIgZm9yIHR5cGU9JWQsIGFkZHI9MHglMDJ4LCBtb2RlPTB4JTAyeCwgY29uZmlnPTB4JTAyeFxuIiwKIAkJCQkoKHN0cnVjdCB0dW5lcl9zZXR1cCAqKWFyZyktPnR5cGUsCiAJCQkJKChzdHJ1Y3QgdHVuZXJfc2V0dXAgKilhcmcpLT5hZGRyLAotCQkJCSgoc3RydWN0IHR1bmVyX3NldHVwICopYXJnKS0+bW9kZV9tYXNrKTsKKwkJCQkoKHN0cnVjdCB0dW5lcl9zZXR1cCAqKWFyZyktPm1vZGVfbWFzaywKKwkJCQkoKHN0cnVjdCB0dW5lcl9zZXR1cCAqKWFyZyktPmNvbmZpZyk7CiAKIAkJc2V0X2FkZHIoY2xpZW50LCAoc3RydWN0IHR1bmVyX3NldHVwICopYXJnKTsKIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3R2YXVkaW8uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHZhdWRpby5jCmluZGV4IGQ1MDZkZmEuLmEyZGE1ZDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHZhdWRpby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHZhdWRpby5jCkBAIC0yNSw3ICsyNSw2IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjLWFsZ28tYml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgpAQCAtMzMsNiArMzIsNyBAQAogCiAjaW5jbHVkZSA8bWVkaWEvdHZhdWRpby5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jaGlwLWlkZW50Lmg+CiAKICNpbmNsdWRlIDxtZWRpYS9pMmMtYWRkci5oPgogCkBAIC0xNzc1LDYgKzE3NzUsOSBAQAogCQkJLyogdGhlIHRocmVhZCB3aWxsIGNhbGwgY2hlY2ttb2RlKCkgbGF0ZXIgKi8KIAkJfQogCQlicmVhazsKKworCWNhc2UgVklESU9DX0dfQ0hJUF9JREVOVDoKKwkJcmV0dXJuIHY0bDJfY2hpcF9pZGVudF9pMmNfY2xpZW50KGNsaWVudCwgYXJnLCBWNEwyX0lERU5UX1RWQVVESU8sIDApOwogCX0KIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHZlZXByb20uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHZlZXByb20uYwppbmRleCA0ZTdjMWZhLi5hMTEzNmRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3R2ZWVwcm9tLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby90dmVlcHJvbS5jCkBAIC0xNjMsNyArMTYzLDcgQEAKIAkvKiA2MC02OSAqLwogCXsgVFVORVJfUEhJTElQU19GTTEyMTZNRV9NSzMsICJMRyBTMDAxRCBNSzMifSwKIAl7IFRVTkVSX0FCU0VOVCwgICAgICAgICJMRyBNMDAxRCBNSzMifSwKLQl7IFRVTkVSX0FCU0VOVCwgICAgICAgICJMRyBTNzAxRCBNSzMifSwKKwl7IFRVTkVSX1BISUxJUFNfRk0xMjE2TUVfTUszLCAiTEcgUzcwMUQgTUszIn0sCiAJeyBUVU5FUl9BQlNFTlQsICAgICAgICAiTEcgTTcwMUQgTUszIn0sCiAJeyBUVU5FUl9BQlNFTlQsICAgICAgICAiVGVtaWMgNDE0NkZNNSJ9LAogCXsgVFVORVJfQUJTRU5ULCAgICAgICAgIlRlbWljIDQxMzZGWTUifSwKQEAgLTIyOSw2ICsyMjksMzYgQEAKIAkvKiAxMjAtMTI5ICovCiAJeyBUVU5FUl9BQlNFTlQsICAgICAgICAiWGNlaXZlIFhDMzAyOCJ9LAogCXsgVFVORVJfQUJTRU5ULCAgICAgICAgIlBoaWxpcHMgRlExMjE2TE1FIE1LNSJ9LAorCXsgVFVORVJfQUJTRU5ULCAgICAgICAgIlBoaWxpcHMgRlFEMTIxNkxNRSJ9LAorCXsgVFVORVJfQUJTRU5ULCAgICAgICAgIkNvbmV4YW50IENYMjQxMThBIn0sCisJeyBUVU5FUl9BQlNFTlQsICAgICAgICAiVENMIERNRjExV0lQIn0sCisJeyBUVU5FUl9BQlNFTlQsICAgICAgICAiVENMIE1GTk0wNV80SF9FIn0sCisJeyBUVU5FUl9BQlNFTlQsICAgICAgICAiVENMIE1OTTA1XzRIX0UifSwKKwl7IFRVTkVSX0FCU0VOVCwgICAgICAgICJUQ0wgTVBFMDVfMkhfRSJ9LAorCXsgVFVORVJfQUJTRU5ULCAgICAgICAgIlRDTCBNUU5NMDVfNF9VIn0sCisJeyBUVU5FUl9BQlNFTlQsICAgICAgICAiVENMIE0yNTIzXzVOSF9FIn0sCisJLyogMTMwLTEzOSAqLworCXsgVFVORVJfQUJTRU5ULCAgICAgICAgIlRDTCBNMjUyM18zREJIX0UifSwKKwl7IFRVTkVSX0FCU0VOVCwgICAgICAgICJUQ0wgTTI1MjNfM0RJSF9FIn0sCisJeyBUVU5FUl9BQlNFTlQsICAgICAgICAiVENMIE1GUEUwNV8yX1UifSwKKwl7IFRVTkVSX0FCU0VOVCwgICAgICAgICJQaGlsaXBzIEZNRDEyMTZNRVgifSwKKwl7IFRVTkVSX0FCU0VOVCwgICAgICAgICJQaGlsaXBzIEZSSDIwMzZCIn0sCisJeyBUVU5FUl9BQlNFTlQsICAgICAgICAiUGFuYXNvbmljIEVOR0Y3NV8wMUdGIn0sCisJeyBUVU5FUl9BQlNFTlQsICAgICAgICAiTWF4TGluZWFyIE1YTDUwMDUifSwKKwl7IFRVTkVSX0FCU0VOVCwgICAgICAgICJNYXhMaW5lYXIgTVhMNTAwMyJ9LAorCXsgVFVORVJfQUJTRU5ULCAgICAgICAgIlhjZWl2ZSBYQzIwMjgifSwKKwl7IFRVTkVSX0FCU0VOVCwgICAgICAgICJNaWNyb3R1bmUgTVQyMTMxIn0sCisJLyogMTQwLTE0OSAqLworCXsgVFVORVJfQUJTRU5ULCAgICAgICAgIlBoaWxpcHMgODI3NUFfODI5NSJ9LAorCXsgVFVORVJfQUJTRU5ULCAgICAgICAgIlRDTCBNRjAyR0lQXzVOX0UifSwKKwl7IFRVTkVSX0FCU0VOVCwgICAgICAgICJUQ0wgTUYwMkdJUF8zREJfRSJ9LAorCXsgVFVORVJfQUJTRU5ULCAgICAgICAgIlRDTCBNRjAyR0lQXzNESV9FIn0sCisJeyBUVU5FUl9BQlNFTlQsICAgICAgICAiTWljcm90dW5lIE1UMjI2NiJ9LAorCXsgVFVORVJfQUJTRU5ULCAgICAgICAgIlRDTCBNRjEwV1BQXzROX0UifSwKKwl7IFRVTkVSX0FCU0VOVCwgICAgICAgICJMRyBUQVBRX0g3MDJGIn0sCisJeyBUVU5FUl9BQlNFTlQsICAgICAgICAiVENMIE0wOVdQUF80Tl9FIn0sCisJeyBUVU5FUl9BQlNFTlQsICAgICAgICAiTWF4TGluZWFyIE1YTDUwMDVfdjIifSwKKwl7IFRVTkVSX0FCU0VOVCwgICAgICAgICJQaGlsaXBzIDE4MjcxXzgyOTUifSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgSEFVUFBBVUdFX0FVRElPSUMKQEAgLTI4MCwxMSArMzEwLDE2IEBACiAJe0FVRElPX0NISVBfSU5URVJOQUwsICJDWDg4MyJ9LAogCXtBVURJT19DSElQX0lOVEVSTkFMLCAiQ1g4ODIifSwKIAl7QVVESU9fQ0hJUF9JTlRFUk5BTCwgIkNYMjU4NDAifSwKLQkvKiAzNS0zOCAqLworCS8qIDM1LTM5ICovCiAJe0FVRElPX0NISVBfSU5URVJOQUwsICJDWDI1ODQxIn0sCiAJe0FVRElPX0NISVBfSU5URVJOQUwsICJDWDI1ODQyIn0sCiAJe0FVRElPX0NISVBfSU5URVJOQUwsICJDWDI1ODQzIn0sCiAJe0FVRElPX0NISVBfSU5URVJOQUwsICJDWDIzNDE4In0sCisJe0FVRElPX0NISVBfSU5URVJOQUwsICJDWDIzODg1In0sCisJLyogNDAtNDIgKi8KKwl7QVVESU9fQ0hJUF9JTlRFUk5BTCwgIkNYMjM4ODgifSwKKwl7QVVESU9fQ0hJUF9JTlRFUk5BTCwgIlNBQTcxMzEifSwKKwl7QVVESU9fQ0hJUF9JTlRFUk5BTCwgIkNYMjM4ODcifSwKIH07CiAKIC8qIFRoaXMgbGlzdCBpcyBzdXBwbGllZCBieSBIYXVwcGF1Z2UuIFRoYW5rcyEgKi8KQEAgLTMwMSw4ICszMzYsMTAgQEAKIAkiQ1g4ODAiLCAiQ1g4ODEiLCAiQ1g4ODMiLCAiU0FBNzExMSIsICJTQUE3MTEzIiwKIAkvKiAyNS0yOSAqLwogCSJDWDg4MiIsICJUVlA1MTUwQSIsICJDWDI1ODQwIiwgIkNYMjU4NDEiLCAiQ1gyNTg0MiIsCi0JLyogMzAtMzEgKi8KLQkiQ1gyNTg0MyIsICJDWDIzNDE4IiwKKwkvKiAzMC0zNCAqLworCSJDWDI1ODQzIiwgIkNYMjM0MTgiLCAiTkVDNjExNTMiLCAiQ1gyMzg4NSIsICJDWDIzODg4IiwKKwkvKiAzNS0zNyAqLworCSJTQUE3MTMxIiwgIkNYMjU4MzciLCAiQ1gyMzg4NyIKIH07CiAKIHN0YXRpYyBpbnQgaGFzUmFkaW9UdW5lcihpbnQgdHVuZXJUeXBlKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby91cGQ2NDAzMWEuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXBkNjQwMzFhLmMKaW5kZXggMjhkMTEzMy4uMGIyYTk2MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby91cGQ2NDAzMWEuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3VwZDY0MDMxYS5jCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNoaXAtaWRlbnQuaD4KICNpbmNsdWRlIDxtZWRpYS91cGQ2NDAzMWEuaD4KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHJlYWQgcmVnaXN0ZXJzIGZ1bmN0aW9ucyBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTE3OSw2ICsxODAsOSBAQAogCX0KICNlbmRpZgogCisJY2FzZSBWSURJT0NfR19DSElQX0lERU5UOgorCQlyZXR1cm4gdjRsMl9jaGlwX2lkZW50X2kyY19jbGllbnQoY2xpZW50LCBhcmcsIFY0TDJfSURFTlRfVVBENjQwMzFBLCAwKTsKKwogCWRlZmF1bHQ6CiAJCWJyZWFrOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXBkNjQwODMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXBkNjQwODMuYwppbmRleCBmZTM4MjI0Li40MDFiZDIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3VwZDY0MDgzLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby91cGQ2NDA4My5jCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNoaXAtaWRlbnQuaD4KICNpbmNsdWRlIDxtZWRpYS91cGQ2NDA4My5oPgogCiBNT0RVTEVfREVTQ1JJUFRJT04oInVQRDY0MDgzIGRyaXZlciIpOwpAQCAtMTU1LDYgKzE1NiwxMCBAQAogCQlicmVhazsKIAl9CiAjZW5kaWYKKworCWNhc2UgVklESU9DX0dfQ0hJUF9JREVOVDoKKwkJcmV0dXJuIHY0bDJfY2hpcF9pZGVudF9pMmNfY2xpZW50KGNsaWVudCwgYXJnLCBWNEwyX0lERU5UX1VQRDY0MDgzLCAwKTsKKwogCWRlZmF1bHQ6CiAJCWJyZWFrOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlkZW8vdXNidmlkZW8uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlkZW8vdXNidmlkZW8uYwppbmRleCBkMzRkOGM4Li42ODdmMDI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpZGVvL3VzYnZpZGVvLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aWRlby91c2J2aWRlby5jCkBAIC02MjgsMjQgKzYyOCwyMSBAQAogLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KIAogLyogWFhYOiB0aGlzIHBpZWNlIG9mIGNyYXAgcmVhbGx5IHdhbnRzIHNvbWUgZXJyb3IgaGFuZGxpbmcuLiAqLwotc3RhdGljIHZvaWQgdXNidmlkZW9fQ2xpZW50SW5jTW9kQ291bnQoc3RydWN0IHV2ZCAqdXZkKQorc3RhdGljIGludCB1c2J2aWRlb19DbGllbnRJbmNNb2RDb3VudChzdHJ1Y3QgdXZkICp1dmQpCiB7CiAJaWYgKHV2ZCA9PSBOVUxMKSB7CiAJCWVycigiJXM6IHV2ZCA9PSBOVUxMIiwgX19GVU5DVElPTl9fKTsKLQkJcmV0dXJuOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJaWYgKHV2ZC0+aGFuZGxlID09IE5VTEwpIHsKIAkJZXJyKCIlczogdXZkLT5oYW5kbGUgPT0gTlVMTCIsIF9fRlVOQ1RJT05fXyk7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKHV2ZC0+aGFuZGxlLT5tZF9tb2R1bGUgPT0gTlVMTCkgewotCQllcnIoIiVzOiB1dmQtPmhhbmRsZS0+bWRfbW9kdWxlID09IE5VTEwiLCBfX0ZVTkNUSU9OX18pOwotCQlyZXR1cm47CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAlpZiAoIXRyeV9tb2R1bGVfZ2V0KHV2ZC0+aGFuZGxlLT5tZF9tb2R1bGUpKSB7CiAJCWVycigiJXM6IHRyeV9tb2R1bGVfZ2V0KCkgPT0gMCIsIF9fRlVOQ1RJT05fXyk7Ci0JCXJldHVybjsKKwkJcmV0dXJuIC1FTk9ERVY7CiAJfQorCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCB1c2J2aWRlb19DbGllbnREZWNNb2RDb3VudChzdHJ1Y3QgdXZkICp1dmQpCkBAIC03MTIsOCArNzA5LDYgQEAKIAljYW1zLT5udW1fY2FtZXJhcyA9IG51bV9jYW1zOwogCWNhbXMtPmNhbSA9IChzdHJ1Y3QgdXZkICopICZjYW1zWzFdOwogCWNhbXMtPm1kX21vZHVsZSA9IG1kOwotCWlmIChjYW1zLT5tZF9tb2R1bGUgPT0gTlVMTCkKLQkJd2FybigiJXM6IG1vZHVsZSA9PSBOVUxMISIsIF9fRlVOQ1RJT05fXyk7CiAJbXV0ZXhfaW5pdCgmY2Ftcy0+bG9jayk7CS8qIHRvIDEgPT0gYXZhaWxhYmxlICovCiAKIAlmb3IgKGkgPSAwOyBpIDwgbnVtX2NhbXM7IGkrKykgewpAQCAtMTExOSw3ICsxMTE0LDggQEAKIAlpZiAodXZkLT5kZWJ1ZyA+IDEpCiAJCWluZm8oIiVzKCQlcCkiLCBfX0ZVTkNUSU9OX18sIGRldik7CiAKLQl1c2J2aWRlb19DbGllbnRJbmNNb2RDb3VudCh1dmQpOworCWlmICgwIDwgdXNidmlkZW9fQ2xpZW50SW5jTW9kQ291bnQodXZkKSkKKwkJcmV0dXJuIC1FTk9ERVY7CiAJbXV0ZXhfbG9jaygmdXZkLT5sb2NrKTsKIAogCWlmICh1dmQtPnVzZXIpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlzaW9uL3VzYnZpc2lvbi1jYXJkcy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aXNpb24vdXNidmlzaW9uLWNhcmRzLmMKaW5kZXggYTQwZTU4My4uMTNmNjlmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aXNpb24vdXNidmlzaW9uLWNhcmRzLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aXNpb24vdXNidmlzaW9uLWNhcmRzLmMKQEAgLTEsNiArMSw2IEBACiAvKgotICogVVNCVklTSU9OLkgKLSAqICB1c2J2aXNpb24gaGVhZGVyIGZpbGUKKyAqICB1c2J2aXNpb24tY2FyZHMuYworICogIHVzYnZpc2lvbiBjYXJkcyBkZWZpbml0aW9uIGZpbGUKICAqCiAgKiBDb3B5cmlnaHQgKGMpIDE5OTktMjAwNSBKb2VyZyBIZWNrZW5iYWNoIDxqb2VyZ0BoZWNrZW5iYWNoLWF3LmRlPgogICoKQEAgLTI4LDEyOSArMjgsMTA2MCBAQAogI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2Lmg+CiAjaW5jbHVkZSA8bWVkaWEvdHVuZXIuaD4KICNpbmNsdWRlICJ1c2J2aXNpb24uaCIKKyNpbmNsdWRlICJ1c2J2aXNpb24tY2FyZHMuaCIKIAogLyogU3VwcG9ydGVkIERldmljZXM6IEEgdGFibGUgZm9yIHVzYnZpc2lvbi5jKi8KIHN0cnVjdCB1c2J2aXNpb25fZGV2aWNlX2RhdGFfc3QgIHVzYnZpc2lvbl9kZXZpY2VfZGF0YVtdID0gewotCXsweEZGRjAsIDB4RkZGMCwgLTEsIENPREVDX1NBQTcxMTEsIDMsIFY0TDJfU1REX05UU0MsICAxLCAxLCAxLCAxLCBUVU5FUl9QSElMSVBTX05UU0NfTSwgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAiQ3VzdG9tIER1bW15IFVTQlZpc2lvbiBEZXZpY2UifSwKLQl7MHgwQTZGLCAweDA0MDAsIC0xLCBDT0RFQ19TQUE3MTEzLCA0LCBWNEwyX1NURF9OVFNDLCAgMSwgMCwgMSwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgIlhhbmJvbyJ9LAotCXsweDA1MEQsIDB4MDIwOCwgLTEsIENPREVDX1NBQTcxMTMsIDIsIFY0TDJfU1REX1BBTCwgICAxLCAwLCAxLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLTEsIC0xLCAgMCwgIDMsICA3LCAiQmVsa2luIFVTQlZpZXcgSUkifSwKLQl7MHgwNTcxLCAweDAwMDIsICAwLCBDT0RFQ19TQUE3MTExLCAyLCBWNEwyX1NURF9QQUwsICAgMCwgMCwgMSwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAgNywgImVjaG9GWCBJbnRlclZpZXcgTGl0ZSJ9LAotCXsweDA1NzMsIDB4MDAwMywgLTEsIENPREVDX1NBQTcxMTEsIDIsIFY0TDJfU1REX05UU0MsICAxLCAwLCAxLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAiVVNCR2VhciBVU0JHLVYxIHJlc3AuIEhBTUEgVVNCIn0sCi0JezB4MDU3MywgMHgwNDAwLCAtMSwgQ09ERUNfU0FBNzExMywgNCwgVjRMMl9TVERfTlRTQywgIDAsIDAsIDEsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAtMSwgLTEsICAwLCAgMywgIDcsICJELUxpbmsgVjEwMCJ9LAotCXsweDA1NzMsIDB4MjAwMCwgLTEsIENPREVDX1NBQTcxMTEsIDIsIFY0TDJfU1REX05UU0MsICAxLCAwLCAxLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAiWDEwIFVTQiBDYW1lcmEifSwKLQl7MHgwNTczLCAweDJkMDAsIC0xLCBDT0RFQ19TQUE3MTExLCAyLCBWNEwyX1NURF9QQUwsICAgMSwgMCwgMSwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLCAtMSwgLTEsICAzLCAgNywgIk9zcHJleSA1MCJ9LAotCXsweDA1NzMsIDB4MmQwMSwgLTEsIENPREVDX1NBQTcxMTMsIDIsIFY0TDJfU1REX05UU0MsICAwLCAwLCAxLCAwLCAwLAkJCSAgICAgICAtMSwgLTEsICAwLCAgMywgIDcsICJIYXVwcGF1Z2UgVVNCLUxpdmUgTW9kZWwgNjAwIn0sCi0JezB4MDU3MywgMHgyMTAxLCAtMSwgQ09ERUNfU0FBNzExMywgMiwgVjRMMl9TVERfUEFMLCAgIDIsIDAsIDEsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAtMSwgLTEsICAwLCAgMywgIDcsICJab3JhbiBDby4gUE1EIChOb2dhdGVjaCkgQVYtZ3JhYmJlciBNYW5oYXR0YW4ifSwKLQl7MHgwNTczLCAweDQxMDAsIC0xLCBDT0RFQ19TQUE3MTExLCAzLCBWNEwyX1NURF9OVFNDLCAgMSwgMSwgMSwgMSwgVFVORVJfUEhJTElQU19OVFNDX00sICAgICAgIC0xLCAtMSwgLTEsIDIwLCAtMSwgIk5vZ2F0ZWNoIFVTQi1UViAoTlRTQykgRk0ifSwKLQl7MHgwNTczLCAweDQxMTAsIC0xLCBDT0RFQ19TQUE3MTExLCAzLCBWNEwyX1NURF9OVFNDLCAgMSwgMSwgMSwgMSwgVFVORVJfUEhJTElQU19OVFNDX00sICAgICAgIC0xLCAtMSwgLTEsIDIwLCAtMSwgIlBOWSBVU0ItVFYgKE5UU0MpIEZNIn0sCi0JezB4MDU3MywgMHg0NDUwLCAgMCwgQ09ERUNfU0FBNzExMywgMywgVjRMMl9TVERfUEFMLCAgIDEsIDEsIDEsIDEsIFRVTkVSX1BISUxJUFNfUEFMLCAgICAgICAgICAtMSwgLTEsICAwLCAgMywgIDcsICJQaXhlbFZpZXcgUGxheVR2LVVTQiBQUk8gKFBBTCkgRk0ifSwKLQl7MHgwNTczLCAweDQ1NTAsICAwLCBDT0RFQ19TQUE3MTEzLCAzLCBWNEwyX1NURF9QQUwsICAgMSwgMSwgMSwgMSwgVFVORVJfUEhJTElQU19QQUwsICAgICAgICAgIC0xLCAtMSwgIDAsICAzLCAgNywgIlpUViBaVC03MjEgMi40R0h6IFVTQiBBL1YgUmVjZWl2ZXIifSwKLQl7MHgwNTczLCAweDRkMDAsIC0xLCBDT0RFQ19TQUE3MTExLCAzLCBWNEwyX1NURF9OVFNDLCAgMSwgMCwgMSwgMSwgVFVORVJfUEhJTElQU19OVFNDX00sICAgICAgIC0xLCAtMSwgLTEsIDIwLCAtMSwgIkhhdXBwYXVnZSBXaW5Udi1VU0IgVVNBIn0sCi0JezB4MDU3MywgMHg0ZDAxLCAtMSwgQ09ERUNfU0FBNzExMSwgMywgVjRMMl9TVERfTlRTQywgIDEsIDAsIDEsIDEsIFRVTkVSX1BISUxJUFNfTlRTQ19NLCAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsICJIYXVwcGF1Z2UgV2luVHYtVVNCIn0sCi0JezB4MDU3MywgMHg0ZDAyLCAtMSwgQ09ERUNfU0FBNzExMSwgMywgVjRMMl9TVERfTlRTQywgIDEsIDAsIDEsIDEsIFRVTkVSX1BISUxJUFNfTlRTQ19NLCAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsICJIYXVwcGF1Z2UgV2luVHYtVVNCIChOVFNDKSJ9LAotCXsweDA1NzMsIDB4NGQwMywgLTEsIENPREVDX1NBQTcxMTEsIDMsIFY0TDJfU1REX1NFQ0FNLCAxLCAwLCAxLCAxLCBUVU5FUl9QSElMSVBTX1NFQ0FNLCAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAiSGF1cHBhdWdlIFdpblR2LVVTQiAoU0VDQU0pICJ9LAotCXsweDA1NzMsIDB4NGQxMCwgLTEsIENPREVDX1NBQTcxMTEsIDMsIFY0TDJfU1REX05UU0MsICAxLCAxLCAxLCAxLCBUVU5FUl9QSElMSVBTX05UU0NfTSwgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAiSGF1cHBhdWdlIFdpblR2LVVTQiAoTlRTQykgRk0ifSwKLQl7MHgwNTczLCAweDRkMTEsIC0xLCBDT0RFQ19TQUE3MTExLCAzLCBWNEwyX1NURF9QQUwsICAgMSwgMSwgMSwgMSwgVFVORVJfUEhJTElQU19QQUwsICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgIkhhdXBwYXVnZSBXaW5Udi1VU0IgKFBBTCkgRk0ifSwKLQl7MHgwNTczLCAweDRkMTIsIC0xLCBDT0RFQ19TQUE3MTExLCAzLCBWNEwyX1NURF9QQUwsICAgMSwgMSwgMSwgMSwgVFVORVJfUEhJTElQU19QQUwsICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgIkhhdXBwYXVnZSBXaW5Udi1VU0IgKFBBTCkgRk0ifSwKLQl7MHgwNTczLCAweDRkMmEsICAwLCBDT0RFQ19TQUE3MTEzLCAzLCBWNEwyX1NURF9OVFNDLCAgMSwgMSwgMSwgMSwgVFVORVJfTUlDUk9UVU5FXzQwNDlGTTUsICAgIC0xLCAtMSwgIDAsICAzLCAgNywgIkhhdXBwYXVnZSBXaW5UdiBVU0IgKE5UU0MpIEZNIE1vZGVsIDYwMiA0MDIwMSBSZXYgQjI4NSJ9LAotCXsweDA1NzMsIDB4NGQyYiwgIDAsIENPREVDX1NBQTcxMTMsIDMsIFY0TDJfU1REX05UU0MsICAxLCAxLCAxLCAxLCBUVU5FUl9NSUNST1RVTkVfNDA0OUZNNSwgICAgLTEsIC0xLCAgMCwgIDMsICA3LCAiSGF1cHBhdWdlIFdpblR2IFVTQiAoTlRTQykgRk0gTW9kZWwgNjAyIDQwMjAxIFJldiBCMjgyIn0sCi0JezB4MDU3MywgMHg0ZDJjLCAgMCwgQ09ERUNfU0FBNzExMywgMywgVjRMMl9TVERfUEFMLCAgIDEsIDAsIDEsIDEsIFRVTkVSX1BISUxJUFNfRk0xMjE2TUVfTUszLCAtMSwgLTEsICAwLCAgMywgIDcsICJIYXVwcGF1Z2UgV2luVHYgVVNCIChQQUwvU0VDQU0pIDQwMjA5IFJldiBFMUE1In0sCi0JezB4MDU3MywgMHg0ZDIwLCAgMCwgQ09ERUNfU0FBNzExMywgMywgVjRMMl9TVERfUEFMLCAgIDEsIDEsIDEsIDEsIFRVTkVSX1BISUxJUFNfUEFMLCAgICAgICAgICAtMSwgLTEsICAwLCAgMywgIDcsICJIYXVwcGF1Z2UgV2luVHYtVVNCIElJIChQQUwpIEZNIE1vZGVsIDQwMjAxIFJldiBCMjI2In0sCi0JezB4MDU3MywgMHg0ZDIxLCAgMCwgQ09ERUNfU0FBNzExMywgMywgVjRMMl9TVERfUEFMLCAgIDEsIDAsIDEsIDEsIFRVTkVSX1BISUxJUFNfUEFMLCAgICAgICAgICAtMSwgLTEsICAwLCAgMywgIDcsICJIYXVwcGF1Z2UgV2luVHYtVVNCIElJIChQQUwpIn0sCi0JezB4MDU3MywgMHg0ZDIyLCAgMCwgQ09ERUNfU0FBNzExMywgMywgVjRMMl9TVERfUEFMLCAgIDEsIDAsIDEsIDEsIFRVTkVSX1BISUxJUFNfUEFMLCAgICAgICAgICAtMSwgLTEsICAwLCAgMywgIDcsICJIYXVwcGF1Z2UgV2luVHYtVVNCIElJIChQQUwpIE1PREVMIDU2NiJ9LAotCXsweDA1NzMsIDB4NGQyMywgLTEsIENPREVDX1NBQTcxMTMsIDMsIFY0TDJfU1REX1NFQ0FNLCAxLCAwLCAxLCAxLCBUVU5FUl9QSElMSVBTX1NFQ0FNLCAgICAgICAgLTEsIC0xLCAgMCwgIDMsICA3LCAiSGF1cHBhdWdlIFdpblR2LVVTQiAoU0VDQU0pIDREMjMifSwKLQl7MHgwNTczLCAweDRkMjUsIC0xLCBDT0RFQ19TQUE3MTEzLCAzLCBWNEwyX1NURF9TRUNBTSwgMSwgMCwgMSwgMSwgVFVORVJfUEhJTElQU19TRUNBTSwgICAgICAgIC0xLCAtMSwgIDAsICAzLCAgNywgIkhhdXBwYXVnZSBXaW5Udi1VU0IgKFNFQ0FNKSBNb2RlbCA0MDIwOSBSZXYgQjIzNCJ9LAotCXsweDA1NzMsIDB4NGQyNiwgLTEsIENPREVDX1NBQTcxMTMsIDMsIFY0TDJfU1REX1NFQ0FNLCAxLCAwLCAxLCAxLCBUVU5FUl9QSElMSVBTX1NFQ0FNLCAgICAgICAgLTEsIC0xLCAgMCwgIDMsICA3LCAiSGF1cHBhdWdlIFdpblR2LVVTQiAoU0VDQU0pIE1vZGVsIDQwMjA5IFJldiBCMjQzIn0sCi0JezB4MDU3MywgMHg0ZDI3LCAtMSwgQ09ERUNfU0FBNzExMywgMywgVjRMMl9TVERfUEFMLCAgIDEsIDAsIDEsIDEsIFRVTkVSX0FMUFNfVFNCRTFfUEFMLCAgICAgICAtMSwgLTEsICAwLCAgMywgIDcsICJIYXVwcGF1Z2UgV2luVHYtVVNCIE1vZGVsIDQwMjA0IFJldiBCMjgxIn0sCi0JezB4MDU3MywgMHg0ZDI4LCAtMSwgQ09ERUNfU0FBNzExMywgMywgVjRMMl9TVERfUEFMLCAgIDEsIDAsIDEsIDEsIFRVTkVSX0FMUFNfVFNCRTFfUEFMLCAgICAgICAtMSwgLTEsICAwLCAgMywgIDcsICJIYXVwcGF1Z2UgV2luVHYtVVNCIE1vZGVsIDQwMjA0IFJldiBCMjgzIn0sCi0JezB4MDU3MywgMHg0ZDI5LCAtMSwgQ09ERUNfU0FBNzExMywgMywgVjRMMl9TVERfUEFMLCAgIDEsIDAsIDEsIDEsIFRVTkVSX1BISUxJUFNfUEFMLCAgICAgICAgICAtMSwgLTEsICAwLCAgMywgIDcsICJIYXVwcGF1Z2UgV2luVHYtVVNCIE1vZGVsIDQwMjA1IFJldiBCMjk4In0sCi0JezB4MDU3MywgMHg0ZDMwLCAtMSwgQ09ERUNfU0FBNzExMywgMywgVjRMMl9TVERfTlRTQywgIDEsIDEsIDEsIDEsIFRVTkVSX1BISUxJUFNfTlRTQ19NLCAgICAgICAtMSwgLTEsICAwLCAgMywgIDcsICJIYXVwcGF1Z2UgV2luVHYtVVNCIEZNIE1vZGVsIDQwMjExIFJldiBCMTIzIn0sCi0JezB4MDU3MywgMHg0ZDMxLCAgMCwgQ09ERUNfU0FBNzExMywgMywgVjRMMl9TVERfUEFMLCAgIDEsIDEsIDEsIDEsIFRVTkVSX1BISUxJUFNfUEFMLCAgICAgICAgICAtMSwgLTEsICAwLCAgMywgIDcsICJIYXVwcGF1Z2UgV2luVHYtVVNCIElJSSAoUEFMKSBGTSBNb2RlbCA1NjgifSwKLQl7MHgwNTczLCAweDRkMzIsICAwLCBDT0RFQ19TQUE3MTEzLCAzLCBWNEwyX1NURF9QQUwsICAgMSwgMSwgMSwgMSwgVFVORVJfUEhJTElQU19QQUwsICAgICAgICAgIC0xLCAtMSwgIDAsICAzLCAgNywgIkhhdXBwYXVnZSBXaW5Udi1VU0IgSUlJIChQQUwpIEZNIE1vZGVsIDU3MyJ9LAotCXsweDA1NzMsIDB4NGQzNSwgIDAsIENPREVDX1NBQTcxMTMsIDMsIFY0TDJfU1REX1BBTCwgICAxLCAxLCAxLCAxLCBUVU5FUl9NSUNST1RVTkVfNDA0OUZNNSwgICAgLTEsIC0xLCAgMCwgIDMsICA3LCAiSGF1cHBhdWdlIFdpblR2LVVTQiBJSUkgKFBBTCkgRk0gTW9kZWwgNDAyMTkgUmV2IEIyNTIifSwKLQl7MHgwNTczLCAweDRkMzcsICAwLCBDT0RFQ19TQUE3MTEzLCAzLCBWNEwyX1NURF9QQUwsICAgMSwgMSwgMSwgMSwgVFVORVJfUEhJTElQU19GTTEyMTZNRV9NSzMsIC0xLCAtMSwgIDAsICAzLCAgNywgIkhhdXBwYXVnZSBXaW5UViBVU0IgZGV2aWNlIE1vZGVsIDQwMjE5IFJldiBFMTg5In0sCi0JezB4MDc2OCwgMHgwMDA2LCAtMSwgQ09ERUNfU0FBNzExMywgMywgVjRMMl9TVERfTlRTQywgIDEsIDEsIDEsIDEsIFRVTkVSX1BISUxJUFNfTlRTQ19NLCAgICAgICAtMSwgLTEsICA1LCAgNSwgLTEsICJDYW10ZWwgVGVjaG5vbG9neSBVU0IgVFYgR2VuaWUgUHJvIEZNIE1vZGVsIFRWQjMzMCJ9LAotCXsweDA3ZDAsIDB4MDAwMSwgLTEsIENPREVDX1NBQTcxMTMsIDIsIFY0TDJfU1REX1BBTCwgICAwLCAwLCAxLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLTEsIC0xLCAgMCwgIDMsICA3LCAiRGlnaXRhbCBWaWRlbyBDcmVhdG9yIEkifSwKLQl7MHgwN2QwLCAweDAwMDIsIC0xLCBDT0RFQ19TQUE3MTExLCAyLCBWNEwyX1NURF9OVFNDLCAgMCwgMCwgMSwgMCwgMCwgICAJCSAgICAgICAtMSwgLTEsIDgyLCAyMCwgIDcsICJHbG9iYWwgVmlsbGFnZSBHVi0wMDcgKE5UU0MpIn0sCi0JezB4MDdkMCwgMHgwMDAzLCAgMCwgQ09ERUNfU0FBNzExMywgMiwgVjRMMl9TVERfTlRTQywgIDAsIDAsIDEsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAtMSwgLTEsICAwLCAgMywgIDcsICJEYXp6bGUgRnVzaW9uIE1vZGVsIERWQy01MCBSZXYgMSAoTlRTQykifSwKLQl7MHgwN2QwLCAweDAwMDQsICAwLCBDT0RFQ19TQUE3MTEzLCAyLCBWNEwyX1NURF9QQUwsICAgMCwgMCwgMSwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLCAtMSwgIDAsICAzLCAgNywgIkRhenpsZSBGdXNpb24gTW9kZWwgRFZDLTgwIFJldiAxIChQQUwpIn0sCi0JezB4MDdkMCwgMHgwMDA1LCAgMCwgQ09ERUNfU0FBNzExMywgMiwgVjRMMl9TVERfU0VDQU0sIDAsIDAsIDEsIDAsIDAsCQkJICAgICAgIC0xLCAtMSwgIDAsICAzLCAgNywgIkRhenpsZSBGdXNpb24gTW9kZWwgRFZDLTkwIFJldiAxIChTRUNBTSkifSwKLQl7MHgyMzA0LCAweDAxMGQsIC0xLCBDT0RFQ19TQUE3MTExLCAzLCBWNEwyX1NURF9QQUwsICAgMSwgMCwgMCwgMSwgVFVORVJfVEVNSUNfNDA2NkZZNV9QQUxfSSwgIC0xLCAtMSwgLTEsIC0xLCAtMSwgIlBpbm5hY2xlIFN0dWRpbyBQQ1RWIFVTQiAoUEFMKSJ9LAotCXsweDIzMDQsIDB4MDEwOSwgLTEsIENPREVDX1NBQTcxMTEsIDMsIFY0TDJfU1REX1NFQ0FNLCAxLCAwLCAxLCAxLCBUVU5FUl9QSElMSVBTX1NFQ0FNLCAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAiUGlubmFjbGUgU3R1ZGlvIFBDVFYgVVNCIChTRUNBTSkifSwKLQl7MHgyMzA0LCAweDAxMTAsIC0xLCBDT0RFQ19TQUE3MTExLCAzLCBWNEwyX1NURF9QQUwsICAgMSwgMSwgMSwgMSwgVFVORVJfUEhJTElQU19QQUwsICAgICAgICAgIC0xLCAtMSwxMjgsIDIzLCAtMSwgIlBpbm5hY2xlIFN0dWRpbyBQQ1RWIFVTQiAoUEFMKSBGTSJ9LAotCXsweDIzMDQsIDB4MDExMSwgLTEsIENPREVDX1NBQTcxMTEsIDMsIFY0TDJfU1REX1BBTCwgICAxLCAwLCAxLCAxLCBUVU5FUl9QSElMSVBTX1BBTCwgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAiTWlybyBQQ1RWIFVTQiJ9LAotCXsweDIzMDQsIDB4MDExMiwgLTEsIENPREVDX1NBQTcxMTEsIDMsIFY0TDJfU1REX05UU0MsICAxLCAxLCAxLCAxLCBUVU5FUl9QSElMSVBTX05UU0NfTSwgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAiUGlubmFjbGUgU3R1ZGlvIFBDVFYgVVNCIChOVFNDKSBGTSJ9LAotCXsweDIzMDQsIDB4MDIxMCwgLTEsIENPREVDX1NBQTcxMTMsIDMsIFY0TDJfU1REX1BBTCwgICAxLCAxLCAxLCAxLCBUVU5FUl9URU1JQ180MDA5RlI1X1BBTCwgICAgLTEsIC0xLCAgMCwgIDMsICA3LCAiUGlubmFjbGUgU3R1ZGlvIFBDVFYgVVNCIChQQUwpIEZNIn0sCi0JezB4MjMwNCwgMHgwMjEyLCAtMSwgQ09ERUNfU0FBNzExMSwgMywgVjRMMl9TVERfTlRTQywgIDEsIDEsIDEsIDEsIFRVTkVSX1RFTUlDXzQwMzlGUjVfTlRTQywgICAtMSwgLTEsICAwLCAgMywgIDcsICJQaW5uYWNsZSBTdHVkaW8gUENUViBVU0IgKE5UU0MpIEZNIn0sCi0JezB4MjMwNCwgMHgwMjE0LCAtMSwgQ09ERUNfU0FBNzExMywgMywgVjRMMl9TVERfUEFMLCAgIDEsIDEsIDEsIDEsIFRVTkVSX1RFTUlDXzQwMDlGUjVfUEFMLCAgICAtMSwgLTEsICAwLCAgMywgIDcsICJQaW5uYWNsZSBTdHVkaW8gUENUViBVU0IgKFBBTCkgRk0ifSwKLQl7MHgyMzA0LCAweDAzMDAsIC0xLCBDT0RFQ19TQUE3MTEzLCAyLCBWNEwyX1NURF9OVFNDLCAgMSwgMCwgMSwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLCAtMSwgIDAsICAzLCAgNywgIlBpbm5hY2xlIFN0dWRpbyBMaW54IFZpZGVvIGlucHV0IGNhYmxlIChOVFNDKSJ9LAotCXsweDIzMDQsIDB4MDMwMSwgLTEsIENPREVDX1NBQTcxMTMsIDIsIFY0TDJfU1REX1BBTCwgICAxLCAwLCAxLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLTEsIC0xLCAgMCwgIDMsICA3LCAiUGlubmFjbGUgU3R1ZGlvIExpbnggVmlkZW8gaW5wdXQgY2FibGUgKFBBTCkifSwKLQl7MHgyMzA0LCAweDA0MTksIC0xLCBDT0RFQ19TQUE3MTEzLCAzLCBWNEwyX1NURF9QQUwsICAgMSwgMSwgMSwgMSwgVFVORVJfVEVNSUNfNDAwOUZSNV9QQUwsICAgIC0xLCAtMSwgIDAsICAzLCAgNywgIlBpbm5hY2xlIFBDVFYgQnVuZ2VlIFVTQiAoUEFMKSBGTSJ9LAotCXsweDI0MDAsIDB4NDIwMCwgLTEsIENPREVDX1NBQTcxMTEsIDMsIFY0TDJfU1REX05UU0MsICAxLCAwLCAxLCAxLCBUVU5FUl9QSElMSVBTX05UU0NfTSwgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAiSGF1cHBhdWdlIFdpblR2LVVTQiJ9LAotCXt9ICAvKiBUZXJtaW5hdGluZyBlbnRyeSAqLworCVtYQU5CT09dID0geworCQkuSW50ZXJmYWNlICAgICA9IC0xLAorCQkuQ29kZWMgICAgICAgICA9IENPREVDX1NBQTcxMTMsCisJCS5WaWRlb0NoYW5uZWxzID0gNCwKKwkJLlZpZGVvTm9ybSAgICAgPSBWNEwyX1NURF9OVFNDLAorCQkuQXVkaW9DaGFubmVscyA9IDEsCisJCS5SYWRpbyAgICAgICAgID0gMCwKKwkJLnZiaSAgICAgICAgICAgPSAxLAorCQkuVHVuZXIgICAgICAgICA9IDAsCisJCS5UdW5lclR5cGUgICAgID0gMCwKKwkJLlhfT2Zmc2V0ICAgICAgPSAtMSwKKwkJLllfT2Zmc2V0ICAgICAgPSAtMSwKKwkJLk1vZGVsU3RyaW5nICAgPSAiWGFuYm9vIiwKKwl9LAorCVtCRUxLSU5fVklERU9CVVNfSUldID0geworCQkuSW50ZXJmYWNlICAgICA9IC0xLAorCQkuQ29kZWMgICAgICAgICA9IENPREVDX1NBQTcxMTMsCisJCS5WaWRlb0NoYW5uZWxzID0gMiwKKwkJLlZpZGVvTm9ybSAgICAgPSBWNEwyX1NURF9QQUwsCisJCS5BdWRpb0NoYW5uZWxzID0gMSwKKwkJLlJhZGlvICAgICAgICAgPSAwLAorCQkudmJpICAgICAgICAgICA9IDEsCisJCS5UdW5lciAgICAgICAgID0gMCwKKwkJLlR1bmVyVHlwZSAgICAgPSAwLAorCQkuWF9PZmZzZXQgICAgICA9IDAsCisJCS5ZX09mZnNldCAgICAgID0gMywKKwkJLkR2aV95dXZfb3ZlcnJpZGUgPSAxLAorCQkuRHZpX3l1diAgICAgICA9IDcsCisJCS5Nb2RlbFN0cmluZyAgID0gIkJlbGtpbiBVU0IgVmlkZW9CdXMgSUkgQWRhcHRlciIsCisJfSwKKwlbQkVMS0lOX1ZJREVPQlVTXSA9IHsKKwkJLkludGVyZmFjZSAgICAgPSAtMSwKKwkJLkNvZGVjICAgICAgICAgPSBDT0RFQ19TQUE3MTExLAorCQkuVmlkZW9DaGFubmVscyA9IDIsCisJCS5WaWRlb05vcm0gICAgID0gVjRMMl9TVERfTlRTQywKKwkJLkF1ZGlvQ2hhbm5lbHMgPSAxLAorCQkuUmFkaW8gICAgICAgICA9IDAsCisJCS52YmkgICAgICAgICAgID0gMSwKKwkJLlR1bmVyICAgICAgICAgPSAwLAorCQkuVHVuZXJUeXBlICAgICA9IDAsCisJCS5YX09mZnNldCAgICAgID0gLTEsCisJCS5ZX09mZnNldCAgICAgID0gLTEsCisJCS5Nb2RlbFN0cmluZyAgID0gIkJlbGtpbiBDb21wb25lbnRzIFVTQiBWaWRlb0J1cyIsCisJfSwKKwlbQkVMS0lOX1VTQl9WSURFT0JVU19JSV0gPSB7CisJCS5JbnRlcmZhY2UgICAgID0gLTEsCisJCS5Db2RlYyAgICAgICAgID0gQ09ERUNfU0FBNzExMywKKwkJLlZpZGVvQ2hhbm5lbHMgPSAyLAorCQkuVmlkZW9Ob3JtICAgICA9IFY0TDJfU1REX1BBTCwKKwkJLkF1ZGlvQ2hhbm5lbHMgPSAxLAorCQkuUmFkaW8gICAgICAgICA9IDAsCisJCS52YmkgICAgICAgICAgID0gMSwKKwkJLlR1bmVyICAgICAgICAgPSAwLAorCQkuVHVuZXJUeXBlICAgICA9IDAsCisJCS5YX09mZnNldCAgICAgID0gMCwKKwkJLllfT2Zmc2V0ICAgICAgPSAzLAorCQkuRHZpX3l1dl9vdmVycmlkZSA9IDEsCisJCS5EdmlfeXV2ICAgICAgID0gNywKKwkJLk1vZGVsU3RyaW5nICAgPSAiQmVsa2luIFVTQiBWaWRlb0J1cyBJSSIsCisJfSwKKwlbRUNIT0ZYX0lOVEVSVklFV19MSVRFXSA9IHsKKwkJLkludGVyZmFjZSAgICAgPSAwLAorCQkuQ29kZWMgICAgICAgICA9IENPREVDX1NBQTcxMTEsCisJCS5WaWRlb0NoYW5uZWxzID0gMiwKKwkJLlZpZGVvTm9ybSAgICAgPSBWNEwyX1NURF9QQUwsCisJCS5BdWRpb0NoYW5uZWxzID0gMCwKKwkJLlJhZGlvICAgICAgICAgPSAwLAorCQkudmJpICAgICAgICAgICA9IDEsCisJCS5UdW5lciAgICAgICAgID0gMCwKKwkJLlR1bmVyVHlwZSAgICAgPSAwLAorCQkuWF9PZmZzZXQgICAgICA9IC0xLAorCQkuWV9PZmZzZXQgICAgICA9IC0xLAorCQkuRHZpX3l1dl9vdmVycmlkZSA9IDEsCisJCS5EdmlfeXV2ICAgICAgID0gNywKKwkJLk1vZGVsU3RyaW5nICAgPSAiZWNob0ZYIEludGVyVmlldyBMaXRlIiwKKwl9LAorCVtVU0JHRUFSX1VTQkdfVjFdID0geworCQkuSW50ZXJmYWNlICAgICA9IC0xLAorCQkuQ29kZWMgICAgICAgICA9IENPREVDX1NBQTcxMTEsCisJCS5WaWRlb0NoYW5uZWxzID0gMiwKKwkJLlZpZGVvTm9ybSAgICAgPSBWNEwyX1NURF9OVFNDLAorCQkuQXVkaW9DaGFubmVscyA9IDEsCisJCS5SYWRpbyAgICAgICAgID0gMCwKKwkJLnZiaSAgICAgICAgICAgPSAxLAorCQkuVHVuZXIgICAgICAgICA9IDAsCisJCS5UdW5lclR5cGUgICAgID0gMCwKKwkJLlhfT2Zmc2V0ICAgICAgPSAtMSwKKwkJLllfT2Zmc2V0ICAgICAgPSAtMSwKKwkJLk1vZGVsU3RyaW5nICAgPSAiVVNCR2VhciBVU0JHLVYxIHJlc3AuIEhBTUEgVVNCIiwKKwl9LAorCVtEX0xJTktfVjEwMF0gPSB7CisJCS5JbnRlcmZhY2UgICAgID0gLTEsCisJCS5Db2RlYyAgICAgICAgID0gQ09ERUNfU0FBNzExMywKKwkJLlZpZGVvQ2hhbm5lbHMgPSA0LAorCQkuVmlkZW9Ob3JtICAgICA9IFY0TDJfU1REX05UU0MsCisJCS5BdWRpb0NoYW5uZWxzID0gMCwKKwkJLlJhZGlvICAgICAgICAgPSAwLAorCQkudmJpICAgICAgICAgICA9IDEsCisJCS5UdW5lciAgICAgICAgID0gMCwKKwkJLlR1bmVyVHlwZSAgICAgPSAwLAorCQkuWF9PZmZzZXQgICAgICA9IDAsCisJCS5ZX09mZnNldCAgICAgID0gMywKKwkJLkR2aV95dXZfb3ZlcnJpZGUgPSAxLAorCQkuRHZpX3l1diAgICAgICA9IDcsCisJCS5Nb2RlbFN0cmluZyAgID0gIkQtTGluayBWMTAwIiwKKwl9LAorCVtYMTBfVVNCX0NBTUVSQV0gPSB7CisJCS5JbnRlcmZhY2UgICAgID0gLTEsCisJCS5Db2RlYyAgICAgICAgID0gQ09ERUNfU0FBNzExMSwKKwkJLlZpZGVvQ2hhbm5lbHMgPSAyLAorCQkuVmlkZW9Ob3JtICAgICA9IFY0TDJfU1REX05UU0MsCisJCS5BdWRpb0NoYW5uZWxzID0gMSwKKwkJLlJhZGlvICAgICAgICAgPSAwLAorCQkudmJpICAgICAgICAgICA9IDEsCisJCS5UdW5lciAgICAgICAgID0gMCwKKwkJLlR1bmVyVHlwZSAgICAgPSAwLAorCQkuWF9PZmZzZXQgICAgICA9IC0xLAorCQkuWV9PZmZzZXQgICAgICA9IC0xLAorCQkuTW9kZWxTdHJpbmcgICA9ICJYMTAgVVNCIENhbWVyYSIsCisJfSwKKwlbSFBHX1dJTlRWX0xJVkVfUEFMX0JHXSA9IHsKKwkJLkludGVyZmFjZSAgICAgPSAtMSwKKwkJLkNvZGVjICAgICAgICAgPSBDT0RFQ19TQUE3MTExLAorCQkuVmlkZW9DaGFubmVscyA9IDIsCisJCS5WaWRlb05vcm0gICAgID0gVjRMMl9TVERfUEFMLAorCQkuQXVkaW9DaGFubmVscyA9IDEsCisJCS5SYWRpbyAgICAgICAgID0gMCwKKwkJLnZiaSAgICAgICAgICAgPSAxLAorCQkuVHVuZXIgICAgICAgICA9IDAsCisJCS5UdW5lclR5cGUgICAgID0gMCwKKwkJLlhfT2Zmc2V0ICAgICAgPSAtMSwKKwkJLllfT2Zmc2V0ICAgICAgPSAzLAorCQkuRHZpX3l1dl9vdmVycmlkZSA9IDEsCisJCS5EdmlfeXV2ICAgICAgID0gNywKKwkJLk1vZGVsU3RyaW5nICAgPSAiSGF1cHBhdWdlIFdpblRWIFVTQiBMaXZlIChQQUwgQi9HKSIsCisJfSwKKwlbSFBHX1dJTlRWX0xJVkVfUFJPX05UU0NfTU5dID0geworCQkuSW50ZXJmYWNlICAgICA9IC0xLAorCQkuQ29kZWMgICAgICAgICA9IENPREVDX1NBQTcxMTMsCisJCS5WaWRlb0NoYW5uZWxzID0gMiwKKwkJLlZpZGVvTm9ybSAgICAgPSBWNEwyX1NURF9OVFNDLAorCQkuQXVkaW9DaGFubmVscyA9IDAsCisJCS5SYWRpbyAgICAgICAgID0gMCwKKwkJLnZiaSAgICAgICAgICAgPSAxLAorCQkuVHVuZXIgICAgICAgICA9IDAsCisJCS5UdW5lclR5cGUgICAgID0gMCwKKwkJLlhfT2Zmc2V0ICAgICAgPSAwLAorCQkuWV9PZmZzZXQgICAgICA9IDMsCisJCS5EdmlfeXV2X292ZXJyaWRlID0gMSwKKwkJLkR2aV95dXYgICAgICAgPSA3LAorCQkuTW9kZWxTdHJpbmcgICA9ICJIYXVwcGF1Z2UgV2luVFYgVVNCIExpdmUgUHJvIChOVFNDIE0vTikiLAorCX0sCisJW1pPUkFOX1BNRF9OT0dBVEVDSF0gPSB7CisJCS5JbnRlcmZhY2UgICAgID0gLTEsCisJCS5Db2RlYyAgICAgICAgID0gQ09ERUNfU0FBNzExMywKKwkJLlZpZGVvQ2hhbm5lbHMgPSAyLAorCQkuVmlkZW9Ob3JtICAgICA9IFY0TDJfU1REX1BBTCwKKwkJLkF1ZGlvQ2hhbm5lbHMgPSAyLAorCQkuUmFkaW8gICAgICAgICA9IDAsCisJCS52YmkgICAgICAgICAgID0gMSwKKwkJLlR1bmVyICAgICAgICAgPSAwLAorCQkuVHVuZXJUeXBlICAgICA9IDAsCisJCS5YX09mZnNldCAgICAgID0gMCwKKwkJLllfT2Zmc2V0ICAgICAgPSAzLAorCQkuRHZpX3l1dl9vdmVycmlkZSA9IDEsCisJCS5EdmlfeXV2ICAgICAgID0gNywKKwkJLk1vZGVsU3RyaW5nICAgPSAiWm9yYW4gQ28uIFBNRCAoTm9nYXRlY2gpIEFWLWdyYWJiZXIgTWFuaGF0dGFuIiwKKwl9LAorCVtOT0dBVEVDSF9VU0JfVFZfTlRTQ19GTV0gPSB7CisJCS5JbnRlcmZhY2UgICAgID0gLTEsCisJCS5Db2RlYyAgICAgICAgID0gQ09ERUNfU0FBNzExMSwKKwkJLlZpZGVvQ2hhbm5lbHMgPSAzLAorCQkuVmlkZW9Ob3JtICAgICA9IFY0TDJfU1REX05UU0MsCisJCS5BdWRpb0NoYW5uZWxzID0gMSwKKwkJLlJhZGlvICAgICAgICAgPSAxLAorCQkudmJpICAgICAgICAgICA9IDEsCisJCS5UdW5lciAgICAgICAgID0gMSwKKwkJLlR1bmVyVHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX05UU0NfTSwKKwkJLlhfT2Zmc2V0ICAgICAgPSAtMSwKKwkJLllfT2Zmc2V0ICAgICAgPSAyMCwKKwkJLk1vZGVsU3RyaW5nICAgPSAiTm9nYXRlY2ggVVNCLVRWIChOVFNDKSBGTSIsCisJfSwKKwlbUE5ZX1VTQl9UVl9OVFNDX0ZNXSA9IHsKKwkJLkludGVyZmFjZSAgICAgPSAtMSwKKwkJLkNvZGVjICAgICAgICAgPSBDT0RFQ19TQUE3MTExLAorCQkuVmlkZW9DaGFubmVscyA9IDMsCisJCS5WaWRlb05vcm0gICAgID0gVjRMMl9TVERfTlRTQywKKwkJLkF1ZGlvQ2hhbm5lbHMgPSAxLAorCQkuUmFkaW8gICAgICAgICA9IDEsCisJCS52YmkgICAgICAgICAgID0gMSwKKwkJLlR1bmVyICAgICAgICAgPSAxLAorCQkuVHVuZXJUeXBlICAgICA9IFRVTkVSX1BISUxJUFNfTlRTQ19NLAorCQkuWF9PZmZzZXQgICAgICA9IC0xLAorCQkuWV9PZmZzZXQgICAgICA9IDIwLAorCQkuTW9kZWxTdHJpbmcgICA9ICJQTlkgVVNCLVRWIChOVFNDKSBGTSIsCisJfSwKKwlbUFZfUExBWVRWX1VTQl9QUk9fUEFMX0ZNXSA9IHsKKwkJLkludGVyZmFjZSAgICAgPSAwLAorCQkuQ29kZWMgICAgICAgICA9IENPREVDX1NBQTcxMTMsCisJCS5WaWRlb0NoYW5uZWxzID0gMywKKwkJLlZpZGVvTm9ybSAgICAgPSBWNEwyX1NURF9QQUwsCisJCS5BdWRpb0NoYW5uZWxzID0gMSwKKwkJLlJhZGlvICAgICAgICAgPSAxLAorCQkudmJpICAgICAgICAgICA9IDEsCisJCS5UdW5lciAgICAgICAgID0gMSwKKwkJLlR1bmVyVHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1BBTCwKKwkJLlhfT2Zmc2V0ICAgICAgPSAwLAorCQkuWV9PZmZzZXQgICAgICA9IDMsCisJCS5EdmlfeXV2X292ZXJyaWRlID0gMSwKKwkJLkR2aV95dXYgICAgICAgPSA3LAorCQkuTW9kZWxTdHJpbmcgICA9ICJQaXhlbFZpZXcgUGxheVR2LVVTQiBQUk8gKFBBTCkgRk0iLAorCX0sCisJW1pUXzcyMV0gPSB7CisJCS5JbnRlcmZhY2UgICAgID0gMCwKKwkJLkNvZGVjICAgICAgICAgPSBDT0RFQ19TQUE3MTEzLAorCQkuVmlkZW9DaGFubmVscyA9IDMsCisJCS5WaWRlb05vcm0gICAgID0gVjRMMl9TVERfUEFMLAorCQkuQXVkaW9DaGFubmVscyA9IDEsCisJCS5SYWRpbyAgICAgICAgID0gMSwKKwkJLnZiaSAgICAgICAgICAgPSAxLAorCQkuVHVuZXIgICAgICAgICA9IDEsCisJCS5UdW5lclR5cGUgICAgID0gVFVORVJfUEhJTElQU19QQUwsCisJCS5YX09mZnNldCAgICAgID0gMCwKKwkJLllfT2Zmc2V0ICAgICAgPSAzLAorCQkuRHZpX3l1dl9vdmVycmlkZSA9IDEsCisJCS5EdmlfeXV2ICAgICAgID0gNywKKwkJLk1vZGVsU3RyaW5nICAgPSAiWlRWIFpULTcyMSAyLjRHSHogVVNCIEEvViBSZWNlaXZlciIsCisJfSwKKwlbSFBHX1dJTlRWX05UU0NfTU5dID0geworCQkuSW50ZXJmYWNlICAgICA9IC0xLAorCQkuQ29kZWMgICAgICAgICA9IENPREVDX1NBQTcxMTEsCisJCS5WaWRlb0NoYW5uZWxzID0gMywKKwkJLlZpZGVvTm9ybSAgICAgPSBWNEwyX1NURF9OVFNDLAorCQkuQXVkaW9DaGFubmVscyA9IDEsCisJCS5SYWRpbyAgICAgICAgID0gMCwKKwkJLnZiaSAgICAgICAgICAgPSAxLAorCQkuVHVuZXIgICAgICAgICA9IDEsCisJCS5UdW5lclR5cGUgICAgID0gVFVORVJfUEhJTElQU19OVFNDX00sCisJCS5YX09mZnNldCAgICAgID0gLTEsCisJCS5ZX09mZnNldCAgICAgID0gMjAsCisJCS5Nb2RlbFN0cmluZyAgID0gIkhhdXBwYXVnZSBXaW5UViBVU0IgKE5UU0MgTS9OKSIsCisJfSwKKwlbSFBHX1dJTlRWX1BBTF9CR10gPSB7CisJCS5JbnRlcmZhY2UgICAgID0gLTEsCisJCS5Db2RlYyAgICAgICAgID0gQ09ERUNfU0FBNzExMSwKKwkJLlZpZGVvQ2hhbm5lbHMgPSAzLAorCQkuVmlkZW9Ob3JtICAgICA9IFY0TDJfU1REX1BBTCwKKwkJLkF1ZGlvQ2hhbm5lbHMgPSAxLAorCQkuUmFkaW8gICAgICAgICA9IDAsCisJCS52YmkgICAgICAgICAgID0gMSwKKwkJLlR1bmVyICAgICAgICAgPSAxLAorCQkuVHVuZXJUeXBlICAgICA9IFRVTkVSX1BISUxJUFNfUEFMLAorCQkuWF9PZmZzZXQgICAgICA9IC0xLAorCQkuWV9PZmZzZXQgICAgICA9IC0xLAorCQkuTW9kZWxTdHJpbmcgICA9ICJIYXVwcGF1Z2UgV2luVFYgVVNCIChQQUwgQi9HKSIsCisJfSwKKwlbSFBHX1dJTlRWX1BBTF9JXSA9IHsKKwkJLkludGVyZmFjZSAgICAgPSAtMSwKKwkJLkNvZGVjICAgICAgICAgPSBDT0RFQ19TQUE3MTExLAorCQkuVmlkZW9DaGFubmVscyA9IDMsCisJCS5WaWRlb05vcm0gICAgID0gVjRMMl9TVERfUEFMLAorCQkuQXVkaW9DaGFubmVscyA9IDEsCisJCS5SYWRpbyAgICAgICAgID0gMCwKKwkJLnZiaSAgICAgICAgICAgPSAxLAorCQkuVHVuZXIgICAgICAgICA9IDEsCisJCS5UdW5lclR5cGUgICAgID0gVFVORVJfUEhJTElQU19QQUwsCisJCS5YX09mZnNldCAgICAgID0gLTEsCisJCS5ZX09mZnNldCAgICAgID0gLTEsCisJCS5Nb2RlbFN0cmluZyAgID0gIkhhdXBwYXVnZSBXaW5UViBVU0IgKFBBTCBJKSIsCisJfSwKKwlbSFBHX1dJTlRWX1BBTF9TRUNBTV9MXSA9IHsKKwkJLkludGVyZmFjZSAgICAgPSAtMSwKKwkJLkNvZGVjICAgICAgICAgPSBDT0RFQ19TQUE3MTExLAorCQkuVmlkZW9DaGFubmVscyA9IDMsCisJCS5WaWRlb05vcm0gICAgID0gVjRMMl9TVERfU0VDQU0sCisJCS5BdWRpb0NoYW5uZWxzID0gMSwKKwkJLlJhZGlvICAgICAgICAgPSAwLAorCQkudmJpICAgICAgICAgICA9IDEsCisJCS5UdW5lciAgICAgICAgID0gMSwKKwkJLlR1bmVyVHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1NFQ0FNLAorCQkuWF9PZmZzZXQgICAgICA9IC0xLAorCQkuWV9PZmZzZXQgICAgICA9IC0xLAorCQkuTW9kZWxTdHJpbmcgICA9ICJIYXVwcGF1Z2UgV2luVFYgVVNCIChQQUwvU0VDQU0gTCkiLAorCX0sCisJW0hQR19XSU5UVl9QQUxfRF9LXSA9IHsKKwkJLkludGVyZmFjZSAgICAgPSAtMSwKKwkJLkNvZGVjICAgICAgICAgPSBDT0RFQ19TQUE3MTExLAorCQkuVmlkZW9DaGFubmVscyA9IDMsCisJCS5WaWRlb05vcm0gICAgID0gVjRMMl9TVERfUEFMLAorCQkuQXVkaW9DaGFubmVscyA9IDEsCisJCS5SYWRpbyAgICAgICAgID0gMCwKKwkJLnZiaSAgICAgICAgICAgPSAxLAorCQkuVHVuZXIgICAgICAgICA9IDEsCisJCS5UdW5lclR5cGUgICAgID0gVFVORVJfUEhJTElQU19QQUwsCisJCS5YX09mZnNldCAgICAgID0gLTEsCisJCS5ZX09mZnNldCAgICAgID0gLTEsCisJCS5Nb2RlbFN0cmluZyAgID0gIkhhdXBwYXVnZSBXaW5UViBVU0IgKFBBTCBEL0spIiwKKwl9LAorCVtIUEdfV0lOVFZfTlRTQ19GTV0gPSB7CisJCS5JbnRlcmZhY2UgICAgID0gLTEsCisJCS5Db2RlYyAgICAgICAgID0gQ09ERUNfU0FBNzExMSwKKwkJLlZpZGVvQ2hhbm5lbHMgPSAzLAorCQkuVmlkZW9Ob3JtICAgICA9IFY0TDJfU1REX05UU0MsCisJCS5BdWRpb0NoYW5uZWxzID0gMSwKKwkJLlJhZGlvICAgICAgICAgPSAxLAorCQkudmJpICAgICAgICAgICA9IDEsCisJCS5UdW5lciAgICAgICAgID0gMSwKKwkJLlR1bmVyVHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX05UU0NfTSwKKwkJLlhfT2Zmc2V0ICAgICAgPSAtMSwKKwkJLllfT2Zmc2V0ICAgICAgPSAtMSwKKwkJLk1vZGVsU3RyaW5nICAgPSAiSGF1cHBhdWdlIFdpblRWIFVTQiAoTlRTQyBGTSkiLAorCX0sCisJW0hQR19XSU5UVl9QQUxfQkdfRk1dID0geworCQkuSW50ZXJmYWNlICAgICA9IC0xLAorCQkuQ29kZWMgICAgICAgICA9IENPREVDX1NBQTcxMTEsCisJCS5WaWRlb0NoYW5uZWxzID0gMywKKwkJLlZpZGVvTm9ybSAgICAgPSBWNEwyX1NURF9QQUwsCisJCS5BdWRpb0NoYW5uZWxzID0gMSwKKwkJLlJhZGlvICAgICAgICAgPSAxLAorCQkudmJpICAgICAgICAgICA9IDEsCisJCS5UdW5lciAgICAgICAgID0gMSwKKwkJLlR1bmVyVHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1BBTCwKKwkJLlhfT2Zmc2V0ICAgICAgPSAtMSwKKwkJLllfT2Zmc2V0ICAgICAgPSAtMSwKKwkJLk1vZGVsU3RyaW5nICAgPSAiSGF1cHBhdWdlIFdpblRWIFVTQiAoUEFMIEIvRyBGTSkiLAorCX0sCisJW0hQR19XSU5UVl9QQUxfSV9GTV0gPSB7CisJCS5JbnRlcmZhY2UgICAgID0gLTEsCisJCS5Db2RlYyAgICAgICAgID0gQ09ERUNfU0FBNzExMSwKKwkJLlZpZGVvQ2hhbm5lbHMgPSAzLAorCQkuVmlkZW9Ob3JtICAgICA9IFY0TDJfU1REX1BBTCwKKwkJLkF1ZGlvQ2hhbm5lbHMgPSAxLAorCQkuUmFkaW8gICAgICAgICA9IDEsCisJCS52YmkgICAgICAgICAgID0gMSwKKwkJLlR1bmVyICAgICAgICAgPSAxLAorCQkuVHVuZXJUeXBlICAgICA9IFRVTkVSX1BISUxJUFNfUEFMLAorCQkuWF9PZmZzZXQgICAgICA9IC0xLAorCQkuWV9PZmZzZXQgICAgICA9IC0xLAorCQkuTW9kZWxTdHJpbmcgICA9ICJIYXVwcGF1Z2UgV2luVFYgVVNCIChQQUwgSSBGTSkiLAorCX0sCisJW0hQR19XSU5UVl9QQUxfRF9LX0ZNXSA9IHsKKwkJLkludGVyZmFjZSAgICAgPSAtMSwKKwkJLkNvZGVjICAgICAgICAgPSBDT0RFQ19TQUE3MTExLAorCQkuVmlkZW9DaGFubmVscyA9IDMsCisJCS5WaWRlb05vcm0gICAgID0gVjRMMl9TVERfUEFMLAorCQkuQXVkaW9DaGFubmVscyA9IDEsCisJCS5SYWRpbyAgICAgICAgID0gMSwKKwkJLnZiaSAgICAgICAgICAgPSAxLAorCQkuVHVuZXIgICAgICAgICA9IDEsCisJCS5UdW5lclR5cGUgICAgID0gVFVORVJfUEhJTElQU19QQUwsCisJCS5YX09mZnNldCAgICAgID0gLTEsCisJCS5ZX09mZnNldCAgICAgID0gLTEsCisJCS5Nb2RlbFN0cmluZyAgID0gIkhhdXBwYXVnZSBXaW5UViBVU0IgKFBBTCBEL0sgRk0pIiwKKwl9LAorCVtIUEdfV0lOVFZfUFJPX05UU0NfTU5dID0geworCQkuSW50ZXJmYWNlICAgICA9IDAsCisJCS5Db2RlYyAgICAgICAgID0gQ09ERUNfU0FBNzExMywKKwkJLlZpZGVvQ2hhbm5lbHMgPSAzLAorCQkuVmlkZW9Ob3JtICAgICA9IFY0TDJfU1REX05UU0MsCisJCS5BdWRpb0NoYW5uZWxzID0gMSwKKwkJLlJhZGlvICAgICAgICAgPSAxLAorCQkudmJpICAgICAgICAgICA9IDEsCisJCS5UdW5lciAgICAgICAgID0gMSwKKwkJLlR1bmVyVHlwZSAgICAgPSBUVU5FUl9NSUNST1RVTkVfNDA0OUZNNSwKKwkJLlhfT2Zmc2V0ICAgICAgPSAwLAorCQkuWV9PZmZzZXQgICAgICA9IDMsCisJCS5EdmlfeXV2X292ZXJyaWRlID0gMSwKKwkJLkR2aV95dXYgICAgICAgPSA3LAorCQkuTW9kZWxTdHJpbmcgICA9ICJIYXVwcGF1Z2UgV2luVFYgVVNCIFBybyAoTlRTQyBNL04pIiwKKwl9LAorCVtIUEdfV0lOVFZfUFJPX05UU0NfTU5fVjJdID0geworCQkuSW50ZXJmYWNlICAgICA9IDAsCisJCS5Db2RlYyAgICAgICAgID0gQ09ERUNfU0FBNzExMywKKwkJLlZpZGVvQ2hhbm5lbHMgPSAzLAorCQkuVmlkZW9Ob3JtICAgICA9IFY0TDJfU1REX05UU0MsCisJCS5BdWRpb0NoYW5uZWxzID0gMSwKKwkJLlJhZGlvICAgICAgICAgPSAxLAorCQkudmJpICAgICAgICAgICA9IDEsCisJCS5UdW5lciAgICAgICAgID0gMSwKKwkJLlR1bmVyVHlwZSAgICAgPSBUVU5FUl9NSUNST1RVTkVfNDA0OUZNNSwKKwkJLlhfT2Zmc2V0ICAgICAgPSAwLAorCQkuWV9PZmZzZXQgICAgICA9IDMsCisJCS5EdmlfeXV2X292ZXJyaWRlID0gMSwKKwkJLkR2aV95dXYgICAgICAgPSA3LAorCQkuTW9kZWxTdHJpbmcgICA9ICJIYXVwcGF1Z2UgV2luVFYgVVNCIFBybyAoTlRTQyBNL04pIFYyIiwKKwl9LAorCVtIUEdfV0lOVFZfUFJPX1BBTF0gPSB7CisJCS5JbnRlcmZhY2UgICAgID0gMCwKKwkJLkNvZGVjICAgICAgICAgPSBDT0RFQ19TQUE3MTEzLAorCQkuVmlkZW9DaGFubmVscyA9IDMsCisJCS5WaWRlb05vcm0gICAgID0gVjRMMl9TVERfUEFMLAorCQkuQXVkaW9DaGFubmVscyA9IDEsCisJCS5SYWRpbyAgICAgICAgID0gMCwKKwkJLnZiaSAgICAgICAgICAgPSAxLAorCQkuVHVuZXIgICAgICAgICA9IDEsCisJCS5UdW5lclR5cGUgICAgID0gVFVORVJfUEhJTElQU19GTTEyMTZNRV9NSzMsCisJCS5YX09mZnNldCAgICAgID0gMCwKKwkJLllfT2Zmc2V0ICAgICAgPSAzLAorCQkuRHZpX3l1dl9vdmVycmlkZSA9IDEsCisJCS5EdmlfeXV2ICAgICAgID0gNywKKwkJLk1vZGVsU3RyaW5nICAgPSAiSGF1cHBhdWdlIFdpblRWIFVTQiBQcm8gKFBBTC9TRUNBTSBCL0cvSS9EL0svTCkiLAorCX0sCisJW0hQR19XSU5UVl9QUk9fTlRTQ19NTl9WM10gPSB7CisJCS5JbnRlcmZhY2UgICAgID0gMCwKKwkJLkNvZGVjICAgICAgICAgPSBDT0RFQ19TQUE3MTEzLAorCQkuVmlkZW9DaGFubmVscyA9IDMsCisJCS5WaWRlb05vcm0gICAgID0gVjRMMl9TVERfTlRTQywKKwkJLkF1ZGlvQ2hhbm5lbHMgPSAxLAorCQkuUmFkaW8gICAgICAgICA9IDEsCisJCS52YmkgICAgICAgICAgID0gMSwKKwkJLlR1bmVyICAgICAgICAgPSAxLAorCQkuVHVuZXJUeXBlICAgICA9IFRVTkVSX1BISUxJUFNfTlRTQ19NLAorCQkuWF9PZmZzZXQgICAgICA9IDAsCisJCS5ZX09mZnNldCAgICAgID0gMywKKwkJLkR2aV95dXZfb3ZlcnJpZGUgPSAxLAorCQkuRHZpX3l1diAgICAgICA9IDcsCisJCS5Nb2RlbFN0cmluZyAgID0gIkhhdXBwYXVnZSBXaW5UViBVU0IgUHJvIChOVFNDIE0vTikgVjMiLAorCX0sCisJW0hQR19XSU5UVl9QUk9fUEFMX0JHXSA9IHsKKwkJLkludGVyZmFjZSAgICAgPSAwLAorCQkuQ29kZWMgICAgICAgICA9IENPREVDX1NBQTcxMTMsCisJCS5WaWRlb0NoYW5uZWxzID0gMywKKwkJLlZpZGVvTm9ybSAgICAgPSBWNEwyX1NURF9QQUwsCisJCS5BdWRpb0NoYW5uZWxzID0gMSwKKwkJLlJhZGlvICAgICAgICAgPSAwLAorCQkudmJpICAgICAgICAgICA9IDEsCisJCS5UdW5lciAgICAgICAgID0gMSwKKwkJLlR1bmVyVHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1BBTCwKKwkJLlhfT2Zmc2V0ICAgICAgPSAwLAorCQkuWV9PZmZzZXQgICAgICA9IDMsCisJCS5EdmlfeXV2X292ZXJyaWRlID0gMSwKKwkJLkR2aV95dXYgICAgICAgPSA3LAorCQkuTW9kZWxTdHJpbmcgICA9ICJIYXVwcGF1Z2UgV2luVFYgVVNCIFBybyAoUEFMIEIvRykiLAorCX0sCisJW0hQR19XSU5UVl9QUk9fUEFMX0ldID0geworCQkuSW50ZXJmYWNlICAgICA9IDAsCisJCS5Db2RlYyAgICAgICAgID0gQ09ERUNfU0FBNzExMywKKwkJLlZpZGVvQ2hhbm5lbHMgPSAzLAorCQkuVmlkZW9Ob3JtICAgICA9IFY0TDJfU1REX1BBTCwKKwkJLkF1ZGlvQ2hhbm5lbHMgPSAxLAorCQkuUmFkaW8gICAgICAgICA9IDAsCisJCS52YmkgICAgICAgICAgID0gMSwKKwkJLlR1bmVyICAgICAgICAgPSAxLAorCQkuVHVuZXJUeXBlICAgICA9IFRVTkVSX1BISUxJUFNfUEFMLAorCQkuWF9PZmZzZXQgICAgICA9IDAsCisJCS5ZX09mZnNldCAgICAgID0gMywKKwkJLkR2aV95dXZfb3ZlcnJpZGUgPSAxLAorCQkuRHZpX3l1diAgICAgICA9IDcsCisJCS5Nb2RlbFN0cmluZyAgID0gIkhhdXBwYXVnZSBXaW5UViBVU0IgUHJvIChQQUwgSSkiLAorCX0sCisJW0hQR19XSU5UVl9QUk9fUEFMX1NFQ0FNX0xdID0geworCQkuSW50ZXJmYWNlICAgICA9IC0xLAorCQkuQ29kZWMgICAgICAgICA9IENPREVDX1NBQTcxMTMsCisJCS5WaWRlb0NoYW5uZWxzID0gMywKKwkJLlZpZGVvTm9ybSAgICAgPSBWNEwyX1NURF9TRUNBTSwKKwkJLkF1ZGlvQ2hhbm5lbHMgPSAxLAorCQkuUmFkaW8gICAgICAgICA9IDAsCisJCS52YmkgICAgICAgICAgID0gMSwKKwkJLlR1bmVyICAgICAgICAgPSAxLAorCQkuVHVuZXJUeXBlICAgICA9IFRVTkVSX1BISUxJUFNfU0VDQU0sCisJCS5YX09mZnNldCAgICAgID0gMCwKKwkJLllfT2Zmc2V0ICAgICAgPSAzLAorCQkuRHZpX3l1dl9vdmVycmlkZSA9IDEsCisJCS5EdmlfeXV2ICAgICAgID0gNywKKwkJLk1vZGVsU3RyaW5nICAgPSAiSGF1cHBhdWdlIFdpblRWIFVTQiBQcm8gKFBBTC9TRUNBTSBMKSIsCisJfSwKKwlbSFBHX1dJTlRWX1BST19QQUxfRF9LXSA9IHsKKwkJLkludGVyZmFjZSAgICAgPSAtMSwKKwkJLkNvZGVjICAgICAgICAgPSBDT0RFQ19TQUE3MTEzLAorCQkuVmlkZW9DaGFubmVscyA9IDMsCisJCS5WaWRlb05vcm0gICAgID0gVjRMMl9TVERfUEFMLAorCQkuQXVkaW9DaGFubmVscyA9IDEsCisJCS5SYWRpbyAgICAgICAgID0gMCwKKwkJLnZiaSAgICAgICAgICAgPSAxLAorCQkuVHVuZXIgICAgICAgICA9IDEsCisJCS5UdW5lclR5cGUgICAgID0gVFVORVJfUEhJTElQU19QQUwsCisJCS5YX09mZnNldCAgICAgID0gMCwKKwkJLllfT2Zmc2V0ICAgICAgPSAzLAorCQkuRHZpX3l1dl9vdmVycmlkZSA9IDEsCisJCS5EdmlfeXV2ICAgICAgID0gNywKKwkJLk1vZGVsU3RyaW5nICAgPSAiSGF1cHBhdWdlIFdpblRWIFVTQiBQcm8gKFBBTCBEL0spIiwKKwl9LAorCVtIUEdfV0lOVFZfUFJPX1BBTF9TRUNBTV0gPSB7CisJCS5JbnRlcmZhY2UgICAgID0gLTEsCisJCS5Db2RlYyAgICAgICAgID0gQ09ERUNfU0FBNzExMywKKwkJLlZpZGVvQ2hhbm5lbHMgPSAzLAorCQkuVmlkZW9Ob3JtICAgICA9IFY0TDJfU1REX1NFQ0FNLAorCQkuQXVkaW9DaGFubmVscyA9IDEsCisJCS5SYWRpbyAgICAgICAgID0gMCwKKwkJLnZiaSAgICAgICAgICAgPSAxLAorCQkuVHVuZXIgICAgICAgICA9IDEsCisJCS5UdW5lclR5cGUgICAgID0gVFVORVJfUEhJTElQU19TRUNBTSwKKwkJLlhfT2Zmc2V0ICAgICAgPSAwLAorCQkuWV9PZmZzZXQgICAgICA9IDMsCisJCS5EdmlfeXV2X292ZXJyaWRlID0gMSwKKwkJLkR2aV95dXYgICAgICAgPSA3LAorCQkuTW9kZWxTdHJpbmcgICA9ICJIYXVwcGF1Z2UgV2luVFYgVVNCIFBybyAoUEFML1NFQ0FNIEJHREsvSS9MKSIsCisJfSwKKwlbSFBHX1dJTlRWX1BST19QQUxfU0VDQU1fVjJdID0geworCQkuSW50ZXJmYWNlICAgICA9IC0xLAorCQkuQ29kZWMgICAgICAgICA9IENPREVDX1NBQTcxMTMsCisJCS5WaWRlb0NoYW5uZWxzID0gMywKKwkJLlZpZGVvTm9ybSAgICAgPSBWNEwyX1NURF9TRUNBTSwKKwkJLkF1ZGlvQ2hhbm5lbHMgPSAxLAorCQkuUmFkaW8gICAgICAgICA9IDAsCisJCS52YmkgICAgICAgICAgID0gMSwKKwkJLlR1bmVyICAgICAgICAgPSAxLAorCQkuVHVuZXJUeXBlICAgICA9IFRVTkVSX1BISUxJUFNfU0VDQU0sCisJCS5YX09mZnNldCAgICAgID0gMCwKKwkJLllfT2Zmc2V0ICAgICAgPSAzLAorCQkuRHZpX3l1dl9vdmVycmlkZSA9IDEsCisJCS5EdmlfeXV2ICAgICAgID0gNywKKwkJLk1vZGVsU3RyaW5nICAgPSAiSGF1cHBhdWdlIFdpblRWIFVTQiBQcm8gKFBBTC9TRUNBTSBCR0RLL0kvTCkgVjIiLAorCX0sCisJW0hQR19XSU5UVl9QUk9fUEFMX0JHX1YyXSA9IHsKKwkJLkludGVyZmFjZSAgICAgPSAtMSwKKwkJLkNvZGVjICAgICAgICAgPSBDT0RFQ19TQUE3MTEzLAorCQkuVmlkZW9DaGFubmVscyA9IDMsCisJCS5WaWRlb05vcm0gICAgID0gVjRMMl9TVERfUEFMLAorCQkuQXVkaW9DaGFubmVscyA9IDEsCisJCS5SYWRpbyAgICAgICAgID0gMCwKKwkJLnZiaSAgICAgICAgICAgPSAxLAorCQkuVHVuZXIgICAgICAgICA9IDEsCisJCS5UdW5lclR5cGUgICAgID0gVFVORVJfQUxQU19UU0JFMV9QQUwsCisJCS5YX09mZnNldCAgICAgID0gMCwKKwkJLllfT2Zmc2V0ICAgICAgPSAzLAorCQkuRHZpX3l1dl9vdmVycmlkZSA9IDEsCisJCS5EdmlfeXV2ICAgICAgID0gNywKKwkJLk1vZGVsU3RyaW5nICAgPSAiSGF1cHBhdWdlIFdpblRWIFVTQiBQcm8gKFBBTCBCL0cpIFYyIiwKKwl9LAorCVtIUEdfV0lOVFZfUFJPX1BBTF9CR19EX0tdID0geworCQkuSW50ZXJmYWNlICAgICA9IC0xLAorCQkuQ29kZWMgICAgICAgICA9IENPREVDX1NBQTcxMTMsCisJCS5WaWRlb0NoYW5uZWxzID0gMywKKwkJLlZpZGVvTm9ybSAgICAgPSBWNEwyX1NURF9QQUwsCisJCS5BdWRpb0NoYW5uZWxzID0gMSwKKwkJLlJhZGlvICAgICAgICAgPSAwLAorCQkudmJpICAgICAgICAgICA9IDEsCisJCS5UdW5lciAgICAgICAgID0gMSwKKwkJLlR1bmVyVHlwZSAgICAgPSBUVU5FUl9BTFBTX1RTQkUxX1BBTCwKKwkJLlhfT2Zmc2V0ICAgICAgPSAwLAorCQkuWV9PZmZzZXQgICAgICA9IDMsCisJCS5EdmlfeXV2X292ZXJyaWRlID0gMSwKKwkJLkR2aV95dXYgICAgICAgPSA3LAorCQkuTW9kZWxTdHJpbmcgICA9ICJIYXVwcGF1Z2UgV2luVFYgVVNCIFBybyAoUEFMIEIvRyxEL0spIiwKKwl9LAorCVtIUEdfV0lOVFZfUFJPX1BBTF9JX0RfS10gPSB7CisJCS5JbnRlcmZhY2UgICAgID0gLTEsCisJCS5Db2RlYyAgICAgICAgID0gQ09ERUNfU0FBNzExMywKKwkJLlZpZGVvQ2hhbm5lbHMgPSAzLAorCQkuVmlkZW9Ob3JtICAgICA9IFY0TDJfU1REX1BBTCwKKwkJLkF1ZGlvQ2hhbm5lbHMgPSAxLAorCQkuUmFkaW8gICAgICAgICA9IDAsCisJCS52YmkgICAgICAgICAgID0gMSwKKwkJLlR1bmVyICAgICAgICAgPSAxLAorCQkuVHVuZXJUeXBlICAgICA9IFRVTkVSX1BISUxJUFNfUEFMLAorCQkuWF9PZmZzZXQgICAgICA9IDAsCisJCS5ZX09mZnNldCAgICAgID0gMywKKwkJLkR2aV95dXZfb3ZlcnJpZGUgPSAxLAorCQkuRHZpX3l1diAgICAgICA9IDcsCisJCS5Nb2RlbFN0cmluZyAgID0gIkhhdXBwYXVnZSBXaW5UViBVU0IgUHJvIChQQUwgSSxEL0spIiwKKwl9LAorCVtIUEdfV0lOVFZfUFJPX05UU0NfTU5fRk1dID0geworCQkuSW50ZXJmYWNlICAgICA9IC0xLAorCQkuQ29kZWMgICAgICAgICA9IENPREVDX1NBQTcxMTMsCisJCS5WaWRlb0NoYW5uZWxzID0gMywKKwkJLlZpZGVvTm9ybSAgICAgPSBWNEwyX1NURF9OVFNDLAorCQkuQXVkaW9DaGFubmVscyA9IDEsCisJCS5SYWRpbyAgICAgICAgID0gMSwKKwkJLnZiaSAgICAgICAgICAgPSAxLAorCQkuVHVuZXIgICAgICAgICA9IDEsCisJCS5UdW5lclR5cGUgICAgID0gVFVORVJfUEhJTElQU19OVFNDX00sCisJCS5YX09mZnNldCAgICAgID0gMCwKKwkJLllfT2Zmc2V0ICAgICAgPSAzLAorCQkuRHZpX3l1dl9vdmVycmlkZSA9IDEsCisJCS5EdmlfeXV2ICAgICAgID0gNywKKwkJLk1vZGVsU3RyaW5nICAgPSAiSGF1cHBhdWdlIFdpblRWIFVTQiBQcm8gKE5UU0MgTS9OIEZNKSIsCisJfSwKKwlbSFBHX1dJTlRWX1BST19QQUxfQkdfRk1dID0geworCQkuSW50ZXJmYWNlICAgICA9IDAsCisJCS5Db2RlYyAgICAgICAgID0gQ09ERUNfU0FBNzExMywKKwkJLlZpZGVvQ2hhbm5lbHMgPSAzLAorCQkuVmlkZW9Ob3JtICAgICA9IFY0TDJfU1REX1BBTCwKKwkJLkF1ZGlvQ2hhbm5lbHMgPSAxLAorCQkuUmFkaW8gICAgICAgICA9IDEsCisJCS52YmkgICAgICAgICAgID0gMSwKKwkJLlR1bmVyICAgICAgICAgPSAxLAorCQkuVHVuZXJUeXBlICAgICA9IFRVTkVSX1BISUxJUFNfUEFMLAorCQkuWF9PZmZzZXQgICAgICA9IDAsCisJCS5ZX09mZnNldCAgICAgID0gMywKKwkJLkR2aV95dXZfb3ZlcnJpZGUgPSAxLAorCQkuRHZpX3l1diAgICAgICA9IDcsCisJCS5Nb2RlbFN0cmluZyAgID0gIkhhdXBwYXVnZSBXaW5UViBVU0IgUHJvIChQQUwgQi9HIEZNKSIsCisJfSwKKwlbSFBHX1dJTlRWX1BST19QQUxfSV9GTV0gPSB7CisJCS5JbnRlcmZhY2UgICAgID0gMCwKKwkJLkNvZGVjICAgICAgICAgPSBDT0RFQ19TQUE3MTEzLAorCQkuVmlkZW9DaGFubmVscyA9IDMsCisJCS5WaWRlb05vcm0gICAgID0gVjRMMl9TVERfUEFMLAorCQkuQXVkaW9DaGFubmVscyA9IDEsCisJCS5SYWRpbyAgICAgICAgID0gMSwKKwkJLnZiaSAgICAgICAgICAgPSAxLAorCQkuVHVuZXIgICAgICAgICA9IDEsCisJCS5UdW5lclR5cGUgICAgID0gVFVORVJfUEhJTElQU19QQUwsCisJCS5YX09mZnNldCAgICAgID0gMCwKKwkJLllfT2Zmc2V0ICAgICAgPSAzLAorCQkuRHZpX3l1dl9vdmVycmlkZSA9IDEsCisJCS5EdmlfeXV2ICAgICAgID0gNywKKwkJLk1vZGVsU3RyaW5nICAgPSAiSGF1cHBhdWdlIFdpblRWIFVTQiBQcm8gKFBBTCBJIEZNKSIsCisJfSwKKwlbSFBHX1dJTlRWX1BST19QQUxfRF9LX0ZNXSA9IHsKKwkJLkludGVyZmFjZSAgICAgPSAwLAorCQkuQ29kZWMgICAgICAgICA9IENPREVDX1NBQTcxMTMsCisJCS5WaWRlb0NoYW5uZWxzID0gMywKKwkJLlZpZGVvTm9ybSAgICAgPSBWNEwyX1NURF9QQUwsCisJCS5BdWRpb0NoYW5uZWxzID0gMSwKKwkJLlJhZGlvICAgICAgICAgPSAxLAorCQkudmJpICAgICAgICAgICA9IDEsCisJCS5UdW5lciAgICAgICAgID0gMSwKKwkJLlR1bmVyVHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1BBTCwKKwkJLlhfT2Zmc2V0ICAgICAgPSAwLAorCQkuWV9PZmZzZXQgICAgICA9IDMsCisJCS5EdmlfeXV2X292ZXJyaWRlID0gMSwKKwkJLkR2aV95dXYgICAgICAgPSA3LAorCQkuTW9kZWxTdHJpbmcgICA9ICJIYXVwcGF1Z2UgV2luVFYgVVNCIFBybyAoUEFMIEQvSyBGTSkiLAorCX0sCisJW0hQR19XSU5UVl9QUk9fVEVNSUNfUEFMX0ZNXSA9IHsKKwkJLkludGVyZmFjZSAgICAgPSAwLAorCQkuQ29kZWMgICAgICAgICA9IENPREVDX1NBQTcxMTMsCisJCS5WaWRlb0NoYW5uZWxzID0gMywKKwkJLlZpZGVvTm9ybSAgICAgPSBWNEwyX1NURF9QQUwsCisJCS5BdWRpb0NoYW5uZWxzID0gMSwKKwkJLlJhZGlvICAgICAgICAgPSAxLAorCQkudmJpICAgICAgICAgICA9IDEsCisJCS5UdW5lciAgICAgICAgID0gMSwKKwkJLlR1bmVyVHlwZSAgICAgPSBUVU5FUl9NSUNST1RVTkVfNDA0OUZNNSwKKwkJLlhfT2Zmc2V0ICAgICAgPSAwLAorCQkuWV9PZmZzZXQgICAgICA9IDMsCisJCS5EdmlfeXV2X292ZXJyaWRlID0gMSwKKwkJLkR2aV95dXYgICAgICAgPSA3LAorCQkuTW9kZWxTdHJpbmcgICA9ICJIYXVwcGF1Z2UgV2luVFYgVVNCIFBybyAoVGVtaWMgUEFML1NFQ0FNIEIvRy9JL0QvSy9MIEZNKSIsCisJfSwKKwlbSFBHX1dJTlRWX1BST19URU1JQ19QQUxfQkdfRk1dID0geworCQkuSW50ZXJmYWNlICAgICA9IDAsCisJCS5Db2RlYyAgICAgICAgID0gQ09ERUNfU0FBNzExMywKKwkJLlZpZGVvQ2hhbm5lbHMgPSAzLAorCQkuVmlkZW9Ob3JtICAgICA9IFY0TDJfU1REX1BBTCwKKwkJLkF1ZGlvQ2hhbm5lbHMgPSAxLAorCQkuUmFkaW8gICAgICAgICA9IDEsCisJCS52YmkgICAgICAgICAgID0gMSwKKwkJLlR1bmVyICAgICAgICAgPSAxLAorCQkuVHVuZXJUeXBlICAgICA9IFRVTkVSX01JQ1JPVFVORV80MDQ5Rk01LAorCQkuWF9PZmZzZXQgICAgICA9IDAsCisJCS5ZX09mZnNldCAgICAgID0gMywKKwkJLkR2aV95dXZfb3ZlcnJpZGUgPSAxLAorCQkuRHZpX3l1diAgICAgICA9IDcsCisJCS5Nb2RlbFN0cmluZyAgID0gIkhhdXBwYXVnZSBXaW5UViBVU0IgUHJvIChUZW1pYyBQQUwgQi9HIEZNKSIsCisJfSwKKwlbSFBHX1dJTlRWX1BST19QQUxfRk1dID0geworCQkuSW50ZXJmYWNlICAgICA9IDAsCisJCS5Db2RlYyAgICAgICAgID0gQ09ERUNfU0FBNzExMywKKwkJLlZpZGVvQ2hhbm5lbHMgPSAzLAorCQkuVmlkZW9Ob3JtICAgICA9IFY0TDJfU1REX1BBTCwKKwkJLkF1ZGlvQ2hhbm5lbHMgPSAxLAorCQkuUmFkaW8gICAgICAgICA9IDEsCisJCS52YmkgICAgICAgICAgID0gMSwKKwkJLlR1bmVyICAgICAgICAgPSAxLAorCQkuVHVuZXJUeXBlICAgICA9IFRVTkVSX1BISUxJUFNfRk0xMjE2TUVfTUszLAorCQkuWF9PZmZzZXQgICAgICA9IDAsCisJCS5ZX09mZnNldCAgICAgID0gMywKKwkJLkR2aV95dXZfb3ZlcnJpZGUgPSAxLAorCQkuRHZpX3l1diAgICAgICA9IDcsCisJCS5Nb2RlbFN0cmluZyAgID0gIkhhdXBwYXVnZSBXaW5UViBVU0IgUHJvIChQQUwvU0VDQU0gQi9HL0kvRC9LL0wgRk0pIiwKKwl9LAorCVtIUEdfV0lOVFZfUFJPX05UU0NfTU5fRk1fVjJdID0geworCQkuSW50ZXJmYWNlICAgICA9IDAsCisJCS5Db2RlYyAgICAgICAgID0gQ09ERUNfU0FBNzExMywKKwkJLlZpZGVvQ2hhbm5lbHMgPSAzLAorCQkuVmlkZW9Ob3JtICAgICA9IFY0TDJfU1REX05UU0MsCisJCS5BdWRpb0NoYW5uZWxzID0gMSwKKwkJLlJhZGlvICAgICAgICAgPSAxLAorCQkudmJpICAgICAgICAgICA9IDEsCisJCS5UdW5lciAgICAgICAgID0gMSwKKwkJLlR1bmVyVHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX05UU0NfTSwKKwkJLlhfT2Zmc2V0ICAgICAgPSAwLAorCQkuWV9PZmZzZXQgICAgICA9IDMsCisJCS5EdmlfeXV2X292ZXJyaWRlID0gMSwKKwkJLkR2aV95dXYgICAgICAgPSA3LAorCQkuTW9kZWxTdHJpbmcgICA9ICJIYXVwcGF1Z2UgV2luVFYgVVNCIFBybyAoTlRTQyBNL04gRk0pIFYyIiwKKwl9LAorCVtDQU1URUxfVFZCMzMwXSA9IHsKKwkJLkludGVyZmFjZSAgICAgPSAtMSwKKwkJLkNvZGVjICAgICAgICAgPSBDT0RFQ19TQUE3MTEzLAorCQkuVmlkZW9DaGFubmVscyA9IDMsCisJCS5WaWRlb05vcm0gICAgID0gVjRMMl9TVERfTlRTQywKKwkJLkF1ZGlvQ2hhbm5lbHMgPSAxLAorCQkuUmFkaW8gICAgICAgICA9IDEsCisJCS52YmkgICAgICAgICAgID0gMSwKKwkJLlR1bmVyICAgICAgICAgPSAxLAorCQkuVHVuZXJUeXBlICAgICA9IFRVTkVSX1BISUxJUFNfTlRTQ19NLAorCQkuWF9PZmZzZXQgICAgICA9IDUsCisJCS5ZX09mZnNldCAgICAgID0gNSwKKwkJLk1vZGVsU3RyaW5nICAgPSAiQ2FtdGVsIFRlY2hub2xvZ3kgVVNCIFRWIEdlbmllIFBybyBGTSBNb2RlbCBUVkIzMzAiLAorCX0sCisJW0RJR0lUQUxfVklERU9fQ1JFQVRPUl9JXSA9IHsKKwkJLkludGVyZmFjZSAgICAgPSAtMSwKKwkJLkNvZGVjICAgICAgICAgPSBDT0RFQ19TQUE3MTEzLAorCQkuVmlkZW9DaGFubmVscyA9IDIsCisJCS5WaWRlb05vcm0gICAgID0gVjRMMl9TVERfUEFMLAorCQkuQXVkaW9DaGFubmVscyA9IDAsCisJCS5SYWRpbyAgICAgICAgID0gMCwKKwkJLnZiaSAgICAgICAgICAgPSAxLAorCQkuVHVuZXIgICAgICAgICA9IDAsCisJCS5UdW5lclR5cGUgICAgID0gMCwKKwkJLlhfT2Zmc2V0ICAgICAgPSAwLAorCQkuWV9PZmZzZXQgICAgICA9IDMsCisJCS5EdmlfeXV2X292ZXJyaWRlID0gMSwKKwkJLkR2aV95dXYgICAgICAgPSA3LAorCQkuTW9kZWxTdHJpbmcgICA9ICJEaWdpdGFsIFZpZGVvIENyZWF0b3IgSSIsCisJfSwKKwlbR0xPQkFMX1ZJTExBR0VfR1ZfMDA3X05UU0NdID0geworCQkuSW50ZXJmYWNlICAgICA9IC0xLAorCQkuQ29kZWMgICAgICAgICA9IENPREVDX1NBQTcxMTEsCisJCS5WaWRlb0NoYW5uZWxzID0gMiwKKwkJLlZpZGVvTm9ybSAgICAgPSBWNEwyX1NURF9OVFNDLAorCQkuQXVkaW9DaGFubmVscyA9IDAsCisJCS5SYWRpbyAgICAgICAgID0gMCwKKwkJLnZiaSAgICAgICAgICAgPSAxLAorCQkuVHVuZXIgICAgICAgICA9IDAsCisJCS5UdW5lclR5cGUgICAgID0gMCwKKwkJLlhfT2Zmc2V0ICAgICAgPSA4MiwKKwkJLllfT2Zmc2V0ICAgICAgPSAyMCwKKwkJLkR2aV95dXZfb3ZlcnJpZGUgPSAxLAorCQkuRHZpX3l1diAgICAgICA9IDcsCisJCS5Nb2RlbFN0cmluZyAgID0gIkdsb2JhbCBWaWxsYWdlIEdWLTAwNyAoTlRTQykiLAorCX0sCisJW0RBWlpMRV9EVkNfNTBfUkVWXzFfTlRTQ10gPSB7CisJCS5JbnRlcmZhY2UgICAgID0gMCwKKwkJLkNvZGVjICAgICAgICAgPSBDT0RFQ19TQUE3MTEzLAorCQkuVmlkZW9DaGFubmVscyA9IDIsCisJCS5WaWRlb05vcm0gICAgID0gVjRMMl9TVERfTlRTQywKKwkJLkF1ZGlvQ2hhbm5lbHMgPSAwLAorCQkuUmFkaW8gICAgICAgICA9IDAsCisJCS52YmkgICAgICAgICAgID0gMSwKKwkJLlR1bmVyICAgICAgICAgPSAwLAorCQkuVHVuZXJUeXBlICAgICA9IDAsCisJCS5YX09mZnNldCAgICAgID0gMCwKKwkJLllfT2Zmc2V0ICAgICAgPSAzLAorCQkuRHZpX3l1dl9vdmVycmlkZSA9IDEsCisJCS5EdmlfeXV2ICAgICAgID0gNywKKwkJLk1vZGVsU3RyaW5nICAgPSAiRGF6emxlIEZ1c2lvbiBNb2RlbCBEVkMtNTAgUmV2IDEgKE5UU0MpIiwKKwl9LAorCVtEQVpaTEVfRFZDXzgwX1JFVl8xX1BBTF0gPSB7CisJCS5JbnRlcmZhY2UgICAgID0gMCwKKwkJLkNvZGVjICAgICAgICAgPSBDT0RFQ19TQUE3MTEzLAorCQkuVmlkZW9DaGFubmVscyA9IDIsCisJCS5WaWRlb05vcm0gICAgID0gVjRMMl9TVERfUEFMLAorCQkuQXVkaW9DaGFubmVscyA9IDAsCisJCS5SYWRpbyAgICAgICAgID0gMCwKKwkJLnZiaSAgICAgICAgICAgPSAxLAorCQkuVHVuZXIgICAgICAgICA9IDAsCisJCS5UdW5lclR5cGUgICAgID0gMCwKKwkJLlhfT2Zmc2V0ICAgICAgPSAwLAorCQkuWV9PZmZzZXQgICAgICA9IDMsCisJCS5EdmlfeXV2X292ZXJyaWRlID0gMSwKKwkJLkR2aV95dXYgICAgICAgPSA3LAorCQkuTW9kZWxTdHJpbmcgICA9ICJEYXp6bGUgRnVzaW9uIE1vZGVsIERWQy04MCBSZXYgMSAoUEFMKSIsCisJfSwKKwlbREFaWkxFX0RWQ185MF9SRVZfMV9TRUNBTV0gPSB7CisJCS5JbnRlcmZhY2UgICAgID0gMCwKKwkJLkNvZGVjICAgICAgICAgPSBDT0RFQ19TQUE3MTEzLAorCQkuVmlkZW9DaGFubmVscyA9IDIsCisJCS5WaWRlb05vcm0gICAgID0gVjRMMl9TVERfU0VDQU0sCisJCS5BdWRpb0NoYW5uZWxzID0gMCwKKwkJLlJhZGlvICAgICAgICAgPSAwLAorCQkudmJpICAgICAgICAgICA9IDEsCisJCS5UdW5lciAgICAgICAgID0gMCwKKwkJLlR1bmVyVHlwZSAgICAgPSAwLAorCQkuWF9PZmZzZXQgICAgICA9IDAsCisJCS5ZX09mZnNldCAgICAgID0gMywKKwkJLkR2aV95dXZfb3ZlcnJpZGUgPSAxLAorCQkuRHZpX3l1diAgICAgICA9IDcsCisJCS5Nb2RlbFN0cmluZyAgID0gIkRhenpsZSBGdXNpb24gTW9kZWwgRFZDLTkwIFJldiAxIChTRUNBTSkiLAorCX0sCisJW0VTS0FQRV9MQUJTX01ZVFYyR09dID0geworCQkuSW50ZXJmYWNlICAgICA9IDAsCisJCS5Db2RlYyAgICAgICAgID0gQ09ERUNfU0FBNzExMywKKwkJLlZpZGVvQ2hhbm5lbHMgPSAyLAorCQkuVmlkZW9Ob3JtICAgICA9IFY0TDJfU1REX1BBTCwKKwkJLkF1ZGlvQ2hhbm5lbHMgPSAxLAorCQkuUmFkaW8gICAgICAgICA9IDEsCisJCS52YmkgICAgICAgICAgID0gMSwKKwkJLlR1bmVyICAgICAgICAgPSAxLAorCQkuVHVuZXJUeXBlICAgICA9IFRVTkVSX1BISUxJUFNfRk0xMjE2TUVfTUszLAorCQkuWF9PZmZzZXQgICAgICA9IDAsCisJCS5ZX09mZnNldCAgICAgID0gMywKKwkJLkR2aV95dXZfb3ZlcnJpZGUgPSAxLAorCQkuRHZpX3l1diAgICAgICA9IDcsCisJCS5Nb2RlbFN0cmluZyAgID0gIkVza2FwZSBMYWJzIE15VFYyR28iLAorCX0sCisJW1BJTk5BX1BDVFZfVVNCX1BBTF0gPSB7CisJCS5JbnRlcmZhY2UgICAgID0gLTEsCisJCS5Db2RlYyAgICAgICAgID0gQ09ERUNfU0FBNzExMSwKKwkJLlZpZGVvQ2hhbm5lbHMgPSAzLAorCQkuVmlkZW9Ob3JtICAgICA9IFY0TDJfU1REX1BBTCwKKwkJLkF1ZGlvQ2hhbm5lbHMgPSAxLAorCQkuUmFkaW8gICAgICAgICA9IDAsCisJCS52YmkgICAgICAgICAgID0gMCwKKwkJLlR1bmVyICAgICAgICAgPSAxLAorCQkuVHVuZXJUeXBlICAgICA9IFRVTkVSX1RFTUlDXzQwNjZGWTVfUEFMX0ksCisJCS5YX09mZnNldCAgICAgID0gLTEsCisJCS5ZX09mZnNldCAgICAgID0gLTEsCisJCS5Nb2RlbFN0cmluZyAgID0gIlBpbm5hY2xlIFN0dWRpbyBQQ1RWIFVTQiAoUEFMKSIsCisJfSwKKwlbUElOTkFfUENUVl9VU0JfU0VDQU1dID0geworCQkuSW50ZXJmYWNlICAgICA9IC0xLAorCQkuQ29kZWMgICAgICAgICA9IENPREVDX1NBQTcxMTEsCisJCS5WaWRlb0NoYW5uZWxzID0gMywKKwkJLlZpZGVvTm9ybSAgICAgPSBWNEwyX1NURF9TRUNBTSwKKwkJLkF1ZGlvQ2hhbm5lbHMgPSAxLAorCQkuUmFkaW8gICAgICAgICA9IDAsCisJCS52YmkgICAgICAgICAgID0gMSwKKwkJLlR1bmVyICAgICAgICAgPSAxLAorCQkuVHVuZXJUeXBlICAgICA9IFRVTkVSX1BISUxJUFNfU0VDQU0sCisJCS5YX09mZnNldCAgICAgID0gLTEsCisJCS5ZX09mZnNldCAgICAgID0gLTEsCisJCS5Nb2RlbFN0cmluZyAgID0gIlBpbm5hY2xlIFN0dWRpbyBQQ1RWIFVTQiAoU0VDQU0pIiwKKwl9LAorCVtQSU5OQV9QQ1RWX1VTQl9QQUxfRk1dID0geworCQkuSW50ZXJmYWNlICAgICA9IC0xLAorCQkuQ29kZWMgICAgICAgICA9IENPREVDX1NBQTcxMTEsCisJCS5WaWRlb0NoYW5uZWxzID0gMywKKwkJLlZpZGVvTm9ybSAgICAgPSBWNEwyX1NURF9QQUwsCisJCS5BdWRpb0NoYW5uZWxzID0gMSwKKwkJLlJhZGlvICAgICAgICAgPSAxLAorCQkudmJpICAgICAgICAgICA9IDEsCisJCS5UdW5lciAgICAgICAgID0gMSwKKwkJLlR1bmVyVHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1BBTCwKKwkJLlhfT2Zmc2V0ICAgICAgPSAxMjgsCisJCS5ZX09mZnNldCAgICAgID0gMjMsCisJCS5Nb2RlbFN0cmluZyAgID0gIlBpbm5hY2xlIFN0dWRpbyBQQ1RWIFVTQiAoUEFMKSBGTSIsCisJfSwKKwlbTUlST19QQ1RWX1VTQl0gPSB7CisJCS5JbnRlcmZhY2UgICAgID0gLTEsCisJCS5Db2RlYyAgICAgICAgID0gQ09ERUNfU0FBNzExMSwKKwkJLlZpZGVvQ2hhbm5lbHMgPSAzLAorCQkuVmlkZW9Ob3JtICAgICA9IFY0TDJfU1REX1BBTCwKKwkJLkF1ZGlvQ2hhbm5lbHMgPSAxLAorCQkuUmFkaW8gICAgICAgICA9IDAsCisJCS52YmkgICAgICAgICAgID0gMSwKKwkJLlR1bmVyICAgICAgICAgPSAxLAorCQkuVHVuZXJUeXBlICAgICA9IFRVTkVSX1BISUxJUFNfUEFMLAorCQkuWF9PZmZzZXQgICAgICA9IC0xLAorCQkuWV9PZmZzZXQgICAgICA9IC0xLAorCQkuTW9kZWxTdHJpbmcgICA9ICJNaXJvIFBDVFYgVVNCIiwKKwl9LAorCVtQSU5OQV9QQ1RWX1VTQl9OVFNDX0ZNXSA9IHsKKwkJLkludGVyZmFjZSAgICAgPSAtMSwKKwkJLkNvZGVjICAgICAgICAgPSBDT0RFQ19TQUE3MTExLAorCQkuVmlkZW9DaGFubmVscyA9IDMsCisJCS5WaWRlb05vcm0gICAgID0gVjRMMl9TVERfTlRTQywKKwkJLkF1ZGlvQ2hhbm5lbHMgPSAxLAorCQkuUmFkaW8gICAgICAgICA9IDEsCisJCS52YmkgICAgICAgICAgID0gMSwKKwkJLlR1bmVyICAgICAgICAgPSAxLAorCQkuVHVuZXJUeXBlICAgICA9IFRVTkVSX1BISUxJUFNfTlRTQ19NLAorCQkuWF9PZmZzZXQgICAgICA9IC0xLAorCQkuWV9PZmZzZXQgICAgICA9IC0xLAorCQkuTW9kZWxTdHJpbmcgICA9ICJQaW5uYWNsZSBTdHVkaW8gUENUViBVU0IgKE5UU0MpIEZNIiwKKwl9LAorCVtQSU5OQV9QQ1RWX1VTQl9QQUxfRk1fVjJdID0geworCQkuSW50ZXJmYWNlICAgICA9IC0xLAorCQkuQ29kZWMgICAgICAgICA9IENPREVDX1NBQTcxMTMsCisJCS5WaWRlb0NoYW5uZWxzID0gMywKKwkJLlZpZGVvTm9ybSAgICAgPSBWNEwyX1NURF9QQUwsCisJCS5BdWRpb0NoYW5uZWxzID0gMSwKKwkJLlJhZGlvICAgICAgICAgPSAxLAorCQkudmJpICAgICAgICAgICA9IDEsCisJCS5UdW5lciAgICAgICAgID0gMSwKKwkJLlR1bmVyVHlwZSAgICAgPSBUVU5FUl9URU1JQ180MDA5RlI1X1BBTCwKKwkJLlhfT2Zmc2V0ICAgICAgPSAwLAorCQkuWV9PZmZzZXQgICAgICA9IDMsCisJCS5EdmlfeXV2X292ZXJyaWRlID0gMSwKKwkJLkR2aV95dXYgICAgICAgPSA3LAorCQkuTW9kZWxTdHJpbmcgICA9ICJQaW5uYWNsZSBTdHVkaW8gUENUViBVU0IgKFBBTCkgRk0gVjIiLAorCX0sCisJW1BJTk5BX1BDVFZfVVNCX05UU0NfRk1fVjJdID0geworCQkuSW50ZXJmYWNlICAgICA9IC0xLAorCQkuQ29kZWMgICAgICAgICA9IENPREVDX1NBQTcxMTEsCisJCS5WaWRlb0NoYW5uZWxzID0gMywKKwkJLlZpZGVvTm9ybSAgICAgPSBWNEwyX1NURF9OVFNDLAorCQkuQXVkaW9DaGFubmVscyA9IDEsCisJCS5SYWRpbyAgICAgICAgID0gMSwKKwkJLnZiaSAgICAgICAgICAgPSAxLAorCQkuVHVuZXIgICAgICAgICA9IDEsCisJCS5UdW5lclR5cGUgICAgID0gVFVORVJfVEVNSUNfNDAzOUZSNV9OVFNDLAorCQkuWF9PZmZzZXQgICAgICA9IDAsCisJCS5ZX09mZnNldCAgICAgID0gMywKKwkJLkR2aV95dXZfb3ZlcnJpZGUgPSAxLAorCQkuRHZpX3l1diAgICAgICA9IDcsCisJCS5Nb2RlbFN0cmluZyAgID0gIlBpbm5hY2xlIFN0dWRpbyBQQ1RWIFVTQiAoTlRTQykgRk0gVjIiLAorCX0sCisJW1BJTk5BX1BDVFZfVVNCX1BBTF9GTV9WM10gPSB7CisJCS5JbnRlcmZhY2UgICAgID0gLTEsCisJCS5Db2RlYyAgICAgICAgID0gQ09ERUNfU0FBNzExMywKKwkJLlZpZGVvQ2hhbm5lbHMgPSAzLAorCQkuVmlkZW9Ob3JtICAgICA9IFY0TDJfU1REX1BBTCwKKwkJLkF1ZGlvQ2hhbm5lbHMgPSAxLAorCQkuUmFkaW8gICAgICAgICA9IDEsCisJCS52YmkgICAgICAgICAgID0gMSwKKwkJLlR1bmVyICAgICAgICAgPSAxLAorCQkuVHVuZXJUeXBlICAgICA9IFRVTkVSX1RFTUlDXzQwMDlGUjVfUEFMLAorCQkuWF9PZmZzZXQgICAgICA9IDAsCisJCS5ZX09mZnNldCAgICAgID0gMywKKwkJLkR2aV95dXZfb3ZlcnJpZGUgPSAxLAorCQkuRHZpX3l1diAgICAgICA9IDcsCisJCS5Nb2RlbFN0cmluZyAgID0gIlBpbm5hY2xlIFN0dWRpbyBQQ1RWIFVTQiAoUEFMKSBGTSBWMyIsCisJfSwKKwlbUElOTkFfTElOWF9WRF9JTl9DQUJfTlRTQ10gPSB7CisJCS5JbnRlcmZhY2UgICAgID0gLTEsCisJCS5Db2RlYyAgICAgICAgID0gQ09ERUNfU0FBNzExMywKKwkJLlZpZGVvQ2hhbm5lbHMgPSAyLAorCQkuVmlkZW9Ob3JtICAgICA9IFY0TDJfU1REX05UU0MsCisJCS5BdWRpb0NoYW5uZWxzID0gMSwKKwkJLlJhZGlvICAgICAgICAgPSAwLAorCQkudmJpICAgICAgICAgICA9IDEsCisJCS5UdW5lciAgICAgICAgID0gMCwKKwkJLlR1bmVyVHlwZSAgICAgPSAwLAorCQkuWF9PZmZzZXQgICAgICA9IDAsCisJCS5ZX09mZnNldCAgICAgID0gMywKKwkJLkR2aV95dXZfb3ZlcnJpZGUgPSAxLAorCQkuRHZpX3l1diAgICAgICA9IDcsCisJCS5Nb2RlbFN0cmluZyAgID0gIlBpbm5hY2xlIFN0dWRpbyBMaW54IFZpZGVvIGlucHV0IGNhYmxlIChOVFNDKSIsCisJfSwKKwlbUElOTkFfTElOWF9WRF9JTl9DQUJfUEFMXSA9IHsKKwkJLkludGVyZmFjZSAgICAgPSAtMSwKKwkJLkNvZGVjICAgICAgICAgPSBDT0RFQ19TQUE3MTEzLAorCQkuVmlkZW9DaGFubmVscyA9IDIsCisJCS5WaWRlb05vcm0gICAgID0gVjRMMl9TVERfUEFMLAorCQkuQXVkaW9DaGFubmVscyA9IDEsCisJCS5SYWRpbyAgICAgICAgID0gMCwKKwkJLnZiaSAgICAgICAgICAgPSAxLAorCQkuVHVuZXIgICAgICAgICA9IDAsCisJCS5UdW5lclR5cGUgICAgID0gMCwKKwkJLlhfT2Zmc2V0ICAgICAgPSAwLAorCQkuWV9PZmZzZXQgICAgICA9IDMsCisJCS5EdmlfeXV2X292ZXJyaWRlID0gMSwKKwkJLkR2aV95dXYgICAgICAgPSA3LAorCQkuTW9kZWxTdHJpbmcgICA9ICJQaW5uYWNsZSBTdHVkaW8gTGlueCBWaWRlbyBpbnB1dCBjYWJsZSAoUEFMKSIsCisJfSwKKwlbUElOTkFfUENUVl9CVU5HRUVfUEFMX0ZNXSA9IHsKKwkJLkludGVyZmFjZSAgICAgPSAtMSwKKwkJLkNvZGVjICAgICAgICAgPSBDT0RFQ19TQUE3MTEzLAorCQkuVmlkZW9DaGFubmVscyA9IDMsCisJCS5WaWRlb05vcm0gICAgID0gVjRMMl9TVERfUEFMLAorCQkuQXVkaW9DaGFubmVscyA9IDEsCisJCS5SYWRpbyAgICAgICAgID0gMSwKKwkJLnZiaSAgICAgICAgICAgPSAxLAorCQkuVHVuZXIgICAgICAgICA9IDEsCisJCS5UdW5lclR5cGUgICAgID0gVFVORVJfVEVNSUNfNDAwOUZSNV9QQUwsCisJCS5YX09mZnNldCAgICAgID0gMCwKKwkJLllfT2Zmc2V0ICAgICAgPSAzLAorCQkuRHZpX3l1dl9vdmVycmlkZSA9IDEsCisJCS5EdmlfeXV2ICAgICAgID0gNywKKwkJLk1vZGVsU3RyaW5nICAgPSAiUGlubmFjbGUgUENUViBCdW5nZWUgVVNCIChQQUwpIEZNIiwKKwl9LAorCVtIUEdfV0lOVFZdID0geworCQkuSW50ZXJmYWNlICAgICA9IC0xLAorCQkuQ29kZWMgICAgICAgICA9IENPREVDX1NBQTcxMTEsCisJCS5WaWRlb0NoYW5uZWxzID0gMywKKwkJLlZpZGVvTm9ybSAgICAgPSBWNEwyX1NURF9OVFNDLAorCQkuQXVkaW9DaGFubmVscyA9IDEsCisJCS5SYWRpbyAgICAgICAgID0gMCwKKwkJLnZiaSAgICAgICAgICAgPSAxLAorCQkuVHVuZXIgICAgICAgICA9IDEsCisJCS5UdW5lclR5cGUgICAgID0gVFVORVJfUEhJTElQU19OVFNDX00sCisJCS5YX09mZnNldCAgICAgID0gLTEsCisJCS5ZX09mZnNldCAgICAgID0gLTEsCisJCS5Nb2RlbFN0cmluZyAgID0gIkhhdXBwYXVnZSBXaW5Udi1VU0IiLAorCX0sCiB9OworY29uc3QgaW50IHVzYnZpc2lvbl9kZXZpY2VfZGF0YV9zaXplPUFSUkFZX1NJWkUodXNidmlzaW9uX2RldmljZV9kYXRhKTsKIAogLyogU3VwcG9ydGVkIERldmljZXMgKi8KIAogc3RydWN0IHVzYl9kZXZpY2VfaWQgdXNidmlzaW9uX3RhYmxlIFtdID0gewotCXsgVVNCX0RFVklDRSgweEZGRjAsIDB4RkZGMCkgfSwgIC8qIEN1c3RvbSBEdW1teSBVU0JWaXNpb24gRGV2aWNlICovCi0JeyBVU0JfREVWSUNFKDB4MEE2RiwgMHgwNDAwKSB9LCAgLyogWGFuYm9vICovCi0JeyBVU0JfREVWSUNFKDB4MDUwZCwgMHgwMjA4KSB9LCAgLyogQmVsa2luIFVTQlZpZXcgSUkgKi8KLQl7IFVTQl9ERVZJQ0UoMHgwNTcxLCAweDAwMDIpIH0sICAvKiBlY2hvRlggSW50ZXJWaWV3IExpdGUgKi8KLQl7IFVTQl9ERVZJQ0UoMHgwNTczLCAweDAwMDMpIH0sICAvKiBVU0JHZWFyIFVTQkctVjEgKi8KLQl7IFVTQl9ERVZJQ0UoMHgwNTczLCAweDA0MDApIH0sICAvKiBELUxpbmsgVjEwMCAqLwotCXsgVVNCX0RFVklDRSgweDA1NzMsIDB4MjAwMCkgfSwgIC8qIFgxMCBVU0IgQ2FtZXJhICovCi0JeyBVU0JfREVWSUNFKDB4MDU3MywgMHgyZDAwKSB9LCAgLyogT3NwcmV5IDUwICovCi0JeyBVU0JfREVWSUNFKDB4MDU3MywgMHgyZDAxKSB9LCAgLyogSGF1cHBhdWdlIFVTQi1MaXZlIE1vZGVsIDYwMCAqLwotCXsgVVNCX0RFVklDRSgweDA1NzMsIDB4MjEwMSkgfSwgIC8qIFpvcmFuIENvLiBQTUQgKE5vZ2F0ZWNoKSBBVi1ncmFiYmVyIE1hbmhhdHRhbiAqLwotCXsgVVNCX0RFVklDRSgweDA1NzMsIDB4NDEwMCkgfSwgIC8qIE5vZ2F0ZWNoIFVTQi1UViBGTSAoTlRTQykgKi8KLQl7IFVTQl9ERVZJQ0UoMHgwNTczLCAweDQxMTApIH0sICAvKiBQTlkgVVNCLVRWIChOVFNDKSBGTSAqLwotCXsgVVNCX0RFVklDRSgweDA1NzMsIDB4NDQ1MCkgfSwgIC8qIFBpeGVsVmlldyBQbGF5VHYtVVNCIFBSTyAoUEFMKSBGTSAqLwotCXsgVVNCX0RFVklDRSgweDA1NzMsIDB4NDU1MCkgfSwgIC8qIFpUViBaVC03MjEgMi40R0h6IFVTQiBBL1YgUmVjZWl2ZXIgKi8KLQl7IFVTQl9ERVZJQ0UoMHgwNTczLCAweDRkMDApIH0sICAvKiBIYXVwcGF1Z2UgV2luVHYtVVNCIFVTQSAqLwotCXsgVVNCX0RFVklDRSgweDA1NzMsIDB4NGQwMSkgfSwgIC8qIEhhdXBwYXVnZSBXaW5Udi1VU0IgKi8KLQl7IFVTQl9ERVZJQ0UoMHgwNTczLCAweDRkMDIpIH0sICAvKiBIYXVwcGF1Z2UgV2luVHYtVVNCIFVLICovCi0JeyBVU0JfREVWSUNFKDB4MDU3MywgMHg0ZDAzKSB9LCAgLyogSGF1cHBhdWdlIFdpblR2LVVTQiBGcmFuY2UgKi8KLQl7IFVTQl9ERVZJQ0UoMHgwNTczLCAweDRkMTApIH0sICAvKiBIYXVwcGF1Z2UgV2luVHYtVVNCIHdpdGggRk0gVVNBIHJhZGlvICovCi0JeyBVU0JfREVWSUNFKDB4MDU3MywgMHg0ZDExKSB9LCAgLyogSGF1cHBhdWdlIFdpblR2LVVTQiAoUEFMKSB3aXRoIEZNIHJhZGlvICovCi0JeyBVU0JfREVWSUNFKDB4MDU3MywgMHg0ZDEyKSB9LCAgLyogSGF1cHBhdWdlIFdpblR2LVVTQiBVSyB3aXRoIEZNIFJhZGlvICovCi0JeyBVU0JfREVWSUNFKDB4MDU3MywgMHg0ZDJhKSB9LCAgLyogSGF1cHBhZ3VlIFdpblR2IFVTQiBNb2RlbCA2MDIgNDAyMDEgUmV2IEIyODUgKi8KLQl7IFVTQl9ERVZJQ0UoMHgwNTczLCAweDRkMmIpIH0sICAvKiBIYXVwcGFndWUgV2luVHYgVVNCIE1vZGVsIDYwMiA0MDIwMSBSZXYgQjI4MiAqLwotCXsgVVNCX0RFVklDRSgweDA1NzMsIDB4NGQyYykgfSwgIC8qIEhhdXBwYWd1ZSBXaW5UdiBVU0IgTW9kZWwgNDAyMDkgUmV2LiBFMUE1IFBBTCovCi0JeyBVU0JfREVWSUNFKDB4MDU3MywgMHg0ZDIwKSB9LCAgLyogSGF1cHBhdWdlIFdpblR2LVVTQiBJSSAoUEFMKSBGTSBNb2RlbCA0MDIwMSBSZXYgQjIyNiAqLwotCXsgVVNCX0RFVklDRSgweDA1NzMsIDB4NGQyMSkgfSwgIC8qIEhhdXBwYXVnZSBXaW5Udi1VU0IgSUkgKFBBTCkgd2l0aCBGTSByYWRpbyovCi0JeyBVU0JfREVWSUNFKDB4MDU3MywgMHg0ZDIyKSB9LCAgLyogSGF1cHBhdWdlIFdpblR2LVVTQiBJSSAoUEFMKSBNb2RlbCA1NjYgKi8KLQl7IFVTQl9ERVZJQ0UoMHgwNTczLCAweDRkMjMpIH0sICAvKiBIYXVwcGF1Z2UgV2luVHYtVVNCIEZyYW5jZSA0RDIzKi8KLQl7IFVTQl9ERVZJQ0UoMHgwNTczLCAweDRkMjUpIH0sICAvKiBIYXVwcGF1Z2UgV2luVHYtVVNCIE1vZGVsIDQwMjA5IHJldiBCMjM0ICovCi0JeyBVU0JfREVWSUNFKDB4MDU3MywgMHg0ZDI2KSB9LCAgLyogSGF1cHBhdWdlIFdpblR2LVVTQiBNb2RlbCA0MDIwOSBSZXYgQjI0MyAqLwotCXsgVVNCX0RFVklDRSgweDA1NzMsIDB4NGQyNykgfSwgIC8qIEhhdXBwYXVnZSBXaW5Udi1VU0IgTW9kZWwgNDAyMDQgUmV2IEIyODEgKi8KLQl7IFVTQl9ERVZJQ0UoMHgwNTczLCAweDRkMjgpIH0sICAvKiBIYXVwcGF1Z2UgV2luVHYtVVNCIE1vZGVsIDQwMjA0IFJldiBCMjgzICovCi0JeyBVU0JfREVWSUNFKDB4MDU3MywgMHg0ZDI5KSB9LCAgLyogSGF1cHBhdWdlIFdpblR2LVVTQiBNb2RlbCA0MDIwNSBSZXYgQjI5OCAqLwotCXsgVVNCX0RFVklDRSgweDA1NzMsIDB4NGQzMCkgfSwgIC8qIEhhdXBwYXVnZSBXaW5Udi1VU0IgRk0gTW9kZWwgNDAyMTEgUmV2IEIxMjMgKi8KLQl7IFVTQl9ERVZJQ0UoMHgwNTczLCAweDRkMzEpIH0sICAvKiBIYXVwcGF1Z2UgV2luVHYtVVNCIElJSSAoUEFMKSB3aXRoIEZNIHJhZGlvIE1vZGVsIDU2OCAqLwotCXsgVVNCX0RFVklDRSgweDA1NzMsIDB4NGQzMikgfSwgIC8qIEhhdXBwYXVnZSBXaW5Udi1VU0IgSUlJIChQQUwpIEZNIE1vZGVsIDU3MyAqLwotCXsgVVNCX0RFVklDRSgweDA1NzMsIDB4NGQzNSkgfSwgIC8qIEhhdXBwYXVnZSBXaW5Udi1VU0IgSUlJIChTRUNBTSkgRk0gTW9kZWwgNDAyMTkgUmV2IEIyNTIgKi8KLQl7IFVTQl9ERVZJQ0UoMHgwNTczLCAweDRkMzcpIH0sICAvKiBIYXVwcGF1Z2UgV2luVHYtVVNCIE1vZGVsIDQwMjE5IFJldiBFMTg5ICovCi0JeyBVU0JfREVWSUNFKDB4MDc2OCwgMHgwMDA2KSB9LCAgLyogQ2FtdGVsIFRlY2hub2xvZ3kgVVNCIFRWIEdlbmllIFBybyBGTSBNb2RlbCBUVkIzMzAgKi8KLQl7IFVTQl9ERVZJQ0UoMHgwN2QwLCAweDAwMDEpIH0sICAvKiBEaWdpdGFsIFZpZGVvIENyZWF0b3IgSSAqLwotCXsgVVNCX0RFVklDRSgweDA3ZDAsIDB4MDAwMikgfSwgIC8qIEdsb2JhbCBWaWxsYWdlIEdWLTAwNyAoTlRTQykgKi8KLQl7IFVTQl9ERVZJQ0UoMHgwN2QwLCAweDAwMDMpIH0sICAvKiBEYXp6bGUgRnVzaW9uIE1vZGVsIERWQy01MCBSZXYgMSAoTlRTQykgKi8KLQl7IFVTQl9ERVZJQ0UoMHgwN2QwLCAweDAwMDQpIH0sICAvKiBEYXp6bGUgRnVzaW9uIE1vZGVsIERWQy04MCBSZXYgMSAoUEFMKSAqLwotCXsgVVNCX0RFVklDRSgweDA3ZDAsIDB4MDAwNSkgfSwgIC8qIERhenpsZSBGdXNpb24gTW9kZWwgRFZDLTkwIFJldiAxIChTRUNBTSkgKi8KLQl7IFVTQl9ERVZJQ0UoMHgyMzA0LCAweDAxMGQpIH0sICAvKiBQaW5uYWNsZSBTdHVkaW8gUENUViBVU0IgKFBBTCkgKi8KLQl7IFVTQl9ERVZJQ0UoMHgyMzA0LCAweDAxMDkpIH0sICAvKiBQaW5uYWNsZSBTdHVkaW8gUENUViBVU0IgKFNFQ0FNKSAqLwotCXsgVVNCX0RFVklDRSgweDIzMDQsIDB4MDExMCkgfSwgIC8qIFBpbm5hY2xlIFN0dWRpbyBQQ1RWIFVTQiAoUEFMKSAqLwotCXsgVVNCX0RFVklDRSgweDIzMDQsIDB4MDExMSkgfSwgIC8qIE1pcm8gUENUViBVU0IgKi8KLQl7IFVTQl9ERVZJQ0UoMHgyMzA0LCAweDAxMTIpIH0sICAvKiBQaW5uYWNsZSBTdHVkaW8gUENUViBVU0IgKE5UU0MpIHdpdGggRk0gcmFkaW8gKi8KLQl7IFVTQl9ERVZJQ0UoMHgyMzA0LCAweDAyMTApIH0sICAvKiBQaW5uYWNsZSBTdHVkaW8gUENUViBVU0IgKFBBTCkgd2l0aCBGTSByYWRpbyAqLwotCXsgVVNCX0RFVklDRSgweDIzMDQsIDB4MDIxMikgfSwgIC8qIFBpbm5hY2xlIFN0dWRpbyBQQ1RWIFVTQiAoTlRTQykgd2l0aCBGTSByYWRpbyAqLwotCXsgVVNCX0RFVklDRSgweDIzMDQsIDB4MDIxNCkgfSwgIC8qIFBpbm5hY2xlIFN0dWRpbyBQQ1RWIFVTQiAoUEFMKSB3aXRoIEZNIHJhZGlvICovCi0JeyBVU0JfREVWSUNFKDB4MjMwNCwgMHgwMzAwKSB9LCAgLyogUGlubmFjbGUgU3R1ZGlvIExpbnggVmlkZW8gaW5wdXQgY2FibGUgKE5UU0MpICovCi0JeyBVU0JfREVWSUNFKDB4MjMwNCwgMHgwMzAxKSB9LCAgLyogUGlubmFjbGUgU3R1ZGlvIExpbnggVmlkZW8gaW5wdXQgY2FibGUgKFBBTCkgKi8KLQl7IFVTQl9ERVZJQ0UoMHgyMzA0LCAweDA0MTkpIH0sICAvKiBQaW5uYWNsZSBQQ1RWIEJ1bmdlZSBVU0IgKFBBTCkgRk0gKi8KLQl7IFVTQl9ERVZJQ0UoMHgyNDAwLCAweDQyMDApIH0sICAvKiBIYXVwcGF1Z2UgV2luVHYtVVNCMiBNb2RlbCA0MjAxMiAqLwotCi0JeyB9ICAvKiBUZXJtaW5hdGluZyBlbnRyeSAqLworCXsgVVNCX0RFVklDRSgweDBhNmYsIDB4MDQwMCksIC5kcml2ZXJfaW5mbz1YQU5CT08gfSwKKwl7IFVTQl9ERVZJQ0UoMHgwNTBkLCAweDAxMDYpLCAuZHJpdmVyX2luZm89QkVMS0lOX1ZJREVPQlVTX0lJIH0sCisJeyBVU0JfREVWSUNFKDB4MDUwZCwgMHgwMjA3KSwgLmRyaXZlcl9pbmZvPUJFTEtJTl9WSURFT0JVUyB9LAorCXsgVVNCX0RFVklDRSgweDA1MGQsIDB4MDIwOCksIC5kcml2ZXJfaW5mbz1CRUxLSU5fVVNCX1ZJREVPQlVTX0lJIH0sCisJeyBVU0JfREVWSUNFKDB4MDU3MSwgMHgwMDAyKSwgLmRyaXZlcl9pbmZvPUVDSE9GWF9JTlRFUlZJRVdfTElURSB9LAorCXsgVVNCX0RFVklDRSgweDA1NzMsIDB4MDAwMyksIC5kcml2ZXJfaW5mbz1VU0JHRUFSX1VTQkdfVjEgfSwKKwl7IFVTQl9ERVZJQ0UoMHgwNTczLCAweDA0MDApLCAuZHJpdmVyX2luZm89RF9MSU5LX1YxMDAgfSwKKwl7IFVTQl9ERVZJQ0UoMHgwNTczLCAweDIwMDApLCAuZHJpdmVyX2luZm89WDEwX1VTQl9DQU1FUkEgfSwKKwl7IFVTQl9ERVZJQ0UoMHgwNTczLCAweDJkMDApLCAuZHJpdmVyX2luZm89SFBHX1dJTlRWX0xJVkVfUEFMX0JHIH0sCisJeyBVU0JfREVWSUNFKDB4MDU3MywgMHgyZDAxKSwgLmRyaXZlcl9pbmZvPUhQR19XSU5UVl9MSVZFX1BST19OVFNDX01OIH0sCisJeyBVU0JfREVWSUNFKDB4MDU3MywgMHgyMTAxKSwgLmRyaXZlcl9pbmZvPVpPUkFOX1BNRF9OT0dBVEVDSCB9LAorCXsgVVNCX0RFVklDRSgweDA1NzMsIDB4NDEwMCksIC5kcml2ZXJfaW5mbz1OT0dBVEVDSF9VU0JfVFZfTlRTQ19GTSB9LAorCXsgVVNCX0RFVklDRSgweDA1NzMsIDB4NDExMCksIC5kcml2ZXJfaW5mbz1QTllfVVNCX1RWX05UU0NfRk0gfSwKKwl7IFVTQl9ERVZJQ0UoMHgwNTczLCAweDQ0NTApLCAuZHJpdmVyX2luZm89UFZfUExBWVRWX1VTQl9QUk9fUEFMX0ZNIH0sCisJeyBVU0JfREVWSUNFKDB4MDU3MywgMHg0NTUwKSwgLmRyaXZlcl9pbmZvPVpUXzcyMSB9LAorCXsgVVNCX0RFVklDRSgweDA1NzMsIDB4NGQwMCksIC5kcml2ZXJfaW5mbz1IUEdfV0lOVFZfTlRTQ19NTiB9LAorCXsgVVNCX0RFVklDRSgweDA1NzMsIDB4NGQwMSksIC5kcml2ZXJfaW5mbz1IUEdfV0lOVFZfUEFMX0JHIH0sCisJeyBVU0JfREVWSUNFKDB4MDU3MywgMHg0ZDAyKSwgLmRyaXZlcl9pbmZvPUhQR19XSU5UVl9QQUxfSSB9LAorCXsgVVNCX0RFVklDRSgweDA1NzMsIDB4NGQwMyksIC5kcml2ZXJfaW5mbz1IUEdfV0lOVFZfUEFMX1NFQ0FNX0wgfSwKKwl7IFVTQl9ERVZJQ0UoMHgwNTczLCAweDRkMDQpLCAuZHJpdmVyX2luZm89SFBHX1dJTlRWX1BBTF9EX0sgfSwKKwl7IFVTQl9ERVZJQ0UoMHgwNTczLCAweDRkMTApLCAuZHJpdmVyX2luZm89SFBHX1dJTlRWX05UU0NfRk0gfSwKKwl7IFVTQl9ERVZJQ0UoMHgwNTczLCAweDRkMTEpLCAuZHJpdmVyX2luZm89SFBHX1dJTlRWX1BBTF9CR19GTSB9LAorCXsgVVNCX0RFVklDRSgweDA1NzMsIDB4NGQxMiksIC5kcml2ZXJfaW5mbz1IUEdfV0lOVFZfUEFMX0lfRk0gfSwKKwl7IFVTQl9ERVZJQ0UoMHgwNTczLCAweDRkMTQpLCAuZHJpdmVyX2luZm89SFBHX1dJTlRWX1BBTF9EX0tfRk0gfSwKKwl7IFVTQl9ERVZJQ0UoMHgwNTczLCAweDRkMmEpLCAuZHJpdmVyX2luZm89SFBHX1dJTlRWX1BST19OVFNDX01OIH0sCisJeyBVU0JfREVWSUNFKDB4MDU3MywgMHg0ZDJiKSwgLmRyaXZlcl9pbmZvPUhQR19XSU5UVl9QUk9fTlRTQ19NTl9WMiB9LAorCXsgVVNCX0RFVklDRSgweDA1NzMsIDB4NGQyYyksIC5kcml2ZXJfaW5mbz1IUEdfV0lOVFZfUFJPX1BBTCB9LAorCXsgVVNCX0RFVklDRSgweDA1NzMsIDB4NGQyMCksIC5kcml2ZXJfaW5mbz1IUEdfV0lOVFZfUFJPX05UU0NfTU5fVjMgfSwKKwl7IFVTQl9ERVZJQ0UoMHgwNTczLCAweDRkMjEpLCAuZHJpdmVyX2luZm89SFBHX1dJTlRWX1BST19QQUxfQkcgfSwKKwl7IFVTQl9ERVZJQ0UoMHgwNTczLCAweDRkMjIpLCAuZHJpdmVyX2luZm89SFBHX1dJTlRWX1BST19QQUxfSSB9LAorCXsgVVNCX0RFVklDRSgweDA1NzMsIDB4NGQyMyksIC5kcml2ZXJfaW5mbz1IUEdfV0lOVFZfUFJPX1BBTF9TRUNBTV9MIH0sCisJeyBVU0JfREVWSUNFKDB4MDU3MywgMHg0ZDI0KSwgLmRyaXZlcl9pbmZvPUhQR19XSU5UVl9QUk9fUEFMX0RfSyB9LAorCXsgVVNCX0RFVklDRSgweDA1NzMsIDB4NGQyNSksIC5kcml2ZXJfaW5mbz1IUEdfV0lOVFZfUFJPX1BBTF9TRUNBTSB9LAorCXsgVVNCX0RFVklDRSgweDA1NzMsIDB4NGQyNiksIC5kcml2ZXJfaW5mbz1IUEdfV0lOVFZfUFJPX1BBTF9TRUNBTV9WMiB9LAorCXsgVVNCX0RFVklDRSgweDA1NzMsIDB4NGQyNyksIC5kcml2ZXJfaW5mbz1IUEdfV0lOVFZfUFJPX1BBTF9CR19WMiB9LAorCXsgVVNCX0RFVklDRSgweDA1NzMsIDB4NGQyOCksIC5kcml2ZXJfaW5mbz1IUEdfV0lOVFZfUFJPX1BBTF9CR19EX0sgfSwKKwl7IFVTQl9ERVZJQ0UoMHgwNTczLCAweDRkMjkpLCAuZHJpdmVyX2luZm89SFBHX1dJTlRWX1BST19QQUxfSV9EX0sgfSwKKwl7IFVTQl9ERVZJQ0UoMHgwNTczLCAweDRkMzApLCAuZHJpdmVyX2luZm89SFBHX1dJTlRWX1BST19OVFNDX01OX0ZNIH0sCisJeyBVU0JfREVWSUNFKDB4MDU3MywgMHg0ZDMxKSwgLmRyaXZlcl9pbmZvPUhQR19XSU5UVl9QUk9fUEFMX0JHX0ZNIH0sCisJeyBVU0JfREVWSUNFKDB4MDU3MywgMHg0ZDMyKSwgLmRyaXZlcl9pbmZvPUhQR19XSU5UVl9QUk9fUEFMX0lfRk0gfSwKKwl7IFVTQl9ERVZJQ0UoMHgwNTczLCAweDRkMzQpLCAuZHJpdmVyX2luZm89SFBHX1dJTlRWX1BST19QQUxfRF9LX0ZNIH0sCisJeyBVU0JfREVWSUNFKDB4MDU3MywgMHg0ZDM1KSwgLmRyaXZlcl9pbmZvPUhQR19XSU5UVl9QUk9fVEVNSUNfUEFMX0ZNIH0sCisJeyBVU0JfREVWSUNFKDB4MDU3MywgMHg0ZDM2KSwgLmRyaXZlcl9pbmZvPUhQR19XSU5UVl9QUk9fVEVNSUNfUEFMX0JHX0ZNIH0sCisJeyBVU0JfREVWSUNFKDB4MDU3MywgMHg0ZDM3KSwgLmRyaXZlcl9pbmZvPUhQR19XSU5UVl9QUk9fUEFMX0ZNIH0sCisJeyBVU0JfREVWSUNFKDB4MDU3MywgMHg0ZDM4KSwgLmRyaXZlcl9pbmZvPUhQR19XSU5UVl9QUk9fTlRTQ19NTl9GTV9WMiB9LAorCXsgVVNCX0RFVklDRSgweDA3NjgsIDB4MDAwNiksIC5kcml2ZXJfaW5mbz1DQU1URUxfVFZCMzMwIH0sCisJeyBVU0JfREVWSUNFKDB4MDdkMCwgMHgwMDAxKSwgLmRyaXZlcl9pbmZvPURJR0lUQUxfVklERU9fQ1JFQVRPUl9JIH0sCisJeyBVU0JfREVWSUNFKDB4MDdkMCwgMHgwMDAyKSwgLmRyaXZlcl9pbmZvPUdMT0JBTF9WSUxMQUdFX0dWXzAwN19OVFNDIH0sCisJeyBVU0JfREVWSUNFKDB4MDdkMCwgMHgwMDAzKSwgLmRyaXZlcl9pbmZvPURBWlpMRV9EVkNfNTBfUkVWXzFfTlRTQyB9LAorCXsgVVNCX0RFVklDRSgweDA3ZDAsIDB4MDAwNCksIC5kcml2ZXJfaW5mbz1EQVpaTEVfRFZDXzgwX1JFVl8xX1BBTCB9LAorCXsgVVNCX0RFVklDRSgweDA3ZDAsIDB4MDAwNSksIC5kcml2ZXJfaW5mbz1EQVpaTEVfRFZDXzkwX1JFVl8xX1NFQ0FNIH0sCisJeyBVU0JfREVWSUNFKDB4MDdmOCwgMHg5MTA0KSwgLmRyaXZlcl9pbmZvPUVTS0FQRV9MQUJTX01ZVFYyR08gfSwKKwl7IFVTQl9ERVZJQ0UoMHgyMzA0LCAweDAxMGQpLCAuZHJpdmVyX2luZm89UElOTkFfUENUVl9VU0JfUEFMIH0sCisJeyBVU0JfREVWSUNFKDB4MjMwNCwgMHgwMTA5KSwgLmRyaXZlcl9pbmZvPVBJTk5BX1BDVFZfVVNCX1NFQ0FNIH0sCisJeyBVU0JfREVWSUNFKDB4MjMwNCwgMHgwMTEwKSwgLmRyaXZlcl9pbmZvPVBJTk5BX1BDVFZfVVNCX1BBTF9GTSB9LAorCXsgVVNCX0RFVklDRSgweDIzMDQsIDB4MDExMSksIC5kcml2ZXJfaW5mbz1NSVJPX1BDVFZfVVNCIH0sCisJeyBVU0JfREVWSUNFKDB4MjMwNCwgMHgwMTEyKSwgLmRyaXZlcl9pbmZvPVBJTk5BX1BDVFZfVVNCX05UU0NfRk0gfSwKKwl7IFVTQl9ERVZJQ0UoMHgyMzA0LCAweDAyMTApLCAuZHJpdmVyX2luZm89UElOTkFfUENUVl9VU0JfUEFMX0ZNX1YyIH0sCisJeyBVU0JfREVWSUNFKDB4MjMwNCwgMHgwMjEyKSwgLmRyaXZlcl9pbmZvPVBJTk5BX1BDVFZfVVNCX05UU0NfRk1fVjIgfSwKKwl7IFVTQl9ERVZJQ0UoMHgyMzA0LCAweDAyMTQpLCAuZHJpdmVyX2luZm89UElOTkFfUENUVl9VU0JfUEFMX0ZNX1YzIH0sCisJeyBVU0JfREVWSUNFKDB4MjMwNCwgMHgwMzAwKSwgLmRyaXZlcl9pbmZvPVBJTk5BX0xJTlhfVkRfSU5fQ0FCX05UU0MgfSwKKwl7IFVTQl9ERVZJQ0UoMHgyMzA0LCAweDAzMDEpLCAuZHJpdmVyX2luZm89UElOTkFfTElOWF9WRF9JTl9DQUJfUEFMIH0sCisJeyBVU0JfREVWSUNFKDB4MjMwNCwgMHgwNDE5KSwgLmRyaXZlcl9pbmZvPVBJTk5BX1BDVFZfQlVOR0VFX1BBTF9GTSB9LAorCXsgVVNCX0RFVklDRSgweDI0MDAsIDB4NDIwMCksIC5kcml2ZXJfaW5mbz1IUEdfV0lOVFYgfSwKIH07CiAKIE1PRFVMRV9ERVZJQ0VfVEFCTEUgKHVzYiwgdXNidmlzaW9uX3RhYmxlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlzaW9uL3VzYnZpc2lvbi1jYXJkcy5oIGIvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aXNpb24vdXNidmlzaW9uLWNhcmRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTEyYzVjZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlzaW9uL3VzYnZpc2lvbi1jYXJkcy5oCkBAIC0wLDAgKzEsNjYgQEAKKyNkZWZpbmUgWEFOQk9PICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEJFTEtJTl9WSURFT0JVU19JSSAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBCRUxLSU5fVklERU9CVVMgICAgICAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgQkVMS0lOX1VTQl9WSURFT0JVU19JSSAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIEVDSE9GWF9JTlRFUlZJRVdfTElURSAgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBVU0JHRUFSX1VTQkdfVjEgICAgICAgICAgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgRF9MSU5LX1YxMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIFgxMF9VU0JfQ0FNRVJBICAgICAgICAgICAgICAgICAgICAgICAgICAgNworI2RlZmluZSBIUEdfV0lOVFZfTElWRV9QQUxfQkcgICAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgSFBHX1dJTlRWX0xJVkVfUFJPX05UU0NfTU4gICAgICAgICAgICAgICA5CisjZGVmaW5lIFpPUkFOX1BNRF9OT0dBVEVDSCAgICAgICAgICAgICAgICAgICAgICAgMTAKKyNkZWZpbmUgTk9HQVRFQ0hfVVNCX1RWX05UU0NfRk0gICAgICAgICAgICAgICAgICAxMQorI2RlZmluZSBQTllfVVNCX1RWX05UU0NfRk0gICAgICAgICAgICAgICAgICAgICAgIDEyCisjZGVmaW5lIFBWX1BMQVlUVl9VU0JfUFJPX1BBTF9GTSAgICAgICAgICAgICAgICAgMTMKKyNkZWZpbmUgWlRfNzIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBIUEdfV0lOVFZfTlRTQ19NTiAgICAgICAgICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIEhQR19XSU5UVl9QQUxfQkcgICAgICAgICAgICAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgSFBHX1dJTlRWX1BBTF9JICAgICAgICAgICAgICAgICAgICAgICAgICAxNworI2RlZmluZSBIUEdfV0lOVFZfUEFMX1NFQ0FNX0wgICAgICAgICAgICAgICAgICAgIDE4CisjZGVmaW5lIEhQR19XSU5UVl9QQUxfRF9LICAgICAgICAgICAgICAgICAgICAgICAgMTkKKyNkZWZpbmUgSFBHX1dJTlRWX05UU0NfRk0gICAgICAgICAgICAgICAgICAgICAgICAyMAorI2RlZmluZSBIUEdfV0lOVFZfUEFMX0JHX0ZNICAgICAgICAgICAgICAgICAgICAgIDIxCisjZGVmaW5lIEhQR19XSU5UVl9QQUxfSV9GTSAgICAgICAgICAgICAgICAgICAgICAgMjIKKyNkZWZpbmUgSFBHX1dJTlRWX1BBTF9EX0tfRk0gICAgICAgICAgICAgICAgICAgICAyMworI2RlZmluZSBIUEdfV0lOVFZfUFJPX05UU0NfTU4gICAgICAgICAgICAgICAgICAgIDI0CisjZGVmaW5lIEhQR19XSU5UVl9QUk9fTlRTQ19NTl9WMiAgICAgICAgICAgICAgICAgMjUKKyNkZWZpbmUgSFBHX1dJTlRWX1BST19QQUwgICAgICAgICAgICAgICAgICAgICAgICAyNgorI2RlZmluZSBIUEdfV0lOVFZfUFJPX05UU0NfTU5fVjMgICAgICAgICAgICAgICAgIDI3CisjZGVmaW5lIEhQR19XSU5UVl9QUk9fUEFMX0JHICAgICAgICAgICAgICAgICAgICAgMjgKKyNkZWZpbmUgSFBHX1dJTlRWX1BST19QQUxfSSAgICAgICAgICAgICAgICAgICAgICAyOQorI2RlZmluZSBIUEdfV0lOVFZfUFJPX1BBTF9TRUNBTV9MICAgICAgICAgICAgICAgIDMwCisjZGVmaW5lIEhQR19XSU5UVl9QUk9fUEFMX0RfSyAgICAgICAgICAgICAgICAgICAgMzEKKyNkZWZpbmUgSFBHX1dJTlRWX1BST19QQUxfU0VDQU0gICAgICAgICAgICAgICAgICAzMgorI2RlZmluZSBIUEdfV0lOVFZfUFJPX1BBTF9TRUNBTV9WMiAgICAgICAgICAgICAgIDMzCisjZGVmaW5lIEhQR19XSU5UVl9QUk9fUEFMX0JHX1YyICAgICAgICAgICAgICAgICAgMzQKKyNkZWZpbmUgSFBHX1dJTlRWX1BST19QQUxfQkdfRF9LICAgICAgICAgICAgICAgICAzNQorI2RlZmluZSBIUEdfV0lOVFZfUFJPX1BBTF9JX0RfSyAgICAgICAgICAgICAgICAgIDM2CisjZGVmaW5lIEhQR19XSU5UVl9QUk9fTlRTQ19NTl9GTSAgICAgICAgICAgICAgICAgMzcKKyNkZWZpbmUgSFBHX1dJTlRWX1BST19QQUxfQkdfRk0gICAgICAgICAgICAgICAgICAzOAorI2RlZmluZSBIUEdfV0lOVFZfUFJPX1BBTF9JX0ZNICAgICAgICAgICAgICAgICAgIDM5CisjZGVmaW5lIEhQR19XSU5UVl9QUk9fUEFMX0RfS19GTSAgICAgICAgICAgICAgICAgNDAKKyNkZWZpbmUgSFBHX1dJTlRWX1BST19URU1JQ19QQUxfRk0gICAgICAgICAgICAgICA0MQorI2RlZmluZSBIUEdfV0lOVFZfUFJPX1RFTUlDX1BBTF9CR19GTSAgICAgICAgICAgIDQyCisjZGVmaW5lIEhQR19XSU5UVl9QUk9fUEFMX0ZNICAgICAgICAgICAgICAgICAgICAgNDMKKyNkZWZpbmUgSFBHX1dJTlRWX1BST19OVFNDX01OX0ZNX1YyICAgICAgICAgICAgICA0NAorI2RlZmluZSBDQU1URUxfVFZCMzMwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ1CisjZGVmaW5lIERJR0lUQUxfVklERU9fQ1JFQVRPUl9JICAgICAgICAgICAgICAgICAgNDYKKyNkZWZpbmUgR0xPQkFMX1ZJTExBR0VfR1ZfMDA3X05UU0MgICAgICAgICAgICAgICA0NworI2RlZmluZSBEQVpaTEVfRFZDXzUwX1JFVl8xX05UU0MgICAgICAgICAgICAgICAgIDQ4CisjZGVmaW5lIERBWlpMRV9EVkNfODBfUkVWXzFfUEFMICAgICAgICAgICAgICAgICAgNDkKKyNkZWZpbmUgREFaWkxFX0RWQ185MF9SRVZfMV9TRUNBTSAgICAgICAgICAgICAgICA1MAorI2RlZmluZSBFU0tBUEVfTEFCU19NWVRWMkdPICAgICAgICAgICAgICAgICAgICAgIDUxCisjZGVmaW5lIFBJTk5BX1BDVFZfVVNCX1BBTCAgICAgICAgICAgICAgICAgICAgICAgNTIKKyNkZWZpbmUgUElOTkFfUENUVl9VU0JfU0VDQU0gICAgICAgICAgICAgICAgICAgICA1MworI2RlZmluZSBQSU5OQV9QQ1RWX1VTQl9QQUxfRk0gICAgICAgICAgICAgICAgICAgIDU0CisjZGVmaW5lIE1JUk9fUENUVl9VU0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTUKKyNkZWZpbmUgUElOTkFfUENUVl9VU0JfTlRTQ19GTSAgICAgICAgICAgICAgICAgICA1NgorI2RlZmluZSBQSU5OQV9QQ1RWX1VTQl9QQUxfRk1fVjIgICAgICAgICAgICAgICAgIDU3CisjZGVmaW5lIFBJTk5BX1BDVFZfVVNCX05UU0NfRk1fVjIgICAgICAgICAgICAgICAgNTgKKyNkZWZpbmUgUElOTkFfUENUVl9VU0JfUEFMX0ZNX1YzICAgICAgICAgICAgICAgICA1OQorI2RlZmluZSBQSU5OQV9MSU5YX1ZEX0lOX0NBQl9OVFNDICAgICAgICAgICAgICAgIDYwCisjZGVmaW5lIFBJTk5BX0xJTlhfVkRfSU5fQ0FCX1BBTCAgICAgICAgICAgICAgICAgNjEKKyNkZWZpbmUgUElOTkFfUENUVl9CVU5HRUVfUEFMX0ZNICAgICAgICAgICAgICAgICA2MgorI2RlZmluZSBIUEdfV0lOVFYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYzCisKK2V4dGVybiBjb25zdCBpbnQgdXNidmlzaW9uX2RldmljZV9kYXRhX3NpemU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpc2lvbi91c2J2aXNpb24tY29yZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aXNpb24vdXNidmlzaW9uLWNvcmUuYwppbmRleCBmMjE1NGRjLi5iY2I1NTFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpc2lvbi91c2J2aXNpb24tY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlzaW9uL3VzYnZpc2lvbi1jb3JlLmMKQEAgLTIwNDAsOCArMjA0MCw4IEBACiAJCXJldHVybiAwOwogCiAJLyogU2V0IGlucHV0IGZvcm1hdCBleHBlY3RlZCBmcm9tIGRlY29kZXIqLwotCWlmICh1c2J2aXNpb25fZGV2aWNlX2RhdGFbdXNidmlzaW9uLT5EZXZNb2RlbF0uVmluX1JlZzEgPj0gMCkgewotCQl2YWx1ZVswXSA9IHVzYnZpc2lvbl9kZXZpY2VfZGF0YVt1c2J2aXNpb24tPkRldk1vZGVsXS5WaW5fUmVnMSAmIDB4ZmY7CisJaWYgKHVzYnZpc2lvbl9kZXZpY2VfZGF0YVt1c2J2aXNpb24tPkRldk1vZGVsXS5WaW5fUmVnMV9vdmVycmlkZSkgeworCQl2YWx1ZVswXSA9IHVzYnZpc2lvbl9kZXZpY2VfZGF0YVt1c2J2aXNpb24tPkRldk1vZGVsXS5WaW5fUmVnMTsKIAl9IGVsc2UgaWYodXNidmlzaW9uX2RldmljZV9kYXRhW3VzYnZpc2lvbi0+RGV2TW9kZWxdLkNvZGVjID09IENPREVDX1NBQTcxMTMpIHsKIAkJLyogU0FBNzExMyB1c2VzIDggYml0IG91dHB1dCAqLwogCQl2YWx1ZVswXSA9IFVTQlZJU0lPTl84XzQyMl9TWU5DOwpAQCAtMjExMiw4ICsyMTEyLDggQEAKIAogCWR2aV95dXZfdmFsdWUgPSAweDAwOwkvKiBVIGNvbWVzIGFmdGVyIFYsIFlhIGNvbWVzIGFmdGVyIFUvViwgWWIgY29tZXMgYWZ0ZXIgWWIgKi8KIAotCWlmKHVzYnZpc2lvbl9kZXZpY2VfZGF0YVt1c2J2aXNpb24tPkRldk1vZGVsXS5EdmlfeXV2ID49IDApewotCQlkdmlfeXV2X3ZhbHVlID0gdXNidmlzaW9uX2RldmljZV9kYXRhW3VzYnZpc2lvbi0+RGV2TW9kZWxdLkR2aV95dXYgJiAweGZmOworCWlmKHVzYnZpc2lvbl9kZXZpY2VfZGF0YVt1c2J2aXNpb24tPkRldk1vZGVsXS5EdmlfeXV2X292ZXJyaWRlKXsKKwkJZHZpX3l1dl92YWx1ZSA9IHVzYnZpc2lvbl9kZXZpY2VfZGF0YVt1c2J2aXNpb24tPkRldk1vZGVsXS5EdmlfeXV2OwogCX0KIAllbHNlIGlmKHVzYnZpc2lvbl9kZXZpY2VfZGF0YVt1c2J2aXNpb24tPkRldk1vZGVsXS5Db2RlYyA9PSBDT0RFQ19TQUE3MTEzKSB7CiAJLyogVGhpcyBjaGFuZ2VzIGFzIHRoZSBmaW5lIHN5bmMgY29udHJvbCBjaGFuZ2VzLiBGdXJ0aGVyIGludmVzdGlnYXRpb24gbmVjZXNzYXJ5ICovCkBAIC0yMjM4LDcgKzIyMzgsNyBAQAogCVBERUJVRyhEQkdfRlVOQywgIiIpOwogCWRvd25faW50ZXJydXB0aWJsZSgmdXNidmlzaW9uLT5sb2NrKTsKIAlpZih1c2J2aXNpb24tPnVzZXIgPT0gMCkgewotCQl1c2J2aXNpb25faTJjX3VzYl9kZWxfYnVzKCZ1c2J2aXNpb24tPmkyY19hZGFwKTsKKwkJdXNidmlzaW9uX2kyY191bnJlZ2lzdGVyKHVzYnZpc2lvbik7CiAKIAkJdXNidmlzaW9uX3Bvd2VyX29mZih1c2J2aXNpb24pOwogCQl1c2J2aXNpb24tPmluaXRpYWxpemVkID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlzaW9uL3VzYnZpc2lvbi1pMmMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlzaW9uL3VzYnZpc2lvbi1pMmMuYwppbmRleCA2MDllMWZkLi4wMjViZTU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpc2lvbi91c2J2aXNpb24taTJjLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aXNpb24vdXNidmlzaW9uLWkyYy5jCkBAIC0xLDggKzEsOCBAQAogLyoKLSAqIEkyQ19BTEdPX1VTQi5DCisgKiB1c2J2aXNpb25faTJjLmMKICAqICBpMmMgYWxnb3JpdGhtIGZvciBVU0ItSTJDIEJyaWRnZXMKICAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTktMjAwNSBKb2VyZyBIZWNrZW5iYWNoIDxqb2VyZ0BoZWNrZW5iYWNoLWF3LmRlPgorICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDcgSm9lcmcgSGVja2VuYmFjaCA8am9lcmdAaGVja2VuYmFjaC1hdy5kZT4KICAqICAgICAgICAgICAgICAgICAgICAgICAgIER3YWluZSBHYXJkZW4gPGR3YWluZWdhcmRlbkByb2dlcnMuY29tPgogICoKICAqIFRoaXMgbW9kdWxlIGlzIHBhcnQgb2YgdXNidmlzaW9uIGRyaXZlciBwcm9qZWN0LgpAQCAtMzksNyArMzksNiBAQAogI2luY2x1ZGUgInVzYnZpc2lvbi5oIgogCiAjZGVmaW5lIERCR19JMkMJCTE8PDAKLSNkZWZpbmUgREJHX0FMR08JMTw8MQogCiBzdGF0aWMgaW50IGkyY19kZWJ1ZyA9IDA7CiAKQEAgLTQ5LDIyICs0OCwyMiBAQAogI2RlZmluZSBQREVCVUcobGV2ZWwsIGZtdCwgYXJncy4uLikgXAogCQlpZiAoaTJjX2RlYnVnICYgKGxldmVsKSkgaW5mbygiWyVzOiVkXSAiIGZtdCwgX19QUkVUVFlfRlVOQ1RJT05fXywgX19MSU5FX18gLCAjIyBhcmdzKQogCi1zdGF0aWMgaW50IHVzYnZpc2lvbl9pMmNfd3JpdGUodm9pZCAqZGF0YSwgdW5zaWduZWQgY2hhciBhZGRyLCBjaGFyICpidWYsCitzdGF0aWMgaW50IHVzYnZpc2lvbl9pMmNfd3JpdGUoc3RydWN0IHVzYl91c2J2aXNpb24gKnVzYnZpc2lvbiwgdW5zaWduZWQgY2hhciBhZGRyLCBjaGFyICpidWYsCiAJCQkgICAgc2hvcnQgbGVuKTsKLXN0YXRpYyBpbnQgdXNidmlzaW9uX2kyY19yZWFkKHZvaWQgKmRhdGEsIHVuc2lnbmVkIGNoYXIgYWRkciwgY2hhciAqYnVmLAorc3RhdGljIGludCB1c2J2aXNpb25faTJjX3JlYWQoc3RydWN0IHVzYl91c2J2aXNpb24gKnVzYnZpc2lvbiwgdW5zaWduZWQgY2hhciBhZGRyLCBjaGFyICpidWYsCiAJCQkgICBzaG9ydCBsZW4pOwogCiBzdGF0aWMgaW5saW5lIGludCB0cnlfd3JpdGVfYWRkcmVzcyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyY19hZGFwLAogCQkJCSAgICB1bnNpZ25lZCBjaGFyIGFkZHIsIGludCByZXRyaWVzKQogewotCXZvaWQgKmRhdGE7CisJc3RydWN0IHVzYl91c2J2aXNpb24gKnVzYnZpc2lvbjsKIAlpbnQgaSwgcmV0ID0gLTE7CiAJY2hhciBidWZbNF07CiAKLQlkYXRhID0gaTJjX2dldF9hZGFwZGF0YShpMmNfYWRhcCk7CisJdXNidmlzaW9uID0gKHN0cnVjdCB1c2JfdXNidmlzaW9uICopaTJjX2dldF9hZGFwZGF0YShpMmNfYWRhcCk7CiAJYnVmWzBdID0gMHgwMDsKIAlmb3IgKGkgPSAwOyBpIDw9IHJldHJpZXM7IGkrKykgewotCQlyZXQgPSAodXNidmlzaW9uX2kyY193cml0ZShkYXRhLCBhZGRyLCBidWYsIDEpKTsKKwkJcmV0ID0gKHVzYnZpc2lvbl9pMmNfd3JpdGUodXNidmlzaW9uLCBhZGRyLCBidWYsIDEpKTsKIAkJaWYgKHJldCA9PSAxKQogCQkJYnJlYWs7CS8qIHN1Y2Nlc3MhICovCiAJCXVkZWxheSg1KTsKQEAgLTczLDggKzcyLDggQEAKIAkJdWRlbGF5KDEwKTsKIAl9CiAJaWYgKGkpIHsKLQkJUERFQlVHKERCR19BTEdPLCJOZWVkZWQgJWQgcmV0cmllcyBmb3IgYWRkcmVzcyAlIzJ4IiwgaSwgYWRkcik7Ci0JCVBERUJVRyhEQkdfQUxHTywiTWF5YmUgdGhlcmUncyBubyBkZXZpY2UgYXQgdGhpcyBhZGRyZXNzIik7CisJCVBERUJVRyhEQkdfSTJDLCJOZWVkZWQgJWQgcmV0cmllcyBmb3IgYWRkcmVzcyAlIzJ4IiwgaSwgYWRkcik7CisJCVBERUJVRyhEQkdfSTJDLCJNYXliZSB0aGVyZSdzIG5vIGRldmljZSBhdCB0aGlzIGFkZHJlc3MiKTsKIAl9CiAJcmV0dXJuIHJldDsKIH0KQEAgLTgyLDEzICs4MSwxMyBAQAogc3RhdGljIGlubGluZSBpbnQgdHJ5X3JlYWRfYWRkcmVzcyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyY19hZGFwLAogCQkJCSAgIHVuc2lnbmVkIGNoYXIgYWRkciwgaW50IHJldHJpZXMpCiB7Ci0Jdm9pZCAqZGF0YTsKKwlzdHJ1Y3QgdXNiX3VzYnZpc2lvbiAqdXNidmlzaW9uOwogCWludCBpLCByZXQgPSAtMTsKIAljaGFyIGJ1Zls0XTsKIAotCWRhdGEgPSBpMmNfZ2V0X2FkYXBkYXRhKGkyY19hZGFwKTsKKwl1c2J2aXNpb24gPSAoc3RydWN0IHVzYl91c2J2aXNpb24gKilpMmNfZ2V0X2FkYXBkYXRhKGkyY19hZGFwKTsKIAlmb3IgKGkgPSAwOyBpIDw9IHJldHJpZXM7IGkrKykgewotCQlyZXQgPSAodXNidmlzaW9uX2kyY19yZWFkKGRhdGEsIGFkZHIsIGJ1ZiwgMSkpOworCQlyZXQgPSAodXNidmlzaW9uX2kyY19yZWFkKHVzYnZpc2lvbiwgYWRkciwgYnVmLCAxKSk7CiAJCWlmIChyZXQgPT0gMSkKIAkJCWJyZWFrOwkvKiBzdWNjZXNzISAqLwogCQl1ZGVsYXkoNSk7CkBAIC05Nyw4ICs5Niw4IEBACiAJCXVkZWxheSgxMCk7CiAJfQogCWlmIChpKSB7Ci0JCVBERUJVRyhEQkdfQUxHTywiTmVlZGVkICVkIHJldHJpZXMgZm9yIGFkZHJlc3MgJSMyeCIsIGksIGFkZHIpOwotCQlQREVCVUcoREJHX0FMR08sIk1heWJlIHRoZXJlJ3Mgbm8gZGV2aWNlIGF0IHRoaXMgYWRkcmVzcyIpOworCQlQREVCVUcoREJHX0kyQywiTmVlZGVkICVkIHJldHJpZXMgZm9yIGFkZHJlc3MgJSMyeCIsIGksIGFkZHIpOworCQlQREVCVUcoREJHX0kyQywiTWF5YmUgdGhlcmUncyBubyBkZXZpY2UgYXQgdGhpcyBhZGRyZXNzIik7CiAJfQogCXJldHVybiByZXQ7CiB9CkBAIC0xNTIsMzIgKzE1MSwzMiBAQAogfQogCiBzdGF0aWMgaW50Ci11c2JfeGZlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyY19hZGFwLCBzdHJ1Y3QgaTJjX21zZyBtc2dzW10sIGludCBudW0pCit1c2J2aXNpb25faTJjX3hmZXIoc3RydWN0IGkyY19hZGFwdGVyICppMmNfYWRhcCwgc3RydWN0IGkyY19tc2cgbXNnc1tdLCBpbnQgbnVtKQogewogCXN0cnVjdCBpMmNfbXNnICpwbXNnOwotCXZvaWQgKmRhdGE7CisJc3RydWN0IHVzYl91c2J2aXNpb24gKnVzYnZpc2lvbjsKIAlpbnQgaSwgcmV0OwogCXVuc2lnbmVkIGNoYXIgYWRkcjsKIAotCWRhdGEgPSBpMmNfZ2V0X2FkYXBkYXRhKGkyY19hZGFwKTsKKwl1c2J2aXNpb24gPSAoc3RydWN0IHVzYl91c2J2aXNpb24gKilpMmNfZ2V0X2FkYXBkYXRhKGkyY19hZGFwKTsKIAogCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgewogCQlwbXNnID0gJm1zZ3NbaV07CiAJCXJldCA9IHVzYl9maW5kX2FkZHJlc3MoaTJjX2FkYXAsIHBtc2csIGkyY19hZGFwLT5yZXRyaWVzLCAmYWRkcik7CiAJCWlmIChyZXQgIT0gMCkgewotCQkJUERFQlVHKERCR19BTEdPLCJnb3QgTkFLIGZyb20gZGV2aWNlLCBtZXNzYWdlICMlZCIsIGkpOworCQkJUERFQlVHKERCR19JMkMsImdvdCBOQUsgZnJvbSBkZXZpY2UsIG1lc3NhZ2UgIyVkIiwgaSk7CiAJCQlyZXR1cm4gKHJldCA8IDApID8gcmV0IDogLUVSRU1PVEVJTzsKIAkJfQogCiAJCWlmIChwbXNnLT5mbGFncyAmIEkyQ19NX1JEKSB7CiAJCQkvKiByZWFkIGJ5dGVzIGludG8gYnVmZmVyICovCi0JCQlyZXQgPSAodXNidmlzaW9uX2kyY19yZWFkKGRhdGEsIGFkZHIsIHBtc2ctPmJ1ZiwgcG1zZy0+bGVuKSk7CisJCQlyZXQgPSAodXNidmlzaW9uX2kyY19yZWFkKHVzYnZpc2lvbiwgYWRkciwgcG1zZy0+YnVmLCBwbXNnLT5sZW4pKTsKIAkJCWlmIChyZXQgPCBwbXNnLT5sZW4pIHsKIAkJCQlyZXR1cm4gKHJldCA8IDApID8gcmV0IDogLUVSRU1PVEVJTzsKIAkJCX0KIAkJfSBlbHNlIHsKIAkJCS8qIHdyaXRlIGJ5dGVzIGZyb20gYnVmZmVyICovCi0JCQlyZXQgPSAodXNidmlzaW9uX2kyY193cml0ZShkYXRhLCBhZGRyLCBwbXNnLT5idWYsIHBtc2ctPmxlbikpOworCQkJcmV0ID0gKHVzYnZpc2lvbl9pMmNfd3JpdGUodXNidmlzaW9uLCBhZGRyLCBwbXNnLT5idWYsIHBtc2ctPmxlbikpOwogCQkJaWYgKHJldCA8IHBtc2ctPmxlbikgewogCQkJCXJldHVybiAocmV0IDwgMCkgPyByZXQgOiAtRVJFTU9URUlPOwogCQkJfQpAQCAtMTkxLDcgKzE5MCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB1MzIgdXNiX2Z1bmMoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQorc3RhdGljIHUzMiBmdW5jdGlvbmFsaXR5KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKIHsKIAlyZXR1cm4gSTJDX0ZVTkNfU01CVVNfRU1VTCB8IEkyQ19GVU5DXzEwQklUX0FERFIgfCBJMkNfRlVOQ19QUk9UT0NPTF9NQU5HTElORzsKIH0KQEAgLTE5OSwxMSArMTk4LDExIEBACiAKIC8qIC0tLS0tZXhwb3J0ZWQgYWxnb3JpdGhtIGRhdGE6IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0JKi8KIAotc3RhdGljIHN0cnVjdCBpMmNfYWxnb3JpdGhtIGkyY191c2JfYWxnbyA9IHsKLQkubWFzdGVyX3hmZXIgICA9IHVzYl94ZmVyLAorc3RhdGljIHN0cnVjdCBpMmNfYWxnb3JpdGhtIHVzYnZpc2lvbl9hbGdvID0geworCS5tYXN0ZXJfeGZlciAgID0gdXNidmlzaW9uX2kyY194ZmVyLAogCS5zbWJ1c194ZmVyICAgID0gTlVMTCwKIAkuYWxnb19jb250cm9sICA9IGFsZ29fY29udHJvbCwKLQkuZnVuY3Rpb25hbGl0eSA9IHVzYl9mdW5jLAorCS5mdW5jdGlvbmFsaXR5ID0gZnVuY3Rpb25hbGl0eSwKIH07CiAKIApAQCAtMjEzLDQxICsyMTIsMjkgQEAKIHN0YXRpYyBpbnQgdXNidmlzaW9uX2kyY191c2JfYWRkX2J1cyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCiB7CiAJUERFQlVHKERCR19JMkMsICJJMkMgICBkZWJ1Z2dpbmcgaXMgZW5hYmxlZCBbaTJjXSIpOwotCVBERUJVRyhEQkdfQUxHTywgIkFMR08gICBkZWJ1Z2dpbmcgaXMgZW5hYmxlZCBbaTJjXSIpOworCVBERUJVRyhEQkdfSTJDLCAiQUxHTyAgIGRlYnVnZ2luZyBpcyBlbmFibGVkIFtpMmNdIik7CiAKIAkvKiByZWdpc3RlciBuZXcgYWRhcHRlciB0byBpMmMgbW9kdWxlLi4uICovCiAKLQlhZGFwLT5hbGdvID0gJmkyY191c2JfYWxnbzsKKwlhZGFwLT5hbGdvID0gJnVzYnZpc2lvbl9hbGdvOwogCiAJYWRhcC0+dGltZW91dCA9IDEwMDsJLyogZGVmYXVsdCB2YWx1ZXMsIHNob3VsZCAgICAgICAqLwogCWFkYXAtPnJldHJpZXMgPSAzOwkvKiBiZSByZXBsYWNlZCBieSBkZWZpbmVzICAgICAgICovCiAKIAlpMmNfYWRkX2FkYXB0ZXIoYWRhcCk7CiAKLQlQREVCVUcoREJHX0FMR08sImkyYyBidXMgZm9yICVzIHJlZ2lzdGVyZWQiLCBhZGFwLT5uYW1lKTsKKwlQREVCVUcoREJHX0kyQywiaTJjIGJ1cyBmb3IgJXMgcmVnaXN0ZXJlZCIsIGFkYXAtPm5hbWUpOwogCiAJcmV0dXJuIDA7CiB9CiAKLQotaW50IHVzYnZpc2lvbl9pMmNfdXNiX2RlbF9idXMoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQotewotCi0JaTJjX2RlbF9hZGFwdGVyKGFkYXApOwotCi0JUERFQlVHKERCR19BTEdPLCJpMmMgYnVzIGZvciAlcyB1bnJlZ2lzdGVyZWQiLCBhZGFwLT5uYW1lKTsKLQotCXJldHVybiAwOwotfQotCi0KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAvKiB1c2J2aXNpb24gc3BlY2lmaWMgSTJDIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIHN0YXRpYyBzdHJ1Y3QgaTJjX2FkYXB0ZXIgaTJjX2FkYXBfdGVtcGxhdGU7CiBzdGF0aWMgc3RydWN0IGkyY19jbGllbnQgaTJjX2NsaWVudF90ZW1wbGF0ZTsKIAotaW50IHVzYnZpc2lvbl9pbml0X2kyYyhzdHJ1Y3QgdXNiX3VzYnZpc2lvbiAqdXNidmlzaW9uKQoraW50IHVzYnZpc2lvbl9pMmNfcmVnaXN0ZXIoc3RydWN0IHVzYl91c2J2aXNpb24gKnVzYnZpc2lvbikKIHsKIAltZW1jcHkoJnVzYnZpc2lvbi0+aTJjX2FkYXAsICZpMmNfYWRhcF90ZW1wbGF0ZSwKIAkgICAgICAgc2l6ZW9mKHN0cnVjdCBpMmNfYWRhcHRlcikpOwpAQCAtMjY1LDcgKzI1Miw3IEBACiAJdXNidmlzaW9uLT5pMmNfY2xpZW50LmFkYXB0ZXIgPSAmdXNidmlzaW9uLT5pMmNfYWRhcDsKIAogCWlmICh1c2J2aXNpb25fd3JpdGVfcmVnKHVzYnZpc2lvbiwgVVNCVklTSU9OX1NFUl9NT0RFLCBVU0JWSVNJT05fSUlDX0xSTkFDSykgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAidXNidmlzaW9uX2luaXRfaTJjOiBjYW4ndCB3cml0ZSByZWdcbiIpOworCQlwcmludGsoS0VSTl9FUlIgInVzYnZpc2lvbl9yZWdpc3RlcjogY2FuJ3Qgd3JpdGUgcmVnXG4iKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAKQEAgLTI4Nyw2ICsyNzQsMTYgQEAKIAlyZXR1cm4gdXNidmlzaW9uX2kyY191c2JfYWRkX2J1cygmdXNidmlzaW9uLT5pMmNfYWRhcCk7CiB9CiAKK2ludCB1c2J2aXNpb25faTJjX3VucmVnaXN0ZXIoc3RydWN0IHVzYl91c2J2aXNpb24gKnVzYnZpc2lvbikKK3sKKworCWkyY19kZWxfYWRhcHRlcigmKHVzYnZpc2lvbi0+aTJjX2FkYXApKTsKKworCVBERUJVRyhEQkdfSTJDLCJpMmMgYnVzIGZvciAlcyB1bnJlZ2lzdGVyZWQiLCB1c2J2aXNpb24tPmkyY19hZGFwLm5hbWUpOworCisJcmV0dXJuIDA7Cit9CisKIHZvaWQgY2FsbF9pMmNfY2xpZW50cyhzdHJ1Y3QgdXNiX3VzYnZpc2lvbiAqdXNidmlzaW9uLCB1bnNpZ25lZCBpbnQgY21kLAogCQkgICAgICB2b2lkICphcmcpCiB7CkBAIC0zMDAsMTkgKzI5NywxMiBAQAogCXVzYnZpc2lvbiA9IChzdHJ1Y3QgdXNiX3VzYnZpc2lvbiAqKWkyY19nZXRfYWRhcGRhdGEoY2xpZW50LT5hZGFwdGVyKTsKIAogCXN3aXRjaCAoY2xpZW50LT5hZGRyIDw8IDEpIHsKLQkJY2FzZSAweDQzOgotCQljYXNlIDB4NGI6Ci0JCXsKLQkJCXN0cnVjdCB0dW5lcl9zZXR1cCB0dW5fc2V0dXA7Ci0KLQkJCXR1bl9zZXR1cC5tb2RlX21hc2sgPSBUX0FOQUxPR19UViB8IFRfUkFESU87Ci0JCQl0dW5fc2V0dXAudHlwZSA9IFRVTkVSX1REQTk4ODc7Ci0JCQl0dW5fc2V0dXAuYWRkciA9IGNsaWVudC0+YWRkcjsKLQotCQkJY2FsbF9pMmNfY2xpZW50cyh1c2J2aXNpb24sIFRVTkVSX1NFVF9UWVBFX0FERFIsICZ0dW5fc2V0dXApOwotCisJCWNhc2UgMHg0MiA8PCAxOgorCQljYXNlIDB4NDMgPDwgMToKKwkJY2FzZSAweDRhIDw8IDE6CisJCWNhc2UgMHg0YiA8PCAxOgorCQkJUERFQlVHKERCR19JMkMsImF0dGFjaF9pbmZvcm06IHRkYTk4ODcgZGV0ZWN0ZWQuIik7CiAJCQlicmVhazsKLQkJfQogCQljYXNlIDB4NDI6CiAJCQlQREVCVUcoREJHX0kyQywiYXR0YWNoX2luZm9ybTogc2FhNzExNCBkZXRlY3RlZC4iKTsKIAkJCWJyZWFrOwpAQCAtNDgwLDcgKzQ3MCw3IEBACiAJcmV0dXJuIGxlbjsKIH0KIAotc3RhdGljIGludCB1c2J2aXNpb25faTJjX3dyaXRlKHZvaWQgKmRhdGEsIHVuc2lnbmVkIGNoYXIgYWRkciwgY2hhciAqYnVmLAorc3RhdGljIGludCB1c2J2aXNpb25faTJjX3dyaXRlKHN0cnVjdCB1c2JfdXNidmlzaW9uICp1c2J2aXNpb24sIHVuc2lnbmVkIGNoYXIgYWRkciwgY2hhciAqYnVmLAogCQkJICAgIHNob3J0IGxlbikKIHsKIAljaGFyICpidWZQdHIgPSBidWY7CkBAIC00ODgsNyArNDc4LDYgQEAKIAlpbnQgd3Jjb3VudCA9IDA7CiAJaW50IGNvdW50OwogCWludCBtYXhMZW4gPSA0OwotCXN0cnVjdCB1c2JfdXNidmlzaW9uICp1c2J2aXNpb24gPSAoc3RydWN0IHVzYl91c2J2aXNpb24gKikgZGF0YTsKIAogCXdoaWxlIChsZW4gPiAwKSB7CiAJCWNvdW50ID0gKGxlbiA+IG1heExlbikgPyBtYXhMZW4gOiBsZW47CkBAIC01MDMsMTQgKzQ5MiwxMyBAQAogCXJldHVybiB3cmNvdW50OwogfQogCi1zdGF0aWMgaW50IHVzYnZpc2lvbl9pMmNfcmVhZCh2b2lkICpkYXRhLCB1bnNpZ25lZCBjaGFyIGFkZHIsIGNoYXIgKmJ1ZiwKK3N0YXRpYyBpbnQgdXNidmlzaW9uX2kyY19yZWFkKHN0cnVjdCB1c2JfdXNidmlzaW9uICp1c2J2aXNpb24sIHVuc2lnbmVkIGNoYXIgYWRkciwgY2hhciAqYnVmLAogCQkJICAgc2hvcnQgbGVuKQogewogCWNoYXIgdGVtcFs0XTsKIAlpbnQgcmV0dmFsLCBpOwogCWludCByZGNvdW50ID0gMDsKIAlpbnQgY291bnQ7Ci0Jc3RydWN0IHVzYl91c2J2aXNpb24gKnVzYnZpc2lvbiA9IChzdHJ1Y3QgdXNiX3VzYnZpc2lvbiAqKSBkYXRhOwogCiAJd2hpbGUgKGxlbiA+IDApIHsKIAkJY291bnQgPSAobGVuID4gMykgPyA0IDogbGVuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aXNpb24vdXNidmlzaW9uLXZpZGVvLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpc2lvbi91c2J2aXNpb24tdmlkZW8uYwppbmRleCA2ZmMxNDU1Li4yMTY3MDQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpc2lvbi91c2J2aXNpb24tdmlkZW8uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpc2lvbi91c2J2aXNpb24tdmlkZW8uYwpAQCAtNzYsNiArNzYsNyBAQAogI2VuZGlmCiAKICNpbmNsdWRlICJ1c2J2aXNpb24uaCIKKyNpbmNsdWRlICJ1c2J2aXNpb24tY2FyZHMuaCIKIAogI2RlZmluZSBEUklWRVJfQVVUSE9SICJKb2VyZyBIZWNrZW5iYWNoIDxqb2VyZ0BoZWNrZW5iYWNoLWF3LmRlPiwgRHdhaW5lIEdhcmRlbiA8RHdhaW5lR2FyZGVuQHJvZ2Vycy5jb20+IgogI2RlZmluZSBEUklWRVJfTkFNRSAidXNidmlzaW9uIgpAQCAtMTUwLDcgKzE1MSw2IEBACiBzdGF0aWMgaW50IHZpZGVvX25yID0gLTE7CQkJCS8vIFNlcXVlbnRpYWwgTnVtYmVyIG9mIFZpZGVvIERldmljZQogc3RhdGljIGludCByYWRpb19uciA9IC0xOwkJCQkvLyBTZXF1ZW50aWFsIE51bWJlciBvZiBSYWRpbyBEZXZpY2UKIHN0YXRpYyBpbnQgdmJpX25yID0gLTE7CQkJCQkvLyBTZXF1ZW50aWFsIE51bWJlciBvZiBWQkkgRGV2aWNlCi1zdGF0aWMgY2hhciAqQ3VzdG9tRGV2aWNlPU5VTEw7CQkJCS8vIFNldCBhcyBub3RoaW5nLi4uLgogCiAvLyBHcmFiIHBhcmFtZXRlcnMgZm9yIHRoZSBkZXZpY2UgZHJpdmVyCiAKQEAgLTE2MSw3ICsxNjEsNiBAQAogbW9kdWxlX3BhcmFtKHZpZGVvX25yLCBpbnQsIDA0NDQpOwogbW9kdWxlX3BhcmFtKHJhZGlvX25yLCBpbnQsIDA0NDQpOwogbW9kdWxlX3BhcmFtKHZiaV9uciwgaW50LCAwNDQ0KTsKLW1vZHVsZV9wYXJhbShDdXN0b21EZXZpY2UsIGNoYXJwLCAwNDQ0KTsKICNlbHNlCQkJCQkJCS8vIE9sZCBTdHlsZQogTU9EVUxFX1BBUkFNKGlzb2NNb2RlLCAiaSIpOwogTU9EVUxFX1BBUk0odmlkZW9fZGVidWcsICJpIik7CQkJCS8vIEdyYWIgdGhlIERlYnVnIE1vZGUgb2YgdGhlIGRldmljZSBkcml2ZXIKQEAgLTE3MSw3ICsxNzAsNiBAQAogTU9EVUxFX1BBUk0odmlkZW9fbnIsICJpIik7CQkJCS8vIHZpZGVvX25yIG9wdGlvbiBhbGxvd3MgdG8gc3BlY2lmeSBhIGNlcnRhaW4gL2Rldi92aWRlb1ggZGV2aWNlIChsaWtlIC9kZXYvdmlkZW8wIG9yIC9kZXYvdmlkZW8xIC4uLikKIE1PRFVMRV9QQVJNKHJhZGlvX25yLCAiaSIpOwkJCQkvLyByYWRpb19uciBvcHRpb24gYWxsb3dzIHRvIHNwZWNpZnkgYSBjZXJ0YWluIC9kZXYvcmFkaW9YIGRldmljZSAobGlrZSAvZGV2L3JhZGlvMCBvciAvZGV2L3JhZGlvMSAuLi4pCiBNT0RVTEVfUEFSTSh2YmlfbnIsICJpIik7CQkJCS8vIHZiaV9uciBvcHRpb24gYWxsb3dzIHRvIHNwZWNpZnkgYSBjZXJ0YWluIC9kZXYvdmJpWCBkZXZpY2UgKGxpa2UgL2Rldi92YmkwIG9yIC9kZXYvdmJpMSAuLi4pCi1NT0RVTEVfUEFSTShDdXN0b21EZXZpY2UsICJzIik7CQkJCS8vIC4uLi4gQ3VzdG9tRGV2aWNlCiAjZW5kaWYKIAogTU9EVUxFX1BBUk1fREVTQyhpc29jTW9kZSwgIiBTZXQgdGhlIGRlZmF1bHQgZm9ybWF0IGZvciBJU09DIGVuZHBvaW50LiAgRGVmYXVsdDogMHg2MCAoQ29tcHJlc3Npb24gT24pIik7CkBAIC0xODAsNyArMTc4LDYgQEAKIE1PRFVMRV9QQVJNX0RFU0ModmlkZW9fbnIsICJTZXQgdmlkZW8gZGV2aWNlIG51bWJlciAoL2Rldi92aWRlb1gpLiAgRGVmYXVsdDogLTEgKGF1dG9kZXRlY3QpIik7CiBNT0RVTEVfUEFSTV9ERVNDKHJhZGlvX25yLCAiU2V0IHJhZGlvIGRldmljZSBudW1iZXIgKC9kZXYvcmFkaW9YKS4gIERlZmF1bHQ6IC0xIChhdXRvZGV0ZWN0KSIpOwogTU9EVUxFX1BBUk1fREVTQyh2YmlfbnIsICJTZXQgdmJpIGRldmljZSBudW1iZXIgKC9kZXYvdmJpWCkuICBEZWZhdWx0OiAtMSAoYXV0b2RldGVjdCkiKTsKLU1PRFVMRV9QQVJNX0RFU0MoQ3VzdG9tRGV2aWNlLCAiIERlZmluZSB0aGUgZmluZSB0dW5pbmcgcGFyYW1ldGVycyBmb3IgdGhlIGRldmljZS4gIERlZmF1bHQ6IG51bGwiKTsKIAogCiAvLyBNaXNjIHN0dWZmCkBAIC00MDksNyArNDA2LDcgQEAKIAkJZG93bigmdXNidmlzaW9uLT5sb2NrKTsKIAkJaWYgKHVzYnZpc2lvbi0+cG93ZXIgPT0gMCkgewogCQkJdXNidmlzaW9uX3Bvd2VyX29uKHVzYnZpc2lvbik7Ci0JCQl1c2J2aXNpb25faW5pdF9pMmModXNidmlzaW9uKTsKKwkJCXVzYnZpc2lvbl9pMmNfcmVnaXN0ZXIodXNidmlzaW9uKTsKIAkJfQogCiAJCS8qIFNlbmQgaW5pdCBzZXF1ZW5jZSBvbmx5IG9uY2UsIGl0J3MgbGFyZ2UhICovCkBAIC00MzEsNyArNDI4LDcgQEAKIAkJfQogCQllbHNlIHsKIAkJCWlmIChQb3dlck9uQXRPcGVuKSB7Ci0JCQkJdXNidmlzaW9uX2kyY191c2JfZGVsX2J1cygmdXNidmlzaW9uLT5pMmNfYWRhcCk7CisJCQkJdXNidmlzaW9uX2kyY191bnJlZ2lzdGVyKHVzYnZpc2lvbik7CiAJCQkJdXNidmlzaW9uX3Bvd2VyX29mZih1c2J2aXNpb24pOwogCQkJCXVzYnZpc2lvbi0+aW5pdGlhbGl6ZWQgPSAwOwogCQkJfQpAQCAtMTIzOSw3ICsxMjM2LDcgQEAKIAkJCXVzYnZpc2lvbl9yZXNldF9wb3dlck9mZlRpbWVyKHVzYnZpc2lvbik7CiAJCQlpZiAodXNidmlzaW9uLT5wb3dlciA9PSAwKSB7CiAJCQkJdXNidmlzaW9uX3Bvd2VyX29uKHVzYnZpc2lvbik7Ci0JCQkJdXNidmlzaW9uX2luaXRfaTJjKHVzYnZpc2lvbik7CisJCQkJdXNidmlzaW9uX2kyY19yZWdpc3Rlcih1c2J2aXNpb24pOwogCQkJfQogCQl9CiAKQEAgLTEyNjEsNyArMTI1OCw3IEBACiAKIAlpZiAoZXJyQ29kZSkgewogCQlpZiAoUG93ZXJPbkF0T3BlbikgewotCQkJdXNidmlzaW9uX2kyY191c2JfZGVsX2J1cygmdXNidmlzaW9uLT5pMmNfYWRhcCk7CisJCQl1c2J2aXNpb25faTJjX3VucmVnaXN0ZXIodXNidmlzaW9uKTsKIAkJCXVzYnZpc2lvbl9wb3dlcl9vZmYodXNidmlzaW9uKTsKIAkJCXVzYnZpc2lvbi0+aW5pdGlhbGl6ZWQgPSAwOwogCQl9CkBAIC0xNzQ0LDggKzE3NDEsOCBAQAogCW1vZGVsID0gdXNidmlzaW9uLT5EZXZNb2RlbDsKIAl1c2J2aXNpb24tPnBhbGV0dGUgPSB1c2J2aXNpb25fdjRsMl9mb3JtYXRbMl07IC8vIFY0TDJfUElYX0ZNVF9SR0IyNDsKIAotCWlmICh1c2J2aXNpb25fZGV2aWNlX2RhdGFbdXNidmlzaW9uLT5EZXZNb2RlbF0uVmluX1JlZzIgPj0gMCkgewotCQl1c2J2aXNpb24tPlZpbl9SZWcyX1ByZXNldCA9IHVzYnZpc2lvbl9kZXZpY2VfZGF0YVt1c2J2aXNpb24tPkRldk1vZGVsXS5WaW5fUmVnMiAmIDB4ZmY7CisJaWYgKHVzYnZpc2lvbl9kZXZpY2VfZGF0YVt1c2J2aXNpb24tPkRldk1vZGVsXS5WaW5fUmVnMl9vdmVycmlkZSkgeworCQl1c2J2aXNpb24tPlZpbl9SZWcyX1ByZXNldCA9IHVzYnZpc2lvbl9kZXZpY2VfZGF0YVt1c2J2aXNpb24tPkRldk1vZGVsXS5WaW5fUmVnMjsKIAl9IGVsc2UgewogCQl1c2J2aXNpb24tPlZpbl9SZWcyX1ByZXNldCA9IDA7CiAJfQpAQCAtMTc2NCw3ICsxNzYxLDcgQEAKIAl1c2J2aXNpb25fYXVkaW9fb2ZmKHVzYnZpc2lvbik7CS8vZmlyc3Qgc3dpdGNoIG9mZiBhdWRpbwogCWlmICghUG93ZXJPbkF0T3BlbikgewogCQl1c2J2aXNpb25fcG93ZXJfb24odXNidmlzaW9uKTsJLy9hbmQgdGhlbiBwb3dlciB1cCB0aGUgbm9pc3kgdHVuZXIKLQkJdXNidmlzaW9uX2luaXRfaTJjKHVzYnZpc2lvbik7CisJCXVzYnZpc2lvbl9pMmNfcmVnaXN0ZXIodXNidmlzaW9uKTsKIAl9CiB9CiAKQEAgLTE3NzUsNyArMTc3Miw4IEBACiAgKiBpZiBpdCBsb29rcyBsaWtlIFVTQlZJU0lPTiB2aWRlbyBkZXZpY2UKICAqCiAgKi8KLXN0YXRpYyBpbnQgX19kZXZpbml0IHVzYnZpc2lvbl9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmRldmlkKQorc3RhdGljIGludCBfX2RldmluaXQgdXNidmlzaW9uX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLAorCQkJCSAgICAgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmRldmlkKQogewogCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYgPSB1c2JfZ2V0X2RldihpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpKTsKIAlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqdWlmOwpAQCAtMTc4NiwyNSArMTc4NCwxNyBAQAogCWludCBtb2RlbCxpOwogCiAJUERFQlVHKERCR19QUk9CRSwgIlZJRD0lIzA0eCwgUElEPSUjMDR4LCBpZm51bT0ldSIsCi0JCQkJCWRldi0+ZGVzY3JpcHRvci5pZFZlbmRvciwgZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCwgaWZudW0pOworCQkJCWRldi0+ZGVzY3JpcHRvci5pZFZlbmRvciwKKwkJCQlkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0LCBpZm51bSk7CiAKLQkvKiBJcyBpdCBhbiBVU0JWSVNJT04gdmlkZW8gZGV2PyAqLwotCW1vZGVsID0gMDsKLQlmb3IobW9kZWwgPSAwOyB1c2J2aXNpb25fZGV2aWNlX2RhdGFbbW9kZWxdLmlkVmVuZG9yOyBtb2RlbCsrKSB7Ci0JCWlmIChsZTE2X3RvX2NwdShkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IpICE9IHVzYnZpc2lvbl9kZXZpY2VfZGF0YVttb2RlbF0uaWRWZW5kb3IpIHsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmIChsZTE2X3RvX2NwdShkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KSAhPSB1c2J2aXNpb25fZGV2aWNlX2RhdGFbbW9kZWxdLmlkUHJvZHVjdCkgewotCQkJY29udGludWU7Ci0JCX0KLQotCQlwcmludGsoS0VSTl9JTkZPICIlczogJXMgZm91bmRcbiIsIF9fRlVOQ1RJT05fXywgdXNidmlzaW9uX2RldmljZV9kYXRhW21vZGVsXS5Nb2RlbFN0cmluZyk7Ci0JCWJyZWFrOworCW1vZGVsID0gZGV2aWQtPmRyaXZlcl9pbmZvOworCWlmICggKG1vZGVsPDApIHx8IChtb2RlbD49dXNidmlzaW9uX2RldmljZV9kYXRhX3NpemUpICkgeworCQlQREVCVUcoREJHX1BST0JFLCAibW9kZWwgb3V0IG9mIGJvdW5kcyAlZCIsbW9kZWwpOworCQlyZXR1cm4gLUVOT0RFVjsKIAl9CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzIGZvdW5kXG4iLCBfX0ZVTkNUSU9OX18sCisJCQkJdXNidmlzaW9uX2RldmljZV9kYXRhW21vZGVsXS5Nb2RlbFN0cmluZyk7CiAKLQlpZiAodXNidmlzaW9uX2RldmljZV9kYXRhW21vZGVsXS5pZFZlbmRvciA9PSAwKSB7Ci0JCXJldHVybiAtRU5PREVWOyAvL25vIG1hdGNoaW5nIGRldmljZQotCX0KIAlpZiAodXNidmlzaW9uX2RldmljZV9kYXRhW21vZGVsXS5JbnRlcmZhY2UgPj0gMCkgewogCQlpbnRlcmZhY2UgPSAmZGV2LT5hY3Rjb25maWctPmludGVyZmFjZVt1c2J2aXNpb25fZGV2aWNlX2RhdGFbbW9kZWxdLkludGVyZmFjZV0tPmFsdHNldHRpbmdbMF07CiAJfQpAQCAtMTgyMiwxNiArMTgxMiwxNSBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQl1c2JfZ2V0X2RldihkZXYpOwotCiAJaWYgKCh1c2J2aXNpb24gPSB1c2J2aXNpb25fYWxsb2MoZGV2KSkgPT0gTlVMTCkgewogCQllcnIoIiVzOiBjb3VsZG4ndCBhbGxvY2F0ZSBVU0JWaXNpb24gc3RydWN0IiwgX19GVU5DVElPTl9fKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQorCiAJaWYgKGRldi0+ZGVzY3JpcHRvci5iTnVtQ29uZmlndXJhdGlvbnMgPiAxKSB7CiAJCXVzYnZpc2lvbi0+YnJpZGdlVHlwZSA9IEJSSURHRV9OVDEwMDQ7CiAJfQotCWVsc2UgaWYgKHVzYnZpc2lvbl9kZXZpY2VfZGF0YVttb2RlbF0uTW9kZWxTdHJpbmcgPT0gIkRhenpsZSBGdXNpb24gTW9kZWwgRFZDLTkwIFJldiAxIChTRUNBTSkiKSB7CisJZWxzZSBpZiAobW9kZWwgPT0gREFaWkxFX0RWQ185MF9SRVZfMV9TRUNBTSkgewogCQl1c2J2aXNpb24tPmJyaWRnZVR5cGUgPSBCUklER0VfTlQxMDA1OwogCX0KIAllbHNlIHsKQEAgLTE5MjAsNyArMTkwOSw3IEBACiAJdXNidmlzaW9uX3N0b3BfaXNvYyh1c2J2aXNpb24pOwogCiAJaWYgKHVzYnZpc2lvbi0+cG93ZXIpIHsKLQkJdXNidmlzaW9uX2kyY191c2JfZGVsX2J1cygmdXNidmlzaW9uLT5pMmNfYWRhcCk7CisJCXVzYnZpc2lvbl9pMmNfdW5yZWdpc3Rlcih1c2J2aXNpb24pOwogCQl1c2J2aXNpb25fcG93ZXJfb2ZmKHVzYnZpc2lvbik7CiAJfQogCXVzYnZpc2lvbi0+cmVtb3ZlX3BlbmRpbmcgPSAxOwkvLyBOb3cgYWxsIElTTyBkYXRhIHdpbGwgYmUgaWdub3JlZApAQCAtMTk1MSwxMjQgKzE5NDAsNiBAQAogfTsKIAogLyoKLSAqIGN1c3RvbWRldmljZV9wcm9jZXNzKCkKLSAqCi0gKiBUaGlzIHByb2NlZHVyZSBwcmVwcm9jZXNzZXMgQ3VzdG9tRGV2aWNlIHBhcmFtZXRlciBpZiBhbnkKLSAqCi0gKi8KLXN0YXRpYyB2b2lkIGN1c3RvbWRldmljZV9wcm9jZXNzKHZvaWQpCi17Ci0JdXNidmlzaW9uX2RldmljZV9kYXRhWzBdPXVzYnZpc2lvbl9kZXZpY2VfZGF0YVsxXTsKLQl1c2J2aXNpb25fdGFibGVbMF09dXNidmlzaW9uX3RhYmxlWzFdOwotCi0JaWYoQ3VzdG9tRGV2aWNlKQotCXsKLQkJY2hhciAqcGFyc2U9Q3VzdG9tRGV2aWNlOwotCi0JCVBERUJVRyhEQkdfUFJPQkUsICJDdXN0b21EZXZpZGU9JXMiLCBDdXN0b21EZXZpY2UpOwotCi0JCS8qZm9ybWF0IGlzIEN1c3RvbURldmljZT0iMHgwNTczIDB4NEQzMSAwIDcxMTMgMyBQQUwgMSAxIDEgNSAtMSAtMSAtMSAtMSAtMSIKLQkJdXNidmlzaW9uX2RldmljZV9kYXRhWzBdLmlkVmVuZG9yOwotCQl1c2J2aXNpb25fZGV2aWNlX2RhdGFbMF0uaWRQcm9kdWN0OwotCQl1c2J2aXNpb25fZGV2aWNlX2RhdGFbMF0uSW50ZXJmYWNlOwotCQl1c2J2aXNpb25fZGV2aWNlX2RhdGFbMF0uQ29kZWM7Ci0JCXVzYnZpc2lvbl9kZXZpY2VfZGF0YVswXS5WaWRlb0NoYW5uZWxzOwotCQl1c2J2aXNpb25fZGV2aWNlX2RhdGFbMF0uVmlkZW9Ob3JtOwotCQl1c2J2aXNpb25fZGV2aWNlX2RhdGFbMF0uQXVkaW9DaGFubmVsczsKLQkJdXNidmlzaW9uX2RldmljZV9kYXRhWzBdLlJhZGlvOwotCQl1c2J2aXNpb25fZGV2aWNlX2RhdGFbMF0uVHVuZXI7Ci0JCXVzYnZpc2lvbl9kZXZpY2VfZGF0YVswXS5UdW5lclR5cGU7Ci0JCXVzYnZpc2lvbl9kZXZpY2VfZGF0YVswXS5WaW5fUmVnMTsKLQkJdXNidmlzaW9uX2RldmljZV9kYXRhWzBdLlZpbl9SZWcyOwotCQl1c2J2aXNpb25fZGV2aWNlX2RhdGFbMF0uWF9PZmZzZXQ7Ci0JCXVzYnZpc2lvbl9kZXZpY2VfZGF0YVswXS5ZX09mZnNldDsKLQkJdXNidmlzaW9uX2RldmljZV9kYXRhWzBdLkR2aV95dXY7Ci0JCXVzYnZpc2lvbl9kZXZpY2VfZGF0YVswXS5Nb2RlbFN0cmluZzsKLQkJKi8KLQotCQlybXNwYWNlKHBhcnNlKTsKLQkJdXNidmlzaW9uX2RldmljZV9kYXRhWzBdLk1vZGVsU3RyaW5nPSJVU0JWSVNJT04gQ3VzdG9tIERldmljZSI7Ci0KLQkJcGFyc2UrPTI7Ci0JCXNzY2FuZihwYXJzZSwiJXgiLCZ1c2J2aXNpb25fZGV2aWNlX2RhdGFbMF0uaWRWZW5kb3IpOwotCQlnb3RvMm5leHQocGFyc2UpOwotCQlQREVCVUcoREJHX1BST0JFLCAiaWRWZW5kb3I9MHglLjRYIiwgdXNidmlzaW9uX2RldmljZV9kYXRhWzBdLmlkVmVuZG9yKTsKLQkJcGFyc2UrPTI7Ci0JCXNzY2FuZihwYXJzZSwiJXgiLCZ1c2J2aXNpb25fZGV2aWNlX2RhdGFbMF0uaWRQcm9kdWN0KTsKLQkJZ290bzJuZXh0KHBhcnNlKTsKLQkJUERFQlVHKERCR19QUk9CRSwgImlkUHJvZHVjdD0weCUuNFgiLCB1c2J2aXNpb25fZGV2aWNlX2RhdGFbMF0uaWRQcm9kdWN0KTsKLQkJc3NjYW5mKHBhcnNlLCIlZCIsJnVzYnZpc2lvbl9kZXZpY2VfZGF0YVswXS5JbnRlcmZhY2UpOwotCQlnb3RvMm5leHQocGFyc2UpOwotCQlQREVCVUcoREJHX1BST0JFLCAiSW50ZXJmYWNlPSVkIiwgdXNidmlzaW9uX2RldmljZV9kYXRhWzBdLkludGVyZmFjZSk7Ci0JCXNzY2FuZihwYXJzZSwiJWQiLCZ1c2J2aXNpb25fZGV2aWNlX2RhdGFbMF0uQ29kZWMpOwotCQlnb3RvMm5leHQocGFyc2UpOwotCQlQREVCVUcoREJHX1BST0JFLCAiQ29kZWM9JWQiLCB1c2J2aXNpb25fZGV2aWNlX2RhdGFbMF0uQ29kZWMpOwotCQlzc2NhbmYocGFyc2UsIiVkIiwmdXNidmlzaW9uX2RldmljZV9kYXRhWzBdLlZpZGVvQ2hhbm5lbHMpOwotCQlnb3RvMm5leHQocGFyc2UpOwotCQlQREVCVUcoREJHX1BST0JFLCAiVmlkZW9DaGFubmVscz0lZCIsIHVzYnZpc2lvbl9kZXZpY2VfZGF0YVswXS5WaWRlb0NoYW5uZWxzKTsKLQotCQlzd2l0Y2goKnBhcnNlKQotCQl7Ci0JCQljYXNlICdQJzoKLQkJCQlQREVCVUcoREJHX1BST0JFLCAiVmlkZW9Ob3JtPVBBTCIpOwotCQkJCXVzYnZpc2lvbl9kZXZpY2VfZGF0YVswXS5WaWRlb05vcm09VjRMMl9TVERfUEFMOwotCQkJCWJyZWFrOwotCi0JCQljYXNlICdTJzoKLQkJCQlQREVCVUcoREJHX1BST0JFLCAiVmlkZW9Ob3JtPVNFQ0FNIik7Ci0JCQkJdXNidmlzaW9uX2RldmljZV9kYXRhWzBdLlZpZGVvTm9ybT1WNEwyX1NURF9TRUNBTTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSAnTic6Ci0JCQkJUERFQlVHKERCR19QUk9CRSwgIlZpZGVvTm9ybT1OVFNDIik7Ci0JCQkJdXNidmlzaW9uX2RldmljZV9kYXRhWzBdLlZpZGVvTm9ybT1WNEwyX1NURF9OVFNDOwotCQkJCWJyZWFrOwotCi0JCQlkZWZhdWx0OgotCQkJCVBERUJVRyhEQkdfUFJPQkUsICJWaWRlb05vcm09UEFMIChieSBkZWZhdWx0KSIpOwotCQkJCXVzYnZpc2lvbl9kZXZpY2VfZGF0YVswXS5WaWRlb05vcm09VjRMMl9TVERfUEFMOwotCQkJCWJyZWFrOwotCQl9Ci0JCWdvdG8ybmV4dChwYXJzZSk7Ci0KLQkJc3NjYW5mKHBhcnNlLCIlZCIsJnVzYnZpc2lvbl9kZXZpY2VfZGF0YVswXS5BdWRpb0NoYW5uZWxzKTsKLQkJZ290bzJuZXh0KHBhcnNlKTsKLQkJUERFQlVHKERCR19QUk9CRSwgIkF1ZGlvQ2hhbm5lbHM9JWQiLCB1c2J2aXNpb25fZGV2aWNlX2RhdGFbMF0uQXVkaW9DaGFubmVscyk7Ci0JCXNzY2FuZihwYXJzZSwiJWQiLCZ1c2J2aXNpb25fZGV2aWNlX2RhdGFbMF0uUmFkaW8pOwotCQlnb3RvMm5leHQocGFyc2UpOwotCQlQREVCVUcoREJHX1BST0JFLCAiUmFkaW89JWQiLCB1c2J2aXNpb25fZGV2aWNlX2RhdGFbMF0uUmFkaW8pOwotCQlzc2NhbmYocGFyc2UsIiVkIiwmdXNidmlzaW9uX2RldmljZV9kYXRhWzBdLlR1bmVyKTsKLQkJZ290bzJuZXh0KHBhcnNlKTsKLQkJUERFQlVHKERCR19QUk9CRSwgIlR1bmVyPSVkIiwgdXNidmlzaW9uX2RldmljZV9kYXRhWzBdLlR1bmVyKTsKLQkJc3NjYW5mKHBhcnNlLCIlZCIsJnVzYnZpc2lvbl9kZXZpY2VfZGF0YVswXS5UdW5lclR5cGUpOwotCQlnb3RvMm5leHQocGFyc2UpOwotCQlQREVCVUcoREJHX1BST0JFLCAiVHVuZXJUeXBlPSVkIiwgdXNidmlzaW9uX2RldmljZV9kYXRhWzBdLlR1bmVyVHlwZSk7Ci0JCXNzY2FuZihwYXJzZSwiJWQiLCZ1c2J2aXNpb25fZGV2aWNlX2RhdGFbMF0uVmluX1JlZzEpOwotCQlnb3RvMm5leHQocGFyc2UpOwotCQlQREVCVUcoREJHX1BST0JFLCAiVmluX1JlZzE9JWQiLCB1c2J2aXNpb25fZGV2aWNlX2RhdGFbMF0uVmluX1JlZzEpOwotCQlzc2NhbmYocGFyc2UsIiVkIiwmdXNidmlzaW9uX2RldmljZV9kYXRhWzBdLlZpbl9SZWcyKTsKLQkJZ290bzJuZXh0KHBhcnNlKTsKLQkJUERFQlVHKERCR19QUk9CRSwgIlZpbl9SZWcyPSVkIiwgdXNidmlzaW9uX2RldmljZV9kYXRhWzBdLlZpbl9SZWcyKTsKLQkJc3NjYW5mKHBhcnNlLCIlZCIsJnVzYnZpc2lvbl9kZXZpY2VfZGF0YVswXS5YX09mZnNldCk7Ci0JCWdvdG8ybmV4dChwYXJzZSk7Ci0JCVBERUJVRyhEQkdfUFJPQkUsICJYX09mZnNldD0lZCIsIHVzYnZpc2lvbl9kZXZpY2VfZGF0YVswXS5YX09mZnNldCk7Ci0JCXNzY2FuZihwYXJzZSwiJWQiLCZ1c2J2aXNpb25fZGV2aWNlX2RhdGFbMF0uWV9PZmZzZXQpOwotCQlnb3RvMm5leHQocGFyc2UpOwotCQlQREVCVUcoREJHX1BST0JFLCAiWV9PZmZzZXQ9JWQiLCB1c2J2aXNpb25fZGV2aWNlX2RhdGFbMF0uWV9PZmZzZXQpOwotCQlzc2NhbmYocGFyc2UsIiVkIiwmdXNidmlzaW9uX2RldmljZV9kYXRhWzBdLkR2aV95dXYpOwotCQlQREVCVUcoREJHX1BST0JFLCAiRHZpX3l1dj0lZCIsIHVzYnZpc2lvbl9kZXZpY2VfZGF0YVswXS5EdmlfeXV2KTsKLQotCQkvL2FkZCB0byB1c2J2aXNpb25fdGFibGUgYWxzbwotCQl1c2J2aXNpb25fdGFibGVbMF0ubWF0Y2hfZmxhZ3M9VVNCX0RFVklDRV9JRF9NQVRDSF9ERVZJQ0U7Ci0JCXVzYnZpc2lvbl90YWJsZVswXS5pZFZlbmRvcj11c2J2aXNpb25fZGV2aWNlX2RhdGFbMF0uaWRWZW5kb3I7Ci0JCXVzYnZpc2lvbl90YWJsZVswXS5pZFByb2R1Y3Q9dXNidmlzaW9uX2RldmljZV9kYXRhWzBdLmlkUHJvZHVjdDsKLQotCX0KLX0KLQotCi0KLS8qCiAgKiB1c2J2aXNpb25faW5pdCgpCiAgKgogICogVGhpcyBjb2RlIGlzIHJ1biB0byBpbml0aWFsaXplIHRoZSBkcml2ZXIuCkBAIC0yMDkyLDggKzE5NjMsNiBAQAogCQl1c2J2aXNpb25fdjRsMl9mb3JtYXRbN10uc3VwcG9ydGVkID0gMDsgLy8gVjRMMl9QSVhfRk1UX1lVVjQyMlAKIAl9CiAKLQljdXN0b21kZXZpY2VfcHJvY2VzcygpOwotCiAJZXJyQ29kZSA9IHVzYl9yZWdpc3RlcigmdXNidmlzaW9uX2RyaXZlcik7CiAKIAlpZiAoZXJyQ29kZSA9PSAwKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpc2lvbi91c2J2aXNpb24uaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlzaW9uL3VzYnZpc2lvbi5oCmluZGV4IGFkNmFmZDMuLmJkNmY2NDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlzaW9uL3VzYnZpc2lvbi5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlzaW9uL3VzYnZpc2lvbi5oCkBAIC0zNDIsMjMgKzM0MiwyNCBAQAogI2RlZmluZSBCUklER0VfTlQxMDA1ICAgMTAwNQogCiBzdHJ1Y3QgdXNidmlzaW9uX2RldmljZV9kYXRhX3N0IHsKLQlpbnQgaWRWZW5kb3I7Ci0JaW50IGlkUHJvZHVjdDsKLQlpbnQgSW50ZXJmYWNlOyAvKiB0byBoYW5kbGUgc3BlY2lhbCBpbnRlcmZhY2UgbnVtYmVyIGxpa2UgQkVMS0lOIGFuZCBIYXVwcGF1Z2UgV2luVFYtVVNCIElJICovCi0JaW50IENvZGVjOwotCWludCBWaWRlb0NoYW5uZWxzOwogCV9fdTY0IFZpZGVvTm9ybTsKLQlpbnQgQXVkaW9DaGFubmVsczsKLQlpbnQgUmFkaW87Ci0JaW50IHZiaTsKLQlpbnQgVHVuZXI7Ci0JaW50IFR1bmVyVHlwZTsKLQlpbnQgVmluX1JlZzE7Ci0JaW50IFZpbl9SZWcyOwotCWludCBYX09mZnNldDsKLQlpbnQgWV9PZmZzZXQ7Ci0JaW50IER2aV95dXY7Ci0JY2hhciAqTW9kZWxTdHJpbmc7CisJY29uc3QgY2hhciAqTW9kZWxTdHJpbmc7CisJaW50IEludGVyZmFjZTsgLyogdG8gaGFuZGxlIHNwZWNpYWwgaW50ZXJmYWNlIG51bWJlciBsaWtlIEJFTEtJTiBhbmQgSGF1cHBhdWdlIFdpblRWLVVTQiBJSSAqLworCV9fdTE2IENvZGVjOworCXVuc2lnbmVkIFZpZGVvQ2hhbm5lbHM6MzsKKwl1bnNpZ25lZCBBdWRpb0NoYW5uZWxzOjI7CisJdW5zaWduZWQgUmFkaW86MTsKKwl1bnNpZ25lZCB2Ymk6MTsKKwl1bnNpZ25lZCBUdW5lcjoxOworCXVuc2lnbmVkIFZpbl9SZWcxX292ZXJyaWRlOjE7CS8qIE92ZXJyaWRlIGRlZmF1bHQgdmFsdWUgd2l0aCAqLworCXVuc2lnbmVkIFZpbl9SZWcyX292ZXJyaWRlOjE7ICAgLyogVmluX1JlZzEsIFZpbl9SZWcyLCBldGMuICovCisJdW5zaWduZWQgRHZpX3l1dl9vdmVycmlkZToxOworCV9fdTggVmluX1JlZzE7CisJX191OCBWaW5fUmVnMjsKKwlfX3U4IER2aV95dXY7CisJX191OCBUdW5lclR5cGU7CisJX19zMTYgWF9PZmZzZXQ7CisJX19zMTYgWV9PZmZzZXQ7CiB9OwogCiAvKiBEZWNsYXJlZCBvbiB1c2J2aXNpb24tY2FyZHMuYyAqLwpAQCAtNDgxLDEzICs0ODIsMTEgQEAKIC8qIGkyYy1hbGdvLXVzYiBkZWNsYXJhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLWludCB1c2J2aXNpb25faTJjX3VzYl9kZWxfYnVzKHN0cnVjdCBpMmNfYWRhcHRlciAqKTsKLQotCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogLyogdXNidmlzaW9uIHNwZWNpZmljIEkyQyBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1pbnQgdXNidmlzaW9uX2luaXRfaTJjKHN0cnVjdCB1c2JfdXNidmlzaW9uICp1c2J2aXNpb24pOworaW50IHVzYnZpc2lvbl9pMmNfcmVnaXN0ZXIoc3RydWN0IHVzYl91c2J2aXNpb24gKnVzYnZpc2lvbik7CitpbnQgdXNidmlzaW9uX2kyY191bnJlZ2lzdGVyKHN0cnVjdCB1c2JfdXNidmlzaW9uICp1c2J2aXNpb24pOwogdm9pZCBjYWxsX2kyY19jbGllbnRzKHN0cnVjdCB1c2JfdXNidmlzaW9uICp1c2J2aXNpb24sIHVuc2lnbmVkIGludCBjbWQsdm9pZCAqYXJnKTsKIAogLyogZGVmaW5lZCBpbiB1c2J2aXNpb24tY29yZS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby92NGwyLWNvbW1vbi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby92NGwyLWNvbW1vbi5jCmluZGV4IDU0NzQ3NjAuLjQ5ZjFkZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1jb21tb24uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItY29tbW9uLmMKQEAgLTYwLDYgKzYwLDcgQEAKICNpbmNsdWRlIDxsaW51eC92aWRlb19kZWNvZGVyLmg+CiAjZGVmaW5lIF9fT0xEX1ZJRElPQ18gLyogVG8gYWxsb3cgZml4aW5nIG9sZCBjYWxscyovCiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNoaXAtaWRlbnQuaD4KIAogI2lmZGVmIENPTkZJR19LTU9ECiAjaW5jbHVkZSA8bGludXgva21vZC5oPgpAQCAtMjYwLDYgKzI2MSw4IEBACiAJW1Y0TDJfRklFTERfU0VRX1RCXSAgICAgPSAic2VxLXRiIiwKIAlbVjRMMl9GSUVMRF9TRVFfQlRdICAgICA9ICJzZXEtYnQiLAogCVtWNEwyX0ZJRUxEX0FMVEVSTkFURV0gID0gImFsdGVybmF0ZSIsCisJW1Y0TDJfRklFTERfSU5URVJMQUNFRF9UQl0gPSAiaW50ZXJsYWNlZC10YiIsCisJW1Y0TDJfRklFTERfSU5URVJMQUNFRF9CVF0gPSAiaW50ZXJsYWNlZC1idCIsCiB9OwogCiBjaGFyICp2NGwyX3R5cGVfbmFtZXNbXSA9IHsKQEAgLTI2OSw3ICsyNzIsOCBAQAogCVtWNEwyX0JVRl9UWVBFX1ZCSV9DQVBUVVJFXSAgICAgICAgPSAidmJpLWNhcCIsCiAJW1Y0TDJfQlVGX1RZUEVfVkJJX09VVFBVVF0gICAgICAgICA9ICJ2Ymktb3V0IiwKIAlbVjRMMl9CVUZfVFlQRV9TTElDRURfVkJJX0NBUFRVUkVdID0gInNsaWNlZC12YmktY2FwIiwKLQlbVjRMMl9CVUZfVFlQRV9TTElDRURfVkJJX09VVFBVVF0gID0gInNsaWNlYy12Ymktb3V0IiwKKwlbVjRMMl9CVUZfVFlQRV9TTElDRURfVkJJX09VVFBVVF0gID0gInNsaWNlZC12Ymktb3V0IiwKKwlbVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfT1ZFUkxBWV0gPSAidmlkZW8tb3V0LW92ZXIiLAogfTsKIAogCkBAIC0zODAsNiArMzg0LDggQEAKIAogCVtfSU9DX05SKFZJRElPQ19EQkdfU19SRUdJU1RFUildICAgPSAiVklESU9DX0RCR19TX1JFR0lTVEVSIiwKIAlbX0lPQ19OUihWSURJT0NfREJHX0dfUkVHSVNURVIpXSAgID0gIlZJRElPQ19EQkdfR19SRUdJU1RFUiIsCisKKwlbX0lPQ19OUihWSURJT0NfR19DSElQX0lERU5UKV0gICAgID0gIlZJRElPQ19HX0NISVBfSURFTlQiLAogI2VuZGlmCiB9OwogI2RlZmluZSBWNEwyX0lPQ1RMUyBBUlJBWV9TSVpFKHY0bDJfaW9jdGxzKQpAQCAtNDEwLDE0ICs0MTYsMTYgQEAKIAlbX0lPQ19OUihWSURJT0NfSU5UX0RFQ09ERV9WQklfTElORSldICA9ICJWSURJT0NfSU5UX0RFQ09ERV9WQklfTElORSIsCiAJW19JT0NfTlIoVklESU9DX0lOVF9TX1ZCSV9EQVRBKV0gICAgICAgPSAiVklESU9DX0lOVF9TX1ZCSV9EQVRBIiwKIAlbX0lPQ19OUihWSURJT0NfSU5UX0dfVkJJX0RBVEEpXSAgICAgICA9ICJWSURJT0NfSU5UX0dfVkJJX0RBVEEiLAotCVtfSU9DX05SKFZJRElPQ19JTlRfR19DSElQX0lERU5UKV0gICAgID0gIlZJRElPQ19JTlRfR19DSElQX0lERU5UIiwKIAlbX0lPQ19OUihWSURJT0NfSU5UX0kyU19DTE9DS19GUkVRKV0gICA9ICJWSURJT0NfSU5UX0kyU19DTE9DS19GUkVRIiwKIAlbX0lPQ19OUihWSURJT0NfSU5UX1NfU1RBTkRCWSldICAgICAgICA9ICJWSURJT0NfSU5UX1NfU1RBTkRCWSIsCiAJW19JT0NfTlIoVklESU9DX0lOVF9TX0FVRElPX1JPVVRJTkcpXSAgPSAiVklESU9DX0lOVF9TX0FVRElPX1JPVVRJTkciLAogCVtfSU9DX05SKFZJRElPQ19JTlRfR19BVURJT19ST1VUSU5HKV0gID0gIlZJRElPQ19JTlRfR19BVURJT19ST1VUSU5HIiwKIAlbX0lPQ19OUihWSURJT0NfSU5UX1NfVklERU9fUk9VVElORyldICA9ICJWSURJT0NfSU5UX1NfVklERU9fUk9VVElORyIsCiAJW19JT0NfTlIoVklESU9DX0lOVF9HX1ZJREVPX1JPVVRJTkcpXSAgPSAiVklESU9DX0lOVF9HX1ZJREVPX1JPVVRJTkciLAotCVtfSU9DX05SKFZJRElPQ19JTlRfU19DUllTVEFMX0ZSRVEpXSAgID0gIlZJRElPQ19JTlRfU19DUllTVEFMX0ZSRVEiCisJW19JT0NfTlIoVklESU9DX0lOVF9TX0NSWVNUQUxfRlJFUSldICAgPSAiVklESU9DX0lOVF9TX0NSWVNUQUxfRlJFUSIsCisJW19JT0NfTlIoVklESU9DX0lOVF9JTklUKV0gICAJICAgICAgID0gIlZJRElPQ19JTlRfSU5JVCIsCisJW19JT0NfTlIoVklESU9DX0lOVF9HX1NURF9PVVRQVVQpXSAgICAgPSAiVklESU9DX0lOVF9HX1NURF9PVVRQVVQiLAorCVtfSU9DX05SKFZJRElPQ19JTlRfU19TVERfT1VUUFVUKV0gICAgID0gIlZJRElPQ19JTlRfU19TVERfT1VUUFVUIiwKIH07CiAjZGVmaW5lIFY0TDJfSU5UX0lPQ1RMUyBBUlJBWV9TSVpFKHY0bDJfaW50X2lvY3RscykKIApAQCAtNjgwLDYgKzY4OCw3IEBACiAJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX01PREVfRVhURU5TSU9OOiBuYW1lID0gIkF1ZGlvIFN0ZXJlbyBNb2RlIEV4dGVuc2lvbiI7IGJyZWFrOwogCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19FTVBIQVNJUzogCW5hbWUgPSAiQXVkaW8gRW1waGFzaXMiOyBicmVhazsKIAljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fQ1JDOiAJCW5hbWUgPSAiQXVkaW8gQ1JDIjsgYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX01VVEU6IAkJbmFtZSA9ICJBdWRpbyBNdXRlIjsgYnJlYWs7CiAJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0VOQ09ESU5HOiAJbmFtZSA9ICJWaWRlbyBFbmNvZGluZyI7IGJyZWFrOwogCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19BU1BFQ1Q6IAluYW1lID0gIlZpZGVvIEFzcGVjdCI7IGJyZWFrOwogCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19CX0ZSQU1FUzogCW5hbWUgPSAiVmlkZW8gQiBGcmFtZXMiOyBicmVhazsKQEAgLTY5MCw2ICs2OTksOCBAQAogCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19CSVRSQVRFOiAJbmFtZSA9ICJWaWRlbyBCaXRyYXRlIjsgYnJlYWs7CiAJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0JJVFJBVEVfUEVBSzogCW5hbWUgPSAiVmlkZW8gUGVhayBCaXRyYXRlIjsgYnJlYWs7CiAJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX1RFTVBPUkFMX0RFQ0lNQVRJT046IG5hbWUgPSAiVmlkZW8gVGVtcG9yYWwgRGVjaW1hdGlvbiI7IGJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19NVVRFOiAJCW5hbWUgPSAiVmlkZW8gTXV0ZSI7IGJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19NVVRFX1lVVjoJbmFtZSA9ICJWaWRlbyBNdXRlIFlVViI7IGJyZWFrOwogCWNhc2UgVjRMMl9DSURfTVBFR19TVFJFQU1fVFlQRTogCW5hbWUgPSAiU3RyZWFtIFR5cGUiOyBicmVhazsKIAljYXNlIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1BJRF9QTVQ6IAluYW1lID0gIlN0cmVhbSBQTVQgUHJvZ3JhbSBJRCI7IGJyZWFrOwogCWNhc2UgVjRMMl9DSURfTVBFR19TVFJFQU1fUElEX0FVRElPOiAJbmFtZSA9ICJTdHJlYW0gQXVkaW8gUHJvZ3JhbSBJRCI7IGJyZWFrOwpAQCAtNzA1LDYgKzcxNiw3IEBACiAJc3dpdGNoIChxY3RybC0+aWQpIHsKIAljYXNlIFY0TDJfQ0lEX0FVRElPX01VVEU6CiAJY2FzZSBWNEwyX0NJRF9BVURJT19MT1VETkVTUzoKKwljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fTVVURToKIAljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fR09QX0NMT1NVUkU6CiAJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX1BVTExET1dOOgogCQlxY3RybC0+dHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU47CkBAIC04MzgsNiArODUwLDggQEAKIAkJCQlWNEwyX01QRUdfQVVESU9fQ1JDX05PTkUsCiAJCQkJVjRMMl9NUEVHX0FVRElPX0NSQ19DUkMxNiwgMSwKIAkJCQlWNEwyX01QRUdfQVVESU9fQ1JDX05PTkUpOworCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19NVVRFOgorCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsIDAsIDEsIDEsIDApOwogCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19FTkNPRElORzoKIAkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLAogCQkJCVY0TDJfTVBFR19WSURFT19FTkNPRElOR19NUEVHXzEsCkBAIC04NjcsNiArODgxLDEwIEBACiAJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChxY3RybCwgMCwgMjcwMDAwMDAsIDEsIDgwMDAwMDApOwogCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19URU1QT1JBTF9ERUNJTUFUSU9OOgogCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsIDAsIDI1NSwgMSwgMCk7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX01VVEU6CisJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChxY3RybCwgMCwgMSwgMSwgMCk7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX01VVEVfWVVWOiAgLyogSW5pdCBZVVYgKHJlYWxseSBZQ2JDcikgdG8gYmxhY2sgKi8KKwkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLCAwLCAweGZmZmZmZiwgMSwgMHgwMDgwODApOwogCWNhc2UgVjRMMl9DSURfTVBFR19TVFJFQU1fVFlQRToKIAkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLAogCQkJCVY0TDJfTVBFR19TVFJFQU1fVFlQRV9NUEVHMl9QUywKQEAgLTk2NSw2ICs5ODMsMjIgQEAKIAl9CiB9CiAKK2ludCB2NGwyX2NoaXBfaWRlbnRfaTJjX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqYywgc3RydWN0IHY0bDJfY2hpcF9pZGVudCAqY2hpcCwKKwkJdTMyIGlkZW50LCB1MzIgcmV2aXNpb24pCit7CisJaWYgKCF2NGwyX2NoaXBfbWF0Y2hfaTJjX2NsaWVudChjLCBjaGlwLT5tYXRjaF90eXBlLCBjaGlwLT5tYXRjaF9jaGlwKSkKKwkJcmV0dXJuIDA7CisJaWYgKGNoaXAtPmlkZW50ID09IFY0TDJfSURFTlRfTk9ORSkgeworCQljaGlwLT5pZGVudCA9IGlkZW50OworCQljaGlwLT5yZXZpc2lvbiA9IHJldmlzaW9uOworCX0KKwllbHNlIHsKKwkJY2hpcC0+aWRlbnQgPSBWNEwyX0lERU5UX0FNQklHVU9VUzsKKwkJY2hpcC0+cmV2aXNpb24gPSAwOworCX0KKwlyZXR1cm4gMDsKK30KKwogaW50IHY0bDJfY2hpcF9tYXRjaF9ob3N0KHUzMiBtYXRjaF90eXBlLCB1MzIgbWF0Y2hfY2hpcCkKIHsKIAlzd2l0Y2ggKG1hdGNoX3R5cGUpIHsKQEAgLTk5OSw2ICsxMDMzLDcgQEAKIEVYUE9SVF9TWU1CT0wodjRsMl9jdHJsX3F1ZXJ5X2ZpbGxfc3RkKTsKIAogRVhQT1JUX1NZTUJPTCh2NGwyX2NoaXBfbWF0Y2hfaTJjX2NsaWVudCk7CitFWFBPUlRfU1lNQk9MKHY0bDJfY2hpcF9pZGVudF9pMmNfY2xpZW50KTsKIEVYUE9SVF9TWU1CT0wodjRsMl9jaGlwX21hdGNoX2hvc3QpOwogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby92aWRlb2NvZGVjLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvY29kZWMuYwppbmRleCAyOTBlNjQxLi5mMmJiZDdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvY29kZWMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvY29kZWMuYwpAQCAtMzQ4LDYgKzM0OCw5IEBACiAJa2ZyZWUodmlkZW9jb2RlY19idWYpOwogCXZpZGVvY29kZWNfYnVmID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKIAorCWlmICghdmlkZW9jb2RlY19idWYpCisJCXJldHVybiAwOworCiAJaSA9IDA7CiAJaSArPSBzY25wcmludGYodmlkZW9jb2RlY19idWYgKyBpLCBzaXplIC0gMSwKIAkJICAgICAgIjxTPmxhdmUgb3IgYXR0YWNoZWQgPE0+YXN0ZXIgbmFtZSAgdHlwZSBmbGFncyAgICBtYWdpYyAgICAiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW9kZXYuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW9kZXYuYwppbmRleCAwMTE5MzhmLi44MGFjNWY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvZGV2LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby92aWRlb2Rldi5jCkBAIC0zMTgsNiArMzE4LDcgQEAKIAlbVjRMMl9CVUZfVFlQRV9WQklfT1VUUFVUXSAgICAgICAgID0gInZiaS1vdXQiLAogCVtWNEwyX0JVRl9UWVBFX1NMSUNFRF9WQklfT1VUUFVUXSAgPSAic2xpY2VkLXZiaS1vdXQiLAogCVtWNEwyX0JVRl9UWVBFX1NMSUNFRF9WQklfQ0FQVFVSRV0gPSAic2xpY2VkLXZiaS1jYXB0dXJlIiwKKwlbVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfT1ZFUkxBWV0gPSAidmlkZW8tb3V0LW92ZXIiLAogCVtWNEwyX0JVRl9UWVBFX1BSSVZBVEVdICAgICAgICAgICAgPSAicHJpdmF0ZSIsCiB9OwogCkBAIC0zMzAsNiArMzMxLDggQEAKIAlbVjRMMl9GSUVMRF9TRVFfVEJdICAgICA9ICJzZXEtdGIiLAogCVtWNEwyX0ZJRUxEX1NFUV9CVF0gICAgID0gInNlcS1idCIsCiAJW1Y0TDJfRklFTERfQUxURVJOQVRFXSAgPSAiYWx0ZXJuYXRlIiwKKwlbVjRMMl9GSUVMRF9JTlRFUkxBQ0VEX1RCXSA9ICJpbnRlcmxhY2VkLXRiIiwKKwlbVjRMMl9GSUVMRF9JTlRFUkxBQ0VEX0JUXSA9ICJpbnRlcmxhY2VkLWJ0IiwKIH07CiAKICNkZWZpbmUgcHJ0X25hbWVzKGEsYXJyKSAoKChhKT49MCkmJigoYSk8QVJSQVlfU0laRShhcnIpKSk/YXJyW2FdOiJ1bmtub3duIgpAQCAtNDExLDYgKzQxNCwxMCBAQAogCQlpZiAodmZkLT52aWRpb2NfdHJ5X2ZtdF92Ymlfb3V0cHV0KQogCQkJcmV0dXJuICgwKTsKIAkJYnJlYWs7CisJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9PVkVSTEFZOgorCQlpZiAodmZkLT52aWRpb2NfdHJ5X2ZtdF9vdXRwdXRfb3ZlcmxheSkKKwkJCXJldHVybiAoMCk7CisJCWJyZWFrOwogCWNhc2UgVjRMMl9CVUZfVFlQRV9QUklWQVRFOgogCQlpZiAodmZkLT52aWRpb2NfdHJ5X2ZtdF90eXBlX3ByaXZhdGUpCiAJCQlyZXR1cm4gKDApOwpAQCAtNTI1LDYgKzUzMiwxMCBAQAogCQkJCXJldD12ZmQtPnZpZGlvY19lbnVtX2ZtdF92Ymlfb3V0cHV0KGZpbGUsCiAJCQkJCQkJCWZoLCBmKTsKIAkJCWJyZWFrOworCQljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX09WRVJMQVk6CisJCQlpZiAodmZkLT52aWRpb2NfZW51bV9mbXRfb3V0cHV0X292ZXJsYXkpCisJCQkJcmV0PXZmZC0+dmlkaW9jX2VudW1fZm10X291dHB1dF9vdmVybGF5KGZpbGUsIGZoLCBmKTsKKwkJCWJyZWFrOwogCQljYXNlIFY0TDJfQlVGX1RZUEVfUFJJVkFURToKIAkJCWlmICh2ZmQtPnZpZGlvY19lbnVtX2ZtdF90eXBlX3ByaXZhdGUpCiAJCQkJcmV0PXZmZC0+dmlkaW9jX2VudW1fZm10X3R5cGVfcHJpdmF0ZShmaWxlLApAQCAtNTgyLDYgKzU5MywxMCBAQAogCQkJCXJldD12ZmQtPnZpZGlvY19nX2ZtdF92aWRlb19vdXRwdXQoZmlsZSwKIAkJCQkJCQkJZmgsIGYpOwogCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfT1ZFUkxBWToKKwkJCWlmICh2ZmQtPnZpZGlvY19nX2ZtdF9vdXRwdXRfb3ZlcmxheSkKKwkJCQlyZXQ9dmZkLT52aWRpb2NfZ19mbXRfb3V0cHV0X292ZXJsYXkoZmlsZSwgZmgsIGYpOworCQkJYnJlYWs7CiAJCWNhc2UgVjRMMl9CVUZfVFlQRV9WQklfT1VUUFVUOgogCQkJaWYgKHZmZC0+dmlkaW9jX2dfZm10X3ZiaV9vdXRwdXQpCiAJCQkJcmV0PXZmZC0+dmlkaW9jX2dfZm10X3ZiaV9vdXRwdXQoZmlsZSwgZmgsIGYpOwpAQCAtNjMwLDYgKzY0NSwxMCBAQAogCQkJCXJldD12ZmQtPnZpZGlvY19zX2ZtdF92aWRlb19vdXRwdXQoZmlsZSwKIAkJCQkJCQkJZmgsIGYpOwogCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfT1ZFUkxBWToKKwkJCWlmICh2ZmQtPnZpZGlvY19zX2ZtdF9vdXRwdXRfb3ZlcmxheSkKKwkJCQlyZXQ9dmZkLT52aWRpb2Nfc19mbXRfb3V0cHV0X292ZXJsYXkoZmlsZSwgZmgsIGYpOworCQkJYnJlYWs7CiAJCWNhc2UgVjRMMl9CVUZfVFlQRV9WQklfT1VUUFVUOgogCQkJaWYgKHZmZC0+dmlkaW9jX3NfZm10X3ZiaV9vdXRwdXQpCiAJCQkJcmV0PXZmZC0+dmlkaW9jX3NfZm10X3ZiaV9vdXRwdXQoZmlsZSwKQEAgLTY4MCw2ICs2OTksMTAgQEAKIAkJCQlyZXQ9dmZkLT52aWRpb2NfdHJ5X2ZtdF92aWRlb19vdXRwdXQoZmlsZSwKIAkJCQkJCQkJZmgsIGYpOwogCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfT1ZFUkxBWToKKwkJCWlmICh2ZmQtPnZpZGlvY190cnlfZm10X291dHB1dF9vdmVybGF5KQorCQkJCXJldD12ZmQtPnZpZGlvY190cnlfZm10X291dHB1dF9vdmVybGF5KGZpbGUsIGZoLCBmKTsKKwkJCWJyZWFrOwogCQljYXNlIFY0TDJfQlVGX1RZUEVfVkJJX09VVFBVVDoKIAkJCWlmICh2ZmQtPnZpZGlvY190cnlfZm10X3ZiaV9vdXRwdXQpCiAJCQkJcmV0PXZmZC0+dmlkaW9jX3RyeV9mbXRfdmJpX291dHB1dChmaWxlLApAQCAtMTM4MSw2ICsxNDA0LDExIEBACiAJY2FzZSBWSURJT0NfR19QQVJNOgogCXsKIAkJc3RydWN0IHY0bDJfc3RyZWFtcGFybSAqcD1hcmc7CisJCV9fdTMyIHR5cGU9cC0+dHlwZTsKKworCQltZW1zZXQocCwwLHNpemVvZigqcCkpOworCQlwLT50eXBlPXR5cGU7CisKIAkJaWYgKHZmZC0+dmlkaW9jX2dfcGFybSkgewogCQkJcmV0PXZmZC0+dmlkaW9jX2dfcGFybShmaWxlLCBmaCwgcCk7CiAJCX0gZWxzZSB7CkBAIC0xMzkyLDggKzE0MjAsNiBAQAogCQkJdjRsMl92aWRlb19zdGRfY29uc3RydWN0KCZzLCB2ZmQtPmN1cnJlbnRfbm9ybSwKIAkJCQkJCSB2NGwyX25vcm1fdG9fbmFtZSh2ZmQtPmN1cnJlbnRfbm9ybSkpOwogCi0JCQltZW1zZXQocCwwLHNpemVvZigqcCkpOwotCiAJCQlwLT5wYXJtLmNhcHR1cmUudGltZXBlcmZyYW1lID0gcy5mcmFtZXBlcmlvZDsKIAkJCXJldD0wOwogCQl9CkBAIC0xNTA5LDYgKzE1MzUsMTYgQEAKIAkJYnJlYWs7CiAJfQogI2VuZGlmCisJY2FzZSBWSURJT0NfR19DSElQX0lERU5UOgorCXsKKwkJc3RydWN0IHY0bDJfY2hpcF9pZGVudCAqcD1hcmc7CisJCWlmICghdmZkLT52aWRpb2NfZ19jaGlwX2lkZW50KQorCQkJYnJlYWs7CisJCXJldD12ZmQtPnZpZGlvY19nX2NoaXBfaWRlbnQoZmlsZSwgZmgsIHApOworCQlpZiAoIXJldCkKKwkJCWRiZ2FyZyAoY21kLCAiY2hpcF9pZGVudD0ldSwgcmV2aXNpb249MHgleFxuIiwgcC0+aWRlbnQsIHAtPnJldmlzaW9uKTsKKwkJYnJlYWs7CisJfQogCX0gLyogc3dpdGNoICovCiAKIAlpZiAodmZkLT5kZWJ1ZyAmIFY0TDJfREVCVUdfSU9DVExfQVJHKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3dtODczOS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby93bTg3MzkuYwppbmRleCBhOWI1OWMzLi44ZjY3NDFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3dtODczOS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vd204NzM5LmMKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pMmMtaWQuaD4KICNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jaGlwLWlkZW50Lmg+CiAKIE1PRFVMRV9ERVNDUklQVElPTigid204NzM5IGRyaXZlciIpOwogTU9EVUxFX0FVVEhPUigiVC4gQWRhY2hpLCBIYW5zIFZlcmt1aWwiKTsKQEAgLTIzNiw2ICsyMzcsOSBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKKwljYXNlIFZJRElPQ19HX0NISVBfSURFTlQ6CisJCXJldHVybiB2NGwyX2NoaXBfaWRlbnRfaTJjX2NsaWVudChjbGllbnQsIGFyZywgVjRMMl9JREVOVF9XTTg3MzksIDApOworCiAJY2FzZSBWSURJT0NfTE9HX1NUQVRVUzoKIAkJdjRsX2luZm8oY2xpZW50LCAiRnJlcXVlbmN5OiAldSBIelxuIiwgc3RhdGUtPmNsb2NrX2ZyZXEpOwogCQl2NGxfaW5mbyhjbGllbnQsICJWb2x1bWUgTDogICUwMnglc1xuIiwgc3RhdGUtPnZvbF9sICYgMHgxZiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vd204Nzc1LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3dtODc3NS5jCmluZGV4IGQ4MWE4OGIuLjRkZjVkMzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vd204Nzc1LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby93bTg3NzUuYwpAQCAtMzMsNiArMzMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2kyYy1pZC5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNoaXAtaWRlbnQuaD4KIAogTU9EVUxFX0RFU0NSSVBUSU9OKCJ3bTg3NzUgZHJpdmVyIik7CiBNT0RVTEVfQVVUSE9SKCJVbGYgRWtsdW5kLCBIYW5zIFZlcmt1aWwiKTsKQEAgLTEyNCw2ICsxMjUsOSBAQAogCQkJd204Nzc1X3dyaXRlKGNsaWVudCwgUjIxLCAweDEwMCArIHN0YXRlLT5pbnB1dCk7CiAJCWJyZWFrOwogCisJY2FzZSBWSURJT0NfR19DSElQX0lERU5UOgorCQlyZXR1cm4gdjRsMl9jaGlwX2lkZW50X2kyY19jbGllbnQoY2xpZW50LCBhcmcsIFY0TDJfSURFTlRfV004Nzc1LCAwKTsKKwogCWNhc2UgVklESU9DX0xPR19TVEFUVVM6CiAJCXY0bF9pbmZvKGNsaWVudCwgIklucHV0OiAlZCVzXG4iLCBzdGF0ZS0+aW5wdXQsCiAJCQkgICAgc3RhdGUtPm11dGVkID8gIiAobXV0ZWQpIiA6ICIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8venIzNjR4eC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby96cjM2NHh4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVkMzM2NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8venIzNjR4eC5jCkBAIC0wLDAgKzEsOTI5IEBACisvKgorICogWm9yYW4gMzY0eHggYmFzZWQgVVNCIHdlYmNhbSBtb2R1bGUgdmVyc2lvbiAwLjcyCisgKgorICogQWxsb3dzIHlvdSB0byB1c2UgeW91ciBVU0Igd2ViY2FtIHdpdGggVjRMMiBhcHBsaWNhdGlvbnMKKyAqIFRoaXMgaXMgc3RpbGwgaW4gaGVhdnkgZGV2ZWxvcHBlbWVudCAhCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0ICBBbnRvaW5lIEphY3F1ZXQgPHJveWFsZUB6ZXJlem8uY29tPgorICogaHR0cDovL3JveWFsZS56ZXJlem8uY29tL3pyMzY0eHgvCisgKgorICogSGVhdmlseSBpbnNwaXJlZCBieSB1c2Itc2tlbGV0b24uYywgdmljYW0uYywgY3BpYS5jIGFuZCBzcGNhNTB4LmMgZHJpdmVycworICogVjRMMiB2ZXJzaW9uIGluc3BpcmVkIGJ5IG1leWUuYyBkcml2ZXIKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KKworCisvKiBWZXJzaW9uIEluZm9ybWF0aW9uICovCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OICJ2MC43MiIKKyNkZWZpbmUgRFJJVkVSX0FVVEhPUiAiQW50b2luZSBKYWNxdWV0LCBodHRwOi8vcm95YWxlLnplcmV6by5jb20vIgorI2RlZmluZSBEUklWRVJfREVTQyAiWm9yYW4gMzY0eHgiCisKKworLyogQ2FtZXJhICovCisjZGVmaW5lIEZSQU1FUyAyCisjZGVmaW5lIE1BWF9GUkFNRV9TSVpFIDEwMDAwMAorI2RlZmluZSBCVUZGRVJfU0laRSAweDEwMDAKKyNkZWZpbmUgQ1RSTF9USU1FT1VUIDUwMAorCisKKy8qIERlYnVnIG1hY3JvICovCisjZGVmaW5lIERCRyh4Li4uKSBpZiAoZGVidWcpIGluZm8oeCkKKworCisvKiBJbml0IG1ldGhvZHMsIG5lZWQgdG8gZmluZCBuaWNlciBuYW1lcyBmb3IgdGhlc2UKKyAqIHRoZSBleGFjdCBuYW1lcyBvZiB0aGUgY2hpcHNldHMgd291bGQgYmUgdGhlIGJlc3QgaWYgc29tZW9uZSBmaW5kcyBpdCAqLworI2RlZmluZSBNRVRIT0QwIDAKKyNkZWZpbmUgTUVUSE9EMSAxCisjZGVmaW5lIE1FVEhPRDIgMgorCisKKy8qIE1vZHVsZSBwYXJhbWV0ZXJzICovCitzdGF0aWMgaW50IGRlYnVnID0gMDsKK3N0YXRpYyBpbnQgbW9kZSA9IDA7CisKKworLyogTW9kdWxlIHBhcmFtZXRlcnMgaW50ZXJmYWNlICovCittb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiRGVidWcgbGV2ZWwiKTsKK21vZHVsZV9wYXJhbShtb2RlLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhtb2RlLCAiMCA9IDMyMHgyNDAsIDEgPSAxNjB4MTIwLCAyID0gNjQweDQ4MCIpOworCisKKy8qIERldmljZXMgc3VwcG9ydGVkIGJ5IHRoaXMgZHJpdmVyCisgKiAuZHJpdmVyX2luZm8gY29udGFpbnMgdGhlIGluaXQgbWV0aG9kIHVzZWQgYnkgdGhlIGNhbWVyYSAqLworc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIGRldmljZV90YWJsZVtdID0geworCXtVU0JfREVWSUNFKDB4MDhjYSwgMHgwMTA5KSwgLmRyaXZlcl9pbmZvID0gTUVUSE9EMCB9LAorCXtVU0JfREVWSUNFKDB4MDQxZSwgMHg0MDI0KSwgLmRyaXZlcl9pbmZvID0gTUVUSE9EMCB9LAorCXtVU0JfREVWSUNFKDB4MGQ2NCwgMHgwMTA4KSwgLmRyaXZlcl9pbmZvID0gTUVUSE9EMCB9LAorCXtVU0JfREVWSUNFKDB4MDU0NiwgMHgzMTg3KSwgLmRyaXZlcl9pbmZvID0gTUVUSE9EMCB9LAorCXtVU0JfREVWSUNFKDB4MGQ2NCwgMHgzMTA4KSwgLmRyaXZlcl9pbmZvID0gTUVUSE9EMCB9LAorCXtVU0JfREVWSUNFKDB4MDU5NSwgMHg0MzQzKSwgLmRyaXZlcl9pbmZvID0gTUVUSE9EMCB9LAorCXtVU0JfREVWSUNFKDB4MGJiMCwgMHg1MDBkKSwgLmRyaXZlcl9pbmZvID0gTUVUSE9EMCB9LAorCXtVU0JfREVWSUNFKDB4MGZlYiwgMHgyMDA0KSwgLmRyaXZlcl9pbmZvID0gTUVUSE9EMCB9LAorCXtVU0JfREVWSUNFKDB4MDU1ZiwgMHhiNTAwKSwgLmRyaXZlcl9pbmZvID0gTUVUSE9EMCB9LAorCXtVU0JfREVWSUNFKDB4MDhjYSwgMHgyMDYyKSwgLmRyaXZlcl9pbmZvID0gTUVUSE9EMiB9LAorCXtVU0JfREVWSUNFKDB4MDUyYiwgMHgxYTE4KSwgLmRyaXZlcl9pbmZvID0gTUVUSE9EMSB9LAorCXtVU0JfREVWSUNFKDB4MDRjOCwgMHgwNzI5KSwgLmRyaXZlcl9pbmZvID0gTUVUSE9EMCB9LAorCXtVU0JfREVWSUNFKDB4MDRmMiwgMHhhMjA4KSwgLmRyaXZlcl9pbmZvID0gTUVUSE9EMCB9LAorCXtVU0JfREVWSUNFKDB4MDc4NCwgMHgwMDQwKSwgLmRyaXZlcl9pbmZvID0gTUVUSE9EMSB9LAorCXtVU0JfREVWSUNFKDB4MDZkNiwgMHgwMDM0KSwgLmRyaXZlcl9pbmZvID0gTUVUSE9EMCB9LAorCXtVU0JfREVWSUNFKDB4MGExNywgMHgwMDYyKSwgLmRyaXZlcl9pbmZvID0gTUVUSE9EMiB9LAorCXt9CQkJLyogVGVybWluYXRpbmcgZW50cnkgKi8KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBkZXZpY2VfdGFibGUpOworCisKKy8qIENhbWVyYSBzdHVmZiAqLworc3RydWN0IHpyMzY0eHhfY2FtZXJhIHsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldjsJLyogc2F2ZSBvZmYgdGhlIHVzYiBkZXZpY2UgcG9pbnRlciAqLworCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2U7LyogdGhlIGludGVyZmFjZSBmb3IgdGhpcyBkZXZpY2UgKi8KKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2OwkvKiB2NGwgdmlkZW8gZGV2aWNlICovCisJdTggKmZyYW1lYnVmOworCWludCBuYjsKKwl1bnNpZ25lZCBjaGFyICpidWZmZXI7CisJaW50IHNraXA7CisJaW50IGJyaWdodG5lc3M7CisJaW50IHdpZHRoOworCWludCBoZWlnaHQ7CisJaW50IG1ldGhvZDsKKwlzdHJ1Y3QgbXV0ZXggbG9jazsKK307CisKKworLyogZnVuY3Rpb24gdXNlZCB0byBzZW5kIGluaXRpYWxpc2F0aW9uIGNvbW1hbmRzIHRvIHRoZSBjYW1lcmEgKi8KK3N0YXRpYyBpbnQgc2VuZF9jb250cm9sX21zZyhzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwgdTggcmVxdWVzdCwgdTE2IHZhbHVlLAorCQkJICAgIHUxNiBpbmRleCwgdW5zaWduZWQgY2hhciAqY3AsIHUxNiBzaXplKQoreworCWludCBzdGF0dXM7CisKKwl1bnNpZ25lZCBjaGFyICp0cmFuc2Zlcl9idWZmZXIgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCWlmICghdHJhbnNmZXJfYnVmZmVyKSB7CisJCWluZm8oImttYWxsb2MoJWQpIGZhaWxlZCIsIHNpemUpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwltZW1jcHkodHJhbnNmZXJfYnVmZmVyLCBjcCwgc2l6ZSk7CisKKwlzdGF0dXMgPSB1c2JfY29udHJvbF9tc2codWRldiwKKwkJCQkgdXNiX3NuZGN0cmxwaXBlKHVkZXYsIDApLAorCQkJCSByZXF1ZXN0LAorCQkJCSBVU0JfRElSX09VVCB8IFVTQl9UWVBFX1ZFTkRPUiB8CisJCQkJIFVTQl9SRUNJUF9ERVZJQ0UsIHZhbHVlLCBpbmRleCwKKwkJCQkgdHJhbnNmZXJfYnVmZmVyLCBzaXplLCBDVFJMX1RJTUVPVVQpOworCisJa2ZyZWUodHJhbnNmZXJfYnVmZmVyKTsKKworCWlmIChzdGF0dXMgPCAwKQorCQlpbmZvKCJGYWlsZWQgc2VuZGluZyBjb250cm9sIG1lc3NhZ2UsIGVycm9yICVkLiIsIHN0YXR1cyk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisKKy8qIENvbnRyb2wgbWVzc2FnZXMgc2VudCB0byB0aGUgY2FtZXJhIHRvIGluaXRpYWxpemUgaXQKKyAqIGFuZCBsYXVuY2ggdGhlIGNhcHR1cmUgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgdmFsdWU7CisJdW5zaWduZWQgaW50IHNpemU7CisJdW5zaWduZWQgY2hhciAqYnl0ZXM7Cit9IG1lc3NhZ2U7CisKKy8qIG1ldGhvZCAwICovCitzdGF0aWMgdW5zaWduZWQgY2hhciBtMGQxW10gPSB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIG0wZDJbXSA9IHsgMCwgMCwgMCwgMCwgMCwgMCB9Oworc3RhdGljIHVuc2lnbmVkIGNoYXIgbTBkM1tdID0geyAwLCAwIH07CitzdGF0aWMgbWVzc2FnZSBtMFtdID0geworCXsweDFmMzAsIDAsIE5VTEx9LAorCXsweGQwMDAsIDAsIE5VTEx9LAorCXsweDMzNzAsIHNpemVvZihtMGQxKSwgbTBkMX0sCisJezB4MjAwMCwgMCwgTlVMTH0sCisJezB4MmYwZiwgMCwgTlVMTH0sCisJezB4MjYxMCwgc2l6ZW9mKG0wZDIpLCBtMGQyfSwKKwl7MHhlMTA3LCAwLCBOVUxMfSwKKwl7MHgyNTAyLCAwLCBOVUxMfSwKKwl7MHgxZjcwLCAwLCBOVUxMfSwKKwl7MHhkMDAwLCAwLCBOVUxMfSwKKwl7MHg5YTAxLCBzaXplb2YobTBkMyksIG0wZDN9LAorCXstMSwgLTEsIE5VTEx9Cit9OworCisvKiBtZXRob2QgMSAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgbTFkMVtdID0geyAweGZmLCAweGZmIH07CitzdGF0aWMgdW5zaWduZWQgY2hhciBtMWQyW10gPSB7IDB4MDAsIDB4MDAgfTsKK3N0YXRpYyBtZXNzYWdlIG0xW10gPSB7CisJezB4MWYzMCwgMCwgTlVMTH0sCisJezB4ZDAwMCwgMCwgTlVMTH0sCisJezB4ZjAwMCwgMCwgTlVMTH0sCisJezB4MjAwMCwgMCwgTlVMTH0sCisJezB4MmYwZiwgMCwgTlVMTH0sCisJezB4MjY1MCwgMCwgTlVMTH0sCisJezB4ZTEwNywgMCwgTlVMTH0sCisJezB4MjUwMiwgc2l6ZW9mKG0xZDEpLCBtMWQxfSwKKwl7MHgxZjcwLCAwLCBOVUxMfSwKKwl7MHhkMDAwLCAwLCBOVUxMfSwKKwl7MHhkMDAwLCAwLCBOVUxMfSwKKwl7MHhkMDAwLCAwLCBOVUxMfSwKKwl7MHg5YTAxLCBzaXplb2YobTFkMiksIG0xZDJ9LAorCXstMSwgLTEsIE5VTEx9Cit9OworCisvKiBtZXRob2QgMiAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgbTJkMVtdID0geyAweGZmLCAweGZmIH07CitzdGF0aWMgbWVzc2FnZSBtMltdID0geworCXsweDFmMzAsIDAsIE5VTEx9LAorCXsweGYwMDAsIDAsIE5VTEx9LAorCXsweDIwMDAsIDAsIE5VTEx9LAorCXsweDJmMGYsIDAsIE5VTEx9LAorCXsweDI2NTAsIDAsIE5VTEx9LAorCXsweGUxMDcsIDAsIE5VTEx9LAorCXsweDI1MDIsIHNpemVvZihtMmQxKSwgbTJkMX0sCisJezB4MWY3MCwgMCwgTlVMTH0sCisJey0xLCAtMSwgTlVMTH0KK307CisKKy8qIGluaXQgdGFibGUgKi8KK3N0YXRpYyBtZXNzYWdlICppbml0WzNdID0geyBtMCwgbTEsIG0yIH07CisKKworLyogSlBFRyBzdGF0aWMgZGF0YSBpbiBoZWFkZXIgKEh1ZmZtYW4gdGFibGUsIGV0YykgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGhlYWRlcjFbXSA9IHsKKwkweEZGLCAweEQ4LAorCS8qCisJMHhGRiwgMHhFMCwgMHgwMCwgMHgxMCwgJ0onLCAnRicsICdJJywgJ0YnLAorCTB4MDAsIDB4MDEsIDB4MDEsIDB4MDAsIDB4MzMsIDB4OEEsIDB4MDAsIDB4MDAsIDB4MzMsIDB4ODgsCisJKi8KKwkweEZGLCAweERCLCAweDAwLCAweDg0Cit9Oworc3RhdGljIHVuc2lnbmVkIGNoYXIgaGVhZGVyMltdID0geworCTB4RkYsIDB4QzQsIDB4MDAsIDB4MUYsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDUsIDB4MDEsIDB4MDEsIDB4MDEsCisJMHgwMSwgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAweDA4LCAweDA5LCAweDBBLCAweDBCLAorCTB4RkYsIDB4QzQsIDB4MDAsIDB4QjUsIDB4MTAsIDB4MDAsIDB4MDIsIDB4MDEsIDB4MDMsIDB4MDMsIDB4MDIsCisJMHgwNCwgMHgwMywgMHgwNSwgMHgwNSwgMHgwNCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg3RCwgMHgwMSwKKwkweDAyLCAweDAzLCAweDAwLCAweDA0LCAweDExLCAweDA1LCAweDEyLCAweDIxLCAweDMxLCAweDQxLCAweDA2LAorCTB4MTMsIDB4NTEsIDB4NjEsIDB4MDcsIDB4MjIsIDB4NzEsIDB4MTQsIDB4MzIsIDB4ODEsIDB4OTEsIDB4QTEsCisJMHgwOCwgMHgyMywgMHg0MiwgMHhCMSwgMHhDMSwgMHgxNSwgMHg1MiwgMHhEMSwgMHhGMCwgMHgyNCwgMHgzMywKKwkweDYyLCAweDcyLCAweDgyLCAweDA5LCAweDBBLCAweDE2LCAweDE3LCAweDE4LCAweDE5LCAweDFBLCAweDI1LAorCTB4MjYsIDB4MjcsIDB4MjgsIDB4MjksIDB4MkEsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIDB4MzgsIDB4MzksCisJMHgzQSwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgMHg0OCwgMHg0OSwgMHg0QSwgMHg1MywgMHg1NCwKKwkweDU1LCAweDU2LCAweDU3LCAweDU4LCAweDU5LCAweDVBLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LAorCTB4NjgsIDB4NjksIDB4NkEsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIDB4NzgsIDB4NzksIDB4N0EsCisJMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgMHg4OCwgMHg4OSwgMHg4QSwgMHg5MiwgMHg5MywgMHg5NCwKKwkweDk1LCAweDk2LCAweDk3LCAweDk4LCAweDk5LCAweDlBLCAweEEyLCAweEEzLCAweEE0LCAweEE1LCAweEE2LAorCTB4QTcsIDB4QTgsIDB4QTksIDB4QUEsIDB4QjIsIDB4QjMsIDB4QjQsIDB4QjUsIDB4QjYsIDB4QjcsIDB4QjgsCisJMHhCOSwgMHhCQSwgMHhDMiwgMHhDMywgMHhDNCwgMHhDNSwgMHhDNiwgMHhDNywgMHhDOCwgMHhDOSwgMHhDQSwKKwkweEQyLCAweEQzLCAweEQ0LCAweEQ1LCAweEQ2LCAweEQ3LCAweEQ4LCAweEQ5LCAweERBLCAweEUxLCAweEUyLAorCTB4RTMsIDB4RTQsIDB4RTUsIDB4RTYsIDB4RTcsIDB4RTgsIDB4RTksIDB4RUEsIDB4RjEsIDB4RjIsIDB4RjMsCisJMHhGNCwgMHhGNSwgMHhGNiwgMHhGNywgMHhGOCwgMHhGOSwgMHhGQSwgMHhGRiwgMHhDNCwgMHgwMCwgMHgxRiwKKwkweDAxLCAweDAwLCAweDAzLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLAorCTB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsCisJMHgwNSwgMHgwNiwgMHgwNywgMHgwOCwgMHgwOSwgMHgwQSwgMHgwQiwgMHhGRiwgMHhDNCwgMHgwMCwgMHhCNSwKKwkweDExLCAweDAwLCAweDAyLCAweDAxLCAweDAyLCAweDA0LCAweDA0LCAweDAzLCAweDA0LCAweDA3LCAweDA1LAorCTB4MDQsIDB4MDQsIDB4MDAsIDB4MDEsIDB4MDIsIDB4NzcsIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MTEsCisJMHgwNCwgMHgwNSwgMHgyMSwgMHgzMSwgMHgwNiwgMHgxMiwgMHg0MSwgMHg1MSwgMHgwNywgMHg2MSwgMHg3MSwKKwkweDEzLCAweDIyLCAweDMyLCAweDgxLCAweDA4LCAweDE0LCAweDQyLCAweDkxLCAweEExLCAweEIxLCAweEMxLAorCTB4MDksIDB4MjMsIDB4MzMsIDB4NTIsIDB4RjAsIDB4MTUsIDB4NjIsIDB4NzIsIDB4RDEsIDB4MEEsIDB4MTYsCisJMHgyNCwgMHgzNCwgMHhFMSwgMHgyNSwgMHhGMSwgMHgxNywgMHgxOCwgMHgxOSwgMHgxQSwgMHgyNiwgMHgyNywKKwkweDI4LCAweDI5LCAweDJBLCAweDM1LCAweDM2LCAweDM3LCAweDM4LCAweDM5LCAweDNBLCAweDQzLCAweDQ0LAorCTB4NDUsIDB4NDYsIDB4NDcsIDB4NDgsIDB4NDksIDB4NEEsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsCisJMHg1OCwgMHg1OSwgMHg1QSwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgMHg2OCwgMHg2OSwgMHg2QSwKKwkweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAweDc4LCAweDc5LCAweDdBLCAweDgyLCAweDgzLCAweDg0LAorCTB4ODUsIDB4ODYsIDB4ODcsIDB4ODgsIDB4ODksIDB4OEEsIDB4OTIsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsCisJMHg5NywgMHg5OCwgMHg5OSwgMHg5QSwgMHhBMiwgMHhBMywgMHhBNCwgMHhBNSwgMHhBNiwgMHhBNywgMHhBOCwKKwkweEE5LCAweEFBLCAweEIyLCAweEIzLCAweEI0LCAweEI1LCAweEI2LCAweEI3LCAweEI4LCAweEI5LCAweEJBLAorCTB4QzIsIDB4QzMsIDB4QzQsIDB4QzUsIDB4QzYsIDB4QzcsIDB4QzgsIDB4QzksIDB4Q0EsIDB4RDIsIDB4RDMsCisJMHhENCwgMHhENSwgMHhENiwgMHhENywgMHhEOCwgMHhEOSwgMHhEQSwgMHhFMiwgMHhFMywgMHhFNCwgMHhFNSwKKwkweEU2LCAweEU3LCAweEU4LCAweEU5LCAweEVBLCAweEYyLCAweEYzLCAweEY0LCAweEY1LCAweEY2LCAweEY3LAorCTB4RjgsIDB4RjksIDB4RkEsIDB4RkYsIDB4QzAsIDB4MDAsIDB4MTEsIDB4MDgsIDB4MDAsIDB4RjAsIDB4MDEsCisJMHg0MCwgMHgwMywgMHgwMSwgMHgyMSwgMHgwMCwgMHgwMiwgMHgxMSwgMHgwMSwgMHgwMywgMHgxMSwgMHgwMSwKKwkweEZGLCAweERBLCAweDAwLCAweDBDLCAweDAzLCAweDAxLCAweDAwLCAweDAyLCAweDExLCAweDAzLCAweDExLAorCTB4MDAsIDB4M0YsIDB4MDAKK307CitzdGF0aWMgdW5zaWduZWQgY2hhciBoZWFkZXIzOworCisKKworLyoqKioqKioqKioqKioqKioqKioqLworLyogVjRMMiBpbnRlZ3JhdGlvbiAqLworLyoqKioqKioqKioqKioqKioqKioqLworCisvKiB0aGlzIGZ1bmN0aW9uIHJlYWRzIGEgZnVsbCBKUEVHIHBpY3R1cmUgc3luY2hyb25vdXNseQorICogVE9ETzogZG8gaXQgYXN5bmNocm9ub3VzbHkuLi4gKi8KK3N0YXRpYyBpbnQgcmVhZF9mcmFtZShzdHJ1Y3QgenIzNjR4eF9jYW1lcmEgKmNhbSwgaW50IGZyYW1lbnVtKQoreworCWludCBpLCBuLCB0ZW1wLCBoZWFkLCBzaXplLCBhY3R1YWxfbGVuZ3RoOworCXVuc2lnbmVkIGNoYXIgKnB0ciA9IE5VTEwsICpqcGVnOworCisgICAgICByZWRvOgorCS8qIGhhcmR3YXJlIGJyaWdodG5lc3MgKi8KKwluID0gc2VuZF9jb250cm9sX21zZyhjYW0tPnVkZXYsIDEsIDB4MjAwMSwgMCwgTlVMTCwgMCk7CisJdGVtcCA9ICgweDYwIDw8IDgpICsgMTI3IC0gY2FtLT5icmlnaHRuZXNzOworCW4gPSBzZW5kX2NvbnRyb2xfbXNnKGNhbS0+dWRldiwgMSwgdGVtcCwgMCwgTlVMTCwgMCk7CisKKwkvKiBkdXJpbmcgdGhlIGZpcnN0IGxvb3Agd2UgYXJlIGdvaW5nIHRvIGluc2VydCBKUEVHIGhlYWRlciAqLworCWhlYWQgPSAwOworCS8qIHRoaXMgaXMgdGhlIHBsYWNlIGluIG1lbW9yeSB3aGVyZSB3ZSBhcmUgZ29pbmcgdG8gYnVpbGQKKwkgKiB0aGUgSlBFRyBpbWFnZSAqLworCWpwZWcgPSBjYW0tPmZyYW1lYnVmICsgZnJhbWVudW0gKiBNQVhfRlJBTUVfU0laRTsKKwkvKiByZWFkIGRhdGEuLi4gKi8KKwlkbyB7CisJCW4gPSB1c2JfYnVsa19tc2coY2FtLT51ZGV2LAorCQkJCSB1c2JfcmN2YnVsa3BpcGUoY2FtLT51ZGV2LCAweDgxKSwKKwkJCQkgY2FtLT5idWZmZXIsIEJVRkZFUl9TSVpFLCAmYWN0dWFsX2xlbmd0aCwKKwkJCQkgQ1RSTF9USU1FT1VUKTsKKwkJREJHKCJidWZmZXIgOiAlZCAlZCIsIGNhbS0+YnVmZmVyWzBdLCBjYW0tPmJ1ZmZlclsxXSk7CisJCURCRygiYnVsayA6IG49JWQgc2l6ZT0lZCIsIG4sIGFjdHVhbF9sZW5ndGgpOworCQlpZiAobiA8IDApIHsKKwkJCWluZm8oImVycm9yIHJlYWRpbmcgYnVsayBtc2ciKTsKKwkJCXJldHVybiAwOworCQl9CisJCWlmIChhY3R1YWxfbGVuZ3RoIDwgMCB8fCBhY3R1YWxfbGVuZ3RoID4gQlVGRkVSX1NJWkUpIHsKKwkJCWluZm8oIndyb25nIG51bWJlciBvZiBieXRlcyIpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQkvKiBzd2FwIGJ5dGVzIGlmIGNhbWVyYSBuZWVkcyBpdCAqLworCQlpZiAoY2FtLT5tZXRob2QgPT0gTUVUSE9EMCkgeworCQkJdTE2ICpidWYgPSAodTE2KiljYW0tPmJ1ZmZlcjsKKwkJCWZvciAoaSA9IDA7IGkgPCBCVUZGRVJfU0laRS8yOyBpKyspCisJCQkJc3dhYjE2cyhidWYgKyBpKTsKKwkJfQorCisJCS8qIHdyaXRlIHRoZSBKUEVHIGhlYWRlciAqLworCQlpZiAoIWhlYWQpIHsKKwkJCURCRygianBlZyBoZWFkZXIiKTsKKwkJCXB0ciA9IGpwZWc7CisJCQltZW1jcHkocHRyLCBoZWFkZXIxLCBzaXplb2YoaGVhZGVyMSkpOworCQkJcHRyICs9IHNpemVvZihoZWFkZXIxKTsKKwkJCWhlYWRlcjMgPSAwOworCQkJbWVtY3B5KHB0ciwgJmhlYWRlcjMsIDEpOworCQkJcHRyKys7CisJCQltZW1jcHkocHRyLCBjYW0tPmJ1ZmZlciwgNjQpOworCQkJcHRyICs9IDY0OworCQkJaGVhZGVyMyA9IDE7CisJCQltZW1jcHkocHRyLCAmaGVhZGVyMywgMSk7CisJCQlwdHIrKzsKKwkJCW1lbWNweShwdHIsIGNhbS0+YnVmZmVyICsgNjQsIDY0KTsKKwkJCXB0ciArPSA2NDsKKwkJCW1lbWNweShwdHIsIGhlYWRlcjIsIHNpemVvZihoZWFkZXIyKSk7CisJCQlwdHIgKz0gc2l6ZW9mKGhlYWRlcjIpOworCQkJbWVtY3B5KHB0ciwgY2FtLT5idWZmZXIgKyAxMjgsCisJCQkgICAgICAgYWN0dWFsX2xlbmd0aCAtIDEyOCk7CisJCQlwdHIgKz0gYWN0dWFsX2xlbmd0aCAtIDEyODsKKwkJCWhlYWQgPSAxOworCQkJREJHKCJoZWFkZXIgOiAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCIsCisJCQkgICAgY2FtLT5idWZmZXJbMF0sIGNhbS0+YnVmZmVyWzFdLCBjYW0tPmJ1ZmZlclsyXSwKKwkJCSAgICBjYW0tPmJ1ZmZlclszXSwgY2FtLT5idWZmZXJbNF0sIGNhbS0+YnVmZmVyWzVdLAorCQkJICAgIGNhbS0+YnVmZmVyWzZdLCBjYW0tPmJ1ZmZlcls3XSwgY2FtLT5idWZmZXJbOF0pOworCQl9IGVsc2UgeworCQkJbWVtY3B5KHB0ciwgY2FtLT5idWZmZXIsIGFjdHVhbF9sZW5ndGgpOworCQkJcHRyICs9IGFjdHVhbF9sZW5ndGg7CisJCX0KKwl9CisJLyogLi4uIHVudGlsIHRoZXJlIGlzIG5vIG1vcmUgKi8KKwl3aGlsZSAoYWN0dWFsX2xlbmd0aCA9PSBCVUZGRVJfU0laRSk7CisKKwkvKiB3ZSBza2lwIHRoZSAyIGZpcnN0IGZyYW1lcyB3aGljaCBhcmUgdXN1YWxseSBidWdneSAqLworCWlmIChjYW0tPnNraXApIHsKKwkJY2FtLT5za2lwLS07CisJCWdvdG8gcmVkbzsKKwl9CisKKwkvKiBnbyBiYWNrIHRvIGZpbmQgdGhlIEpQRUcgRU9JIG1hcmtlciAqLworCXNpemUgPSBwdHIgLSBqcGVnOworCXB0ciAtPSAyOworCXdoaWxlIChwdHIgPiBqcGVnKSB7CisJCWlmICgqcHRyID09IDB4RkYgJiYgKihwdHIgKyAxKSA9PSAweEQ5CisJCSAgICAmJiAqKHB0ciArIDIpID09IDB4RkYpCisJCQlicmVhazsKKwkJcHRyLS07CisJfQorCWlmIChwdHIgPT0ganBlZykKKwkJREJHKCJObyBFT0kgbWFya2VyIik7CisKKwkvKiBTb21ldGltZXMgdGhlcmUgaXMganVuayBkYXRhIGluIHRoZSBtaWRkbGUgb2YgdGhlIHBpY3R1cmUsCisJICogd2Ugd2FudCB0byBza2lwIHRoaXMgYm9ndXMgZnJhbWVzICovCisJd2hpbGUgKHB0ciA+IGpwZWcpIHsKKwkJaWYgKCpwdHIgPT0gMHhGRiAmJiAqKHB0ciArIDEpID09IDB4RkYKKwkJICAgICYmICoocHRyICsgMikgPT0gMHhGRikKKwkJCWJyZWFrOworCQlwdHItLTsKKwl9CisJaWYgKHB0ciAhPSBqcGVnKSB7CisJCURCRygiQm9ndXMgZnJhbWUgPyAlZCIsIGNhbS0+bmIpOworCQlnb3RvIHJlZG87CisJfQorCisJREJHKCJqcGVnIDogJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQiLAorCSAgICBqcGVnWzBdLCBqcGVnWzFdLCBqcGVnWzJdLCBqcGVnWzNdLAorCSAgICBqcGVnWzRdLCBqcGVnWzVdLCBqcGVnWzZdLCBqcGVnWzddKTsKKworCXJldHVybiBzaXplOworfQorCisKK3N0YXRpYyBzc2l6ZV90IHpyMzY0eHhfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBzaXplX3QgY250LAorCQkJICAgIGxvZmZfdCAqIHBwb3MpCit7CisJdW5zaWduZWQgbG9uZyBjb3VudCA9IGNudDsKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKKwlzdHJ1Y3QgenIzNjR4eF9jYW1lcmEgKmNhbTsKKworCURCRygienIzNjR4eF9yZWFkOiByZWFkICVkIGJ5dGVzLiIsIChpbnQpIGNvdW50KTsKKworCWlmICh2ZGV2ID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOworCWNhbSA9IHZpZGVvX2dldF9kcnZkYXRhKHZkZXYpOworCisJaWYgKCFidWYpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFjb3VudCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBOb01hbiBTdXggISAqLworCWNvdW50ID0gcmVhZF9mcmFtZShjYW0sIDApOworCisJaWYgKGNvcHlfdG9fdXNlcihidWYsIGNhbS0+ZnJhbWVidWYsIGNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKKworc3RhdGljIGludCB6cjM2NHh4X3ZpZGlvY19xdWVyeWNhcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQkgICBzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5ICpjYXApCit7CisJbWVtc2V0KGNhcCwgMCwgc2l6ZW9mKCpjYXApKTsKKwlzdHJjcHkoY2FwLT5kcml2ZXIsIERSSVZFUl9ERVNDKTsKKwljYXAtPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX1ZJREVPX0NBUFRVUkUgfCBWNEwyX0NBUF9SRUFEV1JJVEU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgenIzNjR4eF92aWRpb2NfZW51bV9pbnB1dChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQkgICAgIHN0cnVjdCB2NGwyX2lucHV0ICppKQoreworCWlmIChpLT5pbmRleCAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwltZW1zZXQoaSwgMCwgc2l6ZW9mKCppKSk7CisJaS0+aW5kZXggPSAwOworCXN0cmNweShpLT5uYW1lLCBEUklWRVJfREVTQyAiIENhbWVyYSIpOworCWktPnR5cGUgPSBWNEwyX0lOUFVUX1RZUEVfQ0FNRVJBOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHpyMzY0eHhfdmlkaW9jX2dfaW5wdXQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJICB1bnNpZ25lZCBpbnQgKmkpCit7CisJKmkgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHpyMzY0eHhfdmlkaW9jX3NfaW5wdXQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJICB1bnNpZ25lZCBpbnQgaSkKK3sKKwlpZiAoaSAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB6cjM2NHh4X3ZpZGlvY19xdWVyeWN0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJICAgIHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqYykKK3sKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKKwlzdHJ1Y3QgenIzNjR4eF9jYW1lcmEgKmNhbTsKKworCWlmICh2ZGV2ID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOworCWNhbSA9IHZpZGVvX2dldF9kcnZkYXRhKHZkZXYpOworCisJc3dpdGNoIChjLT5pZCkgeworCWNhc2UgVjRMMl9DSURfQlJJR0hUTkVTUzoKKwkJYy0+dHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVI7CisJCXN0cmNweShjLT5uYW1lLCAiQnJpZ2h0bmVzcyIpOworCQljLT5taW5pbXVtID0gMDsKKwkJYy0+bWF4aW11bSA9IDEyNzsKKwkJYy0+c3RlcCA9IDE7CisJCWMtPmRlZmF1bHRfdmFsdWUgPSBjYW0tPmJyaWdodG5lc3M7CisJCWMtPmZsYWdzID0gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHpyMzY0eHhfdmlkaW9jX3NfY3RybChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQkgc3RydWN0IHY0bDJfY29udHJvbCAqYykKK3sKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKKwlzdHJ1Y3QgenIzNjR4eF9jYW1lcmEgKmNhbTsKKworCWlmICh2ZGV2ID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOworCWNhbSA9IHZpZGVvX2dldF9kcnZkYXRhKHZkZXYpOworCisJc3dpdGNoIChjLT5pZCkgeworCWNhc2UgVjRMMl9DSURfQlJJR0hUTkVTUzoKKwkJY2FtLT5icmlnaHRuZXNzID0gYy0+dmFsdWU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB6cjM2NHh4X3ZpZGlvY19nX2N0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmMpCit7CisJc3RydWN0IHZpZGVvX2RldmljZSAqdmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7CisJc3RydWN0IHpyMzY0eHhfY2FtZXJhICpjYW07CisKKwlpZiAodmRldiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKwljYW0gPSB2aWRlb19nZXRfZHJ2ZGF0YSh2ZGV2KTsKKworCXN3aXRjaCAoYy0+aWQpIHsKKwljYXNlIFY0TDJfQ0lEX0JSSUdIVE5FU1M6CisJCWMtPnZhbHVlID0gY2FtLT5icmlnaHRuZXNzOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgenIzNjR4eF92aWRpb2NfZW51bV9mbXRfY2FwKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCSAgICAgICB2b2lkICpwcml2LCBzdHJ1Y3QgdjRsMl9mbXRkZXNjICpmKQoreworCWlmIChmLT5pbmRleCA+IDApCisJCXJldHVybiAtRUlOVkFMOworCWlmIChmLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJbWVtc2V0KGYsIDAsIHNpemVvZigqZikpOworCWYtPmluZGV4ID0gMDsKKwlmLT50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOworCWYtPmZsYWdzID0gVjRMMl9GTVRfRkxBR19DT01QUkVTU0VEOworCXN0cmNweShmLT5kZXNjcmlwdGlvbiwgIkpQRUciKTsKKwlmLT5waXhlbGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9KUEVHOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHpyMzY0eHhfdmlkaW9jX3RyeV9mbXRfY2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCSAgICAgIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKK3sKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKKwlzdHJ1Y3QgenIzNjR4eF9jYW1lcmEgKmNhbTsKKworCWlmICh2ZGV2ID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOworCWNhbSA9IHZpZGVvX2dldF9kcnZkYXRhKHZkZXYpOworCisJaWYgKGYtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoZi0+Zm10LnBpeC5waXhlbGZvcm1hdCAhPSBWNEwyX1BJWF9GTVRfSlBFRykKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGYtPmZtdC5waXguZmllbGQgIT0gVjRMMl9GSUVMRF9BTlkgJiYKKwkgICAgZi0+Zm10LnBpeC5maWVsZCAhPSBWNEwyX0ZJRUxEX05PTkUpCisJCXJldHVybiAtRUlOVkFMOworCWYtPmZtdC5waXguZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7CisJZi0+Zm10LnBpeC53aWR0aCA9IGNhbS0+d2lkdGg7CisJZi0+Zm10LnBpeC5oZWlnaHQgPSBjYW0tPmhlaWdodDsKKwlmLT5mbXQucGl4LmJ5dGVzcGVybGluZSA9IGYtPmZtdC5waXgud2lkdGggKiAyOworCWYtPmZtdC5waXguc2l6ZWltYWdlID0gZi0+Zm10LnBpeC5oZWlnaHQgKiBmLT5mbXQucGl4LmJ5dGVzcGVybGluZTsKKwlmLT5mbXQucGl4LmNvbG9yc3BhY2UgPSAwOworCWYtPmZtdC5waXgucHJpdiA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgenIzNjR4eF92aWRpb2NfZ19mbXRfY2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCSAgICBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCit7CisJc3RydWN0IHZpZGVvX2RldmljZSAqdmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7CisJc3RydWN0IHpyMzY0eHhfY2FtZXJhICpjYW07CisKKwlpZiAodmRldiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKwljYW0gPSB2aWRlb19nZXRfZHJ2ZGF0YSh2ZGV2KTsKKworCWlmIChmLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJbWVtc2V0KCZmLT5mbXQucGl4LCAwLCBzaXplb2Yoc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCkpOworCWYtPnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7CisJZi0+Zm10LnBpeC5waXhlbGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9KUEVHOworCWYtPmZtdC5waXguZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7CisJZi0+Zm10LnBpeC53aWR0aCA9IGNhbS0+d2lkdGg7CisJZi0+Zm10LnBpeC5oZWlnaHQgPSBjYW0tPmhlaWdodDsKKwlmLT5mbXQucGl4LmJ5dGVzcGVybGluZSA9IGYtPmZtdC5waXgud2lkdGggKiAyOworCWYtPmZtdC5waXguc2l6ZWltYWdlID0gZi0+Zm10LnBpeC5oZWlnaHQgKiBmLT5mbXQucGl4LmJ5dGVzcGVybGluZTsKKwlmLT5mbXQucGl4LmNvbG9yc3BhY2UgPSAwOworCWYtPmZtdC5waXgucHJpdiA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgenIzNjR4eF92aWRpb2Nfc19mbXRfY2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCSAgICBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCit7CisJc3RydWN0IHZpZGVvX2RldmljZSAqdmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7CisJc3RydWN0IHpyMzY0eHhfY2FtZXJhICpjYW07CisKKwlpZiAodmRldiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKwljYW0gPSB2aWRlb19nZXRfZHJ2ZGF0YSh2ZGV2KTsKKworCWlmIChmLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGYtPmZtdC5waXgucGl4ZWxmb3JtYXQgIT0gVjRMMl9QSVhfRk1UX0pQRUcpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChmLT5mbXQucGl4LmZpZWxkICE9IFY0TDJfRklFTERfQU5ZICYmCisJICAgIGYtPmZtdC5waXguZmllbGQgIT0gVjRMMl9GSUVMRF9OT05FKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlmLT5mbXQucGl4LmZpZWxkID0gVjRMMl9GSUVMRF9OT05FOworCWYtPmZtdC5waXgud2lkdGggPSBjYW0tPndpZHRoOworCWYtPmZtdC5waXguaGVpZ2h0ID0gY2FtLT5oZWlnaHQ7CisJZi0+Zm10LnBpeC5ieXRlc3BlcmxpbmUgPSBmLT5mbXQucGl4LndpZHRoICogMjsKKwlmLT5mbXQucGl4LnNpemVpbWFnZSA9IGYtPmZtdC5waXguaGVpZ2h0ICogZi0+Zm10LnBpeC5ieXRlc3BlcmxpbmU7CisJZi0+Zm10LnBpeC5jb2xvcnNwYWNlID0gMDsKKwlmLT5mbXQucGl4LnByaXYgPSAwOworCURCRygib2shIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgenIzNjR4eF92aWRpb2Nfc3RyZWFtb24oc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJICAgZW51bSB2NGwyX2J1Zl90eXBlIHR5cGUpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgenIzNjR4eF92aWRpb2Nfc3RyZWFtb2ZmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCSAgICBlbnVtIHY0bDJfYnVmX3R5cGUgdHlwZSkKK3sKKwlyZXR1cm4gMDsKK30KKworCisvKiBvcGVuIHRoZSBjYW1lcmEgKi8KK3N0YXRpYyBpbnQgenIzNjR4eF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOworCXN0cnVjdCB6cjM2NHh4X2NhbWVyYSAqY2FtID0gdmlkZW9fZ2V0X2RydmRhdGEodmRldik7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBjYW0tPnVkZXY7CisJaW50IGksIGVycjsKKworCURCRygienIzNjR4eF9vcGVuIik7CisKKwljYW0tPnNraXAgPSAyOworCisJZXJyID0gdmlkZW9fZXhjbHVzaXZlX29wZW4oaW5vZGUsIGZpbGUpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJaWYgKCFjYW0tPmZyYW1lYnVmKSB7CisJCWNhbS0+ZnJhbWVidWYgPSB2bWFsbG9jXzMyKE1BWF9GUkFNRV9TSVpFICogRlJBTUVTKTsKKwkJaWYgKCFjYW0tPmZyYW1lYnVmKSB7CisJCQlpbmZvKCJ2bWFsbG9jXzMyIGZhaWxlZCEiKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJfQorCisJbXV0ZXhfbG9jaygmY2FtLT5sb2NrKTsKKwlmb3IgKGkgPSAwOyBpbml0W2NhbS0+bWV0aG9kXVtpXS5zaXplICE9IC0xOyBpKyspIHsKKwkJZXJyID0KKwkJICAgIHNlbmRfY29udHJvbF9tc2codWRldiwgMSwgaW5pdFtjYW0tPm1ldGhvZF1baV0udmFsdWUsCisJCQkJICAgICAwLCBpbml0W2NhbS0+bWV0aG9kXVtpXS5ieXRlcywKKwkJCQkgICAgIGluaXRbY2FtLT5tZXRob2RdW2ldLnNpemUpOworCQlpZiAoZXJyIDwgMCkgeworCQkJaW5mbygiZXJyb3IgZHVyaW5nIG9wZW4gc2VxdWVuY2U6ICVkIiwgaSk7CisJCQltdXRleF91bmxvY2soJmNhbS0+bG9jayk7CisJCQlyZXR1cm4gZXJyOworCQl9CisJfQorCisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gdmRldjsKKworCS8qIEFkZGVkIHNvbWUgZGVsYXkgaGVyZSwgc2luY2Ugb3BlbmluZy9jbG9zaW5nIHRoZSBjYW1lcmEgcXVpY2tseSwKKwkgKiBsaWtlIEVraWdhIGRvZXMgZHVyaW5nIGl0cyBzdGFydHVwLCBjYW4gY3Jhc2ggdGhlIHdlYmNhbQorCSAqLworCW1kZWxheSgxMDApOworCisJbXV0ZXhfdW5sb2NrKCZjYW0tPmxvY2spOworCXJldHVybiAwOworfQorCisKKy8qIHJlbGVhc2UgdGhlIGNhbWVyYSAqLworc3RhdGljIGludCB6cjM2NHh4X3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHZpZGVvX2RldmljZSAqdmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7CisJc3RydWN0IHpyMzY0eHhfY2FtZXJhICpjYW07CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXY7CisJaW50IGksIGVycjsKKworCURCRygienIzNjR4eF9yZWxlYXNlIik7CisKKwlpZiAodmRldiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKwljYW0gPSB2aWRlb19nZXRfZHJ2ZGF0YSh2ZGV2KTsKKworCXVkZXYgPSBjYW0tPnVkZXY7CisKKwltdXRleF9sb2NrKCZjYW0tPmxvY2spOworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJZXJyID0KKwkJICAgIHNlbmRfY29udHJvbF9tc2codWRldiwgMSwgaW5pdFtjYW0tPm1ldGhvZF1baV0udmFsdWUsCisJCQkJICAgICAwLCBpbml0W2ldW2NhbS0+bWV0aG9kXS5ieXRlcywKKwkJCQkgICAgIGluaXRbY2FtLT5tZXRob2RdW2ldLnNpemUpOworCQlpZiAoZXJyIDwgMCkgeworCQkJaW5mbygiZXJyb3IgZHVyaW5nIHJlbGVhc2Ugc2VxdWVuY2UiKTsKKwkJCW11dGV4X3VubG9jaygmY2FtLT5sb2NrKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwl9CisKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBOVUxMOworCXZpZGVvX2V4Y2x1c2l2ZV9yZWxlYXNlKGlub2RlLCBmaWxlKTsKKworCS8qIEFkZGVkIHNvbWUgZGVsYXkgaGVyZSwgc2luY2Ugb3BlbmluZy9jbG9zaW5nIHRoZSBjYW1lcmEgcXVpY2tseSwKKwkgKiBsaWtlIEVraWdhIGRvZXMgZHVyaW5nIGl0cyBzdGFydHVwLCBjYW4gY3Jhc2ggdGhlIHdlYmNhbQorCSAqLworCW1kZWxheSgxMDApOworCisJbXV0ZXhfdW5sb2NrKCZjYW0tPmxvY2spOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgenIzNjR4eF9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwl2b2lkICpwb3M7CisJdW5zaWduZWQgbG9uZyBzdGFydCA9IHZtYS0+dm1fc3RhcnQ7CisJdW5zaWduZWQgbG9uZyBzaXplID0gdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0OworCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOworCXN0cnVjdCB6cjM2NHh4X2NhbWVyYSAqY2FtOworCisJREJHKCJ6cjM2NHh4X21tYXA6ICVsZFxuIiwgc2l6ZSk7CisKKwlpZiAodmRldiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKwljYW0gPSB2aWRlb19nZXRfZHJ2ZGF0YSh2ZGV2KTsKKworCXBvcyA9IGNhbS0+ZnJhbWVidWY7CisJd2hpbGUgKHNpemUgPiAwKSB7CisJCWlmICh2bV9pbnNlcnRfcGFnZSh2bWEsIHN0YXJ0LCB2bWFsbG9jX3RvX3BhZ2UocG9zKSkpCisJCQlyZXR1cm4gLUVBR0FJTjsKKwkJc3RhcnQgKz0gUEFHRV9TSVpFOworCQlwb3MgKz0gUEFHRV9TSVpFOworCQlpZiAoc2l6ZSA+IFBBR0VfU0laRSkKKwkJCXNpemUgLT0gUEFHRV9TSVpFOworCQllbHNlCisJCQlzaXplID0gMDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB6cjM2NHh4X2ZvcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLm9wZW4gPSB6cjM2NHh4X29wZW4sCisJLnJlbGVhc2UgPSB6cjM2NHh4X3JlbGVhc2UsCisJLnJlYWQgPSB6cjM2NHh4X3JlYWQsCisJLm1tYXAgPSB6cjM2NHh4X21tYXAsCisJLmlvY3RsID0gdmlkZW9faW9jdGwyLAorCS5sbHNlZWsgPSBub19sbHNlZWssCit9OworCitzdGF0aWMgc3RydWN0IHZpZGVvX2RldmljZSB6cjM2NHh4X3RlbXBsYXRlID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5uYW1lID0gRFJJVkVSX0RFU0MsCisJLnR5cGUgPSBWSURfVFlQRV9DQVBUVVJFLAorCS5mb3BzID0gJnpyMzY0eHhfZm9wcywKKwkucmVsZWFzZSA9IHZpZGVvX2RldmljZV9yZWxlYXNlLAorCS5taW5vciA9IC0xLAorCisJLnZpZGlvY19xdWVyeWNhcAk9IHpyMzY0eHhfdmlkaW9jX3F1ZXJ5Y2FwLAorCS52aWRpb2NfZW51bV9mbXRfY2FwCT0genIzNjR4eF92aWRpb2NfZW51bV9mbXRfY2FwLAorCS52aWRpb2NfdHJ5X2ZtdF9jYXAJPSB6cjM2NHh4X3ZpZGlvY190cnlfZm10X2NhcCwKKwkudmlkaW9jX3NfZm10X2NhcAk9IHpyMzY0eHhfdmlkaW9jX3NfZm10X2NhcCwKKwkudmlkaW9jX2dfZm10X2NhcAk9IHpyMzY0eHhfdmlkaW9jX2dfZm10X2NhcCwKKwkudmlkaW9jX2VudW1faW5wdXQJPSB6cjM2NHh4X3ZpZGlvY19lbnVtX2lucHV0LAorCS52aWRpb2NfZ19pbnB1dAkJPSB6cjM2NHh4X3ZpZGlvY19nX2lucHV0LAorCS52aWRpb2Nfc19pbnB1dAkJPSB6cjM2NHh4X3ZpZGlvY19zX2lucHV0LAorCS52aWRpb2Nfc3RyZWFtb24JPSB6cjM2NHh4X3ZpZGlvY19zdHJlYW1vbiwKKwkudmlkaW9jX3N0cmVhbW9mZgk9IHpyMzY0eHhfdmlkaW9jX3N0cmVhbW9mZiwKKwkudmlkaW9jX3F1ZXJ5Y3RybAk9IHpyMzY0eHhfdmlkaW9jX3F1ZXJ5Y3RybCwKKwkudmlkaW9jX2dfY3RybAkJPSB6cjM2NHh4X3ZpZGlvY19nX2N0cmwsCisJLnZpZGlvY19zX2N0cmwJCT0genIzNjR4eF92aWRpb2Nfc19jdHJsLAorfTsKKworCisKKy8qKioqKioqKioqKioqKioqKioqLworLyogVVNCIGludGVncmF0aW9uICovCisvKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCB6cjM2NHh4X3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLAorCQkJIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CisJc3RydWN0IHpyMzY0eHhfY2FtZXJhICpjYW0gPSBOVUxMOworCisJREJHKCJwcm9iaW5nLi4uIik7CisKKwlpbmZvKERSSVZFUl9ERVNDICIgY29tcGF0aWJsZSB3ZWJjYW0gcGx1Z2dlZCIpOworCWluZm8oIm1vZGVsICUwNHg6JTA0eCBkZXRlY3RlZCIsIHVkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IsCisJICAgICB1ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCk7CisKKwlpZiAoKGNhbSA9CisJICAgICBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgenIzNjR4eF9jYW1lcmEpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkgeworCQlpbmZvKCJjYW06IG91dCBvZiBtZW1vcnkgISIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJbWVtc2V0KGNhbSwgMHgwMCwgc2l6ZW9mKHN0cnVjdCB6cjM2NHh4X2NhbWVyYSkpOworCS8qIHNhdmUgdGhlIGluaXQgbWV0aG9kIHVzZWQgYnkgdGhpcyBjYW1lcmEgKi8KKwljYW0tPm1ldGhvZCA9IGlkLT5kcml2ZXJfaW5mbzsKKworCWNhbS0+dmRldiA9IHZpZGVvX2RldmljZV9hbGxvYygpOworCWlmIChjYW0tPnZkZXYgPT0gTlVMTCkgeworCQlpbmZvKCJjYW0tPnZkZXY6IG91dCBvZiBtZW1vcnkgISIpOworCQlrZnJlZShjYW0pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJbWVtY3B5KGNhbS0+dmRldiwgJnpyMzY0eHhfdGVtcGxhdGUsIHNpemVvZih6cjM2NHh4X3RlbXBsYXRlKSk7CisJdmlkZW9fc2V0X2RydmRhdGEoY2FtLT52ZGV2LCBjYW0pOworCWlmIChkZWJ1ZykKKwkJY2FtLT52ZGV2LT5kZWJ1ZyA9IFY0TDJfREVCVUdfSU9DVEwgfCBWNEwyX0RFQlVHX0lPQ1RMX0FSRzsKKworCWNhbS0+dWRldiA9IHVkZXY7CisKKwlpZiAoKGNhbS0+YnVmZmVyID0ga21hbGxvYyhCVUZGRVJfU0laRSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpIHsKKwkJaW5mbygiY2FtLT5idWZmZXI6IG91dCBvZiBtZW1vcnkgISIpOworCQl2aWRlb19kZXZpY2VfcmVsZWFzZShjYW0tPnZkZXYpOworCQlrZnJlZShjYW0pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIDE6CisJCWluZm8oIjE2MHgxMjAgbW9kZSBzZWxlY3RlZCIpOworCQljYW0tPndpZHRoID0gMTYwOworCQljYW0tPmhlaWdodCA9IDEyMDsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlpbmZvKCI2NDB4NDgwIG1vZGUgc2VsZWN0ZWQiKTsKKwkJY2FtLT53aWR0aCA9IDY0MDsKKwkJY2FtLT5oZWlnaHQgPSA0ODA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWluZm8oIjMyMHgyNDAgbW9kZSBzZWxlY3RlZCIpOworCQljYW0tPndpZHRoID0gMzIwOworCQljYW0tPmhlaWdodCA9IDI0MDsKKwkJYnJlYWs7CisJfQorCisJbTBkMVswXSA9IG1vZGU7CisJbTFbMl0udmFsdWUgPSAweGYwMDAgKyBtb2RlOworCW0yWzFdLnZhbHVlID0gMHhmMDAwICsgbW9kZTsKKwloZWFkZXIyWzQzN10gPSBjYW0tPmhlaWdodCAvIDI1NjsKKwloZWFkZXIyWzQzOF0gPSBjYW0tPmhlaWdodCAlIDI1NjsKKwloZWFkZXIyWzQzOV0gPSBjYW0tPndpZHRoIC8gMjU2OworCWhlYWRlcjJbNDQwXSA9IGNhbS0+d2lkdGggJSAyNTY7CisKKwljYW0tPm5iID0gMDsKKwljYW0tPmJyaWdodG5lc3MgPSA2NDsKKwltdXRleF9pbml0KCZjYW0tPmxvY2spOworCisJaWYgKHZpZGVvX3JlZ2lzdGVyX2RldmljZShjYW0tPnZkZXYsIFZGTF9UWVBFX0dSQUJCRVIsIC0xKSA9PSAtMSkgeworCQlpbmZvKCJ2aWRlb19yZWdpc3Rlcl9kZXZpY2UgZmFpbGVkIik7CisJCXZpZGVvX2RldmljZV9yZWxlYXNlKGNhbS0+dmRldik7CisJCWtmcmVlKGNhbS0+YnVmZmVyKTsKKwkJa2ZyZWUoY2FtKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBjYW0pOworCisJaW5mbyhEUklWRVJfREVTQyAiIGNvbnRyb2xsaW5nIHZpZGVvIGRldmljZSAlZCIsIGNhbS0+dmRldi0+bWlub3IpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIHpyMzY0eHhfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlzdHJ1Y3QgenIzNjR4eF9jYW1lcmEgKmNhbSA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CisJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBOVUxMKTsKKwlkZXZfc2V0X2RydmRhdGEoJmludGYtPmRldiwgTlVMTCk7CisJaW5mbyhEUklWRVJfREVTQyAiIHdlYmNhbSB1bnBsdWdnZWQiKTsKKwlpZiAoY2FtLT52ZGV2KQorCQl2aWRlb191bnJlZ2lzdGVyX2RldmljZShjYW0tPnZkZXYpOworCWNhbS0+dmRldiA9IE5VTEw7CisJa2ZyZWUoY2FtLT5idWZmZXIpOworCWlmIChjYW0tPmZyYW1lYnVmKQorCQl2ZnJlZShjYW0tPmZyYW1lYnVmKTsKKwlrZnJlZShjYW0pOworfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKiovCisvKiBNb2R1bGUgaW50ZWdyYXRpb24gKi8KKy8qKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgenIzNjR4eF9kcml2ZXIgPSB7CisJLm5hbWUgPSAienIzNjR4eCIsCisJLnByb2JlID0genIzNjR4eF9wcm9iZSwKKwkuZGlzY29ubmVjdCA9IHpyMzY0eHhfZGlzY29ubmVjdCwKKwkuaWRfdGFibGUgPSBkZXZpY2VfdGFibGUKK307CisKKworc3RhdGljIGludCBfX2luaXQgenIzNjR4eF9pbml0KHZvaWQpCit7CisJaW50IHJldHZhbDsKKwlyZXR2YWwgPSB1c2JfcmVnaXN0ZXIoJnpyMzY0eHhfZHJpdmVyKSA8IDA7CisJaWYgKHJldHZhbCkKKwkJaW5mbygidXNiX3JlZ2lzdGVyIGZhaWxlZCEiKTsKKwllbHNlCisJCWluZm8oRFJJVkVSX0RFU0MgIiBtb2R1bGUgbG9hZGVkIik7CisJcmV0dXJuIHJldHZhbDsKK30KKworCitzdGF0aWMgdm9pZCBfX2V4aXQgenIzNjR4eF9leGl0KHZvaWQpCit7CisJaW5mbyhEUklWRVJfREVTQyAiIG1vZHVsZSB1bmxvYWRlZCIpOworCXVzYl9kZXJlZ2lzdGVyKCZ6cjM2NHh4X2RyaXZlcik7Cit9CisKKworbW9kdWxlX2luaXQoenIzNjR4eF9pbml0KTsKK21vZHVsZV9leGl0KHpyMzY0eHhfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoRFJJVkVSX0FVVEhPUik7CitNT0RVTEVfREVTQ1JJUFRJT04oRFJJVkVSX0RFU0MpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRsYW4uYyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0bGFuLmMKaW5kZXggYjY5MTI5Mi4uN2RkMzRiZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRsYW4uYworKysgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGxhbi5jCkBAIC03MTQsNiArNzE0LDcgQEAKIAlMQU5TZW5kUmVxdWVzdF90ICpwU2VuZFJlcTsKIAlTR0VUcmFuc2FjdGlvbjMyX3QgKnBUcmFuczsKIAlTR0VTaW1wbGU2NF90ICpwU2ltcGxlOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKm1hYzsKIAlkbWFfYWRkcl90IGRtYTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBjdHg7CkBAIC03NTMsNyArNzU0LDcgQEAKIAkvKiBTZXQgdGhlIG1hYy5yYXcgcG9pbnRlciwgc2luY2UgdGhpcyBhcHBhcmVudGx5IGlzbid0IGdldHRpbmcKIAkgKiBkb25lIGJlZm9yZSB3ZSBnZXQgdGhlIHNrYi4gUHVsbCB0aGUgZGF0YSBwb2ludGVyIHBhc3QgdGhlIG1hYyBkYXRhLgogCSAqLwotCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKwlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwogCXNrYl9wdWxsKHNrYiwgMTIpOwogCiAgICAgICAgIGRtYSA9IHBjaV9tYXBfc2luZ2xlKG1wdF9kZXYtPnBjaWRldiwgc2tiLT5kYXRhLCBza2ItPmxlbiwKQEAgLTc4NCw2ICs3ODUsNyBAQAogLy8JCQlJT0NfQU5EX05FVERFVl9OQU1FU19zX3MoZGV2KSwKIC8vCQkJY3R4LCBza2IsIHNrYi0+ZGF0YSkpOwogCisJbWFjID0gc2tiX21hY19oZWFkZXIoc2tiKTsKICNpZmRlZiBRTE9HSUNfTkFBX1dPUktBUk9VTkQKIHsKIAlzdHJ1Y3QgTkFBX0hvc2VkICpuaDsKQEAgLTc5MywxMiArNzk1LDEyIEBACiAJICAgZHJvcHMuICovCiAJcmVhZF9sb2NrX2lycSgmYmFkX25hYV9sb2NrKTsKIAlmb3IgKG5oID0gbXB0X2JhZF9uYWE7IG5oICE9IE5VTEw7IG5oPW5oLT5uZXh0KSB7Ci0JCWlmICgobmgtPmllZWVbMF0gPT0gc2tiLT5tYWMucmF3WzBdKSAmJgotCQkgICAgKG5oLT5pZWVlWzFdID09IHNrYi0+bWFjLnJhd1sxXSkgJiYKLQkJICAgIChuaC0+aWVlZVsyXSA9PSBza2ItPm1hYy5yYXdbMl0pICYmCi0JCSAgICAobmgtPmllZWVbM10gPT0gc2tiLT5tYWMucmF3WzNdKSAmJgotCQkgICAgKG5oLT5pZWVlWzRdID09IHNrYi0+bWFjLnJhd1s0XSkgJiYKLQkJICAgIChuaC0+aWVlZVs1XSA9PSBza2ItPm1hYy5yYXdbNV0pKSB7CisJCWlmICgobmgtPmllZWVbMF0gPT0gbWFjWzBdKSAmJgorCQkgICAgKG5oLT5pZWVlWzFdID09IG1hY1sxXSkgJiYKKwkJICAgIChuaC0+aWVlZVsyXSA9PSBtYWNbMl0pICYmCisJCSAgICAobmgtPmllZWVbM10gPT0gbWFjWzNdKSAmJgorCQkgICAgKG5oLT5pZWVlWzRdID09IG1hY1s0XSkgJiYKKwkJICAgIChuaC0+aWVlZVs1XSA9PSBtYWNbNV0pKSB7CiAJCQljdXJfbmFhID0gbmgtPk5BQTsKIAkJCWRscHJpbnRrICgoS0VSTl9JTkZPICJtcHRsYW4vc2R1X3NlbmQ6IHVzaW5nIE5BQSB2YWx1ZSAiCiAJCQkJICAiPSAlMDR4LlxuIiwgY3VyX25hYSkpOwpAQCAtODEwLDEyICs4MTIsMTIgQEAKICNlbmRpZgogCiAJcFRyYW5zLT5UcmFuc2FjdGlvbkRldGFpbHNbMF0gPSBjcHVfdG9fbGUzMigoY3VyX25hYSAgICAgICAgIDw8IDE2KSB8Ci0JCQkJCQkgICAgKHNrYi0+bWFjLnJhd1swXSA8PCAgOCkgfAotCQkJCQkJICAgIChza2ItPm1hYy5yYXdbMV0gPDwgIDApKTsKLQlwVHJhbnMtPlRyYW5zYWN0aW9uRGV0YWlsc1sxXSA9IGNwdV90b19sZTMyKChza2ItPm1hYy5yYXdbMl0gPDwgMjQpIHwKLQkJCQkJCSAgICAoc2tiLT5tYWMucmF3WzNdIDw8IDE2KSB8Ci0JCQkJCQkgICAgKHNrYi0+bWFjLnJhd1s0XSA8PCAgOCkgfAotCQkJCQkJICAgIChza2ItPm1hYy5yYXdbNV0gPDwgIDApKTsKKwkJCQkJCSAgICAobWFjWzBdIDw8ICA4KSB8CisJCQkJCQkgICAgKG1hY1sxXSA8PCAgMCkpOworCXBUcmFucy0+VHJhbnNhY3Rpb25EZXRhaWxzWzFdID0gY3B1X3RvX2xlMzIoKG1hY1syXSA8PCAyNCkgfAorCQkJCQkJICAgIChtYWNbM10gPDwgMTYpIHwKKwkJCQkJCSAgICAobWFjWzRdIDw8ICA4KSB8CisJCQkJCQkgICAgKG1hY1s1XSA8PCAgMCkpOwogCiAJcFNpbXBsZSA9IChTR0VTaW1wbGU2NF90ICopICZwVHJhbnMtPlRyYW5zYWN0aW9uRGV0YWlsc1syXTsKIApAQCAtOTMwLDcgKzkzMiw3IEBACiAJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdShtcHRfZGV2LT5wY2lkZXYsIHByaXYtPlJjdkN0bFtjdHhdLmRtYSwKIAkJCQkJICAgIHByaXYtPlJjdkN0bFtjdHhdLmxlbiwgUENJX0RNQV9GUk9NREVWSUNFKTsKIAotCQltZW1jcHkoc2tiX3B1dChza2IsIGxlbiksIG9sZF9za2ItPmRhdGEsIGxlbik7CisJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEob2xkX3NrYiwgc2tiX3B1dChza2IsIGxlbiksIGxlbik7CiAKIAkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKG1wdF9kZXYtPnBjaWRldiwgcHJpdi0+UmN2Q3RsW2N0eF0uZG1hLAogCQkJCQkgICAgICAgcHJpdi0+UmN2Q3RsW2N0eF0ubGVuLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOwpAQCAtMTA5MSw3ICsxMDkzLDcgQEAKIAkJCQkJCSAgICBwcml2LT5SY3ZDdGxbY3R4XS5kbWEsCiAJCQkJCQkgICAgcHJpdi0+UmN2Q3RsW2N0eF0ubGVuLAogCQkJCQkJICAgIFBDSV9ETUFfRlJPTURFVklDRSk7Ci0JCQltZW1jcHkoc2tiX3B1dChza2IsIGwpLCBvbGRfc2tiLT5kYXRhLCBsKTsKKwkJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEob2xkX3NrYiwgc2tiX3B1dChza2IsIGwpLCBsKTsKIAogCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKG1wdF9kZXYtPnBjaWRldiwKIAkJCQkJCSAgICAgICBwcml2LT5SY3ZDdGxbY3R4XS5kbWEsCkBAIC0xMTIwLDcgKzExMjIsNyBAQAogCQkJCQkgICAgcHJpdi0+UmN2Q3RsW2N0eF0ubGVuLAogCQkJCQkgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKIAotCQltZW1jcHkoc2tiX3B1dChza2IsIGxlbiksIG9sZF9za2ItPmRhdGEsIGxlbik7CisJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEob2xkX3NrYiwgc2tiX3B1dChza2IsIGxlbiksIGxlbik7CiAKIAkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKG1wdF9kZXYtPnBjaWRldiwKIAkJCQkJICAgICAgIHByaXYtPlJjdkN0bFtjdHhdLmRtYSwKQEAgLTE1NDksNyArMTU1MSw3IEBACiAJc3RydWN0IG1wdF9sYW5fb2hkciAqZmNoID0gKHN0cnVjdCBtcHRfbGFuX29oZHIgKilza2ItPmRhdGE7CiAJc3RydWN0IGZjbGxjICpmY2xsYzsKIAotCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKwlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwogCXNrYl9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCBtcHRfbGFuX29oZHIpKTsKIAogCWlmIChmY2gtPmR0eXBlID09IGh0b25zKDB4ZmZmZikpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9LY29uZmlnIGIvZHJpdmVycy9taXNjL0tjb25maWcKaW5kZXggODBiMTk5Zi4uYTNjNTI1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL0tjb25maWcKKysrIGIvZHJpdmVycy9taXNjL0tjb25maWcKQEAgLTExMiwxNCArMTEyLDcwIEBACiAJZGVwZW5kcyBvbiBYODYgJiYgQUNQSQogCXNlbGVjdCBCQUNLTElHSFRfQ0xBU1NfREVWSUNFCiAJICAtLS1oZWxwLS0tCi0JICBUaGlzIG1pbmktZHJpdmVyIGRyaXZlcyB0aGUgU05DIGRldmljZSBwcmVzZW50IGluIHRoZSBBQ1BJIEJJT1Mgb2YKLQkgIHRoZSBTb255IFZhaW8gbGFwdG9wcy4KKwkgIFRoaXMgbWluaS1kcml2ZXIgZHJpdmVzIHRoZSBTTkMgYW5kIFNQSUMgZGV2aWNlcyBwcmVzZW50IGluIHRoZSBBQ1BJCisJICBCSU9TIG9mIHRoZSBTb255IFZhaW8gbGFwdG9wcy4KIAotCSAgSXQgZ2l2ZXMgYWNjZXNzIHRvIHNvbWUgZXh0cmEgbGFwdG9wIGZ1bmN0aW9uYWxpdGllcy4gSW4gaXRzIGN1cnJlbnQKLQkgIGZvcm0sIHRoaXMgZHJpdmVyIGxldCB0aGUgdXNlciBzZXQgb3IgcXVlcnkgdGhlIHNjcmVlbiBicmlnaHRuZXNzCi0JICB0aHJvdWdoIHRoZSBiYWNrbGlnaHQgc3Vic3lzdGVtIGFuZCByZW1vdmUvYXBwbHkgcG93ZXIgdG8gc29tZQorCSAgSXQgZ2l2ZXMgYWNjZXNzIHRvIHNvbWUgZXh0cmEgbGFwdG9wIGZ1bmN0aW9uYWxpdGllcyBsaWtlIEJsdWV0b290aCwKKwkgIHNjcmVlbiBicmlnaHRuZXNzIGNvbnRyb2wsIEZuIGtleXMgYW5kIGFsbG93cyBwb3dlcmluZyBvbi9vZmYgc29tZQogCSAgZGV2aWNlcy4KIAogCSAgUmVhZCA8ZmlsZTpEb2N1bWVudGF0aW9uL3NvbnktbGFwdG9wLnR4dD4gZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAKK2NvbmZpZyBTT05ZX0xBUFRPUF9PTEQKKwlib29sICJTb255cGkgY29tcGF0aWJpbGl0eSIKKwlkZXBlbmRzIG9uIFNPTllfTEFQVE9QCisJICAtLS1oZWxwLS0tCisJICBCdWlsZCB0aGUgc29ueXBpIGRyaXZlciBjb21wYXRpYmlsaXR5IGNvZGUgaW50byB0aGUgc29ueS1sYXB0b3AgZHJpdmVyLgorCitjb25maWcgVEhJTktQQURfQUNQSQorCXRyaXN0YXRlICJUaGlua1BhZCBBQ1BJIExhcHRvcCBFeHRyYXMiCisJZGVwZW5kcyBvbiBYODYgJiYgQUNQSQorCXNlbGVjdCBCQUNLTElHSFRfQ0xBU1NfREVWSUNFCisJc2VsZWN0IEhXTU9OCisJLS0taGVscC0tLQorCSAgVGhpcyBpcyBhIGRyaXZlciBmb3IgdGhlIElCTSBhbmQgTGVub3ZvIFRoaW5rUGFkIGxhcHRvcHMuIEl0IGFkZHMKKwkgIHN1cHBvcnQgZm9yIEZuLUZ4IGtleSBjb21iaW5hdGlvbnMsIEJsdWV0b290aCBjb250cm9sLCB2aWRlbworCSAgb3V0cHV0IHN3aXRjaGluZywgVGhpbmtMaWdodCBjb250cm9sLCBVbHRyYUJheSBlamVjdCBhbmQgbW9yZS4KKwkgIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZHJpdmVyIHNlZSAKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vdGhpbmtwYWQtYWNwaS50eHQ+IGFuZCA8aHR0cDovL2libS1hY3BpLnNmLm5ldC8+IC4KKworCSAgVGhpcyBkcml2ZXIgd2FzIGZvcm1lbHkga25vd24gYXMgaWJtLWFjcGkuCisKKwkgIElmIHlvdSBoYXZlIGFuIElCTSBvciBMZW5vdm8gVGhpbmtQYWQgbGFwdG9wLCBzYXkgWSBvciBNIGhlcmUuCisKK2NvbmZpZyBUSElOS1BBRF9BQ1BJX0RFQlVHCisJYm9vbCAiVmVyYm9zZSBkZWJ1ZyBtb2RlIgorCWRlcGVuZHMgb24gVEhJTktQQURfQUNQSQorCWRlZmF1bHQgbgorCS0tLWhlbHAtLS0KKwkgIEVuYWJsZXMgZXh0cmEgZGVidWdnaW5nIGluZm9ybWF0aW9uLCBhdCB0aGUgZXhwZW5zZSBvZiBhIHNsaWdodGx5CisJICBpbmNyZWFzZSBpbiBkcml2ZXIgc2l6ZS4KKworCSAgSWYgeW91IGFyZSBub3Qgc3VyZSwgc2F5IE4gaGVyZS4KKworY29uZmlnIFRISU5LUEFEX0FDUElfRE9DSworCWJvb2wgIkxlZ2FjeSBEb2NraW5nIFN0YXRpb24gU3VwcG9ydCIKKwlkZXBlbmRzIG9uIFRISU5LUEFEX0FDUEkKKwlkZXBlbmRzIG9uIEFDUElfRE9DSz1uCisJZGVmYXVsdCBuCisJLS0taGVscC0tLQorCSAgQWxsb3dzIHRoZSB0aGlua3BhZF9hY3BpIGRyaXZlciB0byBoYW5kbGUgZG9ja2luZyBzdGF0aW9uIGV2ZW50cy4KKwkgIFRoaXMgc3VwcG9ydCB3YXMgbWFkZSBvYnNvbGV0ZSBieSB0aGUgZ2VuZXJpYyBBQ1BJIGRvY2tpbmcgc3RhdGlvbgorCSAgc3VwcG9ydCAoQ09ORklHX0FDUElfRE9DSykuICBJdCB3aWxsIGFsbG93IGxvY2tpbmcgYW5kIHJlbW92aW5nIHRoZQorCSAgbGFwdG9wIGZyb20gdGhlIGRvY2tpbmcgc3RhdGlvbiwgYnV0IHdpbGwgbm90IHByb3Blcmx5IGNvbm5lY3QgUENJCisJICBkZXZpY2VzLgorCisJICBJZiB5b3UgYXJlIG5vdCBzdXJlLCBzYXkgTiBoZXJlLgorCitjb25maWcgVEhJTktQQURfQUNQSV9CQVkKKwlib29sICJMZWdhY3kgUmVtb3ZhYmxlIEJheSBTdXBwb3J0IgorCWRlcGVuZHMgb24gVEhJTktQQURfQUNQSQorCWRlZmF1bHQgeQorCS0tLWhlbHAtLS0KKwkgIEFsbG93cyB0aGUgdGhpbmtwYWRfYWNwaSBkcml2ZXIgdG8gaGFuZGxlIHJlbW92YWJsZSBiYXlzLiAgSXQgd2lsbAorCSAgZWxldHJpY2FsbHkgZGlzYWJsZSB0aGUgZGV2aWNlIGluIHRoZSBiYXksIGFuZCBhbHNvIGdlbmVyYXRlCisJICBub3RpZmljYXRpb25zIHdoZW4gdGhlIGJheSBsZXZlciBpcyBlamVjdGVkIG9yIGluc2VydGVkLgorCisJICBJZiB5b3UgYXJlIG5vdCBzdXJlLCBzYXkgWSBoZXJlLgorCiBlbmRtZW51CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvTWFrZWZpbGUgYi9kcml2ZXJzL21pc2MvTWFrZWZpbGUKaW5kZXggNzc5M2NjZC4uZTMyNTE2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWlzYy9NYWtlZmlsZQpAQCAtMTIsMyArMTIsNCBAQAogb2JqLSQoQ09ORklHX1RJRk1fN1hYMSkgICAgICAgCSs9IHRpZm1fN3h4MS5vCiBvYmotJChDT05GSUdfU0dJX0lPQzQpCQkrPSBpb2M0Lm8KIG9iai0kKENPTkZJR19TT05ZX0xBUFRPUCkJKz0gc29ueS1sYXB0b3Aubworb2JqLSQoQ09ORklHX1RISU5LUEFEX0FDUEkpCSs9IHRoaW5rcGFkX2FjcGkubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2FzdXMtbGFwdG9wLmMgYi9kcml2ZXJzL21pc2MvYXN1cy1sYXB0b3AuYwppbmRleCA0YjIzMjEyLi42NWMzMmE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvYXN1cy1sYXB0b3AuYworKysgYi9kcml2ZXJzL21pc2MvYXN1cy1sYXB0b3AuYwpAQCAtMyw3ICszLDcgQEAKICAqCiAgKgogICogIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IEp1bGllbiBMZXJvdWdlLCAyMDAzLTIwMDYgS2Fyb2wgS296aW1vcgotICogIENvcHlyaWdodCAoQykgMjAwNiBDb3JlbnRpbiBDaGFyeQorICogIENvcHlyaWdodCAoQykgMjAwNi0yMDA3IENvcmVudGluIENoYXJ5CiAgKgogICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTQ4LDcgKzQ4LDcgQEAKICNpbmNsdWRlIDxhY3BpL2FjcGlfYnVzLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAotI2RlZmluZSBBU1VTX0xBUFRPUF9WRVJTSU9OICIwLjQwIgorI2RlZmluZSBBU1VTX0xBUFRPUF9WRVJTSU9OICIwLjQxIgogCiAjZGVmaW5lIEFTVVNfSE9US19OQU1FICAgICAgICAgICJBc3VzIExhcHRvcCBTdXBwb3J0IgogI2RlZmluZSBBU1VTX0hPVEtfQ0xBU1MgICAgICAgICAiaG90a2V5IgpAQCAtODEsNyArODEsOCBAQAogI2RlZmluZSBUTEVEX09OICAgICAweDA4CS8vdG91Y2hwYWQgTEVECiAjZGVmaW5lIFJMRURfT04gICAgIDB4MTAJLy9SZWNvcmQgTEVECiAjZGVmaW5lIFBMRURfT04gICAgIDB4MjAJLy9QaG9uZSBMRUQKLSNkZWZpbmUgTENEX09OICAgICAgMHg0MAkvL0xDRCBiYWNrbGlnaHQKKyNkZWZpbmUgR0xFRF9PTiAgICAgMHg0MAkvL0dhbWluZyBMRUQKKyNkZWZpbmUgTENEX09OICAgICAgMHg4MAkvL0xDRCBiYWNrbGlnaHQKIAogI2RlZmluZSBBU1VTX0xPRyAgICBBU1VTX0hPVEtfRklMRSAiOiAiCiAjZGVmaW5lIEFTVVNfRVJSICAgIEtFUk5fRVJSICAgIEFTVVNfTE9HCkBAIC05NCw2ICs5NSwxOSBAQAogTU9EVUxFX0RFU0NSSVBUSU9OKEFTVVNfSE9US19OQU1FKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAorLyogV0FQRiBkZWZpbmVzIHRoZSBiZWhhdmlvciBvZiB0aGUgRm4rRnggd2xhbiBrZXkKKyAqIFRoZSBzaWduaWZpY2FuY2Ugb2YgdmFsdWVzIGlzIHlldCB0byBiZSBmb3VuZCwgYnV0CisgKiBtb3N0IG9mIHRoZSB0aW1lOgorICogMHgwIHdpbGwgZG8gbm90aGluZworICogMHgxIHdpbGwgYWxsb3cgdG8gY29udHJvbCB0aGUgZGV2aWNlIHdpdGggRm4rRngga2V5LgorICogMHg0IHdpbGwgc2VuZCBhbiBBQ1BJIGV2ZW50ICgweDg4KSB3aGlsZSBwcmVzc2luZyB0aGUgRm4rRngga2V5CisgKiAweDUgbGlrZSAweDEgb3IgMHg0CisgKiBTbywgaWYgc29tZXRoaW5nIGRvZXNuJ3Qgd29yayBhcyB5b3Ugd2FudCwganVzdCB0cnkgb3RoZXIgdmFsdWVzID0pCisgKi8KK3N0YXRpYyB1aW50IHdhcGYgPSAxOworbW9kdWxlX3BhcmFtKHdhcGYsIHVpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyh3YXBmLCAiV0FQRiB2YWx1ZSIpOworCiAjZGVmaW5lIEFTVVNfSEFORExFKG9iamVjdCwgcGF0aHMuLi4pCQkJCQlcCiAJc3RhdGljIGFjcGlfaGFuZGxlICBvYmplY3QjI19oYW5kbGUgPSBOVUxMOwkJCVwKIAlzdGF0aWMgY2hhciAqb2JqZWN0IyNfcGF0aHNbXSA9IHsgcGF0aHMgfQpAQCAtMTAzLDYgKzExNyw3IEBACiBBU1VTX0hBTkRMRSh0bGVkX3NldCwgQVNVU19IT1RLX1BSRUZJWCAiVExFRCIpOwogQVNVU19IQU5ETEUocmxlZF9zZXQsIEFTVVNfSE9US19QUkVGSVggIlJMRUQiKTsJLyogVzFKQyAqLwogQVNVU19IQU5ETEUocGxlZF9zZXQsIEFTVVNfSE9US19QUkVGSVggIlBMRUQiKTsJLyogQTdKICovCitBU1VTX0hBTkRMRShnbGVkX3NldCwgQVNVU19IT1RLX1BSRUZJWCAiR0xFRCIpOwkvKiBHMSwgRzIgKHByb2JhYmx5KSAqLwogCiAvKiBMRUREICovCiBBU1VTX0hBTkRMRShsZWRkX3NldCwgQVNVU19IT1RLX1BSRUZJWCAiU0xDTSIpOwpAQCAtMjIxLDYgKzIzNiw3IEBACiBBU1VTX0xFRCh0bGVkLCAidG91Y2hwYWQiKTsKIEFTVVNfTEVEKHJsZWQsICJyZWNvcmQiKTsKIEFTVVNfTEVEKHBsZWQsICJwaG9uZSIpOworQVNVU19MRUQoZ2xlZCwgImdhbWluZyIpOwogCiAvKgogICogVGhpcyBmdW5jdGlvbiBldmFsdWF0ZXMgYW4gQUNQSSBtZXRob2QsIGdpdmVuIGFuIGludCBhcyBwYXJhbWV0ZXIsIHRoZQpAQCAtMjQ1LDMyICsyNjEsMTkgQEAKIAlyZXR1cm4gKHN0YXR1cyA9PSBBRV9PSyk7CiB9CiAKLXN0YXRpYyBpbnQgcmVhZF9hY3BpX2ludChhY3BpX2hhbmRsZSBoYW5kbGUsIGNvbnN0IGNoYXIgKm1ldGhvZCwgaW50ICp2YWwsCi0JCQkgc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QgKnBhcmFtcykKLXsKLQlzdHJ1Y3QgYWNwaV9idWZmZXIgb3V0cHV0OwotCXVuaW9uIGFjcGlfb2JqZWN0IG91dF9vYmo7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCi0Jb3V0cHV0Lmxlbmd0aCA9IHNpemVvZihvdXRfb2JqKTsKLQlvdXRwdXQucG9pbnRlciA9ICZvdXRfb2JqOwotCi0Jc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QoaGFuZGxlLCAoY2hhciAqKW1ldGhvZCwgcGFyYW1zLCAmb3V0cHV0KTsKLQkqdmFsID0gb3V0X29iai5pbnRlZ2VyLnZhbHVlOwotCXJldHVybiAoc3RhdHVzID09IEFFX09LKSAmJiAob3V0X29iai50eXBlID09IEFDUElfVFlQRV9JTlRFR0VSKTsKLX0KLQogc3RhdGljIGludCByZWFkX3dpcmVsZXNzX3N0YXR1cyhpbnQgbWFzaykKIHsKLQlpbnQgc3RhdHVzOworCXVsb25nIHN0YXR1czsKKwlhY3BpX3N0YXR1cyBydiA9IEFFX09LOwogCiAJaWYgKCF3aXJlbGVzc19zdGF0dXNfaGFuZGxlKQogCQlyZXR1cm4gKGhvdGstPnN0YXR1cyAmIG1hc2spID8gMSA6IDA7CiAKLQlpZiAocmVhZF9hY3BpX2ludCh3aXJlbGVzc19zdGF0dXNfaGFuZGxlLCBOVUxMLCAmc3RhdHVzLCBOVUxMKSkgewotCQlyZXR1cm4gKHN0YXR1cyAmIG1hc2spID8gMSA6IDA7Ci0JfSBlbHNlCisJcnYgPSBhY3BpX2V2YWx1YXRlX2ludGVnZXIod2lyZWxlc3Nfc3RhdHVzX2hhbmRsZSwgTlVMTCwgTlVMTCwgJnN0YXR1cyk7CisJaWYgKEFDUElfRkFJTFVSRShydikpCiAJCXByaW50ayhBU1VTX1dBUk5JTkcgIkVycm9yIHJlYWRpbmcgV2lyZWxlc3Mgc3RhdHVzXG4iKTsKKwllbHNlCisJCXJldHVybiAoc3RhdHVzICYgbWFzaykgPyAxIDogMDsKIAogCXJldHVybiAoaG90ay0+c3RhdHVzICYgbWFzaykgPyAxIDogMDsKIH0KQEAgLTI4NSwxOSArMjg4LDI4IEBACiAJcmV0dXJuIChob3RrLT5zdGF0dXMgJiBtYXNrKSA/IDEgOiAwOwogfQogCi1zdGF0aWMgdm9pZCB3cml0ZV9zdGF0dXMoYWNwaV9oYW5kbGUgaGFuZGxlLCBpbnQgb3V0LCBpbnQgbWFzaywgaW50IGludmVydCkKK3N0YXRpYyB2b2lkIHdyaXRlX3N0YXR1cyhhY3BpX2hhbmRsZSBoYW5kbGUsIGludCBvdXQsIGludCBtYXNrKQogewogCWhvdGstPnN0YXR1cyA9IChvdXQpID8gKGhvdGstPnN0YXR1cyB8IG1hc2spIDogKGhvdGstPnN0YXR1cyAmIH5tYXNrKTsKIAotCWlmIChpbnZlcnQpCQkvKiBpbnZlcnQgdGFyZ2V0IHZhbHVlICovCisJc3dpdGNoIChtYXNrKSB7CisJY2FzZSBNTEVEX09OOgogCQlvdXQgPSAhb3V0ICYgMHgxOworCQlicmVhazsKKwljYXNlIEdMRURfT046CisJCW91dCA9IChvdXQgJiAweDEpICsgMTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJb3V0ICY9IDB4MTsKKwkJYnJlYWs7CisJfQogCiAJaWYgKGhhbmRsZSAmJiAhd3JpdGVfYWNwaV9pbnQoaGFuZGxlLCBOVUxMLCBvdXQsIE5VTEwpKQotCQlwcmludGsoQVNVU19XQVJOSU5HICIgd3JpdGUgZmFpbGVkXG4iKTsKKwkJcHJpbnRrKEFTVVNfV0FSTklORyAiIHdyaXRlIGZhaWxlZCAleFxuIiwgbWFzayk7CiB9CiAKIC8qIC9zeXMvY2xhc3MvbGVkIGhhbmRsZXJzICovCi0jZGVmaW5lIEFTVVNfTEVEX0hBTkRMRVIob2JqZWN0LCBtYXNrLCBpbnZlcnQpCQkJCVwKKyNkZWZpbmUgQVNVU19MRURfSEFORExFUihvYmplY3QsIG1hc2spCQkJCQlcCiAJc3RhdGljIHZvaWQgb2JqZWN0IyNfbGVkX3NldChzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpsZWRfY2RldiwJXAogCQkJCSAgICAgZW51bSBsZWRfYnJpZ2h0bmVzcyB2YWx1ZSkJCVwKIAl7CQkJCQkJCQlcCkBAIC0zMDcsMTMgKzMxOSwxNCBAQAogCXN0YXRpYyB2b2lkIG9iamVjdCMjX2xlZF91cGRhdGUoc3RydWN0IHdvcmtfc3RydWN0ICppZ25vcmVkKQlcCiAJewkJCQkJCQkJXAogCQlpbnQgdmFsdWUgPSBvYmplY3QjI19sZWRfd2s7CQkJCVwKLQkJd3JpdGVfc3RhdHVzKG9iamVjdCMjX3NldF9oYW5kbGUsIHZhbHVlLCAobWFzayksIChpbnZlcnQpKTsgXAorCQl3cml0ZV9zdGF0dXMob2JqZWN0IyNfc2V0X2hhbmRsZSwgdmFsdWUsIChtYXNrKSk7CVwKIAl9CiAKLUFTVVNfTEVEX0hBTkRMRVIobWxlZCwgTUxFRF9PTiwgMSk7Ci1BU1VTX0xFRF9IQU5ETEVSKHBsZWQsIFBMRURfT04sIDApOwotQVNVU19MRURfSEFORExFUihybGVkLCBSTEVEX09OLCAwKTsKLUFTVVNfTEVEX0hBTkRMRVIodGxlZCwgVExFRF9PTiwgMCk7CitBU1VTX0xFRF9IQU5ETEVSKG1sZWQsIE1MRURfT04pOworQVNVU19MRURfSEFORExFUihwbGVkLCBQTEVEX09OKTsKK0FTVVNfTEVEX0hBTkRMRVIocmxlZCwgUkxFRF9PTik7CitBU1VTX0xFRF9IQU5ETEVSKHRsZWQsIFRMRURfT04pOworQVNVU19MRURfSEFORExFUihnbGVkLCBHTEVEX09OKTsKIAogc3RhdGljIGludCBnZXRfbGNkX3N0YXRlKHZvaWQpCiB7CkBAIC0zMzgsNyArMzUxLDcgQEAKIAkJCXByaW50ayhBU1VTX1dBUk5JTkcgIkVycm9yIHN3aXRjaGluZyBMQ0RcbiIpOwogCX0KIAotCXdyaXRlX3N0YXR1cyhOVUxMLCBsY2QsIExDRF9PTiwgMCk7CisJd3JpdGVfc3RhdHVzKE5VTEwsIGxjZCwgTENEX09OKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzU0LDkgKzM2NywxMSBAQAogCiBzdGF0aWMgaW50IHJlYWRfYnJpZ2h0bmVzcyhzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQpCiB7Ci0JaW50IHZhbHVlOworCXVsb25nIHZhbHVlOworCWFjcGlfc3RhdHVzIHJ2ID0gQUVfT0s7CiAKLQlpZiAoIXJlYWRfYWNwaV9pbnQoYnJpZ2h0bmVzc19nZXRfaGFuZGxlLCBOVUxMLCAmdmFsdWUsIE5VTEwpKQorCXJ2ID0gYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKGJyaWdodG5lc3NfZ2V0X2hhbmRsZSwgTlVMTCwgTlVMTCwgJnZhbHVlKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHJ2KSkKIAkJcHJpbnRrKEFTVVNfV0FSTklORyAiRXJyb3IgcmVhZGluZyBicmlnaHRuZXNzXG4iKTsKIAogCXJldHVybiB2YWx1ZTsKQEAgLTQwMyw4ICs0MTgsMTAgQEAKIAkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKnBhZ2UpCiB7CiAJaW50IGxlbiA9IDA7Ci0JaW50IHRlbXA7CisJdWxvbmcgdGVtcDsKIAljaGFyIGJ1ZlsxNl07CQkvL2Vub3VnaCBmb3IgYWxsIGluZm8KKwlhY3BpX3N0YXR1cyBydiA9IEFFX09LOworCiAJLyoKIAkgKiBXZSB1c2UgdGhlIGVhc3kgd2F5LCB3ZSBkb24ndCBjYXJlIG9mIG9mZiBhbmQgY291bnQsIHNvIHdlIGRvbid0IHNldCBlb2YKIAkgKiB0byAxCkBAIC00MTgsOSArNDM1LDEwIEBACiAJICogYml0IHNpZ25pZmllcyB0aGF0IHRoZSBsYXB0b3AgaXMgZXF1aXBwZWQgd2l0aCBhIFdpLUZpIE1pbmlQQ0kgY2FyZC4KIAkgKiBUaGUgc2lnbmlmaWNhbmNlIG9mIG90aGVycyBpcyB5ZXQgdG8gYmUgZm91bmQuCiAJICovCi0JaWYgKHJlYWRfYWNwaV9pbnQoaG90ay0+aGFuZGxlLCAiU0ZVTiIsICZ0ZW1wLCBOVUxMKSkKLQkJbGVuICs9Ci0JCSAgICBzcHJpbnRmKHBhZ2UgKyBsZW4sICJTRlVOIHZhbHVlICAgICAgICAgOiAweCUwNHhcbiIsIHRlbXApOworCXJ2ID0gYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKGhvdGstPmhhbmRsZSwgIlNGVU4iLCBOVUxMLCAmdGVtcCk7CisJaWYgKCFBQ1BJX0ZBSUxVUkUocnYpKQorCQlsZW4gKz0gc3ByaW50ZihwYWdlICsgbGVuLCAiU0ZVTiB2YWx1ZSAgICAgICAgIDogMHglMDR4XG4iLAorCQkJICAgICAgICh1aW50KSB0ZW1wKTsKIAkvKgogCSAqIEFub3RoZXIgdmFsdWUgZm9yIHVzZXJzcGFjZTogdGhlIEFTWU0gbWV0aG9kIHJldHVybnMgMHgwMiBmb3IKIAkgKiBiYXR0ZXJ5IGxvdyBhbmQgMHgwNCBmb3IgYmF0dGVyeSBjcml0aWNhbCwgaXRzIHJlYWRpbmdzIHRlbmQgdG8gYmUKQEAgLTQyOCw5ICs0NDYsMTAgQEAKIAkgKiBOb3RlOiBzaW5jZSBub3QgYWxsIHRoZSBsYXB0b3BzIHByb3ZpZGUgdGhpcyBtZXRob2QsIGVycm9ycyBhcmUKIAkgKiBzaWxlbnRseSBpZ25vcmVkLgogCSAqLwotCWlmIChyZWFkX2FjcGlfaW50KGhvdGstPmhhbmRsZSwgIkFTWU0iLCAmdGVtcCwgTlVMTCkpCi0JCWxlbiArPQotCQkgICAgc3ByaW50ZihwYWdlICsgbGVuLCAiQVNZTSB2YWx1ZSAgICAgICAgIDogMHglMDR4XG4iLCB0ZW1wKTsKKwlydiA9IGFjcGlfZXZhbHVhdGVfaW50ZWdlcihob3RrLT5oYW5kbGUsICJBU1lNIiwgTlVMTCwgJnRlbXApOworCWlmICghQUNQSV9GQUlMVVJFKHJ2KSkKKwkJbGVuICs9IHNwcmludGYocGFnZSArIGxlbiwgIkFTWU0gdmFsdWUgICAgICAgICA6IDB4JTA0eFxuIiwKKwkJCSAgICAgICAodWludCkgdGVtcCk7CiAJaWYgKGFzdXNfaW5mbykgewogCQlzbnByaW50ZihidWYsIDE2LCAiJWQiLCBhc3VzX2luZm8tPmxlbmd0aCk7CiAJCWxlbiArPSBzcHJpbnRmKHBhZ2UgKyBsZW4sICJEU0RUIGxlbmd0aCAgICAgICAgOiAlc1xuIiwgYnVmKTsKQEAgLTQ2NSw3ICs0ODQsNyBAQAogfQogCiBzdGF0aWMgc3NpemVfdCBzdG9yZV9zdGF0dXMoY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQsCi0JCQkgICAgYWNwaV9oYW5kbGUgaGFuZGxlLCBpbnQgbWFzaywgaW50IGludmVydCkKKwkJCSAgICBhY3BpX2hhbmRsZSBoYW5kbGUsIGludCBtYXNrKQogewogCWludCBydiwgdmFsdWU7CiAJaW50IG91dCA9IDA7CkBAIC00NzQsNyArNDkzLDcgQEAKIAlpZiAocnYgPiAwKQogCQlvdXQgPSB2YWx1ZSA/IDEgOiAwOwogCi0Jd3JpdGVfc3RhdHVzKGhhbmRsZSwgb3V0LCBtYXNrLCBpbnZlcnQpOworCXdyaXRlX3N0YXR1cyhoYW5kbGUsIG91dCwgbWFzayk7CiAKIAlyZXR1cm4gcnY7CiB9CkBAIC01MTUsNyArNTM0LDcgQEAKIHN0YXRpYyBzc2l6ZV90IHN0b3JlX3dsYW4oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJCSAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7Ci0JcmV0dXJuIHN0b3JlX3N0YXR1cyhidWYsIGNvdW50LCB3bF9zd2l0Y2hfaGFuZGxlLCBXTF9PTiwgMCk7CisJcmV0dXJuIHN0b3JlX3N0YXR1cyhidWYsIGNvdW50LCB3bF9zd2l0Y2hfaGFuZGxlLCBXTF9PTik7CiB9CiAKIC8qCkBAIC01MzEsNyArNTUwLDcgQEAKIAkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLAogCQkJICAgICAgIHNpemVfdCBjb3VudCkKIHsKLQlyZXR1cm4gc3RvcmVfc3RhdHVzKGJ1ZiwgY291bnQsIGJ0X3N3aXRjaF9oYW5kbGUsIEJUX09OLCAwKTsKKwlyZXR1cm4gc3RvcmVfc3RhdHVzKGJ1ZiwgY291bnQsIGJ0X3N3aXRjaF9oYW5kbGUsIEJUX09OKTsKIH0KIAogLyoKQEAgLTU0NywxMiArNTY2LDE1IEBACiAKIHN0YXRpYyBpbnQgcmVhZF9kaXNwbGF5KHZvaWQpCiB7Ci0JaW50IHZhbHVlID0gMDsKKwl1bG9uZyB2YWx1ZSA9IDA7CisJYWNwaV9zdGF0dXMgcnYgPSBBRV9PSzsKIAogCS8qIEluIG1vc3Qgb2YgdGhlIGNhc2UsIHdlIGtub3cgaG93IHRvIHNldCB0aGUgZGlzcGxheSwgYnV0IHNvbWV0aW1lCiAJICAgd2UgY2FuJ3QgcmVhZCBpdCAqLwogCWlmIChkaXNwbGF5X2dldF9oYW5kbGUpIHsKLQkJaWYgKCFyZWFkX2FjcGlfaW50KGRpc3BsYXlfZ2V0X2hhbmRsZSwgTlVMTCwgJnZhbHVlLCBOVUxMKSkKKwkJcnYgPSBhY3BpX2V2YWx1YXRlX2ludGVnZXIoZGlzcGxheV9nZXRfaGFuZGxlLCBOVUxMLAorCQkJCQkgICBOVUxMLCAmdmFsdWUpOworCQlpZiAoQUNQSV9GQUlMVVJFKHJ2KSkKIAkJCXByaW50ayhBU1VTX1dBUk5JTkcgIkVycm9yIHJlYWRpbmcgZGlzcGxheSBzdGF0dXNcbiIpOwogCX0KIApAQCAtNjU2LDEwICs2NzgsMTAgQEAKIAkgKiBzd2l0Y2hlZAogCSAqLwogCWlmIChldmVudCA9PSBBVEtEX0xDRF9PTikgewotCQl3cml0ZV9zdGF0dXMoTlVMTCwgMSwgTENEX09OLCAwKTsKKwkJd3JpdGVfc3RhdHVzKE5VTEwsIDEsIExDRF9PTik7CiAJCWxjZF9ibGFuayhGQl9CTEFOS19VTkJMQU5LKTsKIAl9IGVsc2UgaWYgKGV2ZW50ID09IEFUS0RfTENEX09GRikgewotCQl3cml0ZV9zdGF0dXMoTlVMTCwgMCwgTENEX09OLCAwKTsKKwkJd3JpdGVfc3RhdHVzKE5VTEwsIDAsIExDRF9PTik7CiAJCWxjZF9ibGFuayhGQl9CTEFOS19QT1dFUkRPV04pOwogCX0KIApAQCAtNzcxLDcgKzc5Myw3IEBACiB7CiAJc3RydWN0IGFjcGlfYnVmZmVyIGJ1ZmZlciA9IHsgQUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEwgfTsKIAl1bmlvbiBhY3BpX29iamVjdCAqbW9kZWwgPSBOVUxMOwotCWludCBic3RzX3Jlc3VsdCwgaHdyc19yZXN1bHQ7CisJdWxvbmcgYnN0c19yZXN1bHQsIGh3cnNfcmVzdWx0OwogCWNoYXIgKnN0cmluZyA9IE5VTEw7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCkBAIC03OTQsMTEgKzgxNiwxNiBAQAogCX0KIAogCS8qIFRoaXMgbmVlZHMgdG8gYmUgY2FsbGVkIGZvciBzb21lIGxhcHRvcHMgdG8gaW5pdCBwcm9wZXJseSAqLwotCWlmICghcmVhZF9hY3BpX2ludChob3RrLT5oYW5kbGUsICJCU1RTIiwgJmJzdHNfcmVzdWx0LCBOVUxMKSkKKwlzdGF0dXMgPQorCSAgICBhY3BpX2V2YWx1YXRlX2ludGVnZXIoaG90ay0+aGFuZGxlLCAiQlNUUyIsIE5VTEwsICZic3RzX3Jlc3VsdCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQogCQlwcmludGsoQVNVU19XQVJOSU5HICJFcnJvciBjYWxsaW5nIEJTVFNcbiIpOwogCWVsc2UgaWYgKGJzdHNfcmVzdWx0KQogCQlwcmludGsoQVNVU19OT1RJQ0UgIkJTVFMgY2FsbGVkLCAweCUwMnggcmV0dXJuZWRcbiIsCi0JCSAgICAgICBic3RzX3Jlc3VsdCk7CisJCSAgICAgICAodWludCkgYnN0c19yZXN1bHQpOworCisJLyogVGhpcyB0b28gLi4uICovCisJd3JpdGVfYWNwaV9pbnQoaG90ay0+aGFuZGxlLCAiQ1dBUCIsIHdhcGYsIE5VTEwpOwogCiAJLyoKIAkgKiBUcnkgdG8gbWF0Y2ggdGhlIG9iamVjdCByZXR1cm5lZCBieSBJTklUIHRvIHRoZSBzcGVjaWZpYyBtb2RlbC4KQEAgLTgzMSw2ICs4NTgsNyBAQAogCUFTVVNfSEFORExFX0lOSVQodGxlZF9zZXQpOwogCUFTVVNfSEFORExFX0lOSVQocmxlZF9zZXQpOwogCUFTVVNfSEFORExFX0lOSVQocGxlZF9zZXQpOworCUFTVVNfSEFORExFX0lOSVQoZ2xlZF9zZXQpOwogCiAJQVNVU19IQU5ETEVfSU5JVChsZWRkX3NldCk7CiAKQEAgLTg0MCw3ICs4NjgsOSBAQAogCSAqIFRoZSBzaWduaWZpY2FuY2Ugb2Ygb3RoZXJzIGlzIHlldCB0byBiZSBmb3VuZC4KIAkgKiBJZiB3ZSBkb24ndCBmaW5kIHRoZSBtZXRob2QsIHdlIGFzc3VtZSB0aGUgZGV2aWNlIGFyZSBwcmVzZW50LgogCSAqLwotCWlmICghcmVhZF9hY3BpX2ludChob3RrLT5oYW5kbGUsICJIUldTIiwgJmh3cnNfcmVzdWx0LCBOVUxMKSkKKwlzdGF0dXMgPQorCSAgICBhY3BpX2V2YWx1YXRlX2ludGVnZXIoaG90ay0+aGFuZGxlLCAiSFJXUyIsIE5VTEwsICZod3JzX3Jlc3VsdCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQogCQlod3JzX3Jlc3VsdCA9IFdMX0hXUlMgfCBCVF9IV1JTOwogCiAJaWYgKGh3cnNfcmVzdWx0ICYgV0xfSFdSUykKQEAgLTkyOCwxMSArOTU4LDE1IEBACiAJYXN1c19ob3RrX2ZvdW5kID0gMTsKIAogCS8qIFdMRUQgYW5kIEJMRUQgYXJlIG9uIGJ5IGRlZmF1bHQgKi8KLQl3cml0ZV9zdGF0dXMoYnRfc3dpdGNoX2hhbmRsZSwgMSwgQlRfT04sIDApOwotCXdyaXRlX3N0YXR1cyh3bF9zd2l0Y2hfaGFuZGxlLCAxLCBXTF9PTiwgMCk7CisJd3JpdGVfc3RhdHVzKGJ0X3N3aXRjaF9oYW5kbGUsIDEsIEJUX09OKTsKKwl3cml0ZV9zdGF0dXMod2xfc3dpdGNoX2hhbmRsZSwgMSwgV0xfT04pOworCisJLyogSWYgdGhlIGgvdyBzd2l0Y2ggaXMgb2ZmLCB3ZSBuZWVkIHRvIGNoZWNrIHRoZSByZWFsIHN0YXR1cyAqLworCXdyaXRlX3N0YXR1cyhOVUxMLCByZWFkX3N0YXR1cyhCVF9PTiksIEJUX09OKTsKKwl3cml0ZV9zdGF0dXMoTlVMTCwgcmVhZF9zdGF0dXMoV0xfT04pLCBXTF9PTik7CiAKIAkvKiBMQ0QgQmFja2xpZ2h0IGlzIG9uIGJ5IGRlZmF1bHQgKi8KLQl3cml0ZV9zdGF0dXMoTlVMTCwgMSwgTENEX09OLCAwKTsKKwl3cml0ZV9zdGF0dXMoTlVMTCwgMSwgTENEX09OKTsKIAogCS8qIExFRCBkaXNwbGF5IGlzIG9mZiBieSBkZWZhdWx0ICovCiAJaG90ay0+bGVkZF9zdGF0dXMgPSAweEZGRjsKQEAgLTk5MSw2ICsxMDI1LDcgQEAKIAlBU1VTX0xFRF9VTlJFR0lTVEVSKHRsZWQpOwogCUFTVVNfTEVEX1VOUkVHSVNURVIocGxlZCk7CiAJQVNVU19MRURfVU5SRUdJU1RFUihybGVkKTsKKwlBU1VTX0xFRF9VTlJFR0lTVEVSKGdsZWQpOwogCiAJZGVzdHJveV93b3JrcXVldWUobGVkX3dvcmtxdWV1ZSk7CiB9CkBAIC0xMDYyLDYgKzEwOTcsMTAgQEAKIAlpZiAocnYpCiAJCXJldHVybiBydjsKIAorCXJ2ID0gQVNVU19MRURfUkVHSVNURVIoZ2xlZCwgZGV2KTsKKwlpZiAocnYpCisJCXJldHVybiBydjsKKwogCWxlZF93b3JrcXVldWUgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgibGVkX3dvcmtxdWV1ZSIpOwogCWlmICghbGVkX3dvcmtxdWV1ZSkKIAkJcmV0dXJuIC1FTk9NRU07CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2Mvc29ueS1sYXB0b3AuYyBiL2RyaXZlcnMvbWlzYy9zb255LWxhcHRvcC5jCmluZGV4IGFjNzA4YmMuLmMxNWMxZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9zb255LWxhcHRvcC5jCisrKyBiL2RyaXZlcnMvbWlzYy9zb255LWxhcHRvcC5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIEFDUEkgU29ueSBOb3RlYm9vayBDb250cm9sIERyaXZlciAoU05DKQorICogQUNQSSBTb255IE5vdGVib29rIENvbnRyb2wgRHJpdmVyIChTTkMgYW5kIFNQSUMpCiAgKgogICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDUgU3RlbGlhbiBQb3AgPHN0ZWxpYW5AcG9waWVzLm5ldD4KICAqIENvcHlyaWdodCAoQykgMjAwNyBNYXR0aWEgRG9uZ2lsaSA8bWFsYXR0aWFAbGludXguaXQ+CkBAIC03LDYgKzcsMjUgQEAKICAqIFBhcnRzIG9mIHRoaXMgZHJpdmVyIGluc3BpcmVkIGZyb20gYXN1c19hY3BpLmMgYW5kIGlibV9hY3BpLmMKICAqIHdoaWNoIGFyZSBjb3B5cmlnaHRlZCBieSB0aGVpciByZXNwZWN0aXZlIGF1dGhvcnMuCiAgKgorICogVGhlIFNOWTYwMDEgZHJpdmVyIHBhcnQgaXMgYmFzZWQgb24gdGhlIHNvbnlwaSBkcml2ZXIgd2hpY2ggaW5jbHVkZXMKKyAqIG1hdGVyaWFsIGZyb206CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDUgU3RlbGlhbiBQb3AgPHN0ZWxpYW5AcG9waWVzLm5ldD4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgTmFyYXlhbmFuIFIgUyA8bmFyc0BrYWRhbWJhLm9yZz4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMiBBbGP0dmUgPHd3dy5hbGNvdmUuY29tPgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSBNaWNoYWVsIEFzaGxleSA8bS5hc2hsZXlAdW5zdy5lZHUuYXU+CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIEp1bmljaGkgTW9yaXRhIDxqdW4xbUBtYXJzLmR0aS5uZS5qcD4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgVGFrYXlhIEtpbmpvIDx0LWtpbmpvQHRjNC5zby1uZXQubmUuanA+CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAwIEFuZHJldyBUcmlkZ2VsbCA8dHJpZGdlQHZhbGludXguY29tPgorICoKKyAqIEVhcmxpZXIgd29yayBieSBXZXJuZXIgQWxtZXNiZXJnZXIsIFBhdWwgYFJ1c3R5JyBSdXNzZWxsIGFuZCBQYXVsIE1hY2tlcnJhcy4KKyAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCkBAIC0zMSw0MCArNTAsNDA0IEBACiAjaW5jbHVkZSA8bGludXgvYmFja2xpZ2h0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvZG1pLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L2tmaWZvLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgogI2luY2x1ZGUgPGFjcGkvYWNwaV9kcml2ZXJzLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BpX2J1cy5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvc29ueXBpLmg+CisjaW5jbHVkZSA8bGludXgvc29ueS1sYXB0b3AuaD4KKyNpZmRlZiBDT05GSUdfU09OWV9MQVBUT1BfT0xECisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNlbmRpZgogCi0jZGVmaW5lIEFDUElfU05DX0NMQVNTCQkic29ueSIKLSNkZWZpbmUgQUNQSV9TTkNfSElECQkiU05ZNTAwMSIKLSNkZWZpbmUgQUNQSV9TTkNfRFJJVkVSX05BTUUJIkFDUEkgU29ueSBOb3RlYm9vayBDb250cm9sIERyaXZlciB2MC40IgorI2RlZmluZSBEUlZfUEZYCQkJInNvbnktbGFwdG9wOiAiCisjZGVmaW5lIGRwcmludGsobXNnLi4uKQkJZG8gewkJCVwKKwlpZiAoZGVidWcpIHByaW50ayhLRVJOX1dBUk5JTkcgRFJWX1BGWCAgbXNnKTsJXAorfSB3aGlsZSAoMCkKIAotLyogdGhlIGRldmljZSB1c2VzIDEtYmFzZWQgdmFsdWVzLCB3aGlsZSB0aGUgYmFja2xpZ2h0IHN1YnN5c3RlbSB1c2VzCi0gICAwLWJhc2VkIHZhbHVlcyAqLwotI2RlZmluZSBTT05ZX01BWF9CUklHSFRORVNTCTgKKyNkZWZpbmUgU09OWV9MQVBUT1BfRFJJVkVSX1ZFUlNJT04JIjAuNSIKIAotI2RlZmluZSBMT0dfUEZYCQkJS0VSTl9XQVJOSU5HICJzb255LWxhcHRvcDogIgorI2RlZmluZSBTT05ZX05DX0NMQVNTCQkic29ueS1uYyIKKyNkZWZpbmUgU09OWV9OQ19ISUQJCSJTTlk1MDAxIgorI2RlZmluZSBTT05ZX05DX0RSSVZFUl9OQU1FCSJTb255IE5vdGVib29rIENvbnRyb2wgRHJpdmVyIgorCisjZGVmaW5lIFNPTllfUElDX0NMQVNTCQkic29ueS1waWMiCisjZGVmaW5lIFNPTllfUElDX0hJRAkJIlNOWTYwMDEiCisjZGVmaW5lIFNPTllfUElDX0RSSVZFUl9OQU1FCSJTb255IFByb2dyYW1tYWJsZSBJTyBDb250cm9sIERyaXZlciIKIAogTU9EVUxFX0FVVEhPUigiU3RlbGlhbiBQb3AsIE1hdHRpYSBEb25naWxpIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oQUNQSV9TTkNfRFJJVkVSX05BTUUpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTb255IGxhcHRvcCBleHRyYXMgZHJpdmVyIChTUElDIGFuZCBTTkMgQUNQSSBkZXZpY2UpIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihTT05ZX0xBUFRPUF9EUklWRVJfVkVSU0lPTik7CiAKIHN0YXRpYyBpbnQgZGVidWc7CiBtb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAic2V0IHRoaXMgdG8gMSAoYW5kIFJURk0pIGlmIHlvdSB3YW50IHRvIGhlbHAgIgogCQkgInRoZSBkZXZlbG9wbWVudCBvZiB0aGlzIGRyaXZlciIpOwogCi1zdGF0aWMgc3NpemVfdCBzb255X2FjcGlfc2hvdyhzdHJ1Y3QgZGV2aWNlICosIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICosCi0JCQkgICAgICBjaGFyICopOwotc3RhdGljIHNzaXplX3Qgc29ueV9hY3BpX3N0b3JlKHN0cnVjdCBkZXZpY2UgKiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKiwKLQkJCSAgICAgICBjb25zdCBjaGFyICosIHNpemVfdCk7Ci1zdGF0aWMgaW50IGJvb2xlYW5fdmFsaWRhdGUoY29uc3QgaW50LCBjb25zdCBpbnQpOwotc3RhdGljIGludCBicmlnaHRuZXNzX2RlZmF1bHRfdmFsaWRhdGUoY29uc3QgaW50LCBjb25zdCBpbnQpOworc3RhdGljIGludCBub19zcGljOwkJLyogPSAwICovCittb2R1bGVfcGFyYW0obm9fc3BpYywgaW50LCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0Mobm9fc3BpYywKKwkJICJzZXQgdGhpcyBpZiB5b3UgZG9uJ3Qgd2FudCB0byBlbmFibGUgdGhlIFNQSUMgZGV2aWNlIik7CisKK3N0YXRpYyBpbnQgY29tcGF0OwkJLyogPSAwICovCittb2R1bGVfcGFyYW0oY29tcGF0LCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhjb21wYXQsCisJCSAic2V0IHRoaXMgaWYgeW91IHdhbnQgdG8gZW5hYmxlIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgbW9kZSIpOworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBtYXNrID0gMHhmZmZmZmZmZjsKK21vZHVsZV9wYXJhbShtYXNrLCB1bG9uZywgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKG1hc2ssCisJCSAic2V0IHRoaXMgdG8gdGhlIG1hc2sgb2YgZXZlbnQgeW91IHdhbnQgdG8gZW5hYmxlIChzZWUgZG9jKSIpOworCitzdGF0aWMgaW50IGNhbWVyYTsJCS8qID0gMCAqLworbW9kdWxlX3BhcmFtKGNhbWVyYSwgaW50LCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoY2FtZXJhLAorCQkgInNldCB0aGlzIHRvIDEgdG8gZW5hYmxlIE1vdGlvbiBFeWUgY2FtZXJhIGNvbnRyb2xzICIKKwkJICIob25seSB1c2UgaXQgaWYgeW91IGhhdmUgYSBDMVZFIG9yIEMxVk4gbW9kZWwpIik7CisKKyNpZmRlZiBDT05GSUdfU09OWV9MQVBUT1BfT0xECitzdGF0aWMgaW50IG1pbm9yID0gLTE7Cittb2R1bGVfcGFyYW0obWlub3IsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG1pbm9yLAorCQkgIm1pbm9yIG51bWJlciBvZiB0aGUgbWlzYyBkZXZpY2UgZm9yIHRoZSBTUElDIGNvbXBhdGliaWxpdHkgY29kZSwgIgorCQkgImRlZmF1bHQgaXMgLTEgKGF1dG9tYXRpYykiKTsKKyNlbmRpZgorCisvKioqKioqKioqKiogSW5wdXQgRGV2aWNlcyAqKioqKioqKioqKi8KKworI2RlZmluZSBTT05ZX0xBUFRPUF9CVUZfU0laRQkxMjgKK3N0cnVjdCBzb255X2xhcHRvcF9pbnB1dF9zIHsKKwlhdG9taWNfdAkJdXNlcnM7CisJc3RydWN0IGlucHV0X2Rldgkqam9nX2RldjsKKwlzdHJ1Y3QgaW5wdXRfZGV2CSprZXlfZGV2OworCXN0cnVjdCBrZmlmbwkJKmZpZm87CisJc3BpbmxvY2tfdAkJZmlmb19sb2NrOworCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0CSp3cTsKK307CitzdGF0aWMgc3RydWN0IHNvbnlfbGFwdG9wX2lucHV0X3Mgc29ueV9sYXB0b3BfaW5wdXQgPSB7CisJLnVzZXJzID0gQVRPTUlDX0lOSVQoMCksCit9OworCitzdHJ1Y3Qgc29ueV9sYXB0b3Bfa2V5cHJlc3MgeworCXN0cnVjdCBpbnB1dF9kZXYgKmRldjsKKwlpbnQga2V5OworfTsKKworLyogQ29ycmVzcG9uZGFuY2UgdGFibGUgYmV0d2VlbiBzb255cGkgZXZlbnRzIGFuZCBpbnB1dCBsYXllciBldmVudHMgKi8KK3N0YXRpYyBzdHJ1Y3QgeworCWludCBzb255cGlldjsKKwlpbnQgaW5wdXRldjsKK30gc29ueV9sYXB0b3BfaW5wdXRrZXlzW10gPSB7CisJeyBTT05ZUElfRVZFTlRfQ0FQVFVSRV9QUkVTU0VELAkgCUtFWV9DQU1FUkEgfSwKKwl7IFNPTllQSV9FVkVOVF9GTktFWV9PTkxZLCAJCUtFWV9GTiB9LAorCXsgU09OWVBJX0VWRU5UX0ZOS0VZX0VTQywgCQlLRVlfRk5fRVNDIH0sCisJeyBTT05ZUElfRVZFTlRfRk5LRVlfRjEsIAkJS0VZX0ZOX0YxIH0sCisJeyBTT05ZUElfRVZFTlRfRk5LRVlfRjIsIAkJS0VZX0ZOX0YyIH0sCisJeyBTT05ZUElfRVZFTlRfRk5LRVlfRjMsIAkJS0VZX0ZOX0YzIH0sCisJeyBTT05ZUElfRVZFTlRfRk5LRVlfRjQsIAkJS0VZX0ZOX0Y0IH0sCisJeyBTT05ZUElfRVZFTlRfRk5LRVlfRjUsIAkJS0VZX0ZOX0Y1IH0sCisJeyBTT05ZUElfRVZFTlRfRk5LRVlfRjYsIAkJS0VZX0ZOX0Y2IH0sCisJeyBTT05ZUElfRVZFTlRfRk5LRVlfRjcsIAkJS0VZX0ZOX0Y3IH0sCisJeyBTT05ZUElfRVZFTlRfRk5LRVlfRjgsIAkJS0VZX0ZOX0Y4IH0sCisJeyBTT05ZUElfRVZFTlRfRk5LRVlfRjksCQlLRVlfRk5fRjkgfSwKKwl7IFNPTllQSV9FVkVOVF9GTktFWV9GMTAsCQlLRVlfRk5fRjEwIH0sCisJeyBTT05ZUElfRVZFTlRfRk5LRVlfRjExLCAJCUtFWV9GTl9GMTEgfSwKKwl7IFNPTllQSV9FVkVOVF9GTktFWV9GMTIsCQlLRVlfRk5fRjEyIH0sCisJeyBTT05ZUElfRVZFTlRfRk5LRVlfMSwgCQlLRVlfRk5fMSB9LAorCXsgU09OWVBJX0VWRU5UX0ZOS0VZXzIsIAkJS0VZX0ZOXzIgfSwKKwl7IFNPTllQSV9FVkVOVF9GTktFWV9ELAkJCUtFWV9GTl9EIH0sCisJeyBTT05ZUElfRVZFTlRfRk5LRVlfRSwJCQlLRVlfRk5fRSB9LAorCXsgU09OWVBJX0VWRU5UX0ZOS0VZX0YsCQkJS0VZX0ZOX0YgfSwKKwl7IFNPTllQSV9FVkVOVF9GTktFWV9TLAkJCUtFWV9GTl9TIH0sCisJeyBTT05ZUElfRVZFTlRfRk5LRVlfQiwJCQlLRVlfRk5fQiB9LAorCXsgU09OWVBJX0VWRU5UX0JMVUVUT09USF9QUkVTU0VELCAJS0VZX0JMVUUgfSwKKwl7IFNPTllQSV9FVkVOVF9CTFVFVE9PVEhfT04sIAkJS0VZX0JMVUUgfSwKKwl7IFNPTllQSV9FVkVOVF9QS0VZX1AxLCAJCUtFWV9QUk9HMSB9LAorCXsgU09OWVBJX0VWRU5UX1BLRVlfUDIsIAkJS0VZX1BST0cyIH0sCisJeyBTT05ZUElfRVZFTlRfUEtFWV9QMywgCQlLRVlfUFJPRzMgfSwKKwl7IFNPTllQSV9FVkVOVF9CQUNLX1BSRVNTRUQsIAkJS0VZX0JBQ0sgfSwKKwl7IFNPTllQSV9FVkVOVF9IRUxQX1BSRVNTRUQsIAkJS0VZX0hFTFAgfSwKKwl7IFNPTllQSV9FVkVOVF9aT09NX1BSRVNTRUQsIAkJS0VZX1pPT00gfSwKKwl7IFNPTllQSV9FVkVOVF9USFVNQlBIUkFTRV9QUkVTU0VELCAJQlROX1RIVU1CIH0sCisJeyAwLCAwIH0sCit9OworCisvKiByZWxlYXNlIGJ1dHRvbnMgYWZ0ZXIgYSBzaG9ydCBkZWxheSBpZiBwcmVzc2VkICovCitzdGF0aWMgdm9pZCBkb19zb255X2xhcHRvcF9yZWxlYXNlX2tleShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHNvbnlfbGFwdG9wX2tleXByZXNzIGtwOworCisJd2hpbGUgKGtmaWZvX2dldChzb255X2xhcHRvcF9pbnB1dC5maWZvLCAodW5zaWduZWQgY2hhciAqKSZrcCwKKwkJCSBzaXplb2Yoa3ApKSA9PSBzaXplb2Yoa3ApKSB7CisJCW1zbGVlcCgxMCk7CisJCWlucHV0X3JlcG9ydF9rZXkoa3AuZGV2LCBrcC5rZXksIDApOworCQlpbnB1dF9zeW5jKGtwLmRldik7CisJfQorfQorc3RhdGljIERFQ0xBUkVfV09SSyhzb255X2xhcHRvcF9yZWxlYXNlX2tleV93b3JrLAorCQlkb19zb255X2xhcHRvcF9yZWxlYXNlX2tleSk7CisKKy8qIGZvcndhcmQgZXZlbnQgdG8gdGhlIGlucHV0IHN1YnN5dGVtICovCitzdGF0aWMgdm9pZCBzb255X2xhcHRvcF9yZXBvcnRfaW5wdXRfZXZlbnQodTggZXZlbnQpCit7CisJc3RydWN0IGlucHV0X2RldiAqam9nX2RldiA9IHNvbnlfbGFwdG9wX2lucHV0LmpvZ19kZXY7CisJc3RydWN0IGlucHV0X2RldiAqa2V5X2RldiA9IHNvbnlfbGFwdG9wX2lucHV0LmtleV9kZXY7CisJc3RydWN0IHNvbnlfbGFwdG9wX2tleXByZXNzIGtwID0geyBOVUxMIH07CisJaW50IGk7CisKKwlpZiAoZXZlbnQgPT0gU09OWVBJX0VWRU5UX0ZOS0VZX1JFTEVBU0VEKSB7CisJCS8qIE5vdGhpbmcsIG5vdCBhbGwgVkFJT3MgZ2VuZXJhdGUgdGhpcyBldmVudCAqLworCQlyZXR1cm47CisJfQorCisJLyogcmVwb3J0IGV2ZW50cyAqLworCXN3aXRjaCAoZXZlbnQpIHsKKwkvKiBqb2dfZGV2IGV2ZW50cyAqLworCWNhc2UgU09OWVBJX0VWRU5UX0pPR0RJQUxfVVA6CisJY2FzZSBTT05ZUElfRVZFTlRfSk9HRElBTF9VUF9QUkVTU0VEOgorCQlpbnB1dF9yZXBvcnRfcmVsKGpvZ19kZXYsIFJFTF9XSEVFTCwgMSk7CisJCWlucHV0X3N5bmMoam9nX2Rldik7CisJCXJldHVybjsKKworCWNhc2UgU09OWVBJX0VWRU5UX0pPR0RJQUxfRE9XTjoKKwljYXNlIFNPTllQSV9FVkVOVF9KT0dESUFMX0RPV05fUFJFU1NFRDoKKwkJaW5wdXRfcmVwb3J0X3JlbChqb2dfZGV2LCBSRUxfV0hFRUwsIC0xKTsKKwkJaW5wdXRfc3luYyhqb2dfZGV2KTsKKwkJcmV0dXJuOworCisJLyoga2V5X2RldiBldmVudHMgKi8KKwljYXNlIFNPTllQSV9FVkVOVF9KT0dESUFMX1BSRVNTRUQ6CisJCWtwLmtleSA9IEJUTl9NSURETEU7CisJCWtwLmRldiA9IGpvZ19kZXY7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZm9yIChpID0gMDsgc29ueV9sYXB0b3BfaW5wdXRrZXlzW2ldLnNvbnlwaWV2OyBpKyspCisJCQlpZiAoZXZlbnQgPT0gc29ueV9sYXB0b3BfaW5wdXRrZXlzW2ldLnNvbnlwaWV2KSB7CisJCQkJa3AuZGV2ID0ga2V5X2RldjsKKwkJCQlrcC5rZXkgPSBzb255X2xhcHRvcF9pbnB1dGtleXNbaV0uaW5wdXRldjsKKwkJCQlicmVhazsKKwkJCX0KKwkJYnJlYWs7CisJfQorCisJaWYgKGtwLmRldikgeworCQlpbnB1dF9yZXBvcnRfa2V5KGtwLmRldiwga3Aua2V5LCAxKTsKKwkJaW5wdXRfc3luYyhrcC5kZXYpOworCQlrZmlmb19wdXQoc29ueV9sYXB0b3BfaW5wdXQuZmlmbywKKwkJCSAgKHVuc2lnbmVkIGNoYXIgKikma3AsIHNpemVvZihrcCkpOworCisJCWlmICghd29ya19wZW5kaW5nKCZzb255X2xhcHRvcF9yZWxlYXNlX2tleV93b3JrKSkKKwkJCXF1ZXVlX3dvcmsoc29ueV9sYXB0b3BfaW5wdXQud3EsCisJCQkJCSZzb255X2xhcHRvcF9yZWxlYXNlX2tleV93b3JrKTsKKwl9IGVsc2UKKwkJZHByaW50aygidW5rbm93biBpbnB1dCBldmVudCAlLjJ4XG4iLCBldmVudCk7Cit9CisKK3N0YXRpYyBpbnQgc29ueV9sYXB0b3Bfc2V0dXBfaW5wdXQodm9pZCkKK3sKKwlzdHJ1Y3QgaW5wdXRfZGV2ICpqb2dfZGV2OworCXN0cnVjdCBpbnB1dF9kZXYgKmtleV9kZXY7CisJaW50IGk7CisJaW50IGVycm9yOworCisJLyogZG9uJ3QgcnVuIGFnYWluIGlmIGFscmVhZHkgaW5pdGlhbGl6ZWQgKi8KKwlpZiAoYXRvbWljX2FkZF9yZXR1cm4oMSwgJnNvbnlfbGFwdG9wX2lucHV0LnVzZXJzKSA+IDEpCisJCXJldHVybiAwOworCisJLyoga2ZpZm8gKi8KKwlzcGluX2xvY2tfaW5pdCgmc29ueV9sYXB0b3BfaW5wdXQuZmlmb19sb2NrKTsKKwlzb255X2xhcHRvcF9pbnB1dC5maWZvID0KKwkJa2ZpZm9fYWxsb2MoU09OWV9MQVBUT1BfQlVGX1NJWkUsIEdGUF9LRVJORUwsCisJCQkgICAgJnNvbnlfbGFwdG9wX2lucHV0LmZpZm9fbG9jayk7CisJaWYgKElTX0VSUihzb255X2xhcHRvcF9pbnB1dC5maWZvKSkgeworCQlwcmludGsoS0VSTl9FUlIgRFJWX1BGWCAia2ZpZm9fYWxsb2MgZmFpbGVkXG4iKTsKKwkJZXJyb3IgPSBQVFJfRVJSKHNvbnlfbGFwdG9wX2lucHV0LmZpZm8pOworCQlnb3RvIGVycl9kZWNfdXNlcnM7CisJfQorCisJLyogaW5pdCB3b3JrcXVldWUgKi8KKwlzb255X2xhcHRvcF9pbnB1dC53cSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJzb255LWxhcHRvcCIpOworCWlmICghc29ueV9sYXB0b3BfaW5wdXQud3EpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIERSVl9QRlgKKwkJCQkiVW5hYmUgdG8gY3JlYXRlIHdvcmtxdWV1ZS5cbiIpOworCQllcnJvciA9IC1FTlhJTzsKKwkJZ290byBlcnJfZnJlZV9rZmlmbzsKKwl9CisKKwkvKiBpbnB1dCBrZXlzICovCisJa2V5X2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOworCWlmICgha2V5X2RldikgeworCQllcnJvciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2Rlc3Ryb3lfd3E7CisJfQorCisJa2V5X2Rldi0+bmFtZSA9ICJTb255IFZhaW8gS2V5cyI7CisJa2V5X2Rldi0+aWQuYnVzdHlwZSA9IEJVU19JU0E7CisJa2V5X2Rldi0+aWQudmVuZG9yID0gUENJX1ZFTkRPUl9JRF9TT05ZOworCisJLyogSW5pdGlhbGl6ZSB0aGUgSW5wdXQgRHJpdmVyczogc3BlY2lhbCBrZXlzICovCisJa2V5X2Rldi0+ZXZiaXRbMF0gPSBCSVQoRVZfS0VZKTsKKwlmb3IgKGkgPSAwOyBzb255X2xhcHRvcF9pbnB1dGtleXNbaV0uc29ueXBpZXY7IGkrKykKKwkJaWYgKHNvbnlfbGFwdG9wX2lucHV0a2V5c1tpXS5pbnB1dGV2KQorCQkJc2V0X2JpdChzb255X2xhcHRvcF9pbnB1dGtleXNbaV0uaW5wdXRldiwKKwkJCQkJa2V5X2Rldi0+a2V5Yml0KTsKKworCWVycm9yID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGtleV9kZXYpOworCWlmIChlcnJvcikKKwkJZ290byBlcnJfZnJlZV9rZXlkZXY7CisKKwlzb255X2xhcHRvcF9pbnB1dC5rZXlfZGV2ID0ga2V5X2RldjsKKworCS8qIGpvZ2RpYWwgKi8KKwlqb2dfZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKCFqb2dfZGV2KSB7CisJCWVycm9yID0gLUVOT01FTTsKKwkJZ290byBlcnJfdW5yZWdpc3Rlcl9rZXlkZXY7CisJfQorCisJam9nX2Rldi0+bmFtZSA9ICJTb255IFZhaW8gSm9nZGlhbCI7CisJam9nX2Rldi0+aWQuYnVzdHlwZSA9IEJVU19JU0E7CisJam9nX2Rldi0+aWQudmVuZG9yID0gUENJX1ZFTkRPUl9JRF9TT05ZOworCisJam9nX2Rldi0+ZXZiaXRbMF0gPSBCSVQoRVZfS0VZKSB8IEJJVChFVl9SRUwpOworCWpvZ19kZXYtPmtleWJpdFtMT05HKEJUTl9NT1VTRSldID0gQklUKEJUTl9NSURETEUpOworCWpvZ19kZXYtPnJlbGJpdFswXSA9IEJJVChSRUxfV0hFRUwpOworCisJZXJyb3IgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2Uoam9nX2Rldik7CisJaWYgKGVycm9yKQorCQlnb3RvIGVycl9mcmVlX2pvZ2RldjsKKworCXNvbnlfbGFwdG9wX2lucHV0LmpvZ19kZXYgPSBqb2dfZGV2OworCisJcmV0dXJuIDA7CisKK2Vycl9mcmVlX2pvZ2RldjoKKwlpbnB1dF9mcmVlX2RldmljZShqb2dfZGV2KTsKKworZXJyX3VucmVnaXN0ZXJfa2V5ZGV2OgorCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKGtleV9kZXYpOworCS8qIHRvIGF2b2lkIGtyZWYgdW5kZXJmbG93IGJlbG93IGF0IGlucHV0X2ZyZWVfZGV2aWNlICovCisJa2V5X2RldiA9IE5VTEw7CisKK2Vycl9mcmVlX2tleWRldjoKKwlpbnB1dF9mcmVlX2RldmljZShrZXlfZGV2KTsKKworZXJyX2Rlc3Ryb3lfd3E6CisJZGVzdHJveV93b3JrcXVldWUoc29ueV9sYXB0b3BfaW5wdXQud3EpOworCitlcnJfZnJlZV9rZmlmbzoKKwlrZmlmb19mcmVlKHNvbnlfbGFwdG9wX2lucHV0LmZpZm8pOworCitlcnJfZGVjX3VzZXJzOgorCWF0b21pY19kZWMoJnNvbnlfbGFwdG9wX2lucHV0LnVzZXJzKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyB2b2lkIHNvbnlfbGFwdG9wX3JlbW92ZV9pbnB1dCh2b2lkKQoreworCS8qIGNsZWFudXAgb25seSBhZnRlciB0aGUgbGFzdCB1c2VyIGhhcyBnb25lICovCisJaWYgKCFhdG9taWNfZGVjX2FuZF90ZXN0KCZzb255X2xhcHRvcF9pbnB1dC51c2VycykpCisJCXJldHVybjsKKworCS8qIGZsdXNoIHdvcmtxdWV1ZSBmaXJzdCAqLworCWZsdXNoX3dvcmtxdWV1ZShzb255X2xhcHRvcF9pbnB1dC53cSk7CisKKwkvKiBkZXN0cm95IGlucHV0IGRldnMgKi8KKwlpbnB1dF91bnJlZ2lzdGVyX2RldmljZShzb255X2xhcHRvcF9pbnB1dC5rZXlfZGV2KTsKKwlzb255X2xhcHRvcF9pbnB1dC5rZXlfZGV2ID0gTlVMTDsKKworCWlmIChzb255X2xhcHRvcF9pbnB1dC5qb2dfZGV2KSB7CisJCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKHNvbnlfbGFwdG9wX2lucHV0LmpvZ19kZXYpOworCQlzb255X2xhcHRvcF9pbnB1dC5qb2dfZGV2ID0gTlVMTDsKKwl9CisKKwlkZXN0cm95X3dvcmtxdWV1ZShzb255X2xhcHRvcF9pbnB1dC53cSk7CisJa2ZpZm9fZnJlZShzb255X2xhcHRvcF9pbnB1dC5maWZvKTsKK30KKworLyoqKioqKioqKioqIFBsYXRmb3JtIERldmljZSAqKioqKioqKioqKi8KKworc3RhdGljIGF0b21pY190IHNvbnlfcGZfdXNlcnMgPSBBVE9NSUNfSU5JVCgwKTsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNvbnlfcGZfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCSAgIC5uYW1lID0gInNvbnktbGFwdG9wIiwKKwkJICAgLm93bmVyID0gVEhJU19NT0RVTEUsCisJCSAgIH0KK307CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc29ueV9wZl9kZXZpY2U7CisKK3N0YXRpYyBpbnQgc29ueV9wZl9hZGQodm9pZCkKK3sKKwlpbnQgcmV0ID0gMDsKKworCS8qIGRvbid0IHJ1biBhZ2FpbiBpZiBhbHJlYWR5IGluaXRpYWxpemVkICovCisJaWYgKGF0b21pY19hZGRfcmV0dXJuKDEsICZzb255X3BmX3VzZXJzKSA+IDEpCisJCXJldHVybiAwOworCisJcmV0ID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZzb255X3BmX2RyaXZlcik7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlzb255X3BmX2RldmljZSA9IHBsYXRmb3JtX2RldmljZV9hbGxvYygic29ueS1sYXB0b3AiLCAtMSk7CisJaWYgKCFzb255X3BmX2RldmljZSkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dF9wbGF0Zm9ybV9yZWdpc3RlcmVkOworCX0KKworCXJldCA9IHBsYXRmb3JtX2RldmljZV9hZGQoc29ueV9wZl9kZXZpY2UpOworCWlmIChyZXQpCisJCWdvdG8gb3V0X3BsYXRmb3JtX2FsbG9jZWQ7CisKKwlyZXR1cm4gMDsKKworICAgICAgb3V0X3BsYXRmb3JtX2FsbG9jZWQ6CisJcGxhdGZvcm1fZGV2aWNlX3B1dChzb255X3BmX2RldmljZSk7CisJc29ueV9wZl9kZXZpY2UgPSBOVUxMOworICAgICAgb3V0X3BsYXRmb3JtX3JlZ2lzdGVyZWQ6CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnNvbnlfcGZfZHJpdmVyKTsKKyAgICAgIG91dDoKKwlhdG9taWNfZGVjKCZzb255X3BmX3VzZXJzKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBzb255X3BmX3JlbW92ZSh2b2lkKQoreworCS8qIGRlcmVnaXN0ZXIgb25seSBhZnRlciB0aGUgbGFzdCB1c2VyIGhhcyBnb25lICovCisJaWYgKCFhdG9taWNfZGVjX2FuZF90ZXN0KCZzb255X3BmX3VzZXJzKSkKKwkJcmV0dXJuOworCisJcGxhdGZvcm1fZGV2aWNlX2RlbChzb255X3BmX2RldmljZSk7CisJcGxhdGZvcm1fZGV2aWNlX3B1dChzb255X3BmX2RldmljZSk7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnNvbnlfcGZfZHJpdmVyKTsKK30KKworLyoqKioqKioqKioqIFNOQyAoU05ZNTAwMSkgRGV2aWNlICoqKioqKioqKioqLworCisvKiB0aGUgZGV2aWNlIHVzZXMgMS1iYXNlZCB2YWx1ZXMsIHdoaWxlIHRoZSBiYWNrbGlnaHQgc3Vic3lzdGVtIHVzZXMKKyAgIDAtYmFzZWQgdmFsdWVzICovCisjZGVmaW5lIFNPTllfTUFYX0JSSUdIVE5FU1MJOAogCiAjZGVmaW5lIFNOQ19WQUxJREFURV9JTgkJMAogI2RlZmluZSBTTkNfVkFMSURBVEVfT1VUCTEKIAotc3RydWN0IHNvbnlfYWNwaV92YWx1ZSB7CitzdGF0aWMgc3NpemVfdCBzb255X25jX3N5c2ZzX3Nob3coc3RydWN0IGRldmljZSAqLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqLAorCQkJICAgICAgY2hhciAqKTsKK3N0YXRpYyBzc2l6ZV90IHNvbnlfbmNfc3lzZnNfc3RvcmUoc3RydWN0IGRldmljZSAqLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqLAorCQkJICAgICAgIGNvbnN0IGNoYXIgKiwgc2l6ZV90KTsKK3N0YXRpYyBpbnQgYm9vbGVhbl92YWxpZGF0ZShjb25zdCBpbnQsIGNvbnN0IGludCk7CitzdGF0aWMgaW50IGJyaWdodG5lc3NfZGVmYXVsdF92YWxpZGF0ZShjb25zdCBpbnQsIGNvbnN0IGludCk7CisKK3N0cnVjdCBzb255X25jX3ZhbHVlIHsKIAljaGFyICpuYW1lOwkJLyogbmFtZSBvZiB0aGUgZW50cnkgKi8KIAljaGFyICoqYWNwaWdldDsJCS8qIG5hbWVzIG9mIHRoZSBBQ1BJIGdldCBmdW5jdGlvbiAqLwogCWNoYXIgKiphY3Bpc2V0OwkJLyogbmFtZXMgb2YgdGhlIEFDUEkgc2V0IGZ1bmN0aW9uICovCkBAIC03NSw2NSArNDU4LDY1IEBACiAJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2YXR0cjsJLyogc3lzZnMgYXRyaWJ1dGUgKi8KIH07CiAKLSNkZWZpbmUgSEFORExFX05BTUVTKF9uYW1lLCBfdmFsdWVzLi4uKSBcCisjZGVmaW5lIFNOQ19IQU5ETEVfTkFNRVMoX25hbWUsIF92YWx1ZXMuLi4pIFwKIAlzdGF0aWMgY2hhciAqc25jXyMjX25hbWVbXSA9IHsgX3ZhbHVlcywgTlVMTCB9CiAKLSNkZWZpbmUgU09OWV9BQ1BJX1ZBTFVFKF9uYW1lLCBfZ2V0dGVycywgX3NldHRlcnMsIF92YWxpZGF0ZSwgX2RlYnVnKSBcCisjZGVmaW5lIFNOQ19IQU5ETEUoX25hbWUsIF9nZXR0ZXJzLCBfc2V0dGVycywgX3ZhbGlkYXRlLCBfZGVidWcpIFwKIAl7IFwKIAkJLm5hbWUJCT0gX19zdHJpbmdpZnkoX25hbWUpLCBcCiAJCS5hY3BpZ2V0CT0gX2dldHRlcnMsIFwKIAkJLmFjcGlzZXQJPSBfc2V0dGVycywgXAogCQkudmFsaWRhdGUJPSBfdmFsaWRhdGUsIFwKIAkJLmRlYnVnCQk9IF9kZWJ1ZywgXAotCQkuZGV2YXR0cgk9IF9fQVRUUihfbmFtZSwgMCwgc29ueV9hY3BpX3Nob3csIHNvbnlfYWNwaV9zdG9yZSksIFwKKwkJLmRldmF0dHIJPSBfX0FUVFIoX25hbWUsIDAsIHNvbnlfbmNfc3lzZnNfc2hvdywgc29ueV9uY19zeXNmc19zdG9yZSksIFwKIAl9CiAKLSNkZWZpbmUgU09OWV9BQ1BJX1ZBTFVFX05VTEwJeyAubmFtZSA9IE5VTEwgfQorI2RlZmluZSBTTkNfSEFORExFX05VTEwJeyAubmFtZSA9IE5VTEwgfQogCi1IQU5ETEVfTkFNRVMoZm5rZXlfZ2V0LCAiR0hLRSIpOworU05DX0hBTkRMRV9OQU1FUyhmbmtleV9nZXQsICJHSEtFIik7CiAKLUhBTkRMRV9OQU1FUyhicmlnaHRuZXNzX2RlZl9nZXQsICJHUEJSIik7Ci1IQU5ETEVfTkFNRVMoYnJpZ2h0bmVzc19kZWZfc2V0LCAiU1BCUiIpOworU05DX0hBTkRMRV9OQU1FUyhicmlnaHRuZXNzX2RlZl9nZXQsICJHUEJSIik7CitTTkNfSEFORExFX05BTUVTKGJyaWdodG5lc3NfZGVmX3NldCwgIlNQQlIiKTsKIAotSEFORExFX05BTUVTKGNkcG93ZXJfZ2V0LCAiR0NEUCIpOwotSEFORExFX05BTUVTKGNkcG93ZXJfc2V0LCAiU0NEUCIsICJDRFBXIik7CitTTkNfSEFORExFX05BTUVTKGNkcG93ZXJfZ2V0LCAiR0NEUCIpOworU05DX0hBTkRMRV9OQU1FUyhjZHBvd2VyX3NldCwgIlNDRFAiLCAiQ0RQVyIpOwogCi1IQU5ETEVfTkFNRVMoYXVkaW9wb3dlcl9nZXQsICJHQVpQIik7Ci1IQU5ETEVfTkFNRVMoYXVkaW9wb3dlcl9zZXQsICJBWlBXIik7CitTTkNfSEFORExFX05BTUVTKGF1ZGlvcG93ZXJfZ2V0LCAiR0FaUCIpOworU05DX0hBTkRMRV9OQU1FUyhhdWRpb3Bvd2VyX3NldCwgIkFaUFciKTsKIAotSEFORExFX05BTUVTKGxhbnBvd2VyX2dldCwgIkdMTlAiKTsKLUhBTkRMRV9OQU1FUyhsYW5wb3dlcl9zZXQsICJMTlBXIik7CitTTkNfSEFORExFX05BTUVTKGxhbnBvd2VyX2dldCwgIkdMTlAiKTsKK1NOQ19IQU5ETEVfTkFNRVMobGFucG93ZXJfc2V0LCAiTE5QVyIpOwogCi1IQU5ETEVfTkFNRVMoUElEX2dldCwgIkdQSUQiKTsKK1NOQ19IQU5ETEVfTkFNRVMoUElEX2dldCwgIkdQSUQiKTsKIAotSEFORExFX05BTUVTKENUUl9nZXQsICJHQ1RSIik7Ci1IQU5ETEVfTkFNRVMoQ1RSX3NldCwgIlNDVFIiKTsKK1NOQ19IQU5ETEVfTkFNRVMoQ1RSX2dldCwgIkdDVFIiKTsKK1NOQ19IQU5ETEVfTkFNRVMoQ1RSX3NldCwgIlNDVFIiKTsKIAotSEFORExFX05BTUVTKFBDUl9nZXQsICJHUENSIik7Ci1IQU5ETEVfTkFNRVMoUENSX3NldCwgIlNQQ1IiKTsKK1NOQ19IQU5ETEVfTkFNRVMoUENSX2dldCwgIkdQQ1IiKTsKK1NOQ19IQU5ETEVfTkFNRVMoUENSX3NldCwgIlNQQ1IiKTsKIAotSEFORExFX05BTUVTKENNSV9nZXQsICJHQ01JIik7Ci1IQU5ETEVfTkFNRVMoQ01JX3NldCwgIlNDTUkiKTsKK1NOQ19IQU5ETEVfTkFNRVMoQ01JX2dldCwgIkdDTUkiKTsKK1NOQ19IQU5ETEVfTkFNRVMoQ01JX3NldCwgIlNDTUkiKTsKIAotc3RhdGljIHN0cnVjdCBzb255X2FjcGlfdmFsdWUgc29ueV9hY3BpX3ZhbHVlc1tdID0gewotCVNPTllfQUNQSV9WQUxVRShicmlnaHRuZXNzX2RlZmF1bHQsIHNuY19icmlnaHRuZXNzX2RlZl9nZXQsCitzdGF0aWMgc3RydWN0IHNvbnlfbmNfdmFsdWUgc29ueV9uY192YWx1ZXNbXSA9IHsKKwlTTkNfSEFORExFKGJyaWdodG5lc3NfZGVmYXVsdCwgc25jX2JyaWdodG5lc3NfZGVmX2dldCwKIAkJCXNuY19icmlnaHRuZXNzX2RlZl9zZXQsIGJyaWdodG5lc3NfZGVmYXVsdF92YWxpZGF0ZSwgMCksCi0JU09OWV9BQ1BJX1ZBTFVFKGZua2V5LCBzbmNfZm5rZXlfZ2V0LCBOVUxMLCBOVUxMLCAwKSwKLQlTT05ZX0FDUElfVkFMVUUoY2Rwb3dlciwgc25jX2NkcG93ZXJfZ2V0LCBzbmNfY2Rwb3dlcl9zZXQsIGJvb2xlYW5fdmFsaWRhdGUsIDApLAotCVNPTllfQUNQSV9WQUxVRShhdWRpb3Bvd2VyLCBzbmNfYXVkaW9wb3dlcl9nZXQsIHNuY19hdWRpb3Bvd2VyX3NldCwKKwlTTkNfSEFORExFKGZua2V5LCBzbmNfZm5rZXlfZ2V0LCBOVUxMLCBOVUxMLCAwKSwKKwlTTkNfSEFORExFKGNkcG93ZXIsIHNuY19jZHBvd2VyX2dldCwgc25jX2NkcG93ZXJfc2V0LCBib29sZWFuX3ZhbGlkYXRlLCAwKSwKKwlTTkNfSEFORExFKGF1ZGlvcG93ZXIsIHNuY19hdWRpb3Bvd2VyX2dldCwgc25jX2F1ZGlvcG93ZXJfc2V0LAogCQkJYm9vbGVhbl92YWxpZGF0ZSwgMCksCi0JU09OWV9BQ1BJX1ZBTFVFKGxhbnBvd2VyLCBzbmNfbGFucG93ZXJfZ2V0LCBzbmNfbGFucG93ZXJfc2V0LAorCVNOQ19IQU5ETEUobGFucG93ZXIsIHNuY19sYW5wb3dlcl9nZXQsIHNuY19sYW5wb3dlcl9zZXQsCiAJCQlib29sZWFuX3ZhbGlkYXRlLCAxKSwKIAkvKiB1bmtub3duIG1ldGhvZHMgKi8KLQlTT05ZX0FDUElfVkFMVUUoUElELCBzbmNfUElEX2dldCwgTlVMTCwgTlVMTCwgMSksCi0JU09OWV9BQ1BJX1ZBTFVFKENUUiwgc25jX0NUUl9nZXQsIHNuY19DVFJfc2V0LCBOVUxMLCAxKSwKLQlTT05ZX0FDUElfVkFMVUUoUENSLCBzbmNfUENSX2dldCwgc25jX1BDUl9zZXQsIE5VTEwsIDEpLAotCVNPTllfQUNQSV9WQUxVRShDTUksIHNuY19DTUlfZ2V0LCBzbmNfQ01JX3NldCwgTlVMTCwgMSksCi0JU09OWV9BQ1BJX1ZBTFVFX05VTEwKKwlTTkNfSEFORExFKFBJRCwgc25jX1BJRF9nZXQsIE5VTEwsIE5VTEwsIDEpLAorCVNOQ19IQU5ETEUoQ1RSLCBzbmNfQ1RSX2dldCwgc25jX0NUUl9zZXQsIE5VTEwsIDEpLAorCVNOQ19IQU5ETEUoUENSLCBzbmNfUENSX2dldCwgc25jX1BDUl9zZXQsIE5VTEwsIDEpLAorCVNOQ19IQU5ETEUoQ01JLCBzbmNfQ01JX2dldCwgc25jX0NNSV9zZXQsIE5VTEwsIDEpLAorCVNOQ19IQU5ETEVfTlVMTAogfTsKIAotc3RhdGljIGFjcGlfaGFuZGxlIHNvbnlfYWNwaV9oYW5kbGU7Ci1zdGF0aWMgc3RydWN0IGFjcGlfZGV2aWNlICpzb255X2FjcGlfYWNwaV9kZXZpY2UgPSBOVUxMOworc3RhdGljIGFjcGlfaGFuZGxlIHNvbnlfbmNfYWNwaV9oYW5kbGU7CitzdGF0aWMgc3RydWN0IGFjcGlfZGV2aWNlICpzb255X25jX2FjcGlfZGV2aWNlID0gTlVMTDsKIAogLyoKICAqIGFjcGlfZXZhbHVhdGVfb2JqZWN0IHdyYXBwZXJzCkBAIC0xNTMsNyArNTM2LDcgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0JcHJpbnRrKExPR19QRlggImFjcGlfY2FsbHJlYWRmdW5jIGZhaWxlZFxuIik7CisJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZfUEZYICJhY3BpX2NhbGxyZWFkZnVuYyBmYWlsZWRcbiIpOwogCiAJcmV0dXJuIC0xOwogfQpAQCAtMTc5LDcgKzU2Miw3IEBACiAJaWYgKHN0YXR1cyA9PSBBRV9PSykgewogCQlpZiAocmVzdWx0ICE9IE5VTEwpIHsKIAkJCWlmIChvdXRfb2JqLnR5cGUgIT0gQUNQSV9UWVBFX0lOVEVHRVIpIHsKLQkJCQlwcmludGsoTE9HX1BGWCAiYWNwaV9ldmFsdWF0ZV9vYmplY3QgYmFkICIKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9QRlggImFjcGlfZXZhbHVhdGVfb2JqZWN0IGJhZCAiCiAJCQkJICAgICAgICJyZXR1cm4gdHlwZVxuIik7CiAJCQkJcmV0dXJuIC0xOwogCQkJfQpAQCAtMTg4LDEzICs1NzEsMTMgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0JcHJpbnRrKExPR19QRlggImFjcGlfZXZhbHVhdGVfb2JqZWN0IGZhaWxlZFxuIik7CisJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZfUEZYICJhY3BpX2V2YWx1YXRlX29iamVjdCBmYWlsZWRcbiIpOwogCiAJcmV0dXJuIC0xOwogfQogCiAvKgotICogc29ueV9hY3BpX3ZhbHVlcyBpbnB1dC9vdXRwdXQgdmFsaWRhdGUgZnVuY3Rpb25zCisgKiBzb255X25jX3ZhbHVlcyBpbnB1dC9vdXRwdXQgdmFsaWRhdGUgZnVuY3Rpb25zCiAgKi8KIAogLyogYnJpZ2h0bmVzc19kZWZhdWx0X3ZhbGlkYXRlOgpAQCAtMjI5LDE5ICs2MTIsMTkgQEAKIH0KIAogLyoKLSAqIFN5c2ZzIHNob3cvc3RvcmUgY29tbW9uIHRvIGFsbCBzb255X2FjcGlfdmFsdWVzCisgKiBTeXNmcyBzaG93L3N0b3JlIGNvbW1vbiB0byBhbGwgc29ueV9uY192YWx1ZXMKICAqLwotc3RhdGljIHNzaXplX3Qgc29ueV9hY3BpX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKK3N0YXRpYyBzc2l6ZV90IHNvbnlfbmNfc3lzZnNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkJICAgICAgY2hhciAqYnVmZmVyKQogewogCWludCB2YWx1ZTsKLQlzdHJ1Y3Qgc29ueV9hY3BpX3ZhbHVlICppdGVtID0KLQkgICAgY29udGFpbmVyX29mKGF0dHIsIHN0cnVjdCBzb255X2FjcGlfdmFsdWUsIGRldmF0dHIpOworCXN0cnVjdCBzb255X25jX3ZhbHVlICppdGVtID0KKwkgICAgY29udGFpbmVyX29mKGF0dHIsIHN0cnVjdCBzb255X25jX3ZhbHVlLCBkZXZhdHRyKTsKIAogCWlmICghKml0ZW0tPmFjcGlnZXQpCiAJCXJldHVybiAtRUlPOwogCi0JaWYgKGFjcGlfY2FsbGdldGZ1bmMoc29ueV9hY3BpX2hhbmRsZSwgKml0ZW0tPmFjcGlnZXQsICZ2YWx1ZSkgPCAwKQorCWlmIChhY3BpX2NhbGxnZXRmdW5jKHNvbnlfbmNfYWNwaV9oYW5kbGUsICppdGVtLT5hY3BpZ2V0LCAmdmFsdWUpIDwgMCkKIAkJcmV0dXJuIC1FSU87CiAKIAlpZiAoaXRlbS0+dmFsaWRhdGUpCkBAIC0yNTAsMTMgKzYzMywxMyBAQAogCXJldHVybiBzbnByaW50ZihidWZmZXIsIFBBR0VfU0laRSwgIiVkXG4iLCB2YWx1ZSk7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHNvbnlfYWNwaV9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCitzdGF0aWMgc3NpemVfdCBzb255X25jX3N5c2ZzX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJCSAgICAgICBjb25zdCBjaGFyICpidWZmZXIsIHNpemVfdCBjb3VudCkKIHsKIAlpbnQgdmFsdWU7Ci0Jc3RydWN0IHNvbnlfYWNwaV92YWx1ZSAqaXRlbSA9Ci0JICAgIGNvbnRhaW5lcl9vZihhdHRyLCBzdHJ1Y3Qgc29ueV9hY3BpX3ZhbHVlLCBkZXZhdHRyKTsKKwlzdHJ1Y3Qgc29ueV9uY192YWx1ZSAqaXRlbSA9CisJICAgIGNvbnRhaW5lcl9vZihhdHRyLCBzdHJ1Y3Qgc29ueV9uY192YWx1ZSwgZGV2YXR0cik7CiAKIAlpZiAoIWl0ZW0tPmFjcGlzZXQpCiAJCXJldHVybiAtRUlPOwpAQCAtMjcyLDExOCArNjU1LDIwIEBACiAJaWYgKHZhbHVlIDwgMCkKIAkJcmV0dXJuIHZhbHVlOwogCi0JaWYgKGFjcGlfY2FsbHNldGZ1bmMoc29ueV9hY3BpX2hhbmRsZSwgKml0ZW0tPmFjcGlzZXQsIHZhbHVlLCBOVUxMKSA8IDApCisJaWYgKGFjcGlfY2FsbHNldGZ1bmMoc29ueV9uY19hY3BpX2hhbmRsZSwgKml0ZW0tPmFjcGlzZXQsIHZhbHVlLCBOVUxMKSA8IDApCiAJCXJldHVybiAtRUlPOwogCWl0ZW0tPnZhbHVlID0gdmFsdWU7CiAJaXRlbS0+dmFsaWQgPSAxOwogCXJldHVybiBjb3VudDsKIH0KIAotLyoKLSAqIFBsYXRmb3JtIGRldmljZQotICovCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzbmNwZl9kcml2ZXIgPSB7Ci0JLmRyaXZlciA9IHsKLQkJICAgLm5hbWUgPSAic29ueS1sYXB0b3AiLAotCQkgICAub3duZXIgPSBUSElTX01PRFVMRSwKLQkJICAgfQotfTsKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpzbmNwZl9kZXZpY2U7Ci0KLXN0YXRpYyBpbnQgc29ueV9zbmNfcGZfYWRkKHZvaWQpCi17Ci0JYWNwaV9oYW5kbGUgaGFuZGxlOwotCXN0cnVjdCBzb255X2FjcGlfdmFsdWUgKml0ZW07Ci0JaW50IHJldCA9IDA7Ci0KLQlyZXQgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnNuY3BmX2RyaXZlcik7Ci0JaWYgKHJldCkKLQkJZ290byBvdXQ7Ci0KLQlzbmNwZl9kZXZpY2UgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoInNvbnktbGFwdG9wIiwgLTEpOwotCWlmICghc25jcGZfZGV2aWNlKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0X3BsYXRmb3JtX3JlZ2lzdGVyZWQ7Ci0JfQotCi0JcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZChzbmNwZl9kZXZpY2UpOwotCWlmIChyZXQpCi0JCWdvdG8gb3V0X3BsYXRmb3JtX2FsbG9jZWQ7Ci0KLQlmb3IgKGl0ZW0gPSBzb255X2FjcGlfdmFsdWVzOyBpdGVtLT5uYW1lOyArK2l0ZW0pIHsKLQotCQlpZiAoIWRlYnVnICYmIGl0ZW0tPmRlYnVnKQotCQkJY29udGludWU7Ci0KLQkJLyogZmluZCB0aGUgYXZhaWxhYmxlIGFjcGlnZXQgYXMgZGVzY3JpYmVkIGluIHRoZSBEU0RUICovCi0JCWZvciAoOyBpdGVtLT5hY3BpZ2V0ICYmICppdGVtLT5hY3BpZ2V0OyArK2l0ZW0tPmFjcGlnZXQpIHsKLQkJCWlmIChBQ1BJX1NVQ0NFU1MoYWNwaV9nZXRfaGFuZGxlKHNvbnlfYWNwaV9oYW5kbGUsCi0JCQkJCQkJICppdGVtLT5hY3BpZ2V0LAotCQkJCQkJCSAmaGFuZGxlKSkpIHsKLQkJCQlpZiAoZGVidWcpCi0JCQkJCXByaW50ayhMT0dfUEZYICJGb3VuZCAlcyBnZXR0ZXI6ICVzXG4iLAotCQkJCQkgICAgICAgaXRlbS0+bmFtZSwgKml0ZW0tPmFjcGlnZXQpOwotCQkJCWl0ZW0tPmRldmF0dHIuYXR0ci5tb2RlIHw9IFNfSVJVR087Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQkvKiBmaW5kIHRoZSBhdmFpbGFibGUgYWNwaXNldCBhcyBkZXNjcmliZWQgaW4gdGhlIERTRFQgKi8KLQkJZm9yICg7IGl0ZW0tPmFjcGlzZXQgJiYgKml0ZW0tPmFjcGlzZXQ7ICsraXRlbS0+YWNwaXNldCkgewotCQkJaWYgKEFDUElfU1VDQ0VTUyhhY3BpX2dldF9oYW5kbGUoc29ueV9hY3BpX2hhbmRsZSwKLQkJCQkJCQkgKml0ZW0tPmFjcGlzZXQsCi0JCQkJCQkJICZoYW5kbGUpKSkgewotCQkJCWlmIChkZWJ1ZykKLQkJCQkJcHJpbnRrKExPR19QRlggIkZvdW5kICVzIHNldHRlcjogJXNcbiIsCi0JCQkJCSAgICAgICBpdGVtLT5uYW1lLCAqaXRlbS0+YWNwaXNldCk7Ci0JCQkJaXRlbS0+ZGV2YXR0ci5hdHRyLm1vZGUgfD0gU19JV1VTUjsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCWlmIChpdGVtLT5kZXZhdHRyLmF0dHIubW9kZSAhPSAwKSB7Ci0JCQlyZXQgPQotCQkJICAgIGRldmljZV9jcmVhdGVfZmlsZSgmc25jcGZfZGV2aWNlLT5kZXYsCi0JCQkJCSAgICAgICAmaXRlbS0+ZGV2YXR0cik7Ci0JCQlpZiAocmV0KQotCQkJCWdvdG8gb3V0X3N5c2ZzOwotCQl9Ci0JfQotCi0JcmV0dXJuIDA7Ci0KLSAgICAgIG91dF9zeXNmczoKLQlmb3IgKGl0ZW0gPSBzb255X2FjcGlfdmFsdWVzOyBpdGVtLT5uYW1lOyArK2l0ZW0pIHsKLQkJZGV2aWNlX3JlbW92ZV9maWxlKCZzbmNwZl9kZXZpY2UtPmRldiwgJml0ZW0tPmRldmF0dHIpOwotCX0KLQlwbGF0Zm9ybV9kZXZpY2VfZGVsKHNuY3BmX2RldmljZSk7Ci0gICAgICBvdXRfcGxhdGZvcm1fYWxsb2NlZDoKLQlwbGF0Zm9ybV9kZXZpY2VfcHV0KHNuY3BmX2RldmljZSk7Ci0gICAgICBvdXRfcGxhdGZvcm1fcmVnaXN0ZXJlZDoKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmc25jcGZfZHJpdmVyKTsKLSAgICAgIG91dDoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBzb255X3NuY19wZl9yZW1vdmUodm9pZCkKLXsKLQlzdHJ1Y3Qgc29ueV9hY3BpX3ZhbHVlICppdGVtOwotCi0JZm9yIChpdGVtID0gc29ueV9hY3BpX3ZhbHVlczsgaXRlbS0+bmFtZTsgKytpdGVtKSB7Ci0JCWRldmljZV9yZW1vdmVfZmlsZSgmc25jcGZfZGV2aWNlLT5kZXYsICZpdGVtLT5kZXZhdHRyKTsKLQl9Ci0KLQlwbGF0Zm9ybV9kZXZpY2VfZGVsKHNuY3BmX2RldmljZSk7Ci0JcGxhdGZvcm1fZGV2aWNlX3B1dChzbmNwZl9kZXZpY2UpOwotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZzbmNwZl9kcml2ZXIpOwotfQogCiAvKgogICogQmFja2xpZ2h0IGRldmljZQogICovCiBzdGF0aWMgaW50IHNvbnlfYmFja2xpZ2h0X3VwZGF0ZV9zdGF0dXMoc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkKQogewotCXJldHVybiBhY3BpX2NhbGxzZXRmdW5jKHNvbnlfYWNwaV9oYW5kbGUsICJTQlJUIiwKKwlyZXR1cm4gYWNwaV9jYWxsc2V0ZnVuYyhzb255X25jX2FjcGlfaGFuZGxlLCAiU0JSVCIsCiAJCQkJYmQtPnByb3BzLmJyaWdodG5lc3MgKyAxLCBOVUxMKTsKIH0KIApAQCAtMzkxLDcgKzY3Niw3IEBACiB7CiAJaW50IHZhbHVlOwogCi0JaWYgKGFjcGlfY2FsbGdldGZ1bmMoc29ueV9hY3BpX2hhbmRsZSwgIkdCUlQiLCAmdmFsdWUpKQorCWlmIChhY3BpX2NhbGxnZXRmdW5jKHNvbnlfbmNfYWNwaV9oYW5kbGUsICJHQlJUIiwgJnZhbHVlKSkKIAkJcmV0dXJuIDA7CiAJLyogYnJpZ2h0bmVzcyBsZXZlbHMgYXJlIDEtYmFzZWQsIHdoaWxlIGJhY2tsaWdodCBvbmVzIGFyZSAwLWJhc2VkICovCiAJcmV0dXJuIHZhbHVlIC0gMTsKQEAgLTQwOCw5ICs2OTMsOSBAQAogICovCiBzdGF0aWMgdm9pZCBzb255X2FjcGlfbm90aWZ5KGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIGV2ZW50LCB2b2lkICpkYXRhKQogewotCWlmIChkZWJ1ZykKLQkJcHJpbnRrKExPR19QRlggInNvbnlfYWNwaV9ub3RpZnksIGV2ZW50OiAlZFxuIiwgZXZlbnQpOwotCWFjcGlfYnVzX2dlbmVyYXRlX2V2ZW50KHNvbnlfYWNwaV9hY3BpX2RldmljZSwgMSwgZXZlbnQpOworCWRwcmludGsoInNvbnlfYWNwaV9ub3RpZnksIGV2ZW50OiAlZFxuIiwgZXZlbnQpOworCXNvbnlfbGFwdG9wX3JlcG9ydF9pbnB1dF9ldmVudChldmVudCk7CisJYWNwaV9idXNfZ2VuZXJhdGVfZXZlbnQoc29ueV9uY19hY3BpX2RldmljZSwgMSwgZXZlbnQpOwogfQogCiBzdGF0aWMgYWNwaV9zdGF0dXMgc29ueV93YWxrX2NhbGxiYWNrKGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIGxldmVsLApAQCAtNDIyLDcgKzcwNyw3IEBACiAJbm9kZSA9IChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKWhhbmRsZTsKIAlvcGVyYW5kID0gKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKilub2RlLT5vYmplY3Q7CiAKLQlwcmludGsoTE9HX1BGWCAibWV0aG9kOiBuYW1lOiAlNC40cywgYXJncyAlWFxuIiwgbm9kZS0+bmFtZS5hc2NpaSwKKwlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9QRlggIm1ldGhvZDogbmFtZTogJTQuNHMsIGFyZ3MgJVhcbiIsIG5vZGUtPm5hbWUuYXNjaWksCiAJICAgICAgICh1MzIpIG9wZXJhbmQtPm1ldGhvZC5wYXJhbV9jb3VudCk7CiAKIAlyZXR1cm4gQUVfT0s7CkBAIC00MzEsMTYgKzcxNiwxNiBAQAogLyoKICAqIEFDUEkgZGV2aWNlCiAgKi8KLXN0YXRpYyBpbnQgc29ueV9hY3BpX3Jlc3VtZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKK3N0YXRpYyBpbnQgc29ueV9uY19yZXN1bWUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCiB7Ci0Jc3RydWN0IHNvbnlfYWNwaV92YWx1ZSAqaXRlbTsKKwlzdHJ1Y3Qgc29ueV9uY192YWx1ZSAqaXRlbTsKIAotCWZvciAoaXRlbSA9IHNvbnlfYWNwaV92YWx1ZXM7IGl0ZW0tPm5hbWU7IGl0ZW0rKykgeworCWZvciAoaXRlbSA9IHNvbnlfbmNfdmFsdWVzOyBpdGVtLT5uYW1lOyBpdGVtKyspIHsKIAkJaW50IHJldDsKIAogCQlpZiAoIWl0ZW0tPnZhbGlkKQogCQkJY29udGludWU7Ci0JCXJldCA9IGFjcGlfY2FsbHNldGZ1bmMoc29ueV9hY3BpX2hhbmRsZSwgKml0ZW0tPmFjcGlzZXQsCisJCXJldCA9IGFjcGlfY2FsbHNldGZ1bmMoc29ueV9uY19hY3BpX2hhbmRsZSwgKml0ZW0tPmFjcGlzZXQsCiAJCQkJICAgICAgIGl0ZW0tPnZhbHVlLCBOVUxMKTsKIAkJaWYgKHJldCA8IDApIHsKIAkJCXByaW50aygiJXM6ICVkXG4iLCBfX0ZVTkNUSU9OX18sIHJldCk7CkBAIC00NTAsNDIgKzczNSw1NSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHNvbnlfYWNwaV9hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCitzdGF0aWMgaW50IHNvbnlfbmNfYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQogewogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAlpbnQgcmVzdWx0ID0gMDsKIAlhY3BpX2hhbmRsZSBoYW5kbGU7CisJc3RydWN0IHNvbnlfbmNfdmFsdWUgKml0ZW07CiAKLQlzb255X2FjcGlfYWNwaV9kZXZpY2UgPSBkZXZpY2U7CisJcHJpbnRrKEtFUk5fSU5GTyBEUlZfUEZYICIlcyB2JXMuXG4iLAorCQlTT05ZX05DX0RSSVZFUl9OQU1FLCBTT05ZX0xBUFRPUF9EUklWRVJfVkVSU0lPTik7CiAKLQlzb255X2FjcGlfaGFuZGxlID0gZGV2aWNlLT5oYW5kbGU7CisJc29ueV9uY19hY3BpX2RldmljZSA9IGRldmljZTsKKwlzdHJjcHkoYWNwaV9kZXZpY2VfY2xhc3MoZGV2aWNlKSwgInNvbnkvaG90a2V5Iik7CisKKwlzb255X25jX2FjcGlfaGFuZGxlID0gZGV2aWNlLT5oYW5kbGU7CiAKIAlpZiAoZGVidWcpIHsKLQkJc3RhdHVzID0gYWNwaV93YWxrX25hbWVzcGFjZShBQ1BJX1RZUEVfTUVUSE9ELCBzb255X2FjcGlfaGFuZGxlLAorCQlzdGF0dXMgPSBhY3BpX3dhbGtfbmFtZXNwYWNlKEFDUElfVFlQRV9NRVRIT0QsIHNvbnlfbmNfYWNwaV9oYW5kbGUsCiAJCQkJCSAgICAgMSwgc29ueV93YWxrX2NhbGxiYWNrLCBOVUxMLCBOVUxMKTsKIAkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQlwcmludGsoTE9HX1BGWCAidW5hYmxlIHRvIHdhbGsgYWNwaSByZXNvdXJjZXNcbiIpOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZfUEZYICJ1bmFibGUgdG8gd2FsayBhY3BpIHJlc291cmNlc1xuIik7CiAJCQlyZXN1bHQgPSAtRU5PREVWOwogCQkJZ290byBvdXR3YWxrOwogCQl9CiAJfQogCi0Jc3RhdHVzID0gYWNwaV9pbnN0YWxsX25vdGlmeV9oYW5kbGVyKHNvbnlfYWNwaV9oYW5kbGUsCi0JCQkJCSAgICAgQUNQSV9ERVZJQ0VfTk9USUZZLAotCQkJCQkgICAgIHNvbnlfYWNwaV9ub3RpZnksIE5VTEwpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlwcmludGsoTE9HX1BGWCAidW5hYmxlIHRvIGluc3RhbGwgbm90aWZ5IGhhbmRsZXJcbiIpOwotCQlyZXN1bHQgPSAtRU5PREVWOworCS8qIHNldHVwIGlucHV0IGRldmljZXMgYW5kIGhlbHBlciBmaWZvICovCisJcmVzdWx0ID0gc29ueV9sYXB0b3Bfc2V0dXBfaW5wdXQoKTsKKwlpZiAocmVzdWx0KSB7CisJCXByaW50ayhLRVJOX0VSUiBEUlZfUEZYCisJCQkJIlVuYWJlIHRvIGNyZWF0ZSBpbnB1dCBkZXZpY2VzLlxuIik7CiAJCWdvdG8gb3V0d2FsazsKIAl9CiAKLQlpZiAoQUNQSV9TVUNDRVNTKGFjcGlfZ2V0X2hhbmRsZShzb255X2FjcGlfaGFuZGxlLCAiR0JSVCIsICZoYW5kbGUpKSkgeworCXN0YXR1cyA9IGFjcGlfaW5zdGFsbF9ub3RpZnlfaGFuZGxlcihzb255X25jX2FjcGlfaGFuZGxlLAorCQkJCQkgICAgIEFDUElfREVWSUNFX05PVElGWSwKKwkJCQkJICAgICBzb255X2FjcGlfbm90aWZ5LCBOVUxMKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZfUEZYICJ1bmFibGUgdG8gaW5zdGFsbCBub3RpZnkgaGFuZGxlclxuIik7CisJCXJlc3VsdCA9IC1FTk9ERVY7CisJCWdvdG8gb3V0aW5wdXQ7CisJfQorCisJaWYgKEFDUElfU1VDQ0VTUyhhY3BpX2dldF9oYW5kbGUoc29ueV9uY19hY3BpX2hhbmRsZSwgIkdCUlQiLCAmaGFuZGxlKSkpIHsKIAkJc29ueV9iYWNrbGlnaHRfZGV2aWNlID0gYmFja2xpZ2h0X2RldmljZV9yZWdpc3Rlcigic29ueSIsIE5VTEwsCiAJCQkJCQkJCSAgTlVMTCwKIAkJCQkJCQkJICAmc29ueV9iYWNrbGlnaHRfb3BzKTsKIAogCQlpZiAoSVNfRVJSKHNvbnlfYmFja2xpZ2h0X2RldmljZSkpIHsKLQkJCXByaW50ayhMT0dfUEZYICJ1bmFibGUgdG8gcmVnaXN0ZXIgYmFja2xpZ2h0IGRldmljZVxuIik7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9QRlggInVuYWJsZSB0byByZWdpc3RlciBiYWNrbGlnaHQgZGV2aWNlXG4iKTsKIAkJCXNvbnlfYmFja2xpZ2h0X2RldmljZSA9IE5VTEw7CiAJCX0gZWxzZSB7CiAJCQlzb255X2JhY2tsaWdodF9kZXZpY2UtPnByb3BzLmJyaWdodG5lc3MgPQpAQCAtNDk3LDY4ICs3OTUsMTQ5NyBAQAogCiAJfQogCi0JaWYgKHNvbnlfc25jX3BmX2FkZCgpKQorCXJlc3VsdCA9IHNvbnlfcGZfYWRkKCk7CisJaWYgKHJlc3VsdCkKIAkJZ290byBvdXRiYWNrbGlnaHQ7CiAKLQlwcmludGsoS0VSTl9JTkZPIEFDUElfU05DX0RSSVZFUl9OQU1FICIgc3VjY2Vzc2Z1bGx5IGluc3RhbGxlZFxuIik7CisJLyogY3JlYXRlIHNvbnlfcGYgc3lzZnMgYXR0cmlidXRlcyByZWxhdGVkIHRvIHRoZSBTTkMgZGV2aWNlICovCisJZm9yIChpdGVtID0gc29ueV9uY192YWx1ZXM7IGl0ZW0tPm5hbWU7ICsraXRlbSkgeworCisJCWlmICghZGVidWcgJiYgaXRlbS0+ZGVidWcpCisJCQljb250aW51ZTsKKworCQkvKiBmaW5kIHRoZSBhdmFpbGFibGUgYWNwaWdldCBhcyBkZXNjcmliZWQgaW4gdGhlIERTRFQgKi8KKwkJZm9yICg7IGl0ZW0tPmFjcGlnZXQgJiYgKml0ZW0tPmFjcGlnZXQ7ICsraXRlbS0+YWNwaWdldCkgeworCQkJaWYgKEFDUElfU1VDQ0VTUyhhY3BpX2dldF9oYW5kbGUoc29ueV9uY19hY3BpX2hhbmRsZSwKKwkJCQkJCQkgKml0ZW0tPmFjcGlnZXQsCisJCQkJCQkJICZoYW5kbGUpKSkgeworCQkJCWRwcmludGsoIkZvdW5kICVzIGdldHRlcjogJXNcbiIsCisJCQkJCQlpdGVtLT5uYW1lLCAqaXRlbS0+YWNwaWdldCk7CisJCQkJaXRlbS0+ZGV2YXR0ci5hdHRyLm1vZGUgfD0gU19JUlVHTzsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCS8qIGZpbmQgdGhlIGF2YWlsYWJsZSBhY3Bpc2V0IGFzIGRlc2NyaWJlZCBpbiB0aGUgRFNEVCAqLworCQlmb3IgKDsgaXRlbS0+YWNwaXNldCAmJiAqaXRlbS0+YWNwaXNldDsgKytpdGVtLT5hY3Bpc2V0KSB7CisJCQlpZiAoQUNQSV9TVUNDRVNTKGFjcGlfZ2V0X2hhbmRsZShzb255X25jX2FjcGlfaGFuZGxlLAorCQkJCQkJCSAqaXRlbS0+YWNwaXNldCwKKwkJCQkJCQkgJmhhbmRsZSkpKSB7CisJCQkJZHByaW50aygiRm91bmQgJXMgc2V0dGVyOiAlc1xuIiwKKwkJCQkJCWl0ZW0tPm5hbWUsICppdGVtLT5hY3Bpc2V0KTsKKwkJCQlpdGVtLT5kZXZhdHRyLmF0dHIubW9kZSB8PSBTX0lXVVNSOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJaWYgKGl0ZW0tPmRldmF0dHIuYXR0ci5tb2RlICE9IDApIHsKKwkJCXJlc3VsdCA9CisJCQkgICAgZGV2aWNlX2NyZWF0ZV9maWxlKCZzb255X3BmX2RldmljZS0+ZGV2LAorCQkJCQkgICAgICAgJml0ZW0tPmRldmF0dHIpOworCQkJaWYgKHJlc3VsdCkKKwkJCQlnb3RvIG91dF9zeXNmczsKKwkJfQorCX0KIAogCXJldHVybiAwOwogCisgICAgICBvdXRfc3lzZnM6CisJZm9yIChpdGVtID0gc29ueV9uY192YWx1ZXM7IGl0ZW0tPm5hbWU7ICsraXRlbSkgeworCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnNvbnlfcGZfZGV2aWNlLT5kZXYsICZpdGVtLT5kZXZhdHRyKTsKKwl9CisJc29ueV9wZl9yZW1vdmUoKTsKKwogICAgICAgb3V0YmFja2xpZ2h0OgogCWlmIChzb255X2JhY2tsaWdodF9kZXZpY2UpCiAJCWJhY2tsaWdodF9kZXZpY2VfdW5yZWdpc3Rlcihzb255X2JhY2tsaWdodF9kZXZpY2UpOwogCi0Jc3RhdHVzID0gYWNwaV9yZW1vdmVfbm90aWZ5X2hhbmRsZXIoc29ueV9hY3BpX2hhbmRsZSwKKwlzdGF0dXMgPSBhY3BpX3JlbW92ZV9ub3RpZnlfaGFuZGxlcihzb255X25jX2FjcGlfaGFuZGxlLAogCQkJCQkgICAgQUNQSV9ERVZJQ0VfTk9USUZZLAogCQkJCQkgICAgc29ueV9hY3BpX25vdGlmeSk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQotCQlwcmludGsoTE9HX1BGWCAidW5hYmxlIHRvIHJlbW92ZSBub3RpZnkgaGFuZGxlclxuIik7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX1BGWCAidW5hYmxlIHRvIHJlbW92ZSBub3RpZnkgaGFuZGxlclxuIik7CisKKyAgICAgIG91dGlucHV0OgorCXNvbnlfbGFwdG9wX3JlbW92ZV9pbnB1dCgpOworCiAgICAgICBvdXR3YWxrOgogCXJldHVybiByZXN1bHQ7CiB9CiAKLXN0YXRpYyBpbnQgc29ueV9hY3BpX3JlbW92ZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpCitzdGF0aWMgaW50IHNvbnlfbmNfcmVtb3ZlKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgdHlwZSkKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IHNvbnlfbmNfdmFsdWUgKml0ZW07CiAKIAlpZiAoc29ueV9iYWNrbGlnaHRfZGV2aWNlKQogCQliYWNrbGlnaHRfZGV2aWNlX3VucmVnaXN0ZXIoc29ueV9iYWNrbGlnaHRfZGV2aWNlKTsKIAotCXNvbnlfYWNwaV9hY3BpX2RldmljZSA9IE5VTEw7CisJc29ueV9uY19hY3BpX2RldmljZSA9IE5VTEw7CiAKLQlzdGF0dXMgPSBhY3BpX3JlbW92ZV9ub3RpZnlfaGFuZGxlcihzb255X2FjcGlfaGFuZGxlLAorCXN0YXR1cyA9IGFjcGlfcmVtb3ZlX25vdGlmeV9oYW5kbGVyKHNvbnlfbmNfYWNwaV9oYW5kbGUsCiAJCQkJCSAgICBBQ1BJX0RFVklDRV9OT1RJRlksCiAJCQkJCSAgICBzb255X2FjcGlfbm90aWZ5KTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCi0JCXByaW50ayhMT0dfUEZYICJ1bmFibGUgdG8gcmVtb3ZlIG5vdGlmeSBoYW5kbGVyXG4iKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZfUEZYICJ1bmFibGUgdG8gcmVtb3ZlIG5vdGlmeSBoYW5kbGVyXG4iKTsKIAotCXNvbnlfc25jX3BmX3JlbW92ZSgpOworCWZvciAoaXRlbSA9IHNvbnlfbmNfdmFsdWVzOyBpdGVtLT5uYW1lOyArK2l0ZW0pIHsKKwkJZGV2aWNlX3JlbW92ZV9maWxlKCZzb255X3BmX2RldmljZS0+ZGV2LCAmaXRlbS0+ZGV2YXR0cik7CisJfQogCi0JcHJpbnRrKEtFUk5fSU5GTyBBQ1BJX1NOQ19EUklWRVJfTkFNRSAiIHN1Y2Nlc3NmdWxseSByZW1vdmVkXG4iKTsKKwlzb255X3BmX3JlbW92ZSgpOworCXNvbnlfbGFwdG9wX3JlbW92ZV9pbnB1dCgpOworCWRwcmludGsoU09OWV9OQ19EUklWRVJfTkFNRSAiIHJlbW92ZWQuXG4iKTsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IGFjcGlfZHJpdmVyIHNvbnlfYWNwaV9kcml2ZXIgPSB7Ci0JLm5hbWUgPSBBQ1BJX1NOQ19EUklWRVJfTkFNRSwKLQkuY2xhc3MgPSBBQ1BJX1NOQ19DTEFTUywKLQkuaWRzID0gQUNQSV9TTkNfSElELAorc3RhdGljIHN0cnVjdCBhY3BpX2RyaXZlciBzb255X25jX2RyaXZlciA9IHsKKwkubmFtZSA9IFNPTllfTkNfRFJJVkVSX05BTUUsCisJLmNsYXNzID0gU09OWV9OQ19DTEFTUywKKwkuaWRzID0gU09OWV9OQ19ISUQsCisJLm93bmVyID0gVEhJU19NT0RVTEUsCiAJLm9wcyA9IHsKLQkJLmFkZCA9IHNvbnlfYWNwaV9hZGQsCi0JCS5yZW1vdmUgPSBzb255X2FjcGlfcmVtb3ZlLAotCQkucmVzdW1lID0gc29ueV9hY3BpX3Jlc3VtZSwKKwkJLmFkZCA9IHNvbnlfbmNfYWRkLAorCQkucmVtb3ZlID0gc29ueV9uY19yZW1vdmUsCisJCS5yZXN1bWUgPSBzb255X25jX3Jlc3VtZSwKIAkJfSwKIH07CiAKLXN0YXRpYyBpbnQgX19pbml0IHNvbnlfYWNwaV9pbml0KHZvaWQpCisvKioqKioqKioqKiogU1BJQyAoU05ZNjAwMSkgRGV2aWNlICoqKioqKioqKioqLworCisjZGVmaW5lIFNPTllQSV9ERVZJQ0VfVFlQRTEJMHgwMDAwMDAwMQorI2RlZmluZSBTT05ZUElfREVWSUNFX1RZUEUyCTB4MDAwMDAwMDIKKyNkZWZpbmUgU09OWVBJX0RFVklDRV9UWVBFMwkweDAwMDAwMDA0CisKKyNkZWZpbmUgU09OWV9QSUNfRVZfTUFTSwkweGZmCisKK3N0cnVjdCBzb255X3BpY19pb3BvcnQgeworCXN0cnVjdCBhY3BpX3Jlc291cmNlX2lvCWlvOworCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKK307CisKK3N0cnVjdCBzb255X3BpY19pcnEgeworCXN0cnVjdCBhY3BpX3Jlc291cmNlX2lycQlpcnE7CisJc3RydWN0IGxpc3RfaGVhZAkJbGlzdDsKK307CisKK3N0cnVjdCBzb255X3BpY19kZXYgeworCWludAkJCW1vZGVsOworCXU4CQkJY2FtZXJhX3Bvd2VyOworCXU4CQkJYmx1ZXRvb3RoX3Bvd2VyOworCXU4CQkJd3dhbl9wb3dlcjsKKwlzdHJ1Y3QgYWNwaV9kZXZpY2UJKmFjcGlfZGV2OworCXN0cnVjdCBzb255X3BpY19pcnEJKmN1cl9pcnE7CisJc3RydWN0IHNvbnlfcGljX2lvcG9ydAkqY3VyX2lvcG9ydDsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWludGVycnVwdHM7CisJc3RydWN0IGxpc3RfaGVhZAlpb3BvcnRzOworCXN0cnVjdCBtdXRleAkJbG9jazsKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc29ueV9waWNfZGV2IHNwaWNfZGV2ID0geworCS5pbnRlcnJ1cHRzCT0gTElTVF9IRUFEX0lOSVQoc3BpY19kZXYuaW50ZXJydXB0cyksCisJLmlvcG9ydHMJPSBMSVNUX0hFQURfSU5JVChzcGljX2Rldi5pb3BvcnRzKSwKK307CisKKy8qIEV2ZW50IG1hc2tzICovCisjZGVmaW5lIFNPTllQSV9KT0dHRVJfTUFTSwkJCTB4MDAwMDAwMDEKKyNkZWZpbmUgU09OWVBJX0NBUFRVUkVfTUFTSwkJCTB4MDAwMDAwMDIKKyNkZWZpbmUgU09OWVBJX0ZOS0VZX01BU0sJCQkweDAwMDAwMDA0CisjZGVmaW5lIFNPTllQSV9CTFVFVE9PVEhfTUFTSwkJCTB4MDAwMDAwMDgKKyNkZWZpbmUgU09OWVBJX1BLRVlfTUFTSwkJCTB4MDAwMDAwMTAKKyNkZWZpbmUgU09OWVBJX0JBQ0tfTUFTSwkJCTB4MDAwMDAwMjAKKyNkZWZpbmUgU09OWVBJX0hFTFBfTUFTSwkJCTB4MDAwMDAwNDAKKyNkZWZpbmUgU09OWVBJX0xJRF9NQVNLCQkJCTB4MDAwMDAwODAKKyNkZWZpbmUgU09OWVBJX1pPT01fTUFTSwkJCTB4MDAwMDAxMDAKKyNkZWZpbmUgU09OWVBJX1RIVU1CUEhSQVNFX01BU0sJCQkweDAwMDAwMjAwCisjZGVmaW5lIFNPTllQSV9NRVlFX01BU0sJCQkweDAwMDAwNDAwCisjZGVmaW5lIFNPTllQSV9NRU1PUllTVElDS19NQVNLCQkJMHgwMDAwMDgwMAorI2RlZmluZSBTT05ZUElfQkFUVEVSWV9NQVNLCQkJMHgwMDAwMTAwMAorI2RlZmluZSBTT05ZUElfV0lSRUxFU1NfTUFTSwkJCTB4MDAwMDIwMDAKKworc3RydWN0IHNvbnlwaV9ldmVudCB7CisJdTgJZGF0YTsKKwl1OAlldmVudDsKK307CisKKy8qIFRoZSBzZXQgb2YgcG9zc2libGUgYnV0dG9uIHJlbGVhc2UgZXZlbnRzICovCitzdGF0aWMgc3RydWN0IHNvbnlwaV9ldmVudCBzb255cGlfcmVsZWFzZWV2W10gPSB7CisJeyAweDAwLCBTT05ZUElfRVZFTlRfQU5ZQlVUVE9OX1JFTEVBU0VEIH0sCisJeyAwLCAwIH0KK307CisKKy8qIFRoZSBzZXQgb2YgcG9zc2libGUgam9nZ2VyIGV2ZW50cyAgKi8KK3N0YXRpYyBzdHJ1Y3Qgc29ueXBpX2V2ZW50IHNvbnlwaV9qb2dnZXJldltdID0geworCXsgMHgxZiwgU09OWVBJX0VWRU5UX0pPR0RJQUxfVVAgfSwKKwl7IDB4MDEsIFNPTllQSV9FVkVOVF9KT0dESUFMX0RPV04gfSwKKwl7IDB4NWYsIFNPTllQSV9FVkVOVF9KT0dESUFMX1VQX1BSRVNTRUQgfSwKKwl7IDB4NDEsIFNPTllQSV9FVkVOVF9KT0dESUFMX0RPV05fUFJFU1NFRCB9LAorCXsgMHgxZSwgU09OWVBJX0VWRU5UX0pPR0RJQUxfRkFTVF9VUCB9LAorCXsgMHgwMiwgU09OWVBJX0VWRU5UX0pPR0RJQUxfRkFTVF9ET1dOIH0sCisJeyAweDVlLCBTT05ZUElfRVZFTlRfSk9HRElBTF9GQVNUX1VQX1BSRVNTRUQgfSwKKwl7IDB4NDIsIFNPTllQSV9FVkVOVF9KT0dESUFMX0ZBU1RfRE9XTl9QUkVTU0VEIH0sCisJeyAweDFkLCBTT05ZUElfRVZFTlRfSk9HRElBTF9WRkFTVF9VUCB9LAorCXsgMHgwMywgU09OWVBJX0VWRU5UX0pPR0RJQUxfVkZBU1RfRE9XTiB9LAorCXsgMHg1ZCwgU09OWVBJX0VWRU5UX0pPR0RJQUxfVkZBU1RfVVBfUFJFU1NFRCB9LAorCXsgMHg0MywgU09OWVBJX0VWRU5UX0pPR0RJQUxfVkZBU1RfRE9XTl9QUkVTU0VEIH0sCisJeyAweDQwLCBTT05ZUElfRVZFTlRfSk9HRElBTF9QUkVTU0VEIH0sCisJeyAwLCAwIH0KK307CisKKy8qIFRoZSBzZXQgb2YgcG9zc2libGUgY2FwdHVyZSBidXR0b24gZXZlbnRzICovCitzdGF0aWMgc3RydWN0IHNvbnlwaV9ldmVudCBzb255cGlfY2FwdHVyZWV2W10gPSB7CisJeyAweDA1LCBTT05ZUElfRVZFTlRfQ0FQVFVSRV9QQVJUSUFMUFJFU1NFRCB9LAorCXsgMHgwNywgU09OWVBJX0VWRU5UX0NBUFRVUkVfUFJFU1NFRCB9LAorCXsgMHgwMSwgU09OWVBJX0VWRU5UX0NBUFRVUkVfUEFSVElBTFJFTEVBU0VEIH0sCisJeyAwLCAwIH0KK307CisKKy8qIFRoZSBzZXQgb2YgcG9zc2libGUgZm5rZXlzIGV2ZW50cyAqLworc3RhdGljIHN0cnVjdCBzb255cGlfZXZlbnQgc29ueXBpX2Zua2V5ZXZbXSA9IHsKKwl7IDB4MTAsIFNPTllQSV9FVkVOVF9GTktFWV9FU0MgfSwKKwl7IDB4MTEsIFNPTllQSV9FVkVOVF9GTktFWV9GMSB9LAorCXsgMHgxMiwgU09OWVBJX0VWRU5UX0ZOS0VZX0YyIH0sCisJeyAweDEzLCBTT05ZUElfRVZFTlRfRk5LRVlfRjMgfSwKKwl7IDB4MTQsIFNPTllQSV9FVkVOVF9GTktFWV9GNCB9LAorCXsgMHgxNSwgU09OWVBJX0VWRU5UX0ZOS0VZX0Y1IH0sCisJeyAweDE2LCBTT05ZUElfRVZFTlRfRk5LRVlfRjYgfSwKKwl7IDB4MTcsIFNPTllQSV9FVkVOVF9GTktFWV9GNyB9LAorCXsgMHgxOCwgU09OWVBJX0VWRU5UX0ZOS0VZX0Y4IH0sCisJeyAweDE5LCBTT05ZUElfRVZFTlRfRk5LRVlfRjkgfSwKKwl7IDB4MWEsIFNPTllQSV9FVkVOVF9GTktFWV9GMTAgfSwKKwl7IDB4MWIsIFNPTllQSV9FVkVOVF9GTktFWV9GMTEgfSwKKwl7IDB4MWMsIFNPTllQSV9FVkVOVF9GTktFWV9GMTIgfSwKKwl7IDB4MWYsIFNPTllQSV9FVkVOVF9GTktFWV9SRUxFQVNFRCB9LAorCXsgMHgyMSwgU09OWVBJX0VWRU5UX0ZOS0VZXzEgfSwKKwl7IDB4MjIsIFNPTllQSV9FVkVOVF9GTktFWV8yIH0sCisJeyAweDMxLCBTT05ZUElfRVZFTlRfRk5LRVlfRCB9LAorCXsgMHgzMiwgU09OWVBJX0VWRU5UX0ZOS0VZX0UgfSwKKwl7IDB4MzMsIFNPTllQSV9FVkVOVF9GTktFWV9GIH0sCisJeyAweDM0LCBTT05ZUElfRVZFTlRfRk5LRVlfUyB9LAorCXsgMHgzNSwgU09OWVBJX0VWRU5UX0ZOS0VZX0IgfSwKKwl7IDB4MzYsIFNPTllQSV9FVkVOVF9GTktFWV9PTkxZIH0sCisJeyAwLCAwIH0KK307CisKKy8qIFRoZSBzZXQgb2YgcG9zc2libGUgcHJvZ3JhbSBrZXkgZXZlbnRzICovCitzdGF0aWMgc3RydWN0IHNvbnlwaV9ldmVudCBzb255cGlfcGtleWV2W10gPSB7CisJeyAweDAxLCBTT05ZUElfRVZFTlRfUEtFWV9QMSB9LAorCXsgMHgwMiwgU09OWVBJX0VWRU5UX1BLRVlfUDIgfSwKKwl7IDB4MDQsIFNPTllQSV9FVkVOVF9QS0VZX1AzIH0sCisJeyAweDVjLCBTT05ZUElfRVZFTlRfUEtFWV9QMSB9LAorCXsgMCwgMCB9Cit9OworCisvKiBUaGUgc2V0IG9mIHBvc3NpYmxlIGJsdWV0b290aCBldmVudHMgKi8KK3N0YXRpYyBzdHJ1Y3Qgc29ueXBpX2V2ZW50IHNvbnlwaV9ibHVlZXZbXSA9IHsKKwl7IDB4NTUsIFNPTllQSV9FVkVOVF9CTFVFVE9PVEhfUFJFU1NFRCB9LAorCXsgMHg1OSwgU09OWVBJX0VWRU5UX0JMVUVUT09USF9PTiB9LAorCXsgMHg1YSwgU09OWVBJX0VWRU5UX0JMVUVUT09USF9PRkYgfSwKKwl7IDAsIDAgfQorfTsKKworLyogVGhlIHNldCBvZiBwb3NzaWJsZSB3aXJlbGVzcyBldmVudHMgKi8KK3N0YXRpYyBzdHJ1Y3Qgc29ueXBpX2V2ZW50IHNvbnlwaV93bGVzc2V2W10gPSB7CisJeyAweDU5LCBTT05ZUElfRVZFTlRfV0lSRUxFU1NfT04gfSwKKwl7IDB4NWEsIFNPTllQSV9FVkVOVF9XSVJFTEVTU19PRkYgfSwKKwl7IDAsIDAgfQorfTsKKworLyogVGhlIHNldCBvZiBwb3NzaWJsZSBiYWNrIGJ1dHRvbiBldmVudHMgKi8KK3N0YXRpYyBzdHJ1Y3Qgc29ueXBpX2V2ZW50IHNvbnlwaV9iYWNrZXZbXSA9IHsKKwl7IDB4MjAsIFNPTllQSV9FVkVOVF9CQUNLX1BSRVNTRUQgfSwKKwl7IDAsIDAgfQorfTsKKworLyogVGhlIHNldCBvZiBwb3NzaWJsZSBoZWxwIGJ1dHRvbiBldmVudHMgKi8KK3N0YXRpYyBzdHJ1Y3Qgc29ueXBpX2V2ZW50IHNvbnlwaV9oZWxwZXZbXSA9IHsKKwl7IDB4M2IsIFNPTllQSV9FVkVOVF9IRUxQX1BSRVNTRUQgfSwKKwl7IDAsIDAgfQorfTsKKworCisvKiBUaGUgc2V0IG9mIHBvc3NpYmxlIGxpZCBldmVudHMgKi8KK3N0YXRpYyBzdHJ1Y3Qgc29ueXBpX2V2ZW50IHNvbnlwaV9saWRldltdID0geworCXsgMHg1MSwgU09OWVBJX0VWRU5UX0xJRF9DTE9TRUQgfSwKKwl7IDB4NTAsIFNPTllQSV9FVkVOVF9MSURfT1BFTkVEIH0sCisJeyAwLCAwIH0KK307CisKKy8qIFRoZSBzZXQgb2YgcG9zc2libGUgem9vbSBldmVudHMgKi8KK3N0YXRpYyBzdHJ1Y3Qgc29ueXBpX2V2ZW50IHNvbnlwaV96b29tZXZbXSA9IHsKKwl7IDB4MzksIFNPTllQSV9FVkVOVF9aT09NX1BSRVNTRUQgfSwKKwl7IDAsIDAgfQorfTsKKworLyogVGhlIHNldCBvZiBwb3NzaWJsZSB0aHVtYnBocmFzZSBldmVudHMgKi8KK3N0YXRpYyBzdHJ1Y3Qgc29ueXBpX2V2ZW50IHNvbnlwaV90aHVtYnBocmFzZWV2W10gPSB7CisJeyAweDNhLCBTT05ZUElfRVZFTlRfVEhVTUJQSFJBU0VfUFJFU1NFRCB9LAorCXsgMCwgMCB9Cit9OworCisvKiBUaGUgc2V0IG9mIHBvc3NpYmxlIG1vdGlvbmV5ZSBjYW1lcmEgZXZlbnRzICovCitzdGF0aWMgc3RydWN0IHNvbnlwaV9ldmVudCBzb255cGlfbWV5ZWV2W10gPSB7CisJeyAweDAwLCBTT05ZUElfRVZFTlRfTUVZRV9GQUNFIH0sCisJeyAweDAxLCBTT05ZUElfRVZFTlRfTUVZRV9PUFBPU0lURSB9LAorCXsgMCwgMCB9Cit9OworCisvKiBUaGUgc2V0IG9mIHBvc3NpYmxlIG1lbW9yeXN0aWNrIGV2ZW50cyAqLworc3RhdGljIHN0cnVjdCBzb255cGlfZXZlbnQgc29ueXBpX21lbW9yeXN0aWNrZXZbXSA9IHsKKwl7IDB4NTMsIFNPTllQSV9FVkVOVF9NRU1PUllTVElDS19JTlNFUlQgfSwKKwl7IDB4NTQsIFNPTllQSV9FVkVOVF9NRU1PUllTVElDS19FSkVDVCB9LAorCXsgMCwgMCB9Cit9OworCisvKiBUaGUgc2V0IG9mIHBvc3NpYmxlIGJhdHRlcnkgZXZlbnRzICovCitzdGF0aWMgc3RydWN0IHNvbnlwaV9ldmVudCBzb255cGlfYmF0dGVyeWV2W10gPSB7CisJeyAweDIwLCBTT05ZUElfRVZFTlRfQkFUVEVSWV9JTlNFUlQgfSwKKwl7IDB4MzAsIFNPTllQSV9FVkVOVF9CQVRURVJZX1JFTU9WRSB9LAorCXsgMCwgMCB9Cit9OworCitzdGF0aWMgc3RydWN0IHNvbnlwaV9ldmVudHR5cGVzIHsKKwlpbnQJCQltb2RlbDsKKwl1OAkJCWRhdGE7CisJdW5zaWduZWQgbG9uZwkJbWFzazsKKwlzdHJ1Y3Qgc29ueXBpX2V2ZW50ICoJZXZlbnRzOworfSBzb255X3BpY19ldmVudHR5cGVzW10gPSB7CisJeyBTT05ZUElfREVWSUNFX1RZUEUxLCAwLCAweGZmZmZmZmZmLCBzb255cGlfcmVsZWFzZWV2IH0sCisJeyBTT05ZUElfREVWSUNFX1RZUEUxLCAweDcwLCBTT05ZUElfTUVZRV9NQVNLLCBzb255cGlfbWV5ZWV2IH0sCisJeyBTT05ZUElfREVWSUNFX1RZUEUxLCAweDMwLCBTT05ZUElfTElEX01BU0ssIHNvbnlwaV9saWRldiB9LAorCXsgU09OWVBJX0RFVklDRV9UWVBFMSwgMHg2MCwgU09OWVBJX0NBUFRVUkVfTUFTSywgc29ueXBpX2NhcHR1cmVldiB9LAorCXsgU09OWVBJX0RFVklDRV9UWVBFMSwgMHgxMCwgU09OWVBJX0pPR0dFUl9NQVNLLCBzb255cGlfam9nZ2VyZXYgfSwKKwl7IFNPTllQSV9ERVZJQ0VfVFlQRTEsIDB4MjAsIFNPTllQSV9GTktFWV9NQVNLLCBzb255cGlfZm5rZXlldiB9LAorCXsgU09OWVBJX0RFVklDRV9UWVBFMSwgMHgzMCwgU09OWVBJX0JMVUVUT09USF9NQVNLLCBzb255cGlfYmx1ZWV2IH0sCisJeyBTT05ZUElfREVWSUNFX1RZUEUxLCAweDQwLCBTT05ZUElfUEtFWV9NQVNLLCBzb255cGlfcGtleWV2IH0sCisJeyBTT05ZUElfREVWSUNFX1RZUEUxLCAweDMwLCBTT05ZUElfTUVNT1JZU1RJQ0tfTUFTSywgc29ueXBpX21lbW9yeXN0aWNrZXYgfSwKKwl7IFNPTllQSV9ERVZJQ0VfVFlQRTEsIDB4NDAsIFNPTllQSV9CQVRURVJZX01BU0ssIHNvbnlwaV9iYXR0ZXJ5ZXYgfSwKKworCXsgU09OWVBJX0RFVklDRV9UWVBFMiwgMCwgMHhmZmZmZmZmZiwgc29ueXBpX3JlbGVhc2VldiB9LAorCXsgU09OWVBJX0RFVklDRV9UWVBFMiwgMHgzOCwgU09OWVBJX0xJRF9NQVNLLCBzb255cGlfbGlkZXYgfSwKKwl7IFNPTllQSV9ERVZJQ0VfVFlQRTIsIDB4MTEsIFNPTllQSV9KT0dHRVJfTUFTSywgc29ueXBpX2pvZ2dlcmV2IH0sCisJeyBTT05ZUElfREVWSUNFX1RZUEUyLCAweDYxLCBTT05ZUElfQ0FQVFVSRV9NQVNLLCBzb255cGlfY2FwdHVyZWV2IH0sCisJeyBTT05ZUElfREVWSUNFX1RZUEUyLCAweDIxLCBTT05ZUElfRk5LRVlfTUFTSywgc29ueXBpX2Zua2V5ZXYgfSwKKwl7IFNPTllQSV9ERVZJQ0VfVFlQRTIsIDB4MzEsIFNPTllQSV9CTFVFVE9PVEhfTUFTSywgc29ueXBpX2JsdWVldiB9LAorCXsgU09OWVBJX0RFVklDRV9UWVBFMiwgMHgwOCwgU09OWVBJX1BLRVlfTUFTSywgc29ueXBpX3BrZXlldiB9LAorCXsgU09OWVBJX0RFVklDRV9UWVBFMiwgMHgxMSwgU09OWVBJX0JBQ0tfTUFTSywgc29ueXBpX2JhY2tldiB9LAorCXsgU09OWVBJX0RFVklDRV9UWVBFMiwgMHgyMSwgU09OWVBJX0hFTFBfTUFTSywgc29ueXBpX2hlbHBldiB9LAorCXsgU09OWVBJX0RFVklDRV9UWVBFMiwgMHgyMSwgU09OWVBJX1pPT01fTUFTSywgc29ueXBpX3pvb21ldiB9LAorCXsgU09OWVBJX0RFVklDRV9UWVBFMiwgMHgyMCwgU09OWVBJX1RIVU1CUEhSQVNFX01BU0ssIHNvbnlwaV90aHVtYnBocmFzZWV2IH0sCisJeyBTT05ZUElfREVWSUNFX1RZUEUyLCAweDMxLCBTT05ZUElfTUVNT1JZU1RJQ0tfTUFTSywgc29ueXBpX21lbW9yeXN0aWNrZXYgfSwKKwl7IFNPTllQSV9ERVZJQ0VfVFlQRTIsIDB4NDEsIFNPTllQSV9CQVRURVJZX01BU0ssIHNvbnlwaV9iYXR0ZXJ5ZXYgfSwKKwl7IFNPTllQSV9ERVZJQ0VfVFlQRTIsIDB4MzEsIFNPTllQSV9QS0VZX01BU0ssIHNvbnlwaV9wa2V5ZXYgfSwKKworCXsgU09OWVBJX0RFVklDRV9UWVBFMywgMCwgMHhmZmZmZmZmZiwgc29ueXBpX3JlbGVhc2VldiB9LAorCXsgU09OWVBJX0RFVklDRV9UWVBFMywgMHgyMSwgU09OWVBJX0ZOS0VZX01BU0ssIHNvbnlwaV9mbmtleWV2IH0sCisJeyBTT05ZUElfREVWSUNFX1RZUEUzLCAweDMxLCBTT05ZUElfV0lSRUxFU1NfTUFTSywgc29ueXBpX3dsZXNzZXYgfSwKKwl7IFNPTllQSV9ERVZJQ0VfVFlQRTMsIDB4MzEsIFNPTllQSV9NRU1PUllTVElDS19NQVNLLCBzb255cGlfbWVtb3J5c3RpY2tldiB9LAorCXsgU09OWVBJX0RFVklDRV9UWVBFMywgMHg0MSwgU09OWVBJX0JBVFRFUllfTUFTSywgc29ueXBpX2JhdHRlcnlldiB9LAorCXsgU09OWVBJX0RFVklDRV9UWVBFMywgMHgzMSwgU09OWVBJX1BLRVlfTUFTSywgc29ueXBpX3BrZXlldiB9LAorCXsgMCB9Cit9OworCitzdGF0aWMgaW50IHNvbnlfcGljX2RldGVjdF9kZXZpY2VfdHlwZSh2b2lkKQogewotCXJldHVybiBhY3BpX2J1c19yZWdpc3Rlcl9kcml2ZXIoJnNvbnlfYWNwaV9kcml2ZXIpOworCXN0cnVjdCBwY2lfZGV2ICpwY2lkZXY7CisJaW50IG1vZGVsID0gMDsKKworCWlmICgocGNpZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9JTlRFTCwKKwkJCQkgICAgIFBDSV9ERVZJQ0VfSURfSU5URUxfODIzNzFBQl8zLCBOVUxMKSkpCisJCW1vZGVsID0gU09OWVBJX0RFVklDRV9UWVBFMTsKKworCWVsc2UgaWYgKChwY2lkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0lOVEVMLAorCQkJCQkgIFBDSV9ERVZJQ0VfSURfSU5URUxfSUNINl8xLCBOVUxMKSkpCisJCW1vZGVsID0gU09OWVBJX0RFVklDRV9UWVBFMzsKKworCWVsc2UgaWYgKChwY2lkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0lOVEVMLAorCQkJCQkgIFBDSV9ERVZJQ0VfSURfSU5URUxfSUNIN18xLCBOVUxMKSkpCisJCW1vZGVsID0gU09OWVBJX0RFVklDRV9UWVBFMzsKKworCWVsc2UKKwkJbW9kZWwgPSBTT05ZUElfREVWSUNFX1RZUEUyOworCisJaWYgKHBjaWRldikKKwkJcGNpX2Rldl9wdXQocGNpZGV2KTsKKworCXByaW50ayhLRVJOX0lORk8gRFJWX1BGWCAiZGV0ZWN0ZWQgVHlwZSVkIG1vZGVsXG4iLAorCQkJbW9kZWwgPT0gU09OWVBJX0RFVklDRV9UWVBFMSA/IDEgOgorCQkJbW9kZWwgPT0gU09OWVBJX0RFVklDRV9UWVBFMiA/IDIgOiAzKTsKKwlyZXR1cm4gbW9kZWw7CiB9CiAKLXN0YXRpYyB2b2lkIF9fZXhpdCBzb255X2FjcGlfZXhpdCh2b2lkKQotewotCWFjcGlfYnVzX3VucmVnaXN0ZXJfZHJpdmVyKCZzb255X2FjcGlfZHJpdmVyKTsKKyNkZWZpbmUgSVRFUkFUSU9OU19MT05HCQkxMDAwMAorI2RlZmluZSBJVEVSQVRJT05TX1NIT1JUCTEwCisjZGVmaW5lIHdhaXRfb25fY29tbWFuZChjb21tYW5kLCBpdGVyYXRpb25zKSB7CQkJCVwKKwl1bnNpZ25lZCBpbnQgbiA9IGl0ZXJhdGlvbnM7CQkJCQlcCisJd2hpbGUgKC0tbiAmJiAoY29tbWFuZCkpCQkJCQlcCisJCXVkZWxheSgxKTsJCQkJCQlcCisJaWYgKCFuKQkJCQkJCQkJXAorCQlkcHJpbnRrKCJjb21tYW5kIGZhaWxlZCBhdCAlcyA6ICVzIChsaW5lICVkKVxuIiwJXAorCQkJCV9fRklMRV9fLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsJXAogfQogCi1tb2R1bGVfaW5pdChzb255X2FjcGlfaW5pdCk7Ci1tb2R1bGVfZXhpdChzb255X2FjcGlfZXhpdCk7CitzdGF0aWMgdTggc29ueV9waWNfY2FsbDEodTggZGV2KQoreworCXU4IHYxLCB2MjsKKworCXdhaXRfb25fY29tbWFuZChpbmJfcChzcGljX2Rldi5jdXJfaW9wb3J0LT5pby5taW5pbXVtICsgNCkgJiAyLAorCQkJSVRFUkFUSU9OU19MT05HKTsKKwlvdXRiKGRldiwgc3BpY19kZXYuY3VyX2lvcG9ydC0+aW8ubWluaW11bSArIDQpOworCXYxID0gaW5iX3Aoc3BpY19kZXYuY3VyX2lvcG9ydC0+aW8ubWluaW11bSArIDQpOworCXYyID0gaW5iX3Aoc3BpY19kZXYuY3VyX2lvcG9ydC0+aW8ubWluaW11bSk7CisJZHByaW50aygic29ueV9waWNfY2FsbDE6IDB4JS40eFxuIiwgKHYyIDw8IDgpIHwgdjEpOworCXJldHVybiB2MjsKK30KKworc3RhdGljIHU4IHNvbnlfcGljX2NhbGwyKHU4IGRldiwgdTggZm4pCit7CisJdTggdjE7CisKKwl3YWl0X29uX2NvbW1hbmQoaW5iX3Aoc3BpY19kZXYuY3VyX2lvcG9ydC0+aW8ubWluaW11bSArIDQpICYgMiwKKwkJCUlURVJBVElPTlNfTE9ORyk7CisJb3V0YihkZXYsIHNwaWNfZGV2LmN1cl9pb3BvcnQtPmlvLm1pbmltdW0gKyA0KTsKKwl3YWl0X29uX2NvbW1hbmQoaW5iX3Aoc3BpY19kZXYuY3VyX2lvcG9ydC0+aW8ubWluaW11bSArIDQpICYgMiwKKwkJCUlURVJBVElPTlNfTE9ORyk7CisJb3V0Yihmbiwgc3BpY19kZXYuY3VyX2lvcG9ydC0+aW8ubWluaW11bSk7CisJdjEgPSBpbmJfcChzcGljX2Rldi5jdXJfaW9wb3J0LT5pby5taW5pbXVtKTsKKwlkcHJpbnRrKCJzb255X3BpY19jYWxsMjogMHglLjR4XG4iLCB2MSk7CisJcmV0dXJuIHYxOworfQorCitzdGF0aWMgdTggc29ueV9waWNfY2FsbDModTggZGV2LCB1OCBmbiwgdTggdikKK3sKKwl1OCB2MTsKKworCXdhaXRfb25fY29tbWFuZChpbmJfcChzcGljX2Rldi5jdXJfaW9wb3J0LT5pby5taW5pbXVtICsgNCkgJiAyLCBJVEVSQVRJT05TX0xPTkcpOworCW91dGIoZGV2LCBzcGljX2Rldi5jdXJfaW9wb3J0LT5pby5taW5pbXVtICsgNCk7CisJd2FpdF9vbl9jb21tYW5kKGluYl9wKHNwaWNfZGV2LmN1cl9pb3BvcnQtPmlvLm1pbmltdW0gKyA0KSAmIDIsIElURVJBVElPTlNfTE9ORyk7CisJb3V0Yihmbiwgc3BpY19kZXYuY3VyX2lvcG9ydC0+aW8ubWluaW11bSk7CisJd2FpdF9vbl9jb21tYW5kKGluYl9wKHNwaWNfZGV2LmN1cl9pb3BvcnQtPmlvLm1pbmltdW0gKyA0KSAmIDIsIElURVJBVElPTlNfTE9ORyk7CisJb3V0Yih2LCBzcGljX2Rldi5jdXJfaW9wb3J0LT5pby5taW5pbXVtKTsKKwl2MSA9IGluYl9wKHNwaWNfZGV2LmN1cl9pb3BvcnQtPmlvLm1pbmltdW0pOworCWRwcmludGsoInNvbnlfcGljX2NhbGwzOiAweCUuNHhcbiIsIHYxKTsKKwlyZXR1cm4gdjE7Cit9CisKKy8qIGNhbWVyYSB0ZXN0cyBhbmQgcG93ZXJvbi9wb3dlcm9mZiAqLworI2RlZmluZSBTT05ZUElfQ0FNRVJBX1BJQ1RVUkUJCTUKKyNkZWZpbmUgU09OWVBJX0NBTUVSQV9DT05UUk9MCQkweDEwCisKKyNkZWZpbmUgU09OWVBJX0NBTUVSQV9CUklHSFRORVNTCQkwCisjZGVmaW5lIFNPTllQSV9DQU1FUkFfQ09OVFJBU1QJCQkxCisjZGVmaW5lIFNPTllQSV9DQU1FUkFfSFVFCQkJMgorI2RlZmluZSBTT05ZUElfQ0FNRVJBX0NPTE9SCQkJMworI2RlZmluZSBTT05ZUElfQ0FNRVJBX1NIQVJQTkVTUwkJCTQKKworI2RlZmluZSBTT05ZUElfQ0FNRVJBX0VYUE9TVVJFX01BU0sJCTB4QworI2RlZmluZSBTT05ZUElfQ0FNRVJBX1dISVRFX0JBTEFOQ0VfTUFTSwkweDMKKyNkZWZpbmUgU09OWVBJX0NBTUVSQV9QSUNUVVJFX01PREVfTUFTSwkJMHgzMAorI2RlZmluZSBTT05ZUElfQ0FNRVJBX01VVEVfTUFTSwkJCTB4NDAKKworLyogdGhlIHJlc3QgZG9uJ3QgbmVlZCBhIGxvb3AgdW50aWwgbm90IDB4ZmYgKi8KKyNkZWZpbmUgU09OWVBJX0NBTUVSQV9BR0MJCQk2CisjZGVmaW5lIFNPTllQSV9DQU1FUkFfQUdDX01BU0sJCQkweDMwCisjZGVmaW5lIFNPTllQSV9DQU1FUkFfU0hVVFRFUl9NQVNLIAkJMHg3CisKKyNkZWZpbmUgU09OWVBJX0NBTUVSQV9TSFVURE9XTl9SRVFVRVNUCQk3CisjZGVmaW5lIFNPTllQSV9DQU1FUkFfQ09OVFJPTAkJCTB4MTAKKworI2RlZmluZSBTT05ZUElfQ0FNRVJBX1NUQVRVUyAJCQk3CisjZGVmaW5lIFNPTllQSV9DQU1FUkFfU1RBVFVTX1JFQURZIAkJMHgyCisjZGVmaW5lIFNPTllQSV9DQU1FUkFfU1RBVFVTX1BPU0lUSU9OCQkweDQKKworI2RlZmluZSBTT05ZUElfRElSRUNUSU9OX0JBQ0tXQVJEUyAJCTB4NAorCisjZGVmaW5lIFNPTllQSV9DQU1FUkFfUkVWSVNJT04gCQkJOAorI2RlZmluZSBTT05ZUElfQ0FNRVJBX1JPTVZFUlNJT04gCQk5CisKK3N0YXRpYyBpbnQgX19zb255X3BpY19jYW1lcmFfcmVhZHkodm9pZCkKK3sKKwl1OCB2OworCisJdiA9IHNvbnlfcGljX2NhbGwyKDB4OGYsIFNPTllQSV9DQU1FUkFfU1RBVFVTKTsKKwlyZXR1cm4gKHYgIT0gMHhmZiAmJiAodiAmIFNPTllQSV9DQU1FUkFfU1RBVFVTX1JFQURZKSk7Cit9CisKK3N0YXRpYyBpbnQgX19zb255X3BpY19jYW1lcmFfb2ZmKHZvaWQpCit7CisJaWYgKCFjYW1lcmEpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZfUEZYICJjYW1lcmEgY29udHJvbCBub3QgZW5hYmxlZFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXdhaXRfb25fY29tbWFuZChzb255X3BpY19jYWxsMygweDkwLCBTT05ZUElfQ0FNRVJBX1BJQ1RVUkUsCisJCQkJU09OWVBJX0NBTUVSQV9NVVRFX01BU0spLAorCQkJSVRFUkFUSU9OU19TSE9SVCk7CisKKwlpZiAoc3BpY19kZXYuY2FtZXJhX3Bvd2VyKSB7CisJCXNvbnlfcGljX2NhbGwyKDB4OTEsIDApOworCQlzcGljX2Rldi5jYW1lcmFfcG93ZXIgPSAwOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX3NvbnlfcGljX2NhbWVyYV9vbih2b2lkKQoreworCWludCBpLCBqLCB4OworCisJaWYgKCFjYW1lcmEpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZfUEZYICJjYW1lcmEgY29udHJvbCBub3QgZW5hYmxlZFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmIChzcGljX2Rldi5jYW1lcmFfcG93ZXIpCisJCXJldHVybiAwOworCisJZm9yIChqID0gNTsgaiA+IDA7IGotLSkgeworCisJCWZvciAoeCA9IDA7IHggPCAxMDAgJiYgc29ueV9waWNfY2FsbDIoMHg5MSwgMHgxKTsgeCsrKQorCQkJbXNsZWVwKDEwKTsKKwkJc29ueV9waWNfY2FsbDEoMHg5Myk7CisKKwkJZm9yIChpID0gNDAwOyBpID4gMDsgaS0tKSB7CisJCQlpZiAoX19zb255X3BpY19jYW1lcmFfcmVhZHkoKSkKKwkJCQlicmVhazsKKwkJCW1zbGVlcCgxMCk7CisJCX0KKwkJaWYgKGkpCisJCQlicmVhazsKKwl9CisKKwlpZiAoaiA9PSAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX1BGWCAiZmFpbGVkIHRvIHBvd2VyIG9uIGNhbWVyYVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXdhaXRfb25fY29tbWFuZChzb255X3BpY19jYWxsMygweDkwLCBTT05ZUElfQ0FNRVJBX0NPTlRST0wsCisJCQkJMHg1YSksCisJCQlJVEVSQVRJT05TX1NIT1JUKTsKKworCXNwaWNfZGV2LmNhbWVyYV9wb3dlciA9IDE7CisJcmV0dXJuIDA7Cit9CisKKy8qIEV4dGVybmFsIGNhbWVyYSBjb21tYW5kIChleHBvcnRlZCB0byB0aGUgbW90aW9uIGV5ZSB2NGwgZHJpdmVyKSAqLworaW50IHNvbnlfcGljX2NhbWVyYV9jb21tYW5kKGludCBjb21tYW5kLCB1OCB2YWx1ZSkKK3sKKwlpZiAoIWNhbWVyYSkKKwkJcmV0dXJuIC1FSU87CisKKwltdXRleF9sb2NrKCZzcGljX2Rldi5sb2NrKTsKKworCXN3aXRjaCAoY29tbWFuZCkgeworCWNhc2UgU09OWV9QSUNfQ09NTUFORF9TRVRDQU1FUkE6CisJCWlmICh2YWx1ZSkKKwkJCV9fc29ueV9waWNfY2FtZXJhX29uKCk7CisJCWVsc2UKKwkJCV9fc29ueV9waWNfY2FtZXJhX29mZigpOworCQlicmVhazsKKwljYXNlIFNPTllfUElDX0NPTU1BTkRfU0VUQ0FNRVJBQlJJR0hUTkVTUzoKKwkJd2FpdF9vbl9jb21tYW5kKHNvbnlfcGljX2NhbGwzKDB4OTAsIFNPTllQSV9DQU1FUkFfQlJJR0hUTkVTUywgdmFsdWUpLAorCQkJCUlURVJBVElPTlNfU0hPUlQpOworCQlicmVhazsKKwljYXNlIFNPTllfUElDX0NPTU1BTkRfU0VUQ0FNRVJBQ09OVFJBU1Q6CisJCXdhaXRfb25fY29tbWFuZChzb255X3BpY19jYWxsMygweDkwLCBTT05ZUElfQ0FNRVJBX0NPTlRSQVNULCB2YWx1ZSksCisJCQkJSVRFUkFUSU9OU19TSE9SVCk7CisJCWJyZWFrOworCWNhc2UgU09OWV9QSUNfQ09NTUFORF9TRVRDQU1FUkFIVUU6CisJCXdhaXRfb25fY29tbWFuZChzb255X3BpY19jYWxsMygweDkwLCBTT05ZUElfQ0FNRVJBX0hVRSwgdmFsdWUpLAorCQkJCUlURVJBVElPTlNfU0hPUlQpOworCQlicmVhazsKKwljYXNlIFNPTllfUElDX0NPTU1BTkRfU0VUQ0FNRVJBQ09MT1I6CisJCXdhaXRfb25fY29tbWFuZChzb255X3BpY19jYWxsMygweDkwLCBTT05ZUElfQ0FNRVJBX0NPTE9SLCB2YWx1ZSksCisJCQkJSVRFUkFUSU9OU19TSE9SVCk7CisJCWJyZWFrOworCWNhc2UgU09OWV9QSUNfQ09NTUFORF9TRVRDQU1FUkFTSEFSUE5FU1M6CisJCXdhaXRfb25fY29tbWFuZChzb255X3BpY19jYWxsMygweDkwLCBTT05ZUElfQ0FNRVJBX1NIQVJQTkVTUywgdmFsdWUpLAorCQkJCUlURVJBVElPTlNfU0hPUlQpOworCQlicmVhazsKKwljYXNlIFNPTllfUElDX0NPTU1BTkRfU0VUQ0FNRVJBUElDVFVSRToKKwkJd2FpdF9vbl9jb21tYW5kKHNvbnlfcGljX2NhbGwzKDB4OTAsIFNPTllQSV9DQU1FUkFfUElDVFVSRSwgdmFsdWUpLAorCQkJCUlURVJBVElPTlNfU0hPUlQpOworCQlicmVhazsKKwljYXNlIFNPTllfUElDX0NPTU1BTkRfU0VUQ0FNRVJBQUdDOgorCQl3YWl0X29uX2NvbW1hbmQoc29ueV9waWNfY2FsbDMoMHg5MCwgU09OWVBJX0NBTUVSQV9BR0MsIHZhbHVlKSwKKwkJCQlJVEVSQVRJT05TX1NIT1JUKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSIERSVl9QRlggInNvbnlfcGljX2NhbWVyYV9jb21tYW5kIGludmFsaWQ6ICVkXG4iLAorCQkgICAgICAgY29tbWFuZCk7CisJCWJyZWFrOworCX0KKwltdXRleF91bmxvY2soJnNwaWNfZGV2LmxvY2spOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChzb255X3BpY19jYW1lcmFfY29tbWFuZCk7CisKKy8qIGdwcnMvZWRnZSBtb2RlbSAoU1o0NjBOIGFuZCBTWjIxMFApLCB0aGFua3MgdG8gSm9zaHVhIFdpc2UgKi8KK3N0YXRpYyB2b2lkIHNvbnlfcGljX3NldF93d2FucG93ZXIodTggc3RhdGUpCit7CisJc3RhdGUgPSAhIXN0YXRlOworCW11dGV4X2xvY2soJnNwaWNfZGV2LmxvY2spOworCWlmIChzcGljX2Rldi53d2FuX3Bvd2VyID09IHN0YXRlKSB7CisJCW11dGV4X3VubG9jaygmc3BpY19kZXYubG9jayk7CisJCXJldHVybjsKKwl9CisJc29ueV9waWNfY2FsbDIoMHhCMCwgc3RhdGUpOworCXNwaWNfZGV2Lnd3YW5fcG93ZXIgPSBzdGF0ZTsKKwltdXRleF91bmxvY2soJnNwaWNfZGV2LmxvY2spOworfQorCitzdGF0aWMgc3NpemVfdCBzb255X3BpY193d2FucG93ZXJfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmZmVyLCBzaXplX3QgY291bnQpCit7CisJdW5zaWduZWQgbG9uZyB2YWx1ZTsKKwlpZiAoY291bnQgPiAzMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl2YWx1ZSA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZmZlciwgTlVMTCwgMTApOworCXNvbnlfcGljX3NldF93d2FucG93ZXIodmFsdWUpOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBzb255X3BpY193d2FucG93ZXJfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWZmZXIpCit7CisJc3NpemVfdCBjb3VudDsKKwltdXRleF9sb2NrKCZzcGljX2Rldi5sb2NrKTsKKwljb3VudCA9IHNucHJpbnRmKGJ1ZmZlciwgUEFHRV9TSVpFLCAiJWRcbiIsIHNwaWNfZGV2Lnd3YW5fcG93ZXIpOworCW11dGV4X3VubG9jaygmc3BpY19kZXYubG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCisvKiBibHVldG9vdGggc3Vic3lzdGVtIHBvd2VyIHN0YXRlICovCitzdGF0aWMgdm9pZCBfX3NvbnlfcGljX3NldF9ibHVldG9vdGhwb3dlcih1OCBzdGF0ZSkKK3sKKwlzdGF0ZSA9ICEhc3RhdGU7CisJaWYgKHNwaWNfZGV2LmJsdWV0b290aF9wb3dlciA9PSBzdGF0ZSkKKwkJcmV0dXJuOworCXNvbnlfcGljX2NhbGwyKDB4OTYsIHN0YXRlKTsKKwlzb255X3BpY19jYWxsMSgweDgyKTsKKwlzcGljX2Rldi5ibHVldG9vdGhfcG93ZXIgPSBzdGF0ZTsKK30KKworc3RhdGljIHNzaXplX3Qgc29ueV9waWNfYmx1ZXRvb3RocG93ZXJfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmZmVyLCBzaXplX3QgY291bnQpCit7CisJdW5zaWduZWQgbG9uZyB2YWx1ZTsKKwlpZiAoY291bnQgPiAzMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl2YWx1ZSA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZmZlciwgTlVMTCwgMTApOworCW11dGV4X2xvY2soJnNwaWNfZGV2LmxvY2spOworCV9fc29ueV9waWNfc2V0X2JsdWV0b290aHBvd2VyKHZhbHVlKTsKKwltdXRleF91bmxvY2soJnNwaWNfZGV2LmxvY2spOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBzb255X3BpY19ibHVldG9vdGhwb3dlcl9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZmZlcikKK3sKKwlzc2l6ZV90IGNvdW50ID0gMDsKKwltdXRleF9sb2NrKCZzcGljX2Rldi5sb2NrKTsKKwljb3VudCA9IHNucHJpbnRmKGJ1ZmZlciwgUEFHRV9TSVpFLCAiJWRcbiIsIHNwaWNfZGV2LmJsdWV0b290aF9wb3dlcik7CisJbXV0ZXhfdW5sb2NrKCZzcGljX2Rldi5sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKKy8qIGZhbiBzcGVlZCAqLworLyogRkFOMCBpbmZvcm1hdGlvbiAocmV2ZXJzZSBlbmdpbmVlcmVkIGZyb20gQUNQSSB0YWJsZXMpICovCisjZGVmaW5lIFNPTllfUElDX0ZBTjBfU1RBVFVTCTB4OTMKK3N0YXRpYyBpbnQgc29ueV9waWNfc2V0X2ZhbnNwZWVkKHVuc2lnbmVkIGxvbmcgdmFsdWUpCit7CisJcmV0dXJuIGVjX3dyaXRlKFNPTllfUElDX0ZBTjBfU1RBVFVTLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBpbnQgc29ueV9waWNfZ2V0X2ZhbnNwZWVkKHU4ICp2YWx1ZSkKK3sKKwlyZXR1cm4gZWNfcmVhZChTT05ZX1BJQ19GQU4wX1NUQVRVUywgdmFsdWUpOworfQorCitzdGF0aWMgc3NpemVfdCBzb255X3BpY19mYW5zcGVlZF9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWZmZXIsIHNpemVfdCBjb3VudCkKK3sKKwl1bnNpZ25lZCBsb25nIHZhbHVlOworCWlmIChjb3VudCA+IDMxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXZhbHVlID0gc2ltcGxlX3N0cnRvdWwoYnVmZmVyLCBOVUxMLCAxMCk7CisJaWYgKHNvbnlfcGljX3NldF9mYW5zcGVlZCh2YWx1ZSkpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBzb255X3BpY19mYW5zcGVlZF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZmZlcikKK3sKKwl1OCB2YWx1ZSA9IDA7CisJaWYgKHNvbnlfcGljX2dldF9mYW5zcGVlZCgmdmFsdWUpKQorCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiBzbnByaW50ZihidWZmZXIsIFBBR0VfU0laRSwgIiVkXG4iLCB2YWx1ZSk7Cit9CisKKyNkZWZpbmUgU1BJQ19BVFRSKF9uYW1lLCBfbW9kZSkJCQkJCVwKK3N0cnVjdCBkZXZpY2VfYXR0cmlidXRlIHNwaWNfYXR0cl8jI19uYW1lID0gX19BVFRSKF9uYW1lLAlcCisJCV9tb2RlLCBzb255X3BpY18jIyBfbmFtZSAjI19zaG93LAkJXAorCQlzb255X3BpY18jIyBfbmFtZSAjI19zdG9yZSkKKworc3RhdGljIFNQSUNfQVRUUihibHVldG9vdGhwb3dlciwgMDY0NCk7CitzdGF0aWMgU1BJQ19BVFRSKHd3YW5wb3dlciwgMDY0NCk7CitzdGF0aWMgU1BJQ19BVFRSKGZhbnNwZWVkLCAwNjQ0KTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnNwaWNfYXR0cmlidXRlc1tdID0geworCSZzcGljX2F0dHJfYmx1ZXRvb3RocG93ZXIuYXR0ciwKKwkmc3BpY19hdHRyX3d3YW5wb3dlci5hdHRyLAorCSZzcGljX2F0dHJfZmFuc3BlZWQuYXR0ciwKKwlOVUxMCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBzcGljX2F0dHJpYnV0ZV9ncm91cCA9IHsKKwkuYXR0cnMgPSBzcGljX2F0dHJpYnV0ZXMKK307CisKKy8qKioqKioqKiBTT05ZUEkgY29tcGF0aWJpbGl0eSAqKioqKioqKioqLworI2lmZGVmIENPTkZJR19TT05ZX0xBUFRPUF9PTEQKKworLyogYmF0dGVyeSAvIGJyaWdodG5lc3MgLyB0ZW1wZXJhdHVyZSAgYWRkcmVzc2VzICovCisjZGVmaW5lIFNPTllQSV9CQVRfRkxBR1MJMHg4MQorI2RlZmluZSBTT05ZUElfTENEX0xJR0hUCTB4OTYKKyNkZWZpbmUgU09OWVBJX0JBVDFfUENUUk0JMHhhMAorI2RlZmluZSBTT05ZUElfQkFUMV9MRUZUCTB4YTIKKyNkZWZpbmUgU09OWVBJX0JBVDFfTUFYUlQJMHhhNAorI2RlZmluZSBTT05ZUElfQkFUMl9QQ1RSTQkweGE4CisjZGVmaW5lIFNPTllQSV9CQVQyX0xFRlQJMHhhYQorI2RlZmluZSBTT05ZUElfQkFUMl9NQVhSVAkweGFjCisjZGVmaW5lIFNPTllQSV9CQVQxX01BWFRLCTB4YjAKKyNkZWZpbmUgU09OWVBJX0JBVDFfRlVMTAkweGIyCisjZGVmaW5lIFNPTllQSV9CQVQyX01BWFRLCTB4YjgKKyNkZWZpbmUgU09OWVBJX0JBVDJfRlVMTAkweGJhCisjZGVmaW5lIFNPTllQSV9URU1QX1NUQVRVUwkweEMxCisKK3N0cnVjdCBzb255cGlfY29tcGF0X3MgeworCXN0cnVjdCBmYXN5bmNfc3RydWN0CSpmaWZvX2FzeW5jOworCXN0cnVjdCBrZmlmbwkJKmZpZm87CisJc3BpbmxvY2tfdAkJZmlmb19sb2NrOworCXdhaXRfcXVldWVfaGVhZF90CWZpZm9fcHJvY19saXN0OworCWF0b21pY190CQlvcGVuX2NvdW50OworfTsKK3N0YXRpYyBzdHJ1Y3Qgc29ueXBpX2NvbXBhdF9zIHNvbnlwaV9jb21wYXQgPSB7CisJLm9wZW5fY291bnQgPSBBVE9NSUNfSU5JVCgwKSwKK307CisKK3N0YXRpYyBpbnQgc29ueXBpX21pc2NfZmFzeW5jKGludCBmZCwgc3RydWN0IGZpbGUgKmZpbHAsIGludCBvbikKK3sKKwlpbnQgcmV0dmFsOworCisJcmV0dmFsID0gZmFzeW5jX2hlbHBlcihmZCwgZmlscCwgb24sICZzb255cGlfY29tcGF0LmZpZm9fYXN5bmMpOworCWlmIChyZXR2YWwgPCAwKQorCQlyZXR1cm4gcmV0dmFsOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNvbnlwaV9taXNjX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc29ueXBpX21pc2NfZmFzeW5jKC0xLCBmaWxlLCAwKTsKKwlhdG9taWNfZGVjKCZzb255cGlfY29tcGF0Lm9wZW5fY291bnQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNvbnlwaV9taXNjX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJLyogRmx1c2ggaW5wdXQgcXVldWUgb24gZmlyc3Qgb3BlbiAqLworCWlmIChhdG9taWNfaW5jX3JldHVybigmc29ueXBpX2NvbXBhdC5vcGVuX2NvdW50KSA9PSAxKQorCQlrZmlmb19yZXNldChzb255cGlfY29tcGF0LmZpZm8pOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCBzb255cGlfbWlzY19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAorCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwb3MpCit7CisJc3NpemVfdCByZXQ7CisJdW5zaWduZWQgY2hhciBjOworCisJaWYgKChrZmlmb19sZW4oc29ueXBpX2NvbXBhdC5maWZvKSA9PSAwKSAmJgorCSAgICAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spKQorCQlyZXR1cm4gLUVBR0FJTjsKKworCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShzb255cGlfY29tcGF0LmZpZm9fcHJvY19saXN0LAorCQkJCSAgICAgICBrZmlmb19sZW4oc29ueXBpX2NvbXBhdC5maWZvKSAhPSAwKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJd2hpbGUgKHJldCA8IGNvdW50ICYmCisJICAgICAgIChrZmlmb19nZXQoc29ueXBpX2NvbXBhdC5maWZvLCAmYywgc2l6ZW9mKGMpKSA9PSBzaXplb2YoYykpKSB7CisJCWlmIChwdXRfdXNlcihjLCBidWYrKykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0Kys7CisJfQorCisJaWYgKHJldCA+IDApIHsKKwkJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CisJCWlub2RlLT5pX2F0aW1lID0gY3VycmVudF9mc190aW1lKGlub2RlLT5pX3NiKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHNvbnlwaV9taXNjX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpCit7CisJcG9sbF93YWl0KGZpbGUsICZzb255cGlfY29tcGF0LmZpZm9fcHJvY19saXN0LCB3YWl0KTsKKwlpZiAoa2ZpZm9fbGVuKHNvbnlwaV9jb21wYXQuZmlmbykpCisJCXJldHVybiBQT0xMSU4gfCBQT0xMUkROT1JNOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVjX3JlYWQxNih1OCBhZGRyLCB1MTYgKnZhbHVlKQoreworCXU4IHZhbF9sYiwgdmFsX2hiOworCWlmIChlY19yZWFkKGFkZHIsICZ2YWxfbGIpKQorCQlyZXR1cm4gLTE7CisJaWYgKGVjX3JlYWQoYWRkciArIDEsICZ2YWxfaGIpKQorCQlyZXR1cm4gLTE7CisJKnZhbHVlID0gdmFsX2xiIHwgKHZhbF9oYiA8PCA4KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzb255cGlfbWlzY19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlwLCBzdHJ1Y3QgZmlsZSAqZnAsCisJCQkgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCByZXQgPSAwOworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCXU4IHZhbDg7CisJdTE2IHZhbDE2OworCWludCB2YWx1ZTsKKworCW11dGV4X2xvY2soJnNwaWNfZGV2LmxvY2spOworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTT05ZUElfSU9DR0JSVDoKKwkJaWYgKHNvbnlfYmFja2xpZ2h0X2RldmljZSA9PSBOVUxMKSB7CisJCQlyZXQgPSAtRUlPOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGFjcGlfY2FsbGdldGZ1bmMoc29ueV9uY19hY3BpX2hhbmRsZSwgIkdCUlQiLCAmdmFsdWUpKSB7CisJCQlyZXQgPSAtRUlPOworCQkJYnJlYWs7CisJCX0KKwkJdmFsOCA9ICgodmFsdWUgJiAweGZmKSAtIDEpIDw8IDU7CisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnZhbDgsIHNpemVvZih2YWw4KSkpCisJCQkJcmV0ID0gLUVGQVVMVDsKKwkJYnJlYWs7CisJY2FzZSBTT05ZUElfSU9DU0JSVDoKKwkJaWYgKHNvbnlfYmFja2xpZ2h0X2RldmljZSA9PSBOVUxMKSB7CisJCQlyZXQgPSAtRUlPOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZ2YWw4LCBhcmdwLCBzaXplb2YodmFsOCkpKSB7CisJCQlyZXQgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGFjcGlfY2FsbHNldGZ1bmMoc29ueV9uY19hY3BpX2hhbmRsZSwgIlNCUlQiLAorCQkJCSh2YWw4ID4+IDUpICsgMSwgTlVMTCkpIHsKKwkJCXJldCA9IC1FSU87CisJCQlicmVhazsKKwkJfQorCQkvKiBzeW5jIHRoZSBiYWNrbGlnaHQgZGV2aWNlIHN0YXR1cyAqLworCQlzb255X2JhY2tsaWdodF9kZXZpY2UtPnByb3BzLmJyaWdodG5lc3MgPQorCQkgICAgc29ueV9iYWNrbGlnaHRfZ2V0X2JyaWdodG5lc3Moc29ueV9iYWNrbGlnaHRfZGV2aWNlKTsKKwkJYnJlYWs7CisJY2FzZSBTT05ZUElfSU9DR0JBVDFDQVA6CisJCWlmIChlY19yZWFkMTYoU09OWVBJX0JBVDFfRlVMTCwgJnZhbDE2KSkgeworCQkJcmV0ID0gLUVJTzsKKwkJCWJyZWFrOworCQl9CisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnZhbDE2LCBzaXplb2YodmFsMTYpKSkKKwkJCXJldCA9IC1FRkFVTFQ7CisJCWJyZWFrOworCWNhc2UgU09OWVBJX0lPQ0dCQVQxUkVNOgorCQlpZiAoZWNfcmVhZDE2KFNPTllQSV9CQVQxX0xFRlQsICZ2YWwxNikpIHsKKwkJCXJldCA9IC1FSU87CisJCQlicmVhazsKKwkJfQorCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZ2YWwxNiwgc2l6ZW9mKHZhbDE2KSkpCisJCQlyZXQgPSAtRUZBVUxUOworCQlicmVhazsKKwljYXNlIFNPTllQSV9JT0NHQkFUMkNBUDoKKwkJaWYgKGVjX3JlYWQxNihTT05ZUElfQkFUMl9GVUxMLCAmdmFsMTYpKSB7CisJCQlyZXQgPSAtRUlPOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmdmFsMTYsIHNpemVvZih2YWwxNikpKQorCQkJcmV0ID0gLUVGQVVMVDsKKwkJYnJlYWs7CisJY2FzZSBTT05ZUElfSU9DR0JBVDJSRU06CisJCWlmIChlY19yZWFkMTYoU09OWVBJX0JBVDJfTEVGVCwgJnZhbDE2KSkgeworCQkJcmV0ID0gLUVJTzsKKwkJCWJyZWFrOworCQl9CisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnZhbDE2LCBzaXplb2YodmFsMTYpKSkKKwkJCXJldCA9IC1FRkFVTFQ7CisJCWJyZWFrOworCWNhc2UgU09OWVBJX0lPQ0dCQVRGTEFHUzoKKwkJaWYgKGVjX3JlYWQoU09OWVBJX0JBVF9GTEFHUywgJnZhbDgpKSB7CisJCQlyZXQgPSAtRUlPOworCQkJYnJlYWs7CisJCX0KKwkJdmFsOCAmPSAweDA3OworCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZ2YWw4LCBzaXplb2YodmFsOCkpKQorCQkJcmV0ID0gLUVGQVVMVDsKKwkJYnJlYWs7CisJY2FzZSBTT05ZUElfSU9DR0JMVUU6CisJCXZhbDggPSBzcGljX2Rldi5ibHVldG9vdGhfcG93ZXI7CisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnZhbDgsIHNpemVvZih2YWw4KSkpCisJCQlyZXQgPSAtRUZBVUxUOworCQlicmVhazsKKwljYXNlIFNPTllQSV9JT0NTQkxVRToKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZ2YWw4LCBhcmdwLCBzaXplb2YodmFsOCkpKSB7CisJCQlyZXQgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJX19zb255X3BpY19zZXRfYmx1ZXRvb3RocG93ZXIodmFsOCk7CisJCWJyZWFrOworCS8qIEZBTiBDb250cm9scyAqLworCWNhc2UgU09OWVBJX0lPQ0dGQU46CisJCWlmIChzb255X3BpY19nZXRfZmFuc3BlZWQoJnZhbDgpKSB7CisJCQlyZXQgPSAtRUlPOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmdmFsOCwgc2l6ZW9mKHZhbDgpKSkKKwkJCXJldCA9IC1FRkFVTFQ7CisJCWJyZWFrOworCWNhc2UgU09OWVBJX0lPQ1NGQU46CisJCWlmIChjb3B5X2Zyb21fdXNlcigmdmFsOCwgYXJncCwgc2l6ZW9mKHZhbDgpKSkgeworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCWlmIChzb255X3BpY19zZXRfZmFuc3BlZWQodmFsOCkpCisJCQlyZXQgPSAtRUlPOworCQlicmVhazsKKwkvKiBHRVQgVGVtcGVyYXR1cmUgKHVzZWZ1bCB1bmRlciBBUE0pICovCisJY2FzZSBTT05ZUElfSU9DR1RFTVA6CisJCWlmIChlY19yZWFkKFNPTllQSV9URU1QX1NUQVRVUywgJnZhbDgpKSB7CisJCQlyZXQgPSAtRUlPOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmdmFsOCwgc2l6ZW9mKHZhbDgpKSkKKwkJCXJldCA9IC1FRkFVTFQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJfQorCW11dGV4X3VubG9jaygmc3BpY19kZXYubG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc29ueXBpX21pc2NfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLnJlYWQJCT0gc29ueXBpX21pc2NfcmVhZCwKKwkucG9sbAkJPSBzb255cGlfbWlzY19wb2xsLAorCS5vcGVuCQk9IHNvbnlwaV9taXNjX29wZW4sCisJLnJlbGVhc2UJPSBzb255cGlfbWlzY19yZWxlYXNlLAorCS5mYXN5bmMJCT0gc29ueXBpX21pc2NfZmFzeW5jLAorCS5pb2N0bAkJPSBzb255cGlfbWlzY19pb2N0bCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBzb255cGlfbWlzY19kZXZpY2UgPSB7CisJLm1pbm9yCQk9IE1JU0NfRFlOQU1JQ19NSU5PUiwKKwkubmFtZQkJPSAic29ueXBpIiwKKwkuZm9wcwkJPSAmc29ueXBpX21pc2NfZm9wcywKK307CisKK3N0YXRpYyB2b2lkIHNvbnlwaV9jb21wYXRfcmVwb3J0X2V2ZW50KHU4IGV2ZW50KQoreworCWtmaWZvX3B1dChzb255cGlfY29tcGF0LmZpZm8sICh1bnNpZ25lZCBjaGFyICopJmV2ZW50LCBzaXplb2YoZXZlbnQpKTsKKwlraWxsX2Zhc3luYygmc29ueXBpX2NvbXBhdC5maWZvX2FzeW5jLCBTSUdJTywgUE9MTF9JTik7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZzb255cGlfY29tcGF0LmZpZm9fcHJvY19saXN0KTsKK30KKworc3RhdGljIGludCBzb255cGlfY29tcGF0X2luaXQodm9pZCkKK3sKKwlpbnQgZXJyb3I7CisKKwlzcGluX2xvY2tfaW5pdCgmc29ueXBpX2NvbXBhdC5maWZvX2xvY2spOworCXNvbnlwaV9jb21wYXQuZmlmbyA9IGtmaWZvX2FsbG9jKFNPTllfTEFQVE9QX0JVRl9TSVpFLCBHRlBfS0VSTkVMLAorCQkJCQkgJnNvbnlwaV9jb21wYXQuZmlmb19sb2NrKTsKKwlpZiAoSVNfRVJSKHNvbnlwaV9jb21wYXQuZmlmbykpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIERSVl9QRlggImtmaWZvX2FsbG9jIGZhaWxlZFxuIik7CisJCXJldHVybiBQVFJfRVJSKHNvbnlwaV9jb21wYXQuZmlmbyk7CisJfQorCisJaW5pdF93YWl0cXVldWVfaGVhZCgmc29ueXBpX2NvbXBhdC5maWZvX3Byb2NfbGlzdCk7CisKKwlpZiAobWlub3IgIT0gLTEpCisJCXNvbnlwaV9taXNjX2RldmljZS5taW5vciA9IG1pbm9yOworCWVycm9yID0gbWlzY19yZWdpc3Rlcigmc29ueXBpX21pc2NfZGV2aWNlKTsKKwlpZiAoZXJyb3IpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIERSVl9QRlggIm1pc2NfcmVnaXN0ZXIgZmFpbGVkXG4iKTsKKwkJZ290byBlcnJfZnJlZV9rZmlmbzsKKwl9CisJaWYgKG1pbm9yID09IC0xKQorCQlwcmludGsoS0VSTl9JTkZPIERSVl9QRlggImRldmljZSBhbGxvY2F0ZWQgbWlub3IgaXMgJWRcbiIsCisJCSAgICAgICBzb255cGlfbWlzY19kZXZpY2UubWlub3IpOworCisJcmV0dXJuIDA7CisKK2Vycl9mcmVlX2tmaWZvOgorCWtmaWZvX2ZyZWUoc29ueXBpX2NvbXBhdC5maWZvKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyB2b2lkIHNvbnlwaV9jb21wYXRfZXhpdCh2b2lkKQoreworCW1pc2NfZGVyZWdpc3Rlcigmc29ueXBpX21pc2NfZGV2aWNlKTsKKwlrZmlmb19mcmVlKHNvbnlwaV9jb21wYXQuZmlmbyk7Cit9CisjZWxzZQorc3RhdGljIGludCBzb255cGlfY29tcGF0X2luaXQodm9pZCkgeyByZXR1cm4gMDsgfQorc3RhdGljIHZvaWQgc29ueXBpX2NvbXBhdF9leGl0KHZvaWQpIHsgfQorc3RhdGljIHZvaWQgc29ueXBpX2NvbXBhdF9yZXBvcnRfZXZlbnQodTggZXZlbnQpIHsgfQorI2VuZGlmIC8qIENPTkZJR19TT05ZX0xBUFRPUF9PTEQgKi8KKworLyoKKyAqIEFDUEkgY2FsbGJhY2tzCisgKi8KK3N0YXRpYyBhY3BpX3N0YXR1cworc29ueV9waWNfcmVhZF9wb3NzaWJsZV9yZXNvdXJjZShzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqcmVzb3VyY2UsIHZvaWQgKmNvbnRleHQpCit7CisJdTMyIGk7CisJc3RydWN0IHNvbnlfcGljX2RldiAqZGV2ID0gKHN0cnVjdCBzb255X3BpY19kZXYgKiljb250ZXh0OworCisJc3dpdGNoIChyZXNvdXJjZS0+dHlwZSkgeworCWNhc2UgQUNQSV9SRVNPVVJDRV9UWVBFX1NUQVJUX0RFUEVOREVOVDoKKwljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9FTkRfREVQRU5ERU5UOgorCQlyZXR1cm4gQUVfT0s7CisKKwljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9JUlE6CisJCXsKKwkJCXN0cnVjdCBhY3BpX3Jlc291cmNlX2lycSAqcCA9ICZyZXNvdXJjZS0+ZGF0YS5pcnE7CisJCQlzdHJ1Y3Qgc29ueV9waWNfaXJxICppbnRlcnJ1cHQgPSBOVUxMOworCQkJaWYgKCFwIHx8ICFwLT5pbnRlcnJ1cHRfY291bnQpIHsKKwkJCQkvKgorCQkJCSAqIElSUSBkZXNjcmlwdG9ycyBtYXkgaGF2ZSBubyBJUlEjIGJpdHMgc2V0LAorCQkJCSAqIHBhcnRpY3VsYXJseSB0aG9zZSB0aG9zZSB3LyBfU1RBIGRpc2FibGVkCisJCQkJICovCisJCQkJZHByaW50aygiQmxhbmsgSVJRIHJlc291cmNlXG4iKTsKKwkJCQlyZXR1cm4gQUVfT0s7CisJCQl9CisJCQlmb3IgKGkgPSAwOyBpIDwgcC0+aW50ZXJydXB0X2NvdW50OyBpKyspIHsKKwkJCQlpZiAoIXAtPmludGVycnVwdHNbaV0pIHsKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZfUEZYCisJCQkJCQkJIkludmFsaWQgSVJRICVkXG4iLAorCQkJCQkJCXAtPmludGVycnVwdHNbaV0pOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJaW50ZXJydXB0ID0ga3phbGxvYyhzaXplb2YoKmludGVycnVwdCksCisJCQkJCQlHRlBfS0VSTkVMKTsKKwkJCQlpZiAoIWludGVycnVwdCkKKwkJCQkJcmV0dXJuIEFFX0VSUk9SOworCisJCQkJbGlzdF9hZGRfdGFpbCgmaW50ZXJydXB0LT5saXN0LCAmZGV2LT5pbnRlcnJ1cHRzKTsKKwkJCQlpbnRlcnJ1cHQtPmlycS50cmlnZ2VyaW5nID0gcC0+dHJpZ2dlcmluZzsKKwkJCQlpbnRlcnJ1cHQtPmlycS5wb2xhcml0eSA9IHAtPnBvbGFyaXR5OworCQkJCWludGVycnVwdC0+aXJxLnNoYXJhYmxlID0gcC0+c2hhcmFibGU7CisJCQkJaW50ZXJydXB0LT5pcnEuaW50ZXJydXB0X2NvdW50ID0gMTsKKwkJCQlpbnRlcnJ1cHQtPmlycS5pbnRlcnJ1cHRzWzBdID0gcC0+aW50ZXJydXB0c1tpXTsKKwkJCX0KKwkJCXJldHVybiBBRV9PSzsKKwkJfQorCWNhc2UgQUNQSV9SRVNPVVJDRV9UWVBFX0lPOgorCQl7CisJCQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9pbyAqaW8gPSAmcmVzb3VyY2UtPmRhdGEuaW87CisJCQlzdHJ1Y3Qgc29ueV9waWNfaW9wb3J0ICppb3BvcnQgPSBOVUxMOworCQkJaWYgKCFpbykgeworCQkJCWRwcmludGsoIkJsYW5rIElPIHJlc291cmNlXG4iKTsKKwkJCQlyZXR1cm4gQUVfT0s7CisJCQl9CisKKwkJCWlvcG9ydCA9IGt6YWxsb2Moc2l6ZW9mKCppb3BvcnQpLCBHRlBfS0VSTkVMKTsKKwkJCWlmICghaW9wb3J0KQorCQkJCXJldHVybiBBRV9FUlJPUjsKKworCQkJbGlzdF9hZGRfdGFpbCgmaW9wb3J0LT5saXN0LCAmZGV2LT5pb3BvcnRzKTsKKwkJCW1lbWNweSgmaW9wb3J0LT5pbywgaW8sIHNpemVvZigqaW8pKTsKKwkJCXJldHVybiBBRV9PSzsKKwkJfQorCWRlZmF1bHQ6CisJCWRwcmludGsoIlJlc291cmNlICVkIGlzbid0IGFuIElSUSBub3IgYW4gSU8gcG9ydFxuIiwKKwkJCQlyZXNvdXJjZS0+dHlwZSk7CisKKwljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9FTkRfVEFHOgorCQlyZXR1cm4gQUVfT0s7CisJfQorCXJldHVybiBBRV9DVFJMX1RFUk1JTkFURTsKK30KKworc3RhdGljIGludCBzb255X3BpY19wb3NzaWJsZV9yZXNvdXJjZXMoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCit7CisJaW50IHJlc3VsdCA9IDA7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisKKwlpZiAoIWRldmljZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBnZXQgZGV2aWNlIHN0YXR1cyAqLworCS8qIHNlZSBhY3BpX3BjaV9saW5rX2dldF9jdXJyZW50IGFjcGlfcGNpX2xpbmtfZ2V0X3Bvc3NpYmxlICovCisJZHByaW50aygiRXZhbHVhdGluZyBfU1RBXG4iKTsKKwlyZXN1bHQgPSBhY3BpX2J1c19nZXRfc3RhdHVzKGRldmljZSk7CisJaWYgKHJlc3VsdCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9QRlggIlVuYWJsZSB0byByZWFkIHN0YXR1c1xuIik7CisJCWdvdG8gZW5kOworCX0KKworCWlmICghZGV2aWNlLT5zdGF0dXMuZW5hYmxlZCkKKwkJZHByaW50aygiRGV2aWNlIGRpc2FibGVkXG4iKTsKKwllbHNlCisJCWRwcmludGsoIkRldmljZSBlbmFibGVkXG4iKTsKKworCS8qCisJICogUXVlcnkgYW5kIHBhcnNlICdtZXRob2QnCisJICovCisJZHByaW50aygiRXZhbHVhdGluZyAlc1xuIiwgTUVUSE9EX05BTUVfX1BSUyk7CisJc3RhdHVzID0gYWNwaV93YWxrX3Jlc291cmNlcyhkZXZpY2UtPmhhbmRsZSwgTUVUSE9EX05BTUVfX1BSUywKKwkJCXNvbnlfcGljX3JlYWRfcG9zc2libGVfcmVzb3VyY2UsICZzcGljX2Rldik7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX1BGWAorCQkJCSJGYWlsdXJlIGV2YWx1YXRpbmcgJXNcbiIsCisJCQkJTUVUSE9EX05BTUVfX1BSUyk7CisJCXJlc3VsdCA9IC1FTk9ERVY7CisJfQorZW5kOgorCXJldHVybiByZXN1bHQ7Cit9CisKKy8qCisgKiAgRGlzYWJsZSB0aGUgc3BpYyBkZXZpY2UgYnkgY2FsbGluZyBpdHMgX0RJUyBtZXRob2QKKyAqLworc3RhdGljIGludCBzb255X3BpY19kaXNhYmxlKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQoreworCWlmIChBQ1BJX0ZBSUxVUkUoYWNwaV9ldmFsdWF0ZV9vYmplY3QoZGV2aWNlLT5oYW5kbGUsICJfRElTIiwgMCwgTlVMTCkpKQorCQlyZXR1cm4gLUVOWElPOworCisJZHByaW50aygiRGV2aWNlIGRpc2FibGVkXG4iKTsKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogIEJhc2VkIG9uIGRyaXZlcnMvYWNwaS9wY2lfbGluay5jOmFjcGlfcGNpX2xpbmtfc2V0CisgKgorICogIENhbGwgX1NSUyB0byBzZXQgY3VycmVudCByZXNvdXJjZXMKKyAqLworc3RhdGljIGludCBzb255X3BpY19lbmFibGUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsCisJCXN0cnVjdCBzb255X3BpY19pb3BvcnQgKmlvcG9ydCwgc3RydWN0IHNvbnlfcGljX2lycSAqaXJxKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlpbnQgcmVzdWx0ID0gMDsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSBpb19yZXM7CisJCXN0cnVjdCBhY3BpX3Jlc291cmNlIGlycV9yZXM7CisJCXN0cnVjdCBhY3BpX3Jlc291cmNlIGVuZDsKKwl9ICpyZXNvdXJjZTsKKwlzdHJ1Y3QgYWNwaV9idWZmZXIgYnVmZmVyID0geyAwLCBOVUxMIH07CisKKwlpZiAoIWlvcG9ydCB8fCAhaXJxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIGluaXQgYWNwaV9idWZmZXIgKi8KKwlyZXNvdXJjZSA9IGt6YWxsb2Moc2l6ZW9mKCpyZXNvdXJjZSkgKyAxLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJlc291cmNlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWJ1ZmZlci5sZW5ndGggPSBzaXplb2YoKnJlc291cmNlKSArIDE7CisJYnVmZmVyLnBvaW50ZXIgPSByZXNvdXJjZTsKKworCS8qIHNldHVwIGlvIHJlc291cmNlICovCisJcmVzb3VyY2UtPmlvX3Jlcy50eXBlID0gQUNQSV9SRVNPVVJDRV9UWVBFX0lPOworCXJlc291cmNlLT5pb19yZXMubGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBhY3BpX3Jlc291cmNlKTsKKwltZW1jcHkoJnJlc291cmNlLT5pb19yZXMuZGF0YS5pbywgJmlvcG9ydC0+aW8sCisJCQlzaXplb2Yoc3RydWN0IGFjcGlfcmVzb3VyY2VfaW8pKTsKKworCS8qIHNldHVwIGlycSByZXNvdXJjZSAqLworCXJlc291cmNlLT5pcnFfcmVzLnR5cGUgPSBBQ1BJX1JFU09VUkNFX1RZUEVfSVJROworCXJlc291cmNlLT5pcnFfcmVzLmxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgYWNwaV9yZXNvdXJjZSk7CisJbWVtY3B5KCZyZXNvdXJjZS0+aXJxX3Jlcy5kYXRhLmlycSwgJmlycS0+aXJxLAorCQkJc2l6ZW9mKHN0cnVjdCBhY3BpX3Jlc291cmNlX2lycSkpOworCS8qIHdlIHJlcXVlc3RlZCBhIHNoYXJlZCBpcnEgKi8KKwlyZXNvdXJjZS0+aXJxX3Jlcy5kYXRhLmlycS5zaGFyYWJsZSA9IEFDUElfU0hBUkVEOworCisJcmVzb3VyY2UtPmVuZC50eXBlID0gQUNQSV9SRVNPVVJDRV9UWVBFX0VORF9UQUc7CisKKwkvKiBBdHRlbXB0IHRvIHNldCB0aGUgcmVzb3VyY2UgKi8KKwlkcHJpbnRrKCJFdmFsdWF0aW5nIF9TUlNcbiIpOworCXN0YXR1cyA9IGFjcGlfc2V0X2N1cnJlbnRfcmVzb3VyY2VzKGRldmljZS0+aGFuZGxlLCAmYnVmZmVyKTsKKworCS8qIGNoZWNrIGZvciB0b3RhbCBmYWlsdXJlICovCisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXByaW50ayhLRVJOX0VSUiBEUlZfUEZYICJFcnJvciBldmFsdWF0aW5nIF9TUlMiKTsKKwkJcmVzdWx0ID0gLUVOT0RFVjsKKwkJZ290byBlbmQ7CisJfQorCisJLyogTmVjZXNzYXJ5IGRldmljZSBpbml0aWFsaXphdGlvbnMgY2FsbHMgKGZyb20gc29ueXBpKSAqLworCXNvbnlfcGljX2NhbGwxKDB4ODIpOworCXNvbnlfcGljX2NhbGwyKDB4ODEsIDB4ZmYpOworCXNvbnlfcGljX2NhbGwxKGNvbXBhdCA/IDB4OTIgOiAweDgyKTsKKworZW5kOgorCWtmcmVlKHJlc291cmNlKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKioqKioqKioqKioqKioqKioKKyAqCisgKiBJU1I6IHNvbWUgZXZlbnQgaXMgYXZhaWxhYmxlCisgKgorICoqKioqKioqKioqKioqKioqLworc3RhdGljIGlycXJldHVybl90IHNvbnlfcGljX2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJaW50IGksIGo7CisJdTMyIHBvcnRfdmFsID0gMDsKKwl1OCBldiA9IDA7CisJdTggZGF0YV9tYXNrID0gMDsKKwl1OCBkZXZpY2VfZXZlbnQgPSAwOworCisJc3RydWN0IHNvbnlfcGljX2RldiAqZGV2ID0gKHN0cnVjdCBzb255X3BpY19kZXYgKikgZGV2X2lkOworCisJYWNwaV9vc19yZWFkX3BvcnQoZGV2LT5jdXJfaW9wb3J0LT5pby5taW5pbXVtLCAmcG9ydF92YWwsCisJCQlkZXYtPmN1cl9pb3BvcnQtPmlvLmFkZHJlc3NfbGVuZ3RoKTsKKwlldiA9IHBvcnRfdmFsICYgU09OWV9QSUNfRVZfTUFTSzsKKwlkYXRhX21hc2sgPSAweGZmICYgKHBvcnRfdmFsID4+IChkZXYtPmN1cl9pb3BvcnQtPmlvLmFkZHJlc3NfbGVuZ3RoIC0gOCkpOworCisJZHByaW50aygiZXZlbnQgKDB4JS44eCBbJS4yeF0gWyUuMnhdKSBhdCBwb3J0IDB4JS40eFxuIiwKKwkJCXBvcnRfdmFsLCBldiwgZGF0YV9tYXNrLCBkZXYtPmN1cl9pb3BvcnQtPmlvLm1pbmltdW0pOworCisJaWYgKGV2ID09IDB4MDAgfHwgZXYgPT0gMHhmZikKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCisJZm9yIChpID0gMDsgc29ueV9waWNfZXZlbnR0eXBlc1tpXS5tb2RlbDsgaSsrKSB7CisKKwkJaWYgKHNwaWNfZGV2Lm1vZGVsICE9IHNvbnlfcGljX2V2ZW50dHlwZXNbaV0ubW9kZWwpCisJCQljb250aW51ZTsKKworCQlpZiAoKGRhdGFfbWFzayAmIHNvbnlfcGljX2V2ZW50dHlwZXNbaV0uZGF0YSkgIT0KKwkJICAgIHNvbnlfcGljX2V2ZW50dHlwZXNbaV0uZGF0YSkKKwkJCWNvbnRpbnVlOworCisJCWlmICghKG1hc2sgJiBzb255X3BpY19ldmVudHR5cGVzW2ldLm1hc2spKQorCQkJY29udGludWU7CisKKwkJZm9yIChqID0gMDsgc29ueV9waWNfZXZlbnR0eXBlc1tpXS5ldmVudHNbal0uZXZlbnQ7IGorKykgeworCQkJaWYgKGV2ID09IHNvbnlfcGljX2V2ZW50dHlwZXNbaV0uZXZlbnRzW2pdLmRhdGEpIHsKKwkJCQlkZXZpY2VfZXZlbnQgPQorCQkJCQlzb255X3BpY19ldmVudHR5cGVzW2ldLmV2ZW50c1tqXS5ldmVudDsKKwkJCQlnb3RvIGZvdW5kOworCQkJfQorCQl9CisJfQorCXJldHVybiBJUlFfSEFORExFRDsKKworZm91bmQ6CisJc29ueV9sYXB0b3BfcmVwb3J0X2lucHV0X2V2ZW50KGRldmljZV9ldmVudCk7CisJYWNwaV9idXNfZ2VuZXJhdGVfZXZlbnQoc3BpY19kZXYuYWNwaV9kZXYsIDEsIGRldmljZV9ldmVudCk7CisJc29ueXBpX2NvbXBhdF9yZXBvcnRfZXZlbnQoZGV2aWNlX2V2ZW50KTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoqKioqKioqKioqKioqKioqCisgKgorICogIEFDUEkgZHJpdmVyCisgKgorICoqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBzb255X3BpY19yZW1vdmUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKQoreworCXN0cnVjdCBzb255X3BpY19pb3BvcnQgKmlvLCAqdG1wX2lvOworCXN0cnVjdCBzb255X3BpY19pcnEgKmlycSwgKnRtcF9pcnE7CisKKwlzb255cGlfY29tcGF0X2V4aXQoKTsKKworCWlmIChzb255X3BpY19kaXNhYmxlKGRldmljZSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIERSVl9QRlggIkNvdWxkbid0IGRpc2FibGUgZGV2aWNlLlxuIik7CisJCXJldHVybiAtRU5YSU87CisJfQorCisJZnJlZV9pcnEoc3BpY19kZXYuY3VyX2lycS0+aXJxLmludGVycnVwdHNbMF0sICZzcGljX2Rldik7CisJcmVsZWFzZV9yZWdpb24oc3BpY19kZXYuY3VyX2lvcG9ydC0+aW8ubWluaW11bSwKKwkJCXNwaWNfZGV2LmN1cl9pb3BvcnQtPmlvLmFkZHJlc3NfbGVuZ3RoKTsKKworCXNvbnlfbGFwdG9wX3JlbW92ZV9pbnB1dCgpOworCisJLyogcGYgYXR0cnMgKi8KKwlzeXNmc19yZW1vdmVfZ3JvdXAoJnNvbnlfcGZfZGV2aWNlLT5kZXYua29iaiwgJnNwaWNfYXR0cmlidXRlX2dyb3VwKTsKKwlzb255X3BmX3JlbW92ZSgpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGlvLCB0bXBfaW8sICZzcGljX2Rldi5pb3BvcnRzLCBsaXN0KSB7CisJCWxpc3RfZGVsKCZpby0+bGlzdCk7CisJCWtmcmVlKGlvKTsKKwl9CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGlycSwgdG1wX2lycSwgJnNwaWNfZGV2LmludGVycnVwdHMsIGxpc3QpIHsKKwkJbGlzdF9kZWwoJmlycS0+bGlzdCk7CisJCWtmcmVlKGlycSk7CisJfQorCXNwaWNfZGV2LmN1cl9pb3BvcnQgPSBOVUxMOworCXNwaWNfZGV2LmN1cl9pcnEgPSBOVUxMOworCisJZHByaW50ayhTT05ZX1BJQ19EUklWRVJfTkFNRSAiIHJlbW92ZWQuXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzb255X3BpY19hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3Qgc29ueV9waWNfaW9wb3J0ICppbywgKnRtcF9pbzsKKwlzdHJ1Y3Qgc29ueV9waWNfaXJxICppcnEsICp0bXBfaXJxOworCisJcHJpbnRrKEtFUk5fSU5GTyBEUlZfUEZYICIlcyB2JXMuXG4iLAorCQlTT05ZX1BJQ19EUklWRVJfTkFNRSwgU09OWV9MQVBUT1BfRFJJVkVSX1ZFUlNJT04pOworCisJc3BpY19kZXYuYWNwaV9kZXYgPSBkZXZpY2U7CisJc3RyY3B5KGFjcGlfZGV2aWNlX2NsYXNzKGRldmljZSksICJzb255L2hvdGtleSIpOworCXNwaWNfZGV2Lm1vZGVsID0gc29ueV9waWNfZGV0ZWN0X2RldmljZV90eXBlKCk7CisJbXV0ZXhfaW5pdCgmc3BpY19kZXYubG9jayk7CisKKwkvKiByZWFkIF9QUlMgcmVzb3VyY2VzICovCisJcmVzdWx0ID0gc29ueV9waWNfcG9zc2libGVfcmVzb3VyY2VzKGRldmljZSk7CisJaWYgKHJlc3VsdCkgeworCQlwcmludGsoS0VSTl9FUlIgRFJWX1BGWAorCQkJCSJVbmFiZSB0byByZWFkIHBvc3NpYmxlIHJlc291cmNlcy5cbiIpOworCQlnb3RvIGVycl9mcmVlX3Jlc291cmNlczsKKwl9CisKKwkvKiBzZXR1cCBpbnB1dCBkZXZpY2VzIGFuZCBoZWxwZXIgZmlmbyAqLworCXJlc3VsdCA9IHNvbnlfbGFwdG9wX3NldHVwX2lucHV0KCk7CisJaWYgKHJlc3VsdCkgeworCQlwcmludGsoS0VSTl9FUlIgRFJWX1BGWAorCQkJCSJVbmFiZSB0byBjcmVhdGUgaW5wdXQgZGV2aWNlcy5cbiIpOworCQlnb3RvIGVycl9mcmVlX3Jlc291cmNlczsKKwl9CisKKwkvKiByZXF1ZXN0IGlvIHBvcnQgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGlvLCAmc3BpY19kZXYuaW9wb3J0cywgbGlzdCkgeworCQlpZiAocmVxdWVzdF9yZWdpb24oaW8tPmlvLm1pbmltdW0sIGlvLT5pby5hZGRyZXNzX2xlbmd0aCwKKwkJCQkJIlNvbnkgUHJvZ3JhbWFibGUgSS9PIERldmljZSIpKSB7CisJCQlkcHJpbnRrKCJJL08gcG9ydDogMHglLjR4ICgweCUuNHgpICsgMHglLjJ4XG4iLAorCQkJCQlpby0+aW8ubWluaW11bSwgaW8tPmlvLm1heGltdW0sCisJCQkJCWlvLT5pby5hZGRyZXNzX2xlbmd0aCk7CisJCQlzcGljX2Rldi5jdXJfaW9wb3J0ID0gaW87CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoIXNwaWNfZGV2LmN1cl9pb3BvcnQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIERSVl9QRlggIkZhaWxlZCB0byByZXF1ZXN0X3JlZ2lvbi5cbiIpOworCQlyZXN1bHQgPSAtRU5PREVWOworCQlnb3RvIGVycl9yZW1vdmVfaW5wdXQ7CisJfQorCisJLyogcmVxdWVzdCBJUlEgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGlycSwgJnNwaWNfZGV2LmludGVycnVwdHMsIGxpc3QpIHsKKwkJaWYgKCFyZXF1ZXN0X2lycShpcnEtPmlycS5pbnRlcnJ1cHRzWzBdLCBzb255X3BpY19pcnEsCisJCQkJCUlSUUZfU0hBUkVELCAic29ueS1sYXB0b3AiLCAmc3BpY19kZXYpKSB7CisJCQlkcHJpbnRrKCJJUlE6ICVkIC0gdHJpZ2dlcmluZzogJWQgLSAiCisJCQkJCSJwb2xhcml0eTogJWQgLSBzaHI6ICVkXG4iLAorCQkJCQlpcnEtPmlycS5pbnRlcnJ1cHRzWzBdLAorCQkJCQlpcnEtPmlycS50cmlnZ2VyaW5nLAorCQkJCQlpcnEtPmlycS5wb2xhcml0eSwKKwkJCQkJaXJxLT5pcnEuc2hhcmFibGUpOworCQkJc3BpY19kZXYuY3VyX2lycSA9IGlycTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmICghc3BpY19kZXYuY3VyX2lycSkgeworCQlwcmludGsoS0VSTl9FUlIgRFJWX1BGWCAiRmFpbGVkIHRvIHJlcXVlc3RfaXJxLlxuIik7CisJCXJlc3VsdCA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX3JlbGVhc2VfcmVnaW9uOworCX0KKworCS8qIHNldCByZXNvdXJjZSBzdGF0dXMgX1NSUyAqLworCXJlc3VsdCA9IHNvbnlfcGljX2VuYWJsZShkZXZpY2UsIHNwaWNfZGV2LmN1cl9pb3BvcnQsIHNwaWNfZGV2LmN1cl9pcnEpOworCWlmIChyZXN1bHQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIERSVl9QRlggIkNvdWxkbid0IGVuYWJsZSBkZXZpY2UuXG4iKTsKKwkJZ290byBlcnJfZnJlZV9pcnE7CisJfQorCisJc3BpY19kZXYuYmx1ZXRvb3RoX3Bvd2VyID0gLTE7CisJLyogY3JlYXRlIGRldmljZSBhdHRyaWJ1dGVzICovCisJcmVzdWx0ID0gc29ueV9wZl9hZGQoKTsKKwlpZiAocmVzdWx0KQorCQlnb3RvIGVycl9kaXNhYmxlX2RldmljZTsKKworCXJlc3VsdCA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmc29ueV9wZl9kZXZpY2UtPmRldi5rb2JqLCAmc3BpY19hdHRyaWJ1dGVfZ3JvdXApOworCWlmIChyZXN1bHQpCisJCWdvdG8gZXJyX3JlbW92ZV9wZjsKKworCWlmIChzb255cGlfY29tcGF0X2luaXQoKSkKKwkJZ290byBlcnJfcmVtb3ZlX3BmOworCisJcmV0dXJuIDA7CisKK2Vycl9yZW1vdmVfcGY6CisJc29ueV9wZl9yZW1vdmUoKTsKKworZXJyX2Rpc2FibGVfZGV2aWNlOgorCXNvbnlfcGljX2Rpc2FibGUoZGV2aWNlKTsKKworZXJyX2ZyZWVfaXJxOgorCWZyZWVfaXJxKHNwaWNfZGV2LmN1cl9pcnEtPmlycS5pbnRlcnJ1cHRzWzBdLCAmc3BpY19kZXYpOworCitlcnJfcmVsZWFzZV9yZWdpb246CisJcmVsZWFzZV9yZWdpb24oc3BpY19kZXYuY3VyX2lvcG9ydC0+aW8ubWluaW11bSwKKwkJCXNwaWNfZGV2LmN1cl9pb3BvcnQtPmlvLmFkZHJlc3NfbGVuZ3RoKTsKKworZXJyX3JlbW92ZV9pbnB1dDoKKwlzb255X2xhcHRvcF9yZW1vdmVfaW5wdXQoKTsKKworZXJyX2ZyZWVfcmVzb3VyY2VzOgorCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShpbywgdG1wX2lvLCAmc3BpY19kZXYuaW9wb3J0cywgbGlzdCkgeworCQlsaXN0X2RlbCgmaW8tPmxpc3QpOworCQlrZnJlZShpbyk7CisJfQorCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShpcnEsIHRtcF9pcnEsICZzcGljX2Rldi5pbnRlcnJ1cHRzLCBsaXN0KSB7CisJCWxpc3RfZGVsKCZpcnEtPmxpc3QpOworCQlrZnJlZShpcnEpOworCX0KKwlzcGljX2Rldi5jdXJfaW9wb3J0ID0gTlVMTDsKKwlzcGljX2Rldi5jdXJfaXJxID0gTlVMTDsKKworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgc29ueV9waWNfc3VzcGVuZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCWlmIChzb255X3BpY19kaXNhYmxlKGRldmljZSkpCisJCXJldHVybiAtRU5YSU87CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc29ueV9waWNfcmVzdW1lKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQoreworCXNvbnlfcGljX2VuYWJsZShkZXZpY2UsIHNwaWNfZGV2LmN1cl9pb3BvcnQsIHNwaWNfZGV2LmN1cl9pcnEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGFjcGlfZHJpdmVyIHNvbnlfcGljX2RyaXZlciA9IHsKKwkubmFtZSA9IFNPTllfUElDX0RSSVZFUl9OQU1FLAorCS5jbGFzcyA9IFNPTllfUElDX0NMQVNTLAorCS5pZHMgPSBTT05ZX1BJQ19ISUQsCisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLm9wcyA9IHsKKwkJLmFkZCA9IHNvbnlfcGljX2FkZCwKKwkJLnJlbW92ZSA9IHNvbnlfcGljX3JlbW92ZSwKKwkJLnN1c3BlbmQgPSBzb255X3BpY19zdXNwZW5kLAorCQkucmVzdW1lID0gc29ueV9waWNfcmVzdW1lLAorCQl9LAorfTsKKworc3RhdGljIHN0cnVjdCBkbWlfc3lzdGVtX2lkIF9faW5pdGRhdGEgc29ueXBpX2RtaV90YWJsZVtdID0geworCXsKKwkJLmlkZW50ID0gIlNvbnkgVmFpbyIsCisJCS5tYXRjaGVzID0geworCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiU29ueSBDb3Jwb3JhdGlvbiIpLAorCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJQQ0ctIiksCisJCX0sCisJfSwKKwl7CisJCS5pZGVudCA9ICJTb255IFZhaW8iLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIlNvbnkgQ29ycG9yYXRpb24iKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiVkdOLSIpLAorCQl9LAorCX0sCisJeyB9Cit9OworCitzdGF0aWMgaW50IF9faW5pdCBzb255X2xhcHRvcF9pbml0KHZvaWQpCit7CisJaW50IHJlc3VsdDsKKworCWlmICghbm9fc3BpYyAmJiBkbWlfY2hlY2tfc3lzdGVtKHNvbnlwaV9kbWlfdGFibGUpKSB7CisJCXJlc3VsdCA9IGFjcGlfYnVzX3JlZ2lzdGVyX2RyaXZlcigmc29ueV9waWNfZHJpdmVyKTsKKwkJaWYgKHJlc3VsdCkgeworCQkJcHJpbnRrKEtFUk5fRVJSIERSVl9QRlgKKwkJCQkJIlVuYWJsZSB0byByZWdpc3RlciBTUElDIGRyaXZlci4iKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJcmVzdWx0ID0gYWNwaV9idXNfcmVnaXN0ZXJfZHJpdmVyKCZzb255X25jX2RyaXZlcik7CisJaWYgKHJlc3VsdCkgeworCQlwcmludGsoS0VSTl9FUlIgRFJWX1BGWCAiVW5hYmxlIHRvIHJlZ2lzdGVyIFNOQyBkcml2ZXIuIik7CisJCWdvdG8gb3V0X3VucmVnaXN0ZXJfcGljOworCX0KKworCXJldHVybiAwOworCitvdXRfdW5yZWdpc3Rlcl9waWM6CisJaWYgKCFub19zcGljKQorCQlhY3BpX2J1c191bnJlZ2lzdGVyX2RyaXZlcigmc29ueV9waWNfZHJpdmVyKTsKK291dDoKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc29ueV9sYXB0b3BfZXhpdCh2b2lkKQoreworCWFjcGlfYnVzX3VucmVnaXN0ZXJfZHJpdmVyKCZzb255X25jX2RyaXZlcik7CisJaWYgKCFub19zcGljKQorCQlhY3BpX2J1c191bnJlZ2lzdGVyX2RyaXZlcigmc29ueV9waWNfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoc29ueV9sYXB0b3BfaW5pdCk7Cittb2R1bGVfZXhpdChzb255X2xhcHRvcF9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy90aGlua3BhZF9hY3BpLmMgYi9kcml2ZXJzL21pc2MvdGhpbmtwYWRfYWNwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjMzZhNTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21pc2MvdGhpbmtwYWRfYWNwaS5jCkBAIC0wLDAgKzEsNDMxMiBAQAorLyoKKyAqICB0aGlua3BhZF9hY3BpLmMgLSBUaGlua1BhZCBBQ1BJIEV4dHJhcworICoKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA0LTIwMDUgQm9yaXNsYXYgRGVpYW5vdiA8Ym9yaXNsYXZAdXNlcnMuc2YubmV0PgorICogIENvcHlyaWdodCAoQykgMjAwNi0yMDA3IEhlbnJpcXVlIGRlIE1vcmFlcyBIb2xzY2h1aCA8aG1oQGhtaC5lbmcuYnI+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNkZWZpbmUgSUJNX1ZFUlNJT04gIjAuMTQiCisjZGVmaW5lIFRQQUNQSV9TWVNGU19WRVJTSU9OIDB4MDAwMTAwCisKKy8qCisgKiAgQ2hhbmdlbG9nOgorICogIDIwMDctMDMtMjcgIDAuMTQJcmVuYW1lZCB0byB0aGlua3BhZF9hY3BpIGFuZCBtb3ZlZCB0bworICogIAkJCWRyaXZlcnMvbWlzYy4KKyAqCisgKiAgMjAwNi0xMS0yMgkwLjEzCW5ldyBtYWludGFpbmVyCisgKiAgCQkJY2hhbmdlbG9nIG5vdyBsaXZlcyBpbiBnaXQgY29tbWl0IGhpc3RvcnksIGFuZCB3aWxsCisgKiAgCQkJbm90IGJlIHVwZGF0ZWQgZnVydGhlciBpbi1maWxlLgorICoKKyAqICAyMDA1LTA4LTE3ICAwLjEyCWZpeCBjb21waWxhdGlvbiBvbiAyLjYuMTMtcmMga2VybmVscworICogIDIwMDUtMDMtMTcJMC4xMQlzdXBwb3J0IGZvciA2MDBlLCA3NzB4CisgKgkJCSAgICB0aGFua3MgdG8gSmFtaWUgTGVudGluIDxsZW50aW5qQGRpYWwucGlwZXguY29tPgorICoJCQlzdXBwb3J0IGZvciA3NzBlLCBHNDEKKyAqCQkJRzQwIGFuZCBHNDEgZG9uJ3QgaGF2ZSBhIHRoaW5rbGlnaHQKKyAqCQkJdGVtcGVyYXR1cmVzIG5vIGxvbmdlciBleHBlcmltZW50YWwKKyAqCQkJZXhwZXJpbWVudGFsIGJyaWdodG5lc3MgY29udHJvbAorICoJCQlleHBlcmltZW50YWwgdm9sdW1lIGNvbnRyb2wKKyAqCQkJZXhwZXJpbWVudGFsIGZhbiBlbmFibGUvZGlzYWJsZQorICogIDIwMDUtMDEtMTYJMC4xMAlmaXggbW9kdWxlIGxvYWRpbmcgb24gUjMwLCBSMzEKKyAqICAyMDA1LTAxLTE2CTAuOQlzdXBwb3J0IGZvciA1NzAsIFIzMCwgUjMxCisgKgkJCXVsdHJhYmF5IHN1cHBvcnQgb24gQTIycCwgQTN4CisgKgkJCWxpbWl0IGFyZyBmb3IgY21vcywgbGVkLCBiZWVwLCBkcm9wIGV4cGVyaW1lbnRhbCBzdGF0dXMKKyAqCQkJbW9yZSBjYXBhYmxlIGxlZCBjb250cm9sIG9uIEEyMWUsIEEyMnAsIFQyMC0yMiwgWDIwCisgKgkJCWV4cGVyaW1lbnRhbCB0ZW1wZXJhdHVyZXMgYW5kIGZhbiBzcGVlZAorICoJCQlleHBlcmltZW50YWwgZW1iZWRkZWQgY29udHJvbGxlciByZWdpc3RlciBkdW1wCisgKgkJCW1hcmsgbW9yZSBmdW5jdGlvbnMgYXMgX19pbml0LCBkcm9wIGluY29ycmVjdCBfX2V4aXQKKyAqCQkJdXNlIE1PRFVMRV9WRVJTSU9OCisgKgkJCSAgICB0aGFua3MgdG8gSGVucmlrIEJyaXggQW5kZXJzZW4gPGJyaXhAZ2VudG9vLm9yZz4KKyAqCQkJZml4IHBhcmFtZXRlciBwYXNzaW5nIG9uIG1vZHVsZSBsb2FkaW5nCisgKgkJCSAgICB0aGFua3MgdG8gUnVzdHkgUnVzc2VsbCA8cnVzdHlAcnVzdGNvcnAuY29tLmF1PgorICoJCQkgICAgdGhhbmtzIHRvIEppbSBSYWRmb3JkIDxyYWRmb3JkQGJsYWNrYmVhbi5vcmc+CisgKiAgMjAwNC0xMS0wOAkwLjgJZml4IGluaXQgZXJyb3IgY2FzZSwgZG9uJ3QgcmV0dXJuIGZyb20gYSBtYWNybworICoJCQkgICAgdGhhbmtzIHRvIENocmlzIFdyaWdodCA8Y2hyaXN3QG9zZGwub3JnPgorICogIDIwMDQtMTAtMjMJMC43CWZpeCBtb2R1bGUgbG9hZGluZyBvbiBBMjFlLCBBMjJwLCBUMjAsIFQyMSwgWDIwCisgKgkJCWZpeCBsZWQgY29udHJvbCBvbiBBMjFlCisgKiAgMjAwNC0xMC0xOQkwLjYJdXNlIGFjcGlfYnVzX3JlZ2lzdGVyX2RyaXZlcigpIHRvIGNsYWltIEhLRVkgZGV2aWNlCisgKiAgMjAwNC0xMC0xOAkwLjUJdGhpbmtsaWdodCBzdXBwb3J0IG9uIEEyMWUsIEc0MCwgUjMyLCBUMjAsIFQyMSwgWDIwCisgKgkJCXByb2MgZmlsZSBmb3JtYXQgY2hhbmdlZAorICoJCQl2aWRlb19zd2l0Y2ggY29tbWFuZAorICoJCQlleHBlcmltZW50YWwgY21vcyBjb250cm9sCisgKgkJCWV4cGVyaW1lbnRhbCBsZWQgY29udHJvbAorICoJCQlleHBlcmltZW50YWwgYWNwaSBzb3VuZHMKKyAqICAyMDA0LTA5LTE2CTAuNAlzdXBwb3J0IGZvciBtb2R1bGUgcGFyYW1ldGVycworICoJCQlob3RrZXkgbWFzayBjYW4gYmUgcHJlZml4ZWQgYnkgMHgKKyAqCQkJdmlkZW8gb3V0cHV0IHN3aXRjaGluZworICoJCQl2aWRlbyBleHBhbnNpb24gY29udHJvbAorICoJCQl1bHRyYWJheSBlamVjdCBzdXBwb3J0CisgKgkJCXJlbW92ZWQgbGNkIGJyaWdodG5lc3Mvb24vb2ZmIGNvbnRyb2wsIGRpZG4ndCB3b3JrCisgKiAgMjAwNC0wOC0xNwkwLjMJc3VwcG9ydCBmb3IgUjQwCisgKgkJCWxjZCBvZmYsIGJyaWdodG5lc3MgY29udHJvbAorICoJCQl0aGlua2xpZ2h0IG9uL29mZgorICogIDIwMDQtMDgtMTQJMC4yCXN1cHBvcnQgZm9yIFQgc2VyaWVzLCBYMjAKKyAqCQkJYmx1ZXRvb3RoIGVuYWJsZS9kaXNhYmxlCisgKgkJCWhvdGtleSBldmVudHMgZGlzYWJsZWQgYnkgZGVmYXVsdAorICoJCQlyZW1vdmVkIGZhbiBjb250cm9sLCBjdXJyZW50bHkgdXNlbGVzcworICogIDIwMDQtMDgtMDkJMC4xCWluaXRpYWwgcmVsZWFzZSwgc3VwcG9ydCBmb3IgWCBzZXJpZXMKKyAqLworCisjaW5jbHVkZSAidGhpbmtwYWRfYWNwaS5oIgorCitNT0RVTEVfQVVUSE9SKCJCb3Jpc2xhdiBEZWlhbm92LCBIZW5yaXF1ZSBkZSBNb3JhZXMgSG9sc2NodWgiKTsKK01PRFVMRV9ERVNDUklQVElPTihJQk1fREVTQyk7CitNT0RVTEVfVkVSU0lPTihJQk1fVkVSU0lPTik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8qIFBsZWFzZSByZW1vdmUgdGhpcyBpbiB5ZWFyIDIwMDkgKi8KK01PRFVMRV9BTElBUygiaWJtX2FjcGkiKTsKKworI2RlZmluZSBfX3VudXNlZCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQUNQSSBIZWxwZXJzIGFuZCBkZXZpY2UgbW9kZWwKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBBQ1BJIGJhc2ljIGhhbmRsZXMKKyAqLworCitzdGF0aWMgYWNwaV9oYW5kbGUgcm9vdF9oYW5kbGUgPSBOVUxMOworCisjZGVmaW5lIElCTV9IQU5ETEUob2JqZWN0LCBwYXJlbnQsIHBhdGhzLi4uKQkJCVwKKwlzdGF0aWMgYWNwaV9oYW5kbGUgIG9iamVjdCMjX2hhbmRsZTsJCQlcCisJc3RhdGljIGFjcGlfaGFuZGxlICpvYmplY3QjI19wYXJlbnQgPSAmcGFyZW50IyNfaGFuZGxlOwlcCisJc3RhdGljIGNoYXIgICAgICAgICpvYmplY3QjI19wYXRoOwkJCVwKKwlzdGF0aWMgY2hhciAgICAgICAgKm9iamVjdCMjX3BhdGhzW10gPSB7IHBhdGhzIH0KKworSUJNX0hBTkRMRShlYywgcm9vdCwgIlxcX1NCLlBDSTAuSVNBLkVDMCIsCS8qIDI0MCwgMjQweCAqLworCSAgICJcXF9TQi5QQ0kuSVNBLkVDIiwJLyogNTcwICovCisJICAgIlxcX1NCLlBDSTAuSVNBMC5FQzAiLAkvKiA2MDBlL3gsIDc3MGUsIDc3MHggKi8KKwkgICAiXFxfU0IuUENJMC5JU0EuRUMiLAkvKiBBMjFlLCBBMnhtL3AsIFQyMC0yMiwgWDIwLTIxICovCisJICAgIlxcX1NCLlBDSTAuQUQ0Uy5FQzAiLAkvKiBpMTQwMCwgUjMwICovCisJICAgIlxcX1NCLlBDSTAuSUNIMy5FQzAiLAkvKiBSMzEgKi8KKwkgICAiXFxfU0IuUENJMC5MUEMuRUMiLAkvKiBhbGwgb3RoZXJzICovCisJICAgKTsKKworSUJNX0hBTkRMRShlY3JkLCBlYywgIkVDUkQiKTsJLyogNTcwICovCitJQk1fSEFORExFKGVjd3IsIGVjLCAiRUNXUiIpOwkvKiA1NzAgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWlzYyBBQ1BJIGhhbmRsZXMKKyAqLworCitJQk1fSEFORExFKGNtb3MsIHJvb3QsICJcXFVDTVMiLAkvKiBSNTAsIFI1MGUsIFI1MHAsIFI1MSwgVDR4LCBYMzEsIFg0MCAqLworCSAgICJcXENNT1MiLAkJLyogQTN4LCBHNHgsIFIzMiwgVDIzLCBUMzAsIFgyMi0yNCwgWDMwICovCisJICAgIlxcQ01TIiwJCS8qIFI0MCwgUjQwZSAqLworCSAgICk7CQkJLyogYWxsIG90aGVycyAqLworCitJQk1fSEFORExFKGhrZXksIGVjLCAiXFxfU0IuSEtFWSIsCS8qIDYwMGUveCwgNzcwZSwgNzcweCAqLworCSAgICJeSEtFWSIsCQkvKiBSMzAsIFIzMSAqLworCSAgICJIS0VZIiwJCS8qIGFsbCBvdGhlcnMgKi8KKwkgICApOwkJCS8qIDU3MCAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBBQ1BJIGhlbHBlcnMKKyAqLworCitzdGF0aWMgaW50IGFjcGlfZXZhbGYoYWNwaV9oYW5kbGUgaGFuZGxlLAorCQkgICAgICB2b2lkICpyZXMsIGNoYXIgKm1ldGhvZCwgY2hhciAqZm10LCAuLi4pCit7CisJY2hhciAqZm10MCA9IGZtdDsKKwlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCBwYXJhbXM7CisJdW5pb24gYWNwaV9vYmplY3QgaW5fb2Jqc1tJQk1fTUFYX0FDUElfQVJHU107CisJc3RydWN0IGFjcGlfYnVmZmVyIHJlc3VsdCwgKnJlc3VsdHA7CisJdW5pb24gYWNwaV9vYmplY3Qgb3V0X29iajsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJdmFfbGlzdCBhcDsKKwljaGFyIHJlc190eXBlOworCWludCBzdWNjZXNzOworCWludCBxdWlldDsKKworCWlmICghKmZtdCkgeworCQlwcmludGsoSUJNX0VSUiAiYWNwaV9ldmFsZigpIGNhbGxlZCB3aXRoIGVtcHR5IGZvcm1hdFxuIik7CisJCXJldHVybiAwOworCX0KKworCWlmICgqZm10ID09ICdxJykgeworCQlxdWlldCA9IDE7CisJCWZtdCsrOworCX0gZWxzZQorCQlxdWlldCA9IDA7CisKKwlyZXNfdHlwZSA9ICooZm10KyspOworCisJcGFyYW1zLmNvdW50ID0gMDsKKwlwYXJhbXMucG9pbnRlciA9ICZpbl9vYmpzWzBdOworCisJdmFfc3RhcnQoYXAsIGZtdCk7CisJd2hpbGUgKCpmbXQpIHsKKwkJY2hhciBjID0gKihmbXQrKyk7CisJCXN3aXRjaCAoYykgeworCQljYXNlICdkJzoJLyogaW50ICovCisJCQlpbl9vYmpzW3BhcmFtcy5jb3VudF0uaW50ZWdlci52YWx1ZSA9IHZhX2FyZyhhcCwgaW50KTsKKwkJCWluX29ianNbcGFyYW1zLmNvdW50KytdLnR5cGUgPSBBQ1BJX1RZUEVfSU5URUdFUjsKKwkJCWJyZWFrOworCQkJLyogYWRkIG1vcmUgdHlwZXMgYXMgbmVlZGVkICovCisJCWRlZmF1bHQ6CisJCQlwcmludGsoSUJNX0VSUiAiYWNwaV9ldmFsZigpIGNhbGxlZCAiCisJCQkgICAgICAgIndpdGggaW52YWxpZCBmb3JtYXQgY2hhcmFjdGVyICclYydcbiIsIGMpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJdmFfZW5kKGFwKTsKKworCWlmIChyZXNfdHlwZSAhPSAndicpIHsKKwkJcmVzdWx0Lmxlbmd0aCA9IHNpemVvZihvdXRfb2JqKTsKKwkJcmVzdWx0LnBvaW50ZXIgPSAmb3V0X29iajsKKwkJcmVzdWx0cCA9ICZyZXN1bHQ7CisJfSBlbHNlCisJCXJlc3VsdHAgPSBOVUxMOworCisJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QoaGFuZGxlLCBtZXRob2QsICZwYXJhbXMsIHJlc3VsdHApOworCisJc3dpdGNoIChyZXNfdHlwZSkgeworCWNhc2UgJ2QnOgkJLyogaW50ICovCisJCWlmIChyZXMpCisJCQkqKGludCAqKXJlcyA9IG91dF9vYmouaW50ZWdlci52YWx1ZTsKKwkJc3VjY2VzcyA9IHN0YXR1cyA9PSBBRV9PSyAmJiBvdXRfb2JqLnR5cGUgPT0gQUNQSV9UWVBFX0lOVEVHRVI7CisJCWJyZWFrOworCWNhc2UgJ3YnOgkJLyogdm9pZCAqLworCQlzdWNjZXNzID0gc3RhdHVzID09IEFFX09LOworCQlicmVhazsKKwkJLyogYWRkIG1vcmUgdHlwZXMgYXMgbmVlZGVkICovCisJZGVmYXVsdDoKKwkJcHJpbnRrKElCTV9FUlIgImFjcGlfZXZhbGYoKSBjYWxsZWQgIgorCQkgICAgICAgIndpdGggaW52YWxpZCBmb3JtYXQgY2hhcmFjdGVyICclYydcbiIsIHJlc190eXBlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFzdWNjZXNzICYmICFxdWlldCkKKwkJcHJpbnRrKElCTV9FUlIgImFjcGlfZXZhbGYoJXMsICVzLCAuLi4pIGZhaWxlZDogJWRcbiIsCisJCSAgICAgICBtZXRob2QsIGZtdDAsIHN0YXR1cyk7CisKKwlyZXR1cm4gc3VjY2VzczsKK30KKworc3RhdGljIHZvaWQgX191bnVzZWQgYWNwaV9wcmludF9pbnQoYWNwaV9oYW5kbGUgaGFuZGxlLCBjaGFyICptZXRob2QpCit7CisJaW50IGk7CisKKwlpZiAoYWNwaV9ldmFsZihoYW5kbGUsICZpLCBtZXRob2QsICJkIikpCisJCXByaW50ayhJQk1fSU5GTyAiJXMgPSAweCV4XG4iLCBtZXRob2QsIGkpOworCWVsc2UKKwkJcHJpbnRrKElCTV9FUlIgImVycm9yIGNhbGxpbmcgJXNcbiIsIG1ldGhvZCk7Cit9CisKK3N0YXRpYyBpbnQgYWNwaV9lY19yZWFkKGludCBpLCB1OCAqIHApCit7CisJaW50IHY7CisKKwlpZiAoZWNyZF9oYW5kbGUpIHsKKwkJaWYgKCFhY3BpX2V2YWxmKGVjcmRfaGFuZGxlLCAmdiwgTlVMTCwgImRkIiwgaSkpCisJCQlyZXR1cm4gMDsKKwkJKnAgPSB2OworCX0gZWxzZSB7CisJCWlmIChlY19yZWFkKGksIHApIDwgMCkKKwkJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGFjcGlfZWNfd3JpdGUoaW50IGksIHU4IHYpCit7CisJaWYgKGVjd3JfaGFuZGxlKSB7CisJCWlmICghYWNwaV9ldmFsZihlY3dyX2hhbmRsZSwgTlVMTCwgTlVMTCwgInZkZCIsIGksIHYpKQorCQkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJaWYgKGVjX3dyaXRlKGksIHYpIDwgMCkKKwkJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9zdGEoYWNwaV9oYW5kbGUgaGFuZGxlKQoreworCWludCBzdGF0dXM7CisKKwlpZiAoIWhhbmRsZSB8fCAhYWNwaV9ldmFsZihoYW5kbGUsICZzdGF0dXMsICJfU1RBIiwgImQiKSkKKwkJc3RhdHVzID0gMDsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgaXNzdWVfdGhpbmtwYWRfY21vc19jb21tYW5kKGludCBjbW9zX2NtZCkKK3sKKwlpZiAoIWNtb3NfaGFuZGxlKQorCQlyZXR1cm4gLUVOWElPOworCisJaWYgKCFhY3BpX2V2YWxmKGNtb3NfaGFuZGxlLCBOVUxMLCBOVUxMLCAidmQiLCBjbW9zX2NtZCkpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBBQ1BJIGRldmljZSBtb2RlbAorICovCisKK3N0YXRpYyB2b2lkIGRydl9hY3BpX2hhbmRsZV9pbml0KGNoYXIgKm5hbWUsCisJCQkgICBhY3BpX2hhbmRsZSAqaGFuZGxlLCBhY3BpX2hhbmRsZSBwYXJlbnQsCisJCQkgICBjaGFyICoqcGF0aHMsIGludCBudW1fcGF0aHMsIGNoYXIgKipwYXRoKQoreworCWludCBpOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCXZkYmdfcHJpbnRrKFRQQUNQSV9EQkdfSU5JVCwgInRyeWluZyB0byBsb2NhdGUgQUNQSSBoYW5kbGUgZm9yICVzXG4iLAorCQluYW1lKTsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fcGF0aHM7IGkrKykgeworCQlzdGF0dXMgPSBhY3BpX2dldF9oYW5kbGUocGFyZW50LCBwYXRoc1tpXSwgaGFuZGxlKTsKKwkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCQkqcGF0aCA9IHBhdGhzW2ldOworCQkJZGJnX3ByaW50ayhUUEFDUElfREJHX0lOSVQsCisJCQkJICAgIkZvdW5kIEFDUEkgaGFuZGxlICVzIGZvciAlc1xuIiwKKwkJCQkgICAqcGF0aCwgbmFtZSk7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwl2ZGJnX3ByaW50ayhUUEFDUElfREJHX0lOSVQsICJBQ1BJIGhhbmRsZSBmb3IgJXMgbm90IGZvdW5kXG4iLAorCQkgICAgbmFtZSk7CisJKmhhbmRsZSA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGRpc3BhdGNoX2FjcGlfbm90aWZ5KGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIGV2ZW50LCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBpYm1fc3RydWN0ICppYm0gPSBkYXRhOworCisJaWYgKCFpYm0gfHwgIWlibS0+YWNwaSB8fCAhaWJtLT5hY3BpLT5ub3RpZnkpCisJCXJldHVybjsKKworCWlibS0+YWNwaS0+bm90aWZ5KGlibSwgZXZlbnQpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBzZXR1cF9hY3BpX25vdGlmeShzdHJ1Y3QgaWJtX3N0cnVjdCAqaWJtKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlpbnQgcmM7CisKKwlCVUdfT04oIWlibS0+YWNwaSk7CisKKwlpZiAoISppYm0tPmFjcGktPmhhbmRsZSkKKwkJcmV0dXJuIDA7CisKKwl2ZGJnX3ByaW50ayhUUEFDUElfREJHX0lOSVQsCisJCSJzZXR0aW5nIHVwIEFDUEkgbm90aWZ5IGZvciAlc1xuIiwgaWJtLT5uYW1lKTsKKworCXJjID0gYWNwaV9idXNfZ2V0X2RldmljZSgqaWJtLT5hY3BpLT5oYW5kbGUsICZpYm0tPmFjcGktPmRldmljZSk7CisJaWYgKHJjIDwgMCkgeworCQlwcmludGsoSUJNX0VSUiAiYWNwaV9idXNfZ2V0X2RldmljZSglcykgZmFpbGVkOiAlZFxuIiwKKwkJCWlibS0+bmFtZSwgcmMpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlhY3BpX2RyaXZlcl9kYXRhKGlibS0+YWNwaS0+ZGV2aWNlKSA9IGlibTsKKwlzcHJpbnRmKGFjcGlfZGV2aWNlX2NsYXNzKGlibS0+YWNwaS0+ZGV2aWNlKSwgIiVzLyVzIiwKKwkJSUJNX0FDUElfRVZFTlRfUFJFRklYLAorCQlpYm0tPm5hbWUpOworCisJc3RhdHVzID0gYWNwaV9pbnN0YWxsX25vdGlmeV9oYW5kbGVyKCppYm0tPmFjcGktPmhhbmRsZSwKKwkJCWlibS0+YWNwaS0+dHlwZSwgZGlzcGF0Y2hfYWNwaV9ub3RpZnksIGlibSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCWlmIChzdGF0dXMgPT0gQUVfQUxSRUFEWV9FWElTVFMpIHsKKwkJCXByaW50ayhJQk1fTk9USUNFICJhbm90aGVyIGRldmljZSBkcml2ZXIgaXMgYWxyZWFkeSBoYW5kbGluZyAlcyBldmVudHNcbiIsCisJCQkJaWJtLT5uYW1lKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ayhJQk1fRVJSICJhY3BpX2luc3RhbGxfbm90aWZ5X2hhbmRsZXIoJXMpIGZhaWxlZDogJWRcbiIsCisJCQkJaWJtLT5uYW1lLCBzdGF0dXMpOworCQl9CisJCXJldHVybiAtRU5PREVWOworCX0KKwlpYm0tPmZsYWdzLmFjcGlfbm90aWZ5X2luc3RhbGxlZCA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHRwYWNwaV9kZXZpY2VfYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCByZWdpc3Rlcl90cGFjcGlfc3ViZHJpdmVyKHN0cnVjdCBpYm1fc3RydWN0ICppYm0pCit7CisJaW50IHJjOworCisJZGJnX3ByaW50ayhUUEFDUElfREJHX0lOSVQsCisJCSJyZWdpc3RlcmluZyAlcyBhcyBhbiBBQ1BJIGRyaXZlclxuIiwgaWJtLT5uYW1lKTsKKworCUJVR19PTighaWJtLT5hY3BpKTsKKworCWlibS0+YWNwaS0+ZHJpdmVyID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFjcGlfZHJpdmVyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpYm0tPmFjcGktPmRyaXZlcikgeworCQlwcmludGsoSUJNX0VSUiAia3phbGxvYyhpYm0tPmRyaXZlcikgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJc3ByaW50ZihpYm0tPmFjcGktPmRyaXZlci0+bmFtZSwgIiVzXyVzIiwgSUJNX05BTUUsIGlibS0+bmFtZSk7CisJaWJtLT5hY3BpLT5kcml2ZXItPmlkcyA9IGlibS0+YWNwaS0+aGlkOworCWlibS0+YWNwaS0+ZHJpdmVyLT5vcHMuYWRkID0gJnRwYWNwaV9kZXZpY2VfYWRkOworCisJcmMgPSBhY3BpX2J1c19yZWdpc3Rlcl9kcml2ZXIoaWJtLT5hY3BpLT5kcml2ZXIpOworCWlmIChyYyA8IDApIHsKKwkJcHJpbnRrKElCTV9FUlIgImFjcGlfYnVzX3JlZ2lzdGVyX2RyaXZlciglcykgZmFpbGVkOiAlZFxuIiwKKwkJICAgICAgIGlibS0+YWNwaS0+aGlkLCByYyk7CisJCWtmcmVlKGlibS0+YWNwaS0+ZHJpdmVyKTsKKwkJaWJtLT5hY3BpLT5kcml2ZXIgPSBOVUxMOworCX0gZWxzZSBpZiAoIXJjKQorCQlpYm0tPmZsYWdzLmFjcGlfZHJpdmVyX3JlZ2lzdGVyZWQgPSAxOworCisJcmV0dXJuIHJjOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFByb2NmcyBIZWxwZXJzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IGRpc3BhdGNoX3Byb2Nmc19yZWFkKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAorCQkJaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaWJtX3N0cnVjdCAqaWJtID0gZGF0YTsKKwlpbnQgbGVuOworCisJaWYgKCFpYm0gfHwgIWlibS0+cmVhZCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlsZW4gPSBpYm0tPnJlYWQocGFnZSk7CisJaWYgKGxlbiA8IDApCisJCXJldHVybiBsZW47CisKKwlpZiAobGVuIDw9IG9mZiArIGNvdW50KQorCQkqZW9mID0gMTsKKwkqc3RhcnQgPSBwYWdlICsgb2ZmOworCWxlbiAtPSBvZmY7CisJaWYgKGxlbiA+IGNvdW50KQorCQlsZW4gPSBjb3VudDsKKwlpZiAobGVuIDwgMCkKKwkJbGVuID0gMDsKKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBpbnQgZGlzcGF0Y2hfcHJvY2ZzX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJY29uc3QgY2hhciBfX3VzZXIgKiB1c2VyYnVmLAorCQkJdW5zaWduZWQgbG9uZyBjb3VudCwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaWJtX3N0cnVjdCAqaWJtID0gZGF0YTsKKwljaGFyICprZXJuYnVmOworCWludCByZXQ7CisKKwlpZiAoIWlibSB8fCAhaWJtLT53cml0ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlrZXJuYnVmID0ga21hbGxvYyhjb3VudCArIDIsIEdGUF9LRVJORUwpOworCWlmICgha2VybmJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoY29weV9mcm9tX3VzZXIoa2VybmJ1ZiwgdXNlcmJ1ZiwgY291bnQpKSB7CisJCWtmcmVlKGtlcm5idWYpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlrZXJuYnVmW2NvdW50XSA9IDA7CisJc3RyY2F0KGtlcm5idWYsICIsIik7CisJcmV0ID0gaWJtLT53cml0ZShrZXJuYnVmKTsKKwlpZiAocmV0ID09IDApCisJCXJldCA9IGNvdW50OworCisJa2ZyZWUoa2VybmJ1Zik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY2hhciAqbmV4dF9jbWQoY2hhciAqKmNtZHMpCit7CisJY2hhciAqc3RhcnQgPSAqY21kczsKKwljaGFyICplbmQ7CisKKwl3aGlsZSAoKGVuZCA9IHN0cmNocihzdGFydCwgJywnKSkgJiYgZW5kID09IHN0YXJ0KQorCQlzdGFydCA9IGVuZCArIDE7CisKKwlpZiAoIWVuZCkKKwkJcmV0dXJuIE5VTEw7CisKKwkqZW5kID0gMDsKKwkqY21kcyA9IGVuZCArIDE7CisJcmV0dXJuIHN0YXJ0OworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIERldmljZSBtb2RlbDogaHdtb24gYW5kIHBsYXRmb3JtCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqdHBhY3BpX3BkZXYgPSBOVUxMOworc3RhdGljIHN0cnVjdCBjbGFzc19kZXZpY2UgKnRwYWNwaV9od21vbiA9IE5VTEw7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHRwYWNwaV9wZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gSUJNX0RSVlJfTkFNRSwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHRoaW5rcGFkLWFjcGkgZHJpdmVyIGF0dHJpYnV0ZXMKKyAqLworCisvKiBpbnRlcmZhY2VfdmVyc2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBzc2l6ZV90IHRwYWNwaV9kcml2ZXJfaW50ZXJmYWNlX3ZlcnNpb25fc2hvdygKKwkJCQlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2LAorCQkJCWNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIweCUwOHhcbiIsIFRQQUNQSV9TWVNGU19WRVJTSU9OKTsKK30KKworc3RhdGljIERSSVZFUl9BVFRSKGludGVyZmFjZV92ZXJzaW9uLCBTX0lSVUdPLAorCQl0cGFjcGlfZHJpdmVyX2ludGVyZmFjZV92ZXJzaW9uX3Nob3csIE5VTEwpOworCisvKiBkZWJ1Z19sZXZlbCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBzc2l6ZV90IHRwYWNwaV9kcml2ZXJfZGVidWdfc2hvdyhzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2LAorCQkJCQkJY2hhciAqYnVmKQoreworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIjB4JTA0eFxuIiwgZGJnX2xldmVsKTsKK30KKworc3RhdGljIHNzaXplX3QgdHBhY3BpX2RyaXZlcl9kZWJ1Z19zdG9yZShzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2LAorCQkJCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJdW5zaWduZWQgbG9uZyB0OworCisJaWYgKHBhcnNlX3N0cnRvdWwoYnVmLCAweGZmZmYsICZ0KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkYmdfbGV2ZWwgPSB0OworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgRFJJVkVSX0FUVFIoZGVidWdfbGV2ZWwsIFNfSVdVU1IgfCBTX0lSVUdPLAorCQl0cGFjcGlfZHJpdmVyX2RlYnVnX3Nob3csIHRwYWNwaV9kcml2ZXJfZGVidWdfc3RvcmUpOworCisvKiB2ZXJzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBzc2l6ZV90IHRwYWNwaV9kcml2ZXJfdmVyc2lvbl9zaG93KHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYsCisJCQkJCQljaGFyICpidWYpCit7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXMgdiVzXG4iLCBJQk1fREVTQywgSUJNX1ZFUlNJT04pOworfQorCitzdGF0aWMgRFJJVkVSX0FUVFIodmVyc2lvbiwgU19JUlVHTywKKwkJdHBhY3BpX2RyaXZlcl92ZXJzaW9uX3Nob3csIE5VTEwpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHN0cnVjdCBkcml2ZXJfYXR0cmlidXRlKiB0cGFjcGlfZHJpdmVyX2F0dHJpYnV0ZXNbXSA9IHsKKwkmZHJpdmVyX2F0dHJfZGVidWdfbGV2ZWwsICZkcml2ZXJfYXR0cl92ZXJzaW9uLAorCSZkcml2ZXJfYXR0cl9pbnRlcmZhY2VfdmVyc2lvbiwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHRwYWNwaV9jcmVhdGVfZHJpdmVyX2F0dHJpYnV0ZXMoc3RydWN0IGRldmljZV9kcml2ZXIgKmRydikKK3sKKwlpbnQgaSwgcmVzOworCisJaSA9IDA7CisJcmVzID0gMDsKKwl3aGlsZSAoIXJlcyAmJiBpIDwgQVJSQVlfU0laRSh0cGFjcGlfZHJpdmVyX2F0dHJpYnV0ZXMpKSB7CisJCXJlcyA9IGRyaXZlcl9jcmVhdGVfZmlsZShkcnYsIHRwYWNwaV9kcml2ZXJfYXR0cmlidXRlc1tpXSk7CisJCWkrKzsKKwl9CisKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgdm9pZCB0cGFjcGlfcmVtb3ZlX2RyaXZlcl9hdHRyaWJ1dGVzKHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYpCit7CisJaW50IGk7CisKKwlmb3IoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHRwYWNwaV9kcml2ZXJfYXR0cmlidXRlcyk7IGkrKykKKwkJZHJpdmVyX3JlbW92ZV9maWxlKGRydiwgdHBhY3BpX2RyaXZlcl9hdHRyaWJ1dGVzW2ldKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHN5c2ZzIHN1cHBvcnQgaGVscGVycworICovCisKK3N0cnVjdCBhdHRyaWJ1dGVfc2V0X29iaiB7CisJc3RydWN0IGF0dHJpYnV0ZV9zZXQgczsKKwlzdHJ1Y3QgYXR0cmlidXRlICphOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfc2V0ICpjcmVhdGVfYXR0cl9zZXQodW5zaWduZWQgaW50IG1heF9tZW1iZXJzLAorCQkJCQkJY29uc3QgY2hhciogbmFtZSkKK3sKKwlzdHJ1Y3QgYXR0cmlidXRlX3NldF9vYmogKnNvYmo7CisKKwlpZiAobWF4X21lbWJlcnMgPT0gMCkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBBbGxvY2F0ZXMgc3BhY2UgZm9yIGltcGxpY2l0IE5VTEwgYXQgdGhlIGVuZCB0b28gKi8KKwlzb2JqID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGF0dHJpYnV0ZV9zZXRfb2JqKSArCisJCSAgICBtYXhfbWVtYmVycyAqIHNpemVvZihzdHJ1Y3QgYXR0cmlidXRlICopLAorCQkgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFzb2JqKQorCQlyZXR1cm4gTlVMTDsKKwlzb2JqLT5zLm1heF9tZW1iZXJzID0gbWF4X21lbWJlcnM7CisJc29iai0+cy5ncm91cC5hdHRycyA9ICZzb2JqLT5hOworCXNvYmotPnMuZ3JvdXAubmFtZSA9IG5hbWU7CisKKwlyZXR1cm4gJnNvYmotPnM7Cit9CisKKy8qIG5vdCBtdWx0aS10aHJlYWRlZCBzYWZlLCB1c2UgaXQgaW4gYSBzaW5nbGUgdGhyZWFkIHBlciBzZXQgKi8KK3N0YXRpYyBpbnQgYWRkX3RvX2F0dHJfc2V0KHN0cnVjdCBhdHRyaWJ1dGVfc2V0KiBzLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyKQoreworCWlmICghcyB8fCAhYXR0cikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAocy0+bWVtYmVycyA+PSBzLT5tYXhfbWVtYmVycykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzLT5ncm91cC5hdHRyc1tzLT5tZW1iZXJzXSA9IGF0dHI7CisJcy0+bWVtYmVycysrOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWRkX21hbnlfdG9fYXR0cl9zZXQoc3RydWN0IGF0dHJpYnV0ZV9zZXQqIHMsCisJCQlzdHJ1Y3QgYXR0cmlidXRlICoqYXR0ciwKKwkJCXVuc2lnbmVkIGludCBjb3VudCkKK3sKKwlpbnQgaSwgcmVzOworCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJcmVzID0gYWRkX3RvX2F0dHJfc2V0KHMsIGF0dHJbaV0pOworCQlpZiAocmVzKQorCQkJcmV0dXJuIHJlczsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZGVsZXRlX2F0dHJfc2V0KHN0cnVjdCBhdHRyaWJ1dGVfc2V0KiBzLCBzdHJ1Y3Qga29iamVjdCAqa29iaikKK3sKKwlzeXNmc19yZW1vdmVfZ3JvdXAoa29iaiwgJnMtPmdyb3VwKTsKKwlkZXN0cm95X2F0dHJfc2V0KHMpOworfQorCitzdGF0aWMgaW50IHBhcnNlX3N0cnRvdWwoY29uc3QgY2hhciAqYnVmLAorCQl1bnNpZ25lZCBsb25nIG1heCwgdW5zaWduZWQgbG9uZyAqdmFsdWUpCit7CisJY2hhciAqZW5kcDsKKworCSp2YWx1ZSA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgJmVuZHAsIDApOworCXdoaWxlICgqZW5kcCAmJiBpc3NwYWNlKCplbmRwKSkKKwkJZW5kcCsrOworCWlmICgqZW5kcCB8fCAqdmFsdWUgPiBtYXgpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFN1YmRyaXZlcnMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiB0aGlua3BhZC1hY3BpIGluaXQgc3ViZHJpdmVyCisgKi8KKworc3RhdGljIGludCBfX2luaXQgdGhpbmtwYWRfYWNwaV9kcml2ZXJfaW5pdChzdHJ1Y3QgaWJtX2luaXRfc3RydWN0ICppaWJtKQoreworCXByaW50ayhJQk1fSU5GTyAiJXMgdiVzXG4iLCBJQk1fREVTQywgSUJNX1ZFUlNJT04pOworCXByaW50ayhJQk1fSU5GTyAiJXNcbiIsIElCTV9VUkwpOworCisJaWYgKGlibV90aGlua3BhZF9lY19mb3VuZCkKKwkJcHJpbnRrKElCTV9JTkZPICJUaGlua1BhZCBFQyBmaXJtd2FyZSAlc1xuIiwKKwkJICAgICAgIGlibV90aGlua3BhZF9lY19mb3VuZCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0aGlua3BhZF9hY3BpX2RyaXZlcl9yZWFkKGNoYXIgKnApCit7CisJaW50IGxlbiA9IDA7CisKKwlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiZHJpdmVyOlx0XHQlc1xuIiwgSUJNX0RFU0MpOworCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJ2ZXJzaW9uOlx0JXNcbiIsIElCTV9WRVJTSU9OKTsKKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaWJtX3N0cnVjdCB0aGlua3BhZF9hY3BpX2RyaXZlcl9kYXRhID0geworCS5uYW1lID0gImRyaXZlciIsCisJLnJlYWQgPSB0aGlua3BhZF9hY3BpX2RyaXZlcl9yZWFkLAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEhvdGtleSBzdWJkcml2ZXIKKyAqLworCitzdGF0aWMgaW50IGhvdGtleV9vcmlnX3N0YXR1czsKK3N0YXRpYyBpbnQgaG90a2V5X29yaWdfbWFzazsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfc2V0ICpob3RrZXlfZGV2X2F0dHJpYnV0ZXMgPSBOVUxMOworCisvKiBzeXNmcyBob3RrZXkgZW5hYmxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBzc2l6ZV90IGhvdGtleV9lbmFibGVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgIGNoYXIgKmJ1ZikKK3sKKwlpbnQgcmVzLCBzdGF0dXMsIG1hc2s7CisKKwlyZXMgPSBob3RrZXlfZ2V0KCZzdGF0dXMsICZtYXNrKTsKKwlpZiAocmVzKQorCQlyZXR1cm4gcmVzOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIHN0YXR1cyk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGhvdGtleV9lbmFibGVfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXVuc2lnbmVkIGxvbmcgdDsKKwlpbnQgcmVzLCBzdGF0dXMsIG1hc2s7CisKKwlpZiAocGFyc2Vfc3RydG91bChidWYsIDEsICZ0KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXMgPSBob3RrZXlfZ2V0KCZzdGF0dXMsICZtYXNrKTsKKwlpZiAoIXJlcykKKwkJcmVzID0gaG90a2V5X3NldCh0LCBtYXNrKTsKKworCXJldHVybiAocmVzKSA/IHJlcyA6IGNvdW50OworfQorCitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2X2F0dHJfaG90a2V5X2VuYWJsZSA9CisJX19BVFRSKGVuYWJsZSwgU19JV1VTUiB8IFNfSVJVR08sCisJCWhvdGtleV9lbmFibGVfc2hvdywgaG90a2V5X2VuYWJsZV9zdG9yZSk7CisKKy8qIHN5c2ZzIGhvdGtleSBtYXNrIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIHNzaXplX3QgaG90a2V5X21hc2tfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgIGNoYXIgKmJ1ZikKK3sKKwlpbnQgcmVzLCBzdGF0dXMsIG1hc2s7CisKKwlyZXMgPSBob3RrZXlfZ2V0KCZzdGF0dXMsICZtYXNrKTsKKwlpZiAocmVzKQorCQlyZXR1cm4gcmVzOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiMHglMDR4XG4iLCBtYXNrKTsKK30KKworc3RhdGljIHNzaXplX3QgaG90a2V5X21hc2tfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXVuc2lnbmVkIGxvbmcgdDsKKwlpbnQgcmVzLCBzdGF0dXMsIG1hc2s7CisKKwlpZiAocGFyc2Vfc3RydG91bChidWYsIDB4ZmZmZiwgJnQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJlcyA9IGhvdGtleV9nZXQoJnN0YXR1cywgJm1hc2spOworCWlmICghcmVzKQorCQlob3RrZXlfc2V0KHN0YXR1cywgdCk7CisKKwlyZXR1cm4gKHJlcykgPyByZXMgOiBjb3VudDsKK30KKworc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGRldl9hdHRyX2hvdGtleV9tYXNrID0KKwlfX0FUVFIobWFzaywgU19JV1VTUiB8IFNfSVJVR08sCisJCWhvdGtleV9tYXNrX3Nob3csIGhvdGtleV9tYXNrX3N0b3JlKTsKKworLyogc3lzZnMgaG90a2V5IGJpb3NfZW5hYmxlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgc3NpemVfdCBob3RrZXlfYmlvc19lbmFibGVkX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICBjaGFyICpidWYpCit7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIGhvdGtleV9vcmlnX3N0YXR1cyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBkZXZfYXR0cl9ob3RrZXlfYmlvc19lbmFibGVkID0KKwlfX0FUVFIoYmlvc19lbmFibGVkLCBTX0lSVUdPLCBob3RrZXlfYmlvc19lbmFibGVkX3Nob3csIE5VTEwpOworCisvKiBzeXNmcyBob3RrZXkgYmlvc19tYXNrIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBzc2l6ZV90IGhvdGtleV9iaW9zX21hc2tfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIweCUwNHhcbiIsIGhvdGtleV9vcmlnX21hc2spOworfQorCitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2X2F0dHJfaG90a2V5X2Jpb3NfbWFzayA9CisJX19BVFRSKGJpb3NfbWFzaywgU19JUlVHTywgaG90a2V5X2Jpb3NfbWFza19zaG93LCBOVUxMKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpob3RrZXlfbWFza19hdHRyaWJ1dGVzW10gPSB7CisJJmRldl9hdHRyX2hvdGtleV9tYXNrLmF0dHIsCisJJmRldl9hdHRyX2hvdGtleV9iaW9zX2VuYWJsZWQuYXR0ciwKKwkmZGV2X2F0dHJfaG90a2V5X2Jpb3NfbWFzay5hdHRyLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaG90a2V5X2luaXQoc3RydWN0IGlibV9pbml0X3N0cnVjdCAqaWlibSkKK3sKKwlpbnQgcmVzOworCisJdmRiZ19wcmludGsoVFBBQ1BJX0RCR19JTklULCAiaW5pdGlhbGl6aW5nIGhvdGtleSBzdWJkcml2ZXJcbiIpOworCisJSUJNX0FDUElIQU5ETEVfSU5JVChoa2V5KTsKKwltdXRleF9pbml0KCZob3RrZXlfbXV0ZXgpOworCisJLyogaG90a2V5IG5vdCBzdXBwb3J0ZWQgb24gNTcwICovCisJdHBfZmVhdHVyZXMuaG90a2V5ID0gaGtleV9oYW5kbGUgIT0gTlVMTDsKKworCXZkYmdfcHJpbnRrKFRQQUNQSV9EQkdfSU5JVCwgImhvdGtleXMgYXJlICVzXG4iLAorCQlzdHJfc3VwcG9ydGVkKHRwX2ZlYXR1cmVzLmhvdGtleSkpOworCisJaWYgKHRwX2ZlYXR1cmVzLmhvdGtleSkgeworCQlob3RrZXlfZGV2X2F0dHJpYnV0ZXMgPSBjcmVhdGVfYXR0cl9zZXQoNCwKKwkJCQkJCVRQQUNQSV9IT1RLRVlfU1lTRlNfR1JPVVApOworCQlpZiAoIWhvdGtleV9kZXZfYXR0cmlidXRlcykKKwkJCXJldHVybiAtRU5PTUVNOworCQlyZXMgPSBhZGRfdG9fYXR0cl9zZXQoaG90a2V5X2Rldl9hdHRyaWJ1dGVzLAorCQkJCSZkZXZfYXR0cl9ob3RrZXlfZW5hYmxlLmF0dHIpOworCQlpZiAocmVzKQorCQkJcmV0dXJuIHJlczsKKworCQkvKiBtYXNrIG5vdCBzdXBwb3J0ZWQgb24gNTcwLCA2MDBlL3gsIDc3MGUsIDc3MHgsIEEyMWUsIEEyeG0vcCwKKwkJICAgQTMwLCBSMzAsIFIzMSwgVDIwLTIyLCBYMjAtMjEsIFgyMi0yNCAqLworCQl0cF9mZWF0dXJlcy5ob3RrZXlfbWFzayA9CisJCQlhY3BpX2V2YWxmKGhrZXlfaGFuZGxlLCBOVUxMLCAiREhLTiIsICJxdiIpOworCisJCXZkYmdfcHJpbnRrKFRQQUNQSV9EQkdfSU5JVCwgImhvdGtleSBtYXNrcyBhcmUgJXNcbiIsCisJCQlzdHJfc3VwcG9ydGVkKHRwX2ZlYXR1cmVzLmhvdGtleV9tYXNrKSk7CisKKwkJcmVzID0gaG90a2V5X2dldCgmaG90a2V5X29yaWdfc3RhdHVzLCAmaG90a2V5X29yaWdfbWFzayk7CisJCWlmICghcmVzICYmIHRwX2ZlYXR1cmVzLmhvdGtleV9tYXNrKSB7CisJCQlyZXMgPSBhZGRfbWFueV90b19hdHRyX3NldChob3RrZXlfZGV2X2F0dHJpYnV0ZXMsCisJCQkJaG90a2V5X21hc2tfYXR0cmlidXRlcywKKwkJCQlBUlJBWV9TSVpFKGhvdGtleV9tYXNrX2F0dHJpYnV0ZXMpKTsKKwkJfQorCQlpZiAoIXJlcykKKwkJCXJlcyA9IHJlZ2lzdGVyX2F0dHJfc2V0X3dpdGhfc3lzZnMoCisJCQkJCWhvdGtleV9kZXZfYXR0cmlidXRlcywKKwkJCQkJJnRwYWNwaV9wZGV2LT5kZXYua29iaik7CisKKwkJaWYgKHJlcykKKwkJCXJldHVybiByZXM7CisJfQorCisJcmV0dXJuICh0cF9mZWF0dXJlcy5ob3RrZXkpPyAwIDogMTsKK30KKworc3RhdGljIHZvaWQgaG90a2V5X2V4aXQodm9pZCkKK3sKKwlpbnQgcmVzOworCisJaWYgKHRwX2ZlYXR1cmVzLmhvdGtleSkgeworCQlkYmdfcHJpbnRrKFRQQUNQSV9EQkdfRVhJVCwgInJlc3RvcmluZyBvcmlnaW5hbCBob3RrZXkgbWFza1xuIik7CisJCXJlcyA9IGhvdGtleV9zZXQoaG90a2V5X29yaWdfc3RhdHVzLCBob3RrZXlfb3JpZ19tYXNrKTsKKwkJaWYgKHJlcykKKwkJCXByaW50ayhJQk1fRVJSICJmYWlsZWQgdG8gcmVzdG9yZSBob3RrZXkgdG8gQklPUyBkZWZhdWx0c1xuIik7CisJfQorCisJaWYgKGhvdGtleV9kZXZfYXR0cmlidXRlcykgeworCQlkZWxldGVfYXR0cl9zZXQoaG90a2V5X2Rldl9hdHRyaWJ1dGVzLCAmdHBhY3BpX3BkZXYtPmRldi5rb2JqKTsKKwkJaG90a2V5X2Rldl9hdHRyaWJ1dGVzID0gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGhvdGtleV9ub3RpZnkoc3RydWN0IGlibV9zdHJ1Y3QgKmlibSwgdTMyIGV2ZW50KQoreworCWludCBoa2V5OworCisJaWYgKGFjcGlfZXZhbGYoaGtleV9oYW5kbGUsICZoa2V5LCAiTUhLUCIsICJkIikpCisJCWFjcGlfYnVzX2dlbmVyYXRlX2V2ZW50KGlibS0+YWNwaS0+ZGV2aWNlLCBldmVudCwgaGtleSk7CisJZWxzZSB7CisJCXByaW50ayhJQk1fRVJSICJ1bmtub3duIGhvdGtleSBldmVudCAlZFxuIiwgZXZlbnQpOworCQlhY3BpX2J1c19nZW5lcmF0ZV9ldmVudChpYm0tPmFjcGktPmRldmljZSwgZXZlbnQsIDApOworCX0KK30KKworLyoKKyAqIENhbGwgd2l0aCBob3RrZXlfbXV0ZXggaGVsZAorICovCitzdGF0aWMgaW50IGhvdGtleV9nZXQoaW50ICpzdGF0dXMsIGludCAqbWFzaykKK3sKKwlpZiAoIWFjcGlfZXZhbGYoaGtleV9oYW5kbGUsIHN0YXR1cywgIkRIS0MiLCAiZCIpKQorCQlyZXR1cm4gLUVJTzsKKworCWlmICh0cF9mZWF0dXJlcy5ob3RrZXlfbWFzaykKKwkJaWYgKCFhY3BpX2V2YWxmKGhrZXlfaGFuZGxlLCBtYXNrLCAiREhLTiIsICJkIikpCisJCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiAwOworfQorCisvKgorICogQ2FsbCB3aXRoIGhvdGtleV9tdXRleCBoZWxkCisgKi8KK3N0YXRpYyBpbnQgaG90a2V5X3NldChpbnQgc3RhdHVzLCBpbnQgbWFzaykKK3sKKwlpbnQgaTsKKworCWlmICghYWNwaV9ldmFsZihoa2V5X2hhbmRsZSwgTlVMTCwgIk1IS0MiLCAidmQiLCBzdGF0dXMpKQorCQlyZXR1cm4gLUVJTzsKKworCWlmICh0cF9mZWF0dXJlcy5ob3RrZXlfbWFzaykKKwkJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHsKKwkJCWludCBiaXQgPSAoKDEgPDwgaSkgJiBtYXNrKSAhPSAwOworCQkJaWYgKCFhY3BpX2V2YWxmKGhrZXlfaGFuZGxlLAorCQkJCQlOVUxMLCAiTUhLTSIsICJ2ZGQiLCBpICsgMSwgYml0KSkKKwkJCQlyZXR1cm4gLUVJTzsKKwkJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIHByb2NmcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIGludCBob3RrZXlfcmVhZChjaGFyICpwKQoreworCWludCByZXMsIHN0YXR1cywgbWFzazsKKwlpbnQgbGVuID0gMDsKKworCWlmICghdHBfZmVhdHVyZXMuaG90a2V5KSB7CisJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJzdGF0dXM6XHRcdG5vdCBzdXBwb3J0ZWRcbiIpOworCQlyZXR1cm4gbGVuOworCX0KKworCXJlcyA9IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmaG90a2V5X211dGV4KTsKKwlpZiAocmVzIDwgMCkKKwkJcmV0dXJuIHJlczsKKwlyZXMgPSBob3RrZXlfZ2V0KCZzdGF0dXMsICZtYXNrKTsKKwltdXRleF91bmxvY2soJmhvdGtleV9tdXRleCk7CisJaWYgKHJlcykKKwkJcmV0dXJuIHJlczsKKworCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJzdGF0dXM6XHRcdCVzXG4iLCBlbmFibGVkKHN0YXR1cywgMCkpOworCWlmICh0cF9mZWF0dXJlcy5ob3RrZXlfbWFzaykgeworCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAibWFzazpcdFx0MHglMDR4XG4iLCBtYXNrKTsKKwkJbGVuICs9IHNwcmludGYocCArIGxlbiwKKwkJCSAgICAgICAiY29tbWFuZHM6XHRlbmFibGUsIGRpc2FibGUsIHJlc2V0LCA8bWFzaz5cbiIpOworCX0gZWxzZSB7CisJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJtYXNrOlx0XHRub3Qgc3VwcG9ydGVkXG4iKTsKKwkJbGVuICs9IHNwcmludGYocCArIGxlbiwgImNvbW1hbmRzOlx0ZW5hYmxlLCBkaXNhYmxlLCByZXNldFxuIik7CisJfQorCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIGludCBob3RrZXlfd3JpdGUoY2hhciAqYnVmKQoreworCWludCByZXMsIHN0YXR1cywgbWFzazsKKwljaGFyICpjbWQ7CisJaW50IGRvX2NtZCA9IDA7CisKKwlpZiAoIXRwX2ZlYXR1cmVzLmhvdGtleSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXMgPSBtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmhvdGtleV9tdXRleCk7CisJaWYgKHJlcyA8IDApCisJCXJldHVybiByZXM7CisKKwlyZXMgPSBob3RrZXlfZ2V0KCZzdGF0dXMsICZtYXNrKTsKKwlpZiAocmVzKQorCQlnb3RvIGVycmV4aXQ7CisKKwlyZXMgPSAwOworCXdoaWxlICgoY21kID0gbmV4dF9jbWQoJmJ1ZikpKSB7CisJCWlmIChzdHJsZW5jbXAoY21kLCAiZW5hYmxlIikgPT0gMCkgeworCQkJc3RhdHVzID0gMTsKKwkJfSBlbHNlIGlmIChzdHJsZW5jbXAoY21kLCAiZGlzYWJsZSIpID09IDApIHsKKwkJCXN0YXR1cyA9IDA7CisJCX0gZWxzZSBpZiAoc3RybGVuY21wKGNtZCwgInJlc2V0IikgPT0gMCkgeworCQkJc3RhdHVzID0gaG90a2V5X29yaWdfc3RhdHVzOworCQkJbWFzayA9IGhvdGtleV9vcmlnX21hc2s7CisJCX0gZWxzZSBpZiAoc3NjYW5mKGNtZCwgIjB4JXgiLCAmbWFzaykgPT0gMSkgeworCQkJLyogbWFzayBzZXQgKi8KKwkJfSBlbHNlIGlmIChzc2NhbmYoY21kLCAiJXgiLCAmbWFzaykgPT0gMSkgeworCQkJLyogbWFzayBzZXQgKi8KKwkJfSBlbHNlIHsKKwkJCXJlcyA9IC1FSU5WQUw7CisJCQlnb3RvIGVycmV4aXQ7CisJCX0KKwkJZG9fY21kID0gMTsKKwl9CisKKwlpZiAoZG9fY21kKQorCQlyZXMgPSBob3RrZXlfc2V0KHN0YXR1cywgbWFzayk7CisKK2VycmV4aXQ6CisJbXV0ZXhfdW5sb2NrKCZob3RrZXlfbXV0ZXgpOworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdHBfYWNwaV9kcnZfc3RydWN0IGlibV9ob3RrZXlfYWNwaWRyaXZlciA9IHsKKwkuaGlkID0gSUJNX0hLRVlfSElELAorCS5ub3RpZnkgPSBob3RrZXlfbm90aWZ5LAorCS5oYW5kbGUgPSAmaGtleV9oYW5kbGUsCisJLnR5cGUgPSBBQ1BJX0RFVklDRV9OT1RJRlksCit9OworCitzdGF0aWMgc3RydWN0IGlibV9zdHJ1Y3QgaG90a2V5X2RyaXZlcl9kYXRhID0geworCS5uYW1lID0gImhvdGtleSIsCisJLnJlYWQgPSBob3RrZXlfcmVhZCwKKwkud3JpdGUgPSBob3RrZXlfd3JpdGUsCisJLmV4aXQgPSBob3RrZXlfZXhpdCwKKwkuYWNwaSA9ICZpYm1faG90a2V5X2FjcGlkcml2ZXIsCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQmx1ZXRvb3RoIHN1YmRyaXZlcgorICovCisKKy8qIHN5c2ZzIGJsdWV0b290aCBlbmFibGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIHNzaXplX3QgYmx1ZXRvb3RoX2VuYWJsZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgY2hhciAqYnVmKQoreworCWludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBibHVldG9vdGhfZ2V0X3JhZGlvc3coKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcmV0dXJuIHN0YXR1czsKKworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBzdGF0dXMgPyAxIDogMCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGJsdWV0b290aF9lbmFibGVfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXVuc2lnbmVkIGxvbmcgdDsKKwlpbnQgcmVzOworCisJaWYgKHBhcnNlX3N0cnRvdWwoYnVmLCAxLCAmdCkpCisJCXJldHVybiAtRUlOVkFMOworCisJcmVzID0gYmx1ZXRvb3RoX3NldF9yYWRpb3N3KHQpOworCisJcmV0dXJuIChyZXMpID8gcmVzIDogY291bnQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBkZXZfYXR0cl9ibHVldG9vdGhfZW5hYmxlID0KKwlfX0FUVFIoZW5hYmxlLCBTX0lXVVNSIHwgU19JUlVHTywKKwkJYmx1ZXRvb3RoX2VuYWJsZV9zaG93LCBibHVldG9vdGhfZW5hYmxlX3N0b3JlKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpibHVldG9vdGhfYXR0cmlidXRlc1tdID0geworCSZkZXZfYXR0cl9ibHVldG9vdGhfZW5hYmxlLmF0dHIsCisJTlVMTAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYmx1ZXRvb3RoX2F0dHJfZ3JvdXAgPSB7CisJLm5hbWUgPSBUUEFDUElfQkxVRVRIX1NZU0ZTX0dST1VQLAorCS5hdHRycyA9IGJsdWV0b290aF9hdHRyaWJ1dGVzLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYmx1ZXRvb3RoX2luaXQoc3RydWN0IGlibV9pbml0X3N0cnVjdCAqaWlibSkKK3sKKwlpbnQgcmVzOworCWludCBzdGF0dXMgPSAwOworCisJdmRiZ19wcmludGsoVFBBQ1BJX0RCR19JTklULCAiaW5pdGlhbGl6aW5nIGJsdWV0b290aCBzdWJkcml2ZXJcbiIpOworCisJSUJNX0FDUElIQU5ETEVfSU5JVChoa2V5KTsKKworCS8qIGJsdWV0b290aCBub3Qgc3VwcG9ydGVkIG9uIDU3MCwgNjAwZS94LCA3NzBlLCA3NzB4LCBBMjFlLCBBMnhtL3AsCisJICAgRzR4LCBSMzAsIFIzMSwgUjQwZSwgUjUwZSwgVDIwLTIyLCBYMjAtMjEgKi8KKwl0cF9mZWF0dXJlcy5ibHVldG9vdGggPSBoa2V5X2hhbmRsZSAmJgorCSAgICBhY3BpX2V2YWxmKGhrZXlfaGFuZGxlLCAmc3RhdHVzLCAiR0JEQyIsICJxZCIpOworCisJdmRiZ19wcmludGsoVFBBQ1BJX0RCR19JTklULCAiYmx1ZXRvb3RoIGlzICVzLCBzdGF0dXMgMHglMDJ4XG4iLAorCQlzdHJfc3VwcG9ydGVkKHRwX2ZlYXR1cmVzLmJsdWV0b290aCksCisJCXN0YXR1cyk7CisKKwlpZiAodHBfZmVhdHVyZXMuYmx1ZXRvb3RoKSB7CisJCWlmICghKHN0YXR1cyAmIFRQX0FDUElfQkxVRVRPT1RIX0hXUFJFU0VOVCkpIHsKKwkJCS8qIG5vIGJsdWV0b290aCBoYXJkd2FyZSBwcmVzZW50IGluIHN5c3RlbSAqLworCQkJdHBfZmVhdHVyZXMuYmx1ZXRvb3RoID0gMDsKKwkJCWRiZ19wcmludGsoVFBBQ1BJX0RCR19JTklULAorCQkJCSAgICJibHVldG9vdGggaGFyZHdhcmUgbm90IGluc3RhbGxlZFxuIik7CisJCX0gZWxzZSB7CisJCQlyZXMgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJnRwYWNwaV9wZGV2LT5kZXYua29iaiwKKwkJCQkJJmJsdWV0b290aF9hdHRyX2dyb3VwKTsKKwkJCWlmIChyZXMpCisJCQkJcmV0dXJuIHJlczsKKwkJfQorCX0KKworCXJldHVybiAodHBfZmVhdHVyZXMuYmx1ZXRvb3RoKT8gMCA6IDE7Cit9CisKK3N0YXRpYyB2b2lkIGJsdWV0b290aF9leGl0KHZvaWQpCit7CisJc3lzZnNfcmVtb3ZlX2dyb3VwKCZ0cGFjcGlfcGRldi0+ZGV2LmtvYmosCisJCQkmYmx1ZXRvb3RoX2F0dHJfZ3JvdXApOworfQorCitzdGF0aWMgaW50IGJsdWV0b290aF9nZXRfcmFkaW9zdyh2b2lkKQoreworCWludCBzdGF0dXM7CisKKwlpZiAoIXRwX2ZlYXR1cmVzLmJsdWV0b290aCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoIWFjcGlfZXZhbGYoaGtleV9oYW5kbGUsICZzdGF0dXMsICJHQkRDIiwgImQiKSkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gKChzdGF0dXMgJiBUUF9BQ1BJX0JMVUVUT09USF9SQURJT1NTVykgIT0gMCk7Cit9CisKK3N0YXRpYyBpbnQgYmx1ZXRvb3RoX3NldF9yYWRpb3N3KGludCByYWRpb19vbikKK3sKKwlpbnQgc3RhdHVzOworCisJaWYgKCF0cF9mZWF0dXJlcy5ibHVldG9vdGgpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKCFhY3BpX2V2YWxmKGhrZXlfaGFuZGxlLCAmc3RhdHVzLCAiR0JEQyIsICJkIikpCisJCXJldHVybiAtRUlPOworCWlmIChyYWRpb19vbikKKwkJc3RhdHVzIHw9IFRQX0FDUElfQkxVRVRPT1RIX1JBRElPU1NXOworCWVsc2UKKwkJc3RhdHVzICY9IH5UUF9BQ1BJX0JMVUVUT09USF9SQURJT1NTVzsKKwlpZiAoIWFjcGlfZXZhbGYoaGtleV9oYW5kbGUsIE5VTEwsICJTQkRDIiwgInZkIiwgc3RhdHVzKSkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gMDsKK30KKworLyogcHJvY2ZzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgaW50IGJsdWV0b290aF9yZWFkKGNoYXIgKnApCit7CisJaW50IGxlbiA9IDA7CisJaW50IHN0YXR1cyA9IGJsdWV0b290aF9nZXRfcmFkaW9zdygpOworCisJaWYgKCF0cF9mZWF0dXJlcy5ibHVldG9vdGgpCisJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJzdGF0dXM6XHRcdG5vdCBzdXBwb3J0ZWRcbiIpOworCWVsc2UgeworCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAic3RhdHVzOlx0XHQlc1xuIiwKKwkJCQkoc3RhdHVzKT8gImVuYWJsZWQiIDogImRpc2FibGVkIik7CisJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJjb21tYW5kczpcdGVuYWJsZSwgZGlzYWJsZVxuIik7CisJfQorCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIGludCBibHVldG9vdGhfd3JpdGUoY2hhciAqYnVmKQoreworCWNoYXIgKmNtZDsKKworCWlmICghdHBfZmVhdHVyZXMuYmx1ZXRvb3RoKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXdoaWxlICgoY21kID0gbmV4dF9jbWQoJmJ1ZikpKSB7CisJCWlmIChzdHJsZW5jbXAoY21kLCAiZW5hYmxlIikgPT0gMCkgeworCQkJYmx1ZXRvb3RoX3NldF9yYWRpb3N3KDEpOworCQl9IGVsc2UgaWYgKHN0cmxlbmNtcChjbWQsICJkaXNhYmxlIikgPT0gMCkgeworCQkJYmx1ZXRvb3RoX3NldF9yYWRpb3N3KDApOworCQl9IGVsc2UKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGlibV9zdHJ1Y3QgYmx1ZXRvb3RoX2RyaXZlcl9kYXRhID0geworCS5uYW1lID0gImJsdWV0b290aCIsCisJLnJlYWQgPSBibHVldG9vdGhfcmVhZCwKKwkud3JpdGUgPSBibHVldG9vdGhfd3JpdGUsCisJLmV4aXQgPSBibHVldG9vdGhfZXhpdCwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBXYW4gc3ViZHJpdmVyCisgKi8KKworLyogc3lzZnMgd2FuIGVuYWJsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgc3NpemVfdCB3YW5fZW5hYmxlX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICBjaGFyICpidWYpCit7CisJaW50IHN0YXR1czsKKworCXN0YXR1cyA9IHdhbl9nZXRfcmFkaW9zdygpOworCWlmIChzdGF0dXMgPCAwKQorCQlyZXR1cm4gc3RhdHVzOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIHN0YXR1cyA/IDEgOiAwKTsKK30KKworc3RhdGljIHNzaXplX3Qgd2FuX2VuYWJsZV9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJdW5zaWduZWQgbG9uZyB0OworCWludCByZXM7CisKKwlpZiAocGFyc2Vfc3RydG91bChidWYsIDEsICZ0KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXMgPSB3YW5fc2V0X3JhZGlvc3codCk7CisKKwlyZXR1cm4gKHJlcykgPyByZXMgOiBjb3VudDsKK30KKworc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGRldl9hdHRyX3dhbl9lbmFibGUgPQorCV9fQVRUUihlbmFibGUsIFNfSVdVU1IgfCBTX0lSVUdPLAorCQl3YW5fZW5hYmxlX3Nob3csIHdhbl9lbmFibGVfc3RvcmUpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKndhbl9hdHRyaWJ1dGVzW10gPSB7CisJJmRldl9hdHRyX3dhbl9lbmFibGUuYXR0ciwKKwlOVUxMCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCB3YW5fYXR0cl9ncm91cCA9IHsKKwkubmFtZSA9IFRQQUNQSV9XQU5fU1lTRlNfR1JPVVAsCisJLmF0dHJzID0gd2FuX2F0dHJpYnV0ZXMsCit9OworCitzdGF0aWMgaW50IF9faW5pdCB3YW5faW5pdChzdHJ1Y3QgaWJtX2luaXRfc3RydWN0ICppaWJtKQoreworCWludCByZXM7CisJaW50IHN0YXR1cyA9IDA7CisKKwl2ZGJnX3ByaW50ayhUUEFDUElfREJHX0lOSVQsICJpbml0aWFsaXppbmcgd2FuIHN1YmRyaXZlclxuIik7CisKKwlJQk1fQUNQSUhBTkRMRV9JTklUKGhrZXkpOworCisJdHBfZmVhdHVyZXMud2FuID0gaGtleV9oYW5kbGUgJiYKKwkgICAgYWNwaV9ldmFsZihoa2V5X2hhbmRsZSwgJnN0YXR1cywgIkdXQU4iLCAicWQiKTsKKworCXZkYmdfcHJpbnRrKFRQQUNQSV9EQkdfSU5JVCwgIndhbiBpcyAlcywgc3RhdHVzIDB4JTAyeFxuIiwKKwkJc3RyX3N1cHBvcnRlZCh0cF9mZWF0dXJlcy53YW4pLAorCQlzdGF0dXMpOworCisJaWYgKHRwX2ZlYXR1cmVzLndhbikgeworCQlpZiAoIShzdGF0dXMgJiBUUF9BQ1BJX1dBTkNBUkRfSFdQUkVTRU5UKSkgeworCQkJLyogbm8gd2FuIGhhcmR3YXJlIHByZXNlbnQgaW4gc3lzdGVtICovCisJCQl0cF9mZWF0dXJlcy53YW4gPSAwOworCQkJZGJnX3ByaW50ayhUUEFDUElfREJHX0lOSVQsCisJCQkJICAgIndhbiBoYXJkd2FyZSBub3QgaW5zdGFsbGVkXG4iKTsKKwkJfSBlbHNlIHsKKwkJCXJlcyA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmdHBhY3BpX3BkZXYtPmRldi5rb2JqLAorCQkJCQkmd2FuX2F0dHJfZ3JvdXApOworCQkJaWYgKHJlcykKKwkJCQlyZXR1cm4gcmVzOworCQl9CisJfQorCisJcmV0dXJuICh0cF9mZWF0dXJlcy53YW4pPyAwIDogMTsKK30KKworc3RhdGljIHZvaWQgd2FuX2V4aXQodm9pZCkKK3sKKwlzeXNmc19yZW1vdmVfZ3JvdXAoJnRwYWNwaV9wZGV2LT5kZXYua29iaiwKKwkJJndhbl9hdHRyX2dyb3VwKTsKK30KKworc3RhdGljIGludCB3YW5fZ2V0X3JhZGlvc3codm9pZCkKK3sKKwlpbnQgc3RhdHVzOworCisJaWYgKCF0cF9mZWF0dXJlcy53YW4pCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKCFhY3BpX2V2YWxmKGhrZXlfaGFuZGxlLCAmc3RhdHVzLCAiR1dBTiIsICJkIikpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuICgoc3RhdHVzICYgVFBfQUNQSV9XQU5DQVJEX1JBRElPU1NXKSAhPSAwKTsKK30KKworc3RhdGljIGludCB3YW5fc2V0X3JhZGlvc3coaW50IHJhZGlvX29uKQoreworCWludCBzdGF0dXM7CisKKwlpZiAoIXRwX2ZlYXR1cmVzLndhbikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoIWFjcGlfZXZhbGYoaGtleV9oYW5kbGUsICZzdGF0dXMsICJHV0FOIiwgImQiKSkKKwkJcmV0dXJuIC1FSU87CisJaWYgKHJhZGlvX29uKQorCQlzdGF0dXMgfD0gVFBfQUNQSV9XQU5DQVJEX1JBRElPU1NXOworCWVsc2UKKwkJc3RhdHVzICY9IH5UUF9BQ1BJX1dBTkNBUkRfUkFESU9TU1c7CisJaWYgKCFhY3BpX2V2YWxmKGhrZXlfaGFuZGxlLCBOVUxMLCAiU1dBTiIsICJ2ZCIsIHN0YXR1cykpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIDA7Cit9CisKKy8qIHByb2NmcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIGludCB3YW5fcmVhZChjaGFyICpwKQoreworCWludCBsZW4gPSAwOworCWludCBzdGF0dXMgPSB3YW5fZ2V0X3JhZGlvc3coKTsKKworCWlmICghdHBfZmVhdHVyZXMud2FuKQorCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAic3RhdHVzOlx0XHRub3Qgc3VwcG9ydGVkXG4iKTsKKwllbHNlIHsKKwkJbGVuICs9IHNwcmludGYocCArIGxlbiwgInN0YXR1czpcdFx0JXNcbiIsCisJCQkJKHN0YXR1cyk/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOworCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiY29tbWFuZHM6XHRlbmFibGUsIGRpc2FibGVcbiIpOworCX0KKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBpbnQgd2FuX3dyaXRlKGNoYXIgKmJ1ZikKK3sKKwljaGFyICpjbWQ7CisKKwlpZiAoIXRwX2ZlYXR1cmVzLndhbikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwl3aGlsZSAoKGNtZCA9IG5leHRfY21kKCZidWYpKSkgeworCQlpZiAoc3RybGVuY21wKGNtZCwgImVuYWJsZSIpID09IDApIHsKKwkJCXdhbl9zZXRfcmFkaW9zdygxKTsKKwkJfSBlbHNlIGlmIChzdHJsZW5jbXAoY21kLCAiZGlzYWJsZSIpID09IDApIHsKKwkJCXdhbl9zZXRfcmFkaW9zdygwKTsKKwkJfSBlbHNlCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBpYm1fc3RydWN0IHdhbl9kcml2ZXJfZGF0YSA9IHsKKwkubmFtZSA9ICJ3YW4iLAorCS5yZWFkID0gd2FuX3JlYWQsCisJLndyaXRlID0gd2FuX3dyaXRlLAorCS5leGl0ID0gd2FuX2V4aXQsCisJLmZsYWdzLmV4cGVyaW1lbnRhbCA9IDEsCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVmlkZW8gc3ViZHJpdmVyCisgKi8KKworc3RhdGljIGVudW0gdmlkZW9fYWNjZXNzX21vZGUgdmlkZW9fc3VwcG9ydGVkOworc3RhdGljIGludCB2aWRlb19vcmlnX2F1dG9zdzsKKworSUJNX0hBTkRMRSh2aWQsIHJvb3QsICJcXF9TQi5QQ0kuQUdQLlZHQSIsCS8qIDU3MCAqLworCSAgICJcXF9TQi5QQ0kwLkFHUDAuVklEMCIsCS8qIDYwMGUveCwgNzcweCAqLworCSAgICJcXF9TQi5QQ0kwLlZJRDAiLAkvKiA3NzBlICovCisJICAgIlxcX1NCLlBDSTAuVklEIiwJLyogQTIxZSwgRzR4LCBSNTBlLCBYMzAsIFg0MCAqLworCSAgICJcXF9TQi5QQ0kwLkFHUC5WSUQiLAkvKiBhbGwgb3RoZXJzICovCisJICAgKTsJCQkJLyogUjMwLCBSMzEgKi8KKworSUJNX0hBTkRMRSh2aWQyLCByb290LCAiXFxfU0IuUENJMC5BR1BCLlZJRCIpOwkvKiBHNDEgKi8KKworc3RhdGljIGludCBfX2luaXQgdmlkZW9faW5pdChzdHJ1Y3QgaWJtX2luaXRfc3RydWN0ICppaWJtKQoreworCWludCBpdmdhOworCisJdmRiZ19wcmludGsoVFBBQ1BJX0RCR19JTklULCAiaW5pdGlhbGl6aW5nIHZpZGVvIHN1YmRyaXZlclxuIik7CisKKwlJQk1fQUNQSUhBTkRMRV9JTklUKHZpZCk7CisJSUJNX0FDUElIQU5ETEVfSU5JVCh2aWQyKTsKKworCWlmICh2aWQyX2hhbmRsZSAmJiBhY3BpX2V2YWxmKE5VTEwsICZpdmdhLCAiXFxJVkdBIiwgImQiKSAmJiBpdmdhKQorCQkvKiBHNDEsIGFzc3VtZSBJVkdBIGRvZXNuJ3QgY2hhbmdlICovCisJCXZpZF9oYW5kbGUgPSB2aWQyX2hhbmRsZTsKKworCWlmICghdmlkX2hhbmRsZSkKKwkJLyogdmlkZW8gc3dpdGNoaW5nIG5vdCBzdXBwb3J0ZWQgb24gUjMwLCBSMzEgKi8KKwkJdmlkZW9fc3VwcG9ydGVkID0gVFBBQ1BJX1ZJREVPX05PTkU7CisJZWxzZSBpZiAoYWNwaV9ldmFsZih2aWRfaGFuZGxlLCAmdmlkZW9fb3JpZ19hdXRvc3csICJTV0lUIiwgInFkIikpCisJCS8qIDU3MCAqLworCQl2aWRlb19zdXBwb3J0ZWQgPSBUUEFDUElfVklERU9fNTcwOworCWVsc2UgaWYgKGFjcGlfZXZhbGYodmlkX2hhbmRsZSwgJnZpZGVvX29yaWdfYXV0b3N3LCAiXlZBREwiLCAicWQiKSkKKwkJLyogNjAwZS94LCA3NzBlLCA3NzB4ICovCisJCXZpZGVvX3N1cHBvcnRlZCA9IFRQQUNQSV9WSURFT183NzA7CisJZWxzZQorCQkvKiBhbGwgb3RoZXJzICovCisJCXZpZGVvX3N1cHBvcnRlZCA9IFRQQUNQSV9WSURFT19ORVc7CisKKwl2ZGJnX3ByaW50ayhUUEFDUElfREJHX0lOSVQsICJ2aWRlbyBpcyAlcywgbW9kZSAlZFxuIiwKKwkJc3RyX3N1cHBvcnRlZCh2aWRlb19zdXBwb3J0ZWQgIT0gVFBBQ1BJX1ZJREVPX05PTkUpLAorCQl2aWRlb19zdXBwb3J0ZWQpOworCisJcmV0dXJuICh2aWRlb19zdXBwb3J0ZWQgIT0gVFBBQ1BJX1ZJREVPX05PTkUpPyAwIDogMTsKK30KKworc3RhdGljIHZvaWQgdmlkZW9fZXhpdCh2b2lkKQoreworCWRiZ19wcmludGsoVFBBQ1BJX0RCR19FWElULAorCQkgICAicmVzdG9yaW5nIG9yaWdpbmFsIHZpZGVvIGF1dG9zd2l0Y2ggbW9kZVxuIik7CisJaWYgKHZpZGVvX2F1dG9zd19zZXQodmlkZW9fb3JpZ19hdXRvc3cpKQorCQlwcmludGsoSUJNX0VSUiAiZXJyb3Igd2hpbGUgdHJ5aW5nIHRvIHJlc3RvcmUgb3JpZ2luYWwgIgorCQkJInZpZGVvIGF1dG9zd2l0Y2ggbW9kZVxuIik7Cit9CisKK3N0YXRpYyBpbnQgdmlkZW9fb3V0cHV0c3dfZ2V0KHZvaWQpCit7CisJaW50IHN0YXR1cyA9IDA7CisJaW50IGk7CisKKwlzd2l0Y2ggKHZpZGVvX3N1cHBvcnRlZCkgeworCWNhc2UgVFBBQ1BJX1ZJREVPXzU3MDoKKwkJaWYgKCFhY3BpX2V2YWxmKE5VTEwsICZpLCAiXFxfU0IuUEhTIiwgImRkIiwKKwkJCQkgVFBfQUNQSV9WSURFT181NzBfUEhTQ01EKSkKKwkJCXJldHVybiAtRUlPOworCQlzdGF0dXMgPSBpICYgVFBfQUNQSV9WSURFT181NzBfUEhTTUFTSzsKKwkJYnJlYWs7CisJY2FzZSBUUEFDUElfVklERU9fNzcwOgorCQlpZiAoIWFjcGlfZXZhbGYoTlVMTCwgJmksICJcXFZDREwiLCAiZCIpKQorCQkJcmV0dXJuIC1FSU87CisJCWlmIChpKQorCQkJc3RhdHVzIHw9IFRQX0FDUElfVklERU9fU19MQ0Q7CisJCWlmICghYWNwaV9ldmFsZihOVUxMLCAmaSwgIlxcVkNEQyIsICJkIikpCisJCQlyZXR1cm4gLUVJTzsKKwkJaWYgKGkpCisJCQlzdGF0dXMgfD0gVFBfQUNQSV9WSURFT19TX0NSVDsKKwkJYnJlYWs7CisJY2FzZSBUUEFDUElfVklERU9fTkVXOgorCQlpZiAoIWFjcGlfZXZhbGYoTlVMTCwgTlVMTCwgIlxcVlVQUyIsICJ2ZCIsIDEpIHx8CisJCSAgICAhYWNwaV9ldmFsZihOVUxMLCAmaSwgIlxcVkNEQyIsICJkIikpCisJCQlyZXR1cm4gLUVJTzsKKwkJaWYgKGkpCisJCQlzdGF0dXMgfD0gVFBfQUNQSV9WSURFT19TX0NSVDsKKworCQlpZiAoIWFjcGlfZXZhbGYoTlVMTCwgTlVMTCwgIlxcVlVQUyIsICJ2ZCIsIDApIHx8CisJCSAgICAhYWNwaV9ldmFsZihOVUxMLCAmaSwgIlxcVkNETCIsICJkIikpCisJCQlyZXR1cm4gLUVJTzsKKwkJaWYgKGkpCisJCQlzdGF0dXMgfD0gVFBfQUNQSV9WSURFT19TX0xDRDsKKwkJaWYgKCFhY3BpX2V2YWxmKE5VTEwsICZpLCAiXFxWQ0REIiwgImQiKSkKKwkJCXJldHVybiAtRUlPOworCQlpZiAoaSkKKwkJCXN0YXR1cyB8PSBUUF9BQ1BJX1ZJREVPX1NfRFZJOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT1NZUzsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IHZpZGVvX291dHB1dHN3X3NldChpbnQgc3RhdHVzKQoreworCWludCBhdXRvc3c7CisJaW50IHJlcyA9IDA7CisKKwlzd2l0Y2ggKHZpZGVvX3N1cHBvcnRlZCkgeworCWNhc2UgVFBBQ1BJX1ZJREVPXzU3MDoKKwkJcmVzID0gYWNwaV9ldmFsZihOVUxMLCBOVUxMLAorCQkJCSAiXFxfU0IuUEhTMiIsICJ2ZGQiLAorCQkJCSBUUF9BQ1BJX1ZJREVPXzU3MF9QSFMyQ01ELAorCQkJCSBzdGF0dXMgfCBUUF9BQ1BJX1ZJREVPXzU3MF9QSFMyU0VUKTsKKwkJYnJlYWs7CisJY2FzZSBUUEFDUElfVklERU9fNzcwOgorCQlhdXRvc3cgPSB2aWRlb19hdXRvc3dfZ2V0KCk7CisJCWlmIChhdXRvc3cgPCAwKQorCQkJcmV0dXJuIGF1dG9zdzsKKworCQlyZXMgPSB2aWRlb19hdXRvc3dfc2V0KDEpOworCQlpZiAocmVzKQorCQkJcmV0dXJuIHJlczsKKwkJcmVzID0gYWNwaV9ldmFsZih2aWRfaGFuZGxlLCBOVUxMLAorCQkJCSAiQVNXVCIsICJ2ZGQiLCBzdGF0dXMgKiAweDEwMCwgMCk7CisJCWlmICghYXV0b3N3ICYmIHZpZGVvX2F1dG9zd19zZXQoYXV0b3N3KSkgeworCQkJcHJpbnRrKElCTV9FUlIgInZpZGVvIGF1dG8tc3dpdGNoIGxlZnQgZW5hYmxlZCBkdWUgdG8gZXJyb3JcbiIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJYnJlYWs7CisJY2FzZSBUUEFDUElfVklERU9fTkVXOgorCQlyZXMgPSBhY3BpX2V2YWxmKE5VTEwsIE5VTEwsICJcXFZVUFMiLCAidmQiLCAweDgwKSAmJgorCQkJYWNwaV9ldmFsZihOVUxMLCBOVUxMLCAiXFxWU0RTIiwgInZkZCIsIHN0YXR1cywgMSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PU1lTOworCX0KKworCXJldHVybiAocmVzKT8gMCA6IC1FSU87Cit9CisKK3N0YXRpYyBpbnQgdmlkZW9fYXV0b3N3X2dldCh2b2lkKQoreworCWludCBhdXRvc3cgPSAwOworCisJc3dpdGNoICh2aWRlb19zdXBwb3J0ZWQpIHsKKwljYXNlIFRQQUNQSV9WSURFT181NzA6CisJCWlmICghYWNwaV9ldmFsZih2aWRfaGFuZGxlLCAmYXV0b3N3LCAiU1dJVCIsICJkIikpCisJCQlyZXR1cm4gLUVJTzsKKwkJYnJlYWs7CisJY2FzZSBUUEFDUElfVklERU9fNzcwOgorCWNhc2UgVFBBQ1BJX1ZJREVPX05FVzoKKwkJaWYgKCFhY3BpX2V2YWxmKHZpZF9oYW5kbGUsICZhdXRvc3csICJeVkRFRSIsICJkIikpCisJCQlyZXR1cm4gLUVJTzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9TWVM7CisJfQorCisJcmV0dXJuIGF1dG9zdyAmIDE7Cit9CisKK3N0YXRpYyBpbnQgdmlkZW9fYXV0b3N3X3NldChpbnQgZW5hYmxlKQoreworCWlmICghYWNwaV9ldmFsZih2aWRfaGFuZGxlLCBOVUxMLCAiX0RPUyIsICJ2ZCIsIChlbmFibGUpPyAxIDogMCkpCisJCXJldHVybiAtRUlPOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpZGVvX291dHB1dHN3X2N5Y2xlKHZvaWQpCit7CisJaW50IGF1dG9zdyA9IHZpZGVvX2F1dG9zd19nZXQoKTsKKwlpbnQgcmVzOworCisJaWYgKGF1dG9zdyA8IDApCisJCXJldHVybiBhdXRvc3c7CisKKwlzd2l0Y2ggKHZpZGVvX3N1cHBvcnRlZCkgeworCWNhc2UgVFBBQ1BJX1ZJREVPXzU3MDoKKwkJcmVzID0gdmlkZW9fYXV0b3N3X3NldCgxKTsKKwkJaWYgKHJlcykKKwkJCXJldHVybiByZXM7CisJCXJlcyA9IGFjcGlfZXZhbGYoZWNfaGFuZGxlLCBOVUxMLCAiX1ExNiIsICJ2Iik7CisJCWJyZWFrOworCWNhc2UgVFBBQ1BJX1ZJREVPXzc3MDoKKwljYXNlIFRQQUNQSV9WSURFT19ORVc6CisJCXJlcyA9IHZpZGVvX2F1dG9zd19zZXQoMSk7CisJCWlmIChyZXMpCisJCQlyZXR1cm4gcmVzOworCQlyZXMgPSBhY3BpX2V2YWxmKHZpZF9oYW5kbGUsIE5VTEwsICJWU1dUIiwgInYiKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9TWVM7CisJfQorCWlmICghYXV0b3N3ICYmIHZpZGVvX2F1dG9zd19zZXQoYXV0b3N3KSkgeworCQlwcmludGsoSUJNX0VSUiAidmlkZW8gYXV0by1zd2l0Y2ggbGVmdCBlbmFibGVkIGR1ZSB0byBlcnJvclxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCXJldHVybiAocmVzKT8gMCA6IC1FSU87Cit9CisKK3N0YXRpYyBpbnQgdmlkZW9fZXhwYW5kX3RvZ2dsZSh2b2lkKQoreworCXN3aXRjaCAodmlkZW9fc3VwcG9ydGVkKSB7CisJY2FzZSBUUEFDUElfVklERU9fNTcwOgorCQlyZXR1cm4gYWNwaV9ldmFsZihlY19oYW5kbGUsIE5VTEwsICJfUTE3IiwgInYiKT8KKwkJCTAgOiAtRUlPOworCWNhc2UgVFBBQ1BJX1ZJREVPXzc3MDoKKwkJcmV0dXJuIGFjcGlfZXZhbGYodmlkX2hhbmRsZSwgTlVMTCwgIlZFWFAiLCAidiIpPworCQkJMCA6IC1FSU87CisJY2FzZSBUUEFDUElfVklERU9fTkVXOgorCQlyZXR1cm4gYWNwaV9ldmFsZihOVUxMLCBOVUxMLCAiXFxWRVhQIiwgInYiKT8KKwkJCTAgOiAtRUlPOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PU1lTOworCX0KKwkvKiBub3QgcmVhY2hlZCAqLworfQorCitzdGF0aWMgaW50IHZpZGVvX3JlYWQoY2hhciAqcCkKK3sKKwlpbnQgc3RhdHVzLCBhdXRvc3c7CisJaW50IGxlbiA9IDA7CisKKwlpZiAodmlkZW9fc3VwcG9ydGVkID09IFRQQUNQSV9WSURFT19OT05FKSB7CisJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJzdGF0dXM6XHRcdG5vdCBzdXBwb3J0ZWRcbiIpOworCQlyZXR1cm4gbGVuOworCX0KKworCXN0YXR1cyA9IHZpZGVvX291dHB1dHN3X2dldCgpOworCWlmIChzdGF0dXMgPCAwKQorCQlyZXR1cm4gc3RhdHVzOworCisJYXV0b3N3ID0gdmlkZW9fYXV0b3N3X2dldCgpOworCWlmIChhdXRvc3cgPCAwKQorCQlyZXR1cm4gYXV0b3N3OworCisJbGVuICs9IHNwcmludGYocCArIGxlbiwgInN0YXR1czpcdFx0c3VwcG9ydGVkXG4iKTsKKwlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAibGNkOlx0XHQlc1xuIiwgZW5hYmxlZChzdGF0dXMsIDApKTsKKwlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiY3J0Olx0XHQlc1xuIiwgZW5hYmxlZChzdGF0dXMsIDEpKTsKKwlpZiAodmlkZW9fc3VwcG9ydGVkID09IFRQQUNQSV9WSURFT19ORVcpCisJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJkdmk6XHRcdCVzXG4iLCBlbmFibGVkKHN0YXR1cywgMykpOworCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJhdXRvOlx0XHQlc1xuIiwgZW5hYmxlZChhdXRvc3csIDApKTsKKwlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiY29tbWFuZHM6XHRsY2RfZW5hYmxlLCBsY2RfZGlzYWJsZVxuIik7CisJbGVuICs9IHNwcmludGYocCArIGxlbiwgImNvbW1hbmRzOlx0Y3J0X2VuYWJsZSwgY3J0X2Rpc2FibGVcbiIpOworCWlmICh2aWRlb19zdXBwb3J0ZWQgPT0gVFBBQ1BJX1ZJREVPX05FVykKKwkJbGVuICs9IHNwcmludGYocCArIGxlbiwgImNvbW1hbmRzOlx0ZHZpX2VuYWJsZSwgZHZpX2Rpc2FibGVcbiIpOworCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJjb21tYW5kczpcdGF1dG9fZW5hYmxlLCBhdXRvX2Rpc2FibGVcbiIpOworCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJjb21tYW5kczpcdHZpZGVvX3N3aXRjaCwgZXhwYW5kX3RvZ2dsZVxuIik7CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgaW50IHZpZGVvX3dyaXRlKGNoYXIgKmJ1ZikKK3sKKwljaGFyICpjbWQ7CisJaW50IGVuYWJsZSwgZGlzYWJsZSwgc3RhdHVzOworCWludCByZXM7CisKKwlpZiAodmlkZW9fc3VwcG9ydGVkID09IFRQQUNQSV9WSURFT19OT05FKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWVuYWJsZSA9IDA7CisJZGlzYWJsZSA9IDA7CisKKwl3aGlsZSAoKGNtZCA9IG5leHRfY21kKCZidWYpKSkgeworCQlpZiAoc3RybGVuY21wKGNtZCwgImxjZF9lbmFibGUiKSA9PSAwKSB7CisJCQllbmFibGUgfD0gVFBfQUNQSV9WSURFT19TX0xDRDsKKwkJfSBlbHNlIGlmIChzdHJsZW5jbXAoY21kLCAibGNkX2Rpc2FibGUiKSA9PSAwKSB7CisJCQlkaXNhYmxlIHw9IFRQX0FDUElfVklERU9fU19MQ0Q7CisJCX0gZWxzZSBpZiAoc3RybGVuY21wKGNtZCwgImNydF9lbmFibGUiKSA9PSAwKSB7CisJCQllbmFibGUgfD0gVFBfQUNQSV9WSURFT19TX0NSVDsKKwkJfSBlbHNlIGlmIChzdHJsZW5jbXAoY21kLCAiY3J0X2Rpc2FibGUiKSA9PSAwKSB7CisJCQlkaXNhYmxlIHw9IFRQX0FDUElfVklERU9fU19DUlQ7CisJCX0gZWxzZSBpZiAodmlkZW9fc3VwcG9ydGVkID09IFRQQUNQSV9WSURFT19ORVcgJiYKKwkJCSAgIHN0cmxlbmNtcChjbWQsICJkdmlfZW5hYmxlIikgPT0gMCkgeworCQkJZW5hYmxlIHw9IFRQX0FDUElfVklERU9fU19EVkk7CisJCX0gZWxzZSBpZiAodmlkZW9fc3VwcG9ydGVkID09IFRQQUNQSV9WSURFT19ORVcgJiYKKwkJCSAgIHN0cmxlbmNtcChjbWQsICJkdmlfZGlzYWJsZSIpID09IDApIHsKKwkJCWRpc2FibGUgfD0gVFBfQUNQSV9WSURFT19TX0RWSTsKKwkJfSBlbHNlIGlmIChzdHJsZW5jbXAoY21kLCAiYXV0b19lbmFibGUiKSA9PSAwKSB7CisJCQlyZXMgPSB2aWRlb19hdXRvc3dfc2V0KDEpOworCQkJaWYgKHJlcykKKwkJCQlyZXR1cm4gcmVzOworCQl9IGVsc2UgaWYgKHN0cmxlbmNtcChjbWQsICJhdXRvX2Rpc2FibGUiKSA9PSAwKSB7CisJCQlyZXMgPSB2aWRlb19hdXRvc3dfc2V0KDApOworCQkJaWYgKHJlcykKKwkJCQlyZXR1cm4gcmVzOworCQl9IGVsc2UgaWYgKHN0cmxlbmNtcChjbWQsICJ2aWRlb19zd2l0Y2giKSA9PSAwKSB7CisJCQlyZXMgPSB2aWRlb19vdXRwdXRzd19jeWNsZSgpOworCQkJaWYgKHJlcykKKwkJCQlyZXR1cm4gcmVzOworCQl9IGVsc2UgaWYgKHN0cmxlbmNtcChjbWQsICJleHBhbmRfdG9nZ2xlIikgPT0gMCkgeworCQkJcmVzID0gdmlkZW9fZXhwYW5kX3RvZ2dsZSgpOworCQkJaWYgKHJlcykKKwkJCQlyZXR1cm4gcmVzOworCQl9IGVsc2UKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChlbmFibGUgfHwgZGlzYWJsZSkgeworCQlzdGF0dXMgPSB2aWRlb19vdXRwdXRzd19nZXQoKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlyZXR1cm4gc3RhdHVzOworCQlyZXMgPSB2aWRlb19vdXRwdXRzd19zZXQoKHN0YXR1cyAmIH5kaXNhYmxlKSB8IGVuYWJsZSk7CisJCWlmIChyZXMpCisJCQlyZXR1cm4gcmVzOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGlibV9zdHJ1Y3QgdmlkZW9fZHJpdmVyX2RhdGEgPSB7CisJLm5hbWUgPSAidmlkZW8iLAorCS5yZWFkID0gdmlkZW9fcmVhZCwKKwkud3JpdGUgPSB2aWRlb193cml0ZSwKKwkuZXhpdCA9IHZpZGVvX2V4aXQsCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTGlnaHQgKHRoaW5rbGlnaHQpIHN1YmRyaXZlcgorICovCisKK0lCTV9IQU5ETEUobGdodCwgcm9vdCwgIlxcTEdIVCIpOwkvKiBBMjFlLCBBMnhtL3AsIFQyMC0yMiwgWDIwLTIxICovCitJQk1fSEFORExFKGxlZGIsIGVjLCAiTEVEQiIpOwkJLyogRzR4ICovCisKK3N0YXRpYyBpbnQgX19pbml0IGxpZ2h0X2luaXQoc3RydWN0IGlibV9pbml0X3N0cnVjdCAqaWlibSkKK3sKKwl2ZGJnX3ByaW50ayhUUEFDUElfREJHX0lOSVQsICJpbml0aWFsaXppbmcgbGlnaHQgc3ViZHJpdmVyXG4iKTsKKworCUlCTV9BQ1BJSEFORExFX0lOSVQobGVkYik7CisJSUJNX0FDUElIQU5ETEVfSU5JVChsZ2h0KTsKKwlJQk1fQUNQSUhBTkRMRV9JTklUKGNtb3MpOworCisJLyogbGlnaHQgbm90IHN1cHBvcnRlZCBvbiA1NzAsIDYwMGUveCwgNzcwZSwgNzcweCwgRzR4LCBSMzAsIFIzMSAqLworCXRwX2ZlYXR1cmVzLmxpZ2h0ID0gKGNtb3NfaGFuZGxlIHx8IGxnaHRfaGFuZGxlKSAmJiAhbGVkYl9oYW5kbGU7CisKKwlpZiAodHBfZmVhdHVyZXMubGlnaHQpCisJCS8qIGxpZ2h0IHN0YXR1cyBub3Qgc3VwcG9ydGVkIG9uCisJCSAgIDU3MCwgNjAwZS94LCA3NzBlLCA3NzB4LCBHNHgsIFIzMCwgUjMxLCBSMzIsIFgyMCAqLworCQl0cF9mZWF0dXJlcy5saWdodF9zdGF0dXMgPQorCQkJYWNwaV9ldmFsZihlY19oYW5kbGUsIE5VTEwsICJLQkxUIiwgInF2Iik7CisKKwl2ZGJnX3ByaW50ayhUUEFDUElfREJHX0lOSVQsICJsaWdodCBpcyAlc1xuIiwKKwkJc3RyX3N1cHBvcnRlZCh0cF9mZWF0dXJlcy5saWdodCkpOworCisJcmV0dXJuICh0cF9mZWF0dXJlcy5saWdodCk/IDAgOiAxOworfQorCitzdGF0aWMgaW50IGxpZ2h0X3JlYWQoY2hhciAqcCkKK3sKKwlpbnQgbGVuID0gMDsKKwlpbnQgc3RhdHVzID0gMDsKKworCWlmICghdHBfZmVhdHVyZXMubGlnaHQpIHsKKwkJbGVuICs9IHNwcmludGYocCArIGxlbiwgInN0YXR1czpcdFx0bm90IHN1cHBvcnRlZFxuIik7CisJfSBlbHNlIGlmICghdHBfZmVhdHVyZXMubGlnaHRfc3RhdHVzKSB7CisJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJzdGF0dXM6XHRcdHVua25vd25cbiIpOworCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiY29tbWFuZHM6XHRvbiwgb2ZmXG4iKTsKKwl9IGVsc2UgeworCQlpZiAoIWFjcGlfZXZhbGYoZWNfaGFuZGxlLCAmc3RhdHVzLCAiS0JMVCIsICJkIikpCisJCQlyZXR1cm4gLUVJTzsKKwkJbGVuICs9IHNwcmludGYocCArIGxlbiwgInN0YXR1czpcdFx0JXNcbiIsIG9ub2ZmKHN0YXR1cywgMCkpOworCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiY29tbWFuZHM6XHRvbiwgb2ZmXG4iKTsKKwl9CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgaW50IGxpZ2h0X3dyaXRlKGNoYXIgKmJ1ZikKK3sKKwlpbnQgY21vc19jbWQsIGxnaHRfY21kOworCWNoYXIgKmNtZDsKKwlpbnQgc3VjY2VzczsKKworCWlmICghdHBfZmVhdHVyZXMubGlnaHQpCisJCXJldHVybiAtRU5PREVWOworCisJd2hpbGUgKChjbWQgPSBuZXh0X2NtZCgmYnVmKSkpIHsKKwkJaWYgKHN0cmxlbmNtcChjbWQsICJvbiIpID09IDApIHsKKwkJCWNtb3NfY21kID0gMHgwYzsKKwkJCWxnaHRfY21kID0gMTsKKwkJfSBlbHNlIGlmIChzdHJsZW5jbXAoY21kLCAib2ZmIikgPT0gMCkgeworCQkJY21vc19jbWQgPSAweDBkOworCQkJbGdodF9jbWQgPSAwOworCQl9IGVsc2UKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXN1Y2Nlc3MgPSBjbW9zX2hhbmRsZSA/CisJCSAgICBhY3BpX2V2YWxmKGNtb3NfaGFuZGxlLCBOVUxMLCBOVUxMLCAidmQiLCBjbW9zX2NtZCkgOgorCQkgICAgYWNwaV9ldmFsZihsZ2h0X2hhbmRsZSwgTlVMTCwgTlVMTCwgInZkIiwgbGdodF9jbWQpOworCQlpZiAoIXN1Y2Nlc3MpCisJCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBpYm1fc3RydWN0IGxpZ2h0X2RyaXZlcl9kYXRhID0geworCS5uYW1lID0gImxpZ2h0IiwKKwkucmVhZCA9IGxpZ2h0X3JlYWQsCisJLndyaXRlID0gbGlnaHRfd3JpdGUsCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRG9jayBzdWJkcml2ZXIKKyAqLworCisjaWZkZWYgQ09ORklHX1RISU5LUEFEX0FDUElfRE9DSworCitJQk1fSEFORExFKGRvY2ssIHJvb3QsICJcXF9TQi5HRENLIiwJLyogWDMwLCBYMzEsIFg0MCAqLworCSAgICJcXF9TQi5QQ0kwLkRPQ0siLAkvKiA2MDBlL3gsNzcwZSw3NzB4LEEyeG0vcCxUMjAtMjIsWDIwLTIxICovCisJICAgIlxcX1NCLlBDSTAuUENJMS5ET0NLIiwJLyogYWxsIG90aGVycyAqLworCSAgICJcXF9TQi5QQ0kuSVNBLlNMQ0UiLAkvKiA1NzAgKi8KKyAgICApOwkJCQkvKiBBMjFlLEc0eCxSMzAsUjMxLFIzMixSNDAsUjQwZSxSNTBlICovCisKKy8qIGRvbid0IGxpc3Qgb3RoZXIgYWx0ZXJuYXRpdmVzIGFzIHdlIGluc3RhbGwgYSBub3RpZnkgaGFuZGxlciBvbiB0aGUgNTcwICovCitJQk1fSEFORExFKHBjaSwgcm9vdCwgIlxcX1NCLlBDSSIpOwkvKiA1NzAgKi8KKworc3RhdGljIHN0cnVjdCB0cF9hY3BpX2Rydl9zdHJ1Y3QgaWJtX2RvY2tfYWNwaWRyaXZlclsyXSA9IHsKKwl7CisJIC5ub3RpZnkgPSBkb2NrX25vdGlmeSwKKwkgLmhhbmRsZSA9ICZkb2NrX2hhbmRsZSwKKwkgLnR5cGUgPSBBQ1BJX1NZU1RFTV9OT1RJRlksCisJfSwKKwl7CisJIC5oaWQgPSBJQk1fUENJX0hJRCwKKwkgLm5vdGlmeSA9IGRvY2tfbm90aWZ5LAorCSAuaGFuZGxlID0gJnBjaV9oYW5kbGUsCisJIC50eXBlID0gQUNQSV9TWVNURU1fTk9USUZZLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGlibV9zdHJ1Y3QgZG9ja19kcml2ZXJfZGF0YVsyXSA9IHsKKwl7CisJIC5uYW1lID0gImRvY2siLAorCSAucmVhZCA9IGRvY2tfcmVhZCwKKwkgLndyaXRlID0gZG9ja193cml0ZSwKKwkgLmFjcGkgPSAmaWJtX2RvY2tfYWNwaWRyaXZlclswXSwKKwl9LAorCXsKKwkgLm5hbWUgPSAiZG9jayIsCisJIC5hY3BpID0gJmlibV9kb2NrX2FjcGlkcml2ZXJbMV0sCisJfSwKK307CisKKyNkZWZpbmUgZG9ja19kb2NrZWQoKSAoX3N0YShkb2NrX2hhbmRsZSkgJiAxKQorCitzdGF0aWMgaW50IF9faW5pdCBkb2NrX2luaXQoc3RydWN0IGlibV9pbml0X3N0cnVjdCAqaWlibSkKK3sKKwl2ZGJnX3ByaW50ayhUUEFDUElfREJHX0lOSVQsICJpbml0aWFsaXppbmcgZG9jayBzdWJkcml2ZXJcbiIpOworCisJSUJNX0FDUElIQU5ETEVfSU5JVChkb2NrKTsKKworCXZkYmdfcHJpbnRrKFRQQUNQSV9EQkdfSU5JVCwgImRvY2sgaXMgJXNcbiIsCisJCXN0cl9zdXBwb3J0ZWQoZG9ja19oYW5kbGUgIT0gTlVMTCkpOworCisJcmV0dXJuIChkb2NrX2hhbmRsZSk/IDAgOiAxOworfQorCitzdGF0aWMgaW50IF9faW5pdCBkb2NrX2luaXQyKHN0cnVjdCBpYm1faW5pdF9zdHJ1Y3QgKmlpYm0pCit7CisJaW50IGRvY2syX25lZWRlZDsKKworCXZkYmdfcHJpbnRrKFRQQUNQSV9EQkdfSU5JVCwgImluaXRpYWxpemluZyBkb2NrIHN1YmRyaXZlciBwYXJ0IDJcbiIpOworCisJaWYgKGRvY2tfZHJpdmVyX2RhdGFbMF0uZmxhZ3MuYWNwaV9kcml2ZXJfcmVnaXN0ZXJlZCAmJgorCSAgICBkb2NrX2RyaXZlcl9kYXRhWzBdLmZsYWdzLmFjcGlfbm90aWZ5X2luc3RhbGxlZCkgeworCQlJQk1fQUNQSUhBTkRMRV9JTklUKHBjaSk7CisJCWRvY2syX25lZWRlZCA9IChwY2lfaGFuZGxlICE9IE5VTEwpOworCQl2ZGJnX3ByaW50ayhUUEFDUElfREJHX0lOSVQsCisJCQkgICAgImRvY2sgUENJIGhhbmRsZXIgZm9yIHRoZSBUUCA1NzAgaXMgJXNcbiIsCisJCQkgICAgc3RyX3N1cHBvcnRlZChkb2NrMl9uZWVkZWQpKTsKKwl9IGVsc2UgeworCQl2ZGJnX3ByaW50ayhUUEFDUElfREJHX0lOSVQsCisJCSJkb2NrIHN1YmRyaXZlciBwYXJ0IDIgbm90IHJlcXVpcmVkXG4iKTsKKwkJZG9jazJfbmVlZGVkID0gMDsKKwl9CisKKwlyZXR1cm4gKGRvY2syX25lZWRlZCk/IDAgOiAxOworfQorCitzdGF0aWMgdm9pZCBkb2NrX25vdGlmeShzdHJ1Y3QgaWJtX3N0cnVjdCAqaWJtLCB1MzIgZXZlbnQpCit7CisJaW50IGRvY2tlZCA9IGRvY2tfZG9ja2VkKCk7CisJaW50IHBjaSA9IGlibS0+YWNwaS0+aGlkICYmIHN0cnN0cihpYm0tPmFjcGktPmhpZCwgSUJNX1BDSV9ISUQpOworCisJaWYgKGV2ZW50ID09IDEgJiYgIXBjaSkJLyogNTcwICovCisJCWFjcGlfYnVzX2dlbmVyYXRlX2V2ZW50KGlibS0+YWNwaS0+ZGV2aWNlLCBldmVudCwgMSk7CS8qIGJ1dHRvbiAqLworCWVsc2UgaWYgKGV2ZW50ID09IDEgJiYgcGNpKQkvKiA1NzAgKi8KKwkJYWNwaV9idXNfZ2VuZXJhdGVfZXZlbnQoaWJtLT5hY3BpLT5kZXZpY2UsIGV2ZW50LCAzKTsJLyogZG9jayAqLworCWVsc2UgaWYgKGV2ZW50ID09IDMgJiYgZG9ja2VkKQorCQlhY3BpX2J1c19nZW5lcmF0ZV9ldmVudChpYm0tPmFjcGktPmRldmljZSwgZXZlbnQsIDEpOwkvKiBidXR0b24gKi8KKwllbHNlIGlmIChldmVudCA9PSAzICYmICFkb2NrZWQpCisJCWFjcGlfYnVzX2dlbmVyYXRlX2V2ZW50KGlibS0+YWNwaS0+ZGV2aWNlLCBldmVudCwgMik7CS8qIHVuZG9jayAqLworCWVsc2UgaWYgKGV2ZW50ID09IDAgJiYgZG9ja2VkKQorCQlhY3BpX2J1c19nZW5lcmF0ZV9ldmVudChpYm0tPmFjcGktPmRldmljZSwgZXZlbnQsIDMpOwkvKiBkb2NrICovCisJZWxzZSB7CisJCXByaW50ayhJQk1fRVJSICJ1bmtub3duIGRvY2sgZXZlbnQgJWQsIHN0YXR1cyAlZFxuIiwKKwkJICAgICAgIGV2ZW50LCBfc3RhKGRvY2tfaGFuZGxlKSk7CisJCWFjcGlfYnVzX2dlbmVyYXRlX2V2ZW50KGlibS0+YWNwaS0+ZGV2aWNlLCBldmVudCwgMCk7CS8qIHVua25vd24gKi8KKwl9Cit9CisKK3N0YXRpYyBpbnQgZG9ja19yZWFkKGNoYXIgKnApCit7CisJaW50IGxlbiA9IDA7CisJaW50IGRvY2tlZCA9IGRvY2tfZG9ja2VkKCk7CisKKwlpZiAoIWRvY2tfaGFuZGxlKQorCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAic3RhdHVzOlx0XHRub3Qgc3VwcG9ydGVkXG4iKTsKKwllbHNlIGlmICghZG9ja2VkKQorCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAic3RhdHVzOlx0XHR1bmRvY2tlZFxuIik7CisJZWxzZSB7CisJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJzdGF0dXM6XHRcdGRvY2tlZFxuIik7CisJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJjb21tYW5kczpcdGRvY2ssIHVuZG9ja1xuIik7CisJfQorCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIGludCBkb2NrX3dyaXRlKGNoYXIgKmJ1ZikKK3sKKwljaGFyICpjbWQ7CisKKwlpZiAoIWRvY2tfZG9ja2VkKCkpCisJCXJldHVybiAtRU5PREVWOworCisJd2hpbGUgKChjbWQgPSBuZXh0X2NtZCgmYnVmKSkpIHsKKwkJaWYgKHN0cmxlbmNtcChjbWQsICJ1bmRvY2siKSA9PSAwKSB7CisJCQlpZiAoIWFjcGlfZXZhbGYoZG9ja19oYW5kbGUsIE5VTEwsICJfRENLIiwgInZkIiwgMCkgfHwKKwkJCSAgICAhYWNwaV9ldmFsZihkb2NrX2hhbmRsZSwgTlVMTCwgIl9FSjAiLCAidmQiLCAxKSkKKwkJCQlyZXR1cm4gLUVJTzsKKwkJfSBlbHNlIGlmIChzdHJsZW5jbXAoY21kLCAiZG9jayIpID09IDApIHsKKwkJCWlmICghYWNwaV9ldmFsZihkb2NrX2hhbmRsZSwgTlVMTCwgIl9EQ0siLCAidmQiLCAxKSkKKwkJCQlyZXR1cm4gLUVJTzsKKwkJfSBlbHNlCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIENPTkZJR19USElOS1BBRF9BQ1BJX0RPQ0sgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEJheSBzdWJkcml2ZXIKKyAqLworCisjaWZkZWYgQ09ORklHX1RISU5LUEFEX0FDUElfQkFZCitJQk1fSEFORExFKGJheSwgcm9vdCwgIlxcX1NCLlBDSS5JREUuU0VDTi5NQVNUIiwJLyogNTcwICovCisJICAgIlxcX1NCLlBDSTAuSURFMC5JREVTLklEU00iLAkvKiA2MDBlL3gsIDc3MGUsIDc3MHggKi8KKwkgICAiXFxfU0IuUENJMC5TQVRBLlNDTkQuTVNUUiIsCS8qIFQ2MCwgWDYwLCBaNjAgKi8KKwkgICAiXFxfU0IuUENJMC5JREUwLlNDTkQuTVNUUiIsCS8qIGFsbCBvdGhlcnMgKi8KKwkgICApOwkJCQkvKiBBMjFlLCBSMzAsIFIzMSAqLworSUJNX0hBTkRMRShiYXlfZWosIGJheSwgIl9FSjMiLAkvKiA2MDBlL3gsIEEyeG0vcCwgQTN4ICovCisJICAgIl9FSjAiLAkJLyogYWxsIG90aGVycyAqLworCSAgICk7CQkJLyogNTcwLEEyMWUsRzR4LFIzMCxSMzEsUjMyLFI0MGUsUjUwZSAqLworSUJNX0hBTkRMRShiYXkyLCByb290LCAiXFxfU0IuUENJMC5JREUwLlBSSU0uU0xBViIsCS8qIEEzeCwgUjMyICovCisJICAgIlxcX1NCLlBDSTAuSURFMC5JREVQLklEUFMiLAkvKiA2MDBlL3gsIDc3MGUsIDc3MHggKi8KKwkgICApOwkJCQkvKiBhbGwgb3RoZXJzICovCitJQk1fSEFORExFKGJheTJfZWosIGJheTIsICJfRUozIiwJLyogNjAwZS94LCA3NzBlLCBBM3ggKi8KKwkgICAiX0VKMCIsCQkJLyogNzcweCAqLworCSAgICk7CQkJCS8qIGFsbCBvdGhlcnMgKi8KKworc3RhdGljIGludCBfX2luaXQgYmF5X2luaXQoc3RydWN0IGlibV9pbml0X3N0cnVjdCAqaWlibSkKK3sKKwl2ZGJnX3ByaW50ayhUUEFDUElfREJHX0lOSVQsICJpbml0aWFsaXppbmcgYmF5IHN1YmRyaXZlclxuIik7CisKKwlJQk1fQUNQSUhBTkRMRV9JTklUKGJheSk7CisJaWYgKGJheV9oYW5kbGUpCisJCUlCTV9BQ1BJSEFORExFX0lOSVQoYmF5X2VqKTsKKwlJQk1fQUNQSUhBTkRMRV9JTklUKGJheTIpOworCWlmIChiYXkyX2hhbmRsZSkKKwkJSUJNX0FDUElIQU5ETEVfSU5JVChiYXkyX2VqKTsKKworCXRwX2ZlYXR1cmVzLmJheV9zdGF0dXMgPSBiYXlfaGFuZGxlICYmCisJCWFjcGlfZXZhbGYoYmF5X2hhbmRsZSwgTlVMTCwgIl9TVEEiLCAicXYiKTsKKwl0cF9mZWF0dXJlcy5iYXlfc3RhdHVzMiA9IGJheTJfaGFuZGxlICYmCisJCWFjcGlfZXZhbGYoYmF5Ml9oYW5kbGUsIE5VTEwsICJfU1RBIiwgInF2Iik7CisKKwl0cF9mZWF0dXJlcy5iYXlfZWplY3QgPSBiYXlfaGFuZGxlICYmIGJheV9lal9oYW5kbGUgJiYKKwkJKHN0cmxlbmNtcChiYXlfZWpfcGF0aCwgIl9FSjAiKSA9PSAwIHx8IGV4cGVyaW1lbnRhbCk7CisJdHBfZmVhdHVyZXMuYmF5X2VqZWN0MiA9IGJheTJfaGFuZGxlICYmIGJheTJfZWpfaGFuZGxlICYmCisJCShzdHJsZW5jbXAoYmF5Ml9lal9wYXRoLCAiX0VKMCIpID09IDAgfHwgZXhwZXJpbWVudGFsKTsKKworCXZkYmdfcHJpbnRrKFRQQUNQSV9EQkdfSU5JVCwKKwkJImJheSAxOiBzdGF0dXMgJXMsIGVqZWN0ICVzOyBiYXkgMjogc3RhdHVzICVzLCBlamVjdCAlc1xuIiwKKwkJc3RyX3N1cHBvcnRlZCh0cF9mZWF0dXJlcy5iYXlfc3RhdHVzKSwKKwkJc3RyX3N1cHBvcnRlZCh0cF9mZWF0dXJlcy5iYXlfZWplY3QpLAorCQlzdHJfc3VwcG9ydGVkKHRwX2ZlYXR1cmVzLmJheV9zdGF0dXMyKSwKKwkJc3RyX3N1cHBvcnRlZCh0cF9mZWF0dXJlcy5iYXlfZWplY3QyKSk7CisKKwlyZXR1cm4gKHRwX2ZlYXR1cmVzLmJheV9zdGF0dXMgfHwgdHBfZmVhdHVyZXMuYmF5X2VqZWN0IHx8CisJCXRwX2ZlYXR1cmVzLmJheV9zdGF0dXMyIHx8IHRwX2ZlYXR1cmVzLmJheV9lamVjdDIpPyAwIDogMTsKK30KKworc3RhdGljIHZvaWQgYmF5X25vdGlmeShzdHJ1Y3QgaWJtX3N0cnVjdCAqaWJtLCB1MzIgZXZlbnQpCit7CisJYWNwaV9idXNfZ2VuZXJhdGVfZXZlbnQoaWJtLT5hY3BpLT5kZXZpY2UsIGV2ZW50LCAwKTsKK30KKworI2RlZmluZSBiYXlfb2NjdXBpZWQoYikgKF9zdGEoYiMjX2hhbmRsZSkgJiAxKQorCitzdGF0aWMgaW50IGJheV9yZWFkKGNoYXIgKnApCit7CisJaW50IGxlbiA9IDA7CisJaW50IG9jY3VwaWVkID0gYmF5X29jY3VwaWVkKGJheSk7CisJaW50IG9jY3VwaWVkMiA9IGJheV9vY2N1cGllZChiYXkyKTsKKwlpbnQgZWplY3QsIGVqZWN0MjsKKworCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJzdGF0dXM6XHRcdCVzXG4iLAorCQl0cF9mZWF0dXJlcy5iYXlfc3RhdHVzID8KKwkJCShvY2N1cGllZCA/ICJvY2N1cGllZCIgOiAidW5vY2N1cGllZCIpIDoKKwkJCQkibm90IHN1cHBvcnRlZCIpOworCWlmICh0cF9mZWF0dXJlcy5iYXlfc3RhdHVzMikKKwkJbGVuICs9IHNwcmludGYocCArIGxlbiwgInN0YXR1czI6XHQlc1xuIiwgb2NjdXBpZWQyID8KKwkJCSAgICAgICAib2NjdXBpZWQiIDogInVub2NjdXBpZWQiKTsKKworCWVqZWN0ID0gdHBfZmVhdHVyZXMuYmF5X2VqZWN0ICYmIG9jY3VwaWVkOworCWVqZWN0MiA9IHRwX2ZlYXR1cmVzLmJheV9lamVjdDIgJiYgb2NjdXBpZWQyOworCisJaWYgKGVqZWN0ICYmIGVqZWN0MikKKwkJbGVuICs9IHNwcmludGYocCArIGxlbiwgImNvbW1hbmRzOlx0ZWplY3QsIGVqZWN0MlxuIik7CisJZWxzZSBpZiAoZWplY3QpCisJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJjb21tYW5kczpcdGVqZWN0XG4iKTsKKwllbHNlIGlmIChlamVjdDIpCisJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJjb21tYW5kczpcdGVqZWN0MlxuIik7CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgaW50IGJheV93cml0ZShjaGFyICpidWYpCit7CisJY2hhciAqY21kOworCisJaWYgKCF0cF9mZWF0dXJlcy5iYXlfZWplY3QgJiYgIXRwX2ZlYXR1cmVzLmJheV9lamVjdDIpCisJCXJldHVybiAtRU5PREVWOworCisJd2hpbGUgKChjbWQgPSBuZXh0X2NtZCgmYnVmKSkpIHsKKwkJaWYgKHRwX2ZlYXR1cmVzLmJheV9lamVjdCAmJiBzdHJsZW5jbXAoY21kLCAiZWplY3QiKSA9PSAwKSB7CisJCQlpZiAoIWFjcGlfZXZhbGYoYmF5X2VqX2hhbmRsZSwgTlVMTCwgTlVMTCwgInZkIiwgMSkpCisJCQkJcmV0dXJuIC1FSU87CisJCX0gZWxzZSBpZiAodHBfZmVhdHVyZXMuYmF5X2VqZWN0MiAmJgorCQkJICAgc3RybGVuY21wKGNtZCwgImVqZWN0MiIpID09IDApIHsKKwkJCWlmICghYWNwaV9ldmFsZihiYXkyX2VqX2hhbmRsZSwgTlVMTCwgTlVMTCwgInZkIiwgMSkpCisJCQkJcmV0dXJuIC1FSU87CisJCX0gZWxzZQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdHBfYWNwaV9kcnZfc3RydWN0IGlibV9iYXlfYWNwaWRyaXZlciA9IHsKKwkubm90aWZ5ID0gYmF5X25vdGlmeSwKKwkuaGFuZGxlID0gJmJheV9oYW5kbGUsCisJLnR5cGUgPSBBQ1BJX1NZU1RFTV9OT1RJRlksCit9OworCitzdGF0aWMgc3RydWN0IGlibV9zdHJ1Y3QgYmF5X2RyaXZlcl9kYXRhID0geworCS5uYW1lID0gImJheSIsCisJLnJlYWQgPSBiYXlfcmVhZCwKKwkud3JpdGUgPSBiYXlfd3JpdGUsCisJLmFjcGkgPSAmaWJtX2JheV9hY3BpZHJpdmVyLAorfTsKKworI2VuZGlmIC8qIENPTkZJR19USElOS1BBRF9BQ1BJX0JBWSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ01PUyBzdWJkcml2ZXIKKyAqLworCisvKiBzeXNmcyBjbW9zX2NvbW1hbmQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBzc2l6ZV90IGNtb3NfY29tbWFuZF9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJdW5zaWduZWQgbG9uZyBjbW9zX2NtZDsKKwlpbnQgcmVzOworCisJaWYgKHBhcnNlX3N0cnRvdWwoYnVmLCAyMSwgJmNtb3NfY21kKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXMgPSBpc3N1ZV90aGlua3BhZF9jbW9zX2NvbW1hbmQoY21vc19jbWQpOworCXJldHVybiAocmVzKT8gcmVzIDogY291bnQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBkZXZfYXR0cl9jbW9zX2NvbW1hbmQgPQorCV9fQVRUUihjbW9zX2NvbW1hbmQsIFNfSVdVU1IsIE5VTEwsIGNtb3NfY29tbWFuZF9zdG9yZSk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IF9faW5pdCBjbW9zX2luaXQoc3RydWN0IGlibV9pbml0X3N0cnVjdCAqaWlibSkKK3sKKwlpbnQgcmVzOworCisJdmRiZ19wcmludGsoVFBBQ1BJX0RCR19JTklULAorCQkiaW5pdGlhbGl6aW5nIGNtb3MgY29tbWFuZHMgc3ViZHJpdmVyXG4iKTsKKworCUlCTV9BQ1BJSEFORExFX0lOSVQoY21vcyk7CisKKwl2ZGJnX3ByaW50ayhUUEFDUElfREJHX0lOSVQsICJjbW9zIGNvbW1hbmRzIGFyZSAlc1xuIiwKKwkJc3RyX3N1cHBvcnRlZChjbW9zX2hhbmRsZSAhPSBOVUxMKSk7CisKKwlyZXMgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnRwYWNwaV9wZGV2LT5kZXYsICZkZXZfYXR0cl9jbW9zX2NvbW1hbmQpOworCWlmIChyZXMpCisJCXJldHVybiByZXM7CisKKwlyZXR1cm4gKGNtb3NfaGFuZGxlKT8gMCA6IDE7Cit9CisKK3N0YXRpYyB2b2lkIGNtb3NfZXhpdCh2b2lkKQoreworCWRldmljZV9yZW1vdmVfZmlsZSgmdHBhY3BpX3BkZXYtPmRldiwgJmRldl9hdHRyX2Ntb3NfY29tbWFuZCk7Cit9CisKK3N0YXRpYyBpbnQgY21vc19yZWFkKGNoYXIgKnApCit7CisJaW50IGxlbiA9IDA7CisKKwkvKiBjbW9zIG5vdCBzdXBwb3J0ZWQgb24gNTcwLCA2MDBlL3gsIDc3MGUsIDc3MHgsIEEyMWUsIEEyeG0vcCwKKwkgICBSMzAsIFIzMSwgVDIwLTIyLCBYMjAtMjEgKi8KKwlpZiAoIWNtb3NfaGFuZGxlKQorCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAic3RhdHVzOlx0XHRub3Qgc3VwcG9ydGVkXG4iKTsKKwllbHNlIHsKKwkJbGVuICs9IHNwcmludGYocCArIGxlbiwgInN0YXR1czpcdFx0c3VwcG9ydGVkXG4iKTsKKwkJbGVuICs9IHNwcmludGYocCArIGxlbiwgImNvbW1hbmRzOlx0PGNtZD4gKDxjbWQ+IGlzIDAtMjEpXG4iKTsKKwl9CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgaW50IGNtb3Nfd3JpdGUoY2hhciAqYnVmKQoreworCWNoYXIgKmNtZDsKKwlpbnQgY21vc19jbWQsIHJlczsKKworCXdoaWxlICgoY21kID0gbmV4dF9jbWQoJmJ1ZikpKSB7CisJCWlmIChzc2NhbmYoY21kLCAiJXUiLCAmY21vc19jbWQpID09IDEgJiYKKwkJICAgIGNtb3NfY21kID49IDAgJiYgY21vc19jbWQgPD0gMjEpIHsKKwkJCS8qIGNtb3NfY21kIHNldCAqLworCQl9IGVsc2UKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXJlcyA9IGlzc3VlX3RoaW5rcGFkX2Ntb3NfY29tbWFuZChjbW9zX2NtZCk7CisJCWlmIChyZXMpCisJCQlyZXR1cm4gcmVzOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGlibV9zdHJ1Y3QgY21vc19kcml2ZXJfZGF0YSA9IHsKKwkubmFtZSA9ICJjbW9zIiwKKwkucmVhZCA9IGNtb3NfcmVhZCwKKwkud3JpdGUgPSBjbW9zX3dyaXRlLAorCS5leGl0ID0gY21vc19leGl0LAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIExFRCBzdWJkcml2ZXIKKyAqLworCitzdGF0aWMgZW51bSBsZWRfYWNjZXNzX21vZGUgbGVkX3N1cHBvcnRlZDsKKworSUJNX0hBTkRMRShsZWQsIGVjLCAiU0xFRCIsCS8qIDU3MCAqLworCSAgICJTWVNMIiwJCS8qIDYwMGUveCwgNzcwZSwgNzcweCwgQTIxZSwgQTJ4bS9wLCBUMjAtMjIsIFgyMC0yMSAqLworCSAgICJMRUQiLAkJLyogYWxsIG90aGVycyAqLworCSAgICk7CQkJLyogUjMwLCBSMzEgKi8KKworc3RhdGljIGludCBfX2luaXQgbGVkX2luaXQoc3RydWN0IGlibV9pbml0X3N0cnVjdCAqaWlibSkKK3sKKwl2ZGJnX3ByaW50ayhUUEFDUElfREJHX0lOSVQsICJpbml0aWFsaXppbmcgTEVEIHN1YmRyaXZlclxuIik7CisKKwlJQk1fQUNQSUhBTkRMRV9JTklUKGxlZCk7CisKKwlpZiAoIWxlZF9oYW5kbGUpCisJCS8qIGxlZCBub3Qgc3VwcG9ydGVkIG9uIFIzMCwgUjMxICovCisJCWxlZF9zdXBwb3J0ZWQgPSBUUEFDUElfTEVEX05PTkU7CisJZWxzZSBpZiAoc3RybGVuY21wKGxlZF9wYXRoLCAiU0xFRCIpID09IDApCisJCS8qIDU3MCAqLworCQlsZWRfc3VwcG9ydGVkID0gVFBBQ1BJX0xFRF81NzA7CisJZWxzZSBpZiAoc3RybGVuY21wKGxlZF9wYXRoLCAiU1lTTCIpID09IDApCisJCS8qIDYwMGUveCwgNzcwZSwgNzcweCwgQTIxZSwgQTJ4bS9wLCBUMjAtMjIsIFgyMC0yMSAqLworCQlsZWRfc3VwcG9ydGVkID0gVFBBQ1BJX0xFRF9PTEQ7CisJZWxzZQorCQkvKiBhbGwgb3RoZXJzICovCisJCWxlZF9zdXBwb3J0ZWQgPSBUUEFDUElfTEVEX05FVzsKKworCXZkYmdfcHJpbnRrKFRQQUNQSV9EQkdfSU5JVCwgIkxFRCBjb21tYW5kcyBhcmUgJXMsIG1vZGUgJWRcbiIsCisJCXN0cl9zdXBwb3J0ZWQobGVkX3N1cHBvcnRlZCksIGxlZF9zdXBwb3J0ZWQpOworCisJcmV0dXJuIChsZWRfc3VwcG9ydGVkICE9IFRQQUNQSV9MRURfTk9ORSk/IDAgOiAxOworfQorCisjZGVmaW5lIGxlZF9zdGF0dXMocykgKChzKSA9PSAwID8gIm9mZiIgOiAoKHMpID09IDEgPyAib24iIDogImJsaW5raW5nIikpCisKK3N0YXRpYyBpbnQgbGVkX3JlYWQoY2hhciAqcCkKK3sKKwlpbnQgbGVuID0gMDsKKworCWlmICghbGVkX3N1cHBvcnRlZCkgeworCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAic3RhdHVzOlx0XHRub3Qgc3VwcG9ydGVkXG4iKTsKKwkJcmV0dXJuIGxlbjsKKwl9CisJbGVuICs9IHNwcmludGYocCArIGxlbiwgInN0YXR1czpcdFx0c3VwcG9ydGVkXG4iKTsKKworCWlmIChsZWRfc3VwcG9ydGVkID09IFRQQUNQSV9MRURfNTcwKSB7CisJCS8qIDU3MCAqLworCQlpbnQgaSwgc3RhdHVzOworCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCQlpZiAoIWFjcGlfZXZhbGYoZWNfaGFuZGxlLAorCQkJCQkmc3RhdHVzLCAiR0xFRCIsICJkZCIsIDEgPDwgaSkpCisJCQkJcmV0dXJuIC1FSU87CisJCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiJWQ6XHRcdCVzXG4iLAorCQkJCSAgICAgICBpLCBsZWRfc3RhdHVzKHN0YXR1cykpOworCQl9CisJfQorCisJbGVuICs9IHNwcmludGYocCArIGxlbiwgImNvbW1hbmRzOlx0IgorCQkgICAgICAgIjxsZWQ+IG9uLCA8bGVkPiBvZmYsIDxsZWQ+IGJsaW5rICg8bGVkPiBpcyAwLTcpXG4iKTsKKworCXJldHVybiBsZW47Cit9CisKKy8qIG9mZiwgb24sIGJsaW5rICovCitzdGF0aWMgY29uc3QgaW50IGxlZF9zbGVkX2FyZzFbXSA9IHsgMCwgMSwgMyB9Oworc3RhdGljIGNvbnN0IGludCBsZWRfZXhwX2hsYmxbXSA9IHsgMCwgMCwgMSB9OwkvKiBsZWQjICogKi8KK3N0YXRpYyBjb25zdCBpbnQgbGVkX2V4cF9obGNsW10gPSB7IDAsIDEsIDEgfTsJLyogbGVkIyAqICovCitzdGF0aWMgY29uc3QgaW50IGxlZF9sZWRfYXJnMVtdID0geyAwLCAweDgwLCAweGMwIH07CisKK3N0YXRpYyBpbnQgbGVkX3dyaXRlKGNoYXIgKmJ1ZikKK3sKKwljaGFyICpjbWQ7CisJaW50IGxlZCwgaW5kLCByZXQ7CisKKwlpZiAoIWxlZF9zdXBwb3J0ZWQpCisJCXJldHVybiAtRU5PREVWOworCisJd2hpbGUgKChjbWQgPSBuZXh0X2NtZCgmYnVmKSkpIHsKKwkJaWYgKHNzY2FuZihjbWQsICIlZCIsICZsZWQpICE9IDEgfHwgbGVkIDwgMCB8fCBsZWQgPiA3KQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaWYgKHN0cnN0cihjbWQsICJvZmYiKSkgeworCQkJaW5kID0gMDsKKwkJfSBlbHNlIGlmIChzdHJzdHIoY21kLCAib24iKSkgeworCQkJaW5kID0gMTsKKwkJfSBlbHNlIGlmIChzdHJzdHIoY21kLCAiYmxpbmsiKSkgeworCQkJaW5kID0gMjsKKwkJfSBlbHNlCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlpZiAobGVkX3N1cHBvcnRlZCA9PSBUUEFDUElfTEVEXzU3MCkgeworCQkJLyogNTcwICovCisJCQlsZWQgPSAxIDw8IGxlZDsKKwkJCWlmICghYWNwaV9ldmFsZihsZWRfaGFuZGxlLCBOVUxMLCBOVUxMLCAidmRkIiwKKwkJCQkJbGVkLCBsZWRfc2xlZF9hcmcxW2luZF0pKQorCQkJCXJldHVybiAtRUlPOworCQl9IGVsc2UgaWYgKGxlZF9zdXBwb3J0ZWQgPT0gVFBBQ1BJX0xFRF9PTEQpIHsKKwkJCS8qIDYwMGUveCwgNzcwZSwgNzcweCwgQTIxZSwgQTJ4bS9wLCBUMjAtMjIsIFgyMCAqLworCQkJbGVkID0gMSA8PCBsZWQ7CisJCQlyZXQgPSBlY193cml0ZShUUEFDUElfTEVEX0VDX0hMTVMsIGxlZCk7CisJCQlpZiAocmV0ID49IDApCisJCQkJcmV0ID0KKwkJCQkgICAgZWNfd3JpdGUoVFBBQ1BJX0xFRF9FQ19ITEJMLAorCQkJCSAgICAJICAgICBsZWQgKiBsZWRfZXhwX2hsYmxbaW5kXSk7CisJCQlpZiAocmV0ID49IDApCisJCQkJcmV0ID0KKwkJCQkgICAgZWNfd3JpdGUoVFBBQ1BJX0xFRF9FQ19ITENMLAorCQkJCSAgICAJICAgICBsZWQgKiBsZWRfZXhwX2hsY2xbaW5kXSk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlyZXR1cm4gcmV0OworCQl9IGVsc2UgeworCQkJLyogYWxsIG90aGVycyAqLworCQkJaWYgKCFhY3BpX2V2YWxmKGxlZF9oYW5kbGUsIE5VTEwsIE5VTEwsICJ2ZGQiLAorCQkJCQlsZWQsIGxlZF9sZWRfYXJnMVtpbmRdKSkKKwkJCQlyZXR1cm4gLUVJTzsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGlibV9zdHJ1Y3QgbGVkX2RyaXZlcl9kYXRhID0geworCS5uYW1lID0gImxlZCIsCisJLnJlYWQgPSBsZWRfcmVhZCwKKwkud3JpdGUgPSBsZWRfd3JpdGUsCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQmVlcCBzdWJkcml2ZXIKKyAqLworCitJQk1fSEFORExFKGJlZXAsIGVjLCAiQkVFUCIpOwkvKiBhbGwgZXhjZXB0IFIzMCwgUjMxICovCisKK3N0YXRpYyBpbnQgX19pbml0IGJlZXBfaW5pdChzdHJ1Y3QgaWJtX2luaXRfc3RydWN0ICppaWJtKQoreworCXZkYmdfcHJpbnRrKFRQQUNQSV9EQkdfSU5JVCwgImluaXRpYWxpemluZyBiZWVwIHN1YmRyaXZlclxuIik7CisKKwlJQk1fQUNQSUhBTkRMRV9JTklUKGJlZXApOworCisJdmRiZ19wcmludGsoVFBBQ1BJX0RCR19JTklULCAiYmVlcCBpcyAlc1xuIiwKKwkJc3RyX3N1cHBvcnRlZChiZWVwX2hhbmRsZSAhPSBOVUxMKSk7CisKKwlyZXR1cm4gKGJlZXBfaGFuZGxlKT8gMCA6IDE7Cit9CisKK3N0YXRpYyBpbnQgYmVlcF9yZWFkKGNoYXIgKnApCit7CisJaW50IGxlbiA9IDA7CisKKwlpZiAoIWJlZXBfaGFuZGxlKQorCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAic3RhdHVzOlx0XHRub3Qgc3VwcG9ydGVkXG4iKTsKKwllbHNlIHsKKwkJbGVuICs9IHNwcmludGYocCArIGxlbiwgInN0YXR1czpcdFx0c3VwcG9ydGVkXG4iKTsKKwkJbGVuICs9IHNwcmludGYocCArIGxlbiwgImNvbW1hbmRzOlx0PGNtZD4gKDxjbWQ+IGlzIDAtMTcpXG4iKTsKKwl9CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgaW50IGJlZXBfd3JpdGUoY2hhciAqYnVmKQoreworCWNoYXIgKmNtZDsKKwlpbnQgYmVlcF9jbWQ7CisKKwlpZiAoIWJlZXBfaGFuZGxlKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXdoaWxlICgoY21kID0gbmV4dF9jbWQoJmJ1ZikpKSB7CisJCWlmIChzc2NhbmYoY21kLCAiJXUiLCAmYmVlcF9jbWQpID09IDEgJiYKKwkJICAgIGJlZXBfY21kID49IDAgJiYgYmVlcF9jbWQgPD0gMTcpIHsKKwkJCS8qIGJlZXBfY21kIHNldCAqLworCQl9IGVsc2UKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoIWFjcGlfZXZhbGYoYmVlcF9oYW5kbGUsIE5VTEwsIE5VTEwsICJ2ZGQiLCBiZWVwX2NtZCwgMCkpCisJCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBpYm1fc3RydWN0IGJlZXBfZHJpdmVyX2RhdGEgPSB7CisJLm5hbWUgPSAiYmVlcCIsCisJLnJlYWQgPSBiZWVwX3JlYWQsCisJLndyaXRlID0gYmVlcF93cml0ZSwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUaGVybWFsIHN1YmRyaXZlcgorICovCisKK3N0YXRpYyBlbnVtIHRoZXJtYWxfYWNjZXNzX21vZGUgdGhlcm1hbF9yZWFkX21vZGU7CisKKy8qIHN5c2ZzIHRlbXAjI19pbnB1dCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc3NpemVfdCB0aGVybWFsX3RlbXBfaW5wdXRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKnNlbnNvcl9hdHRyID0KKwkJCQkJdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpOworCWludCBpZHggPSBzZW5zb3JfYXR0ci0+aW5kZXg7CisJczMyIHZhbHVlOworCWludCByZXM7CisKKwlyZXMgPSB0aGVybWFsX2dldF9zZW5zb3IoaWR4LCAmdmFsdWUpOworCWlmIChyZXMpCisJCXJldHVybiByZXM7CisJaWYgKHZhbHVlID09IFRQX0VDX1RIRVJNQUxfVE1QX05BICogMTAwMCkKKwkJcmV0dXJuIC1FTlhJTzsKKworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCB2YWx1ZSk7Cit9CisKKyNkZWZpbmUgVEhFUk1BTF9TRU5TT1JfQVRUUl9URU1QKF9pZHhBLCBfaWR4QikgXAorCSBTRU5TT1JfQVRUUih0ZW1wIyNfaWR4QSMjX2lucHV0LCBTX0lSVUdPLCB0aGVybWFsX3RlbXBfaW5wdXRfc2hvdywgTlVMTCwgX2lkeEIpCisKK3N0YXRpYyBzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgc2Vuc29yX2Rldl9hdHRyX3RoZXJtYWxfdGVtcF9pbnB1dFtdID0geworCVRIRVJNQUxfU0VOU09SX0FUVFJfVEVNUCgxLCAwKSwKKwlUSEVSTUFMX1NFTlNPUl9BVFRSX1RFTVAoMiwgMSksCisJVEhFUk1BTF9TRU5TT1JfQVRUUl9URU1QKDMsIDIpLAorCVRIRVJNQUxfU0VOU09SX0FUVFJfVEVNUCg0LCAzKSwKKwlUSEVSTUFMX1NFTlNPUl9BVFRSX1RFTVAoNSwgNCksCisJVEhFUk1BTF9TRU5TT1JfQVRUUl9URU1QKDYsIDUpLAorCVRIRVJNQUxfU0VOU09SX0FUVFJfVEVNUCg3LCA2KSwKKwlUSEVSTUFMX1NFTlNPUl9BVFRSX1RFTVAoOCwgNyksCisJVEhFUk1BTF9TRU5TT1JfQVRUUl9URU1QKDksIDgpLAorCVRIRVJNQUxfU0VOU09SX0FUVFJfVEVNUCgxMCwgOSksCisJVEhFUk1BTF9TRU5TT1JfQVRUUl9URU1QKDExLCAxMCksCisJVEhFUk1BTF9TRU5TT1JfQVRUUl9URU1QKDEyLCAxMSksCisJVEhFUk1BTF9TRU5TT1JfQVRUUl9URU1QKDEzLCAxMiksCisJVEhFUk1BTF9TRU5TT1JfQVRUUl9URU1QKDE0LCAxMyksCisJVEhFUk1BTF9TRU5TT1JfQVRUUl9URU1QKDE1LCAxNCksCisJVEhFUk1BTF9TRU5TT1JfQVRUUl9URU1QKDE2LCAxNSksCit9OworCisjZGVmaW5lIFRIRVJNQUxfQVRUUlMoWCkgXAorCSZzZW5zb3JfZGV2X2F0dHJfdGhlcm1hbF90ZW1wX2lucHV0W1hdLmRldl9hdHRyLmF0dHIKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnRoZXJtYWxfdGVtcF9pbnB1dF9hdHRyW10gPSB7CisJVEhFUk1BTF9BVFRSUyg4KSwKKwlUSEVSTUFMX0FUVFJTKDkpLAorCVRIRVJNQUxfQVRUUlMoMTApLAorCVRIRVJNQUxfQVRUUlMoMTEpLAorCVRIRVJNQUxfQVRUUlMoMTIpLAorCVRIRVJNQUxfQVRUUlMoMTMpLAorCVRIRVJNQUxfQVRUUlMoMTQpLAorCVRIRVJNQUxfQVRUUlMoMTUpLAorCVRIRVJNQUxfQVRUUlMoMCksCisJVEhFUk1BTF9BVFRSUygxKSwKKwlUSEVSTUFMX0FUVFJTKDIpLAorCVRIRVJNQUxfQVRUUlMoMyksCisJVEhFUk1BTF9BVFRSUyg0KSwKKwlUSEVSTUFMX0FUVFJTKDUpLAorCVRIRVJNQUxfQVRUUlMoNiksCisJVEhFUk1BTF9BVFRSUyg3KSwKKwlOVUxMCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCB0aGVybWFsX3RlbXBfaW5wdXQxNl9ncm91cCA9IHsKKwkuYXR0cnMgPSB0aGVybWFsX3RlbXBfaW5wdXRfYXR0cgorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgdGhlcm1hbF90ZW1wX2lucHV0OF9ncm91cCA9IHsKKwkuYXR0cnMgPSAmdGhlcm1hbF90ZW1wX2lucHV0X2F0dHJbOF0KK307CisKKyN1bmRlZiBUSEVSTUFMX1NFTlNPUl9BVFRSX1RFTVAKKyN1bmRlZiBUSEVSTUFMX0FUVFJTCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IF9faW5pdCB0aGVybWFsX2luaXQoc3RydWN0IGlibV9pbml0X3N0cnVjdCAqaWlibSkKK3sKKwl1OCB0LCB0YTEsIHRhMjsKKwlpbnQgaTsKKwlpbnQgYWNwaV90bXA3OworCWludCByZXM7CisKKwl2ZGJnX3ByaW50ayhUUEFDUElfREJHX0lOSVQsICJpbml0aWFsaXppbmcgdGhlcm1hbCBzdWJkcml2ZXJcbiIpOworCisJYWNwaV90bXA3ID0gYWNwaV9ldmFsZihlY19oYW5kbGUsIE5VTEwsICJUTVA3IiwgInF2Iik7CisKKwlpZiAoaWJtX3RoaW5rcGFkX2VjX2ZvdW5kICYmIGV4cGVyaW1lbnRhbCkgeworCQkvKgorCQkgKiBEaXJlY3QgRUMgYWNjZXNzIG1vZGU6IHNlbnNvcnMgYXQgcmVnaXN0ZXJzCisJCSAqIDB4NzgtMHg3RiwgMHhDMC0weEM3LiAgUmVnaXN0ZXJzIHJldHVybiAweDAwIGZvcgorCQkgKiBub24taW1wbGVtZW50ZWQsIHRoZXJtYWwgc2Vuc29ycyByZXR1cm4gMHg4MCB3aGVuCisJCSAqIG5vdCBhdmFpbGFibGUKKwkJICovCisKKwkJdGExID0gdGEyID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQkJaWYgKGFjcGlfZWNfcmVhZChUUF9FQ19USEVSTUFMX1RNUDAgKyBpLCAmdCkpIHsKKwkJCQl0YTEgfD0gdDsKKwkJCX0gZWxzZSB7CisJCQkJdGExID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChhY3BpX2VjX3JlYWQoVFBfRUNfVEhFUk1BTF9UTVA4ICsgaSwgJnQpKSB7CisJCQkJdGEyIHw9IHQ7CisJCQl9IGVsc2UgeworCQkJCXRhMSA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKHRhMSA9PSAwKSB7CisJCQkvKiBUaGlzIGlzIHNoZWVyIHBhcmFub2lhLCBidXQgd2UgaGFuZGxlIGl0IGFueXdheSAqLworCQkJaWYgKGFjcGlfdG1wNykgeworCQkJCXByaW50ayhJQk1fRVJSCisJCQkJICAgICAgICJUaGlua1BhZCBBQ1BJIEVDIGFjY2VzcyBtaXNiZWhhdmluZywgIgorCQkJCSAgICAgICAiZmFsbGluZyBiYWNrIHRvIEFDUEkgVE1QeCBhY2Nlc3MgbW9kZVxuIik7CisJCQkJdGhlcm1hbF9yZWFkX21vZGUgPSBUUEFDUElfVEhFUk1BTF9BQ1BJX1RNUDA3OworCQkJfSBlbHNlIHsKKwkJCQlwcmludGsoSUJNX0VSUgorCQkJCSAgICAgICAiVGhpbmtQYWQgQUNQSSBFQyBhY2Nlc3MgbWlzYmVoYXZpbmcsICIKKwkJCQkgICAgICAgImRpc2FibGluZyB0aGVybWFsIHNlbnNvcnMgYWNjZXNzXG4iKTsKKwkJCQl0aGVybWFsX3JlYWRfbW9kZSA9IFRQQUNQSV9USEVSTUFMX05PTkU7CisJCQl9CisJCX0gZWxzZSB7CisJCQl0aGVybWFsX3JlYWRfbW9kZSA9CisJCQkgICAgKHRhMiAhPSAwKSA/CisJCQkgICAgVFBBQ1BJX1RIRVJNQUxfVFBFQ18xNiA6IFRQQUNQSV9USEVSTUFMX1RQRUNfODsKKwkJfQorCX0gZWxzZSBpZiAoYWNwaV90bXA3KSB7CisJCWlmIChhY3BpX2V2YWxmKGVjX2hhbmRsZSwgTlVMTCwgIlVQRFQiLCAicXYiKSkgeworCQkJLyogNjAwZS94LCA3NzBlLCA3NzB4ICovCisJCQl0aGVybWFsX3JlYWRfbW9kZSA9IFRQQUNQSV9USEVSTUFMX0FDUElfVVBEVDsKKwkJfSBlbHNlIHsKKwkJCS8qIFN0YW5kYXJkIEFDUEkgVE1QeCBhY2Nlc3MsIG1heCA4IHNlbnNvcnMgKi8KKwkJCXRoZXJtYWxfcmVhZF9tb2RlID0gVFBBQ1BJX1RIRVJNQUxfQUNQSV9UTVAwNzsKKwkJfQorCX0gZWxzZSB7CisJCS8qIHRlbXBlcmF0dXJlcyBub3Qgc3VwcG9ydGVkIG9uIDU3MCwgRzR4LCBSMzAsIFIzMSwgUjMyICovCisJCXRoZXJtYWxfcmVhZF9tb2RlID0gVFBBQ1BJX1RIRVJNQUxfTk9ORTsKKwl9CisKKwl2ZGJnX3ByaW50ayhUUEFDUElfREJHX0lOSVQsICJ0aGVybWFsIGlzICVzLCBtb2RlICVkXG4iLAorCQlzdHJfc3VwcG9ydGVkKHRoZXJtYWxfcmVhZF9tb2RlICE9IFRQQUNQSV9USEVSTUFMX05PTkUpLAorCQl0aGVybWFsX3JlYWRfbW9kZSk7CisKKwlzd2l0Y2godGhlcm1hbF9yZWFkX21vZGUpIHsKKwljYXNlIFRQQUNQSV9USEVSTUFMX1RQRUNfMTY6CisJCXJlcyA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmdHBhY3BpX3BkZXYtPmRldi5rb2JqLAorCQkJCSZ0aGVybWFsX3RlbXBfaW5wdXQxNl9ncm91cCk7CisJCWlmIChyZXMpCisJCQlyZXR1cm4gcmVzOworCQlicmVhazsKKwljYXNlIFRQQUNQSV9USEVSTUFMX1RQRUNfODoKKwljYXNlIFRQQUNQSV9USEVSTUFMX0FDUElfVE1QMDc6CisJY2FzZSBUUEFDUElfVEhFUk1BTF9BQ1BJX1VQRFQ6CisJCXJlcyA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmdHBhY3BpX3BkZXYtPmRldi5rb2JqLAorCQkJCSZ0aGVybWFsX3RlbXBfaW5wdXQ4X2dyb3VwKTsKKwkJaWYgKHJlcykKKwkJCXJldHVybiByZXM7CisJCWJyZWFrOworCWNhc2UgVFBBQ1BJX1RIRVJNQUxfTk9ORToKKwlkZWZhdWx0OgorCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdGhlcm1hbF9leGl0KHZvaWQpCit7CisJc3dpdGNoKHRoZXJtYWxfcmVhZF9tb2RlKSB7CisJY2FzZSBUUEFDUElfVEhFUk1BTF9UUEVDXzE2OgorCQlzeXNmc19yZW1vdmVfZ3JvdXAoJnRwYWNwaV9wZGV2LT5kZXYua29iaiwKKwkJCQkgICAmdGhlcm1hbF90ZW1wX2lucHV0MTZfZ3JvdXApOworCQlicmVhazsKKwljYXNlIFRQQUNQSV9USEVSTUFMX1RQRUNfODoKKwljYXNlIFRQQUNQSV9USEVSTUFMX0FDUElfVE1QMDc6CisJY2FzZSBUUEFDUElfVEhFUk1BTF9BQ1BJX1VQRFQ6CisJCXN5c2ZzX3JlbW92ZV9ncm91cCgmdHBhY3BpX3BkZXYtPmRldi5rb2JqLAorCQkJCSAgICZ0aGVybWFsX3RlbXBfaW5wdXQxNl9ncm91cCk7CisJCWJyZWFrOworCWNhc2UgVFBBQ1BJX1RIRVJNQUxfTk9ORToKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9CisKKy8qIGlkeCBpcyB6ZXJvLWJhc2VkICovCitzdGF0aWMgaW50IHRoZXJtYWxfZ2V0X3NlbnNvcihpbnQgaWR4LCBzMzIgKnZhbHVlKQoreworCWludCB0OworCXM4IHRtcDsKKwljaGFyIHRtcGlbNV07CisKKwl0ID0gVFBfRUNfVEhFUk1BTF9UTVAwOworCisJc3dpdGNoICh0aGVybWFsX3JlYWRfbW9kZSkgeworI2lmIFRQQUNQSV9NQVhfVEhFUk1BTF9TRU5TT1JTID49IDE2CisJY2FzZSBUUEFDUElfVEhFUk1BTF9UUEVDXzE2OgorCQlpZiAoaWR4ID49IDggJiYgaWR4IDw9IDE1KSB7CisJCQl0ID0gVFBfRUNfVEhFUk1BTF9UTVA4OworCQkJaWR4IC09IDg7CisJCX0KKwkJLyogZmFsbHRocm91Z2ggKi8KKyNlbmRpZgorCWNhc2UgVFBBQ1BJX1RIRVJNQUxfVFBFQ184OgorCQlpZiAoaWR4IDw9IDcpIHsKKwkJCWlmICghYWNwaV9lY19yZWFkKHQgKyBpZHgsICZ0bXApKQorCQkJCXJldHVybiAtRUlPOworCQkJKnZhbHVlID0gdG1wICogMTAwMDsKKwkJCXJldHVybiAwOworCQl9CisJCWJyZWFrOworCisJY2FzZSBUUEFDUElfVEhFUk1BTF9BQ1BJX1VQRFQ6CisJCWlmIChpZHggPD0gNykgeworCQkJc25wcmludGYodG1waSwgc2l6ZW9mKHRtcGkpLCAiVE1QJWMiLCAnMCcgKyBpZHgpOworCQkJaWYgKCFhY3BpX2V2YWxmKGVjX2hhbmRsZSwgTlVMTCwgIlVQRFQiLCAidiIpKQorCQkJCXJldHVybiAtRUlPOworCQkJaWYgKCFhY3BpX2V2YWxmKGVjX2hhbmRsZSwgJnQsIHRtcGksICJkIikpCisJCQkJcmV0dXJuIC1FSU87CisJCQkqdmFsdWUgPSAodCAtIDI3MzIpICogMTAwOworCQkJcmV0dXJuIDA7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFRQQUNQSV9USEVSTUFMX0FDUElfVE1QMDc6CisJCWlmIChpZHggPD0gNykgeworCQkJc25wcmludGYodG1waSwgc2l6ZW9mKHRtcGkpLCAiVE1QJWMiLCAnMCcgKyBpZHgpOworCQkJaWYgKCFhY3BpX2V2YWxmKGVjX2hhbmRsZSwgJnQsIHRtcGksICJkIikpCisJCQkJcmV0dXJuIC1FSU87CisJCQkqdmFsdWUgPSB0ICogMTAwMDsKKwkJCXJldHVybiAwOworCQl9CisJCWJyZWFrOworCisJY2FzZSBUUEFDUElfVEhFUk1BTF9OT05FOgorCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PU1lTOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IHRoZXJtYWxfZ2V0X3NlbnNvcnMoc3RydWN0IGlibV90aGVybWFsX3NlbnNvcnNfc3RydWN0ICpzKQoreworCWludCByZXMsIGk7CisJaW50IG47CisKKwluID0gODsKKwlpID0gMDsKKworCWlmICghcykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAodGhlcm1hbF9yZWFkX21vZGUgPT0gVFBBQ1BJX1RIRVJNQUxfVFBFQ18xNikKKwkJbiA9IDE2OworCisJZm9yKGkgPSAwIDsgaSA8IG47IGkrKykgeworCQlyZXMgPSB0aGVybWFsX2dldF9zZW5zb3IoaSwgJnMtPnRlbXBbaV0pOworCQlpZiAocmVzKQorCQkJcmV0dXJuIHJlczsKKwl9CisKKwlyZXR1cm4gbjsKK30KKworc3RhdGljIGludCB0aGVybWFsX3JlYWQoY2hhciAqcCkKK3sKKwlpbnQgbGVuID0gMDsKKwlpbnQgbiwgaTsKKwlzdHJ1Y3QgaWJtX3RoZXJtYWxfc2Vuc29yc19zdHJ1Y3QgdDsKKworCW4gPSB0aGVybWFsX2dldF9zZW5zb3JzKCZ0KTsKKwlpZiAodW5saWtlbHkobiA8IDApKQorCQlyZXR1cm4gbjsKKworCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJ0ZW1wZXJhdHVyZXM6XHQiKTsKKworCWlmIChuID4gMCkgeworCQlmb3IgKGkgPSAwOyBpIDwgKG4gLSAxKTsgaSsrKQorCQkJbGVuICs9IHNwcmludGYocCArIGxlbiwgIiVkICIsIHQudGVtcFtpXSAvIDEwMDApOworCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiJWRcbiIsIHQudGVtcFtpXSAvIDEwMDApOworCX0gZWxzZQorCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAibm90IHN1cHBvcnRlZFxuIik7CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgc3RydWN0IGlibV9zdHJ1Y3QgdGhlcm1hbF9kcml2ZXJfZGF0YSA9IHsKKwkubmFtZSA9ICJ0aGVybWFsIiwKKwkucmVhZCA9IHRoZXJtYWxfcmVhZCwKKwkuZXhpdCA9IHRoZXJtYWxfZXhpdCwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBFQyBEdW1wIHN1YmRyaXZlcgorICovCisKK3N0YXRpYyB1OCBlY2R1bXBfcmVnc1syNTZdOworCitzdGF0aWMgaW50IGVjZHVtcF9yZWFkKGNoYXIgKnApCit7CisJaW50IGxlbiA9IDA7CisJaW50IGksIGo7CisJdTggdjsKKworCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJFQyAgICAgICIKKwkJICAgICAgICIgKzAwICswMSArMDIgKzAzICswNCArMDUgKzA2ICswNyIKKwkJICAgICAgICIgKzA4ICswOSArMGEgKzBiICswYyArMGQgKzBlICswZlxuIik7CisJZm9yIChpID0gMDsgaSA8IDI1NjsgaSArPSAxNikgeworCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiRUMgMHglMDJ4OiIsIGkpOworCQlmb3IgKGogPSAwOyBqIDwgMTY7IGorKykgeworCQkJaWYgKCFhY3BpX2VjX3JlYWQoaSArIGosICZ2KSkKKwkJCQlicmVhazsKKwkJCWlmICh2ICE9IGVjZHVtcF9yZWdzW2kgKyBqXSkKKwkJCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiIColMDJ4Iiwgdik7CisJCQllbHNlCisJCQkJbGVuICs9IHNwcmludGYocCArIGxlbiwgIiAgJTAyeCIsIHYpOworCQkJZWNkdW1wX3JlZ3NbaSArIGpdID0gdjsKKwkJfQorCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiXG4iKTsKKwkJaWYgKGogIT0gMTYpCisJCQlicmVhazsKKwl9CisKKwkvKiBUaGVzZSBhcmUgd2F5IHRvbyBkYW5nZXJvdXMgdG8gYWR2ZXJ0aXNlIG9wZW5seS4uLiAqLworI2lmIDAKKwlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiY29tbWFuZHM6XHQweDxvZmZzZXQ+IDB4PHZhbHVlPiIKKwkJICAgICAgICIgKDxvZmZzZXQ+IGlzIDAwLWZmLCA8dmFsdWU+IGlzIDAwLWZmKVxuIik7CisJbGVuICs9IHNwcmludGYocCArIGxlbiwgImNvbW1hbmRzOlx0MHg8b2Zmc2V0PiA8dmFsdWU+ICAiCisJCSAgICAgICAiICg8b2Zmc2V0PiBpcyAwMC1mZiwgPHZhbHVlPiBpcyAwLTI1NSlcbiIpOworI2VuZGlmCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIGludCBlY2R1bXBfd3JpdGUoY2hhciAqYnVmKQoreworCWNoYXIgKmNtZDsKKwlpbnQgaSwgdjsKKworCXdoaWxlICgoY21kID0gbmV4dF9jbWQoJmJ1ZikpKSB7CisJCWlmIChzc2NhbmYoY21kLCAiMHgleCAweCV4IiwgJmksICZ2KSA9PSAyKSB7CisJCQkvKiBpIGFuZCB2IHNldCAqLworCQl9IGVsc2UgaWYgKHNzY2FuZihjbWQsICIweCV4ICV1IiwgJmksICZ2KSA9PSAyKSB7CisJCQkvKiBpIGFuZCB2IHNldCAqLworCQl9IGVsc2UKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoaSA+PSAwICYmIGkgPCAyNTYgJiYgdiA+PSAwICYmIHYgPCAyNTYpIHsKKwkJCWlmICghYWNwaV9lY193cml0ZShpLCB2KSkKKwkJCQlyZXR1cm4gLUVJTzsKKwkJfSBlbHNlCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBpYm1fc3RydWN0IGVjZHVtcF9kcml2ZXJfZGF0YSA9IHsKKwkubmFtZSA9ICJlY2R1bXAiLAorCS5yZWFkID0gZWNkdW1wX3JlYWQsCisJLndyaXRlID0gZWNkdW1wX3dyaXRlLAorCS5mbGFncy5leHBlcmltZW50YWwgPSAxLAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEJhY2tsaWdodC9icmlnaHRuZXNzIHN1YmRyaXZlcgorICovCisKK3N0YXRpYyBzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqaWJtX2JhY2tsaWdodF9kZXZpY2UgPSBOVUxMOworCitzdGF0aWMgc3RydWN0IGJhY2tsaWdodF9vcHMgaWJtX2JhY2tsaWdodF9kYXRhID0geworICAgICAgICAuZ2V0X2JyaWdodG5lc3MgPSBicmlnaHRuZXNzX2dldCwKKyAgICAgICAgLnVwZGF0ZV9zdGF0dXMgID0gYnJpZ2h0bmVzc191cGRhdGVfc3RhdHVzLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYnJpZ2h0bmVzc19pbml0KHN0cnVjdCBpYm1faW5pdF9zdHJ1Y3QgKmlpYm0pCit7CisJaW50IGI7CisKKwl2ZGJnX3ByaW50ayhUUEFDUElfREJHX0lOSVQsICJpbml0aWFsaXppbmcgYnJpZ2h0bmVzcyBzdWJkcml2ZXJcbiIpOworCisJYiA9IGJyaWdodG5lc3NfZ2V0KE5VTEwpOworCWlmIChiIDwgMCkKKwkJcmV0dXJuIGI7CisKKwlpYm1fYmFja2xpZ2h0X2RldmljZSA9IGJhY2tsaWdodF9kZXZpY2VfcmVnaXN0ZXIoCisJCQkJCVRQQUNQSV9CQUNLTElHSFRfREVWX05BTUUsIE5VTEwsIE5VTEwsCisJCQkJCSZpYm1fYmFja2xpZ2h0X2RhdGEpOworCWlmIChJU19FUlIoaWJtX2JhY2tsaWdodF9kZXZpY2UpKSB7CisJCXByaW50ayhJQk1fRVJSICJDb3VsZCBub3QgcmVnaXN0ZXIgYmFja2xpZ2h0IGRldmljZVxuIik7CisJCXJldHVybiBQVFJfRVJSKGlibV9iYWNrbGlnaHRfZGV2aWNlKTsKKwl9CisJdmRiZ19wcmludGsoVFBBQ1BJX0RCR19JTklULCAiYnJpZ2h0bmVzcyBpcyBzdXBwb3J0ZWRcbiIpOworCisJaWJtX2JhY2tsaWdodF9kZXZpY2UtPnByb3BzLm1heF9icmlnaHRuZXNzID0gNzsKKwlpYm1fYmFja2xpZ2h0X2RldmljZS0+cHJvcHMuYnJpZ2h0bmVzcyA9IGI7CisJYmFja2xpZ2h0X3VwZGF0ZV9zdGF0dXMoaWJtX2JhY2tsaWdodF9kZXZpY2UpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGJyaWdodG5lc3NfZXhpdCh2b2lkKQoreworCWlmIChpYm1fYmFja2xpZ2h0X2RldmljZSkgeworCQl2ZGJnX3ByaW50ayhUUEFDUElfREJHX0VYSVQsCisJCQkgICAgImNhbGxpbmcgYmFja2xpZ2h0X2RldmljZV91bnJlZ2lzdGVyKClcbiIpOworCQliYWNrbGlnaHRfZGV2aWNlX3VucmVnaXN0ZXIoaWJtX2JhY2tsaWdodF9kZXZpY2UpOworCQlpYm1fYmFja2xpZ2h0X2RldmljZSA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgaW50IGJyaWdodG5lc3NfdXBkYXRlX3N0YXR1cyhzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQpCit7CisJcmV0dXJuIGJyaWdodG5lc3Nfc2V0KAorCQkoYmQtPnByb3BzLmZiX2JsYW5rID09IEZCX0JMQU5LX1VOQkxBTksgJiYKKwkJIGJkLT5wcm9wcy5wb3dlciA9PSBGQl9CTEFOS19VTkJMQU5LKSA/CisJCQkJYmQtPnByb3BzLmJyaWdodG5lc3MgOiAwKTsKK30KKworc3RhdGljIGludCBicmlnaHRuZXNzX2dldChzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQpCit7CisJdTggbGV2ZWw7CisJaWYgKCFhY3BpX2VjX3JlYWQoYnJpZ2h0bmVzc19vZmZzZXQsICZsZXZlbCkpCisJCXJldHVybiAtRUlPOworCisJbGV2ZWwgJj0gMHg3OworCisJcmV0dXJuIGxldmVsOworfQorCitzdGF0aWMgaW50IGJyaWdodG5lc3Nfc2V0KGludCB2YWx1ZSkKK3sKKwlpbnQgY21vc19jbWQsIGluYywgaTsKKwlpbnQgY3VycmVudF92YWx1ZSA9IGJyaWdodG5lc3NfZ2V0KE5VTEwpOworCisJdmFsdWUgJj0gNzsKKworCWNtb3NfY21kID0gdmFsdWUgPiBjdXJyZW50X3ZhbHVlID8gVFBfQ01PU19CUklHSFRORVNTX1VQIDogVFBfQ01PU19CUklHSFRORVNTX0RPV047CisJaW5jID0gdmFsdWUgPiBjdXJyZW50X3ZhbHVlID8gMSA6IC0xOworCWZvciAoaSA9IGN1cnJlbnRfdmFsdWU7IGkgIT0gdmFsdWU7IGkgKz0gaW5jKSB7CisJCWlmIChpc3N1ZV90aGlua3BhZF9jbW9zX2NvbW1hbmQoY21vc19jbWQpKQorCQkJcmV0dXJuIC1FSU87CisJCWlmICghYWNwaV9lY193cml0ZShicmlnaHRuZXNzX29mZnNldCwgaSArIGluYykpCisJCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBicmlnaHRuZXNzX3JlYWQoY2hhciAqcCkKK3sKKwlpbnQgbGVuID0gMDsKKwlpbnQgbGV2ZWw7CisKKwlpZiAoKGxldmVsID0gYnJpZ2h0bmVzc19nZXQoTlVMTCkpIDwgMCkgeworCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAibGV2ZWw6XHRcdHVucmVhZGFibGVcbiIpOworCX0gZWxzZSB7CisJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJsZXZlbDpcdFx0JWRcbiIsIGxldmVsICYgMHg3KTsKKwkJbGVuICs9IHNwcmludGYocCArIGxlbiwgImNvbW1hbmRzOlx0dXAsIGRvd25cbiIpOworCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiY29tbWFuZHM6XHRsZXZlbCA8bGV2ZWw+IgorCQkJICAgICAgICIgKDxsZXZlbD4gaXMgMC03KVxuIik7CisJfQorCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIGludCBicmlnaHRuZXNzX3dyaXRlKGNoYXIgKmJ1ZikKK3sKKwlpbnQgbGV2ZWw7CisJaW50IG5ld19sZXZlbDsKKwljaGFyICpjbWQ7CisKKwl3aGlsZSAoKGNtZCA9IG5leHRfY21kKCZidWYpKSkgeworCQlpZiAoKGxldmVsID0gYnJpZ2h0bmVzc19nZXQoTlVMTCkpIDwgMCkKKwkJCXJldHVybiBsZXZlbDsKKwkJbGV2ZWwgJj0gNzsKKworCQlpZiAoc3RybGVuY21wKGNtZCwgInVwIikgPT0gMCkgeworCQkJbmV3X2xldmVsID0gbGV2ZWwgPT0gNyA/IDcgOiBsZXZlbCArIDE7CisJCX0gZWxzZSBpZiAoc3RybGVuY21wKGNtZCwgImRvd24iKSA9PSAwKSB7CisJCQluZXdfbGV2ZWwgPSBsZXZlbCA9PSAwID8gMCA6IGxldmVsIC0gMTsKKwkJfSBlbHNlIGlmIChzc2NhbmYoY21kLCAibGV2ZWwgJWQiLCAmbmV3X2xldmVsKSA9PSAxICYmCisJCQkgICBuZXdfbGV2ZWwgPj0gMCAmJiBuZXdfbGV2ZWwgPD0gNykgeworCQkJLyogbmV3X2xldmVsIHNldCAqLworCQl9IGVsc2UKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWJyaWdodG5lc3Nfc2V0KG5ld19sZXZlbCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaWJtX3N0cnVjdCBicmlnaHRuZXNzX2RyaXZlcl9kYXRhID0geworCS5uYW1lID0gImJyaWdodG5lc3MiLAorCS5yZWFkID0gYnJpZ2h0bmVzc19yZWFkLAorCS53cml0ZSA9IGJyaWdodG5lc3Nfd3JpdGUsCisJLmV4aXQgPSBicmlnaHRuZXNzX2V4aXQsCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVm9sdW1lIHN1YmRyaXZlcgorICovCisKK3N0YXRpYyBpbnQgdm9sdW1lX3JlYWQoY2hhciAqcCkKK3sKKwlpbnQgbGVuID0gMDsKKwl1OCBsZXZlbDsKKworCWlmICghYWNwaV9lY19yZWFkKHZvbHVtZV9vZmZzZXQsICZsZXZlbCkpIHsKKwkJbGVuICs9IHNwcmludGYocCArIGxlbiwgImxldmVsOlx0XHR1bnJlYWRhYmxlXG4iKTsKKwl9IGVsc2UgeworCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAibGV2ZWw6XHRcdCVkXG4iLCBsZXZlbCAmIDB4Zik7CisJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJtdXRlOlx0XHQlc1xuIiwgb25vZmYobGV2ZWwsIDYpKTsKKwkJbGVuICs9IHNwcmludGYocCArIGxlbiwgImNvbW1hbmRzOlx0dXAsIGRvd24sIG11dGVcbiIpOworCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiY29tbWFuZHM6XHRsZXZlbCA8bGV2ZWw+IgorCQkJICAgICAgICIgKDxsZXZlbD4gaXMgMC0xNSlcbiIpOworCX0KKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBpbnQgdm9sdW1lX3dyaXRlKGNoYXIgKmJ1ZikKK3sKKwlpbnQgY21vc19jbWQsIGluYywgaTsKKwl1OCBsZXZlbCwgbXV0ZTsKKwlpbnQgbmV3X2xldmVsLCBuZXdfbXV0ZTsKKwljaGFyICpjbWQ7CisKKwl3aGlsZSAoKGNtZCA9IG5leHRfY21kKCZidWYpKSkgeworCQlpZiAoIWFjcGlfZWNfcmVhZCh2b2x1bWVfb2Zmc2V0LCAmbGV2ZWwpKQorCQkJcmV0dXJuIC1FSU87CisJCW5ld19tdXRlID0gbXV0ZSA9IGxldmVsICYgMHg0MDsKKwkJbmV3X2xldmVsID0gbGV2ZWwgPSBsZXZlbCAmIDB4ZjsKKworCQlpZiAoc3RybGVuY21wKGNtZCwgInVwIikgPT0gMCkgeworCQkJaWYgKG11dGUpCisJCQkJbmV3X211dGUgPSAwOworCQkJZWxzZQorCQkJCW5ld19sZXZlbCA9IGxldmVsID09IDE1ID8gMTUgOiBsZXZlbCArIDE7CisJCX0gZWxzZSBpZiAoc3RybGVuY21wKGNtZCwgImRvd24iKSA9PSAwKSB7CisJCQlpZiAobXV0ZSkKKwkJCQluZXdfbXV0ZSA9IDA7CisJCQllbHNlCisJCQkJbmV3X2xldmVsID0gbGV2ZWwgPT0gMCA/IDAgOiBsZXZlbCAtIDE7CisJCX0gZWxzZSBpZiAoc3NjYW5mKGNtZCwgImxldmVsICVkIiwgJm5ld19sZXZlbCkgPT0gMSAmJgorCQkJICAgbmV3X2xldmVsID49IDAgJiYgbmV3X2xldmVsIDw9IDE1KSB7CisJCQkvKiBuZXdfbGV2ZWwgc2V0ICovCisJCX0gZWxzZSBpZiAoc3RybGVuY21wKGNtZCwgIm11dGUiKSA9PSAwKSB7CisJCQluZXdfbXV0ZSA9IDB4NDA7CisJCX0gZWxzZQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaWYgKG5ld19sZXZlbCAhPSBsZXZlbCkgewkvKiBtdXRlIGRvZXNuJ3QgY2hhbmdlICovCisJCQljbW9zX2NtZCA9IG5ld19sZXZlbCA+IGxldmVsID8gVFBfQ01PU19WT0xVTUVfVVAgOiBUUF9DTU9TX1ZPTFVNRV9ET1dOOworCQkJaW5jID0gbmV3X2xldmVsID4gbGV2ZWwgPyAxIDogLTE7CisKKwkJCWlmIChtdXRlICYmIChpc3N1ZV90aGlua3BhZF9jbW9zX2NvbW1hbmQoY21vc19jbWQpIHx8CisJCQkJICAgICAhYWNwaV9lY193cml0ZSh2b2x1bWVfb2Zmc2V0LCBsZXZlbCkpKQorCQkJCXJldHVybiAtRUlPOworCisJCQlmb3IgKGkgPSBsZXZlbDsgaSAhPSBuZXdfbGV2ZWw7IGkgKz0gaW5jKQorCQkJCWlmIChpc3N1ZV90aGlua3BhZF9jbW9zX2NvbW1hbmQoY21vc19jbWQpIHx8CisJCQkJICAgICFhY3BpX2VjX3dyaXRlKHZvbHVtZV9vZmZzZXQsIGkgKyBpbmMpKQorCQkJCQlyZXR1cm4gLUVJTzsKKworCQkJaWYgKG11dGUgJiYgKGlzc3VlX3RoaW5rcGFkX2Ntb3NfY29tbWFuZChUUF9DTU9TX1ZPTFVNRV9NVVRFKSB8fAorCQkJCSAgICAgIWFjcGlfZWNfd3JpdGUodm9sdW1lX29mZnNldCwKKwkJCQkJCSAgICBuZXdfbGV2ZWwgKyBtdXRlKSkpCisJCQkJcmV0dXJuIC1FSU87CisJCX0KKworCQlpZiAobmV3X211dGUgIT0gbXV0ZSkgewkvKiBsZXZlbCBkb2Vzbid0IGNoYW5nZSAqLworCQkJY21vc19jbWQgPSBuZXdfbXV0ZSA/IFRQX0NNT1NfVk9MVU1FX01VVEUgOiBUUF9DTU9TX1ZPTFVNRV9VUDsKKworCQkJaWYgKGlzc3VlX3RoaW5rcGFkX2Ntb3NfY29tbWFuZChjbW9zX2NtZCkgfHwKKwkJCSAgICAhYWNwaV9lY193cml0ZSh2b2x1bWVfb2Zmc2V0LCBsZXZlbCArIG5ld19tdXRlKSkKKwkJCQlyZXR1cm4gLUVJTzsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGlibV9zdHJ1Y3Qgdm9sdW1lX2RyaXZlcl9kYXRhID0geworCS5uYW1lID0gInZvbHVtZSIsCisJLnJlYWQgPSB2b2x1bWVfcmVhZCwKKwkud3JpdGUgPSB2b2x1bWVfd3JpdGUsCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRmFuIHN1YmRyaXZlcgorICovCisKKy8qCisgKiBGQU4gQUNDRVNTIE1PREVTCisgKgorICogVFBBQ1BJX0ZBTl9SRF9BQ1BJX0dGQU46CisgKiAJQUNQSSBHRkFOIG1ldGhvZDogcmV0dXJucyBmYW4gbGV2ZWwKKyAqCisgKiAJc2VlIFRQQUNQSV9GQU5fV1JfQUNQSV9TRkFOCisgKiAJRUMgMHgyZiAoSEZTUCkgbm90IGF2YWlsYWJsZSBpZiBHRkFOIGV4aXN0cworICoKKyAqIFRQQUNQSV9GQU5fV1JfQUNQSV9TRkFOOgorICogCUFDUEkgU0ZBTiBtZXRob2Q6IHNldHMgZmFuIGxldmVsLCAwIChzdG9wKSB0byA3IChtYXgpCisgKgorICogCUVDIDB4MmYgKEhGU1ApIG1pZ2h0IGJlIGF2YWlsYWJsZSAqZm9yIHJlYWRpbmcqLCBidXQgZG8gbm90IHVzZQorICogCWl0IGZvciB3cml0aW5nLgorICoKKyAqIFRQQUNQSV9GQU5fV1JfVFBFQzoKKyAqIAlUaGlua1BhZCBFQyByZWdpc3RlciAweDJmIChIRlNQKTogZmFuIGNvbnRyb2wgbG9vcCBtb2RlCisgKiAJU3VwcG9ydGVkIG9uIGFsbW9zdCBhbGwgVGhpbmtQYWRzCisgKgorICogCUZhbiBzcGVlZCBjaGFuZ2VzIG9mIGFueSBzb3J0IChpbmNsdWRpbmcgdGhvc2UgY2F1c2VkIGJ5IHRoZQorICogCWRpc2VuZ2FnZWQgbW9kZSkgYXJlIHVzdWFsbHkgZG9uZSBzbG93bHkgYnkgdGhlIGZpcm13YXJlIGFzIHRoZQorICogCW1heGltdW0gYW1tb3VudCBvZiBmYW4gZHV0eSBjeWNsZSBjaGFuZ2UgcGVyIHNlY29uZCBzZWVtcyB0byBiZQorICogCWxpbWl0ZWQuCisgKgorICogCVJlYWRpbmcgaXMgbm90IGF2YWlsYWJsZSBpZiBHRkFOIGV4aXN0cy4KKyAqIAlXcml0aW5nIGlzIG5vdCBhdmFpbGFibGUgaWYgU0ZBTiBleGlzdHMuCisgKgorICogCUJpdHMKKyAqCSA3CWF1dG9tYXRpYyBtb2RlIGVuZ2FnZWQ7CisgKiAgCQkoZGVmYXVsdCBvcGVyYXRpb24gbW9kZSBvZiB0aGUgVGhpbmtQYWQpCisgKiAJCWZhbiBsZXZlbCBpcyBpZ25vcmVkIGluIHRoaXMgbW9kZS4KKyAqCSA2CWZ1bGwgc3BlZWQgbW9kZSAodGFrZXMgcHJlY2VkZW5jZSBvdmVyIGJpdCA3KTsKKyAqCQlub3QgYXZhaWxhYmxlIG9uIGFsbCB0aGlua3BhZHMuICBNYXkgZGlzYWJsZQorICoJCXRoZSB0YWNob21ldGVyIHdoaWxlIHRoZSBmYW4gY29udHJvbGxlciByYW1wcyB1cAorICoJCXRoZSBzcGVlZCAod2hpY2ggY2FuIHRha2UgdXAgdG8gYSBmZXcgKm1pbnV0ZXMqKS4KKyAqCQlTcGVlZHMgdXAgZmFuIHRvIDEwMCUgZHV0eS1jeWNsZSwgd2hpY2ggaXMgZmFyIGFib3ZlCisgKgkJdGhlIHN0YW5kYXJkIFJQTSBsZXZlbHMuICBJdCBpcyBub3QgaW1wb3NzaWJsZSB0aGF0CisgKgkJaXQgY291bGQgY2F1c2UgaGFyZHdhcmUgZGFtYWdlLgorICoJNS0zCXVudXNlZCBpbiBzb21lIG1vZGVscy4gIEV4dHJhIGJpdHMgZm9yIGZhbiBsZXZlbAorICoJCWluIG90aGVycywgYnV0IHN0aWxsIHVzZWxlc3MgYXMgYWxsIHZhbHVlcyBhYm92ZQorICoJCTcgbWFwIHRvIHRoZSBzYW1lIHNwZWVkIGFzIGxldmVsIDcgaW4gdGhlc2UgbW9kZWxzLgorICoJMi0wCWZhbiBsZXZlbCAoMC4uNyB1c3VhbGx5KQorICoJCQkweDAwID0gc3RvcAorICogCQkJMHgwNyA9IG1heCAoc2V0IHdoZW4gdGVtcGVyYXR1cmVzIGNyaXRpY2FsKQorICogCQlTb21lIFRoaW5rUGFkcyBtYXkgaGF2ZSBvdGhlciBsZXZlbHMsIHNlZQorICogCQlUUEFDUElfRkFOX1dSX0FDUElfRkFOUyAoWDMxL1g0MC9YNDEpCisgKgorICoJRklSTVdBUkUgQlVHOiBvbiBzb21lIG1vZGVscywgRUMgMHgyZiBtaWdodCBub3QgYmUgaW5pdGlhbGl6ZWQgYXQKKyAqCWJvb3QuIEFwcGFyZW50bHkgdGhlIEVDIGRvZXMgbm90IGludGlhbGl6ZSBpdCwgc28gdW5sZXNzIEFDUEkgRFNEVAorICoJZG9lcyBzbywgaXRzIGluaXRpYWwgdmFsdWUgaXMgbWVhbmluZ2xlc3MgKDB4MDcpLgorICoKKyAqCUZvciBmaXJtd2FyZSBidWdzLCByZWZlciB0bzoKKyAqCWh0dHA6Ly90aGlua3dpa2kub3JnL3dpa2kvRW1iZWRkZWRfQ29udHJvbGxlcl9GaXJtd2FyZSNGaXJtd2FyZV9Jc3N1ZXMKKyAqCisgKiAJLS0tLQorICoKKyAqCVRoaW5rUGFkIEVDIHJlZ2lzdGVyIDB4ODQgKExTQiksIDB4ODUgKE1TQik6CisgKglNYWluIGZhbiB0YWNob21ldGVyIHJlYWRpbmcgKGluIFJQTSkKKyAqCisgKglUaGlzIHJlZ2lzdGVyIGlzIHByZXNlbnQgb24gYWxsIFRoaW5rUGFkcyB3aXRoIGEgbmV3LXN0eWxlIEVDLCBhbmQKKyAqCWl0IGlzIGtub3duIG5vdCB0byBiZSBwcmVzZW50IG9uIHRoZSBBMjFtL2UsIGFuZCBUMjIsIGFzIHRoZXJlIGlzCisgKglzb21ldGhpbmcgZWxzZSBpbiBvZmZzZXQgMHg4NCBhY2NvcmRpbmcgdG8gdGhlIEFDUEkgRFNEVC4gIE90aGVyCisgKglUaGlua1BhZHMgZnJvbSB0aGlzIHNhbWUgdGltZSBwZXJpb2QgKGFuZCBlYXJsaWVyKSBwcm9iYWJseSBsYWNrIHRoZQorICoJdGFjaG9tZXRlciBhcyB3ZWxsLgorICoKKyAqCVVuZm9ydHVuYXRlbHkgYSBsb3Qgb2YgVGhpbmtQYWRzIHdpdGggbmV3LXN0eWxlIEVDcyBidXQgd2hvc2UgZmlyd21hcmUKKyAqCXdhcyBuZXZlciBmaXhlZCBieSBJQk0gdG8gcmVwb3J0IHRoZSBFQyBmaXJtd2FyZSB2ZXJzaW9uIHN0cmluZworICoJcHJvYmFibHkgc3VwcG9ydCB0aGUgdGFjaG9tZXRlciAobGlrZSB0aGUgZWFybHkgWCBtb2RlbHMpLCBzbworICoJZGV0ZWN0aW5nIGl0IGlzIHF1aXRlIGhhcmQuICBXZSBuZWVkIG1vcmUgZGF0YSB0byBrbm93IGZvciBzdXJlLgorICoKKyAqCUZJUk1XQVJFIEJVRzogYWx3YXlzIHJlYWQgMHg4NCBmaXJzdCwgb3RoZXJ3aXNlIGluY29ycmVjdCByZWFkaW5ncworICoJbWlnaHQgcmVzdWx0LgorICoKKyAqCUZJUk1XQVJFIEJVRzogbWF5IGdvIHN0YWxlIHdoaWxlIHRoZSBFQyBpcyBzd2l0Y2hpbmcgdG8gZnVsbCBzcGVlZAorICoJbW9kZS4KKyAqCisgKglGb3IgZmlybXdhcmUgYnVncywgcmVmZXIgdG86CisgKglodHRwOi8vdGhpbmt3aWtpLm9yZy93aWtpL0VtYmVkZGVkX0NvbnRyb2xsZXJfRmlybXdhcmUjRmlybXdhcmVfSXNzdWVzCisgKgorICogVFBBQ1BJX0ZBTl9XUl9BQ1BJX0ZBTlM6CisgKglUaGlua1BhZCBYMzEsIFg0MCwgWDQxLiAgTm90IGF2YWlsYWJsZSBpbiB0aGUgWDYwLgorICoKKyAqCUZBTlMgQUNQSSBoYW5kbGU6IHRha2VzIHRocmVlIGFyZ3VtZW50czogbG93IHNwZWVkLCBtZWRpdW0gc3BlZWQsCisgKgloaWdoIHNwZWVkLiAgQUNQSSBEU0RUIHNlZW1zIHRvIG1hcCB0aGVzZSB0aHJlZSBzcGVlZHMgdG8gbGV2ZWxzCisgKglhcyBmb2xsb3dzOiBTVE9QIExPVyBMT1cgTUVEIE1FRCBISUdIIEhJR0ggSElHSCBISUdICisgKgkodGhpcyBtYXAgaXMgc3RvcmVkIG9uIEZBTjAuLkZBTjggYXMgIjAsMSwxLDIsMiwzLDMsMywzIikKKyAqCisgKiAJVGhlIHNwZWVkcyBhcmUgc3RvcmVkIG9uIGhhbmRsZXMKKyAqIAkoRkFOQTpGQU45KSwgKEZBTkM6RkFOQiksIChGQU5FOkZBTkQpLgorICoKKyAqIAlUaGVyZSBhcmUgdGhyZWUgZGVmYXVsdCBzcGVlZCBzZXRzLCBhY2Vzc2libGUgYXMgaGFuZGxlczoKKyAqIAlGUzFMLEZTMU0sRlMxSDsgRlMyTCxGUzJNLEZTMkg7IEZTM0wsRlMzTSxGUzNICisgKgorICogCUFDUEkgRFNEVCBzd2l0Y2hlcyB3aGljaCBzZXQgaXMgaW4gdXNlIGRlcGVuZGluZyBvbiB2YXJpb3VzCisgKiAJZmFjdG9ycy4KKyAqCisgKiAJVFBBQ1BJX0ZBTl9XUl9UUEVDIGlzIGFsc28gYXZhaWxhYmxlIGFuZCBzaG91bGQgYmUgdXNlZCB0bworICogCWNvbW1hbmQgdGhlIGZhbi4gIFRoZSBYMzEvWDQwL1g0MSBzZWVtcyB0byBoYXZlIDggZmFuIGxldmVscywKKyAqIAlidXQgdGhlIEFDUEkgdGFibGVzIGp1c3QgbWVudGlvbiBsZXZlbCA3LgorICovCisKK3N0YXRpYyBlbnVtIGZhbl9zdGF0dXNfYWNjZXNzX21vZGUgZmFuX3N0YXR1c19hY2Nlc3NfbW9kZTsKK3N0YXRpYyBlbnVtIGZhbl9jb250cm9sX2FjY2Vzc19tb2RlIGZhbl9jb250cm9sX2FjY2Vzc19tb2RlOworc3RhdGljIGVudW0gZmFuX2NvbnRyb2xfY29tbWFuZHMgZmFuX2NvbnRyb2xfY29tbWFuZHM7CisKK3N0YXRpYyB1OCBmYW5fY29udHJvbF9pbml0aWFsX3N0YXR1czsKK3N0YXRpYyB1OCBmYW5fY29udHJvbF9kZXNpcmVkX2xldmVsOworCitzdGF0aWMgdm9pZCBmYW5fd2F0Y2hkb2dfZmlyZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKmlnbm9yZWQpOworc3RhdGljIGludCBmYW5fd2F0Y2hkb2dfbWF4aW50ZXJ2YWw7CitzdGF0aWMgREVDTEFSRV9ERUxBWUVEX1dPUksoZmFuX3dhdGNoZG9nX3Rhc2ssIGZhbl93YXRjaGRvZ19maXJlKTsKKworSUJNX0hBTkRMRShmYW5zLCBlYywgIkZBTlMiKTsJLyogWDMxLCBYNDAsIFg0MSAqLworSUJNX0hBTkRMRShnZmFuLCBlYywgIkdGQU4iLAkvKiA1NzAgKi8KKwkgICAiXFxGU1BEIiwJCS8qIDYwMGUveCwgNzcwZSwgNzcweCAqLworCSAgICk7CQkJLyogYWxsIG90aGVycyAqLworSUJNX0hBTkRMRShzZmFuLCBlYywgIlNGQU4iLAkvKiA1NzAgKi8KKwkgICAiSkZOUyIsCQkvKiA3NzB4LUpMICovCisJICAgKTsJCQkvKiBhbGwgb3RoZXJzICovCisKKy8qCisgKiBTWVNGUyBmYW4gbGF5b3V0OiBod21vbiBjb21wYXRpYmxlIChkZXZpY2UpCisgKgorICogcHdtKl9lbmFibGU6CisgKiAJMDogImRpc2VuZ2FnZWQiIG1vZGUKKyAqIAkxOiBtYW51YWwgbW9kZQorICogCTI6IG5hdGl2ZSBFQyAiYXV0byIgbW9kZSAocmVjb21tZW5kZWQsIGhhcmR3YXJlIGRlZmF1bHQpCisgKgorICogcHdtKjogc2V0IHNwZWVkIGluIG1hbnVhbCBtb2RlLCBpZ25vcmVkIG90aGVyd2lzZS4KKyAqIAkwIGlzIGxldmVsIDA7IDI1NSBpcyBsZXZlbCA3LiBJbnRlcm1lZGlhdGUgcG9pbnRzIGRvbmUgd2l0aCBsaW5lYXIKKyAqIAlpbnRlcnBvbGF0aW9uLgorICoKKyAqIGZhbipfaW5wdXQ6IHRhY2hvbWV0ZXIgcmVhZGluZywgUlBNCisgKgorICoKKyAqIFNZU0ZTIGZhbiBsYXlvdXQ6IGV4dGVuc2lvbnMKKyAqCisgKiBmYW5fd2F0Y2hkb2cgKGRyaXZlcik6CisgKiAJZmFuIHdhdGNoZG9nIGludGVydmFsIGluIHNlY29uZHMsIDAgZGlzYWJsZXMgKGRlZmF1bHQpLCBtYXggMTIwCisgKi8KKworLyogc3lzZnMgZmFuIHB3bTFfZW5hYmxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgc3NpemVfdCBmYW5fcHdtMV9lbmFibGVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgICBjaGFyICpidWYpCit7CisJaW50IHJlcywgbW9kZTsKKwl1OCBzdGF0dXM7CisKKwlyZXMgPSBmYW5fZ2V0X3N0YXR1c19zYWZlKCZzdGF0dXMpOworCWlmIChyZXMpCisJCXJldHVybiByZXM7CisKKwlpZiAodW5saWtlbHkodHBfZmVhdHVyZXMuZmFuX2N0cmxfc3RhdHVzX3VuZGVmKSkgeworCQlpZiAoc3RhdHVzICE9IGZhbl9jb250cm9sX2luaXRpYWxfc3RhdHVzKSB7CisJCQl0cF9mZWF0dXJlcy5mYW5fY3RybF9zdGF0dXNfdW5kZWYgPSAwOworCQl9IGVsc2UgeworCQkJLyogUmV0dXJuIG1vc3QgbGlrZWx5IHN0YXR1cy4gSW4gZmFjdCwgaXQKKwkJCSAqIG1pZ2h0IGJlIHRoZSBvbmx5IHBvc3NpYmxlIHN0YXR1cyAqLworCQkJc3RhdHVzID0gVFBfRUNfRkFOX0FVVE87CisJCX0KKwl9CisKKwlpZiAoc3RhdHVzICYgVFBfRUNfRkFOX0ZVTExTUEVFRCkgeworCQltb2RlID0gMDsKKwl9IGVsc2UgaWYgKHN0YXR1cyAmIFRQX0VDX0ZBTl9BVVRPKSB7CisJCW1vZGUgPSAyOworCX0gZWxzZQorCQltb2RlID0gMTsKKworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBtb2RlKTsKK30KKworc3RhdGljIHNzaXplX3QgZmFuX3B3bTFfZW5hYmxlX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJdW5zaWduZWQgbG9uZyB0OworCWludCByZXMsIGxldmVsOworCisJaWYgKHBhcnNlX3N0cnRvdWwoYnVmLCAyLCAmdCkpCisJCXJldHVybiAtRUlOVkFMOworCisJc3dpdGNoICh0KSB7CisJY2FzZSAwOgorCQlsZXZlbCA9IFRQX0VDX0ZBTl9GVUxMU1BFRUQ7CisJCWJyZWFrOworCWNhc2UgMToKKwkJbGV2ZWwgPSBUUEFDUElfRkFOX0xBU1RfTEVWRUw7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJbGV2ZWwgPSBUUF9FQ19GQU5fQVVUTzsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQkvKiByZXNlcnZlZCBmb3Igc29mdHdhcmUtY29udHJvbGxlZCBhdXRvIG1vZGUgKi8KKwkJcmV0dXJuIC1FTk9TWVM7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmVzID0gZmFuX3NldF9sZXZlbF9zYWZlKGxldmVsKTsKKwlpZiAocmVzID09IC1FTlhJTykKKwkJcmV0dXJuIC1FSU5WQUw7CisJZWxzZSBpZiAocmVzIDwgMCkKKwkJcmV0dXJuIHJlczsKKworCWZhbl93YXRjaGRvZ19yZXNldCgpOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2X2F0dHJfZmFuX3B3bTFfZW5hYmxlID0KKwlfX0FUVFIocHdtMV9lbmFibGUsIFNfSVdVU1IgfCBTX0lSVUdPLAorCQlmYW5fcHdtMV9lbmFibGVfc2hvdywgZmFuX3B3bTFfZW5hYmxlX3N0b3JlKTsKKworLyogc3lzZnMgZmFuIHB3bTEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgc3NpemVfdCBmYW5fcHdtMV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgIGNoYXIgKmJ1ZikKK3sKKwlpbnQgcmVzOworCXU4IHN0YXR1czsKKworCXJlcyA9IGZhbl9nZXRfc3RhdHVzX3NhZmUoJnN0YXR1cyk7CisJaWYgKHJlcykKKwkJcmV0dXJuIHJlczsKKworCWlmICh1bmxpa2VseSh0cF9mZWF0dXJlcy5mYW5fY3RybF9zdGF0dXNfdW5kZWYpKSB7CisJCWlmIChzdGF0dXMgIT0gZmFuX2NvbnRyb2xfaW5pdGlhbF9zdGF0dXMpIHsKKwkJCXRwX2ZlYXR1cmVzLmZhbl9jdHJsX3N0YXR1c191bmRlZiA9IDA7CisJCX0gZWxzZSB7CisJCQlzdGF0dXMgPSBUUF9FQ19GQU5fQVVUTzsKKwkJfQorCX0KKworCWlmICgoc3RhdHVzICYKKwkgICAgIChUUF9FQ19GQU5fQVVUTyB8IFRQX0VDX0ZBTl9GVUxMU1BFRUQpKSAhPSAwKQorCQlzdGF0dXMgPSBmYW5fY29udHJvbF9kZXNpcmVkX2xldmVsOworCisJaWYgKHN0YXR1cyA+IDcpCisJCXN0YXR1cyA9IDc7CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIldVxuIiwgKHN0YXR1cyAqIDI1NSkgLyA3KTsKK30KKworc3RhdGljIHNzaXplX3QgZmFuX3B3bTFfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwl1bnNpZ25lZCBsb25nIHM7CisJaW50IHJjOworCXU4IHN0YXR1cywgbmV3bGV2ZWw7CisKKwlpZiAocGFyc2Vfc3RydG91bChidWYsIDI1NSwgJnMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIHNjYWxlIGRvd24gZnJvbSAwLTI1NSB0byAwLTcgKi8KKwluZXdsZXZlbCA9IChzID4+IDUpICYgMHgwNzsKKworCXJjID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZmYW5fbXV0ZXgpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCXJjID0gZmFuX2dldF9zdGF0dXMoJnN0YXR1cyk7CisJaWYgKCFyYyAmJiAoc3RhdHVzICYKKwkJICAgIChUUF9FQ19GQU5fQVVUTyB8IFRQX0VDX0ZBTl9GVUxMU1BFRUQpKSA9PSAwKSB7CisJCXJjID0gZmFuX3NldF9sZXZlbChuZXdsZXZlbCk7CisJCWlmIChyYyA9PSAtRU5YSU8pCisJCQlyYyA9IC1FSU5WQUw7CisJCWVsc2UgaWYgKCFyYykgeworCQkJZmFuX3VwZGF0ZV9kZXNpcmVkX2xldmVsKG5ld2xldmVsKTsKKwkJCWZhbl93YXRjaGRvZ19yZXNldCgpOworCQl9CisJfQorCisJbXV0ZXhfdW5sb2NrKCZmYW5fbXV0ZXgpOworCXJldHVybiAocmMpPyByYyA6IGNvdW50OworfQorCitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2X2F0dHJfZmFuX3B3bTEgPQorCV9fQVRUUihwd20xLCBTX0lXVVNSIHwgU19JUlVHTywKKwkJZmFuX3B3bTFfc2hvdywgZmFuX3B3bTFfc3RvcmUpOworCisvKiBzeXNmcyBmYW4gZmFuMV9pbnB1dCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBzc2l6ZV90IGZhbl9mYW4xX2lucHV0X3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICBjaGFyICpidWYpCit7CisJaW50IHJlczsKKwl1bnNpZ25lZCBpbnQgc3BlZWQ7CisKKwlyZXMgPSBmYW5fZ2V0X3NwZWVkKCZzcGVlZCk7CisJaWYgKHJlcyA8IDApCisJCXJldHVybiByZXM7CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIldVxuIiwgc3BlZWQpOworfQorCitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2X2F0dHJfZmFuX2ZhbjFfaW5wdXQgPQorCV9fQVRUUihmYW4xX2lucHV0LCBTX0lSVUdPLAorCQlmYW5fZmFuMV9pbnB1dF9zaG93LCBOVUxMKTsKKworLyogc3lzZnMgZmFuIGZhbl93YXRjaGRvZyAoZHJpdmVyKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgc3NpemVfdCBmYW5fZmFuX3dhdGNoZG9nX3Nob3coc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiwKKwkJCQkgICAgIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIldVxuIiwgZmFuX3dhdGNoZG9nX21heGludGVydmFsKTsKK30KKworc3RhdGljIHNzaXplX3QgZmFuX2Zhbl93YXRjaGRvZ19zdG9yZShzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2LAorCQkJCSAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXVuc2lnbmVkIGxvbmcgdDsKKworCWlmIChwYXJzZV9zdHJ0b3VsKGJ1ZiwgMTIwLCAmdCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFmYW5fY29udHJvbF9hbGxvd2VkKQorCQlyZXR1cm4gLUVQRVJNOworCisJZmFuX3dhdGNoZG9nX21heGludGVydmFsID0gdDsKKwlmYW5fd2F0Y2hkb2dfcmVzZXQoKTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIERSSVZFUl9BVFRSKGZhbl93YXRjaGRvZywgU19JV1VTUiB8IFNfSVJVR08sCisJCWZhbl9mYW5fd2F0Y2hkb2dfc2hvdywgZmFuX2Zhbl93YXRjaGRvZ19zdG9yZSk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmZhbl9hdHRyaWJ1dGVzW10gPSB7CisJJmRldl9hdHRyX2Zhbl9wd20xX2VuYWJsZS5hdHRyLCAmZGV2X2F0dHJfZmFuX3B3bTEuYXR0ciwKKwkmZGV2X2F0dHJfZmFuX2ZhbjFfaW5wdXQuYXR0ciwKKwlOVUxMCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBmYW5fYXR0cl9ncm91cCA9IHsKKwkuYXR0cnMgPSBmYW5fYXR0cmlidXRlcywKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGZhbl9pbml0KHN0cnVjdCBpYm1faW5pdF9zdHJ1Y3QgKmlpYm0pCit7CisJaW50IHJjOworCisJdmRiZ19wcmludGsoVFBBQ1BJX0RCR19JTklULCAiaW5pdGlhbGl6aW5nIGZhbiBzdWJkcml2ZXJcbiIpOworCisJbXV0ZXhfaW5pdCgmZmFuX211dGV4KTsKKwlmYW5fc3RhdHVzX2FjY2Vzc19tb2RlID0gVFBBQ1BJX0ZBTl9OT05FOworCWZhbl9jb250cm9sX2FjY2Vzc19tb2RlID0gVFBBQ1BJX0ZBTl9XUl9OT05FOworCWZhbl9jb250cm9sX2NvbW1hbmRzID0gMDsKKwlmYW5fd2F0Y2hkb2dfbWF4aW50ZXJ2YWwgPSAwOworCXRwX2ZlYXR1cmVzLmZhbl9jdHJsX3N0YXR1c191bmRlZiA9IDA7CisJZmFuX2NvbnRyb2xfZGVzaXJlZF9sZXZlbCA9IDc7CisKKwlJQk1fQUNQSUhBTkRMRV9JTklUKGZhbnMpOworCUlCTV9BQ1BJSEFORExFX0lOSVQoZ2Zhbik7CisJSUJNX0FDUElIQU5ETEVfSU5JVChzZmFuKTsKKworCWlmIChnZmFuX2hhbmRsZSkgeworCQkvKiA1NzAsIDYwMGUveCwgNzcwZSwgNzcweCAqLworCQlmYW5fc3RhdHVzX2FjY2Vzc19tb2RlID0gVFBBQ1BJX0ZBTl9SRF9BQ1BJX0dGQU47CisJfSBlbHNlIHsKKwkJLyogYWxsIG90aGVyIFRoaW5rUGFkczogbm90ZSB0aGF0IGV2ZW4gb2xkLXN0eWxlCisJCSAqIFRoaW5rUGFkIEVDcyBzdXBwb3J0cyB0aGUgZmFuIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwkJaWYgKGxpa2VseShhY3BpX2VjX3JlYWQoZmFuX3N0YXR1c19vZmZzZXQsCisJCQkJCSZmYW5fY29udHJvbF9pbml0aWFsX3N0YXR1cykpKSB7CisJCQlmYW5fc3RhdHVzX2FjY2Vzc19tb2RlID0gVFBBQ1BJX0ZBTl9SRF9UUEVDOworCisJCQkvKiBJbiBzb21lIFRoaW5rUGFkcywgbmVpdGhlciB0aGUgRUMgbm9yIHRoZSBBQ1BJCisJCQkgKiBEU0RUIGluaXRpYWxpemUgdGhlIGZhbiBzdGF0dXMsIGFuZCBpdCBlbmRzIHVwCisJCQkgKiBiZWluZyBzZXQgdG8gMHgwNyB3aGVuIGl0ICpjb3VsZCogYmUgZWl0aGVyCisJCQkgKiAweDA3IG9yIDB4ODAuCisJCQkgKgorCQkJICogRW5hYmxlIGZvciBUUC0xWSAoVDQzKSwgVFAtNzggKFI1MWUpLAorCQkJICogVFAtNzYgKFI1MiksIFRQLTcwIChUNDMsIFI1MiksIHdoaWNoIGFyZSBrbm93bgorCQkJICogdG8gYmUgYnVnZ3kuICovCisJCQlpZiAoZmFuX2NvbnRyb2xfaW5pdGlhbF9zdGF0dXMgPT0gMHgwNyAmJgorCQkJICAgIGlibV90aGlua3BhZF9lY19mb3VuZCAmJgorCQkJICAgICgoaWJtX3RoaW5rcGFkX2VjX2ZvdW5kWzBdID09ICcxJyAmJgorCQkJICAgICAgaWJtX3RoaW5rcGFkX2VjX2ZvdW5kWzFdID09ICdZJykgfHwKKwkJCSAgICAgKGlibV90aGlua3BhZF9lY19mb3VuZFswXSA9PSAnNycgJiYKKwkJCSAgICAgIChpYm1fdGhpbmtwYWRfZWNfZm91bmRbMV0gPT0gJzYnIHx8CisJCQkgICAgICAgaWJtX3RoaW5rcGFkX2VjX2ZvdW5kWzFdID09ICc4JyB8fAorCQkJICAgICAgIGlibV90aGlua3BhZF9lY19mb3VuZFsxXSA9PSAnMCcpKQorCQkJICAgICkpIHsKKwkJCQlwcmludGsoSUJNX05PVElDRQorCQkJCSAgICAgICAiZmFuX2luaXQ6IGluaXRpYWwgZmFuIHN0YXR1cyBpcyAiCisJCQkJICAgICAgICJ1bmtub3duLCBhc3N1bWluZyBpdCBpcyBpbiBhdXRvICIKKwkJCQkgICAgICAgIm1vZGVcbiIpOworCQkJCXRwX2ZlYXR1cmVzLmZhbl9jdHJsX3N0YXR1c191bmRlZiA9IDE7CisJCQl9CisJCX0gZWxzZSB7CisJCQlwcmludGsoSUJNX0VSUgorCQkJICAgICAgICJUaGlua1BhZCBBQ1BJIEVDIGFjY2VzcyBtaXNiZWhhdmluZywgIgorCQkJICAgICAgICJmYW4gc3RhdHVzIGFuZCBjb250cm9sIHVuYXZhaWxhYmxlXG4iKTsKKwkJCXJldHVybiAxOworCQl9CisJfQorCisJaWYgKHNmYW5faGFuZGxlKSB7CisJCS8qIDU3MCwgNzcweC1KTCAqLworCQlmYW5fY29udHJvbF9hY2Nlc3NfbW9kZSA9IFRQQUNQSV9GQU5fV1JfQUNQSV9TRkFOOworCQlmYW5fY29udHJvbF9jb21tYW5kcyB8PQorCQkgICAgVFBBQ1BJX0ZBTl9DTURfTEVWRUwgfCBUUEFDUElfRkFOX0NNRF9FTkFCTEU7CisJfSBlbHNlIHsKKwkJaWYgKCFnZmFuX2hhbmRsZSkgeworCQkJLyogZ2ZhbiB3aXRob3V0IHNmYW4gbWVhbnMgbm8gZmFuIGNvbnRyb2wgKi8KKwkJCS8qIGFsbCBvdGhlciBtb2RlbHMgaW1wbGVtZW50IFRQIEVDIDB4MmYgY29udHJvbCAqLworCisJCQlpZiAoZmFuc19oYW5kbGUpIHsKKwkJCQkvKiBYMzEsIFg0MCwgWDQxICovCisJCQkJZmFuX2NvbnRyb2xfYWNjZXNzX21vZGUgPQorCQkJCSAgICBUUEFDUElfRkFOX1dSX0FDUElfRkFOUzsKKwkJCQlmYW5fY29udHJvbF9jb21tYW5kcyB8PQorCQkJCSAgICBUUEFDUElfRkFOX0NNRF9TUEVFRCB8CisJCQkJICAgIFRQQUNQSV9GQU5fQ01EX0xFVkVMIHwKKwkJCQkgICAgVFBBQ1BJX0ZBTl9DTURfRU5BQkxFOworCQkJfSBlbHNlIHsKKwkJCQlmYW5fY29udHJvbF9hY2Nlc3NfbW9kZSA9IFRQQUNQSV9GQU5fV1JfVFBFQzsKKwkJCQlmYW5fY29udHJvbF9jb21tYW5kcyB8PQorCQkJCSAgICBUUEFDUElfRkFOX0NNRF9MRVZFTCB8CisJCQkJICAgIFRQQUNQSV9GQU5fQ01EX0VOQUJMRTsKKwkJCX0KKwkJfQorCX0KKworCXZkYmdfcHJpbnRrKFRQQUNQSV9EQkdfSU5JVCwgImZhbiBpcyAlcywgbW9kZXMgJWQsICVkXG4iLAorCQlzdHJfc3VwcG9ydGVkKGZhbl9zdGF0dXNfYWNjZXNzX21vZGUgIT0gVFBBQ1BJX0ZBTl9OT05FIHx8CisJCSAgZmFuX2NvbnRyb2xfYWNjZXNzX21vZGUgIT0gVFBBQ1BJX0ZBTl9XUl9OT05FKSwKKwkJZmFuX3N0YXR1c19hY2Nlc3NfbW9kZSwgZmFuX2NvbnRyb2xfYWNjZXNzX21vZGUpOworCisJLyogZmFuIGNvbnRyb2wgbWFzdGVyIHN3aXRjaCAqLworCWlmICghZmFuX2NvbnRyb2xfYWxsb3dlZCkgeworCQlmYW5fY29udHJvbF9hY2Nlc3NfbW9kZSA9IFRQQUNQSV9GQU5fV1JfTk9ORTsKKwkJZmFuX2NvbnRyb2xfY29tbWFuZHMgPSAwOworCQlkYmdfcHJpbnRrKFRQQUNQSV9EQkdfSU5JVCwKKwkJCSAgICJmYW4gY29udHJvbCBmZWF0dXJlcyBkaXNhYmxlZCBieSBwYXJhbWV0ZXJcbiIpOworCX0KKworCS8qIHVwZGF0ZSBmYW5fY29udHJvbF9kZXNpcmVkX2xldmVsICovCisJaWYgKGZhbl9zdGF0dXNfYWNjZXNzX21vZGUgIT0gVFBBQ1BJX0ZBTl9OT05FKQorCQlmYW5fZ2V0X3N0YXR1c19zYWZlKE5VTEwpOworCisJaWYgKGZhbl9zdGF0dXNfYWNjZXNzX21vZGUgIT0gVFBBQ1BJX0ZBTl9OT05FIHx8CisJICAgIGZhbl9jb250cm9sX2FjY2Vzc19tb2RlICE9IFRQQUNQSV9GQU5fV1JfTk9ORSkgeworCQlyYyA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmdHBhY3BpX3BkZXYtPmRldi5rb2JqLAorCQkJCQkgJmZhbl9hdHRyX2dyb3VwKTsKKwkJaWYgKCEocmMgPCAwKSkKKwkJCXJjID0gZHJpdmVyX2NyZWF0ZV9maWxlKCZ0cGFjcGlfcGRyaXZlci5kcml2ZXIsCisJCQkJCSZkcml2ZXJfYXR0cl9mYW5fd2F0Y2hkb2cpOworCQlpZiAocmMgPCAwKQorCQkJcmV0dXJuIHJjOworCQlyZXR1cm4gMDsKKwl9IGVsc2UKKwkJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBDYWxsIHdpdGggZmFuX211dGV4IGhlbGQKKyAqLworc3RhdGljIHZvaWQgZmFuX3VwZGF0ZV9kZXNpcmVkX2xldmVsKHU4IHN0YXR1cykKK3sKKwlpZiAoKHN0YXR1cyAmCisJICAgICAoVFBfRUNfRkFOX0FVVE8gfCBUUF9FQ19GQU5fRlVMTFNQRUVEKSkgPT0gMCkgeworCQlpZiAoc3RhdHVzID4gNykKKwkJCWZhbl9jb250cm9sX2Rlc2lyZWRfbGV2ZWwgPSA3OworCQllbHNlCisJCQlmYW5fY29udHJvbF9kZXNpcmVkX2xldmVsID0gc3RhdHVzOworCX0KK30KKworc3RhdGljIGludCBmYW5fZ2V0X3N0YXR1cyh1OCAqc3RhdHVzKQoreworCXU4IHM7CisKKwkvKiBUT0RPOgorCSAqIEFkZCBUUEFDUElfRkFOX1JEX0FDUElfRkFOUyA/ICovCisKKwlzd2l0Y2ggKGZhbl9zdGF0dXNfYWNjZXNzX21vZGUpIHsKKwljYXNlIFRQQUNQSV9GQU5fUkRfQUNQSV9HRkFOOgorCQkvKiA1NzAsIDYwMGUveCwgNzcwZSwgNzcweCAqLworCisJCWlmICh1bmxpa2VseSghYWNwaV9ldmFsZihnZmFuX2hhbmRsZSwgJnMsIE5VTEwsICJkIikpKQorCQkJcmV0dXJuIC1FSU87CisKKwkJaWYgKGxpa2VseShzdGF0dXMpKQorCQkJKnN0YXR1cyA9IHMgJiAweDA3OworCisJCWJyZWFrOworCisJY2FzZSBUUEFDUElfRkFOX1JEX1RQRUM6CisJCS8qIGFsbCBleGNlcHQgNTcwLCA2MDBlL3gsIDc3MGUsIDc3MHggKi8KKwkJaWYgKHVubGlrZWx5KCFhY3BpX2VjX3JlYWQoZmFuX3N0YXR1c19vZmZzZXQsICZzKSkpCisJCQlyZXR1cm4gLUVJTzsKKworCQlpZiAobGlrZWx5KHN0YXR1cykpCisJCQkqc3RhdHVzID0gczsKKworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5YSU87CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmFuX2dldF9zdGF0dXNfc2FmZSh1OCAqc3RhdHVzKQoreworCWludCByYzsKKwl1OCBzOworCisJcmMgPSBtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmZhbl9tdXRleCk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCXJjID0gZmFuX2dldF9zdGF0dXMoJnMpOworCWlmICghcmMpCisJCWZhbl91cGRhdGVfZGVzaXJlZF9sZXZlbChzKTsKKwltdXRleF91bmxvY2soJmZhbl9tdXRleCk7CisKKwlpZiAoc3RhdHVzKQorCQkqc3RhdHVzID0gczsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgZmFuX2V4aXQodm9pZCkKK3sKKwl2ZGJnX3ByaW50ayhUUEFDUElfREJHX0VYSVQsICJjYW5jZWxsaW5nIGFueSBwZW5kaW5nIGZhbiB3YXRjaGRvZyB0YXNrc1xuIik7CisKKwkvKiBGSVhNRTogY2FuIHdlIHJlYWxseSBkbyB0aGlzIHVuY29uZGl0aW9uYWxseT8gKi8KKwlzeXNmc19yZW1vdmVfZ3JvdXAoJnRwYWNwaV9wZGV2LT5kZXYua29iaiwgJmZhbl9hdHRyX2dyb3VwKTsKKwlkcml2ZXJfcmVtb3ZlX2ZpbGUoJnRwYWNwaV9wZHJpdmVyLmRyaXZlciwgJmRyaXZlcl9hdHRyX2Zhbl93YXRjaGRvZyk7CisKKwljYW5jZWxfZGVsYXllZF93b3JrKCZmYW5fd2F0Y2hkb2dfdGFzayk7CisJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKK30KKworc3RhdGljIGludCBmYW5fZ2V0X3NwZWVkKHVuc2lnbmVkIGludCAqc3BlZWQpCit7CisJdTggaGksIGxvOworCisJc3dpdGNoIChmYW5fc3RhdHVzX2FjY2Vzc19tb2RlKSB7CisJY2FzZSBUUEFDUElfRkFOX1JEX1RQRUM6CisJCS8qIGFsbCBleGNlcHQgNTcwLCA2MDBlL3gsIDc3MGUsIDc3MHggKi8KKwkJaWYgKHVubGlrZWx5KCFhY3BpX2VjX3JlYWQoZmFuX3JwbV9vZmZzZXQsICZsbykgfHwKKwkJCSAgICAgIWFjcGlfZWNfcmVhZChmYW5fcnBtX29mZnNldCArIDEsICZoaSkpKQorCQkJcmV0dXJuIC1FSU87CisKKwkJaWYgKGxpa2VseShzcGVlZCkpCisJCQkqc3BlZWQgPSAoaGkgPDwgOCkgfCBsbzsKKworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5YSU87CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGZhbl93YXRjaGRvZ19maXJlKHN0cnVjdCB3b3JrX3N0cnVjdCAqaWdub3JlZCkKK3sKKwlpbnQgcmM7CisKKwlwcmludGsoSUJNX05PVElDRSAiZmFuIHdhdGNoZG9nOiBlbmFibGluZyBmYW5cbiIpOworCXJjID0gZmFuX3NldF9lbmFibGUoKTsKKwlpZiAocmMgPCAwKSB7CisJCXByaW50ayhJQk1fRVJSICJmYW4gd2F0Y2hkb2c6IGVycm9yICVkIHdoaWxlIGVuYWJsaW5nIGZhbiwgIgorCQkJIndpbGwgdHJ5IGFnYWluIGxhdGVyLi4uXG4iLCAtcmMpOworCQkvKiByZXNjaGVkdWxlIGZvciBsYXRlciAqLworCQlmYW5fd2F0Y2hkb2dfcmVzZXQoKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGZhbl93YXRjaGRvZ19yZXNldCh2b2lkKQoreworCXN0YXRpYyBpbnQgZmFuX3dhdGNoZG9nX2FjdGl2ZSA9IDA7CisKKwlpZiAoZmFuX2NvbnRyb2xfYWNjZXNzX21vZGUgPT0gVFBBQ1BJX0ZBTl9XUl9OT05FKQorCQlyZXR1cm47CisKKwlpZiAoZmFuX3dhdGNoZG9nX2FjdGl2ZSkKKwkJY2FuY2VsX2RlbGF5ZWRfd29yaygmZmFuX3dhdGNoZG9nX3Rhc2spOworCisJaWYgKGZhbl93YXRjaGRvZ19tYXhpbnRlcnZhbCA+IDApIHsKKwkJZmFuX3dhdGNoZG9nX2FjdGl2ZSA9IDE7CisJCWlmICghc2NoZWR1bGVfZGVsYXllZF93b3JrKCZmYW5fd2F0Y2hkb2dfdGFzaywKKwkJCQltc2Vjc190b19qaWZmaWVzKGZhbl93YXRjaGRvZ19tYXhpbnRlcnZhbAorCQkJCQkJICogMTAwMCkpKSB7CisJCQlwcmludGsoSUJNX0VSUiAiZmFpbGVkIHRvIHNjaGVkdWxlIHRoZSBmYW4gd2F0Y2hkb2csICIKKwkJCSAgICAgICAid2F0Y2hkb2cgd2lsbCBub3QgdHJpZ2dlclxuIik7CisJCX0KKwl9IGVsc2UKKwkJZmFuX3dhdGNoZG9nX2FjdGl2ZSA9IDA7Cit9CisKK3N0YXRpYyBpbnQgZmFuX3NldF9sZXZlbChpbnQgbGV2ZWwpCit7CisJaWYgKCFmYW5fY29udHJvbF9hbGxvd2VkKQorCQlyZXR1cm4gLUVQRVJNOworCisJc3dpdGNoIChmYW5fY29udHJvbF9hY2Nlc3NfbW9kZSkgeworCWNhc2UgVFBBQ1BJX0ZBTl9XUl9BQ1BJX1NGQU46CisJCWlmIChsZXZlbCA+PSAwICYmIGxldmVsIDw9IDcpIHsKKwkJCWlmICghYWNwaV9ldmFsZihzZmFuX2hhbmRsZSwgTlVMTCwgTlVMTCwgInZkIiwgbGV2ZWwpKQorCQkJCXJldHVybiAtRUlPOworCQl9IGVsc2UKKwkJCXJldHVybiAtRUlOVkFMOworCQlicmVhazsKKworCWNhc2UgVFBBQ1BJX0ZBTl9XUl9BQ1BJX0ZBTlM6CisJY2FzZSBUUEFDUElfRkFOX1dSX1RQRUM6CisJCWlmICgobGV2ZWwgIT0gVFBfRUNfRkFOX0FVVE8pICYmCisJCSAgICAobGV2ZWwgIT0gVFBfRUNfRkFOX0ZVTExTUEVFRCkgJiYKKwkJICAgICgobGV2ZWwgPCAwKSB8fCAobGV2ZWwgPiA3KSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkvKiBzYWZldHkgbmV0IHNob3VsZCB0aGUgRUMgbm90IHN1cHBvcnQgQVVUTworCQkgKiBvciBGVUxMU1BFRUQgbW9kZSBiaXRzIGFuZCBqdXN0IGlnbm9yZSB0aGVtICovCisJCWlmIChsZXZlbCAmIFRQX0VDX0ZBTl9GVUxMU1BFRUQpCisJCQlsZXZlbCB8PSA3OwkvKiBzYWZldHkgbWluIHNwZWVkIDcgKi8KKwkJZWxzZSBpZiAobGV2ZWwgJiBUUF9FQ19GQU5fRlVMTFNQRUVEKQorCQkJbGV2ZWwgfD0gNDsJLyogc2FmZXR5IG1pbiBzcGVlZCA0ICovCisKKwkJaWYgKCFhY3BpX2VjX3dyaXRlKGZhbl9zdGF0dXNfb2Zmc2V0LCBsZXZlbCkpCisJCQlyZXR1cm4gLUVJTzsKKwkJZWxzZQorCQkJdHBfZmVhdHVyZXMuZmFuX2N0cmxfc3RhdHVzX3VuZGVmID0gMDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOWElPOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmYW5fc2V0X2xldmVsX3NhZmUoaW50IGxldmVsKQoreworCWludCByYzsKKworCWlmICghZmFuX2NvbnRyb2xfYWxsb3dlZCkKKwkJcmV0dXJuIC1FUEVSTTsKKworCXJjID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZmYW5fbXV0ZXgpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCWlmIChsZXZlbCA9PSBUUEFDUElfRkFOX0xBU1RfTEVWRUwpCisJCWxldmVsID0gZmFuX2NvbnRyb2xfZGVzaXJlZF9sZXZlbDsKKworCXJjID0gZmFuX3NldF9sZXZlbChsZXZlbCk7CisJaWYgKCFyYykKKwkJZmFuX3VwZGF0ZV9kZXNpcmVkX2xldmVsKGxldmVsKTsKKworCW11dGV4X3VubG9jaygmZmFuX211dGV4KTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgZmFuX3NldF9lbmFibGUodm9pZCkKK3sKKwl1OCBzOworCWludCByYzsKKworCWlmICghZmFuX2NvbnRyb2xfYWxsb3dlZCkKKwkJcmV0dXJuIC1FUEVSTTsKKworCXJjID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZmYW5fbXV0ZXgpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCXN3aXRjaCAoZmFuX2NvbnRyb2xfYWNjZXNzX21vZGUpIHsKKwljYXNlIFRQQUNQSV9GQU5fV1JfQUNQSV9GQU5TOgorCWNhc2UgVFBBQ1BJX0ZBTl9XUl9UUEVDOgorCQlyYyA9IGZhbl9nZXRfc3RhdHVzKCZzKTsKKwkJaWYgKHJjIDwgMCkKKwkJCWJyZWFrOworCisJCS8qIERvbid0IGdvIG91dCBvZiBlbWVyZ2VuY3kgZmFuIG1vZGUgKi8KKwkJaWYgKHMgIT0gNykgeworCQkJcyAmPSAweDA3OworCQkJcyB8PSBUUF9FQ19GQU5fQVVUTyB8IDQ7IC8qIG1pbiBmYW4gc3BlZWQgNCAqLworCQl9CisKKwkJaWYgKCFhY3BpX2VjX3dyaXRlKGZhbl9zdGF0dXNfb2Zmc2V0LCBzKSkKKwkJCXJjID0gLUVJTzsKKwkJZWxzZSB7CisJCQl0cF9mZWF0dXJlcy5mYW5fY3RybF9zdGF0dXNfdW5kZWYgPSAwOworCQkJcmMgPSAwOworCQl9CisJCWJyZWFrOworCisJY2FzZSBUUEFDUElfRkFOX1dSX0FDUElfU0ZBTjoKKwkJcmMgPSBmYW5fZ2V0X3N0YXR1cygmcyk7CisJCWlmIChyYyA8IDApCisJCQlicmVhazsKKworCQlzICY9IDB4MDc7CisKKwkJLyogU2V0IGZhbiB0byBhdCBsZWFzdCBsZXZlbCA0ICovCisJCXMgfD0gNDsKKworCQlpZiAoIWFjcGlfZXZhbGYoc2Zhbl9oYW5kbGUsIE5VTEwsIE5VTEwsICJ2ZCIsIHMpKQorCQkJcmM9IC1FSU87CisJCWVsc2UKKwkJCXJjID0gMDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyYyA9IC1FTlhJTzsKKwl9CisKKwltdXRleF91bmxvY2soJmZhbl9tdXRleCk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGZhbl9zZXRfZGlzYWJsZSh2b2lkKQoreworCWludCByYzsKKworCWlmICghZmFuX2NvbnRyb2xfYWxsb3dlZCkKKwkJcmV0dXJuIC1FUEVSTTsKKworCXJjID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZmYW5fbXV0ZXgpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCXJjID0gMDsKKwlzd2l0Y2ggKGZhbl9jb250cm9sX2FjY2Vzc19tb2RlKSB7CisJY2FzZSBUUEFDUElfRkFOX1dSX0FDUElfRkFOUzoKKwljYXNlIFRQQUNQSV9GQU5fV1JfVFBFQzoKKwkJaWYgKCFhY3BpX2VjX3dyaXRlKGZhbl9zdGF0dXNfb2Zmc2V0LCAweDAwKSkKKwkJCXJjID0gLUVJTzsKKwkJZWxzZSB7CisJCQlmYW5fY29udHJvbF9kZXNpcmVkX2xldmVsID0gMDsKKwkJCXRwX2ZlYXR1cmVzLmZhbl9jdHJsX3N0YXR1c191bmRlZiA9IDA7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFRQQUNQSV9GQU5fV1JfQUNQSV9TRkFOOgorCQlpZiAoIWFjcGlfZXZhbGYoc2Zhbl9oYW5kbGUsIE5VTEwsIE5VTEwsICJ2ZCIsIDB4MDApKQorCQkJcmMgPSAtRUlPOworCQllbHNlCisJCQlmYW5fY29udHJvbF9kZXNpcmVkX2xldmVsID0gMDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyYyA9IC1FTlhJTzsKKwl9CisKKworCW11dGV4X3VubG9jaygmZmFuX211dGV4KTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgZmFuX3NldF9zcGVlZChpbnQgc3BlZWQpCit7CisJaW50IHJjOworCisJaWYgKCFmYW5fY29udHJvbF9hbGxvd2VkKQorCQlyZXR1cm4gLUVQRVJNOworCisJcmMgPSBtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmZhbl9tdXRleCk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJcmMgPSAwOworCXN3aXRjaCAoZmFuX2NvbnRyb2xfYWNjZXNzX21vZGUpIHsKKwljYXNlIFRQQUNQSV9GQU5fV1JfQUNQSV9GQU5TOgorCQlpZiAoc3BlZWQgPj0gMCAmJiBzcGVlZCA8PSA2NTUzNSkgeworCQkJaWYgKCFhY3BpX2V2YWxmKGZhbnNfaGFuZGxlLCBOVUxMLCBOVUxMLCAidmRkZCIsCisJCQkJCXNwZWVkLCBzcGVlZCwgc3BlZWQpKQorCQkJCXJjID0gLUVJTzsKKwkJfSBlbHNlCisJCQlyYyA9IC1FSU5WQUw7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmMgPSAtRU5YSU87CisJfQorCisJbXV0ZXhfdW5sb2NrKCZmYW5fbXV0ZXgpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBmYW5fcmVhZChjaGFyICpwKQoreworCWludCBsZW4gPSAwOworCWludCByYzsKKwl1OCBzdGF0dXM7CisJdW5zaWduZWQgaW50IHNwZWVkID0gMDsKKworCXN3aXRjaCAoZmFuX3N0YXR1c19hY2Nlc3NfbW9kZSkgeworCWNhc2UgVFBBQ1BJX0ZBTl9SRF9BQ1BJX0dGQU46CisJCS8qIDU3MCwgNjAwZS94LCA3NzBlLCA3NzB4ICovCisJCWlmICgocmMgPSBmYW5fZ2V0X3N0YXR1c19zYWZlKCZzdGF0dXMpKSA8IDApCisJCQlyZXR1cm4gcmM7CisKKwkJbGVuICs9IHNwcmludGYocCArIGxlbiwgInN0YXR1czpcdFx0JXNcbiIKKwkJCSAgICAgICAibGV2ZWw6XHRcdCVkXG4iLAorCQkJICAgICAgIChzdGF0dXMgIT0gMCkgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiLCBzdGF0dXMpOworCQlicmVhazsKKworCWNhc2UgVFBBQ1BJX0ZBTl9SRF9UUEVDOgorCQkvKiBhbGwgZXhjZXB0IDU3MCwgNjAwZS94LCA3NzBlLCA3NzB4ICovCisJCWlmICgocmMgPSBmYW5fZ2V0X3N0YXR1c19zYWZlKCZzdGF0dXMpKSA8IDApCisJCQlyZXR1cm4gcmM7CisKKwkJaWYgKHVubGlrZWx5KHRwX2ZlYXR1cmVzLmZhbl9jdHJsX3N0YXR1c191bmRlZikpIHsKKwkJCWlmIChzdGF0dXMgIT0gZmFuX2NvbnRyb2xfaW5pdGlhbF9zdGF0dXMpCisJCQkJdHBfZmVhdHVyZXMuZmFuX2N0cmxfc3RhdHVzX3VuZGVmID0gMDsKKwkJCWVsc2UKKwkJCQkvKiBSZXR1cm4gbW9zdCBsaWtlbHkgc3RhdHVzLiBJbiBmYWN0LCBpdAorCQkJCSAqIG1pZ2h0IGJlIHRoZSBvbmx5IHBvc3NpYmxlIHN0YXR1cyAqLworCQkJCXN0YXR1cyA9IFRQX0VDX0ZBTl9BVVRPOworCQl9CisKKwkJbGVuICs9IHNwcmludGYocCArIGxlbiwgInN0YXR1czpcdFx0JXNcbiIsCisJCQkgICAgICAgKHN0YXR1cyAhPSAwKSA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOworCisJCWlmICgocmMgPSBmYW5fZ2V0X3NwZWVkKCZzcGVlZCkpIDwgMCkKKwkJCXJldHVybiByYzsKKworCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAic3BlZWQ6XHRcdCVkXG4iLCBzcGVlZCk7CisKKwkJaWYgKHN0YXR1cyAmIFRQX0VDX0ZBTl9GVUxMU1BFRUQpCisJCQkvKiBEaXNlbmdhZ2VkIG1vZGUgdGFrZXMgcHJlY2VkZW5jZSAqLworCQkJbGVuICs9IHNwcmludGYocCArIGxlbiwgImxldmVsOlx0XHRkaXNlbmdhZ2VkXG4iKTsKKwkJZWxzZSBpZiAoc3RhdHVzICYgVFBfRUNfRkFOX0FVVE8pCisJCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAibGV2ZWw6XHRcdGF1dG9cbiIpOworCQllbHNlCisJCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAibGV2ZWw6XHRcdCVkXG4iLCBzdGF0dXMpOworCQlicmVhazsKKworCWNhc2UgVFBBQ1BJX0ZBTl9OT05FOgorCWRlZmF1bHQ6CisJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJzdGF0dXM6XHRcdG5vdCBzdXBwb3J0ZWRcbiIpOworCX0KKworCWlmIChmYW5fY29udHJvbF9jb21tYW5kcyAmIFRQQUNQSV9GQU5fQ01EX0xFVkVMKSB7CisJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJjb21tYW5kczpcdGxldmVsIDxsZXZlbD4iKTsKKworCQlzd2l0Y2ggKGZhbl9jb250cm9sX2FjY2Vzc19tb2RlKSB7CisJCWNhc2UgVFBBQ1BJX0ZBTl9XUl9BQ1BJX1NGQU46CisJCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiICg8bGV2ZWw+IGlzIDAtNylcbiIpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICIgKDxsZXZlbD4gaXMgMC03LCAiCisJCQkJICAgICAgICJhdXRvLCBkaXNlbmdhZ2VkLCBmdWxsLXNwZWVkKVxuIik7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChmYW5fY29udHJvbF9jb21tYW5kcyAmIFRQQUNQSV9GQU5fQ01EX0VOQUJMRSkKKwkJbGVuICs9IHNwcmludGYocCArIGxlbiwgImNvbW1hbmRzOlx0ZW5hYmxlLCBkaXNhYmxlXG4iCisJCQkgICAgICAgImNvbW1hbmRzOlx0d2F0Y2hkb2cgPHRpbWVvdXQ+ICg8dGltZW91dD4gaXMgMCAob2ZmKSwgIgorCQkJICAgICAgICIxLTEyMCAoc2Vjb25kcykpXG4iKTsKKworCWlmIChmYW5fY29udHJvbF9jb21tYW5kcyAmIFRQQUNQSV9GQU5fQ01EX1NQRUVEKQorCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiY29tbWFuZHM6XHRzcGVlZCA8c3BlZWQ+IgorCQkJICAgICAgICIgKDxzcGVlZD4gaXMgMC02NTUzNSlcbiIpOworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIGludCBmYW5fd3JpdGVfY21kX2xldmVsKGNvbnN0IGNoYXIgKmNtZCwgaW50ICpyYykKK3sKKwlpbnQgbGV2ZWw7CisKKwlpZiAoc3RybGVuY21wKGNtZCwgImxldmVsIGF1dG8iKSA9PSAwKQorCQlsZXZlbCA9IFRQX0VDX0ZBTl9BVVRPOworCWVsc2UgaWYgKChzdHJsZW5jbXAoY21kLCAibGV2ZWwgZGlzZW5nYWdlZCIpID09IDApIHwKKwkgICAgICAgICAoc3RybGVuY21wKGNtZCwgImxldmVsIGZ1bGwtc3BlZWQiKSA9PSAwKSkKKwkJbGV2ZWwgPSBUUF9FQ19GQU5fRlVMTFNQRUVEOworCWVsc2UgaWYgKHNzY2FuZihjbWQsICJsZXZlbCAlZCIsICZsZXZlbCkgIT0gMSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoKCpyYyA9IGZhbl9zZXRfbGV2ZWxfc2FmZShsZXZlbCkpID09IC1FTlhJTykKKwkJcHJpbnRrKElCTV9FUlIgImxldmVsIGNvbW1hbmQgYWNjZXB0ZWQgZm9yIHVuc3VwcG9ydGVkICIKKwkJICAgICAgICJhY2Nlc3MgbW9kZSAlZCIsIGZhbl9jb250cm9sX2FjY2Vzc19tb2RlKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGZhbl93cml0ZV9jbWRfZW5hYmxlKGNvbnN0IGNoYXIgKmNtZCwgaW50ICpyYykKK3sKKwlpZiAoc3RybGVuY21wKGNtZCwgImVuYWJsZSIpICE9IDApCisJCXJldHVybiAwOworCisJaWYgKCgqcmMgPSBmYW5fc2V0X2VuYWJsZSgpKSA9PSAtRU5YSU8pCisJCXByaW50ayhJQk1fRVJSICJlbmFibGUgY29tbWFuZCBhY2NlcHRlZCBmb3IgdW5zdXBwb3J0ZWQgIgorCQkgICAgICAgImFjY2VzcyBtb2RlICVkIiwgZmFuX2NvbnRyb2xfYWNjZXNzX21vZGUpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgZmFuX3dyaXRlX2NtZF9kaXNhYmxlKGNvbnN0IGNoYXIgKmNtZCwgaW50ICpyYykKK3sKKwlpZiAoc3RybGVuY21wKGNtZCwgImRpc2FibGUiKSAhPSAwKQorCQlyZXR1cm4gMDsKKworCWlmICgoKnJjID0gZmFuX3NldF9kaXNhYmxlKCkpID09IC1FTlhJTykKKwkJcHJpbnRrKElCTV9FUlIgImRpc2FibGUgY29tbWFuZCBhY2NlcHRlZCBmb3IgdW5zdXBwb3J0ZWQgIgorCQkgICAgICAgImFjY2VzcyBtb2RlICVkIiwgZmFuX2NvbnRyb2xfYWNjZXNzX21vZGUpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgZmFuX3dyaXRlX2NtZF9zcGVlZChjb25zdCBjaGFyICpjbWQsIGludCAqcmMpCit7CisJaW50IHNwZWVkOworCisJLyogVE9ETzoKKwkgKiBTdXBwb3J0IHNwZWVkIDxsb3c+IDxtZWRpdW0+IDxoaWdoPiA/ICovCisKKwlpZiAoc3NjYW5mKGNtZCwgInNwZWVkICVkIiwgJnNwZWVkKSAhPSAxKQorCQlyZXR1cm4gMDsKKworCWlmICgoKnJjID0gZmFuX3NldF9zcGVlZChzcGVlZCkpID09IC1FTlhJTykKKwkJcHJpbnRrKElCTV9FUlIgInNwZWVkIGNvbW1hbmQgYWNjZXB0ZWQgZm9yIHVuc3VwcG9ydGVkICIKKwkJICAgICAgICJhY2Nlc3MgbW9kZSAlZCIsIGZhbl9jb250cm9sX2FjY2Vzc19tb2RlKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGZhbl93cml0ZV9jbWRfd2F0Y2hkb2coY29uc3QgY2hhciAqY21kLCBpbnQgKnJjKQoreworCWludCBpbnRlcnZhbDsKKworCWlmIChzc2NhbmYoY21kLCAid2F0Y2hkb2cgJWQiLCAmaW50ZXJ2YWwpICE9IDEpCisJCXJldHVybiAwOworCisJaWYgKGludGVydmFsIDwgMCB8fCBpbnRlcnZhbCA+IDEyMCkKKwkJKnJjID0gLUVJTlZBTDsKKwllbHNlCisJCWZhbl93YXRjaGRvZ19tYXhpbnRlcnZhbCA9IGludGVydmFsOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgZmFuX3dyaXRlKGNoYXIgKmJ1ZikKK3sKKwljaGFyICpjbWQ7CisJaW50IHJjID0gMDsKKworCXdoaWxlICghcmMgJiYgKGNtZCA9IG5leHRfY21kKCZidWYpKSkgeworCQlpZiAoISgoZmFuX2NvbnRyb2xfY29tbWFuZHMgJiBUUEFDUElfRkFOX0NNRF9MRVZFTCkgJiYKKwkJICAgICAgZmFuX3dyaXRlX2NtZF9sZXZlbChjbWQsICZyYykpICYmCisJCSAgICAhKChmYW5fY29udHJvbF9jb21tYW5kcyAmIFRQQUNQSV9GQU5fQ01EX0VOQUJMRSkgJiYKKwkJICAgICAgKGZhbl93cml0ZV9jbWRfZW5hYmxlKGNtZCwgJnJjKSB8fAorCQkgICAgICAgZmFuX3dyaXRlX2NtZF9kaXNhYmxlKGNtZCwgJnJjKSB8fAorCQkgICAgICAgZmFuX3dyaXRlX2NtZF93YXRjaGRvZyhjbWQsICZyYykpKSAmJgorCQkgICAgISgoZmFuX2NvbnRyb2xfY29tbWFuZHMgJiBUUEFDUElfRkFOX0NNRF9TUEVFRCkgJiYKKwkJICAgICAgZmFuX3dyaXRlX2NtZF9zcGVlZChjbWQsICZyYykpCisJCSAgICApCisJCQlyYyA9IC1FSU5WQUw7CisJCWVsc2UgaWYgKCFyYykKKwkJCWZhbl93YXRjaGRvZ19yZXNldCgpOworCX0KKworCXJldHVybiByYzsKK30KKworc3RhdGljIHN0cnVjdCBpYm1fc3RydWN0IGZhbl9kcml2ZXJfZGF0YSA9IHsKKwkubmFtZSA9ICJmYW4iLAorCS5yZWFkID0gZmFuX3JlYWQsCisJLndyaXRlID0gZmFuX3dyaXRlLAorCS5leGl0ID0gZmFuX2V4aXQsCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBJbmZyYXN0cnVjdHVyZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogL3Byb2Mgc3VwcG9ydCAqLworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY19kaXIgPSBOVUxMOworCisvKiBTdWJkcml2ZXIgcmVnaXN0cnkgKi8KK3N0YXRpYyBMSVNUX0hFQUQodHBhY3BpX2FsbF9kcml2ZXJzKTsKKworCisvKgorICogTW9kdWxlIGFuZCBpbmZyYXN0cnVjdHVyZSBwcm9ibGUsIGluaXQgYW5kIGV4aXQgaGFuZGxpbmcKKyAqLworCisjaWZkZWYgQ09ORklHX1RISU5LUEFEX0FDUElfREVCVUcKK3N0YXRpYyBjb25zdCBjaGFyICogX19pbml0IHN0cl9zdXBwb3J0ZWQoaW50IGlzX3N1cHBvcnRlZCkKK3sKKwlzdGF0aWMgY2hhciB0ZXh0X3Vuc3VwcG9ydGVkW10gX19pbml0ZGF0YSA9ICJub3Qgc3VwcG9ydGVkIjsKKworCXJldHVybiAoaXNfc3VwcG9ydGVkKT8gJnRleHRfdW5zdXBwb3J0ZWRbNF0gOiAmdGV4dF91bnN1cHBvcnRlZFswXTsKK30KKyNlbmRpZiAvKiBDT05GSUdfVEhJTktQQURfQUNQSV9ERUJVRyAqLworCitzdGF0aWMgaW50IF9faW5pdCBpYm1faW5pdChzdHJ1Y3QgaWJtX2luaXRfc3RydWN0ICppaWJtKQoreworCWludCByZXQ7CisJc3RydWN0IGlibV9zdHJ1Y3QgKmlibSA9IGlpYm0tPmRhdGE7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICplbnRyeTsKKworCUJVR19PTihpYm0gPT0gTlVMTCk7CisKKwlJTklUX0xJU1RfSEVBRCgmaWJtLT5hbGxfZHJpdmVycyk7CisKKwlpZiAoaWJtLT5mbGFncy5leHBlcmltZW50YWwgJiYgIWV4cGVyaW1lbnRhbCkKKwkJcmV0dXJuIDA7CisKKwlkYmdfcHJpbnRrKFRQQUNQSV9EQkdfSU5JVCwKKwkJInByb2JpbmcgZm9yICVzXG4iLCBpYm0tPm5hbWUpOworCisJaWYgKGlpYm0tPmluaXQpIHsKKwkJcmV0ID0gaWlibS0+aW5pdChpaWJtKTsKKwkJaWYgKHJldCA+IDApCisJCQlyZXR1cm4gMDsJLyogcHJvYmUgZmFpbGVkICovCisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCWlibS0+ZmxhZ3MuaW5pdF9jYWxsZWQgPSAxOworCX0KKworCWlmIChpYm0tPmFjcGkpIHsKKwkJaWYgKGlibS0+YWNwaS0+aGlkKSB7CisJCQlyZXQgPSByZWdpc3Rlcl90cGFjcGlfc3ViZHJpdmVyKGlibSk7CisJCQlpZiAocmV0KQorCQkJCWdvdG8gZXJyX291dDsKKwkJfQorCisJCWlmIChpYm0tPmFjcGktPm5vdGlmeSkgeworCQkJcmV0ID0gc2V0dXBfYWNwaV9ub3RpZnkoaWJtKTsKKwkJCWlmIChyZXQgPT0gLUVOT0RFVikgeworCQkJCXByaW50ayhJQk1fTk9USUNFICJkaXNhYmxpbmcgc3ViZHJpdmVyICVzXG4iLAorCQkJCQlpYm0tPm5hbWUpOworCQkJCXJldCA9IDA7CisJCQkJZ290byBlcnJfb3V0OworCQkJfQorCQkJaWYgKHJldCA8IDApCisJCQkJZ290byBlcnJfb3V0OworCQl9CisJfQorCisJZGJnX3ByaW50ayhUUEFDUElfREJHX0lOSVQsCisJCSIlcyBpbnN0YWxsZWRcbiIsIGlibS0+bmFtZSk7CisKKwlpZiAoaWJtLT5yZWFkKSB7CisJCWVudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkoaWJtLT5uYW1lLAorCQkJCQkgIFNfSUZSRUcgfCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJCQkJICBwcm9jX2Rpcik7CisJCWlmICghZW50cnkpIHsKKwkJCXByaW50ayhJQk1fRVJSICJ1bmFibGUgdG8gY3JlYXRlIHByb2MgZW50cnkgJXNcbiIsCisJCQkgICAgICAgaWJtLT5uYW1lKTsKKwkJCXJldCA9IC1FTk9ERVY7CisJCQlnb3RvIGVycl9vdXQ7CisJCX0KKwkJZW50cnktPm93bmVyID0gVEhJU19NT0RVTEU7CisJCWVudHJ5LT5kYXRhID0gaWJtOworCQllbnRyeS0+cmVhZF9wcm9jID0gJmRpc3BhdGNoX3Byb2Nmc19yZWFkOworCQlpZiAoaWJtLT53cml0ZSkKKwkJCWVudHJ5LT53cml0ZV9wcm9jID0gJmRpc3BhdGNoX3Byb2Nmc193cml0ZTsKKwkJaWJtLT5mbGFncy5wcm9jX2NyZWF0ZWQgPSAxOworCX0KKworCWxpc3RfYWRkX3RhaWwoJmlibS0+YWxsX2RyaXZlcnMsICZ0cGFjcGlfYWxsX2RyaXZlcnMpOworCisJcmV0dXJuIDA7CisKK2Vycl9vdXQ6CisJZGJnX3ByaW50ayhUUEFDUElfREJHX0lOSVQsCisJCSIlczogYXQgZXJyb3IgZXhpdCBwYXRoIHdpdGggcmVzdWx0ICVkXG4iLAorCQlpYm0tPm5hbWUsIHJldCk7CisKKwlpYm1fZXhpdChpYm0pOworCXJldHVybiAocmV0IDwgMCk/IHJldCA6IDA7Cit9CisKK3N0YXRpYyB2b2lkIGlibV9leGl0KHN0cnVjdCBpYm1fc3RydWN0ICppYm0pCit7CisJZGJnX3ByaW50ayhUUEFDUElfREJHX0VYSVQsICJyZW1vdmluZyAlc1xuIiwgaWJtLT5uYW1lKTsKKworCWxpc3RfZGVsX2luaXQoJmlibS0+YWxsX2RyaXZlcnMpOworCisJaWYgKGlibS0+ZmxhZ3MuYWNwaV9ub3RpZnlfaW5zdGFsbGVkKSB7CisJCWRiZ19wcmludGsoVFBBQ1BJX0RCR19FWElULAorCQkJIiVzOiBhY3BpX3JlbW92ZV9ub3RpZnlfaGFuZGxlclxuIiwgaWJtLT5uYW1lKTsKKwkJQlVHX09OKCFpYm0tPmFjcGkpOworCQlhY3BpX3JlbW92ZV9ub3RpZnlfaGFuZGxlcigqaWJtLT5hY3BpLT5oYW5kbGUsCisJCQkJCSAgIGlibS0+YWNwaS0+dHlwZSwKKwkJCQkJICAgZGlzcGF0Y2hfYWNwaV9ub3RpZnkpOworCQlpYm0tPmZsYWdzLmFjcGlfbm90aWZ5X2luc3RhbGxlZCA9IDA7CisJCWlibS0+ZmxhZ3MuYWNwaV9ub3RpZnlfaW5zdGFsbGVkID0gMDsKKwl9CisKKwlpZiAoaWJtLT5mbGFncy5wcm9jX2NyZWF0ZWQpIHsKKwkJZGJnX3ByaW50ayhUUEFDUElfREJHX0VYSVQsCisJCQkiJXM6IHJlbW92ZV9wcm9jX2VudHJ5XG4iLCBpYm0tPm5hbWUpOworCQlyZW1vdmVfcHJvY19lbnRyeShpYm0tPm5hbWUsIHByb2NfZGlyKTsKKwkJaWJtLT5mbGFncy5wcm9jX2NyZWF0ZWQgPSAwOworCX0KKworCWlmIChpYm0tPmZsYWdzLmFjcGlfZHJpdmVyX3JlZ2lzdGVyZWQpIHsKKwkJZGJnX3ByaW50ayhUUEFDUElfREJHX0VYSVQsCisJCQkiJXM6IGFjcGlfYnVzX3VucmVnaXN0ZXJfZHJpdmVyXG4iLCBpYm0tPm5hbWUpOworCQlCVUdfT04oIWlibS0+YWNwaSk7CisJCWFjcGlfYnVzX3VucmVnaXN0ZXJfZHJpdmVyKGlibS0+YWNwaS0+ZHJpdmVyKTsKKwkJa2ZyZWUoaWJtLT5hY3BpLT5kcml2ZXIpOworCQlpYm0tPmFjcGktPmRyaXZlciA9IE5VTEw7CisJCWlibS0+ZmxhZ3MuYWNwaV9kcml2ZXJfcmVnaXN0ZXJlZCA9IDA7CisJfQorCisJaWYgKGlibS0+ZmxhZ3MuaW5pdF9jYWxsZWQgJiYgaWJtLT5leGl0KSB7CisJCWlibS0+ZXhpdCgpOworCQlpYm0tPmZsYWdzLmluaXRfY2FsbGVkID0gMDsKKwl9CisKKwlkYmdfcHJpbnRrKFRQQUNQSV9EQkdfSU5JVCwgImZpbmlzaGVkIHJlbW92aW5nICVzXG4iLCBpYm0tPm5hbWUpOworfQorCisvKiBQcm9iaW5nICovCisKK3N0YXRpYyBjaGFyICppYm1fdGhpbmtwYWRfZWNfZm91bmQgPSBOVUxMOworCitzdGF0aWMgY2hhciogX19pbml0IGNoZWNrX2RtaV9mb3JfZWModm9pZCkKK3sKKwlzdHJ1Y3QgZG1pX2RldmljZSAqZGV2ID0gTlVMTDsKKwljaGFyIGVjX2Z3X3N0cmluZ1sxOF07CisKKwkvKgorCSAqIFRoaW5rUGFkIFQyMyBvciBuZXdlciwgQTMxIG9yIG5ld2VyLCBSNTBlIG9yIG5ld2VyLAorCSAqIFgzMiBvciBuZXdlciwgYWxsIFogc2VyaWVzOyAgU29tZSBtb2RlbHMgbXVzdCBoYXZlIGFuCisJICogdXAtdG8tZGF0ZSBCSU9TIG9yIHRoZXkgd2lsbCBub3QgYmUgZGV0ZWN0ZWQuCisJICoKKwkgKiBTZWUgaHR0cDovL3RoaW5rd2lraS5vcmcvd2lraS9MaXN0X29mX0RNSV9JRHMKKwkgKi8KKwl3aGlsZSAoKGRldiA9IGRtaV9maW5kX2RldmljZShETUlfREVWX1RZUEVfT0VNX1NUUklORywgTlVMTCwgZGV2KSkpIHsKKwkJaWYgKHNzY2FuZihkZXYtPm5hbWUsCisJCQkgICAiSUJNIFRoaW5rUGFkIEVtYmVkZGVkIENvbnRyb2xsZXIgLVslMTdjIiwKKwkJCSAgIGVjX2Z3X3N0cmluZykgPT0gMSkgeworCQkJZWNfZndfc3RyaW5nW3NpemVvZihlY19md19zdHJpbmcpIC0gMV0gPSAwOworCQkJZWNfZndfc3RyaW5nW3N0cmNzcG4oZWNfZndfc3RyaW5nLCAiIF0iKV0gPSAwOworCQkJcmV0dXJuIGtzdHJkdXAoZWNfZndfc3RyaW5nLCBHRlBfS0VSTkVMKTsKKwkJfQorCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBfX2luaXQgcHJvYmVfZm9yX3RoaW5rcGFkKHZvaWQpCit7CisJaW50IGlzX3RoaW5rcGFkOworCisJaWYgKGFjcGlfZGlzYWJsZWQpCisJCXJldHVybiAtRU5PREVWOworCisJLyoKKwkgKiBOb24tYW5jaWVudCBtb2RlbHMgaGF2ZSBiZXR0ZXIgRE1JIHRhZ2dpbmcsIGJ1dCB2ZXJ5IG9sZCBtb2RlbHMKKwkgKiBkb24ndC4KKwkgKi8KKwlpc190aGlua3BhZCA9IGRtaV9uYW1lX2luX3ZlbmRvcnMoIlRoaW5rUGFkIik7CisKKwkvKiBlYyBpcyByZXF1aXJlZCBiZWNhdXNlIG1hbnkgb3RoZXIgaGFuZGxlcyBhcmUgcmVsYXRpdmUgdG8gaXQgKi8KKwlJQk1fQUNQSUhBTkRMRV9JTklUKGVjKTsKKwlpZiAoIWVjX2hhbmRsZSkgeworCQlpZiAoaXNfdGhpbmtwYWQpCisJCQlwcmludGsoSUJNX0VSUgorCQkJCSJOb3QgeWV0IHN1cHBvcnRlZCBUaGlua1BhZCBkZXRlY3RlZCFcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKgorCSAqIFJpc2tzIGEgcmVncmVzc2lvbiBvbiB2ZXJ5IG9sZCBtYWNoaW5lcywgYnV0IHJlZHVjZXMgcG90ZW50aWFsCisJICogZmFsc2UgcG9zaXRpdmVzIGEgZGFtbiBncmVhdCBkZWFsCisJICovCisJaWYgKCFpc190aGlua3BhZCkKKwkJaXNfdGhpbmtwYWQgPSBkbWlfbmFtZV9pbl92ZW5kb3JzKCJJQk0iKTsKKworCWlmICghaXNfdGhpbmtwYWQgJiYgIWZvcmNlX2xvYWQpCisJCXJldHVybiAtRU5PREVWOworCisJcmV0dXJuIDA7Cit9CisKKworLyogTW9kdWxlIGluaXQsIGV4aXQsIHBhcmFtZXRlcnMgKi8KKworc3RhdGljIHN0cnVjdCBpYm1faW5pdF9zdHJ1Y3QgaWJtc19pbml0W10gX19pbml0ZGF0YSA9IHsKKwl7CisJCS5pbml0ID0gdGhpbmtwYWRfYWNwaV9kcml2ZXJfaW5pdCwKKwkJLmRhdGEgPSAmdGhpbmtwYWRfYWNwaV9kcml2ZXJfZGF0YSwKKwl9LAorCXsKKwkJLmluaXQgPSBob3RrZXlfaW5pdCwKKwkJLmRhdGEgPSAmaG90a2V5X2RyaXZlcl9kYXRhLAorCX0sCisJeworCQkuaW5pdCA9IGJsdWV0b290aF9pbml0LAorCQkuZGF0YSA9ICZibHVldG9vdGhfZHJpdmVyX2RhdGEsCisJfSwKKwl7CisJCS5pbml0ID0gd2FuX2luaXQsCisJCS5kYXRhID0gJndhbl9kcml2ZXJfZGF0YSwKKwl9LAorCXsKKwkJLmluaXQgPSB2aWRlb19pbml0LAorCQkuZGF0YSA9ICZ2aWRlb19kcml2ZXJfZGF0YSwKKwl9LAorCXsKKwkJLmluaXQgPSBsaWdodF9pbml0LAorCQkuZGF0YSA9ICZsaWdodF9kcml2ZXJfZGF0YSwKKwl9LAorI2lmZGVmIENPTkZJR19USElOS1BBRF9BQ1BJX0RPQ0sKKwl7CisJCS5pbml0ID0gZG9ja19pbml0LAorCQkuZGF0YSA9ICZkb2NrX2RyaXZlcl9kYXRhWzBdLAorCX0sCisJeworCQkuaW5pdCA9IGRvY2tfaW5pdDIsCisJCS5kYXRhID0gJmRvY2tfZHJpdmVyX2RhdGFbMV0sCisJfSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19USElOS1BBRF9BQ1BJX0JBWQorCXsKKwkJLmluaXQgPSBiYXlfaW5pdCwKKwkJLmRhdGEgPSAmYmF5X2RyaXZlcl9kYXRhLAorCX0sCisjZW5kaWYKKwl7CisJCS5pbml0ID0gY21vc19pbml0LAorCQkuZGF0YSA9ICZjbW9zX2RyaXZlcl9kYXRhLAorCX0sCisJeworCQkuaW5pdCA9IGxlZF9pbml0LAorCQkuZGF0YSA9ICZsZWRfZHJpdmVyX2RhdGEsCisJfSwKKwl7CisJCS5pbml0ID0gYmVlcF9pbml0LAorCQkuZGF0YSA9ICZiZWVwX2RyaXZlcl9kYXRhLAorCX0sCisJeworCQkuaW5pdCA9IHRoZXJtYWxfaW5pdCwKKwkJLmRhdGEgPSAmdGhlcm1hbF9kcml2ZXJfZGF0YSwKKwl9LAorCXsKKwkJLmRhdGEgPSAmZWNkdW1wX2RyaXZlcl9kYXRhLAorCX0sCisJeworCQkuaW5pdCA9IGJyaWdodG5lc3NfaW5pdCwKKwkJLmRhdGEgPSAmYnJpZ2h0bmVzc19kcml2ZXJfZGF0YSwKKwl9LAorCXsKKwkJLmRhdGEgPSAmdm9sdW1lX2RyaXZlcl9kYXRhLAorCX0sCisJeworCQkuaW5pdCA9IGZhbl9pbml0LAorCQkuZGF0YSA9ICZmYW5fZHJpdmVyX2RhdGEsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHNldF9pYm1fcGFyYW0oY29uc3QgY2hhciAqdmFsLCBzdHJ1Y3Qga2VybmVsX3BhcmFtICprcCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlzdHJ1Y3QgaWJtX3N0cnVjdCAqaWJtOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaWJtc19pbml0KTsgaSsrKSB7CisJCWlibSA9IGlibXNfaW5pdFtpXS5kYXRhOworCQlCVUdfT04oaWJtID09IE5VTEwpOworCisJCWlmIChzdHJjbXAoaWJtLT5uYW1lLCBrcC0+bmFtZSkgPT0gMCAmJiBpYm0tPndyaXRlKSB7CisJCQlpZiAoc3RybGVuKHZhbCkgPiBzaXplb2YoaWJtc19pbml0W2ldLnBhcmFtKSAtIDIpCisJCQkJcmV0dXJuIC1FTk9TUEM7CisJCQlzdHJjcHkoaWJtc19pbml0W2ldLnBhcmFtLCB2YWwpOworCQkJc3RyY2F0KGlibXNfaW5pdFtpXS5wYXJhbSwgIiwiKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgZXhwZXJpbWVudGFsOworbW9kdWxlX3BhcmFtKGV4cGVyaW1lbnRhbCwgaW50LCAwKTsKKworc3RhdGljIHUzMiBkYmdfbGV2ZWw7Cittb2R1bGVfcGFyYW1fbmFtZWQoZGVidWcsIGRiZ19sZXZlbCwgdWludCwgMCk7CisKK3N0YXRpYyBpbnQgZm9yY2VfbG9hZDsKK21vZHVsZV9wYXJhbShmb3JjZV9sb2FkLCBpbnQsIDApOworCitzdGF0aWMgaW50IGZhbl9jb250cm9sX2FsbG93ZWQ7Cittb2R1bGVfcGFyYW1fbmFtZWQoZmFuX2NvbnRyb2wsIGZhbl9jb250cm9sX2FsbG93ZWQsIGludCwgMCk7CisKKyNkZWZpbmUgSUJNX1BBUkFNKGZlYXR1cmUpIFwKKwltb2R1bGVfcGFyYW1fY2FsbChmZWF0dXJlLCBzZXRfaWJtX3BhcmFtLCBOVUxMLCBOVUxMLCAwKQorCitJQk1fUEFSQU0oaG90a2V5KTsKK0lCTV9QQVJBTShibHVldG9vdGgpOworSUJNX1BBUkFNKHZpZGVvKTsKK0lCTV9QQVJBTShsaWdodCk7CisjaWZkZWYgQ09ORklHX1RISU5LUEFEX0FDUElfRE9DSworSUJNX1BBUkFNKGRvY2spOworI2VuZGlmCisjaWZkZWYgQ09ORklHX1RISU5LUEFEX0FDUElfQkFZCitJQk1fUEFSQU0oYmF5KTsKKyNlbmRpZiAvKiBDT05GSUdfVEhJTktQQURfQUNQSV9CQVkgKi8KK0lCTV9QQVJBTShjbW9zKTsKK0lCTV9QQVJBTShsZWQpOworSUJNX1BBUkFNKGJlZXApOworSUJNX1BBUkFNKGVjZHVtcCk7CitJQk1fUEFSQU0oYnJpZ2h0bmVzcyk7CitJQk1fUEFSQU0odm9sdW1lKTsKK0lCTV9QQVJBTShmYW4pOworCitzdGF0aWMgaW50IF9faW5pdCB0aGlua3BhZF9hY3BpX21vZHVsZV9pbml0KHZvaWQpCit7CisJaW50IHJldCwgaTsKKworCS8qIERyaXZlci1sZXZlbCBwcm9iZSAqLworCXJldCA9IHByb2JlX2Zvcl90aGlua3BhZCgpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBEcml2ZXIgaW5pdGlhbGl6YXRpb24gKi8KKwlpYm1fdGhpbmtwYWRfZWNfZm91bmQgPSBjaGVja19kbWlfZm9yX2VjKCk7CisJSUJNX0FDUElIQU5ETEVfSU5JVChlY3JkKTsKKwlJQk1fQUNQSUhBTkRMRV9JTklUKGVjd3IpOworCisJcHJvY19kaXIgPSBwcm9jX21rZGlyKElCTV9QUk9DX0RJUiwgYWNwaV9yb290X2Rpcik7CisJaWYgKCFwcm9jX2RpcikgeworCQlwcmludGsoSUJNX0VSUiAidW5hYmxlIHRvIGNyZWF0ZSBwcm9jIGRpciAiIElCTV9QUk9DX0RJUik7CisJCXRoaW5rcGFkX2FjcGlfbW9kdWxlX2V4aXQoKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXByb2NfZGlyLT5vd25lciA9IFRISVNfTU9EVUxFOworCisJcmV0ID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZ0cGFjcGlfcGRyaXZlcik7CisJaWYgKHJldCkgeworCQlwcmludGsoSUJNX0VSUiAidW5hYmxlIHRvIHJlZ2lzdGVyIHBsYXRmb3JtIGRyaXZlclxuIik7CisJCXRoaW5rcGFkX2FjcGlfbW9kdWxlX2V4aXQoKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcmV0ID0gdHBhY3BpX2NyZWF0ZV9kcml2ZXJfYXR0cmlidXRlcygmdHBhY3BpX3Bkcml2ZXIuZHJpdmVyKTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhJQk1fRVJSICJ1bmFibGUgdG8gY3JlYXRlIHN5c2ZzIGRyaXZlciBhdHRyaWJ1dGVzXG4iKTsKKwkJdGhpbmtwYWRfYWNwaV9tb2R1bGVfZXhpdCgpOworCQlyZXR1cm4gcmV0OworCX0KKworCisJLyogRGV2aWNlIGluaXRpYWxpemF0aW9uICovCisJdHBhY3BpX3BkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKElCTV9EUlZSX05BTUUsIC0xLAorCQkJCQkJCU5VTEwsIDApOworCWlmIChJU19FUlIodHBhY3BpX3BkZXYpKSB7CisJCXJldCA9IFBUUl9FUlIodHBhY3BpX3BkZXYpOworCQl0cGFjcGlfcGRldiA9IE5VTEw7CisJCXByaW50ayhJQk1fRVJSICJ1bmFibGUgdG8gcmVnaXN0ZXIgcGxhdGZvcm0gZGV2aWNlXG4iKTsKKwkJdGhpbmtwYWRfYWNwaV9tb2R1bGVfZXhpdCgpOworCQlyZXR1cm4gcmV0OworCX0KKwl0cGFjcGlfaHdtb24gPSBod21vbl9kZXZpY2VfcmVnaXN0ZXIoJnRwYWNwaV9wZGV2LT5kZXYpOworCWlmIChJU19FUlIodHBhY3BpX2h3bW9uKSkgeworCQlyZXQgPSBQVFJfRVJSKHRwYWNwaV9od21vbik7CisJCXRwYWNwaV9od21vbiA9IE5VTEw7CisJCXByaW50ayhJQk1fRVJSICJ1bmFibGUgdG8gcmVnaXN0ZXIgaHdtb24gZGV2aWNlXG4iKTsKKwkJdGhpbmtwYWRfYWNwaV9tb2R1bGVfZXhpdCgpOworCQlyZXR1cm4gcmV0OworCX0KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpYm1zX2luaXQpOyBpKyspIHsKKwkJcmV0ID0gaWJtX2luaXQoJmlibXNfaW5pdFtpXSk7CisJCWlmIChyZXQgPj0gMCAmJiAqaWJtc19pbml0W2ldLnBhcmFtKQorCQkJcmV0ID0gaWJtc19pbml0W2ldLmRhdGEtPndyaXRlKGlibXNfaW5pdFtpXS5wYXJhbSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQl0aGlua3BhZF9hY3BpX21vZHVsZV9leGl0KCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHRoaW5rcGFkX2FjcGlfbW9kdWxlX2V4aXQodm9pZCkKK3sKKwlzdHJ1Y3QgaWJtX3N0cnVjdCAqaWJtLCAqaXRtcDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZV9yZXZlcnNlKGlibSwgaXRtcCwKKwkJCQkJICZ0cGFjcGlfYWxsX2RyaXZlcnMsCisJCQkJCSBhbGxfZHJpdmVycykgeworCQlpYm1fZXhpdChpYm0pOworCX0KKworCWRiZ19wcmludGsoVFBBQ1BJX0RCR19JTklULCAiZmluaXNoZWQgc3ViZHJpdmVyIGV4aXQgcGF0aC4uLlxuIik7CisKKwlpZiAodHBhY3BpX2h3bW9uKQorCQlod21vbl9kZXZpY2VfdW5yZWdpc3Rlcih0cGFjcGlfaHdtb24pOworCisJaWYgKHRwYWNwaV9wZGV2KQorCQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3Rlcih0cGFjcGlfcGRldik7CisKKwl0cGFjcGlfcmVtb3ZlX2RyaXZlcl9hdHRyaWJ1dGVzKCZ0cGFjcGlfcGRyaXZlci5kcml2ZXIpOworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZ0cGFjcGlfcGRyaXZlcik7CisKKwlpZiAocHJvY19kaXIpCisJCXJlbW92ZV9wcm9jX2VudHJ5KElCTV9QUk9DX0RJUiwgYWNwaV9yb290X2Rpcik7CisKKwlrZnJlZShpYm1fdGhpbmtwYWRfZWNfZm91bmQpOworfQorCittb2R1bGVfaW5pdCh0aGlua3BhZF9hY3BpX21vZHVsZV9pbml0KTsKK21vZHVsZV9leGl0KHRoaW5rcGFkX2FjcGlfbW9kdWxlX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL3RoaW5rcGFkX2FjcGkuaCBiL2RyaXZlcnMvbWlzYy90aGlua3BhZF9hY3BpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQwMTQ1YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWlzYy90aGlua3BhZF9hY3BpLmgKQEAgLTAsMCArMSw1NzIgQEAKKy8qCisgKiAgdGhpbmtwYWRfYWNwaS5oIC0gVGhpbmtQYWQgQUNQSSBFeHRyYXMKKyAqCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNC0yMDA1IEJvcmlzbGF2IERlaWFub3YgPGJvcmlzbGF2QHVzZXJzLnNmLm5ldD4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwNyBIZW5yaXF1ZSBkZSBNb3JhZXMgSG9sc2NodWggPGhtaEBobWguZW5nLmJyPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fVEhJTktQQURfQUNQSV9IX18KKyNkZWZpbmUgX19USElOS1BBRF9BQ1BJX0hfXworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9iYWNrbGlnaHQuaD4KKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2h3bW9uLmg+CisjaW5jbHVkZSA8bGludXgvaHdtb24tc3lzZnMuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSA8bGludXgvZG1pLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorCisjaW5jbHVkZSA8YWNwaS9hY3BpX2RyaXZlcnMuaD4KKyNpbmNsdWRlIDxhY3BpL2FjbmFtZXNwLmg+CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1haW4gZHJpdmVyCisgKi8KKworI2RlZmluZSBJQk1fTkFNRSAidGhpbmtwYWQiCisjZGVmaW5lIElCTV9ERVNDICJUaGlua1BhZCBBQ1BJIEV4dHJhcyIKKyNkZWZpbmUgSUJNX0ZJTEUgInRoaW5rcGFkX2FjcGkiCisjZGVmaW5lIElCTV9VUkwgImh0dHA6Ly9pYm0tYWNwaS5zZi5uZXQvIgorI2RlZmluZSBJQk1fTUFJTCAiaWJtLWFjcGktZGV2ZWxAbGlzdHMuc291cmNlZm9yZ2UubmV0IgorCisjZGVmaW5lIElCTV9QUk9DX0RJUiAiaWJtIgorI2RlZmluZSBJQk1fQUNQSV9FVkVOVF9QUkVGSVggImlibSIKKyNkZWZpbmUgSUJNX0RSVlJfTkFNRSBJQk1fRklMRQorCisjZGVmaW5lIElCTV9MT0cgSUJNX0ZJTEUgIjogIgorI2RlZmluZSBJQk1fRVJSCSAgIEtFUk5fRVJSICAgIElCTV9MT0cKKyNkZWZpbmUgSUJNX05PVElDRSBLRVJOX05PVElDRSBJQk1fTE9HCisjZGVmaW5lIElCTV9JTkZPICAgS0VSTl9JTkZPICAgSUJNX0xPRworI2RlZmluZSBJQk1fREVCVUcgIEtFUk5fREVCVUcgIElCTV9MT0cKKworI2RlZmluZSBJQk1fTUFYX0FDUElfQVJHUyAzCisKKy8qIFRoaW5rUGFkIENNT1MgY29tbWFuZHMgKi8KKyNkZWZpbmUgVFBfQ01PU19WT0xVTUVfRE9XTgkwCisjZGVmaW5lIFRQX0NNT1NfVk9MVU1FX1VQCTEKKyNkZWZpbmUgVFBfQ01PU19WT0xVTUVfTVVURQkyCisjZGVmaW5lIFRQX0NNT1NfQlJJR0hUTkVTU19VUAk0CisjZGVmaW5lIFRQX0NNT1NfQlJJR0hUTkVTU19ET1dOCTUKKworI2RlZmluZSBvbm9mZihzdGF0dXMsYml0KSAoKHN0YXR1cykgJiAoMSA8PCAoYml0KSkgPyAib24iIDogIm9mZiIpCisjZGVmaW5lIGVuYWJsZWQoc3RhdHVzLGJpdCkgKChzdGF0dXMpICYgKDEgPDwgKGJpdCkpID8gImVuYWJsZWQiIDogImRpc2FibGVkIikKKyNkZWZpbmUgc3RybGVuY21wKGEsYikgKHN0cm5jbXAoKGEpLCAoYiksIHN0cmxlbihiKSkpCisKKy8qIERlYnVnZ2luZyAqLworI2RlZmluZSBUUEFDUElfREJHX0FMTAkJMHhmZmZmCisjZGVmaW5lIFRQQUNQSV9EQkdfQUxMCQkweGZmZmYKKyNkZWZpbmUgVFBBQ1BJX0RCR19JTklUCQkweDAwMDEKKyNkZWZpbmUgVFBBQ1BJX0RCR19FWElUCQkweDAwMDIKKyNkZWZpbmUgZGJnX3ByaW50ayhhX2RiZ19sZXZlbCwgZm9ybWF0LCBhcmcuLi4pIFwKKwlkbyB7IGlmIChkYmdfbGV2ZWwgJiBhX2RiZ19sZXZlbCkgXAorCQlwcmludGsoSUJNX0RFQlVHICIlczogIiBmb3JtYXQsIF9fZnVuY19fICwgIyMgYXJnKTsgfSB3aGlsZSAoMCkKKyNpZmRlZiBDT05GSUdfVEhJTktQQURfQUNQSV9ERUJVRworI2RlZmluZSB2ZGJnX3ByaW50ayhhX2RiZ19sZXZlbCwgZm9ybWF0LCBhcmcuLi4pIFwKKwlkYmdfcHJpbnRrKGFfZGJnX2xldmVsLCBmb3JtYXQsICMjIGFyZykKK3N0YXRpYyBjb25zdCBjaGFyICpzdHJfc3VwcG9ydGVkKGludCBpc19zdXBwb3J0ZWQpOworI2Vsc2UKKyNkZWZpbmUgdmRiZ19wcmludGsoYV9kYmdfbGV2ZWwsIGZvcm1hdCwgYXJnLi4uKQorI2VuZGlmCisKKy8qIEFDUEkgSElEcyAqLworI2RlZmluZSBJQk1fSEtFWV9ISUQgICAgIklCTTAwNjgiCisjZGVmaW5lIElCTV9QQ0lfSElEICAgICAiUE5QMEEwMyIKKworLyogQUNQSSBoZWxwZXJzICovCitzdGF0aWMgaW50IF9fbXVzdF9jaGVjayBhY3BpX2V2YWxmKGFjcGlfaGFuZGxlIGhhbmRsZSwKKwkJICAgICAgdm9pZCAqcmVzLCBjaGFyICptZXRob2QsIGNoYXIgKmZtdCwgLi4uKTsKK3N0YXRpYyBpbnQgX19tdXN0X2NoZWNrIGFjcGlfZWNfcmVhZChpbnQgaSwgdTggKiBwKTsKK3N0YXRpYyBpbnQgX19tdXN0X2NoZWNrIGFjcGlfZWNfd3JpdGUoaW50IGksIHU4IHYpOworc3RhdGljIGludCBfX211c3RfY2hlY2sgX3N0YShhY3BpX2hhbmRsZSBoYW5kbGUpOworCisvKiBBQ1BJIGhhbmRsZXMgKi8KK3N0YXRpYyBhY3BpX2hhbmRsZSByb290X2hhbmRsZTsJCQkvKiByb290IG5hbWVzcGFjZSAqLworc3RhdGljIGFjcGlfaGFuZGxlIGVjX2hhbmRsZTsJCQkvKiBFQyAqLworc3RhdGljIGFjcGlfaGFuZGxlIGVjcmRfaGFuZGxlLCBlY3dyX2hhbmRsZTsJLyogNTcwIEVDIGFjY2VzcyAqLworc3RhdGljIGFjcGlfaGFuZGxlIGNtb3NfaGFuZGxlLCBoa2V5X2hhbmRsZTsJLyogYmFzaWMgdGhpbmtwYWQgaGFuZGxlcyAqLworCitzdGF0aWMgdm9pZCBkcnZfYWNwaV9oYW5kbGVfaW5pdChjaGFyICpuYW1lLAorCQkgICBhY3BpX2hhbmRsZSAqaGFuZGxlLCBhY3BpX2hhbmRsZSBwYXJlbnQsCisJCSAgIGNoYXIgKipwYXRocywgaW50IG51bV9wYXRocywgY2hhciAqKnBhdGgpOworI2RlZmluZSBJQk1fQUNQSUhBTkRMRV9JTklUKG9iamVjdCkJCQkJCQlcCisJZHJ2X2FjcGlfaGFuZGxlX2luaXQoI29iamVjdCwgJm9iamVjdCMjX2hhbmRsZSwgKm9iamVjdCMjX3BhcmVudCwJXAorCQlvYmplY3QjI19wYXRocywgQVJSQVlfU0laRShvYmplY3QjI19wYXRocyksICZvYmplY3QjI19wYXRoKQorCisvKiBUaGlua1BhZCBBQ1BJIGhlbHBlcnMgKi8KK3N0YXRpYyBpbnQgaXNzdWVfdGhpbmtwYWRfY21vc19jb21tYW5kKGludCBjbW9zX2NtZCk7CisKKy8qIHByb2NmcyBzdXBwb3J0ICovCitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX2RpcjsKKworLyogcHJvY2ZzIGhlbHBlcnMgKi8KK3N0YXRpYyBpbnQgZGlzcGF0Y2hfcHJvY2ZzX3JlYWQoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCisJCWludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpOworc3RhdGljIGludCBkaXNwYXRjaF9wcm9jZnNfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCisJCWNvbnN0IGNoYXIgX191c2VyICogdXNlcmJ1ZiwKKwkJdW5zaWduZWQgbG9uZyBjb3VudCwgdm9pZCAqZGF0YSk7CitzdGF0aWMgY2hhciAqbmV4dF9jbWQoY2hhciAqKmNtZHMpOworCisvKiBzeXNmcyBzdXBwb3J0ICovCitzdHJ1Y3QgYXR0cmlidXRlX3NldCB7CisJdW5zaWduZWQgaW50IG1lbWJlcnMsIG1heF9tZW1iZXJzOworCXN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgZ3JvdXA7Cit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9zZXQgKmNyZWF0ZV9hdHRyX3NldCh1bnNpZ25lZCBpbnQgbWF4X21lbWJlcnMsCisJCQkJCQljb25zdCBjaGFyKiBuYW1lKTsKKyNkZWZpbmUgZGVzdHJveV9hdHRyX3NldChfc2V0KSBcCisJa2ZyZWUoX3NldCk7CitzdGF0aWMgaW50IGFkZF90b19hdHRyX3NldChzdHJ1Y3QgYXR0cmlidXRlX3NldCogcywgc3RydWN0IGF0dHJpYnV0ZSAqYXR0cik7CitzdGF0aWMgaW50IGFkZF9tYW55X3RvX2F0dHJfc2V0KHN0cnVjdCBhdHRyaWJ1dGVfc2V0KiBzLAorCQkJc3RydWN0IGF0dHJpYnV0ZSAqKmF0dHIsCisJCQl1bnNpZ25lZCBpbnQgY291bnQpOworI2RlZmluZSByZWdpc3Rlcl9hdHRyX3NldF93aXRoX3N5c2ZzKF9hdHRyX3NldCwgX2tvYmopIFwKKwlzeXNmc19jcmVhdGVfZ3JvdXAoX2tvYmosICZfYXR0cl9zZXQtPmdyb3VwKQorc3RhdGljIHZvaWQgZGVsZXRlX2F0dHJfc2V0KHN0cnVjdCBhdHRyaWJ1dGVfc2V0KiBzLCBzdHJ1Y3Qga29iamVjdCAqa29iaik7CisKK3N0YXRpYyBpbnQgcGFyc2Vfc3RydG91bChjb25zdCBjaGFyICpidWYsIHVuc2lnbmVkIGxvbmcgbWF4LAorCQkJdW5zaWduZWQgbG9uZyAqdmFsdWUpOworCisvKiBEZXZpY2UgbW9kZWwgKi8KK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICp0cGFjcGlfcGRldjsKK3N0YXRpYyBzdHJ1Y3QgY2xhc3NfZGV2aWNlICp0cGFjcGlfaHdtb247CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB0cGFjcGlfcGRyaXZlcjsKK3N0YXRpYyBpbnQgdHBhY3BpX2NyZWF0ZV9kcml2ZXJfYXR0cmlidXRlcyhzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KTsKK3N0YXRpYyB2b2lkIHRwYWNwaV9yZW1vdmVfZHJpdmVyX2F0dHJpYnV0ZXMoc3RydWN0IGRldmljZV9kcml2ZXIgKmRydik7CisKKy8qIE1vZHVsZSAqLworc3RhdGljIGludCBleHBlcmltZW50YWw7CitzdGF0aWMgdTMyIGRiZ19sZXZlbDsKK3N0YXRpYyBpbnQgZm9yY2VfbG9hZDsKK3N0YXRpYyBjaGFyICppYm1fdGhpbmtwYWRfZWNfZm91bmQ7CisKK3N0YXRpYyBjaGFyKiBjaGVja19kbWlfZm9yX2VjKHZvaWQpOworc3RhdGljIGludCB0aGlua3BhZF9hY3BpX21vZHVsZV9pbml0KHZvaWQpOworc3RhdGljIHZvaWQgdGhpbmtwYWRfYWNwaV9tb2R1bGVfZXhpdCh2b2lkKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU3ViZHJpdmVycworICovCisKK3N0cnVjdCBpYm1fc3RydWN0OworCitzdHJ1Y3QgdHBfYWNwaV9kcnZfc3RydWN0IHsKKwljaGFyICpoaWQ7CisJc3RydWN0IGFjcGlfZHJpdmVyICpkcml2ZXI7CisKKwl2b2lkICgqbm90aWZ5KSAoc3RydWN0IGlibV9zdHJ1Y3QgKiwgdTMyKTsKKwlhY3BpX2hhbmRsZSAqaGFuZGxlOworCXUzMiB0eXBlOworCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlOworfTsKKworc3RydWN0IGlibV9zdHJ1Y3QgeworCWNoYXIgKm5hbWU7CisKKwlpbnQgKCpyZWFkKSAoY2hhciAqKTsKKwlpbnQgKCp3cml0ZSkgKGNoYXIgKik7CisJdm9pZCAoKmV4aXQpICh2b2lkKTsKKworCXN0cnVjdCBsaXN0X2hlYWQgYWxsX2RyaXZlcnM7CisKKwlzdHJ1Y3QgdHBfYWNwaV9kcnZfc3RydWN0ICphY3BpOworCisJc3RydWN0IHsKKwkJdTggYWNwaV9kcml2ZXJfcmVnaXN0ZXJlZDoxOworCQl1OCBhY3BpX25vdGlmeV9pbnN0YWxsZWQ6MTsKKwkJdTggcHJvY19jcmVhdGVkOjE7CisJCXU4IGluaXRfY2FsbGVkOjE7CisJCXU4IGV4cGVyaW1lbnRhbDoxOworCX0gZmxhZ3M7Cit9OworCitzdHJ1Y3QgaWJtX2luaXRfc3RydWN0IHsKKwljaGFyIHBhcmFtWzMyXTsKKworCWludCAoKmluaXQpIChzdHJ1Y3QgaWJtX2luaXRfc3RydWN0ICopOworCXN0cnVjdCBpYm1fc3RydWN0ICpkYXRhOworfTsKKworc3RhdGljIHN0cnVjdCB7CisjaWZkZWYgQ09ORklHX1RISU5LUEFEX0FDUElfQkFZCisJdTE2IGJheV9zdGF0dXM6MTsKKwl1MTYgYmF5X2VqZWN0OjE7CisJdTE2IGJheV9zdGF0dXMyOjE7CisJdTE2IGJheV9lamVjdDI6MTsKKyNlbmRpZgorCXUxNiBibHVldG9vdGg6MTsKKwl1MTYgaG90a2V5OjE7CisJdTE2IGhvdGtleV9tYXNrOjE7CisJdTE2IGxpZ2h0OjE7CisJdTE2IGxpZ2h0X3N0YXR1czoxOworCXUxNiB3YW46MTsKKwl1MTYgZmFuX2N0cmxfc3RhdHVzX3VuZGVmOjE7Cit9IHRwX2ZlYXR1cmVzOworCitzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCB0cGFjcGlfYWxsX2RyaXZlcnM7CisKK3N0YXRpYyBzdHJ1Y3QgaWJtX2luaXRfc3RydWN0IGlibXNfaW5pdFtdOworc3RhdGljIGludCBzZXRfaWJtX3BhcmFtKGNvbnN0IGNoYXIgKnZhbCwgc3RydWN0IGtlcm5lbF9wYXJhbSAqa3ApOworc3RhdGljIGludCBpYm1faW5pdChzdHJ1Y3QgaWJtX2luaXRfc3RydWN0ICppaWJtKTsKK3N0YXRpYyB2b2lkIGlibV9leGl0KHN0cnVjdCBpYm1fc3RydWN0ICppYm0pOworCisKKy8qCisgKiBwcm9jZnMgbWFzdGVyIHN1YmRyaXZlcgorICovCitzdGF0aWMgaW50IHRoaW5rcGFkX2FjcGlfZHJpdmVyX2luaXQoc3RydWN0IGlibV9pbml0X3N0cnVjdCAqaWlibSk7CitzdGF0aWMgaW50IHRoaW5rcGFkX2FjcGlfZHJpdmVyX3JlYWQoY2hhciAqcCk7CisKKworLyoKKyAqIEJheSBzdWJkcml2ZXIKKyAqLworCisjaWZkZWYgQ09ORklHX1RISU5LUEFEX0FDUElfQkFZCitzdGF0aWMgYWNwaV9oYW5kbGUgYmF5X2hhbmRsZSwgYmF5X2VqX2hhbmRsZTsKK3N0YXRpYyBhY3BpX2hhbmRsZSBiYXkyX2hhbmRsZSwgYmF5Ml9lal9oYW5kbGU7CisKK3N0YXRpYyBpbnQgYmF5X2luaXQoc3RydWN0IGlibV9pbml0X3N0cnVjdCAqaWlibSk7CitzdGF0aWMgdm9pZCBiYXlfbm90aWZ5KHN0cnVjdCBpYm1fc3RydWN0ICppYm0sIHUzMiBldmVudCk7CitzdGF0aWMgaW50IGJheV9yZWFkKGNoYXIgKnApOworc3RhdGljIGludCBiYXlfd3JpdGUoY2hhciAqYnVmKTsKKyNlbmRpZiAvKiBDT05GSUdfVEhJTktQQURfQUNQSV9CQVkgKi8KKworCisvKgorICogQmVlcCBzdWJkcml2ZXIKKyAqLworCitzdGF0aWMgYWNwaV9oYW5kbGUgYmVlcF9oYW5kbGU7CisKK3N0YXRpYyBpbnQgYmVlcF9yZWFkKGNoYXIgKnApOworc3RhdGljIGludCBiZWVwX3dyaXRlKGNoYXIgKmJ1Zik7CisKKworLyoKKyAqIEJsdWV0b290aCBzdWJkcml2ZXIKKyAqLworCisjZGVmaW5lIFRQQUNQSV9CTFVFVEhfU1lTRlNfR1JPVVAgImJsdWV0b290aCIKKworZW51bSB7CisJLyogQUNQSSBHQkRDL1NCREMgYml0cyAqLworCVRQX0FDUElfQkxVRVRPT1RIX0hXUFJFU0VOVAk9IDB4MDEsCS8qIEJsdWV0b290aCBodyBhdmFpbGFibGUgKi8KKwlUUF9BQ1BJX0JMVUVUT09USF9SQURJT1NTVwk9IDB4MDIsCS8qIEJsdWV0b290aCByYWRpbyBlbmFibGVkICovCisJVFBfQUNQSV9CTFVFVE9PVEhfVU5LCQk9IDB4MDQsCS8qIHVua25vd24gZnVuY3Rpb24gKi8KK307CisKK3N0YXRpYyBpbnQgYmx1ZXRvb3RoX2luaXQoc3RydWN0IGlibV9pbml0X3N0cnVjdCAqaWlibSk7CitzdGF0aWMgaW50IGJsdWV0b290aF9nZXRfcmFkaW9zdyh2b2lkKTsKK3N0YXRpYyBpbnQgYmx1ZXRvb3RoX3NldF9yYWRpb3N3KGludCByYWRpb19vbik7CitzdGF0aWMgaW50IGJsdWV0b290aF9yZWFkKGNoYXIgKnApOworc3RhdGljIGludCBibHVldG9vdGhfd3JpdGUoY2hhciAqYnVmKTsKKworCisvKgorICogQnJpZ2h0bmVzcyAoYmFja2xpZ2h0KSBzdWJkcml2ZXIKKyAqLworCisjZGVmaW5lIFRQQUNQSV9CQUNLTElHSFRfREVWX05BTUUgInRoaW5rcGFkX3NjcmVlbiIKKworc3RhdGljIHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICppYm1fYmFja2xpZ2h0X2RldmljZTsKK3N0YXRpYyBpbnQgYnJpZ2h0bmVzc19vZmZzZXQgPSAweDMxOworCitzdGF0aWMgaW50IGJyaWdodG5lc3NfaW5pdChzdHJ1Y3QgaWJtX2luaXRfc3RydWN0ICppaWJtKTsKK3N0YXRpYyB2b2lkIGJyaWdodG5lc3NfZXhpdCh2b2lkKTsKK3N0YXRpYyBpbnQgYnJpZ2h0bmVzc19nZXQoc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkKTsKK3N0YXRpYyBpbnQgYnJpZ2h0bmVzc19zZXQoaW50IHZhbHVlKTsKK3N0YXRpYyBpbnQgYnJpZ2h0bmVzc191cGRhdGVfc3RhdHVzKHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZCk7CitzdGF0aWMgaW50IGJyaWdodG5lc3NfcmVhZChjaGFyICpwKTsKK3N0YXRpYyBpbnQgYnJpZ2h0bmVzc193cml0ZShjaGFyICpidWYpOworCisKKy8qCisgKiBDTU9TIHN1YmRyaXZlcgorICovCisKK3N0YXRpYyBpbnQgY21vc19yZWFkKGNoYXIgKnApOworc3RhdGljIGludCBjbW9zX3dyaXRlKGNoYXIgKmJ1Zik7CisKKworLyoKKyAqIERvY2sgc3ViZHJpdmVyCisgKi8KKworI2lmZGVmIENPTkZJR19USElOS1BBRF9BQ1BJX0RPQ0sKK3N0YXRpYyBhY3BpX2hhbmRsZSBwY2lfaGFuZGxlOworc3RhdGljIGFjcGlfaGFuZGxlIGRvY2tfaGFuZGxlOworCitzdGF0aWMgdm9pZCBkb2NrX25vdGlmeShzdHJ1Y3QgaWJtX3N0cnVjdCAqaWJtLCB1MzIgZXZlbnQpOworc3RhdGljIGludCBkb2NrX3JlYWQoY2hhciAqcCk7CitzdGF0aWMgaW50IGRvY2tfd3JpdGUoY2hhciAqYnVmKTsKKyNlbmRpZiAvKiBDT05GSUdfVEhJTktQQURfQUNQSV9ET0NLICovCisKKworLyoKKyAqIEVDIGR1bXAgc3ViZHJpdmVyCisgKi8KKworc3RhdGljIGludCBlY2R1bXBfcmVhZChjaGFyICpwKSA7CitzdGF0aWMgaW50IGVjZHVtcF93cml0ZShjaGFyICpidWYpOworCisKKy8qCisgKiBGYW4gc3ViZHJpdmVyCisgKi8KKworZW51bSB7CQkJCQkvKiBGYW4gY29udHJvbCBjb25zdGFudHMgKi8KKwlmYW5fc3RhdHVzX29mZnNldCA9IDB4MmYsCS8qIEVDIHJlZ2lzdGVyIDB4MmYgKi8KKwlmYW5fcnBtX29mZnNldCA9IDB4ODQsCQkvKiBFQyByZWdpc3RlciAweDg0OiBMU0IsIDB4ODUgTVNCIChSUE0pCisJCQkJCSAqIDB4ODQgbXVzdCBiZSByZWFkIGJlZm9yZSAweDg1ICovCisKKwlUUF9FQ19GQU5fRlVMTFNQRUVEID0gMHg0MCwJLyogRUMgZmFuIG1vZGU6IGZ1bGwgc3BlZWQgKi8KKwlUUF9FQ19GQU5fQVVUTwkgICAgPSAweDgwLAkvKiBFQyBmYW4gbW9kZTogYXV0byBmYW4gY29udHJvbCAqLworCisJVFBBQ1BJX0ZBTl9MQVNUX0xFVkVMID0gMHgxMDAsCS8qIFVzZSBjYWNoZWQgbGFzdC1zZWVuIGZhbiBsZXZlbCAqLworfTsKKworZW51bSBmYW5fc3RhdHVzX2FjY2Vzc19tb2RlIHsKKwlUUEFDUElfRkFOX05PTkUgPSAwLAkJLyogTm8gZmFuIHN0YXR1cyBvciBjb250cm9sICovCisJVFBBQ1BJX0ZBTl9SRF9BQ1BJX0dGQU4sCS8qIFVzZSBBQ1BJIEdGQU4gKi8KKwlUUEFDUElfRkFOX1JEX1RQRUMsCQkvKiBVc2UgQUNQSSBFQyByZWdzIDB4MmYsIDB4ODQtMHg4NSAqLworfTsKKworZW51bSBmYW5fY29udHJvbF9hY2Nlc3NfbW9kZSB7CisJVFBBQ1BJX0ZBTl9XUl9OT05FID0gMCwJCS8qIE5vIGZhbiBjb250cm9sICovCisJVFBBQ1BJX0ZBTl9XUl9BQ1BJX1NGQU4sCS8qIFVzZSBBQ1BJIFNGQU4gKi8KKwlUUEFDUElfRkFOX1dSX1RQRUMsCQkvKiBVc2UgQUNQSSBFQyByZWcgMHgyZiAqLworCVRQQUNQSV9GQU5fV1JfQUNQSV9GQU5TLAkvKiBVc2UgQUNQSSBGQU5TIGFuZCBFQyByZWcgMHgyZiAqLworfTsKKworZW51bSBmYW5fY29udHJvbF9jb21tYW5kcyB7CisJVFBBQ1BJX0ZBTl9DTURfU1BFRUQgCT0gMHgwMDAxLAkvKiBzcGVlZCBjb21tYW5kICovCisJVFBBQ1BJX0ZBTl9DTURfTEVWRUwgCT0gMHgwMDAyLAkvKiBsZXZlbCBjb21tYW5kICAqLworCVRQQUNQSV9GQU5fQ01EX0VOQUJMRQk9IDB4MDAwNCwJLyogZW5hYmxlL2Rpc2FibGUgY21kLAorCQkJCQkJICogYW5kIGFsc28gd2F0Y2hkb2cgY21kICovCit9OworCitzdGF0aWMgaW50IGZhbl9jb250cm9sX2FsbG93ZWQ7CisKK3N0YXRpYyBlbnVtIGZhbl9zdGF0dXNfYWNjZXNzX21vZGUgZmFuX3N0YXR1c19hY2Nlc3NfbW9kZTsKK3N0YXRpYyBlbnVtIGZhbl9jb250cm9sX2FjY2Vzc19tb2RlIGZhbl9jb250cm9sX2FjY2Vzc19tb2RlOworc3RhdGljIGVudW0gZmFuX2NvbnRyb2xfY29tbWFuZHMgZmFuX2NvbnRyb2xfY29tbWFuZHM7CitzdGF0aWMgdTggZmFuX2NvbnRyb2xfaW5pdGlhbF9zdGF0dXM7CitzdGF0aWMgdTggZmFuX2NvbnRyb2xfZGVzaXJlZF9sZXZlbDsKK3N0YXRpYyBpbnQgZmFuX3dhdGNoZG9nX21heGludGVydmFsOworCitzdGF0aWMgc3RydWN0IG11dGV4IGZhbl9tdXRleDsKKworc3RhdGljIGFjcGlfaGFuZGxlIGZhbnNfaGFuZGxlLCBnZmFuX2hhbmRsZSwgc2Zhbl9oYW5kbGU7CisKK3N0YXRpYyBpbnQgZmFuX2luaXQoc3RydWN0IGlibV9pbml0X3N0cnVjdCAqaWlibSk7CitzdGF0aWMgdm9pZCBmYW5fZXhpdCh2b2lkKTsKK3N0YXRpYyBpbnQgZmFuX2dldF9zdGF0dXModTggKnN0YXR1cyk7CitzdGF0aWMgaW50IGZhbl9nZXRfc3RhdHVzX3NhZmUodTggKnN0YXR1cyk7CitzdGF0aWMgaW50IGZhbl9nZXRfc3BlZWQodW5zaWduZWQgaW50ICpzcGVlZCk7CitzdGF0aWMgdm9pZCBmYW5fdXBkYXRlX2Rlc2lyZWRfbGV2ZWwodTggc3RhdHVzKTsKK3N0YXRpYyB2b2lkIGZhbl93YXRjaGRvZ19maXJlKHN0cnVjdCB3b3JrX3N0cnVjdCAqaWdub3JlZCk7CitzdGF0aWMgdm9pZCBmYW5fd2F0Y2hkb2dfcmVzZXQodm9pZCk7CitzdGF0aWMgaW50IGZhbl9zZXRfbGV2ZWwoaW50IGxldmVsKTsKK3N0YXRpYyBpbnQgZmFuX3NldF9sZXZlbF9zYWZlKGludCBsZXZlbCk7CitzdGF0aWMgaW50IGZhbl9zZXRfZW5hYmxlKHZvaWQpOworc3RhdGljIGludCBmYW5fc2V0X2Rpc2FibGUodm9pZCk7CitzdGF0aWMgaW50IGZhbl9zZXRfc3BlZWQoaW50IHNwZWVkKTsKK3N0YXRpYyBpbnQgZmFuX3JlYWQoY2hhciAqcCk7CitzdGF0aWMgaW50IGZhbl93cml0ZShjaGFyICpidWYpOworc3RhdGljIGludCBmYW5fd3JpdGVfY21kX2xldmVsKGNvbnN0IGNoYXIgKmNtZCwgaW50ICpyYyk7CitzdGF0aWMgaW50IGZhbl93cml0ZV9jbWRfZW5hYmxlKGNvbnN0IGNoYXIgKmNtZCwgaW50ICpyYyk7CitzdGF0aWMgaW50IGZhbl93cml0ZV9jbWRfZGlzYWJsZShjb25zdCBjaGFyICpjbWQsIGludCAqcmMpOworc3RhdGljIGludCBmYW5fd3JpdGVfY21kX3NwZWVkKGNvbnN0IGNoYXIgKmNtZCwgaW50ICpyYyk7CitzdGF0aWMgaW50IGZhbl93cml0ZV9jbWRfd2F0Y2hkb2coY29uc3QgY2hhciAqY21kLCBpbnQgKnJjKTsKKworCisvKgorICogSG90a2V5IHN1YmRyaXZlcgorICovCisKKyNkZWZpbmUgVFBBQ1BJX0hPVEtFWV9TWVNGU19HUk9VUCAiaG90a2V5IgorCitzdGF0aWMgaW50IGhvdGtleV9vcmlnX3N0YXR1czsKK3N0YXRpYyBpbnQgaG90a2V5X29yaWdfbWFzazsKKworc3RhdGljIHN0cnVjdCBtdXRleCBob3RrZXlfbXV0ZXg7CisKK3N0YXRpYyBpbnQgaG90a2V5X2luaXQoc3RydWN0IGlibV9pbml0X3N0cnVjdCAqaWlibSk7CitzdGF0aWMgdm9pZCBob3RrZXlfZXhpdCh2b2lkKTsKK3N0YXRpYyBpbnQgaG90a2V5X2dldChpbnQgKnN0YXR1cywgaW50ICptYXNrKTsKK3N0YXRpYyBpbnQgaG90a2V5X3NldChpbnQgc3RhdHVzLCBpbnQgbWFzayk7CitzdGF0aWMgdm9pZCBob3RrZXlfbm90aWZ5KHN0cnVjdCBpYm1fc3RydWN0ICppYm0sIHUzMiBldmVudCk7CitzdGF0aWMgaW50IGhvdGtleV9yZWFkKGNoYXIgKnApOworc3RhdGljIGludCBob3RrZXlfd3JpdGUoY2hhciAqYnVmKTsKKworCisvKgorICogTEVEIHN1YmRyaXZlcgorICovCisKK2VudW0gbGVkX2FjY2Vzc19tb2RlIHsKKwlUUEFDUElfTEVEX05PTkUgPSAwLAorCVRQQUNQSV9MRURfNTcwLAkvKiA1NzAgKi8KKwlUUEFDUElfTEVEX09MRCwJLyogNjAwZS94LCA3NzBlLCA3NzB4LCBBMjFlLCBBMnhtL3AsIFQyMC0yMiwgWDIwLTIxICovCisJVFBBQ1BJX0xFRF9ORVcsCS8qIGFsbCBvdGhlcnMgKi8KK307CisKK2VudW0gewkvKiBGb3IgVFBBQ1BJX0xFRF9PTEQgKi8KKwlUUEFDUElfTEVEX0VDX0hMQ0wgPSAweDBjLAkvKiBFQyByZWcgdG8gZ2V0IGxlZCB0byBwb3dlciBvbiAqLworCVRQQUNQSV9MRURfRUNfSExCTCA9IDB4MGQsCS8qIEVDIHJlZyB0byBibGluayBhIGxpdCBsZWQgKi8KKwlUUEFDUElfTEVEX0VDX0hMTVMgPSAweDBlLAkvKiBFQyByZWcgdG8gc2VsZWN0IGxlZCB0byBjb21tYW5kICovCit9OworCitzdGF0aWMgZW51bSBsZWRfYWNjZXNzX21vZGUgbGVkX3N1cHBvcnRlZDsKK3N0YXRpYyBhY3BpX2hhbmRsZSBsZWRfaGFuZGxlOworCitzdGF0aWMgaW50IGxlZF9pbml0KHN0cnVjdCBpYm1faW5pdF9zdHJ1Y3QgKmlpYm0pOworc3RhdGljIGludCBsZWRfcmVhZChjaGFyICpwKTsKK3N0YXRpYyBpbnQgbGVkX3dyaXRlKGNoYXIgKmJ1Zik7CisKKy8qCisgKiBMaWdodCAodGhpbmtsaWdodCkgc3ViZHJpdmVyCisgKi8KKworc3RhdGljIGFjcGlfaGFuZGxlIGxnaHRfaGFuZGxlLCBsZWRiX2hhbmRsZTsKKworc3RhdGljIGludCBsaWdodF9pbml0KHN0cnVjdCBpYm1faW5pdF9zdHJ1Y3QgKmlpYm0pOworc3RhdGljIGludCBsaWdodF9yZWFkKGNoYXIgKnApOworc3RhdGljIGludCBsaWdodF93cml0ZShjaGFyICpidWYpOworCisKKy8qCisgKiBUaGVybWFsIHN1YmRyaXZlcgorICovCisKK2VudW0gdGhlcm1hbF9hY2Nlc3NfbW9kZSB7CisJVFBBQ1BJX1RIRVJNQUxfTk9ORSA9IDAsCS8qIE5vIHRoZXJtYWwgc3VwcG9ydCAqLworCVRQQUNQSV9USEVSTUFMX0FDUElfVE1QMDcsCS8qIFVzZSBBQ1BJIFRNUDAtNyAqLworCVRQQUNQSV9USEVSTUFMX0FDUElfVVBEVCwJLyogVXNlIEFDUEkgVE1QMC03IHdpdGggVVBEVCAqLworCVRQQUNQSV9USEVSTUFMX1RQRUNfOCwJCS8qIFVzZSBBQ1BJIEVDIHJlZ3MsIDggc2Vuc29ycyAqLworCVRQQUNQSV9USEVSTUFMX1RQRUNfMTYsCQkvKiBVc2UgQUNQSSBFQyByZWdzLCAxNiBzZW5zb3JzICovCit9OworCitlbnVtIHsgLyogVFBBQ1BJX1RIRVJNQUxfVFBFQ18qICovCisJVFBfRUNfVEhFUk1BTF9UTVAwID0gMHg3OCwJLyogQUNQSSBFQyByZWdzIFRNUCAwLi43ICovCisJVFBfRUNfVEhFUk1BTF9UTVA4ID0gMHhDMCwJLyogQUNQSSBFQyByZWdzIFRNUCA4Li4xNSAqLworCVRQX0VDX1RIRVJNQUxfVE1QX05BID0gLTEyOCwJLyogQUNQSSBFQyBzZW5zb3Igbm90IGF2YWlsYWJsZSAqLworfTsKKworI2RlZmluZSBUUEFDUElfTUFYX1RIRVJNQUxfU0VOU09SUyAxNgkvKiBNYXggdGhlcm1hbCBzZW5zb3JzIHN1cHBvcnRlZCAqLworc3RydWN0IGlibV90aGVybWFsX3NlbnNvcnNfc3RydWN0IHsKKwlzMzIgdGVtcFtUUEFDUElfTUFYX1RIRVJNQUxfU0VOU09SU107Cit9OworCitzdGF0aWMgZW51bSB0aGVybWFsX2FjY2Vzc19tb2RlIHRoZXJtYWxfcmVhZF9tb2RlOworCitzdGF0aWMgaW50IHRoZXJtYWxfaW5pdChzdHJ1Y3QgaWJtX2luaXRfc3RydWN0ICppaWJtKTsKK3N0YXRpYyBpbnQgdGhlcm1hbF9nZXRfc2Vuc29yKGludCBpZHgsIHMzMiAqdmFsdWUpOworc3RhdGljIGludCB0aGVybWFsX2dldF9zZW5zb3JzKHN0cnVjdCBpYm1fdGhlcm1hbF9zZW5zb3JzX3N0cnVjdCAqcyk7CitzdGF0aWMgaW50IHRoZXJtYWxfcmVhZChjaGFyICpwKTsKKworCisvKgorICogVmlkZW8gc3ViZHJpdmVyCisgKi8KKworZW51bSB2aWRlb19hY2Nlc3NfbW9kZSB7CisJVFBBQ1BJX1ZJREVPX05PTkUgPSAwLAorCVRQQUNQSV9WSURFT181NzAsCS8qIDU3MCAqLworCVRQQUNQSV9WSURFT183NzAsCS8qIDYwMGUveCwgNzcwZSwgNzcweCAqLworCVRQQUNQSV9WSURFT19ORVcsCS8qIGFsbCBvdGhlcnMgKi8KK307CisKK2VudW0gewkvKiB2aWRlbyBzdGF0dXMgZmxhZ3MsIGJhc2VkIG9uIFZJREVPXzU3MCAqLworCVRQX0FDUElfVklERU9fU19MQ0QgPSAweDAxLAkvKiBMQ0Qgb3V0cHV0IGVuYWJsZWQgKi8KKwlUUF9BQ1BJX1ZJREVPX1NfQ1JUID0gMHgwMiwJLyogQ1JUIG91dHB1dCBlbmFibGVkICovCisJVFBfQUNQSV9WSURFT19TX0RWSSA9IDB4MDgsCS8qIERWSSBvdXRwdXQgZW5hYmxlZCAqLworfTsKKworZW51bSB7ICAvKiBUUEFDUElfVklERU9fNTcwIGNvbnN0YW50cyAqLworCVRQX0FDUElfVklERU9fNTcwX1BIU0NNRCA9IDB4ODcsCS8qIHVua25vd24gbWFnaWMgY29uc3RhbnQgOiggKi8KKwlUUF9BQ1BJX1ZJREVPXzU3MF9QSFNNQVNLID0gMHgwMywJLyogUEhTIGJpdHMgdGhhdCBtYXAgdG8KKwkJCQkJCSAqIHZpZGVvX3N0YXR1c19mbGFncyAqLworCVRQX0FDUElfVklERU9fNTcwX1BIUzJDTUQgPSAweDhiLAkvKiB1bmtub3duIG1hZ2ljIGNvbnN0YW50IDooICovCisJVFBfQUNQSV9WSURFT181NzBfUEhTMlNFVCA9IDB4ODAsCS8qIHVua25vd24gbWFnaWMgY29uc3RhbnQgOiggKi8KK307CisKK3N0YXRpYyBlbnVtIHZpZGVvX2FjY2Vzc19tb2RlIHZpZGVvX3N1cHBvcnRlZDsKK3N0YXRpYyBpbnQgdmlkZW9fb3JpZ19hdXRvc3c7CitzdGF0aWMgYWNwaV9oYW5kbGUgdmlkX2hhbmRsZSwgdmlkMl9oYW5kbGU7CisKK3N0YXRpYyBpbnQgdmlkZW9faW5pdChzdHJ1Y3QgaWJtX2luaXRfc3RydWN0ICppaWJtKTsKK3N0YXRpYyB2b2lkIHZpZGVvX2V4aXQodm9pZCk7CitzdGF0aWMgaW50IHZpZGVvX291dHB1dHN3X2dldCh2b2lkKTsKK3N0YXRpYyBpbnQgdmlkZW9fb3V0cHV0c3dfc2V0KGludCBzdGF0dXMpOworc3RhdGljIGludCB2aWRlb19hdXRvc3dfZ2V0KHZvaWQpOworc3RhdGljIGludCB2aWRlb19hdXRvc3dfc2V0KGludCBlbmFibGUpOworc3RhdGljIGludCB2aWRlb19vdXRwdXRzd19jeWNsZSh2b2lkKTsKK3N0YXRpYyBpbnQgdmlkZW9fZXhwYW5kX3RvZ2dsZSh2b2lkKTsKK3N0YXRpYyBpbnQgdmlkZW9fcmVhZChjaGFyICpwKTsKK3N0YXRpYyBpbnQgdmlkZW9fd3JpdGUoY2hhciAqYnVmKTsKKworCisvKgorICogVm9sdW1lIHN1YmRyaXZlcgorICovCisKK3N0YXRpYyBpbnQgdm9sdW1lX29mZnNldCA9IDB4MzA7CisKK3N0YXRpYyBpbnQgdm9sdW1lX3JlYWQoY2hhciAqcCk7CitzdGF0aWMgaW50IHZvbHVtZV93cml0ZShjaGFyICpidWYpOworCisKKy8qCisgKiBXYW4gc3ViZHJpdmVyCisgKi8KKworI2RlZmluZSBUUEFDUElfV0FOX1NZU0ZTX0dST1VQICJ3d2FuIgorCitlbnVtIHsKKwkvKiBBQ1BJIEdXQU4vU1dBTiBiaXRzICovCisJVFBfQUNQSV9XQU5DQVJEX0hXUFJFU0VOVAk9IDB4MDEsCS8qIFdhbiBodyBhdmFpbGFibGUgKi8KKwlUUF9BQ1BJX1dBTkNBUkRfUkFESU9TU1cJPSAweDAyLAkvKiBXYW4gcmFkaW8gZW5hYmxlZCAqLworCVRQX0FDUElfV0FOQ0FSRF9VTksJCT0gMHgwNCwJLyogdW5rbm93biBmdW5jdGlvbiAqLworfTsKKworc3RhdGljIGludCB3YW5faW5pdChzdHJ1Y3QgaWJtX2luaXRfc3RydWN0ICppaWJtKTsKK3N0YXRpYyBpbnQgd2FuX2dldF9yYWRpb3N3KHZvaWQpOworc3RhdGljIGludCB3YW5fc2V0X3JhZGlvc3coaW50IHJhZGlvX29uKTsKK3N0YXRpYyBpbnQgd2FuX3JlYWQoY2hhciAqcCk7CitzdGF0aWMgaW50IHdhbl93cml0ZShjaGFyICpidWYpOworCisKKyNlbmRpZiAvKiBfX1RISU5LUEFEX0FDUElfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvbW1jX3N5c2ZzLmMgYi9kcml2ZXJzL21tYy9tbWNfc3lzZnMuYwppbmRleCBkMzI2OThiLi5lMGU4MmQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9tbWNfc3lzZnMuYworKysgYi9kcml2ZXJzL21tYy9tbWNfc3lzZnMuYwpAQCAtODYsMzEgKzg2LDI2IEBACiB7CiAJc3RydWN0IG1tY19jYXJkICpjYXJkID0gZGV2X3RvX21tY19jYXJkKGRldik7CiAJY2hhciBjY2NbMTNdOwotCWludCBpID0gMDsKKwlpbnQgcmV0dmFsID0gMCwgaSA9IDAsIGxlbmd0aCA9IDA7CiAKLSNkZWZpbmUgYWRkX2VudihmbXQsdmFsKQkJCQkJCVwKLQkoewkJCQkJCQkJXAotCQlpbnQgbGVuLCByZXQgPSAtRU5PTUVNOwkJCQkJXAotCQlpZiAoaSA8IG51bV9lbnZwKSB7CQkJCQlcCi0JCQllbnZwW2krK10gPSBidWY7CQkJCVwKLQkJCWxlbiA9IHNucHJpbnRmKGJ1ZiwgYnVmX3NpemUsIGZtdCwgdmFsKSArIDE7CVwKLQkJCWJ1Zl9zaXplIC09IGxlbjsJCQkJXAotCQkJYnVmICs9IGxlbjsJCQkJCVwKLQkJCWlmIChidWZfc2l6ZSA+PSAwKQkJCQlcCi0JCQkJcmV0ID0gMDsJCQkJXAotCQl9CQkJCQkJCVwKLQkJcmV0OwkJCQkJCQlcCi0JfSkKKyNkZWZpbmUgYWRkX2VudihmbXQsdmFsKSBkbyB7CQkJCQlcCisJcmV0dmFsID0gYWRkX3VldmVudF92YXIoZW52cCwgbnVtX2VudnAsICZpLAkJXAorCQkJCWJ1ZiwgYnVmX3NpemUsICZsZW5ndGgsCQlcCisJCQkJZm10LCB2YWwpOwkJCVwKKwlpZiAocmV0dmFsKQkJCQkJCVwKKwkJcmV0dXJuIHJldHZhbDsJCQkJCVwKK30gd2hpbGUgKDApOwogCiAJZm9yIChpID0gMDsgaSA8IDEyOyBpKyspCiAJCWNjY1tpXSA9IGNhcmQtPmNzZC5jbWRjbGFzcyAmICgxIDw8IGkpID8gJzEnIDogJzAnOwogCWNjY1sxMl0gPSAnXDAnOwogCi0JaSA9IDA7CiAJYWRkX2VudigiTU1DX0NDQz0lcyIsIGNjYyk7CiAJYWRkX2VudigiTU1DX01BTkZJRD0lMDZ4IiwgY2FyZC0+Y2lkLm1hbmZpZCk7CiAJYWRkX2VudigiTU1DX05BTUU9JXMiLCBtbWNfY2FyZF9uYW1lKGNhcmQpKTsKIAlhZGRfZW52KCJNTUNfT0VNSUQ9JTA0eCIsIGNhcmQtPmNpZC5vZW1pZCk7CisjdW5kZWYgYWRkX2VudgorCWVudnBbaV0gPSBOVUxMOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9LY29uZmlnIGIvZHJpdmVycy9tdGQvS2NvbmZpZwppbmRleCAyNmY3NWMyLi5jMWI0N2RiIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbXRkL0tjb25maWcKQEAgLTEsOCArMSw2IEBACiAjICRJZDogS2NvbmZpZyx2IDEuMTEgMjAwNS8xMS8wNyAxMToxNDoxOSBnbGVpeG5lciBFeHAgJAogCi1tZW51ICJNZW1vcnkgVGVjaG5vbG9neSBEZXZpY2VzIChNVEQpIgotCi1jb25maWcgTVRECittZW51Y29uZmlnIE1URAogCXRyaXN0YXRlICJNZW1vcnkgVGVjaG5vbG9neSBEZXZpY2UgKE1URCkgc3VwcG9ydCIKIAloZWxwCiAJICBNZW1vcnkgVGVjaG5vbG9neSBEZXZpY2VzIGFyZSBmbGFzaCwgUkFNIGFuZCBzaW1pbGFyIGNoaXBzLCBvZnRlbgpAQCAtMTMsOSArMTEsMTAgQEAKIAkgIHRoZW0uIEl0IHdpbGwgYWxzbyBhbGxvdyB5b3UgdG8gc2VsZWN0IGluZGl2aWR1YWwgZHJpdmVycyBmb3IKIAkgIHBhcnRpY3VsYXIgaGFyZHdhcmUgYW5kIHVzZXJzIG9mIE1URCBkZXZpY2VzLiBJZiB1bnN1cmUsIHNheSBOLgogCitpZiBNVEQKKwogY29uZmlnIE1URF9ERUJVRwogCWJvb2wgIkRlYnVnZ2luZyIKLQlkZXBlbmRzIG9uIE1URAogCWhlbHAKIAkgIFRoaXMgdHVybnMgb24gbG93LWxldmVsIGRlYnVnZ2luZyBmb3IgdGhlIGVudGlyZSBNVEQgc3ViLXN5c3RlbS4KIAkgIE5vcm1hbGx5LCB5b3Ugc2hvdWxkIHNheSAnTicuCkBAIC0yOSw3ICsyOCw2IEBACiAKIGNvbmZpZyBNVERfQ09OQ0FUCiAJdHJpc3RhdGUgIk1URCBjb25jYXRlbmF0aW5nIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBNVEQKIAloZWxwCiAJICBTdXBwb3J0IGZvciBjb25jYXRlbmF0aW5nIHNldmVyYWwgTVREIGRldmljZXMgaW50byBhIHNpbmdsZQogCSAgKHZpcnR1YWwpIG9uZS4gVGhpcyBhbGxvd3MgeW91IHRvIGhhdmUgLWZvciBleGFtcGxlLSBhIEpGRlMoMikKQEAgLTM4LDcgKzM2LDYgQEAKIAogY29uZmlnIE1URF9QQVJUSVRJT05TCiAJYm9vbCAiTVREIHBhcnRpdGlvbmluZyBzdXBwb3J0IgotCWRlcGVuZHMgb24gTVRECiAJaGVscAogCSAgSWYgeW91IGhhdmUgYSBkZXZpY2Ugd2hpY2ggbmVlZHMgdG8gZGl2aWRlIGl0cyBmbGFzaCBjaGlwKHMpIHVwCiAJICBpbnRvIG11bHRpcGxlICdwYXJ0aXRpb25zJywgZWFjaCBvZiB3aGljaCBhcHBlYXJzIHRvIHRoZSB1c2VyIGFzCkBAIC0xNTMsMTEgKzE1MCw5IEBACiAJICAnYXJtZmxhc2gnIG1hcCBkcml2ZXIgKENPTkZJR19NVERfQVJNRkxBU0gpIGRvZXMgdGhpcywgZm9yIGV4YW1wbGUuCiAKIGNvbW1lbnQgIlVzZXIgTW9kdWxlcyBBbmQgVHJhbnNsYXRpb24gTGF5ZXJzIgotCWRlcGVuZHMgb24gTVRECiAKIGNvbmZpZyBNVERfQ0hBUgogCXRyaXN0YXRlICJEaXJlY3QgY2hhciBkZXZpY2UgYWNjZXNzIHRvIE1URCBkZXZpY2VzIgotCWRlcGVuZHMgb24gTVRECiAJaGVscAogCSAgVGhpcyBwcm92aWRlcyBhIGNoYXJhY3RlciBkZXZpY2UgZm9yIGVhY2ggTVREIGRldmljZSBwcmVzZW50IGluCiAJICB0aGUgc3lzdGVtLCBhbGxvd2luZyB0aGUgdXNlciB0byByZWFkIGFuZCB3cml0ZSBkaXJlY3RseSB0byB0aGUKQEAgLTE2NiwxMiArMTYxLDEyIEBACiAKIGNvbmZpZyBNVERfQkxLREVWUwogCXRyaXN0YXRlICJDb21tb24gaW50ZXJmYWNlIHRvIGJsb2NrIGxheWVyIGZvciBNVEQgJ3RyYW5zbGF0aW9uIGxheWVycyciCi0JZGVwZW5kcyBvbiBNVEQgJiYgQkxPQ0sKKwlkZXBlbmRzIG9uIEJMT0NLCiAJZGVmYXVsdCBuCiAKIGNvbmZpZyBNVERfQkxPQ0sKIAl0cmlzdGF0ZSAiQ2FjaGluZyBibG9jayBkZXZpY2UgYWNjZXNzIHRvIE1URCBkZXZpY2VzIgotCWRlcGVuZHMgb24gTVREICYmIEJMT0NLCisJZGVwZW5kcyBvbiBCTE9DSwogCXNlbGVjdCBNVERfQkxLREVWUwogCS0tLWhlbHAtLS0KIAkgIEFsdGhvdWdoIG1vc3QgZmxhc2ggY2hpcHMgaGF2ZSBhbiBlcmFzZSBzaXplIHRvbyBsYXJnZSB0byBiZSB1c2VmdWwKQEAgLTE5NCw3ICsxODksNyBAQAogCiBjb25maWcgTVREX0JMT0NLX1JPCiAJdHJpc3RhdGUgIlJlYWRvbmx5IGJsb2NrIGRldmljZSBhY2Nlc3MgdG8gTVREIGRldmljZXMiCi0JZGVwZW5kcyBvbiBNVERfQkxPQ0shPXkgJiYgTVREICYmIEJMT0NLCisJZGVwZW5kcyBvbiBNVERfQkxPQ0shPXkgJiYgQkxPQ0sKIAlzZWxlY3QgTVREX0JMS0RFVlMKIAloZWxwCiAJICBUaGlzIGFsbG93cyB5b3UgdG8gbW91bnQgcmVhZC1vbmx5IGZpbGUgc3lzdGVtcyAoc3VjaCBhcyBjcmFtZnMpCkBAIC0yMDYsNyArMjAxLDcgQEAKIAogY29uZmlnIEZUTAogCXRyaXN0YXRlICJGVEwgKEZsYXNoIFRyYW5zbGF0aW9uIExheWVyKSBzdXBwb3J0IgotCWRlcGVuZHMgb24gTVREICYmIEJMT0NLCisJZGVwZW5kcyBvbiBCTE9DSwogCXNlbGVjdCBNVERfQkxLREVWUwogCS0tLWhlbHAtLS0KIAkgIFRoaXMgcHJvdmlkZXMgc3VwcG9ydCBmb3IgdGhlIG9yaWdpbmFsIEZsYXNoIFRyYW5zbGF0aW9uIExheWVyIHdoaWNoCkBAIC0yMjMsNyArMjE4LDcgQEAKIAogY29uZmlnIE5GVEwKIAl0cmlzdGF0ZSAiTkZUTCAoTkFORCBGbGFzaCBUcmFuc2xhdGlvbiBMYXllcikgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIE1URCAmJiBCTE9DSworCWRlcGVuZHMgb24gQkxPQ0sKIAlzZWxlY3QgTVREX0JMS0RFVlMKIAktLS1oZWxwLS0tCiAJICBUaGlzIHByb3ZpZGVzIHN1cHBvcnQgZm9yIHRoZSBOQU5EIEZsYXNoIFRyYW5zbGF0aW9uIExheWVyIHdoaWNoIGlzCkBAIC0yNDcsNyArMjQyLDcgQEAKIAogY29uZmlnIElORlRMCiAJdHJpc3RhdGUgIklORlRMIChJbnZlcnNlIE5BTkQgRmxhc2ggVHJhbnNsYXRpb24gTGF5ZXIpIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBNVEQgJiYgQkxPQ0sKKwlkZXBlbmRzIG9uIEJMT0NLCiAJc2VsZWN0IE1URF9CTEtERVZTCiAJLS0taGVscC0tLQogCSAgVGhpcyBwcm92aWRlcyBzdXBwb3J0IGZvciB0aGUgSW52ZXJzZSBOQU5EIEZsYXNoIFRyYW5zbGF0aW9uCkBAIC0yNjUsNyArMjYwLDcgQEAKIAogY29uZmlnIFJGRF9GVEwKICAgICAgICAgdHJpc3RhdGUgIlJlc2lkZW50IEZsYXNoIERpc2sgKEZsYXNoIFRyYW5zbGF0aW9uIExheWVyKSBzdXBwb3J0IgotCWRlcGVuZHMgb24gTVREICYmIEJMT0NLCisJZGVwZW5kcyBvbiBCTE9DSwogCXNlbGVjdCBNVERfQkxLREVWUwogCS0tLWhlbHAtLS0KIAkgIFRoaXMgcHJvdmlkZXMgc3VwcG9ydCBmb3IgdGhlIGZsYXNoIHRyYW5zbGF0aW9uIGxheWVyIGtub3duCkBAIC0yNzYsNyArMjcxLDcgQEAKIAogY29uZmlnIFNTRkRDCiAJdHJpc3RhdGUgIk5BTkQgU1NGREMgKFNtYXJ0TWVkaWEpIHJlYWQgb25seSB0cmFuc2xhdGlvbiBsYXllciIKLQlkZXBlbmRzIG9uIE1URCAmJiBCTE9DSworCWRlcGVuZHMgb24gQkxPQ0sKIAlzZWxlY3QgTVREX0JMS0RFVlMKIAloZWxwCiAJICBUaGlzIGVuYWJsZXMgcmVhZCBvbmx5IGFjY2VzcyB0byBTbWFydE1lZGlhIGZvcm1hdHRlZCBOQU5ECkBAIC0yOTIsNSArMjg3LDYgQEAKIAogc291cmNlICJkcml2ZXJzL210ZC9vbmVuYW5kL0tjb25maWciCiAKLWVuZG1lbnUKK3NvdXJjZSAiZHJpdmVycy9tdGQvdWJpL0tjb25maWciCiAKK2VuZGlmICMgTVRECmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9NYWtlZmlsZSBiL2RyaXZlcnMvbXRkL01ha2VmaWxlCmluZGV4IGMxMzBlNjIuLjkyMDU1NDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbXRkL01ha2VmaWxlCkBAIC0yOCwzICsyOCw1IEBACiBpbmZ0bC1vYmpzCQk6PSBpbmZ0bGNvcmUubyBpbmZ0bG1vdW50Lm8KIAogb2JqLXkJCSs9IGNoaXBzLyBtYXBzLyBkZXZpY2VzLyBuYW5kLyBvbmVuYW5kLworCitvYmotJChDT05GSUdfTVREX1VCSSkJCSs9IHViaS8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL2NoaXBzL0tjb25maWcgYi9kcml2ZXJzL210ZC9jaGlwcy9LY29uZmlnCmluZGV4IDcyZTZkNzMuLmQyOGUwZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL2NoaXBzL0tjb25maWcKKysrIGIvZHJpdmVycy9tdGQvY2hpcHMvS2NvbmZpZwpAQCAtNiw3ICs2LDYgQEAKIAogY29uZmlnIE1URF9DRkkKIAl0cmlzdGF0ZSAiRGV0ZWN0IGZsYXNoIGNoaXBzIGJ5IENvbW1vbiBGbGFzaCBJbnRlcmZhY2UgKENGSSkgcHJvYmUiCi0JZGVwZW5kcyBvbiBNVEQKIAlzZWxlY3QgTVREX0dFTl9QUk9CRQogCWhlbHAKIAkgIFRoZSBDb21tb24gRmxhc2ggSW50ZXJmYWNlIHNwZWNpZmljYXRpb24gd2FzIGRldmVsb3BlZCBieSBJbnRlbCwKQEAgLTE4LDcgKzE3LDYgQEAKIAogY29uZmlnIE1URF9KRURFQ1BST0JFCiAJdHJpc3RhdGUgIkRldGVjdCBub24tQ0ZJIEFNRC9KRURFQy1jb21wYXRpYmxlIGZsYXNoIGNoaXBzIgotCWRlcGVuZHMgb24gTVRECiAJc2VsZWN0IE1URF9HRU5fUFJPQkUKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIEpFREVDLXN0eWxlIHByb2Jpbmcgb2YgZmxhc2ggY2hpcHMgd2hpY2ggYXJlIG5vdApAQCAtMjEzLDIxICsyMTEsMTggQEAKIAogY29uZmlnIE1URF9SQU0KIAl0cmlzdGF0ZSAiU3VwcG9ydCBmb3IgUkFNIGNoaXBzIGluIGJ1cyBtYXBwaW5nIgotCWRlcGVuZHMgb24gTVRECiAJaGVscAogCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBiYXNpYyBzdXBwb3J0IGZvciBSQU0gY2hpcHMgYWNjZXNzZWQgdGhyb3VnaAogCSAgYSBidXMgbWFwcGluZyBkcml2ZXIuCiAKIGNvbmZpZyBNVERfUk9NCiAJdHJpc3RhdGUgIlN1cHBvcnQgZm9yIFJPTSBjaGlwcyBpbiBidXMgbWFwcGluZyIKLQlkZXBlbmRzIG9uIE1URAogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgYmFzaWMgc3VwcG9ydCBmb3IgUk9NIGNoaXBzIGFjY2Vzc2VkIHRocm91Z2gKIAkgIGEgYnVzIG1hcHBpbmcgZHJpdmVyLgogCiBjb25maWcgTVREX0FCU0VOVAogCXRyaXN0YXRlICJTdXBwb3J0IGZvciBhYnNlbnQgY2hpcHMgaW4gYnVzIG1hcHBpbmciCi0JZGVwZW5kcyBvbiBNVEQKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIGEgZHVtbXkgcHJvYmluZyBkcml2ZXIgdXNlZCB0bwogCSAgYWxsb2NhdGVkIHBsYWNlaG9sZGVyIE1URCBkZXZpY2VzIG9uIHN5c3RlbXMgdGhhdCBoYXZlIHNvY2tldGVkCkBAIC0yMzcsNyArMjMyLDYgQEAKIAkgIHdpdGggdGhpcyBkcml2ZXIgd2lsbCByZXR1cm4gLUVOT0RFViB1cG9uIGFjY2Vzcy4KIAogY29uZmlnIE1URF9PQlNPTEVURV9DSElQUwotCWRlcGVuZHMgb24gTVRECiAJYm9vbCAiT2xkZXIgKHRoZW9yZXRpY2FsbHkgb2Jzb2xldGVkIG5vdykgZHJpdmVycyBmb3Igbm9uLUNGSSBjaGlwcyIKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBkb2VzIG5vdCBlbmFibGUgYW55IGNvZGUgZGlyZWN0bHksIGJ1dCB3aWxsIGFsbG93IHlvdSB0bwpAQCAtMjUwLDcgKzI0NCw3IEBACiAKIGNvbmZpZyBNVERfQU1EU1RECiAJdHJpc3RhdGUgIkFNRCBjb21wYXRpYmxlIGZsYXNoIGNoaXAgc3VwcG9ydCAobm9uLUNGSSkiCi0JZGVwZW5kcyBvbiBNVEQgJiYgTVREX09CU09MRVRFX0NISVBTICYmIEJST0tFTgorCWRlcGVuZHMgb24gTVREX09CU09MRVRFX0NISVBTICYmIEJST0tFTgogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgZmxhc2ggY2hpcHMgdXNpbmcgQU1ELWNvbXBhdGlibGUKIAkgIGNvbW1hbmRzLCBpbmNsdWRpbmcgc29tZSB3aGljaCBhcmUgbm90IENGSS1jb21wYXRpYmxlIGFuZCBoZW5jZQpAQCAtMjYwLDcgKzI1NCw3IEBACiAKIGNvbmZpZyBNVERfU0hBUlAKIAl0cmlzdGF0ZSAicHJlLUNGSSBTaGFycCBjaGlwIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBNVEQgJiYgTVREX09CU09MRVRFX0NISVBTCisJZGVwZW5kcyBvbiBNVERfT0JTT0xFVEVfQ0hJUFMKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIGZsYXNoIGNoaXBzIHVzaW5nIFNoYXJwLWNvbXBhdGlibGUKIAkgIGNvbW1hbmRzLCBpbmNsdWRpbmcgc29tZSB3aGljaCBhcmUgbm90IENGSS1jb21wYXRpYmxlIGFuZCBoZW5jZQpAQCAtMjY4LDcgKzI2Miw3IEBACiAKIGNvbmZpZyBNVERfSkVERUMKIAl0cmlzdGF0ZSAiSkVERUMgZGV2aWNlIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBNVEQgJiYgTVREX09CU09MRVRFX0NISVBTICYmIEJST0tFTgorCWRlcGVuZHMgb24gTVREX09CU09MRVRFX0NISVBTICYmIEJST0tFTgogCWhlbHAKIAkgIEVuYWJsZSBvbGRlciBKRURFQyBmbGFzaCBpbnRlcmZhY2UgZGV2aWNlcyBmb3Igc2VsZgogCSAgcHJvZ3JhbW1pbmcgZmxhc2guICBJdCBpcyBjb21tb25seSB1c2VkIGluIG9sZGVyIEFNRCBjaGlwcy4gIEl0IGlzCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9jaGlwcy9jZmlfY21kc2V0XzAwMDEuYyBiL2RyaXZlcnMvbXRkL2NoaXBzL2NmaV9jbWRzZXRfMDAwMS5jCmluZGV4IGYzMzQ5NTkuLjJmMTlmYTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL2NoaXBzL2NmaV9jbWRzZXRfMDAwMS5jCisrKyBiL2RyaXZlcnMvbXRkL2NoaXBzL2NmaV9jbWRzZXRfMDAwMS5jCkBAIC0xNSw2ICsxNSw4IEBACiAgKgktIG9wdGltaXplZCB3cml0ZSBidWZmZXIgbWV0aG9kCiAgKiAwMi8wNS8yMDAyCUNocmlzdG9waGVyIEhvb3ZlciA8Y2hAaHBsLmhwLmNvbT4vPGNoQG11cmdhdHJvaWQuY29tPgogICoJLSByZXdvcmtlZCBsb2NrL3VubG9jay9lcmFzZSBzdXBwb3J0IGZvciB2YXIgc2l6ZSBmbGFzaAorICogMjEvMDMvMjAwNyAgIFJvZG9sZm8gR2lvbWV0dGkgPGdpb21ldHRpQGxpbnV4Lml0PgorICogCS0gYXV0byB1bmxvY2sgc2VjdG9ycyBvbiByZXN1bWUgZm9yIGF1dG8gbG9ja2luZyBmbGFzaCBvbiBwb3dlciB1cAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTMwLDYgKzMyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC94aXAuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgpAQCAtMjIwLDYgKzIyMywxNSBAQAogCX0KIH0KIAorLyoKKyAqIFNvbWUgY2hpcHMgcG93ZXItdXAgd2l0aCBhbGwgc2VjdG9ycyBsb2NrZWQgYnkgZGVmYXVsdC4KKyAqLworc3RhdGljIHZvaWQgZml4dXBfdXNlX3Bvd2VydXBfbG9jayhzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgdm9pZCAqcGFyYW0pCit7CisJcHJpbnRrKEtFUk5fSU5GTyAiVXNpbmcgYXV0by11bmxvY2sgb24gcG93ZXItdXAvcmVzdW1lXG4iICk7CisJbXRkLT5mbGFncyB8PSBNVERfU1RVUElEX0xPQ0s7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgY2ZpX2ZpeHVwIGNmaV9maXh1cF90YWJsZVtdID0gewogI2lmZGVmIENNRFNFVDAwMDFfRElTQUJMRV9FUkFTRV9TVVNQRU5EX09OX1dSSVRFCiAJeyBDRklfTUZSX0FOWSwgQ0ZJX0lEX0FOWSwgZml4dXBfaW50ZWxfc3RyYXRhZmxhc2gsIE5VTEwgfSwKQEAgLTIzMiw2ICsyNDQsNyBAQAogI2VuZGlmCiAJeyBDRklfTUZSX1NULCAweDAwYmEsIC8qIE0yOFczMjBDVCAqLyBmaXh1cF9zdF9tMjh3MzIwY3QsIE5VTEwgfSwKIAl7IENGSV9NRlJfU1QsIDB4MDBiYiwgLyogTTI4VzMyMENCICovIGZpeHVwX3N0X20yOHczMjBjYiwgTlVMTCB9LAorCXsgTUFOVUZBQ1RVUkVSX0lOVEVMLCAweDg5MWMsCSAgICAgIGZpeHVwX3VzZV9wb3dlcnVwX2xvY2ssIE5VTEwsIH0sCiAJeyAwLCAwLCBOVUxMLCBOVUxMIH0KIH07CiAKQEAgLTQ2MCw2ICs0NzMsNyBAQAogCQkJbXRkLT5lcmFzZXJlZ2lvbnNbKGoqY2ZpLT5jZmlxLT5OdW1FcmFzZVJlZ2lvbnMpK2ldLm9mZnNldCA9IChqKmRldnNpemUpK29mZnNldDsKIAkJCW10ZC0+ZXJhc2VyZWdpb25zWyhqKmNmaS0+Y2ZpcS0+TnVtRXJhc2VSZWdpb25zKStpXS5lcmFzZXNpemUgPSBlcnNpemU7CiAJCQltdGQtPmVyYXNlcmVnaW9uc1soaipjZmktPmNmaXEtPk51bUVyYXNlUmVnaW9ucykraV0ubnVtYmxvY2tzID0gZXJudW07CisJCQltdGQtPmVyYXNlcmVnaW9uc1soaipjZmktPmNmaXEtPk51bUVyYXNlUmVnaW9ucykraV0ubG9ja21hcCA9IGttYWxsb2MoZXJudW0gLyA4ICsgMSwgR0ZQX0tFUk5FTCk7CiAJCX0KIAkJb2Zmc2V0ICs9IChlcnNpemUgKiBlcm51bSk7CiAJfQpAQCAtMTgyNSw4ICsxODM5LDcgQEAKIAl9CiB9CiAKLSNpZmRlZiBERUJVR19MT0NLX0JJVFMKLXN0YXRpYyBpbnQgX194aXByYW0gZG9fcHJpbnRsb2Nrc3RhdHVzX29uZWJsb2NrKHN0cnVjdCBtYXBfaW5mbyAqbWFwLAorc3RhdGljIGludCBfX3hpcHJhbSBkb19nZXRsb2Nrc3RhdHVzX29uZWJsb2NrKHN0cnVjdCBtYXBfaW5mbyAqbWFwLAogCQkJCQkJc3RydWN0IGZsY2hpcCAqY2hpcCwKIAkJCQkJCXVuc2lnbmVkIGxvbmcgYWRyLAogCQkJCQkJaW50IGxlbiwgdm9pZCAqdGh1bmspCkBAIC0xODQwLDggKzE4NTMsMTcgQEAKIAljaGlwLT5zdGF0ZSA9IEZMX0pFREVDX1FVRVJZOwogCXN0YXR1cyA9IGNmaV9yZWFkX3F1ZXJ5KG1hcCwgYWRyKygyKm9mc19mYWN0b3IpKTsKIAl4aXBfZW5hYmxlKG1hcCwgY2hpcCwgMCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworI2lmZGVmIERFQlVHX0xPQ0tfQklUUworc3RhdGljIGludCBfX3hpcHJhbSBkb19wcmludGxvY2tzdGF0dXNfb25lYmxvY2soc3RydWN0IG1hcF9pbmZvICptYXAsCisJCQkJCQlzdHJ1Y3QgZmxjaGlwICpjaGlwLAorCQkJCQkJdW5zaWduZWQgbG9uZyBhZHIsCisJCQkJCQlpbnQgbGVuLCB2b2lkICp0aHVuaykKK3sKIAlwcmludGsoS0VSTl9ERUJVRyAiYmxvY2sgc3RhdHVzIHJlZ2lzdGVyIGZvciAweCUwOGx4IGlzICV4XG4iLAotCSAgICAgICBhZHIsIHN0YXR1cyk7CisJICAgICAgIGFkciwgZG9fZ2V0bG9ja3N0YXR1c19vbmVibG9jayhtYXAsIGNoaXAsIGFkciwgbGVuLCB0aHVuaykpOwogCXJldHVybiAwOwogfQogI2VuZGlmCkBAIC0yMjE2LDE0ICsyMjM4LDQ1IEBACiAKICNlbmRpZgogCitzdGF0aWMgdm9pZCBjZmlfaW50ZWxleHRfc2F2ZV9sb2NrcyhzdHJ1Y3QgbXRkX2luZm8gKm10ZCkKK3sKKwlzdHJ1Y3QgbXRkX2VyYXNlX3JlZ2lvbl9pbmZvICpyZWdpb247CisJaW50IGJsb2NrLCBzdGF0dXMsIGk7CisJdW5zaWduZWQgbG9uZyBhZHI7CisJc2l6ZV90IGxlbjsKKworCWZvciAoaSA9IDA7IGkgPCBtdGQtPm51bWVyYXNlcmVnaW9uczsgaSsrKSB7CisJCXJlZ2lvbiA9ICZtdGQtPmVyYXNlcmVnaW9uc1tpXTsKKwkJaWYgKCFyZWdpb24tPmxvY2ttYXApCisJCQljb250aW51ZTsKKworCQlmb3IgKGJsb2NrID0gMDsgYmxvY2sgPCByZWdpb24tPm51bWJsb2NrczsgYmxvY2srKyl7CisJCQlsZW4gPSByZWdpb24tPmVyYXNlc2l6ZTsKKwkJCWFkciA9IHJlZ2lvbi0+b2Zmc2V0ICsgYmxvY2sgKiBsZW47CisKKwkJCXN0YXR1cyA9IGNmaV92YXJzaXplX2Zyb2IobXRkLAorCQkJCQlkb19nZXRsb2Nrc3RhdHVzX29uZWJsb2NrLCBhZHIsIGxlbiwgMCk7CisJCQlpZiAoc3RhdHVzKQorCQkJCXNldF9iaXQoYmxvY2ssIHJlZ2lvbi0+bG9ja21hcCk7CisJCQllbHNlCisJCQkJY2xlYXJfYml0KGJsb2NrLCByZWdpb24tPmxvY2ttYXApOworCQl9CisJfQorfQorCiBzdGF0aWMgaW50IGNmaV9pbnRlbGV4dF9zdXNwZW5kKHN0cnVjdCBtdGRfaW5mbyAqbXRkKQogewogCXN0cnVjdCBtYXBfaW5mbyAqbWFwID0gbXRkLT5wcml2OwogCXN0cnVjdCBjZmlfcHJpdmF0ZSAqY2ZpID0gbWFwLT5mbGRydl9wcml2OworCXN0cnVjdCBjZmlfcHJpX2ludGVsZXh0ICpleHRwID0gY2ZpLT5jbWRzZXRfcHJpdjsKIAlpbnQgaTsKIAlzdHJ1Y3QgZmxjaGlwICpjaGlwOwogCWludCByZXQgPSAwOwogCisJaWYgKChtdGQtPmZsYWdzICYgTVREX1NUVVBJRF9MT0NLKQorCSAgICAmJiBleHRwICYmIChleHRwLT5GZWF0dXJlU3VwcG9ydCAmICgxIDw8IDUpKSkKKwkJY2ZpX2ludGVsZXh0X3NhdmVfbG9ja3MobXRkKTsKKwogCWZvciAoaT0wOyAhcmV0ICYmIGk8Y2ZpLT5udW1jaGlwczsgaSsrKSB7CiAJCWNoaXAgPSAmY2ZpLT5jaGlwc1tpXTsKIApAQCAtMjI4NSwxMCArMjMzOCwzMyBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyB2b2lkIGNmaV9pbnRlbGV4dF9yZXN0b3JlX2xvY2tzKHN0cnVjdCBtdGRfaW5mbyAqbXRkKQoreworCXN0cnVjdCBtdGRfZXJhc2VfcmVnaW9uX2luZm8gKnJlZ2lvbjsKKwlpbnQgYmxvY2ssIGk7CisJdW5zaWduZWQgbG9uZyBhZHI7CisJc2l6ZV90IGxlbjsKKworCWZvciAoaSA9IDA7IGkgPCBtdGQtPm51bWVyYXNlcmVnaW9uczsgaSsrKSB7CisJCXJlZ2lvbiA9ICZtdGQtPmVyYXNlcmVnaW9uc1tpXTsKKwkJaWYgKCFyZWdpb24tPmxvY2ttYXApCisJCQljb250aW51ZTsKKworCQlmb3IgKGJsb2NrID0gMDsgYmxvY2sgPCByZWdpb24tPm51bWJsb2NrczsgYmxvY2srKykgeworCQkJbGVuID0gcmVnaW9uLT5lcmFzZXNpemU7CisJCQlhZHIgPSByZWdpb24tPm9mZnNldCArIGJsb2NrICogbGVuOworCisJCQlpZiAoIXRlc3RfYml0KGJsb2NrLCByZWdpb24tPmxvY2ttYXApKQorCQkJCWNmaV9pbnRlbGV4dF91bmxvY2sobXRkLCBhZHIsIGxlbik7CisJCX0KKwl9Cit9CisKIHN0YXRpYyB2b2lkIGNmaV9pbnRlbGV4dF9yZXN1bWUoc3RydWN0IG10ZF9pbmZvICptdGQpCiB7CiAJc3RydWN0IG1hcF9pbmZvICptYXAgPSBtdGQtPnByaXY7CiAJc3RydWN0IGNmaV9wcml2YXRlICpjZmkgPSBtYXAtPmZsZHJ2X3ByaXY7CisJc3RydWN0IGNmaV9wcmlfaW50ZWxleHQgKmV4dHAgPSBjZmktPmNtZHNldF9wcml2OwogCWludCBpOwogCXN0cnVjdCBmbGNoaXAgKmNoaXA7CiAKQEAgLTIzMDcsNiArMjM4MywxMCBAQAogCiAJCXNwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKIAl9CisKKwlpZiAoKG10ZC0+ZmxhZ3MgJiBNVERfU1RVUElEX0xPQ0spCisJICAgICYmIGV4dHAgJiYgKGV4dHAtPkZlYXR1cmVTdXBwb3J0ICYgKDEgPDwgNSkpKQorCQljZmlfaW50ZWxleHRfcmVzdG9yZV9sb2NrcyhtdGQpOwogfQogCiBzdGF0aWMgaW50IGNmaV9pbnRlbGV4dF9yZXNldChzdHJ1Y3QgbXRkX2luZm8gKm10ZCkKQEAgLTIzNDcsMTIgKzI0MjcsMTkgQEAKIHsKIAlzdHJ1Y3QgbWFwX2luZm8gKm1hcCA9IG10ZC0+cHJpdjsKIAlzdHJ1Y3QgY2ZpX3ByaXZhdGUgKmNmaSA9IG1hcC0+ZmxkcnZfcHJpdjsKKwlzdHJ1Y3QgbXRkX2VyYXNlX3JlZ2lvbl9pbmZvICpyZWdpb247CisJaW50IGk7CiAJY2ZpX2ludGVsZXh0X3Jlc2V0KG10ZCk7CiAJdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJm10ZC0+cmVib290X25vdGlmaWVyKTsKIAlrZnJlZShjZmktPmNtZHNldF9wcml2KTsKIAlrZnJlZShjZmktPmNmaXEpOwogCWtmcmVlKGNmaS0+Y2hpcHNbMF0ucHJpdik7CiAJa2ZyZWUoY2ZpKTsKKwlmb3IgKGkgPSAwOyBpIDwgbXRkLT5udW1lcmFzZXJlZ2lvbnM7IGkrKykgeworCQlyZWdpb24gPSAmbXRkLT5lcmFzZXJlZ2lvbnNbaV07CisJCWlmIChyZWdpb24tPmxvY2ttYXApCisJCQlrZnJlZShyZWdpb24tPmxvY2ttYXApOworCX0KIAlrZnJlZShtdGQtPmVyYXNlcmVnaW9ucyk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL2NoaXBzL2Z3aF9sb2NrLmggYi9kcml2ZXJzL210ZC9jaGlwcy9md2hfbG9jay5oCmluZGV4IDc3MzAzY2UuLmFiNDRmMmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL2NoaXBzL2Z3aF9sb2NrLmgKKysrIGIvZHJpdmVycy9tdGQvY2hpcHMvZndoX2xvY2suaApAQCAtNjUsMTEgKzY1LDEyIEBACiAJCXJldHVybiByZXQ7CiAJfQogCisJY2hpcC0+b2xkc3RhdGUgPSBjaGlwLT5zdGF0ZTsKIAljaGlwLT5zdGF0ZSA9IHh4bHQtPnN0YXRlOwogCW1hcF93cml0ZShtYXAsIENNRCh4eGx0LT52YWwpLCBhZHIpOwogCiAJLyogRG9uZSBhbmQgaGFwcHkuICovCi0JY2hpcC0+c3RhdGUgPSBGTF9SRUFEWTsKKwljaGlwLT5zdGF0ZSA9IGNoaXAtPm9sZHN0YXRlOwogCXB1dF9jaGlwKG1hcCwgY2hpcCwgYWRyKTsKIAlzcGluX3VubG9jayhjaGlwLT5tdXRleCk7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9kZXZpY2VzL0tjb25maWcgYi9kcml2ZXJzL210ZC9kZXZpY2VzL0tjb25maWcKaW5kZXggNDQwZjY4NS4uNjkwYzk0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvZGV2aWNlcy9LY29uZmlnCisrKyBiL2RyaXZlcnMvbXRkL2RldmljZXMvS2NvbmZpZwpAQCAtNiw3ICs2LDcgQEAKIAogY29uZmlnIE1URF9QTUM1NTEKIAl0cmlzdGF0ZSAiUmFtaXggUE1DNTUxIFBDSSBNZXp6YW5pbmUgUkFNIGNhcmQgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIE1URCAmJiBQQ0kKKwlkZXBlbmRzIG9uIFBDSQogCS0tLWhlbHAtLS0KIAkgIFRoaXMgcHJvdmlkZXMgYSBNVEQgZGV2aWNlIGRyaXZlciBmb3IgdGhlIFJhbWl4IFBNQzU1MSBSQU0gUENJIGNhcmQKIAkgIGZyb20gUmFtaXggSW5jLiA8aHR0cDovL3d3dy5yYW1peC5jb20vcHJvZHVjdHMvbWVtb3J5L3BtYzU1MS5odG1sPi4KQEAgLTQwLDcgKzQwLDcgQEAKIAogY29uZmlnIE1URF9NUzAyTlYKIAl0cmlzdGF0ZSAiREVDIE1TMDItTlYgTlZSQU0gbW9kdWxlIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBNVEQgJiYgTUFDSF9ERUNTVEFUSU9OCisJZGVwZW5kcyBvbiBNQUNIX0RFQ1NUQVRJT04KIAloZWxwCiAJICBUaGlzIGlzIGFuIE1URCBkcml2ZXIgZm9yIHRoZSBERUMncyBNUzAyLU5WICg1NC0yMDk0OC0wMSkgYmF0dGVyeQogCSAgYmFja2VkLXVwIE5WUkFNIG1vZHVsZS4gIFRoZSBtb2R1bGUgd2FzIG9yaWdpbmFsbHkgbWVhbnQgYXMgYW4gTkZTCkBAIC01NCwxNSArNTQsMjMgQEAKIAogY29uZmlnIE1URF9EQVRBRkxBU0gKIAl0cmlzdGF0ZSAiU3VwcG9ydCBmb3IgQVQ0NXh4eCBEYXRhRmxhc2giCi0JZGVwZW5kcyBvbiBNVEQgJiYgU1BJX01BU1RFUiAmJiBFWFBFUklNRU5UQUwKKwlkZXBlbmRzIG9uIFNQSV9NQVNURVIgJiYgRVhQRVJJTUVOVEFMCiAJaGVscAogCSAgVGhpcyBlbmFibGVzIGFjY2VzcyB0byBBVDQ1eHh4IERhdGFGbGFzaCBjaGlwcywgdXNpbmcgU1BJLgogCSAgU29tZXRpbWVzIERhdGFGbGFzaCBjaGlwcyBhcmUgcGFja2FnZWQgaW5zaWRlIE1NQy1mb3JtYXQKIAkgIGNhcmRzOyBhdCB0aGlzIHdyaXRpbmcsIHRoZSBNTUMgc3RhY2sgd29uJ3QgaGFuZGxlIHRob3NlLgogCitjb25maWcgTVREX0RBVEFGTEFTSDI2CisJdHJpc3RhdGUgIkFUOTFSTTkyMDAgRGF0YUZsYXNoIEFUMjZ4eHgiCisJZGVwZW5kcyBvbiBNVEQgJiYgQVJDSF9BVDkxUk05MjAwICYmIEFUOTFfU1BJCisJaGVscAorCSAgVGhpcyBlbmFibGVzIGFjY2VzcyB0byB0aGUgRGF0YUZsYXNoIGNoaXAgKEFUMjZ4eHgpIG9uIGFuCisJICBBVDkxUk05MjAwLWJhc2VkIGJvYXJkLgorCSAgSWYgeW91IGhhdmUgc3VjaCBhIGJvYXJkIGFuZCBzdWNoIGEgRGF0YUZsYXNoLCBzYXkgJ1knLgorCiBjb25maWcgTVREX00yNVA4MAogCXRyaXN0YXRlICJTdXBwb3J0IGZvciBNMjUgU1BJIEZsYXNoIgotCWRlcGVuZHMgb24gTVREICYmIFNQSV9NQVNURVIgJiYgRVhQRVJJTUVOVEFMCisJZGVwZW5kcyBvbiBTUElfTUFTVEVSICYmIEVYUEVSSU1FTlRBTAogCWhlbHAKIAkgIFRoaXMgZW5hYmxlcyBhY2Nlc3MgdG8gU1QgTTI1UDgwIGFuZCBzaW1pbGFyIFNQSSBmbGFzaCBjaGlwcywKIAkgIHVzZWQgZm9yIHByb2dyYW0gYW5kIGRhdGEgc3RvcmFnZS4gIFNldCB1cCB5b3VyIHNwaSBkZXZpY2VzCkBAIC03MCw3ICs3OCw2IEBACiAKIGNvbmZpZyBNVERfU0xSQU0KIAl0cmlzdGF0ZSAiVW5jYWNoZWQgc3lzdGVtIFJBTSIKLQlkZXBlbmRzIG9uIE1URAogCWhlbHAKIAkgIElmIHlvdXIgQ1BVIGNhbm5vdCBjYWNoZSBhbGwgb2YgdGhlIHBoeXNpY2FsIG1lbW9yeSBpbiB5b3VyIG1hY2hpbmUsCiAJICB5b3UgY2FuIHN0aWxsIHVzZSBpdCBmb3Igc3RvcmFnZSBvciBzd2FwIGJ5IHVzaW5nIHRoaXMgZHJpdmVyIHRvCkBAIC03OCw3ICs4NSw2IEBACiAKIGNvbmZpZyBNVERfUEhSQU0KIAl0cmlzdGF0ZSAiUGh5c2ljYWwgc3lzdGVtIFJBTSIKLQlkZXBlbmRzIG9uIE1URAogCWhlbHAKIAkgIFRoaXMgaXMgYSByZS1pbXBsZW1lbnRhdGlvbiBvZiB0aGUgc2xyYW0gZHJpdmVyIGFib3ZlLgogCkBAIC04OCw3ICs5NCw3IEBACiAKIGNvbmZpZyBNVERfTEFSVAogCXRyaXN0YXRlICIyOEYxNjB4eCBmbGFzaCBkcml2ZXIgZm9yIExBUlQiCi0JZGVwZW5kcyBvbiBTQTExMDBfTEFSVCAmJiBNVEQKKwlkZXBlbmRzIG9uIFNBMTEwMF9MQVJUCiAJaGVscAogCSAgVGhpcyBlbmFibGVzIHRoZSBmbGFzaCBkcml2ZXIgZm9yIExBUlQuIFBsZWFzZSBub3RlIHRoYXQgeW91IGRvCiAJICBub3QgbmVlZCBhbnkgbWFwcGluZy9jaGlwIGRyaXZlciBmb3IgTEFSVC4gVGhpcyBvbmUgZG9lcyBpdCBhbGwKQEAgLTk2LDcgKzEwMiw2IEBACiAKIGNvbmZpZyBNVERfTVREUkFNCiAJdHJpc3RhdGUgIlRlc3QgZHJpdmVyIHVzaW5nIFJBTSIKLQlkZXBlbmRzIG9uIE1URAogCWhlbHAKIAkgIFRoaXMgZW5hYmxlcyBhIHRlc3QgTVREIGRldmljZSBkcml2ZXIgd2hpY2ggdXNlcyB2bWFsbG9jKCkgdG8KIAkgIHByb3ZpZGUgc3RvcmFnZS4gIFlvdSBwcm9iYWJseSB3YW50IHRvIHNheSAnTicgdW5sZXNzIHlvdSdyZQpAQCAtMTM2LDcgKzE0MSw3IEBACiAKIGNvbmZpZyBNVERfQkxPQ0syTVRECiAJdHJpc3RhdGUgIk1URCB1c2luZyBibG9jayBkZXZpY2UiCi0JZGVwZW5kcyBvbiBNVEQgJiYgQkxPQ0sKKwlkZXBlbmRzIG9uIEJMT0NLCiAJaGVscAogCSAgVGhpcyBkcml2ZXIgYWxsb3dzIGEgYmxvY2sgZGV2aWNlIHRvIGFwcGVhciBhcyBhbiBNVEQuIEl0IHdvdWxkCiAJICBnZW5lcmFsbHkgYmUgdXNlZCBpbiB0aGUgZm9sbG93aW5nIGNhc2VzOgpAQCAtMTUwLDcgKzE1NSw2IEBACiAKIGNvbmZpZyBNVERfRE9DMjAwMAogCXRyaXN0YXRlICJNLVN5c3RlbXMgRGlzay1Pbi1DaGlwIDIwMDAgYW5kIE1pbGxlbm5pdW0gKERFUFJFQ0FURUQpIgotCWRlcGVuZHMgb24gTVRECiAJc2VsZWN0IE1URF9ET0NQUk9CRQogCXNlbGVjdCBNVERfTkFORF9JRFMKIAktLS1oZWxwLS0tCkBAIC0xNzMsNyArMTc3LDYgQEAKIAogY29uZmlnIE1URF9ET0MyMDAxCiAJdHJpc3RhdGUgIk0tU3lzdGVtcyBEaXNrLU9uLUNoaXAgTWlsbGVubml1bS1vbmx5IGFsdGVybmF0aXZlIGRyaXZlciAoREVQUkVDQVRFRCkiCi0JZGVwZW5kcyBvbiBNVEQKIAlzZWxlY3QgTVREX0RPQ1BST0JFCiAJc2VsZWN0IE1URF9OQU5EX0lEUwogCS0tLWhlbHAtLS0KQEAgLTE5NSw3ICsxOTgsNiBAQAogCiBjb25maWcgTVREX0RPQzIwMDFQTFVTCiAJdHJpc3RhdGUgIk0tU3lzdGVtcyBEaXNrLU9uLUNoaXAgTWlsbGVubml1bSBQbHVzIgotCWRlcGVuZHMgb24gTVRECiAJc2VsZWN0IE1URF9ET0NQUk9CRQogCXNlbGVjdCBNVERfTkFORF9JRFMKIAktLS1oZWxwLS0tCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9kZXZpY2VzL01ha2VmaWxlIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9NYWtlZmlsZQppbmRleCAwZjc4OGQ1Li44YWI1NjhiIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9kZXZpY2VzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbXRkL2RldmljZXMvTWFrZWZpbGUKQEAgLTE2LDQgKzE2LDUgQEAKIG9iai0kKENPTkZJR19NVERfTEFSVCkJCSs9IGxhcnQubwogb2JqLSQoQ09ORklHX01URF9CTE9DSzJNVEQpCSs9IGJsb2NrMm10ZC5vCiBvYmotJChDT05GSUdfTVREX0RBVEFGTEFTSCkJKz0gbXRkX2RhdGFmbGFzaC5vCitvYmotJChDT05GSUdfTVREX0RBVEFGTEFTSDI2KQkrPSBhdDkxX2RhdGFmbGFzaDI2Lm8KIG9iai0kKENPTkZJR19NVERfTTI1UDgwKQkrPSBtMjVwODAubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvZGV2aWNlcy9hdDkxX2RhdGFmbGFzaDI2LmMgYi9kcml2ZXJzL210ZC9kZXZpY2VzL2F0OTFfZGF0YWZsYXNoMjYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGNlMzdmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9hdDkxX2RhdGFmbGFzaDI2LmMKQEAgLTAsMCArMSw0ODUgQEAKKy8qCisgKiBBdG1lbCBEYXRhRmxhc2ggZHJpdmVyIGZvciBBdG1lbCBBVDkxUk05MjAwIChUaHVuZGVyKQorICogVGhpcyBpcyBhIGxhcmdlbHkgbW9kaWZpZWQgdmVyc2lvbiBvZiBhdDkxX2RhdGFmbGFzaC5jIHRoYXQKKyAqIHN1cHBvcnRzIEFUMjZ4eHggZGF0YWZsYXNoIGNoaXBzLiBUaGUgb3JpZ2luYWwgZHJpdmVyIHN1cHBvcnRzCisgKiBBVDQ1eHh4IGNoaXBzLgorICoKKyAqIE5vdGU6IFRoaXMgZHJpdmVyIHdhcyBvbmx5IHRlc3RlZCB3aXRoIGFuIEFUMjZGMDA0LiBJdCBzaG91bGQgYmUKKyAqIGVhc3kgdG8gbWFrZSBpdCB3b3JrIHdpdGggb3RoZXIgQVQyNnh4eCBkYXRhZmxhc2ggZGV2aWNlcywgdGhvdWdoLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBIYW5zIEouIEtvY2ggPGhqa0BsaW51dHJvbml4LmRlPgorICogb3JpZ2luYWwgQ29weXJpZ2h0IChDKSBTQU4gUGVvcGxlIChQdHkpIEx0ZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL2F0OTFfc3BpLmg+CisKKyNkZWZpbmUgREFUQUZMQVNIX01BWF9ERVZJQ0VTCTQJLyogbWF4IG51bWJlciBvZiBkYXRhZmxhc2ggZGV2aWNlcyAqLworCisjZGVmaW5lIE1BTlVGQUNUVVJFUl9JRF9BVE1FTAkJMHgxRgorCisvKiBjb21tYW5kIGNvZGVzICovCisKKyNkZWZpbmUgQVQyNl9PUF9SRUFEX1NUQVRVUwkJMHgwNQorI2RlZmluZSBBVDI2X09QX1JFQURfREVWX0lECQkweDlGCisjZGVmaW5lIEFUMjZfT1BfRVJBU0VfUEFHRV80SwkJMHgyMAorI2RlZmluZSBBVDI2X09QX1JFQURfQVJSQVlfRkFTVAkJMHgwQgorI2RlZmluZSBBVDI2X09QX1NFUVVFTlRJQUxfV1JJVEUJMHhBRgorI2RlZmluZSBBVDI2X09QX1dSSVRFX0VOQUJMRQkJMHgwNgorI2RlZmluZSBBVDI2X09QX1dSSVRFX0RJU0FCTEUJCTB4MDQKKyNkZWZpbmUgQVQyNl9PUF9TRUNUT1JfUFJPVEVDVAkJMHgzNgorI2RlZmluZSBBVDI2X09QX1NFQ1RPUl9VTlBST1RFQ1QJMHgzOQorCisvKiBzdGF0dXMgcmVnaXN0ZXIgYml0cyAqLworCisjZGVmaW5lIEFUMjZfU1RBVFVTX0JVU1kJCTB4MDEKKyNkZWZpbmUgQVQyNl9TVEFUVVNfV1JJVEVfRU5BQkxFCTB4MDIKKworc3RydWN0IGRhdGFmbGFzaF9sb2NhbAoreworCWludCBzcGk7CQkJLyogU1BJIGNoaXAtc2VsZWN0IG51bWJlciAqLworCXVuc2lnbmVkIGludCBwYWdlX3NpemU7CQkvKiBudW1iZXIgb2YgYnl0ZXMgcGVyIHBhZ2UgKi8KK307CisKKworLyogRGV0ZWN0ZWQgRGF0YUZsYXNoIGRldmljZXMgKi8KK3N0YXRpYyBzdHJ1Y3QgbXRkX2luZm8qIG10ZF9kZXZpY2VzW0RBVEFGTEFTSF9NQVhfREVWSUNFU107CitzdGF0aWMgaW50IG5yX2RldmljZXMgPSAwOworCisvKiBBbGxvY2F0ZSBhIHNpbmdsZSBTUEkgdHJhbnNmZXIgZGVzY3JpcHRvci4gIFdlJ3JlIGFzc3VtaW5nIHRoYXQgaWYgbXVsdGlwbGUKKyAgIFNQSSB0cmFuc2ZlcnMgb2NjdXIgYXQgdGhlIHNhbWUgdGltZSwgc3BpX2FjY2Vzc19idXMoKSB3aWxsIHNlcmlhbGl6ZSB0aGVtLgorICAgSWYgdGhpcyBpcyBub3QgdmFsaWQsIHRoZW4gZWl0aGVyIChpKSBlYWNoIGRhdGFmbGFzaCAncHJpdicgc3RydWN0dXJlCisgICBuZWVkcyBpdCdzIG93biB0cmFuc2ZlciBkZXNjcmlwdG9yLCAoaWkpIHdlIGxvY2sgdGhpcyBvbmUsIG9yIChpaWkpIHVzZQorICAgYW5vdGhlciBtZWNoYW5pc20uICAgKi8KK3N0YXRpYyBzdHJ1Y3Qgc3BpX3RyYW5zZmVyX2xpc3QqIHNwaV90cmFuc2Zlcl9kZXNjOworCisvKgorICogUGVyZm9ybSBhIFNQSSB0cmFuc2ZlciB0byBhY2Nlc3MgdGhlIERhdGFGbGFzaCBkZXZpY2UuCisgKi8KK3N0YXRpYyBpbnQgZG9fc3BpX3RyYW5zZmVyKGludCBuciwgY2hhciogdHgsIGludCB0eF9sZW4sIGNoYXIqIHJ4LCBpbnQgcnhfbGVuLAorCQljaGFyKiB0eG5leHQsIGludCB0eG5leHRfbGVuLCBjaGFyKiByeG5leHQsIGludCByeG5leHRfbGVuKQoreworCXN0cnVjdCBzcGlfdHJhbnNmZXJfbGlzdCogbGlzdCA9IHNwaV90cmFuc2Zlcl9kZXNjOworCisJbGlzdC0+dHhbMF0gPSB0eDsJbGlzdC0+dHhsZW5bMF0gPSB0eF9sZW47CisJbGlzdC0+cnhbMF0gPSByeDsJbGlzdC0+cnhsZW5bMF0gPSByeF9sZW47CisKKwlsaXN0LT50eFsxXSA9IHR4bmV4dDsgCWxpc3QtPnR4bGVuWzFdID0gdHhuZXh0X2xlbjsKKwlsaXN0LT5yeFsxXSA9IHJ4bmV4dDsJbGlzdC0+cnhsZW5bMV0gPSByeG5leHRfbGVuOworCisJbGlzdC0+bnJfdHJhbnNmZXJzID0gbnI7CisJLyogTm90ZTogc3BpX3RyYW5zZmVyKCkgYWx3YXlzIHJldHVybnMgMCwgdGhlcmUgYXJlIG5vIGVycm9yIGNoZWNrcyAqLworCXJldHVybiBzcGlfdHJhbnNmZXIobGlzdCk7Cit9CisKKy8qCisgKiBSZXR1cm4gdGhlIHN0YXR1cyBvZiB0aGUgRGF0YUZsYXNoIGRldmljZS4KKyAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgYXQ5MV9kYXRhZmxhc2gyNl9zdGF0dXModm9pZCkKK3sKKwl1bnNpZ25lZCBjaGFyIGNvbW1hbmRbMl07CisKKwljb21tYW5kWzBdID0gQVQyNl9PUF9SRUFEX1NUQVRVUzsKKwljb21tYW5kWzFdID0gMDsKKworCWRvX3NwaV90cmFuc2ZlcigxLCBjb21tYW5kLCAyLCBjb21tYW5kLCAyLCBOVUxMLCAwLCBOVUxMLCAwKTsKKworCXJldHVybiBjb21tYW5kWzFdOworfQorCisvKgorICogUG9sbCB0aGUgRGF0YUZsYXNoIGRldmljZSB1bnRpbCBpdCBpcyBSRUFEWS4KKyAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgYXQ5MV9kYXRhZmxhc2gyNl93YWl0cmVhZHkodm9pZCkKK3sKKwl1bnNpZ25lZCBjaGFyIHN0YXR1czsKKworCXdoaWxlICgxKSB7CisJCXN0YXR1cyA9IGF0OTFfZGF0YWZsYXNoMjZfc3RhdHVzKCk7CisJCWlmICghKHN0YXR1cyAmIEFUMjZfU1RBVFVTX0JVU1kpKQorCQkJcmV0dXJuIHN0YXR1czsKKwl9Cit9CisKKy8qCisgKiBFbmFibGUvZGlzYWJsZSB3cml0ZSBhY2Nlc3MKKyAqLworIHN0YXRpYyB2b2lkIGF0OTFfZGF0YWZsYXNoMjZfd3JpdGVfZW5hYmxlKGludCBlbmFibGUpCit7CisJdW5zaWduZWQgY2hhciBjbWRbMl07CisKKwlERUJVRyhNVERfREVCVUdfTEVWRUwzLCAid3JpdGVfZW5hYmxlOiBlbmFibGU9JWlcbiIsIGVuYWJsZSk7CisKKwlpZiAoZW5hYmxlKQorCQljbWRbMF0gPSBBVDI2X09QX1dSSVRFX0VOQUJMRTsKKwllbHNlCisJCWNtZFswXSA9IEFUMjZfT1BfV1JJVEVfRElTQUJMRTsKKwljbWRbMV0gPSAwOworCisJZG9fc3BpX3RyYW5zZmVyKDEsIGNtZCwgMiwgY21kLCAyLCBOVUxMLCAwLCBOVUxMLCAwKTsKK30KKworLyoKKyAqIFByb3RlY3QvdW5wcm90ZWN0IHNlY3RvcgorICovCisgc3RhdGljIHZvaWQgYXQ5MV9kYXRhZmxhc2gyNl9zZWN0b3JfcHJvdGVjdChsb2ZmX3QgYWRkciwgaW50IHByb3RlY3QpCit7CisJdW5zaWduZWQgY2hhciBjbWRbNF07CisKKwlERUJVRyhNVERfREVCVUdfTEVWRUwzLCAic2VjdG9yX3Byb3RlY3Q6IGFkZHI9MHglMDZ4IHByb3Q9JWRcbiIsCisJICAgICAgIGFkZHIsIHByb3RlY3QpOworCisJaWYgKHByb3RlY3QpCisJCWNtZFswXSA9IEFUMjZfT1BfU0VDVE9SX1BST1RFQ1Q7CisJZWxzZQorCQljbWRbMF0gPSBBVDI2X09QX1NFQ1RPUl9VTlBST1RFQ1Q7CisJY21kWzFdID0gKGFkZHIgJiAweDAwRkYwMDAwKSA+PiAxNjsKKwljbWRbMl0gPSAoYWRkciAmIDB4MDAwMEZGMDApID4+IDg7CisJY21kWzNdID0gKGFkZHIgJiAweDAwMDAwMEZGKTsKKworCWRvX3NwaV90cmFuc2ZlcigxLCBjbWQsIDQsIGNtZCwgNCwgTlVMTCwgMCwgTlVMTCwgMCk7Cit9CisKKy8qCisgKiBFcmFzZSBibG9ja3Mgb2YgZmxhc2guCisgKi8KK3N0YXRpYyBpbnQgYXQ5MV9kYXRhZmxhc2gyNl9lcmFzZShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwKKwkJCQkgIHN0cnVjdCBlcmFzZV9pbmZvICppbnN0cikKK3sKKwlzdHJ1Y3QgZGF0YWZsYXNoX2xvY2FsICpwcml2ID0gKHN0cnVjdCBkYXRhZmxhc2hfbG9jYWwgKikgbXRkLT5wcml2OworCXVuc2lnbmVkIGNoYXIgY21kWzRdOworCisJREVCVUcoTVREX0RFQlVHX0xFVkVMMSwgImRhdGFmbGFzaF9lcmFzZTogYWRkcj0weCUwNnggbGVuPSVpXG4iLAorCSAgICAgICBpbnN0ci0+YWRkciwgaW5zdHItPmxlbik7CisKKwkvKiBTYW5pdHkgY2hlY2tzICovCisJaWYgKHByaXYtPnBhZ2Vfc2l6ZSAhPSA0MDk2KQorCQlyZXR1cm4gLUVJTlZBTDsgLyogQ2FuJ3QgaGFuZGxlIG90aGVyIHNpemVzIGF0IHRoZSBtb21lbnQgKi8KKworCWlmICggICAoKGluc3RyLT5sZW4gJSBtdGQtPmVyYXNlc2l6ZSkgIT0gMCkKKwkgICAgfHwgKChpbnN0ci0+bGVuICUgcHJpdi0+cGFnZV9zaXplKSAhPSAwKQorCSAgICB8fCAoKGluc3RyLT5hZGRyICUgcHJpdi0+cGFnZV9zaXplKSAhPSAwKQorCSAgICB8fCAoKGluc3RyLT5hZGRyICsgaW5zdHItPmxlbikgPiBtdGQtPnNpemUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaV9hY2Nlc3NfYnVzKHByaXYtPnNwaSk7CisKKwl3aGlsZSAoaW5zdHItPmxlbiA+IDApIHsKKwkJYXQ5MV9kYXRhZmxhc2gyNl93cml0ZV9lbmFibGUoMSk7CisJCWF0OTFfZGF0YWZsYXNoMjZfc2VjdG9yX3Byb3RlY3QoaW5zdHItPmFkZHIsIDApOworCQlhdDkxX2RhdGFmbGFzaDI2X3dyaXRlX2VuYWJsZSgxKTsKKwkJY21kWzBdID0gQVQyNl9PUF9FUkFTRV9QQUdFXzRLOworCQljbWRbMV0gPSAoaW5zdHItPmFkZHIgJiAweDAwRkYwMDAwKSA+PiAxNjsKKwkJY21kWzJdID0gKGluc3RyLT5hZGRyICYgMHgwMDAwRkYwMCkgPj4gODsKKwkJY21kWzNdID0gKGluc3RyLT5hZGRyICYgMHgwMDAwMDBGRik7CisKKwkJREVCVUcoTVREX0RFQlVHX0xFVkVMMywgIkVSQVNFOiAoMHglMDJ4KSAweCUwMnggMHglMDJ4IgorCQkJCQkiMHglMDJ4XG4iLAorCQkJY21kWzBdLCBjbWRbMV0sIGNtZFsyXSwgY21kWzNdKTsKKworCQlkb19zcGlfdHJhbnNmZXIoMSwgY21kLCA0LCBjbWQsIDQsIE5VTEwsIDAsIE5VTEwsIDApOworCQlhdDkxX2RhdGFmbGFzaDI2X3dhaXRyZWFkeSgpOworCisJCWluc3RyLT5hZGRyICs9IHByaXYtPnBhZ2Vfc2l6ZTsJIC8qIG5leHQgcGFnZSAqLworCQlpbnN0ci0+bGVuIC09IHByaXYtPnBhZ2Vfc2l6ZTsKKwl9CisKKwlhdDkxX2RhdGFmbGFzaDI2X3dyaXRlX2VuYWJsZSgwKTsKKwlzcGlfcmVsZWFzZV9idXMocHJpdi0+c3BpKTsKKworCS8qIEluZm9ybSBNVEQgc3Vic3lzdGVtIHRoYXQgZXJhc2UgaXMgY29tcGxldGUgKi8KKwlpbnN0ci0+c3RhdGUgPSBNVERfRVJBU0VfRE9ORTsKKwlpZiAoaW5zdHItPmNhbGxiYWNrKQorCQlpbnN0ci0+Y2FsbGJhY2soaW5zdHIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZWFkIGZyb20gdGhlIERhdGFGbGFzaCBkZXZpY2UuCisgKiAgIGZyb20gICA6IFN0YXJ0IG9mZnNldCBpbiBmbGFzaCBkZXZpY2UKKyAqICAgbGVuICAgIDogTnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQKKyAqICAgcmV0bGVuIDogTnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQKKyAqICAgYnVmICAgIDogQnVmZmVyIHRoYXQgd2lsbCByZWNlaXZlIGRhdGEKKyAqLworc3RhdGljIGludCBhdDkxX2RhdGFmbGFzaDI2X3JlYWQoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBmcm9tLCBzaXplX3QgbGVuLAorCQkJCSBzaXplX3QgKnJldGxlbiwgdV9jaGFyICpidWYpCit7CisJc3RydWN0IGRhdGFmbGFzaF9sb2NhbCAqcHJpdiA9IChzdHJ1Y3QgZGF0YWZsYXNoX2xvY2FsICopIG10ZC0+cHJpdjsKKwl1bnNpZ25lZCBjaGFyIGNtZFs1XTsKKworCURFQlVHKE1URF9ERUJVR19MRVZFTDEsICJkYXRhZmxhc2hfcmVhZDogJWxsaSAuLiAlbGxpXG4iLAorCSAgICAgIGZyb20sIGZyb20rbGVuKTsKKworCSpyZXRsZW4gPSAwOworCisJLyogU2FuaXR5IGNoZWNrcyAqLworCWlmICghbGVuKQorCQlyZXR1cm4gMDsKKwlpZiAoZnJvbSArIGxlbiA+IG10ZC0+c2l6ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljbWRbMF0gPSBBVDI2X09QX1JFQURfQVJSQVlfRkFTVDsKKwljbWRbMV0gPSAoZnJvbSAmIDB4MDBGRjAwMDApID4+IDE2OworCWNtZFsyXSA9IChmcm9tICYgMHgwMDAwRkYwMCkgPj4gODsKKwljbWRbM10gPSAoZnJvbSAmIDB4MDAwMDAwRkYpOworCS8qIGNtZFs0XSBpcyBhICJEb24ndCBjYXJlIiBieXRlICAqLworCisJREVCVUcoTVREX0RFQlVHX0xFVkVMMywgIlJFQUQ6ICgweCUwMngpIDB4JTAyeCAweCUwMnggMHglMDJ4XG4iLAorCSAgICAgICBjbWRbMF0sIGNtZFsxXSwgY21kWzJdLCBjbWRbM10pOworCisJc3BpX2FjY2Vzc19idXMocHJpdi0+c3BpKTsKKwlkb19zcGlfdHJhbnNmZXIoMiwgY21kLCA1LCBjbWQsIDUsIGJ1ZiwgbGVuLCBidWYsIGxlbik7CisJc3BpX3JlbGVhc2VfYnVzKHByaXYtPnNwaSk7CisKKwkqcmV0bGVuID0gbGVuOworCXJldHVybiAwOworfQorCisvKgorICogV3JpdGUgdG8gdGhlIERhdGFGbGFzaCBkZXZpY2UuCisgKiAgIHRvICAgICA6IFN0YXJ0IG9mZnNldCBpbiBmbGFzaCBkZXZpY2UKKyAqICAgbGVuICAgIDogTnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlCisgKiAgIHJldGxlbiA6IE51bWJlciBvZiBieXRlcyBhY3R1YWxseSB3cml0dGVuCisgKiAgIGJ1ZiAgICA6IEJ1ZmZlciBjb250YWluaW5nIHRoZSBkYXRhCisgKi8KK3N0YXRpYyBpbnQgYXQ5MV9kYXRhZmxhc2gyNl93cml0ZShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IHRvLCBzaXplX3QgbGVuLAorCQkJCSAgc2l6ZV90ICpyZXRsZW4sIGNvbnN0IHVfY2hhciAqYnVmKQoreworCXN0cnVjdCBkYXRhZmxhc2hfbG9jYWwgKnByaXYgPSAoc3RydWN0IGRhdGFmbGFzaF9sb2NhbCAqKSBtdGQtPnByaXY7CisJdW5zaWduZWQgaW50IGFkZHIsIGJ1Zl9pbmRleCA9IDA7CisJaW50IHJldCA9IC1FSU8sIHNlY3RvciwgbGFzdF9zZWN0b3I7CisJdW5zaWduZWQgY2hhciBzdGF0dXMsIGNtZFs1XTsKKworCURFQlVHKE1URF9ERUJVR19MRVZFTDEsICJkYXRhZmxhc2hfd3JpdGU6ICVsbGkgLi4gJWxsaVxuIiwgdG8sIHRvK2xlbik7CisKKwkqcmV0bGVuID0gMDsKKworCS8qIFNhbml0eSBjaGVja3MgKi8KKwlpZiAoIWxlbikKKwkJcmV0dXJuIDA7CisJaWYgKHRvICsgbGVuID4gbXRkLT5zaXplKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaV9hY2Nlc3NfYnVzKHByaXYtPnNwaSk7CisKKwlhZGRyID0gdG87CisJbGFzdF9zZWN0b3IgPSAtMTsKKworCXdoaWxlIChidWZfaW5kZXggPCBsZW4pIHsKKwkJc2VjdG9yID0gYWRkciAvIHByaXYtPnBhZ2Vfc2l6ZTsKKwkJLyogV3JpdGUgZmlyc3QgYnl0ZSBpZiBhIG5ldyBzZWN0b3IgYmVnaW5zICovCisJCWlmIChzZWN0b3IgIT0gbGFzdF9zZWN0b3IpIHsKKwkJCWF0OTFfZGF0YWZsYXNoMjZfd3JpdGVfZW5hYmxlKDEpOworCQkJYXQ5MV9kYXRhZmxhc2gyNl9zZWN0b3JfcHJvdGVjdChhZGRyLCAwKTsKKwkJCWF0OTFfZGF0YWZsYXNoMjZfd3JpdGVfZW5hYmxlKDEpOworCisJCQkvKiBQcm9ncmFtIGZpcnN0IGJ5dGUgb2YgYSBuZXcgc2VjdG9yICovCisJCQljbWRbMF0gPSBBVDI2X09QX1NFUVVFTlRJQUxfV1JJVEU7CisJCQljbWRbMV0gPSAoYWRkciAmIDB4MDBGRjAwMDApID4+IDE2OworCQkJY21kWzJdID0gKGFkZHIgJiAweDAwMDBGRjAwKSA+PiA4OworCQkJY21kWzNdID0gKGFkZHIgJiAweDAwMDAwMEZGKTsKKwkJCWNtZFs0XSA9IGJ1ZltidWZfaW5kZXgrK107CisJCQlkb19zcGlfdHJhbnNmZXIoMSwgY21kLCA1LCBjbWQsIDUsIE5VTEwsIDAsIE5VTEwsIDApOworCQkJc3RhdHVzID0gYXQ5MV9kYXRhZmxhc2gyNl93YWl0cmVhZHkoKTsKKwkJCWFkZHIrKzsKKwkJCS8qIE9uIHdyaXRlIGVycm9ycywgdGhlIGNoaXAgcmVzZXRzIHRoZSB3cml0ZSBlbmFibGUKKwkJCSAgIGZsYWcuIFRoaXMgYWxzbyBoYXBwZW5zIGFmdGVyIHRoZSBsYXN0IGJ5dGUgb2YgYQorCQkJICAgc2VjdG9yIGlzIHN1Y2Nlc3NmdWxseSBwcm9ncmFtbWVkLiAqLworCQkJaWYgKCAgICggIShzdGF0dXMgJiBBVDI2X1NUQVRVU19XUklURV9FTkFCTEUpKQorCQkJICAgICYmICgoYWRkciAlIHByaXYtPnBhZ2Vfc2l6ZSkgIT0gMCkgKSB7CisJCQkJREVCVUcoTVREX0RFQlVHX0xFVkVMMSwKKwkJCQkJIndyaXRlIGVycm9yMTogYWRkcj0weCUwNngsICIKKwkJCQkJInN0YXR1cz0weCUwMnhcbiIsIGFkZHIsIHN0YXR1cyk7CisJCQkJZ290byB3cml0ZV9lcnI7CisJCQl9CisJCQkoKnJldGxlbikrKzsKKwkJCWxhc3Rfc2VjdG9yID0gc2VjdG9yOworCQl9CisKKwkJLyogV3JpdGUgc3Vic2VxdWVudCBieXRlcyBpbiB0aGUgc2FtZSBzZWN0b3IgKi8KKwkJY21kWzBdID0gQVQyNl9PUF9TRVFVRU5USUFMX1dSSVRFOworCQljbWRbMV0gPSBidWZbYnVmX2luZGV4KytdOworCQlkb19zcGlfdHJhbnNmZXIoMSwgY21kLCAyLCBjbWQsIDIsIE5VTEwsIDAsIE5VTEwsIDApOworCQlzdGF0dXMgPSBhdDkxX2RhdGFmbGFzaDI2X3dhaXRyZWFkeSgpOworCQlhZGRyKys7CisKKwkJaWYgKCAgICggIShzdGF0dXMgJiBBVDI2X1NUQVRVU19XUklURV9FTkFCTEUpKQorCQkgICAgJiYgKChhZGRyICUgcHJpdi0+cGFnZV9zaXplKSAhPSAwKSApIHsKKwkJCURFQlVHKE1URF9ERUJVR19MRVZFTDEsICJ3cml0ZSBlcnJvcjI6IGFkZHI9MHglMDZ4LCAiCisJCQkJInN0YXR1cz0weCUwMnhcbiIsIGFkZHIsIHN0YXR1cyk7CisJCQlnb3RvIHdyaXRlX2VycjsKKwkJfQorCisJCSgqcmV0bGVuKSsrOworCX0KKworCXJldCA9IDA7CisJYXQ5MV9kYXRhZmxhc2gyNl93cml0ZV9lbmFibGUoMCk7Cit3cml0ZV9lcnI6CisJc3BpX3JlbGVhc2VfYnVzKHByaXYtPnNwaSk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEluaXRpYWxpemUgYW5kIHJlZ2lzdGVyIERhdGFGbGFzaCBkZXZpY2Ugd2l0aCBNVEQgc3Vic3lzdGVtLgorICovCitzdGF0aWMgaW50IF9faW5pdCBhZGRfZGF0YWZsYXNoKGludCBjaGFubmVsLCBjaGFyICpuYW1lLCBpbnQgbnJfcGFnZXMsCisJCQkJaW50IHBhZ2VzaXplKQoreworCXN0cnVjdCBtdGRfaW5mbyAqZGV2aWNlOworCXN0cnVjdCBkYXRhZmxhc2hfbG9jYWwgKnByaXY7CisKKwlpZiAobnJfZGV2aWNlcyA+PSBEQVRBRkxBU0hfTUFYX0RFVklDRVMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhdDkxX2RhdGFmbGFzaDI2OiBUb28gbWFueSBkZXZpY2VzICIKKwkJCQkiZGV0ZWN0ZWRcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlkZXZpY2UgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbXRkX2luZm8pICsgc3RybGVuKG5hbWUpICsgOCwKKwkJCSBHRlBfS0VSTkVMKTsKKwlpZiAoIWRldmljZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlkZXZpY2UtPm5hbWUgPSAoY2hhciAqKSZkZXZpY2VbMV07CisJc3ByaW50ZihkZXZpY2UtPm5hbWUsICIlcy5zcGklZCIsIG5hbWUsIGNoYW5uZWwpOworCWRldmljZS0+c2l6ZSA9IG5yX3BhZ2VzICogcGFnZXNpemU7CisJZGV2aWNlLT5lcmFzZXNpemUgPSBwYWdlc2l6ZTsKKwlkZXZpY2UtPm93bmVyID0gVEhJU19NT0RVTEU7CisJZGV2aWNlLT50eXBlID0gTVREX0RBVEFGTEFTSDsKKwlkZXZpY2UtPmZsYWdzID0gTVREX0NBUF9OT1JGTEFTSDsKKwlkZXZpY2UtPmVyYXNlID0gYXQ5MV9kYXRhZmxhc2gyNl9lcmFzZTsKKwlkZXZpY2UtPnJlYWQgPSBhdDkxX2RhdGFmbGFzaDI2X3JlYWQ7CisJZGV2aWNlLT53cml0ZSA9IGF0OTFfZGF0YWZsYXNoMjZfd3JpdGU7CisKKwlwcml2ID0gKHN0cnVjdCBkYXRhZmxhc2hfbG9jYWwgKilremFsbG9jKHNpemVvZihzdHJ1Y3QgZGF0YWZsYXNoX2xvY2FsKSwKKwkJR0ZQX0tFUk5FTCk7CisJaWYgKCFwcml2KSB7CisJCWtmcmVlKGRldmljZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXByaXYtPnNwaSA9IGNoYW5uZWw7CisJcHJpdi0+cGFnZV9zaXplID0gcGFnZXNpemU7CisJZGV2aWNlLT5wcml2ID0gcHJpdjsKKworCW10ZF9kZXZpY2VzW25yX2RldmljZXNdID0gZGV2aWNlOworCW5yX2RldmljZXMrKzsKKwlwcmludGsoS0VSTl9JTkZPICJhdDkxX2RhdGFmbGFzaDI2OiAlcyBkZXRlY3RlZCBbc3BpJWldICglaSBieXRlcylcbiIsCisJICAgICAgIG5hbWUsIGNoYW5uZWwsIGRldmljZS0+c2l6ZSk7CisKKwlyZXR1cm4gYWRkX210ZF9kZXZpY2UoZGV2aWNlKTsKK30KKworLyoKKyAqIERldGVjdCBhbmQgaW5pdGlhbGl6ZSBEYXRhRmxhc2ggZGV2aWNlIGNvbm5lY3RlZCB0byBzcGVjaWZpZWQgU1BJIGNoYW5uZWwuCisgKgorICovCisKK3N0cnVjdCBkYXRhZmxhc2gyNl90eXBlcyB7CisJdW5zaWduZWQgY2hhciBpZDA7CisJdW5zaWduZWQgY2hhciBpZDE7CisJY2hhciAqbmFtZTsKKwlpbnQgcGFnZXNpemU7CisJaW50IG5yX3BhZ2VzOworfTsKKworc3RydWN0IGRhdGFmbGFzaDI2X3R5cGVzIGRmMjZfdHlwZXNbXSA9IHsKKwl7CisJCS5pZDAgPSAweDA0LAorCQkuaWQxID0gMHgwMCwKKwkJLm5hbWUgPSAiQVQyNkYwMDQiLAorCQkucGFnZXNpemUgPSA0MDk2LAorCQkubnJfcGFnZXMgPSAxMjgsCisJfSwKKwl7CisJCS5pZDAgPSAweDQ1LAorCQkuaWQxID0gMHgwMSwKKwkJLm5hbWUgPSAiQVQyNkRGMDgxQSIsIC8qIE5vdCB0ZXN0ZWQgISAqLworCQkucGFnZXNpemUgPSA0MDk2LAorCQkubnJfcGFnZXMgPSAyNTYsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGF0OTFfZGF0YWZsYXNoMjZfZGV0ZWN0KGludCBjaGFubmVsKQoreworCXVuc2lnbmVkIGNoYXIgc3RhdHVzLCBjbWRbNV07CisJaW50IGk7CisKKwlzcGlfYWNjZXNzX2J1cyhjaGFubmVsKTsKKwlzdGF0dXMgPSBhdDkxX2RhdGFmbGFzaDI2X3N0YXR1cygpOworCisJaWYgKHN0YXR1cyA9PSAwIHx8IHN0YXR1cyA9PSAweGZmKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYXQ5MV9kYXRhZmxhc2gyNl9kZXRlY3Q6IHN0YXR1cyBlcnJvciAlZFxuIiwKKwkJCXN0YXR1cyk7CisJCXNwaV9yZWxlYXNlX2J1cyhjaGFubmVsKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJY21kWzBdID0gQVQyNl9PUF9SRUFEX0RFVl9JRDsKKwlkb19zcGlfdHJhbnNmZXIoMSwgY21kLCA1LCBjbWQsIDUsIE5VTEwsIDAsIE5VTEwsIDApOworCXNwaV9yZWxlYXNlX2J1cyhjaGFubmVsKTsKKworCWlmIChjbWRbMV0gIT0gTUFOVUZBQ1RVUkVSX0lEX0FUTUVMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGRmMjZfdHlwZXMpOyBpKyspIHsKKwkJaWYgKCAgIGNtZFsyXSA9PSBkZjI2X3R5cGVzW2ldLmlkMAorCQkgICAgJiYgY21kWzNdID09IGRmMjZfdHlwZXNbaV0uaWQxKQorCQkJcmV0dXJuIGFkZF9kYXRhZmxhc2goY2hhbm5lbCwKKwkJCQkJCWRmMjZfdHlwZXNbaV0ubmFtZSwKKwkJCQkJCWRmMjZfdHlwZXNbaV0ubnJfcGFnZXMsCisJCQkJCQlkZjI2X3R5cGVzW2ldLnBhZ2VzaXplKTsKKwl9CisKKwlwcmludGsoS0VSTl9FUlIgImF0OTFfZGF0YWZsYXNoMjZfZGV0ZWN0OiBVbnN1cHBvcnRlZCBkZXZpY2UgIgorCQkJIigweCUwMngvMHglMDJ4KVxuIiwgY21kWzJdLCBjbWRbM10pOworCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgaW50IF9faW5pdCBhdDkxX2RhdGFmbGFzaDI2X2luaXQodm9pZCkKK3sKKwlzcGlfdHJhbnNmZXJfZGVzYyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzcGlfdHJhbnNmZXJfbGlzdCksCisJCQkJICAgIEdGUF9LRVJORUwpOworCWlmICghc3BpX3RyYW5zZmVyX2Rlc2MpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogRGF0YUZsYXNoIChTUEkgY2hpcCBzZWxlY3QgMCkgKi8KKwlhdDkxX2RhdGFmbGFzaDI2X2RldGVjdCgwKTsKKworI2lmZGVmIENPTkZJR19NVERfQVQ5MV9EQVRBRkxBU0hfQ0FSRAorCS8qIERhdGFGbGFzaCBjYXJkIChTUEkgY2hpcCBzZWxlY3QgMykgKi8KKwlhdDkxX2RhdGFmbGFzaDI2X2RldGVjdCgzKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYXQ5MV9kYXRhZmxhc2gyNl9leGl0KHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgREFUQUZMQVNIX01BWF9ERVZJQ0VTOyBpKyspIHsKKwkJaWYgKG10ZF9kZXZpY2VzW2ldKSB7CisJCQlkZWxfbXRkX2RldmljZShtdGRfZGV2aWNlc1tpXSk7CisJCQlrZnJlZShtdGRfZGV2aWNlc1tpXS0+cHJpdik7CisJCQlrZnJlZShtdGRfZGV2aWNlc1tpXSk7CisJCX0KKwl9CisJbnJfZGV2aWNlcyA9IDA7CisJa2ZyZWUoc3BpX3RyYW5zZmVyX2Rlc2MpOworfQorCittb2R1bGVfaW5pdChhdDkxX2RhdGFmbGFzaDI2X2luaXQpOworbW9kdWxlX2V4aXQoYXQ5MV9kYXRhZmxhc2gyNl9leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiSGFucyBKLiBLb2NoIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRhdGFGbGFzaCBBVDI2eHh4IGRyaXZlciBmb3IgQXRtZWwgQVQ5MVJNOTIwMCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvZGV2aWNlcy9ibG9jazJtdGQuYyBiL2RyaXZlcnMvbXRkL2RldmljZXMvYmxvY2sybXRkLmMKaW5kZXggZjlmMmNlNy4uY2U0NzU0NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvZGV2aWNlcy9ibG9jazJtdGQuYworKysgYi9kcml2ZXJzL210ZC9kZXZpY2VzL2Jsb2NrMm10ZC5jCkBAIC00MCw1NiArNDAsOSBAQAogc3RhdGljIExJU1RfSEVBRChibGttdGRfZGV2aWNlX2xpc3QpOwogCiAKLSNkZWZpbmUgUEFHRV9SRUFEQUhFQUQgNjQKLXN0YXRpYyB2b2lkIGNhY2hlX3JlYWRhaGVhZChzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgaW50IGluZGV4KQorc3RhdGljIHN0cnVjdCBwYWdlKiBwYWdlX3JlYWQoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIGludCBpbmRleCkKIHsKIAlmaWxsZXJfdCAqZmlsbGVyID0gKGZpbGxlcl90KiltYXBwaW5nLT5hX29wcy0+cmVhZHBhZ2U7Ci0JaW50IGksIHBhZ2VpOwotCXVuc2lnbmVkIHJldCA9IDA7Ci0JdW5zaWduZWQgbG9uZyBlbmRfaW5kZXg7Ci0Jc3RydWN0IHBhZ2UgKnBhZ2U7Ci0JTElTVF9IRUFEKHBhZ2VfcG9vbCk7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IG1hcHBpbmctPmhvc3Q7Ci0JbG9mZl90IGlzaXplID0gaV9zaXplX3JlYWQoaW5vZGUpOwotCi0JaWYgKCFpc2l6ZSkgewotCQlJTkZPKCJpU2l6ZT0wIGluIGNhY2hlX3JlYWRhaGVhZFxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQllbmRfaW5kZXggPSAoKGlzaXplIC0gMSkgPj4gUEFHRV9DQUNIRV9TSElGVCk7Ci0KLQlyZWFkX2xvY2tfaXJxKCZtYXBwaW5nLT50cmVlX2xvY2spOwotCWZvciAoaSA9IDA7IGkgPCBQQUdFX1JFQURBSEVBRDsgaSsrKSB7Ci0JCXBhZ2VpID0gaW5kZXggKyBpOwotCQlpZiAocGFnZWkgPiBlbmRfaW5kZXgpIHsKLQkJCUlORk8oIk92ZXJydW4gZW5kIG9mIGRpc2sgaW4gY2FjaGUgcmVhZGFoZWFkXG4iKTsKLQkJCWJyZWFrOwotCQl9Ci0JCXBhZ2UgPSByYWRpeF90cmVlX2xvb2t1cCgmbWFwcGluZy0+cGFnZV90cmVlLCBwYWdlaSk7Ci0JCWlmIChwYWdlICYmICghaSkpCi0JCQlicmVhazsKLQkJaWYgKHBhZ2UpCi0JCQljb250aW51ZTsKLQkJcmVhZF91bmxvY2tfaXJxKCZtYXBwaW5nLT50cmVlX2xvY2spOwotCQlwYWdlID0gcGFnZV9jYWNoZV9hbGxvY19jb2xkKG1hcHBpbmcpOwotCQlyZWFkX2xvY2tfaXJxKCZtYXBwaW5nLT50cmVlX2xvY2spOwotCQlpZiAoIXBhZ2UpCi0JCQlicmVhazsKLQkJcGFnZS0+aW5kZXggPSBwYWdlaTsKLQkJbGlzdF9hZGQoJnBhZ2UtPmxydSwgJnBhZ2VfcG9vbCk7Ci0JCXJldCsrOwotCX0KLQlyZWFkX3VubG9ja19pcnEoJm1hcHBpbmctPnRyZWVfbG9jayk7Ci0JaWYgKHJldCkKLQkJcmVhZF9jYWNoZV9wYWdlcyhtYXBwaW5nLCAmcGFnZV9wb29sLCBmaWxsZXIsIE5VTEwpOwotfQotCi0KLXN0YXRpYyBzdHJ1Y3QgcGFnZSogcGFnZV9yZWFkYWhlYWQoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIGludCBpbmRleCkKLXsKLQlmaWxsZXJfdCAqZmlsbGVyID0gKGZpbGxlcl90KiltYXBwaW5nLT5hX29wcy0+cmVhZHBhZ2U7Ci0JY2FjaGVfcmVhZGFoZWFkKG1hcHBpbmcsIGluZGV4KTsKIAlyZXR1cm4gcmVhZF9jYWNoZV9wYWdlKG1hcHBpbmcsIGluZGV4LCBmaWxsZXIsIE5VTEwpOwogfQogCkBAIC0xMDUsMTQgKzU4LDE0IEBACiAJdV9sb25nICptYXg7CiAKIAl3aGlsZSAocGFnZXMpIHsKLQkJcGFnZSA9IHBhZ2VfcmVhZGFoZWFkKG1hcHBpbmcsIGluZGV4KTsKKwkJcGFnZSA9IHBhZ2VfcmVhZChtYXBwaW5nLCBpbmRleCk7CiAJCWlmICghcGFnZSkKIAkJCXJldHVybiAtRU5PTUVNOwogCQlpZiAoSVNfRVJSKHBhZ2UpKQogCQkJcmV0dXJuIFBUUl9FUlIocGFnZSk7CiAKLQkJbWF4ID0gKHVfbG9uZyopcGFnZV9hZGRyZXNzKHBhZ2UpICsgUEFHRV9TSVpFOwotCQlmb3IgKHA9KHVfbG9uZyopcGFnZV9hZGRyZXNzKHBhZ2UpOyBwPG1heDsgcCsrKQorCQltYXggPSBwYWdlX2FkZHJlc3MocGFnZSkgKyBQQUdFX1NJWkU7CisJCWZvciAocD1wYWdlX2FkZHJlc3MocGFnZSk7IHA8bWF4OyBwKyspCiAJCQlpZiAoKnAgIT0gLTFVTCkgewogCQkJCWxvY2tfcGFnZShwYWdlKTsKIAkJCQltZW1zZXQocGFnZV9hZGRyZXNzKHBhZ2UpLCAweGZmLCBQQUdFX1NJWkUpOwpAQCAtMTc0LDggKzEyNyw3IEBACiAJCQljcHlsZW4gPSBsZW47CS8vIHRoaXMgcGFnZQogCQlsZW4gPSBsZW4gLSBjcHlsZW47CiAKLQkJLy8gICAgICBHZXQgcGFnZQotCQlwYWdlID0gcGFnZV9yZWFkYWhlYWQoZGV2LT5ibGtkZXYtPmJkX2lub2RlLT5pX21hcHBpbmcsIGluZGV4KTsKKwkJcGFnZSA9IHBhZ2VfcmVhZChkZXYtPmJsa2Rldi0+YmRfaW5vZGUtPmlfbWFwcGluZywgaW5kZXgpOwogCQlpZiAoIXBhZ2UpCiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJaWYgKElTX0VSUihwYWdlKSkKQEAgLTIxMyw4ICsxNjUsNyBAQAogCQkJY3B5bGVuID0gbGVuOwkJCS8vIHRoaXMgcGFnZQogCQlsZW4gPSBsZW4gLSBjcHlsZW47CiAKLQkJLy8JR2V0IHBhZ2UKLQkJcGFnZSA9IHBhZ2VfcmVhZGFoZWFkKG1hcHBpbmcsIGluZGV4KTsKKwkJcGFnZSA9IHBhZ2VfcmVhZChtYXBwaW5nLCBpbmRleCk7CiAJCWlmICghcGFnZSkKIAkJCXJldHVybiAtRU5PTUVNOwogCQlpZiAoSVNfRVJSKHBhZ2UpKQpAQCAtMzA4LDkgKzI1OSw5IEBACiAJCS8qIFdlIG1pZ2h0IG5vdCBoYXZlIHJvb3RmcyBtb3VudGVkIGF0IHRoaXMgcG9pbnQuIFRyeQogCQkgICB0byByZXNvbHZlIHRoZSBkZXZpY2UgbmFtZSBieSBvdGhlciBtZWFucy4gKi8KIAotCQlkZXZfdCBkZXYgPSBuYW1lX3RvX2Rldl90KGRldm5hbWUpOwotCQlpZiAoZGV2ICE9IDApIHsKLQkJCWJkZXYgPSBvcGVuX2J5X2Rldm51bShkZXYsIEZNT0RFX1dSSVRFIHwgRk1PREVfUkVBRCk7CisJCWRldl90IGRldnQgPSBuYW1lX3RvX2Rldl90KGRldm5hbWUpOworCQlpZiAoZGV2dCkgeworCQkJYmRldiA9IG9wZW5fYnlfZGV2bnVtKGRldnQsIEZNT0RFX1dSSVRFIHwgRk1PREVfUkVBRCk7CiAJCX0KIAl9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL21hcHMvS2NvbmZpZyBiL2RyaXZlcnMvbXRkL21hcHMvS2NvbmZpZwppbmRleCBiYmYwNTUzLi5kOTkwZDgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tYXBzL0tjb25maWcKKysrIGIvZHJpdmVycy9tdGQvbWFwcy9LY29uZmlnCkBAIC02LDcgKzYsNiBAQAogCiBjb25maWcgTVREX0NPTVBMRVhfTUFQUElOR1MKIAlib29sICJTdXBwb3J0IG5vbi1saW5lYXIgbWFwcGluZ3Mgb2YgZmxhc2ggY2hpcHMiCi0JZGVwZW5kcyBvbiBNVEQKIAloZWxwCiAJICBUaGlzIGNhdXNlcyB0aGUgY2hpcCBkcml2ZXJzIHRvIGFsbG93IGZvciBjb21wbGljYXRlZAogCSAgcGFnZWQgbWFwcGluZ3Mgb2YgZmxhc2ggY2hpcHMuCkBAIC02OSw2ICs2OCwzOSBAQAogCSAgcGh5c2ljYWxseSBpbnRvIHRoZSBDUFUncyBtZW1vcnkuIFRoZSBtYXBwaW5nIGRlc2NyaXB0aW9uIGhlcmUgaXMKIAkgIHRha2VuIGZyb20gT0YgZGV2aWNlIHRyZWUuCiAKK2NvbmZpZyBNVERfUE1DX01TUF9FVk0KKwl0cmlzdGF0ZSAiQ0ZJIEZsYXNoIGRldmljZSBtYXBwZWQgb24gUE1DLVNpZXJyYSBNU1AiCisJZGVwZW5kcyBvbiBQTUNfTVNQICYmIE1URF9DRkkKKwlzZWxlY3QgTVREX1BBUlRJVElPTlMKKwloZWxwCisJICBUaGlzIHByb3ZpZGVzIGEgJ21hcHBpbmcnIGRyaXZlciB3aGljaCBzdXBwb3J0IHRoZSB3YXkKKyAgICAgICAgICBpbiB3aGljaCB1c2VyLXByb2dyYW1tYWJsZSBmbGFzaCBjaGlwcyBhcmUgY29ubmVjdGVkIG9uIHRoZQorICAgICAgICAgIFBNQy1TaWVycmEgTVNQIGV2YWwvZGVtbyBib2FyZHMKKworY2hvaWNlCisJcHJvbXB0ICJNYXhpbXVtIG1hcHBhYmxlIG1lbW9yeSBhdmlhbGFibGUgZm9yIGZsYXNoIElPIgorCWRlcGVuZHMgb24gTVREX1BNQ19NU1BfRVZNCisJZGVmYXVsdCBNU1BfRkxBU0hfTUFQX0xJTUlUXzMyTQorCitjb25maWcgTVNQX0ZMQVNIX01BUF9MSU1JVF8zMk0KKwlib29sICIzMk0iCisKK2VuZGNob2ljZQorCitjb25maWcgTVNQX0ZMQVNIX01BUF9MSU1JVAorCWhleAorCWRlZmF1bHQgIjB4MDIwMDAwMDAiCisJZGVwZW5kcyBvbiBNU1BfRkxBU0hfTUFQX0xJTUlUXzMyTQorCitjb25maWcgTVREX1BNQ19NU1BfUkFNUk9PVAorCXRyaXN0YXRlICJFbWJlZGRlZCBSQU0gYmxvY2sgZGV2aWNlIGZvciByb290IG9uIFBNQy1TaWVycmEgTVNQIgorCWRlcGVuZHMgb24gUE1DX01TUF9FTUJFRERFRF9ST09URlMgJiYgXAorCQkJKE1URF9CTE9DSyB8fCBNVERfQkxPQ0tfUk8pICYmIFwKKwkJCU1URF9SQU0KKwloZWxwCisJICBUaGlzIHByb3ZpZGVzIHN1cHBvcnQgZm9yIHRoZSBlbWJlZGRlZCByb290IGZpbGUgc3lzdGVtCisgICAgICAgICAgb24gUE1DIE1TUCBkZXZpY2VzLiAgVGhpcyBtZW1vcnkgaXMgbWFwcGVkIGFzIGEgTVREIGJsb2NrIGRldmljZS4KKwogY29uZmlnIE1URF9TVU5fVUZMQVNICiAJdHJpc3RhdGUgIlN1biBNaWNyb3N5c3RlbXMgdXNlcmZsYXNoIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBTUEFSQyAmJiBNVERfQ0ZJCkBAIC0yNDAsMTMgKzI3MiwxMyBAQAogCiBjb25maWcgTVREX0FMQ0hFTVkKIAl0cmlzdGF0ZSAiQU1EIEFsY2hlbXkgUGIxeHh4L0RiMXh4eC9SREsgTVREIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBTT0NfQVUxWDAwCisJZGVwZW5kcyBvbiBTT0NfQVUxWDAwICYmIE1URF9QQVJUSVRJT05TICYmIE1URF9DRkkKIAloZWxwCiAJICBGbGFzaCBtZW1vcnkgYWNjZXNzIG9uIEFNRCBBbGNoZW15IFBiL0RiL1JESyBSZWZlcmVuY2UgQm9hcmRzCiAKIGNvbmZpZyBNVERfTVRYMQogCXRyaXN0YXRlICI0RyBTeXN0ZW1zIE1UWC0xIEZsYXNoIGRldmljZSIKLQlkZXBlbmRzIG9uIE1JUFMgJiYgTUlQU19NVFgxCisJZGVwZW5kcyBvbiBNSVBTX01UWDEgJiYgTVREX0NGSQogCWhlbHAKIAkgIEZsYXNoIG1lbW9yeSBhY2Nlc3Mgb24gNEcgU3lzdGVtcyBNVFgtMSBCb2FyZC4gSWYgeW91IGhhdmUgb25lIG9mCiAJICB0aGVzZSBib2FyZHMgYW5kIHdvdWxkIGxpa2UgdG8gdXNlIHRoZSBmbGFzaCBjaGlwcyBvbiBpdCwgc2F5ICdZJy4KQEAgLTM4NCw3ICs0MTYsNyBAQAogCiBjb25maWcgTVREX09DRUxPVAogCXRyaXN0YXRlICJNb21lbmNvIE9jZWxvdCBib290IGZsYXNoIGRldmljZSIKLQlkZXBlbmRzIG9uIE1JUFMgJiYgTU9NRU5DT19PQ0VMT1QKKwlkZXBlbmRzIG9uIE1PTUVOQ09fT0NFTE9UCiAJaGVscAogCSAgVGhpcyBlbmFibGVzIGFjY2VzcyByb3V0aW5lcyBmb3IgdGhlIGJvb3QgZmxhc2ggZGV2aWNlIGFuZCBmb3IgdGhlCiAJICBOVlJBTSBvbiB0aGUgTW9tZW5jbyBPY2Vsb3QgYm9hcmQuIElmIHlvdSBoYXZlIG9uZSBvZiB0aGVzZSBib2FyZHMKQEAgLTUxNyw3ICs1NDksNyBAQAogIyBUaGlzIG5lZWRzIENGSSBvciBKRURFQywgZGVwZW5kaW5nIG9uIHRoZSBjYXJkcyBmb3VuZC4KIGNvbmZpZyBNVERfUENJCiAJdHJpc3RhdGUgIlBDSSBNVEQgZHJpdmVyIgotCWRlcGVuZHMgb24gTVREICYmIFBDSSAmJiBNVERfQ09NUExFWF9NQVBQSU5HUworCWRlcGVuZHMgb24gUENJICYmIE1URF9DT01QTEVYX01BUFBJTkdTCiAJaGVscAogCSAgTWFwcGluZyBmb3IgYWNjZXNzaW5nIGZsYXNoIGRldmljZXMgb24gYWRkLWluIGNhcmRzIGxpa2UgdGhlIEludGVsIFhTY2FsZQogCSAgSVE4MDMxMCBjYXJkLCBhbmQgdGhlIEludGVsIEVCU0EyODUgY2FyZCBpbiBibGFuayBST00gcHJvZ3JhbW1pbmcgbW9kZQpAQCAtNTI3LDcgKzU1OSw3IEBACiAKIGNvbmZpZyBNVERfUENNQ0lBCiAJdHJpc3RhdGUgIlBDTUNJQSBNVEQgZHJpdmVyIgotCWRlcGVuZHMgb24gTVREICYmIFBDTUNJQSAmJiBNVERfQ09NUExFWF9NQVBQSU5HUyAmJiBCUk9LRU4KKwlkZXBlbmRzIG9uIFBDTUNJQSAmJiBNVERfQ09NUExFWF9NQVBQSU5HUyAmJiBCUk9LRU4KIAloZWxwCiAJICBNYXAgZHJpdmVyIGZvciBhY2Nlc3NpbmcgUENNQ0lBIGxpbmVhciBmbGFzaCBtZW1vcnkgY2FyZHMuIFRoZXNlCiAJICBjYXJkcyBhcmUgdXN1YWxseSBhcm91bmQgNC0xNk1pQiBpbiBzaXplLiBUaGlzIGRvZXMgbm90IGluY2x1ZGUKQEAgLTU5MSwxMyArNjIzLDEyIEBACiAKIGNvbmZpZyBNVERfU0hBUlBfU0wKIAlib29sICJST00gbWFwcGVkIG9uIFNoYXJwIFNMIFNlcmllcyIKLQlkZXBlbmRzIG9uIE1URCAmJiBBUkNIX1BYQQorCWRlcGVuZHMgb24gQVJDSF9QWEEKIAloZWxwCiAJICBUaGlzIGVuYWJsZXMgYWNjZXNzIHRvIHRoZSBmbGFzaCBjaGlwIG9uIHRoZSBTaGFycCBTTCBTZXJpZXMgb2YgUERBcy4KIAogY29uZmlnIE1URF9QTEFUUkFNCiAJdHJpc3RhdGUgIk1hcCBkcml2ZXIgZm9yIHBsYXRmb3JtIGRldmljZSBSQU0gKG10ZC1yYW0pIgotCWRlcGVuZHMgb24gTVRECiAJc2VsZWN0IE1URF9SQU0KIAloZWxwCiAJICBNYXAgZHJpdmVyIGZvciBSQU0gYXJlYXMgZGVzY3JpYmVkIHZpYSB0aGUgcGxhdGZvcm0gZGV2aWNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tYXBzL01ha2VmaWxlIGIvZHJpdmVycy9tdGQvbWFwcy9NYWtlZmlsZQppbmRleCAwNzFkMGJmLi5kZTAzNmM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tYXBzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbXRkL21hcHMvTWFrZWZpbGUKQEAgLTI3LDYgKzI3LDggQEAKIG9iai0kKENPTkZJR19NVERfT0NUQUdPTikJKz0gb2N0YWdvbi01MDY2Lm8KIG9iai0kKENPTkZJR19NVERfUEhZU01BUCkJKz0gcGh5c21hcC5vCiBvYmotJChDT05GSUdfTVREX1BIWVNNQVBfT0YpCSs9IHBoeXNtYXBfb2Yubworb2JqLSQoQ09ORklHX01URF9QTUNfTVNQX0VWTSkgICArPSBwbWNtc3AtZmxhc2gubworb2JqLSQoQ09ORklHX01URF9QTUNfTVNQX1JBTVJPT1QpKz0gcG1jbXNwLXJhbXJvb3Qubwogb2JqLSQoQ09ORklHX01URF9QTkMyMDAwKQkrPSBwbmMyMDAwLm8KIG9iai0kKENPTkZJR19NVERfUENNQ0lBKQkrPSBwY21jaWFtdGQubwogb2JqLSQoQ09ORklHX01URF9SUFhMSVRFKQkrPSBycHhsaXRlLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL21hcHMvYWxjaGVteS1mbGFzaC5jIGIvZHJpdmVycy9tdGQvbWFwcy9hbGNoZW15LWZsYXNoLmMKaW5kZXggN2ZjODA5Ny4uODRmYmUwZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbWFwcy9hbGNoZW15LWZsYXNoLmMKKysrIGIvZHJpdmVycy9tdGQvbWFwcy9hbGNoZW15LWZsYXNoLmMKQEAgLTEsMTAgKzEsNyBAQAogLyoKICAqIEZsYXNoIG1lbW9yeSBhY2Nlc3Mgb24gQU1EIEFsY2hlbXkgZXZhbHVhdGlvbiBib2FyZHMKICAqCi0gKiAkSWQ6IGFsY2hlbXktZmxhc2guYyx2IDEuMiAyMDA1LzExLzA3IDExOjE0OjI2IGdsZWl4bmVyIEV4cCAkCi0gKgogICogKEMpIDIwMDMsIDIwMDQgUGV0ZSBQb3BvdiA8cHBvcG92QGVtYmVkZGVkYWxsZXkuY29tPgotICoKICAqLwogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpAQCAtMTgsMTIgKzE1LDYgQEAKIAogI2luY2x1ZGUgPGFzbS9pby5oPgogCi0jaWZkZWYgCURFQlVHX1JXCi0jZGVmaW5lCURCRyh4Li4uKQlwcmludGsoeCkKLSNlbHNlCi0jZGVmaW5lCURCRyh4Li4uKQotI2VuZGlmCi0KICNpZmRlZiBDT05GSUdfTUlQU19QQjEwMDAKICNkZWZpbmUgQk9BUkRfTUFQX05BTUUgIlBiMTAwMCBGbGFzaCIKICNkZWZpbmUgQk9BUkRfRkxBU0hfU0laRSAweDAwODAwMDAwIC8qIDhNQiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9jazgwNHhyb20uYyBiL2RyaXZlcnMvbXRkL21hcHMvY2s4MDR4cm9tLmMKaW5kZXggM2Q0YTRkOC4uNjg4ZWY0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbWFwcy9jazgwNHhyb20uYworKysgYi9kcml2ZXJzL210ZC9tYXBzL2NrODA0eHJvbS5jCkBAIC0zMzgsNyArMzM4LDcgQEAKIAl9CiAJcmV0dXJuIC1FTlhJTzsKICNpZiAwCi0JcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmY2s4MDR4cm9tX2RyaXZlcik7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmNrODA0eHJvbV9kcml2ZXIpOwogI2VuZGlmCiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL21hcHMvcGxhdC1yYW0uYyBiL2RyaXZlcnMvbXRkL21hcHMvcGxhdC1yYW0uYwppbmRleCAyYjY1MDRlLi44OTRjMGIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tYXBzL3BsYXQtcmFtLmMKKysrIGIvZHJpdmVycy9tdGQvbWFwcy9wbGF0LXJhbS5jCkBAIC0xNjksNyArMTY5LDggQEAKIAkJZ290byBleGl0X2ZyZWU7CiAJfQogCi0JZGV2X2RiZygmcGRldi0+ZGV2LCAiZ290IHBsYXRmb3JtIHJlc291cmNlICVwICgweCVseClcbiIsIHJlcywgcmVzLT5zdGFydCk7CisJZGV2X2RiZygmcGRldi0+ZGV2LCAiZ290IHBsYXRmb3JtIHJlc291cmNlICVwICgweCVsbHgpXG4iLCByZXMsCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpcmVzLT5zdGFydCk7CiAKIAkvKiBzZXR1cCBtYXAgcGFyYW1ldGVycyAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tYXBzL3BtY21zcC1mbGFzaC5jIGIvZHJpdmVycy9tdGQvbWFwcy9wbWNtc3AtZmxhc2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTAzNzdlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tdGQvbWFwcy9wbWNtc3AtZmxhc2guYwpAQCAtMCwwICsxLDE4NCBAQAorLyoKKyAqIE1hcHBpbmcgb2YgYSBjdXN0b20gYm9hcmQgd2l0aCBib3RoIEFNRCBDRkkgYW5kIEpFREVDIGZsYXNoIGluIHBhcnRpdGlvbnMuCisgKiBDb25maWcgd2l0aCBib3RoIENGSSBhbmQgSkVERUMgZGV2aWNlIHN1cHBvcnQuCisgKgorICogQmFzaWNhbGx5IHBoeXNtYXAuYyB3aXRoIHRoZSBhZGRpdGlvbiBvZiBwYXJ0aXRpb25zIGFuZAorICogYW4gYXJyYXkgb2YgbWFwcGluZyBpbmZvIHRvIGFjY29tb2RhdGUgbW9yZSB0aGFuIG9uZSBmbGFzaCB0eXBlIHBlciBib2FyZC4KKyAqCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA3IFBNQy1TaWVycmEsIEluYy4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVEhJUyAgU09GVFdBUkUgIElTIFBST1ZJREVEICAgYGBBUyAgSVMnJyBBTkQgICBBTlkgIEVYUFJFU1MgT1IgSU1QTElFRAorICogIFdBUlJBTlRJRVMsICAgSU5DTFVESU5HLCBCVVQgTk9UICBMSU1JVEVEICBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTgorICogIE5PICBFVkVOVCAgU0hBTEwgICBUSEUgQVVUSE9SICBCRSAgICBMSUFCTEUgRk9SIEFOWSAgIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiAgTk9UIExJTUlURUQgICBUTywgUFJPQ1VSRU1FTlQgT0YgIFNVQlNUSVRVVEUgR09PRFMgIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiAgVVNFLCBEQVRBLCAgT1IgUFJPRklUUzsgT1IgIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgKiAgQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlIDxtc3BfcHJvbS5oPgorI2luY2x1ZGUgPG1zcF9yZWdzLmg+CisKKworc3RhdGljIHN0cnVjdCBtdGRfaW5mbyAqKm1zcF9mbGFzaDsKK3N0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqKm1zcF9wYXJ0czsKK3N0YXRpYyBzdHJ1Y3QgbWFwX2luZm8gKm1zcF9tYXBzOworc3RhdGljIGludCBmY250OworCisjZGVmaW5lIERFQlVHX01BUktFUiBwcmludGsoS0VSTl9OT1RJQ0UgIiVzWyVkXVxuIixfX0ZVTkNUSU9OX18sX19MSU5FX18pCisKK2ludCBfX2luaXQgaW5pdF9tc3BfZmxhc2godm9pZCkKK3sKKwlpbnQgaSwgajsKKwlpbnQgb2Zmc2V0LCBjb2ZmOworCWNoYXIgKmVudjsKKwlpbnQgcGNudDsKKwljaGFyIGZsYXNoX25hbWVbXSA9ICJmbGFzaDAiOworCWNoYXIgcGFydF9uYW1lW10gPSAiZmxhc2gwXzAiOworCXVuc2lnbmVkIGFkZHIsIHNpemU7CisKKwkvKiBJZiBFTEIgaXMgZGlzYWJsZWQgYnkgImZ1bC1tdXgiIG1vZGUsIHdlIGNhbid0IGdldCBhdCBmbGFzaCAqLworCWlmICgoKkRFVl9JRF9SRUcgJiBERVZfSURfU0lOR0xFX1BDKSAmJgorCSAgICAoKkVMQl8xUENfRU5fUkVHICYgU0lOR0xFX1BDQ0FSRCkpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJTaW5nbGUgUEMgQ2FyZCBtb2RlOiBubyBmbGFzaCBhY2Nlc3NcbiIpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCS8qIGV4YW1pbmUgdGhlIHByb20gZW52aXJvbm1lbnQgZm9yIGZsYXNoIGRldmljZXMgKi8KKwlmb3IgKGZjbnQgPSAwOyAoZW52ID0gcHJvbV9nZXRlbnYoZmxhc2hfbmFtZSkpOyBmY250KyspCisJCWZsYXNoX25hbWVbNV0gPSAnMCcgKyBmY250ICsgMTsKKworCWlmIChmY250IDwgMSkKKwkJcmV0dXJuIC1FTlhJTzsKKworCXByaW50ayhLRVJOX05PVElDRSAiRm91bmQgJWQgUE1DIGZsYXNoIGRldmljZXNcbiIsIGZjbnQpOworCW1zcF9mbGFzaCA9IChzdHJ1Y3QgbXRkX2luZm8gKiopa21hbGxvYygKKwkJCWZjbnQgKiBzaXplb2Yoc3RydWN0IG1hcF9pbmZvICopLCBHRlBfS0VSTkVMKTsKKwltc3BfcGFydHMgPSAoc3RydWN0IG10ZF9wYXJ0aXRpb24gKiopa21hbGxvYygKKwkJCWZjbnQgKiBzaXplb2Yoc3RydWN0IG10ZF9wYXJ0aXRpb24gKiksIEdGUF9LRVJORUwpOworCW1zcF9tYXBzID0gKHN0cnVjdCBtYXBfaW5mbyAqKWttYWxsb2MoCisJCQlmY250ICogc2l6ZW9mKHN0cnVjdCBtdGRfaW5mbyksIEdGUF9LRVJORUwpOworCW1lbXNldChtc3BfbWFwcywgMCwgZmNudCAqIHNpemVvZihzdHJ1Y3QgbXRkX2luZm8pKTsKKworCS8qIGxvb3Agb3ZlciB0aGUgZmxhc2ggZGV2aWNlcywgaW5pdGlhbGl6aW5nIGVhY2ggKi8KKwlmb3IgKGkgPSAwOyBpIDwgZmNudDsgaSsrKSB7CisJCS8qIGV4YW1pbmUgdGhlIHByb20gZW52aXJvbm1lbnQgZm9yIGZsYXNoIHBhcnRpdGl0aW9ucyAqLworCQlwYXJ0X25hbWVbNV0gPSAnMCcgKyBpOworCQlwYXJ0X25hbWVbN10gPSAnMCc7CisJCWZvciAocGNudCA9IDA7IChlbnYgPSBwcm9tX2dldGVudihwYXJ0X25hbWUpKTsgcGNudCsrKQorCQkJcGFydF9uYW1lWzddID0gJzAnICsgcGNudCArIDE7CisKKwkJaWYgKHBjbnQgPT0gMCkgeworCQkJcHJpbnRrKEtFUk5fTk9USUNFICJTa2lwcGluZyBmbGFzaCBkZXZpY2UgJWQgIgorCQkJCSIobm8gcGFydGl0aW9ucyBkZWZpbmVkKVxuIiwgaSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCW1zcF9wYXJ0c1tpXSA9IChzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqKWttYWxsb2MoCisJCQlwY250ICogc2l6ZW9mKHN0cnVjdCBtdGRfcGFydGl0aW9uKSwgR0ZQX0tFUk5FTCk7CisJCW1lbXNldChtc3BfcGFydHNbaV0sIDAsIHBjbnQgKiBzaXplb2Yoc3RydWN0IG10ZF9wYXJ0aXRpb24pKTsKKworCQkvKiBub3cgaW5pdGlhbGl6ZSB0aGUgZGV2aWNlcyBwcm9wZXIgKi8KKwkJZmxhc2hfbmFtZVs1XSA9ICcwJyArIGk7CisJCWVudiA9IHByb21fZ2V0ZW52KGZsYXNoX25hbWUpOworCisJCWlmIChzc2NhbmYoZW52LCAiJXg6JXgiLCAmYWRkciwgJnNpemUpIDwgMikKKwkJCXJldHVybiAtRU5YSU87CisJCWFkZHIgPSBDUEhZU0FERFIoYWRkcik7CisKKwkJcHJpbnRrKEtFUk5fTk9USUNFCisJCQkiTVNQIGZsYXNoIGRldmljZSBcIiVzXCI6IDB4JTA4eCBhdCAweCUwOHhcbiIsCisJCQlmbGFzaF9uYW1lLCBzaXplLCBhZGRyKTsKKwkJLyogVGhpcyBtdXN0IG1hdGNocyB0aGUgYWN0dWFsIHNpemUgb2YgdGhlIGZsYXNoIGNoaXAgKi8KKwkJbXNwX21hcHNbaV0uc2l6ZSA9IHNpemU7CisJCW1zcF9tYXBzW2ldLnBoeXMgPSBhZGRyOworCisJCS8qCisJCSAqIFBsYXRmb3JtcyBoYXZlIGEgc3BlY2lmaWMgbGltaXQgb2YgdGhlIHNpemUgb2YgbWVtb3J5CisJCSAqIHdoaWNoIG1heSBiZSBtYXBwZWQgZm9yIGZsYXNoOgorCQkgKi8KKwkJaWYgKHNpemUgPiBDT05GSUdfTVNQX0ZMQVNIX01BUF9MSU1JVCkKKwkJCXNpemUgPSBDT05GSUdfTVNQX0ZMQVNIX01BUF9MSU1JVDsKKwkJbXNwX21hcHNbaV0udmlydCA9IGlvcmVtYXAoYWRkciwgc2l6ZSk7CisJCW1zcF9tYXBzW2ldLmJhbmt3aWR0aCA9IDE7CisJCW1zcF9tYXBzW2ldLm5hbWUgPSBzdHJuY3B5KGttYWxsb2MoNywgR0ZQX0tFUk5FTCksCisJCQkJCWZsYXNoX25hbWUsIDcpOworCisJCWlmIChtc3BfbWFwc1tpXS52aXJ0ID09IE5VTEwpCisJCQlyZXR1cm4gLUVOWElPOworCisJCWZvciAoaiA9IDA7IGogPCBwY250OyBqKyspIHsKKwkJCXBhcnRfbmFtZVs1XSA9ICcwJyArIGk7CisJCQlwYXJ0X25hbWVbN10gPSAnMCcgKyBqOworCisJCQllbnYgPSBwcm9tX2dldGVudihwYXJ0X25hbWUpOworCisJCQlpZiAoc3NjYW5mKGVudiwgIiV4OiV4OiVuIiwgJm9mZnNldCwgJnNpemUsICZjb2ZmKSA8IDIpCisJCQkJcmV0dXJuIC1FTlhJTzsKKworCQkJbXNwX3BhcnRzW2ldW2pdLnNpemUgPSBzaXplOworCQkJbXNwX3BhcnRzW2ldW2pdLm9mZnNldCA9IG9mZnNldDsKKwkJCW1zcF9wYXJ0c1tpXVtqXS5uYW1lID0gZW52ICsgY29mZjsKKwkJfQorCisJCS8qIG5vdyBwcm9iZSBhbmQgYWRkIHRoZSBkZXZpY2UgKi8KKwkJc2ltcGxlX21hcF9pbml0KCZtc3BfbWFwc1tpXSk7CisJCW1zcF9mbGFzaFtpXSA9IGRvX21hcF9wcm9iZSgiY2ZpX3Byb2JlIiwgJm1zcF9tYXBzW2ldKTsKKwkJaWYgKG1zcF9mbGFzaFtpXSkgeworCQkJbXNwX2ZsYXNoW2ldLT5vd25lciA9IFRISVNfTU9EVUxFOworCQkJYWRkX210ZF9wYXJ0aXRpb25zKG1zcF9mbGFzaFtpXSwgbXNwX3BhcnRzW2ldLCBwY250KTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ayhLRVJOX0VSUiAibWFwIHByb2JlIGZhaWxlZCBmb3IgZmxhc2hcbiIpOworCQkJcmV0dXJuIC1FTlhJTzsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cF9tc3BfZmxhc2godm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YobXNwX2ZsYXNoKSAvIHNpemVvZihzdHJ1Y3QgbXRkX2luZm8gKiopOyBpKyspIHsKKwkJZGVsX210ZF9wYXJ0aXRpb25zKG1zcF9mbGFzaFtpXSk7CisJCW1hcF9kZXN0cm95KG1zcF9mbGFzaFtpXSk7CisJCWlvdW5tYXAoKHZvaWQgKiltc3BfbWFwc1tpXS52aXJ0KTsKKworCQkvKiBmcmVlIHRoZSBtZW1vcnkgKi8KKwkJa2ZyZWUobXNwX21hcHNbaV0ubmFtZSk7CisJCWtmcmVlKG1zcF9wYXJ0c1tpXSk7CisJfQorCisJa2ZyZWUobXNwX2ZsYXNoKTsKKwlrZnJlZShtc3BfcGFydHMpOworCWtmcmVlKG1zcF9tYXBzKTsKK30KKworTU9EVUxFX0FVVEhPUigiUE1DLVNpZXJyYSwgSW5jIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk1URCBtYXAgZHJpdmVyIGZvciBQTUMtU2llcnJhIE1TUCBib2FyZHMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX2luaXQoaW5pdF9tc3BfZmxhc2gpOworbW9kdWxlX2V4aXQoY2xlYW51cF9tc3BfZmxhc2gpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9wbWNtc3AtcmFtcm9vdC5jIGIvZHJpdmVycy9tdGQvbWFwcy9wbWNtc3AtcmFtcm9vdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4MDQ5YmMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL210ZC9tYXBzL3BtY21zcC1yYW1yb290LmMKQEAgLTAsMCArMSwxMDUgQEAKKy8qCisgKiBNYXBwaW5nIG9mIHRoZSByb290ZnMgaW4gYSBwaHlzaWNhbCByZWdpb24gb2YgbWVtb3J5CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDcgUE1DLVNpZXJyYSBJbmMuCisgKiBBdXRob3I6IEFuZHJldyBIdWdoZXMsIEFuZHJld19IdWdoZXNAcG1jLXNpZXJyYS5jb20KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVEhJUyAgU09GVFdBUkUgIElTIFBST1ZJREVEICAgYGBBUyAgSVMnJyBBTkQgICBBTlkgIEVYUFJFU1MgT1IgSU1QTElFRAorICogIFdBUlJBTlRJRVMsICAgSU5DTFVESU5HLCBCVVQgTk9UICBMSU1JVEVEICBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTgorICogIE5PICBFVkVOVCAgU0hBTEwgICBUSEUgQVVUSE9SICBCRSAgICBMSUFCTEUgRk9SIEFOWSAgIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiAgTk9UIExJTUlURUQgICBUTywgUFJPQ1VSRU1FTlQgT0YgIFNVQlNUSVRVVEUgR09PRFMgIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiAgVVNFLCBEQVRBLCAgT1IgUFJPRklUUzsgT1IgIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgKiAgQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3Jvb3RfZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9tYXAuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSA8bXNwX3Byb20uaD4KKworc3RhdGljIHN0cnVjdCBtdGRfaW5mbyAqcnJfbXRkOworCitzdHJ1Y3QgbWFwX2luZm8gcnJfbWFwID0geworCS5uYW1lID0gInJhbXJvb3QiLAorCS5iYW5rd2lkdGggPSA0LAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9ycm1hcCh2b2lkKQoreworCXZvaWQgKnJhbXJvb3Rfc3RhcnQ7CisJdW5zaWduZWQgbG9uZyByYW1yb290X3NpemU7CisKKwkvKiBDaGVjayBmb3Igc3VwcG9ydGVkIHJvb3RmcyB0eXBlcyAqLworCWlmIChnZXRfcmFtcm9vdCgmcmFtcm9vdF9zdGFydCwgJnJhbXJvb3Rfc2l6ZSkpIHsKKwkJcnJfbWFwLnBoeXMgPSBDUEhZU0FERFIocmFtcm9vdF9zdGFydCk7CisJCXJyX21hcC5zaXplID0gcmFtcm9vdF9zaXplOworCisJCXByaW50ayhLRVJOX05PVElDRQorCQkJIlBNQyBlbWJlZGRlZCByb290IGRldmljZTogMHglMDhseCBAIDB4JTA4bHhcbiIsCisJCQlycl9tYXAuc2l6ZSwgKHVuc2lnbmVkIGxvbmcpcnJfbWFwLnBoeXMpOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkJImluaXRfcnJtYXA6IG5vIHN1cHBvcnRlZCBlbWJlZGRlZCByb290ZnMgZGV0ZWN0ZWQhXG4iKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwkvKiBNYXAgcm9vdGZzIHRvIEkvTyBzcGFjZSBmb3IgYmxvY2sgZGV2aWNlIGRyaXZlciAqLworCXJyX21hcC52aXJ0ID0gaW9yZW1hcChycl9tYXAucGh5cywgcnJfbWFwLnNpemUpOworCWlmICghcnJfbWFwLnZpcnQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gaW9yZW1hcFxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCXNpbXBsZV9tYXBfaW5pdCgmcnJfbWFwKTsKKworCXJyX210ZCA9IGRvX21hcF9wcm9iZSgibWFwX3JhbSIsICZycl9tYXApOworCWlmIChycl9tdGQpIHsKKwkJcnJfbXRkLT5vd25lciA9IFRISVNfTU9EVUxFOworCisJCWFkZF9tdGRfZGV2aWNlKHJyX210ZCk7CisJCVJPT1RfREVWID0gTUtERVYoTVREX0JMT0NLX01BSk9SLCBycl9tdGQtPmluZGV4KTsKKworCQlyZXR1cm4gMDsKKwl9CisKKwlpb3VubWFwKHJyX21hcC52aXJ0KTsKKwlyZXR1cm4gLUVOWElPOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cF9ycm1hcCh2b2lkKQoreworCWRlbF9tdGRfZGV2aWNlKHJyX210ZCk7CisJbWFwX2Rlc3Ryb3kocnJfbXRkKTsKKworCWlvdW5tYXAocnJfbWFwLnZpcnQpOworCXJyX21hcC52aXJ0ID0gTlVMTDsKK30KKworTU9EVUxFX0FVVEhPUigiUE1DLVNpZXJyYSwgSW5jIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk1URCBtYXAgZHJpdmVyIGZvciBlbWJlZGRlZCBQTUMtU2llcnJhIE1TUCBmaWxlc3lzdGVtIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9pbml0KGluaXRfcnJtYXApOworbW9kdWxlX2V4aXQoY2xlYW51cF9ycm1hcCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tYXBzL3N1bl91Zmxhc2guYyBiL2RyaXZlcnMvbXRkL21hcHMvc3VuX3VmbGFzaC5jCmluZGV4IDRkYjIwNTUuLjAwMWFmN2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL21hcHMvc3VuX3VmbGFzaC5jCisrKyBiL2RyaXZlcnMvbXRkL21hcHMvc3VuX3VmbGFzaC5jCkBAIC0zOSw3ICszOSw3IEBACiAKIHN0YXRpYyBMSVNUX0hFQUQoZGV2aWNlX2xpc3QpOwogc3RydWN0IHVmbGFzaF9kZXYgewotCWNoYXIJCQkqbmFtZTsJLyogZGV2aWNlIG5hbWUgKi8KKwljb25zdCBjaGFyCQkqbmFtZTsJLyogZGV2aWNlIG5hbWUgKi8KIAlzdHJ1Y3QgbWFwX2luZm8gCW1hcDsJLyogbXRkIG1hcCBpbmZvICovCiAJc3RydWN0IG10ZF9pbmZvCQkqbXRkOwkvKiBtdGQgaW5mbyAqLwogfTsKQEAgLTgwLDcgKzgwLDcgQEAKIAogCXVwLT5uYW1lID0gb2ZfZ2V0X3Byb3BlcnR5KGRwLCAibW9kZWwiLCBOVUxMKTsKIAlpZiAodXAtPm5hbWUgJiYgMCA8IHN0cmxlbih1cC0+bmFtZSkpCi0JCXVwLT5tYXAubmFtZSA9IHVwLT5uYW1lOworCQl1cC0+bWFwLm5hbWUgPSAoY2hhciAqKXVwLT5uYW1lOwogCiAJdXAtPm1hcC5waHlzID0gcmVzLT5zdGFydDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbXRkX2Jsa2RldnMuYyBiL2RyaXZlcnMvbXRkL210ZF9ibGtkZXZzLmMKaW5kZXggYjg3OWE2Ni4uNTI0YjgzYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbXRkX2Jsa2RldnMuYworKysgYi9kcml2ZXJzL210ZC9tdGRfYmxrZGV2cy5jCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8bGludXgvaGRyZWcuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAogc3RhdGljIExJU1RfSEVBRChibGt0cmFuc19tYWpvcnMpOwpAQCAtMjgsOSArMjksNyBAQAogZXh0ZXJuIHN0cnVjdCBtdGRfaW5mbyAqbXRkX3RhYmxlW107CiAKIHN0cnVjdCBtdGRfYmxrY29yZV9wcml2IHsKLQlzdHJ1Y3QgY29tcGxldGlvbiB0aHJlYWRfZGVhZDsKLQlpbnQgZXhpdGluZzsKLQl3YWl0X3F1ZXVlX2hlYWRfdCB0aHJlYWRfd3E7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0aHJlYWQ7CiAJc3RydWN0IHJlcXVlc3RfcXVldWUgKnJxOwogCXNwaW5sb2NrX3QgcXVldWVfbG9jazsKIH07CkBAIC04MywzOCArODIsMTkgQEAKIAkvKiB3ZSBtaWdodCBnZXQgaW52b2x2ZWQgd2hlbiBtZW1vcnkgZ2V0cyBsb3csIHNvIHVzZSBQRl9NRU1BTExPQyAqLwogCWN1cnJlbnQtPmZsYWdzIHw9IFBGX01FTUFMTE9DIHwgUEZfTk9GUkVFWkU7CiAKLQlkYWVtb25pemUoIiVzZCIsIHRyLT5uYW1lKTsKLQotCS8qIGRhZW1vbml6ZSgpIGRvZXNuJ3QgZG8gdGhpcyBmb3IgdXMgc2luY2Ugc29tZSBrZXJuZWwgdGhyZWFkcwotCSAgIGFjdHVhbGx5IHdhbnQgdG8gZGVhbCB3aXRoIHNpZ25hbHMuIFdlIGNhbid0IGp1c3QgY2FsbAotCSAgIGV4aXRfc2lnaGFuZCgpIHNpbmNlIHRoYXQnbGwgY2F1c2UgYW4gb29wcyB3aGVuIHdlIGZpbmFsbHkKLQkgICBkbyBleGl0LiAqLwotCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwotCXNpZ2ZpbGxzZXQoJmN1cnJlbnQtPmJsb2NrZWQpOwotCXJlY2FsY19zaWdwZW5kaW5nKCk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKLQogCXNwaW5fbG9ja19pcnEocnEtPnF1ZXVlX2xvY2spOwotCi0Jd2hpbGUgKCF0ci0+YmxrY29yZV9wcml2LT5leGl0aW5nKSB7CisJd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKIAkJc3RydWN0IHJlcXVlc3QgKnJlcTsKIAkJc3RydWN0IG10ZF9ibGt0cmFuc19kZXYgKmRldjsKIAkJaW50IHJlcyA9IDA7Ci0JCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOwogCiAJCXJlcSA9IGVsdl9uZXh0X3JlcXVlc3QocnEpOwogCiAJCWlmICghcmVxKSB7Ci0JCQlhZGRfd2FpdF9xdWV1ZSgmdHItPmJsa2NvcmVfcHJpdi0+dGhyZWFkX3dxLCAmd2FpdCk7CiAJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCiAJCQlzcGluX3VubG9ja19pcnEocnEtPnF1ZXVlX2xvY2spOwotCiAJCQlzY2hlZHVsZSgpOwotCQkJcmVtb3ZlX3dhaXRfcXVldWUoJnRyLT5ibGtjb3JlX3ByaXYtPnRocmVhZF93cSwgJndhaXQpOwotCiAJCQlzcGluX2xvY2tfaXJxKHJxLT5xdWV1ZV9sb2NrKTsKLQogCQkJY29udGludWU7CiAJCX0KIApAQCAtMTMzLDEzICsxMTMsMTMgQEAKIAl9CiAJc3Bpbl91bmxvY2tfaXJxKHJxLT5xdWV1ZV9sb2NrKTsKIAotCWNvbXBsZXRlX2FuZF9leGl0KCZ0ci0+YmxrY29yZV9wcml2LT50aHJlYWRfZGVhZCwgMCk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIG10ZF9ibGt0cmFuc19yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpycSkKIHsKIAlzdHJ1Y3QgbXRkX2Jsa3RyYW5zX29wcyAqdHIgPSBycS0+cXVldWVkYXRhOwotCXdha2VfdXAoJnRyLT5ibGtjb3JlX3ByaXYtPnRocmVhZF93cSk7CisJd2FrZV91cF9wcm9jZXNzKHRyLT5ibGtjb3JlX3ByaXYtPnRocmVhZCk7CiB9CiAKIApAQCAtMzg4LDggKzM2OCw2IEBACiAJCXJldHVybiByZXQ7CiAJfQogCXNwaW5fbG9ja19pbml0KCZ0ci0+YmxrY29yZV9wcml2LT5xdWV1ZV9sb2NrKTsKLQlpbml0X2NvbXBsZXRpb24oJnRyLT5ibGtjb3JlX3ByaXYtPnRocmVhZF9kZWFkKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ0ci0+YmxrY29yZV9wcml2LT50aHJlYWRfd3EpOwogCiAJdHItPmJsa2NvcmVfcHJpdi0+cnEgPSBibGtfaW5pdF9xdWV1ZShtdGRfYmxrdHJhbnNfcmVxdWVzdCwgJnRyLT5ibGtjb3JlX3ByaXYtPnF1ZXVlX2xvY2spOwogCWlmICghdHItPmJsa2NvcmVfcHJpdi0+cnEpIHsKQEAgLTQwMywxMyArMzgxLDE0IEBACiAJYmxrX3F1ZXVlX2hhcmRzZWN0X3NpemUodHItPmJsa2NvcmVfcHJpdi0+cnEsIHRyLT5ibGtzaXplKTsKIAl0ci0+Ymxrc2hpZnQgPSBmZnModHItPmJsa3NpemUpIC0gMTsKIAotCXJldCA9IGtlcm5lbF90aHJlYWQobXRkX2Jsa3RyYW5zX3RocmVhZCwgdHIsIENMT05FX0tFUk5FTCk7Ci0JaWYgKHJldCA8IDApIHsKKwl0ci0+YmxrY29yZV9wcml2LT50aHJlYWQgPSBrdGhyZWFkX3J1bihtdGRfYmxrdHJhbnNfdGhyZWFkLCB0ciwKKwkJCSIlc2QiLCB0ci0+bmFtZSk7CisJaWYgKElTX0VSUih0ci0+YmxrY29yZV9wcml2LT50aHJlYWQpKSB7CiAJCWJsa19jbGVhbnVwX3F1ZXVlKHRyLT5ibGtjb3JlX3ByaXYtPnJxKTsKIAkJdW5yZWdpc3Rlcl9ibGtkZXYodHItPm1ham9yLCB0ci0+bmFtZSk7CiAJCWtmcmVlKHRyLT5ibGtjb3JlX3ByaXYpOwogCQltdXRleF91bmxvY2soJm10ZF90YWJsZV9tdXRleCk7Ci0JCXJldHVybiByZXQ7CisJCXJldHVybiBQVFJfRVJSKHRyLT5ibGtjb3JlX3ByaXYtPnRocmVhZCk7CiAJfQogCiAJSU5JVF9MSVNUX0hFQUQoJnRyLT5kZXZzKTsKQEAgLTQzMiw5ICs0MTEsNyBAQAogCW11dGV4X2xvY2soJm10ZF90YWJsZV9tdXRleCk7CiAKIAkvKiBDbGVhbiB1cCB0aGUga2VybmVsIHRocmVhZCAqLwotCXRyLT5ibGtjb3JlX3ByaXYtPmV4aXRpbmcgPSAxOwotCXdha2VfdXAoJnRyLT5ibGtjb3JlX3ByaXYtPnRocmVhZF93cSk7Ci0Jd2FpdF9mb3JfY29tcGxldGlvbigmdHItPmJsa2NvcmVfcHJpdi0+dGhyZWFkX2RlYWQpOworCWt0aHJlYWRfc3RvcCh0ci0+YmxrY29yZV9wcml2LT50aHJlYWQpOwogCiAJLyogUmVtb3ZlIGl0IGZyb20gdGhlIGxpc3Qgb2YgYWN0aXZlIG1ham9ycyAqLwogCWxpc3RfZGVsKCZ0ci0+bGlzdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tdGRjaGFyLmMgYi9kcml2ZXJzL210ZC9tdGRjaGFyLmMKaW5kZXggMTU5MmVhYy4uOGM4NmI4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbXRkY2hhci5jCisrKyBiL2RyaXZlcnMvbXRkL210ZGNoYXIuYwpAQCAtNTUzLDcgKzU1Myw3IEBACiAJCW9wcy5kYXRidWYgPSBOVUxMOwogCQlvcHMubW9kZSA9IE1URF9PT0JfUExBQ0U7CiAKLQkJaWYgKG9wcy5vb2JvZmZzICYmIG9wcy5sZW4gPiAobXRkLT5vb2JzaXplIC0gb3BzLm9vYm9mZnMpKQorCQlpZiAob3BzLm9vYm9mZnMgJiYgb3BzLm9vYmxlbiA+IChtdGQtPm9vYnNpemUgLSBvcHMub29ib2ZmcykpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAogCQlvcHMub29iYnVmID0ga21hbGxvYyhidWYubGVuZ3RoLCBHRlBfS0VSTkVMKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvS2NvbmZpZyBiL2RyaXZlcnMvbXRkL25hbmQvS2NvbmZpZwppbmRleCAyZDEyZGNkLi5kMDU4NzNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL0tjb25maWcKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9LY29uZmlnCkBAIC0xLDEwICsxLDcgQEAKICMgZHJpdmVycy9tdGQvbmFuZC9LY29uZmlnCiAjICRJZDogS2NvbmZpZyx2IDEuMzUgMjAwNS8xMS8wNyAxMToxNDozMCBnbGVpeG5lciBFeHAgJAogCi1tZW51ICJOQU5EIEZsYXNoIERldmljZSBEcml2ZXJzIgotCWRlcGVuZHMgb24gTVREIT1uCi0KLWNvbmZpZyBNVERfTkFORAorbWVudWNvbmZpZyBNVERfTkFORAogCXRyaXN0YXRlICJOQU5EIERldmljZSBTdXBwb3J0IgogCWRlcGVuZHMgb24gTVRECiAJc2VsZWN0IE1URF9OQU5EX0lEUwpAQCAtMTMsOSArMTAsMTAgQEAKIAkgIGRldmljZXMuIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHNlZQogCSAgPGh0dHA6Ly93d3cubGludXgtbXRkLmluZnJhZGVhZC5vcmcvZG9jL25hbmQuaHRtbD4uCiAKK2lmIE1URF9OQU5ECisKIGNvbmZpZyBNVERfTkFORF9WRVJJRllfV1JJVEUKIAlib29sICJWZXJpZnkgTkFORCBwYWdlIHdyaXRlcyIKLQlkZXBlbmRzIG9uIE1URF9OQU5ECiAJaGVscAogCSAgVGhpcyBhZGRzIGFuIGV4dHJhIGNoZWNrIHdoZW4gZGF0YSBpcyB3cml0dGVuIHRvIHRoZSBmbGFzaC4gVGhlCiAJICBOQU5EIGZsYXNoIGRldmljZSBpbnRlcm5hbGx5IGNoZWNrcyBvbmx5IGJpdHMgdHJhbnNpdGlvbmluZwpAQCAtMjUsNTMgKzIzLDYxIEBACiAKIGNvbmZpZyBNVERfTkFORF9FQ0NfU01DCiAJYm9vbCAiTkFORCBFQ0MgU21hcnQgTWVkaWEgYnl0ZSBvcmRlciIKLQlkZXBlbmRzIG9uIE1URF9OQU5ECiAJZGVmYXVsdCBuCiAJaGVscAogCSAgU29mdHdhcmUgRUNDIGFjY29yZGluZyB0byB0aGUgU21hcnQgTWVkaWEgU3BlY2lmaWNhdGlvbi4KIAkgIFRoZSBvcmlnaW5hbCBMaW51eCBpbXBsZW1lbnRhdGlvbiBoYWQgYnl0ZSAwIGFuZCAxIHN3YXBwZWQuCiAKK2NvbmZpZyBNVERfTkFORF9NVVNFVU1fSURTCisJYm9vbCAiRW5hYmxlIGNoaXAgaWRzIGZvciBvYnNvbGV0ZSBhbmNpZW50IE5BTkQgZGV2aWNlcyIKKwlkZXBlbmRzIG9uIE1URF9OQU5ECisJZGVmYXVsdCBuCisJaGVscAorCSAgRW5hYmxlIHRoaXMgb3B0aW9uIG9ubHkgd2hlbiB5b3VyIGJvYXJkIGhhcyBmaXJzdCBnZW5lcmF0aW9uCisJICBOQU5EIGNoaXBzIChwYWdlIHNpemUgMjU2IGJ5dGUsIGVyYXNlIHNpemUgNC04S2lCKS4gVGhlIElEcworCSAgb2YgdGhlc2UgY2hpcHMgd2VyZSByZXVzZWQgYnkgbGF0ZXIsIGxhcmdlciBjaGlwcy4KKwogY29uZmlnIE1URF9OQU5EX0FVVENQVTEyCiAJdHJpc3RhdGUgIlNtYXJ0TWVkaWFDYXJkIG9uIGF1dHJvbml4IGF1dGNwdTEyIGJvYXJkIgotCWRlcGVuZHMgb24gTVREX05BTkQgJiYgQVJDSF9BVVRDUFUxMgorCWRlcGVuZHMgb24gQVJDSF9BVVRDUFUxMgogCWhlbHAKIAkgIFRoaXMgZW5hYmxlcyB0aGUgZHJpdmVyIGZvciB0aGUgYXV0cm9uaXggYXV0Y3B1MTIgYm9hcmQgdG8KIAkgIGFjY2VzcyB0aGUgU21hcnRNZWRpYUNhcmQuCiAKIGNvbmZpZyBNVERfTkFORF9FREI3MzEyCiAJdHJpc3RhdGUgIlN1cHBvcnQgZm9yIENpcnJ1cyBMb2dpYyBFQkQ3MzEyIGV2YWx1YXRpb24gYm9hcmQiCi0JZGVwZW5kcyBvbiBNVERfTkFORCAmJiBBUkNIX0VEQjczMTIKKwlkZXBlbmRzIG9uIEFSQ0hfRURCNzMxMgogCWhlbHAKIAkgIFRoaXMgZW5hYmxlcyB0aGUgZHJpdmVyIGZvciB0aGUgQ2lycnVzIExvZ2ljIEVCRDczMTIgZXZhbHVhdGlvbgogCSAgYm9hcmQgdG8gYWNjZXNzIHRoZSBvbmJvYXJkIE5BTkQgRmxhc2guCiAKIGNvbmZpZyBNVERfTkFORF9IMTkwMAogCXRyaXN0YXRlICJpUEFRIEgxOTAwIGZsYXNoIgotCWRlcGVuZHMgb24gTVREX05BTkQgJiYgQVJDSF9QWEEgJiYgTVREX1BBUlRJVElPTlMKKwlkZXBlbmRzIG9uIEFSQ0hfUFhBICYmIE1URF9QQVJUSVRJT05TCiAJaGVscAogCSAgVGhpcyBlbmFibGVzIHRoZSBkcml2ZXIgZm9yIHRoZSBpUEFRIGgxOTAwIGZsYXNoLgogCiBjb25maWcgTVREX05BTkRfU1BJQQogCXRyaXN0YXRlICJOQU5EIEZsYXNoIGRldmljZSBvbiBTUElBIGJvYXJkIgotCWRlcGVuZHMgb24gQVJDSF9QNzIwVCAmJiBNVERfTkFORAorCWRlcGVuZHMgb24gQVJDSF9QNzIwVAogCWhlbHAKIAkgIElmIHlvdSBoYWQgdG8gYXNrLCB5b3UgZG9uJ3QgaGF2ZSBvbmUuIFNheSAnTicuCiAKIGNvbmZpZyBNVERfTkFORF9BTVNfREVMVEEKIAl0cmlzdGF0ZSAiTkFORCBGbGFzaCBkZXZpY2Ugb24gQW1zdHJhZCBFMyIKLQlkZXBlbmRzIG9uIE1BQ0hfQU1TX0RFTFRBICYmIE1URF9OQU5ECisJZGVwZW5kcyBvbiBNQUNIX0FNU19ERUxUQQogCWhlbHAKIAkgIFN1cHBvcnQgZm9yIE5BTkQgZmxhc2ggb24gQW1zdHJhZCBFMyAoRGVsdGEpLgogCiBjb25maWcgTVREX05BTkRfVE9UTwogCXRyaXN0YXRlICJOQU5EIEZsYXNoIGRldmljZSBvbiBUT1RPIGJvYXJkIgotCWRlcGVuZHMgb24gQVJDSF9PTUFQICYmIE1URF9OQU5EICYmIEJST0tFTgorCWRlcGVuZHMgb24gQVJDSF9PTUFQICYmIEJST0tFTgogCWhlbHAKIAkgIFN1cHBvcnQgZm9yIE5BTkQgZmxhc2ggb24gVGV4YXMgSW5zdHJ1bWVudHMgVG90byBwbGF0Zm9ybS4KIAogY29uZmlnIE1URF9OQU5EX1RTNzI1MAogCXRyaXN0YXRlICJOQU5EIEZsYXNoIGRldmljZSBvbiBUUy03MjUwIGJvYXJkIgotCWRlcGVuZHMgb24gTUFDSF9UUzcyWFggJiYgTVREX05BTkQKKwlkZXBlbmRzIG9uIE1BQ0hfVFM3MlhYCiAJaGVscAogCSAgU3VwcG9ydCBmb3IgTkFORCBmbGFzaCBvbiBUZWNobm9sb2dpYyBTeXN0ZW1zIFRTLTcyNTAgcGxhdGZvcm0uCiAKQEAgLTgwLDE0ICs4NiwxNCBAQAogCiBjb25maWcgTVREX05BTkRfQVUxNTUwCiAJdHJpc3RhdGUgIkF1MTU1MC8xMjAwIE5BTkQgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIChTT0NfQVUxMjAwIHx8IFNPQ19BVTE1NTApICYmIE1URF9OQU5ECisJZGVwZW5kcyBvbiBTT0NfQVUxMjAwIHx8IFNPQ19BVTE1NTAKIAloZWxwCiAJICBUaGlzIGVuYWJsZXMgdGhlIGRyaXZlciBmb3IgdGhlIE5BTkQgZmxhc2ggY29udHJvbGxlciBvbiB0aGUKIAkgIEFNRC9BbGNoZW15IDE1NTAgU09DLgogCiBjb25maWcgTVREX05BTkRfUlRDX0ZST000CiAJdHJpc3RhdGUgIlJlbmVzYXMgRmxhc2ggUk9NIDQtc2xvdCBpbnRlcmZhY2UgYm9hcmQgKEZST01fQk9BUkQ0KSIKLQlkZXBlbmRzIG9uIE1URF9OQU5EICYmIFNIX1NPTFVUSU9OX0VOR0lORQorCWRlcGVuZHMgb24gU0hfU09MVVRJT05fRU5HSU5FCiAJc2VsZWN0IFJFRURfU09MT01PTgogCXNlbGVjdCBSRUVEX1NPTE9NT05fREVDOAogCXNlbGVjdCBCSVRSRVZFUlNFCkBAIC05NywxMyArMTAzLDEzIEBACiAKIGNvbmZpZyBNVERfTkFORF9QUENIQU1FTEVPTkVWQgogCXRyaXN0YXRlICJOQU5EIEZsYXNoIGRldmljZSBvbiBQUENoYW1lbGVvbkVWQiBib2FyZCIKLQlkZXBlbmRzIG9uIFBQQ0hBTUVMRU9ORVZCICYmIE1URF9OQU5EICYmIEJST0tFTgorCWRlcGVuZHMgb24gUFBDSEFNRUxFT05FVkIgJiYgQlJPS0VOCiAJaGVscAogCSAgVGhpcyBlbmFibGVzIHRoZSBOQU5EIGZsYXNoIGRyaXZlciBvbiB0aGUgUFBDaGFtZWxlb24gRVZCIEJvYXJkLgogCiBjb25maWcgTVREX05BTkRfUzNDMjQxMAogCXRyaXN0YXRlICJOQU5EIEZsYXNoIHN1cHBvcnQgZm9yIFMzQzI0MTAvUzNDMjQ0MCBTb0MiCi0JZGVwZW5kcyBvbiBBUkNIX1MzQzI0MTAgJiYgTVREX05BTkQKKwlkZXBlbmRzIG9uIEFSQ0hfUzNDMjQxMAogCWhlbHAKIAkgIFRoaXMgZW5hYmxlcyB0aGUgTkFORCBmbGFzaCBjb250cm9sbGVyIG9uIHRoZSBTM0MyNDEwIGFuZCBTM0MyNDQwCiAJICBTb0NzCkBAIC0xMjgsNyArMTM0LDcgQEAKIAogY29uZmlnIE1URF9OQU5EX05ERkMKIAl0cmlzdGF0ZSAiTkRGQyBOYW5EIEZsYXNoIENvbnRyb2xsZXIiCi0JZGVwZW5kcyBvbiBNVERfTkFORCAmJiA0NHgKKwlkZXBlbmRzIG9uIDQ0eAogCXNlbGVjdCBNVERfTkFORF9FQ0NfU01DCiAJaGVscAogCSBOREZDIE5hbmQgRmxhc2ggQ29udHJvbGxlcnMgYXJlIGludGVncmF0ZWQgaW4gRVA0NHggU29DcwpAQCAtMTQ1LDcgKzE1MSw3IEBACiAKIGNvbmZpZyBNVERfTkFORF9ESVNLT05DSElQCiAJdHJpc3RhdGUgIkRpc2tPbkNoaXAgMjAwMCwgTWlsbGVubml1bSBhbmQgTWlsbGVubml1bSBQbHVzIChOQU5EIHJlaW1wbGVtZW50YXRpb24pIChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gTVREX05BTkQgJiYgRVhQRVJJTUVOVEFMCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKIAlzZWxlY3QgUkVFRF9TT0xPTU9OCiAJc2VsZWN0IFJFRURfU09MT01PTl9ERUMxNgogCWhlbHAKQEAgLTIxNSwxMSArMjIxLDExIEBACiAKIGNvbmZpZyBNVERfTkFORF9TSEFSUFNMCiAJdHJpc3RhdGUgIlN1cHBvcnQgZm9yIE5BTkQgRmxhc2ggb24gU2hhcnAgU0wgU2VyaWVzIChDN3h4ICsgb3RoZXJzKSIKLQlkZXBlbmRzIG9uIE1URF9OQU5EICYmIEFSQ0hfUFhBCisJZGVwZW5kcyBvbiBBUkNIX1BYQQogCiBjb25maWcgTVREX05BTkRfQkFTTEVSX0VYQ0lURQogCXRyaXN0YXRlICAiU3VwcG9ydCBmb3IgTkFORCBGbGFzaCBvbiBCYXNsZXIgZVhjaXRlIgotCWRlcGVuZHMgb24gTVREX05BTkQgJiYgQkFTTEVSX0VYQ0lURQorCWRlcGVuZHMgb24gQkFTTEVSX0VYQ0lURQogCWhlbHAKICAgICAgICAgICBUaGlzIGVuYWJsZXMgdGhlIGRyaXZlciBmb3IgdGhlIE5BTkQgZmxhc2ggZGV2aWNlIGZvdW5kIG9uIHRoZQogICAgICAgICAgIEJhc2xlciBlWGNpdGUgU21hcnQgQ2FtZXJhLiBJZiBidWlsdCBhcyBhIG1vZHVsZSwgdGhlIGRyaXZlcgpAQCAtMjI3LDE0ICsyMzMsMTQgQEAKIAogY29uZmlnIE1URF9OQU5EX0NBRkUKICAgICAgICB0cmlzdGF0ZSAiTkFORCBzdXBwb3J0IGZvciBPTFBDIENBRsOJIGNoaXAiCi0gICAgICAgZGVwZW5kcyBvbiBNVERfTkFORCAmJiBQQ0kKKyAgICAgICBkZXBlbmRzIG9uIFBDSQogICAgICAgIGhlbHAKIAkgVXNlIE5BTkQgZmxhc2ggYXR0YWNoZWQgdG8gdGhlIENBRsOJIGNoaXAgZGVzaWduZWQgZm9yIHRoZSAkMTAwCiAJIGxhcHRvcC4KIAogY29uZmlnIE1URF9OQU5EX0NTNTUzWAogCXRyaXN0YXRlICJOQU5EIHN1cHBvcnQgZm9yIENTNTUzNS9DUzU1MzYgKEFNRCBHZW9kZSBjb21wYW5pb24gY2hpcCkiCi0JZGVwZW5kcyBvbiBNVERfTkFORCAmJiBYODZfMzIgJiYgKFg4Nl9QQyB8fCBYODZfR0VORVJJQ0FSQ0gpCisJZGVwZW5kcyBvbiBYODZfMzIgJiYgKFg4Nl9QQyB8fCBYODZfR0VORVJJQ0FSQ0gpCiAJaGVscAogCSAgVGhlIENTNTUzeCBjb21wYW5pb24gY2hpcHMgZm9yIHRoZSBBTUQgR2VvZGUgcHJvY2Vzc29yCiAJICBpbmNsdWRlIE5BTkQgZmxhc2ggY29udHJvbGxlcnMgd2l0aCBidWlsdC1pbiBoYXJkd2FyZSBFQ0MKQEAgLTI0NywxNiArMjUzLDIxIEBACiAKIGNvbmZpZyBNVERfTkFORF9BVDkxCiAJYm9vbCAiU3VwcG9ydCBmb3IgTkFORCBGbGFzaCAvIFNtYXJ0TWVkaWEgb24gQVQ5MSIKLQlkZXBlbmRzIG9uIE1URF9OQU5EICYmIEFSQ0hfQVQ5MQorCWRlcGVuZHMgb24gQVJDSF9BVDkxCiAJaGVscAogCSAgRW5hYmxlcyBzdXBwb3J0IGZvciBOQU5EIEZsYXNoIC8gU21hcnQgTWVkaWEgQ2FyZCBpbnRlcmZhY2UKIAkgIG9uIEF0bWVsIEFUOTEgcHJvY2Vzc29ycy4KIAorY29uZmlnIE1URF9OQU5EX0NNX1gyNzAKKwl0cmlzdGF0ZSAiU3VwcG9ydCBmb3IgTkFORCBGbGFzaCBvbiBDTS1YMjcwIG1vZHVsZXMiCisJZGVwZW5kcyBvbiBNVERfTkFORCAmJiBNQUNIX0FSTUNPUkUKKworCiBjb25maWcgTVREX05BTkRfTkFORFNJTQogCXRyaXN0YXRlICJTdXBwb3J0IGZvciBOQU5EIEZsYXNoIFNpbXVsYXRvciIKLQlkZXBlbmRzIG9uIE1URF9OQU5EICYmIE1URF9QQVJUSVRJT05TCisJZGVwZW5kcyBvbiBNVERfUEFSVElUSU9OUwogCWhlbHAKIAkgIFRoZSBzaW11bGF0b3IgbWF5IHNpbXVsYXRlIHZhcmlvdXMgTkFORCBmbGFzaCBjaGlwcyBmb3IgdGhlCiAJICBNVEQgbmFuZCBsYXllci4KIAotZW5kbWVudQorZW5kaWYgIyBNVERfTkFORApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9NYWtlZmlsZSBiL2RyaXZlcnMvbXRkL25hbmQvTWFrZWZpbGUKaW5kZXggODBmMWRmYy4uNjg3MjAzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbmFuZC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL210ZC9uYW5kL01ha2VmaWxlCkBAIC0yNCw2ICsyNCw3IEBACiBvYmotJChDT05GSUdfTVREX05BTkRfQ1M1NTNYKQkJKz0gY3M1NTN4X25hbmQubwogb2JqLSQoQ09ORklHX01URF9OQU5EX05ERkMpCQkrPSBuZGZjLm8KIG9iai0kKENPTkZJR19NVERfTkFORF9BVDkxKQkJKz0gYXQ5MV9uYW5kLm8KK29iai0kKENPTkZJR19NVERfTkFORF9DTV9YMjcwKQkJKz0gY214MjcwX25hbmQubwogb2JqLSQoQ09ORklHX01URF9OQU5EX0JBU0xFUl9FWENJVEUpCSs9IGV4Y2l0ZV9uYW5kZmxhc2gubwogCiBuYW5kLW9ianMgOj0gbmFuZF9iYXNlLm8gbmFuZF9iYnQubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9jYWZlLmMgYi9kcml2ZXJzL210ZC9uYW5kL2NhZmUuYwppbmRleCBmZDZiYjNlLi5jMzI4YTc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL2NhZmUuYworKysgYi9kcml2ZXJzL210ZC9uYW5kL2NhZmUuYwpAQCAtNTMwLDcgKzUzMCw2IEBACiB7CiAJc3RydWN0IG10ZF9pbmZvICptdGQ7CiAJc3RydWN0IGNhZmVfcHJpdiAqY2FmZTsKLQl1aW50MzJfdCB0aW1pbmcxLCB0aW1pbmcyLCB0aW1pbmczOwogCXVpbnQzMl90IGN0cmw7CiAJaW50IGVyciA9IDA7CiAKQEAgLTU4NywyMSArNTg2LDE5IEBACiAJfQogCiAJaWYgKG51bXRpbWluZ3MgPT0gMykgewotCQl0aW1pbmcxID0gdGltaW5nWzBdOwotCQl0aW1pbmcyID0gdGltaW5nWzFdOwotCQl0aW1pbmczID0gdGltaW5nWzJdOwogCQljYWZlX2Rldl9kYmcoJmNhZmUtPnBkZXYtPmRldiwgIlVzaW5nIHByb3ZpZGVkIHRpbWluZ3MgKCUwOHggJTA4eCAlMDh4KVxuIiwKLQkJCSAgICAgdGltaW5nMSwgdGltaW5nMiwgdGltaW5nMyk7CisJCQkgICAgIHRpbWluZ1swXSwgdGltaW5nWzFdLCB0aW1pbmdbMl0pOwogCX0gZWxzZSB7Ci0JCXRpbWluZzEgPSBjYWZlX3JlYWRsKGNhZmUsIE5BTkRfVElNSU5HMSk7Ci0JCXRpbWluZzIgPSBjYWZlX3JlYWRsKGNhZmUsIE5BTkRfVElNSU5HMik7Ci0JCXRpbWluZzMgPSBjYWZlX3JlYWRsKGNhZmUsIE5BTkRfVElNSU5HMyk7CisJCXRpbWluZ1swXSA9IGNhZmVfcmVhZGwoY2FmZSwgTkFORF9USU1JTkcxKTsKKwkJdGltaW5nWzFdID0gY2FmZV9yZWFkbChjYWZlLCBOQU5EX1RJTUlORzIpOworCQl0aW1pbmdbMl0gPSBjYWZlX3JlYWRsKGNhZmUsIE5BTkRfVElNSU5HMyk7CiAKLQkJaWYgKHRpbWluZzEgfCB0aW1pbmcyIHwgdGltaW5nMykgewotCQkJY2FmZV9kZXZfZGJnKCZjYWZlLT5wZGV2LT5kZXYsICJUaW1pbmcgcmVnaXN0ZXJzIGFscmVhZHkgc2V0ICglMDh4ICUwOHggJTA4eClcbiIsIHRpbWluZzEsIHRpbWluZzIsIHRpbWluZzMpOworCQlpZiAodGltaW5nWzBdIHwgdGltaW5nWzFdIHwgdGltaW5nWzJdKSB7CisJCQljYWZlX2Rldl9kYmcoJmNhZmUtPnBkZXYtPmRldiwgIlRpbWluZyByZWdpc3RlcnMgYWxyZWFkeSBzZXQgKCUwOHggJTA4eCAlMDh4KVxuIiwKKwkJCQkgICAgIHRpbWluZ1swXSwgdGltaW5nWzFdLCB0aW1pbmdbMl0pOwogCQl9IGVsc2UgewogCQkJZGV2X3dhcm4oJmNhZmUtPnBkZXYtPmRldiwgIlRpbWluZyByZWdpc3RlcnMgdW5zZXQ7IHVzaW5nIG1vc3QgY29uc2VydmF0aXZlIGRlZmF1bHRzXG4iKTsKLQkJCXRpbWluZzEgPSB0aW1pbmcyID0gdGltaW5nMyA9IDB4ZmZmZmZmZmY7CisJCQl0aW1pbmdbMF0gPSB0aW1pbmdbMV0gPSB0aW1pbmdbMl0gPSAweGZmZmZmZmZmOwogCQl9CiAJfQogCkBAIC02MDksOSArNjA2LDkgQEAKIAljYWZlX3dyaXRlbChjYWZlLCAxLCBOQU5EX1JFU0VUKTsKIAljYWZlX3dyaXRlbChjYWZlLCAwLCBOQU5EX1JFU0VUKTsKIAotCWNhZmVfd3JpdGVsKGNhZmUsIHRpbWluZzEsIE5BTkRfVElNSU5HMSk7Ci0JY2FmZV93cml0ZWwoY2FmZSwgdGltaW5nMiwgTkFORF9USU1JTkcyKTsKLQljYWZlX3dyaXRlbChjYWZlLCB0aW1pbmczLCBOQU5EX1RJTUlORzMpOworCWNhZmVfd3JpdGVsKGNhZmUsIHRpbWluZ1swXSwgTkFORF9USU1JTkcxKTsKKwljYWZlX3dyaXRlbChjYWZlLCB0aW1pbmdbMV0sIE5BTkRfVElNSU5HMik7CisJY2FmZV93cml0ZWwoY2FmZSwgdGltaW5nWzJdLCBOQU5EX1RJTUlORzMpOwogCiAJY2FmZV93cml0ZWwoY2FmZSwgMHhmZmZmZmZmZiwgTkFORF9JUlFfTUFTSyk7CiAJZXJyID0gcmVxdWVzdF9pcnEocGRldi0+aXJxLCAmY2FmZV9uYW5kX2ludGVycnVwdCwgSVJRRl9TSEFSRUQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL2NteDI3MF9uYW5kLmMgYi9kcml2ZXJzL210ZC9uYW5kL2NteDI3MF9uYW5kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I2NjNlZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvY214MjcwX25hbmQuYwpAQCAtMCwwICsxLDI2NyBAQAorLyoKKyAqICBsaW51eC9kcml2ZXJzL210ZC9uYW5kL2NteDI3MC1uYW5kLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA2IENvbXB1bGFiLCBMdGQuCisgKiAgTWlrZSBSYXBvcG9ydCA8bWlrZUBjb21wdWxhYi5jby5pbD4KKyAqCisgKiAgRGVyaXZlZCBmcm9tIGRyaXZlcnMvbXRkL25hbmQvaDE5MTAuYworICogICAgICAgQ29weXJpZ2h0IChDKSAyMDAyIE1hcml1cyBHcsO2Z2VyIChtYWdAc3lzZ28uZGUpCisgKiAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDEgVGhvbWFzIEdsZWl4bmVyIChnbGVpeG5lckBhdXRyb25peC5kZSkKKyAqCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiAgT3ZlcnZpZXc6CisgKiAgIFRoaXMgaXMgYSBkZXZpY2UgZHJpdmVyIGZvciB0aGUgTkFORCBmbGFzaCBkZXZpY2UgZm91bmQgb24gdGhlCisgKiAgIENNLVgyNzAgYm9hcmQuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L210ZC9uYW5kLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvcHhhLXJlZ3MuaD4KKworI2RlZmluZSBHUElPX05BTkRfQ1MJKDExKQorI2RlZmluZSBHUElPX05BTkRfUkIJKDg5KQorCisvKiBUaGlzIG1hY3JvIG5lZWRlZCB0byBlbnN1cmUgaW4tb3JkZXIgb3BlcmF0aW9uIG9mIEdQSU8gYW5kIGxvY2FsCisgKiBidXMuIFdpdGhvdXQgYm90aCBhc20gY29tbWFuZCBhbmQgZHVtbXkgdW5jYWNoZWQgcmVhZCB0aGVyZSdyZQorICogc3RhdGVzIHdoZW4gTkFORCBhY2Nlc3MgaXMgYnJva2VuLiBJJ3ZlIGxvb2tlZCBmb3Igc3VjaCBtYWNybyhzKSBpbgorICogaW5jbHVkZS9hc20tYXJtIGJ1dCBmb3VuZCBub3RoaW5nIGFwcHJvcHRpYXRlLgorICogZG1hY19jbGVhbl9yYW5nZSBpcyBjbG9zZSwgYnV0IGlzIG1ha2VzIGNhY2hlIGludmFsaWRhdGlvbgorICogdW5uZWNlc3NhcnkgaGVyZSBhbmQgaXQgY2Fubm90IGJlIHVzZWQgaW4gbW9kdWxlCisgKi8KKyNkZWZpbmUgRFJBSU5fV0IoKSBcCisJZG8geyBcCisJCXVuc2lnbmVkIGNoYXIgZHVtbXk7IFwKKwkJYXNtIHZvbGF0aWxlICgibWNyIHAxNSwgMCwgcjAsIGM3LCBjMTAsIDQiOjo6InIwIik7IFwKKwkJZHVtbXk9KigodW5zaWduZWQgY2hhciopVU5DQUNIRURfQUREUik7IFwKKwl9IHdoaWxlKDApCisKKy8qIE1URCBzdHJ1Y3R1cmUgZm9yIENNLVgyNzAgYm9hcmQgKi8KK3N0YXRpYyBzdHJ1Y3QgbXRkX2luZm8gKmNteDI3MF9uYW5kX210ZDsKKworLyogcmVtYXBlZCBJTyBhZGRyZXNzIG9mIHRoZSBkZXZpY2UgKi8KK3N0YXRpYyB2b2lkIF9faW9tZW0gKmNteDI3MF9uYW5kX2lvOworCisvKgorICogRGVmaW5lIHN0YXRpYyBwYXJ0aXRpb25zIGZvciBmbGFzaCBkZXZpY2UKKyAqLworc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIHBhcnRpdGlvbl9pbmZvW10gPSB7CisJWzBdID0geworCQkubmFtZQk9ICJjbXgyNzAtMCIsCisJCS5vZmZzZXQJPSAwLAorCQkuc2l6ZQk9IE1URFBBUlRfU0laX0ZVTEwKKwl9Cit9OworI2RlZmluZSBOVU1fUEFSVElUSU9OUyAoQVJSQVlfU0laRShwYXJ0aXRpb25faW5mbykpCisKK2NvbnN0IGNoYXIgKnBhcnRfcHJvYmVzW10gPSB7ICJjbWRsaW5lcGFydCIsIE5VTEwgfTsKKworc3RhdGljIHVfY2hhciBjbXgyNzBfcmVhZF9ieXRlKHN0cnVjdCBtdGRfaW5mbyAqbXRkKQoreworCXN0cnVjdCBuYW5kX2NoaXAgKnRoaXMgPSBtdGQtPnByaXY7CisKKwlyZXR1cm4gKHJlYWRsKHRoaXMtPklPX0FERFJfUikgPj4gMTYpOworfQorCitzdGF0aWMgdm9pZCBjbXgyNzBfd3JpdGVfYnVmKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBjb25zdCB1X2NoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzID0gbXRkLT5wcml2OworCisJZm9yIChpPTA7IGk8bGVuOyBpKyspCisJCXdyaXRlbCgoKmJ1ZisrIDw8IDE2KSwgdGhpcy0+SU9fQUREUl9XKTsKK30KKworc3RhdGljIHZvaWQgY214MjcwX3JlYWRfYnVmKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCB1X2NoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzID0gbXRkLT5wcml2OworCisJZm9yIChpPTA7IGk8bGVuOyBpKyspCisJCSpidWYrKyA9IHJlYWRsKHRoaXMtPklPX0FERFJfUikgPj4gMTY7Cit9CisKK3N0YXRpYyBpbnQgY214MjcwX3ZlcmlmeV9idWYoc3RydWN0IG10ZF9pbmZvICptdGQsIGNvbnN0IHVfY2hhciAqYnVmLCBpbnQgbGVuKQoreworCWludCBpOworCXN0cnVjdCBuYW5kX2NoaXAgKnRoaXMgPSBtdGQtPnByaXY7CisKKwlmb3IgKGk9MDsgaTxsZW47IGkrKykKKwkJaWYgKGJ1ZltpXSAhPSAodV9jaGFyKShyZWFkbCh0aGlzLT5JT19BRERSX1IpID4+IDE2KSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBuYW5kX2NzX29uKHZvaWQpCit7CisJR1BDUihHUElPX05BTkRfQ1MpID0gR1BJT19iaXQoR1BJT19OQU5EX0NTKTsKK30KKworc3RhdGljIHZvaWQgbmFuZF9jc19vZmYodm9pZCkKK3sKKwlEUkFJTl9XQigpOworCisJR1BTUihHUElPX05BTkRfQ1MpID0gR1BJT19iaXQoR1BJT19OQU5EX0NTKTsKK30KKworLyoKKyAqCWhhcmR3YXJlIHNwZWNpZmljIGFjY2VzcyB0byBjb250cm9sLWxpbmVzCisgKi8KK3N0YXRpYyB2b2lkIGNteDI3MF9od2NvbnRyb2woc3RydWN0IG10ZF9pbmZvICptdGQsIGludCBkYXQsCisJCQkgICAgIHVuc2lnbmVkIGludCBjdHJsKQoreworCXN0cnVjdCBuYW5kX2NoaXAqIHRoaXMgPSBtdGQtPnByaXY7CisJdW5zaWduZWQgaW50IG5hbmRhZGRyID0gKHVuc2lnbmVkIGludCl0aGlzLT5JT19BRERSX1c7CisKKwlEUkFJTl9XQigpOworCisJaWYgKGN0cmwgJiBOQU5EX0NUUkxfQ0hBTkdFKSB7CisJCWlmICggY3RybCAmIE5BTkRfQUxFICkKKwkJCW5hbmRhZGRyIHw9ICAoMSA8PCAzKTsKKwkJZWxzZQorCQkJbmFuZGFkZHIgJj0gfigxIDw8IDMpOworCQlpZiAoIGN0cmwgJiBOQU5EX0NMRSApCisJCQluYW5kYWRkciB8PSAgKDEgPDwgMik7CisJCWVsc2UKKwkJCW5hbmRhZGRyICY9IH4oMSA8PCAyKTsKKwkJaWYgKCBjdHJsICYgTkFORF9OQ0UgKQorCQkJbmFuZF9jc19vbigpOworCQllbHNlCisJCQluYW5kX2NzX29mZigpOworCX0KKworCURSQUlOX1dCKCk7CisJdGhpcy0+SU9fQUREUl9XID0gKHZvaWQgX19pb21lbSopbmFuZGFkZHI7CisJaWYgKGRhdCAhPSBOQU5EX0NNRF9OT05FKQorCQl3cml0ZWwoKGRhdCA8PCAxNiksIHRoaXMtPklPX0FERFJfVyk7CisKKwlEUkFJTl9XQigpOworfQorCisvKgorICoJcmVhZCBkZXZpY2UgcmVhZHkgcGluCisgKi8KK3N0YXRpYyBpbnQgY214MjcwX2RldmljZV9yZWFkeShzdHJ1Y3QgbXRkX2luZm8gKm10ZCkKK3sKKwlEUkFJTl9XQigpOworCisJcmV0dXJuIChHUExSKEdQSU9fTkFORF9SQikgJiBHUElPX2JpdChHUElPX05BTkRfUkIpKTsKK30KKworLyoKKyAqIE1haW4gaW5pdGlhbGl6YXRpb24gcm91dGluZQorICovCitzdGF0aWMgaW50IGNteDI3MF9pbml0KHZvaWQpCit7CisJc3RydWN0IG5hbmRfY2hpcCAqdGhpczsKKwljb25zdCBjaGFyICpwYXJ0X3R5cGU7CisJc3RydWN0IG10ZF9wYXJ0aXRpb24gKm10ZF9wYXJ0czsKKwlpbnQgbXRkX3BhcnRzX25iID0gMDsKKwlpbnQgcmV0OworCisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBNVEQgZGV2aWNlIHN0cnVjdHVyZSBhbmQgcHJpdmF0ZSBkYXRhICovCisJY214MjcwX25hbmRfbXRkID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG10ZF9pbmZvKSArCisJCQkJICBzaXplb2Yoc3RydWN0IG5hbmRfY2hpcCksCisJCQkJICBHRlBfS0VSTkVMKTsKKwlpZiAoIWNteDI3MF9uYW5kX210ZCkgeworCQlwcmludGsoIlVuYWJsZSB0byBhbGxvY2F0ZSBDTS1YMjcwIE5BTkQgTVREIGRldmljZSBzdHJ1Y3R1cmUuXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJY214MjcwX25hbmRfaW8gPSBpb3JlbWFwKFBYQV9DUzFfUEhZUywgMTIpOworCWlmICghY214MjcwX25hbmRfaW8pIHsKKwkJcHJpbnRrKCJVbmFibGUgdG8gaW9yZW1hcCBOQU5EIGRldmljZVxuIik7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyMTsKKwl9CisKKwkvKiBHZXQgcG9pbnRlciB0byBwcml2YXRlIGRhdGEgKi8KKwl0aGlzID0gKHN0cnVjdCBuYW5kX2NoaXAgKikoJmNteDI3MF9uYW5kX210ZFsxXSk7CisKKwkvKiBMaW5rIHRoZSBwcml2YXRlIGRhdGEgd2l0aCB0aGUgTVREIHN0cnVjdHVyZSAqLworCWNteDI3MF9uYW5kX210ZC0+b3duZXIgPSBUSElTX01PRFVMRTsKKwljbXgyNzBfbmFuZF9tdGQtPnByaXYgPSB0aGlzOworCisJLyogaW5zZXJ0IGNhbGxiYWNrcyAqLworCXRoaXMtPklPX0FERFJfUiA9IGNteDI3MF9uYW5kX2lvOworCXRoaXMtPklPX0FERFJfVyA9IGNteDI3MF9uYW5kX2lvOworCXRoaXMtPmNtZF9jdHJsID0gY214MjcwX2h3Y29udHJvbDsKKwl0aGlzLT5kZXZfcmVhZHkgPSBjbXgyNzBfZGV2aWNlX3JlYWR5OworCisJLyogMTUgdXMgY29tbWFuZCBkZWxheSB0aW1lICovCisJdGhpcy0+Y2hpcF9kZWxheSA9IDIwOworCXRoaXMtPmVjYy5tb2RlID0gTkFORF9FQ0NfU09GVDsKKworCS8qIHJlYWQvd3JpdGUgZnVuY3Rpb25zICovCisJdGhpcy0+cmVhZF9ieXRlID0gY214MjcwX3JlYWRfYnl0ZTsKKwl0aGlzLT5yZWFkX2J1ZiA9IGNteDI3MF9yZWFkX2J1ZjsKKwl0aGlzLT53cml0ZV9idWYgPSBjbXgyNzBfd3JpdGVfYnVmOworCXRoaXMtPnZlcmlmeV9idWYgPSBjbXgyNzBfdmVyaWZ5X2J1ZjsKKworCS8qIFNjYW4gdG8gZmluZCBleGlzdGVuY2Ugb2YgdGhlIGRldmljZSAqLworCWlmIChuYW5kX3NjYW4gKGNteDI3MF9uYW5kX210ZCwgMSkpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJObyBOQU5EIGRldmljZVxuIik7CisJCXJldCA9IC1FTlhJTzsKKwkJZ290byBlcnIyOworCX0KKworI2lmZGVmIENPTkZJR19NVERfQ01ETElORV9QQVJUUworCW10ZF9wYXJ0c19uYiA9IHBhcnNlX210ZF9wYXJ0aXRpb25zKGNteDI3MF9uYW5kX210ZCwgcGFydF9wcm9iZXMsCisJCQkJCSAgICAmbXRkX3BhcnRzLCAwKTsKKwlpZiAobXRkX3BhcnRzX25iID4gMCkKKwkJcGFydF90eXBlID0gImNvbW1hbmQgbGluZSI7CisJZWxzZQorCQltdGRfcGFydHNfbmIgPSAwOworI2VuZGlmCisJaWYgKCFtdGRfcGFydHNfbmIpIHsKKwkJbXRkX3BhcnRzID0gcGFydGl0aW9uX2luZm87CisJCW10ZF9wYXJ0c19uYiA9IE5VTV9QQVJUSVRJT05TOworCQlwYXJ0X3R5cGUgPSAic3RhdGljIjsKKwl9CisKKwkvKiBSZWdpc3RlciB0aGUgcGFydGl0aW9ucyAqLworCXByaW50ayhLRVJOX05PVElDRSAiVXNpbmcgJXMgcGFydGl0aW9uIGRlZmluaXRpb25cbiIsIHBhcnRfdHlwZSk7CisJcmV0ID0gYWRkX210ZF9wYXJ0aXRpb25zKGNteDI3MF9uYW5kX210ZCwgbXRkX3BhcnRzLCBtdGRfcGFydHNfbmIpOworCWlmIChyZXQpCisJCWdvdG8gZXJyMjsKKworCS8qIFJldHVybiBoYXBweSAqLworCXJldHVybiAwOworCitlcnIyOgorCWlvdW5tYXAoY214MjcwX25hbmRfaW8pOworZXJyMToKKwlrZnJlZShjbXgyNzBfbmFuZF9tdGQpOworCisJcmV0dXJuIHJldDsKKworfQorbW9kdWxlX2luaXQoY214MjcwX2luaXQpOworCisvKgorICogQ2xlYW4gdXAgcm91dGluZQorICovCitzdGF0aWMgdm9pZCBjbXgyNzBfY2xlYW51cCh2b2lkKQoreworCS8qIFJlbGVhc2UgcmVzb3VyY2VzLCB1bnJlZ2lzdGVyIGRldmljZSAqLworCW5hbmRfcmVsZWFzZShjbXgyNzBfbmFuZF9tdGQpOworCisJaW91bm1hcChjbXgyNzBfbmFuZF9pbyk7CisKKwkvKiBGcmVlIHRoZSBNVEQgZGV2aWNlIHN0cnVjdHVyZSAqLworCWtmcmVlIChjbXgyNzBfbmFuZF9tdGQpOworfQorbW9kdWxlX2V4aXQoY214MjcwX2NsZWFudXApOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJNaWtlIFJhcG9wb3J0IDxtaWtlQGNvbXB1bGFiLmNvLmlsPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJOQU5EIGZsYXNoIGRyaXZlciBmb3IgQ29tcHVsYWIgQ00tWDI3MCBNb2R1bGUiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvbmFuZF9iYXNlLmMgYi9kcml2ZXJzL210ZC9uYW5kL25hbmRfYmFzZS5jCmluZGV4IDZhZjM3YjguLjA0ZGUzMTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvbmFuZF9iYXNlLmMKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9uYW5kX2Jhc2UuYwpAQCAtMzEyLDcgKzMxMiw3IEBACiAJCS8qIFNlbGVjdCB0aGUgTkFORCBkZXZpY2UgKi8KIAkJY2hpcC0+c2VsZWN0X2NoaXAobXRkLCBjaGlwbnIpOwogCX0gZWxzZQotCQlwYWdlID0gKGludClvZnM7CisJCXBhZ2UgPSAoaW50KShvZnMgPj4gY2hpcC0+cGFnZV9zaGlmdCk7CiAKIAlpZiAoY2hpcC0+b3B0aW9ucyAmIE5BTkRfQlVTV0lEVEhfMTYpIHsKIAkJY2hpcC0+Y21kZnVuYyhtdGQsIE5BTkRfQ01EX1JFQURPT0IsIGNoaXAtPmJhZGJsb2NrcG9zICYgMHhGRSwKQEAgLTM1MCw3ICszNTAsNyBAQAogCWludCBibG9jaywgcmV0OwogCiAJLyogR2V0IGJsb2NrIG51bWJlciAqLwotCWJsb2NrID0gKChpbnQpb2ZzKSA+PiBjaGlwLT5iYnRfZXJhc2Vfc2hpZnQ7CisJYmxvY2sgPSAoaW50KShvZnMgPj4gY2hpcC0+YmJ0X2VyYXNlX3NoaWZ0KTsKIAlpZiAoY2hpcC0+YmJ0KQogCQljaGlwLT5iYnRbYmxvY2sgPj4gMl0gfD0gMHgwMSA8PCAoKGJsb2NrICYgMHgwMykgPDwgMSk7CiAKQEAgLTc3MSw3ICs3NzEsNyBAQAogCXVpbnQ4X3QgKmVjY19jb2RlID0gY2hpcC0+YnVmZmVycy0+ZWNjY29kZTsKIAlpbnQgKmVjY3BvcyA9IGNoaXAtPmVjYy5sYXlvdXQtPmVjY3BvczsKIAotCW5hbmRfcmVhZF9wYWdlX3JhdyhtdGQsIGNoaXAsIGJ1Zik7CisJY2hpcC0+ZWNjLnJlYWRfcGFnZV9yYXcobXRkLCBjaGlwLCBidWYpOwogCiAJZm9yIChpID0gMDsgZWNjc3RlcHM7IGVjY3N0ZXBzLS0sIGkgKz0gZWNjYnl0ZXMsIHAgKz0gZWNjc2l6ZSkKIAkJY2hpcC0+ZWNjLmNhbGN1bGF0ZShtdGQsIHAsICZlY2NfY2FsY1tpXSk7CkBAIC0xNDI2LDcgKzE0MjYsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBjaGlwLT5lY2MudG90YWw7IGkrKykKIAkJY2hpcC0+b29iX3BvaVtlY2Nwb3NbaV1dID0gZWNjX2NhbGNbaV07CiAKLQluYW5kX3dyaXRlX3BhZ2VfcmF3KG10ZCwgY2hpcCwgYnVmKTsKKwljaGlwLT5lY2Mud3JpdGVfcGFnZV9yYXcobXRkLCBjaGlwLCBidWYpOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvbmFuZF9pZHMuYyBiL2RyaXZlcnMvbXRkL25hbmQvbmFuZF9pZHMuYwppbmRleCAyZTJjZGYyLi4yZmM2NzRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL25hbmRfaWRzLmMKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9uYW5kX2lkcy5jCkBAIC0yNCw2ICsyNCw4IEBACiAqCTUxMgk1MTIgQnl0ZSBwYWdlIHNpemUKICovCiBzdHJ1Y3QgbmFuZF9mbGFzaF9kZXYgbmFuZF9mbGFzaF9pZHNbXSA9IHsKKworI2lmZGVmIENPTkZJR19NVERfTkFORF9NVVNFVU1fSURTCiAJeyJOQU5EIDFNaUIgNVYgOC1iaXQiLAkJMHg2ZSwgMjU2LCAxLCAweDEwMDAsIDB9LAogCXsiTkFORCAyTWlCIDVWIDgtYml0IiwJCTB4NjQsIDI1NiwgMiwgMHgxMDAwLCAwfSwKIAl7Ik5BTkQgNE1pQiA1ViA4LWJpdCIsCQkweDZiLCA1MTIsIDQsIDB4MjAwMCwgMH0sCkBAIC0zOSw2ICs0MSw3IEBACiAJeyJOQU5EIDhNaUIgMywzViA4LWJpdCIsCTB4ZTYsIDUxMiwgOCwgMHgyMDAwLCAwfSwKIAl7Ik5BTkQgOE1pQiAxLDhWIDE2LWJpdCIsCTB4NDksIDUxMiwgOCwgMHgyMDAwLCBOQU5EX0JVU1dJRFRIXzE2fSwKIAl7Ik5BTkQgOE1pQiAzLDNWIDE2LWJpdCIsCTB4NTksIDUxMiwgOCwgMHgyMDAwLCBOQU5EX0JVU1dJRFRIXzE2fSwKKyNlbmRpZgogCiAJeyJOQU5EIDE2TWlCIDEsOFYgOC1iaXQiLAkweDMzLCA1MTIsIDE2LCAweDQwMDAsIDB9LAogCXsiTkFORCAxNk1pQiAzLDNWIDgtYml0IiwJMHg3MywgNTEyLCAxNiwgMHg0MDAwLCAwfSwKQEAgLTEzNyw2ICsxNDAsNyBAQAogCXtOQU5EX01GUl9SRU5FU0FTLCAiUmVuZXNhcyJ9LAogCXtOQU5EX01GUl9TVE1JQ1JPLCAiU1QgTWljcm8ifSwKIAl7TkFORF9NRlJfSFlOSVgsICJIeW5peCJ9LAorCXtOQU5EX01GUl9NSUNST04sICJNaWNyb24ifSwKIAl7MHgwLCAiVW5rbm93biJ9CiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL25hbmRzaW0uYyBiL2RyaXZlcnMvbXRkL25hbmQvbmFuZHNpbS5jCmluZGV4IGMzYmNhOTUuLjIwNWRmMGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvbmFuZHNpbS5jCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvbmFuZHNpbS5jCkBAIC0zNyw2ICszNyw4IEBACiAjaW5jbHVkZSA8bGludXgvbXRkL25hbmQuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgogCiAvKiBEZWZhdWx0IHNpbXVsYXRvciBwYXJhbWV0ZXJzIHZhbHVlcyAqLwogI2lmICFkZWZpbmVkKENPTkZJR19OQU5EU0lNX0ZJUlNUX0lEX0JZVEUpICB8fCBcCkBAIC05MCw2ICs5MiwxNSBAQAogc3RhdGljIHVpbnQgZG9fZGVsYXlzICAgICAgPSBDT05GSUdfTkFORFNJTV9ET19ERUxBWVM7CiBzdGF0aWMgdWludCBsb2cgICAgICAgICAgICA9IENPTkZJR19OQU5EU0lNX0xPRzsKIHN0YXRpYyB1aW50IGRiZyAgICAgICAgICAgID0gQ09ORklHX05BTkRTSU1fREJHOworc3RhdGljIHVuc2lnbmVkIGxvbmcgcGFydHNbTUFYX01URF9ERVZJQ0VTXTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcGFydHNfbnVtOworc3RhdGljIGNoYXIgKmJhZGJsb2NrcyA9IE5VTEw7CitzdGF0aWMgY2hhciAqd2Vha2Jsb2NrcyA9IE5VTEw7CitzdGF0aWMgY2hhciAqd2Vha3BhZ2VzID0gTlVMTDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYml0ZmxpcHMgPSAwOworc3RhdGljIGNoYXIgKmdyYXZlcGFnZXMgPSBOVUxMOworc3RhdGljIHVuc2lnbmVkIGludCBycHR3ZWFyID0gMDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgb3ZlcnJpZGVzaXplID0gMDsKIAogbW9kdWxlX3BhcmFtKGZpcnN0X2lkX2J5dGUsICB1aW50LCAwNDAwKTsKIG1vZHVsZV9wYXJhbShzZWNvbmRfaWRfYnl0ZSwgdWludCwgMDQwMCk7CkBAIC0xMDQsOCArMTE1LDE2IEBACiBtb2R1bGVfcGFyYW0oZG9fZGVsYXlzLCAgICAgIHVpbnQsIDA0MDApOwogbW9kdWxlX3BhcmFtKGxvZywgICAgICAgICAgICB1aW50LCAwNDAwKTsKIG1vZHVsZV9wYXJhbShkYmcsICAgICAgICAgICAgdWludCwgMDQwMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkocGFydHMsIHVsb25nLCAmcGFydHNfbnVtLCAwNDAwKTsKK21vZHVsZV9wYXJhbShiYWRibG9ja3MsICAgICAgY2hhcnAsIDA0MDApOworbW9kdWxlX3BhcmFtKHdlYWtibG9ja3MsICAgICBjaGFycCwgMDQwMCk7Cittb2R1bGVfcGFyYW0od2Vha3BhZ2VzLCAgICAgIGNoYXJwLCAwNDAwKTsKK21vZHVsZV9wYXJhbShiaXRmbGlwcywgICAgICAgdWludCwgMDQwMCk7Cittb2R1bGVfcGFyYW0oZ3JhdmVwYWdlcywgICAgIGNoYXJwLCAwNDAwKTsKK21vZHVsZV9wYXJhbShycHR3ZWFyLCAgICAgICAgdWludCwgMDQwMCk7Cittb2R1bGVfcGFyYW0ob3ZlcnJpZGVzaXplLCAgIHVpbnQsIDA0MDApOwogCi1NT0RVTEVfUEFSTV9ERVNDKGZpcnN0X2lkX2J5dGUsICAiVGhlIGZpc3QgYnl0ZSByZXR1cm5lZCBieSBOQU5EIEZsYXNoICdyZWFkIElEJyBjb21tYW5kIChtYW51ZmF0dXJlciBJRCkiKTsKK01PRFVMRV9QQVJNX0RFU0MoZmlyc3RfaWRfYnl0ZSwgICJUaGUgZmlyc3QgYnl0ZSByZXR1cm5lZCBieSBOQU5EIEZsYXNoICdyZWFkIElEJyBjb21tYW5kIChtYW51ZmFjdHVyZXIgSUQpIik7CiBNT0RVTEVfUEFSTV9ERVNDKHNlY29uZF9pZF9ieXRlLCAiVGhlIHNlY29uZCBieXRlIHJldHVybmVkIGJ5IE5BTkQgRmxhc2ggJ3JlYWQgSUQnIGNvbW1hbmQgKGNoaXAgSUQpIik7CiBNT0RVTEVfUEFSTV9ERVNDKHRoaXJkX2lkX2J5dGUsICAiVGhlIHRoaXJkIGJ5dGUgcmV0dXJuZWQgYnkgTkFORCBGbGFzaCAncmVhZCBJRCcgY29tbWFuZCIpOwogTU9EVUxFX1BBUk1fREVTQyhmb3VydGhfaWRfYnl0ZSwgIlRoZSBmb3VydGggYnl0ZSByZXR1cm5lZCBieSBOQU5EIEZsYXNoICdyZWFkIElEJyBjb21tYW5kIik7CkBAIC0xMTgsNiArMTM3LDIzIEBACiBNT0RVTEVfUEFSTV9ERVNDKGRvX2RlbGF5cywgICAgICAiU2ltdWxhdGUgTkFORCBkZWxheXMgdXNpbmcgYnVzeS13YWl0cyBpZiBub3QgemVybyIpOwogTU9EVUxFX1BBUk1fREVTQyhsb2csICAgICAgICAgICAgIlBlcmZvcm0gbG9nZ2luZyBpZiBub3QgemVybyIpOwogTU9EVUxFX1BBUk1fREVTQyhkYmcsICAgICAgICAgICAgIk91dHB1dCBkZWJ1ZyBpbmZvcm1hdGlvbiBpZiBub3QgemVybyIpOworTU9EVUxFX1BBUk1fREVTQyhwYXJ0cywgICAgICAgICAgIlBhcnRpdGlvbiBzaXplcyAoaW4gZXJhc2UgYmxvY2tzKSBzZXBhcmF0ZWQgYnkgY29tbWFzIik7CisvKiBQYWdlIGFuZCBlcmFzZSBibG9jayBwb3NpdGlvbnMgZm9yIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVycyBhcmUgaW5kZXBlbmRlbnQgb2YgYW55IHBhcnRpdGlvbnMgKi8KK01PRFVMRV9QQVJNX0RFU0MoYmFkYmxvY2tzLCAgICAgICJFcmFzZSBibG9ja3MgdGhhdCBhcmUgaW5pdGlhbGx5IG1hcmtlZCBiYWQsIHNlcGFyYXRlZCBieSBjb21tYXMiKTsKK01PRFVMRV9QQVJNX0RFU0Mod2Vha2Jsb2NrcywgICAgICJXZWFrIGVyYXNlIGJsb2NrcyBbOiByZW1haW5pbmcgZXJhc2UgY3ljbGVzIChkZWZhdWx0cyB0byAzKV0iCisJCQkJICIgc2VwYXJhdGVkIGJ5IGNvbW1hcyBlLmcuIDExMzoyIG1lYW5zIGViIDExMyIKKwkJCQkgIiBjYW4gYmUgZXJhc2VkIG9ubHkgdHdpY2UgYmVmb3JlIGZhaWxpbmciKTsKK01PRFVMRV9QQVJNX0RFU0Mod2Vha3BhZ2VzLCAgICAgICJXZWFrIHBhZ2VzIFs6IG1heGltdW0gd3JpdGVzIChkZWZhdWx0cyB0byAzKV0iCisJCQkJICIgc2VwYXJhdGVkIGJ5IGNvbW1hcyBlLmcuIDE0MDE6MiBtZWFucyBwYWdlIDE0MDEiCisJCQkJICIgY2FuIGJlIHdyaXR0ZW4gb25seSB0d2ljZSBiZWZvcmUgZmFpbGluZyIpOworTU9EVUxFX1BBUk1fREVTQyhiaXRmbGlwcywgICAgICAgIk1heGltdW0gbnVtYmVyIG9mIHJhbmRvbSBiaXQgZmxpcHMgcGVyIHBhZ2UgKHplcm8gYnkgZGVmYXVsdCkiKTsKK01PRFVMRV9QQVJNX0RFU0MoZ3JhdmVwYWdlcywgICAgICJQYWdlcyB0aGF0IGxvc2UgZGF0YSBbOiBtYXhpbXVtIHJlYWRzIChkZWZhdWx0cyB0byAzKV0iCisJCQkJICIgc2VwYXJhdGVkIGJ5IGNvbW1hcyBlLmcuIDE0MDE6MiBtZWFucyBwYWdlIDE0MDEiCisJCQkJICIgY2FuIGJlIHJlYWQgb25seSB0d2ljZSBiZWZvcmUgZmFpbGluZyIpOworTU9EVUxFX1BBUk1fREVTQyhycHR3ZWFyLCAgICAgICAgIk51bWJlciBvZiBlcmFzZXMgaW5iZXR3ZWVuIHJlcG9ydGluZyB3ZWFyLCBpZiBub3QgemVybyIpOworTU9EVUxFX1BBUk1fREVTQyhvdmVycmlkZXNpemUsICAgIlNwZWNpZmllcyB0aGUgTkFORCBGbGFzaCBzaXplIG92ZXJyaWRpbmcgdGhlIElEIGJ5dGVzLiAiCisJCQkJICJUaGUgc2l6ZSBpcyBzcGVjaWZpZWQgaW4gZXJhc2UgYmxvY2tzIGFuZCBhcyB0aGUgZXhwb25lbnQgb2YgYSBwb3dlciBvZiB0d28iCisJCQkJICIgZS5nLiA1IG1lYW5zIGEgc2l6ZSBvZiAzMiBlcmFzZSBibG9ja3MiKTsKIAogLyogVGhlIGxhcmdlc3QgcG9zc2libGUgcGFnZSBzaXplICovCiAjZGVmaW5lIE5TX0xBUkdFU1RfUEFHRV9TSVpFCTIwNDgKQEAgLTEzMSw5ICsxNjcsMTEgQEAKICNkZWZpbmUgTlNfREJHKGFyZ3MuLi4pIFwKIAlkbyB7IGlmIChkYmcpIHByaW50ayhLRVJOX0RFQlVHIE5TX09VVFBVVF9QUkVGSVggIiBkZWJ1ZzogIiBhcmdzKTsgfSB3aGlsZSgwKQogI2RlZmluZSBOU19XQVJOKGFyZ3MuLi4pIFwKLQlkbyB7IHByaW50ayhLRVJOX1dBUk5JTkcgTlNfT1VUUFVUX1BSRUZJWCAiIHdhcm5pZzogIiBhcmdzKTsgfSB3aGlsZSgwKQorCWRvIHsgcHJpbnRrKEtFUk5fV0FSTklORyBOU19PVVRQVVRfUFJFRklYICIgd2FybmluZzogIiBhcmdzKTsgfSB3aGlsZSgwKQogI2RlZmluZSBOU19FUlIoYXJncy4uLikgXAotCWRvIHsgcHJpbnRrKEtFUk5fRVJSIE5TX09VVFBVVF9QUkVGSVggIiBlcnJvcnI6ICIgYXJncyk7IH0gd2hpbGUoMCkKKwlkbyB7IHByaW50ayhLRVJOX0VSUiBOU19PVVRQVVRfUFJFRklYICIgZXJyb3I6ICIgYXJncyk7IH0gd2hpbGUoMCkKKyNkZWZpbmUgTlNfSU5GTyhhcmdzLi4uKSBcCisJZG8geyBwcmludGsoS0VSTl9JTkZPIE5TX09VVFBVVF9QUkVGSVggIiAiIGFyZ3MpOyB9IHdoaWxlKDApCiAKIC8qIEJ1c3ktd2FpdCBkZWxheSBtYWNyb3MgKG1pY3Jvc2Vjb25kcywgbWlsbGlzZWNvbmRzKSAqLwogI2RlZmluZSBOU19VREVMQVkodXMpIFwKQEAgLTIzOCw3ICsyNzYsOCBAQAogICogVGhlIHN0cnVjdHVyZSB3aGljaCBkZXNjcmliZXMgYWxsIHRoZSBpbnRlcm5hbCBzaW11bGF0b3IgZGF0YS4KICAqLwogc3RydWN0IG5hbmRzaW0gewotCXN0cnVjdCBtdGRfcGFydGl0aW9uIHBhcnQ7CisJc3RydWN0IG10ZF9wYXJ0aXRpb24gcGFydGl0aW9uc1tNQVhfTVREX0RFVklDRVNdOworCXVuc2lnbmVkIGludCBuYnBhcnRzOwogCiAJdWludCBidXN3OyAgICAgICAgICAgICAgLyogZmxhc2ggY2hpcCBidXMgd2lkdGggKDggb3IgMTYpICovCiAJdV9jaGFyIGlkc1s0XTsgICAgICAgICAgLyogY2hpcCdzIElEIGJ5dGVzICovCkBAIC0zMzgsNiArMzc3LDM4IEBACiAJCQkgICAgICAgU1RBVEVfREFUQU9VVCwgU1RBVEVfUkVBRFl9fQogfTsKIAorc3RydWN0IHdlYWtfYmxvY2sgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwl1bnNpZ25lZCBpbnQgZXJhc2VfYmxvY2tfbm87CisJdW5zaWduZWQgaW50IG1heF9lcmFzZXM7CisJdW5zaWduZWQgaW50IGVyYXNlc19kb25lOworfTsKKworc3RhdGljIExJU1RfSEVBRCh3ZWFrX2Jsb2Nrcyk7CisKK3N0cnVjdCB3ZWFrX3BhZ2UgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwl1bnNpZ25lZCBpbnQgcGFnZV9ubzsKKwl1bnNpZ25lZCBpbnQgbWF4X3dyaXRlczsKKwl1bnNpZ25lZCBpbnQgd3JpdGVzX2RvbmU7Cit9OworCitzdGF0aWMgTElTVF9IRUFEKHdlYWtfcGFnZXMpOworCitzdHJ1Y3QgZ3JhdmVfcGFnZSB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXVuc2lnbmVkIGludCBwYWdlX25vOworCXVuc2lnbmVkIGludCBtYXhfcmVhZHM7CisJdW5zaWduZWQgaW50IHJlYWRzX2RvbmU7Cit9OworCitzdGF0aWMgTElTVF9IRUFEKGdyYXZlX3BhZ2VzKTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgKmVyYXNlX2Jsb2NrX3dlYXIgPSBOVUxMOworc3RhdGljIHVuc2lnbmVkIGludCB3ZWFyX2ViX2NvdW50ID0gMDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHRvdGFsX3dlYXIgPSAwOworc3RhdGljIHVuc2lnbmVkIGludCBycHR3ZWFyX2NudCA9IDA7CisKIC8qIE1URCBzdHJ1Y3R1cmUgZm9yIE5BTkQgY29udHJvbGxlciAqLwogc3RhdGljIHN0cnVjdCBtdGRfaW5mbyAqbnNtdGQ7CiAKQEAgLTM4MSw2ICs0NTIsMTMgQEAKIAl9CiB9CiAKK3N0YXRpYyBjaGFyICpnZXRfcGFydGl0aW9uX25hbWUoaW50IGkpCit7CisJY2hhciBidWZbNjRdOworCXNwcmludGYoYnVmLCAiTkFORCBzaW11bGF0b3IgcGFydGl0aW9uICVkIiwgaSk7CisJcmV0dXJuIGtzdHJkdXAoYnVmLCBHRlBfS0VSTkVMKTsKK30KKwogLyoKICAqIEluaXRpYWxpemUgdGhlIG5hbmRzaW0gc3RydWN0dXJlLgogICoKQEAgLTM5MCw3ICs0NjgsOSBAQAogewogCXN0cnVjdCBuYW5kX2NoaXAgKmNoaXAgPSAoc3RydWN0IG5hbmRfY2hpcCAqKW10ZC0+cHJpdjsKIAlzdHJ1Y3QgbmFuZHNpbSAgICpucyAgID0gKHN0cnVjdCBuYW5kc2ltICopKGNoaXAtPnByaXYpOwotCWludCBpOworCWludCBpLCByZXQgPSAwOworCXVfaW50MzJfdCByZW1haW5zOworCXVfaW50MzJfdCBuZXh0X29mZnNldDsKIAogCWlmIChOU19JU19JTklUSUFMSVpFRChucykpIHsKIAkJTlNfRVJSKCJpbml0X25hbmRzaW06IG5hbmRzaW0gaXMgYWxyZWFkeSBpbml0aWFsaXplZFxuIik7CkBAIC00NDgsNiArNTI4LDQwIEBACiAJCX0KIAl9CiAKKwkvKiBGaWxsIHRoZSBwYXJ0aXRpb25faW5mbyBzdHJ1Y3R1cmUgKi8KKwlpZiAocGFydHNfbnVtID4gQVJSQVlfU0laRShucy0+cGFydGl0aW9ucykpIHsKKwkJTlNfRVJSKCJ0b28gbWFueSBwYXJ0aXRpb25zLlxuIik7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyb3I7CisJfQorCXJlbWFpbnMgPSBucy0+Z2VvbS50b3RzejsKKwluZXh0X29mZnNldCA9IDA7CisJZm9yIChpID0gMDsgaSA8IHBhcnRzX251bTsgKytpKSB7CisJCXVuc2lnbmVkIGxvbmcgcGFydCA9IHBhcnRzW2ldOworCQlpZiAoIXBhcnQgfHwgcGFydCA+IHJlbWFpbnMgLyBucy0+Z2VvbS5zZWNzeikgeworCQkJTlNfRVJSKCJiYWQgcGFydGl0aW9uIHNpemUuXG4iKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGVycm9yOworCQl9CisJCW5zLT5wYXJ0aXRpb25zW2ldLm5hbWUgICA9IGdldF9wYXJ0aXRpb25fbmFtZShpKTsKKwkJbnMtPnBhcnRpdGlvbnNbaV0ub2Zmc2V0ID0gbmV4dF9vZmZzZXQ7CisJCW5zLT5wYXJ0aXRpb25zW2ldLnNpemUgICA9IHBhcnQgKiBucy0+Z2VvbS5zZWNzejsKKwkJbmV4dF9vZmZzZXQgKz0gbnMtPnBhcnRpdGlvbnNbaV0uc2l6ZTsKKwkJcmVtYWlucyAtPSBucy0+cGFydGl0aW9uc1tpXS5zaXplOworCX0KKwlucy0+bmJwYXJ0cyA9IHBhcnRzX251bTsKKwlpZiAocmVtYWlucykgeworCQlpZiAocGFydHNfbnVtICsgMSA+IEFSUkFZX1NJWkUobnMtPnBhcnRpdGlvbnMpKSB7CisJCQlOU19FUlIoInRvbyBtYW55IHBhcnRpdGlvbnMuXG4iKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGVycm9yOworCQl9CisJCW5zLT5wYXJ0aXRpb25zW2ldLm5hbWUgICA9IGdldF9wYXJ0aXRpb25fbmFtZShpKTsKKwkJbnMtPnBhcnRpdGlvbnNbaV0ub2Zmc2V0ID0gbmV4dF9vZmZzZXQ7CisJCW5zLT5wYXJ0aXRpb25zW2ldLnNpemUgICA9IHJlbWFpbnM7CisJCW5zLT5uYnBhcnRzICs9IDE7CisJfQorCiAJLyogRGV0ZWN0IGhvdyBtYW55IElEIGJ5dGVzIHRoZSBOQU5EIGNoaXAgb3V0cHV0cyAqLwogICAgICAgICBmb3IgKGkgPSAwOyBuYW5kX2ZsYXNoX2lkc1tpXS5uYW1lICE9IE5VTEw7IGkrKykgewogICAgICAgICAgICAgICAgIGlmIChzZWNvbmRfaWRfYnl0ZSAhPSBuYW5kX2ZsYXNoX2lkc1tpXS5pZCkKQEAgLTQ3NCw3ICs1ODgsNyBAQAogCXByaW50aygic2VjdG9yIGFkZHJlc3MgYnl0ZXM6ICV1XG4iLCAgICBucy0+Z2VvbS5zZWNhZGRyYnl0ZXMpOwogCXByaW50aygib3B0aW9uczogJSN4XG4iLCAgICAgICAgICAgICAgICBucy0+b3B0aW9ucyk7CiAKLQlpZiAoYWxsb2NfZGV2aWNlKG5zKSAhPSAwKQorCWlmICgocmV0ID0gYWxsb2NfZGV2aWNlKG5zKSkgIT0gMCkKIAkJZ290byBlcnJvcjsKIAogCS8qIEFsbG9jYXRlIC8gaW5pdGlhbGl6ZSB0aGUgaW50ZXJuYWwgYnVmZmVyICovCkBAIC00ODIsMjEgKzU5NiwxNyBAQAogCWlmICghbnMtPmJ1Zi5ieXRlKSB7CiAJCU5TX0VSUigiaW5pdF9uYW5kc2ltOiB1bmFibGUgdG8gYWxsb2NhdGUgJXUgYnl0ZXMgZm9yIHRoZSBpbnRlcm5hbCBidWZmZXJcbiIsCiAJCQlucy0+Z2VvbS5wZ3N6b29iKTsKKwkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBlcnJvcjsKIAl9CiAJbWVtc2V0KG5zLT5idWYuYnl0ZSwgMHhGRiwgbnMtPmdlb20ucGdzem9vYik7CiAKLQkvKiBGaWxsIHRoZSBwYXJ0aXRpb25faW5mbyBzdHJ1Y3R1cmUgKi8KLQlucy0+cGFydC5uYW1lICAgPSAiTkFORCBzaW11bGF0b3IgcGFydGl0aW9uIjsKLQlucy0+cGFydC5vZmZzZXQgPSAwOwotCW5zLT5wYXJ0LnNpemUgICA9IG5zLT5nZW9tLnRvdHN6OwotCiAJcmV0dXJuIDA7CiAKIGVycm9yOgogCWZyZWVfZGV2aWNlKG5zKTsKIAotCXJldHVybiAtRU5PTUVNOworCXJldHVybiByZXQ7CiB9CiAKIC8qCkBAIC01MTAsNiArNjIwLDI4NyBAQAogCXJldHVybjsKIH0KIAorc3RhdGljIGludCBwYXJzZV9iYWRibG9ja3Moc3RydWN0IG5hbmRzaW0gKm5zLCBzdHJ1Y3QgbXRkX2luZm8gKm10ZCkKK3sKKwljaGFyICp3OworCWludCB6ZXJvX29rOworCXVuc2lnbmVkIGludCBlcmFzZV9ibG9ja19ubzsKKwlsb2ZmX3Qgb2Zmc2V0OworCisJaWYgKCFiYWRibG9ja3MpCisJCXJldHVybiAwOworCXcgPSBiYWRibG9ja3M7CisJZG8geworCQl6ZXJvX29rID0gKCp3ID09ICcwJyA/IDEgOiAwKTsKKwkJZXJhc2VfYmxvY2tfbm8gPSBzaW1wbGVfc3RydG91bCh3LCAmdywgMCk7CisJCWlmICghemVyb19vayAmJiAhZXJhc2VfYmxvY2tfbm8pIHsKKwkJCU5TX0VSUigiaW52YWxpZCBiYWRibG9ja3MuXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCW9mZnNldCA9IGVyYXNlX2Jsb2NrX25vICogbnMtPmdlb20uc2Vjc3o7CisJCWlmIChtdGQtPmJsb2NrX21hcmtiYWQobXRkLCBvZmZzZXQpKSB7CisJCQlOU19FUlIoImludmFsaWQgYmFkYmxvY2tzLlxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlpZiAoKncgPT0gJywnKQorCQkJdyArPSAxOworCX0gd2hpbGUgKCp3KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYXJzZV93ZWFrYmxvY2tzKHZvaWQpCit7CisJY2hhciAqdzsKKwlpbnQgemVyb19vazsKKwl1bnNpZ25lZCBpbnQgZXJhc2VfYmxvY2tfbm87CisJdW5zaWduZWQgaW50IG1heF9lcmFzZXM7CisJc3RydWN0IHdlYWtfYmxvY2sgKndiOworCisJaWYgKCF3ZWFrYmxvY2tzKQorCQlyZXR1cm4gMDsKKwl3ID0gd2Vha2Jsb2NrczsKKwlkbyB7CisJCXplcm9fb2sgPSAoKncgPT0gJzAnID8gMSA6IDApOworCQllcmFzZV9ibG9ja19ubyA9IHNpbXBsZV9zdHJ0b3VsKHcsICZ3LCAwKTsKKwkJaWYgKCF6ZXJvX29rICYmICFlcmFzZV9ibG9ja19ubykgeworCQkJTlNfRVJSKCJpbnZhbGlkIHdlYWtibG9ja3MuXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCW1heF9lcmFzZXMgPSAzOworCQlpZiAoKncgPT0gJzonKSB7CisJCQl3ICs9IDE7CisJCQltYXhfZXJhc2VzID0gc2ltcGxlX3N0cnRvdWwodywgJncsIDApOworCQl9CisJCWlmICgqdyA9PSAnLCcpCisJCQl3ICs9IDE7CisJCXdiID0ga3phbGxvYyhzaXplb2YoKndiKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghd2IpIHsKKwkJCU5TX0VSUigidW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeS5cbiIpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJd2ItPmVyYXNlX2Jsb2NrX25vID0gZXJhc2VfYmxvY2tfbm87CisJCXdiLT5tYXhfZXJhc2VzID0gbWF4X2VyYXNlczsKKwkJbGlzdF9hZGQoJndiLT5saXN0LCAmd2Vha19ibG9ja3MpOworCX0gd2hpbGUgKCp3KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlcmFzZV9lcnJvcih1bnNpZ25lZCBpbnQgZXJhc2VfYmxvY2tfbm8pCit7CisJc3RydWN0IHdlYWtfYmxvY2sgKndiOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh3YiwgJndlYWtfYmxvY2tzLCBsaXN0KQorCQlpZiAod2ItPmVyYXNlX2Jsb2NrX25vID09IGVyYXNlX2Jsb2NrX25vKSB7CisJCQlpZiAod2ItPmVyYXNlc19kb25lID49IHdiLT5tYXhfZXJhc2VzKQorCQkJCXJldHVybiAxOworCQkJd2ItPmVyYXNlc19kb25lICs9IDE7CisJCQlyZXR1cm4gMDsKKwkJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBhcnNlX3dlYWtwYWdlcyh2b2lkKQoreworCWNoYXIgKnc7CisJaW50IHplcm9fb2s7CisJdW5zaWduZWQgaW50IHBhZ2Vfbm87CisJdW5zaWduZWQgaW50IG1heF93cml0ZXM7CisJc3RydWN0IHdlYWtfcGFnZSAqd3A7CisKKwlpZiAoIXdlYWtwYWdlcykKKwkJcmV0dXJuIDA7CisJdyA9IHdlYWtwYWdlczsKKwlkbyB7CisJCXplcm9fb2sgPSAoKncgPT0gJzAnID8gMSA6IDApOworCQlwYWdlX25vID0gc2ltcGxlX3N0cnRvdWwodywgJncsIDApOworCQlpZiAoIXplcm9fb2sgJiYgIXBhZ2Vfbm8pIHsKKwkJCU5TX0VSUigiaW52YWxpZCB3ZWFrcGFnZXNzLlxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQltYXhfd3JpdGVzID0gMzsKKwkJaWYgKCp3ID09ICc6JykgeworCQkJdyArPSAxOworCQkJbWF4X3dyaXRlcyA9IHNpbXBsZV9zdHJ0b3VsKHcsICZ3LCAwKTsKKwkJfQorCQlpZiAoKncgPT0gJywnKQorCQkJdyArPSAxOworCQl3cCA9IGt6YWxsb2Moc2l6ZW9mKCp3cCksIEdGUF9LRVJORUwpOworCQlpZiAoIXdwKSB7CisJCQlOU19FUlIoInVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkuXG4iKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCXdwLT5wYWdlX25vID0gcGFnZV9ubzsKKwkJd3AtPm1heF93cml0ZXMgPSBtYXhfd3JpdGVzOworCQlsaXN0X2FkZCgmd3AtPmxpc3QsICZ3ZWFrX3BhZ2VzKTsKKwl9IHdoaWxlICgqdyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd3JpdGVfZXJyb3IodW5zaWduZWQgaW50IHBhZ2Vfbm8pCit7CisJc3RydWN0IHdlYWtfcGFnZSAqd3A7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHdwLCAmd2Vha19wYWdlcywgbGlzdCkKKwkJaWYgKHdwLT5wYWdlX25vID09IHBhZ2Vfbm8pIHsKKwkJCWlmICh3cC0+d3JpdGVzX2RvbmUgPj0gd3AtPm1heF93cml0ZXMpCisJCQkJcmV0dXJuIDE7CisJCQl3cC0+d3JpdGVzX2RvbmUgKz0gMTsKKwkJCXJldHVybiAwOworCQl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfZ3JhdmVwYWdlcyh2b2lkKQoreworCWNoYXIgKmc7CisJaW50IHplcm9fb2s7CisJdW5zaWduZWQgaW50IHBhZ2Vfbm87CisJdW5zaWduZWQgaW50IG1heF9yZWFkczsKKwlzdHJ1Y3QgZ3JhdmVfcGFnZSAqZ3A7CisKKwlpZiAoIWdyYXZlcGFnZXMpCisJCXJldHVybiAwOworCWcgPSBncmF2ZXBhZ2VzOworCWRvIHsKKwkJemVyb19vayA9ICgqZyA9PSAnMCcgPyAxIDogMCk7CisJCXBhZ2Vfbm8gPSBzaW1wbGVfc3RydG91bChnLCAmZywgMCk7CisJCWlmICghemVyb19vayAmJiAhcGFnZV9ubykgeworCQkJTlNfRVJSKCJpbnZhbGlkIGdyYXZlcGFnZXNzLlxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQltYXhfcmVhZHMgPSAzOworCQlpZiAoKmcgPT0gJzonKSB7CisJCQlnICs9IDE7CisJCQltYXhfcmVhZHMgPSBzaW1wbGVfc3RydG91bChnLCAmZywgMCk7CisJCX0KKwkJaWYgKCpnID09ICcsJykKKwkJCWcgKz0gMTsKKwkJZ3AgPSBremFsbG9jKHNpemVvZigqZ3ApLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFncCkgeworCQkJTlNfRVJSKCJ1bmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5LlxuIik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQlncC0+cGFnZV9ubyA9IHBhZ2Vfbm87CisJCWdwLT5tYXhfcmVhZHMgPSBtYXhfcmVhZHM7CisJCWxpc3RfYWRkKCZncC0+bGlzdCwgJmdyYXZlX3BhZ2VzKTsKKwl9IHdoaWxlICgqZyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9lcnJvcih1bnNpZ25lZCBpbnQgcGFnZV9ubykKK3sKKwlzdHJ1Y3QgZ3JhdmVfcGFnZSAqZ3A7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGdwLCAmZ3JhdmVfcGFnZXMsIGxpc3QpCisJCWlmIChncC0+cGFnZV9ubyA9PSBwYWdlX25vKSB7CisJCQlpZiAoZ3AtPnJlYWRzX2RvbmUgPj0gZ3AtPm1heF9yZWFkcykKKwkJCQlyZXR1cm4gMTsKKwkJCWdwLT5yZWFkc19kb25lICs9IDE7CisJCQlyZXR1cm4gMDsKKwkJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBmcmVlX2xpc3RzKHZvaWQpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcG9zLCAqbjsKKwlsaXN0X2Zvcl9lYWNoX3NhZmUocG9zLCBuLCAmd2Vha19ibG9ja3MpIHsKKwkJbGlzdF9kZWwocG9zKTsKKwkJa2ZyZWUobGlzdF9lbnRyeShwb3MsIHN0cnVjdCB3ZWFrX2Jsb2NrLCBsaXN0KSk7CisJfQorCWxpc3RfZm9yX2VhY2hfc2FmZShwb3MsIG4sICZ3ZWFrX3BhZ2VzKSB7CisJCWxpc3RfZGVsKHBvcyk7CisJCWtmcmVlKGxpc3RfZW50cnkocG9zLCBzdHJ1Y3Qgd2Vha19wYWdlLCBsaXN0KSk7CisJfQorCWxpc3RfZm9yX2VhY2hfc2FmZShwb3MsIG4sICZncmF2ZV9wYWdlcykgeworCQlsaXN0X2RlbChwb3MpOworCQlrZnJlZShsaXN0X2VudHJ5KHBvcywgc3RydWN0IGdyYXZlX3BhZ2UsIGxpc3QpKTsKKwl9CisJa2ZyZWUoZXJhc2VfYmxvY2tfd2Vhcik7Cit9CisKK3N0YXRpYyBpbnQgc2V0dXBfd2Vhcl9yZXBvcnRpbmcoc3RydWN0IG10ZF9pbmZvICptdGQpCit7CisJc2l6ZV90IG1lbTsKKworCWlmICghcnB0d2VhcikKKwkJcmV0dXJuIDA7CisJd2Vhcl9lYl9jb3VudCA9IG10ZC0+c2l6ZSAvIG10ZC0+ZXJhc2VzaXplOworCW1lbSA9IHdlYXJfZWJfY291bnQgKiBzaXplb2YodW5zaWduZWQgbG9uZyk7CisJaWYgKG1lbSAvIHNpemVvZih1bnNpZ25lZCBsb25nKSAhPSB3ZWFyX2ViX2NvdW50KSB7CisJCU5TX0VSUigiVG9vIG1hbnkgZXJhc2UgYmxvY2tzIGZvciB3ZWFyIHJlcG9ydGluZ1xuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwllcmFzZV9ibG9ja193ZWFyID0ga3phbGxvYyhtZW0sIEdGUF9LRVJORUwpOworCWlmICghZXJhc2VfYmxvY2tfd2VhcikgeworCQlOU19FUlIoIlRvbyBtYW55IGVyYXNlIGJsb2NrcyBmb3Igd2VhciByZXBvcnRpbmdcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZV93ZWFyKHVuc2lnbmVkIGludCBlcmFzZV9ibG9ja19ubykKK3sKKwl1bnNpZ25lZCBsb25nIHdtaW4gPSAtMSwgd21heCA9IDAsIGF2ZzsKKwl1bnNpZ25lZCBsb25nIGRlY2lsZXNbMTBdLCBkZWNpbGVfbWF4WzEwXSwgdG90ID0gMDsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWlmICghZXJhc2VfYmxvY2tfd2VhcikKKwkJcmV0dXJuOworCXRvdGFsX3dlYXIgKz0gMTsKKwlpZiAodG90YWxfd2VhciA9PSAwKQorCQlOU19FUlIoIkVyYXNlIGNvdW50ZXIgdG90YWwgb3ZlcmZsb3dcbiIpOworCWVyYXNlX2Jsb2NrX3dlYXJbZXJhc2VfYmxvY2tfbm9dICs9IDE7CisJaWYgKGVyYXNlX2Jsb2NrX3dlYXJbZXJhc2VfYmxvY2tfbm9dID09IDApCisJCU5TX0VSUigiRXJhc2UgY291bnRlciBvdmVyZmxvdyBmb3IgZXJhc2UgYmxvY2sgJXVcbiIsIGVyYXNlX2Jsb2NrX25vKTsKKwlycHR3ZWFyX2NudCArPSAxOworCWlmIChycHR3ZWFyX2NudCA8IHJwdHdlYXIpCisJCXJldHVybjsKKwlycHR3ZWFyX2NudCA9IDA7CisJLyogQ2FsYyB3ZWFyIHN0YXRzICovCisJZm9yIChpID0gMDsgaSA8IHdlYXJfZWJfY291bnQ7ICsraSkgeworCQl1bnNpZ25lZCBsb25nIHdlYXIgPSBlcmFzZV9ibG9ja193ZWFyW2ldOworCQlpZiAod2VhciA8IHdtaW4pCisJCQl3bWluID0gd2VhcjsKKwkJaWYgKHdlYXIgPiB3bWF4KQorCQkJd21heCA9IHdlYXI7CisJCXRvdCArPSB3ZWFyOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgOTsgKytpKSB7CisJCWRlY2lsZXNbaV0gPSAwOworCQlkZWNpbGVfbWF4W2ldID0gKHdtYXggKiAoaSArIDEpICsgNSkgLyAxMDsKKwl9CisJZGVjaWxlc1s5XSA9IDA7CisJZGVjaWxlX21heFs5XSA9IHdtYXg7CisJZm9yIChpID0gMDsgaSA8IHdlYXJfZWJfY291bnQ7ICsraSkgeworCQlpbnQgZDsKKwkJdW5zaWduZWQgbG9uZyB3ZWFyID0gZXJhc2VfYmxvY2tfd2VhcltpXTsKKwkJZm9yIChkID0gMDsgZCA8IDEwOyArK2QpCisJCQlpZiAod2VhciA8PSBkZWNpbGVfbWF4W2RdKSB7CisJCQkJZGVjaWxlc1tkXSArPSAxOworCQkJCWJyZWFrOworCQkJfQorCX0KKwlhdmcgPSB0b3QgLyB3ZWFyX2ViX2NvdW50OworCS8qIE91dHB1dCB3ZWFyIHJlcG9ydCAqLworCU5TX0lORk8oIioqKiBXZWFyIFJlcG9ydCAqKipcbiIpOworCU5TX0lORk8oIlRvdGFsIG51bWJlcnMgb2YgZXJhc2VzOiAgJWx1XG4iLCB0b3QpOworCU5TX0lORk8oIk51bWJlciBvZiBlcmFzZSBibG9ja3M6ICAgJXVcbiIsIHdlYXJfZWJfY291bnQpOworCU5TX0lORk8oIkF2ZXJhZ2UgbnVtYmVyIG9mIGVyYXNlczogJWx1XG4iLCBhdmcpOworCU5TX0lORk8oIk1heGltdW0gbnVtYmVyIG9mIGVyYXNlczogJWx1XG4iLCB3bWF4KTsKKwlOU19JTkZPKCJNaW5pbXVtIG51bWJlciBvZiBlcmFzZXM6ICVsdVxuIiwgd21pbik7CisJZm9yIChpID0gMDsgaSA8IDEwOyArK2kpIHsKKwkJdW5zaWduZWQgbG9uZyBmcm9tID0gKGkgPyBkZWNpbGVfbWF4W2kgLSAxXSArIDEgOiAwKTsKKwkJaWYgKGZyb20gPiBkZWNpbGVfbWF4W2ldKQorCQkJY29udGludWU7CisJCU5TX0lORk8oIk51bWJlciBvZiBlYnMgd2l0aCBlcmFzZSBjb3VudHMgZnJvbSAlbHUgdG8gJWx1IDogJWx1XG4iLAorCQkJZnJvbSwKKwkJCWRlY2lsZV9tYXhbaV0sCisJCQlkZWNpbGVzW2ldKTsKKwl9CisJTlNfSU5GTygiKioqIEVuZCBvZiBXZWFyIFJlcG9ydCAqKipcbiIpOworfQorCiAvKgogICogUmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mICdzdGF0ZScgc3RhdGUuCiAgKi8KQEAgLTgyMiw5ICsxMjEzLDMxIEBACiAJCU5TX0RCRygicmVhZF9wYWdlOiBwYWdlICVkIG5vdCBhbGxvY2F0ZWRcbiIsIG5zLT5yZWdzLnJvdyk7CiAJCW1lbXNldChucy0+YnVmLmJ5dGUsIDB4RkYsIG51bSk7CiAJfSBlbHNlIHsKKwkJdW5zaWduZWQgaW50IHBhZ2Vfbm8gPSBucy0+cmVncy5yb3c7CiAJCU5TX0RCRygicmVhZF9wYWdlOiBwYWdlICVkIGFsbG9jYXRlZCwgcmVhZGluZyBmcm9tICVkXG4iLAogCQkJbnMtPnJlZ3Mucm93LCBucy0+cmVncy5jb2x1bW4gKyBucy0+cmVncy5vZmYpOworCQlpZiAocmVhZF9lcnJvcihwYWdlX25vKSkgeworCQkJaW50IGk7CisJCQltZW1zZXQobnMtPmJ1Zi5ieXRlLCAweEZGLCBudW0pOworCQkJZm9yIChpID0gMDsgaSA8IG51bTsgKytpKQorCQkJCW5zLT5idWYuYnl0ZVtpXSA9IHJhbmRvbTMyKCk7CisJCQlOU19XQVJOKCJzaW11bGF0aW5nIHJlYWQgZXJyb3IgaW4gcGFnZSAldVxuIiwgcGFnZV9ubyk7CisJCQlyZXR1cm47CisJCX0KIAkJbWVtY3B5KG5zLT5idWYuYnl0ZSwgTlNfUEFHRV9CWVRFX09GRihucyksIG51bSk7CisJCWlmIChiaXRmbGlwcyAmJiByYW5kb20zMigpIDwgKDEgPDwgMjIpKSB7CisJCQlpbnQgZmxpcHMgPSAxOworCQkJaWYgKGJpdGZsaXBzID4gMSkKKwkJCQlmbGlwcyA9IChyYW5kb20zMigpICUgKGludCkgYml0ZmxpcHMpICsgMTsKKwkJCXdoaWxlIChmbGlwcy0tKSB7CisJCQkJaW50IHBvcyA9IHJhbmRvbTMyKCkgJSAobnVtICogOCk7CisJCQkJbnMtPmJ1Zi5ieXRlW3BvcyAvIDhdIF49ICgxIDw8IChwb3MgJSA4KSk7CisJCQkJTlNfV0FSTigicmVhZF9wYWdlOiBmbGlwcGluZyBiaXQgJWQgaW4gcGFnZSAlZCAiCisJCQkJCSJyZWFkaW5nIGZyb20gJWQgZWNjOiBjb3JyZWN0ZWQ9JXUgZmFpbGVkPSV1XG4iLAorCQkJCQlwb3MsIG5zLT5yZWdzLnJvdywgbnMtPnJlZ3MuY29sdW1uICsgbnMtPnJlZ3Mub2ZmLAorCQkJCQluc210ZC0+ZWNjX3N0YXRzLmNvcnJlY3RlZCwgbnNtdGQtPmVjY19zdGF0cy5mYWlsZWQpOworCQkJfQorCQl9CiAJfQogfQogCkBAIC04ODMsNiArMTI5Niw3IEBACiB7CiAJaW50IG51bTsKIAlpbnQgYnVzZGl2ID0gbnMtPmJ1c3cgPT0gOCA/IDEgOiAyOworCXVuc2lnbmVkIGludCBlcmFzZV9ibG9ja19ubywgcGFnZV9ubzsKIAogCWFjdGlvbiAmPSBBQ1RJT05fTUFTSzsKIApAQCAtOTQyLDE0ICsxMzU2LDI0IEBACiAJCQkJOCAqIChucy0+Z2VvbS5wZ2FkZHJieXRlcyAtIG5zLT5nZW9tLnNlY2FkZHJieXRlcykpIHwgbnMtPnJlZ3MuY29sdW1uOwogCQlucy0+cmVncy5jb2x1bW4gPSAwOwogCisJCWVyYXNlX2Jsb2NrX25vID0gbnMtPnJlZ3Mucm93ID4+IChucy0+Z2VvbS5zZWNzaGlmdCAtIG5zLT5nZW9tLnBnc2hpZnQpOworCiAJCU5TX0RCRygiZG9fc3RhdGVfYWN0aW9uOiBlcmFzZSBzZWN0b3IgYXQgYWRkcmVzcyAlI3gsIG9mZiA9ICVkXG4iLAogCQkJCW5zLT5yZWdzLnJvdywgTlNfUkFXX09GRlNFVChucykpOwotCQlOU19MT0coImVyYXNlIHNlY3RvciAlZFxuIiwgbnMtPnJlZ3Mucm93ID4+IChucy0+Z2VvbS5zZWNzaGlmdCAtIG5zLT5nZW9tLnBnc2hpZnQpKTsKKwkJTlNfTE9HKCJlcmFzZSBzZWN0b3IgJXVcbiIsIGVyYXNlX2Jsb2NrX25vKTsKIAogCQllcmFzZV9zZWN0b3IobnMpOwogCiAJCU5TX01ERUxBWShlcmFzZV9kZWxheSk7CiAKKwkJaWYgKGVyYXNlX2Jsb2NrX3dlYXIpCisJCQl1cGRhdGVfd2VhcihlcmFzZV9ibG9ja19ubyk7CisKKwkJaWYgKGVyYXNlX2Vycm9yKGVyYXNlX2Jsb2NrX25vKSkgeworCQkJTlNfV0FSTigic2ltdWxhdGluZyBlcmFzZSBmYWlsdXJlIGluIGVyYXNlIGJsb2NrICV1XG4iLCBlcmFzZV9ibG9ja19ubyk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwogCQlicmVhazsKIAogCWNhc2UgQUNUSU9OX1BSR1BBR0U6CkBAIC05NzIsNiArMTM5Niw4IEBACiAJCWlmIChwcm9nX3BhZ2UobnMsIG51bSkgPT0gLTEpCiAJCQlyZXR1cm4gLTE7CiAKKwkJcGFnZV9ubyA9IG5zLT5yZWdzLnJvdzsKKwogCQlOU19EQkcoImRvX3N0YXRlX2FjdGlvbjogY29weSAlZCBieXRlcyBmcm9tIGludCBidWYgdG8gKCUjeCwgJSN4KSwgcmF3IG9mZiA9ICVkXG4iLAogCQkJbnVtLCBucy0+cmVncy5yb3csIG5zLT5yZWdzLmNvbHVtbiwgTlNfUkFXX09GRlNFVChucykgKyBucy0+cmVncy5vZmYpOwogCQlOU19MT0coInByb2dyYW1tIHBhZ2UgJWRcbiIsIG5zLT5yZWdzLnJvdyk7CkBAIC05NzksNiArMTQwNSwxMSBAQAogCQlOU19VREVMQVkocHJvZ3JhbW1fZGVsYXkpOwogCQlOU19VREVMQVkob3V0cHV0X2N5Y2xlICogbnMtPmdlb20ucGdzeiAvIDEwMDAgLyBidXNkaXYpOwogCisJCWlmICh3cml0ZV9lcnJvcihwYWdlX25vKSkgeworCQkJTlNfV0FSTigic2ltdWxhdGluZyB3cml0ZSBmYWlsdXJlIGluIHBhZ2UgJXVcbiIsIHBhZ2Vfbm8pOworCQkJcmV0dXJuIC0xOworCQl9CisKIAkJYnJlYWs7CiAKIAljYXNlIEFDVElPTl9aRVJPT0ZGOgpAQCAtMTUwMyw3ICsxOTM0LDcgQEAKIHsKIAlzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwOwogCXN0cnVjdCBuYW5kc2ltICpuYW5kOwotCWludCByZXR2YWwgPSAtRU5PTUVNOworCWludCByZXR2YWwgPSAtRU5PTUVNLCBpOwogCiAJaWYgKGJ1c193aWR0aCAhPSA4ICYmIGJ1c193aWR0aCAhPSAxNikgewogCQlOU19FUlIoIndyb25nIGJ1cyB3aWR0aCAoJWQpLCB1c2Ugb25seSA4IG9yIDE2XG4iLCBidXNfd2lkdGgpOwpAQCAtMTUzMyw2ICsxOTY0LDggQEAKIAljaGlwLT52ZXJpZnlfYnVmID0gbnNfbmFuZF92ZXJpZnlfYnVmOwogCWNoaXAtPnJlYWRfd29yZCAgPSBuc19uYW5kX3JlYWRfd29yZDsKIAljaGlwLT5lY2MubW9kZSAgID0gTkFORF9FQ0NfU09GVDsKKwkvKiBUaGUgTkFORF9TS0lQX0JCVFNDQU4gb3B0aW9uIGlzIG5lY2Vzc2FyeSBmb3IgJ292ZXJyaWRlc2l6ZScgKi8KKwkvKiBhbmQgJ2JhZGJsb2NrcycgcGFyYW1ldGVycyB0byB3b3JrICovCiAJY2hpcC0+b3B0aW9ucyAgIHw9IE5BTkRfU0tJUF9CQlRTQ0FOOwogCiAJLyoKQEAgLTE1NTcsNiArMTk5MCwxNSBAQAogCiAJbnNtdGQtPm93bmVyID0gVEhJU19NT0RVTEU7CiAKKwlpZiAoKHJldHZhbCA9IHBhcnNlX3dlYWtibG9ja3MoKSkgIT0gMCkKKwkJZ290byBlcnJvcjsKKworCWlmICgocmV0dmFsID0gcGFyc2Vfd2Vha3BhZ2VzKCkpICE9IDApCisJCWdvdG8gZXJyb3I7CisKKwlpZiAoKHJldHZhbCA9IHBhcnNlX2dyYXZlcGFnZXMoKSkgIT0gMCkKKwkJZ290byBlcnJvcjsKKwogCWlmICgocmV0dmFsID0gbmFuZF9zY2FuKG5zbXRkLCAxKSkgIT0gMCkgewogCQlOU19FUlIoImNhbid0IHJlZ2lzdGVyIE5BTkQgU2ltdWxhdG9yXG4iKTsKIAkJaWYgKHJldHZhbCA+IDApCkBAIC0xNTY0LDIzICsyMDA2LDQ0IEBACiAJCWdvdG8gZXJyb3I7CiAJfQogCi0JaWYgKChyZXR2YWwgPSBpbml0X25hbmRzaW0obnNtdGQpKSAhPSAwKSB7Ci0JCU5TX0VSUigic2Nhbl9iYnQ6IGNhbid0IGluaXRpYWxpemUgdGhlIG5hbmRzaW0gc3RydWN0dXJlXG4iKTsKLQkJZ290byBlcnJvcjsKKwlpZiAob3ZlcnJpZGVzaXplKSB7CisJCXVfaW50MzJfdCBuZXdfc2l6ZSA9IG5zbXRkLT5lcmFzZXNpemUgPDwgb3ZlcnJpZGVzaXplOworCQlpZiAobmV3X3NpemUgPj4gb3ZlcnJpZGVzaXplICE9IG5zbXRkLT5lcmFzZXNpemUpIHsKKwkJCU5TX0VSUigib3ZlcnJpZGVzaXplIGlzIHRvbyBiaWdcbiIpOworCQkJZ290byBlcnJfZXhpdDsKKwkJfQorCQkvKiBOLkIuIFRoaXMgcmVsaWVzIG9uIG5hbmRfc2NhbiBub3QgZG9pbmcgYW55dGhpbmcgd2l0aCB0aGUgc2l6ZSBiZWZvcmUgd2UgY2hhbmdlIGl0ICovCisJCW5zbXRkLT5zaXplID0gbmV3X3NpemU7CisJCWNoaXAtPmNoaXBzaXplID0gbmV3X3NpemU7CisJCWNoaXAtPmNoaXBfc2hpZnQgPSBmZnMobmV3X3NpemUpIC0gMTsKIAl9CiAKLQlpZiAoKHJldHZhbCA9IG5hbmRfZGVmYXVsdF9iYnQobnNtdGQpKSAhPSAwKSB7Ci0JCWZyZWVfbmFuZHNpbShuYW5kKTsKLQkJZ290byBlcnJvcjsKLQl9CisJaWYgKChyZXR2YWwgPSBzZXR1cF93ZWFyX3JlcG9ydGluZyhuc210ZCkpICE9IDApCisJCWdvdG8gZXJyX2V4aXQ7CiAKLQkvKiBSZWdpc3RlciBOQU5EIGFzIG9uZSBiaWcgcGFydGl0aW9uICovCi0JYWRkX210ZF9wYXJ0aXRpb25zKG5zbXRkLCAmbmFuZC0+cGFydCwgMSk7CisJaWYgKChyZXR2YWwgPSBpbml0X25hbmRzaW0obnNtdGQpKSAhPSAwKQorCQlnb3RvIGVycl9leGl0OworCisJaWYgKChyZXR2YWwgPSBwYXJzZV9iYWRibG9ja3MobmFuZCwgbnNtdGQpKSAhPSAwKQorCQlnb3RvIGVycl9leGl0OworCisJaWYgKChyZXR2YWwgPSBuYW5kX2RlZmF1bHRfYmJ0KG5zbXRkKSkgIT0gMCkKKwkJZ290byBlcnJfZXhpdDsKKworCS8qIFJlZ2lzdGVyIE5BTkQgcGFydGl0aW9ucyAqLworCWlmICgocmV0dmFsID0gYWRkX210ZF9wYXJ0aXRpb25zKG5zbXRkLCAmbmFuZC0+cGFydGl0aW9uc1swXSwgbmFuZC0+bmJwYXJ0cykpICE9IDApCisJCWdvdG8gZXJyX2V4aXQ7CiAKICAgICAgICAgcmV0dXJuIDA7CiAKK2Vycl9leGl0OgorCWZyZWVfbmFuZHNpbShuYW5kKTsKKwluYW5kX3JlbGVhc2UobnNtdGQpOworCWZvciAoaSA9IDA7aSA8IEFSUkFZX1NJWkUobmFuZC0+cGFydGl0aW9ucyk7ICsraSkKKwkJa2ZyZWUobmFuZC0+cGFydGl0aW9uc1tpXS5uYW1lKTsKIGVycm9yOgogCWtmcmVlKG5zbXRkKTsKKwlmcmVlX2xpc3RzKCk7CiAKIAlyZXR1cm4gcmV0dmFsOwogfQpAQCAtMTU5MywxMCArMjA1NiwxNCBAQAogc3RhdGljIHZvaWQgX19leGl0IG5zX2NsZWFudXBfbW9kdWxlKHZvaWQpCiB7CiAJc3RydWN0IG5hbmRzaW0gKm5zID0gKHN0cnVjdCBuYW5kc2ltICopKCgoc3RydWN0IG5hbmRfY2hpcCAqKW5zbXRkLT5wcml2KS0+cHJpdik7CisJaW50IGk7CiAKIAlmcmVlX25hbmRzaW0obnMpOyAgICAvKiBGcmVlIG5hbmRzaW0gcHJpdmF0ZSByZXNvdXJjZXMgKi8KLQluYW5kX3JlbGVhc2UobnNtdGQpOyAvKiBVbnJlZ2lzdGVyZCBkcml2ZWQgKi8KKwluYW5kX3JlbGVhc2UobnNtdGQpOyAvKiBVbnJlZ2lzdGVyIGRyaXZlciAqLworCWZvciAoaSA9IDA7aSA8IEFSUkFZX1NJWkUobnMtPnBhcnRpdGlvbnMpOyArK2kpCisJCWtmcmVlKG5zLT5wYXJ0aXRpb25zW2ldLm5hbWUpOwogCWtmcmVlKG5zbXRkKTsgICAgICAgIC8qIEZyZWUgb3RoZXIgc3RydWN0dXJlcyAqLworCWZyZWVfbGlzdHMoKTsKIH0KIAogbW9kdWxlX2V4aXQobnNfY2xlYW51cF9tb2R1bGUpOwpAQCAtMTYwNCw0ICsyMDcxLDMgQEAKIE1PRFVMRV9MSUNFTlNFICgiR1BMIik7CiBNT0RVTEVfQVVUSE9SICgiQXJ0ZW0gQi4gQml0eXVja2l5Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04gKCJUaGUgTkFORCBmbGFzaCBzaW11bGF0b3IiKTsKLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvb25lbmFuZC9LY29uZmlnIGIvZHJpdmVycy9tdGQvb25lbmFuZC9LY29uZmlnCmluZGV4IDM3M2JkZGMuLmMyNTdkMzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL29uZW5hbmQvS2NvbmZpZworKysgYi9kcml2ZXJzL210ZC9vbmVuYW5kL0tjb25maWcKQEAgLTIsMjAgKzIsMTggQEAKICMgbGludXgvZHJpdmVycy9tdGQvb25lbmFuZC9LY29uZmlnCiAjCiAKLW1lbnUgIk9uZU5BTkQgRmxhc2ggRGV2aWNlIERyaXZlcnMiCi0JZGVwZW5kcyBvbiBNVEQgIT0gbgotCi1jb25maWcgTVREX09ORU5BTkQKK21lbnVjb25maWcgTVREX09ORU5BTkQKIAl0cmlzdGF0ZSAiT25lTkFORCBEZXZpY2UgU3VwcG9ydCIKIAlkZXBlbmRzIG9uIE1URAogCWhlbHAKIAkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciBhY2Nlc3NpbmcgYWxsIHR5cGUgb2YgT25lTkFORCBmbGFzaAogCSAgZGV2aWNlcy4gRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gc2VlCi0JICA8aHR0cDovL3d3dy5zYW1zdW5nLmNvbS9Qcm9kdWN0cy9TZW1pY29uZHVjdG9yL0ZsYXNoL09uZU5BTkRfVE0vaW5kZXguaHRtPi4KKwkgIDxodHRwOi8vd3d3LnNhbXN1bmcuY29tL1Byb2R1Y3RzL1NlbWljb25kdWN0b3IvT25lTkFORC9pbmRleC5odG0+CisKK2lmIE1URF9PTkVOQU5ECiAKIGNvbmZpZyBNVERfT05FTkFORF9WRVJJRllfV1JJVEUKIAlib29sICJWZXJpZnkgT25lTkFORCBwYWdlIHdyaXRlcyIKLQlkZXBlbmRzIG9uIE1URF9PTkVOQU5ECiAJaGVscAogCSAgVGhpcyBhZGRzIGFuIGV4dHJhIGNoZWNrIHdoZW4gZGF0YSBpcyB3cml0dGVuIHRvIHRoZSBmbGFzaC4gVGhlCiAJICBPbmVOQU5EIGZsYXNoIGRldmljZSBpbnRlcm5hbGx5IGNoZWNrcyBvbmx5IGJpdHMgdHJhbnNpdGlvbmluZwpAQCAtMjUsMTMgKzIzLDEyIEBACiAKIGNvbmZpZyBNVERfT05FTkFORF9HRU5FUklDCiAJdHJpc3RhdGUgIk9uZU5BTkQgRmxhc2ggZGV2aWNlIHZpYSBwbGF0Zm9ybSBkZXZpY2UgZHJpdmVyIgotCWRlcGVuZHMgb24gTVREX09ORU5BTkQgJiYgQVJNCisJZGVwZW5kcyBvbiBBUk0KIAloZWxwCiAJICBTdXBwb3J0IGZvciBPbmVOQU5EIGZsYXNoIHZpYSBwbGF0Zm9ybSBkZXZpY2UgZHJpdmVyLgogCiBjb25maWcgTVREX09ORU5BTkRfT1RQCiAJYm9vbCAiT25lTkFORCBPVFAgU3VwcG9ydCIKLQlkZXBlbmRzIG9uIE1URF9PTkVOQU5ECiAJaGVscAogCSAgT25lIEJsb2NrIG9mIHRoZSBOQU5EIEZsYXNoIEFycmF5IG1lbW9yeSBpcyByZXNlcnZlZCBhcwogCSAgYSBPbmUtVGltZSBQcm9ncmFtbWFibGUgQmxvY2sgbWVtb3J5IGFyZWEuCkBAIC00Myw0ICs0MCw0IEBACiAKIAkgIE9UUCBibG9jayBpcyBmdWxseS1ndWFyYW50ZWVkIHRvIGJlIGEgdmFsaWQgYmxvY2suCiAKLWVuZG1lbnUKK2VuZGlmICMgTVREX09ORU5BTkQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL29uZW5hbmQvb25lbmFuZF9iYXNlLmMgYi9kcml2ZXJzL210ZC9vbmVuYW5kL29uZW5hbmRfYmFzZS5jCmluZGV4IDllMTRhMjYuLjAwMDc5NGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL29uZW5hbmQvb25lbmFuZF9iYXNlLmMKKysrIGIvZHJpdmVycy9tdGQvb25lbmFuZC9vbmVuYW5kX2Jhc2UuYwpAQCAtODM2LDkgKzgzNiwxMSBAQAogCWludCByZWFkY29sID0gY29sdW1uOwogCWludCByZWFkZW5kID0gY29sdW1uICsgdGhpc2xlbjsKIAlpbnQgbGFzdGdhcCA9IDA7CisJdW5zaWduZWQgaW50IGk7CiAJdWludDhfdCAqb29iX2J1ZiA9IHRoaXMtPm9vYl9idWY7CiAKLQlmb3IgKGZyZWUgPSB0aGlzLT5lY2NsYXlvdXQtPm9vYmZyZWU7IGZyZWUtPmxlbmd0aDsgKytmcmVlKSB7CisJZnJlZSA9IHRoaXMtPmVjY2xheW91dC0+b29iZnJlZTsKKwlmb3IgKGkgPSAwOyBpIDwgTVREX01BWF9PT0JGUkVFX0VOVFJJRVMgJiYgZnJlZS0+bGVuZ3RoOyBpKyssIGZyZWUrKykgewogCQlpZiAocmVhZGNvbCA+PSBsYXN0Z2FwKQogCQkJcmVhZGNvbCArPSBmcmVlLT5vZmZzZXQgLSBsYXN0Z2FwOwogCQlpZiAocmVhZGVuZCA+PSBsYXN0Z2FwKQpAQCAtODQ2LDcgKzg0OCw4IEBACiAJCWxhc3RnYXAgPSBmcmVlLT5vZmZzZXQgKyBmcmVlLT5sZW5ndGg7CiAJfQogCXRoaXMtPnJlYWRfYnVmZmVycmFtKG10ZCwgT05FTkFORF9TUEFSRVJBTSwgb29iX2J1ZiwgMCwgbXRkLT5vb2JzaXplKTsKLQlmb3IgKGZyZWUgPSB0aGlzLT5lY2NsYXlvdXQtPm9vYmZyZWU7IGZyZWUtPmxlbmd0aDsgKytmcmVlKSB7CisJZnJlZSA9IHRoaXMtPmVjY2xheW91dC0+b29iZnJlZTsKKwlmb3IgKGkgPSAwOyBpIDwgTVREX01BWF9PT0JGUkVFX0VOVFJJRVMgJiYgZnJlZS0+bGVuZ3RoOyBpKyssIGZyZWUrKykgewogCQlpbnQgZnJlZV9lbmQgPSBmcmVlLT5vZmZzZXQgKyBmcmVlLT5sZW5ndGg7CiAJCWlmIChmcmVlLT5vZmZzZXQgPCByZWFkZW5kICYmIGZyZWVfZW5kID4gcmVhZGNvbCkgewogCQkJaW50IHN0ID0gbWF4X3QoaW50LGZyZWUtPm9mZnNldCxyZWFkY29sKTsKQEAgLTg1NCw3ICs4NTcsNyBAQAogCQkJaW50IG4gPSBlZCAtIHN0OwogCQkJbWVtY3B5KGJ1Ziwgb29iX2J1ZiArIHN0LCBuKTsKIAkJCWJ1ZiArPSBuOwotCQl9IGVsc2UKKwkJfSBlbHNlIGlmIChjb2x1bW4gPT0gMCkKIAkJCWJyZWFrOwogCX0KIAlyZXR1cm4gMDsKQEAgLTEyODAsMTUgKzEyODMsMTggQEAKIAlpbnQgd3JpdGVjb2wgPSBjb2x1bW47CiAJaW50IHdyaXRlZW5kID0gY29sdW1uICsgdGhpc2xlbjsKIAlpbnQgbGFzdGdhcCA9IDA7CisJdW5zaWduZWQgaW50IGk7CiAKLQlmb3IgKGZyZWUgPSB0aGlzLT5lY2NsYXlvdXQtPm9vYmZyZWU7IGZyZWUtPmxlbmd0aDsgKytmcmVlKSB7CisJZnJlZSA9IHRoaXMtPmVjY2xheW91dC0+b29iZnJlZTsKKwlmb3IgKGkgPSAwOyBpIDwgTVREX01BWF9PT0JGUkVFX0VOVFJJRVMgJiYgZnJlZS0+bGVuZ3RoOyBpKyssIGZyZWUrKykgewogCQlpZiAod3JpdGVjb2wgPj0gbGFzdGdhcCkKIAkJCXdyaXRlY29sICs9IGZyZWUtPm9mZnNldCAtIGxhc3RnYXA7CiAJCWlmICh3cml0ZWVuZCA+PSBsYXN0Z2FwKQogCQkJd3JpdGVlbmQgKz0gZnJlZS0+b2Zmc2V0IC0gbGFzdGdhcDsKIAkJbGFzdGdhcCA9IGZyZWUtPm9mZnNldCArIGZyZWUtPmxlbmd0aDsKIAl9Ci0JZm9yIChmcmVlID0gdGhpcy0+ZWNjbGF5b3V0LT5vb2JmcmVlOyBmcmVlLT5sZW5ndGg7ICsrZnJlZSkgeworCWZyZWUgPSB0aGlzLT5lY2NsYXlvdXQtPm9vYmZyZWU7CisJZm9yIChpID0gMDsgaSA8IE1URF9NQVhfT09CRlJFRV9FTlRSSUVTICYmIGZyZWUtPmxlbmd0aDsgaSsrLCBmcmVlKyspIHsKIAkJaW50IGZyZWVfZW5kID0gZnJlZS0+b2Zmc2V0ICsgZnJlZS0+bGVuZ3RoOwogCQlpZiAoZnJlZS0+b2Zmc2V0IDwgd3JpdGVlbmQgJiYgZnJlZV9lbmQgPiB3cml0ZWNvbCkgewogCQkJaW50IHN0ID0gbWF4X3QoaW50LGZyZWUtPm9mZnNldCx3cml0ZWNvbCk7CkBAIC0xMjk2LDcgKzEzMDIsNyBAQAogCQkJaW50IG4gPSBlZCAtIHN0OwogCQkJbWVtY3B5KG9vYl9idWYgKyBzdCwgYnVmLCBuKTsKIAkJCWJ1ZiArPSBuOwotCQl9IGVsc2UKKwkJfSBlbHNlIGlmIChjb2x1bW4gPT0gMCkKIAkJCWJyZWFrOwogCX0KIAlyZXR1cm4gMDsKQEAgLTIzODYsNyArMjM5Miw4IEBACiAJICogdGhlIG91dCBvZiBiYW5kIGFyZWEKIAkgKi8KIAl0aGlzLT5lY2NsYXlvdXQtPm9vYmF2YWlsID0gMDsKLQlmb3IgKGkgPSAwOyB0aGlzLT5lY2NsYXlvdXQtPm9vYmZyZWVbaV0ubGVuZ3RoOyBpKyspCisJZm9yIChpID0gMDsgaSA8IE1URF9NQVhfT09CRlJFRV9FTlRSSUVTICYmCisJICAgIHRoaXMtPmVjY2xheW91dC0+b29iZnJlZVtpXS5sZW5ndGg7IGkrKykKIAkJdGhpcy0+ZWNjbGF5b3V0LT5vb2JhdmFpbCArPQogCQkJdGhpcy0+ZWNjbGF5b3V0LT5vb2JmcmVlW2ldLmxlbmd0aDsKIAltdGQtPm9vYmF2YWlsID0gdGhpcy0+ZWNjbGF5b3V0LT5vb2JhdmFpbDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL3ViaS9LY29uZmlnIGIvZHJpdmVycy9tdGQvdWJpL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjlkYWYxNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbXRkL3ViaS9LY29uZmlnCkBAIC0wLDAgKzEsNTggQEAKKyMgZHJpdmVycy9tdGQvdWJpL0tjb25maWcKKworbWVudSAiVUJJIC0gVW5zb3J0ZWQgYmxvY2sgaW1hZ2VzIgorCWRlcGVuZHMgb24gTVRECisKK2NvbmZpZyBNVERfVUJJCisJdHJpc3RhdGUgIkVuYWJsZSBVQkkiCisJZGVwZW5kcyBvbiBNVEQKKwlzZWxlY3QgQ1JDMzIKKwloZWxwCisJICBVQkkgaXMgYSBzb2Z0d2FyZSBsYXllciBhYm92ZSBNVEQgbGF5ZXIgd2hpY2ggYWRtaXRzIG9mIExWTS1saWtlCisJICBsb2dpY2FsIHZvbHVtZXMgb24gdG9wIG9mIE1URCBkZXZpY2VzLCBoaWRlcyBzb21lIGNvbXBsZXhpdGllcyBvZgorCSAgZmxhc2ggY2hpcHMgbGlrZSB3ZWFyIGFuZCBiYWQgYmxvY2tzIGFuZCBwcm92aWRlcyBzb21lIG90aGVyIHVzZWZ1bAorCSAgY2FwYWJpbGl0aWVzLiBQbGVhc2UsIGNvbnN1bHQgdGhlIE1URCB3ZWIgc2l0ZSBmb3IgbW9yZSBkZXRhaWxzCisJICAod3d3LmxpbnV4LW10ZC5pbmZyYWRlYWQub3JnKS4KKworY29uZmlnIE1URF9VQklfV0xfVEhSRVNIT0xECisJaW50ICJVQkkgd2Vhci1sZXZlbGluZyB0aHJlc2hvbGQiCisJZGVmYXVsdCA0MDk2CisJcmFuZ2UgMiA2NTUzNgorCWRlcGVuZHMgb24gTVREX1VCSQorCWhlbHAKKwkgIFRoaXMgcGFyYW1ldGVyIGRlZmluZXMgdGhlIG1heGltdW0gZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBoaWdoZXN0CisJICBlcmFzZSBjb3VudGVyIHZhbHVlIGFuZCB0aGUgbG93ZXN0IGVyYXNlIGNvdW50ZXIgdmFsdWUgb2YgZXJhc2VibG9ja3MKKwkgIG9mIFVCSSBkZXZpY2VzLiBXaGVuIHRoaXMgdGhyZXNob2xkIGlzIGV4Y2VlZGVkLCBVQkkgc3RhcnRzIHBlcmZvcm1pbmcKKwkgIHdlYXIgbGV2ZWxpbmcgYnkgbWVhbnMgb2YgbW92aW5nIGRhdGEgZnJvbSBlcmFzZWJsb2NrIHdpdGggbG93IGVyYXNlCisJICBjb3VudGVyIHRvIGVyYXNlYmxvY2tzIHdpdGggaGlnaCBlcmFzZSBjb3VudGVyLiBMZWF2ZSB0aGUgZGVmYXVsdAorCSAgdmFsdWUgaWYgdW5zdXJlLgorCitjb25maWcgTVREX1VCSV9CRUJfUkVTRVJWRQorCWludCAiUGVyY2VudGFnZSBvZiByZXNlcnZlZCBlcmFzZWJsb2NrcyBmb3IgYmFkIGVyYXNlYmxvY2tzIGhhbmRsaW5nIgorCWRlZmF1bHQgMQorCXJhbmdlIDAgMjUKKwlkZXBlbmRzIG9uIE1URF9VQkkKKwloZWxwCisJICBJZiB0aGUgTVREIGRldmljZSBhZG1pdHMgb2YgYmFkIGVyYXNlYmxvY2tzIChlLmcuIE5BTkQgZmxhc2gpLCBVQkkKKwkgIHJlc2VydmVzIHNvbWUgYW1vdW50IG9mIHBoeXNpY2FsIGVyYXNlYmxvY2tzIHRvIGhhbmRsZSBuZXcgYmFkCisJICBlcmFzZWJsb2Nrcy4gRm9yIGV4YW1wbGUsIGlmIGEgZmxhc2ggcGh5c2ljYWwgZXJhc2VibG9jayBiZWNvbWVzIGJhZCwKKwkgIFVCSSB1c2VzIHRoZXNlIHJlc2VydmVkIHBoeXNpY2FsIGVyYXNlYmxvY2tzIHRvIHJlbG9jYXRlIHRoZSBiYWQgb25lLgorCSAgVGhpcyBvcHRpb24gc3BlY2lmaWVzIGhvdyBtYW55IHBoeXNpY2FsIGVyYXNlYmxvY2tzIHdpbGwgYmUgcmVzZXJ2ZWQKKwkgIGZvciBiYWQgZXJhc2VibG9jayBoYW5kbGluZyAocGVyY2VudHMgb2YgdG90YWwgbnVtYmVyIG9mIGdvb2QgZmxhc2gKKwkgIGVyYXNlYmxvY2tzKS4gSWYgdGhlIHVuZGVybHlpbmcgZmxhc2ggZG9lcyBub3QgYWRtaXQgb2YgYmFkCisJICBlcmFzZWJsb2NrcyAoZS5nLiBOT1IgZmxhc2gpLCB0aGlzIHZhbHVlIGlzIGlnbm9yZWQgYW5kIG5vdGhpbmcgaXMKKwkgIHJlc2VydmVkLiBMZWF2ZSB0aGUgZGVmYXVsdCB2YWx1ZSBpZiB1bnN1cmUuCisKK2NvbmZpZyBNVERfVUJJX0dMVUVCSQorCWJvb2wgIkVtdWxhdGUgTVREIGRldmljZXMiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBNVERfVUJJCisJaGVscAorCSAgIFRoaXMgb3B0aW9uIGVuYWJsZXMgTVREIGRldmljZXMgZW11bGF0aW9uIG9uIHRvcCBvZiBVQkkgdm9sdW1lczogZm9yCisJICAgZWFjaCBVQkkgdm9sdW1lcyBhbiBNVEQgZGV2aWNlIGlzIGNyZWF0ZWQsIGFuZCBhbGwgSS9PIHRvIHRoaXMgTVRECisJICAgZGV2aWNlIGlzIHJlZGlyZWN0ZWQgdG8gdGhlIFVCSSB2b2x1bWUuIFRoaXMgaXMgaGFuZHkgdG8gbWFrZQorCSAgIE1URC1vcmllbnRlZCBzb2Z0d2FyZSAobGlrZSBKRkZTMikgd29yayBvbiB0b3Agb2YgVUJJLiBEbyBub3QgZW5hYmxlCisJICAgdGhpcyBpZiBubyBsZWdhY3kgc29mdHdhcmUgd2lsbCBiZSB1c2VkLgorCitzb3VyY2UgImRyaXZlcnMvbXRkL3ViaS9LY29uZmlnLmRlYnVnIgorZW5kbWVudQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvdWJpL0tjb25maWcuZGVidWcgYi9kcml2ZXJzL210ZC91YmkvS2NvbmZpZy5kZWJ1ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTJlZTIyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tdGQvdWJpL0tjb25maWcuZGVidWcKQEAgLTAsMCArMSwxMDQgQEAKK2NvbW1lbnQgIlVCSSBkZWJ1Z2dpbmcgb3B0aW9ucyIKKwlkZXBlbmRzIG9uIE1URF9VQkkKKworY29uZmlnIE1URF9VQklfREVCVUcKKwlib29sICJVQkkgZGVidWdnaW5nIgorCWRlcGVuZHMgb24gU1lTRlMKKwlkZXBlbmRzIG9uIE1URF9VQkkKKwlzZWxlY3QgREVCVUdfRlMKKwlzZWxlY3QgS0FMTFNZTVNfQUxMCisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBVQkkgZGVidWdnaW5nLgorCitjb25maWcgTVREX1VCSV9ERUJVR19NU0cKKwlib29sICJVQkkgZGVidWdnaW5nIG1lc3NhZ2VzIgorCWRlcGVuZHMgb24gTVREX1VCSV9ERUJVRworCWRlZmF1bHQgbgorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgVUJJIGRlYnVnZ2luZyBtZXNzYWdlcy4KKworY29uZmlnIE1URF9VQklfREVCVUdfUEFSQU5PSUQKKwlib29sICJFeHRyYSBzZWxmLWNoZWNrcyIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIE1URF9VQklfREVCVUcKKwloZWxwCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIGV4dHJhIGNoZWNrcyBpbiBVQkkgY29kZS4gTm90ZSB0aGlzIHNsb3dzIFVCSSBkb3duCisJICBzaWduaWZpY2FudGx5LgorCitjb25maWcgTVREX1VCSV9ERUJVR19ESVNBQkxFX0JHVAorCWJvb2wgIkRvIG5vdCBlbmFibGUgdGhlIFVCSSBiYWNrZ3JvdW5kIHRocmVhZCIKKwlkZXBlbmRzIG9uIE1URF9VQklfREVCVUcKKwlkZWZhdWx0IG4KKwloZWxwCisJICBUaGlzIG9wdGlvbiBzd2l0Y2hlcyB0aGUgYmFja2dyb3VuZCB0aHJlYWQgb2ZmIGJ5IGRlZmF1bHQuIFRoZSB0aHJlYWQKKwkgIG1heSBiZSBhbHNvIGJlIGVuYWJsZWQvZGlzYWJsZWQgdmlhIFVCSSBzeXNmcy4KKworY29uZmlnIE1URF9VQklfREVCVUdfVVNFUlNQQUNFX0lPCisJYm9vbCAiRGlyZWN0IHVzZXItc3BhY2Ugd3JpdGUvZXJhc2Ugc3VwcG9ydCIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIE1URF9VQklfREVCVUcKKwloZWxwCisJICBCeSBkZWZhdWx0LCB1c2VycyBjYW5ub3QgZGlyZWN0bHkgd3JpdGUgYW5kIGVyYXNlIGluZGl2aWR1YWwKKwkgIGVyYXNlYmxvY2tzIG9mIGR5bmFtaWMgdm9sdW1lcywgYW5kIGhhdmUgdG8gdXNlIHVwZGF0ZSBvcGVyYXRpb24KKwkgIGluc3RlYWQuIFRoaXMgb3B0aW9uIGVuYWJsZXMgdGhpcyBjYXBhYmlsaXR5IC0gaXQgaXMgdmVyeSB1c2VmdWwgZm9yCisJICBkZWJ1Z2dpbmcgYW5kIHRlc3RpbmcuCisKK2NvbmZpZyBNVERfVUJJX0RFQlVHX0VNVUxBVEVfQklURkxJUFMKKwlib29sICJFbXVsYXRlIGZsYXNoIGJpdC1mbGlwcyIKKwlkZXBlbmRzIG9uIE1URF9VQklfREVCVUcKKwlkZWZhdWx0IG4KKwloZWxwCisJICBUaGlzIG9wdGlvbiBlbXVsYXRlcyBiaXQtZmxpcHMgd2l0aCBwcm9iYWJpbGl0eSAxLzUwLCB3aGljaCBpbiB0dXJuCisJICBjYXVzZXMgc2NydWJiaW5nLiBVc2VmdWwgZm9yIGRlYnVnZ2luZyBhbmQgc3RyZXNzaW5nIFVCSS4KKworY29uZmlnIE1URF9VQklfREVCVUdfRU1VTEFURV9XUklURV9GQUlMVVJFUworCWJvb2wgIkVtdWxhdGUgZmxhc2ggd3JpdGUgZmFpbHVyZXMiCisJZGVwZW5kcyBvbiBNVERfVUJJX0RFQlVHCisJZGVmYXVsdCBuCisJaGVscAorCSAgVGhpcyBvcHRpb24gZW11bGF0ZXMgd3JpdGUgZmFpbHVyZXMgd2l0aCBwcm9iYWJpbGl0eSAxLzEwMC4gVXNlZnVsIGZvcgorCSAgZGVidWdnaW5nIGFuZCB0ZXN0aW5nIGhvdyBVQkkgaGFuZGxpbmVzIGVycm9ycy4KKworY29uZmlnIE1URF9VQklfREVCVUdfRU1VTEFURV9FUkFTRV9GQUlMVVJFUworCWJvb2wgIkVtdWxhdGUgZmxhc2ggZXJhc2UgZmFpbHVyZXMiCisJZGVwZW5kcyBvbiBNVERfVUJJX0RFQlVHCisJZGVmYXVsdCBuCisJaGVscAorCSAgVGhpcyBvcHRpb24gZW11bGF0ZXMgZXJhc2UgZmFpbHVyZXMgd2l0aCBwcm9iYWJpbGl0eSAxLzEwMC4gVXNlZnVsIGZvcgorCSAgZGVidWdnaW5nIGFuZCB0ZXN0aW5nIGhvdyBVQkkgaGFuZGxpbmVzIGVycm9ycy4KKworbWVudSAiQWRkaXRpb25hbCBVQkkgZGVidWdnaW5nIG1lc3NhZ2VzIgorCWRlcGVuZHMgb24gTVREX1VCSV9ERUJVRworCitjb25maWcgTVREX1VCSV9ERUJVR19NU0dfQkxECisJYm9vbCAiQWRkaXRpb25hbCBVQkkgaW5pdGlhbGl6YXRpb24gYW5kIGJ1aWxkIG1lc3NhZ2VzIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gTVREX1VCSV9ERUJVRworCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgZGV0YWlsZWQgVUJJIGluaXRpYWxpemF0aW9uIGFuZCBkZXZpY2UgYnVpbGQKKwkgIGRlYnVnZ2luZyBtZXNzYWdlcy4KKworY29uZmlnIE1URF9VQklfREVCVUdfTVNHX0VCQQorCWJvb2wgIkVyYXNlYmxvY2sgYXNzb2NpYXRpb24gdW5pdCBtZXNzYWdlcyIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIE1URF9VQklfREVCVUcKKwloZWxwCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIGRlYnVnZ2luZyBtZXNzYWdlcyBmcm9tIHRoZSBVQkkgZXJhc2VibG9jaworCSAgYXNzb2NpYXRpb24gdW5pdC4KKworY29uZmlnIE1URF9VQklfREVCVUdfTVNHX1dMCisJYm9vbCAiV2Vhci1sZXZlbGluZyB1bml0IG1lc3NhZ2VzIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gTVREX1VCSV9ERUJVRworCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgZGVidWdnaW5nIG1lc3NhZ2VzIGZyb20gdGhlIFVCSSB3ZWFyLWxldmVsaW5nCisJICB1bml0LgorCitjb25maWcgTVREX1VCSV9ERUJVR19NU0dfSU8KKwlib29sICJJbnB1dC9vdXRwdXQgdW5pdCBtZXNzYWdlcyIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIE1URF9VQklfREVCVUcKKwloZWxwCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIGRlYnVnZ2luZyBtZXNzYWdlcyBmcm9tIHRoZSBVQkkgaW5wdXQvb3V0cHV0IHVuaXQuCisKK2VuZG1lbnUgIyBVQkkgZGVidWdnaW5nIG1lc3NhZ2VzCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC91YmkvTWFrZWZpbGUgYi9kcml2ZXJzL210ZC91YmkvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ4MzRlMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbXRkL3ViaS9NYWtlZmlsZQpAQCAtMCwwICsxLDcgQEAKK29iai0kKENPTkZJR19NVERfVUJJKSArPSB1YmkubworCit1YmkteSArPSB2dGJsLm8gdm10Lm8gdXBkLm8gYnVpbGQubyBjZGV2Lm8ga2FwaS5vIGViYS5vIGlvLm8gd2wubyBzY2FuLm8KK3ViaS15ICs9IG1pc2MubworCit1YmktJChDT05GSUdfTVREX1VCSV9ERUJVRykgKz0gZGVidWcubwordWJpLSQoQ09ORklHX01URF9VQklfR0xVRUJJKSArPSBnbHVlYmkubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvdWJpL2J1aWxkLmMgYi9kcml2ZXJzL210ZC91YmkvYnVpbGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTVkNTk0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tdGQvdWJpL2J1aWxkLmMKQEAgLTAsMCArMSw4NDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4sIDIwMDYKKyAqIENvcHlyaWdodCAoYykgTm9raWEgQ29ycG9yYXRpb24sIDIwMDcKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlCisgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICogQXV0aG9yOiBBcnRlbSBCaXR5dXRza2l5ICjQkdC40YLRjtGG0LrQuNC5INCQ0YDRgtGR0LwpLAorICogICAgICAgICBGcmFuayBIYXZlcmthbXAKKyAqLworCisvKgorICogVGhpcyBmaWxlIGluY2x1ZGVzIFVCSSBpbml0aWFsaXphdGlvbiBhbmQgYnVpbGRpbmcgb2YgVUJJIGRldmljZXMuIEF0IHRoZQorICogbW9tZW50IFVCSSBkZXZpY2VzIG1heSBvbmx5IGJlIGFkZGVkIHdoaWxlIFVCSSBpcyBpbml0aWFsaXplZCwgYnV0IGR5bmFtaWMKKyAqIGRldmljZSBhZGQvcmVtb3ZlIGZ1bmN0aW9uYWxpdHkgaXMgcGxhbm5lZC4gQWxzbywgYXQgdGhlIG1vbWVudCB3ZSBvbmx5CisgKiBhdHRhY2ggVUJJIGRldmljZXMgYnkgc2Nhbm5pbmcsIHdoaWNoIHdpbGwgYmVjb21lIGEgYm90dGxlbmVjayB3aGVuIGZsYXNoZXMKKyAqIHJlYWNoIGNlcnRhaW4gbGFyZ2Ugc2l6ZS4gVGhlbiBvbmUgbWF5IGltcHJvdmUgVUJJIGFuZCBhZGQgb3RoZXIgbWV0aG9kcy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmdpZnkuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSAidWJpLmgiCisKKy8qIE1heGltdW0gbGVuZ3RoIG9mIHRoZSAnbXRkPScgcGFyYW1ldGVyICovCisjZGVmaW5lIE1URF9QQVJBTV9MRU5fTUFYIDY0CisKKy8qKgorICogc3RydWN0IG10ZF9kZXZfcGFyYW0gLSBNVEQgZGV2aWNlIHBhcmFtZXRlciBkZXNjcmlwdGlvbiBkYXRhIHN0cnVjdHVyZS4KKyAqIEBuYW1lOiBNVEQgZGV2aWNlIG5hbWUgb3IgbnVtYmVyIHN0cmluZworICogQHZpZF9oZHJfb2ZmczogVklEIGhlYWRlciBvZmZzZXQKKyAqIEBkYXRhX29mZnM6IGRhdGEgb2Zmc2V0CisgKi8KK3N0cnVjdCBtdGRfZGV2X3BhcmFtCit7CisJY2hhciBuYW1lW01URF9QQVJBTV9MRU5fTUFYXTsKKwlpbnQgdmlkX2hkcl9vZmZzOworCWludCBkYXRhX29mZnM7Cit9OworCisvKiBOdW1iZXJzIG9mIGVsZW1lbnRzIHNldCBpbiB0aGUgQG10ZF9kZXZfcGFyYW0gYXJyYXkgKi8KK3N0YXRpYyBpbnQgbXRkX2RldnMgPSAwOworCisvKiBNVEQgZGV2aWNlcyBzcGVjaWZpY2F0aW9uIHBhcmFtZXRlcnMgKi8KK3N0YXRpYyBzdHJ1Y3QgbXRkX2Rldl9wYXJhbSBtdGRfZGV2X3BhcmFtW1VCSV9NQVhfREVWSUNFU107CisKKy8qIE51bWJlciBvZiBVQkkgZGV2aWNlcyBpbiBzeXN0ZW0gKi8KK2ludCB1YmlfZGV2aWNlc19jbnQ7CisKKy8qIEFsbCBVQkkgZGV2aWNlcyBpbiBzeXN0ZW0gKi8KK3N0cnVjdCB1YmlfZGV2aWNlICp1YmlfZGV2aWNlc1tVQklfTUFYX0RFVklDRVNdOworCisvKiBSb290IFVCSSAiY2xhc3MiIG9iamVjdCAoY29ycmVzcG9uZHMgdG8gJy88c3lzZnM+L2NsYXNzL3ViaS8nKSAqLworc3RydWN0IGNsYXNzICp1YmlfY2xhc3M7CisKKy8qICJTaG93IiBtZXRob2QgZm9yIGZpbGVzIGluICcvPHN5c2ZzPi9jbGFzcy91YmkvJyAqLworc3RhdGljIHNzaXplX3QgdWJpX3ZlcnNpb25fc2hvdyhzdHJ1Y3QgY2xhc3MgKmNsYXNzLCBjaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIFVCSV9WRVJTSU9OKTsKK30KKworLyogVUJJIHZlcnNpb24gYXR0cmlidXRlICgnLzxzeXNmcz4vY2xhc3MvdWJpL3ZlcnNpb24nKSAqLworc3RhdGljIHN0cnVjdCBjbGFzc19hdHRyaWJ1dGUgdWJpX3ZlcnNpb24gPQorCV9fQVRUUih2ZXJzaW9uLCBTX0lSVUdPLCB1YmlfdmVyc2lvbl9zaG93LCBOVUxMKTsKKworc3RhdGljIHNzaXplX3QgZGV2X2F0dHJpYnV0ZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpOworCisvKiBVQkkgZGV2aWNlIGF0dHJpYnV0ZXMgKGNvcnJlc3BvbmQgdG8gZmlsZXMgaW4gJy88c3lzZnM+L2NsYXNzL3ViaS91YmlYJykgKi8KK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBkZXZfZXJhc2VibG9ja19zaXplID0KKwlfX0FUVFIoZXJhc2VibG9ja19zaXplLCBTX0lSVUdPLCBkZXZfYXR0cmlidXRlX3Nob3csIE5VTEwpOworc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGRldl9hdmFpbF9lcmFzZWJsb2NrcyA9CisJX19BVFRSKGF2YWlsX2VyYXNlYmxvY2tzLCBTX0lSVUdPLCBkZXZfYXR0cmlidXRlX3Nob3csIE5VTEwpOworc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGRldl90b3RhbF9lcmFzZWJsb2NrcyA9CisJX19BVFRSKHRvdGFsX2VyYXNlYmxvY2tzLCBTX0lSVUdPLCBkZXZfYXR0cmlidXRlX3Nob3csIE5VTEwpOworc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGRldl92b2x1bWVzX2NvdW50ID0KKwlfX0FUVFIodm9sdW1lc19jb3VudCwgU19JUlVHTywgZGV2X2F0dHJpYnV0ZV9zaG93LCBOVUxMKTsKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBkZXZfbWF4X2VjID0KKwlfX0FUVFIobWF4X2VjLCBTX0lSVUdPLCBkZXZfYXR0cmlidXRlX3Nob3csIE5VTEwpOworc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGRldl9yZXNlcnZlZF9mb3JfYmFkID0KKwlfX0FUVFIocmVzZXJ2ZWRfZm9yX2JhZCwgU19JUlVHTywgZGV2X2F0dHJpYnV0ZV9zaG93LCBOVUxMKTsKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBkZXZfYmFkX3BlYl9jb3VudCA9CisJX19BVFRSKGJhZF9wZWJfY291bnQsIFNfSVJVR08sIGRldl9hdHRyaWJ1dGVfc2hvdywgTlVMTCk7CitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2X21heF92b2xfY291bnQgPQorCV9fQVRUUihtYXhfdm9sX2NvdW50LCBTX0lSVUdPLCBkZXZfYXR0cmlidXRlX3Nob3csIE5VTEwpOworc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGRldl9taW5faW9fc2l6ZSA9CisJX19BVFRSKG1pbl9pb19zaXplLCBTX0lSVUdPLCBkZXZfYXR0cmlidXRlX3Nob3csIE5VTEwpOworc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGRldl9iZ3RfZW5hYmxlZCA9CisJX19BVFRSKGJndF9lbmFibGVkLCBTX0lSVUdPLCBkZXZfYXR0cmlidXRlX3Nob3csIE5VTEwpOworCisvKiAiU2hvdyIgbWV0aG9kIGZvciBmaWxlcyBpbiAnLzxzeXNmcz4vY2xhc3MvdWJpL3ViaVgvJyAqLworc3RhdGljIHNzaXplX3QgZGV2X2F0dHJpYnV0ZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJY29uc3Qgc3RydWN0IHViaV9kZXZpY2UgKnViaTsKKworCXViaSA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCB1YmlfZGV2aWNlLCBkZXYpOworCWlmIChhdHRyID09ICZkZXZfZXJhc2VibG9ja19zaXplKQorCQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgdWJpLT5sZWJfc2l6ZSk7CisJZWxzZSBpZiAoYXR0ciA9PSAmZGV2X2F2YWlsX2VyYXNlYmxvY2tzKQorCQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgdWJpLT5hdmFpbF9wZWJzKTsKKwllbHNlIGlmIChhdHRyID09ICZkZXZfdG90YWxfZXJhc2VibG9ja3MpCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB1YmktPmdvb2RfcGViX2NvdW50KTsKKwllbHNlIGlmIChhdHRyID09ICZkZXZfdm9sdW1lc19jb3VudCkKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHViaS0+dm9sX2NvdW50KTsKKwllbHNlIGlmIChhdHRyID09ICZkZXZfbWF4X2VjKQorCQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgdWJpLT5tYXhfZWMpOworCWVsc2UgaWYgKGF0dHIgPT0gJmRldl9yZXNlcnZlZF9mb3JfYmFkKQorCQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgdWJpLT5iZWJfcnN2ZF9wZWJzKTsKKwllbHNlIGlmIChhdHRyID09ICZkZXZfYmFkX3BlYl9jb3VudCkKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHViaS0+YmFkX3BlYl9jb3VudCk7CisJZWxzZSBpZiAoYXR0ciA9PSAmZGV2X21heF92b2xfY291bnQpCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB1YmktPnZ0Ymxfc2xvdHMpOworCWVsc2UgaWYgKGF0dHIgPT0gJmRldl9taW5faW9fc2l6ZSkKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHViaS0+bWluX2lvX3NpemUpOworCWVsc2UgaWYgKGF0dHIgPT0gJmRldl9iZ3RfZW5hYmxlZCkKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHViaS0+dGhyZWFkX2VuYWJsZWQpOworCWVsc2UKKwkJQlVHKCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogRmFrZSAicmVsZWFzZSIgbWV0aG9kIGZvciBVQkkgZGV2aWNlcyAqLworc3RhdGljIHZvaWQgZGV2X3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KSB7IH0KKworLyoqCisgKiB1Ymlfc3lzZnNfaW5pdCAtIGluaXRpYWxpemUgc3lzZnMgZm9yIGFuIFVCSSBkZXZpY2UuCisgKiBAdWJpOiBVQkkgZGV2aWNlIGRlc2NyaXB0aW9uIG9iamVjdAorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB6ZXJvIGluIGNhc2Ugb2Ygc3VjY2VzcyBhbmQgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIGluCisgKiBjYXNlIG9mIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQgdWJpX3N5c2ZzX2luaXQoc3RydWN0IHViaV9kZXZpY2UgKnViaSkKK3sKKwlpbnQgZXJyOworCisJdWJpLT5kZXYucmVsZWFzZSA9IGRldl9yZWxlYXNlOworCXViaS0+ZGV2LmRldnQgPSBNS0RFVih1YmktPm1ham9yLCAwKTsKKwl1YmktPmRldi5jbGFzcyA9IHViaV9jbGFzczsKKwlzcHJpbnRmKCZ1YmktPmRldi5idXNfaWRbMF0sIFVCSV9OQU1FX1NUUiIlZCIsIHViaS0+dWJpX251bSk7CisJZXJyID0gZGV2aWNlX3JlZ2lzdGVyKCZ1YmktPmRldik7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwllcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnViaS0+ZGV2LCAmZGV2X2VyYXNlYmxvY2tfc2l6ZSk7CisJaWYgKGVycikKKwkJZ290byBvdXRfdW5yZWdpc3RlcjsKKwllcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnViaS0+ZGV2LCAmZGV2X2F2YWlsX2VyYXNlYmxvY2tzKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9lcmFzZWJsb2NrX3NpemU7CisJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZ1YmktPmRldiwgJmRldl90b3RhbF9lcmFzZWJsb2Nrcyk7CisJaWYgKGVycikKKwkJZ290byBvdXRfYXZhaWxfZXJhc2VibG9ja3M7CisJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZ1YmktPmRldiwgJmRldl92b2x1bWVzX2NvdW50KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF90b3RhbF9lcmFzZWJsb2NrczsKKwllcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnViaS0+ZGV2LCAmZGV2X21heF9lYyk7CisJaWYgKGVycikKKwkJZ290byBvdXRfdm9sdW1lc19jb3VudDsKKwllcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnViaS0+ZGV2LCAmZGV2X3Jlc2VydmVkX2Zvcl9iYWQpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X3ZvbHVtZXNfbWF4X2VjOworCWVyciA9IGRldmljZV9jcmVhdGVfZmlsZSgmdWJpLT5kZXYsICZkZXZfYmFkX3BlYl9jb3VudCk7CisJaWYgKGVycikKKwkJZ290byBvdXRfcmVzZXJ2ZWRfZm9yX2JhZDsKKwllcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnViaS0+ZGV2LCAmZGV2X21heF92b2xfY291bnQpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X2JhZF9wZWJfY291bnQ7CisJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZ1YmktPmRldiwgJmRldl9taW5faW9fc2l6ZSk7CisJaWYgKGVycikKKwkJZ290byBvdXRfbWF4X3ZvbF9jb3VudDsKKwllcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnViaS0+ZGV2LCAmZGV2X2JndF9lbmFibGVkKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9taW5faW9fc2l6ZTsKKworCXJldHVybiAwOworCitvdXRfbWluX2lvX3NpemU6CisJZGV2aWNlX3JlbW92ZV9maWxlKCZ1YmktPmRldiwgJmRldl9taW5faW9fc2l6ZSk7CitvdXRfbWF4X3ZvbF9jb3VudDoKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnViaS0+ZGV2LCAmZGV2X21heF92b2xfY291bnQpOworb3V0X2JhZF9wZWJfY291bnQ6CisJZGV2aWNlX3JlbW92ZV9maWxlKCZ1YmktPmRldiwgJmRldl9iYWRfcGViX2NvdW50KTsKK291dF9yZXNlcnZlZF9mb3JfYmFkOgorCWRldmljZV9yZW1vdmVfZmlsZSgmdWJpLT5kZXYsICZkZXZfcmVzZXJ2ZWRfZm9yX2JhZCk7CitvdXRfdm9sdW1lc19tYXhfZWM6CisJZGV2aWNlX3JlbW92ZV9maWxlKCZ1YmktPmRldiwgJmRldl9tYXhfZWMpOworb3V0X3ZvbHVtZXNfY291bnQ6CisJZGV2aWNlX3JlbW92ZV9maWxlKCZ1YmktPmRldiwgJmRldl92b2x1bWVzX2NvdW50KTsKK291dF90b3RhbF9lcmFzZWJsb2NrczoKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnViaS0+ZGV2LCAmZGV2X3RvdGFsX2VyYXNlYmxvY2tzKTsKK291dF9hdmFpbF9lcmFzZWJsb2NrczoKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnViaS0+ZGV2LCAmZGV2X2F2YWlsX2VyYXNlYmxvY2tzKTsKK291dF9lcmFzZWJsb2NrX3NpemU6CisJZGV2aWNlX3JlbW92ZV9maWxlKCZ1YmktPmRldiwgJmRldl9lcmFzZWJsb2NrX3NpemUpOworb3V0X3VucmVnaXN0ZXI6CisJZGV2aWNlX3VucmVnaXN0ZXIoJnViaS0+ZGV2KTsKK291dDoKKwl1YmlfZXJyKCJmYWlsZWQgdG8gaW5pdGlhbGl6ZSBzeXNmcyBmb3IgJXMiLCB1YmktPnViaV9uYW1lKTsKKwlyZXR1cm4gZXJyOworfQorCisvKioKKyAqIHViaV9zeXNmc19jbG9zZSAtIGNsb3NlIHN5c2ZzIGZvciBhbiBVQkkgZGV2aWNlLgorICogQHViaTogVUJJIGRldmljZSBkZXNjcmlwdGlvbiBvYmplY3QKKyAqLworc3RhdGljIHZvaWQgdWJpX3N5c2ZzX2Nsb3NlKHN0cnVjdCB1YmlfZGV2aWNlICp1YmkpCit7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZ1YmktPmRldiwgJmRldl9iZ3RfZW5hYmxlZCk7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZ1YmktPmRldiwgJmRldl9taW5faW9fc2l6ZSk7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZ1YmktPmRldiwgJmRldl9tYXhfdm9sX2NvdW50KTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnViaS0+ZGV2LCAmZGV2X2JhZF9wZWJfY291bnQpOworCWRldmljZV9yZW1vdmVfZmlsZSgmdWJpLT5kZXYsICZkZXZfcmVzZXJ2ZWRfZm9yX2JhZCk7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZ1YmktPmRldiwgJmRldl9tYXhfZWMpOworCWRldmljZV9yZW1vdmVfZmlsZSgmdWJpLT5kZXYsICZkZXZfdm9sdW1lc19jb3VudCk7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZ1YmktPmRldiwgJmRldl90b3RhbF9lcmFzZWJsb2Nrcyk7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZ1YmktPmRldiwgJmRldl9hdmFpbF9lcmFzZWJsb2Nrcyk7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZ1YmktPmRldiwgJmRldl9lcmFzZWJsb2NrX3NpemUpOworCWRldmljZV91bnJlZ2lzdGVyKCZ1YmktPmRldik7Cit9CisKKy8qKgorICoga2lsbF92b2x1bWVzIC0gZGVzdHJveSBhbGwgdm9sdW1lcy4KKyAqIEB1Ymk6IFVCSSBkZXZpY2UgZGVzY3JpcHRpb24gb2JqZWN0CisgKi8KK3N0YXRpYyB2b2lkIGtpbGxfdm9sdW1lcyhzdHJ1Y3QgdWJpX2RldmljZSAqdWJpKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHViaS0+dnRibF9zbG90czsgaSsrKQorCQlpZiAodWJpLT52b2x1bWVzW2ldKQorCQkJdWJpX2ZyZWVfdm9sdW1lKHViaSwgaSk7Cit9CisKKy8qKgorICogdWlmX2luaXQgLSBpbml0aWFsaXplIHVzZXIgaW50ZXJmYWNlcyBmb3IgYW4gVUJJIGRldmljZS4KKyAqIEB1Ymk6IFVCSSBkZXZpY2UgZGVzY3JpcHRpb24gb2JqZWN0CisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHplcm8gaW4gY2FzZSBvZiBzdWNjZXNzIGFuZCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgaW4KKyAqIGNhc2Ugb2YgZmFpbHVyZS4KKyAqLworc3RhdGljIGludCB1aWZfaW5pdChzdHJ1Y3QgdWJpX2RldmljZSAqdWJpKQoreworCWludCBpLCBlcnI7CisJZGV2X3QgZGV2OworCisJbXV0ZXhfaW5pdCgmdWJpLT52dGJsX211dGV4KTsKKwlzcGluX2xvY2tfaW5pdCgmdWJpLT52b2x1bWVzX2xvY2spOworCisJc3ByaW50Zih1YmktPnViaV9uYW1lLCBVQklfTkFNRV9TVFIgIiVkIiwgdWJpLT51YmlfbnVtKTsKKworCS8qCisJICogTWFqb3IgbnVtYmVycyBmb3IgdGhlIFVCSSBjaGFyYWN0ZXIgZGV2aWNlcyBhcmUgYWxsb2NhdGVkCisJICogZHluYW1pY2FsbHkuIE1ham9yIG51bWJlcnMgb2Ygdm9sdW1lIGNoYXJhY3RlciBkZXZpY2VzIGFyZQorCSAqIGVxdWl2YWxlbnQgdG8gb25lcyBvZiB0aGUgY29ycmVzcG9uZGluZyBVQkkgY2hhcmFjdGVyIGRldmljZS4gTWlub3IKKwkgKiBudW1iZXJzIG9mIFVCSSBjaGFyYWN0ZXIgZGV2aWNlcyBhcmUgMCwgd2hpbGUgbWlub3IgbnVtYmVycyBvZgorCSAqIHZvbHVtZSBjaGFyYWN0ZXIgZGV2aWNlcyBzdGFydCBmcm9tIDEuIFRodXMsIHdlIGFsbG9jYXRlIG9uZSBtYWpvcgorCSAqIG51bWJlciBhbmQgdWJpLT52dGJsX3Nsb3RzICsgMSBtaW5vciBudW1iZXJzLgorCSAqLworCWVyciA9IGFsbG9jX2NocmRldl9yZWdpb24oJmRldiwgMCwgdWJpLT52dGJsX3Nsb3RzICsgMSwgdWJpLT51YmlfbmFtZSk7CisJaWYgKGVycikgeworCQl1YmlfZXJyKCJjYW5ub3QgcmVnaXN0ZXIgVUJJIGNoYXJhY3RlciBkZXZpY2VzIik7CisJCXJldHVybiBlcnI7CisJfQorCisJY2Rldl9pbml0KCZ1YmktPmNkZXYsICZ1YmlfY2Rldl9vcGVyYXRpb25zKTsKKwl1YmktPm1ham9yID0gTUFKT1IoZGV2KTsKKwlkYmdfbXNnKCIlcyBtYWpvciBpcyAldSIsIHViaS0+dWJpX25hbWUsIHViaS0+bWFqb3IpOworCXViaS0+Y2Rldi5vd25lciA9IFRISVNfTU9EVUxFOworCisJZGV2ID0gTUtERVYodWJpLT5tYWpvciwgMCk7CisJZXJyID0gY2Rldl9hZGQoJnViaS0+Y2RldiwgZGV2LCAxKTsKKwlpZiAoZXJyKSB7CisJCXViaV9lcnIoImNhbm5vdCBhZGQgY2hhcmFjdGVyIGRldmljZSAlcyIsIHViaS0+dWJpX25hbWUpOworCQlnb3RvIG91dF91bnJlZzsKKwl9CisKKwllcnIgPSB1Ymlfc3lzZnNfaW5pdCh1YmkpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X2NkZXY7CisKKwlmb3IgKGkgPSAwOyBpIDwgdWJpLT52dGJsX3Nsb3RzOyBpKyspCisJCWlmICh1YmktPnZvbHVtZXNbaV0pIHsKKwkJCWVyciA9IHViaV9hZGRfdm9sdW1lKHViaSwgaSk7CisJCQlpZiAoZXJyKQorCQkJCWdvdG8gb3V0X3ZvbHVtZXM7CisJCX0KKworCXJldHVybiAwOworCitvdXRfdm9sdW1lczoKKwlraWxsX3ZvbHVtZXModWJpKTsKKwl1Ymlfc3lzZnNfY2xvc2UodWJpKTsKK291dF9jZGV2OgorCWNkZXZfZGVsKCZ1YmktPmNkZXYpOworb3V0X3VucmVnOgorCXVucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihNS0RFVih1YmktPm1ham9yLCAwKSwKKwkJCQkgdWJpLT52dGJsX3Nsb3RzICsgMSk7CisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKiB1aWZfY2xvc2UgLSBjbG9zZSB1c2VyIGludGVyZmFjZXMgZm9yIGFuIFVCSSBkZXZpY2UuCisgKiBAdWJpOiBVQkkgZGV2aWNlIGRlc2NyaXB0aW9uIG9iamVjdAorICovCitzdGF0aWMgdm9pZCB1aWZfY2xvc2Uoc3RydWN0IHViaV9kZXZpY2UgKnViaSkKK3sKKwlraWxsX3ZvbHVtZXModWJpKTsKKwl1Ymlfc3lzZnNfY2xvc2UodWJpKTsKKwljZGV2X2RlbCgmdWJpLT5jZGV2KTsKKwl1bnJlZ2lzdGVyX2NocmRldl9yZWdpb24oTUtERVYodWJpLT5tYWpvciwgMCksIHViaS0+dnRibF9zbG90cyArIDEpOworfQorCisvKioKKyAqIGF0dGFjaF9ieV9zY2FubmluZyAtIGF0dGFjaCBhbiBNVEQgZGV2aWNlIHVzaW5nIHNjYW5uaW5nIG1ldGhvZC4KKyAqIEB1Ymk6IFVCSSBkZXZpY2UgZGVzY3JpcHRvcgorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB6ZXJvIGluIGNhc2Ugb2Ygc3VjY2VzcyBhbmQgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIGluCisgKiBjYXNlIG9mIGZhaWx1cmUuCisgKgorICogTm90ZSwgY3VycmVudGx5IHRoaXMgaXMgdGhlIG9ubHkgbWV0aG9kIHRvIGF0dGFjaCBVQkkgZGV2aWNlcy4gSG9wZWZ1bGx5IGluCisgKiB0aGUgZnV0dXJlIHdlJ2xsIGhhdmUgbW9yZSBzY2FsYWJsZSBhdHRhY2hpbmcgbWV0aG9kcyBhbmQgYXZvaWQgZnVsbCBtZWRpYQorICogc2Nhbm5pbmcuIEJ1dCBldmVuIGluIHRoaXMgY2FzZSBzY2FubmluZyB3aWxsIGJlIG5lZWRlZCBhcyBhIGZhbGwtYmFjaworICogYXR0YWNoaW5nIG1ldGhvZCBpZiB0aGVyZSBhcmUgc29tZSBvbi1mbGFzaCB0YWJsZSBjb3JydXB0aW9ucy4KKyAqLworc3RhdGljIGludCBhdHRhY2hfYnlfc2Nhbm5pbmcoc3RydWN0IHViaV9kZXZpY2UgKnViaSkKK3sKKwlpbnQgZXJyOworCXN0cnVjdCB1Ymlfc2Nhbl9pbmZvICpzaTsKKworCXNpID0gdWJpX3NjYW4odWJpKTsKKwlpZiAoSVNfRVJSKHNpKSkKKwkJcmV0dXJuIFBUUl9FUlIoc2kpOworCisJdWJpLT5iYWRfcGViX2NvdW50ID0gc2ktPmJhZF9wZWJfY291bnQ7CisJdWJpLT5nb29kX3BlYl9jb3VudCA9IHViaS0+cGViX2NvdW50IC0gdWJpLT5iYWRfcGViX2NvdW50OworCXViaS0+bWF4X2VjID0gc2ktPm1heF9lYzsKKwl1YmktPm1lYW5fZWMgPSBzaS0+bWVhbl9lYzsKKworCWVyciA9IHViaV9yZWFkX3ZvbHVtZV90YWJsZSh1YmksIHNpKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9zaTsKKworCWVyciA9IHViaV93bF9pbml0X3NjYW4odWJpLCBzaSk7CisJaWYgKGVycikKKwkJZ290byBvdXRfdnRibDsKKworCWVyciA9IHViaV9lYmFfaW5pdF9zY2FuKHViaSwgc2kpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X3dsOworCisJdWJpX3NjYW5fZGVzdHJveV9zaShzaSk7CisJcmV0dXJuIDA7CisKK291dF93bDoKKwl1Ymlfd2xfY2xvc2UodWJpKTsKK291dF92dGJsOgorCWtmcmVlKHViaS0+dnRibCk7CitvdXRfc2k6CisJdWJpX3NjYW5fZGVzdHJveV9zaShzaSk7CisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKiBpb19pbml0IC0gaW5pdGlhbGl6ZSBJL08gdW5pdCBmb3IgYSBnaXZlbiBVQkkgZGV2aWNlLgorICogQHViaTogVUJJIGRldmljZSBkZXNjcmlwdGlvbiBvYmplY3QKKyAqCisgKiBJZiBAdWJpLT52aWRfaGRyX29mZnNldCBvciBAdWJpLT5sZWJfc3RhcnQgaXMgemVybywgZGVmYXVsdCBvZmZzZXRzIGFyZQorICogYXNzdW1lZDoKKyAqICAgbyBFQyBoZWFkZXIgaXMgYWx3YXlzIGF0IG9mZnNldCB6ZXJvIC0gdGhpcyBjYW5ub3QgYmUgY2hhbmdlZDsKKyAqICAgbyBWSUQgaGVhZGVyIHN0YXJ0cyBqdXN0IGFmdGVyIHRoZSBFQyBoZWFkZXIgYXQgdGhlIGNsb3Nlc3QgYWRkcmVzcworICogICBhbGlnbmVkIHRvIEBpby0+QGhkcnNfbWluX2lvX3NpemU7CisgKiAgIG8gZGF0YSBzdGFydHMganVzdCBhZnRlciB0aGUgVklEIGhlYWRlciBhdCB0aGUgY2xvc2VzdCBhZGRyZXNzIGFsaWduZWQgdG8KKyAqICAgICBAaW8tPkBtaW5faW9fc2l6ZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB6ZXJvIGluIGNhc2Ugb2Ygc3VjY2VzcyBhbmQgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIGluCisgKiBjYXNlIG9mIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQgaW9faW5pdChzdHJ1Y3QgdWJpX2RldmljZSAqdWJpKQoreworCWlmICh1YmktPm10ZC0+bnVtZXJhc2VyZWdpb25zICE9IDApIHsKKwkJLyoKKwkJICogU29tZSBmbGFzaGVzIGhhdmUgc2V2ZXJhbCBlcmFzZSByZWdpb25zLiBEaWZmZXJlbnQgcmVnaW9ucworCQkgKiBtYXkgaGF2ZSBkaWZmZXJlbnQgZXJhc2VibG9jayBzaXplIGFuZCBvdGhlcgorCQkgKiBjaGFyYWN0ZXJpc3RpY3MuIEl0IGxvb2tzIGxpa2UgbW9zdGx5IG11bHRpLXJlZ2lvbiBmbGFzaGVzCisJCSAqIGhhdmUgb25lICJtYWluIiByZWdpb24gYW5kIG9uZSBvciBtb3JlIHNtYWxsIHJlZ2lvbnMgdG8KKwkJICogc3RvcmUgYm9vdCBsb2FkZXIgY29kZSBvciBib290IHBhcmFtZXRlcnMgb3Igd2hhdGV2ZXIuIEkKKwkJICogZ3Vlc3Mgd2Ugc2hvdWxkIGp1c3QgcGljayB0aGUgbGFyZ2VzdCByZWdpb24uIEJ1dCB0aGlzIGlzCisJCSAqIG5vdCBpbXBsZW1lbnRlZC4KKwkJICovCisJCXViaV9lcnIoIm11bHRpcGxlIHJlZ2lvbnMsIG5vdCBpbXBsZW1lbnRlZCIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKgorCSAqIE5vdGUsIGluIHRoaXMgaW1wbGVtZW50YXRpb24gd2Ugc3VwcG9ydCBNVEQgZGV2aWNlcyB3aXRoIDB4N0ZGRkZGRkYKKwkgKiBwaHlzaWNhbCBlcmFzZWJsb2NrcyBtYXhpbXVtLgorCSAqLworCisJdWJpLT5wZWJfc2l6ZSAgID0gdWJpLT5tdGQtPmVyYXNlc2l6ZTsKKwl1YmktPnBlYl9jb3VudCAgPSB1YmktPm10ZC0+c2l6ZSAvIHViaS0+bXRkLT5lcmFzZXNpemU7CisJdWJpLT5mbGFzaF9zaXplID0gdWJpLT5tdGQtPnNpemU7CisKKwlpZiAodWJpLT5tdGQtPmJsb2NrX2lzYmFkICYmIHViaS0+bXRkLT5ibG9ja19tYXJrYmFkKQorCQl1YmktPmJhZF9hbGxvd2VkID0gMTsKKworCXViaS0+bWluX2lvX3NpemUgPSB1YmktPm10ZC0+d3JpdGVzaXplOworCXViaS0+aGRyc19taW5faW9fc2l6ZSA9IHViaS0+bXRkLT53cml0ZXNpemUgPj4gdWJpLT5tdGQtPnN1YnBhZ2Vfc2Z0OworCisJLyogTWFrZSBzdXJlIG1pbmltYWwgSS9PIHVuaXQgaXMgcG93ZXIgb2YgMiAqLworCWlmICh1YmktPm1pbl9pb19zaXplID09IDAgfHwKKwkgICAgKHViaS0+bWluX2lvX3NpemUgJiAodWJpLT5taW5faW9fc2l6ZSAtIDEpKSkgeworCQl1YmlfZXJyKCJiYWQgbWluLiBJL08gdW5pdCIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwl1YmlfYXNzZXJ0KHViaS0+aGRyc19taW5faW9fc2l6ZSA+IDApOworCXViaV9hc3NlcnQodWJpLT5oZHJzX21pbl9pb19zaXplIDw9IHViaS0+bWluX2lvX3NpemUpOworCXViaV9hc3NlcnQodWJpLT5taW5faW9fc2l6ZSAlIHViaS0+aGRyc19taW5faW9fc2l6ZSA9PSAwKTsKKworCS8qIENhbGN1bGF0ZSBkZWZhdWx0IGFsaWduZWQgc2l6ZXMgb2YgRUMgYW5kIFZJRCBoZWFkZXJzICovCisJdWJpLT5lY19oZHJfYWxzaXplID0gQUxJR04oVUJJX0VDX0hEUl9TSVpFLCB1YmktPmhkcnNfbWluX2lvX3NpemUpOworCXViaS0+dmlkX2hkcl9hbHNpemUgPSBBTElHTihVQklfVklEX0hEUl9TSVpFLCB1YmktPmhkcnNfbWluX2lvX3NpemUpOworCisJZGJnX21zZygibWluX2lvX3NpemUgICAgICAlZCIsIHViaS0+bWluX2lvX3NpemUpOworCWRiZ19tc2coImhkcnNfbWluX2lvX3NpemUgJWQiLCB1YmktPmhkcnNfbWluX2lvX3NpemUpOworCWRiZ19tc2coImVjX2hkcl9hbHNpemUgICAgJWQiLCB1YmktPmVjX2hkcl9hbHNpemUpOworCWRiZ19tc2coInZpZF9oZHJfYWxzaXplICAgJWQiLCB1YmktPnZpZF9oZHJfYWxzaXplKTsKKworCWlmICh1YmktPnZpZF9oZHJfb2Zmc2V0ID09IDApCisJCS8qIERlZmF1bHQgb2Zmc2V0ICovCisJCXViaS0+dmlkX2hkcl9vZmZzZXQgPSB1YmktPnZpZF9oZHJfYWxvZmZzZXQgPQorCQkJCSAgICAgIHViaS0+ZWNfaGRyX2Fsc2l6ZTsKKwllbHNlIHsKKwkJdWJpLT52aWRfaGRyX2Fsb2Zmc2V0ID0gdWJpLT52aWRfaGRyX29mZnNldCAmCisJCQkJCQl+KHViaS0+aGRyc19taW5faW9fc2l6ZSAtIDEpOworCQl1YmktPnZpZF9oZHJfc2hpZnQgPSB1YmktPnZpZF9oZHJfb2Zmc2V0IC0KKwkJCQkJCXViaS0+dmlkX2hkcl9hbG9mZnNldDsKKwl9CisKKwkvKiBTaW1pbGFyIGZvciB0aGUgZGF0YSBvZmZzZXQgKi8KKwlpZiAodWJpLT5sZWJfc3RhcnQgPT0gMCkgeworCQl1YmktPmxlYl9zdGFydCA9IHViaS0+dmlkX2hkcl9vZmZzZXQgKyB1YmktPnZpZF9oZHJfYWxzaXplOworCQl1YmktPmxlYl9zdGFydCA9IEFMSUdOKHViaS0+bGViX3N0YXJ0LCB1YmktPm1pbl9pb19zaXplKTsKKwl9CisKKwlkYmdfbXNnKCJ2aWRfaGRyX29mZnNldCAgICVkIiwgdWJpLT52aWRfaGRyX29mZnNldCk7CisJZGJnX21zZygidmlkX2hkcl9hbG9mZnNldCAlZCIsIHViaS0+dmlkX2hkcl9hbG9mZnNldCk7CisJZGJnX21zZygidmlkX2hkcl9zaGlmdCAgICAlZCIsIHViaS0+dmlkX2hkcl9zaGlmdCk7CisJZGJnX21zZygibGViX3N0YXJ0ICAgICAgICAlZCIsIHViaS0+bGViX3N0YXJ0KTsKKworCS8qIFRoZSBzaGlmdCBtdXN0IGJlIGFsaWduZWQgdG8gMzItYml0IGJvdW5kYXJ5ICovCisJaWYgKHViaS0+dmlkX2hkcl9zaGlmdCAlIDQpIHsKKwkJdWJpX2VycigidW5hbGlnbmVkIFZJRCBoZWFkZXIgc2hpZnQgJWQiLAorCQkJdWJpLT52aWRfaGRyX3NoaWZ0KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogQ2hlY2sgc2FuaXR5ICovCisJaWYgKHViaS0+dmlkX2hkcl9vZmZzZXQgPCBVQklfRUNfSERSX1NJWkUgfHwKKwkgICAgdWJpLT5sZWJfc3RhcnQgPCB1YmktPnZpZF9oZHJfb2Zmc2V0ICsgVUJJX1ZJRF9IRFJfU0laRSB8fAorCSAgICB1YmktPmxlYl9zdGFydCA+IHViaS0+cGViX3NpemUgLSBVQklfVklEX0hEUl9TSVpFIHx8CisJICAgIHViaS0+bGViX3N0YXJ0ICUgdWJpLT5taW5faW9fc2l6ZSkgeworCQl1YmlfZXJyKCJiYWQgVklEIGhlYWRlciAoJWQpIG9yIGRhdGEgb2Zmc2V0cyAoJWQpIiwKKwkJCXViaS0+dmlkX2hkcl9vZmZzZXQsIHViaS0+bGViX3N0YXJ0KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyoKKwkgKiBJdCBtYXkgaGFwcGVuIHRoYXQgRUMgYW5kIFZJRCBoZWFkZXJzIGFyZSBzaXR1YXRlZCBpbiBvbmUgbWluaW1hbAorCSAqIEkvTyB1bml0LiBJbiB0aGlzIGNhc2Ugd2UgY2FuIG9ubHkgYWNjZXB0IHRoaXMgVUJJIGltYWdlIGluCisJICogcmVhZC1vbmx5IG1vZGUuCisJICovCisJaWYgKHViaS0+dmlkX2hkcl9vZmZzZXQgKyBVQklfVklEX0hEUl9TSVpFIDw9IHViaS0+aGRyc19taW5faW9fc2l6ZSkgeworCQl1Ymlfd2FybigiRUMgYW5kIFZJRCBoZWFkZXJzIGFyZSBpbiB0aGUgc2FtZSBtaW5pbWFsIEkvTyB1bml0LCAiCisJCQkgInN3aXRjaCB0byByZWFkLW9ubHkgbW9kZSIpOworCQl1YmktPnJvX21vZGUgPSAxOworCX0KKworCXViaS0+bGViX3NpemUgPSB1YmktPnBlYl9zaXplIC0gdWJpLT5sZWJfc3RhcnQ7CisKKwlpZiAoISh1YmktPm10ZC0+ZmxhZ3MgJiBNVERfV1JJVEVBQkxFKSkgeworCQl1YmlfbXNnKCJNVEQgZGV2aWNlICVkIGlzIHdyaXRlLXByb3RlY3RlZCwgYXR0YWNoIGluICIKKwkJCSJyZWFkLW9ubHkgbW9kZSIsIHViaS0+bXRkLT5pbmRleCk7CisJCXViaS0+cm9fbW9kZSA9IDE7CisJfQorCisJZGJnX21zZygibGViX3NpemUgICAgICAgICAlZCIsIHViaS0+bGViX3NpemUpOworCWRiZ19tc2coInJvX21vZGUgICAgICAgICAgJWQiLCB1YmktPnJvX21vZGUpOworCisJLyoKKwkgKiBOb3RlLCBpZGVhbGx5LCB3ZSBoYXZlIHRvIGluaXRpYWxpemUgdWJpLT5iYWRfcGViX2NvdW50IGhlcmUuIEJ1dAorCSAqIHVuZm9ydHVuYXRlbHksIE1URCBkb2VzIG5vdCBwcm92aWRlIHRoaXMgaW5mb3JtYXRpb24uIFdlIHNob3VsZCBsb29wCisJICogb3ZlciBhbGwgcGh5c2ljYWwgZXJhc2VibG9ja3MgYW5kIGludm9rZSBtdGQtPmJsb2NrX2lzX2JhZCgpIGZvcgorCSAqIGVhY2ggcGh5c2ljYWwgZXJhc2VibG9jay4gU28sIHdlIHNraXAgdWJpLT5iYWRfcGViX2NvdW50CisJICogdW5pbml0aWFsaXplZCBhbmQgaW5pdGlhbGl6ZSBpdCBhZnRlciBzY2FubmluZy4KKwkgKi8KKworCXJldHVybiAwOworfQorCisvKioKKyAqIGF0dGFjaF9tdGRfZGV2IC0gYXR0YWNoIGFuIE1URCBkZXZpY2UuCisgKiBAbXRkX2RldjogTVREIGRldmljZSBuYW1lIG9yIG51bWJlciBzdHJpbmcKKyAqIEB2aWRfaGRyX29mZnNldDogVklEIGhlYWRlciBvZmZzZXQKKyAqIEBkYXRhX29mZnNldDogZGF0YSBvZmZzZXQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGF0dGFjaGVzIGFuIE1URCBkZXZpY2UgdG8gVUJJLiBJdCBmaXJzdCB0cmVhdHMgQG10ZF9kZXYgYXMgdGhlCisgKiBNVEQgZGV2aWNlIG5hbWUsIGFuZCB0cmllcyB0byBvcGVuIGl0IGJ5IHRoaXMgbmFtZS4gSWYgaXQgaXMgdW5hYmxlIHRvIG9wZW4sCisgKiBpdCB0cmllcyB0byBjb252ZXJ0IEBtdGRfZGV2IHRvIGFuIGludGVnZXIgYW5kIG9wZW4gdGhlIE1URCBkZXZpY2UgYnkgaXRzCisgKiBudW1iZXIuIFJldHVybnMgemVybyBpbiBjYXNlIG9mIHN1Y2Nlc3MgYW5kIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBpbiBjYXNlIG9mCisgKiBmYWlsdXJlLgorICovCitzdGF0aWMgaW50IGF0dGFjaF9tdGRfZGV2KGNvbnN0IGNoYXIgKm10ZF9kZXYsIGludCB2aWRfaGRyX29mZnNldCwKKwkJCSAgaW50IGRhdGFfb2Zmc2V0KQoreworCXN0cnVjdCB1YmlfZGV2aWNlICp1Ymk7CisJc3RydWN0IG10ZF9pbmZvICptdGQ7CisJaW50IGksIGVycjsKKworCW10ZCA9IGdldF9tdGRfZGV2aWNlX25tKG10ZF9kZXYpOworCWlmIChJU19FUlIobXRkKSkgeworCQlpbnQgbXRkX251bTsKKwkJY2hhciAqZW5kcDsKKworCQlpZiAoUFRSX0VSUihtdGQpICE9IC1FTk9ERVYpCisJCQlyZXR1cm4gUFRSX0VSUihtdGQpOworCisJCS8qCisJCSAqIFByb2JhYmx5IHRoaXMgaXMgbm90IE1URCBkZXZpY2UgbmFtZSBidXQgTVREIGRldmljZSBudW1iZXIgLQorCQkgKiBjaGVjayB0aGlzIG91dC4KKwkJICovCisJCW10ZF9udW0gPSBzaW1wbGVfc3RydG91bChtdGRfZGV2LCAmZW5kcCwgMCk7CisJCWlmICgqZW5kcCAhPSAnXDAnIHx8IG10ZF9kZXYgPT0gZW5kcCkgeworCQkJdWJpX2VycigiaW5jb3JyZWN0IE1URCBkZXZpY2U6IFwiJXNcIiIsIG10ZF9kZXYpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKworCQltdGQgPSBnZXRfbXRkX2RldmljZShOVUxMLCBtdGRfbnVtKTsKKwkJaWYgKElTX0VSUihtdGQpKQorCQkJcmV0dXJuIFBUUl9FUlIobXRkKTsKKwl9CisKKwkvKiBDaGVjayBpZiB3ZSBhbHJlYWR5IGhhdmUgdGhlIHNhbWUgTVREIGRldmljZSBhdHRhY2hlZCAqLworCWZvciAoaSA9IDA7IGkgPCB1YmlfZGV2aWNlc19jbnQ7IGkrKykKKwkJaWYgKHViaV9kZXZpY2VzW2ldLT5tdGQtPmluZGV4ID09IG10ZC0+aW5kZXgpIHsKKwkJCXViaV9lcnIoIm10ZCVkIGlzIGFscmVhZHkgYXR0YWNoZWQgdG8gdWJpJWQiLAorCQkJCW10ZC0+aW5kZXgsIGkpOworCQkJZXJyID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0X210ZDsKKwkJfQorCisJdWJpID0gdWJpX2RldmljZXNbdWJpX2RldmljZXNfY250XSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB1YmlfZGV2aWNlKSwKKwkJCQkJCSAgICAgIEdGUF9LRVJORUwpOworCWlmICghdWJpKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gb3V0X210ZDsKKwl9CisKKwl1YmktPnViaV9udW0gPSB1YmlfZGV2aWNlc19jbnQ7CisJdWJpLT5tdGQgPSBtdGQ7CisKKwlkYmdfbXNnKCJhdHRhY2hpbmcgbXRkJWQgdG8gdWJpJWQ6IFZJRCBoZWFkZXIgb2Zmc2V0ICVkIGRhdGEgb2Zmc2V0ICVkIiwKKwkJdWJpLT5tdGQtPmluZGV4LCB1YmlfZGV2aWNlc19jbnQsIHZpZF9oZHJfb2Zmc2V0LCBkYXRhX29mZnNldCk7CisKKwl1YmktPnZpZF9oZHJfb2Zmc2V0ID0gdmlkX2hkcl9vZmZzZXQ7CisJdWJpLT5sZWJfc3RhcnQgPSBkYXRhX29mZnNldDsKKwllcnIgPSBpb19pbml0KHViaSk7CisJaWYgKGVycikKKwkJZ290byBvdXRfZnJlZTsKKworCWVyciA9IGF0dGFjaF9ieV9zY2FubmluZyh1YmkpOworCWlmIChlcnIpIHsKKwkJZGJnX2VycigiZmFpbGVkIHRvIGF0dGFjaCBieSBzY2FubmluZywgZXJyb3IgJWQiLCBlcnIpOworCQlnb3RvIG91dF9mcmVlOworCX0KKworCWVyciA9IHVpZl9pbml0KHViaSk7CisJaWYgKGVycikKKwkJZ290byBvdXRfZGV0YWNoOworCisJdWJpX2RldmljZXNfY250ICs9IDE7CisKKwl1YmlfbXNnKCJhdHRhY2hlZCBtdGQlZCB0byB1YmklZCIsIHViaS0+bXRkLT5pbmRleCwgdWJpX2RldmljZXNfY250KTsKKwl1YmlfbXNnKCJNVEQgZGV2aWNlIG5hbWU6ICAgICAgICAgICAgXCIlc1wiIiwgdWJpLT5tdGQtPm5hbWUpOworCXViaV9tc2coIk1URCBkZXZpY2Ugc2l6ZTogICAgICAgICAgICAlbGx1IE1pQiIsIHViaS0+Zmxhc2hfc2l6ZSA+PiAyMCk7CisJdWJpX21zZygicGh5c2ljYWwgZXJhc2VibG9jayBzaXplOiAgICVkIGJ5dGVzICglZCBLaUIpIiwKKwkJdWJpLT5wZWJfc2l6ZSwgdWJpLT5wZWJfc2l6ZSA+PiAxMCk7CisJdWJpX21zZygibG9naWNhbCBlcmFzZWJsb2NrIHNpemU6ICAgICVkIGJ5dGVzIiwgdWJpLT5sZWJfc2l6ZSk7CisJdWJpX21zZygibnVtYmVyIG9mIGdvb2QgUEVCczogICAgICAgICVkIiwgdWJpLT5nb29kX3BlYl9jb3VudCk7CisJdWJpX21zZygibnVtYmVyIG9mIGJhZCBQRUJzOiAgICAgICAgICVkIiwgdWJpLT5iYWRfcGViX2NvdW50KTsKKwl1YmlfbXNnKCJzbWFsbGVzdCBmbGFzaCBJL08gdW5pdDogICAgJWQiLCB1YmktPm1pbl9pb19zaXplKTsKKwl1YmlfbXNnKCJWSUQgaGVhZGVyIG9mZnNldDogICAgICAgICAgJWQgKGFsaWduZWQgJWQpIiwKKwkJdWJpLT52aWRfaGRyX29mZnNldCwgdWJpLT52aWRfaGRyX2Fsb2Zmc2V0KTsKKwl1YmlfbXNnKCJkYXRhIG9mZnNldDogICAgICAgICAgICAgICAgJWQiLCB1YmktPmxlYl9zdGFydCk7CisJdWJpX21zZygibWF4LiBhbGxvd2VkIHZvbHVtZXM6ICAgICAgICVkIiwgdWJpLT52dGJsX3Nsb3RzKTsKKwl1YmlfbXNnKCJ3ZWFyLWxldmVsaW5nIHRocmVzaG9sZDogICAgJWQiLCBDT05GSUdfTVREX1VCSV9XTF9USFJFU0hPTEQpOworCXViaV9tc2coIm51bWJlciBvZiBpbnRlcm5hbCB2b2x1bWVzOiAlZCIsIFVCSV9JTlRfVk9MX0NPVU5UKTsKKwl1YmlfbXNnKCJudW1iZXIgb2YgdXNlciB2b2x1bWVzOiAgICAgJWQiLAorCQl1YmktPnZvbF9jb3VudCAtIFVCSV9JTlRfVk9MX0NPVU5UKTsKKwl1YmlfbXNnKCJhdmFpbGFibGUgUEVCczogICAgICAgICAgICAgJWQiLCB1YmktPmF2YWlsX3BlYnMpOworCXViaV9tc2coInRvdGFsIG51bWJlciBvZiByZXNlcnZlZCBQRUJzOiAlZCIsIHViaS0+cnN2ZF9wZWJzKTsKKwl1YmlfbXNnKCJudW1iZXIgb2YgUEVCcyByZXNlcnZlZCBmb3IgYmFkIFBFQiBoYW5kbGluZzogJWQiLAorCQl1YmktPmJlYl9yc3ZkX3BlYnMpOworCXViaV9tc2coIm1heC9tZWFuIGVyYXNlIGNvdW50ZXI6ICVkLyVkIiwgdWJpLT5tYXhfZWMsIHViaS0+bWVhbl9lYyk7CisKKwkvKiBFbmFibGUgdGhlIGJhY2tncm91bmQgdGhyZWFkICovCisJaWYgKCFEQkdfRElTQUJMRV9CR1QpIHsKKwkJdWJpLT50aHJlYWRfZW5hYmxlZCA9IDE7CisJCXdha2VfdXBfcHJvY2Vzcyh1YmktPmJndF90aHJlYWQpOworCX0KKworCXJldHVybiAwOworCitvdXRfZGV0YWNoOgorCXViaV9lYmFfY2xvc2UodWJpKTsKKwl1Ymlfd2xfY2xvc2UodWJpKTsKKwlrZnJlZSh1YmktPnZ0YmwpOworb3V0X2ZyZWU6CisJa2ZyZWUodWJpKTsKK291dF9tdGQ6CisJcHV0X210ZF9kZXZpY2UobXRkKTsKKwl1YmlfZGV2aWNlc1t1YmlfZGV2aWNlc19jbnRdID0gTlVMTDsKKwlyZXR1cm4gZXJyOworfQorCisvKioKKyAqIGRldGFjaF9tdGRfZGV2IC0gZGV0YWNoIGFuIE1URCBkZXZpY2UuCisgKiBAdWJpOiBVQkkgZGV2aWNlIGRlc2NyaXB0aW9uIG9iamVjdAorICovCitzdGF0aWMgdm9pZCBkZXRhY2hfbXRkX2RldihzdHJ1Y3QgdWJpX2RldmljZSAqdWJpKQoreworCWludCB1YmlfbnVtID0gdWJpLT51YmlfbnVtLCBtdGRfbnVtID0gdWJpLT5tdGQtPmluZGV4OworCisJZGJnX21zZygiZGV0YWNoaW5nIG10ZCVkIGZyb20gdWJpJWQiLCB1YmktPm10ZC0+aW5kZXgsIHViaV9udW0pOworCXVpZl9jbG9zZSh1YmkpOworCXViaV9lYmFfY2xvc2UodWJpKTsKKwl1Ymlfd2xfY2xvc2UodWJpKTsKKwlrZnJlZSh1YmktPnZ0YmwpOworCXB1dF9tdGRfZGV2aWNlKHViaS0+bXRkKTsKKwlrZnJlZSh1YmlfZGV2aWNlc1t1YmlfbnVtXSk7CisJdWJpX2RldmljZXNbdWJpX251bV0gPSBOVUxMOworCXViaV9kZXZpY2VzX2NudCAtPSAxOworCXViaV9hc3NlcnQodWJpX2RldmljZXNfY250ID49IDApOworCXViaV9tc2coIm10ZCVkIGlzIGRldGFjaGVkIGZyb20gdWJpJWQiLCBtdGRfbnVtLCB1YmlfbnVtKTsKK30KKworc3RhdGljIGludCBfX2luaXQgdWJpX2luaXQodm9pZCkKK3sKKwlpbnQgZXJyLCBpLCBrOworCisJLyogRW5zdXJlIHRoYXQgRUMgYW5kIFZJRCBoZWFkZXJzIGhhdmUgY29ycmVjdCBzaXplICovCisJQlVJTERfQlVHX09OKHNpemVvZihzdHJ1Y3QgdWJpX2VjX2hkcikgIT0gNjQpOworCUJVSUxEX0JVR19PTihzaXplb2Yoc3RydWN0IHViaV92aWRfaGRyKSAhPSA2NCk7CisKKwlpZiAobXRkX2RldnMgPiBVQklfTUFYX0RFVklDRVMpIHsKKwkJcHJpbnRrKCJVQkkgZXJyb3I6IHRvbyBtYW55IE1URCBkZXZpY2VzLCBtYXhpbXVtIGlzICVkXG4iLAorCQkgICAgICAgVUJJX01BWF9ERVZJQ0VTKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJdWJpX2NsYXNzID0gY2xhc3NfY3JlYXRlKFRISVNfTU9EVUxFLCBVQklfTkFNRV9TVFIpOworCWlmIChJU19FUlIodWJpX2NsYXNzKSkKKwkJcmV0dXJuIFBUUl9FUlIodWJpX2NsYXNzKTsKKworCWVyciA9IGNsYXNzX2NyZWF0ZV9maWxlKHViaV9jbGFzcywgJnViaV92ZXJzaW9uKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9jbGFzczsKKworCS8qIEF0dGFjaCBNVEQgZGV2aWNlcyAqLworCWZvciAoaSA9IDA7IGkgPCBtdGRfZGV2czsgaSsrKSB7CisJCXN0cnVjdCBtdGRfZGV2X3BhcmFtICpwID0gJm10ZF9kZXZfcGFyYW1baV07CisKKwkJY29uZF9yZXNjaGVkKCk7CisKKwkJaWYgKCFwLT5uYW1lKSB7CisJCQlkYmdfZXJyKCJlbXB0eSBuYW1lIik7CisJCQllcnIgPSAtRUlOVkFMOworCQkJZ290byBvdXRfZGV0YWNoOworCQl9CisKKwkJZXJyID0gYXR0YWNoX210ZF9kZXYocC0+bmFtZSwgcC0+dmlkX2hkcl9vZmZzLCBwLT5kYXRhX29mZnMpOworCQlpZiAoZXJyKQorCQkJZ290byBvdXRfZGV0YWNoOworCX0KKworCXJldHVybiAwOworCitvdXRfZGV0YWNoOgorCWZvciAoayA9IDA7IGsgPCBpOyBrKyspCisJCWRldGFjaF9tdGRfZGV2KHViaV9kZXZpY2VzW2tdKTsKKwljbGFzc19yZW1vdmVfZmlsZSh1YmlfY2xhc3MsICZ1YmlfdmVyc2lvbik7CitvdXRfY2xhc3M6CisJY2xhc3NfZGVzdHJveSh1YmlfY2xhc3MpOworCXJldHVybiBlcnI7Cit9Cittb2R1bGVfaW5pdCh1YmlfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB1YmlfZXhpdCh2b2lkKQoreworCWludCBpLCBuID0gdWJpX2RldmljZXNfY250OworCisJZm9yIChpID0gMDsgaSA8IG47IGkrKykKKwkJZGV0YWNoX210ZF9kZXYodWJpX2RldmljZXNbaV0pOworCWNsYXNzX3JlbW92ZV9maWxlKHViaV9jbGFzcywgJnViaV92ZXJzaW9uKTsKKwljbGFzc19kZXN0cm95KHViaV9jbGFzcyk7Cit9Cittb2R1bGVfZXhpdCh1YmlfZXhpdCk7CisKKy8qKgorICogYnl0ZXNfc3RyX3RvX2ludCAtIGNvbnZlcnQgYSBzdHJpbmcgcmVwcmVzZW50aW5nIG51bWJlciBvZiBieXRlcyB0byBhbgorICogaW50ZWdlci4KKyAqIEBzdHI6IHRoZSBzdHJpbmcgdG8gY29udmVydAorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBwb3NpdGl2ZSByZXN1bHRpbmcgaW50ZWdlciBpbiBjYXNlIG9mIHN1Y2Nlc3MgYW5kIGEKKyAqIG5lZ2F0aXZlIGVycm9yIGNvZGUgaW4gY2FzZSBvZiBmYWlsdXJlLgorICovCitzdGF0aWMgaW50IF9faW5pdCBieXRlc19zdHJfdG9faW50KGNvbnN0IGNoYXIgKnN0cikKK3sKKwljaGFyICplbmRwOworCXVuc2lnbmVkIGxvbmcgcmVzdWx0OworCisJcmVzdWx0ID0gc2ltcGxlX3N0cnRvdWwoc3RyLCAmZW5kcCwgMCk7CisJaWYgKHN0ciA9PSBlbmRwIHx8IHJlc3VsdCA8IDApIHsKKwkJcHJpbnRrKCJVQkkgZXJyb3I6IGluY29ycmVjdCBieXRlcyBjb3VudDogXCIlc1wiXG4iLCBzdHIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2ggKCplbmRwKSB7CisJY2FzZSAnRyc6CisJCXJlc3VsdCAqPSAxMDI0OworCWNhc2UgJ00nOgorCQlyZXN1bHQgKj0gMTAyNDsKKwljYXNlICdLJzoKKwljYXNlICdrJzoKKwkJcmVzdWx0ICo9IDEwMjQ7CisJCWlmIChlbmRwWzFdID09ICdpJyAmJiAoZW5kcFsyXSA9PSAnXDAnIHx8CisJCQkgIGVuZHBbMl0gPT0gJ0InICB8fCBlbmRwWzJdID09ICdiJykpCisJCQllbmRwICs9IDI7CisJY2FzZSAnXDAnOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoIlVCSSBlcnJvcjogaW5jb3JyZWN0IGJ5dGVzIGNvdW50OiBcIiVzXCJcbiIsIHN0cik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogdWJpX210ZF9wYXJhbV9wYXJzZSAtIHBhcnNlIHRoZSAnbXRkPScgVUJJIHBhcmFtZXRlci4KKyAqIEB2YWw6IHRoZSBwYXJhbWV0ZXIgdmFsdWUgdG8gcGFyc2UKKyAqIEBrcDogbm90IHVzZWQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgemVybyBpbiBjYXNlIG9mIHN1Y2Nlc3MgYW5kIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBpbgorICogY2FzZSBvZiBlcnJvci4KKyAqLworc3RhdGljIGludCBfX2luaXQgdWJpX210ZF9wYXJhbV9wYXJzZShjb25zdCBjaGFyICp2YWwsIHN0cnVjdCBrZXJuZWxfcGFyYW0gKmtwKQoreworCWludCBpLCBsZW47CisJc3RydWN0IG10ZF9kZXZfcGFyYW0gKnA7CisJY2hhciBidWZbTVREX1BBUkFNX0xFTl9NQVhdOworCWNoYXIgKnBidWYgPSAmYnVmWzBdOworCWNoYXIgKnRva2Vuc1szXSA9IHtOVUxMLCBOVUxMLCBOVUxMfTsKKworCWlmIChtdGRfZGV2cyA9PSBVQklfTUFYX0RFVklDRVMpIHsKKwkJcHJpbnRrKCJVQkkgZXJyb3I6IHRvbyBtYW55IHBhcmFtZXRlcnMsIG1heC4gaXMgJWRcbiIsCisJCSAgICAgICBVQklfTUFYX0RFVklDRVMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlsZW4gPSBzdHJubGVuKHZhbCwgTVREX1BBUkFNX0xFTl9NQVgpOworCWlmIChsZW4gPT0gTVREX1BBUkFNX0xFTl9NQVgpIHsKKwkJcHJpbnRrKCJVQkkgZXJyb3I6IHBhcmFtZXRlciBcIiVzXCIgaXMgdG9vIGxvbmcsIG1heC4gaXMgJWRcbiIsCisJCSAgICAgICB2YWwsIE1URF9QQVJBTV9MRU5fTUFYKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGxlbiA9PSAwKSB7CisJCXByaW50aygiVUJJIHdhcm5pbmc6IGVtcHR5ICdtdGQ9JyBwYXJhbWV0ZXIgLSBpZ25vcmVkXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJc3RyY3B5KGJ1ZiwgdmFsKTsKKworCS8qIEdldCByaWQgb2YgdGhlIGZpbmFsIG5ld2xpbmUgKi8KKwlpZiAoYnVmW2xlbiAtIDFdID09ICdcbicpCisJCWJ1ZltsZW4gLSAxXSA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorCQl0b2tlbnNbaV0gPSBzdHJzZXAoJnBidWYsICIsIik7CisKKwlpZiAocGJ1ZikgeworCQlwcmludGsoIlVCSSBlcnJvcjogdG9vIG1hbnkgYXJndW1lbnRzIGF0IFwiJXNcIlxuIiwgdmFsKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHRva2Vuc1swXSA9PSAnXDAnKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXAgPSAmbXRkX2Rldl9wYXJhbVttdGRfZGV2c107CisJc3RyY3B5KCZwLT5uYW1lWzBdLCB0b2tlbnNbMF0pOworCisJaWYgKHRva2Vuc1sxXSkKKwkJcC0+dmlkX2hkcl9vZmZzID0gYnl0ZXNfc3RyX3RvX2ludCh0b2tlbnNbMV0pOworCWlmICh0b2tlbnNbMl0pCisJCXAtPmRhdGFfb2ZmcyA9IGJ5dGVzX3N0cl90b19pbnQodG9rZW5zWzJdKTsKKworCWlmIChwLT52aWRfaGRyX29mZnMgPCAwKQorCQlyZXR1cm4gcC0+dmlkX2hkcl9vZmZzOworCWlmIChwLT5kYXRhX29mZnMgPCAwKQorCQlyZXR1cm4gcC0+ZGF0YV9vZmZzOworCisJbXRkX2RldnMgKz0gMTsKKwlyZXR1cm4gMDsKK30KKworbW9kdWxlX3BhcmFtX2NhbGwobXRkLCB1YmlfbXRkX3BhcmFtX3BhcnNlLCBOVUxMLCBOVUxMLCAwMDApOworTU9EVUxFX1BBUk1fREVTQyhtdGQsICJNVEQgZGV2aWNlcyB0byBhdHRhY2guIFBhcmFtZXRlciBmb3JtYXQ6ICIKKwkJICAgICAgIm10ZD08bmFtZXxudW0+Wyw8dmlkX2hkcl9vZmZzPiw8ZGF0YV9vZmZzPl0uICIKKwkJICAgICAgIk11bHRpcGxlIFwibXRkXCIgcGFyYW1ldGVycyBtYXkgYmUgc3BlY2lmaWVkLlxuIgorCQkgICAgICAiTVREIGRldmljZXMgbWF5IGJlIHNwZWNpZmllZCBieSB0aGVpciBudW1iZXIgb3IgbmFtZS4gIgorCQkgICAgICAiT3B0aW9uYWwgXCJ2aWRfaGRyX29mZnNcIiBhbmQgXCJkYXRhX29mZnNcIiBwYXJhbWV0ZXJzICIKKwkJICAgICAgInNwZWNpZnkgVUJJIFZJRCBoZWFkZXIgcG9zaXRpb24gYW5kIGRhdGEgc3RhcnRpbmcgIgorCQkgICAgICAicG9zaXRpb24gdG8gYmUgdXNlZCBieSBVQkkuXG4iCisJCSAgICAgICJFeGFtcGxlOiBtdGQ9Y29udGVudCwxOTg0LDIwNDggbXRkPTQgLSBhdHRhY2ggTVREIGRldmljZSIKKwkJICAgICAgIndpdGggbmFtZSBjb250ZW50IHVzaW5nIFZJRCBoZWFkZXIgb2Zmc2V0IDE5ODQgYW5kIGRhdGEgIgorCQkgICAgICAic3RhcnQgMjA0OCwgYW5kIE1URCBkZXZpY2UgbnVtYmVyIDQgdXNpbmcgZGVmYXVsdCAiCisJCSAgICAgICJvZmZzZXRzIik7CisKK01PRFVMRV9WRVJTSU9OKF9fc3RyaW5naWZ5KFVCSV9WRVJTSU9OKSk7CitNT0RVTEVfREVTQ1JJUFRJT04oIlVCSSAtIFVuc29ydGVkIEJsb2NrIEltYWdlcyIpOworTU9EVUxFX0FVVEhPUigiQXJ0ZW0gQml0eXV0c2tpeSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvdWJpL2NkZXYuYyBiL2RyaXZlcnMvbXRkL3ViaS9jZGV2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYxMmViNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbXRkL3ViaS9jZGV2LmMKQEAgLTAsMCArMSw3MjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4sIDIwMDYKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlCisgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICogQXV0aG9yOiBBcnRlbSBCaXR5dXRza2l5ICjQkdC40YLRjtGG0LrQuNC5INCQ0YDRgtGR0LwpCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBpbmNsdWRlcyBpbXBsZW1lbnRhdGlvbiBvZiBVQkkgY2hhcmFjdGVyIGRldmljZSBvcGVyYXRpb25zLgorICoKKyAqIFRoZXJlIGFyZSB0d28ga2luZHMgb2YgY2hhcmFjdGVyIGRldmljZXMgaW4gVUJJOiBVQkkgY2hhcmFjdGVyIGRldmljZXMgYW5kCisgKiBVQkkgdm9sdW1lIGNoYXJhY3RlciBkZXZpY2VzLiBVQkkgY2hhcmFjdGVyIGRldmljZXMgYWxsb3cgdXNlcnMgdG8KKyAqIG1hbmlwdWxhdGUgd2hvbGUgdm9sdW1lczogY3JlYXRlLCByZW1vdmUsIGFuZCByZS1zaXplIHRoZW0uIFZvbHVtZSBjaGFyYWN0ZXIKKyAqIGRldmljZXMgcHJvdmlkZSB2b2x1bWUgSS9PIGNhcGFiaWxpdGllcy4KKyAqCisgKiBNYWpvciBhbmQgbWlub3IgbnVtYmVycyBhcmUgYXNzaWduZWQgZHluYW1pY2FsbHkgdG8gYm90aCBVQkkgYW5kIHZvbHVtZQorICogY2hhcmFjdGVyIGRldmljZXMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KKyNpbmNsdWRlIDxtdGQvdWJpLXVzZXIuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgorI2luY2x1ZGUgInViaS5oIgorCisvKgorICogTWF4aW11bSBzZXF1ZW5jZSBudW1iZXJzIG9mIFVCSSBhbmQgdm9sdW1lIGNoYXJhY3RlciBkZXZpY2UgSU9DVExzIChkaXJlY3QKKyAqIGxvZ2ljYWwgZXJhc2VibG9jayBlcmFzZSBpcyBhIGRlYnVnLW9ubHkgZmVhdHVyZSkuCisgKi8KKyNkZWZpbmUgVUJJX0NERVZfSU9DX01BWF9TRVEgMgorI2lmbmRlZiBDT05GSUdfTVREX1VCSV9ERUJVR19VU0VSU1BBQ0VfSU8KKyNkZWZpbmUgVk9MX0NERVZfSU9DX01BWF9TRVEgMQorI2Vsc2UKKyNkZWZpbmUgVk9MX0NERVZfSU9DX01BWF9TRVEgMgorI2VuZGlmCisKKy8qKgorICogbWFqb3JfdG9fZGV2aWNlIC0gZ2V0IFVCSSBkZXZpY2Ugb2JqZWN0IGJ5IGNoYXJhY3RlciBkZXZpY2UgbWFqb3IgbnVtYmVyLgorICogQG1ham9yOiBtYWpvciBudW1iZXIKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBVQkkgZGV2aWNlIG9iamVjdC4KKyAqLworc3RhdGljIHN0cnVjdCB1YmlfZGV2aWNlICptYWpvcl90b19kZXZpY2UoaW50IG1ham9yKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHViaV9kZXZpY2VzX2NudDsgaSsrKQorCQlpZiAodWJpX2RldmljZXNbaV0gJiYgdWJpX2RldmljZXNbaV0tPm1ham9yID09IG1ham9yKQorCQkJcmV0dXJuIHViaV9kZXZpY2VzW2ldOworCUJVRygpOworfQorCisvKioKKyAqIGdldF9leGNsdXNpdmUgLSBnZXQgZXhjbHVzaXZlIGFjY2VzcyB0byBhbiBVQkkgdm9sdW1lLgorICogQGRlc2M6IHZvbHVtZSBkZXNjcmlwdG9yCisgKgorICogVGhpcyBmdW5jdGlvbiBjaGFuZ2VzIFVCSSB2b2x1bWUgb3BlbiBtb2RlIHRvICJleGNsdXNpdmUiLiBSZXR1cm5zIHByZXZpb3VzCisgKiBtb2RlIHZhbHVlIChwb3NpdGl2ZSBpbnRlZ2VyKSBpbiBjYXNlIG9mIHN1Y2Nlc3MgYW5kIGEgbmVnYXRpdmUgZXJyb3IgY29kZQorICogaW4gY2FzZSBvZiBmYWlsdXJlLgorICovCitzdGF0aWMgaW50IGdldF9leGNsdXNpdmUoc3RydWN0IHViaV92b2x1bWVfZGVzYyAqZGVzYykKK3sKKwlpbnQgdXNlcnMsIGVycjsKKwlzdHJ1Y3QgdWJpX3ZvbHVtZSAqdm9sID0gZGVzYy0+dm9sOworCisJc3Bpbl9sb2NrKCZ2b2wtPnViaS0+dm9sdW1lc19sb2NrKTsKKwl1c2VycyA9IHZvbC0+cmVhZGVycyArIHZvbC0+d3JpdGVycyArIHZvbC0+ZXhjbHVzaXZlOworCXViaV9hc3NlcnQodXNlcnMgPiAwKTsKKwlpZiAodXNlcnMgPiAxKSB7CisJCWRiZ19lcnIoIiVkIHVzZXJzIGZvciB2b2x1bWUgJWQiLCB1c2Vycywgdm9sLT52b2xfaWQpOworCQllcnIgPSAtRUJVU1k7CisJfSBlbHNlIHsKKwkJdm9sLT5yZWFkZXJzID0gdm9sLT53cml0ZXJzID0gMDsKKwkJdm9sLT5leGNsdXNpdmUgPSAxOworCQllcnIgPSBkZXNjLT5tb2RlOworCQlkZXNjLT5tb2RlID0gVUJJX0VYQ0xVU0lWRTsKKwl9CisJc3Bpbl91bmxvY2soJnZvbC0+dWJpLT52b2x1bWVzX2xvY2spOworCisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKiByZXZva2VfZXhjbHVzaXZlIC0gcmV2b2tlIGV4Y2x1c2l2ZSBtb2RlLgorICogQGRlc2M6IHZvbHVtZSBkZXNjcmlwdG9yCisgKiBAbW9kZTogbmV3IG1vZGUgdG8gc3dpdGNoIHRvCisgKi8KK3N0YXRpYyB2b2lkIHJldm9rZV9leGNsdXNpdmUoc3RydWN0IHViaV92b2x1bWVfZGVzYyAqZGVzYywgaW50IG1vZGUpCit7CisJc3RydWN0IHViaV92b2x1bWUgKnZvbCA9IGRlc2MtPnZvbDsKKworCXNwaW5fbG9jaygmdm9sLT51YmktPnZvbHVtZXNfbG9jayk7CisJdWJpX2Fzc2VydCh2b2wtPnJlYWRlcnMgPT0gMCAmJiB2b2wtPndyaXRlcnMgPT0gMCk7CisJdWJpX2Fzc2VydCh2b2wtPmV4Y2x1c2l2ZSA9PSAxICYmIGRlc2MtPm1vZGUgPT0gVUJJX0VYQ0xVU0lWRSk7CisJdm9sLT5leGNsdXNpdmUgPSAwOworCWlmIChtb2RlID09IFVCSV9SRUFET05MWSkKKwkJdm9sLT5yZWFkZXJzID0gMTsKKwllbHNlIGlmIChtb2RlID09IFVCSV9SRUFEV1JJVEUpCisJCXZvbC0+d3JpdGVycyA9IDE7CisJZWxzZQorCQl2b2wtPmV4Y2x1c2l2ZSA9IDE7CisJc3Bpbl91bmxvY2soJnZvbC0+dWJpLT52b2x1bWVzX2xvY2spOworCisJZGVzYy0+bW9kZSA9IG1vZGU7Cit9CisKK3N0YXRpYyBpbnQgdm9sX2NkZXZfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgdWJpX3ZvbHVtZV9kZXNjICpkZXNjOworCWNvbnN0IHN0cnVjdCB1YmlfZGV2aWNlICp1YmkgPSBtYWpvcl90b19kZXZpY2UoaW1ham9yKGlub2RlKSk7CisJaW50IHZvbF9pZCA9IGltaW5vcihpbm9kZSkgLSAxOworCWludCBtb2RlOworCisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQorCQltb2RlID0gVUJJX1JFQURXUklURTsKKwllbHNlCisJCW1vZGUgPSBVQklfUkVBRE9OTFk7CisKKwlkYmdfbXNnKCJvcGVuIHZvbHVtZSAlZCwgbW9kZSAlZCIsIHZvbF9pZCwgbW9kZSk7CisKKwlkZXNjID0gdWJpX29wZW5fdm9sdW1lKHViaS0+dWJpX251bSwgdm9sX2lkLCBtb2RlKTsKKwlpZiAoSVNfRVJSKGRlc2MpKQorCQlyZXR1cm4gUFRSX0VSUihkZXNjKTsKKworCWZpbGUtPnByaXZhdGVfZGF0YSA9IGRlc2M7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdm9sX2NkZXZfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgdWJpX3ZvbHVtZV9kZXNjICpkZXNjID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB1Ymlfdm9sdW1lICp2b2wgPSBkZXNjLT52b2w7CisKKwlkYmdfbXNnKCJyZWxlYXNlIHZvbHVtZSAlZCwgbW9kZSAlZCIsIHZvbC0+dm9sX2lkLCBkZXNjLT5tb2RlKTsKKworCWlmICh2b2wtPnVwZGF0aW5nKSB7CisJCXViaV93YXJuKCJ1cGRhdGUgb2Ygdm9sdW1lICVkIG5vdCBmaW5pc2hlZCwgdm9sdW1lIGlzIGRhbWFnZWQiLAorCQkJIHZvbC0+dm9sX2lkKTsKKwkJdm9sLT51cGRhdGluZyA9IDA7CisJCWtmcmVlKHZvbC0+dXBkX2J1Zik7CisJfQorCisJdWJpX2Nsb3NlX3ZvbHVtZShkZXNjKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGxvZmZfdCB2b2xfY2Rldl9sbHNlZWsoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBvZmZzZXQsIGludCBvcmlnaW4pCit7CisJc3RydWN0IHViaV92b2x1bWVfZGVzYyAqZGVzYyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgdWJpX3ZvbHVtZSAqdm9sID0gZGVzYy0+dm9sOworCWxvZmZfdCBuZXdfb2Zmc2V0OworCisJaWYgKHZvbC0+dXBkYXRpbmcpIHsKKwkJIC8qIFVwZGF0ZSBpcyBpbiBwcm9ncmVzcywgc2Vla2luZyBpcyBwcm9oaWJpdGVkICovCisJCWRiZ19lcnIoInVwZGF0aW5nIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJc3dpdGNoIChvcmlnaW4pIHsKKwljYXNlIDA6IC8qIFNFRUtfU0VUICovCisJCW5ld19vZmZzZXQgPSBvZmZzZXQ7CisJCWJyZWFrOworCWNhc2UgMTogLyogU0VFS19DVVIgKi8KKwkJbmV3X29mZnNldCA9IGZpbGUtPmZfcG9zICsgb2Zmc2V0OworCQlicmVhazsKKwljYXNlIDI6IC8qIFNFRUtfRU5EICovCisJCW5ld19vZmZzZXQgPSB2b2wtPnVzZWRfYnl0ZXMgKyBvZmZzZXQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChuZXdfb2Zmc2V0IDwgMCB8fCBuZXdfb2Zmc2V0ID4gdm9sLT51c2VkX2J5dGVzKSB7CisJCWRiZ19lcnIoImJhZCBzZWVrICVsbGQiLCBuZXdfb2Zmc2V0KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGJnX21zZygic2VlayB2b2x1bWUgJWQsIG9mZnNldCAlbGxkLCBvcmlnaW4gJWQsIG5ldyBvZmZzZXQgJWxsZCIsCisJCXZvbC0+dm9sX2lkLCBvZmZzZXQsIG9yaWdpbiwgbmV3X29mZnNldCk7CisKKwlmaWxlLT5mX3BvcyA9IG5ld19vZmZzZXQ7CisJcmV0dXJuIG5ld19vZmZzZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHZvbF9jZGV2X3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIF9fdXNlciBjaGFyICpidWYsIHNpemVfdCBjb3VudCwKKwkJCSAgICAgbG9mZl90ICpvZmZwKQoreworCXN0cnVjdCB1Ymlfdm9sdW1lX2Rlc2MgKmRlc2MgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHViaV92b2x1bWUgKnZvbCA9IGRlc2MtPnZvbDsKKwlzdHJ1Y3QgdWJpX2RldmljZSAqdWJpID0gdm9sLT51Ymk7CisJaW50IGVyciwgbG51bSwgb2ZmLCBsZW4sICB2b2xfaWQgPSBkZXNjLT52b2wtPnZvbF9pZCwgdGJ1Zl9zaXplOworCXNpemVfdCBjb3VudF9zYXZlID0gY291bnQ7CisJdm9pZCAqdGJ1ZjsKKwl1aW50NjRfdCB0bXA7CisKKwlkYmdfbXNnKCJyZWFkICV6ZCBieXRlcyBmcm9tIG9mZnNldCAlbGxkIG9mIHZvbHVtZSAlZCIsCisJCWNvdW50LCAqb2ZmcCwgdm9sX2lkKTsKKworCWlmICh2b2wtPnVwZGF0aW5nKSB7CisJCWRiZ19lcnIoInVwZGF0aW5nIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCWlmICh2b2wtPnVwZF9tYXJrZXIpIHsKKwkJZGJnX2VycigiZGFtYWdlZCB2b2x1bWUsIHVwZGF0ZSBtYXJrZXIgaXMgc2V0Iik7CisJCXJldHVybiAtRUJBREY7CisJfQorCWlmICgqb2ZmcCA9PSB2b2wtPnVzZWRfYnl0ZXMgfHwgY291bnQgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlpZiAodm9sLT5jb3JydXB0ZWQpCisJCWRiZ19tc2coInJlYWQgZnJvbSBjb3JydXB0ZWQgdm9sdW1lICVkIiwgdm9sX2lkKTsKKworCWlmICgqb2ZmcCArIGNvdW50ID4gdm9sLT51c2VkX2J5dGVzKQorCQljb3VudF9zYXZlID0gY291bnQgPSB2b2wtPnVzZWRfYnl0ZXMgLSAqb2ZmcDsKKworCXRidWZfc2l6ZSA9IHZvbC0+dXNhYmxlX2xlYl9zaXplOworCWlmIChjb3VudCA8IHRidWZfc2l6ZSkKKwkJdGJ1Zl9zaXplID0gQUxJR04oY291bnQsIHViaS0+bWluX2lvX3NpemUpOworCXRidWYgPSBrbWFsbG9jKHRidWZfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF0YnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWxlbiA9IGNvdW50ID4gdGJ1Zl9zaXplID8gdGJ1Zl9zaXplIDogY291bnQ7CisKKwl0bXAgPSAqb2ZmcDsKKwlvZmYgPSBkb19kaXYodG1wLCB2b2wtPnVzYWJsZV9sZWJfc2l6ZSk7CisJbG51bSA9IHRtcDsKKworCWRvIHsKKwkJY29uZF9yZXNjaGVkKCk7CisKKwkJaWYgKG9mZiArIGxlbiA+PSB2b2wtPnVzYWJsZV9sZWJfc2l6ZSkKKwkJCWxlbiA9IHZvbC0+dXNhYmxlX2xlYl9zaXplIC0gb2ZmOworCisJCWVyciA9IHViaV9lYmFfcmVhZF9sZWIodWJpLCB2b2xfaWQsIGxudW0sIHRidWYsIG9mZiwgbGVuLCAwKTsKKwkJaWYgKGVycikKKwkJCWJyZWFrOworCisJCW9mZiArPSBsZW47CisJCWlmIChvZmYgPT0gdm9sLT51c2FibGVfbGViX3NpemUpIHsKKwkJCWxudW0gKz0gMTsKKwkJCW9mZiAtPSB2b2wtPnVzYWJsZV9sZWJfc2l6ZTsKKwkJfQorCisJCWNvdW50IC09IGxlbjsKKwkJKm9mZnAgKz0gbGVuOworCisJCWVyciA9IGNvcHlfdG9fdXNlcihidWYsIHRidWYsIGxlbik7CisJCWlmIChlcnIpIHsKKwkJCWVyciA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCisJCWJ1ZiArPSBsZW47CisJCWxlbiA9IGNvdW50ID4gdGJ1Zl9zaXplID8gdGJ1Zl9zaXplIDogY291bnQ7CisJfSB3aGlsZSAoY291bnQpOworCisJa2ZyZWUodGJ1Zik7CisJcmV0dXJuIGVyciA/IGVyciA6IGNvdW50X3NhdmUgLSBjb3VudDsKK30KKworI2lmZGVmIENPTkZJR19NVERfVUJJX0RFQlVHX1VTRVJTUEFDRV9JTworCisvKgorICogVGhpcyBmdW5jdGlvbiBhbGxvd3MgdG8gZGlyZWN0bHkgd3JpdGUgdG8gZHluYW1pYyBVQkkgdm9sdW1lcywgd2l0aG91dAorICogaXNzdWluZyB0aGUgdm9sdW1lIHVwZGF0ZSBvcGVyYXRpb24uIEF2YWlsYWJsZSBvbmx5IGFzIGEgZGVidWdnaW5nIGZlYXR1cmUuCisgKiBWZXJ5IHVzZWZ1bCBmb3IgdGVzdGluZyBVQkkuCisgKi8KK3N0YXRpYyBzc2l6ZV90IHZvbF9jZGV2X2RpcmVjdF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCQkgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpvZmZwKQoreworCXN0cnVjdCB1Ymlfdm9sdW1lX2Rlc2MgKmRlc2MgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHViaV92b2x1bWUgKnZvbCA9IGRlc2MtPnZvbDsKKwlzdHJ1Y3QgdWJpX2RldmljZSAqdWJpID0gdm9sLT51Ymk7CisJaW50IGxudW0sIG9mZiwgbGVuLCB0YnVmX3NpemUsIHZvbF9pZCA9IHZvbC0+dm9sX2lkLCBlcnIgPSAwOworCXNpemVfdCBjb3VudF9zYXZlID0gY291bnQ7CisJY2hhciAqdGJ1ZjsKKwl1aW50NjRfdCB0bXA7CisKKwlkYmdfbXNnKCJyZXF1ZXN0ZWQ6IHdyaXRlICV6ZCBieXRlcyB0byBvZmZzZXQgJWxsZCBvZiB2b2x1bWUgJXUiLAorCQljb3VudCwgKm9mZnAsIGRlc2MtPnZvbC0+dm9sX2lkKTsKKworCWlmICh2b2wtPnZvbF90eXBlID09IFVCSV9TVEFUSUNfVk9MVU1FKQorCQlyZXR1cm4gLUVST0ZTOworCisJdG1wID0gKm9mZnA7CisJb2ZmID0gZG9fZGl2KHRtcCwgdm9sLT51c2FibGVfbGViX3NpemUpOworCWxudW0gPSB0bXA7CisKKwlpZiAob2ZmICUgdWJpLT5taW5faW9fc2l6ZSkgeworCQlkYmdfZXJyKCJ1bmFsaWduZWQgcG9zaXRpb24iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCpvZmZwICsgY291bnQgPiB2b2wtPnVzZWRfYnl0ZXMpCisJCWNvdW50X3NhdmUgPSBjb3VudCA9IHZvbC0+dXNlZF9ieXRlcyAtICpvZmZwOworCisJLyogV2UgY2FuIHdyaXRlIG9ubHkgaW4gZnJhY3Rpb25zIG9mIHRoZSBtaW5pbXVtIEkvTyB1bml0ICovCisJaWYgKGNvdW50ICUgdWJpLT5taW5faW9fc2l6ZSkgeworCQlkYmdfZXJyKCJ1bmFsaWduZWQgd3JpdGUgbGVuZ3RoIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXRidWZfc2l6ZSA9IHZvbC0+dXNhYmxlX2xlYl9zaXplOworCWlmIChjb3VudCA8IHRidWZfc2l6ZSkKKwkJdGJ1Zl9zaXplID0gQUxJR04oY291bnQsIHViaS0+bWluX2lvX3NpemUpOworCXRidWYgPSBrbWFsbG9jKHRidWZfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF0YnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWxlbiA9IGNvdW50ID4gdGJ1Zl9zaXplID8gdGJ1Zl9zaXplIDogY291bnQ7CisKKwl3aGlsZSAoY291bnQpIHsKKwkJY29uZF9yZXNjaGVkKCk7CisKKwkJaWYgKG9mZiArIGxlbiA+PSB2b2wtPnVzYWJsZV9sZWJfc2l6ZSkKKwkJCWxlbiA9IHZvbC0+dXNhYmxlX2xlYl9zaXplIC0gb2ZmOworCisJCWVyciA9IGNvcHlfZnJvbV91c2VyKHRidWYsIGJ1ZiwgbGVuKTsKKwkJaWYgKGVycikgeworCQkJZXJyID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisKKwkJZXJyID0gdWJpX2ViYV93cml0ZV9sZWIodWJpLCB2b2xfaWQsIGxudW0sIHRidWYsIG9mZiwgbGVuLAorCQkJCQlVQklfVU5LTk9XTik7CisJCWlmIChlcnIpCisJCQlicmVhazsKKworCQlvZmYgKz0gbGVuOworCQlpZiAob2ZmID09IHZvbC0+dXNhYmxlX2xlYl9zaXplKSB7CisJCQlsbnVtICs9IDE7CisJCQlvZmYgLT0gdm9sLT51c2FibGVfbGViX3NpemU7CisJCX0KKworCQljb3VudCAtPSBsZW47CisJCSpvZmZwICs9IGxlbjsKKwkJYnVmICs9IGxlbjsKKwkJbGVuID0gY291bnQgPiB0YnVmX3NpemUgPyB0YnVmX3NpemUgOiBjb3VudDsKKwl9CisKKwlrZnJlZSh0YnVmKTsKKwlyZXR1cm4gZXJyID8gZXJyIDogY291bnRfc2F2ZSAtIGNvdW50OworfQorCisjZWxzZQorI2RlZmluZSB2b2xfY2Rldl9kaXJlY3Rfd3JpdGUoZmlsZSwgYnVmLCBjb3VudCwgb2ZmcCkgLUVQRVJNCisjZW5kaWYgLyogQ09ORklHX01URF9VQklfREVCVUdfVVNFUlNQQUNFX0lPICovCisKK3N0YXRpYyBzc2l6ZV90IHZvbF9jZGV2X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAorCQkJICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKm9mZnApCit7CisJaW50IGVyciA9IDA7CisJc3RydWN0IHViaV92b2x1bWVfZGVzYyAqZGVzYyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgdWJpX3ZvbHVtZSAqdm9sID0gZGVzYy0+dm9sOworCXN0cnVjdCB1YmlfZGV2aWNlICp1YmkgPSB2b2wtPnViaTsKKworCWlmICghdm9sLT51cGRhdGluZykKKwkJcmV0dXJuIHZvbF9jZGV2X2RpcmVjdF93cml0ZShmaWxlLCBidWYsIGNvdW50LCBvZmZwKTsKKworCWVyciA9IHViaV9tb3JlX3VwZGF0ZV9kYXRhKHViaSwgdm9sLT52b2xfaWQsIGJ1ZiwgY291bnQpOworCWlmIChlcnIgPCAwKSB7CisJCXViaV9lcnIoImNhbm5vdCB3cml0ZSAlemQgYnl0ZXMgb2YgdXBkYXRlIGRhdGEiLCBjb3VudCk7CisJCXJldHVybiBlcnI7CisJfQorCisJaWYgKGVycikgeworCQkvKgorCQkgKiBVcGRhdGUgaXMgZmluaXNoZWQsIEBlcnIgY29udGFpbnMgbnVtYmVyIG9mIGFjdHVhbGx5IHdyaXR0ZW4KKwkJICogYnl0ZXMgbm93LgorCQkgKi8KKwkJY291bnQgPSBlcnI7CisKKwkJZXJyID0gdWJpX2NoZWNrX3ZvbHVtZSh1YmksIHZvbC0+dm9sX2lkKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCisJCWlmIChlcnIpIHsKKwkJCXViaV93YXJuKCJ2b2x1bWUgJWQgb24gVUJJIGRldmljZSAlZCBpcyBjb3JydXB0ZWQiLAorCQkJCSB2b2wtPnZvbF9pZCwgdWJpLT51YmlfbnVtKTsKKwkJCXZvbC0+Y29ycnVwdGVkID0gMTsKKwkJfQorCQl2b2wtPmNoZWNrZWQgPSAxOworCQlyZXZva2VfZXhjbHVzaXZlKGRlc2MsIFVCSV9SRUFEV1JJVEUpOworCX0KKworCSpvZmZwICs9IGNvdW50OworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludCB2b2xfY2Rldl9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IGVyciA9IDA7CisJc3RydWN0IHViaV92b2x1bWVfZGVzYyAqZGVzYyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgdWJpX3ZvbHVtZSAqdm9sID0gZGVzYy0+dm9sOworCXN0cnVjdCB1YmlfZGV2aWNlICp1YmkgPSB2b2wtPnViaTsKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKworCWlmIChfSU9DX05SKGNtZCkgPiBWT0xfQ0RFVl9JT0NfTUFYX1NFUSB8fAorCSAgICBfSU9DX1RZUEUoY21kKSAhPSBVQklfVk9MX0lPQ19NQUdJQykKKwkJcmV0dXJuIC1FTk9UVFk7CisKKwlpZiAoX0lPQ19ESVIoY21kKSAmJiBfSU9DX1JFQUQpCisJCWVyciA9ICFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBhcmdwLCBfSU9DX1NJWkUoY21kKSk7CisJZWxzZSBpZiAoX0lPQ19ESVIoY21kKSAmJiBfSU9DX1dSSVRFKQorCQllcnIgPSAhYWNjZXNzX29rKFZFUklGWV9SRUFELCBhcmdwLCBfSU9DX1NJWkUoY21kKSk7CisJaWYgKGVycikKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlzd2l0Y2ggKGNtZCkgeworCisJLyogVm9sdW1lIHVwZGF0ZSBjb21tYW5kICovCisJY2FzZSBVQklfSU9DVk9MVVA6CisJeworCQlpbnQ2NF90IGJ5dGVzLCByc3ZkX2J5dGVzOworCisJCWlmICghY2FwYWJsZShDQVBfU1lTX1JFU09VUkNFKSkgeworCQkJZXJyID0gLUVQRVJNOworCQkJYnJlYWs7CisJCX0KKworCQllcnIgPSBjb3B5X2Zyb21fdXNlcigmYnl0ZXMsIGFyZ3AsIHNpemVvZihpbnQ2NF90KSk7CisJCWlmIChlcnIpIHsKKwkJCWVyciA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChkZXNjLT5tb2RlID09IFVCSV9SRUFET05MWSkgeworCQkJZXJyID0gLUVST0ZTOworCQkJYnJlYWs7CisJCX0KKworCQlyc3ZkX2J5dGVzID0gdm9sLT5yZXNlcnZlZF9wZWJzICogKHViaS0+bGViX3NpemUtdm9sLT5kYXRhX3BhZCk7CisJCWlmIChieXRlcyA8IDAgfHwgYnl0ZXMgPiByc3ZkX2J5dGVzKSB7CisJCQllcnIgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKworCQllcnIgPSBnZXRfZXhjbHVzaXZlKGRlc2MpOworCQlpZiAoZXJyIDwgMCkKKwkJCWJyZWFrOworCisJCWVyciA9IHViaV9zdGFydF91cGRhdGUodWJpLCB2b2wtPnZvbF9pZCwgYnl0ZXMpOworCQlpZiAoYnl0ZXMgPT0gMCkKKwkJCXJldm9rZV9leGNsdXNpdmUoZGVzYywgVUJJX1JFQURXUklURSk7CisKKwkJZmlsZS0+Zl9wb3MgPSAwOworCQlicmVhazsKKwl9CisKKyNpZmRlZiBDT05GSUdfTVREX1VCSV9ERUJVR19VU0VSU1BBQ0VfSU8KKwkvKiBMb2dpY2FsIGVyYXNlYmxvY2sgZXJhc3VyZSBjb21tYW5kICovCisJY2FzZSBVQklfSU9DRUJFUjoKKwl7CisJCWludDMyX3QgbG51bTsKKworCQllcnIgPSBfX2dldF91c2VyKGxudW0sIChfX3VzZXIgaW50MzJfdCAqKWFyZ3ApOworCQlpZiAoZXJyKSB7CisJCQllcnIgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoZGVzYy0+bW9kZSA9PSBVQklfUkVBRE9OTFkpIHsKKwkJCWVyciA9IC1FUk9GUzsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGxudW0gPCAwIHx8IGxudW0gPj0gdm9sLT5yZXNlcnZlZF9wZWJzKSB7CisJCQllcnIgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAodm9sLT52b2xfdHlwZSAhPSBVQklfRFlOQU1JQ19WT0xVTUUpIHsKKwkJCWVyciA9IC1FUk9GUzsKKwkJCWJyZWFrOworCQl9CisKKwkJZGJnX21zZygiZXJhc2UgTEVCICVkOiVkIiwgdm9sLT52b2xfaWQsIGxudW0pOworCQllcnIgPSB1YmlfZWJhX3VubWFwX2xlYih1YmksIHZvbC0+dm9sX2lkLCBsbnVtKTsKKwkJaWYgKGVycikKKwkJCWJyZWFrOworCisJCWVyciA9IHViaV93bF9mbHVzaCh1YmkpOworCQlicmVhazsKKwl9CisjZW5kaWYKKworCWRlZmF1bHQ6CisJCWVyciA9IC1FTk9UVFk7CisJCWJyZWFrOworCX0KKworCXJldHVybiBlcnI7Cit9CisKKy8qKgorICogdmVyaWZ5X21rdm9sX3JlcSAtIHZlcmlmeSB2b2x1bWUgY3JlYXRpb24gcmVxdWVzdC4KKyAqIEB1Ymk6IFVCSSBkZXZpY2UgZGVzY3JpcHRpb24gb2JqZWN0CisgKiBAcmVxOiB0aGUgcmVxdWVzdCB0byBjaGVjaworICoKKyAqIFRoaXMgZnVuY3Rpb24gemVybyBpZiB0aGUgcmVxdWVzdCBpcyBjb3JyZWN0LCBhbmQgJS1FSU5WQUwgaWYgbm90LgorICovCitzdGF0aWMgaW50IHZlcmlmeV9ta3ZvbF9yZXEoY29uc3Qgc3RydWN0IHViaV9kZXZpY2UgKnViaSwKKwkJCSAgICBjb25zdCBzdHJ1Y3QgdWJpX21rdm9sX3JlcSAqcmVxKQoreworCWludCBuLCBlcnIgPSAtRUlOVkFMOworCisJaWYgKHJlcS0+Ynl0ZXMgPCAwIHx8IHJlcS0+YWxpZ25tZW50IDwgMCB8fCByZXEtPnZvbF90eXBlIDwgMCB8fAorCSAgICByZXEtPm5hbWVfbGVuIDwgMCkKKwkJZ290byBiYWQ7CisKKwlpZiAoKHJlcS0+dm9sX2lkIDwgMCB8fCByZXEtPnZvbF9pZCA+PSB1YmktPnZ0Ymxfc2xvdHMpICYmCisJICAgIHJlcS0+dm9sX2lkICE9IFVCSV9WT0xfTlVNX0FVVE8pCisJCWdvdG8gYmFkOworCisJaWYgKHJlcS0+YWxpZ25tZW50ID09IDApCisJCWdvdG8gYmFkOworCisJaWYgKHJlcS0+Ynl0ZXMgPT0gMCkKKwkJZ290byBiYWQ7CisKKwlpZiAocmVxLT52b2xfdHlwZSAhPSBVQklfRFlOQU1JQ19WT0xVTUUgJiYKKwkgICAgcmVxLT52b2xfdHlwZSAhPSBVQklfU1RBVElDX1ZPTFVNRSkKKwkJZ290byBiYWQ7CisKKwlpZiAocmVxLT5hbGlnbm1lbnQgPiB1YmktPmxlYl9zaXplKQorCQlnb3RvIGJhZDsKKworCW4gPSByZXEtPmFsaWdubWVudCAlIHViaS0+bWluX2lvX3NpemU7CisJaWYgKHJlcS0+YWxpZ25tZW50ICE9IDEgJiYgbikKKwkJZ290byBiYWQ7CisKKwlpZiAocmVxLT5uYW1lX2xlbiA+IFVCSV9WT0xfTkFNRV9NQVgpIHsKKwkJZXJyID0gLUVOQU1FVE9PTE9ORzsKKwkJZ290byBiYWQ7CisJfQorCisJcmV0dXJuIDA7CisKK2JhZDoKKwlkYmdfZXJyKCJiYWQgdm9sdW1lIGNyZWF0aW9uIHJlcXVlc3QiKTsKKwl1YmlfZGJnX2R1bXBfbWt2b2xfcmVxKHJlcSk7CisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKiB2ZXJpZnlfcnN2b2xfcmVxIC0gdmVyaWZ5IHZvbHVtZSByZS1zaXplIHJlcXVlc3QuCisgKiBAdWJpOiBVQkkgZGV2aWNlIGRlc2NyaXB0aW9uIG9iamVjdAorICogQHJlcTogdGhlIHJlcXVlc3QgdG8gY2hlY2sKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgemVybyBpZiB0aGUgcmVxdWVzdCBpcyBjb3JyZWN0LCBhbmQgJS1FSU5WQUwgaWYgbm90LgorICovCitzdGF0aWMgaW50IHZlcmlmeV9yc3ZvbF9yZXEoY29uc3Qgc3RydWN0IHViaV9kZXZpY2UgKnViaSwKKwkJCSAgICBjb25zdCBzdHJ1Y3QgdWJpX3Jzdm9sX3JlcSAqcmVxKQoreworCWlmIChyZXEtPmJ5dGVzIDw9IDApCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHJlcS0+dm9sX2lkIDwgMCB8fCByZXEtPnZvbF9pZCA+PSB1YmktPnZ0Ymxfc2xvdHMpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdWJpX2NkZXZfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCBlcnIgPSAwOworCXN0cnVjdCB1YmlfZGV2aWNlICp1Ymk7CisJc3RydWN0IHViaV92b2x1bWVfZGVzYyAqZGVzYzsKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKworCWlmIChfSU9DX05SKGNtZCkgPiBVQklfQ0RFVl9JT0NfTUFYX1NFUSB8fAorCSAgICBfSU9DX1RZUEUoY21kKSAhPSBVQklfSU9DX01BR0lDKQorCQlyZXR1cm4gLUVOT1RUWTsKKworCWlmIChfSU9DX0RJUihjbWQpICYmIF9JT0NfUkVBRCkKKwkJZXJyID0gIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGFyZ3AsIF9JT0NfU0laRShjbWQpKTsKKwllbHNlIGlmIChfSU9DX0RJUihjbWQpICYmIF9JT0NfV1JJVEUpCisJCWVyciA9ICFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGFyZ3AsIF9JT0NfU0laRShjbWQpKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmICghY2FwYWJsZShDQVBfU1lTX1JFU09VUkNFKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCXViaSA9IG1ham9yX3RvX2RldmljZShpbWFqb3IoaW5vZGUpKTsKKwlpZiAoSVNfRVJSKHViaSkpCisJCXJldHVybiBQVFJfRVJSKHViaSk7CisKKwlzd2l0Y2ggKGNtZCkgeworCS8qIENyZWF0ZSB2b2x1bWUgY29tbWFuZCAqLworCWNhc2UgVUJJX0lPQ01LVk9MOgorCXsKKwkJc3RydWN0IHViaV9ta3ZvbF9yZXEgcmVxOworCisJCWRiZ19tc2coImNyZWF0ZSB2b2x1bWUiKTsKKwkJZXJyID0gX19jb3B5X2Zyb21fdXNlcigmcmVxLCBhcmdwLAorCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IHViaV9ta3ZvbF9yZXEpKTsKKwkJaWYgKGVycikgeworCQkJZXJyID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisKKwkJZXJyID0gdmVyaWZ5X21rdm9sX3JlcSh1YmksICZyZXEpOworCQlpZiAoZXJyKQorCQkJYnJlYWs7CisKKwkJcmVxLm5hbWVbcmVxLm5hbWVfbGVuXSA9ICdcMCc7CisKKwkJZXJyID0gdWJpX2NyZWF0ZV92b2x1bWUodWJpLCAmcmVxKTsKKwkJaWYgKGVycikKKwkJCWJyZWFrOworCisJCWVyciA9IF9fcHV0X3VzZXIocmVxLnZvbF9pZCwgKF9fdXNlciBpbnQzMl90ICopYXJncCk7CisJCWlmIChlcnIpCisJCQllcnIgPSAtRUZBVUxUOworCisJCWJyZWFrOworCX0KKworCS8qIFJlbW92ZSB2b2x1bWUgY29tbWFuZCAqLworCWNhc2UgVUJJX0lPQ1JNVk9MOgorCXsKKwkJaW50IHZvbF9pZDsKKworCQlkYmdfbXNnKCJyZW1vdmUgdm9sdW1lIik7CisJCWVyciA9IF9fZ2V0X3VzZXIodm9sX2lkLCAoX191c2VyIGludDMyX3QgKilhcmdwKTsKKwkJaWYgKGVycikgeworCQkJZXJyID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisKKwkJZGVzYyA9IHViaV9vcGVuX3ZvbHVtZSh1YmktPnViaV9udW0sIHZvbF9pZCwgVUJJX0VYQ0xVU0lWRSk7CisJCWlmIChJU19FUlIoZGVzYykpIHsKKwkJCWVyciA9IFBUUl9FUlIoZGVzYyk7CisJCQlicmVhazsKKwkJfQorCisJCWVyciA9IHViaV9yZW1vdmVfdm9sdW1lKGRlc2MpOworCQlpZiAoZXJyKQorCQkJdWJpX2Nsb3NlX3ZvbHVtZShkZXNjKTsKKworCQlicmVhazsKKwl9CisKKwkvKiBSZS1zaXplIHZvbHVtZSBjb21tYW5kICovCisJY2FzZSBVQklfSU9DUlNWT0w6CisJeworCQlpbnQgcGViczsKKwkJdWludDY0X3QgdG1wOworCQlzdHJ1Y3QgdWJpX3Jzdm9sX3JlcSByZXE7CisKKwkJZGJnX21zZygicmUtc2l6ZSB2b2x1bWUiKTsKKwkJZXJyID0gX19jb3B5X2Zyb21fdXNlcigmcmVxLCBhcmdwLAorCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IHViaV9yc3ZvbF9yZXEpKTsKKwkJaWYgKGVycikgeworCQkJZXJyID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisKKwkJZXJyID0gdmVyaWZ5X3Jzdm9sX3JlcSh1YmksICZyZXEpOworCQlpZiAoZXJyKQorCQkJYnJlYWs7CisKKwkJZGVzYyA9IHViaV9vcGVuX3ZvbHVtZSh1YmktPnViaV9udW0sIHJlcS52b2xfaWQsIFVCSV9FWENMVVNJVkUpOworCQlpZiAoSVNfRVJSKGRlc2MpKSB7CisJCQllcnIgPSBQVFJfRVJSKGRlc2MpOworCQkJYnJlYWs7CisJCX0KKworCQl0bXAgPSByZXEuYnl0ZXM7CisJCXBlYnMgPSAhIWRvX2Rpdih0bXAsIGRlc2MtPnZvbC0+dXNhYmxlX2xlYl9zaXplKTsKKwkJcGVicyArPSB0bXA7CisKKwkJZXJyID0gdWJpX3Jlc2l6ZV92b2x1bWUoZGVzYywgcGVicyk7CisJCXViaV9jbG9zZV92b2x1bWUoZGVzYyk7CisJCWJyZWFrOworCX0KKworCWRlZmF1bHQ6CisJCWVyciA9IC1FTk9UVFk7CisJCWJyZWFrOworCX0KKworCXJldHVybiBlcnI7Cit9CisKKy8qIFVCSSBjaGFyYWN0ZXIgZGV2aWNlIG9wZXJhdGlvbnMgKi8KK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgdWJpX2NkZXZfb3BlcmF0aW9ucyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkuaW9jdGwgPSB1YmlfY2Rldl9pb2N0bCwKKwkubGxzZWVrID0gbm9fbGxzZWVrCit9OworCisvKiBVQkkgdm9sdW1lIGNoYXJhY3RlciBkZXZpY2Ugb3BlcmF0aW9ucyAqLworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB1Ymlfdm9sX2NkZXZfb3BlcmF0aW9ucyA9IHsKKwkub3duZXIgICA9IFRISVNfTU9EVUxFLAorCS5vcGVuICAgID0gdm9sX2NkZXZfb3BlbiwKKwkucmVsZWFzZSA9IHZvbF9jZGV2X3JlbGVhc2UsCisJLmxsc2VlayAgPSB2b2xfY2Rldl9sbHNlZWssCisJLnJlYWQgICAgPSB2b2xfY2Rldl9yZWFkLAorCS53cml0ZSAgID0gdm9sX2NkZXZfd3JpdGUsCisJLmlvY3RsICAgPSB2b2xfY2Rldl9pb2N0bAorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL3ViaS9kZWJ1Zy5jIGIvZHJpdmVycy9tdGQvdWJpL2RlYnVnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYzNjQyMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbXRkL3ViaS9kZWJ1Zy5jCkBAIC0wLDAgKzEsMjI0IEBACisvKgorICogQ29weXJpZ2h0IChjKSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuLCAyMDA2CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZQorICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqIEF1dGhvcjogQXJ0ZW0gQml0eXV0c2tpeSAo0JHQuNGC0Y7RhtC60LjQuSDQkNGA0YLRkdC8KQorICovCisKKy8qCisgKiBIZXJlIHdlIGtlZXAgYWxsIHRoZSBVQkkgZGVidWdnaW5nIHN0dWZmIHdoaWNoIHNob3VsZCBub3JtYWxseSBiZSBkaXNhYmxlZAorICogYW5kIGNvbXBpbGVkLW91dCwgYnV0IGl0IGlzIGV4dHJlbWVseSBoZWxwZnVsIHdoZW4gaHVudGluZyBidWdzIG9yIGRvaW5nIGJpZworICogY2hhbmdlcy4KKyAqLworCisjaWZkZWYgQ09ORklHX01URF9VQklfREVCVUdfTVNHCisKKyNpbmNsdWRlICJ1YmkuaCIKKworLyoqCisgKiB1YmlfZGJnX2R1bXBfZWNfaGRyIC0gZHVtcCBhbiBlcmFzZSBjb3VudGVyIGhlYWRlci4KKyAqIEBlY19oZHI6IHRoZSBlcmFzZSBjb3VudGVyIGhlYWRlciB0byBkdW1wCisgKi8KK3ZvaWQgdWJpX2RiZ19kdW1wX2VjX2hkcihjb25zdCBzdHJ1Y3QgdWJpX2VjX2hkciAqZWNfaGRyKQoreworCWRiZ19tc2coImVyYXNlIGNvdW50ZXIgaGVhZGVyIGR1bXA6Iik7CisJZGJnX21zZygibWFnaWMgICAgICAgICAgJSMwOHgiLCB1YmkzMl90b19jcHUoZWNfaGRyLT5tYWdpYykpOworCWRiZ19tc2coInZlcnNpb24gICAgICAgICVkIiwgICAgKGludCllY19oZHItPnZlcnNpb24pOworCWRiZ19tc2coImVjICAgICAgICAgICAgICVsbHUiLCAgKGxvbmcgbG9uZyl1Ymk2NF90b19jcHUoZWNfaGRyLT5lYykpOworCWRiZ19tc2coInZpZF9oZHJfb2Zmc2V0ICVkIiwgICAgdWJpMzJfdG9fY3B1KGVjX2hkci0+dmlkX2hkcl9vZmZzZXQpKTsKKwlkYmdfbXNnKCJkYXRhX29mZnNldCAgICAlZCIsICAgIHViaTMyX3RvX2NwdShlY19oZHItPmRhdGFfb2Zmc2V0KSk7CisJZGJnX21zZygiaGRyX2NyYyAgICAgICAgJSMwOHgiLCB1YmkzMl90b19jcHUoZWNfaGRyLT5oZHJfY3JjKSk7CisJZGJnX21zZygiZXJhc2UgY291bnRlciBoZWFkZXIgaGV4ZHVtcDoiKTsKKwl1YmlfZGJnX2hleGR1bXAoZWNfaGRyLCBVQklfRUNfSERSX1NJWkUpOworfQorCisvKioKKyAqIHViaV9kYmdfZHVtcF92aWRfaGRyIC0gZHVtcCBhIHZvbHVtZSBpZGVudGlmaWVyIGhlYWRlci4KKyAqIEB2aWRfaGRyOiB0aGUgdm9sdW1lIGlkZW50aWZpZXIgaGVhZGVyIHRvIGR1bXAKKyAqLwordm9pZCB1YmlfZGJnX2R1bXBfdmlkX2hkcihjb25zdCBzdHJ1Y3QgdWJpX3ZpZF9oZHIgKnZpZF9oZHIpCit7CisJZGJnX21zZygidm9sdW1lIGlkZW50aWZpZXIgaGVhZGVyIGR1bXA6Iik7CisJZGJnX21zZygibWFnaWMgICAgICUwOHgiLCB1YmkzMl90b19jcHUodmlkX2hkci0+bWFnaWMpKTsKKwlkYmdfbXNnKCJ2ZXJzaW9uICAgJWQiLCAgIChpbnQpdmlkX2hkci0+dmVyc2lvbik7CisJZGJnX21zZygidm9sX3R5cGUgICVkIiwgICAoaW50KXZpZF9oZHItPnZvbF90eXBlKTsKKwlkYmdfbXNnKCJjb3B5X2ZsYWcgJWQiLCAgIChpbnQpdmlkX2hkci0+Y29weV9mbGFnKTsKKwlkYmdfbXNnKCJjb21wYXQgICAgJWQiLCAgIChpbnQpdmlkX2hkci0+Y29tcGF0KTsKKwlkYmdfbXNnKCJ2b2xfaWQgICAgJWQiLCAgIHViaTMyX3RvX2NwdSh2aWRfaGRyLT52b2xfaWQpKTsKKwlkYmdfbXNnKCJsbnVtICAgICAgJWQiLCAgIHViaTMyX3RvX2NwdSh2aWRfaGRyLT5sbnVtKSk7CisJZGJnX21zZygibGViX3ZlciAgICV1IiwgICB1YmkzMl90b19jcHUodmlkX2hkci0+bGViX3ZlcikpOworCWRiZ19tc2coImRhdGFfc2l6ZSAlZCIsICAgdWJpMzJfdG9fY3B1KHZpZF9oZHItPmRhdGFfc2l6ZSkpOworCWRiZ19tc2coInVzZWRfZWJzICAlZCIsICAgdWJpMzJfdG9fY3B1KHZpZF9oZHItPnVzZWRfZWJzKSk7CisJZGJnX21zZygiZGF0YV9wYWQgICVkIiwgICB1YmkzMl90b19jcHUodmlkX2hkci0+ZGF0YV9wYWQpKTsKKwlkYmdfbXNnKCJzcW51bSAgICAgJWxsdSIsCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpdWJpNjRfdG9fY3B1KHZpZF9oZHItPnNxbnVtKSk7CisJZGJnX21zZygiaGRyX2NyYyAgICUwOHgiLCB1YmkzMl90b19jcHUodmlkX2hkci0+aGRyX2NyYykpOworCWRiZ19tc2coInZvbHVtZSBpZGVudGlmaWVyIGhlYWRlciBoZXhkdW1wOiIpOworfQorCisvKioKKyAqIHViaV9kYmdfZHVtcF92b2xfaW5mby0gZHVtcCB2b2x1bWUgaW5mb3JtYXRpb24uCisgKiBAdm9sOiBVQkkgdm9sdW1lIGRlc2NyaXB0aW9uIG9iamVjdAorICovCit2b2lkIHViaV9kYmdfZHVtcF92b2xfaW5mbyhjb25zdCBzdHJ1Y3QgdWJpX3ZvbHVtZSAqdm9sKQoreworCWRiZ19tc2coInZvbHVtZSBpbmZvcm1hdGlvbiBkdW1wOiIpOworCWRiZ19tc2coInZvbF9pZCAgICAgICAgICAlZCIsIHZvbC0+dm9sX2lkKTsKKwlkYmdfbXNnKCJyZXNlcnZlZF9wZWJzICAgJWQiLCB2b2wtPnJlc2VydmVkX3BlYnMpOworCWRiZ19tc2coImFsaWdubWVudCAgICAgICAlZCIsIHZvbC0+YWxpZ25tZW50KTsKKwlkYmdfbXNnKCJkYXRhX3BhZCAgICAgICAgJWQiLCB2b2wtPmRhdGFfcGFkKTsKKwlkYmdfbXNnKCJ2b2xfdHlwZSAgICAgICAgJWQiLCB2b2wtPnZvbF90eXBlKTsKKwlkYmdfbXNnKCJuYW1lX2xlbiAgICAgICAgJWQiLCB2b2wtPm5hbWVfbGVuKTsKKwlkYmdfbXNnKCJ1c2FibGVfbGViX3NpemUgJWQiLCB2b2wtPnVzYWJsZV9sZWJfc2l6ZSk7CisJZGJnX21zZygidXNlZF9lYnMgICAgICAgICVkIiwgdm9sLT51c2VkX2Vicyk7CisJZGJnX21zZygidXNlZF9ieXRlcyAgICAgICVsbGQiLCB2b2wtPnVzZWRfYnl0ZXMpOworCWRiZ19tc2coImxhc3RfZWJfYnl0ZXMgICAlZCIsIHZvbC0+bGFzdF9lYl9ieXRlcyk7CisJZGJnX21zZygiY29ycnVwdGVkICAgICAgICVkIiwgdm9sLT5jb3JydXB0ZWQpOworCWRiZ19tc2coInVwZF9tYXJrZXIgICAgICAlZCIsIHZvbC0+dXBkX21hcmtlcik7CisKKwlpZiAodm9sLT5uYW1lX2xlbiA8PSBVQklfVk9MX05BTUVfTUFYICYmCisJICAgIHN0cm5sZW4odm9sLT5uYW1lLCB2b2wtPm5hbWVfbGVuICsgMSkgPT0gdm9sLT5uYW1lX2xlbikgeworCQlkYmdfbXNnKCJuYW1lICAgICAgICAgICVzIiwgdm9sLT5uYW1lKTsKKwl9IGVsc2UgeworCQlkYmdfbXNnKCJ0aGUgMXN0IDUgY2hhcmFjdGVycyBvZiB0aGUgbmFtZTogJWMlYyVjJWMlYyIsCisJCQl2b2wtPm5hbWVbMF0sIHZvbC0+bmFtZVsxXSwgdm9sLT5uYW1lWzJdLAorCQkJdm9sLT5uYW1lWzNdLCB2b2wtPm5hbWVbNF0pOworCX0KK30KKworLyoqCisgKiB1YmlfZGJnX2R1bXBfdnRibF9yZWNvcmQgLSBkdW1wIGEgJnN0cnVjdCB1YmlfdnRibF9yZWNvcmQgb2JqZWN0LgorICogQHI6IHRoZSBvYmplY3QgdG8gZHVtcAorICogQGlkeDogdm9sdW1lIHRhYmxlIGluZGV4CisgKi8KK3ZvaWQgdWJpX2RiZ19kdW1wX3Z0YmxfcmVjb3JkKGNvbnN0IHN0cnVjdCB1YmlfdnRibF9yZWNvcmQgKnIsIGludCBpZHgpCit7CisJaW50IG5hbWVfbGVuID0gdWJpMTZfdG9fY3B1KHItPm5hbWVfbGVuKTsKKworCWRiZ19tc2coInZvbHVtZSB0YWJsZSByZWNvcmQgJWQgZHVtcDoiLCBpZHgpOworCWRiZ19tc2coInJlc2VydmVkX3BlYnMgICAlZCIsIHViaTMyX3RvX2NwdShyLT5yZXNlcnZlZF9wZWJzKSk7CisJZGJnX21zZygiYWxpZ25tZW50ICAgICAgICVkIiwgdWJpMzJfdG9fY3B1KHItPmFsaWdubWVudCkpOworCWRiZ19tc2coImRhdGFfcGFkICAgICAgICAlZCIsIHViaTMyX3RvX2NwdShyLT5kYXRhX3BhZCkpOworCWRiZ19tc2coInZvbF90eXBlICAgICAgICAlZCIsIChpbnQpci0+dm9sX3R5cGUpOworCWRiZ19tc2coInVwZF9tYXJrZXIgICAgICAlZCIsIChpbnQpci0+dXBkX21hcmtlcik7CisJZGJnX21zZygibmFtZV9sZW4gICAgICAgICVkIiwgbmFtZV9sZW4pOworCisJaWYgKHItPm5hbWVbMF0gPT0gJ1wwJykgeworCQlkYmdfbXNnKCJuYW1lICAgICAgICAgIE5VTEwiKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChuYW1lX2xlbiA8PSBVQklfVk9MX05BTUVfTUFYICYmCisJICAgIHN0cm5sZW4oJnItPm5hbWVbMF0sIG5hbWVfbGVuICsgMSkgPT0gbmFtZV9sZW4pIHsKKwkJZGJnX21zZygibmFtZSAgICAgICAgICAlcyIsICZyLT5uYW1lWzBdKTsKKwl9IGVsc2UgeworCQlkYmdfbXNnKCIxc3QgNSBjaGFyYWN0ZXJzIG9mIHRoZSBuYW1lOiAlYyVjJWMlYyVjIiwKKwkJCXItPm5hbWVbMF0sIHItPm5hbWVbMV0sIHItPm5hbWVbMl0sIHItPm5hbWVbM10sCisJCQlyLT5uYW1lWzRdKTsKKwl9CisJZGJnX21zZygiY3JjICAgICAgICAgICAgICUjMDh4IiwgdWJpMzJfdG9fY3B1KHItPmNyYykpOworfQorCisvKioKKyAqIHViaV9kYmdfZHVtcF9zdiAtIGR1bXAgYSAmc3RydWN0IHViaV9zY2FuX3ZvbHVtZSBvYmplY3QuCisgKiBAc3Y6IHRoZSBvYmplY3QgdG8gZHVtcAorICovCit2b2lkIHViaV9kYmdfZHVtcF9zdihjb25zdCBzdHJ1Y3QgdWJpX3NjYW5fdm9sdW1lICpzdikKK3sKKwlkYmdfbXNnKCJ2b2x1bWUgc2Nhbm5pbmcgaW5mb3JtYXRpb24gZHVtcDoiKTsKKwlkYmdfbXNnKCJ2b2xfaWQgICAgICAgICAlZCIsIHN2LT52b2xfaWQpOworCWRiZ19tc2coImhpZ2hlc3RfbG51bSAgICVkIiwgc3YtPmhpZ2hlc3RfbG51bSk7CisJZGJnX21zZygibGViX2NvdW50ICAgICAgJWQiLCBzdi0+bGViX2NvdW50KTsKKwlkYmdfbXNnKCJjb21wYXQgICAgICAgICAlZCIsIHN2LT5jb21wYXQpOworCWRiZ19tc2coInZvbF90eXBlICAgICAgICVkIiwgc3YtPnZvbF90eXBlKTsKKwlkYmdfbXNnKCJ1c2VkX2VicyAgICAgICAlZCIsIHN2LT51c2VkX2Vicyk7CisJZGJnX21zZygibGFzdF9kYXRhX3NpemUgJWQiLCBzdi0+bGFzdF9kYXRhX3NpemUpOworCWRiZ19tc2coImRhdGFfcGFkICAgICAgICVkIiwgc3YtPmRhdGFfcGFkKTsKK30KKworLyoqCisgKiB1YmlfZGJnX2R1bXBfc2ViIC0gZHVtcCBhICZzdHJ1Y3QgdWJpX3NjYW5fbGViIG9iamVjdC4KKyAqIEBzZWI6IHRoZSBvYmplY3QgdG8gZHVtcAorICogQHR5cGU6IG9iamVjdCB0eXBlOiAwIC0gbm90IGNvcnJ1cHRlZCwgMSAtIGNvcnJ1cHRlZAorICovCit2b2lkIHViaV9kYmdfZHVtcF9zZWIoY29uc3Qgc3RydWN0IHViaV9zY2FuX2xlYiAqc2ViLCBpbnQgdHlwZSkKK3sKKwlkYmdfbXNnKCJlcmFzZWJsb2NrIHNjYW5uaW5nIGluZm9ybWF0aW9uIGR1bXA6Iik7CisJZGJnX21zZygiZWMgICAgICAgJWQiLCBzZWItPmVjKTsKKwlkYmdfbXNnKCJwbnVtICAgICAlZCIsIHNlYi0+cG51bSk7CisJaWYgKHR5cGUgPT0gMCkgeworCQlkYmdfbXNnKCJsbnVtICAgICAlZCIsIHNlYi0+bG51bSk7CisJCWRiZ19tc2coInNjcnViICAgICVkIiwgc2ViLT5zY3J1Yik7CisJCWRiZ19tc2coInNxbnVtICAgICVsbHUiLCBzZWItPnNxbnVtKTsKKwkJZGJnX21zZygibGViX3ZlciAgJXUiLCBzZWItPmxlYl92ZXIpOworCX0KK30KKworLyoqCisgKiB1YmlfZGJnX2R1bXBfbWt2b2xfcmVxIC0gZHVtcCBhICZzdHJ1Y3QgdWJpX21rdm9sX3JlcSBvYmplY3QuCisgKiBAcmVxOiB0aGUgb2JqZWN0IHRvIGR1bXAKKyAqLwordm9pZCB1YmlfZGJnX2R1bXBfbWt2b2xfcmVxKGNvbnN0IHN0cnVjdCB1YmlfbWt2b2xfcmVxICpyZXEpCit7CisJY2hhciBubVsxN107CisKKwlkYmdfbXNnKCJ2b2x1bWUgY3JlYXRpb24gcmVxdWVzdCBkdW1wOiIpOworCWRiZ19tc2coInZvbF9pZCAgICAlZCIsICAgcmVxLT52b2xfaWQpOworCWRiZ19tc2coImFsaWdubWVudCAlZCIsICAgcmVxLT5hbGlnbm1lbnQpOworCWRiZ19tc2coImJ5dGVzICAgICAlbGxkIiwgKGxvbmcgbG9uZylyZXEtPmJ5dGVzKTsKKwlkYmdfbXNnKCJ2b2xfdHlwZSAgJWQiLCAgIHJlcS0+dm9sX3R5cGUpOworCWRiZ19tc2coIm5hbWVfbGVuICAlZCIsICAgcmVxLT5uYW1lX2xlbik7CisKKwltZW1jcHkobm0sIHJlcS0+bmFtZSwgMTYpOworCW5tWzE2XSA9IDA7CisJZGJnX21zZygidGhlIDFzdCAxNiBjaGFyYWN0ZXJzIG9mIHRoZSBuYW1lOiAlcyIsIG5tKTsKK30KKworI2RlZmluZSBCWVRFU19QRVJfTElORSAzMgorCisvKioKKyAqIHViaV9kYmdfaGV4ZHVtcCAtIGR1bXAgYSBidWZmZXIuCisgKiBAcHRyOiB0aGUgYnVmZmVyIHRvIGR1bXAKKyAqIEBzaXplOiBidWZmZXIgc2l6ZSB3aGljaCBtdXN0IGJlIG11bHRpcGxlIG9mIDQgYnl0ZXMKKyAqLwordm9pZCB1YmlfZGJnX2hleGR1bXAoY29uc3Qgdm9pZCAqcHRyLCBpbnQgc2l6ZSkKK3sKKwlpbnQgaSwgayA9IDAsIHJvd3MsIGNvbHVtbnM7CisJY29uc3QgdWludDhfdCAqcCA9IHB0cjsKKworCXNpemUgPSBBTElHTihzaXplLCA0KTsKKwlyb3dzID0gc2l6ZS9CWVRFU19QRVJfTElORSArIHNpemUgJSBCWVRFU19QRVJfTElORTsKKwlmb3IgKGkgPSAwOyBpIDwgcm93czsgaSsrKSB7CisJCWludCBqOworCisJCWNvbmRfcmVzY2hlZCgpOworCQljb2x1bW5zID0gbWluKHNpemUgLSBrLCBCWVRFU19QRVJfTElORSkgLyA0OworCQlpZiAoY29sdW1ucyA9PSAwKQorCQkJYnJlYWs7CisJCXByaW50ayhLRVJOX0RFQlVHICIlNWQ6ICAiLCBpICogQllURVNfUEVSX0xJTkUpOworCQlmb3IgKGogPSAwOyBqIDwgY29sdW1uczsgaisrKSB7CisJCQlpbnQgbiwgTjsKKworCQkJTiA9IHNpemUgLSBrID4gNCA/IDQgOiBzaXplIC0gazsKKwkJCWZvciAobiA9IDA7IG4gPCBOOyBuKyspCisJCQkJcHJpbnRrKCIlMDJ4IiwgcFtrKytdKTsKKwkJCXByaW50aygiICIpOworCQl9CisJCXByaW50aygiXG4iKTsKKwl9Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfTVREX1VCSV9ERUJVR19NU0cgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL3ViaS9kZWJ1Zy5oIGIvZHJpdmVycy9tdGQvdWJpL2RlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgxNmFkOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbXRkL3ViaS9kZWJ1Zy5oCkBAIC0wLDAgKzEsMTYxIEBACisvKgorICogQ29weXJpZ2h0IChjKSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuLCAyMDA2CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZQorICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqIEF1dGhvcjogQXJ0ZW0gQml0eXV0c2tpeSAo0JHQuNGC0Y7RhtC60LjQuSDQkNGA0YLRkdC8KQorICovCisKKyNpZm5kZWYgX19VQklfREVCVUdfSF9fCisjZGVmaW5lIF9fVUJJX0RFQlVHX0hfXworCisjaWZkZWYgQ09ORklHX01URF9VQklfREVCVUcKKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKworI2RlZmluZSB1YmlfYXNzZXJ0KGV4cHIpICBCVUdfT04oIShleHByKSkKKyNkZWZpbmUgZGJnX2VycihmbXQsIC4uLikgdWJpX2VycihmbXQsICMjX19WQV9BUkdTX18pCisjZWxzZQorI2RlZmluZSB1YmlfYXNzZXJ0KGV4cHIpICAoe30pCisjZGVmaW5lIGRiZ19lcnIoZm10LCAuLi4pICh7fSkKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01URF9VQklfREVCVUdfRElTQUJMRV9CR1QKKyNkZWZpbmUgREJHX0RJU0FCTEVfQkdUIDEKKyNlbHNlCisjZGVmaW5lIERCR19ESVNBQkxFX0JHVCAwCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19NVERfVUJJX0RFQlVHX01TRworLyogR2VuZXJpYyBkZWJ1Z2dpbmcgbWVzc2FnZSAqLworI2RlZmluZSBkYmdfbXNnKGZtdCwgLi4uKSBcCisJcHJpbnRrKEtFUk5fREVCVUcgIlVCSSBEQkc6ICVzOiAiIGZtdCAiXG4iLCBfX0ZVTkNUSU9OX18sICMjX19WQV9BUkdTX18pCisKKyNkZWZpbmUgdWJpX2RiZ19kdW1wX3N0YWNrKCkgZHVtcF9zdGFjaygpCisKK3N0cnVjdCB1YmlfZWNfaGRyOworc3RydWN0IHViaV92aWRfaGRyOworc3RydWN0IHViaV92b2x1bWU7CitzdHJ1Y3QgdWJpX3Z0YmxfcmVjb3JkOworc3RydWN0IHViaV9zY2FuX3ZvbHVtZTsKK3N0cnVjdCB1Ymlfc2Nhbl9sZWI7CitzdHJ1Y3QgdWJpX21rdm9sX3JlcTsKKwordm9pZCB1YmlfZGJnX3ByaW50KGludCB0eXBlLCBjb25zdCBjaGFyICpmdW5jLCBjb25zdCBjaGFyICpmbXQsIC4uLik7Cit2b2lkIHViaV9kYmdfZHVtcF9lY19oZHIoY29uc3Qgc3RydWN0IHViaV9lY19oZHIgKmVjX2hkcik7Cit2b2lkIHViaV9kYmdfZHVtcF92aWRfaGRyKGNvbnN0IHN0cnVjdCB1YmlfdmlkX2hkciAqdmlkX2hkcik7Cit2b2lkIHViaV9kYmdfZHVtcF92b2xfaW5mbyhjb25zdCBzdHJ1Y3QgdWJpX3ZvbHVtZSAqdm9sKTsKK3ZvaWQgdWJpX2RiZ19kdW1wX3Z0YmxfcmVjb3JkKGNvbnN0IHN0cnVjdCB1YmlfdnRibF9yZWNvcmQgKnIsIGludCBpZHgpOwordm9pZCB1YmlfZGJnX2R1bXBfc3YoY29uc3Qgc3RydWN0IHViaV9zY2FuX3ZvbHVtZSAqc3YpOwordm9pZCB1YmlfZGJnX2R1bXBfc2ViKGNvbnN0IHN0cnVjdCB1Ymlfc2Nhbl9sZWIgKnNlYiwgaW50IHR5cGUpOwordm9pZCB1YmlfZGJnX2R1bXBfbWt2b2xfcmVxKGNvbnN0IHN0cnVjdCB1YmlfbWt2b2xfcmVxICpyZXEpOwordm9pZCB1YmlfZGJnX2hleGR1bXAoY29uc3Qgdm9pZCAqYnVmLCBpbnQgc2l6ZSk7CisKKyNlbHNlCisKKyNkZWZpbmUgZGJnX21zZyhmbXQsIC4uLikgICAgKHt9KQorI2RlZmluZSB1YmlfZGJnX2R1bXBfc3RhY2soKSAoe30pCisjZGVmaW5lIHViaV9kYmdfcHJpbnQoZnVuYywgZm10LCAuLi4pICAgICh7fSkKKyNkZWZpbmUgdWJpX2RiZ19kdW1wX2VjX2hkcihlY19oZHIpICAgICAgKHt9KQorI2RlZmluZSB1YmlfZGJnX2R1bXBfdmlkX2hkcih2aWRfaGRyKSAgICAoe30pCisjZGVmaW5lIHViaV9kYmdfZHVtcF92b2xfaW5mbyh2b2wpICAgICAgICh7fSkKKyNkZWZpbmUgdWJpX2RiZ19kdW1wX3Z0YmxfcmVjb3JkKHIsIGlkeCkgKHt9KQorI2RlZmluZSB1YmlfZGJnX2R1bXBfc3Yoc3YpICAgICAgICAgICAgICAoe30pCisjZGVmaW5lIHViaV9kYmdfZHVtcF9zZWIoc2ViLCB0eXBlKSAgICAgICh7fSkKKyNkZWZpbmUgdWJpX2RiZ19kdW1wX21rdm9sX3JlcShyZXEpICAgICAgKHt9KQorI2RlZmluZSB1YmlfZGJnX2hleGR1bXAoYnVmLCBzaXplKSAgICAgICAoe30pCisKKyNlbmRpZiAvKiBDT05GSUdfTVREX1VCSV9ERUJVR19NU0cgKi8KKworI2lmZGVmIENPTkZJR19NVERfVUJJX0RFQlVHX01TR19FQkEKKy8qIE1lc3NhZ2VzIGZyb20gdGhlIGVyYXNlYmxvY2sgYXNzb2NpYXRpb24gdW5pdCAqLworI2RlZmluZSBkYmdfZWJhKGZtdCwgLi4uKSBcCisJcHJpbnRrKEtFUk5fREVCVUcgIlVCSSBEQkcgZWJhOiAlczogIiBmbXQgIlxuIiwgX19GVU5DVElPTl9fLCBcCisJICAgICAgICMjX19WQV9BUkdTX18pCisjZWxzZQorI2RlZmluZSBkYmdfZWJhKGZtdCwgLi4uKSAoe30pCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19NVERfVUJJX0RFQlVHX01TR19XTAorLyogTWVzc2FnZXMgZnJvbSB0aGUgd2Vhci1sZXZlbGluZyB1bml0ICovCisjZGVmaW5lIGRiZ193bChmbXQsIC4uLikgXAorCXByaW50ayhLRVJOX0RFQlVHICJVQkkgREJHIHdsOiAlczogIiBmbXQgIlxuIiwgX19GVU5DVElPTl9fLCBcCisJICAgICAgICMjX19WQV9BUkdTX18pCisjZWxzZQorI2RlZmluZSBkYmdfd2woZm10LCAuLi4pICh7fSkKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01URF9VQklfREVCVUdfTVNHX0lPCisvKiBNZXNzYWdlcyBmcm9tIHRoZSBpbnB1dC9vdXRwdXQgdW5pdCAqLworI2RlZmluZSBkYmdfaW8oZm10LCAuLi4pIFwKKwlwcmludGsoS0VSTl9ERUJVRyAiVUJJIERCRyBpbzogJXM6ICIgZm10ICJcbiIsIF9fRlVOQ1RJT05fXywgXAorCSAgICAgICAjI19fVkFfQVJHU19fKQorI2Vsc2UKKyNkZWZpbmUgZGJnX2lvKGZtdCwgLi4uKSAoe30pCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19NVERfVUJJX0RFQlVHX01TR19CTEQKKy8qIEluaXRpYWxpemF0aW9uIGFuZCBidWlsZCBtZXNzYWdlcyAqLworI2RlZmluZSBkYmdfYmxkKGZtdCwgLi4uKSBcCisJcHJpbnRrKEtFUk5fREVCVUcgIlVCSSBEQkcgYmxkOiAlczogIiBmbXQgIlxuIiwgX19GVU5DVElPTl9fLCBcCisJICAgICAgICMjX19WQV9BUkdTX18pCisjZWxzZQorI2RlZmluZSBkYmdfYmxkKGZtdCwgLi4uKSAoe30pCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19NVERfVUJJX0RFQlVHX0VNVUxBVEVfQklURkxJUFMKKy8qKgorICogdWJpX2RiZ19pc19iaXRmbGlwIC0gaWYgaXQgaXMgdGltZSB0byBlbXVsYXRlIGEgYml0LWZsaXAuCisgKgorICogUmV0dXJucyBub24temVybyBpZiBhIGJpdC1mbGlwIHNob3VsZCBiZSBlbXVsYXRlZCwgb3RoZXJ3aXNlIHJldHVybnMgemVyby4KKyAqLworc3RhdGljIGlubGluZSBpbnQgdWJpX2RiZ19pc19iaXRmbGlwKHZvaWQpCit7CisJcmV0dXJuICEocmFuZG9tMzIoKSAlIDIwMCk7Cit9CisjZWxzZQorI2RlZmluZSB1YmlfZGJnX2lzX2JpdGZsaXAoKSAwCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19NVERfVUJJX0RFQlVHX0VNVUxBVEVfV1JJVEVfRkFJTFVSRVMKKy8qKgorICogdWJpX2RiZ19pc193cml0ZV9mYWlsdXJlIC0gaWYgaXQgaXMgdGltZSB0byBlbXVsYXRlIGEgd3JpdGUgZmFpbHVyZS4KKyAqCisgKiBSZXR1cm5zIG5vbi16ZXJvIGlmIGEgd3JpdGUgZmFpbHVyZSBzaG91bGQgYmUgZW11bGF0ZWQsIG90aGVyd2lzZSByZXR1cm5zCisgKiB6ZXJvLgorICovCitzdGF0aWMgaW5saW5lIGludCB1YmlfZGJnX2lzX3dyaXRlX2ZhaWx1cmUodm9pZCkKK3sKKwlyZXR1cm4gIShyYW5kb20zMigpICUgNTAwKTsKK30KKyNlbHNlCisjZGVmaW5lIHViaV9kYmdfaXNfd3JpdGVfZmFpbHVyZSgpIDAKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01URF9VQklfREVCVUdfRU1VTEFURV9FUkFTRV9GQUlMVVJFUworLyoqCisgKiB1YmlfZGJnX2lzX2VyYXNlX2ZhaWx1cmUgLSBpZiBpdHMgdGltZSB0byBlbXVsYXRlIGFuIGVyYXNlIGZhaWx1cmUuCisgKgorICogUmV0dXJucyBub24temVybyBpZiBhbiBlcmFzZSBmYWlsdXJlIHNob3VsZCBiZSBlbXVsYXRlZCwgb3RoZXJ3aXNlIHJldHVybnMKKyAqIHplcm8uCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHViaV9kYmdfaXNfZXJhc2VfZmFpbHVyZSh2b2lkKQoreworCQlyZXR1cm4gIShyYW5kb20zMigpICUgNDAwKTsKK30KKyNlbHNlCisjZGVmaW5lIHViaV9kYmdfaXNfZXJhc2VfZmFpbHVyZSgpIDAKKyNlbmRpZgorCisjZW5kaWYgLyogIV9fVUJJX0RFQlVHX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvdWJpL2ViYS5jIGIvZHJpdmVycy9tdGQvdWJpL2ViYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4NDdlZTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL210ZC91YmkvZWJhLmMKQEAgLTAsMCArMSwxMjQxIEBACisvKgorICogQ29weXJpZ2h0IChjKSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuLCAyMDA2CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZQorICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqIEF1dGhvcjogQXJ0ZW0gQml0eXV0c2tpeSAo0JHQuNGC0Y7RhtC60LjQuSDQkNGA0YLRkdC8KQorICovCisKKy8qCisgKiBUaGUgVUJJIEVyYXNlYmxvY2sgQXNzb2NpYXRpb24gKEVCQSkgdW5pdC4KKyAqCisgKiBUaGlzIHVuaXQgaXMgcmVzcG9uc2libGUgZm9yIEkvTyB0by9mcm9tIGxvZ2ljYWwgZXJhc2VibG9jay4KKyAqCisgKiBBbHRob3VnaCBpbiB0aGlzIGltcGxlbWVudGF0aW9uIHRoZSBFQkEgdGFibGUgaXMgZnVsbHkga2VwdCBhbmQgbWFuYWdlZCBpbgorICogUkFNLCB3aGljaCBhc3N1bWVzIHBvb3Igc2NhbGFiaWxpdHksIGl0IG1pZ2h0IGJlIChwYXJ0aWFsbHkpIG1haW50YWluZWQgb24KKyAqIGZsYXNoIGluIGZ1dHVyZSBpbXBsZW1lbnRhdGlvbnMuCisgKgorICogVGhlIEVCQSB1bml0IGltcGxlbWVudHMgcGVyLWxvZ2ljYWwgZXJhc2VibG9jayBsb2NraW5nLiBCZWZvcmUgYWNjZXNzaW5nIGEKKyAqIGxvZ2ljYWwgZXJhc2VibG9jayBpdCBpcyBsb2NrZWQgZm9yIHJlYWRpbmcgb3Igd3JpdGluZy4gVGhlIHBlci1sb2dpY2FsCisgKiBlcmFzZWJsb2NrIGxvY2tpbmcgaXMgaW1wbGVtZW50ZWQgYnkgbWVhbnMgb2YgdGhlIGxvY2sgdHJlZS4gVGhlIGxvY2sgdHJlZQorICogaXMgYW4gUkItdHJlZSB3aGljaCByZWZlcnMgYWxsIHRoZSBjdXJyZW50bHkgbG9ja2VkIGxvZ2ljYWwgZXJhc2VibG9ja3MuIFRoZQorICogbG9jayB0cmVlIGVsZW1lbnRzIGFyZSAmc3RydWN0IGx0cmVlX2VudHJ5IG9iamVjdHMuIFRoZXkgYXJlIGluZGV4ZWQgYnkKKyAqIChAdm9sX2lkLCBAbG51bSkgcGFpcnMuCisgKgorICogRUJBIGFsc28gbWFpbnRhaW5zIHRoZSBnbG9iYWwgc2VxdWVuY2UgY291bnRlciB3aGljaCBpcyBpbmNyZW1lbnRlZCBlYWNoCisgKiB0aW1lIGEgbG9naWNhbCBlcmFzZWJsb2NrIGlzIG1hcHBlZCB0byBhIHBoeXNpY2FsIGVyYXNlYmxvY2sgYW5kIGl0IGlzCisgKiBzdG9yZWQgaW4gdGhlIHZvbHVtZSBpZGVudGlmaWVyIGhlYWRlci4gVGhpcyBtZWFucyB0aGF0IGVhY2ggVklEIGhlYWRlciBoYXMKKyAqIGEgdW5pcXVlIHNlcXVlbmNlIG51bWJlci4gVGhlIHNlcXVlbmNlIG51bWJlciBpcyBvbmx5IGluY3JlYXNlZCBhbiB3ZSBhc3N1bWUKKyAqIDY0IGJpdHMgaXMgZW5vdWdoIHRvIG5ldmVyIG92ZXJmbG93LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlICJ1YmkuaCIKKworLyoqCisgKiBzdHJ1Y3QgbHRyZWVfZW50cnkgLSBhbiBlbnRyeSBpbiB0aGUgbG9jayB0cmVlLgorICogQHJiOiBsaW5rcyBSQi10cmVlIG5vZGVzCisgKiBAdm9sX2lkOiB2b2x1bWUgSUQgb2YgdGhlIGxvY2tlZCBsb2dpY2FsIGVyYXNlYmxvY2sKKyAqIEBsbnVtOiBsb2NrZWQgbG9naWNhbCBlcmFzZWJsb2NrIG51bWJlcgorICogQHVzZXJzOiBob3cgbWFueSB0YXNrcyBhcmUgdXNpbmcgdGhpcyBsb2dpY2FsIGVyYXNlYmxvY2sgb3Igd2FpdCBmb3IgaXQKKyAqIEBtdXRleDogcmVhZC93cml0ZSBtdXRleCB0byBpbXBsZW1lbnQgcmVhZC93cml0ZSBhY2Nlc3Mgc2VyaWFsaXphdGlvbiB0bworICogdGhlIChAdm9sX2lkLCBAbG51bSkgbG9naWNhbCBlcmFzZWJsb2NrCisgKgorICogV2hlbiBhIGxvZ2ljYWwgZXJhc2VibG9jayBpcyBiZWluZyBsb2NrZWQgLSBjb3JyZXNwb25kaW5nICZzdHJ1Y3QgbHRyZWVfZW50cnkKKyAqIG9iamVjdCBpcyBpbnNlcnRlZCB0byB0aGUgbG9jayB0cmVlIChAdWJpLT5sdHJlZSkuCisgKi8KK3N0cnVjdCBsdHJlZV9lbnRyeSB7CisJc3RydWN0IHJiX25vZGUgcmI7CisJaW50IHZvbF9pZDsKKwlpbnQgbG51bTsKKwlpbnQgdXNlcnM7CisJc3RydWN0IHJ3X3NlbWFwaG9yZSBtdXRleDsKK307CisKKy8qIFNsYWIgY2FjaGUgZm9yIGxvY2stdHJlZSBlbnRyaWVzICovCitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKmx0cmVlX3NsYWI7CisKKy8qKgorICogbmV4dF9zcW51bSAtIGdldCBuZXh0IHNlcXVlbmNlIG51bWJlci4KKyAqIEB1Ymk6IFVCSSBkZXZpY2UgZGVzY3JpcHRpb24gb2JqZWN0CisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIG5leHQgc2VxdWVuY2UgbnVtYmVyIHRvIHVzZSwgd2hpY2ggaXMganVzdCB0aGUgY3VycmVudAorICogZ2xvYmFsIHNlcXVlbmNlIGNvdW50ZXIgdmFsdWUuIEl0IGFsc28gaW5jcmVhc2VzIHRoZSBnbG9iYWwgc2VxdWVuY2UKKyAqIGNvdW50ZXIuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgbmV4dF9zcW51bShzdHJ1Y3QgdWJpX2RldmljZSAqdWJpKQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyBzcW51bTsKKworCXNwaW5fbG9jaygmdWJpLT5sdHJlZV9sb2NrKTsKKwlzcW51bSA9IHViaS0+Z2xvYmFsX3NxbnVtKys7CisJc3Bpbl91bmxvY2soJnViaS0+bHRyZWVfbG9jayk7CisKKwlyZXR1cm4gc3FudW07Cit9CisKKy8qKgorICogdWJpX2dldF9jb21wYXQgLSBnZXQgY29tcGF0aWJpbGl0eSBmbGFncyBvZiBhIHZvbHVtZS4KKyAqIEB1Ymk6IFVCSSBkZXZpY2UgZGVzY3JpcHRpb24gb2JqZWN0CisgKiBAdm9sX2lkOiB2b2x1bWUgSUQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgY29tcGF0aWJpbGl0eSBmbGFncyBmb3IgYW4gaW50ZXJuYWwgdm9sdW1lLiBVc2VyCisgKiB2b2x1bWVzIGhhdmUgbm8gY29tcGF0aWJpbGl0eSBmbGFncywgc28gJTAgaXMgcmV0dXJuZWQuCisgKi8KK3N0YXRpYyBpbnQgdWJpX2dldF9jb21wYXQoY29uc3Qgc3RydWN0IHViaV9kZXZpY2UgKnViaSwgaW50IHZvbF9pZCkKK3sKKwlpZiAodm9sX2lkID09IFVCSV9MQVlPVVRfVk9MX0lEKQorCQlyZXR1cm4gVUJJX0xBWU9VVF9WT0xVTUVfQ09NUEFUOworCXJldHVybiAwOworfQorCisvKioKKyAqIGx0cmVlX2xvb2t1cCAtIGxvb2sgdXAgdGhlIGxvY2sgdHJlZS4KKyAqIEB1Ymk6IFVCSSBkZXZpY2UgZGVzY3JpcHRpb24gb2JqZWN0CisgKiBAdm9sX2lkOiB2b2x1bWUgSUQKKyAqIEBsbnVtOiBsb2dpY2FsIGVyYXNlYmxvY2sgbnVtYmVyCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgY29ycmVzcG9uZGluZyAmc3RydWN0IGx0cmVlX2VudHJ5CisgKiBvYmplY3QgaWYgdGhlIGxvZ2ljYWwgZXJhc2VibG9jayBpcyBsb2NrZWQgYW5kICVOVUxMIGlmIGl0IGlzIG5vdC4KKyAqIEB1YmktPmx0cmVlX2xvY2sgaGFzIHRvIGJlIGxvY2tlZC4KKyAqLworc3RhdGljIHN0cnVjdCBsdHJlZV9lbnRyeSAqbHRyZWVfbG9va3VwKHN0cnVjdCB1YmlfZGV2aWNlICp1YmksIGludCB2b2xfaWQsCisJCQkJCWludCBsbnVtKQoreworCXN0cnVjdCByYl9ub2RlICpwOworCisJcCA9IHViaS0+bHRyZWUucmJfbm9kZTsKKwl3aGlsZSAocCkgeworCQlzdHJ1Y3QgbHRyZWVfZW50cnkgKmxlOworCisJCWxlID0gcmJfZW50cnkocCwgc3RydWN0IGx0cmVlX2VudHJ5LCByYik7CisKKwkJaWYgKHZvbF9pZCA8IGxlLT52b2xfaWQpCisJCQlwID0gcC0+cmJfbGVmdDsKKwkJZWxzZSBpZiAodm9sX2lkID4gbGUtPnZvbF9pZCkKKwkJCXAgPSBwLT5yYl9yaWdodDsKKwkJZWxzZSB7CisJCQlpZiAobG51bSA8IGxlLT5sbnVtKQorCQkJCXAgPSBwLT5yYl9sZWZ0OworCQkJZWxzZSBpZiAobG51bSA+IGxlLT5sbnVtKQorCQkJCXAgPSBwLT5yYl9yaWdodDsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gbGU7CisJCX0KKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBsdHJlZV9hZGRfZW50cnkgLSBhZGQgbmV3IGVudHJ5IHRvIHRoZSBsb2NrIHRyZWUuCisgKiBAdWJpOiBVQkkgZGV2aWNlIGRlc2NyaXB0aW9uIG9iamVjdAorICogQHZvbF9pZDogdm9sdW1lIElECisgKiBAbG51bTogbG9naWNhbCBlcmFzZWJsb2NrIG51bWJlcgorICoKKyAqIFRoaXMgZnVuY3Rpb24gYWRkcyBuZXcgZW50cnkgZm9yIGxvZ2ljYWwgZXJhc2VibG9jayAoQHZvbF9pZCwgQGxudW0pIHRvIHRoZQorICogbG9jayB0cmVlLiBJZiBzdWNoIGVudHJ5IGlzIGFscmVhZHkgdGhlcmUsIGl0cyB1c2FnZSBjb3VudGVyIGlzIGluY3JlYXNlZC4KKyAqIFJldHVybnMgcG9pbnRlciB0byB0aGUgbG9jayB0cmVlIGVudHJ5IG9yICUtRU5PTUVNIGlmIG1lbW9yeSBhbGxvY2F0aW9uCisgKiBmYWlsZWQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbHRyZWVfZW50cnkgKmx0cmVlX2FkZF9lbnRyeShzdHJ1Y3QgdWJpX2RldmljZSAqdWJpLCBpbnQgdm9sX2lkLAorCQkJCQkgICBpbnQgbG51bSkKK3sKKwlzdHJ1Y3QgbHRyZWVfZW50cnkgKmxlLCAqbGUxLCAqbGVfZnJlZTsKKworCWxlID0ga21lbV9jYWNoZV9hbGxvYyhsdHJlZV9zbGFiLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWxlKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWxlLT52b2xfaWQgPSB2b2xfaWQ7CisJbGUtPmxudW0gPSBsbnVtOworCisJc3Bpbl9sb2NrKCZ1YmktPmx0cmVlX2xvY2spOworCWxlMSA9IGx0cmVlX2xvb2t1cCh1YmksIHZvbF9pZCwgbG51bSk7CisKKwlpZiAobGUxKSB7CisJCS8qCisJCSAqIFRoaXMgbG9naWNhbCBlcmFzZWJsb2NrIGlzIGFscmVhZHkgbG9ja2VkLiBUaGUgbmV3bHkKKwkJICogYWxsb2NhdGVkIGxvY2sgZW50cnkgaXMgbm90IG5lZWRlZC4KKwkJICovCisJCWxlX2ZyZWUgPSBsZTsKKwkJbGUgPSBsZTE7CisJfSBlbHNlIHsKKwkJc3RydWN0IHJiX25vZGUgKipwLCAqcGFyZW50ID0gTlVMTDsKKworCQkvKgorCQkgKiBObyBsb2NrIGVudHJ5LCBhZGQgdGhlIG5ld2x5IGFsbG9jYXRlZCBvbmUgdG8gdGhlCisJCSAqIEB1YmktPmx0cmVlIFJCLXRyZWUuCisJCSAqLworCQlsZV9mcmVlID0gTlVMTDsKKworCQlwID0gJnViaS0+bHRyZWUucmJfbm9kZTsKKwkJd2hpbGUgKCpwKSB7CisJCQlwYXJlbnQgPSAqcDsKKwkJCWxlMSA9IHJiX2VudHJ5KHBhcmVudCwgc3RydWN0IGx0cmVlX2VudHJ5LCByYik7CisKKwkJCWlmICh2b2xfaWQgPCBsZTEtPnZvbF9pZCkKKwkJCQlwID0gJigqcCktPnJiX2xlZnQ7CisJCQllbHNlIGlmICh2b2xfaWQgPiBsZTEtPnZvbF9pZCkKKwkJCQlwID0gJigqcCktPnJiX3JpZ2h0OworCQkJZWxzZSB7CisJCQkJdWJpX2Fzc2VydChsbnVtICE9IGxlMS0+bG51bSk7CisJCQkJaWYgKGxudW0gPCBsZTEtPmxudW0pCisJCQkJCXAgPSAmKCpwKS0+cmJfbGVmdDsKKwkJCQllbHNlCisJCQkJCXAgPSAmKCpwKS0+cmJfcmlnaHQ7CisJCQl9CisJCX0KKworCQlyYl9saW5rX25vZGUoJmxlLT5yYiwgcGFyZW50LCBwKTsKKwkJcmJfaW5zZXJ0X2NvbG9yKCZsZS0+cmIsICZ1YmktPmx0cmVlKTsKKwl9CisJbGUtPnVzZXJzICs9IDE7CisJc3Bpbl91bmxvY2soJnViaS0+bHRyZWVfbG9jayk7CisKKwlpZiAobGVfZnJlZSkKKwkJa21lbV9jYWNoZV9mcmVlKGx0cmVlX3NsYWIsIGxlX2ZyZWUpOworCisJcmV0dXJuIGxlOworfQorCisvKioKKyAqIGxlYl9yZWFkX2xvY2sgLSBsb2NrIGxvZ2ljYWwgZXJhc2VibG9jayBmb3IgcmVhZGluZy4KKyAqIEB1Ymk6IFVCSSBkZXZpY2UgZGVzY3JpcHRpb24gb2JqZWN0CisgKiBAdm9sX2lkOiB2b2x1bWUgSUQKKyAqIEBsbnVtOiBsb2dpY2FsIGVyYXNlYmxvY2sgbnVtYmVyCisgKgorICogVGhpcyBmdW5jdGlvbiBsb2NrcyBhIGxvZ2ljYWwgZXJhc2VibG9jayBmb3IgcmVhZGluZy4gUmV0dXJucyB6ZXJvIGluIGNhc2UKKyAqIG9mIHN1Y2Nlc3MgYW5kIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBpbiBjYXNlIG9mIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQgbGViX3JlYWRfbG9jayhzdHJ1Y3QgdWJpX2RldmljZSAqdWJpLCBpbnQgdm9sX2lkLCBpbnQgbG51bSkKK3sKKwlzdHJ1Y3QgbHRyZWVfZW50cnkgKmxlOworCisJbGUgPSBsdHJlZV9hZGRfZW50cnkodWJpLCB2b2xfaWQsIGxudW0pOworCWlmIChJU19FUlIobGUpKQorCQlyZXR1cm4gUFRSX0VSUihsZSk7CisJZG93bl9yZWFkKCZsZS0+bXV0ZXgpOworCXJldHVybiAwOworfQorCisvKioKKyAqIGxlYl9yZWFkX3VubG9jayAtIHVubG9jayBsb2dpY2FsIGVyYXNlYmxvY2suCisgKiBAdWJpOiBVQkkgZGV2aWNlIGRlc2NyaXB0aW9uIG9iamVjdAorICogQHZvbF9pZDogdm9sdW1lIElECisgKiBAbG51bTogbG9naWNhbCBlcmFzZWJsb2NrIG51bWJlcgorICovCitzdGF0aWMgdm9pZCBsZWJfcmVhZF91bmxvY2soc3RydWN0IHViaV9kZXZpY2UgKnViaSwgaW50IHZvbF9pZCwgaW50IGxudW0pCit7CisJaW50IGZyZWUgPSAwOworCXN0cnVjdCBsdHJlZV9lbnRyeSAqbGU7CisKKwlzcGluX2xvY2soJnViaS0+bHRyZWVfbG9jayk7CisJbGUgPSBsdHJlZV9sb29rdXAodWJpLCB2b2xfaWQsIGxudW0pOworCWxlLT51c2VycyAtPSAxOworCXViaV9hc3NlcnQobGUtPnVzZXJzID49IDApOworCWlmIChsZS0+dXNlcnMgPT0gMCkgeworCQlyYl9lcmFzZSgmbGUtPnJiLCAmdWJpLT5sdHJlZSk7CisJCWZyZWUgPSAxOworCX0KKwlzcGluX3VubG9jaygmdWJpLT5sdHJlZV9sb2NrKTsKKworCXVwX3JlYWQoJmxlLT5tdXRleCk7CisJaWYgKGZyZWUpCisJCWttZW1fY2FjaGVfZnJlZShsdHJlZV9zbGFiLCBsZSk7Cit9CisKKy8qKgorICogbGViX3dyaXRlX2xvY2sgLSBsb2NrIGxvZ2ljYWwgZXJhc2VibG9jayBmb3Igd3JpdGluZy4KKyAqIEB1Ymk6IFVCSSBkZXZpY2UgZGVzY3JpcHRpb24gb2JqZWN0CisgKiBAdm9sX2lkOiB2b2x1bWUgSUQKKyAqIEBsbnVtOiBsb2dpY2FsIGVyYXNlYmxvY2sgbnVtYmVyCisgKgorICogVGhpcyBmdW5jdGlvbiBsb2NrcyBhIGxvZ2ljYWwgZXJhc2VibG9jayBmb3Igd3JpdGluZy4gUmV0dXJucyB6ZXJvIGluIGNhc2UKKyAqIG9mIHN1Y2Nlc3MgYW5kIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBpbiBjYXNlIG9mIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQgbGViX3dyaXRlX2xvY2soc3RydWN0IHViaV9kZXZpY2UgKnViaSwgaW50IHZvbF9pZCwgaW50IGxudW0pCit7CisJc3RydWN0IGx0cmVlX2VudHJ5ICpsZTsKKworCWxlID0gbHRyZWVfYWRkX2VudHJ5KHViaSwgdm9sX2lkLCBsbnVtKTsKKwlpZiAoSVNfRVJSKGxlKSkKKwkJcmV0dXJuIFBUUl9FUlIobGUpOworCWRvd25fd3JpdGUoJmxlLT5tdXRleCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogbGViX3dyaXRlX3VubG9jayAtIHVubG9jayBsb2dpY2FsIGVyYXNlYmxvY2suCisgKiBAdWJpOiBVQkkgZGV2aWNlIGRlc2NyaXB0aW9uIG9iamVjdAorICogQHZvbF9pZDogdm9sdW1lIElECisgKiBAbG51bTogbG9naWNhbCBlcmFzZWJsb2NrIG51bWJlcgorICovCitzdGF0aWMgdm9pZCBsZWJfd3JpdGVfdW5sb2NrKHN0cnVjdCB1YmlfZGV2aWNlICp1YmksIGludCB2b2xfaWQsIGludCBsbnVtKQoreworCWludCBmcmVlOworCXN0cnVjdCBsdHJlZV9lbnRyeSAqbGU7CisKKwlzcGluX2xvY2soJnViaS0+bHRyZWVfbG9jayk7CisJbGUgPSBsdHJlZV9sb29rdXAodWJpLCB2b2xfaWQsIGxudW0pOworCWxlLT51c2VycyAtPSAxOworCXViaV9hc3NlcnQobGUtPnVzZXJzID49IDApOworCWlmIChsZS0+dXNlcnMgPT0gMCkgeworCQlyYl9lcmFzZSgmbGUtPnJiLCAmdWJpLT5sdHJlZSk7CisJCWZyZWUgPSAxOworCX0gZWxzZQorCQlmcmVlID0gMDsKKwlzcGluX3VubG9jaygmdWJpLT5sdHJlZV9sb2NrKTsKKworCXVwX3dyaXRlKCZsZS0+bXV0ZXgpOworCWlmIChmcmVlKQorCQlrbWVtX2NhY2hlX2ZyZWUobHRyZWVfc2xhYiwgbGUpOworfQorCisvKioKKyAqIHViaV9lYmFfdW5tYXBfbGViIC0gdW4tbWFwIGxvZ2ljYWwgZXJhc2VibG9jay4KKyAqIEB1Ymk6IFVCSSBkZXZpY2UgZGVzY3JpcHRpb24gb2JqZWN0CisgKiBAdm9sX2lkOiB2b2x1bWUgSUQKKyAqIEBsbnVtOiBsb2dpY2FsIGVyYXNlYmxvY2sgbnVtYmVyCisgKgorICogVGhpcyBmdW5jdGlvbiB1bi1tYXBzIGxvZ2ljYWwgZXJhc2VibG9jayBAbG51bSBhbmQgc2NoZWR1bGVzIGNvcnJlc3BvbmRpbmcKKyAqIHBoeXNpY2FsIGVyYXNlYmxvY2sgZm9yIGVyYXN1cmUuIFJldHVybnMgemVybyBpbiBjYXNlIG9mIHN1Y2Nlc3MgYW5kIGEKKyAqIG5lZ2F0aXZlIGVycm9yIGNvZGUgaW4gY2FzZSBvZiBmYWlsdXJlLgorICovCitpbnQgdWJpX2ViYV91bm1hcF9sZWIoc3RydWN0IHViaV9kZXZpY2UgKnViaSwgaW50IHZvbF9pZCwgaW50IGxudW0pCit7CisJaW50IGlkeCA9IHZvbF9pZDJpZHgodWJpLCB2b2xfaWQpLCBlcnIsIHBudW07CisJc3RydWN0IHViaV92b2x1bWUgKnZvbCA9IHViaS0+dm9sdW1lc1tpZHhdOworCisJaWYgKHViaS0+cm9fbW9kZSkKKwkJcmV0dXJuIC1FUk9GUzsKKworCWVyciA9IGxlYl93cml0ZV9sb2NrKHViaSwgdm9sX2lkLCBsbnVtKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJcG51bSA9IHZvbC0+ZWJhX3RibFtsbnVtXTsKKwlpZiAocG51bSA8IDApCisJCS8qIFRoaXMgbG9naWNhbCBlcmFzZWJsb2NrIGlzIGFscmVhZHkgdW5tYXBwZWQgKi8KKwkJZ290byBvdXRfdW5sb2NrOworCisJZGJnX2ViYSgiZXJhc2UgTEVCICVkOiVkLCBQRUIgJWQiLCB2b2xfaWQsIGxudW0sIHBudW0pOworCisJdm9sLT5lYmFfdGJsW2xudW1dID0gVUJJX0xFQl9VTk1BUFBFRDsKKwllcnIgPSB1Ymlfd2xfcHV0X3BlYih1YmksIHBudW0sIDApOworCitvdXRfdW5sb2NrOgorCWxlYl93cml0ZV91bmxvY2sodWJpLCB2b2xfaWQsIGxudW0pOworCXJldHVybiBlcnI7Cit9CisKKy8qKgorICogdWJpX2ViYV9yZWFkX2xlYiAtIHJlYWQgZGF0YS4KKyAqIEB1Ymk6IFVCSSBkZXZpY2UgZGVzY3JpcHRpb24gb2JqZWN0CisgKiBAdm9sX2lkOiB2b2x1bWUgSUQKKyAqIEBsbnVtOiBsb2dpY2FsIGVyYXNlYmxvY2sgbnVtYmVyCisgKiBAYnVmOiBidWZmZXIgdG8gc3RvcmUgdGhlIHJlYWQgZGF0YQorICogQG9mZnNldDogb2Zmc2V0IGZyb20gd2hlcmUgdG8gcmVhZAorICogQGxlbjogaG93IG1hbnkgYnl0ZXMgdG8gcmVhZAorICogQGNoZWNrOiBkYXRhIENSQyBjaGVjayBmbGFnCisgKgorICogSWYgdGhlIGxvZ2ljYWwgZXJhc2VibG9jayBAbG51bSBpcyB1bm1hcHBlZCwgQGJ1ZiBpcyBmaWxsZWQgd2l0aCAweEZGCisgKiBieXRlcy4gVGhlIEBjaGVjayBmbGFnIG9ubHkgbWFrZXMgc2Vuc2UgZm9yIHN0YXRpYyB2b2x1bWVzIGFuZCBmb3JjZXMKKyAqIGVyYXNlYmxvY2sgZGF0YSBDUkMgY2hlY2tpbmcuCisgKgorICogSW4gY2FzZSBvZiBzdWNjZXNzIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB6ZXJvLiBJbiBjYXNlIG9mIGEgc3RhdGljIHZvbHVtZSwKKyAqIGlmIGRhdGEgQ1JDIG1pc21hdGNoZXMgLSAlLUVCQURNU0cgaXMgcmV0dXJuZWQuICUtRUJBRE1TRyBtYXkgYWxzbyBiZQorICogcmV0dXJuZWQgZm9yIGFueSB2b2x1bWUgdHlwZSBpZiBhbiBFQ0MgZXJyb3Igd2FzIGRldGVjdGVkIGJ5IHRoZSBNVEQgZGV2aWNlCisgKiBkcml2ZXIuIE90aGVyIG5lZ2F0aXZlIGVycm9yIGNvcmVkIG1heSBiZSByZXR1cm5lZCBpbiBjYXNlIG9mIG90aGVyIGVycm9ycy4KKyAqLworaW50IHViaV9lYmFfcmVhZF9sZWIoc3RydWN0IHViaV9kZXZpY2UgKnViaSwgaW50IHZvbF9pZCwgaW50IGxudW0sIHZvaWQgKmJ1ZiwKKwkJICAgICBpbnQgb2Zmc2V0LCBpbnQgbGVuLCBpbnQgY2hlY2spCit7CisJaW50IGVyciwgcG51bSwgc2NydWIgPSAwLCBpZHggPSB2b2xfaWQyaWR4KHViaSwgdm9sX2lkKTsKKwlzdHJ1Y3QgdWJpX3ZpZF9oZHIgKnZpZF9oZHI7CisJc3RydWN0IHViaV92b2x1bWUgKnZvbCA9IHViaS0+dm9sdW1lc1tpZHhdOworCXVpbnQzMl90IGNyYywgY3JjMTsKKworCWVyciA9IGxlYl9yZWFkX2xvY2sodWJpLCB2b2xfaWQsIGxudW0pOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlwbnVtID0gdm9sLT5lYmFfdGJsW2xudW1dOworCWlmIChwbnVtIDwgMCkgeworCQkvKgorCQkgKiBUaGUgbG9naWNhbCBlcmFzZWJsb2NrIGlzIG5vdCBtYXBwZWQsIGZpbGwgdGhlIHdob2xlIGJ1ZmZlcgorCQkgKiB3aXRoIDB4RkYgYnl0ZXMuIFRoZSBleGNlcHRpb24gaXMgc3RhdGljIHZvbHVtZXMgZm9yIHdoaWNoCisJCSAqIGl0IGlzIGFuIGVycm9yIHRvIHJlYWQgdW5tYXBwZWQgbG9naWNhbCBlcmFzZWJsb2Nrcy4KKwkJICovCisJCWRiZ19lYmEoInJlYWQgJWQgYnl0ZXMgZnJvbSBvZmZzZXQgJWQgb2YgTEVCICVkOiVkICh1bm1hcHBlZCkiLAorCQkJbGVuLCBvZmZzZXQsIHZvbF9pZCwgbG51bSk7CisJCWxlYl9yZWFkX3VubG9jayh1YmksIHZvbF9pZCwgbG51bSk7CisJCXViaV9hc3NlcnQodm9sLT52b2xfdHlwZSAhPSBVQklfU1RBVElDX1ZPTFVNRSk7CisJCW1lbXNldChidWYsIDB4RkYsIGxlbik7CisJCXJldHVybiAwOworCX0KKworCWRiZ19lYmEoInJlYWQgJWQgYnl0ZXMgZnJvbSBvZmZzZXQgJWQgb2YgTEVCICVkOiVkLCBQRUIgJWQiLAorCQlsZW4sIG9mZnNldCwgdm9sX2lkLCBsbnVtLCBwbnVtKTsKKworCWlmICh2b2wtPnZvbF90eXBlID09IFVCSV9EWU5BTUlDX1ZPTFVNRSkKKwkJY2hlY2sgPSAwOworCityZXRyeToKKwlpZiAoY2hlY2spIHsKKwkJdmlkX2hkciA9IHViaV96YWxsb2NfdmlkX2hkcih1YmkpOworCQlpZiAoIXZpZF9oZHIpIHsKKwkJCWVyciA9IC1FTk9NRU07CisJCQlnb3RvIG91dF91bmxvY2s7CisJCX0KKworCQllcnIgPSB1YmlfaW9fcmVhZF92aWRfaGRyKHViaSwgcG51bSwgdmlkX2hkciwgMSk7CisJCWlmIChlcnIgJiYgZXJyICE9IFVCSV9JT19CSVRGTElQUykgeworCQkJaWYgKGVyciA+IDApIHsKKwkJCQkvKgorCQkJCSAqIFRoZSBoZWFkZXIgaXMgZWl0aGVyIGFic2VudCBvciBjb3JydXB0ZWQuCisJCQkJICogVGhlIGZvcm1lciBjYXNlIG1lYW5zIHRoZXJlIGlzIGEgYnVnIC0KKwkJCQkgKiBzd2l0Y2ggdG8gcmVhZC1vbmx5IG1vZGUganVzdCBpbiBjYXNlLgorCQkJCSAqIFRoZSBsYXR0ZXIgY2FzZSBtZWFucyBhIHJlYWwgY29ycnVwdGlvbiAtIHdlCisJCQkJICogbWF5IHRyeSB0byByZWNvdmVyIGRhdGEuIEZJWE1FOiBidXQgdGhpcyBpcworCQkJCSAqIG5vdCBpbXBsZW1lbnRlZC4KKwkJCQkgKi8KKwkJCQlpZiAoZXJyID09IFVCSV9JT19CQURfVklEX0hEUikgeworCQkJCQl1Ymlfd2FybigiYmFkIFZJRCBoZWFkZXIgYXQgUEVCICVkLCBMRUIiCisJCQkJCQkgIiVkOiVkIiwgcG51bSwgdm9sX2lkLCBsbnVtKTsKKwkJCQkJZXJyID0gLUVCQURNU0c7CisJCQkJfSBlbHNlCisJCQkJCXViaV9yb19tb2RlKHViaSk7CisJCQl9CisJCQlnb3RvIG91dF9mcmVlOworCQl9IGVsc2UgaWYgKGVyciA9PSBVQklfSU9fQklURkxJUFMpCisJCQlzY3J1YiA9IDE7CisKKwkJdWJpX2Fzc2VydChsbnVtIDwgdWJpMzJfdG9fY3B1KHZpZF9oZHItPnVzZWRfZWJzKSk7CisJCXViaV9hc3NlcnQobGVuID09IHViaTMyX3RvX2NwdSh2aWRfaGRyLT5kYXRhX3NpemUpKTsKKworCQljcmMgPSB1YmkzMl90b19jcHUodmlkX2hkci0+ZGF0YV9jcmMpOworCQl1YmlfZnJlZV92aWRfaGRyKHViaSwgdmlkX2hkcik7CisJfQorCisJZXJyID0gdWJpX2lvX3JlYWRfZGF0YSh1YmksIGJ1ZiwgcG51bSwgb2Zmc2V0LCBsZW4pOworCWlmIChlcnIpIHsKKwkJaWYgKGVyciA9PSBVQklfSU9fQklURkxJUFMpIHsKKwkJCXNjcnViID0gMTsKKwkJCWVyciA9IDA7CisJCX0gZWxzZSBpZiAoZXJyID09IC1FQkFETVNHKSB7CisJCQlpZiAodm9sLT52b2xfdHlwZSA9PSBVQklfRFlOQU1JQ19WT0xVTUUpCisJCQkJZ290byBvdXRfdW5sb2NrOworCQkJc2NydWIgPSAxOworCQkJaWYgKCFjaGVjaykgeworCQkJCXViaV9tc2coImZvcmNlIGRhdGEgY2hlY2tpbmciKTsKKwkJCQljaGVjayA9IDE7CisJCQkJZ290byByZXRyeTsKKwkJCX0KKwkJfSBlbHNlCisJCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJaWYgKGNoZWNrKSB7CisJCWNyYzEgPSBjcmMzMihVQklfQ1JDMzJfSU5JVCwgYnVmLCBsZW4pOworCQlpZiAoY3JjMSAhPSBjcmMpIHsKKwkJCXViaV93YXJuKCJDUkMgZXJyb3I6IGNhbGN1bGF0ZWQgJSMwOHgsIG11c3QgYmUgJSMwOHgiLAorCQkJCSBjcmMxLCBjcmMpOworCQkJZXJyID0gLUVCQURNU0c7CisJCQlnb3RvIG91dF91bmxvY2s7CisJCX0KKwl9CisKKwlpZiAoc2NydWIpCisJCWVyciA9IHViaV93bF9zY3J1Yl9wZWIodWJpLCBwbnVtKTsKKworCWxlYl9yZWFkX3VubG9jayh1YmksIHZvbF9pZCwgbG51bSk7CisJcmV0dXJuIGVycjsKKworb3V0X2ZyZWU6CisJdWJpX2ZyZWVfdmlkX2hkcih1YmksIHZpZF9oZHIpOworb3V0X3VubG9jazoKKwlsZWJfcmVhZF91bmxvY2sodWJpLCB2b2xfaWQsIGxudW0pOworCXJldHVybiBlcnI7Cit9CisKKy8qKgorICogcmVjb3Zlcl9wZWIgLSByZWNvdmVyIGZyb20gd3JpdGUgZmFpbHVyZS4KKyAqIEB1Ymk6IFVCSSBkZXZpY2UgZGVzY3JpcHRpb24gb2JqZWN0CisgKiBAcG51bTogdGhlIHBoeXNpY2FsIGVyYXNlYmxvY2sgdG8gcmVjb3ZlcgorICogQHZvbF9pZDogdm9sdW1lIElECisgKiBAbG51bTogbG9naWNhbCBlcmFzZWJsb2NrIG51bWJlcgorICogQGJ1ZjogZGF0YSB3aGljaCB3YXMgbm90IHdyaXR0ZW4gYmVjYXVzZSBvZiB0aGUgd3JpdGUgZmFpbHVyZQorICogQG9mZnNldDogb2Zmc2V0IG9mIHRoZSBmYWlsZWQgd3JpdGUKKyAqIEBsZW46IGhvdyBtYW55IGJ5dGVzIHNob3VsZCBoYXZlIGJlZW4gd3JpdHRlbgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGluIGNhc2Ugb2YgYSB3cml0ZSBmYWlsdXJlIGFuZCBtb3ZlcyBhbGwgZ29vZCBkYXRhCisgKiBmcm9tIHRoZSBwb3RlbnRpYWxseSBiYWQgcGh5c2ljYWwgZXJhc2VibG9jayB0byBhIGdvb2QgcGh5c2ljYWwgZXJhc2VibG9jay4KKyAqIFRoaXMgZnVuY3Rpb24gYWxzbyB3cml0ZXMgdGhlIGRhdGEgd2hpY2ggd2FzIG5vdCB3cml0dGVuIGR1ZSB0byB0aGUgZmFpbHVyZS4KKyAqIFJldHVybnMgbmV3IHBoeXNpY2FsIGVyYXNlYmxvY2sgbnVtYmVyIGluIGNhc2Ugb2Ygc3VjY2VzcywgYW5kIGEgbmVnYXRpdmUKKyAqIGVycm9yIGNvZGUgaW4gY2FzZSBvZiBmYWlsdXJlLgorICovCitzdGF0aWMgaW50IHJlY292ZXJfcGViKHN0cnVjdCB1YmlfZGV2aWNlICp1YmksIGludCBwbnVtLCBpbnQgdm9sX2lkLCBpbnQgbG51bSwKKwkJICAgICAgIGNvbnN0IHZvaWQgKmJ1ZiwgaW50IG9mZnNldCwgaW50IGxlbikKK3sKKwlpbnQgZXJyLCBpZHggPSB2b2xfaWQyaWR4KHViaSwgdm9sX2lkKSwgbmV3X3BudW0sIGRhdGFfc2l6ZSwgdHJpZXMgPSAwOworCXN0cnVjdCB1Ymlfdm9sdW1lICp2b2wgPSB1YmktPnZvbHVtZXNbaWR4XTsKKwlzdHJ1Y3QgdWJpX3ZpZF9oZHIgKnZpZF9oZHI7CisJdW5zaWduZWQgY2hhciAqbmV3X2J1ZjsKKworCXZpZF9oZHIgPSB1YmlfemFsbG9jX3ZpZF9oZHIodWJpKTsKKwlpZiAoIXZpZF9oZHIpIHsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCityZXRyeToKKwluZXdfcG51bSA9IHViaV93bF9nZXRfcGViKHViaSwgVUJJX1VOS05PV04pOworCWlmIChuZXdfcG51bSA8IDApIHsKKwkJdWJpX2ZyZWVfdmlkX2hkcih1YmksIHZpZF9oZHIpOworCQlyZXR1cm4gbmV3X3BudW07CisJfQorCisJdWJpX21zZygicmVjb3ZlciBQRUIgJWQsIG1vdmUgZGF0YSB0byBQRUIgJWQiLCBwbnVtLCBuZXdfcG51bSk7CisKKwllcnIgPSB1YmlfaW9fcmVhZF92aWRfaGRyKHViaSwgcG51bSwgdmlkX2hkciwgMSk7CisJaWYgKGVyciAmJiBlcnIgIT0gVUJJX0lPX0JJVEZMSVBTKSB7CisJCWlmIChlcnIgPiAwKQorCQkJZXJyID0gLUVJTzsKKwkJZ290byBvdXRfcHV0OworCX0KKworCXZpZF9oZHItPnNxbnVtID0gY3B1X3RvX3ViaTY0KG5leHRfc3FudW0odWJpKSk7CisJZXJyID0gdWJpX2lvX3dyaXRlX3ZpZF9oZHIodWJpLCBuZXdfcG51bSwgdmlkX2hkcik7CisJaWYgKGVycikKKwkJZ290byB3cml0ZV9lcnJvcjsKKworCWRhdGFfc2l6ZSA9IG9mZnNldCArIGxlbjsKKwluZXdfYnVmID0ga21hbGxvYyhkYXRhX3NpemUsIEdGUF9LRVJORUwpOworCWlmICghbmV3X2J1ZikgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIG91dF9wdXQ7CisJfQorCW1lbXNldChuZXdfYnVmICsgb2Zmc2V0LCAweEZGLCBsZW4pOworCisJLyogUmVhZCBldmVyeXRoaW5nIGJlZm9yZSB0aGUgYXJlYSB3aGVyZSB0aGUgd3JpdGUgZmFpbHVyZSBoYXBwZW5lZCAqLworCWlmIChvZmZzZXQgPiAwKSB7CisJCWVyciA9IHViaV9pb19yZWFkX2RhdGEodWJpLCBuZXdfYnVmLCBwbnVtLCAwLCBvZmZzZXQpOworCQlpZiAoZXJyICYmIGVyciAhPSBVQklfSU9fQklURkxJUFMpIHsKKwkJCWtmcmVlKG5ld19idWYpOworCQkJZ290byBvdXRfcHV0OworCQl9CisJfQorCisJbWVtY3B5KG5ld19idWYgKyBvZmZzZXQsIGJ1ZiwgbGVuKTsKKworCWVyciA9IHViaV9pb193cml0ZV9kYXRhKHViaSwgbmV3X2J1ZiwgbmV3X3BudW0sIDAsIGRhdGFfc2l6ZSk7CisJaWYgKGVycikgeworCQlrZnJlZShuZXdfYnVmKTsKKwkJZ290byB3cml0ZV9lcnJvcjsKKwl9CisKKwlrZnJlZShuZXdfYnVmKTsKKwl1YmlfZnJlZV92aWRfaGRyKHViaSwgdmlkX2hkcik7CisKKwl2b2wtPmViYV90YmxbbG51bV0gPSBuZXdfcG51bTsKKwl1Ymlfd2xfcHV0X3BlYih1YmksIHBudW0sIDEpOworCisJdWJpX21zZygiZGF0YSB3YXMgc3VjY2Vzc2Z1bGx5IHJlY292ZXJlZCIpOworCXJldHVybiAwOworCitvdXRfcHV0OgorCXViaV93bF9wdXRfcGViKHViaSwgbmV3X3BudW0sIDEpOworCXViaV9mcmVlX3ZpZF9oZHIodWJpLCB2aWRfaGRyKTsKKwlyZXR1cm4gZXJyOworCit3cml0ZV9lcnJvcjoKKwkvKgorCSAqIEJhZCBsdWNrPyBUaGlzIHBoeXNpY2FsIGVyYXNlYmxvY2sgaXMgYmFkIHRvbz8gQ3J1ZC4gTGV0J3MgdHJ5IHRvCisJICogZ2V0IGFub3RoZXIgb25lLgorCSAqLworCXViaV93YXJuKCJmYWlsZWQgdG8gd3JpdGUgdG8gUEVCICVkIiwgbmV3X3BudW0pOworCXViaV93bF9wdXRfcGViKHViaSwgbmV3X3BudW0sIDEpOworCWlmICgrK3RyaWVzID4gVUJJX0lPX1JFVFJJRVMpIHsKKwkJdWJpX2ZyZWVfdmlkX2hkcih1YmksIHZpZF9oZHIpOworCQlyZXR1cm4gZXJyOworCX0KKwl1YmlfbXNnKCJ0cnkgYWdhaW4iKTsKKwlnb3RvIHJldHJ5OworfQorCisvKioKKyAqIHViaV9lYmFfd3JpdGVfbGViIC0gd3JpdGUgZGF0YSB0byBkeW5hbWljIHZvbHVtZS4KKyAqIEB1Ymk6IFVCSSBkZXZpY2UgZGVzY3JpcHRpb24gb2JqZWN0CisgKiBAdm9sX2lkOiB2b2x1bWUgSUQKKyAqIEBsbnVtOiBsb2dpY2FsIGVyYXNlYmxvY2sgbnVtYmVyCisgKiBAYnVmOiB0aGUgZGF0YSB0byB3cml0ZQorICogQG9mZnNldDogb2Zmc2V0IHdpdGhpbiB0aGUgbG9naWNhbCBlcmFzZWJsb2NrIHdoZXJlIHRvIHdyaXRlCisgKiBAbGVuOiBob3cgbWFueSBieXRlcyB0byB3cml0ZQorICogQGR0eXBlOiBkYXRhIHR5cGUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdyaXRlcyBkYXRhIHRvIGxvZ2ljYWwgZXJhc2VibG9jayBAbG51bSBvZiBhIGR5bmFtaWMgdm9sdW1lCisgKiBAdm9sX2lkLiBSZXR1cm5zIHplcm8gaW4gY2FzZSBvZiBzdWNjZXNzIGFuZCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgaW4gY2FzZQorICogb2YgZmFpbHVyZS4gSW4gY2FzZSBvZiBlcnJvciwgaXQgaXMgcG9zc2libGUgdGhhdCBzb21ldGhpbmcgd2FzIHN0aWxsCisgKiB3cml0dGVuIHRvIHRoZSBmbGFzaCBtZWRpYSwgYnV0IG1heSBiZSBzb21lIGdhcmJhZ2UuCisgKi8KK2ludCB1YmlfZWJhX3dyaXRlX2xlYihzdHJ1Y3QgdWJpX2RldmljZSAqdWJpLCBpbnQgdm9sX2lkLCBpbnQgbG51bSwKKwkJICAgICAgY29uc3Qgdm9pZCAqYnVmLCBpbnQgb2Zmc2V0LCBpbnQgbGVuLCBpbnQgZHR5cGUpCit7CisJaW50IGlkeCA9IHZvbF9pZDJpZHgodWJpLCB2b2xfaWQpLCBlcnIsIHBudW0sIHRyaWVzID0gMDsKKwlzdHJ1Y3QgdWJpX3ZvbHVtZSAqdm9sID0gdWJpLT52b2x1bWVzW2lkeF07CisJc3RydWN0IHViaV92aWRfaGRyICp2aWRfaGRyOworCisJaWYgKHViaS0+cm9fbW9kZSkKKwkJcmV0dXJuIC1FUk9GUzsKKworCWVyciA9IGxlYl93cml0ZV9sb2NrKHViaSwgdm9sX2lkLCBsbnVtKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJcG51bSA9IHZvbC0+ZWJhX3RibFtsbnVtXTsKKwlpZiAocG51bSA+PSAwKSB7CisJCWRiZ19lYmEoIndyaXRlICVkIGJ5dGVzIGF0IG9mZnNldCAlZCBvZiBMRUIgJWQ6JWQsIFBFQiAlZCIsCisJCQlsZW4sIG9mZnNldCwgdm9sX2lkLCBsbnVtLCBwbnVtKTsKKworCQllcnIgPSB1YmlfaW9fd3JpdGVfZGF0YSh1YmksIGJ1ZiwgcG51bSwgb2Zmc2V0LCBsZW4pOworCQlpZiAoZXJyKSB7CisJCQl1Ymlfd2FybigiZmFpbGVkIHRvIHdyaXRlIGRhdGEgdG8gUEVCICVkIiwgcG51bSk7CisJCQlpZiAoZXJyID09IC1FSU8gJiYgdWJpLT5iYWRfYWxsb3dlZCkKKwkJCQllcnIgPSByZWNvdmVyX3BlYih1YmksIHBudW0sIHZvbF9pZCwgbG51bSwgYnVmLCBvZmZzZXQsIGxlbik7CisJCQlpZiAoZXJyKQorCQkJCXViaV9yb19tb2RlKHViaSk7CisJCX0KKwkJbGViX3dyaXRlX3VubG9jayh1YmksIHZvbF9pZCwgbG51bSk7CisJCXJldHVybiBlcnI7CisJfQorCisJLyoKKwkgKiBUaGUgbG9naWNhbCBlcmFzZWJsb2NrIGlzIG5vdCBtYXBwZWQuIFdlIGhhdmUgdG8gZ2V0IGEgZnJlZSBwaHlzaWNhbAorCSAqIGVyYXNlYmxvY2sgYW5kIHdyaXRlIHRoZSB2b2x1bWUgaWRlbnRpZmllciBoZWFkZXIgdGhlcmUgZmlyc3QuCisJICovCisJdmlkX2hkciA9IHViaV96YWxsb2NfdmlkX2hkcih1YmkpOworCWlmICghdmlkX2hkcikgeworCQlsZWJfd3JpdGVfdW5sb2NrKHViaSwgdm9sX2lkLCBsbnVtKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJdmlkX2hkci0+dm9sX3R5cGUgPSBVQklfVklEX0RZTkFNSUM7CisJdmlkX2hkci0+c3FudW0gPSBjcHVfdG9fdWJpNjQobmV4dF9zcW51bSh1YmkpKTsKKwl2aWRfaGRyLT52b2xfaWQgPSBjcHVfdG9fdWJpMzIodm9sX2lkKTsKKwl2aWRfaGRyLT5sbnVtID0gY3B1X3RvX3ViaTMyKGxudW0pOworCXZpZF9oZHItPmNvbXBhdCA9IHViaV9nZXRfY29tcGF0KHViaSwgdm9sX2lkKTsKKwl2aWRfaGRyLT5kYXRhX3BhZCA9IGNwdV90b191YmkzMih2b2wtPmRhdGFfcGFkKTsKKworcmV0cnk6CisJcG51bSA9IHViaV93bF9nZXRfcGViKHViaSwgZHR5cGUpOworCWlmIChwbnVtIDwgMCkgeworCQl1YmlfZnJlZV92aWRfaGRyKHViaSwgdmlkX2hkcik7CisJCWxlYl93cml0ZV91bmxvY2sodWJpLCB2b2xfaWQsIGxudW0pOworCQlyZXR1cm4gcG51bTsKKwl9CisKKwlkYmdfZWJhKCJ3cml0ZSBWSUQgaGRyIGFuZCAlZCBieXRlcyBhdCBvZmZzZXQgJWQgb2YgTEVCICVkOiVkLCBQRUIgJWQiLAorCQlsZW4sIG9mZnNldCwgdm9sX2lkLCBsbnVtLCBwbnVtKTsKKworCWVyciA9IHViaV9pb193cml0ZV92aWRfaGRyKHViaSwgcG51bSwgdmlkX2hkcik7CisJaWYgKGVycikgeworCQl1Ymlfd2FybigiZmFpbGVkIHRvIHdyaXRlIFZJRCBoZWFkZXIgdG8gTEVCICVkOiVkLCBQRUIgJWQiLAorCQkJIHZvbF9pZCwgbG51bSwgcG51bSk7CisJCWdvdG8gd3JpdGVfZXJyb3I7CisJfQorCisJZXJyID0gdWJpX2lvX3dyaXRlX2RhdGEodWJpLCBidWYsIHBudW0sIG9mZnNldCwgbGVuKTsKKwlpZiAoZXJyKSB7CisJCXViaV93YXJuKCJmYWlsZWQgdG8gd3JpdGUgJWQgYnl0ZXMgYXQgb2Zmc2V0ICVkIG9mIExFQiAlZDolZCwgIgorCQkJICJQRUIgJWQiLCBsZW4sIG9mZnNldCwgdm9sX2lkLCBsbnVtLCBwbnVtKTsKKwkJZ290byB3cml0ZV9lcnJvcjsKKwl9CisKKwl2b2wtPmViYV90YmxbbG51bV0gPSBwbnVtOworCisJbGViX3dyaXRlX3VubG9jayh1YmksIHZvbF9pZCwgbG51bSk7CisJdWJpX2ZyZWVfdmlkX2hkcih1YmksIHZpZF9oZHIpOworCXJldHVybiAwOworCit3cml0ZV9lcnJvcjoKKwlpZiAoZXJyICE9IC1FSU8gfHwgIXViaS0+YmFkX2FsbG93ZWQpIHsKKwkJdWJpX3JvX21vZGUodWJpKTsKKwkJbGViX3dyaXRlX3VubG9jayh1YmksIHZvbF9pZCwgbG51bSk7CisJCXViaV9mcmVlX3ZpZF9oZHIodWJpLCB2aWRfaGRyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwkvKgorCSAqIEZvcnR1bmF0ZWx5LCB0aGlzIGlzIHRoZSBmaXJzdCB3cml0ZSBvcGVyYXRpb24gdG8gdGhpcyBwaHlzaWNhbAorCSAqIGVyYXNlYmxvY2ssIHNvIGp1c3QgcHV0IGl0IGFuZCByZXF1ZXN0IGEgbmV3IG9uZS4gV2UgYXNzdW1lIHRoYXQgaWYKKwkgKiB0aGlzIHBoeXNpY2FsIGVyYXNlYmxvY2sgd2VudCBiYWQsIHRoZSBlcmFzZSBjb2RlIHdpbGwgaGFuZGxlIHRoYXQuCisJICovCisJZXJyID0gdWJpX3dsX3B1dF9wZWIodWJpLCBwbnVtLCAxKTsKKwlpZiAoZXJyIHx8ICsrdHJpZXMgPiBVQklfSU9fUkVUUklFUykgeworCQl1Ymlfcm9fbW9kZSh1YmkpOworCQlsZWJfd3JpdGVfdW5sb2NrKHViaSwgdm9sX2lkLCBsbnVtKTsKKwkJdWJpX2ZyZWVfdmlkX2hkcih1YmksIHZpZF9oZHIpOworCQlyZXR1cm4gZXJyOworCX0KKworCXZpZF9oZHItPnNxbnVtID0gY3B1X3RvX3ViaTY0KG5leHRfc3FudW0odWJpKSk7CisJdWJpX21zZygidHJ5IGFub3RoZXIgUEVCIik7CisJZ290byByZXRyeTsKK30KKworLyoqCisgKiB1YmlfZWJhX3dyaXRlX2xlYl9zdCAtIHdyaXRlIGRhdGEgdG8gc3RhdGljIHZvbHVtZS4KKyAqIEB1Ymk6IFVCSSBkZXZpY2UgZGVzY3JpcHRpb24gb2JqZWN0CisgKiBAdm9sX2lkOiB2b2x1bWUgSUQKKyAqIEBsbnVtOiBsb2dpY2FsIGVyYXNlYmxvY2sgbnVtYmVyCisgKiBAYnVmOiBkYXRhIHRvIHdyaXRlCisgKiBAbGVuOiBob3cgbWFueSBieXRlcyB0byB3cml0ZQorICogQGR0eXBlOiBkYXRhIHR5cGUKKyAqIEB1c2VkX2ViczogaG93IG1hbnkgbG9naWNhbCBlcmFzZWJsb2NrcyB3aWxsIHRoaXMgdm9sdW1lIGNvbnRhaW4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdyaXRlcyBkYXRhIHRvIGxvZ2ljYWwgZXJhc2VibG9jayBAbG51bSBvZiBzdGF0aWMgdm9sdW1lCisgKiBAdm9sX2lkLiBUaGUgQHVzZWRfZWJzIGFyZ3VtZW50IHNob3VsZCBjb250YWluIHRvdGFsIG51bWJlciBvZiBsb2dpY2FsCisgKiBlcmFzZWJsb2NrIGluIHRoaXMgc3RhdGljIHZvbHVtZS4KKyAqCisgKiBXaGVuIHdyaXRpbmcgdG8gdGhlIGxhc3QgbG9naWNhbCBlcmFzZWJsb2NrLCB0aGUgQGxlbiBhcmd1bWVudCBkb2Vzbid0IGhhdmUKKyAqIHRvIGJlIGFsaWduZWQgdG8gdGhlIG1pbmltYWwgSS9PIHVuaXQgc2l6ZS4gSW5zdGVhZCwgaXQgaGFzIHRvIGJlIGVxdWl2YWxlbnQKKyAqIHRvIHRoZSByZWFsIGRhdGEgc2l6ZSwgYWx0aG91Z2ggdGhlIEBidWYgYnVmZmVyIGhhcyB0byBjb250YWluIHRoZQorICogYWxpZ25tZW50LiBJbiBhbGwgb3RoZXIgY2FzZXMsIEBsZW4gaGFzIHRvIGJlIGFsaWduZWQuCisgKgorICogSXQgaXMgcHJvaGliaXRlZCB0byB3cml0ZSBtb3JlIHRoZW4gb25jZSB0byBsb2dpY2FsIGVyYXNlYmxvY2tzIG9mIHN0YXRpYworICogdm9sdW1lcy4gVGhpcyBmdW5jdGlvbiByZXR1cm5zIHplcm8gaW4gY2FzZSBvZiBzdWNjZXNzIGFuZCBhIG5lZ2F0aXZlIGVycm9yCisgKiBjb2RlIGluIGNhc2Ugb2YgZmFpbHVyZS4KKyAqLworaW50IHViaV9lYmFfd3JpdGVfbGViX3N0KHN0cnVjdCB1YmlfZGV2aWNlICp1YmksIGludCB2b2xfaWQsIGludCBsbnVtLAorCQkJIGNvbnN0IHZvaWQgKmJ1ZiwgaW50IGxlbiwgaW50IGR0eXBlLCBpbnQgdXNlZF9lYnMpCit7CisJaW50IGVyciwgcG51bSwgdHJpZXMgPSAwLCBkYXRhX3NpemUgPSBsZW47CisJaW50IGlkeCA9IHZvbF9pZDJpZHgodWJpLCB2b2xfaWQpOworCXN0cnVjdCB1Ymlfdm9sdW1lICp2b2wgPSB1YmktPnZvbHVtZXNbaWR4XTsKKwlzdHJ1Y3QgdWJpX3ZpZF9oZHIgKnZpZF9oZHI7CisJdWludDMyX3QgY3JjOworCisJaWYgKHViaS0+cm9fbW9kZSkKKwkJcmV0dXJuIC1FUk9GUzsKKworCWlmIChsbnVtID09IHVzZWRfZWJzIC0gMSkKKwkJLyogSWYgdGhpcyBpcyB0aGUgbGFzdCBMRUIgQGxlbiBtYXkgYmUgdW5hbGlnbmVkICovCisJCWxlbiA9IEFMSUdOKGRhdGFfc2l6ZSwgdWJpLT5taW5faW9fc2l6ZSk7CisJZWxzZQorCQl1YmlfYXNzZXJ0KGxlbiAlIHViaS0+bWluX2lvX3NpemUgPT0gMCk7CisKKwl2aWRfaGRyID0gdWJpX3phbGxvY192aWRfaGRyKHViaSk7CisJaWYgKCF2aWRfaGRyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWVyciA9IGxlYl93cml0ZV9sb2NrKHViaSwgdm9sX2lkLCBsbnVtKTsKKwlpZiAoZXJyKSB7CisJCXViaV9mcmVlX3ZpZF9oZHIodWJpLCB2aWRfaGRyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwl2aWRfaGRyLT5zcW51bSA9IGNwdV90b191Ymk2NChuZXh0X3NxbnVtKHViaSkpOworCXZpZF9oZHItPnZvbF9pZCA9IGNwdV90b191YmkzMih2b2xfaWQpOworCXZpZF9oZHItPmxudW0gPSBjcHVfdG9fdWJpMzIobG51bSk7CisJdmlkX2hkci0+Y29tcGF0ID0gdWJpX2dldF9jb21wYXQodWJpLCB2b2xfaWQpOworCXZpZF9oZHItPmRhdGFfcGFkID0gY3B1X3RvX3ViaTMyKHZvbC0+ZGF0YV9wYWQpOworCisJY3JjID0gY3JjMzIoVUJJX0NSQzMyX0lOSVQsIGJ1ZiwgZGF0YV9zaXplKTsKKwl2aWRfaGRyLT52b2xfdHlwZSA9IFVCSV9WSURfU1RBVElDOworCXZpZF9oZHItPmRhdGFfc2l6ZSA9IGNwdV90b191YmkzMihkYXRhX3NpemUpOworCXZpZF9oZHItPnVzZWRfZWJzID0gY3B1X3RvX3ViaTMyKHVzZWRfZWJzKTsKKwl2aWRfaGRyLT5kYXRhX2NyYyA9IGNwdV90b191YmkzMihjcmMpOworCityZXRyeToKKwlwbnVtID0gdWJpX3dsX2dldF9wZWIodWJpLCBkdHlwZSk7CisJaWYgKHBudW0gPCAwKSB7CisJCXViaV9mcmVlX3ZpZF9oZHIodWJpLCB2aWRfaGRyKTsKKwkJbGViX3dyaXRlX3VubG9jayh1YmksIHZvbF9pZCwgbG51bSk7CisJCXJldHVybiBwbnVtOworCX0KKworCWRiZ19lYmEoIndyaXRlIFZJRCBoZHIgYW5kICVkIGJ5dGVzIGF0IExFQiAlZDolZCwgUEVCICVkLCB1c2VkX2VicyAlZCIsCisJCWxlbiwgdm9sX2lkLCBsbnVtLCBwbnVtLCB1c2VkX2Vicyk7CisKKwllcnIgPSB1YmlfaW9fd3JpdGVfdmlkX2hkcih1YmksIHBudW0sIHZpZF9oZHIpOworCWlmIChlcnIpIHsKKwkJdWJpX3dhcm4oImZhaWxlZCB0byB3cml0ZSBWSUQgaGVhZGVyIHRvIExFQiAlZDolZCwgUEVCICVkIiwKKwkJCSB2b2xfaWQsIGxudW0sIHBudW0pOworCQlnb3RvIHdyaXRlX2Vycm9yOworCX0KKworCWVyciA9IHViaV9pb193cml0ZV9kYXRhKHViaSwgYnVmLCBwbnVtLCAwLCBsZW4pOworCWlmIChlcnIpIHsKKwkJdWJpX3dhcm4oImZhaWxlZCB0byB3cml0ZSAlZCBieXRlcyBvZiBkYXRhIHRvIFBFQiAlZCIsCisJCQkgbGVuLCBwbnVtKTsKKwkJZ290byB3cml0ZV9lcnJvcjsKKwl9CisKKwl1YmlfYXNzZXJ0KHZvbC0+ZWJhX3RibFtsbnVtXSA8IDApOworCXZvbC0+ZWJhX3RibFtsbnVtXSA9IHBudW07CisKKwlsZWJfd3JpdGVfdW5sb2NrKHViaSwgdm9sX2lkLCBsbnVtKTsKKwl1YmlfZnJlZV92aWRfaGRyKHViaSwgdmlkX2hkcik7CisJcmV0dXJuIDA7CisKK3dyaXRlX2Vycm9yOgorCWlmIChlcnIgIT0gLUVJTyB8fCAhdWJpLT5iYWRfYWxsb3dlZCkgeworCQkvKgorCQkgKiBUaGlzIGZsYXNoIGRldmljZSBkb2VzIG5vdCBhZG1pdCBvZiBiYWQgZXJhc2VibG9ja3Mgb3IKKwkJICogc29tZXRoaW5nIG5hc3R5IGFuZCB1bmV4cGVjdGVkIGhhcHBlbmVkLiBTd2l0Y2ggdG8gcmVhZC1vbmx5CisJCSAqIG1vZGUganVzdCBpbiBjYXNlLgorCQkgKi8KKwkJdWJpX3JvX21vZGUodWJpKTsKKwkJbGViX3dyaXRlX3VubG9jayh1YmksIHZvbF9pZCwgbG51bSk7CisJCXViaV9mcmVlX3ZpZF9oZHIodWJpLCB2aWRfaGRyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwllcnIgPSB1Ymlfd2xfcHV0X3BlYih1YmksIHBudW0sIDEpOworCWlmIChlcnIgfHwgKyt0cmllcyA+IFVCSV9JT19SRVRSSUVTKSB7CisJCXViaV9yb19tb2RlKHViaSk7CisJCWxlYl93cml0ZV91bmxvY2sodWJpLCB2b2xfaWQsIGxudW0pOworCQl1YmlfZnJlZV92aWRfaGRyKHViaSwgdmlkX2hkcik7CisJCXJldHVybiBlcnI7CisJfQorCisJdmlkX2hkci0+c3FudW0gPSBjcHVfdG9fdWJpNjQobmV4dF9zcW51bSh1YmkpKTsKKwl1YmlfbXNnKCJ0cnkgYW5vdGhlciBQRUIiKTsKKwlnb3RvIHJldHJ5OworfQorCisvKgorICogdWJpX2ViYV9hdG9taWNfbGViX2NoYW5nZSAtIGNoYW5nZSBsb2dpY2FsIGVyYXNlYmxvY2sgYXRvbWljYWxseS4KKyAqIEB1Ymk6IFVCSSBkZXZpY2UgZGVzY3JpcHRpb24gb2JqZWN0CisgKiBAdm9sX2lkOiB2b2x1bWUgSUQKKyAqIEBsbnVtOiBsb2dpY2FsIGVyYXNlYmxvY2sgbnVtYmVyCisgKiBAYnVmOiBkYXRhIHRvIHdyaXRlCisgKiBAbGVuOiBob3cgbWFueSBieXRlcyB0byB3cml0ZQorICogQGR0eXBlOiBkYXRhIHR5cGUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNoYW5nZXMgdGhlIGNvbnRlbnRzIG9mIGEgbG9naWNhbCBlcmFzZWJsb2NrIGF0b21pY2FsbHkuIEBidWYKKyAqIGhhcyB0byBjb250YWluIG5ldyBsb2dpY2FsIGVyYXNlYmxvY2sgZGF0YSwgYW5kIEBsZW4gLSB0aGUgbGVuZ3RoIG9mIHRoZQorICogZGF0YSwgd2hpY2ggaGFzIHRvIGJlIGFsaWduZWQuIFRoaXMgZnVuY3Rpb24gZ3VhcmFudGVlcyB0aGF0IGluIGNhc2Ugb2YgYW4KKyAqIHVuY2xlYW4gcmVib290IHRoZSBvbGQgY29udGVudHMgaXMgcHJlc2VydmVkLiBSZXR1cm5zIHplcm8gaW4gY2FzZSBvZgorICogc3VjY2VzcyBhbmQgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIGluIGNhc2Ugb2YgZmFpbHVyZS4KKyAqLworaW50IHViaV9lYmFfYXRvbWljX2xlYl9jaGFuZ2Uoc3RydWN0IHViaV9kZXZpY2UgKnViaSwgaW50IHZvbF9pZCwgaW50IGxudW0sCisJCQkgICAgICBjb25zdCB2b2lkICpidWYsIGludCBsZW4sIGludCBkdHlwZSkKK3sKKwlpbnQgZXJyLCBwbnVtLCB0cmllcyA9IDAsIGlkeCA9IHZvbF9pZDJpZHgodWJpLCB2b2xfaWQpOworCXN0cnVjdCB1Ymlfdm9sdW1lICp2b2wgPSB1YmktPnZvbHVtZXNbaWR4XTsKKwlzdHJ1Y3QgdWJpX3ZpZF9oZHIgKnZpZF9oZHI7CisJdWludDMyX3QgY3JjOworCisJaWYgKHViaS0+cm9fbW9kZSkKKwkJcmV0dXJuIC1FUk9GUzsKKworCXZpZF9oZHIgPSB1YmlfemFsbG9jX3ZpZF9oZHIodWJpKTsKKwlpZiAoIXZpZF9oZHIpCisJCXJldHVybiAtRU5PTUVNOworCisJZXJyID0gbGViX3dyaXRlX2xvY2sodWJpLCB2b2xfaWQsIGxudW0pOworCWlmIChlcnIpIHsKKwkJdWJpX2ZyZWVfdmlkX2hkcih1YmksIHZpZF9oZHIpOworCQlyZXR1cm4gZXJyOworCX0KKworCXZpZF9oZHItPnNxbnVtID0gY3B1X3RvX3ViaTY0KG5leHRfc3FudW0odWJpKSk7CisJdmlkX2hkci0+dm9sX2lkID0gY3B1X3RvX3ViaTMyKHZvbF9pZCk7CisJdmlkX2hkci0+bG51bSA9IGNwdV90b191YmkzMihsbnVtKTsKKwl2aWRfaGRyLT5jb21wYXQgPSB1YmlfZ2V0X2NvbXBhdCh1YmksIHZvbF9pZCk7CisJdmlkX2hkci0+ZGF0YV9wYWQgPSBjcHVfdG9fdWJpMzIodm9sLT5kYXRhX3BhZCk7CisKKwljcmMgPSBjcmMzMihVQklfQ1JDMzJfSU5JVCwgYnVmLCBsZW4pOworCXZpZF9oZHItPnZvbF90eXBlID0gVUJJX1ZJRF9TVEFUSUM7CisJdmlkX2hkci0+ZGF0YV9zaXplID0gY3B1X3RvX3ViaTMyKGxlbik7CisJdmlkX2hkci0+Y29weV9mbGFnID0gMTsKKwl2aWRfaGRyLT5kYXRhX2NyYyA9IGNwdV90b191YmkzMihjcmMpOworCityZXRyeToKKwlwbnVtID0gdWJpX3dsX2dldF9wZWIodWJpLCBkdHlwZSk7CisJaWYgKHBudW0gPCAwKSB7CisJCXViaV9mcmVlX3ZpZF9oZHIodWJpLCB2aWRfaGRyKTsKKwkJbGViX3dyaXRlX3VubG9jayh1YmksIHZvbF9pZCwgbG51bSk7CisJCXJldHVybiBwbnVtOworCX0KKworCWRiZ19lYmEoImNoYW5nZSBMRUIgJWQ6JWQsIFBFQiAlZCwgd3JpdGUgVklEIGhkciB0byBQRUIgJWQiLAorCQl2b2xfaWQsIGxudW0sIHZvbC0+ZWJhX3RibFtsbnVtXSwgcG51bSk7CisKKwllcnIgPSB1YmlfaW9fd3JpdGVfdmlkX2hkcih1YmksIHBudW0sIHZpZF9oZHIpOworCWlmIChlcnIpIHsKKwkJdWJpX3dhcm4oImZhaWxlZCB0byB3cml0ZSBWSUQgaGVhZGVyIHRvIExFQiAlZDolZCwgUEVCICVkIiwKKwkJCSB2b2xfaWQsIGxudW0sIHBudW0pOworCQlnb3RvIHdyaXRlX2Vycm9yOworCX0KKworCWVyciA9IHViaV9pb193cml0ZV9kYXRhKHViaSwgYnVmLCBwbnVtLCAwLCBsZW4pOworCWlmIChlcnIpIHsKKwkJdWJpX3dhcm4oImZhaWxlZCB0byB3cml0ZSAlZCBieXRlcyBvZiBkYXRhIHRvIFBFQiAlZCIsCisJCQkgbGVuLCBwbnVtKTsKKwkJZ290byB3cml0ZV9lcnJvcjsKKwl9CisKKwllcnIgPSB1Ymlfd2xfcHV0X3BlYih1YmksIHZvbC0+ZWJhX3RibFtsbnVtXSwgMSk7CisJaWYgKGVycikgeworCQl1YmlfZnJlZV92aWRfaGRyKHViaSwgdmlkX2hkcik7CisJCWxlYl93cml0ZV91bmxvY2sodWJpLCB2b2xfaWQsIGxudW0pOworCQlyZXR1cm4gZXJyOworCX0KKworCXZvbC0+ZWJhX3RibFtsbnVtXSA9IHBudW07CisJbGViX3dyaXRlX3VubG9jayh1YmksIHZvbF9pZCwgbG51bSk7CisJdWJpX2ZyZWVfdmlkX2hkcih1YmksIHZpZF9oZHIpOworCXJldHVybiAwOworCit3cml0ZV9lcnJvcjoKKwlpZiAoZXJyICE9IC1FSU8gfHwgIXViaS0+YmFkX2FsbG93ZWQpIHsKKwkJLyoKKwkJICogVGhpcyBmbGFzaCBkZXZpY2UgZG9lcyBub3QgYWRtaXQgb2YgYmFkIGVyYXNlYmxvY2tzIG9yCisJCSAqIHNvbWV0aGluZyBuYXN0eSBhbmQgdW5leHBlY3RlZCBoYXBwZW5lZC4gU3dpdGNoIHRvIHJlYWQtb25seQorCQkgKiBtb2RlIGp1c3QgaW4gY2FzZS4KKwkJICovCisJCXViaV9yb19tb2RlKHViaSk7CisJCWxlYl93cml0ZV91bmxvY2sodWJpLCB2b2xfaWQsIGxudW0pOworCQl1YmlfZnJlZV92aWRfaGRyKHViaSwgdmlkX2hkcik7CisJCXJldHVybiBlcnI7CisJfQorCisJZXJyID0gdWJpX3dsX3B1dF9wZWIodWJpLCBwbnVtLCAxKTsKKwlpZiAoZXJyIHx8ICsrdHJpZXMgPiBVQklfSU9fUkVUUklFUykgeworCQl1Ymlfcm9fbW9kZSh1YmkpOworCQlsZWJfd3JpdGVfdW5sb2NrKHViaSwgdm9sX2lkLCBsbnVtKTsKKwkJdWJpX2ZyZWVfdmlkX2hkcih1YmksIHZpZF9oZHIpOworCQlyZXR1cm4gZXJyOworCX0KKworCXZpZF9oZHItPnNxbnVtID0gY3B1X3RvX3ViaTY0KG5leHRfc3FudW0odWJpKSk7CisJdWJpX21zZygidHJ5IGFub3RoZXIgUEVCIik7CisJZ290byByZXRyeTsKK30KKworLyoqCisgKiBsdHJlZV9lbnRyeV9jdG9yIC0gbG9jayB0cmVlIGVudHJpZXMgc2xhYiBjYWNoZSBjb25zdHJ1Y3Rvci4KKyAqIEBvYmo6IHRoZSBsb2NrLXRyZWUgZW50cnkgdG8gY29uc3RydWN0CisgKiBAY2FjaGU6IHRoZSBsb2NrIHRyZWUgZW50cnkgc2xhYiBjYWNoZQorICogQGZsYWdzOiBjb25zdHJ1Y3RvciBmbGFncworICovCitzdGF0aWMgdm9pZCBsdHJlZV9lbnRyeV9jdG9yKHZvaWQgKm9iaiwgc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlLAorCQkJICAgICB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXN0cnVjdCBsdHJlZV9lbnRyeSAqbGUgPSBvYmo7CisKKwlpZiAoKGZsYWdzICYgKFNMQUJfQ1RPUl9WRVJJRlkgfCBTTEFCX0NUT1JfQ09OU1RSVUNUT1IpKSAhPQorCSAgICBTTEFCX0NUT1JfQ09OU1RSVUNUT1IpCisJCXJldHVybjsKKworCWxlLT51c2VycyA9IDA7CisJaW5pdF9yd3NlbSgmbGUtPm11dGV4KTsKK30KKworLyoqCisgKiB1YmlfZWJhX2NvcHlfbGViIC0gY29weSBsb2dpY2FsIGVyYXNlYmxvY2suCisgKiBAdWJpOiBVQkkgZGV2aWNlIGRlc2NyaXB0aW9uIG9iamVjdAorICogQGZyb206IHBoeXNpY2FsIGVyYXNlYmxvY2sgbnVtYmVyIGZyb20gd2hlcmUgdG8gY29weQorICogQHRvOiBwaHlzaWNhbCBlcmFzZWJsb2NrIG51bWJlciB3aGVyZSB0byBjb3B5CisgKiBAdmlkX2hkcjogVklEIGhlYWRlciBvZiB0aGUgQGZyb20gcGh5c2ljYWwgZXJhc2VibG9jaworICoKKyAqIFRoaXMgZnVuY3Rpb24gY29waWVzIGxvZ2ljYWwgZXJhc2VibG9jayBmcm9tIHBoeXNpY2FsIGVyYXNlYmxvY2sgQGZyb20gdG8KKyAqIHBoeXNpY2FsIGVyYXNlYmxvY2sgQHRvLiBUaGUgQHZpZF9oZHIgYnVmZmVyIG1heSBiZSBjaGFuZ2VkIGJ5IHRoaXMKKyAqIGZ1bmN0aW9uLiBSZXR1cm5zIHplcm8gaW4gY2FzZSBvZiBzdWNjZXNzLCAlVUJJX0lPX0JJVEZMSVBTIGlmIHRoZSBvcGVyYXRpb24KKyAqIHdhcyBjYW5jZWxlZCBiZWNhdXNlIGJpdC1mbGlwcyB3ZXJlIGRldGVjdGVkIGF0IHRoZSB0YXJnZXQgUEVCLCBhbmQgYQorICogbmVnYXRpdmUgZXJyb3IgY29kZSBpbiBjYXNlIG9mIGZhaWx1cmUuCisgKi8KK2ludCB1YmlfZWJhX2NvcHlfbGViKHN0cnVjdCB1YmlfZGV2aWNlICp1YmksIGludCBmcm9tLCBpbnQgdG8sCisJCSAgICAgc3RydWN0IHViaV92aWRfaGRyICp2aWRfaGRyKQoreworCWludCBlcnIsIHZvbF9pZCwgbG51bSwgZGF0YV9zaXplLCBhbGRhdGFfc2l6ZSwgcG51bSwgaWR4OworCXN0cnVjdCB1Ymlfdm9sdW1lICp2b2w7CisJdWludDMyX3QgY3JjOworCXZvaWQgKmJ1ZiwgKmJ1ZjEgPSBOVUxMOworCisJdm9sX2lkID0gdWJpMzJfdG9fY3B1KHZpZF9oZHItPnZvbF9pZCk7CisJbG51bSA9IHViaTMyX3RvX2NwdSh2aWRfaGRyLT5sbnVtKTsKKworCWRiZ19lYmEoImNvcHkgTEVCICVkOiVkLCBQRUIgJWQgdG8gUEVCICVkIiwgdm9sX2lkLCBsbnVtLCBmcm9tLCB0byk7CisKKwlpZiAodmlkX2hkci0+dm9sX3R5cGUgPT0gVUJJX1ZJRF9TVEFUSUMpIHsKKwkJZGF0YV9zaXplID0gdWJpMzJfdG9fY3B1KHZpZF9oZHItPmRhdGFfc2l6ZSk7CisJCWFsZGF0YV9zaXplID0gQUxJR04oZGF0YV9zaXplLCB1YmktPm1pbl9pb19zaXplKTsKKwl9IGVsc2UKKwkJZGF0YV9zaXplID0gYWxkYXRhX3NpemUgPQorCQkJICAgIHViaS0+bGViX3NpemUgLSB1YmkzMl90b19jcHUodmlkX2hkci0+ZGF0YV9wYWQpOworCisJYnVmID0ga21hbGxvYyhhbGRhdGFfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWYpCisJCXJldHVybiAtRU5PTUVNOworCisJLyoKKwkgKiBXZSBkbyBub3Qgd2FudCBhbnlib2R5IHRvIHdyaXRlIHRvIHRoaXMgbG9naWNhbCBlcmFzZWJsb2NrIHdoaWxlIHdlCisJICogYXJlIG1vdmluZyBpdCwgc28gd2UgbG9jayBpdC4KKwkgKi8KKwllcnIgPSBsZWJfd3JpdGVfbG9jayh1YmksIHZvbF9pZCwgbG51bSk7CisJaWYgKGVycikgeworCQlrZnJlZShidWYpOworCQlyZXR1cm4gZXJyOworCX0KKworCS8qCisJICogQnV0IHRoZSBsb2dpY2FsIGVyYXNlYmxvY2sgbWlnaHQgaGF2ZSBiZWVuIHB1dCBieSB0aGlzIHRpbWUuCisJICogQ2FuY2VsIGlmIGl0IGlzIHRydWUuCisJICovCisJaWR4ID0gdm9sX2lkMmlkeCh1YmksIHZvbF9pZCk7CisKKwkvKgorCSAqIFdlIG1heSByYWNlIHdpdGggdm9sdW1lIGRlbGV0aW9uL3JlLXNpemUsIHNvIHdlIGhhdmUgdG8gaG9sZAorCSAqIEB1YmktPnZvbHVtZXNfbG9jay4KKwkgKi8KKwlzcGluX2xvY2soJnViaS0+dm9sdW1lc19sb2NrKTsKKwl2b2wgPSB1YmktPnZvbHVtZXNbaWR4XTsKKwlpZiAoIXZvbCkgeworCQlkYmdfZWJhKCJ2b2x1bWUgJWQgd2FzIHJlbW92ZWQgbWVhbndoaWxlIiwgdm9sX2lkKTsKKwkJc3Bpbl91bmxvY2soJnViaS0+dm9sdW1lc19sb2NrKTsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCXBudW0gPSB2b2wtPmViYV90YmxbbG51bV07CisJaWYgKHBudW0gIT0gZnJvbSkgeworCQlkYmdfZWJhKCJMRUIgJWQ6JWQgaXMgbm8gbG9uZ2VyIG1hcHBlZCB0byBQRUIgJWQsIG1hcHBlZCB0byAiCisJCQkiUEVCICVkLCBjYW5jZWwiLCB2b2xfaWQsIGxudW0sIGZyb20sIHBudW0pOworCQlzcGluX3VubG9jaygmdWJpLT52b2x1bWVzX2xvY2spOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCXNwaW5fdW5sb2NrKCZ1YmktPnZvbHVtZXNfbG9jayk7CisKKwkvKiBPSywgbm93IHRoZSBMRUIgaXMgbG9ja2VkIGFuZCB3ZSBjYW4gc2FmZWx5IHN0YXJ0IG1vdmluZyBpdCAqLworCisJZGJnX2ViYSgicmVhZCAlZCBieXRlcyBvZiBkYXRhIiwgYWxkYXRhX3NpemUpOworCWVyciA9IHViaV9pb19yZWFkX2RhdGEodWJpLCBidWYsIGZyb20sIDAsIGFsZGF0YV9zaXplKTsKKwlpZiAoZXJyICYmIGVyciAhPSBVQklfSU9fQklURkxJUFMpIHsKKwkJdWJpX3dhcm4oImVycm9yICVkIHdoaWxlIHJlYWRpbmcgZGF0YSBmcm9tIFBFQiAlZCIsCisJCQkgZXJyLCBmcm9tKTsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCS8qCisJICogTm93IHdlIGhhdmUgZ290IHRvIGNhbGN1bGF0ZSBob3cgbXVjaCBkYXRhIHdlIGhhdmUgdG8gdG8gY29weS4gSW4KKwkgKiBjYXNlIG9mIGEgc3RhdGljIHZvbHVtZSBpdCBpcyBmYWlybHkgZWFzeSAtIHRoZSBWSUQgaGVhZGVyIGNvbnRhaW5zCisJICogdGhlIGRhdGEgc2l6ZS4gSW4gY2FzZSBvZiBhIGR5bmFtaWMgdm9sdW1lIGl0IGlzIG1vcmUgZGlmZmljdWx0IC0gd2UKKwkgKiBoYXZlIHRvIHJlYWQgdGhlIGNvbnRlbnRzLCBjdXQgMHhGRiBieXRlcyBmcm9tIHRoZSBlbmQgYW5kIGNvcHkgb25seQorCSAqIHRoZSBmaXJzdCBwYXJ0LiBXZSBtdXN0IGRvIHRoaXMgdG8gYXZvaWQgd3JpdGluZyAweEZGIGJ5dGVzIGFzIGl0CisJICogbWF5IGhhdmUgc29tZSBzaWRlLWVmZmVjdHMuIEFuZCBub3Qgb25seSB0aGlzLiBJdCBpcyBpbXBvcnRhbnQgbm90CisJICogdG8gaW5jbHVkZSB0aG9zZSAweEZGcyB0byBDUkMgYmVjYXVzZSBsYXRlciB0aGUgdGhleSBtYXkgYmUgZmlsbGVkCisJICogYnkgZGF0YS4KKwkgKi8KKwlpZiAodmlkX2hkci0+dm9sX3R5cGUgPT0gVUJJX1ZJRF9EWU5BTUlDKQorCQlhbGRhdGFfc2l6ZSA9IGRhdGFfc2l6ZSA9CisJCQkJdWJpX2NhbGNfZGF0YV9sZW4odWJpLCBidWYsIGRhdGFfc2l6ZSk7CisKKwljb25kX3Jlc2NoZWQoKTsKKwljcmMgPSBjcmMzMihVQklfQ1JDMzJfSU5JVCwgYnVmLCBkYXRhX3NpemUpOworCWNvbmRfcmVzY2hlZCgpOworCisJLyoKKwkgKiBJdCBtYXkgdHVybiBvdXQgdG8gbWUgdGhhdCB0aGUgd2hvbGUgQGZyb20gcGh5c2ljYWwgZXJhc2VibG9jaworCSAqIGNvbnRhaW5zIG9ubHkgMHhGRiBieXRlcy4gVGhlbiB3ZSBoYXZlIHRvIG9ubHkgd3JpdGUgdGhlIFZJRCBoZWFkZXIKKwkgKiBhbmQgZG8gbm90IHdyaXRlIGFueSBkYXRhLiBUaGlzIGFsc28gbWVhbnMgd2Ugc2hvdWxkIG5vdCBzZXQKKwkgKiBAdmlkX2hkci0+Y29weV9mbGFnLCBAdmlkX2hkci0+ZGF0YV9zaXplLCBhbmQgQHZpZF9oZHItPmRhdGFfY3JjLgorCSAqLworCWlmIChkYXRhX3NpemUgPiAwKSB7CisJCXZpZF9oZHItPmNvcHlfZmxhZyA9IDE7CisJCXZpZF9oZHItPmRhdGFfc2l6ZSA9IGNwdV90b191YmkzMihkYXRhX3NpemUpOworCQl2aWRfaGRyLT5kYXRhX2NyYyA9IGNwdV90b191YmkzMihjcmMpOworCX0KKwl2aWRfaGRyLT5zcW51bSA9IGNwdV90b191Ymk2NChuZXh0X3NxbnVtKHViaSkpOworCisJZXJyID0gdWJpX2lvX3dyaXRlX3ZpZF9oZHIodWJpLCB0bywgdmlkX2hkcik7CisJaWYgKGVycikKKwkJZ290byBvdXRfdW5sb2NrOworCisJY29uZF9yZXNjaGVkKCk7CisKKwkvKiBSZWFkIHRoZSBWSUQgaGVhZGVyIGJhY2sgYW5kIGNoZWNrIGlmIGl0IHdhcyB3cml0dGVuIGNvcnJlY3RseSAqLworCWVyciA9IHViaV9pb19yZWFkX3ZpZF9oZHIodWJpLCB0bywgdmlkX2hkciwgMSk7CisJaWYgKGVycikgeworCQlpZiAoZXJyICE9IFVCSV9JT19CSVRGTElQUykKKwkJCXViaV93YXJuKCJjYW5ub3QgcmVhZCBWSUQgaGVhZGVyIGJhY2sgZnJvbSBQRUIgJWQiLCB0byk7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwlpZiAoZGF0YV9zaXplID4gMCkgeworCQllcnIgPSB1YmlfaW9fd3JpdGVfZGF0YSh1YmksIGJ1ZiwgdG8sIDAsIGFsZGF0YV9zaXplKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0X3VubG9jazsKKworCQkvKgorCQkgKiBXZSd2ZSB3cml0dGVuIHRoZSBkYXRhIGFuZCBhcmUgZ29pbmcgdG8gcmVhZCBpdCBiYWNrIHRvIG1ha2UKKwkJICogc3VyZSBpdCB3YXMgd3JpdHRlbiBjb3JyZWN0bHkuCisJCSAqLworCQlidWYxID0ga21hbGxvYyhhbGRhdGFfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCWlmICghYnVmMSkgeworCQkJZXJyID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0X3VubG9jazsKKwkJfQorCisJCWNvbmRfcmVzY2hlZCgpOworCisJCWVyciA9IHViaV9pb19yZWFkX2RhdGEodWJpLCBidWYxLCB0bywgMCwgYWxkYXRhX3NpemUpOworCQlpZiAoZXJyKSB7CisJCQlpZiAoZXJyICE9IFVCSV9JT19CSVRGTElQUykKKwkJCQl1Ymlfd2FybigiY2Fubm90IHJlYWQgZGF0YSBiYWNrIGZyb20gUEVCICVkIiwKKwkJCQkJIHRvKTsKKwkJCWdvdG8gb3V0X3VubG9jazsKKwkJfQorCisJCWNvbmRfcmVzY2hlZCgpOworCisJCWlmIChtZW1jbXAoYnVmLCBidWYxLCBhbGRhdGFfc2l6ZSkpIHsKKwkJCXViaV93YXJuKCJyZWFkIGRhdGEgYmFjayBmcm9tIFBFQiAlZCAtIGl0IGlzIGRpZmZlcmVudCIsCisJCQkJIHRvKTsKKwkJCWdvdG8gb3V0X3VubG9jazsKKwkJfQorCX0KKworCXViaV9hc3NlcnQodm9sLT5lYmFfdGJsW2xudW1dID09IGZyb20pOworCXZvbC0+ZWJhX3RibFtsbnVtXSA9IHRvOworCisJbGViX3dyaXRlX3VubG9jayh1YmksIHZvbF9pZCwgbG51bSk7CisJa2ZyZWUoYnVmKTsKKwlrZnJlZShidWYxKTsKKworCXJldHVybiAwOworCitvdXRfdW5sb2NrOgorCWxlYl93cml0ZV91bmxvY2sodWJpLCB2b2xfaWQsIGxudW0pOworCWtmcmVlKGJ1Zik7CisJa2ZyZWUoYnVmMSk7CisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKiB1YmlfZWJhX2luaXRfc2NhbiAtIGluaXRpYWxpemUgdGhlIEVCQSB1bml0IHVzaW5nIHNjYW5uaW5nIGluZm9ybWF0aW9uLgorICogQHViaTogVUJJIGRldmljZSBkZXNjcmlwdGlvbiBvYmplY3QKKyAqIEBzaTogc2Nhbm5pbmcgaW5mb3JtYXRpb24KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgemVybyBpbiBjYXNlIG9mIHN1Y2Nlc3MgYW5kIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBpbgorICogY2FzZSBvZiBmYWlsdXJlLgorICovCitpbnQgdWJpX2ViYV9pbml0X3NjYW4oc3RydWN0IHViaV9kZXZpY2UgKnViaSwgc3RydWN0IHViaV9zY2FuX2luZm8gKnNpKQoreworCWludCBpLCBqLCBlcnIsIG51bV92b2x1bWVzOworCXN0cnVjdCB1Ymlfc2Nhbl92b2x1bWUgKnN2OworCXN0cnVjdCB1Ymlfdm9sdW1lICp2b2w7CisJc3RydWN0IHViaV9zY2FuX2xlYiAqc2ViOworCXN0cnVjdCByYl9ub2RlICpyYjsKKworCWRiZ19lYmEoImluaXRpYWxpemUgRUJBIHVuaXQiKTsKKworCXNwaW5fbG9ja19pbml0KCZ1YmktPmx0cmVlX2xvY2spOworCXViaS0+bHRyZWUgPSBSQl9ST09UOworCisJaWYgKHViaV9kZXZpY2VzX2NudCA9PSAwKSB7CisJCWx0cmVlX3NsYWIgPSBrbWVtX2NhY2hlX2NyZWF0ZSgidWJpX2x0cmVlX3NsYWIiLAorCQkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBsdHJlZV9lbnRyeSksIDAsCisJCQkJCSAgICAgICAwLCAmbHRyZWVfZW50cnlfY3RvciwgTlVMTCk7CisJCWlmICghbHRyZWVfc2xhYikKKwkJCXJldHVybiAtRU5PTUVNOworCX0KKworCXViaS0+Z2xvYmFsX3NxbnVtID0gc2ktPm1heF9zcW51bSArIDE7CisJbnVtX3ZvbHVtZXMgPSB1YmktPnZ0Ymxfc2xvdHMgKyBVQklfSU5UX1ZPTF9DT1VOVDsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fdm9sdW1lczsgaSsrKSB7CisJCXZvbCA9IHViaS0+dm9sdW1lc1tpXTsKKwkJaWYgKCF2b2wpCisJCQljb250aW51ZTsKKworCQljb25kX3Jlc2NoZWQoKTsKKworCQl2b2wtPmViYV90YmwgPSBrbWFsbG9jKHZvbC0+cmVzZXJ2ZWRfcGVicyAqIHNpemVvZihpbnQpLAorCQkJCSAgICAgICBHRlBfS0VSTkVMKTsKKwkJaWYgKCF2b2wtPmViYV90YmwpIHsKKwkJCWVyciA9IC1FTk9NRU07CisJCQlnb3RvIG91dF9mcmVlOworCQl9CisKKwkJZm9yIChqID0gMDsgaiA8IHZvbC0+cmVzZXJ2ZWRfcGViczsgaisrKQorCQkJdm9sLT5lYmFfdGJsW2pdID0gVUJJX0xFQl9VTk1BUFBFRDsKKworCQlzdiA9IHViaV9zY2FuX2ZpbmRfc3Yoc2ksIGlkeDJ2b2xfaWQodWJpLCBpKSk7CisJCWlmICghc3YpCisJCQljb250aW51ZTsKKworCQl1YmlfcmJfZm9yX2VhY2hfZW50cnkocmIsIHNlYiwgJnN2LT5yb290LCB1LnJiKSB7CisJCQlpZiAoc2ViLT5sbnVtID49IHZvbC0+cmVzZXJ2ZWRfcGVicykKKwkJCQkvKgorCQkJCSAqIFRoaXMgbWF5IGhhcHBlbiBpbiBjYXNlIG9mIGFuIHVuY2xlYW4gcmVib290CisJCQkJICogZHVyaW5nIHJlLXNpemUuCisJCQkJICovCisJCQkJdWJpX3NjYW5fbW92ZV90b19saXN0KHN2LCBzZWIsICZzaS0+ZXJhc2UpOworCQkJdm9sLT5lYmFfdGJsW3NlYi0+bG51bV0gPSBzZWItPnBudW07CisJCX0KKwl9CisKKwlpZiAodWJpLT5iYWRfYWxsb3dlZCkgeworCQl1YmlfY2FsY3VsYXRlX3Jlc2VydmVkKHViaSk7CisKKwkJaWYgKHViaS0+YXZhaWxfcGVicyA8IHViaS0+YmViX3JzdmRfbGV2ZWwpIHsKKwkJCS8qIE5vIGVub3VnaCBmcmVlIHBoeXNpY2FsIGVyYXNlYmxvY2tzICovCisJCQl1YmktPmJlYl9yc3ZkX3BlYnMgPSB1YmktPmF2YWlsX3BlYnM7CisJCQl1Ymlfd2FybigiY2Fubm90IHJlc2VydmUgZW5vdWdoIFBFQnMgZm9yIGJhZCBQRUIgIgorCQkJCSAiaGFuZGxpbmcsIHJlc2VydmVkICVkLCBuZWVkICVkIiwKKwkJCQkgdWJpLT5iZWJfcnN2ZF9wZWJzLCB1YmktPmJlYl9yc3ZkX2xldmVsKTsKKwkJfSBlbHNlCisJCQl1YmktPmJlYl9yc3ZkX3BlYnMgPSB1YmktPmJlYl9yc3ZkX2xldmVsOworCisJCXViaS0+YXZhaWxfcGVicyAtPSB1YmktPmJlYl9yc3ZkX3BlYnM7CisJCXViaS0+cnN2ZF9wZWJzICArPSB1YmktPmJlYl9yc3ZkX3BlYnM7CisJfQorCisJZGJnX2ViYSgiRUJBIHVuaXQgaXMgaW5pdGlhbGl6ZWQiKTsKKwlyZXR1cm4gMDsKKworb3V0X2ZyZWU6CisJZm9yIChpID0gMDsgaSA8IG51bV92b2x1bWVzOyBpKyspIHsKKwkJaWYgKCF1YmktPnZvbHVtZXNbaV0pCisJCQljb250aW51ZTsKKwkJa2ZyZWUodWJpLT52b2x1bWVzW2ldLT5lYmFfdGJsKTsKKwl9CisJaWYgKHViaV9kZXZpY2VzX2NudCA9PSAwKQorCQlrbWVtX2NhY2hlX2Rlc3Ryb3kobHRyZWVfc2xhYik7CisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKiB1YmlfZWJhX2Nsb3NlIC0gY2xvc2UgRUJBIHVuaXQuCisgKiBAdWJpOiBVQkkgZGV2aWNlIGRlc2NyaXB0aW9uIG9iamVjdAorICovCit2b2lkIHViaV9lYmFfY2xvc2UoY29uc3Qgc3RydWN0IHViaV9kZXZpY2UgKnViaSkKK3sKKwlpbnQgaSwgbnVtX3ZvbHVtZXMgPSB1YmktPnZ0Ymxfc2xvdHMgKyBVQklfSU5UX1ZPTF9DT1VOVDsKKworCWRiZ19lYmEoImNsb3NlIEVCQSB1bml0Iik7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3ZvbHVtZXM7IGkrKykgeworCQlpZiAoIXViaS0+dm9sdW1lc1tpXSkKKwkJCWNvbnRpbnVlOworCQlrZnJlZSh1YmktPnZvbHVtZXNbaV0tPmViYV90YmwpOworCX0KKwlpZiAodWJpX2RldmljZXNfY250ID09IDEpCisJCWttZW1fY2FjaGVfZGVzdHJveShsdHJlZV9zbGFiKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL3ViaS9nbHVlYmkuYyBiL2RyaXZlcnMvbXRkL3ViaS9nbHVlYmkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzk0NzhkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tdGQvdWJpL2dsdWViaS5jCkBAIC0wLDAgKzEsMzIzIEBACisvKgorICogQ29weXJpZ2h0IChjKSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuLCAyMDA2CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZQorICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqIEF1dGhvcjogQXJ0ZW0gQml0eXV0c2tpeSAo0JHQuNGC0Y7RhtC60LjQuSDQkNGA0YLRkdC8KSwgSm9lcm4gRW5nZWwKKyAqLworCisvKgorICogVGhpcyBmaWxlIGluY2x1ZGVzIGltcGxlbWVudGF0aW9uIG9mIGZha2UgTVREIGRldmljZXMgZm9yIGVhY2ggVUJJIHZvbHVtZS4KKyAqIFRoaXMgc291bmRzIHN0cmFuZ2UsIGJ1dCBpdCBpcyBpbiBmYWN0IHF1aXRlIHVzZWZ1bCB0byBtYWtlIE1URC1vcmllbnRlZAorICogc29mdHdhcmUgKGluY2x1ZGluZyBhbGwgdGhlIGxlZ2FjeSBzb2Z0d2FyZSkgdG8gd29yayBvbiB0b3Agb2YgVUJJLgorICoKKyAqIEdsdWViaSBlbXVsYXRlcyBNVEQgZGV2aWNlcyBvZiAiTVREX1VCSVZPTFVNRSIgdHlwZS4gVGhlaXIgbWluaW1hbCBJL08gdW5pdAorICogc2l6ZSAobXRkLT53cml0ZXNpemUpIGlzIGVxdWl2YWxlbnQgdG8gdGhlIFVCSSBtaW5pbWFsIEkvTyB1bml0LiBUaGUKKyAqIGVyYXNlYmxvY2sgc2l6ZSBpcyBlcXVpdmFsZW50IHRvIHRoZSBsb2dpY2FsIGVyYXNlYmxvY2sgc2l6ZSBvZiB0aGUgdm9sdW1lLgorICovCisKKyNpbmNsdWRlIDxhc20vZGl2NjQuaD4KKyNpbmNsdWRlICJ1YmkuaCIKKworLyoqCisgKiBnbHVlYmlfZ2V0X2RldmljZSAtIGdldCBNVEQgZGV2aWNlIHJlZmVyZW5jZS4KKyAqIEBtdGQ6IHRoZSBNVEQgZGV2aWNlIGRlc2NyaXB0aW9uIG9iamVjdAorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGV2ZXJ5IHRpbWUgdGhlIE1URCBkZXZpY2UgaXMgYmVpbmcgb3BlbmVkIGFuZAorICogaW1wbGVtZW50cyB0aGUgTVREIGdldF9kZXZpY2UoKSBvcGVyYXRpb24uIFJldHVybnMgemVybyBpbiBjYXNlIG9mIHN1Y2Nlc3MKKyAqIGFuZCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgaW4gY2FzZSBvZiBmYWlsdXJlLgorICovCitzdGF0aWMgaW50IGdsdWViaV9nZXRfZGV2aWNlKHN0cnVjdCBtdGRfaW5mbyAqbXRkKQoreworCXN0cnVjdCB1Ymlfdm9sdW1lICp2b2w7CisKKwl2b2wgPSBjb250YWluZXJfb2YobXRkLCBzdHJ1Y3QgdWJpX3ZvbHVtZSwgZ2x1ZWJpX210ZCk7CisKKwkvKgorCSAqIFdlIGRvIG5vdCBpbnRyb2R1Y2UgbG9ja3MgZm9yIGdsdWViaSByZWZlcmVuY2UgY291bnQgYmVjYXVzZSB0aGUKKwkgKiBnZXRfZGV2aWNlKCkvcHV0X2RldmljZSgpIGNhbGxzIGFyZSBhbHJlYWR5IHNlcmlhbGl6ZWQgYXQgTVRELgorCSAqLworCWlmICh2b2wtPmdsdWViaV9yZWZjb3VudCA+IDApIHsKKwkJLyoKKwkJICogVGhlIE1URCBkZXZpY2UgaXMgYWxyZWFkeSByZWZlcmVuY2VkIGFuZCB0aGlzIGlzIGp1c3Qgb25lCisJCSAqIG1vcmUgcmVmZXJlbmNlLiBNVEQgYWxsb3dzIG1hbnkgdXNlcnMgdG8gb3BlbiB0aGUgc2FtZQorCQkgKiB2b2x1bWUgc2ltdWx0YW5lb3VzbHkgYW5kIGRvIG5vdCBkaXN0aW5ndWlzaCBiZXR3ZWVuCisJCSAqIHJlYWRlcnMvd3JpdGVycy9leGNsdXNpdmUgb3BlbmVycyBhcyBVQkkgZG9lcy4gU28gd2UgZG8gbm90CisJCSAqIG9wZW4gdGhlIFVCSSB2b2x1bWUgYWdhaW4gLSBqdXN0IGluY3JlYXNlIHRoZSByZWZlcmVuY2UKKwkJICogY291bnRlciBhbmQgcmV0dXJuLgorCQkgKi8KKwkJdm9sLT5nbHVlYmlfcmVmY291bnQgKz0gMTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBUaGlzIGlzIHRoZSBmaXJzdCByZWZlcmVuY2UgdG8gdGhpcyBVQkkgdm9sdW1lIHZpYSB0aGUgTVREIGRldmljZQorCSAqIGludGVyZmFjZS4gT3BlbiB0aGUgY29ycmVzcG9uZGluZyB2b2x1bWUgaW4gcmVhZC13cml0ZSBtb2RlLgorCSAqLworCXZvbC0+Z2x1ZWJpX2Rlc2MgPSB1Ymlfb3Blbl92b2x1bWUodm9sLT51YmktPnViaV9udW0sIHZvbC0+dm9sX2lkLAorCQkJCQkgICBVQklfUkVBRFdSSVRFKTsKKwlpZiAoSVNfRVJSKHZvbC0+Z2x1ZWJpX2Rlc2MpKQorCQlyZXR1cm4gUFRSX0VSUih2b2wtPmdsdWViaV9kZXNjKTsKKwl2b2wtPmdsdWViaV9yZWZjb3VudCArPSAxOworCXJldHVybiAwOworfQorCisvKioKKyAqIGdsdWViaV9wdXRfZGV2aWNlIC0gcHV0IE1URCBkZXZpY2UgcmVmZXJlbmNlLgorICogQG10ZDogdGhlIE1URCBkZXZpY2UgZGVzY3JpcHRpb24gb2JqZWN0CisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZXZlcnkgdGltZSB0aGUgTVREIGRldmljZSBpcyBiZWluZyBwdXQuIFJldHVybnMKKyAqIHplcm8gaW4gY2FzZSBvZiBzdWNjZXNzIGFuZCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgaW4gY2FzZSBvZiBmYWlsdXJlLgorICovCitzdGF0aWMgdm9pZCBnbHVlYmlfcHV0X2RldmljZShzdHJ1Y3QgbXRkX2luZm8gKm10ZCkKK3sKKwlzdHJ1Y3QgdWJpX3ZvbHVtZSAqdm9sOworCisJdm9sID0gY29udGFpbmVyX29mKG10ZCwgc3RydWN0IHViaV92b2x1bWUsIGdsdWViaV9tdGQpOworCXZvbC0+Z2x1ZWJpX3JlZmNvdW50IC09IDE7CisJdWJpX2Fzc2VydCh2b2wtPmdsdWViaV9yZWZjb3VudCA+PSAwKTsKKwlpZiAodm9sLT5nbHVlYmlfcmVmY291bnQgPT0gMCkKKwkJdWJpX2Nsb3NlX3ZvbHVtZSh2b2wtPmdsdWViaV9kZXNjKTsKK30KKworLyoqCisgKiBnbHVlYmlfcmVhZCAtIHJlYWQgb3BlcmF0aW9uIG9mIGVtdWxhdGVkIE1URCBkZXZpY2VzLgorICogQG10ZDogTVREIGRldmljZSBkZXNjcmlwdGlvbiBvYmplY3QKKyAqIEBmcm9tOiBhYnNvbHV0ZSBvZmZzZXQgZnJvbSB3aGVyZSB0byByZWFkCisgKiBAbGVuOiBob3cgbWFueSBieXRlcyB0byByZWFkCisgKiBAcmV0bGVuOiBjb3VudCBvZiByZWFkIGJ5dGVzIGlzIHJldHVybmVkIGhlcmUKKyAqIEBidWY6IGJ1ZmZlciB0byBzdG9yZSB0aGUgcmVhZCBkYXRhCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHplcm8gaW4gY2FzZSBvZiBzdWNjZXNzIGFuZCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgaW4KKyAqIGNhc2Ugb2YgZmFpbHVyZS4KKyAqLworc3RhdGljIGludCBnbHVlYmlfcmVhZChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IGZyb20sIHNpemVfdCBsZW4sCisJCSAgICAgICBzaXplX3QgKnJldGxlbiwgdW5zaWduZWQgY2hhciAqYnVmKQoreworCWludCBlcnIgPSAwLCBsbnVtLCBvZmZzLCB0b3RhbF9yZWFkOworCXN0cnVjdCB1Ymlfdm9sdW1lICp2b2w7CisJc3RydWN0IHViaV9kZXZpY2UgKnViaTsKKwl1aW50NjRfdCB0bXAgPSBmcm9tOworCisJZGJnX21zZygicmVhZCAlemQgYnl0ZXMgZnJvbSBvZmZzZXQgJWxsZCIsIGxlbiwgZnJvbSk7CisKKwlpZiAobGVuIDwgMCB8fCBmcm9tIDwgMCB8fCBmcm9tICsgbGVuID4gbXRkLT5zaXplKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXZvbCA9IGNvbnRhaW5lcl9vZihtdGQsIHN0cnVjdCB1Ymlfdm9sdW1lLCBnbHVlYmlfbXRkKTsKKwl1YmkgPSB2b2wtPnViaTsKKworCW9mZnMgPSBkb19kaXYodG1wLCBtdGQtPmVyYXNlc2l6ZSk7CisJbG51bSA9IHRtcDsKKworCXRvdGFsX3JlYWQgPSBsZW47CisJd2hpbGUgKHRvdGFsX3JlYWQpIHsKKwkJc2l6ZV90IHRvX3JlYWQgPSBtdGQtPmVyYXNlc2l6ZSAtIG9mZnM7CisKKwkJaWYgKHRvX3JlYWQgPiB0b3RhbF9yZWFkKQorCQkJdG9fcmVhZCA9IHRvdGFsX3JlYWQ7CisKKwkJZXJyID0gdWJpX2ViYV9yZWFkX2xlYih1YmksIHZvbC0+dm9sX2lkLCBsbnVtLCBidWYsIG9mZnMsCisJCQkJICAgICAgIHRvX3JlYWQsIDApOworCQlpZiAoZXJyKQorCQkJYnJlYWs7CisKKwkJbG51bSArPSAxOworCQlvZmZzID0gMDsKKwkJdG90YWxfcmVhZCAtPSB0b19yZWFkOworCQlidWYgKz0gdG9fcmVhZDsKKwl9CisKKwkqcmV0bGVuID0gbGVuIC0gdG90YWxfcmVhZDsKKwlyZXR1cm4gZXJyOworfQorCisvKioKKyAqIGdsdWViaV93cml0ZSAtIHdyaXRlIG9wZXJhdGlvbiBvZiBlbXVsYXRlZCBNVEQgZGV2aWNlcy4KKyAqIEBtdGQ6IE1URCBkZXZpY2UgZGVzY3JpcHRpb24gb2JqZWN0CisgKiBAdG86IGFic29sdXRlIG9mZnNldCB3aGVyZSB0byB3cml0ZQorICogQGxlbjogaG93IG1hbnkgYnl0ZXMgdG8gd3JpdGUKKyAqIEByZXRsZW46IGNvdW50IG9mIHdyaXR0ZW4gYnl0ZXMgaXMgcmV0dXJuZWQgaGVyZQorICogQGJ1ZjogYnVmZmVyIHdpdGggZGF0YSB0byB3cml0ZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB6ZXJvIGluIGNhc2Ugb2Ygc3VjY2VzcyBhbmQgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIGluCisgKiBjYXNlIG9mIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQgZ2x1ZWJpX3dyaXRlKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3QgdG8sIHNpemVfdCBsZW4sCisJCSAgICAgICBzaXplX3QgKnJldGxlbiwgY29uc3QgdV9jaGFyICpidWYpCit7CisJaW50IGVyciA9IDAsIGxudW0sIG9mZnMsIHRvdGFsX3dyaXR0ZW47CisJc3RydWN0IHViaV92b2x1bWUgKnZvbDsKKwlzdHJ1Y3QgdWJpX2RldmljZSAqdWJpOworCXVpbnQ2NF90IHRtcCA9IHRvOworCisJZGJnX21zZygid3JpdGUgJXpkIGJ5dGVzIHRvIG9mZnNldCAlbGxkIiwgbGVuLCB0byk7CisKKwlpZiAobGVuIDwgMCB8fCB0byA8IDAgfHwgbGVuICsgdG8gPiBtdGQtPnNpemUpCisJCXJldHVybiAtRUlOVkFMOworCisJdm9sID0gY29udGFpbmVyX29mKG10ZCwgc3RydWN0IHViaV92b2x1bWUsIGdsdWViaV9tdGQpOworCXViaSA9IHZvbC0+dWJpOworCisJaWYgKHViaS0+cm9fbW9kZSkKKwkJcmV0dXJuIC1FUk9GUzsKKworCW9mZnMgPSBkb19kaXYodG1wLCBtdGQtPmVyYXNlc2l6ZSk7CisJbG51bSA9IHRtcDsKKworCWlmIChsZW4gJSBtdGQtPndyaXRlc2l6ZSB8fCBvZmZzICUgbXRkLT53cml0ZXNpemUpCisJCXJldHVybiAtRUlOVkFMOworCisJdG90YWxfd3JpdHRlbiA9IGxlbjsKKwl3aGlsZSAodG90YWxfd3JpdHRlbikgeworCQlzaXplX3QgdG9fd3JpdGUgPSBtdGQtPmVyYXNlc2l6ZSAtIG9mZnM7CisKKwkJaWYgKHRvX3dyaXRlID4gdG90YWxfd3JpdHRlbikKKwkJCXRvX3dyaXRlID0gdG90YWxfd3JpdHRlbjsKKworCQllcnIgPSB1YmlfZWJhX3dyaXRlX2xlYih1YmksIHZvbC0+dm9sX2lkLCBsbnVtLCBidWYsIG9mZnMsCisJCQkJCXRvX3dyaXRlLCBVQklfVU5LTk9XTik7CisJCWlmIChlcnIpCisJCQlicmVhazsKKworCQlsbnVtICs9IDE7CisJCW9mZnMgPSAwOworCQl0b3RhbF93cml0dGVuIC09IHRvX3dyaXRlOworCQlidWYgKz0gdG9fd3JpdGU7CisJfQorCisJKnJldGxlbiA9IGxlbiAtIHRvdGFsX3dyaXR0ZW47CisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKiBnbHVlYmlfZXJhc2UgLSBlcmFzZSBvcGVyYXRpb24gb2YgZW11bGF0ZWQgTVREIGRldmljZXMuCisgKiBAbXRkOiB0aGUgTVREIGRldmljZSBkZXNjcmlwdGlvbiBvYmplY3QKKyAqIEBpbnN0cjogdGhlIGVyYXNlIG9wZXJhdGlvbiBkZXNjcmlwdGlvbgorICoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsbHMgdGhlIGVyYXNlIGNhbGxiYWNrIHdoZW4gZmluaXNoZXMuIFJldHVybnMgemVybyBpbiBjYXNlCisgKiBvZiBzdWNjZXNzIGFuZCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgaW4gY2FzZSBvZiBmYWlsdXJlLgorICovCitzdGF0aWMgaW50IGdsdWViaV9lcmFzZShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgc3RydWN0IGVyYXNlX2luZm8gKmluc3RyKQoreworCWludCBlcnIsIGksIGxudW0sIGNvdW50OworCXN0cnVjdCB1Ymlfdm9sdW1lICp2b2w7CisJc3RydWN0IHViaV9kZXZpY2UgKnViaTsKKworCWRiZ19tc2coImVyYXNlICV1IGJ5dGVzIGF0IG9mZnNldCAldSIsIGluc3RyLT5sZW4sIGluc3RyLT5hZGRyKTsKKworCWlmIChpbnN0ci0+YWRkciA8IDAgfHwgaW5zdHItPmFkZHIgPiBtdGQtPnNpemUgLSBtdGQtPmVyYXNlc2l6ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoaW5zdHItPmxlbiA8IDAgfHwgaW5zdHItPmFkZHIgKyBpbnN0ci0+bGVuID4gbXRkLT5zaXplKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChpbnN0ci0+YWRkciAlIG10ZC0+d3JpdGVzaXplIHx8IGluc3RyLT5sZW4gJSBtdGQtPndyaXRlc2l6ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlsbnVtID0gaW5zdHItPmFkZHIgLyBtdGQtPmVyYXNlc2l6ZTsKKwljb3VudCA9IGluc3RyLT5sZW4gLyBtdGQtPmVyYXNlc2l6ZTsKKworCXZvbCA9IGNvbnRhaW5lcl9vZihtdGQsIHN0cnVjdCB1Ymlfdm9sdW1lLCBnbHVlYmlfbXRkKTsKKwl1YmkgPSB2b2wtPnViaTsKKworCWlmICh1YmktPnJvX21vZGUpCisJCXJldHVybiAtRVJPRlM7CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQllcnIgPSB1YmlfZWJhX3VubWFwX2xlYih1YmksIHZvbC0+dm9sX2lkLCBsbnVtICsgaSk7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dF9lcnI7CisJfQorCisJLyoKKwkgKiBNVEQgZXJhc2Ugb3BlcmF0aW9ucyBhcmUgc3luY2hyb25vdXMsIHNvIHdlIGhhdmUgdG8gbWFrZSBzdXJlIHRoZQorCSAqIHBoeXNpY2FsIGVyYXNlYmxvY2sgaXMgd2lwZWQgb3V0LgorCSAqLworCWVyciA9IHViaV93bF9mbHVzaCh1YmkpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X2VycjsKKworICAgICAgICBpbnN0ci0+c3RhdGUgPSBNVERfRVJBU0VfRE9ORTsKKyAgICAgICAgbXRkX2VyYXNlX2NhbGxiYWNrKGluc3RyKTsKKwlyZXR1cm4gMDsKKworb3V0X2VycjoKKwlpbnN0ci0+c3RhdGUgPSBNVERfRVJBU0VfRkFJTEVEOworCWluc3RyLT5mYWlsX2FkZHIgPSBsbnVtICogbXRkLT5lcmFzZXNpemU7CisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKiB1YmlfY3JlYXRlX2dsdWViaSAtIGluaXRpYWxpemUgZ2x1ZWJpIGZvciBhbiBVQkkgdm9sdW1lLgorICogQHViaTogVUJJIGRldmljZSBkZXNjcmlwdGlvbiBvYmplY3QKKyAqIEB2b2w6IHZvbHVtZSBkZXNjcmlwdGlvbiBvYmplY3QKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGFuIFVCSSB2b2x1bWUgaXMgY3JlYXRlZCBpbiBvcmRlciB0byBjcmVhdGUKKyAqIGNvcnJlc3BvbmRpbmcgZmFrZSBNVEQgZGV2aWNlLiBSZXR1cm5zIHplcm8gaW4gY2FzZSBvZiBzdWNjZXNzIGFuZCBhCisgKiBuZWdhdGl2ZSBlcnJvciBjb2RlIGluIGNhc2Ugb2YgZmFpbHVyZS4KKyAqLworaW50IHViaV9jcmVhdGVfZ2x1ZWJpKHN0cnVjdCB1YmlfZGV2aWNlICp1YmksIHN0cnVjdCB1Ymlfdm9sdW1lICp2b2wpCit7CisJc3RydWN0IG10ZF9pbmZvICptdGQgPSAmdm9sLT5nbHVlYmlfbXRkOworCisJbXRkLT5uYW1lID0ga21lbWR1cCh2b2wtPm5hbWUsIHZvbC0+bmFtZV9sZW4gKyAxLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW10ZC0+bmFtZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltdGQtPnR5cGUgPSBNVERfVUJJVk9MVU1FOworCWlmICghdWJpLT5yb19tb2RlKQorCQltdGQtPmZsYWdzID0gTVREX1dSSVRFQUJMRTsKKwltdGQtPndyaXRlc2l6ZSAgPSB1YmktPm1pbl9pb19zaXplOworCW10ZC0+b3duZXIgICAgICA9IFRISVNfTU9EVUxFOworCW10ZC0+c2l6ZSAgICAgICA9IHZvbC0+dXNhYmxlX2xlYl9zaXplICogdm9sLT5yZXNlcnZlZF9wZWJzOworCW10ZC0+ZXJhc2VzaXplICA9IHZvbC0+dXNhYmxlX2xlYl9zaXplOworCW10ZC0+cmVhZCAgICAgICA9IGdsdWViaV9yZWFkOworCW10ZC0+d3JpdGUgICAgICA9IGdsdWViaV93cml0ZTsKKwltdGQtPmVyYXNlICAgICAgPSBnbHVlYmlfZXJhc2U7CisJbXRkLT5nZXRfZGV2aWNlID0gZ2x1ZWJpX2dldF9kZXZpY2U7CisJbXRkLT5wdXRfZGV2aWNlID0gZ2x1ZWJpX3B1dF9kZXZpY2U7CisKKwlpZiAoYWRkX210ZF9kZXZpY2UobXRkKSkgeworCQl1YmlfZXJyKCJjYW5ub3Qgbm90IGFkZCBNVEQgZGV2aWNlXG4iKTsKKwkJa2ZyZWUobXRkLT5uYW1lKTsKKwkJcmV0dXJuIC1FTkZJTEU7CisJfQorCisJZGJnX21zZygiYWRkZWQgbXRkJWQgKFwiJXNcIiksIHNpemUgJXUsIEVCIHNpemUgJXUiLAorCQltdGQtPmluZGV4LCBtdGQtPm5hbWUsIG10ZC0+c2l6ZSwgbXRkLT5lcmFzZXNpemUpOworCXJldHVybiAwOworfQorCisvKioKKyAqIHViaV9kZXN0cm95X2dsdWViaSAtIGNsb3NlIGdsdWViaSBmb3IgYW4gVUJJIHZvbHVtZS4KKyAqIEB2b2w6IHZvbHVtZSBkZXNjcmlwdGlvbiBvYmplY3QKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGFuIFVCSSB2b2x1bWUgaXMgcmVtb3ZlZCBpbiBvcmRlciB0byByZW1vdmUKKyAqIGNvcnJlc3BvbmRpbmcgZmFrZSBNVEQgZGV2aWNlLiBSZXR1cm5zIHplcm8gaW4gY2FzZSBvZiBzdWNjZXNzIGFuZCBhCisgKiBuZWdhdGl2ZSBlcnJvciBjb2RlIGluIGNhc2Ugb2YgZmFpbHVyZS4KKyAqLworaW50IHViaV9kZXN0cm95X2dsdWViaShzdHJ1Y3QgdWJpX3ZvbHVtZSAqdm9sKQoreworCWludCBlcnI7CisJc3RydWN0IG10ZF9pbmZvICptdGQgPSAmdm9sLT5nbHVlYmlfbXRkOworCisJZGJnX21zZygicmVtb3ZlIG10ZCVkIiwgbXRkLT5pbmRleCk7CisJZXJyID0gZGVsX210ZF9kZXZpY2UobXRkKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCWtmcmVlKG10ZC0+bmFtZSk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC91YmkvaW8uYyBiL2RyaXZlcnMvbXRkL3ViaS9pby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzODkxNGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL210ZC91YmkvaW8uYwpAQCAtMCwwICsxLDEyNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4sIDIwMDYKKyAqIENvcHlyaWdodCAoYykgTm9raWEgQ29ycG9yYXRpb24sIDIwMDYsIDIwMDcKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlCisgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICogQXV0aG9yOiBBcnRlbSBCaXR5dXRza2l5ICjQkdC40YLRjtGG0LrQuNC5INCQ0YDRgtGR0LwpCisgKi8KKworLyoKKyAqIFVCSSBpbnB1dC9vdXRwdXQgdW5pdC4KKyAqCisgKiBUaGlzIHVuaXQgcHJvdmlkZXMgYSB1bmlmb3JtIHdheSB0byB3b3JrIHdpdGggYWxsIGtpbmRzIG9mIHRoZSB1bmRlcmx5aW5nCisgKiBNVEQgZGV2aWNlcy4gSXQgYWxzbyBpbXBsZW1lbnRzIGhhbmR5IGZ1bmN0aW9ucyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZyBVQkkKKyAqIGhlYWRlcnMuCisgKgorICogV2UgYXJlIHRyeWluZyB0byBoYXZlIGEgcGFyYW5vaWQgbWluZHNldCBhbmQgbm90IHRvIHRydXN0IHRvIHdoYXQgd2UgcmVhZAorICogZnJvbSB0aGUgZmxhc2ggbWVkaWEgaW4gb3JkZXIgdG8gYmUgbW9yZSBzZWN1cmUgYW5kIHJvYnVzdC4gU28gdGhpcyB1bml0CisgKiB2YWxpZGF0ZXMgZXZlcnkgc2luZ2xlIGhlYWRlciBpdCByZWFkcyBmcm9tIHRoZSBmbGFzaCBtZWRpYS4KKyAqCisgKiBTb21lIHdvcmRzIGFib3V0IGhvdyB0aGUgZXJhc2VibG9jayBoZWFkZXJzIGFyZSBzdG9yZWQuCisgKgorICogVGhlIGVyYXNlIGNvdW50ZXIgaGVhZGVyIGlzIGFsd2F5cyBzdG9yZWQgYXQgb2Zmc2V0IHplcm8uIEJ5IGRlZmF1bHQsIHRoZQorICogVklEIGhlYWRlciBpcyBzdG9yZWQgYWZ0ZXIgdGhlIEVDIGhlYWRlciBhdCB0aGUgY2xvc2VzdCBhbGlnbmVkIG9mZnNldAorICogKGkuZS4gYWxpZ25lZCB0byB0aGUgbWluaW11bSBJL08gdW5pdCBzaXplKS4gRGF0YSBzdGFydHMgbmV4dCB0byB0aGUgVklECisgKiBoZWFkZXIgYXQgdGhlIGNsb3Nlc3QgYWxpZ25lZCBvZmZzZXQuIEJ1dCB0aGlzIGRlZmF1bHQgbGF5b3V0IG1heSBiZQorICogY2hhbmdlZC4gRm9yIGV4YW1wbGUsIGZvciBkaWZmZXJlbnQgcmVhc29ucyAoZS5nLiwgb3B0aW1pemF0aW9uKSBVQkkgbWF5IGJlCisgKiBhc2tlZCB0byBwdXQgdGhlIFZJRCBoZWFkZXIgYXQgZnVydGhlciBvZmZzZXQsIGFuZCBldmVuIGF0IGFuIHVuYWxpZ25lZAorICogb2Zmc2V0LiBPZiBjb3Vyc2UsIGlmIHRoZSBvZmZzZXQgb2YgdGhlIFZJRCBoZWFkZXIgaXMgdW5hbGlnbmVkLCBVQkkgYWRkcworICogcHJvcGVyIHBhZGRpbmcgaW4gZnJvbnQgb2YgaXQuIERhdGEgb2Zmc2V0IG1heSBhbHNvIGJlIGNoYW5nZWQgYnV0IGl0IGhhcyB0bworICogYmUgYWxpZ25lZC4KKyAqCisgKiBBYm91dCBtaW5pbWFsIEkvTyB1bml0cy4gSW4gZ2VuZXJhbCwgVUJJIGFzc3VtZXMgZmxhc2ggZGV2aWNlIG1vZGVsIHdoZXJlCisgKiB0aGVyZSBpcyBvbmx5IG9uZSBtaW5pbWFsIEkvTyB1bml0IHNpemUuIEUuZy4sIGluIGNhc2Ugb2YgTk9SIGZsYXNoIGl0IGlzIDEsCisgKiBpbiBjYXNlIG9mIE5BTkQgZmxhc2ggaXQgaXMgYSBOQU5EIHBhZ2UsIGV0Yy4gVGhpcyBpcyByZXBvcnRlZCBieSBNVEQgaW4gdGhlCisgKiBAdWJpLT5tdGQtPndyaXRlc2l6ZSBmaWVsZC4gQnV0IGFzIGFuIGV4Y2VwdGlvbiwgVUJJIGFkbWl0cyBvZiB1c2luZyBhbm90aGVyCisgKiAoc21hbGxlcikgbWluaW1hbCBJL08gdW5pdCBzaXplIGZvciBFQyBhbmQgVklEIGhlYWRlcnMgdG8gbWFrZSBpdCBwb3NzaWJsZQorICogdG8gZG8gZGlmZmVyZW50IG9wdGltaXphdGlvbnMuCisgKgorICogVGhpcyBpcyBleHRyZW1lbHkgdXNlZnVsIGluIGNhc2Ugb2YgTkFORCBmbGFzaGVzIHdoaWNoIGFkbWl0IG9mIHNldmVyYWwKKyAqIHdyaXRlIG9wZXJhdGlvbnMgdG8gb25lIE5BTkQgcGFnZS4gSW4gdGhpcyBjYXNlIFVCSSBjYW4gZml0IEVDIGFuZCBWSUQKKyAqIGhlYWRlcnMgYXQgb25lIE5BTkQgcGFnZS4gVGh1cywgVUJJIG1heSB1c2UgInN1Yi1wYWdlIiBzaXplIGFzIHRoZSBtaW5pbWFsCisgKiBJL08gdW5pdCBmb3IgdGhlIGhlYWRlcnMgKHRoZSBAdWJpLT5oZHJzX21pbl9pb19zaXplIGZpZWxkKS4gQnV0IGl0IHN0aWxsCisgKiByZXBvcnRzIE5BTkQgcGFnZSBzaXplIChAdWJpLT5taW5faW9fc2l6ZSkgYXMgYSBtaW5pbWFsIEkvTyB1bml0IGZvciB0aGUgVUJJCisgKiB1c2Vycy4KKyAqCisgKiBFeGFtcGxlOiBzb21lIFNhbXN1bmcgTkFORHMgd2l0aCAyS2lCIHBhZ2VzIGFsbG93IDR4IDUxMi1ieXRlIHdyaXRlcywgc28KKyAqIGFsdGhvdWdoIHRoZSBtaW5pbWFsIEkvTyB1bml0IGlzIDJLLCBVQkkgdXNlcyA1MTIgYnl0ZXMgZm9yIEVDIGFuZCBWSUQKKyAqIGhlYWRlcnMuCisgKgorICogUTogd2h5IG5vdCBqdXN0IHRvIHRyZWF0IHN1Yi1wYWdlIGFzIGEgbWluaW1hbCBJL08gdW5pdCBvZiB0aGlzIGZsYXNoCisgKiBkZXZpY2UsIGUuZy4sIG1ha2UgQHViaS0+bWluX2lvX3NpemUgPSA1MTIgaW4gdGhlIGV4YW1wbGUgYWJvdmU/CisgKgorICogQTogYmVjYXVzZSB3aGVuIHdyaXRpbmcgYSBzdWItcGFnZSwgTVREIHN0aWxsIHdyaXRlcyBhIGZ1bGwgMksgcGFnZSBidXQgdGhlCisgKiBieXRlcyB3aGljaCBhcmUgbm8gcmVsZXZhbnQgdG8gdGhlIHN1Yi1wYWdlIGFyZSAweEZGLiBTbywgYmFzaWNhbGx5LCB3cml0aW5nCisgKiA0eDUxMiBzdWItcGFnZXMgaXMgNCB0aW1lcyBzbG93ZXIgdGhlbiB3cml0aW5nIG9uZSAyS2lCIE5BTkQgcGFnZS4gVGh1cywgd2UKKyAqIHByZWZlciB0byB1c2Ugc3ViLXBhZ2VzIG9ubHkgZm9yIEVWIGFuZCBWSUQgaGVhZGVycy4KKyAqCisgKiBBcyBpdCB3YXMgbm90ZWQgYWJvdmUsIHRoZSBWSUQgaGVhZGVyIG1heSBzdGFydCBhdCBhIG5vbi1hbGlnbmVkIG9mZnNldC4KKyAqIEZvciBleGFtcGxlLCBpbiBjYXNlIG9mIGEgMktpQiBwYWdlIE5BTkQgZmxhc2ggd2l0aCBhIDUxMiBieXRlcyBzdWItcGFnZSwKKyAqIHRoZSBWSUQgaGVhZGVyIG1heSByZXNpZGUgYXQgb2Zmc2V0IDE5ODQgd2hpY2ggaXMgdGhlIGxhc3QgNjQgYnl0ZXMgb2YgdGhlCisgKiBsYXN0IHN1Yi1wYWdlIChFQyBoZWFkZXIgaXMgYWx3YXlzIGF0IG9mZnNldCB6ZXJvKS4gVGhpcyBjYXVzZXMgc29tZQorICogZGlmZmljdWx0aWVzIHdoZW4gcmVhZGluZyBhbmQgd3JpdGluZyBWSUQgaGVhZGVycy4KKyAqCisgKiBTdXBwb3NlIHdlIGhhdmUgYSA2NC1ieXRlIGJ1ZmZlciBhbmQgd2UgcmVhZCBhIFZJRCBoZWFkZXIgYXQgaXQuIFdlIGNoYW5nZQorICogdGhlIGRhdGEgYW5kIHdhbnQgdG8gd3JpdGUgdGhpcyBWSUQgaGVhZGVyIG91dC4gQXMgd2UgY2FuIG9ubHkgd3JpdGUgaW4KKyAqIDUxMi1ieXRlIGNodW5rcywgd2UgaGF2ZSB0byBhbGxvY2F0ZSBvbmUgbW9yZSBidWZmZXIgYW5kIGNvcHkgb3VyIFZJRCBoZWFkZXIKKyAqIHRvIG9mZnNldCA0NDggb2YgdGhpcyBidWZmZXIuCisgKgorICogVGhlIEkvTyB1bml0IGRvZXMgdGhlIGZvbGxvd2luZyB0cmljayBpbiBvcmRlciB0byBhdm9pZCB0aGlzIGV4dHJhIGNvcHkuCisgKiBJdCBhbHdheXMgYWxsb2NhdGVzIGEgQHViaS0+dmlkX2hkcl9hbHNpemUgYnl0ZXMgYnVmZmVyIGZvciB0aGUgVklEIGhlYWRlcgorICogYW5kIHJldHVybnMgYSBwb2ludGVyIHRvIG9mZnNldCBAdWJpLT52aWRfaGRyX3NoaWZ0IG9mIHRoaXMgYnVmZmVyLiBXaGVuIHRoZQorICogVklEIGhlYWRlciBpcyBiZWluZyB3cml0dGVuIG91dCwgaXQgc2hpZnRzIHRoZSBWSUQgaGVhZGVyIHBvaW50ZXIgYmFjayBhbmQKKyAqIHdyaXRlcyB0aGUgd2hvbGUgc3ViLXBhZ2UuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSAidWJpLmgiCisKKyNpZmRlZiBDT05GSUdfTVREX1VCSV9ERUJVR19QQVJBTk9JRAorc3RhdGljIGludCBwYXJhbm9pZF9jaGVja19ub3RfYmFkKGNvbnN0IHN0cnVjdCB1YmlfZGV2aWNlICp1YmksIGludCBwbnVtKTsKK3N0YXRpYyBpbnQgcGFyYW5vaWRfY2hlY2tfcGViX2VjX2hkcihjb25zdCBzdHJ1Y3QgdWJpX2RldmljZSAqdWJpLCBpbnQgcG51bSk7CitzdGF0aWMgaW50IHBhcmFub2lkX2NoZWNrX2VjX2hkcihjb25zdCBzdHJ1Y3QgdWJpX2RldmljZSAqdWJpLCBpbnQgcG51bSwKKwkJCQkgY29uc3Qgc3RydWN0IHViaV9lY19oZHIgKmVjX2hkcik7CitzdGF0aWMgaW50IHBhcmFub2lkX2NoZWNrX3BlYl92aWRfaGRyKGNvbnN0IHN0cnVjdCB1YmlfZGV2aWNlICp1YmksIGludCBwbnVtKTsKK3N0YXRpYyBpbnQgcGFyYW5vaWRfY2hlY2tfdmlkX2hkcihjb25zdCBzdHJ1Y3QgdWJpX2RldmljZSAqdWJpLCBpbnQgcG51bSwKKwkJCQkgIGNvbnN0IHN0cnVjdCB1YmlfdmlkX2hkciAqdmlkX2hkcik7CitzdGF0aWMgaW50IHBhcmFub2lkX2NoZWNrX2FsbF9mZihjb25zdCBzdHJ1Y3QgdWJpX2RldmljZSAqdWJpLCBpbnQgcG51bSwKKwkJCQkgaW50IG9mZnNldCwgaW50IGxlbik7CisjZWxzZQorI2RlZmluZSBwYXJhbm9pZF9jaGVja19ub3RfYmFkKHViaSwgcG51bSkgMAorI2RlZmluZSBwYXJhbm9pZF9jaGVja19wZWJfZWNfaGRyKHViaSwgcG51bSkgIDAKKyNkZWZpbmUgcGFyYW5vaWRfY2hlY2tfZWNfaGRyKHViaSwgcG51bSwgZWNfaGRyKSAgMAorI2RlZmluZSBwYXJhbm9pZF9jaGVja19wZWJfdmlkX2hkcih1YmksIHBudW0pIDAKKyNkZWZpbmUgcGFyYW5vaWRfY2hlY2tfdmlkX2hkcih1YmksIHBudW0sIHZpZF9oZHIpIDAKKyNkZWZpbmUgcGFyYW5vaWRfY2hlY2tfYWxsX2ZmKHViaSwgcG51bSwgb2Zmc2V0LCBsZW4pIDAKKyNlbmRpZgorCisvKioKKyAqIHViaV9pb19yZWFkIC0gcmVhZCBkYXRhIGZyb20gYSBwaHlzaWNhbCBlcmFzZWJsb2NrLgorICogQHViaTogVUJJIGRldmljZSBkZXNjcmlwdGlvbiBvYmplY3QKKyAqIEBidWY6IGJ1ZmZlciB3aGVyZSB0byBzdG9yZSB0aGUgcmVhZCBkYXRhCisgKiBAcG51bTogcGh5c2ljYWwgZXJhc2VibG9jayBudW1iZXIgdG8gcmVhZCBmcm9tCisgKiBAb2Zmc2V0OiBvZmZzZXQgd2l0aGluIHRoZSBwaHlzaWNhbCBlcmFzZWJsb2NrIGZyb20gd2hlcmUgdG8gcmVhZAorICogQGxlbjogaG93IG1hbnkgYnl0ZXMgdG8gcmVhZAorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmVhZHMgZGF0YSBmcm9tIG9mZnNldCBAb2Zmc2V0IG9mIHBoeXNpY2FsIGVyYXNlYmxvY2sgQHBudW0KKyAqIGFuZCBzdG9yZXMgdGhlIHJlYWQgZGF0YSBpbiB0aGUgQGJ1ZiBidWZmZXIuIFRoZSBmb2xsb3dpbmcgcmV0dXJuIGNvZGVzIGFyZQorICogcG9zc2libGU6CisgKgorICogbyAlMCBpZiBhbGwgdGhlIHJlcXVlc3RlZCBkYXRhIHdlcmUgc3VjY2Vzc2Z1bGx5IHJlYWQ7CisgKiBvICVVQklfSU9fQklURkxJUFMgaWYgYWxsIHRoZSByZXF1ZXN0ZWQgZGF0YSB3ZXJlIHN1Y2Nlc3NmdWxseSByZWFkLCBidXQKKyAqICAgY29ycmVjdGFibGUgYml0LWZsaXBzIHdlcmUgZGV0ZWN0ZWQ7IHRoaXMgaXMgaGFybWxlc3MgYnV0IG1heSBpbmRpY2F0ZQorICogICB0aGF0IHRoaXMgZXJhc2VibG9jayBtYXkgYmVjb21lIGJhZCBzb29uIChidXQgZG8gbm90IGhhdmUgdG8pOworICogbyAlLUVCQURNU0cgaWYgdGhlIE1URCBzdWJzeXN0ZW0gcmVwb3J0ZWQgYWJvdXQgZGF0YSBkYXRhIGludGVncml0eQorICogICBwcm9ibGVtcywgZm9yIGV4YW1wbGUgaXQgY2FuIG1lIGFuIEVDQyBlcnJvciBpbiBjYXNlIG9mIE5BTkQ7IHRoaXMgbW9zdAorICogICBwcm9iYWJseSBtZWFucyB0aGF0IHRoZSBkYXRhIGlzIGNvcnJ1cHRlZDsKKyAqIG8gJS1FSU8gaWYgc29tZSBJL08gZXJyb3Igb2NjdXJyZWQ7CisgKiBvIG90aGVyIG5lZ2F0aXZlIGVycm9yIGNvZGVzIGluIGNhc2Ugb2Ygb3RoZXIgZXJyb3JzLgorICovCitpbnQgdWJpX2lvX3JlYWQoY29uc3Qgc3RydWN0IHViaV9kZXZpY2UgKnViaSwgdm9pZCAqYnVmLCBpbnQgcG51bSwgaW50IG9mZnNldCwKKwkJaW50IGxlbikKK3sKKwlpbnQgZXJyLCByZXRyaWVzID0gMDsKKwlzaXplX3QgcmVhZDsKKwlsb2ZmX3QgYWRkcjsKKworCWRiZ19pbygicmVhZCAlZCBieXRlcyBmcm9tIFBFQiAlZDolZCIsIGxlbiwgcG51bSwgb2Zmc2V0KTsKKworCXViaV9hc3NlcnQocG51bSA+PSAwICYmIHBudW0gPCB1YmktPnBlYl9jb3VudCk7CisJdWJpX2Fzc2VydChvZmZzZXQgPj0gMCAmJiBvZmZzZXQgKyBsZW4gPD0gdWJpLT5wZWJfc2l6ZSk7CisJdWJpX2Fzc2VydChsZW4gPiAwKTsKKworCWVyciA9IHBhcmFub2lkX2NoZWNrX25vdF9iYWQodWJpLCBwbnVtKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyID4gMCA/IC1FSU5WQUwgOiBlcnI7CisKKwlhZGRyID0gKGxvZmZfdClwbnVtICogdWJpLT5wZWJfc2l6ZSArIG9mZnNldDsKK3JldHJ5OgorCWVyciA9IHViaS0+bXRkLT5yZWFkKHViaS0+bXRkLCBhZGRyLCBsZW4sICZyZWFkLCBidWYpOworCWlmIChlcnIpIHsKKwkJaWYgKGVyciA9PSAtRVVDTEVBTikgeworCQkJLyoKKwkJCSAqIC1FVUNMRUFOIGlzIHJlcG9ydGVkIGlmIHRoZXJlIHdhcyBhIGJpdC1mbGlwIHdoaWNoCisJCQkgKiB3YXMgY29ycmVjdGVkLCBzbyB0aGlzIGlzIGhhcm1sZXNzLgorCQkJICovCisJCQl1YmlfbXNnKCJmaXhhYmxlIGJpdC1mbGlwIGRldGVjdGVkIGF0IFBFQiAlZCIsIHBudW0pOworCQkJdWJpX2Fzc2VydChsZW4gPT0gcmVhZCk7CisJCQlyZXR1cm4gVUJJX0lPX0JJVEZMSVBTOworCQl9CisKKwkJaWYgKHJlYWQgIT0gbGVuICYmIHJldHJpZXMrKyA8IFVCSV9JT19SRVRSSUVTKSB7CisJCQlkYmdfaW8oImVycm9yICVkIHdoaWxlIHJlYWRpbmcgJWQgYnl0ZXMgZnJvbSBQRUIgJWQ6JWQsICIKKwkJCSAgICAgICAicmVhZCBvbmx5ICV6ZCBieXRlcywgcmV0cnkiLAorCQkJICAgICAgIGVyciwgbGVuLCBwbnVtLCBvZmZzZXQsIHJlYWQpOworCQkJeWllbGQoKTsKKwkJCWdvdG8gcmV0cnk7CisJCX0KKworCQl1YmlfZXJyKCJlcnJvciAlZCB3aGlsZSByZWFkaW5nICVkIGJ5dGVzIGZyb20gUEVCICVkOiVkLCAiCisJCQkicmVhZCAlemQgYnl0ZXMiLCBlcnIsIGxlbiwgcG51bSwgb2Zmc2V0LCByZWFkKTsKKwkJdWJpX2RiZ19kdW1wX3N0YWNrKCk7CisJfSBlbHNlIHsKKwkJdWJpX2Fzc2VydChsZW4gPT0gcmVhZCk7CisKKwkJaWYgKHViaV9kYmdfaXNfYml0ZmxpcCgpKSB7CisJCQlkYmdfbXNnKCJiaXQtZmxpcCAoZW11bGF0ZWQpIik7CisJCQllcnIgPSBVQklfSU9fQklURkxJUFM7CisJCX0KKwl9CisKKwlyZXR1cm4gZXJyOworfQorCisvKioKKyAqIHViaV9pb193cml0ZSAtIHdyaXRlIGRhdGEgdG8gYSBwaHlzaWNhbCBlcmFzZWJsb2NrLgorICogQHViaTogVUJJIGRldmljZSBkZXNjcmlwdGlvbiBvYmplY3QKKyAqIEBidWY6IGJ1ZmZlciB3aXRoIHRoZSBkYXRhIHRvIHdyaXRlCisgKiBAcG51bTogcGh5c2ljYWwgZXJhc2VibG9jayBudW1iZXIgdG8gd3JpdGUgdG8KKyAqIEBvZmZzZXQ6IG9mZnNldCB3aXRoaW4gdGhlIHBoeXNpY2FsIGVyYXNlYmxvY2sgd2hlcmUgdG8gd3JpdGUKKyAqIEBsZW46IGhvdyBtYW55IGJ5dGVzIHRvIHdyaXRlCisgKgorICogVGhpcyBmdW5jdGlvbiB3cml0ZXMgQGxlbiBieXRlcyBvZiBkYXRhIGZyb20gYnVmZmVyIEBidWYgdG8gb2Zmc2V0IEBvZmZzZXQKKyAqIG9mIHBoeXNpY2FsIGVyYXNlYmxvY2sgQHBudW0uIElmIGFsbCB0aGUgZGF0YSB3ZXJlIHN1Y2Nlc3NmdWxseSB3cml0dGVuLAorICogemVybyBpcyByZXR1cm5lZC4gSWYgYW4gZXJyb3Igb2NjdXJyZWQsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIG5lZ2F0aXZlCisgKiBlcnJvciBjb2RlLiBJZiAlLUVJTyBpcyByZXR1cm5lZCwgdGhlIHBoeXNpY2FsIGVyYXNlYmxvY2sgbW9zdCBwcm9iYWJseSB3ZW50CisgKiBiYWQuCisgKgorICogTm90ZSwgaW4gY2FzZSBvZiBhbiBlcnJvciwgaXQgaXMgcG9zc2libGUgdGhhdCBzb21ldGhpbmcgd2FzIHN0aWxsIHdyaXR0ZW4KKyAqIHRvIHRoZSBmbGFzaCBtZWRpYSwgYnV0IG1heSBiZSBzb21lIGdhcmJhZ2UuCisgKi8KK2ludCB1YmlfaW9fd3JpdGUoY29uc3Qgc3RydWN0IHViaV9kZXZpY2UgKnViaSwgY29uc3Qgdm9pZCAqYnVmLCBpbnQgcG51bSwKKwkJIGludCBvZmZzZXQsIGludCBsZW4pCit7CisJaW50IGVycjsKKwlzaXplX3Qgd3JpdHRlbjsKKwlsb2ZmX3QgYWRkcjsKKworCWRiZ19pbygid3JpdGUgJWQgYnl0ZXMgdG8gUEVCICVkOiVkIiwgbGVuLCBwbnVtLCBvZmZzZXQpOworCisJdWJpX2Fzc2VydChwbnVtID49IDAgJiYgcG51bSA8IHViaS0+cGViX2NvdW50KTsKKwl1YmlfYXNzZXJ0KG9mZnNldCA+PSAwICYmIG9mZnNldCArIGxlbiA8PSB1YmktPnBlYl9zaXplKTsKKwl1YmlfYXNzZXJ0KG9mZnNldCAlIHViaS0+aGRyc19taW5faW9fc2l6ZSA9PSAwKTsKKwl1YmlfYXNzZXJ0KGxlbiA+IDAgJiYgbGVuICUgdWJpLT5oZHJzX21pbl9pb19zaXplID09IDApOworCisJaWYgKHViaS0+cm9fbW9kZSkgeworCQl1YmlfZXJyKCJyZWFkLW9ubHkgbW9kZSIpOworCQlyZXR1cm4gLUVST0ZTOworCX0KKworCS8qIFRoZSBiZWxvdyBoYXMgdG8gYmUgY29tcGlsZWQgb3V0IGlmIHBhcmFub2lkIGNoZWNrcyBhcmUgZGlzYWJsZWQgKi8KKworCWVyciA9IHBhcmFub2lkX2NoZWNrX25vdF9iYWQodWJpLCBwbnVtKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyID4gMCA/IC1FSU5WQUwgOiBlcnI7CisKKwkvKiBUaGUgYXJlYSB3ZSBhcmUgd3JpdGluZyB0byBoYXMgdG8gY29udGFpbiBhbGwgMHhGRiBieXRlcyAqLworCWVyciA9IHBhcmFub2lkX2NoZWNrX2FsbF9mZih1YmksIHBudW0sIG9mZnNldCwgbGVuKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyID4gMCA/IC1FSU5WQUwgOiBlcnI7CisKKwlpZiAob2Zmc2V0ID49IHViaS0+bGViX3N0YXJ0KSB7CisJCS8qCisJCSAqIFdlIHdyaXRlIHRvIHRoZSBkYXRhIGFyZWEgb2YgdGhlIHBoeXNpY2FsIGVyYXNlYmxvY2suIE1ha2UKKwkJICogc3VyZSBpdCBoYXMgdmFsaWQgRUMgYW5kIFZJRCBoZWFkZXJzLgorCQkgKi8KKwkJZXJyID0gcGFyYW5vaWRfY2hlY2tfcGViX2VjX2hkcih1YmksIHBudW0pOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVyciA+IDAgPyAtRUlOVkFMIDogZXJyOworCQllcnIgPSBwYXJhbm9pZF9jaGVja19wZWJfdmlkX2hkcih1YmksIHBudW0pOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVyciA+IDAgPyAtRUlOVkFMIDogZXJyOworCX0KKworCWlmICh1YmlfZGJnX2lzX3dyaXRlX2ZhaWx1cmUoKSkgeworCQlkYmdfZXJyKCJjYW5ub3Qgd3JpdGUgJWQgYnl0ZXMgdG8gUEVCICVkOiVkICIKKwkJCSIoZW11bGF0ZWQpIiwgbGVuLCBwbnVtLCBvZmZzZXQpOworCQl1YmlfZGJnX2R1bXBfc3RhY2soKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJYWRkciA9IChsb2ZmX3QpcG51bSAqIHViaS0+cGViX3NpemUgKyBvZmZzZXQ7CisJZXJyID0gdWJpLT5tdGQtPndyaXRlKHViaS0+bXRkLCBhZGRyLCBsZW4sICZ3cml0dGVuLCBidWYpOworCWlmIChlcnIpIHsKKwkJdWJpX2VycigiZXJyb3IgJWQgd2hpbGUgd3JpdGluZyAlZCBieXRlcyB0byBQRUIgJWQ6JWQsIHdyaXR0ZW4iCisJCQkiICV6ZCBieXRlcyIsIGVyciwgbGVuLCBwbnVtLCBvZmZzZXQsIHdyaXR0ZW4pOworCQl1YmlfZGJnX2R1bXBfc3RhY2soKTsKKwl9IGVsc2UKKwkJdWJpX2Fzc2VydCh3cml0dGVuID09IGxlbik7CisKKwlyZXR1cm4gZXJyOworfQorCisvKioKKyAqIGVyYXNlX2NhbGxiYWNrIC0gTVREIGVyYXN1cmUgY2FsbC1iYWNrLgorICogQGVpOiBNVEQgZXJhc2UgaW5mb3JtYXRpb24gb2JqZWN0LgorICoKKyAqIE5vdGUsIGV2ZW4gdGhvdWdoIE1URCBlcmFzZSBpbnRlcmZhY2UgaXMgYXN5bmNocm9ub3VzLCBhbGwgdGhlIGN1cnJlbnQKKyAqIGltcGxlbWVudGF0aW9ucyBhcmUgc3luY2hyb25vdXMgYW55d2F5LgorICovCitzdGF0aWMgdm9pZCBlcmFzZV9jYWxsYmFjayhzdHJ1Y3QgZXJhc2VfaW5mbyAqZWkpCit7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCh3YWl0X3F1ZXVlX2hlYWRfdCAqKWVpLT5wcml2KTsKK30KKworLyoqCisgKiBkb19zeW5jX2VyYXNlIC0gc3luY2hyb25vdXNseSBlcmFzZSBhIHBoeXNpY2FsIGVyYXNlYmxvY2suCisgKiBAdWJpOiBVQkkgZGV2aWNlIGRlc2NyaXB0aW9uIG9iamVjdAorICogQHBudW06IHRoZSBwaHlzaWNhbCBlcmFzZWJsb2NrIG51bWJlciB0byBlcmFzZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gc3luY2hyb25vdXNseSBlcmFzZXMgcGh5c2ljYWwgZXJhc2VibG9jayBAcG51bSBhbmQgcmV0dXJucworICogemVybyBpbiBjYXNlIG9mIHN1Y2Nlc3MgYW5kIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBpbiBjYXNlIG9mIGZhaWx1cmUuIElmCisgKiAlLUVJTyBpcyByZXR1cm5lZCwgdGhlIHBoeXNpY2FsIGVyYXNlYmxvY2sgbW9zdCBwcm9iYWJseSB3ZW50IGJhZC4KKyAqLworc3RhdGljIGludCBkb19zeW5jX2VyYXNlKGNvbnN0IHN0cnVjdCB1YmlfZGV2aWNlICp1YmksIGludCBwbnVtKQoreworCWludCBlcnIsIHJldHJpZXMgPSAwOworCXN0cnVjdCBlcmFzZV9pbmZvIGVpOworCXdhaXRfcXVldWVfaGVhZF90IHdxOworCisJZGJnX2lvKCJlcmFzZSBQRUIgJWQiLCBwbnVtKTsKKworcmV0cnk6CisJaW5pdF93YWl0cXVldWVfaGVhZCgmd3EpOworCW1lbXNldCgmZWksIDAsIHNpemVvZihzdHJ1Y3QgZXJhc2VfaW5mbykpOworCisJZWkubXRkICAgICAgPSB1YmktPm10ZDsKKwllaS5hZGRyICAgICA9IHBudW0gKiB1YmktPnBlYl9zaXplOworCWVpLmxlbiAgICAgID0gdWJpLT5wZWJfc2l6ZTsKKwllaS5jYWxsYmFjayA9IGVyYXNlX2NhbGxiYWNrOworCWVpLnByaXYgICAgID0gKHVuc2lnbmVkIGxvbmcpJndxOworCisJZXJyID0gdWJpLT5tdGQtPmVyYXNlKHViaS0+bXRkLCAmZWkpOworCWlmIChlcnIpIHsKKwkJaWYgKHJldHJpZXMrKyA8IFVCSV9JT19SRVRSSUVTKSB7CisJCQlkYmdfaW8oImVycm9yICVkIHdoaWxlIGVyYXNpbmcgUEVCICVkLCByZXRyeSIsCisJCQkgICAgICAgZXJyLCBwbnVtKTsKKwkJCXlpZWxkKCk7CisJCQlnb3RvIHJldHJ5OworCQl9CisJCXViaV9lcnIoImNhbm5vdCBlcmFzZSBQRUIgJWQsIGVycm9yICVkIiwgcG51bSwgZXJyKTsKKwkJdWJpX2RiZ19kdW1wX3N0YWNrKCk7CisJCXJldHVybiBlcnI7CisJfQorCisJZXJyID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHdxLCBlaS5zdGF0ZSA9PSBNVERfRVJBU0VfRE9ORSB8fAorCQkJCQkgICBlaS5zdGF0ZSA9PSBNVERfRVJBU0VfRkFJTEVEKTsKKwlpZiAoZXJyKSB7CisJCXViaV9lcnIoImludGVycnVwdGVkIFBFQiAlZCBlcmFzdXJlIiwgcG51bSk7CisJCXJldHVybiAtRUlOVFI7CisJfQorCisJaWYgKGVpLnN0YXRlID09IE1URF9FUkFTRV9GQUlMRUQpIHsKKwkJaWYgKHJldHJpZXMrKyA8IFVCSV9JT19SRVRSSUVTKSB7CisJCQlkYmdfaW8oImVycm9yIHdoaWxlIGVyYXNpbmcgUEVCICVkLCByZXRyeSIsIHBudW0pOworCQkJeWllbGQoKTsKKwkJCWdvdG8gcmV0cnk7CisJCX0KKwkJdWJpX2VycigiY2Fubm90IGVyYXNlIFBFQiAlZCIsIHBudW0pOworCQl1YmlfZGJnX2R1bXBfc3RhY2soKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJZXJyID0gcGFyYW5vaWRfY2hlY2tfYWxsX2ZmKHViaSwgcG51bSwgMCwgdWJpLT5wZWJfc2l6ZSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVyciA+IDAgPyAtRUlOVkFMIDogZXJyOworCisJaWYgKHViaV9kYmdfaXNfZXJhc2VfZmFpbHVyZSgpICYmICFlcnIpIHsKKwkJZGJnX2VycigiY2Fubm90IGVyYXNlIFBFQiAlZCAoZW11bGF0ZWQpIiwgcG51bSk7CisJCXJldHVybiAtRUlPOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIGNoZWNrX3BhdHRlcm4gLSBjaGVjayBpZiBidWZmZXIgY29udGFpbnMgb25seSBhIGNlcnRhaW4gYnl0ZSBwYXR0ZXJuLgorICogQGJ1ZjogYnVmZmVyIHRvIGNoZWNrCisgKiBAcGF0dDogdGhlIHBhdHRlcm4gdG8gY2hlY2sKKyAqIEBzaXplOiBidWZmZXIgc2l6ZSBpbiBieXRlcworICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyAlMSBpbiB0aGVyZSBhcmUgb25seSBAcGF0dCBieXRlcyBpbiBAYnVmLCBhbmQgJTAgaWYKKyAqIHNvbWV0aGluZyBlbHNlIHdhcyBhbHNvIGZvdW5kLgorICovCitzdGF0aWMgaW50IGNoZWNrX3BhdHRlcm4oY29uc3Qgdm9pZCAqYnVmLCB1aW50OF90IHBhdHQsIGludCBzaXplKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKKwkJaWYgKCgoY29uc3QgdWludDhfdCAqKWJ1ZilbaV0gIT0gcGF0dCkKKwkJCXJldHVybiAwOworCXJldHVybiAxOworfQorCisvKiBQYXR0ZXJucyB0byB3cml0ZSB0byBhIHBoeXNpY2FsIGVyYXNlYmxvY2sgd2hlbiB0b3J0dXJpbmcgaXQgKi8KK3N0YXRpYyB1aW50OF90IHBhdHRlcm5zW10gPSB7MHhhNSwgMHg1YSwgMHgwfTsKKworLyoqCisgKiB0b3J0dXJlX3BlYiAtIHRlc3QgYSBzdXBwb3NlZGx5IGJhZCBwaHlzaWNhbCBlcmFzZWJsb2NrLgorICogQHViaTogVUJJIGRldmljZSBkZXNjcmlwdGlvbiBvYmplY3QKKyAqIEBwbnVtOiB0aGUgcGh5c2ljYWwgZXJhc2VibG9jayBudW1iZXIgdG8gdGVzdAorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyAlLUVJTyBpZiB0aGUgcGh5c2ljYWwgZXJhc2VibG9jayBkaWQgbm90IHBhc3MgdGhlCisgKiB0ZXN0LCBhIHBvc2l0aXZlIG51bWJlciBvZiBlcmFzZSBvcGVyYXRpb25zIGRvbmUgaWYgdGhlIHRlc3Qgd2FzCisgKiBzdWNjZXNzZnVsbHkgcGFzc2VkLCBhbmQgb3RoZXIgbmVnYXRpdmUgZXJyb3IgY29kZXMgaW4gY2FzZSBvZiBvdGhlciBlcnJvcnMuCisgKi8KK3N0YXRpYyBpbnQgdG9ydHVyZV9wZWIoY29uc3Qgc3RydWN0IHViaV9kZXZpY2UgKnViaSwgaW50IHBudW0pCit7CisJdm9pZCAqYnVmOworCWludCBlcnIsIGksIHBhdHRfY291bnQ7CisKKwlidWYgPSBrbWFsbG9jKHViaS0+cGViX3NpemUsIEdGUF9LRVJORUwpOworCWlmICghYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBhdHRfY291bnQgPSBBUlJBWV9TSVpFKHBhdHRlcm5zKTsKKwl1YmlfYXNzZXJ0KHBhdHRfY291bnQgPiAwKTsKKworCWZvciAoaSA9IDA7IGkgPCBwYXR0X2NvdW50OyBpKyspIHsKKwkJZXJyID0gZG9fc3luY19lcmFzZSh1YmksIHBudW0pOworCQlpZiAoZXJyKQorCQkJZ290byBvdXQ7CisKKwkJLyogTWFrZSBzdXJlIHRoZSBQRUIgY29udGFpbnMgb25seSAweEZGIGJ5dGVzICovCisJCWVyciA9IHViaV9pb19yZWFkKHViaSwgYnVmLCBwbnVtLCAwLCB1YmktPnBlYl9zaXplKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0OworCisJCWVyciA9IGNoZWNrX3BhdHRlcm4oYnVmLCAweEZGLCB1YmktPnBlYl9zaXplKTsKKwkJaWYgKGVyciA9PSAwKSB7CisJCQl1YmlfZXJyKCJlcmFzZWQgUEVCICVkLCBidXQgYSBub24tMHhGRiBieXRlIGZvdW5kIiwKKwkJCQlwbnVtKTsKKwkJCWVyciA9IC1FSU87CisJCQlnb3RvIG91dDsKKwkJfQorCisJCS8qIFdyaXRlIGEgcGF0dGVybiBhbmQgY2hlY2sgaXQgKi8KKwkJbWVtc2V0KGJ1ZiwgcGF0dGVybnNbaV0sIHViaS0+cGViX3NpemUpOworCQllcnIgPSB1YmlfaW9fd3JpdGUodWJpLCBidWYsIHBudW0sIDAsIHViaS0+cGViX3NpemUpOworCQlpZiAoZXJyKQorCQkJZ290byBvdXQ7CisKKwkJbWVtc2V0KGJ1ZiwgfnBhdHRlcm5zW2ldLCB1YmktPnBlYl9zaXplKTsKKwkJZXJyID0gdWJpX2lvX3JlYWQodWJpLCBidWYsIHBudW0sIDAsIHViaS0+cGViX3NpemUpOworCQlpZiAoZXJyKQorCQkJZ290byBvdXQ7CisKKwkJZXJyID0gY2hlY2tfcGF0dGVybihidWYsIHBhdHRlcm5zW2ldLCB1YmktPnBlYl9zaXplKTsKKwkJaWYgKGVyciA9PSAwKSB7CisJCQl1YmlfZXJyKCJwYXR0ZXJuICV4IGNoZWNraW5nIGZhaWxlZCBmb3IgUEVCICVkIiwKKwkJCQlwYXR0ZXJuc1tpXSwgcG51bSk7CisJCQllcnIgPSAtRUlPOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwllcnIgPSBwYXR0X2NvdW50OworCitvdXQ6CisJaWYgKGVyciA9PSBVQklfSU9fQklURkxJUFMgfHwgZXJyID09IC1FQkFETVNHKQorCQkvKgorCQkgKiBJZiBhIGJpdC1mbGlwIG9yIGRhdGEgaW50ZWdyaXR5IGVycm9yIHdhcyBkZXRlY3RlZCwgdGhlIHRlc3QKKwkJICogaGFzIG5vdCBwYXNzZWQgYmVjYXVzZSBpdCBoYXBwZW5lZCBvbiBhIGZyZXNobHkgZXJhc2VkCisJCSAqIHBoeXNpY2FsIGVyYXNlYmxvY2sgd2hpY2ggbWVhbnMgc29tZXRoaW5nIGlzIHdyb25nIHdpdGggaXQuCisJCSAqLworCQllcnIgPSAtRUlPOworCWtmcmVlKGJ1Zik7CisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKiB1YmlfaW9fc3luY19lcmFzZSAtIHN5bmNocm9ub3VzbHkgZXJhc2UgYSBwaHlzaWNhbCBlcmFzZWJsb2NrLgorICogQHViaTogVUJJIGRldmljZSBkZXNjcmlwdGlvbiBvYmplY3QKKyAqIEBwbnVtOiBwaHlzaWNhbCBlcmFzZWJsb2NrIG51bWJlciB0byBlcmFzZQorICogQHRvcnR1cmU6IGlmIHRoaXMgcGh5c2ljYWwgZXJhc2VibG9jayBoYXMgdG8gYmUgdG9ydHVyZWQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHN5bmNocm9ub3VzbHkgZXJhc2VzIHBoeXNpY2FsIGVyYXNlYmxvY2sgQHBudW0uIElmIEB0b3J0dXJlCisgKiBmbGFnIGlzIG5vdCB6ZXJvLCB0aGUgcGh5c2ljYWwgZXJhc2VibG9jayBpcyBjaGVja2VkIGJ5IG1lYW5zIG9mIHdyaXRpbmcKKyAqIGRpZmZlcmVudCBwYXR0ZXJucyB0byBpdCBhbmQgcmVhZGluZyB0aGVtIGJhY2suIElmIHRoZSB0b3J0dXJpbmcgaXMgZW5hYmxlZCwKKyAqIHRoZSBwaHlzaWNhbCBlcmFzZWJsb2NrIGlzIGVyYXNlZCBtb3JlIHRoZW4gb25jZS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIG51bWJlciBvZiBlcmFzdXJlcyBtYWRlIGluIGNhc2Ugb2Ygc3VjY2VzcywgJS1FSU8KKyAqIGlmIHRoZSBlcmFzdXJlIGZhaWxlZCBvciB0aGUgdG9ydHVyaW5nIHRlc3QgZmFpbGVkLCBhbmQgb3RoZXIgbmVnYXRpdmUgZXJyb3IKKyAqIGNvZGVzIGluIGNhc2Ugb2Ygb3RoZXIgZXJyb3JzLiBOb3RlLCAlLUVJTyBtZWFucyB0aGF0IHRoZSBwaHlzaWNhbAorICogZXJhc2VibG9jayBpcyBiYWQuCisgKi8KK2ludCB1YmlfaW9fc3luY19lcmFzZShjb25zdCBzdHJ1Y3QgdWJpX2RldmljZSAqdWJpLCBpbnQgcG51bSwgaW50IHRvcnR1cmUpCit7CisJaW50IGVyciwgcmV0ID0gMDsKKworCXViaV9hc3NlcnQocG51bSA+PSAwICYmIHBudW0gPCB1YmktPnBlYl9jb3VudCk7CisKKwllcnIgPSBwYXJhbm9pZF9jaGVja19ub3RfYmFkKHViaSwgcG51bSk7CisJaWYgKGVyciAhPSAwKQorCQlyZXR1cm4gZXJyID4gMCA/IC1FSU5WQUwgOiBlcnI7CisKKwlpZiAodWJpLT5yb19tb2RlKSB7CisJCXViaV9lcnIoInJlYWQtb25seSBtb2RlIik7CisJCXJldHVybiAtRVJPRlM7CisJfQorCisJaWYgKHRvcnR1cmUpIHsKKwkJcmV0ID0gdG9ydHVyZV9wZWIodWJpLCBwbnVtKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCX0KKworCWVyciA9IGRvX3N5bmNfZXJhc2UodWJpLCBwbnVtKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJcmV0dXJuIHJldCArIDE7Cit9CisKKy8qKgorICogdWJpX2lvX2lzX2JhZCAtIGNoZWNrIGlmIGEgcGh5c2ljYWwgZXJhc2VibG9jayBpcyBiYWQuCisgKiBAdWJpOiBVQkkgZGV2aWNlIGRlc2NyaXB0aW9uIG9iamVjdAorICogQHBudW06IHRoZSBwaHlzaWNhbCBlcmFzZWJsb2NrIG51bWJlciB0byBjaGVjaworICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHBvc2l0aXZlIG51bWJlciBpZiB0aGUgcGh5c2ljYWwgZXJhc2VibG9jayBpcyBiYWQsCisgKiB6ZXJvIGlmIG5vdCwgYW5kIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBpZiBhbiBlcnJvciBvY2N1cnJlZC4KKyAqLworaW50IHViaV9pb19pc19iYWQoY29uc3Qgc3RydWN0IHViaV9kZXZpY2UgKnViaSwgaW50IHBudW0pCit7CisJc3RydWN0IG10ZF9pbmZvICptdGQgPSB1YmktPm10ZDsKKworCXViaV9hc3NlcnQocG51bSA+PSAwICYmIHBudW0gPCB1YmktPnBlYl9jb3VudCk7CisKKwlpZiAodWJpLT5iYWRfYWxsb3dlZCkgeworCQlpbnQgcmV0OworCisJCXJldCA9IG10ZC0+YmxvY2tfaXNiYWQobXRkLCAobG9mZl90KXBudW0gKiB1YmktPnBlYl9zaXplKTsKKwkJaWYgKHJldCA8IDApCisJCQl1YmlfZXJyKCJlcnJvciAlZCB3aGlsZSBjaGVja2luZyBpZiBQRUIgJWQgaXMgYmFkIiwKKwkJCQlyZXQsIHBudW0pOworCQllbHNlIGlmIChyZXQpCisJCQlkYmdfaW8oIlBFQiAlZCBpcyBiYWQiLCBwbnVtKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB1YmlfaW9fbWFya19iYWQgLSBtYXJrIGEgcGh5c2ljYWwgZXJhc2VibG9jayBhcyBiYWQuCisgKiBAdWJpOiBVQkkgZGV2aWNlIGRlc2NyaXB0aW9uIG9iamVjdAorICogQHBudW06IHRoZSBwaHlzaWNhbCBlcmFzZWJsb2NrIG51bWJlciB0byBtYXJrCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHplcm8gaW4gY2FzZSBvZiBzdWNjZXNzIGFuZCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgaW4KKyAqIGNhc2Ugb2YgZmFpbHVyZS4KKyAqLworaW50IHViaV9pb19tYXJrX2JhZChjb25zdCBzdHJ1Y3QgdWJpX2RldmljZSAqdWJpLCBpbnQgcG51bSkKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBtdGRfaW5mbyAqbXRkID0gdWJpLT5tdGQ7CisKKwl1YmlfYXNzZXJ0KHBudW0gPj0gMCAmJiBwbnVtIDwgdWJpLT5wZWJfY291bnQpOworCisJaWYgKHViaS0+cm9fbW9kZSkgeworCQl1YmlfZXJyKCJyZWFkLW9ubHkgbW9kZSIpOworCQlyZXR1cm4gLUVST0ZTOworCX0KKworCWlmICghdWJpLT5iYWRfYWxsb3dlZCkKKwkJcmV0dXJuIDA7CisKKwllcnIgPSBtdGQtPmJsb2NrX21hcmtiYWQobXRkLCAobG9mZl90KXBudW0gKiB1YmktPnBlYl9zaXplKTsKKwlpZiAoZXJyKQorCQl1YmlfZXJyKCJjYW5ub3QgbWFyayBQRUIgJWQgYmFkLCBlcnJvciAlZCIsIHBudW0sIGVycik7CisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKiB2YWxpZGF0ZV9lY19oZHIgLSB2YWxpZGF0ZSBhbiBlcmFzZSBjb3VudGVyIGhlYWRlci4KKyAqIEB1Ymk6IFVCSSBkZXZpY2UgZGVzY3JpcHRpb24gb2JqZWN0CisgKiBAZWNfaGRyOiB0aGUgZXJhc2UgY291bnRlciBoZWFkZXIgdG8gY2hlY2sKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgemVybyBpZiB0aGUgZXJhc2UgY291bnRlciBoZWFkZXIgaXMgT0ssIGFuZCAlMSBpZgorICogbm90LgorICovCitzdGF0aWMgaW50IHZhbGlkYXRlX2VjX2hkcihjb25zdCBzdHJ1Y3QgdWJpX2RldmljZSAqdWJpLAorCQkJICAgY29uc3Qgc3RydWN0IHViaV9lY19oZHIgKmVjX2hkcikKK3sKKwlsb25nIGxvbmcgZWM7CisJaW50IHZpZF9oZHJfb2Zmc2V0LCBsZWJfc3RhcnQ7CisKKwllYyA9IHViaTY0X3RvX2NwdShlY19oZHItPmVjKTsKKwl2aWRfaGRyX29mZnNldCA9IHViaTMyX3RvX2NwdShlY19oZHItPnZpZF9oZHJfb2Zmc2V0KTsKKwlsZWJfc3RhcnQgPSB1YmkzMl90b19jcHUoZWNfaGRyLT5kYXRhX29mZnNldCk7CisKKwlpZiAoZWNfaGRyLT52ZXJzaW9uICE9IFVCSV9WRVJTSU9OKSB7CisJCXViaV9lcnIoIm5vZGUgd2l0aCBpbmNvbXBhdGlibGUgVUJJIHZlcnNpb24gZm91bmQ6ICIKKwkJCSJ0aGlzIFVCSSB2ZXJzaW9uIGlzICVkLCBpbWFnZSB2ZXJzaW9uIGlzICVkIiwKKwkJCVVCSV9WRVJTSU9OLCAoaW50KWVjX2hkci0+dmVyc2lvbik7CisJCWdvdG8gYmFkOworCX0KKworCWlmICh2aWRfaGRyX29mZnNldCAhPSB1YmktPnZpZF9oZHJfb2Zmc2V0KSB7CisJCXViaV9lcnIoImJhZCBWSUQgaGVhZGVyIG9mZnNldCAlZCwgZXhwZWN0ZWQgJWQiLAorCQkJdmlkX2hkcl9vZmZzZXQsIHViaS0+dmlkX2hkcl9vZmZzZXQpOworCQlnb3RvIGJhZDsKKwl9CisKKwlpZiAobGViX3N0YXJ0ICE9IHViaS0+bGViX3N0YXJ0KSB7CisJCXViaV9lcnIoImJhZCBkYXRhIG9mZnNldCAlZCwgZXhwZWN0ZWQgJWQiLAorCQkJbGViX3N0YXJ0LCB1YmktPmxlYl9zdGFydCk7CisJCWdvdG8gYmFkOworCX0KKworCWlmIChlYyA8IDAgfHwgZWMgPiBVQklfTUFYX0VSQVNFQ09VTlRFUikgeworCQl1YmlfZXJyKCJiYWQgZXJhc2UgY291bnRlciAlbGxkIiwgZWMpOworCQlnb3RvIGJhZDsKKwl9CisKKwlyZXR1cm4gMDsKKworYmFkOgorCXViaV9lcnIoImJhZCBFQyBoZWFkZXIiKTsKKwl1YmlfZGJnX2R1bXBfZWNfaGRyKGVjX2hkcik7CisJdWJpX2RiZ19kdW1wX3N0YWNrKCk7CisJcmV0dXJuIDE7Cit9CisKKy8qKgorICogdWJpX2lvX3JlYWRfZWNfaGRyIC0gcmVhZCBhbmQgY2hlY2sgYW4gZXJhc2UgY291bnRlciBoZWFkZXIuCisgKiBAdWJpOiBVQkkgZGV2aWNlIGRlc2NyaXB0aW9uIG9iamVjdAorICogQHBudW06IHBoeXNpY2FsIGVyYXNlYmxvY2sgdG8gcmVhZCBmcm9tCisgKiBAZWNfaGRyOiBhICZzdHJ1Y3QgdWJpX2VjX2hkciBvYmplY3Qgd2hlcmUgdG8gc3RvcmUgdGhlIHJlYWQgZXJhc2UgY291bnRlcgorICogaGVhZGVyCisgKiBAdmVyYm9zZTogYmUgdmVyYm9zZSBpZiB0aGUgaGVhZGVyIGlzIGNvcnJ1cHRlZCBvciB3YXMgbm90IGZvdW5kCisgKgorICogVGhpcyBmdW5jdGlvbiByZWFkcyBlcmFzZSBjb3VudGVyIGhlYWRlciBmcm9tIHBoeXNpY2FsIGVyYXNlYmxvY2sgQHBudW0gYW5kCisgKiBzdG9yZXMgaXQgaW4gQGVjX2hkci4gVGhpcyBmdW5jdGlvbiBhbHNvIGNoZWNrcyBDUkMgY2hlY2tzdW0gb2YgdGhlIHJlYWQKKyAqIGVyYXNlIGNvdW50ZXIgaGVhZGVyLiBUaGUgZm9sbG93aW5nIGNvZGVzIG1heSBiZSByZXR1cm5lZDoKKyAqCisgKiBvICUwIGlmIHRoZSBDUkMgY2hlY2tzdW0gaXMgY29ycmVjdCBhbmQgdGhlIGhlYWRlciB3YXMgc3VjY2Vzc2Z1bGx5IHJlYWQ7CisgKiBvICVVQklfSU9fQklURkxJUFMgaWYgdGhlIENSQyBpcyBjb3JyZWN0LCBidXQgYml0LWZsaXBzIHdlcmUgZGV0ZWN0ZWQKKyAqICAgYW5kIGNvcnJlY3RlZCBieSB0aGUgZmxhc2ggZHJpdmVyOyB0aGlzIGlzIGhhcm1sZXNzIGJ1dCBtYXkgaW5kaWNhdGUgdGhhdAorICogICB0aGlzIGVyYXNlYmxvY2sgbWF5IGJlY29tZSBiYWQgc29vbiAoYnV0IG1heSBiZSBub3QpOworICogbyAlVUJJX0lPX0JBRF9FQ19IRFIgaWYgdGhlIGVyYXNlIGNvdW50ZXIgaGVhZGVyIGlzIGNvcnJ1cHRlZCAoYSBDUkMgZXJyb3IpOworICogbyAlVUJJX0lPX1BFQl9FTVBUWSBpZiB0aGUgcGh5c2ljYWwgZXJhc2VibG9jayBpcyBlbXB0eTsKKyAqIG8gYSBuZWdhdGl2ZSBlcnJvciBjb2RlIGluIGNhc2Ugb2YgZmFpbHVyZS4KKyAqLworaW50IHViaV9pb19yZWFkX2VjX2hkcihjb25zdCBzdHJ1Y3QgdWJpX2RldmljZSAqdWJpLCBpbnQgcG51bSwKKwkJICAgICAgIHN0cnVjdCB1YmlfZWNfaGRyICplY19oZHIsIGludCB2ZXJib3NlKQoreworCWludCBlcnIsIHJlYWRfZXJyID0gMDsKKwl1aW50MzJfdCBjcmMsIG1hZ2ljLCBoZHJfY3JjOworCisJZGJnX2lvKCJyZWFkIEVDIGhlYWRlciBmcm9tIFBFQiAlZCIsIHBudW0pOworCXViaV9hc3NlcnQocG51bSA+PSAwICYmIHBudW0gPCB1YmktPnBlYl9jb3VudCk7CisKKwllcnIgPSB1YmlfaW9fcmVhZCh1YmksIGVjX2hkciwgcG51bSwgMCwgVUJJX0VDX0hEUl9TSVpFKTsKKwlpZiAoZXJyKSB7CisJCWlmIChlcnIgIT0gVUJJX0lPX0JJVEZMSVBTICYmIGVyciAhPSAtRUJBRE1TRykKKwkJCXJldHVybiBlcnI7CisKKwkJLyoKKwkJICogV2UgcmVhZCBhbGwgdGhlIGRhdGEsIGJ1dCBlaXRoZXIgYSBjb3JyZWN0YWJsZSBiaXQtZmxpcAorCQkgKiBvY2N1cnJlZCwgb3IgTVREIHJlcG9ydGVkIGFib3V0IHNvbWUgZGF0YSBpbnRlZ3JpdHkgZXJyb3IsCisJCSAqIGxpa2UgYW4gRUNDIGVycm9yIGluIGNhc2Ugb2YgTkFORC4gVGhlIGZvcm1lciBpcyBoYXJtbGVzcywKKwkJICogdGhlIGxhdGVyIG1heSBtZWFuIHRoYXQgdGhlIHJlYWQgZGF0YSBpcyBjb3JydXB0ZWQuIEJ1dCB3ZQorCQkgKiBoYXZlIGEgQ1JDIGNoZWNrLXN1bSBhbmQgd2Ugd2lsbCBkZXRlY3QgdGhpcy4gSWYgdGhlIEVDCisJCSAqIGhlYWRlciBpcyBzdGlsbCBPSywgd2UganVzdCByZXBvcnQgdGhpcyBhcyB0aGVyZSB3YXMgYQorCQkgKiBiaXQtZmxpcC4KKwkJICovCisJCXJlYWRfZXJyID0gZXJyOworCX0KKworCW1hZ2ljID0gdWJpMzJfdG9fY3B1KGVjX2hkci0+bWFnaWMpOworCWlmIChtYWdpYyAhPSBVQklfRUNfSERSX01BR0lDKSB7CisJCS8qCisJCSAqIFRoZSBtYWdpYyBmaWVsZCBpcyB3cm9uZy4gTGV0J3MgY2hlY2sgaWYgd2UgaGF2ZSByZWFkIGFsbAorCQkgKiAweEZGLiBJZiB5ZXMsIHRoaXMgcGh5c2ljYWwgZXJhc2VibG9jayBpcyBhc3N1bWVkIHRvIGJlCisJCSAqIGVtcHR5LgorCQkgKgorCQkgKiBCdXQgaWYgdGhlcmUgd2FzIGEgcmVhZCBlcnJvciwgd2UgZG8gbm90IHRlc3QgaXQgZm9yIGFsbAorCQkgKiAweEZGcy4gRXZlbiBpZiBpdCBkb2VzIGNvbnRhaW4gYWxsIDB4RkZzLCB0aGlzIGVycm9yCisJCSAqIGluZGljYXRlcyB0aGF0IHNvbWV0aGluZyBpcyBzdGlsbCB3cm9uZyB3aXRoIHRoaXMgcGh5c2ljYWwKKwkJICogZXJhc2VibG9jayBhbmQgd2UgYW55d2F5IGNhbm5vdCB0cmVhdCBpdCBhcyBlbXB0eS4KKwkJICovCisJCWlmIChyZWFkX2VyciAhPSAtRUJBRE1TRyAmJgorCQkgICAgY2hlY2tfcGF0dGVybihlY19oZHIsIDB4RkYsIFVCSV9FQ19IRFJfU0laRSkpIHsKKwkJCS8qIFRoZSBwaHlzaWNhbCBlcmFzZWJsb2NrIGlzIHN1cHBvc2VkbHkgZW1wdHkgKi8KKworCQkJLyoKKwkJCSAqIFRoZSBiZWxvdyBpcyBqdXN0IGEgcGFyYW5vaWQgY2hlY2ssIGl0IGhhcyB0byBiZQorCQkJICogY29tcGlsZWQgb3V0IGlmIHBhcmFub2lkIGNoZWNrcyBhcmUgZGlzYWJsZWQuCisJCQkgKi8KKwkJCWVyciA9IHBhcmFub2lkX2NoZWNrX2FsbF9mZih1YmksIHBudW0sIDAsCisJCQkJCQkgICAgdWJpLT5wZWJfc2l6ZSk7CisJCQlpZiAoZXJyKQorCQkJCXJldHVybiBlcnIgPiAwID8gVUJJX0lPX0JBRF9FQ19IRFIgOiBlcnI7CisKKwkJCWlmICh2ZXJib3NlKQorCQkJCXViaV93YXJuKCJubyBFQyBoZWFkZXIgZm91bmQgYXQgUEVCICVkLCAiCisJCQkJCSAib25seSAweEZGIGJ5dGVzIiwgcG51bSk7CisJCQlyZXR1cm4gVUJJX0lPX1BFQl9FTVBUWTsKKwkJfQorCisJCS8qCisJCSAqIFRoaXMgaXMgbm90IGEgdmFsaWQgZXJhc2UgY291bnRlciBoZWFkZXIsIGFuZCB0aGVzZSBhcmUgbm90CisJCSAqIDB4RkYgYnl0ZXMuIFJlcG9ydCB0aGF0IHRoZSBoZWFkZXIgaXMgY29ycnVwdGVkLgorCQkgKi8KKwkJaWYgKHZlcmJvc2UpIHsKKwkJCXViaV93YXJuKCJiYWQgbWFnaWMgbnVtYmVyIGF0IFBFQiAlZDogJTA4eCBpbnN0ZWFkIG9mICIKKwkJCQkgIiUwOHgiLCBwbnVtLCBtYWdpYywgVUJJX0VDX0hEUl9NQUdJQyk7CisJCQl1YmlfZGJnX2R1bXBfZWNfaGRyKGVjX2hkcik7CisJCX0KKwkJcmV0dXJuIFVCSV9JT19CQURfRUNfSERSOworCX0KKworCWNyYyA9IGNyYzMyKFVCSV9DUkMzMl9JTklULCBlY19oZHIsIFVCSV9FQ19IRFJfU0laRV9DUkMpOworCWhkcl9jcmMgPSB1YmkzMl90b19jcHUoZWNfaGRyLT5oZHJfY3JjKTsKKworCWlmIChoZHJfY3JjICE9IGNyYykgeworCQlpZiAodmVyYm9zZSkgeworCQkJdWJpX3dhcm4oImJhZCBFQyBoZWFkZXIgQ1JDIGF0IFBFQiAlZCwgY2FsY3VsYXRlZCAlIzA4eCwiCisJCQkJICIgcmVhZCAlIzA4eCIsIHBudW0sIGNyYywgaGRyX2NyYyk7CisJCQl1YmlfZGJnX2R1bXBfZWNfaGRyKGVjX2hkcik7CisJCX0KKwkJcmV0dXJuIFVCSV9JT19CQURfRUNfSERSOworCX0KKworCS8qIEFuZCBvZiBjb3Vyc2UgdmFsaWRhdGUgd2hhdCBoYXMganVzdCBiZWVuIHJlYWQgZnJvbSB0aGUgbWVkaWEgKi8KKwllcnIgPSB2YWxpZGF0ZV9lY19oZHIodWJpLCBlY19oZHIpOworCWlmIChlcnIpIHsKKwkJdWJpX2VycigidmFsaWRhdGlvbiBmYWlsZWQgZm9yIFBFQiAlZCIsIHBudW0pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gcmVhZF9lcnIgPyBVQklfSU9fQklURkxJUFMgOiAwOworfQorCisvKioKKyAqIHViaV9pb193cml0ZV9lY19oZHIgLSB3cml0ZSBhbiBlcmFzZSBjb3VudGVyIGhlYWRlci4KKyAqIEB1Ymk6IFVCSSBkZXZpY2UgZGVzY3JpcHRpb24gb2JqZWN0CisgKiBAcG51bTogcGh5c2ljYWwgZXJhc2VibG9jayB0byB3cml0ZSB0bworICogQGVjX2hkcjogdGhlIGVyYXNlIGNvdW50ZXIgaGVhZGVyIHRvIHdyaXRlCisgKgorICogVGhpcyBmdW5jdGlvbiB3cml0ZXMgZXJhc2UgY291bnRlciBoZWFkZXIgZGVzY3JpYmVkIGJ5IEBlY19oZHIgdG8gcGh5c2ljYWwKKyAqIGVyYXNlYmxvY2sgQHBudW0uIEl0IGFsc28gZmlsbHMgbW9zdCBmaWVsZHMgb2YgQGVjX2hkciBiZWZvcmUgd3JpdGluZywgc28KKyAqIHRoZSBjYWxsZXIgZG8gbm90IGhhdmUgdG8gZmlsbCB0aGVtLiBDYWxsZXJzIG11c3Qgb25seSBmaWxsIHRoZSBAZWNfaGRyLT5lYworICogZmllbGQuCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHplcm8gaW4gY2FzZSBvZiBzdWNjZXNzIGFuZCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgaW4KKyAqIGNhc2Ugb2YgZmFpbHVyZS4gSWYgJS1FSU8gaXMgcmV0dXJuZWQsIHRoZSBwaHlzaWNhbCBlcmFzZWJsb2NrIG1vc3QgcHJvYmFibHkKKyAqIHdlbnQgYmFkLgorICovCitpbnQgdWJpX2lvX3dyaXRlX2VjX2hkcihjb25zdCBzdHJ1Y3QgdWJpX2RldmljZSAqdWJpLCBpbnQgcG51bSwKKwkJCXN0cnVjdCB1YmlfZWNfaGRyICplY19oZHIpCit7CisJaW50IGVycjsKKwl1aW50MzJfdCBjcmM7CisKKwlkYmdfaW8oIndyaXRlIEVDIGhlYWRlciB0byBQRUIgJWQiLCBwbnVtKTsKKwl1YmlfYXNzZXJ0KHBudW0gPj0gMCAmJiAgcG51bSA8IHViaS0+cGViX2NvdW50KTsKKworCWVjX2hkci0+bWFnaWMgPSBjcHVfdG9fdWJpMzIoVUJJX0VDX0hEUl9NQUdJQyk7CisJZWNfaGRyLT52ZXJzaW9uID0gVUJJX1ZFUlNJT047CisJZWNfaGRyLT52aWRfaGRyX29mZnNldCA9IGNwdV90b191YmkzMih1YmktPnZpZF9oZHJfb2Zmc2V0KTsKKwllY19oZHItPmRhdGFfb2Zmc2V0ID0gY3B1X3RvX3ViaTMyKHViaS0+bGViX3N0YXJ0KTsKKwljcmMgPSBjcmMzMihVQklfQ1JDMzJfSU5JVCwgZWNfaGRyLCBVQklfRUNfSERSX1NJWkVfQ1JDKTsKKwllY19oZHItPmhkcl9jcmMgPSBjcHVfdG9fdWJpMzIoY3JjKTsKKworCWVyciA9IHBhcmFub2lkX2NoZWNrX2VjX2hkcih1YmksIHBudW0sIGVjX2hkcik7CisJaWYgKGVycikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwllcnIgPSB1YmlfaW9fd3JpdGUodWJpLCBlY19oZHIsIHBudW0sIDAsIHViaS0+ZWNfaGRyX2Fsc2l6ZSk7CisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKiB2YWxpZGF0ZV92aWRfaGRyIC0gdmFsaWRhdGUgYSB2b2x1bWUgaWRlbnRpZmllciBoZWFkZXIuCisgKiBAdWJpOiBVQkkgZGV2aWNlIGRlc2NyaXB0aW9uIG9iamVjdAorICogQHZpZF9oZHI6IHRoZSB2b2x1bWUgaWRlbnRpZmllciBoZWFkZXIgdG8gY2hlY2sKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNoZWNrcyB0aGF0IGRhdGEgc3RvcmVkIGluIHRoZSB2b2x1bWUgaWRlbnRpZmllciBoZWFkZXIKKyAqIEB2aWRfaGRyLiBSZXR1cm5zIHplcm8gaWYgdGhlIFZJRCBoZWFkZXIgaXMgT0sgYW5kICUxIGlmIG5vdC4KKyAqLworc3RhdGljIGludCB2YWxpZGF0ZV92aWRfaGRyKGNvbnN0IHN0cnVjdCB1YmlfZGV2aWNlICp1YmksCisJCQkgICAgY29uc3Qgc3RydWN0IHViaV92aWRfaGRyICp2aWRfaGRyKQoreworCWludCB2b2xfdHlwZSA9IHZpZF9oZHItPnZvbF90eXBlOworCWludCBjb3B5X2ZsYWcgPSB2aWRfaGRyLT5jb3B5X2ZsYWc7CisJaW50IHZvbF9pZCA9IHViaTMyX3RvX2NwdSh2aWRfaGRyLT52b2xfaWQpOworCWludCBsbnVtID0gdWJpMzJfdG9fY3B1KHZpZF9oZHItPmxudW0pOworCWludCBjb21wYXQgPSB2aWRfaGRyLT5jb21wYXQ7CisJaW50IGRhdGFfc2l6ZSA9IHViaTMyX3RvX2NwdSh2aWRfaGRyLT5kYXRhX3NpemUpOworCWludCB1c2VkX2VicyA9IHViaTMyX3RvX2NwdSh2aWRfaGRyLT51c2VkX2Vicyk7CisJaW50IGRhdGFfcGFkID0gdWJpMzJfdG9fY3B1KHZpZF9oZHItPmRhdGFfcGFkKTsKKwlpbnQgZGF0YV9jcmMgPSB1YmkzMl90b19jcHUodmlkX2hkci0+ZGF0YV9jcmMpOworCWludCB1c2FibGVfbGViX3NpemUgPSB1YmktPmxlYl9zaXplIC0gZGF0YV9wYWQ7CisKKwlpZiAoY29weV9mbGFnICE9IDAgJiYgY29weV9mbGFnICE9IDEpIHsKKwkJZGJnX2VycigiYmFkIGNvcHlfZmxhZyIpOworCQlnb3RvIGJhZDsKKwl9CisKKwlpZiAodm9sX2lkIDwgMCB8fCBsbnVtIDwgMCB8fCBkYXRhX3NpemUgPCAwIHx8IHVzZWRfZWJzIDwgMCB8fAorCSAgICBkYXRhX3BhZCA8IDApIHsKKwkJZGJnX2VycigibmVnYXRpdmUgdmFsdWVzIik7CisJCWdvdG8gYmFkOworCX0KKworCWlmICh2b2xfaWQgPj0gVUJJX01BWF9WT0xVTUVTICYmIHZvbF9pZCA8IFVCSV9JTlRFUk5BTF9WT0xfU1RBUlQpIHsKKwkJZGJnX2VycigiYmFkIHZvbF9pZCIpOworCQlnb3RvIGJhZDsKKwl9CisKKwlpZiAodm9sX2lkIDwgVUJJX0lOVEVSTkFMX1ZPTF9TVEFSVCAmJiBjb21wYXQgIT0gMCkgeworCQlkYmdfZXJyKCJiYWQgY29tcGF0Iik7CisJCWdvdG8gYmFkOworCX0KKworCWlmICh2b2xfaWQgPj0gVUJJX0lOVEVSTkFMX1ZPTF9TVEFSVCAmJiBjb21wYXQgIT0gVUJJX0NPTVBBVF9ERUxFVEUgJiYKKwkgICAgY29tcGF0ICE9IFVCSV9DT01QQVRfUk8gJiYgY29tcGF0ICE9IFVCSV9DT01QQVRfUFJFU0VSVkUgJiYKKwkgICAgY29tcGF0ICE9IFVCSV9DT01QQVRfUkVKRUNUKSB7CisJCWRiZ19lcnIoImJhZCBjb21wYXQiKTsKKwkJZ290byBiYWQ7CisJfQorCisJaWYgKHZvbF90eXBlICE9IFVCSV9WSURfRFlOQU1JQyAmJiB2b2xfdHlwZSAhPSBVQklfVklEX1NUQVRJQykgeworCQlkYmdfZXJyKCJiYWQgdm9sX3R5cGUiKTsKKwkJZ290byBiYWQ7CisJfQorCisJaWYgKGRhdGFfcGFkID49IHViaS0+bGViX3NpemUgLyAyKSB7CisJCWRiZ19lcnIoImJhZCBkYXRhX3BhZCIpOworCQlnb3RvIGJhZDsKKwl9CisKKwlpZiAodm9sX3R5cGUgPT0gVUJJX1ZJRF9TVEFUSUMpIHsKKwkJLyoKKwkJICogQWx0aG91Z2ggZnJvbSBoaWdoLWxldmVsIHBvaW50IG9mIHZpZXcgc3RhdGljIHZvbHVtZXMgbWF5CisJCSAqIGNvbnRhaW4gemVybyBieXRlcyBvZiBkYXRhLCBidXQgbm8gVklEIGhlYWRlcnMgY2FuIGNvbnRhaW4KKwkJICogemVybyBhdCB0aGVzZSBmaWVsZHMsIGJlY2F1c2UgdGhleSBlbXB0eSB2b2x1bWVzIGRvIG5vdCBoYXZlCisJCSAqIG1hcHBlZCBsb2dpY2FsIGVyYXNlYmxvY2tzLgorCQkgKi8KKwkJaWYgKHVzZWRfZWJzID09IDApIHsKKwkJCWRiZ19lcnIoInplcm8gdXNlZF9lYnMiKTsKKwkJCWdvdG8gYmFkOworCQl9CisJCWlmIChkYXRhX3NpemUgPT0gMCkgeworCQkJZGJnX2VycigiemVybyBkYXRhX3NpemUiKTsKKwkJCWdvdG8gYmFkOworCQl9CisJCWlmIChsbnVtIDwgdXNlZF9lYnMgLSAxKSB7CisJCQlpZiAoZGF0YV9zaXplICE9IHVzYWJsZV9sZWJfc2l6ZSkgeworCQkJCWRiZ19lcnIoImJhZCBkYXRhX3NpemUiKTsKKwkJCQlnb3RvIGJhZDsKKwkJCX0KKwkJfSBlbHNlIGlmIChsbnVtID09IHVzZWRfZWJzIC0gMSkgeworCQkJaWYgKGRhdGFfc2l6ZSA9PSAwKSB7CisJCQkJZGJnX2VycigiYmFkIGRhdGFfc2l6ZSBhdCBsYXN0IExFQiIpOworCQkJCWdvdG8gYmFkOworCQkJfQorCQl9IGVsc2UgeworCQkJZGJnX2VycigidG9vIGhpZ2ggbG51bSIpOworCQkJZ290byBiYWQ7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoY29weV9mbGFnID09IDApIHsKKwkJCWlmIChkYXRhX2NyYyAhPSAwKSB7CisJCQkJZGJnX2Vycigibm9uLXplcm8gZGF0YSBDUkMiKTsKKwkJCQlnb3RvIGJhZDsKKwkJCX0KKwkJCWlmIChkYXRhX3NpemUgIT0gMCkgeworCQkJCWRiZ19lcnIoIm5vbi16ZXJvIGRhdGFfc2l6ZSIpOworCQkJCWdvdG8gYmFkOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKGRhdGFfc2l6ZSA9PSAwKSB7CisJCQkJZGJnX2VycigiemVybyBkYXRhX3NpemUgb2YgY29weSIpOworCQkJCWdvdG8gYmFkOworCQkJfQorCQl9CisJCWlmICh1c2VkX2VicyAhPSAwKSB7CisJCQlkYmdfZXJyKCJiYWQgdXNlZF9lYnMiKTsKKwkJCWdvdG8gYmFkOworCQl9CisJfQorCisJcmV0dXJuIDA7CisKK2JhZDoKKwl1YmlfZXJyKCJiYWQgVklEIGhlYWRlciIpOworCXViaV9kYmdfZHVtcF92aWRfaGRyKHZpZF9oZHIpOworCXViaV9kYmdfZHVtcF9zdGFjaygpOworCXJldHVybiAxOworfQorCisvKioKKyAqIHViaV9pb19yZWFkX3ZpZF9oZHIgLSByZWFkIGFuZCBjaGVjayBhIHZvbHVtZSBpZGVudGlmaWVyIGhlYWRlci4KKyAqIEB1Ymk6IFVCSSBkZXZpY2UgZGVzY3JpcHRpb24gb2JqZWN0CisgKiBAcG51bTogcGh5c2ljYWwgZXJhc2VibG9jayBudW1iZXIgdG8gcmVhZCBmcm9tCisgKiBAdmlkX2hkcjogJnN0cnVjdCB1YmlfdmlkX2hkciBvYmplY3Qgd2hlcmUgdG8gc3RvcmUgdGhlIHJlYWQgdm9sdW1lCisgKiBpZGVudGlmaWVyIGhlYWRlcgorICogQHZlcmJvc2U6IGJlIHZlcmJvc2UgaWYgdGhlIGhlYWRlciBpcyBjb3JydXB0ZWQgb3Igd2Fzbid0IGZvdW5kCisgKgorICogVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgdm9sdW1lIGlkZW50aWZpZXIgaGVhZGVyIGZyb20gcGh5c2ljYWwgZXJhc2VibG9jaworICogQHBudW0gYW5kIHN0b3JlcyBpdCBpbiBAdmlkX2hkci4gSXQgYWxzbyBjaGVja3MgQ1JDIGNoZWNrc3VtIG9mIHRoZSByZWFkCisgKiB2b2x1bWUgaWRlbnRpZmllciBoZWFkZXIuIFRoZSBmb2xsb3dpbmcgY29kZXMgbWF5IGJlIHJldHVybmVkOgorICoKKyAqIG8gJTAgaWYgdGhlIENSQyBjaGVja3N1bSBpcyBjb3JyZWN0IGFuZCB0aGUgaGVhZGVyIHdhcyBzdWNjZXNzZnVsbHkgcmVhZDsKKyAqIG8gJVVCSV9JT19CSVRGTElQUyBpZiB0aGUgQ1JDIGlzIGNvcnJlY3QsIGJ1dCBiaXQtZmxpcHMgd2VyZSBkZXRlY3RlZAorICogICBhbmQgY29ycmVjdGVkIGJ5IHRoZSBmbGFzaCBkcml2ZXI7IHRoaXMgaXMgaGFybWxlc3MgYnV0IG1heSBpbmRpY2F0ZSB0aGF0CisgKiAgIHRoaXMgZXJhc2VibG9jayBtYXkgYmVjb21lIGJhZCBzb29uOworICogbyAlVUJJX0lPX0JBRF9WSURfSFJEIGlmIHRoZSB2b2x1bWUgaWRlbnRpZmllciBoZWFkZXIgaXMgY29ycnVwdGVkIChhIENSQworICogICBlcnJvciBkZXRlY3RlZCk7CisgKiBvICVVQklfSU9fUEVCX0ZSRUUgaWYgdGhlIHBoeXNpY2FsIGVyYXNlYmxvY2sgaXMgZnJlZSAoaS5lLiwgdGhlcmUgaXMgbm8gVklECisgKiAgIGhlYWRlciB0aGVyZSk7CisgKiBvIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBpbiBjYXNlIG9mIGZhaWx1cmUuCisgKi8KK2ludCB1YmlfaW9fcmVhZF92aWRfaGRyKGNvbnN0IHN0cnVjdCB1YmlfZGV2aWNlICp1YmksIGludCBwbnVtLAorCQkJc3RydWN0IHViaV92aWRfaGRyICp2aWRfaGRyLCBpbnQgdmVyYm9zZSkKK3sKKwlpbnQgZXJyLCByZWFkX2VyciA9IDA7CisJdWludDMyX3QgY3JjLCBtYWdpYywgaGRyX2NyYzsKKwl2b2lkICpwOworCisJZGJnX2lvKCJyZWFkIFZJRCBoZWFkZXIgZnJvbSBQRUIgJWQiLCBwbnVtKTsKKwl1YmlfYXNzZXJ0KHBudW0gPj0gMCAmJiAgcG51bSA8IHViaS0+cGViX2NvdW50KTsKKworCXAgPSAoY2hhciAqKXZpZF9oZHIgLSB1YmktPnZpZF9oZHJfc2hpZnQ7CisJZXJyID0gdWJpX2lvX3JlYWQodWJpLCBwLCBwbnVtLCB1YmktPnZpZF9oZHJfYWxvZmZzZXQsCisJCQkgIHViaS0+dmlkX2hkcl9hbHNpemUpOworCWlmIChlcnIpIHsKKwkJaWYgKGVyciAhPSBVQklfSU9fQklURkxJUFMgJiYgZXJyICE9IC1FQkFETVNHKQorCQkJcmV0dXJuIGVycjsKKworCQkvKgorCQkgKiBXZSByZWFkIGFsbCB0aGUgZGF0YSwgYnV0IGVpdGhlciBhIGNvcnJlY3RhYmxlIGJpdC1mbGlwCisJCSAqIG9jY3VycmVkLCBvciBNVEQgcmVwb3J0ZWQgYWJvdXQgc29tZSBkYXRhIGludGVncml0eSBlcnJvciwKKwkJICogbGlrZSBhbiBFQ0MgZXJyb3IgaW4gY2FzZSBvZiBOQU5ELiBUaGUgZm9ybWVyIGlzIGhhcm1sZXNzLAorCQkgKiB0aGUgbGF0ZXIgbWF5IG1lYW4gdGhlIHJlYWQgZGF0YSBpcyBjb3JydXB0ZWQuIEJ1dCB3ZSBoYXZlIGEKKwkJICogQ1JDIGNoZWNrLXN1bSBhbmQgd2Ugd2lsbCBpZGVudGlmeSB0aGlzLiBJZiB0aGUgVklEIGhlYWRlciBpcworCQkgKiBzdGlsbCBPSywgd2UganVzdCByZXBvcnQgdGhpcyBhcyB0aGVyZSB3YXMgYSBiaXQtZmxpcC4KKwkJICovCisJCXJlYWRfZXJyID0gZXJyOworCX0KKworCW1hZ2ljID0gdWJpMzJfdG9fY3B1KHZpZF9oZHItPm1hZ2ljKTsKKwlpZiAobWFnaWMgIT0gVUJJX1ZJRF9IRFJfTUFHSUMpIHsKKwkJLyoKKwkJICogSWYgd2UgaGF2ZSByZWFkIGFsbCAweEZGIGJ5dGVzLCB0aGUgVklEIGhlYWRlciBwcm9iYWJseSBkb2VzCisJCSAqIG5vdCBleGlzdCBhbmQgdGhlIHBoeXNpY2FsIGVyYXNlYmxvY2sgaXMgYXNzdW1lZCB0byBiZSBmcmVlLgorCQkgKgorCQkgKiBCdXQgaWYgdGhlcmUgd2FzIGEgcmVhZCBlcnJvciwgd2UgZG8gbm90IHRlc3QgdGhlIGRhdGEgZm9yCisJCSAqIDB4RkZzLiBFdmVuIGlmIGl0IGRvZXMgY29udGFpbiBhbGwgMHhGRnMsIHRoaXMgZXJyb3IKKwkJICogaW5kaWNhdGVzIHRoYXQgc29tZXRoaW5nIGlzIHN0aWxsIHdyb25nIHdpdGggdGhpcyBwaHlzaWNhbAorCQkgKiBlcmFzZWJsb2NrIGFuZCBpdCBjYW5ub3QgYmUgcmVnYXJkZWQgYXMgZnJlZS4KKwkJICovCisJCWlmIChyZWFkX2VyciAhPSAtRUJBRE1TRyAmJgorCQkgICAgY2hlY2tfcGF0dGVybih2aWRfaGRyLCAweEZGLCBVQklfVklEX0hEUl9TSVpFKSkgeworCQkJLyogVGhlIHBoeXNpY2FsIGVyYXNlYmxvY2sgaXMgc3VwcG9zZWRseSBmcmVlICovCisKKwkJCS8qCisJCQkgKiBUaGUgYmVsb3cgaXMganVzdCBhIHBhcmFub2lkIGNoZWNrLCBpdCBoYXMgdG8gYmUKKwkJCSAqIGNvbXBpbGVkIG91dCBpZiBwYXJhbm9pZCBjaGVja3MgYXJlIGRpc2FibGVkLgorCQkJICovCisJCQllcnIgPSBwYXJhbm9pZF9jaGVja19hbGxfZmYodWJpLCBwbnVtLCB1YmktPmxlYl9zdGFydCwKKwkJCQkJCSAgICB1YmktPmxlYl9zaXplKTsKKwkJCWlmIChlcnIpCisJCQkJcmV0dXJuIGVyciA+IDAgPyBVQklfSU9fQkFEX1ZJRF9IRFIgOiBlcnI7CisKKwkJCWlmICh2ZXJib3NlKQorCQkJCXViaV93YXJuKCJubyBWSUQgaGVhZGVyIGZvdW5kIGF0IFBFQiAlZCwgIgorCQkJCQkgIm9ubHkgMHhGRiBieXRlcyIsIHBudW0pOworCQkJcmV0dXJuIFVCSV9JT19QRUJfRlJFRTsKKwkJfQorCisJCS8qCisJCSAqIFRoaXMgaXMgbm90IGEgdmFsaWQgVklEIGhlYWRlciwgYW5kIHRoZXNlIGFyZSBub3QgMHhGRgorCQkgKiBieXRlcy4gUmVwb3J0IHRoYXQgdGhlIGhlYWRlciBpcyBjb3JydXB0ZWQuCisJCSAqLworCQlpZiAodmVyYm9zZSkgeworCQkJdWJpX3dhcm4oImJhZCBtYWdpYyBudW1iZXIgYXQgUEVCICVkOiAlMDh4IGluc3RlYWQgb2YgIgorCQkJCSAiJTA4eCIsIHBudW0sIG1hZ2ljLCBVQklfVklEX0hEUl9NQUdJQyk7CisJCQl1YmlfZGJnX2R1bXBfdmlkX2hkcih2aWRfaGRyKTsKKwkJfQorCQlyZXR1cm4gVUJJX0lPX0JBRF9WSURfSERSOworCX0KKworCWNyYyA9IGNyYzMyKFVCSV9DUkMzMl9JTklULCB2aWRfaGRyLCBVQklfVklEX0hEUl9TSVpFX0NSQyk7CisJaGRyX2NyYyA9IHViaTMyX3RvX2NwdSh2aWRfaGRyLT5oZHJfY3JjKTsKKworCWlmIChoZHJfY3JjICE9IGNyYykgeworCQlpZiAodmVyYm9zZSkgeworCQkJdWJpX3dhcm4oImJhZCBDUkMgYXQgUEVCICVkLCBjYWxjdWxhdGVkICUjMDh4LCAiCisJCQkJICJyZWFkICUjMDh4IiwgcG51bSwgY3JjLCBoZHJfY3JjKTsKKwkJCXViaV9kYmdfZHVtcF92aWRfaGRyKHZpZF9oZHIpOworCQl9CisJCXJldHVybiBVQklfSU9fQkFEX1ZJRF9IRFI7CisJfQorCisJLyogVmFsaWRhdGUgdGhlIFZJRCBoZWFkZXIgdGhhdCB3ZSBoYXZlIGp1c3QgcmVhZCAqLworCWVyciA9IHZhbGlkYXRlX3ZpZF9oZHIodWJpLCB2aWRfaGRyKTsKKwlpZiAoZXJyKSB7CisJCXViaV9lcnIoInZhbGlkYXRpb24gZmFpbGVkIGZvciBQRUIgJWQiLCBwbnVtKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHJlYWRfZXJyID8gVUJJX0lPX0JJVEZMSVBTIDogMDsKK30KKworLyoqCisgKiB1YmlfaW9fd3JpdGVfdmlkX2hkciAtIHdyaXRlIGEgdm9sdW1lIGlkZW50aWZpZXIgaGVhZGVyLgorICogQHViaTogVUJJIGRldmljZSBkZXNjcmlwdGlvbiBvYmplY3QKKyAqIEBwbnVtOiB0aGUgcGh5c2ljYWwgZXJhc2VibG9jayBudW1iZXIgdG8gd3JpdGUgdG8KKyAqIEB2aWRfaGRyOiB0aGUgdm9sdW1lIGlkZW50aWZpZXIgaGVhZGVyIHRvIHdyaXRlCisgKgorICogVGhpcyBmdW5jdGlvbiB3cml0ZXMgdGhlIHZvbHVtZSBpZGVudGlmaWVyIGhlYWRlciBkZXNjcmliZWQgYnkgQHZpZF9oZHIgdG8KKyAqIHBoeXNpY2FsIGVyYXNlYmxvY2sgQHBudW0uIFRoaXMgZnVuY3Rpb24gYXV0b21hdGljYWxseSBmaWxscyB0aGUKKyAqIEB2aWRfaGRyLT5tYWdpYyBhbmQgdGhlIEB2aWRfaGRyLT52ZXJzaW9uIGZpZWxkcywgYXMgd2VsbCBhcyBjYWxjdWxhdGVzCisgKiBoZWFkZXIgQ1JDIGNoZWNrc3VtIGFuZCBzdG9yZXMgaXQgYXQgdmlkX2hkci0+aGRyX2NyYy4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgemVybyBpbiBjYXNlIG9mIHN1Y2Nlc3MgYW5kIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBpbgorICogY2FzZSBvZiBmYWlsdXJlLiBJZiAlLUVJTyBpcyByZXR1cm5lZCwgdGhlIHBoeXNpY2FsIGVyYXNlYmxvY2sgcHJvYmFibHkgd2VudAorICogYmFkLgorICovCitpbnQgdWJpX2lvX3dyaXRlX3ZpZF9oZHIoY29uc3Qgc3RydWN0IHViaV9kZXZpY2UgKnViaSwgaW50IHBudW0sCisJCQkgc3RydWN0IHViaV92aWRfaGRyICp2aWRfaGRyKQoreworCWludCBlcnI7CisJdWludDMyX3QgY3JjOworCXZvaWQgKnA7CisKKwlkYmdfaW8oIndyaXRlIFZJRCBoZWFkZXIgdG8gUEVCICVkIiwgcG51bSk7CisJdWJpX2Fzc2VydChwbnVtID49IDAgJiYgIHBudW0gPCB1YmktPnBlYl9jb3VudCk7CisKKwllcnIgPSBwYXJhbm9pZF9jaGVja19wZWJfZWNfaGRyKHViaSwgcG51bSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVyciA+IDAgPyAtRUlOVkFMOiBlcnI7CisKKwl2aWRfaGRyLT5tYWdpYyA9IGNwdV90b191YmkzMihVQklfVklEX0hEUl9NQUdJQyk7CisJdmlkX2hkci0+dmVyc2lvbiA9IFVCSV9WRVJTSU9OOworCWNyYyA9IGNyYzMyKFVCSV9DUkMzMl9JTklULCB2aWRfaGRyLCBVQklfVklEX0hEUl9TSVpFX0NSQyk7CisJdmlkX2hkci0+aGRyX2NyYyA9IGNwdV90b191YmkzMihjcmMpOworCisJZXJyID0gcGFyYW5vaWRfY2hlY2tfdmlkX2hkcih1YmksIHBudW0sIHZpZF9oZHIpOworCWlmIChlcnIpCisJCXJldHVybiAtRUlOVkFMOworCisJcCA9IChjaGFyICopdmlkX2hkciAtIHViaS0+dmlkX2hkcl9zaGlmdDsKKwllcnIgPSB1YmlfaW9fd3JpdGUodWJpLCBwLCBwbnVtLCB1YmktPnZpZF9oZHJfYWxvZmZzZXQsCisJCQkgICB1YmktPnZpZF9oZHJfYWxzaXplKTsKKwlyZXR1cm4gZXJyOworfQorCisjaWZkZWYgQ09ORklHX01URF9VQklfREVCVUdfUEFSQU5PSUQKKworLyoqCisgKiBwYXJhbm9pZF9jaGVja19ub3RfYmFkIC0gZW5zdXJlIHRoYXQgYSBwaHlzaWNhbCBlcmFzZWJsb2NrIGlzIG5vdCBiYWQuCisgKiBAdWJpOiBVQkkgZGV2aWNlIGRlc2NyaXB0aW9uIG9iamVjdAorICogQHBudW06IHBoeXNpY2FsIGVyYXNlYmxvY2sgbnVtYmVyIHRvIGNoZWNrCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHplcm8gaWYgdGhlIHBoeXNpY2FsIGVyYXNlYmxvY2sgaXMgZ29vZCwgYSBwb3NpdGl2ZQorICogbnVtYmVyIGlmIGl0IGlzIGJhZCBhbmQgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIGlmIGFuIGVycm9yIG9jY3VycmVkLgorICovCitzdGF0aWMgaW50IHBhcmFub2lkX2NoZWNrX25vdF9iYWQoY29uc3Qgc3RydWN0IHViaV9kZXZpY2UgKnViaSwgaW50IHBudW0pCit7CisJaW50IGVycjsKKworCWVyciA9IHViaV9pb19pc19iYWQodWJpLCBwbnVtKTsKKwlpZiAoIWVycikKKwkJcmV0dXJuIGVycjsKKworCXViaV9lcnIoInBhcmFub2lkIGNoZWNrIGZhaWxlZCBmb3IgUEVCICVkIiwgcG51bSk7CisJdWJpX2RiZ19kdW1wX3N0YWNrKCk7CisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKiBwYXJhbm9pZF9jaGVja19lY19oZHIgLSBjaGVjayBpZiBhbiBlcmFzZSBjb3VudGVyIGhlYWRlciBpcyBhbGwgcmlnaHQuCisgKiBAdWJpOiBVQkkgZGV2aWNlIGRlc2NyaXB0aW9uIG9iamVjdAorICogQHBudW06IHBoeXNpY2FsIGVyYXNlYmxvY2sgbnVtYmVyIHRoZSBlcmFzZSBjb3VudGVyIGhlYWRlciBiZWxvbmdzIHRvCisgKiBAZWNfaGRyOiB0aGUgZXJhc2UgY291bnRlciBoZWFkZXIgdG8gY2hlY2sKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgemVybyBpZiB0aGUgZXJhc2UgY291bnRlciBoZWFkZXIgY29udGFpbnMgdmFsaWQKKyAqIHZhbHVlcywgYW5kICUxIGlmIG5vdC4KKyAqLworc3RhdGljIGludCBwYXJhbm9pZF9jaGVja19lY19oZHIoY29uc3Qgc3RydWN0IHViaV9kZXZpY2UgKnViaSwgaW50IHBudW0sCisJCQkJIGNvbnN0IHN0cnVjdCB1YmlfZWNfaGRyICplY19oZHIpCit7CisJaW50IGVycjsKKwl1aW50MzJfdCBtYWdpYzsKKworCW1hZ2ljID0gdWJpMzJfdG9fY3B1KGVjX2hkci0+bWFnaWMpOworCWlmIChtYWdpYyAhPSBVQklfRUNfSERSX01BR0lDKSB7CisJCXViaV9lcnIoImJhZCBtYWdpYyAlIzA4eCwgbXVzdCBiZSAlIzA4eCIsCisJCQltYWdpYywgVUJJX0VDX0hEUl9NQUdJQyk7CisJCWdvdG8gZmFpbDsKKwl9CisKKwllcnIgPSB2YWxpZGF0ZV9lY19oZHIodWJpLCBlY19oZHIpOworCWlmIChlcnIpIHsKKwkJdWJpX2VycigicGFyYW5vaWQgY2hlY2sgZmFpbGVkIGZvciBQRUIgJWQiLCBwbnVtKTsKKwkJZ290byBmYWlsOworCX0KKworCXJldHVybiAwOworCitmYWlsOgorCXViaV9kYmdfZHVtcF9lY19oZHIoZWNfaGRyKTsKKwl1YmlfZGJnX2R1bXBfc3RhY2soKTsKKwlyZXR1cm4gMTsKK30KKworLyoqCisgKiBwYXJhbm9pZF9jaGVja19wZWJfZWNfaGRyIC0gY2hlY2sgdGhhdCB0aGUgZXJhc2UgY291bnRlciBoZWFkZXIgb2YgYQorICogcGh5c2ljYWwgZXJhc2VibG9jayBpcyBpbi1wbGFjZSBhbmQgaXMgYWxsIHJpZ2h0LgorICogQHViaTogVUJJIGRldmljZSBkZXNjcmlwdGlvbiBvYmplY3QKKyAqIEBwbnVtOiB0aGUgcGh5c2ljYWwgZXJhc2VibG9jayBudW1iZXIgdG8gY2hlY2sKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgemVybyBpZiB0aGUgZXJhc2UgY291bnRlciBoZWFkZXIgaXMgYWxsIHJpZ2h0LCAlMSBpZgorICogbm90LCBhbmQgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIGlmIGFuIGVycm9yIG9jY3VycmVkLgorICovCitzdGF0aWMgaW50IHBhcmFub2lkX2NoZWNrX3BlYl9lY19oZHIoY29uc3Qgc3RydWN0IHViaV9kZXZpY2UgKnViaSwgaW50IHBudW0pCit7CisJaW50IGVycjsKKwl1aW50MzJfdCBjcmMsIGhkcl9jcmM7CisJc3RydWN0IHViaV9lY19oZHIgKmVjX2hkcjsKKworCWVjX2hkciA9IGt6YWxsb2ModWJpLT5lY19oZHJfYWxzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWVjX2hkcikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwllcnIgPSB1YmlfaW9fcmVhZCh1YmksIGVjX2hkciwgcG51bSwgMCwgVUJJX0VDX0hEUl9TSVpFKTsKKwlpZiAoZXJyICYmIGVyciAhPSBVQklfSU9fQklURkxJUFMgJiYgZXJyICE9IC1FQkFETVNHKQorCQlnb3RvIGV4aXQ7CisKKwljcmMgPSBjcmMzMihVQklfQ1JDMzJfSU5JVCwgZWNfaGRyLCBVQklfRUNfSERSX1NJWkVfQ1JDKTsKKwloZHJfY3JjID0gdWJpMzJfdG9fY3B1KGVjX2hkci0+aGRyX2NyYyk7CisJaWYgKGhkcl9jcmMgIT0gY3JjKSB7CisJCXViaV9lcnIoImJhZCBDUkMsIGNhbGN1bGF0ZWQgJSMwOHgsIHJlYWQgJSMwOHgiLCBjcmMsIGhkcl9jcmMpOworCQl1YmlfZXJyKCJwYXJhbm9pZCBjaGVjayBmYWlsZWQgZm9yIFBFQiAlZCIsIHBudW0pOworCQl1YmlfZGJnX2R1bXBfZWNfaGRyKGVjX2hkcik7CisJCXViaV9kYmdfZHVtcF9zdGFjaygpOworCQllcnIgPSAxOworCQlnb3RvIGV4aXQ7CisJfQorCisJZXJyID0gcGFyYW5vaWRfY2hlY2tfZWNfaGRyKHViaSwgcG51bSwgZWNfaGRyKTsKKworZXhpdDoKKwlrZnJlZShlY19oZHIpOworCXJldHVybiBlcnI7Cit9CisKKy8qKgorICogcGFyYW5vaWRfY2hlY2tfdmlkX2hkciAtIGNoZWNrIHRoYXQgYSB2b2x1bWUgaWRlbnRpZmllciBoZWFkZXIgaXMgYWxsIHJpZ2h0LgorICogQHViaTogVUJJIGRldmljZSBkZXNjcmlwdGlvbiBvYmplY3QKKyAqIEBwbnVtOiBwaHlzaWNhbCBlcmFzZWJsb2NrIG51bWJlciB0aGUgdm9sdW1lIGlkZW50aWZpZXIgaGVhZGVyIGJlbG9uZ3MgdG8KKyAqIEB2aWRfaGRyOiB0aGUgdm9sdW1lIGlkZW50aWZpZXIgaGVhZGVyIHRvIGNoZWNrCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHplcm8gaWYgdGhlIHZvbHVtZSBpZGVudGlmaWVyIGhlYWRlciBpcyBhbGwgcmlnaHQsIGFuZAorICogJTEgaWYgbm90LgorICovCitzdGF0aWMgaW50IHBhcmFub2lkX2NoZWNrX3ZpZF9oZHIoY29uc3Qgc3RydWN0IHViaV9kZXZpY2UgKnViaSwgaW50IHBudW0sCisJCQkJICBjb25zdCBzdHJ1Y3QgdWJpX3ZpZF9oZHIgKnZpZF9oZHIpCit7CisJaW50IGVycjsKKwl1aW50MzJfdCBtYWdpYzsKKworCW1hZ2ljID0gdWJpMzJfdG9fY3B1KHZpZF9oZHItPm1hZ2ljKTsKKwlpZiAobWFnaWMgIT0gVUJJX1ZJRF9IRFJfTUFHSUMpIHsKKwkJdWJpX2VycigiYmFkIFZJRCBoZWFkZXIgbWFnaWMgJSMwOHggYXQgUEVCICVkLCBtdXN0IGJlICUjMDh4IiwKKwkJCW1hZ2ljLCBwbnVtLCBVQklfVklEX0hEUl9NQUdJQyk7CisJCWdvdG8gZmFpbDsKKwl9CisKKwllcnIgPSB2YWxpZGF0ZV92aWRfaGRyKHViaSwgdmlkX2hkcik7CisJaWYgKGVycikgeworCQl1YmlfZXJyKCJwYXJhbm9pZCBjaGVjayBmYWlsZWQgZm9yIFBFQiAlZCIsIHBudW0pOworCQlnb3RvIGZhaWw7CisJfQorCisJcmV0dXJuIGVycjsKKworZmFpbDoKKwl1YmlfZXJyKCJwYXJhbm9pZCBjaGVjayBmYWlsZWQgZm9yIFBFQiAlZCIsIHBudW0pOworCXViaV9kYmdfZHVtcF92aWRfaGRyKHZpZF9oZHIpOworCXViaV9kYmdfZHVtcF9zdGFjaygpOworCXJldHVybiAxOworCit9CisKKy8qKgorICogcGFyYW5vaWRfY2hlY2tfcGViX3ZpZF9oZHIgLSBjaGVjayB0aGF0IHRoZSB2b2x1bWUgaWRlbnRpZmllciBoZWFkZXIgb2YgYQorICogcGh5c2ljYWwgZXJhc2VibG9jayBpcyBpbi1wbGFjZSBhbmQgaXMgYWxsIHJpZ2h0LgorICogQHViaTogVUJJIGRldmljZSBkZXNjcmlwdGlvbiBvYmplY3QKKyAqIEBwbnVtOiB0aGUgcGh5c2ljYWwgZXJhc2VibG9jayBudW1iZXIgdG8gY2hlY2sKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgemVybyBpZiB0aGUgdm9sdW1lIGlkZW50aWZpZXIgaGVhZGVyIGlzIGFsbCByaWdodCwKKyAqICUxIGlmIG5vdCwgYW5kIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBpZiBhbiBlcnJvciBvY2N1cnJlZC4KKyAqLworc3RhdGljIGludCBwYXJhbm9pZF9jaGVja19wZWJfdmlkX2hkcihjb25zdCBzdHJ1Y3QgdWJpX2RldmljZSAqdWJpLCBpbnQgcG51bSkKK3sKKwlpbnQgZXJyOworCXVpbnQzMl90IGNyYywgaGRyX2NyYzsKKwlzdHJ1Y3QgdWJpX3ZpZF9oZHIgKnZpZF9oZHI7CisJdm9pZCAqcDsKKworCXZpZF9oZHIgPSB1YmlfemFsbG9jX3ZpZF9oZHIodWJpKTsKKwlpZiAoIXZpZF9oZHIpCisJCXJldHVybiAtRU5PTUVNOworCisJcCA9IChjaGFyICopdmlkX2hkciAtIHViaS0+dmlkX2hkcl9zaGlmdDsKKwllcnIgPSB1YmlfaW9fcmVhZCh1YmksIHAsIHBudW0sIHViaS0+dmlkX2hkcl9hbG9mZnNldCwKKwkJCSAgdWJpLT52aWRfaGRyX2Fsc2l6ZSk7CisJaWYgKGVyciAmJiBlcnIgIT0gVUJJX0lPX0JJVEZMSVBTICYmIGVyciAhPSAtRUJBRE1TRykKKwkJZ290byBleGl0OworCisJY3JjID0gY3JjMzIoVUJJX0NSQzMyX0lOSVQsIHZpZF9oZHIsIFVCSV9FQ19IRFJfU0laRV9DUkMpOworCWhkcl9jcmMgPSB1YmkzMl90b19jcHUodmlkX2hkci0+aGRyX2NyYyk7CisJaWYgKGhkcl9jcmMgIT0gY3JjKSB7CisJCXViaV9lcnIoImJhZCBWSUQgaGVhZGVyIENSQyBhdCBQRUIgJWQsIGNhbGN1bGF0ZWQgJSMwOHgsICIKKwkJCSJyZWFkICUjMDh4IiwgcG51bSwgY3JjLCBoZHJfY3JjKTsKKwkJdWJpX2VycigicGFyYW5vaWQgY2hlY2sgZmFpbGVkIGZvciBQRUIgJWQiLCBwbnVtKTsKKwkJdWJpX2RiZ19kdW1wX3ZpZF9oZHIodmlkX2hkcik7CisJCXViaV9kYmdfZHVtcF9zdGFjaygpOworCQllcnIgPSAxOworCQlnb3RvIGV4aXQ7CisJfQorCisJZXJyID0gcGFyYW5vaWRfY2hlY2tfdmlkX2hkcih1YmksIHBudW0sIHZpZF9oZHIpOworCitleGl0OgorCXViaV9mcmVlX3ZpZF9oZHIodWJpLCB2aWRfaGRyKTsKKwlyZXR1cm4gZXJyOworfQorCisvKioKKyAqIHBhcmFub2lkX2NoZWNrX2FsbF9mZiAtIGNoZWNrIHRoYXQgYSByZWdpb24gb2YgZmxhc2ggaXMgZW1wdHkuCisgKiBAdWJpOiBVQkkgZGV2aWNlIGRlc2NyaXB0aW9uIG9iamVjdAorICogQHBudW06IHRoZSBwaHlzaWNhbCBlcmFzZWJsb2NrIG51bWJlciB0byBjaGVjaworICogQG9mZnNldDogdGhlIHN0YXJ0aW5nIG9mZnNldCB3aXRoaW4gdGhlIHBoeXNpY2FsIGVyYXNlYmxvY2sgdG8gY2hlY2sKKyAqIEBsZW46IHRoZSBsZW5ndGggb2YgdGhlIHJlZ2lvbiB0byBjaGVjaworICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB6ZXJvIGlmIG9ubHkgMHhGRiBieXRlcyBhcmUgcHJlc2VudCBhdCBvZmZzZXQKKyAqIEBvZmZzZXQgb2YgdGhlIHBoeXNpY2FsIGVyYXNlYmxvY2sgQHBudW0sICUxIGlmIG5vdCwgYW5kIGEgbmVnYXRpdmUgZXJyb3IKKyAqIGNvZGUgaWYgYW4gZXJyb3Igb2NjdXJyZWQuCisgKi8KK3N0YXRpYyBpbnQgcGFyYW5vaWRfY2hlY2tfYWxsX2ZmKGNvbnN0IHN0cnVjdCB1YmlfZGV2aWNlICp1YmksIGludCBwbnVtLAorCQkJCSBpbnQgb2Zmc2V0LCBpbnQgbGVuKQoreworCXNpemVfdCByZWFkOworCWludCBlcnI7CisJdm9pZCAqYnVmOworCWxvZmZfdCBhZGRyID0gKGxvZmZfdClwbnVtICogdWJpLT5wZWJfc2l6ZSArIG9mZnNldDsKKworCWJ1ZiA9IGt6YWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwllcnIgPSB1YmktPm10ZC0+cmVhZCh1YmktPm10ZCwgYWRkciwgbGVuLCAmcmVhZCwgYnVmKTsKKwlpZiAoZXJyICYmIGVyciAhPSAtRVVDTEVBTikgeworCQl1YmlfZXJyKCJlcnJvciAlZCB3aGlsZSByZWFkaW5nICVkIGJ5dGVzIGZyb20gUEVCICVkOiVkLCAiCisJCQkicmVhZCAlemQgYnl0ZXMiLCBlcnIsIGxlbiwgcG51bSwgb2Zmc2V0LCByZWFkKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwllcnIgPSBjaGVja19wYXR0ZXJuKGJ1ZiwgMHhGRiwgbGVuKTsKKwlpZiAoZXJyID09IDApIHsKKwkJdWJpX2VycigiZmxhc2ggcmVnaW9uIGF0IFBFQiAlZDolZCwgbGVuZ3RoICVkIGRvZXMgbm90ICIKKwkJCSJjb250YWluIGFsbCAweEZGIGJ5dGVzIiwgcG51bSwgb2Zmc2V0LCBsZW4pOworCQlnb3RvIGZhaWw7CisJfQorCisJa2ZyZWUoYnVmKTsKKwlyZXR1cm4gMDsKKworZmFpbDoKKwl1YmlfZXJyKCJwYXJhbm9pZCBjaGVjayBmYWlsZWQgZm9yIFBFQiAlZCIsIHBudW0pOworCWRiZ19tc2coImhleCBkdW1wIG9mIHRoZSAlZC0lZCByZWdpb24iLCBvZmZzZXQsIG9mZnNldCArIGxlbik7CisJdWJpX2RiZ19oZXhkdW1wKGJ1ZiwgbGVuKTsKKwllcnIgPSAxOworZXJyb3I6CisJdWJpX2RiZ19kdW1wX3N0YWNrKCk7CisJa2ZyZWUoYnVmKTsKKwlyZXR1cm4gZXJyOworfQorCisjZW5kaWYgLyogQ09ORklHX01URF9VQklfREVCVUdfUEFSQU5PSUQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL3ViaS9rYXBpLmMgYi9kcml2ZXJzL210ZC91Ymkva2FwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzNTJjNDUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL210ZC91Ymkva2FwaS5jCkBAIC0wLDAgKzEsNTc1IEBACisvKgorICogQ29weXJpZ2h0IChjKSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuLCAyMDA2CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZQorICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqIEF1dGhvcjogQXJ0ZW0gQml0eXV0c2tpeSAo0JHQuNGC0Y7RhtC60LjQuSDQkNGA0YLRkdC8KQorICovCisKKy8qIFRoaXMgZmlsZSBtb3N0bHkgaW1wbGVtZW50cyBVQkkga2VybmVsIEFQSSBmdW5jdGlvbnMgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgorI2luY2x1ZGUgInViaS5oIgorCisvKioKKyAqIHViaV9nZXRfZGV2aWNlX2luZm8gLSBnZXQgaW5mb3JtYXRpb24gYWJvdXQgVUJJIGRldmljZS4KKyAqIEB1YmlfbnVtOiBVQkkgZGV2aWNlIG51bWJlcgorICogQGRpOiB0aGUgaW5mb3JtYXRpb24gaXMgc3RvcmVkIGhlcmUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgJTAgaW4gY2FzZSBvZiBzdWNjZXNzIGFuZCBhICUtRU5PREVWIGlmIHRoZXJlIGlzIG5vCisgKiBzdWNoIFVCSSBkZXZpY2UuCisgKi8KK2ludCB1YmlfZ2V0X2RldmljZV9pbmZvKGludCB1YmlfbnVtLCBzdHJ1Y3QgdWJpX2RldmljZV9pbmZvICpkaSkKK3sKKwljb25zdCBzdHJ1Y3QgdWJpX2RldmljZSAqdWJpOworCisJaWYgKCF0cnlfbW9kdWxlX2dldChUSElTX01PRFVMRSkpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKHViaV9udW0gPCAwIHx8IHViaV9udW0gPj0gVUJJX01BWF9ERVZJQ0VTIHx8CisJICAgICF1YmlfZGV2aWNlc1t1YmlfbnVtXSkgeworCQltb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJdWJpID0gdWJpX2RldmljZXNbdWJpX251bV07CisJZGktPnViaV9udW0gPSB1YmktPnViaV9udW07CisJZGktPmxlYl9zaXplID0gdWJpLT5sZWJfc2l6ZTsKKwlkaS0+bWluX2lvX3NpemUgPSB1YmktPm1pbl9pb19zaXplOworCWRpLT5yb19tb2RlID0gdWJpLT5yb19tb2RlOworCWRpLT5jZGV2ID0gTUtERVYodWJpLT5tYWpvciwgMCk7CisJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh1YmlfZ2V0X2RldmljZV9pbmZvKTsKKworLyoqCisgKiB1YmlfZ2V0X3ZvbHVtZV9pbmZvIC0gZ2V0IGluZm9ybWF0aW9uIGFib3V0IFVCSSB2b2x1bWUuCisgKiBAZGVzYzogdm9sdW1lIGRlc2NyaXB0b3IKKyAqIEB2aTogdGhlIGluZm9ybWF0aW9uIGlzIHN0b3JlZCBoZXJlCisgKi8KK3ZvaWQgdWJpX2dldF92b2x1bWVfaW5mbyhzdHJ1Y3QgdWJpX3ZvbHVtZV9kZXNjICpkZXNjLAorCQkJIHN0cnVjdCB1Ymlfdm9sdW1lX2luZm8gKnZpKQoreworCWNvbnN0IHN0cnVjdCB1Ymlfdm9sdW1lICp2b2wgPSBkZXNjLT52b2w7CisJY29uc3Qgc3RydWN0IHViaV9kZXZpY2UgKnViaSA9IHZvbC0+dWJpOworCisJdmktPnZvbF9pZCA9IHZvbC0+dm9sX2lkOworCXZpLT51YmlfbnVtID0gdWJpLT51YmlfbnVtOworCXZpLT5zaXplID0gdm9sLT5yZXNlcnZlZF9wZWJzOworCXZpLT51c2VkX2J5dGVzID0gdm9sLT51c2VkX2J5dGVzOworCXZpLT52b2xfdHlwZSA9IHZvbC0+dm9sX3R5cGU7CisJdmktPmNvcnJ1cHRlZCA9IHZvbC0+Y29ycnVwdGVkOworCXZpLT51cGRfbWFya2VyID0gdm9sLT51cGRfbWFya2VyOworCXZpLT5hbGlnbm1lbnQgPSB2b2wtPmFsaWdubWVudDsKKwl2aS0+dXNhYmxlX2xlYl9zaXplID0gdm9sLT51c2FibGVfbGViX3NpemU7CisJdmktPm5hbWVfbGVuID0gdm9sLT5uYW1lX2xlbjsKKwl2aS0+bmFtZSA9IHZvbC0+bmFtZTsKKwl2aS0+Y2RldiA9IE1LREVWKHViaS0+bWFqb3IsIHZpLT52b2xfaWQgKyAxKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHViaV9nZXRfdm9sdW1lX2luZm8pOworCisvKioKKyAqIHViaV9vcGVuX3ZvbHVtZSAtIG9wZW4gVUJJIHZvbHVtZS4KKyAqIEB1YmlfbnVtOiBVQkkgZGV2aWNlIG51bWJlcgorICogQHZvbF9pZDogdm9sdW1lIElECisgKiBAbW9kZTogb3BlbiBtb2RlCisgKgorICogVGhlIEBtb2RlIHBhcmFtZXRlciBzcGVjaWZpZXMgaWYgdGhlIHZvbHVtZSBzaG91bGQgYmUgb3BlbmVkIGluIHJlYWQtb25seQorICogbW9kZSwgcmVhZC13cml0ZSBtb2RlLCBvciBleGNsdXNpdmUgbW9kZS4gVGhlIGV4Y2x1c2l2ZSBtb2RlIGd1YXJhbnRlZXMgdGhhdAorICogbm9ib2R5IGVsc2Ugd2lsbCBiZSBhYmxlIHRvIG9wZW4gdGhpcyB2b2x1bWUuIFVCSSBhbGxvd3MgdG8gaGF2ZSBtYW55IHZvbHVtZQorICogcmVhZGVycyBhbmQgb25lIHdyaXRlciBhdCBhIHRpbWUuCisgKgorICogSWYgYSBzdGF0aWMgdm9sdW1lIGlzIGJlaW5nIG9wZW5lZCBmb3IgdGhlIGZpcnN0IHRpbWUgc2luY2UgYm9vdCwgaXQgd2lsbCBiZQorICogY2hlY2tlZCBieSB0aGlzIGZ1bmN0aW9uLCB3aGljaCBtZWFucyBpdCB3aWxsIGJlIGZ1bGx5IHJlYWQgYW5kIHRoZSBDUkMKKyAqIGNoZWNrc3VtIG9mIGVhY2ggbG9naWNhbCBlcmFzZWJsb2NrIHdpbGwgYmUgY2hlY2tlZC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdm9sdW1lIGRlc2NyaXB0b3IgaW4gY2FzZSBvZiBzdWNjZXNzIGFuZCBhIG5lZ2F0aXZlCisgKiBlcnJvciBjb2RlIGluIGNhc2Ugb2YgZmFpbHVyZS4KKyAqLworc3RydWN0IHViaV92b2x1bWVfZGVzYyAqdWJpX29wZW5fdm9sdW1lKGludCB1YmlfbnVtLCBpbnQgdm9sX2lkLCBpbnQgbW9kZSkKK3sKKwlpbnQgZXJyOworCXN0cnVjdCB1Ymlfdm9sdW1lX2Rlc2MgKmRlc2M7CisJc3RydWN0IHViaV9kZXZpY2UgKnViaSA9IHViaV9kZXZpY2VzW3ViaV9udW1dOworCXN0cnVjdCB1Ymlfdm9sdW1lICp2b2w7CisKKwlkYmdfbXNnKCJvcGVuIGRldmljZSAlZCB2b2x1bWUgJWQsIG1vZGUgJWQiLCB1YmlfbnVtLCB2b2xfaWQsIG1vZGUpOworCisJZXJyID0gLUVOT0RFVjsKKwlpZiAoIXRyeV9tb2R1bGVfZ2V0KFRISVNfTU9EVUxFKSkKKwkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKKworCWlmICh1YmlfbnVtIDwgMCB8fCB1YmlfbnVtID49IFVCSV9NQVhfREVWSUNFUyB8fCAhdWJpKQorCQlnb3RvIG91dF9wdXQ7CisKKwllcnIgPSAtRUlOVkFMOworCWlmICh2b2xfaWQgPCAwIHx8IHZvbF9pZCA+PSB1YmktPnZ0Ymxfc2xvdHMpCisJCWdvdG8gb3V0X3B1dDsKKwlpZiAobW9kZSAhPSBVQklfUkVBRE9OTFkgJiYgbW9kZSAhPSBVQklfUkVBRFdSSVRFICYmCisJICAgIG1vZGUgIT0gVUJJX0VYQ0xVU0lWRSkKKwkJZ290byBvdXRfcHV0OworCisJZGVzYyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB1Ymlfdm9sdW1lX2Rlc2MpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRlc2MpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBvdXRfcHV0OworCX0KKworCXNwaW5fbG9jaygmdWJpLT52b2x1bWVzX2xvY2spOworCXZvbCA9IHViaS0+dm9sdW1lc1t2b2xfaWRdOworCWlmICghdm9sKSB7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwllcnIgPSAtRUJVU1k7CisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBVQklfUkVBRE9OTFk6CisJCWlmICh2b2wtPmV4Y2x1c2l2ZSkKKwkJCWdvdG8gb3V0X3VubG9jazsKKwkJdm9sLT5yZWFkZXJzICs9IDE7CisJCWJyZWFrOworCisJY2FzZSBVQklfUkVBRFdSSVRFOgorCQlpZiAodm9sLT5leGNsdXNpdmUgfHwgdm9sLT53cml0ZXJzID4gMCkKKwkJCWdvdG8gb3V0X3VubG9jazsKKwkJdm9sLT53cml0ZXJzICs9IDE7CisJCWJyZWFrOworCisJY2FzZSBVQklfRVhDTFVTSVZFOgorCQlpZiAodm9sLT5leGNsdXNpdmUgfHwgdm9sLT53cml0ZXJzIHx8IHZvbC0+cmVhZGVycykKKwkJCWdvdG8gb3V0X3VubG9jazsKKwkJdm9sLT5leGNsdXNpdmUgPSAxOworCQlicmVhazsKKwl9CisJc3Bpbl91bmxvY2soJnViaS0+dm9sdW1lc19sb2NrKTsKKworCWRlc2MtPnZvbCA9IHZvbDsKKwlkZXNjLT5tb2RlID0gbW9kZTsKKworCS8qCisJICogVG8gcHJldmVudCBzaW11bHRhbmVvdXMgY2hlY2tzIG9mIHRoZSBzYW1lIHZvbHVtZSB3ZSB1c2UgQHZ0YmxfbXV0ZXgsCisJICogYWx0aG91Z2ggaXQgaXMgbm90IHRoZSBwdXJwb3NlIGl0IHdhcyBpbnRyb2R1Y2VkIGZvci4KKwkgKi8KKwltdXRleF9sb2NrKCZ1YmktPnZ0YmxfbXV0ZXgpOworCWlmICghdm9sLT5jaGVja2VkKSB7CisJCS8qIFRoaXMgaXMgdGhlIGZpcnN0IG9wZW4gLSBjaGVjayB0aGUgdm9sdW1lICovCisJCWVyciA9IHViaV9jaGVja192b2x1bWUodWJpLCB2b2xfaWQpOworCQlpZiAoZXJyIDwgMCkgeworCQkJbXV0ZXhfdW5sb2NrKCZ1YmktPnZ0YmxfbXV0ZXgpOworCQkJdWJpX2Nsb3NlX3ZvbHVtZShkZXNjKTsKKwkJCXJldHVybiBFUlJfUFRSKGVycik7CisJCX0KKwkJaWYgKGVyciA9PSAxKSB7CisJCQl1Ymlfd2Fybigidm9sdW1lICVkIG9uIFVCSSBkZXZpY2UgJWQgaXMgY29ycnVwdGVkIiwKKwkJCQkgdm9sX2lkLCB1YmktPnViaV9udW0pOworCQkJdm9sLT5jb3JydXB0ZWQgPSAxOworCQl9CisJCXZvbC0+Y2hlY2tlZCA9IDE7CisJfQorCW11dGV4X3VubG9jaygmdWJpLT52dGJsX211dGV4KTsKKwlyZXR1cm4gZGVzYzsKKworb3V0X3VubG9jazoKKwlzcGluX3VubG9jaygmdWJpLT52b2x1bWVzX2xvY2spOworCWtmcmVlKGRlc2MpOworb3V0X3B1dDoKKwltb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKKwlyZXR1cm4gRVJSX1BUUihlcnIpOworfQorRVhQT1JUX1NZTUJPTF9HUEwodWJpX29wZW5fdm9sdW1lKTsKKworLyoqCisgKiB1Ymlfb3Blbl92b2x1bWVfbm0gLSBvcGVuIFVCSSB2b2x1bWUgYnkgbmFtZS4KKyAqIEB1YmlfbnVtOiBVQkkgZGV2aWNlIG51bWJlcgorICogQG5hbWU6IHZvbHVtZSBuYW1lCisgKiBAbW9kZTogb3BlbiBtb2RlCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBzaW1pbGFyIHRvICd1Ymlfb3Blbl92b2x1bWUoKScsIGJ1dCBvcGVucyBhIHZvbHVtZSBieSBuYW1lLgorICovCitzdHJ1Y3QgdWJpX3ZvbHVtZV9kZXNjICp1Ymlfb3Blbl92b2x1bWVfbm0oaW50IHViaV9udW0sIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJCSAgIGludCBtb2RlKQoreworCWludCBpLCB2b2xfaWQgPSAtMSwgbGVuOworCXN0cnVjdCB1Ymlfdm9sdW1lX2Rlc2MgKnJldDsKKwlzdHJ1Y3QgdWJpX2RldmljZSAqdWJpOworCisJZGJnX21zZygib3BlbiB2b2x1bWUgJXMsIG1vZGUgJWQiLCBuYW1lLCBtb2RlKTsKKworCWlmICghbmFtZSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisKKwlsZW4gPSBzdHJubGVuKG5hbWUsIFVCSV9WT0xfTkFNRV9NQVggKyAxKTsKKwlpZiAobGVuID4gVUJJX1ZPTF9OQU1FX01BWCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisKKwlyZXQgPSBFUlJfUFRSKC1FTk9ERVYpOworCWlmICghdHJ5X21vZHVsZV9nZXQoVEhJU19NT0RVTEUpKQorCQlyZXR1cm4gcmV0OworCisJaWYgKHViaV9udW0gPCAwIHx8IHViaV9udW0gPj0gVUJJX01BWF9ERVZJQ0VTIHx8ICF1YmlfZGV2aWNlc1t1YmlfbnVtXSkKKwkJZ290byBvdXRfcHV0OworCisJdWJpID0gdWJpX2RldmljZXNbdWJpX251bV07CisKKwlzcGluX2xvY2soJnViaS0+dm9sdW1lc19sb2NrKTsKKwkvKiBXYWxrIGFsbCB2b2x1bWVzIG9mIHRoaXMgVUJJIGRldmljZSAqLworCWZvciAoaSA9IDA7IGkgPCB1YmktPnZ0Ymxfc2xvdHM7IGkrKykgeworCQlzdHJ1Y3QgdWJpX3ZvbHVtZSAqdm9sID0gdWJpLT52b2x1bWVzW2ldOworCisJCWlmICh2b2wgJiYgbGVuID09IHZvbC0+bmFtZV9sZW4gJiYgIXN0cmNtcChuYW1lLCB2b2wtPm5hbWUpKSB7CisJCQl2b2xfaWQgPSBpOworCQkJYnJlYWs7CisJCX0KKwl9CisJc3Bpbl91bmxvY2soJnViaS0+dm9sdW1lc19sb2NrKTsKKworCWlmICh2b2xfaWQgPCAwKQorCQlnb3RvIG91dF9wdXQ7CisKKwlyZXQgPSB1Ymlfb3Blbl92b2x1bWUodWJpX251bSwgdm9sX2lkLCBtb2RlKTsKKworb3V0X3B1dDoKKwltb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwodWJpX29wZW5fdm9sdW1lX25tKTsKKworLyoqCisgKiB1YmlfY2xvc2Vfdm9sdW1lIC0gY2xvc2UgVUJJIHZvbHVtZS4KKyAqIEBkZXNjOiB2b2x1bWUgZGVzY3JpcHRvcgorICovCit2b2lkIHViaV9jbG9zZV92b2x1bWUoc3RydWN0IHViaV92b2x1bWVfZGVzYyAqZGVzYykKK3sKKwlzdHJ1Y3QgdWJpX3ZvbHVtZSAqdm9sID0gZGVzYy0+dm9sOworCisJZGJnX21zZygiY2xvc2Ugdm9sdW1lICVkLCBtb2RlICVkIiwgdm9sLT52b2xfaWQsIGRlc2MtPm1vZGUpOworCisJc3Bpbl9sb2NrKCZ2b2wtPnViaS0+dm9sdW1lc19sb2NrKTsKKwlzd2l0Y2ggKGRlc2MtPm1vZGUpIHsKKwljYXNlIFVCSV9SRUFET05MWToKKwkJdm9sLT5yZWFkZXJzIC09IDE7CisJCWJyZWFrOworCWNhc2UgVUJJX1JFQURXUklURToKKwkJdm9sLT53cml0ZXJzIC09IDE7CisJCWJyZWFrOworCWNhc2UgVUJJX0VYQ0xVU0lWRToKKwkJdm9sLT5leGNsdXNpdmUgPSAwOworCX0KKwlzcGluX3VubG9jaygmdm9sLT51YmktPnZvbHVtZXNfbG9jayk7CisKKwlrZnJlZShkZXNjKTsKKwltb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHViaV9jbG9zZV92b2x1bWUpOworCisvKioKKyAqIHViaV9sZWJfcmVhZCAtIHJlYWQgZGF0YS4KKyAqIEBkZXNjOiB2b2x1bWUgZGVzY3JpcHRvcgorICogQGxudW06IGxvZ2ljYWwgZXJhc2VibG9jayBudW1iZXIgdG8gcmVhZCBmcm9tCisgKiBAYnVmOiBidWZmZXIgd2hlcmUgdG8gc3RvcmUgdGhlIHJlYWQgZGF0YQorICogQG9mZnNldDogb2Zmc2V0IHdpdGhpbiB0aGUgbG9naWNhbCBlcmFzZWJsb2NrIHRvIHJlYWQgZnJvbQorICogQGxlbjogaG93IG1hbnkgYnl0ZXMgdG8gcmVhZAorICogQGNoZWNrOiB3aGV0aGVyIFVCSSBoYXMgdG8gY2hlY2sgdGhlIHJlYWQgZGF0YSdzIENSQyBvciBub3QuCisgKgorICogVGhpcyBmdW5jdGlvbiByZWFkcyBkYXRhIGZyb20gb2Zmc2V0IEBvZmZzZXQgb2YgbG9naWNhbCBlcmFzZWJsb2NrIEBsbnVtIGFuZAorICogc3RvcmVzIHRoZSBkYXRhIGF0IEBidWYuIFdoZW4gcmVhZGluZyBmcm9tIHN0YXRpYyB2b2x1bWVzLCBAY2hlY2sgc3BlY2lmaWVzCisgKiB3aGV0aGVyIHRoZSBkYXRhIGhhcyB0byBiZSBjaGVja2VkIG9yIG5vdC4gSWYgeWVzLCB0aGUgd2hvbGUgbG9naWNhbAorICogZXJhc2VibG9jayB3aWxsIGJlIHJlYWQgYW5kIGl0cyBDUkMgY2hlY2tzdW0gd2lsbCBiZSBjaGVja2VkIChpLmUuLCB0aGUgQ1JDCisgKiBjaGVja3N1bSBpcyBwZXItZXJhc2VibG9jaykuIFNvIGNoZWNraW5nIG1heSBzdWJzdGFudGlhbGx5IHNsb3cgZG93biB0aGUKKyAqIHJlYWQgc3BlZWQuIFRoZSBAY2hlY2sgYXJndW1lbnQgaXMgaWdub3JlZCBmb3IgZHluYW1pYyB2b2x1bWVzLgorICoKKyAqIEluIGNhc2Ugb2Ygc3VjY2VzcywgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHplcm8uIEluIGNhc2Ugb2YgZmFpbHVyZSwgdGhpcworICogZnVuY3Rpb24gcmV0dXJucyBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgKgorICogJS1FQkFETVNHIGVycm9yIGNvZGUgaXMgcmV0dXJuZWQ6CisgKiBvIGZvciBib3RoIHN0YXRpYyBhbmQgZHluYW1pYyB2b2x1bWVzIGlmIE1URCBkcml2ZXIgaGFzIGRldGVjdGVkIGEgZGF0YQorICogICBpbnRlZ3JpdHkgcHJvYmxlbSAodW5yZWNvdmVyYWJsZSBFQ0MgY2hlY2tzdW0gbWlzbWF0Y2ggaW4gY2FzZSBvZiBOQU5EKTsKKyAqIG8gZm9yIHN0YXRpYyB2b2x1bWVzIGluIGNhc2Ugb2YgZGF0YSBDUkMgbWlzbWF0Y2guCisgKgorICogSWYgdGhlIHZvbHVtZSBpcyBkYW1hZ2VkIGJlY2F1c2Ugb2YgYW4gaW50ZXJydXB0ZWQgdXBkYXRlIHRoaXMgZnVuY3Rpb24ganVzdAorICogcmV0dXJucyBpbW1lZGlhdGVseSB3aXRoICUtRUJBREYgZXJyb3IgY29kZS4KKyAqLworaW50IHViaV9sZWJfcmVhZChzdHJ1Y3QgdWJpX3ZvbHVtZV9kZXNjICpkZXNjLCBpbnQgbG51bSwgY2hhciAqYnVmLCBpbnQgb2Zmc2V0LAorCQkgaW50IGxlbiwgaW50IGNoZWNrKQoreworCXN0cnVjdCB1Ymlfdm9sdW1lICp2b2wgPSBkZXNjLT52b2w7CisJc3RydWN0IHViaV9kZXZpY2UgKnViaSA9IHZvbC0+dWJpOworCWludCBlcnIsIHZvbF9pZCA9IHZvbC0+dm9sX2lkOworCisJZGJnX21zZygicmVhZCAlZCBieXRlcyBmcm9tIExFQiAlZDolZDolZCIsIGxlbiwgdm9sX2lkLCBsbnVtLCBvZmZzZXQpOworCisJaWYgKHZvbF9pZCA8IDAgfHwgdm9sX2lkID49IHViaS0+dnRibF9zbG90cyB8fCBsbnVtIDwgMCB8fAorCSAgICBsbnVtID49IHZvbC0+dXNlZF9lYnMgfHwgb2Zmc2V0IDwgMCB8fCBsZW4gPCAwIHx8CisJICAgIG9mZnNldCArIGxlbiA+IHZvbC0+dXNhYmxlX2xlYl9zaXplKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICh2b2wtPnZvbF90eXBlID09IFVCSV9TVEFUSUNfVk9MVU1FICYmIGxudW0gPT0gdm9sLT51c2VkX2VicyAtIDEgJiYKKwkgICAgb2Zmc2V0ICsgbGVuID4gdm9sLT5sYXN0X2ViX2J5dGVzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICh2b2wtPnVwZF9tYXJrZXIpCisJCXJldHVybiAtRUJBREY7CisJaWYgKGxlbiA9PSAwKQorCQlyZXR1cm4gMDsKKworCWVyciA9IHViaV9lYmFfcmVhZF9sZWIodWJpLCB2b2xfaWQsIGxudW0sIGJ1Ziwgb2Zmc2V0LCBsZW4sIGNoZWNrKTsKKwlpZiAoZXJyICYmIGVyciA9PSAtRUJBRE1TRyAmJiB2b2wtPnZvbF90eXBlID09IFVCSV9TVEFUSUNfVk9MVU1FKSB7CisJCXViaV93YXJuKCJtYXJrIHZvbHVtZSAlZCBhcyBjb3JydXB0ZWQiLCB2b2xfaWQpOworCQl2b2wtPmNvcnJ1cHRlZCA9IDE7CisJfQorCisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHViaV9sZWJfcmVhZCk7CisKKy8qKgorICogdWJpX2xlYl93cml0ZSAtIHdyaXRlIGRhdGEuCisgKiBAZGVzYzogdm9sdW1lIGRlc2NyaXB0b3IKKyAqIEBsbnVtOiBsb2dpY2FsIGVyYXNlYmxvY2sgbnVtYmVyIHRvIHdyaXRlIHRvCisgKiBAYnVmOiBkYXRhIHRvIHdyaXRlCisgKiBAb2Zmc2V0OiBvZmZzZXQgd2l0aGluIHRoZSBsb2dpY2FsIGVyYXNlYmxvY2sgd2hlcmUgdG8gd3JpdGUKKyAqIEBsZW46IGhvdyBtYW55IGJ5dGVzIHRvIHdyaXRlCisgKiBAZHR5cGU6IGV4cGVjdGVkIGRhdGEgdHlwZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gd3JpdGVzIEBsZW4gYnl0ZXMgb2YgZGF0YSBmcm9tIEBidWYgdG8gb2Zmc2V0IEBvZmZzZXQgb2YKKyAqIGxvZ2ljYWwgZXJhc2VibG9jayBAbG51bS4gVGhlIEBkdHlwZSBhcmd1bWVudCBkZXNjcmliZXMgZXhwZWN0ZWQgbGlmZXRpbWUgb2YKKyAqIHRoZSBkYXRhLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gdGFrZXMgY2FyZSBvZiBwaHlzaWNhbCBlcmFzZWJsb2NrIHdyaXRlIGZhaWx1cmVzLiBJZiB3cml0ZSB0bworICogdGhlIHBoeXNpY2FsIGVyYXNlYmxvY2sgd3JpdGUgb3BlcmF0aW9uIGZhaWxzLCB0aGUgbG9naWNhbCBlcmFzZWJsb2NrIGlzCisgKiByZS1tYXBwZWQgdG8gYW5vdGhlciBwaHlzaWNhbCBlcmFzZWJsb2NrLCB0aGUgZGF0YSBpcyByZWNvdmVyZWQsIGFuZCB0aGUKKyAqIHdyaXRlIGZpbmlzaGVzLiBVQkkgaGFzIGEgcG9vbCBvZiByZXNlcnZlZCBwaHlzaWNhbCBlcmFzZWJsb2NrcyBmb3IgdGhpcy4KKyAqCisgKiBJZiBhbGwgdGhlIGRhdGEgd2VyZSBzdWNjZXNzZnVsbHkgd3JpdHRlbiwgemVybyBpcyByZXR1cm5lZC4gSWYgYW4gZXJyb3IKKyAqIG9jY3VycmVkIGFuZCBVQkkgaGFzIG5vdCBiZWVuIGFibGUgdG8gcmVjb3ZlciBmcm9tIGl0LCB0aGlzIGZ1bmN0aW9uIHJldHVybnMKKyAqIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4gTm90ZSwgaW4gY2FzZSBvZiBhbiBlcnJvciwgaXQgaXMgcG9zc2libGUgdGhhdAorICogc29tZXRoaW5nIHdhcyBzdGlsbCB3cml0dGVuIHRvIHRoZSBmbGFzaCBtZWRpYSwgYnV0IHRoYXQgbWF5IGJlIHNvbWUKKyAqIGdhcmJhZ2UuCisgKgorICogSWYgdGhlIHZvbHVtZSBpcyBkYW1hZ2VkIGJlY2F1c2Ugb2YgYW4gaW50ZXJydXB0ZWQgdXBkYXRlIHRoaXMgZnVuY3Rpb24ganVzdAorICogcmV0dXJucyBpbW1lZGlhdGVseSB3aXRoICUtRUJBREYgY29kZS4KKyAqLworaW50IHViaV9sZWJfd3JpdGUoc3RydWN0IHViaV92b2x1bWVfZGVzYyAqZGVzYywgaW50IGxudW0sIGNvbnN0IHZvaWQgKmJ1ZiwKKwkJICBpbnQgb2Zmc2V0LCBpbnQgbGVuLCBpbnQgZHR5cGUpCit7CisJc3RydWN0IHViaV92b2x1bWUgKnZvbCA9IGRlc2MtPnZvbDsKKwlzdHJ1Y3QgdWJpX2RldmljZSAqdWJpID0gdm9sLT51Ymk7CisJaW50IHZvbF9pZCA9IHZvbC0+dm9sX2lkOworCisJZGJnX21zZygid3JpdGUgJWQgYnl0ZXMgdG8gTEVCICVkOiVkOiVkIiwgbGVuLCB2b2xfaWQsIGxudW0sIG9mZnNldCk7CisKKwlpZiAodm9sX2lkIDwgMCB8fCB2b2xfaWQgPj0gdWJpLT52dGJsX3Nsb3RzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChkZXNjLT5tb2RlID09IFVCSV9SRUFET05MWSB8fCB2b2wtPnZvbF90eXBlID09IFVCSV9TVEFUSUNfVk9MVU1FKQorCQlyZXR1cm4gLUVST0ZTOworCisJaWYgKGxudW0gPCAwIHx8IGxudW0gPj0gdm9sLT5yZXNlcnZlZF9wZWJzIHx8IG9mZnNldCA8IDAgfHwgbGVuIDwgMCB8fAorCSAgICBvZmZzZXQgKyBsZW4gPiB2b2wtPnVzYWJsZV9sZWJfc2l6ZSB8fCBvZmZzZXQgJSB1YmktPm1pbl9pb19zaXplIHx8CisJICAgIGxlbiAlIHViaS0+bWluX2lvX3NpemUpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGR0eXBlICE9IFVCSV9MT05HVEVSTSAmJiBkdHlwZSAhPSBVQklfU0hPUlRURVJNICYmCisJICAgIGR0eXBlICE9IFVCSV9VTktOT1dOKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICh2b2wtPnVwZF9tYXJrZXIpCisJCXJldHVybiAtRUJBREY7CisKKwlpZiAobGVuID09IDApCisJCXJldHVybiAwOworCisJcmV0dXJuIHViaV9lYmFfd3JpdGVfbGViKHViaSwgdm9sX2lkLCBsbnVtLCBidWYsIG9mZnNldCwgbGVuLCBkdHlwZSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh1YmlfbGViX3dyaXRlKTsKKworLyoKKyAqIHViaV9sZWJfY2hhbmdlIC0gY2hhbmdlIGxvZ2ljYWwgZXJhc2VibG9jayBhdG9taWNhbGx5LgorICogQGRlc2M6IHZvbHVtZSBkZXNjcmlwdG9yCisgKiBAbG51bTogbG9naWNhbCBlcmFzZWJsb2NrIG51bWJlciB0byBjaGFuZ2UKKyAqIEBidWY6IGRhdGEgdG8gd3JpdGUKKyAqIEBsZW46IGhvdyBtYW55IGJ5dGVzIHRvIHdyaXRlCisgKiBAZHR5cGU6IGV4cGVjdGVkIGRhdGEgdHlwZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gY2hhbmdlcyB0aGUgY29udGVudHMgb2YgYSBsb2dpY2FsIGVyYXNlYmxvY2sgYXRvbWljYWxseS4gQGJ1ZgorICogaGFzIHRvIGNvbnRhaW4gbmV3IGxvZ2ljYWwgZXJhc2VibG9jayBkYXRhLCBhbmQgQGxlbiAtIHRoZSBsZW5ndGggb2YgdGhlCisgKiBkYXRhLCB3aGljaCBoYXMgdG8gYmUgYWxpZ25lZC4gVGhlIGxlbmd0aCBtYXkgYmUgc2hvcnRlciB0aGVuIHRoZSBsb2dpY2FsCisgKiBlcmFzZWJsb2NrIHNpemUsIGFudCB0aGUgbG9naWNhbCBlcmFzZWJsb2NrIG1heSBiZSBhcHBlbmRlZCB0byBtb3JlIHRpbWVzCisgKiBsYXRlciBvbi4gVGhpcyBmdW5jdGlvbiBndWFyYW50ZWVzIHRoYXQgaW4gY2FzZSBvZiBhbiB1bmNsZWFuIHJlYm9vdCB0aGUgb2xkCisgKiBjb250ZW50cyBpcyBwcmVzZXJ2ZWQuIFJldHVybnMgemVybyBpbiBjYXNlIG9mIHN1Y2Nlc3MgYW5kIGEgbmVnYXRpdmUgZXJyb3IKKyAqIGNvZGUgaW4gY2FzZSBvZiBmYWlsdXJlLgorICovCitpbnQgdWJpX2xlYl9jaGFuZ2Uoc3RydWN0IHViaV92b2x1bWVfZGVzYyAqZGVzYywgaW50IGxudW0sIGNvbnN0IHZvaWQgKmJ1ZiwKKwkJICAgaW50IGxlbiwgaW50IGR0eXBlKQoreworCXN0cnVjdCB1Ymlfdm9sdW1lICp2b2wgPSBkZXNjLT52b2w7CisJc3RydWN0IHViaV9kZXZpY2UgKnViaSA9IHZvbC0+dWJpOworCWludCB2b2xfaWQgPSB2b2wtPnZvbF9pZDsKKworCWRiZ19tc2coImF0b21pY2FsbHkgd3JpdGUgJWQgYnl0ZXMgdG8gTEVCICVkOiVkIiwgbGVuLCB2b2xfaWQsIGxudW0pOworCisJaWYgKHZvbF9pZCA8IDAgfHwgdm9sX2lkID49IHViaS0+dnRibF9zbG90cykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZGVzYy0+bW9kZSA9PSBVQklfUkVBRE9OTFkgfHwgdm9sLT52b2xfdHlwZSA9PSBVQklfU1RBVElDX1ZPTFVNRSkKKwkJcmV0dXJuIC1FUk9GUzsKKworCWlmIChsbnVtIDwgMCB8fCBsbnVtID49IHZvbC0+cmVzZXJ2ZWRfcGVicyB8fCBsZW4gPCAwIHx8CisJICAgIGxlbiA+IHZvbC0+dXNhYmxlX2xlYl9zaXplIHx8IGxlbiAlIHViaS0+bWluX2lvX3NpemUpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGR0eXBlICE9IFVCSV9MT05HVEVSTSAmJiBkdHlwZSAhPSBVQklfU0hPUlRURVJNICYmCisJICAgIGR0eXBlICE9IFVCSV9VTktOT1dOKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICh2b2wtPnVwZF9tYXJrZXIpCisJCXJldHVybiAtRUJBREY7CisKKwlpZiAobGVuID09IDApCisJCXJldHVybiAwOworCisJcmV0dXJuIHViaV9lYmFfYXRvbWljX2xlYl9jaGFuZ2UodWJpLCB2b2xfaWQsIGxudW0sIGJ1ZiwgbGVuLCBkdHlwZSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh1YmlfbGViX2NoYW5nZSk7CisKKy8qKgorICogdWJpX2xlYl9lcmFzZSAtIGVyYXNlIGxvZ2ljYWwgZXJhc2VibG9jay4KKyAqIEBkZXNjOiB2b2x1bWUgZGVzY3JpcHRvcgorICogQGxudW06IGxvZ2ljYWwgZXJhc2VibG9jayBudW1iZXIKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHVuLW1hcHMgbG9naWNhbCBlcmFzZWJsb2NrIEBsbnVtIGFuZCBzeW5jaHJvbm91c2x5IGVyYXNlcyB0aGUKKyAqIGNvcnJlc3BvbmRlbnQgcGh5c2ljYWwgZXJhc2VibG9jay4gUmV0dXJucyB6ZXJvIGluIGNhc2Ugb2Ygc3VjY2VzcyBhbmQgYQorICogbmVnYXRpdmUgZXJyb3IgY29kZSBpbiBjYXNlIG9mIGZhaWx1cmUuCisgKgorICogSWYgdGhlIHZvbHVtZSBpcyBkYW1hZ2VkIGJlY2F1c2Ugb2YgYW4gaW50ZXJydXB0ZWQgdXBkYXRlIHRoaXMgZnVuY3Rpb24ganVzdAorICogcmV0dXJucyBpbW1lZGlhdGVseSB3aXRoICUtRUJBREYgY29kZS4KKyAqLworaW50IHViaV9sZWJfZXJhc2Uoc3RydWN0IHViaV92b2x1bWVfZGVzYyAqZGVzYywgaW50IGxudW0pCit7CisJc3RydWN0IHViaV92b2x1bWUgKnZvbCA9IGRlc2MtPnZvbDsKKwlzdHJ1Y3QgdWJpX2RldmljZSAqdWJpID0gdm9sLT51Ymk7CisJaW50IGVyciwgdm9sX2lkID0gdm9sLT52b2xfaWQ7CisKKwlkYmdfbXNnKCJlcmFzZSBMRUIgJWQ6JWQiLCB2b2xfaWQsIGxudW0pOworCisJaWYgKGRlc2MtPm1vZGUgPT0gVUJJX1JFQURPTkxZIHx8IHZvbC0+dm9sX3R5cGUgPT0gVUJJX1NUQVRJQ19WT0xVTUUpCisJCXJldHVybiAtRVJPRlM7CisKKwlpZiAobG51bSA8IDAgfHwgbG51bSA+PSB2b2wtPnJlc2VydmVkX3BlYnMpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHZvbC0+dXBkX21hcmtlcikKKwkJcmV0dXJuIC1FQkFERjsKKworCWVyciA9IHViaV9lYmFfdW5tYXBfbGViKHViaSwgdm9sX2lkLCBsbnVtKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJcmV0dXJuIHViaV93bF9mbHVzaCh1YmkpOworfQorRVhQT1JUX1NZTUJPTF9HUEwodWJpX2xlYl9lcmFzZSk7CisKKy8qKgorICogdWJpX2xlYl91bm1hcCAtIHVuLW1hcCBsb2dpY2FsIGVyYXNlYmxvY2suCisgKiBAZGVzYzogdm9sdW1lIGRlc2NyaXB0b3IKKyAqIEBsbnVtOiBsb2dpY2FsIGVyYXNlYmxvY2sgbnVtYmVyCisgKgorICogVGhpcyBmdW5jdGlvbiB1bi1tYXBzIGxvZ2ljYWwgZXJhc2VibG9jayBAbG51bSBhbmQgc2NoZWR1bGVzIHRoZQorICogY29ycmVzcG9uZGluZyBwaHlzaWNhbCBlcmFzZWJsb2NrIGZvciBlcmFzdXJlLCBzbyB0aGF0IGl0IHdpbGwgZXZlbnR1YWxseSBiZQorICogcGh5c2ljYWxseSBlcmFzZWQgaW4gYmFja2dyb3VuZC4gVGhpcyBvcGVyYXRpb24gaXMgbXVjaCBmYXN0ZXIgdGhlbiB0aGUKKyAqIGVyYXNlIG9wZXJhdGlvbi4KKyAqCisgKiBVbmxpa2UgZXJhc2UsIHRoZSB1bi1tYXAgb3BlcmF0aW9uIGRvZXMgbm90IGd1YXJhbnRlZSB0aGF0IHRoZSBsb2dpY2FsCisgKiBlcmFzZWJsb2NrIHdpbGwgY29udGFpbiBhbGwgMHhGRiBieXRlcyB3aGVuIFVCSSBpcyBpbml0aWFsaXplZCBhZ2Fpbi4gRm9yCisgKiBleGFtcGxlLCBpZiBzZXZlcmFsIGxvZ2ljYWwgZXJhc2VibG9ja3MgYXJlIHVuLW1hcHBlZCwgYW5kIGFuIHVuY2xlYW4gcmVib290CisgKiBoYXBwZW5zIGFmdGVyIHRoaXMsIHRoZSBsb2dpY2FsIGVyYXNlYmxvY2tzIHdpbGwgbm90IG5lY2Vzc2FyaWx5IGJlCisgKiB1bi1tYXBwZWQgYWdhaW4gd2hlbiB0aGlzIE1URCBkZXZpY2UgaXMgYXR0YWNoZWQuIFRoZXkgbWF5IGFjdHVhbGx5IGJlCisgKiBtYXBwZWQgdG8gdGhlIHNhbWUgcGh5c2ljYWwgZXJhc2VibG9ja3MgYWdhaW4uIFNvLCB0aGlzIGZ1bmN0aW9uIGhhcyB0byBiZQorICogdXNlZCB3aXRoIGNhcmUuCisgKgorICogSW4gb3RoZXIgd29yZHMsIHdoZW4gdW4tbWFwcGluZyBhIGxvZ2ljYWwgZXJhc2VibG9jaywgVUJJIGRvZXMgbm90IHN0b3JlCisgKiBhbnkgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBvbiB0aGUgZmxhc2ggbWVkaWEsIGl0IGp1c3QgbWFya3MgdGhlIGxvZ2ljYWwKKyAqIGVyYXNlYmxvY2sgYXMgInVuLW1hcHBlZCIgaW4gUkFNLiBJZiBVQkkgaXMgZGV0YWNoZWQgYmVmb3JlIHRoZSBwaHlzaWNhbAorICogZXJhc2VibG9jayBpcyBwaHlzaWNhbGx5IGVyYXNlZCwgaXQgd2lsbCBiZSBtYXBwZWQgYWdhaW4gdG8gdGhlIHNhbWUgbG9naWNhbAorICogZXJhc2VibG9jayB3aGVuIHRoZSBNVEQgZGV2aWNlIGlzIGF0dGFjaGVkIGFnYWluLgorICoKKyAqIFRoZSBtYWluIGFuZCBvYnZpb3VzIHVzZS1jYXNlIG9mIHRoaXMgZnVuY3Rpb24gaXMgd2hlbiB0aGUgY29udGVudHMgb2YgYQorICogbG9naWNhbCBlcmFzZWJsb2NrIGhhcyB0byBiZSByZS13cml0dGVuLiBUaGVuIGl0IGlzIG11Y2ggbW9yZSBlZmZpY2llbnQgdG8KKyAqIGZpcnN0IHVuLW1hcCBpdCwgdGhlbiB3cml0ZSBuZXcgZGF0YSwgcmF0aGVyIHRoZW4gZmlyc3QgZXJhc2UgaXQsIHRoZW4gd3JpdGUKKyAqIG5ldyBkYXRhLiBOb3RlLCBvbmNlIG5ldyBkYXRhIGhhcyBiZWVuIHdyaXR0ZW4gdG8gdGhlIGxvZ2ljYWwgZXJhc2VibG9jaywKKyAqIFVCSSBndWFyYW50ZWVzIHRoYXQgdGhlIG9sZCBjb250ZW50cyBoYXMgZ29uZSBmb3JldmVyLiBJbiBvdGhlciB3b3JkcywgaWYgYW4KKyAqIHVuY2xlYW4gcmVib290IGhhcHBlbnMgYWZ0ZXIgdGhlIGxvZ2ljYWwgZXJhc2VibG9jayBoYXMgYmVlbiB1bi1tYXBwZWQgYW5kCisgKiB0aGVuIHdyaXR0ZW4gdG8sIGl0IHdpbGwgY29udGFpbiB0aGUgbGFzdCB3cml0dGVuIGRhdGEuCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHplcm8gaW4gY2FzZSBvZiBzdWNjZXNzIGFuZCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgaW4KKyAqIGNhc2Ugb2YgZmFpbHVyZS4gSWYgdGhlIHZvbHVtZSBpcyBkYW1hZ2VkIGJlY2F1c2Ugb2YgYW4gaW50ZXJydXB0ZWQgdXBkYXRlCisgKiB0aGlzIGZ1bmN0aW9uIGp1c3QgcmV0dXJucyBpbW1lZGlhdGVseSB3aXRoICUtRUJBREYgY29kZS4KKyAqLworaW50IHViaV9sZWJfdW5tYXAoc3RydWN0IHViaV92b2x1bWVfZGVzYyAqZGVzYywgaW50IGxudW0pCit7CisJc3RydWN0IHViaV92b2x1bWUgKnZvbCA9IGRlc2MtPnZvbDsKKwlzdHJ1Y3QgdWJpX2RldmljZSAqdWJpID0gdm9sLT51Ymk7CisJaW50IHZvbF9pZCA9IHZvbC0+dm9sX2lkOworCisJZGJnX21zZygidW5tYXAgTEVCICVkOiVkIiwgdm9sX2lkLCBsbnVtKTsKKworCWlmIChkZXNjLT5tb2RlID09IFVCSV9SRUFET05MWSB8fCB2b2wtPnZvbF90eXBlID09IFVCSV9TVEFUSUNfVk9MVU1FKQorCQlyZXR1cm4gLUVST0ZTOworCisJaWYgKGxudW0gPCAwIHx8IGxudW0gPj0gdm9sLT5yZXNlcnZlZF9wZWJzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICh2b2wtPnVwZF9tYXJrZXIpCisJCXJldHVybiAtRUJBREY7CisKKwlyZXR1cm4gdWJpX2ViYV91bm1hcF9sZWIodWJpLCB2b2xfaWQsIGxudW0pOworfQorRVhQT1JUX1NZTUJPTF9HUEwodWJpX2xlYl91bm1hcCk7CisKKy8qKgorICogdWJpX2lzX21hcHBlZCAtIGNoZWNrIGlmIGxvZ2ljYWwgZXJhc2VibG9jayBpcyBtYXBwZWQuCisgKiBAZGVzYzogdm9sdW1lIGRlc2NyaXB0b3IKKyAqIEBsbnVtOiBsb2dpY2FsIGVyYXNlYmxvY2sgbnVtYmVyCisgKgorICogVGhpcyBmdW5jdGlvbiBjaGVja3MgaWYgbG9naWNhbCBlcmFzZWJsb2NrIEBsbnVtIGlzIG1hcHBlZCB0byBhIHBoeXNpY2FsCisgKiBlcmFzZWJsb2NrLiBJZiBhIGxvZ2ljYWwgZXJhc2VibG9jayBpcyB1bi1tYXBwZWQsIHRoaXMgZG9lcyBub3QgbmVjZXNzYXJpbHkKKyAqIG1lYW4gaXQgd2lsbCBzdGlsbCBiZSB1bi1tYXBwZWQgYWZ0ZXIgdGhlIFVCSSBkZXZpY2UgaXMgcmUtYXR0YWNoZWQuIFRoZQorICogbG9naWNhbCBlcmFzZWJsb2NrIG1heSBiZWNvbWUgbWFwcGVkIHRvIHRoZSBwaHlzaWNhbCBlcmFzZWJsb2NrIGl0IHdhcyBsYXN0CisgKiBtYXBwZWQgdG8uCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zICUxIGlmIHRoZSBMRUIgaXMgbWFwcGVkLCAlMCBpZiBub3QsIGFuZCBhIG5lZ2F0aXZlCisgKiBlcnJvciBjb2RlIGluIGNhc2Ugb2YgZmFpbHVyZS4gSWYgdGhlIHZvbHVtZSBpcyBkYW1hZ2VkIGJlY2F1c2Ugb2YgYW4KKyAqIGludGVycnVwdGVkIHVwZGF0ZSB0aGlzIGZ1bmN0aW9uIGp1c3QgcmV0dXJucyBpbW1lZGlhdGVseSB3aXRoICUtRUJBREYgZXJyb3IKKyAqIGNvZGUuCisgKi8KK2ludCB1YmlfaXNfbWFwcGVkKHN0cnVjdCB1Ymlfdm9sdW1lX2Rlc2MgKmRlc2MsIGludCBsbnVtKQoreworCXN0cnVjdCB1Ymlfdm9sdW1lICp2b2wgPSBkZXNjLT52b2w7CisKKwlkYmdfbXNnKCJ0ZXN0IExFQiAlZDolZCIsIHZvbC0+dm9sX2lkLCBsbnVtKTsKKworCWlmIChsbnVtIDwgMCB8fCBsbnVtID49IHZvbC0+cmVzZXJ2ZWRfcGVicykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAodm9sLT51cGRfbWFya2VyKQorCQlyZXR1cm4gLUVCQURGOworCisJcmV0dXJuIHZvbC0+ZWJhX3RibFtsbnVtXSA+PSAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwodWJpX2lzX21hcHBlZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC91YmkvbWlzYy5jIGIvZHJpdmVycy9tdGQvdWJpL21pc2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGQ0ZTY3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tdGQvdWJpL21pc2MuYwpAQCAtMCwwICsxLDEwNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiwgMjAwNgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUKKyAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiBBdXRob3I6IEFydGVtIEJpdHl1dHNraXkgKNCR0LjRgtGO0YbQutC40Lkg0JDRgNGC0ZHQvCkKKyAqLworCisvKiBIZXJlIHdlIGtlZXAgbWlzY2VsbGFuZW91cyBmdW5jdGlvbnMgd2hpY2ggYXJlIHVzZWQgYWxsIG92ZXIgdGhlIFVCSSBjb2RlICovCisKKyNpbmNsdWRlICJ1YmkuaCIKKworLyoqCisgKiBjYWxjX2RhdGFfbGVuIC0gY2FsY3VsYXRlIGhvdyBtdWNoIHJlYWwgZGF0YSBpcyBzdG9yZWQgaW4gYSBidWZmZXIuCisgKiBAdWJpOiBVQkkgZGV2aWNlIGRlc2NyaXB0aW9uIG9iamVjdAorICogQGJ1ZjogYSBidWZmZXIgd2l0aCB0aGUgY29udGVudHMgb2YgdGhlIHBoeXNpY2FsIGVyYXNlYmxvY2sKKyAqIEBsZW5ndGg6IHRoZSBidWZmZXIgbGVuZ3RoCisgKgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIGhvdyBtdWNoICJyZWFsIGRhdGEiIGlzIHN0b3JlZCBpbiBAYnVmIGFuZCByZXR1cm5lcworICogdGhlIGxlbmd0aC4gQ29udGludW91cyAweEZGIGJ5dGVzIGF0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciBhcmUgbm90CisgKiBjb25zaWRlcmVkIGFzICJyZWFsIGRhdGEiLgorICovCitpbnQgdWJpX2NhbGNfZGF0YV9sZW4oY29uc3Qgc3RydWN0IHViaV9kZXZpY2UgKnViaSwgY29uc3Qgdm9pZCAqYnVmLAorCQkgICAgICBpbnQgbGVuZ3RoKQoreworCWludCBpOworCisJdWJpX2Fzc2VydChsZW5ndGggJSB1YmktPm1pbl9pb19zaXplID09IDApOworCisJZm9yIChpID0gbGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pCisJCWlmICgoKGNvbnN0IHVpbnQ4X3QgKilidWYpW2ldICE9IDB4RkYpCisJCQlicmVhazsKKworCS8qIFRoZSByZXN1bHRpbmcgbGVuZ3RoIG11c3QgYmUgYWxpZ25lZCB0byB0aGUgbWluaW11bSBmbGFzaCBJL08gc2l6ZSAqLworCWxlbmd0aCA9IEFMSUdOKGkgKyAxLCB1YmktPm1pbl9pb19zaXplKTsKKwlyZXR1cm4gbGVuZ3RoOworfQorCisvKioKKyAqIHViaV9jaGVja192b2x1bWUgLSBjaGVjayB0aGUgY29udGVudHMgb2YgYSBzdGF0aWMgdm9sdW1lLgorICogQHViaTogVUJJIGRldmljZSBkZXNjcmlwdGlvbiBvYmplY3QKKyAqIEB2b2xfaWQ6IElEIG9mIHRoZSB2b2x1bWUgdG8gY2hlY2sKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNoZWNrcyBpZiBzdGF0aWMgdm9sdW1lIEB2b2xfaWQgaXMgY29ycnVwdGVkIGJ5IGZ1bGx5IHJlYWRpbmcKKyAqIGl0IGFuZCBjaGVja2luZyBkYXRhIENSQy4gVGhpcyBmdW5jdGlvbiByZXR1cm5zICUwIGlmIHRoZSB2b2x1bWUgaXMgbm90CisgKiBjb3JydXB0ZWQsICUxIGlmIGl0IGlzIGNvcnJ1cHRlZCBhbmQgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIGluIGNhc2Ugb2YKKyAqIGZhaWx1cmUuIER5bmFtaWMgdm9sdW1lcyBhcmUgbm90IGNoZWNrZWQgYW5kIHplcm8gaXMgcmV0dXJuZWQgaW1tZWRpYXRlbHkuCisgKi8KK2ludCB1YmlfY2hlY2tfdm9sdW1lKHN0cnVjdCB1YmlfZGV2aWNlICp1YmksIGludCB2b2xfaWQpCit7CisJdm9pZCAqYnVmOworCWludCBlcnIgPSAwLCBpOworCXN0cnVjdCB1Ymlfdm9sdW1lICp2b2wgPSB1YmktPnZvbHVtZXNbdm9sX2lkXTsKKworCWlmICh2b2wtPnZvbF90eXBlICE9IFVCSV9TVEFUSUNfVk9MVU1FKQorCQlyZXR1cm4gMDsKKworCWJ1ZiA9IGttYWxsb2Modm9sLT51c2FibGVfbGViX3NpemUsIEdGUF9LRVJORUwpOworCWlmICghYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZvciAoaSA9IDA7IGkgPCB2b2wtPnVzZWRfZWJzOyBpKyspIHsKKwkJaW50IHNpemU7CisKKwkJaWYgKGkgPT0gdm9sLT51c2VkX2VicyAtIDEpCisJCQlzaXplID0gdm9sLT5sYXN0X2ViX2J5dGVzOworCQllbHNlCisJCQlzaXplID0gdm9sLT51c2FibGVfbGViX3NpemU7CisKKwkJZXJyID0gdWJpX2ViYV9yZWFkX2xlYih1YmksIHZvbF9pZCwgaSwgYnVmLCAwLCBzaXplLCAxKTsKKwkJaWYgKGVycikgeworCQkJaWYgKGVyciA9PSAtRUJBRE1TRykKKwkJCQllcnIgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlrZnJlZShidWYpOworCXJldHVybiBlcnI7Cit9CisKKy8qKgorICogdWJpX2NhbGN1bGF0ZV9yc3ZkX3Bvb2wgLSBjYWxjdWxhdGUgaG93IG1hbnkgUEVCcyBtdXN0IGJlIHJlc2VydmVkIGZvciBiYWQKKyAqIGVyYXNlYmxvY2sgaGFuZGxpbmcuCisgKiBAdWJpOiBVQkkgZGV2aWNlIGRlc2NyaXB0aW9uIG9iamVjdAorICovCit2b2lkIHViaV9jYWxjdWxhdGVfcmVzZXJ2ZWQoc3RydWN0IHViaV9kZXZpY2UgKnViaSkKK3sKKwl1YmktPmJlYl9yc3ZkX2xldmVsID0gdWJpLT5nb29kX3BlYl9jb3VudC8xMDA7CisJdWJpLT5iZWJfcnN2ZF9sZXZlbCAqPSBDT05GSUdfTVREX1VCSV9CRUJfUkVTRVJWRTsKKwlpZiAodWJpLT5iZWJfcnN2ZF9sZXZlbCA8IE1JTl9SRVNFVkVEX1BFQlMpCisJCXViaS0+YmViX3JzdmRfbGV2ZWwgPSBNSU5fUkVTRVZFRF9QRUJTOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvdWJpL3NjYW4uYyBiL2RyaXZlcnMvbXRkL3ViaS9zY2FuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDczZjMyMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbXRkL3ViaS9zY2FuLmMKQEAgLTAsMCArMSwxMzY4IEBACisvKgorICogQ29weXJpZ2h0IChjKSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuLCAyMDA2CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZQorICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqIEF1dGhvcjogQXJ0ZW0gQml0eXV0c2tpeSAo0JHQuNGC0Y7RhtC60LjQuSDQkNGA0YLRkdC8KQorICovCisKKy8qCisgKiBVQkkgc2Nhbm5pbmcgdW5pdC4KKyAqCisgKiBUaGlzIHVuaXQgaXMgcmVzcG9uc2libGUgZm9yIHNjYW5uaW5nIHRoZSBmbGFzaCBtZWRpYSwgY2hlY2tpbmcgVUJJCisgKiBoZWFkZXJzIGFuZCBwcm92aWRpbmcgY29tcGxldGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIFVCSSBmbGFzaCBpbWFnZS4KKyAqCisgKiBUaGUgc2Nhbm5pbmcgaW5mb3JtYXRpb24gaXMgcmVvcmVzZW50ZWQgYnkgYSAmc3RydWN0IHViaV9zY2FuX2luZm8nIG9iamVjdC4KKyAqIEluZm9ybWF0aW9uIGFib3V0IGZvdW5kIHZvbHVtZXMgaXMgcmVwcmVzZW50ZWQgYnkgJnN0cnVjdCB1Ymlfc2Nhbl92b2x1bWUKKyAqIG9iamVjdHMgd2hpY2ggYXJlIGtlcHQgaW4gdm9sdW1lIFJCLXRyZWUgd2l0aCByb290IGF0IHRoZSBAdm9sdW1lcyBmaWVsZC4KKyAqIFRoZSBSQi10cmVlIGlzIGluZGV4ZWQgYnkgdGhlIHZvbHVtZSBJRC4KKyAqCisgKiBGb3VuZCBsb2dpY2FsIGVyYXNlYmxvY2tzIGFyZSByZXByZXNlbnRlZCBieSAmc3RydWN0IHViaV9zY2FuX2xlYiBvYmplY3RzLgorICogVGhlc2Ugb2JqZWN0cyBhcmUga2VwdCBpbiBwZXItdm9sdW1lIFJCLXRyZWVzIHdpdGggdGhlIHJvb3QgYXQgdGhlCisgKiBjb3JyZXNwb25kaW5nICZzdHJ1Y3QgdWJpX3NjYW5fdm9sdW1lIG9iamVjdC4gVG8gcHV0IGl0IGRpZmZlcmVudGx5LCB3ZSBrZWVwCisgKiBhbiBSQi10cmVlIG9mIHBlci12b2x1bWUgb2JqZWN0cyBhbmQgZWFjaCBvZiB0aGVzZSBvYmplY3RzIGlzIHRoZSByb290IG9mCisgKiBSQi10cmVlIG9mIHBlci1lcmFzZWJsb2NrIG9iamVjdHMuCisgKgorICogQ29ycnVwdGVkIHBoeXNpY2FsIGVyYXNlYmxvY2tzIGFyZSBwdXQgdG8gdGhlIEBjb3JyIGxpc3QsIGZyZWUgcGh5c2ljYWwKKyAqIGVyYXNlYmxvY2tzIGFyZSBwdXQgdG8gdGhlIEBmcmVlIGxpc3QgYW5kIHRoZSBwaHlzaWNhbCBlcmFzZWJsb2NrIHRvIGJlCisgKiBlcmFzZWQgYXJlIHB1dCB0byB0aGUgQGVyYXNlIGxpc3QuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisjaW5jbHVkZSAidWJpLmgiCisKKyNpZmRlZiBDT05GSUdfTVREX1VCSV9ERUJVR19QQVJBTk9JRAorc3RhdGljIGludCBwYXJhbm9pZF9jaGVja19zaShjb25zdCBzdHJ1Y3QgdWJpX2RldmljZSAqdWJpLAorCQkJICAgICBzdHJ1Y3QgdWJpX3NjYW5faW5mbyAqc2kpOworI2Vsc2UKKyNkZWZpbmUgcGFyYW5vaWRfY2hlY2tfc2kodWJpLCBzaSkgMAorI2VuZGlmCisKKy8qIFRlbXBvcmFyeSB2YXJpYWJsZXMgdXNlZCBkdXJpbmcgc2Nhbm5pbmcgKi8KK3N0YXRpYyBzdHJ1Y3QgdWJpX2VjX2hkciAqZWNoOworc3RhdGljIHN0cnVjdCB1YmlfdmlkX2hkciAqdmlkaDsKKworaW50IHViaV9zY2FuX2FkZF90b19saXN0KHN0cnVjdCB1Ymlfc2Nhbl9pbmZvICpzaSwgaW50IHBudW0sIGludCBlYywKKwkJCSBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KQoreworCXN0cnVjdCB1Ymlfc2Nhbl9sZWIgKnNlYjsKKworCWlmIChsaXN0ID09ICZzaS0+ZnJlZSkKKwkJZGJnX2JsZCgiYWRkIHRvIGZyZWU6IFBFQiAlZCwgRUMgJWQiLCBwbnVtLCBlYyk7CisJZWxzZSBpZiAobGlzdCA9PSAmc2ktPmVyYXNlKQorCQlkYmdfYmxkKCJhZGQgdG8gZXJhc2U6IFBFQiAlZCwgRUMgJWQiLCBwbnVtLCBlYyk7CisJZWxzZSBpZiAobGlzdCA9PSAmc2ktPmNvcnIpCisJCWRiZ19ibGQoImFkZCB0byBjb3JydXB0ZWQ6IFBFQiAlZCwgRUMgJWQiLCBwbnVtLCBlYyk7CisJZWxzZSBpZiAobGlzdCA9PSAmc2ktPmFsaWVuKQorCQlkYmdfYmxkKCJhZGQgdG8gYWxpZW46IFBFQiAlZCwgRUMgJWQiLCBwbnVtLCBlYyk7CisJZWxzZQorCQlCVUcoKTsKKworCXNlYiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB1Ymlfc2Nhbl9sZWIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNlYikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzZWItPnBudW0gPSBwbnVtOworCXNlYi0+ZWMgPSBlYzsKKwlsaXN0X2FkZF90YWlsKCZzZWItPnUubGlzdCwgbGlzdCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogY29tbWl0X3RvX21lYW5fdmFsdWUgLSBjb21taXQgaW50ZXJtZWRpYXRlIHJlc3VsdHMgdG8gdGhlIGZpbmFsIG1lYW4gZXJhc2UKKyAqIGNvdW50ZXIgdmFsdWUuCisgKiBAc2k6IHNjYW5uaW5nIGluZm9ybWF0aW9uCisgKgorICogVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiB3aGljaCBjYWxjdWxhdGVzIHBhcnRpYWwgbWVhbiBlcmFzZSBjb3VudGVyIG1lYW4KKyAqIHZhbHVlIGFuZCBhZGRzIGl0IHRvIHRoZSByZXN1bHRpbmcgbWVhbiB2YWx1ZS4gQXMgd2UgY2FuIHdvcmsgb25seSBpbgorICogaW50ZWdlciBhcml0aG1ldGljIGFuZCB3ZSB3YW50IHRvIGNhbGN1bGF0ZSB0aGUgbWVhbiB2YWx1ZSBvZiBlcmFzZSBjb3VudGVyCisgKiBhY2N1cmF0ZWx5LCB3ZSBmaXJzdCBzdW0gZXJhc2UgY291bnRlciB2YWx1ZXMgaW4gQHNpLT5lY19zdW0gdmFyaWFibGUgYW5kCisgKiBjb3VudCB0aGVzZSBjb21wb25lbnRzIGluIEBzaS0+ZWNfY291bnQuIElmIHRoaXMgdGVtcG9yYXJ5IEBzaS0+ZWNfc3VtIGlzCisgKiBnb2luZyB0byBvdmVyZmxvdywgd2UgY2FsY3VsYXRlIHRoZSBwYXJ0aWFsIG1lYW4gdmFsdWUKKyAqIChAc2ktPmVjX3N1bS9Ac2ktPmVjX2NvdW50KSBhbmQgYWRkIGl0IHRvIEBzaS0+bWVhbl9lYy4KKyAqLworc3RhdGljIHZvaWQgY29tbWl0X3RvX21lYW5fdmFsdWUoc3RydWN0IHViaV9zY2FuX2luZm8gKnNpKQoreworCXNpLT5lY19zdW0gLz0gc2ktPmVjX2NvdW50OworCWlmIChzaS0+ZWNfc3VtICUgc2ktPmVjX2NvdW50ID49IHNpLT5lY19jb3VudCAvIDIpCisJCXNpLT5tZWFuX2VjICs9IDE7CisJc2ktPm1lYW5fZWMgKz0gc2ktPmVjX3N1bTsKK30KKworLyoqCisgKiB2YWxpZGF0ZV92aWRfaGRyIC0gY2hlY2sgdGhhdCB2b2x1bWUgaWRlbnRpZmllciBoZWFkZXIgaXMgY29ycmVjdCBhbmQKKyAqIGNvbnNpc3RlbnQuCisgKiBAdmlkX2hkcjogdGhlIHZvbHVtZSBpZGVudGlmaWVyIGhlYWRlciB0byBjaGVjaworICogQHN2OiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdm9sdW1lIHRoaXMgbG9naWNhbCBlcmFzZWJsb2NrIGJlbG9uZ3MgdG8KKyAqIEBwbnVtOiBwaHlzaWNhbCBlcmFzZWJsb2NrIG51bWJlciB0aGUgVklEIGhlYWRlciBjYW1lIGZyb20KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNoZWNrcyB0aGF0IGRhdGEgc3RvcmVkIGluIEB2aWRfaGRyIGlzIGNvbnNpc3RlbnQuIFJldHVybnMKKyAqIG5vbi16ZXJvIGlmIGFuIGluY29uc2lzdGVuY3kgd2FzIGZvdW5kIGFuZCB6ZXJvIGlmIG5vdC4KKyAqCisgKiBOb3RlLCBVQkkgZG9lcyBzYW5pdHkgY2hlY2sgb2YgZXZlcnl0aGluZyBpdCByZWFkcyBmcm9tIHRoZSBmbGFzaCBtZWRpYS4KKyAqIE1vc3Qgb2YgdGhlIGNoZWNrcyBhcmUgZG9uZSBpbiB0aGUgSS9PIHVuaXQuIEhlcmUgd2UgY2hlY2sgdGhhdCB0aGUKKyAqIGluZm9ybWF0aW9uIGluIHRoZSBWSUQgaGVhZGVyIGlzIGNvbnNpc3RlbnQgdG8gdGhlIGluZm9ybWF0aW9uIGluIG90aGVyIFZJRAorICogaGVhZGVycyBvZiB0aGUgc2FtZSB2b2x1bWUuCisgKi8KK3N0YXRpYyBpbnQgdmFsaWRhdGVfdmlkX2hkcihjb25zdCBzdHJ1Y3QgdWJpX3ZpZF9oZHIgKnZpZF9oZHIsCisJCQkgICAgY29uc3Qgc3RydWN0IHViaV9zY2FuX3ZvbHVtZSAqc3YsIGludCBwbnVtKQoreworCWludCB2b2xfdHlwZSA9IHZpZF9oZHItPnZvbF90eXBlOworCWludCB2b2xfaWQgPSB1YmkzMl90b19jcHUodmlkX2hkci0+dm9sX2lkKTsKKwlpbnQgdXNlZF9lYnMgPSB1YmkzMl90b19jcHUodmlkX2hkci0+dXNlZF9lYnMpOworCWludCBkYXRhX3BhZCA9IHViaTMyX3RvX2NwdSh2aWRfaGRyLT5kYXRhX3BhZCk7CisKKwlpZiAoc3YtPmxlYl9jb3VudCAhPSAwKSB7CisJCWludCBzdl92b2xfdHlwZTsKKworCQkvKgorCQkgKiBUaGlzIGlzIG5vdCB0aGUgZmlyc3QgbG9naWNhbCBlcmFzZWJsb2NrIGJlbG9uZ2luZyB0byB0aGlzCisJCSAqIHZvbHVtZS4gRW5zdXJlIHRoYXQgdGhlIGRhdGEgaW4gaXRzIFZJRCBoZWFkZXIgaXMgY29uc2lzdGVudAorCQkgKiB0byB0aGUgZGF0YSBpbiBwcmV2aW91cyBsb2dpY2FsIGVyYXNlYmxvY2sgaGVhZGVycy4KKwkJICovCisKKwkJaWYgKHZvbF9pZCAhPSBzdi0+dm9sX2lkKSB7CisJCQlkYmdfZXJyKCJpbmNvbnNpc3RlbnQgdm9sX2lkIik7CisJCQlnb3RvIGJhZDsKKwkJfQorCisJCWlmIChzdi0+dm9sX3R5cGUgPT0gVUJJX1NUQVRJQ19WT0xVTUUpCisJCQlzdl92b2xfdHlwZSA9IFVCSV9WSURfU1RBVElDOworCQllbHNlCisJCQlzdl92b2xfdHlwZSA9IFVCSV9WSURfRFlOQU1JQzsKKworCQlpZiAodm9sX3R5cGUgIT0gc3Zfdm9sX3R5cGUpIHsKKwkJCWRiZ19lcnIoImluY29uc2lzdGVudCB2b2xfdHlwZSIpOworCQkJZ290byBiYWQ7CisJCX0KKworCQlpZiAodXNlZF9lYnMgIT0gc3YtPnVzZWRfZWJzKSB7CisJCQlkYmdfZXJyKCJpbmNvbnNpc3RlbnQgdXNlZF9lYnMiKTsKKwkJCWdvdG8gYmFkOworCQl9CisKKwkJaWYgKGRhdGFfcGFkICE9IHN2LT5kYXRhX3BhZCkgeworCQkJZGJnX2VycigiaW5jb25zaXN0ZW50IGRhdGFfcGFkIik7CisJCQlnb3RvIGJhZDsKKwkJfQorCX0KKworCXJldHVybiAwOworCitiYWQ6CisJdWJpX2VycigiaW5jb25zaXN0ZW50IFZJRCBoZWFkZXIgYXQgUEVCICVkIiwgcG51bSk7CisJdWJpX2RiZ19kdW1wX3ZpZF9oZHIodmlkX2hkcik7CisJdWJpX2RiZ19kdW1wX3N2KHN2KTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyoqCisgKiBhZGRfdm9sdW1lIC0gYWRkIHZvbHVtZSB0byB0aGUgc2Nhbm5pbmcgaW5mb3JtYXRpb24uCisgKiBAc2k6IHNjYW5uaW5nIGluZm9ybWF0aW9uCisgKiBAdm9sX2lkOiBJRCBvZiB0aGUgdm9sdW1lIHRvIGFkZAorICogQHBudW06IHBoeXNpY2FsIGVyYXNlYmxvY2sgbnVtYmVyCisgKiBAdmlkX2hkcjogdm9sdW1lIGlkZW50aWZpZXIgaGVhZGVyCisgKgorICogSWYgdGhlIHZvbHVtZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBAdmlkX2hkciBsb2dpY2FsIGVyYXNlYmxvY2sgaXMgYWxyZWFkeQorICogcHJlc2VudCBpbiB0aGUgc2Nhbm5pbmcgaW5mb3JtYXRpb24sIHRoaXMgZnVuY3Rpb24gZG9lcyBub3RoaW5nLiBPdGhlcndpc2UKKyAqIGl0IGFkZHMgY29ycmVzcG9uZGluZyB2b2x1bWUgdG8gdGhlIHNjYW5uaW5nIGluZm9ybWF0aW9uLiBSZXR1cm5zIGEgcG9pbnRlcgorICogdG8gdGhlIHNjYW5uaW5nIHZvbHVtZSBvYmplY3QgaW4gY2FzZSBvZiBzdWNjZXNzIGFuZCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUKKyAqIGluIGNhc2Ugb2YgZmFpbHVyZS4KKyAqLworc3RhdGljIHN0cnVjdCB1Ymlfc2Nhbl92b2x1bWUgKmFkZF92b2x1bWUoc3RydWN0IHViaV9zY2FuX2luZm8gKnNpLCBpbnQgdm9sX2lkLAorCQkJCQkgIGludCBwbnVtLAorCQkJCQkgIGNvbnN0IHN0cnVjdCB1YmlfdmlkX2hkciAqdmlkX2hkcikKK3sKKwlzdHJ1Y3QgdWJpX3NjYW5fdm9sdW1lICpzdjsKKwlzdHJ1Y3QgcmJfbm9kZSAqKnAgPSAmc2ktPnZvbHVtZXMucmJfbm9kZSwgKnBhcmVudCA9IE5VTEw7CisKKwl1YmlfYXNzZXJ0KHZvbF9pZCA9PSB1YmkzMl90b19jcHUodmlkX2hkci0+dm9sX2lkKSk7CisKKwkvKiBXYWxrIHRoZSB2b2x1bWUgUkItdHJlZSB0byBsb29rIGlmIHRoaXMgdm9sdW1lIGlzIGFscmVhZHkgcHJlc2VudCAqLworCXdoaWxlICgqcCkgeworCQlwYXJlbnQgPSAqcDsKKwkJc3YgPSByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCB1Ymlfc2Nhbl92b2x1bWUsIHJiKTsKKworCQlpZiAodm9sX2lkID09IHN2LT52b2xfaWQpCisJCQlyZXR1cm4gc3Y7CisKKwkJaWYgKHZvbF9pZCA+IHN2LT52b2xfaWQpCisJCQlwID0gJigqcCktPnJiX2xlZnQ7CisJCWVsc2UKKwkJCXAgPSAmKCpwKS0+cmJfcmlnaHQ7CisJfQorCisJLyogVGhlIHZvbHVtZSBpcyBhYnNlbnQgLSBhZGQgaXQgKi8KKwlzdiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB1Ymlfc2Nhbl92b2x1bWUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXN2KQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCXN2LT5oaWdoZXN0X2xudW0gPSBzdi0+bGViX2NvdW50ID0gMDsKKwlzaS0+bWF4X3NxbnVtID0gMDsKKwlzdi0+dm9sX2lkID0gdm9sX2lkOworCXN2LT5yb290ID0gUkJfUk9PVDsKKwlzdi0+dXNlZF9lYnMgPSB1YmkzMl90b19jcHUodmlkX2hkci0+dXNlZF9lYnMpOworCXN2LT5kYXRhX3BhZCA9IHViaTMyX3RvX2NwdSh2aWRfaGRyLT5kYXRhX3BhZCk7CisJc3YtPmNvbXBhdCA9IHZpZF9oZHItPmNvbXBhdDsKKwlzdi0+dm9sX3R5cGUgPSB2aWRfaGRyLT52b2xfdHlwZSA9PSBVQklfVklEX0RZTkFNSUMgPyBVQklfRFlOQU1JQ19WT0xVTUUKKwkJCQkJCQkgICAgOiBVQklfU1RBVElDX1ZPTFVNRTsKKwlpZiAodm9sX2lkID4gc2ktPmhpZ2hlc3Rfdm9sX2lkKQorCQlzaS0+aGlnaGVzdF92b2xfaWQgPSB2b2xfaWQ7CisKKwlyYl9saW5rX25vZGUoJnN2LT5yYiwgcGFyZW50LCBwKTsKKwlyYl9pbnNlcnRfY29sb3IoJnN2LT5yYiwgJnNpLT52b2x1bWVzKTsKKwlzaS0+dm9sc19mb3VuZCArPSAxOworCWRiZ19ibGQoImFkZGVkIHZvbHVtZSAlZCIsIHZvbF9pZCk7CisJcmV0dXJuIHN2OworfQorCisvKioKKyAqIGNvbXBhcmVfbGVicyAtIGZpbmQgb3V0IHdoaWNoIGxvZ2ljYWwgZXJhc2VibG9jayBpcyBuZXdlci4KKyAqIEB1Ymk6IFVCSSBkZXZpY2UgZGVzY3JpcHRpb24gb2JqZWN0CisgKiBAc2ViOiBmaXJzdCBsb2dpY2FsIGVyYXNlYmxvY2sgdG8gY29tcGFyZQorICogQHBudW06IHBoeXNpY2FsIGVyYXNlYmxvY2sgbnVtYmVyIG9mIHRoZSBzZWNvbmQgbG9naWNhbCBlcmFzZWJsb2NrIHRvCisgKiBjb21wYXJlCisgKiBAdmlkX2hkcjogdm9sdW1lIGlkZW50aWZpZXIgaGVhZGVyIG9mIHRoZSBzZWNvbmQgbG9naWNhbCBlcmFzZWJsb2NrCisgKgorICogVGhpcyBmdW5jdGlvbiBjb21wYXJlcyAyIGNvcGllcyBvZiBhIExFQiBhbmQgaW5mb3JtcyB3aGljaCBvbmUgaXMgbmV3ZXIuIEluCisgKiBjYXNlIG9mIHN1Y2Nlc3MgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgcG9zaXRpdmUgdmFsdWUsIGluIGNhc2Ugb2YgZmFpbHVyZSwgYQorICogbmVnYXRpdmUgZXJyb3IgY29kZSBpcyByZXR1cm5lZC4gVGhlIHN1Y2Nlc3MgcmV0dXJuIGNvZGVzIHVzZSB0aGUgZm9sbG93aW5nCisgKiBiaXRzOgorICogICAgIG8gYml0IDAgaXMgY2xlYXJlZDogdGhlIGZpcnN0IFBFQiAoZGVzY3JpYmVkIGJ5IEBzZWIpIGlzIG5ld2VyIHRoZW4gdGhlCisgKiAgICAgICBzZWNvbmQgUEVCIChkZXNjcmliZWQgYnkgQHBudW0gYW5kIEB2aWRfaGRyKTsKKyAqICAgICBvIGJpdCAwIGlzIHNldDogdGhlIHNlY29uZCBQRUIgaXMgbmV3ZXI7CisgKiAgICAgbyBiaXQgMSBpcyBjbGVhcmVkOiBubyBiaXQtZmxpcHMgd2VyZSBkZXRlY3RlZCBpbiB0aGUgbmV3ZXIgTEVCOworICogICAgIG8gYml0IDEgaXMgc2V0OiBiaXQtZmxpcHMgd2VyZSBkZXRlY3RlZCBpbiB0aGUgbmV3ZXIgTEVCOworICogICAgIG8gYml0IDIgaXMgY2xlYXJlZDogdGhlIG9sZGVyIExFQiBpcyBub3QgY29ycnVwdGVkOworICogICAgIG8gYml0IDIgaXMgc2V0OiB0aGUgb2xkZXIgTEVCIGlzIGNvcnJ1cHRlZC4KKyAqLworc3RhdGljIGludCBjb21wYXJlX2xlYnMoY29uc3Qgc3RydWN0IHViaV9kZXZpY2UgKnViaSwKKwkJCWNvbnN0IHN0cnVjdCB1Ymlfc2Nhbl9sZWIgKnNlYiwgaW50IHBudW0sCisJCQljb25zdCBzdHJ1Y3QgdWJpX3ZpZF9oZHIgKnZpZF9oZHIpCit7CisJdm9pZCAqYnVmOworCWludCBsZW4sIGVyciwgc2Vjb25kX2lzX25ld2VyLCBiaXRmbGlwcyA9IDAsIGNvcnJ1cHRlZCA9IDA7CisJdWludDMyX3QgZGF0YV9jcmMsIGNyYzsKKwlzdHJ1Y3QgdWJpX3ZpZF9oZHIgKnZpZGggPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgbG9uZyBzcW51bTIgPSB1Ymk2NF90b19jcHUodmlkX2hkci0+c3FudW0pOworCisJaWYgKHNlYi0+c3FudW0gPT0gMCAmJiBzcW51bTIgPT0gMCkgeworCQlsb25nIGxvbmcgYWJzLCB2MSA9IHNlYi0+bGViX3ZlciwgdjIgPSB1YmkzMl90b19jcHUodmlkX2hkci0+bGViX3Zlcik7CisKKwkJLyoKKwkJICogVUJJIGNvbnN0YW50bHkgaW5jcmVhc2VzIHRoZSBsb2dpY2FsIGVyYXNlYmxvY2sgdmVyc2lvbgorCQkgKiBudW1iZXIgYW5kIGl0IGNhbiBvdmVyZmxvdy4gVGh1cywgd2UgaGF2ZSB0byBiZWFyIGluIG1pbmQKKwkJICogdGhhdCB2ZXJzaW9ucyB0aGF0IGFyZSBjbG9zZSB0byAlMHhGRkZGRkZGRiBhcmUgbGVzcyB0aGVuCisJCSAqIHZlcnNpb25zIHRoYXQgYXJlIGNsb3NlIHRvICUwLgorCQkgKgorCQkgKiBUaGUgVUJJIFdMIHVuaXQgZ3VhcmFudGVlcyB0aGF0IHRoZSBudW1iZXIgb2YgcGVuZGluZyB0YXNrcworCQkgKiBpcyBub3QgZ3JlYXRlciB0aGVuICUweDdGRkZGRkZGLiBTbywgaWYgdGhlIGRpZmZlcmVuY2UKKwkJICogYmV0d2VlbiBhbnkgdHdvIHZlcnNpb25zIGlzIGdyZWF0ZXIgb3IgZXF1aXZhbGVudCB0bworCQkgKiAlMHg3RkZGRkZGRiwgdGhlcmUgd2FzIGFuIG92ZXJmbG93IGFuZCB0aGUgbG9naWNhbAorCQkgKiBlcmFzZWJsb2NrIHdpdGggbG93ZXIgdmVyc2lvbiBpcyBhY3R1YWxseSBuZXdlciB0aGVuIHRoZSBvbmUKKwkJICogd2l0aCBoaWdoZXIgdmVyc2lvbi4KKwkJICoKKwkJICogRklYTUU6IGJ1dCB0aGlzIGlzIGFueXdheSBvYnNvbGV0ZSBhbmQgd2lsbCBiZSByZW1vdmVkIGF0CisJCSAqIHNvbWUgcG9pbnQuCisJCSAqLworCisJCWRiZ19ibGQoInVzaW5nIG9sZCBjcmFwcHkgbGViX3ZlciBzdHVmZiIpOworCisJCWFicyA9IHYxIC0gdjI7CisJCWlmIChhYnMgPCAwKQorCQkJYWJzID0gLWFiczsKKworCQlpZiAoYWJzIDwgMHg3RkZGRkZGRikKKwkJCS8qIE5vbi1vdmVyZmxvdyBzaXR1YXRpb24gKi8KKwkJCXNlY29uZF9pc19uZXdlciA9ICh2MiA+IHYxKTsKKwkJZWxzZQorCQkJc2Vjb25kX2lzX25ld2VyID0gKHYyIDwgdjEpOworCX0gZWxzZQorCQkvKiBPYnZpb3VzbHkgdGhlIExFQiB3aXRoIGxvd2VyIHNlcXVlbmNlIGNvdW50ZXIgaXMgb2xkZXIgKi8KKwkJc2Vjb25kX2lzX25ld2VyID0gc3FudW0yID4gc2ViLT5zcW51bTsKKworCS8qCisJICogTm93IHdlIGtub3cgd2hpY2ggY29weSBpcyBuZXdlci4gSWYgdGhlIGNvcHkgZmxhZyBvZiB0aGUgUEVCIHdpdGgKKwkgKiBuZXdlciB2ZXJzaW9uIGlzIG5vdCBzZXQsIHRoZW4gd2UganVzdCByZXR1cm4sIG90aGVyd2lzZSB3ZSBoYXZlIHRvCisJICogY2hlY2sgZGF0YSBDUkMuIEZvciB0aGUgc2Vjb25kIFBFQiB3ZSBhbHJlYWR5IGhhdmUgdGhlIFZJRCBoZWFkZXIsCisJICogZm9yIHRoZSBmaXJzdCBvbmUgLSB3ZSdsbCBuZWVkIHRvIHJlLXJlYWQgaXQgZnJvbSBmbGFzaC4KKwkgKgorCSAqIEZJWE1FOiB0aGlzIG1heSBiZSBvcHRpbWl6ZWQgc28gdGhhdCB3ZSB3b3VsZG4ndCByZWFkIHR3aWNlLgorCSAqLworCisJaWYgKHNlY29uZF9pc19uZXdlcikgeworCQlpZiAoIXZpZF9oZHItPmNvcHlfZmxhZykgeworCQkJLyogSXQgaXMgbm90IGEgY29weSwgc28gaXQgaXMgbmV3ZXIgKi8KKwkJCWRiZ19ibGQoInNlY29uZCBQRUIgJWQgaXMgbmV3ZXIsIGNvcHlfZmxhZyBpcyB1bnNldCIsCisJCQkJcG51bSk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0gZWxzZSB7CisJCXBudW0gPSBzZWItPnBudW07CisKKwkJdmlkaCA9IHViaV96YWxsb2NfdmlkX2hkcih1YmkpOworCQlpZiAoIXZpZGgpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQllcnIgPSB1YmlfaW9fcmVhZF92aWRfaGRyKHViaSwgcG51bSwgdmlkaCwgMCk7CisJCWlmIChlcnIpIHsKKwkJCWlmIChlcnIgPT0gVUJJX0lPX0JJVEZMSVBTKQorCQkJCWJpdGZsaXBzID0gMTsKKwkJCWVsc2UgeworCQkJCWRiZ19lcnIoIlZJRCBvZiBQRUIgJWQgaGVhZGVyIGlzIGJhZCwgYnV0IGl0ICIKKwkJCQkJIndhcyBPSyBlYXJsaWVyIiwgcG51bSk7CisJCQkJaWYgKGVyciA+IDApCisJCQkJCWVyciA9IC1FSU87CisKKwkJCQlnb3RvIG91dF9mcmVlX3ZpZGg7CisJCQl9CisJCX0KKworCQlpZiAoIXZpZGgtPmNvcHlfZmxhZykgeworCQkJLyogSXQgaXMgbm90IGEgY29weSwgc28gaXQgaXMgbmV3ZXIgKi8KKwkJCWRiZ19ibGQoImZpcnN0IFBFQiAlZCBpcyBuZXdlciwgY29weV9mbGFnIGlzIHVuc2V0IiwKKwkJCQlwbnVtKTsKKwkJCWVyciA9IGJpdGZsaXBzIDw8IDE7CisJCQlnb3RvIG91dF9mcmVlX3ZpZGg7CisJCX0KKworCQl2aWRfaGRyID0gdmlkaDsKKwl9CisKKwkvKiBSZWFkIHRoZSBkYXRhIG9mIHRoZSBjb3B5IGFuZCBjaGVjayB0aGUgQ1JDICovCisKKwlsZW4gPSB1YmkzMl90b19jcHUodmlkX2hkci0+ZGF0YV9zaXplKTsKKwlidWYgPSBrbWFsbG9jKGxlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWYpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBvdXRfZnJlZV92aWRoOworCX0KKworCWVyciA9IHViaV9pb19yZWFkX2RhdGEodWJpLCBidWYsIHBudW0sIDAsIGxlbik7CisJaWYgKGVyciAmJiBlcnIgIT0gVUJJX0lPX0JJVEZMSVBTKQorCQlnb3RvIG91dF9mcmVlX2J1ZjsKKworCWRhdGFfY3JjID0gdWJpMzJfdG9fY3B1KHZpZF9oZHItPmRhdGFfY3JjKTsKKwljcmMgPSBjcmMzMihVQklfQ1JDMzJfSU5JVCwgYnVmLCBsZW4pOworCWlmIChjcmMgIT0gZGF0YV9jcmMpIHsKKwkJZGJnX2JsZCgiUEVCICVkIENSQyBlcnJvcjogY2FsY3VsYXRlZCAlIzA4eCwgbXVzdCBiZSAlIzA4eCIsCisJCQlwbnVtLCBjcmMsIGRhdGFfY3JjKTsKKwkJY29ycnVwdGVkID0gMTsKKwkJYml0ZmxpcHMgPSAwOworCQlzZWNvbmRfaXNfbmV3ZXIgPSAhc2Vjb25kX2lzX25ld2VyOworCX0gZWxzZSB7CisJCWRiZ19ibGQoIlBFQiAlZCBDUkMgaXMgT0siLCBwbnVtKTsKKwkJYml0ZmxpcHMgPSAhIWVycjsKKwl9CisKKwlrZnJlZShidWYpOworCXViaV9mcmVlX3ZpZF9oZHIodWJpLCB2aWRoKTsKKworCWlmIChzZWNvbmRfaXNfbmV3ZXIpCisJCWRiZ19ibGQoInNlY29uZCBQRUIgJWQgaXMgbmV3ZXIsIGNvcHlfZmxhZyBpcyBzZXQiLCBwbnVtKTsKKwllbHNlCisJCWRiZ19ibGQoImZpcnN0IFBFQiAlZCBpcyBuZXdlciwgY29weV9mbGFnIGlzIHNldCIsIHBudW0pOworCisJcmV0dXJuIHNlY29uZF9pc19uZXdlciB8IChiaXRmbGlwcyA8PCAxKSB8IChjb3JydXB0ZWQgPDwgMik7CisKK291dF9mcmVlX2J1ZjoKKwlrZnJlZShidWYpOworb3V0X2ZyZWVfdmlkaDoKKwl1YmlfZnJlZV92aWRfaGRyKHViaSwgdmlkaCk7CisJdWJpX2Fzc2VydChlcnIgPCAwKTsKKwlyZXR1cm4gZXJyOworfQorCisvKioKKyAqIHViaV9zY2FuX2FkZF91c2VkIC0gYWRkIGluZm9ybWF0aW9uIGFib3V0IGEgcGh5c2ljYWwgZXJhc2VibG9jayB0byB0aGUKKyAqIHNjYW5uaW5nIGluZm9ybWF0aW9uLgorICogQHViaTogVUJJIGRldmljZSBkZXNjcmlwdGlvbiBvYmplY3QKKyAqIEBzaTogc2Nhbm5pbmcgaW5mb3JtYXRpb24KKyAqIEBwbnVtOiB0aGUgcGh5c2ljYWwgZXJhc2VibG9jayBudW1iZXIKKyAqIEBlYzogZXJhc2UgY291bnRlcgorICogQHZpZF9oZHI6IHRoZSB2b2x1bWUgaWRlbnRpZmllciBoZWFkZXIKKyAqIEBiaXRmbGlwczogaWYgYml0LWZsaXBzIHdlcmUgZGV0ZWN0ZWQgd2hlbiB0aGlzIHBoeXNpY2FsIGVyYXNlYmxvY2sgd2FzIHJlYWQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgemVybyBpbiBjYXNlIG9mIHN1Y2Nlc3MgYW5kIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBpbgorICogY2FzZSBvZiBmYWlsdXJlLgorICovCitpbnQgdWJpX3NjYW5fYWRkX3VzZWQoY29uc3Qgc3RydWN0IHViaV9kZXZpY2UgKnViaSwgc3RydWN0IHViaV9zY2FuX2luZm8gKnNpLAorCQkgICAgICBpbnQgcG51bSwgaW50IGVjLCBjb25zdCBzdHJ1Y3QgdWJpX3ZpZF9oZHIgKnZpZF9oZHIsCisJCSAgICAgIGludCBiaXRmbGlwcykKK3sKKwlpbnQgZXJyLCB2b2xfaWQsIGxudW07CisJdWludDMyX3QgbGViX3ZlcjsKKwl1bnNpZ25lZCBsb25nIGxvbmcgc3FudW07CisJc3RydWN0IHViaV9zY2FuX3ZvbHVtZSAqc3Y7CisJc3RydWN0IHViaV9zY2FuX2xlYiAqc2ViOworCXN0cnVjdCByYl9ub2RlICoqcCwgKnBhcmVudCA9IE5VTEw7CisKKwl2b2xfaWQgPSB1YmkzMl90b19jcHUodmlkX2hkci0+dm9sX2lkKTsKKwlsbnVtID0gdWJpMzJfdG9fY3B1KHZpZF9oZHItPmxudW0pOworCXNxbnVtID0gdWJpNjRfdG9fY3B1KHZpZF9oZHItPnNxbnVtKTsKKwlsZWJfdmVyID0gdWJpMzJfdG9fY3B1KHZpZF9oZHItPmxlYl92ZXIpOworCisJZGJnX2JsZCgiUEVCICVkLCBMRUIgJWQ6JWQsIEVDICVkLCBzcW51bSAlbGx1LCB2ZXIgJXUsIGJpdGZsaXBzICVkIiwKKwkJcG51bSwgdm9sX2lkLCBsbnVtLCBlYywgc3FudW0sIGxlYl92ZXIsIGJpdGZsaXBzKTsKKworCXN2ID0gYWRkX3ZvbHVtZShzaSwgdm9sX2lkLCBwbnVtLCB2aWRfaGRyKTsKKwlpZiAoSVNfRVJSKHN2KSA8IDApCisJCXJldHVybiBQVFJfRVJSKHN2KTsKKworCS8qCisJICogV2FsayB0aGUgUkItdHJlZSBvZiBsb2dpY2FsIGVyYXNlYmxvY2tzIG9mIHZvbHVtZSBAdm9sX2lkIHRvIGxvb2sKKwkgKiBpZiB0aGlzIGlzIHRoZSBmaXJzdCBpbnN0YW5jZSBvZiB0aGlzIGxvZ2ljYWwgZXJhc2VibG9jayBvciBub3QuCisJICovCisJcCA9ICZzdi0+cm9vdC5yYl9ub2RlOworCXdoaWxlICgqcCkgeworCQlpbnQgY21wX3JlczsKKworCQlwYXJlbnQgPSAqcDsKKwkJc2ViID0gcmJfZW50cnkocGFyZW50LCBzdHJ1Y3QgdWJpX3NjYW5fbGViLCB1LnJiKTsKKwkJaWYgKGxudW0gIT0gc2ViLT5sbnVtKSB7CisJCQlpZiAobG51bSA8IHNlYi0+bG51bSkKKwkJCQlwID0gJigqcCktPnJiX2xlZnQ7CisJCQllbHNlCisJCQkJcCA9ICYoKnApLT5yYl9yaWdodDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyoKKwkJICogVGhlcmUgaXMgYWxyZWFkeSBhIHBoeXNpY2FsIGVyYXNlYmxvY2sgZGVzY3JpYmluZyB0aGUgc2FtZQorCQkgKiBsb2dpY2FsIGVyYXNlYmxvY2sgcHJlc2VudC4KKwkJICovCisKKwkJZGJnX2JsZCgidGhpcyBMRUIgYWxyZWFkeSBleGlzdHM6IFBFQiAlZCwgc3FudW0gJWxsdSwgIgorCQkJIkxFQiB2ZXIgJXUsIEVDICVkIiwgc2ViLT5wbnVtLCBzZWItPnNxbnVtLAorCQkJc2ViLT5sZWJfdmVyLCBzZWItPmVjKTsKKworCQkvKgorCQkgKiBNYWtlIHN1cmUgdGhhdCB0aGUgbG9naWNhbCBlcmFzZWJsb2NrcyBoYXZlIGRpZmZlcmVudAorCQkgKiB2ZXJzaW9ucy4gT3RoZXJ3aXNlIHRoZSBpbWFnZSBpcyBiYWQuCisJCSAqLworCQlpZiAoc2ViLT5sZWJfdmVyID09IGxlYl92ZXIgJiYgbGViX3ZlciAhPSAwKSB7CisJCQl1YmlfZXJyKCJ0d28gTEVCcyB3aXRoIHNhbWUgdmVyc2lvbiAldSIsIGxlYl92ZXIpOworCQkJdWJpX2RiZ19kdW1wX3NlYihzZWIsIDApOworCQkJdWJpX2RiZ19kdW1wX3ZpZF9oZHIodmlkX2hkcik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCS8qCisJCSAqIE1ha2Ugc3VyZSB0aGF0IHRoZSBsb2dpY2FsIGVyYXNlYmxvY2tzIGhhdmUgZGlmZmVyZW50CisJCSAqIHNlcXVlbmNlIG51bWJlcnMuIE90aGVyd2lzZSB0aGUgaW1hZ2UgaXMgYmFkLgorCQkgKgorCQkgKiBGSVhNRTogcmVtb3ZlICdzcW51bSAhPSAwJyBjaGVjayB3aGVuIGxlYl92ZXIgaXMgcmVtb3ZlZC4KKwkJICovCisJCWlmIChzZWItPnNxbnVtID09IHNxbnVtICYmIHNxbnVtICE9IDApIHsKKwkJCXViaV9lcnIoInR3byBMRUJzIHdpdGggc2FtZSBzZXF1ZW5jZSBudW1iZXIgJWxsdSIsCisJCQkJc3FudW0pOworCQkJdWJpX2RiZ19kdW1wX3NlYihzZWIsIDApOworCQkJdWJpX2RiZ19kdW1wX3ZpZF9oZHIodmlkX2hkcik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCS8qCisJCSAqIE5vdyB3ZSBoYXZlIHRvIGRyb3AgdGhlIG9sZGVyIG9uZSBhbmQgcHJlc2VydmUgdGhlIG5ld2VyCisJCSAqIG9uZS4KKwkJICovCisJCWNtcF9yZXMgPSBjb21wYXJlX2xlYnModWJpLCBzZWIsIHBudW0sIHZpZF9oZHIpOworCQlpZiAoY21wX3JlcyA8IDApCisJCQlyZXR1cm4gY21wX3JlczsKKworCQlpZiAoY21wX3JlcyAmIDEpIHsKKwkJCS8qCisJCQkgKiBUaGlzIGxvZ2ljYWwgZXJhc2VibG9jayBpcyBuZXdlciB0aGVuIHRoZSBvbmUKKwkJCSAqIGZvdW5kIGVhcmxpZXIuCisJCQkgKi8KKwkJCWVyciA9IHZhbGlkYXRlX3ZpZF9oZHIodmlkX2hkciwgc3YsIHBudW0pOworCQkJaWYgKGVycikKKwkJCQlyZXR1cm4gZXJyOworCisJCQlpZiAoY21wX3JlcyAmIDQpCisJCQkJZXJyID0gdWJpX3NjYW5fYWRkX3RvX2xpc3Qoc2ksIHNlYi0+cG51bSwKKwkJCQkJCQkgICBzZWItPmVjLCAmc2ktPmNvcnIpOworCQkJZWxzZQorCQkJCWVyciA9IHViaV9zY2FuX2FkZF90b19saXN0KHNpLCBzZWItPnBudW0sCisJCQkJCQkJICAgc2ViLT5lYywgJnNpLT5lcmFzZSk7CisJCQlpZiAoZXJyKQorCQkJCXJldHVybiBlcnI7CisKKwkJCXNlYi0+ZWMgPSBlYzsKKwkJCXNlYi0+cG51bSA9IHBudW07CisJCQlzZWItPnNjcnViID0gKChjbXBfcmVzICYgMikgfHwgYml0ZmxpcHMpOworCQkJc2ViLT5zcW51bSA9IHNxbnVtOworCQkJc2ViLT5sZWJfdmVyID0gbGViX3ZlcjsKKworCQkJaWYgKHN2LT5oaWdoZXN0X2xudW0gPT0gbG51bSkKKwkJCQlzdi0+bGFzdF9kYXRhX3NpemUgPQorCQkJCQl1YmkzMl90b19jcHUodmlkX2hkci0+ZGF0YV9zaXplKTsKKworCQkJcmV0dXJuIDA7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogVGhpcyBsb2dpY2FsIGVyYXNlYmxvY2sgaXMgb2xkZXIgdGhlbiB0aGUgb25lIGZvdW5kCisJCQkgKiBwcmV2aW91c2x5LgorCQkJICovCisJCQlpZiAoY21wX3JlcyAmIDQpCisJCQkJcmV0dXJuIHViaV9zY2FuX2FkZF90b19saXN0KHNpLCBwbnVtLCBlYywKKwkJCQkJCQkgICAgJnNpLT5jb3JyKTsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gdWJpX3NjYW5fYWRkX3RvX2xpc3Qoc2ksIHBudW0sIGVjLAorCQkJCQkJCSAgICAmc2ktPmVyYXNlKTsKKwkJfQorCX0KKworCS8qCisJICogV2UndmUgbWV0IHRoaXMgbG9naWNhbCBlcmFzZWJsb2NrIGZvciB0aGUgZmlyc3QgdGltZSwgYWRkIGl0IHRvIHRoZQorCSAqIHNjYW5uaW5nIGluZm9ybWF0aW9uLgorCSAqLworCisJZXJyID0gdmFsaWRhdGVfdmlkX2hkcih2aWRfaGRyLCBzdiwgcG51bSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCXNlYiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB1Ymlfc2Nhbl9sZWIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNlYikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzZWItPmVjID0gZWM7CisJc2ViLT5wbnVtID0gcG51bTsKKwlzZWItPmxudW0gPSBsbnVtOworCXNlYi0+c3FudW0gPSBzcW51bTsKKwlzZWItPnNjcnViID0gYml0ZmxpcHM7CisJc2ViLT5sZWJfdmVyID0gbGViX3ZlcjsKKworCWlmIChzdi0+aGlnaGVzdF9sbnVtIDw9IGxudW0pIHsKKwkJc3YtPmhpZ2hlc3RfbG51bSA9IGxudW07CisJCXN2LT5sYXN0X2RhdGFfc2l6ZSA9IHViaTMyX3RvX2NwdSh2aWRfaGRyLT5kYXRhX3NpemUpOworCX0KKworCWlmIChzaS0+bWF4X3NxbnVtIDwgc3FudW0pCisJCXNpLT5tYXhfc3FudW0gPSBzcW51bTsKKworCXN2LT5sZWJfY291bnQgKz0gMTsKKwlyYl9saW5rX25vZGUoJnNlYi0+dS5yYiwgcGFyZW50LCBwKTsKKwlyYl9pbnNlcnRfY29sb3IoJnNlYi0+dS5yYiwgJnN2LT5yb290KTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB1Ymlfc2Nhbl9maW5kX3N2IC0gZmluZCBpbmZvcm1hdGlvbiBhYm91dCBhIHBhcnRpY3VsYXIgdm9sdW1lIGluIHRoZQorICogc2Nhbm5pbmcgaW5mb3JtYXRpb24uCisgKiBAc2k6IHNjYW5uaW5nIGluZm9ybWF0aW9uCisgKiBAdm9sX2lkOiB0aGUgcmVxdWVzdGVkIHZvbHVtZSBJRAorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHZvbHVtZSBkZXNjcmlwdGlvbiBvciAlTlVMTCBpZiB0aGVyZQorICogYXJlIG5vIGRhdGEgYWJvdXQgdGhpcyB2b2x1bWUgaW4gdGhlIHNjYW5uaW5nIGluZm9ybWF0aW9uLgorICovCitzdHJ1Y3QgdWJpX3NjYW5fdm9sdW1lICp1Ymlfc2Nhbl9maW5kX3N2KGNvbnN0IHN0cnVjdCB1Ymlfc2Nhbl9pbmZvICpzaSwKKwkJCQkJIGludCB2b2xfaWQpCit7CisJc3RydWN0IHViaV9zY2FuX3ZvbHVtZSAqc3Y7CisJc3RydWN0IHJiX25vZGUgKnAgPSBzaS0+dm9sdW1lcy5yYl9ub2RlOworCisJd2hpbGUgKHApIHsKKwkJc3YgPSByYl9lbnRyeShwLCBzdHJ1Y3QgdWJpX3NjYW5fdm9sdW1lLCByYik7CisKKwkJaWYgKHZvbF9pZCA9PSBzdi0+dm9sX2lkKQorCQkJcmV0dXJuIHN2OworCisJCWlmICh2b2xfaWQgPiBzdi0+dm9sX2lkKQorCQkJcCA9IHAtPnJiX2xlZnQ7CisJCWVsc2UKKwkJCXAgPSBwLT5yYl9yaWdodDsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiB1Ymlfc2Nhbl9maW5kX3NlYiAtIGZpbmQgaW5mb3JtYXRpb24gYWJvdXQgYSBwYXJ0aWN1bGFyIGxvZ2ljYWwKKyAqIGVyYXNlYmxvY2sgaW4gdGhlIHZvbHVtZSBzY2FubmluZyBpbmZvcm1hdGlvbi4KKyAqIEBzdjogYSBwb2ludGVyIHRvIHRoZSB2b2x1bWUgc2Nhbm5pbmcgaW5mb3JtYXRpb24KKyAqIEBsbnVtOiB0aGUgcmVxdWVzdGVkIGxvZ2ljYWwgZXJhc2VibG9jaworICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHNjYW5uaW5nIGxvZ2ljYWwgZXJhc2VibG9jayBvciAlTlVMTAorICogaWYgdGhlcmUgYXJlIG5vIGRhdGEgYWJvdXQgaXQgaW4gdGhlIHNjYW5uaW5nIHZvbHVtZSBpbmZvcm1hdGlvbi4KKyAqLworc3RydWN0IHViaV9zY2FuX2xlYiAqdWJpX3NjYW5fZmluZF9zZWIoY29uc3Qgc3RydWN0IHViaV9zY2FuX3ZvbHVtZSAqc3YsCisJCQkJICAgICAgIGludCBsbnVtKQoreworCXN0cnVjdCB1Ymlfc2Nhbl9sZWIgKnNlYjsKKwlzdHJ1Y3QgcmJfbm9kZSAqcCA9IHN2LT5yb290LnJiX25vZGU7CisKKwl3aGlsZSAocCkgeworCQlzZWIgPSByYl9lbnRyeShwLCBzdHJ1Y3QgdWJpX3NjYW5fbGViLCB1LnJiKTsKKworCQlpZiAobG51bSA9PSBzZWItPmxudW0pCisJCQlyZXR1cm4gc2ViOworCisJCWlmIChsbnVtID4gc2ViLT5sbnVtKQorCQkJcCA9IHAtPnJiX2xlZnQ7CisJCWVsc2UKKwkJCXAgPSBwLT5yYl9yaWdodDsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiB1Ymlfc2Nhbl9ybV92b2x1bWUgLSBkZWxldGUgc2Nhbm5pbmcgaW5mb3JtYXRpb24gYWJvdXQgYSB2b2x1bWUuCisgKiBAc2k6IHNjYW5uaW5nIGluZm9ybWF0aW9uCisgKiBAc3Y6IHRoZSB2b2x1bWUgc2Nhbm5pbmcgaW5mb3JtYXRpb24gdG8gZGVsZXRlCisgKi8KK3ZvaWQgdWJpX3NjYW5fcm1fdm9sdW1lKHN0cnVjdCB1Ymlfc2Nhbl9pbmZvICpzaSwgc3RydWN0IHViaV9zY2FuX3ZvbHVtZSAqc3YpCit7CisJc3RydWN0IHJiX25vZGUgKnJiOworCXN0cnVjdCB1Ymlfc2Nhbl9sZWIgKnNlYjsKKworCWRiZ19ibGQoInJlbW92ZSBzY2FubmluZyBpbmZvcm1hdGlvbiBhYm91dCB2b2x1bWUgJWQiLCBzdi0+dm9sX2lkKTsKKworCXdoaWxlICgocmIgPSByYl9maXJzdCgmc3YtPnJvb3QpKSkgeworCQlzZWIgPSByYl9lbnRyeShyYiwgc3RydWN0IHViaV9zY2FuX2xlYiwgdS5yYik7CisJCXJiX2VyYXNlKCZzZWItPnUucmIsICZzdi0+cm9vdCk7CisJCWxpc3RfYWRkX3RhaWwoJnNlYi0+dS5saXN0LCAmc2ktPmVyYXNlKTsKKwl9CisKKwlyYl9lcmFzZSgmc3YtPnJiLCAmc2ktPnZvbHVtZXMpOworCWtmcmVlKHN2KTsKKwlzaS0+dm9sc19mb3VuZCAtPSAxOworfQorCisvKioKKyAqIHViaV9zY2FuX2VyYXNlX3BlYiAtIGVyYXNlIGEgcGh5c2ljYWwgZXJhc2VibG9jay4KKyAqIEB1Ymk6IFVCSSBkZXZpY2UgZGVzY3JpcHRpb24gb2JqZWN0CisgKiBAc2k6IHNjYW5uaW5nIGluZm9ybWF0aW9uCisgKiBAcG51bTogcGh5c2ljYWwgZXJhc2VibG9jayBudW1iZXIgdG8gZXJhc2U7CisgKiBAZWM6IGVyYXNlIGNvdW50ZXIgdmFsdWUgdG8gd3JpdGUgKCVVQklfU0NBTl9VTktOT1dOX0VDIGlmIGl0IGlzIHVua25vd24pCisgKgorICogVGhpcyBmdW5jdGlvbiBlcmFzZXMgcGh5c2ljYWwgZXJhc2VibG9jayAncG51bScsIGFuZCB3cml0ZXMgdGhlIGVyYXNlCisgKiBjb3VudGVyIGhlYWRlciB0byBpdC4gVGhpcyBmdW5jdGlvbiBzaG91bGQgb25seSBiZSB1c2VkIG9uIFVCSSBkZXZpY2UKKyAqIGluaXRpYWxpemF0aW9uIHN0YWdlcywgd2hlbiB0aGUgRUJBIHVuaXQgaGFkIG5vdCBiZWVuIHlldCBpbml0aWFsaXplZC4gVGhpcworICogZnVuY3Rpb24gcmV0dXJucyB6ZXJvIGluIGNhc2Ugb2Ygc3VjY2VzcyBhbmQgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIGluIGNhc2UKKyAqIG9mIGZhaWx1cmUuCisgKi8KK2ludCB1Ymlfc2Nhbl9lcmFzZV9wZWIoY29uc3Qgc3RydWN0IHViaV9kZXZpY2UgKnViaSwKKwkJICAgICAgIGNvbnN0IHN0cnVjdCB1Ymlfc2Nhbl9pbmZvICpzaSwgaW50IHBudW0sIGludCBlYykKK3sKKwlpbnQgZXJyOworCXN0cnVjdCB1YmlfZWNfaGRyICplY19oZHI7CisKKwllY19oZHIgPSBremFsbG9jKHViaS0+ZWNfaGRyX2Fsc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFlY19oZHIpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKChsb25nIGxvbmcpZWMgPj0gVUJJX01BWF9FUkFTRUNPVU5URVIpIHsKKwkJLyoKKwkJICogRXJhc2UgY291bnRlciBvdmVyZmxvdy4gVXBncmFkZSBVQkkgYW5kIHVzZSA2NC1iaXQKKwkJICogZXJhc2UgY291bnRlcnMgaW50ZXJuYWxseS4KKwkJICovCisJCXViaV9lcnIoImVyYXNlIGNvdW50ZXIgb3ZlcmZsb3cgYXQgUEVCICVkLCBFQyAlZCIsIHBudW0sIGVjKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZWNfaGRyLT5lYyA9IGNwdV90b191Ymk2NChlYyk7CisKKwllcnIgPSB1YmlfaW9fc3luY19lcmFzZSh1YmksIHBudW0sIDApOworCWlmIChlcnIgPCAwKQorCQlnb3RvIG91dF9mcmVlOworCisJZXJyID0gdWJpX2lvX3dyaXRlX2VjX2hkcih1YmksIHBudW0sIGVjX2hkcik7CisKK291dF9mcmVlOgorCWtmcmVlKGVjX2hkcik7CisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKiB1Ymlfc2Nhbl9nZXRfZnJlZV9wZWIgLSBnZXQgYSBmcmVlIHBoeXNpY2FsIGVyYXNlYmxvY2suCisgKiBAdWJpOiBVQkkgZGV2aWNlIGRlc2NyaXB0aW9uIG9iamVjdAorICogQHNpOiBzY2FubmluZyBpbmZvcm1hdGlvbgorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIGZyZWUgcGh5c2ljYWwgZXJhc2VibG9jay4gSXQgaXMgc3VwcG9zZWQgdG8gYmUKKyAqIGNhbGxlZCBvbiB0aGUgVUJJIGluaXRpYWxpemF0aW9uIHN0YWdlcyB3aGVuIHRoZSB3ZWFyLWxldmVsaW5nIHVuaXQgaXMgbm90CisgKiBpbml0aWFsaXplZCB5ZXQuIFRoaXMgZnVuY3Rpb24gcGlja3MgYSBwaHlzaWNhbCBlcmFzZWJsb2NrcyBmcm9tIG9uZSBvZiB0aGUKKyAqIGxpc3RzLCB3cml0ZXMgdGhlIEVDIGhlYWRlciBpZiBpdCBpcyBuZWVkZWQsIGFuZCByZW1vdmVzIGl0IGZyb20gdGhlIGxpc3QuCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHNjYW5uaW5nIHBoeXNpY2FsIGVyYXNlYmxvY2sgaW5mb3JtYXRpb24gaW4gY2FzZSBvZgorICogc3VjY2VzcyBhbmQgYW4gZXJyb3IgY29kZSBpbiBjYXNlIG9mIGZhaWx1cmUuCisgKi8KK3N0cnVjdCB1Ymlfc2Nhbl9sZWIgKnViaV9zY2FuX2dldF9mcmVlX3BlYihjb25zdCBzdHJ1Y3QgdWJpX2RldmljZSAqdWJpLAorCQkJCQkgICBzdHJ1Y3QgdWJpX3NjYW5faW5mbyAqc2kpCit7CisJaW50IGVyciA9IDAsIGk7CisJc3RydWN0IHViaV9zY2FuX2xlYiAqc2ViOworCisJaWYgKCFsaXN0X2VtcHR5KCZzaS0+ZnJlZSkpIHsKKwkJc2ViID0gbGlzdF9lbnRyeShzaS0+ZnJlZS5uZXh0LCBzdHJ1Y3QgdWJpX3NjYW5fbGViLCB1Lmxpc3QpOworCQlsaXN0X2RlbCgmc2ViLT51Lmxpc3QpOworCQlkYmdfYmxkKCJyZXR1cm4gZnJlZSBQRUIgJWQsIEVDICVkIiwgc2ViLT5wbnVtLCBzZWItPmVjKTsKKwkJcmV0dXJuIHNlYjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQ7CisJCXN0cnVjdCB1Ymlfc2Nhbl9sZWIgKnRtcF9zZWI7CisKKwkJaWYgKGkgPT0gMCkKKwkJCWhlYWQgPSAmc2ktPmVyYXNlOworCQllbHNlCisJCQloZWFkID0gJnNpLT5jb3JyOworCisJCS8qCisJCSAqIFdlIHRyeSB0byBlcmFzZSB0aGUgZmlyc3QgcGh5c2ljYWwgZXJhc2VibG9jayBmcm9tIHRoZSBAaGVhZAorCQkgKiBsaXN0IGFuZCBwaWNrIGl0IGlmIHdlIHN1Y2NlZWQsIG9yIHRyeSB0byBlcmFzZSB0aGUKKwkJICogbmV4dCBvbmUgaWYgbm90LiBBbmQgc28gZm9ydGguIFdlIGRvbid0IHdhbnQgdG8gdGFrZSBjYXJlCisJCSAqIGFib3V0IGJhZCBlcmFzZWJsb2NrcyBoZXJlIC0gdGhleSdsbCBiZSBoYW5kbGVkIGxhdGVyLgorCQkgKi8KKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHNlYiwgdG1wX3NlYiwgaGVhZCwgdS5saXN0KSB7CisJCQlpZiAoc2ViLT5lYyA9PSBVQklfU0NBTl9VTktOT1dOX0VDKQorCQkJCXNlYi0+ZWMgPSBzaS0+bWVhbl9lYzsKKworCQkJZXJyID0gdWJpX3NjYW5fZXJhc2VfcGViKHViaSwgc2ksIHNlYi0+cG51bSwgc2ViLT5lYysxKTsKKwkJCWlmIChlcnIpCisJCQkJY29udGludWU7CisKKwkJCXNlYi0+ZWMgKz0gMTsKKwkJCWxpc3RfZGVsKCZzZWItPnUubGlzdCk7CisJCQlkYmdfYmxkKCJyZXR1cm4gUEVCICVkLCBFQyAlZCIsIHNlYi0+cG51bSwgc2ViLT5lYyk7CisJCQlyZXR1cm4gc2ViOworCQl9CisJfQorCisJdWJpX2Vycigibm8gZXJhc2VibG9ja3MgZm91bmQiKTsKKwlyZXR1cm4gRVJSX1BUUigtRU5PU1BDKTsKK30KKworLyoqCisgKiBwcm9jZXNzX2ViIC0gcmVhZCBVQkkgaGVhZGVycywgY2hlY2sgdGhlbSBhbmQgYWRkIGNvcnJlc3BvbmRpbmcgZGF0YQorICogdG8gdGhlIHNjYW5uaW5nIGluZm9ybWF0aW9uLgorICogQHViaTogVUJJIGRldmljZSBkZXNjcmlwdGlvbiBvYmplY3QKKyAqIEBzaTogc2Nhbm5pbmcgaW5mb3JtYXRpb24KKyAqIEBwbnVtOiB0aGUgcGh5c2ljYWwgZXJhc2VibG9jayBudW1iZXIKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSB6ZXJvIGlmIHRoZSBwaHlzaWNhbCBlcmFzZWJsb2NrIHdhcyBzdWNjZXNmdWxseQorICogaGFuZGxlZCBhbmQgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIGluIGNhc2Ugb2YgZmFpbHVyZS4KKyAqLworc3RhdGljIGludCBwcm9jZXNzX2ViKHN0cnVjdCB1YmlfZGV2aWNlICp1YmksIHN0cnVjdCB1Ymlfc2Nhbl9pbmZvICpzaSwgaW50IHBudW0pCit7CisJbG9uZyBsb25nIGVjOworCWludCBlcnIsIGJpdGZsaXBzID0gMCwgdm9sX2lkLCBlY19jb3JyID0gMDsKKworCWRiZ19ibGQoInNjYW4gUEVCICVkIiwgcG51bSk7CisKKwkvKiBTa2lwIGJhZCBwaHlzaWNhbCBlcmFzZWJsb2NrcyAqLworCWVyciA9IHViaV9pb19pc19iYWQodWJpLCBwbnVtKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwllbHNlIGlmIChlcnIpIHsKKwkJLyoKKwkJICogRklYTUU6IHRoaXMgaXMgYWN0dWFsbHkgZHV0eSBvZiB0aGUgSS9PIHVuaXQgdG8gaW5pdGlhbGl6ZQorCQkgKiB0aGlzLCBidXQgTVREIGRvZXMgbm90IHByb3ZpZGUgZW5vdWdoIGluZm9ybWF0aW9uLgorCQkgKi8KKwkJc2ktPmJhZF9wZWJfY291bnQgKz0gMTsKKwkJcmV0dXJuIDA7CisJfQorCisJZXJyID0gdWJpX2lvX3JlYWRfZWNfaGRyKHViaSwgcG51bSwgZWNoLCAwKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwllbHNlIGlmIChlcnIgPT0gVUJJX0lPX0JJVEZMSVBTKQorCQliaXRmbGlwcyA9IDE7CisJZWxzZSBpZiAoZXJyID09IFVCSV9JT19QRUJfRU1QVFkpCisJCXJldHVybiB1Ymlfc2Nhbl9hZGRfdG9fbGlzdChzaSwgcG51bSwgVUJJX1NDQU5fVU5LTk9XTl9FQywKKwkJCQkJICAgICZzaS0+ZXJhc2UpOworCWVsc2UgaWYgKGVyciA9PSBVQklfSU9fQkFEX0VDX0hEUikgeworCQkvKgorCQkgKiBXZSBoYXZlIHRvIGFsc28gbG9vayBhdCB0aGUgVklEIGhlYWRlciwgcG9zc2libHkgaXQgaXMgbm90CisJCSAqIGNvcnJ1cHRlZC4gU2V0ICViaXRmbGlwcyBmbGFnIGluIG9yZGVyIHRvIG1ha2UgdGhpcyBQRUIgYmUKKwkJICogbW92ZWQgYW5kIEVDIGJlIHJlLWNyZWF0ZWQuCisJCSAqLworCQllY19jb3JyID0gMTsKKwkJZWMgPSBVQklfU0NBTl9VTktOT1dOX0VDOworCQliaXRmbGlwcyA9IDE7CisJfQorCisJc2ktPmlzX2VtcHR5ID0gMDsKKworCWlmICghZWNfY29ycikgeworCQkvKiBNYWtlIHN1cmUgVUJJIHZlcnNpb24gaXMgT0sgKi8KKwkJaWYgKGVjaC0+dmVyc2lvbiAhPSBVQklfVkVSU0lPTikgeworCQkJdWJpX2VycigidGhpcyBVQkkgdmVyc2lvbiBpcyAlZCwgaW1hZ2UgdmVyc2lvbiBpcyAlZCIsCisJCQkJVUJJX1ZFUlNJT04sIChpbnQpZWNoLT52ZXJzaW9uKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJZWMgPSB1Ymk2NF90b19jcHUoZWNoLT5lYyk7CisJCWlmIChlYyA+IFVCSV9NQVhfRVJBU0VDT1VOVEVSKSB7CisJCQkvKgorCQkJICogRXJhc2UgY291bnRlciBvdmVyZmxvdy4gVGhlIEVDIGhlYWRlcnMgaGF2ZSA2NCBiaXRzCisJCQkgKiByZXNlcnZlZCwgYnV0IHdlIGFueXdheSBtYWtlIHVzZSBvZiBvbmx5IDMxIGJpdAorCQkJICogdmFsdWVzLCBhcyB0aGlzIHNlZW1zIHRvIGJlIGVub3VnaCBmb3IgYW55IGV4aXN0aW5nCisJCQkgKiBmbGFzaC4gVXBncmFkZSBVQkkgYW5kIHVzZSA2NC1iaXQgZXJhc2UgY291bnRlcnMKKwkJCSAqIGludGVybmFsbHkuCisJCQkgKi8KKwkJCXViaV9lcnIoImVyYXNlIGNvdW50ZXIgb3ZlcmZsb3csIG1heCBpcyAlZCIsCisJCQkJVUJJX01BWF9FUkFTRUNPVU5URVIpOworCQkJdWJpX2RiZ19kdW1wX2VjX2hkcihlY2gpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwkvKiBPSywgd2UndmUgZG9uZSB3aXRoIHRoZSBFQyBoZWFkZXIsIGxldCdzIGxvb2sgYXQgdGhlIFZJRCBoZWFkZXIgKi8KKworCWVyciA9IHViaV9pb19yZWFkX3ZpZF9oZHIodWJpLCBwbnVtLCB2aWRoLCAwKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwllbHNlIGlmIChlcnIgPT0gVUJJX0lPX0JJVEZMSVBTKQorCQliaXRmbGlwcyA9IDE7CisJZWxzZSBpZiAoZXJyID09IFVCSV9JT19CQURfVklEX0hEUiB8fAorCQkgKGVyciA9PSBVQklfSU9fUEVCX0ZSRUUgJiYgZWNfY29ycikpIHsKKwkJLyogVklEIGhlYWRlciBpcyBjb3JydXB0ZWQgKi8KKwkJZXJyID0gdWJpX3NjYW5fYWRkX3RvX2xpc3Qoc2ksIHBudW0sIGVjLCAmc2ktPmNvcnIpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwkJZ290byBhZGp1c3RfbWVhbl9lYzsKKwl9IGVsc2UgaWYgKGVyciA9PSBVQklfSU9fUEVCX0ZSRUUpIHsKKwkJLyogTm8gVklEIGhlYWRlciAtIHRoZSBwaHlzaWNhbCBlcmFzZWJsb2NrIGlzIGZyZWUgKi8KKwkJZXJyID0gdWJpX3NjYW5fYWRkX3RvX2xpc3Qoc2ksIHBudW0sIGVjLCAmc2ktPmZyZWUpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwkJZ290byBhZGp1c3RfbWVhbl9lYzsKKwl9CisKKwl2b2xfaWQgPSB1YmkzMl90b19jcHUodmlkaC0+dm9sX2lkKTsKKwlpZiAodm9sX2lkID4gVUJJX01BWF9WT0xVTUVTICYmIHZvbF9pZCAhPSBVQklfTEFZT1VUX1ZPTF9JRCkgeworCQlpbnQgbG51bSA9IHViaTMyX3RvX2NwdSh2aWRoLT5sbnVtKTsKKworCQkvKiBVbnN1cHBvcnRlZCBpbnRlcm5hbCB2b2x1bWUgKi8KKwkJc3dpdGNoICh2aWRoLT5jb21wYXQpIHsKKwkJY2FzZSBVQklfQ09NUEFUX0RFTEVURToKKwkJCXViaV9tc2coIlwiZGVsZXRlXCIgY29tcGF0aWJsZSBpbnRlcm5hbCB2b2x1bWUgJWQ6JWQiCisJCQkJIiBmb3VuZCwgcmVtb3ZlIGl0Iiwgdm9sX2lkLCBsbnVtKTsKKwkJCWVyciA9IHViaV9zY2FuX2FkZF90b19saXN0KHNpLCBwbnVtLCBlYywgJnNpLT5jb3JyKTsKKwkJCWlmIChlcnIpCisJCQkJcmV0dXJuIGVycjsKKwkJCWJyZWFrOworCisJCWNhc2UgVUJJX0NPTVBBVF9STzoKKwkJCXViaV9tc2coInJlYWQtb25seSBjb21wYXRpYmxlIGludGVybmFsIHZvbHVtZSAlZDolZCIKKwkJCQkiIGZvdW5kLCBzd2l0Y2ggdG8gcmVhZC1vbmx5IG1vZGUiLAorCQkJCXZvbF9pZCwgbG51bSk7CisJCQl1YmktPnJvX21vZGUgPSAxOworCQkJYnJlYWs7CisKKwkJY2FzZSBVQklfQ09NUEFUX1BSRVNFUlZFOgorCQkJdWJpX21zZygiXCJwcmVzZXJ2ZVwiIGNvbXBhdGlibGUgaW50ZXJuYWwgdm9sdW1lICVkOiVkIgorCQkJCSIgZm91bmQiLCB2b2xfaWQsIGxudW0pOworCQkJZXJyID0gdWJpX3NjYW5fYWRkX3RvX2xpc3Qoc2ksIHBudW0sIGVjLCAmc2ktPmFsaWVuKTsKKwkJCWlmIChlcnIpCisJCQkJcmV0dXJuIGVycjsKKwkJCXNpLT5hbGllbl9wZWJfY291bnQgKz0gMTsKKwkJCXJldHVybiAwOworCisJCWNhc2UgVUJJX0NPTVBBVF9SRUpFQ1Q6CisJCQl1YmlfZXJyKCJpbmNvbXBhdGlibGUgaW50ZXJuYWwgdm9sdW1lICVkOiVkIGZvdW5kIiwKKwkJCQl2b2xfaWQsIGxudW0pOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwkvKiBCb3RoIFVCSSBoZWFkZXJzIHNlZW0gdG8gYmUgZmluZSAqLworCWVyciA9IHViaV9zY2FuX2FkZF91c2VkKHViaSwgc2ksIHBudW0sIGVjLCB2aWRoLCBiaXRmbGlwcyk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworYWRqdXN0X21lYW5fZWM6CisJaWYgKCFlY19jb3JyKSB7CisJCWlmIChzaS0+ZWNfc3VtICsgZWMgPCBlYykgeworCQkJY29tbWl0X3RvX21lYW5fdmFsdWUoc2kpOworCQkJc2ktPmVjX3N1bSA9IDA7CisJCQlzaS0+ZWNfY291bnQgPSAwOworCQl9IGVsc2UgeworCQkJc2ktPmVjX3N1bSArPSBlYzsKKwkJCXNpLT5lY19jb3VudCArPSAxOworCQl9CisKKwkJaWYgKGVjID4gc2ktPm1heF9lYykKKwkJCXNpLT5tYXhfZWMgPSBlYzsKKwkJaWYgKGVjIDwgc2ktPm1pbl9lYykKKwkJCXNpLT5taW5fZWMgPSBlYzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB1Ymlfc2NhbiAtIHNjYW4gYW4gTVREIGRldmljZS4KKyAqIEB1Ymk6IFVCSSBkZXZpY2UgZGVzY3JpcHRpb24gb2JqZWN0CisgKgorICogVGhpcyBmdW5jdGlvbiBkb2VzIGZ1bGwgc2Nhbm5pbmcgb2YgYW4gTVREIGRldmljZSBhbmQgcmV0dXJucyBjb21wbGV0ZQorICogaW5mb3JtYXRpb24gYWJvdXQgaXQuIEluIGNhc2Ugb2YgZmFpbHVyZSwgYW4gZXJyb3IgY29kZSBpcyByZXR1cm5lZC4KKyAqLworc3RydWN0IHViaV9zY2FuX2luZm8gKnViaV9zY2FuKHN0cnVjdCB1YmlfZGV2aWNlICp1YmkpCit7CisJaW50IGVyciwgcG51bTsKKwlzdHJ1Y3QgcmJfbm9kZSAqcmIxLCAqcmIyOworCXN0cnVjdCB1Ymlfc2Nhbl92b2x1bWUgKnN2OworCXN0cnVjdCB1Ymlfc2Nhbl9sZWIgKnNlYjsKKwlzdHJ1Y3QgdWJpX3NjYW5faW5mbyAqc2k7CisKKwlzaSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB1Ymlfc2Nhbl9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzaSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlJTklUX0xJU1RfSEVBRCgmc2ktPmNvcnIpOworCUlOSVRfTElTVF9IRUFEKCZzaS0+ZnJlZSk7CisJSU5JVF9MSVNUX0hFQUQoJnNpLT5lcmFzZSk7CisJSU5JVF9MSVNUX0hFQUQoJnNpLT5hbGllbik7CisJc2ktPnZvbHVtZXMgPSBSQl9ST09UOworCXNpLT5pc19lbXB0eSA9IDE7CisKKwllcnIgPSAtRU5PTUVNOworCWVjaCA9IGt6YWxsb2ModWJpLT5lY19oZHJfYWxzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWVjaCkKKwkJZ290byBvdXRfc2k7CisKKwl2aWRoID0gdWJpX3phbGxvY192aWRfaGRyKHViaSk7CisJaWYgKCF2aWRoKQorCQlnb3RvIG91dF9lY2g7CisKKwlmb3IgKHBudW0gPSAwOyBwbnVtIDwgdWJpLT5wZWJfY291bnQ7IHBudW0rKykgeworCQljb25kX3Jlc2NoZWQoKTsKKworCQlkYmdfbXNnKCJwcm9jZXNzIFBFQiAlZCIsIHBudW0pOworCQllcnIgPSBwcm9jZXNzX2ViKHViaSwgc2ksIHBudW0pOworCQlpZiAoZXJyIDwgMCkKKwkJCWdvdG8gb3V0X3ZpZGg7CisJfQorCisJZGJnX21zZygic2Nhbm5pbmcgaXMgZmluaXNoZWQiKTsKKworCS8qIEZpbmlzaCBtZWFuIGVyYXNlIGNvdW50ZXIgY2FsY3VsYXRpb25zICovCisJaWYgKHNpLT5lY19jb3VudCkKKwkJY29tbWl0X3RvX21lYW5fdmFsdWUoc2kpOworCisJaWYgKHNpLT5pc19lbXB0eSkKKwkJdWJpX21zZygiZW1wdHkgTVREIGRldmljZSBkZXRlY3RlZCIpOworCisJLyoKKwkgKiBJbiBjYXNlIG9mIHVua25vd24gZXJhc2UgY291bnRlciB3ZSB1c2UgdGhlIG1lYW4gZXJhc2UgY291bnRlcgorCSAqIHZhbHVlLgorCSAqLworCXViaV9yYl9mb3JfZWFjaF9lbnRyeShyYjEsIHN2LCAmc2ktPnZvbHVtZXMsIHJiKSB7CisJCXViaV9yYl9mb3JfZWFjaF9lbnRyeShyYjIsIHNlYiwgJnN2LT5yb290LCB1LnJiKQorCQkJaWYgKHNlYi0+ZWMgPT0gVUJJX1NDQU5fVU5LTk9XTl9FQykKKwkJCQlzZWItPmVjID0gc2ktPm1lYW5fZWM7CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeShzZWIsICZzaS0+ZnJlZSwgdS5saXN0KSB7CisJCWlmIChzZWItPmVjID09IFVCSV9TQ0FOX1VOS05PV05fRUMpCisJCQlzZWItPmVjID0gc2ktPm1lYW5fZWM7CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeShzZWIsICZzaS0+Y29yciwgdS5saXN0KQorCQlpZiAoc2ViLT5lYyA9PSBVQklfU0NBTl9VTktOT1dOX0VDKQorCQkJc2ViLT5lYyA9IHNpLT5tZWFuX2VjOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShzZWIsICZzaS0+ZXJhc2UsIHUubGlzdCkKKwkJaWYgKHNlYi0+ZWMgPT0gVUJJX1NDQU5fVU5LTk9XTl9FQykKKwkJCXNlYi0+ZWMgPSBzaS0+bWVhbl9lYzsKKworCWVyciA9IHBhcmFub2lkX2NoZWNrX3NpKHViaSwgc2kpOworCWlmIChlcnIpIHsKKwkJaWYgKGVyciA+IDApCisJCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIG91dF92aWRoOworCX0KKworCXViaV9mcmVlX3ZpZF9oZHIodWJpLCB2aWRoKTsKKwlrZnJlZShlY2gpOworCisJcmV0dXJuIHNpOworCitvdXRfdmlkaDoKKwl1YmlfZnJlZV92aWRfaGRyKHViaSwgdmlkaCk7CitvdXRfZWNoOgorCWtmcmVlKGVjaCk7CitvdXRfc2k6CisJdWJpX3NjYW5fZGVzdHJveV9zaShzaSk7CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KKworLyoqCisgKiBkZXN0cm95X3N2IC0gZnJlZSB0aGUgc2Nhbm5pbmcgdm9sdW1lIGluZm9ybWF0aW9uCisgKiBAc3Y6IHNjYW5uaW5nIHZvbHVtZSBpbmZvcm1hdGlvbgorICoKKyAqIFRoaXMgZnVuY3Rpb24gZGVzdHJveXMgdGhlIHZvbHVtZSBSQi10cmVlIChAc3YtPnJvb3QpIGFuZCB0aGUgc2Nhbm5pbmcKKyAqIHZvbHVtZSBpbmZvcm1hdGlvbi4KKyAqLworc3RhdGljIHZvaWQgZGVzdHJveV9zdihzdHJ1Y3QgdWJpX3NjYW5fdm9sdW1lICpzdikKK3sKKwlzdHJ1Y3QgdWJpX3NjYW5fbGViICpzZWI7CisJc3RydWN0IHJiX25vZGUgKnRoaXMgPSBzdi0+cm9vdC5yYl9ub2RlOworCisJd2hpbGUgKHRoaXMpIHsKKwkJaWYgKHRoaXMtPnJiX2xlZnQpCisJCQl0aGlzID0gdGhpcy0+cmJfbGVmdDsKKwkJZWxzZSBpZiAodGhpcy0+cmJfcmlnaHQpCisJCQl0aGlzID0gdGhpcy0+cmJfcmlnaHQ7CisJCWVsc2UgeworCQkJc2ViID0gcmJfZW50cnkodGhpcywgc3RydWN0IHViaV9zY2FuX2xlYiwgdS5yYik7CisJCQl0aGlzID0gcmJfcGFyZW50KHRoaXMpOworCQkJaWYgKHRoaXMpIHsKKwkJCQlpZiAodGhpcy0+cmJfbGVmdCA9PSAmc2ViLT51LnJiKQorCQkJCQl0aGlzLT5yYl9sZWZ0ID0gTlVMTDsKKwkJCQllbHNlCisJCQkJCXRoaXMtPnJiX3JpZ2h0ID0gTlVMTDsKKwkJCX0KKworCQkJa2ZyZWUoc2ViKTsKKwkJfQorCX0KKwlrZnJlZShzdik7Cit9CisKKy8qKgorICogdWJpX3NjYW5fZGVzdHJveV9zaSAtIGRlc3Ryb3kgc2Nhbm5pbmcgaW5mb3JtYXRpb24uCisgKiBAc2k6IHNjYW5uaW5nIGluZm9ybWF0aW9uCisgKi8KK3ZvaWQgdWJpX3NjYW5fZGVzdHJveV9zaShzdHJ1Y3QgdWJpX3NjYW5faW5mbyAqc2kpCit7CisJc3RydWN0IHViaV9zY2FuX2xlYiAqc2ViLCAqc2ViX3RtcDsKKwlzdHJ1Y3QgdWJpX3NjYW5fdm9sdW1lICpzdjsKKwlzdHJ1Y3QgcmJfbm9kZSAqcmI7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc2ViLCBzZWJfdG1wLCAmc2ktPmFsaWVuLCB1Lmxpc3QpIHsKKwkJbGlzdF9kZWwoJnNlYi0+dS5saXN0KTsKKwkJa2ZyZWUoc2ViKTsKKwl9CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHNlYiwgc2ViX3RtcCwgJnNpLT5lcmFzZSwgdS5saXN0KSB7CisJCWxpc3RfZGVsKCZzZWItPnUubGlzdCk7CisJCWtmcmVlKHNlYik7CisJfQorCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzZWIsIHNlYl90bXAsICZzaS0+Y29yciwgdS5saXN0KSB7CisJCWxpc3RfZGVsKCZzZWItPnUubGlzdCk7CisJCWtmcmVlKHNlYik7CisJfQorCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzZWIsIHNlYl90bXAsICZzaS0+ZnJlZSwgdS5saXN0KSB7CisJCWxpc3RfZGVsKCZzZWItPnUubGlzdCk7CisJCWtmcmVlKHNlYik7CisJfQorCisJLyogRGVzdHJveSB0aGUgdm9sdW1lIFJCLXRyZWUgKi8KKwlyYiA9IHNpLT52b2x1bWVzLnJiX25vZGU7CisJd2hpbGUgKHJiKSB7CisJCWlmIChyYi0+cmJfbGVmdCkKKwkJCXJiID0gcmItPnJiX2xlZnQ7CisJCWVsc2UgaWYgKHJiLT5yYl9yaWdodCkKKwkJCXJiID0gcmItPnJiX3JpZ2h0OworCQllbHNlIHsKKwkJCXN2ID0gcmJfZW50cnkocmIsIHN0cnVjdCB1Ymlfc2Nhbl92b2x1bWUsIHJiKTsKKworCQkJcmIgPSByYl9wYXJlbnQocmIpOworCQkJaWYgKHJiKSB7CisJCQkJaWYgKHJiLT5yYl9sZWZ0ID09ICZzdi0+cmIpCisJCQkJCXJiLT5yYl9sZWZ0ID0gTlVMTDsKKwkJCQllbHNlCisJCQkJCXJiLT5yYl9yaWdodCA9IE5VTEw7CisJCQl9CisKKwkJCWRlc3Ryb3lfc3Yoc3YpOworCQl9CisJfQorCisJa2ZyZWUoc2kpOworfQorCisjaWZkZWYgQ09ORklHX01URF9VQklfREVCVUdfUEFSQU5PSUQKKworLyoqCisgKiBwYXJhbm9pZF9jaGVja19zaSAtIGNoZWNrIGlmIHRoZSBzY2FubmluZyBpbmZvcm1hdGlvbiBpcyBjb3JyZWN0IGFuZAorICogY29uc2lzdGVudC4KKyAqIEB1Ymk6IFVCSSBkZXZpY2UgZGVzY3JpcHRpb24gb2JqZWN0CisgKiBAc2k6IHNjYW5uaW5nIGluZm9ybWF0aW9uCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHplcm8gaWYgdGhlIHNjYW5uaW5nIGluZm9ybWF0aW9uIGlzIGFsbCByaWdodCwgJTEgaWYKKyAqIG5vdCBhbmQgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIGlmIGFuIGVycm9yIG9jY3VycmVkLgorICovCitzdGF0aWMgaW50IHBhcmFub2lkX2NoZWNrX3NpKGNvbnN0IHN0cnVjdCB1YmlfZGV2aWNlICp1YmksCisJCQkgICAgIHN0cnVjdCB1Ymlfc2Nhbl9pbmZvICpzaSkKK3sKKwlpbnQgcG51bSwgZXJyLCB2b2xzX2ZvdW5kID0gMDsKKwlzdHJ1Y3QgcmJfbm9kZSAqcmIxLCAqcmIyOworCXN0cnVjdCB1Ymlfc2Nhbl92b2x1bWUgKnN2OworCXN0cnVjdCB1Ymlfc2Nhbl9sZWIgKnNlYiwgKmxhc3Rfc2ViOworCXVpbnQ4X3QgKmJ1ZjsKKworCS8qCisJICogQXQgZmlyc3QsIGNoZWNrIHRoYXQgc2Nhbm5pbmcgaW5mb3JtYXRpb24gaXMgb2suCisJICovCisJdWJpX3JiX2Zvcl9lYWNoX2VudHJ5KHJiMSwgc3YsICZzaS0+dm9sdW1lcywgcmIpIHsKKwkJaW50IGxlYl9jb3VudCA9IDA7CisKKwkJY29uZF9yZXNjaGVkKCk7CisKKwkJdm9sc19mb3VuZCArPSAxOworCisJCWlmIChzaS0+aXNfZW1wdHkpIHsKKwkJCXViaV9lcnIoImJhZCBpc19lbXB0eSBmbGFnIik7CisJCQlnb3RvIGJhZF9zdjsKKwkJfQorCisJCWlmIChzdi0+dm9sX2lkIDwgMCB8fCBzdi0+aGlnaGVzdF9sbnVtIDwgMCB8fAorCQkgICAgc3YtPmxlYl9jb3VudCA8IDAgfHwgc3YtPnZvbF90eXBlIDwgMCB8fCBzdi0+dXNlZF9lYnMgPCAwIHx8CisJCSAgICBzdi0+ZGF0YV9wYWQgPCAwIHx8IHN2LT5sYXN0X2RhdGFfc2l6ZSA8IDApIHsKKwkJCXViaV9lcnIoIm5lZ2F0aXZlIHZhbHVlcyIpOworCQkJZ290byBiYWRfc3Y7CisJCX0KKworCQlpZiAoc3YtPnZvbF9pZCA+PSBVQklfTUFYX1ZPTFVNRVMgJiYKKwkJICAgIHN2LT52b2xfaWQgPCBVQklfSU5URVJOQUxfVk9MX1NUQVJUKSB7CisJCQl1YmlfZXJyKCJiYWQgdm9sX2lkIik7CisJCQlnb3RvIGJhZF9zdjsKKwkJfQorCisJCWlmIChzdi0+dm9sX2lkID4gc2ktPmhpZ2hlc3Rfdm9sX2lkKSB7CisJCQl1YmlfZXJyKCJoaWdoZXN0X3ZvbF9pZCBpcyAlZCwgYnV0IHZvbF9pZCAlZCBpcyB0aGVyZSIsCisJCQkJc2ktPmhpZ2hlc3Rfdm9sX2lkLCBzdi0+dm9sX2lkKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKHN2LT52b2xfdHlwZSAhPSBVQklfRFlOQU1JQ19WT0xVTUUgJiYKKwkJICAgIHN2LT52b2xfdHlwZSAhPSBVQklfU1RBVElDX1ZPTFVNRSkgeworCQkJdWJpX2VycigiYmFkIHZvbF90eXBlIik7CisJCQlnb3RvIGJhZF9zdjsKKwkJfQorCisJCWlmIChzdi0+ZGF0YV9wYWQgPiB1YmktPmxlYl9zaXplIC8gMikgeworCQkJdWJpX2VycigiYmFkIGRhdGFfcGFkIik7CisJCQlnb3RvIGJhZF9zdjsKKwkJfQorCisJCWxhc3Rfc2ViID0gTlVMTDsKKwkJdWJpX3JiX2Zvcl9lYWNoX2VudHJ5KHJiMiwgc2ViLCAmc3YtPnJvb3QsIHUucmIpIHsKKwkJCWNvbmRfcmVzY2hlZCgpOworCisJCQlsYXN0X3NlYiA9IHNlYjsKKwkJCWxlYl9jb3VudCArPSAxOworCisJCQlpZiAoc2ViLT5wbnVtIDwgMCB8fCBzZWItPmVjIDwgMCkgeworCQkJCXViaV9lcnIoIm5lZ2F0aXZlIHZhbHVlcyIpOworCQkJCWdvdG8gYmFkX3NlYjsKKwkJCX0KKworCQkJaWYgKHNlYi0+ZWMgPCBzaS0+bWluX2VjKSB7CisJCQkJdWJpX2VycigiYmFkIHNpLT5taW5fZWMgKCVkKSwgJWQgZm91bmQiLAorCQkJCQlzaS0+bWluX2VjLCBzZWItPmVjKTsKKwkJCQlnb3RvIGJhZF9zZWI7CisJCQl9CisKKwkJCWlmIChzZWItPmVjID4gc2ktPm1heF9lYykgeworCQkJCXViaV9lcnIoImJhZCBzaS0+bWF4X2VjICglZCksICVkIGZvdW5kIiwKKwkJCQkJc2ktPm1heF9lYywgc2ViLT5lYyk7CisJCQkJZ290byBiYWRfc2ViOworCQkJfQorCisJCQlpZiAoc2ViLT5wbnVtID49IHViaS0+cGViX2NvdW50KSB7CisJCQkJdWJpX2VycigidG9vIGhpZ2ggUEVCIG51bWJlciAlZCwgdG90YWwgUEVCcyAlZCIsCisJCQkJCXNlYi0+cG51bSwgdWJpLT5wZWJfY291bnQpOworCQkJCWdvdG8gYmFkX3NlYjsKKwkJCX0KKworCQkJaWYgKHN2LT52b2xfdHlwZSA9PSBVQklfU1RBVElDX1ZPTFVNRSkgeworCQkJCWlmIChzZWItPmxudW0gPj0gc3YtPnVzZWRfZWJzKSB7CisJCQkJCXViaV9lcnIoImJhZCBsbnVtIG9yIHVzZWRfZWJzIik7CisJCQkJCWdvdG8gYmFkX3NlYjsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmIChzdi0+dXNlZF9lYnMgIT0gMCkgeworCQkJCQl1YmlfZXJyKCJub24temVybyB1c2VkX2VicyIpOworCQkJCQlnb3RvIGJhZF9zZWI7CisJCQkJfQorCQkJfQorCisJCQlpZiAoc2ViLT5sbnVtID4gc3YtPmhpZ2hlc3RfbG51bSkgeworCQkJCXViaV9lcnIoImluY29ycmVjdCBoaWdoZXN0X2xudW0gb3IgbG51bSIpOworCQkJCWdvdG8gYmFkX3NlYjsKKwkJCX0KKwkJfQorCisJCWlmIChzdi0+bGViX2NvdW50ICE9IGxlYl9jb3VudCkgeworCQkJdWJpX2VycigiYmFkIGxlYl9jb3VudCwgJWQgb2JqZWN0cyBpbiB0aGUgdHJlZSIsCisJCQkJbGViX2NvdW50KTsKKwkJCWdvdG8gYmFkX3N2OworCQl9CisKKwkJaWYgKCFsYXN0X3NlYikKKwkJCWNvbnRpbnVlOworCisJCXNlYiA9IGxhc3Rfc2ViOworCisJCWlmIChzZWItPmxudW0gIT0gc3YtPmhpZ2hlc3RfbG51bSkgeworCQkJdWJpX2VycigiYmFkIGhpZ2hlc3RfbG51bSIpOworCQkJZ290byBiYWRfc2ViOworCQl9CisJfQorCisJaWYgKHZvbHNfZm91bmQgIT0gc2ktPnZvbHNfZm91bmQpIHsKKwkJdWJpX2VycigiYmFkIHNpLT52b2xzX2ZvdW5kICVkLCBzaG91bGQgYmUgJWQiLAorCQkJc2ktPnZvbHNfZm91bmQsIHZvbHNfZm91bmQpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBDaGVjayB0aGF0IHNjYW5uaW5nIGluZm9ybWF0aW9uIGlzIGNvcnJlY3QgKi8KKwl1YmlfcmJfZm9yX2VhY2hfZW50cnkocmIxLCBzdiwgJnNpLT52b2x1bWVzLCByYikgeworCQlsYXN0X3NlYiA9IE5VTEw7CisJCXViaV9yYl9mb3JfZWFjaF9lbnRyeShyYjIsIHNlYiwgJnN2LT5yb290LCB1LnJiKSB7CisJCQlpbnQgdm9sX3R5cGU7CisKKwkJCWNvbmRfcmVzY2hlZCgpOworCisJCQlsYXN0X3NlYiA9IHNlYjsKKworCQkJZXJyID0gdWJpX2lvX3JlYWRfdmlkX2hkcih1YmksIHNlYi0+cG51bSwgdmlkaCwgMSk7CisJCQlpZiAoZXJyICYmIGVyciAhPSBVQklfSU9fQklURkxJUFMpIHsKKwkJCQl1YmlfZXJyKCJWSUQgaGVhZGVyIGlzIG5vdCBPSyAoJWQpIiwgZXJyKTsKKwkJCQlpZiAoZXJyID4gMCkKKwkJCQkJZXJyID0gLUVJTzsKKwkJCQlyZXR1cm4gZXJyOworCQkJfQorCisJCQl2b2xfdHlwZSA9IHZpZGgtPnZvbF90eXBlID09IFVCSV9WSURfRFlOQU1JQyA/CisJCQkJICAgVUJJX0RZTkFNSUNfVk9MVU1FIDogVUJJX1NUQVRJQ19WT0xVTUU7CisJCQlpZiAoc3YtPnZvbF90eXBlICE9IHZvbF90eXBlKSB7CisJCQkJdWJpX2VycigiYmFkIHZvbF90eXBlIik7CisJCQkJZ290byBiYWRfdmlkX2hkcjsKKwkJCX0KKworCQkJaWYgKHNlYi0+c3FudW0gIT0gdWJpNjRfdG9fY3B1KHZpZGgtPnNxbnVtKSkgeworCQkJCXViaV9lcnIoImJhZCBzcW51bSAlbGx1Iiwgc2ViLT5zcW51bSk7CisJCQkJZ290byBiYWRfdmlkX2hkcjsKKwkJCX0KKworCQkJaWYgKHN2LT52b2xfaWQgIT0gdWJpMzJfdG9fY3B1KHZpZGgtPnZvbF9pZCkpIHsKKwkJCQl1YmlfZXJyKCJiYWQgdm9sX2lkICVkIiwgc3YtPnZvbF9pZCk7CisJCQkJZ290byBiYWRfdmlkX2hkcjsKKwkJCX0KKworCQkJaWYgKHN2LT5jb21wYXQgIT0gdmlkaC0+Y29tcGF0KSB7CisJCQkJdWJpX2VycigiYmFkIGNvbXBhdCAlZCIsIHZpZGgtPmNvbXBhdCk7CisJCQkJZ290byBiYWRfdmlkX2hkcjsKKwkJCX0KKworCQkJaWYgKHNlYi0+bG51bSAhPSB1YmkzMl90b19jcHUodmlkaC0+bG51bSkpIHsKKwkJCQl1YmlfZXJyKCJiYWQgbG51bSAlZCIsIHNlYi0+bG51bSk7CisJCQkJZ290byBiYWRfdmlkX2hkcjsKKwkJCX0KKworCQkJaWYgKHN2LT51c2VkX2VicyAhPSB1YmkzMl90b19jcHUodmlkaC0+dXNlZF9lYnMpKSB7CisJCQkJdWJpX2VycigiYmFkIHVzZWRfZWJzICVkIiwgc3YtPnVzZWRfZWJzKTsKKwkJCQlnb3RvIGJhZF92aWRfaGRyOworCQkJfQorCisJCQlpZiAoc3YtPmRhdGFfcGFkICE9IHViaTMyX3RvX2NwdSh2aWRoLT5kYXRhX3BhZCkpIHsKKwkJCQl1YmlfZXJyKCJiYWQgZGF0YV9wYWQgJWQiLCBzdi0+ZGF0YV9wYWQpOworCQkJCWdvdG8gYmFkX3ZpZF9oZHI7CisJCQl9CisKKwkJCWlmIChzZWItPmxlYl92ZXIgIT0gdWJpMzJfdG9fY3B1KHZpZGgtPmxlYl92ZXIpKSB7CisJCQkJdWJpX2VycigiYmFkIGxlYl92ZXIgJXUiLCBzZWItPmxlYl92ZXIpOworCQkJCWdvdG8gYmFkX3ZpZF9oZHI7CisJCQl9CisJCX0KKworCQlpZiAoIWxhc3Rfc2ViKQorCQkJY29udGludWU7CisKKwkJaWYgKHN2LT5oaWdoZXN0X2xudW0gIT0gdWJpMzJfdG9fY3B1KHZpZGgtPmxudW0pKSB7CisJCQl1YmlfZXJyKCJiYWQgaGlnaGVzdF9sbnVtICVkIiwgc3YtPmhpZ2hlc3RfbG51bSk7CisJCQlnb3RvIGJhZF92aWRfaGRyOworCQl9CisKKwkJaWYgKHN2LT5sYXN0X2RhdGFfc2l6ZSAhPSB1YmkzMl90b19jcHUodmlkaC0+ZGF0YV9zaXplKSkgeworCQkJdWJpX2VycigiYmFkIGxhc3RfZGF0YV9zaXplICVkIiwgc3YtPmxhc3RfZGF0YV9zaXplKTsKKwkJCWdvdG8gYmFkX3ZpZF9oZHI7CisJCX0KKwl9CisKKwkvKgorCSAqIE1ha2Ugc3VyZSB0aGF0IGFsbCB0aGUgcGh5c2ljYWwgZXJhc2VibG9ja3MgYXJlIGluIG9uZSBvZiB0aGUgbGlzdHMKKwkgKiBvciB0cmVlcy4KKwkgKi8KKwlidWYgPSBrbWFsbG9jKHViaS0+cGViX2NvdW50LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltZW1zZXQoYnVmLCAxLCB1YmktPnBlYl9jb3VudCk7CisJZm9yIChwbnVtID0gMDsgcG51bSA8IHViaS0+cGViX2NvdW50OyBwbnVtKyspIHsKKwkJZXJyID0gdWJpX2lvX2lzX2JhZCh1YmksIHBudW0pOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJCWVsc2UgaWYgKGVycikKKwkJCWJ1ZltwbnVtXSA9IDA7CisJfQorCisJdWJpX3JiX2Zvcl9lYWNoX2VudHJ5KHJiMSwgc3YsICZzaS0+dm9sdW1lcywgcmIpCisJCXViaV9yYl9mb3JfZWFjaF9lbnRyeShyYjIsIHNlYiwgJnN2LT5yb290LCB1LnJiKQorCQkJYnVmW3NlYi0+cG51bV0gPSAwOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShzZWIsICZzaS0+ZnJlZSwgdS5saXN0KQorCQlidWZbc2ViLT5wbnVtXSA9IDA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNlYiwgJnNpLT5jb3JyLCB1Lmxpc3QpCisJCWJ1ZltzZWItPnBudW1dID0gMDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoc2ViLCAmc2ktPmVyYXNlLCB1Lmxpc3QpCisJCWJ1ZltzZWItPnBudW1dID0gMDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoc2ViLCAmc2ktPmFsaWVuLCB1Lmxpc3QpCisJCWJ1ZltzZWItPnBudW1dID0gMDsKKworCWVyciA9IDA7CisJZm9yIChwbnVtID0gMDsgcG51bSA8IHViaS0+cGViX2NvdW50OyBwbnVtKyspCisJCWlmIChidWZbcG51bV0pIHsKKwkJCXViaV9lcnIoIlBFQiAlZCBpcyBub3QgcmVmZXJyZWQiLCBwbnVtKTsKKwkJCWVyciA9IDE7CisJCX0KKworCWtmcmVlKGJ1Zik7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisJcmV0dXJuIDA7CisKK2JhZF9zZWI6CisJdWJpX2VycigiYmFkIHNjYW5uaW5nIGluZm9ybWF0aW9uIGFib3V0IExFQiAlZCIsIHNlYi0+bG51bSk7CisJdWJpX2RiZ19kdW1wX3NlYihzZWIsIDApOworCXViaV9kYmdfZHVtcF9zdihzdik7CisJZ290byBvdXQ7CisKK2JhZF9zdjoKKwl1YmlfZXJyKCJiYWQgc2Nhbm5pbmcgaW5mb3JtYXRpb24gYWJvdXQgdm9sdW1lICVkIiwgc3YtPnZvbF9pZCk7CisJdWJpX2RiZ19kdW1wX3N2KHN2KTsKKwlnb3RvIG91dDsKKworYmFkX3ZpZF9oZHI6CisJdWJpX2VycigiYmFkIHNjYW5uaW5nIGluZm9ybWF0aW9uIGFib3V0IHZvbHVtZSAlZCIsIHN2LT52b2xfaWQpOworCXViaV9kYmdfZHVtcF9zdihzdik7CisJdWJpX2RiZ19kdW1wX3ZpZF9oZHIodmlkaCk7CisKK291dDoKKwl1YmlfZGJnX2R1bXBfc3RhY2soKTsKKwlyZXR1cm4gMTsKK30KKworI2VuZGlmIC8qIENPTkZJR19NVERfVUJJX0RFQlVHX1BBUkFOT0lEICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC91Ymkvc2Nhbi5oIGIvZHJpdmVycy9tdGQvdWJpL3NjYW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTQ5ZjYxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tdGQvdWJpL3NjYW4uaApAQCAtMCwwICsxLDE2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiwgMjAwNgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUKKyAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiBBdXRob3I6IEFydGVtIEJpdHl1dHNraXkgKNCR0LjRgtGO0YbQutC40Lkg0JDRgNGC0ZHQvCkKKyAqLworCisjaWZuZGVmIF9fVUJJX1NDQU5fSF9fCisjZGVmaW5lIF9fVUJJX1NDQU5fSF9fCisKKy8qIFRoZSBlcmFzZSBjb3VudGVyIHZhbHVlIGZvciB0aGlzIHBoeXNpY2FsIGVyYXNlYmxvY2sgaXMgdW5rbm93biAqLworI2RlZmluZSBVQklfU0NBTl9VTktOT1dOX0VDICgtMSkKKworLyoqCisgKiBzdHJ1Y3QgdWJpX3NjYW5fbGViIC0gc2Nhbm5pbmcgaW5mb3JtYXRpb24gYWJvdXQgYSBwaHlzaWNhbCBlcmFzZWJsb2NrLgorICogQGVjOiBlcmFzZSBjb3VudGVyICglVUJJX1NDQU5fVU5LTk9XTl9FQyBpZiBpdCBpcyB1bmtub3duKQorICogQHBudW06IHBoeXNpY2FsIGVyYXNlYmxvY2sgbnVtYmVyCisgKiBAbG51bTogbG9naWNhbCBlcmFzZWJsb2NrIG51bWJlcgorICogQHNjcnViOiBpZiB0aGlzIHBoeXNpY2FsIGVyYXNlYmxvY2sgbmVlZHMgc2NydWJiaW5nCisgKiBAc3FudW06IHNlcXVlbmNlIG51bWJlcgorICogQHU6IHVuaW9ucyBSQi10cmVlIG9yIEBsaXN0IGxpbmtzCisgKiBAdS5yYjogbGluayBpbiB0aGUgcGVyLXZvbHVtZSBSQi10cmVlIG9mICZzdHJ1Y3QgdWJpX3NjYW5fbGViIG9iamVjdHMKKyAqIEB1Lmxpc3Q6IGxpbmsgaW4gb25lIG9mIHRoZSBlcmFzZWJsb2NrIGxpc3RzCisgKiBAbGViX3ZlcjogbG9naWNhbCBlcmFzZWJsb2NrIHZlcnNpb24gKG9ic29sZXRlKQorICoKKyAqIE9uZSBvYmplY3Qgb2YgdGhpcyB0eXBlIGlzIGFsbG9jYXRlZCBmb3IgZWFjaCBwaHlzaWNhbCBlcmFzZWJsb2NrIGR1cmluZworICogc2Nhbm5pbmcuCisgKi8KK3N0cnVjdCB1Ymlfc2Nhbl9sZWIgeworCWludCBlYzsKKwlpbnQgcG51bTsKKwlpbnQgbG51bTsKKwlpbnQgc2NydWI7CisJdW5zaWduZWQgbG9uZyBsb25nIHNxbnVtOworCXVuaW9uIHsKKwkJc3RydWN0IHJiX25vZGUgcmI7CisJCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwl9IHU7CisJdWludDMyX3QgbGViX3ZlcjsKK307CisKKy8qKgorICogc3RydWN0IHViaV9zY2FuX3ZvbHVtZSAtIHNjYW5uaW5nIGluZm9ybWF0aW9uIGFib3V0IGEgdm9sdW1lLgorICogQHZvbF9pZDogdm9sdW1lIElECisgKiBAaGlnaGVzdF9sbnVtOiBoaWdoZXN0IGxvZ2ljYWwgZXJhc2VibG9jayBudW1iZXIgaW4gdGhpcyB2b2x1bWUKKyAqIEBsZWJfY291bnQ6IG51bWJlciBvZiBsb2dpY2FsIGVyYXNlYmxvY2tzIGluIHRoaXMgdm9sdW1lCisgKiBAdm9sX3R5cGU6IHZvbHVtZSB0eXBlCisgKiBAdXNlZF9lYnM6IG51bWJlciBvZiB1c2VkIGxvZ2ljYWwgZXJhc2VibG9ja3MgaW4gdGhpcyB2b2x1bWUgKG9ubHkgZm9yCisgKiBzdGF0aWMgdm9sdW1lcykKKyAqIEBsYXN0X2RhdGFfc2l6ZTogYW1vdW50IG9mIGRhdGEgaW4gdGhlIGxhc3QgbG9naWNhbCBlcmFzZWJsb2NrIG9mIHRoaXMKKyAqIHZvbHVtZSAoYWx3YXlzIGVxdWl2YWxlbnQgdG8gdGhlIHVzYWJsZSBsb2dpY2FsIGVyYXNlYmxvY2sgc2l6ZSBpbiBjYXNlIG9mCisgKiBkeW5hbWljIHZvbHVtZXMpCisgKiBAZGF0YV9wYWQ6IGhvdyBtYW55IGJ5dGVzIGF0IHRoZSBlbmQgb2YgbG9naWNhbCBlcmFzZWJsb2NrcyBvZiB0aGlzIHZvbHVtZQorICogYXJlIG5vdCB1c2VkIChkdWUgdG8gdm9sdW1lIGFsaWdubWVudCkKKyAqIEBjb21wYXQ6IGNvbXBhdGliaWxpdHkgZmxhZ3Mgb2YgdGhpcyB2b2x1bWUKKyAqIEByYjogbGluayBpbiB0aGUgdm9sdW1lIFJCLXRyZWUKKyAqIEByb290OiByb290IG9mIHRoZSBSQi10cmVlIGNvbnRhaW5pbmcgYWxsIHRoZSBlcmFzZWJsb2NrIGJlbG9uZ2luZyB0byB0aGlzCisgKiB2b2x1bWUgKCZzdHJ1Y3QgdWJpX3NjYW5fbGViIG9iamVjdHMpCisgKgorICogT25lIG9iamVjdCBvZiB0aGlzIHR5cGUgaXMgYWxsb2NhdGVkIGZvciBlYWNoIHZvbHVtZSBkdXJpbmcgc2Nhbm5pbmcuCisgKi8KK3N0cnVjdCB1Ymlfc2Nhbl92b2x1bWUgeworCWludCB2b2xfaWQ7CisJaW50IGhpZ2hlc3RfbG51bTsKKwlpbnQgbGViX2NvdW50OworCWludCB2b2xfdHlwZTsKKwlpbnQgdXNlZF9lYnM7CisJaW50IGxhc3RfZGF0YV9zaXplOworCWludCBkYXRhX3BhZDsKKwlpbnQgY29tcGF0OworCXN0cnVjdCByYl9ub2RlIHJiOworCXN0cnVjdCByYl9yb290IHJvb3Q7Cit9OworCisvKioKKyAqIHN0cnVjdCB1Ymlfc2Nhbl9pbmZvIC0gVUJJIHNjYW5uaW5nIGluZm9ybWF0aW9uLgorICogQHZvbHVtZXM6IHJvb3Qgb2YgdGhlIHZvbHVtZSBSQi10cmVlCisgKiBAY29ycjogbGlzdCBvZiBjb3JydXB0ZWQgcGh5c2ljYWwgZXJhc2VibG9ja3MKKyAqIEBmcmVlOiBsaXN0IG9mIGZyZWUgcGh5c2ljYWwgZXJhc2VibG9ja3MKKyAqIEBlcmFzZTogbGlzdCBvZiBwaHlzaWNhbCBlcmFzZWJsb2NrcyB3aGljaCBoYXZlIHRvIGJlIGVyYXNlZAorICogQGFsaWVuOiBsaXN0IG9mIHBoeXNpY2FsIGVyYXNlYmxvY2tzIHdoaWNoIHNob3VsZCBub3QgYmUgdXNlZCBieSBVQkkgKGUuZy4sCisgKiBAYmFkX3BlYl9jb3VudDogY291bnQgb2YgYmFkIHBoeXNpY2FsIGVyYXNlYmxvY2tzCisgKiB0aG9zZSBiZWxvbmdpbmcgdG8gInByZXNlcnZlIi1jb21wYXRpYmxlIGludGVybmFsIHZvbHVtZXMpCisgKiBAdm9sc19mb3VuZDogbnVtYmVyIG9mIHZvbHVtZXMgZm91bmQgZHVyaW5nIHNjYW5uaW5nCisgKiBAaGlnaGVzdF92b2xfaWQ6IGhpZ2hlc3Qgdm9sdW1lIElECisgKiBAYWxpZW5fcGViX2NvdW50OiBjb3VudCBvZiBwaHlzaWNhbCBlcmFzZWJsb2NrcyBpbiB0aGUgQGFsaWVuIGxpc3QKKyAqIEBpc19lbXB0eTogZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIE1URCBkZXZpY2UgaXMgZW1wdHkgb3Igbm90CisgKiBAbWluX2VjOiBsb3dlc3QgZXJhc2UgY291bnRlciB2YWx1ZQorICogQG1heF9lYzogaGlnaGVzdCBlcmFzZSBjb3VudGVyIHZhbHVlCisgKiBAbWF4X3NxbnVtOiBoaWdoZXN0IHNlcXVlbmNlIG51bWJlciB2YWx1ZQorICogQG1lYW5fZWM6IG1lYW4gZXJhc2UgY291bnRlciB2YWx1ZQorICogQGVjX3N1bTogYSB0ZW1wb3JhcnkgdmFyaWFibGUgdXNlZCB3aGVuIGNhbGN1bGF0aW5nIEBtZWFuX2VjCisgKiBAZWNfY291bnQ6IGEgdGVtcG9yYXJ5IHZhcmlhYmxlIHVzZWQgd2hlbiBjYWxjdWxhdGluZyBAbWVhbl9lYworICoKKyAqIFRoaXMgZGF0YSBzdHJ1Y3R1cmUgY29udGFpbnMgdGhlIHJlc3VsdCBvZiBzY2FubmluZyBhbmQgbWF5IGJlIHVzZWQgYnkgb3RoZXIKKyAqIFVCSSB1bml0cyB0byBidWlsZCBmaW5hbCBVQkkgZGF0YSBzdHJ1Y3R1cmVzLCBmdXJ0aGVyIGVycm9yLXJlY292ZXJ5IGFuZCBzbworICogb24uCisgKi8KK3N0cnVjdCB1Ymlfc2Nhbl9pbmZvIHsKKwlzdHJ1Y3QgcmJfcm9vdCB2b2x1bWVzOworCXN0cnVjdCBsaXN0X2hlYWQgY29ycjsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGZyZWU7CisJc3RydWN0IGxpc3RfaGVhZCBlcmFzZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGFsaWVuOworCWludCBiYWRfcGViX2NvdW50OworCWludCB2b2xzX2ZvdW5kOworCWludCBoaWdoZXN0X3ZvbF9pZDsKKwlpbnQgYWxpZW5fcGViX2NvdW50OworCWludCBpc19lbXB0eTsKKwlpbnQgbWluX2VjOworCWludCBtYXhfZWM7CisJdW5zaWduZWQgbG9uZyBsb25nIG1heF9zcW51bTsKKwlpbnQgbWVhbl9lYzsKKwlpbnQgZWNfc3VtOworCWludCBlY19jb3VudDsKK307CisKK3N0cnVjdCB1YmlfZGV2aWNlOworc3RydWN0IHViaV92aWRfaGRyOworCisvKgorICogdWJpX3NjYW5fbW92ZV90b19saXN0IC0gbW92ZSBhIHBoeXNpY2FsIGVyYXNlYmxvY2sgZnJvbSB0aGUgdm9sdW1lIHRyZWUgdG8gYQorICogbGlzdC4KKyAqCisgKiBAc3Y6IHZvbHVtZSBzY2FubmluZyBpbmZvcm1hdGlvbgorICogQHNlYjogc2Nhbm5pbmcgZXJhc2VibG9jayBpbmZwcm1hdGlvbgorICogQGxpc3Q6IHRoZSBsaXN0IHRvIG1vdmUgdG8KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHViaV9zY2FuX21vdmVfdG9fbGlzdChzdHJ1Y3QgdWJpX3NjYW5fdm9sdW1lICpzdiwKKwkJCQkJIHN0cnVjdCB1Ymlfc2Nhbl9sZWIgKnNlYiwKKwkJCQkJIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpCit7CisJCXJiX2VyYXNlKCZzZWItPnUucmIsICZzdi0+cm9vdCk7CisJCWxpc3RfYWRkX3RhaWwoJnNlYi0+dS5saXN0LCBsaXN0KTsKK30KKworaW50IHViaV9zY2FuX2FkZF90b19saXN0KHN0cnVjdCB1Ymlfc2Nhbl9pbmZvICpzaSwgaW50IHBudW0sIGludCBlYywKKwkJCSBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KTsKK2ludCB1Ymlfc2Nhbl9hZGRfdXNlZChjb25zdCBzdHJ1Y3QgdWJpX2RldmljZSAqdWJpLCBzdHJ1Y3QgdWJpX3NjYW5faW5mbyAqc2ksCisJCSAgICAgIGludCBwbnVtLCBpbnQgZWMsIGNvbnN0IHN0cnVjdCB1YmlfdmlkX2hkciAqdmlkX2hkciwKKwkJICAgICAgaW50IGJpdGZsaXBzKTsKK3N0cnVjdCB1Ymlfc2Nhbl92b2x1bWUgKnViaV9zY2FuX2ZpbmRfc3YoY29uc3Qgc3RydWN0IHViaV9zY2FuX2luZm8gKnNpLAorCQkJCQkgaW50IHZvbF9pZCk7CitzdHJ1Y3QgdWJpX3NjYW5fbGViICp1Ymlfc2Nhbl9maW5kX3NlYihjb25zdCBzdHJ1Y3QgdWJpX3NjYW5fdm9sdW1lICpzdiwKKwkJCQkgICAgICAgaW50IGxudW0pOwordm9pZCB1Ymlfc2Nhbl9ybV92b2x1bWUoc3RydWN0IHViaV9zY2FuX2luZm8gKnNpLCBzdHJ1Y3QgdWJpX3NjYW5fdm9sdW1lICpzdik7CitzdHJ1Y3QgdWJpX3NjYW5fbGViICp1Ymlfc2Nhbl9nZXRfZnJlZV9wZWIoY29uc3Qgc3RydWN0IHViaV9kZXZpY2UgKnViaSwKKwkJCQkJICAgc3RydWN0IHViaV9zY2FuX2luZm8gKnNpKTsKK2ludCB1Ymlfc2Nhbl9lcmFzZV9wZWIoY29uc3Qgc3RydWN0IHViaV9kZXZpY2UgKnViaSwKKwkJICAgICAgIGNvbnN0IHN0cnVjdCB1Ymlfc2Nhbl9pbmZvICpzaSwgaW50IHBudW0sIGludCBlYyk7CitzdHJ1Y3QgdWJpX3NjYW5faW5mbyAqdWJpX3NjYW4oc3RydWN0IHViaV9kZXZpY2UgKnViaSk7Cit2b2lkIHViaV9zY2FuX2Rlc3Ryb3lfc2koc3RydWN0IHViaV9zY2FuX2luZm8gKnNpKTsKKworI2VuZGlmIC8qICFfX1VCSV9TQ0FOX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvdWJpL3ViaS5oIGIvZHJpdmVycy9tdGQvdWJpL3ViaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlYjY0N2YKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL210ZC91YmkvdWJpLmgKQEAgLTAsMCArMSw1MzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4sIDIwMDYKKyAqIENvcHlyaWdodCAoYykgTm9raWEgQ29ycG9yYXRpb24sIDIwMDYsIDIwMDcKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlCisgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICogQXV0aG9yOiBBcnRlbSBCaXR5dXRza2l5ICjQkdC40YLRjtGG0LrQuNC5INCQ0YDRgtGR0LwpCisgKi8KKworI2lmbmRlZiBfX1VCSV9VQklfSF9fCisjZGVmaW5lIF9fVUJJX1VCSV9IX18KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9yYnRyZWUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3J3c2VtLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CisKKyNpbmNsdWRlIDxtdGQvdWJpLWhlYWRlci5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC91YmkuaD4KKworI2luY2x1ZGUgInNjYW4uaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgorCisvKiBNYXhpbXVtIG51bWJlciBvZiBzdXBwb3J0ZWQgVUJJIGRldmljZXMgKi8KKyNkZWZpbmUgVUJJX01BWF9ERVZJQ0VTIDMyCisKKy8qIFVCSSBuYW1lIHVzZWQgZm9yIGNoYXJhY3RlciBkZXZpY2VzLCBzeXNmcywgZXRjICovCisjZGVmaW5lIFVCSV9OQU1FX1NUUiAidWJpIgorCisvKiBOb3JtYWwgVUJJIG1lc3NhZ2VzICovCisjZGVmaW5lIHViaV9tc2coZm10LCAuLi4pIHByaW50ayhLRVJOX05PVElDRSAiVUJJOiAiIGZtdCAiXG4iLCAjI19fVkFfQVJHU19fKQorLyogVUJJIHdhcm5pbmcgbWVzc2FnZXMgKi8KKyNkZWZpbmUgdWJpX3dhcm4oZm10LCAuLi4pIHByaW50ayhLRVJOX1dBUk5JTkcgIlVCSSB3YXJuaW5nOiAlczogIiBmbXQgIlxuIiwgXAorCQkJCSAgX19GVU5DVElPTl9fLCAjI19fVkFfQVJHU19fKQorLyogVUJJIGVycm9yIG1lc3NhZ2VzICovCisjZGVmaW5lIHViaV9lcnIoZm10LCAuLi4pIHByaW50ayhLRVJOX0VSUiAiVUJJIGVycm9yOiAlczogIiBmbXQgIlxuIiwgXAorCQkJCSBfX0ZVTkNUSU9OX18sICMjX19WQV9BUkdTX18pCisKKy8qIExvd2VzdCBudW1iZXIgUEVCcyByZXNlcnZlZCBmb3IgYmFkIFBFQiBoYW5kbGluZyAqLworI2RlZmluZSBNSU5fUkVTRVZFRF9QRUJTIDIKKworLyogQmFja2dyb3VuZCB0aHJlYWQgbmFtZSBwYXR0ZXJuICovCisjZGVmaW5lIFVCSV9CR1RfTkFNRV9QQVRURVJOICJ1YmlfYmd0JWRkIgorCisvKiBUaGlzIG1hcmtlciBpbiB0aGUgRUJBIHRhYmxlIG1lYW5zIHRoYXQgdGhlIExFQiBpcyB1bS1tYXBwZWQgKi8KKyNkZWZpbmUgVUJJX0xFQl9VTk1BUFBFRCAtMQorCisvKgorICogSW4gY2FzZSBvZiBlcnJvcnMsIFVCSSB0cmllcyB0byByZXBlYXQgdGhlIG9wZXJhdGlvbiBzZXZlcmFsIHRpbWVzIGJlZm9yZQorICogcmV0dXJuaW5nIGVycm9yLiBUaGUgYmVsb3cgY29uc3RhbnQgZGVmaW5lcyBob3cgbWFueSB0aW1lcyBVQkkgcmUtdHJpZXMuCisgKi8KKyNkZWZpbmUgVUJJX0lPX1JFVFJJRVMgMworCisvKgorICogRXJyb3IgY29kZXMgcmV0dXJuZWQgYnkgdGhlIEkvTyB1bml0LgorICoKKyAqIFVCSV9JT19QRUJfRU1QVFk6IHRoZSBwaHlzaWNhbCBlcmFzZWJsb2NrIGlzIGVtcHR5LCBpLmUuIGl0IGNvbnRhaW5zIG9ubHkKKyAqIDB4RkYgYnl0ZXMKKyAqIFVCSV9JT19QRUJfRlJFRTogdGhlIHBoeXNpY2FsIGVyYXNlYmxvY2sgaXMgZnJlZSwgaS5lLiBpdCBjb250YWlucyBvbmx5IGEKKyAqIHZhbGlkIGVyYXNlIGNvdW50ZXIgaGVhZGVyLCBhbmQgdGhlIHJlc3QgYXJlICUweEZGIGJ5dGVzCisgKiBVQklfSU9fQkFEX0VDX0hEUjogdGhlIGVyYXNlIGNvdW50ZXIgaGVhZGVyIGlzIGNvcnJ1cHRlZCAoYmFkIG1hZ2ljIG9yIENSQykKKyAqIFVCSV9JT19CQURfVklEX0hEUjogdGhlIHZvbHVtZSBpZGVudGlmaWVyIGhlYWRlciBpcyBjb3JydXB0ZWQgKGJhZCBtYWdpYyBvcgorICogQ1JDKQorICogVUJJX0lPX0JJVEZMSVBTOiBiaXQtZmxpcHMgd2VyZSBkZXRlY3RlZCBhbmQgY29ycmVjdGVkCisgKi8KK2VudW0geworCVVCSV9JT19QRUJfRU1QVFkgPSAxLAorCVVCSV9JT19QRUJfRlJFRSwKKwlVQklfSU9fQkFEX0VDX0hEUiwKKwlVQklfSU9fQkFEX1ZJRF9IRFIsCisJVUJJX0lPX0JJVEZMSVBTCit9OworCitleHRlcm4gaW50IHViaV9kZXZpY2VzX2NudDsKK2V4dGVybiBzdHJ1Y3QgdWJpX2RldmljZSAqdWJpX2RldmljZXNbXTsKKworc3RydWN0IHViaV92b2x1bWVfZGVzYzsKKworLyoqCisgKiBzdHJ1Y3QgdWJpX3ZvbHVtZSAtIFVCSSB2b2x1bWUgZGVzY3JpcHRpb24gZGF0YSBzdHJ1Y3R1cmUuCisgKiBAZGV2OiBkZXZpY2Ugb2JqZWN0IHRvIG1ha2UgdXNlIG9mIHRoZSB0aGUgTGludXggZGV2aWNlIG1vZGVsCisgKiBAY2RldjogY2hhcmFjdGVyIGRldmljZSBvYmplY3QgdG8gY3JlYXRlIGNoYXJhY3RlciBkZXZpY2UKKyAqIEB1Ymk6IHJlZmVyZW5jZSB0byB0aGUgVUJJIGRldmljZSBkZXNjcmlwdGlvbiBvYmplY3QKKyAqIEB2b2xfaWQ6IHZvbHVtZSBJRAorICogQHJlYWRlcnM6IG51bWJlciBvZiB1c2VycyBob2xkaW5nIHRoaXMgdm9sdW1lIGluIHJlYWQtb25seSBtb2RlCisgKiBAd3JpdGVyczogbnVtYmVyIG9mIHVzZXJzIGhvbGRpbmcgdGhpcyB2b2x1bWUgaW4gcmVhZC13cml0ZSBtb2RlCisgKiBAZXhjbHVzaXZlOiB3aGV0aGVyIHNvbWVib2R5IGhvbGRzIHRoaXMgdm9sdW1lIGluIGV4Y2x1c2l2ZSBtb2RlCisgKiBAcmVtb3ZlZDogaWYgdGhlIHZvbHVtZSB3YXMgcmVtb3ZlZAorICogQGNoZWNrZWQ6IGlmIHRoaXMgc3RhdGljIHZvbHVtZSB3YXMgY2hlY2tlZAorICoKKyAqIEByZXNlcnZlZF9wZWJzOiBob3cgbWFueSBwaHlzaWNhbCBlcmFzZWJsb2NrcyBhcmUgcmVzZXJ2ZWQgZm9yIHRoaXMgdm9sdW1lCisgKiBAdm9sX3R5cGU6IHZvbHVtZSB0eXBlICglVUJJX0RZTkFNSUNfVk9MVU1FIG9yICVVQklfU1RBVElDX1ZPTFVNRSkKKyAqIEB1c2FibGVfbGViX3NpemU6IGxvZ2ljYWwgZXJhc2VibG9jayBzaXplIHdpdGhvdXQgcGFkZGluZworICogQHVzZWRfZWJzOiBob3cgbWFueSBsb2dpY2FsIGVyYXNlYmxvY2tzIGluIHRoaXMgdm9sdW1lIGNvbnRhaW4gZGF0YQorICogQGxhc3RfZWJfYnl0ZXM6IGhvdyBtYW55IGJ5dGVzIGFyZSBzdG9yZWQgaW4gdGhlIGxhc3QgbG9naWNhbCBlcmFzZWJsb2NrCisgKiBAdXNlZF9ieXRlczogaG93IG1hbnkgYnl0ZXMgb2YgZGF0YSB0aGlzIHZvbHVtZSBjb250YWlucworICogQHVwZF9tYXJrZXI6IG5vbi16ZXJvIGlmIHRoZSB1cGRhdGUgbWFya2VyIGlzIHNldCBmb3IgdGhpcyB2b2x1bWUKKyAqIEBjb3JydXB0ZWQ6IG5vbi16ZXJvIGlmIHRoZSB2b2x1bWUgaXMgY29ycnVwdGVkIChzdGF0aWMgdm9sdW1lcyBvbmx5KQorICogQGFsaWdubWVudDogdm9sdW1lIGFsaWdubWVudAorICogQGRhdGFfcGFkOiBob3cgbWFueSBieXRlcyBhcmUgbm90IHVzZWQgYXQgdGhlIGVuZCBvZiBwaHlzaWNhbCBlcmFzZWJsb2NrcyB0bworICogc2F0aXNmeSB0aGUgcmVxdWVzdGVkIGFsaWdubWVudAorICogQG5hbWVfbGVuOiB2b2x1bWUgbmFtZSBsZW5ndGgKKyAqIEBuYW1lOiB2b2x1bWUgbmFtZQorICoKKyAqIEB1cGRhdGluZzogd2hldGhlciB0aGUgdm9sdW1lIGlzIGJlaW5nIHVwZGF0ZWQKKyAqIEB1cGRfZWJzOiBob3cgbWFueSBlcmFzZWJsb2NrcyBhcmUgZXhwZWN0ZWQgdG8gYmUgdXBkYXRlZAorICogQHVwZF9ieXRlczogaG93IG1hbnkgYnl0ZXMgYXJlIGV4cGVjdGVkIHRvIGJlIHJlY2VpdmVkCisgKiBAdXBkX3JlY2VpdmVkOiBob3cgbWFueSB1cGRhdGUgYnl0ZXMgd2VyZSBhbHJlYWR5IHJlY2VpdmVkCisgKiBAdXBkX2J1ZjogdXBkYXRlIGJ1ZmZlciB3aGljaCBpcyB1c2VkIHRvIGNvbGxlY3QgdXBkYXRlIGRhdGEKKyAqCisgKiBAZWJhX3RibDogRUJBIHRhYmxlIG9mIHRoaXMgdm9sdW1lIChMRUItPlBFQiBtYXBwaW5nKQorICoKKyAqIEBnbHVlYmlfZGVzYzogZ2x1ZWJpIFVCSSB2b2x1bWUgZGVzY3JpcHRvcgorICogQGdsdWViaV9yZWZjb3VudDogcmVmZXJlbmNlIGNvdW50IG9mIHRoZSBnbHVlYmkgTVREIGRldmljZQorICogQGdsdWViaV9tdGQ6IE1URCBkZXZpY2UgZGVzY3JpcHRpb24gb2JqZWN0IG9mIHRoZSBnbHVlYmkgTVREIGRldmljZQorICoKKyAqIFRoZSBAY29ycnVwdGVkIGZpZWxkIGluZGljYXRlcyB0aGF0IHRoZSB2b2x1bWUncyBjb250ZW50cyBpcyBjb3JydXB0ZWQuCisgKiBTaW5jZSBVQkkgcHJvdGVjdHMgb25seSBzdGF0aWMgdm9sdW1lcywgdGhpcyBmaWVsZCBpcyBub3QgcmVsZXZhbnQgdG8KKyAqIGR5bmFtaWMgdm9sdW1lcyAtIGl0IGlzIHVzZXIncyByZXNwb25zaWJpbGl0eSB0byBhc3N1cmUgdGhlaXIgZGF0YQorICogaW50ZWdyaXR5LgorICoKKyAqIFRoZSBAdXBkX21hcmtlciBmbGFnIGluZGljYXRlcyB0aGF0IHRoaXMgdm9sdW1lIGlzIGVpdGhlciBiZWluZyB1cGRhdGVkIGF0CisgKiB0aGUgbW9tZW50IG9yIGlzIGRhbWFnZWQgYmVjYXVzZSBvZiBhbiB1bmNsZWFuIHJlYm9vdC4KKyAqLworc3RydWN0IHViaV92b2x1bWUgeworCXN0cnVjdCBkZXZpY2UgZGV2OworCXN0cnVjdCBjZGV2IGNkZXY7CisJc3RydWN0IHViaV9kZXZpY2UgKnViaTsKKwlpbnQgdm9sX2lkOworCWludCByZWFkZXJzOworCWludCB3cml0ZXJzOworCWludCBleGNsdXNpdmU7CisJaW50IHJlbW92ZWQ7CisJaW50IGNoZWNrZWQ7CisKKwlpbnQgcmVzZXJ2ZWRfcGViczsKKwlpbnQgdm9sX3R5cGU7CisJaW50IHVzYWJsZV9sZWJfc2l6ZTsKKwlpbnQgdXNlZF9lYnM7CisJaW50IGxhc3RfZWJfYnl0ZXM7CisJbG9uZyBsb25nIHVzZWRfYnl0ZXM7CisJaW50IHVwZF9tYXJrZXI7CisJaW50IGNvcnJ1cHRlZDsKKwlpbnQgYWxpZ25tZW50OworCWludCBkYXRhX3BhZDsKKwlpbnQgbmFtZV9sZW47CisJY2hhciBuYW1lW1VCSV9WT0xfTkFNRV9NQVgrMV07CisKKwlpbnQgdXBkYXRpbmc7CisJaW50IHVwZF9lYnM7CisJbG9uZyBsb25nIHVwZF9ieXRlczsKKwlsb25nIGxvbmcgdXBkX3JlY2VpdmVkOworCXZvaWQgKnVwZF9idWY7CisKKwlpbnQgKmViYV90Ymw7CisKKyNpZmRlZiBDT05GSUdfTVREX1VCSV9HTFVFQkkKKwkvKiBHbHVlYmktcmVsYXRlZCBzdHVmZiBtYXkgYmUgY29tcGlsZWQgb3V0ICovCisJc3RydWN0IHViaV92b2x1bWVfZGVzYyAqZ2x1ZWJpX2Rlc2M7CisJaW50IGdsdWViaV9yZWZjb3VudDsKKwlzdHJ1Y3QgbXRkX2luZm8gZ2x1ZWJpX210ZDsKKyNlbmRpZgorfTsKKworLyoqCisgKiBzdHJ1Y3QgdWJpX3ZvbHVtZV9kZXNjIC0gZGVzY3JpcHRvciBvZiB0aGUgVUJJIHZvbHVtZSByZXR1cm5lZCB3aGVuIGl0IGlzCisgKiBvcGVuZWQuCisgKiBAdm9sOiByZWZlcmVuY2UgdG8gdGhlIGNvcnJlc3BvbmRpbmcgdm9sdW1lIGRlc2NyaXB0aW9uIG9iamVjdAorICogQG1vZGU6IG9wZW4gbW9kZSAoJVVCSV9SRUFET05MWSwgJVVCSV9SRUFEV1JJVEUsIG9yICVVQklfRVhDTFVTSVZFKQorICovCitzdHJ1Y3QgdWJpX3ZvbHVtZV9kZXNjIHsKKwlzdHJ1Y3QgdWJpX3ZvbHVtZSAqdm9sOworCWludCBtb2RlOworfTsKKworc3RydWN0IHViaV93bF9lbnRyeTsKKworLyoqCisgKiBzdHJ1Y3QgdWJpX2RldmljZSAtIFVCSSBkZXZpY2UgZGVzY3JpcHRpb24gc3RydWN0dXJlCisgKiBAZGV2OiBjbGFzcyBkZXZpY2Ugb2JqZWN0IHRvIHVzZSB0aGUgdGhlIExpbnV4IGRldmljZSBtb2RlbAorICogQGNkZXY6IGNoYXJhY3RlciBkZXZpY2Ugb2JqZWN0IHRvIGNyZWF0ZSBjaGFyYWN0ZXIgZGV2aWNlCisgKiBAdWJpX251bTogVUJJIGRldmljZSBudW1iZXIKKyAqIEB1YmlfbmFtZTogVUJJIGRldmljZSBuYW1lCisgKiBAbWFqb3I6IGNoYXJhY3RlciBkZXZpY2UgbWFqb3IgbnVtYmVyCisgKiBAdm9sX2NvdW50OiBudW1iZXIgb2Ygdm9sdW1lcyBpbiB0aGlzIFVCSSBkZXZpY2UKKyAqIEB2b2x1bWVzOiB2b2x1bWVzIG9mIHRoaXMgVUJJIGRldmljZQorICogQHZvbHVtZXNfbG9jazogcHJvdGVjdHMgQHZvbHVtZXMsIEByc3ZkX3BlYnMsIEBhdmFpbF9wZWJzLCBiZWJfcnN2ZF9wZWJzLAorICogQGJlYl9yc3ZkX2xldmVsLCBAYmFkX3BlYl9jb3VudCwgQGdvb2RfcGViX2NvdW50LCBAdm9sX2NvdW50LCBAdm9sLT5yZWFkZXJzLAorICogQHZvbC0+d3JpdGVycywgQHZvbC0+ZXhjbHVzaXZlLCBAdm9sLT5yZW1vdmVkLCBAdm9sLT5tYXBwaW5nIGFuZAorICogQHZvbC0+ZWJhX3RibC4KKyAqCisgKiBAcnN2ZF9wZWJzOiBjb3VudCBvZiByZXNlcnZlZCBwaHlzaWNhbCBlcmFzZWJsb2NrcworICogQGF2YWlsX3BlYnM6IGNvdW50IG9mIGF2YWlsYWJsZSBwaHlzaWNhbCBlcmFzZWJsb2NrcworICogQGJlYl9yc3ZkX3BlYnM6IGhvdyBtYW55IHBoeXNpY2FsIGVyYXNlYmxvY2tzIGFyZSByZXNlcnZlZCBmb3IgYmFkIFBFQgorICogaGFuZGxpbmcKKyAqIEBiZWJfcnN2ZF9sZXZlbDogbm9ybWFsIGxldmVsIG9mIFBFQnMgcmVzZXJ2ZWQgZm9yIGJhZCBQRUIgaGFuZGxpbmcKKyAqCisgKiBAdnRibF9zbG90czogaG93IG1hbnkgc2xvdHMgYXJlIGF2YWlsYWJsZSBpbiB0aGUgdm9sdW1lIHRhYmxlCisgKiBAdnRibF9zaXplOiBzaXplIG9mIHRoZSB2b2x1bWUgdGFibGUgaW4gYnl0ZXMKKyAqIEB2dGJsOiBpbi1SQU0gdm9sdW1lIHRhYmxlIGNvcHkKKyAqCisgKiBAbWF4X2VjOiBjdXJyZW50IGhpZ2hlc3QgZXJhc2UgY291bnRlciB2YWx1ZQorICogQG1lYW5fZWM6IGN1cnJlbnQgbWVhbiBlcmFzZSBjb3VudGVyIHZhbHVlCisgKgorICogZ2xvYmFsX3NxbnVtOiBnbG9iYWwgc2VxdWVuY2UgbnVtYmVyCisgKiBAbHRyZWVfbG9jazogcHJvdGVjdHMgdGhlIGxvY2sgdHJlZSBhbmQgQGdsb2JhbF9zcW51bQorICogQGx0cmVlOiB0aGUgbG9jayB0cmVlCisgKiBAdnRibF9tdXRleDogcHJvdGVjdHMgb24tZmxhc2ggdm9sdW1lIHRhYmxlCisgKgorICogQHVzZWQ6IFJCLXRyZWUgb2YgdXNlZCBwaHlzaWNhbCBlcmFzZWJsb2NrcworICogQGZyZWU6IFJCLXRyZWUgb2YgZnJlZSBwaHlzaWNhbCBlcmFzZWJsb2NrcworICogQHNjcnViOiBSQi10cmVlIG9mIHBoeXNpY2FsIGVyYXNlYmxvY2tzIHdoaWNoIG5lZWQgc2NydWJiaW5nCisgKiBAcHJvdDogcHJvdGVjdGlvbiB0cmVlcworICogQHByb3QucG51bTogcHJvdGVjdGlvbiB0cmVlIGluZGV4ZWQgYnkgcGh5c2ljYWwgZXJhc2VibG9jayBudW1iZXJzCisgKiBAcHJvdC5hZWM6IHByb3RlY3Rpb24gdHJlZSBpbmRleGVkIGJ5IGFic29sdXRlIGVyYXNlIGNvdW50ZXIgdmFsdWUKKyAqIEB3bF9sb2NrOiBwcm90ZWN0cyB0aGUgQHVzZWQsIEBmcmVlLCBAcHJvdCwgQGxvb2t1cHRibCwgQGFic19lYywgQG1vdmVfZnJvbSwKKyAqIEBtb3ZlX3RvLCBAbW92ZV90b19wdXQgQGVyYXNlX3BlbmRpbmcsIEB3bF9zY2hlZHVsZWQsIGFuZCBAd29ya3MKKyAqIGZpZWxkcworICogQHdsX3NjaGVkdWxlZDogbm9uLXplcm8gaWYgdGhlIHdlYXItbGV2ZWxpbmcgd2FzIHNjaGVkdWxlZAorICogQGxvb2t1cHRibDogYSB0YWJsZSB0byBxdWlja2x5IGZpbmQgYSAmc3RydWN0IHViaV93bF9lbnRyeSBvYmplY3QgZm9yIGFueQorICogcGh5c2ljYWwgZXJhc2VibG9jaworICogQGFic19lYzogYWJzb2x1dGUgZXJhc2UgY291bnRlcgorICogQG1vdmVfZnJvbTogcGh5c2ljYWwgZXJhc2VibG9jayBmcm9tIHdoZXJlIHRoZSBkYXRhIGlzIGJlaW5nIG1vdmVkCisgKiBAbW92ZV90bzogcGh5c2ljYWwgZXJhc2VibG9jayB3aGVyZSB0aGUgZGF0YSBpcyBiZWluZyBtb3ZlZCB0bworICogQG1vdmVfZnJvbV9wdXQ6IGlmIHRoZSAiZnJvbSIgUEVCIHdhcyBwdXQKKyAqIEBtb3ZlX3RvX3B1dDogaWYgdGhlICJ0byIgUEVCIHdhcyBwdXQKKyAqIEB3b3JrczogbGlzdCBvZiBwZW5kaW5nIHdvcmtzCisgKiBAd29ya3NfY291bnQ6IGNvdW50IG9mIHBlbmRpbmcgd29ya3MKKyAqIEBiZ3RfdGhyZWFkOiBiYWNrZ3JvdW5kIHRocmVhZCBkZXNjcmlwdGlvbiBvYmplY3QKKyAqIEB0aHJlYWRfZW5hYmxlZDogaWYgdGhlIGJhY2tncm91bmQgdGhyZWFkIGlzIGVuYWJsZWQKKyAqIEBiZ3RfbmFtZTogYmFja2dyb3VuZCB0aHJlYWQgbmFtZQorICoKKyAqIEBmbGFzaF9zaXplOiB1bmRlcmx5aW5nIE1URCBkZXZpY2Ugc2l6ZSAoaW4gYnl0ZXMpCisgKiBAcGViX2NvdW50OiBjb3VudCBvZiBwaHlzaWNhbCBlcmFzZWJsb2NrcyBvbiB0aGUgTVREIGRldmljZQorICogQHBlYl9zaXplOiBwaHlzaWNhbCBlcmFzZWJsb2NrIHNpemUKKyAqIEBiYWRfcGViX2NvdW50OiBjb3VudCBvZiBiYWQgcGh5c2ljYWwgZXJhc2VibG9ja3MKKyAqIEBnb29kX3BlYl9jb3VudDogY291bnQgb2YgZ29vZCBwaHlzaWNhbCBlcmFzZWJsb2NrcworICogQG1pbl9pb19zaXplOiBtaW5pbWFsIGlucHV0L291dHB1dCB1bml0IHNpemUgb2YgdGhlIHVuZGVybHlpbmcgTVREIGRldmljZQorICogQGhkcnNfbWluX2lvX3NpemU6IG1pbmltYWwgSS9PIHVuaXQgc2l6ZSB1c2VkIGZvciBWSUQgYW5kIEVDIGhlYWRlcnMKKyAqIEByb19tb2RlOiBpZiB0aGUgVUJJIGRldmljZSBpcyBpbiByZWFkLW9ubHkgbW9kZQorICogQGxlYl9zaXplOiBsb2dpY2FsIGVyYXNlYmxvY2sgc2l6ZQorICogQGxlYl9zdGFydDogc3RhcnRpbmcgb2Zmc2V0IG9mIGxvZ2ljYWwgZXJhc2VibG9ja3Mgd2l0aGluIHBoeXNpY2FsCisgKiBlcmFzZWJsb2NrcworICogQGVjX2hkcl9hbHNpemU6IHNpemUgb2YgdGhlIEVDIGhlYWRlciBhbGlnbmVkIHRvIEBoZHJzX21pbl9pb19zaXplCisgKiBAdmlkX2hkcl9hbHNpemU6IHNpemUgb2YgdGhlIFZJRCBoZWFkZXIgYWxpZ25lZCB0byBAaGRyc19taW5faW9fc2l6ZQorICogQHZpZF9oZHJfb2Zmc2V0OiBzdGFydGluZyBvZmZzZXQgb2YgdGhlIHZvbHVtZSBpZGVudGlmaWVyIGhlYWRlciAobWlnaHQgYmUKKyAqIHVuYWxpZ25lZCkKKyAqIEB2aWRfaGRyX2Fsb2Zmc2V0OiBzdGFydGluZyBvZmZzZXQgb2YgdGhlIFZJRCBoZWFkZXIgYWxpZ25lZCB0bworICogQGhkcnNfbWluX2lvX3NpemUKKyAqIEB2aWRfaGRyX3NoaWZ0OiBjb250YWlucyBAdmlkX2hkcl9vZmZzZXQgLSBAdmlkX2hkcl9hbG9mZnNldAorICogQGJhZF9hbGxvd2VkOiB3aGV0aGVyIHRoZSBNVEQgZGV2aWNlIGFkbWl0cyBvZiBiYWQgcGh5c2ljYWwgZXJhc2VibG9ja3Mgb3IKKyAqIG5vdAorICogQG10ZDogTVREIGRldmljZSBkZXNjcmlwdG9yCisgKi8KK3N0cnVjdCB1YmlfZGV2aWNlIHsKKwlzdHJ1Y3QgY2RldiBjZGV2OworCXN0cnVjdCBkZXZpY2UgZGV2OworCWludCB1YmlfbnVtOworCWNoYXIgdWJpX25hbWVbc2l6ZW9mKFVCSV9OQU1FX1NUUikrNV07CisJaW50IG1ham9yOworCWludCB2b2xfY291bnQ7CisJc3RydWN0IHViaV92b2x1bWUgKnZvbHVtZXNbVUJJX01BWF9WT0xVTUVTK1VCSV9JTlRfVk9MX0NPVU5UXTsKKwlzcGlubG9ja190IHZvbHVtZXNfbG9jazsKKworCWludCByc3ZkX3BlYnM7CisJaW50IGF2YWlsX3BlYnM7CisJaW50IGJlYl9yc3ZkX3BlYnM7CisJaW50IGJlYl9yc3ZkX2xldmVsOworCisJaW50IHZ0Ymxfc2xvdHM7CisJaW50IHZ0Ymxfc2l6ZTsKKwlzdHJ1Y3QgdWJpX3Z0YmxfcmVjb3JkICp2dGJsOworCXN0cnVjdCBtdXRleCB2dGJsX211dGV4OworCisJaW50IG1heF9lYzsKKwlpbnQgbWVhbl9lYzsKKworCS8qIEVCQSB1bml0J3Mgc3R1ZmYgKi8KKwl1bnNpZ25lZCBsb25nIGxvbmcgZ2xvYmFsX3NxbnVtOworCXNwaW5sb2NrX3QgbHRyZWVfbG9jazsKKwlzdHJ1Y3QgcmJfcm9vdCBsdHJlZTsKKworCS8qIFdlYXItbGV2ZWxpbmcgdW5pdCdzIHN0dWZmICovCisJc3RydWN0IHJiX3Jvb3QgdXNlZDsKKwlzdHJ1Y3QgcmJfcm9vdCBmcmVlOworCXN0cnVjdCByYl9yb290IHNjcnViOworCXN0cnVjdCB7CisJCXN0cnVjdCByYl9yb290IHBudW07CisJCXN0cnVjdCByYl9yb290IGFlYzsKKwl9IHByb3Q7CisJc3BpbmxvY2tfdCB3bF9sb2NrOworCWludCB3bF9zY2hlZHVsZWQ7CisJc3RydWN0IHViaV93bF9lbnRyeSAqKmxvb2t1cHRibDsKKwl1bnNpZ25lZCBsb25nIGxvbmcgYWJzX2VjOworCXN0cnVjdCB1Ymlfd2xfZW50cnkgKm1vdmVfZnJvbTsKKwlzdHJ1Y3QgdWJpX3dsX2VudHJ5ICptb3ZlX3RvOworCWludCBtb3ZlX2Zyb21fcHV0OworCWludCBtb3ZlX3RvX3B1dDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHdvcmtzOworCWludCB3b3Jrc19jb3VudDsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmJndF90aHJlYWQ7CisJaW50IHRocmVhZF9lbmFibGVkOworCWNoYXIgYmd0X25hbWVbc2l6ZW9mKFVCSV9CR1RfTkFNRV9QQVRURVJOKSsyXTsKKworCS8qIEkvTyB1bml0J3Mgc3R1ZmYgKi8KKwlsb25nIGxvbmcgZmxhc2hfc2l6ZTsKKwlpbnQgcGViX2NvdW50OworCWludCBwZWJfc2l6ZTsKKwlpbnQgYmFkX3BlYl9jb3VudDsKKwlpbnQgZ29vZF9wZWJfY291bnQ7CisJaW50IG1pbl9pb19zaXplOworCWludCBoZHJzX21pbl9pb19zaXplOworCWludCByb19tb2RlOworCWludCBsZWJfc2l6ZTsKKwlpbnQgbGViX3N0YXJ0OworCWludCBlY19oZHJfYWxzaXplOworCWludCB2aWRfaGRyX2Fsc2l6ZTsKKwlpbnQgdmlkX2hkcl9vZmZzZXQ7CisJaW50IHZpZF9oZHJfYWxvZmZzZXQ7CisJaW50IHZpZF9oZHJfc2hpZnQ7CisJaW50IGJhZF9hbGxvd2VkOworCXN0cnVjdCBtdGRfaW5mbyAqbXRkOworfTsKKworZXh0ZXJuIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdWJpX2NkZXZfb3BlcmF0aW9uczsKK2V4dGVybiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHViaV92b2xfY2Rldl9vcGVyYXRpb25zOworZXh0ZXJuIHN0cnVjdCBjbGFzcyAqdWJpX2NsYXNzOworCisvKiB2dGJsLmMgKi8KK2ludCB1YmlfY2hhbmdlX3Z0YmxfcmVjb3JkKHN0cnVjdCB1YmlfZGV2aWNlICp1YmksIGludCBpZHgsCisJCQkgICBzdHJ1Y3QgdWJpX3Z0YmxfcmVjb3JkICp2dGJsX3JlYyk7CitpbnQgdWJpX3JlYWRfdm9sdW1lX3RhYmxlKHN0cnVjdCB1YmlfZGV2aWNlICp1YmksIHN0cnVjdCB1Ymlfc2Nhbl9pbmZvICpzaSk7CisKKy8qIHZtdC5jICovCitpbnQgdWJpX2NyZWF0ZV92b2x1bWUoc3RydWN0IHViaV9kZXZpY2UgKnViaSwgc3RydWN0IHViaV9ta3ZvbF9yZXEgKnJlcSk7CitpbnQgdWJpX3JlbW92ZV92b2x1bWUoc3RydWN0IHViaV92b2x1bWVfZGVzYyAqZGVzYyk7CitpbnQgdWJpX3Jlc2l6ZV92b2x1bWUoc3RydWN0IHViaV92b2x1bWVfZGVzYyAqZGVzYywgaW50IHJlc2VydmVkX3BlYnMpOworaW50IHViaV9hZGRfdm9sdW1lKHN0cnVjdCB1YmlfZGV2aWNlICp1YmksIGludCB2b2xfaWQpOwordm9pZCB1YmlfZnJlZV92b2x1bWUoc3RydWN0IHViaV9kZXZpY2UgKnViaSwgaW50IHZvbF9pZCk7CisKKy8qIHVwZC5jICovCitpbnQgdWJpX3N0YXJ0X3VwZGF0ZShzdHJ1Y3QgdWJpX2RldmljZSAqdWJpLCBpbnQgdm9sX2lkLCBsb25nIGxvbmcgYnl0ZXMpOworaW50IHViaV9tb3JlX3VwZGF0ZV9kYXRhKHN0cnVjdCB1YmlfZGV2aWNlICp1YmksIGludCB2b2xfaWQsCisJCQkgY29uc3Qgdm9pZCBfX3VzZXIgKmJ1ZiwgaW50IGNvdW50KTsKKworLyogbWlzYy5jICovCitpbnQgdWJpX2NhbGNfZGF0YV9sZW4oY29uc3Qgc3RydWN0IHViaV9kZXZpY2UgKnViaSwgY29uc3Qgdm9pZCAqYnVmLCBpbnQgbGVuZ3RoKTsKK2ludCB1YmlfY2hlY2tfdm9sdW1lKHN0cnVjdCB1YmlfZGV2aWNlICp1YmksIGludCB2b2xfaWQpOwordm9pZCB1YmlfY2FsY3VsYXRlX3Jlc2VydmVkKHN0cnVjdCB1YmlfZGV2aWNlICp1YmkpOworCisvKiBnbHVlYmkuYyAqLworI2lmZGVmIENPTkZJR19NVERfVUJJX0dMVUVCSQoraW50IHViaV9jcmVhdGVfZ2x1ZWJpKHN0cnVjdCB1YmlfZGV2aWNlICp1YmksIHN0cnVjdCB1Ymlfdm9sdW1lICp2b2wpOworaW50IHViaV9kZXN0cm95X2dsdWViaShzdHJ1Y3QgdWJpX3ZvbHVtZSAqdm9sKTsKKyNlbHNlCisjZGVmaW5lIHViaV9jcmVhdGVfZ2x1ZWJpKHViaSwgdm9sKSAwCisjZGVmaW5lIHViaV9kZXN0cm95X2dsdWViaSh2b2wpIDAKKyNlbmRpZgorCisvKiBlYmEuYyAqLworaW50IHViaV9lYmFfdW5tYXBfbGViKHN0cnVjdCB1YmlfZGV2aWNlICp1YmksIGludCB2b2xfaWQsIGludCBsbnVtKTsKK2ludCB1YmlfZWJhX3JlYWRfbGViKHN0cnVjdCB1YmlfZGV2aWNlICp1YmksIGludCB2b2xfaWQsIGludCBsbnVtLCB2b2lkICpidWYsCisJCSAgICAgaW50IG9mZnNldCwgaW50IGxlbiwgaW50IGNoZWNrKTsKK2ludCB1YmlfZWJhX3dyaXRlX2xlYihzdHJ1Y3QgdWJpX2RldmljZSAqdWJpLCBpbnQgdm9sX2lkLCBpbnQgbG51bSwKKwkJICAgICAgY29uc3Qgdm9pZCAqYnVmLCBpbnQgb2Zmc2V0LCBpbnQgbGVuLCBpbnQgZHR5cGUpOworaW50IHViaV9lYmFfd3JpdGVfbGViX3N0KHN0cnVjdCB1YmlfZGV2aWNlICp1YmksIGludCB2b2xfaWQsIGludCBsbnVtLAorCQkJIGNvbnN0IHZvaWQgKmJ1ZiwgaW50IGxlbiwgaW50IGR0eXBlLAorCQkJIGludCB1c2VkX2Vicyk7CitpbnQgdWJpX2ViYV9hdG9taWNfbGViX2NoYW5nZShzdHJ1Y3QgdWJpX2RldmljZSAqdWJpLCBpbnQgdm9sX2lkLCBpbnQgbG51bSwKKwkJCSAgICAgIGNvbnN0IHZvaWQgKmJ1ZiwgaW50IGxlbiwgaW50IGR0eXBlKTsKK2ludCB1YmlfZWJhX2NvcHlfbGViKHN0cnVjdCB1YmlfZGV2aWNlICp1YmksIGludCBmcm9tLCBpbnQgdG8sCisJCSAgICAgc3RydWN0IHViaV92aWRfaGRyICp2aWRfaGRyKTsKK2ludCB1YmlfZWJhX2luaXRfc2NhbihzdHJ1Y3QgdWJpX2RldmljZSAqdWJpLCBzdHJ1Y3QgdWJpX3NjYW5faW5mbyAqc2kpOwordm9pZCB1YmlfZWJhX2Nsb3NlKGNvbnN0IHN0cnVjdCB1YmlfZGV2aWNlICp1YmkpOworCisvKiB3bC5jICovCitpbnQgdWJpX3dsX2dldF9wZWIoc3RydWN0IHViaV9kZXZpY2UgKnViaSwgaW50IGR0eXBlKTsKK2ludCB1Ymlfd2xfcHV0X3BlYihzdHJ1Y3QgdWJpX2RldmljZSAqdWJpLCBpbnQgcG51bSwgaW50IHRvcnR1cmUpOworaW50IHViaV93bF9mbHVzaChzdHJ1Y3QgdWJpX2RldmljZSAqdWJpKTsKK2ludCB1Ymlfd2xfc2NydWJfcGViKHN0cnVjdCB1YmlfZGV2aWNlICp1YmksIGludCBwbnVtKTsKK2ludCB1Ymlfd2xfaW5pdF9zY2FuKHN0cnVjdCB1YmlfZGV2aWNlICp1YmksIHN0cnVjdCB1Ymlfc2Nhbl9pbmZvICpzaSk7Cit2b2lkIHViaV93bF9jbG9zZShzdHJ1Y3QgdWJpX2RldmljZSAqdWJpKTsKKworLyogaW8uYyAqLworaW50IHViaV9pb19yZWFkKGNvbnN0IHN0cnVjdCB1YmlfZGV2aWNlICp1YmksIHZvaWQgKmJ1ZiwgaW50IHBudW0sIGludCBvZmZzZXQsCisJCWludCBsZW4pOworaW50IHViaV9pb193cml0ZShjb25zdCBzdHJ1Y3QgdWJpX2RldmljZSAqdWJpLCBjb25zdCB2b2lkICpidWYsIGludCBwbnVtLAorCQkgaW50IG9mZnNldCwgaW50IGxlbik7CitpbnQgdWJpX2lvX3N5bmNfZXJhc2UoY29uc3Qgc3RydWN0IHViaV9kZXZpY2UgKnViaSwgaW50IHBudW0sIGludCB0b3J0dXJlKTsKK2ludCB1YmlfaW9faXNfYmFkKGNvbnN0IHN0cnVjdCB1YmlfZGV2aWNlICp1YmksIGludCBwbnVtKTsKK2ludCB1YmlfaW9fbWFya19iYWQoY29uc3Qgc3RydWN0IHViaV9kZXZpY2UgKnViaSwgaW50IHBudW0pOworaW50IHViaV9pb19yZWFkX2VjX2hkcihjb25zdCBzdHJ1Y3QgdWJpX2RldmljZSAqdWJpLCBpbnQgcG51bSwKKwkJICAgICAgIHN0cnVjdCB1YmlfZWNfaGRyICplY19oZHIsIGludCB2ZXJib3NlKTsKK2ludCB1YmlfaW9fd3JpdGVfZWNfaGRyKGNvbnN0IHN0cnVjdCB1YmlfZGV2aWNlICp1YmksIGludCBwbnVtLAorCQkJc3RydWN0IHViaV9lY19oZHIgKmVjX2hkcik7CitpbnQgdWJpX2lvX3JlYWRfdmlkX2hkcihjb25zdCBzdHJ1Y3QgdWJpX2RldmljZSAqdWJpLCBpbnQgcG51bSwKKwkJCXN0cnVjdCB1YmlfdmlkX2hkciAqdmlkX2hkciwgaW50IHZlcmJvc2UpOworaW50IHViaV9pb193cml0ZV92aWRfaGRyKGNvbnN0IHN0cnVjdCB1YmlfZGV2aWNlICp1YmksIGludCBwbnVtLAorCQkJIHN0cnVjdCB1YmlfdmlkX2hkciAqdmlkX2hkcik7CisKKy8qCisgKiB1YmlfcmJfZm9yX2VhY2hfZW50cnkgLSB3YWxrIGFuIFJCLXRyZWUuCisgKiBAcmI6IGEgcG9pbnRlciB0byB0eXBlICdzdHJ1Y3QgcmJfbm9kZScgdG8gdG8gdXNlIGFzIGEgbG9vcCBjb3VudGVyCisgKiBAcG9zOiBhIHBvaW50ZXIgdG8gUkItdHJlZSBlbnRyeSB0eXBlIHRvIHVzZSBhcyBhIGxvb3AgY291bnRlcgorICogQHJvb3Q6IFJCLXRyZWUncyByb290CisgKiBAbWVtYmVyOiB0aGUgbmFtZSBvZiB0aGUgJ3N0cnVjdCByYl9ub2RlJyB3aXRoaW4gdGhlIFJCLXRyZWUgZW50cnkKKyAqLworI2RlZmluZSB1YmlfcmJfZm9yX2VhY2hfZW50cnkocmIsIHBvcywgcm9vdCwgbWVtYmVyKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisJZm9yIChyYiA9IHJiX2ZpcnN0KHJvb3QpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgcG9zID0gKHJiID8gY29udGFpbmVyX29mKHJiLCB0eXBlb2YoKnBvcyksIG1lbWJlcikgOiBOVUxMKTsgICAgIFwKKwkgICAgIHJiOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICByYiA9IHJiX25leHQocmIpLCBwb3MgPSBjb250YWluZXJfb2YocmIsIHR5cGVvZigqcG9zKSwgbWVtYmVyKSkKKworLyoqCisgKiB1YmlfemFsbG9jX3ZpZF9oZHIgLSBhbGxvY2F0ZSBhIHZvbHVtZSBpZGVudGlmaWVyIGhlYWRlciBvYmplY3QuCisgKiBAdWJpOiBVQkkgZGV2aWNlIGRlc2NyaXB0aW9uIG9iamVjdAorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIG5ld2x5IGFsbG9jYXRlZCBhbmQgemVyby1maWxsZWQKKyAqIHZvbHVtZSBpZGVudGlmaWVyIGhlYWRlciBvYmplY3QgaW4gY2FzZSBvZiBzdWNjZXNzIGFuZCAlTlVMTCBpbiBjYXNlIG9mCisgKiBmYWlsdXJlLgorICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCB1YmlfdmlkX2hkciAqdWJpX3phbGxvY192aWRfaGRyKGNvbnN0IHN0cnVjdCB1YmlfZGV2aWNlICp1YmkpCit7CisJdm9pZCAqdmlkX2hkcjsKKworCXZpZF9oZHIgPSBremFsbG9jKHViaS0+dmlkX2hkcl9hbHNpemUsIEdGUF9LRVJORUwpOworCWlmICghdmlkX2hkcikKKwkJcmV0dXJuIE5VTEw7CisKKwkvKgorCSAqIFZJRCBoZWFkZXJzIG1heSBiZSBzdG9yZWQgYXQgdW4tYWxpZ25lZCBmbGFzaCBvZmZzZXRzLCBzbyB3ZSBzaGlmdAorCSAqIHRoZSBwb2ludGVyLgorCSAqLworCXJldHVybiB2aWRfaGRyICsgdWJpLT52aWRfaGRyX3NoaWZ0OworfQorCisvKioKKyAqIHViaV9mcmVlX3ZpZF9oZHIgLSBmcmVlIGEgdm9sdW1lIGlkZW50aWZpZXIgaGVhZGVyIG9iamVjdC4KKyAqIEB1Ymk6IFVCSSBkZXZpY2UgZGVzY3JpcHRpb24gb2JqZWN0CisgKiBAdmlkX2hkcjogdGhlIG9iamVjdCB0byBmcmVlCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB1YmlfZnJlZV92aWRfaGRyKGNvbnN0IHN0cnVjdCB1YmlfZGV2aWNlICp1YmksCisJCQkJICAgIHN0cnVjdCB1YmlfdmlkX2hkciAqdmlkX2hkcikKK3sKKwl2b2lkICpwID0gdmlkX2hkcjsKKworCWlmICghcCkKKwkJcmV0dXJuOworCisJa2ZyZWUocCAtIHViaS0+dmlkX2hkcl9zaGlmdCk7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gJ3ViaV9pb19yZWFkKCknLCBidXQgQG9mZnNldCBpcyByZWxhdGl2ZSB0bworICogdGhlIGJlZ2lubmluZyBvZiB0aGUgbG9naWNhbCBlcmFzZWJsb2NrLCBub3QgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUKKyAqIHBoeXNpY2FsIGVyYXNlYmxvY2suCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHViaV9pb19yZWFkX2RhdGEoY29uc3Qgc3RydWN0IHViaV9kZXZpY2UgKnViaSwgdm9pZCAqYnVmLAorCQkJCSAgIGludCBwbnVtLCBpbnQgb2Zmc2V0LCBpbnQgbGVuKQoreworCXViaV9hc3NlcnQob2Zmc2V0ID49IDApOworCXJldHVybiB1YmlfaW9fcmVhZCh1YmksIGJ1ZiwgcG51bSwgb2Zmc2V0ICsgdWJpLT5sZWJfc3RhcnQsIGxlbik7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gJ3ViaV9pb193cml0ZSgpJywgYnV0IEBvZmZzZXQgaXMgcmVsYXRpdmUgdG8KKyAqIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxvZ2ljYWwgZXJhc2VibG9jaywgbm90IHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlCisgKiBwaHlzaWNhbCBlcmFzZWJsb2NrLgorICovCitzdGF0aWMgaW5saW5lIGludCB1YmlfaW9fd3JpdGVfZGF0YShjb25zdCBzdHJ1Y3QgdWJpX2RldmljZSAqdWJpLCBjb25zdCB2b2lkICpidWYsCisJCQkJICAgIGludCBwbnVtLCBpbnQgb2Zmc2V0LCBpbnQgbGVuKQoreworCXViaV9hc3NlcnQob2Zmc2V0ID49IDApOworCXJldHVybiB1YmlfaW9fd3JpdGUodWJpLCBidWYsIHBudW0sIG9mZnNldCArIHViaS0+bGViX3N0YXJ0LCBsZW4pOworfQorCisvKioKKyAqIHViaV9yb19tb2RlIC0gc3dpdGNoIHRvIHJlYWQtb25seSBtb2RlLgorICogQHViaTogVUJJIGRldmljZSBkZXNjcmlwdGlvbiBvYmplY3QKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHViaV9yb19tb2RlKHN0cnVjdCB1YmlfZGV2aWNlICp1YmkpCit7CisJdWJpLT5yb19tb2RlID0gMTsKKwl1Ymlfd2Fybigic3dpdGNoIHRvIHJlYWQtb25seSBtb2RlIik7Cit9CisKKy8qKgorICogdm9sX2lkMmlkeCAtIGdldCB0YWJsZSBpbmRleCBieSB2b2x1bWUgSUQuCisgKiBAdWJpOiBVQkkgZGV2aWNlIGRlc2NyaXB0aW9uIG9iamVjdAorICogQHZvbF9pZDogdm9sdW1lIElECisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHZvbF9pZDJpZHgoY29uc3Qgc3RydWN0IHViaV9kZXZpY2UgKnViaSwgaW50IHZvbF9pZCkKK3sKKwlpZiAodm9sX2lkID49IFVCSV9JTlRFUk5BTF9WT0xfU1RBUlQpCisJCXJldHVybiB2b2xfaWQgLSBVQklfSU5URVJOQUxfVk9MX1NUQVJUICsgdWJpLT52dGJsX3Nsb3RzOworCWVsc2UKKwkJcmV0dXJuIHZvbF9pZDsKK30KKworLyoqCisgKiBpZHgydm9sX2lkIC0gZ2V0IHZvbHVtZSBJRCBieSB0YWJsZSBpbmRleC4KKyAqIEB1Ymk6IFVCSSBkZXZpY2UgZGVzY3JpcHRpb24gb2JqZWN0CisgKiBAaWR4OiB0YWJsZSBpbmRleAorICovCitzdGF0aWMgaW5saW5lIGludCBpZHgydm9sX2lkKGNvbnN0IHN0cnVjdCB1YmlfZGV2aWNlICp1YmksIGludCBpZHgpCit7CisJaWYgKGlkeCA+PSB1YmktPnZ0Ymxfc2xvdHMpCisJCXJldHVybiBpZHggLSB1YmktPnZ0Ymxfc2xvdHMgKyBVQklfSU5URVJOQUxfVk9MX1NUQVJUOworCWVsc2UKKwkJcmV0dXJuIGlkeDsKK30KKworI2VuZGlmIC8qICFfX1VCSV9VQklfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC91YmkvdXBkLmMgYi9kcml2ZXJzL210ZC91YmkvdXBkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODkyNWI5NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbXRkL3ViaS91cGQuYwpAQCAtMCwwICsxLDM0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiwgMjAwNgorICogQ29weXJpZ2h0IChjKSBOb2tpYSBDb3Jwb3JhdGlvbiwgMjAwNgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUKKyAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiBBdXRob3I6IEFydGVtIEJpdHl1dHNraXkgKNCR0LjRgtGO0YbQutC40Lkg0JDRgNGC0ZHQvCkKKyAqCisgKiBKYW4gMjAwNzogQWxleGFuZGVyIFNjaG1pZHQsIGhhY2tlZCBwZXItdm9sdW1lIHVwZGF0ZS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGltcGxlbWVudGF0aW9uIG9mIHRoZSB2b2x1bWUgdXBkYXRlIGZ1bmN0aW9uYWxpdHkuCisgKgorICogVGhlIHVwZGF0ZSBvcGVyYXRpb24gaXMgYmFzZWQgb24gdGhlIHBlci12b2x1bWUgdXBkYXRlIG1hcmtlciB3aGljaCBpcworICogc3RvcmVkIGluIHRoZSB2b2x1bWUgdGFibGUuIFRoZSB1cGRhdGUgbWFya2VyIGlzIHNldCBiZWZvcmUgdGhlIHVwZGF0ZQorICogc3RhcnRzLCBhbmQgcmVtb3ZlZCBhZnRlciB0aGUgdXBkYXRlIGhhcyBiZWVuIGZpbmlzaGVkLiBTbyBpZiB0aGUgdXBkYXRlIHdhcworICogaW50ZXJydXB0ZWQgYnkgYW4gdW5jbGVhbiByZS1ib290IG9yIGR1ZSB0byBzb21lIG90aGVyIHJlYXNvbnMsIHRoZSB1cGRhdGUKKyAqIG1hcmtlciBzdGF5cyBvbiB0aGUgZmxhc2ggbWVkaWEgYW5kIFVCSSBmaW5kcyBpdCB3aGVuIGl0IGF0dGFjaGVzIHRoZSBNVEQKKyAqIGRldmljZSBuZXh0IHRpbWUuIElmIHRoZSB1cGRhdGUgbWFya2VyIGlzIHNldCBmb3IgYSB2b2x1bWUsIHRoZSB2b2x1bWUgaXMKKyAqIHRyZWF0ZWQgYXMgZGFtYWdlZCBhbmQgbW9zdCBJL08gb3BlcmF0aW9ucyBhcmUgcHJvaGliaXRlZC4gT25seSBhIG5ldyB1cGRhdGUKKyAqIG9wZXJhdGlvbiBpcyBhbGxvd2VkLgorICoKKyAqIE5vdGUsIGluIGdlbmVyYWwgaXQgaXMgcG9zc2libGUgdG8gaW1wbGVtZW50IHRoZSB1cGRhdGUgb3BlcmF0aW9uIGFzIGEKKyAqIHRyYW5zYWN0aW9uIHdpdGggYSByb2xsLWJhY2sgY2FwYWJpbGl0eS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vZGl2NjQuaD4KKyNpbmNsdWRlICJ1YmkuaCIKKworLyoqCisgKiBzZXRfdXBkYXRlX21hcmtlciAtIHNldCB1cGRhdGUgbWFya2VyLgorICogQHViaTogVUJJIGRldmljZSBkZXNjcmlwdGlvbiBvYmplY3QKKyAqIEB2b2xfaWQ6IHZvbHVtZSBJRAorICoKKyAqIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgdXBkYXRlIG1hcmtlciBmbGFnIGZvciB2b2x1bWUgQHZvbF9pZC4gUmV0dXJucyB6ZXJvCisgKiBpbiBjYXNlIG9mIHN1Y2Nlc3MgYW5kIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBpbiBjYXNlIG9mIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQgc2V0X3VwZGF0ZV9tYXJrZXIoc3RydWN0IHViaV9kZXZpY2UgKnViaSwgaW50IHZvbF9pZCkKK3sKKwlpbnQgZXJyOworCXN0cnVjdCB1YmlfdnRibF9yZWNvcmQgdnRibF9yZWM7CisJc3RydWN0IHViaV92b2x1bWUgKnZvbCA9IHViaS0+dm9sdW1lc1t2b2xfaWRdOworCisJZGJnX21zZygic2V0IHVwZGF0ZSBtYXJrZXIgZm9yIHZvbHVtZSAlZCIsIHZvbF9pZCk7CisKKwlpZiAodm9sLT51cGRfbWFya2VyKSB7CisJCXViaV9hc3NlcnQodWJpLT52dGJsW3ZvbF9pZF0udXBkX21hcmtlcik7CisJCWRiZ19tc2coImFscmVhZHkgc2V0Iik7CisJCXJldHVybiAwOworCX0KKworCW1lbWNweSgmdnRibF9yZWMsICZ1YmktPnZ0Ymxbdm9sX2lkXSwgc2l6ZW9mKHN0cnVjdCB1YmlfdnRibF9yZWNvcmQpKTsKKwl2dGJsX3JlYy51cGRfbWFya2VyID0gMTsKKworCWVyciA9IHViaV9jaGFuZ2VfdnRibF9yZWNvcmQodWJpLCB2b2xfaWQsICZ2dGJsX3JlYyk7CisJdm9sLT51cGRfbWFya2VyID0gMTsKKwlyZXR1cm4gZXJyOworfQorCisvKioKKyAqIGNsZWFyX3VwZGF0ZV9tYXJrZXIgLSBjbGVhciB1cGRhdGUgbWFya2VyLgorICogQHViaTogVUJJIGRldmljZSBkZXNjcmlwdGlvbiBvYmplY3QKKyAqIEB2b2xfaWQ6IHZvbHVtZSBJRAorICogQGJ5dGVzOiBuZXcgZGF0YSBzaXplIGluIGJ5dGVzCisgKgorICogVGhpcyBmdW5jdGlvbiBjbGVhcnMgdGhlIHVwZGF0ZSBtYXJrZXIgZm9yIHZvbHVtZSBAdm9sX2lkLCBzZXRzIG5ldyB2b2x1bWUKKyAqIGRhdGEgc2l6ZSBhbmQgY2xlYXJzIHRoZSAiY29ycnVwdGVkIiBmbGFnIChzdGF0aWMgdm9sdW1lcyBvbmx5KS4gUmV0dXJucworICogemVybyBpbiBjYXNlIG9mIHN1Y2Nlc3MgYW5kIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBpbiBjYXNlIG9mIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQgY2xlYXJfdXBkYXRlX21hcmtlcihzdHJ1Y3QgdWJpX2RldmljZSAqdWJpLCBpbnQgdm9sX2lkLCBsb25nIGxvbmcgYnl0ZXMpCit7CisJaW50IGVycjsKKwl1aW50NjRfdCB0bXA7CisJc3RydWN0IHViaV92dGJsX3JlY29yZCB2dGJsX3JlYzsKKwlzdHJ1Y3QgdWJpX3ZvbHVtZSAqdm9sID0gdWJpLT52b2x1bWVzW3ZvbF9pZF07CisKKwlkYmdfbXNnKCJjbGVhciB1cGRhdGUgbWFya2VyIGZvciB2b2x1bWUgJWQiLCB2b2xfaWQpOworCisJbWVtY3B5KCZ2dGJsX3JlYywgJnViaS0+dnRibFt2b2xfaWRdLCBzaXplb2Yoc3RydWN0IHViaV92dGJsX3JlY29yZCkpOworCXViaV9hc3NlcnQodm9sLT51cGRfbWFya2VyICYmIHZ0YmxfcmVjLnVwZF9tYXJrZXIpOworCXZ0YmxfcmVjLnVwZF9tYXJrZXIgPSAwOworCisJaWYgKHZvbC0+dm9sX3R5cGUgPT0gVUJJX1NUQVRJQ19WT0xVTUUpIHsKKwkJdm9sLT5jb3JydXB0ZWQgPSAwOworCQl2b2wtPnVzZWRfYnl0ZXMgPSB0bXAgPSBieXRlczsKKwkJdm9sLT5sYXN0X2ViX2J5dGVzID0gZG9fZGl2KHRtcCwgdm9sLT51c2FibGVfbGViX3NpemUpOworCQl2b2wtPnVzZWRfZWJzID0gdG1wOworCQlpZiAodm9sLT5sYXN0X2ViX2J5dGVzKQorCQkJdm9sLT51c2VkX2VicyArPSAxOworCQllbHNlCisJCQl2b2wtPmxhc3RfZWJfYnl0ZXMgPSB2b2wtPnVzYWJsZV9sZWJfc2l6ZTsKKwl9CisKKwllcnIgPSB1YmlfY2hhbmdlX3Z0YmxfcmVjb3JkKHViaSwgdm9sX2lkLCAmdnRibF9yZWMpOworCXZvbC0+dXBkX21hcmtlciA9IDA7CisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKiB1Ymlfc3RhcnRfdXBkYXRlIC0gc3RhcnQgdm9sdW1lIHVwZGF0ZS4KKyAqIEB1Ymk6IFVCSSBkZXZpY2UgZGVzY3JpcHRpb24gb2JqZWN0CisgKiBAdm9sX2lkOiB2b2x1bWUgSUQKKyAqIEBieXRlczogdXBkYXRlIGJ5dGVzCisgKgorICogVGhpcyBmdW5jdGlvbiBzdGFydHMgdm9sdW1lIHVwZGF0ZSBvcGVyYXRpb24uIElmIEBieXRlcyBpcyB6ZXJvLCB0aGUgdm9sdW1lCisgKiBpcyBqdXN0IHdpcGVkIG91dC4gUmV0dXJucyB6ZXJvIGluIGNhc2Ugb2Ygc3VjY2VzcyBhbmQgYSBuZWdhdGl2ZSBlcnJvciBjb2RlCisgKiBpbiBjYXNlIG9mIGZhaWx1cmUuCisgKi8KK2ludCB1Ymlfc3RhcnRfdXBkYXRlKHN0cnVjdCB1YmlfZGV2aWNlICp1YmksIGludCB2b2xfaWQsIGxvbmcgbG9uZyBieXRlcykKK3sKKwlpbnQgaSwgZXJyOworCXVpbnQ2NF90IHRtcDsKKwlzdHJ1Y3QgdWJpX3ZvbHVtZSAqdm9sID0gdWJpLT52b2x1bWVzW3ZvbF9pZF07CisKKwlkYmdfbXNnKCJzdGFydCB1cGRhdGUgb2Ygdm9sdW1lICVkLCAlbGx1IGJ5dGVzIiwgdm9sX2lkLCBieXRlcyk7CisJdm9sLT51cGRhdGluZyA9IDE7CisKKwllcnIgPSBzZXRfdXBkYXRlX21hcmtlcih1YmksIHZvbF9pZCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCS8qIEJlZm9yZSB1cGRhdGluZyAtIHdpcGUgb3V0IHRoZSB2b2x1bWUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgdm9sLT5yZXNlcnZlZF9wZWJzOyBpKyspIHsKKwkJZXJyID0gdWJpX2ViYV91bm1hcF9sZWIodWJpLCB2b2xfaWQsIGkpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwlpZiAoYnl0ZXMgPT0gMCkgeworCQllcnIgPSBjbGVhcl91cGRhdGVfbWFya2VyKHViaSwgdm9sX2lkLCAwKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJCWVyciA9IHViaV93bF9mbHVzaCh1YmkpOworCQlpZiAoIWVycikKKwkJCXZvbC0+dXBkYXRpbmcgPSAwOworCX0KKworCXZvbC0+dXBkX2J1ZiA9IGttYWxsb2ModWJpLT5sZWJfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF2b2wtPnVwZF9idWYpCisJCXJldHVybiAtRU5PTUVNOworCisJdG1wID0gYnl0ZXM7CisJdm9sLT51cGRfZWJzID0gISFkb19kaXYodG1wLCB2b2wtPnVzYWJsZV9sZWJfc2l6ZSk7CisJdm9sLT51cGRfZWJzICs9IHRtcDsKKwl2b2wtPnVwZF9ieXRlcyA9IGJ5dGVzOworCXZvbC0+dXBkX3JlY2VpdmVkID0gMDsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB3cml0ZV9sZWIgLSB3cml0ZSB1cGRhdGUgZGF0YS4KKyAqIEB1Ymk6IFVCSSBkZXZpY2UgZGVzY3JpcHRpb24gb2JqZWN0CisgKiBAdm9sX2lkOiB2b2x1bWUgSUQKKyAqIEBsbnVtOiBsb2dpY2FsIGVyYXNlYmxvY2sgbnVtYmVyCisgKiBAYnVmOiBkYXRhIHRvIHdyaXRlCisgKiBAbGVuOiBkYXRhIHNpemUKKyAqIEB1c2VkX2ViczogaG93IG1hbnkgbG9naWNhbCBlcmFzZWJsb2NrcyB3aWxsIHRoaXMgdm9sdW1lIGNvbnRhaW4gKHN0YXRpYworICogdm9sdW1lcyBvbmx5KQorICoKKyAqIFRoaXMgZnVuY3Rpb24gd3JpdGVzIHVwZGF0ZSBkYXRhIHRvIGNvcnJlc3BvbmRpbmcgbG9naWNhbCBlcmFzZWJsb2NrLiBJbgorICogY2FzZSBvZiBkeW5hbWljIHZvbHVtZSwgdGhpcyBmdW5jdGlvbiBjaGVja3MgaWYgdGhlIGRhdGEgY29udGFpbnMgMHhGRiBieXRlcworICogYXQgdGhlIGVuZC4gSWYgeWVzLCB0aGUgMHhGRiBieXRlcyBhcmUgY3V0IGFuZCBub3Qgd3JpdHRlbi4gU28gaWYgdGhlIHdob2xlCisgKiBidWZmZXIgY29udGFpbnMgb25seSAweEZGIGJ5dGVzLCB0aGUgTEVCIGlzIGxlZnQgdW5tYXBwZWQuCisgKgorICogVGhlIHJlYXNvbiB3aHkgd2Ugc2tpcCB0aGUgdHJhaWxpbmcgMHhGRiBieXRlcyBpbiBjYXNlIG9mIGR5bmFtaWMgdm9sdW1lIGlzCisgKiB0aGF0IHdlIHdhbnQgdG8gbWFrZSBzdXJlIHRoYXQgbW9yZSBkYXRhIG1heSBiZSBhcHBlbmRlZCB0byB0aGUgbG9naWNhbAorICogZXJhc2VibG9jayBpbiBmdXR1cmUuIEluZGVlZCwgd3JpdGluZyAweEZGIGJ5dGVzIG1heSBoYXZlIHNpZGUgZWZmZWN0cyBhbmQKKyAqIHRoaXMgUEVCIHdvbid0IGJlIHdyaXRhYmxlIGFueW1vcmUuIFNvIGlmIG9uZSB3cml0ZXMgdGhlIGZpbGUtc3lzdGVtIGltYWdlCisgKiB0byB0aGUgVUJJIHZvbHVtZSB3aGVyZSAweEZGcyBtZWFuIGZyZWUgc3BhY2UgLSBVQkkgbWFrZXMgc3VyZSB0aGlzIGZyZWUKKyAqIHNwYWNlIGlzIHdyaXRhYmxlIGFmdGVyIHRoZSB1cGRhdGUuCisgKgorICogV2UgZG8gbm90IGRvIHRoaXMgZm9yIHN0YXRpYyB2b2x1bWVzIGJlY2F1c2UgdGhleSBhcmUgcmVhZC1vbmx5LiBCdXQgdGhpcworICogYWxzbyBjYW5ub3QgYmUgZG9uZSBiZWNhdXNlIHdlIGhhdmUgdG8gc3RvcmUgcGVyLUxFQiBDUkMgYW5kIHRoZSBjb3JyZWN0CisgKiBkYXRhIGxlbmd0aC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgemVybyBpbiBjYXNlIG9mIHN1Y2Nlc3MgYW5kIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBpbgorICogY2FzZSBvZiBmYWlsdXJlLgorICovCitzdGF0aWMgaW50IHdyaXRlX2xlYihzdHJ1Y3QgdWJpX2RldmljZSAqdWJpLCBpbnQgdm9sX2lkLCBpbnQgbG51bSwgdm9pZCAqYnVmLAorCQkgICAgIGludCBsZW4sIGludCB1c2VkX2VicykKK3sKKwlpbnQgZXJyLCBsOworCXN0cnVjdCB1Ymlfdm9sdW1lICp2b2wgPSB1YmktPnZvbHVtZXNbdm9sX2lkXTsKKworCWlmICh2b2wtPnZvbF90eXBlID09IFVCSV9EWU5BTUlDX1ZPTFVNRSkgeworCQlsID0gQUxJR04obGVuLCB1YmktPm1pbl9pb19zaXplKTsKKwkJbWVtc2V0KGJ1ZiArIGxlbiwgMHhGRiwgbCAtIGxlbik7CisKKwkJbCA9IHViaV9jYWxjX2RhdGFfbGVuKHViaSwgYnVmLCBsKTsKKwkJaWYgKGwgPT0gMCkgeworCQkJZGJnX21zZygiYWxsICVkIGJ5dGVzIGNvbnRhaW4gMHhGRiAtIHNraXAiLCBsZW4pOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKGxlbiAhPSBsKQorCQkJZGJnX21zZygic2tpcCBsYXN0ICVkIGJ5dGVzICgweEZGKSIsIGxlbiAtIGwpOworCisJCWVyciA9IHViaV9lYmFfd3JpdGVfbGViKHViaSwgdm9sX2lkLCBsbnVtLCBidWYsIDAsIGwsCisJCQkJCVVCSV9VTktOT1dOKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBXaGVuIHdyaXRpbmcgc3RhdGljIHZvbHVtZSwgYW5kIHRoaXMgaXMgdGhlIGxhc3QgbG9naWNhbAorCQkgKiBlcmFzZWJsb2NrLCB0aGUgbGVuZ3RoIChAbGVuKSBkb2VzIG5vdCBoYXZlIHRvIGJlIGFsaWduZWQgdG8KKwkJICogdGhlIG1pbmltYWwgZmxhc2ggSS9PIHVuaXQuIFRoZSAndWJpX2ViYV93cml0ZV9sZWJfc3QoKScKKwkJICogZnVuY3Rpb24gYWNjZXB0cyBleGFjdCAodW5hbGlnbmVkKSBsZW5ndGggYW5kIHN0b3JlcyBpdCBpbgorCQkgKiB0aGUgVklEIGhlYWRlci4gQW5kIGl0IHRha2VzIGNhcmUgb2YgcHJvcGVyIGFsaWdubWVudCBieQorCQkgKiBwYWRkaW5nIHRoZSBidWZmZXIuIEhlcmUgd2UganVzdCBtYWtlIHN1cmUgdGhlIHBhZGRpbmcgd2lsbAorCQkgKiBjb250YWluIHplcm9zLCBub3QgcmFuZG9tIHRyYXNoLgorCQkgKi8KKwkJbWVtc2V0KGJ1ZiArIGxlbiwgMCwgdm9sLT51c2FibGVfbGViX3NpemUgLSBsZW4pOworCQllcnIgPSB1YmlfZWJhX3dyaXRlX2xlYl9zdCh1YmksIHZvbF9pZCwgbG51bSwgYnVmLCBsZW4sCisJCQkJCSAgIFVCSV9VTktOT1dOLCB1c2VkX2Vicyk7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKiB1YmlfbW9yZV91cGRhdGVfZGF0YSAtIHdyaXRlIG1vcmUgdXBkYXRlIGRhdGEuCisgKiBAdm9sOiB2b2x1bWUgZGVzY3JpcHRpb24gb2JqZWN0CisgKiBAYnVmOiB3cml0ZSBkYXRhICh1c2VyLXNwYWNlIG1lbW9yeSBidWZmZXIpCisgKiBAY291bnQ6IGhvdyBtdWNoIGJ5dGVzIHRvIHdyaXRlCisgKgorICogVGhpcyBmdW5jdGlvbiB3cml0ZXMgbW9yZSBkYXRhIHRvIHRoZSB2b2x1bWUgd2hpY2ggaXMgYmVpbmcgdXBkYXRlZC4gSXQgbWF5CisgKiBiZSBjYWxsZWQgYXJiaXRyYXJ5IG51bWJlciBvZiB0aW1lcyB1bnRpbCBhbGwgb2YgdGhlIHVwZGF0ZSBkYXRhIGFycml2ZS4KKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyAlMCBpbiBjYXNlIG9mIHN1Y2Nlc3MsIG51bWJlciBvZiBieXRlcyB3cml0dGVuIGR1cmluZworICogdGhlIGxhc3QgY2FsbCBpZiB0aGUgd2hvbGUgdm9sdW1lIHVwZGF0ZSB3YXMgc3VjY2Vzc2Z1bGx5IGZpbmlzaGVkLCBhbmQgYQorICogbmVnYXRpdmUgZXJyb3IgY29kZSBpbiBjYXNlIG9mIGZhaWx1cmUuCisgKi8KK2ludCB1YmlfbW9yZV91cGRhdGVfZGF0YShzdHJ1Y3QgdWJpX2RldmljZSAqdWJpLCBpbnQgdm9sX2lkLAorCQkJIGNvbnN0IHZvaWQgX191c2VyICpidWYsIGludCBjb3VudCkKK3sKKwl1aW50NjRfdCB0bXA7CisJc3RydWN0IHViaV92b2x1bWUgKnZvbCA9IHViaS0+dm9sdW1lc1t2b2xfaWRdOworCWludCBsbnVtLCBvZmZzLCBlcnIgPSAwLCBsZW4sIHRvX3dyaXRlID0gY291bnQ7CisKKwlkYmdfbXNnKCJ3cml0ZSAlZCBvZiAlbGxkIGJ5dGVzLCAlbGxkIGFscmVhZHkgcGFzc2VkIiwKKwkJY291bnQsIHZvbC0+dXBkX2J5dGVzLCB2b2wtPnVwZF9yZWNlaXZlZCk7CisKKwlpZiAodWJpLT5yb19tb2RlKQorCQlyZXR1cm4gLUVST0ZTOworCisJdG1wID0gdm9sLT51cGRfcmVjZWl2ZWQ7CisJb2ZmcyA9IGRvX2Rpdih0bXAsIHZvbC0+dXNhYmxlX2xlYl9zaXplKTsKKwlsbnVtID0gdG1wOworCisJaWYgKHZvbC0+dXBkX3JlY2VpdmVkICsgY291bnQgPiB2b2wtPnVwZF9ieXRlcykKKwkJdG9fd3JpdGUgPSBjb3VudCA9IHZvbC0+dXBkX2J5dGVzIC0gdm9sLT51cGRfcmVjZWl2ZWQ7CisKKwkvKgorCSAqIFdoZW4gdXBkYXRpbmcgdm9sdW1lcywgd2UgYWNjdW11bGF0ZSB3aG9sZSBsb2dpY2FsIGVyYXNlYmxvY2sgb2YKKwkgKiBkYXRhIGFuZCB3cml0ZSBpdCBhdCBvbmNlLgorCSAqLworCWlmIChvZmZzICE9IDApIHsKKwkJLyoKKwkJICogVGhpcyBpcyBhIHdyaXRlIHRvIHRoZSBtaWRkbGUgb2YgdGhlIGxvZ2ljYWwgZXJhc2VibG9jay4gV2UKKwkJICogY29weSB0aGUgZGF0YSB0byBvdXIgdXBkYXRlIGJ1ZmZlciBhbmQgd2FpdCBmb3IgbW9yZSBkYXRhIG9yCisJCSAqIGZsdXNoIGl0IGlmIHRoZSB3aG9sZSBlcmFzZWJsb2NrIGlzIHdyaXR0ZW4gb3IgdGhlIHVwZGF0ZQorCQkgKiBpcyBmaW5pc2hlZC4KKwkJICovCisKKwkJbGVuID0gdm9sLT51c2FibGVfbGViX3NpemUgLSBvZmZzOworCQlpZiAobGVuID4gY291bnQpCisJCQlsZW4gPSBjb3VudDsKKworCQllcnIgPSBjb3B5X2Zyb21fdXNlcih2b2wtPnVwZF9idWYgKyBvZmZzLCBidWYsIGxlbik7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAob2ZmcyArIGxlbiA9PSB2b2wtPnVzYWJsZV9sZWJfc2l6ZSB8fAorCQkgICAgdm9sLT51cGRfcmVjZWl2ZWQgKyBsZW4gPT0gdm9sLT51cGRfYnl0ZXMpIHsKKwkJCWludCBmbHVzaF9sZW4gPSBvZmZzICsgbGVuOworCisJCQkvKgorCQkJICogT0ssIHdlIGdhdGhlcmVkIGVpdGhlciB0aGUgd2hvbGUgZXJhc2VibG9jayBvciB0aGlzCisJCQkgKiBpcyB0aGUgbGFzdCBjaHVuaywgaXQncyB0aW1lIHRvIGZsdXNoIHRoZSBidWZmZXIuCisJCQkgKi8KKwkJCXViaV9hc3NlcnQoZmx1c2hfbGVuIDw9IHZvbC0+dXNhYmxlX2xlYl9zaXplKTsKKwkJCWVyciA9IHdyaXRlX2xlYih1YmksIHZvbF9pZCwgbG51bSwgdm9sLT51cGRfYnVmLAorCQkJCQlmbHVzaF9sZW4sIHZvbC0+dXBkX2Vicyk7CisJCQlpZiAoZXJyKQorCQkJCXJldHVybiBlcnI7CisJCX0KKworCQl2b2wtPnVwZF9yZWNlaXZlZCArPSBsZW47CisJCWNvdW50IC09IGxlbjsKKwkJYnVmICs9IGxlbjsKKwkJbG51bSArPSAxOworCX0KKworCS8qCisJICogSWYgd2UndmUgZ290IG1vcmUgdG8gd3JpdGUsIGxldCdzIGNvbnRpbnVlLiBBdCB0aGlzIHBvaW50IHdlIGtub3cgd2UKKwkgKiBhcmUgc3RhcnRpbmcgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIGFuIGVyYXNlYmxvY2suCisJICovCisJd2hpbGUgKGNvdW50KSB7CisJCWlmIChjb3VudCA+IHZvbC0+dXNhYmxlX2xlYl9zaXplKQorCQkJbGVuID0gdm9sLT51c2FibGVfbGViX3NpemU7CisJCWVsc2UKKwkJCWxlbiA9IGNvdW50OworCisJCWVyciA9IGNvcHlfZnJvbV91c2VyKHZvbC0+dXBkX2J1ZiwgYnVmLCBsZW4pOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJaWYgKGxlbiA9PSB2b2wtPnVzYWJsZV9sZWJfc2l6ZSB8fAorCQkgICAgdm9sLT51cGRfcmVjZWl2ZWQgKyBsZW4gPT0gdm9sLT51cGRfYnl0ZXMpIHsKKwkJCWVyciA9IHdyaXRlX2xlYih1YmksIHZvbF9pZCwgbG51bSwgdm9sLT51cGRfYnVmLCBsZW4sCisJCQkJCXZvbC0+dXBkX2Vicyk7CisJCQlpZiAoZXJyKQorCQkJCWJyZWFrOworCQl9CisKKwkJdm9sLT51cGRfcmVjZWl2ZWQgKz0gbGVuOworCQljb3VudCAtPSBsZW47CisJCWxudW0gKz0gMTsKKwkJYnVmICs9IGxlbjsKKwl9CisKKwl1YmlfYXNzZXJ0KHZvbC0+dXBkX3JlY2VpdmVkIDw9IHZvbC0+dXBkX2J5dGVzKTsKKwlpZiAodm9sLT51cGRfcmVjZWl2ZWQgPT0gdm9sLT51cGRfYnl0ZXMpIHsKKwkJLyogVGhlIHVwZGF0ZSBpcyBmaW5pc2hlZCwgY2xlYXIgdGhlIHVwZGF0ZSBtYXJrZXIgKi8KKwkJZXJyID0gY2xlYXJfdXBkYXRlX21hcmtlcih1YmksIHZvbF9pZCwgdm9sLT51cGRfYnl0ZXMpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwkJZXJyID0gdWJpX3dsX2ZsdXNoKHViaSk7CisJCWlmIChlcnIgPT0gMCkgeworCQkJZXJyID0gdG9fd3JpdGU7CisJCQlrZnJlZSh2b2wtPnVwZF9idWYpOworCQkJdm9sLT51cGRhdGluZyA9IDA7CisJCX0KKwl9CisKKwlyZXR1cm4gZXJyOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvdWJpL3ZtdC5jIGIvZHJpdmVycy9tdGQvdWJpL3ZtdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyMmQwZDEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL210ZC91Ymkvdm10LmMKQEAgLTAsMCArMSw4MDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4sIDIwMDYKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZQorICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqIEF1dGhvcjogQXJ0ZW0gQml0eXV0c2tpeSAo0JHQuNGC0Y7RhtC60LjQuSDQkNGA0YLRkdC8KQorICovCisKKy8qCisgKiBUaGlzIGZpbGUgY29udGFpbnMgaW1wbGVtZW50YXRpb24gb2Ygdm9sdW1lIGNyZWF0aW9uLCBkZWxldGlvbiwgdXBkYXRpbmcgYW5kCisgKiByZXNpemluZy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CisjaW5jbHVkZSAidWJpLmgiCisKKyNpZmRlZiBDT05GSUdfTVREX1VCSV9ERUJVR19QQVJBTk9JRAorc3RhdGljIHZvaWQgcGFyYW5vaWRfY2hlY2tfdm9sdW1lcyhzdHJ1Y3QgdWJpX2RldmljZSAqdWJpKTsKKyNlbHNlCisjZGVmaW5lIHBhcmFub2lkX2NoZWNrX3ZvbHVtZXModWJpKQorI2VuZGlmCisKK3N0YXRpYyBzc2l6ZV90IHZvbF9hdHRyaWJ1dGVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKTsKKworLyogRGV2aWNlIGF0dHJpYnV0ZXMgY29ycmVzcG9uZGluZyB0byBmaWxlcyBpbiAnLzxzeXNmcz4vY2xhc3MvdWJpL3ViaVhfWScgKi8KK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSB2b2xfcmVzZXJ2ZWRfZWJzID0KKwlfX0FUVFIocmVzZXJ2ZWRfZWJzLCBTX0lSVUdPLCB2b2xfYXR0cmlidXRlX3Nob3csIE5VTEwpOworc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIHZvbF90eXBlID0KKwlfX0FUVFIodHlwZSwgU19JUlVHTywgdm9sX2F0dHJpYnV0ZV9zaG93LCBOVUxMKTsKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSB2b2xfbmFtZSA9CisJX19BVFRSKG5hbWUsIFNfSVJVR08sIHZvbF9hdHRyaWJ1dGVfc2hvdywgTlVMTCk7CitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgdm9sX2NvcnJ1cHRlZCA9CisJX19BVFRSKGNvcnJ1cHRlZCwgU19JUlVHTywgdm9sX2F0dHJpYnV0ZV9zaG93LCBOVUxMKTsKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSB2b2xfYWxpZ25tZW50ID0KKwlfX0FUVFIoYWxpZ25tZW50LCBTX0lSVUdPLCB2b2xfYXR0cmlidXRlX3Nob3csIE5VTEwpOworc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIHZvbF91c2FibGVfZWJfc2l6ZSA9CisJX19BVFRSKHVzYWJsZV9lYl9zaXplLCBTX0lSVUdPLCB2b2xfYXR0cmlidXRlX3Nob3csIE5VTEwpOworc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIHZvbF9kYXRhX2J5dGVzID0KKwlfX0FUVFIoZGF0YV9ieXRlcywgU19JUlVHTywgdm9sX2F0dHJpYnV0ZV9zaG93LCBOVUxMKTsKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSB2b2xfdXBkX21hcmtlciA9CisJX19BVFRSKHVwZF9tYXJrZXIsIFNfSVJVR08sIHZvbF9hdHRyaWJ1dGVfc2hvdywgTlVMTCk7CisKKy8qCisgKiAiU2hvdyIgbWV0aG9kIGZvciBmaWxlcyBpbiAnLzxzeXNmcz4vY2xhc3MvdWJpL3ViaVhfWS8nLgorICoKKyAqIENvbnNpZGVyIGEgc2l0dWF0aW9uOgorICogQS4gcHJvY2VzcyAxIG9wZW5zIGEgc3lzZnMgZmlsZSByZWxhdGVkIHRvIHZvbHVtZSBZLCBzYXkKKyAqICAgIC88c3lzZnM+L2NsYXNzL3ViaS91YmlYX1kvcmVzZXJ2ZWRfZWJzOworICogQi4gcHJvY2VzcyAyIHJlbW92ZXMgdm9sdW1lIFk7CisgKiBDLiBwcm9jZXNzIDEgc3RhcnRzIHJlYWRpbmcgdGhlIC88c3lzZnM+L2NsYXNzL3ViaS91YmlYX1kvcmVzZXJ2ZWRfZWJzIGZpbGU7CisgKgorICogV2hhdCB3ZSB3YW50IHRvIGRvIGluIGEgc2l0dWF0aW9uIGxpa2UgdGhhdCBpcyB0byByZXR1cm4gZXJyb3Igd2hlbiB0aGUgZmlsZQorICogaXMgcmVhZC4gVGhpcyBpcyBkb25lIGJ5IG1lYW5zIG9mIHRoZSAncmVtb3ZlZCcgZmxhZyBhbmQgdGhlICd2b2xfbG9jaycgb2YKKyAqIHRoZSBVQkkgdm9sdW1lIGRlc2NyaXB0aW9uIG9iamVjdC4KKyAqLworc3RhdGljIHNzaXplX3Qgdm9sX2F0dHJpYnV0ZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgdWJpX3ZvbHVtZSAqdm9sID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IHViaV92b2x1bWUsIGRldik7CisKKwlzcGluX2xvY2soJnZvbC0+dWJpLT52b2x1bWVzX2xvY2spOworCWlmICh2b2wtPnJlbW92ZWQpIHsKKwkJc3Bpbl91bmxvY2soJnZvbC0+dWJpLT52b2x1bWVzX2xvY2spOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJaWYgKGF0dHIgPT0gJnZvbF9yZXNlcnZlZF9lYnMpCisJCXJldCA9IHNwcmludGYoYnVmLCAiJWRcbiIsIHZvbC0+cmVzZXJ2ZWRfcGVicyk7CisJZWxzZSBpZiAoYXR0ciA9PSAmdm9sX3R5cGUpIHsKKwkJY29uc3QgY2hhciAqdHA7CisJCXRwID0gdm9sLT52b2xfdHlwZSA9PSBVQklfRFlOQU1JQ19WT0xVTUUgPyAiZHluYW1pYyIgOiAic3RhdGljIjsKKwkJcmV0ID0gc3ByaW50ZihidWYsICIlc1xuIiwgdHApOworCX0gZWxzZSBpZiAoYXR0ciA9PSAmdm9sX25hbWUpCisJCXJldCA9IHNwcmludGYoYnVmLCAiJXNcbiIsIHZvbC0+bmFtZSk7CisJZWxzZSBpZiAoYXR0ciA9PSAmdm9sX2NvcnJ1cHRlZCkKKwkJcmV0ID0gc3ByaW50ZihidWYsICIlZFxuIiwgdm9sLT5jb3JydXB0ZWQpOworCWVsc2UgaWYgKGF0dHIgPT0gJnZvbF9hbGlnbm1lbnQpCisJCXJldCA9IHNwcmludGYoYnVmLCAiJWRcbiIsIHZvbC0+YWxpZ25tZW50KTsKKwllbHNlIGlmIChhdHRyID09ICZ2b2xfdXNhYmxlX2ViX3NpemUpIHsKKwkJcmV0ID0gc3ByaW50ZihidWYsICIlZFxuIiwgdm9sLT51c2FibGVfbGViX3NpemUpOworCX0gZWxzZSBpZiAoYXR0ciA9PSAmdm9sX2RhdGFfYnl0ZXMpCisJCXJldCA9IHNwcmludGYoYnVmLCAiJWxsZFxuIiwgdm9sLT51c2VkX2J5dGVzKTsKKwllbHNlIGlmIChhdHRyID09ICZ2b2xfdXBkX21hcmtlcikKKwkJcmV0ID0gc3ByaW50ZihidWYsICIlZFxuIiwgdm9sLT51cGRfbWFya2VyKTsKKwllbHNlCisJCUJVRygpOworCXNwaW5fdW5sb2NrKCZ2b2wtPnViaS0+dm9sdW1lc19sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBSZWxlYXNlIG1ldGhvZCBmb3Igdm9sdW1lIGRldmljZXMgKi8KK3N0YXRpYyB2b2lkIHZvbF9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdWJpX3ZvbHVtZSAqdm9sID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IHViaV92b2x1bWUsIGRldik7CisJdWJpX2Fzc2VydCh2b2wtPnJlbW92ZWQpOworCWtmcmVlKHZvbCk7Cit9CisKKy8qKgorICogdm9sdW1lX3N5c2ZzX2luaXQgLSBpbml0aWFsaXplIHN5c2ZzIGZvciBuZXcgdm9sdW1lLgorICogQHViaTogVUJJIGRldmljZSBkZXNjcmlwdGlvbiBvYmplY3QKKyAqIEB2b2w6IHZvbHVtZSBkZXNjcmlwdGlvbiBvYmplY3QKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgemVybyBpbiBjYXNlIG9mIHN1Y2Nlc3MgYW5kIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBpbgorICogY2FzZSBvZiBmYWlsdXJlLgorICoKKyAqIE5vdGUsIHRoaXMgZnVuY3Rpb24gZG9lcyBub3QgZnJlZSBhbGxvY2F0ZWQgcmVzb3VyY2VzIGluIGNhc2Ugb2YgZmFpbHVyZSAtCisgKiB0aGUgY2FsbGVyIGRvZXMgaXQuIFRoaXMgaXMgYmVjYXVzZSB0aGlzIHdvdWxkIGNhdXNlIHJlbGVhc2UoKSBoZXJlIGFuZCB0aGUKKyAqIGNhbGxlciB3b3VsZCBvb3BzLgorICovCitzdGF0aWMgaW50IHZvbHVtZV9zeXNmc19pbml0KHN0cnVjdCB1YmlfZGV2aWNlICp1YmksIHN0cnVjdCB1Ymlfdm9sdW1lICp2b2wpCit7CisJaW50IGVycjsKKworCWVyciA9IGRldmljZV9jcmVhdGVfZmlsZSgmdm9sLT5kZXYsICZ2b2xfcmVzZXJ2ZWRfZWJzKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCWVyciA9IGRldmljZV9jcmVhdGVfZmlsZSgmdm9sLT5kZXYsICZ2b2xfdHlwZSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwllcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnZvbC0+ZGV2LCAmdm9sX25hbWUpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZ2b2wtPmRldiwgJnZvbF9jb3JydXB0ZWQpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZ2b2wtPmRldiwgJnZvbF9hbGlnbm1lbnQpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZ2b2wtPmRldiwgJnZvbF91c2FibGVfZWJfc2l6ZSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwllcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnZvbC0+ZGV2LCAmdm9sX2RhdGFfYnl0ZXMpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZ2b2wtPmRldiwgJnZvbF91cGRfbWFya2VyKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCXJldHVybiAwOworfQorCisvKioKKyAqIHZvbHVtZV9zeXNmc19jbG9zZSAtIGNsb3NlIHN5c2ZzIGZvciBhIHZvbHVtZS4KKyAqIEB2b2w6IHZvbHVtZSBkZXNjcmlwdGlvbiBvYmplY3QKKyAqLworc3RhdGljIHZvaWQgdm9sdW1lX3N5c2ZzX2Nsb3NlKHN0cnVjdCB1Ymlfdm9sdW1lICp2b2wpCit7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZ2b2wtPmRldiwgJnZvbF91cGRfbWFya2VyKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnZvbC0+ZGV2LCAmdm9sX2RhdGFfYnl0ZXMpOworCWRldmljZV9yZW1vdmVfZmlsZSgmdm9sLT5kZXYsICZ2b2xfdXNhYmxlX2ViX3NpemUpOworCWRldmljZV9yZW1vdmVfZmlsZSgmdm9sLT5kZXYsICZ2b2xfYWxpZ25tZW50KTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnZvbC0+ZGV2LCAmdm9sX2NvcnJ1cHRlZCk7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZ2b2wtPmRldiwgJnZvbF9uYW1lKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnZvbC0+ZGV2LCAmdm9sX3R5cGUpOworCWRldmljZV9yZW1vdmVfZmlsZSgmdm9sLT5kZXYsICZ2b2xfcmVzZXJ2ZWRfZWJzKTsKKwlkZXZpY2VfdW5yZWdpc3Rlcigmdm9sLT5kZXYpOworfQorCisvKioKKyAqIHViaV9jcmVhdGVfdm9sdW1lIC0gY3JlYXRlIHZvbHVtZS4KKyAqIEB1Ymk6IFVCSSBkZXZpY2UgZGVzY3JpcHRpb24gb2JqZWN0CisgKiBAcmVxOiB2b2x1bWUgY3JlYXRpb24gcmVxdWVzdAorICoKKyAqIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyB2b2x1bWUgZGVzY3JpYmVkIGJ5IEByZXEuIElmIEByZXEtPnZvbF9pZCBpZAorICogJVVCSV9WT0xfTlVNX0FVVE8sIHRoaXMgZnVuY3Rpb24gYXV0b21hdGljYWxseSBhc3NpZ25lIElEIHRvIHRoZSBuZXcgdm9sdW1lCisgKiBhbmQgc2F2ZXMgaXQgaW4gQHJlcS0+dm9sX2lkLiBSZXR1cm5zIHplcm8gaW4gY2FzZSBvZiBzdWNjZXNzIGFuZCBhIG5lZ2F0aXZlCisgKiBlcnJvciBjb2RlIGluIGNhc2Ugb2YgZmFpbHVyZS4KKyAqLworaW50IHViaV9jcmVhdGVfdm9sdW1lKHN0cnVjdCB1YmlfZGV2aWNlICp1YmksIHN0cnVjdCB1YmlfbWt2b2xfcmVxICpyZXEpCit7CisJaW50IGksIGVyciwgdm9sX2lkID0gcmVxLT52b2xfaWQ7CisJc3RydWN0IHViaV92b2x1bWUgKnZvbDsKKwlzdHJ1Y3QgdWJpX3Z0YmxfcmVjb3JkIHZ0YmxfcmVjOworCXVpbnQ2NF90IGJ5dGVzOworCisJaWYgKHViaS0+cm9fbW9kZSkKKwkJcmV0dXJuIC1FUk9GUzsKKworCXZvbCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB1Ymlfdm9sdW1lKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF2b2wpCisJCXJldHVybiAtRU5PTUVNOworCisJc3Bpbl9sb2NrKCZ1YmktPnZvbHVtZXNfbG9jayk7CisKKwlpZiAodm9sX2lkID09IFVCSV9WT0xfTlVNX0FVVE8pIHsKKwkJLyogRmluZCB1bnVzZWQgdm9sdW1lIElEICovCisJCWRiZ19tc2coInNlYXJjaCBmb3IgdmFjYW50IHZvbHVtZSBJRCIpOworCQlmb3IgKGkgPSAwOyBpIDwgdWJpLT52dGJsX3Nsb3RzOyBpKyspCisJCQlpZiAoIXViaS0+dm9sdW1lc1tpXSkgeworCQkJCXZvbF9pZCA9IGk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJaWYgKHZvbF9pZCA9PSBVQklfVk9MX05VTV9BVVRPKSB7CisJCQlkYmdfZXJyKCJvdXQgb2Ygdm9sdW1lIElEcyIpOworCQkJZXJyID0gLUVORklMRTsKKwkJCWdvdG8gb3V0X3VubG9jazsKKwkJfQorCQlyZXEtPnZvbF9pZCA9IHZvbF9pZDsKKwl9CisKKwlkYmdfbXNnKCJ2b2x1bWUgSUQgJWQsICVsbHUgYnl0ZXMsIHR5cGUgJWQsIG5hbWUgJXMiLAorCQl2b2xfaWQsICh1bnNpZ25lZCBsb25nIGxvbmcpcmVxLT5ieXRlcywKKwkJKGludClyZXEtPnZvbF90eXBlLCByZXEtPm5hbWUpOworCisJLyogRW5zdXJlIHRoYXQgdGhpcyB2b2x1bWUgZG9lcyBub3QgZXhpc3QgKi8KKwllcnIgPSAtRUVYSVNUOworCWlmICh1YmktPnZvbHVtZXNbdm9sX2lkXSkgeworCQlkYmdfZXJyKCJ2b2x1bWUgJWQgYWxyZWFkeSBleGlzdHMiLCB2b2xfaWQpOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJLyogRW5zdXJlIHRoYXQgdGhlIG5hbWUgaXMgdW5pcXVlICovCisJZm9yIChpID0gMDsgaSA8IHViaS0+dnRibF9zbG90czsgaSsrKQorCQlpZiAodWJpLT52b2x1bWVzW2ldICYmCisJCSAgICB1YmktPnZvbHVtZXNbaV0tPm5hbWVfbGVuID09IHJlcS0+bmFtZV9sZW4gJiYKKwkJICAgIHN0cmNtcCh1YmktPnZvbHVtZXNbaV0tPm5hbWUsIHJlcS0+bmFtZSkgPT0gMCkgeworCQkJZGJnX2Vycigidm9sdW1lIFwiJXNcIiBleGlzdHMgKElEICVkKSIsIHJlcS0+bmFtZSwgaSk7CisJCQlnb3RvIG91dF91bmxvY2s7CisJCX0KKworICAgICAgICAvKiBDYWxjdWxhdGUgaG93IG1hbnkgZXJhc2VibG9ja3MgYXJlIHJlcXVlc3RlZCAqLworCXZvbC0+dXNhYmxlX2xlYl9zaXplID0gdWJpLT5sZWJfc2l6ZSAtIHViaS0+bGViX3NpemUgJSByZXEtPmFsaWdubWVudDsKKwlieXRlcyA9IHJlcS0+Ynl0ZXM7CisJaWYgKGRvX2RpdihieXRlcywgdm9sLT51c2FibGVfbGViX3NpemUpKQorCQl2b2wtPnJlc2VydmVkX3BlYnMgPSAxOworCXZvbC0+cmVzZXJ2ZWRfcGVicyArPSBieXRlczsKKworCS8qIFJlc2VydmUgcGh5c2ljYWwgZXJhc2VibG9ja3MgKi8KKwlpZiAodm9sLT5yZXNlcnZlZF9wZWJzID4gdWJpLT5hdmFpbF9wZWJzKSB7CisJCWRiZ19lcnIoIm5vdCBlbm91Z2ggUEVCcywgb25seSAlZCBhdmFpbGFibGUiLCB1YmktPmF2YWlsX3BlYnMpOworCQlzcGluX3VubG9jaygmdWJpLT52b2x1bWVzX2xvY2spOworCQllcnIgPSAtRU5PU1BDOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCXViaS0+YXZhaWxfcGVicyAtPSB2b2wtPnJlc2VydmVkX3BlYnM7CisJdWJpLT5yc3ZkX3BlYnMgKz0gdm9sLT5yZXNlcnZlZF9wZWJzOworCisJdm9sLT52b2xfaWQgICAgPSB2b2xfaWQ7CisJdm9sLT5hbGlnbm1lbnQgPSByZXEtPmFsaWdubWVudDsKKwl2b2wtPmRhdGFfcGFkICA9IHViaS0+bGViX3NpemUgJSB2b2wtPmFsaWdubWVudDsKKwl2b2wtPnZvbF90eXBlICA9IHJlcS0+dm9sX3R5cGU7CisJdm9sLT5uYW1lX2xlbiAgPSByZXEtPm5hbWVfbGVuOworCW1lbWNweSh2b2wtPm5hbWUsIHJlcS0+bmFtZSwgdm9sLT5uYW1lX2xlbiArIDEpOworCXZvbC0+ZXhjbHVzaXZlID0gMTsKKwl2b2wtPnViaSA9IHViaTsKKwl1YmktPnZvbHVtZXNbdm9sX2lkXSA9IHZvbDsKKwlzcGluX3VubG9jaygmdWJpLT52b2x1bWVzX2xvY2spOworCisJLyoKKwkgKiBGaW5pc2ggYWxsIHBlbmRpbmcgZXJhc2VzIGJlY2F1c2UgdGhlcmUgbWF5IGJlIHNvbWUgTEVCcyBiZWxvbmdpbmcKKwkgKiB0byB0aGUgc2FtZSB2b2x1bWUgSUQuCisJICovCisJZXJyID0gdWJpX3dsX2ZsdXNoKHViaSk7CisJaWYgKGVycikKKwkJZ290byBvdXRfYWNjOworCisJdm9sLT5lYmFfdGJsID0ga21hbGxvYyh2b2wtPnJlc2VydmVkX3BlYnMgKiBzaXplb2YoaW50KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF2b2wtPmViYV90YmwpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBvdXRfYWNjOworCX0KKworCWZvciAoaSA9IDA7IGkgPCB2b2wtPnJlc2VydmVkX3BlYnM7IGkrKykKKwkJdm9sLT5lYmFfdGJsW2ldID0gVUJJX0xFQl9VTk1BUFBFRDsKKworCWlmICh2b2wtPnZvbF90eXBlID09IFVCSV9EWU5BTUlDX1ZPTFVNRSkgeworCQl2b2wtPnVzZWRfZWJzID0gdm9sLT5yZXNlcnZlZF9wZWJzOworCQl2b2wtPmxhc3RfZWJfYnl0ZXMgPSB2b2wtPnVzYWJsZV9sZWJfc2l6ZTsKKwkJdm9sLT51c2VkX2J5dGVzID0gdm9sLT51c2VkX2VicyAqIHZvbC0+dXNhYmxlX2xlYl9zaXplOworCX0gZWxzZSB7CisJCWJ5dGVzID0gdm9sLT51c2VkX2J5dGVzOworCQl2b2wtPmxhc3RfZWJfYnl0ZXMgPSBkb19kaXYoYnl0ZXMsIHZvbC0+dXNhYmxlX2xlYl9zaXplKTsKKwkJdm9sLT51c2VkX2VicyA9IGJ5dGVzOworCQlpZiAodm9sLT5sYXN0X2ViX2J5dGVzKQorCQkJdm9sLT51c2VkX2VicyArPSAxOworCQllbHNlCisJCQl2b2wtPmxhc3RfZWJfYnl0ZXMgPSB2b2wtPnVzYWJsZV9sZWJfc2l6ZTsKKwl9CisKKwkvKiBSZWdpc3RlciBjaGFyYWN0ZXIgZGV2aWNlIGZvciB0aGUgdm9sdW1lICovCisJY2Rldl9pbml0KCZ2b2wtPmNkZXYsICZ1Ymlfdm9sX2NkZXZfb3BlcmF0aW9ucyk7CisJdm9sLT5jZGV2Lm93bmVyID0gVEhJU19NT0RVTEU7CisJZXJyID0gY2Rldl9hZGQoJnZvbC0+Y2RldiwgTUtERVYodWJpLT5tYWpvciwgdm9sX2lkICsgMSksIDEpOworCWlmIChlcnIpIHsKKwkJdWJpX2VycigiY2Fubm90IGFkZCBjaGFyYWN0ZXIgZGV2aWNlIGZvciB2b2x1bWUgJWQiLCB2b2xfaWQpOworCQlnb3RvIG91dF9tYXBwaW5nOworCX0KKworCWVyciA9IHViaV9jcmVhdGVfZ2x1ZWJpKHViaSwgdm9sKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9jZGV2OworCisJdm9sLT5kZXYucmVsZWFzZSA9IHZvbF9yZWxlYXNlOworCXZvbC0+ZGV2LnBhcmVudCA9ICZ1YmktPmRldjsKKwl2b2wtPmRldi5kZXZ0ID0gTUtERVYodWJpLT5tYWpvciwgdm9sLT52b2xfaWQgKyAxKTsKKwl2b2wtPmRldi5jbGFzcyA9IHViaV9jbGFzczsKKwlzcHJpbnRmKCZ2b2wtPmRldi5idXNfaWRbMF0sICIlc18lZCIsIHViaS0+dWJpX25hbWUsIHZvbC0+dm9sX2lkKTsKKwllcnIgPSBkZXZpY2VfcmVnaXN0ZXIoJnZvbC0+ZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9nbHVlYmk7CisKKwllcnIgPSB2b2x1bWVfc3lzZnNfaW5pdCh1YmksIHZvbCk7CisJaWYgKGVycikKKwkJZ290byBvdXRfc3lzZnM7CisKKwkvKiBGaWxsIHZvbHVtZSB0YWJsZSByZWNvcmQgKi8KKwltZW1zZXQoJnZ0YmxfcmVjLCAwLCBzaXplb2Yoc3RydWN0IHViaV92dGJsX3JlY29yZCkpOworCXZ0YmxfcmVjLnJlc2VydmVkX3BlYnMgPSBjcHVfdG9fdWJpMzIodm9sLT5yZXNlcnZlZF9wZWJzKTsKKwl2dGJsX3JlYy5hbGlnbm1lbnQgICAgID0gY3B1X3RvX3ViaTMyKHZvbC0+YWxpZ25tZW50KTsKKwl2dGJsX3JlYy5kYXRhX3BhZCAgICAgID0gY3B1X3RvX3ViaTMyKHZvbC0+ZGF0YV9wYWQpOworCXZ0YmxfcmVjLm5hbWVfbGVuICAgICAgPSBjcHVfdG9fdWJpMTYodm9sLT5uYW1lX2xlbik7CisJaWYgKHZvbC0+dm9sX3R5cGUgPT0gVUJJX0RZTkFNSUNfVk9MVU1FKQorCQl2dGJsX3JlYy52b2xfdHlwZSA9IFVCSV9WSURfRFlOQU1JQzsKKwllbHNlCisJCXZ0YmxfcmVjLnZvbF90eXBlID0gVUJJX1ZJRF9TVEFUSUM7CisJbWVtY3B5KHZ0YmxfcmVjLm5hbWUsIHZvbC0+bmFtZSwgdm9sLT5uYW1lX2xlbiArIDEpOworCisJZXJyID0gdWJpX2NoYW5nZV92dGJsX3JlY29yZCh1YmksIHZvbF9pZCwgJnZ0YmxfcmVjKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9zeXNmczsKKworCXNwaW5fbG9jaygmdWJpLT52b2x1bWVzX2xvY2spOworCXViaS0+dm9sX2NvdW50ICs9IDE7CisJdm9sLT5leGNsdXNpdmUgPSAwOworCXNwaW5fdW5sb2NrKCZ1YmktPnZvbHVtZXNfbG9jayk7CisKKwlwYXJhbm9pZF9jaGVja192b2x1bWVzKHViaSk7CisJcmV0dXJuIDA7CisKK291dF9nbHVlYmk6CisJZXJyID0gdWJpX2Rlc3Ryb3lfZ2x1ZWJpKHZvbCk7CitvdXRfY2RldjoKKwljZGV2X2RlbCgmdm9sLT5jZGV2KTsKK291dF9tYXBwaW5nOgorCWtmcmVlKHZvbC0+ZWJhX3RibCk7CitvdXRfYWNjOgorCXNwaW5fbG9jaygmdWJpLT52b2x1bWVzX2xvY2spOworCXViaS0+cnN2ZF9wZWJzIC09IHZvbC0+cmVzZXJ2ZWRfcGViczsKKwl1YmktPmF2YWlsX3BlYnMgKz0gdm9sLT5yZXNlcnZlZF9wZWJzOworb3V0X3VubG9jazoKKwlzcGluX3VubG9jaygmdWJpLT52b2x1bWVzX2xvY2spOworCWtmcmVlKHZvbCk7CisJcmV0dXJuIGVycjsKKworCS8qCisJICogV2UgYXJlIHJlZ2lzdGVyZWQsIHNvIEB2b2wgaXMgZGVzdHJveWVkIGluIHRoZSByZWxlYXNlIGZ1bmN0aW9uIGFuZAorCSAqIHdlIGhhdmUgdG8gZGUtaW5pdGlhbGl6ZSBkaWZmZXJlbnRseS4KKwkgKi8KK291dF9zeXNmczoKKwllcnIgPSB1YmlfZGVzdHJveV9nbHVlYmkodm9sKTsKKwljZGV2X2RlbCgmdm9sLT5jZGV2KTsKKwlrZnJlZSh2b2wtPmViYV90YmwpOworCXNwaW5fbG9jaygmdWJpLT52b2x1bWVzX2xvY2spOworCXViaS0+cnN2ZF9wZWJzIC09IHZvbC0+cmVzZXJ2ZWRfcGViczsKKwl1YmktPmF2YWlsX3BlYnMgKz0gdm9sLT5yZXNlcnZlZF9wZWJzOworCXNwaW5fdW5sb2NrKCZ1YmktPnZvbHVtZXNfbG9jayk7CisJdm9sdW1lX3N5c2ZzX2Nsb3NlKHZvbCk7CisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKiB1YmlfcmVtb3ZlX3ZvbHVtZSAtIHJlbW92ZSB2b2x1bWUuCisgKiBAZGVzYzogdm9sdW1lIGRlc2NyaXB0b3IKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJlbW92ZXMgdm9sdW1lIGRlc2NyaWJlZCBieSBAZGVzYy4gVGhlIHZvbHVtZSBoYXMgdG8gYmUgb3BlbmVkCisgKiBpbiAiZXhjbHVzaXZlIiBtb2RlLiBSZXR1cm5zIHplcm8gaW4gY2FzZSBvZiBzdWNjZXNzIGFuZCBhIG5lZ2F0aXZlIGVycm9yCisgKiBjb2RlIGluIGNhc2Ugb2YgZmFpbHVyZS4KKyAqLworaW50IHViaV9yZW1vdmVfdm9sdW1lKHN0cnVjdCB1Ymlfdm9sdW1lX2Rlc2MgKmRlc2MpCit7CisJc3RydWN0IHViaV92b2x1bWUgKnZvbCA9IGRlc2MtPnZvbDsKKwlzdHJ1Y3QgdWJpX2RldmljZSAqdWJpID0gdm9sLT51Ymk7CisJaW50IGksIGVyciwgdm9sX2lkID0gdm9sLT52b2xfaWQsIHJlc2VydmVkX3BlYnMgPSB2b2wtPnJlc2VydmVkX3BlYnM7CisKKwlkYmdfbXNnKCJyZW1vdmUgVUJJIHZvbHVtZSAlZCIsIHZvbF9pZCk7CisJdWJpX2Fzc2VydChkZXNjLT5tb2RlID09IFVCSV9FWENMVVNJVkUpOworCXViaV9hc3NlcnQodm9sID09IHViaS0+dm9sdW1lc1t2b2xfaWRdKTsKKworCWlmICh1YmktPnJvX21vZGUpCisJCXJldHVybiAtRVJPRlM7CisKKwllcnIgPSB1YmlfZGVzdHJveV9nbHVlYmkodm9sKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0gdWJpX2NoYW5nZV92dGJsX3JlY29yZCh1YmksIHZvbF9pZCwgTlVMTCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWZvciAoaSA9IDA7IGkgPCB2b2wtPnJlc2VydmVkX3BlYnM7IGkrKykgeworCQllcnIgPSB1YmlfZWJhX3VubWFwX2xlYih1YmksIHZvbF9pZCwgaSk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCX0KKworCXNwaW5fbG9jaygmdWJpLT52b2x1bWVzX2xvY2spOworCXZvbC0+cmVtb3ZlZCA9IDE7CisJdWJpLT52b2x1bWVzW3ZvbF9pZF0gPSBOVUxMOworCXNwaW5fdW5sb2NrKCZ1YmktPnZvbHVtZXNfbG9jayk7CisKKwlrZnJlZSh2b2wtPmViYV90YmwpOworCXZvbC0+ZWJhX3RibCA9IE5VTEw7CisJY2Rldl9kZWwoJnZvbC0+Y2Rldik7CisJdm9sdW1lX3N5c2ZzX2Nsb3NlKHZvbCk7CisJa2ZyZWUoZGVzYyk7CisKKwlzcGluX2xvY2soJnViaS0+dm9sdW1lc19sb2NrKTsKKwl1YmktPnJzdmRfcGVicyAtPSByZXNlcnZlZF9wZWJzOworCXViaS0+YXZhaWxfcGVicyArPSByZXNlcnZlZF9wZWJzOworCWkgPSB1YmktPmJlYl9yc3ZkX2xldmVsIC0gdWJpLT5iZWJfcnN2ZF9wZWJzOworCWlmIChpID4gMCkgeworCQlpID0gdWJpLT5hdmFpbF9wZWJzID49IGkgPyBpIDogdWJpLT5hdmFpbF9wZWJzOworCQl1YmktPmF2YWlsX3BlYnMgLT0gaTsKKwkJdWJpLT5yc3ZkX3BlYnMgKz0gaTsKKwkJdWJpLT5iZWJfcnN2ZF9wZWJzICs9IGk7CisJCWlmIChpID4gMCkKKwkJCXViaV9tc2coInJlc2VydmUgbW9yZSAlZCBQRUJzIiwgaSk7CisJfQorCXViaS0+dm9sX2NvdW50IC09IDE7CisJc3Bpbl91bmxvY2soJnViaS0+dm9sdW1lc19sb2NrKTsKKworCXBhcmFub2lkX2NoZWNrX3ZvbHVtZXModWJpKTsKKwltb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB1YmlfcmVzaXplX3ZvbHVtZSAtIHJlLXNpemUgdm9sdW1lLgorICogQGRlc2M6IHZvbHVtZSBkZXNjcmlwdG9yCisgKiBAcmVzZXJ2ZWRfcGViczogbmV3IHNpemUgaW4gcGh5c2ljYWwgZXJhc2VibG9ja3MKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgemVybyBpbiBjYXNlIG9mIHN1Y2Nlc3MsIGFuZCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgaW4KKyAqIGNhc2Ugb2YgZmFpbHVyZS4KKyAqLworaW50IHViaV9yZXNpemVfdm9sdW1lKHN0cnVjdCB1Ymlfdm9sdW1lX2Rlc2MgKmRlc2MsIGludCByZXNlcnZlZF9wZWJzKQoreworCWludCBpLCBlcnIsIHBlYnMsICpuZXdfbWFwcGluZzsKKwlzdHJ1Y3QgdWJpX3ZvbHVtZSAqdm9sID0gZGVzYy0+dm9sOworCXN0cnVjdCB1YmlfZGV2aWNlICp1YmkgPSB2b2wtPnViaTsKKwlzdHJ1Y3QgdWJpX3Z0YmxfcmVjb3JkIHZ0YmxfcmVjOworCWludCB2b2xfaWQgPSB2b2wtPnZvbF9pZDsKKworCWlmICh1YmktPnJvX21vZGUpCisJCXJldHVybiAtRVJPRlM7CisKKwlkYmdfbXNnKCJyZS1zaXplIHZvbHVtZSAlZCB0byBmcm9tICVkIHRvICVkIFBFQnMiLAorCQl2b2xfaWQsIHZvbC0+cmVzZXJ2ZWRfcGVicywgcmVzZXJ2ZWRfcGVicyk7CisJdWJpX2Fzc2VydChkZXNjLT5tb2RlID09IFVCSV9FWENMVVNJVkUpOworCXViaV9hc3NlcnQodm9sID09IHViaS0+dm9sdW1lc1t2b2xfaWRdKTsKKworCWlmICh2b2wtPnZvbF90eXBlID09IFVCSV9TVEFUSUNfVk9MVU1FICYmCisJICAgIHJlc2VydmVkX3BlYnMgPCB2b2wtPnVzZWRfZWJzKSB7CisJCWRiZ19lcnIoInRvbyBzbWFsbCBzaXplICVkLCAlZCBMRUJzIGNvbnRhaW4gZGF0YSIsCisJCQlyZXNlcnZlZF9wZWJzLCB2b2wtPnVzZWRfZWJzKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogSWYgdGhlIHNpemUgaXMgdGhlIHNhbWUsIHdlIGhhdmUgbm90aGluZyB0byBkbyAqLworCWlmIChyZXNlcnZlZF9wZWJzID09IHZvbC0+cmVzZXJ2ZWRfcGVicykKKwkJcmV0dXJuIDA7CisKKwluZXdfbWFwcGluZyA9IGttYWxsb2MocmVzZXJ2ZWRfcGVicyAqIHNpemVvZihpbnQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW5ld19tYXBwaW5nKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZvciAoaSA9IDA7IGkgPCByZXNlcnZlZF9wZWJzOyBpKyspCisJCW5ld19tYXBwaW5nW2ldID0gVUJJX0xFQl9VTk1BUFBFRDsKKworCS8qIFJlc2VydmUgcGh5c2ljYWwgZXJhc2VibG9ja3MgKi8KKwlwZWJzID0gcmVzZXJ2ZWRfcGVicyAtIHZvbC0+cmVzZXJ2ZWRfcGViczsKKwlpZiAocGVicyA+IDApIHsKKwkJc3Bpbl9sb2NrKCZ1YmktPnZvbHVtZXNfbG9jayk7CisJCWlmIChwZWJzID4gdWJpLT5hdmFpbF9wZWJzKSB7CisJCQlkYmdfZXJyKCJub3QgZW5vdWdoIFBFQnM6IHJlcXVlc3RlZCAlZCwgYXZhaWxhYmxlICVkIiwKKwkJCQlwZWJzLCB1YmktPmF2YWlsX3BlYnMpOworCQkJc3Bpbl91bmxvY2soJnViaS0+dm9sdW1lc19sb2NrKTsKKwkJCWVyciA9IC1FTk9TUEM7CisJCQlnb3RvIG91dF9mcmVlOworCQl9CisJCXViaS0+YXZhaWxfcGVicyAtPSBwZWJzOworCQl1YmktPnJzdmRfcGVicyArPSBwZWJzOworCQlmb3IgKGkgPSAwOyBpIDwgdm9sLT5yZXNlcnZlZF9wZWJzOyBpKyspCisJCQluZXdfbWFwcGluZ1tpXSA9IHZvbC0+ZWJhX3RibFtpXTsKKwkJa2ZyZWUodm9sLT5lYmFfdGJsKTsKKwkJdm9sLT5lYmFfdGJsID0gbmV3X21hcHBpbmc7CisJCXNwaW5fdW5sb2NrKCZ1YmktPnZvbHVtZXNfbG9jayk7CisJfQorCisJLyogQ2hhbmdlIHZvbHVtZSB0YWJsZSByZWNvcmQgKi8KKwltZW1jcHkoJnZ0YmxfcmVjLCAmdWJpLT52dGJsW3ZvbF9pZF0sIHNpemVvZihzdHJ1Y3QgdWJpX3Z0YmxfcmVjb3JkKSk7CisJdnRibF9yZWMucmVzZXJ2ZWRfcGVicyA9IGNwdV90b191YmkzMihyZXNlcnZlZF9wZWJzKTsKKwllcnIgPSB1YmlfY2hhbmdlX3Z0YmxfcmVjb3JkKHViaSwgdm9sX2lkLCAmdnRibF9yZWMpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X2FjYzsKKworCWlmIChwZWJzIDwgMCkgeworCQlmb3IgKGkgPSAwOyBpIDwgLXBlYnM7IGkrKykgeworCQkJZXJyID0gdWJpX2ViYV91bm1hcF9sZWIodWJpLCB2b2xfaWQsIHJlc2VydmVkX3BlYnMgKyBpKTsKKwkJCWlmIChlcnIpCisJCQkJZ290byBvdXRfYWNjOworCQl9CisJCXNwaW5fbG9jaygmdWJpLT52b2x1bWVzX2xvY2spOworCQl1YmktPnJzdmRfcGVicyArPSBwZWJzOworCQl1YmktPmF2YWlsX3BlYnMgLT0gcGViczsKKwkJcGVicyA9IHViaS0+YmViX3JzdmRfbGV2ZWwgLSB1YmktPmJlYl9yc3ZkX3BlYnM7CisJCWlmIChwZWJzID4gMCkgeworCQkJcGVicyA9IHViaS0+YXZhaWxfcGVicyA+PSBwZWJzID8gcGVicyA6IHViaS0+YXZhaWxfcGViczsKKwkJCXViaS0+YXZhaWxfcGVicyAtPSBwZWJzOworCQkJdWJpLT5yc3ZkX3BlYnMgKz0gcGViczsKKwkJCXViaS0+YmViX3JzdmRfcGVicyArPSBwZWJzOworCQkJaWYgKHBlYnMgPiAwKQorCQkJCXViaV9tc2coInJlc2VydmUgbW9yZSAlZCBQRUJzIiwgcGVicyk7CisJCX0KKwkJZm9yIChpID0gMDsgaSA8IHJlc2VydmVkX3BlYnM7IGkrKykKKwkJCW5ld19tYXBwaW5nW2ldID0gdm9sLT5lYmFfdGJsW2ldOworCQlrZnJlZSh2b2wtPmViYV90YmwpOworCQl2b2wtPmViYV90YmwgPSBuZXdfbWFwcGluZzsKKwkJc3Bpbl91bmxvY2soJnViaS0+dm9sdW1lc19sb2NrKTsKKwl9CisKKwl2b2wtPnJlc2VydmVkX3BlYnMgPSByZXNlcnZlZF9wZWJzOworCWlmICh2b2wtPnZvbF90eXBlID09IFVCSV9EWU5BTUlDX1ZPTFVNRSkgeworCQl2b2wtPnVzZWRfZWJzID0gcmVzZXJ2ZWRfcGViczsKKwkJdm9sLT5sYXN0X2ViX2J5dGVzID0gdm9sLT51c2FibGVfbGViX3NpemU7CisJCXZvbC0+dXNlZF9ieXRlcyA9IHZvbC0+dXNlZF9lYnMgKiB2b2wtPnVzYWJsZV9sZWJfc2l6ZTsKKwl9CisKKwlwYXJhbm9pZF9jaGVja192b2x1bWVzKHViaSk7CisJcmV0dXJuIDA7CisKK291dF9hY2M6CisJaWYgKHBlYnMgPiAwKSB7CisJCXNwaW5fbG9jaygmdWJpLT52b2x1bWVzX2xvY2spOworCQl1YmktPnJzdmRfcGVicyAtPSBwZWJzOworCQl1YmktPmF2YWlsX3BlYnMgKz0gcGViczsKKwkJc3Bpbl91bmxvY2soJnViaS0+dm9sdW1lc19sb2NrKTsKKwl9CitvdXRfZnJlZToKKwlrZnJlZShuZXdfbWFwcGluZyk7CisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKiB1YmlfYWRkX3ZvbHVtZSAtIGFkZCB2b2x1bWUuCisgKiBAdWJpOiBVQkkgZGV2aWNlIGRlc2NyaXB0aW9uIG9iamVjdAorICogQHZvbF9pZDogdm9sdW1lIElECisgKgorICogVGhpcyBmdW5jdGlvbiBhZGRzIGFuIGV4aXN0aW4gdm9sdW1lIGFuZCBpbml0aWFsaXplcyBhbGwgaXRzIGRhdGEKKyAqIHN0cnVjdHVyZXMuIFJldHVybmVzIHplcm8gaW4gY2FzZSBvZiBzdWNjZXNzIGFuZCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgaW4KKyAqIGNhc2Ugb2YgZmFpbHVyZS4KKyAqLworaW50IHViaV9hZGRfdm9sdW1lKHN0cnVjdCB1YmlfZGV2aWNlICp1YmksIGludCB2b2xfaWQpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgdWJpX3ZvbHVtZSAqdm9sID0gdWJpLT52b2x1bWVzW3ZvbF9pZF07CisKKwlkYmdfbXNnKCJhZGQgdm9sdW1lICVkIiwgdm9sX2lkKTsKKwl1YmlfZGJnX2R1bXBfdm9sX2luZm8odm9sKTsKKwl1YmlfYXNzZXJ0KHZvbCk7CisKKwkvKiBSZWdpc3RlciBjaGFyYWN0ZXIgZGV2aWNlIGZvciB0aGUgdm9sdW1lICovCisJY2Rldl9pbml0KCZ2b2wtPmNkZXYsICZ1Ymlfdm9sX2NkZXZfb3BlcmF0aW9ucyk7CisJdm9sLT5jZGV2Lm93bmVyID0gVEhJU19NT0RVTEU7CisJZXJyID0gY2Rldl9hZGQoJnZvbC0+Y2RldiwgTUtERVYodWJpLT5tYWpvciwgdm9sLT52b2xfaWQgKyAxKSwgMSk7CisJaWYgKGVycikgeworCQl1YmlfZXJyKCJjYW5ub3QgYWRkIGNoYXJhY3RlciBkZXZpY2UgZm9yIHZvbHVtZSAlZCIsIHZvbF9pZCk7CisJCXJldHVybiBlcnI7CisJfQorCisJZXJyID0gdWJpX2NyZWF0ZV9nbHVlYmkodWJpLCB2b2wpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X2NkZXY7CisKKwl2b2wtPmRldi5yZWxlYXNlID0gdm9sX3JlbGVhc2U7CisJdm9sLT5kZXYucGFyZW50ID0gJnViaS0+ZGV2OworCXZvbC0+ZGV2LmRldnQgPSBNS0RFVih1YmktPm1ham9yLCB2b2wtPnZvbF9pZCArIDEpOworCXZvbC0+ZGV2LmNsYXNzID0gdWJpX2NsYXNzOworCXNwcmludGYoJnZvbC0+ZGV2LmJ1c19pZFswXSwgIiVzXyVkIiwgdWJpLT51YmlfbmFtZSwgdm9sLT52b2xfaWQpOworCWVyciA9IGRldmljZV9yZWdpc3Rlcigmdm9sLT5kZXYpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X2dsdWViaTsKKworCWVyciA9IHZvbHVtZV9zeXNmc19pbml0KHViaSwgdm9sKTsKKwlpZiAoZXJyKSB7CisJCWNkZXZfZGVsKCZ2b2wtPmNkZXYpOworCQllcnIgPSB1YmlfZGVzdHJveV9nbHVlYmkodm9sKTsKKwkJdm9sdW1lX3N5c2ZzX2Nsb3NlKHZvbCk7CisJCXJldHVybiBlcnI7CisJfQorCisJcGFyYW5vaWRfY2hlY2tfdm9sdW1lcyh1YmkpOworCXJldHVybiAwOworCitvdXRfZ2x1ZWJpOgorCWVyciA9IHViaV9kZXN0cm95X2dsdWViaSh2b2wpOworb3V0X2NkZXY6CisJY2Rldl9kZWwoJnZvbC0+Y2Rldik7CisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKiB1YmlfZnJlZV92b2x1bWUgLSBmcmVlIHZvbHVtZS4KKyAqIEB1Ymk6IFVCSSBkZXZpY2UgZGVzY3JpcHRpb24gb2JqZWN0CisgKiBAdm9sX2lkOiB2b2x1bWUgSUQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGZyZWVzIGFsbCByZXNvdXJjZXMgZm9yIHZvbHVtZSBAdm9sX2lkIGJ1dCBkb2VzIG5vdCByZW1vdmUgaXQuCisgKiBVc2VkIG9ubHkgd2hlbiB0aGUgVUJJIGRldmljZSBpcyBkZXRhY2hlZC4KKyAqLwordm9pZCB1YmlfZnJlZV92b2x1bWUoc3RydWN0IHViaV9kZXZpY2UgKnViaSwgaW50IHZvbF9pZCkKK3sKKwlpbnQgZXJyOworCXN0cnVjdCB1Ymlfdm9sdW1lICp2b2wgPSB1YmktPnZvbHVtZXNbdm9sX2lkXTsKKworCWRiZ19tc2coImZyZWUgdm9sdW1lICVkIiwgdm9sX2lkKTsKKwl1YmlfYXNzZXJ0KHZvbCk7CisKKwl2b2wtPnJlbW92ZWQgPSAxOworCWVyciA9IHViaV9kZXN0cm95X2dsdWViaSh2b2wpOworCXViaS0+dm9sdW1lc1t2b2xfaWRdID0gTlVMTDsKKwljZGV2X2RlbCgmdm9sLT5jZGV2KTsKKwl2b2x1bWVfc3lzZnNfY2xvc2Uodm9sKTsKK30KKworI2lmZGVmIENPTkZJR19NVERfVUJJX0RFQlVHX1BBUkFOT0lECisKKy8qKgorICogcGFyYW5vaWRfY2hlY2tfdm9sdW1lIC0gY2hlY2sgdm9sdW1lIGluZm9ybWF0aW9uLgorICogQHViaTogVUJJIGRldmljZSBkZXNjcmlwdGlvbiBvYmplY3QKKyAqIEB2b2xfaWQ6IHZvbHVtZSBJRAorICovCitzdGF0aWMgdm9pZCBwYXJhbm9pZF9jaGVja192b2x1bWUoY29uc3Qgc3RydWN0IHViaV9kZXZpY2UgKnViaSwgaW50IHZvbF9pZCkKK3sKKwlpbnQgaWR4ID0gdm9sX2lkMmlkeCh1YmksIHZvbF9pZCk7CisJaW50IHJlc2VydmVkX3BlYnMsIGFsaWdubWVudCwgZGF0YV9wYWQsIHZvbF90eXBlLCBuYW1lX2xlbiwgdXBkX21hcmtlcjsKKwljb25zdCBzdHJ1Y3QgdWJpX3ZvbHVtZSAqdm9sID0gdWJpLT52b2x1bWVzW2lkeF07CisJbG9uZyBsb25nIG47CisJY29uc3QgY2hhciAqbmFtZTsKKworCXJlc2VydmVkX3BlYnMgPSB1YmkzMl90b19jcHUodWJpLT52dGJsW3ZvbF9pZF0ucmVzZXJ2ZWRfcGVicyk7CisKKwlpZiAoIXZvbCkgeworCQlpZiAocmVzZXJ2ZWRfcGVicykgeworCQkJdWJpX2Vycigibm8gdm9sdW1lIGluZm8sIGJ1dCB2b2x1bWUgZXhpc3RzIik7CisJCQlnb3RvIGZhaWw7CisJCX0KKwkJcmV0dXJuOworCX0KKworCWlmICh2b2wtPnJlc2VydmVkX3BlYnMgPCAwIHx8IHZvbC0+YWxpZ25tZW50IDwgMCB8fCB2b2wtPmRhdGFfcGFkIDwgMCB8fAorCSAgICB2b2wtPm5hbWVfbGVuIDwgMCkgeworCQl1YmlfZXJyKCJuZWdhdGl2ZSB2YWx1ZXMiKTsKKwkJZ290byBmYWlsOworCX0KKwlpZiAodm9sLT5hbGlnbm1lbnQgPiB1YmktPmxlYl9zaXplIHx8IHZvbC0+YWxpZ25tZW50ID09IDApIHsKKwkJdWJpX2VycigiYmFkIGFsaWdubWVudCIpOworCQlnb3RvIGZhaWw7CisJfQorCisJbiA9IHZvbC0+YWxpZ25tZW50ICUgdWJpLT5taW5faW9fc2l6ZTsKKwlpZiAodm9sLT5hbGlnbm1lbnQgIT0gMSAmJiBuKSB7CisJCXViaV9lcnIoImFsaWdubWVudCBpcyBub3QgbXVsdGlwbGUgb2YgbWluIEkvTyB1bml0Iik7CisJCWdvdG8gZmFpbDsKKwl9CisKKwluID0gdWJpLT5sZWJfc2l6ZSAlIHZvbC0+YWxpZ25tZW50OworCWlmICh2b2wtPmRhdGFfcGFkICE9IG4pIHsKKwkJdWJpX2VycigiYmFkIGRhdGFfcGFkLCBoYXMgdG8gYmUgJWxsZCIsIG4pOworCQlnb3RvIGZhaWw7CisJfQorCisJaWYgKHZvbC0+dm9sX3R5cGUgIT0gVUJJX0RZTkFNSUNfVk9MVU1FICYmCisJICAgIHZvbC0+dm9sX3R5cGUgIT0gVUJJX1NUQVRJQ19WT0xVTUUpIHsKKwkJdWJpX2VycigiYmFkIHZvbF90eXBlIik7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlpZiAodm9sLT51cGRfbWFya2VyICE9IDAgJiYgdm9sLT51cGRfbWFya2VyICE9IDEpIHsKKwkJdWJpX2VycigiYmFkIHVwZF9tYXJrZXIiKTsKKwkJZ290byBmYWlsOworCX0KKworCWlmICh2b2wtPnVwZF9tYXJrZXIgJiYgdm9sLT5jb3JydXB0ZWQpIHsKKwkJZGJnX2VycigidXBkYXRlIG1hcmtlciBhbmQgY29ycnVwdGVkIHNpbXVsdGFuZW91c2x5Iik7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlpZiAodm9sLT5yZXNlcnZlZF9wZWJzID4gdWJpLT5nb29kX3BlYl9jb3VudCkgeworCQl1YmlfZXJyKCJ0b28gbGFyZ2UgcmVzZXJ2ZWRfcGVicyIpOworCQlnb3RvIGZhaWw7CisJfQorCisJbiA9IHViaS0+bGViX3NpemUgLSB2b2wtPmRhdGFfcGFkOworCWlmICh2b2wtPnVzYWJsZV9sZWJfc2l6ZSAhPSB1YmktPmxlYl9zaXplIC0gdm9sLT5kYXRhX3BhZCkgeworCQl1YmlfZXJyKCJiYWQgdXNhYmxlX2xlYl9zaXplLCBoYXMgdG8gYmUgJWxsZCIsIG4pOworCQlnb3RvIGZhaWw7CisJfQorCisJaWYgKHZvbC0+bmFtZV9sZW4gPiBVQklfVk9MX05BTUVfTUFYKSB7CisJCXViaV9lcnIoInRvbyBsb25nIHZvbHVtZSBuYW1lLCBtYXggaXMgJWQiLCBVQklfVk9MX05BTUVfTUFYKTsKKwkJZ290byBmYWlsOworCX0KKworCWlmICghdm9sLT5uYW1lKSB7CisJCXViaV9lcnIoIk5VTEwgdm9sdW1lIG5hbWUiKTsKKwkJZ290byBmYWlsOworCX0KKworCW4gPSBzdHJubGVuKHZvbC0+bmFtZSwgdm9sLT5uYW1lX2xlbiArIDEpOworCWlmIChuICE9IHZvbC0+bmFtZV9sZW4pIHsKKwkJdWJpX2VycigiYmFkIG5hbWVfbGVuICVsbGQiLCBuKTsKKwkJZ290byBmYWlsOworCX0KKworCW4gPSB2b2wtPnVzZWRfZWJzICogdm9sLT51c2FibGVfbGViX3NpemU7CisJaWYgKHZvbC0+dm9sX3R5cGUgPT0gVUJJX0RZTkFNSUNfVk9MVU1FKSB7CisJCWlmICh2b2wtPmNvcnJ1cHRlZCAhPSAwKSB7CisJCQl1YmlfZXJyKCJjb3JydXB0ZWQgZHluYW1pYyB2b2x1bWUiKTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCQlpZiAodm9sLT51c2VkX2VicyAhPSB2b2wtPnJlc2VydmVkX3BlYnMpIHsKKwkJCXViaV9lcnIoImJhZCB1c2VkX2VicyIpOworCQkJZ290byBmYWlsOworCQl9CisJCWlmICh2b2wtPmxhc3RfZWJfYnl0ZXMgIT0gdm9sLT51c2FibGVfbGViX3NpemUpIHsKKwkJCXViaV9lcnIoImJhZCBsYXN0X2ViX2J5dGVzIik7CisJCQlnb3RvIGZhaWw7CisJCX0KKwkJaWYgKHZvbC0+dXNlZF9ieXRlcyAhPSBuKSB7CisJCQl1YmlfZXJyKCJiYWQgdXNlZF9ieXRlcyIpOworCQkJZ290byBmYWlsOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKHZvbC0+Y29ycnVwdGVkICE9IDAgJiYgdm9sLT5jb3JydXB0ZWQgIT0gMSkgeworCQkJdWJpX2VycigiYmFkIGNvcnJ1cHRlZCIpOworCQkJZ290byBmYWlsOworCQl9CisJCWlmICh2b2wtPnVzZWRfZWJzIDwgMCB8fCB2b2wtPnVzZWRfZWJzID4gdm9sLT5yZXNlcnZlZF9wZWJzKSB7CisJCQl1YmlfZXJyKCJiYWQgdXNlZF9lYnMiKTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCQlpZiAodm9sLT5sYXN0X2ViX2J5dGVzIDwgMCB8fAorCQkgICAgdm9sLT5sYXN0X2ViX2J5dGVzID4gdm9sLT51c2FibGVfbGViX3NpemUpIHsKKwkJCXViaV9lcnIoImJhZCBsYXN0X2ViX2J5dGVzIik7CisJCQlnb3RvIGZhaWw7CisJCX0KKwkJaWYgKHZvbC0+dXNlZF9ieXRlcyA8IDAgfHwgdm9sLT51c2VkX2J5dGVzID4gbiB8fAorCQkgICAgdm9sLT51c2VkX2J5dGVzIDwgbiAtIHZvbC0+dXNhYmxlX2xlYl9zaXplKSB7CisJCQl1YmlfZXJyKCJiYWQgdXNlZF9ieXRlcyIpOworCQkJZ290byBmYWlsOworCQl9CisJfQorCisJYWxpZ25tZW50ICA9IHViaTMyX3RvX2NwdSh1YmktPnZ0Ymxbdm9sX2lkXS5hbGlnbm1lbnQpOworCWRhdGFfcGFkICAgPSB1YmkzMl90b19jcHUodWJpLT52dGJsW3ZvbF9pZF0uZGF0YV9wYWQpOworCW5hbWVfbGVuICAgPSB1YmkxNl90b19jcHUodWJpLT52dGJsW3ZvbF9pZF0ubmFtZV9sZW4pOworCXVwZF9tYXJrZXIgPSB1YmktPnZ0Ymxbdm9sX2lkXS51cGRfbWFya2VyOworCW5hbWUgICAgICAgPSAmdWJpLT52dGJsW3ZvbF9pZF0ubmFtZVswXTsKKwlpZiAodWJpLT52dGJsW3ZvbF9pZF0udm9sX3R5cGUgPT0gVUJJX1ZJRF9EWU5BTUlDKQorCQl2b2xfdHlwZSA9IFVCSV9EWU5BTUlDX1ZPTFVNRTsKKwllbHNlCisJCXZvbF90eXBlID0gVUJJX1NUQVRJQ19WT0xVTUU7CisKKwlpZiAoYWxpZ25tZW50ICE9IHZvbC0+YWxpZ25tZW50IHx8IGRhdGFfcGFkICE9IHZvbC0+ZGF0YV9wYWQgfHwKKwkgICAgdXBkX21hcmtlciAhPSB2b2wtPnVwZF9tYXJrZXIgfHwgdm9sX3R5cGUgIT0gdm9sLT52b2xfdHlwZSB8fAorCSAgICBuYW1lX2xlbiE9IHZvbC0+bmFtZV9sZW4gfHwgc3RybmNtcChuYW1lLCB2b2wtPm5hbWUsIG5hbWVfbGVuKSkgeworCQl1YmlfZXJyKCJ2b2x1bWUgaW5mbyBpcyBkaWZmZXJlbnQiKTsKKwkJZ290byBmYWlsOworCX0KKworCXJldHVybjsKKworZmFpbDoKKwl1YmlfZXJyKCJwYXJhbm9pZCBjaGVjayBmYWlsZWQiKTsKKwl1YmlfZGJnX2R1bXBfdm9sX2luZm8odm9sKTsKKwl1YmlfZGJnX2R1bXBfdnRibF9yZWNvcmQoJnViaS0+dnRibFt2b2xfaWRdLCB2b2xfaWQpOworCUJVRygpOworfQorCisvKioKKyAqIHBhcmFub2lkX2NoZWNrX3ZvbHVtZXMgLSBjaGVjayBpbmZvcm1hdGlvbiBhYm91dCBhbGwgdm9sdW1lcy4KKyAqIEB1Ymk6IFVCSSBkZXZpY2UgZGVzY3JpcHRpb24gb2JqZWN0CisgKi8KK3N0YXRpYyB2b2lkIHBhcmFub2lkX2NoZWNrX3ZvbHVtZXMoc3RydWN0IHViaV9kZXZpY2UgKnViaSkKK3sKKwlpbnQgaTsKKworCW11dGV4X2xvY2soJnViaS0+dnRibF9tdXRleCk7CisJc3Bpbl9sb2NrKCZ1YmktPnZvbHVtZXNfbG9jayk7CisJZm9yIChpID0gMDsgaSA8IHViaS0+dnRibF9zbG90czsgaSsrKQorCQlwYXJhbm9pZF9jaGVja192b2x1bWUodWJpLCBpKTsKKwlzcGluX3VubG9jaygmdWJpLT52b2x1bWVzX2xvY2spOworCW11dGV4X3VubG9jaygmdWJpLT52dGJsX211dGV4KTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvdWJpL3Z0YmwuYyBiL2RyaXZlcnMvbXRkL3ViaS92dGJsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZmZDZiYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbXRkL3ViaS92dGJsLmMKQEAgLTAsMCArMSw4MDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4sIDIwMDYKKyAqIENvcHlyaWdodCAoYykgTm9raWEgQ29ycG9yYXRpb24sIDIwMDYsIDIwMDcKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlCisgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICogQXV0aG9yOiBBcnRlbSBCaXR5dXRza2l5ICjQkdC40YLRjtGG0LrQuNC5INCQ0YDRgtGR0LwpCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBpbmNsdWRlcyB2b2x1bWUgdGFibGUgbWFuaXB1bGF0aW9uIGNvZGUuIFRoZSB2b2x1bWUgdGFibGUgaXMgYW4KKyAqIG9uLWZsYXNoIHRhYmxlIGNvbnRhaW5pbmcgdm9sdW1lIG1ldGEtZGF0YSBsaWtlIG5hbWUsIG51bWJlciBvZiByZXNlcnZlZAorICogcGh5c2ljYWwgZXJhc2VibG9ja3MsIHR5cGUsIGV0Yy4gVGhlIHZvbHVtZSB0YWJsZSBpcyBzdG9yZWQgaW4gdGhlIHNvLWNhbGxlZAorICogImxheW91dCB2b2x1bWUiLgorICoKKyAqIFRoZSBsYXlvdXQgdm9sdW1lIGlzIGFuIGludGVybmFsIHZvbHVtZSB3aGljaCBpcyBvcmdhbml6ZWQgYXMgZm9sbG93cy4gSXQKKyAqIGNvbnNpc3RzIG9mIHR3byBsb2dpY2FsIGVyYXNlYmxvY2tzIC0gTEVCIDAgYW5kIExFQiAxLiBFYWNoIGxvZ2ljYWwKKyAqIGVyYXNlYmxvY2sgc3RvcmVzIG9uZSB2b2x1bWUgdGFibGUgY29weSwgaS5lLiBMRUIgMCBhbmQgTEVCIDEgZHVwbGljYXRlIGVhY2gKKyAqIG90aGVyLiBUaGlzIHJlZHVuZGFuY3kgZ3VhcmFudGVlcyByb2J1c3RuZXNzIHRvIHVuY2xlYW4gcmVib290cy4gVGhlIHZvbHVtZQorICogdGFibGUgaXMgYmFzaWNhbGx5IGFuIGFycmF5IG9mIHZvbHVtZSB0YWJsZSByZWNvcmRzLiBFYWNoIHJlY29yZCBjb250YWlucworICogZnVsbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdm9sdW1lIGFuZCBwcm90ZWN0ZWQgYnkgYSBDUkMgY2hlY2tzdW0uCisgKgorICogVGhlIHZvbHVtZSB0YWJsZSBpcyBjaGFuZ2VkLCBpdCBpcyBmaXJzdCBjaGFuZ2VkIGluIFJBTS4gVGhlbiBMRUIgMCBpcworICogZXJhc2VkLCBhbmQgdGhlIHVwZGF0ZWQgdm9sdW1lIHRhYmxlIGlzIHdyaXR0ZW4gYmFjayB0byBMRUIgMC4gVGhlbiBzYW1lIGZvcgorICogTEVCIDEuIFRoaXMgc2NoZW1lIGd1YXJhbnRlZXMgcmVjb3ZlcmFiaWxpdHkgZnJvbSB1bmNsZWFuIHJlYm9vdHMuCisgKgorICogSW4gdGhpcyBVQkkgaW1wbGVtZW50YXRpb24gdGhlIG9uLWZsYXNoIHZvbHVtZSB0YWJsZSBkb2VzIG5vdCBjb250YWluIGFueQorICogaW5mb3JtYXRpb24gYWJvdXQgaG93IG1hbnkgZGF0YSBzdGF0aWMgdm9sdW1lcyBjb250YWluLiBUaGlzIGluZm9ybWF0aW9uIG1heQorICogYmUgZm91bmQgZnJvbSB0aGUgc2Nhbm5pbmcgZGF0YS4KKyAqCisgKiBCdXQgaXQgd291bGQgc3RpbGwgYmUgYmVuZWZpY2lhbCB0byBzdG9yZSB0aGlzIGluZm9ybWF0aW9uIGluIHRoZSB2b2x1bWUKKyAqIHRhYmxlLiBGb3IgZXhhbXBsZSwgc3VwcG9zZSB3ZSBoYXZlIGEgc3RhdGljIHZvbHVtZSBYLCBhbmQgYWxsIGl0cyBwaHlzaWNhbAorICogZXJhc2VibG9ja3MgYmVjYW1lIGJhZCBmb3Igc29tZSByZWFzb25zLiBTdXBwb3NlIHdlIGFyZSBhdHRhY2hpbmcgdGhlCisgKiBjb3JyZXNwb25kaW5nIE1URCBkZXZpY2UsIHRoZSBzY2FubmluZyBoYXMgZm91bmQgbm8gbG9naWNhbCBlcmFzZWJsb2NrcworICogY29ycmVzcG9uZGluZyB0byB0aGUgdm9sdW1lIFguIEFjY29yZGluZyB0byB0aGUgdm9sdW1lIHRhYmxlIHZvbHVtZSBYIGRvZXMKKyAqIGV4aXN0LiBTbyB3ZSBkb24ndCBrbm93IHdoZXRoZXIgaXQgaXMganVzdCBlbXB0eSBvciBhbGwgaXRzIHBoeXNpY2FsCisgKiBlcmFzZWJsb2NrcyB3ZW50IGJhZC4gU28gd2UgY2Fubm90IGFsYXJtIHRoZSB1c2VyIGFib3V0IHRoaXMgY29ycnVwdGlvbi4KKyAqCisgKiBUaGUgdm9sdW1lIHRhYmxlIGFsc28gc3RvcmVzIHNvLWNhbGxlZCAidXBkYXRlIG1hcmtlciIsIHdoaWNoIGlzIHVzZWQgZm9yCisgKiB2b2x1bWUgdXBkYXRlcy4gQmVmb3JlIHVwZGF0aW5nIHRoZSB2b2x1bWUsIHRoZSB1cGRhdGUgbWFya2VyIGlzIHNldCwgYW5kCisgKiBhZnRlciB0aGUgdXBkYXRlIG9wZXJhdGlvbiBpcyBmaW5pc2hlZCwgdGhlIHVwZGF0ZSBtYXJrZXIgaXMgY2xlYXJlZC4gU28gaWYKKyAqIHRoZSB1cGRhdGUgb3BlcmF0aW9uIHdhcyBpbnRlcnJ1cHRlZCAoZS5nLiBieSBhbiB1bmNsZWFuIHJlYm9vdCkgLSB0aGUKKyAqIHVwZGF0ZSBtYXJrZXIgaXMgc3RpbGwgdGhlcmUgYW5kIHdlIGtub3cgdGhhdCB0aGUgdm9sdW1lJ3MgY29udGVudHMgaXMKKyAqIGRhbWFnZWQuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CisjaW5jbHVkZSAidWJpLmgiCisKKyNpZmRlZiBDT05GSUdfTVREX1VCSV9ERUJVR19QQVJBTk9JRAorc3RhdGljIHZvaWQgcGFyYW5vaWRfdnRibF9jaGVjayhjb25zdCBzdHJ1Y3QgdWJpX2RldmljZSAqdWJpKTsKKyNlbHNlCisjZGVmaW5lIHBhcmFub2lkX3Z0YmxfY2hlY2sodWJpKQorI2VuZGlmCisKKy8qIEVtcHR5IHZvbHVtZSB0YWJsZSByZWNvcmQgKi8KK3N0YXRpYyBzdHJ1Y3QgdWJpX3Z0YmxfcmVjb3JkIGVtcHR5X3Z0YmxfcmVjb3JkOworCisvKioKKyAqIHViaV9jaGFuZ2VfdnRibF9yZWNvcmQgLSBjaGFuZ2Ugdm9sdW1lIHRhYmxlIHJlY29yZC4KKyAqIEB1Ymk6IFVCSSBkZXZpY2UgZGVzY3JpcHRpb24gb2JqZWN0CisgKiBAaWR4OiB0YWJsZSBpbmRleCB0byBjaGFuZ2UKKyAqIEB2dGJsX3JlYzogbmV3IHZvbHVtZSB0YWJsZSByZWNvcmQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNoYW5nZXMgdm9sdW1lIHRhYmxlIHJlY29yZCBAaWR4LiBJZiBAdnRibF9yZWMgaXMgJU5VTEwsIGVtcHR5CisgKiB2b2x1bWUgdGFibGUgcmVjb3JkIGlzIHdyaXR0ZW4uIFRoZSBjYWxsZXIgZG9lcyBub3QgaGF2ZSB0byBjYWxjdWxhdGUgQ1JDIG9mCisgKiB0aGUgcmVjb3JkIGFzIGl0IGlzIGRvbmUgYnkgdGhpcyBmdW5jdGlvbi4gUmV0dXJucyB6ZXJvIGluIGNhc2Ugb2Ygc3VjY2VzcworICogYW5kIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBpbiBjYXNlIG9mIGZhaWx1cmUuCisgKi8KK2ludCB1YmlfY2hhbmdlX3Z0YmxfcmVjb3JkKHN0cnVjdCB1YmlfZGV2aWNlICp1YmksIGludCBpZHgsCisJCQkgICBzdHJ1Y3QgdWJpX3Z0YmxfcmVjb3JkICp2dGJsX3JlYykKK3sKKwlpbnQgaSwgZXJyOworCXVpbnQzMl90IGNyYzsKKworCXViaV9hc3NlcnQoaWR4ID49IDAgJiYgaWR4IDwgdWJpLT52dGJsX3Nsb3RzKTsKKworCWlmICghdnRibF9yZWMpCisJCXZ0YmxfcmVjID0gJmVtcHR5X3Z0YmxfcmVjb3JkOworCWVsc2UgeworCQljcmMgPSBjcmMzMihVQklfQ1JDMzJfSU5JVCwgdnRibF9yZWMsIFVCSV9WVEJMX1JFQ09SRF9TSVpFX0NSQyk7CisJCXZ0YmxfcmVjLT5jcmMgPSBjcHVfdG9fdWJpMzIoY3JjKTsKKwl9CisKKwlkYmdfbXNnKCJjaGFuZ2UgcmVjb3JkICVkIiwgaWR4KTsKKwl1YmlfZGJnX2R1bXBfdnRibF9yZWNvcmQodnRibF9yZWMsIGlkeCk7CisKKwltdXRleF9sb2NrKCZ1YmktPnZ0YmxfbXV0ZXgpOworCW1lbWNweSgmdWJpLT52dGJsW2lkeF0sIHZ0YmxfcmVjLCBzaXplb2Yoc3RydWN0IHViaV92dGJsX3JlY29yZCkpOworCWZvciAoaSA9IDA7IGkgPCBVQklfTEFZT1VUX1ZPTFVNRV9FQlM7IGkrKykgeworCQllcnIgPSB1YmlfZWJhX3VubWFwX2xlYih1YmksIFVCSV9MQVlPVVRfVk9MX0lELCBpKTsKKwkJaWYgKGVycikgeworCQkJbXV0ZXhfdW5sb2NrKCZ1YmktPnZ0YmxfbXV0ZXgpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCQllcnIgPSB1YmlfZWJhX3dyaXRlX2xlYih1YmksIFVCSV9MQVlPVVRfVk9MX0lELCBpLCB1YmktPnZ0YmwsIDAsCisJCQkJCXViaS0+dnRibF9zaXplLCBVQklfTE9OR1RFUk0pOworCQlpZiAoZXJyKSB7CisJCQltdXRleF91bmxvY2soJnViaS0+dnRibF9tdXRleCk7CisJCQlyZXR1cm4gZXJyOworCQl9CisJfQorCisJcGFyYW5vaWRfdnRibF9jaGVjayh1YmkpOworCW11dGV4X3VubG9jaygmdWJpLT52dGJsX211dGV4KTsKKwlyZXR1cm4gdWJpX3dsX2ZsdXNoKHViaSk7Cit9CisKKy8qKgorICogdm9sX3RpbF9jaGVjayAtIGNoZWNrIGlmIHZvbHVtZSB0YWJsZSBpcyBub3QgY29ycnVwdGVkIGFuZCBjb250YWlucyBzZW5zaWJsZQorICogZGF0YS4KKyAqCisgKiBAdWJpOiBVQkkgZGV2aWNlIGRlc2NyaXB0aW9uIG9iamVjdAorICogQHZ0Ymw6IHZvbHVtZSB0YWJsZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB6ZXJvIGlmIEB2dGJsIGlzIGFsbCByaWdodCwgJTEgaWYgQ1JDIGlzIGluY29ycmVjdCwKKyAqIGFuZCAlLUVJTlZBTCBpZiBpdCBjb250YWlucyBpbmNvbnNpc3RlbnQgZGF0YS4KKyAqLworc3RhdGljIGludCB2dGJsX2NoZWNrKGNvbnN0IHN0cnVjdCB1YmlfZGV2aWNlICp1YmksCisJCSAgICAgIGNvbnN0IHN0cnVjdCB1YmlfdnRibF9yZWNvcmQgKnZ0YmwpCit7CisJaW50IGksIG4sIHJlc2VydmVkX3BlYnMsIGFsaWdubWVudCwgZGF0YV9wYWQsIHZvbF90eXBlLCBuYW1lX2xlbjsKKwlpbnQgdXBkX21hcmtlcjsKKwl1aW50MzJfdCBjcmM7CisJY29uc3QgY2hhciAqbmFtZTsKKworCWZvciAoaSA9IDA7IGkgPCB1YmktPnZ0Ymxfc2xvdHM7IGkrKykgeworCQljb25kX3Jlc2NoZWQoKTsKKworCQlyZXNlcnZlZF9wZWJzID0gdWJpMzJfdG9fY3B1KHZ0YmxbaV0ucmVzZXJ2ZWRfcGVicyk7CisJCWFsaWdubWVudCA9IHViaTMyX3RvX2NwdSh2dGJsW2ldLmFsaWdubWVudCk7CisJCWRhdGFfcGFkID0gdWJpMzJfdG9fY3B1KHZ0YmxbaV0uZGF0YV9wYWQpOworCQl1cGRfbWFya2VyID0gdnRibFtpXS51cGRfbWFya2VyOworCQl2b2xfdHlwZSA9IHZ0YmxbaV0udm9sX3R5cGU7CisJCW5hbWVfbGVuID0gdWJpMTZfdG9fY3B1KHZ0YmxbaV0ubmFtZV9sZW4pOworCQluYW1lID0gJnZ0YmxbaV0ubmFtZVswXTsKKworCQljcmMgPSBjcmMzMihVQklfQ1JDMzJfSU5JVCwgJnZ0YmxbaV0sIFVCSV9WVEJMX1JFQ09SRF9TSVpFX0NSQyk7CisJCWlmICh1YmkzMl90b19jcHUodnRibFtpXS5jcmMpICE9IGNyYykgeworCQkJdWJpX2VycigiYmFkIENSQyBhdCByZWNvcmQgJXU6ICUjMDh4LCBub3QgJSMwOHgiLAorCQkJCSBpLCBjcmMsIHViaTMyX3RvX2NwdSh2dGJsW2ldLmNyYykpOworCQkJdWJpX2RiZ19kdW1wX3Z0YmxfcmVjb3JkKCZ2dGJsW2ldLCBpKTsKKwkJCXJldHVybiAxOworCQl9CisKKwkJaWYgKHJlc2VydmVkX3BlYnMgPT0gMCkgeworCQkJaWYgKG1lbWNtcCgmdnRibFtpXSwgJmVtcHR5X3Z0YmxfcmVjb3JkLAorCQkJCQkJVUJJX1ZUQkxfUkVDT1JEX1NJWkUpKSB7CisJCQkJZGJnX2VycigiYmFkIGVtcHR5IHJlY29yZCIpOworCQkJCWdvdG8gYmFkOworCQkJfQorCQkJY29udGludWU7CisJCX0KKworCQlpZiAocmVzZXJ2ZWRfcGVicyA8IDAgfHwgYWxpZ25tZW50IDwgMCB8fCBkYXRhX3BhZCA8IDAgfHwKKwkJICAgIG5hbWVfbGVuIDwgMCkgeworCQkJZGJnX2VycigibmVnYXRpdmUgdmFsdWVzIik7CisJCQlnb3RvIGJhZDsKKwkJfQorCisJCWlmIChhbGlnbm1lbnQgPiB1YmktPmxlYl9zaXplIHx8IGFsaWdubWVudCA9PSAwKSB7CisJCQlkYmdfZXJyKCJiYWQgYWxpZ25tZW50Iik7CisJCQlnb3RvIGJhZDsKKwkJfQorCisJCW4gPSBhbGlnbm1lbnQgJSB1YmktPm1pbl9pb19zaXplOworCQlpZiAoYWxpZ25tZW50ICE9IDEgJiYgbikgeworCQkJZGJnX2VycigiYWxpZ25tZW50IGlzIG5vdCBtdWx0aXBsZSBvZiBtaW4gSS9PIHVuaXQiKTsKKwkJCWdvdG8gYmFkOworCQl9CisKKwkJbiA9IHViaS0+bGViX3NpemUgJSBhbGlnbm1lbnQ7CisJCWlmIChkYXRhX3BhZCAhPSBuKSB7CisJCQlkYmdfZXJyKCJiYWQgZGF0YV9wYWQsIGhhcyB0byBiZSAlZCIsIG4pOworCQkJZ290byBiYWQ7CisJCX0KKworCQlpZiAodm9sX3R5cGUgIT0gVUJJX1ZJRF9EWU5BTUlDICYmIHZvbF90eXBlICE9IFVCSV9WSURfU1RBVElDKSB7CisJCQlkYmdfZXJyKCJiYWQgdm9sX3R5cGUiKTsKKwkJCWdvdG8gYmFkOworCQl9CisKKwkJaWYgKHVwZF9tYXJrZXIgIT0gMCAmJiB1cGRfbWFya2VyICE9IDEpIHsKKwkJCWRiZ19lcnIoImJhZCB1cGRfbWFya2VyIik7CisJCQlnb3RvIGJhZDsKKwkJfQorCisJCWlmIChyZXNlcnZlZF9wZWJzID4gdWJpLT5nb29kX3BlYl9jb3VudCkgeworCQkJZGJnX2VycigidG9vIGxhcmdlIHJlc2VydmVkX3BlYnMsIGdvb2QgUEVCcyAlZCIsCisJCQkJdWJpLT5nb29kX3BlYl9jb3VudCk7CisJCQlnb3RvIGJhZDsKKwkJfQorCisJCWlmIChuYW1lX2xlbiA+IFVCSV9WT0xfTkFNRV9NQVgpIHsKKwkJCWRiZ19lcnIoInRvbyBsb25nIHZvbHVtZSBuYW1lLCBtYXggJWQiLAorCQkJCVVCSV9WT0xfTkFNRV9NQVgpOworCQkJZ290byBiYWQ7CisJCX0KKworCQlpZiAobmFtZVswXSA9PSAnXDAnKSB7CisJCQlkYmdfZXJyKCJOVUxMIHZvbHVtZSBuYW1lIik7CisJCQlnb3RvIGJhZDsKKwkJfQorCisJCWlmIChuYW1lX2xlbiAhPSBzdHJubGVuKG5hbWUsIG5hbWVfbGVuICsgMSkpIHsKKwkJCWRiZ19lcnIoImJhZCBuYW1lX2xlbiIpOworCQkJZ290byBiYWQ7CisJCX0KKwl9CisKKwkvKiBDaGVja3MgdGhhdCBhbGwgbmFtZXMgYXJlIHVuaXF1ZSAqLworCWZvciAoaSA9IDA7IGkgPCB1YmktPnZ0Ymxfc2xvdHMgLSAxOyBpKyspIHsKKwkJZm9yIChuID0gaSArIDE7IG4gPCB1YmktPnZ0Ymxfc2xvdHM7IG4rKykgeworCQkJaW50IGxlbjEgPSB1YmkxNl90b19jcHUodnRibFtpXS5uYW1lX2xlbik7CisJCQlpbnQgbGVuMiA9IHViaTE2X3RvX2NwdSh2dGJsW25dLm5hbWVfbGVuKTsKKworCQkJaWYgKGxlbjEgPiAwICYmIGxlbjEgPT0gbGVuMiAmJgorCQkJICAgICFzdHJuY21wKHZ0YmxbaV0ubmFtZSwgdnRibFtuXS5uYW1lLCBsZW4xKSkgeworCQkJCXViaV9lcnIoInZvbHVtZXMgJWQgYW5kICVkIGhhdmUgdGhlIHNhbWUgbmFtZSIKKwkJCQkJIiBcIiVzXCIiLCBpLCBuLCB2dGJsW2ldLm5hbWUpOworCQkJCXViaV9kYmdfZHVtcF92dGJsX3JlY29yZCgmdnRibFtpXSwgaSk7CisJCQkJdWJpX2RiZ19kdW1wX3Z0YmxfcmVjb3JkKCZ2dGJsW25dLCBuKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiAwOworCitiYWQ6CisJdWJpX2Vycigidm9sdW1lIHRhYmxlIGNoZWNrIGZhaWxlZCwgcmVjb3JkICVkIiwgaSk7CisJdWJpX2RiZ19kdW1wX3Z0YmxfcmVjb3JkKCZ2dGJsW2ldLCBpKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyoqCisgKiBjcmVhdGVfdnRibCAtIGNyZWF0ZSBhIGNvcHkgb2Ygdm9sdW1lIHRhYmxlLgorICogQHViaTogVUJJIGRldmljZSBkZXNjcmlwdGlvbiBvYmplY3QKKyAqIEBzaTogc2Nhbm5pbmcgaW5mb3JtYXRpb24KKyAqIEBjb3B5OiBudW1iZXIgb2YgdGhlIHZvbHVtZSB0YWJsZSBjb3B5CisgKiBAdnRibDogY29udGVudHMgb2YgdGhlIHZvbHVtZSB0YWJsZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB6ZXJvIGluIGNhc2Ugb2Ygc3VjY2VzcyBhbmQgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIGluCisgKiBjYXNlIG9mIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQgY3JlYXRlX3Z0YmwoY29uc3Qgc3RydWN0IHViaV9kZXZpY2UgKnViaSwgc3RydWN0IHViaV9zY2FuX2luZm8gKnNpLAorCQkgICAgICAgaW50IGNvcHksIHZvaWQgKnZ0YmwpCit7CisJaW50IGVyciwgdHJpZXMgPSAwOworCXN0YXRpYyBzdHJ1Y3QgdWJpX3ZpZF9oZHIgKnZpZF9oZHI7CisJc3RydWN0IHViaV9zY2FuX3ZvbHVtZSAqc3Y7CisJc3RydWN0IHViaV9zY2FuX2xlYiAqbmV3X3NlYiwgKm9sZF9zZWIgPSBOVUxMOworCisJdWJpX21zZygiY3JlYXRlIHZvbHVtZSB0YWJsZSAoY29weSAjJWQpIiwgY29weSArIDEpOworCisJdmlkX2hkciA9IHViaV96YWxsb2NfdmlkX2hkcih1YmkpOworCWlmICghdmlkX2hkcikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKgorCSAqIENoZWNrIGlmIHRoZXJlIGlzIGEgbG9naWNhbCBlcmFzZWJsb2NrIHdoaWNoIHdvdWxkIGhhdmUgdG8gY29udGFpbgorCSAqIHRoaXMgdm9sdW1lIHRhYmxlIGNvcHkgd2FzIGZvdW5kIGR1cmluZyBzY2FubmluZy4gSXQgaGFzIHRvIGJlIHdpcGVkCisJICogb3V0LgorCSAqLworCXN2ID0gdWJpX3NjYW5fZmluZF9zdihzaSwgVUJJX0xBWU9VVF9WT0xfSUQpOworCWlmIChzdikKKwkJb2xkX3NlYiA9IHViaV9zY2FuX2ZpbmRfc2ViKHN2LCBjb3B5KTsKKworcmV0cnk6CisJbmV3X3NlYiA9IHViaV9zY2FuX2dldF9mcmVlX3BlYih1YmksIHNpKTsKKwlpZiAoSVNfRVJSKG5ld19zZWIpKSB7CisJCWVyciA9IFBUUl9FUlIobmV3X3NlYik7CisJCWdvdG8gb3V0X2ZyZWU7CisJfQorCisJdmlkX2hkci0+dm9sX3R5cGUgPSBVQklfVklEX0RZTkFNSUM7CisJdmlkX2hkci0+dm9sX2lkID0gY3B1X3RvX3ViaTMyKFVCSV9MQVlPVVRfVk9MX0lEKTsKKwl2aWRfaGRyLT5jb21wYXQgPSBVQklfTEFZT1VUX1ZPTFVNRV9DT01QQVQ7CisJdmlkX2hkci0+ZGF0YV9zaXplID0gdmlkX2hkci0+dXNlZF9lYnMgPQorCQkJICAgICB2aWRfaGRyLT5kYXRhX3BhZCA9IGNwdV90b191YmkzMigwKTsKKwl2aWRfaGRyLT5sbnVtID0gY3B1X3RvX3ViaTMyKGNvcHkpOworCXZpZF9oZHItPnNxbnVtID0gY3B1X3RvX3ViaTY0KCsrc2ktPm1heF9zcW51bSk7CisJdmlkX2hkci0+bGViX3ZlciA9IGNwdV90b191YmkzMihvbGRfc2ViID8gb2xkX3NlYi0+bGViX3ZlciArIDE6IDApOworCisJLyogVGhlIEVDIGhlYWRlciBpcyBhbHJlYWR5IHRoZXJlLCB3cml0ZSB0aGUgVklEIGhlYWRlciAqLworCWVyciA9IHViaV9pb193cml0ZV92aWRfaGRyKHViaSwgbmV3X3NlYi0+cG51bSwgdmlkX2hkcik7CisJaWYgKGVycikKKwkJZ290byB3cml0ZV9lcnJvcjsKKworCS8qIFdyaXRlIHRoZSBsYXlvdXQgdm9sdW1lIGNvbnRlbnRzICovCisJZXJyID0gdWJpX2lvX3dyaXRlX2RhdGEodWJpLCB2dGJsLCBuZXdfc2ViLT5wbnVtLCAwLCB1YmktPnZ0Ymxfc2l6ZSk7CisJaWYgKGVycikKKwkJZ290byB3cml0ZV9lcnJvcjsKKworCS8qCisJICogQW5kIGFkZCBpdCB0byB0aGUgc2Nhbm5pbmcgaW5mb3JtYXRpb24uIERvbid0IGRlbGV0ZSB0aGUgb2xkCisJICogQG9sZF9zZWIgYXMgaXQgd2lsbCBiZSBkZWxldGVkIGFuZCBmcmVlZCBpbiAndWJpX3NjYW5fYWRkX3VzZWQoKScuCisJICovCisJZXJyID0gdWJpX3NjYW5fYWRkX3VzZWQodWJpLCBzaSwgbmV3X3NlYi0+cG51bSwgbmV3X3NlYi0+ZWMsCisJCQkJdmlkX2hkciwgMCk7CisJa2ZyZWUobmV3X3NlYik7CisJdWJpX2ZyZWVfdmlkX2hkcih1YmksIHZpZF9oZHIpOworCXJldHVybiBlcnI7CisKK3dyaXRlX2Vycm9yOgorCWtmcmVlKG5ld19zZWIpOworCS8qIE1heSBiZSB0aGlzIHBoeXNpY2FsIGVyYXNlYmxvY2sgd2VudCBiYWQsIHRyeSB0byBwaWNrIGFub3RoZXIgb25lICovCisJaWYgKCsrdHJpZXMgPD0gNSkgeworCQllcnIgPSB1Ymlfc2Nhbl9hZGRfdG9fbGlzdChzaSwgbmV3X3NlYi0+cG51bSwgbmV3X3NlYi0+ZWMsCisJCQkJCSAgICZzaS0+Y29ycik7CisJCWlmICghZXJyKQorCQkJZ290byByZXRyeTsKKwl9CitvdXRfZnJlZToKKwl1YmlfZnJlZV92aWRfaGRyKHViaSwgdmlkX2hkcik7CisJcmV0dXJuIGVycjsKKworfQorCisvKioKKyAqIHByb2Nlc3NfbHZvbCAtIHByb2Nlc3MgdGhlIGxheW91dCB2b2x1bWUuCisgKiBAdWJpOiBVQkkgZGV2aWNlIGRlc2NyaXB0aW9uIG9iamVjdAorICogQHNpOiBzY2FubmluZyBpbmZvcm1hdGlvbgorICogQHN2OiBsYXlvdXQgdm9sdW1lIHNjYW5uaW5nIGluZm9ybWF0aW9uCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgcmVhZGluZyB0aGUgbGF5b3V0IHZvbHVtZSwgZW5zdXJpbmcgaXQgaXMKKyAqIG5vdCBjb3JydXB0ZWQsIGFuZCByZWNvdmVyaW5nIGZyb20gY29ycnVwdGlvbnMgaWYgbmVlZGVkLiBSZXR1cm5zIHZvbHVtZQorICogdGFibGUgaW4gY2FzZSBvZiBzdWNjZXNzIGFuZCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgaW4gY2FzZSBvZiBmYWlsdXJlLgorICovCitzdGF0aWMgc3RydWN0IHViaV92dGJsX3JlY29yZCAqcHJvY2Vzc19sdm9sKGNvbnN0IHN0cnVjdCB1YmlfZGV2aWNlICp1YmksCisJCQkJCSAgICBzdHJ1Y3QgdWJpX3NjYW5faW5mbyAqc2ksCisJCQkJCSAgICBzdHJ1Y3QgdWJpX3NjYW5fdm9sdW1lICpzdikKK3sKKwlpbnQgZXJyOworCXN0cnVjdCByYl9ub2RlICpyYjsKKwlzdHJ1Y3QgdWJpX3NjYW5fbGViICpzZWI7CisJc3RydWN0IHViaV92dGJsX3JlY29yZCAqbGViW1VCSV9MQVlPVVRfVk9MVU1FX0VCU10gPSB7IE5VTEwsIE5VTEwgfTsKKwlpbnQgbGViX2NvcnJ1cHRlZFtVQklfTEFZT1VUX1ZPTFVNRV9FQlNdID0gezEsIDF9OworCisJLyoKKwkgKiBVQkkgZ29lcyB0aHJvdWdoIHRoZSBmb2xsb3dpbmcgc3RlcHMgd2hlbiBpdCBjaGFuZ2VzIHRoZSBsYXlvdXQKKwkgKiB2b2x1bWU6CisJICogYS4gZXJhc2UgTEVCIDA7CisJICogYi4gd3JpdGUgbmV3IGRhdGEgdG8gTEVCIDA7CisJICogYy4gZXJhc2UgTEVCIDE7CisJICogZC4gd3JpdGUgbmV3IGRhdGEgdG8gTEVCIDEuCisJICoKKwkgKiBCZWZvcmUgdGhlIGNoYW5nZSwgYm90aCBMRUJzIGNvbnRhaW4gdGhlIHNhbWUgZGF0YS4KKwkgKgorCSAqIER1ZSB0byB1bmNsZWFuIHJlYm9vdHMsIHRoZSBjb250ZW50cyBvZiBMRUIgMCBtYXkgYmUgbG9zdCwgYnV0IHRoZXJlCisJICogc2hvdWxkIExFQiAxLiBTbyBpdCBpcyBPSyBpZiBMRUIgMCBpcyBjb3JydXB0ZWQgd2hpbGUgTEVCIDEgaXMgbm90LgorCSAqIFNpbWlsYXJseSwgTEVCIDEgbWF5IGJlIGxvc3QsIGJ1dCB0aGVyZSBzaG91bGQgYmUgTEVCIDAuIEFuZAorCSAqIGZpbmFsbHksIHVuY2xlYW4gcmVib290cyBtYXkgcmVzdWx0IGluIGEgc2l0dWF0aW9uIHdoZW4gbmVpdGhlciBMRUIKKwkgKiAwIG5vciBMRUIgMSBhcmUgY29ycnVwdGVkLCBidXQgdGhleSBhcmUgZGlmZmVyZW50LiBJbiB0aGlzIGNhc2UsIExFQgorCSAqIDAgY29udGFpbnMgbW9yZSByZWNlbnQgaW5mb3JtYXRpb24uCisJICoKKwkgKiBTbyB0aGUgcGxhbiBpcyB0byBmaXJzdCBjaGVjayBMRUIgMC4gVGhlbgorCSAqIGEuIGlmIExFQiAwIGlzIE9LLCBpdCBtdXN0IGJlIGNvbnRhaW5pbmcgdGhlIG1vc3QgcmVzZW50IGRhdGE7IHRoZW4KKwkgKiAgICB3ZSBjb21wYXJlIGl0IHdpdGggTEVCIDEsIGFuZCBpZiB0aGV5IGFyZSBkaWZmZXJlbnQsIHdlIGNvcHkgTEVCCisJICogICAgMCB0byBMRUIgMTsKKwkgKiBiLiBpZiBMRUIgMCBpcyBjb3JydXB0ZWQsIGJ1dCBMRUIgMSBoYXMgdG8gYmUgT0ssIGFuZCB3ZSBjb3B5IExFQiAxCisJICogICAgdG8gTEVCIDAuCisJICovCisKKwlkYmdfbXNnKCJjaGVjayBsYXlvdXQgdm9sdW1lIik7CisKKwkvKiBSZWFkIGJvdGggTEVCIDAgYW5kIExFQiAxIGludG8gbWVtb3J5ICovCisJdWJpX3JiX2Zvcl9lYWNoX2VudHJ5KHJiLCBzZWIsICZzdi0+cm9vdCwgdS5yYikgeworCQlsZWJbc2ViLT5sbnVtXSA9IGt6YWxsb2ModWJpLT52dGJsX3NpemUsIEdGUF9LRVJORUwpOworCQlpZiAoIWxlYltzZWItPmxudW1dKSB7CisJCQllcnIgPSAtRU5PTUVNOworCQkJZ290byBvdXRfZnJlZTsKKwkJfQorCisJCWVyciA9IHViaV9pb19yZWFkX2RhdGEodWJpLCBsZWJbc2ViLT5sbnVtXSwgc2ViLT5wbnVtLCAwLAorCQkJCSAgICAgICB1YmktPnZ0Ymxfc2l6ZSk7CisJCWlmIChlcnIgPT0gVUJJX0lPX0JJVEZMSVBTIHx8IGVyciA9PSAtRUJBRE1TRykKKwkJCS8qIFNjcnViIHRoZSBQRUIgbGF0ZXIgKi8KKwkJCXNlYi0+c2NydWIgPSAxOworCQllbHNlIGlmIChlcnIpCisJCQlnb3RvIG91dF9mcmVlOworCX0KKworCWVyciA9IC1FSU5WQUw7CisJaWYgKGxlYlswXSkgeworCQlsZWJfY29ycnVwdGVkWzBdID0gdnRibF9jaGVjayh1YmksIGxlYlswXSk7CisJCWlmIChsZWJfY29ycnVwdGVkWzBdIDwgMCkKKwkJCWdvdG8gb3V0X2ZyZWU7CisJfQorCisJaWYgKCFsZWJfY29ycnVwdGVkWzBdKSB7CisJCS8qIExFQiAwIGlzIE9LICovCisJCWlmIChsZWJbMV0pCisJCQlsZWJfY29ycnVwdGVkWzFdID0gbWVtY21wKGxlYlswXSwgbGViWzFdLCB1YmktPnZ0Ymxfc2l6ZSk7CisJCWlmIChsZWJfY29ycnVwdGVkWzFdKSB7CisJCQl1Ymlfd2Fybigidm9sdW1lIHRhYmxlIGNvcHkgIzIgaXMgY29ycnVwdGVkIik7CisJCQllcnIgPSBjcmVhdGVfdnRibCh1YmksIHNpLCAxLCBsZWJbMF0pOworCQkJaWYgKGVycikKKwkJCQlnb3RvIG91dF9mcmVlOworCQkJdWJpX21zZygidm9sdW1lIHRhYmxlIHdhcyByZXN0b3JlZCIpOworCQl9CisKKwkJLyogQm90aCBMRUIgMSBhbmQgTEVCIDIgYXJlIE9LIGFuZCBjb25zaXN0ZW50ICovCisJCWtmcmVlKGxlYlsxXSk7CisJCXJldHVybiBsZWJbMF07CisJfSBlbHNlIHsKKwkJLyogTEVCIDAgaXMgY29ycnVwdGVkIG9yIGRvZXMgbm90IGV4aXN0ICovCisJCWlmIChsZWJbMV0pIHsKKwkJCWxlYl9jb3JydXB0ZWRbMV0gPSB2dGJsX2NoZWNrKHViaSwgbGViWzFdKTsKKwkJCWlmIChsZWJfY29ycnVwdGVkWzFdIDwgMCkKKwkJCQlnb3RvIG91dF9mcmVlOworCQl9CisJCWlmIChsZWJfY29ycnVwdGVkWzFdKSB7CisJCQkvKiBCb3RoIExFQiAwIGFuZCBMRUIgMSBhcmUgY29ycnVwdGVkICovCisJCQl1YmlfZXJyKCJib3RoIHZvbHVtZSB0YWJsZXMgYXJlIGNvcnJ1cHRlZCIpOworCQkJZ290byBvdXRfZnJlZTsKKwkJfQorCisJCXViaV93YXJuKCJ2b2x1bWUgdGFibGUgY29weSAjMSBpcyBjb3JydXB0ZWQiKTsKKwkJZXJyID0gY3JlYXRlX3Z0YmwodWJpLCBzaSwgMCwgbGViWzFdKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0X2ZyZWU7CisJCXViaV9tc2coInZvbHVtZSB0YWJsZSB3YXMgcmVzdG9yZWQiKTsKKworCQlrZnJlZShsZWJbMF0pOworCQlyZXR1cm4gbGViWzFdOworCX0KKworb3V0X2ZyZWU6CisJa2ZyZWUobGViWzBdKTsKKwlrZnJlZShsZWJbMV0pOworCXJldHVybiBFUlJfUFRSKGVycik7Cit9CisKKy8qKgorICogY3JlYXRlX2VtcHR5X2x2b2wgLSBjcmVhdGUgZW1wdHkgbGF5b3V0IHZvbHVtZS4KKyAqIEB1Ymk6IFVCSSBkZXZpY2UgZGVzY3JpcHRpb24gb2JqZWN0CisgKiBAc2k6IHNjYW5uaW5nIGluZm9ybWF0aW9uCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHZvbHVtZSB0YWJsZSBjb250ZW50cyBpbiBjYXNlIG9mIHN1Y2Nlc3MgYW5kIGEKKyAqIG5lZ2F0aXZlIGVycm9yIGNvZGUgaW4gY2FzZSBvZiBmYWlsdXJlLgorICovCitzdGF0aWMgc3RydWN0IHViaV92dGJsX3JlY29yZCAqY3JlYXRlX2VtcHR5X2x2b2woY29uc3Qgc3RydWN0IHViaV9kZXZpY2UgKnViaSwKKwkJCQkJCSBzdHJ1Y3QgdWJpX3NjYW5faW5mbyAqc2kpCit7CisJaW50IGk7CisJc3RydWN0IHViaV92dGJsX3JlY29yZCAqdnRibDsKKworCXZ0YmwgPSBremFsbG9jKHViaS0+dnRibF9zaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXZ0YmwpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJZm9yIChpID0gMDsgaSA8IHViaS0+dnRibF9zbG90czsgaSsrKQorCQltZW1jcHkoJnZ0YmxbaV0sICZlbXB0eV92dGJsX3JlY29yZCwgVUJJX1ZUQkxfUkVDT1JEX1NJWkUpOworCisJZm9yIChpID0gMDsgaSA8IFVCSV9MQVlPVVRfVk9MVU1FX0VCUzsgaSsrKSB7CisJCWludCBlcnI7CisKKwkJZXJyID0gY3JlYXRlX3Z0YmwodWJpLCBzaSwgaSwgdnRibCk7CisJCWlmIChlcnIpIHsKKwkJCWtmcmVlKHZ0YmwpOworCQkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKKwkJfQorCX0KKworCXJldHVybiB2dGJsOworfQorCisvKioKKyAqIGluaXRfdm9sdW1lcyAtIGluaXRpYWxpemUgdm9sdW1lIGluZm9ybWF0aW9uIGZvciBleGlzdGluZyB2b2x1bWVzLgorICogQHViaTogVUJJIGRldmljZSBkZXNjcmlwdGlvbiBvYmplY3QKKyAqIEBzaTogc2Nhbm5pbmcgaW5mb3JtYXRpb24KKyAqIEB2dGJsOiB2b2x1bWUgdGFibGUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGFsbG9jYXRlcyB2b2x1bWUgZGVzY3JpcHRpb24gb2JqZWN0cyBmb3IgZXhpc3Rpbmcgdm9sdW1lcy4KKyAqIFJldHVybnMgemVybyBpbiBjYXNlIG9mIHN1Y2Nlc3MgYW5kIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBpbiBjYXNlIG9mCisgKiBmYWlsdXJlLgorICovCitzdGF0aWMgaW50IGluaXRfdm9sdW1lcyhzdHJ1Y3QgdWJpX2RldmljZSAqdWJpLCBjb25zdCBzdHJ1Y3QgdWJpX3NjYW5faW5mbyAqc2ksCisJCQljb25zdCBzdHJ1Y3QgdWJpX3Z0YmxfcmVjb3JkICp2dGJsKQoreworCWludCBpLCByZXNlcnZlZF9wZWJzID0gMDsKKwlzdHJ1Y3QgdWJpX3NjYW5fdm9sdW1lICpzdjsKKwlzdHJ1Y3QgdWJpX3ZvbHVtZSAqdm9sOworCisJZm9yIChpID0gMDsgaSA8IHViaS0+dnRibF9zbG90czsgaSsrKSB7CisJCWNvbmRfcmVzY2hlZCgpOworCisJCWlmICh1YmkzMl90b19jcHUodnRibFtpXS5yZXNlcnZlZF9wZWJzKSA9PSAwKQorCQkJY29udGludWU7IC8qIEVtcHR5IHJlY29yZCAqLworCisJCXZvbCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB1Ymlfdm9sdW1lKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghdm9sKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJdm9sLT5yZXNlcnZlZF9wZWJzID0gdWJpMzJfdG9fY3B1KHZ0YmxbaV0ucmVzZXJ2ZWRfcGVicyk7CisJCXZvbC0+YWxpZ25tZW50ID0gdWJpMzJfdG9fY3B1KHZ0YmxbaV0uYWxpZ25tZW50KTsKKwkJdm9sLT5kYXRhX3BhZCA9IHViaTMyX3RvX2NwdSh2dGJsW2ldLmRhdGFfcGFkKTsKKwkJdm9sLT52b2xfdHlwZSA9IHZ0YmxbaV0udm9sX3R5cGUgPT0gVUJJX1ZJRF9EWU5BTUlDID8KKwkJCQkJVUJJX0RZTkFNSUNfVk9MVU1FIDogVUJJX1NUQVRJQ19WT0xVTUU7CisJCXZvbC0+bmFtZV9sZW4gPSB1YmkxNl90b19jcHUodnRibFtpXS5uYW1lX2xlbik7CisJCXZvbC0+dXNhYmxlX2xlYl9zaXplID0gdWJpLT5sZWJfc2l6ZSAtIHZvbC0+ZGF0YV9wYWQ7CisJCW1lbWNweSh2b2wtPm5hbWUsIHZ0YmxbaV0ubmFtZSwgdm9sLT5uYW1lX2xlbik7CisJCXZvbC0+bmFtZVt2b2wtPm5hbWVfbGVuXSA9ICdcMCc7CisJCXZvbC0+dm9sX2lkID0gaTsKKworCQl1YmlfYXNzZXJ0KCF1YmktPnZvbHVtZXNbaV0pOworCQl1YmktPnZvbHVtZXNbaV0gPSB2b2w7CisJCXViaS0+dm9sX2NvdW50ICs9IDE7CisJCXZvbC0+dWJpID0gdWJpOworCQlyZXNlcnZlZF9wZWJzICs9IHZvbC0+cmVzZXJ2ZWRfcGViczsKKworCQkvKgorCQkgKiBJbiBjYXNlIG9mIGR5bmFtaWMgdm9sdW1lIFVCSSBrbm93cyBub3RoaW5nIGFib3V0IGhvdyBtYW55CisJCSAqIGRhdGEgaXMgc3RvcmVkIHRoZXJlLiBTbyBhc3N1bWUgdGhlIHdob2xlIHZvbHVtZSBpcyB1c2VkLgorCQkgKi8KKwkJaWYgKHZvbC0+dm9sX3R5cGUgPT0gVUJJX0RZTkFNSUNfVk9MVU1FKSB7CisJCQl2b2wtPnVzZWRfZWJzID0gdm9sLT5yZXNlcnZlZF9wZWJzOworCQkJdm9sLT5sYXN0X2ViX2J5dGVzID0gdm9sLT51c2FibGVfbGViX3NpemU7CisJCQl2b2wtPnVzZWRfYnl0ZXMgPSB2b2wtPnVzZWRfZWJzICogdm9sLT51c2FibGVfbGViX3NpemU7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIFN0YXRpYyB2b2x1bWVzIG9ubHkgKi8KKwkJc3YgPSB1Ymlfc2Nhbl9maW5kX3N2KHNpLCBpKTsKKwkJaWYgKCFzdikgeworCQkJLyoKKwkJCSAqIE5vIGVyYXNlYmxvY2tzIGJlbG9uZ2luZyB0byB0aGlzIHZvbHVtZSBmb3VuZC4gV2UKKwkJCSAqIGRvbid0IGFjdHVhbGx5IGtub3cgd2hldGhlciB0aGlzIHN0YXRpYyB2b2x1bWUgaXMKKwkJCSAqIGNvbXBsZXRlbHkgY29ycnVwdGVkIG9yIGp1c3QgY29udGFpbnMgbm8gZGF0YS4gQW5kCisJCQkgKiB3ZSBjYW5ub3Qga25vdyB0aGlzIGFzIGxvbmcgYXMgZGF0YSBzaXplIGlzIG5vdAorCQkJICogc3RvcmVkIG9uIGZsYXNoLiBTbyB3ZSBqdXN0IGFzc3VtZSB0aGUgdm9sdW1lIGlzCisJCQkgKiBlbXB0eS4gRklYTUU6IHRoaXMgc2hvdWxkIGJlIGhhbmRsZWQuCisJCQkgKi8KKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHN2LT5sZWJfY291bnQgIT0gc3YtPnVzZWRfZWJzKSB7CisJCQkvKgorCQkJICogV2UgZm91bmQgYSBzdGF0aWMgdm9sdW1lIHdoaWNoIG1pc3NlcyBzZXZlcmFsCisJCQkgKiBlcmFzZWJsb2Nrcy4gVHJlYXQgaXQgYXMgY29ycnVwdGVkLgorCQkJICovCisJCQl1Ymlfd2Fybigic3RhdGljIHZvbHVtZSAlZCBtaXNzZXMgJWQgTEVCcyAtIGNvcnJ1cHRlZCIsCisJCQkJIHN2LT52b2xfaWQsIHN2LT51c2VkX2VicyAtIHN2LT5sZWJfY291bnQpOworCQkJdm9sLT5jb3JydXB0ZWQgPSAxOworCQkJY29udGludWU7CisJCX0KKworCQl2b2wtPnVzZWRfZWJzID0gc3YtPnVzZWRfZWJzOworCQl2b2wtPnVzZWRfYnl0ZXMgPSAodm9sLT51c2VkX2VicyAtIDEpICogdm9sLT51c2FibGVfbGViX3NpemU7CisJCXZvbC0+dXNlZF9ieXRlcyArPSBzdi0+bGFzdF9kYXRhX3NpemU7CisJCXZvbC0+bGFzdF9lYl9ieXRlcyA9IHN2LT5sYXN0X2RhdGFfc2l6ZTsKKwl9CisKKwl2b2wgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdWJpX3ZvbHVtZSksIEdGUF9LRVJORUwpOworCWlmICghdm9sKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXZvbC0+cmVzZXJ2ZWRfcGVicyA9IFVCSV9MQVlPVVRfVk9MVU1FX0VCUzsKKwl2b2wtPmFsaWdubWVudCA9IDE7CisJdm9sLT52b2xfdHlwZSA9IFVCSV9EWU5BTUlDX1ZPTFVNRTsKKwl2b2wtPm5hbWVfbGVuID0gc2l6ZW9mKFVCSV9MQVlPVVRfVk9MVU1FX05BTUUpIC0gMTsKKwltZW1jcHkodm9sLT5uYW1lLCBVQklfTEFZT1VUX1ZPTFVNRV9OQU1FLCB2b2wtPm5hbWVfbGVuICsgMSk7CisJdm9sLT51c2FibGVfbGViX3NpemUgPSB1YmktPmxlYl9zaXplOworCXZvbC0+dXNlZF9lYnMgPSB2b2wtPnJlc2VydmVkX3BlYnM7CisJdm9sLT5sYXN0X2ViX2J5dGVzID0gdm9sLT5yZXNlcnZlZF9wZWJzOworCXZvbC0+dXNlZF9ieXRlcyA9IHZvbC0+dXNlZF9lYnMgKiAodWJpLT5sZWJfc2l6ZSAtIHZvbC0+ZGF0YV9wYWQpOworCXZvbC0+dm9sX2lkID0gVUJJX0xBWU9VVF9WT0xfSUQ7CisKKwl1YmlfYXNzZXJ0KCF1YmktPnZvbHVtZXNbaV0pOworCXViaS0+dm9sdW1lc1t2b2xfaWQyaWR4KHViaSwgdm9sLT52b2xfaWQpXSA9IHZvbDsKKwlyZXNlcnZlZF9wZWJzICs9IHZvbC0+cmVzZXJ2ZWRfcGViczsKKwl1YmktPnZvbF9jb3VudCArPSAxOworCXZvbC0+dWJpID0gdWJpOworCisJaWYgKHJlc2VydmVkX3BlYnMgPiB1YmktPmF2YWlsX3BlYnMpCisJCXViaV9lcnIoIm5vdCBlbm91Z2ggUEVCcywgcmVxdWlyZWQgJWQsIGF2YWlsYWJsZSAlZCIsCisJCQlyZXNlcnZlZF9wZWJzLCB1YmktPmF2YWlsX3BlYnMpOworCXViaS0+cnN2ZF9wZWJzICs9IHJlc2VydmVkX3BlYnM7CisJdWJpLT5hdmFpbF9wZWJzIC09IHJlc2VydmVkX3BlYnM7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBjaGVja19zdiAtIGNoZWNrIHZvbHVtZSBzY2FubmluZyBpbmZvcm1hdGlvbi4KKyAqIEB2b2w6IFVCSSB2b2x1bWUgZGVzY3JpcHRpb24gb2JqZWN0CisgKiBAc3Y6IHZvbHVtZSBzY2FubmluZyBpbmZvcm1hdGlvbgorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB6ZXJvIGlmIHRoZSB2b2x1bWUgc2Nhbm5pbmcgaW5mb3JtYXRpb24gaXMgY29uc2lzdGVudAorICogdG8gdGhlIGRhdGEgcmVhZCBmcm9tIHRoZSB2b2x1bWUgdGFibGEsIGFuZCAlLUVJTlZBTCBpZiBub3QuCisgKi8KK3N0YXRpYyBpbnQgY2hlY2tfc3YoY29uc3Qgc3RydWN0IHViaV92b2x1bWUgKnZvbCwKKwkJICAgIGNvbnN0IHN0cnVjdCB1Ymlfc2Nhbl92b2x1bWUgKnN2KQoreworCWlmIChzdi0+aGlnaGVzdF9sbnVtID49IHZvbC0+cmVzZXJ2ZWRfcGVicykgeworCQlkYmdfZXJyKCJiYWQgaGlnaGVzdF9sbnVtIik7CisJCWdvdG8gYmFkOworCX0KKwlpZiAoc3YtPmxlYl9jb3VudCA+IHZvbC0+cmVzZXJ2ZWRfcGVicykgeworCQlkYmdfZXJyKCJiYWQgbGViX2NvdW50Iik7CisJCWdvdG8gYmFkOworCX0KKwlpZiAoc3YtPnZvbF90eXBlICE9IHZvbC0+dm9sX3R5cGUpIHsKKwkJZGJnX2VycigiYmFkIHZvbF90eXBlIik7CisJCWdvdG8gYmFkOworCX0KKwlpZiAoc3YtPnVzZWRfZWJzID4gdm9sLT5yZXNlcnZlZF9wZWJzKSB7CisJCWRiZ19lcnIoImJhZCB1c2VkX2VicyIpOworCQlnb3RvIGJhZDsKKwl9CisJaWYgKHN2LT5kYXRhX3BhZCAhPSB2b2wtPmRhdGFfcGFkKSB7CisJCWRiZ19lcnIoImJhZCBkYXRhX3BhZCIpOworCQlnb3RvIGJhZDsKKwl9CisJcmV0dXJuIDA7CisKK2JhZDoKKwl1YmlfZXJyKCJiYWQgc2Nhbm5pbmcgaW5mb3JtYXRpb24iKTsKKwl1YmlfZGJnX2R1bXBfc3Yoc3YpOworCXViaV9kYmdfZHVtcF92b2xfaW5mbyh2b2wpOworCXJldHVybiAtRUlOVkFMOworfQorCisvKioKKyAqIGNoZWNrX3NjYW5uaW5nX2luZm8gLSBjaGVjayB0aGF0IHNjYW5uaW5nIGluZm9ybWF0aW9uLgorICogQHViaTogVUJJIGRldmljZSBkZXNjcmlwdGlvbiBvYmplY3QKKyAqIEBzaTogc2Nhbm5pbmcgaW5mb3JtYXRpb24KKyAqCisgKiBFdmVuIHRob3VnaCB3ZSBwcm90ZWN0IG9uLWZsYXNoIGRhdGEgYnkgQ1JDIGNoZWNrc3Vtcywgd2Ugc3RpbGwgZG9uJ3QgdHJ1c3QKKyAqIHRoZSBtZWRpYS4gVGhpcyBmdW5jdGlvbiBlbnN1cmVzIHRoYXQgc2Nhbm5pbmcgaW5mb3JtYXRpb24gaXMgY29uc2lzdGVudCB0bworICogdGhlIGluZm9ybWF0aW9uIHJlYWQgZnJvbSB0aGUgdm9sdW1lIHRhYmxlLiBSZXR1cm5zIHplcm8gaWYgdGhlIHNjYW5uaW5nCisgKiBpbmZvcm1hdGlvbiBpcyBPSyBhbmQgJS1FSU5WQUwgaWYgaXQgaXMgbm90LgorICovCitzdGF0aWMgaW50IGNoZWNrX3NjYW5uaW5nX2luZm8oY29uc3Qgc3RydWN0IHViaV9kZXZpY2UgKnViaSwKKwkJCSAgICAgICBzdHJ1Y3QgdWJpX3NjYW5faW5mbyAqc2kpCit7CisJaW50IGVyciwgaTsKKwlzdHJ1Y3QgdWJpX3NjYW5fdm9sdW1lICpzdjsKKwlzdHJ1Y3QgdWJpX3ZvbHVtZSAqdm9sOworCisJaWYgKHNpLT52b2xzX2ZvdW5kID4gVUJJX0lOVF9WT0xfQ09VTlQgKyB1YmktPnZ0Ymxfc2xvdHMpIHsKKwkJdWJpX2Vycigic2Nhbm5pbmcgZm91bmQgJWQgdm9sdW1lcywgbWF4aW11bSBpcyAlZCArICVkIiwKKwkJCXNpLT52b2xzX2ZvdW5kLCBVQklfSU5UX1ZPTF9DT1VOVCwgdWJpLT52dGJsX3Nsb3RzKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHNpLT5oaWdoZXN0X3ZvbF9pZCA+PSB1YmktPnZ0Ymxfc2xvdHMgKyBVQklfSU5UX1ZPTF9DT1VOVCYmCisJICAgIHNpLT5oaWdoZXN0X3ZvbF9pZCA8IFVCSV9JTlRFUk5BTF9WT0xfU1RBUlQpIHsKKwkJdWJpX2VycigidG9vIGxhcmdlIHZvbHVtZSBJRCAlZCBmb3VuZCBieSBzY2FubmluZyIsCisJCQlzaS0+aGlnaGVzdF92b2xfaWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKworCWZvciAoaSA9IDA7IGkgPCB1YmktPnZ0Ymxfc2xvdHMgKyBVQklfSU5UX1ZPTF9DT1VOVDsgaSsrKSB7CisJCWNvbmRfcmVzY2hlZCgpOworCisJCXN2ID0gdWJpX3NjYW5fZmluZF9zdihzaSwgaSk7CisJCXZvbCA9IHViaS0+dm9sdW1lc1tpXTsKKwkJaWYgKCF2b2wpIHsKKwkJCWlmIChzdikKKwkJCQl1Ymlfc2Nhbl9ybV92b2x1bWUoc2ksIHN2KTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHZvbC0+cmVzZXJ2ZWRfcGVicyA9PSAwKSB7CisJCQl1YmlfYXNzZXJ0KGkgPCB1YmktPnZ0Ymxfc2xvdHMpOworCisJCQlpZiAoIXN2KQorCQkJCWNvbnRpbnVlOworCisJCQkvKgorCQkJICogRHVyaW5nIHNjYW5uaW5nIHdlIGZvdW5kIGEgdm9sdW1lIHdoaWNoIGRvZXMgbm90CisJCQkgKiBleGlzdCBhY2NvcmRpbmcgdG8gdGhlIGluZm9ybWF0aW9uIGluIHRoZSB2b2x1bWUKKwkJCSAqIHRhYmxlLiBUaGlzIG11c3QgaGF2ZSBoYXBwZW5lZCBkdWUgdG8gYW4gdW5jbGVhbgorCQkJICogcmVib290IHdoaWxlIHRoZSB2b2x1bWUgd2FzIGJlaW5nIHJlbW92ZWQuIERpc2NhcmQKKwkJCSAqIHRoZXNlIGVyYXNlYmxvY2tzLgorCQkJICovCisJCQl1YmlfbXNnKCJmaW5pc2ggdm9sdW1lICVkIHJlbW92YWwiLCBzdi0+dm9sX2lkKTsKKwkJCXViaV9zY2FuX3JtX3ZvbHVtZShzaSwgc3YpOworCQl9IGVsc2UgaWYgKHN2KSB7CisJCQllcnIgPSBjaGVja19zdih2b2wsIHN2KTsKKwkJCWlmIChlcnIpCisJCQkJcmV0dXJuIGVycjsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIHViaV9yZWFkX3ZvbHVtZV90YWJsZSAtIHJlYWQgdm9sdW1lIHRhYmxlLgorICogaW5mb3JtYXRpb24uCisgKiBAdWJpOiBVQkkgZGV2aWNlIGRlc2NyaXB0aW9uIG9iamVjdAorICogQHNpOiBzY2FubmluZyBpbmZvcm1hdGlvbgorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmVhZHMgdm9sdW1lIHRhYmxlLCBjaGVja3MgaXQsIHJlY292ZXIgZnJvbSBlcnJvcnMgaWYgbmVlZGVkLAorICogb3IgY3JlYXRlcyBpdCBpZiBuZWVkZWQuIFJldHVybnMgemVybyBpbiBjYXNlIG9mIHN1Y2Nlc3MgYW5kIGEgbmVnYXRpdmUKKyAqIGVycm9yIGNvZGUgaW4gY2FzZSBvZiBmYWlsdXJlLgorICovCitpbnQgdWJpX3JlYWRfdm9sdW1lX3RhYmxlKHN0cnVjdCB1YmlfZGV2aWNlICp1YmksIHN0cnVjdCB1Ymlfc2Nhbl9pbmZvICpzaSkKK3sKKwlpbnQgaSwgZXJyOworCXN0cnVjdCB1Ymlfc2Nhbl92b2x1bWUgKnN2OworCisJZW1wdHlfdnRibF9yZWNvcmQuY3JjID0gY3B1X3RvX3ViaTMyKDB4ZjExNmMzNmIpOworCisJLyoKKwkgKiBUaGUgbnVtYmVyIG9mIHN1cHBvcnRlZCB2b2x1bWVzIGlzIGxpbWl0ZWQgYnkgdGhlIGVyYXNlYmxvY2sgc2l6ZQorCSAqIGFuZCBieSB0aGUgVUJJX01BWF9WT0xVTUVTIGNvbnN0YW50LgorCSAqLworCXViaS0+dnRibF9zbG90cyA9IHViaS0+bGViX3NpemUgLyBVQklfVlRCTF9SRUNPUkRfU0laRTsKKwlpZiAodWJpLT52dGJsX3Nsb3RzID4gVUJJX01BWF9WT0xVTUVTKQorCQl1YmktPnZ0Ymxfc2xvdHMgPSBVQklfTUFYX1ZPTFVNRVM7CisKKwl1YmktPnZ0Ymxfc2l6ZSA9IHViaS0+dnRibF9zbG90cyAqIFVCSV9WVEJMX1JFQ09SRF9TSVpFOworCXViaS0+dnRibF9zaXplID0gQUxJR04odWJpLT52dGJsX3NpemUsIHViaS0+bWluX2lvX3NpemUpOworCisJc3YgPSB1Ymlfc2Nhbl9maW5kX3N2KHNpLCBVQklfTEFZT1VUX1ZPTF9JRCk7CisJaWYgKCFzdikgeworCQkvKgorCQkgKiBObyBsb2dpY2FsIGVyYXNlYmxvY2tzIGJlbG9uZ2luZyB0byB0aGUgbGF5b3V0IHZvbHVtZSB3ZXJlCisJCSAqIGZvdW5kLiBUaGlzIGNvdWxkIG1lYW4gdGhhdCB0aGUgZmxhc2ggaXMganVzdCBlbXB0eS4gSW4KKwkJICogdGhpcyBjYXNlIHdlIGNyZWF0ZSBlbXB0eSBsYXlvdXQgdm9sdW1lLgorCQkgKgorCQkgKiBCdXQgaWYgZmxhc2ggaXMgbm90IGVtcHR5IHRoaXMgbXVzdCBiZSBhIGNvcnJ1cHRpb24gb3IgdGhlCisJCSAqIE1URCBkZXZpY2UganVzdCBjb250YWlucyBnYXJiYWdlLgorCQkgKi8KKwkJaWYgKHNpLT5pc19lbXB0eSkgeworCQkJdWJpLT52dGJsID0gY3JlYXRlX2VtcHR5X2x2b2wodWJpLCBzaSk7CisJCQlpZiAoSVNfRVJSKHViaS0+dnRibCkpCisJCQkJcmV0dXJuIFBUUl9FUlIodWJpLT52dGJsKTsKKwkJfSBlbHNlIHsKKwkJCXViaV9lcnIoInRoZSBsYXlvdXQgdm9sdW1lIHdhcyBub3QgZm91bmQiKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKHN2LT5sZWJfY291bnQgPiBVQklfTEFZT1VUX1ZPTFVNRV9FQlMpIHsKKwkJCS8qIFRoaXMgbXVzdCBub3QgaGFwcGVuIHdpdGggcHJvcGVyIFVCSSBpbWFnZXMgKi8KKwkJCWRiZ19lcnIoInRvbyBtYW55IExFQnMgKCVkKSBpbiBsYXlvdXQgdm9sdW1lIiwKKwkJCQlzdi0+bGViX2NvdW50KTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJdWJpLT52dGJsID0gcHJvY2Vzc19sdm9sKHViaSwgc2ksIHN2KTsKKwkJaWYgKElTX0VSUih1YmktPnZ0YmwpKQorCQkJcmV0dXJuIFBUUl9FUlIodWJpLT52dGJsKTsKKwl9CisKKwl1YmktPmF2YWlsX3BlYnMgPSB1YmktPmdvb2RfcGViX2NvdW50OworCisJLyoKKwkgKiBUaGUgbGF5b3V0IHZvbHVtZSBpcyBPSywgaW5pdGlhbGl6ZSB0aGUgY29ycmVzcG9uZGluZyBpbi1SQU0gZGF0YQorCSAqIHN0cnVjdHVyZXMuCisJICovCisJZXJyID0gaW5pdF92b2x1bWVzKHViaSwgc2ksIHViaS0+dnRibCk7CisJaWYgKGVycikKKwkJZ290byBvdXRfZnJlZTsKKworCS8qCisJICogR2V0IHN1cmUgdGhhdCB0aGUgc2Nhbm5pbmcgaW5mb3JtYXRpb24gaXMgY29uc2lzdGVudCB0byB0aGUKKwkgKiBpbmZvcm1hdGlvbiBzdG9yZWQgaW4gdGhlIHZvbHVtZSB0YWJsZS4KKwkgKi8KKwllcnIgPSBjaGVja19zY2FubmluZ19pbmZvKHViaSwgc2kpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X2ZyZWU7CisKKwlyZXR1cm4gMDsKKworb3V0X2ZyZWU6CisJa2ZyZWUodWJpLT52dGJsKTsKKwlmb3IgKGkgPSAwOyBpIDwgdWJpLT52dGJsX3Nsb3RzICsgVUJJX0lOVF9WT0xfQ09VTlQ7IGkrKykKKwkJaWYgKHViaS0+dm9sdW1lc1tpXSkgeworCQkJa2ZyZWUodWJpLT52b2x1bWVzW2ldKTsKKwkJCXViaS0+dm9sdW1lc1tpXSA9IE5VTEw7CisJCX0KKwlyZXR1cm4gZXJyOworfQorCisjaWZkZWYgQ09ORklHX01URF9VQklfREVCVUdfUEFSQU5PSUQKKworLyoqCisgKiBwYXJhbm9pZF92dGJsX2NoZWNrIC0gY2hlY2sgdm9sdW1lIHRhYmxlLgorICogQHViaTogVUJJIGRldmljZSBkZXNjcmlwdGlvbiBvYmplY3QKKyAqLworc3RhdGljIHZvaWQgcGFyYW5vaWRfdnRibF9jaGVjayhjb25zdCBzdHJ1Y3QgdWJpX2RldmljZSAqdWJpKQoreworCWlmICh2dGJsX2NoZWNrKHViaSwgdWJpLT52dGJsKSkgeworCQl1YmlfZXJyKCJwYXJhbm9pZCBjaGVjayBmYWlsZWQiKTsKKwkJQlVHKCk7CisJfQorfQorCisjZW5kaWYgLyogQ09ORklHX01URF9VQklfREVCVUdfUEFSQU5PSUQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL3ViaS93bC5jIGIvZHJpdmVycy9tdGQvdWJpL3dsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVjYWY3NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbXRkL3ViaS93bC5jCkBAIC0wLDAgKzEsMTY3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiwgMjAwNgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUKKyAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiBBdXRob3JzOiBBcnRlbSBCaXR5dXRza2l5ICjQkdC40YLRjtGG0LrQuNC5INCQ0YDRgtGR0LwpLCBUaG9tYXMgR2xlaXhuZXIKKyAqLworCisvKgorICogVUJJIHdlYXItbGV2ZWxpbmcgdW5pdC4KKyAqCisgKiBUaGlzIHVuaXQgaXMgcmVzcG9uc2libGUgZm9yIHdlYXItbGV2ZWxpbmcuIEl0IHdvcmtzIGluIHRlcm1zIG9mIHBoeXNpY2FsCisgKiBlcmFzZWJsb2NrcyBhbmQgZXJhc2UgY291bnRlcnMgYW5kIGtub3dzIG5vdGhpbmcgYWJvdXQgbG9naWNhbCBlcmFzZWJsb2NrcywKKyAqIHZvbHVtZXMsIGV0Yy4gRnJvbSB0aGlzIHVuaXQncyBwZXJzcGVjdGl2ZSBhbGwgcGh5c2ljYWwgZXJhc2VibG9ja3MgYXJlIG9mCisgKiB0d28gdHlwZXMgLSB1c2VkIGFuZCBmcmVlLiBVc2VkIHBoeXNpY2FsIGVyYXNlYmxvY2tzIGFyZSB0aG9zZSB0aGF0IHdlcmUKKyAqICJnZXQiIGJ5IHRoZSAndWJpX3dsX2dldF9wZWIoKScgZnVuY3Rpb24sIGFuZCBmcmVlIHBoeXNpY2FsIGVyYXNlYmxvY2tzIGFyZQorICogdGhvc2UgdGhhdCB3ZXJlIHB1dCBieSB0aGUgJ3ViaV93bF9wdXRfcGViKCknIGZ1bmN0aW9uLgorICoKKyAqIFBoeXNpY2FsIGVyYXNlYmxvY2tzIHJldHVybmVkIGJ5ICd1Ymlfd2xfZ2V0X3BlYigpJyBoYXZlIG9ubHkgZXJhc2UgY291bnRlcgorICogaGVhZGVyLiBUaGUgcmVzdCBvZiB0aGUgcGh5c2ljYWwgZXJhc2VibG9jayBjb250YWlucyBvbmx5IDB4RkYgYnl0ZXMuCisgKgorICogV2hlbiBwaHlzaWNhbCBlcmFzZWJsb2NrcyBhcmUgcmV0dXJuZWQgdG8gdGhlIFdMIHVuaXQgYnkgbWVhbnMgb2YgdGhlCisgKiAndWJpX3dsX3B1dF9wZWIoKScgZnVuY3Rpb24sIHRoZXkgYXJlIHNjaGVkdWxlZCBmb3IgZXJhc3VyZS4gVGhlIGVyYXN1cmUgaXMKKyAqIGRvbmUgYXN5bmNocm9ub3VzbHkgaW4gY29udGV4dCBvZiB0aGUgcGVyLVVCSSBkZXZpY2UgYmFja2dyb3VuZCB0aHJlYWQsCisgKiB3aGljaCBpcyBhbHNvIG1hbmFnZWQgYnkgdGhlIFdMIHVuaXQuCisgKgorICogVGhlIHdlYXItbGV2ZWxpbmcgaXMgZW5zdXJlZCBieSBtZWFucyBvZiBtb3ZpbmcgdGhlIGNvbnRlbnRzIG9mIHVzZWQKKyAqIHBoeXNpY2FsIGVyYXNlYmxvY2tzIHdpdGggbG93IGVyYXNlIGNvdW50ZXIgdG8gZnJlZSBwaHlzaWNhbCBlcmFzZWJsb2NrcworICogd2l0aCBoaWdoIGVyYXNlIGNvdW50ZXIuCisgKgorICogVGhlICd1Ymlfd2xfZ2V0X3BlYigpJyBmdW5jdGlvbiBhY2NlcHRzIGRhdGEgdHlwZSBoaW50cyB3aGljaCBoZWxwIHRvIHBpY2sKKyAqIGFuICJvcHRpbWFsIiBwaHlzaWNhbCBlcmFzZWJsb2NrLiBGb3IgZXhhbXBsZSwgd2hlbiBpdCBpcyBrbm93biB0aGF0IHRoZQorICogcGh5c2ljYWwgZXJhc2VibG9jayB3aWxsIGJlICJwdXQiIHNvb24gYmVjYXVzZSBpdCBjb250YWlucyBzaG9ydC10ZXJtIGRhdGEsCisgKiB0aGUgV0wgdW5pdCBtYXkgcGljayBhIGZyZWUgcGh5c2ljYWwgZXJhc2VibG9jayB3aXRoIGxvdyBlcmFzZSBjb3VudGVyLCBhbmQKKyAqIHNvIGZvcnRoLgorICoKKyAqIElmIHRoZSBXTCB1bml0IGZhaWxzIHRvIGVyYXNlIGEgcGh5c2ljYWwgZXJhc2VibG9jaywgaXQgbWFya3MgaXQgYXMgYmFkLgorICoKKyAqIFRoaXMgdW5pdCBpcyBhbHNvIHJlc3BvbnNpYmxlIGZvciBzY3J1YmJpbmcuIElmIGEgYml0LWZsaXAgaXMgZGV0ZWN0ZWQgaW4gYQorICogcGh5c2ljYWwgZXJhc2VibG9jaywgaXQgaGFzIHRvIGJlIG1vdmVkLiBUZWNobmljYWxseSB0aGlzIGlzIHRoZSBzYW1lIGFzCisgKiBtb3ZpbmcgaXQgZm9yIHdlYXItbGV2ZWxpbmcgcmVhc29ucy4KKyAqCisgKiBBcyBpdCB3YXMgc2FpZCwgZm9yIHRoZSBVQkkgdW5pdCBhbGwgcGh5c2ljYWwgZXJhc2VibG9ja3MgYXJlIGVpdGhlciAiZnJlZSIKKyAqIG9yICJ1c2VkIi4gRnJlZSBlcmFzZWJsb2NrIGFyZSBrZXB0IGluIHRoZSBAd2wtPmZyZWUgUkItdHJlZSwgd2hpbGUgdXNlZAorICogZXJhc2VibG9ja3MgYXJlIGtlcHQgaW4gYSBzZXQgb2YgZGlmZmVyZW50IFJCLXRyZWVzOiBAd2wtPnVzZWQsCisgKiBAd2wtPnByb3QucG51bSwgQHdsLT5wcm90LmFlYywgYW5kIEB3bC0+c2NydWIuCisgKgorICogTm90ZSwgaW4gdGhpcyBpbXBsZW1lbnRhdGlvbiwgd2Uga2VlcCBhIHNtYWxsIGluLVJBTSBvYmplY3QgZm9yIGVhY2ggcGh5c2ljYWwKKyAqIGVyYXNlYmxvY2suIFRoaXMgaXMgc3VyZWx5IG5vdCBhIHNjYWxhYmxlIHNvbHV0aW9uLiBCdXQgaXQgYXBwZWFycyB0byBiZSBnb29kCisgKiBlbm91Z2ggZm9yIG1vZGVyYXRlbHkgbGFyZ2UgZmxhc2hlcyBhbmQgaXQgaXMgc2ltcGxlLiBJbiBmdXR1cmUsIG9uZSBtYXkKKyAqIHJlLXdvcmsgdGhpcyB1bml0IGFuZCBtYWtlIGl0IG1vcmUgc2NhbGFibGUuCisgKgorICogQXQgdGhlIG1vbWVudCB0aGlzIHVuaXQgZG9lcyBub3QgdXRpbGl6ZSB0aGUgc2VxdWVuY2UgbnVtYmVyLCB3aGljaCB3YXMKKyAqIGludHJvZHVjZWQgcmVsYXRpdmVseSByZWNlbnRseS4gQnV0IGl0IHdvdWxkIGJlIHdpc2UgdG8gZG8gdGhpcyBiZWNhdXNlIHRoZQorICogc2VxdWVuY2UgbnVtYmVyIG9mIGEgbG9naWNhbCBlcmFzZWJsb2NrIGNoYXJhY3Rlcml6ZXMgaG93IG9sZCBpcyBpdC4gRm9yCisgKiBleGFtcGxlLCB3aGVuIHdlIG1vdmUgYSBQRUIgd2l0aCBsb3cgZXJhc2UgY291bnRlciwgYW5kIHdlIG5lZWQgdG8gcGljayB0aGUKKyAqIHRhcmdldCBQRUIsIHdlIHBpY2sgYSBQRUIgd2l0aCB0aGUgaGlnaGVzdCBFQyBpZiBvdXIgUEVCIGlzICJvbGQiIGFuZCB3ZQorICogcGljayB0YXJnZXQgUEVCIHdpdGggYW4gYXZlcmFnZSBFQyBpZiBvdXIgUEVCIGlzIG5vdCB2ZXJ5ICJvbGQiLiBUaGlzIGlzIGEKKyAqIHJvb20gZm9yIGZ1dHVyZSByZS13b3JrcyBvZiB0aGUgV0wgdW5pdC4KKyAqCisgKiBGSVhNRTogbG9va3MgdG9vIGNvbXBsZXgsIHNob3VsZCBiZSBzaW1wbGlmaWVkIChsYXRlcikuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSAidWJpLmgiCisKKy8qIE51bWJlciBvZiBwaHlzaWNhbCBlcmFzZWJsb2NrcyByZXNlcnZlZCBmb3Igd2Vhci1sZXZlbGluZyBwdXJwb3NlcyAqLworI2RlZmluZSBXTF9SRVNFUlZFRF9QRUJTIDEKKworLyoKKyAqIEhvdyBtYW55IGVyYXNlIGN5Y2xlcyBhcmUgc2hvcnQgdGVybSwgdW5rbm93biwgYW5kIGxvbmcgdGVybSBwaHlzaWNhbAorICogZXJhc2VibG9ja3MgcHJvdGVjdGVkLgorICovCisjZGVmaW5lIFNUX1BST1RFQ1RJT04gMTYKKyNkZWZpbmUgVV9QUk9URUNUSU9OICAxMAorI2RlZmluZSBMVF9QUk9URUNUSU9OIDQKKworLyoKKyAqIE1heGltdW0gZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBlcmFzZSBjb3VudGVycy4gSWYgdGhpcyB0aHJlc2hvbGQgaXMKKyAqIGV4Y2VlZGVkLCB0aGUgV0wgdW5pdCBzdGFydHMgbW92aW5nIGRhdGEgZnJvbSB1c2VkIHBoeXNpY2FsIGVyYXNlYmxvY2tzIHdpdGgKKyAqIGxvdyBlcmFzZSBjb3VudGVyIHRvIGZyZWUgcGh5c2ljYWwgZXJhc2VibG9ja3Mgd2l0aCBoaWdoIGVyYXNlIGNvdW50ZXIuCisgKi8KKyNkZWZpbmUgVUJJX1dMX1RIUkVTSE9MRCBDT05GSUdfTVREX1VCSV9XTF9USFJFU0hPTEQKKworLyoKKyAqIFdoZW4gYSBwaHlzaWNhbCBlcmFzZWJsb2NrIGlzIG1vdmVkLCB0aGUgV0wgdW5pdCBoYXMgdG8gcGljayB0aGUgdGFyZ2V0CisgKiBwaHlzaWNhbCBlcmFzZWJsb2NrIHRvIG1vdmUgdG8uIFRoZSBzaW1wbGVzdCB3YXkgd291bGQgYmUganVzdCB0byBwaWNrIHRoZQorICogb25lIHdpdGggdGhlIGhpZ2hlc3QgZXJhc2UgY291bnRlci4gQnV0IGluIGNlcnRhaW4gd29ya2xvYWRzIHRoaXMgY291bGQgbGVhZAorICogdG8gYW4gdW5saW1pdGVkIHdlYXIgb2Ygb25lIG9yIGZldyBwaHlzaWNhbCBlcmFzZWJsb2NrLiBJbmRlZWQsIGltYWdpbmUgYQorICogc2l0dWF0aW9uIHdoZW4gdGhlIHBpY2tlZCBwaHlzaWNhbCBlcmFzZWJsb2NrIGlzIGNvbnN0YW50bHkgZXJhc2VkIGFmdGVyIHRoZQorICogZGF0YSBpcyB3cml0dGVuIHRvIGl0LiBTbywgd2UgaGF2ZSBhIGNvbnN0YW50IHdoaWNoIGxpbWl0cyB0aGUgaGlnaGVzdCBlcmFzZQorICogY291bnRlciBvZiB0aGUgZnJlZSBwaHlzaWNhbCBlcmFzZWJsb2NrIHRvIHBpY2suIE5hbWVseSwgdGhlIFdMIHVuaXQgZG9lcworICogbm90IHBpY2sgZXJhc2VibG9ja3Mgd2l0aCBlcmFzZSBjb3VudGVyIGdyZWF0ZXIgdGhlbiB0aGUgbG93ZXN0IGVyYXNlCisgKiBjb3VudGVyIHBsdXMgJVdMX0ZSRUVfTUFYX0RJRkYuCisgKi8KKyNkZWZpbmUgV0xfRlJFRV9NQVhfRElGRiAoMipVQklfV0xfVEhSRVNIT0xEKQorCisvKgorICogTWF4aW11bSBudW1iZXIgb2YgY29uc2VjdXRpdmUgYmFja2dyb3VuZCB0aHJlYWQgZmFpbHVyZXMgd2hpY2ggaXMgZW5vdWdoIHRvCisgKiBzd2l0Y2ggdG8gcmVhZC1vbmx5IG1vZGUuCisgKi8KKyNkZWZpbmUgV0xfTUFYX0ZBSUxVUkVTIDMyCisKKy8qKgorICogc3RydWN0IHViaV93bF9lbnRyeSAtIHdlYXItbGV2ZWxpbmcgZW50cnkuCisgKiBAcmI6IGxpbmsgaW4gdGhlIGNvcnJlc3BvbmRpbmcgUkItdHJlZQorICogQGVjOiBlcmFzZSBjb3VudGVyCisgKiBAcG51bTogcGh5c2ljYWwgZXJhc2VibG9jayBudW1iZXIKKyAqCisgKiBFYWNoIHBoeXNpY2FsIGVyYXNlYmxvY2sgaGFzIGEgY29ycmVzcG9uZGluZyAmc3RydWN0IHdsX2VudHJ5IG9iamVjdCB3aGljaAorICogbWF5IGJlIGtlcHQgaW4gZGlmZmVyZW50IFJCLXRyZWVzLgorICovCitzdHJ1Y3QgdWJpX3dsX2VudHJ5IHsKKwlzdHJ1Y3QgcmJfbm9kZSByYjsKKwlpbnQgZWM7CisJaW50IHBudW07Cit9OworCisvKioKKyAqIHN0cnVjdCB1Ymlfd2xfcHJvdF9lbnRyeSAtIFBFQiBwcm90ZWN0aW9uIGVudHJ5LgorICogQHJiX3BudW06IGxpbmsgaW4gdGhlIEB3bC0+cHJvdC5wbnVtIFJCLXRyZWUKKyAqIEByYl9hZWM6IGxpbmsgaW4gdGhlIEB3bC0+cHJvdC5hZWMgUkItdHJlZQorICogQGFic19lYzogdGhlIGFic29sdXRlIGVyYXNlIGNvdW50ZXIgdmFsdWUgd2hlbiB0aGUgcHJvdGVjdGlvbiBlbmRzCisgKiBAZTogdGhlIHdlYXItbGV2ZWxpbmcgZW50cnkgb2YgdGhlIHBoeXNpY2FsIGVyYXNlYmxvY2sgdW5kZXIgcHJvdGVjdGlvbgorICoKKyAqIFdoZW4gdGhlIFdMIHVuaXQgcmV0dXJucyBhIHBoeXNpY2FsIGVyYXNlYmxvY2ssIHRoZSBwaHlzaWNhbCBlcmFzZWJsb2NrIGlzCisgKiBwcm90ZWN0ZWQgZnJvbSBiZWluZyBtb3ZlZCBmb3Igc29tZSAidGltZSIuIEZvciB0aGlzIHJlYXNvbiwgdGhlIHBoeXNpY2FsCisgKiBlcmFzZWJsb2NrIGlzIG5vdCBkaXJlY3RseSBtb3ZlZCBmcm9tIHRoZSBAd2wtPmZyZWUgdHJlZSB0byB0aGUgQHdsLT51c2VkCisgKiB0cmVlLiBUaGVyZSBpcyBvbmUgbW9yZSB0cmVlIGluIGJldHdlZW4gd2hlcmUgdGhpcyBwaHlzaWNhbCBlcmFzZWJsb2NrIGlzCisgKiB0ZW1wb3JhcmlseSBzdG9yZWQgKEB3bC0+cHJvdCkuCisgKgorICogQWxsIHRoaXMgcHJvdGVjdGlvbiBzdHVmZiBpcyBuZWVkZWQgYmVjYXVzZToKKyAqICBvIHdlIGRvbid0IHdhbnQgdG8gbW92ZSBwaHlzaWNhbCBlcmFzZWJsb2NrcyBqdXN0IGFmdGVyIHdlIGhhdmUgZ2l2ZW4gdGhlbQorICogICAgdG8gdGhlIHVzZXI7IGluc3RlYWQsIHdlIGZpcnN0IHdhbnQgdG8gbGV0IHVzZXJzIGZpbGwgdGhlbSB1cCB3aXRoIGRhdGE7CisgKgorICogIG8gdGhlcmUgaXMgYSBjaGFuY2UgdGhhdCB0aGUgdXNlciB3aWxsIHB1dCB0aGUgcGh5c2ljYWwgZXJhc2VibG9jayB2ZXJ5CisgKiAgICBzb29uLCBzbyBpdCBtYWtlcyBzZW5zZSBub3QgdG8gbW92ZSBpdCBmb3Igc29tZSB0aW1lLCBidXQgd2FpdDsgdGhpcyBpcworICogICAgZXNwZWNpYWxseSBpbXBvcnRhbnQgaW4gY2FzZSBvZiAic2hvcnQgdGVybSIgcGh5c2ljYWwgZXJhc2VibG9ja3MuCisgKgorICogUGh5c2ljYWwgZXJhc2VibG9ja3Mgc3RheSBwcm90ZWN0ZWQgb25seSBmb3IgbGltaXRlZCB0aW1lLiBCdXQgdGhlICJ0aW1lIiBpcworICogbWVhc3VyZWQgaW4gZXJhc2UgY3ljbGVzIGluIHRoaXMgY2FzZS4gVGhpcyBpcyBpbXBsZW1lbnRlZCB3aXRoIGhlbHAgb2YgdGhlCisgKiBhYnNvbHV0ZSBlcmFzZSBjb3VudGVyIChAd2wtPmFic19lYykuIFdoZW4gaXQgcmVhY2hlcyBjZXJ0YWluIHZhbHVlLCB0aGUKKyAqIHBoeXNpY2FsIGVyYXNlYmxvY2tzIGFyZSBtb3ZlZCBmcm9tIHRoZSBwcm90ZWN0aW9uIHRyZWVzIChAd2wtPnByb3QuKikgdG8KKyAqIHRoZSBAd2wtPnVzZWQgdHJlZS4KKyAqCisgKiBQcm90ZWN0ZWQgcGh5c2ljYWwgZXJhc2VibG9ja3MgYXJlIHNlYXJjaGVkIGJ5IHBoeXNpY2FsIGVyYXNlYmxvY2sgbnVtYmVyCisgKiAod2hlbiB0aGV5IGFyZSBwdXQpIGFuZCBieSB0aGUgYWJzb2x1dGUgZXJhc2UgY291bnRlciAodG8gY2hlY2sgaWYgaXQgaXMKKyAqIHRpbWUgdG8gbW92ZSB0aGVtIHRvIHRoZSBAd2wtPnVzZWQgdHJlZSkuIFNvIHRoZXJlIGFyZSBhY3R1YWxseSAyIFJCLXRyZWVzCisgKiBzdG9yaW5nIHRoZSBwcm90ZWN0ZWQgcGh5c2ljYWwgZXJhc2VibG9ja3M6IEB3bC0+cHJvdC5wbnVtIGFuZAorICogQHdsLT5wcm90LmFlYy4gVGhleSBhcmUgcmVmZXJyZWQgdG8gYXMgdGhlICJwcm90ZWN0aW9uIiB0cmVlcy4gVGhlCisgKiBmaXJzdCBvbmUgaXMgaW5kZXhlZCBieSB0aGUgcGh5c2ljYWwgZXJhc2VibG9jayBudW1iZXIuIFRoZSBzZWNvbmQgb25lIGlzCisgKiBpbmRleGVkIGJ5IHRoZSBhYnNvbHV0ZSBlcmFzZSBjb3VudGVyLiBCb3RoIHRyZWVzIHN0b3JlCisgKiAmc3RydWN0IHViaV93bF9wcm90X2VudHJ5IG9iamVjdHMuCisgKgorICogRWFjaCBwaHlzaWNhbCBlcmFzZWJsb2NrIGhhcyAyIG1haW4gc3RhdGVzOiBmcmVlIGFuZCB1c2VkLiBUaGUgZm9ybWVyIHN0YXRlCisgKiBjb3JyZXNwb25kcyB0byB0aGUgQHdsLT5mcmVlIHRyZWUuIFRoZSBsYXR0ZXIgc3RhdGUgaXMgc3BsaXQgdXAgb24gc2V2ZXJhbAorICogc3ViLXN0YXRlczoKKyAqIG8gdGhlIFdMIG1vdmVtZW50IGlzIGFsbG93ZWQgKEB3bC0+dXNlZCB0cmVlKTsKKyAqIG8gdGhlIFdMIG1vdmVtZW50IGlzIHRlbXBvcmFyaWx5IHByb2hpYml0ZWQgKEB3bC0+cHJvdC5wbnVtIGFuZAorICogQHdsLT5wcm90LmFlYyB0cmVlcyk7CisgKiBvIHNjcnViYmluZyBpcyBuZWVkZWQgKEB3bC0+c2NydWIgdHJlZSkuCisgKgorICogRGVwZW5kaW5nIG9uIHRoZSBzdWItc3RhdGUsIHdlYXItbGV2ZWxpbmcgZW50cmllcyBvZiB0aGUgdXNlZCBwaHlzaWNhbAorICogZXJhc2VibG9ja3MgbWF5IGJlIGtlcHQgaW4gb25lIG9mIHRob3NlIHRyZWVzLgorICovCitzdHJ1Y3QgdWJpX3dsX3Byb3RfZW50cnkgeworCXN0cnVjdCByYl9ub2RlIHJiX3BudW07CisJc3RydWN0IHJiX25vZGUgcmJfYWVjOworCXVuc2lnbmVkIGxvbmcgbG9uZyBhYnNfZWM7CisJc3RydWN0IHViaV93bF9lbnRyeSAqZTsKK307CisKKy8qKgorICogc3RydWN0IHViaV93b3JrIC0gVUJJIHdvcmsgZGVzY3JpcHRpb24gZGF0YSBzdHJ1Y3R1cmUuCisgKiBAbGlzdDogYSBsaW5rIGluIHRoZSBsaXN0IG9mIHBlbmRpbmcgd29ya3MKKyAqIEBmdW5jOiB3b3JrZXIgZnVuY3Rpb24KKyAqIEBwcml2OiBwcml2YXRlIGRhdGEgb2YgdGhlIHdvcmtlciBmdW5jdGlvbgorICoKKyAqIEBlOiBwaHlzaWNhbCBlcmFzZWJsb2NrIHRvIGVyYXNlCisgKiBAdG9ydHVyZTogaWYgdGhlIHBoeXNpY2FsIGVyYXNlYmxvY2sgaGFzIHRvIGJlIHRvcnR1cmVkCisgKgorICogVGhlIEBmdW5jIHBvaW50ZXIgcG9pbnRzIHRvIHRoZSB3b3JrZXIgZnVuY3Rpb24uIElmIHRoZSBAY2FuY2VsIGFyZ3VtZW50IGlzCisgKiBub3QgemVybywgdGhlIHdvcmtlciBoYXMgdG8gZnJlZSB0aGUgcmVzb3VyY2VzIGFuZCBleGl0IGltbWVkaWF0ZWx5LiBUaGUKKyAqIHdvcmtlciBoYXMgdG8gcmV0dXJuIHplcm8gaW4gY2FzZSBvZiBzdWNjZXNzIGFuZCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgaW4KKyAqIGNhc2Ugb2YgZmFpbHVyZS4KKyAqLworc3RydWN0IHViaV93b3JrIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJaW50ICgqZnVuYykoc3RydWN0IHViaV9kZXZpY2UgKnViaSwgc3RydWN0IHViaV93b3JrICp3cmssIGludCBjYW5jZWwpOworCS8qIFRoZSBiZWxvdyBmaWVsZHMgYXJlIG9ubHkgcmVsZXZhbnQgdG8gZXJhc3VyZSB3b3JrcyAqLworCXN0cnVjdCB1Ymlfd2xfZW50cnkgKmU7CisJaW50IHRvcnR1cmU7Cit9OworCisjaWZkZWYgQ09ORklHX01URF9VQklfREVCVUdfUEFSQU5PSUQKK3N0YXRpYyBpbnQgcGFyYW5vaWRfY2hlY2tfZWMoY29uc3Qgc3RydWN0IHViaV9kZXZpY2UgKnViaSwgaW50IHBudW0sIGludCBlYyk7CitzdGF0aWMgaW50IHBhcmFub2lkX2NoZWNrX2luX3dsX3RyZWUoc3RydWN0IHViaV93bF9lbnRyeSAqZSwKKwkJCQkgICAgIHN0cnVjdCByYl9yb290ICpyb290KTsKKyNlbHNlCisjZGVmaW5lIHBhcmFub2lkX2NoZWNrX2VjKHViaSwgcG51bSwgZWMpIDAKKyNkZWZpbmUgcGFyYW5vaWRfY2hlY2tfaW5fd2xfdHJlZShlLCByb290KQorI2VuZGlmCisKKy8qIFNsYWIgY2FjaGUgZm9yIHdlYXItbGV2ZWxpbmcgZW50cmllcyAqLworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICp3bF9lbnRyaWVzX3NsYWI7CisKKy8qKgorICogdHJlZV9lbXB0eSAtIGEgaGVscGVyIGZ1bmN0aW9uIHRvIGNoZWNrIGlmIGFuIFJCLXRyZWUgaXMgZW1wdHkuCisgKiBAcm9vdDogdGhlIHJvb3Qgb2YgdGhlIHRyZWUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgbm9uLXplcm8gaWYgdGhlIFJCLXRyZWUgaXMgZW1wdHkgYW5kIHplcm8gaWYgbm90LgorICovCitzdGF0aWMgaW5saW5lIGludCB0cmVlX2VtcHR5KHN0cnVjdCByYl9yb290ICpyb290KQoreworCXJldHVybiByb290LT5yYl9ub2RlID09IE5VTEw7Cit9CisKKy8qKgorICogd2xfdHJlZV9hZGQgLSBhZGQgYSB3ZWFyLWxldmVsaW5nIGVudHJ5IHRvIGEgV0wgUkItdHJlZS4KKyAqIEBlOiB0aGUgd2Vhci1sZXZlbGluZyBlbnRyeSB0byBhZGQKKyAqIEByb290OiB0aGUgcm9vdCBvZiB0aGUgdHJlZQorICoKKyAqIE5vdGUsIHdlIHVzZSAoZXJhc2UgY291bnRlciwgcGh5c2ljYWwgZXJhc2VibG9jayBudW1iZXIpIHBhaXJzIGFzIGtleXMgaW4KKyAqIHRoZSBAdWJpLT51c2VkIGFuZCBAdWJpLT5mcmVlIFJCLXRyZWVzLgorICovCitzdGF0aWMgdm9pZCB3bF90cmVlX2FkZChzdHJ1Y3QgdWJpX3dsX2VudHJ5ICplLCBzdHJ1Y3QgcmJfcm9vdCAqcm9vdCkKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqKnAsICpwYXJlbnQgPSBOVUxMOworCisJcCA9ICZyb290LT5yYl9ub2RlOworCXdoaWxlICgqcCkgeworCQlzdHJ1Y3QgdWJpX3dsX2VudHJ5ICplMTsKKworCQlwYXJlbnQgPSAqcDsKKwkJZTEgPSByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCB1Ymlfd2xfZW50cnksIHJiKTsKKworCQlpZiAoZS0+ZWMgPCBlMS0+ZWMpCisJCQlwID0gJigqcCktPnJiX2xlZnQ7CisJCWVsc2UgaWYgKGUtPmVjID4gZTEtPmVjKQorCQkJcCA9ICYoKnApLT5yYl9yaWdodDsKKwkJZWxzZSB7CisJCQl1YmlfYXNzZXJ0KGUtPnBudW0gIT0gZTEtPnBudW0pOworCQkJaWYgKGUtPnBudW0gPCBlMS0+cG51bSkKKwkJCQlwID0gJigqcCktPnJiX2xlZnQ7CisJCQllbHNlCisJCQkJcCA9ICYoKnApLT5yYl9yaWdodDsKKwkJfQorCX0KKworCXJiX2xpbmtfbm9kZSgmZS0+cmIsIHBhcmVudCwgcCk7CisJcmJfaW5zZXJ0X2NvbG9yKCZlLT5yYiwgcm9vdCk7Cit9CisKKworLyoKKyAqIEhlbHBlciBmdW5jdGlvbnMgdG8gYWRkIGFuZCBkZWxldGUgd2Vhci1sZXZlbGluZyBlbnRyaWVzIGZyb20gZGlmZmVyZW50CisgKiB0cmVlcy4KKyAqLworCitzdGF0aWMgdm9pZCBmcmVlX3RyZWVfYWRkKHN0cnVjdCB1YmlfZGV2aWNlICp1YmksIHN0cnVjdCB1Ymlfd2xfZW50cnkgKmUpCit7CisJd2xfdHJlZV9hZGQoZSwgJnViaS0+ZnJlZSk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgdXNlZF90cmVlX2FkZChzdHJ1Y3QgdWJpX2RldmljZSAqdWJpLAorCQkJCSBzdHJ1Y3QgdWJpX3dsX2VudHJ5ICplKQoreworCXdsX3RyZWVfYWRkKGUsICZ1YmktPnVzZWQpOworfQorc3RhdGljIGlubGluZSB2b2lkIHNjcnViX3RyZWVfYWRkKHN0cnVjdCB1YmlfZGV2aWNlICp1YmksCisJCQkJICBzdHJ1Y3QgdWJpX3dsX2VudHJ5ICplKQoreworCXdsX3RyZWVfYWRkKGUsICZ1YmktPnNjcnViKTsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBmcmVlX3RyZWVfZGVsKHN0cnVjdCB1YmlfZGV2aWNlICp1YmksCisJCQkJIHN0cnVjdCB1Ymlfd2xfZW50cnkgKmUpCit7CisJcGFyYW5vaWRfY2hlY2tfaW5fd2xfdHJlZShlLCAmdWJpLT5mcmVlKTsKKwlyYl9lcmFzZSgmZS0+cmIsICZ1YmktPmZyZWUpOworfQorc3RhdGljIGlubGluZSB2b2lkIHVzZWRfdHJlZV9kZWwoc3RydWN0IHViaV9kZXZpY2UgKnViaSwKKwkJCQkgc3RydWN0IHViaV93bF9lbnRyeSAqZSkKK3sKKwlwYXJhbm9pZF9jaGVja19pbl93bF90cmVlKGUsICZ1YmktPnVzZWQpOworCXJiX2VyYXNlKCZlLT5yYiwgJnViaS0+dXNlZCk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgc2NydWJfdHJlZV9kZWwoc3RydWN0IHViaV9kZXZpY2UgKnViaSwKKwkJCQkgIHN0cnVjdCB1Ymlfd2xfZW50cnkgKmUpCit7CisJcGFyYW5vaWRfY2hlY2tfaW5fd2xfdHJlZShlLCAmdWJpLT5zY3J1Yik7CisJcmJfZXJhc2UoJmUtPnJiLCAmdWJpLT5zY3J1Yik7Cit9CisKKy8qKgorICogZG9fd29yayAtIGRvIG9uZSBwZW5kaW5nIHdvcmsuCisgKiBAdWJpOiBVQkkgZGV2aWNlIGRlc2NyaXB0aW9uIG9iamVjdAorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB6ZXJvIGluIGNhc2Ugb2Ygc3VjY2VzcyBhbmQgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIGluCisgKiBjYXNlIG9mIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQgZG9fd29yayhzdHJ1Y3QgdWJpX2RldmljZSAqdWJpKQoreworCWludCBlcnI7CisJc3RydWN0IHViaV93b3JrICp3cms7CisKKwlzcGluX2xvY2soJnViaS0+d2xfbG9jayk7CisKKwlpZiAobGlzdF9lbXB0eSgmdWJpLT53b3JrcykpIHsKKwkJc3Bpbl91bmxvY2soJnViaS0+d2xfbG9jayk7CisJCXJldHVybiAwOworCX0KKworCXdyayA9IGxpc3RfZW50cnkodWJpLT53b3Jrcy5uZXh0LCBzdHJ1Y3QgdWJpX3dvcmssIGxpc3QpOworCWxpc3RfZGVsKCZ3cmstPmxpc3QpOworCXNwaW5fdW5sb2NrKCZ1YmktPndsX2xvY2spOworCisJLyoKKwkgKiBDYWxsIHRoZSB3b3JrZXIgZnVuY3Rpb24uIERvIG5vdCB0b3VjaCB0aGUgd29yayBzdHJ1Y3R1cmUKKwkgKiBhZnRlciB0aGlzIGNhbGwgYXMgaXQgd2lsbCBoYXZlIGJlZW4gZnJlZWQgb3IgcmV1c2VkIGJ5IHRoYXQKKwkgKiB0aW1lIGJ5IHRoZSB3b3JrZXIgZnVuY3Rpb24uCisJICovCisJZXJyID0gd3JrLT5mdW5jKHViaSwgd3JrLCAwKTsKKwlpZiAoZXJyKQorCQl1YmlfZXJyKCJ3b3JrIGZhaWxlZCB3aXRoIGVycm9yIGNvZGUgJWQiLCBlcnIpOworCisJc3Bpbl9sb2NrKCZ1YmktPndsX2xvY2spOworCXViaS0+d29ya3NfY291bnQgLT0gMTsKKwl1YmlfYXNzZXJ0KHViaS0+d29ya3NfY291bnQgPj0gMCk7CisJc3Bpbl91bmxvY2soJnViaS0+d2xfbG9jayk7CisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKiBwcm9kdWNlX2ZyZWVfcGViIC0gcHJvZHVjZSBhIGZyZWUgcGh5c2ljYWwgZXJhc2VibG9jay4KKyAqIEB1Ymk6IFVCSSBkZXZpY2UgZGVzY3JpcHRpb24gb2JqZWN0CisgKgorICogVGhpcyBmdW5jdGlvbiB0cmllcyB0byBtYWtlIGEgZnJlZSBQRUIgYnkgbWVhbnMgb2Ygc3luY2hyb25vdXMgZXhlY3V0aW9uIG9mCisgKiBwZW5kaW5nIHdvcmtzLiBUaGlzIG1heSBiZSBuZWVkZWQgaWYsIGZvciBleGFtcGxlIHRoZSBiYWNrZ3JvdW5kIHRocmVhZCBpcworICogZGlzYWJsZWQuIFJldHVybnMgemVybyBpbiBjYXNlIG9mIHN1Y2Nlc3MgYW5kIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBpbiBjYXNlCisgKiBvZiBmYWlsdXJlLgorICovCitzdGF0aWMgaW50IHByb2R1Y2VfZnJlZV9wZWIoc3RydWN0IHViaV9kZXZpY2UgKnViaSkKK3sKKwlpbnQgZXJyOworCisJc3Bpbl9sb2NrKCZ1YmktPndsX2xvY2spOworCXdoaWxlICh0cmVlX2VtcHR5KCZ1YmktPmZyZWUpKSB7CisJCXNwaW5fdW5sb2NrKCZ1YmktPndsX2xvY2spOworCisJCWRiZ193bCgiZG8gb25lIHdvcmsgc3luY2hyb25vdXNseSIpOworCQllcnIgPSBkb193b3JrKHViaSk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCisJCXNwaW5fbG9jaygmdWJpLT53bF9sb2NrKTsKKwl9CisJc3Bpbl91bmxvY2soJnViaS0+d2xfbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBpbl93bF90cmVlIC0gY2hlY2sgaWYgd2Vhci1sZXZlbGluZyBlbnRyeSBpcyBwcmVzZW50IGluIGEgV0wgUkItdHJlZS4KKyAqIEBlOiB0aGUgd2Vhci1sZXZlbGluZyBlbnRyeSB0byBjaGVjaworICogQHJvb3Q6IHRoZSByb290IG9mIHRoZSB0cmVlCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIG5vbi16ZXJvIGlmIEBlIGlzIGluIHRoZSBAcm9vdCBSQi10cmVlIGFuZCB6ZXJvIGlmIGl0CisgKiBpcyBub3QuCisgKi8KK3N0YXRpYyBpbnQgaW5fd2xfdHJlZShzdHJ1Y3QgdWJpX3dsX2VudHJ5ICplLCBzdHJ1Y3QgcmJfcm9vdCAqcm9vdCkKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqcDsKKworCXAgPSByb290LT5yYl9ub2RlOworCXdoaWxlIChwKSB7CisJCXN0cnVjdCB1Ymlfd2xfZW50cnkgKmUxOworCisJCWUxID0gcmJfZW50cnkocCwgc3RydWN0IHViaV93bF9lbnRyeSwgcmIpOworCisJCWlmIChlLT5wbnVtID09IGUxLT5wbnVtKSB7CisJCQl1YmlfYXNzZXJ0KGUgPT0gZTEpOworCQkJcmV0dXJuIDE7CisJCX0KKworCQlpZiAoZS0+ZWMgPCBlMS0+ZWMpCisJCQlwID0gcC0+cmJfbGVmdDsKKwkJZWxzZSBpZiAoZS0+ZWMgPiBlMS0+ZWMpCisJCQlwID0gcC0+cmJfcmlnaHQ7CisJCWVsc2UgeworCQkJdWJpX2Fzc2VydChlLT5wbnVtICE9IGUxLT5wbnVtKTsKKwkJCWlmIChlLT5wbnVtIDwgZTEtPnBudW0pCisJCQkJcCA9IHAtPnJiX2xlZnQ7CisJCQllbHNlCisJCQkJcCA9IHAtPnJiX3JpZ2h0OworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogcHJvdF90cmVlX2FkZCAtIGFkZCBwaHlzaWNhbCBlcmFzZWJsb2NrIHRvIHByb3RlY3Rpb24gdHJlZXMuCisgKiBAdWJpOiBVQkkgZGV2aWNlIGRlc2NyaXB0aW9uIG9iamVjdAorICogQGU6IHRoZSBwaHlzaWNhbCBlcmFzZWJsb2NrIHRvIGFkZAorICogQHBlOiBwcm90ZWN0aW9uIGVudHJ5IG9iamVjdCB0byB1c2UKKyAqIEBhYnNfZWM6IGFic29sdXRlIGVyYXNlIGNvdW50ZXIgdmFsdWUgd2hlbiB0aGlzIHBoeXNpY2FsIGVyYXNlYmxvY2sgaGFzCisgKiB0byBiZSByZW1vdmVkIGZyb20gdGhlIHByb3RlY3Rpb24gdHJlZXMuCisgKgorICogQHdsLT5sb2NrIGhhcyB0byBiZSBsb2NrZWQuCisgKi8KK3N0YXRpYyB2b2lkIHByb3RfdHJlZV9hZGQoc3RydWN0IHViaV9kZXZpY2UgKnViaSwgc3RydWN0IHViaV93bF9lbnRyeSAqZSwKKwkJCSAgc3RydWN0IHViaV93bF9wcm90X2VudHJ5ICpwZSwgaW50IGFic19lYykKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqKnAsICpwYXJlbnQgPSBOVUxMOworCXN0cnVjdCB1Ymlfd2xfcHJvdF9lbnRyeSAqcGUxOworCisJcGUtPmUgPSBlOworCXBlLT5hYnNfZWMgPSB1YmktPmFic19lYyArIGFic19lYzsKKworCXAgPSAmdWJpLT5wcm90LnBudW0ucmJfbm9kZTsKKwl3aGlsZSAoKnApIHsKKwkJcGFyZW50ID0gKnA7CisJCXBlMSA9IHJiX2VudHJ5KHBhcmVudCwgc3RydWN0IHViaV93bF9wcm90X2VudHJ5LCByYl9wbnVtKTsKKworCQlpZiAoZS0+cG51bSA8IHBlMS0+ZS0+cG51bSkKKwkJCXAgPSAmKCpwKS0+cmJfbGVmdDsKKwkJZWxzZQorCQkJcCA9ICYoKnApLT5yYl9yaWdodDsKKwl9CisJcmJfbGlua19ub2RlKCZwZS0+cmJfcG51bSwgcGFyZW50LCBwKTsKKwlyYl9pbnNlcnRfY29sb3IoJnBlLT5yYl9wbnVtLCAmdWJpLT5wcm90LnBudW0pOworCisJcCA9ICZ1YmktPnByb3QuYWVjLnJiX25vZGU7CisJcGFyZW50ID0gTlVMTDsKKwl3aGlsZSAoKnApIHsKKwkJcGFyZW50ID0gKnA7CisJCXBlMSA9IHJiX2VudHJ5KHBhcmVudCwgc3RydWN0IHViaV93bF9wcm90X2VudHJ5LCByYl9hZWMpOworCisJCWlmIChwZS0+YWJzX2VjIDwgcGUxLT5hYnNfZWMpCisJCQlwID0gJigqcCktPnJiX2xlZnQ7CisJCWVsc2UKKwkJCXAgPSAmKCpwKS0+cmJfcmlnaHQ7CisJfQorCXJiX2xpbmtfbm9kZSgmcGUtPnJiX2FlYywgcGFyZW50LCBwKTsKKwlyYl9pbnNlcnRfY29sb3IoJnBlLT5yYl9hZWMsICZ1YmktPnByb3QuYWVjKTsKK30KKworLyoqCisgKiBmaW5kX3dsX2VudHJ5IC0gZmluZCB3ZWFyLWxldmVsaW5nIGVudHJ5IGNsb3Nlc3QgdG8gY2VydGFpbiBlcmFzZSBjb3VudGVyLgorICogQHJvb3Q6IHRoZSBSQi10cmVlIHdoZXJlIHRvIGxvb2sgZm9yCisgKiBAbWF4OiBoaWdoZXN0IHBvc3NpYmxlIGVyYXNlIGNvdW50ZXIKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGxvb2tzIGZvciBhIHdlYXIgbGV2ZWxpbmcgZW50cnkgd2l0aCBlcmFzZSBjb3VudGVyIGNsb3Nlc3QgdG8KKyAqIEBtYXggYW5kIGxlc3MgdGhlbiBAbWF4LgorICovCitzdGF0aWMgc3RydWN0IHViaV93bF9lbnRyeSAqZmluZF93bF9lbnRyeShzdHJ1Y3QgcmJfcm9vdCAqcm9vdCwgaW50IG1heCkKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqcDsKKwlzdHJ1Y3QgdWJpX3dsX2VudHJ5ICplOworCisJZSA9IHJiX2VudHJ5KHJiX2ZpcnN0KHJvb3QpLCBzdHJ1Y3QgdWJpX3dsX2VudHJ5LCByYik7CisJbWF4ICs9IGUtPmVjOworCisJcCA9IHJvb3QtPnJiX25vZGU7CisJd2hpbGUgKHApIHsKKwkJc3RydWN0IHViaV93bF9lbnRyeSAqZTE7CisKKwkJZTEgPSByYl9lbnRyeShwLCBzdHJ1Y3QgdWJpX3dsX2VudHJ5LCByYik7CisJCWlmIChlMS0+ZWMgPj0gbWF4KQorCQkJcCA9IHAtPnJiX2xlZnQ7CisJCWVsc2UgeworCQkJcCA9IHAtPnJiX3JpZ2h0OworCQkJZSA9IGUxOworCQl9CisJfQorCisJcmV0dXJuIGU7Cit9CisKKy8qKgorICogdWJpX3dsX2dldF9wZWIgLSBnZXQgYSBwaHlzaWNhbCBlcmFzZWJsb2NrLgorICogQHViaTogVUJJIGRldmljZSBkZXNjcmlwdGlvbiBvYmplY3QKKyAqIEBkdHlwZTogdHlwZSBvZiBkYXRhIHdoaWNoIHdpbGwgYmUgc3RvcmVkIGluIHRoaXMgcGh5c2ljYWwgZXJhc2VibG9jaworICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHBoeXNpY2FsIGVyYXNlYmxvY2sgaW4gY2FzZSBvZiBzdWNjZXNzIGFuZCBhCisgKiBuZWdhdGl2ZSBlcnJvciBjb2RlIGluIGNhc2Ugb2YgZmFpbHVyZS4gTWlnaHQgc2xlZXAuCisgKi8KK2ludCB1Ymlfd2xfZ2V0X3BlYihzdHJ1Y3QgdWJpX2RldmljZSAqdWJpLCBpbnQgZHR5cGUpCit7CisJaW50IGVyciwgcHJvdGVjdCwgbWVkaXVtX2VjOworCXN0cnVjdCB1Ymlfd2xfZW50cnkgKmUsICpmaXJzdCwgKmxhc3Q7CisJc3RydWN0IHViaV93bF9wcm90X2VudHJ5ICpwZTsKKworCXViaV9hc3NlcnQoZHR5cGUgPT0gVUJJX0xPTkdURVJNIHx8IGR0eXBlID09IFVCSV9TSE9SVFRFUk0gfHwKKwkJICAgZHR5cGUgPT0gVUJJX1VOS05PV04pOworCisJcGUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdWJpX3dsX3Byb3RfZW50cnkpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBlKQorCQlyZXR1cm4gLUVOT01FTTsKKworcmV0cnk6CisJc3Bpbl9sb2NrKCZ1YmktPndsX2xvY2spOworCWlmICh0cmVlX2VtcHR5KCZ1YmktPmZyZWUpKSB7CisJCWlmICh1YmktPndvcmtzX2NvdW50ID09IDApIHsKKwkJCXViaV9hc3NlcnQobGlzdF9lbXB0eSgmdWJpLT53b3JrcykpOworCQkJdWJpX2Vycigibm8gZnJlZSBlcmFzZWJsb2NrcyIpOworCQkJc3Bpbl91bmxvY2soJnViaS0+d2xfbG9jayk7CisJCQlrZnJlZShwZSk7CisJCQlyZXR1cm4gLUVOT1NQQzsKKwkJfQorCQlzcGluX3VubG9jaygmdWJpLT53bF9sb2NrKTsKKworCQllcnIgPSBwcm9kdWNlX2ZyZWVfcGViKHViaSk7CisJCWlmIChlcnIgPCAwKSB7CisJCQlrZnJlZShwZSk7CisJCQlyZXR1cm4gZXJyOworCQl9CisJCWdvdG8gcmV0cnk7CisJfQorCisJc3dpdGNoIChkdHlwZSkgeworCQljYXNlIFVCSV9MT05HVEVSTToKKwkJCS8qCisJCQkgKiBGb3IgbG9uZyB0ZXJtIGRhdGEgd2UgcGljayBhIHBoeXNpY2FsIGVyYXNlYmxvY2sKKwkJCSAqIHdpdGggaGlnaCBlcmFzZSBjb3VudGVyLiBCdXQgdGhlIGhpZ2hlc3QgZXJhc2UKKwkJCSAqIGNvdW50ZXIgd2UgY2FuIHBpY2sgaXMgYm91bmRlZCBieSB0aGUgdGhlIGxvd2VzdAorCQkJICogZXJhc2UgY291bnRlciBwbHVzICVXTF9GUkVFX01BWF9ESUZGLgorCQkJICovCisJCQllID0gZmluZF93bF9lbnRyeSgmdWJpLT5mcmVlLCBXTF9GUkVFX01BWF9ESUZGKTsKKwkJCXByb3RlY3QgPSBMVF9QUk9URUNUSU9OOworCQkJYnJlYWs7CisJCWNhc2UgVUJJX1VOS05PV046CisJCQkvKgorCQkJICogRm9yIHVua25vd24gZGF0YSB3ZSBwaWNrIGEgcGh5c2ljYWwgZXJhc2VibG9jayB3aXRoCisJCQkgKiBtZWRpdW0gZXJhc2UgY291bnRlci4gQnV0IHdlIGJ5IG5vIG1lYW5zIGNhbiBwaWNrIGEKKwkJCSAqIHBoeXNpY2FsIGVyYXNlYmxvY2sgd2l0aCBlcmFzZSBjb3VudGVyIGdyZWF0ZXIgb3IKKwkJCSAqIGVxdWl2YWxlbnQgdGhhbiB0aGUgbG93ZXN0IGVyYXNlIGNvdW50ZXIgcGx1cworCQkJICogJVdMX0ZSRUVfTUFYX0RJRkYuCisJCQkgKi8KKwkJCWZpcnN0ID0gcmJfZW50cnkocmJfZmlyc3QoJnViaS0+ZnJlZSksCisJCQkJCSBzdHJ1Y3QgdWJpX3dsX2VudHJ5LCByYik7CisJCQlsYXN0ID0gcmJfZW50cnkocmJfbGFzdCgmdWJpLT5mcmVlKSwKKwkJCQkJc3RydWN0IHViaV93bF9lbnRyeSwgcmIpOworCisJCQlpZiAobGFzdC0+ZWMgLSBmaXJzdC0+ZWMgPCBXTF9GUkVFX01BWF9ESUZGKQorCQkJCWUgPSByYl9lbnRyeSh1YmktPmZyZWUucmJfbm9kZSwKKwkJCQkJCXN0cnVjdCB1Ymlfd2xfZW50cnksIHJiKTsKKwkJCWVsc2UgeworCQkJCW1lZGl1bV9lYyA9IChmaXJzdC0+ZWMgKyBXTF9GUkVFX01BWF9ESUZGKS8yOworCQkJCWUgPSBmaW5kX3dsX2VudHJ5KCZ1YmktPmZyZWUsIG1lZGl1bV9lYyk7CisJCQl9CisJCQlwcm90ZWN0ID0gVV9QUk9URUNUSU9OOworCQkJYnJlYWs7CisJCWNhc2UgVUJJX1NIT1JUVEVSTToKKwkJCS8qCisJCQkgKiBGb3Igc2hvcnQgdGVybSBkYXRhIHdlIHBpY2sgYSBwaHlzaWNhbCBlcmFzZWJsb2NrCisJCQkgKiB3aXRoIHRoZSBsb3dlc3QgZXJhc2UgY291bnRlciBhcyB3ZSBleHBlY3QgaXQgd2lsbAorCQkJICogYmUgZXJhc2VkIHNvb24uCisJCQkgKi8KKwkJCWUgPSByYl9lbnRyeShyYl9maXJzdCgmdWJpLT5mcmVlKSwKKwkJCQkgICAgIHN0cnVjdCB1Ymlfd2xfZW50cnksIHJiKTsKKwkJCXByb3RlY3QgPSBTVF9QUk9URUNUSU9OOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcm90ZWN0ID0gMDsKKwkJCWUgPSBOVUxMOworCQkJQlVHKCk7CisJfQorCisJLyoKKwkgKiBNb3ZlIHRoZSBwaHlzaWNhbCBlcmFzZWJsb2NrIHRvIHRoZSBwcm90ZWN0aW9uIHRyZWVzIHdoZXJlIGl0IHdpbGwKKwkgKiBiZSBwcm90ZWN0ZWQgZnJvbSBiZWluZyBtb3ZlZCBmb3Igc29tZSB0aW1lLgorCSAqLworCWZyZWVfdHJlZV9kZWwodWJpLCBlKTsKKwlwcm90X3RyZWVfYWRkKHViaSwgZSwgcGUsIHByb3RlY3QpOworCisJZGJnX3dsKCJQRUIgJWQgRUMgJWQsIHByb3RlY3Rpb24gJWQiLCBlLT5wbnVtLCBlLT5lYywgcHJvdGVjdCk7CisJc3Bpbl91bmxvY2soJnViaS0+d2xfbG9jayk7CisKKwlyZXR1cm4gZS0+cG51bTsKK30KKworLyoqCisgKiBwcm90X3RyZWVfZGVsIC0gcmVtb3ZlIGEgcGh5c2ljYWwgZXJhc2VibG9jayBmcm9tIHRoZSBwcm90ZWN0aW9uIHRyZWVzCisgKiBAdWJpOiBVQkkgZGV2aWNlIGRlc2NyaXB0aW9uIG9iamVjdAorICogQHBudW06IHRoZSBwaHlzaWNhbCBlcmFzZWJsb2NrIHRvIHJlbW92ZQorICovCitzdGF0aWMgdm9pZCBwcm90X3RyZWVfZGVsKHN0cnVjdCB1YmlfZGV2aWNlICp1YmksIGludCBwbnVtKQoreworCXN0cnVjdCByYl9ub2RlICpwOworCXN0cnVjdCB1Ymlfd2xfcHJvdF9lbnRyeSAqcGUgPSBOVUxMOworCisJcCA9IHViaS0+cHJvdC5wbnVtLnJiX25vZGU7CisJd2hpbGUgKHApIHsKKworCQlwZSA9IHJiX2VudHJ5KHAsIHN0cnVjdCB1Ymlfd2xfcHJvdF9lbnRyeSwgcmJfcG51bSk7CisKKwkJaWYgKHBudW0gPT0gcGUtPmUtPnBudW0pCisJCQlicmVhazsKKworCQlpZiAocG51bSA8IHBlLT5lLT5wbnVtKQorCQkJcCA9IHAtPnJiX2xlZnQ7CisJCWVsc2UKKwkJCXAgPSBwLT5yYl9yaWdodDsKKwl9CisKKwl1YmlfYXNzZXJ0KHBlLT5lLT5wbnVtID09IHBudW0pOworCXJiX2VyYXNlKCZwZS0+cmJfYWVjLCAmdWJpLT5wcm90LmFlYyk7CisJcmJfZXJhc2UoJnBlLT5yYl9wbnVtLCAmdWJpLT5wcm90LnBudW0pOworCWtmcmVlKHBlKTsKK30KKworLyoqCisgKiBzeW5jX2VyYXNlIC0gc3luY2hyb25vdXNseSBlcmFzZSBhIHBoeXNpY2FsIGVyYXNlYmxvY2suCisgKiBAdWJpOiBVQkkgZGV2aWNlIGRlc2NyaXB0aW9uIG9iamVjdAorICogQGU6IHRoZSB0aGUgcGh5c2ljYWwgZXJhc2VibG9jayB0byBlcmFzZQorICogQHRvcnR1cmU6IGlmIHRoZSBwaHlzaWNhbCBlcmFzZWJsb2NrIGhhcyB0byBiZSB0b3J0dXJlZAorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB6ZXJvIGluIGNhc2Ugb2Ygc3VjY2VzcyBhbmQgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIGluCisgKiBjYXNlIG9mIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQgc3luY19lcmFzZShzdHJ1Y3QgdWJpX2RldmljZSAqdWJpLCBzdHJ1Y3QgdWJpX3dsX2VudHJ5ICplLCBpbnQgdG9ydHVyZSkKK3sKKwlpbnQgZXJyOworCXN0cnVjdCB1YmlfZWNfaGRyICplY19oZHI7CisJdW5zaWduZWQgbG9uZyBsb25nIGVjID0gZS0+ZWM7CisKKwlkYmdfd2woImVyYXNlIFBFQiAlZCwgb2xkIEVDICVsbHUiLCBlLT5wbnVtLCBlYyk7CisKKwllcnIgPSBwYXJhbm9pZF9jaGVja19lYyh1YmksIGUtPnBudW0sIGUtPmVjKTsKKwlpZiAoZXJyID4gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwllY19oZHIgPSBremFsbG9jKHViaS0+ZWNfaGRyX2Fsc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFlY19oZHIpCisJCXJldHVybiAtRU5PTUVNOworCisJZXJyID0gdWJpX2lvX3N5bmNfZXJhc2UodWJpLCBlLT5wbnVtLCB0b3J0dXJlKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBvdXRfZnJlZTsKKworCWVjICs9IGVycjsKKwlpZiAoZWMgPiBVQklfTUFYX0VSQVNFQ09VTlRFUikgeworCQkvKgorCQkgKiBFcmFzZSBjb3VudGVyIG92ZXJmbG93LiBVcGdyYWRlIFVCSSBhbmQgdXNlIDY0LWJpdAorCQkgKiBlcmFzZSBjb3VudGVycyBpbnRlcm5hbGx5LgorCQkgKi8KKwkJdWJpX2VycigiZXJhc2UgY291bnRlciBvdmVyZmxvdyBhdCBQRUIgJWQsIEVDICVsbHUiLAorCQkJZS0+cG51bSwgZWMpOworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIG91dF9mcmVlOworCX0KKworCWRiZ193bCgiZXJhc2VkIFBFQiAlZCwgbmV3IEVDICVsbHUiLCBlLT5wbnVtLCBlYyk7CisKKwllY19oZHItPmVjID0gY3B1X3RvX3ViaTY0KGVjKTsKKworCWVyciA9IHViaV9pb193cml0ZV9lY19oZHIodWJpLCBlLT5wbnVtLCBlY19oZHIpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X2ZyZWU7CisKKwllLT5lYyA9IGVjOworCXNwaW5fbG9jaygmdWJpLT53bF9sb2NrKTsKKwlpZiAoZS0+ZWMgPiB1YmktPm1heF9lYykKKwkJdWJpLT5tYXhfZWMgPSBlLT5lYzsKKwlzcGluX3VubG9jaygmdWJpLT53bF9sb2NrKTsKKworb3V0X2ZyZWU6CisJa2ZyZWUoZWNfaGRyKTsKKwlyZXR1cm4gZXJyOworfQorCisvKioKKyAqIGNoZWNrX3Byb3RlY3Rpb25fb3ZlciAtIGNoZWNrIGlmIGl0IGlzIHRpbWUgdG8gc3RvcCBwcm90ZWN0aW5nIHNvbWUKKyAqIHBoeXNpY2FsIGVyYXNlYmxvY2tzLgorICogQHViaTogVUJJIGRldmljZSBkZXNjcmlwdGlvbiBvYmplY3QKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlciBlYWNoIGVyYXNlIG9wZXJhdGlvbiwgd2hlbiB0aGUgYWJzb2x1dGUgZXJhc2UKKyAqIGNvdW50ZXIgaXMgaW5jcmVtZW50ZWQsIHRvIGNoZWNrIGlmIHNvbWUgcGh5c2ljYWwgZXJhc2VibG9jayAgaGF2ZSBub3QgdG8gYmUKKyAqIHByb3RlY3RlZCBhbnkgbG9uZ2VyLiBUaGVzZSBwaHlzaWNhbCBlcmFzZWJsb2NrcyBhcmUgbW92ZWQgZnJvbSB0aGUKKyAqIHByb3RlY3Rpb24gdHJlZXMgdG8gdGhlIHVzZWQgdHJlZS4KKyAqLworc3RhdGljIHZvaWQgY2hlY2tfcHJvdGVjdGlvbl9vdmVyKHN0cnVjdCB1YmlfZGV2aWNlICp1YmkpCit7CisJc3RydWN0IHViaV93bF9wcm90X2VudHJ5ICpwZTsKKworCS8qCisJICogVGhlcmUgbWF5IGJlIHNldmVyYWwgcHJvdGVjdGVkIHBoeXNpY2FsIGVyYXNlYmxvY2sgdG8gcmVtb3ZlLAorCSAqIHByb2Nlc3MgdGhlbSBhbGwuCisJICovCisJd2hpbGUgKDEpIHsKKwkJc3Bpbl9sb2NrKCZ1YmktPndsX2xvY2spOworCQlpZiAodHJlZV9lbXB0eSgmdWJpLT5wcm90LmFlYykpIHsKKwkJCXNwaW5fdW5sb2NrKCZ1YmktPndsX2xvY2spOworCQkJYnJlYWs7CisJCX0KKworCQlwZSA9IHJiX2VudHJ5KHJiX2ZpcnN0KCZ1YmktPnByb3QuYWVjKSwKKwkJCSAgICAgIHN0cnVjdCB1Ymlfd2xfcHJvdF9lbnRyeSwgcmJfYWVjKTsKKworCQlpZiAocGUtPmFic19lYyA+IHViaS0+YWJzX2VjKSB7CisJCQlzcGluX3VubG9jaygmdWJpLT53bF9sb2NrKTsKKwkJCWJyZWFrOworCQl9CisKKwkJZGJnX3dsKCJQRUIgJWQgcHJvdGVjdGlvbiBvdmVyLCBhYnNfZWMgJWxsdSwgUEVCIGFic19lYyAlbGx1IiwKKwkJICAgICAgIHBlLT5lLT5wbnVtLCB1YmktPmFic19lYywgcGUtPmFic19lYyk7CisJCXJiX2VyYXNlKCZwZS0+cmJfYWVjLCAmdWJpLT5wcm90LmFlYyk7CisJCXJiX2VyYXNlKCZwZS0+cmJfcG51bSwgJnViaS0+cHJvdC5wbnVtKTsKKwkJdXNlZF90cmVlX2FkZCh1YmksIHBlLT5lKTsKKwkJc3Bpbl91bmxvY2soJnViaS0+d2xfbG9jayk7CisKKwkJa2ZyZWUocGUpOworCQljb25kX3Jlc2NoZWQoKTsKKwl9Cit9CisKKy8qKgorICogc2NoZWR1bGVfdWJpX3dvcmsgLSBzY2hlZHVsZSBhIHdvcmsuCisgKiBAdWJpOiBVQkkgZGV2aWNlIGRlc2NyaXB0aW9uIG9iamVjdAorICogQHdyazogdGhlIHdvcmsgdG8gc2NoZWR1bGUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGVucXVldWVzIGEgd29yayBkZWZpbmVkIGJ5IEB3cmsgdG8gdGhlIHRhaWwgb2YgdGhlIHBlbmRpbmcKKyAqIHdvcmtzIGxpc3QuCisgKi8KK3N0YXRpYyB2b2lkIHNjaGVkdWxlX3ViaV93b3JrKHN0cnVjdCB1YmlfZGV2aWNlICp1YmksIHN0cnVjdCB1Ymlfd29yayAqd3JrKQoreworCXNwaW5fbG9jaygmdWJpLT53bF9sb2NrKTsKKwlsaXN0X2FkZF90YWlsKCZ3cmstPmxpc3QsICZ1YmktPndvcmtzKTsKKwl1YmlfYXNzZXJ0KHViaS0+d29ya3NfY291bnQgPj0gMCk7CisJdWJpLT53b3Jrc19jb3VudCArPSAxOworCWlmICh1YmktPnRocmVhZF9lbmFibGVkKQorCQl3YWtlX3VwX3Byb2Nlc3ModWJpLT5iZ3RfdGhyZWFkKTsKKwlzcGluX3VubG9jaygmdWJpLT53bF9sb2NrKTsKK30KKworc3RhdGljIGludCBlcmFzZV93b3JrZXIoc3RydWN0IHViaV9kZXZpY2UgKnViaSwgc3RydWN0IHViaV93b3JrICp3bF93cmssCisJCQlpbnQgY2FuY2VsKTsKKworLyoqCisgKiBzY2hlZHVsZV9lcmFzZSAtIHNjaGVkdWxlIGFuIGVyYXNlIHdvcmsuCisgKiBAdWJpOiBVQkkgZGV2aWNlIGRlc2NyaXB0aW9uIG9iamVjdAorICogQGU6IHRoZSBXTCBlbnRyeSBvZiB0aGUgcGh5c2ljYWwgZXJhc2VibG9jayB0byBlcmFzZQorICogQHRvcnR1cmU6IGlmIHRoZSBwaHlzaWNhbCBlcmFzZWJsb2NrIGhhcyB0byBiZSB0b3J0dXJlZAorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB6ZXJvIGluIGNhc2Ugb2Ygc3VjY2VzcyBhbmQgYSAlLUVOT01FTSBpbiBjYXNlIG9mCisgKiBmYWlsdXJlLgorICovCitzdGF0aWMgaW50IHNjaGVkdWxlX2VyYXNlKHN0cnVjdCB1YmlfZGV2aWNlICp1YmksIHN0cnVjdCB1Ymlfd2xfZW50cnkgKmUsCisJCQkgIGludCB0b3J0dXJlKQoreworCXN0cnVjdCB1Ymlfd29yayAqd2xfd3JrOworCisJZGJnX3dsKCJzY2hlZHVsZSBlcmFzdXJlIG9mIFBFQiAlZCwgRUMgJWQsIHRvcnR1cmUgJWQiLAorCSAgICAgICBlLT5wbnVtLCBlLT5lYywgdG9ydHVyZSk7CisKKwl3bF93cmsgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdWJpX3dvcmspLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXdsX3dyaykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl3bF93cmstPmZ1bmMgPSAmZXJhc2Vfd29ya2VyOworCXdsX3dyay0+ZSA9IGU7CisJd2xfd3JrLT50b3J0dXJlID0gdG9ydHVyZTsKKworCXNjaGVkdWxlX3ViaV93b3JrKHViaSwgd2xfd3JrKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB3ZWFyX2xldmVsaW5nX3dvcmtlciAtIHdlYXItbGV2ZWxpbmcgd29ya2VyIGZ1bmN0aW9uLgorICogQHViaTogVUJJIGRldmljZSBkZXNjcmlwdGlvbiBvYmplY3QKKyAqIEB3cms6IHRoZSB3b3JrIG9iamVjdAorICogQGNhbmNlbDogbm9uLXplcm8gaWYgdGhlIHdvcmtlciBoYXMgdG8gZnJlZSBtZW1vcnkgYW5kIGV4aXQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNvcGllcyBhIG1vcmUgd29ybiBvdXQgcGh5c2ljYWwgZXJhc2VibG9jayB0byBhIGxlc3Mgd29ybiBvdXQKKyAqIG9uZS4gUmV0dXJucyB6ZXJvIGluIGNhc2Ugb2Ygc3VjY2VzcyBhbmQgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIGluIGNhc2Ugb2YKKyAqIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQgd2Vhcl9sZXZlbGluZ193b3JrZXIoc3RydWN0IHViaV9kZXZpY2UgKnViaSwgc3RydWN0IHViaV93b3JrICp3cmssCisJCQkJaW50IGNhbmNlbCkKK3sKKwlpbnQgZXJyLCBwdXQgPSAwOworCXN0cnVjdCB1Ymlfd2xfZW50cnkgKmUxLCAqZTI7CisJc3RydWN0IHViaV92aWRfaGRyICp2aWRfaGRyOworCisJa2ZyZWUod3JrKTsKKworCWlmIChjYW5jZWwpCisJCXJldHVybiAwOworCisJdmlkX2hkciA9IHViaV96YWxsb2NfdmlkX2hkcih1YmkpOworCWlmICghdmlkX2hkcikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzcGluX2xvY2soJnViaS0+d2xfbG9jayk7CisKKwkvKgorCSAqIE9ubHkgb25lIFdMIHdvcmtlciBhdCBhIHRpbWUgaXMgc3VwcG9ydGVkIGF0IHRoaXMgaW1wbGVtZW50YXRpb24sIHNvCisJICogbWFrZSBzdXJlIGEgUEVCIGlzIG5vdCBiZWluZyBtb3ZlZCBhbHJlYWR5LgorCSAqLworCWlmICh1YmktPm1vdmVfdG8gfHwgdHJlZV9lbXB0eSgmdWJpLT5mcmVlKSB8fAorCSAgICAodHJlZV9lbXB0eSgmdWJpLT51c2VkKSAmJiB0cmVlX2VtcHR5KCZ1YmktPnNjcnViKSkpIHsKKwkJLyoKKwkJICogT25seSBvbmUgV0wgd29ya2VyIGF0IGEgdGltZSBpcyBzdXBwb3J0ZWQgYXQgdGhpcworCQkgKiBpbXBsZW1lbnRhdGlvbiwgc28gaWYgYSBMRUIgaXMgYWxyZWFkeSBiZWluZyBtb3ZlZCwgY2FuY2VsLgorCQkgKgorCQkgKiBObyBmcmVlIHBoeXNpY2FsIGVyYXNlYmxvY2tzPyBXZWxsLCB3ZSBjYW5jZWwgd2Vhci1sZXZlbGluZworCQkgKiB0aGVuLiBJdCB3aWxsIGJlIHRyaWdnZXJlZCBhZ2FpbiB3aGVuIGEgZnJlZSBwaHlzaWNhbAorCQkgKiBlcmFzZWJsb2NrIGFwcGVhcnMuCisJCSAqCisJCSAqIE5vIHVzZWQgcGh5c2ljYWwgZXJhc2VibG9ja3M/IFRoZXkgbXVzdCBiZSB0ZW1wb3JhcmlseQorCQkgKiBwcm90ZWN0ZWQgZnJvbSBiZWluZyBtb3ZlZC4gVGhleSB3aWxsIGJlIG1vdmVkIHRvIHRoZQorCQkgKiBAdWJpLT51c2VkIHRyZWUgbGF0ZXIgYW5kIHRoZSB3ZWFyLWxldmVsaW5nIHdpbGwgYmUKKwkJICogdHJpZ2dlcmVkIGFnYWluLgorCQkgKi8KKwkJZGJnX3dsKCJjYW5jZWwgV0wsIGEgbGlzdCBpcyBlbXB0eTogZnJlZSAlZCwgdXNlZCAlZCIsCisJCSAgICAgICB0cmVlX2VtcHR5KCZ1YmktPmZyZWUpLCB0cmVlX2VtcHR5KCZ1YmktPnVzZWQpKTsKKwkJdWJpLT53bF9zY2hlZHVsZWQgPSAwOworCQlzcGluX3VubG9jaygmdWJpLT53bF9sb2NrKTsKKwkJdWJpX2ZyZWVfdmlkX2hkcih1YmksIHZpZF9oZHIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAodHJlZV9lbXB0eSgmdWJpLT5zY3J1YikpIHsKKwkJLyoKKwkJICogTm93IHBpY2sgdGhlIGxlYXN0IHdvcm4tb3V0IHVzZWQgcGh5c2ljYWwgZXJhc2VibG9jayBhbmQgYQorCQkgKiBoaWdobHkgd29ybi1vdXQgZnJlZSBwaHlzaWNhbCBlcmFzZWJsb2NrLiBJZiB0aGUgZXJhc2UKKwkJICogY291bnRlcnMgZGlmZmVyIG11Y2ggZW5vdWdoLCBzdGFydCB3ZWFyLWxldmVsaW5nLgorCQkgKi8KKwkJZTEgPSByYl9lbnRyeShyYl9maXJzdCgmdWJpLT51c2VkKSwgc3RydWN0IHViaV93bF9lbnRyeSwgcmIpOworCQllMiA9IGZpbmRfd2xfZW50cnkoJnViaS0+ZnJlZSwgV0xfRlJFRV9NQVhfRElGRik7CisKKwkJaWYgKCEoZTItPmVjIC0gZTEtPmVjID49IFVCSV9XTF9USFJFU0hPTEQpKSB7CisJCQlkYmdfd2woIm5vIFdMIG5lZWRlZDogbWluIHVzZWQgRUMgJWQsIG1heCBmcmVlIEVDICVkIiwKKwkJCSAgICAgICBlMS0+ZWMsIGUyLT5lYyk7CisJCQl1YmktPndsX3NjaGVkdWxlZCA9IDA7CisJCQlzcGluX3VubG9jaygmdWJpLT53bF9sb2NrKTsKKwkJCXViaV9mcmVlX3ZpZF9oZHIodWJpLCB2aWRfaGRyKTsKKwkJCXJldHVybiAwOworCQl9CisJCXVzZWRfdHJlZV9kZWwodWJpLCBlMSk7CisJCWRiZ193bCgibW92ZSBQRUIgJWQgRUMgJWQgdG8gUEVCICVkIEVDICVkIiwKKwkJICAgICAgIGUxLT5wbnVtLCBlMS0+ZWMsIGUyLT5wbnVtLCBlMi0+ZWMpOworCX0gZWxzZSB7CisJCWUxID0gcmJfZW50cnkocmJfZmlyc3QoJnViaS0+c2NydWIpLCBzdHJ1Y3QgdWJpX3dsX2VudHJ5LCByYik7CisJCWUyID0gZmluZF93bF9lbnRyeSgmdWJpLT5mcmVlLCBXTF9GUkVFX01BWF9ESUZGKTsKKwkJc2NydWJfdHJlZV9kZWwodWJpLCBlMSk7CisJCWRiZ193bCgic2NydWIgUEVCICVkIHRvIFBFQiAlZCIsIGUxLT5wbnVtLCBlMi0+cG51bSk7CisJfQorCisJZnJlZV90cmVlX2RlbCh1YmksIGUyKTsKKwl1YmlfYXNzZXJ0KCF1YmktPm1vdmVfZnJvbSAmJiAhdWJpLT5tb3ZlX3RvKTsKKwl1YmlfYXNzZXJ0KCF1YmktPm1vdmVfdG9fcHV0ICYmICF1YmktPm1vdmVfZnJvbV9wdXQpOworCXViaS0+bW92ZV9mcm9tID0gZTE7CisJdWJpLT5tb3ZlX3RvID0gZTI7CisJc3Bpbl91bmxvY2soJnViaS0+d2xfbG9jayk7CisKKwkvKgorCSAqIE5vdyB3ZSBhcmUgZ29pbmcgdG8gY29weSBwaHlzaWNhbCBlcmFzZWJsb2NrIEBlMS0+cG51bSB0byBAZTItPnBudW0uCisJICogV2Ugc28gZmFyIGRvIG5vdCBrbm93IHdoaWNoIGxvZ2ljYWwgZXJhc2VibG9jayBvdXIgcGh5c2ljYWwKKwkgKiBlcmFzZWJsb2NrIChAZTEpIGJlbG9uZ3MgdG8uIFdlIGhhdmUgdG8gcmVhZCB0aGUgdm9sdW1lIGlkZW50aWZpZXIKKwkgKiBoZWFkZXIgZmlyc3QuCisJICovCisKKwllcnIgPSB1YmlfaW9fcmVhZF92aWRfaGRyKHViaSwgZTEtPnBudW0sIHZpZF9oZHIsIDApOworCWlmIChlcnIgJiYgZXJyICE9IFVCSV9JT19CSVRGTElQUykgeworCQlpZiAoZXJyID09IFVCSV9JT19QRUJfRlJFRSkgeworCQkJLyoKKwkJCSAqIFdlIGFyZSB0cnlpbmcgdG8gbW92ZSBQRUIgd2l0aG91dCBhIFZJRCBoZWFkZXIuIFVCSQorCQkJICogYWx3YXlzIHdyaXRlIFZJRCBoZWFkZXJzIHNob3J0bHkgYWZ0ZXIgdGhlIFBFQiB3YXMKKwkJCSAqIGdpdmVuLCBzbyB3ZSBoYXZlIGEgc2l0dWF0aW9uIHdoZW4gaXQgZGlkIG5vdCBoYXZlCisJCQkgKiBjaGFuY2UgdG8gd3JpdGUgaXQgZG93biBiZWNhdXNlIGl0IHdhcyBwcmVlbXB0ZWQuCisJCQkgKiBKdXN0IHJlLXNjaGVkdWxlIHRoZSB3b3JrLCBzbyB0aGF0IG5leHQgdGltZSBpdCB3aWxsCisJCQkgKiBsaWtlbHkgaGF2ZSB0aGUgVklEIGhlYWRlciBpbiBwbGFjZS4KKwkJCSAqLworCQkJZGJnX3dsKCJQRUIgJWQgaGFzIG5vIFZJRCBoZWFkZXIiLCBlMS0+cG51bSk7CisJCQllcnIgPSAwOworCQl9IGVsc2UgeworCQkJdWJpX2VycigiZXJyb3IgJWQgd2hpbGUgcmVhZGluZyBWSUQgaGVhZGVyIGZyb20gUEVCICVkIiwKKwkJCQllcnIsIGUxLT5wbnVtKTsKKwkJCWlmIChlcnIgPiAwKQorCQkJCWVyciA9IC1FSU87CisJCX0KKwkJZ290byBlcnJvcjsKKwl9CisKKwllcnIgPSB1YmlfZWJhX2NvcHlfbGViKHViaSwgZTEtPnBudW0sIGUyLT5wbnVtLCB2aWRfaGRyKTsKKwlpZiAoZXJyKSB7CisJCWlmIChlcnIgPT0gVUJJX0lPX0JJVEZMSVBTKQorCQkJZXJyID0gMDsKKwkJZ290byBlcnJvcjsKKwl9CisKKwl1YmlfZnJlZV92aWRfaGRyKHViaSwgdmlkX2hkcik7CisJc3Bpbl9sb2NrKCZ1YmktPndsX2xvY2spOworCWlmICghdWJpLT5tb3ZlX3RvX3B1dCkKKwkJdXNlZF90cmVlX2FkZCh1YmksIGUyKTsKKwllbHNlCisJCXB1dCA9IDE7CisJdWJpLT5tb3ZlX2Zyb20gPSB1YmktPm1vdmVfdG8gPSBOVUxMOworCXViaS0+bW92ZV9mcm9tX3B1dCA9IHViaS0+bW92ZV90b19wdXQgPSAwOworCXViaS0+d2xfc2NoZWR1bGVkID0gMDsKKwlzcGluX3VubG9jaygmdWJpLT53bF9sb2NrKTsKKworCWlmIChwdXQpIHsKKwkJLyoKKwkJICogV2VsbCwgdGhlIHRhcmdldCBQRUIgd2FzIHB1dCBtZWFud2hpbGUsIHNjaGVkdWxlIGl0IGZvcgorCQkgKiBlcmFzdXJlLgorCQkgKi8KKwkJZGJnX3dsKCJQRUIgJWQgd2FzIHB1dCBtZWFud2hpbGUsIGVyYXNlIiwgZTItPnBudW0pOworCQllcnIgPSBzY2hlZHVsZV9lcmFzZSh1YmksIGUyLCAwKTsKKwkJaWYgKGVycikgeworCQkJa21lbV9jYWNoZV9mcmVlKHdsX2VudHJpZXNfc2xhYiwgZTIpOworCQkJdWJpX3JvX21vZGUodWJpKTsKKwkJfQorCX0KKworCWVyciA9IHNjaGVkdWxlX2VyYXNlKHViaSwgZTEsIDApOworCWlmIChlcnIpIHsKKwkJa21lbV9jYWNoZV9mcmVlKHdsX2VudHJpZXNfc2xhYiwgZTEpOworCQl1Ymlfcm9fbW9kZSh1YmkpOworCX0KKworCWRiZ193bCgiZG9uZSIpOworCXJldHVybiBlcnI7CisKKwkvKgorCSAqIFNvbWUgZXJyb3Igb2NjdXJyZWQuIEBlMSB3YXMgbm90IGNoYW5nZWQsIHNvIHJldHVybiBpdCBiYWNrLiBAZTIKKwkgKiBtaWdodCBiZSBjaGFuZ2VkLCBzY2hlZHVsZSBpdCBmb3IgZXJhc3VyZS4KKwkgKi8KK2Vycm9yOgorCWlmIChlcnIpCisJCWRiZ193bCgiZXJyb3IgJWQgb2NjdXJyZWQsIGNhbmNlbCBvcGVyYXRpb24iLCBlcnIpOworCXViaV9hc3NlcnQoZXJyIDw9IDApOworCisJdWJpX2ZyZWVfdmlkX2hkcih1YmksIHZpZF9oZHIpOworCXNwaW5fbG9jaygmdWJpLT53bF9sb2NrKTsKKwl1YmktPndsX3NjaGVkdWxlZCA9IDA7CisJaWYgKHViaS0+bW92ZV9mcm9tX3B1dCkKKwkJcHV0ID0gMTsKKwllbHNlCisJCXVzZWRfdHJlZV9hZGQodWJpLCBlMSk7CisJdWJpLT5tb3ZlX2Zyb20gPSB1YmktPm1vdmVfdG8gPSBOVUxMOworCXViaS0+bW92ZV9mcm9tX3B1dCA9IHViaS0+bW92ZV90b19wdXQgPSAwOworCXNwaW5fdW5sb2NrKCZ1YmktPndsX2xvY2spOworCisJaWYgKHB1dCkgeworCQkvKgorCQkgKiBXZWxsLCB0aGUgdGFyZ2V0IFBFQiB3YXMgcHV0IG1lYW53aGlsZSwgc2NoZWR1bGUgaXQgZm9yCisJCSAqIGVyYXN1cmUuCisJCSAqLworCQlkYmdfd2woIlBFQiAlZCB3YXMgcHV0IG1lYW53aGlsZSwgZXJhc2UiLCBlMS0+cG51bSk7CisJCWVyciA9IHNjaGVkdWxlX2VyYXNlKHViaSwgZTEsIDApOworCQlpZiAoZXJyKSB7CisJCQlrbWVtX2NhY2hlX2ZyZWUod2xfZW50cmllc19zbGFiLCBlMSk7CisJCQl1Ymlfcm9fbW9kZSh1YmkpOworCQl9CisJfQorCisJZXJyID0gc2NoZWR1bGVfZXJhc2UodWJpLCBlMiwgMCk7CisJaWYgKGVycikgeworCQlrbWVtX2NhY2hlX2ZyZWUod2xfZW50cmllc19zbGFiLCBlMik7CisJCXViaV9yb19tb2RlKHViaSk7CisJfQorCisJeWllbGQoKTsKKwlyZXR1cm4gZXJyOworfQorCisvKioKKyAqIGVuc3VyZV93ZWFyX2xldmVsaW5nIC0gc2NoZWR1bGUgd2Vhci1sZXZlbGluZyBpZiBpdCBpcyBuZWVkZWQuCisgKiBAdWJpOiBVQkkgZGV2aWNlIGRlc2NyaXB0aW9uIG9iamVjdAorICoKKyAqIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGlmIGl0IGlzIHRpbWUgdG8gc3RhcnQgd2Vhci1sZXZlbGluZyBhbmQgc2NoZWR1bGVzIGl0CisgKiBpZiB5ZXMuIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB6ZXJvIGluIGNhc2Ugb2Ygc3VjY2VzcyBhbmQgYSBuZWdhdGl2ZSBlcnJvcgorICogY29kZSBpbiBjYXNlIG9mIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQgZW5zdXJlX3dlYXJfbGV2ZWxpbmcoc3RydWN0IHViaV9kZXZpY2UgKnViaSkKK3sKKwlpbnQgZXJyID0gMDsKKwlzdHJ1Y3QgdWJpX3dsX2VudHJ5ICplMTsKKwlzdHJ1Y3QgdWJpX3dsX2VudHJ5ICplMjsKKwlzdHJ1Y3QgdWJpX3dvcmsgKndyazsKKworCXNwaW5fbG9jaygmdWJpLT53bF9sb2NrKTsKKwlpZiAodWJpLT53bF9zY2hlZHVsZWQpCisJCS8qIFdlYXItbGV2ZWxpbmcgaXMgYWxyZWFkeSBpbiB0aGUgd29yayBxdWV1ZSAqLworCQlnb3RvIG91dF91bmxvY2s7CisKKwkvKgorCSAqIElmIHRoZSB1YmktPnNjcnViIHRyZWUgaXMgbm90IGVtcHR5LCBzY3J1YmJpbmcgaXMgbmVlZGVkLCBhbmQgdGhlCisJICogdGhlIFdMIHdvcmtlciBoYXMgdG8gYmUgc2NoZWR1bGVkIGFueXdheS4KKwkgKi8KKwlpZiAodHJlZV9lbXB0eSgmdWJpLT5zY3J1YikpIHsKKwkJaWYgKHRyZWVfZW1wdHkoJnViaS0+dXNlZCkgfHwgdHJlZV9lbXB0eSgmdWJpLT5mcmVlKSkKKwkJCS8qIE5vIHBoeXNpY2FsIGVyYXNlYmxvY2tzIC0gbm8gZGVhbCAqLworCQkJZ290byBvdXRfdW5sb2NrOworCisJCS8qCisJCSAqIFdlIHNjaGVkdWxlIHdlYXItbGV2ZWxpbmcgb25seSBpZiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZQorCQkgKiBsb3dlc3QgZXJhc2UgY291bnRlciBvZiB1c2VkIHBoeXNpY2FsIGVyYXNlYmxvY2tzIGFuZCBhIGhpZ2gKKwkJICogZXJhc2UgY291bnRlciBvZiBmcmVlIHBoeXNpY2FsIGVyYXNlYmxvY2tzIGlzIGdyZWF0ZXIgdGhlbgorCQkgKiAlVUJJX1dMX1RIUkVTSE9MRC4KKwkJICovCisJCWUxID0gcmJfZW50cnkocmJfZmlyc3QoJnViaS0+dXNlZCksIHN0cnVjdCB1Ymlfd2xfZW50cnksIHJiKTsKKwkJZTIgPSBmaW5kX3dsX2VudHJ5KCZ1YmktPmZyZWUsIFdMX0ZSRUVfTUFYX0RJRkYpOworCisJCWlmICghKGUyLT5lYyAtIGUxLT5lYyA+PSBVQklfV0xfVEhSRVNIT0xEKSkKKwkJCWdvdG8gb3V0X3VubG9jazsKKwkJZGJnX3dsKCJzY2hlZHVsZSB3ZWFyLWxldmVsaW5nIik7CisJfSBlbHNlCisJCWRiZ193bCgic2NoZWR1bGUgc2NydWJiaW5nIik7CisKKwl1YmktPndsX3NjaGVkdWxlZCA9IDE7CisJc3Bpbl91bmxvY2soJnViaS0+d2xfbG9jayk7CisKKwl3cmsgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdWJpX3dvcmspLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXdyaykgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIG91dF9jYW5jZWw7CisJfQorCisJd3JrLT5mdW5jID0gJndlYXJfbGV2ZWxpbmdfd29ya2VyOworCXNjaGVkdWxlX3ViaV93b3JrKHViaSwgd3JrKTsKKwlyZXR1cm4gZXJyOworCitvdXRfY2FuY2VsOgorCXNwaW5fbG9jaygmdWJpLT53bF9sb2NrKTsKKwl1YmktPndsX3NjaGVkdWxlZCA9IDA7CitvdXRfdW5sb2NrOgorCXNwaW5fdW5sb2NrKCZ1YmktPndsX2xvY2spOworCXJldHVybiBlcnI7Cit9CisKKy8qKgorICogZXJhc2Vfd29ya2VyIC0gcGh5c2ljYWwgZXJhc2VibG9jayBlcmFzZSB3b3JrZXIgZnVuY3Rpb24uCisgKiBAdWJpOiBVQkkgZGV2aWNlIGRlc2NyaXB0aW9uIG9iamVjdAorICogQHdsX3dyazogdGhlIHdvcmsgb2JqZWN0CisgKiBAY2FuY2VsOiBub24temVybyBpZiB0aGUgd29ya2VyIGhhcyB0byBmcmVlIG1lbW9yeSBhbmQgZXhpdAorICoKKyAqIFRoaXMgZnVuY3Rpb24gZXJhc2VzIGEgcGh5c2ljYWwgZXJhc2VibG9jayBhbmQgcGVyZm9ybSB0b3J0dXJlIHRlc3RpbmcgaWYKKyAqIG5lZWRlZC4gSXQgYWxzbyB0YWtlcyBjYXJlIGFib3V0IG1hcmtpbmcgdGhlIHBoeXNpY2FsIGVyYXNlYmxvY2sgYmFkIGlmCisgKiBuZWVkZWQuIFJldHVybnMgemVybyBpbiBjYXNlIG9mIHN1Y2Nlc3MgYW5kIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBpbiBjYXNlIG9mCisgKiBmYWlsdXJlLgorICovCitzdGF0aWMgaW50IGVyYXNlX3dvcmtlcihzdHJ1Y3QgdWJpX2RldmljZSAqdWJpLCBzdHJ1Y3QgdWJpX3dvcmsgKndsX3dyaywKKwkJCWludCBjYW5jZWwpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgdWJpX3dsX2VudHJ5ICplID0gd2xfd3JrLT5lOworCWludCBwbnVtID0gZS0+cG51bTsKKworCWlmIChjYW5jZWwpIHsKKwkJZGJnX3dsKCJjYW5jZWwgZXJhc3VyZSBvZiBQRUIgJWQgRUMgJWQiLCBwbnVtLCBlLT5lYyk7CisJCWtmcmVlKHdsX3dyayk7CisJCWttZW1fY2FjaGVfZnJlZSh3bF9lbnRyaWVzX3NsYWIsIGUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlkYmdfd2woImVyYXNlIFBFQiAlZCBFQyAlZCIsIHBudW0sIGUtPmVjKTsKKworCWVyciA9IHN5bmNfZXJhc2UodWJpLCBlLCB3bF93cmstPnRvcnR1cmUpOworCWlmICghZXJyKSB7CisJCS8qIEZpbmUsIHdlJ3ZlIGVyYXNlZCBpdCBzdWNjZXNzZnVsbHkgKi8KKwkJa2ZyZWUod2xfd3JrKTsKKworCQlzcGluX2xvY2soJnViaS0+d2xfbG9jayk7CisJCXViaS0+YWJzX2VjICs9IDE7CisJCWZyZWVfdHJlZV9hZGQodWJpLCBlKTsKKwkJc3Bpbl91bmxvY2soJnViaS0+d2xfbG9jayk7CisKKwkJLyoKKwkJICogT25lIG1vcmUgZXJhc2Ugb3BlcmF0aW9uIGhhcyBoYXBwZW5lZCwgdGFrZSBjYXJlIGFib3V0IHByb3RlY3RlZAorCQkgKiBwaHlzaWNhbCBlcmFzZWJsb2Nrcy4KKwkJICovCisJCWNoZWNrX3Byb3RlY3Rpb25fb3Zlcih1YmkpOworCisJCS8qIEFuZCB0YWtlIGNhcmUgYWJvdXQgd2Vhci1sZXZlbGluZyAqLworCQllcnIgPSBlbnN1cmVfd2Vhcl9sZXZlbGluZyh1YmkpOworCQlyZXR1cm4gZXJyOworCX0KKworCWtmcmVlKHdsX3dyayk7CisJa21lbV9jYWNoZV9mcmVlKHdsX2VudHJpZXNfc2xhYiwgZSk7CisKKwlpZiAoZXJyICE9IC1FSU8pIHsKKwkJLyoKKwkJICogSWYgdGhpcyBpcyBub3QgJS1FSU8sIHdlIGhhdmUgbm8gaWRlYSB3aGF0IHRvIGRvLiBTY2hlZHVsaW5nCisJCSAqIHRoaXMgcGh5c2ljYWwgZXJhc2VibG9jayBmb3IgZXJhc3VyZSBhZ2FpbiB3b3VsZCBjYXVzZQorCQkgKiBlcnJvcnMgYWdhaW4gYW5kIGFnYWluLiBXZWxsLCBsZXRzIHN3aXRjaCB0byBSTyBtb2RlLgorCQkgKi8KKwkJdWJpX3JvX21vZGUodWJpKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwkvKiBJdCBpcyAlLUVJTywgdGhlIFBFQiB3ZW50IGJhZCAqLworCisJaWYgKCF1YmktPmJhZF9hbGxvd2VkKSB7CisJCXViaV9lcnIoImJhZCBwaHlzaWNhbCBlcmFzZWJsb2NrICVkIGRldGVjdGVkIiwgcG51bSk7CisJCXViaV9yb19tb2RlKHViaSk7CisJCWVyciA9IC1FSU87CisJfSBlbHNlIHsKKwkJaW50IG5lZWQ7CisKKwkJc3Bpbl9sb2NrKCZ1YmktPnZvbHVtZXNfbG9jayk7CisJCW5lZWQgPSB1YmktPmJlYl9yc3ZkX2xldmVsIC0gdWJpLT5iZWJfcnN2ZF9wZWJzICsgMTsKKwkJaWYgKG5lZWQgPiAwKSB7CisJCQluZWVkID0gdWJpLT5hdmFpbF9wZWJzID49IG5lZWQgPyBuZWVkIDogdWJpLT5hdmFpbF9wZWJzOworCQkJdWJpLT5hdmFpbF9wZWJzIC09IG5lZWQ7CisJCQl1YmktPnJzdmRfcGVicyArPSBuZWVkOworCQkJdWJpLT5iZWJfcnN2ZF9wZWJzICs9IG5lZWQ7CisJCQlpZiAobmVlZCA+IDApCisJCQkJdWJpX21zZygicmVzZXJ2ZSBtb3JlICVkIFBFQnMiLCBuZWVkKTsKKwkJfQorCisJCWlmICh1YmktPmJlYl9yc3ZkX3BlYnMgPT0gMCkgeworCQkJc3Bpbl91bmxvY2soJnViaS0+dm9sdW1lc19sb2NrKTsKKwkJCXViaV9lcnIoIm5vIHJlc2VydmVkIHBoeXNpY2FsIGVyYXNlYmxvY2tzIik7CisJCQl1Ymlfcm9fbW9kZSh1YmkpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKworCQlzcGluX3VubG9jaygmdWJpLT52b2x1bWVzX2xvY2spOworCQl1YmlfbXNnKCJtYXJrIFBFQiAlZCBhcyBiYWQiLCBwbnVtKTsKKworCQllcnIgPSB1YmlfaW9fbWFya19iYWQodWJpLCBwbnVtKTsKKwkJaWYgKGVycikgeworCQkJdWJpX3JvX21vZGUodWJpKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKworCQlzcGluX2xvY2soJnViaS0+dm9sdW1lc19sb2NrKTsKKwkJdWJpLT5iZWJfcnN2ZF9wZWJzIC09IDE7CisJCXViaS0+YmFkX3BlYl9jb3VudCArPSAxOworCQl1YmktPmdvb2RfcGViX2NvdW50IC09IDE7CisJCXViaV9jYWxjdWxhdGVfcmVzZXJ2ZWQodWJpKTsKKwkJaWYgKHViaS0+YmViX3JzdmRfcGVicyA9PSAwKQorCQkJdWJpX3dhcm4oImxhc3QgUEVCIGZyb20gdGhlIHJlc2VydmVkIHBvb2wgd2FzIHVzZWQiKTsKKwkJc3Bpbl91bmxvY2soJnViaS0+dm9sdW1lc19sb2NrKTsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCisvKioKKyAqIHViaV93bF9wdXRfcGViIC0gcmV0dXJuIGEgcGh5c2ljYWwgZXJhc2VibG9jayB0byB0aGUgd2Vhci1sZXZlbGluZworICogdW5pdC4KKyAqIEB1Ymk6IFVCSSBkZXZpY2UgZGVzY3JpcHRpb24gb2JqZWN0CisgKiBAcG51bTogcGh5c2ljYWwgZXJhc2VibG9jayB0byByZXR1cm4KKyAqIEB0b3J0dXJlOiBpZiB0aGlzIHBoeXNpY2FsIGVyYXNlYmxvY2sgaGFzIHRvIGJlIHRvcnR1cmVkCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcmV0dXJuIHBoeXNpY2FsIGVyYXNlYmxvY2sgQHBudW0gdG8gdGhlIHBvb2wgb2YKKyAqIGZyZWUgcGh5c2ljYWwgZXJhc2VibG9ja3MuIFRoZSBAdG9ydHVyZSBmbGFnIGhhcyB0byBiZSBzZXQgaWYgYW4gSS9PIGVycm9yCisgKiBvY2N1cnJlZCB0byB0aGlzIEBwbnVtIGFuZCBpdCBoYXMgdG8gYmUgdGVzdGVkLiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgemVybworICogaW4gY2FzZSBvZiBzdWNjZXNzIGFuZCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgaW4gY2FzZSBvZiBmYWlsdXJlLgorICovCitpbnQgdWJpX3dsX3B1dF9wZWIoc3RydWN0IHViaV9kZXZpY2UgKnViaSwgaW50IHBudW0sIGludCB0b3J0dXJlKQoreworCWludCBlcnI7CisJc3RydWN0IHViaV93bF9lbnRyeSAqZTsKKworCWRiZ193bCgiUEVCICVkIiwgcG51bSk7CisJdWJpX2Fzc2VydChwbnVtID49IDApOworCXViaV9hc3NlcnQocG51bSA8IHViaS0+cGViX2NvdW50KTsKKworCXNwaW5fbG9jaygmdWJpLT53bF9sb2NrKTsKKworCWUgPSB1YmktPmxvb2t1cHRibFtwbnVtXTsKKwlpZiAoZSA9PSB1YmktPm1vdmVfZnJvbSkgeworCQkvKgorCQkgKiBVc2VyIGlzIHB1dHRpbmcgdGhlIHBoeXNpY2FsIGVyYXNlYmxvY2sgd2hpY2ggd2FzIHNlbGVjdGVkIHRvCisJCSAqIGJlIG1vdmVkLiBJdCB3aWxsIGJlIHNjaGVkdWxlZCBmb3IgZXJhc3VyZSBpbiB0aGUKKwkJICogd2Vhci1sZXZlbGluZyB3b3JrZXIuCisJCSAqLworCQlkYmdfd2woIlBFQiAlZCBpcyBiZWluZyBtb3ZlZCIsIHBudW0pOworCQl1YmlfYXNzZXJ0KCF1YmktPm1vdmVfZnJvbV9wdXQpOworCQl1YmktPm1vdmVfZnJvbV9wdXQgPSAxOworCQlzcGluX3VubG9jaygmdWJpLT53bF9sb2NrKTsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIGlmIChlID09IHViaS0+bW92ZV90bykgeworCQkvKgorCQkgKiBVc2VyIGlzIHB1dHRpbmcgdGhlIHBoeXNpY2FsIGVyYXNlYmxvY2sgd2hpY2ggd2FzIHNlbGVjdGVkCisJCSAqIGFzIHRoZSB0YXJnZXQgdGhlIGRhdGEgaXMgbW92ZWQgdG8uIEl0IG1heSBoYXBwZW4gaWYgdGhlIEVCQQorCQkgKiB1bml0IGFscmVhZHkgcmUtbWFwcGVkIHRoZSBMRUIgYnV0IHRoZSBXTCB1bml0IGRpZCBoYXMgbm90CisJCSAqIHB1dCB0aGUgUEVCIHRvIHRoZSAidXNlZCIgdHJlZS4KKwkJICovCisJCWRiZ193bCgiUEVCICVkIGlzIHRoZSB0YXJnZXQgb2YgZGF0YSBtb3ZpbmciLCBwbnVtKTsKKwkJdWJpX2Fzc2VydCghdWJpLT5tb3ZlX3RvX3B1dCk7CisJCXViaS0+bW92ZV90b19wdXQgPSAxOworCQlzcGluX3VubG9jaygmdWJpLT53bF9sb2NrKTsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJaWYgKGluX3dsX3RyZWUoZSwgJnViaS0+dXNlZCkpCisJCQl1c2VkX3RyZWVfZGVsKHViaSwgZSk7CisJCWVsc2UgaWYgKGluX3dsX3RyZWUoZSwgJnViaS0+c2NydWIpKQorCQkJc2NydWJfdHJlZV9kZWwodWJpLCBlKTsKKwkJZWxzZQorCQkJcHJvdF90cmVlX2RlbCh1YmksIGUtPnBudW0pOworCX0KKwlzcGluX3VubG9jaygmdWJpLT53bF9sb2NrKTsKKworCWVyciA9IHNjaGVkdWxlX2VyYXNlKHViaSwgZSwgdG9ydHVyZSk7CisJaWYgKGVycikgeworCQlzcGluX2xvY2soJnViaS0+d2xfbG9jayk7CisJCXVzZWRfdHJlZV9hZGQodWJpLCBlKTsKKwkJc3Bpbl91bmxvY2soJnViaS0+d2xfbG9jayk7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKiB1Ymlfd2xfc2NydWJfcGViIC0gc2NoZWR1bGUgYSBwaHlzaWNhbCBlcmFzZWJsb2NrIGZvciBzY3J1YmJpbmcuCisgKiBAdWJpOiBVQkkgZGV2aWNlIGRlc2NyaXB0aW9uIG9iamVjdAorICogQHBudW06IHRoZSBwaHlzaWNhbCBlcmFzZWJsb2NrIHRvIHNjaGVkdWxlCisgKgorICogSWYgYSBiaXQtZmxpcCBpbiBhIHBoeXNpY2FsIGVyYXNlYmxvY2sgaXMgZGV0ZWN0ZWQsIHRoaXMgcGh5c2ljYWwgZXJhc2VibG9jaworICogbmVlZHMgc2NydWJiaW5nLiBUaGlzIGZ1bmN0aW9uIHNjaGVkdWxlcyBhIHBoeXNpY2FsIGVyYXNlYmxvY2sgZm9yCisgKiBzY3J1YmJpbmcgd2hpY2ggaXMgZG9uZSBpbiBiYWNrZ3JvdW5kLiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgemVybyBpbiBjYXNlIG9mCisgKiBzdWNjZXNzIGFuZCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgaW4gY2FzZSBvZiBmYWlsdXJlLgorICovCitpbnQgdWJpX3dsX3NjcnViX3BlYihzdHJ1Y3QgdWJpX2RldmljZSAqdWJpLCBpbnQgcG51bSkKK3sKKwlzdHJ1Y3QgdWJpX3dsX2VudHJ5ICplOworCisJdWJpX21zZygic2NoZWR1bGUgUEVCICVkIGZvciBzY3J1YmJpbmciLCBwbnVtKTsKKworcmV0cnk6CisJc3Bpbl9sb2NrKCZ1YmktPndsX2xvY2spOworCWUgPSB1YmktPmxvb2t1cHRibFtwbnVtXTsKKwlpZiAoZSA9PSB1YmktPm1vdmVfZnJvbSB8fCBpbl93bF90cmVlKGUsICZ1YmktPnNjcnViKSkgeworCQlzcGluX3VubG9jaygmdWJpLT53bF9sb2NrKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGUgPT0gdWJpLT5tb3ZlX3RvKSB7CisJCS8qCisJCSAqIFRoaXMgcGh5c2ljYWwgZXJhc2VibG9jayB3YXMgdXNlZCB0byBtb3ZlIGRhdGEgdG8uIFRoZSBkYXRhCisJCSAqIHdhcyBtb3ZlZCBidXQgdGhlIFBFQiB3YXMgbm90IHlldCBpbnNlcnRlZCB0byB0aGUgcHJvcGVyCisJCSAqIHRyZWUuIFdlIHNob3VsZCBqdXN0IHdhaXQgYSBsaXR0bGUgYW5kIGxldCB0aGUgV0wgd29ya2VyCisJCSAqIHByb2NlZWQuCisJCSAqLworCQlzcGluX3VubG9jaygmdWJpLT53bF9sb2NrKTsKKwkJZGJnX3dsKCJ0aGUgUEVCICVkIGlzIG5vdCBpbiBwcm9wZXIgdHJlZSwgcmV0cnkiLCBwbnVtKTsKKwkJeWllbGQoKTsKKwkJZ290byByZXRyeTsKKwl9CisKKwlpZiAoaW5fd2xfdHJlZShlLCAmdWJpLT51c2VkKSkKKwkJdXNlZF90cmVlX2RlbCh1YmksIGUpOworCWVsc2UKKwkJcHJvdF90cmVlX2RlbCh1YmksIHBudW0pOworCisJc2NydWJfdHJlZV9hZGQodWJpLCBlKTsKKwlzcGluX3VubG9jaygmdWJpLT53bF9sb2NrKTsKKworCS8qCisJICogVGVjaG5pY2FsbHkgc2NydWJiaW5nIGlzIHRoZSBzYW1lIGFzIHdlYXItbGV2ZWxpbmcsIHNvIGl0IGlzIGRvbmUKKwkgKiBieSB0aGUgV0wgd29ya2VyLgorCSAqLworCXJldHVybiBlbnN1cmVfd2Vhcl9sZXZlbGluZyh1YmkpOworfQorCisvKioKKyAqIHViaV93bF9mbHVzaCAtIGZsdXNoIGFsbCBwZW5kaW5nIHdvcmtzLgorICogQHViaTogVUJJIGRldmljZSBkZXNjcmlwdGlvbiBvYmplY3QKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgemVybyBpbiBjYXNlIG9mIHN1Y2Nlc3MgYW5kIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBpbgorICogY2FzZSBvZiBmYWlsdXJlLgorICovCitpbnQgdWJpX3dsX2ZsdXNoKHN0cnVjdCB1YmlfZGV2aWNlICp1YmkpCit7CisJaW50IGVyciwgcGVuZGluZ19jb3VudDsKKworCXBlbmRpbmdfY291bnQgPSB1YmktPndvcmtzX2NvdW50OworCisJZGJnX3dsKCJmbHVzaCAoJWQgcGVuZGluZyB3b3JrcykiLCBwZW5kaW5nX2NvdW50KTsKKworCS8qCisJICogRXJhc2Ugd2hpbGUgdGhlIHBlbmRpbmcgd29ya3MgcXVldWUgaXMgbm90IGVtcHR5LCBidXQgbm90IG1vcmUgdGhlbgorCSAqIHRoZSBudW1iZXIgb2YgY3VycmVudGx5IHBlbmRpbmcgd29ya3MuCisJICovCisJd2hpbGUgKHBlbmRpbmdfY291bnQtLSA+IDApIHsKKwkJZXJyID0gZG9fd29yayh1YmkpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB0cmVlX2Rlc3Ryb3kgLSBkZXN0cm95IGFuIFJCLXRyZWUuCisgKiBAcm9vdDogdGhlIHJvb3Qgb2YgdGhlIHRyZWUgdG8gZGVzdHJveQorICovCitzdGF0aWMgdm9pZCB0cmVlX2Rlc3Ryb3koc3RydWN0IHJiX3Jvb3QgKnJvb3QpCit7CisJc3RydWN0IHJiX25vZGUgKnJiOworCXN0cnVjdCB1Ymlfd2xfZW50cnkgKmU7CisKKwlyYiA9IHJvb3QtPnJiX25vZGU7CisJd2hpbGUgKHJiKSB7CisJCWlmIChyYi0+cmJfbGVmdCkKKwkJCXJiID0gcmItPnJiX2xlZnQ7CisJCWVsc2UgaWYgKHJiLT5yYl9yaWdodCkKKwkJCXJiID0gcmItPnJiX3JpZ2h0OworCQllbHNlIHsKKwkJCWUgPSByYl9lbnRyeShyYiwgc3RydWN0IHViaV93bF9lbnRyeSwgcmIpOworCisJCQlyYiA9IHJiX3BhcmVudChyYik7CisJCQlpZiAocmIpIHsKKwkJCQlpZiAocmItPnJiX2xlZnQgPT0gJmUtPnJiKQorCQkJCQlyYi0+cmJfbGVmdCA9IE5VTEw7CisJCQkJZWxzZQorCQkJCQlyYi0+cmJfcmlnaHQgPSBOVUxMOworCQkJfQorCisJCQlrbWVtX2NhY2hlX2ZyZWUod2xfZW50cmllc19zbGFiLCBlKTsKKwkJfQorCX0KK30KKworLyoqCisgKiB1YmlfdGhyZWFkIC0gVUJJIGJhY2tncm91bmQgdGhyZWFkLgorICogQHU6IHRoZSBVQkkgZGV2aWNlIGRlc2NyaXB0aW9uIG9iamVjdCBwb2ludGVyCisgKi8KK3N0YXRpYyBpbnQgdWJpX3RocmVhZCh2b2lkICp1KQoreworCWludCBmYWlsdXJlcyA9IDA7CisJc3RydWN0IHViaV9kZXZpY2UgKnViaSA9IHU7CisKKwl1YmlfbXNnKCJiYWNrZ3JvdW5kIHRocmVhZCBcIiVzXCIgc3RhcnRlZCwgUElEICVkIiwKKwkJdWJpLT5iZ3RfbmFtZSwgY3VycmVudC0+cGlkKTsKKworCWZvciAoOzspIHsKKwkJaW50IGVycjsKKworCQlpZiAoa3RocmVhZF9zaG91bGRfc3RvcCgpKQorCQkJZ290byBvdXQ7CisKKwkJaWYgKHRyeV90b19mcmVlemUoKSkKKwkJCWNvbnRpbnVlOworCisJCXNwaW5fbG9jaygmdWJpLT53bF9sb2NrKTsKKwkJaWYgKGxpc3RfZW1wdHkoJnViaS0+d29ya3MpIHx8IHViaS0+cm9fbW9kZSB8fAorCQkJICAgICAgICF1YmktPnRocmVhZF9lbmFibGVkKSB7CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJc3Bpbl91bmxvY2soJnViaS0+d2xfbG9jayk7CisJCQlzY2hlZHVsZSgpOworCQkJY29udGludWU7CisJCX0KKwkJc3Bpbl91bmxvY2soJnViaS0+d2xfbG9jayk7CisKKwkJZXJyID0gZG9fd29yayh1YmkpOworCQlpZiAoZXJyKSB7CisJCQl1YmlfZXJyKCIlczogd29yayBmYWlsZWQgd2l0aCBlcnJvciBjb2RlICVkIiwKKwkJCQl1YmktPmJndF9uYW1lLCBlcnIpOworCQkJaWYgKGZhaWx1cmVzKysgPiBXTF9NQVhfRkFJTFVSRVMpIHsKKwkJCQkvKgorCQkJCSAqIFRvbyBtYW55IGZhaWx1cmVzLCBkaXNhYmxlIHRoZSB0aHJlYWQgYW5kCisJCQkJICogc3dpdGNoIHRvIHJlYWQtb25seSBtb2RlLgorCQkJCSAqLworCQkJCXViaV9tc2coIiVzOiAlZCBjb25zZWN1dGl2ZSBmYWlsdXJlcyIsCisJCQkJCXViaS0+Ymd0X25hbWUsIFdMX01BWF9GQUlMVVJFUyk7CisJCQkJdWJpX3JvX21vZGUodWJpKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlCisJCQlmYWlsdXJlcyA9IDA7CisKKwkJY29uZF9yZXNjaGVkKCk7CisJfQorCitvdXQ6CisJZGJnX3dsKCJiYWNrZ3JvdW5kIHRocmVhZCBcIiVzXCIgaXMga2lsbGVkIiwgdWJpLT5iZ3RfbmFtZSk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogY2FuY2VsX3BlbmRpbmcgLSBjYW5jZWwgYWxsIHBlbmRpbmcgd29ya3MuCisgKiBAdWJpOiBVQkkgZGV2aWNlIGRlc2NyaXB0aW9uIG9iamVjdAorICovCitzdGF0aWMgdm9pZCBjYW5jZWxfcGVuZGluZyhzdHJ1Y3QgdWJpX2RldmljZSAqdWJpKQoreworCXdoaWxlICghbGlzdF9lbXB0eSgmdWJpLT53b3JrcykpIHsKKwkJc3RydWN0IHViaV93b3JrICp3cms7CisKKwkJd3JrID0gbGlzdF9lbnRyeSh1YmktPndvcmtzLm5leHQsIHN0cnVjdCB1Ymlfd29yaywgbGlzdCk7CisJCWxpc3RfZGVsKCZ3cmstPmxpc3QpOworCQl3cmstPmZ1bmModWJpLCB3cmssIDEpOworCQl1YmktPndvcmtzX2NvdW50IC09IDE7CisJCXViaV9hc3NlcnQodWJpLT53b3Jrc19jb3VudCA+PSAwKTsKKwl9Cit9CisKKy8qKgorICogdWJpX3dsX2luaXRfc2NhbiAtIGluaXRpYWxpemUgdGhlIHdlYXItbGV2ZWxpbmcgdW5pdCB1c2luZyBzY2FubmluZworICogaW5mb3JtYXRpb24uCisgKiBAdWJpOiBVQkkgZGV2aWNlIGRlc2NyaXB0aW9uIG9iamVjdAorICogQHNpOiBzY2FubmluZyBpbmZvcm1hdGlvbgorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB6ZXJvIGluIGNhc2Ugb2Ygc3VjY2VzcywgYW5kIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBpbgorICogY2FzZSBvZiBmYWlsdXJlLgorICovCitpbnQgdWJpX3dsX2luaXRfc2NhbihzdHJ1Y3QgdWJpX2RldmljZSAqdWJpLCBzdHJ1Y3QgdWJpX3NjYW5faW5mbyAqc2kpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgcmJfbm9kZSAqcmIxLCAqcmIyOworCXN0cnVjdCB1Ymlfc2Nhbl92b2x1bWUgKnN2OworCXN0cnVjdCB1Ymlfc2Nhbl9sZWIgKnNlYiwgKnRtcDsKKwlzdHJ1Y3QgdWJpX3dsX2VudHJ5ICplOworCisKKwl1YmktPnVzZWQgPSB1YmktPmZyZWUgPSB1YmktPnNjcnViID0gUkJfUk9PVDsKKwl1YmktPnByb3QucG51bSA9IHViaS0+cHJvdC5hZWMgPSBSQl9ST09UOworCXNwaW5fbG9ja19pbml0KCZ1YmktPndsX2xvY2spOworCXViaS0+bWF4X2VjID0gc2ktPm1heF9lYzsKKwlJTklUX0xJU1RfSEVBRCgmdWJpLT53b3Jrcyk7CisKKwlzcHJpbnRmKHViaS0+Ymd0X25hbWUsIFVCSV9CR1RfTkFNRV9QQVRURVJOLCB1YmktPnViaV9udW0pOworCisJdWJpLT5iZ3RfdGhyZWFkID0ga3RocmVhZF9jcmVhdGUodWJpX3RocmVhZCwgdWJpLCB1YmktPmJndF9uYW1lKTsKKwlpZiAoSVNfRVJSKHViaS0+Ymd0X3RocmVhZCkpIHsKKwkJZXJyID0gUFRSX0VSUih1YmktPmJndF90aHJlYWQpOworCQl1YmlfZXJyKCJjYW5ub3Qgc3Bhd24gXCIlc1wiLCBlcnJvciAlZCIsIHViaS0+Ymd0X25hbWUsCisJCQllcnIpOworCQlyZXR1cm4gZXJyOworCX0KKworCWlmICh1YmlfZGV2aWNlc19jbnQgPT0gMCkgeworCQl3bF9lbnRyaWVzX3NsYWIgPSBrbWVtX2NhY2hlX2NyZWF0ZSgidWJpX3dsX2VudHJ5X3NsYWIiLAorCQkJCQkJICAgIHNpemVvZihzdHJ1Y3QgdWJpX3dsX2VudHJ5KSwKKwkJCQkJCSAgICAwLCAwLCBOVUxMLCBOVUxMKTsKKwkJaWYgKCF3bF9lbnRyaWVzX3NsYWIpCisJCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwllcnIgPSAtRU5PTUVNOworCXViaS0+bG9va3VwdGJsID0ga3phbGxvYyh1YmktPnBlYl9jb3VudCAqIHNpemVvZih2b2lkICopLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXViaS0+bG9va3VwdGJsKQorCQlnb3RvIG91dF9mcmVlOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHNlYiwgdG1wLCAmc2ktPmVyYXNlLCB1Lmxpc3QpIHsKKwkJY29uZF9yZXNjaGVkKCk7CisKKwkJZSA9IGttZW1fY2FjaGVfYWxsb2Mod2xfZW50cmllc19zbGFiLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFlKQorCQkJZ290byBvdXRfZnJlZTsKKworCQllLT5wbnVtID0gc2ViLT5wbnVtOworCQllLT5lYyA9IHNlYi0+ZWM7CisJCXViaS0+bG9va3VwdGJsW2UtPnBudW1dID0gZTsKKwkJaWYgKHNjaGVkdWxlX2VyYXNlKHViaSwgZSwgMCkpIHsKKwkJCWttZW1fY2FjaGVfZnJlZSh3bF9lbnRyaWVzX3NsYWIsIGUpOworCQkJZ290byBvdXRfZnJlZTsKKwkJfQorCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnkoc2ViLCAmc2ktPmZyZWUsIHUubGlzdCkgeworCQljb25kX3Jlc2NoZWQoKTsKKworCQllID0ga21lbV9jYWNoZV9hbGxvYyh3bF9lbnRyaWVzX3NsYWIsIEdGUF9LRVJORUwpOworCQlpZiAoIWUpCisJCQlnb3RvIG91dF9mcmVlOworCisJCWUtPnBudW0gPSBzZWItPnBudW07CisJCWUtPmVjID0gc2ViLT5lYzsKKwkJdWJpX2Fzc2VydChlLT5lYyA+PSAwKTsKKwkJZnJlZV90cmVlX2FkZCh1YmksIGUpOworCQl1YmktPmxvb2t1cHRibFtlLT5wbnVtXSA9IGU7CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeShzZWIsICZzaS0+Y29yciwgdS5saXN0KSB7CisJCWNvbmRfcmVzY2hlZCgpOworCisJCWUgPSBrbWVtX2NhY2hlX2FsbG9jKHdsX2VudHJpZXNfc2xhYiwgR0ZQX0tFUk5FTCk7CisJCWlmICghZSkKKwkJCWdvdG8gb3V0X2ZyZWU7CisKKwkJZS0+cG51bSA9IHNlYi0+cG51bTsKKwkJZS0+ZWMgPSBzZWItPmVjOworCQl1YmktPmxvb2t1cHRibFtlLT5wbnVtXSA9IGU7CisJCWlmIChzY2hlZHVsZV9lcmFzZSh1YmksIGUsIDApKSB7CisJCQlrbWVtX2NhY2hlX2ZyZWUod2xfZW50cmllc19zbGFiLCBlKTsKKwkJCWdvdG8gb3V0X2ZyZWU7CisJCX0KKwl9CisKKwl1YmlfcmJfZm9yX2VhY2hfZW50cnkocmIxLCBzdiwgJnNpLT52b2x1bWVzLCByYikgeworCQl1YmlfcmJfZm9yX2VhY2hfZW50cnkocmIyLCBzZWIsICZzdi0+cm9vdCwgdS5yYikgeworCQkJY29uZF9yZXNjaGVkKCk7CisKKwkJCWUgPSBrbWVtX2NhY2hlX2FsbG9jKHdsX2VudHJpZXNfc2xhYiwgR0ZQX0tFUk5FTCk7CisJCQlpZiAoIWUpCisJCQkJZ290byBvdXRfZnJlZTsKKworCQkJZS0+cG51bSA9IHNlYi0+cG51bTsKKwkJCWUtPmVjID0gc2ViLT5lYzsKKwkJCXViaS0+bG9va3VwdGJsW2UtPnBudW1dID0gZTsKKwkJCWlmICghc2ViLT5zY3J1YikgeworCQkJCWRiZ193bCgiYWRkIFBFQiAlZCBFQyAlZCB0byB0aGUgdXNlZCB0cmVlIiwKKwkJCQkgICAgICAgZS0+cG51bSwgZS0+ZWMpOworCQkJCXVzZWRfdHJlZV9hZGQodWJpLCBlKTsKKwkJCX0gZWxzZSB7CisJCQkJZGJnX3dsKCJhZGQgUEVCICVkIEVDICVkIHRvIHRoZSBzY3J1YiB0cmVlIiwKKwkJCQkgICAgICAgZS0+cG51bSwgZS0+ZWMpOworCQkJCXNjcnViX3RyZWVfYWRkKHViaSwgZSk7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoV0xfUkVTRVJWRURfUEVCUyA+IHViaS0+YXZhaWxfcGVicykgeworCQl1YmlfZXJyKCJubyBlbm91Z2ggcGh5c2ljYWwgZXJhc2VibG9ja3MgKCVkLCBuZWVkICVkKSIsCisJCQl1YmktPmF2YWlsX3BlYnMsIFdMX1JFU0VSVkVEX1BFQlMpOworCQlnb3RvIG91dF9mcmVlOworCX0KKwl1YmktPmF2YWlsX3BlYnMgLT0gV0xfUkVTRVJWRURfUEVCUzsKKwl1YmktPnJzdmRfcGVicyArPSBXTF9SRVNFUlZFRF9QRUJTOworCisJLyogU2NoZWR1bGUgd2Vhci1sZXZlbGluZyBpZiBuZWVkZWQgKi8KKwllcnIgPSBlbnN1cmVfd2Vhcl9sZXZlbGluZyh1YmkpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X2ZyZWU7CisKKwlyZXR1cm4gMDsKKworb3V0X2ZyZWU6CisJY2FuY2VsX3BlbmRpbmcodWJpKTsKKwl0cmVlX2Rlc3Ryb3koJnViaS0+dXNlZCk7CisJdHJlZV9kZXN0cm95KCZ1YmktPmZyZWUpOworCXRyZWVfZGVzdHJveSgmdWJpLT5zY3J1Yik7CisJa2ZyZWUodWJpLT5sb29rdXB0YmwpOworCWlmICh1YmlfZGV2aWNlc19jbnQgPT0gMCkKKwkJa21lbV9jYWNoZV9kZXN0cm95KHdsX2VudHJpZXNfc2xhYik7CisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKiBwcm90ZWN0aW9uX3RyZWVzX2Rlc3Ryb3kgLSBkZXN0cm95IHRoZSBwcm90ZWN0aW9uIFJCLXRyZWVzLgorICogQHViaTogVUJJIGRldmljZSBkZXNjcmlwdGlvbiBvYmplY3QKKyAqLworc3RhdGljIHZvaWQgcHJvdGVjdGlvbl90cmVlc19kZXN0cm95KHN0cnVjdCB1YmlfZGV2aWNlICp1YmkpCit7CisJc3RydWN0IHJiX25vZGUgKnJiOworCXN0cnVjdCB1Ymlfd2xfcHJvdF9lbnRyeSAqcGU7CisKKwlyYiA9IHViaS0+cHJvdC5hZWMucmJfbm9kZTsKKwl3aGlsZSAocmIpIHsKKwkJaWYgKHJiLT5yYl9sZWZ0KQorCQkJcmIgPSByYi0+cmJfbGVmdDsKKwkJZWxzZSBpZiAocmItPnJiX3JpZ2h0KQorCQkJcmIgPSByYi0+cmJfcmlnaHQ7CisJCWVsc2UgeworCQkJcGUgPSByYl9lbnRyeShyYiwgc3RydWN0IHViaV93bF9wcm90X2VudHJ5LCByYl9hZWMpOworCisJCQlyYiA9IHJiX3BhcmVudChyYik7CisJCQlpZiAocmIpIHsKKwkJCQlpZiAocmItPnJiX2xlZnQgPT0gJnBlLT5yYl9hZWMpCisJCQkJCXJiLT5yYl9sZWZ0ID0gTlVMTDsKKwkJCQllbHNlCisJCQkJCXJiLT5yYl9yaWdodCA9IE5VTEw7CisJCQl9CisKKwkJCWttZW1fY2FjaGVfZnJlZSh3bF9lbnRyaWVzX3NsYWIsIHBlLT5lKTsKKwkJCWtmcmVlKHBlKTsKKwkJfQorCX0KK30KKworLyoqCisgKiB1Ymlfd2xfY2xvc2UgLSBjbG9zZSB0aGUgd2Vhci1sZXZlbGluZyB1bml0LgorICogQHViaTogVUJJIGRldmljZSBkZXNjcmlwdGlvbiBvYmplY3QKKyAqLwordm9pZCB1Ymlfd2xfY2xvc2Uoc3RydWN0IHViaV9kZXZpY2UgKnViaSkKK3sKKwlkYmdfd2woImRpc2FibGUgXCIlc1wiIiwgdWJpLT5iZ3RfbmFtZSk7CisJaWYgKHViaS0+Ymd0X3RocmVhZCkKKwkJa3RocmVhZF9zdG9wKHViaS0+Ymd0X3RocmVhZCk7CisKKwlkYmdfd2woImNsb3NlIHRoZSBVQkkgd2Vhci1sZXZlbGluZyB1bml0Iik7CisKKwljYW5jZWxfcGVuZGluZyh1YmkpOworCXByb3RlY3Rpb25fdHJlZXNfZGVzdHJveSh1YmkpOworCXRyZWVfZGVzdHJveSgmdWJpLT51c2VkKTsKKwl0cmVlX2Rlc3Ryb3koJnViaS0+ZnJlZSk7CisJdHJlZV9kZXN0cm95KCZ1YmktPnNjcnViKTsKKwlrZnJlZSh1YmktPmxvb2t1cHRibCk7CisJaWYgKHViaV9kZXZpY2VzX2NudCA9PSAxKQorCQlrbWVtX2NhY2hlX2Rlc3Ryb3kod2xfZW50cmllc19zbGFiKTsKK30KKworI2lmZGVmIENPTkZJR19NVERfVUJJX0RFQlVHX1BBUkFOT0lECisKKy8qKgorICogcGFyYW5vaWRfY2hlY2tfZWMgLSBtYWtlIHN1cmUgdGhhdCB0aGUgZXJhc2UgY291bnRlciBvZiBhIHBoeXNpY2FsIGVyYXNlYmxvY2sKKyAqIGlzIGNvcnJlY3QuCisgKiBAdWJpOiBVQkkgZGV2aWNlIGRlc2NyaXB0aW9uIG9iamVjdAorICogQHBudW06IHRoZSBwaHlzaWNhbCBlcmFzZWJsb2NrIG51bWJlciB0byBjaGVjaworICogQGVjOiB0aGUgZXJhc2UgY291bnRlciB0byBjaGVjaworICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB6ZXJvIGlmIHRoZSBlcmFzZSBjb3VudGVyIG9mIHBoeXNpY2FsIGVyYXNlYmxvY2sgQHBudW0KKyAqIGlzIGVxdWl2YWxlbnQgdG8gQGVjLCAlMSBpZiBub3QsIGFuZCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgaWYgYW4gZXJyb3IKKyAqIG9jY3VycmVkLgorICovCitzdGF0aWMgaW50IHBhcmFub2lkX2NoZWNrX2VjKGNvbnN0IHN0cnVjdCB1YmlfZGV2aWNlICp1YmksIGludCBwbnVtLCBpbnQgZWMpCit7CisJaW50IGVycjsKKwlsb25nIGxvbmcgcmVhZF9lYzsKKwlzdHJ1Y3QgdWJpX2VjX2hkciAqZWNfaGRyOworCisJZWNfaGRyID0ga3phbGxvYyh1YmktPmVjX2hkcl9hbHNpemUsIEdGUF9LRVJORUwpOworCWlmICghZWNfaGRyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWVyciA9IHViaV9pb19yZWFkX2VjX2hkcih1YmksIHBudW0sIGVjX2hkciwgMCk7CisJaWYgKGVyciAmJiBlcnIgIT0gVUJJX0lPX0JJVEZMSVBTKSB7CisJCS8qIFRoZSBoZWFkZXIgZG9lcyBub3QgaGF2ZSB0byBleGlzdCAqLworCQllcnIgPSAwOworCQlnb3RvIG91dF9mcmVlOworCX0KKworCXJlYWRfZWMgPSB1Ymk2NF90b19jcHUoZWNfaGRyLT5lYyk7CisJaWYgKGVjICE9IHJlYWRfZWMpIHsKKwkJdWJpX2VycigicGFyYW5vaWQgY2hlY2sgZmFpbGVkIGZvciBQRUIgJWQiLCBwbnVtKTsKKwkJdWJpX2VycigicmVhZCBFQyBpcyAlbGxkLCBzaG91bGQgYmUgJWQiLCByZWFkX2VjLCBlYyk7CisJCXViaV9kYmdfZHVtcF9zdGFjaygpOworCQllcnIgPSAxOworCX0gZWxzZQorCQllcnIgPSAwOworCitvdXRfZnJlZToKKwlrZnJlZShlY19oZHIpOworCXJldHVybiBlcnI7Cit9CisKKy8qKgorICogcGFyYW5vaWRfY2hlY2tfaW5fd2xfdHJlZSAtIG1ha2Ugc3VyZSB0aGF0IGEgd2Vhci1sZXZlbGluZyBlbnRyeSBpcyBwcmVzZW50CisgKiBpbiBhIFdMIFJCLXRyZWUuCisgKiBAZTogdGhlIHdlYXItbGV2ZWxpbmcgZW50cnkgdG8gY2hlY2sKKyAqIEByb290OiB0aGUgcm9vdCBvZiB0aGUgdHJlZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB6ZXJvIGlmIEBlIGlzIGluIHRoZSBAcm9vdCBSQi10cmVlIGFuZCAlMSBpZiBpdAorICogaXMgbm90LgorICovCitzdGF0aWMgaW50IHBhcmFub2lkX2NoZWNrX2luX3dsX3RyZWUoc3RydWN0IHViaV93bF9lbnRyeSAqZSwKKwkJCQkgICAgIHN0cnVjdCByYl9yb290ICpyb290KQoreworCWlmIChpbl93bF90cmVlKGUsIHJvb3QpKQorCQlyZXR1cm4gMDsKKworCXViaV9lcnIoInBhcmFub2lkIGNoZWNrIGZhaWxlZCBmb3IgUEVCICVkLCBFQyAlZCwgUkItdHJlZSAlcCAiLAorCQllLT5wbnVtLCBlLT5lYywgcm9vdCk7CisJdWJpX2RiZ19kdW1wX3N0YWNrKCk7CisJcmV0dXJuIDE7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfTVREX1VCSV9ERUJVR19QQVJBTk9JRCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvM2M1MDEuYyBiL2RyaXZlcnMvbmV0LzNjNTAxLmMKaW5kZXggMDZlMzM3OC4uNGJlZTk5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvM2M1MDEuYworKysgYi9kcml2ZXJzL25ldC8zYzUwMS5jCkBAIC03MzUsNyArNzM1LDYgQEAKIAllbHNlCiAJewogICAgIAkJc2tiX3Jlc2VydmUoc2tiLDIpOwkvKiBGb3JjZSAxNiBieXRlIGFsaWdubWVudCAqLwotCQlza2ItPmRldiA9IGRldjsKIAkJLyoKIAkJICoJVGhlIHJlYWQgaW5jcmVtZW50cyB0aHJvdWdoIHRoZSBieXRlcy4gVGhlIGludGVycnVwdAogCQkgKgloYW5kbGVyIHdpbGwgZml4IHRoZSBwb2ludGVyIHdoZW4gaXQgcmV0dXJucyB0bwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvM2M1MDUuYyBiL2RyaXZlcnMvbmV0LzNjNTA1LmMKaW5kZXggNzAyYmZiMi4uZTk4NWE4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvM2M1MDUuYworKysgYi9kcml2ZXJzL25ldC8zYzUwNS5jCkBAIC02MTUsNyArNjE1LDYgQEAKIAlpZiAodGVzdF9hbmRfc2V0X2JpdCgwLCAodm9pZCAqKSAmYWRhcHRlci0+ZG1haW5nKSkKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogcnggYmxvY2tlZCwgRE1BIGluIHByb2dyZXNzLCBkaXIgJWRcbiIsIGRldi0+bmFtZSwgYWRhcHRlci0+Y3VycmVudF9kbWEuZGlyZWN0aW9uKTsKIAotCXNrYi0+ZGV2ID0gZGV2OwogCWFkYXB0ZXItPmN1cnJlbnRfZG1hLmRpcmVjdGlvbiA9IDA7CiAJYWRhcHRlci0+Y3VycmVudF9kbWEubGVuZ3RoID0gcmxlbjsKIAlhZGFwdGVyLT5jdXJyZW50X2RtYS5za2IgPSBza2I7CkBAIC0xMDI2LDcgKzEwMjUsNyBAQAogCWFkYXB0ZXItPmN1cnJlbnRfZG1hLnN0YXJ0X3RpbWUgPSBqaWZmaWVzOwogCiAJaWYgKCh1bnNpZ25lZCBsb25nKShza2ItPmRhdGEgKyBubGVuKSA+PSBNQVhfRE1BX0FERFJFU1MgfHwgbmxlbiAhPSBza2ItPmxlbikgewotCQltZW1jcHkoYWRhcHRlci0+ZG1hX2J1ZmZlciwgc2tiLT5kYXRhLCBubGVuKTsKKwkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIGFkYXB0ZXItPmRtYV9idWZmZXIsIG5sZW4pOwogCQltZW1zZXQoYWRhcHRlci0+ZG1hX2J1ZmZlcitza2ItPmxlbiwgMCwgbmxlbi1za2ItPmxlbik7CiAJCXRhcmdldCA9IGlzYV92aXJ0X3RvX2J1cyhhZGFwdGVyLT5kbWFfYnVmZmVyKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC8zYzUwNy5jIGIvZHJpdmVycy9uZXQvM2M1MDcuYwppbmRleCA1NGUxZDVhLi5lZWQ0Mjk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC8zYzUwNy5jCisrKyBiL2RyaXZlcnMvbmV0LzNjNTA3LmMKQEAgLTg3Myw3ICs4NzMsNiBAQAogCQkJfQogCiAJCQlza2JfcmVzZXJ2ZShza2IsMik7Ci0JCQlza2ItPmRldiA9IGRldjsKIAogCQkJLyogJ3NrYi0+ZGF0YScgcG9pbnRzIHRvIHRoZSBzdGFydCBvZiBza19idWZmIGRhdGEgYXJlYS4gKi8KIAkJCW1lbWNweV9mcm9taW8oc2tiX3B1dChza2IscGt0X2xlbiksIGRhdGFfZnJhbWUgKyAxMCwgcGt0X2xlbik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC8zYzUwOS5jIGIvZHJpdmVycy9uZXQvM2M1MDkuYwppbmRleCBmNzkxYmYwLi45NTg4ZGEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC8zYzUwOS5jCisrKyBiL2RyaXZlcnMvbmV0LzNjNTA5LmMKQEAgLTgzLDcgKzgzLDYgQEAKICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BtLmg+Ci0jaW5jbHVkZSA8bGludXgvcG1fbGVnYWN5Lmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4JLyogZm9yIHVkZWxheSgpICovCiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KQEAgLTEwOTEsNyArMTA5MCw2IEBACiAJCQkJcHJpbnRrKCJSZWNlaXZpbmcgcGFja2V0IHNpemUgJWQgc3RhdHVzICU0LjR4LlxuIiwKIAkJCQkJICAgcGt0X2xlbiwgcnhfc3RhdHVzKTsKIAkJCWlmIChza2IgIT0gTlVMTCkgewotCQkJCXNrYi0+ZGV2ID0gZGV2OwogCQkJCXNrYl9yZXNlcnZlKHNrYiwgMik7ICAgICAvKiBBbGlnbiBJUCBvbiAxNiBieXRlICovCiAKIAkJCQkvKiAnc2tiLT5kYXRhJyBwb2ludHMgdG8gdGhlIHN0YXJ0IG9mIHNrX2J1ZmYgZGF0YSBhcmVhLiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvM2M1MTUuYyBiL2RyaXZlcnMvbmV0LzNjNTE1LmMKaW5kZXggYzMwN2NlNi4uMjkwMTY2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvM2M1MTUuYworKysgYi9kcml2ZXJzL25ldC8zYzUxNS5jCkBAIC0xMjkyLDcgKzEyOTIsNiBAQAogCQkJCXByaW50aygiUmVjZWl2aW5nIHBhY2tldCBzaXplICVkIHN0YXR1cyAlNC40eC5cbiIsCiAJCQkJICAgICBwa3RfbGVuLCByeF9zdGF0dXMpOwogCQkJaWYgKHNrYiAhPSBOVUxMKSB7Ci0JCQkJc2tiLT5kZXYgPSBkZXY7CiAJCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsJLyogQWxpZ24gSVAgb24gMTYgYnl0ZSBib3VuZGFyaWVzICovCiAJCQkJLyogJ3NrYl9wdXQoKScgcG9pbnRzIHRvIHRoZSBzdGFydCBvZiBza19idWZmIGRhdGEgYXJlYS4gKi8KIAkJCQlpbnNsKGlvYWRkciArIFJYX0ZJRk8sCkBAIC0xMzYzLDcgKzEzNjIsNiBAQAogCQkJICAgY29weWluZyB0byBhIHByb3Blcmx5IHNpemVkIHNrYnVmZi4gKi8KIAkJCWlmIChwa3RfbGVuIDwgcnhfY29weWJyZWFrCiAJCQkgICAgJiYgKHNrYiA9IGRldl9hbGxvY19za2IocGt0X2xlbiArIDQpKSAhPSAwKSB7Ci0JCQkJc2tiLT5kZXYgPSBkZXY7CiAJCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsJLyogQWxpZ24gSVAgb24gMTYgYnl0ZSBib3VuZGFyaWVzICovCiAJCQkJLyogJ3NrYl9wdXQoKScgcG9pbnRzIHRvIHRoZSBzdGFydCBvZiBza19idWZmIGRhdGEgYXJlYS4gKi8KIAkJCQltZW1jcHkoc2tiX3B1dChza2IsIHBrdF9sZW4pLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvM2M1MjMuYyBiL2RyaXZlcnMvbmV0LzNjNTIzLmMKaW5kZXggMTdkNjFlYi4uZGExYTIyYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvM2M1MjMuYworKysgYi9kcml2ZXJzL25ldC8zYzUyMy5jCkBAIC05ODgsNyArOTg4LDYgQEAKIAkJCQlyYmQtPnN0YXR1cyA9IDA7CiAJCQkJc2tiID0gKHN0cnVjdCBza19idWZmICopIGRldl9hbGxvY19za2IodG90bGVuICsgMik7CiAJCQkJaWYgKHNrYiAhPSBOVUxMKSB7Ci0JCQkJCXNrYi0+ZGV2ID0gZGV2OwogCQkJCQlza2JfcmVzZXJ2ZShza2IsIDIpOwkvKiAxNiBieXRlIGFsaWdubWVudCAqLwogCQkJCQlza2JfcHV0KHNrYix0b3RsZW4pOwogCQkJCQlldGhfY29weV9hbmRfc3VtKHNrYiwgKGNoYXIgKikgcC0+YmFzZSsodW5zaWduZWQgbG9uZykgcmJkLT5idWZmZXIsdG90bGVuLDApOwpAQCAtMTE0Niw3ICsxMTQ1LDcgQEAKIAogCWlmIChsZW4gIT0gc2tiLT5sZW4pCiAJCW1lbXNldCgoY2hhciAqKSBwLT54bWl0X2NidWZmc1twLT54bWl0X2NvdW50XSwgMCwgRVRIX1pMRU4pOwotCW1lbWNweSgoY2hhciAqKSBwLT54bWl0X2NidWZmc1twLT54bWl0X2NvdW50XSwgKGNoYXIgKikgKHNrYi0+ZGF0YSksIHNrYi0+bGVuKTsKKwlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgKGNoYXIgKikgcC0+eG1pdF9jYnVmZnNbcC0+eG1pdF9jb3VudF0sIHNrYi0+bGVuKTsKIAogI2lmIChOVU1fWE1JVF9CVUZGUyA9PSAxKQogI2lmZGVmIE5PX05PUENPTU1BTkRTCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC8zYzUyNy5jIGIvZHJpdmVycy9uZXQvM2M1MjcuYwppbmRleCA2Yzc0MzdlLi5jN2I1NzFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC8zYzUyNy5jCisrKyBiL2RyaXZlcnMvbmV0LzNjNTI3LmMKQEAgLTExODksNyArMTE4OSw2IEBACiAJCQl9CiAKIAkJCXNrYi0+cHJvdG9jb2w9ZXRoX3R5cGVfdHJhbnMoc2tiLGRldik7Ci0JCQlza2ItPmRldj1kZXY7CiAJCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOwogIAkJCWxwLT5uZXRfc3RhdHMucnhfcGFja2V0cysrOwogIAkJCWxwLT5uZXRfc3RhdHMucnhfYnl0ZXMgKz0gbGVuZ3RoOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvM2M1OXguYyBiL2RyaXZlcnMvbmV0LzNjNTl4LmMKaW5kZXggYjQwNmVjZi4uODA5MjRmNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvM2M1OXguYworKysgYi9kcml2ZXJzL25ldC8zYzU5eC5jCkBAIC0yNDE0LDcgKzI0MTQsNiBAQAogCQkJCXByaW50ayhLRVJOX0RFQlVHICJSZWNlaXZpbmcgcGFja2V0IHNpemUgJWQgc3RhdHVzICU0LjR4LlxuIiwKIAkJCQkJICAgcGt0X2xlbiwgcnhfc3RhdHVzKTsKIAkJCWlmIChza2IgIT0gTlVMTCkgewotCQkJCXNrYi0+ZGV2ID0gZGV2OwogCQkJCXNrYl9yZXNlcnZlKHNrYiwgMik7CS8qIEFsaWduIElQIG9uIDE2IGJ5dGUgYm91bmRhcmllcyAqLwogCQkJCS8qICdza2JfcHV0KCknIHBvaW50cyB0byB0aGUgc3RhcnQgb2Ygc2tfYnVmZiBkYXRhIGFyZWEuICovCiAJCQkJaWYgKHZwLT5idXNfbWFzdGVyICYmCkBAIC0yNDkxLDcgKzI0OTAsNiBAQAogCQkJLyogQ2hlY2sgaWYgdGhlIHBhY2tldCBpcyBsb25nIGVub3VnaCB0byBqdXN0IGFjY2VwdCB3aXRob3V0CiAJCQkgICBjb3B5aW5nIHRvIGEgcHJvcGVybHkgc2l6ZWQgc2tidWZmLiAqLwogCQkJaWYgKHBrdF9sZW4gPCByeF9jb3B5YnJlYWsgJiYgKHNrYiA9IGRldl9hbGxvY19za2IocGt0X2xlbiArIDIpKSAhPSAwKSB7Ci0JCQkJc2tiLT5kZXYgPSBkZXY7CiAJCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsJLyogQWxpZ24gSVAgb24gMTYgYnl0ZSBib3VuZGFyaWVzICovCiAJCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KFZPUlRFWF9QQ0kodnApLCBkbWEsIFBLVF9CVUZfU1osIFBDSV9ETUFfRlJPTURFVklDRSk7CiAJCQkJLyogJ3NrYl9wdXQoKScgcG9pbnRzIHRvIHRoZSBzdGFydCBvZiBza19idWZmIGRhdGEgYXJlYS4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0Lzc5OTAuYyBiL2RyaXZlcnMvbmV0Lzc5OTAuYwppbmRleCAxYjNkMTFlLi5kMzk2Zjk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC83OTkwLmMKKysrIGIvZHJpdmVycy9uZXQvNzk5MC5jCkBAIC0zMzEsNyArMzMxLDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIHNrYi0+ZGV2ID0gZGV2OwogICAgICAgICAgICAgICAgICAgICAgICAgc2tiX3Jlc2VydmUgKHNrYiwgMik7ICAgICAgICAgICAvKiAxNiBieXRlIGFsaWduICovCiAgICAgICAgICAgICAgICAgICAgICAgICBza2JfcHV0IChza2IsIGxlbik7ICAgICAgICAgICAgIC8qIG1ha2Ugcm9vbSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgZXRoX2NvcHlfYW5kX3N1bShza2IsCkBAIC01NjgsNyArNTY3LDcgQEAKIAogICAgIAlpZiAoc2tiLT5sZW4gPCBFVEhfWkxFTikKICAgICAJCW1lbXNldCgoY2hhciAqKSZpYi0+dHhfYnVmW2VudHJ5XVswXSwgMCwgRVRIX1pMRU4pOwotICAgICAgICBtZW1jcHkgKChjaGFyICopJmliLT50eF9idWYgW2VudHJ5XVswXSwgc2tiLT5kYXRhLCBza2JsZW4pOworICAgICAgICBza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgJmliLT50eF9idWZbZW50cnldWzBdLCBza2JsZW4pOwogCiAgICAgICAgIC8qIE5vdywgZ2l2ZSB0aGUgcGFja2V0IHRvIHRoZSBsYW5jZSAqLwogICAgICAgICBpYi0+YnR4X3JpbmcgW2VudHJ5XS50bWQxX2JpdHMgPSAoTEVfVDFfUE9LfExFX1QxX09XTik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC84MTM5Y3AuYyBiL2RyaXZlcnMvbmV0LzgxMzljcC5jCmluZGV4IDEyYzg0NTMuLmU4YzlmMjc4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC84MTM5Y3AuYworKysgYi9kcml2ZXJzL25ldC84MTM5Y3AuYwpAQCAtNTczLDcgKzU3Myw2IEBACiAJCX0KIAogCQlza2JfcmVzZXJ2ZShuZXdfc2tiLCBSWF9PRkZTRVQpOwotCQluZXdfc2tiLT5kZXYgPSBkZXY7CiAKIAkJcGNpX3VubWFwX3NpbmdsZShjcC0+cGRldiwgbWFwcGluZywKIAkJCQkgYnVmbGVuLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOwpAQCAtODA3LDcgKzgwNiw3IEBACiAJCWlmIChtc3MpCiAJCQlmbGFncyB8PSBMYXJnZVNlbmQgfCAoKG1zcyAmIE1TU01hc2spIDw8IE1TU1NoaWZ0KTsKIAkJZWxzZSBpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCkgewotCQkJY29uc3Qgc3RydWN0IGlwaGRyICppcCA9IHNrYi0+bmguaXBoOworCQkJY29uc3Qgc3RydWN0IGlwaGRyICppcCA9IGlwX2hkcihza2IpOwogCQkJaWYgKGlwLT5wcm90b2NvbCA9PSBJUFBST1RPX1RDUCkKIAkJCQlmbGFncyB8PSBJUENTIHwgVENQQ1M7CiAJCQllbHNlIGlmIChpcC0+cHJvdG9jb2wgPT0gSVBQUk9UT19VRFApCkBAIC04MjYsNyArODI1LDcgQEAKIAkJdTMyIGZpcnN0X2xlbiwgZmlyc3RfZW9yOwogCQlkbWFfYWRkcl90IGZpcnN0X21hcHBpbmc7CiAJCWludCBmcmFnLCBmaXJzdF9lbnRyeSA9IGVudHJ5OwotCQljb25zdCBzdHJ1Y3QgaXBoZHIgKmlwID0gc2tiLT5uaC5pcGg7CisJCWNvbnN0IHN0cnVjdCBpcGhkciAqaXAgPSBpcF9oZHIoc2tiKTsKIAogCQkvKiBXZSBtdXN0IGdpdmUgdGhpcyBpbml0aWFsIGNodW5rIHRvIHRoZSBkZXZpY2UgbGFzdC4KIAkJICogT3RoZXJ3aXNlIHdlIGNvdWxkIHJhY2Ugd2l0aCB0aGUgZGV2aWNlLgpAQCAtMTA4Miw3ICsxMDgxLDYgQEAKIAkJaWYgKCFza2IpCiAJCQlnb3RvIGVycl9vdXQ7CiAKLQkJc2tiLT5kZXYgPSBjcC0+ZGV2OwogCQlza2JfcmVzZXJ2ZShza2IsIFJYX09GRlNFVCk7CiAKIAkJbWFwcGluZyA9IHBjaV9tYXBfc2luZ2xlKGNwLT5wZGV2LCBza2ItPmRhdGEsIGNwLT5yeF9idWZfc3osCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC84MTM5dG9vLmMgYi9kcml2ZXJzL25ldC84MTM5dG9vLmMKaW5kZXggOTkzMDRiMi4uYTg0NGIxZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvODEzOXRvby5jCisrKyBiL2RyaXZlcnMvbmV0LzgxMzl0b28uYwpAQCAtMTkwNCwxMCArMTkwNCwxMCBAQAogCXUzMiBsZWZ0ID0gUlhfQlVGX0xFTiAtIG9mZnNldDsKIAogCWlmIChzaXplID4gbGVmdCkgewotCQltZW1jcHkoc2tiLT5kYXRhLCByaW5nICsgb2Zmc2V0LCBsZWZ0KTsKLQkJbWVtY3B5KHNrYi0+ZGF0YStsZWZ0LCByaW5nLCBzaXplIC0gbGVmdCk7CisJCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhKHNrYiwgcmluZyArIG9mZnNldCwgbGVmdCk7CisJCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhX29mZnNldChza2IsIGxlZnQsIHJpbmcsIHNpemUgLSBsZWZ0KTsKIAl9IGVsc2UKLQkJbWVtY3B5KHNrYi0+ZGF0YSwgcmluZyArIG9mZnNldCwgc2l6ZSk7CisJCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhKHNrYiwgcmluZyArIG9mZnNldCwgc2l6ZSk7CiB9CiAjZW5kaWYKIApAQCAtMjAxMyw3ICsyMDEzLDYgQEAKIAogCQlza2IgPSBkZXZfYWxsb2Nfc2tiIChwa3Rfc2l6ZSArIDIpOwogCQlpZiAobGlrZWx5KHNrYikpIHsKLQkJCXNrYi0+ZGV2ID0gZGV2OwogCQkJc2tiX3Jlc2VydmUgKHNrYiwgMik7CS8qIDE2IGJ5dGUgYWxpZ24gdGhlIElQIGZpZWxkcy4gKi8KICNpZiBSWF9CVUZfSURYID09IDMKIAkJCXdyYXBfY29weShza2IsIHJ4X3JpbmcsIHJpbmdfb2Zmc2V0KzQsIHBrdF9zaXplKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0LzgyNTk2LmMgYi9kcml2ZXJzL25ldC84MjU5Ni5jCmluZGV4IDY0MGQ3Y2EyZS4uM2ZmMTE1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvODI1OTYuYworKysgYi9kcml2ZXJzL25ldC84MjU5Ni5jCkBAIC04MzAsNyArODMwLDYgQEAKIAkJCQlscC0+c3RhdHMucnhfZHJvcHBlZCsrOwogCQkJfQogCQkJZWxzZSB7Ci0JCQkJc2tiLT5kZXYgPSBkZXY7CiAJCQkJaWYgKCFyeF9pbl9wbGFjZSkgewogCQkJCQkvKiAxNiBieXRlIGFsaWduIHRoZSBkYXRhIGZpZWxkcyAqLwogCQkJCQlza2JfcmVzZXJ2ZShza2IsIDIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L0tjb25maWcKaW5kZXggYTNkNDZlYS4uZGNkYWQyMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC9LY29uZmlnCkBAIC00ODYsOCArNDg2LDggQEAKIAkgIGVuYWJsZXMgb2ZmbG9hZGluZyBmb3IgY2hlY2tzdW1zIG9uIHRyYW5zbWl0LiAgSWYgdW5zdXJlLCBzYXkgWS4KIAogY29uZmlnIE1JUFNfU0lNX05FVAotCXRyaXN0YXRlICJNSVBTIHNpbXVsYXRvciBOZXR3b3JrIGRldmljZSAoRVhQRVJJTUVOVEFMKSIKLQlkZXBlbmRzIG9uIE1JUFNfU0lNICYmIEVYUEVSSU1FTlRBTAorCXRyaXN0YXRlICJNSVBTIHNpbXVsYXRvciBOZXR3b3JrIGRldmljZSIKKwlkZXBlbmRzIG9uIE5FVF9FVEhFUk5FVCAmJiBNSVBTX1NJTQogCWhlbHAKIAkgIFRoZSBNSVBTTkVUIGRldmljZSBpcyBhIHNpbXBsZSBFdGhlcm5ldCBuZXR3b3JrIGRldmljZSB3aGljaCBpcwogCSAgZW11bGF0ZWQgYnkgdGhlIE1JUFMgU2ltdWxhdG9yLgpAQCAtMTQ0NCw3ICsxNDQ0LDggQEAKIAogY29uZmlnIFRDMzU4MTUKIAl0cmlzdGF0ZSAiVE9TSElCQSBUQzM1ODE1IEV0aGVybmV0IHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBORVRfUENJICYmIFBDSSAmJiBUT1NISUJBX0pNUjM5MjcKKwlkZXBlbmRzIG9uIE5FVF9QQ0kgJiYgUENJICYmIE1JUFMKKwlzZWxlY3QgTUlJCiAKIGNvbmZpZyBER1JTCiAJdHJpc3RhdGUgIkRpZ2kgSW50bC4gUmlnaHRTd2l0Y2ggU0UtWCBzdXBwb3J0IgpAQCAtMjI3MywxMSArMjI3NCwxMiBAQAogCWRlcGVuZHMgb24gR0lBTkZBUgogCiBjb25maWcgVUNDX0dFVEgKLQl0cmlzdGF0ZSAiRnJlZXNjYWxlIFFFIFVDQyBHRVRIIgotCWRlcGVuZHMgb24gUVVJQ0NfRU5HSU5FICYmIFVDQ19GQVNUCisJdHJpc3RhdGUgIkZyZWVzY2FsZSBRRSBHaWdhYml0IEV0aGVybmV0IgorCWRlcGVuZHMgb24gUVVJQ0NfRU5HSU5FCisJc2VsZWN0IFVDQ19GQVNUCiAJaGVscAotCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIEdpZ2FiaXQgRXRoZXJuZXQgbW9kZSBvZiBRRSBVQ0MuCi0JICBRRSBjYW4gYmUgZm91bmQgb24gTVBDODM2eCBDUFVzLgorCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIEdpZ2FiaXQgRXRoZXJuZXQgbW9kZSBvZiB0aGUgUVVJQ0MgRW5naW5lLAorCSAgd2hpY2ggaXMgYXZhaWxhYmxlIG9uIHNvbWUgRnJlZXNjYWxlIFNPQ3MuCiAKIGNvbmZpZyBVR0VUSF9OQVBJCiAJYm9vbCAiTkFQSSBTdXBwb3J0IgpAQCAtMjI5MSwxNCArMjI5MywxMCBAQAogCWJvb2wgIk1hYyBhZGRyZXNzIGZpbHRlcmluZyBzdXBwb3J0IgogCWRlcGVuZHMgb24gVUNDX0dFVEgKIAotY29uZmlnIFVHRVRIX1RYX09OX0RFTU9ORAotCWJvb2wgIlRyYW5zbWl0IG9uIERlbW9uZCBzdXBwb3J0IgorY29uZmlnIFVHRVRIX1RYX09OX0RFTUFORAorCWJvb2wgIlRyYW5zbWl0IG9uIERlbWFuZCBzdXBwb3J0IgogCWRlcGVuZHMgb24gVUNDX0dFVEgKIAotY29uZmlnIFVHRVRIX0hBU19HSUdBCi0JYm9vbAotCWRlcGVuZHMgb24gVUNDX0dFVEggJiYgUFBDX01QQzgzNngKLQogY29uZmlnIE1WNjQzWFhfRVRICiAJdHJpc3RhdGUgIk1WLTY0M1hYIEV0aGVybmV0IHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBNT01FTkNPX09DRUxPVF9DIHx8IE1PTUVOQ09fSkFHVUFSX0FUWCB8fCBNVjY0MzYwIHx8IE1PTUVOQ09fT0NFTE9UXzMgfHwgKFBQQ19NVUxUSVBMQVRGT1JNICYmIFBQQzMyKQpAQCAtMjkyOSwxMSArMjkyNyw2IEBACiBjb25maWcgTkVUUE9MTAogCWRlZl9ib29sIE5FVENPTlNPTEUKIAotY29uZmlnIE5FVFBPTExfUlgKLQlib29sICJOZXRwb2xsIHN1cHBvcnQgZm9yIHRyYXBwaW5nIGluY29taW5nIHBhY2tldHMiCi0JZGVmYXVsdCBuCi0JZGVwZW5kcyBvbiBORVRQT0xMCi0KIGNvbmZpZyBORVRQT0xMX1RSQVAKIAlib29sICJOZXRwb2xsIHRyYWZmaWMgdHJhcHBpbmciCiAJZGVmYXVsdCBuCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L01ha2VmaWxlCmluZGV4IDMzYWY4MzMuLjU5YzA0NTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbmV0L01ha2VmaWxlCkBAIC0xOCw3ICsxOCw3IEBACiAJCWdpYW5mYXJfc3lzZnMubwogCiBvYmotJChDT05GSUdfVUNDX0dFVEgpICs9IHVjY19nZXRoX2RyaXZlci5vCi11Y2NfZ2V0aF9kcml2ZXItb2JqcyA6PSB1Y2NfZ2V0aC5vIHVjY19nZXRoX3BoeS5vCit1Y2NfZ2V0aF9kcml2ZXItb2JqcyA6PSB1Y2NfZ2V0aC5vIHVjY19nZXRoX21paS5vCiAKICMKICMgbGluayBvcmRlciBpbXBvcnRhbnQgaGVyZQpAQCAtMjA2LDcgKzIwNiw3IEBACiBvYmotJChDT05GSUdfV0FOKSArPSB3YW4vCiBvYmotJChDT05GSUdfQVJDTkVUKSArPSBhcmNuZXQvCiBvYmotJChDT05GSUdfTkVUX1BDTUNJQSkgKz0gcGNtY2lhLwotb2JqLSQoQ09ORklHX05FVF9SQURJTykgKz0gd2lyZWxlc3MvCitvYmoteSArPSB3aXJlbGVzcy8KIG9iai0kKENPTkZJR19ORVRfVFVMSVApICs9IHR1bGlwLwogb2JqLSQoQ09ORklHX0hBTVJBRElPKSArPSBoYW1yYWRpby8KIG9iai0kKENPTkZJR19JUkRBKSArPSBpcmRhLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYTIwNjUuYyBiL2RyaXZlcnMvbmV0L2EyMDY1LmMKaW5kZXggZDc2NTQ4ZS4uMTIyNmNiYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYTIwNjUuYworKysgYi9kcml2ZXJzL25ldC9hMjA2NS5jCkBAIC0zMjAsNyArMzIwLDYgQEAKIAkJCQlyZXR1cm4gMDsKIAkJCX0KIAotCQkJc2tiLT5kZXYgPSBkZXY7CiAJCQlza2JfcmVzZXJ2ZSAoc2tiLCAyKTsJCS8qIDE2IGJ5dGUgYWxpZ24gKi8KIAkJCXNrYl9wdXQgKHNrYiwgbGVuKTsJCS8qIG1ha2Ugcm9vbSAqLwogCQkJZXRoX2NvcHlfYW5kX3N1bShza2IsCkBAIC01OTksNyArNTk4LDcgQEAKIAlpYi0+YnR4X3JpbmcgW2VudHJ5XS5sZW5ndGggPSAoLWxlbikgfCAweGYwMDA7CiAJaWItPmJ0eF9yaW5nIFtlbnRyeV0ubWlzYyA9IDA7CiAKLQltZW1jcHkgKChjaGFyICopJmliLT50eF9idWYgW2VudHJ5XVswXSwgc2tiLT5kYXRhLCBza2JsZW4pOworCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCAmaWItPnR4X2J1ZiBbZW50cnldWzBdLCBza2JsZW4pOwogCiAJLyogQ2xlYXIgdGhlIHNsYWNrIG9mIHRoZSBwYWNrZXQsIGRvIEkgbmVlZCB0aGlzPyAqLwogCWlmIChsZW4gIT0gc2tibGVuKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYWNlbmljLmMgYi9kcml2ZXJzL25ldC9hY2VuaWMuYwppbmRleCA3MTM4ZTBlLi43MTIyYjdiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9hY2VuaWMuYworKysgYi9kcml2ZXJzL25ldC9hY2VuaWMuYwpAQCAtMjAyNyw3ICsyMDI3LDYgQEAKIAkJICovCiAJCWNzdW0gPSByZXRkZXNjLT50Y3BfdWRwX2NzdW07CiAKLQkJc2tiLT5kZXYgPSBkZXY7CiAJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CiAKIAkJLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2FtZDgxMTFlLmMgYi9kcml2ZXJzL25ldC9hbWQ4MTExZS5jCmluZGV4IDk2MmM5NTQuLjY3NWZlOTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2FtZDgxMTFlLmMKKysrIGIvZHJpdmVycy9uZXQvYW1kODExMWUuYwpAQCAtNzk4LDkgKzc5OCw3IEBACiAJCQlwY2lfdW5tYXBfc2luZ2xlKGxwLT5wY2lfZGV2LGxwLT5yeF9kbWFfYWRkcltyeF9pbmRleF0sCiAJCQkJCSBscC0+cnhfYnVmZl9sZW4tMiwgUENJX0RNQV9GUk9NREVWSUNFKTsKIAkJCXNrYl9wdXQoc2tiLCBwa3RfbGVuKTsKLQkJCXNrYi0+ZGV2ID0gZGV2OwogCQkJbHAtPnJ4X3NrYnVmZltyeF9pbmRleF0gPSBuZXdfc2tiOwotCQkJbmV3X3NrYi0+ZGV2ID0gZGV2OwogCQkJbHAtPnJ4X2RtYV9hZGRyW3J4X2luZGV4XSA9IHBjaV9tYXBfc2luZ2xlKGxwLT5wY2lfZGV2LAogCQkJCQkJCQkgICBuZXdfc2tiLT5kYXRhLAogCQkJCQkJCQkgICBscC0+cnhfYnVmZl9sZW4tMiwKQEAgLTkyNiw5ICs5MjQsNyBAQAogCQlwY2lfdW5tYXBfc2luZ2xlKGxwLT5wY2lfZGV2LGxwLT5yeF9kbWFfYWRkcltyeF9pbmRleF0sCiAJCQlscC0+cnhfYnVmZl9sZW4tMiwgUENJX0RNQV9GUk9NREVWSUNFKTsKIAkJc2tiX3B1dChza2IsIHBrdF9sZW4pOwotCQlza2ItPmRldiA9IGRldjsKIAkJbHAtPnJ4X3NrYnVmZltyeF9pbmRleF0gPSBuZXdfc2tiOwotCQluZXdfc2tiLT5kZXYgPSBkZXY7CiAJCWxwLT5yeF9kbWFfYWRkcltyeF9pbmRleF0gPSBwY2lfbWFwX3NpbmdsZShscC0+cGNpX2RldiwKIAkJCW5ld19za2ItPmRhdGEsIGxwLT5yeF9idWZmX2xlbi0yLFBDSV9ETUFfRlJPTURFVklDRSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2FwcGxldGFsay9jb3BzLmMgYi9kcml2ZXJzL25ldC9hcHBsZXRhbGsvY29wcy5jCmluZGV4IGRiYTVlNTEuLmRhNmZmYTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2FwcGxldGFsay9jb3BzLmMKKysrIGIvZHJpdmVycy9uZXQvYXBwbGV0YWxrL2NvcHMuYwpAQCAtODUzLDkgKzg1Myw5IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKLSAgICAgICAgc2tiLT5tYWMucmF3ICAgID0gc2tiLT5kYXRhOyAgICAvKiBQb2ludCB0byBlbnRpcmUgcGFja2V0LiAqLworICAgICAgICBza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOyAgICAvKiBQb2ludCB0byBlbnRpcmUgcGFja2V0LiAqLwogICAgICAgICBza2JfcHVsbChza2IsMyk7Ci0gICAgICAgIHNrYi0+aC5yYXcgICAgICA9IHNrYi0+ZGF0YTsgICAgLyogUG9pbnQgdG8gZGF0YSAoU2tpcCBoZWFkZXIpLiAqLworICAgICAgICBza2JfcmVzZXRfdHJhbnNwb3J0X2hlYWRlcihza2IpOyAgICAvKiBQb2ludCB0byBkYXRhIChTa2lwIGhlYWRlcikuICovCiAKICAgICAgICAgLyogVXBkYXRlIHRoZSBjb3VudGVycy4gKi8KICAgICAgICAgbHAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2FwcGxldGFsay9sdHBjLmMgYi9kcml2ZXJzL25ldC9hcHBsZXRhbGsvbHRwYy5jCmluZGV4IDJlYTQ0Y2UuLjZhNmNiZDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2FwcGxldGFsay9sdHBjLmMKKysrIGIvZHJpdmVycy9uZXQvYXBwbGV0YWxrL2x0cGMuYwpAQCAtNzcwLDEzICs3NzAsMTMgQEAKIAlza2ItPmRhdGFbMF0gPSBkbm9kZTsKIAlza2ItPmRhdGFbMV0gPSBzbm9kZTsKIAlza2ItPmRhdGFbMl0gPSBsbGFwdHlwZTsKLQlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CS8qIHNhdmUgcG9pbnRlciB0byBsbGFwIGhlYWRlciAqLworCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CS8qIHNhdmUgcG9pbnRlciB0byBsbGFwIGhlYWRlciAqLwogCXNrYl9wdWxsKHNrYiwzKTsKIAogCS8qIGNvcHkgZGRwKHMsZSloZHIgKyBjb250ZW50cyAqLwotCW1lbWNweShza2ItPmRhdGEsKHZvaWQqKWx0ZG1hYnVmLGxlbik7CisJc2tiX2NvcHlfdG9fbGluZWFyX2RhdGEoc2tiLCBsdGRtYWJ1ZiwgbGVuKTsKIAotCXNrYi0+aC5yYXcgPSBza2ItPmRhdGE7CisJc2tiX3Jlc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKIAogCXN0YXRzLT5yeF9wYWNrZXRzKys7CiAJc3RhdHMtPnJ4X2J5dGVzKz1za2ItPmxlbjsKQEAgLTkxNywxMyArOTE3LDE0IEBACiAKIAlpbnQgaTsKIAlzdHJ1Y3QgbHRfc2VuZGxhcCBjYnVmOworCXVuc2lnbmVkIGNoYXIgKmhkcjsKIAogCWNidWYuY29tbWFuZCA9IExUX1NFTkRMQVA7CiAJY2J1Zi5kbm9kZSA9IHNrYi0+ZGF0YVswXTsKIAljYnVmLmxhcHR5cGUgPSBza2ItPmRhdGFbMl07CiAJc2tiX3B1bGwoc2tiLDMpOwkvKiBza2lwIHBhc3QgTExBUCBoZWFkZXIgKi8KIAljYnVmLmxlbmd0aCA9IHNrYi0+bGVuOwkvKiB0aGlzIGlzIGhvc3Qgb3JkZXIgKi8KLQlza2ItPmgucmF3PXNrYi0+ZGF0YTsKKwlza2JfcmVzZXRfdHJhbnNwb3J0X2hlYWRlcihza2IpOwogCiAJaWYoZGVidWcgJiBERUJVR19VUFBFUikgewogCQlwcmludGsoImNvbW1hbmQgIik7CkBAIC05MzIsMTEgKzkzMywxMyBAQAogCQlwcmludGsoIlxuIik7CiAJfQogCi0JZG9fd3JpdGUoZGV2LCZjYnVmLHNpemVvZihjYnVmKSxza2ItPmgucmF3LHNrYi0+bGVuKTsKKwloZHIgPSBza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpOworCWRvX3dyaXRlKGRldiwgJmNidWYsIHNpemVvZihjYnVmKSwgaGRyLCBza2ItPmxlbik7CiAKIAlpZihkZWJ1ZyAmIERFQlVHX1VQUEVSKSB7CiAJCXByaW50aygic2VudCAlZCBkZHAgYnl0ZXNcbiIsc2tiLT5sZW4pOwotCQlmb3IoaT0wO2k8c2tiLT5sZW47aSsrKSBwcmludGsoIiUwMnggIixza2ItPmgucmF3W2ldKTsKKwkJZm9yIChpID0gMDsgaSA8IHNrYi0+bGVuOyBpKyspCisJCQlwcmludGsoIiUwMnggIiwgaGRyW2ldKTsKIAkJcHJpbnRrKCJcbiIpOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXJjbmV0L2FyYy1yYXdtb2RlLmMgYi9kcml2ZXJzL25ldC9hcmNuZXQvYXJjLXJhd21vZGUuYwppbmRleCA2MzE4ODE0Li5lMGExOGU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9hcmNuZXQvYXJjLXJhd21vZGUuYworKysgYi9kcml2ZXJzL25ldC9hcmNuZXQvYXJjLXJhd21vZGUuYwpAQCAtMTEwLDcgKzExMCw3IEBACiAKIAlwa3QgPSAoc3RydWN0IGFyY2hkciAqKSBza2ItPmRhdGE7CiAKLQlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKIAlza2JfcHVsbChza2IsIEFSQ19IRFJfU0laRSk7CiAKIAkvKiB1cCB0byBzaXplb2YocGt0LT5zb2Z0KSBoYXMgYWxyZWFkeSBiZWVuIGNvcGllZCBmcm9tIHRoZSBjYXJkICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hcmNuZXQvYXJjbmV0LmMgYi9kcml2ZXJzL25ldC9hcmNuZXQvYXJjbmV0LmMKaW5kZXggODMwMDRmZC4uNjgxZTIwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYXJjbmV0L2FyY25ldC5jCisrKyBiL2RyaXZlcnMvbmV0L2FyY25ldC9hcmNuZXQuYwpAQCAtNTE5LDkgKzUxOSwxMiBAQAogCQkgKiByZWFsIGhlYWRlciB3aGVuIHdlIGRvIHJlYnVpbGRfaGVhZGVyLgogCQkgKi8KIAkJKih1aW50MTZfdCAqKSBza2JfcHVzaChza2IsIDIpID0gdHlwZTsKLQkJaWYgKHNrYi0+bmgucmF3IC0gc2tiLT5tYWMucmF3ICE9IDIpCisJCS8qCisJCSAqIFhYWDogV2h5IG5vdCB1c2Ugc2tiLT5tYWNfbGVuPworCQkgKi8KKwkJaWYgKHNrYi0+bmV0d29ya19oZWFkZXIgLSBza2ItPm1hY19oZWFkZXIgIT0gMikKIAkJCUJVR01TRyhEX05PUk1BTCwgImFyY25ldF9oZWFkZXI6IFlpa2VzISAgZGlmZiAoJWQpIGlzIG5vdCAyIVxuIiwKLQkJCSAgICAgICAoaW50KShza2ItPm5oLnJhdyAtIHNrYi0+bWFjLnJhdykpOworCQkJICAgICAgIChpbnQpKHNrYi0+bmV0d29ya19oZWFkZXIgLSBza2ItPm1hY19oZWFkZXIpKTsKIAkJcmV0dXJuIC0yOwkvKiByZXR1cm4gZXJyb3IgLS0gY2FuJ3QgdHJhbnNtaXQgeWV0ISAqLwogCX0KIAllbHNlIHsKQEAgLTU1NCwxMSArNTU3LDEzIEBACiAJdW5zaWduZWQgc2hvcnQgdHlwZTsKIAl1aW50OF90IGRhZGRyPTA7CiAJc3RydWN0IEFyY1Byb3RvICpwcm90bzsKLQotCWlmIChza2ItPm5oLnJhdyAtIHNrYi0+bWFjLnJhdyAhPSAyKSB7CisJLyoKKwkgKiBYWFg6IFdoeSBub3QgdXNlIHNrYi0+bWFjX2xlbj8KKwkgKi8KKwlpZiAoc2tiLT5uZXR3b3JrX2hlYWRlciAtIHNrYi0+bWFjX2hlYWRlciAhPSAyKSB7CiAJCUJVR01TRyhEX05PUk1BTCwKLQkJICAgICAicmVidWlsZF9oZWFkZXI6IHNob3VsZG4ndCBiZSBoZXJlISAoaGRyc2l6ZT0lZClcbiIsCi0JCSAgICAgKGludCkoc2tiLT5uaC5yYXcgLSBza2ItPm1hYy5yYXcpKTsKKwkJICAgICAgICJyZWJ1aWxkX2hlYWRlcjogc2hvdWxkbid0IGJlIGhlcmUhIChoZHJzaXplPSVkKVxuIiwKKwkJICAgICAgIChpbnQpKHNrYi0+bmV0d29ya19oZWFkZXIgLSBza2ItPm1hY19oZWFkZXIpKTsKIAkJcmV0dXJuIDA7CiAJfQogCXR5cGUgPSAqKHVpbnQxNl90ICopIHNrYl9wdWxsKHNrYiwgMik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hcmNuZXQvY2FwbW9kZS5jIGIvZHJpdmVycy9uZXQvYXJjbmV0L2NhcG1vZGUuYwppbmRleCA2NjQ4NTU4Li5jYzQ2MTBkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9hcmNuZXQvY2FwbW9kZS5jCisrKyBiL2RyaXZlcnMvbmV0L2FyY25ldC9jYXBtb2RlLmMKQEAgLTEyMiwxMCArMTIyLDggQEAKIAl9CiAJc2tiX3B1dChza2IsIGxlbmd0aCArIEFSQ19IRFJfU0laRSArIHNpemVvZihpbnQpKTsKIAlza2ItPmRldiA9IGRldjsKLQotCXBrdCA9IChzdHJ1Y3QgYXJjaGRyICopIHNrYi0+ZGF0YTsKLQotCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKwlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOworCXBrdCA9IChzdHJ1Y3QgYXJjaGRyICopc2tiX21hY19oZWFkZXIoc2tiKTsKIAlza2JfcHVsbChza2IsIEFSQ19IRFJfU0laRSk7CiAKIAkvKiB1cCB0byBzaXplb2YocGt0LT5zb2Z0KSBoYXMgYWxyZWFkeSBiZWVuIGNvcGllZCBmcm9tIHRoZSBjYXJkICovCkBAIC0yNzAsMTMgKzI2OCwxMyBAQAogICBza2JfcHV0KGFja3NrYiwgbGVuZ3RoICsgQVJDX0hEUl9TSVpFICk7CiAgIGFja3NrYi0+ZGV2ID0gZGV2OwogCi0gIGFja3BrdCA9IChzdHJ1Y3QgYXJjaGRyICopIGFja3NrYi0+ZGF0YTsKLQotICBhY2tza2ItPm1hYy5yYXcgPSBhY2tza2ItPmRhdGE7CisgIHNrYl9yZXNldF9tYWNfaGVhZGVyKGFja3NrYik7CisgIGFja3BrdCA9IChzdHJ1Y3QgYXJjaGRyICopc2tiX21hY19oZWFkZXIoYWNrc2tiKTsKICAgLyogc2tiX3B1bGwoYWNrc2tiLCBBUkNfSERSX1NJWkUpOyAqLwogCiAKLSAgbWVtY3B5KGFja3BrdCwgbHAtPm91dGdvaW5nLnNrYi0+ZGF0YSwgQVJDX0hEUl9TSVpFK3NpemVvZihzdHJ1Y3QgYXJjX2NhcCkpOworICBza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKGxwLT5vdXRnb2luZy5za2IsIGFja3BrdCwKKwkJQVJDX0hEUl9TSVpFICsgc2l6ZW9mKHN0cnVjdCBhcmNfY2FwKSk7CiAgIGFja3BrdC0+c29mdC5jYXAucHJvdG89MDsgLyogdXNpbmcgcHJvdG9jb2wgMCBmb3IgYWNrbm93bGVkZ2UgKi8KICAgYWNrcGt0LT5zb2Z0LmNhcC5tZXMuYWNrPWFja2VkOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hcmNuZXQvcmZjMTA1MS5jIGIvZHJpdmVycy9uZXQvYXJjbmV0L3JmYzEwNTEuYwppbmRleCA2ZDZjNjlmLi4yZGU4ODc3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9hcmNuZXQvcmZjMTA1MS5jCisrKyBiL2RyaXZlcnMvbmV0L2FyY25ldC9yZmMxMDUxLmMKQEAgLTk0LDcgKzk0LDcgQEAKIAlpbnQgaGRyX3NpemUgPSBBUkNfSERSX1NJWkUgKyBSRkMxMDUxX0hEUl9TSVpFOwogCiAJLyogUHVsbCBvZmYgdGhlIGFyY25ldCBoZWFkZXIuICovCi0Jc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOworCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CiAJc2tiX3B1bGwoc2tiLCBoZHJfc2l6ZSk7CiAKIAlpZiAocGt0LT5oYXJkLmRlc3QgPT0gMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2FyY25ldC9yZmMxMjAxLmMgYi9kcml2ZXJzL25ldC9hcmNuZXQvcmZjMTIwMS5jCmluZGV4IGJlZTM0MjIuLjQ2MGEwOTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2FyY25ldC9yZmMxMjAxLmMKKysrIGIvZHJpdmVycy9uZXQvYXJjbmV0L3JmYzEyMDEuYwpAQCAtOTYsNyArOTYsNyBAQAogCWludCBoZHJfc2l6ZSA9IEFSQ19IRFJfU0laRSArIFJGQzEyMDFfSERSX1NJWkU7CiAKIAkvKiBQdWxsIG9mZiB0aGUgYXJjbmV0IGhlYWRlci4gKi8KLQlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKIAlza2JfcHVsbChza2IsIGhkcl9zaXplKTsKIAogCWlmIChwa3QtPmhhcmQuZGVzdCA9PSAwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXJpYWRuZS5jIGIvZHJpdmVycy9uZXQvYXJpYWRuZS5jCmluZGV4IDlkZmMwOWIuLmEwZTY4ZTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2FyaWFkbmUuYworKysgYi9kcml2ZXJzL25ldC9hcmlhZG5lLmMKQEAgLTc0Myw3ICs3NDMsNiBAQAogCSAgICB9CiAKIAotCSAgICBza2ItPmRldiA9IGRldjsKIAkgICAgc2tiX3Jlc2VydmUoc2tiLDIpOwkJLyogMTYgYnl0ZSBhbGlnbiAqLwogCSAgICBza2JfcHV0KHNrYixwa3RfbGVuKTsJLyogTWFrZSByb29tICovCiAJICAgIGV0aF9jb3B5X2FuZF9zdW0oc2tiLCAoY2hhciAqKXByaXYtPnJ4X2J1ZmZbZW50cnldLCBwa3RfbGVuLDApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXJtL2FtNzljOTYxYS5jIGIvZHJpdmVycy9uZXQvYXJtL2FtNzljOTYxYS5jCmluZGV4IGRkZDEyZDQuLjhmMGQ3Y2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2FybS9hbTc5Yzk2MWEuYworKysgYi9kcml2ZXJzL25ldC9hcm0vYW03OWM5NjFhLmMKQEAgLTUyNiw3ICs1MjYsNiBAQAogCQlza2IgPSBkZXZfYWxsb2Nfc2tiKGxlbiArIDIpOwogCiAJCWlmIChza2IpIHsKLQkJCXNrYi0+ZGV2ID0gZGV2OwogCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsKIAogCQkJYW1fcmVhZGJ1ZmZlcihkZXYsIHBrdGFkZHIsIHNrYl9wdXQoc2tiLCBsZW4pLCBsZW4pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXJtL2F0OTFfZXRoZXIuYyBiL2RyaXZlcnMvbmV0L2FybS9hdDkxX2V0aGVyLmMKaW5kZXggMTYyMWI4Zi4uMTUyZmE3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYXJtL2F0OTFfZXRoZXIuYworKysgYi9kcml2ZXJzL25ldC9hcm0vYXQ5MV9ldGhlci5jCkBAIC04NTgsNyArODU4LDYgQEAKIAkJCXNrYl9yZXNlcnZlKHNrYiwgMik7CiAJCQltZW1jcHkoc2tiX3B1dChza2IsIHBrdGxlbiksIHBfcmVjdiwgcGt0bGVuKTsKIAotCQkJc2tiLT5kZXYgPSBkZXY7CiAJCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOwogCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKIAkJCWxwLT5zdGF0cy5yeF9ieXRlcyArPSBwa3RsZW47CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hcm0vZXA5M3h4X2V0aC5jIGIvZHJpdmVycy9uZXQvYXJtL2VwOTN4eF9ldGguYwppbmRleCBkZDY5OGIwLi4yNDM4YzViIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9hcm0vZXA5M3h4X2V0aC5jCisrKyBiL2RyaXZlcnMvbmV0L2FybS9lcDkzeHhfZXRoLmMKQEAgLTI1NSw3ICsyNTUsNiBAQAogCiAJCXNrYiA9IGRldl9hbGxvY19za2IobGVuZ3RoICsgMik7CiAJCWlmIChsaWtlbHkoc2tiICE9IE5VTEwpKSB7Ci0JCQlza2ItPmRldiA9IGRldjsKIAkJCXNrYl9yZXNlcnZlKHNrYiwgMik7CiAJCQlkbWFfc3luY19zaW5nbGUoTlVMTCwgZXAtPmRlc2NzLT5yZGVzY1tlbnRyeV0uYnVmX2FkZHIsCiAJCQkJCQlsZW5ndGgsIERNQV9GUk9NX0RFVklDRSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hcm0vZXRoZXIxLmMgYi9kcml2ZXJzL25ldC9hcm0vZXRoZXIxLmMKaW5kZXggYTI5MjE4OC4uZjA3NWNlYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYXJtL2V0aGVyMS5jCisrKyBiL2RyaXZlcnMvbmV0L2FybS9ldGhlcjEuYwpAQCAtODc1LDcgKzg3NSw2IEBACiAJCQlza2IgPSBkZXZfYWxsb2Nfc2tiIChsZW5ndGggKyAyKTsKIAogCQkJaWYgKHNrYikgewotCQkJCXNrYi0+ZGV2ID0gZGV2OwogCQkJCXNrYl9yZXNlcnZlIChza2IsIDIpOwogCiAJCQkJZXRoZXIxX3JlYWRidWZmZXIgKGRldiwgc2tiX3B1dCAoc2tiLCBsZW5ndGgpLCByYmQucmJkX2J1ZmwsIGxlbmd0aCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hcm0vZXRoZXIzLmMgYi9kcml2ZXJzL25ldC9hcm0vZXRoZXIzLmMKaW5kZXggODQxMTc4My4uMzJkYTJlYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYXJtL2V0aGVyMy5jCisrKyBiL2RyaXZlcnMvbmV0L2FybS9ldGhlcjMuYwpAQCAtNjYxLDcgKzY2MSw2IEBACiAJCQlpZiAoc2tiKSB7CiAJCQkJdW5zaWduZWQgY2hhciAqYnVmOwogCi0JCQkJc2tiLT5kZXYgPSBkZXY7CiAJCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsKIAkJCQlidWYgPSBza2JfcHV0KHNrYiwgbGVuZ3RoKTsKIAkJCQlldGhlcjNfcmVhZGJ1ZmZlcihkZXYsIGJ1ZiArIDEyLCBsZW5ndGggLSAxMik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hdDE3MDAuYyBiL2RyaXZlcnMvbmV0L2F0MTcwMC5jCmluZGV4IDU2YWU4YmEuLmJlZDhlMGViIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9hdDE3MDAuYworKysgYi9kcml2ZXJzL25ldC9hdDE3MDAuYwpAQCAtNzY4LDcgKzc2OCw2IEBACiAJCQkJbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKIAkJCQlicmVhazsKIAkJCX0KLQkJCXNrYi0+ZGV2ID0gZGV2OwogCQkJc2tiX3Jlc2VydmUoc2tiLDIpOwogCiAJCQlpbnN3KGlvYWRkciArIERBVEFQT1JULCBza2JfcHV0KHNrYixwa3RfbGVuKSwgKHBrdF9sZW4gKyAxKSA+PiAxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2F0YXJpX2Jpb25ldC5jIGIvZHJpdmVycy9uZXQvYXRhcmlfYmlvbmV0LmMKaW5kZXggNGUzYmY2YS4uM2Q4N2JkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYXRhcmlfYmlvbmV0LmMKKysrIGIvZHJpdmVycy9uZXQvYXRhcmlfYmlvbmV0LmMKQEAgLTQ1Myw3ICs0NTMsOCBAQAogCQlzdGRtYV9sb2NrKGJpb25ldF9pbnRyLCBOVUxMKTsKIAkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCQlpZiggIVNUUkFNX0FERFIoYnVmK2xlbmd0aC0xKSApIHsKLQkJCW1lbWNweShuaWNfcGFja2V0LT5idWZmZXIsIHNrYi0+ZGF0YSwgbGVuZ3RoKTsKKwkJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCBuaWNfcGFja2V0LT5idWZmZXIsCisJCQkJCQkgIGxlbmd0aCk7CiAJCQlidWYgPSAodW5zaWduZWQgbG9uZykmKChzdHJ1Y3QgbmljX3BrdF9zICopcGh5c19uaWNfcGFja2V0KS0+YnVmZmVyOwogCQl9CiAKQEAgLTU0NCwxMyArNTQ1LDEzIEBACiAJCQkJYnJlYWs7CiAJCQl9CiAKLQkJCXNrYi0+ZGV2ID0gZGV2OwogCQkJc2tiX3Jlc2VydmUoIHNrYiwgMiApOwkJLyogMTYgQnl0ZSBhbGlnbiAgKi8KIAkJCXNrYl9wdXQoIHNrYiwgcGt0X2xlbiApOwkvKiBtYWtlIHJvb20gKi8KIAogCQkJLyogJ3NrYi0+ZGF0YScgcG9pbnRzIHRvIHRoZSBzdGFydCBvZiBza19idWZmIGRhdGEgYXJlYS4KIAkJCSAqLwotCQkJbWVtY3B5KHNrYi0+ZGF0YSwgbmljX3BhY2tldC0+YnVmZmVyLCBwa3RfbGVuKTsKKwkJCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhKHNrYiwgbmljX3BhY2tldC0+YnVmZmVyLAorCQkJCQkJcGt0X2xlbik7CiAJCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoIHNrYiwgZGV2ICk7CiAJCQluZXRpZl9yeChza2IpOwogCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2F0YXJpX3BhbXNuZXQuYyBiL2RyaXZlcnMvbmV0L2F0YXJpX3BhbXNuZXQuYwppbmRleCAzYjU0MzYxLi41NDcxNDQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9hdGFyaV9wYW1zbmV0LmMKKysrIGIvZHJpdmVycy9uZXQvYXRhcmlfcGFtc25ldC5jCkBAIC03MTcsNyArNzE3LDggQEAKIAogCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAJCWlmKCAhU1RSQU1fQUREUihidWYrbGVuZ3RoLTEpICkgewotCQkJbWVtY3B5KG5pY19wYWNrZXQtPmJ1ZmZlciwgc2tiLT5kYXRhLCBsZW5ndGgpOworCQkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIG5pY19wYWNrZXQtPmJ1ZmZlciwKKwkJCQkJCSAgbGVuZ3RoKTsKIAkJCWJ1ZiA9ICh1bnNpZ25lZCBsb25nKXBoeXNfbmljX3BhY2tldDsKIAkJfQogCkBAIC03OTIsNyArNzkzLDggQEAKIAogCQkJLyogJ3NrYi0+ZGF0YScgcG9pbnRzIHRvIHRoZSBzdGFydCBvZiBza19idWZmIGRhdGEgYXJlYS4KIAkJCSAqLwotCQkJbWVtY3B5KHNrYi0+ZGF0YSwgbmljX3BhY2tldC0+YnVmZmVyLCBwa3RfbGVuKTsKKwkJCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhKHNrYiwgbmljX3BhY2tldC0+YnVmZmVyLAorCQkJCQkJcGt0X2xlbik7CiAJCQluZXRpZl9yeChza2IpOwogCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKIAkJCWxwLT5zdGF0cy5yeF9wYWNrZXRzKys7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hdGFyaWxhbmNlLmMgYi9kcml2ZXJzL25ldC9hdGFyaWxhbmNlLmMKaW5kZXggN2UzN2FjOC4uZGZhOGI5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYXRhcmlsYW5jZS5jCisrKyBiL2RyaXZlcnMvbmV0L2F0YXJpbGFuY2UuYwpAQCAtMTA0Nyw3ICsxMDQ3LDYgQEAKIAkJCQkJCSAgIHBrdF9sZW4gKTsKIAkJCQl9CiAKLQkJCQlza2ItPmRldiA9IGRldjsKIAkJCQlza2JfcmVzZXJ2ZSggc2tiLCAyICk7CS8qIDE2IGJ5dGUgYWxpZ24gKi8KIAkJCQlza2JfcHV0KCBza2IsIHBrdF9sZW4gKTsJLyogTWFrZSByb29tICovCiAJCQkJbHAtPm1lbWNweV9mKCBza2ItPmRhdGEsIFBLVEJVRl9BRERSKGhlYWQpLCBwa3RfbGVuICk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hdGwxL2F0bDFfbWFpbi5jIGIvZHJpdmVycy9uZXQvYXRsMS9hdGwxX21haW4uYwppbmRleCA4NjA2ZWFjLi40YjFkNGQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9hdGwxL2F0bDFfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2F0bDEvYXRsMV9tYWluLmMKQEAgLTQwOCw3ICs0MDgsNiBAQAogc3RhdGljIHUxNiBhdGwxX2FsbG9jX3J4X2J1ZmZlcnMoc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlcikKIHsKIAlzdHJ1Y3QgYXRsMV9yZmRfcmluZyAqcmZkX3JpbmcgPSAmYWRhcHRlci0+cmZkX3Jpbmc7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItPm5ldGRldjsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGFkYXB0ZXItPnBkZXY7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CkBAIC00NDQsNyArNDQzLDYgQEAKIAkJICogdGhlIDE0IGJ5dGUgTUFDIGhlYWRlciBpcyByZW1vdmVkCiAJCSAqLwogCQlza2JfcmVzZXJ2ZShza2IsIE5FVF9JUF9BTElHTik7Ci0JCXNrYi0+ZGV2ID0gbmV0ZGV2OwogCiAJCWJ1ZmZlcl9pbmZvLT5hbGxvY2VkID0gMTsKIAkJYnVmZmVyX2luZm8tPnNrYiA9IHNrYjsKQEAgLTEyOTYsMTkgKzEyOTQsMjEgQEAKIAkJfQogCiAJCWlmIChza2ItPnByb3RvY29sID09IG50b2hzKEVUSF9QX0lQKSkgewotCQkJc2tiLT5uaC5pcGgtPnRvdF9sZW4gPSAwOwotCQkJc2tiLT5uaC5pcGgtPmNoZWNrID0gMDsKLQkJCXNrYi0+aC50aC0+Y2hlY2sgPQotCQkJICAgIH5jc3VtX3RjcHVkcF9tYWdpYyhza2ItPm5oLmlwaC0+c2FkZHIsCi0JCQkJCSAgICAgICBza2ItPm5oLmlwaC0+ZGFkZHIsIDAsCi0JCQkJCSAgICAgICBJUFBST1RPX1RDUCwgMCk7Ci0JCQlpcG9mc3QgPSBza2ItPm5oLnJhdyAtIHNrYi0+ZGF0YTsKKwkJCXN0cnVjdCBpcGhkciAqaXBoID0gaXBfaGRyKHNrYik7CisKKwkJCWlwaC0+dG90X2xlbiA9IDA7CisJCQlpcGgtPmNoZWNrID0gMDsKKwkJCXRjcF9oZHIoc2tiKS0+Y2hlY2sgPSB+Y3N1bV90Y3B1ZHBfbWFnaWMoaXBoLT5zYWRkciwKKwkJCQkJCQkJIGlwaC0+ZGFkZHIsIDAsCisJCQkJCQkJCSBJUFBST1RPX1RDUCwKKwkJCQkJCQkJIDApOworCQkJaXBvZnN0ID0gc2tiX25ldHdvcmtfb2Zmc2V0KHNrYik7CiAJCQlpZiAoaXBvZnN0ICE9IEVORVRfSEVBREVSX1NJWkUpIC8qIDgwMi4zIGZyYW1lICovCiAJCQkJdHNvLT50c29wbCB8PSAxIDw8IFRTT19QQVJBTV9FVEhUWVBFX1NISUZUOwogCi0JCQl0c28tPnRzb3BsIHw9IChza2ItPm5oLmlwaC0+aWhsICYKKwkJCXRzby0+dHNvcGwgfD0gKGlwaC0+aWhsICYKIAkJCQlDU1VNX1BBUkFNX0lQSExfTUFTSykgPDwgQ1NVTV9QQVJBTV9JUEhMX1NISUZUOwotCQkJdHNvLT50c29wbCB8PSAoKHNrYi0+aC50aC0+ZG9mZiA8PCAyKSAmCisJCQl0c28tPnRzb3BsIHw9ICh0Y3BfaGRybGVuKHNrYikgJgogCQkJCVRTT19QQVJBTV9UQ1BIRFJMRU5fTUFTSykgPDwgVFNPX1BBUkFNX1RDUEhEUkxFTl9TSElGVDsKIAkJCXRzby0+dHNvcGwgfD0gKHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemUgJgogCQkJCVRTT19QQVJBTV9NU1NfTUFTSykgPDwgVFNPX1BBUkFNX01TU19TSElGVDsKQEAgLTEzMjcsOCArMTMyNyw4IEBACiAJdTggY3NzLCBjc287CiAKIAlpZiAobGlrZWx5KHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1BBUlRJQUwpKSB7Ci0JCWNzbyA9IHNrYi0+aC5yYXcgLSBza2ItPmRhdGE7Ci0JCWNzcyA9IChza2ItPmgucmF3ICsgc2tiLT5jc3VtX29mZnNldCkgLSBza2ItPmRhdGE7CisJCWNzbyA9IHNrYl90cmFuc3BvcnRfb2Zmc2V0KHNrYik7CisJCWNzcyA9IGNzbyArIHNrYi0+Y3N1bV9vZmZzZXQ7CiAJCWlmICh1bmxpa2VseShjc28gJiAweDEpKSB7CiAJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHBheWxvYWQgb2Zmc2V0ICE9IGV2ZW4gbnVtYmVyXG4iLAogCQkJCWF0bDFfZHJpdmVyX25hbWUpOwpAQCAtMTM3MCw4ICsxMzcwLDcgQEAKIAogCWlmICh0Y3Bfc2VnKSB7CiAJCS8qIFRTTy9HU08gKi8KLQkJcHJvdG9faGRyX2xlbiA9Ci0JCSAgICAoKHNrYi0+aC5yYXcgLSBza2ItPmRhdGEpICsgKHNrYi0+aC50aC0+ZG9mZiA8PCAyKSk7CisJCXByb3RvX2hkcl9sZW4gPSBza2JfdHJhbnNwb3J0X29mZnNldChza2IpICsgdGNwX2hkcmxlbihza2IpOwogCQlidWZmZXJfaW5mby0+bGVuZ3RoID0gcHJvdG9faGRyX2xlbjsKIAkJcGFnZSA9IHZpcnRfdG9fcGFnZShza2ItPmRhdGEpOwogCQlvZmZzZXQgPSAodW5zaWduZWQgbG9uZylza2ItPmRhdGEgJiB+UEFHRV9NQVNLOwpAQCAtMTU2Myw4ICsxNTYyLDggQEAKIAltc3MgPSBza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplOwogCWlmIChtc3MpIHsKIAkJaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfSVApKSB7Ci0JCQlwcm90b19oZHJfbGVuID0gKChza2ItPmgucmF3IC0gc2tiLT5kYXRhKSArCi0JCQkJCSAoc2tiLT5oLnRoLT5kb2ZmIDw8IDIpKTsKKwkJCXByb3RvX2hkcl9sZW4gPSAoc2tiX3RyYW5zcG9ydF9vZmZzZXQoc2tiKSArCisJCQkJCSB0Y3BfaGRybGVuKHNrYikpOwogCQkJaWYgKHVubGlrZWx5KHByb3RvX2hkcl9sZW4gPiBsZW4pKSB7CiAJCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKIAkJCQlyZXR1cm4gTkVUREVWX1RYX09LOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXRwLmMgYi9kcml2ZXJzL25ldC9hdHAuYwppbmRleCAyZDMwNmZjLi4xOGFiYTgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9hdHAuYworKysgYi9kcml2ZXJzL25ldC9hdHAuYwpAQCAtNzkzLDcgKzc5Myw2IEBACiAJCQlscC0+c3RhdHMucnhfZHJvcHBlZCsrOwogCQkJZ290byBkb25lOwogCQl9Ci0JCXNrYi0+ZGV2ID0gZGV2OwogCiAJCXNrYl9yZXNlcnZlKHNrYiwgMik7CS8qIEFsaWduIElQIG9uIDE2IGJ5dGUgYm91bmRhcmllcyAqLwogCQlyZWFkX2Jsb2NrKGlvYWRkciwgcGt0X2xlbiwgc2tiX3B1dChza2IscGt0X2xlbiksIGRldi0+aWZfcG9ydCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hdTEwMDBfZXRoLmMgYi9kcml2ZXJzL25ldC9hdTEwMDBfZXRoLmMKaW5kZXggNjlhZTIyOS4uZDEwZmI4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYXUxMDAwX2V0aC5jCisrKyBiL2RyaXZlcnMvbmV0L2F1MTAwMF9ldGguYwpAQCAtMTEyNSw3ICsxMTI1LDcgQEAKIAl9CiAKIAlwREIgPSBhdXAtPnR4X2RiX2ludXNlW2F1cC0+dHhfaGVhZF07Ci0JbWVtY3B5KCh2b2lkICopcERCLT52YWRkciwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIHBEQi0+dmFkZHIsIHNrYi0+bGVuKTsKIAlpZiAoc2tiLT5sZW4gPCBFVEhfWkxFTikgewogCQlmb3IgKGk9c2tiLT5sZW47IGk8RVRIX1pMRU47IGkrKykgewogCQkJKChjaGFyICopcERCLT52YWRkcilbaV0gPSAwOwpAQCAtMTIwNSw3ICsxMjA1LDYgQEAKIAkJCQlhdXAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKIAkJCQljb250aW51ZTsKIAkJCX0KLQkJCXNrYi0+ZGV2ID0gZGV2OwogCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsJLyogMTYgYnl0ZSBJUCBoZWFkZXIgYWxpZ24gKi8KIAkJCWV0aF9jb3B5X2FuZF9zdW0oc2tiLAogCQkJCSh1bnNpZ25lZCBjaGFyICopcERCLT52YWRkciwgZnJtbGVuLCAwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2I0NC5jIGIvZHJpdmVycy9uZXQvYjQ0LmMKaW5kZXggZDc0MmJmZS4uODc5YTJmZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYjQ0LmMKKysrIGIvZHJpdmVycy9uZXQvYjQ0LmMKQEAgLTgyNSwxMiArODI1LDExIEBACiAJCQlpZiAoY29weV9za2IgPT0gTlVMTCkKIAkJCQlnb3RvIGRyb3BfaXRfbm9fcmVjeWNsZTsKIAotCQkJY29weV9za2ItPmRldiA9IGJwLT5kZXY7CiAJCQlza2JfcmVzZXJ2ZShjb3B5X3NrYiwgMik7CiAJCQlza2JfcHV0KGNvcHlfc2tiLCBsZW4pOwogCQkJLyogRE1BIHN5bmMgZG9uZSBhYm92ZSwgY29weSBqdXN0IHRoZSBhY3R1YWwgcGFja2V0ICovCi0JCQltZW1jcHkoY29weV9za2ItPmRhdGEsIHNrYi0+ZGF0YSticC0+cnhfb2Zmc2V0LCBsZW4pOwotCisJCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhX29mZnNldChza2IsIGJwLT5yeF9vZmZzZXQsCisJCQkJCQkJIGNvcHlfc2tiLT5kYXRhLCBsZW4pOwogCQkJc2tiID0gY29weV9za2I7CiAJCX0KIAkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOwpAQCAtMTAwNyw3ICsxMDA2LDggQEAKIAkJCWdvdG8gZXJyX291dDsKIAkJfQogCi0JCW1lbWNweShza2JfcHV0KGJvdW5jZV9za2IsIGxlbiksIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgc2tiX3B1dChib3VuY2Vfc2tiLCBsZW4pLAorCQkJCQkgIHNrYi0+bGVuKTsKIAkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKIAkJc2tiID0gYm91bmNlX3NrYjsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ibWFjLmMgYi9kcml2ZXJzL25ldC9ibWFjLmMKaW5kZXggYzE0MzMwNGQuLjQ2MTI3MjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2JtYWMuYworKysgYi9kcml2ZXJzL25ldC9ibWFjLmMKQEAgLTcxNSw3ICs3MTUsNiBAQAogCQlpZiAoc2tiICE9IE5VTEwpIHsKIAkJCW5iIC09IEVUSEVSQ1JDOwogCQkJc2tiX3B1dChza2IsIG5iKTsKLQkJCXNrYi0+ZGV2ID0gZGV2OwogCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKIAkJCW5ldGlmX3J4KHNrYik7CiAJCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYm54Mi5jIGIvZHJpdmVycy9uZXQvYm54Mi5jCmluZGV4IGU4NWY1ZWMuLmY5OGEyMjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2JueDIuYworKysgYi9kcml2ZXJzL25ldC9ibngyLmMKQEAgLTE4ODQsMTAgKzE4ODQsOCBAQAogCQkJCWdvdG8gcmV1c2Vfcng7CiAKIAkJCS8qIGFsaWduZWQgY29weSAqLwotCQkJbWVtY3B5KG5ld19za2ItPmRhdGEsCi0JCQkJc2tiLT5kYXRhICsgYnAtPnJ4X29mZnNldCAtIDIsCi0JCQkJbGVuICsgMik7Ci0KKwkJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGFfb2Zmc2V0KHNrYiwgYnAtPnJ4X29mZnNldCAtIDIsCisJCQkJICAgICAgbmV3X3NrYi0+ZGF0YSwgbGVuICsgMik7CiAJCQlza2JfcmVzZXJ2ZShuZXdfc2tiLCAyKTsKIAkJCXNrYl9wdXQobmV3X3NrYiwgbGVuKTsKIApAQCAtNDUxMyw2ICs0NTExLDcgQEAKIAlpZiAoKG1zcyA9IHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemUpICYmCiAJCShza2ItPmxlbiA+IChicC0+ZGV2LT5tdHUgKyBFVEhfSExFTikpKSB7CiAJCXUzMiB0Y3Bfb3B0X2xlbiwgaXBfdGNwX2xlbjsKKwkJc3RydWN0IGlwaGRyICppcGg7CiAKIAkJaWYgKHNrYl9oZWFkZXJfY2xvbmVkKHNrYikgJiYKIAkJICAgIHBza2JfZXhwYW5kX2hlYWQoc2tiLCAwLCAwLCBHRlBfQVRPTUlDKSkgewpAQCAtNDUyMCwyNSArNDUxOSwyMyBAQAogCQkJcmV0dXJuIE5FVERFVl9UWF9PSzsKIAkJfQogCi0JCXRjcF9vcHRfbGVuID0gKChza2ItPmgudGgtPmRvZmYgLSA1KSAqIDQpOwogCQl2bGFuX3RhZ19mbGFncyB8PSBUWF9CRF9GTEFHU19TV19MU087CiAKIAkJdGNwX29wdF9sZW4gPSAwOwotCQlpZiAoc2tiLT5oLnRoLT5kb2ZmID4gNSkgewotCQkJdGNwX29wdF9sZW4gPSAoc2tiLT5oLnRoLT5kb2ZmIC0gNSkgPDwgMjsKLQkJfQotCQlpcF90Y3BfbGVuID0gKHNrYi0+bmguaXBoLT5paGwgPDwgMikgKyBzaXplb2Yoc3RydWN0IHRjcGhkcik7CisJCWlmICh0Y3BfaGRyKHNrYiktPmRvZmYgPiA1KQorCQkJdGNwX29wdF9sZW4gPSB0Y3Bfb3B0bGVuKHNrYik7CiAKLQkJc2tiLT5uaC5pcGgtPmNoZWNrID0gMDsKLQkJc2tiLT5uaC5pcGgtPnRvdF9sZW4gPSBodG9ucyhtc3MgKyBpcF90Y3BfbGVuICsgdGNwX29wdF9sZW4pOwotCQlza2ItPmgudGgtPmNoZWNrID0KLQkJCX5jc3VtX3RjcHVkcF9tYWdpYyhza2ItPm5oLmlwaC0+c2FkZHIsCi0JCQkJCSAgICBza2ItPm5oLmlwaC0+ZGFkZHIsCi0JCQkJCSAgICAwLCBJUFBST1RPX1RDUCwgMCk7CisJCWlwX3RjcF9sZW4gPSBpcF9oZHJsZW4oc2tiKSArIHNpemVvZihzdHJ1Y3QgdGNwaGRyKTsKIAotCQlpZiAodGNwX29wdF9sZW4gfHwgKHNrYi0+bmguaXBoLT5paGwgPiA1KSkgewotCQkJdmxhbl90YWdfZmxhZ3MgfD0gKChza2ItPm5oLmlwaC0+aWhsIC0gNSkgKwotCQkJCSh0Y3Bfb3B0X2xlbiA+PiAyKSkgPDwgODsKKwkJaXBoID0gaXBfaGRyKHNrYik7CisJCWlwaC0+Y2hlY2sgPSAwOworCQlpcGgtPnRvdF9sZW4gPSBodG9ucyhtc3MgKyBpcF90Y3BfbGVuICsgdGNwX29wdF9sZW4pOworCQl0Y3BfaGRyKHNrYiktPmNoZWNrID0gfmNzdW1fdGNwdWRwX21hZ2ljKGlwaC0+c2FkZHIsCisJCQkJCQkJIGlwaC0+ZGFkZHIsIDAsCisJCQkJCQkJIElQUFJPVE9fVENQLCAwKTsKKwkJaWYgKHRjcF9vcHRfbGVuIHx8IChpcGgtPmlobCA+IDUpKSB7CisJCQl2bGFuX3RhZ19mbGFncyB8PSAoKGlwaC0+aWhsIC0gNSkgKworCQkJCQkgICAodGNwX29wdF9sZW4gPj4gMikpIDw8IDg7CiAJCX0KIAl9CiAJZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kXzNhZC5jIGIvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kXzNhZC5jCmluZGV4IDNmYjM1NGQuLjdlMDNmNDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF8zYWQuYworKysgYi9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfM2FkLmMKQEAgLTg4NCw4ICs4ODQsOCBAQAogCX0KIAogCXNrYi0+ZGV2ID0gc2xhdmUtPmRldjsKLQlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7Ci0Jc2tiLT5uaC5yYXcgPSBza2ItPmRhdGEgKyBFVEhfSExFTjsKKwlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOworCXNrYi0+bmV0d29ya19oZWFkZXIgPSBza2ItPm1hY19oZWFkZXIgKyBFVEhfSExFTjsKIAlza2ItPnByb3RvY29sID0gUEtUX1RZUEVfTEFDUERVOwogCXNrYi0+cHJpb3JpdHkgPSBUQ19QUklPX0NPTlRST0w7CiAKQEAgLTkyOCw4ICs5MjgsOCBAQAogCXNrYl9yZXNlcnZlKHNrYiwgMTYpOwogCiAJc2tiLT5kZXYgPSBzbGF2ZS0+ZGV2OwotCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKLQlza2ItPm5oLnJhdyA9IHNrYi0+ZGF0YSArIEVUSF9ITEVOOworCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CisJc2tiLT5uZXR3b3JrX2hlYWRlciA9IHNrYi0+bWFjX2hlYWRlciArIEVUSF9ITEVOOwogCXNrYi0+cHJvdG9jb2wgPSBQS1RfVFlQRV9MQUNQRFU7CiAKIAltYXJrZXJfaGVhZGVyID0gKHN0cnVjdCBtYXJrZXJfaGVhZGVyICopc2tiX3B1dChza2IsIGxlbmd0aCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfYWxiLmMgYi9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfYWxiLmMKaW5kZXggMjE3YTJlZS4uOTJjM2I2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX2FsYi5jCisrKyBiL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF9hbGIuYwpAQCAtMTA0LDEwICsxMDQsMTUgQEAKIH07CiAjcHJhZ21hIHBhY2soKQogCitzdGF0aWMgaW5saW5lIHN0cnVjdCBhcnBfcGt0ICphcnBfcGt0KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIChzdHJ1Y3QgYXJwX3BrdCAqKXNrYl9uZXR3b3JrX2hlYWRlcihza2IpOworfQorCiAvKiBGb3J3YXJkIGRlY2xhcmF0aW9uICovCiBzdGF0aWMgdm9pZCBhbGJfc2VuZF9sZWFybmluZ19wYWNrZXRzKHN0cnVjdCBzbGF2ZSAqc2xhdmUsIHU4IG1hY19hZGRyW10pOwogCi1zdGF0aWMgaW5saW5lIHU4IF9zaW1wbGVfaGFzaCh1OCAqaGFzaF9zdGFydCwgaW50IGhhc2hfc2l6ZSkKK3N0YXRpYyBpbmxpbmUgdTggX3NpbXBsZV9oYXNoKGNvbnN0IHU4ICpoYXNoX3N0YXJ0LCBpbnQgaGFzaF9zaXplKQogewogCWludCBpOwogCXU4IGhhc2ggPSAwOwpAQCAtNjEzLDcgKzYxOCw3IEBACiBzdGF0aWMgc3RydWN0IHNsYXZlICpybGJfY2hvb3NlX2NoYW5uZWwoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGJvbmRpbmcgKmJvbmQpCiB7CiAJc3RydWN0IGFsYl9ib25kX2luZm8gKmJvbmRfaW5mbyA9ICYoQk9ORF9BTEJfSU5GTyhib25kKSk7Ci0Jc3RydWN0IGFycF9wa3QgKmFycCA9IChzdHJ1Y3QgYXJwX3BrdCAqKXNrYi0+bmgucmF3OworCXN0cnVjdCBhcnBfcGt0ICphcnAgPSBhcnBfcGt0KHNrYik7CiAJc3RydWN0IHNsYXZlICphc3NpZ25lZF9zbGF2ZTsKIAlzdHJ1Y3QgcmxiX2NsaWVudF9pbmZvICpjbGllbnRfaW5mbzsKIAl1MzIgaGFzaF9pbmRleCA9IDA7CkBAIC03MDEsNyArNzA2LDcgQEAKICAqLwogc3RhdGljIHN0cnVjdCBzbGF2ZSAqcmxiX2FycF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBib25kaW5nICpib25kKQogewotCXN0cnVjdCBhcnBfcGt0ICphcnAgPSAoc3RydWN0IGFycF9wa3QgKilza2ItPm5oLnJhdzsKKwlzdHJ1Y3QgYXJwX3BrdCAqYXJwID0gYXJwX3BrdChza2IpOwogCXN0cnVjdCBzbGF2ZSAqdHhfc2xhdmUgPSBOVUxMOwogCiAJaWYgKGFycC0+b3BfY29kZSA9PSBfX2NvbnN0YW50X2h0b25zKEFSUE9QX1JFUExZKSkgewpAQCAtODkwLDggKzg5NSw4IEBACiAJCWRhdGEgPSBza2JfcHV0KHNrYiwgc2l6ZSk7CiAJCW1lbWNweShkYXRhLCAmcGt0LCBzaXplKTsKIAotCQlza2ItPm1hYy5yYXcgPSBkYXRhOwotCQlza2ItPm5oLnJhdyA9IGRhdGEgKyBFVEhfSExFTjsKKwkJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKKwkJc2tiLT5uZXR3b3JrX2hlYWRlciA9IHNrYi0+bWFjX2hlYWRlciArIEVUSF9ITEVOOwogCQlza2ItPnByb3RvY29sID0gcGt0LnR5cGU7CiAJCXNrYi0+cHJpb3JpdHkgPSBUQ19QUklPX0NPTlRST0w7CiAJCXNrYi0+ZGV2ID0gc2xhdmUtPmRldjsKQEAgLTEyNjMsMTAgKzEyNjgsMTAgQEAKIAlpbnQgaGFzaF9zaXplID0gMDsKIAlpbnQgZG9fdHhfYmFsYW5jZSA9IDE7CiAJdTMyIGhhc2hfaW5kZXggPSAwOwotCXU4ICpoYXNoX3N0YXJ0ID0gTlVMTDsKKwljb25zdCB1OCAqaGFzaF9zdGFydCA9IE5VTEw7CiAJaW50IHJlcyA9IDE7CiAKLQlza2ItPm1hYy5yYXcgPSAodW5zaWduZWQgY2hhciAqKXNrYi0+ZGF0YTsKKwlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwogCWV0aF9kYXRhID0gZXRoX2hkcihza2IpOwogCiAJLyogbWFrZSBzdXJlIHRoYXQgdGhlIGN1cnJfYWN0aXZlX3NsYXZlIGFuZCB0aGUgc2xhdmVzIGxpc3QgZG8KQEAgLTEyODAsMTUgKzEyODUsMTggQEAKIAl9CiAKIAlzd2l0Y2ggKG50b2hzKHNrYi0+cHJvdG9jb2wpKSB7Ci0JY2FzZSBFVEhfUF9JUDoKKwljYXNlIEVUSF9QX0lQOiB7CisJCWNvbnN0IHN0cnVjdCBpcGhkciAqaXBoID0gaXBfaGRyKHNrYik7CisKIAkJaWYgKChtZW1jbXAoZXRoX2RhdGEtPmhfZGVzdCwgbWFjX2JjYXN0LCBFVEhfQUxFTikgPT0gMCkgfHwKLQkJICAgIChza2ItPm5oLmlwaC0+ZGFkZHIgPT0gaXBfYmNhc3QpIHx8Ci0JCSAgICAoc2tiLT5uaC5pcGgtPnByb3RvY29sID09IElQUFJPVE9fSUdNUCkpIHsKKwkJICAgIChpcGgtPmRhZGRyID09IGlwX2JjYXN0KSB8fAorCQkgICAgKGlwaC0+cHJvdG9jb2wgPT0gSVBQUk9UT19JR01QKSkgewogCQkJZG9fdHhfYmFsYW5jZSA9IDA7CiAJCQlicmVhazsKIAkJfQotCQloYXNoX3N0YXJ0ID0gKGNoYXIqKSYoc2tiLT5uaC5pcGgtPmRhZGRyKTsKLQkJaGFzaF9zaXplID0gc2l6ZW9mKHNrYi0+bmguaXBoLT5kYWRkcik7CisJCWhhc2hfc3RhcnQgPSAoY2hhciAqKSYoaXBoLT5kYWRkcik7CisJCWhhc2hfc2l6ZSA9IHNpemVvZihpcGgtPmRhZGRyKTsKKwl9CiAJCWJyZWFrOwogCWNhc2UgRVRIX1BfSVBWNjoKIAkJaWYgKG1lbWNtcChldGhfZGF0YS0+aF9kZXN0LCBtYWNfYmNhc3QsIEVUSF9BTEVOKSA9PSAwKSB7CkBAIC0xMjk2LDggKzEzMDQsOCBAQAogCQkJYnJlYWs7CiAJCX0KIAotCQloYXNoX3N0YXJ0ID0gKGNoYXIqKSYoc2tiLT5uaC5pcHY2aC0+ZGFkZHIpOwotCQloYXNoX3NpemUgPSBzaXplb2Yoc2tiLT5uaC5pcHY2aC0+ZGFkZHIpOworCQloYXNoX3N0YXJ0ID0gKGNoYXIgKikmKGlwdjZfaGRyKHNrYiktPmRhZGRyKTsKKwkJaGFzaF9zaXplID0gc2l6ZW9mKGlwdjZfaGRyKHNrYiktPmRhZGRyKTsKIAkJYnJlYWs7CiAJY2FzZSBFVEhfUF9JUFg6CiAJCWlmIChpcHhfaGRyKHNrYiktPmlweF9jaGVja3N1bSAhPQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX21haW4uYyBiL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF9tYWluLmMKaW5kZXggZTQ3MjRkOC4uNzI0YmNlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX21haW4uYworKysgYi9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfbWFpbi5jCkBAIC0xMzYwLDEzICsxMzYwLDYgQEAKIAkJZ290byBlcnJfdW5kb19mbGFnczsKIAl9CiAKLQlpZiAoc2xhdmVfZGV2LT5nZXRfc3RhdHMgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9OT1RJQ0UgRFJWX05BTUUKLQkJCSI6ICVzOiB0aGUgZHJpdmVyIGZvciBzbGF2ZSBkZXZpY2UgJXMgZG9lcyBub3QgcHJvdmlkZSAiCi0JCQkiZ2V0X3N0YXRzIGZ1bmN0aW9uLCBuZXR3b3JrIHN0YXRpc3RpY3Mgd2lsbCBiZSAiCi0JCQkiaW5hY2N1cmF0ZS5cbiIsIGJvbmRfZGV2LT5uYW1lLCBzbGF2ZV9kZXYtPm5hbWUpOwotCX0KLQogCW5ld19zbGF2ZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzbGF2ZSksIEdGUF9LRVJORUwpOwogCWlmICghbmV3X3NsYXZlKSB7CiAJCXJlcyA9IC1FTk9NRU07CkBAIC0yNTI0LDcgKzI1MTcsNyBAQAogCQkJCSAoMiAqIHNpemVvZih1MzIpKSkpKQogCQlnb3RvIG91dF91bmxvY2s7CiAKLQlhcnAgPSBza2ItPm5oLmFycGg7CisJYXJwID0gYXJwX2hkcihza2IpOwogCWlmIChhcnAtPmFyX2hsbiAhPSBkZXYtPmFkZHJfbGVuIHx8CiAJICAgIHNrYi0+cGt0X3R5cGUgPT0gUEFDS0VUX09USEVSSE9TVCB8fAogCSAgICBza2ItPnBrdF90eXBlID09IFBBQ0tFVF9MT09QQkFDSyB8fApAQCAtMzQ3Niw3ICszNDY5LDcgQEAKIAkJCQkgICAgc3RydWN0IG5ldF9kZXZpY2UgKmJvbmRfZGV2LCBpbnQgY291bnQpCiB7CiAJc3RydWN0IGV0aGhkciAqZGF0YSA9IChzdHJ1Y3QgZXRoaGRyICopc2tiLT5kYXRhOwotCXN0cnVjdCBpcGhkciAqaXBoID0gc2tiLT5uaC5pcGg7CisJc3RydWN0IGlwaGRyICppcGggPSBpcF9oZHIoc2tiKTsKIAl1MTYgKmxheWVyNGhkciA9ICh1MTYgKikoKHUzMiAqKWlwaCArIGlwaC0+aWhsKTsKIAlpbnQgbGF5ZXI0X3hvciA9IDA7CiAKQEAgLTM2NDAsMzUgKzM2MzMsMzIgQEAKIAlyZWFkX2xvY2tfYmgoJmJvbmQtPmxvY2spOwogCiAJYm9uZF9mb3JfZWFjaF9zbGF2ZShib25kLCBzbGF2ZSwgaSkgewotCQlpZiAoc2xhdmUtPmRldi0+Z2V0X3N0YXRzKSB7Ci0JCQlzc3RhdHMgPSBzbGF2ZS0+ZGV2LT5nZXRfc3RhdHMoc2xhdmUtPmRldik7CisJCXNzdGF0cyA9IHNsYXZlLT5kZXYtPmdldF9zdGF0cyhzbGF2ZS0+ZGV2KTsKKwkJc3RhdHMtPnJ4X3BhY2tldHMgKz0gc3N0YXRzLT5yeF9wYWNrZXRzOworCQlzdGF0cy0+cnhfYnl0ZXMgKz0gc3N0YXRzLT5yeF9ieXRlczsKKwkJc3RhdHMtPnJ4X2Vycm9ycyArPSBzc3RhdHMtPnJ4X2Vycm9yczsKKwkJc3RhdHMtPnJ4X2Ryb3BwZWQgKz0gc3N0YXRzLT5yeF9kcm9wcGVkOwogCi0JCQlzdGF0cy0+cnhfcGFja2V0cyArPSBzc3RhdHMtPnJ4X3BhY2tldHM7Ci0JCQlzdGF0cy0+cnhfYnl0ZXMgKz0gc3N0YXRzLT5yeF9ieXRlczsKLQkJCXN0YXRzLT5yeF9lcnJvcnMgKz0gc3N0YXRzLT5yeF9lcnJvcnM7Ci0JCQlzdGF0cy0+cnhfZHJvcHBlZCArPSBzc3RhdHMtPnJ4X2Ryb3BwZWQ7CisJCXN0YXRzLT50eF9wYWNrZXRzICs9IHNzdGF0cy0+dHhfcGFja2V0czsKKwkJc3RhdHMtPnR4X2J5dGVzICs9IHNzdGF0cy0+dHhfYnl0ZXM7CisJCXN0YXRzLT50eF9lcnJvcnMgKz0gc3N0YXRzLT50eF9lcnJvcnM7CisJCXN0YXRzLT50eF9kcm9wcGVkICs9IHNzdGF0cy0+dHhfZHJvcHBlZDsKIAotCQkJc3RhdHMtPnR4X3BhY2tldHMgKz0gc3N0YXRzLT50eF9wYWNrZXRzOwotCQkJc3RhdHMtPnR4X2J5dGVzICs9IHNzdGF0cy0+dHhfYnl0ZXM7Ci0JCQlzdGF0cy0+dHhfZXJyb3JzICs9IHNzdGF0cy0+dHhfZXJyb3JzOwotCQkJc3RhdHMtPnR4X2Ryb3BwZWQgKz0gc3N0YXRzLT50eF9kcm9wcGVkOworCQlzdGF0cy0+bXVsdGljYXN0ICs9IHNzdGF0cy0+bXVsdGljYXN0OworCQlzdGF0cy0+Y29sbGlzaW9ucyArPSBzc3RhdHMtPmNvbGxpc2lvbnM7CiAKLQkJCXN0YXRzLT5tdWx0aWNhc3QgKz0gc3N0YXRzLT5tdWx0aWNhc3Q7Ci0JCQlzdGF0cy0+Y29sbGlzaW9ucyArPSBzc3RhdHMtPmNvbGxpc2lvbnM7CisJCXN0YXRzLT5yeF9sZW5ndGhfZXJyb3JzICs9IHNzdGF0cy0+cnhfbGVuZ3RoX2Vycm9yczsKKwkJc3RhdHMtPnJ4X292ZXJfZXJyb3JzICs9IHNzdGF0cy0+cnhfb3Zlcl9lcnJvcnM7CisJCXN0YXRzLT5yeF9jcmNfZXJyb3JzICs9IHNzdGF0cy0+cnhfY3JjX2Vycm9yczsKKwkJc3RhdHMtPnJ4X2ZyYW1lX2Vycm9ycyArPSBzc3RhdHMtPnJ4X2ZyYW1lX2Vycm9yczsKKwkJc3RhdHMtPnJ4X2ZpZm9fZXJyb3JzICs9IHNzdGF0cy0+cnhfZmlmb19lcnJvcnM7CisJCXN0YXRzLT5yeF9taXNzZWRfZXJyb3JzICs9IHNzdGF0cy0+cnhfbWlzc2VkX2Vycm9yczsKIAotCQkJc3RhdHMtPnJ4X2xlbmd0aF9lcnJvcnMgKz0gc3N0YXRzLT5yeF9sZW5ndGhfZXJyb3JzOwotCQkJc3RhdHMtPnJ4X292ZXJfZXJyb3JzICs9IHNzdGF0cy0+cnhfb3Zlcl9lcnJvcnM7Ci0JCQlzdGF0cy0+cnhfY3JjX2Vycm9ycyArPSBzc3RhdHMtPnJ4X2NyY19lcnJvcnM7Ci0JCQlzdGF0cy0+cnhfZnJhbWVfZXJyb3JzICs9IHNzdGF0cy0+cnhfZnJhbWVfZXJyb3JzOwotCQkJc3RhdHMtPnJ4X2ZpZm9fZXJyb3JzICs9IHNzdGF0cy0+cnhfZmlmb19lcnJvcnM7Ci0JCQlzdGF0cy0+cnhfbWlzc2VkX2Vycm9ycyArPSBzc3RhdHMtPnJ4X21pc3NlZF9lcnJvcnM7Ci0KLQkJCXN0YXRzLT50eF9hYm9ydGVkX2Vycm9ycyArPSBzc3RhdHMtPnR4X2Fib3J0ZWRfZXJyb3JzOwotCQkJc3RhdHMtPnR4X2NhcnJpZXJfZXJyb3JzICs9IHNzdGF0cy0+dHhfY2Fycmllcl9lcnJvcnM7Ci0JCQlzdGF0cy0+dHhfZmlmb19lcnJvcnMgKz0gc3N0YXRzLT50eF9maWZvX2Vycm9yczsKLQkJCXN0YXRzLT50eF9oZWFydGJlYXRfZXJyb3JzICs9IHNzdGF0cy0+dHhfaGVhcnRiZWF0X2Vycm9yczsKLQkJCXN0YXRzLT50eF93aW5kb3dfZXJyb3JzICs9IHNzdGF0cy0+dHhfd2luZG93X2Vycm9yczsKLQkJfQorCQlzdGF0cy0+dHhfYWJvcnRlZF9lcnJvcnMgKz0gc3N0YXRzLT50eF9hYm9ydGVkX2Vycm9yczsKKwkJc3RhdHMtPnR4X2NhcnJpZXJfZXJyb3JzICs9IHNzdGF0cy0+dHhfY2Fycmllcl9lcnJvcnM7CisJCXN0YXRzLT50eF9maWZvX2Vycm9ycyArPSBzc3RhdHMtPnR4X2ZpZm9fZXJyb3JzOworCQlzdGF0cy0+dHhfaGVhcnRiZWF0X2Vycm9ycyArPSBzc3RhdHMtPnR4X2hlYXJ0YmVhdF9lcnJvcnM7CisJCXN0YXRzLT50eF93aW5kb3dfZXJyb3JzICs9IHNzdGF0cy0+dHhfd2luZG93X2Vycm9yczsKIAl9CiAKIAlyZWFkX3VubG9ja19iaCgmYm9uZC0+bG9jayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jYXNzaW5pLmMgYi9kcml2ZXJzL25ldC9jYXNzaW5pLmMKaW5kZXggYzgxMjY0OC4uNGFlYzc0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY2Fzc2luaS5jCisrKyBiL2RyaXZlcnMvbmV0L2Nhc3NpbmkuYwpAQCAtMTk5NSw3ICsxOTk1LDYgQEAKIAkJcmV0dXJuIC0xOwogCiAJKnNrYnJlZiA9IHNrYjsKLQlza2ItPmRldiA9IGNwLT5kZXY7CiAJc2tiX3Jlc2VydmUoc2tiLCBzd2l2ZWwpOwogCiAJcCA9IHNrYi0+ZGF0YTsKQEAgLTI4MjIsMTAgKzI4MjEsOCBAQAogCiAJY3RybCA9IDA7CiAJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1BBUlRJQUwpIHsKLQkJdTY0IGNzdW1fc3RhcnRfb2ZmLCBjc3VtX3N0dWZmX29mZjsKLQotCQljc3VtX3N0YXJ0X29mZiA9ICh1NjQpIChza2ItPmgucmF3IC0gc2tiLT5kYXRhKTsKLQkJY3N1bV9zdHVmZl9vZmYgPSBjc3VtX3N0YXJ0X29mZiArIHNrYi0+Y3N1bV9vZmZzZXQ7CisJCWNvbnN0IHU2NCBjc3VtX3N0YXJ0X29mZiA9IHNrYl90cmFuc3BvcnRfb2Zmc2V0KHNrYik7CisJCWNvbnN0IHU2NCBjc3VtX3N0dWZmX29mZiA9IGNzdW1fc3RhcnRfb2ZmICsgc2tiLT5jc3VtX29mZnNldDsKIAogCQljdHJsID0gIFRYX0RFU0NfQ1NVTV9FTiB8CiAJCQlDQVNfQkFTRShUWF9ERVNDX0NTVU1fU1RBUlQsIGNzdW1fc3RhcnRfb2ZmKSB8CkBAIC0yODQ5LDggKzI4NDYsOCBAQAogCQkJICAgICAgY3RybCB8IFRYX0RFU0NfU09GLCAwKTsKIAkJZW50cnkgPSBUWF9ERVNDX05FWFQocmluZywgZW50cnkpOwogCi0JCW1lbWNweSh0eF90aW55X2J1ZihjcCwgcmluZywgZW50cnkpLCBza2ItPmRhdGEgKwotCQkgICAgICAgbGVuIC0gdGFib3J0LCB0YWJvcnQpOworCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhX29mZnNldChza2IsIGxlbiAtIHRhYm9ydCwKKwkJCSAgICAgIHR4X3RpbnlfYnVmKGNwLCByaW5nLCBlbnRyeSksIHRhYm9ydCk7CiAJCW1hcHBpbmcgPSB0eF90aW55X21hcChjcCwgcmluZywgZW50cnksIHRlbnRyeSk7CiAJCWNhc193cml0ZV90eGQoY3AsIHJpbmcsIGVudHJ5LCBtYXBwaW5nLCB0YWJvcnQsIGN0cmwsCiAJCQkgICAgICAobnJfZnJhZ3MgPT0gMCkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2hlbHNpby9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L2NoZWxzaW8vTWFrZWZpbGUKaW5kZXggMzgyZDIzZi4uNzQzYWQ4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY2hlbHNpby9NYWtlZmlsZQorKysgYi9kcml2ZXJzL25ldC9jaGVsc2lvL01ha2VmaWxlCkBAIC00LDggKzQsNiBAQAogCiBvYmotJChDT05GSUdfQ0hFTFNJT19UMSkgKz0gY3hnYi5vCiAKLWN4Z2ItJChDT05GSUdfQ0hFTFNJT19UMV8xRykgKz0gaXhmMTAxMC5vIG1hYy5vIG12ODhlMXh4eC5vIHZzYzczMjYubyB2c2M4MjQ0Lm8KK2N4Z2ItJChDT05GSUdfQ0hFTFNJT19UMV8xRykgKz0gbWFjLm8gbXY4OGUxeHh4Lm8gdnNjNzMyNi5vCiBjeGdiLW9ianMgOj0gY3hnYjIubyBlc3BpLm8gdHAubyBwbTMzOTMubyBzZ2UubyBzdWJyLm8gXAogCSAgICAgbXY4OHgyMDF4Lm8gbXkzMTI2Lm8gJChjeGdiLXkpCi0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2hlbHNpby9jb21tb24uaCBiL2RyaXZlcnMvbmV0L2NoZWxzaW8vY29tbW9uLmgKaW5kZXggNzg3ZjJmMi4uOGJhNzAyYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY2hlbHNpby9jb21tb24uaAorKysgYi9kcml2ZXJzL25ldC9jaGVsc2lvL2NvbW1vbi5oCkBAIC0zMjIsOSArMzIyLDkgQEAKIAl1bnNpZ25lZCBjaGFyICAgICAgICAgICBtZGlvX21kaWludjsKIAl1bnNpZ25lZCBjaGFyICAgICAgICAgICBtZGlvX21kYzsKIAl1bnNpZ25lZCBjaGFyICAgICAgICAgICBtZGlvX3BoeWJhc2VhZGRyOwotCXN0cnVjdCBnbWFjICAgICAgICAgICAgKmdtYWM7Ci0Jc3RydWN0IGdwaHkgICAgICAgICAgICAqZ3BoeTsKLQlzdHJ1Y3QgbWRpb19vcHMgICAgICAgICptZGlvX29wczsKKwljb25zdCBzdHJ1Y3QgZ21hYyAgICAgICpnbWFjOworCWNvbnN0IHN0cnVjdCBncGh5ICAgICAgKmdwaHk7CisJY29uc3Qgc3RydWN0IG1kaW9fb3BzICAqbWRpb19vcHM7CiAJY29uc3QgY2hhciAgICAgICAgICAgICAqZGVzYzsKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2NoZWxzaW8vY3BoeS5oIGIvZHJpdmVycy9uZXQvY2hlbHNpby9jcGh5LmgKaW5kZXggY2Y5MTQzNC4uNzlkODU1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY2hlbHNpby9jcGh5LmgKKysrIGIvZHJpdmVycy9uZXQvY2hlbHNpby9jcGh5LmgKQEAgLTEwMCw3ICsxMDAsNyBAQAogCiAJdTMyIGVsbWVyX2dwbzsKIAotCXN0cnVjdCBjcGh5X29wcyAqb3BzOyAgICAgICAgICAgICAgICAvKiBQSFkgb3BlcmF0aW9ucyAqLworCWNvbnN0IHN0cnVjdCBjcGh5X29wcyAqb3BzOyAgICAgICAgICAgIC8qIFBIWSBvcGVyYXRpb25zICovCiAJaW50ICgqbWRpb19yZWFkKShhZGFwdGVyX3QgKmFkYXB0ZXIsIGludCBwaHlfYWRkciwgaW50IG1tZF9hZGRyLAogCQkJIGludCByZWdfYWRkciwgdW5zaWduZWQgaW50ICp2YWwpOwogCWludCAoKm1kaW9fd3JpdGUpKGFkYXB0ZXJfdCAqYWRhcHRlciwgaW50IHBoeV9hZGRyLCBpbnQgbW1kX2FkZHIsCkBAIC0xMzYsNyArMTM2LDcgQEAKIC8qIENvbnZlbmllbmNlIGluaXRpYWxpemVyICovCiBzdGF0aWMgaW5saW5lIHZvaWQgY3BoeV9pbml0KHN0cnVjdCBjcGh5ICpwaHksIGFkYXB0ZXJfdCAqYWRhcHRlciwKIAkJCSAgICAgaW50IHBoeV9hZGRyLCBzdHJ1Y3QgY3BoeV9vcHMgKnBoeV9vcHMsCi0JCQkgICAgIHN0cnVjdCBtZGlvX29wcyAqbWRpb19vcHMpCisJCQkgICAgIGNvbnN0IHN0cnVjdCBtZGlvX29wcyAqbWRpb19vcHMpCiB7CiAJcGh5LT5hZGFwdGVyID0gYWRhcHRlcjsKIAlwaHktPmFkZHIgICAgPSBwaHlfYWRkcjsKQEAgLTE1MSw3ICsxNTEsNyBAQAogc3RydWN0IGdwaHkgewogCS8qIENvbnN0cnVjdCBhIFBIWSBpbnN0YW5jZSB3aXRoIHRoZSBnaXZlbiBQSFkgYWRkcmVzcyAqLwogCXN0cnVjdCBjcGh5ICooKmNyZWF0ZSkoYWRhcHRlcl90ICphZGFwdGVyLCBpbnQgcGh5X2FkZHIsCi0JCQkgICAgICAgc3RydWN0IG1kaW9fb3BzICptZGlvX29wcyk7CisJCQkgICAgICAgY29uc3Qgc3RydWN0IG1kaW9fb3BzICptZGlvX29wcyk7CiAKIAkvKgogCSAqIFJlc2V0IHRoZSBQSFkgY2hpcC4gIFRoaXMgcmVzZXRzIHRoZSB3aG9sZSBQSFkgY2hpcCwgbm90IGluZGl2aWR1YWwKQEAgLTE2MCwxMSArMTYwLDkgQEAKIAlpbnQgKCpyZXNldCkoYWRhcHRlcl90ICphZGFwdGVyKTsKIH07CiAKLWV4dGVybiBzdHJ1Y3QgZ3BoeSB0MV9teTMxMjZfb3BzOwotZXh0ZXJuIHN0cnVjdCBncGh5IHQxX212ODhlMXh4eF9vcHM7Ci1leHRlcm4gc3RydWN0IGdwaHkgdDFfdnNjODI0NF9vcHM7Ci1leHRlcm4gc3RydWN0IGdwaHkgdDFfeHBha19vcHM7Ci1leHRlcm4gc3RydWN0IGdwaHkgdDFfbXY4OHgyMDF4X29wczsKLWV4dGVybiBzdHJ1Y3QgZ3BoeSB0MV9kdW1teV9waHlfb3BzOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBncGh5IHQxX215MzEyNl9vcHM7CitleHRlcm4gY29uc3Qgc3RydWN0IGdwaHkgdDFfbXY4OGUxeHh4X29wczsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgZ3BoeSB0MV92c2M4MjQ0X29wczsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgZ3BoeSB0MV9tdjg4eDIwMXhfb3BzOwogCiAjZW5kaWYgLyogX0NYR0JfQ1BIWV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2hlbHNpby9nbWFjLmggYi9kcml2ZXJzL25ldC9jaGVsc2lvL2dtYWMuaAppbmRleCAwMDZhMmViLi5kNDIzMzc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jaGVsc2lvL2dtYWMuaAorKysgYi9kcml2ZXJzL25ldC9jaGVsc2lvL2dtYWMuaApAQCAtMTI2LDcgKzEyNiw3IEBACiBzdHJ1Y3QgY21hYyB7CiAJc3RydWN0IGNtYWNfc3RhdGlzdGljcyBzdGF0czsKIAlhZGFwdGVyX3QgKmFkYXB0ZXI7Ci0Jc3RydWN0IGNtYWNfb3BzICpvcHM7CisJY29uc3Qgc3RydWN0IGNtYWNfb3BzICpvcHM7CiAJY21hY19pbnN0YW5jZSAqaW5zdGFuY2U7CiB9OwogCkBAIC0xMzYsMTEgKzEzNiw3IEBACiAJaW50ICgqcmVzZXQpKGFkYXB0ZXJfdCAqKTsKIH07CiAKLWV4dGVybiBzdHJ1Y3QgZ21hYyB0MV9wbTMzOTNfb3BzOwotZXh0ZXJuIHN0cnVjdCBnbWFjIHQxX2NoZWxzaW9fbWFjX29wczsKLWV4dGVybiBzdHJ1Y3QgZ21hYyB0MV92c2M3MzIxX29wczsKLWV4dGVybiBzdHJ1Y3QgZ21hYyB0MV92c2M3MzI2X29wczsKLWV4dGVybiBzdHJ1Y3QgZ21hYyB0MV9peGYxMDEwX29wczsKLWV4dGVybiBzdHJ1Y3QgZ21hYyB0MV9kdW1teV9tYWNfb3BzOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBnbWFjIHQxX3BtMzM5M19vcHM7CitleHRlcm4gY29uc3Qgc3RydWN0IGdtYWMgdDFfdnNjNzMyNl9vcHM7CiAKICNlbmRpZiAvKiBfQ1hHQl9HTUFDX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jaGVsc2lvL2l4ZjEwMTAuYyBiL2RyaXZlcnMvbmV0L2NoZWxzaW8vaXhmMTAxMC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGIyYTlhLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbmV0L2NoZWxzaW8vaXhmMTAxMC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTA1ICswLDAgQEAKLS8qICREYXRlOiAyMDA1LzExLzEyIDAyOjEzOjQ5ICQgJFJDU2ZpbGU6IGl4ZjEwMTAuYyx2ICQgJFJldmlzaW9uOiAxLjM2ICQgKi8KLSNpbmNsdWRlICJnbWFjLmgiCi0jaW5jbHVkZSAiZWxtZXIwLmgiCi0KLS8qIFVwZGF0ZSBmYXN0IGNoYW5naW5nIHN0YXRpc3RpY3MgZXZlcnkgMTUgc2Vjb25kcyAqLwotI2RlZmluZSBTVEFUU19USUNLX1NFQ1MgMTUKLS8qIDMwIG1pbnV0ZXMgZm9yIGZ1bGwgc3RhdGlzdGljcyB1cGRhdGUgKi8KLSNkZWZpbmUgTUFKT1JfVVBEQVRFX1RJQ0tTICgxODAwIC8gU1RBVFNfVElDS19TRUNTKQotCi0vKgotICogVGhlIElYRjEwMTAgY2FuIGhhbmRsZSBmcmFtZXMgdXAgdG8gMTYzODMgYnl0ZXMgYnV0IGl0J3Mgb3B0aW1pemVkIGZvcgotICogZnJhbWVzIHVwIHRvIDk4MzEgKDB4MjY2NykgYnl0ZXMsIHNvIHdlIGxpbWl0IGp1bWJvIGZyYW1lIHNpemUgdG8gdGhpcy4KLSAqIFRoaXMgbGVuZ3RoIGluY2x1ZGVzIGV0aGVybmV0IGhlYWRlciBhbmQgRkNTLgotICovCi0jZGVmaW5lIE1BWF9GUkFNRV9TSVpFIDB4MjY2NwotCi0vKiBNQUMgcmVnaXN0ZXJzICovCi1lbnVtIHsKLQkvKiBQZXItcG9ydCByZWdpc3RlcnMgKi8KLQlSRUdfTUFDQUREUl9MT1cgPSAwLAotCVJFR19NQUNBRERSX0hJR0ggPSAweDQsCi0JUkVHX0ZERkNfVFlQRSA9IDB4QywKLQlSRUdfRkNfVFhfVElNRVJfVkFMVUUgPSAweDFjLAotCVJFR19JUEdfUlhfVElNRTEgPSAweDI4LAotCVJFR19JUEdfUlhfVElNRTIgPSAweDJjLAotCVJFR19JUEdfVFhfVElNRSA9IDB4MzAsCi0JUkVHX1BBVVNFX1RIUkVTID0gMHgzOCwKLQlSRUdfTUFYX0ZSQU1FX1NJWkUgPSAweDNjLAotCVJFR19SR01JSV9TUEVFRCA9IDB4NDAsCi0JUkVHX0ZDX0VOQUJMRSA9IDB4NDgsCi0JUkVHX0RJU0NBUkRfQ1RSTF9GUkFNRVMgPSAweDU0LAotCVJFR19ESVZFUlNFX0NPTkZJRyA9IDB4NjAsCi0JUkVHX1JYX0ZJTFRFUiA9IDB4NjQsCi0JUkVHX01DX0FERFJfTE9XID0gMHg2OCwKLQlSRUdfTUNfQUREUl9ISUdIID0gMHg2YywKLQotCVJFR19SWF9PQ1RFVFNfT0sgPSAweDgwLAotCVJFR19SWF9PQ1RFVFNfQkFEID0gMHg4NCwKLQlSRUdfUlhfVUNfUEtUUyA9IDB4ODgsCi0JUkVHX1JYX01DX1BLVFMgPSAweDhjLAotCVJFR19SWF9CQ19QS1RTID0gMHg5MCwKLQlSRUdfUlhfRkNTX0VSUiA9IDB4YjAsCi0JUkVHX1JYX1RBR0dFRCA9IDB4YjQsCi0JUkVHX1JYX0RBVEFfRVJSID0gMHhiOCwKLQlSRUdfUlhfQUxJR05fRVJSID0gMHhiYywKLQlSRUdfUlhfTE9OR19FUlIgPSAweGMwLAotCVJFR19SWF9KQUJCRVJfRVJSID0gMHhjNCwKLQlSRUdfUlhfUEFVU0VfRlJBTUVTID0gMHhjOCwKLQlSRUdfUlhfVU5LTk9XTl9DVFJMX0ZSQU1FUyA9IDB4Y2MsCi0JUkVHX1JYX1ZFUllfTE9OR19FUlIgPSAweGQwLAotCVJFR19SWF9SVU5UX0VSUiA9IDB4ZDQsCi0JUkVHX1JYX1NIT1JUX0VSUiA9IDB4ZDgsCi0JUkVHX1JYX1NZTUJPTF9FUlIgPSAweGU0LAotCi0JUkVHX1RYX09DVEVUU19PSyA9IDB4MTAwLAotCVJFR19UWF9PQ1RFVFNfQkFEID0gMHgxMDQsCi0JUkVHX1RYX1VDX1BLVFMgPSAweDEwOCwKLQlSRUdfVFhfTUNfUEtUUyA9IDB4MTBjLAotCVJFR19UWF9CQ19QS1RTID0gMHgxMTAsCi0JUkVHX1RYX0VYQ0VTU0lWRV9MRU5fRFJPUCA9IDB4MTRjLAotCVJFR19UWF9VTkRFUlJVTiA9IDB4MTUwLAotCVJFR19UWF9UQUdHRUQgPSAweDE1NCwKLQlSRUdfVFhfUEFVU0VfRlJBTUVTID0gMHgxNUMsCi0KLQkvKiBHbG9iYWwgcmVnaXN0ZXJzICovCi0JUkVHX1BPUlRfRU5BQkxFID0gMHgxNDAwLAotCi0JUkVHX0pUQUdfSUQgPSAweDE0MzAsCi0KLQlSWF9GSUZPX0hJR0hfV0FURVJNQVJLX0JBU0UgPSAweDE2MDAsCi0JUlhfRklGT19MT1dfV0FURVJNQVJLX0JBU0UgPSAweDE2MjgsCi0JUlhfRklGT19GUkFNRVNfUkVNT1ZFRF9CQVNFID0gMHgxNjUwLAotCi0JUkVHX1JYX0VSUl9EUk9QID0gMHgxNjdjLAotCVJFR19SWF9GSUZPX09WRVJGTE9XX0VWRU5UID0gMHgxNjgwLAotCi0JVFhfRklGT19ISUdIX1dBVEVSTUFSS19CQVNFID0gMHgxODAwLAotCVRYX0ZJRk9fTE9XX1dBVEVSTUFSS19CQVNFID0gMHgxODI4LAotCVRYX0ZJRk9fWEZFUl9USFJFU19CQVNFID0gMHgxODUwLAotCi0JUkVHX1RYX0ZJRk9fT1ZFUkZMT1dfRVZFTlQgPSAweDE4NzgsCi0JUkVHX1RYX0ZJRk9fT09TX0VWRU5UID0gMHgxODg0LAotCi0JVFhfRklGT19GUkFNRVNfUkVNT1ZFRF9CQVNFID0gMHgxODg4LAotCi0JUkVHX1NQSV9SWF9CVVJTVCA9IDB4MWMwMCwKLQlSRUdfU1BJX1JYX1RSQUlOSU5HID0gMHgxYzA0LAotCVJFR19TUElfUlhfQ0FMRU5EQVIgPSAweDFjMDgsCi0JUkVHX1NQSV9UWF9TWU5DID0gMHgxYzBjCi19OwotCi1lbnVtIHsgICAgICAgICAgICAgICAgICAgICAvKiBSTU9OIHJlZ2lzdGVycyAqLwotCVJFR19SeE9jdGV0c1RvdGFsT0sgPSAweDgwLAotCVJFR19SeE9jdGV0c0JhZCA9IDB4ODQsCi0JUkVHX1J4VUNQa3RzID0gMHg4OCwKLQlSRUdfUnhNQ1BrdHMgPSAweDhjLAotCVJFR19SeEJDUGt0cyA9IDB4OTAsCi0JUkVHX1J4SnVtYm9Qa3RzID0gMHhhYywKLQlSRUdfUnhGQ1NFcnJvcnMgPSAweGIwLAotCVJFR19SeERhdGFFcnJvcnMgPSAweGI4LAotCVJFR19SeEFsaWduRXJyb3JzID0gMHhiYywKLQlSRUdfUnhMb25nRXJyb3JzID0gMHhjMCwKLQlSRUdfUnhKYWJiZXJFcnJvcnMgPSAweGM0LAotCVJFR19SeFBhdXNlTWFjQ29udHJvbENvdW50ZXIgPSAweGM4LAotCVJFR19SeFZlcnlMb25nRXJyb3JzID0gMHhkMCwKLQlSRUdfUnhSdW50RXJyb3JzID0gMHhkNCwKLQlSRUdfUnhTaG9ydEVycm9ycyA9IDB4ZDgsCi0JUkVHX1J4U2VxdWVuY2VFcnJvcnMgPSAweGUwLAotCVJFR19SeFN5bWJvbEVycm9ycyA9IDB4ZTQsCi0KLQlSRUdfVHhPY3RldHNUb3RhbE9LID0gMHgxMDAsCi0JUkVHX1R4T2N0ZXRzQmFkID0gMHgxMDQsCi0JUkVHX1R4VUNQa3RzID0gMHgxMDgsCi0JUkVHX1R4TUNQa3RzID0gMHgxMGMsCi0JUkVHX1R4QkNQa3RzID0gMHgxMTAsCi0JUkVHX1R4SnVtYm9Qa3RzID0gMHgxMkMsCi0JUkVHX1R4VG90YWxDb2xsaXNpb25zID0gMHgxMzQsCi0JUkVHX1R4RXhjZXNzaXZlTGVuZ3RoRHJvcCA9IDB4MTRjLAotCVJFR19UeFVuZGVycnVuID0gMHgxNTAsCi0JUkVHX1R4Q1JDRXJyb3JzID0gMHgxNTgsCi0JUkVHX1R4UGF1c2VGcmFtZXMgPSAweDE1YwotfTsKLQotZW51bSB7Ci0JRElWRVJTRV9DT05GSUdfUEFEX0VOQUJMRSA9IDB4ODAsCi0JRElWRVJTRV9DT05GSUdfQ1JDX0FERCA9IDB4NDAKLX07Ci0KLSNkZWZpbmUgTUFDUkVHX0JBU0UgICAgICAgICAgICAwCi0jZGVmaW5lIE1BQ1JFRyhtYWMsIG1hY19yZWcpICAgKChtYWMpLT5pbnN0YW5jZS0+bWFjX2Jhc2UgKyAobWFjX3JlZykpCi0KLXN0cnVjdCBfY21hY19pbnN0YW5jZSB7Ci0JdTMyIG1hY19iYXNlOwotCXUzMiBpbmRleDsKLQl1MzIgdmVyc2lvbjsKLQl1MzIgdGlja3M7Ci19OwotCi1zdGF0aWMgdm9pZCBkaXNhYmxlX3BvcnQoc3RydWN0IGNtYWMgKm1hYykKLXsKLQl1MzIgdmFsOwotCi0JdDFfdHBpX3JlYWQobWFjLT5hZGFwdGVyLCBSRUdfUE9SVF9FTkFCTEUsICZ2YWwpOwotCXZhbCAmPSB+KDEgPDwgbWFjLT5pbnN0YW5jZS0+aW5kZXgpOwotCXQxX3RwaV93cml0ZShtYWMtPmFkYXB0ZXIsIFJFR19QT1JUX0VOQUJMRSwgdmFsKTsKLX0KLQotLyoKLSAqIFJlYWQgdGhlIGN1cnJlbnQgdmFsdWVzIG9mIHRoZSBSTU9OIGNvdW50ZXJzIGFuZCBhZGQgdGhlbSB0byB0aGUgY3VtdWxhdGl2ZQotICogcG9ydCBzdGF0aXN0aWNzLiAgVGhlIEhXIFJNT04gY291bnRlcnMgYXJlIGNsZWFyZWQgYnkgdGhpcyBvcGVyYXRpb24uCi0gKi8KLXN0YXRpYyB2b2lkIHBvcnRfc3RhdHNfdXBkYXRlKHN0cnVjdCBjbWFjICptYWMpCi17Ci0Jc3RhdGljIHN0cnVjdCB7Ci0JCXVuc2lnbmVkIGludCByZWc7Ci0JCXVuc2lnbmVkIGludCBvZmZzZXQ7Ci0JfSBod19zdGF0c1tdID0gewotCi0jZGVmaW5lIEhXX1NUQVQobmFtZSwgc3RhdF9uYW1lKSBcCi0JeyBSRUdfIyNuYW1lLCBcCi0JICAoJigoc3RydWN0IGNtYWNfc3RhdGlzdGljcyAqKU5VTEwpLT5zdGF0X25hbWUpIC0gKHU2NCAqKU5VTEwgfQotCi0JCS8qIFJ4IHN0YXRzICovCi0JCUhXX1NUQVQoUnhPY3RldHNUb3RhbE9LLCBSeE9jdGV0c09LKSwKLQkJSFdfU1RBVChSeE9jdGV0c0JhZCwgUnhPY3RldHNCYWQpLAotCQlIV19TVEFUKFJ4VUNQa3RzLCBSeFVuaWNhc3RGcmFtZXNPSyksCi0JCUhXX1NUQVQoUnhNQ1BrdHMsIFJ4TXVsdGljYXN0RnJhbWVzT0spLAotCQlIV19TVEFUKFJ4QkNQa3RzLCBSeEJyb2FkY2FzdEZyYW1lc09LKSwKLQkJSFdfU1RBVChSeEp1bWJvUGt0cywgUnhKdW1ib0ZyYW1lc09LKSwKLQkJSFdfU1RBVChSeEZDU0Vycm9ycywgUnhGQ1NFcnJvcnMpLAotCQlIV19TVEFUKFJ4QWxpZ25FcnJvcnMsIFJ4QWxpZ25FcnJvcnMpLAotCQlIV19TVEFUKFJ4TG9uZ0Vycm9ycywgUnhGcmFtZVRvb0xvbmdFcnJvcnMpLAotCQlIV19TVEFUKFJ4VmVyeUxvbmdFcnJvcnMsIFJ4RnJhbWVUb29Mb25nRXJyb3JzKSwKLQkJSFdfU1RBVChSeFBhdXNlTWFjQ29udHJvbENvdW50ZXIsIFJ4UGF1c2VGcmFtZXMpLAotCQlIV19TVEFUKFJ4RGF0YUVycm9ycywgUnhEYXRhRXJyb3JzKSwKLQkJSFdfU1RBVChSeEphYmJlckVycm9ycywgUnhKYWJiZXJFcnJvcnMpLAotCQlIV19TVEFUKFJ4UnVudEVycm9ycywgUnhSdW50RXJyb3JzKSwKLQkJSFdfU1RBVChSeFNob3J0RXJyb3JzLCBSeFJ1bnRFcnJvcnMpLAotCQlIV19TVEFUKFJ4U2VxdWVuY2VFcnJvcnMsIFJ4U2VxdWVuY2VFcnJvcnMpLAotCQlIV19TVEFUKFJ4U3ltYm9sRXJyb3JzLCBSeFN5bWJvbEVycm9ycyksCi0KLQkJLyogVHggc3RhdHMgKHNraXAgY29sbGlzaW9uIHN0YXRzIGFzIHdlIGFyZSBmdWxsLWR1cGxleCBvbmx5KSAqLwotCQlIV19TVEFUKFR4T2N0ZXRzVG90YWxPSywgVHhPY3RldHNPSyksCi0JCUhXX1NUQVQoVHhPY3RldHNCYWQsIFR4T2N0ZXRzQmFkKSwKLQkJSFdfU1RBVChUeFVDUGt0cywgVHhVbmljYXN0RnJhbWVzT0spLAotCQlIV19TVEFUKFR4TUNQa3RzLCBUeE11bHRpY2FzdEZyYW1lc09LKSwKLQkJSFdfU1RBVChUeEJDUGt0cywgVHhCcm9hZGNhc3RGcmFtZXNPSyksCi0JCUhXX1NUQVQoVHhKdW1ib1BrdHMsIFR4SnVtYm9GcmFtZXNPSyksCi0JCUhXX1NUQVQoVHhQYXVzZUZyYW1lcywgVHhQYXVzZUZyYW1lcyksCi0JCUhXX1NUQVQoVHhFeGNlc3NpdmVMZW5ndGhEcm9wLCBUeExlbmd0aEVycm9ycyksCi0JCUhXX1NUQVQoVHhVbmRlcnJ1biwgVHhVbmRlcnJ1biksCi0JCUhXX1NUQVQoVHhDUkNFcnJvcnMsIFR4RkNTRXJyb3JzKQotCX0sICpwID0gaHdfc3RhdHM7Ci0JdTY0ICpzdGF0cyA9ICh1NjQgKikgJm1hYy0+c3RhdHM7Ci0JdW5zaWduZWQgaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShod19zdGF0cyk7IGkrKykgewotCQl1MzIgdmFsOwotCi0JCXQxX3RwaV9yZWFkKG1hYy0+YWRhcHRlciwgTUFDUkVHKG1hYywgcC0+cmVnKSwgJnZhbCk7Ci0JCXN0YXRzW3AtPm9mZnNldF0gKz0gdmFsOwotCX0KLX0KLQotLyogTm8tb3AgaW50ZXJydXB0IG9wZXJhdGlvbiBhcyB0aGlzIE1BQyBkb2VzIG5vdCBzdXBwb3J0IGludGVycnVwdHMgKi8KLXN0YXRpYyBpbnQgbWFjX2ludHJfb3Aoc3RydWN0IGNtYWMgKm1hYykKLXsKLQlyZXR1cm4gMDsKLX0KLQotLyogRXhwZWN0IE1BQyBhZGRyZXNzIHRvIGJlIGluIG5ldHdvcmsgYnl0ZSBvcmRlci4gKi8KLXN0YXRpYyBpbnQgbWFjX3NldF9hZGRyZXNzKHN0cnVjdCBjbWFjICptYWMsIHU4IGFkZHJbNl0pCi17Ci0JdTMyIGFkZHJfbG8sIGFkZHJfaGk7Ci0KLQlhZGRyX2xvID0gYWRkclsyXTsKLQlhZGRyX2xvID0gKGFkZHJfbG8gPDwgOCkgfCBhZGRyWzNdOwotCWFkZHJfbG8gPSAoYWRkcl9sbyA8PCA4KSB8IGFkZHJbNF07Ci0JYWRkcl9sbyA9IChhZGRyX2xvIDw8IDgpIHwgYWRkcls1XTsKLQotCWFkZHJfaGkgPSBhZGRyWzBdOwotCWFkZHJfaGkgPSAoYWRkcl9oaSA8PCA4KSB8IGFkZHJbMV07Ci0KLQl0MV90cGlfd3JpdGUobWFjLT5hZGFwdGVyLCBNQUNSRUcobWFjLCBSRUdfTUFDQUREUl9MT1cpLCBhZGRyX2xvKTsKLQl0MV90cGlfd3JpdGUobWFjLT5hZGFwdGVyLCBNQUNSRUcobWFjLCBSRUdfTUFDQUREUl9ISUdIKSwgYWRkcl9oaSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbWFjX2dldF9hZGRyZXNzKHN0cnVjdCBjbWFjICptYWMsIHU4IGFkZHJbNl0pCi17Ci0JdTMyIGFkZHJfbG8sIGFkZHJfaGk7Ci0KLQl0MV90cGlfcmVhZChtYWMtPmFkYXB0ZXIsIE1BQ1JFRyhtYWMsIFJFR19NQUNBRERSX0xPVyksICZhZGRyX2xvKTsKLQl0MV90cGlfcmVhZChtYWMtPmFkYXB0ZXIsIE1BQ1JFRyhtYWMsIFJFR19NQUNBRERSX0hJR0gpLCAmYWRkcl9oaSk7Ci0KLQlhZGRyWzBdID0gKHU4KSAoYWRkcl9oaSA+PiA4KTsKLQlhZGRyWzFdID0gKHU4KSBhZGRyX2hpOwotCWFkZHJbMl0gPSAodTgpIChhZGRyX2xvID4+IDI0KTsKLQlhZGRyWzNdID0gKHU4KSAoYWRkcl9sbyA+PiAxNik7Ci0JYWRkcls0XSA9ICh1OCkgKGFkZHJfbG8gPj4gOCk7Ci0JYWRkcls1XSA9ICh1OCkgYWRkcl9sbzsKLQlyZXR1cm4gMDsKLX0KLQotLyogVGhpcyBpcyBpbnRlbmRlZCB0byByZXNldCBhIHBvcnQsIG5vdCB0aGUgd2hvbGUgTUFDICovCi1zdGF0aWMgaW50IG1hY19yZXNldChzdHJ1Y3QgY21hYyAqbWFjKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1hY19zZXRfcnhfbW9kZShzdHJ1Y3QgY21hYyAqbWFjLCBzdHJ1Y3QgdDFfcnhfbW9kZSAqcm0pCi17Ci0JdTMyIHZhbCwgbmV3X21vZGU7Ci0JYWRhcHRlcl90ICphZGFwdGVyID0gbWFjLT5hZGFwdGVyOwotCXUzMiBhZGRyX2xvLCBhZGRyX2hpOwotCXU4ICphZGRyOwotCi0JdDFfdHBpX3JlYWQoYWRhcHRlciwgTUFDUkVHKG1hYywgUkVHX1JYX0ZJTFRFUiksICZ2YWwpOwotCW5ld19tb2RlID0gdmFsICYgfjc7Ci0JaWYgKCF0MV9yeF9tb2RlX3Byb21pc2Mocm0pICYmIG1hYy0+aW5zdGFuY2UtPnZlcnNpb24gPiAwKQotCQluZXdfbW9kZSB8PSAxOyAgICAgLyogb25seSBzZXQgaWYgdmVyc2lvbiA+IDAgZHVlIHRvIGVycmF0dW0gKi8KLQlpZiAoIXQxX3J4X21vZGVfcHJvbWlzYyhybSkgJiYgIXQxX3J4X21vZGVfYWxsbXVsdGkocm0pCi0JICAgICAmJiB0MV9yeF9tb2RlX21jX2NudChybSkgPD0gMSkKLQkJbmV3X21vZGUgfD0gMjsKLQlpZiAobmV3X21vZGUgIT0gdmFsKQotCQl0MV90cGlfd3JpdGUoYWRhcHRlciwgTUFDUkVHKG1hYywgUkVHX1JYX0ZJTFRFUiksIG5ld19tb2RlKTsKLQlzd2l0Y2ggKHQxX3J4X21vZGVfbWNfY250KHJtKSkgewotCWNhc2UgMDoKLQkJdDFfdHBpX3dyaXRlKGFkYXB0ZXIsIE1BQ1JFRyhtYWMsIFJFR19NQ19BRERSX0xPVyksIDApOwotCQl0MV90cGlfd3JpdGUoYWRhcHRlciwgTUFDUkVHKG1hYywgUkVHX01DX0FERFJfSElHSCksIDApOwotCQlicmVhazsKLQljYXNlIDE6Ci0JCWFkZHIgPSB0MV9nZXRfbmV4dF9tY2FkZHIocm0pOwotCQlhZGRyX2xvID0gKGFkZHJbMl0gPDwgMjQpIHwgKGFkZHJbM10gPDwgMTYpIHwgKGFkZHJbNF0gPDwgOCkgfAotCQkJYWRkcls1XTsKLQkJYWRkcl9oaSA9IChhZGRyWzBdIDw8IDgpIHwgYWRkclsxXTsKLQkJdDFfdHBpX3dyaXRlKGFkYXB0ZXIsIE1BQ1JFRyhtYWMsIFJFR19NQ19BRERSX0xPVyksIGFkZHJfbG8pOwotCQl0MV90cGlfd3JpdGUoYWRhcHRlciwgTUFDUkVHKG1hYywgUkVHX01DX0FERFJfSElHSCksIGFkZHJfaGkpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbWFjX3NldF9tdHUoc3RydWN0IGNtYWMgKm1hYywgaW50IG10dSkKLXsKLQkvKiBNQVhfRlJBTUVfU0laRSBpbmx1ZGVzIGhlYWRlciArIEZDUywgbXR1IGRvZXNuJ3QgKi8KLQlpZiAobXR1ID4gKE1BWF9GUkFNRV9TSVpFIC0gMTQgLSA0KSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JdDFfdHBpX3dyaXRlKG1hYy0+YWRhcHRlciwgTUFDUkVHKG1hYywgUkVHX01BWF9GUkFNRV9TSVpFKSwKLQkJICAgICBtdHUgKyAxNCArIDQpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1hY19zZXRfc3BlZWRfZHVwbGV4X2ZjKHN0cnVjdCBjbWFjICptYWMsIGludCBzcGVlZCwgaW50IGR1cGxleCwKLQkJCQkgICBpbnQgZmMpCi17Ci0JdTMyIHZhbDsKLQotCWlmIChzcGVlZCA+PSAwICYmIHNwZWVkICE9IFNQRUVEXzEwMCAmJiBzcGVlZCAhPSBTUEVFRF8xMDAwKQotCQlyZXR1cm4gLTE7Ci0JaWYgKGR1cGxleCA+PSAwICYmIGR1cGxleCAhPSBEVVBMRVhfRlVMTCkKLQkJcmV0dXJuIC0xOwotCi0JaWYgKHNwZWVkID49IDApIHsKLQkJdmFsID0gc3BlZWQgPT0gU1BFRURfMTAwID8gMSA6IDI7Ci0JCXQxX3RwaV93cml0ZShtYWMtPmFkYXB0ZXIsIE1BQ1JFRyhtYWMsIFJFR19SR01JSV9TUEVFRCksIHZhbCk7Ci0JfQotCi0JdDFfdHBpX3JlYWQobWFjLT5hZGFwdGVyLCBNQUNSRUcobWFjLCBSRUdfRkNfRU5BQkxFKSwgJnZhbCk7Ci0JdmFsICY9IH4zOwotCWlmIChmYyAmIFBBVVNFX1JYKQotCQl2YWwgfD0gMTsKLQlpZiAoZmMgJiBQQVVTRV9UWCkKLQkJdmFsIHw9IDI7Ci0JdDFfdHBpX3dyaXRlKG1hYy0+YWRhcHRlciwgTUFDUkVHKG1hYywgUkVHX0ZDX0VOQUJMRSksIHZhbCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbWFjX2dldF9zcGVlZF9kdXBsZXhfZmMoc3RydWN0IGNtYWMgKm1hYywgaW50ICpzcGVlZCwgaW50ICpkdXBsZXgsCi0JCQkJICAgaW50ICpmYykKLXsKLQl1MzIgdmFsOwotCi0JaWYgKGR1cGxleCkKLQkJKmR1cGxleCA9IERVUExFWF9GVUxMOwotCWlmIChzcGVlZCkgewotCQl0MV90cGlfcmVhZChtYWMtPmFkYXB0ZXIsIE1BQ1JFRyhtYWMsIFJFR19SR01JSV9TUEVFRCksCi0JCQkgJnZhbCk7Ci0JCSpzcGVlZCA9ICh2YWwgJiAyKSA/IFNQRUVEXzEwMDAgOiBTUEVFRF8xMDA7Ci0JfQotCWlmIChmYykgewotCQl0MV90cGlfcmVhZChtYWMtPmFkYXB0ZXIsIE1BQ1JFRyhtYWMsIFJFR19GQ19FTkFCTEUpLCAmdmFsKTsKLQkJKmZjID0gMDsKLQkJaWYgKHZhbCAmIDEpCi0JCQkqZmMgfD0gUEFVU0VfUlg7Ci0JCWlmICh2YWwgJiAyKQotCQkJKmZjIHw9IFBBVVNFX1RYOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgZW5hYmxlX3BvcnQoc3RydWN0IGNtYWMgKm1hYykKLXsKLQl1MzIgdmFsOwotCXUzMiBpbmRleCA9IG1hYy0+aW5zdGFuY2UtPmluZGV4OwotCWFkYXB0ZXJfdCAqYWRhcHRlciA9IG1hYy0+YWRhcHRlcjsKLQotCXQxX3RwaV9yZWFkKGFkYXB0ZXIsIE1BQ1JFRyhtYWMsIFJFR19ESVZFUlNFX0NPTkZJRyksICZ2YWwpOwotCXZhbCB8PSBESVZFUlNFX0NPTkZJR19DUkNfQUREIHwgRElWRVJTRV9DT05GSUdfUEFEX0VOQUJMRTsKLQl0MV90cGlfd3JpdGUoYWRhcHRlciwgTUFDUkVHKG1hYywgUkVHX0RJVkVSU0VfQ09ORklHKSwgdmFsKTsKLQlpZiAobWFjLT5pbnN0YW5jZS0+dmVyc2lvbiA+IDApCi0JCXQxX3RwaV93cml0ZShhZGFwdGVyLCBNQUNSRUcobWFjLCBSRUdfUlhfRklMVEVSKSwgMyk7Ci0JZWxzZSAvKiBEb24ndCBlbmFibGUgdW5pY2FzdCBhZGRyZXNzIGZpbHRlcmluZyBkdWUgdG8gSVhGMTAxMCBidWcgKi8KLQkJdDFfdHBpX3dyaXRlKGFkYXB0ZXIsIE1BQ1JFRyhtYWMsIFJFR19SWF9GSUxURVIpLCAyKTsKLQotCXQxX3RwaV9yZWFkKGFkYXB0ZXIsIFJFR19SWF9FUlJfRFJPUCwgJnZhbCk7Ci0JdmFsIHw9ICgxIDw8IGluZGV4KTsKLQl0MV90cGlfd3JpdGUoYWRhcHRlciwgUkVHX1JYX0VSUl9EUk9QLCB2YWwpOwotCi0JLyoKLQkgKiBDbGVhciB0aGUgcG9ydCBSTU9OIHJlZ2lzdGVycyBieSBhZGRpbmcgdGhlaXIgY3VycmVudCB2YWx1ZXMgdG8gdGhlCi0JICogY3VtdWxhdGljZSBwb3J0IHN0YXRzIGFuZCB0aGVuIGNsZWFyaW5nIHRoZSBzdGF0cy4gIFJlYWxseS4KLQkgKi8KLQlwb3J0X3N0YXRzX3VwZGF0ZShtYWMpOwotCW1lbXNldCgmbWFjLT5zdGF0cywgMCwgc2l6ZW9mKHN0cnVjdCBjbWFjX3N0YXRpc3RpY3MpKTsKLQltYWMtPmluc3RhbmNlLT50aWNrcyA9IDA7Ci0KLQl0MV90cGlfcmVhZChhZGFwdGVyLCBSRUdfUE9SVF9FTkFCTEUsICZ2YWwpOwotCXZhbCB8PSAoMSA8PCBpbmRleCk7Ci0JdDFfdHBpX3dyaXRlKGFkYXB0ZXIsIFJFR19QT1JUX0VOQUJMRSwgdmFsKTsKLQotCWluZGV4IDw8PSAyOwotCWlmIChpc19UMihhZGFwdGVyKSkgewotCQkvKiBUMjA0OiBzZXQgdGhlIEZpZm8gd2F0ZXIgbGV2ZWwgJiB0aHJlc2hvbGQgKi8KLQkJdDFfdHBpX3dyaXRlKGFkYXB0ZXIsIFJYX0ZJRk9fSElHSF9XQVRFUk1BUktfQkFTRSArIGluZGV4LCAweDc0MCk7Ci0JCXQxX3RwaV93cml0ZShhZGFwdGVyLCBSWF9GSUZPX0xPV19XQVRFUk1BUktfQkFTRSArIGluZGV4LCAweDczMCk7Ci0JCXQxX3RwaV93cml0ZShhZGFwdGVyLCBUWF9GSUZPX0hJR0hfV0FURVJNQVJLX0JBU0UgKyBpbmRleCwgMHg2MDApOwotCQl0MV90cGlfd3JpdGUoYWRhcHRlciwgVFhfRklGT19MT1dfV0FURVJNQVJLX0JBU0UgKyBpbmRleCwgMHgxZDApOwotCQl0MV90cGlfd3JpdGUoYWRhcHRlciwgVFhfRklGT19YRkVSX1RIUkVTX0JBU0UgKyBpbmRleCwgMHgxMTAwKTsKLQl9IGVsc2UgewotCS8qCi0JICogU2V0IHRoZSBUWCBGaWZvIFRocmVzaG9sZCB0byAweDQwMCBpbnN0ZWFkIG9mIDB4MTAwIHRvIHdvcmsgYXJvdW5kCi0JICogVW5kZXJydW4gcHJvYmxlbS4gSW50ZWwgaGFzIGJsZXNzZWQgdGhpcyBzb2x1dGlvbi4KLQkgKi8KLQkJdDFfdHBpX3dyaXRlKGFkYXB0ZXIsIFRYX0ZJRk9fWEZFUl9USFJFU19CQVNFICsgaW5kZXgsIDB4NDAwKTsKLQl9Ci19Ci0KLS8qIElYRjEwMTAgcG9ydHMgZG8gbm90IGhhdmUgc2VwYXJhdGUgZW5hYmxlcyBmb3IgVFggYW5kIFJYICovCi1zdGF0aWMgaW50IG1hY19lbmFibGUoc3RydWN0IGNtYWMgKm1hYywgaW50IHdoaWNoKQotewotCWlmICh3aGljaCAmIChNQUNfRElSRUNUSU9OX1JYIHwgTUFDX0RJUkVDVElPTl9UWCkpCi0JCWVuYWJsZV9wb3J0KG1hYyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbWFjX2Rpc2FibGUoc3RydWN0IGNtYWMgKm1hYywgaW50IHdoaWNoKQotewotCWlmICh3aGljaCAmIChNQUNfRElSRUNUSU9OX1JYIHwgTUFDX0RJUkVDVElPTl9UWCkpCi0JCWRpc2FibGVfcG9ydChtYWMpOwotCXJldHVybiAwOwotfQotCi0jZGVmaW5lIFJNT05fVVBEQVRFKG1hYywgbmFtZSwgc3RhdF9uYW1lKSBcCi0JdDFfdHBpX3JlYWQoKG1hYyktPmFkYXB0ZXIsIE1BQ1JFRyhtYWMsIFJFR18jI25hbWUpLCAmdmFsKTsgXAotCShtYWMpLT5zdGF0cy5zdGF0X25hbWUgKz0gdmFsOwotCi0vKgotICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgcGVyaW9kaWNhbGx5IHRvIGFjY3VtdWxhdGUgdGhlIGN1cnJlbnQgdmFsdWVzIG9mIHRoZQotICogUk1PTiBjb3VudGVycyBpbnRvIHRoZSBwb3J0IHN0YXRpc3RpY3MuICBTaW5jZSB0aGUgY291bnRlcnMgYXJlIG9ubHkgMzIgYml0cwotICogc29tZSBvZiB0aGVtIGNhbiBvdmVyZmxvdyBpbiBsZXNzIHRoYW4gYSBtaW51dGUgYXQgR2lnRSBzcGVlZHMsIHNvIHRoaXMKLSAqIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgZXZlcnkgMzAgc2Vjb25kcyBvciBzby4KLSAqCi0gKiBUbyBjdXQgZG93biBvbiByZWFkaW5nIGNvc3RzIHdlIHVwZGF0ZSBvbmx5IHRoZSBvY3RldCBjb3VudGVycyBhdCBlYWNoIHRpY2sKLSAqIGFuZCBkbyBhIGZ1bGwgdXBkYXRlIGF0IG1ham9yIHRpY2tzLCB3aGljaCBjYW4gYmUgZXZlcnkgMzAgbWludXRlcyBvciBtb3JlLgotICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNtYWNfc3RhdGlzdGljcyAqbWFjX3VwZGF0ZV9zdGF0aXN0aWNzKHN0cnVjdCBjbWFjICptYWMsCi0JCQkJCQkJICAgaW50IGZsYWcpCi17Ci0JaWYgKGZsYWcgPT0gTUFDX1NUQVRTX1VQREFURV9GVUxMIHx8Ci0JICAgIE1BSk9SX1VQREFURV9USUNLUyA8PSBtYWMtPmluc3RhbmNlLT50aWNrcykgewotCQlwb3J0X3N0YXRzX3VwZGF0ZShtYWMpOwotCQltYWMtPmluc3RhbmNlLT50aWNrcyA9IDA7Ci0JfSBlbHNlIHsKLQkJdTMyIHZhbDsKLQotCQlSTU9OX1VQREFURShtYWMsIFJ4T2N0ZXRzVG90YWxPSywgUnhPY3RldHNPSyk7Ci0JCVJNT05fVVBEQVRFKG1hYywgVHhPY3RldHNUb3RhbE9LLCBUeE9jdGV0c09LKTsKLQkJbWFjLT5pbnN0YW5jZS0+dGlja3MrKzsKLQl9Ci0JcmV0dXJuICZtYWMtPnN0YXRzOwotfQotCi1zdGF0aWMgdm9pZCBtYWNfZGVzdHJveShzdHJ1Y3QgY21hYyAqbWFjKQotewotCWtmcmVlKG1hYyk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgY21hY19vcHMgaXhmMTAxMF9vcHMgPSB7Ci0JLmRlc3Ryb3kgICAgICAgICAgICAgICAgICA9IG1hY19kZXN0cm95LAotCS5yZXNldCAgICAgICAgICAgICAgICAgICAgPSBtYWNfcmVzZXQsCi0JLmludGVycnVwdF9lbmFibGUgICAgICAgICA9IG1hY19pbnRyX29wLAotCS5pbnRlcnJ1cHRfZGlzYWJsZSAgICAgICAgPSBtYWNfaW50cl9vcCwKLQkuaW50ZXJydXB0X2NsZWFyICAgICAgICAgID0gbWFjX2ludHJfb3AsCi0JLmVuYWJsZSAgICAgICAgICAgICAgICAgICA9IG1hY19lbmFibGUsCi0JLmRpc2FibGUgICAgICAgICAgICAgICAgICA9IG1hY19kaXNhYmxlLAotCS5zZXRfbXR1ICAgICAgICAgICAgICAgICAgPSBtYWNfc2V0X210dSwKLQkuc2V0X3J4X21vZGUgICAgICAgICAgICAgID0gbWFjX3NldF9yeF9tb2RlLAotCS5zZXRfc3BlZWRfZHVwbGV4X2ZjICAgICAgPSBtYWNfc2V0X3NwZWVkX2R1cGxleF9mYywKLQkuZ2V0X3NwZWVkX2R1cGxleF9mYyAgICAgID0gbWFjX2dldF9zcGVlZF9kdXBsZXhfZmMsCi0JLnN0YXRpc3RpY3NfdXBkYXRlICAgICAgICA9IG1hY191cGRhdGVfc3RhdGlzdGljcywKLQkubWFjYWRkcmVzc19nZXQgICAgICAgICAgID0gbWFjX2dldF9hZGRyZXNzLAotCS5tYWNhZGRyZXNzX3NldCAgICAgICAgICAgPSBtYWNfc2V0X2FkZHJlc3MsCi19OwotCi1zdGF0aWMgaW50IGl4ZjEwMTBfbWFjX3Jlc2V0KGFkYXB0ZXJfdCAqYWRhcHRlcikKLXsKLQl1MzIgdmFsOwotCi0JdDFfdHBpX3JlYWQoYWRhcHRlciwgQV9FTE1FUjBfR1BPLCAmdmFsKTsKLQlpZiAoKHZhbCAmIDEpICE9IDApIHsKLQkJdmFsICY9IH4xOwotCQl0MV90cGlfd3JpdGUoYWRhcHRlciwgQV9FTE1FUjBfR1BPLCB2YWwpOwotCQl1ZGVsYXkoMik7Ci0JfQotCXZhbCB8PSAxOwotCXQxX3RwaV93cml0ZShhZGFwdGVyLCBBX0VMTUVSMF9HUE8sIHZhbCk7Ci0JdWRlbGF5KDIpOwotCi0JdDFfdHBpX3dyaXRlKGFkYXB0ZXIsIFJFR19QT1JUX0VOQUJMRSwgMCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgY21hYyAqaXhmMTAxMF9tYWNfY3JlYXRlKGFkYXB0ZXJfdCAqYWRhcHRlciwgaW50IGluZGV4KQotewotCXN0cnVjdCBjbWFjICptYWM7Ci0JdTMyIHZhbDsKLQotCWlmIChpbmRleCA+IDkpCi0JCXJldHVybiBOVUxMOwotCi0JbWFjID0ga3phbGxvYyhzaXplb2YoKm1hYykgKyBzaXplb2YoY21hY19pbnN0YW5jZSksIEdGUF9LRVJORUwpOwotCWlmICghbWFjKQotCQlyZXR1cm4gTlVMTDsKLQotCW1hYy0+b3BzID0gJml4ZjEwMTBfb3BzOwotCW1hYy0+aW5zdGFuY2UgPSAoY21hY19pbnN0YW5jZSAqKShtYWMgKyAxKTsKLQotCW1hYy0+aW5zdGFuY2UtPm1hY19iYXNlID0gTUFDUkVHX0JBU0UgKyAoaW5kZXggKiAweDIwMCk7Ci0JbWFjLT5pbnN0YW5jZS0+aW5kZXggICAgPSBpbmRleDsKLQltYWMtPmFkYXB0ZXIgID0gYWRhcHRlcjsKLQltYWMtPmluc3RhbmNlLT50aWNrcyAgICA9IDA7Ci0KLQl0MV90cGlfcmVhZChhZGFwdGVyLCBSRUdfSlRBR19JRCwgJnZhbCk7Ci0JbWFjLT5pbnN0YW5jZS0+dmVyc2lvbiA9IHZhbCA+PiAyODsKLQlyZXR1cm4gbWFjOwotfQotCi1zdHJ1Y3QgZ21hYyB0MV9peGYxMDEwX29wcyA9IHsKLQlTVEFUU19USUNLX1NFQ1MsCi0JaXhmMTAxMF9tYWNfY3JlYXRlLAotCWl4ZjEwMTBfbWFjX3Jlc2V0Ci19OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2hlbHNpby9tYWMuYyBiL2RyaXZlcnMvbmV0L2NoZWxzaW8vbWFjLmMKaW5kZXggNmFmMzlkYy4uMWQ5NzI4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY2hlbHNpby9tYWMuYworKysgYi9kcml2ZXJzL25ldC9jaGVsc2lvL21hYy5jCkBAIC0zNjMsNiArMzYzLDYgQEAKIAlyZXR1cm4gbWFjOwogfQogCi1zdHJ1Y3QgZ21hYyB0MV9jaGVsc2lvX21hY19vcHMgPSB7Citjb25zdCBzdHJ1Y3QgZ21hYyB0MV9jaGVsc2lvX21hY19vcHMgPSB7CiAJLmNyZWF0ZSA9IG1hY19jcmVhdGUKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jaGVsc2lvL212ODhlMXh4eC5jIGIvZHJpdmVycy9uZXQvY2hlbHNpby9tdjg4ZTF4eHguYwppbmRleCA1ODY3ZTNiLi4wNjMyYmUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jaGVsc2lvL212ODhlMXh4eC5jCisrKyBiL2RyaXZlcnMvbmV0L2NoZWxzaW8vbXY4OGUxeHh4LmMKQEAgLTM1NCw3ICszNTQsNyBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBjcGh5ICptdjg4ZTF4eHhfcGh5X2NyZWF0ZShhZGFwdGVyX3QgKmFkYXB0ZXIsIGludCBwaHlfYWRkciwKLQkJCQkJIHN0cnVjdCBtZGlvX29wcyAqbWRpb19vcHMpCisJCQkJCSBjb25zdCBzdHJ1Y3QgbWRpb19vcHMgKm1kaW9fb3BzKQogewogCXN0cnVjdCBjcGh5ICpjcGh5ID0ga3phbGxvYyhzaXplb2YoKmNwaHkpLCBHRlBfS0VSTkVMKTsKIApAQCAtMzkwLDcgKzM5MCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0cnVjdCBncGh5IHQxX212ODhlMXh4eF9vcHMgPSB7Ci0JbXY4OGUxeHh4X3BoeV9jcmVhdGUsCi0JbXY4OGUxeHh4X3BoeV9yZXNldAorY29uc3Qgc3RydWN0IGdwaHkgdDFfbXY4OGUxeHh4X29wcyA9IHsKKwkuY3JlYXRlID0gbXY4OGUxeHh4X3BoeV9jcmVhdGUsCisJLnJlc2V0ID0gIG12ODhlMXh4eF9waHlfcmVzZXQKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jaGVsc2lvL212ODh4MjAxeC5jIGIvZHJpdmVycy9uZXQvY2hlbHNpby9tdjg4eDIwMXguYwppbmRleCBjOGU4OTQ4Li5jZDg1NjA0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jaGVsc2lvL212ODh4MjAxeC5jCisrKyBiL2RyaXZlcnMvbmV0L2NoZWxzaW8vbXY4OHgyMDF4LmMKQEAgLTIwOCw3ICsyMDgsNyBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBjcGh5ICptdjg4eDIwMXhfcGh5X2NyZWF0ZShhZGFwdGVyX3QgKmFkYXB0ZXIsIGludCBwaHlfYWRkciwKLQkJCQkJIHN0cnVjdCBtZGlvX29wcyAqbWRpb19vcHMpCisJCQkJCSBjb25zdCBzdHJ1Y3QgbWRpb19vcHMgKm1kaW9fb3BzKQogewogCXUzMiB2YWw7CiAJc3RydWN0IGNwaHkgKmNwaHkgPSBremFsbG9jKHNpemVvZigqY3BoeSksIEdGUF9LRVJORUwpOwpAQCAtMjUyLDcgKzI1Miw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0cnVjdCBncGh5IHQxX212ODh4MjAxeF9vcHMgPSB7Ci0JbXY4OHgyMDF4X3BoeV9jcmVhdGUsCi0JbXY4OHgyMDF4X3BoeV9yZXNldAorY29uc3Qgc3RydWN0IGdwaHkgdDFfbXY4OHgyMDF4X29wcyA9IHsKKwkuY3JlYXRlID0gbXY4OHgyMDF4X3BoeV9jcmVhdGUsCisJLnJlc2V0ID0gbXY4OHgyMDF4X3BoeV9yZXNldAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2NoZWxzaW8vbXkzMTI2LmMgYi9kcml2ZXJzL25ldC9jaGVsc2lvL215MzEyNi5jCmluZGV4IDg3ZGRlM2UuLjA0MGFjZDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2NoZWxzaW8vbXkzMTI2LmMKKysrIGIvZHJpdmVycy9uZXQvY2hlbHNpby9teTMxMjYuYwpAQCAtMTY2LDcgKzE2Niw3IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IGNwaHkgKm15MzEyNl9waHlfY3JlYXRlKGFkYXB0ZXJfdCAqYWRhcHRlciwKLQkJCWludCBwaHlfYWRkciwgc3RydWN0IG1kaW9fb3BzICptZGlvX29wcykKKwkJCWludCBwaHlfYWRkciwgY29uc3Qgc3RydWN0IG1kaW9fb3BzICptZGlvX29wcykKIHsKIAlzdHJ1Y3QgY3BoeSAqY3BoeSA9IGt6YWxsb2Moc2l6ZW9mICgqY3BoeSksIEdGUF9LRVJORUwpOwogCkBAIC0yMDEsNyArMjAxLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RydWN0IGdwaHkgdDFfbXkzMTI2X29wcyA9IHsKLQlteTMxMjZfcGh5X2NyZWF0ZSwKLQlteTMxMjZfcGh5X3Jlc2V0Citjb25zdCBzdHJ1Y3QgZ3BoeSB0MV9teTMxMjZfb3BzID0geworCS5jcmVhdGUgPSBteTMxMjZfcGh5X2NyZWF0ZSwKKwkucmVzZXQgPSBteTMxMjZfcGh5X3Jlc2V0CiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2hlbHNpby9wbTMzOTMuYyBiL2RyaXZlcnMvbmV0L2NoZWxzaW8vcG0zMzkzLmMKaW5kZXggNjkxMjllZC4uNjc4Nzc4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY2hlbHNpby9wbTMzOTMuYworKysgYi9kcml2ZXJzL25ldC9jaGVsc2lvL3BtMzM5My5jCkBAIC04MDcsOCArODA3LDggQEAKIAlyZXR1cm4gc3VjY2Vzc2Z1bF9yZXNldCA/IDAgOiAxOwogfQogCi1zdHJ1Y3QgZ21hYyB0MV9wbTMzOTNfb3BzID0gewotCVNUQVRTX1RJQ0tfU0VDUywKLQlwbTMzOTNfbWFjX2NyZWF0ZSwKLQlwbTMzOTNfbWFjX3Jlc2V0Citjb25zdCBzdHJ1Y3QgZ21hYyB0MV9wbTMzOTNfb3BzID0geworCS5zdGF0c191cGRhdGVfcGVyaW9kID0gU1RBVFNfVElDS19TRUNTLAorCS5jcmVhdGUgICAgICAgICAgICAgID0gcG0zMzkzX21hY19jcmVhdGUsCisJLnJlc2V0ICAgICAgICAgICAgICAgPSBwbTMzOTNfbWFjX3Jlc2V0LAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2NoZWxzaW8vc2dlLmMgYi9kcml2ZXJzL25ldC9jaGVsc2lvL3NnZS5jCmluZGV4IDMyNmQ0YTYuLmU0Zjg3NGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2NoZWxzaW8vc2dlLmMKKysrIGIvZHJpdmVycy9uZXQvY2hlbHNpby9zZ2UuYwpAQCAtMTA2Miw3ICsxMDYyLDcgQEAKIAkJCQkJICAgIHBjaV91bm1hcF9hZGRyKGNlLCBkbWFfYWRkciksCiAJCQkJCSAgICBwY2lfdW5tYXBfbGVuKGNlLCBkbWFfbGVuKSwKIAkJCQkJICAgIFBDSV9ETUFfRlJPTURFVklDRSk7Ci0JCW1lbWNweShza2ItPmRhdGEsIGNlLT5za2ItPmRhdGEsIGxlbik7CisJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoY2UtPnNrYiwgc2tiLT5kYXRhLCBsZW4pOwogCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UocGRldiwKIAkJCQkJICAgICAgIHBjaV91bm1hcF9hZGRyKGNlLCBkbWFfYWRkciksCiAJCQkJCSAgICAgICBwY2lfdW5tYXBfbGVuKGNlLCBkbWFfbGVuKSwKQEAgLTEzNzksMTIgKzEzNzksMTEgQEAKIAl9CiAJX19za2JfcHVsbChza2IsIHNpemVvZigqcCkpOwogCi0Jc2tiLT5kZXYgPSBhZGFwdGVyLT5wb3J0W3AtPmlmZl0uZGV2OwogCXNrYi0+ZGV2LT5sYXN0X3J4ID0gamlmZmllczsKIAlzdCA9IHBlcl9jcHVfcHRyKHNnZS0+cG9ydF9zdGF0c1twLT5pZmZdLCBzbXBfcHJvY2Vzc29yX2lkKCkpOwogCXN0LT5yeF9wYWNrZXRzKys7CiAKLQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBza2ItPmRldik7CisJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgYWRhcHRlci0+cG9ydFtwLT5pZmZdLmRldik7CiAJaWYgKChhZGFwdGVyLT5mbGFncyAmIFJYX0NTVU1fRU5BQkxFRCkgJiYgcC0+Y3N1bSA9PSAweGZmZmYgJiYKIAkgICAgc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9JUCkgJiYKIAkgICAgKHNrYi0+ZGF0YVs5XSA9PSBJUFBST1RPX1RDUCB8fCBza2ItPmRhdGFbOV0gPT0gSVBQUk9UT19VRFApKSB7CkBAIC0xODY2LDE0ICsxODY1LDE0IEBACiAKIAkJKytzdC0+dHhfdHNvOwogCi0JCWV0aF90eXBlID0gc2tiLT5uaC5yYXcgLSBza2ItPmRhdGEgPT0gRVRIX0hMRU4gPworCQlldGhfdHlwZSA9IHNrYl9uZXR3b3JrX29mZnNldChza2IpID09IEVUSF9ITEVOID8KIAkJCUNQTF9FVEhfSUkgOiBDUExfRVRIX0lJX1ZMQU47CiAKIAkJaGRyID0gKHN0cnVjdCBjcGxfdHhfcGt0X2xzbyAqKXNrYl9wdXNoKHNrYiwgc2l6ZW9mKCpoZHIpKTsKIAkJaGRyLT5vcGNvZGUgPSBDUExfVFhfUEtUX0xTTzsKIAkJaGRyLT5pcF9jc3VtX2RpcyA9IGhkci0+bDRfY3N1bV9kaXMgPSAwOwotCQloZHItPmlwX2hkcl93b3JkcyA9IHNrYi0+bmguaXBoLT5paGw7Ci0JCWhkci0+dGNwX2hkcl93b3JkcyA9IHNrYi0+aC50aC0+ZG9mZjsKKwkJaGRyLT5pcF9oZHJfd29yZHMgPSBpcF9oZHIoc2tiKS0+aWhsOworCQloZHItPnRjcF9oZHJfd29yZHMgPSB0Y3BfaGRyKHNrYiktPmRvZmY7CiAJCWhkci0+ZXRoX3R5cGVfbXNzID0gaHRvbnMoTUtfRVRIX1RZUEVfTVNTKGV0aF90eXBlLAogCQkJCQkJCSAgc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZSkpOwogCQloZHItPmxlbiA9IGh0b25sKHNrYi0+bGVuIC0gc2l6ZW9mKCpoZHIpKTsKQEAgLTE5MTMsNyArMTkxMiw3IEBACiAKIAkJaWYgKCEoYWRhcHRlci0+ZmxhZ3MgJiBVRFBfQ1NVTV9DQVBBQkxFKSAmJgogCQkgICAgc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCAmJgotCQkgICAgc2tiLT5uaC5pcGgtPnByb3RvY29sID09IElQUFJPVE9fVURQKSB7CisJCSAgICBpcF9oZHIoc2tiKS0+cHJvdG9jb2wgPT0gSVBQUk9UT19VRFApIHsKIAkJCWlmICh1bmxpa2VseShza2JfY2hlY2tzdW1faGVscChza2IpKSkgewogCQkJCXByX2RlYnVnKCIlczogdW5hYmxlIHRvIGRvIHVkcCBjaGVja3N1bVxuIiwgZGV2LT5uYW1lKTsKIAkJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwpAQCAtMTkyNiw3ICsxOTI1LDcgQEAKIAkJICovCiAJCWlmICgodW5saWtlbHkoIWFkYXB0ZXItPnNnZS0+ZXNwaWJ1Z19za2JbZGV2LT5pZl9wb3J0XSkpKSB7CiAJCQlpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9BUlApICYmCi0JCQkgICAgc2tiLT5uaC5hcnBoLT5hcl9vcCA9PSBodG9ucyhBUlBPUF9SRVFVRVNUKSkgeworCQkJICAgIGFycF9oZHIoc2tiKS0+YXJfb3AgPT0gaHRvbnMoQVJQT1BfUkVRVUVTVCkpIHsKIAkJCQlhZGFwdGVyLT5zZ2UtPmVzcGlidWdfc2tiW2Rldi0+aWZfcG9ydF0gPSBza2I7CiAJCQkJLyogV2Ugd2FudCB0byByZS11c2UgdGhpcyBza2IgbGF0ZXIuIFdlCiAJCQkJICogc2ltcGx5IGJ1bXAgdGhlIHJlZmVyZW5jZSBjb3VudCBhbmQgaXQKQEAgLTIwOTYsMTAgKzIwOTUsMTQgQEAKIAkJCQkJMHgwLCAweDcsIDB4NDMsIDB4MCwgMHgwLCAweDAKIAkJCQl9OwogCi0JCQkJbWVtY3B5KHNrYi0+ZGF0YSArIHNpemVvZihzdHJ1Y3QgY3BsX3R4X3BrdCksCi0JCQkJCWNoX21hY19hZGRyLCBFVEhfQUxFTik7Ci0JCQkJbWVtY3B5KHNrYi0+ZGF0YSArIHNrYi0+bGVuIC0gMTAsCi0JCQkJCWNoX21hY19hZGRyLCBFVEhfQUxFTik7CisJCQkJc2tiX2NvcHlfdG9fbGluZWFyX2RhdGFfb2Zmc2V0KHNrYiwKKwkJCQkJCSAgICBzaXplb2Yoc3RydWN0IGNwbF90eF9wa3QpLAorCQkJCQkJCSAgICAgICBjaF9tYWNfYWRkciwKKwkJCQkJCQkgICAgICAgRVRIX0FMRU4pOworCQkJCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhX29mZnNldChza2IsCisJCQkJCQkJICAgICAgIHNrYi0+bGVuIC0gMTAsCisJCQkJCQkJICAgICAgIGNoX21hY19hZGRyLAorCQkJCQkJCSAgICAgICBFVEhfQUxFTik7CiAJCQkJc2tiLT5jYlswXSA9IDB4ZmY7CiAJCQl9CiAKQEAgLTIxMjYsMTAgKzIxMjksMTQgQEAKIAkgICAgICAgICAgICAgICAgaWYgKCFza2ItPmNiWzBdKSB7CiAJICAgICAgICAgICAgICAgICAgICAgICAgdTggY2hfbWFjX2FkZHJbRVRIX0FMRU5dID0KIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4MCwgMHg3LCAweDQzLCAweDAsIDB4MCwgMHgwfTsKLQkgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoc2tiLT5kYXRhICsgc2l6ZW9mKHN0cnVjdCBjcGxfdHhfcGt0KSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hfbWFjX2FkZHIsIEVUSF9BTEVOKTsKLQkgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoc2tiLT5kYXRhICsgc2tiLT5sZW4gLSAxMCwgY2hfbWFjX2FkZHIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVUSF9BTEVOKTsKKwkgICAgICAgICAgICAgICAgICAgICAgICBza2JfY29weV90b19saW5lYXJfZGF0YV9vZmZzZXQoc2tiLAorCQkJCQkJICAgICBzaXplb2Yoc3RydWN0IGNwbF90eF9wa3QpLAorCQkJCQkJCSAgICAgICBjaF9tYWNfYWRkciwKKwkJCQkJCQkgICAgICAgRVRIX0FMRU4pOworCSAgICAgICAgICAgICAgICAgICAgICAgIHNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhX29mZnNldChza2IsCisJCQkJCQkJICAgICAgIHNrYi0+bGVuIC0gMTAsCisJCQkJCQkJICAgICAgIGNoX21hY19hZGRyLAorCQkJCQkJCSAgICAgICBFVEhfQUxFTik7CiAJICAgICAgICAgICAgICAgICAgICAgICAgc2tiLT5jYlswXSA9IDB4ZmY7CiAJICAgICAgICAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2hlbHNpby9zdWJyLmMgYi9kcml2ZXJzL25ldC9jaGVsc2lvL3N1YnIuYwppbmRleCBjMjUyMmNkLi43ZGU5YTYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jaGVsc2lvL3N1YnIuYworKysgYi9kcml2ZXJzL25ldC9jaGVsc2lvL3N1YnIuYwpAQCAtMzIxLDEwICszMjEsMTAgQEAKIH0KIAogI2lmIGRlZmluZWQoQ09ORklHX0NIRUxTSU9fVDFfMUcpIHx8IGRlZmluZWQoQ09ORklHX0NIRUxTSU9fVDFfQ09VR0FSKQotc3RhdGljIHN0cnVjdCBtZGlvX29wcyBtaTFfbWRpb19vcHMgPSB7Ci0JbWkxX21kaW9faW5pdCwKLQltaTFfbWRpb19yZWFkLAotCW1pMV9tZGlvX3dyaXRlCitzdGF0aWMgY29uc3Qgc3RydWN0IG1kaW9fb3BzIG1pMV9tZGlvX29wcyA9IHsKKwkuaW5pdCA9IG1pMV9tZGlvX2luaXQsCisJLnJlYWQgPSBtaTFfbWRpb19yZWFkLAorCS53cml0ZSA9IG1pMV9tZGlvX3dyaXRlCiB9OwogI2VuZGlmCiAKQEAgLTM3NywxMCArMzc3LDEwIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgbWRpb19vcHMgbWkxX21kaW9fZXh0X29wcyA9IHsKLQltaTFfbWRpb19pbml0LAotCW1pMV9tZGlvX2V4dF9yZWFkLAotCW1pMV9tZGlvX2V4dF93cml0ZQorc3RhdGljIGNvbnN0IHN0cnVjdCBtZGlvX29wcyBtaTFfbWRpb19leHRfb3BzID0geworCS5pbml0ID0gbWkxX21kaW9faW5pdCwKKwkucmVhZCA9IG1pMV9tZGlvX2V4dF9yZWFkLAorCS53cml0ZSA9IG1pMV9tZGlvX2V4dF93cml0ZQogfTsKIAogZW51bSB7CkBAIC0zOTIsNjMgKzM5MiwxMzYgQEAKIAlDSF9CUkRfTjIwNF80Q1UsCiB9OwogCi1zdGF0aWMgc3RydWN0IGJvYXJkX2luZm8gdDFfYm9hcmRbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYm9hcmRfaW5mbyB0MV9ib2FyZFtdID0geworCXsKKwkJLmJvYXJkCQk9IENIQlRfQk9BUkRfQ0hUMTEwLAorCQkucG9ydF9udW1iZXIJPSAxLAorCQkuY2FwcwkJPSBTVVBQT1JURURfMTAwMDBiYXNlVF9GdWxsLAorCQkuY2hpcF90ZXJtCT0gQ0hCVF9URVJNX1QxLAorCQkuY2hpcF9tYWMJPSBDSEJUX01BQ19QTTMzOTMsCisJCS5jaGlwX3BoeQk9IENIQlRfUEhZX01ZMzEyNiwKKwkJLmNsb2NrX2NvcmUJPSAxMjUwMDAwMDAsCisJCS5jbG9ja19tYzMJPSAxNTAwMDAwMDAsCisJCS5jbG9ja19tYzQJPSAxMjUwMDAwMDAsCisJCS5lc3BpX25wb3J0cwk9IDEsCisJCS5jbG9ja19lbG1lcjAJPSA0NCwKKwkJLm1kaW9fbWRpZW4JPSAxLAorCQkubWRpb19tZGlpbnYJPSAxLAorCQkubWRpb19tZGMJPSAxLAorCQkubWRpb19waHliYXNlYWRkciA9IDEsCisJCS5nbWFjCQk9ICZ0MV9wbTMzOTNfb3BzLAorCQkuZ3BoeQkJPSAmdDFfbXkzMTI2X29wcywKKwkJLm1kaW9fb3BzCT0gJm1pMV9tZGlvX2V4dF9vcHMsCisJCS5kZXNjCQk9ICJDaGVsc2lvIFQxMTAgMXgxMEdCYXNlLUNYNCBUT0UiLAorCX0sCiAKLXsgQ0hCVF9CT0FSRF9DSFQxMTAsIDEvKnBvcnRzIyovLAotICBTVVBQT1JURURfMTAwMDBiYXNlVF9GdWxsIC8qY2FwcyovLCBDSEJUX1RFUk1fVDEsCi0gIENIQlRfTUFDX1BNMzM5MywgQ0hCVF9QSFlfTVkzMTI2LAotICAxMjUwMDAwMDAvKmNsay1jb3JlKi8sIDE1MDAwMDAwMC8qY2xrLW1jMyovLCAxMjUwMDAwMDAvKmNsay1tYzQqLywKLSAgMS8qZXNwaS1wb3J0cyovLCAwLypjbGstY3NwaSovLCA0NC8qY2xrLWVsbWVyMCovLCAxLyptZGllbiovLAotICAxLyptZGlpbnYqLywgMS8qbWRjKi8sIDEvKnBoeWJhc2VhZGRyKi8sICZ0MV9wbTMzOTNfb3BzLAotICAmdDFfbXkzMTI2X29wcywgJm1pMV9tZGlvX2V4dF9vcHMsCi0gICJDaGVsc2lvIFQxMTAgMXgxMEdCYXNlLUNYNCBUT0UiIH0sCisJeworCQkuYm9hcmQJCT0gQ0hCVF9CT0FSRF9OMTEwLAorCQkucG9ydF9udW1iZXIJPSAxLAorCQkuY2FwcwkJPSBTVVBQT1JURURfMTAwMDBiYXNlVF9GdWxsIHwgU1VQUE9SVEVEX0ZJQlJFLAorCQkuY2hpcF90ZXJtCT0gQ0hCVF9URVJNX1QxLAorCQkuY2hpcF9tYWMJPSBDSEJUX01BQ19QTTMzOTMsCisJCS5jaGlwX3BoeQk9IENIQlRfUEhZXzg4WDIwMTAsCisJCS5jbG9ja19jb3JlCT0gMTI1MDAwMDAwLAorCQkuZXNwaV9ucG9ydHMJPSAxLAorCQkuY2xvY2tfZWxtZXIwCT0gNDQsCisJCS5tZGlvX21kaWVuCT0gMCwKKwkJLm1kaW9fbWRpaW52CT0gMCwKKwkJLm1kaW9fbWRjCT0gMSwKKwkJLm1kaW9fcGh5YmFzZWFkZHIgPSAwLAorCQkuZ21hYwkJPSAmdDFfcG0zMzkzX29wcywKKwkJLmdwaHkJCT0gJnQxX212ODh4MjAxeF9vcHMsCisJCS5tZGlvX29wcwk9ICZtaTFfbWRpb19leHRfb3BzLAorCQkuZGVzYwkJPSAiQ2hlbHNpbyBOMTEwIDF4MTBHQmFzZVggTklDIiwKKwl9LAogCi17IENIQlRfQk9BUkRfTjExMCwgMS8qcG9ydHMjKi8sCi0gIFNVUFBPUlRFRF8xMDAwMGJhc2VUX0Z1bGwgfCBTVVBQT1JURURfRklCUkUgLypjYXBzKi8sIENIQlRfVEVSTV9UMSwKLSAgQ0hCVF9NQUNfUE0zMzkzLCBDSEJUX1BIWV84OFgyMDEwLAotICAxMjUwMDAwMDAvKmNsay1jb3JlKi8sIDAvKmNsay1tYzMqLywgMC8qY2xrLW1jNCovLAotICAxLyplc3BpLXBvcnRzKi8sIDAvKmNsay1jc3BpKi8sIDQ0LypjbGstZWxtZXIwKi8sIDAvKm1kaWVuKi8sCi0gIDAvKm1kaWludiovLCAxLyptZGMqLywgMC8qcGh5YmFzZWFkZHIqLywgJnQxX3BtMzM5M19vcHMsCi0gICZ0MV9tdjg4eDIwMXhfb3BzLCAmbWkxX21kaW9fZXh0X29wcywKLSAgIkNoZWxzaW8gTjExMCAxeDEwR0Jhc2VYIE5JQyIgfSwKKwl7CisJCS5ib2FyZAkJPSBDSEJUX0JPQVJEX04yMTAsCisJCS5wb3J0X251bWJlcgk9IDEsCisJCS5jYXBzCQk9IFNVUFBPUlRFRF8xMDAwMGJhc2VUX0Z1bGwgfCBTVVBQT1JURURfRklCUkUsCisJCS5jaGlwX3Rlcm0JPSBDSEJUX1RFUk1fVDIsCisJCS5jaGlwX21hYwk9IENIQlRfTUFDX1BNMzM5MywKKwkJLmNoaXBfcGh5CT0gQ0hCVF9QSFlfODhYMjAxMCwKKwkJLmNsb2NrX2NvcmUJPSAxMjUwMDAwMDAsCisJCS5lc3BpX25wb3J0cwk9IDEsCisJCS5jbG9ja19lbG1lcjAJPSA0NCwKKwkJLm1kaW9fbWRpZW4JPSAwLAorCQkubWRpb19tZGlpbnYJPSAwLAorCQkubWRpb19tZGMJPSAxLAorCQkubWRpb19waHliYXNlYWRkciA9IDAsCisJCS5nbWFjCQk9ICZ0MV9wbTMzOTNfb3BzLAorCQkuZ3BoeQkJPSAmdDFfbXY4OHgyMDF4X29wcywKKwkJLm1kaW9fb3BzCT0gJm1pMV9tZGlvX2V4dF9vcHMsCisJCS5kZXNjCQk9ICJDaGVsc2lvIE4yMTAgMXgxMEdCYXNlWCBOSUMiLAorCX0sCiAKLXsgQ0hCVF9CT0FSRF9OMjEwLCAxLypwb3J0cyMqLywKLSAgU1VQUE9SVEVEXzEwMDAwYmFzZVRfRnVsbCB8IFNVUFBPUlRFRF9GSUJSRSAvKmNhcHMqLywgQ0hCVF9URVJNX1QyLAotICBDSEJUX01BQ19QTTMzOTMsIENIQlRfUEhZXzg4WDIwMTAsCi0gIDEyNTAwMDAwMC8qY2xrLWNvcmUqLywgMC8qY2xrLW1jMyovLCAwLypjbGstbWM0Ki8sCi0gIDEvKmVzcGktcG9ydHMqLywgMC8qY2xrLWNzcGkqLywgNDQvKmNsay1lbG1lcjAqLywgMC8qbWRpZW4qLywKLSAgMC8qbWRpaW52Ki8sIDEvKm1kYyovLCAwLypwaHliYXNlYWRkciovLCAmdDFfcG0zMzkzX29wcywKLSAgJnQxX212ODh4MjAxeF9vcHMsICZtaTFfbWRpb19leHRfb3BzLAotICAiQ2hlbHNpbyBOMjEwIDF4MTBHQmFzZVggTklDIiB9LAorCXsKKwkJLmJvYXJkCQk9IENIQlRfQk9BUkRfQ0hUMjEwLAorCQkucG9ydF9udW1iZXIJPSAxLAorCQkuY2FwcwkJPSBTVVBQT1JURURfMTAwMDBiYXNlVF9GdWxsLAorCQkuY2hpcF90ZXJtCT0gQ0hCVF9URVJNX1QyLAorCQkuY2hpcF9tYWMJPSBDSEJUX01BQ19QTTMzOTMsCisJCS5jaGlwX3BoeQk9IENIQlRfUEhZXzg4WDIwMTAsCisJCS5jbG9ja19jb3JlCT0gMTI1MDAwMDAwLAorCQkuY2xvY2tfbWMzCT0gMTMzMDAwMDAwLAorCQkuY2xvY2tfbWM0CT0gMTI1MDAwMDAwLAorCQkuZXNwaV9ucG9ydHMJPSAxLAorCQkuY2xvY2tfZWxtZXIwCT0gNDQsCisJCS5tZGlvX21kaWVuCT0gMCwKKwkJLm1kaW9fbWRpaW52CT0gMCwKKwkJLm1kaW9fbWRjCT0gMSwKKwkJLm1kaW9fcGh5YmFzZWFkZHIgPSAwLAorCQkuZ21hYwkJPSAmdDFfcG0zMzkzX29wcywKKwkJLmdwaHkJCT0gJnQxX212ODh4MjAxeF9vcHMsCisJCS5tZGlvX29wcwk9ICZtaTFfbWRpb19leHRfb3BzLAorCQkuZGVzYwkJPSAiQ2hlbHNpbyBUMjEwIDF4MTBHQmFzZVggVE9FIiwKKwl9LAogCi17IENIQlRfQk9BUkRfQ0hUMjEwLCAxLypwb3J0cyMqLywKLSAgU1VQUE9SVEVEXzEwMDAwYmFzZVRfRnVsbCAvKmNhcHMqLywgQ0hCVF9URVJNX1QyLAotICBDSEJUX01BQ19QTTMzOTMsIENIQlRfUEhZXzg4WDIwMTAsCi0gIDEyNTAwMDAwMC8qY2xrLWNvcmUqLywgMTMzMDAwMDAwLypjbGstbWMzKi8sIDEyNTAwMDAwMC8qY2xrLW1jNCovLAotICAxLyplc3BpLXBvcnRzKi8sIDAvKmNsay1jc3BpKi8sIDQ0LypjbGstZWxtZXIwKi8sIDAvKm1kaWVuKi8sCi0gIDAvKm1kaWludiovLCAxLyptZGMqLywgMC8qcGh5YmFzZWFkZHIqLywgJnQxX3BtMzM5M19vcHMsCi0gICZ0MV9tdjg4eDIwMXhfb3BzLCAmbWkxX21kaW9fZXh0X29wcywKLSAgIkNoZWxzaW8gVDIxMCAxeDEwR0Jhc2VYIFRPRSIgfSwKLQoteyBDSEJUX0JPQVJEX0NIVDIxMCwgMS8qcG9ydHMjKi8sCi0gIFNVUFBPUlRFRF8xMDAwMGJhc2VUX0Z1bGwgLypjYXBzKi8sIENIQlRfVEVSTV9UMiwKLSAgQ0hCVF9NQUNfUE0zMzkzLCBDSEJUX1BIWV9NWTMxMjYsCi0gIDEyNTAwMDAwMC8qY2xrLWNvcmUqLywgMTMzMDAwMDAwLypjbGstbWMzKi8sIDEyNTAwMDAwMC8qY2xrLW1jNCovLAotICAxLyplc3BpLXBvcnRzKi8sIDAvKmNsay1jc3BpKi8sIDQ0LypjbGstZWxtZXIwKi8sIDEvKm1kaWVuKi8sCi0gIDEvKm1kaWludiovLCAxLyptZGMqLywgMS8qcGh5YmFzZWFkZHIqLywgJnQxX3BtMzM5M19vcHMsCi0gICZ0MV9teTMxMjZfb3BzLCAmbWkxX21kaW9fZXh0X29wcywKLSAgIkNoZWxzaW8gVDIxMCAxeDEwR0Jhc2UtQ1g0IFRPRSIgfSwKKwl7CisJCS5ib2FyZAkJPSBDSEJUX0JPQVJEX0NIVDIxMCwKKwkJLnBvcnRfbnVtYmVyCT0gMSwKKwkJLmNhcHMJCT0gU1VQUE9SVEVEXzEwMDAwYmFzZVRfRnVsbCwKKwkJLmNoaXBfdGVybQk9IENIQlRfVEVSTV9UMiwKKwkJLmNoaXBfbWFjCT0gQ0hCVF9NQUNfUE0zMzkzLAorCQkuY2hpcF9waHkJPSBDSEJUX1BIWV9NWTMxMjYsCisJCS5jbG9ja19jb3JlCT0gMTI1MDAwMDAwLAorCQkuY2xvY2tfbWMzCT0gMTMzMDAwMDAwLAorCQkuY2xvY2tfbWM0CT0gMTI1MDAwMDAwLAorCQkuZXNwaV9ucG9ydHMJPSAxLAorCQkuY2xvY2tfZWxtZXIwCT0gNDQsCisJCS5tZGlvX21kaWVuCT0gMSwKKwkJLm1kaW9fbWRpaW52CT0gMSwKKwkJLm1kaW9fbWRjCT0gMSwKKwkJLm1kaW9fcGh5YmFzZWFkZHIgPSAxLAorCQkuZ21hYwkJPSAmdDFfcG0zMzkzX29wcywKKwkJLmdwaHkJCT0gJnQxX215MzEyNl9vcHMsCisJCS5tZGlvX29wcwk9ICZtaTFfbWRpb19leHRfb3BzLAorCQkuZGVzYwkJPSAiQ2hlbHNpbyBUMjEwIDF4MTBHQmFzZS1DWDQgVE9FIiwKKwl9LAogCiAjaWZkZWYgQ09ORklHX0NIRUxTSU9fVDFfMUcKLXsgQ0hCVF9CT0FSRF9DSE4yMDQsIDQvKnBvcnRzIyovLAotICBTVVBQT1JURURfMTBiYXNlVF9IYWxmIHwgU1VQUE9SVEVEXzEwYmFzZVRfRnVsbCB8IFNVUFBPUlRFRF8xMDBiYXNlVF9IYWxmIHwKLSAgU1VQUE9SVEVEXzEwMGJhc2VUX0Z1bGwgfCBTVVBQT1JURURfMTAwMGJhc2VUX0Z1bGwgfCBTVVBQT1JURURfQXV0b25lZyB8Ci0gIFNVUFBPUlRFRF9QQVVTRSB8IFNVUFBPUlRFRF9UUCAvKmNhcHMqLywgQ0hCVF9URVJNX1QyLCBDSEJUX01BQ19WU0M3MzIxLCBDSEJUX1BIWV84OEUxMTExLAotICAxMDAwMDAwMDAvKmNsay1jb3JlKi8sIDAvKmNsay1tYzMqLywgMC8qY2xrLW1jNCovLAotICA0Lyplc3BpLXBvcnRzKi8sIDAvKmNsay1jc3BpKi8sIDQ0LypjbGstZWxtZXIwKi8sIDAvKm1kaWVuKi8sCi0gIDAvKm1kaWludiovLCAxLyptZGMqLywgNC8qcGh5YmFzZWFkZHIqLywgJnQxX3ZzYzczMjZfb3BzLAotICAmdDFfbXY4OGUxeHh4X29wcywgJm1pMV9tZGlvX29wcywKLSAgIkNoZWxzaW8gTjIwNCA0eDEwMC8xMDAwQmFzZVQgTklDIiB9LAorCXsKKwkJLmJvYXJkCQk9IENIQlRfQk9BUkRfQ0hOMjA0LAorCQkucG9ydF9udW1iZXIJPSA0LAorCQkuY2FwcwkJPSBTVVBQT1JURURfMTBiYXNlVF9IYWxmIHwgU1VQUE9SVEVEXzEwYmFzZVRfRnVsbAorCQkJCXwgU1VQUE9SVEVEXzEwMGJhc2VUX0hhbGYgfCBTVVBQT1JURURfMTAwYmFzZVRfRnVsbAorCQkJCXwgU1VQUE9SVEVEXzEwMDBiYXNlVF9GdWxsIHwgU1VQUE9SVEVEX0F1dG9uZWcgfAorCQkJCSAgU1VQUE9SVEVEX1BBVVNFIHwgU1VQUE9SVEVEX1RQLAorCQkuY2hpcF90ZXJtCT0gQ0hCVF9URVJNX1QyLAorCQkuY2hpcF9tYWMJPSBDSEJUX01BQ19WU0M3MzIxLAorCQkuY2hpcF9waHkJPSBDSEJUX1BIWV84OEUxMTExLAorCQkuY2xvY2tfY29yZQk9IDEwMDAwMDAwMCwKKwkJLmVzcGlfbnBvcnRzCT0gNCwKKwkJLmNsb2NrX2VsbWVyMAk9IDQ0LAorCQkubWRpb19tZGllbgk9IDAsCisJCS5tZGlvX21kaWludgk9IDAsCisJCS5tZGlvX21kYwk9IDAsCisJCS5tZGlvX3BoeWJhc2VhZGRyID0gNCwKKwkJLmdtYWMJCT0gJnQxX3ZzYzczMjZfb3BzLAorCQkuZ3BoeQkJPSAmdDFfbXY4OGUxeHh4X29wcywKKwkJLm1kaW9fb3BzCT0gJm1pMV9tZGlvX29wcywKKwkJLmRlc2MJCT0gIkNoZWxzaW8gTjIwNCA0eDEwMC8xMDAwQmFzZVQgTklDIiwKKwl9LAogI2VuZGlmCiAKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jaGVsc2lvL3ZzYzczMjYuYyBiL2RyaXZlcnMvbmV0L2NoZWxzaW8vdnNjNzMyNi5jCmluZGV4IDUzNGZmYTAuLjk5YjUxZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2NoZWxzaW8vdnNjNzMyNi5jCisrKyBiL2RyaXZlcnMvbmV0L2NoZWxzaW8vdnNjNzMyNi5jCkBAIC03MjMsNyArNzIzLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RydWN0IGdtYWMgdDFfdnNjNzMyNl9vcHMgPSB7Citjb25zdCBzdHJ1Y3QgZ21hYyB0MV92c2M3MzI2X29wcyA9IHsKIAkuc3RhdHNfdXBkYXRlX3BlcmlvZCA9IFNUQVRTX1RJQ0tfU0VDUywKIAkuY3JlYXRlICAgICAgICAgICAgICA9IHZzYzczMjZfbWFjX2NyZWF0ZSwKIAkucmVzZXQgICAgICAgICAgICAgICA9IHZzYzczMjZfbWFjX3Jlc2V0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2hlbHNpby92c2M4MjQ0LmMgYi9kcml2ZXJzL25ldC9jaGVsc2lvL3ZzYzgyNDQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjUxZDQ4NS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC9jaGVsc2lvL3ZzYzgyNDQuYworKysgL2Rldi9udWxsCkBAIC0xLDM2NyArMCwwIEBACi0vKgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIENoZWxzaW8gVDIgRXRoZXJuZXQgZHJpdmVyLgotICoKLSAqIENvcHlyaWdodCAoQykgMjAwNSBDaGVsc2lvIENvbW11bmljYXRpb25zLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbmNsdWRlZCBpbiB0aGlzCi0gKiByZWxlYXNlIGZvciBsaWNlbnNpbmcgdGVybXMgYW5kIGNvbmRpdGlvbnMuCi0gKi8KLQotI2luY2x1ZGUgImNvbW1vbi5oIgotI2luY2x1ZGUgImNwaHkuaCIKLSNpbmNsdWRlICJlbG1lcjAuaCIKLQotI2lmbmRlZiBBRFZFUlRJU0VfUEFVU0VfQ0FQCi0jIGRlZmluZSBBRFZFUlRJU0VfUEFVU0VfQ0FQIDB4NDAwCi0jZW5kaWYKLSNpZm5kZWYgQURWRVJUSVNFX1BBVVNFX0FTWU0KLSMgZGVmaW5lIEFEVkVSVElTRV9QQVVTRV9BU1lNIDB4ODAwCi0jZW5kaWYKLQotLyogR2lnYWJpdCBNSUkgcmVnaXN0ZXJzICovCi0jaWZuZGVmIE1JSV9DVFJMMTAwMAotIyBkZWZpbmUgTUlJX0NUUkwxMDAwIDkKLSNlbmRpZgotCi0jaWZuZGVmIEFEVkVSVElTRV8xMDAwRlVMTAotIyBkZWZpbmUgQURWRVJUSVNFXzEwMDBGVUxMIDB4MjAwCi0jIGRlZmluZSBBRFZFUlRJU0VfMTAwMEhBTEYgMHgxMDAKLSNlbmRpZgotCi0vKiBWU0M4MjQ0IFBIWSBzcGVjaWZpYyByZWdpc3RlcnMuICovCi1lbnVtIHsKLQlWU0M4MjQ0X0lOVFJfRU5BQkxFICAgPSAyNSwKLQlWU0M4MjQ0X0lOVFJfU1RBVFVTICAgPSAyNiwKLQlWU0M4MjQ0X0FVWF9DVFJMX1NUQVQgPSAyOCwKLX07Ci0KLWVudW0gewotCVZTQ19JTlRSX1JYX0VSUiAgICAgPSAxIDw8IDAsCi0JVlNDX0lOVFJfTVNfRVJSICAgICA9IDEgPDwgMSwgIC8qIG1hc3Rlci9zbGF2ZSByZXNvbHV0aW9uIGVycm9yICovCi0JVlNDX0lOVFJfQ0FCTEUgICAgICA9IDEgPDwgMiwgIC8qIGNhYmxlIGltcGFpcm1lbnQgKi8KLQlWU0NfSU5UUl9GQUxTRV9DQVJSID0gMSA8PCAzLCAgLyogZmFsc2UgY2FycmllciAqLwotCVZTQ19JTlRSX01FRElBX0NIRyAgPSAxIDw8IDQsICAvKiBBTVMgbWVkaWEgY2hhbmdlICovCi0JVlNDX0lOVFJfUlhfRklGTyAgICA9IDEgPDwgNSwgIC8qIFJ4IEZJRk8gb3Zlci91bmRlcmZsb3cgKi8KLQlWU0NfSU5UUl9UWF9GSUZPICAgID0gMSA8PCA2LCAgLyogVHggRklGTyBvdmVyL3VuZGVyZmxvdyAqLwotCVZTQ19JTlRSX0RFU0NSQU1CTCAgPSAxIDw8IDcsICAvKiBkZXNjcmFtYmxlciBsb2NrLWxvc3QgKi8KLQlWU0NfSU5UUl9TWU1CT0xfRVJSID0gMSA8PCA4LCAgLyogc3ltYm9sIGVycm9yICovCi0JVlNDX0lOVFJfTkVHX0RPTkUgICA9IDEgPDwgMTAsIC8qIGF1dG9uZWcgZG9uZSAqLwotCVZTQ19JTlRSX05FR19FUlIgICAgPSAxIDw8IDExLCAvKiBhdXRvbmVnIGVycm9yICovCi0JVlNDX0lOVFJfTElOS19DSEcgICA9IDEgPDwgMTMsIC8qIGxpbmsgY2hhbmdlICovCi0JVlNDX0lOVFJfRU5BQkxFICAgICA9IDEgPDwgMTUsIC8qIGludGVycnVwdCBlbmFibGUgKi8KLX07Ci0KLSNkZWZpbmUgQ0ZHX0NIR19JTlRSX01BU0sgKFZTQ19JTlRSX0xJTktfQ0hHIHwgVlNDX0lOVFJfTkVHX0VSUiB8IFwKLQkJCSAgIFZTQ19JTlRSX05FR19ET05FKQotI2RlZmluZSBJTlRSX01BU0sgKENGR19DSEdfSU5UUl9NQVNLIHwgVlNDX0lOVFJfVFhfRklGTyB8IFZTQ19JTlRSX1JYX0ZJRk8gfCBcCi0JCSAgIFZTQ19JTlRSX0VOQUJMRSkKLQotLyogUEhZIHNwZWNpZmljIGF1eGlsaWFyeSBjb250cm9sICYgc3RhdHVzIHJlZ2lzdGVyIGZpZWxkcyAqLwotI2RlZmluZSBTX0FDU1JfQUNUSVBIWV9UTVIgICAgMAotI2RlZmluZSBNX0FDU1JfQUNUSVBIWV9UTVIgICAgMHgzCi0jZGVmaW5lIFZfQUNTUl9BQ1RJUEhZX1RNUih4KSAoKHgpIDw8IFNfQUNTUl9BQ1RJUEhZX1RNUikKLQotI2RlZmluZSBTX0FDU1JfU1BFRUQgICAgMwotI2RlZmluZSBNX0FDU1JfU1BFRUQgICAgMHgzCi0jZGVmaW5lIEdfQUNTUl9TUEVFRCh4KSAoKCh4KSA+PiBTX0FDU1JfU1BFRUQpICYgTV9BQ1NSX1NQRUVEKQotCi0jZGVmaW5lIFNfQUNTUl9EVVBMRVggNQotI2RlZmluZSBGX0FDU1JfRFVQTEVYICgxIDw8IFNfQUNTUl9EVVBMRVgpCi0KLSNkZWZpbmUgU19BQ1NSX0FDVElQSFkgNgotI2RlZmluZSBGX0FDU1JfQUNUSVBIWSAoMSA8PCBTX0FDU1JfQUNUSVBIWSkKLQotLyoKLSAqIFJlc2V0IHRoZSBQSFkuICBUaGlzIFBIWSBjb21wbGV0ZXMgcmVzZXQgaW1tZWRpYXRlbHkgc28gd2UgbmV2ZXIgd2FpdC4KLSAqLwotc3RhdGljIGludCB2c2M4MjQ0X3Jlc2V0KHN0cnVjdCBjcGh5ICpjcGh5LCBpbnQgd2FpdCkKLXsKLQlpbnQgZXJyOwotCXVuc2lnbmVkIGludCBjdGw7Ci0KLQllcnIgPSBzaW1wbGVfbWRpb19yZWFkKGNwaHksIE1JSV9CTUNSLCAmY3RsKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0JY3RsICY9IH5CTUNSX1BET1dOOwotCWN0bCB8PSBCTUNSX1JFU0VUOwotCXJldHVybiBzaW1wbGVfbWRpb193cml0ZShjcGh5LCBNSUlfQk1DUiwgY3RsKTsKLX0KLQotc3RhdGljIGludCB2c2M4MjQ0X2ludHJfZW5hYmxlKHN0cnVjdCBjcGh5ICpjcGh5KQotewotCXNpbXBsZV9tZGlvX3dyaXRlKGNwaHksIFZTQzgyNDRfSU5UUl9FTkFCTEUsIElOVFJfTUFTSyk7Ci0KLQkvKiBFbmFibGUgaW50ZXJydXB0cyB0aHJvdWdoIEVsbWVyICovCi0JaWYgKHQxX2lzX2FzaWMoY3BoeS0+YWRhcHRlcikpIHsKLQkJdTMyIGVsbWVyOwotCi0JCXQxX3RwaV9yZWFkKGNwaHktPmFkYXB0ZXIsIEFfRUxNRVIwX0lOVF9FTkFCTEUsICZlbG1lcik7Ci0JCWVsbWVyIHw9IEVMTUVSMF9HUF9CSVQxOwotCQlpZiAoaXNfVDIoY3BoeS0+YWRhcHRlcikpCi0JCSAgICBlbG1lciB8PSBFTE1FUjBfR1BfQklUMnxFTE1FUjBfR1BfQklUM3xFTE1FUjBfR1BfQklUNDsKLQkJdDFfdHBpX3dyaXRlKGNwaHktPmFkYXB0ZXIsIEFfRUxNRVIwX0lOVF9FTkFCTEUsIGVsbWVyKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB2c2M4MjQ0X2ludHJfZGlzYWJsZShzdHJ1Y3QgY3BoeSAqY3BoeSkKLXsKLQlzaW1wbGVfbWRpb193cml0ZShjcGh5LCBWU0M4MjQ0X0lOVFJfRU5BQkxFLCAwKTsKLQotCWlmICh0MV9pc19hc2ljKGNwaHktPmFkYXB0ZXIpKSB7Ci0JCXUzMiBlbG1lcjsKLQotCQl0MV90cGlfcmVhZChjcGh5LT5hZGFwdGVyLCBBX0VMTUVSMF9JTlRfRU5BQkxFLCAmZWxtZXIpOwotCQllbG1lciAmPSB+RUxNRVIwX0dQX0JJVDE7Ci0JCWlmIChpc19UMihjcGh5LT5hZGFwdGVyKSkKLQkJICAgIGVsbWVyICY9IH4oRUxNRVIwX0dQX0JJVDJ8RUxNRVIwX0dQX0JJVDN8RUxNRVIwX0dQX0JJVDQpOwotCQl0MV90cGlfd3JpdGUoY3BoeS0+YWRhcHRlciwgQV9FTE1FUjBfSU5UX0VOQUJMRSwgZWxtZXIpOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZzYzgyNDRfaW50cl9jbGVhcihzdHJ1Y3QgY3BoeSAqY3BoeSkKLXsKLQl1MzIgdmFsOwotCXUzMiBlbG1lcjsKLQotCS8qIENsZWFyIFBIWSBpbnRlcnJ1cHRzIGJ5IHJlYWRpbmcgdGhlIHJlZ2lzdGVyLiAqLwotCXNpbXBsZV9tZGlvX3JlYWQoY3BoeSwgVlNDODI0NF9JTlRSX0VOQUJMRSwgJnZhbCk7Ci0KLQlpZiAodDFfaXNfYXNpYyhjcGh5LT5hZGFwdGVyKSkgewotCQl0MV90cGlfcmVhZChjcGh5LT5hZGFwdGVyLCBBX0VMTUVSMF9JTlRfQ0FVU0UsICZlbG1lcik7Ci0JCWVsbWVyIHw9IEVMTUVSMF9HUF9CSVQxOwotCQlpZiAoaXNfVDIoY3BoeS0+YWRhcHRlcikpCi0JCSAgICBlbG1lciB8PSBFTE1FUjBfR1BfQklUMnxFTE1FUjBfR1BfQklUM3xFTE1FUjBfR1BfQklUNDsKLQkJdDFfdHBpX3dyaXRlKGNwaHktPmFkYXB0ZXIsIEFfRUxNRVIwX0lOVF9DQVVTRSwgZWxtZXIpOwotCX0KLQotCXJldHVybiAwOwotfQotCi0vKgotICogRm9yY2UgdGhlIFBIWSBzcGVlZCBhbmQgZHVwbGV4LiAgVGhpcyBhbHNvIGRpc2FibGVzIGF1dG8tbmVnb3RpYXRpb24sIGV4Y2VwdAotICogZm9yIDFHYi9zLCB3aGVyZSBhdXRvLW5lZ290aWF0aW9uIGlzIG1hbmRhdG9yeS4KLSAqLwotc3RhdGljIGludCB2c2M4MjQ0X3NldF9zcGVlZF9kdXBsZXgoc3RydWN0IGNwaHkgKnBoeSwgaW50IHNwZWVkLCBpbnQgZHVwbGV4KQotewotCWludCBlcnI7Ci0JdW5zaWduZWQgaW50IGN0bDsKLQotCWVyciA9IHNpbXBsZV9tZGlvX3JlYWQocGh5LCBNSUlfQk1DUiwgJmN0bCk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQotCWlmIChzcGVlZCA+PSAwKSB7Ci0JCWN0bCAmPSB+KEJNQ1JfU1BFRUQxMDAgfCBCTUNSX1NQRUVEMTAwMCB8IEJNQ1JfQU5FTkFCTEUpOwotCQlpZiAoc3BlZWQgPT0gU1BFRURfMTAwKQotCQkJY3RsIHw9IEJNQ1JfU1BFRUQxMDA7Ci0JCWVsc2UgaWYgKHNwZWVkID09IFNQRUVEXzEwMDApCi0JCQljdGwgfD0gQk1DUl9TUEVFRDEwMDA7Ci0JfQotCWlmIChkdXBsZXggPj0gMCkgewotCQljdGwgJj0gfihCTUNSX0ZVTExEUExYIHwgQk1DUl9BTkVOQUJMRSk7Ci0JCWlmIChkdXBsZXggPT0gRFVQTEVYX0ZVTEwpCi0JCQljdGwgfD0gQk1DUl9GVUxMRFBMWDsKLQl9Ci0JaWYgKGN0bCAmIEJNQ1JfU1BFRUQxMDAwKSAgLyogYXV0by1uZWdvdGlhdGlvbiByZXF1aXJlZCBmb3IgMUdiL3MgKi8KLQkJY3RsIHw9IEJNQ1JfQU5FTkFCTEU7Ci0JcmV0dXJuIHNpbXBsZV9tZGlvX3dyaXRlKHBoeSwgTUlJX0JNQ1IsIGN0bCk7Ci19Ci0KLWludCB0MV9tZGlvX3NldF9iaXRzKHN0cnVjdCBjcGh5ICpwaHksIGludCBtbWQsIGludCByZWcsIHVuc2lnbmVkIGludCBiaXRzKQotewotCWludCByZXQ7Ci0JdW5zaWduZWQgaW50IHZhbDsKLQotCXJldCA9IG1kaW9fcmVhZChwaHksIG1tZCwgcmVnLCAmdmFsKTsKLQlpZiAoIXJldCkKLQkJcmV0ID0gbWRpb193cml0ZShwaHksIG1tZCwgcmVnLCB2YWwgfCBiaXRzKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHZzYzgyNDRfYXV0b25lZ19lbmFibGUoc3RydWN0IGNwaHkgKmNwaHkpCi17Ci0JcmV0dXJuIHQxX21kaW9fc2V0X2JpdHMoY3BoeSwgMCwgTUlJX0JNQ1IsCi0JCQkJQk1DUl9BTkVOQUJMRSB8IEJNQ1JfQU5SRVNUQVJUKTsKLX0KLQotc3RhdGljIGludCB2c2M4MjQ0X2F1dG9uZWdfcmVzdGFydChzdHJ1Y3QgY3BoeSAqY3BoeSkKLXsKLQlyZXR1cm4gdDFfbWRpb19zZXRfYml0cyhjcGh5LCAwLCBNSUlfQk1DUiwgQk1DUl9BTlJFU1RBUlQpOwotfQotCi1zdGF0aWMgaW50IHZzYzgyNDRfYWR2ZXJ0aXNlKHN0cnVjdCBjcGh5ICpwaHksIHVuc2lnbmVkIGludCBhZHZlcnRpc2VfbWFwKQotewotCWludCBlcnI7Ci0JdW5zaWduZWQgaW50IHZhbCA9IDA7Ci0KLQllcnIgPSBzaW1wbGVfbWRpb19yZWFkKHBoeSwgTUlJX0NUUkwxMDAwLCAmdmFsKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0JdmFsICY9IH4oQURWRVJUSVNFXzEwMDBIQUxGIHwgQURWRVJUSVNFXzEwMDBGVUxMKTsKLQlpZiAoYWR2ZXJ0aXNlX21hcCAmIEFEVkVSVElTRURfMTAwMGJhc2VUX0hhbGYpCi0JCXZhbCB8PSBBRFZFUlRJU0VfMTAwMEhBTEY7Ci0JaWYgKGFkdmVydGlzZV9tYXAgJiBBRFZFUlRJU0VEXzEwMDBiYXNlVF9GdWxsKQotCQl2YWwgfD0gQURWRVJUSVNFXzEwMDBGVUxMOwotCi0JZXJyID0gc2ltcGxlX21kaW9fd3JpdGUocGh5LCBNSUlfQ1RSTDEwMDAsIHZhbCk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQotCXZhbCA9IDE7Ci0JaWYgKGFkdmVydGlzZV9tYXAgJiBBRFZFUlRJU0VEXzEwYmFzZVRfSGFsZikKLQkJdmFsIHw9IEFEVkVSVElTRV8xMEhBTEY7Ci0JaWYgKGFkdmVydGlzZV9tYXAgJiBBRFZFUlRJU0VEXzEwYmFzZVRfRnVsbCkKLQkJdmFsIHw9IEFEVkVSVElTRV8xMEZVTEw7Ci0JaWYgKGFkdmVydGlzZV9tYXAgJiBBRFZFUlRJU0VEXzEwMGJhc2VUX0hhbGYpCi0JCXZhbCB8PSBBRFZFUlRJU0VfMTAwSEFMRjsKLQlpZiAoYWR2ZXJ0aXNlX21hcCAmIEFEVkVSVElTRURfMTAwYmFzZVRfRnVsbCkKLQkJdmFsIHw9IEFEVkVSVElTRV8xMDBGVUxMOwotCWlmIChhZHZlcnRpc2VfbWFwICYgQURWRVJUSVNFRF9QQVVTRSkKLQkJdmFsIHw9IEFEVkVSVElTRV9QQVVTRV9DQVA7Ci0JaWYgKGFkdmVydGlzZV9tYXAgJiBBRFZFUlRJU0VEX0FTWU1fUEFVU0UpCi0JCXZhbCB8PSBBRFZFUlRJU0VfUEFVU0VfQVNZTTsKLQlyZXR1cm4gc2ltcGxlX21kaW9fd3JpdGUocGh5LCBNSUlfQURWRVJUSVNFLCB2YWwpOwotfQotCi1zdGF0aWMgaW50IHZzYzgyNDRfZ2V0X2xpbmtfc3RhdHVzKHN0cnVjdCBjcGh5ICpjcGh5LCBpbnQgKmxpbmtfb2ssCi0JCQkJICAgaW50ICpzcGVlZCwgaW50ICpkdXBsZXgsIGludCAqZmMpCi17Ci0JdW5zaWduZWQgaW50IGJtY3IsIHN0YXR1cywgbHBhLCBhZHY7Ci0JaW50IGVyciwgc3AgPSAtMSwgZHBseCA9IC0xLCBwYXVzZSA9IDA7Ci0KLQllcnIgPSBzaW1wbGVfbWRpb19yZWFkKGNwaHksIE1JSV9CTUNSLCAmYm1jcik7Ci0JaWYgKCFlcnIpCi0JCWVyciA9IHNpbXBsZV9tZGlvX3JlYWQoY3BoeSwgTUlJX0JNU1IsICZzdGF0dXMpOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0KLQlpZiAobGlua19vaykgewotCQkvKgotCQkgKiBCTVNSX0xTVEFUVVMgaXMgbGF0Y2gtbG93LCBzbyBpZiBpdCBpcyAwIHdlIG5lZWQgdG8gcmVhZCBpdAotCQkgKiBvbmNlIG1vcmUgdG8gZ2V0IHRoZSBjdXJyZW50IGxpbmsgc3RhdGUuCi0JCSAqLwotCQlpZiAoIShzdGF0dXMgJiBCTVNSX0xTVEFUVVMpKQotCQkJZXJyID0gc2ltcGxlX21kaW9fcmVhZChjcGh5LCBNSUlfQk1TUiwgJnN0YXR1cyk7Ci0JCWlmIChlcnIpCi0JCQlyZXR1cm4gZXJyOwotCQkqbGlua19vayA9IChzdGF0dXMgJiBCTVNSX0xTVEFUVVMpICE9IDA7Ci0JfQotCWlmICghKGJtY3IgJiBCTUNSX0FORU5BQkxFKSkgewotCQlkcGx4ID0gKGJtY3IgJiBCTUNSX0ZVTExEUExYKSA/IERVUExFWF9GVUxMIDogRFVQTEVYX0hBTEY7Ci0JCWlmIChibWNyICYgQk1DUl9TUEVFRDEwMDApCi0JCQlzcCA9IFNQRUVEXzEwMDA7Ci0JCWVsc2UgaWYgKGJtY3IgJiBCTUNSX1NQRUVEMTAwKQotCQkJc3AgPSBTUEVFRF8xMDA7Ci0JCWVsc2UKLQkJCXNwID0gU1BFRURfMTA7Ci0JfSBlbHNlIGlmIChzdGF0dXMgJiBCTVNSX0FORUdDT01QTEVURSkgewotCQllcnIgPSBzaW1wbGVfbWRpb19yZWFkKGNwaHksIFZTQzgyNDRfQVVYX0NUUkxfU1RBVCwgJnN0YXR1cyk7Ci0JCWlmIChlcnIpCi0JCQlyZXR1cm4gZXJyOwotCi0JCWRwbHggPSAoc3RhdHVzICYgRl9BQ1NSX0RVUExFWCkgPyBEVVBMRVhfRlVMTCA6IERVUExFWF9IQUxGOwotCQlzcCA9IEdfQUNTUl9TUEVFRChzdGF0dXMpOwotCQlpZiAoc3AgPT0gMCkKLQkJCXNwID0gU1BFRURfMTA7Ci0JCWVsc2UgaWYgKHNwID09IDEpCi0JCQlzcCA9IFNQRUVEXzEwMDsKLQkJZWxzZQotCQkJc3AgPSBTUEVFRF8xMDAwOwotCi0JCWlmIChmYyAmJiBkcGx4ID09IERVUExFWF9GVUxMKSB7Ci0JCQllcnIgPSBzaW1wbGVfbWRpb19yZWFkKGNwaHksIE1JSV9MUEEsICZscGEpOwotCQkJaWYgKCFlcnIpCi0JCQkJZXJyID0gc2ltcGxlX21kaW9fcmVhZChjcGh5LCBNSUlfQURWRVJUSVNFLAotCQkJCQkJICAgICAgICZhZHYpOwotCQkJaWYgKGVycikKLQkJCQlyZXR1cm4gZXJyOwotCi0JCQlpZiAobHBhICYgYWR2ICYgQURWRVJUSVNFX1BBVVNFX0NBUCkKLQkJCQlwYXVzZSA9IFBBVVNFX1JYIHwgUEFVU0VfVFg7Ci0JCQllbHNlIGlmICgobHBhICYgQURWRVJUSVNFX1BBVVNFX0NBUCkgJiYKLQkJCQkgKGxwYSAmIEFEVkVSVElTRV9QQVVTRV9BU1lNKSAmJgotCQkJCSAoYWR2ICYgQURWRVJUSVNFX1BBVVNFX0FTWU0pKQotCQkJCXBhdXNlID0gUEFVU0VfVFg7Ci0JCQllbHNlIGlmICgobHBhICYgQURWRVJUSVNFX1BBVVNFX0FTWU0pICYmCi0JCQkJIChhZHYgJiBBRFZFUlRJU0VfUEFVU0VfQ0FQKSkKLQkJCQlwYXVzZSA9IFBBVVNFX1JYOwotCQl9Ci0JfQotCWlmIChzcGVlZCkKLQkJKnNwZWVkID0gc3A7Ci0JaWYgKGR1cGxleCkKLQkJKmR1cGxleCA9IGRwbHg7Ci0JaWYgKGZjKQotCQkqZmMgPSBwYXVzZTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB2c2M4MjQ0X2ludHJfaGFuZGxlcihzdHJ1Y3QgY3BoeSAqY3BoeSkKLXsKLQl1bnNpZ25lZCBpbnQgY2F1c2U7Ci0JaW50IGVyciwgY3BoeV9jYXVzZSA9IDA7Ci0KLQllcnIgPSBzaW1wbGVfbWRpb19yZWFkKGNwaHksIFZTQzgyNDRfSU5UUl9TVEFUVVMsICZjYXVzZSk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQotCWNhdXNlICY9IElOVFJfTUFTSzsKLQlpZiAoY2F1c2UgJiBDRkdfQ0hHX0lOVFJfTUFTSykKLQkJY3BoeV9jYXVzZSB8PSBjcGh5X2NhdXNlX2xpbmtfY2hhbmdlOwotCWlmIChjYXVzZSAmIChWU0NfSU5UUl9SWF9GSUZPIHwgVlNDX0lOVFJfVFhfRklGTykpCi0JCWNwaHlfY2F1c2UgfD0gY3BoeV9jYXVzZV9maWZvX2Vycm9yOwotCXJldHVybiBjcGh5X2NhdXNlOwotfQotCi1zdGF0aWMgdm9pZCB2c2M4MjQ0X2Rlc3Ryb3koc3RydWN0IGNwaHkgKmNwaHkpCi17Ci0Ja2ZyZWUoY3BoeSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgY3BoeV9vcHMgdnNjODI0NF9vcHMgPSB7Ci0JLmRlc3Ryb3kgICAgICAgICAgICAgID0gdnNjODI0NF9kZXN0cm95LAotCS5yZXNldCAgICAgICAgICAgICAgICA9IHZzYzgyNDRfcmVzZXQsCi0JLmludGVycnVwdF9lbmFibGUgICAgID0gdnNjODI0NF9pbnRyX2VuYWJsZSwKLQkuaW50ZXJydXB0X2Rpc2FibGUgICAgPSB2c2M4MjQ0X2ludHJfZGlzYWJsZSwKLQkuaW50ZXJydXB0X2NsZWFyICAgICAgPSB2c2M4MjQ0X2ludHJfY2xlYXIsCi0JLmludGVycnVwdF9oYW5kbGVyICAgID0gdnNjODI0NF9pbnRyX2hhbmRsZXIsCi0JLmF1dG9uZWdfZW5hYmxlICAgICAgID0gdnNjODI0NF9hdXRvbmVnX2VuYWJsZSwKLQkuYXV0b25lZ19yZXN0YXJ0ICAgICAgPSB2c2M4MjQ0X2F1dG9uZWdfcmVzdGFydCwKLQkuYWR2ZXJ0aXNlICAgICAgICAgICAgPSB2c2M4MjQ0X2FkdmVydGlzZSwKLQkuc2V0X3NwZWVkX2R1cGxleCAgICAgPSB2c2M4MjQ0X3NldF9zcGVlZF9kdXBsZXgsCi0JLmdldF9saW5rX3N0YXR1cyAgICAgID0gdnNjODI0NF9nZXRfbGlua19zdGF0dXMKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY3BoeSogdnNjODI0NF9waHlfY3JlYXRlKGFkYXB0ZXJfdCAqYWRhcHRlciwgaW50IHBoeV9hZGRyLAotCQkJCSAgICAgICBzdHJ1Y3QgbWRpb19vcHMgKm1kaW9fb3BzKQotewotCXN0cnVjdCBjcGh5ICpjcGh5ID0ga3phbGxvYyhzaXplb2YoKmNwaHkpLCBHRlBfS0VSTkVMKTsKLQotCWlmICghY3BoeSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQljcGh5X2luaXQoY3BoeSwgYWRhcHRlciwgcGh5X2FkZHIsICZ2c2M4MjQ0X29wcywgbWRpb19vcHMpOwotCi0JcmV0dXJuIGNwaHk7Ci19Ci0KLQotc3RhdGljIGludCB2c2M4MjQ0X3BoeV9yZXNldChhZGFwdGVyX3QqIGFkYXB0ZXIpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0cnVjdCBncGh5IHQxX3ZzYzgyNDRfb3BzID0gewotCXZzYzgyNDRfcGh5X2NyZWF0ZSwKLQl2c2M4MjQ0X3BoeV9yZXNldAotfTsKLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jaGVsc2lvL3ZzYzgyNDRfcmVnLmggYi9kcml2ZXJzL25ldC9jaGVsc2lvL3ZzYzgyNDRfcmVnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzYzE4MjkuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvY2hlbHNpby92c2M4MjQ0X3JlZy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qICREYXRlOiAyMDA1LzExLzIzIDE2OjI4OjUzICQgJFJDU2ZpbGU6IHZzYzgyNDRfcmVnLmgsdiAkICRSZXZpc2lvbjogMS4xICQgKi8KLSNpZm5kZWYgQ0hFTFNJT19NVjhFMVhYWF9ICi0jZGVmaW5lIENIRUxTSU9fTVY4RTFYWFhfSAotCi0jaWZuZGVmIEJNQ1JfU1BFRUQxMDAwCi0jIGRlZmluZSBCTUNSX1NQRUVEMTAwMCAweDQwCi0jZW5kaWYKLQotI2lmbmRlZiBBRFZFUlRJU0VfUEFVU0UKLSMgZGVmaW5lIEFEVkVSVElTRV9QQVVTRSAweDQwMAotI2VuZGlmCi0jaWZuZGVmIEFEVkVSVElTRV9QQVVTRV9BU1lNCi0jIGRlZmluZSBBRFZFUlRJU0VfUEFVU0VfQVNZTSAweDgwMAotI2VuZGlmCi0KLS8qIEdpZ2FiaXQgTUlJIHJlZ2lzdGVycyAqLwotI2RlZmluZSBNSUlfR0JNUiAxICAgICAgIC8qIDEwMDBCYXNlLVQgbW9kZSByZWdpc3RlciAqLwotI2RlZmluZSBNSUlfR0JDUiA5ICAgICAgIC8qIDEwMDBCYXNlLVQgY29udHJvbCByZWdpc3RlciAqLwotI2RlZmluZSBNSUlfR0JTUiAxMCAgICAgIC8qIDEwMDBCYXNlLVQgc3RhdHVzIHJlZ2lzdGVyICovCi0KLS8qIDEwMDBCYXNlLVQgY29udHJvbCByZWdpc3RlciBmaWVsZHMgKi8KLSNkZWZpbmUgR0JDUl9BRFZfMTAwMEhBTEYgICAgICAgICAweDEwMAotI2RlZmluZSBHQkNSX0FEVl8xMDAwRlVMTCAgICAgICAgIDB4MjAwCi0jZGVmaW5lIEdCQ1JfUFJFRkVSX01BU1RFUiAgICAgICAgMHg0MDAKLSNkZWZpbmUgR0JDUl9NQU5VQUxfQVNfTUFTVEVSICAgICAweDgwMAotI2RlZmluZSBHQkNSX01BTlVBTF9DT05GSUdfRU5BQkxFIDB4MTAwMAotCi0vKiAxMDAwQmFzZS1UIHN0YXR1cyByZWdpc3RlciBmaWVsZHMgKi8KLSNkZWZpbmUgR0JTUl9MUF8xMDAwSEFMRiAgMHg0MDAKLSNkZWZpbmUgR0JTUl9MUF8xMDAwRlVMTCAgMHg4MDAKLSNkZWZpbmUgR0JTUl9SRU1PVEVfT0sgICAgMHgxMDAwCi0jZGVmaW5lIEdCU1JfTE9DQUxfT0sgICAgIDB4MjAwMAotI2RlZmluZSBHQlNSX0xPQ0FMX01BU1RFUiAweDQwMDAKLSNkZWZpbmUgR0JTUl9NQVNURVJfRkFVTFQgMHg4MDAwCi0KLS8qIFZpdGVzc2UgUEhZIGludGVycnVwdCBzdGF0dXMgYml0cy4gKi8KLSNpZiAwCi0jZGVmaW5lIFZTQzgyNDRfSU5UUl9KQUJCRVIgICAgICAgICAgMHgwMDAxCi0jZGVmaW5lIFZTQzgyNDRfSU5UUl9QT0xBUklUWV9DSE5HICAgMHgwMDAyCi0jZGVmaW5lIFZTQzgyNDRfSU5UUl9FTkdfREVURUNUX0NITkcgMHgwMDEwCi0jZGVmaW5lIFZTQzgyNDRfSU5UUl9ET1dOU0hJRlQgICAgICAgMHgwMDIwCi0jZGVmaW5lIFZTQzgyNDRfSU5UUl9NRElfWE9WRVJfQ0hORyAgMHgwMDQwCi0jZGVmaW5lIFZTQzgyNDRfSU5UUl9GSUZPX09WRVJfVU5ERVIgMHgwMDgwCi0jZGVmaW5lIFZTQzgyNDRfSU5UUl9GQUxTRV9DQVJSSUVSICAgMHgwMTAwCi0jZGVmaW5lIFZTQzgyNDRfSU5UUl9TWU1CT0xfRVJST1IgICAgMHgwMjAwCi0jZGVmaW5lIFZTQzgyNDRfSU5UUl9MSU5LX0NITkcgICAgICAgMHgwNDAwCi0jZGVmaW5lIFZTQzgyNDRfSU5UUl9BVVRPTkVHX0RPTkUgICAgMHgwODAwCi0jZGVmaW5lIFZTQzgyNDRfSU5UUl9QQUdFX1JFQ1YgICAgICAgMHgxMDAwCi0jZGVmaW5lIFZTQzgyNDRfSU5UUl9EVVBMRVhfQ0hORyAgICAgMHgyMDAwCi0jZGVmaW5lIFZTQzgyNDRfSU5UUl9TUEVFRF9DSE5HICAgICAgMHg0MDAwCi0jZGVmaW5lIFZTQzgyNDRfSU5UUl9BVVRPTkVHX0VSUiAgICAgMHg4MDAwCi0jZWxzZQotLy8jZGVmaW5lIFZTQzgyNDRfSU5UUl9KQUJCRVIgICAgICAgICAgMHgwMDAxCi0vLyNkZWZpbmUgVlNDODI0NF9JTlRSX1BPTEFSSVRZX0NITkcgICAweDAwMDIKLS8vI2RlZmluZSBWU0M4MjQ0X0lOVFJfQklUMiAgICAgICAgICAgIDB4MDAwNAotLy8jZGVmaW5lIFZTQzgyNDRfSU5UUl9CSVQzICAgICAgICAgICAgMHgwMDA4Ci0jZGVmaW5lIFZTQzgyNDRfSU5UUl9SWF9FUlIgICAgICAgICAgMHgwMDAxCi0jZGVmaW5lIFZTQzgyNDRfSU5UUl9NQVNURVJfU0xBVkUgICAgMHgwMDAyCi0jZGVmaW5lIFZTQzgyNDRfSU5UUl9DQUJMRV9JTVBBSVJFRCAgMHgwMDA0Ci0jZGVmaW5lIFZTQzgyNDRfSU5UUl9GQUxTRV9DQVJSSUVSICAgMHgwMDA4Ci0vLyNkZWZpbmUgVlNDODI0NF9JTlRSX0VOR19ERVRFQ1RfQ0hORyAweDAwMTAKLS8vI2RlZmluZSBWU0M4MjQ0X0lOVFJfRE9XTlNISUZUICAgICAgIDB4MDAyMAotLy8jZGVmaW5lIFZTQzgyNDRfSU5UUl9NRElfWE9WRVJfQ0hORyAgMHgwMDQwCi0vLyNkZWZpbmUgVlNDODI0NF9JTlRSX0ZJRk9fT1ZFUl9VTkRFUiAweDAwODAKLSNkZWZpbmUgVlNDODI0NF9JTlRSX0JJVDQgICAgICAgICAgICAweDAwMTAKLSNkZWZpbmUgVlNDODI0NF9JTlRSX0ZJRk9fUlggICAgICAgICAweDAwMjAKLSNkZWZpbmUgVlNDODI0NF9JTlRSX0ZJRk9fT1ZFUl9VTkRFUiAweDAwNDAKLSNkZWZpbmUgVlNDODI0NF9JTlRSX0xPQ0tfTE9TVCAgICAgICAweDAwODAKLS8vI2RlZmluZSBWU0M4MjQ0X0lOVFJfRkFMU0VfQ0FSUklFUiAgIDB4MDEwMAotLy8jZGVmaW5lIFZTQzgyNDRfSU5UUl9TWU1CT0xfRVJST1IgICAgMHgwMjAwCi0vLyNkZWZpbmUgVlNDODI0NF9JTlRSX0xJTktfQ0hORyAgICAgICAweDA0MDAKLS8vI2RlZmluZSBWU0M4MjQ0X0lOVFJfQVVUT05FR19ET05FICAgIDB4MDgwMAotI2RlZmluZSBWU0M4MjQ0X0lOVFJfU1lNQk9MX0VSUk9SICAgIDB4MDEwMAotI2RlZmluZSBWU0M4MjQ0X0lOVFJfRU5HX0RFVEVDVF9DSE5HIDB4MDIwMAotI2RlZmluZSBWU0M4MjQ0X0lOVFJfQVVUT05FR19ET05FICAgIDB4MDQwMAotI2RlZmluZSBWU0M4MjQ0X0lOVFJfQVVUT05FR19FUlIgICAgIDB4MDgwMAotLy8jZGVmaW5lIFZTQzgyNDRfSU5UUl9QQUdFX1JFQ1YgICAgICAgMHgxMDAwCi0vLyNkZWZpbmUgVlNDODI0NF9JTlRSX0RVUExFWF9DSE5HICAgICAweDIwMDAKLS8vI2RlZmluZSBWU0M4MjQ0X0lOVFJfU1BFRURfQ0hORyAgICAgIDB4NDAwMAotLy8jZGVmaW5lIFZTQzgyNDRfSU5UUl9BVVRPTkVHX0VSUiAgICAgMHg4MDAwCi0jZGVmaW5lIFZTQzgyNDRfSU5UUl9EVVBMRVhfQ0hORyAgICAgMHgxMDAwCi0jZGVmaW5lIFZTQzgyNDRfSU5UUl9MSU5LX0NITkcgICAgICAgMHgyMDAwCi0jZGVmaW5lIFZTQzgyNDRfSU5UUl9TUEVFRF9DSE5HICAgICAgMHg0MDAwCi0jZGVmaW5lIFZTQzgyNDRfSU5UUl9TVEFUVVMgICAgICAgICAgMHg4MDAwCi0jZW5kaWYKLQotCi0vKiBWaXRlc3NlIFBIWSBzcGVjaWZpYyByZWdpc3RlcnMuICovCi0jZGVmaW5lIFZTQzgyNDRfU1BFQ0lGSUNfQ05UUkxfUkVHSVNURVIgICAgICAgICAgICAgICAxNgotI2RlZmluZSBWU0M4MjQ0X1NQRUNJRklDX1NUQVRVU19SRUdJU1RFUiAgICAgICAgICAgICAgMHgxYwotI2RlZmluZSBWU0M4MjQ0X0lOVEVSUlVQVF9FTkFCTEVfUkVHSVNURVIgICAgICAgICAgICAgMHgxOQotI2RlZmluZSBWU0M4MjQ0X0lOVEVSUlVQVF9TVEFUVVNfUkVHSVNURVIgICAgICAgICAgICAgMHgxYQotI2RlZmluZSBWU0M4MjQ0X0VYVF9QSFlfU1BFQ0lGSUNfQ05UUkxfUkVHSVNURVIgICAgICAgMjAKLSNkZWZpbmUgVlNDODI0NF9SRUNWX0VSUl9DTlRSX1JFR0lTVEVSICAgICAgICAgICAgICAgIDIxCi0jZGVmaW5lIFZTQzgyNDRfUkVTX1JFR0lTVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAyMgotI2RlZmluZSBWU0M4MjQ0X0dMT0JBTF9TVEFUVVNfUkVHSVNURVIgICAgICAgICAgICAgICAgMjMKLSNkZWZpbmUgVlNDODI0NF9MRURfQ09OVFJPTF9SRUdJU1RFUiAgICAgICAgICAgICAgICAgIDI0Ci0jZGVmaW5lIFZTQzgyNDRfTUFOVUFMX0xFRF9PVkVSUklERV9SRUdJU1RFUiAgICAgICAgICAyNQotI2RlZmluZSBWU0M4MjQ0X0VYVF9QSFlfU1BFQ0lGSUNfQ05UUkxfMl9SRUdJU1RFUiAgICAgMjYKLSNkZWZpbmUgVlNDODI0NF9FWFRfUEhZX1NQRUNJRklDX1NUQVRVU19SRUdJU1RFUiAgICAgIDI3Ci0jZGVmaW5lIFZTQzgyNDRfVklSVFVBTF9DQUJMRV9URVNURVJfUkVHSVNURVIgICAgICAgICAyOAotI2RlZmluZSBWU0M4MjQ0X0VYVEVOREVEX0FERFJfUkVHSVNURVIgICAgICAgICAgICAgICAgMjkKLSNkZWZpbmUgVlNDODI0NF9FWFRFTkRFRF9SRUdJU1RFUiAgICAgICAgICAgICAgICAgICAgIDMwCi0KLS8qIFBIWSBzcGVjaWZpYyBjb250cm9sIHJlZ2lzdGVyIGZpZWxkcyAqLwotI2RlZmluZSBTX1BTQ1JfTURJX1hPVkVSX01PREUgICAgNQotI2RlZmluZSBNX1BTQ1JfTURJX1hPVkVSX01PREUgICAgMHgzCi0jZGVmaW5lIFZfUFNDUl9NRElfWE9WRVJfTU9ERSh4KSAoKHgpIDw8IFNfUFNDUl9NRElfWE9WRVJfTU9ERSkKLSNkZWZpbmUgR19QU0NSX01ESV9YT1ZFUl9NT0RFKHgpICgoKHgpID4+IFNfUFNDUl9NRElfWE9WRVJfTU9ERSkgJiBNX1BTQ1JfTURJX1hPVkVSX01PREUpCi0KLS8qIEV4dGVuZGVkIFBIWSBzcGVjaWZpYyBjb250cm9sIHJlZ2lzdGVyIGZpZWxkcyAqLwotI2RlZmluZSBTX0RPV05TSElGVF9FTkFCTEUgOAotI2RlZmluZSBWX0RPV05TSElGVF9FTkFCTEUgKDEgPDwgU19ET1dOU0hJRlRfRU5BQkxFKQotCi0jZGVmaW5lIFNfRE9XTlNISUZUX0NOVCAgICA5Ci0jZGVmaW5lIE1fRE9XTlNISUZUX0NOVCAgICAweDcKLSNkZWZpbmUgVl9ET1dOU0hJRlRfQ05UKHgpICgoeCkgPDwgU19ET1dOU0hJRlRfQ05UKQotI2RlZmluZSBHX0RPV05TSElGVF9DTlQoeCkgKCgoeCkgPj4gU19ET1dOU0hJRlRfQ05UKSAmIE1fRE9XTlNISUZUX0NOVCkKLQotLyogUEhZIHNwZWNpZmljIHN0YXR1cyByZWdpc3RlciBmaWVsZHMgKi8KLSNkZWZpbmUgU19QU1NSX0pBQkJFUiAwCi0jZGVmaW5lIFZfUFNTUl9KQUJCRVIgKDEgPDwgU19QU1NSX0pBQkJFUikKLQotI2RlZmluZSBTX1BTU1JfUE9MQVJJVFkgMQotI2RlZmluZSBWX1BTU1JfUE9MQVJJVFkgKDEgPDwgU19QU1NSX1BPTEFSSVRZKQotCi0jZGVmaW5lIFNfUFNTUl9SWF9QQVVTRSAyCi0jZGVmaW5lIFZfUFNTUl9SWF9QQVVTRSAoMSA8PCBTX1BTU1JfUlhfUEFVU0UpCi0KLSNkZWZpbmUgU19QU1NSX1RYX1BBVVNFIDMKLSNkZWZpbmUgVl9QU1NSX1RYX1BBVVNFICgxIDw8IFNfUFNTUl9UWF9QQVVTRSkKLQotI2RlZmluZSBTX1BTU1JfRU5FUkdZX0RFVEVDVCA0Ci0jZGVmaW5lIFZfUFNTUl9FTkVSR1lfREVURUNUICgxIDw8IFNfUFNTUl9FTkVSR1lfREVURUNUKQotCi0jZGVmaW5lIFNfUFNTUl9ET1dOU0hJRlRfU1RBVFVTIDUKLSNkZWZpbmUgVl9QU1NSX0RPV05TSElGVF9TVEFUVVMgKDEgPDwgU19QU1NSX0RPV05TSElGVF9TVEFUVVMpCi0KLSNkZWZpbmUgU19QU1NSX01ESSA2Ci0jZGVmaW5lIFZfUFNTUl9NREkgKDEgPDwgU19QU1NSX01ESSkKLQotI2RlZmluZSBTX1BTU1JfQ0FCTEVfTEVOICAgIDcKLSNkZWZpbmUgTV9QU1NSX0NBQkxFX0xFTiAgICAweDcKLSNkZWZpbmUgVl9QU1NSX0NBQkxFX0xFTih4KSAoKHgpIDw8IFNfUFNTUl9DQUJMRV9MRU4pCi0jZGVmaW5lIEdfUFNTUl9DQUJMRV9MRU4oeCkgKCgoeCkgPj4gU19QU1NSX0NBQkxFX0xFTikgJiBNX1BTU1JfQ0FCTEVfTEVOKQotCi0vLyNkZWZpbmUgU19QU1NSX0xJTksgMTAKLS8vI2RlZmluZSBTX1BTU1JfTElOSyAxMwotI2RlZmluZSBTX1BTU1JfTElOSyAyCi0jZGVmaW5lIFZfUFNTUl9MSU5LICgxIDw8IFNfUFNTUl9MSU5LKQotCi0vLyNkZWZpbmUgU19QU1NSX1NUQVRVU19SRVNPTFZFRCAxMQotLy8jZGVmaW5lIFNfUFNTUl9TVEFUVVNfUkVTT0xWRUQgMTAKLSNkZWZpbmUgU19QU1NSX1NUQVRVU19SRVNPTFZFRCAxNQotI2RlZmluZSBWX1BTU1JfU1RBVFVTX1JFU09MVkVEICgxIDw8IFNfUFNTUl9TVEFUVVNfUkVTT0xWRUQpCi0KLSNkZWZpbmUgU19QU1NSX1BBR0VfUkVDRUlWRUQgMTIKLSNkZWZpbmUgVl9QU1NSX1BBR0VfUkVDRUlWRUQgKDEgPDwgU19QU1NSX1BBR0VfUkVDRUlWRUQpCi0KLS8vI2RlZmluZSBTX1BTU1JfRFVQTEVYIDEzCi0vLyNkZWZpbmUgU19QU1NSX0RVUExFWCAxMgotI2RlZmluZSBTX1BTU1JfRFVQTEVYIDUKLSNkZWZpbmUgVl9QU1NSX0RVUExFWCAoMSA8PCBTX1BTU1JfRFVQTEVYKQotCi0vLyNkZWZpbmUgU19QU1NSX1NQRUVEICAgIDE0Ci0vLyNkZWZpbmUgU19QU1NSX1NQRUVEICAgIDE0Ci0jZGVmaW5lIFNfUFNTUl9TUEVFRCAgICAzCi0jZGVmaW5lIE1fUFNTUl9TUEVFRCAgICAweDMKLSNkZWZpbmUgVl9QU1NSX1NQRUVEKHgpICgoeCkgPDwgU19QU1NSX1NQRUVEKQotI2RlZmluZSBHX1BTU1JfU1BFRUQoeCkgKCgoeCkgPj4gU19QU1NSX1NQRUVEKSAmIE1fUFNTUl9TUEVFRCkKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jcmlzL2V0aF92MTAuYyBiL2RyaXZlcnMvbmV0L2NyaXMvZXRoX3YxMC5jCmluZGV4IDhlYjU3MTIuLjViZGY1Y2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2NyaXMvZXRoX3YxMC5jCisrKyBiL2RyaXZlcnMvbmV0L2NyaXMvZXRoX3YxMC5jCkBAIC0xMzQ4LDcgKzEzNDgsOCBAQAogCiAjaWZkZWYgRVRIREVCVUcKIAkJcHJpbnRrKCJoZWFkID0gMHgleCwgZGF0YSA9IDB4JXgsIHRhaWwgPSAweCV4LCBlbmQgPSAweCV4XG4iLAotCQkgIHNrYi0+aGVhZCwgc2tiLT5kYXRhLCBza2ItPnRhaWwsIHNrYi0+ZW5kKTsKKwkJICAgICAgIHNrYi0+aGVhZCwgc2tiLT5kYXRhLCBza2JfdGFpbF9wb2ludGVyKHNrYiksCisJCSAgICAgICBza2JfZW5kX3BvaW50ZXIoc2tiKSk7CiAJCXByaW50aygiY29weWluZyBwYWNrZXQgdG8gMHgleC5cbiIsIHNrYl9kYXRhX3B0cik7CiAjZW5kaWYKIApAQCAtMTM3NSw3ICsxMzc2LDYgQEAKIAkJbXlOZXh0UnhEZXNjLT5kZXNjci5idWYgPSBMMV9DQUNIRV9BTElHTih2aXJ0X3RvX3BoeXMobXlOZXh0UnhEZXNjLT5za2ItPmRhdGEpKTsKIAl9CiAKLQlza2ItPmRldiA9IGRldjsKIAlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOwogCiAJLyogU2VuZCB0aGUgcGFja2V0IHRvIHRoZSB1cHBlciBsYXllcnMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2NzODl4MC5jIGIvZHJpdmVycy9uZXQvY3M4OXgwLmMKaW5kZXggNDYxMmY3MS4uOTc3NGJiMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY3M4OXgwLmMKKysrIGIvZHJpdmVycy9uZXQvY3M4OXgwLmMKQEAgLTEwMDQsNyArMTAwNCw2IEBACiAJCXJldHVybjsKIAl9CiAJc2tiX3Jlc2VydmUoc2tiLCAyKTsJLyogbG9uZ3dvcmQgYWxpZ24gTDMgaGVhZGVyICovCi0Jc2tiLT5kZXYgPSBkZXY7CiAKIAlpZiAoYnAgKyBsZW5ndGggPiBscC0+ZW5kX2RtYV9idWZmKSB7CiAJCWludCBzZW1pX2NudCA9IGxwLT5lbmRfZG1hX2J1ZmYgLSBicDsKQEAgLTE3MDIsNyArMTcwMSw2IEBACiAJCXJldHVybjsKIAl9CiAJc2tiX3Jlc2VydmUoc2tiLCAyKTsJLyogbG9uZ3dvcmQgYWxpZ24gTDMgaGVhZGVyICovCi0Jc2tiLT5kZXYgPSBkZXY7CiAKIAlyZWFkd29yZHMoaW9hZGRyLCBSWF9GUkFNRV9QT1JULCBza2JfcHV0KHNrYiwgbGVuZ3RoKSwgbGVuZ3RoID4+IDEpOwogCWlmIChsZW5ndGggJiAxKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY3hnYjMvY3hnYjNfb2ZmbG9hZC5jIGIvZHJpdmVycy9uZXQvY3hnYjMvY3hnYjNfb2ZmbG9hZC5jCmluZGV4IDE5OWU1MDYuLmViY2YzNWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2N4Z2IzL2N4Z2IzX29mZmxvYWQuYworKysgYi9kcml2ZXJzL25ldC9jeGdiMy9jeGdiM19vZmZsb2FkLmMKQEAgLTc4Myw3ICs3ODMsNyBAQAogCXNrYi0+cHJvdG9jb2wgPSBodG9ucygweGZmZmYpOwogCXNrYi0+ZGV2ID0gZGV2LT5sbGRldjsKIAlza2JfcHVsbChza2IsIHNpemVvZigqcCkpOwotCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKwlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwogCW5ldGlmX3JlY2VpdmVfc2tiKHNrYik7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jeGdiMy9zZ2UuYyBiL2RyaXZlcnMvbmV0L2N4Z2IzL3NnZS5jCmluZGV4IDAyN2FiMmMuLjM2NjY1ODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2N4Z2IzL3NnZS5jCisrKyBiL2RyaXZlcnMvbmV0L2N4Z2IzL3NnZS5jCkBAIC02NjEsNyArNjYxLDcgQEAKIAogCWlmIChza2IpIHsKIAkJX19za2JfcHV0KHNrYiwgSU1NRURfUEtUX1NJWkUpOwotCQltZW1jcHkoc2tiLT5kYXRhLCByZXNwLT5pbW1fZGF0YSwgSU1NRURfUEtUX1NJWkUpOworCQlza2JfY29weV90b19saW5lYXJfZGF0YShza2IsIHJlc3AtPmltbV9kYXRhLCBJTU1FRF9QS1RfU0laRSk7CiAJfQogCXJldHVybiBza2I7CiB9CkBAIC04OTcsMTEgKzg5NywxMSBAQAogCQlkLT5mbGl0WzJdID0gMDsKIAkJY250cmwgfD0gVl9UWFBLVF9PUENPREUoQ1BMX1RYX1BLVF9MU08pOwogCQloZHItPmNudHJsID0gaHRvbmwoY250cmwpOwotCQlldGhfdHlwZSA9IHNrYi0+bmgucmF3IC0gc2tiLT5kYXRhID09IEVUSF9ITEVOID8KKwkJZXRoX3R5cGUgPSBza2JfbmV0d29ya19vZmZzZXQoc2tiKSA9PSBFVEhfSExFTiA/CiAJCSAgICBDUExfRVRIX0lJIDogQ1BMX0VUSF9JSV9WTEFOOwogCQl0c29faW5mbyB8PSBWX0xTT19FVEhfVFlQRShldGhfdHlwZSkgfAotCQkgICAgVl9MU09fSVBIRFJfV09SRFMoc2tiLT5uaC5pcGgtPmlobCkgfAotCQkgICAgVl9MU09fVENQSERSX1dPUkRTKHNrYi0+aC50aC0+ZG9mZik7CisJCSAgICBWX0xTT19JUEhEUl9XT1JEUyhpcF9oZHIoc2tiKS0+aWhsKSB8CisJCSAgICBWX0xTT19UQ1BIRFJfV09SRFModGNwX2hkcihza2IpLT5kb2ZmKTsKIAkJaGRyLT5sc29faW5mbyA9IGh0b25sKHRzb19pbmZvKTsKIAkJZmxpdHMgPSAzOwogCX0gZWxzZSB7CkBAIC05MTMsNyArOTEzLDggQEAKIAkJaWYgKHNrYi0+bGVuIDw9IFdSX0xFTiAtIHNpemVvZigqY3BsKSkgewogCQkJcS0+c2Rlc2NbcGlkeF0uc2tiID0gTlVMTDsKIAkJCWlmICghc2tiLT5kYXRhX2xlbikKLQkJCQltZW1jcHkoJmQtPmZsaXRbMl0sIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCQkJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCAmZC0+ZmxpdFsyXSwKKwkJCQkJCQkgIHNrYi0+bGVuKTsKIAkJCWVsc2UKIAkJCQlza2JfY29weV9iaXRzKHNrYiwgMCwgJmQtPmZsaXRbMl0sIHNrYi0+bGVuKTsKIApAQCAtMTMxOSwxNiArMTMyMCwxOSBAQAogCS8qIE9ubHkgVFhfREFUQSBidWlsZHMgU0dMcyAqLwogCiAJZnJvbSA9IChzdHJ1Y3Qgd29ya19yZXF1ZXN0X2hkciAqKXNrYi0+ZGF0YTsKLQltZW1jcHkoJmQtPmZsaXRbMV0sICZmcm9tWzFdLCBza2ItPmgucmF3IC0gc2tiLT5kYXRhIC0gc2l6ZW9mKCpmcm9tKSk7CisJbWVtY3B5KCZkLT5mbGl0WzFdLCAmZnJvbVsxXSwKKwkgICAgICAgc2tiX3RyYW5zcG9ydF9vZmZzZXQoc2tiKSAtIHNpemVvZigqZnJvbSkpOwogCi0JZmxpdHMgPSAoc2tiLT5oLnJhdyAtIHNrYi0+ZGF0YSkgLyA4OworCWZsaXRzID0gc2tiX3RyYW5zcG9ydF9vZmZzZXQoc2tiKSAvIDg7CiAJc2dwID0gbmRlc2MgPT0gMSA/IChzdHJ1Y3Qgc2dfZW50ICopJmQtPmZsaXRbZmxpdHNdIDogc2dsOwotCXNnbF9mbGl0cyA9IG1ha2Vfc2dsKHNrYiwgc2dwLCBza2ItPmgucmF3LCBza2ItPnRhaWwgLSBza2ItPmgucmF3LAorCXNnbF9mbGl0cyA9IG1ha2Vfc2dsKHNrYiwgc2dwLCBza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpLAorCQkJICAgICBza2ItPnRhaWwgLSBza2ItPnRyYW5zcG9ydF9oZWFkZXIsCiAJCQkgICAgIGFkYXAtPnBkZXYpOwogCWlmIChuZWVkX3NrYl91bm1hcCgpKSB7CiAJCXNldHVwX2RlZmVycmVkX3VubWFwcGluZyhza2IsIGFkYXAtPnBkZXYsIHNncCwgc2dsX2ZsaXRzKTsKIAkJc2tiLT5kZXN0cnVjdG9yID0gZGVmZXJyZWRfdW5tYXBfZGVzdHJ1Y3RvcjsKLQkJKChzdHJ1Y3QgdW5tYXBfaW5mbyAqKXNrYi0+Y2IpLT5sZW4gPSBza2ItPnRhaWwgLSBza2ItPmgucmF3OworCQkoKHN0cnVjdCB1bm1hcF9pbmZvICopc2tiLT5jYiktPmxlbiA9IChza2ItPnRhaWwgLQorCQkJCQkJICAgICAgIHNrYi0+dHJhbnNwb3J0X2hlYWRlcik7CiAJfQogCiAJd3JpdGVfd3JfaGRyX3NnbChuZGVzYywgc2tiLCBkLCBwaWR4LCBxLCBzZ2wsIGZsaXRzLCBzZ2xfZmxpdHMsCkBAIC0xMzQ5LDggKzEzNTMsOCBAQAogCWlmIChza2ItPmxlbiA8PSBXUl9MRU4gJiYgY250ID09IDApCiAJCXJldHVybiAxOwkvKiBwYWNrZXQgZml0cyBhcyBpbW1lZGlhdGUgZGF0YSAqLwogCi0JZmxpdHMgPSAoc2tiLT5oLnJhdyAtIHNrYi0+ZGF0YSkgLyA4OwkvKiBoZWFkZXJzICovCi0JaWYgKHNrYi0+dGFpbCAhPSBza2ItPmgucmF3KQorCWZsaXRzID0gc2tiX3RyYW5zcG9ydF9vZmZzZXQoc2tiKSAvIDg7CS8qIGhlYWRlcnMgKi8KKwlpZiAoc2tiLT50YWlsICE9IHNrYi0+dHJhbnNwb3J0X2hlYWRlcikKIAkJY250Kys7CiAJcmV0dXJuIGZsaXRzX3RvX2Rlc2MoZmxpdHMgKyBzZ2xfbGVuKGNudCkpOwogfQpAQCAtMTYyMCw3ICsxNjI0LDkgQEAKIAkJCSAgICAgdW5zaWduZWQgaW50IGdhdGhlcl9pZHgpCiB7CiAJcnEtPm9mZmxvYWRfcGt0cysrOwotCXNrYi0+bWFjLnJhdyA9IHNrYi0+bmgucmF3ID0gc2tiLT5oLnJhdyA9IHNrYi0+ZGF0YTsKKwlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOworCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOworCXNrYl9yZXNldF90cmFuc3BvcnRfaGVhZGVyKHNrYik7CiAKIAlpZiAocnEtPnBvbGxpbmcpIHsKIAkJcnhfZ2F0aGVyW2dhdGhlcl9pZHgrK10gPSBza2I7CkBAIC0xNjg0LDkgKzE2OTAsOCBAQAogCXN0cnVjdCBwb3J0X2luZm8gKnBpOwogCiAJc2tiX3B1bGwoc2tiLCBzaXplb2YoKnApICsgcGFkKTsKLQlza2ItPmRldiA9IGFkYXAtPnBvcnRbcC0+aWZmXTsKIAlza2ItPmRldi0+bGFzdF9yeCA9IGppZmZpZXM7Ci0Jc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgc2tiLT5kZXYpOworCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGFkYXAtPnBvcnRbcC0+aWZmXSk7CiAJcGkgPSBuZXRkZXZfcHJpdihza2ItPmRldik7CiAJaWYgKHBpLT5yeF9jc3VtX29mZmxvYWQgJiYgcC0+Y3N1bV92YWxpZCAmJiBwLT5jc3VtID09IDB4ZmZmZiAmJgogCSAgICAhcC0+ZnJhZ21lbnQpIHsKQEAgLTE3MTcsMTEgKzE3MjIsMTEgQEAKIHsKIAlza2ItPmxlbiA9IGxlbjsKIAlpZiAobGVuIDw9IFNLQl9EQVRBX1NJWkUpIHsKLQkJbWVtY3B5KHNrYi0+ZGF0YSwgcC0+dmEsIGxlbik7CisJCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhKHNrYiwgcC0+dmEsIGxlbik7CiAJCXNrYi0+dGFpbCArPSBsZW47CiAJCXB1dF9wYWdlKHAtPmZyYWcucGFnZSk7CiAJfSBlbHNlIHsKLQkJbWVtY3B5KHNrYi0+ZGF0YSwgcC0+dmEsIFNLQl9EQVRBX1NJWkUpOworCQlza2JfY29weV90b19saW5lYXJfZGF0YShza2IsIHAtPnZhLCBTS0JfREFUQV9TSVpFKTsKIAkJc2tiX3NoaW5mbyhza2IpLT5mcmFnc1swXS5wYWdlID0gcC0+ZnJhZy5wYWdlOwogCQlza2Jfc2hpbmZvKHNrYiktPmZyYWdzWzBdLnBhZ2Vfb2Zmc2V0ID0KIAkJICAgIHAtPmZyYWcucGFnZV9vZmZzZXQgKyBTS0JfREFUQV9TSVpFOwpAQCAtMTc2Nyw3ICsxNzcyLDcgQEAKIAkJCV9fc2tiX3B1dChza2IsIGxlbik7CiAJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoYWRhcC0+cGRldiwgbWFwcGluZywgbGVuLAogCQkJCQkJICAgIFBDSV9ETUFfRlJPTURFVklDRSk7Ci0JCQltZW1jcHkoc2tiLT5kYXRhLCBzZC0+dC5za2ItPmRhdGEsIGxlbik7CisJCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNkLT50LnNrYiwgc2tiLT5kYXRhLCBsZW4pOwogCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKGFkYXAtPnBkZXYsIG1hcHBpbmcsIGxlbiwKIAkJCQkJCSAgICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOwogCQl9IGVsc2UgaWYgKCFkcm9wX3RocmVzKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZGU2MDAuYyBiL2RyaXZlcnMvbmV0L2RlNjAwLmMKaW5kZXggZTU0N2NlMS4uZGFlOTdiOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZGU2MDAuYworKysgYi9kcml2ZXJzL25ldC9kZTYwMC5jCkBAIC0zNTksNyArMzU5LDYgQEAKIAl9CiAJLyogZWxzZSAqLwogCi0Jc2tiLT5kZXYgPSBkZXY7CiAJc2tiX3Jlc2VydmUoc2tiLDIpOwkvKiBBbGlnbiAqLwogCiAJLyogJ3NrYi0+ZGF0YScgcG9pbnRzIHRvIHRoZSBzdGFydCBvZiBza19idWZmIGRhdGEgYXJlYS4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RlNjIwLmMgYi9kcml2ZXJzL25ldC9kZTYyMC5jCmluZGV4IGI2YWQwY2IuLmRjNDg5MjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2RlNjIwLmMKKysrIGIvZHJpdmVycy9uZXQvZGU2MjAuYwpAQCAtNjk3LDcgKzY5Nyw2IEBACiAJCX0KIAkJZWxzZSB7IC8qIFllcCEgR28gZ2V0IGl0ISAqLwogCQkJc2tiX3Jlc2VydmUoc2tiLDIpOwkvKiBBbGlnbiAqLwotCQkJc2tiLT5kZXYgPSBkZXY7CiAJCQkvKiBza2ItPmRhdGEgcG9pbnRzIHRvIHRoZSBzdGFydCBvZiBza19idWZmIGRhdGEgYXJlYSAqLwogCQkJYnVmZmVyID0gc2tiX3B1dChza2Isc2l6ZSk7CiAJCQkvKiBjb3B5IHRoZSBwYWNrZXQgaW50byB0aGUgYnVmZmVyICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kZWNsYW5jZS5jIGIvZHJpdmVycy9uZXQvZGVjbGFuY2UuYwppbmRleCA5ZjdlMWRiLi45NWQ4NTRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9kZWNsYW5jZS5jCisrKyBiL2RyaXZlcnMvbmV0L2RlY2xhbmNlLmMKQEAgLTYxNiw3ICs2MTYsNiBAQAogCQkJfQogCQkJbHAtPnN0YXRzLnJ4X2J5dGVzICs9IGxlbjsKIAotCQkJc2tiLT5kZXYgPSBkZXY7CiAJCQlza2JfcmVzZXJ2ZShza2IsIDIpOwkvKiAxNiBieXRlIGFsaWduICovCiAJCQlza2JfcHV0KHNrYiwgbGVuKTsJLyogbWFrZSByb29tICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RlZnh4LmMgYi9kcml2ZXJzL25ldC9kZWZ4eC5jCmluZGV4IDA3ZDI3MzEuLjU3MWQ4MmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2RlZnh4LmMKKysrIGIvZHJpdmVycy9uZXQvZGVmeHguYwpAQCAtMzA5MSwxMyArMzA5MSwxMyBAQAogCQkJCQl7CiAJCQkJCQkvKiBSZWNlaXZlIGJ1ZmZlciBhbGxvY2F0ZWQsIHBhc3MgcmVjZWl2ZSBwYWNrZXQgdXAgKi8KIAotCQkJCQkJbWVtY3B5KHNrYi0+ZGF0YSwgcF9idWZmICsgUkNWX0JVRkZfS19QQURESU5HLCBwa3RfbGVuKzMpOworCQkJCQkJc2tiX2NvcHlfdG9fbGluZWFyX2RhdGEoc2tiLAorCQkJCQkJCSAgICAgICBwX2J1ZmYgKyBSQ1ZfQlVGRl9LX1BBRERJTkcsCisJCQkJCQkJICAgICAgIHBrdF9sZW4gKyAzKTsKIAkJCQkJfQogCiAJCQkJCXNrYl9yZXNlcnZlKHNrYiwzKTsJCS8qIGFkanVzdCBkYXRhIGZpZWxkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIEZDIGJ5dGUgKi8KIAkJCQkJc2tiX3B1dChza2IsIHBrdF9sZW4pOwkJLyogcGFzcyB1cCBwYWNrZXQgbGVuZ3RoLCBOT1QgaW5jbHVkaW5nIENSQyAqLwotCQkJCQlza2ItPmRldiA9IGJwLT5kZXY7CQkvKiBwYXNzIHVwIGRldmljZSBwb2ludGVyICovCi0KIAkJCQkJc2tiLT5wcm90b2NvbCA9IGZkZGlfdHlwZV90cmFucyhza2IsIGJwLT5kZXYpOwogCQkJCQlicC0+cmN2X3RvdGFsX2J5dGVzICs9IHNrYi0+bGVuOwogCQkJCQluZXRpZl9yeChza2IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZGVwY2EuYyBiL2RyaXZlcnMvbmV0L2RlcGNhLmMKaW5kZXggZjM4MDdhYS4uMTgzNDk3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZGVwY2EuYworKysgYi9kcml2ZXJzL25ldC9kZXBjYS5jCkBAIC0xMDQ0LDcgKzEwNDQsNiBAQAogCQkJCQl1bnNpZ25lZCBjaGFyICpidWY7CiAJCQkJCXNrYl9yZXNlcnZlKHNrYiwgMik7CS8qIDE2IGJ5dGUgYWxpZ24gdGhlIElQIGhlYWRlciAqLwogCQkJCQlidWYgPSBza2JfcHV0KHNrYiwgcGt0X2xlbik7Ci0JCQkJCXNrYi0+ZGV2ID0gZGV2OwogCQkJCQlpZiAoZW50cnkgPCBscC0+cnhfb2xkKSB7CS8qIFdyYXBwZWQgYnVmZmVyICovCiAJCQkJCQlsZW4gPSAobHAtPnJ4UmluZ01hc2sgLSBscC0+cnhfb2xkICsgMSkgKiBSWF9CVUZGX1NaOwogCQkJCQkJbWVtY3B5X2Zyb21pbyhidWYsIGxwLT5yeF9idWZmW2xwLT5yeF9vbGRdLCBsZW4pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZGdycy5jIGIvZHJpdmVycy9uZXQvZGdycy5jCmluZGV4IGE3OTUyMDIuLmRmNjJjMDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2RncnMuYworKysgYi9kcml2ZXJzL25ldC9kZ3JzLmMKQEAgLTUwMyw3ICs1MDMsNiBAQAogCQkvKiBkaXNjYXJkaW5nIHRoZSBmcmFtZSAqLwogCQlnb3RvIG91dDsKIAl9Ci0Jc2tiLT5kZXYgPSBkZXZOOwogCXNrYl9yZXNlcnZlKHNrYiwgMik7CS8qIEFsaWduIElQIGhlYWRlciAqLwogCiBhZ2FpbjoKQEAgLTc0Miw3ICs3NDEsNyBAQAogCQl9CiAKIAkJYW10ID0gbWluX3QodW5zaWduZWQgaW50LCBsZW4sIHJiZHAtPnNpemUgLSBjb3VudCk7Ci0JCW1lbWNweSggKGNoYXIgKikgUzJIKHJiZHAtPmJ1ZikgKyBjb3VudCwgc2tiLT5kYXRhICsgaSwgYW10KTsKKwkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YV9vZmZzZXQoc2tiLCBpLCBTMkgocmJkcC0+YnVmKSArIGNvdW50LCBhbXQpOwogCQlpICs9IGFtdDsKIAkJY291bnQgKz0gYW10OwogCQlsZW4gLT0gYW10OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZGwyay5jIGIvZHJpdmVycy9uZXQvZGwyay5jCmluZGV4IDlkNDQ2YTAuLjc0ZWM2NGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2RsMmsuYworKysgYi9kcml2ZXJzL25ldC9kbDJrLmMKQEAgLTUwNCw3ICs1MDQsNiBAQAogCQkJCQlicmVhazsKIAkJCQl9CiAJCQkJbnAtPnJ4X3NrYnVmZltlbnRyeV0gPSBza2I7Ci0JCQkJc2tiLT5kZXYgPSBkZXY7CiAJCQkJLyogMTYgYnl0ZSBhbGlnbiB0aGUgSVAgaGVhZGVyICovCiAJCQkJc2tiX3Jlc2VydmUgKHNrYiwgMik7CiAJCQkJbnAtPnJ4X3JpbmdbZW50cnldLmZyYWdpbmZvID0KQEAgLTU3NSw3ICs1NzQsNiBAQAogCQkJCWRldi0+bmFtZSk7CiAJCQlicmVhazsKIAkJfQotCQlza2ItPmRldiA9IGRldjsJLyogTWFyayBhcyBiZWluZyB1c2VkIGJ5IHRoaXMgZGV2aWNlLiAqLwogCQlza2JfcmVzZXJ2ZSAoc2tiLCAyKTsJLyogMTYgYnl0ZSBhbGlnbiB0aGUgSVAgaGVhZGVyLiAqLwogCQkvKiBSdWJpY29uIG5vdyBzdXBwb3J0cyA0MCBiaXRzIG9mIGFkZHJlc3Npbmcgc3BhY2UuICovCiAJCW5wLT5yeF9yaW5nW2ldLmZyYWdpbmZvID0KQEAgLTg2Niw3ICs4NjQsNiBAQAogCQkJCQkJCSAgICAJRE1BXzQ4QklUX01BU0ssCiAJCQkJCQkJICAgIG5wLT5yeF9idWZfc3osCiAJCQkJCQkJICAgIFBDSV9ETUFfRlJPTURFVklDRSk7Ci0JCQkJc2tiLT5kZXYgPSBkZXY7CiAJCQkJLyogMTYgYnl0ZSBhbGlnbiB0aGUgSVAgaGVhZGVyICovCiAJCQkJc2tiX3Jlc2VydmUgKHNrYiwgMik7CiAJCQkJZXRoX2NvcHlfYW5kX3N1bSAoc2tiLApAQCAtOTEwLDcgKzkwNyw2IEBACiAJCQkJYnJlYWs7CiAJCQl9CiAJCQlucC0+cnhfc2tidWZmW2VudHJ5XSA9IHNrYjsKLQkJCXNrYi0+ZGV2ID0gZGV2OwogCQkJLyogMTYgYnl0ZSBhbGlnbiB0aGUgSVAgaGVhZGVyICovCiAJCQlza2JfcmVzZXJ2ZSAoc2tiLCAyKTsKIAkJCW5wLT5yeF9yaW5nW2VudHJ5XS5mcmFnaW5mbyA9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kbTkwMDAuYyBiL2RyaXZlcnMvbmV0L2RtOTAwMC5jCmluZGV4IDYxNWQyYjEuLjhjYzExNzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2RtOTAwMC5jCisrKyBiL2RyaXZlcnMvbmV0L2RtOTAwMC5jCkBAIC05NTQsNyArOTU0LDYgQEAKIAkJLyogTW92ZSBkYXRhIGZyb20gRE05MDAwICovCiAJCWlmIChHb29kUGFja2V0CiAJCSAgICAmJiAoKHNrYiA9IGRldl9hbGxvY19za2IoUnhMZW4gKyA0KSkgIT0gTlVMTCkpIHsKLQkJCXNrYi0+ZGV2ID0gZGV2OwogCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsKIAkJCXJkcHRyID0gKHU4ICopIHNrYl9wdXQoc2tiLCBSeExlbiAtIDQpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lMTAwLmMgYi9kcml2ZXJzL25ldC9lMTAwLmMKaW5kZXggMGNlZmVmNS4uNjE2OTY2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZTEwMC5jCisrKyBiL2RyaXZlcnMvbmV0L2UxMDAuYwpAQCAtMTU5LDcgKzE1OSw3IEBACiAKICNkZWZpbmUgRFJWX05BTUUJCSJlMTAwIgogI2RlZmluZSBEUlZfRVhUCQkJIi1OQVBJIgotI2RlZmluZSBEUlZfVkVSU0lPTgkJIjMuNS4xNy1rMiJEUlZfRVhUCisjZGVmaW5lIERSVl9WRVJTSU9OCQkiMy41LjE3LWs0IkRSVl9FWFQKICNkZWZpbmUgRFJWX0RFU0NSSVBUSU9OCQkiSW50ZWwoUikgUFJPLzEwMCBOZXR3b3JrIERyaXZlciIKICNkZWZpbmUgRFJWX0NPUFlSSUdIVAkJIkNvcHlyaWdodChjKSAxOTk5LTIwMDYgSW50ZWwgQ29ycG9yYXRpb24iCiAjZGVmaW5lIFBGWAkJCURSVl9OQU1FICI6ICIKQEAgLTE3NCwxMCArMTc0LDEzIEBACiAKIHN0YXRpYyBpbnQgZGVidWcgPSAzOwogc3RhdGljIGludCBlZXByb21fYmFkX2NzdW1fYWxsb3cgPSAwOworc3RhdGljIGludCB1c2VfaW8gPSAwOwogbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDApOwogbW9kdWxlX3BhcmFtKGVlcHJvbV9iYWRfY3N1bV9hbGxvdywgaW50LCAwKTsKK21vZHVsZV9wYXJhbSh1c2VfaW8sIGludCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiRGVidWcgbGV2ZWwgKDA9bm9uZSwuLi4sMTY9YWxsKSIpOwogTU9EVUxFX1BBUk1fREVTQyhlZXByb21fYmFkX2NzdW1fYWxsb3csICJBbGxvdyBiYWQgZWVwcm9tIGNoZWNrc3VtcyIpOworTU9EVUxFX1BBUk1fREVTQyh1c2VfaW8sICJGb3JjZSB1c2Ugb2YgaS9vIGFjY2VzcyBtb2RlIik7CiAjZGVmaW5lIERQUklOVEsobmxldmVsLCBrbGV2ZWwsIGZtdCwgYXJncy4uLikgXAogCSh2b2lkKSgoTkVUSUZfTVNHXyMjbmxldmVsICYgbmljLT5tc2dfZW5hYmxlKSAmJiBcCiAJcHJpbnRrKEtFUk5fIyNrbGV2ZWwgUEZYICIlczogJXM6ICIgZm10LCBuaWMtPm5ldGRldi0+bmFtZSwgXApAQCAtMjgyLDEyICsyODUsNiBAQAogCXJ1c19tYXNrICAgICAgICAgPSAweDNDLAogfTsKIAotZW51bSBydV9zdGF0ZSAgewotCVJVX1NVU1BFTkRFRCA9IDAsCi0JUlVfUlVOTklORwkgPSAxLAotCVJVX1VOSU5JVElBTElaRUQgPSAtMSwKLX07Ci0KIGVudW0gc2NiX3N0YXRfYWNrIHsKIAlzdGF0X2Fja19ub3Rfb3VycyAgICA9IDB4MDAsCiAJc3RhdF9hY2tfc3dfZ2VuICAgICAgPSAweDA0LApAQCAtNTI5LDcgKzUyNiw2IEBACiAJc3RydWN0IHJ4ICpyeF90b191c2U7CiAJc3RydWN0IHJ4ICpyeF90b19jbGVhbjsKIAlzdHJ1Y3QgcmZkIGJsYW5rX3JmZDsKLQllbnVtIHJ1X3N0YXRlIHJ1X3J1bm5pbmc7CiAKIAlzcGlubG9ja190IGNiX2xvY2sJCQlfX19fY2FjaGVsaW5lX2FsaWduZWQ7CiAJc3BpbmxvY2tfdCBjbWRfbG9jazsKQEAgLTU5MSw3ICs1ODcsNyBAQAogewogCS8qIEZsdXNoIHByZXZpb3VzIFBDSSB3cml0ZXMgdGhyb3VnaCBpbnRlcm1lZGlhdGUgYnJpZGdlcwogCSAqIGJ5IGRvaW5nIGEgYmVuaWduIHJlYWQgKi8KLQkodm9pZClyZWFkYigmbmljLT5jc3ItPnNjYi5zdGF0dXMpOworCSh2b2lkKWlvcmVhZDgoJm5pYy0+Y3NyLT5zY2Iuc3RhdHVzKTsKIH0KIAogc3RhdGljIHZvaWQgZTEwMF9lbmFibGVfaXJxKHN0cnVjdCBuaWMgKm5pYykKQEAgLTU5OSw3ICs1OTUsNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmbmljLT5jbWRfbG9jaywgZmxhZ3MpOwotCXdyaXRlYihpcnFfbWFza19ub25lLCAmbmljLT5jc3ItPnNjYi5jbWRfaGkpOworCWlvd3JpdGU4KGlycV9tYXNrX25vbmUsICZuaWMtPmNzci0+c2NiLmNtZF9oaSk7CiAJZTEwMF93cml0ZV9mbHVzaChuaWMpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5pYy0+Y21kX2xvY2ssIGZsYWdzKTsKIH0KQEAgLTYwOSw3ICs2MDUsNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmbmljLT5jbWRfbG9jaywgZmxhZ3MpOwotCXdyaXRlYihpcnFfbWFza19hbGwsICZuaWMtPmNzci0+c2NiLmNtZF9oaSk7CisJaW93cml0ZTgoaXJxX21hc2tfYWxsLCAmbmljLT5jc3ItPnNjYi5jbWRfaGkpOwogCWUxMDBfd3JpdGVfZmx1c2gobmljKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuaWMtPmNtZF9sb2NrLCBmbGFncyk7CiB9CkBAIC02MTgsMTEgKzYxNCwxMSBAQAogewogCS8qIFB1dCBDVSBhbmQgUlUgaW50byBpZGxlIHdpdGggYSBzZWxlY3RpdmUgcmVzZXQgdG8gZ2V0CiAJICogZGV2aWNlIG9mZiBvZiBQQ0kgYnVzICovCi0Jd3JpdGVsKHNlbGVjdGl2ZV9yZXNldCwgJm5pYy0+Y3NyLT5wb3J0KTsKKwlpb3dyaXRlMzIoc2VsZWN0aXZlX3Jlc2V0LCAmbmljLT5jc3ItPnBvcnQpOwogCWUxMDBfd3JpdGVfZmx1c2gobmljKTsgdWRlbGF5KDIwKTsKIAogCS8qIE5vdyBmdWxseSByZXNldCBkZXZpY2UgKi8KLQl3cml0ZWwoc29mdHdhcmVfcmVzZXQsICZuaWMtPmNzci0+cG9ydCk7CisJaW93cml0ZTMyKHNvZnR3YXJlX3Jlc2V0LCAmbmljLT5jc3ItPnBvcnQpOwogCWUxMDBfd3JpdGVfZmx1c2gobmljKTsgdWRlbGF5KDIwKTsKIAogCS8qIE1hc2sgb2ZmIG91ciBpbnRlcnJ1cHQgbGluZSAtIGl0J3MgdW5tYXNrZWQgYWZ0ZXIgcmVzZXQgKi8KQEAgLTYzOSw3ICs2MzUsNyBAQAogCW5pYy0+bWVtLT5zZWxmdGVzdC5zaWduYXR1cmUgPSAwOwogCW5pYy0+bWVtLT5zZWxmdGVzdC5yZXN1bHQgPSAweEZGRkZGRkZGOwogCi0Jd3JpdGVsKHNlbGZ0ZXN0IHwgZG1hX2FkZHIsICZuaWMtPmNzci0+cG9ydCk7CisJaW93cml0ZTMyKHNlbGZ0ZXN0IHwgZG1hX2FkZHIsICZuaWMtPmNzci0+cG9ydCk7CiAJZTEwMF93cml0ZV9mbHVzaChuaWMpOwogCS8qIFdhaXQgMTAgbXNlYyBmb3Igc2VsZi10ZXN0IHRvIGNvbXBsZXRlICovCiAJbXNsZWVwKDEwKTsKQEAgLTY3NywyMyArNjczLDIzIEBACiAJZm9yKGogPSAwOyBqIDwgMzsgaisrKSB7CiAKIAkJLyogQ2hpcCBzZWxlY3QgKi8KLQkJd3JpdGViKGVlY3MgfCBlZXNrLCAmbmljLT5jc3ItPmVlcHJvbV9jdHJsX2xvKTsKKwkJaW93cml0ZTgoZWVjcyB8IGVlc2ssICZuaWMtPmNzci0+ZWVwcm9tX2N0cmxfbG8pOwogCQllMTAwX3dyaXRlX2ZsdXNoKG5pYyk7IHVkZWxheSg0KTsKIAogCQlmb3IoaSA9IDMxOyBpID49IDA7IGktLSkgewogCQkJY3RybCA9IChjbWRfYWRkcl9kYXRhW2pdICYgKDEgPDwgaSkpID8KIAkJCQllZWNzIHwgZWVkaSA6IGVlY3M7Ci0JCQl3cml0ZWIoY3RybCwgJm5pYy0+Y3NyLT5lZXByb21fY3RybF9sbyk7CisJCQlpb3dyaXRlOChjdHJsLCAmbmljLT5jc3ItPmVlcHJvbV9jdHJsX2xvKTsKIAkJCWUxMDBfd3JpdGVfZmx1c2gobmljKTsgdWRlbGF5KDQpOwogCi0JCQl3cml0ZWIoY3RybCB8IGVlc2ssICZuaWMtPmNzci0+ZWVwcm9tX2N0cmxfbG8pOworCQkJaW93cml0ZTgoY3RybCB8IGVlc2ssICZuaWMtPmNzci0+ZWVwcm9tX2N0cmxfbG8pOwogCQkJZTEwMF93cml0ZV9mbHVzaChuaWMpOyB1ZGVsYXkoNCk7CiAJCX0KIAkJLyogV2FpdCAxMCBtc2VjIGZvciBjbWQgdG8gY29tcGxldGUgKi8KIAkJbXNsZWVwKDEwKTsKIAogCQkvKiBDaGlwIGRlc2VsZWN0ICovCi0JCXdyaXRlYigwLCAmbmljLT5jc3ItPmVlcHJvbV9jdHJsX2xvKTsKKwkJaW93cml0ZTgoMCwgJm5pYy0+Y3NyLT5lZXByb21fY3RybF9sbyk7CiAJCWUxMDBfd3JpdGVfZmx1c2gobmljKTsgdWRlbGF5KDQpOwogCX0KIH07CkBAIC03MDksMjEgKzcwNSwyMSBAQAogCWNtZF9hZGRyX2RhdGEgPSAoKG9wX3JlYWQgPDwgKmFkZHJfbGVuKSB8IGFkZHIpIDw8IDE2OwogCiAJLyogQ2hpcCBzZWxlY3QgKi8KLQl3cml0ZWIoZWVjcyB8IGVlc2ssICZuaWMtPmNzci0+ZWVwcm9tX2N0cmxfbG8pOworCWlvd3JpdGU4KGVlY3MgfCBlZXNrLCAmbmljLT5jc3ItPmVlcHJvbV9jdHJsX2xvKTsKIAllMTAwX3dyaXRlX2ZsdXNoKG5pYyk7IHVkZWxheSg0KTsKIAogCS8qIEJpdC1iYW5nIHRvIHJlYWQgd29yZCBmcm9tIGVlcHJvbSAqLwogCWZvcihpID0gMzE7IGkgPj0gMDsgaS0tKSB7CiAJCWN0cmwgPSAoY21kX2FkZHJfZGF0YSAmICgxIDw8IGkpKSA/IGVlY3MgfCBlZWRpIDogZWVjczsKLQkJd3JpdGViKGN0cmwsICZuaWMtPmNzci0+ZWVwcm9tX2N0cmxfbG8pOworCQlpb3dyaXRlOChjdHJsLCAmbmljLT5jc3ItPmVlcHJvbV9jdHJsX2xvKTsKIAkJZTEwMF93cml0ZV9mbHVzaChuaWMpOyB1ZGVsYXkoNCk7CiAKLQkJd3JpdGViKGN0cmwgfCBlZXNrLCAmbmljLT5jc3ItPmVlcHJvbV9jdHJsX2xvKTsKKwkJaW93cml0ZTgoY3RybCB8IGVlc2ssICZuaWMtPmNzci0+ZWVwcm9tX2N0cmxfbG8pOwogCQllMTAwX3dyaXRlX2ZsdXNoKG5pYyk7IHVkZWxheSg0KTsKIAogCQkvKiBFZXByb20gZHJpdmVzIGEgZHVtbXkgemVybyB0byBFRURPIGFmdGVyIHJlY2VpdmluZwogCQkgKiBjb21wbGV0ZSBhZGRyZXNzLiAgVXNlIHRoaXMgdG8gYWRqdXN0IGFkZHJfbGVuLiAqLwotCQljdHJsID0gcmVhZGIoJm5pYy0+Y3NyLT5lZXByb21fY3RybF9sbyk7CisJCWN0cmwgPSBpb3JlYWQ4KCZuaWMtPmNzci0+ZWVwcm9tX2N0cmxfbG8pOwogCQlpZighKGN0cmwgJiBlZWRvKSAmJiBpID4gMTYpIHsKIAkJCSphZGRyX2xlbiAtPSAoaSAtIDE2KTsKIAkJCWkgPSAxNzsKQEAgLTczMyw3ICs3MjksNyBAQAogCX0KIAogCS8qIENoaXAgZGVzZWxlY3QgKi8KLQl3cml0ZWIoMCwgJm5pYy0+Y3NyLT5lZXByb21fY3RybF9sbyk7CisJaW93cml0ZTgoMCwgJm5pYy0+Y3NyLT5lZXByb21fY3RybF9sbyk7CiAJZTEwMF93cml0ZV9mbHVzaChuaWMpOyB1ZGVsYXkoNCk7CiAKIAlyZXR1cm4gbGUxNl90b19jcHUoZGF0YSk7CkBAIC04MDQsNyArODAwLDcgQEAKIAogCS8qIFByZXZpb3VzIGNvbW1hbmQgaXMgYWNjZXB0ZWQgd2hlbiBTQ0IgY2xlYXJzICovCiAJZm9yKGkgPSAwOyBpIDwgRTEwMF9XQUlUX1NDQl9USU1FT1VUOyBpKyspIHsKLQkJaWYobGlrZWx5KCFyZWFkYigmbmljLT5jc3ItPnNjYi5jbWRfbG8pKSkKKwkJaWYobGlrZWx5KCFpb3JlYWQ4KCZuaWMtPmNzci0+c2NiLmNtZF9sbykpKQogCQkJYnJlYWs7CiAJCWNwdV9yZWxheCgpOwogCQlpZih1bmxpa2VseShpID4gRTEwMF9XQUlUX1NDQl9GQVNUKSkKQEAgLTgxNiw4ICs4MTIsOCBAQAogCX0KIAogCWlmKHVubGlrZWx5KGNtZCAhPSBjdWNfcmVzdW1lKSkKLQkJd3JpdGVsKGRtYV9hZGRyLCAmbmljLT5jc3ItPnNjYi5nZW5fcHRyKTsKLQl3cml0ZWIoY21kLCAmbmljLT5jc3ItPnNjYi5jbWRfbG8pOworCQlpb3dyaXRlMzIoZG1hX2FkZHIsICZuaWMtPmNzci0+c2NiLmdlbl9wdHIpOworCWlvd3JpdGU4KGNtZCwgJm5pYy0+Y3NyLT5zY2IuY21kX2xvKTsKIAogZXJyX3VubG9jazoKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuaWMtPmNtZF9sb2NrLCBmbGFncyk7CkBAIC04OTUsNyArODkxLDcgQEAKIAkgKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmbmljLT5tZGlvX2xvY2ssIGZsYWdzKTsKIAlmb3IgKGkgPSAxMDA7IGk7IC0taSkgewotCQlpZiAocmVhZGwoJm5pYy0+Y3NyLT5tZGlfY3RybCkgJiBtZGlfcmVhZHkpCisJCWlmIChpb3JlYWQzMigmbmljLT5jc3ItPm1kaV9jdHJsKSAmIG1kaV9yZWFkeSkKIAkJCWJyZWFrOwogCQl1ZGVsYXkoMjApOwogCX0KQEAgLTkwNSwxMSArOTAxLDExIEBACiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5pYy0+bWRpb19sb2NrLCBmbGFncyk7CiAJCXJldHVybiAwOwkJLyogTm8gd2F5IHRvIGluZGljYXRlIHRpbWVvdXQgZXJyb3IgKi8KIAl9Ci0Jd3JpdGVsKChyZWcgPDwgMTYpIHwgKGFkZHIgPDwgMjEpIHwgZGlyIHwgZGF0YSwgJm5pYy0+Y3NyLT5tZGlfY3RybCk7CisJaW93cml0ZTMyKChyZWcgPDwgMTYpIHwgKGFkZHIgPDwgMjEpIHwgZGlyIHwgZGF0YSwgJm5pYy0+Y3NyLT5tZGlfY3RybCk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKIAkJdWRlbGF5KDIwKTsKLQkJaWYgKChkYXRhX291dCA9IHJlYWRsKCZuaWMtPmNzci0+bWRpX2N0cmwpKSAmIG1kaV9yZWFkeSkKKwkJaWYgKChkYXRhX291dCA9IGlvcmVhZDMyKCZuaWMtPmNzci0+bWRpX2N0cmwpKSAmIG1kaV9yZWFkeSkKIAkJCWJyZWFrOwogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuaWMtPm1kaW9fbG9jaywgZmxhZ3MpOwpAQCAtOTUxLDcgKzk0Nyw3IEBACiAJCSgobmljLT5tYWMgPj0gbWFjXzgyNTU4X0QxMDFfQTQpID8gY2JfY2lkIDogY2JfaSkpOwogCiAJLyogVGVtcGxhdGUgZm9yIGEgZnJlc2hseSBhbGxvY2F0ZWQgUkZEICovCi0JbmljLT5ibGFua19yZmQuY29tbWFuZCA9IGNwdV90b19sZTE2KGNiX2VsKTsKKwluaWMtPmJsYW5rX3JmZC5jb21tYW5kID0gY3B1X3RvX2xlMTYoY2JfZWwgJiBjYl9zKTsKIAluaWMtPmJsYW5rX3JmZC5yYmQgPSAweEZGRkZGRkZGOwogCW5pYy0+YmxhbmtfcmZkLnNpemUgPSBjcHVfdG9fbGUxNihWTEFOX0VUSF9GUkFNRV9MRU4pOwogCkBAIC0xMzE4LDcgKzEzMTQsNyBAQAogCX0KIAogCS8qIGFjayBhbnkgaW50ZXJ1cHRzLCBzb21ldGhpbmcgY291bGQgaGF2ZSBiZWVuIHNldCAqLwotCXdyaXRlYih+MCwgJm5pYy0+Y3NyLT5zY2Iuc3RhdF9hY2spOworCWlvd3JpdGU4KH4wLCAmbmljLT5jc3ItPnNjYi5zdGF0X2Fjayk7CiAKIAkvKiBpZiB0aGUgY29tbWFuZCBmYWlsZWQsIG9yIGlzIG5vdCBPSywgbm90aWZ5IGFuZCByZXR1cm4gKi8KIAlpZiAoIWNvdW50ZXIgfHwgIShjYi0+c3RhdHVzICYgY3B1X3RvX2xlMTYoY2Jfb2spKSkgewpAQCAtMTU4MCw3ICsxNTc2LDcgQEAKIAkgKiBhY2NpZGVudGFsbHksIGR1ZSB0byBoYXJkd2FyZSB0aGF0IHNoYXJlcyBhIHJlZ2lzdGVyIGJldHdlZW4gdGhlCiAJICogaW50ZXJydXB0IG1hc2sgYml0IGFuZCB0aGUgU1cgSW50ZXJydXB0IGdlbmVyYXRpb24gYml0ICovCiAJc3Bpbl9sb2NrX2lycSgmbmljLT5jbWRfbG9jayk7Ci0Jd3JpdGViKHJlYWRiKCZuaWMtPmNzci0+c2NiLmNtZF9oaSkgfCBpcnFfc3dfZ2VuLCZuaWMtPmNzci0+c2NiLmNtZF9oaSk7CisJaW93cml0ZTgoaW9yZWFkOCgmbmljLT5jc3ItPnNjYi5jbWRfaGkpIHwgaXJxX3N3X2dlbiwmbmljLT5jc3ItPnNjYi5jbWRfaGkpOwogCWUxMDBfd3JpdGVfZmx1c2gobmljKTsKIAlzcGluX3VubG9ja19pcnEoJm5pYy0+Y21kX2xvY2spOwogCkBAIC0xNzQ2LDE5ICsxNzQyLDExIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBlMTAwX3N0YXJ0X3JlY2VpdmVyKHN0cnVjdCBuaWMgKm5pYywgc3RydWN0IHJ4ICpyeCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBlMTAwX3N0YXJ0X3JlY2VpdmVyKHN0cnVjdCBuaWMgKm5pYykKIHsKLQlpZighbmljLT5yeHMpIHJldHVybjsKLQlpZihSVV9TVVNQRU5ERUQgIT0gbmljLT5ydV9ydW5uaW5nKSByZXR1cm47Ci0KLQkvKiBoYW5kbGUgaW5pdCB0aW1lIHN0YXJ0cyAqLwotCWlmKCFyeCkgcnggPSBuaWMtPnJ4czsKLQotCS8qIChSZSlzdGFydCBSVSBpZiBzdXNwZW5kZWQgb3IgaWRsZSBhbmQgUkZBIGlzIG5vbi1OVUxMICovCi0JaWYocngtPnNrYikgewotCQllMTAwX2V4ZWNfY21kKG5pYywgcnVjX3N0YXJ0LCByeC0+ZG1hX2FkZHIpOwotCQluaWMtPnJ1X3J1bm5pbmcgPSBSVV9SVU5OSU5HOwotCX0KKwkvKiBTdGFydCBpZiBSRkEgaXMgbm9uLU5VTEwgKi8KKwlpZihuaWMtPnJ4X3RvX2NsZWFuLT5za2IpCisJCWUxMDBfZXhlY19jbWQobmljLCBydWNfc3RhcnQsIG5pYy0+cnhfdG9fY2xlYW4tPmRtYV9hZGRyKTsKIH0KIAogI2RlZmluZSBSRkRfQlVGX0xFTiAoc2l6ZW9mKHN0cnVjdCByZmQpICsgVkxBTl9FVEhfRlJBTUVfTEVOKQpAQCAtMTc2OSw3ICsxNzU3LDcgQEAKIAogCS8qIEFsaWduLCBpbml0LCBhbmQgbWFwIHRoZSBSRkQuICovCiAJc2tiX3Jlc2VydmUocngtPnNrYiwgTkVUX0lQX0FMSUdOKTsKLQltZW1jcHkocngtPnNrYi0+ZGF0YSwgJm5pYy0+YmxhbmtfcmZkLCBzaXplb2Yoc3RydWN0IHJmZCkpOworCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhKHJ4LT5za2IsICZuaWMtPmJsYW5rX3JmZCwgc2l6ZW9mKHN0cnVjdCByZmQpKTsKIAlyeC0+ZG1hX2FkZHIgPSBwY2lfbWFwX3NpbmdsZShuaWMtPnBkZXYsIHJ4LT5za2ItPmRhdGEsCiAJCVJGRF9CVUZfTEVOLCBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOwogCkBAIC0xNzg3LDcgKzE3NzUsNyBAQAogCQlwdXRfdW5hbGlnbmVkKGNwdV90b19sZTMyKHJ4LT5kbWFfYWRkciksCiAJCQkodTMyICopJnByZXZfcmZkLT5saW5rKTsKIAkJd21iKCk7Ci0JCXByZXZfcmZkLT5jb21tYW5kICY9IH5jcHVfdG9fbGUxNihjYl9lbCk7CisJCXByZXZfcmZkLT5jb21tYW5kICY9IH5jcHVfdG9fbGUxNihjYl9lbCAmIGNiX3MpOwogCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UobmljLT5wZGV2LCByeC0+cHJldi0+ZG1hX2FkZHIsCiAJCQlzaXplb2Yoc3RydWN0IHJmZCksIFBDSV9ETUFfVE9ERVZJQ0UpOwogCX0KQEAgLTE4MjUsMTAgKzE4MTMsNiBAQAogCXBjaV91bm1hcF9zaW5nbGUobmljLT5wZGV2LCByeC0+ZG1hX2FkZHIsCiAJCVJGRF9CVUZfTEVOLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOwogCi0JLyogdGhpcyBhbGxvd3MgZm9yIGEgZmFzdCByZXN0YXJ0IHdpdGhvdXQgcmUtZW5hYmxpbmcgaW50ZXJydXB0cyAqLwotCWlmKGxlMTZfdG9fY3B1KHJmZC0+Y29tbWFuZCkgJiBjYl9lbCkKLQkJbmljLT5ydV9ydW5uaW5nID0gUlVfU1VTUEVOREVEOwotCiAJLyogUHVsbCBvZmYgdGhlIFJGRCBhbmQgcHV0IHRoZSBhY3R1YWwgZGF0YSAobWludXMgZXRoIGhkcikgKi8KIAlza2JfcmVzZXJ2ZShza2IsIHNpemVvZihzdHJ1Y3QgcmZkKSk7CiAJc2tiX3B1dChza2IsIGFjdHVhbF9zaXplKTsKQEAgLTE4NTksNDUgKzE4NDMsMTggQEAKIAl1bnNpZ25lZCBpbnQgd29ya190b19kbykKIHsKIAlzdHJ1Y3QgcnggKnJ4OwotCWludCByZXN0YXJ0X3JlcXVpcmVkID0gMDsKLQlzdHJ1Y3QgcnggKnJ4X3RvX3N0YXJ0ID0gTlVMTDsKLQotCS8qIGFyZSB3ZSBhbHJlYWR5IHJucj8gdGhlbiBwYXkgYXR0ZW50aW9uISEhIHRoaXMgZW5zdXJlcyB0aGF0Ci0JICogdGhlIHN0YXRlIG1hY2hpbmUgcHJvZ3Jlc3Npb24gbmV2ZXIgYWxsb3dzIGEgc3RhcnQgd2l0aCBhCi0JICogcGFydGlhbGx5IGNsZWFuZWQgbGlzdCwgYXZvaWRpbmcgYSByYWNlIGJldHdlZW4gaGFyZHdhcmUKLQkgKiBhbmQgcnhfdG9fY2xlYW4gd2hlbiBpbiBOQVBJIG1vZGUgKi8KLQlpZihSVV9TVVNQRU5ERUQgPT0gbmljLT5ydV9ydW5uaW5nKQotCQlyZXN0YXJ0X3JlcXVpcmVkID0gMTsKIAogCS8qIEluZGljYXRlIG5ld2x5IGFycml2ZWQgcGFja2V0cyAqLwogCWZvcihyeCA9IG5pYy0+cnhfdG9fY2xlYW47IHJ4LT5za2I7IHJ4ID0gbmljLT5yeF90b19jbGVhbiA9IHJ4LT5uZXh0KSB7Ci0JCWludCBlcnIgPSBlMTAwX3J4X2luZGljYXRlKG5pYywgcngsIHdvcmtfZG9uZSwgd29ya190b19kbyk7Ci0JCWlmKC1FQUdBSU4gPT0gZXJyKSB7Ci0JCQkvKiBoaXQgcXVvdGEgc28gaGF2ZSBtb3JlIHdvcmsgdG8gZG8sIHJlc3RhcnQgb25jZQotCQkJICogY2xlYW51cCBpcyBjb21wbGV0ZSAqLwotCQkJcmVzdGFydF9yZXF1aXJlZCA9IDA7Ci0JCQlicmVhazsKLQkJfSBlbHNlIGlmKC1FTk9EQVRBID09IGVycikKKwkJaWYoZTEwMF9yeF9pbmRpY2F0ZShuaWMsIHJ4LCB3b3JrX2RvbmUsIHdvcmtfdG9fZG8pKQogCQkJYnJlYWs7IC8qIE5vIG1vcmUgdG8gY2xlYW4gKi8KIAl9CiAKLQkvKiBzYXZlIG91ciBzdGFydGluZyBwb2ludCBhcyB0aGUgcGxhY2Ugd2UnbGwgcmVzdGFydCB0aGUgcmVjZWl2ZXIgKi8KLQlpZihyZXN0YXJ0X3JlcXVpcmVkKQotCQlyeF90b19zdGFydCA9IG5pYy0+cnhfdG9fY2xlYW47Ci0KIAkvKiBBbGxvYyBuZXcgc2ticyB0byByZWZpbGwgbGlzdCAqLwogCWZvcihyeCA9IG5pYy0+cnhfdG9fdXNlOyAhcngtPnNrYjsgcnggPSBuaWMtPnJ4X3RvX3VzZSA9IHJ4LT5uZXh0KSB7CiAJCWlmKHVubGlrZWx5KGUxMDBfcnhfYWxsb2Nfc2tiKG5pYywgcngpKSkKIAkJCWJyZWFrOyAvKiBCZXR0ZXIgbHVjayBuZXh0IHRpbWUgKHNlZSB3YXRjaGRvZykgKi8KIAl9Ci0KLQlpZihyZXN0YXJ0X3JlcXVpcmVkKSB7Ci0JCS8vIGFjayB0aGUgcm5yPwotCQl3cml0ZWIoc3RhdF9hY2tfcm5yLCAmbmljLT5jc3ItPnNjYi5zdGF0X2Fjayk7Ci0JCWUxMDBfc3RhcnRfcmVjZWl2ZXIobmljLCByeF90b19zdGFydCk7Ci0JCWlmKHdvcmtfZG9uZSkKLQkJCSgqd29ya19kb25lKSsrOwotCX0KIH0KIAogc3RhdGljIHZvaWQgZTEwMF9yeF9jbGVhbl9saXN0KHN0cnVjdCBuaWMgKm5pYykKQEAgLTE5MDUsOCArMTg2Miw2IEBACiAJc3RydWN0IHJ4ICpyeDsKIAl1bnNpZ25lZCBpbnQgaSwgY291bnQgPSBuaWMtPnBhcmFtcy5yZmRzLmNvdW50OwogCi0JbmljLT5ydV9ydW5uaW5nID0gUlVfVU5JTklUSUFMSVpFRDsKLQogCWlmKG5pYy0+cnhzKSB7CiAJCWZvcihyeCA9IG5pYy0+cnhzLCBpID0gMDsgaSA8IGNvdW50OyByeCsrLCBpKyspIHsKIAkJCWlmKHJ4LT5za2IpIHsKQEAgLTE5MjgsNyArMTg4Myw2IEBACiAJdW5zaWduZWQgaW50IGksIGNvdW50ID0gbmljLT5wYXJhbXMucmZkcy5jb3VudDsKIAogCW5pYy0+cnhfdG9fdXNlID0gbmljLT5yeF90b19jbGVhbiA9IE5VTEw7Ci0JbmljLT5ydV9ydW5uaW5nID0gUlVfVU5JTklUSUFMSVpFRDsKIAogCWlmKCEobmljLT5yeHMgPSBrY2FsbG9jKGNvdW50LCBzaXplb2Yoc3RydWN0IHJ4KSwgR0ZQX0FUT01JQykpKQogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTE5NDMsNyArMTg5Nyw2IEBACiAJfQogCiAJbmljLT5yeF90b191c2UgPSBuaWMtPnJ4X3RvX2NsZWFuID0gbmljLT5yeHM7Ci0JbmljLT5ydV9ydW5uaW5nID0gUlVfU1VTUEVOREVEOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xOTUyLDcgKzE5MDUsNyBAQAogewogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBkZXZfaWQ7CiAJc3RydWN0IG5pYyAqbmljID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQl1OCBzdGF0X2FjayA9IHJlYWRiKCZuaWMtPmNzci0+c2NiLnN0YXRfYWNrKTsKKwl1OCBzdGF0X2FjayA9IGlvcmVhZDgoJm5pYy0+Y3NyLT5zY2Iuc3RhdF9hY2spOwogCiAJRFBSSU5USyhJTlRSLCBERUJVRywgInN0YXRfYWNrID0gMHglMDJYXG4iLCBzdGF0X2Fjayk7CiAKQEAgLTE5NjEsMTEgKzE5MTQsNyBAQAogCQlyZXR1cm4gSVJRX05PTkU7CiAKIAkvKiBBY2sgaW50ZXJydXB0KHMpICovCi0Jd3JpdGViKHN0YXRfYWNrLCAmbmljLT5jc3ItPnNjYi5zdGF0X2Fjayk7Ci0KLQkvKiBXZSBoaXQgUmVjZWl2ZSBObyBSZXNvdXJjZSAoUk5SKTsgcmVzdGFydCBSVSBhZnRlciBjbGVhbmluZyAqLwotCWlmKHN0YXRfYWNrICYgc3RhdF9hY2tfcm5yKQotCQluaWMtPnJ1X3J1bm5pbmcgPSBSVV9TVVNQRU5ERUQ7CisJaW93cml0ZTgoc3RhdF9hY2ssICZuaWMtPmNzci0+c2NiLnN0YXRfYWNrKTsKIAogCWlmKGxpa2VseShuZXRpZl9yeF9zY2hlZHVsZV9wcmVwKG5ldGRldikpKSB7CiAJCWUxMDBfZGlzYWJsZV9pcnEobmljKTsKQEAgLTIwNTgsNyArMjAwNyw3IEBACiAJaWYoKGVyciA9IGUxMDBfaHdfaW5pdChuaWMpKSkKIAkJZ290byBlcnJfY2xlYW5fY2JzOwogCWUxMDBfc2V0X211bHRpY2FzdF9saXN0KG5pYy0+bmV0ZGV2KTsKLQllMTAwX3N0YXJ0X3JlY2VpdmVyKG5pYywgTlVMTCk7CisJZTEwMF9zdGFydF9yZWNlaXZlcihuaWMpOwogCW1vZF90aW1lcigmbmljLT53YXRjaGRvZywgamlmZmllcyk7CiAJaWYoKGVyciA9IHJlcXVlc3RfaXJxKG5pYy0+cGRldi0+aXJxLCBlMTAwX2ludHIsIElSUUZfU0hBUkVELAogCQluaWMtPm5ldGRldi0+bmFtZSwgbmljLT5uZXRkZXYpKSkKQEAgLTIxMDcsNyArMjA1Niw3IEBACiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IG5pYy0+bmV0ZGV2OwogCiAJRFBSSU5USyhUWF9FUlIsIERFQlVHLCAic2NiLnN0YXR1cz0weCUwMlhcbiIsCi0JCXJlYWRiKCZuaWMtPmNzci0+c2NiLnN0YXR1cykpOworCQlpb3JlYWQ4KCZuaWMtPmNzci0+c2NiLnN0YXR1cykpOwogCWUxMDBfZG93bihuZXRkZXZfcHJpdihuZXRkZXYpKTsKIAllMTAwX3VwKG5ldGRldl9wcml2KG5ldGRldikpOwogfQpAQCAtMjEzOSw3ICsyMDg4LDcgQEAKIAkJbWRpb193cml0ZShuaWMtPm5ldGRldiwgbmljLT5taWkucGh5X2lkLCBNSUlfQk1DUiwKIAkJCUJNQ1JfTE9PUEJBQ0spOwogCi0JZTEwMF9zdGFydF9yZWNlaXZlcihuaWMsIE5VTEwpOworCWUxMDBfc3RhcnRfcmVjZWl2ZXIobmljKTsKIAogCWlmKCEoc2tiID0gbmV0ZGV2X2FsbG9jX3NrYihuaWMtPm5ldGRldiwgRVRIX0RBVEFfTEVOKSkpIHsKIAkJZXJyID0gLUVOT01FTTsKQEAgLTIyMzAsOSArMjE3OSw5IEBACiAJaW50IGk7CiAKIAlyZWdzLT52ZXJzaW9uID0gKDEgPDwgMjQpIHwgbmljLT5yZXZfaWQ7Ci0JYnVmZlswXSA9IHJlYWRiKCZuaWMtPmNzci0+c2NiLmNtZF9oaSkgPDwgMjQgfAotCQlyZWFkYigmbmljLT5jc3ItPnNjYi5jbWRfbG8pIDw8IDE2IHwKLQkJcmVhZHcoJm5pYy0+Y3NyLT5zY2Iuc3RhdHVzKTsKKwlidWZmWzBdID0gaW9yZWFkOCgmbmljLT5jc3ItPnNjYi5jbWRfaGkpIDw8IDI0IHwKKwkJaW9yZWFkOCgmbmljLT5jc3ItPnNjYi5jbWRfbG8pIDw8IDE2IHwKKwkJaW9yZWFkMTYoJm5pYy0+Y3NyLT5zY2Iuc3RhdHVzKTsKIAlmb3IoaSA9IEUxMDBfUEhZX1JFR1M7IGkgPj0gMDsgaS0tKQogCQlidWZmWzEgKyBFMTAwX1BIWV9SRUdTIC0gaV0gPQogCQkJbWRpb19yZWFkKG5ldGRldiwgbmljLT5taWkucGh5X2lkLCBpKTsKQEAgLTI2MDQsNyArMjU1MywxMCBAQAogCVNFVF9NT0RVTEVfT1dORVIobmV0ZGV2KTsKIAlTRVRfTkVUREVWX0RFVihuZXRkZXYsICZwZGV2LT5kZXYpOwogCi0JbmljLT5jc3IgPSBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKSwgc2l6ZW9mKHN0cnVjdCBjc3IpKTsKKwlpZiAodXNlX2lvKQorCQlEUFJJTlRLKFBST0JFLCBJTkZPLCAidXNpbmcgaS9vIGFjY2VzcyBtb2RlXG4iKTsKKworCW5pYy0+Y3NyID0gcGNpX2lvbWFwKHBkZXYsICh1c2VfaW8gPyAxIDogMCksIHNpemVvZihzdHJ1Y3QgY3NyKSk7CiAJaWYoIW5pYy0+Y3NyKSB7CiAJCURQUklOVEsoUFJPQkUsIEVSUiwgIkNhbm5vdCBtYXAgZGV2aWNlIHJlZ2lzdGVycywgYWJvcnRpbmcuXG4iKTsKIAkJZXJyID0gLUVOT01FTTsKQEAgLTI2NTEsMTEgKzI2MDMsMTYgQEAKIAogCW1lbWNweShuZXRkZXYtPmRldl9hZGRyLCBuaWMtPmVlcHJvbSwgRVRIX0FMRU4pOwogCW1lbWNweShuZXRkZXYtPnBlcm1fYWRkciwgbmljLT5lZXByb20sIEVUSF9BTEVOKTsKLQlpZighaXNfdmFsaWRfZXRoZXJfYWRkcihuZXRkZXYtPnBlcm1fYWRkcikpIHsKLQkJRFBSSU5USyhQUk9CRSwgRVJSLCAiSW52YWxpZCBNQUMgYWRkcmVzcyBmcm9tICIKLQkJCSJFRVBST00sIGFib3J0aW5nLlxuIik7Ci0JCWVyciA9IC1FQUdBSU47Ci0JCWdvdG8gZXJyX291dF9mcmVlOworCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihuZXRkZXYtPnBlcm1fYWRkcikpIHsKKwkJaWYgKCFlZXByb21fYmFkX2NzdW1fYWxsb3cpIHsKKwkJCURQUklOVEsoUFJPQkUsIEVSUiwgIkludmFsaWQgTUFDIGFkZHJlc3MgZnJvbSAiCisJCQkgICAgICAgICJFRVBST00sIGFib3J0aW5nLlxuIik7CisJCQllcnIgPSAtRUFHQUlOOworCQkJZ290byBlcnJfb3V0X2ZyZWU7CisJCX0gZWxzZSB7CisJCQlEUFJJTlRLKFBST0JFLCBFUlIsICJJbnZhbGlkIE1BQyBhZGRyZXNzIGZyb20gRUVQUk9NLCAiCisJCQkgICAgICAgICJ5b3UgTVVTVCBjb25maWd1cmUgb25lLlxuIik7CisJCX0KIAl9CiAKIAkvKiBXb2wgbWFnaWMgcGFja2V0IGNhbiBiZSBlbmFibGVkIGZyb20gZWVwcm9tICovCkBAIC0yNjc2LDcgKzI2MzMsNyBAQAogCiAJRFBSSU5USyhQUk9CRSwgSU5GTywgImFkZHIgMHglbGx4LCBpcnEgJWQsICIKIAkJIk1BQyBhZGRyICUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYXG4iLAotCQkodW5zaWduZWQgbG9uZyBsb25nKXBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKSwgcGRldi0+aXJxLAorCQkodW5zaWduZWQgbG9uZyBsb25nKXBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCB1c2VfaW8gPyAxIDogMCksIHBkZXYtPmlycSwKIAkJbmV0ZGV2LT5kZXZfYWRkclswXSwgbmV0ZGV2LT5kZXZfYWRkclsxXSwgbmV0ZGV2LT5kZXZfYWRkclsyXSwKIAkJbmV0ZGV2LT5kZXZfYWRkclszXSwgbmV0ZGV2LT5kZXZfYWRkcls0XSwgbmV0ZGV2LT5kZXZfYWRkcls1XSk7CiAKQEAgLTI2ODUsNyArMjY0Miw3IEBACiBlcnJfb3V0X2ZyZWU6CiAJZTEwMF9mcmVlKG5pYyk7CiBlcnJfb3V0X2lvdW5tYXA6Ci0JaW91bm1hcChuaWMtPmNzcik7CisJcGNpX2lvdW5tYXAocGRldiwgbmljLT5jc3IpOwogZXJyX291dF9mcmVlX3JlczoKIAlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOwogZXJyX291dF9kaXNhYmxlX3BkZXY6CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMC5oIGIvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDAuaAppbmRleCBkZDRiNzI4Li5hOWVhNjdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMC5oCisrKyBiL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwLmgKQEAgLTE1NSw5ICsxNTUsNiBAQAogLyogTnVtYmVyIG9mIHBhY2tldCBzcGxpdCBkYXRhIGJ1ZmZlcnMgKG5vdCBpbmNsdWRpbmcgdGhlIGhlYWRlciBidWZmZXIpICovCiAjZGVmaW5lIFBTX1BBR0VfQlVGRkVSUyBNQVhfUFNfQlVGRkVSUy0xCiAKLS8qIG9ubHkgd29ya3MgZm9yIHNpemVzIHRoYXQgYXJlIHBvd2VycyBvZiAyICovCi0jZGVmaW5lIEUxMDAwX1JPVU5EVVAoaSwgc2l6ZSkgKChpKSA9ICgoKGkpICsgKHNpemUpIC0gMSkgJiB+KChzaXplKSAtIDEpKSkKLQogLyogd3JhcHBlciBhcm91bmQgYSBwb2ludGVyIHRvIGEgc29ja2V0IGJ1ZmZlciwKICAqIHNvIGEgRE1BIGhhbmRsZSBjYW4gYmUgc3RvcmVkIGFsb25nIHdpdGggdGhlIGJ1ZmZlciAqLwogc3RydWN0IGUxMDAwX2J1ZmZlciB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9ldGh0b29sLmMgYi9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9ldGh0b29sLmMKaW5kZXggNjc3Nzg4Ny4uYmIwODM3NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfZXRodG9vbC5jCisrKyBiL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX2V0aHRvb2wuYwpAQCAtNjU0LDE0ICs2NTQsMTEgQEAKIAllMTAwMF9tYWNfdHlwZSBtYWNfdHlwZSA9IGFkYXB0ZXItPmh3Lm1hY190eXBlOwogCXN0cnVjdCBlMTAwMF90eF9yaW5nICp0eGRyLCAqdHhfb2xkOwogCXN0cnVjdCBlMTAwMF9yeF9yaW5nICpyeGRyLCAqcnhfb2xkOwotCWludCBpLCBlcnIsIHR4X3Jpbmdfc2l6ZSwgcnhfcmluZ19zaXplOworCWludCBpLCBlcnI7CiAKIAlpZiAoKHJpbmctPnJ4X21pbmlfcGVuZGluZykgfHwgKHJpbmctPnJ4X2p1bWJvX3BlbmRpbmcpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXR4X3Jpbmdfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZTEwMDBfdHhfcmluZykgKiBhZGFwdGVyLT5udW1fdHhfcXVldWVzOwotCXJ4X3Jpbmdfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZTEwMDBfcnhfcmluZykgKiBhZGFwdGVyLT5udW1fcnhfcXVldWVzOwotCiAJd2hpbGUgKHRlc3RfYW5kX3NldF9iaXQoX19FMTAwMF9SRVNFVFRJTkcsICZhZGFwdGVyLT5mbGFncykpCiAJCW1zbGVlcCgxKTsKIApAQCAtNjcyLDExICs2NjksMTEgQEAKIAlyeF9vbGQgPSBhZGFwdGVyLT5yeF9yaW5nOwogCiAJZXJyID0gLUVOT01FTTsKLQl0eGRyID0ga3phbGxvYyh0eF9yaW5nX3NpemUsIEdGUF9LRVJORUwpOworCXR4ZHIgPSBrY2FsbG9jKGFkYXB0ZXItPm51bV90eF9xdWV1ZXMsIHNpemVvZihzdHJ1Y3QgZTEwMDBfdHhfcmluZyksIEdGUF9LRVJORUwpOwogCWlmICghdHhkcikKIAkJZ290byBlcnJfYWxsb2NfdHg7CiAKLQlyeGRyID0ga3phbGxvYyhyeF9yaW5nX3NpemUsIEdGUF9LRVJORUwpOworCXJ4ZHIgPSBrY2FsbG9jKGFkYXB0ZXItPm51bV9yeF9xdWV1ZXMsIHNpemVvZihzdHJ1Y3QgZTEwMDBfcnhfcmluZyksIEdGUF9LRVJORUwpOwogCWlmICghcnhkcikKIAkJZ290byBlcnJfYWxsb2Nfcng7CiAKQEAgLTY4NiwxMiArNjgzLDEyIEBACiAJcnhkci0+Y291bnQgPSBtYXgocmluZy0+cnhfcGVuZGluZywodWludDMyX3QpRTEwMDBfTUlOX1JYRCk7CiAJcnhkci0+Y291bnQgPSBtaW4ocnhkci0+Y291bnQsKHVpbnQzMl90KShtYWNfdHlwZSA8IGUxMDAwXzgyNTQ0ID8KIAkJRTEwMDBfTUFYX1JYRCA6IEUxMDAwX01BWF84MjU0NF9SWEQpKTsKLQlFMTAwMF9ST1VORFVQKHJ4ZHItPmNvdW50LCBSRVFfUlhfREVTQ1JJUFRPUl9NVUxUSVBMRSk7CisJcnhkci0+Y291bnQgPSBBTElHTihyeGRyLT5jb3VudCwgUkVRX1JYX0RFU0NSSVBUT1JfTVVMVElQTEUpOwogCiAJdHhkci0+Y291bnQgPSBtYXgocmluZy0+dHhfcGVuZGluZywodWludDMyX3QpRTEwMDBfTUlOX1RYRCk7CiAJdHhkci0+Y291bnQgPSBtaW4odHhkci0+Y291bnQsKHVpbnQzMl90KShtYWNfdHlwZSA8IGUxMDAwXzgyNTQ0ID8KIAkJRTEwMDBfTUFYX1RYRCA6IEUxMDAwX01BWF84MjU0NF9UWEQpKTsKLQlFMTAwMF9ST1VORFVQKHR4ZHItPmNvdW50LCBSRVFfVFhfREVTQ1JJUFRPUl9NVUxUSVBMRSk7CisJdHhkci0+Y291bnQgPSBBTElHTih0eGRyLT5jb3VudCwgUkVRX1RYX0RFU0NSSVBUT1JfTVVMVElQTEUpOwogCiAJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPm51bV90eF9xdWV1ZXM7IGkrKykKIAkJdHhkcltpXS5jb3VudCA9IHR4ZHItPmNvdW50OwpAQCAtNzQyLDcgKzczOSw3IEBACiAJdWludDMyX3QgcGF0LCB2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAJdWludDMyX3QgdGVzdFtdID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAJCXsweDVBNUE1QTVBLCAweEE1QTVBNUE1LCAweDAwMDAwMDAwLCAweEZGRkZGRkZGfTsgICAgICAgICAgICAgIFwKLQlmb3IgKHBhdCA9IDA7IHBhdCA8IHNpemVvZih0ZXN0KS9zaXplb2YodGVzdFswXSk7IHBhdCsrKSB7ICAgICAgICAgICAgICBcCisJZm9yIChwYXQgPSAwOyBwYXQgPCBBUlJBWV9TSVpFKHRlc3QpOyBwYXQrKykgeyAgICAgICAgICAgICAgXAogCQlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBSLCAodGVzdFtwYXRdICYgVykpOyAgICAgICAgICAgICBcCiAJCXZhbHVlID0gRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBSKTsgICAgICAgICAgICAgICAgICAgICAgIFwKIAkJaWYgKHZhbHVlICE9ICh0ZXN0W3BhdF0gJiBXICYgTSkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTEwNTMsMjMgKzEwNTAsMjQgQEAKIAlzdHJ1Y3QgZTEwMDBfcnhfcmluZyAqcnhkciA9ICZhZGFwdGVyLT50ZXN0X3J4X3Jpbmc7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBhZGFwdGVyLT5wZGV2OwogCXVpbnQzMl90IHJjdGw7Ci0JaW50IHNpemUsIGksIHJldF92YWw7CisJaW50IGksIHJldF92YWw7CiAKIAkvKiBTZXR1cCBUeCBkZXNjcmlwdG9yIHJpbmcgYW5kIFR4IGJ1ZmZlcnMgKi8KIAogCWlmICghdHhkci0+Y291bnQpCiAJCXR4ZHItPmNvdW50ID0gRTEwMDBfREVGQVVMVF9UWEQ7CiAKLQlzaXplID0gdHhkci0+Y291bnQgKiBzaXplb2Yoc3RydWN0IGUxMDAwX2J1ZmZlcik7Ci0JaWYgKCEodHhkci0+YnVmZmVyX2luZm8gPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpKSkgeworCWlmICghKHR4ZHItPmJ1ZmZlcl9pbmZvID0ga2NhbGxvYyh0eGRyLT5jb3VudCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBlMTAwMF9idWZmZXIpLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgIEdGUF9LRVJORUwpKSkgewogCQlyZXRfdmFsID0gMTsKIAkJZ290byBlcnJfbm9tZW07CiAJfQotCW1lbXNldCh0eGRyLT5idWZmZXJfaW5mbywgMCwgc2l6ZSk7CiAKIAl0eGRyLT5zaXplID0gdHhkci0+Y291bnQgKiBzaXplb2Yoc3RydWN0IGUxMDAwX3R4X2Rlc2MpOwotCUUxMDAwX1JPVU5EVVAodHhkci0+c2l6ZSwgNDA5Nik7Ci0JaWYgKCEodHhkci0+ZGVzYyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsIHR4ZHItPnNpemUsICZ0eGRyLT5kbWEpKSkgeworCXR4ZHItPnNpemUgPSBBTElHTih0eGRyLT5zaXplLCA0MDk2KTsKKwlpZiAoISh0eGRyLT5kZXNjID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwgdHhkci0+c2l6ZSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnR4ZHItPmRtYSkpKSB7CiAJCXJldF92YWwgPSAyOwogCQlnb3RvIGVycl9ub21lbTsKIAl9CkBAIC0xMTE2LDEyICsxMTE0LDEyIEBACiAJaWYgKCFyeGRyLT5jb3VudCkKIAkJcnhkci0+Y291bnQgPSBFMTAwMF9ERUZBVUxUX1JYRDsKIAotCXNpemUgPSByeGRyLT5jb3VudCAqIHNpemVvZihzdHJ1Y3QgZTEwMDBfYnVmZmVyKTsKLQlpZiAoIShyeGRyLT5idWZmZXJfaW5mbyA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCkpKSB7CisJaWYgKCEocnhkci0+YnVmZmVyX2luZm8gPSBrY2FsbG9jKHJ4ZHItPmNvdW50LAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IGUxMDAwX2J1ZmZlciksCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdGUF9LRVJORUwpKSkgewogCQlyZXRfdmFsID0gNDsKIAkJZ290byBlcnJfbm9tZW07CiAJfQotCW1lbXNldChyeGRyLT5idWZmZXJfaW5mbywgMCwgc2l6ZSk7CiAKIAlyeGRyLT5zaXplID0gcnhkci0+Y291bnQgKiBzaXplb2Yoc3RydWN0IGUxMDAwX3J4X2Rlc2MpOwogCWlmICghKHJ4ZHItPmRlc2MgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LCByeGRyLT5zaXplLCAmcnhkci0+ZG1hKSkpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX21haW4uYyBiL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX21haW4uYwppbmRleCBiMjhhOTE1Li4zYTAzYTc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfbWFpbi5jCkBAIC00MDksMjUgKzQwOSwyMSBAQAogewogCXVpbnQzMl90IGN0cmxfZXh0OwogCXVpbnQzMl90IHN3c207Ci0JdWludDMyX3QgZXh0Y25mOwogCiAJLyogTGV0IGZpcm13YXJlIHRha2VuIG92ZXIgY29udHJvbCBvZiBoL3cgKi8KIAlzd2l0Y2ggKGFkYXB0ZXItPmh3Lm1hY190eXBlKSB7Ci0JY2FzZSBlMTAwMF84MjU3MToKLQljYXNlIGUxMDAwXzgyNTcyOgotCWNhc2UgZTEwMDBfODAwMDNlczJsYW46Ci0JCWN0cmxfZXh0ID0gRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBDVFJMX0VYVCk7Ci0JCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIENUUkxfRVhULAotCQkJCWN0cmxfZXh0ICYgfkUxMDAwX0NUUkxfRVhUX0RSVl9MT0FEKTsKLQkJYnJlYWs7CiAJY2FzZSBlMTAwMF84MjU3MzoKIAkJc3dzbSA9IEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgU1dTTSk7CiAJCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFNXU00sCiAJCQkJc3dzbSAmIH5FMTAwMF9TV1NNX0RSVl9MT0FEKTsKKwkJYnJlYWs7CisJY2FzZSBlMTAwMF84MjU3MToKKwljYXNlIGUxMDAwXzgyNTcyOgorCWNhc2UgZTEwMDBfODAwMDNlczJsYW46CiAJY2FzZSBlMTAwMF9pY2g4bGFuOgotCQlleHRjbmYgPSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIENUUkxfRVhUKTsKKwkJY3RybF9leHQgPSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIENUUkxfRVhUKTsKIAkJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgQ1RSTF9FWFQsCi0JCQkJZXh0Y25mICYgfkUxMDAwX0NUUkxfRVhUX0RSVl9MT0FEKTsKKwkJCQljdHJsX2V4dCAmIH5FMTAwMF9DVFJMX0VYVF9EUlZfTE9BRCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWJyZWFrOwpAQCAtNDUwLDI2ICs0NDYsMjEgQEAKIHsKIAl1aW50MzJfdCBjdHJsX2V4dDsKIAl1aW50MzJfdCBzd3NtOwotCXVpbnQzMl90IGV4dGNuZjsKIAogCS8qIExldCBmaXJtd2FyZSBrbm93IHRoZSBkcml2ZXIgaGFzIHRha2VuIG92ZXIgKi8KIAlzd2l0Y2ggKGFkYXB0ZXItPmh3Lm1hY190eXBlKSB7Ci0JY2FzZSBlMTAwMF84MjU3MToKLQljYXNlIGUxMDAwXzgyNTcyOgotCWNhc2UgZTEwMDBfODAwMDNlczJsYW46Ci0JCWN0cmxfZXh0ID0gRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBDVFJMX0VYVCk7Ci0JCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIENUUkxfRVhULAotCQkJCWN0cmxfZXh0IHwgRTEwMDBfQ1RSTF9FWFRfRFJWX0xPQUQpOwotCQlicmVhazsKIAljYXNlIGUxMDAwXzgyNTczOgogCQlzd3NtID0gRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBTV1NNKTsKIAkJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgU1dTTSwKIAkJCQlzd3NtIHwgRTEwMDBfU1dTTV9EUlZfTE9BRCk7CiAJCWJyZWFrOworCWNhc2UgZTEwMDBfODI1NzE6CisJY2FzZSBlMTAwMF84MjU3MjoKKwljYXNlIGUxMDAwXzgwMDAzZXMybGFuOgogCWNhc2UgZTEwMDBfaWNoOGxhbjoKLQkJZXh0Y25mID0gRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBFWFRDTkZfQ1RSTCk7Ci0JCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIEVYVENORl9DVFJMLAotCQkJCWV4dGNuZiB8IEUxMDAwX0VYVENORl9DVFJMX1NXRkxBRyk7CisJCWN0cmxfZXh0ID0gRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBDVFJMX0VYVCk7CisJCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIENUUkxfRVhULAorCQkJCWN0cmxfZXh0IHwgRTEwMDBfQ1RSTF9FWFRfRFJWX0xPQUQpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlicmVhazsKQEAgLTUyMiwxNCArNTEzLDE1IEBACiAJfQogfQogCi1pbnQKLWUxMDAwX3VwKHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyKQorLyoqCisgKiBlMTAwMF9jb25maWd1cmUgLSBjb25maWd1cmUgdGhlIGhhcmR3YXJlIGZvciBSWCBhbmQgVFgKKyAqIEBhZGFwdGVyID0gcHJpdmF0ZSBib2FyZCBzdHJ1Y3R1cmUKKyAqKi8KK3N0YXRpYyB2b2lkIGUxMDAwX2NvbmZpZ3VyZShzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlcikKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OwogCWludCBpOwogCi0JLyogaGFyZHdhcmUgaGFzIGJlZW4gcmVzZXQsIHdlIG5lZWQgdG8gcmVsb2FkIHNvbWUgdGhpbmdzICovCi0KIAllMTAwMF9zZXRfbXVsdGkobmV0ZGV2KTsKIAogCWUxMDAwX3Jlc3RvcmVfdmxhbihhZGFwdGVyKTsKQEAgLTU0OCwxNCArNTQwLDIwIEBACiAJfQogCiAJYWRhcHRlci0+dHhfcXVldWVfbGVuID0gbmV0ZGV2LT50eF9xdWV1ZV9sZW47Cit9CiAKLSNpZmRlZiBDT05GSUdfRTEwMDBfTkFQSQotCW5ldGlmX3BvbGxfZW5hYmxlKG5ldGRldik7Ci0jZW5kaWYKLQllMTAwMF9pcnFfZW5hYmxlKGFkYXB0ZXIpOworaW50IGUxMDAwX3VwKHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyKQoreworCS8qIGhhcmR3YXJlIGhhcyBiZWVuIHJlc2V0LCB3ZSBuZWVkIHRvIHJlbG9hZCBzb21lIHRoaW5ncyAqLworCWUxMDAwX2NvbmZpZ3VyZShhZGFwdGVyKTsKIAogCWNsZWFyX2JpdChfX0UxMDAwX0RPV04sICZhZGFwdGVyLT5mbGFncyk7CiAKKyNpZmRlZiBDT05GSUdfRTEwMDBfTkFQSQorCW5ldGlmX3BvbGxfZW5hYmxlKGFkYXB0ZXItPm5ldGRldik7CisjZW5kaWYKKwllMTAwMF9pcnFfZW5hYmxlKGFkYXB0ZXIpOworCiAJLyogZmlyZSBhIGxpbmsgY2hhbmdlIGludGVycnVwdCB0byBzdGFydCB0aGUgd2F0Y2hkb2cgKi8KIAlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBJQ1MsIEUxMDAwX0lDU19MU0MpOwogCXJldHVybiAwOwpAQCAtNjQwLDE1ICs2MzgsMTUgQEAKIAkgKiByZXNjaGVkdWxlIG91ciB3YXRjaGRvZyB0aW1lciAqLwogCXNldF9iaXQoX19FMTAwMF9ET1dOLCAmYWRhcHRlci0+ZmxhZ3MpOwogCisjaWZkZWYgQ09ORklHX0UxMDAwX05BUEkKKwluZXRpZl9wb2xsX2Rpc2FibGUobmV0ZGV2KTsKKyNlbmRpZgogCWUxMDAwX2lycV9kaXNhYmxlKGFkYXB0ZXIpOwogCiAJZGVsX3RpbWVyX3N5bmMoJmFkYXB0ZXItPnR4X2ZpZm9fc3RhbGxfdGltZXIpOwogCWRlbF90aW1lcl9zeW5jKCZhZGFwdGVyLT53YXRjaGRvZ190aW1lcik7CiAJZGVsX3RpbWVyX3N5bmMoJmFkYXB0ZXItPnBoeV9pbmZvX3RpbWVyKTsKIAotI2lmZGVmIENPTkZJR19FMTAwMF9OQVBJCi0JbmV0aWZfcG9sbF9kaXNhYmxlKG5ldGRldik7Ci0jZW5kaWYKIAluZXRkZXYtPnR4X3F1ZXVlX2xlbiA9IGFkYXB0ZXItPnR4X3F1ZXVlX2xlbjsKIAlhZGFwdGVyLT5saW5rX3NwZWVkID0gMDsKIAlhZGFwdGVyLT5saW5rX2R1cGxleCA9IDA7CkBAIC03NTAsOSArNzQ4LDkgQEAKIAkJICAgICAgICAgICAgICAgVkxBTl9UQUdfU0laRTsKIAkJbWluX3R4X3NwYWNlID0gbWluX3J4X3NwYWNlOwogCQltaW5fdHhfc3BhY2UgKj0gMjsKLQkJRTEwMDBfUk9VTkRVUChtaW5fdHhfc3BhY2UsIDEwMjQpOworCQltaW5fdHhfc3BhY2UgPSBBTElHTihtaW5fdHhfc3BhY2UsIDEwMjQpOwogCQltaW5fdHhfc3BhY2UgPj49IDEwOwotCQlFMTAwMF9ST1VORFVQKG1pbl9yeF9zcGFjZSwgMTAyNCk7CisJCW1pbl9yeF9zcGFjZSA9IEFMSUdOKG1pbl9yeF9zcGFjZSwgMTAyNCk7CiAJCW1pbl9yeF9zcGFjZSA+Pj0gMTA7CiAKIAkJLyogSWYgY3VycmVudCBUeCBhbGxvY2F0aW9uIGlzIGxlc3MgdGhhbiB0aGUgbWluIFR4IEZJRk8gc2l6ZSwKQEAgLTEzNTYsMzEgKzEzNTQsMjcgQEAKIHN0YXRpYyBpbnQgX19kZXZpbml0CiBlMTAwMF9hbGxvY19xdWV1ZXMoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7Ci0JaW50IHNpemU7Ci0KLQlzaXplID0gc2l6ZW9mKHN0cnVjdCBlMTAwMF90eF9yaW5nKSAqIGFkYXB0ZXItPm51bV90eF9xdWV1ZXM7Ci0JYWRhcHRlci0+dHhfcmluZyA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJYWRhcHRlci0+dHhfcmluZyA9IGtjYWxsb2MoYWRhcHRlci0+bnVtX3R4X3F1ZXVlcywKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IGUxMDAwX3R4X3JpbmcpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWFkYXB0ZXItPnR4X3JpbmcpCiAJCXJldHVybiAtRU5PTUVNOwotCW1lbXNldChhZGFwdGVyLT50eF9yaW5nLCAwLCBzaXplKTsKIAotCXNpemUgPSBzaXplb2Yoc3RydWN0IGUxMDAwX3J4X3JpbmcpICogYWRhcHRlci0+bnVtX3J4X3F1ZXVlczsKLQlhZGFwdGVyLT5yeF9yaW5nID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwlhZGFwdGVyLT5yeF9yaW5nID0ga2NhbGxvYyhhZGFwdGVyLT5udW1fcnhfcXVldWVzLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgZTEwMDBfcnhfcmluZyksIEdGUF9LRVJORUwpOwogCWlmICghYWRhcHRlci0+cnhfcmluZykgewogCQlrZnJlZShhZGFwdGVyLT50eF9yaW5nKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQotCW1lbXNldChhZGFwdGVyLT5yeF9yaW5nLCAwLCBzaXplKTsKIAogI2lmZGVmIENPTkZJR19FMTAwMF9OQVBJCi0Jc2l6ZSA9IHNpemVvZihzdHJ1Y3QgbmV0X2RldmljZSkgKiBhZGFwdGVyLT5udW1fcnhfcXVldWVzOwotCWFkYXB0ZXItPnBvbGxpbmdfbmV0ZGV2ID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwlhZGFwdGVyLT5wb2xsaW5nX25ldGRldiA9IGtjYWxsb2MoYWRhcHRlci0+bnVtX3J4X3F1ZXVlcywKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBuZXRfZGV2aWNlKSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0ZQX0tFUk5FTCk7CiAJaWYgKCFhZGFwdGVyLT5wb2xsaW5nX25ldGRldikgewogCQlrZnJlZShhZGFwdGVyLT50eF9yaW5nKTsKIAkJa2ZyZWUoYWRhcHRlci0+cnhfcmluZyk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KLQltZW1zZXQoYWRhcHRlci0+cG9sbGluZ19uZXRkZXYsIDAsIHNpemUpOwogI2VuZGlmCiAKIAlyZXR1cm4gRTEwMDBfU1VDQ0VTUzsKQEAgLTE0MTAsMjEgKzE0MDQsMTcgQEAKIAkJcmV0dXJuIC1FQlVTWTsKIAogCS8qIGFsbG9jYXRlIHRyYW5zbWl0IGRlc2NyaXB0b3JzICovCi0JaWYgKChlcnIgPSBlMTAwMF9zZXR1cF9hbGxfdHhfcmVzb3VyY2VzKGFkYXB0ZXIpKSkKKwllcnIgPSBlMTAwMF9zZXR1cF9hbGxfdHhfcmVzb3VyY2VzKGFkYXB0ZXIpOworCWlmIChlcnIpCiAJCWdvdG8gZXJyX3NldHVwX3R4OwogCiAJLyogYWxsb2NhdGUgcmVjZWl2ZSBkZXNjcmlwdG9ycyAqLwotCWlmICgoZXJyID0gZTEwMDBfc2V0dXBfYWxsX3J4X3Jlc291cmNlcyhhZGFwdGVyKSkpCi0JCWdvdG8gZXJyX3NldHVwX3J4OwotCi0JZXJyID0gZTEwMDBfcmVxdWVzdF9pcnEoYWRhcHRlcik7CisJZXJyID0gZTEwMDBfc2V0dXBfYWxsX3J4X3Jlc291cmNlcyhhZGFwdGVyKTsKIAlpZiAoZXJyKQotCQlnb3RvIGVycl9yZXFfaXJxOworCQlnb3RvIGVycl9zZXR1cF9yeDsKIAogCWUxMDAwX3Bvd2VyX3VwX3BoeShhZGFwdGVyKTsKIAotCWlmICgoZXJyID0gZTEwMDBfdXAoYWRhcHRlcikpKQotCQlnb3RvIGVycl91cDsKIAlhZGFwdGVyLT5tbmdfdmxhbl9pZCA9IEUxMDAwX01OR19WTEFOX05PTkU7CiAJaWYgKChhZGFwdGVyLT5ody5tbmdfY29va2llLnN0YXR1cyAmCiAJCQkgIEUxMDAwX01OR19ESENQX0NPT0tJRV9TVEFUVVNfVkxBTl9TVVBQT1JUKSkgewpAQCAtMTQzNywxMiArMTQyNywzMyBAQAogCSAgICBlMTAwMF9jaGVja19tbmdfbW9kZSgmYWRhcHRlci0+aHcpKQogCQllMTAwMF9nZXRfaHdfY29udHJvbChhZGFwdGVyKTsKIAorCS8qIGJlZm9yZSB3ZSBhbGxvY2F0ZSBhbiBpbnRlcnJ1cHQsIHdlIG11c3QgYmUgcmVhZHkgdG8gaGFuZGxlIGl0LgorCSAqIFNldHRpbmcgREVCVUdfU0hJUlEgaW4gdGhlIGtlcm5lbCBtYWtlcyBpdCBmaXJlIGFuIGludGVycnVwdAorCSAqIGFzIHNvb24gYXMgd2UgY2FsbCBwY2lfcmVxdWVzdF9pcnEsIHNvIHdlIGhhdmUgdG8gc2V0dXAgb3VyCisJICogY2xlYW5fcnggaGFuZGxlciBiZWZvcmUgd2UgZG8gc28uICAqLworCWUxMDAwX2NvbmZpZ3VyZShhZGFwdGVyKTsKKworCWVyciA9IGUxMDAwX3JlcXVlc3RfaXJxKGFkYXB0ZXIpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX3JlcV9pcnE7CisKKwkvKiBGcm9tIGhlcmUgb24gdGhlIGNvZGUgaXMgdGhlIHNhbWUgYXMgZTEwMDBfdXAoKSAqLworCWNsZWFyX2JpdChfX0UxMDAwX0RPV04sICZhZGFwdGVyLT5mbGFncyk7CisKKyNpZmRlZiBDT05GSUdfRTEwMDBfTkFQSQorCW5ldGlmX3BvbGxfZW5hYmxlKG5ldGRldik7CisjZW5kaWYKKworCWUxMDAwX2lycV9lbmFibGUoYWRhcHRlcik7CisKKwkvKiBmaXJlIGEgbGluayBzdGF0dXMgY2hhbmdlIGludGVycnVwdCB0byBzdGFydCB0aGUgd2F0Y2hkb2cgKi8KKwlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBJQ1MsIEUxMDAwX0lDU19MU0MpOworCiAJcmV0dXJuIEUxMDAwX1NVQ0NFU1M7CiAKLWVycl91cDoKLQllMTAwMF9wb3dlcl9kb3duX3BoeShhZGFwdGVyKTsKLQllMTAwMF9mcmVlX2lycShhZGFwdGVyKTsKIGVycl9yZXFfaXJxOgorCWUxMDAwX3JlbGVhc2VfaHdfY29udHJvbChhZGFwdGVyKTsKKwllMTAwMF9wb3dlcl9kb3duX3BoeShhZGFwdGVyKTsKIAllMTAwMF9mcmVlX2FsbF9yeF9yZXNvdXJjZXMoYWRhcHRlcik7CiBlcnJfc2V0dXBfcng6CiAJZTEwMDBfZnJlZV9hbGxfdHhfcmVzb3VyY2VzKGFkYXB0ZXIpOwpAQCAtMTU0NSw3ICsxNTU2LDcgQEAKIAkvKiByb3VuZCB1cCB0byBuZWFyZXN0IDRLICovCiAKIAl0eGRyLT5zaXplID0gdHhkci0+Y291bnQgKiBzaXplb2Yoc3RydWN0IGUxMDAwX3R4X2Rlc2MpOwotCUUxMDAwX1JPVU5EVVAodHhkci0+c2l6ZSwgNDA5Nik7CisJdHhkci0+c2l6ZSA9IEFMSUdOKHR4ZHItPnNpemUsIDQwOTYpOwogCiAJdHhkci0+ZGVzYyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsIHR4ZHItPnNpemUsICZ0eGRyLT5kbWEpOwogCWlmICghdHhkci0+ZGVzYykgewpAQCAtMTc1OSwxOCArMTc3MCwxOCBAQAogCX0KIAltZW1zZXQocnhkci0+YnVmZmVyX2luZm8sIDAsIHNpemUpOwogCi0Jc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZTEwMDBfcHNfcGFnZSkgKiByeGRyLT5jb3VudDsKLQlyeGRyLT5wc19wYWdlID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwlyeGRyLT5wc19wYWdlID0ga2NhbGxvYyhyeGRyLT5jb3VudCwgc2l6ZW9mKHN0cnVjdCBlMTAwMF9wc19wYWdlKSwKKwkgICAgICAgICAgICAgICAgICAgICAgICBHRlBfS0VSTkVMKTsKIAlpZiAoIXJ4ZHItPnBzX3BhZ2UpIHsKIAkJdmZyZWUocnhkci0+YnVmZmVyX2luZm8pOwogCQlEUFJJTlRLKFBST0JFLCBFUlIsCiAJCSJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgcmVjZWl2ZSBkZXNjcmlwdG9yIHJpbmdcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0JbWVtc2V0KHJ4ZHItPnBzX3BhZ2UsIDAsIHNpemUpOwogCi0Jc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZTEwMDBfcHNfcGFnZV9kbWEpICogcnhkci0+Y291bnQ7Ci0Jcnhkci0+cHNfcGFnZV9kbWEgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCXJ4ZHItPnBzX3BhZ2VfZG1hID0ga2NhbGxvYyhyeGRyLT5jb3VudCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBlMTAwMF9wc19wYWdlX2RtYSksCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdGUF9LRVJORUwpOwogCWlmICghcnhkci0+cHNfcGFnZV9kbWEpIHsKIAkJdmZyZWUocnhkci0+YnVmZmVyX2luZm8pOwogCQlrZnJlZShyeGRyLT5wc19wYWdlKTsKQEAgLTE3NzgsNyArMTc4OSw2IEBACiAJCSJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgcmVjZWl2ZSBkZXNjcmlwdG9yIHJpbmdcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0JbWVtc2V0KHJ4ZHItPnBzX3BhZ2VfZG1hLCAwLCBzaXplKTsKIAogCWlmIChhZGFwdGVyLT5ody5tYWNfdHlwZSA8PSBlMTAwMF84MjU0N19yZXZfMikKIAkJZGVzY19sZW4gPSBzaXplb2Yoc3RydWN0IGUxMDAwX3J4X2Rlc2MpOwpAQCAtMTc4OCw3ICsxNzk4LDcgQEAKIAkvKiBSb3VuZCB1cCB0byBuZWFyZXN0IDRLICovCiAKIAlyeGRyLT5zaXplID0gcnhkci0+Y291bnQgKiBkZXNjX2xlbjsKLQlFMTAwMF9ST1VORFVQKHJ4ZHItPnNpemUsIDQwOTYpOworCXJ4ZHItPnNpemUgPSBBTElHTihyeGRyLT5zaXplLCA0MDk2KTsKIAogCXJ4ZHItPmRlc2MgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LCByeGRyLT5zaXplLCAmcnhkci0+ZG1hKTsKIApAQCAtMjY1Miw3ICsyNjYyLDcgQEAKIAogCQkJbmV0aWZfY2Fycmllcl9vbihuZXRkZXYpOwogCQkJbmV0aWZfd2FrZV9xdWV1ZShuZXRkZXYpOwotCQkJbW9kX3RpbWVyKCZhZGFwdGVyLT5waHlfaW5mb190aW1lciwgamlmZmllcyArIDIgKiBIWik7CisJCQltb2RfdGltZXIoJmFkYXB0ZXItPnBoeV9pbmZvX3RpbWVyLCByb3VuZF9qaWZmaWVzKGppZmZpZXMgKyAyICogSFopKTsKIAkJCWFkYXB0ZXItPnNtYXJ0c3BlZWQgPSAwOwogCQl9IGVsc2UgewogCQkJLyogbWFrZSBzdXJlIHRoZSByZWNlaXZlIHVuaXQgaXMgc3RhcnRlZCAqLwpAQCAtMjY2OSw3ICsyNjc5LDcgQEAKIAkJCURQUklOVEsoTElOSywgSU5GTywgIk5JQyBMaW5rIGlzIERvd25cbiIpOwogCQkJbmV0aWZfY2Fycmllcl9vZmYobmV0ZGV2KTsKIAkJCW5ldGlmX3N0b3BfcXVldWUobmV0ZGV2KTsKLQkJCW1vZF90aW1lcigmYWRhcHRlci0+cGh5X2luZm9fdGltZXIsIGppZmZpZXMgKyAyICogSFopOworCQkJbW9kX3RpbWVyKCZhZGFwdGVyLT5waHlfaW5mb190aW1lciwgcm91bmRfamlmZmllcyhqaWZmaWVzICsgMiAqIEhaKSk7CiAKIAkJCS8qIDgwMDAzRVMyTEFOIHdvcmthcm91bmQtLQogCQkJICogRm9yIHBhY2tldCBidWZmZXIgd29yay1hcm91bmQgb24gbGluayBkb3duIGV2ZW50OwpAQCAtMjcyMSw3ICsyNzMxLDcgQEAKIAkJZTEwMDBfcmFyX3NldCgmYWRhcHRlci0+aHcsIGFkYXB0ZXItPmh3Lm1hY19hZGRyLCAwKTsKIAogCS8qIFJlc2V0IHRoZSB0aW1lciAqLwotCW1vZF90aW1lcigmYWRhcHRlci0+d2F0Y2hkb2dfdGltZXIsIGppZmZpZXMgKyAyICogSFopOworCW1vZF90aW1lcigmYWRhcHRlci0+d2F0Y2hkb2dfdGltZXIsIHJvdW5kX2ppZmZpZXMoamlmZmllcyArIDIgKiBIWikpOwogfQogCiBlbnVtIGxhdGVuY3lfcmFuZ2UgewpAQCAtMjg4NywzMyArMjg5NywzMCBAQAogCQkJCXJldHVybiBlcnI7CiAJCX0KIAotCQloZHJfbGVuID0gKChza2ItPmgucmF3IC0gc2tiLT5kYXRhKSArIChza2ItPmgudGgtPmRvZmYgPDwgMikpOworCQloZHJfbGVuID0gc2tiX3RyYW5zcG9ydF9vZmZzZXQoc2tiKSArIHRjcF9oZHJsZW4oc2tiKTsKIAkJbXNzID0gc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZTsKIAkJaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfSVApKSB7Ci0JCQlza2ItPm5oLmlwaC0+dG90X2xlbiA9IDA7Ci0JCQlza2ItPm5oLmlwaC0+Y2hlY2sgPSAwOwotCQkJc2tiLT5oLnRoLT5jaGVjayA9Ci0JCQkJfmNzdW1fdGNwdWRwX21hZ2ljKHNrYi0+bmguaXBoLT5zYWRkciwKLQkJCQkJCSAgIHNrYi0+bmguaXBoLT5kYWRkciwKLQkJCQkJCSAgIDAsCi0JCQkJCQkgICBJUFBST1RPX1RDUCwKLQkJCQkJCSAgIDApOworCQkJc3RydWN0IGlwaGRyICppcGggPSBpcF9oZHIoc2tiKTsKKwkJCWlwaC0+dG90X2xlbiA9IDA7CisJCQlpcGgtPmNoZWNrID0gMDsKKwkJCXRjcF9oZHIoc2tiKS0+Y2hlY2sgPSB+Y3N1bV90Y3B1ZHBfbWFnaWMoaXBoLT5zYWRkciwKKwkJCQkJCQkJIGlwaC0+ZGFkZHIsIDAsCisJCQkJCQkJCSBJUFBST1RPX1RDUCwKKwkJCQkJCQkJIDApOwogCQkJY21kX2xlbmd0aCA9IEUxMDAwX1RYRF9DTURfSVA7Ci0JCQlpcGNzZSA9IHNrYi0+aC5yYXcgLSBza2ItPmRhdGEgLSAxOworCQkJaXBjc2UgPSBza2JfdHJhbnNwb3J0X29mZnNldChza2IpIC0gMTsKIAkJfSBlbHNlIGlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX0lQVjYpKSB7Ci0JCQlza2ItPm5oLmlwdjZoLT5wYXlsb2FkX2xlbiA9IDA7Ci0JCQlza2ItPmgudGgtPmNoZWNrID0KLQkJCQl+Y3N1bV9pcHY2X21hZ2ljKCZza2ItPm5oLmlwdjZoLT5zYWRkciwKLQkJCQkJCSAmc2tiLT5uaC5pcHY2aC0+ZGFkZHIsCi0JCQkJCQkgMCwKLQkJCQkJCSBJUFBST1RPX1RDUCwKLQkJCQkJCSAwKTsKKwkJCWlwdjZfaGRyKHNrYiktPnBheWxvYWRfbGVuID0gMDsKKwkJCXRjcF9oZHIoc2tiKS0+Y2hlY2sgPQorCQkJCX5jc3VtX2lwdjZfbWFnaWMoJmlwdjZfaGRyKHNrYiktPnNhZGRyLAorCQkJCQkJICZpcHY2X2hkcihza2IpLT5kYWRkciwKKwkJCQkJCSAwLCBJUFBST1RPX1RDUCwgMCk7CiAJCQlpcGNzZSA9IDA7CiAJCX0KLQkJaXBjc3MgPSBza2ItPm5oLnJhdyAtIHNrYi0+ZGF0YTsKLQkJaXBjc28gPSAodm9pZCAqKSYoc2tiLT5uaC5pcGgtPmNoZWNrKSAtICh2b2lkICopc2tiLT5kYXRhOwotCQl0dWNzcyA9IHNrYi0+aC5yYXcgLSBza2ItPmRhdGE7Ci0JCXR1Y3NvID0gKHZvaWQgKikmKHNrYi0+aC50aC0+Y2hlY2spIC0gKHZvaWQgKilza2ItPmRhdGE7CisJCWlwY3NzID0gc2tiX25ldHdvcmtfb2Zmc2V0KHNrYik7CisJCWlwY3NvID0gKHZvaWQgKikmKGlwX2hkcihza2IpLT5jaGVjaykgLSAodm9pZCAqKXNrYi0+ZGF0YTsKKwkJdHVjc3MgPSBza2JfdHJhbnNwb3J0X29mZnNldChza2IpOworCQl0dWNzbyA9ICh2b2lkICopJih0Y3BfaGRyKHNrYiktPmNoZWNrKSAtICh2b2lkICopc2tiLT5kYXRhOwogCQl0dWNzZSA9IDA7CiAKIAkJY21kX2xlbmd0aCB8PSAoRTEwMDBfVFhEX0NNRF9ERVhUIHwgRTEwMDBfVFhEX0NNRF9UU0UgfApAQCAtMjk1NCw3ICsyOTYxLDcgQEAKIAl1aW50OF90IGNzczsKIAogCWlmIChsaWtlbHkoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCkpIHsKLQkJY3NzID0gc2tiLT5oLnJhdyAtIHNrYi0+ZGF0YTsKKwkJY3NzID0gc2tiX3RyYW5zcG9ydF9vZmZzZXQoc2tiKTsKIAogCQlpID0gdHhfcmluZy0+bmV4dF90b191c2U7CiAJCWJ1ZmZlcl9pbmZvID0gJnR4X3JpbmctPmJ1ZmZlcl9pbmZvW2ldOwpAQCAtMjk2Miw3ICsyOTY5LDggQEAKIAogCQljb250ZXh0X2Rlc2MtPmxvd2VyX3NldHVwLmlwX2NvbmZpZyA9IDA7CiAJCWNvbnRleHRfZGVzYy0+dXBwZXJfc2V0dXAudGNwX2ZpZWxkcy50dWNzcyA9IGNzczsKLQkJY29udGV4dF9kZXNjLT51cHBlcl9zZXR1cC50Y3BfZmllbGRzLnR1Y3NvID0gY3NzICsgc2tiLT5jc3VtOworCQljb250ZXh0X2Rlc2MtPnVwcGVyX3NldHVwLnRjcF9maWVsZHMudHVjc28gPQorCQkJY3NzICsgc2tiLT5jc3VtX29mZnNldDsKIAkJY29udGV4dF9kZXNjLT51cHBlcl9zZXR1cC50Y3BfZmllbGRzLnR1Y3NlID0gMDsKIAkJY29udGV4dF9kZXNjLT50Y3Bfc2VnX3NldHVwLmRhdGEgPSAwOwogCQljb250ZXh0X2Rlc2MtPmNtZF9hbmRfbGVuZ3RoID0gY3B1X3RvX2xlMzIoRTEwMDBfVFhEX0NNRF9ERVhUKTsKQEAgLTMxNjIsNyArMzE3MCw3IEBACiAJdWludDMyX3QgZmlmb19zcGFjZSA9IGFkYXB0ZXItPnR4X2ZpZm9fc2l6ZSAtIGFkYXB0ZXItPnR4X2ZpZm9faGVhZDsKIAl1aW50MzJfdCBza2JfZmlmb19sZW4gPSBza2ItPmxlbiArIEUxMDAwX0ZJRk9fSERSOwogCi0JRTEwMDBfUk9VTkRVUChza2JfZmlmb19sZW4sIEUxMDAwX0ZJRk9fSERSKTsKKwlza2JfZmlmb19sZW4gPSBBTElHTihza2JfZmlmb19sZW4sIEUxMDAwX0ZJRk9fSERSKTsKIAogCWlmIChhZGFwdGVyLT5saW5rX2R1cGxleCAhPSBIQUxGX0RVUExFWCkKIAkJZ290byBub19maWZvX3N0YWxsX3JlcXVpcmVkOwpAQCAtMzI5Niw3ICszMzA0LDcgQEAKIAkJLyogVFNPIFdvcmthcm91bmQgZm9yIDgyNTcxLzIvMyBDb250cm9sbGVycyAtLSBpZiBza2ItPmRhdGEKIAkJKiBwb2ludHMgdG8ganVzdCBoZWFkZXIsIHB1bGwgYSBmZXcgYnl0ZXMgb2YgcGF5bG9hZCBmcm9tCiAJCSogZnJhZ3MgaW50byBza2ItPmRhdGEgKi8KLQkJaGRyX2xlbiA9ICgoc2tiLT5oLnJhdyAtIHNrYi0+ZGF0YSkgKyAoc2tiLT5oLnRoLT5kb2ZmIDw8IDIpKTsKKwkJaGRyX2xlbiA9IHNrYl90cmFuc3BvcnRfb2Zmc2V0KHNrYikgKyB0Y3BfaGRybGVuKHNrYik7CiAJCWlmIChza2ItPmRhdGFfbGVuICYmIChoZHJfbGVuID09IChza2ItPmxlbiAtIHNrYi0+ZGF0YV9sZW4pKSkgewogCQkJc3dpdGNoIChhZGFwdGVyLT5ody5tYWNfdHlwZSkgewogCQkJCXVuc2lnbmVkIGludCBwdWxsX3NpemU7CkBAIC0zMzA3LDcgKzMzMTUsNyBAQAogCQkJCSAqIE5PVEU6IHRoaXMgaXMgYSBUU08gb25seSB3b3JrYXJvdW5kCiAJCQkJICogaWYgZW5kIGJ5dGUgYWxpZ25tZW50IG5vdCBjb3JyZWN0IG1vdmUgdXMKIAkJCQkgKiBpbnRvIHRoZSBuZXh0IGR3b3JkICovCi0JCQkJaWYgKCh1bnNpZ25lZCBsb25nKShza2ItPnRhaWwgLSAxKSAmIDQpCisJCQkJaWYgKCh1bnNpZ25lZCBsb25nKShza2JfdGFpbF9wb2ludGVyKHNrYikgLSAxKSAmIDQpCiAJCQkJCWJyZWFrOwogCQkJCS8qIGZhbGwgdGhyb3VnaCAqLwogCQkJY2FzZSBlMTAwMF84MjU3MToKQEAgLTMzNjMsMTIgKzMzNzEsOSBAQAogCSAgICAoYWRhcHRlci0+aHcubWFjX3R5cGUgPT0gZTEwMDBfODI1NzMpKQogCQllMTAwMF90cmFuc2Zlcl9kaGNwX2luZm8oYWRhcHRlciwgc2tiKTsKIAotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQlpZiAoIXNwaW5fdHJ5bG9jaygmdHhfcmluZy0+dHhfbG9jaykpIHsKKwlpZiAoIXNwaW5fdHJ5bG9ja19pcnFzYXZlKCZ0eF9yaW5nLT50eF9sb2NrLCBmbGFncykpCiAJCS8qIENvbGxpc2lvbiAtIHRlbGwgdXBwZXIgbGF5ZXIgdG8gcmVxdWV1ZSAqLwotCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAJCXJldHVybiBORVRERVZfVFhfTE9DS0VEOwotCX0KIAogCS8qIG5lZWQ6IGNvdW50ICsgMiBkZXNjIGdhcCB0byBrZWVwIHRhaWwgZnJvbSB0b3VjaGluZwogCSAqIGhlYWQsIG90aGVyd2lzZSB0cnkgbmV4dCB0aW1lICovCkBAIC00MjI3LDkgKzQyMzIsMTIgQEAKIAkJCSAgICBuZXRkZXZfYWxsb2Nfc2tiKG5ldGRldiwgbGVuZ3RoICsgTkVUX0lQX0FMSUdOKTsKIAkJCWlmIChuZXdfc2tiKSB7CiAJCQkJc2tiX3Jlc2VydmUobmV3X3NrYiwgTkVUX0lQX0FMSUdOKTsKLQkJCQltZW1jcHkobmV3X3NrYi0+ZGF0YSAtIE5FVF9JUF9BTElHTiwKLQkJCQkgICAgICAgc2tiLT5kYXRhIC0gTkVUX0lQX0FMSUdOLAotCQkJCSAgICAgICBsZW5ndGggKyBORVRfSVBfQUxJR04pOworCQkJCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhX29mZnNldChuZXdfc2tiLAorCQkJCQkJCSAgICAgICAtTkVUX0lQX0FMSUdOLAorCQkJCQkJCSAgICAgICAoc2tiLT5kYXRhIC0KKwkJCQkJCQkgICAgICAgIE5FVF9JUF9BTElHTiksCisJCQkJCQkJICAgICAgIChsZW5ndGggKworCQkJCQkJCSAgICAgICAgTkVUX0lQX0FMSUdOKSk7CiAJCQkJLyogc2F2ZSB0aGUgc2tiIGluIGJ1ZmZlcl9pbmZvIGFzIGdvb2QgKi8KIAkJCQlidWZmZXJfaW5mby0+c2tiID0gc2tiOwogCQkJCXNrYiA9IG5ld19za2I7CkBAIC00MzkxLDcgKzQzOTksNyBAQAogCQkJCVBDSV9ETUFfRlJPTURFVklDRSk7CiAJCQl2YWRkciA9IGttYXBfYXRvbWljKHBzX3BhZ2UtPnBzX3BhZ2VbMF0sCiAJCQkgICAgICAgICAgICAgICAgICAgIEtNX1NLQl9EQVRBX1NPRlRJUlEpOwotCQkJbWVtY3B5KHNrYi0+dGFpbCwgdmFkZHIsIGwxKTsKKwkJCW1lbWNweShza2JfdGFpbF9wb2ludGVyKHNrYiksIHZhZGRyLCBsMSk7CiAJCQlrdW5tYXBfYXRvbWljKHZhZGRyLCBLTV9TS0JfREFUQV9TT0ZUSVJRKTsKIAkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShwZGV2LAogCQkJCXBzX3BhZ2VfZG1hLT5wc19wYWdlX2RtYVswXSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX3BhcmFtLmMgYi9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9wYXJhbS5jCmluZGV4IGY4ODYyZTIuLmY0ODU4NzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX3BhcmFtLmMKKysrIGIvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfcGFyYW0uYwpAQCAtMzA1LDcgKzMwNSw3IEBACiAJCWlmIChudW1fVHhEZXNjcmlwdG9ycyA+IGJkKSB7CiAJCQl0eF9yaW5nLT5jb3VudCA9IFR4RGVzY3JpcHRvcnNbYmRdOwogCQkJZTEwMDBfdmFsaWRhdGVfb3B0aW9uKCZ0eF9yaW5nLT5jb3VudCwgJm9wdCwgYWRhcHRlcik7Ci0JCQlFMTAwMF9ST1VORFVQKHR4X3JpbmctPmNvdW50LAorCQkJdHhfcmluZy0+Y291bnQgPSBBTElHTih0eF9yaW5nLT5jb3VudCwKIAkJCQkJCVJFUV9UWF9ERVNDUklQVE9SX01VTFRJUExFKTsKIAkJfSBlbHNlIHsKIAkJCXR4X3JpbmctPmNvdW50ID0gb3B0LmRlZjsKQEAgLTMzMSw3ICszMzEsNyBAQAogCQlpZiAobnVtX1J4RGVzY3JpcHRvcnMgPiBiZCkgewogCQkJcnhfcmluZy0+Y291bnQgPSBSeERlc2NyaXB0b3JzW2JkXTsKIAkJCWUxMDAwX3ZhbGlkYXRlX29wdGlvbigmcnhfcmluZy0+Y291bnQsICZvcHQsIGFkYXB0ZXIpOwotCQkJRTEwMDBfUk9VTkRVUChyeF9yaW5nLT5jb3VudCwKKwkJCXJ4X3JpbmctPmNvdW50ID0gQUxJR04ocnhfcmluZy0+Y291bnQsCiAJCQkJCQlSRVFfUlhfREVTQ1JJUFRPUl9NVUxUSVBMRSk7CiAJCX0gZWxzZSB7CiAJCQlyeF9yaW5nLT5jb3VudCA9IG9wdC5kZWY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lZXByby5jIGIvZHJpdmVycy9uZXQvZWVwcm8uYwppbmRleCBiNDQ2MzA5Li4zOTY1NGUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lZXByby5jCisrKyBiL2RyaXZlcnMvbmV0L2VlcHJvLmMKQEAgLTE1OTEsNyArMTU5MSw2IEBACiAKIAkJCQlicmVhazsKIAkJCX0KLQkJCXNrYi0+ZGV2ID0gZGV2OwogCQkJc2tiX3Jlc2VydmUoc2tiLDIpOwogCiAJCQlpZiAobHAtPnZlcnNpb24gPT0gTEFONTk1KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZWVwcm8xMDAuYyBiL2RyaXZlcnMvbmV0L2VlcHJvMTAwLmMKaW5kZXggZTI4YmIxZS4uNmMyNjdjMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZWVwcm8xMDAuYworKysgYi9kcml2ZXJzL25ldC9lZXBybzEwMC5jCkBAIC0xNzkzLDcgKzE3OTMsNiBAQAogCQkJICAgY29weWluZyB0byBhIHByb3Blcmx5IHNpemVkIHNrYnVmZi4gKi8KIAkJCWlmIChwa3RfbGVuIDwgcnhfY29weWJyZWFrCiAJCQkJJiYgKHNrYiA9IGRldl9hbGxvY19za2IocGt0X2xlbiArIDIpKSAhPSAwKSB7Ci0JCQkJc2tiLT5kZXYgPSBkZXY7CiAJCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsJLyogQWxpZ24gSVAgb24gMTYgYnl0ZSBib3VuZGFyaWVzICovCiAJCQkJLyogJ3NrYl9wdXQoKScgcG9pbnRzIHRvIHRoZSBzdGFydCBvZiBza19idWZmIGRhdGEgYXJlYS4gKi8KIAkJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoc3AtPnBkZXYsIHNwLT5yeF9yaW5nX2RtYVtlbnRyeV0sCkBAIC0xODA1LDggKzE4MDQsOSBAQAogCQkJCWV0aF9jb3B5X2FuZF9zdW0oc2tiLCBzcC0+cnhfc2tidWZmW2VudHJ5XS0+ZGF0YSwgcGt0X2xlbiwgMCk7CiAJCQkJc2tiX3B1dChza2IsIHBrdF9sZW4pOwogI2Vsc2UKLQkJCQltZW1jcHkoc2tiX3B1dChza2IsIHBrdF9sZW4pLCBzcC0+cnhfc2tidWZmW2VudHJ5XS0+ZGF0YSwKLQkJCQkJICAgcGt0X2xlbik7CisJCQkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShzcC0+cnhfc2tidWZmW2VudHJ5XSwKKwkJCQkJCQkgIHNrYl9wdXQoc2tiLCBwa3RfbGVuKSwKKwkJCQkJCQkgIHBrdF9sZW4pOwogI2VuZGlmCiAJCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHNwLT5wZGV2LCBzcC0+cnhfcmluZ19kbWFbZW50cnldLAogCQkJCQkJCQkJCQkgICBzaXplb2Yoc3RydWN0IFJ4RkQpICsgcGt0X2xlbiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2VleHByZXNzLmMgYi9kcml2ZXJzL25ldC9lZXhwcmVzcy5jCmluZGV4IDM4NjhiODAuLjc5MzRlYTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2VleHByZXNzLmMKKysrIGIvZHJpdmVycy9uZXQvZWV4cHJlc3MuYwpAQCAtMTE1LDYgKzExNSw3IEBACiAjaW5jbHVkZSA8bGludXgvbWNhLWxlZ2FjeS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgogCiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgpAQCAtNTU2LDcgKzU1Nyw3IEBACiAKIAlpZiAobHAtPnN0YXJ0ZWQpCiAJewotCQlpZiAoKGppZmZpZXMgLSBkZXYtPnRyYW5zX3N0YXJ0KT41MCkKKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgZGV2LT50cmFuc19zdGFydCArIDUwKSkKIAkJewogCQkJaWYgKGxwLT50eF9saW5rPT1scC0+bGFzdF90eF9yZXN0YXJ0KQogCQkJewpAQCAtNjEyLDcgKzYxMyw3IEBACiAJfQogCWVsc2UKIAl7Ci0JCWlmICgoamlmZmllcy1scC0+aW5pdF90aW1lKT4xMCkKKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgbHAtPmluaXRfdGltZSArIDEwKSkKIAkJewogCQkJdW5zaWduZWQgc2hvcnQgc3RhdHVzID0gc2NiX3N0YXR1cyhkZXYpOwogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGk4MjU4NiBzdGFydHVwIHRpbWVkIG91dCwgc3RhdHVzICUwNHgsIHJlc2V0dGluZy4uLlxuIiwKQEAgLTc3Niw3ICs3NzcsNyBAQAogc3RhdGljIHZvaWQgZWV4cF9jbWRfY2xlYXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAl1bnNpZ25lZCBsb25nIGludCBvbGR0aW1lID0gamlmZmllczsKLQl3aGlsZSAoc2NiX3JkY21kKGRldikgJiYgKChqaWZmaWVzLW9sZHRpbWUpPDEwKSk7CisJd2hpbGUgKHNjYl9yZGNtZChkZXYpICYmICh0aW1lX2JlZm9yZShqaWZmaWVzLCBvbGR0aW1lICsgMTApKSk7CiAJaWYgKHNjYl9yZGNtZChkZXYpKSB7CiAJCXByaW50aygiJXM6IGNvbW1hbmQgZGlkbid0IGNsZWFyXG4iLCBkZXYtPm5hbWUpOwogCX0KQEAgLTk3Niw3ICs5NzcsNiBAQAogCQkJCQlscC0+c3RhdHMucnhfZHJvcHBlZCsrOwogCQkJCQlicmVhazsKIAkJCQl9Ci0JCQkJc2tiLT5kZXYgPSBkZXY7CiAJCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsKIAkJCQlvdXR3KHBidWYrMTAsIGlvYWRkcitSRUFEX1BUUik7CiAJCQkgICAgICAgIGluc3coaW9hZGRyK0RBVEFQT1JULCBza2JfcHV0KHNrYixwa3RfbGVuKSwocGt0X2xlbisxKT4+MSk7CkBAIC0xNjUwLDcgKzE2NTAsNyBAQAogI2VuZGlmCiAgICAgICAgICAgICAgICAgb2ogPSBqaWZmaWVzOwogICAgICAgICAgICAgICAgIHdoaWxlICgoU0NCX0NVc3RhdChzY2Jfc3RhdHVzKGRldikpID09IDIpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICgoamlmZmllcy1vaikgPCAyMDAwKSk7CisgICAgICAgICAgICAgICAgICAgICAgICh0aW1lX2JlZm9yZShqaWZmaWVzLCBvaiArIDIwMDApKSk7CiAJCWlmIChTQ0JfQ1VzdGF0KHNjYl9zdGF0dXMoZGV2KSkgPT0gMikKIAkJCXByaW50aygiJXM6IHdhcm5pbmcsIENVIGRpZG4ndCBzdG9wXG4iLCBkZXYtPm5hbWUpOwogICAgICAgICAgICAgICAgIGxwLT5zdGFydGVkICY9IH4oU1RBUlRFRF9DVSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9laGVhL2VoZWEuaCBiL2RyaXZlcnMvbmV0L2VoZWEvZWhlYS5oCmluZGV4IDQyMjk1ZDYuLjYwMjg3MmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2VoZWEvZWhlYS5oCisrKyBiL2RyaXZlcnMvbmV0L2VoZWEvZWhlYS5oCkBAIC0zOSw3ICszOSw3IEBACiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKICNkZWZpbmUgRFJWX05BTUUJImVoZWEiCi0jZGVmaW5lIERSVl9WRVJTSU9OCSJFSEVBXzAwNDYiCisjZGVmaW5lIERSVl9WRVJTSU9OCSJFSEVBXzAwNTgiCiAKICNkZWZpbmUgRUhFQV9NU0dfREVGQVVMVCAoTkVUSUZfTVNHX0xJTksgfCBORVRJRl9NU0dfVElNRVIgXAogCXwgTkVUSUZfTVNHX1JYX0VSUiB8IE5FVElGX01TR19UWF9FUlIpCkBAIC03OCwxMCArNzgsNyBAQAogI2RlZmluZSBFSEVBX1JRMl9QS1RfU0laRSAgICAgICAxNTIyCiAjZGVmaW5lIEVIRUFfTF9QS1RfU0laRSAgICAgICAgIDI1NgkvKiBsb3cgbGF0ZW5jeSAqLwogCi0jZGVmaW5lIEVIRUFfUE9MTF9NQVhfUldRRSAgICAgIDEwMDAKLQogLyogU2VuZCBjb21wbGV0aW9uIHNpZ25hbGluZyAqLwotI2RlZmluZSBFSEVBX1NJR19JVl9MT05HICAgICAgICAgICAxCiAKIC8qIFByb3RlY3Rpb24gRG9tYWluIElkZW50aWZpZXIgKi8KICNkZWZpbmUgRUhFQV9QRF9JRCAgICAgICAgMHhhYWJjZGVmZgpAQCAtMTA4LDExICsxMDUsNyBAQAogI2RlZmluZSBFSEVBX0NBQ0hFX0xJTkUgICAgICAgICAgMTI4CiAKIC8qIE1lbW9yeSBSZWdpb25zICovCi0jZGVmaW5lIEVIRUFfTVJfTUFYX1RYX1BBR0VTICAgMjAKLSNkZWZpbmUgRUhFQV9NUl9UWF9EQVRBX1BOICAgICAgMwogI2RlZmluZSBFSEVBX01SX0FDQ19DVFJMICAgICAgIDB4MDA4MDAwMDAKLSNkZWZpbmUgRUhFQV9SV1FFU19QRVJfTVJfUlEyICAxMAotI2RlZmluZSBFSEVBX1JXUUVTX1BFUl9NUl9SUTMgIDEwCiAKICNkZWZpbmUgRUhFQV9XQVRDSF9ET0dfVElNRU9VVCAxMCpIWgogCkBAIC0zMTEsNiArMzA0LDcgQEAKICAqIE1lbW9yeSBSZWdpb24KICAqLwogc3RydWN0IGVoZWFfbXIgeworCXN0cnVjdCBlaGVhX2FkYXB0ZXIgKmFkYXB0ZXI7CiAJdTY0IGhhbmRsZTsKIAl1NjQgdmFkZHI7CiAJdTMyIGxrZXk7CkBAIC0zMTksMTcgKzMxMywxMiBAQAogLyoKICAqIFBvcnQgc3RhdGUgaW5mb3JtYXRpb24KICAqLwotc3RydWN0IHBvcnRfc3RhdGUgewotCWludCBwb2xsX21heF9wcm9jZXNzZWQ7CitzdHJ1Y3QgcG9ydF9zdGF0cyB7CiAJaW50IHBvbGxfcmVjZWl2ZV9lcnJvcnM7Ci0JaW50IGVoZWFfcG9sbDsKIAlpbnQgcXVldWVfc3RvcHBlZDsKLQlpbnQgbWluX3N3cWVfYXZhaWw7Ci0JdTY0IHNxY19zdG9wX3N1bTsKLQlpbnQgcGt0X3NlbmQ7Ci0JaW50IHBrdF94bWl0OwotCWludCBzZW5kX3Rhc2tsZXQ7Ci0JaW50IG53cWU7CisJaW50IGVycl90Y3BfY2tzdW07CisJaW50IGVycl9pcF9ja3N1bTsKKwlpbnQgZXJyX2ZyYW1lX2NyYzsKIH07CiAKICNkZWZpbmUgRUhFQV9JUlFfTkFNRV9TSVpFIDIwCkBAIC0zNDgsNiArMzM3LDcgQEAKICAqIFBvcnQgcmVzb3VyY2VzCiAgKi8KIHN0cnVjdCBlaGVhX3BvcnRfcmVzIHsKKwlzdHJ1Y3QgcG9ydF9zdGF0cyBwX3N0YXRzOwogCXN0cnVjdCBlaGVhX21yIHNlbmRfbXI7ICAgICAgIAkvKiBzZW5kIG1lbW9yeSByZWdpb24gKi8KIAlzdHJ1Y3QgZWhlYV9tciByZWN2X21yOyAgICAgICAJLyogcmVjZWl2ZSBtZW1vcnkgcmVnaW9uICovCiAJc3BpbmxvY2tfdCB4bWl0X2xvY2s7CkBAIC0zNTcsOSArMzQ3LDggQEAKIAlzdHJ1Y3QgZWhlYV9xcCAqcXA7CiAJc3RydWN0IGVoZWFfY3EgKnNlbmRfY3E7CiAJc3RydWN0IGVoZWFfY3EgKnJlY3ZfY3E7Ci0Jc3RydWN0IGVoZWFfZXEgKnNlbmRfZXE7Ci0Jc3RydWN0IGVoZWFfZXEgKnJlY3ZfZXE7Ci0Jc3BpbmxvY2tfdCBzZW5kX2xvY2s7CisJc3RydWN0IGVoZWFfZXEgKmVxOworCXN0cnVjdCBuZXRfZGV2aWNlICpkX25ldGRldjsKIAlzdHJ1Y3QgZWhlYV9xX3NrYl9hcnIgcnExX3NrYmE7CiAJc3RydWN0IGVoZWFfcV9za2JfYXJyIHJxMl9za2JhOwogCXN0cnVjdCBlaGVhX3Ffc2tiX2FyciBycTNfc2tiYTsKQEAgLTM2OSwyMSArMzU4LDE4IEBACiAJaW50IHN3cWVfcmVmaWxsX3RoOwogCWF0b21pY190IHN3cWVfYXZhaWw7CiAJaW50IHN3cWVfbGxfY291bnQ7Ci0JaW50IHN3cWVfY291bnQ7CiAJdTMyIHN3cWVfaWRfY291bnRlcjsKIAl1NjQgdHhfcGFja2V0czsKLQlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3Qgc2VuZF9jb21wX3Rhc2s7Ci0Jc3BpbmxvY2tfdCByZWN2X2xvY2s7Ci0Jc3RydWN0IHBvcnRfc3RhdGUgcF9zdGF0ZTsKIAl1NjQgcnhfcGFja2V0czsKIAl1MzIgcG9sbF9jb3VudGVyOwogfTsKIAogCisjZGVmaW5lIEVIRUFfTUFYX1BPUlRTIDE2CiBzdHJ1Y3QgZWhlYV9hZGFwdGVyIHsKIAl1NjQgaGFuZGxlOwotCXU4IG51bV9wb3J0czsKLQlzdHJ1Y3QgZWhlYV9wb3J0ICpwb3J0WzE2XTsKKwlzdHJ1Y3QgaWJtZWJ1c19kZXYgKmVidXNfZGV2OworCXN0cnVjdCBlaGVhX3BvcnQgKnBvcnRbRUhFQV9NQVhfUE9SVFNdOwogCXN0cnVjdCBlaGVhX2VxICpuZXE7ICAgICAgIC8qIG5vdGlmaWNhdGlvbiBldmVudCBxdWV1ZSAqLwogCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICplaGVhX3dxOwogCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCBuZXFfdGFza2xldDsKQEAgLTQwNiw3ICszOTIsNyBAQAogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CiAJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CiAJc3RydWN0IGVoZWFfcG9ydF9yZXMgcG9ydF9yZXNbRUhFQV9NQVhfUE9SVF9SRVNdOwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqb2ZfZGV2X25vZGU7IC8qIE9wZW4gRmlybXdhcmUgRGV2aWNlIE5vZGUgKi8KKwlzdHJ1Y3Qgb2ZfZGV2aWNlICBvZmRldjsgLyogT3BlbiBGaXJtd2FyZSBEZXZpY2UgKi8KIAlzdHJ1Y3QgZWhlYV9tY19saXN0ICptY19saXN0OwkgLyogTXVsdGljYXN0IE1BQyBhZGRyZXNzZXMgKi8KIAlzdHJ1Y3Qgdmxhbl9ncm91cCAqdmdycDsKIAlzdHJ1Y3QgZWhlYV9lcSAqcXBfZXE7CkBAIC00MTUsNyArNDAxLDkgQEAKIAljaGFyIGludF9hZmZfbmFtZVtFSEVBX0lSUV9OQU1FX1NJWkVdOwogCWludCBhbGxtdWx0aTsJCQkgLyogSW5kaWNhdGVzIElGRl9BTExNVUxUSSBzdGF0ZSAqLwogCWludCBwcm9taXNjOwkJIAkgLyogSW5kaWNhdGVzIElGRl9QUk9NSVNDIHN0YXRlICovCisJaW50IG51bV90eF9xcHM7CiAJaW50IG51bV9hZGRfdHhfcXBzOworCWludCBudW1fbWNzOwogCWludCByZXNldHM7CiAJdTY0IG1hY19hZGRyOwogCXUzMiBsb2dpY2FsX3BvcnRfaWQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9laGVhL2VoZWFfZXRodG9vbC5jIGIvZHJpdmVycy9uZXQvZWhlYS9laGVhX2V0aHRvb2wuYwppbmRleCA5ZjU3YzJlLi5kZWNlYzhjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9laGVhL2VoZWFfZXRodG9vbC5jCisrKyBiL2RyaXZlcnMvbmV0L2VoZWEvZWhlYV9ldGh0b29sLmMKQEAgLTE0NCw4ICsxNDQsOCBAQAogc3RhdGljIHZvaWQgZWhlYV9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJICAgICAgIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCiB7Ci0Jc3RybGNweShpbmZvLT5kcml2ZXIsIERSVl9OQU1FLCBzaXplb2YoaW5mby0+ZHJpdmVyKSAtIDEpOwotCXN0cmxjcHkoaW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT04sIHNpemVvZihpbmZvLT52ZXJzaW9uKSAtIDEpOworCXN0cmxjcHkoaW5mby0+ZHJpdmVyLCBEUlZfTkFNRSwgc2l6ZW9mKGluZm8tPmRyaXZlcikpOworCXN0cmxjcHkoaW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT04sIHNpemVvZihpbmZvLT52ZXJzaW9uKSk7CiB9CiAKIHN0YXRpYyB1MzIgZWhlYV9nZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKQEAgLTE2NiwzMyArMTY2LDIzIEBACiB9CiAKIHN0YXRpYyBjaGFyIGVoZWFfZXRodG9vbF9zdGF0c19rZXlzW11bRVRIX0dTVFJJTkdfTEVOXSA9IHsKLQl7InBvbGxfbWF4X3Byb2Nlc3NlZCJ9LAotCXsicXVldWVfc3RvcHBlZCJ9LAotCXsibWluX3N3cWVfYXZhaWwifSwKLQl7InBvbGxfcmVjZWl2ZV9lcnIifSwKLQl7InBrdF9zZW5kIn0sCi0JeyJwa3RfeG1pdCJ9LAotCXsic2VuZF90YXNrbGV0In0sCi0JeyJlaGVhX3BvbGwifSwKLQl7Im53cWUifSwKLQl7InN3cWVfYXZhaWxhYmxlXzAifSwKIAl7InNpZ19jb21wX2l2In0sCiAJeyJzd3FlX3JlZmlsbF90aCJ9LAogCXsicG9ydCByZXNldHMifSwKLQl7InJ4byJ9LAotCXsicng2NCJ9LAotCXsicng2NSJ9LAotCXsicngxMjgifSwKLQl7InJ4MjU2In0sCi0JeyJyeDUxMiJ9LAotCXsicngxMDI0In0sCi0JeyJ0eG8ifSwKLQl7InR4NjQifSwKLQl7InR4NjUifSwKLQl7InR4MTI4In0sCi0JeyJ0eDI1NiJ9LAotCXsidHg1MTIifSwKLQl7InR4MTAyNCJ9LAorCXsiUmVjZWl2ZSBlcnJvcnMifSwKKwl7IlRDUCBja3N1bSBlcnJvcnMifSwKKwl7IklQIGNrc3VtIGVycm9ycyJ9LAorCXsiRnJhbWUgY2tzdW0gZXJyb3JzIn0sCisJeyJudW0gU1Egc3RvcHBlZCJ9LAorCXsiU1Egc3RvcHBlZCJ9LAorCXsiUFIwIGZyZWVfc3dxZXMifSwKKwl7IlBSMSBmcmVlX3N3cWVzIn0sCisJeyJQUjIgZnJlZV9zd3FlcyJ9LAorCXsiUFIzIGZyZWVfc3dxZXMifSwKKwl7IlBSNCBmcmVlX3N3cWVzIn0sCisJeyJQUjUgZnJlZV9zd3FlcyJ9LAorCXsiUFI2IGZyZWVfc3dxZXMifSwKKwl7IlBSNyBmcmVlX3N3cWVzIn0sCiB9OwogCiBzdGF0aWMgdm9pZCBlaGVhX2dldF9zdHJpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBzdHJpbmdzZXQsIHU4ICpkYXRhKQpAQCAtMjExLDYzICsyMDEsNDQgQEAKIHN0YXRpYyB2b2lkIGVoZWFfZ2V0X2V0aHRvb2xfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCQkgICAgIHN0cnVjdCBldGh0b29sX3N0YXRzICpzdGF0cywgdTY0ICpkYXRhKQogewotCXU2NCBocmV0OwotCWludCBpOworCWludCBpLCBrLCB0bXA7CiAJc3RydWN0IGVoZWFfcG9ydCAqcG9ydCA9IG5ldGRldl9wcml2KGRldik7Ci0Jc3RydWN0IGVoZWFfYWRhcHRlciAqYWRhcHRlciA9IHBvcnQtPmFkYXB0ZXI7Ci0Jc3RydWN0IGVoZWFfcG9ydF9yZXMgKnByID0gJnBvcnQtPnBvcnRfcmVzWzBdOwotCXN0cnVjdCBwb3J0X3N0YXRlICpwX3N0YXRlID0gJnByLT5wX3N0YXRlOwotCXN0cnVjdCBoY3BfZWhlYV9wb3J0X2NiNiAqY2I2OwogCiAJZm9yIChpID0gMDsgaSA8IGVoZWFfZ2V0X3N0YXRzX2NvdW50KGRldik7IGkrKykKIAkJZGF0YVtpXSA9IDA7Ci0KIAlpID0gMDsKIAotCWRhdGFbaSsrXSA9IHBfc3RhdGUtPnBvbGxfbWF4X3Byb2Nlc3NlZDsKLQlkYXRhW2krK10gPSBwX3N0YXRlLT5xdWV1ZV9zdG9wcGVkOwotCWRhdGFbaSsrXSA9IHBfc3RhdGUtPm1pbl9zd3FlX2F2YWlsOwotCWRhdGFbaSsrXSA9IHBfc3RhdGUtPnBvbGxfcmVjZWl2ZV9lcnJvcnM7Ci0JZGF0YVtpKytdID0gcF9zdGF0ZS0+cGt0X3NlbmQ7Ci0JZGF0YVtpKytdID0gcF9zdGF0ZS0+cGt0X3htaXQ7Ci0JZGF0YVtpKytdID0gcF9zdGF0ZS0+c2VuZF90YXNrbGV0OwotCWRhdGFbaSsrXSA9IHBfc3RhdGUtPmVoZWFfcG9sbDsKLQlkYXRhW2krK10gPSBwX3N0YXRlLT5ud3FlOwotCWRhdGFbaSsrXSA9IGF0b21pY19yZWFkKCZwb3J0LT5wb3J0X3Jlc1swXS5zd3FlX2F2YWlsKTsKIAlkYXRhW2krK10gPSBwb3J0LT5zaWdfY29tcF9pdjsKIAlkYXRhW2krK10gPSBwb3J0LT5wb3J0X3Jlc1swXS5zd3FlX3JlZmlsbF90aDsKIAlkYXRhW2krK10gPSBwb3J0LT5yZXNldHM7CiAKLQljYjYgPSBremFsbG9jKFBBR0VfU0laRSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFjYjYpIHsKLQkJZWhlYV9lcnJvcigibm8gbWVtIGZvciBjYjYiKTsKLQkJcmV0dXJuOwotCX0KKwlmb3IgKGsgPSAwLCB0bXAgPSAwOyBrIDwgRUhFQV9NQVhfUE9SVF9SRVM7IGsrKykKKwkJdG1wICs9IHBvcnQtPnBvcnRfcmVzW2tdLnBfc3RhdHMucG9sbF9yZWNlaXZlX2Vycm9yczsKKwlkYXRhW2krK10gPSB0bXA7CiAKLQlocmV0ID0gZWhlYV9oX3F1ZXJ5X2VoZWFfcG9ydChhZGFwdGVyLT5oYW5kbGUsIHBvcnQtPmxvZ2ljYWxfcG9ydF9pZCwKLQkJCQkgICAgICBIX1BPUlRfQ0I2LCBIX1BPUlRfQ0I2X0FMTCwgY2I2KTsKLQlpZiAobmV0aWZfbXNnX2h3KHBvcnQpKQotCQllaGVhX2R1bXAoY2I2LCBzaXplb2YoKmNiNiksICJlaGVhX2dldF9ldGh0b29sX3N0YXRzIik7CisJZm9yIChrID0gMCwgdG1wID0gMDsgayA8IEVIRUFfTUFYX1BPUlRfUkVTOyBrKyspCisJCXRtcCArPSBwb3J0LT5wb3J0X3Jlc1trXS5wX3N0YXRzLmVycl90Y3BfY2tzdW07CisJZGF0YVtpKytdID0gdG1wOwogCi0JaWYgKGhyZXQgPT0gSF9TVUNDRVNTKSB7Ci0JCWRhdGFbaSsrXSA9IGNiNi0+cnhvOwotCQlkYXRhW2krK10gPSBjYjYtPnJ4NjQ7Ci0JCWRhdGFbaSsrXSA9IGNiNi0+cng2NTsKLQkJZGF0YVtpKytdID0gY2I2LT5yeDEyODsKLQkJZGF0YVtpKytdID0gY2I2LT5yeDI1NjsKLQkJZGF0YVtpKytdID0gY2I2LT5yeDUxMjsKLQkJZGF0YVtpKytdID0gY2I2LT5yeDEwMjQ7Ci0JCWRhdGFbaSsrXSA9IGNiNi0+dHhvOwotCQlkYXRhW2krK10gPSBjYjYtPnR4NjQ7Ci0JCWRhdGFbaSsrXSA9IGNiNi0+dHg2NTsKLQkJZGF0YVtpKytdID0gY2I2LT50eDEyODsKLQkJZGF0YVtpKytdID0gY2I2LT50eDI1NjsKLQkJZGF0YVtpKytdID0gY2I2LT50eDUxMjsKLQkJZGF0YVtpKytdID0gY2I2LT50eDEwMjQ7Ci0JfSBlbHNlCi0JCWVoZWFfZXJyb3IoInF1ZXJ5X2VoZWFfcG9ydCBmYWlsZWQiKTsKKwlmb3IgKGsgPSAwLCB0bXAgPSAwOyBrIDwgRUhFQV9NQVhfUE9SVF9SRVM7IGsrKykKKwkJdG1wICs9IHBvcnQtPnBvcnRfcmVzW2tdLnBfc3RhdHMuZXJyX2lwX2Nrc3VtOworCWRhdGFbaSsrXSA9IHRtcDsKIAotCWtmcmVlKGNiNik7CisJZm9yIChrID0gMCwgdG1wID0gMDsgayA8IEVIRUFfTUFYX1BPUlRfUkVTOyBrKyspCisJCXRtcCArPSBwb3J0LT5wb3J0X3Jlc1trXS5wX3N0YXRzLmVycl9mcmFtZV9jcmM7CisJZGF0YVtpKytdID0gdG1wOworCisJZm9yIChrID0gMCwgdG1wID0gMDsgayA8IEVIRUFfTUFYX1BPUlRfUkVTOyBrKyspCisJCXRtcCArPSBwb3J0LT5wb3J0X3Jlc1trXS5wX3N0YXRzLnF1ZXVlX3N0b3BwZWQ7CisJZGF0YVtpKytdID0gdG1wOworCisJZm9yIChrID0gMCwgdG1wID0gMDsgayA8IEVIRUFfTUFYX1BPUlRfUkVTOyBrKyspCisJCXRtcCB8PSBwb3J0LT5wb3J0X3Jlc1trXS5xdWV1ZV9zdG9wcGVkOworCWRhdGFbaSsrXSA9IHRtcDsKKworCWZvciAoayA9IDA7IGsgPCA4OyBrKyspCisJCWRhdGFbaSsrXSA9IGF0b21pY19yZWFkKCZwb3J0LT5wb3J0X3Jlc1trXS5zd3FlX2F2YWlsKTsKKwogfQogCiBjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgZWhlYV9ldGh0b29sX29wcyA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2VoZWEvZWhlYV9tYWluLmMgYi9kcml2ZXJzL25ldC9laGVhL2VoZWFfbWFpbi5jCmluZGV4IDBlNDA0MmIuLmM3YTU2MTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2VoZWEvZWhlYV9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvZWhlYS9laGVhX21haW4uYwpAQCAtNTEsMTMgKzUxLDE4IEBACiBzdGF0aWMgaW50IHJxMl9lbnRyaWVzID0gRUhFQV9ERUZfRU5UUklFU19SUTI7CiBzdGF0aWMgaW50IHJxM19lbnRyaWVzID0gRUhFQV9ERUZfRU5UUklFU19SUTM7CiBzdGF0aWMgaW50IHNxX2VudHJpZXMgPSBFSEVBX0RFRl9FTlRSSUVTX1NROworc3RhdGljIGludCB1c2VfbWNzID0gMDsKK3N0YXRpYyBpbnQgbnVtX3R4X3FwcyA9IEVIRUFfTlVNX1RYX1FQOwogCiBtb2R1bGVfcGFyYW0obXNnX2xldmVsLCBpbnQsIDApOwogbW9kdWxlX3BhcmFtKHJxMV9lbnRyaWVzLCBpbnQsIDApOwogbW9kdWxlX3BhcmFtKHJxMl9lbnRyaWVzLCBpbnQsIDApOwogbW9kdWxlX3BhcmFtKHJxM19lbnRyaWVzLCBpbnQsIDApOwogbW9kdWxlX3BhcmFtKHNxX2VudHJpZXMsIGludCwgMCk7Cittb2R1bGVfcGFyYW0odXNlX21jcywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShudW1fdHhfcXBzLCBpbnQsIDApOwogCitNT0RVTEVfUEFSTV9ERVNDKG51bV90eF9xcHMsICJOdW1iZXIgb2YgVFgtUVBTIik7CiBNT0RVTEVfUEFSTV9ERVNDKG1zZ19sZXZlbCwgIm1zZ19sZXZlbCIpOwogTU9EVUxFX1BBUk1fREVTQyhycTNfZW50cmllcywgIk51bWJlciBvZiBlbnRyaWVzIGZvciBSZWNlaXZlIFF1ZXVlIDMgIgogCQkgIlsyXnggLSAxXSwgeCA9IFs2Li4xNF0uIERlZmF1bHQgPSAiCkBAIC03MSw2ICs3NiwyOSBAQAogTU9EVUxFX1BBUk1fREVTQyhzcV9lbnRyaWVzLCAiIE51bWJlciBvZiBlbnRyaWVzIGZvciB0aGUgU2VuZCBRdWV1ZSAgIgogCQkgIlsyXnggLSAxXSwgeCA9IFs2Li4xNF0uIERlZmF1bHQgPSAiCiAJCSBfX01PRFVMRV9TVFJJTkcoRUhFQV9ERUZfRU5UUklFU19TUSkgIikiKTsKK01PRFVMRV9QQVJNX0RFU0ModXNlX21jcywgIiAwOk5BUEksIDE6TXVsdGlwbGUgcmVjZWl2ZSBxdWV1ZXMsIERlZmF1bHQgPSAxICIpOworCitzdGF0aWMgaW50IHBvcnRfbmFtZV9jbnQgPSAwOworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBlaGVhX3Byb2JlX2FkYXB0ZXIoc3RydWN0IGlibWVidXNfZGV2ICpkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqaWQpOworCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBlaGVhX3JlbW92ZShzdHJ1Y3QgaWJtZWJ1c19kZXYgKmRldik7CisKK3N0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGVoZWFfZGV2aWNlX3RhYmxlW10gPSB7CisJeworCQkubmFtZSA9ICJsaGVhIiwKKwkJLmNvbXBhdGlibGUgPSAiSUJNLGxoZWEiLAorCX0sCisJe30sCit9OworCitzdGF0aWMgc3RydWN0IGlibWVidXNfZHJpdmVyIGVoZWFfZHJpdmVyID0geworCS5uYW1lID0gImVoZWEiLAorCS5pZF90YWJsZSA9IGVoZWFfZGV2aWNlX3RhYmxlLAorCS5wcm9iZSA9IGVoZWFfcHJvYmVfYWRhcHRlciwKKwkucmVtb3ZlID0gZWhlYV9yZW1vdmUsCit9OwogCiB2b2lkIGVoZWFfZHVtcCh2b2lkICphZHIsIGludCBsZW4sIGNoYXIgKm1zZykgewogCWludCB4OwpAQCAtMTk3LDcgKzIyNSw3IEBACiAJCXN0cnVjdCBza19idWZmICpza2IgPSBuZXRkZXZfYWxsb2Nfc2tiKGRldiwgcGFja2V0X3NpemUpOwogCQlpZiAoIXNrYikgewogCQkJZWhlYV9lcnJvcigiJXM6IG5vIG1lbSBmb3Igc2tiLyVkIHdxZXMgZmlsbGVkIiwKLQkJCQkgICBkZXYtPm5hbWUsIGkpOworCQkJCSAgIHByLT5wb3J0LT5uZXRkZXYtPm5hbWUsIGkpOwogCQkJcV9za2JhLT5vc19za2JzID0gZmlsbF93cWVzIC0gaTsKIAkJCXJldCA9IC1FTk9NRU07CiAJCQlicmVhazsKQEAgLTMyMSw2ICszNDksMTMgQEAKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCisJaWYgKGNxZS0+c3RhdHVzICYgRUhFQV9DUUVfU1RBVF9FUlJfVENQKQorCQlwci0+cF9zdGF0cy5lcnJfdGNwX2Nrc3VtKys7CisJaWYgKGNxZS0+c3RhdHVzICYgRUhFQV9DUUVfU1RBVF9FUlJfSVApCisJCXByLT5wX3N0YXRzLmVycl9pcF9ja3N1bSsrOworCWlmIChjcWUtPnN0YXR1cyAmIEVIRUFfQ1FFX1NUQVRfRVJSX0NSQykKKwkJcHItPnBfc3RhdHMuZXJyX2ZyYW1lX2NyYysrOworCiAJaWYgKG5ldGlmX21zZ19yeF9lcnIocHItPnBvcnQpKSB7CiAJCWVoZWFfZXJyb3IoIkNRRSBFcnJvciBmb3IgUVAgJWQiLCBwci0+cXAtPmluaXRfYXR0ci5xcF9ucik7CiAJCWVoZWFfZHVtcChjcWUsIHNpemVvZigqY3FlKSwgIkNRRSIpOwpAQCAtMzQ1LDEwICszODAsMTEgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBlaGVhX3BvbGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50ICpidWRnZXQpCitzdGF0aWMgc3RydWN0IGVoZWFfY3FlICplaGVhX3Byb2NfcndxZXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJc3RydWN0IGVoZWFfcG9ydF9yZXMgKnByLAorCQkJCQlpbnQgKmJ1ZGdldCkKIHsKLQlzdHJ1Y3QgZWhlYV9wb3J0ICpwb3J0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlzdHJ1Y3QgZWhlYV9wb3J0X3JlcyAqcHIgPSAmcG9ydC0+cG9ydF9yZXNbMF07CisJc3RydWN0IGVoZWFfcG9ydCAqcG9ydCA9IHByLT5wb3J0OwogCXN0cnVjdCBlaGVhX3FwICpxcCA9IHByLT5xcDsKIAlzdHJ1Y3QgZWhlYV9jcWUgKmNxZTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwpAQCAtMzU5LDE0ICszOTUsMTIgQEAKIAlpbnQgc2tiX2Fycl9ycTJfbGVuID0gcHItPnJxMl9za2JhLmxlbjsKIAlpbnQgc2tiX2Fycl9ycTNfbGVuID0gcHItPnJxM19za2JhLmxlbjsKIAlpbnQgcHJvY2Vzc2VkLCBwcm9jZXNzZWRfcnExLCBwcm9jZXNzZWRfcnEyLCBwcm9jZXNzZWRfcnEzOwotCWludCB3cWVfaW5kZXgsIGxhc3Rfd3FlX2luZGV4LCBycSwgaW50cmVxLCBteV9xdW90YSwgcG9ydF9yZXNldDsKKwlpbnQgd3FlX2luZGV4LCBsYXN0X3dxZV9pbmRleCwgcnEsIG15X3F1b3RhLCBwb3J0X3Jlc2V0OwogCiAJcHJvY2Vzc2VkID0gcHJvY2Vzc2VkX3JxMSA9IHByb2Nlc3NlZF9ycTIgPSBwcm9jZXNzZWRfcnEzID0gMDsKIAlsYXN0X3dxZV9pbmRleCA9IDA7CiAJbXlfcXVvdGEgPSBtaW4oKmJ1ZGdldCwgZGV2LT5xdW90YSk7Ci0JbXlfcXVvdGEgPSBtaW4obXlfcXVvdGEsIEVIRUFfUE9MTF9NQVhfUldRRSk7CiAKLQkvKiBycTAgaXMgbG93IGxhdGVuY3kgUlEgKi8KIAljcWUgPSBlaGVhX3BvbGxfcnExKHFwLCAmd3FlX2luZGV4KTsKIAl3aGlsZSAoKG15X3F1b3RhID4gMCkgJiYgY3FlKSB7CiAJCWVoZWFfaW5jX3JxMShxcCk7CkBAIC0zODYsMTMgKzQyMCwxNCBAQAogCQkJCWlmICh1bmxpa2VseSghc2tiKSkgewogCQkJCQlpZiAobmV0aWZfbXNnX3J4X2Vycihwb3J0KSkKIAkJCQkJCWVoZWFfZXJyb3IoIkxMIHJxMTogc2tiPU5VTEwiKTsKLQkJCQkJc2tiID0gbmV0ZGV2X2FsbG9jX3NrYihkZXYsCisKKwkJCQkJc2tiID0gbmV0ZGV2X2FsbG9jX3NrYihwb3J0LT5uZXRkZXYsCiAJCQkJCQkJICAgICAgIEVIRUFfTF9QS1RfU0laRSk7CiAJCQkJCWlmICghc2tiKQogCQkJCQkJYnJlYWs7CiAJCQkJfQotCQkJCW1lbWNweShza2ItPmRhdGEsICgoY2hhciopY3FlKSArIDY0LAotCQkJCSAgICAgICBjcWUtPm51bV9ieXRlc190cmFuc2ZlcmVkIC0gNCk7CisJCQkJc2tiX2NvcHlfdG9fbGluZWFyX2RhdGEoc2tiLCAoKGNoYXIqKWNxZSkgKyA2NCwKKwkJCQkJICAgICAgIGNxZS0+bnVtX2J5dGVzX3RyYW5zZmVyZWQgLSA0KTsKIAkJCQllaGVhX2ZpbGxfc2tiKGRldiwgc2tiLCBjcWUpOwogCQkJfSBlbHNlIGlmIChycSA9PSAyKSB7ICAvKiBSUTIgKi8KIAkJCQlza2IgPSBnZXRfc2tiX2J5X2luZGV4KHNrYl9hcnJfcnEyLApAQCAtNDAyLDcgKzQzNyw3IEBACiAJCQkJCQllaGVhX2Vycm9yKCJycTI6IHNrYj1OVUxMIik7CiAJCQkJCWJyZWFrOwogCQkJCX0KLQkJCQllaGVhX2ZpbGxfc2tiKGRldiwgc2tiLCBjcWUpOworCQkJCWVoZWFfZmlsbF9za2IocG9ydC0+bmV0ZGV2LCBza2IsIGNxZSk7CiAJCQkJcHJvY2Vzc2VkX3JxMisrOwogCQkJfSBlbHNlIHsgIC8qIFJRMyAqLwogCQkJCXNrYiA9IGdldF9za2JfYnlfaW5kZXgoc2tiX2Fycl9ycTMsCkBAIC00MTIsNyArNDQ3LDcgQEAKIAkJCQkJCWVoZWFfZXJyb3IoInJxMzogc2tiPU5VTEwiKTsKIAkJCQkJYnJlYWs7CiAJCQkJfQotCQkJCWVoZWFfZmlsbF9za2IoZGV2LCBza2IsIGNxZSk7CisJCQkJZWhlYV9maWxsX3NrYihwb3J0LT5uZXRkZXYsIHNrYiwgY3FlKTsKIAkJCQlwcm9jZXNzZWRfcnEzKys7CiAJCQl9CiAKQEAgLTQyMSw5ICs0NTYsOCBAQAogCQkJCQkJCSBjcWUtPnZsYW5fdGFnKTsKIAkJCWVsc2UKIAkJCQluZXRpZl9yZWNlaXZlX3NrYihza2IpOwotCi0JCX0gZWxzZSB7IC8qIEVycm9yIG9jY3VyZWQgKi8KLQkJCXByLT5wX3N0YXRlLnBvbGxfcmVjZWl2ZV9lcnJvcnMrKzsKKwkJfSBlbHNlIHsKKwkJCXByLT5wX3N0YXRzLnBvbGxfcmVjZWl2ZV9lcnJvcnMrKzsKIAkJCXBvcnRfcmVzZXQgPSBlaGVhX3RyZWF0X3BvbGxfZXJyb3IocHIsIHJxLCBjcWUsCiAJCQkJCQkJICAgJnByb2Nlc3NlZF9ycTIsCiAJCQkJCQkJICAgJnByb2Nlc3NlZF9ycTMpOwpAQCAtNDMzLDcyICs0NjcsMzIgQEAKIAkJY3FlID0gZWhlYV9wb2xsX3JxMShxcCwgJndxZV9pbmRleCk7CiAJfQogCi0JZGV2LT5xdW90YSAtPSBwcm9jZXNzZWQ7Ci0JKmJ1ZGdldCAtPSBwcm9jZXNzZWQ7Ci0KLQlwci0+cF9zdGF0ZS5laGVhX3BvbGwgKz0gMTsKIAlwci0+cnhfcGFja2V0cyArPSBwcm9jZXNzZWQ7CisJKmJ1ZGdldCAtPSBwcm9jZXNzZWQ7CiAKIAllaGVhX3JlZmlsbF9ycTEocHIsIGxhc3Rfd3FlX2luZGV4LCBwcm9jZXNzZWRfcnExKTsKIAllaGVhX3JlZmlsbF9ycTIocHIsIHByb2Nlc3NlZF9ycTIpOwogCWVoZWFfcmVmaWxsX3JxMyhwciwgcHJvY2Vzc2VkX3JxMyk7CiAKLQlpbnRyZXEgPSAoKHByLT5wX3N0YXRlLmVoZWFfcG9sbCAmIDB4RikgPT0gMHhGKTsKLQotCWlmICghY3FlIHx8IGludHJlcSkgewotCQluZXRpZl9yeF9jb21wbGV0ZShkZXYpOwotCQllaGVhX3Jlc2V0X2NxX2VwKHByLT5yZWN2X2NxKTsKLQkJZWhlYV9yZXNldF9jcV9uMShwci0+cmVjdl9jcSk7Ci0JCWNxZSA9IGh3X3FlaXRfZ2V0X3ZhbGlkKCZxcC0+aHdfcnF1ZXVlMSk7Ci0JCWlmICghY3FlIHx8IGludHJlcSkKLQkJCXJldHVybiAwOwotCQlpZiAoIW5ldGlmX3J4X3Jlc2NoZWR1bGUoZGV2LCBteV9xdW90YSkpCi0JCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIDE7CisJY3FlID0gZWhlYV9wb2xsX3JxMShxcCwgJndxZV9pbmRleCk7CisJcmV0dXJuIGNxZTsKIH0KIAotdm9pZCBmcmVlX3NlbnRfc2ticyhzdHJ1Y3QgZWhlYV9jcWUgKmNxZSwgc3RydWN0IGVoZWFfcG9ydF9yZXMgKnByKQorc3RhdGljIHN0cnVjdCBlaGVhX2NxZSAqZWhlYV9wcm9jX2NxZXMoc3RydWN0IGVoZWFfcG9ydF9yZXMgKnByLCBpbnQgbXlfcXVvdGEpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQlpbnQgaW5kZXgsIG1heF9pbmRleF9tYXNrLCBpOwotCi0JaW5kZXggPSBFSEVBX0JNQVNLX0dFVChFSEVBX1dSX0lEX0lOREVYLCBjcWUtPndyX2lkKTsKLQltYXhfaW5kZXhfbWFzayA9IHByLT5zcV9za2JhLmxlbiAtIDE7Ci0JZm9yIChpID0gMDsgaSA8IEVIRUFfQk1BU0tfR0VUKEVIRUFfV1JfSURfUkVGSUxMLCBjcWUtPndyX2lkKTsgaSsrKSB7Ci0JCXNrYiA9IHByLT5zcV9za2JhLmFycltpbmRleF07Ci0JCWlmIChsaWtlbHkoc2tiKSkgewotCQkJZGV2X2tmcmVlX3NrYihza2IpOwotCQkJcHItPnNxX3NrYmEuYXJyW2luZGV4XSA9IE5VTEw7Ci0JCX0gZWxzZSB7Ci0JCQllaGVhX2Vycm9yKCJza2I9TlVMTCwgd3JfaWQ9JWxYLCBsb29wPSVkLCBpbmRleD0lZCIsCi0JCQkJICAgY3FlLT53cl9pZCwgaSwgaW5kZXgpOwotCQl9Ci0JCWluZGV4LS07Ci0JCWluZGV4ICY9IG1heF9pbmRleF9tYXNrOwotCX0KLX0KLQotI2RlZmluZSBNQVhfU0VORENPTVBfUVVPVEEgNDAwCi12b2lkIGVoZWFfc2VuZF9pcnFfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0Jc3RydWN0IGVoZWFfcG9ydF9yZXMgKnByID0gKHN0cnVjdCBlaGVhX3BvcnRfcmVzKilkYXRhOwogCXN0cnVjdCBlaGVhX2NxICpzZW5kX2NxID0gcHItPnNlbmRfY3E7CiAJc3RydWN0IGVoZWFfY3FlICpjcWU7Ci0JaW50IHF1b3RhID0gTUFYX1NFTkRDT01QX1FVT1RBOworCWludCBxdW90YSA9IG15X3F1b3RhOwogCWludCBjcWVfY291bnRlciA9IDA7CiAJaW50IHN3cWVfYXYgPSAwOworCWludCBpbmRleDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JZG8gewotCQljcWUgPSBlaGVhX3BvbGxfY3Eoc2VuZF9jcSk7Ci0JCWlmICghY3FlKSB7Ci0JCQllaGVhX3Jlc2V0X2NxX2VwKHNlbmRfY3EpOwotCQkJZWhlYV9yZXNldF9jcV9uMShzZW5kX2NxKTsKLQkJCWNxZSA9IGVoZWFfcG9sbF9jcShzZW5kX2NxKTsKLQkJCWlmICghY3FlKQotCQkJCWJyZWFrOwotCQl9CisJY3FlID0gZWhlYV9wb2xsX2NxKHNlbmRfY3EpOworCXdoaWxlKGNxZSAmJiAocXVvdGEgPiAwKSkgeworCQllaGVhX2luY19jcShzZW5kX2NxKTsKKwogCQljcWVfY291bnRlcisrOwogCQlybWIoKTsKIAkJaWYgKGNxZS0+c3RhdHVzICYgRUhFQV9DUUVfU1RBVF9FUlJfTUFTSykgewpAQCAtNTE0LDE3ICs1MDgsMjUgQEAKIAkJCWVoZWFfZHVtcChjcWUsIHNpemVvZigqY3FlKSwgIkNRRSIpOwogCiAJCWlmIChsaWtlbHkoRUhFQV9CTUFTS19HRVQoRUhFQV9XUl9JRF9UWVBFLCBjcWUtPndyX2lkKQotCQkJICAgPT0gRUhFQV9TV1FFMl9UWVBFKSkKLQkJCWZyZWVfc2VudF9za2JzKGNxZSwgcHIpOworCQkJICAgPT0gRUhFQV9TV1FFMl9UWVBFKSkgeworCisJCQlpbmRleCA9IEVIRUFfQk1BU0tfR0VUKEVIRUFfV1JfSURfSU5ERVgsIGNxZS0+d3JfaWQpOworCQkJc2tiID0gcHItPnNxX3NrYmEuYXJyW2luZGV4XTsKKwkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJCXByLT5zcV9za2JhLmFycltpbmRleF0gPSBOVUxMOworCQl9CiAKIAkJc3dxZV9hdiArPSBFSEVBX0JNQVNLX0dFVChFSEVBX1dSX0lEX1JFRklMTCwgY3FlLT53cl9pZCk7CiAJCXF1b3RhLS07Ci0JfSB3aGlsZSAocXVvdGEgPiAwKTsKKworCQljcWUgPSBlaGVhX3BvbGxfY3Eoc2VuZF9jcSk7CisJfTsKIAogCWVoZWFfdXBkYXRlX2ZlY2Eoc2VuZF9jcSwgY3FlX2NvdW50ZXIpOwogCWF0b21pY19hZGQoc3dxZV9hdiwgJnByLT5zd3FlX2F2YWlsKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwci0+bmV0aWZfcXVldWUsIGZsYWdzKTsKKwogCWlmIChwci0+cXVldWVfc3RvcHBlZCAmJiAoYXRvbWljX3JlYWQoJnByLT5zd3FlX2F2YWlsKQogCQkJCSAgPj0gcHItPnN3cWVfcmVmaWxsX3RoKSkgewogCQluZXRpZl93YWtlX3F1ZXVlKHByLT5wb3J0LT5uZXRkZXYpOwpAQCAtNTMyLDIyICs1MzQsNTUgQEAKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHItPm5ldGlmX3F1ZXVlLCBmbGFncyk7CiAKLQlpZiAodW5saWtlbHkoY3FlKSkKLQkJdGFza2xldF9oaV9zY2hlZHVsZSgmcHItPnNlbmRfY29tcF90YXNrKTsKKwlyZXR1cm4gY3FlOwogfQogCi1zdGF0aWMgaXJxcmV0dXJuX3QgZWhlYV9zZW5kX2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKnBhcmFtKQorI2RlZmluZSBFSEVBX05BUElfUE9MTF9OVU1fQkVGT1JFX0lSUSAxNgorCitzdGF0aWMgaW50IGVoZWFfcG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgKmJ1ZGdldCkKIHsKLQlzdHJ1Y3QgZWhlYV9wb3J0X3JlcyAqcHIgPSBwYXJhbTsKLQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwci0+c2VuZF9jb21wX3Rhc2spOwotCXJldHVybiBJUlFfSEFORExFRDsKKwlzdHJ1Y3QgZWhlYV9wb3J0X3JlcyAqcHIgPSBkZXYtPnByaXY7CisJc3RydWN0IGVoZWFfY3FlICpjcWU7CisJc3RydWN0IGVoZWFfY3FlICpjcWVfc2tiID0gTlVMTDsKKwlpbnQgZm9yY2VfaXJxLCB3cWVfaW5kZXg7CisKKwljcWUgPSBlaGVhX3BvbGxfcnExKHByLT5xcCwgJndxZV9pbmRleCk7CisJY3FlX3NrYiA9IGVoZWFfcG9sbF9jcShwci0+c2VuZF9jcSk7CisKKwlmb3JjZV9pcnEgPSAocHItPnBvbGxfY291bnRlciA+IEVIRUFfTkFQSV9QT0xMX05VTV9CRUZPUkVfSVJRKTsKKworCWlmICgoIWNxZSAmJiAhY3FlX3NrYikgfHwgZm9yY2VfaXJxKSB7CisJCXByLT5wb2xsX2NvdW50ZXIgPSAwOworCQluZXRpZl9yeF9jb21wbGV0ZShkZXYpOworCQllaGVhX3Jlc2V0X2NxX2VwKHByLT5yZWN2X2NxKTsKKwkJZWhlYV9yZXNldF9jcV9lcChwci0+c2VuZF9jcSk7CisJCWVoZWFfcmVzZXRfY3FfbjEocHItPnJlY3ZfY3EpOworCQllaGVhX3Jlc2V0X2NxX24xKHByLT5zZW5kX2NxKTsKKwkJY3FlID0gZWhlYV9wb2xsX3JxMShwci0+cXAsICZ3cWVfaW5kZXgpOworCQljcWVfc2tiID0gZWhlYV9wb2xsX2NxKHByLT5zZW5kX2NxKTsKKworCQlpZiAoIWNxZSAmJiAhY3FlX3NrYikKKwkJCXJldHVybiAwOworCisJCWlmICghbmV0aWZfcnhfcmVzY2hlZHVsZShkZXYsIGRldi0+cXVvdGEpKQorCQkJcmV0dXJuIDA7CisJfQorCisJY3FlID0gZWhlYV9wcm9jX3J3cWVzKGRldiwgcHIsIGJ1ZGdldCk7CisJY3FlX3NrYiA9IGVoZWFfcHJvY19jcWVzKHByLCAzMDApOworCisJaWYgKGNxZSB8fCBjcWVfc2tiKQorCQlwci0+cG9sbF9jb3VudGVyKys7CisKKwlyZXR1cm4gMTsKIH0KIAogc3RhdGljIGlycXJldHVybl90IGVoZWFfcmVjdl9pcnFfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpwYXJhbSkKIHsKIAlzdHJ1Y3QgZWhlYV9wb3J0X3JlcyAqcHIgPSBwYXJhbTsKLQlzdHJ1Y3QgZWhlYV9wb3J0ICpwb3J0ID0gcHItPnBvcnQ7Ci0JbmV0aWZfcnhfc2NoZWR1bGUocG9ydC0+bmV0ZGV2KTsKKworCW5ldGlmX3J4X3NjaGVkdWxlKHByLT5kX25ldGRldik7CisKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKQEAgLTU4MCw3ICs2MTUsNyBAQAogewogCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPm51bV9wb3J0czsgaSsrKQorCWZvciAoaSA9IDA7IGkgPCBFSEVBX01BWF9QT1JUUzsgaSsrKQogCQlpZiAoYWRhcHRlci0+cG9ydFtpXSkKIAkgICAgICAgICAgICAgICAgaWYgKGFkYXB0ZXItPnBvcnRbaV0tPmxvZ2ljYWxfcG9ydF9pZCA9PSBsb2dpY2FsX3BvcnQpCiAJCQkJcmV0dXJuIGFkYXB0ZXItPnBvcnRbaV07CkBAIC02NTAsMTkgKzY4NSwyNSBAQAogCX0KIAogCXBvcnQtPmF1dG9uZWcgPSAxOworCXBvcnQtPm51bV9tY3MgPSBjYjAtPm51bV9kZWZhdWx0X3FwczsKIAogCS8qIE51bWJlciBvZiBkZWZhdWx0IFFQcyAqLwotCXBvcnQtPm51bV9kZWZfcXBzID0gY2IwLT5udW1fZGVmYXVsdF9xcHM7CisJaWYgKHVzZV9tY3MpCisJCXBvcnQtPm51bV9kZWZfcXBzID0gY2IwLT5udW1fZGVmYXVsdF9xcHM7CisJZWxzZQorCQlwb3J0LT5udW1fZGVmX3FwcyA9IDE7CiAKIAlpZiAoIXBvcnQtPm51bV9kZWZfcXBzKSB7CiAJCXJldCA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0X2ZyZWU7CiAJfQogCi0JaWYgKHBvcnQtPm51bV9kZWZfcXBzID49IEVIRUFfTlVNX1RYX1FQKQorCXBvcnQtPm51bV90eF9xcHMgPSBudW1fdHhfcXBzOworCisJaWYgKHBvcnQtPm51bV9kZWZfcXBzID49IHBvcnQtPm51bV90eF9xcHMpCiAJCXBvcnQtPm51bV9hZGRfdHhfcXBzID0gMDsKIAllbHNlCi0JCXBvcnQtPm51bV9hZGRfdHhfcXBzID0gRUhFQV9OVU1fVFhfUVAgLSBwb3J0LT5udW1fZGVmX3FwczsKKwkJcG9ydC0+bnVtX2FkZF90eF9xcHMgPSBwb3J0LT5udW1fdHhfcXBzIC0gcG9ydC0+bnVtX2RlZl9xcHM7CiAKIAlyZXQgPSAwOwogb3V0X2ZyZWU6CkBAIC04ODIsMjMgKzkyMyw2IEBACiAJc3RydWN0IGVoZWFfcG9ydF9yZXMgKnByOwogCWludCBpLCByZXQ7CiAKLQlmb3IgKGkgPSAwOyBpIDwgcG9ydC0+bnVtX2RlZl9xcHM7IGkrKykgewotCQlwciA9ICZwb3J0LT5wb3J0X3Jlc1tpXTsKLQkJc25wcmludGYocHItPmludF9yZWN2X25hbWUsIEVIRUFfSVJRX05BTUVfU0laRSAtIDEKLQkJCSAsICIlcy1yZWN2JWQiLCBkZXYtPm5hbWUsIGkpOwotCQlyZXQgPSBpYm1lYnVzX3JlcXVlc3RfaXJxKE5VTEwsIHByLT5yZWN2X2VxLT5hdHRyLmlzdDEsCi0JCQkJCSAgZWhlYV9yZWN2X2lycV9oYW5kbGVyLAotCQkJCQkgIElSUUZfRElTQUJMRUQsIHByLT5pbnRfcmVjdl9uYW1lLCBwcik7Ci0JCWlmIChyZXQpIHsKLQkJCWVoZWFfZXJyb3IoImZhaWxlZCByZWdpc3RlcmluZyBpcnEgZm9yIGVoZWFfcmVjdl9pbnQ6IgotCQkJCSAgICJwb3J0X3Jlc19ucjolZCwgaXN0PSVYIiwgaSwKLQkJCQkgICBwci0+cmVjdl9lcS0+YXR0ci5pc3QxKTsKLQkJCWdvdG8gb3V0X2ZyZWVfc2VxOwotCQl9Ci0JCWlmIChuZXRpZl9tc2dfaWZ1cChwb3J0KSkKLQkJCWVoZWFfaW5mbygiaXJxX2hhbmRsZSAweCVYIGZvciBmdW5jdCBlaGVhX3JlY3ZfaW50ICVkICIKLQkJCQkgICJyZWdpc3RlcmVkIiwgcHItPnJlY3ZfZXEtPmF0dHIuaXN0MSwgaSk7Ci0JfQogCiAJc25wcmludGYocG9ydC0+aW50X2FmZl9uYW1lLCBFSEVBX0lSUV9OQU1FX1NJWkUgLSAxLCAiJXMtYWZmIiwKIAkJIGRldi0+bmFtZSk7CkBAIC05MTYsNDEgKzk0MCw0MSBAQAogCQllaGVhX2luZm8oImlycV9oYW5kbGUgMHglWCBmb3IgZnVuY3Rpb24gcXBfYWZmX2lycV9oYW5kbGVyICIKIAkJCSAgInJlZ2lzdGVyZWQiLCBwb3J0LT5xcF9lcS0+YXR0ci5pc3QxKTsKIAorCiAJZm9yIChpID0gMDsgaSA8IHBvcnQtPm51bV9kZWZfcXBzICsgcG9ydC0+bnVtX2FkZF90eF9xcHM7IGkrKykgewogCQlwciA9ICZwb3J0LT5wb3J0X3Jlc1tpXTsKIAkJc25wcmludGYocHItPmludF9zZW5kX25hbWUsIEVIRUFfSVJRX05BTUVfU0laRSAtIDEsCi0JCQkgIiVzLXNlbmQlZCIsIGRldi0+bmFtZSwgaSk7Ci0JCXJldCA9IGlibWVidXNfcmVxdWVzdF9pcnEoTlVMTCwgcHItPnNlbmRfZXEtPmF0dHIuaXN0MSwKLQkJCQkJICBlaGVhX3NlbmRfaXJxX2hhbmRsZXIsCisJCQkgIiVzLXF1ZXVlJWQiLCBkZXYtPm5hbWUsIGkpOworCQlyZXQgPSBpYm1lYnVzX3JlcXVlc3RfaXJxKE5VTEwsIHByLT5lcS0+YXR0ci5pc3QxLAorCQkJCQkgIGVoZWFfcmVjdl9pcnFfaGFuZGxlciwKIAkJCQkJICBJUlFGX0RJU0FCTEVELCBwci0+aW50X3NlbmRfbmFtZSwKIAkJCQkJICBwcik7CiAJCWlmIChyZXQpIHsKLQkJCWVoZWFfZXJyb3IoImZhaWxlZCByZWdpc3RlcmluZyBpcnEgZm9yIGVoZWFfc2VuZCAiCisJCQllaGVhX2Vycm9yKCJmYWlsZWQgcmVnaXN0ZXJpbmcgaXJxIGZvciBlaGVhX3F1ZXVlICIKIAkJCQkgICAicG9ydF9yZXNfbnI6JWQsIGlzdD0lWCIsIGksCi0JCQkJICAgcHItPnNlbmRfZXEtPmF0dHIuaXN0MSk7CisJCQkJICAgcHItPmVxLT5hdHRyLmlzdDEpOwogCQkJZ290byBvdXRfZnJlZV9yZXE7CiAJCX0KIAkJaWYgKG5ldGlmX21zZ19pZnVwKHBvcnQpKQotCQkJZWhlYV9pbmZvKCJpcnFfaGFuZGxlIDB4JVggZm9yIGZ1bmN0aW9uIGVoZWFfc2VuZF9pbnQgIgotCQkJCSAgIiVkIHJlZ2lzdGVyZWQiLCBwci0+c2VuZF9lcS0+YXR0ci5pc3QxLCBpKTsKKwkJCWVoZWFfaW5mbygiaXJxX2hhbmRsZSAweCVYIGZvciBmdW5jdGlvbiBlaGVhX3F1ZXVlX2ludCAiCisJCQkJICAiJWQgcmVnaXN0ZXJlZCIsIHByLT5lcS0+YXR0ci5pc3QxLCBpKTsKIAl9CiBvdXQ6CiAJcmV0dXJuIHJldDsKIAorCiBvdXRfZnJlZV9yZXE6CiAJd2hpbGUgKC0taSA+PSAwKSB7Ci0JCXUzMiBpc3QgPSBwb3J0LT5wb3J0X3Jlc1tpXS5zZW5kX2VxLT5hdHRyLmlzdDE7CisJCXUzMiBpc3QgPSBwb3J0LT5wb3J0X3Jlc1tpXS5lcS0+YXR0ci5pc3QxOwogCQlpYm1lYnVzX2ZyZWVfaXJxKE5VTEwsIGlzdCwgJnBvcnQtPnBvcnRfcmVzW2ldKTsKIAl9CisKIG91dF9mcmVlX3FwZXE6CiAJaWJtZWJ1c19mcmVlX2lycShOVUxMLCBwb3J0LT5xcF9lcS0+YXR0ci5pc3QxLCBwb3J0KTsKIAlpID0gcG9ydC0+bnVtX2RlZl9xcHM7Ci1vdXRfZnJlZV9zZXE6Ci0Jd2hpbGUgKC0taSA+PSAwKSB7Ci0JCXUzMiBpc3QgPSBwb3J0LT5wb3J0X3Jlc1tpXS5yZWN2X2VxLT5hdHRyLmlzdDE7Ci0JCWlibWVidXNfZnJlZV9pcnEoTlVMTCwgaXN0LCAmcG9ydC0+cG9ydF9yZXNbaV0pOwotCX0KKwogCWdvdG8gb3V0OworCiB9CiAKIHN0YXRpYyB2b2lkIGVoZWFfZnJlZV9pbnRlcnJ1cHRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC05NjAsMjEgKzk4NCwxMyBAQAogCWludCBpOwogCiAJLyogc2VuZCAqLworCiAJZm9yIChpID0gMDsgaSA8IHBvcnQtPm51bV9kZWZfcXBzICsgcG9ydC0+bnVtX2FkZF90eF9xcHM7IGkrKykgewogCQlwciA9ICZwb3J0LT5wb3J0X3Jlc1tpXTsKLQkJaWJtZWJ1c19mcmVlX2lycShOVUxMLCBwci0+c2VuZF9lcS0+YXR0ci5pc3QxLCBwcik7CisJCWlibWVidXNfZnJlZV9pcnEoTlVMTCwgcHItPmVxLT5hdHRyLmlzdDEsIHByKTsKIAkJaWYgKG5ldGlmX21zZ19pbnRyKHBvcnQpKQogCQkJZWhlYV9pbmZvKCJmcmVlIHNlbmQgaXJxIGZvciByZXMgJWQgd2l0aCBoYW5kbGUgMHglWCIsCi0JCQkJICBpLCBwci0+c2VuZF9lcS0+YXR0ci5pc3QxKTsKLQl9Ci0KLQkvKiByZWNlaXZlICovCi0JZm9yIChpID0gMDsgaSA8IHBvcnQtPm51bV9kZWZfcXBzOyBpKyspIHsKLQkJcHIgPSAmcG9ydC0+cG9ydF9yZXNbaV07Ci0JCWlibWVidXNfZnJlZV9pcnEoTlVMTCwgcHItPnJlY3ZfZXEtPmF0dHIuaXN0MSwgcHIpOwotCQlpZiAobmV0aWZfbXNnX2ludHIocG9ydCkpCi0JCQllaGVhX2luZm8oImZyZWUgcmVjdiBpcnEgZm9yIHJlcyAlZCB3aXRoIGhhbmRsZSAweCVYIiwKLQkJCQkgIGksIHByLT5yZWN2X2VxLT5hdHRyLmlzdDEpOworCQkJCSAgaSwgcHItPmVxLT5hdHRyLmlzdDEpOwogCX0KIAogCS8qIGFzc29jaWF0ZWQgZXZlbnRzICovCkBAIC0xMDAzLDggKzEwMTksMTMgQEAKIAkJCQkgICAgICBQWExZX1JDX1ZMQU5fRklMVEVSKQogCQkgICAgIHwgRUhFQV9CTUFTS19TRVQoUFhMWV9SQ19KVU1CT19GUkFNRSwgMSk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgcG9ydC0+bnVtX2RlZl9xcHM7IGkrKykKLQkJY2IwLT5kZWZhdWx0X3Fwbl9hcnJbaV0gPSBwb3J0LT5wb3J0X3Jlc1swXS5xcC0+aW5pdF9hdHRyLnFwX25yOworCWZvciAoaSA9IDA7IGkgPCBwb3J0LT5udW1fbWNzOyBpKyspCisJCWlmICh1c2VfbWNzKQorCQkJY2IwLT5kZWZhdWx0X3Fwbl9hcnJbaV0gPQorCQkJCXBvcnQtPnBvcnRfcmVzW2ldLnFwLT5pbml0X2F0dHIucXBfbnI7CisJCWVsc2UKKwkJCWNiMC0+ZGVmYXVsdF9xcG5fYXJyW2ldID0KKwkJCQlwb3J0LT5wb3J0X3Jlc1swXS5xcC0+aW5pdF9hdHRyLnFwX25yOwogCiAJaWYgKG5ldGlmX21zZ19pZnVwKHBvcnQpKQogCQllaGVhX2R1bXAoY2IwLCBzaXplb2YoKmNiMCksICJlaGVhX2NvbmZpZ3VyZV9wb3J0Iik7CkBAIC0xMDI3LDUyICsxMDQ4LDM1IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBlaGVhX2dlbl9zbXJzKHN0cnVjdCBlaGVhX3BvcnRfcmVzICpwcikKK2ludCBlaGVhX2dlbl9zbXJzKHN0cnVjdCBlaGVhX3BvcnRfcmVzICpwcikKIHsKLQl1NjQgaHJldDsKKwlpbnQgcmV0OwogCXN0cnVjdCBlaGVhX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwci0+cG9ydC0+YWRhcHRlcjsKIAotCWhyZXQgPSBlaGVhX2hfcmVnaXN0ZXJfc21yKGFkYXB0ZXItPmhhbmRsZSwgYWRhcHRlci0+bXIuaGFuZGxlLAotCQkJCSAgIGFkYXB0ZXItPm1yLnZhZGRyLCBFSEVBX01SX0FDQ19DVFJMLAotCQkJCSAgIGFkYXB0ZXItPnBkLCAmcHItPnNlbmRfbXIpOwotCWlmIChocmV0ICE9IEhfU1VDQ0VTUykKKwlyZXQgPSBlaGVhX2dlbl9zbXIoYWRhcHRlciwgJmFkYXB0ZXItPm1yLCAmcHItPnNlbmRfbXIpOworCWlmIChyZXQpCiAJCWdvdG8gb3V0OwogCi0JaHJldCA9IGVoZWFfaF9yZWdpc3Rlcl9zbXIoYWRhcHRlci0+aGFuZGxlLCBhZGFwdGVyLT5tci5oYW5kbGUsCi0JCQkJICAgYWRhcHRlci0+bXIudmFkZHIsIEVIRUFfTVJfQUNDX0NUUkwsCi0JCQkJICAgYWRhcHRlci0+cGQsICZwci0+cmVjdl9tcik7Ci0JaWYgKGhyZXQgIT0gSF9TVUNDRVNTKQotCQlnb3RvIG91dF9mcmVlcmVzOworCXJldCA9IGVoZWFfZ2VuX3NtcihhZGFwdGVyLCAmYWRhcHRlci0+bXIsICZwci0+cmVjdl9tcik7CisJaWYgKHJldCkKKwkJZ290byBvdXRfZnJlZTsKIAogCXJldHVybiAwOwogCi1vdXRfZnJlZXJlczoKLQlocmV0ID0gZWhlYV9oX2ZyZWVfcmVzb3VyY2UoYWRhcHRlci0+aGFuZGxlLCBwci0+c2VuZF9tci5oYW5kbGUpOwotCWlmIChocmV0ICE9IEhfU1VDQ0VTUykKLQkJZWhlYV9lcnJvcigiZmFpbGVkIGZyZWVpbmcgU01SIik7CitvdXRfZnJlZToKKwllaGVhX3JlbV9tcigmcHItPnNlbmRfbXIpOwogb3V0OgorCWVoZWFfZXJyb3IoIkdlbmVyYXRpbmcgU01SUyBmYWlsZWRcbiIpOwogCXJldHVybiAtRUlPOwogfQogCi1zdGF0aWMgaW50IGVoZWFfcmVtX3NtcnMoc3RydWN0IGVoZWFfcG9ydF9yZXMgKnByKQoraW50IGVoZWFfcmVtX3NtcnMoc3RydWN0IGVoZWFfcG9ydF9yZXMgKnByKQogewotCXN0cnVjdCBlaGVhX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwci0+cG9ydC0+YWRhcHRlcjsKLQlpbnQgcmV0ID0gMDsKLQl1NjQgaHJldDsKLQotCWhyZXQgPSBlaGVhX2hfZnJlZV9yZXNvdXJjZShhZGFwdGVyLT5oYW5kbGUsIHByLT5zZW5kX21yLmhhbmRsZSk7Ci0JaWYgKGhyZXQgIT0gSF9TVUNDRVNTKSB7Ci0JCXJldCA9IC1FSU87Ci0JCWVoZWFfZXJyb3IoImZhaWxlZCBmcmVlaW5nIHNlbmQgU01SIGZvciBwcj0lcCIsIHByKTsKLQl9Ci0KLQlocmV0ID0gZWhlYV9oX2ZyZWVfcmVzb3VyY2UoYWRhcHRlci0+aGFuZGxlLCBwci0+cmVjdl9tci5oYW5kbGUpOwotCWlmIChocmV0ICE9IEhfU1VDQ0VTUykgewotCQlyZXQgPSAtRUlPOwotCQllaGVhX2Vycm9yKCJmYWlsZWQgZnJlZWluZyByZWN2IFNNUiBmb3IgcHI9JXAiLCBwcik7Ci0JfQotCi0JcmV0dXJuIHJldDsKKwlpZiAoKGVoZWFfcmVtX21yKCZwci0+c2VuZF9tcikpCisJICAgIHx8IChlaGVhX3JlbV9tcigmcHItPnJlY3ZfbXIpKSkKKwkJcmV0dXJuIC1FSU87CisJZWxzZQorCQlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBlaGVhX2luaXRfcV9za2JhKHN0cnVjdCBlaGVhX3Ffc2tiX2FyciAqcV9za2JhLCBpbnQgbWF4X3FfZW50cmllcykKQEAgLTExMDMsMjUgKzExMDcsMTcgQEAKIAltZW1zZXQocHIsIDAsIHNpemVvZihzdHJ1Y3QgZWhlYV9wb3J0X3JlcykpOwogCiAJcHItPnBvcnQgPSBwb3J0OwotCXNwaW5fbG9ja19pbml0KCZwci0+c2VuZF9sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmcHItPnJlY3ZfbG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJnByLT54bWl0X2xvY2spOwogCXNwaW5fbG9ja19pbml0KCZwci0+bmV0aWZfcXVldWUpOwogCi0JcHItPnJlY3ZfZXEgPSBlaGVhX2NyZWF0ZV9lcShhZGFwdGVyLCBlcV90eXBlLCBFSEVBX01BWF9FTlRSSUVTX0VRLCAwKTsKLQlpZiAoIXByLT5yZWN2X2VxKSB7Ci0JCWVoZWFfZXJyb3IoImNyZWF0ZV9lcSBmYWlsZWQgKHJlY3ZfZXEpIik7Ci0JCWdvdG8gb3V0X2ZyZWU7Ci0JfQotCi0JcHItPnNlbmRfZXEgPSBlaGVhX2NyZWF0ZV9lcShhZGFwdGVyLCBlcV90eXBlLCBFSEVBX01BWF9FTlRSSUVTX0VRLCAwKTsKLQlpZiAoIXByLT5zZW5kX2VxKSB7Ci0JCWVoZWFfZXJyb3IoImNyZWF0ZV9lcSBmYWlsZWQgKHNlbmRfZXEpIik7CisJcHItPmVxID0gZWhlYV9jcmVhdGVfZXEoYWRhcHRlciwgZXFfdHlwZSwgRUhFQV9NQVhfRU5UUklFU19FUSwgMCk7CisJaWYgKCFwci0+ZXEpIHsKKwkJZWhlYV9lcnJvcigiY3JlYXRlX2VxIGZhaWxlZCAoZXEpIik7CiAJCWdvdG8gb3V0X2ZyZWU7CiAJfQogCiAJcHItPnJlY3ZfY3EgPSBlaGVhX2NyZWF0ZV9jcShhZGFwdGVyLCBwcl9jZmctPm1heF9lbnRyaWVzX3JjcSwKLQkJCQkgICAgIHByLT5yZWN2X2VxLT5md19oYW5kbGUsCisJCQkJICAgICBwci0+ZXEtPmZ3X2hhbmRsZSwKIAkJCQkgICAgIHBvcnQtPmxvZ2ljYWxfcG9ydF9pZCk7CiAJaWYgKCFwci0+cmVjdl9jcSkgewogCQllaGVhX2Vycm9yKCJjcmVhdGVfY3EgZmFpbGVkIChjcV9yZWN2KSIpOwpAQCAtMTEyOSw3ICsxMTI1LDcgQEAKIAl9CiAKIAlwci0+c2VuZF9jcSA9IGVoZWFfY3JlYXRlX2NxKGFkYXB0ZXIsIHByX2NmZy0+bWF4X2VudHJpZXNfc2NxLAotCQkJCSAgICAgcHItPnNlbmRfZXEtPmZ3X2hhbmRsZSwKKwkJCQkgICAgIHByLT5lcS0+ZndfaGFuZGxlLAogCQkJCSAgICAgcG9ydC0+bG9naWNhbF9wb3J0X2lkKTsKIAlpZiAoIXByLT5zZW5kX2NxKSB7CiAJCWVoZWFfZXJyb3IoImNyZWF0ZV9jcSBmYWlsZWQgKGNxX3NlbmQpIik7CkBAIC0xMTk0LDExICsxMTkwLDIwIEBACiAJCXJldCA9IC1FSU87CiAJCWdvdG8gb3V0X2ZyZWU7CiAJfQotCXRhc2tsZXRfaW5pdCgmcHItPnNlbmRfY29tcF90YXNrLCBlaGVhX3NlbmRfaXJxX3Rhc2tsZXQsCi0JCSAgICAgKHVuc2lnbmVkIGxvbmcpcHIpOworCiAJYXRvbWljX3NldCgmcHItPnN3cWVfYXZhaWwsIGluaXRfYXR0ci0+YWN0X25yX3NlbmRfd3FlcyAtIDEpOwogCiAJa2ZyZWUoaW5pdF9hdHRyKTsKKworCXByLT5kX25ldGRldiA9IGFsbG9jX25ldGRldigwLCAiIiwgZXRoZXJfc2V0dXApOworCWlmICghcHItPmRfbmV0ZGV2KQorCQlnb3RvIG91dF9mcmVlOworCXByLT5kX25ldGRldi0+cHJpdiA9IHByOworCXByLT5kX25ldGRldi0+d2VpZ2h0ID0gNjQ7CisJcHItPmRfbmV0ZGV2LT5wb2xsID0gZWhlYV9wb2xsOworCXNldF9iaXQoX19MSU5LX1NUQVRFX1NUQVJULCAmcHItPmRfbmV0ZGV2LT5zdGF0ZSk7CisJc3RyY3B5KHByLT5kX25ldGRldi0+bmFtZSwgcG9ydC0+bmV0ZGV2LT5uYW1lKTsKKwogCXJldCA9IDA7CiAJZ290byBvdXQ7CiAKQEAgLTEyMTEsOCArMTIxNiw3IEBACiAJZWhlYV9kZXN0cm95X3FwKHByLT5xcCk7CiAJZWhlYV9kZXN0cm95X2NxKHByLT5zZW5kX2NxKTsKIAllaGVhX2Rlc3Ryb3lfY3EocHItPnJlY3ZfY3EpOwotCWVoZWFfZGVzdHJveV9lcShwci0+c2VuZF9lcSk7Ci0JZWhlYV9kZXN0cm95X2VxKHByLT5yZWN2X2VxKTsKKwllaGVhX2Rlc3Ryb3lfZXEocHItPmVxKTsKIG91dDoKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTIyMSwxMyArMTIyNSwxNCBAQAogewogCWludCByZXQsIGk7CiAKKwlmcmVlX25ldGRldihwci0+ZF9uZXRkZXYpOworCiAJcmV0ID0gZWhlYV9kZXN0cm95X3FwKHByLT5xcCk7CiAKIAlpZiAoIXJldCkgewogCQllaGVhX2Rlc3Ryb3lfY3EocHItPnNlbmRfY3EpOwogCQllaGVhX2Rlc3Ryb3lfY3EocHItPnJlY3ZfY3EpOwotCQllaGVhX2Rlc3Ryb3lfZXEocHItPnNlbmRfZXEpOwotCQllaGVhX2Rlc3Ryb3lfZXEocHItPnJlY3ZfZXEpOworCQllaGVhX2Rlc3Ryb3lfZXEocHItPmVxKTsKIAogCQlmb3IgKGkgPSAwOyBpIDwgcHItPnJxMV9za2JhLmxlbjsgaSsrKQogCQkJaWYgKHByLT5ycTFfc2tiYS5hcnJbaV0pCkBAIC0xMjYyLDggKzEyNjcsOCBAQAogc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX2lwX3N0YXJ0X2VuZChzdHJ1Y3QgZWhlYV9zd3FlICpzd3FlLAogCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0Jc3dxZS0+aXBfc3RhcnQgPSAodTgpKCgodTY0KXNrYi0+bmguaXBoKSAtICgodTY0KXNrYi0+ZGF0YSkpOwotCXN3cWUtPmlwX2VuZCA9ICh1OCkoc3dxZS0+aXBfc3RhcnQgKyBza2ItPm5oLmlwaC0+aWhsICogNCAtIDEpOworCXN3cWUtPmlwX3N0YXJ0ID0gc2tiX25ldHdvcmtfb2Zmc2V0KHNrYik7CisJc3dxZS0+aXBfZW5kID0gKHU4KShzd3FlLT5pcF9zdGFydCArIGlwX2hkcmxlbihza2IpIC0gMSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV90Y3Bfb2Zmc2V0X2VuZChzdHJ1Y3QgZWhlYV9zd3FlICpzd3FlLApAQCAtMTMwMCwxMyArMTMwNSwxMyBAQAogCS8qIGNvcHkgb25seSBldGgvaXAvdGNwIGhlYWRlcnMgdG8gaW1tZWRpYXRlIGRhdGEgYW5kCiAJICogdGhlIHJlc3Qgb2Ygc2tiLT5kYXRhIHRvIHNnMWVudHJ5CiAJICovCi0JaGVhZGVyc2l6ZSA9IEVUSF9ITEVOICsgKHNrYi0+bmguaXBoLT5paGwgKiA0KSArIChza2ItPmgudGgtPmRvZmYgKiA0KTsKKwloZWFkZXJzaXplID0gRVRIX0hMRU4gKyBpcF9oZHJsZW4oc2tiKSArIHRjcF9oZHJsZW4oc2tiKTsKIAogCXNrYl9kYXRhX3NpemUgPSBza2ItPmxlbiAtIHNrYi0+ZGF0YV9sZW47CiAKIAlpZiAoc2tiX2RhdGFfc2l6ZSA+PSBoZWFkZXJzaXplKSB7CiAJCS8qIGNvcHkgaW1tZWRpYXRlIGRhdGEgKi8KLQkJbWVtY3B5KGltbV9kYXRhLCBza2ItPmRhdGEsIGhlYWRlcnNpemUpOworCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgaW1tX2RhdGEsIGhlYWRlcnNpemUpOwogCQlzd3FlLT5pbW1lZGlhdGVfZGF0YV9sZW5ndGggPSBoZWFkZXJzaXplOwogCiAJCWlmIChza2JfZGF0YV9zaXplID4gaGVhZGVyc2l6ZSkgewpAQCAtMTMzNyw3ICsxMzQyLDcgQEAKIAkgKi8KIAlpZiAoc2tiX2RhdGFfc2l6ZSA+PSBTV1FFMl9NQVhfSU1NKSB7CiAJCS8qIGNvcHkgaW1tZWRpYXRlIGRhdGEgKi8KLQkJbWVtY3B5KGltbV9kYXRhLCBza2ItPmRhdGEsIFNXUUUyX01BWF9JTU0pOworCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgaW1tX2RhdGEsIFNXUUUyX01BWF9JTU0pOwogCiAJCXN3cWUtPmltbWVkaWF0ZV9kYXRhX2xlbmd0aCA9IFNXUUUyX01BWF9JTU07CiAKQEAgLTEzNTAsNyArMTM1NSw3IEBACiAJCQlzd3FlLT5kZXNjcmlwdG9ycysrOwogCQl9CiAJfSBlbHNlIHsKLQkJbWVtY3B5KGltbV9kYXRhLCBza2ItPmRhdGEsIHNrYl9kYXRhX3NpemUpOworCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgaW1tX2RhdGEsIHNrYl9kYXRhX3NpemUpOwogCQlzd3FlLT5pbW1lZGlhdGVfZGF0YV9sZW5ndGggPSBza2JfZGF0YV9zaXplOwogCX0KIH0KQEAgLTE2ODgsNiArMTY5Myw3IEBACiAJCSAgICAgICBzdHJ1Y3QgZWhlYV9zd3FlICpzd3FlLCB1MzIgbGtleSkKIHsKIAlpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9JUCkpIHsKKwkJY29uc3Qgc3RydWN0IGlwaGRyICppcGggPSBpcF9oZHIoc2tiKTsKIAkJLyogSVB2NCAqLwogCQlzd3FlLT50eF9jb250cm9sIHw9IEVIRUFfU1dRRV9DUkMKIAkJCQkgfCBFSEVBX1NXUUVfSVBfQ0hFQ0tTVU0KQEAgLTE2OTcsMTUgKzE3MDMsMTUgQEAKIAogCQl3cml0ZV9pcF9zdGFydF9lbmQoc3dxZSwgc2tiKTsKIAotCQlpZiAoc2tiLT5uaC5pcGgtPnByb3RvY29sID09IElQUFJPVE9fVURQKSB7Ci0JCQlpZiAoKHNrYi0+bmguaXBoLT5mcmFnX29mZiAmIElQX01GKSB8fAotCQkJICAgIChza2ItPm5oLmlwaC0+ZnJhZ19vZmYgJiBJUF9PRkZTRVQpKQorCQlpZiAoaXBoLT5wcm90b2NvbCA9PSBJUFBST1RPX1VEUCkgeworCQkJaWYgKChpcGgtPmZyYWdfb2ZmICYgSVBfTUYpIHx8CisJCQkgICAgKGlwaC0+ZnJhZ19vZmYgJiBJUF9PRkZTRVQpKQogCQkJCS8qIElQIGZyYWdtZW50LCBzbyBkb24ndCBjaGFuZ2UgY3MgKi8KIAkJCQlzd3FlLT50eF9jb250cm9sICY9IH5FSEVBX1NXUUVfVENQX0NIRUNLU1VNOwogCQkJZWxzZQogCQkJCXdyaXRlX3VkcF9vZmZzZXRfZW5kKHN3cWUsIHNrYik7CiAKLQkJfSBlbHNlIGlmIChza2ItPm5oLmlwaC0+cHJvdG9jb2wgPT0gSVBQUk9UT19UQ1ApIHsKKwkJfSBlbHNlIGlmIChpcGgtPnByb3RvY29sID09IElQUFJPVE9fVENQKSB7CiAJCQl3cml0ZV90Y3Bfb2Zmc2V0X2VuZChzd3FlLCBza2IpOwogCQl9CiAKQEAgLTE3MzEsMTAgKzE3MzcsMTEgQEAKIAlpbnQgaTsKIAogCWlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX0lQKSkgeworCQljb25zdCBzdHJ1Y3QgaXBoZHIgKmlwaCA9IGlwX2hkcihza2IpOwogCQkvKiBJUHY0ICovCiAJCXdyaXRlX2lwX3N0YXJ0X2VuZChzd3FlLCBza2IpOwogCi0JCWlmIChza2ItPm5oLmlwaC0+cHJvdG9jb2wgPT0gSVBQUk9UT19UQ1ApIHsKKwkJaWYgKGlwaC0+cHJvdG9jb2wgPT0gSVBQUk9UT19UQ1ApIHsKIAkJCXN3cWUtPnR4X2NvbnRyb2wgfD0gRUhFQV9TV1FFX0NSQwogCQkJCQkgfCBFSEVBX1NXUUVfSVBfQ0hFQ0tTVU0KIAkJCQkJIHwgRUhFQV9TV1FFX1RDUF9DSEVDS1NVTQpAQCAtMTc0Miw5ICsxNzQ5LDkgQEAKIAogCQkJd3JpdGVfdGNwX29mZnNldF9lbmQoc3dxZSwgc2tiKTsKIAotCQl9IGVsc2UgaWYgKHNrYi0+bmguaXBoLT5wcm90b2NvbCA9PSBJUFBST1RPX1VEUCkgewotCQkJaWYgKChza2ItPm5oLmlwaC0+ZnJhZ19vZmYgJiBJUF9NRikgfHwKLQkJCSAgICAoc2tiLT5uaC5pcGgtPmZyYWdfb2ZmICYgSVBfT0ZGU0VUKSkKKwkJfSBlbHNlIGlmIChpcGgtPnByb3RvY29sID09IElQUFJPVE9fVURQKSB7CisJCQlpZiAoKGlwaC0+ZnJhZ19vZmYgJiBJUF9NRikgfHwKKwkJCSAgICAoaXBoLT5mcmFnX29mZiAmIElQX09GRlNFVCkpCiAJCQkJLyogSVAgZnJhZ21lbnQsIHNvIGRvbid0IGNoYW5nZSBjcyAqLwogCQkJCXN3cWUtPnR4X2NvbnRyb2wgfD0gRUhFQV9TV1FFX0NSQwogCQkJCQkJIHwgRUhFQV9TV1FFX0lNTV9EQVRBX1BSRVNFTlQ7CkBAIC0xNzcwLDEwICsxNzc3LDExIEBACiAJLyogY29weSAoaW1tZWRpYXRlKSBkYXRhICovCiAJaWYgKG5mcmFncyA9PSAwKSB7CiAJCS8qIGRhdGEgaXMgaW4gYSBzaW5nbGUgcGllY2UgKi8KLQkJbWVtY3B5KGltbV9kYXRhLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIGltbV9kYXRhLCBza2ItPmxlbik7CiAJfSBlbHNlIHsKIAkJLyogZmlyc3QgY29weSBkYXRhIGZyb20gdGhlIHNrYi0+ZGF0YSBidWZmZXIgLi4uICovCi0JCW1lbWNweShpbW1fZGF0YSwgc2tiLT5kYXRhLCBza2ItPmxlbiAtIHNrYi0+ZGF0YV9sZW4pOworCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgaW1tX2RhdGEsCisJCQkJCSAgc2tiLT5sZW4gLSBza2ItPmRhdGFfbGVuKTsKIAkJaW1tX2RhdGEgKz0gc2tiLT5sZW4gLSBza2ItPmRhdGFfbGVuOwogCiAJCS8qIC4uLiB0aGVuIGNvcHkgZGF0YSBmcm9tIHRoZSBmcmFnbWVudHMgKi8KQEAgLTE3ODksNiArMTc5NywyMiBAQAogCWRldl9rZnJlZV9za2Ioc2tiKTsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgZWhlYV9oYXNoX3NrYihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgbnVtX3FwcykKK3sKKwlzdHJ1Y3QgdGNwaGRyICp0Y3A7CisJdTMyIHRtcDsKKworCWlmICgoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9JUCkpICYmCisJICAgIChza2ItPm5oLmlwaC0+cHJvdG9jb2wgPT0gSVBQUk9UT19UQ1ApKSB7CisJCXRjcCA9IChzdHJ1Y3QgdGNwaGRyKikoc2tiLT5uaC5yYXcgKyAoc2tiLT5uaC5pcGgtPmlobCAqIDQpKTsKKwkJdG1wID0gKHRjcC0+c291cmNlICsgKHRjcC0+ZGVzdCA8PCAxNikpICUgMzE7CisJCXRtcCArPSBza2ItPm5oLmlwaC0+ZGFkZHIgJSAzMTsKKwkJcmV0dXJuIHRtcCAlIG51bV9xcHM7CisJfQorCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgZWhlYV9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGVoZWFfcG9ydCAqcG9ydCA9IG5ldGRldl9wcml2KGRldik7CkBAIC0xNzk2LDkgKzE4MjAsMTcgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXUzMiBsa2V5OwogCWludCBzd3FlX2luZGV4OwotCXN0cnVjdCBlaGVhX3BvcnRfcmVzICpwciA9ICZwb3J0LT5wb3J0X3Jlc1swXTsKKwlzdHJ1Y3QgZWhlYV9wb3J0X3JlcyAqcHI7CiAKLQlzcGluX2xvY2soJnByLT54bWl0X2xvY2spOworCXByID0gJnBvcnQtPnBvcnRfcmVzW2VoZWFfaGFzaF9za2Ioc2tiLCBwb3J0LT5udW1fdHhfcXBzKV07CisKKwlpZiAoIXNwaW5fdHJ5bG9jaygmcHItPnhtaXRfbG9jaykpCisJCXJldHVybiBORVRERVZfVFhfQlVTWTsKKworCWlmIChwci0+cXVldWVfc3RvcHBlZCkgeworCQlzcGluX3VubG9jaygmcHItPnhtaXRfbG9jayk7CisJCXJldHVybiBORVRERVZfVFhfQlVTWTsKKwl9CiAKIAlzd3FlID0gZWhlYV9nZXRfc3dxZShwci0+cXAsICZzd3FlX2luZGV4KTsKIAltZW1zZXQoc3dxZSwgMCwgU1dRRV9IRUFERVJfU0laRSk7CkBAIC0xODIxLDYgKzE4NTMsNyBAQAogCQlzd3FlLT53cl9pZCA9CiAJCQlFSEVBX0JNQVNLX1NFVChFSEVBX1dSX0lEX1RZUEUsIEVIRUFfU1dRRTJfVFlQRSkKIAkJICAgICAgfCBFSEVBX0JNQVNLX1NFVChFSEVBX1dSX0lEX0NPVU5ULCBwci0+c3dxZV9pZF9jb3VudGVyKQorCQkgICAgICB8IEVIRUFfQk1BU0tfU0VUKEVIRUFfV1JfSURfUkVGSUxMLCAxKQogCQkgICAgICB8IEVIRUFfQk1BU0tfU0VUKEVIRUFfV1JfSURfSU5ERVgsIHByLT5zcV9za2JhLmluZGV4KTsKIAkJcHItPnNxX3NrYmEuYXJyW3ByLT5zcV9za2JhLmluZGV4XSA9IHNrYjsKIApAQCAtMTgyOSwxNCArMTg2Miw3IEBACiAKIAkJbGtleSA9IHByLT5zZW5kX21yLmxrZXk7CiAJCWVoZWFfeG1pdDIoc2tiLCBkZXYsIHN3cWUsIGxrZXkpOwotCi0JCWlmIChwci0+c3dxZV9jb3VudCA+PSAoRUhFQV9TSUdfSVZfTE9ORyAtIDEpKSB7Ci0JCQlzd3FlLT53cl9pZCB8PSBFSEVBX0JNQVNLX1NFVChFSEVBX1dSX0lEX1JFRklMTCwKLQkJCQkJCSAgICAgIEVIRUFfU0lHX0lWX0xPTkcpOwotCQkJc3dxZS0+dHhfY29udHJvbCB8PSBFSEVBX1NXUUVfU0lHTkFMTEVEX0NPTVBMRVRJT047Ci0JCQlwci0+c3dxZV9jb3VudCA9IDA7Ci0JCX0gZWxzZQotCQkJcHItPnN3cWVfY291bnQgKz0gMTsKKwkJc3dxZS0+dHhfY29udHJvbCB8PSBFSEVBX1NXUUVfU0lHTkFMTEVEX0NPTVBMRVRJT047CiAJfQogCXByLT5zd3FlX2lkX2NvdW50ZXIgKz0gMTsKIApAQCAtMTg1Niw2ICsxODgyLDcgQEAKIAlpZiAodW5saWtlbHkoYXRvbWljX3JlYWQoJnByLT5zd3FlX2F2YWlsKSA8PSAxKSkgewogCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHItPm5ldGlmX3F1ZXVlLCBmbGFncyk7CiAJCWlmICh1bmxpa2VseShhdG9taWNfcmVhZCgmcHItPnN3cWVfYXZhaWwpIDw9IDEpKSB7CisJCQlwci0+cF9zdGF0cy5xdWV1ZV9zdG9wcGVkKys7CiAJCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CiAJCQlwci0+cXVldWVfc3RvcHBlZCA9IDE7CiAJCX0KQEAgLTIwNTcsNyArMjA4NCw3IEBACiAJfQogCiAJcHJfY2ZnLm1heF9lbnRyaWVzX3JjcSA9IHJxMV9lbnRyaWVzICsgcnEyX2VudHJpZXMgKyBycTNfZW50cmllczsKLQlwcl9jZmcubWF4X2VudHJpZXNfc2NxID0gc3FfZW50cmllczsKKwlwcl9jZmcubWF4X2VudHJpZXNfc2NxID0gc3FfZW50cmllcyAqIDI7CiAJcHJfY2ZnLm1heF9lbnRyaWVzX3NxID0gc3FfZW50cmllczsKIAlwcl9jZmcubWF4X2VudHJpZXNfcnExID0gcnExX2VudHJpZXM7CiAJcHJfY2ZnLm1heF9lbnRyaWVzX3JxMiA9IHJxMl9lbnRyaWVzOwpAQCAtMjEwNiw2ICsyMTMzLDI4IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIHZvaWQgZWhlYV9yZW1vdmVfYWRhcHRlcl9tciAoc3RydWN0IGVoZWFfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpbnQgaTsKKworCWZvciAoaT0wOyBpIDwgRUhFQV9NQVhfUE9SVFM7IGkrKykKKwkJaWYgKGFkYXB0ZXItPnBvcnRbaV0pCisJCQlyZXR1cm47CisKKwllaGVhX3JlbV9tcigmYWRhcHRlci0+bXIpOworfQorCitzdGF0aWMgaW50IGVoZWFfYWRkX2FkYXB0ZXJfbXIgKHN0cnVjdCBlaGVhX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaW50IGk7CisKKwlmb3IgKGk9MDsgaSA8IEVIRUFfTUFYX1BPUlRTOyBpKyspCisJCWlmIChhZGFwdGVyLT5wb3J0W2ldKQorCQkJcmV0dXJuIDA7CisKKwlyZXR1cm4gZWhlYV9yZWdfa2VybmVsX21yKGFkYXB0ZXIsICZhZGFwdGVyLT5tcik7Cit9CisKIHN0YXRpYyBpbnQgZWhlYV91cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCWludCByZXQsIGk7CkBAIC0yMjA1LDggKzIyNTQsMTAgQEAKIAllaGVhX2Ryb3BfbXVsdGljYXN0X2xpc3QoZGV2KTsKIAllaGVhX2ZyZWVfaW50ZXJydXB0cyhkZXYpOwogCi0JZm9yIChpID0gMDsgaSA8IHBvcnQtPm51bV9kZWZfcXBzICsgcG9ydC0+bnVtX2FkZF90eF9xcHM7IGkrKykKLQkJdGFza2xldF9raWxsKCZwb3J0LT5wb3J0X3Jlc1tpXS5zZW5kX2NvbXBfdGFzayk7CisJZm9yIChpID0gMDsgaSA8IHBvcnQtPm51bV9kZWZfcXBzOyBpKyspCisJCXdoaWxlICh0ZXN0X2JpdChfX0xJTktfU1RBVEVfUlhfU0NIRUQsCisJCQkJJnBvcnQtPnBvcnRfcmVzW2ldLmRfbmV0ZGV2LT5zdGF0ZSkpCisJCQltc2xlZXAoMSk7CiAKIAllaGVhX2Jyb2FkY2FzdF9yZWdfaGVscGVyKHBvcnQsIEhfREVSRUdfQkNNQyk7CiAJcmV0ID0gZWhlYV9jbGVhbl9hbGxfcG9ydHJlcyhwb3J0KTsKQEAgLTIyNzMsOCArMjMyNCw2IEBACiBpbnQgZWhlYV9zZW5zZV9hZGFwdGVyX2F0dHIoc3RydWN0IGVoZWFfYWRhcHRlciAqYWRhcHRlcikKIHsKIAlzdHJ1Y3QgaGNwX3F1ZXJ5X2VoZWEgKmNiOwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbGhlYV9kbiA9IE5VTEw7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpldGhfZG4gPSBOVUxMOwogCXU2NCBocmV0OwogCWludCByZXQ7CiAKQEAgLTIyOTEsMTggKzIzNDAsNiBAQAogCQlnb3RvIG91dF9oZXJyOwogCX0KIAotCS8qIERldGVybWluZSB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBsb2dpY2FsIHBvcnRzCi0JICogYnkgY291bnRpbmcgdGhlIGNoaWxkIG5vZGVzIG9mIHRoZSBsaGVhIE9GRFQgZW50cnkKLQkgKi8KLQlhZGFwdGVyLT5udW1fcG9ydHMgPSAwOwotCWxoZWFfZG4gPSBvZl9maW5kX25vZGVfYnlfbmFtZShsaGVhX2RuLCAibGhlYSIpOwotCWRvIHsKLQkJZXRoX2RuID0gb2ZfZ2V0X25leHRfY2hpbGQobGhlYV9kbiwgZXRoX2RuKTsKLQkJaWYgKGV0aF9kbikKLQkJCWFkYXB0ZXItPm51bV9wb3J0cysrOwotCX0gd2hpbGUgKCBldGhfZG4gKTsKLQlvZl9ub2RlX3B1dChsaGVhX2RuKTsKLQogCWFkYXB0ZXItPm1heF9tY19tYWMgPSBjYi0+bWF4X21jX21hYyAtIDE7CiAJcmV0ID0gMDsKIApAQCAtMjMxMiw3OSArMjM0OSwxODggQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGVoZWFfc2V0dXBfc2luZ2xlX3BvcnQoc3RydWN0IGVoZWFfcG9ydCAqcG9ydCwKLQkJCQkgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqZG4pCitpbnQgZWhlYV9nZXRfanVtYm9mcmFtZV9zdGF0dXMoc3RydWN0IGVoZWFfcG9ydCAqcG9ydCwgaW50ICpqdW1ibykKK3sKKwlzdHJ1Y3QgaGNwX2VoZWFfcG9ydF9jYjQgKmNiNDsKKwl1NjQgaHJldDsKKwlpbnQgcmV0ID0gMDsKKworCSpqdW1ibyA9IDA7CisKKwkvKiAoVHJ5IHRvKSBlbmFibGUgKmp1bWJvIGZyYW1lcyAqLworCWNiNCA9IGt6YWxsb2MoUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNiNCkgeworCQllaGVhX2Vycm9yKCJubyBtZW0gZm9yIGNiNCIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9IGVsc2UgeworCQlocmV0ID0gZWhlYV9oX3F1ZXJ5X2VoZWFfcG9ydChwb3J0LT5hZGFwdGVyLT5oYW5kbGUsCisJCQkJCSAgICAgIHBvcnQtPmxvZ2ljYWxfcG9ydF9pZCwKKwkJCQkJICAgICAgSF9QT1JUX0NCNCwKKwkJCQkJICAgICAgSF9QT1JUX0NCNF9KVU1CTywgY2I0KTsKKwkJaWYgKGhyZXQgPT0gSF9TVUNDRVNTKSB7CisJCQlpZiAoY2I0LT5qdW1ib19mcmFtZSkKKwkJCQkqanVtYm8gPSAxOworCQkJZWxzZSB7CisJCQkJY2I0LT5qdW1ib19mcmFtZSA9IDE7CisJCQkJaHJldCA9IGVoZWFfaF9tb2RpZnlfZWhlYV9wb3J0KHBvcnQtPmFkYXB0ZXItPgorCQkJCQkJCSAgICAgICBoYW5kbGUsCisJCQkJCQkJICAgICAgIHBvcnQtPgorCQkJCQkJCSAgICAgICBsb2dpY2FsX3BvcnRfaWQsCisJCQkJCQkJICAgICAgIEhfUE9SVF9DQjQsCisJCQkJCQkJICAgICAgIEhfUE9SVF9DQjRfSlVNQk8sCisJCQkJCQkJICAgICAgIGNiNCk7CisJCQkJaWYgKGhyZXQgPT0gSF9TVUNDRVNTKQorCQkJCQkqanVtYm8gPSAxOworCQkJfQorCQl9IGVsc2UKKwkJCXJldCA9IC1FSU5WQUw7CisKKwkJa2ZyZWUoY2I0KTsKKwl9CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgZWhlYV9zaG93X3BvcnRfaWQoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBlaGVhX3BvcnQgKnBvcnQgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgZWhlYV9wb3J0LCBvZmRldi5kZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjB4JVgiLCBwb3J0LT5sb2dpY2FsX3BvcnRfaWQpOworfQorCitzdGF0aWMgREVWSUNFX0FUVFIobG9nX3BvcnRfaWQsIFNfSVJVU1IgfCBTX0lSR1JQIHwgU19JUk9USCwgZWhlYV9zaG93X3BvcnRfaWQsCisJCSAgIE5VTEwpOworCitzdGF0aWMgdm9pZCBfX2RldmluaXQgbG9naWNhbF9wb3J0X3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBlaGVhX3BvcnQgKnBvcnQgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgZWhlYV9wb3J0LCBvZmRldi5kZXYpOworCW9mX25vZGVfcHV0KHBvcnQtPm9mZGV2Lm5vZGUpOworfQorCitzdGF0aWMgaW50IGVoZWFfZHJpdmVyX3N5c2ZzX2FkZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJpdmVyKQogewogCWludCByZXQ7Ci0JdTY0IGhyZXQ7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBvcnQtPm5ldGRldjsKLQlzdHJ1Y3QgZWhlYV9hZGFwdGVyICphZGFwdGVyID0gcG9ydC0+YWRhcHRlcjsKLQlzdHJ1Y3QgaGNwX2VoZWFfcG9ydF9jYjQgKmNiNDsKLQl1MzIgKmRuX2xvZ19wb3J0X2lkOwotCWludCBqdW1ibyA9IDA7CisKKwlyZXQgPSBzeXNmc19jcmVhdGVfbGluaygmZHJpdmVyLT5rb2JqLCAmZGV2LT5rb2JqLAorCQkJCWtvYmplY3RfbmFtZSgmZGV2LT5rb2JqKSk7CisJaWYgKHJldCA9PSAwKSB7CisJCXJldCA9IHN5c2ZzX2NyZWF0ZV9saW5rKCZkZXYtPmtvYmosICZkcml2ZXItPmtvYmosCisJCQkJCSJkcml2ZXIiKTsKKwkJaWYgKHJldCkKKwkJCXN5c2ZzX3JlbW92ZV9saW5rKCZkcml2ZXItPmtvYmosCisJCQkJCSAga29iamVjdF9uYW1lKCZkZXYtPmtvYmopKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgZWhlYV9kcml2ZXJfc3lzZnNfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJpdmVyKQoreworCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYgPSBkcml2ZXI7CisKKwlpZiAoZHJ2KSB7CisJCXN5c2ZzX3JlbW92ZV9saW5rKCZkcnYtPmtvYmosIGtvYmplY3RfbmFtZSgmZGV2LT5rb2JqKSk7CisJCXN5c2ZzX3JlbW92ZV9saW5rKCZkZXYtPmtvYmosICJkcml2ZXIiKTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlICplaGVhX3JlZ2lzdGVyX3BvcnQoc3RydWN0IGVoZWFfcG9ydCAqcG9ydCwKKwkJCQkJIHN0cnVjdCBkZXZpY2Vfbm9kZSAqZG4pCit7CisJaW50IHJldDsKKworCXBvcnQtPm9mZGV2Lm5vZGUgPSBvZl9ub2RlX2dldChkbik7CisJcG9ydC0+b2ZkZXYuZGV2LnBhcmVudCA9ICZwb3J0LT5hZGFwdGVyLT5lYnVzX2Rldi0+b2ZkZXYuZGV2OworCXBvcnQtPm9mZGV2LmRldi5idXMgPSAmaWJtZWJ1c19idXNfdHlwZTsKKworCXNwcmludGYocG9ydC0+b2ZkZXYuZGV2LmJ1c19pZCwgInBvcnQlZCIsIHBvcnRfbmFtZV9jbnQrKyk7CisJcG9ydC0+b2ZkZXYuZGV2LnJlbGVhc2UgPSBsb2dpY2FsX3BvcnRfcmVsZWFzZTsKKworCXJldCA9IG9mX2RldmljZV9yZWdpc3RlcigmcG9ydC0+b2ZkZXYpOworCWlmIChyZXQpIHsKKwkJZWhlYV9lcnJvcigiZmFpbGVkIHRvIHJlZ2lzdGVyIGRldmljZS4gcmV0PSVkIiwgcmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZwb3J0LT5vZmRldi5kZXYsICZkZXZfYXR0cl9sb2dfcG9ydF9pZCk7CisgICAgICAgIGlmIChyZXQpIHsKKwkJZWhlYV9lcnJvcigiZmFpbGVkIHRvIHJlZ2lzdGVyIGF0dHJpYnV0ZXMsIHJldD0lZCIsIHJldCk7CisJCWdvdG8gb3V0X3VucmVnX29mX2RldjsKKwl9CisKKwlyZXQgPSBlaGVhX2RyaXZlcl9zeXNmc19hZGQoJnBvcnQtPm9mZGV2LmRldiwgJmVoZWFfZHJpdmVyLmRyaXZlcik7CisJaWYgKHJldCkgeworCQllaGVhX2Vycm9yKCJmYWlsZWQgdG8gcmVnaXN0ZXIgc3lzZnMgZHJpdmVyIGxpbmsiKTsKKwkJZ290byBvdXRfcmVtX2Rldl9maWxlOworCX0KKworCXJldHVybiAmcG9ydC0+b2ZkZXYuZGV2OworCitvdXRfcmVtX2Rldl9maWxlOgorCWRldmljZV9yZW1vdmVfZmlsZSgmcG9ydC0+b2ZkZXYuZGV2LCAmZGV2X2F0dHJfbG9nX3BvcnRfaWQpOworb3V0X3VucmVnX29mX2RldjoKKwlvZl9kZXZpY2VfdW5yZWdpc3RlcigmcG9ydC0+b2ZkZXYpOworb3V0OgorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBlaGVhX3VucmVnaXN0ZXJfcG9ydChzdHJ1Y3QgZWhlYV9wb3J0ICpwb3J0KQoreworCWVoZWFfZHJpdmVyX3N5c2ZzX3JlbW92ZSgmcG9ydC0+b2ZkZXYuZGV2LCAmZWhlYV9kcml2ZXIuZHJpdmVyKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnBvcnQtPm9mZGV2LmRldiwgJmRldl9hdHRyX2xvZ19wb3J0X2lkKTsKKwlvZl9kZXZpY2VfdW5yZWdpc3RlcigmcG9ydC0+b2ZkZXYpOworfQorCitzdHJ1Y3QgZWhlYV9wb3J0ICplaGVhX3NldHVwX3NpbmdsZV9wb3J0KHN0cnVjdCBlaGVhX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCQkJCSB1MzIgbG9naWNhbF9wb3J0X2lkLAorCQkJCQkgc3RydWN0IGRldmljZV9ub2RlICpkbikKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IGVoZWFfcG9ydCAqcG9ydDsKKwlzdHJ1Y3QgZGV2aWNlICpwb3J0X2RldjsKKwlpbnQganVtYm87CisKKwkvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBwb3J0IHN0cnVjdHVyZXMgKi8KKwlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IGVoZWFfcG9ydCkpOworCisJaWYgKCFkZXYpIHsKKwkJZWhlYV9lcnJvcigibm8gbWVtIGZvciBuZXRfZGV2aWNlIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0X2VycjsKKwl9CisKKwlwb3J0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAogCXNlbWFfaW5pdCgmcG9ydC0+cG9ydF9sb2NrLCAxKTsKIAlwb3J0LT5zdGF0ZSA9IEVIRUFfUE9SVF9ET1dOOwogCXBvcnQtPnNpZ19jb21wX2l2ID0gc3FfZW50cmllcyAvIDEwOwogCi0JaWYgKCFkbikgewotCQllaGVhX2Vycm9yKCJiYWQgZGV2aWNlIG5vZGU6IGRuPSVwIiwgZG4pOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIG91dDsKLQl9CisJcG9ydC0+YWRhcHRlciA9IGFkYXB0ZXI7CisJcG9ydC0+bmV0ZGV2ID0gZGV2OworCXBvcnQtPmxvZ2ljYWxfcG9ydF9pZCA9IGxvZ2ljYWxfcG9ydF9pZDsKIAotCXBvcnQtPm9mX2Rldl9ub2RlID0gZG47Ci0KLQkvKiBEZXRlcm1pbmUgbG9naWNhbCBwb3J0IGlkICovCi0JZG5fbG9nX3BvcnRfaWQgPSAodTMyKilnZXRfcHJvcGVydHkoZG4sICJpYm0saGVhLXBvcnQtbm8iLCBOVUxMKTsKLQotCWlmICghZG5fbG9nX3BvcnRfaWQpIHsKLQkJZWhlYV9lcnJvcigiYmFkIGRldmljZSBub2RlOiBkbl9sb2dfcG9ydF9pZD0lcCIsCi0JCQkgICBkbl9sb2dfcG9ydF9pZCk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0OwotCX0KLQlwb3J0LT5sb2dpY2FsX3BvcnRfaWQgPSAqZG5fbG9nX3BvcnRfaWQ7CisJcG9ydC0+bXNnX2VuYWJsZSA9IG5ldGlmX21zZ19pbml0KG1zZ19sZXZlbCwgRUhFQV9NU0dfREVGQVVMVCk7CiAKIAlwb3J0LT5tY19saXN0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGVoZWFfbWNfbGlzdCksIEdGUF9LRVJORUwpOwogCWlmICghcG9ydC0+bWNfbGlzdCkgewogCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIG91dDsKKwkJZ290byBvdXRfZnJlZV9ldGhkZXY7CiAJfQogCiAJSU5JVF9MSVNUX0hFQUQoJnBvcnQtPm1jX2xpc3QtPmxpc3QpOwogCiAJcmV0ID0gZWhlYV9zZW5zZV9wb3J0X2F0dHIocG9ydCk7CiAJaWYgKHJldCkKLQkJZ290byBvdXQ7CisJCWdvdG8gb3V0X2ZyZWVfbWNfbGlzdDsKIAotCS8qIEVuYWJsZSBKdW1ibyBmcmFtZXMgKi8KLQljYjQgPSBremFsbG9jKFBBR0VfU0laRSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFjYjQpIHsKLQkJZWhlYV9lcnJvcigibm8gbWVtIGZvciBjYjQiKTsKLQl9IGVsc2UgewotCQlocmV0ID0gZWhlYV9oX3F1ZXJ5X2VoZWFfcG9ydChhZGFwdGVyLT5oYW5kbGUsCi0JCQkJCSAgICAgIHBvcnQtPmxvZ2ljYWxfcG9ydF9pZCwKLQkJCQkJICAgICAgSF9QT1JUX0NCNCwKLQkJCQkJICAgICAgSF9QT1JUX0NCNF9KVU1CTywgY2I0KTsKKwlwb3J0X2RldiA9IGVoZWFfcmVnaXN0ZXJfcG9ydChwb3J0LCBkbik7CisJaWYgKCFwb3J0X2RldikKKwkJZ290byBvdXRfZnJlZV9tY19saXN0OwogCi0JCWlmIChocmV0ID09IEhfU1VDQ0VTUykgewotCQkJaWYgKGNiNC0+anVtYm9fZnJhbWUpCi0JCQkJanVtYm8gPSAxOwotCQkJZWxzZSB7Ci0JCQkJY2I0LT5qdW1ib19mcmFtZSA9IDE7Ci0JCQkJaHJldCA9IGVoZWFfaF9tb2RpZnlfZWhlYV9wb3J0KGFkYXB0ZXItPmhhbmRsZSwKLQkJCQkJCQkgICAgICAgcG9ydC0+Ci0JCQkJCQkJICAgICAgICBsb2dpY2FsX3BvcnRfaWQsCi0JCQkJCQkJICAgICAgIEhfUE9SVF9DQjQsCi0JCQkJCQkJICAgICAgIEhfUE9SVF9DQjRfSlVNQk8sCi0JCQkJCQkJICAgICAgIGNiNCk7Ci0JCQkJaWYgKGhyZXQgPT0gSF9TVUNDRVNTKQotCQkJCQlqdW1ibyA9IDE7Ci0JCQl9Ci0JCX0KLQkJa2ZyZWUoY2I0KTsKLQl9CisJU0VUX05FVERFVl9ERVYoZGV2LCBwb3J0X2Rldik7CiAKIAkvKiBpbml0aWFsaXplIG5ldF9kZXZpY2Ugc3RydWN0dXJlICovCiAJU0VUX01PRFVMRV9PV05FUihkZXYpOwpAQCAtMjQxNyw4NCArMjU2MywyMjUgQEAKIAlyZXQgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKIAlpZiAocmV0KSB7CiAJCWVoZWFfZXJyb3IoInJlZ2lzdGVyX25ldGRldiBmYWlsZWQuIHJldD0lZCIsIHJldCk7Ci0JCWdvdG8gb3V0X2ZyZWU7CisJCWdvdG8gb3V0X3VucmVnX3BvcnQ7CiAJfQogCisJcmV0ID0gZWhlYV9nZXRfanVtYm9mcmFtZV9zdGF0dXMocG9ydCwgJmp1bWJvKTsKKwlpZiAocmV0KQorCQllaGVhX2Vycm9yKCJmYWlsZWQgZGV0ZXJtaW5pbmcganVtYm8gZnJhbWUgc3RhdHVzIGZvciAlcyIsCisJCQkgICBwb3J0LT5uZXRkZXYtPm5hbWUpOworCiAJZWhlYV9pbmZvKCIlczogSnVtYm8gZnJhbWVzIGFyZSAlc2FibGVkIiwgZGV2LT5uYW1lLAogCQkgIGp1bWJvID09IDEgPyAiZW4iIDogImRpcyIpOwogCi0JcG9ydC0+bmV0ZGV2ID0gZGV2OwotCXJldCA9IDA7Ci0JZ290byBvdXQ7CisJcmV0dXJuIHBvcnQ7CiAKLW91dF9mcmVlOgorb3V0X3VucmVnX3BvcnQ6CisJZWhlYV91bnJlZ2lzdGVyX3BvcnQocG9ydCk7CisKK291dF9mcmVlX21jX2xpc3Q6CiAJa2ZyZWUocG9ydC0+bWNfbGlzdCk7Ci1vdXQ6Ci0JcmV0dXJuIHJldDsKKworb3V0X2ZyZWVfZXRoZGV2OgorCWZyZWVfbmV0ZGV2KGRldik7CisKK291dF9lcnI6CisJZWhlYV9lcnJvcigic2V0dGluZyB1cCBsb2dpY2FsIHBvcnQgd2l0aCBpZD0lZCBmYWlsZWQsIHJldD0lZCIsCisJCSAgIGxvZ2ljYWxfcG9ydF9pZCwgcmV0KTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgZWhlYV9zaHV0ZG93bl9zaW5nbGVfcG9ydChzdHJ1Y3QgZWhlYV9wb3J0ICpwb3J0KQoreworCXVucmVnaXN0ZXJfbmV0ZGV2KHBvcnQtPm5ldGRldik7CisJZWhlYV91bnJlZ2lzdGVyX3BvcnQocG9ydCk7CisJa2ZyZWUocG9ydC0+bWNfbGlzdCk7CisJZnJlZV9uZXRkZXYocG9ydC0+bmV0ZGV2KTsKIH0KIAogc3RhdGljIGludCBlaGVhX3NldHVwX3BvcnRzKHN0cnVjdCBlaGVhX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7Ci0JaW50IHJldDsKLQlpbnQgcG9ydF9zZXR1cF9vayA9IDA7CisJc3RydWN0IGRldmljZV9ub2RlICpsaGVhX2RuOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZXRoX2RuID0gTlVMTDsKKworCXUzMiAqZG5fbG9nX3BvcnRfaWQ7CisJaW50IGkgPSAwOworCisJbGhlYV9kbiA9IGFkYXB0ZXItPmVidXNfZGV2LT5vZmRldi5ub2RlOworCXdoaWxlICgoZXRoX2RuID0gb2ZfZ2V0X25leHRfY2hpbGQobGhlYV9kbiwgZXRoX2RuKSkpIHsKKworCQlkbl9sb2dfcG9ydF9pZCA9ICh1MzIqKWdldF9wcm9wZXJ0eShldGhfZG4sICJpYm0saGVhLXBvcnQtbm8iLAorCQkJCQkJICAgIE5VTEwpOworCQlpZiAoIWRuX2xvZ19wb3J0X2lkKSB7CisJCQllaGVhX2Vycm9yKCJiYWQgZGV2aWNlIG5vZGU6IGV0aF9kbiBuYW1lPSVzIiwKKwkJCQkgICBldGhfZG4tPmZ1bGxfbmFtZSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChlaGVhX2FkZF9hZGFwdGVyX21yKGFkYXB0ZXIpKSB7CisJCQllaGVhX2Vycm9yKCJjcmVhdGluZyBNUiBmYWlsZWQiKTsKKwkJCW9mX25vZGVfcHV0KGV0aF9kbik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCisJCWFkYXB0ZXItPnBvcnRbaV0gPSBlaGVhX3NldHVwX3NpbmdsZV9wb3J0KGFkYXB0ZXIsCisJCQkJCQkJICAqZG5fbG9nX3BvcnRfaWQsCisJCQkJCQkJICBldGhfZG4pOworCQlpZiAoYWRhcHRlci0+cG9ydFtpXSkKKwkJCWVoZWFfaW5mbygiJXMgLT4gbG9naWNhbCBwb3J0IGlkICMlZCIsCisJCQkJICBhZGFwdGVyLT5wb3J0W2ldLT5uZXRkZXYtPm5hbWUsCisJCQkJICAqZG5fbG9nX3BvcnRfaWQpOworCQllbHNlCisJCQllaGVhX3JlbW92ZV9hZGFwdGVyX21yKGFkYXB0ZXIpOworCisJCWkrKzsKKwl9OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX25vZGUgKmVoZWFfZ2V0X2V0aF9kbihzdHJ1Y3QgZWhlYV9hZGFwdGVyICphZGFwdGVyLAorCQkJCQkgICB1MzIgbG9naWNhbF9wb3J0X2lkKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbGhlYV9kbjsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmV0aF9kbiA9IE5VTEw7CisJdTMyICpkbl9sb2dfcG9ydF9pZDsKKworCWxoZWFfZG4gPSBhZGFwdGVyLT5lYnVzX2Rldi0+b2ZkZXYubm9kZTsKKwl3aGlsZSAoKGV0aF9kbiA9IG9mX2dldF9uZXh0X2NoaWxkKGxoZWFfZG4sIGV0aF9kbikpKSB7CisKKwkJZG5fbG9nX3BvcnRfaWQgPSAodTMyKilnZXRfcHJvcGVydHkoZXRoX2RuLCAiaWJtLGhlYS1wb3J0LW5vIiwKKwkJCQkJCSAgICBOVUxMKTsKKwkJaWYgKGRuX2xvZ19wb3J0X2lkKQorCQkJaWYgKCpkbl9sb2dfcG9ydF9pZCA9PSBsb2dpY2FsX3BvcnRfaWQpCisJCQkJcmV0dXJuIGV0aF9kbjsKKwl9OworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGVoZWFfcHJvYmVfcG9ydChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGVoZWFfYWRhcHRlciAqYWRhcHRlciA9IGRldi0+ZHJpdmVyX2RhdGE7CiAJc3RydWN0IGVoZWFfcG9ydCAqcG9ydDsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuID0gTlVMTDsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZXRoX2RuID0gTlVMTDsKIAlpbnQgaTsKIAotCS8qIGdldCBwb3J0IHByb3BlcnRpZXMgZm9yIGFsbCBwb3J0cyAqLwotCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5udW1fcG9ydHM7IGkrKykgeworCXUzMiBsb2dpY2FsX3BvcnRfaWQ7CiAKLQkJaWYgKGFkYXB0ZXItPnBvcnRbaV0pCi0JCQljb250aW51ZTsJLyogcG9ydCBhbHJlYWR5IHVwIGFuZCBydW5uaW5nICovCisJc3NjYW5mKGJ1ZiwgIiVYIiwgJmxvZ2ljYWxfcG9ydF9pZCk7CiAKLQkJLyogYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgcG9ydCBzdHJ1Y3R1cmVzICovCi0JCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgZWhlYV9wb3J0KSk7CisJcG9ydCA9IGVoZWFfZ2V0X3BvcnQoYWRhcHRlciwgbG9naWNhbF9wb3J0X2lkKTsKIAotCQlpZiAoIWRldikgewotCQkJZWhlYV9lcnJvcigibm8gbWVtIGZvciBuZXRfZGV2aWNlIik7Ci0JCQlicmVhazsKLQkJfQotCi0JCXBvcnQgPSBuZXRkZXZfcHJpdihkZXYpOwotCQlwb3J0LT5hZGFwdGVyID0gYWRhcHRlcjsKLQkJcG9ydC0+bmV0ZGV2ID0gZGV2OwotCQlhZGFwdGVyLT5wb3J0W2ldID0gcG9ydDsKLQkJcG9ydC0+bXNnX2VuYWJsZSA9IG5ldGlmX21zZ19pbml0KG1zZ19sZXZlbCwgRUhFQV9NU0dfREVGQVVMVCk7Ci0KLQkJZG4gPSBvZl9maW5kX25vZGVfYnlfbmFtZShkbiwgImV0aGVybmV0Iik7Ci0JCXJldCA9IGVoZWFfc2V0dXBfc2luZ2xlX3BvcnQocG9ydCwgZG4pOwotCQlpZiAocmV0KSB7Ci0JCQkvKiBGcmVlIG1lbSBmb3IgdGhpcyBwb3J0IHN0cnVjdC4gVGhlIG90aGVycyB3aWxsIGJlCi0JCQkgICBwcm9jZXNzZWQgb24gcm9sbGJhY2sgKi8KLQkJCWZyZWVfbmV0ZGV2KGRldik7Ci0JCQlhZGFwdGVyLT5wb3J0W2ldID0gTlVMTDsKLQkJCWVoZWFfZXJyb3IoImVIRUEgcG9ydCAlZCBzZXR1cCBmYWlsZWQsIHJldD0lZCIsIGksIHJldCk7Ci0JCX0KKwlpZiAocG9ydCkgeworCQllaGVhX2luZm8oImFkZGluZyBwb3J0IHdpdGggbG9naWNhbCBwb3J0IGlkPSVkIGZhaWxlZC4gcG9ydCAiCisJCQkgICJhbHJlYWR5IGNvbmZpZ3VyZWQgYXMgJXMuIiwgbG9naWNhbF9wb3J0X2lkLAorCQkJICBwb3J0LT5uZXRkZXYtPm5hbWUpOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlvZl9ub2RlX3B1dChkbik7CisJZXRoX2RuID0gZWhlYV9nZXRfZXRoX2RuKGFkYXB0ZXIsIGxvZ2ljYWxfcG9ydF9pZCk7CiAKLQkvKiBDaGVjayBmb3Igc3VjY2VzZnVsbHkgc2V0IHVwIHBvcnRzICovCi0JZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPm51bV9wb3J0czsgaSsrKQotCQlpZiAoYWRhcHRlci0+cG9ydFtpXSkKLQkJCXBvcnRfc2V0dXBfb2srKzsKKwlpZiAoIWV0aF9kbikgeworCQllaGVhX2luZm8oIm5vIGxvZ2ljYWwgcG9ydCB3aXRoIGlkICVkIGZvdW5kIiwgbG9naWNhbF9wb3J0X2lkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQogCi0JaWYgKHBvcnRfc2V0dXBfb2spCi0JCXJldCA9IDA7CS8qIEF0IGxlYXN0IHNvbWUgcG9ydHMgYXJlIHNldHVwIGNvcnJlY3RseSAqLwotCWVsc2UKLQkJcmV0ID0gLUVJTlZBTDsKKwlpZiAoZWhlYV9hZGRfYWRhcHRlcl9tcihhZGFwdGVyKSkgeworCQllaGVhX2Vycm9yKCJjcmVhdGluZyBNUiBmYWlsZWQiKTsKKwkJcmV0dXJuIC1FSU87CisJfQogCisJcG9ydCA9IGVoZWFfc2V0dXBfc2luZ2xlX3BvcnQoYWRhcHRlciwgbG9naWNhbF9wb3J0X2lkLCBldGhfZG4pOworCisJb2Zfbm9kZV9wdXQoZXRoX2RuKTsKKworCWlmIChwb3J0KSB7CisJCWZvciAoaT0wOyBpIDwgRUhFQV9NQVhfUE9SVFM7IGkrKykKKwkJCWlmICghYWRhcHRlci0+cG9ydFtpXSkgeworCQkJCWFkYXB0ZXItPnBvcnRbaV0gPSBwb3J0OworCQkJCWJyZWFrOworCQkJfQorCisJCWVoZWFfaW5mbygiYWRkZWQgJXMgKGxvZ2ljYWwgcG9ydCBpZD0lZCkiLCBwb3J0LT5uZXRkZXYtPm5hbWUsCisJCQkgIGxvZ2ljYWxfcG9ydF9pZCk7CisJfSBlbHNlIHsKKwkJZWhlYV9yZW1vdmVfYWRhcHRlcl9tcihhZGFwdGVyKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcmV0dXJuIChzc2l6ZV90KSBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3QgZWhlYV9yZW1vdmVfcG9ydChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGVoZWFfYWRhcHRlciAqYWRhcHRlciA9IGRldi0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IGVoZWFfcG9ydCAqcG9ydDsKKwlpbnQgaTsKKwl1MzIgbG9naWNhbF9wb3J0X2lkOworCisJc3NjYW5mKGJ1ZiwgIiVYIiwgJmxvZ2ljYWxfcG9ydF9pZCk7CisKKwlwb3J0ID0gZWhlYV9nZXRfcG9ydChhZGFwdGVyLCBsb2dpY2FsX3BvcnRfaWQpOworCisJaWYgKHBvcnQpIHsKKwkJZWhlYV9pbmZvKCJyZW1vdmVkICVzIChsb2dpY2FsIHBvcnQgaWQ9JWQpIiwgcG9ydC0+bmV0ZGV2LT5uYW1lLAorCQkJICBsb2dpY2FsX3BvcnRfaWQpOworCisJCWVoZWFfc2h1dGRvd25fc2luZ2xlX3BvcnQocG9ydCk7CisKKwkJZm9yIChpPTA7IGkgPCBFSEVBX01BWF9QT1JUUzsgaSsrKQorCQkJaWYgKGFkYXB0ZXItPnBvcnRbaV0gPT0gcG9ydCkgeworCQkJCWFkYXB0ZXItPnBvcnRbaV0gPSBOVUxMOworCQkJCWJyZWFrOworCQkJfQorCX0gZWxzZSB7CisJCWVoZWFfZXJyb3IoInJlbW92aW5nIHBvcnQgd2l0aCBsb2dpY2FsIHBvcnQgaWQ9JWQgZmFpbGVkLiBwb3J0ICIKKwkJCSAgICJub3QgY29uZmlndXJlZC4iLCBsb2dpY2FsX3BvcnRfaWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwllaGVhX3JlbW92ZV9hZGFwdGVyX21yKGFkYXB0ZXIpOworCisJcmV0dXJuIChzc2l6ZV90KSBjb3VudDsKK30KKworc3RhdGljIERFVklDRV9BVFRSKHByb2JlX3BvcnQsIFNfSVdVU1IsIE5VTEwsIGVoZWFfcHJvYmVfcG9ydCk7CitzdGF0aWMgREVWSUNFX0FUVFIocmVtb3ZlX3BvcnQsIFNfSVdVU1IsIE5VTEwsIGVoZWFfcmVtb3ZlX3BvcnQpOworCitpbnQgZWhlYV9jcmVhdGVfZGV2aWNlX3N5c2ZzKHN0cnVjdCBpYm1lYnVzX2RldiAqZGV2KQoreworCWludCByZXQgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmRldi0+b2ZkZXYuZGV2LCAmZGV2X2F0dHJfcHJvYmVfcG9ydCk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmRldi0+b2ZkZXYuZGV2LCAmZGV2X2F0dHJfcmVtb3ZlX3BvcnQpOworb3V0OgogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IGVoZWFfcHJvYmUoc3RydWN0IGlibWVidXNfZGV2ICpkZXYsCi0JCQkJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqaWQpCit2b2lkIGVoZWFfcmVtb3ZlX2RldmljZV9zeXNmcyhzdHJ1Y3QgaWJtZWJ1c19kZXYgKmRldikKK3sKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmRldi0+b2ZkZXYuZGV2LCAmZGV2X2F0dHJfcHJvYmVfcG9ydCk7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZkZXYtPm9mZGV2LmRldiwgJmRldl9hdHRyX3JlbW92ZV9wb3J0KTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgZWhlYV9wcm9iZV9hZGFwdGVyKHN0cnVjdCBpYm1lYnVzX2RldiAqZGV2LAorCQkJCQljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICppZCkKIHsKIAlzdHJ1Y3QgZWhlYV9hZGFwdGVyICphZGFwdGVyOwogCXU2NCAqYWRhcHRlcl9oYW5kbGU7CiAJaW50IHJldDsKIAorCWlmICghZGV2IHx8ICFkZXYtPm9mZGV2Lm5vZGUpIHsKKwkJZWhlYV9lcnJvcigiSW52YWxpZCBpYm1lYnVzIGRldmljZSBwcm9iZWQiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCiAJYWRhcHRlciA9IGt6YWxsb2Moc2l6ZW9mKCphZGFwdGVyKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFhZGFwdGVyKSB7CiAJCXJldCA9IC1FTk9NRU07CkBAIC0yNTAyLDYgKzI3ODksOCBAQAogCQlnb3RvIG91dDsKIAl9CiAKKwlhZGFwdGVyLT5lYnVzX2RldiA9IGRldjsKKwogCWFkYXB0ZXJfaGFuZGxlID0gKHU2NCopZ2V0X3Byb3BlcnR5KGRldi0+b2ZkZXYubm9kZSwgImlibSxoZWEtaGFuZGxlIiwKIAkJCQkJICAgIE5VTEwpOwogCWlmIChhZGFwdGVyX2hhbmRsZSkKQEAgLTI1MTgsMjYgKzI4MDcsMjEgQEAKIAogCWRldi0+b2ZkZXYuZGV2LmRyaXZlcl9kYXRhID0gYWRhcHRlcjsKIAotCXJldCA9IGVoZWFfcmVnX21yX2FkYXB0ZXIoYWRhcHRlcik7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKCZkZXYtPm9mZGV2LmRldiwgInJlZ19tcl9hZGFwdGVyIGZhaWxlZFxuIik7Ci0JCWdvdG8gb3V0X2ZyZWVfYWQ7Ci0JfQogCiAJLyogaW5pdGlhbGl6ZSBhZGFwdGVyIGFuZCBwb3J0cyAqLwogCS8qIGdldCBhZGFwdGVyIHByb3BlcnRpZXMgKi8KIAlyZXQgPSBlaGVhX3NlbnNlX2FkYXB0ZXJfYXR0cihhZGFwdGVyKTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoJmRldi0+b2ZkZXYuZGV2LCAic2Vuc2VfYWRhcHRlcl9hdHRyIGZhaWxlZDogJWQiLCByZXQpOwotCQlnb3RvIG91dF9mcmVlX3JlczsKKwkJZ290byBvdXRfZnJlZV9hZDsKIAl9Ci0JZGV2X2luZm8oJmRldi0+b2ZkZXYuZGV2LCAiJWQgZUhFQSBwb3J0cyBmb3VuZFxuIiwgYWRhcHRlci0+bnVtX3BvcnRzKTsKIAogCWFkYXB0ZXItPm5lcSA9IGVoZWFfY3JlYXRlX2VxKGFkYXB0ZXIsCiAJCQkJICAgICAgRUhFQV9ORVEsIEVIRUFfTUFYX0VOVFJJRVNfRVEsIDEpOwogCWlmICghYWRhcHRlci0+bmVxKSB7CisJCXJldCA9IC1FSU87CiAJCWRldl9lcnIoJmRldi0+b2ZkZXYuZGV2LCAiTkVRIGNyZWF0aW9uIGZhaWxlZCIpOwotCQlnb3RvIG91dF9mcmVlX3JlczsKKwkJZ290byBvdXRfZnJlZV9hZDsKIAl9CiAKIAl0YXNrbGV0X2luaXQoJmFkYXB0ZXItPm5lcV90YXNrbGV0LCBlaGVhX25lcV90YXNrbGV0LApAQCAtMjU1MiwxOCArMjgzNiwyNyBAQAogCX0KIAogCWFkYXB0ZXItPmVoZWFfd3EgPSBjcmVhdGVfd29ya3F1ZXVlKCJlaGVhX3dxIik7Ci0JaWYgKCFhZGFwdGVyLT5laGVhX3dxKQorCWlmICghYWRhcHRlci0+ZWhlYV93cSkgeworCQlyZXQgPSAtRUlPOwogCQlnb3RvIG91dF9mcmVlX2lycTsKKwl9CisKKwlyZXQgPSBlaGVhX2NyZWF0ZV9kZXZpY2Vfc3lzZnMoZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF9raWxsX3dxOwogCiAJcmV0ID0gZWhlYV9zZXR1cF9wb3J0cyhhZGFwdGVyKTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoJmRldi0+b2ZkZXYuZGV2LCAic2V0dXBfcG9ydHMgZmFpbGVkIik7Ci0JCWdvdG8gb3V0X2tpbGxfd3E7CisJCWdvdG8gb3V0X3JlbV9kZXZfc3lzZnM7CiAJfQogCiAJcmV0ID0gMDsKIAlnb3RvIG91dDsKIAorb3V0X3JlbV9kZXZfc3lzZnM6CisJZWhlYV9yZW1vdmVfZGV2aWNlX3N5c2ZzKGRldik7CisKIG91dF9raWxsX3dxOgogCWRlc3Ryb3lfd29ya3F1ZXVlKGFkYXB0ZXItPmVoZWFfd3EpOwogCkBAIC0yNTczLDQ1ICsyODY2LDMyIEBACiBvdXRfa2lsbF9lcToKIAllaGVhX2Rlc3Ryb3lfZXEoYWRhcHRlci0+bmVxKTsKIAotb3V0X2ZyZWVfcmVzOgotCWVoZWFfaF9mcmVlX3Jlc291cmNlKGFkYXB0ZXItPmhhbmRsZSwgYWRhcHRlci0+bXIuaGFuZGxlKTsKLQogb3V0X2ZyZWVfYWQ6CiAJa2ZyZWUoYWRhcHRlcik7CiBvdXQ6CiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgZWhlYV9zaHV0ZG93bl9zaW5nbGVfcG9ydChzdHJ1Y3QgZWhlYV9wb3J0ICpwb3J0KQotewotCXVucmVnaXN0ZXJfbmV0ZGV2KHBvcnQtPm5ldGRldik7Ci0Ja2ZyZWUocG9ydC0+bWNfbGlzdCk7Ci0JZnJlZV9uZXRkZXYocG9ydC0+bmV0ZGV2KTsKLX0KLQogc3RhdGljIGludCBfX2RldmV4aXQgZWhlYV9yZW1vdmUoc3RydWN0IGlibWVidXNfZGV2ICpkZXYpCiB7CiAJc3RydWN0IGVoZWFfYWRhcHRlciAqYWRhcHRlciA9IGRldi0+b2ZkZXYuZGV2LmRyaXZlcl9kYXRhOwotCXU2NCBocmV0OwogCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPm51bV9wb3J0czsgaSsrKQorCWZvciAoaSA9IDA7IGkgPCBFSEVBX01BWF9QT1JUUzsgaSsrKQogCQlpZiAoYWRhcHRlci0+cG9ydFtpXSkgewogCQkJZWhlYV9zaHV0ZG93bl9zaW5nbGVfcG9ydChhZGFwdGVyLT5wb3J0W2ldKTsKIAkJCWFkYXB0ZXItPnBvcnRbaV0gPSBOVUxMOwogCQl9CisKKwllaGVhX3JlbW92ZV9kZXZpY2Vfc3lzZnMoZGV2KTsKKwogCWRlc3Ryb3lfd29ya3F1ZXVlKGFkYXB0ZXItPmVoZWFfd3EpOwogCiAJaWJtZWJ1c19mcmVlX2lycShOVUxMLCBhZGFwdGVyLT5uZXEtPmF0dHIuaXN0MSwgYWRhcHRlcik7CiAJdGFza2xldF9raWxsKCZhZGFwdGVyLT5uZXFfdGFza2xldCk7CiAKIAllaGVhX2Rlc3Ryb3lfZXEoYWRhcHRlci0+bmVxKTsKLQotCWhyZXQgPSBlaGVhX2hfZnJlZV9yZXNvdXJjZShhZGFwdGVyLT5oYW5kbGUsIGFkYXB0ZXItPm1yLmhhbmRsZSk7Ci0JaWYgKGhyZXQpIHsKLQkJZGV2X2VycigmZGV2LT5vZmRldi5kZXYsICJmcmVlX3Jlc291cmNlX21yIGZhaWxlZCIpOwotCQlyZXR1cm4gLUVJTzsKLQl9CisJZWhlYV9yZW1vdmVfYWRhcHRlcl9tcihhZGFwdGVyKTsKIAlrZnJlZShhZGFwdGVyKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTI2NDQsMjEgKzI5MjQsNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGVoZWFfZGV2aWNlX3RhYmxlW10gPSB7Ci0JewotCQkubmFtZSA9ICJsaGVhIiwKLQkJLmNvbXBhdGlibGUgPSAiSUJNLGxoZWEiLAotCX0sCi0Je30sCi19OwotCi1zdGF0aWMgc3RydWN0IGlibWVidXNfZHJpdmVyIGVoZWFfZHJpdmVyID0gewotCS5uYW1lID0gImVoZWEiLAotCS5pZF90YWJsZSA9IGVoZWFfZGV2aWNlX3RhYmxlLAotCS5wcm9iZSA9IGVoZWFfcHJvYmUsCi0JLnJlbW92ZSA9IGVoZWFfcmVtb3ZlLAotfTsKLQogaW50IF9faW5pdCBlaGVhX21vZHVsZV9pbml0KHZvaWQpCiB7CiAJaW50IHJldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2VoZWEvZWhlYV9waHlwLmMgYi9kcml2ZXJzL25ldC9laGVhL2VoZWFfcGh5cC5jCmluZGV4IGJjM2MwMDUuLjk1YzRhN2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2VoZWEvZWhlYV9waHlwLmMKKysrIGIvZHJpdmVycy9uZXQvZWhlYS9laGVhX3BoeXAuYwpAQCAtNDc4LDEyICs0NzgsMTQgQEAKIAkJCQkgMCwgMCwgMCwgMCwgMCwgMCk7ICAgICAgICAgICAgIC8qIFI3LVIxMiAqLwogfQogCi11NjQgZWhlYV9oX2ZyZWVfcmVzb3VyY2UoY29uc3QgdTY0IGFkYXB0ZXJfaGFuZGxlLCBjb25zdCB1NjQgcmVzX2hhbmRsZSkKK3U2NCBlaGVhX2hfZnJlZV9yZXNvdXJjZShjb25zdCB1NjQgYWRhcHRlcl9oYW5kbGUsIGNvbnN0IHU2NCByZXNfaGFuZGxlLAorCQkJIHU2NCBmb3JjZV9iaXQpCiB7CiAJcmV0dXJuIGVoZWFfcGxwYXJfaGNhbGxfbm9yZXRzKEhfRlJFRV9SRVNPVVJDRSwKIAkJCQkgICAgICAgYWRhcHRlcl9oYW5kbGUsCSAgIC8qIFI0ICovCiAJCQkJICAgICAgIHJlc19oYW5kbGUsICAgICAgICAgLyogUjUgKi8KLQkJCQkgICAgICAgMCwgMCwgMCwgMCwgMCk7ICAgICAvKiBSNi1SMTAgKi8KKwkJCQkgICAgICAgZm9yY2VfYml0LAorCQkJCSAgICAgICAwLCAwLCAwLCAwKTsgICAgICAgIC8qIFI3LVIxMCAqLwogfQogCiB1NjQgZWhlYV9oX2FsbG9jX3Jlc291cmNlX21yKGNvbnN0IHU2NCBhZGFwdGVyX2hhbmRsZSwgY29uc3QgdTY0IHZhZGRyLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZWhlYS9laGVhX3BoeXAuaCBiL2RyaXZlcnMvbmV0L2VoZWEvZWhlYV9waHlwLmgKaW5kZXggOTBhY2RkYjAuLmQxN2E0NWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2VoZWEvZWhlYV9waHlwLmgKKysrIGIvZHJpdmVycy9uZXQvZWhlYS9laGVhX3BoeXAuaApAQCAtNDE0LDcgKzQxNCwxMSBAQAogCiB1NjQgZWhlYV9oX2Rpc2FibGVfYW5kX2dldF9oZWEoY29uc3QgdTY0IGFkYXB0ZXJfaGFuZGxlLCBjb25zdCB1NjQgcXBfaGFuZGxlKTsKIAotdTY0IGVoZWFfaF9mcmVlX3Jlc291cmNlKGNvbnN0IHU2NCBhZGFwdGVyX2hhbmRsZSwgY29uc3QgdTY0IHJlc19oYW5kbGUpOworI2RlZmluZSBGT1JDRV9GUkVFIDEKKyNkZWZpbmUgTk9STUFMX0ZSRUUgMAorCit1NjQgZWhlYV9oX2ZyZWVfcmVzb3VyY2UoY29uc3QgdTY0IGFkYXB0ZXJfaGFuZGxlLCBjb25zdCB1NjQgcmVzX2hhbmRsZSwKKwkJCSB1NjQgZm9yY2VfYml0KTsKIAogdTY0IGVoZWFfaF9hbGxvY19yZXNvdXJjZV9tcihjb25zdCB1NjQgYWRhcHRlcl9oYW5kbGUsIGNvbnN0IHU2NCB2YWRkciwKIAkJCSAgICAgY29uc3QgdTY0IGxlbmd0aCwgY29uc3QgdTMyIGFjY2Vzc19jdHJsLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZWhlYS9laGVhX3Ftci5jIGIvZHJpdmVycy9uZXQvZWhlYS9laGVhX3Ftci5jCmluZGV4IDk2ZmYzYjYuLmYyNGE4ODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2VoZWEvZWhlYV9xbXIuYworKysgYi9kcml2ZXJzL25ldC9laGVhL2VoZWFfcW1yLmMKQEAgLTE5Nyw3ICsxOTcsNyBAQAogCWh3X3F1ZXVlX2R0b3IoJmNxLT5od19xdWV1ZSk7CiAKIG91dF9mcmVlcmVzOgotCWVoZWFfaF9mcmVlX3Jlc291cmNlKGFkYXB0ZXItPmhhbmRsZSwgY3EtPmZ3X2hhbmRsZSk7CisJZWhlYV9oX2ZyZWVfcmVzb3VyY2UoYWRhcHRlci0+aGFuZGxlLCBjcS0+ZndfaGFuZGxlLCBGT1JDRV9GUkVFKTsKIAogb3V0X2ZyZWVtZW06CiAJa2ZyZWUoY3EpOwpAQCAtMjA2LDI1ICsyMDYsMzggQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAordTY0IGVoZWFfZGVzdHJveV9jcV9yZXMoc3RydWN0IGVoZWFfY3EgKmNxLCB1NjQgZm9yY2UpCit7CisJdTY0IGhyZXQ7CisJdTY0IGFkYXB0ZXJfaGFuZGxlID0gY3EtPmFkYXB0ZXItPmhhbmRsZTsKKworICAgICAgICAvKiBkZXJlZ2lzdGVyIGFsbCBwcmV2aW91cyByZWdpc3RlcmVkIHBhZ2VzICovCisJaHJldCA9IGVoZWFfaF9mcmVlX3Jlc291cmNlKGFkYXB0ZXJfaGFuZGxlLCBjcS0+ZndfaGFuZGxlLCBmb3JjZSk7CisJaWYgKGhyZXQgIT0gSF9TVUNDRVNTKQorCQlyZXR1cm4gaHJldDsKKworCWh3X3F1ZXVlX2R0b3IoJmNxLT5od19xdWV1ZSk7CisJa2ZyZWUoY3EpOworCisJcmV0dXJuIGhyZXQ7Cit9CisKIGludCBlaGVhX2Rlc3Ryb3lfY3Eoc3RydWN0IGVoZWFfY3EgKmNxKQogewotCXU2NCBhZGFwdGVyX2hhbmRsZSwgaHJldDsKLQorCXU2NCBocmV0OwogCWlmICghY3EpCiAJCXJldHVybiAwOwogCi0JYWRhcHRlcl9oYW5kbGUgPSBjcS0+YWRhcHRlci0+aGFuZGxlOworCWlmICgoaHJldCA9IGVoZWFfZGVzdHJveV9jcV9yZXMoY3EsIE5PUk1BTF9GUkVFKSkgPT0gSF9SX1NUQVRFKSB7CisJCWVoZWFfZXJyb3JfZGF0YShjcS0+YWRhcHRlciwgY3EtPmZ3X2hhbmRsZSk7CisJCWhyZXQgPSBlaGVhX2Rlc3Ryb3lfY3FfcmVzKGNxLCBGT1JDRV9GUkVFKTsKKwl9CiAKLQkvKiBkZXJlZ2lzdGVyIGFsbCBwcmV2aW91cyByZWdpc3RlcmVkIHBhZ2VzICovCi0JaHJldCA9IGVoZWFfaF9mcmVlX3Jlc291cmNlKGFkYXB0ZXJfaGFuZGxlLCBjcS0+ZndfaGFuZGxlKTsKIAlpZiAoaHJldCAhPSBIX1NVQ0NFU1MpIHsKIAkJZWhlYV9lcnJvcigiZGVzdHJveSBDUSBmYWlsZWQiKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCi0JaHdfcXVldWVfZHRvcigmY3EtPmh3X3F1ZXVlKTsKLQlrZnJlZShjcSk7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMjk3LDcgKzMxMCw3IEBACiAJaHdfcXVldWVfZHRvcigmZXEtPmh3X3F1ZXVlKTsKIAogb3V0X2ZyZWVyZXM6Ci0JZWhlYV9oX2ZyZWVfcmVzb3VyY2UoYWRhcHRlci0+aGFuZGxlLCBlcS0+ZndfaGFuZGxlKTsKKwllaGVhX2hfZnJlZV9yZXNvdXJjZShhZGFwdGVyLT5oYW5kbGUsIGVxLT5md19oYW5kbGUsIEZPUkNFX0ZSRUUpOwogCiBvdXRfZnJlZW1lbToKIAlrZnJlZShlcSk7CkBAIC0zMTYsMjcgKzMyOSw0MSBAQAogCXJldHVybiBlcWU7CiB9CiAKLWludCBlaGVhX2Rlc3Ryb3lfZXEoc3RydWN0IGVoZWFfZXEgKmVxKQordTY0IGVoZWFfZGVzdHJveV9lcV9yZXMoc3RydWN0IGVoZWFfZXEgKmVxLCB1NjQgZm9yY2UpCiB7CiAJdTY0IGhyZXQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWlmICghZXEpCi0JCXJldHVybiAwOwotCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmVxLT5zcGlubG9jaywgZmxhZ3MpOwogCi0JaHJldCA9IGVoZWFfaF9mcmVlX3Jlc291cmNlKGVxLT5hZGFwdGVyLT5oYW5kbGUsIGVxLT5md19oYW5kbGUpOworCWhyZXQgPSBlaGVhX2hfZnJlZV9yZXNvdXJjZShlcS0+YWRhcHRlci0+aGFuZGxlLCBlcS0+ZndfaGFuZGxlLCBmb3JjZSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXEtPnNwaW5sb2NrLCBmbGFncyk7CiAKLQlpZiAoaHJldCAhPSBIX1NVQ0NFU1MpIHsKLQkJZWhlYV9lcnJvcigiZGVzdHJveV9lcSBmYWlsZWQiKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQorCWlmIChocmV0ICE9IEhfU1VDQ0VTUykKKwkJcmV0dXJuIGhyZXQ7CiAKIAlod19xdWV1ZV9kdG9yKCZlcS0+aHdfcXVldWUpOwogCWtmcmVlKGVxKTsKIAorCXJldHVybiBocmV0OworfQorCitpbnQgZWhlYV9kZXN0cm95X2VxKHN0cnVjdCBlaGVhX2VxICplcSkKK3sKKwl1NjQgaHJldDsKKwlpZiAoIWVxKQorCQlyZXR1cm4gMDsKKworCWlmICgoaHJldCA9IGVoZWFfZGVzdHJveV9lcV9yZXMoZXEsIE5PUk1BTF9GUkVFKSkgPT0gSF9SX1NUQVRFKSB7CisJCWVoZWFfZXJyb3JfZGF0YShlcS0+YWRhcHRlciwgZXEtPmZ3X2hhbmRsZSk7CisJCWhyZXQgPSBlaGVhX2Rlc3Ryb3lfZXFfcmVzKGVxLCBGT1JDRV9GUkVFKTsKKwl9CisKKwlpZiAoaHJldCAhPSBIX1NVQ0NFU1MpIHsKKwkJZWhlYV9lcnJvcigiZGVzdHJveSBFUSBmYWlsZWQiKTsKKwkJcmV0dXJuIC1FSU87CisgICAgICAgIH0KKwogCXJldHVybiAwOwogfQogCkBAIC00NzEsNDEgKzQ5OCw1NiBAQAogCiBvdXRfZnJlZXJlczoKIAllaGVhX2hfZGlzYWJsZV9hbmRfZ2V0X2hlYShhZGFwdGVyLT5oYW5kbGUsIHFwLT5md19oYW5kbGUpOwotCWVoZWFfaF9mcmVlX3Jlc291cmNlKGFkYXB0ZXItPmhhbmRsZSwgcXAtPmZ3X2hhbmRsZSk7CisJZWhlYV9oX2ZyZWVfcmVzb3VyY2UoYWRhcHRlci0+aGFuZGxlLCBxcC0+ZndfaGFuZGxlLCBGT1JDRV9GUkVFKTsKIAogb3V0X2ZyZWVtZW06CiAJa2ZyZWUocXApOwogCXJldHVybiBOVUxMOwogfQogCi1pbnQgZWhlYV9kZXN0cm95X3FwKHN0cnVjdCBlaGVhX3FwICpxcCkKK3U2NCBlaGVhX2Rlc3Ryb3lfcXBfcmVzKHN0cnVjdCBlaGVhX3FwICpxcCwgdTY0IGZvcmNlKQogewotCXU2NCBocmV0OwotCXN0cnVjdCBlaGVhX3FwX2luaXRfYXR0ciAqcXBfYXR0ciA9ICZxcC0+aW5pdF9hdHRyOworICAgICAgICB1NjQgaHJldDsKKyAgICAgICAgc3RydWN0IGVoZWFfcXBfaW5pdF9hdHRyICpxcF9hdHRyID0gJnFwLT5pbml0X2F0dHI7CiAKLQlpZiAoIXFwKQotCQlyZXR1cm4gMDsKIAotCWVoZWFfaF9kaXNhYmxlX2FuZF9nZXRfaGVhKHFwLT5hZGFwdGVyLT5oYW5kbGUsIHFwLT5md19oYW5kbGUpOwotCWhyZXQgPSBlaGVhX2hfZnJlZV9yZXNvdXJjZShxcC0+YWRhcHRlci0+aGFuZGxlLCBxcC0+ZndfaGFuZGxlKTsKLQlpZiAoaHJldCAhPSBIX1NVQ0NFU1MpIHsKLQkJZWhlYV9lcnJvcigiZGVzdHJveV9xcCBmYWlsZWQiKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQorICAgICAgICBlaGVhX2hfZGlzYWJsZV9hbmRfZ2V0X2hlYShxcC0+YWRhcHRlci0+aGFuZGxlLCBxcC0+ZndfaGFuZGxlKTsKKyAgICAgICAgaHJldCA9IGVoZWFfaF9mcmVlX3Jlc291cmNlKHFwLT5hZGFwdGVyLT5oYW5kbGUsIHFwLT5md19oYW5kbGUsIGZvcmNlKTsKKyAgICAgICAgaWYgKGhyZXQgIT0gSF9TVUNDRVNTKQorICAgICAgICAgICAgICAgIHJldHVybiBocmV0OwogCi0JaHdfcXVldWVfZHRvcigmcXAtPmh3X3NxdWV1ZSk7Ci0JaHdfcXVldWVfZHRvcigmcXAtPmh3X3JxdWV1ZTEpOworICAgICAgICBod19xdWV1ZV9kdG9yKCZxcC0+aHdfc3F1ZXVlKTsKKyAgICAgICAgaHdfcXVldWVfZHRvcigmcXAtPmh3X3JxdWV1ZTEpOwogCi0gICAJaWYgKHFwX2F0dHItPnJxX2NvdW50ID4gMSkKLQkJaHdfcXVldWVfZHRvcigmcXAtPmh3X3JxdWV1ZTIpOwotICAgCWlmIChxcF9hdHRyLT5ycV9jb3VudCA+IDIpCi0JCWh3X3F1ZXVlX2R0b3IoJnFwLT5od19ycXVldWUzKTsKLQlrZnJlZShxcCk7CisgICAgICAgIGlmIChxcF9hdHRyLT5ycV9jb3VudCA+IDEpCisgICAgICAgICAgICAgICAgaHdfcXVldWVfZHRvcigmcXAtPmh3X3JxdWV1ZTIpOworICAgICAgICBpZiAocXBfYXR0ci0+cnFfY291bnQgPiAyKQorICAgICAgICAgICAgICAgIGh3X3F1ZXVlX2R0b3IoJnFwLT5od19ycXVldWUzKTsKKyAgICAgICAga2ZyZWUocXApOwogCi0JcmV0dXJuIDA7CisgICAgICAgIHJldHVybiBocmV0OwogfQogCi1pbnQgZWhlYV9yZWdfbXJfYWRhcHRlcihzdHJ1Y3QgZWhlYV9hZGFwdGVyICphZGFwdGVyKQoraW50IGVoZWFfZGVzdHJveV9xcChzdHJ1Y3QgZWhlYV9xcCAqcXApCit7CisgICAgICAgIHU2NCBocmV0OworICAgICAgICBpZiAoIXFwKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIGlmICgoaHJldCA9IGVoZWFfZGVzdHJveV9xcF9yZXMocXAsIE5PUk1BTF9GUkVFKSkgPT0gSF9SX1NUQVRFKSB7CisgICAgICAgICAgICAgICAgZWhlYV9lcnJvcl9kYXRhKHFwLT5hZGFwdGVyLCBxcC0+ZndfaGFuZGxlKTsKKyAgICAgICAgICAgICAgICBocmV0ID0gZWhlYV9kZXN0cm95X3FwX3JlcyhxcCwgRk9SQ0VfRlJFRSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaHJldCAhPSBIX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICBlaGVhX2Vycm9yKCJkZXN0cm95IFFQIGZhaWxlZCIpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlPOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK2ludCBlaGVhX3JlZ19rZXJuZWxfbXIoc3RydWN0IGVoZWFfYWRhcHRlciAqYWRhcHRlciwgc3RydWN0IGVoZWFfbXIgKm1yKQogewogCWludCBpLCBrLCByZXQ7CiAJdTY0IGhyZXQsIHB0X2Ficywgc3RhcnQsIGVuZCwgbnJfcGFnZXM7CkBAIC01MjYsMTQgKzU2OCwxNCBAQAogCiAJaHJldCA9IGVoZWFfaF9hbGxvY19yZXNvdXJjZV9tcihhZGFwdGVyLT5oYW5kbGUsIHN0YXJ0LCBlbmQgLSBzdGFydCwKIAkJCQkJYWNjX2N0cmwsIGFkYXB0ZXItPnBkLAotCQkJCQkmYWRhcHRlci0+bXIuaGFuZGxlLCAmYWRhcHRlci0+bXIubGtleSk7CisJCQkJCSZtci0+aGFuZGxlLCAmbXItPmxrZXkpOwogCWlmIChocmV0ICE9IEhfU1VDQ0VTUykgewogCQllaGVhX2Vycm9yKCJhbGxvY19yZXNvdXJjZV9tciBmYWlsZWQiKTsKIAkJcmV0ID0gLUVJTzsKIAkJZ290byBvdXQ7CiAJfQogCi0JYWRhcHRlci0+bXIudmFkZHIgPSBLRVJORUxCQVNFOworCW1yLT52YWRkciA9IEtFUk5FTEJBU0U7CiAJayA9IDA7CiAKIAl3aGlsZSAobnJfcGFnZXMgPiAwKSB7CkBAIC01NDUsNyArNTg3LDcgQEAKIAkJCQkJCQkgICAgIEVIRUFfUEFHRVNJWkUpKSk7CiAKIAkJCWhyZXQgPSBlaGVhX2hfcmVnaXN0ZXJfcnBhZ2VfbXIoYWRhcHRlci0+aGFuZGxlLAotCQkJCQkJCWFkYXB0ZXItPm1yLmhhbmRsZSwgMCwKKwkJCQkJCQltci0+aGFuZGxlLCAwLAogCQkJCQkJCTAsICh1NjQpcHRfYWJzLAogCQkJCQkJCW51bV9wYWdlcyk7CiAJCQlucl9wYWdlcyAtPSBudW1fcGFnZXM7CkBAIC01NTQsMzQgKzU5Niw2OCBAQAogCQkJCQkJCSAgKGsgKiBFSEVBX1BBR0VTSVpFKSkpOwogCiAJCQlocmV0ID0gZWhlYV9oX3JlZ2lzdGVyX3JwYWdlX21yKGFkYXB0ZXItPmhhbmRsZSwKLQkJCQkJCQlhZGFwdGVyLT5tci5oYW5kbGUsIDAsCisJCQkJCQkJbXItPmhhbmRsZSwgMCwKIAkJCQkJCQkwLCBhYnNfYWRyLDEpOwogCQkJbnJfcGFnZXMtLTsKIAkJfQogCiAJCWlmICgoaHJldCAhPSBIX1NVQ0NFU1MpICYmIChocmV0ICE9IEhfUEFHRV9SRUdJU1RFUkVEKSkgewogCQkJZWhlYV9oX2ZyZWVfcmVzb3VyY2UoYWRhcHRlci0+aGFuZGxlLAotCQkJCQkJYWRhcHRlci0+bXIuaGFuZGxlKTsKLQkJCWVoZWFfZXJyb3IoInJlZ2lzdGVyX3JwYWdlX21yIGZhaWxlZDogaHJldCA9ICVsWCIsCi0JCQkJICAgaHJldCk7CisJCQkJCSAgICAgbXItPmhhbmRsZSwgRk9SQ0VfRlJFRSk7CisJCQllaGVhX2Vycm9yKCJyZWdpc3Rlcl9ycGFnZV9tciBmYWlsZWQiKTsKIAkJCXJldCA9IC1FSU87CiAJCQlnb3RvIG91dDsKIAkJfQogCX0KIAogCWlmIChocmV0ICE9IEhfU1VDQ0VTUykgewotCQllaGVhX2hfZnJlZV9yZXNvdXJjZShhZGFwdGVyLT5oYW5kbGUsIGFkYXB0ZXItPm1yLmhhbmRsZSk7Ci0JCWVoZWFfZXJyb3IoInJlZ2lzdGVyX3JwYWdlIGZhaWxlZCBmb3IgbGFzdCBwYWdlOiBocmV0ID0gJWxYIiwKLQkJCSAgIGhyZXQpOworCQllaGVhX2hfZnJlZV9yZXNvdXJjZShhZGFwdGVyLT5oYW5kbGUsIG1yLT5oYW5kbGUsCisJCQkJICAgICBGT1JDRV9GUkVFKTsKKwkJZWhlYV9lcnJvcigicmVnaXN0ZXJfcnBhZ2UgZmFpbGVkIGZvciBsYXN0IHBhZ2UiKTsKIAkJcmV0ID0gLUVJTzsKIAkJZ290byBvdXQ7CiAJfQorCisJbXItPmFkYXB0ZXIgPSBhZGFwdGVyOwogCXJldCA9IDA7CiBvdXQ6CiAJa2ZyZWUocHQpOwogCXJldHVybiByZXQ7CiB9CiAKK2ludCBlaGVhX3JlbV9tcihzdHJ1Y3QgZWhlYV9tciAqbXIpCit7CisJdTY0IGhyZXQ7CisKKwlpZiAoIW1yIHx8ICFtci0+YWRhcHRlcikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlocmV0ID0gZWhlYV9oX2ZyZWVfcmVzb3VyY2UobXItPmFkYXB0ZXItPmhhbmRsZSwgbXItPmhhbmRsZSwKKwkJCQkgICAgRk9SQ0VfRlJFRSk7CisJaWYgKGhyZXQgIT0gSF9TVUNDRVNTKSB7CisJCWVoZWFfZXJyb3IoImRlc3Ryb3kgTVIgZmFpbGVkIik7CisJCXJldHVybiAtRUlPOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgZWhlYV9nZW5fc21yKHN0cnVjdCBlaGVhX2FkYXB0ZXIgKmFkYXB0ZXIsIHN0cnVjdCBlaGVhX21yICpvbGRfbXIsCisJCSBzdHJ1Y3QgZWhlYV9tciAqc2hhcmVkX21yKQoreworCXU2NCBocmV0OworCisJaHJldCA9IGVoZWFfaF9yZWdpc3Rlcl9zbXIoYWRhcHRlci0+aGFuZGxlLCBvbGRfbXItPmhhbmRsZSwKKwkJCQkgICBvbGRfbXItPnZhZGRyLCBFSEVBX01SX0FDQ19DVFJMLAorCQkJCSAgIGFkYXB0ZXItPnBkLCBzaGFyZWRfbXIpOworCWlmIChocmV0ICE9IEhfU1VDQ0VTUykKKwkJcmV0dXJuIC1FSU87CisKKwlzaGFyZWRfbXItPmFkYXB0ZXIgPSBhZGFwdGVyOworCisJcmV0dXJuIDA7Cit9CisKIHZvaWQgcHJpbnRfZXJyb3JfZGF0YSh1NjQgKmRhdGEpCiB7CiAJaW50IGxlbmd0aDsKQEAgLTU5Nyw2ICs2NzMsMTQgQEAKIAkJZWhlYV9lcnJvcigiUVAgKHJlc291cmNlPSVsWCkgc3RhdGU6IEFFUj0weCVsWCwgQUVSUj0weCVsWCwgIgogCQkJICAgInBvcnQ9JWxYIiwgcmVzb3VyY2UsIGRhdGFbNl0sIGRhdGFbMTJdLCBkYXRhWzIyXSk7CiAKKwlpZiAodHlwZSA9PSAweDQpIC8qIENvbXBsZXRpb24gUXVldWUgKi8KKwkJZWhlYV9lcnJvcigiQ1EgKHJlc291cmNlPSVsWCkgc3RhdGU6IEFFUj0weCVsWCIsIHJlc291cmNlLAorCQkJICAgZGF0YVs2XSk7CisKKwlpZiAodHlwZSA9PSAweDMpIC8qIEV2ZW50IFF1ZXVlICovCisJCWVoZWFfZXJyb3IoIkVRIChyZXNvdXJjZT0lbFgpIHN0YXRlOiBBRVI9MHglbFgiLCByZXNvdXJjZSwKKwkJCSAgIGRhdGFbNl0pOworCiAJZWhlYV9kdW1wKGRhdGEsIGxlbmd0aCwgImVycm9yIGRhdGEiKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZWhlYS9laGVhX3Ftci5oIGIvZHJpdmVycy9uZXQvZWhlYS9laGVhX3Ftci5oCmluZGV4IDFmZjYwOTguLmMwZWIzZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2VoZWEvZWhlYV9xbXIuaAorKysgYi9kcml2ZXJzL25ldC9laGVhL2VoZWFfcW1yLmgKQEAgLTE0Miw2ICsxNDIsOCBAQAogI2RlZmluZSBFSEVBX0NRRV9TVEFUX0VSUl9NQVNLICAgICAweDcyMUYKICNkZWZpbmUgRUhFQV9DUUVfU1RBVF9GQVRfRVJSX01BU0sgMHgxRgogI2RlZmluZSBFSEVBX0NRRV9TVEFUX0VSUl9UQ1AgICAgICAweDQwMDAKKyNkZWZpbmUgRUhFQV9DUUVfU1RBVF9FUlJfSVAgICAgICAgMHgyMDAwCisjZGVmaW5lIEVIRUFfQ1FFX1NUQVRfRVJSX0NSQyAgICAgIDB4MTAwMAogCiBzdHJ1Y3QgZWhlYV9jcWUgewogCXU2NCB3cl9pZDsJCS8qIHdvcmsgcmVxdWVzdCBJRCBmcm9tIFdRRSAqLwpAQCAtMzIwLDYgKzMyMiwxMSBAQAogCXJldHVybiBod19xZWl0X2dldF92YWxpZChxdWV1ZSk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBlaGVhX2luY19jcShzdHJ1Y3QgZWhlYV9jcSAqY3EpCit7CisJaHdfcWVpdF9pbmMoJmNxLT5od19xdWV1ZSk7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBlaGVhX2luY19ycTEoc3RydWN0IGVoZWFfcXAgKnFwKQogewogCWh3X3FlaXRfaW5jKCZxcC0+aHdfcnF1ZXVlMSk7CkBAIC0zMjcsNyArMzM0LDcgQEAKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgZWhlYV9jcWUgKmVoZWFfcG9sbF9jcShzdHJ1Y3QgZWhlYV9jcSAqbXlfY3EpCiB7Ci0JcmV0dXJuIGh3X3FlaXRfZ2V0X2luY192YWxpZCgmbXlfY3EtPmh3X3F1ZXVlKTsKKwlyZXR1cm4gaHdfcWVpdF9nZXRfdmFsaWQoJm15X2NxLT5od19xdWV1ZSk7CiB9CiAKICNkZWZpbmUgRUhFQV9DUV9SRUdJU1RFUl9PUklHIDAKQEAgLTM1Niw3ICszNjMsMTIgQEAKIAogaW50IGVoZWFfZGVzdHJveV9xcChzdHJ1Y3QgZWhlYV9xcCAqcXApOwogCi1pbnQgZWhlYV9yZWdfbXJfYWRhcHRlcihzdHJ1Y3QgZWhlYV9hZGFwdGVyICphZGFwdGVyKTsKK2ludCBlaGVhX3JlZ19rZXJuZWxfbXIoc3RydWN0IGVoZWFfYWRhcHRlciAqYWRhcHRlciwgc3RydWN0IGVoZWFfbXIgKm1yKTsKKworaW50IGVoZWFfZ2VuX3NtcihzdHJ1Y3QgZWhlYV9hZGFwdGVyICphZGFwdGVyLCBzdHJ1Y3QgZWhlYV9tciAqb2xkX21yLAorCQkgc3RydWN0IGVoZWFfbXIgKnNoYXJlZF9tcik7CisKK2ludCBlaGVhX3JlbV9tcihzdHJ1Y3QgZWhlYV9tciAqbXIpOwogCiB2b2lkIGVoZWFfZXJyb3JfZGF0YShzdHJ1Y3QgZWhlYV9hZGFwdGVyICphZGFwdGVyLCB1NjQgcmVzX2hhbmRsZSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2VwaWMxMDAuYyBiL2RyaXZlcnMvbmV0L2VwaWMxMDAuYwppbmRleCAzYTZhODNkLi40ZTNmMTRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lcGljMTAwLmMKKysrIGIvZHJpdmVycy9uZXQvZXBpYzEwMC5jCkBAIC05MzQsNyArOTM0LDYgQEAKIAkJZXAtPnJ4X3NrYnVmZltpXSA9IHNrYjsKIAkJaWYgKHNrYiA9PSBOVUxMKQogCQkJYnJlYWs7Ci0JCXNrYi0+ZGV2ID0gZGV2OwkJCS8qIE1hcmsgYXMgYmVpbmcgdXNlZCBieSB0aGlzIGRldmljZS4gKi8KIAkJc2tiX3Jlc2VydmUoc2tiLCAyKTsJLyogMTYgYnl0ZSBhbGlnbiB0aGUgSVAgaGVhZGVyLiAqLwogCQllcC0+cnhfcmluZ1tpXS5idWZhZGRyID0gcGNpX21hcF9zaW5nbGUoZXAtPnBjaV9kZXYsCiAJCQlza2ItPmRhdGEsIGVwLT5yeF9idWZfc3osIFBDSV9ETUFfRlJPTURFVklDRSk7CkBAIC0xMTk5LDcgKzExOTgsNiBAQAogCQkJICAgdG8gYSBtaW5pbWFsbHktc2l6ZWQgc2tidWZmLiAqLwogCQkJaWYgKHBrdF9sZW4gPCByeF9jb3B5YnJlYWsKIAkJCQkmJiAoc2tiID0gZGV2X2FsbG9jX3NrYihwa3RfbGVuICsgMikpICE9IE5VTEwpIHsKLQkJCQlza2ItPmRldiA9IGRldjsKIAkJCQlza2JfcmVzZXJ2ZShza2IsIDIpOwkvKiAxNiBieXRlIGFsaWduIHRoZSBJUCBoZWFkZXIgKi8KIAkJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoZXAtPnBjaV9kZXYsCiAJCQkJCQkJICAgIGVwLT5yeF9yaW5nW2VudHJ5XS5idWZhZGRyLApAQCAtMTIzNiw3ICsxMjM0LDYgQEAKIAkJCXNrYiA9IGVwLT5yeF9za2J1ZmZbZW50cnldID0gZGV2X2FsbG9jX3NrYihlcC0+cnhfYnVmX3N6KTsKIAkJCWlmIChza2IgPT0gTlVMTCkKIAkJCQlicmVhazsKLQkJCXNrYi0+ZGV2ID0gZGV2OwkJCS8qIE1hcmsgYXMgYmVpbmcgdXNlZCBieSB0aGlzIGRldmljZS4gKi8KIAkJCXNrYl9yZXNlcnZlKHNrYiwgMik7CS8qIEFsaWduIElQIG9uIDE2IGJ5dGUgYm91bmRhcmllcyAqLwogCQkJZXAtPnJ4X3JpbmdbZW50cnldLmJ1ZmFkZHIgPSBwY2lfbWFwX3NpbmdsZShlcC0+cGNpX2RldiwKIAkJCQlza2ItPmRhdGEsIGVwLT5yeF9idWZfc3osIFBDSV9ETUFfRlJPTURFVklDRSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGgxNmkuYyBiL2RyaXZlcnMvbmV0L2V0aDE2aS5jCmluZGV4IDkzMjgzZTMuLjA0YWJmNTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aDE2aS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aDE2aS5jCkBAIC0xMTc1LDcgKzExNzUsNiBAQAogCQkJCWJyZWFrOwogCQkJfQogCi0JCQlza2ItPmRldiA9IGRldjsKIAkJCXNrYl9yZXNlcnZlKHNrYiwyKTsKIAogCQkJLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V3cmszLmMgYi9kcml2ZXJzL25ldC9ld3JrMy5jCmluZGV4IDcxNGVhMTEuLmNiMDc5MmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V3cmszLmMKKysrIGIvZHJpdmVycy9uZXQvZXdyazMuYwpAQCAtOTkzLDcgKzk5Myw2IEBACiAKIAkJCQkJaWYgKChza2IgPSBkZXZfYWxsb2Nfc2tiKHBrdF9sZW4gKyAyKSkgIT0gTlVMTCkgewogCQkJCQkJdW5zaWduZWQgY2hhciAqcDsKLQkJCQkJCXNrYi0+ZGV2ID0gZGV2OwogCQkJCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsJLyogQWxpZ24gdG8gMTYgYnl0ZXMgKi8KIAkJCQkJCXAgPSBza2JfcHV0KHNrYiwgcGt0X2xlbik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2ZlYWxueC5jIGIvZHJpdmVycy9uZXQvZmVhbG54LmMKaW5kZXggMzhhMTNmNC4uYWJlOWIwOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZmVhbG54LmMKKysrIGIvZHJpdmVycy9uZXQvZmVhbG54LmMKQEAgLTE3MTksNyArMTcxOSw2IEBACiAJCQkgICB0byBhIG1pbmltYWxseS1zaXplZCBza2J1ZmYuICovCiAJCQlpZiAocGt0X2xlbiA8IHJ4X2NvcHlicmVhayAmJgogCQkJICAgIChza2IgPSBkZXZfYWxsb2Nfc2tiKHBrdF9sZW4gKyAyKSkgIT0gTlVMTCkgewotCQkJCXNrYi0+ZGV2ID0gZGV2OwogCQkJCXNrYl9yZXNlcnZlKHNrYiwgMik7CS8qIDE2IGJ5dGUgYWxpZ24gdGhlIElQIGhlYWRlciAqLwogCQkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdShucC0+cGNpX2RldiwKIAkJCQkJCQkgICAgbnAtPmN1cl9yeC0+YnVmZmVyLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZmVjLmMgYi9kcml2ZXJzL25ldC9mZWMuYwppbmRleCA2NzY0MjgxLi4yNTViMDkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9mZWMuYworKysgYi9kcml2ZXJzL25ldC9mZWMuYwpAQCAtNjQ3LDcgKzY0Nyw2IEBACiAJCXByaW50aygiJXM6IE1lbW9yeSBzcXVlZXplLCBkcm9wcGluZyBwYWNrZXQuXG4iLCBkZXYtPm5hbWUpOwogCQlmZXAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKIAl9IGVsc2UgewotCQlza2ItPmRldiA9IGRldjsKIAkJc2tiX3B1dChza2IscGt0X2xlbi00KTsJLyogTWFrZSByb29tICovCiAJCWV0aF9jb3B5X2FuZF9zdW0oc2tiLCBkYXRhLCBwa3RfbGVuLTQsIDApOwogCQlza2ItPnByb3RvY29sPWV0aF90eXBlX3RyYW5zKHNrYixkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZmVjXzh4eC9mZWNfbWFpbi5jIGIvZHJpdmVycy9uZXQvZmVjXzh4eC9mZWNfbWFpbi5jCmluZGV4IDc3Zjc0N2EuLmU4MjRkNWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2ZlY184eHgvZmVjX21haW4uYworKysgYi9kcml2ZXJzL25ldC9mZWNfOHh4L2ZlY19tYWluLmMKQEAgLTU1MSw3ICs1NTEsOSBAQAogCQkJCXNrYm4gPSBkZXZfYWxsb2Nfc2tiKHBrdF9sZW4gKyAyKTsKIAkJCQlpZiAoc2tibiAhPSBOVUxMKSB7CiAJCQkJCXNrYl9yZXNlcnZlKHNrYm4sIDIpOwkvKiBhbGlnbiBJUCBoZWFkZXIgKi8KLQkJCQkJbWVtY3B5KHNrYm4tPmRhdGEsIHNrYi0+ZGF0YSwgcGt0X2xlbik7CisJCQkJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiCisJCQkJCQkJCSAgc2tibi0+ZGF0YSwKKwkJCQkJCQkJICBwa3RfbGVuKTsKIAkJCQkJLyogc3dhcCAqLwogCQkJCQlza2J0ID0gc2tiOwogCQkJCQlza2IgPSBza2JuOwpAQCAtNTYxLDcgKzU2Myw2IEBACiAJCQkJc2tibiA9IGRldl9hbGxvY19za2IoRU5FVF9SWF9GUlNJWkUpOwogCiAJCQlpZiAoc2tibiAhPSBOVUxMKSB7Ci0JCQkJc2tiLT5kZXYgPSBkZXY7CiAJCQkJc2tiX3B1dChza2IsIHBrdF9sZW4pOwkvKiBNYWtlIHJvb20gKi8KIAkJCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOwogCQkJCXJlY2VpdmVkKys7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9mb3JjZWRldGguYyBiL2RyaXZlcnMvbmV0L2ZvcmNlZGV0aC5jCmluZGV4IGQwNDIxNGUuLjdhMDE4MDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2ZvcmNlZGV0aC5jCisrKyBiL2RyaXZlcnMvbmV0L2ZvcmNlZGV0aC5jCkBAIC0xMzg1LDExICsxMzg1LDEyIEBACiAJd2hpbGUgKG5wLT5wdXRfcngub3JpZyAhPSBsZXNzX3J4KSB7CiAJCXN0cnVjdCBza19idWZmICpza2IgPSBkZXZfYWxsb2Nfc2tiKG5wLT5yeF9idWZfc3ogKyBOVl9SWF9BTExPQ19QQUQpOwogCQlpZiAoc2tiKSB7Ci0JCQlza2ItPmRldiA9IGRldjsKIAkJCW5wLT5wdXRfcnhfY3R4LT5za2IgPSBza2I7Ci0JCQlucC0+cHV0X3J4X2N0eC0+ZG1hID0gcGNpX21hcF9zaW5nbGUobnAtPnBjaV9kZXYsIHNrYi0+ZGF0YSwKLQkJCQkJCQkgICAgIHNrYi0+ZW5kLXNrYi0+ZGF0YSwgUENJX0RNQV9GUk9NREVWSUNFKTsKLQkJCW5wLT5wdXRfcnhfY3R4LT5kbWFfbGVuID0gc2tiLT5lbmQtc2tiLT5kYXRhOworCQkJbnAtPnB1dF9yeF9jdHgtPmRtYSA9IHBjaV9tYXBfc2luZ2xlKG5wLT5wY2lfZGV2LAorCQkJCQkJCSAgICAgc2tiLT5kYXRhLAorCQkJCQkJCSAgICAgc2tiX3RhaWxyb29tKHNrYiksCisJCQkJCQkJICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJbnAtPnB1dF9yeF9jdHgtPmRtYV9sZW4gPSBza2JfdGFpbHJvb20oc2tiKTsKIAkJCW5wLT5wdXRfcngub3JpZy0+YnVmID0gY3B1X3RvX2xlMzIobnAtPnB1dF9yeF9jdHgtPmRtYSk7CiAJCQl3bWIoKTsKIAkJCW5wLT5wdXRfcngub3JpZy0+ZmxhZ2xlbiA9IGNwdV90b19sZTMyKG5wLT5yeF9idWZfc3ogfCBOVl9SWF9BVkFJTCk7CkBAIC0xNDE2LDExICsxNDE3LDEyIEBACiAJd2hpbGUgKG5wLT5wdXRfcnguZXggIT0gbGVzc19yeCkgewogCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gZGV2X2FsbG9jX3NrYihucC0+cnhfYnVmX3N6ICsgTlZfUlhfQUxMT0NfUEFEKTsKIAkJaWYgKHNrYikgewotCQkJc2tiLT5kZXYgPSBkZXY7CiAJCQlucC0+cHV0X3J4X2N0eC0+c2tiID0gc2tiOwotCQkJbnAtPnB1dF9yeF9jdHgtPmRtYSA9IHBjaV9tYXBfc2luZ2xlKG5wLT5wY2lfZGV2LCBza2ItPmRhdGEsCi0JCQkJCQkJICAgICBza2ItPmVuZC1za2ItPmRhdGEsIFBDSV9ETUFfRlJPTURFVklDRSk7Ci0JCQlucC0+cHV0X3J4X2N0eC0+ZG1hX2xlbiA9IHNrYi0+ZW5kLXNrYi0+ZGF0YTsKKwkJCW5wLT5wdXRfcnhfY3R4LT5kbWEgPSBwY2lfbWFwX3NpbmdsZShucC0+cGNpX2RldiwKKwkJCQkJCQkgICAgIHNrYi0+ZGF0YSwKKwkJCQkJCQkgICAgIHNrYl90YWlscm9vbShza2IpLAorCQkJCQkJCSAgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCW5wLT5wdXRfcnhfY3R4LT5kbWFfbGVuID0gc2tiX3RhaWxyb29tKHNrYik7CiAJCQlucC0+cHV0X3J4LmV4LT5idWZoaWdoID0gY3B1X3RvX2xlNjQobnAtPnB1dF9yeF9jdHgtPmRtYSkgPj4gMzI7CiAJCQlucC0+cHV0X3J4LmV4LT5idWZsb3cgPSBjcHVfdG9fbGU2NChucC0+cHV0X3J4X2N0eC0+ZG1hKSAmIDB4MEZGRkZGRkZGOwogCQkJd21iKCk7CkBAIC0xNjA0LDggKzE2MDYsOSBAQAogCQl3bWIoKTsKIAkJaWYgKG5wLT5yeF9za2JbaV0uc2tiKSB7CiAJCQlwY2lfdW5tYXBfc2luZ2xlKG5wLT5wY2lfZGV2LCBucC0+cnhfc2tiW2ldLmRtYSwKLQkJCQkJCW5wLT5yeF9za2JbaV0uc2tiLT5lbmQtbnAtPnJ4X3NrYltpXS5za2ItPmRhdGEsCi0JCQkJCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJCQkgKHNrYl9lbmRfcG9pbnRlcihucC0+cnhfc2tiW2ldLnNrYikgLQorCQkJCQkgIG5wLT5yeF9za2JbaV0uc2tiLT5kYXRhKSwKKwkJCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7CiAJCQlkZXZfa2ZyZWVfc2tiKG5wLT5yeF9za2JbaV0uc2tiKTsKIAkJCW5wLT5yeF9za2JbaV0uc2tiID0gTlVMTDsKIAkJfQpAQCAtNDM3NiwxMSArNDM3OSwxMiBAQAogCQlyZXQgPSAwOwogCQlnb3RvIG91dDsKIAl9CisJdGVzdF9kbWFfYWRkciA9IHBjaV9tYXBfc2luZ2xlKG5wLT5wY2lfZGV2LCB0eF9za2ItPmRhdGEsCisJCQkJICAgICAgIHNrYl90YWlscm9vbSh0eF9za2IpLAorCQkJCSAgICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOwogCXBrdF9kYXRhID0gc2tiX3B1dCh0eF9za2IsIHBrdF9sZW4pOwogCWZvciAoaSA9IDA7IGkgPCBwa3RfbGVuOyBpKyspCiAJCXBrdF9kYXRhW2ldID0gKHU4KShpICYgMHhmZik7Ci0JdGVzdF9kbWFfYWRkciA9IHBjaV9tYXBfc2luZ2xlKG5wLT5wY2lfZGV2LCB0eF9za2ItPmRhdGEsCi0JCQkJICAgICAgIHR4X3NrYi0+ZW5kLXR4X3NrYi0+ZGF0YSwgUENJX0RNQV9GUk9NREVWSUNFKTsKIAogCWlmIChucC0+ZGVzY192ZXIgPT0gREVTQ19WRVJfMSB8fCBucC0+ZGVzY192ZXIgPT0gREVTQ19WRVJfMikgewogCQlucC0+dHhfcmluZy5vcmlnWzBdLmJ1ZiA9IGNwdV90b19sZTMyKHRlc3RfZG1hX2FkZHIpOwpAQCAtNDQzNyw3ICs0NDQxLDcgQEAKIAl9CiAKIAlwY2lfdW5tYXBfcGFnZShucC0+cGNpX2RldiwgdGVzdF9kbWFfYWRkciwKLQkJICAgICAgIHR4X3NrYi0+ZW5kLXR4X3NrYi0+ZGF0YSwKKwkJICAgICAgIChza2JfZW5kX3BvaW50ZXIodHhfc2tiKSAtIHR4X3NrYi0+ZGF0YSksCiAJCSAgICAgICBQQ0lfRE1BX1RPREVWSUNFKTsKIAlkZXZfa2ZyZWVfc2tiX2FueSh0eF9za2IpOwogIG91dDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2ZzX2VuZXQvZnNfZW5ldC1tYWluLmMgYi9kcml2ZXJzL25ldC9mc19lbmV0L2ZzX2VuZXQtbWFpbi5jCmluZGV4IDRhMDVjMTQuLmUyZGRkNjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2ZzX2VuZXQvZnNfZW5ldC1tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvZnNfZW5ldC9mc19lbmV0LW1haW4uYwpAQCAtMTYwLDcgKzE2MCw4IEBACiAJCQkJc2tibiA9IGRldl9hbGxvY19za2IocGt0X2xlbiArIDIpOwogCQkJCWlmIChza2JuICE9IE5VTEwpIHsKIAkJCQkJc2tiX3Jlc2VydmUoc2tibiwgMik7CS8qIGFsaWduIElQIGhlYWRlciAqLwotCQkJCQltZW1jcHkoc2tibi0+ZGF0YSwgc2tiLT5kYXRhLCBwa3RfbGVuKTsKKwkJCQkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsCisJCQkJCQkgICAgICBza2JuLT5kYXRhLCBwa3RfbGVuKTsKIAkJCQkJLyogc3dhcCAqLwogCQkJCQlza2J0ID0gc2tiOwogCQkJCQlza2IgPSBza2JuOwpAQCAtMTcwLDcgKzE3MSw2IEBACiAJCQkJc2tibiA9IGRldl9hbGxvY19za2IoRU5FVF9SWF9GUlNJWkUpOwogCiAJCQlpZiAoc2tibiAhPSBOVUxMKSB7Ci0JCQkJc2tiLT5kZXYgPSBkZXY7CiAJCQkJc2tiX3B1dChza2IsIHBrdF9sZW4pOwkvKiBNYWtlIHJvb20gKi8KIAkJCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOwogCQkJCXJlY2VpdmVkKys7CkBAIC0yOTQsNyArMjk0LDggQEAKIAkJCQlza2JuID0gZGV2X2FsbG9jX3NrYihwa3RfbGVuICsgMik7CiAJCQkJaWYgKHNrYm4gIT0gTlVMTCkgewogCQkJCQlza2JfcmVzZXJ2ZShza2JuLCAyKTsJLyogYWxpZ24gSVAgaGVhZGVyICovCi0JCQkJCW1lbWNweShza2JuLT5kYXRhLCBza2ItPmRhdGEsIHBrdF9sZW4pOworCQkJCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwKKwkJCQkJCSAgICAgIHNrYm4tPmRhdGEsIHBrdF9sZW4pOwogCQkJCQkvKiBzd2FwICovCiAJCQkJCXNrYnQgPSBza2I7CiAJCQkJCXNrYiA9IHNrYm47CkBAIC0zMDQsNyArMzA1LDYgQEAKIAkJCQlza2JuID0gZGV2X2FsbG9jX3NrYihFTkVUX1JYX0ZSU0laRSk7CiAKIAkJCWlmIChza2JuICE9IE5VTEwpIHsKLQkJCQlza2ItPmRldiA9IGRldjsKIAkJCQlza2JfcHV0KHNrYiwgcGt0X2xlbik7CS8qIE1ha2Ugcm9vbSAqLwogCQkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CiAJCQkJcmVjZWl2ZWQrKzsKQEAgLTUxNiw3ICs1MTYsNiBAQAogCQkJYnJlYWs7CiAJCX0KIAkJZmVwLT5yeF9za2J1ZmZbaV0gPSBza2I7Ci0JCXNrYi0+ZGV2ID0gZGV2OwogCQlDQkRXX0JVRkFERFIoYmRwLAogCQkJZG1hX21hcF9zaW5nbGUoZmVwLT5kZXYsIHNrYi0+ZGF0YSwKIAkJCQlMMV9DQUNIRV9BTElHTihQS1RfTUFYQlVGX1NJWkUpLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZ2lhbmZhci5jIGIvZHJpdmVycy9uZXQvZ2lhbmZhci5jCmluZGV4IGQ5ODFkNGMuLmI2NjZhMGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2dpYW5mYXIuYworKysgYi9kcml2ZXJzL25ldC9naWFuZmFyLmMKQEAgLTk0MiwxOCArOTQyLDE4IEBACiAKIAkvKiBUZWxsIHRoZSBjb250cm9sbGVyIHdoYXQgdGhlIHByb3RvY29sIGlzICovCiAJLyogQW5kIHByb3ZpZGUgdGhlIGFscmVhZHkgY2FsY3VsYXRlZCBwaGNzICovCi0JaWYgKHNrYi0+bmguaXBoLT5wcm90b2NvbCA9PSBJUFBST1RPX1VEUCkgeworCWlmIChpcF9oZHIoc2tiKS0+cHJvdG9jb2wgPT0gSVBQUk9UT19VRFApIHsKIAkJZmxhZ3MgfD0gVFhGQ0JfVURQOwotCQlmY2ItPnBoY3MgPSBza2ItPmgudWgtPmNoZWNrOworCQlmY2ItPnBoY3MgPSB1ZHBfaGRyKHNrYiktPmNoZWNrOwogCX0gZWxzZQotCQlmY2ItPnBoY3MgPSBza2ItPmgudGgtPmNoZWNrOworCQlmY2ItPnBoY3MgPSB1ZHBfaGRyKHNrYiktPmNoZWNrOwogCiAJLyogbDNvcyBpcyB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnQgb2YgdGhlCiAJICogZnJhbWUgKHNrYi0+ZGF0YSkgYW5kIHRoZSBzdGFydCBvZiB0aGUgSVAgaGRyLgogCSAqIGw0b3MgaXMgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN0YXJ0IG9mIHRoZQogCSAqIGwzIGhkciBhbmQgdGhlIGw0IGhkciAqLwotCWZjYi0+bDNvcyA9ICh1MTYpKHNrYi0+bmgucmF3IC0gc2tiLT5kYXRhIC0gR01BQ19GQ0JfTEVOKTsKLQlmY2ItPmw0b3MgPSAodTE2KShza2ItPmgucmF3IC0gc2tiLT5uaC5yYXcpOworCWZjYi0+bDNvcyA9ICh1MTYpKHNrYl9uZXR3b3JrX29mZnNldChza2IpIC0gR01BQ19GQ0JfTEVOKTsKKwlmY2ItPmw0b3MgPSBza2JfbmV0d29ya19oZWFkZXJfbGVuKHNrYik7CiAKIAlmY2ItPmZsYWdzID0gZmxhZ3M7CiB9CkBAIC0xMjk1LDggKzEyOTUsNiBAQAogCSAqLwogCXNrYl9yZXNlcnZlKHNrYiwgYWxpZ25hbW91bnQpOwogCi0Jc2tiLT5kZXYgPSBkZXY7Ci0KIAliZHAtPmJ1ZlB0ciA9IGRtYV9tYXBfc2luZ2xlKE5VTEwsIHNrYi0+ZGF0YSwKIAkJCXByaXYtPnJ4X2J1ZmZlcl9zaXplLCBETUFfRlJPTV9ERVZJQ0UpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9oYW1hY2hpLmMgYi9kcml2ZXJzL25ldC9oYW1hY2hpLmMKaW5kZXggYzNjMGQ2Ny4uMjUyMWIxMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaGFtYWNoaS5jCisrKyBiL2RyaXZlcnMvbmV0L2hhbWFjaGkuYwpAQCAtMTU2OCw3ICsxNTY4LDYgQEAKIAkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiByeF9jb3B5YnJlYWsgbm9uLXplcm8gIgogCQkJCSAgIm5vdCBnb29kIHdpdGggUlhfQ0hFQ0tTVU1cbiIsIGRldi0+bmFtZSk7CiAjZW5kaWYKLQkJCQlza2ItPmRldiA9IGRldjsKIAkJCQlza2JfcmVzZXJ2ZShza2IsIDIpOwkvKiAxNiBieXRlIGFsaWduIHRoZSBJUCBoZWFkZXIgKi8KIAkJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoaG1wLT5wY2lfZGV2LAogCQkJCQkJCSAgICBobXAtPnJ4X3JpbmdbZW50cnldLmFkZHIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9oYW1yYWRpby9iYXljb21fc2VyX2ZkeC5jIGIvZHJpdmVycy9uZXQvaGFtcmFkaW8vYmF5Y29tX3Nlcl9mZHguYwppbmRleCAzMGJhZjZlLi4xN2FjNjk3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9oYW1yYWRpby9iYXljb21fc2VyX2ZkeC5jCisrKyBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvL2JheWNvbV9zZXJfZmR4LmMKQEAgLTQxNSwxMSArNDE1LDE4IEBACiAKIAlpZiAoIWRldiB8fCAhYmMpCiAJCXJldHVybiAtRU5YSU87Ci0JaWYgKCFkZXYtPmJhc2VfYWRkciB8fCBkZXYtPmJhc2VfYWRkciA+IDB4MTAwMC1TRVIxMl9FWFRFTlQgfHwKLQkgICAgZGV2LT5pcnEgPCAyIHx8IGRldi0+aXJxID4gMTUpCisJaWYgKCFkZXYtPmJhc2VfYWRkciB8fCBkZXYtPmJhc2VfYWRkciA+IDB4ZmZmZi1TRVIxMl9FWFRFTlQgfHwKKwkgICAgZGV2LT5pcnEgPCAyIHx8IGRldi0+aXJxID4gTlJfSVJRUykgeworCQlwcmludGsoS0VSTl9JTkZPICJiYXljb21fc2VyX2ZkeDogaW52YWxpZCBwb3J0bnVtYmVyIChtYXggJXUpICIKKwkJCQkib3IgaXJxICgyIDw9IGlycSA8PSAlZClcbiIsCisJCQkJMHhmZmZmLVNFUjEyX0VYVEVOVCwgTlJfSVJRUyk7CiAJCXJldHVybiAtRU5YSU87Ci0JaWYgKGJjLT5iYXVkIDwgMzAwIHx8IGJjLT5iYXVkID4gNDgwMCkKKwl9CisJaWYgKGJjLT5iYXVkIDwgMzAwIHx8IGJjLT5iYXVkID4gNDgwMCkgeworCQlwcmludGsoS0VSTl9JTkZPICJiYXljb21fc2VyX2ZkeDogaW52YWxpZCBiYXVkcmF0ZSAiCisJCQkJIigzMDAuLi40ODAwKVxuIik7CiAJCXJldHVybiAtRUlOVkFMOworCX0KIAlpZiAoIXJlcXVlc3RfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBTRVIxMl9FWFRFTlQsICJiYXljb21fc2VyX2ZkeCIpKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIkJBWUNPTV9TRVJfRlNYOiBJL08gcG9ydCAweCUwNGx4IGJ1c3kgXG4iLCAKIAkJICAgICAgIGRldi0+YmFzZV9hZGRyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2hhbXJhZGlvL2JwcWV0aGVyLmMgYi9kcml2ZXJzL25ldC9oYW1yYWRpby9icHFldGhlci5jCmluZGV4IGQyNTQyNjkuLjY1NmYyNzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2hhbXJhZGlvL2JwcWV0aGVyLmMKKysrIGIvZHJpdmVycy9uZXQvaGFtcmFkaW8vYnBxZXRoZXIuYwpAQCAtMjgyLDcgKzI4Miw3IEBACiAJfQogCiAJc2tiLT5wcm90b2NvbCA9IGF4MjVfdHlwZV90cmFucyhza2IsIGRldik7Ci0Jc2tiLT5uaC5yYXcgPSBza2ItPmRhdGE7CisJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CiAJZGV2LT5oYXJkX2hlYWRlcihza2IsIGRldiwgRVRIX1BfQlBRLCBicHEtPmRlc3RfYWRkciwgTlVMTCwgMCk7CiAJYnBxLT5zdGF0cy50eF9wYWNrZXRzKys7CiAJYnBxLT5zdGF0cy50eF9ieXRlcys9c2tiLT5sZW47CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9oYW1yYWRpby9kbWFzY2MuYyBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvL2RtYXNjYy5jCmluZGV4IDBmYmI0MTQuLjNiZThjNTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2hhbXJhZGlvL2RtYXNjYy5jCisrKyBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvL2RtYXNjYy5jCkBAIC05MzAsNyArOTMwLDcgQEAKIAogCS8qIFRyYW5zZmVyIGRhdGEgdG8gRE1BIGJ1ZmZlciAqLwogCWkgPSBwcml2LT50eF9oZWFkOwotCW1lbWNweShwcml2LT50eF9idWZbaV0sIHNrYi0+ZGF0YSArIDEsIHNrYi0+bGVuIC0gMSk7CisJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YV9vZmZzZXQoc2tiLCAxLCBwcml2LT50eF9idWZbaV0sIHNrYi0+bGVuIC0gMSk7CiAJcHJpdi0+dHhfbGVuW2ldID0gc2tiLT5sZW4gLSAxOwogCiAJLyogQ2xlYXIgaW50ZXJydXB0cyB3aGlsZSB3ZSB0b3VjaCBvdXIgY2lyY3VsYXIgYnVmZmVycyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaGFtcmFkaW8vaGRsY2Rydi5jIGIvZHJpdmVycy9uZXQvaGFtcmFkaW8vaGRsY2Rydi5jCmluZGV4IGY1YTE3YWQuLmIzM2FkYzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2hhbXJhZGlvL2hkbGNkcnYuYworKysgYi9kcml2ZXJzL25ldC9oYW1yYWRpby9oZGxjZHJ2LmMKQEAgLTMxNyw3ICszMTcsOSBAQAogCQkJCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CiAJCQkJYnJlYWs7CiAJCQl9Ci0JCQltZW1jcHkocy0+aGRsY3R4LmJ1ZmZlciwgc2tiLT5kYXRhKzEsIHBrdF9sZW4pOworCQkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YV9vZmZzZXQoc2tiLCAxLAorCQkJCQkJCSBzLT5oZGxjdHguYnVmZmVyLAorCQkJCQkJCSBwa3RfbGVuKTsKIAkJCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CiAJCQlzLT5oZGxjdHguYnAgPSBzLT5oZGxjdHguYnVmZmVyOwogCQkJYXBwZW5kX2NyY19jY2l0dChzLT5oZGxjdHguYnVmZmVyLCBwa3RfbGVuKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2hhbXJhZGlvL3lhbS5jIGIvZHJpdmVycy9uZXQvaGFtcmFkaW8veWFtLmMKaW5kZXggZWUzZWE0Zi4uNDY3NTU5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaGFtcmFkaW8veWFtLmMKKysrIGIvZHJpdmVycy9uZXQvaGFtcmFkaW8veWFtLmMKQEAgLTYzOCw3ICs2MzgsOSBAQAogICAgICAgICAJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwogCQkJCWJyZWFrOwogCQkJfQotCQkJbWVtY3B5KHlwLT50eF9idWYsIHNrYi0+ZGF0YSArIDEsIHlwLT50eF9sZW4pOworCQkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YV9vZmZzZXQoc2tiLCAxLAorCQkJCQkJCSB5cC0+dHhfYnVmLAorCQkJCQkJCSB5cC0+dHhfbGVuKTsKIAkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CiAJCQl5cC0+dHhfY291bnQgPSAwOwogCQkJeXAtPnR4X2NyY2wgPSAweDIxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaHAxMDAuYyBiL2RyaXZlcnMvbmV0L2hwMTAwLmMKaW5kZXggN2RjNTE4NS4uODExOGE2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaHAxMDAuYworKysgYi9kcml2ZXJzL25ldC9ocDEwMC5jCkBAIC0xODE2LDcgKzE4MTYsNiBAQAogCQkJdV9jaGFyICpwdHI7CiAKIAkJCXNrYl9yZXNlcnZlKHNrYiwyKTsKLQkJCXNrYi0+ZGV2ID0gZGV2OwogCiAJCQkvKiBwdHIgdG8gc3RhcnQgb2YgdGhlIHNrX2J1ZmYgZGF0YSBhcmVhICovCiAJCQlza2JfcHV0KHNrYiwgcGt0X2xlbik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pYm1fZW1hYy9pYm1fZW1hY19jb3JlLmMgYi9kcml2ZXJzL25ldC9pYm1fZW1hYy9pYm1fZW1hY19jb3JlLmMKaW5kZXggZGQ4YWQ4Ny4uM2Q4MmQ0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaWJtX2VtYWMvaWJtX2VtYWNfY29yZS5jCisrKyBiL2RyaXZlcnMvbmV0L2libV9lbWFjL2libV9lbWFjX2NvcmUuYwpAQCAtMTMzOCw3ICsxMzM4LDcgQEAKIAkJCWRldl9rZnJlZV9za2IoZGV2LT5yeF9zZ19za2IpOwogCQkJZGV2LT5yeF9zZ19za2IgPSBOVUxMOwogCQl9IGVsc2UgewotCQkJY2FjaGVhYmxlX21lbWNweShkZXYtPnJ4X3NnX3NrYi0+dGFpbCwKKwkJCWNhY2hlYWJsZV9tZW1jcHkoc2tiX3RhaWxfcG9pbnRlcihkZXYtPnJ4X3NnX3NrYiksCiAJCQkJCSBkZXYtPnJ4X3NrYltzbG90XS0+ZGF0YSwgbGVuKTsKIAkJCXNrYl9wdXQoZGV2LT5yeF9zZ19za2IsIGxlbik7CiAJCQllbWFjX3JlY3ljbGVfcnhfc2tiKGRldiwgc2xvdCwgbGVuKTsKQEAgLTEzOTgsNyArMTM5OCw2IEBACiAKIAkJc2tiX3B1dChza2IsIGxlbik7CiAJICAgICAgcHVzaF9wYWNrZXQ6Ci0JCXNrYi0+ZGV2ID0gZGV2LT5uZGV2OwogCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYtPm5kZXYpOwogCQllbWFjX3J4X2NzdW0oZGV2LCBza2IsIGN0cmwpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pYm1sYW5hLmMgYi9kcml2ZXJzL25ldC9pYm1sYW5hLmMKaW5kZXggM2Y5NDZjOC4uZmU4NWQ2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaWJtbGFuYS5jCisrKyBiL2RyaXZlcnMvbmV0L2libWxhbmEuYwpAQCAtNjAxLDcgKzYwMSw2IEBACiAKIAkJCQkvKiBzZXQgdXAgc2tiIGZpZWxkcyAqLwogCi0JCQkJc2tiLT5kZXYgPSBkZXY7CiAJCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKIAkJCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2libXZldGguYyBiL2RyaXZlcnMvbmV0L2libXZldGguYwppbmRleCA0NThkYjA1Li4zYmVjMGY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pYm12ZXRoLmMKKysrIGIvZHJpdmVycy9uZXQvaWJtdmV0aC5jCkBAIC05Myw3ICs5Myw3IEBACiBzdGF0aWMgdm9pZCBpYm12ZXRoX3Byb2NfcmVnaXN0ZXJfYWRhcHRlcihzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyKTsKIHN0YXRpYyB2b2lkIGlibXZldGhfcHJvY191bnJlZ2lzdGVyX2FkYXB0ZXIoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcik7CiBzdGF0aWMgaXJxcmV0dXJuX3QgaWJtdmV0aF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlKTsKLXN0YXRpYyBpbmxpbmUgdm9pZCBpYm12ZXRoX3J4cV9oYXJ2ZXN0X2J1ZmZlcihzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyKTsKK3N0YXRpYyB2b2lkIGlibXZldGhfcnhxX2hhcnZlc3RfYnVmZmVyKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIpOwogc3RhdGljIHN0cnVjdCBrb2JqX3R5cGUga3R5cGVfdmV0aF9wb29sOwogCiAjaWZkZWYgQ09ORklHX1BST0NfRlMKQEAgLTM4OSw3ICszODksNyBAQAogCX0KIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGlibXZldGhfcnhxX2hhcnZlc3RfYnVmZmVyKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIpCitzdGF0aWMgdm9pZCBpYm12ZXRoX3J4cV9oYXJ2ZXN0X2J1ZmZlcihzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyKQogewogCWlibXZldGhfcmVtb3ZlX2J1ZmZlcl9mcm9tX3Bvb2woYWRhcHRlciwgYWRhcHRlci0+cnhfcXVldWUucXVldWVfYWRkclthZGFwdGVyLT5yeF9xdWV1ZS5pbmRleF0uY29ycmVsYXRvcik7CiAKQEAgLTc5OCw3ICs3OTgsNiBAQAogCiAJCQkJc2tiX3Jlc2VydmUoc2tiLCBvZmZzZXQpOwogCQkJCXNrYl9wdXQoc2tiLCBsZW5ndGgpOwotCQkJCXNrYi0+ZGV2ID0gbmV0ZGV2OwogCQkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIG5ldGRldik7CiAKIAkJCQluZXRpZl9yZWNlaXZlX3NrYihza2IpOwkvKiBzZW5kIGl0IHVwICovCkBAIC05NTQsMTQgKzk1MywxNiBAQAogCWlibXZldGhfZGVidWdfcHJpbnRrX25vX2FkYXB0ZXIoImVudGVyaW5nIGlibXZldGhfcHJvYmUgZm9yIFVBIDB4JXhcbiIsCiAJCQkJCWRldi0+dW5pdF9hZGRyZXNzKTsKIAotCW1hY19hZGRyX3AgPSAodW5zaWduZWQgY2hhciAqKSB2aW9fZ2V0X2F0dHJpYnV0ZShkZXYsIFZFVEhfTUFDX0FERFIsIDApOworCW1hY19hZGRyX3AgPSAodW5zaWduZWQgY2hhciAqKSB2aW9fZ2V0X2F0dHJpYnV0ZShkZXYsCisJCQkJCQlWRVRIX01BQ19BRERSLCBOVUxMKTsKIAlpZighbWFjX2FkZHJfcCkgewogCQlwcmludGsoS0VSTl9FUlIgIiglczolMy4zZCkgRVJST1I6IENhbid0IGZpbmQgVkVUSF9NQUNfQUREUiAiCiAJCQkJImF0dHJpYnV0ZVxuIiwgX19GSUxFX18sIF9fTElORV9fKTsKIAkJcmV0dXJuIDA7CiAJfQogCi0JbWNhc3RGaWx0ZXJTaXplX3A9ICh1bnNpZ25lZCBpbnQgKikgdmlvX2dldF9hdHRyaWJ1dGUoZGV2LCBWRVRIX01DQVNUX0ZJTFRFUl9TSVpFLCAwKTsKKwltY2FzdEZpbHRlclNpemVfcCA9ICh1bnNpZ25lZCBpbnQgKikgdmlvX2dldF9hdHRyaWJ1dGUoZGV2LAorCQkJCQkJVkVUSF9NQ0FTVF9GSUxURVJfU0laRSwgTlVMTCk7CiAJaWYoIW1jYXN0RmlsdGVyU2l6ZV9wKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiKCVzOiUzLjNkKSBFUlJPUjogQ2FuJ3QgZmluZCAiCiAJCQkJIlZFVEhfTUNBU1RfRklMVEVSX1NJWkUgYXR0cmlidXRlXG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaW9jMy1ldGguYyBiL2RyaXZlcnMvbmV0L2lvYzMtZXRoLmMKaW5kZXggNGFkNzgwNy4uZjc0OWUwNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaW9jMy1ldGguYworKysgYi9kcml2ZXJzL25ldC9pb2MzLWV0aC5jCkBAIC02MzMsOCArNjMzLDYgQEAKIAogCQkJaXAtPnJ4X3NrYnNbcnhfZW50cnldID0gTlVMTDsJLyogUG9pc29uICAqLwogCi0JCQluZXdfc2tiLT5kZXYgPSBwcml2X25ldGRldihpcCk7Ci0KIAkJCS8qIEJlY2F1c2Ugd2UgcmVzZXJ2ZSBhZnRlcndhcmRzLiAqLwogCQkJc2tiX3B1dChuZXdfc2tiLCAoMTY2NCArIFJYX09GRlNFVCkpOwogCQkJcnhiID0gKHN0cnVjdCBpb2MzX2VyeGJ1ZiAqKSBuZXdfc2tiLT5kYXRhOwpAQCAtOTQwLDcgKzkzOCw2IEBACiAJCQl9CiAKIAkJCWlwLT5yeF9za2JzW2ldID0gc2tiOwotCQkJc2tiLT5kZXYgPSBkZXY7CiAKIAkJCS8qIEJlY2F1c2Ugd2UgcmVzZXJ2ZSBhZnRlcndhcmRzLiAqLwogCQkJc2tiX3B1dChza2IsICgxNjY0ICsgUlhfT0ZGU0VUKSk7CkBAIC0xMzk2LDkgKzEzOTMsOSBAQAogCSAqIG1hbnVhbGx5LgogCSAqLwogCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9QQVJUSUFMKSB7Ci0JCWludCBwcm90byA9IG50b2hzKHNrYi0+bmguaXBoLT5wcm90b2NvbCk7CisJCWNvbnN0IHN0cnVjdCBpcGhkciAqaWggPSBpcF9oZHIoc2tiKTsKKwkJY29uc3QgaW50IHByb3RvID0gbnRvaHMoaWgtPnByb3RvY29sKTsKIAkJdW5zaWduZWQgaW50IGNzb2ZmOwotCQlzdHJ1Y3QgaXBoZHIgKmloID0gc2tiLT5uaC5pcGg7CiAJCXVpbnQzMl90IGNzdW0sIGVoc3VtOwogCQl1aW50MTZfdCAqZWg7CiAKQEAgLTE0MjUsMTEgKzE0MjIsMTEgQEAKIAkJY3NvZmYgPSBFVEhfSExFTiArIChpaC0+aWhsIDw8IDIpOwogCQlpZiAocHJvdG8gPT0gSVBQUk9UT19VRFApIHsKIAkJCWNzb2ZmICs9IG9mZnNldG9mKHN0cnVjdCB1ZHBoZHIsIGNoZWNrKTsKLQkJCXNrYi0+aC51aC0+Y2hlY2sgPSBjc3VtOworCQkJdWRwX2hkcihza2IpLT5jaGVjayA9IGNzdW07CiAJCX0KIAkJaWYgKHByb3RvID09IElQUFJPVE9fVENQKSB7CiAJCQljc29mZiArPSBvZmZzZXRvZihzdHJ1Y3QgdGNwaGRyLCBjaGVjayk7Ci0JCQlza2ItPmgudGgtPmNoZWNrID0gY3N1bTsKKwkJCXRjcF9oZHIoc2tiKS0+Y2hlY2sgPSBjc3VtOwogCQl9CiAKIAkJdzAgPSBFVFhEX0RPQ0hFQ0tTVU0gfCAoY3NvZmYgPDwgRVRYRF9DSEtPRkZfU0hJRlQpOwpAQCAtMTQ0Niw3ICsxNDQzLDcgQEAKIAogCWlmIChsZW4gPD0gMTA0KSB7CiAJCS8qIFNob3J0IHBhY2tldCwgbGV0J3MgY29weSBpdCBkaXJlY3RseSBpbnRvIHRoZSByaW5nLiAgKi8KLQkJbWVtY3B5KGRlc2MtPmRhdGEsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgZGVzYy0+ZGF0YSwgc2tiLT5sZW4pOwogCQlpZiAobGVuIDwgRVRIX1pMRU4pIHsKIAkJCS8qIFZlcnkgc2hvcnQgcGFja2V0LCBwYWQgd2l0aCB6ZXJvcyBhdCB0aGUgZW5kLiAqLwogCQkJbWVtc2V0KGRlc2MtPmRhdGEgKyBsZW4sIDAsIEVUSF9aTEVOIC0gbGVuKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvYWxpLWlyY2MuYyBiL2RyaXZlcnMvbmV0L2lyZGEvYWxpLWlyY2MuYwppbmRleCBjZWJmOGMzLi5mOWM4ODljIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pcmRhL2FsaS1pcmNjLmMKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9hbGktaXJjYy5jCkBAIC0xNDcyLDkgKzE0NzIsOCBAQAogCiAJc2VsZi0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CiAKLQltZW1jcHkoc2VsZi0+dHhfZmlmby5xdWV1ZVtzZWxmLT50eF9maWZvLmZyZWVdLnN0YXJ0LCBza2ItPmRhdGEsIAotCSAgICAgICBza2ItPmxlbik7Ci0JCisJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIHNlbGYtPnR4X2ZpZm8ucXVldWVbc2VsZi0+dHhfZmlmby5mcmVlXS5zdGFydCwKKwkJICAgICAgc2tiLT5sZW4pOwogCXNlbGYtPnR4X2ZpZm8ubGVuKys7CiAJc2VsZi0+dHhfZmlmby5mcmVlKys7CiAKQEAgLTE5MjQsNyArMTkyMyw3IEBACiAJCQkKIAkJCS8qIENvcHkgZnJhbWUgd2l0aG91dCBDUkMsIENSQyBpcyByZW1vdmVkIGJ5IGhhcmR3YXJlKi8KIAkJCXNrYl9wdXQoc2tiLCBsZW4pOwotCQkJbWVtY3B5KHNrYi0+ZGF0YSwgc2VsZi0+cnhfYnVmZi5kYXRhLCBsZW4pOworCQkJc2tiX2NvcHlfdG9fbGluZWFyX2RhdGEoc2tiLCBzZWxmLT5yeF9idWZmLmRhdGEsIGxlbik7CiAKIAkJCS8qIE1vdmUgdG8gbmV4dCBmcmFtZSAqLwogCQkJc2VsZi0+cnhfYnVmZi5kYXRhICs9IGxlbjsKQEAgLTE5MzIsNyArMTkzMSw3IEBACiAJCQlzZWxmLT5zdGF0cy5yeF9wYWNrZXRzKys7CiAKIAkJCXNrYi0+ZGV2ID0gc2VsZi0+bmV0ZGV2OwotCQkJc2tiLT5tYWMucmF3ICA9IHNrYi0+ZGF0YTsKKwkJCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CiAJCQlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfSVJEQSk7CiAJCQluZXRpZl9yeChza2IpOwogCQkJc2VsZi0+bmV0ZGV2LT5sYXN0X3J4ID0gamlmZmllczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvYXUxa19pci5jIGIvZHJpdmVycy9uZXQvaXJkYS9hdTFrX2lyLmMKaW5kZXggMzc5MTRkYy4uNGRiZGZhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXJkYS9hdTFrX2lyLmMKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9hdTFrX2lyLmMKQEAgLTUyNiw3ICs1MjYsNyBAQAogCQogCWlmIChhdXAtPnNwZWVkID09IDQwMDAwMDApIHsKIAkJLyogRklSICovCi0JCW1lbWNweSgodm9pZCAqKXBEQi0+dmFkZHIsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgcERCLT52YWRkciwgc2tiLT5sZW4pOwogCQlwdHhkLT5jb3VudF8wID0gc2tiLT5sZW4gJiAweGZmOwogCQlwdHhkLT5jb3VudF8xID0gKHNrYi0+bGVuID4+IDgpICYgMHhmZjsKIApAQCAtNjA0LDkgKzYwNCw5IEBACiAJCQkJc2tiX3B1dChza2IsIGNvdW50KTsKIAkJCWVsc2UKIAkJCQlza2JfcHV0KHNrYiwgY291bnQtMik7Ci0JCQltZW1jcHkoc2tiLT5kYXRhLCAodm9pZCAqKXBEQi0+dmFkZHIsIGNvdW50LTIpOworCQkJc2tiX2NvcHlfdG9fbGluZWFyX2RhdGEoc2tiLCBwREItPnZhZGRyLCBjb3VudCAtIDIpOwogCQkJc2tiLT5kZXYgPSBkZXY7Ci0JCQlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJCQlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwogCQkJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0lSREEpOwogCQkJbmV0aWZfcngoc2tiKTsKIAkJCXByeGQtPmNvdW50XzAgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9kb25hdWJvZS5jIGIvZHJpdmVycy9uZXQvaXJkYS9kb25hdWJvZS5jCmluZGV4IDExYWYwYWUuLjNjYTQ3YmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvZG9uYXVib2UuYworKysgYi9kcml2ZXJzL25ldC9pcmRhL2RvbmF1Ym9lLmMKQEAgLTExMTksNyArMTExOSw3IEBACiAgIGVsc2UKICAgICB7CiAgICAgICBsZW4gPSBza2ItPmxlbjsKLSAgICAgIG1lbWNweSAoc2VsZi0+dHhfYnVmc1tzZWxmLT50eHNdLCBza2ItPmRhdGEsIGxlbik7CisgICAgICBza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgc2VsZi0+dHhfYnVmc1tzZWxmLT50eHNdLCBsZW4pOwogICAgIH0KICAgc2VsZi0+cmluZy0+dHhbc2VsZi0+dHhzXS5sZW4gPSBsZW4gJiAweDBmZmY7CiAKQEAgLTEyODIsMTEgKzEyODIsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICBza2JfcmVzZXJ2ZSAoc2tiLCAxKTsKIAogICAgICAgICAgICAgICAgICAgICAgIHNrYl9wdXQgKHNrYiwgbGVuKTsKLSAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkgKHNrYi0+ZGF0YSwgc2VsZi0+cnhfYnVmc1tzZWxmLT5yeHNdLCBsZW4pOwotCisgICAgICAgICAgICAgICAgICAgICAgc2tiX2NvcHlfdG9fbGluZWFyX2RhdGEoc2tiLCBzZWxmLT5yeF9idWZzW3NlbGYtPnJ4c10sCisJCQkJCSAgICAgIGxlbik7CiAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+c3RhdHMucnhfcGFja2V0cysrOwogICAgICAgICAgICAgICAgICAgICAgIHNrYi0+ZGV2ID0gc2VsZi0+bmV0ZGV2OwotICAgICAgICAgICAgICAgICAgICAgIHNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgICBza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwogICAgICAgICAgICAgICAgICAgICAgIHNrYi0+cHJvdG9jb2wgPSBodG9ucyAoRVRIX1BfSVJEQSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgIGVsc2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvaXJkYS11c2IuYyBiL2RyaXZlcnMvbmV0L2lyZGEvaXJkYS11c2IuYwppbmRleCAxZDUxMGJkLi4wYWMyNDBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pcmRhL2lyZGEtdXNiLmMKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9pcmRhLXVzYi5jCkBAIC00NDEsNyArNDQxLDcgQEAKIAkJZ290byBkcm9wOwogCX0KIAotCW1lbWNweShzZWxmLT50eF9idWZmICsgc2VsZi0+aGVhZGVyX2xlbmd0aCwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIHNlbGYtPnR4X2J1ZmYgKyBzZWxmLT5oZWFkZXJfbGVuZ3RoLCBza2ItPmxlbik7CiAKIAkvKiBDaGFuZ2Ugc2V0dGluZyBmb3IgbmV4dCBmcmFtZSAqLwogCWlmIChzZWxmLT5jYXBhYmlsaXR5ICYgSVVDX1NUSVI0MjFYKSB7CkBAIC05MDIsNyArOTAyLDcgQEAKIAogCWlmKGRvY29weSkgewogCQkvKiBDb3B5IHBhY2tldCwgc28gd2UgY2FuIHJlY3ljbGUgdGhlIG9yaWdpbmFsICovCi0JCW1lbWNweShuZXdza2ItPmRhdGEsIHNrYi0+ZGF0YSwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKwkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIG5ld3NrYi0+ZGF0YSwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKIAkJLyogRGVsaXZlciB0aGlzIG5ldyBza2IgKi8KIAkJZGF0YXNrYiA9IG5ld3NrYjsKIAkJLyogQW5kIGhvb2sgdGhlIG9sZCBza2IgdG8gdGhlIFVSQgpAQCAtOTIxLDcgKzkyMSw3IEBACiAKIAkvKiBBc2sgdGhlIG5ldHdvcmtpbmcgbGF5ZXIgdG8gcXVldWUgdGhlIHBhY2tldCBmb3IgdGhlIElyREEgc3RhY2sgKi8KIAlkYXRhc2tiLT5kZXYgPSBzZWxmLT5uZXRkZXY7Ci0JZGF0YXNrYi0+bWFjLnJhdyAgPSBkYXRhc2tiLT5kYXRhOworCXNrYl9yZXNldF9tYWNfaGVhZGVyKGRhdGFza2IpOwogCWRhdGFza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfSVJEQSk7CiAJbGVuID0gZGF0YXNrYi0+bGVuOwogCW5ldGlmX3J4KGRhdGFza2IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9tY3M3NzgwLmMgYi9kcml2ZXJzL25ldC9pcmRhL21jczc3ODAuYwppbmRleCBmMGM2MWYzLi4wZGU4NjcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pcmRhL21jczc3ODAuYworKysgYi9kcml2ZXJzL25ldC9pcmRhL21jczc3ODAuYwpAQCAtMjAwLDE0ICsyMDAsMTQgQEAKIC8qIFNldHVwIGEgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIG1jczc3ODAgYW5kIGFnaWxlbnQgY2hpcC4gKi8KIHN0YXRpYyBpbmxpbmUgaW50IG1jc19zZXR1cF90cmFuc2NlaXZlcl9hZ2lsZW50KHN0cnVjdCBtY3NfY2IgKm1jcykKIHsKLQlJUkRBX1dBUk5JTkcoIlRoaXMgdHJhbnNjZWl2ZXIgdHlwZSBpcyBub3Qgc3VwcG9ydGVkIHlldC4iKTsKKwlJUkRBX1dBUk5JTkcoIlRoaXMgdHJhbnNjZWl2ZXIgdHlwZSBpcyBub3Qgc3VwcG9ydGVkIHlldC5cbiIpOwogCXJldHVybiAxOwogfQogCiAvKiBTZXR1cCBhIGNvbW11bmljYXRpb24gYmV0d2VlbiBtY3M3NzgwIGFuZCBzaGFycCBjaGlwLiAqLwogc3RhdGljIGlubGluZSBpbnQgbWNzX3NldHVwX3RyYW5zY2VpdmVyX3NoYXJwKHN0cnVjdCBtY3NfY2IgKm1jcykKIHsKLQlJUkRBX1dBUk5JTkcoIlRoaXMgdHJhbnNjZWl2ZXIgdHlwZSBpcyBub3Qgc3VwcG9ydGVkIHlldC4iKTsKKwlJUkRBX1dBUk5JTkcoIlRoaXMgdHJhbnNjZWl2ZXIgdHlwZSBpcyBub3Qgc3VwcG9ydGVkIHlldC5cbiIpOwogCXJldHVybiAxOwogfQogCkBAIC0yNzksNyArMjc5LDcgQEAKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQlJUkRBX1dBUk5JTkcoIlVua25vd24gdHJhbnNjZWl2ZXIgdHlwZTogJWQiLAorCQlJUkRBX1dBUk5JTkcoIlVua25vd24gdHJhbnNjZWl2ZXIgdHlwZTogJWRcbiIsCiAJCQkgICAgIG1jcy0+dHJhbnNjZWl2ZXJfdHlwZSk7CiAJCXJldCA9IDE7CiAJfQpAQCAtMzE4LDcgKzMxOCw3IEBACiAJCXJldHVybiByZXQ7CiAKIGVycm9yOgotCUlSREFfRVJST1IoIiVzIiwgbXNnKTsKKwlJUkRBX0VSUk9SKCIlc1xuIiwgbXNnKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0zNTMsNyArMzUzLDcgQEAKIAlidWZbMF0gPSBsZW4gJiAweGZmOwogCWJ1ZlsxXSA9IChsZW4gPj4gOCkgJiAweGZmOwogCS8qIGNvcHkgdGhlIGRhdGEgaW50byB0aGUgdHggYnVmZmVyLiAqLwotCW1lbWNweShidWYrMiwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIGJ1ZiArIDIsIHNrYi0+bGVuKTsKIAkvKiBwdXQgdGhlIGZjcyBpbiB0aGUgbGFzdCBmb3VyIGJ5dGVzIGluIGxpdHRsZSBlbmRpYW4gb3JkZXIuICovCiAJYnVmW2xlbiAtIDRdID0gZmNzICYgMHhmZjsKIAlidWZbbGVuIC0gM10gPSAoZmNzID4+IDgpICYgMHhmZjsKQEAgLTM3Nyw3ICszNzcsNyBAQAogCWJ1ZlswXSA9IGxlbiAmIDB4ZmY7CiAJYnVmWzFdID0gKGxlbiA+PiA4KSAmIDB4ZmY7CiAJLyogY29weSB0aGUgZGF0YSAqLwotCW1lbWNweShidWYrMiwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIGJ1ZiArIDIsIHNrYi0+bGVuKTsKIAkvKiBwdXQgdGhlIGZjcyBpbiBsYXN0IHR3byBieXRlcyBpbiBsaXR0bGUgZW5kaWFuIG9yZGVyLiAqLwogCWJ1ZltsZW4gLSAyXSA9IGZjcyAmIDB4ZmY7CiAJYnVmW2xlbiAtIDFdID0gKGZjcyA+PiA4KSAmIDB4ZmY7CkBAIC00MjYsOSArNDI2LDkgQEAKIAl9CiAKIAlza2JfcmVzZXJ2ZShza2IsIDEpOwotCW1lbWNweShza2ItPmRhdGEsIGJ1ZiwgbmV3X2xlbik7CisJc2tiX2NvcHlfdG9fbGluZWFyX2RhdGEoc2tiLCBidWYsIG5ld19sZW4pOwogCXNrYl9wdXQoc2tiLCBuZXdfbGVuKTsKLQlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKIAlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfSVJEQSk7CiAJc2tiLT5kZXYgPSBtY3MtPm5ldGRldjsKIApAQCAtNDc5LDkgKzQ3OSw5IEBACiAJfQogCiAJc2tiX3Jlc2VydmUoc2tiLCAxKTsKLQltZW1jcHkoc2tiLT5kYXRhLCBidWYsIG5ld19sZW4pOworCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhKHNrYiwgYnVmLCBuZXdfbGVuKTsKIAlza2JfcHV0KHNrYiwgbmV3X2xlbik7Ci0Jc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOworCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CiAJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0lSREEpOwogCXNrYi0+ZGV2ID0gbWNzLT5uZXRkZXY7CiAKQEAgLTU4Nyw3ICs1ODcsNyBAQAogCX0gd2hpbGUoY250KysgPCAxMDAgJiYgKHJ2YWwgJiBNQ1NfSVJJTlRYKSk7CiAKIAlpZihjbnQgPj0gMTAwKSB7Ci0JCUlSREFfRVJST1IoInVuYWJsZSB0byBjaGFuZ2Ugc3BlZWQiKTsKKwkJSVJEQV9FUlJPUigidW5hYmxlIHRvIGNoYW5nZSBzcGVlZFxuIik7CiAJCXJldCA9IC1FSU87CiAJCWdvdG8gZXJyb3I7CiAJfQpAQCAtNjM4LDcgKzYzOCw3IEBACiAKIAkJZGVmYXVsdDoKIAkJCXJldCA9IDE7Ci0JCQlJUkRBX1dBUk5JTkcoIlVua25vd24gdHJhbnNjZWl2ZXIgdHlwZTogJWQiLAorCQkJSVJEQV9XQVJOSU5HKCJVbmtub3duIHRyYW5zY2VpdmVyIHR5cGU6ICVkXG4iLAogCQkJCSAgICAgbWNzLT50cmFuc2NlaXZlcl90eXBlKTsKIAkJfQogCWlmICh1bmxpa2VseShyZXQpKQpAQCAtNzMzLDcgKzczMyw3IEBACiAJc3ByaW50Zihod25hbWUsICJ1c2IjJWQiLCBtY3MtPnVzYmRldi0+ZGV2bnVtKTsKIAltY3MtPmlybGFwID0gaXJsYXBfb3BlbihuZXRkZXYsICZtY3MtPnFvcywgaHduYW1lKTsKIAlpZiAoIW1jcy0+aXJsYXApIHsKLQkJSVJEQV9FUlJPUigibWNzNzc4MDogaXJsYXBfb3BlbiBmYWlsZWQiKTsKKwkJSVJEQV9FUlJPUigibWNzNzc4MDogaXJsYXBfb3BlbiBmYWlsZWRcbiIpOwogCQlnb3RvIGVycm9yMjsKIAl9CiAKQEAgLTg2Miw3ICs4NjIsNyBAQAogCQkJICBtY3MtPm91dF9idWYsIHdyYXBsZW4sIG1jc19zZW5kX2lycSwgbWNzKTsKIAogCWlmICgocmV0ID0gdXNiX3N1Ym1pdF91cmIobWNzLT50eF91cmIsIEdGUF9BVE9NSUMpKSkgewotCQlJUkRBX0VSUk9SKCJmYWlsZWQgdHhfdXJiOiAlZCIsIHJldCk7CisJCUlSREFfRVJST1IoImZhaWxlZCB0eF91cmI6ICVkXG4iLCByZXQpOwogCQlzd2l0Y2ggKHJldCkgewogCQljYXNlIC1FTk9ERVY6CiAJCWNhc2UgLUVQSVBFOgpAQCAtODk3LDcgKzg5Nyw3IEBACiAJaWYgKCFuZGV2KQogCQlnb3RvIGVycm9yMTsKIAotCUlSREFfREVCVUcoMSwgIk1DUzc3ODAgVVNCLUlyREEgYnJpZGdlIGZvdW5kIGF0ICVkLiIsIHVkZXYtPmRldm51bSk7CisJSVJEQV9ERUJVRygxLCAiTUNTNzc4MCBVU0ItSXJEQSBicmlkZ2UgZm91bmQgYXQgJWQuXG4iLCB1ZGV2LT5kZXZudW0pOwogCiAJLyogd2hhdCBpcyBpdCByZWFseSBmb3I/ICovCiAJU0VUX01PRFVMRV9PV05FUihuZGV2KTsKQEAgLTkwNSw3ICs5MDUsNyBAQAogCiAJcmV0ID0gdXNiX3Jlc2V0X2NvbmZpZ3VyYXRpb24odWRldik7CiAJaWYgKHJldCAhPSAwKSB7Ci0JCUlSREFfRVJST1IoIm1jczc3ODA6IHVzYiByZXNldCBjb25maWd1cmF0aW9uIGZhaWxlZCIpOworCQlJUkRBX0VSUk9SKCJtY3M3NzgwOiB1c2IgcmVzZXQgY29uZmlndXJhdGlvbiBmYWlsZWRcbiIpOwogCQlnb3RvIGVycm9yMjsKIAl9CiAKQEAgLTk1MCw3ICs5NTAsNyBAQAogCWlmIChyZXQgIT0gMCkKIAkJZ290byBlcnJvcjI7CiAKLQlJUkRBX0RFQlVHKDEsICJJckRBOiBSZWdpc3RlcmVkIE1vc0NoaXAgTUNTNzc4MCBkZXZpY2UgYXMgJXMiLAorCUlSREFfREVCVUcoMSwgIklyREE6IFJlZ2lzdGVyZWQgTW9zQ2hpcCBNQ1M3NzgwIGRldmljZSBhcyAlc1xuIiwKIAkJICAgbmRldi0+bmFtZSk7CiAKIAltY3MtPnRyYW5zY2VpdmVyX3R5cGUgPSB0cmFuc2NlaXZlcl90eXBlOwpAQCAtOTgxLDcgKzk4MSw3IEBACiAJZnJlZV9uZXRkZXYobWNzLT5uZXRkZXYpOwogCiAJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBOVUxMKTsKLQlJUkRBX0RFQlVHKDAsICJNQ1M3NzgwIG5vdyBkaXNjb25uZWN0ZWQuIik7CisJSVJEQV9ERUJVRygwLCAiTUNTNzc4MCBub3cgZGlzY29ubmVjdGVkLlxuIik7CiB9CiAKIC8qIE1vZHVsZSBpbnNlcnRpb24gKi8KQEAgLTk5Miw3ICs5OTIsNyBAQAogCS8qIHJlZ2lzdGVyIHRoaXMgZHJpdmVyIHdpdGggdGhlIFVTQiBzdWJzeXN0ZW0gKi8KIAlyZXN1bHQgPSB1c2JfcmVnaXN0ZXIoJm1jc19kcml2ZXIpOwogCWlmIChyZXN1bHQpCi0JCUlSREFfRVJST1IoInVzYl9yZWdpc3RlciBmYWlsZWQuIEVycm9yIG51bWJlciAlZCIsIHJlc3VsdCk7CisJCUlSREFfRVJST1IoInVzYl9yZWdpc3RlciBmYWlsZWQuIEVycm9yIG51bWJlciAlZFxuIiwgcmVzdWx0KTsKIAogCXJldHVybiByZXN1bHQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL25zYy1pcmNjLmMgYi9kcml2ZXJzL25ldC9pcmRhL25zYy1pcmNjLmMKaW5kZXggMjliNWNjZC4uZDk2Yzg5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXJkYS9uc2MtaXJjYy5jCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvbnNjLWlyY2MuYwpAQCAtMTQ2Niw5ICsxNDY2LDggQEAKIAogCXNlbGYtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOwogCi0JbWVtY3B5KHNlbGYtPnR4X2ZpZm8ucXVldWVbc2VsZi0+dHhfZmlmby5mcmVlXS5zdGFydCwgc2tiLT5kYXRhLCAKLQkgICAgICAgc2tiLT5sZW4pOwotCQorCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCBzZWxmLT50eF9maWZvLnF1ZXVlW3NlbGYtPnR4X2ZpZm8uZnJlZV0uc3RhcnQsCisJCSAgICAgIHNrYi0+bGVuKTsKIAlzZWxmLT50eF9maWZvLmxlbisrOwogCXNlbGYtPnR4X2ZpZm8uZnJlZSsrOwogCkBAIC0xODY5LDEwICsxODY4LDE0IEBACiAJCQkvKiBDb3B5IGZyYW1lIHdpdGhvdXQgQ1JDICovCiAJCQlpZiAoc2VsZi0+aW8uc3BlZWQgPCA0MDAwMDAwKSB7CiAJCQkJc2tiX3B1dChza2IsIGxlbi0yKTsKLQkJCQltZW1jcHkoc2tiLT5kYXRhLCBzZWxmLT5yeF9idWZmLmRhdGEsIGxlbi0yKTsKKwkJCQlza2JfY29weV90b19saW5lYXJfZGF0YShza2IsCisJCQkJCQkJc2VsZi0+cnhfYnVmZi5kYXRhLAorCQkJCQkJCWxlbiAtIDIpOwogCQkJfSBlbHNlIHsKIAkJCQlza2JfcHV0KHNrYiwgbGVuLTQpOwotCQkJCW1lbWNweShza2ItPmRhdGEsIHNlbGYtPnJ4X2J1ZmYuZGF0YSwgbGVuLTQpOworCQkJCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhKHNrYiwKKwkJCQkJCQlzZWxmLT5yeF9idWZmLmRhdGEsCisJCQkJCQkJbGVuIC0gNCk7CiAJCQl9CiAKIAkJCS8qIE1vdmUgdG8gbmV4dCBmcmFtZSAqLwpAQCAtMTg4MSw3ICsxODg0LDcgQEAKIAkJCXNlbGYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKIAogCQkJc2tiLT5kZXYgPSBzZWxmLT5uZXRkZXY7Ci0JCQlza2ItPm1hYy5yYXcgID0gc2tiLT5kYXRhOworCQkJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKIAkJCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUkRBKTsKIAkJCW5ldGlmX3J4KHNrYik7CiAJCQlzZWxmLT5uZXRkZXYtPmxhc3RfcnggPSBqaWZmaWVzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9weGFmaWNwX2lyLmMgYi9kcml2ZXJzL25ldC9pcmRhL3B4YWZpY3BfaXIuYwppbmRleCAyMjcyMTU2Li5mYjE5NmZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pcmRhL3B4YWZpY3BfaXIuYworKysgYi9kcml2ZXJzL25ldC9pcmRhL3B4YWZpY3BfaXIuYwpAQCAtMzg2LDEyICszODYsMTIgQEAKIAogCQkvKiBBbGlnbiBJUCBoZWFkZXIgdG8gMjAgYnl0ZXMgICovCiAJCXNrYl9yZXNlcnZlKHNrYiwgMSk7Ci0JCW1lbWNweShza2ItPmRhdGEsIHNpLT5kbWFfcnhfYnVmZiwgbGVuKTsKKwkJc2tiX2NvcHlfdG9fbGluZWFyX2RhdGEoc2tiLCBzaS0+ZG1hX3J4X2J1ZmYsIGxlbik7CiAJCXNrYl9wdXQoc2tiLCBsZW4pOwogCiAJCS8qIEZlZWQgaXQgdG8gSXJMQVAgICovCiAJCXNrYi0+ZGV2ID0gZGV2OwotCQlza2ItPm1hYy5yYXcgID0gc2tiLT5kYXRhOworCQlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwogCQlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfSVJEQSk7CiAJCW5ldGlmX3J4KHNrYik7CiAKQEAgLTQ4NCw3ICs0ODQsNyBAQAogCQl1bnNpZ25lZCBsb25nIG10dCA9IGlyZGFfZ2V0X210dChza2IpOwogCiAJCXNpLT5kbWFfdHhfYnVmZl9sZW4gPSBza2ItPmxlbjsKLQkJbWVtY3B5KHNpLT5kbWFfdHhfYnVmZiwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCBzaS0+ZG1hX3R4X2J1ZmYsIHNrYi0+bGVuKTsKIAogCQlpZiAobXR0KQogCQkJd2hpbGUgKCh1bnNpZ25lZCkoT1NDUiAtIHNpLT5sYXN0X29zY3IpLzQgPCBtdHQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL3NhMTEwMF9pci5jIGIvZHJpdmVycy9uZXQvaXJkYS9zYTExMDBfaXIuYwppbmRleCA5MzczNzJkLi4wNTY2MzlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pcmRhL3NhMTEwMF9pci5jCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvc2ExMTAwX2lyLmMKQEAgLTUwNCw3ICs1MDQsNyBAQAogCiAJCXNrYl9wdXQoc2tiLCBsZW4pOwogCQlza2ItPmRldiA9IGRldjsKLQkJc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOworCQlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwogCQlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfSVJEQSk7CiAJCXNpLT5zdGF0cy5yeF9wYWNrZXRzKys7CiAJCXNpLT5zdGF0cy5yeF9ieXRlcyArPSBsZW47CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL3Ntc2MtaXJjYzIuYyBiL2RyaXZlcnMvbmV0L2lyZGEvc21zYy1pcmNjMi5jCmluZGV4IDMxYzYyMzMuLjE5OGJmM2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvc21zYy1pcmNjMi5jCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvc21zYy1pcmNjMi5jCkBAIC0zMTUsNiArMzE1LDcgQEAKIHsKIAkvKiBCYXNlIGFkZHJlc3MgMHgyRSBvciAweDRFICovCiAJeyAiNDdOMjI3IiwJS0VZNTVfMXxGSVJ8U0VSeDQsCTB4NWEsIDB4MDAgfSwKKwl7ICI0N04yMjciLAlLRVk1NV8xfEZJUnxTRVJ4NCwJMHg3YSwgMHgwMCB9LAogCXsgIjQ3TjI2NyIsCUtFWTU1XzF8RklSfFNFUng0LAkweDVlLCAweDAwIH0sCiAJeyBOVUxMIH0KIH07CkBAIC0xMTYxLDcgKzExNjIsNyBAQAogCQlzZWxmLT5uZXdfc3BlZWQgPSBzcGVlZDsKIAl9CiAKLQltZW1jcHkoc2VsZi0+dHhfYnVmZi5oZWFkLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgc2VsZi0+dHhfYnVmZi5oZWFkLCBza2ItPmxlbik7CiAKIAlzZWxmLT50eF9idWZmLmxlbiA9IHNrYi0+bGVuOwogCXNlbGYtPnR4X2J1ZmYuZGF0YSA9IHNlbGYtPnR4X2J1ZmYuaGVhZDsKQEAgLTE0MTIsNyArMTQxMyw3IEBACiAJc2VsZi0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuOwogCiAJc2tiLT5kZXYgPSBzZWxmLT5uZXRkZXY7Ci0Jc2tiLT5tYWMucmF3ICA9IHNrYi0+ZGF0YTsKKwlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwogCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUkRBKTsKIAluZXRpZl9yeChza2IpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9zdGlyNDIwMC5jIGIvZHJpdmVycy9uZXQvaXJkYS9zdGlyNDIwMC5jCmluZGV4IDIwZDMwNmYuLjc1NWFhNDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvc3RpcjQyMDAuYworKysgYi9kcml2ZXJzL25ldC9pcmRhL3N0aXI0MjAwLmMKQEAgLTUyLDcgKzUyLDYgQEAKICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgogI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KLSNpbmNsdWRlIDxuZXQvaXJkYS9pcmxhcC5oPgogI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGFfZGV2aWNlLmg+CiAjaW5jbHVkZSA8bmV0L2lyZGEvd3JhcHBlci5oPgogI2luY2x1ZGUgPG5ldC9pcmRhL2NyYy5oPgpAQCAtMzQ5LDcgKzM0OCw3IEBACiAJCX0KIAkJc2tiX3Jlc2VydmUobnNrYiwgMSk7CiAJCXNrYiA9IG5za2I7Ci0JCW1lbWNweShuc2tiLT5kYXRhLCByeF9idWZmLT5kYXRhLCBsZW4pOworCQlza2JfY29weV90b19saW5lYXJfZGF0YShuc2tiLCByeF9idWZmLT5kYXRhLCBsZW4pOwogCX0gZWxzZSB7CiAJCW5za2IgPSBkZXZfYWxsb2Nfc2tiKHJ4X2J1ZmYtPnRydWVzaXplKTsKIAkJaWYgKHVubGlrZWx5KCFuc2tiKSkgewpAQCAtMzY0LDcgKzM2Myw3IEBACiAKIAlza2JfcHV0KHNrYiwgbGVuKTsKIAotCXNrYi0+bWFjLnJhdyAgPSBza2ItPmRhdGE7CisJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKIAlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfSVJEQSk7CiAJc2tiLT5kZXYgPSBzdGlyLT5uZXRkZXY7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvdmlhLWlyY2MuYyBiL2RyaXZlcnMvbmV0L2lyZGEvdmlhLWlyY2MuYwppbmRleCBjM2VkOWIzLi5mZjUzNTg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pcmRhL3ZpYS1pcmNjLmMKKysrIGIvZHJpdmVycy9uZXQvaXJkYS92aWEtaXJjYy5jCkBAIC05MjUsOCArOTI1LDggQEAKIAogCXNlbGYtPnR4X2ZpZm8udGFpbCArPSBza2ItPmxlbjsKIAlzZWxmLT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKLQltZW1jcHkoc2VsZi0+dHhfZmlmby5xdWV1ZVtzZWxmLT50eF9maWZvLmZyZWVdLnN0YXJ0LCBza2ItPmRhdGEsCi0JICAgICAgIHNrYi0+bGVuKTsKKwlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwKKwkJICAgICAgc2VsZi0+dHhfZmlmby5xdWV1ZVtzZWxmLT50eF9maWZvLmZyZWVdLnN0YXJ0LCBza2ItPmxlbik7CiAJc2VsZi0+dHhfZmlmby5sZW4rKzsKIAlzZWxmLT50eF9maWZvLmZyZWUrKzsKIC8vRjAxICAgaWYgKHNlbGYtPnR4X2ZpZm8ubGVuID09IDEpIHsKQEAgLTExMjUsNyArMTEyNSw3IEBACiAJCXNlbGYtPnN0YXRzLnJ4X2J5dGVzICs9IGxlbjsKIAkJc2VsZi0+c3RhdHMucnhfcGFja2V0cysrOwogCQlza2ItPmRldiA9IHNlbGYtPm5ldGRldjsKLQkJc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOworCQlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwogCQlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfSVJEQSk7CiAJCW5ldGlmX3J4KHNrYik7CiAJCXJldHVybiBUUlVFOwpAQCAtMTE4OSw3ICsxMTg5LDcgQEAKIAkJc2tiX3Jlc2VydmUoc2tiLCAxKTsKIAkJc2tiX3B1dChza2IsIGxlbiAtIDQpOwogCi0JCW1lbWNweShza2ItPmRhdGEsIHNlbGYtPnJ4X2J1ZmYuZGF0YSwgbGVuIC0gNCk7CisJCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhKHNrYiwgc2VsZi0+cnhfYnVmZi5kYXRhLCBsZW4gLSA0KTsKIAkJSVJEQV9ERUJVRygyLCAiJXMoKTogbGVuPSV4LnJ4X2J1ZmY9JXBcbiIsIF9fRlVOQ1RJT05fXywKIAkJCSAgIGxlbiAtIDQsIHNlbGYtPnJ4X2J1ZmYuZGF0YSk7CiAKQEAgLTExOTgsNyArMTE5OCw3IEBACiAJCXNlbGYtPnN0YXRzLnJ4X2J5dGVzICs9IGxlbjsKIAkJc2VsZi0+c3RhdHMucnhfcGFja2V0cysrOwogCQlza2ItPmRldiA9IHNlbGYtPm5ldGRldjsKLQkJc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOworCQlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwogCQlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfSVJEQSk7CiAJCW5ldGlmX3J4KHNrYik7CiAKQEAgLTEyMzQsNyArMTIzNCw3IEBACiAJfQogCXNrYl9yZXNlcnZlKHNrYiwgMSk7CiAJc2tiX3B1dChza2IsIGxlbiAtIDQgKyAxKTsKLQltZW1jcHkoc2tiLT5kYXRhLCBzZWxmLT5yeF9idWZmLmRhdGEsIGxlbiAtIDQgKyAxKTsKKwlza2JfY29weV90b19saW5lYXJfZGF0YShza2IsIHNlbGYtPnJ4X2J1ZmYuZGF0YSwgbGVuIC0gNCArIDEpOwogCXN0X2ZpZm8tPnRhaWwrKzsKIAlzdF9maWZvLT5sZW4rKzsKIAlpZiAoc3RfZmlmby0+dGFpbCA+IE1BWF9SWF9XSU5ET1cpCkBAIC0xMjQ0LDcgKzEyNDQsNyBAQAogCXNlbGYtPnN0YXRzLnJ4X2J5dGVzICs9IGxlbjsKIAlzZWxmLT5zdGF0cy5yeF9wYWNrZXRzKys7CiAJc2tiLT5kZXYgPSBzZWxmLT5uZXRkZXY7Ci0Jc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOworCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CiAJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0lSREEpOwogCW5ldGlmX3J4KHNrYik7CiAJaWYgKHN0X2ZpZm8tPmxlbiA8IChNQVhfUlhfV0lORE9XICsgMikpIHsKQEAgLTEzMDMsNyArMTMwMyw3IEBACiAJCQl9CiAJCQlza2JfcmVzZXJ2ZShza2IsIDEpOwogCQkJc2tiX3B1dChza2IsIGxlbiAtIDQpOwotCQkJbWVtY3B5KHNrYi0+ZGF0YSwgc2VsZi0+cnhfYnVmZi5kYXRhLCBsZW4gLSA0KTsKKwkJCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhKHNrYiwgc2VsZi0+cnhfYnVmZi5kYXRhLCBsZW4gLSA0KTsKIAogCQkJSVJEQV9ERUJVRygyLCAiJXMoKTogbGVuPSV4LmhlYWQ9JXhcbiIsIF9fRlVOQ1RJT05fXywKIAkJCQkgICBsZW4gLSA0LCBzdF9maWZvLT5oZWFkKTsKQEAgLTEzMTMsNyArMTMxMyw3IEBACiAJCQlzZWxmLT5zdGF0cy5yeF9ieXRlcyArPSBsZW47CiAJCQlzZWxmLT5zdGF0cy5yeF9wYWNrZXRzKys7CiAJCQlza2ItPmRldiA9IHNlbGYtPm5ldGRldjsKLQkJCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKwkJCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CiAJCQlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfSVJEQSk7CiAJCQluZXRpZl9yeChza2IpOwogCQl9CQkvL3doaWxlCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL3Zsc2lfaXIuYyBiL2RyaXZlcnMvbmV0L2lyZGEvdmxzaV9pci5jCmluZGV4IDM0NTdlOWQuLmM0YmU5NzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvdmxzaV9pci5jCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvdmxzaV9pci5jCkBAIC01OTUsNyArNTk1LDcgQEAKIAlyZC0+c2tiID0gTlVMTDsKIAlza2ItPmRldiA9IG5kZXY7CiAJbWVtY3B5KHNrYl9wdXQoc2tiLGxlbiksIHJkLT5idWYsIGxlbik7Ci0Jc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOworCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CiAJaWYgKGluX2ludGVycnVwdCgpKQogCQluZXRpZl9yeChza2IpOwogCWVsc2UKQEAgLTk5Myw3ICs5OTMsNyBAQAogCQkJZ290byBkcm9wOwogCQl9CiAJCWVsc2UKLQkJCW1lbWNweShyZC0+YnVmLCBza2ItPmRhdGEsIGxlbik7CisJCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgcmQtPmJ1ZiwgbGVuKTsKIAl9CiAKIAlyZC0+c2tiID0gc2tiOwkJCS8qIHJlbWVtYmVyIHNrYiBmb3IgdHgtY29tcGxldGUgc3RhdHMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvdzgzOTc3YWZfaXIuYyBiL2RyaXZlcnMvbmV0L2lyZGEvdzgzOTc3YWZfaXIuYwppbmRleCA0MjEyNjU3Li41MTgyZTgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pcmRhL3c4Mzk3N2FmX2lyLmMKKysrIGIvZHJpdmVycy9uZXQvaXJkYS93ODM5NzdhZl9pci5jCkBAIC01MjksNyArNTI5LDcgQEAKIAkvKiBEZWNpZGUgaWYgd2Ugc2hvdWxkIHVzZSBQSU8gb3IgRE1BIHRyYW5zZmVyICovCiAJaWYgKHNlbGYtPmlvLnNwZWVkID4gUElPX01BWF9TUEVFRCkgewogCQlzZWxmLT50eF9idWZmLmRhdGEgPSBzZWxmLT50eF9idWZmLmhlYWQ7Ci0JCW1lbWNweShzZWxmLT50eF9idWZmLmRhdGEsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgc2VsZi0+dHhfYnVmZi5kYXRhLCBza2ItPmxlbik7CiAJCXNlbGYtPnR4X2J1ZmYubGVuID0gc2tiLT5sZW47CiAJCQogCQltdHQgPSBpcmRhX2dldF9tdHQoc2tiKTsKQEAgLTkwOCwxMCArOTA4LDE0IEBACiAJCQkvKiBDb3B5IGZyYW1lIHdpdGhvdXQgQ1JDICovCiAJCQlpZiAoc2VsZi0+aW8uc3BlZWQgPCA0MDAwMDAwKSB7CiAJCQkJc2tiX3B1dChza2IsIGxlbi0yKTsKLQkJCQltZW1jcHkoc2tiLT5kYXRhLCBzZWxmLT5yeF9idWZmLmRhdGEsIGxlbi0yKTsKKwkJCQlza2JfY29weV90b19saW5lYXJfZGF0YShza2IsCisJCQkJCQkJc2VsZi0+cnhfYnVmZi5kYXRhLAorCQkJCQkJCWxlbiAtIDIpOwogCQkJfSBlbHNlIHsKIAkJCQlza2JfcHV0KHNrYiwgbGVuLTQpOwotCQkJCW1lbWNweShza2ItPmRhdGEsIHNlbGYtPnJ4X2J1ZmYuZGF0YSwgbGVuLTQpOworCQkJCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhKHNrYiwKKwkJCQkJCQlzZWxmLT5yeF9idWZmLmRhdGEsCisJCQkJCQkJbGVuIC0gNCk7CiAJCQl9CiAKIAkJCS8qIE1vdmUgdG8gbmV4dCBmcmFtZSAqLwpAQCAtOTE5LDcgKzkyMyw3IEBACiAJCQlzZWxmLT5zdGF0cy5yeF9wYWNrZXRzKys7CiAJCQkKIAkJCXNrYi0+ZGV2ID0gc2VsZi0+bmV0ZGV2OwotCQkJc2tiLT5tYWMucmF3ICA9IHNrYi0+ZGF0YTsKKwkJCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CiAJCQlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfSVJEQSk7CiAJCQluZXRpZl9yeChza2IpOwogCQkJc2VsZi0+bmV0ZGV2LT5sYXN0X3J4ID0gamlmZmllczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lzZXJpZXNfdmV0aC5jIGIvZHJpdmVycy9uZXQvaXNlcmllc192ZXRoLmMKaW5kZXggMGU5YmEzYy4uMzQ3ZDUwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXNlcmllc192ZXRoLmMKKysrIGIvZHJpdmVycy9uZXQvaXNlcmllc192ZXRoLmMKQEAgLTE1NDAsNyArMTU0MCw2IEBACiAJCX0KIAogCQlza2JfcHV0KHNrYiwgbGVuZ3RoKTsKLQkJc2tiLT5kZXYgPSBkZXY7CiAJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CiAJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKIAkJbmV0aWZfcngoc2tiKTsJLyogc2VuZCBpdCB1cCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXhnYi9peGdiLmggYi9kcml2ZXJzL25ldC9peGdiL2l4Z2IuaAppbmRleCBjZjMwYTEwLi5jOGU5MDg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9peGdiL2l4Z2IuaAorKysgYi9kcml2ZXJzL25ldC9peGdiL2l4Z2IuaApAQCAtMTExLDkgKzExMSw2IEBACiAvKiBIb3cgbWFueSBSeCBCdWZmZXJzIGRvIHdlIGJ1bmRsZSBpbnRvIG9uZSB3cml0ZSB0byB0aGUgaGFyZHdhcmUgPyAqLwogI2RlZmluZSBJWEdCX1JYX0JVRkZFUl9XUklURQk4CS8qIE11c3QgYmUgcG93ZXIgb2YgMiAqLwogCi0vKiBvbmx5IHdvcmtzIGZvciBzaXplcyB0aGF0IGFyZSBwb3dlcnMgb2YgMiAqLwotI2RlZmluZSBJWEdCX1JPVU5EVVAoaSwgc2l6ZSkgKChpKSA9ICgoKGkpICsgKHNpemUpIC0gMSkgJiB+KChzaXplKSAtIDEpKSkKLQogLyogd3JhcHBlciBhcm91bmQgYSBwb2ludGVyIHRvIGEgc29ja2V0IGJ1ZmZlciwKICAqIHNvIGEgRE1BIGhhbmRsZSBjYW4gYmUgc3RvcmVkIGFsb25nIHdpdGggdGhlIGJ1ZmZlciAqLwogc3RydWN0IGl4Z2JfYnVmZmVyIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2l4Z2IvaXhnYl9ldGh0b29sLmMgYi9kcml2ZXJzL25ldC9peGdiL2l4Z2JfZXRodG9vbC5jCmluZGV4IGQ2NjI4YmQuLmFmZGU4NDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2l4Z2IvaXhnYl9ldGh0b29sLmMKKysrIGIvZHJpdmVycy9uZXQvaXhnYi9peGdiX2V0aHRvb2wuYwpAQCAtNTc3LDExICs1NzcsMTEgQEAKIAogCXJ4ZHItPmNvdW50ID0gbWF4KHJpbmctPnJ4X3BlbmRpbmcsKHVpbnQzMl90KU1JTl9SWEQpOwogCXJ4ZHItPmNvdW50ID0gbWluKHJ4ZHItPmNvdW50LCh1aW50MzJfdClNQVhfUlhEKTsKLQlJWEdCX1JPVU5EVVAocnhkci0+Y291bnQsIElYR0JfUkVRX1JYX0RFU0NSSVBUT1JfTVVMVElQTEUpOyAKKwlyeGRyLT5jb3VudCA9IEFMSUdOKHJ4ZHItPmNvdW50LCBJWEdCX1JFUV9SWF9ERVNDUklQVE9SX01VTFRJUExFKTsKIAogCXR4ZHItPmNvdW50ID0gbWF4KHJpbmctPnR4X3BlbmRpbmcsKHVpbnQzMl90KU1JTl9UWEQpOwogCXR4ZHItPmNvdW50ID0gbWluKHR4ZHItPmNvdW50LCh1aW50MzJfdClNQVhfVFhEKTsKLQlJWEdCX1JPVU5EVVAodHhkci0+Y291bnQsIElYR0JfUkVRX1RYX0RFU0NSSVBUT1JfTVVMVElQTEUpOyAKKwl0eGRyLT5jb3VudCA9IEFMSUdOKHR4ZHItPmNvdW50LCBJWEdCX1JFUV9UWF9ERVNDUklQVE9SX01VTFRJUExFKTsKIAogCWlmKG5ldGlmX3J1bm5pbmcoYWRhcHRlci0+bmV0ZGV2KSkgewogCQkvKiBUcnkgdG8gZ2V0IG5ldyByZXNvdXJjZXMgYmVmb3JlIGRlbGV0aW5nIG9sZCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXhnYi9peGdiX21haW4uYyBiL2RyaXZlcnMvbmV0L2l4Z2IvaXhnYl9tYWluLmMKaW5kZXggYWZjMmVjNy4uNmQyYjA1OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXhnYi9peGdiX21haW4uYworKysgYi9kcml2ZXJzL25ldC9peGdiL2l4Z2JfbWFpbi5jCkBAIC02ODUsNyArNjg1LDcgQEAKIAkvKiByb3VuZCB1cCB0byBuZWFyZXN0IDRLICovCiAKIAl0eGRyLT5zaXplID0gdHhkci0+Y291bnQgKiBzaXplb2Yoc3RydWN0IGl4Z2JfdHhfZGVzYyk7Ci0JSVhHQl9ST1VORFVQKHR4ZHItPnNpemUsIDQwOTYpOworCXR4ZHItPnNpemUgPSBBTElHTih0eGRyLT5zaXplLCA0MDk2KTsKIAogCXR4ZHItPmRlc2MgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LCB0eGRyLT5zaXplLCAmdHhkci0+ZG1hKTsKIAlpZighdHhkci0+ZGVzYykgewpAQCAtNzc0LDcgKzc3NCw3IEBACiAJLyogUm91bmQgdXAgdG8gbmVhcmVzdCA0SyAqLwogCiAJcnhkci0+c2l6ZSA9IHJ4ZHItPmNvdW50ICogc2l6ZW9mKHN0cnVjdCBpeGdiX3J4X2Rlc2MpOwotCUlYR0JfUk9VTkRVUChyeGRyLT5zaXplLCA0MDk2KTsKKwlyeGRyLT5zaXplID0gQUxJR04ocnhkci0+c2l6ZSwgNDA5Nik7CiAKIAlyeGRyLT5kZXNjID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwgcnhkci0+c2l6ZSwgJnJ4ZHItPmRtYSk7CiAKQEAgLTExODIsMjQgKzExODIsMjcgQEAKIAogCWlmIChsaWtlbHkoc2tiX2lzX2dzbyhza2IpKSkgewogCQlzdHJ1Y3QgaXhnYl9idWZmZXIgKmJ1ZmZlcl9pbmZvOworCQlzdHJ1Y3QgaXBoZHIgKmlwaDsKKwogCQlpZiAoc2tiX2hlYWRlcl9jbG9uZWQoc2tiKSkgewogCQkJZXJyID0gcHNrYl9leHBhbmRfaGVhZChza2IsIDAsIDAsIEdGUF9BVE9NSUMpOwogCQkJaWYgKGVycikKIAkJCQlyZXR1cm4gZXJyOwogCQl9CiAKLQkJaGRyX2xlbiA9ICgoc2tiLT5oLnJhdyAtIHNrYi0+ZGF0YSkgKyAoc2tiLT5oLnRoLT5kb2ZmIDw8IDIpKTsKKwkJaGRyX2xlbiA9IHNrYl90cmFuc3BvcnRfb2Zmc2V0KHNrYikgKyB0Y3BfaGRybGVuKHNrYik7CiAJCW1zcyA9IHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemU7Ci0JCXNrYi0+bmguaXBoLT50b3RfbGVuID0gMDsKLQkJc2tiLT5uaC5pcGgtPmNoZWNrID0gMDsKLQkJc2tiLT5oLnRoLT5jaGVjayA9IH5jc3VtX3RjcHVkcF9tYWdpYyhza2ItPm5oLmlwaC0+c2FkZHIsCi0JCQkJCQkgICAgICBza2ItPm5oLmlwaC0+ZGFkZHIsCi0JCQkJCQkgICAgICAwLCBJUFBST1RPX1RDUCwgMCk7Ci0JCWlwY3NzID0gc2tiLT5uaC5yYXcgLSBza2ItPmRhdGE7Ci0JCWlwY3NvID0gKHZvaWQgKikmKHNrYi0+bmguaXBoLT5jaGVjaykgLSAodm9pZCAqKXNrYi0+ZGF0YTsKLQkJaXBjc2UgPSBza2ItPmgucmF3IC0gc2tiLT5kYXRhIC0gMTsKLQkJdHVjc3MgPSBza2ItPmgucmF3IC0gc2tiLT5kYXRhOwotCQl0dWNzbyA9ICh2b2lkICopJihza2ItPmgudGgtPmNoZWNrKSAtICh2b2lkICopc2tiLT5kYXRhOworCQlpcGggPSBpcF9oZHIoc2tiKTsKKwkJaXBoLT50b3RfbGVuID0gMDsKKwkJaXBoLT5jaGVjayA9IDA7CisJCXRjcF9oZHIoc2tiKS0+Y2hlY2sgPSB+Y3N1bV90Y3B1ZHBfbWFnaWMoaXBoLT5zYWRkciwKKwkJCQkJCQkgaXBoLT5kYWRkciwgMCwKKwkJCQkJCQkgSVBQUk9UT19UQ1AsIDApOworCQlpcGNzcyA9IHNrYl9uZXR3b3JrX29mZnNldChza2IpOworCQlpcGNzbyA9ICh2b2lkICopJihpcGgtPmNoZWNrKSAtICh2b2lkICopc2tiLT5kYXRhOworCQlpcGNzZSA9IHNrYl90cmFuc3BvcnRfb2Zmc2V0KHNrYikgLSAxOworCQl0dWNzcyA9IHNrYl90cmFuc3BvcnRfb2Zmc2V0KHNrYik7CisJCXR1Y3NvID0gKHZvaWQgKikmKHRjcF9oZHIoc2tiKS0+Y2hlY2spIC0gKHZvaWQgKilza2ItPmRhdGE7CiAJCXR1Y3NlID0gMDsKIAogCQlpID0gYWRhcHRlci0+dHhfcmluZy5uZXh0X3RvX3VzZTsKQEAgLTEyNDMsNyArMTI0Niw3IEBACiAKIAlpZihsaWtlbHkoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCkpIHsKIAkJc3RydWN0IGl4Z2JfYnVmZmVyICpidWZmZXJfaW5mbzsKLQkJY3NzID0gc2tiLT5oLnJhdyAtIHNrYi0+ZGF0YTsKKwkJY3NzID0gc2tiX3RyYW5zcG9ydF9vZmZzZXQoc2tiKTsKIAkJY3NvID0gY3NzICsgc2tiLT5jc3VtX29mZnNldDsKIAogCQlpID0gYWRhcHRlci0+dHhfcmluZy5uZXh0X3RvX3VzZTsKQEAgLTIwMTQsOSArMjAxNywxMiBAQAogCQkJICAgIG5ldGRldl9hbGxvY19za2IobmV0ZGV2LCBsZW5ndGggKyBORVRfSVBfQUxJR04pOwogCQkJaWYgKG5ld19za2IpIHsKIAkJCQlza2JfcmVzZXJ2ZShuZXdfc2tiLCBORVRfSVBfQUxJR04pOwotCQkJCW1lbWNweShuZXdfc2tiLT5kYXRhIC0gTkVUX0lQX0FMSUdOLAotCQkJCSAgICAgICBza2ItPmRhdGEgLSBORVRfSVBfQUxJR04sCi0JCQkJICAgICAgIGxlbmd0aCArIE5FVF9JUF9BTElHTik7CisJCQkJc2tiX2NvcHlfdG9fbGluZWFyX2RhdGFfb2Zmc2V0KG5ld19za2IsCisJCQkJCQkJICAgICAgIC1ORVRfSVBfQUxJR04sCisJCQkJCQkJICAgICAgIChza2ItPmRhdGEgLQorCQkJCQkJCSAgICAgICAgTkVUX0lQX0FMSUdOKSwKKwkJCQkJCQkgICAgICAgKGxlbmd0aCArCisJCQkJCQkJICAgICAgICBORVRfSVBfQUxJR04pKTsKIAkJCQkvKiBzYXZlIHRoZSBza2IgaW4gYnVmZmVyX2luZm8gYXMgZ29vZCAqLwogCQkJCWJ1ZmZlcl9pbmZvLT5za2IgPSBza2I7CiAJCQkJc2tiID0gbmV3X3NrYjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2l4Z2IvaXhnYl9wYXJhbS5jIGIvZHJpdmVycy9uZXQvaXhnYi9peGdiX3BhcmFtLmMKaW5kZXggYjI3NDQyYS4uNWQ1ZGRhYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXhnYi9peGdiX3BhcmFtLmMKKysrIGIvZHJpdmVycy9uZXQvaXhnYi9peGdiX3BhcmFtLmMKQEAgLTI0NSw4ICsyNDUsNiBAQAogCXJldHVybiAtMTsKIH0KIAotI2RlZmluZSBMSVNUX0xFTihsKSAoc2l6ZW9mKGwpIC8gc2l6ZW9mKGxbMF0pKQotCiAvKioKICAqIGl4Z2JfY2hlY2tfb3B0aW9ucyAtIFJhbmdlIENoZWNraW5nIGZvciBDb21tYW5kIExpbmUgUGFyYW1ldGVycwogICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCkBAIC0yODQsNyArMjgyLDcgQEAKIAkJfSBlbHNlIHsKIAkJCXR4X3JpbmctPmNvdW50ID0gb3B0LmRlZjsKIAkJfQotCQlJWEdCX1JPVU5EVVAodHhfcmluZy0+Y291bnQsIElYR0JfUkVRX1RYX0RFU0NSSVBUT1JfTVVMVElQTEUpOworCQl0eF9yaW5nLT5jb3VudCA9IEFMSUdOKHR4X3JpbmctPmNvdW50LCBJWEdCX1JFUV9UWF9ERVNDUklQVE9SX01VTFRJUExFKTsKIAl9CiAJeyAvKiBSZWNlaXZlIERlc2NyaXB0b3IgQ291bnQgKi8KIAkJc3RydWN0IGl4Z2Jfb3B0aW9uIG9wdCA9IHsKQEAgLTMwMyw3ICszMDEsNyBAQAogCQl9IGVsc2UgewogCQkJcnhfcmluZy0+Y291bnQgPSBvcHQuZGVmOwogCQl9Ci0JCUlYR0JfUk9VTkRVUChyeF9yaW5nLT5jb3VudCwgSVhHQl9SRVFfUlhfREVTQ1JJUFRPUl9NVUxUSVBMRSk7CisJCXJ4X3JpbmctPmNvdW50ID0gQUxJR04ocnhfcmluZy0+Y291bnQsIElYR0JfUkVRX1JYX0RFU0NSSVBUT1JfTVVMVElQTEUpOwogCX0KIAl7IC8qIFJlY2VpdmUgQ2hlY2tzdW0gT2ZmbG9hZCBFbmFibGUgKi8KIAkJc3RydWN0IGl4Z2Jfb3B0aW9uIG9wdCA9IHsKQEAgLTMzNSw3ICszMzMsNyBAQAogCQkJLm5hbWUgPSAiRmxvdyBDb250cm9sIiwKIAkJCS5lcnIgID0gInJlYWRpbmcgZGVmYXVsdCBzZXR0aW5ncyBmcm9tIEVFUFJPTSIsCiAJCQkuZGVmICA9IGl4Z2JfZmNfdHhfcGF1c2UsCi0JCQkuYXJnICA9IHsgLmwgPSB7IC5uciA9IExJU1RfTEVOKGZjX2xpc3QpLAorCQkJLmFyZyAgPSB7IC5sID0geyAubnIgPSBBUlJBWV9TSVpFKGZjX2xpc3QpLAogCQkJCQkgLnAgPSBmY19saXN0IH19CiAJCX07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2l4cDIwMDAvaXhwZGV2LmMgYi9kcml2ZXJzL25ldC9peHAyMDAwL2l4cGRldi5jCmluZGV4IGE0ZWNjYjEuLjY2ODNhZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2l4cDIwMDAvaXhwZGV2LmMKKysrIGIvZHJpdmVycy9uZXQvaXhwMjAwMC9peHBkZXYuYwpAQCAtMTEwLDExICsxMTAsMTAgQEAKIAogCQlza2IgPSBkZXZfYWxsb2Nfc2tiKGRlc2MtPnBrdF9sZW5ndGggKyAyKTsKIAkJaWYgKGxpa2VseShza2IgIT0gTlVMTCkpIHsKLQkJCXNrYi0+ZGV2ID0gbmRzW2Rlc2MtPmNoYW5uZWxdOwogCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsKIAkJCWV0aF9jb3B5X2FuZF9zdW0oc2tiLCBidWYsIGRlc2MtPnBrdF9sZW5ndGgsIDApOwogCQkJc2tiX3B1dChza2IsIGRlc2MtPnBrdF9sZW5ndGgpOwotCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgc2tiLT5kZXYpOworCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgbmRzW2Rlc2MtPmNoYW5uZWxdKTsKIAogCQkJc2tiLT5kZXYtPmxhc3RfcnggPSBqaWZmaWVzOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9sYW5jZS5jIGIvZHJpdmVycy9uZXQvbGFuY2UuYwppbmRleCBhMzg0MzMyLi4wZmU5NmM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9sYW5jZS5jCisrKyBiL2RyaXZlcnMvbmV0L2xhbmNlLmMKQEAgLTk4OCw3ICs5ODgsNyBAQAogCQlpZiAobGFuY2VfZGVidWcgPiA1KQogCQkJcHJpbnRrKCIlczogYm91bmNpbmcgYSBoaWdoLW1lbW9yeSBwYWNrZXQgKCUjeCkuXG4iLAogCQkJCSAgIGRldi0+bmFtZSwgKHUzMilpc2FfdmlydF90b19idXMoc2tiLT5kYXRhKSk7Ci0JCW1lbWNweSgmbHAtPnR4X2JvdW5jZV9idWZmc1tlbnRyeV0sIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgJmxwLT50eF9ib3VuY2VfYnVmZnNbZW50cnldLCBza2ItPmxlbik7CiAJCWxwLT50eF9yaW5nW2VudHJ5XS5iYXNlID0KIAkJCSgodTMyKWlzYV92aXJ0X3RvX2J1cygobHAtPnR4X2JvdW5jZV9idWZmcyArIGVudHJ5KSkgJiAweGZmZmZmZikgfCAweDgzMDAwMDAwOwogCQlkZXZfa2ZyZWVfc2tiKHNrYik7CkBAIC0xMTg0LDcgKzExODQsNiBAQAogCQkJCQl9CiAJCQkJCWJyZWFrOwogCQkJCX0KLQkJCQlza2ItPmRldiA9IGRldjsKIAkJCQlza2JfcmVzZXJ2ZShza2IsMik7CS8qIDE2IGJ5dGUgYWxpZ24gKi8KIAkJCQlza2JfcHV0KHNrYixwa3RfbGVuKTsJLyogTWFrZSByb29tICovCiAJCQkJZXRoX2NvcHlfYW5kX3N1bShza2IsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9sYXNpXzgyNTk2LmMgYi9kcml2ZXJzL25ldC9sYXNpXzgyNTk2LmMKaW5kZXggNDUyODYzZC4uMGVkY2QxMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbGFzaV84MjU5Ni5jCisrKyBiL2RyaXZlcnMvbmV0L2xhc2lfODI1OTYuYwpAQCAtODAxLDcgKzgwMSw2IEBACiAJCQkJbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKIAkJCX0KIAkJCWVsc2UgewotCQkJCXNrYi0+ZGV2ID0gZGV2OwogCQkJCWlmICghcnhfaW5fcGxhY2UpIHsKIAkJCQkJLyogMTYgYnl0ZSBhbGlnbiB0aGUgZGF0YSBmaWVsZHMgKi8KIAkJCQkJZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUobHAtPmRldiwgKGRtYV9hZGRyX3QpV1NXQVBjaGFyKHJiZC0+Yl9kYXRhKSwgUEtUX0JVRl9TWiwgRE1BX0ZST01fREVWSUNFKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2xpYjgzOTAuYyBiL2RyaXZlcnMvbmV0L2xpYjgzOTAuYwppbmRleCBlNzI2YzA2Li41Yzg2ZTczIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9saWI4MzkwLmMKKysrIGIvZHJpdmVycy9uZXQvbGliODM5MC5jCkBAIC03MjIsNyArNzIyLDYgQEAKIAkJCWVsc2UKIAkJCXsKIAkJCQlza2JfcmVzZXJ2ZShza2IsMik7CS8qIElQIGhlYWRlcnMgb24gMTYgYnl0ZSBib3VuZGFyaWVzICovCi0JCQkJc2tiLT5kZXYgPSBkZXY7CiAJCQkJc2tiX3B1dChza2IsIHBrdF9sZW4pOwkvKiBNYWtlIHJvb20gKi8KIAkJCQllaV9ibG9ja19pbnB1dChkZXYsIHBrdF9sZW4sIHNrYiwgY3VycmVudF9vZmZzZXQgKyBzaXplb2YocnhfZnJhbWUpKTsKIAkJCQlza2ItPnByb3RvY29sPWV0aF90eXBlX3RyYW5zKHNrYixkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbG9vcGJhY2suYyBiL2RyaXZlcnMvbmV0L2xvb3BiYWNrLmMKaW5kZXggMmI3MzlmZC4uNmJhNmVkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbG9vcGJhY2suYworKysgYi9kcml2ZXJzL25ldC9sb29wYmFjay5jCkBAIC03NSw4ICs3NSw5IEBACiAjaWZkZWYgTE9PUEJBQ0tfVFNPCiBzdGF0aWMgdm9pZCBlbXVsYXRlX2xhcmdlX3NlbmRfb2ZmbG9hZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXN0cnVjdCBpcGhkciAqaXBoID0gc2tiLT5uaC5pcGg7Ci0Jc3RydWN0IHRjcGhkciAqdGggPSAoc3RydWN0IHRjcGhkciopKHNrYi0+bmgucmF3ICsgKGlwaC0+aWhsICogNCkpOworCXN0cnVjdCBpcGhkciAqaXBoID0gaXBfaGRyKHNrYik7CisJc3RydWN0IHRjcGhkciAqdGggPSAoc3RydWN0IHRjcGhkciAqKShza2JfbmV0d29ya19oZWFkZXIoc2tiKSArCisJCQkJCSAgICAgIChpcGgtPmlobCAqIDQpKTsKIAl1bnNpZ25lZCBpbnQgZG9mZnNldCA9IChpcGgtPmlobCArIHRoLT5kb2ZmKSAqIDQ7CiAJdW5zaWduZWQgaW50IG10dSA9IHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemUgKyBkb2Zmc2V0OwogCXVuc2lnbmVkIGludCBvZmZzZXQgPSAwOwpAQCAtOTAsMTAgKzkxLDExIEBACiAJCWlmICghbnNrYikKIAkJCWJyZWFrOwogCQlza2JfcmVzZXJ2ZShuc2tiLCAzMik7Ci0JCW5za2ItPm1hYy5yYXcgPSBuc2tiLT5kYXRhIC0gMTQ7Ci0JCW5za2ItPm5oLnJhdyA9IG5za2ItPmRhdGE7Ci0JCWlwaCA9IG5za2ItPm5oLmlwaDsKLQkJbWVtY3B5KG5za2ItPmRhdGEsIHNrYi0+bmgucmF3LCBkb2Zmc2V0KTsKKwkJc2tiX3NldF9tYWNfaGVhZGVyKG5za2IsIC1FVEhfSExFTik7CisJCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihuc2tiKTsKKwkJaXBoID0gaXBfaGRyKG5za2IpOworCQlza2JfY29weV90b19saW5lYXJfZGF0YShuc2tiLCBza2JfbmV0d29ya19oZWFkZXIoc2tiKSwKKwkJCQkJZG9mZnNldCk7CiAJCWlmIChza2JfY29weV9iaXRzKHNrYiwKIAkJCQkgIGRvZmZzZXQgKyBvZmZzZXQsCiAJCQkJICBuc2tiLT5kYXRhICsgZG9mZnNldCwKQEAgLTEwOCw3ICsxMTAsNyBAQAogCQltZW1jcHkobnNrYi0+Y2IsIHNrYi0+Y2IsIHNpemVvZihza2ItPmNiKSk7CiAJCW5za2ItPnBrdF90eXBlID0gc2tiLT5wa3RfdHlwZTsKIAotCQl0aCA9IChzdHJ1Y3QgdGNwaGRyKikobnNrYi0+bmgucmF3ICsgaXBoLT5paGwqNCk7CisJCXRoID0gKHN0cnVjdCB0Y3BoZHIgKikoc2tiX25ldHdvcmtfaGVhZGVyKG5za2IpICsgaXBoLT5paGwgKiA0KTsKIAkJaXBoLT50b3RfbGVuID0gaHRvbnMoZnJhZ19zaXplICsgZG9mZnNldCk7CiAJCWlwaC0+aWQgPSBodG9ucyhpZCk7CiAJCWlwaC0+Y2hlY2sgPSAwOwpAQCAtMTM3LDcgKzEzOSw2IEBACiAJc2tiX29ycGhhbihza2IpOwogCiAJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYixkZXYpOwotCXNrYi0+ZGV2ID0gZGV2OwogI2lmbmRlZiBMT09QQkFDS19NVVNUX0NIRUNLU1VNCiAJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKICNlbmRpZgpAQCAtMTQ1LDcgKzE0Niw3IEBACiAjaWZkZWYgTE9PUEJBQ0tfVFNPCiAJaWYgKHNrYl9pc19nc28oc2tiKSkgewogCQlCVUdfT04oc2tiLT5wcm90b2NvbCAhPSBodG9ucyhFVEhfUF9JUCkpOwotCQlCVUdfT04oc2tiLT5uaC5pcGgtPnByb3RvY29sICE9IElQUFJPVE9fVENQKTsKKwkJQlVHX09OKGlwX2hkcihza2IpLT5wcm90b2NvbCAhPSBJUFBST1RPX1RDUCk7CiAKIAkJZW11bGF0ZV9sYXJnZV9zZW5kX29mZmxvYWQoc2tiKTsKIAkJcmV0dXJuIDA7CkBAIC0xNjMsMTEgKzE2NCw5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBsb29wYmFja19zdGF0czsKLQogc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpnZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmbG9vcGJhY2tfc3RhdHM7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJmRldi0+c3RhdHM7CiAJdW5zaWduZWQgbG9uZyBieXRlcyA9IDA7CiAJdW5zaWduZWQgbG9uZyBwYWNrZXRzID0gMDsKIAlpbnQgaTsKQEAgLTIwNyw3ICsyMDYsNiBAQAogc3RydWN0IG5ldF9kZXZpY2UgbG9vcGJhY2tfZGV2ID0gewogCS5uYW1lCSAJCT0gImxvIiwKIAkuZ2V0X3N0YXRzCQk9ICZnZXRfc3RhdHMsCi0JLnByaXYJCQk9ICZsb29wYmFja19zdGF0cywKIAkubXR1CQkJPSAoMTYgKiAxMDI0KSArIDIwICsgMjAgKyAxMiwKIAkuaGFyZF9zdGFydF94bWl0CT0gbG9vcGJhY2tfeG1pdCwKIAkuaGFyZF9oZWFkZXIJCT0gZXRoX2hlYWRlciwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2xwNDg2ZS5jIGIvZHJpdmVycy9uZXQvbHA0ODZlLmMKaW5kZXggMTc3YzUwMi4uNWZjMThkYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbHA0ODZlLmMKKysrIGIvZHJpdmVycy9uZXQvbHA0ODZlLmMKQEAgLTY3Niw3ICs2NzYsNiBAQAogCQkJcmV0dXJuIDE7CiAJCX0KIAotCQlza2ItPmRldiA9IGRldjsKIAkJbWVtY3B5KHNrYl9wdXQoc2tiLHBrdF9sZW4pLCByZmQtPmRhdGEsIHBrdF9sZW4pOwogCiAJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L21hYzg5eDAuYyBiL2RyaXZlcnMvbmV0L21hYzg5eDAuYwppbmRleCBlOTYwMTM4Li45MGU2OTVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9tYWM4OXgwLmMKKysrIGIvZHJpdmVycy9uZXQvbWFjODl4MC5jCkBAIC01MzAsNyArNTMwLDYgQEAKIAkJcmV0dXJuOwogCX0KIAlza2JfcHV0KHNrYiwgbGVuZ3RoKTsKLQlza2ItPmRldiA9IGRldjsKIAogCW1lbWNweV9mcm9taW8oc2tiLT5kYXRhLCBkZXYtPm1lbV9zdGFydCArIFBQX1J4RnJhbWUsIGxlbmd0aCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L21hY2IuYyBiL2RyaXZlcnMvbmV0L21hY2IuYwppbmRleCAyZTk1NzFiLi4wZTA0ZjdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9tYWNiLmMKKysrIGIvZHJpdmVycy9uZXQvbWFjYi5jCkBAIC0zNTcsNyArMzU3LDYgQEAKIAl9CiAKIAlza2JfcmVzZXJ2ZShza2IsIFJYX09GRlNFVCk7Ci0Jc2tiLT5kZXYgPSBicC0+ZGV2OwogCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKIAlza2JfcHV0KHNrYiwgbGVuKTsKIApAQCAtMzY4LDkgKzM2NywxMCBAQAogCQkJQlVHX09OKGZyYWcgIT0gbGFzdF9mcmFnKTsKIAkJCWZyYWdfbGVuID0gbGVuIC0gb2Zmc2V0OwogCQl9Ci0JCW1lbWNweShza2ItPmRhdGEgKyBvZmZzZXQsCi0JCSAgICAgICBicC0+cnhfYnVmZmVycyArIChSWF9CVUZGRVJfU0laRSAqIGZyYWcpLAotCQkgICAgICAgZnJhZ19sZW4pOworCQlza2JfY29weV90b19saW5lYXJfZGF0YV9vZmZzZXQoc2tiLCBvZmZzZXQsCisJCQkJCSAgICAgICAoYnAtPnJ4X2J1ZmZlcnMgKworCQkJCQkgICAgICAgIChSWF9CVUZGRVJfU0laRSAqIGZyYWcpKSwKKwkJCQkJICAgICAgIGZyYWdfbGVuKTsKIAkJb2Zmc2V0ICs9IFJYX0JVRkZFUl9TSVpFOwogCQlicC0+cnhfcmluZ1tmcmFnXS5hZGRyICY9IH5NQUNCX0JJVChSWF9VU0VEKTsKIAkJd21iKCk7CkBAIC01NzYsNyArNTc2LDggQEAKIAlpbnQgaTsKIAlkZXZfZGJnKCZicC0+cGRldi0+ZGV2LAogCQkic3RhcnRfeG1pdDogbGVuICV1IGhlYWQgJXAgZGF0YSAlcCB0YWlsICVwIGVuZCAlcFxuIiwKLQkJc2tiLT5sZW4sIHNrYi0+aGVhZCwgc2tiLT5kYXRhLCBza2ItPnRhaWwsIHNrYi0+ZW5kKTsKKwkJc2tiLT5sZW4sIHNrYi0+aGVhZCwgc2tiLT5kYXRhLAorCQlza2JfdGFpbF9wb2ludGVyKHNrYiksIHNrYl9lbmRfcG9pbnRlcihza2IpKTsKIAlkZXZfZGJnKCZicC0+cGRldi0+ZGV2LAogCQkiZGF0YToiKTsKIAlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L21hY2UuYyBiL2RyaXZlcnMvbmV0L21hY2UuYwppbmRleCA5ZWMyNGYwLi5iM2JkNjIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9tYWNlLmMKKysrIGIvZHJpdmVycy9uZXQvbWFjZS5jCkBAIC05MzksNyArOTM5LDYgQEAKIAkJZWxzZQkvKiBFdGhlcm5ldCBoZWFkZXI7IG1hY2UgaW5jbHVkZXMgRkNTICovCiAJCSAgICBuYiAtPSA4OwogCQlza2JfcHV0KHNrYiwgbmIpOwotCQlza2ItPmRldiA9IGRldjsKIAkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKIAkJbXAtPnN0YXRzLnJ4X2J5dGVzICs9IHNrYi0+bGVuOwogCQluZXRpZl9yeChza2IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbWFjbWFjZS5jIGIvZHJpdmVycy9uZXQvbWFjbWFjZS5jCmluZGV4IDVkNTQxZTguLjI3OTExYzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L21hY21hY2UuYworKysgYi9kcml2ZXJzL25ldC9tYWNtYWNlLmMKQEAgLTQyMCw4ICs0MjAsNyBAQAogCW1wLT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKIAogCS8qIFdlIG5lZWQgdG8gY29weSBpbnRvIG91ciB4bWl0IGJ1ZmZlciB0byB0YWtlIGNhcmUgb2YgYWxpZ25tZW50IGFuZCBjYWNoaW5nIGlzc3VlcyAqLwotCi0JbWVtY3B5KCh2b2lkICopIG1wLT50eF9yaW5nLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgbXAtPnR4X3JpbmcsIHNrYi0+bGVuKTsKIAogCS8qIGxvYWQgdGhlIFR4IERNQSBhbmQgZmlyZSBpdCBvZmYgKi8KIApAQCAtNjIxLDcgKzYyMCw2IEBACiAJc2tiX3Jlc2VydmUoc2tiLDIpOwogCW1lbWNweShza2JfcHV0KHNrYiwgbWYtPmxlbiksIG1mLT5kYXRhLCBtZi0+bGVuKTsKIAotCXNrYi0+ZGV2ID0gZGV2OwogCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CiAJbmV0aWZfcngoc2tiKTsKIAlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbWV0aC5jIGIvZHJpdmVycy9uZXQvbWV0aC5jCmluZGV4IDdlNjljYTYuLjAzNDNlYTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L21ldGguYworKysgYi9kcml2ZXJzL25ldC9tZXRoLmMKQEAgLTQyMSw3ICs0MjEsNiBAQAogCQkJCQkvKiBXcml0ZSBtZXRhZGF0YSwgYW5kIHRoZW4gcGFzcyB0byB0aGUgcmVjZWl2ZSBsZXZlbCAqLwogCQkJCQlza2JfcHV0KHNrYl9jLCBsZW4pOwogCQkJCQlwcml2LT5yeF9za2JzW3ByaXYtPnJ4X3dyaXRlXSA9IHNrYjsKLQkJCQkJc2tiX2MtPmRldiA9IGRldjsKIAkJCQkJc2tiX2MtPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiX2MsIGRldik7CiAJCQkJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CiAJCQkJCXByaXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKQEAgLTYwOSw3ICs2MDgsNyBAQAogCiAJZGVzYy0+aGVhZGVyLnJhdyA9IE1FVEhfVFhfQ01EX0lOVF9FTiB8IChsZW4tMSkgfCAoKDEyOC1sZW4pIDw8IDE2KTsKIAkvKiBtYXliZSBJIHNob3VsZCBzZXQgd2hvbGUgdGhpbmcgdG8gMCBmaXJzdC4uLiAqLwotCW1lbWNweShkZXNjLT5kYXRhLmR0ICsgKDEyMCAtIGxlbiksIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCBkZXNjLT5kYXRhLmR0ICsgKDEyMCAtIGxlbiksIHNrYi0+bGVuKTsKIAlpZiAoc2tiLT5sZW4gPCBsZW4pCiAJCW1lbXNldChkZXNjLT5kYXRhLmR0ICsgMTIwIC0gbGVuICsgc2tiLT5sZW4sIDAsIGxlbi1za2ItPmxlbik7CiB9CkBAIC02MjcsOCArNjI2LDggQEAKIAogCS8qIHVuYWxpZ25lZCBwYXJ0ICovCiAJaWYgKHVuYWxpZ25lZF9sZW4pIHsKLQkJbWVtY3B5KGRlc2MtPmRhdGEuZHQgKyAoMTIwIC0gdW5hbGlnbmVkX2xlbiksCi0JCSAgICAgICBza2ItPmRhdGEsIHVuYWxpZ25lZF9sZW4pOworCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgZGVzYy0+ZGF0YS5kdCArICgxMjAgLSB1bmFsaWduZWRfbGVuKSwKKwkJCSAgICAgIHVuYWxpZ25lZF9sZW4pOwogCQlkZXNjLT5oZWFkZXIucmF3IHw9ICgxMjggLSB1bmFsaWduZWRfbGVuKSA8PCAxNjsKIAl9CiAKQEAgLTY1Myw4ICs2NTIsOCBAQAogCWRlc2MtPmhlYWRlci5yYXcgPSBNRVRIX1RYX0NNRF9JTlRfRU4gfCBUWF9DQVRCVUYxIHwgVFhfQ0FUQlVGMnwgKHNrYi0+bGVuIC0gMSk7CiAJLyogdW5hbGlnbmVkIHBhcnQgKi8KIAlpZiAodW5hbGlnbmVkX2xlbil7Ci0JCW1lbWNweShkZXNjLT5kYXRhLmR0ICsgKDEyMCAtIHVuYWxpZ25lZF9sZW4pLAotCQkgICAgICAgc2tiLT5kYXRhLCB1bmFsaWduZWRfbGVuKTsKKwkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIGRlc2MtPmRhdGEuZHQgKyAoMTIwIC0gdW5hbGlnbmVkX2xlbiksCisJCQkgICAgICB1bmFsaWduZWRfbGVuKTsKIAkJZGVzYy0+aGVhZGVyLnJhdyB8PSAoMTI4IC0gdW5hbGlnbmVkX2xlbikgPDwgMTY7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9taWkuYyBiL2RyaXZlcnMvbmV0L21paS5jCmluZGV4IDI5MTJhMzQuLjkyMDU2MDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L21paS5jCisrKyBiL2RyaXZlcnMvbmV0L21paS5jCkBAIC0zMyw2ICszMywxMyBAQAogI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KICNpbmNsdWRlIDxsaW51eC9taWkuaD4KIAorLyoqCisgKiBtaWlfZXRodG9vbF9nc2V0IC0gZ2V0IHNldHRpbmdzIHRoYXQgYXJlIHNwZWNpZmllZCBpbiBAZWNtZAorICogQG1paTogTUlJIGludGVyZmFjZQorICogQGVjbWQ6IHJlcXVlc3RlZCBldGh0b29sX2NtZAorICoKKyAqIFJldHVybnMgMCBmb3Igc3VjY2VzcywgbmVnYXRpdmUgb24gZXJyb3IuCisgKi8KIGludCBtaWlfZXRodG9vbF9nc2V0KHN0cnVjdCBtaWlfaWZfaW5mbyAqbWlpLCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmVjbWQpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IG1paS0+ZGV2OwpAQCAtMTE0LDYgKzEyMSwxMyBAQAogCXJldHVybiAwOwogfQogCisvKioKKyAqIG1paV9ldGh0b29sX3NzZXQgLSBzZXQgc2V0dGluZ3MgdGhhdCBhcmUgc3BlY2lmaWVkIGluIEBlY21kCisgKiBAbWlpOiBNSUkgaW50ZXJmYWNlCisgKiBAZWNtZDogcmVxdWVzdGVkIGV0aHRvb2xfY21kCisgKgorICogUmV0dXJucyAwIGZvciBzdWNjZXNzLCBuZWdhdGl2ZSBvbiBlcnJvci4KKyAqLwogaW50IG1paV9ldGh0b29sX3NzZXQoc3RydWN0IG1paV9pZl9pbmZvICptaWksIHN0cnVjdCBldGh0b29sX2NtZCAqZWNtZCkKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbWlpLT5kZXY7CkBAIC0yMDcsNiArMjIxLDEwIEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qKgorICogbWlpX2NoZWNrX2dtaWlfc3VwcG9ydCAtIGNoZWNrIGlmIHRoZSBNSUkgc3VwcG9ydHMgR2IgaW50ZXJmYWNlcworICogQG1paTogdGhlIE1JSSBpbnRlcmZhY2UKKyAqLwogaW50IG1paV9jaGVja19nbWlpX3N1cHBvcnQoc3RydWN0IG1paV9pZl9pbmZvICptaWkpCiB7CiAJaW50IHJlZzsKQEAgLTIyMSw2ICsyMzksMTIgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyoqCisgKiBtaWlfbGlua19vayAtIGlzIGxpbmsgc3RhdHVzIHVwL29rCisgKiBAbWlpOiB0aGUgTUlJIGludGVyZmFjZQorICoKKyAqIFJldHVybnMgMSBpZiB0aGUgTUlJIHJlcG9ydHMgbGluayBzdGF0dXMgdXAvb2ssIDAgb3RoZXJ3aXNlLgorICovCiBpbnQgbWlpX2xpbmtfb2sgKHN0cnVjdCBtaWlfaWZfaW5mbyAqbWlpKQogewogCS8qIGZpcnN0LCBhIGR1bW15IHJlYWQsIG5lZWRlZCB0byBsYXRjaCBzb21lIE1JSSBwaHlzICovCkBAIC0yMzAsNiArMjU0LDEyIEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qKgorICogbWlpX253YXlfcmVzdGFydCAtIHJlc3RhcnQgTldheSAoYXV0b25lZ290aWF0aW9uKSBmb3IgdGhpcyBpbnRlcmZhY2UKKyAqIEBtaWk6IHRoZSBNSUkgaW50ZXJmYWNlCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIG9uIGVycm9yLgorICovCiBpbnQgbWlpX253YXlfcmVzdGFydCAoc3RydWN0IG1paV9pZl9pbmZvICptaWkpCiB7CiAJaW50IGJtY3I7CkBAIC0yNDcsNiArMjc3LDE0IEBACiAJcmV0dXJuIHI7CiB9CiAKKy8qKgorICogbWlpX2NoZWNrX2xpbmsgLSBjaGVjayBNSUkgbGluayBzdGF0dXMKKyAqIEBtaWk6IE1JSSBpbnRlcmZhY2UKKyAqCisgKiBJZiB0aGUgbGluayBzdGF0dXMgY2hhbmdlZCAocHJldmlvdXMgIT0gY3VycmVudCksIGNhbGwKKyAqIG5ldGlmX2NhcnJpZXJfb24oKSBpZiBjdXJyZW50IGxpbmsgc3RhdHVzIGlzIFVwIG9yIGNhbGwKKyAqIG5ldGlmX2NhcnJpZXJfb2ZmKCkgaWYgY3VycmVudCBsaW5rIHN0YXR1cyBpcyBEb3duLgorICovCiB2b2lkIG1paV9jaGVja19saW5rIChzdHJ1Y3QgbWlpX2lmX2luZm8gKm1paSkKIHsKIAlpbnQgY3VyX2xpbmsgPSBtaWlfbGlua19vayhtaWkpOwpAQCAtMjU4LDYgKzI5NiwxNSBAQAogCQluZXRpZl9jYXJyaWVyX29mZihtaWktPmRldik7CiB9CiAKKy8qKgorICogbWlpX2NoZWNrX21lZGlhIC0gY2hlY2sgdGhlIE1JSSBpbnRlcmZhY2UgZm9yIGEgZHVwbGV4IGNoYW5nZQorICogQG1paTogdGhlIE1JSSBpbnRlcmZhY2UKKyAqIEBva190b19wcmludDogT0sgdG8gcHJpbnQgbGluayB1cC9kb3duIG1lc3NhZ2VzCisgKiBAaW5pdF9tZWRpYTogT0sgdG8gc2F2ZSBkdXBsZXggbW9kZSBpbiBAbWlpCisgKgorICogUmV0dXJucyAxIGlmIHRoZSBkdXBsZXggbW9kZSBjaGFuZ2VkLCAwIGlmIG5vdC4KKyAqIElmIHRoZSBtZWRpYSB0eXBlIGlzIGZvcmNlZCwgYWx3YXlzIHJldHVybnMgMC4KKyAqLwogdW5zaWduZWQgaW50IG1paV9jaGVja19tZWRpYSAoc3RydWN0IG1paV9pZl9pbmZvICptaWksCiAJCQkgICAgICB1bnNpZ25lZCBpbnQgb2tfdG9fcHJpbnQsCiAJCQkgICAgICB1bnNpZ25lZCBpbnQgaW5pdF9tZWRpYSkKQEAgLTMyNiw2ICszNzMsMTYgQEAKIAlyZXR1cm4gMDsgLyogZHVwbGV4IGRpZCBub3QgY2hhbmdlICovCiB9CiAKKy8qKgorICogZ2VuZXJpY19taWlfaW9jdGwgLSBtYWluIE1JSSBpb2N0bCBpbnRlcmZhY2UKKyAqIEBtaWlfaWY6IHRoZSBNSUkgaW50ZXJmYWNlCisgKiBAbWlpX2RhdGE6IE1JSSBpb2N0bCBkYXRhIHN0cnVjdHVyZQorICogQGNtZDogTUlJIGlvY3RsIGNvbW1hbmQKKyAqIEBkdXBsZXhfY2hnX291dDogcG9pbnRlciB0byBAZHVwbGV4X2NoYW5nZWQgc3RhdHVzIGlmIHRoZXJlIHdhcyBubworICoJaW9jdGwgZXJyb3IKKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgb24gZXJyb3IuCisgKi8KIGludCBnZW5lcmljX21paV9pb2N0bChzdHJ1Y3QgbWlpX2lmX2luZm8gKm1paV9pZiwKIAkJICAgICAgc3RydWN0IG1paV9pb2N0bF9kYXRhICptaWlfZGF0YSwgaW50IGNtZCwKIAkJICAgICAgdW5zaWduZWQgaW50ICpkdXBsZXhfY2hnX291dCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L21pcHNuZXQuYyBiL2RyaXZlcnMvbmV0L21pcHNuZXQuYwppbmRleCBmNDJiOWUyLi42MzhhMjc5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9taXBzbmV0LmMKKysrIGIvZHJpdmVycy9uZXQvbWlwc25ldC5jCkBAIC0yNiw4ICsyNiw2IEBACiAJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CiB9OwogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqbWlwc19wbGF0X2RldjsKLQogc3RhdGljIGNoYXIgbWlwc25ldF9zdHJpbmdbXSA9ICJtaXBzbmV0IjsKIAogLyoKQEAgLTEwMSw3ICs5OSw2IEBACiAJaWYgKGlvaW9jcHlfZnJvbW1pcHNuZXQoZGV2LCBza2JfcHV0KHNrYiwgbGVuKSwgbGVuKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQlza2ItPmRldiA9IGRldjsKIAlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOwogCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CiAKQEAgLTI5OCw2NCArMjk1LDE3IEBACiAJLnJlbW92ZQk9IF9fZGV2ZXhpdF9wKG1pcHNuZXRfZGV2aWNlX3JlbW92ZSksCiB9OwogCi1zdGF0aWMgdm9pZCBtaXBzbmV0X3BsYXRmb3JtX3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2aWNlKQotewotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBsZGV2OwotCi0JLyogZnJlZSBkZXZpY2UgKi8KLQlwbGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXZpY2UpOwotCWtmcmVlKHBsZGV2KTsKLX0KLQogc3RhdGljIGludCBfX2luaXQgbWlwc25ldF9pbml0X21vZHVsZSh2b2lkKQogewotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBsZGV2OwogCWludCBlcnI7CiAKIAlwcmludGsoS0VSTl9JTkZPICJNSVBTTmV0IEV0aGVybmV0IGRyaXZlci4gVmVyc2lvbjogJXMuICIKIAkgICAgICAgIihjKTIwMDUgTUlQUyBUZWNobm9sb2dpZXMsIEluYy5cbiIsIE1JUFNORVRfVkVSU0lPTik7CiAKLQlpZiAoZHJpdmVyX3JlZ2lzdGVyKCZtaXBzbmV0X2RyaXZlcikpIHsKKwllcnIgPSBkcml2ZXJfcmVnaXN0ZXIoJm1pcHNuZXRfZHJpdmVyKTsKKwlpZiAoZXJyKQogCQlwcmludGsoS0VSTl9FUlIgIkRyaXZlciByZWdpc3RyYXRpb24gZmFpbGVkXG4iKTsKLQkJZXJyID0gLUVOT0RFVjsKLQkJZ290byBvdXQ7Ci0JfQogCi0gICAgICAgIGlmICghKHBsZGV2ID0ga21hbGxvYyAoc2l6ZW9mICgqcGxkZXYpLCBHRlBfS0VSTkVMKSkpIHsKLQkJZXJyID0gLUVOT01FTTsKLQkJZ290byBvdXRfdW5yZWdpc3Rlcl9kcml2ZXI7Ci0JfQotCi0JbWVtc2V0IChwbGRldiwgMCwgc2l6ZW9mICgqcGxkZXYpKTsKLQlwbGRldi0+bmFtZQkJPSBtaXBzbmV0X3N0cmluZzsKLQlwbGRldi0+aWQJCT0gMDsKLQlwbGRldi0+ZGV2LnJlbGVhc2UJPSBtaXBzbmV0X3BsYXRmb3JtX3JlbGVhc2U7Ci0KLQlpZiAocGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKHBsZGV2KSkgewotCQllcnIgPSAtRU5PREVWOwotCQlnb3RvIG91dF9mcmVlX3BsZGV2OwotCX0KLQotICAgICAgICBpZiAoIXBsZGV2LT5kZXYuZHJpdmVyKSB7Ci0JCS8qCi0JCSAqIFRoZSBkcml2ZXIgd2FzIG5vdCBib3VuZCB0byB0aGlzIGRldmljZSwgdGhlcmUgd2FzCi0gICAgICAgICAgICAgICAgICogbm8gaGFyZHdhcmUgYXQgdGhpcyBhZGRyZXNzLiBVbnJlZ2lzdGVyIGl0LCBhcyB0aGUKLQkJICogcmVsZWFzZSBmdWN0aW9uIHdpbGwgdGFrZSBjYXJlIG9mIGZyZWVpbmcgdGhlCi0JCSAqIGFsbG9jYXRlZCBzdHJ1Y3R1cmUKLQkJICovCi0JCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyIChwbGRldik7Ci0JfQotCi0JbWlwc19wbGF0X2RldgkJPSBwbGRldjsKLQotCXJldHVybiAwOwotCi1vdXRfZnJlZV9wbGRldjoKLQlrZnJlZShwbGRldik7Ci0KLW91dF91bnJlZ2lzdGVyX2RyaXZlcjoKLQlkcml2ZXJfdW5yZWdpc3RlcigmbWlwc25ldF9kcml2ZXIpOwotb3V0OgogCXJldHVybiBlcnI7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L212NjQzeHhfZXRoLmMgYi9kcml2ZXJzL25ldC9tdjY0M3h4X2V0aC5jCmluZGV4IDgwMTVhN2MuLjE3OTllZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L212NjQzeHhfZXRoLmMKKysrIGIvZHJpdmVycy9uZXQvbXY2NDN4eF9ldGguYwpAQCAtNTEsOCArNTEsOCBAQAogI2luY2x1ZGUgIm12NjQzeHhfZXRoLmgiCiAKIC8qIFN0YXRpYyBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgKi8KLXN0YXRpYyB2b2lkIGV0aF9wb3J0X3VjX2FkZHJfZ2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJCQl1bnNpZ25lZCBjaGFyICpNYWNBZGRyKTsKK3N0YXRpYyB2b2lkIGV0aF9wb3J0X3VjX2FkZHJfZ2V0KHVuc2lnbmVkIGludCBwb3J0X251bSwgdW5zaWduZWQgY2hhciAqcF9hZGRyKTsKK3N0YXRpYyB2b2lkIGV0aF9wb3J0X3VjX2FkZHJfc2V0KHVuc2lnbmVkIGludCBwb3J0X251bSwgdW5zaWduZWQgY2hhciAqcF9hZGRyKTsKIHN0YXRpYyB2b2lkIGV0aF9wb3J0X3NldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqKTsKIHN0YXRpYyB2b2lkIG12NjQzeHhfZXRoX3BvcnRfZW5hYmxlX3R4KHVuc2lnbmVkIGludCBwb3J0X251bSwKIAkJCQkJCXVuc2lnbmVkIGludCBxdWV1ZXMpOwpAQCAtNDM0LDcgKzQzNCw2IEBACiAJCQkgKiByZWNlaXZlZCBwYWNrZXQKIAkJCSAqLwogCQkJc2tiX3B1dChza2IsIHBrdF9pbmZvLmJ5dGVfY250IC0gNCk7Ci0JCQlza2ItPmRldiA9IGRldjsKIAogCQkJaWYgKHBrdF9pbmZvLmNtZF9zdHMgJiBFVEhfTEFZRVJfNF9DSEVDS1NVTV9PSykgewogCQkJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CkBAIC0xMTYyLDE1ICsxMTYxLDE1IEBACiAKIAkJY21kX3N0cyB8PSBFVEhfR0VOX1RDUF9VRFBfQ0hFQ0tTVU0gfAogCQkJICAgRVRIX0dFTl9JUF9WXzRfQ0hFQ0tTVU0gIHwKLQkJCSAgIHNrYi0+bmguaXBoLT5paGwgPDwgRVRIX1RYX0lITF9TSElGVDsKKwkJCSAgIGlwX2hkcihza2IpLT5paGwgPDwgRVRIX1RYX0lITF9TSElGVDsKIAotCQlzd2l0Y2ggKHNrYi0+bmguaXBoLT5wcm90b2NvbCkgeworCQlzd2l0Y2ggKGlwX2hkcihza2IpLT5wcm90b2NvbCkgewogCQljYXNlIElQUFJPVE9fVURQOgogCQkJY21kX3N0cyB8PSBFVEhfVURQX0ZSQU1FOwotCQkJZGVzYy0+bDRpX2NoayA9IHNrYi0+aC51aC0+Y2hlY2s7CisJCQlkZXNjLT5sNGlfY2hrID0gdWRwX2hkcihza2IpLT5jaGVjazsKIAkJCWJyZWFrOwogCQljYXNlIElQUFJPVE9fVENQOgotCQkJZGVzYy0+bDRpX2NoayA9IHNrYi0+aC50aC0+Y2hlY2s7CisJCQlkZXNjLT5sNGlfY2hrID0gdGNwX2hkcihza2IpLT5jaGVjazsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJQlVHKCk7CkBAIC0xMzgyLDcgKzEzODEsNyBAQAogCXBvcnRfbnVtID0gbXAtPnBvcnRfbnVtID0gcGQtPnBvcnRfbnVtYmVyOwogCiAJLyogc2V0IGRlZmF1bHQgY29uZmlnIHZhbHVlcyAqLwotCWV0aF9wb3J0X3VjX2FkZHJfZ2V0KGRldiwgZGV2LT5kZXZfYWRkcik7CisJZXRoX3BvcnRfdWNfYWRkcl9nZXQocG9ydF9udW0sIGRldi0+ZGV2X2FkZHIpOwogCW1wLT5yeF9yaW5nX3NpemUgPSBNVjY0M1hYX0VUSF9QT1JUX0RFRkFVTFRfUkVDRUlWRV9RVUVVRV9TSVpFOwogCW1wLT50eF9yaW5nX3NpemUgPSBNVjY0M1hYX0VUSF9QT1JUX0RFRkFVTFRfVFJBTlNNSVRfUVVFVUVfU0laRTsKIApAQCAtMTg0MCwyNiArMTgzOSw5IEBACiB9CiAKIC8qCi0gKiBldGhfcG9ydF91Y19hZGRyX3NldCAtIFRoaXMgZnVuY3Rpb24gU2V0IHRoZSBwb3J0IFVuaWNhc3QgYWRkcmVzcy4KLSAqCi0gKiBERVNDUklQVElPTjoKLSAqCQlUaGlzIGZ1bmN0aW9uIFNldCB0aGUgcG9ydCBFdGhlcm5ldCBNQUMgYWRkcmVzcy4KLSAqCi0gKiBJTlBVVDoKLSAqCXVuc2lnbmVkIGludAlldGhfcG9ydF9udW0JUG9ydCBudW1iZXIuCi0gKgljaGFyICoJCXBfYWRkcgkJQWRkcmVzcyB0byBiZSBzZXQKLSAqCi0gKiBPVVRQVVQ6Ci0gKglTZXQgTUFDIGFkZHJlc3MgbG93IGFuZCBoaWdoIHJlZ2lzdGVycy4gYWxzbyBjYWxscwotICoJZXRoX3BvcnRfc2V0X2ZpbHRlcl90YWJsZV9lbnRyeSgpIHRvIHNldCB0aGUgdW5pY2FzdAotICoJdGFibGUgd2l0aCB0aGUgcHJvcGVyIGluZm9ybWF0aW9uLgotICoKLSAqIFJFVFVSTjoKLSAqCU4vQS4KLSAqCisgKiBldGhfcG9ydF91Y19hZGRyX3NldCAtIFdyaXRlIGEgTUFDIGFkZHJlc3MgaW50byB0aGUgcG9ydCdzIGh3IHJlZ2lzdGVycwogICovCi1zdGF0aWMgdm9pZCBldGhfcG9ydF91Y19hZGRyX3NldCh1bnNpZ25lZCBpbnQgZXRoX3BvcnRfbnVtLAotCQkJCQkJCXVuc2lnbmVkIGNoYXIgKnBfYWRkcikKK3N0YXRpYyB2b2lkIGV0aF9wb3J0X3VjX2FkZHJfc2V0KHVuc2lnbmVkIGludCBwb3J0X251bSwgdW5zaWduZWQgY2hhciAqcF9hZGRyKQogewogCXVuc2lnbmVkIGludCBtYWNfaDsKIAl1bnNpZ25lZCBpbnQgbWFjX2w7CkBAIC0xODY5LDQwICsxODUxLDI0IEBACiAJbWFjX2ggPSAocF9hZGRyWzBdIDw8IDI0KSB8IChwX2FkZHJbMV0gPDwgMTYpIHwgKHBfYWRkclsyXSA8PCA4KSB8CiAJCQkJCQkJKHBfYWRkclszXSA8PCAwKTsKIAotCW12X3dyaXRlKE1WNjQzWFhfRVRIX01BQ19BRERSX0xPVyhldGhfcG9ydF9udW0pLCBtYWNfbCk7Ci0JbXZfd3JpdGUoTVY2NDNYWF9FVEhfTUFDX0FERFJfSElHSChldGhfcG9ydF9udW0pLCBtYWNfaCk7CisJbXZfd3JpdGUoTVY2NDNYWF9FVEhfTUFDX0FERFJfTE9XKHBvcnRfbnVtKSwgbWFjX2wpOworCW12X3dyaXRlKE1WNjQzWFhfRVRIX01BQ19BRERSX0hJR0gocG9ydF9udW0pLCBtYWNfaCk7CiAKLQkvKiBBY2NlcHQgZnJhbWVzIG9mIHRoaXMgYWRkcmVzcyAqLwotCXRhYmxlID0gTVY2NDNYWF9FVEhfREFfRklMVEVSX1VOSUNBU1RfVEFCTEVfQkFTRShldGhfcG9ydF9udW0pOworCS8qIEFjY2VwdCBmcmFtZXMgd2l0aCB0aGlzIGFkZHJlc3MgKi8KKwl0YWJsZSA9IE1WNjQzWFhfRVRIX0RBX0ZJTFRFUl9VTklDQVNUX1RBQkxFX0JBU0UocG9ydF9udW0pOwogCWV0aF9wb3J0X3NldF9maWx0ZXJfdGFibGVfZW50cnkodGFibGUsIHBfYWRkcls1XSAmIDB4MGYpOwogfQogCiAvKgotICogZXRoX3BvcnRfdWNfYWRkcl9nZXQgLSBUaGlzIGZ1bmN0aW9uIHJldHJpZXZlcyB0aGUgcG9ydCBVbmljYXN0IGFkZHJlc3MKLSAqIChNQUMgYWRkcmVzcykgZnJvbSB0aGUgZXRoZXJuZXQgaHcgcmVnaXN0ZXJzLgotICoKLSAqIERFU0NSSVBUSU9OOgotICoJCVRoaXMgZnVuY3Rpb24gcmV0cmlldmVzIHRoZSBwb3J0IEV0aGVybmV0IE1BQyBhZGRyZXNzLgotICoKLSAqIElOUFVUOgotICoJdW5zaWduZWQgaW50CWV0aF9wb3J0X251bQlQb3J0IG51bWJlci4KLSAqCWNoYXIJCSpNYWNBZGRyCXBvaW50ZXIgd2hlcmUgdGhlIE1BQyBhZGRyZXNzIGlzIHN0b3JlZAotICoKLSAqIE9VVFBVVDoKLSAqCUNvcHkgdGhlIE1BQyBhZGRyZXNzIHRvIHRoZSBsb2NhdGlvbiBwb2ludGVkIHRvIGJ5IE1hY0FkZHIKLSAqCi0gKiBSRVRVUk46Ci0gKglOL0EuCi0gKgorICogZXRoX3BvcnRfdWNfYWRkcl9nZXQgLSBSZWFkIHRoZSBNQUMgYWRkcmVzcyBmcm9tIHRoZSBwb3J0J3MgaHcgcmVnaXN0ZXJzCiAgKi8KLXN0YXRpYyB2b2lkIGV0aF9wb3J0X3VjX2FkZHJfZ2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGNoYXIgKnBfYWRkcikKK3N0YXRpYyB2b2lkIGV0aF9wb3J0X3VjX2FkZHJfZ2V0KHVuc2lnbmVkIGludCBwb3J0X251bSwgdW5zaWduZWQgY2hhciAqcF9hZGRyKQogewotCXN0cnVjdCBtdjY0M3h4X3ByaXZhdGUgKm1wID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl1bnNpZ25lZCBpbnQgbWFjX2g7CiAJdW5zaWduZWQgaW50IG1hY19sOwogCi0JbWFjX2ggPSBtdl9yZWFkKE1WNjQzWFhfRVRIX01BQ19BRERSX0hJR0gobXAtPnBvcnRfbnVtKSk7Ci0JbWFjX2wgPSBtdl9yZWFkKE1WNjQzWFhfRVRIX01BQ19BRERSX0xPVyhtcC0+cG9ydF9udW0pKTsKKwltYWNfaCA9IG12X3JlYWQoTVY2NDNYWF9FVEhfTUFDX0FERFJfSElHSChwb3J0X251bSkpOworCW1hY19sID0gbXZfcmVhZChNVjY0M1hYX0VUSF9NQUNfQUREUl9MT1cocG9ydF9udW0pKTsKIAogCXBfYWRkclswXSA9IChtYWNfaCA+PiAyNCkgJiAweGZmOwogCXBfYWRkclsxXSA9IChtYWNfaCA+PiAxNikgJiAweGZmOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbXY2NDN4eF9ldGguaCBiL2RyaXZlcnMvbmV0L212NjQzeHhfZXRoLmgKaW5kZXggN2Q0ZTkwYy4uODJmOGMwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbXY2NDN4eF9ldGguaAorKysgYi9kcml2ZXJzL25ldC9tdjY0M3h4X2V0aC5oCkBAIC0zNDYsMTAgKzM0Niw2IEBACiBzdGF0aWMgdm9pZCBldGhfcG9ydF9yZXNldCh1bnNpZ25lZCBpbnQgZXRoX3BvcnRfbnVtKTsKIHN0YXRpYyB2b2lkIGV0aF9wb3J0X3N0YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogCi0vKiBQb3J0IE1BQyBhZGRyZXNzIHJvdXRpbmVzICovCi1zdGF0aWMgdm9pZCBldGhfcG9ydF91Y19hZGRyX3NldCh1bnNpZ25lZCBpbnQgZXRoX3BvcnRfbnVtLAotCQkJCSB1bnNpZ25lZCBjaGFyICpwX2FkZHIpOwotCiAvKiBQSFkgYW5kIE1JQiByb3V0aW5lcyAqLwogc3RhdGljIHZvaWQgZXRoZXJuZXRfcGh5X3Jlc2V0KHVuc2lnbmVkIGludCBldGhfcG9ydF9udW0pOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9teXJpMTBnZS9teXJpMTBnZS5jIGIvZHJpdmVycy9uZXQvbXlyaTEwZ2UvbXlyaTEwZ2UuYwppbmRleCBmOGVmZTBlLi4xNmUzYzQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9teXJpMTBnZS9teXJpMTBnZS5jCisrKyBiL2RyaXZlcnMvbmV0L215cmkxMGdlL215cmkxMGdlLmMKQEAgLTg3OSw3ICs4NzksNyBAQAogCSAqIHNrYl9wdWxsKCkgKGZvciBldGhlcl9wYWQgYW5kIGV0aF90eXBlX3RyYW5zKCkpIHJlcXVpcmVzCiAJICogdGhlIGJlZ2lubmluZyBvZiB0aGUgcGFja2V0IGluIHNrYl9oZWFkbGVuKCksIG1vdmUgaXQKIAkgKiBtYW51YWxseSAqLwotCW1lbWNweShza2ItPmRhdGEsIHZhLCBobGVuKTsKKwlza2JfY29weV90b19saW5lYXJfZGF0YShza2IsIHZhLCBobGVuKTsKIAlza2Jfc2hpbmZvKHNrYiktPmZyYWdzWzBdLnBhZ2Vfb2Zmc2V0ICs9IGhsZW47CiAJc2tiX3NoaW5mbyhza2IpLT5mcmFnc1swXS5zaXplIC09IGhsZW47CiAJc2tiLT5kYXRhX2xlbiAtPSBobGVuOwpAQCAtMTAyMCw3ICsxMDIwLDYgQEAKIAkJc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncyA9IDA7CiAJfQogCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7Ci0Jc2tiLT5kZXYgPSBkZXY7CiAKIAlpZiAobWdwLT5jc3VtX2ZsYWcpIHsKIAkJaWYgKChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX0lQKSkgfHwKQEAgLTIwMzAsNyArMjAyOSw3IEBACiAJb2RkX2ZsYWcgPSAwOwogCWZsYWdzID0gKE1YR0VGV19GTEFHU19OT19UU08gfCBNWEdFRldfRkxBR1NfRklSU1QpOwogCWlmIChsaWtlbHkoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCkpIHsKLQkJY2tzdW1fb2Zmc2V0ID0gKHNrYi0+aC5yYXcgLSBza2ItPmRhdGEpOworCQlja3N1bV9vZmZzZXQgPSBza2JfdHJhbnNwb3J0X29mZnNldChza2IpOwogCQlwc2V1ZG9faGRyX29mZnNldCA9IGNrc3VtX29mZnNldCArIHNrYi0+Y3N1bV9vZmZzZXQ7CiAJCS8qIElmIHRoZSBoZWFkZXJzIGFyZSBleGNlc3NpdmVseSBsYXJnZSwgdGhlbiB3ZSBtdXN0CiAJCSAqIGZhbGwgYmFjayB0byBhIHNvZnR3YXJlIGNoZWNrc3VtICovCkBAIC0yMDU1LDcgKzIwNTQsNyBAQAogCQkgKiBzZW5kIGxvb3AgdGhhdCB3ZSBhcmUgc3RpbGwgaW4gdGhlCiAJCSAqIGhlYWRlciBwb3J0aW9uIG9mIHRoZSBUU08gcGFja2V0LgogCQkgKiBUU08gaGVhZGVyIG11c3QgYmUgYXQgbW9zdCAxMzQgYnl0ZXMgbG9uZyAqLwotCQljdW1fbGVuID0gLSgoc2tiLT5oLnJhdyAtIHNrYi0+ZGF0YSkgKyAoc2tiLT5oLnRoLT5kb2ZmIDw8IDIpKTsKKwkJY3VtX2xlbiA9IC0oc2tiX3RyYW5zcG9ydF9vZmZzZXQoc2tiKSArIHRjcF9oZHJsZW4oc2tiKSk7CiAKIAkJLyogZm9yIFRTTywgcHNldWRvX2hkcl9vZmZzZXQgaG9sZHMgbXNzLgogCQkgKiBUaGUgZmlybXdhcmUgZmlndXJlcyBvdXQgd2hlcmUgdG8gcHV0CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9teXJpX3NidXMuYyBiL2RyaXZlcnMvbmV0L215cmlfc2J1cy5jCmluZGV4IGVlMjZlZjUuLjEzNDQ0ZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L215cmlfc2J1cy5jCisrKyBiL2RyaXZlcnMvbmV0L215cmlfc2J1cy5jCkBAIC0zNjgsNyArMzY4LDcgQEAKIAlzdHJ1Y3QgZXRoaGRyICpldGg7CiAJdW5zaWduZWQgY2hhciAqcmF3cDsKIAotCXNrYi0+bWFjLnJhdyA9ICgoKHVuc2lnbmVkIGNoYXIgKilza2ItPmRhdGEpICsgTVlSSV9QQURfTEVOKTsKKwlza2Jfc2V0X21hY19oZWFkZXIoc2tiLCBNWVJJX1BBRF9MRU4pOwogCXNrYl9wdWxsKHNrYiwgZGV2LT5oYXJkX2hlYWRlcl9sZW4pOwogCWV0aCA9IGV0aF9oZHIoc2tiKTsKIApAQCAtNTAyLDcgKzUwMiw3IEBACiAJCQljb3B5X3NrYi0+ZGV2ID0gZGV2OwogCQkJRFJYKCgicmVzdl9hbmRfcHV0ICIpKTsKIAkJCXNrYl9wdXQoY29weV9za2IsIGxlbik7Ci0JCQltZW1jcHkoY29weV9za2ItPmRhdGEsIHNrYi0+ZGF0YSwgbGVuKTsKKwkJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCBjb3B5X3NrYi0+ZGF0YSwgbGVuKTsKIAogCQkJLyogUmV1c2Ugb3JpZ2luYWwgcmluZyBidWZmZXIuICovCiAJCQlEUlgoKCJyZXVzZSAiKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9uYXRzZW1pLmMgYi9kcml2ZXJzL25ldC9uYXRzZW1pLmMKaW5kZXggMzQ5Yjk2YS4uYThkN2ZmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbmF0c2VtaS5jCisrKyBiL2RyaXZlcnMvbmV0L25hdHNlbWkuYwpAQCAtMjI4OSw3ICsyMjg5LDYgQEAKIAkJCSAqIHdpdGhvdXQgY29weWluZyB0byBhIG1pbmltYWxseS1zaXplZCBza2J1ZmYuICovCiAJCQlpZiAocGt0X2xlbiA8IHJ4X2NvcHlicmVhawogCQkJICAgICYmIChza2IgPSBkZXZfYWxsb2Nfc2tiKHBrdF9sZW4gKyBSWF9PRkZTRVQpKSAhPSBOVUxMKSB7Ci0JCQkJc2tiLT5kZXYgPSBkZXY7CiAJCQkJLyogMTYgYnl0ZSBhbGlnbiB0aGUgSVAgaGVhZGVyICovCiAJCQkJc2tiX3Jlc2VydmUoc2tiLCBSWF9PRkZTRVQpOwogCQkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdShucC0+cGNpX2RldiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L25ldHgtZXRoLmMgYi9kcml2ZXJzL25ldC9uZXR4LWV0aC5jCmluZGV4IGE1MzY0NGYuLjJiOGRhMGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L25ldHgtZXRoLmMKKysrIGIvZHJpdmVycy9uZXQvbmV0eC1ldGguYwpAQCAtMTY4LDcgKzE2OCw2IEBACiAJCUZJRk9fUFRSX1NFR01FTlQoc2VnKSB8IEZJRk9fUFRSX0ZSQU1FTk8oZnJhbWVubykpOwogCiAJbmRldi0+bGFzdF9yeCA9IGppZmZpZXM7Ci0Jc2tiLT5kZXYgPSBuZGV2OwogCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIG5kZXYpOwogCW5ldGlmX3J4KHNrYik7CiAJcHJpdi0+c3RhdHMucnhfcGFja2V0cysrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWMuaCBiL2RyaXZlcnMvbmV0L25ldHhlbi9uZXR4ZW5fbmljLmgKaW5kZXggZGQ4Y2UzNS4uYWQ2Njg4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWMuaAorKysgYi9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pYy5oCkBAIC02NCw5ICs2NCw5IEBACiAjaW5jbHVkZSAibmV0eGVuX25pY19ody5oIgogCiAjZGVmaW5lIF9ORVRYRU5fTklDX0xJTlVYX01BSk9SIDMKLSNkZWZpbmUgX05FVFhFTl9OSUNfTElOVVhfTUlOT1IgMwotI2RlZmluZSBfTkVUWEVOX05JQ19MSU5VWF9TVUJWRVJTSU9OIDMKLSNkZWZpbmUgTkVUWEVOX05JQ19MSU5VWF9WRVJTSU9OSUQgICIzLjMuMyIKKyNkZWZpbmUgX05FVFhFTl9OSUNfTElOVVhfTUlOT1IgNAorI2RlZmluZSBfTkVUWEVOX05JQ19MSU5VWF9TVUJWRVJTSU9OIDIKKyNkZWZpbmUgTkVUWEVOX05JQ19MSU5VWF9WRVJTSU9OSUQgICIzLjQuMiIKIAogI2RlZmluZSBOVU1fRkxBU0hfU0VDVE9SUyAoNjQpCiAjZGVmaW5lIEZMQVNIX1NFQ1RPUl9TSVpFICg2NCAqIDEwMjQpCkBAIC0xMzEsOCArMTMxLDggQEAKICNkZWZpbmUgRklSU1RfUEFHRV9HUk9VUF9TVEFSVAkwCiAjZGVmaW5lIEZJUlNUX1BBR0VfR1JPVVBfRU5ECTB4MTAwMDAwCiAKLSNkZWZpbmUgU0VDT05EX1BBR0VfR1JPVVBfU1RBUlQJMHg0MDAwMDAwCi0jZGVmaW5lIFNFQ09ORF9QQUdFX0dST1VQX0VORAkweDY2QkMwMDAKKyNkZWZpbmUgU0VDT05EX1BBR0VfR1JPVVBfU1RBUlQJMHg2MDAwMDAwCisjZGVmaW5lIFNFQ09ORF9QQUdFX0dST1VQX0VORAkweDY4QkMwMDAKIAogI2RlZmluZSBUSElSRF9QQUdFX0dST1VQX1NUQVJUCTB4NzBFNDAwMAogI2RlZmluZSBUSElSRF9QQUdFX0dST1VQX0VORAkweDgwMDAwMDAKQEAgLTIwNSw2ICsyMDUsOCBAQAogCiAjZGVmaW5lIE1BWF9DTURfREVTQ1JJUFRPUlMJCTEwMjQKICNkZWZpbmUgTUFYX1JDVl9ERVNDUklQVE9SUwkJMTYzODQKKyNkZWZpbmUgTUFYX0NNRF9ERVNDUklQVE9SU19IT1NUCShNQVhfQ01EX0RFU0NSSVBUT1JTIC8gNCkKKyNkZWZpbmUgTUFYX1JDVl9ERVNDUklQVE9SU18xRwkJKE1BWF9SQ1ZfREVTQ1JJUFRPUlMgLyA0KQogI2RlZmluZSBNQVhfSlVNQk9fUkNWX0RFU0NSSVBUT1JTCTEwMjQKICNkZWZpbmUgTUFYX0xST19SQ1ZfREVTQ1JJUFRPUlMJCTY0CiAjZGVmaW5lIE1BWF9SQ1ZTVEFUVVNfREVTQ1JJUFRPUlMJTUFYX1JDVl9ERVNDUklQVE9SUwpAQCAtMjMwLDcgKzIzMiw5IEBACiAJKCgoaW5kZXgpICsgKGNvdW50KSkgJiAoKGxlbmd0aCkgLSAxKSkKIAogI2RlZmluZSBNUE9SVF9TSU5HTEVfRlVOQ1RJT05fTU9ERSAweDExMTEKKyNkZWZpbmUgTVBPUlRfTVVMVElfRlVOQ1RJT05fTU9ERSAweDIyMjIKIAorI2luY2x1ZGUgIm5ldHhlbl9uaWNfcGhhbl9yZWcuaCIKIGV4dGVybiB1bnNpZ25lZCBsb25nIGxvbmcgbmV0eGVuX2RtYV9tYXNrOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbGFzdF9zY2hlZHVsZV90aW1lOwogCkBAIC0zMDAsNiArMzA0LDggQEAKIAogI2RlZmluZSBuZXR4ZW5fc2V0X2NtZF9kZXNjX3BvcnQoY21kX2Rlc2MsIHZhcikJXAogCSgoY21kX2Rlc2MpLT5wb3J0X2N0eGlkIHw9ICgodmFyKSAmIDB4MEYpKQorI2RlZmluZSBuZXR4ZW5fc2V0X2NtZF9kZXNjX2N0eGlkKGNtZF9kZXNjLCB2YXIpCVwKKwkoKGNtZF9kZXNjKS0+cG9ydF9jdHhpZCB8PSAoKHZhcikgJiAweEYwKSkKIAogI2RlZmluZSBuZXR4ZW5fc2V0X2NtZF9kZXNjX2ZsYWdzKGNtZF9kZXNjLCB2YWwpCVwKIAkoKGNtZF9kZXNjKS0+ZmxhZ3Nfb3Bjb2RlICY9IH5jcHVfdG9fbGUxNigweDdmKSwgXApAQCAtNDQyLDcgKzQ0OCw3IEBACiAJLyogQml0IHBhdHRlcm46IDAtNiBscm9fY291bnQgaW5kaWNhdGVzIGZyYWcgc2VxdWVuY2UsCiAJICAgNyBsYXN0X2ZyYWcgaW5kaWNhdGVzIGxhc3QgZnJhZyAqLwogCXU4IGxybzsKLX0gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoOCkpKTsKK30gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoMTYpKSk7CiAKIGVudW0gewogCU5FVFhFTl9SQ1ZfUEVHXzAgPSAwLApAQCAtNzAzLDEwICs3MDksOCBAQAogI2Vsc2UKICNkZWZpbmUgRFBSSU5USyhrbGV2ZWwsIGZtdCwgYXJncy4uLikJZG8geyBcCiAJcHJpbnRrKEtFUk5fIyNrbGV2ZWwgUEZYICIlczogJXM6ICIgZm10LCBfX0ZVTkNUSU9OX18sXAotCQkoYWRhcHRlciAhPSBOVUxMICYmIFwKLQkJYWRhcHRlci0+cG9ydFswXSAhPSBOVUxMICYmIFwKLQkJYWRhcHRlci0+cG9ydFswXS0+bmV0ZGV2ICE9IE5VTEwpID8gXAotCQlhZGFwdGVyLT5wb3J0WzBdLT5uZXRkZXYtPm5hbWUgOiBOVUxMLCBcCisJCShhZGFwdGVyICE9IE5VTEwgJiYgYWRhcHRlci0+bmV0ZGV2ICE9IE5VTEwpID8gXAorCQlhZGFwdGVyLT5uZXRkZXYtPm5hbWUgOiBOVUxMLCBcCiAJCSMjIGFyZ3MpOyB9IHdoaWxlKDApCiAjZW5kaWYKIApAQCAtNzIyLDYgKzcyNiwxOCBAQAogCXUzMiBsZW5ndGg7CiB9OwogCisjZGVmaW5lIF9uZXR4ZW5fc2V0X2JpdHMoY29uZmlnX3dvcmQsIHN0YXJ0LCBiaXRzLCB2YWwpCXtcCisJdW5zaWduZWQgbG9uZyBsb25nIF9fdG1hc2sgPSAoKCgxVUxMIDw8IChiaXRzKSkgLSAxKSA8PCAoc3RhcnQpKTtcCisJdW5zaWduZWQgbG9uZyBsb25nIF9fdHZhbHVlID0gKHZhbCk7ICAgIFwKKwkoY29uZmlnX3dvcmQpICY9IH5fX3RtYXNrOyAgICAgIFwKKwkoY29uZmlnX3dvcmQpIHw9ICgoKF9fdHZhbHVlKSA8PCAoc3RhcnQpKSAmIF9fdG1hc2spOyBcCit9CisJCisjZGVmaW5lIF9uZXR4ZW5fY2xlYXJfYml0cyhjb25maWdfd29yZCwgc3RhcnQsIGJpdHMpIHtcCisJdW5zaWduZWQgbG9uZyBsb25nIF9fdG1hc2sgPSAoKCgxVUxMIDw8IChiaXRzKSkgLSAxKSA8PCAoc3RhcnQpKTsgIFwKKwkoY29uZmlnX3dvcmQpICY9IH5fX3RtYXNrOyBcCit9CQkKKwogLyogICAgRm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgc3RhdGUgb2YgdGhlIGJ1ZmZlcnMgICAgKi8KICNkZWZpbmUJTkVUWEVOX0JVRkZFUl9GUkVFCTAKICNkZWZpbmUJTkVUWEVOX0JVRkZFUl9CVVNZCTEKQEAgLTc2Niw2ICs3ODIsOCBAQAogCXZvaWQgX19pb21lbSAqcGNpX2Jhc2UwOwogCXZvaWQgX19pb21lbSAqcGNpX2Jhc2UxOwogCXZvaWQgX19pb21lbSAqcGNpX2Jhc2UyOworCXVuc2lnbmVkIGxvbmcgZmlyc3RfcGFnZV9ncm91cF9lbmQ7CisJdW5zaWduZWQgbG9uZyBmaXJzdF9wYWdlX2dyb3VwX3N0YXJ0OwogCXZvaWQgX19pb21lbSAqZGJfYmFzZTsKIAl1bnNpZ25lZCBsb25nIGRiX2xlbjsKIApAQCAtNzgwLDYgKzc5OCw3IEBACiAJc3RydWN0IHBjaV9kZXYgKmNtZF9kZXNjX3BkZXY7CiAJZG1hX2FkZHJfdCBjbWRfZGVzY19waHlzX2FkZHI7CiAJc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyOworCWludCBwY2lfZnVuYzsKIH07CiAKICNkZWZpbmUgUkNWX1JJTkdfTFJPCVJDVl9ERVNDX0xSTwpAQCAtNzg4LDE3ICs4MDcsMjcgQEAKICNkZWZpbmUgRVRIRVJORVRfRkNTX1NJWkUJCTQKIAogc3RydWN0IG5ldHhlbl9hZGFwdGVyX3N0YXRzIHsKLQl1NjQgaW50czsKLQl1NjQgaG9zdGludHM7Ci0JdTY0IG90aGVyaW50czsKLQl1NjQgcHJvY2Vzc19yY3Y7Ci0JdTY0IHByb2Nlc3NfeG1pdDsKLQl1NjQgbm94bWl0ZG9uZTsKLQl1NjQgeG1pdGNzdW1tZWQ7Ci0JdTY0IHBvc3RfY2FsbGVkOwotCXU2NCBwb3N0ZWQ7Ci0JdTY0IGxhc3Rwb3N0ZWQ7Ci0JdTY0IGdvb2Rza2Jwb3N0czsKKwl1NjQgIHJjdmRiYWRza2I7CisJdTY0ICB4bWl0Y2FsbGVkOworCXU2NCAgeG1pdGVkZnJhbWVzOworCXU2NCAgeG1pdGZpbmlzaGVkOworCXU2NCAgYmFkc2tibGVuOworCXU2NCAgbm9jbWRkZXNjcmlwdG9yOworCXU2NCAgcG9sbGVkOworCXU2NCAgdXBoYXBweTsKKwl1NjQgIHVwZHJvcHBlZDsKKwl1NjQgIHVwbGNvbmc7CisJdTY0ICB1cGhjb25nOworCXU2NCAgdXBtY29uZzsKKwl1NjQgIHVwZHVubm87CisJdTY0ICBza2JmcmVlZDsKKwl1NjQgIHR4ZHJvcHBlZDsKKwl1NjQgIHR4bnVsbHNrYjsKKwl1NjQgIGNzdW1tZWQ7CisJdTY0ICBub19yY3Y7CisJdTY0ICByeGJ5dGVzOworCXU2NCAgdHhieXRlczsKKwl1NjQgIGludHM7CiB9OwogCiAvKgpAQCAtODQ2LDEzICs4NzUsMjAgQEAKIAogc3RydWN0IG5ldHhlbl9hZGFwdGVyIHsKIAlzdHJ1Y3QgbmV0eGVuX2hhcmR3YXJlX2NvbnRleHQgYWh3OwotCWludCBwb3J0X2NvdW50OwkJLyogTnVtYmVyIG9mIGNvbmZpZ3VyZWQgcG9ydHMgICovCi0JaW50IGFjdGl2ZV9wb3J0czsJLyogTnVtYmVyIG9mIG9wZW4gcG9ydHMgKi8KLQlzdHJ1Y3QgbmV0eGVuX3BvcnQgKnBvcnRbTkVUWEVOX01BWF9QT1JUU107CS8qIHB0ciB0byBlYWNoIHBvcnQgICovCisJCisJc3RydWN0IG5ldHhlbl9hZGFwdGVyICptYXN0ZXI7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBuZXRfc3RhdHM7CisJdW5zaWduZWQgY2hhciBtYWNfYWRkcltFVEhfQUxFTl07CisJaW50IG10dTsKKwlpbnQgcG9ydG51bTsKKwogCXNwaW5sb2NrX3QgdHhfbG9jazsKIAlzcGlubG9ja190IGxvY2s7CiAJc3RydWN0IHdvcmtfc3RydWN0IHdhdGNoZG9nX3Rhc2s7CiAJc3RydWN0IHRpbWVyX2xpc3Qgd2F0Y2hkb2dfdGltZXI7CisJc3RydWN0IHdvcmtfc3RydWN0ICB0eF90aW1lb3V0X3Rhc2s7CiAKIAl1MzIgY3Vycl93aW5kb3c7CiAKQEAgLTg3NSw2ICs5MTEsMTUgQEAKIAl1MzIgdGVtcDsKIAogCXN0cnVjdCBuZXR4ZW5fYWRhcHRlcl9zdGF0cyBzdGF0czsKKwkKKwl1MTYgcG9ydG5vOworCXUxNiBsaW5rX3NwZWVkOworCXUxNiBsaW5rX2R1cGxleDsKKwl1MTYgc3RhdGU7CisJdTE2IGxpbmtfYXV0b25lZzsKKwlpbnQgcmNzdW07CisJaW50IHN0YXR1czsKKwlzcGlubG9ja190IHN0YXRzX2xvY2s7CiAKIAlzdHJ1Y3QgbmV0eGVuX2NtZF9idWZmZXIgKmNtZF9idWZfYXJyOwkvKiBDb21tYW5kIGJ1ZmZlcnMgZm9yIHhtaXQgKi8KIApAQCAtODkxLDY1ICs5MzYsMjMgQEAKIAlzdHJ1Y3QgbmV0eGVuX3JpbmdfY3R4ICpjdHhfZGVzYzsKIAlzdHJ1Y3QgcGNpX2RldiAqY3R4X2Rlc2NfcGRldjsKIAlkbWFfYWRkcl90IGN0eF9kZXNjX3BoeXNfYWRkcjsKLQlpbnQgKCplbmFibGVfcGh5X2ludGVycnVwdHMpIChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKiwgaW50KTsKLQlpbnQgKCpkaXNhYmxlX3BoeV9pbnRlcnJ1cHRzKSAoc3RydWN0IG5ldHhlbl9hZGFwdGVyICosIGludCk7CisJaW50ICgqZW5hYmxlX3BoeV9pbnRlcnJ1cHRzKSAoc3RydWN0IG5ldHhlbl9hZGFwdGVyICopOworCWludCAoKmRpc2FibGVfcGh5X2ludGVycnVwdHMpIChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKik7CiAJdm9pZCAoKmhhbmRsZV9waHlfaW50cikgKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqKTsKLQlpbnQgKCptYWNhZGRyX3NldCkgKHN0cnVjdCBuZXR4ZW5fcG9ydCAqLCBuZXR4ZW5fZXRoZXJuZXRfbWFjYWRkcl90KTsKLQlpbnQgKCpzZXRfbXR1KSAoc3RydWN0IG5ldHhlbl9wb3J0ICosIGludCk7Ci0JaW50ICgqc2V0X3Byb21pc2MpIChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKiwgaW50LAotCQkJICAgIG5ldHhlbl9uaXVfcHJvbV9tb2RlX3QpOwotCWludCAoKnVuc2V0X3Byb21pc2MpIChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKiwgaW50LAotCQkJICAgICAgbmV0eGVuX25pdV9wcm9tX21vZGVfdCk7Ci0JaW50ICgqcGh5X3JlYWQpIChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKiwgbG9uZyBwaHksIGxvbmcgcmVnLCB1MzIgKik7Ci0JaW50ICgqcGh5X3dyaXRlKSAoc3RydWN0IG5ldHhlbl9hZGFwdGVyICosIGxvbmcgcGh5LCBsb25nIHJlZywgdTMyIHZhbCk7CisJaW50ICgqbWFjYWRkcl9zZXQpIChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKiwgbmV0eGVuX2V0aGVybmV0X21hY2FkZHJfdCk7CisJaW50ICgqc2V0X210dSkgKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqLCBpbnQpOworCWludCAoKnNldF9wcm9taXNjKSAoc3RydWN0IG5ldHhlbl9hZGFwdGVyICosIG5ldHhlbl9uaXVfcHJvbV9tb2RlX3QpOworCWludCAoKnVuc2V0X3Byb21pc2MpIChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKiwgbmV0eGVuX25pdV9wcm9tX21vZGVfdCk7CisJaW50ICgqcGh5X3JlYWQpIChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKiwgbG9uZyByZWcsIHUzMiAqKTsKKwlpbnQgKCpwaHlfd3JpdGUpIChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKiwgbG9uZyByZWcsIHUzMiB2YWwpOwogCWludCAoKmluaXRfcG9ydCkgKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqLCBpbnQpOwogCXZvaWQgKCppbml0X25pdSkgKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqKTsKLQlpbnQgKCpzdG9wX3BvcnQpIChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKiwgaW50KTsKKwlpbnQgKCpzdG9wX3BvcnQpIChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKik7CiB9OwkJCQkvKiBuZXR4ZW5fYWRhcHRlciBzdHJ1Y3R1cmUgKi8KIAogLyogTWF4IG51bWJlciBvZiB4bWl0IHByb2R1Y2VyIHRocmVhZHMgdGhhdCBjYW4gcnVuIHNpbXVsdGFuZW91c2x5ICovCiAjZGVmaW5lCU1BWF9YTUlUX1BST0RVQ0VSUwkJMTYKIAotc3RydWN0IG5ldHhlbl9wb3J0X3N0YXRzIHsKLQl1NjQgcmN2ZGJhZHNrYjsKLQl1NjQgeG1pdGNhbGxlZDsKLQl1NjQgeG1pdGVkZnJhbWVzOwotCXU2NCB4bWl0ZmluaXNoZWQ7Ci0JdTY0IGJhZHNrYmxlbjsKLQl1NjQgbm9jbWRkZXNjcmlwdG9yOwotCXU2NCBwb2xsZWQ7Ci0JdTY0IHVwaGFwcHk7Ci0JdTY0IHVwZHJvcHBlZDsKLQl1NjQgdXBsY29uZzsKLQl1NjQgdXBoY29uZzsKLQl1NjQgdXBtY29uZzsKLQl1NjQgdXBkdW5ubzsKLQl1NjQgc2tiZnJlZWQ7Ci0JdTY0IHR4ZHJvcHBlZDsKLQl1NjQgdHhudWxsc2tiOwotCXU2NCBjc3VtbWVkOwotCXU2NCBub19yY3Y7Ci0JdTY0IHJ4Ynl0ZXM7Ci0JdTY0IHR4Ynl0ZXM7Ci19OwotCi1zdHJ1Y3QgbmV0eGVuX3BvcnQgewotCXN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlcjsKLQotCXUxNiBwb3J0bnVtOwkJLyogR0JFIHBvcnQgbnVtYmVyICovCi0JdTE2IGxpbmtfc3BlZWQ7Ci0JdTE2IGxpbmtfZHVwbGV4OwotCXUxNiBsaW5rX2F1dG9uZWc7Ci0KLQlpbnQgZmxhZ3M7Ci0KLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OwotCXN0cnVjdCBwY2lfZGV2ICpwZGV2OwotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIG5ldF9zdGF0czsKLQlzdHJ1Y3QgbmV0eGVuX3BvcnRfc3RhdHMgc3RhdHM7Ci0Jc3RydWN0IHdvcmtfc3RydWN0IHR4X3RpbWVvdXRfdGFzazsKLX07Ci0KICNkZWZpbmUgUENJX09GRlNFVF9GSVJTVF9SQU5HRShhZGFwdGVyLCBvZmYpICAgIFwKIAkoKGFkYXB0ZXIpLT5haHcucGNpX2Jhc2UwICsgKG9mZikpCiAjZGVmaW5lIFBDSV9PRkZTRVRfU0VDT05EX1JBTkdFKGFkYXB0ZXIsIG9mZikgICBcCkBAIC05ODcsMzIgKzk5MCwyNiBAQAogCXJldHVybiBOVUxMOwogfQogCi1pbnQgbmV0eGVuX25pdV94Z2JlX2VuYWJsZV9waHlfaW50ZXJydXB0cyhzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsCi0JCQkJCSAgaW50IHBvcnQpOwotaW50IG5ldHhlbl9uaXVfZ2JlX2VuYWJsZV9waHlfaW50ZXJydXB0cyhzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsCi0JCQkJCSBpbnQgcG9ydCk7Ci1pbnQgbmV0eGVuX25pdV94Z2JlX2Rpc2FibGVfcGh5X2ludGVycnVwdHMoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLAotCQkJCQkgICBpbnQgcG9ydCk7Ci1pbnQgbmV0eGVuX25pdV9nYmVfZGlzYWJsZV9waHlfaW50ZXJydXB0cyhzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsCi0JCQkJCSAgaW50IHBvcnQpOwotaW50IG5ldHhlbl9uaXVfeGdiZV9jbGVhcl9waHlfaW50ZXJydXB0cyhzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsCi0JCQkJCSBpbnQgcG9ydCk7Ci1pbnQgbmV0eGVuX25pdV9nYmVfY2xlYXJfcGh5X2ludGVycnVwdHMoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLAotCQkJCQlpbnQgcG9ydCk7CitpbnQgbmV0eGVuX25pdV94Z2JlX2VuYWJsZV9waHlfaW50ZXJydXB0cyhzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIpOworaW50IG5ldHhlbl9uaXVfZ2JlX2VuYWJsZV9waHlfaW50ZXJydXB0cyhzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIpOworaW50IG5ldHhlbl9uaXVfeGdiZV9kaXNhYmxlX3BoeV9pbnRlcnJ1cHRzKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlcik7CitpbnQgbmV0eGVuX25pdV9nYmVfZGlzYWJsZV9waHlfaW50ZXJydXB0cyhzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIpOworaW50IG5ldHhlbl9uaXVfeGdiZV9jbGVhcl9waHlfaW50ZXJydXB0cyhzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIpOworaW50IG5ldHhlbl9uaXVfZ2JlX2NsZWFyX3BoeV9pbnRlcnJ1cHRzKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlcik7CiB2b2lkIG5ldHhlbl9uaWNfeGdiZV9oYW5kbGVfcGh5X2ludHIoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyKTsKIHZvaWQgbmV0eGVuX25pY19nYmVfaGFuZGxlX3BoeV9pbnRyKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlcik7CiB2b2lkIG5ldHhlbl9uaXVfZ2JlX3NldF9taWlfbW9kZShzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBwb3J0LAogCQkJCSBsb25nIGVuYWJsZSk7CiB2b2lkIG5ldHhlbl9uaXVfZ2JlX3NldF9nbWlpX21vZGUoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLCBpbnQgcG9ydCwKIAkJCQkgIGxvbmcgZW5hYmxlKTsKLWludCBuZXR4ZW5fbml1X2diZV9waHlfcmVhZChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsIGxvbmcgcGh5LCBsb25nIHJlZywKK2ludCBuZXR4ZW5fbml1X2diZV9waHlfcmVhZChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsIGxvbmcgcmVnLAogCQkJICAgIF9fdTMyICogcmVhZHZhbCk7Ci1pbnQgbmV0eGVuX25pdV9nYmVfcGh5X3dyaXRlKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwgbG9uZyBwaHksCitpbnQgbmV0eGVuX25pdV9nYmVfcGh5X3dyaXRlKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwKIAkJCSAgICAgbG9uZyByZWcsIF9fdTMyIHZhbCk7CiAKIC8qIEZ1bmN0aW9ucyBhdmFpbGFibGUgZnJvbSBuZXR4ZW5fbmljX2h3LmMgKi8KLWludCBuZXR4ZW5fbmljX3NldF9tdHVfeGdiKHN0cnVjdCBuZXR4ZW5fcG9ydCAqcG9ydCwgaW50IG5ld19tdHUpOwotaW50IG5ldHhlbl9uaWNfc2V0X210dV9nYihzdHJ1Y3QgbmV0eGVuX3BvcnQgKnBvcnQsIGludCBuZXdfbXR1KTsKK2ludCBuZXR4ZW5fbmljX3NldF9tdHVfeGdiKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwgaW50IG5ld19tdHUpOworaW50IG5ldHhlbl9uaWNfc2V0X210dV9nYihzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBuZXdfbXR1KTsKIHZvaWQgbmV0eGVuX25pY19pbml0X25pdV9nYihzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIpOwogdm9pZCBuZXR4ZW5fbmljX3BjaV9jaGFuZ2VfY3Jid2luZG93KHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwgdTMyIHduZHcpOwogdm9pZCBuZXR4ZW5fbmljX3JlZ193cml0ZShzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsIHU2NCBvZmYsIHUzMiB2YWwpOwpAQCAtMTAyNyw2ICsxMDI0LDcgQEAKIAkJCSAgIGludCBsZW4pOwogdm9pZCBuZXR4ZW5fY3JiX3dyaXRlbGl0X2FkYXB0ZXIoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLAogCQkJCSB1bnNpZ25lZCBsb25nIG9mZiwgaW50IGRhdGEpOworaW50IG5ldHhlbl9uaWNfZXJhc2VfcHhlKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlcik7CiAKIC8qIEZ1bmN0aW9ucyBmcm9tIG5ldHhlbl9uaWNfaW5pdC5jICovCiB2b2lkIG5ldHhlbl9mcmVlX2FkYXB0ZXJfb2ZmbG9hZChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIpOwpAQCAtMTA1MSwxMSArMTA0OSw4IEBACiAKIC8qIEZ1bmN0aW9ucyBmcm9tIG5ldHhlbl9uaWNfaXNyLmMgKi8KIHZvaWQgbmV0eGVuX25pY19pc3Jfb3RoZXIoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyKTsKLXZvaWQgbmV0eGVuX2luZGljYXRlX2xpbmtfc3RhdHVzKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwgdTMyIHBvcnQsCi0JCQkJIHUzMiBsaW5rKTsKLXZvaWQgbmV0eGVuX2hhbmRsZV9wb3J0X2ludChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBwb3J0LAotCQkJICAgIHUzMiBlbmFibGUpOwotdm9pZCBuZXR4ZW5fbmljX3N0b3BfYWxsX3BvcnRzKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlcik7Cit2b2lkIG5ldHhlbl9pbmRpY2F0ZV9saW5rX3N0YXR1cyhzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBsaW5rKTsKK3ZvaWQgbmV0eGVuX2hhbmRsZV9wb3J0X2ludChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBlbmFibGUpOwogdm9pZCBuZXR4ZW5faW5pdGlhbGl6ZV9hZGFwdGVyX3N3KHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlcik7CiB2b2lkIG5ldHhlbl9pbml0aWFsaXplX2FkYXB0ZXJfaHcoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyKTsKIHZvaWQgKm5ldHhlbl9hbGxvYyhzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc2l6ZV90IHN6LCBkbWFfYWRkcl90ICogcHRyLApAQCAtMTExMCw2ICsxMTA1LDcgQEAKIAogCWlmICghKGFkYXB0ZXItPmZsYWdzICYgTkVUWEVOX05JQ19NU0lfRU5BQkxFRCkpIHsKIAkJbWFzayA9IDB4YmZmOworCQl3cml0ZWwoMFgwLCBORVRYRU5fQ1JCX05PUk1BTElaRShhZGFwdGVyLCBDUkJfSU5UX1ZFQ1RPUikpOwogCQl3cml0ZWwobWFzaywgUENJX09GRlNFVF9TRUNPTkRfUkFOR0UoYWRhcHRlciwKIAkJCQkJCSAgICAgSVNSX0lOVF9UQVJHRVRfTUFTSykpOwogCX0KQEAgLTExNzQsNCArMTE3MCw1IEBACiAKIGV4dGVybiBzdHJ1Y3QgZXRodG9vbF9vcHMgbmV0eGVuX25pY19ldGh0b29sX29wczsKIAorZXh0ZXJuIGludCBwaHlzaWNhbF9wb3J0W107CS8qIHBoeXNpY2FsIHBvcnQgIyBmcm9tIHZpcnR1YWwgcG9ydC4qLwogI2VuZGlmCQkJCS8qIF9fTkVUWEVOX05JQ19IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWNfZXRodG9vbC5jIGIvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWNfZXRodG9vbC5jCmluZGV4IGVlMWI1YTIuLjE2ZmFiYjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L25ldHhlbi9uZXR4ZW5fbmljX2V0aHRvb2wuYworKysgYi9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pY19ldGh0b29sLmMKQEAgLTQwLDggKzQwLDggQEAKICNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CiAjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogCi0jaW5jbHVkZSAibmV0eGVuX25pY19ody5oIgogI2luY2x1ZGUgIm5ldHhlbl9uaWMuaCIKKyNpbmNsdWRlICJuZXR4ZW5fbmljX2h3LmgiCiAjaW5jbHVkZSAibmV0eGVuX25pY19waGFuX3JlZy5oIgogCiBzdHJ1Y3QgbmV0eGVuX25pY19zdGF0cyB7CkBAIC01MCw4ICs1MCw4IEBACiAJaW50IHN0YXRfb2Zmc2V0OwogfTsKIAotI2RlZmluZSBORVRYRU5fTklDX1NUQVQobSkgc2l6ZW9mKCgoc3RydWN0IG5ldHhlbl9wb3J0ICopMCktPm0pLCBcCi0JCQlvZmZzZXRvZihzdHJ1Y3QgbmV0eGVuX3BvcnQsIG0pCisjZGVmaW5lIE5FVFhFTl9OSUNfU1RBVChtKSBzaXplb2YoKChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKikwKS0+bSksIFwKKwkJCW9mZnNldG9mKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciwgbSkKIAogI2RlZmluZSBORVRYRU5fTklDX1BPUlRfV0lORE9XIDB4MTAwMDAKICNkZWZpbmUgTkVUWEVOX05JQ19JTlZBTElEX0RBVEEgMHhERUFEQkVFRgpAQCAtMTAwLDggKzEwMCw3IEBACiBzdGF0aWMgdm9pZAogbmV0eGVuX25pY19nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICpkcnZpbmZvKQogewotCXN0cnVjdCBuZXR4ZW5fcG9ydCAqcG9ydCA9IG5ldGRldl9wcml2KGRldik7Ci0Jc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyID0gcG9ydC0+YWRhcHRlcjsKKwlzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihkZXYpOwogCXUzMiBmd19tYWpvciA9IDA7CiAJdTMyIGZ3X21pbm9yID0gMDsKIAl1MzIgZndfYnVpbGQgPSAwOwpAQCAtMTE1LDcgKzExNCw3IEBACiAJZndfYnVpbGQgPSByZWFkbChORVRYRU5fQ1JCX05PUk1BTElaRShhZGFwdGVyLCBORVRYRU5fRldfVkVSU0lPTl9TVUIpKTsKIAlzcHJpbnRmKGRydmluZm8tPmZ3X3ZlcnNpb24sICIlZC4lZC4lZCIsIGZ3X21ham9yLCBmd19taW5vciwgZndfYnVpbGQpOwogCi0Jc3RybmNweShkcnZpbmZvLT5idXNfaW5mbywgcGNpX25hbWUocG9ydC0+cGRldiksIDMyKTsKKwlzdHJuY3B5KGRydmluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShhZGFwdGVyLT5wZGV2KSwgMzIpOwogCWRydmluZm8tPm5fc3RhdHMgPSBORVRYRU5fTklDX1NUQVRTX0xFTjsKIAlkcnZpbmZvLT50ZXN0aW5mb19sZW4gPSBORVRYRU5fTklDX1RFU1RfTEVOOwogCWRydmluZm8tPnJlZ2R1bXBfbGVuID0gTkVUWEVOX05JQ19SRUdTX0xFTjsKQEAgLTEyNSw4ICsxMjQsNyBAQAogc3RhdGljIGludAogbmV0eGVuX25pY19nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICplY21kKQogewotCXN0cnVjdCBuZXR4ZW5fcG9ydCAqcG9ydCA9IG5ldGRldl9wcml2KGRldik7Ci0Jc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyID0gcG9ydC0+YWRhcHRlcjsKKwlzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBuZXR4ZW5fYm9hcmRfaW5mbyAqYm9hcmRpbmZvID0gJmFkYXB0ZXItPmFody5ib2FyZGNmZzsKIAogCS8qIHJlYWQgd2hpY2ggbW9kZSAqLwpAQCAtMTQ2LDggKzE0NCw4IEBACiAJCWVjbWQtPnBvcnQgPSBQT1JUX1RQOwogCiAJCWlmIChuZXRpZl9ydW5uaW5nKGRldikpIHsKLQkJCWVjbWQtPnNwZWVkID0gcG9ydC0+bGlua19zcGVlZDsKLQkJCWVjbWQtPmR1cGxleCA9IHBvcnQtPmxpbmtfZHVwbGV4OworCQkJZWNtZC0+c3BlZWQgPSBhZGFwdGVyLT5saW5rX3NwZWVkOworCQkJZWNtZC0+ZHVwbGV4ID0gYWRhcHRlci0+bGlua19kdXBsZXg7CiAJCX0gZWxzZQogCQkJcmV0dXJuIC1FSU87CS8qIGxpbmsgYWJzZW50ICovCiAJfSBlbHNlIGlmIChhZGFwdGVyLT5haHcuYm9hcmRfdHlwZSA9PSBORVRYRU5fTklDX1hHQkUpIHsKQEAgLTE2NSw3ICsxNjMsNyBAQAogCX0gZWxzZQogCQlyZXR1cm4gLUVJTzsKIAotCWVjbWQtPnBoeV9hZGRyZXNzID0gcG9ydC0+cG9ydG51bTsKKwllY21kLT5waHlfYWRkcmVzcyA9IGFkYXB0ZXItPnBvcnRudW07CiAJZWNtZC0+dHJhbnNjZWl2ZXIgPSBYQ1ZSX0VYVEVSTkFMOwogCiAJc3dpdGNoICgobmV0eGVuX2JyZHR5cGVfdCkgYm9hcmRpbmZvLT5ib2FyZF90eXBlKSB7CkBAIC0xNzksNyArMTc3LDcgQEAKIAkJZWNtZC0+cG9ydCA9IFBPUlRfVFA7CiAJCWVjbWQtPmF1dG9uZWcgPSAoYm9hcmRpbmZvLT5ib2FyZF90eXBlID09CiAJCQkJIE5FVFhFTl9CUkRUWVBFX1AyX1NCMzFfMTBHX0NYNCkgPwotCQkgICAgKEFVVE9ORUdfRElTQUJMRSkgOiAocG9ydC0+bGlua19hdXRvbmVnKTsKKwkJICAgIChBVVRPTkVHX0RJU0FCTEUpIDogKGFkYXB0ZXItPmxpbmtfYXV0b25lZyk7CiAJCWJyZWFrOwogCWNhc2UgTkVUWEVOX0JSRFRZUEVfUDJfU0IzMV8xMEdfSE1FWjoKIAljYXNlIE5FVFhFTl9CUkRUWVBFX1AyX1NCMzFfMTBHX0lNRVo6CkBAIC0yMDYsMjMgKzIwNCwyMiBAQAogc3RhdGljIGludAogbmV0eGVuX25pY19zZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICplY21kKQogewotCXN0cnVjdCBuZXR4ZW5fcG9ydCAqcG9ydCA9IG5ldGRldl9wcml2KGRldik7Ci0Jc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyID0gcG9ydC0+YWRhcHRlcjsKKwlzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihkZXYpOwogCV9fdTMyIHN0YXR1czsKIAogCS8qIHJlYWQgd2hpY2ggbW9kZSAqLwogCWlmIChhZGFwdGVyLT5haHcuYm9hcmRfdHlwZSA9PSBORVRYRU5fTklDX0dCRSkgewogCQkvKiBhdXRvbmVnb3RpYXRpb24gKi8KIAkJaWYgKGFkYXB0ZXItPnBoeV93cml0ZQotCQkgICAgJiYgYWRhcHRlci0+cGh5X3dyaXRlKGFkYXB0ZXIsIHBvcnQtPnBvcnRudW0sCisJCSAgICAmJiBhZGFwdGVyLT5waHlfd3JpdGUoYWRhcHRlciwKIAkJCQkJICBORVRYRU5fTklVX0dCX01JSV9NR01UX0FERFJfQVVUT05FRywKIAkJCQkJICBlY21kLT5hdXRvbmVnKSAhPSAwKQogCQkJcmV0dXJuIC1FSU87CiAJCWVsc2UKLQkJCXBvcnQtPmxpbmtfYXV0b25lZyA9IGVjbWQtPmF1dG9uZWc7CisJCQlhZGFwdGVyLT5saW5rX2F1dG9uZWcgPSBlY21kLT5hdXRvbmVnOwogCiAJCWlmIChhZGFwdGVyLT5waHlfcmVhZAotCQkgICAgJiYgYWRhcHRlci0+cGh5X3JlYWQoYWRhcHRlciwgcG9ydC0+cG9ydG51bSwKKwkJICAgICYmIGFkYXB0ZXItPnBoeV9yZWFkKGFkYXB0ZXIsCiAJCQkJCSBORVRYRU5fTklVX0dCX01JSV9NR01UX0FERFJfUEhZX1NUQVRVUywKIAkJCQkJICZzdGF0dXMpICE9IDApCiAJCQlyZXR1cm4gLUVJTzsKQEAgLTI0NSwxMyArMjQyLDEzIEBACiAJCWlmIChlY21kLT5kdXBsZXggPT0gRFVQTEVYX0ZVTEwpCiAJCQluZXR4ZW5fc2V0X3BoeV9kdXBsZXgoc3RhdHVzKTsKIAkJaWYgKGFkYXB0ZXItPnBoeV93cml0ZQotCQkgICAgJiYgYWRhcHRlci0+cGh5X3dyaXRlKGFkYXB0ZXIsIHBvcnQtPnBvcnRudW0sCisJCSAgICAmJiBhZGFwdGVyLT5waHlfd3JpdGUoYWRhcHRlciwKIAkJCQkJICBORVRYRU5fTklVX0dCX01JSV9NR01UX0FERFJfUEhZX1NUQVRVUywKIAkJCQkJICAqKChpbnQgKikmc3RhdHVzKSkgIT0gMCkKIAkJCXJldHVybiAtRUlPOwogCQllbHNlIHsKLQkJCXBvcnQtPmxpbmtfc3BlZWQgPSBlY21kLT5zcGVlZDsKLQkJCXBvcnQtPmxpbmtfZHVwbGV4ID0gZWNtZC0+ZHVwbGV4OworCQkJYWRhcHRlci0+bGlua19zcGVlZCA9IGVjbWQtPnNwZWVkOworCQkJYWRhcHRlci0+bGlua19kdXBsZXggPSBlY21kLT5kdXBsZXg7CiAJCX0KIAl9IGVsc2UKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwpAQCAtMzYwLDE1ICszNTcsMTQgQEAKIHN0YXRpYyB2b2lkCiBuZXR4ZW5fbmljX2dldF9yZWdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX3JlZ3MgKnJlZ3MsIHZvaWQgKnApCiB7Ci0Jc3RydWN0IG5ldHhlbl9wb3J0ICpwb3J0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwb3J0LT5hZGFwdGVyOworCXN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KGRldik7CiAJX191MzIgbW9kZSwgKnJlZ3NfYnVmZiA9IHA7CiAJdm9pZCBfX2lvbWVtICphZGRyOwogCWludCBpLCB3aW5kb3c7CiAKIAltZW1zZXQocCwgMCwgTkVUWEVOX05JQ19SRUdTX0xFTik7CiAJcmVncy0+dmVyc2lvbiA9ICgxIDw8IDI0KSB8IChhZGFwdGVyLT5haHcucmV2aXNpb25faWQgPDwgMTYpIHwKLQkgICAgKHBvcnQtPnBkZXYpLT5kZXZpY2U7CisJICAgIChhZGFwdGVyLT5wZGV2KS0+ZGV2aWNlOwogCS8qIHdoaWNoIG1vZGUgKi8KIAlORVRYRU5fTklDX0xPQ0tFRF9SRUFEX1JFRyhORVRYRU5fTklVX01PREUsICZyZWdzX2J1ZmZbMF0pOwogCW1vZGUgPSByZWdzX2J1ZmZbMF07CkBAIC0zODMsNyArMzc5LDggQEAKIAkJZm9yIChpID0gMzsgbml1X3JlZ2lzdGVyc1ttb2RlXS5yZWdbaSAtIDNdICE9IC0xOyBpKyspIHsKIAkJCS8qIEdCOiBwb3J0IHNwZWNpZmljIHJlZ2lzdGVycyAqLwogCQkJaWYgKG1vZGUgPT0gMCAmJiBpID49IDE5KQotCQkJCXdpbmRvdyA9IHBvcnQtPnBvcnRudW0gKiBORVRYRU5fTklDX1BPUlRfV0lORE9XOworCQkJCXdpbmRvdyA9IHBoeXNpY2FsX3BvcnRbYWRhcHRlci0+cG9ydG51bV0gKgorCQkJCQlORVRYRU5fTklDX1BPUlRfV0lORE9XOwogCiAJCQlORVRYRU5fTklDX0xPQ0tFRF9SRUFEX1JFRyhuaXVfcmVnaXN0ZXJzW21vZGVdLgogCQkJCQkJICAgcmVnW2kgLSAzXSArIHdpbmRvdywKQEAgLTM5NSwxNSArMzkyLDE0IEBACiAKIHN0YXRpYyB1MzIgbmV0eGVuX25pY190ZXN0X2xpbmsoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgbmV0eGVuX3BvcnQgKnBvcnQgPSBuZXRkZXZfcHJpdihkZXYpOwotCXN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciA9IHBvcnQtPmFkYXB0ZXI7CisJc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlfX3UzMiBzdGF0dXM7CiAJaW50IHZhbDsKIAogCS8qIHJlYWQgd2hpY2ggbW9kZSAqLwogCWlmIChhZGFwdGVyLT5haHcuYm9hcmRfdHlwZSA9PSBORVRYRU5fTklDX0dCRSkgewogCQlpZiAoYWRhcHRlci0+cGh5X3JlYWQKLQkJICAgICYmIGFkYXB0ZXItPnBoeV9yZWFkKGFkYXB0ZXIsIHBvcnQtPnBvcnRudW0sCisJCSAgICAmJiBhZGFwdGVyLT5waHlfcmVhZChhZGFwdGVyLAogCQkJCQkgTkVUWEVOX05JVV9HQl9NSUlfTUdNVF9BRERSX1BIWV9TVEFUVVMsCiAJCQkJCSAmc3RhdHVzKSAhPSAwKQogCQkJcmV0dXJuIC1FSU87CkBAIC00MjIsMTUgKzQxOCwxNSBAQAogbmV0eGVuX25pY19nZXRfZWVwcm9tKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2VlcHJvbSAqZWVwcm9tLAogCQkgICAgICB1OCAqIGJ5dGVzKQogewotCXN0cnVjdCBuZXR4ZW5fcG9ydCAqcG9ydCA9IG5ldGRldl9wcml2KGRldik7Ci0Jc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyID0gcG9ydC0+YWRhcHRlcjsKKwlzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihkZXYpOwogCWludCBvZmZzZXQ7CiAJaW50IHJldDsKIAogCWlmIChlZXByb20tPmxlbiA9PSAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWVlcHJvbS0+bWFnaWMgPSAocG9ydC0+cGRldiktPnZlbmRvciB8ICgocG9ydC0+cGRldiktPmRldmljZSA8PCAxNik7CisJZWVwcm9tLT5tYWdpYyA9IChhZGFwdGVyLT5wZGV2KS0+dmVuZG9yIHwgCisJCQkoKGFkYXB0ZXItPnBkZXYpLT5kZXZpY2UgPDwgMTYpOwogCW9mZnNldCA9IGVlcHJvbS0+b2Zmc2V0OwogCiAJcmV0ID0gbmV0eGVuX3JvbV9mYXN0X3JlYWRfd29yZHMoYWRhcHRlciwgb2Zmc2V0LCBieXRlcywgCkBAIC00NDUsOCArNDQxLDcgQEAKIG5ldHhlbl9uaWNfc2V0X2VlcHJvbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9lZXByb20gKmVlcHJvbSwKIAkJCXU4ICogYnl0ZXMpCiB7Ci0Jc3RydWN0IG5ldHhlbl9wb3J0ICpwb3J0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwb3J0LT5hZGFwdGVyOworCXN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KGRldik7CiAJaW50IG9mZnNldCA9IGVlcHJvbS0+b2Zmc2V0OwogCXN0YXRpYyBpbnQgZmxhc2hfc3RhcnQ7CiAJc3RhdGljIGludCByZWFkeV90b19mbGFzaDsKQEAgLTUxNiw4ICs1MTEsNyBAQAogc3RhdGljIHZvaWQKIG5ldHhlbl9uaWNfZ2V0X3JpbmdwYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9yaW5ncGFyYW0gKnJpbmcpCiB7Ci0Jc3RydWN0IG5ldHhlbl9wb3J0ICpwb3J0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwb3J0LT5hZGFwdGVyOworCXN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KGRldik7CiAJaW50IGk7CiAKIAlyaW5nLT5yeF9wZW5kaW5nID0gMDsKQEAgLTU0MSwxOSArNTM1LDQ1IEBACiBuZXR4ZW5fbmljX2dldF9wYXVzZXBhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkgIHN0cnVjdCBldGh0b29sX3BhdXNlcGFyYW0gKnBhdXNlKQogewotCXN0cnVjdCBuZXR4ZW5fcG9ydCAqcG9ydCA9IG5ldGRldl9wcml2KGRldik7Ci0Jc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyID0gcG9ydC0+YWRhcHRlcjsKKwlzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihkZXYpOwogCV9fdTMyIHZhbDsKKwlpbnQgcG9ydCA9IHBoeXNpY2FsX3BvcnRbYWRhcHRlci0+cG9ydG51bV07CiAKIAlpZiAoYWRhcHRlci0+YWh3LmJvYXJkX3R5cGUgPT0gTkVUWEVOX05JQ19HQkUpIHsKKwkJaWYgKChwb3J0IDwgMCkgfHwgKHBvcnQgPiBORVRYRU5fTklVX01BWF9HQkVfUE9SVFMpKQorCQkJcmV0dXJuOwogCQkvKiBnZXQgZmxvdyBjb250cm9sIHNldHRpbmdzICovCi0JCW5ldHhlbl9uaWNfcmVhZF93MChhZGFwdGVyLAotCQkJCSAgIE5FVFhFTl9OSVVfR0JfTUFDX0NPTkZJR18wKHBvcnQtPnBvcnRudW0pLAotCQkJCSAgICZ2YWwpOworCQluZXR4ZW5fbmljX3JlYWRfdzAoYWRhcHRlcixORVRYRU5fTklVX0dCX01BQ19DT05GSUdfMChwb3J0KSwKKwkJCQkmdmFsKTsKIAkJcGF1c2UtPnJ4X3BhdXNlID0gbmV0eGVuX2diX2dldF9yeF9mbG93Y3RsKHZhbCk7Ci0JCXBhdXNlLT50eF9wYXVzZSA9IG5ldHhlbl9nYl9nZXRfdHhfZmxvd2N0bCh2YWwpOwotCQkvKiBnZXQgYXV0b25lZyBzZXR0aW5ncyAqLwotCQlwYXVzZS0+YXV0b25lZyA9IHBvcnQtPmxpbmtfYXV0b25lZzsKKwkJbmV0eGVuX25pY19yZWFkX3cwKGFkYXB0ZXIsIE5FVFhFTl9OSVVfR0JfUEFVU0VfQ1RMLCAmdmFsKTsKKwkJc3dpdGNoIChwb3J0KSB7CisJCQljYXNlIDA6CisJCQkJcGF1c2UtPnR4X3BhdXNlID0gIShuZXR4ZW5fZ2JfZ2V0X2diMF9tYXNrKHZhbCkpOworCQkJCWJyZWFrOworCQkJY2FzZSAxOgorCQkJCXBhdXNlLT50eF9wYXVzZSA9ICEobmV0eGVuX2diX2dldF9nYjFfbWFzayh2YWwpKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMjoKKwkJCQlwYXVzZS0+dHhfcGF1c2UgPSAhKG5ldHhlbl9nYl9nZXRfZ2IyX21hc2sodmFsKSk7CisJCQkJYnJlYWs7CisJCQljYXNlIDM6CisJCQlkZWZhdWx0OgorCQkJCXBhdXNlLT50eF9wYXVzZSA9ICEobmV0eGVuX2diX2dldF9nYjNfbWFzayh2YWwpKTsKKwkJCQlicmVhazsKKwkJfQorCX0gZWxzZSBpZiAoYWRhcHRlci0+YWh3LmJvYXJkX3R5cGUgPT0gTkVUWEVOX05JQ19YR0JFKSB7CisJCWlmICgocG9ydCA8IDApIHx8IChwb3J0ID4gTkVUWEVOX05JVV9NQVhfWEdfUE9SVFMpKQorCQkJcmV0dXJuOworCQlwYXVzZS0+cnhfcGF1c2UgPSAxOworCQluZXR4ZW5fbmljX3JlYWRfdzAoYWRhcHRlciwgTkVUWEVOX05JVV9YR19QQVVTRV9DVEwsICZ2YWwpOworCQlpZiAocG9ydCA9PSAwKQorCQkJcGF1c2UtPnR4X3BhdXNlID0gIShuZXR4ZW5feGdfZ2V0X3hnMF9tYXNrKHZhbCkpOworCQllbHNlCisJCQlwYXVzZS0+dHhfcGF1c2UgPSAhKG5ldHhlbl94Z19nZXRfeGcxX21hc2sodmFsKSk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSIiVzOiBVbmtub3duIGJvYXJkIHR5cGU6ICV4XG4iLCAKKwkJCQluZXR4ZW5fbmljX2RyaXZlcl9uYW1lLCBhZGFwdGVyLT5haHcuYm9hcmRfdHlwZSk7CiAJfQogfQogCkBAIC01NjEsNDIgKzU4MSw3NiBAQAogbmV0eGVuX25pY19zZXRfcGF1c2VwYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJICBzdHJ1Y3QgZXRodG9vbF9wYXVzZXBhcmFtICpwYXVzZSkKIHsKLQlzdHJ1Y3QgbmV0eGVuX3BvcnQgKnBvcnQgPSBuZXRkZXZfcHJpdihkZXYpOwotCXN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciA9IHBvcnQtPmFkYXB0ZXI7CisJc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlfX3UzMiB2YWw7Ci0JdW5zaWduZWQgaW50IGF1dG9uZWc7Ci0KKwlpbnQgcG9ydCA9IHBoeXNpY2FsX3BvcnRbYWRhcHRlci0+cG9ydG51bV07CiAJLyogcmVhZCBtb2RlICovCiAJaWYgKGFkYXB0ZXItPmFody5ib2FyZF90eXBlID09IE5FVFhFTl9OSUNfR0JFKSB7CisJCWlmICgocG9ydCA8IDApIHx8IChwb3J0ID4gTkVUWEVOX05JVV9NQVhfR0JFX1BPUlRTKSkKKwkJCXJldHVybiAtRUlPOwogCQkvKiBzZXQgZmxvdyBjb250cm9sICovCiAJCW5ldHhlbl9uaWNfcmVhZF93MChhZGFwdGVyLAotCQkJCSAgIE5FVFhFTl9OSVVfR0JfTUFDX0NPTkZJR18wKHBvcnQtPnBvcnRudW0pLAotCQkJCSAgICh1MzIgKikgJiB2YWwpOwotCQlpZiAocGF1c2UtPnR4X3BhdXNlKQotCQkJbmV0eGVuX2diX3R4X2Zsb3djdGwodmFsKTsKLQkJZWxzZQotCQkJbmV0eGVuX2diX3Vuc2V0X3R4X2Zsb3djdGwodmFsKTsKKwkJCQkJTkVUWEVOX05JVV9HQl9NQUNfQ09ORklHXzAocG9ydCksICZ2YWwpOworCQkKIAkJaWYgKHBhdXNlLT5yeF9wYXVzZSkKIAkJCW5ldHhlbl9nYl9yeF9mbG93Y3RsKHZhbCk7CiAJCWVsc2UKIAkJCW5ldHhlbl9nYl91bnNldF9yeF9mbG93Y3RsKHZhbCk7CiAKLQkJbmV0eGVuX25pY193cml0ZV93MChhZGFwdGVyLAotCQkJCSAgICBORVRYRU5fTklVX0dCX01BQ19DT05GSUdfMChwb3J0LT5wb3J0bnVtKSwKLQkJCQkgICAgKiZ2YWwpOworCQluZXR4ZW5fbmljX3dyaXRlX3cwKGFkYXB0ZXIsIE5FVFhFTl9OSVVfR0JfTUFDX0NPTkZJR18wKHBvcnQpLAorCQkJCXZhbCk7CiAJCS8qIHNldCBhdXRvbmVnICovCi0JCWF1dG9uZWcgPSBwYXVzZS0+YXV0b25lZzsKLQkJaWYgKGFkYXB0ZXItPnBoeV93cml0ZQotCQkgICAgJiYgYWRhcHRlci0+cGh5X3dyaXRlKGFkYXB0ZXIsIHBvcnQtPnBvcnRudW0sCi0JCQkJCSAgTkVUWEVOX05JVV9HQl9NSUlfTUdNVF9BRERSX0FVVE9ORUcsCi0JCQkJCSAgYXV0b25lZykgIT0gMCkKLQkJCXJldHVybiAtRUlPOwotCQllbHNlIHsKLQkJCXBvcnQtPmxpbmtfYXV0b25lZyA9IHBhdXNlLT5hdXRvbmVnOwotCQkJcmV0dXJuIDA7CisJCW5ldHhlbl9uaWNfcmVhZF93MChhZGFwdGVyLCBORVRYRU5fTklVX0dCX1BBVVNFX0NUTCwgJnZhbCk7CisJCXN3aXRjaCAocG9ydCkgeworCQkJY2FzZSAwOgorCQkJCWlmIChwYXVzZS0+dHhfcGF1c2UpCisJCQkJCW5ldHhlbl9nYl91bnNldF9nYjBfbWFzayh2YWwpOworCQkJCWVsc2UKKwkJCQkJbmV0eGVuX2diX3NldF9nYjBfbWFzayh2YWwpOworCQkJCWJyZWFrOworCQkJY2FzZSAxOgorCQkJCWlmIChwYXVzZS0+dHhfcGF1c2UpCisJCQkJCW5ldHhlbl9nYl91bnNldF9nYjFfbWFzayh2YWwpOworCQkJCWVsc2UKKwkJCQkJbmV0eGVuX2diX3NldF9nYjFfbWFzayh2YWwpOworCQkJCWJyZWFrOworCQkJY2FzZSAyOgorCQkJCWlmIChwYXVzZS0+dHhfcGF1c2UpCisJCQkJCW5ldHhlbl9nYl91bnNldF9nYjJfbWFzayh2YWwpOworCQkJCWVsc2UKKwkJCQkJbmV0eGVuX2diX3NldF9nYjJfbWFzayh2YWwpOworCQkJCWJyZWFrOworCQkJY2FzZSAzOgorCQkJZGVmYXVsdDoKKwkJCQlpZiAocGF1c2UtPnR4X3BhdXNlKQorCQkJCQluZXR4ZW5fZ2JfdW5zZXRfZ2IzX21hc2sodmFsKTsKKwkJCQllbHNlCisJCQkJCW5ldHhlbl9nYl9zZXRfZ2IzX21hc2sodmFsKTsKKwkJCQlicmVhazsKIAkJfQotCX0gZWxzZQotCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJCW5ldHhlbl9uaWNfd3JpdGVfdzAoYWRhcHRlciwgTkVUWEVOX05JVV9HQl9QQVVTRV9DVEwsIHZhbCk7CisJfSBlbHNlIGlmIChhZGFwdGVyLT5haHcuYm9hcmRfdHlwZSA9PSBORVRYRU5fTklDX1hHQkUpIHsKKwkJaWYgKChwb3J0IDwgMCkgfHwgKHBvcnQgPiBORVRYRU5fTklVX01BWF9YR19QT1JUUykpCisJCQlyZXR1cm4gLUVJTzsKKwkJbmV0eGVuX25pY19yZWFkX3cwKGFkYXB0ZXIsIE5FVFhFTl9OSVVfWEdfUEFVU0VfQ1RMLCAmdmFsKTsKKwkJaWYgKHBvcnQgPT0gMCkgeworCQkJaWYgKHBhdXNlLT50eF9wYXVzZSkKKwkJCQluZXR4ZW5feGdfdW5zZXRfeGcwX21hc2sodmFsKTsKKwkJCWVsc2UKKwkJCQluZXR4ZW5feGdfc2V0X3hnMF9tYXNrKHZhbCk7CisJCX0gZWxzZSB7CisJCQlpZiAocGF1c2UtPnR4X3BhdXNlKQorCQkJCW5ldHhlbl94Z191bnNldF94ZzFfbWFzayh2YWwpOworCQkJZWxzZQorCQkJCW5ldHhlbl94Z19zZXRfeGcxX21hc2sodmFsKTsKKwkJfQorCQluZXR4ZW5fbmljX3dyaXRlX3cwKGFkYXB0ZXIsIE5FVFhFTl9OSVVfWEdfUEFVU0VfQ1RMLCB2YWwpOwkJCQorCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IFVua25vd24gYm9hcmQgdHlwZTogJXhcbiIsCisJCQkJbmV0eGVuX25pY19kcml2ZXJfbmFtZSwgCisJCQkJYWRhcHRlci0+YWh3LmJvYXJkX3R5cGUpOworCX0KKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBuZXR4ZW5fbmljX3JlZ190ZXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC02MjcsMjMgKzY4MSwxMiBAQAogbmV0eGVuX25pY19kaWFnX3Rlc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfdGVzdCAqZXRoX3Rlc3QsCiAJCSAgICAgdTY0ICogZGF0YSkKIHsKLQlpZiAoZXRoX3Rlc3QtPmZsYWdzID09IEVUSF9URVNUX0ZMX09GRkxJTkUpIHsJLyogb2ZmbGluZSB0ZXN0cyAqLwotCQkvKiBsaW5rIHRlc3QgKi8KLQkJaWYgKChkYXRhWzFdID0gKHU2NCkgbmV0eGVuX25pY190ZXN0X2xpbmsoZGV2KSkpCi0JCQlldGhfdGVzdC0+ZmxhZ3MgfD0gRVRIX1RFU1RfRkxfRkFJTEVEOwotCi0JCS8qIHJlZ2lzdGVyIHRlc3RzICovCi0JCWlmICgoZGF0YVswXSA9IG5ldHhlbl9uaWNfcmVnX3Rlc3QoZGV2KSkpCi0JCQlldGhfdGVzdC0+ZmxhZ3MgfD0gRVRIX1RFU1RfRkxfRkFJTEVEOwotCX0gZWxzZSB7CQkvKiBvbmxpbmUgdGVzdHMgKi8KLQkJLyogcmVnaXN0ZXIgdGVzdHMgKi8KLQkJaWYoKGRhdGFbMF0gPSBuZXR4ZW5fbmljX3JlZ190ZXN0KGRldikpKQotCQkJZXRoX3Rlc3QtPmZsYWdzIHw9IEVUSF9URVNUX0ZMX0ZBSUxFRDsKLQotCQkvKiBsaW5rIHRlc3QgKi8KLQkJaWYgKChkYXRhWzFdID0gKHU2NCkgbmV0eGVuX25pY190ZXN0X2xpbmsoZGV2KSkpCi0JCQlldGhfdGVzdC0+ZmxhZ3MgfD0gRVRIX1RFU1RfRkxfRkFJTEVEOwotCX0KKwltZW1zZXQoZGF0YSwgMCwgc2l6ZW9mKHVpbnQ2NF90KSAqIE5FVFhFTl9OSUNfVEVTVF9MRU4pOworCWlmICgoZGF0YVswXSA9IG5ldHhlbl9uaWNfcmVnX3Rlc3QoZGV2KSkpCisJCWV0aF90ZXN0LT5mbGFncyB8PSBFVEhfVEVTVF9GTF9GQUlMRUQ7CisJLyogbGluayB0ZXN0ICovCisJaWYgKChkYXRhWzFdID0gKHU2NCkgbmV0eGVuX25pY190ZXN0X2xpbmsoZGV2KSkpCisJCWV0aF90ZXN0LT5mbGFncyB8PSBFVEhfVEVTVF9GTF9GQUlMRUQ7CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC02NzUsMTIgKzcxOCwxMyBAQAogbmV0eGVuX25pY19nZXRfZXRodG9vbF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJICAgICBzdHJ1Y3QgZXRodG9vbF9zdGF0cyAqc3RhdHMsIHU2NCAqIGRhdGEpCiB7Ci0Jc3RydWN0IG5ldHhlbl9wb3J0ICpwb3J0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihkZXYpOwogCWludCBpbmRleDsKIAogCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE5FVFhFTl9OSUNfU1RBVFNfTEVOOyBpbmRleCsrKSB7CiAJCWNoYXIgKnAgPQotCQkgICAgKGNoYXIgKilwb3J0ICsgbmV0eGVuX25pY19nc3RyaW5nc19zdGF0c1tpbmRleF0uc3RhdF9vZmZzZXQ7CisJCSAgICAoY2hhciAqKWFkYXB0ZXIgKworCQkgICAgbmV0eGVuX25pY19nc3RyaW5nc19zdGF0c1tpbmRleF0uc3RhdF9vZmZzZXQ7CiAJCWRhdGFbaW5kZXhdID0KIAkJICAgIChuZXR4ZW5fbmljX2dzdHJpbmdzX3N0YXRzW2luZGV4XS5zaXplb2Zfc3RhdCA9PQogCQkgICAgIHNpemVvZih1NjQpKSA/ICoodTY0ICopIHAgOiAqKHUzMiAqKSBwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWNfaGRyLmggYi9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pY19oZHIuaAppbmRleCBmZThiNjc1Li42MDhlMzdiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pY19oZHIuaAorKysgYi9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pY19oZHIuaApAQCAtNDY3LDYgKzQ2Nyw4IEBACiAjZGVmaW5lIE5FVFhFTl9QQ0lfT0NNMQkJKDB4MDUxMDAwMDBVTCkKICNkZWZpbmUgTkVUWEVOX1BDSV9PQ00xX01BWAkoMHgwNTFmZmZmZlVMKQogI2RlZmluZSBORVRYRU5fUENJX0NSQlNQQUNFCSgweDA2MDAwMDAwVUwpCisjZGVmaW5lIE5FVFhFTl9QQ0lfMTI4TUJfU0laRQkoMHgwODAwMDAwMFVMKQorI2RlZmluZSBORVRYRU5fUENJXzMyTUJfU0laRQkoMHgwMjAwMDAwMFVMKQogCiAjZGVmaW5lIE5FVFhFTl9DUkJfQ0FNCU5FVFhFTl9QQ0lfQ1JCX1dJTkRPVyhORVRYRU5fSFdfUFhfTUFQX0NSQl9DQU0pCiAKQEAgLTQ4NCw2ICs0ODYsNyBAQAogCS8qIDEwIHNlY29uZHMgYmVmb3JlIHdlIGdpdmUgdXAgKi8KICNkZWZpbmUJTkVUWEVOX05JVV9QSFlfV0FJVE1BWAkJNTAKICNkZWZpbmUJTkVUWEVOX05JVV9NQVhfR0JFX1BPUlRTCTQKKyNkZWZpbmUJTkVUWEVOX05JVV9NQVhfWEdfUE9SVFMJCTIKIAogI2RlZmluZQlORVRYRU5fTklVX01PREUJCQkoTkVUWEVOX0NSQl9OSVUgKyAweDAwMDAwKQogCkBAIC01MjcsNiArNTMwLDcgQEAKICNkZWZpbmUJTkVUWEVOX05JVV9YR19QQVVTRV9DVEwJCShORVRYRU5fQ1JCX05JVSArIDB4MDAwOTgpCiAjZGVmaW5lCU5FVFhFTl9OSVVfWEdfUEFVU0VfTEVWRUwJKE5FVFhFTl9DUkJfTklVICsgMHgwMDBkYykKICNkZWZpbmUJTkVUWEVOX05JVV9YR19TRUwJCShORVRYRU5fQ1JCX05JVSArIDB4MDAxMjgpCisjZGVmaW5lIE5FVFhFTl9OSVVfR0JfUEFVU0VfQ1RMCQkoTkVUWEVOX0NSQl9OSVUgKyAweDAwMzBjKQogCiAjZGVmaW5lIE5FVFhFTl9OSVVfRlVMTF9MRVZFTF9YRwkoTkVUWEVOX0NSQl9OSVUgKyAweDAwNDUwKQogCkBAIC02NDksMTEgKzY1MywxOSBAQAogI2RlZmluZSBQQ0lYX01TX1dJTkRPVwkJKDB4MTAyMDQpCiAjZGVmaW5lIFBDSVhfU05fV0lORE9XCQkoMHgxMDIwOCkKICNkZWZpbmUgUENJWF9DUkJfV0lORE9XCQkoMHgxMDIxMCkKKyNkZWZpbmUgUENJWF9DUkJfV0lORE9XX0YwCSgweDEwMjEwKQorI2RlZmluZSBQQ0lYX0NSQl9XSU5ET1dfRjEJKDB4MTAyMzApCisjZGVmaW5lIFBDSVhfQ1JCX1dJTkRPV19GMgkoMHgxMDI1MCkKKyNkZWZpbmUgUENJWF9DUkJfV0lORE9XX0YzCSgweDEwMjcwKQogCiAjZGVmaW5lIFBDSVhfVEFSR0VUX1NUQVRVUwkoMHgxMDExOCkKICNkZWZpbmUgUENJWF9UQVJHRVRfTUFTSwkoMHgxMDEyOCkKIAogI2RlZmluZSBQQ0lYX01TSV9GMAkJKDB4MTMwMDApCisjZGVmaW5lIFBDSVhfTVNJX0YxCQkoMHgxMzAwNCkKKyNkZWZpbmUgUENJWF9NU0lfRjIJCSgweDEzMDA4KQorI2RlZmluZSBQQ0lYX01TSV9GMwkJKDB4MTMwMGMpCisjZGVmaW5lIFBDSVhfTVNJX0YoaSkJCSgweDEzMDAwKygoaSkqNCkpCiAKICNkZWZpbmUgUENJWF9QU19NRU1fU1BBQ0UJKDB4OTAwMDApCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L25ldHhlbi9uZXR4ZW5fbmljX2h3LmMgYi9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pY19ody5jCmluZGV4IDY1Mzc1NzQuLmJhZmYxN2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L25ldHhlbi9uZXR4ZW5fbmljX2h3LmMKKysrIGIvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWNfaHcuYwpAQCAtMzMsOCArMzMsMjI1IEBACiAKICNpbmNsdWRlICJuZXR4ZW5fbmljLmgiCiAjaW5jbHVkZSAibmV0eGVuX25pY19ody5oIgorI2RlZmluZSBERUZJTkVfR0xPQkFMX1JFQ1ZfQ1JCCiAjaW5jbHVkZSAibmV0eGVuX25pY19waGFuX3JlZy5oIgogCisKKyNpbmNsdWRlIDxuZXQvaXAuaD4KKworc3RydWN0IG5ldHhlbl9yZWN2X2NyYiByZWN2X2NyYl9yZWdpc3RlcnNbXSA9IHsKKwkvKgorCSAqIEluc3RhbmNlIDAuCisJICovCisJeworCSAvKiByY3ZfZGVzY19jcmI6ICovCisJIHsKKwkgIHsKKwkgICAvKiBjcmJfcmN2X3Byb2R1Y2VyX29mZnNldDogKi8KKwkgICBORVRYRU5fTklDX1JFRygweDEwMCksCisJICAgLyogY3JiX3Jjdl9jb25zdW1lcl9vZmZzZXQ6ICovCisJICAgTkVUWEVOX05JQ19SRUcoMHgxMDQpLAorCSAgIC8qIGNyYl9nbG9hYmxyY3ZfcmluZzogKi8KKwkgICBORVRYRU5fTklDX1JFRygweDEwOCksCisJICAgLyogY3JiX3Jjdl9yaW5nX3NpemUgKi8KKwkgICBORVRYRU5fTklDX1JFRygweDEwYyksCisKKwkgICB9LAorCSAgLyogSnVtYm8gZnJhbWVzICovCisJICB7CisJICAgLyogY3JiX3Jjdl9wcm9kdWNlcl9vZmZzZXQ6ICovCisJICAgTkVUWEVOX05JQ19SRUcoMHgxMTApLAorCSAgIC8qIGNyYl9yY3ZfY29uc3VtZXJfb2Zmc2V0OiAqLworCSAgIE5FVFhFTl9OSUNfUkVHKDB4MTE0KSwKKwkgICAvKiBjcmJfZ2xvYWJscmN2X3Jpbmc6ICovCisJICAgTkVUWEVOX05JQ19SRUcoMHgxMTgpLAorCSAgIC8qIGNyYl9yY3ZfcmluZ19zaXplICovCisJICAgTkVUWEVOX05JQ19SRUcoMHgxMWMpLAorCSAgIH0sCisJICAvKiBMUk8gKi8KKwkgIHsKKwkgICAvKiBjcmJfcmN2X3Byb2R1Y2VyX29mZnNldDogKi8KKwkgICBORVRYRU5fTklDX1JFRygweDEyMCksCisJICAgLyogY3JiX3Jjdl9jb25zdW1lcl9vZmZzZXQ6ICovCisJICAgTkVUWEVOX05JQ19SRUcoMHgxMjQpLAorCSAgIC8qIGNyYl9nbG9hYmxyY3ZfcmluZzogKi8KKwkgICBORVRYRU5fTklDX1JFRygweDEyOCksCisJICAgLyogY3JiX3Jjdl9yaW5nX3NpemUgKi8KKwkgICBORVRYRU5fTklDX1JFRygweDEyYyksCisJICAgfQorCSAgfSwKKwkgLyogY3JiX3JjdnN0YXR1c19yaW5nOiAqLworCSBORVRYRU5fTklDX1JFRygweDEzMCksCisJIC8qIGNyYl9yY3Zfc3RhdHVzX3Byb2R1Y2VyOiAqLworCSBORVRYRU5fTklDX1JFRygweDEzNCksCisJIC8qIGNyYl9yY3Zfc3RhdHVzX2NvbnN1bWVyOiAqLworCSBORVRYRU5fTklDX1JFRygweDEzOCksCisJIC8qIGNyYl9yY3ZwZWdfc3RhdGU6ICovCisJIE5FVFhFTl9OSUNfUkVHKDB4MTNjKSwKKwkgLyogY3JiX3N0YXR1c19yaW5nX3NpemUgKi8KKwkgTkVUWEVOX05JQ19SRUcoMHgxNDApLAorCisJIH0sCisJLyoKKwkgKiBJbnN0YW5jZSAxLAorCSAqLworCXsKKwkgLyogcmN2X2Rlc2NfY3JiOiAqLworCSB7CisJICB7CisJICAgLyogY3JiX3Jjdl9wcm9kdWNlcl9vZmZzZXQ6ICovCisJICAgTkVUWEVOX05JQ19SRUcoMHgxNDQpLAorCSAgIC8qIGNyYl9yY3ZfY29uc3VtZXJfb2Zmc2V0OiAqLworCSAgIE5FVFhFTl9OSUNfUkVHKDB4MTQ4KSwKKwkgICAvKiBjcmJfZ2xvYmFscmN2X3Jpbmc6ICovCisJICAgTkVUWEVOX05JQ19SRUcoMHgxNGMpLAorCSAgIC8qIGNyYl9yY3ZfcmluZ19zaXplICovCisJICAgTkVUWEVOX05JQ19SRUcoMHgxNTApLAorCisJICAgfSwKKwkgIC8qIEp1bWJvIGZyYW1lcyAqLworCSAgeworCSAgIC8qIGNyYl9yY3ZfcHJvZHVjZXJfb2Zmc2V0OiAqLworCSAgIE5FVFhFTl9OSUNfUkVHKDB4MTU0KSwKKwkgICAvKiBjcmJfcmN2X2NvbnN1bWVyX29mZnNldDogKi8KKwkgICBORVRYRU5fTklDX1JFRygweDE1OCksCisJICAgLyogY3JiX2dsb2JhbHJjdl9yaW5nOiAqLworCSAgIE5FVFhFTl9OSUNfUkVHKDB4MTVjKSwKKwkgICAvKiBjcmJfcmN2X3Jpbmdfc2l6ZSAqLworCSAgIE5FVFhFTl9OSUNfUkVHKDB4MTYwKSwKKwkgICB9LAorCSAgLyogTFJPICovCisJICB7CisJICAgLyogY3JiX3Jjdl9wcm9kdWNlcl9vZmZzZXQ6ICovCisJICAgTkVUWEVOX05JQ19SRUcoMHgxNjQpLAorCSAgIC8qIGNyYl9yY3ZfY29uc3VtZXJfb2Zmc2V0OiAqLworCSAgIE5FVFhFTl9OSUNfUkVHKDB4MTY4KSwKKwkgICAvKiBjcmJfZ2xvYmFscmN2X3Jpbmc6ICovCisJICAgTkVUWEVOX05JQ19SRUcoMHgxNmMpLAorCSAgIC8qIGNyYl9yY3ZfcmluZ19zaXplICovCisJICAgTkVUWEVOX05JQ19SRUcoMHgxNzApLAorCSAgIH0KKworCSAgfSwKKwkgLyogY3JiX3JjdnN0YXR1c19yaW5nOiAqLworCSBORVRYRU5fTklDX1JFRygweDE3NCksCisJIC8qIGNyYl9yY3Zfc3RhdHVzX3Byb2R1Y2VyOiAqLworCSBORVRYRU5fTklDX1JFRygweDE3OCksCisJIC8qIGNyYl9yY3Zfc3RhdHVzX2NvbnN1bWVyOiAqLworCSBORVRYRU5fTklDX1JFRygweDE3YyksCisJIC8qIGNyYl9yY3ZwZWdfc3RhdGU6ICovCisJIE5FVFhFTl9OSUNfUkVHKDB4MTgwKSwKKwkgLyogY3JiX3N0YXR1c19yaW5nX3NpemUgKi8KKwkgTkVUWEVOX05JQ19SRUcoMHgxODQpLAorCSB9LAorCS8qCisJICogSW5zdGFuY2UgMiwKKwkgKi8KKwl7CisJICB7CisJICAgIHsKKwkgICAgLyogY3JiX3Jjdl9wcm9kdWNlcl9vZmZzZXQ6ICovCisJICAgIE5FVFhFTl9OSUNfUkVHKDB4MWQ4KSwKKwkgICAgLyogY3JiX3Jjdl9jb25zdW1lcl9vZmZzZXQ6ICovCisJICAgIE5FVFhFTl9OSUNfUkVHKDB4MWRjKSwKKwkgICAgLyogY3JiX2dsb2FibHJjdl9yaW5nOiAqLworCSAgICBORVRYRU5fTklDX1JFRygweDFmMCksCisJICAgIC8qIGNyYl9yY3ZfcmluZ19zaXplICovCisJICAgIE5FVFhFTl9OSUNfUkVHKDB4MWY0KSwKKwkgICAgfSwKKwkgICAgLyogSnVtYm8gZnJhbWVzICovCisJICAgIHsKKwkgICAgLyogY3JiX3Jjdl9wcm9kdWNlcl9vZmZzZXQ6ICovCQkgICAgCisJICAgIE5FVFhFTl9OSUNfUkVHKDB4MWY4KSwKKwkgICAgLyogY3JiX3Jjdl9jb25zdW1lcl9vZmZzZXQ6ICovCisJICAgIE5FVFhFTl9OSUNfUkVHKDB4MWZjKSwKKwkgICAgLyogY3JiX2dsb2FibHJjdl9yaW5nOiAqLworCSAgICBORVRYRU5fTklDX1JFRygweDIwMCksCisJICAgIC8qIGNyYl9yY3ZfcmluZ19zaXplICovCisJICAgIE5FVFhFTl9OSUNfUkVHKDB4MjA0KSwKKwkgICAgfSwKKwkgICAgLyogTFJPICovCisJICAgIHsKKwkgICAgLyogY3JiX3Jjdl9wcm9kdWNlcl9vZmZzZXQ6ICovCisJICAgIE5FVFhFTl9OSUNfUkVHKDB4MjA4KSwKKwkgICAgLyogY3JiX3Jjdl9jb25zdW1lcl9vZmZzZXQ6ICovCisJICAgIE5FVFhFTl9OSUNfUkVHKDB4MjBjKSwKKwkgICAgLyogY3JiX2dsb2FibHJjdl9yaW5nOiAqLworCSAgICBORVRYRU5fTklDX1JFRygweDIxMCksCisJICAgIC8qIGNyYl9yY3ZfcmluZ19zaXplICovCisJICAgIE5FVFhFTl9OSUNfUkVHKDB4MjE0KSwKKwkgICAgfQorCSAgfSwKKwkgIC8qIGNyYl9yY3ZzdGF0dXNfcmluZzogKi8KKwkgIE5FVFhFTl9OSUNfUkVHKDB4MjE4KSwKKwkgIC8qIGNyYl9yY3Zfc3RhdHVzX3Byb2R1Y2VyOiAqLworCSAgTkVUWEVOX05JQ19SRUcoMHgyMWMpLAorCSAgLyogY3JiX3Jjdl9zdGF0dXNfY29uc3VtZXI6ICovCisJICBORVRYRU5fTklDX1JFRygweDIyMCksCisJICAvKiBjcmJfcmN2cGVnX3N0YXRlOiAqLworCSAgTkVUWEVOX05JQ19SRUcoMHgyMjQpLAorCSAgLyogY3JiX3N0YXR1c19yaW5nX3NpemUgKi8KKwkgIE5FVFhFTl9OSUNfUkVHKDB4MjI4KSwKKwl9LAorCS8qCisJICogSW5zdGFuY2UgMywKKwkgKi8KKwl7CisJICB7CisJICAgIHsKKwkgICAgLyogY3JiX3Jjdl9wcm9kdWNlcl9vZmZzZXQ6ICovCisJICAgIE5FVFhFTl9OSUNfUkVHKDB4MjJjKSwKKwkgICAgLyogY3JiX3Jjdl9jb25zdW1lcl9vZmZzZXQ6ICovCisJICAgIE5FVFhFTl9OSUNfUkVHKDB4MjMwKSwKKwkgICAgLyogY3JiX2dsb2FibHJjdl9yaW5nOiAqLworCSAgICBORVRYRU5fTklDX1JFRygweDIzNCksCisJICAgIC8qIGNyYl9yY3ZfcmluZ19zaXplICovCisJICAgIE5FVFhFTl9OSUNfUkVHKDB4MjM4KSwKKwkgICAgfSwKKwkgICAgLyogSnVtYm8gZnJhbWVzICovCisJICAgIHsKKwkgICAgLyogY3JiX3Jjdl9wcm9kdWNlcl9vZmZzZXQ6ICovIAorCSAgICBORVRYRU5fTklDX1JFRygweDIzYyksCisJICAgIC8qIGNyYl9yY3ZfY29uc3VtZXJfb2Zmc2V0OiAqLworCSAgICBORVRYRU5fTklDX1JFRygweDI0MCksCisJICAgIC8qIGNyYl9nbG9hYmxyY3ZfcmluZzogKi8KKwkgICAgTkVUWEVOX05JQ19SRUcoMHgyNDQpLAorCSAgICAvKiBjcmJfcmN2X3Jpbmdfc2l6ZSAqLworCSAgICBORVRYRU5fTklDX1JFRygweDI0OCksCisJICAgIH0sCisJICAgIC8qIExSTyAqLworCSAgICB7CisJICAgIC8qIGNyYl9yY3ZfcHJvZHVjZXJfb2Zmc2V0OiAqLworCSAgICBORVRYRU5fTklDX1JFRygweDI0YyksCisJICAgIC8qIGNyYl9yY3ZfY29uc3VtZXJfb2Zmc2V0OiAqLworCSAgICBORVRYRU5fTklDX1JFRygweDI1MCksCisJICAgIC8qIGNyYl9nbG9hYmxyY3ZfcmluZzogKi8KKwkgICAgTkVUWEVOX05JQ19SRUcoMHgyNTQpLAorCSAgICAvKiBjcmJfcmN2X3Jpbmdfc2l6ZSAqLworCSAgICBORVRYRU5fTklDX1JFRygweDI1OCksCisJICAgIH0KKwkgIH0sCisJICAvKiBjcmJfcmN2c3RhdHVzX3Jpbmc6ICovCisJICBORVRYRU5fTklDX1JFRygweDI1YyksCisJICAvKiBjcmJfcmN2X3N0YXR1c19wcm9kdWNlcjogKi8KKwkgIE5FVFhFTl9OSUNfUkVHKDB4MjYwKSwKKwkgIC8qIGNyYl9yY3Zfc3RhdHVzX2NvbnN1bWVyOiAqLworCSAgTkVUWEVOX05JQ19SRUcoMHgyNjQpLAorCSAgLyogY3JiX3JjdnBlZ19zdGF0ZTogKi8KKwkgIE5FVFhFTl9OSUNfUkVHKDB4MjY4KSwKKwkgIC8qIGNyYl9zdGF0dXNfcmluZ19zaXplICovCisJICBORVRYRU5fTklDX1JFRygweDI2YyksCisJfSwKK307CisKK3U2NCBjdHhfYWRkcl9zaWdfcmVnc1tdWzNdID0geworCXtORVRYRU5fTklDX1JFRygweDE4OCksIE5FVFhFTl9OSUNfUkVHKDB4MThjKSwgTkVUWEVOX05JQ19SRUcoMHgxYzApfSwKKwl7TkVUWEVOX05JQ19SRUcoMHgxOTApLCBORVRYRU5fTklDX1JFRygweDE5NCksIE5FVFhFTl9OSUNfUkVHKDB4MWM0KX0sCisJe05FVFhFTl9OSUNfUkVHKDB4MTk4KSwgTkVUWEVOX05JQ19SRUcoMHgxOWMpLCBORVRYRU5fTklDX1JFRygweDFjOCl9LAorCXtORVRYRU5fTklDX1JFRygweDFhMCksIE5FVFhFTl9OSUNfUkVHKDB4MWE0KSwgTkVUWEVOX05JQ19SRUcoMHgxY2MpfQorfTsKKworCiAvKiAgUENJIFdpbmRvd2luZyBmb3IgRERSIHJlZ2lvbnMuICAqLwogCiAjZGVmaW5lIEFERFJfSU5fUkFOR0UoYWRkciwgbG93LCBoaWdoKQlcCkBAIC02OCw4ICsyODUsNyBAQAogCiBpbnQgbmV0eGVuX25pY19zZXRfbWFjKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHZvaWQgKnApCiB7Ci0Jc3RydWN0IG5ldHhlbl9wb3J0ICpwb3J0ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQlzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwb3J0LT5hZGFwdGVyOworCXN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJc3RydWN0IHNvY2thZGRyICphZGRyID0gcDsKIAogCWlmIChuZXRpZl9ydW5uaW5nKG5ldGRldikpCkBAIC04Miw3ICsyOTgsNyBAQAogCW1lbWNweShuZXRkZXYtPmRldl9hZGRyLCBhZGRyLT5zYV9kYXRhLCBuZXRkZXYtPmFkZHJfbGVuKTsKIAogCWlmIChhZGFwdGVyLT5tYWNhZGRyX3NldCkKLQkJYWRhcHRlci0+bWFjYWRkcl9zZXQocG9ydCwgYWRkci0+c2FfZGF0YSk7CisJCWFkYXB0ZXItPm1hY2FkZHJfc2V0KGFkYXB0ZXIsIGFkZHItPnNhX2RhdGEpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC05Miw1NiArMzA4LDE5IEBACiAgKi8KIHZvaWQgbmV0eGVuX25pY19zZXRfbXVsdGkoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKIHsKLQlzdHJ1Y3QgbmV0eGVuX3BvcnQgKnBvcnQgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCXN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciA9IHBvcnQtPmFkYXB0ZXI7CisJc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlzdHJ1Y3QgZGV2X21jX2xpc3QgKm1jX3B0cjsKLQlfX3UzMiBuZXR4ZW5fbWFjX2FkZHJfY250bF9kYXRhID0gMDsKIAogCW1jX3B0ciA9IG5ldGRldi0+bWNfbGlzdDsKIAlpZiAobmV0ZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CiAJCWlmIChhZGFwdGVyLT5zZXRfcHJvbWlzYykKIAkJCWFkYXB0ZXItPnNldF9wcm9taXNjKGFkYXB0ZXIsCi0JCQkJCSAgICAgcG9ydC0+cG9ydG51bSwKIAkJCQkJICAgICBORVRYRU5fTklVX1BST01JU0NfTU9ERSk7CiAJfSBlbHNlIHsKLQkJaWYgKGFkYXB0ZXItPnVuc2V0X3Byb21pc2MgJiYKLQkJICAgIGFkYXB0ZXItPmFody5ib2FyZGNmZy5ib2FyZF90eXBlCi0JCSAgICAhPSBORVRYRU5fQlJEVFlQRV9QMl9TQjMxXzEwR19JTUVaKQorCQlpZiAoYWRhcHRlci0+dW5zZXRfcHJvbWlzYykKIAkJCWFkYXB0ZXItPnVuc2V0X3Byb21pc2MoYWRhcHRlciwKLQkJCQkJICAgICAgIHBvcnQtPnBvcnRudW0sCiAJCQkJCSAgICAgICBORVRYRU5fTklVX05PTl9QUk9NSVNDX01PREUpOwogCX0KLQlpZiAoYWRhcHRlci0+YWh3LmJvYXJkX3R5cGUgPT0gTkVUWEVOX05JQ19YR0JFKSB7Ci0JCW5ldHhlbl9uaWNfbWNyX3NldF9tb2RlX3NlbGVjdChuZXR4ZW5fbWFjX2FkZHJfY250bF9kYXRhLCAweDAzKTsKLQkJbmV0eGVuX25pY19tY3Jfc2V0X2lkX3Bvb2wwKG5ldHhlbl9tYWNfYWRkcl9jbnRsX2RhdGEsIDB4MDApOwotCQluZXR4ZW5fbmljX21jcl9zZXRfaWRfcG9vbDEobmV0eGVuX21hY19hZGRyX2NudGxfZGF0YSwgMHgwMCk7Ci0JCW5ldHhlbl9uaWNfbWNyX3NldF9pZF9wb29sMihuZXR4ZW5fbWFjX2FkZHJfY250bF9kYXRhLCAweDAwKTsKLQkJbmV0eGVuX25pY19tY3Jfc2V0X2lkX3Bvb2wzKG5ldHhlbl9tYWNfYWRkcl9jbnRsX2RhdGEsIDB4MDApOwotCQluZXR4ZW5fbmljX21jcl9zZXRfZW5hYmxlX3h0bmQwKG5ldHhlbl9tYWNfYWRkcl9jbnRsX2RhdGEpOwotCQluZXR4ZW5fbmljX21jcl9zZXRfZW5hYmxlX3h0bmQxKG5ldHhlbl9tYWNfYWRkcl9jbnRsX2RhdGEpOwotCQluZXR4ZW5fbmljX21jcl9zZXRfZW5hYmxlX3h0bmQyKG5ldHhlbl9tYWNfYWRkcl9jbnRsX2RhdGEpOwotCQluZXR4ZW5fbmljX21jcl9zZXRfZW5hYmxlX3h0bmQzKG5ldHhlbl9tYWNfYWRkcl9jbnRsX2RhdGEpOwotCX0gZWxzZSB7Ci0JCW5ldHhlbl9uaWNfbWNyX3NldF9tb2RlX3NlbGVjdChuZXR4ZW5fbWFjX2FkZHJfY250bF9kYXRhLCAweDAwKTsKLQkJbmV0eGVuX25pY19tY3Jfc2V0X2lkX3Bvb2wwKG5ldHhlbl9tYWNfYWRkcl9jbnRsX2RhdGEsIDB4MDApOwotCQluZXR4ZW5fbmljX21jcl9zZXRfaWRfcG9vbDEobmV0eGVuX21hY19hZGRyX2NudGxfZGF0YSwgMHgwMSk7Ci0JCW5ldHhlbl9uaWNfbWNyX3NldF9pZF9wb29sMihuZXR4ZW5fbWFjX2FkZHJfY250bF9kYXRhLCAweDAyKTsKLQkJbmV0eGVuX25pY19tY3Jfc2V0X2lkX3Bvb2wzKG5ldHhlbl9tYWNfYWRkcl9jbnRsX2RhdGEsIDB4MDMpOwotCX0KLQl3cml0ZWwobmV0eGVuX21hY19hZGRyX2NudGxfZGF0YSwKLQkgICAgICAgTkVUWEVOX0NSQl9OT1JNQUxJWkUoYWRhcHRlciwgTkVUWEVOX01BQ19BRERSX0NOVExfUkVHKSk7Ci0JaWYgKGFkYXB0ZXItPmFody5ib2FyZF90eXBlID09IE5FVFhFTl9OSUNfWEdCRSkgewotCQl3cml0ZWwobmV0eGVuX21hY19hZGRyX2NudGxfZGF0YSwKLQkJICAgICAgIE5FVFhFTl9DUkJfTk9STUFMSVpFKGFkYXB0ZXIsCi0JCQkJCSAgICBORVRYRU5fTVVMVElDQVNUX0FERFJfSElfMCkpOwotCX0gZWxzZSB7Ci0JCXdyaXRlbChuZXR4ZW5fbWFjX2FkZHJfY250bF9kYXRhLAotCQkgICAgICAgTkVUWEVOX0NSQl9OT1JNQUxJWkUoYWRhcHRlciwKLQkJCQkJICAgIE5FVFhFTl9NVUxUSUNBU1RfQUREUl9ISV8xKSk7Ci0JfQotCW5ldHhlbl9tYWNfYWRkcl9jbnRsX2RhdGEgPSAwOwotCXdyaXRlbChuZXR4ZW5fbWFjX2FkZHJfY250bF9kYXRhLAotCSAgICAgICBORVRYRU5fQ1JCX05PUk1BTElaRShhZGFwdGVyLCBORVRYRU5fTklVX0dCX0RST1BfV1JPTkdBRERSKSk7CiB9CiAKIC8qCkBAIC0xNTAsOCArMzI5LDcgQEAKICAqLwogaW50IG5ldHhlbl9uaWNfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgbXR1KQogewotCXN0cnVjdCBuZXR4ZW5fcG9ydCAqcG9ydCA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0Jc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyID0gcG9ydC0+YWRhcHRlcjsKKwlzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCWludCBlZmZfbXR1ID0gbXR1ICsgTkVUWEVOX0VORVRfSEVBREVSX1NJWkUgKyBORVRYRU5fRVRIX0ZDU19TSVpFOwogCiAJaWYgKChlZmZfbXR1ID4gTkVUWEVOX01BWF9NVFUpIHx8IChlZmZfbXR1IDwgTkVUWEVOX01JTl9NVFUpKSB7CkBAIC0xNjEsNyArMzM5LDcgQEAKIAl9CiAKIAlpZiAoYWRhcHRlci0+c2V0X210dSkKLQkJYWRhcHRlci0+c2V0X210dShwb3J0LCBtdHUpOworCQlhZGFwdGVyLT5zZXRfbXR1KGFkYXB0ZXIsIG10dSk7CiAJbmV0ZGV2LT5tdHUgPSBtdHU7CiAKIAlyZXR1cm4gMDsKQEAgLTE3OCw5ICszNTYsOSBAQAogCXZvaWQgKmFkZHI7CiAJaW50IGxvb3BzID0gMCwgZXJyID0gMDsKIAlpbnQgY3R4LCByaW5nOwotCXUzMiBjYXJkX2NtZHJpbmcgPSAwOwogCXN0cnVjdCBuZXR4ZW5fcmVjdl9jb250ZXh0ICpyZWN2X2N0eDsKIAlzdHJ1Y3QgbmV0eGVuX3Jjdl9kZXNjX2N0eCAqcmN2X2Rlc2M7CisJaW50IGZ1bmNfaWQgPSBhZGFwdGVyLT5wb3J0bnVtOwogCiAJRFBSSU5USyhJTkZPLCAiY3JiX2Jhc2U6ICVseCAleCIsIE5FVFhFTl9QQ0lfQ1JCU1BBQ0UsCiAJCVBDSV9PRkZTRVRfU0VDT05EX1JBTkdFKGFkYXB0ZXIsIE5FVFhFTl9QQ0lfQ1JCU1BBQ0UpKTsKQEAgLTE4OSwxMSArMzY3LDYgQEAKIAlEUFJJTlRLKElORk8sICJjYW0gUkFNOiAlbHggJXgiLCBORVRYRU5fQ0FNX1JBTV9CQVNFLAogCQlwY2lfYmFzZV9vZmZzZXQoYWRhcHRlciwgTkVUWEVOX0NBTV9SQU1fQkFTRSkpOwogCi0JLyogV2luZG93IDEgY2FsbCAqLwotCWNhcmRfY21kcmluZyA9IHJlYWRsKE5FVFhFTl9DUkJfTk9STUFMSVpFKGFkYXB0ZXIsIENSQl9DTURQRUdfQ01EUklORykpOwotCi0JRFBSSU5USyhJTkZPLCAiQ29tbWFuZCBQZWcgc2VuZHMgMHgleCBmb3IgY21kcmluZyBiYXNlXG4iLAotCQljYXJkX2NtZHJpbmcpOwogCiAJZm9yIChjdHggPSAwOyBjdHggPCBNQVhfUkNWX0NUWDsgKytjdHgpIHsKIAkJRFBSSU5USyhJTkZPLCAiQ29tbWFuZCBQZWcgcmVhZHkuLndhaXRpbmcgZm9yIHJjdiBwZWdcbiIpOwpAQCAtMjI3LDcgKzQwMCw3IEBACiAJCQkgICAgKGRtYV9hZGRyX3QgKikgJiBhZGFwdGVyLT5jdHhfZGVzY19waHlzX2FkZHIsCiAJCQkgICAgJmFkYXB0ZXItPmN0eF9kZXNjX3BkZXYpOwogCi0JcHJpbnRrKCJjdHhfZGVzY19waHlzX2FkZHI6IDB4JWxseFxuIiwKKwlwcmludGsoS0VSTl9JTkZPICJjdHhfZGVzY19waHlzX2FkZHI6IDB4JWxseFxuIiwKIAkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgYWRhcHRlci0+Y3R4X2Rlc2NfcGh5c19hZGRyKTsKIAlpZiAoYWRkciA9PSBOVUxMKSB7CiAJCURQUklOVEsoRVJSLCAiYmFkIHJldHVybiBmcm9tIHBjaV9hbGxvY19jb25zaXN0ZW50XG4iKTsKQEAgLTIzNiw2ICs0MDksNyBAQAogCX0KIAltZW1zZXQoYWRkciwgMCwgc2l6ZW9mKHN0cnVjdCBuZXR4ZW5fcmluZ19jdHgpKTsKIAlhZGFwdGVyLT5jdHhfZGVzYyA9IChzdHJ1Y3QgbmV0eGVuX3JpbmdfY3R4ICopYWRkcjsKKwlhZGFwdGVyLT5jdHhfZGVzYy0+Y3R4X2lkID0gY3B1X3RvX2xlMzIoYWRhcHRlci0+cG9ydG51bSk7CiAJYWRhcHRlci0+Y3R4X2Rlc2MtPmNtZF9jb25zdW1lcl9vZmZzZXQgPQogCSAgICBjcHVfdG9fbGU2NChhZGFwdGVyLT5jdHhfZGVzY19waHlzX2FkZHIgKwogCQkJc2l6ZW9mKHN0cnVjdCBuZXR4ZW5fcmluZ19jdHgpKTsKQEAgLTI0Nyw3ICs0MjEsNyBAQAogCQkJICAgIGFkYXB0ZXItPm1heF90eF9kZXNjX2NvdW50LAogCQkJICAgIChkbWFfYWRkcl90ICopICYgaHctPmNtZF9kZXNjX3BoeXNfYWRkciwKIAkJCSAgICAmYWRhcHRlci0+YWh3LmNtZF9kZXNjX3BkZXYpOwotCXByaW50aygiY21kX2Rlc2NfcGh5c19hZGRyOiAweCVsbHhcbiIsCisJcHJpbnRrKEtFUk5fSU5GTyAiY21kX2Rlc2NfcGh5c19hZGRyOiAweCVsbHhcbiIsCiAJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIGh3LT5jbWRfZGVzY19waHlzX2FkZHIpOwogCiAJaWYgKGFkZHIgPT0gTlVMTCkgewpAQCAtMzA2LDExICs0ODAsMTEgQEAKIAkvKiBXaW5kb3cgPSAxICovCiAKIAl3cml0ZWwobG93ZXIzMihhZGFwdGVyLT5jdHhfZGVzY19waHlzX2FkZHIpLAotCSAgICAgICBORVRYRU5fQ1JCX05PUk1BTElaRShhZGFwdGVyLCBDUkJfQ1RYX0FERFJfUkVHX0xPKSk7CisJICAgICAgIE5FVFhFTl9DUkJfTk9STUFMSVpFKGFkYXB0ZXIsIENSQl9DVFhfQUREUl9SRUdfTE8oZnVuY19pZCkpKTsKIAl3cml0ZWwodXBwZXIzMihhZGFwdGVyLT5jdHhfZGVzY19waHlzX2FkZHIpLAotCSAgICAgICBORVRYRU5fQ1JCX05PUk1BTElaRShhZGFwdGVyLCBDUkJfQ1RYX0FERFJfUkVHX0hJKSk7Ci0Jd3JpdGVsKE5FVFhFTl9DVFhfU0lHTkFUVVJFLAotCSAgICAgICBORVRYRU5fQ1JCX05PUk1BTElaRShhZGFwdGVyLCBDUkJfQ1RYX1NJR05BVFVSRV9SRUcpKTsKKwkgICAgICAgTkVUWEVOX0NSQl9OT1JNQUxJWkUoYWRhcHRlciwgQ1JCX0NUWF9BRERSX1JFR19ISShmdW5jX2lkKSkpOworCXdyaXRlbChORVRYRU5fQ1RYX1NJR05BVFVSRSB8IGZ1bmNfaWQsCisJICAgICAgIE5FVFhFTl9DUkJfTk9STUFMSVpFKGFkYXB0ZXIsIENSQl9DVFhfU0lHTkFUVVJFX1JFRyhmdW5jX2lkKSkpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTMzNywxMCArNTExLDYgQEAKIAkJCQkgICAgYWRhcHRlci0+YWh3LmNtZF9kZXNjX3BoeXNfYWRkcik7CiAJCWFkYXB0ZXItPmFody5jbWRfZGVzY19oZWFkID0gTlVMTDsKIAl9Ci0JLyogU3BlY2lhbCBoYW5kbGluZzogdGhlcmUgYXJlIDIgcG9ydHMgb24gdGhpcyBib2FyZCAqLwotCWlmIChhZGFwdGVyLT5haHcuYm9hcmRjZmcuYm9hcmRfdHlwZSA9PSBORVRYRU5fQlJEVFlQRV9QMl9TQjMxXzEwR19JTUVaKSB7Ci0JCWFkYXB0ZXItPmFody5tYXhfcG9ydHMgPSAyOwotCX0KIAogCWZvciAoY3R4ID0gMDsgY3R4IDwgTUFYX1JDVl9DVFg7ICsrY3R4KSB7CiAJCXJlY3ZfY3R4ID0gJmFkYXB0ZXItPnJlY3ZfY3R4W2N0eF07CkBAIC0zNzEsMjIgKzU0MSwyMCBAQAogCQkgICAgICBzdHJ1Y3QgY21kX2Rlc2NfdHlwZTAgKmRlc2MsIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJaWYgKGRlc2MtPm1zcykgewotCQlkZXNjLT50b3RhbF9oZHJfbGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBldGhoZHIpICsKLQkJICAgICgoc2tiLT5uaC5pcGgpLT5paGwgKiBzaXplb2YodTMyKSkgKwotCQkgICAgKChza2ItPmgudGgpLT5kb2ZmICogc2l6ZW9mKHUzMikpOworCQlkZXNjLT50b3RhbF9oZHJfbGVuZ3RoID0gKHNpemVvZihzdHJ1Y3QgZXRoaGRyKSArCisJCQkJCSAgaXBfaGRybGVuKHNrYikgKyB0Y3BfaGRybGVuKHNrYikpOwogCQluZXR4ZW5fc2V0X2NtZF9kZXNjX29wY29kZShkZXNjLCBUWF9UQ1BfTFNPKTsKIAl9IGVsc2UgaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1BBUlRJQUwpIHsKLQkJaWYgKHNrYi0+bmguaXBoLT5wcm90b2NvbCA9PSBJUFBST1RPX1RDUCkgeworCQlpZiAoaXBfaGRyKHNrYiktPnByb3RvY29sID09IElQUFJPVE9fVENQKSB7CiAJCQluZXR4ZW5fc2V0X2NtZF9kZXNjX29wY29kZShkZXNjLCBUWF9UQ1BfUEtUKTsKLQkJfSBlbHNlIGlmIChza2ItPm5oLmlwaC0+cHJvdG9jb2wgPT0gSVBQUk9UT19VRFApIHsKKwkJfSBlbHNlIGlmIChpcF9oZHIoc2tiKS0+cHJvdG9jb2wgPT0gSVBQUk9UT19VRFApIHsKIAkJCW5ldHhlbl9zZXRfY21kX2Rlc2Nfb3Bjb2RlKGRlc2MsIFRYX1VEUF9QS1QpOwogCQl9IGVsc2UgewogCQkJcmV0dXJuOwogCQl9CiAJfQotCWFkYXB0ZXItPnN0YXRzLnhtaXRjc3VtbWVkKys7Ci0JZGVzYy0+dGNwX2hkcl9vZmZzZXQgPSBza2ItPmgucmF3IC0gc2tiLT5kYXRhOwotCWRlc2MtPmlwX2hkcl9vZmZzZXQgPSBza2ItPm5oLnJhdyAtIHNrYi0+ZGF0YTsKKwlkZXNjLT50Y3BfaGRyX29mZnNldCA9IHNrYl90cmFuc3BvcnRfb2Zmc2V0KHNrYik7CisJZGVzYy0+aXBfaGRyX29mZnNldCA9IHNrYl9uZXR3b3JrX29mZnNldChza2IpOwogfQogCiBpbnQgbmV0eGVuX2lzX2ZsYXNoX3N1cHBvcnRlZChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIpCkBAIC00NzQsNyArNjQyLDMwIEBACiAKIAlpZiAoYWRhcHRlci0+Y3Vycl93aW5kb3cgPT0gd25kdykKIAkJcmV0dXJuOwotCisJc3dpdGNoKGFkYXB0ZXItPmFody5wY2lfZnVuYykgeworCQljYXNlIDA6CisJCQlvZmZzZXQgPSBQQ0lfT0ZGU0VUX1NFQ09ORF9SQU5HRShhZGFwdGVyLAorCQkJCQlORVRYRU5fUENJWF9QSF9SRUcoUENJWF9DUkJfV0lORE9XKSk7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJb2Zmc2V0ID0gUENJX09GRlNFVF9TRUNPTkRfUkFOR0UoYWRhcHRlciwKKwkJCQkJTkVUWEVOX1BDSVhfUEhfUkVHKFBDSVhfQ1JCX1dJTkRPV19GMSkpOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCW9mZnNldCA9IFBDSV9PRkZTRVRfU0VDT05EX1JBTkdFKGFkYXB0ZXIsCisJCQkJCU5FVFhFTl9QQ0lYX1BIX1JFRyhQQ0lYX0NSQl9XSU5ET1dfRjIpKTsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQlvZmZzZXQgPSBQQ0lfT0ZGU0VUX1NFQ09ORF9SQU5HRShhZGFwdGVyLAorCQkJCQlORVRYRU5fUENJWF9QSF9SRUcoUENJWF9DUkJfV0lORE9XX0YzKSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0lORk8gIkNoYW5naW5nIHRoZSB3aW5kb3cgZm9yIFBDSSBmdW5jdGlvbiIKKwkJCQkJIiVkXG4iLAlhZGFwdGVyLT5haHcucGNpX2Z1bmMpOworCQkJb2Zmc2V0ID0gUENJX09GRlNFVF9TRUNPTkRfUkFOR0UoYWRhcHRlciwKKwkJCQkJTkVUWEVOX1BDSVhfUEhfUkVHKFBDSVhfQ1JCX1dJTkRPVykpOworCQkJYnJlYWs7CisJfQogCS8qCiAJICogTW92ZSB0aGUgQ1JCIHdpbmRvdy4KIAkgKiBXZSBuZWVkIHRvIHdyaXRlIHRvIHRoZSAiZGlyZWN0IGFjY2VzcyIgcmVnaW9uIG9mIFBDSQpAQCAtNDgzLDkgKzY3NCw2IEBACiAJICogcmVnaXN0ZXIgYWRkcmVzcyBpcyByZWNlaXZlZCBieSBQQ0kuIFRoZSBkaXJlY3QgcmVnaW9uIGJ5cGFzc2VzCiAJICogdGhlIENSQiBidXMuCiAJICovCi0Jb2Zmc2V0ID0KLQkgICAgUENJX09GRlNFVF9TRUNPTkRfUkFOR0UoYWRhcHRlciwKLQkJCQkgICAgTkVUWEVOX1BDSVhfUEhfUkVHKFBDSVhfQ1JCX1dJTkRPVykpOwogCiAJaWYgKHduZHcgJiAweDEpCiAJCXduZHcgPSBORVRYRU5fV0lORE9XX09ORTsKQEAgLTUwMyw3ICs2OTEsMTAgQEAKIAkJY291bnQrKzsKIAl9CiAKLQlhZGFwdGVyLT5jdXJyX3dpbmRvdyA9IHduZHc7CisJaWYgKHduZHcgPT0gTkVUWEVOX1dJTkRPV19PTkUpCisJCWFkYXB0ZXItPmN1cnJfd2luZG93ID0gMTsKKwllbHNlCisJCWFkYXB0ZXItPmN1cnJfd2luZG93ID0gMDsKIH0KIAogdm9pZCBuZXR4ZW5fbG9hZF9maXJtd2FyZShzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIpCkBAIC03NDgsNiArOTM5LDE3IEBACiAJcmV0dXJuIGFkZHI7CiB9CiAKK2ludAorbmV0eGVuX25pY19lcmFzZV9weGUoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyKQoreworCWlmIChuZXR4ZW5fcm9tX2Zhc3Rfd3JpdGUoYWRhcHRlciwgUFhFX1NUQVJULCAwKSA9PSAtMSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBlcmFzZSBweGUgZmFpbGVkXG4iLCAKKwkJCW5ldHhlbl9uaWNfZHJpdmVyX25hbWUpOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfQorCiBpbnQgbmV0eGVuX25pY19nZXRfYm9hcmRfaW5mbyhzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7CiAJaW50IHJ2ID0gMDsKQEAgLTgwOSw0MyArMTAxMSwyOSBAQAogCiAvKiBOSVUgYWNjZXNzIHNlY3Rpb25zICovCiAKLWludCBuZXR4ZW5fbmljX3NldF9tdHVfZ2Ioc3RydWN0IG5ldHhlbl9wb3J0ICpwb3J0LCBpbnQgbmV3X210dSkKK2ludCBuZXR4ZW5fbmljX3NldF9tdHVfZ2Ioc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLCBpbnQgbmV3X210dSkKIHsKLQlzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwb3J0LT5hZGFwdGVyOwogCW5ldHhlbl9uaWNfd3JpdGVfdzAoYWRhcHRlciwKLQkJCSAgICBORVRYRU5fTklVX0dCX01BWF9GUkFNRV9TSVpFKHBvcnQtPnBvcnRudW0pLAotCQkJICAgIG5ld19tdHUpOworCQkJTkVUWEVOX05JVV9HQl9NQVhfRlJBTUVfU0laRSgKKwkJCQlwaHlzaWNhbF9wb3J0W2FkYXB0ZXItPnBvcnRudW1dKSwgbmV3X210dSk7CiAJcmV0dXJuIDA7CiB9CiAKLWludCBuZXR4ZW5fbmljX3NldF9tdHVfeGdiKHN0cnVjdCBuZXR4ZW5fcG9ydCAqcG9ydCwgaW50IG5ld19tdHUpCitpbnQgbmV0eGVuX25pY19zZXRfbXR1X3hnYihzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBuZXdfbXR1KQogewotCXN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciA9IHBvcnQtPmFkYXB0ZXI7CiAJbmV3X210dSArPSBORVRYRU5fTklVX0hEUlNJWkUgKyBORVRYRU5fTklVX1RMUlNJWkU7Ci0JaWYgKHBvcnQtPnBvcnRudW0gPT0gMCkKLQkgICAgbmV0eGVuX25pY193cml0ZV93MChhZGFwdGVyLCBORVRYRU5fTklVX1hHRV9NQVhfRlJBTUVfU0laRSwgbmV3X210dSk7Ci0JZWxzZSBpZiAocG9ydC0+cG9ydG51bSA9PSAxKQotCSAgICBuZXR4ZW5fbmljX3dyaXRlX3cwKGFkYXB0ZXIsIE5FVFhFTl9OSVVfWEcxX01BWF9GUkFNRV9TSVpFLCBuZXdfbXR1KTsKKwlpZiAocGh5c2ljYWxfcG9ydFthZGFwdGVyLT5wb3J0bnVtXSA9PSAwKQorCQluZXR4ZW5fbmljX3dyaXRlX3cwKGFkYXB0ZXIsIE5FVFhFTl9OSVVfWEdFX01BWF9GUkFNRV9TSVpFLCAKKwkJCQluZXdfbXR1KTsKKwllbHNlIAorCQluZXR4ZW5fbmljX3dyaXRlX3cwKGFkYXB0ZXIsIE5FVFhFTl9OSVVfWEcxX01BWF9GUkFNRV9TSVpFLAorCQkJCW5ld19tdHUpOwogCXJldHVybiAwOwogfQogCiB2b2lkIG5ldHhlbl9uaWNfaW5pdF9uaXVfZ2Ioc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyKQogewotCWludCBwb3J0bm87Ci0JZm9yIChwb3J0bm8gPSAwOyBwb3J0bm8gPCBORVRYRU5fTklVX01BWF9HQkVfUE9SVFM7IHBvcnRubysrKQotCQluZXR4ZW5fbml1X2diZV9pbml0X3BvcnQoYWRhcHRlciwgcG9ydG5vKTsKLX0KLQotdm9pZCBuZXR4ZW5fbmljX3N0b3BfYWxsX3BvcnRzKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlcikKLXsKLQlpbnQgcG9ydF9ucjsKLQlzdHJ1Y3QgbmV0eGVuX3BvcnQgKnBvcnQ7Ci0KLQlmb3IgKHBvcnRfbnIgPSAwOyBwb3J0X25yIDwgYWRhcHRlci0+YWh3Lm1heF9wb3J0czsgcG9ydF9ucisrKSB7Ci0JCXBvcnQgPSBhZGFwdGVyLT5wb3J0W3BvcnRfbnJdOwotCQlpZiAoYWRhcHRlci0+c3RvcF9wb3J0KQotCQkJYWRhcHRlci0+c3RvcF9wb3J0KGFkYXB0ZXIsIHBvcnQtPnBvcnRudW0pOwotCX0KKwluZXR4ZW5fbml1X2diZV9pbml0X3BvcnQoYWRhcHRlciwgcGh5c2ljYWxfcG9ydFthZGFwdGVyLT5wb3J0bnVtXSk7CiB9CiAKIHZvaWQKQEAgLTg2NCw5ICsxMDUyLDggQEAKIAl9CiB9CiAKLXZvaWQgbmV0eGVuX25pY19zZXRfbGlua19wYXJhbWV0ZXJzKHN0cnVjdCBuZXR4ZW5fcG9ydCAqcG9ydCkKK3ZvaWQgbmV0eGVuX25pY19zZXRfbGlua19wYXJhbWV0ZXJzKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlcikKIHsKLQlzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwb3J0LT5hZGFwdGVyOwogCV9fdTMyIHN0YXR1czsKIAlfX3UzMiBhdXRvbmVnOwogCV9fdTMyIG1vZGU7CkBAIC04NzUsNDcgKzEwNjIsNDcgQEAKIAlpZiAobmV0eGVuX2dldF9uaXVfZW5hYmxlX2dlKG1vZGUpKSB7CS8qIEdiIDEwLzEwMC8xMDAwIE1icHMgbW9kZSAqLwogCQlpZiAoYWRhcHRlci0+cGh5X3JlYWQKIAkJICAgICYmIGFkYXB0ZXItPgotCQkgICAgcGh5X3JlYWQoYWRhcHRlciwgcG9ydC0+cG9ydG51bSwKKwkJICAgIHBoeV9yZWFkKGFkYXB0ZXIsCiAJCQkgICAgIE5FVFhFTl9OSVVfR0JfTUlJX01HTVRfQUREUl9QSFlfU1RBVFVTLAogCQkJICAgICAmc3RhdHVzKSA9PSAwKSB7CiAJCQlpZiAobmV0eGVuX2dldF9waHlfbGluayhzdGF0dXMpKSB7CiAJCQkJc3dpdGNoIChuZXR4ZW5fZ2V0X3BoeV9zcGVlZChzdGF0dXMpKSB7CiAJCQkJY2FzZSAwOgotCQkJCQlwb3J0LT5saW5rX3NwZWVkID0gU1BFRURfMTA7CisJCQkJCWFkYXB0ZXItPmxpbmtfc3BlZWQgPSBTUEVFRF8xMDsKIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSAxOgotCQkJCQlwb3J0LT5saW5rX3NwZWVkID0gU1BFRURfMTAwOworCQkJCQlhZGFwdGVyLT5saW5rX3NwZWVkID0gU1BFRURfMTAwOwogCQkJCQlicmVhazsKIAkJCQljYXNlIDI6Ci0JCQkJCXBvcnQtPmxpbmtfc3BlZWQgPSBTUEVFRF8xMDAwOworCQkJCQlhZGFwdGVyLT5saW5rX3NwZWVkID0gU1BFRURfMTAwMDsKIAkJCQkJYnJlYWs7CiAJCQkJZGVmYXVsdDoKLQkJCQkJcG9ydC0+bGlua19zcGVlZCA9IC0xOworCQkJCQlhZGFwdGVyLT5saW5rX3NwZWVkID0gLTE7CiAJCQkJCWJyZWFrOwogCQkJCX0KIAkJCQlzd2l0Y2ggKG5ldHhlbl9nZXRfcGh5X2R1cGxleChzdGF0dXMpKSB7CiAJCQkJY2FzZSAwOgotCQkJCQlwb3J0LT5saW5rX2R1cGxleCA9IERVUExFWF9IQUxGOworCQkJCQlhZGFwdGVyLT5saW5rX2R1cGxleCA9IERVUExFWF9IQUxGOwogCQkJCQlicmVhazsKIAkJCQljYXNlIDE6Ci0JCQkJCXBvcnQtPmxpbmtfZHVwbGV4ID0gRFVQTEVYX0ZVTEw7CisJCQkJCWFkYXB0ZXItPmxpbmtfZHVwbGV4ID0gRFVQTEVYX0ZVTEw7CiAJCQkJCWJyZWFrOwogCQkJCWRlZmF1bHQ6Ci0JCQkJCXBvcnQtPmxpbmtfZHVwbGV4ID0gLTE7CisJCQkJCWFkYXB0ZXItPmxpbmtfZHVwbGV4ID0gLTE7CiAJCQkJCWJyZWFrOwogCQkJCX0KIAkJCQlpZiAoYWRhcHRlci0+cGh5X3JlYWQKIAkJCQkgICAgJiYgYWRhcHRlci0+Ci0JCQkJICAgIHBoeV9yZWFkKGFkYXB0ZXIsIHBvcnQtPnBvcnRudW0sCisJCQkJICAgIHBoeV9yZWFkKGFkYXB0ZXIsCiAJCQkJCSAgICAgTkVUWEVOX05JVV9HQl9NSUlfTUdNVF9BRERSX0FVVE9ORUcsCiAJCQkJCSAgICAgJmF1dG9uZWcpICE9IDApCi0JCQkJCXBvcnQtPmxpbmtfYXV0b25lZyA9IGF1dG9uZWc7CisJCQkJCWFkYXB0ZXItPmxpbmtfYXV0b25lZyA9IGF1dG9uZWc7CiAJCQl9IGVsc2UKIAkJCQlnb3RvIGxpbmtfZG93bjsKIAkJfSBlbHNlIHsKIAkJICAgICAgbGlua19kb3duOgotCQkJcG9ydC0+bGlua19zcGVlZCA9IC0xOwotCQkJcG9ydC0+bGlua19kdXBsZXggPSAtMTsKKwkJCWFkYXB0ZXItPmxpbmtfc3BlZWQgPSAtMTsKKwkJCWFkYXB0ZXItPmxpbmtfZHVwbGV4ID0gLTE7CiAJCX0KIAl9CiB9CkBAIC05MjksNyArMTExNiw3IEBACiAJY2hhciBicmRfbmFtZVtORVRYRU5fTUFYX1NIT1JUX05BTUVdOwogCXN0cnVjdCBuZXR4ZW5fbmV3X3VzZXJfaW5mbyB1c2VyX2luZm87CiAJaW50IGksIGFkZHIgPSBVU0VSX1NUQVJUOwotCXUzMiAqcHRyMzI7CisJX19sZTMyICpwdHIzMjsKIAogCXN0cnVjdCBuZXR4ZW5fYm9hcmRfaW5mbyAqYm9hcmRfaW5mbyA9ICYoYWRhcHRlci0+YWh3LmJvYXJkY2ZnKTsKIAlpZiAoYm9hcmRfaW5mby0+bWFnaWMgIT0gTkVUWEVOX0JESU5GT19NQUdJQykgewpAQCAtOTU1LDcgKzExNDIsNiBAQAogCQkJCSAgICAgICBuZXR4ZW5fbmljX2RyaXZlcl9uYW1lKTsKIAkJCQlyZXR1cm47CiAJCQl9Ci0JCQkqcHRyMzIgPSBsZTMyX3RvX2NwdSgqcHRyMzIpOwogCQkJcHRyMzIrKzsKIAkJCWFkZHIgKz0gc2l6ZW9mKHUzMik7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L25ldHhlbi9uZXR4ZW5fbmljX2h3LmggYi9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pY19ody5oCmluZGV4IGFiMTExMmViLi4yNDViZjEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pY19ody5oCisrKyBiL2RyaXZlcnMvbmV0L25ldHhlbi9uZXR4ZW5fbmljX2h3LmgKQEAgLTYsMTIgKzYsMTIgQEAKICAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgogICogb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CiAgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICoKICAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sCkBAIC04Nyw3ICs4Nyw3IEBACiAJKih1MzIgKilZID0gcmVhZGwoKHZvaWQgX19pb21lbSopIGFkZHIpOwogCiBzdHJ1Y3QgbmV0eGVuX3BvcnQ7Ci12b2lkIG5ldHhlbl9uaWNfc2V0X2xpbmtfcGFyYW1ldGVycyhzdHJ1Y3QgbmV0eGVuX3BvcnQgKnBvcnQpOwordm9pZCBuZXR4ZW5fbmljX3NldF9saW5rX3BhcmFtZXRlcnMoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyKTsKIHZvaWQgbmV0eGVuX25pY19mbGFzaF9wcmludChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIpOwogaW50IG5ldHhlbl9uaWNfaHdfd3JpdGVfd3goc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLCB1NjQgb2ZmLAogCQkJICAgdm9pZCAqZGF0YSwgaW50IGxlbik7CkBAIC0yMjAsNiArMjIwLDY5IEBACiAJCV9uZXR4ZW5fY3JiX2dldF9iaXQoY29uZmlnX3dvcmQsIDEpCiAjZGVmaW5lIG5ldHhlbl9nZXRfZ2JfbWlpX21nbXRfbm90dmFsaWQoY29uZmlnX3dvcmQpCVwKIAkJX25ldHhlbl9jcmJfZ2V0X2JpdChjb25maWdfd29yZCwgMikKKy8qCisgKiBOSVUgWEcgUGF1c2UgQ3RsIFJlZ2lzdGVyCisgKgorICogICAgICBCaXQgMCAgICAgICA6IHhnMF9tYXNrID0+IDE6ZGlzYWJsZSB0eCBwYXVzZSBmcmFtZXMKKyAqICAgICAgQml0IDEgICAgICAgOiB4ZzBfcmVxdWVzdCA9PiAxOnJlcXVlc3Qgc2luZ2xlIHBhdXNlIGZyYW1lCisgKiAgICAgIEJpdCAyICAgICAgIDogeGcwX29uX29mZiA9PiAxOnJlcXVlc3QgaXMgcGF1c2Ugb24sIDA6b2ZmCisgKiAgICAgIEJpdCAzICAgICAgIDogeGcxX21hc2sgPT4gMTpkaXNhYmxlIHR4IHBhdXNlIGZyYW1lcworICogICAgICBCaXQgNCAgICAgICA6IHhnMV9yZXF1ZXN0ID0+IDE6cmVxdWVzdCBzaW5nbGUgcGF1c2UgZnJhbWUKKyAqICAgICAgQml0IDUgICAgICAgOiB4ZzFfb25fb2ZmID0+IDE6cmVxdWVzdCBpcyBwYXVzZSBvbiwgMDpvZmYKKyAqLworCisjZGVmaW5lIG5ldHhlbl94Z19zZXRfeGcwX21hc2soY29uZmlnX3dvcmQpICAgIFwKKwkoKGNvbmZpZ193b3JkKSB8PSAxIDw8IDApCisjZGVmaW5lIG5ldHhlbl94Z19zZXRfeGcxX21hc2soY29uZmlnX3dvcmQpICAgIFwKKwkoKGNvbmZpZ193b3JkKSB8PSAxIDw8IDMpCisJCQorI2RlZmluZSBuZXR4ZW5feGdfZ2V0X3hnMF9tYXNrKGNvbmZpZ193b3JkKSAgICBcCisJX25ldHhlbl9jcmJfZ2V0X2JpdCgoY29uZmlnX3dvcmQpLCAwKQorI2RlZmluZSBuZXR4ZW5feGdfZ2V0X3hnMV9tYXNrKGNvbmZpZ193b3JkKSAgICBcCisJX25ldHhlbl9jcmJfZ2V0X2JpdCgoY29uZmlnX3dvcmQpLCAzKQorCisjZGVmaW5lIG5ldHhlbl94Z191bnNldF94ZzBfbWFzayhjb25maWdfd29yZCkgIFwKKwkoKGNvbmZpZ193b3JkKSAmPSB+KDEgPDwgMCkpCisjZGVmaW5lIG5ldHhlbl94Z191bnNldF94ZzFfbWFzayhjb25maWdfd29yZCkgIFwKKwkoKGNvbmZpZ193b3JkKSAmPSB+KDEgPDwgMykpCisKKy8qCisgKiBOSVUgWEcgUGF1c2UgQ3RsIFJlZ2lzdGVyCisgKgorICogICAgICBCaXQgMCAgICAgICA6IHhnMF9tYXNrID0+IDE6ZGlzYWJsZSB0eCBwYXVzZSBmcmFtZXMKKyAqICAgICAgQml0IDEgICAgICAgOiB4ZzBfcmVxdWVzdCA9PiAxOnJlcXVlc3Qgc2luZ2xlIHBhdXNlIGZyYW1lCisgKiAgICAgIEJpdCAyICAgICAgIDogeGcwX29uX29mZiA9PiAxOnJlcXVlc3QgaXMgcGF1c2Ugb24sIDA6b2ZmCisgKiAgICAgIEJpdCAzICAgICAgIDogeGcxX21hc2sgPT4gMTpkaXNhYmxlIHR4IHBhdXNlIGZyYW1lcworICogICAgICBCaXQgNCAgICAgICA6IHhnMV9yZXF1ZXN0ID0+IDE6cmVxdWVzdCBzaW5nbGUgcGF1c2UgZnJhbWUKKyAqICAgICAgQml0IDUgICAgICAgOiB4ZzFfb25fb2ZmID0+IDE6cmVxdWVzdCBpcyBwYXVzZSBvbiwgMDpvZmYKKyAqLworI2RlZmluZSBuZXR4ZW5fZ2Jfc2V0X2diMF9tYXNrKGNvbmZpZ193b3JkKSAgICBcCisJKChjb25maWdfd29yZCkgfD0gMSA8PCAwKQorI2RlZmluZSBuZXR4ZW5fZ2Jfc2V0X2diMV9tYXNrKGNvbmZpZ193b3JkKSAgICBcCisJKChjb25maWdfd29yZCkgfD0gMSA8PCAyKQorI2RlZmluZSBuZXR4ZW5fZ2Jfc2V0X2diMl9tYXNrKGNvbmZpZ193b3JkKSAgICBcCisJKChjb25maWdfd29yZCkgfD0gMSA8PCA0KQorI2RlZmluZSBuZXR4ZW5fZ2Jfc2V0X2diM19tYXNrKGNvbmZpZ193b3JkKSAgICBcCisJKChjb25maWdfd29yZCkgfD0gMSA8PCA2KQorCisjZGVmaW5lIG5ldHhlbl9nYl9nZXRfZ2IwX21hc2soY29uZmlnX3dvcmQpICAgIFwKKwlfbmV0eGVuX2NyYl9nZXRfYml0KChjb25maWdfd29yZCksIDApCisjZGVmaW5lIG5ldHhlbl9nYl9nZXRfZ2IxX21hc2soY29uZmlnX3dvcmQpICAgIFwKKwlfbmV0eGVuX2NyYl9nZXRfYml0KChjb25maWdfd29yZCksIDIpCisjZGVmaW5lIG5ldHhlbl9nYl9nZXRfZ2IyX21hc2soY29uZmlnX3dvcmQpICAgIFwKKwlfbmV0eGVuX2NyYl9nZXRfYml0KChjb25maWdfd29yZCksIDQpCisjZGVmaW5lIG5ldHhlbl9nYl9nZXRfZ2IzX21hc2soY29uZmlnX3dvcmQpICAgIFwKKwlfbmV0eGVuX2NyYl9nZXRfYml0KChjb25maWdfd29yZCksIDYpCisJCisjZGVmaW5lIG5ldHhlbl9nYl91bnNldF9nYjBfbWFzayhjb25maWdfd29yZCkgIFwKKwkoKGNvbmZpZ193b3JkKSAmPSB+KDEgPDwgMCkpCisjZGVmaW5lIG5ldHhlbl9nYl91bnNldF9nYjFfbWFzayhjb25maWdfd29yZCkgIFwKKwkoKGNvbmZpZ193b3JkKSAmPSB+KDEgPDwgMikpCisjZGVmaW5lIG5ldHhlbl9nYl91bnNldF9nYjJfbWFzayhjb25maWdfd29yZCkgIFwKKwkoKGNvbmZpZ193b3JkKSAmPSB+KDEgPDwgNCkpCisjZGVmaW5lIG5ldHhlbl9nYl91bnNldF9nYjNfbWFzayhjb25maWdfd29yZCkgIFwKKwkoKGNvbmZpZ193b3JkKSAmPSB+KDEgPDwgNikpCisKIAogLyoKICAqIFBIWS1TcGVjaWZpYyBNSUkgY29udHJvbC9zdGF0dXMgcmVnaXN0ZXJzLgpAQCAtNDUyLDIxICs1MTUsMjEgQEAKIAkJKChjb25maWcpIHw9ICgoKHZhbCkgJiAweDBmKSA8PCAyOCkpCiAKIC8qIFNldCBwcm9taXNjdW91cyBtb2RlIGZvciBhIEdiRSBpbnRlcmZhY2UgKi8KLWludCBuZXR4ZW5fbml1X3NldF9wcm9taXNjdW91c19tb2RlKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwgaW50IHBvcnQsCitpbnQgbmV0eGVuX25pdV9zZXRfcHJvbWlzY3VvdXNfbW9kZShzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsIAogCQkJCSAgICBuZXR4ZW5fbml1X3Byb21fbW9kZV90IG1vZGUpOwogaW50IG5ldHhlbl9uaXVfeGdfc2V0X3Byb21pc2N1b3VzX21vZGUoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLAotCQkJCSAgICAgICBpbnQgcG9ydCwgbmV0eGVuX25pdV9wcm9tX21vZGVfdCBtb2RlKTsKKwkJCQkgICAgICAgbmV0eGVuX25pdV9wcm9tX21vZGVfdCBtb2RlKTsKIAogLyogZ2V0L3NldCB0aGUgTUFDIGFkZHJlc3MgZm9yIGEgZ2l2ZW4gTUFDICovCi1pbnQgbmV0eGVuX25pdV9tYWNhZGRyX2dldChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBwb3J0LAoraW50IG5ldHhlbl9uaXVfbWFjYWRkcl9nZXQoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLAogCQkJICAgbmV0eGVuX2V0aGVybmV0X21hY2FkZHJfdCAqIGFkZHIpOwotaW50IG5ldHhlbl9uaXVfbWFjYWRkcl9zZXQoc3RydWN0IG5ldHhlbl9wb3J0ICpwb3J0LAoraW50IG5ldHhlbl9uaXVfbWFjYWRkcl9zZXQoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLAogCQkJICAgbmV0eGVuX2V0aGVybmV0X21hY2FkZHJfdCBhZGRyKTsKIAogLyogWEcgdmVyc29ucyAqLwotaW50IG5ldHhlbl9uaXVfeGdfbWFjYWRkcl9nZXQoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLCBpbnQgcG9ydCwKK2ludCBuZXR4ZW5fbml1X3hnX21hY2FkZHJfZ2V0KHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwKIAkJCSAgICAgIG5ldHhlbl9ldGhlcm5ldF9tYWNhZGRyX3QgKiBhZGRyKTsKLWludCBuZXR4ZW5fbml1X3hnX21hY2FkZHJfc2V0KHN0cnVjdCBuZXR4ZW5fcG9ydCAqcG9ydCwKK2ludCBuZXR4ZW5fbml1X3hnX21hY2FkZHJfc2V0KHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwKIAkJCSAgICAgIG5ldHhlbl9ldGhlcm5ldF9tYWNhZGRyX3QgYWRkcik7CiAKIC8qIEdlbmVyaWMgZW5hYmxlIGZvciBHYkUgcG9ydHMuIFdpbGwgZGV0ZWN0IHRoZSBzcGVlZCBvZiB0aGUgbGluay4gKi8KQEAgLTQ3NSw4ICs1MzgsOCBAQAogaW50IG5ldHhlbl9uaXVfeGdfaW5pdF9wb3J0KHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwgaW50IHBvcnQpOwogCiAvKiBEaXNhYmxlIGEgR2JFIGludGVyZmFjZSAqLwotaW50IG5ldHhlbl9uaXVfZGlzYWJsZV9nYmVfcG9ydChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBwb3J0KTsKK2ludCBuZXR4ZW5fbml1X2Rpc2FibGVfZ2JlX3BvcnQoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyKTsKIAotaW50IG5ldHhlbl9uaXVfZGlzYWJsZV94Z19wb3J0KHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwgaW50IHBvcnQpOworaW50IG5ldHhlbl9uaXVfZGlzYWJsZV94Z19wb3J0KHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlcik7CiAKICNlbmRpZgkJCQkvKiBfX05FVFhFTl9OSUNfSFdfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L25ldHhlbi9uZXR4ZW5fbmljX2luaXQuYyBiL2RyaXZlcnMvbmV0L25ldHhlbi9uZXR4ZW5fbmljX2luaXQuYwppbmRleCBlZmY5NjVkLi5jZjBlOTZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pY19pbml0LmMKKysrIGIvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWNfaW5pdC5jCkBAIC0xMzksNyArMTM5LDcgQEAKIAkJcmV0dXJuIGVycjsKIAl9CiAJLyogV2luZG93IDEgY2FsbCAqLwotCXdyaXRlbChNUE9SVF9TSU5HTEVfRlVOQ1RJT05fTU9ERSwKKwl3cml0ZWwoTVBPUlRfTVVMVElfRlVOQ1RJT05fTU9ERSwKIAkgICAgICAgTkVUWEVOX0NSQl9OT1JNQUxJWkUoYWRhcHRlciwgQ1JCX01QT1JUX01PREUpKTsKIAl3cml0ZWwoUEhBTl9JTklUSUFMSVpFX0FDSywKIAkgICAgICAgTkVUWEVOX0NSQl9OT1JNQUxJWkUoYWRhcHRlciwgQ1JCX0NNRFBFR19TVEFURSkpOwpAQCAtMjI2LDcgKzIyNiw2IEBACiAJCWFkYXB0ZXItPnVuc2V0X3Byb21pc2MgPSBuZXR4ZW5fbml1X3NldF9wcm9taXNjdW91c19tb2RlOwogCQlhZGFwdGVyLT5waHlfcmVhZCA9IG5ldHhlbl9uaXVfZ2JlX3BoeV9yZWFkOwogCQlhZGFwdGVyLT5waHlfd3JpdGUgPSBuZXR4ZW5fbml1X2diZV9waHlfd3JpdGU7Ci0JCWFkYXB0ZXItPmluaXRfcG9ydCA9IG5ldHhlbl9uaXVfZ2JlX2luaXRfcG9ydDsKIAkJYWRhcHRlci0+aW5pdF9uaXUgPSBuZXR4ZW5fbmljX2luaXRfbml1X2diOwogCQlhZGFwdGVyLT5zdG9wX3BvcnQgPSBuZXR4ZW5fbml1X2Rpc2FibGVfZ2JlX3BvcnQ7CiAJCWJyZWFrOwpAQCAtMjc3LDggKzI3Niw4IEBACiAJCXJldHVybiAocGNpX2Jhc2UgKyBvZmZzZXQpOwogfQogCi1zdGF0aWMgbG9uZyByb21fbWF4X3RpbWVvdXQgPSAxMDAwMDsKLXN0YXRpYyBsb25nIHJvbV9sb2NrX3RpbWVvdXQgPSAxMDAwMDAwOworc3RhdGljIGxvbmcgcm9tX21heF90aW1lb3V0ID0gMTAwOworc3RhdGljIGxvbmcgcm9tX2xvY2tfdGltZW91dCA9IDEwMDAwOwogc3RhdGljIGxvbmcgcm9tX3dyaXRlX3RpbWVvdXQgPSA3MDA7CiAKIHN0YXRpYyBpbmxpbmUgaW50IHJvbV9sb2NrKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlcikKQEAgLTQzOCw5ICs0MzcsOSBAQAogCiAJZm9yIChhZGRyaWR4ID0gYWRkcjsgYWRkcmlkeCA8IChhZGRyICsgc2l6ZSk7IGFkZHJpZHggKz0gNCkgewogCQlyZXQgPSBkb19yb21fZmFzdF9yZWFkKGFkYXB0ZXIsIGFkZHJpZHgsIChpbnQgKilieXRlcyk7Ci0JCSooaW50ICopYnl0ZXMgPSBjcHVfdG9fbGUzMigqKGludCAqKWJ5dGVzKTsKIAkJaWYgKHJldCAhPSAwKQogCQkJYnJlYWs7CisJCSooaW50ICopYnl0ZXMgPSBjcHVfdG9fbGUzMigqKGludCAqKWJ5dGVzKTsKIAkJYnl0ZXMgKz0gNDsKIAl9CiAKQEAgLTQ5OSw3ICs0OTgsNiBAQAogCQlpbnQgZGF0YTsKIAogCQlkYXRhID0gbGUzMl90b19jcHUoKCoodTMyKilieXRlcykpOwotCiAJCXJldCA9IGRvX3JvbV9mYXN0X3dyaXRlKGFkYXB0ZXIsIGFkZHJpZHgsIGRhdGEpOwogCQlpZiAocmV0IDwgMCkKIAkJCXJldHVybiByZXQ7CkBAIC05NTMsNyArOTUxLDggQEAKIAogCWlmICghcGVndHVuZV92YWwpIHsKIAkJdmFsID0gcmVhZGwoTkVUWEVOX0NSQl9OT1JNQUxJWkUoYWRhcHRlciwgQ1JCX0NNRFBFR19TVEFURSkpOwotCQl3aGlsZSAodmFsICE9IFBIQU5fSU5JVElBTElaRV9DT01QTEVURSAmJiBsb29wcyA8IDIwMDAwMCkgeworCQl3aGlsZSAodmFsICE9IFBIQU5fSU5JVElBTElaRV9DT01QTEVURSAmJiAKKwkJCXZhbCAhPSBQSEFOX0lOSVRJQUxJWkVfQUNLICYmIGxvb3BzIDwgMjAwMDAwKSB7CiAJCQl1ZGVsYXkoMTAwKTsKIAkJCXNjaGVkdWxlKCk7CiAJCQl2YWwgPQpAQCAtOTkwLDkgKzk4OSw3IEBACiAKIHN0YXRpYyBpbmxpbmUgaW50IG5ldHhlbl9uaWNfY2hlY2tfdGVtcChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7Ci0JaW50IHBvcnRfbnVtOwotCXN0cnVjdCBuZXR4ZW5fcG9ydCAqcG9ydDsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXY7CiAJdWludDMyX3QgdGVtcCwgdGVtcF9zdGF0ZSwgdGVtcF92YWw7CiAJaW50IHJ2ID0gMDsKIApAQCAtMTAwNiwxNCArMTAwMyw5IEBACiAJCSAgICAgICAiJXM6IERldmljZSB0ZW1wZXJhdHVyZSAlZCBkZWdyZWVzIEMgZXhjZWVkcyIKIAkJICAgICAgICIgbWF4aW11bSBhbGxvd2VkLiBIYXJkd2FyZSBoYXMgYmVlbiBzaHV0IGRvd24uXG4iLAogCQkgICAgICAgbmV0eGVuX25pY19kcml2ZXJfbmFtZSwgdGVtcF92YWwpOwotCQlmb3IgKHBvcnRfbnVtID0gMDsgcG9ydF9udW0gPCBhZGFwdGVyLT5haHcubWF4X3BvcnRzOwotCQkgICAgIHBvcnRfbnVtKyspIHsKLQkJCXBvcnQgPSBhZGFwdGVyLT5wb3J0W3BvcnRfbnVtXTsKLQkJCW5ldGRldiA9IHBvcnQtPm5ldGRldjsKIAotCQkJbmV0aWZfY2Fycmllcl9vZmYobmV0ZGV2KTsKLQkJCW5ldGlmX3N0b3BfcXVldWUobmV0ZGV2KTsKLQkJfQorCQluZXRpZl9jYXJyaWVyX29mZihuZXRkZXYpOworCQluZXRpZl9zdG9wX3F1ZXVlKG5ldGRldik7CiAJCXJ2ID0gMTsKIAl9IGVsc2UgaWYgKHRlbXBfc3RhdGUgPT0gTlhfVEVNUF9XQVJOKSB7CiAJCWlmIChhZGFwdGVyLT50ZW1wID09IE5YX1RFTVBfTk9STUFMKSB7CkBAIC0xMDM3LDI5ICsxMDI5LDIzIEBACiAKIHZvaWQgbmV0eGVuX3dhdGNoZG9nX3Rhc2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCWludCBwb3J0X251bTsKLQlzdHJ1Y3QgbmV0eGVuX3BvcnQgKnBvcnQ7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKIAlzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIgPQogCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IG5ldHhlbl9hZGFwdGVyLCB3YXRjaGRvZ190YXNrKTsKIAotCWlmIChuZXR4ZW5fbmljX2NoZWNrX3RlbXAoYWRhcHRlcikpCisJaWYgKChhZGFwdGVyLT5wb3J0bnVtICA9PSAwKSAmJiBuZXR4ZW5fbmljX2NoZWNrX3RlbXAoYWRhcHRlcikpCiAJCXJldHVybjsKIAotCWZvciAocG9ydF9udW0gPSAwOyBwb3J0X251bSA8IGFkYXB0ZXItPmFody5tYXhfcG9ydHM7IHBvcnRfbnVtKyspIHsKLQkJcG9ydCA9IGFkYXB0ZXItPnBvcnRbcG9ydF9udW1dOwotCQluZXRkZXYgPSBwb3J0LT5uZXRkZXY7Ci0KLQkJaWYgKChuZXRpZl9ydW5uaW5nKG5ldGRldikpICYmICFuZXRpZl9jYXJyaWVyX29rKG5ldGRldikpIHsKLQkJCXByaW50ayhLRVJOX0lORk8gIiVzIHBvcnQgJWQsICVzIGNhcnJpZXIgaXMgbm93IG9rXG4iLAotCQkJICAgICAgIG5ldHhlbl9uaWNfZHJpdmVyX25hbWUsIHBvcnRfbnVtLCBuZXRkZXYtPm5hbWUpOwotCQkJbmV0aWZfY2Fycmllcl9vbihuZXRkZXYpOwotCQl9Ci0KLQkJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQobmV0ZGV2KSkKLQkJCW5ldGlmX3dha2VfcXVldWUobmV0ZGV2KTsKKwluZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXY7CisJaWYgKChuZXRpZl9ydW5uaW5nKG5ldGRldikpICYmICFuZXRpZl9jYXJyaWVyX29rKG5ldGRldikpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXMgcG9ydCAlZCwgJXMgY2FycmllciBpcyBub3cgb2tcbiIsCisJCSAgICAgICBuZXR4ZW5fbmljX2RyaXZlcl9uYW1lLCBhZGFwdGVyLT5wb3J0bnVtLCBuZXRkZXYtPm5hbWUpOworCQluZXRpZl9jYXJyaWVyX29uKG5ldGRldik7CiAJfQogCisJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQobmV0ZGV2KSkKKwkJbmV0aWZfd2FrZV9xdWV1ZShuZXRkZXYpOworCiAJaWYgKGFkYXB0ZXItPmhhbmRsZV9waHlfaW50cikKIAkJYWRhcHRlci0+aGFuZGxlX3BoeV9pbnRyKGFkYXB0ZXIpOwogCW1vZF90aW1lcigmYWRhcHRlci0+d2F0Y2hkb2dfdGltZXIsIGppZmZpZXMgKyAyICogSFopOwpAQCAtMTA3NCw5ICsxMDYwLDggQEAKIG5ldHhlbl9wcm9jZXNzX3JjdihzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBjdHhpZCwKIAkJICAgc3RydWN0IHN0YXR1c19kZXNjICpkZXNjKQogewotCXN0cnVjdCBuZXR4ZW5fcG9ydCAqcG9ydCA9IGFkYXB0ZXItPnBvcnRbbmV0eGVuX2dldF9zdHNfcG9ydChkZXNjKV07Ci0Jc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBwb3J0LT5wZGV2OwotCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBwb3J0LT5uZXRkZXY7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBhZGFwdGVyLT5wZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXY7CiAJaW50IGluZGV4ID0gbmV0eGVuX2dldF9zdHNfcmVmaGFuZGxlKGRlc2MpOwogCXN0cnVjdCBuZXR4ZW5fcmVjdl9jb250ZXh0ICpyZWN2X2N0eCA9ICYoYWRhcHRlci0+cmVjdl9jdHhbY3R4aWRdKTsKIAlzdHJ1Y3QgbmV0eGVuX3J4X2J1ZmZlciAqYnVmZmVyOwpAQCAtMTEyNiwxMCArMTExMSw5IEBACiAJc2tiID0gKHN0cnVjdCBza19idWZmICopYnVmZmVyLT5za2I7CiAKIAlpZiAobGlrZWx5KG5ldHhlbl9nZXRfc3RzX3N0YXR1cyhkZXNjKSA9PSBTVEFUVVNfQ0tTVU1fT0spKSB7Ci0JCXBvcnQtPnN0YXRzLmNzdW1tZWQrKzsKKwkJYWRhcHRlci0+c3RhdHMuY3N1bW1lZCsrOwogCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOwogCX0KLQlza2ItPmRldiA9IG5ldGRldjsKIAlpZiAoZGVzY19jdHggPT0gUkNWX0RFU0NfTFJPX0NUWElEKSB7CiAJCS8qIFRydWUgbGVuZ3RoIHdhcyBvbmx5IGF2YWlsYWJsZSBvbiB0aGUgbGFzdCBwa3QgKi8KIAkJc2tiX3B1dChza2IsIGJ1ZmZlci0+bHJvX2xlbmd0aCk7CkBAIC0xMTQ3LDI3ICsxMTMxLDI3IEBACiAJICovCiAJc3dpdGNoIChyZXQpIHsKIAljYXNlIE5FVF9SWF9TVUNDRVNTOgotCQlwb3J0LT5zdGF0cy51cGhhcHB5Kys7CisJCWFkYXB0ZXItPnN0YXRzLnVwaGFwcHkrKzsKIAkJYnJlYWs7CiAKIAljYXNlIE5FVF9SWF9DTl9MT1c6Ci0JCXBvcnQtPnN0YXRzLnVwbGNvbmcrKzsKKwkJYWRhcHRlci0+c3RhdHMudXBsY29uZysrOwogCQlicmVhazsKIAogCWNhc2UgTkVUX1JYX0NOX01PRDoKLQkJcG9ydC0+c3RhdHMudXBtY29uZysrOworCQlhZGFwdGVyLT5zdGF0cy51cG1jb25nKys7CiAJCWJyZWFrOwogCiAJY2FzZSBORVRfUlhfQ05fSElHSDoKLQkJcG9ydC0+c3RhdHMudXBoY29uZysrOworCQlhZGFwdGVyLT5zdGF0cy51cGhjb25nKys7CiAJCWJyZWFrOwogCiAJY2FzZSBORVRfUlhfRFJPUDoKLQkJcG9ydC0+c3RhdHMudXBkcm9wcGVkKys7CisJCWFkYXB0ZXItPnN0YXRzLnVwZHJvcHBlZCsrOwogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCXBvcnQtPnN0YXRzLnVwZHVubm8rKzsKKwkJYWRhcHRlci0+c3RhdHMudXBkdW5ubysrOwogCQlicmVhazsKIAl9CiAKQEAgLTExNzksMTQgKzExNjMsMTMgQEAKIAkvKgogCSAqIFdlIGp1c3QgY29uc3VtZWQgb25lIGJ1ZmZlciBzbyBwb3N0IGEgYnVmZmVyLgogCSAqLwotCWFkYXB0ZXItPnN0YXRzLnBvc3RfY2FsbGVkKys7CiAJYnVmZmVyLT5za2IgPSBOVUxMOwogCWJ1ZmZlci0+c3RhdGUgPSBORVRYRU5fQlVGRkVSX0ZSRUU7CiAJYnVmZmVyLT5scm9fY3VycmVudF9mcmFncyA9IDA7CiAJYnVmZmVyLT5scm9fZXhwZWN0ZWRfZnJhZ3MgPSAwOwogCi0JcG9ydC0+c3RhdHMubm9fcmN2Kys7Ci0JcG9ydC0+c3RhdHMucnhieXRlcyArPSBsZW5ndGg7CisJYWRhcHRlci0+c3RhdHMubm9fcmN2Kys7CisJYWRhcHRlci0+c3RhdHMucnhieXRlcyArPSBsZW5ndGg7CiB9CiAKIC8qIFByb2Nlc3MgUmVjZWl2ZSBzdGF0dXMgcmluZyAqLwpAQCAtMTIyNyw3ICsxMjEwLDYgQEAKIAogCS8qIHVwZGF0ZSB0aGUgY29uc3VtZXIgaW5kZXggaW4gcGhhbnRvbSAqLwogCWlmIChjb3VudCkgewotCQlhZGFwdGVyLT5zdGF0cy5wcm9jZXNzX3JjdisrOwogCQlyZWN2X2N0eC0+c3RhdHVzX3J4X2NvbnN1bWVyID0gY29uc3VtZXI7CiAJCXJlY3ZfY3R4LT5zdGF0dXNfcnhfcHJvZHVjZXIgPSBwcm9kdWNlcjsKIApAQCAtMTI1MCwxMyArMTIzMiwxMCBAQAogCWludCBjb3VudDEgPSAwOwogCWludCBjb3VudDIgPSAwOwogCXN0cnVjdCBuZXR4ZW5fY21kX2J1ZmZlciAqYnVmZmVyOwotCXN0cnVjdCBuZXR4ZW5fcG9ydCAqcG9ydDsJLyogcG9ydCAjMSAqLwotCXN0cnVjdCBuZXR4ZW5fcG9ydCAqbnBvcnQ7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXY7CiAJc3RydWN0IG5ldHhlbl9za2JfZnJhZyAqZnJhZzsKIAl1MzIgaTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKLQlpbnQgcDsKIAlpbnQgZG9uZTsKIAogCXNwaW5fbG9jaygmYWRhcHRlci0+dHhfbG9jayk7CkBAIC0xMjc3LDcgKzEyNTYsNiBAQAogCX0KIAogCWFkYXB0ZXItPnByb2NfY21kX2J1Zl9jb3VudGVyKys7Ci0JYWRhcHRlci0+c3RhdHMucHJvY2Vzc194bWl0Kys7CiAJLyoKIAkgKiBOb3QgbmVlZGVkIC0gZG9lcyBub3Qgc2VlbSB0byBiZSB1c2VkIGFueXdoZXJlLgogCSAqIGFkYXB0ZXItPmNtZF9jb25zdW1lciA9IGNvbnN1bWVyOwpAQCAtMTI4Niw4ICsxMjY0LDcgQEAKIAogCXdoaWxlICgobGFzdF9jb25zdW1lciAhPSBjb25zdW1lcikgJiYgKGNvdW50MSA8IE1BWF9TVEFUVVNfSEFORExFKSkgewogCQlidWZmZXIgPSAmYWRhcHRlci0+Y21kX2J1Zl9hcnJbbGFzdF9jb25zdW1lcl07Ci0JCXBvcnQgPSBhZGFwdGVyLT5wb3J0W2J1ZmZlci0+cG9ydF07Ci0JCXBkZXYgPSBwb3J0LT5wZGV2OworCQlwZGV2ID0gYWRhcHRlci0+cGRldjsKIAkJZnJhZyA9ICZidWZmZXItPmZyYWdfYXJyYXlbMF07CiAJCXNrYiA9IGJ1ZmZlci0+c2tiOwogCQlpZiAoc2tiICYmIChjbXB4Y2hnKCZidWZmZXItPnNrYiwgc2tiLCAwKSA9PSBza2IpKSB7CkBAIC0xMzAwLDI0ICsxMjc3LDIzIEBACiAJCQkJCSAgICAgICBQQ0lfRE1BX1RPREVWSUNFKTsKIAkJCX0KIAotCQkJcG9ydC0+c3RhdHMuc2tiZnJlZWQrKzsKKwkJCWFkYXB0ZXItPnN0YXRzLnNrYmZyZWVkKys7CiAJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwogCQkJc2tiID0gTlVMTDsKIAkJfSBlbHNlIGlmIChhZGFwdGVyLT5wcm9jX2NtZF9idWZfY291bnRlciA9PSAxKSB7Ci0JCQlwb3J0LT5zdGF0cy50eG51bGxza2IrKzsKKwkJCWFkYXB0ZXItPnN0YXRzLnR4bnVsbHNrYisrOwogCQl9Ci0JCWlmICh1bmxpa2VseShuZXRpZl9xdWV1ZV9zdG9wcGVkKHBvcnQtPm5ldGRldikKLQkJCSAgICAgJiYgbmV0aWZfY2Fycmllcl9vayhwb3J0LT5uZXRkZXYpKQotCQkgICAgJiYgKChqaWZmaWVzIC0gcG9ydC0+bmV0ZGV2LT50cmFuc19zdGFydCkgPgotCQkJcG9ydC0+bmV0ZGV2LT53YXRjaGRvZ190aW1lbykpIHsKLQkJCVNDSEVEVUxFX1dPUksoJnBvcnQtPnR4X3RpbWVvdXRfdGFzayk7CisJCWlmICh1bmxpa2VseShuZXRpZl9xdWV1ZV9zdG9wcGVkKGFkYXB0ZXItPm5ldGRldikKKwkJCSAgICAgJiYgbmV0aWZfY2Fycmllcl9vayhhZGFwdGVyLT5uZXRkZXYpKQorCQkgICAgJiYgKChqaWZmaWVzIC0gYWRhcHRlci0+bmV0ZGV2LT50cmFuc19zdGFydCkgPgorCQkJYWRhcHRlci0+bmV0ZGV2LT53YXRjaGRvZ190aW1lbykpIHsKKwkJCVNDSEVEVUxFX1dPUksoJmFkYXB0ZXItPnR4X3RpbWVvdXRfdGFzayk7CiAJCX0KIAogCQlsYXN0X2NvbnN1bWVyID0gZ2V0X25leHRfaW5kZXgobGFzdF9jb25zdW1lciwKIAkJCQkJICAgICAgIGFkYXB0ZXItPm1heF90eF9kZXNjX2NvdW50KTsKIAkJY291bnQxKys7CiAJfQotCWFkYXB0ZXItPnN0YXRzLm5veG1pdGRvbmUgKz0gY291bnQxOwogCiAJY291bnQyID0gMDsKIAlzcGluX2xvY2soJmFkYXB0ZXItPnR4X2xvY2spOwpAQCAtMTMzNywxMyArMTMxMywxMCBAQAogCQl9CiAJfQogCWlmIChjb3VudDEgfHwgY291bnQyKSB7Ci0JCWZvciAocCA9IDA7IHAgPCBhZGFwdGVyLT5haHcubWF4X3BvcnRzOyBwKyspIHsKLQkJCW5wb3J0ID0gYWRhcHRlci0+cG9ydFtwXTsKLQkJCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKG5wb3J0LT5uZXRkZXYpCi0JCQkgICAgJiYgKG5wb3J0LT5mbGFncyAmIE5FVFhFTl9ORVRERVZfU1RBVFVTKSkgewotCQkJCW5ldGlmX3dha2VfcXVldWUobnBvcnQtPm5ldGRldik7Ci0JCQkJbnBvcnQtPmZsYWdzICY9IH5ORVRYRU5fTkVUREVWX1NUQVRVUzsKLQkJCX0KKwkJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQoYWRhcHRlci0+bmV0ZGV2KQorCQkgICAgJiYgKGFkYXB0ZXItPmZsYWdzICYgTkVUWEVOX05FVERFVl9TVEFUVVMpKSB7CisJCQluZXRpZl93YWtlX3F1ZXVlKGFkYXB0ZXItPm5ldGRldik7CisJCQlhZGFwdGVyLT5mbGFncyAmPSB+TkVUWEVOX05FVERFVl9TVEFUVVM7CiAJCX0KIAl9CiAJLyoKQEAgLTEzODksNyArMTM2Miw2IEBACiAJbmV0eGVuX2N0eF9tc2cgbXNnID0gMDsKIAlkbWFfYWRkcl90IGRtYTsKIAotCWFkYXB0ZXItPnN0YXRzLnBvc3RfY2FsbGVkKys7CiAJcmN2X2Rlc2MgPSAmcmVjdl9jdHgtPnJjdl9kZXNjW3JpbmdpZF07CiAKIAlwcm9kdWNlciA9IHJjdl9kZXNjLT5wcm9kdWNlcjsKQEAgLTE0NDIsOCArMTQxNCw2IEBACiAJaWYgKGNvdW50KSB7CiAJCXJjdl9kZXNjLT5iZWdpbl9hbGxvYyA9IGluZGV4OwogCQlyY3ZfZGVzYy0+cmN2X3BlbmRpbmcgKz0gY291bnQ7Ci0JCWFkYXB0ZXItPnN0YXRzLmxhc3Rwb3N0ZWQgPSBjb3VudDsKLQkJYWRhcHRlci0+c3RhdHMucG9zdGVkICs9IGNvdW50OwogCQlyY3ZfZGVzYy0+cHJvZHVjZXIgPSBwcm9kdWNlcjsKIAkJaWYgKHJjdl9kZXNjLT5yY3ZfZnJlZSA+PSAzMikgewogCQkJcmN2X2Rlc2MtPnJjdl9mcmVlID0gMDsKQEAgLTE0NTEsNyArMTQyMSw4IEBACiAJCQl3cml0ZWwoKHByb2R1Y2VyIC0gMSkgJgogCQkJICAgICAgIChyY3ZfZGVzYy0+bWF4X3J4X2Rlc2NfY291bnQgLSAxKSwKIAkJCSAgICAgICBORVRYRU5fQ1JCX05PUk1BTElaRShhZGFwdGVyLAotCQkJCQkJICAgIHJlY3ZfY3JiX3JlZ2lzdGVyc1swXS4KKwkJCQkJCSAgICByZWN2X2NyYl9yZWdpc3RlcnNbCisJCQkJCQkgICAgYWRhcHRlci0+cG9ydG51bV0uCiAJCQkJCQkgICAgcmN2X2Rlc2NfY3JiW3JpbmdpZF0uCiAJCQkJCQkgICAgY3JiX3Jjdl9wcm9kdWNlcl9vZmZzZXQpKTsKIAkJCS8qCkBAIC0xNDY0LDcgKzE0MzUsNyBAQAogCQkJCQkgICAgICgocHJvZHVjZXIgLQogCQkJCQkgICAgICAgMSkgJiAocmN2X2Rlc2MtPgogCQkJCQkJICAgICBtYXhfcnhfZGVzY19jb3VudCAtIDEpKSk7Ci0JCQluZXR4ZW5fc2V0X21zZ19jdHhpZChtc2csIDApOworCQkJbmV0eGVuX3NldF9tc2dfY3R4aWQobXNnLCBhZGFwdGVyLT5wb3J0bnVtKTsKIAkJCW5ldHhlbl9zZXRfbXNnX29wY29kZShtc2csIE5FVFhFTl9SQ1ZfUFJPRFVDRVIocmluZ2lkKSk7CiAJCQl3cml0ZWwobXNnLAogCQkJICAgICAgIERCX05PUk1BTElaRShhZGFwdGVyLApAQCAtMTQ4Niw3ICsxNDU3LDYgQEAKIAlpbnQgY291bnQgPSAwOwogCWludCBpbmRleCA9IDA7CiAKLQlhZGFwdGVyLT5zdGF0cy5wb3N0X2NhbGxlZCsrOwogCXJjdl9kZXNjID0gJnJlY3ZfY3R4LT5yY3ZfZGVzY1tyaW5naWRdOwogCiAJcHJvZHVjZXIgPSByY3ZfZGVzYy0+cHJvZHVjZXI7CkBAIC0xNTMzLDggKzE1MDMsNiBAQAogCWlmIChjb3VudCkgewogCQlyY3ZfZGVzYy0+YmVnaW5fYWxsb2MgPSBpbmRleDsKIAkJcmN2X2Rlc2MtPnJjdl9wZW5kaW5nICs9IGNvdW50OwotCQlhZGFwdGVyLT5zdGF0cy5sYXN0cG9zdGVkID0gY291bnQ7Ci0JCWFkYXB0ZXItPnN0YXRzLnBvc3RlZCArPSBjb3VudDsKIAkJcmN2X2Rlc2MtPnByb2R1Y2VyID0gcHJvZHVjZXI7CiAJCWlmIChyY3ZfZGVzYy0+cmN2X2ZyZWUgPj0gMzIpIHsKIAkJCXJjdl9kZXNjLT5yY3ZfZnJlZSA9IDA7CkBAIC0xNTQyLDcgKzE1MTAsOCBAQAogCQkJd3JpdGVsKChwcm9kdWNlciAtIDEpICYKIAkJCSAgICAgICAocmN2X2Rlc2MtPm1heF9yeF9kZXNjX2NvdW50IC0gMSksCiAJCQkgICAgICAgTkVUWEVOX0NSQl9OT1JNQUxJWkUoYWRhcHRlciwKLQkJCQkJCSAgICByZWN2X2NyYl9yZWdpc3RlcnNbMF0uCisJCQkJCQkgICAgcmVjdl9jcmJfcmVnaXN0ZXJzWworCQkJCQkJICAgIGFkYXB0ZXItPnBvcnRudW1dLgogCQkJCQkJICAgIHJjdl9kZXNjX2NyYltyaW5naWRdLgogCQkJCQkJICAgIGNyYl9yY3ZfcHJvZHVjZXJfb2Zmc2V0KSk7CiAJCQl3bWIoKTsKQEAgLTE1NjMsMTMgKzE1MzIsNyBAQAogCiB2b2lkIG5ldHhlbl9uaWNfY2xlYXJfc3RhdHMoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyKQogewotCXN0cnVjdCBuZXR4ZW5fcG9ydCAqcG9ydDsKLQlpbnQgcG9ydF9udW07Ci0KIAltZW1zZXQoJmFkYXB0ZXItPnN0YXRzLCAwLCBzaXplb2YoYWRhcHRlci0+c3RhdHMpKTsKLQlmb3IgKHBvcnRfbnVtID0gMDsgcG9ydF9udW0gPCBhZGFwdGVyLT5haHcubWF4X3BvcnRzOyBwb3J0X251bSsrKSB7Ci0JCXBvcnQgPSBhZGFwdGVyLT5wb3J0W3BvcnRfbnVtXTsKLQkJbWVtc2V0KCZwb3J0LT5zdGF0cywgMCwgc2l6ZW9mKHBvcnQtPnN0YXRzKSk7Ci0JfQorCXJldHVybjsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWNfaXNyLmMgYi9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pY19pc3IuYwppbmRleCBiZTM2NmU0Li5iMjEzYjA2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pY19pc3IuYworKysgYi9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pY19pc3IuYwpAQCAtNiwxMiArNiwxMiBAQAogICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCiAgKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKICAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKgogICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwKQEAgLTQwLDM1ICs0MCwzNSBAQAogICovCiBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqbmV0eGVuX25pY19nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKIHsKLQlzdHJ1Y3QgbmV0eGVuX3BvcnQgKnBvcnQgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICZwb3J0LT5uZXRfc3RhdHM7CisJc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmYWRhcHRlci0+bmV0X3N0YXRzOwogCiAJbWVtc2V0KHN0YXRzLCAwLCBzaXplb2YoKnN0YXRzKSk7CiAKIAkvKiB0b3RhbCBwYWNrZXRzIHJlY2VpdmVkICAgKi8KLQlzdGF0cy0+cnhfcGFja2V0cyA9IHBvcnQtPnN0YXRzLm5vX3JjdjsKKwlzdGF0cy0+cnhfcGFja2V0cyA9IGFkYXB0ZXItPnN0YXRzLm5vX3JjdjsKIAkvKiB0b3RhbCBwYWNrZXRzIHRyYW5zbWl0dGVkICAgICovCi0Jc3RhdHMtPnR4X3BhY2tldHMgPSBwb3J0LT5zdGF0cy54bWl0ZWRmcmFtZXMgKyBwb3J0LT5zdGF0cy54bWl0ZmluaXNoZWQ7CisJc3RhdHMtPnR4X3BhY2tldHMgPSBhZGFwdGVyLT5zdGF0cy54bWl0ZWRmcmFtZXMgKyAKKwkJYWRhcHRlci0+c3RhdHMueG1pdGZpbmlzaGVkOwogCS8qIHRvdGFsIGJ5dGVzIHJlY2VpdmVkICAgICAqLwotCXN0YXRzLT5yeF9ieXRlcyA9IHBvcnQtPnN0YXRzLnJ4Ynl0ZXM7CisJc3RhdHMtPnJ4X2J5dGVzID0gYWRhcHRlci0+c3RhdHMucnhieXRlczsKIAkvKiB0b3RhbCBieXRlcyB0cmFuc21pdHRlZCAgKi8KLQlzdGF0cy0+dHhfYnl0ZXMgPSBwb3J0LT5zdGF0cy50eGJ5dGVzOworCXN0YXRzLT50eF9ieXRlcyA9IGFkYXB0ZXItPnN0YXRzLnR4Ynl0ZXM7CiAJLyogYmFkIHBhY2tldHMgcmVjZWl2ZWQgICAgICovCi0Jc3RhdHMtPnJ4X2Vycm9ycyA9IHBvcnQtPnN0YXRzLnJjdmRiYWRza2I7CisJc3RhdHMtPnJ4X2Vycm9ycyA9IGFkYXB0ZXItPnN0YXRzLnJjdmRiYWRza2I7CiAJLyogcGFja2V0IHRyYW5zbWl0IHByb2JsZW1zICovCi0Jc3RhdHMtPnR4X2Vycm9ycyA9IHBvcnQtPnN0YXRzLm5vY21kZGVzY3JpcHRvcjsKKwlzdGF0cy0+dHhfZXJyb3JzID0gYWRhcHRlci0+c3RhdHMubm9jbWRkZXNjcmlwdG9yOwogCS8qIG5vIHNwYWNlIGluIGxpbnV4IGJ1ZmZlcnMgICAgKi8KLQlzdGF0cy0+cnhfZHJvcHBlZCA9IHBvcnQtPnN0YXRzLnVwZHJvcHBlZDsKKwlzdGF0cy0+cnhfZHJvcHBlZCA9IGFkYXB0ZXItPnN0YXRzLnVwZHJvcHBlZDsKIAkvKiBubyBzcGFjZSBhdmFpbGFibGUgaW4gbGludXggICovCi0Jc3RhdHMtPnR4X2Ryb3BwZWQgPSBwb3J0LT5zdGF0cy50eGRyb3BwZWQ7CisJc3RhdHMtPnR4X2Ryb3BwZWQgPSBhZGFwdGVyLT5zdGF0cy50eGRyb3BwZWQ7CiAKIAlyZXR1cm4gc3RhdHM7CiB9CiAKLXZvaWQgbmV0eGVuX2luZGljYXRlX2xpbmtfc3RhdHVzKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwgdTMyIHBvcnRubywKLQkJCQkgdTMyIGxpbmspCit2b2lkIG5ldHhlbl9pbmRpY2F0ZV9saW5rX3N0YXR1cyhzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBsaW5rKQogewotCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSAoYWRhcHRlci0+cG9ydFtwb3J0bm9dKS0+bmV0ZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXY7CiAKIAlpZiAobGluaykKIAkJbmV0aWZfY2Fycmllcl9vbihuZXRkZXYpOwpAQCAtNzYsMTUgKzc2LDEzIEBACiAJCW5ldGlmX2NhcnJpZXJfb2ZmKG5ldGRldik7CiB9CiAKLXZvaWQgbmV0eGVuX2hhbmRsZV9wb3J0X2ludChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBwb3J0bm8sCi0JCQkgICAgdTMyIGVuYWJsZSkKK3ZvaWQgbmV0eGVuX2hhbmRsZV9wb3J0X2ludChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBlbmFibGUpCiB7CiAJX191MzIgaW50X3NyYzsKLQlzdHJ1Y3QgbmV0eGVuX3BvcnQgKnBvcnQ7CiAKIAkvKiAgVGhpcyBzaG91bGQgY2xlYXIgdGhlIGludGVycnVwdCBzb3VyY2UgKi8KIAlpZiAoYWRhcHRlci0+cGh5X3JlYWQpCi0JCWFkYXB0ZXItPnBoeV9yZWFkKGFkYXB0ZXIsIHBvcnRubywKKwkJYWRhcHRlci0+cGh5X3JlYWQoYWRhcHRlciwgCiAJCQkJICBORVRYRU5fTklVX0dCX01JSV9NR01UX0FERFJfSU5UX1NUQVRVUywKIAkJCQkgICZpbnRfc3JjKTsKIAlpZiAoaW50X3NyYyA9PSAwKSB7CkBAIC05Miw5ICs5MCw3IEBACiAJCXJldHVybjsKIAl9CiAJaWYgKGFkYXB0ZXItPmRpc2FibGVfcGh5X2ludGVycnVwdHMpCi0JCWFkYXB0ZXItPmRpc2FibGVfcGh5X2ludGVycnVwdHMoYWRhcHRlciwgcG9ydG5vKTsKLQotCXBvcnQgPSBhZGFwdGVyLT5wb3J0W3BvcnRub107CisJCWFkYXB0ZXItPmRpc2FibGVfcGh5X2ludGVycnVwdHMoYWRhcHRlcik7CiAKIAlpZiAobmV0eGVuX2dldF9waHlfaW50X2phYmJlcihpbnRfc3JjKSkKIAkJRFBSSU5USyhJTkZPLCAiSmFiYmVyIGludGVycnVwdCBcbiIpOwpAQCAtMTE1LDY0ICsxMTEsNTcgQEAKIAkJRFBSSU5USyhJTkZPLCAiU1BFRUQgQ0hBTkdFRCBPUiBMSU5LIFNUQVRVUyBDSEFOR0VEIFxuIik7CiAKIAkJaWYgKGFkYXB0ZXItPnBoeV9yZWFkCi0JCSAgICAmJiBhZGFwdGVyLT5waHlfcmVhZChhZGFwdGVyLCBwb3J0bm8sCisJCSAgICAmJiBhZGFwdGVyLT5waHlfcmVhZChhZGFwdGVyLCAKIAkJCQkJIE5FVFhFTl9OSVVfR0JfTUlJX01HTVRfQUREUl9QSFlfU1RBVFVTLAogCQkJCQkgJnN0YXR1cykgPT0gMCkgewogCQkJaWYgKG5ldHhlbl9nZXRfcGh5X2ludF9saW5rX3N0YXR1c19jaGFuZ2VkKGludF9zcmMpKSB7CiAJCQkJaWYgKG5ldHhlbl9nZXRfcGh5X2xpbmsoc3RhdHVzKSkgewotCQkJCQluZXR4ZW5fbml1X2diZV9pbml0X3BvcnQoYWRhcHRlciwKLQkJCQkJCQkJIHBvcnRubyk7Ci0JCQkJCXByaW50aygiJXM6ICVzIExpbmsgVVBcbiIsCisJCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyBMaW5rIFVQXG4iLAogCQkJCQkgICAgICAgbmV0eGVuX25pY19kcml2ZXJfbmFtZSwKLQkJCQkJICAgICAgIHBvcnQtPm5ldGRldi0+bmFtZSk7CisJCQkJCSAgICAgICBhZGFwdGVyLT5uZXRkZXYtPm5hbWUpOwogCiAJCQkJfSBlbHNlIHsKLQkJCQkJcHJpbnRrKCIlczogJXMgTGluayBET1dOXG4iLAorCQkJCQlwcmludGsoS0VSTl9JTkZPICIlczogJXMgTGluayBET1dOXG4iLAogCQkJCQkgICAgICAgbmV0eGVuX25pY19kcml2ZXJfbmFtZSwKLQkJCQkJICAgICAgIHBvcnQtPm5ldGRldi0+bmFtZSk7CisJCQkJCSAgICAgICBhZGFwdGVyLT5uZXRkZXYtPm5hbWUpOwogCQkJCX0KLQkJCQluZXR4ZW5faW5kaWNhdGVfbGlua19zdGF0dXMoYWRhcHRlciwgcG9ydG5vLAorCQkJCW5ldHhlbl9pbmRpY2F0ZV9saW5rX3N0YXR1cyhhZGFwdGVyLCAKIAkJCQkJCQkgICAgbmV0eGVuX2dldF9waHlfbGluawogCQkJCQkJCSAgICAoc3RhdHVzKSk7CiAJCQl9CiAJCX0KIAl9CiAJaWYgKGFkYXB0ZXItPmVuYWJsZV9waHlfaW50ZXJydXB0cykKLQkJYWRhcHRlci0+ZW5hYmxlX3BoeV9pbnRlcnJ1cHRzKGFkYXB0ZXIsIHBvcnRubyk7CisJCWFkYXB0ZXItPmVuYWJsZV9waHlfaW50ZXJydXB0cyhhZGFwdGVyKTsKIH0KIAogdm9pZCBuZXR4ZW5fbmljX2lzcl9vdGhlcihzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7Ci0JdTMyIHBvcnRubzsKKwlpbnQgcG9ydG5vID0gYWRhcHRlci0+cG9ydG51bTsKIAl1MzIgdmFsLCBsaW5rdXAsIHFnX2xpbmtzdXA7CiAKIAkvKiB2ZXJpZnkgdGhlIG9mZnNldCAqLwogCXZhbCA9IHJlYWRsKE5FVFhFTl9DUkJfTk9STUFMSVpFKGFkYXB0ZXIsIENSQl9YR19TVEFURSkpOworCXZhbCA9IHZhbCA+PiBwaHlzaWNhbF9wb3J0W2FkYXB0ZXItPnBvcnRudW1dOwogCWlmICh2YWwgPT0gYWRhcHRlci0+YWh3LnFnX2xpbmtzdXApCiAJCXJldHVybjsKIAogCXFnX2xpbmtzdXAgPSBhZGFwdGVyLT5haHcucWdfbGlua3N1cDsKIAlhZGFwdGVyLT5haHcucWdfbGlua3N1cCA9IHZhbDsKIAlEUFJJTlRLKElORk8sICJsaW5rIHVwZGF0ZSAweCUwOHhcbiIsIHZhbCk7Ci0JZm9yIChwb3J0bm8gPSAwOyBwb3J0bm8gPCBORVRYRU5fTklVX01BWF9HQkVfUE9SVFM7IHBvcnRubysrKSB7Ci0JCWxpbmt1cCA9IHZhbCAmIDE7Ci0JCWlmIChsaW5rdXAgIT0gKHFnX2xpbmtzdXAgJiAxKSkgewotCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzIFBPUlQgJWQgbGluayAlc1xuIiwKLQkJCSAgICAgICBhZGFwdGVyLT5wb3J0W3BvcnRub10tPm5ldGRldi0+bmFtZSwKLQkJCSAgICAgICBuZXR4ZW5fbmljX2RyaXZlcl9uYW1lLCBwb3J0bm8sCi0JCQkgICAgICAgKChsaW5rdXAgPT0gMCkgPyAiZG93biIgOiAidXAiKSk7Ci0JCQluZXR4ZW5faW5kaWNhdGVfbGlua19zdGF0dXMoYWRhcHRlciwgcG9ydG5vLCBsaW5rdXApOwotCQkJaWYgKGxpbmt1cCkKLQkJCQluZXR4ZW5fbmljX3NldF9saW5rX3BhcmFtZXRlcnMoYWRhcHRlci0+Ci0JCQkJCQkJICAgICAgIHBvcnRbcG9ydG5vXSk7CiAKLQkJfQotCQl2YWwgPSB2YWwgPj4gMTsKLQkJcWdfbGlua3N1cCA9IHFnX2xpbmtzdXAgPj4gMTsKKwlsaW5rdXAgPSB2YWwgJiAxOworCisJaWYgKGxpbmt1cCAhPSAocWdfbGlua3N1cCAmIDEpKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyBQT1JUICVkIGxpbmsgJXNcbiIsCisJCSAgICAgICBhZGFwdGVyLT5uZXRkZXYtPm5hbWUsCisJCSAgICAgICBuZXR4ZW5fbmljX2RyaXZlcl9uYW1lLCBwb3J0bm8sCisJCSAgICAgICAoKGxpbmt1cCA9PSAwKSA/ICJkb3duIiA6ICJ1cCIpKTsKKwkJbmV0eGVuX2luZGljYXRlX2xpbmtfc3RhdHVzKGFkYXB0ZXIsIGxpbmt1cCk7CisJCWlmIChsaW5rdXApCisJCQluZXR4ZW5fbmljX3NldF9saW5rX3BhcmFtZXRlcnMoYWRhcHRlcik7CisKIAl9Ci0KLQlhZGFwdGVyLT5zdGF0cy5vdGhlcmludHMrKzsKLQogfQogCiB2b2lkIG5ldHhlbl9uaWNfZ2JlX2hhbmRsZV9waHlfaW50cihzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIpCkBAIC0xODIsMjYgKzE3MSwyOCBAQAogCiB2b2lkIG5ldHhlbl9uaWNfeGdiZV9oYW5kbGVfcGh5X2ludHIoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyKQogewotCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLT5wb3J0WzBdLT5uZXRkZXY7Ci0JdTMyIHZhbDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OworCXUzMiB2YWwsIHZhbDE7CiAKIAkvKiBXSU5ET1cgPSAxICovCiAJdmFsID0gcmVhZGwoTkVUWEVOX0NSQl9OT1JNQUxJWkUoYWRhcHRlciwgQ1JCX1hHX1NUQVRFKSk7CisJdmFsID4+PSAocGh5c2ljYWxfcG9ydFthZGFwdGVyLT5wb3J0bnVtXSAqIDgpOworCXZhbDEgPSB2YWwgJiAweGZmOwogCi0JaWYgKGFkYXB0ZXItPmFody54Z19saW5rdXAgPT0gMSAmJiB2YWwgIT0gWEdfTElOS19VUCkgeworCWlmIChhZGFwdGVyLT5haHcueGdfbGlua3VwID09IDEgJiYgdmFsMSAhPSBYR19MSU5LX1VQKSB7CiAJCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyBOSUMgTGluayBpcyBkb3duXG4iLAogCQkgICAgICAgbmV0eGVuX25pY19kcml2ZXJfbmFtZSwgbmV0ZGV2LT5uYW1lKTsKIAkJYWRhcHRlci0+YWh3LnhnX2xpbmt1cCA9IDA7CiAJCS8qIHJlYWQgdHdpY2UgdG8gY2xlYXIgc3RpY2t5IGJpdHMgKi8KIAkJLyogV0lORE9XID0gMCAqLwotCQluZXR4ZW5fbmljX3JlYWRfdzAoYWRhcHRlciwgTkVUWEVOX05JVV9YR19TVEFUVVMsICZ2YWwpOwotCQluZXR4ZW5fbmljX3JlYWRfdzAoYWRhcHRlciwgTkVUWEVOX05JVV9YR19TVEFUVVMsICZ2YWwpOworCQluZXR4ZW5fbmljX3JlYWRfdzAoYWRhcHRlciwgTkVUWEVOX05JVV9YR19TVEFUVVMsICZ2YWwxKTsKKwkJbmV0eGVuX25pY19yZWFkX3cwKGFkYXB0ZXIsIE5FVFhFTl9OSVVfWEdfU1RBVFVTLCAmdmFsMSk7CiAKIAkJaWYgKCh2YWwgJiAweGZmYikgIT0gMHhmZmIpIHsKIAkJCXByaW50ayhLRVJOX0lORk8gIiVzIElTUjogU3luYy9BbGlnbiBCQUQ6IDB4JTA4eFxuIiwKLQkJCSAgICAgICBuZXR4ZW5fbmljX2RyaXZlcl9uYW1lLCB2YWwpOworCQkJICAgICAgIG5ldHhlbl9uaWNfZHJpdmVyX25hbWUsIHZhbDEpOwogCQl9Ci0JfSBlbHNlIGlmIChhZGFwdGVyLT5haHcueGdfbGlua3VwID09IDAgJiYgdmFsID09IFhHX0xJTktfVVApIHsKKwl9IGVsc2UgaWYgKGFkYXB0ZXItPmFody54Z19saW5rdXAgPT0gMCAmJiB2YWwxID09IFhHX0xJTktfVVApIHsKIAkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzIE5JQyBMaW5rIGlzIHVwXG4iLAogCQkgICAgICAgbmV0eGVuX25pY19kcml2ZXJfbmFtZSwgbmV0ZGV2LT5uYW1lKTsKIAkJYWRhcHRlci0+YWh3LnhnX2xpbmt1cCA9IDE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pY19tYWluLmMgYi9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pY19tYWluLmMKaW5kZXggN2QyNTI1ZS4uNGUzMmJiNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWNfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L25ldHhlbi9uZXR4ZW5fbmljX21haW4uYwpAQCAtMzYsMTEgKzM2LDExIEBACiAjaW5jbHVkZSAibmV0eGVuX25pY19ody5oIgogCiAjaW5jbHVkZSAibmV0eGVuX25pYy5oIgotI2RlZmluZSBERUZJTkVfR0xPQkFMX1JFQ1ZfQ1JCCiAjaW5jbHVkZSAibmV0eGVuX25pY19waGFuX3JlZy5oIgogCiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bmV0L2lwLmg+CiAKIE1PRFVMRV9ERVNDUklQVElPTigiTmV0WGVuIE11bHRpIHBvcnQgKDEvMTApIEdpZ2FiaXQgTmV0d29yayBEcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKQEAgLTc2LDYgKzc2LDggQEAKICNlbmRpZgogc3RhdGljIGlycXJldHVybl90IG5ldHhlbl9pbnRyKGludCBpcnEsIHZvaWQgKmRhdGEpOwogCitpbnQgcGh5c2ljYWxfcG9ydFtdID0gezAsIDEsIDIsIDN9OworCiAvKiAgUENJIERldmljZSBJRCBUYWJsZSAgKi8KIHN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBuZXR4ZW5fcGNpX3RibFtdIF9fZGV2aW5pdGRhdGEgPSB7CiAJe1BDSV9ERVZJQ0UoMHg0MDQwLCAweDAwMDEpfSwKQEAgLTkzLDYgKzk1LDY3IEBACiBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqbmV0eGVuX3dvcmtxOwogc3RhdGljIHZvaWQgbmV0eGVuX3dhdGNoZG9nKHVuc2lnbmVkIGxvbmcpOwogCitzdGF0aWMgaW5saW5lIHZvaWQgbmV0eGVuX25pY191cGRhdGVfY21kX3Byb2R1Y2VyKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwKKwkJCQkJCQl1aW50MzJfdCBjcmJfcHJvZHVjZXIpCit7CisJc3dpdGNoIChhZGFwdGVyLT5wb3J0bnVtKSB7CisJCWNhc2UgMDoKKwkJCXdyaXRlbChjcmJfcHJvZHVjZXIsIE5FVFhFTl9DUkJfTk9STUFMSVpFCisJCQkJCShhZGFwdGVyLCBDUkJfQ01EX1BST0RVQ0VSX09GRlNFVCkpOworCQkJcmV0dXJuOworCQljYXNlIDE6CisJCQl3cml0ZWwoY3JiX3Byb2R1Y2VyLCBORVRYRU5fQ1JCX05PUk1BTElaRQorCQkJCQkoYWRhcHRlciwgQ1JCX0NNRF9QUk9EVUNFUl9PRkZTRVRfMSkpOworCQkJcmV0dXJuOworCQljYXNlIDI6CisJCQl3cml0ZWwoY3JiX3Byb2R1Y2VyLCBORVRYRU5fQ1JCX05PUk1BTElaRQorCQkJCQkoYWRhcHRlciwgQ1JCX0NNRF9QUk9EVUNFUl9PRkZTRVRfMikpOworCQkJcmV0dXJuOworCQljYXNlIDM6CisJCQl3cml0ZWwoY3JiX3Byb2R1Y2VyLCBORVRYRU5fQ1JCX05PUk1BTElaRQorCQkJCQkoYWRhcHRlciwgQ1JCX0NNRF9QUk9EVUNFUl9PRkZTRVRfMykpOworCQkJcmV0dXJuOworCQlkZWZhdWx0OgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiV2UgdHJpZWQgdG8gdXBkYXRlICIKKwkJCQkJIkNSQl9DTURfUFJPRFVDRVJfT0ZGU0VUIGZvciBpbnZhbGlkICIKKwkJCQkJIlBDSSBmdW5jdGlvbiBpZCAlZFxuIiwKKwkJCQkJYWRhcHRlci0+cG9ydG51bSk7CisJCQlyZXR1cm47CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbmV0eGVuX25pY191cGRhdGVfY21kX2NvbnN1bWVyKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwKKwkJCQkJCQl1MzIgY3JiX2NvbnN1bWVyKQoreworCXN3aXRjaCAoYWRhcHRlci0+cG9ydG51bSkgeworCQljYXNlIDA6CisJCQl3cml0ZWwoY3JiX2NvbnN1bWVyLCBORVRYRU5fQ1JCX05PUk1BTElaRQorCQkJCShhZGFwdGVyLCBDUkJfQ01EX0NPTlNVTUVSX09GRlNFVCkpOworCQkJcmV0dXJuOworCQljYXNlIDE6CisJCQl3cml0ZWwoY3JiX2NvbnN1bWVyLCBORVRYRU5fQ1JCX05PUk1BTElaRQorCQkJCShhZGFwdGVyLCBDUkJfQ01EX0NPTlNVTUVSX09GRlNFVF8xKSk7CisJCQlyZXR1cm47CisJCWNhc2UgMjoKKwkJCXdyaXRlbChjcmJfY29uc3VtZXIsIE5FVFhFTl9DUkJfTk9STUFMSVpFCisJCQkJKGFkYXB0ZXIsIENSQl9DTURfQ09OU1VNRVJfT0ZGU0VUXzIpKTsKKwkJCXJldHVybjsKKwkJY2FzZSAzOgorCQkJd3JpdGVsKGNyYl9jb25zdW1lciwgTkVUWEVOX0NSQl9OT1JNQUxJWkUKKwkJCQkoYWRhcHRlciwgQ1JCX0NNRF9DT05TVU1FUl9PRkZTRVRfMykpOworCQkJcmV0dXJuOworCQlkZWZhdWx0OgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiV2UgdHJpZWQgdG8gdXBkYXRlICIKKwkJCQkJIkNSQl9DTURfUFJPRFVDRVJfT0ZGU0VUIGZvciBpbnZhbGlkICIKKwkJCQkJIlBDSSBmdW5jdGlvbiBpZCAlZFxuIiwKKwkJCQkJYWRhcHRlci0+cG9ydG51bSk7CisJCQlyZXR1cm47CisJfQorfQorCisjZGVmaW5lCUFEQVBURVJfTElTVF9TSVpFIDEyCitpbnQgbmV0eGVuX2NhcmRzX2ZvdW5kOworCiAvKgogICogbmV0eGVuX25pY19wcm9iZSgpCiAgKgpAQCAtMTEwLDI2ICsxNzMsMzAgQEAKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gTlVMTDsKIAlzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBOVUxMOwotCXN0cnVjdCBuZXR4ZW5fcG9ydCAqcG9ydCA9IE5VTEw7CiAJdm9pZCBfX2lvbWVtICptZW1fcHRyMCA9IE5VTEw7CiAJdm9pZCBfX2lvbWVtICptZW1fcHRyMSA9IE5VTEw7CiAJdm9pZCBfX2lvbWVtICptZW1fcHRyMiA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBmaXJzdF9wYWdlX2dyb3VwX2VuZDsKKwl1bnNpZ25lZCBsb25nIGZpcnN0X3BhZ2VfZ3JvdXBfc3RhcnQ7CisKIAogCXU4IF9faW9tZW0gKmRiX3B0ciA9IE5VTEw7CiAJdW5zaWduZWQgbG9uZyBtZW1fYmFzZSwgbWVtX2xlbiwgZGJfYmFzZSwgZGJfbGVuOwotCWludCBwY2lfdXNpbmdfZGFjLCBpLCBlcnI7CisJaW50IHBjaV91c2luZ19kYWMsIGkgPSAwLCBlcnI7CiAJaW50IHJpbmc7CiAJc3RydWN0IG5ldHhlbl9yZWN2X2NvbnRleHQgKnJlY3ZfY3R4ID0gTlVMTDsKIAlzdHJ1Y3QgbmV0eGVuX3Jjdl9kZXNjX2N0eCAqcmN2X2Rlc2MgPSBOVUxMOwogCXN0cnVjdCBuZXR4ZW5fY21kX2J1ZmZlciAqY21kX2J1Zl9hcnIgPSBOVUxMOwogCXU2NCBtYWNfYWRkcltGTEFTSF9OVU1fUE9SVFMgKyAxXTsKIAlpbnQgdmFsaWRfbWFjID0gMDsKKwl1MzIgdmFsOworCWludCBwY2lfZnVuY19pZCA9IFBDSV9GVU5DKHBkZXYtPmRldmZuKTsKIAogCXByaW50ayhLRVJOX0lORk8gIiVzIFxuIiwgbmV0eGVuX25pY19kcml2ZXJfc3RyaW5nKTsKLQkvKiBJbiBjdXJyZW50IHNjaGVtZSwgd2UgdXNlIG9ubHkgUENJIGZ1bmN0aW9uIDAgKi8KLQlpZiAoUENJX0ZVTkMocGRldi0+ZGV2Zm4pICE9IDApIHsKLQkJRFBSSU5USyhFUlIsICJOZXRYZW4gZnVuY3Rpb24gJWQgd2lsbCBub3QgYmUgZW5hYmxlZC5cbiIsCi0JCQlQQ0lfRlVOQyhwZGV2LT5kZXZmbikpOworCisJaWYgKHBkZXYtPmNsYXNzICE9IDB4MDIwMDAwKSB7CisJCXByaW50ayhLRVJOX0VSUiJOZXRYZW4gZnVuY3Rpb24gJWQsIGNsYXNzICV4IHdpbGwgbm90IgorCQkJCSJiZSBlbmFibGVkLlxuIixwY2lfZnVuY19pZCwgcGRldi0+Y2xhc3MpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAJaWYgKChlcnIgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KSkpCkBAIC0xNTYsMTggKzIyMyw1MiBAQAogCQlwY2lfdXNpbmdfZGFjID0gMDsKIAl9CiAKKworCW5ldGRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIpKTsKKwlpZighbmV0ZGV2KSB7CisJCXByaW50ayhLRVJOX0VSUiIlczogRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlICIKKwkJCQkiZGV2aWNlIGJsb2NrLkNoZWNrIHN5c3RlbSBtZW1vcnkgcmVzb3VyY2UiCisJCQkJIiB1c2FnZS5cbiIsIG5ldHhlbl9uaWNfZHJpdmVyX25hbWUpOworCQlnb3RvIGVycl9vdXRfZnJlZV9yZXM7CisJfQorCisJU0VUX01PRFVMRV9PV05FUihuZXRkZXYpOworCVNFVF9ORVRERVZfREVWKG5ldGRldiwgJnBkZXYtPmRldik7CisKKwlhZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCW1lbXNldChhZGFwdGVyLCAwICwgc2l6ZW9mKHN0cnVjdCBuZXR4ZW5fYWRhcHRlcikpOworCisJYWRhcHRlci0+YWh3LnBkZXYgPSBwZGV2OworCWFkYXB0ZXItPmFody5wY2lfZnVuYyAgPSBwY2lfZnVuY19pZDsKKwlzcGluX2xvY2tfaW5pdCgmYWRhcHRlci0+dHhfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmFkYXB0ZXItPmxvY2spOworCiAJLyogcmVtYXAgcGh5cyBhZGRyZXNzICovCiAJbWVtX2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7CS8qIDAgaXMgZm9yIEJBUiAwICovCiAJbWVtX2xlbiA9IHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCk7CiAKIAkvKiAxMjggTWVnIG9mIG1lbW9yeSAqLwotCW1lbV9wdHIwID0gaW9yZW1hcChtZW1fYmFzZSwgRklSU1RfUEFHRV9HUk9VUF9TSVpFKTsKLQltZW1fcHRyMSA9Ci0JICAgIGlvcmVtYXAobWVtX2Jhc2UgKyBTRUNPTkRfUEFHRV9HUk9VUF9TVEFSVCwgU0VDT05EX1BBR0VfR1JPVVBfU0laRSk7Ci0JbWVtX3B0cjIgPQotCSAgICBpb3JlbWFwKG1lbV9iYXNlICsgVEhJUkRfUEFHRV9HUk9VUF9TVEFSVCwgVEhJUkRfUEFHRV9HUk9VUF9TSVpFKTsKKwlpZiAobWVtX2xlbiA9PSBORVRYRU5fUENJXzEyOE1CX1NJWkUpIHsKKwkJbWVtX3B0cjAgPSBpb3JlbWFwKG1lbV9iYXNlLCBGSVJTVF9QQUdFX0dST1VQX1NJWkUpOworCQltZW1fcHRyMSA9IGlvcmVtYXAobWVtX2Jhc2UgKyBTRUNPTkRfUEFHRV9HUk9VUF9TVEFSVCwKKwkJCQlTRUNPTkRfUEFHRV9HUk9VUF9TSVpFKTsKKwkJbWVtX3B0cjIgPSBpb3JlbWFwKG1lbV9iYXNlICsgVEhJUkRfUEFHRV9HUk9VUF9TVEFSVCwKKwkJCQlUSElSRF9QQUdFX0dST1VQX1NJWkUpOworCQlmaXJzdF9wYWdlX2dyb3VwX3N0YXJ0ID0gRklSU1RfUEFHRV9HUk9VUF9TVEFSVDsKKwkJZmlyc3RfcGFnZV9ncm91cF9lbmQgICA9IEZJUlNUX1BBR0VfR1JPVVBfRU5EOworCX0gZWxzZSBpZiAobWVtX2xlbiA9PSBORVRYRU5fUENJXzMyTUJfU0laRSkgeworCQltZW1fcHRyMSA9IGlvcmVtYXAobWVtX2Jhc2UsIFNFQ09ORF9QQUdFX0dST1VQX1NJWkUpOworCQltZW1fcHRyMiA9IGlvcmVtYXAobWVtX2Jhc2UgKyBUSElSRF9QQUdFX0dST1VQX1NUQVJUIC0KKwkJCVNFQ09ORF9QQUdFX0dST1VQX1NUQVJULCBUSElSRF9QQUdFX0dST1VQX1NJWkUpOworCQlmaXJzdF9wYWdlX2dyb3VwX3N0YXJ0ID0gMDsKKwkJZmlyc3RfcGFnZV9ncm91cF9lbmQgICA9IDA7CisJfSBlbHNlIHsKKwkJZXJyID0gLUVJTzsgCisJCWdvdG8gZXJyX291dF9mcmVlX25ldGRldjsKKwl9CiAKLQlpZiAoKG1lbV9wdHIwID09IDBVTCkgfHwgKG1lbV9wdHIxID09IDBVTCkgfHwgKG1lbV9wdHIyID09IDBVTCkpIHsKKwlpZiAoKChtZW1fcHRyMCA9PSAwVUwpICYmIChtZW1fbGVuID09IE5FVFhFTl9QQ0lfMTI4TUJfU0laRSkpIHx8CisJCQkobWVtX3B0cjEgPT0gMFVMKSB8fCAobWVtX3B0cjIgPT0gMFVMKSkgewogCQlEUFJJTlRLKEVSUiwKIAkJCSJDYW5ub3QgcmVtYXAgYWRhcHRlciBtZW1vcnkgYWJvcnRpbmcuOiIKIAkJCSIwIC0+ICVwLCAxIC0+ICVwLCAyIC0+ICVwXG4iLApAQCAtMTk3LDMwICsyOTgsODcgQEAKIAl9CiAJRFBSSU5USyhJTkZPLCAiZG9vcmJlbGwgaW9yZW1hcGVkIGF0ICVwXG4iLCBkYl9wdHIpOwogCi0vKgotICogICAgICBBbGxvY2F0ZSBhIGFkYXB0ZXIgc3RydWN0dXJlIHdoaWNoIHdpbGwgbWFuYWdlIGFsbCB0aGUgaW5pdGlhbGl6YXRpb24KLSAqICAgICAgYXMgd2VsbCBhcyB0aGUgY29tbW9uIHJlc291cmNlcyBmb3IgYWxsIHBvcnRzLi4uCi0gKiAgICAgIGFsbCB0aGUgcG9ydHMgd2lsbCBoYXZlIHBvaW50ZXIgdG8gdGhpcyBhZGFwdGVyIGFzIHdlbGwgYXMgQWRhcHRlcgotICogICAgICB3aWxsIGhhdmUgcG9pbnRlcnMgb2YgYWxsIHRoZSBwb3J0cyBzdHJ1Y3R1cmVzLgotICovCisJYWRhcHRlci0+YWh3LnBjaV9iYXNlMCA9IG1lbV9wdHIwOworCWFkYXB0ZXItPmFody5maXJzdF9wYWdlX2dyb3VwX3N0YXJ0ID0gZmlyc3RfcGFnZV9ncm91cF9zdGFydDsKKwlhZGFwdGVyLT5haHcuZmlyc3RfcGFnZV9ncm91cF9lbmQgICA9IGZpcnN0X3BhZ2VfZ3JvdXBfZW5kOworCWFkYXB0ZXItPmFody5wY2lfYmFzZTEgPSBtZW1fcHRyMTsKKwlhZGFwdGVyLT5haHcucGNpX2Jhc2UyID0gbWVtX3B0cjI7CisJYWRhcHRlci0+YWh3LmRiX2Jhc2UgPSBkYl9wdHI7CisJYWRhcHRlci0+YWh3LmRiX2xlbiA9IGRiX2xlbjsKIAotCS8qIE9uZSBhZGFwdGVyIHN0cnVjdHVyZSBmb3IgYWxsIDQgcG9ydHMuLi4uICAgKi8KLQlhZGFwdGVyID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG5ldHhlbl9hZGFwdGVyKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGFkYXB0ZXIgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDb3VsZCBub3QgYWxsb2NhdGUgYWRhcHRlciBtZW1vcnk6JWRcbiIsCi0JCSAgICAgICBuZXR4ZW5fbmljX2RyaXZlcl9uYW1lLAotCQkgICAgICAgKGludClzaXplb2Yoc3RydWN0IG5ldHhlbl9hZGFwdGVyKSk7Ci0JCWVyciA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyX291dF9kYnVubWFwOwotCX0KKwlhZGFwdGVyLT5uZXRkZXYgID0gbmV0ZGV2OworCWFkYXB0ZXItPnBkZXYgICAgPSBwZGV2OworCWFkYXB0ZXItPnBvcnRudW0gPSBwY2lfZnVuY19pZDsKIAotCWFkYXB0ZXItPm1heF90eF9kZXNjX2NvdW50ID0gTUFYX0NNRF9ERVNDUklQVE9SUzsKLQlhZGFwdGVyLT5tYXhfcnhfZGVzY19jb3VudCA9IE1BWF9SQ1ZfREVTQ1JJUFRPUlM7CisJbmV0ZGV2LT5vcGVuCQkgICA9IG5ldHhlbl9uaWNfb3BlbjsKKwluZXRkZXYtPnN0b3AJCSAgID0gbmV0eGVuX25pY19jbG9zZTsKKwluZXRkZXYtPmhhcmRfc3RhcnRfeG1pdCAgICA9IG5ldHhlbl9uaWNfeG1pdF9mcmFtZTsKKwluZXRkZXYtPmdldF9zdGF0cwkgICA9IG5ldHhlbl9uaWNfZ2V0X3N0YXRzOwkKKwluZXRkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IG5ldHhlbl9uaWNfc2V0X211bHRpOworCW5ldGRldi0+c2V0X21hY19hZGRyZXNzICAgID0gbmV0eGVuX25pY19zZXRfbWFjOworCW5ldGRldi0+Y2hhbmdlX210dQkgICA9IG5ldHhlbl9uaWNfY2hhbmdlX210dTsKKwluZXRkZXYtPnR4X3RpbWVvdXQJICAgPSBuZXR4ZW5fdHhfdGltZW91dDsKKwluZXRkZXYtPndhdGNoZG9nX3RpbWVvICAgICA9IEhaOworCisJbmV0eGVuX25pY19jaGFuZ2VfbXR1KG5ldGRldiwgbmV0ZGV2LT5tdHUpOworCisJU0VUX0VUSFRPT0xfT1BTKG5ldGRldiwgJm5ldHhlbl9uaWNfZXRodG9vbF9vcHMpOworCW5ldGRldi0+cG9sbCA9IG5ldHhlbl9uaWNfcG9sbDsKKwluZXRkZXYtPndlaWdodCA9IE5FVFhFTl9ORVRERVZfV0VJR0hUOworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisJbmV0ZGV2LT5wb2xsX2NvbnRyb2xsZXIgPSBuZXR4ZW5fbmljX3BvbGxfY29udHJvbGxlcjsKKyNlbmRpZgorCS8qIFNjYXR0ZXJHYXRoZXIgc3VwcG9ydCAqLworCW5ldGRldi0+ZmVhdHVyZXMgPSBORVRJRl9GX1NHOworCW5ldGRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9JUF9DU1VNOworCW5ldGRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9UU087CisKKwlpZiAocGNpX3VzaW5nX2RhYykKKwkJbmV0ZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0hJR0hETUE7CisKKwlpZiAocGNpX2VuYWJsZV9tc2kocGRldikpIHsKKwkJYWRhcHRlci0+ZmxhZ3MgJj0gfk5FVFhFTl9OSUNfTVNJX0VOQUJMRUQ7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB1bmFibGUgdG8gYWxsb2NhdGUgTVNJIGludGVycnVwdCIKKwkJICAgICAgICIgZXJyb3JcbiIsIG5ldHhlbl9uaWNfZHJpdmVyX25hbWUpOworCX0gZWxzZQorCQlhZGFwdGVyLT5mbGFncyB8PSBORVRYRU5fTklDX01TSV9FTkFCTEVEOworCisJbmV0ZGV2LT5pcnEgPSBwZGV2LT5pcnE7CisJSU5JVF9XT1JLKCZhZGFwdGVyLT50eF90aW1lb3V0X3Rhc2ssIG5ldHhlbl90eF90aW1lb3V0X3Rhc2spOworCisJLyoKKwkgKiBTZXQgdGhlIENSQiB3aW5kb3cgdG8gaW52YWxpZC4gSWYgYW55IHJlZ2lzdGVyIGluIHdpbmRvdyAwIGlzCisJICogYWNjZXNzZWQgaXQgc2hvdWxkIHNldCB0aGUgd2luZG93IHRvIDAgYW5kIHRoZW4gcmVzZXQgaXQgdG8gMS4KKwkgKi8KKwlhZGFwdGVyLT5jdXJyX3dpbmRvdyA9IDI1NTsKKworCS8qIGluaXRpYWxpemUgdGhlIGFkYXB0ZXIgKi8KKwluZXR4ZW5faW5pdGlhbGl6ZV9hZGFwdGVyX2h3KGFkYXB0ZXIpOworCisjaWZkZWYgQ09ORklHX1BQQworCWlmICgoYWRhcHRlci0+YWh3LmJvYXJkY2ZnLmJvYXJkX3R5cGUgPT0KKwkJTkVUWEVOX0JSRFRZUEVfUDJfU0IzMV8xMEdfSU1FWikgJiYKKwkJCShwY2lfZnVuY19pZCA9PSAyKSkKKwkJICAgIGdvdG8gZXJyX291dF9mcmVlX2FkYXB0ZXI7CisjZW5kaWYgLyogQ09ORklHX1BQQyAqLworCisJLyoKKwkgKiAgQWRhcHRlciBpbiBvdXIgY2FzZSBpcyBxdWFkIHBvcnQgc28gaW5pdGlhbGl6ZSBpdCBiZWZvcmUKKwkgKiAgaW5pdGlhbGl6aW5nIHRoZSBwb3J0cworCSAqLworCisJbmV0eGVuX2luaXRpYWxpemVfYWRhcHRlcl9vcHMoYWRhcHRlcik7CisKKwlhZGFwdGVyLT5tYXhfdHhfZGVzY19jb3VudCA9IE1BWF9DTURfREVTQ1JJUFRPUlNfSE9TVDsKKwlpZiAoKGFkYXB0ZXItPmFody5ib2FyZGNmZy5ib2FyZF90eXBlID09IE5FVFhFTl9CUkRUWVBFX1AyX1NCMzVfNEcpIHx8CisJCQkoYWRhcHRlci0+YWh3LmJvYXJkY2ZnLmJvYXJkX3R5cGUgPT0gCisJCQkgTkVUWEVOX0JSRFRZUEVfUDJfU0IzMV8yRykpIAorCQlhZGFwdGVyLT5tYXhfcnhfZGVzY19jb3VudCA9IE1BWF9SQ1ZfREVTQ1JJUFRPUlNfMUc7CisJZWxzZQorCQlhZGFwdGVyLT5tYXhfcnhfZGVzY19jb3VudCA9IE1BWF9SQ1ZfREVTQ1JJUFRPUlM7CiAJYWRhcHRlci0+bWF4X2p1bWJvX3J4X2Rlc2NfY291bnQgPSBNQVhfSlVNQk9fUkNWX0RFU0NSSVBUT1JTOwogCWFkYXB0ZXItPm1heF9scm9fcnhfZGVzY19jb3VudCA9IE1BWF9MUk9fUkNWX0RFU0NSSVBUT1JTOwogCi0JcGNpX3NldF9kcnZkYXRhKHBkZXYsIGFkYXB0ZXIpOwotCiAJY21kX2J1Zl9hcnIgPSAoc3RydWN0IG5ldHhlbl9jbWRfYnVmZmVyICopdm1hbGxvYyhUWF9SSU5HU0laRSk7CiAJaWYgKGNtZF9idWZfYXJyID09IE5VTEwpIHsKIAkJcHJpbnRrKEtFUk5fRVJSCkBAIC0yMzAsNiArMzg4LDcgQEAKIAkJZ290byBlcnJfb3V0X2ZyZWVfYWRhcHRlcjsKIAl9CiAJbWVtc2V0KGNtZF9idWZfYXJyLCAwLCBUWF9SSU5HU0laRSk7CisJYWRhcHRlci0+Y21kX2J1Zl9hcnIgPSBjbWRfYnVmX2FycjsKIAogCWZvciAoaSA9IDA7IGkgPCBNQVhfUkNWX0NUWDsgKytpKSB7CiAJCXJlY3ZfY3R4ID0gJmFkYXB0ZXItPnJlY3ZfY3R4W2ldOwpAQCAtMjc3LDM0ICs0MzYsMjEgQEAKIAogCX0KIAotCWFkYXB0ZXItPmNtZF9idWZfYXJyID0gY21kX2J1Zl9hcnI7Ci0JYWRhcHRlci0+YWh3LnBjaV9iYXNlMCA9IG1lbV9wdHIwOwotCWFkYXB0ZXItPmFody5wY2lfYmFzZTEgPSBtZW1fcHRyMTsKLQlhZGFwdGVyLT5haHcucGNpX2Jhc2UyID0gbWVtX3B0cjI7Ci0JYWRhcHRlci0+YWh3LmRiX2Jhc2UgPSBkYl9wdHI7Ci0JYWRhcHRlci0+YWh3LmRiX2xlbiA9IGRiX2xlbjsKLQlzcGluX2xvY2tfaW5pdCgmYWRhcHRlci0+dHhfbG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmFkYXB0ZXItPmxvY2spOwogCW5ldHhlbl9pbml0aWFsaXplX2FkYXB0ZXJfc3coYWRhcHRlcik7CS8qIGluaXRpYWxpemUgdGhlIGJ1ZmZlcnMgaW4gYWRhcHRlciAqLworCisJLyogTWV6eiBjYXJkcyBoYXZlIFBDSSBmdW5jdGlvbiAwLDIsMyBlbmFibGVkICovCisJaWYgKChhZGFwdGVyLT5haHcuYm9hcmRjZmcuYm9hcmRfdHlwZSA9PSBORVRYRU5fQlJEVFlQRV9QMl9TQjMxXzEwR19JTUVaKQorCQkmJiAocGNpX2Z1bmNfaWQgPj0gMikpCisJCQlhZGFwdGVyLT5wb3J0bnVtID0gcGNpX2Z1bmNfaWQgLSAyOworCiAjaWZkZWYgQ09ORklHX0lBNjQKLQluZXR4ZW5fcGluaXRfZnJvbV9yb20oYWRhcHRlciwgMCk7Ci0JdWRlbGF5KDUwMCk7Ci0JbmV0eGVuX2xvYWRfZmlybXdhcmUoYWRhcHRlcik7CisJaWYoYWRhcHRlci0+cG9ydG51bSA9PSAwKSB7CisJCW5ldHhlbl9waW5pdF9mcm9tX3JvbShhZGFwdGVyLCAwKTsKKwkJdWRlbGF5KDUwMCk7CisJCW5ldHhlbl9sb2FkX2Zpcm13YXJlKGFkYXB0ZXIpOworCX0KICNlbmRpZgogCi0JLyoKLQkgKiBTZXQgdGhlIENSQiB3aW5kb3cgdG8gaW52YWxpZC4gSWYgYW55IHJlZ2lzdGVyIGluIHdpbmRvdyAwIGlzCi0JICogYWNjZXNzZWQgaXQgc2hvdWxkIHNldCB0aGUgd2luZG93IHRvIDAgYW5kIHRoZW4gcmVzZXQgaXQgdG8gMS4KLQkgKi8KLQlhZGFwdGVyLT5jdXJyX3dpbmRvdyA9IDI1NTsKLQkvKgotCSAqICBBZGFwdGVyIGluIG91ciBjYXNlIGlzIHF1YWQgcG9ydCBzbyBpbml0aWFsaXplIGl0IGJlZm9yZQotCSAqICBpbml0aWFsaXppbmcgdGhlIHBvcnRzCi0JICovCi0JbmV0eGVuX2luaXRpYWxpemVfYWRhcHRlcl9odyhhZGFwdGVyKTsJLyogaW5pdGlhbGl6ZSB0aGUgYWRhcHRlciAqLwotCi0JbmV0eGVuX2luaXRpYWxpemVfYWRhcHRlcl9vcHMoYWRhcHRlcik7Ci0KIAlpbml0X3RpbWVyKCZhZGFwdGVyLT53YXRjaGRvZ190aW1lcik7CiAJYWRhcHRlci0+YWh3LnhnX2xpbmt1cCA9IDA7CiAJYWRhcHRlci0+d2F0Y2hkb2dfdGltZXIuZnVuY3Rpb24gPSAmbmV0eGVuX3dhdGNoZG9nOwpAQCAtMzE0LDEyICs0NjAsMTIgQEAKIAlhZGFwdGVyLT5wcm9jX2NtZF9idWZfY291bnRlciA9IDA7CiAJYWRhcHRlci0+YWh3LnJldmlzaW9uX2lkID0gbnhfcDJfaWQ7CiAKLQlpZiAocGNpX2VuYWJsZV9tc2kocGRldikpIHsKLQkJYWRhcHRlci0+ZmxhZ3MgJj0gfk5FVFhFTl9OSUNfTVNJX0VOQUJMRUQ7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB1bmFibGUgdG8gYWxsb2NhdGUgTVNJIGludGVycnVwdCIKLQkJICAgICAgICIgZXJyb3JcbiIsIG5ldHhlbl9uaWNfZHJpdmVyX25hbWUpOwotCX0gZWxzZQotCQlhZGFwdGVyLT5mbGFncyB8PSBORVRYRU5fTklDX01TSV9FTkFCTEVEOworCS8qIG1ha2Ugc3VyZSBXaW5kb3cgPT0gMSAqLworCW5ldHhlbl9uaWNfcGNpX2NoYW5nZV9jcmJ3aW5kb3coYWRhcHRlciwgMSk7CisKKwluZXR4ZW5fbmljX3VwZGF0ZV9jbWRfcHJvZHVjZXIoYWRhcHRlciwgMCk7CisJbmV0eGVuX25pY191cGRhdGVfY21kX2NvbnN1bWVyKGFkYXB0ZXIsIDApOworCXdyaXRlbCgwLCBORVRYRU5fQ1JCX05PUk1BTElaRShhZGFwdGVyLCBDUkJfSE9TVF9DTURfQUREUl9MTykpOwogCiAJaWYgKG5ldHhlbl9pc19mbGFzaF9zdXBwb3J0ZWQoYWRhcHRlcikgPT0gMCAmJgogCSAgICBuZXR4ZW5fZ2V0X2ZsYXNoX21hY19hZGRyKGFkYXB0ZXIsIG1hY19hZGRyKSA9PSAwKQpAQCAtMzI3LDE1MyArNDczLDExOCBAQAogCWVsc2UKIAkJdmFsaWRfbWFjID0gMDsKIAotCS8qCi0JICogSW5pdGlhbGl6ZSBhbGwgdGhlIENSQiByZWdpc3RlcnMgaGVyZS4KLQkgKi8KLQl3cml0ZWwoMCwgTkVUWEVOX0NSQl9OT1JNQUxJWkUoYWRhcHRlciwgQ1JCX0NNRF9QUk9EVUNFUl9PRkZTRVQpKTsKLQl3cml0ZWwoMCwgTkVUWEVOX0NSQl9OT1JNQUxJWkUoYWRhcHRlciwgQ1JCX0NNRF9DT05TVU1FUl9PRkZTRVQpKTsKLQl3cml0ZWwoMCwgTkVUWEVOX0NSQl9OT1JNQUxJWkUoYWRhcHRlciwgQ1JCX0hPU1RfQ01EX0FERFJfTE8pKTsKKwlpZiAodmFsaWRfbWFjKSB7CisJCXVuc2lnbmVkIGNoYXIgKnAgPSAodW5zaWduZWQgY2hhciAqKSZtYWNfYWRkclthZGFwdGVyLT5wb3J0bnVtXTsKKwkJbmV0ZGV2LT5kZXZfYWRkclswXSA9ICoocCArIDUpOworCQluZXRkZXYtPmRldl9hZGRyWzFdID0gKihwICsgNCk7CisJCW5ldGRldi0+ZGV2X2FkZHJbMl0gPSAqKHAgKyAzKTsKKwkJbmV0ZGV2LT5kZXZfYWRkclszXSA9ICoocCArIDIpOworCQluZXRkZXYtPmRldl9hZGRyWzRdID0gKihwICsgMSk7CisJCW5ldGRldi0+ZGV2X2FkZHJbNV0gPSAqKHAgKyAwKTsKIAotCS8qIGRvIHRoaXMgYmVmb3JlIHdha2luZyB1cCBwZWdzIHNvIHRoYXQgd2UgaGF2ZSB2YWxpZCBkdW1teSBkbWEgYWRkciAqLwotCWVyciA9IG5ldHhlbl9pbml0aWFsaXplX2FkYXB0ZXJfb2ZmbG9hZChhZGFwdGVyKTsKLQlpZiAoZXJyKSB7CisJCW1lbWNweShuZXRkZXYtPnBlcm1fYWRkciwgbmV0ZGV2LT5kZXZfYWRkciwKKwkJCW5ldGRldi0+YWRkcl9sZW4pOworCQlpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIobmV0ZGV2LT5wZXJtX2FkZHIpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBCYWQgTUFDIGFkZHJlc3MgIgorCQkJCSIlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeC5cbiIsCisJCQkJbmV0eGVuX25pY19kcml2ZXJfbmFtZSwKKwkJCQluZXRkZXYtPmRldl9hZGRyWzBdLAorCQkJCW5ldGRldi0+ZGV2X2FkZHJbMV0sCisJCQkJbmV0ZGV2LT5kZXZfYWRkclsyXSwKKwkJCQluZXRkZXYtPmRldl9hZGRyWzNdLAorCQkJCW5ldGRldi0+ZGV2X2FkZHJbNF0sCisJCQkJbmV0ZGV2LT5kZXZfYWRkcls1XSk7CisJCX0gZWxzZSB7CisJCQlpZiAoYWRhcHRlci0+bWFjYWRkcl9zZXQpCisJCQkJYWRhcHRlci0+bWFjYWRkcl9zZXQoYWRhcHRlciwKKwkJCQkJCQluZXRkZXYtPmRldl9hZGRyKTsKKwkJfQorCX0KKworCWlmIChhZGFwdGVyLT5wb3J0bnVtID09IDApIHsKKwkJZXJyID0gbmV0eGVuX2luaXRpYWxpemVfYWRhcHRlcl9vZmZsb2FkKGFkYXB0ZXIpOworCQlpZiAoZXJyKSAKKwkJCWdvdG8gZXJyX291dF9mcmVlX3J4X2J1ZmZlcjsKKwkJdmFsID0gcmVhZGwoTkVUWEVOX0NSQl9OT1JNQUxJWkUoYWRhcHRlciwgCisJCQkJCU5FVFhFTl9DQU1fUkFNKDB4MWZjKSkpOworCQlpZiAodmFsID09IDB4NTU1NTU1NTUpIHsKKwkJICAgIC8qIFRoaXMgaXMgdGhlIGZpcnN0IGJvb3QgYWZ0ZXIgcG93ZXIgdXAgKi8KKwkJICAgIHZhbCA9IHJlYWRsKE5FVFhFTl9DUkJfTk9STUFMSVpFKGFkYXB0ZXIsCisJCQkJCU5FVFhFTl9ST01VU0JfR0xCX1NXX1JFU0VUKSk7CisJCSAgICBwcmludGsoS0VSTl9JTkZPIk5ldFhlbjogcmVhZCAweCUwOHggZm9yIHJlc2V0IHJlZy5cbiIsdmFsKTsKKwkJICAgIGlmICh2YWwgIT0gMHg4MDAwMGYpIHsKKwkJCS8qIGNsZWFyIHRoZSByZWdpc3RlciBmb3IgZnV0dXJlIHVubG9hZHMvbG9hZHMgKi8KKwkJCXdyaXRlbCgwLCBORVRYRU5fQ1JCX05PUk1BTElaRShhZGFwdGVyLAorCQkJCQkJTkVUWEVOX0NBTV9SQU0oMHgxZmMpKSk7CisJCQlwcmludGsoS0VSTl9FUlIgIkVSUk9SIGluIE5ldFhlbiBIVyBpbml0IHNlcXVlbmNlLlxuIik7CisJCQllcnIgPSAtRU5PREVWOworCQkJZ290byBlcnJfb3V0X2ZyZWVfZGV2OworCQkgICAgfQorCisJCSAgICAvKiBjbGVhciB0aGUgcmVnaXN0ZXIgZm9yIGZ1dHVyZSB1bmxvYWRzL2xvYWRzICovCisJCSAgICB3cml0ZWwoMCwgTkVUWEVOX0NSQl9OT1JNQUxJWkUoYWRhcHRlciwgCisJCQkJCSAgICBORVRYRU5fQ0FNX1JBTSgweDFmYykpKTsKKwkJfQorCQlwcmludGsoS0VSTl9JTkZPICJTdGF0ZTogMHglMHhcbiIsCisJCQlyZWFkbChORVRYRU5fQ1JCX05PUk1BTElaRShhZGFwdGVyLCBDUkJfQ01EUEVHX1NUQVRFKSkpOworCisJCS8qCisJCSAqIFRlbGwgdGhlIGhhcmR3YXJlIG91ciB2ZXJzaW9uIG51bWJlci4KKwkJICovCisJCWkgPSAoX05FVFhFTl9OSUNfTElOVVhfTUFKT1IgPDwgMTYpIAorCQkJfCAoKF9ORVRYRU5fTklDX0xJTlVYX01JTk9SIDw8IDgpKQorCQkJfCAoX05FVFhFTl9OSUNfTElOVVhfU1VCVkVSU0lPTik7CisJCXdyaXRlbChpLCBORVRYRU5fQ1JCX05PUk1BTElaRShhZGFwdGVyLCBDUkJfRFJJVkVSX1ZFUlNJT04pKTsKKworCQkvKiBVbmxvY2sgdGhlIEhXLCBwcm9tcHRpbmcgdGhlIGJvb3Qgc2VxdWVuY2UgKi8KKwkJd3JpdGVsKDEsCisJCQlORVRYRU5fQ1JCX05PUk1BTElaRShhZGFwdGVyLAorCQkJCU5FVFhFTl9ST01VU0JfR0xCX1BFR1RVTkVfRE9ORSkpOworCQkvKiBIYW5kc2hha2Ugd2l0aCB0aGUgY2FyZCBiZWZvcmUgd2UgcmVnaXN0ZXIgdGhlIGRldmljZXMuICovCisJCW5ldHhlbl9waGFudG9tX2luaXQoYWRhcHRlciwgTkVUWEVOX05JQ19QRUdfVFVORSk7CisJfQorCisJLyoKKwkgKiBTZWUgaWYgdGhlIGZpcm13YXJlIGdhdmUgdXMgYSB2aXJ0dWFsLXBoeXNpY2FsIHBvcnQgbWFwcGluZy4KKwkgKi8KKwlpID0gcmVhZGwoTkVUWEVOX0NSQl9OT1JNQUxJWkUoYWRhcHRlciwgQ1JCX1YyUChhZGFwdGVyLT5wb3J0bnVtKSkpOworCWlmIChpICE9IDB4NTU1NTU1NTUpCisJCXBoeXNpY2FsX3BvcnRbYWRhcHRlci0+cG9ydG51bV0gPSBpOworCisJbmV0aWZfY2Fycmllcl9vZmYobmV0ZGV2KTsKKwluZXRpZl9zdG9wX3F1ZXVlKG5ldGRldik7CisKKwlpZiAoKGVyciA9IHJlZ2lzdGVyX25ldGRldihuZXRkZXYpKSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiByZWdpc3Rlcl9uZXRkZXYgZmFpbGVkIHBvcnQgIyVkIgorCQkJICAgICAgICIgYWJvcnRpbmdcbiIsIG5ldHhlbl9uaWNfZHJpdmVyX25hbWUsCisJCQkgICAgICAgYWRhcHRlci0+cG9ydG51bSk7CisJCWVyciA9IC1FSU87CiAJCWdvdG8gZXJyX291dF9mcmVlX2RldjsKIAl9CiAKLQkvKiBVbmxvY2sgdGhlIEhXLCBwcm9tcHRpbmcgdGhlIGJvb3Qgc2VxdWVuY2UgKi8KLQl3cml0ZWwoMSwKLQkgICAgICAgTkVUWEVOX0NSQl9OT1JNQUxJWkUoYWRhcHRlciwgTkVUWEVOX1JPTVVTQl9HTEJfUEVHVFVORV9ET05FKSk7Ci0KLQkvKiBIYW5kc2hha2Ugd2l0aCB0aGUgY2FyZCBiZWZvcmUgd2UgcmVnaXN0ZXIgdGhlIGRldmljZXMuICovCi0JbmV0eGVuX3BoYW50b21faW5pdChhZGFwdGVyLCBORVRYRU5fTklDX1BFR19UVU5FKTsKLQotCS8qIGluaXRpYWxpemUgdGhlIGFsbCB0aGUgcG9ydHMgKi8KLQlhZGFwdGVyLT5hY3RpdmVfcG9ydHMgPSAwOwotCi0JZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPmFody5tYXhfcG9ydHM7IGkrKykgewotCQluZXRkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IG5ldHhlbl9wb3J0KSk7Ci0JCWlmICghbmV0ZGV2KSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjb3VsZCBub3QgYWxsb2NhdGUgbmV0ZGV2IGZvciBwb3J0IgotCQkJICAgICAgICIgJWRcbiIsIG5ldHhlbl9uaWNfZHJpdmVyX25hbWUsIGkgKyAxKTsKLQkJCWdvdG8gZXJyX291dF9mcmVlX2RldjsKLQkJfQotCi0JCVNFVF9NT0RVTEVfT1dORVIobmV0ZGV2KTsKLQkJU0VUX05FVERFVl9ERVYobmV0ZGV2LCAmcGRldi0+ZGV2KTsKLQotCQlwb3J0ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQkJcG9ydC0+bmV0ZGV2ID0gbmV0ZGV2OwotCQlwb3J0LT5wZGV2ID0gcGRldjsKLQkJcG9ydC0+YWRhcHRlciA9IGFkYXB0ZXI7Ci0JCXBvcnQtPnBvcnRudW0gPSBpOwkvKiBHaWdhYml0IHBvcnQgbnVtYmVyIGZyb20gMC0zICovCi0KLQkJbmV0ZGV2LT5vcGVuID0gbmV0eGVuX25pY19vcGVuOwotCQluZXRkZXYtPnN0b3AgPSBuZXR4ZW5fbmljX2Nsb3NlOwotCQluZXRkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IG5ldHhlbl9uaWNfeG1pdF9mcmFtZTsKLQkJbmV0ZGV2LT5nZXRfc3RhdHMgPSBuZXR4ZW5fbmljX2dldF9zdGF0czsKLQkJbmV0ZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBuZXR4ZW5fbmljX3NldF9tdWx0aTsKLQkJbmV0ZGV2LT5zZXRfbWFjX2FkZHJlc3MgPSBuZXR4ZW5fbmljX3NldF9tYWM7Ci0JCW5ldGRldi0+Y2hhbmdlX210dSA9IG5ldHhlbl9uaWNfY2hhbmdlX210dTsKLQkJbmV0ZGV2LT50eF90aW1lb3V0ID0gbmV0eGVuX3R4X3RpbWVvdXQ7Ci0JCW5ldGRldi0+d2F0Y2hkb2dfdGltZW8gPSBIWjsKLQotCQluZXR4ZW5fbmljX2NoYW5nZV9tdHUobmV0ZGV2LCBuZXRkZXYtPm10dSk7Ci0KLQkJU0VUX0VUSFRPT0xfT1BTKG5ldGRldiwgJm5ldHhlbl9uaWNfZXRodG9vbF9vcHMpOwotCQluZXRkZXYtPnBvbGwgPSBuZXR4ZW5fbmljX3BvbGw7Ci0JCW5ldGRldi0+d2VpZ2h0ID0gTkVUWEVOX05FVERFVl9XRUlHSFQ7Ci0jaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKLQkJbmV0ZGV2LT5wb2xsX2NvbnRyb2xsZXIgPSBuZXR4ZW5fbmljX3BvbGxfY29udHJvbGxlcjsKLSNlbmRpZgotCQkvKiBTY2F0dGVyR2F0aGVyIHN1cHBvcnQgKi8KLQkJbmV0ZGV2LT5mZWF0dXJlcyA9IE5FVElGX0ZfU0c7Ci0JCW5ldGRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9JUF9DU1VNOwotCQluZXRkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfVFNPOwotCi0JCWlmIChwY2lfdXNpbmdfZGFjKQotCQkJbmV0ZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0hJR0hETUE7Ci0KLQkJaWYgKHZhbGlkX21hYykgewotCQkJdW5zaWduZWQgY2hhciAqcCA9ICh1bnNpZ25lZCBjaGFyICopJm1hY19hZGRyW2ldOwotCQkJbmV0ZGV2LT5kZXZfYWRkclswXSA9ICoocCArIDUpOwotCQkJbmV0ZGV2LT5kZXZfYWRkclsxXSA9ICoocCArIDQpOwotCQkJbmV0ZGV2LT5kZXZfYWRkclsyXSA9ICoocCArIDMpOwotCQkJbmV0ZGV2LT5kZXZfYWRkclszXSA9ICoocCArIDIpOwotCQkJbmV0ZGV2LT5kZXZfYWRkcls0XSA9ICoocCArIDEpOwotCQkJbmV0ZGV2LT5kZXZfYWRkcls1XSA9ICoocCArIDApOwotCi0JCQltZW1jcHkobmV0ZGV2LT5wZXJtX2FkZHIsIG5ldGRldi0+ZGV2X2FkZHIsCi0JCQkgICAgICAgbmV0ZGV2LT5hZGRyX2xlbik7Ci0JCQlpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIobmV0ZGV2LT5wZXJtX2FkZHIpKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICIlczogQmFkIE1BQyBhZGRyZXNzICIKLQkJCQkgICAgICAgIiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4LlxuIiwKLQkJCQkgICAgICAgbmV0eGVuX25pY19kcml2ZXJfbmFtZSwKLQkJCQkgICAgICAgbmV0ZGV2LT5kZXZfYWRkclswXSwKLQkJCQkgICAgICAgbmV0ZGV2LT5kZXZfYWRkclsxXSwKLQkJCQkgICAgICAgbmV0ZGV2LT5kZXZfYWRkclsyXSwKLQkJCQkgICAgICAgbmV0ZGV2LT5kZXZfYWRkclszXSwKLQkJCQkgICAgICAgbmV0ZGV2LT5kZXZfYWRkcls0XSwKLQkJCQkgICAgICAgbmV0ZGV2LT5kZXZfYWRkcls1XSk7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChhZGFwdGVyLT5tYWNhZGRyX3NldCkKLQkJCQkJYWRhcHRlci0+bWFjYWRkcl9zZXQocG9ydCwKLQkJCQkJCQkgICAgIG5ldGRldi0+ZGV2X2FkZHIpOwotCQkJfQotCQl9Ci0JCUlOSVRfV09SSygmcG9ydC0+dHhfdGltZW91dF90YXNrLCBuZXR4ZW5fdHhfdGltZW91dF90YXNrKTsKLQkJbmV0aWZfY2Fycmllcl9vZmYobmV0ZGV2KTsKLQkJbmV0aWZfc3RvcF9xdWV1ZShuZXRkZXYpOwotCi0JCWlmICgoZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KG5ldGRldikpKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIiVzOiByZWdpc3Rlcl9uZXRkZXYgZmFpbGVkIHBvcnQgIyVkIgotCQkJICAgICAgICIgYWJvcnRpbmdcbiIsIG5ldHhlbl9uaWNfZHJpdmVyX25hbWUsIGkgKyAxKTsKLQkJCWVyciA9IC1FSU87Ci0JCQlmcmVlX25ldGRldihuZXRkZXYpOwotCQkJZ290byBlcnJfb3V0X2ZyZWVfZGV2OwotCQl9Ci0JCWFkYXB0ZXItPnBvcnRfY291bnQrKzsKLQkJYWRhcHRlci0+cG9ydFtpXSA9IHBvcnQ7Ci0JfQotCXdyaXRlbCgwLCBORVRYRU5fQ1JCX05PUk1BTElaRShhZGFwdGVyLCBDUkJfQ01EUEVHX1NUQVRFKSk7Ci0JbmV0eGVuX3Bpbml0X2Zyb21fcm9tKGFkYXB0ZXIsIDApOwotCXVkZWxheSg1MDApOwotCW5ldHhlbl9sb2FkX2Zpcm13YXJlKGFkYXB0ZXIpOwotCW5ldHhlbl9waGFudG9tX2luaXQoYWRhcHRlciwgTkVUWEVOX05JQ19QRUdfVFVORSk7Ci0JLyoKLQkgKiBkZWxheSBhIHdoaWxlIHRvIGVuc3VyZSB0aGF0IHRoZSBQZWdzIGFyZSB1cCAmIHJ1bm5pbmcuCi0JICogT3RoZXJ3aXNlLCB3ZSBtaWdodCBzZWUgc29tZSBmbGFreSBiZWhhdmlvdXIuCi0JICovCi0JdWRlbGF5KDEwMCk7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGFkYXB0ZXIpOwogCiAJc3dpdGNoIChhZGFwdGVyLT5haHcuYm9hcmRfdHlwZSkgewotCWNhc2UgTkVUWEVOX05JQ19HQkU6Ci0JCXByaW50aygiJXM6IFFVQUQgR2JFIGJvYXJkIGluaXRpYWxpemVkXG4iLAotCQkgICAgICAgbmV0eGVuX25pY19kcml2ZXJfbmFtZSk7Ci0JCWJyZWFrOworCQljYXNlIE5FVFhFTl9OSUNfR0JFOgorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFFVQUQgR2JFIGJvYXJkIGluaXRpYWxpemVkXG4iLAorCQkJICAgICAgIG5ldHhlbl9uaWNfZHJpdmVyX25hbWUpOworCQkJYnJlYWs7CiAKLQljYXNlIE5FVFhFTl9OSUNfWEdCRToKLQkJcHJpbnRrKCIlczogWEdiRSBib2FyZCBpbml0aWFsaXplZFxuIiwgbmV0eGVuX25pY19kcml2ZXJfbmFtZSk7Ci0JCWJyZWFrOworCQljYXNlIE5FVFhFTl9OSUNfWEdCRToKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBYR2JFIGJvYXJkIGluaXRpYWxpemVkXG4iLCAKKwkJCQkJbmV0eGVuX25pY19kcml2ZXJfbmFtZSk7CisJCQlicmVhazsKIAl9CiAKIAlhZGFwdGVyLT5kcml2ZXJfbWlzbWF0Y2ggPSAwOwogCiAJcmV0dXJuIDA7CiAKLSAgICAgIGVycl9vdXRfZnJlZV9kZXY6Ci0JaWYgKGFkYXB0ZXItPmZsYWdzICYgTkVUWEVOX05JQ19NU0lfRU5BQkxFRCkKLQkJcGNpX2Rpc2FibGVfbXNpKHBkZXYpOwotCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5wb3J0X2NvdW50OyBpKyspIHsKLQkJcG9ydCA9IGFkYXB0ZXItPnBvcnRbaV07Ci0JCWlmICgocG9ydCkgJiYgKHBvcnQtPm5ldGRldikpIHsKLQkJCXVucmVnaXN0ZXJfbmV0ZGV2KHBvcnQtPm5ldGRldik7Ci0JCQlmcmVlX25ldGRldihwb3J0LT5uZXRkZXYpOwotCQl9Ci0JfQorZXJyX291dF9mcmVlX2RldjoKKwlpZiAoYWRhcHRlci0+cG9ydG51bSA9PSAwKQorCQluZXR4ZW5fZnJlZV9hZGFwdGVyX29mZmxvYWQoYWRhcHRlcik7CiAKLQluZXR4ZW5fZnJlZV9hZGFwdGVyX29mZmxvYWQoYWRhcHRlcik7Ci0KLSAgICAgIGVycl9vdXRfZnJlZV9yeF9idWZmZXI6CitlcnJfb3V0X2ZyZWVfcnhfYnVmZmVyOgogCWZvciAoaSA9IDA7IGkgPCBNQVhfUkNWX0NUWDsgKytpKSB7CiAJCXJlY3ZfY3R4ID0gJmFkYXB0ZXItPnJlY3ZfY3R4W2ldOwogCQlmb3IgKHJpbmcgPSAwOyByaW5nIDwgTlVNX1JDVl9ERVNDX1JJTkdTOyByaW5nKyspIHsKQEAgLTQ4NiwxNSArNTk3LDE2IEBACiAJfQogCXZmcmVlKGNtZF9idWZfYXJyKTsKIAotICAgICAgZXJyX291dF9mcmVlX2FkYXB0ZXI6Ci0JcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwotCWtmcmVlKGFkYXB0ZXIpOworZXJyX291dF9mcmVlX2FkYXB0ZXI6CisJaWYgKGFkYXB0ZXItPmZsYWdzICYgTkVUWEVOX05JQ19NU0lfRU5BQkxFRCkKKwkJcGNpX2Rpc2FibGVfbXNpKHBkZXYpOwogCi0gICAgICBlcnJfb3V0X2RidW5tYXA6CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCiAJaWYgKGRiX3B0cikKIAkJaW91bm1hcChkYl9wdHIpOwogCi0gICAgICBlcnJfb3V0X2lvdW5tYXA6CitlcnJfb3V0X2lvdW5tYXA6CiAJaWYgKG1lbV9wdHIwKQogCQlpb3VubWFwKG1lbV9wdHIwKTsKIAlpZiAobWVtX3B0cjEpCkBAIC01MDIsOSArNjE0LDEzIEBACiAJaWYgKG1lbV9wdHIyKQogCQlpb3VubWFwKG1lbV9wdHIyKTsKIAotICAgICAgZXJyX291dF9mcmVlX3JlczoKK2Vycl9vdXRfZnJlZV9uZXRkZXY6CisJZnJlZV9uZXRkZXYobmV0ZGV2KTsKKworZXJyX291dF9mcmVlX3JlczoKIAlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOwotICAgICAgZXJyX291dF9kaXNhYmxlX3BkZXY6CisKK2Vycl9vdXRfZGlzYWJsZV9wZGV2OgogCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKIAlyZXR1cm4gZXJyOwogfQpAQCAtNTEyLDcgKzYyOCw3IEBACiBzdGF0aWMgdm9pZCBfX2RldmV4aXQgbmV0eGVuX25pY19yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7CiAJc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyOwotCXN0cnVjdCBuZXR4ZW5fcG9ydCAqcG9ydDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OwogCXN0cnVjdCBuZXR4ZW5fcnhfYnVmZmVyICpidWZmZXI7CiAJc3RydWN0IG5ldHhlbl9yZWN2X2NvbnRleHQgKnJlY3ZfY3R4OwogCXN0cnVjdCBuZXR4ZW5fcmN2X2Rlc2NfY3R4ICpyY3ZfZGVzYzsKQEAgLTUyMywzOSArNjM5LDM1IEBACiAJaWYgKGFkYXB0ZXIgPT0gTlVMTCkKIAkJcmV0dXJuOwogCisJbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OworCisJbmV0eGVuX25pY19kaXNhYmxlX2ludChhZGFwdGVyKTsKIAlpZiAoYWRhcHRlci0+aXJxKQogCQlmcmVlX2lycShhZGFwdGVyLT5pcnEsIGFkYXB0ZXIpOwotCW5ldHhlbl9uaWNfc3RvcF9hbGxfcG9ydHMoYWRhcHRlcik7Ci0JLyogbGVhdmUgdGhlIGh3IGluIHRoZSBzYW1lIHN0YXRlIGFzIHJlYm9vdCAqLwotCXdyaXRlbCgwLCBORVRYRU5fQ1JCX05PUk1BTElaRShhZGFwdGVyLCBDUkJfQ01EUEVHX1NUQVRFKSk7Ci0JbmV0eGVuX3Bpbml0X2Zyb21fcm9tKGFkYXB0ZXIsIDApOwotCXVkZWxheSg1MDApOwotCW5ldHhlbl9sb2FkX2Zpcm13YXJlKGFkYXB0ZXIpOwotCW5ldHhlbl9mcmVlX2FkYXB0ZXJfb2ZmbG9hZChhZGFwdGVyKTsKLQotCW1kZWxheSgxMDAwKTsJCS8qIERlbGF5IGZvciBhIHdoaWxlIHRvIGRyYWluIHRoZSBETUEgZW5naW5lcyAqLwotCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5wb3J0X2NvdW50OyBpKyspIHsKLQkJcG9ydCA9IGFkYXB0ZXItPnBvcnRbaV07Ci0JCWlmICgocG9ydCkgJiYgKHBvcnQtPm5ldGRldikpIHsKLQkJCXVucmVnaXN0ZXJfbmV0ZGV2KHBvcnQtPm5ldGRldik7Ci0JCQlmcmVlX25ldGRldihwb3J0LT5uZXRkZXYpOwotCQl9Ci0JfQorCQorCWlmIChhZGFwdGVyLT5zdG9wX3BvcnQpCisJCWFkYXB0ZXItPnN0b3BfcG9ydChhZGFwdGVyKTsKIAogCWlmICgoYWRhcHRlci0+ZmxhZ3MgJiBORVRYRU5fTklDX01TSV9FTkFCTEVEKSkKIAkJcGNpX2Rpc2FibGVfbXNpKHBkZXYpOworCisJaWYgKGFkYXB0ZXItPnBvcnRudW0gPT0gMCkKKwkJbmV0eGVuX2ZyZWVfYWRhcHRlcl9vZmZsb2FkKGFkYXB0ZXIpOworCisJaWYgKGFkYXB0ZXItPmlycSkKKwkJZnJlZV9pcnEoYWRhcHRlci0+aXJxLCBhZGFwdGVyKTsKKwlpZihhZGFwdGVyLT5wb3J0bnVtID09IDApIHsKKwkJLyogbGVhdmUgdGhlIGh3IGluIHRoZSBzYW1lIHN0YXRlIGFzIHJlYm9vdCAqLworCQl3cml0ZWwoMCwgTkVUWEVOX0NSQl9OT1JNQUxJWkUoYWRhcHRlciwgQ1JCX0NNRFBFR19TVEFURSkpOworCQluZXR4ZW5fcGluaXRfZnJvbV9yb20oYWRhcHRlciwgMCk7CisJCXVkZWxheSg1MDApOworCQluZXR4ZW5fbG9hZF9maXJtd2FyZShhZGFwdGVyKTsKKwkJbmV0eGVuX3BoYW50b21faW5pdChhZGFwdGVyLCBORVRYRU5fTklDX1BFR19UVU5FKTsKKwl9CisKIAlpZiAoYWRhcHRlci0+aXNfdXAgPT0gTkVUWEVOX0FEQVBURVJfVVBfTUFHSUMpCiAJCW5ldHhlbl9mcmVlX2h3X3Jlc291cmNlcyhhZGFwdGVyKTsKIAotCWlvdW5tYXAoYWRhcHRlci0+YWh3LmRiX2Jhc2UpOwotCWlvdW5tYXAoYWRhcHRlci0+YWh3LnBjaV9iYXNlMCk7Ci0JaW91bm1hcChhZGFwdGVyLT5haHcucGNpX2Jhc2UxKTsKLQlpb3VubWFwKGFkYXB0ZXItPmFody5wY2lfYmFzZTIpOwotCi0JcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKLQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7Ci0JcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwotCiAJZm9yIChjdHhpZCA9IDA7IGN0eGlkIDwgTUFYX1JDVl9DVFg7ICsrY3R4aWQpIHsKIAkJcmVjdl9jdHggPSAmYWRhcHRlci0+cmVjdl9jdHhbY3R4aWRdOwogCQlmb3IgKHJpbmcgPSAwOyByaW5nIDwgTlVNX1JDVl9ERVNDX1JJTkdTOyByaW5nKyspIHsKQEAgLTU3NCw4ICs2ODYsMjAgQEAKIAkJfQogCX0KIAorCXVucmVnaXN0ZXJfbmV0ZGV2KG5ldGRldik7CisKIAl2ZnJlZShhZGFwdGVyLT5jbWRfYnVmX2Fycik7Ci0Ja2ZyZWUoYWRhcHRlcik7CisKKwlpb3VubWFwKGFkYXB0ZXItPmFody5kYl9iYXNlKTsKKwlpb3VubWFwKGFkYXB0ZXItPmFody5wY2lfYmFzZTApOworCWlvdW5tYXAoYWRhcHRlci0+YWh3LnBjaV9iYXNlMSk7CisJaW91bm1hcChhZGFwdGVyLT5haHcucGNpX2Jhc2UyKTsKKworCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKworCWZyZWVfbmV0ZGV2KG5ldGRldik7CiB9CiAKIC8qCkBAIC01ODQsOCArNzA4LDcgQEAKICAqLwogc3RhdGljIGludCBuZXR4ZW5fbmljX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKIHsKLQlzdHJ1Y3QgbmV0eGVuX3BvcnQgKnBvcnQgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCXN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciA9IHBvcnQtPmFkYXB0ZXI7CisJc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyID0gKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqKW5ldGRldi0+cHJpdjsKIAlpbnQgZXJyID0gMDsKIAlpbnQgY3R4LCByaW5nOwogCkBAIC01OTYsOCArNzE5LDYgQEAKIAkJCXJldHVybiAtRUlPOwogCQl9CiAJCW5ldHhlbl9uaWNfZmxhc2hfcHJpbnQoYWRhcHRlcik7Ci0JCWlmIChhZGFwdGVyLT5pbml0X25pdSkKLQkJCWFkYXB0ZXItPmluaXRfbml1KGFkYXB0ZXIpOwogCiAJCS8qIHNldHVwIGFsbCB0aGUgcmVzb3VyY2VzIGZvciB0aGUgUGhhbnRvbS4uLiAqLwogCQkvKiB0aGlzIGluY2x1ZGUgdGhlIGRlc2NyaXB0b3JzIGZvciByY3YsIHR4LCBhbmQgc3RhdHVzICovCkBAIC02MDgsMjEgKzcyOSwxNCBAQAogCQkJICAgICAgIGVycik7CiAJCQlyZXR1cm4gZXJyOwogCQl9Ci0JCWlmIChhZGFwdGVyLT5pbml0X3BvcnQKLQkJICAgICYmIGFkYXB0ZXItPmluaXRfcG9ydChhZGFwdGVyLCBwb3J0LT5wb3J0bnVtKSAhPSAwKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIiVzOiBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBwb3J0ICVkXG4iLAotCQkJICAgICAgIG5ldHhlbl9uaWNfZHJpdmVyX25hbWUsIHBvcnQtPnBvcnRudW0pOwotCQkJbmV0eGVuX2ZyZWVfaHdfcmVzb3VyY2VzKGFkYXB0ZXIpOwotCQkJcmV0dXJuIC1FSU87Ci0JCX0KIAkJZm9yIChjdHggPSAwOyBjdHggPCBNQVhfUkNWX0NUWDsgKytjdHgpIHsKIAkJCWZvciAocmluZyA9IDA7IHJpbmcgPCBOVU1fUkNWX0RFU0NfUklOR1M7IHJpbmcrKykKIAkJCQluZXR4ZW5fcG9zdF9yeF9idWZmZXJzKGFkYXB0ZXIsIGN0eCwgcmluZyk7CiAJCX0KIAkJYWRhcHRlci0+aXJxID0gYWRhcHRlci0+YWh3LnBkZXYtPmlycTsKLQkJZXJyID0gcmVxdWVzdF9pcnEoYWRhcHRlci0+YWh3LnBkZXYtPmlycSwgJm5ldHhlbl9pbnRyLAotCQkJCSAgSVJRRl9TSEFSRUQgfCBJUlFGX1NBTVBMRV9SQU5ET00sCi0JCQkJICBuZXRkZXYtPm5hbWUsIGFkYXB0ZXIpOworCQllcnIgPSByZXF1ZXN0X2lycShhZGFwdGVyLT5haHcucGRldi0+aXJxLCBuZXR4ZW5faW50ciwKKwkJCQkgIFNBX1NISVJRIHwgU0FfU0FNUExFX1JBTkRPTSwgbmV0ZGV2LT5uYW1lLAorCQkJCSAgYWRhcHRlcik7CiAJCWlmIChlcnIpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAicmVxdWVzdF9pcnEgZmFpbGVkIHdpdGg6ICVkXG4iLCBlcnIpOwogCQkJbmV0eGVuX2ZyZWVfaHdfcmVzb3VyY2VzKGFkYXB0ZXIpOwpAQCAtNjMxLDIzICs3NDUsMjggQEAKIAogCQlhZGFwdGVyLT5pc191cCA9IE5FVFhFTl9BREFQVEVSX1VQX01BR0lDOwogCX0KLQlhZGFwdGVyLT5hY3RpdmVfcG9ydHMrKzsKLQlpZiAoYWRhcHRlci0+YWN0aXZlX3BvcnRzID09IDEpIHsKLQkJaWYgKCFhZGFwdGVyLT5kcml2ZXJfbWlzbWF0Y2gpCi0JCQltb2RfdGltZXIoJmFkYXB0ZXItPndhdGNoZG9nX3RpbWVyLCBqaWZmaWVzKTsKKwlpZiAoIWFkYXB0ZXItPmRyaXZlcl9taXNtYXRjaCkKKwkJbW9kX3RpbWVyKCZhZGFwdGVyLT53YXRjaGRvZ190aW1lciwgamlmZmllcyk7CiAKLQkJbmV0eGVuX25pY19lbmFibGVfaW50KGFkYXB0ZXIpOwotCX0KKwluZXR4ZW5fbmljX2VuYWJsZV9pbnQoYWRhcHRlcik7CiAKIAkvKiBEb25lIGhlcmUgYWdhaW4gc28gdGhhdCBldmVuIGlmIHBoYW50b20gc3cgb3Zlcndyb3RlIGl0LAogCSAqIHdlIHNldCBpdCAqLwogCWlmIChhZGFwdGVyLT5tYWNhZGRyX3NldCkKLQkJYWRhcHRlci0+bWFjYWRkcl9zZXQocG9ydCwgbmV0ZGV2LT5kZXZfYWRkcik7Ci0JbmV0eGVuX25pY19zZXRfbGlua19wYXJhbWV0ZXJzKHBvcnQpOworCQlhZGFwdGVyLT5tYWNhZGRyX3NldChhZGFwdGVyLCBuZXRkZXYtPmRldl9hZGRyKTsKKwlpZiAoYWRhcHRlci0+aW5pdF9wb3J0CisJICAgICYmIGFkYXB0ZXItPmluaXRfcG9ydChhZGFwdGVyLCBhZGFwdGVyLT5wb3J0bnVtKSAhPSAwKSB7CisJICAgIGRlbF90aW1lcl9zeW5jKCZhZGFwdGVyLT53YXRjaGRvZ190aW1lcik7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEZhaWxlZCB0byBpbml0aWFsaXplIHBvcnQgJWRcbiIsCisJCQkJbmV0eGVuX25pY19kcml2ZXJfbmFtZSwgYWRhcHRlci0+cG9ydG51bSk7CisJCXJldHVybiAtRUlPOworCX0KKworCW5ldHhlbl9uaWNfc2V0X2xpbmtfcGFyYW1ldGVycyhhZGFwdGVyKTsKIAogCW5ldHhlbl9uaWNfc2V0X211bHRpKG5ldGRldik7CiAJaWYgKGFkYXB0ZXItPnNldF9tdHUpCi0JCWFkYXB0ZXItPnNldF9tdHUocG9ydCwgbmV0ZGV2LT5tdHUpOworCQlhZGFwdGVyLT5zZXRfbXR1KGFkYXB0ZXIsIG5ldGRldi0+bXR1KTsKIAogCWlmICghYWRhcHRlci0+ZHJpdmVyX21pc21hdGNoKQogCQluZXRpZl9zdGFydF9xdWV1ZShuZXRkZXYpOwpAQCAtNjYwLDggKzc3OSw3IEBACiAgKi8KIHN0YXRpYyBpbnQgbmV0eGVuX25pY19jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQogewotCXN0cnVjdCBuZXR4ZW5fcG9ydCAqcG9ydCA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0Jc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyID0gcG9ydC0+YWRhcHRlcjsKKwlzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCWludCBpLCBqOwogCXN0cnVjdCBuZXR4ZW5fY21kX2J1ZmZlciAqY21kX2J1ZmY7CiAJc3RydWN0IG5ldHhlbl9za2JfZnJhZyAqYnVmZnJhZzsKQEAgLTY2OSw0NyArNzg3LDM5IEBACiAJbmV0aWZfY2Fycmllcl9vZmYobmV0ZGV2KTsKIAluZXRpZl9zdG9wX3F1ZXVlKG5ldGRldik7CiAKLQlhZGFwdGVyLT5hY3RpdmVfcG9ydHMtLTsKLQotCWlmICghYWRhcHRlci0+YWN0aXZlX3BvcnRzKSB7Ci0JCW5ldHhlbl9uaWNfZGlzYWJsZV9pbnQoYWRhcHRlcik7Ci0JCWNtZF9idWZmID0gYWRhcHRlci0+Y21kX2J1Zl9hcnI7Ci0JCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5tYXhfdHhfZGVzY19jb3VudDsgaSsrKSB7Ci0JCQlidWZmcmFnID0gY21kX2J1ZmYtPmZyYWdfYXJyYXk7CisJY21kX2J1ZmYgPSBhZGFwdGVyLT5jbWRfYnVmX2FycjsKKwlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+bWF4X3R4X2Rlc2NfY291bnQ7IGkrKykgeworCQlidWZmcmFnID0gY21kX2J1ZmYtPmZyYWdfYXJyYXk7CisJCWlmIChidWZmcmFnLT5kbWEpIHsKKwkJCXBjaV91bm1hcF9zaW5nbGUoYWRhcHRlci0+cGRldiwgYnVmZnJhZy0+ZG1hLAorCQkJCQkgYnVmZnJhZy0+bGVuZ3RoLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCWJ1ZmZyYWctPmRtYSA9ICh1NjQpIE5VTEw7CisJCX0KKwkJZm9yIChqID0gMDsgaiA8IGNtZF9idWZmLT5mcmFnX2NvdW50OyBqKyspIHsKKwkJCWJ1ZmZyYWcrKzsKIAkJCWlmIChidWZmcmFnLT5kbWEpIHsKLQkJCQlwY2lfdW5tYXBfc2luZ2xlKHBvcnQtPnBkZXYsIGJ1ZmZyYWctPmRtYSwKLQkJCQkJCSBidWZmcmFnLT5sZW5ndGgsCi0JCQkJCQkgUENJX0RNQV9UT0RFVklDRSk7CisJCQkJcGNpX3VubWFwX3BhZ2UoYWRhcHRlci0+cGRldiwgYnVmZnJhZy0+ZG1hLAorCQkJCQkgICAgICAgYnVmZnJhZy0+bGVuZ3RoLCAKKwkJCQkJICAgICAgIFBDSV9ETUFfVE9ERVZJQ0UpOwogCQkJCWJ1ZmZyYWctPmRtYSA9ICh1NjQpIE5VTEw7CiAJCQl9Ci0JCQlmb3IgKGogPSAwOyBqIDwgY21kX2J1ZmYtPmZyYWdfY291bnQ7IGorKykgewotCQkJCWJ1ZmZyYWcrKzsKLQkJCQlpZiAoYnVmZnJhZy0+ZG1hKSB7Ci0JCQkJCXBjaV91bm1hcF9wYWdlKHBvcnQtPnBkZXYsCi0JCQkJCQkgICAgICAgYnVmZnJhZy0+ZG1hLAotCQkJCQkJICAgICAgIGJ1ZmZyYWctPmxlbmd0aCwKLQkJCQkJCSAgICAgICBQQ0lfRE1BX1RPREVWSUNFKTsKLQkJCQkJYnVmZnJhZy0+ZG1hID0gKHU2NCkgTlVMTDsKLQkJCQl9Ci0JCQl9Ci0JCQkvKiBGcmVlIHRoZSBza2Igd2UgcmVjZWl2ZWQgaW4gbmV0eGVuX25pY194bWl0X2ZyYW1lICovCi0JCQlpZiAoY21kX2J1ZmYtPnNrYikgewotCQkJCWRldl9rZnJlZV9za2JfYW55KGNtZF9idWZmLT5za2IpOwotCQkJCWNtZF9idWZmLT5za2IgPSBOVUxMOwotCQkJfQotCQkJY21kX2J1ZmYrKzsKIAkJfQotCQlGTFVTSF9TQ0hFRFVMRURfV09SSygpOwotCQlkZWxfdGltZXJfc3luYygmYWRhcHRlci0+d2F0Y2hkb2dfdGltZXIpOworCQkvKiBGcmVlIHRoZSBza2Igd2UgcmVjZWl2ZWQgaW4gbmV0eGVuX25pY194bWl0X2ZyYW1lICovCisJCWlmIChjbWRfYnVmZi0+c2tiKSB7CisJCQlkZXZfa2ZyZWVfc2tiX2FueShjbWRfYnVmZi0+c2tiKTsKKwkJCWNtZF9idWZmLT5za2IgPSBOVUxMOworCQl9CisJCWNtZF9idWZmKys7CiAJfQorCUZMVVNIX1NDSEVEVUxFRF9XT1JLKCk7CisJZGVsX3RpbWVyX3N5bmMoJmFkYXB0ZXItPndhdGNoZG9nX3RpbWVyKTsKIAogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IG5ldHhlbl9uaWNfeG1pdF9mcmFtZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQogewotCXN0cnVjdCBuZXR4ZW5fcG9ydCAqcG9ydCA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0Jc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyID0gcG9ydC0+YWRhcHRlcjsKKwlzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXN0cnVjdCBuZXR4ZW5faGFyZHdhcmVfY29udGV4dCAqaHcgPSAmYWRhcHRlci0+YWh3OwogCXVuc2lnbmVkIGludCBmaXJzdF9zZWdfbGVuID0gc2tiLT5sZW4gLSBza2ItPmRhdGFfbGVuOwogCXN0cnVjdCBuZXR4ZW5fc2tiX2ZyYWcgKmJ1ZmZyYWc7CkBAIC03MjcsMTIgKzgzNywxMiBAQAogCXUzMiBsYXN0X2NtZF9jb25zdW1lciA9IDA7CiAJaW50IG5vX29mX2Rlc2M7CiAKLQlwb3J0LT5zdGF0cy54bWl0Y2FsbGVkKys7CisJYWRhcHRlci0+c3RhdHMueG1pdGNhbGxlZCsrOwogCWZyYWdfY291bnQgPSBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzICsgMTsKIAogCWlmICh1bmxpa2VseShza2ItPmxlbiA8PSAwKSkgewogCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwotCQlwb3J0LT5zdGF0cy5iYWRza2JsZW4rKzsKKwkJYWRhcHRlci0+c3RhdHMuYmFkc2tibGVuKys7CiAJCXJldHVybiBORVRERVZfVFhfT0s7CiAJfQogCkBAIC03NDEsNyArODUxLDcgQEAKIAkJICAgICAgICJ0b28gbGFyZ2UsIGNhbiBoYW5kbGUgb25seSAlZCBmcmFnc1xuIiwKIAkJICAgICAgIG5ldHhlbl9uaWNfZHJpdmVyX25hbWUsIG5ldGRldi0+bmFtZSwKIAkJICAgICAgIGZyYWdfY291bnQsIE1BWF9CVUZGRVJTX1BFUl9DTUQpOwotCQlwb3J0LT5zdGF0cy50eGRyb3BwZWQrKzsKKwkJYWRhcHRlci0+c3RhdHMudHhkcm9wcGVkKys7CiAJCWlmICgoKytkcm9wcGVkX3BhY2tldCAmIDB4ZmYpID09IDB4ZmYpCiAJCQlwcmludGsoIiVzOiAlcyBkcm9wcHBlZCBwYWNrZXRzID0gJWRcbiIsCiAJCQkgICAgICAgbmV0eGVuX25pY19kcml2ZXJfbmFtZSwgbmV0ZGV2LT5uYW1lLApAQCAtNzU4LDcgKzg2OCw3IEBACiAJICovCiAgICAgICByZXRyeV9nZXR0aW5nX3dpbmRvdzoKIAlzcGluX2xvY2tfYmgoJmFkYXB0ZXItPnR4X2xvY2spOwotCWlmIChhZGFwdGVyLT50b3RhbF90aHJlYWRzID09IE1BWF9YTUlUX1BST0RVQ0VSUykgeworCWlmIChhZGFwdGVyLT50b3RhbF90aHJlYWRzID49IE1BWF9YTUlUX1BST0RVQ0VSUykgewogCQlzcGluX3VubG9ja19iaCgmYWRhcHRlci0+dHhfbG9jayk7CiAJCS8qCiAJCSAqIFlpZWxkIENQVQpAQCAtNzc4LDkgKzg4OCw4IEBACiAJCWlmIChza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplID4gMCkgewogCiAJCQlub19vZl9kZXNjKys7Ci0JCQlpZiAoKChza2ItPm5oLmlwaCktPmlobCAqIHNpemVvZih1MzIpKSArCi0JCQkgICAgKChza2ItPmgudGgpLT5kb2ZmICogc2l6ZW9mKHUzMikpICsKLQkJCSAgICBzaXplb2Yoc3RydWN0IGV0aGhkcikgPgorCQkJaWYgKChpcF9oZHJsZW4oc2tiKSArIHRjcF9oZHJsZW4oc2tiKSArCisJCQkgICAgIHNpemVvZihzdHJ1Y3QgZXRoaGRyKSkgPgogCQkJICAgIChzaXplb2Yoc3RydWN0IGNtZF9kZXNjX3R5cGUwKSAtIDIpKSB7CiAJCQkJbm9fb2ZfZGVzYysrOwogCQkJfQpAQCAtNzkyLDE1ICs5MDEsOCBAQAogCWlmICgoayArIG5vX29mX2Rlc2MpID49CiAJICAgICgobGFzdF9jbWRfY29uc3VtZXIgPD0gaykgPyBsYXN0X2NtZF9jb25zdW1lciArIG1heF90eF9kZXNjX2NvdW50IDoKIAkgICAgIGxhc3RfY21kX2NvbnN1bWVyKSkgewotCQlwb3J0LT5zdGF0cy5ub2NtZGRlc2NyaXB0b3IrKzsKLQkJRFBSSU5USyhFUlIsICJObyBjb21tYW5kIGRlc2NyaXB0b3JzIGF2YWlsYWJsZSwiCi0JCQkiIHByb2R1Y2VyID0gJWQsIGNvbnN1bWVyID0gJWQgY291bnQ9JWxsdSwiCi0JCQkiIGRyb3BwaW5nIHBhY2tldFxuIiwgcHJvZHVjZXIsCi0JCQlhZGFwdGVyLT5sYXN0X2NtZF9jb25zdW1lciwKLQkJCXBvcnQtPnN0YXRzLm5vY21kZGVzY3JpcHRvcik7Ci0KIAkJbmV0aWZfc3RvcF9xdWV1ZShuZXRkZXYpOwotCQlwb3J0LT5mbGFncyB8PSBORVRYRU5fTkVUREVWX1NUQVRVUzsKKwkJYWRhcHRlci0+ZmxhZ3MgfD0gTkVUWEVOX05FVERFVl9TVEFUVVM7CiAJCXNwaW5fdW5sb2NrX2JoKCZhZGFwdGVyLT50eF9sb2NrKTsKIAkJcmV0dXJuIE5FVERFVl9UWF9CVVNZOwogCX0KQEAgLTgyOCwxNiArOTMwLDE3IEBACiAJcGJ1Zi0+c2tiID0gc2tiOwogCXBidWYtPmNtZCA9IFRYX0VUSEVSX1BLVDsKIAlwYnVmLT5mcmFnX2NvdW50ID0gZnJhZ19jb3VudDsKLQlwYnVmLT5wb3J0ID0gcG9ydC0+cG9ydG51bTsKKwlwYnVmLT5wb3J0ID0gYWRhcHRlci0+cG9ydG51bTsKIAlidWZmcmFnID0gJnBidWYtPmZyYWdfYXJyYXlbMF07Ci0JYnVmZnJhZy0+ZG1hID0gcGNpX21hcF9zaW5nbGUocG9ydC0+cGRldiwgc2tiLT5kYXRhLCBmaXJzdF9zZWdfbGVuLAorCWJ1ZmZyYWctPmRtYSA9IHBjaV9tYXBfc2luZ2xlKGFkYXB0ZXItPnBkZXYsIHNrYi0+ZGF0YSwgZmlyc3Rfc2VnX2xlbiwKIAkJCQkgICAgICBQQ0lfRE1BX1RPREVWSUNFKTsKIAlidWZmcmFnLT5sZW5ndGggPSBmaXJzdF9zZWdfbGVuOwogCW5ldHhlbl9zZXRfY21kX2Rlc2NfdG90YWxsZW5ndGgoaHdkZXNjLCBza2ItPmxlbik7CiAJbmV0eGVuX3NldF9jbWRfZGVzY19udW1fb2ZfYnVmZihod2Rlc2MsIGZyYWdfY291bnQpOwogCW5ldHhlbl9zZXRfY21kX2Rlc2Nfb3Bjb2RlKGh3ZGVzYywgVFhfRVRIRVJfUEtUKTsKIAotCW5ldHhlbl9zZXRfY21kX2Rlc2NfcG9ydChod2Rlc2MsIHBvcnQtPnBvcnRudW0pOworCW5ldHhlbl9zZXRfY21kX2Rlc2NfcG9ydChod2Rlc2MsIGFkYXB0ZXItPnBvcnRudW0pOworCW5ldHhlbl9zZXRfY21kX2Rlc2NfY3R4aWQoaHdkZXNjLCBhZGFwdGVyLT5wb3J0bnVtKTsKIAlod2Rlc2MtPmJ1ZmZlcjFfbGVuZ3RoID0gY3B1X3RvX2xlMTYoZmlyc3Rfc2VnX2xlbik7CiAJaHdkZXNjLT5hZGRyX2J1ZmZlcjEgPSBjcHVfdG9fbGU2NChidWZmcmFnLT5kbWEpOwogCkBAIC04NjAsNyArOTYzLDcgQEAKIAkJb2Zmc2V0ID0gZnJhZy0+cGFnZV9vZmZzZXQ7CiAKIAkJdGVtcF9sZW4gPSBsZW47Ci0JCXRlbXBfZG1hID0gcGNpX21hcF9wYWdlKHBvcnQtPnBkZXYsIGZyYWctPnBhZ2UsIG9mZnNldCwKKwkJdGVtcF9kbWEgPSBwY2lfbWFwX3BhZ2UoYWRhcHRlci0+cGRldiwgZnJhZy0+cGFnZSwgb2Zmc2V0LAogCQkJCQlsZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOwogCiAJCWJ1ZmZyYWcrKzsKQEAgLTkyMCwyNiArMTAyMywzNiBAQAogCQkJLyogY29weSB0aGUgbmV4dCA2NCBieXRlcyAtIHNob3VsZCBiZSBlbm91Z2ggZXhjZXB0CiAJCQkgKiBmb3IgcGF0aG9sb2dpY2FsIGNhc2UKIAkJCSAqLwotCQkJbWVtY3B5KCh2b2lkICopaHdkZXNjLCAodm9pZCAqKShza2ItPmRhdGEpICsKLQkJCSAgICAgICBmaXJzdF9oZHJfbGVuLCBoZHJfbGVuIC0gZmlyc3RfaGRyX2xlbik7CisJCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhX29mZnNldChza2IsIGZpcnN0X2hkcl9sZW4sCisJCQkJCQkJIGh3ZGVzYywKKwkJCQkJCQkgKGhkcl9sZW4gLQorCQkJCQkJCSAgZmlyc3RfaGRyX2xlbikpOwogCQkJcHJvZHVjZXIgPSBnZXRfbmV4dF9pbmRleChwcm9kdWNlciwgbWF4X3R4X2Rlc2NfY291bnQpOwogCQl9CiAJfQorCisJaSA9IG5ldHhlbl9nZXRfY21kX2Rlc2NfdG90YWxsZW5ndGgoJmh3LT5jbWRfZGVzY19oZWFkW3NhdmVkX3Byb2R1Y2VyXSk7CisKKwlody0+Y21kX2Rlc2NfaGVhZFtzYXZlZF9wcm9kdWNlcl0uZmxhZ3Nfb3Bjb2RlID0KKwkJY3B1X3RvX2xlMTYoaHctPmNtZF9kZXNjX2hlYWRbc2F2ZWRfcHJvZHVjZXJdLmZsYWdzX29wY29kZSk7CisJaHctPmNtZF9kZXNjX2hlYWRbc2F2ZWRfcHJvZHVjZXJdLm51bV9vZl9idWZmZXJzX3RvdGFsX2xlbmd0aCA9CisJICBjcHVfdG9fbGUzMihody0+Y21kX2Rlc2NfaGVhZFtzYXZlZF9wcm9kdWNlcl0uCisJCQkgIG51bV9vZl9idWZmZXJzX3RvdGFsX2xlbmd0aCk7CisKIAlzcGluX2xvY2tfYmgoJmFkYXB0ZXItPnR4X2xvY2spOwotCXBvcnQtPnN0YXRzLnR4Ynl0ZXMgKz0KLQkgICAgbmV0eGVuX2dldF9jbWRfZGVzY190b3RhbGxlbmd0aCgmaHctPmNtZF9kZXNjX2hlYWRbc2F2ZWRfcHJvZHVjZXJdKTsKKwlhZGFwdGVyLT5zdGF0cy50eGJ5dGVzICs9IGk7CisKIAkvKiBDb2RlIHRvIHVwZGF0ZSB0aGUgYWRhcHRlciBjb25zaWRlcmluZyBob3cgbWFueSBwcm9kdWNlciB0aHJlYWRzCiAJICAgYXJlIGN1cnJlbnRseSB3b3JraW5nICovCiAJaWYgKCgtLWFkYXB0ZXItPm51bV90aHJlYWRzKSA9PSAwKSB7CiAJCS8qIFRoaXMgaXMgdGhlIGxhc3QgdGhyZWFkICovCiAJCXUzMiBjcmJfcHJvZHVjZXIgPSBhZGFwdGVyLT5jbWRfcHJvZHVjZXI7Ci0JCXdyaXRlbChjcmJfcHJvZHVjZXIsCi0JCSAgICAgICBORVRYRU5fQ1JCX05PUk1BTElaRShhZGFwdGVyLCBDUkJfQ01EX1BST0RVQ0VSX09GRlNFVCkpOworCQluZXR4ZW5fbmljX3VwZGF0ZV9jbWRfcHJvZHVjZXIoYWRhcHRlciwgY3JiX3Byb2R1Y2VyKTsKIAkJd21iKCk7CiAJCWFkYXB0ZXItPnRvdGFsX3RocmVhZHMgPSAwOwogCX0KIAotCXBvcnQtPnN0YXRzLnhtaXRmaW5pc2hlZCsrOworCWFkYXB0ZXItPnN0YXRzLnhtaXRmaW5pc2hlZCsrOwogCXNwaW5fdW5sb2NrX2JoKCZhZGFwdGVyLT50eF9sb2NrKTsKIAogCW5ldGRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOwpAQCAtOTU5LDI3ICsxMDcyLDI2IEBACiAKIHN0YXRpYyB2b2lkIG5ldHhlbl90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCiB7Ci0Jc3RydWN0IG5ldHhlbl9wb3J0ICpwb3J0ID0gKHN0cnVjdCBuZXR4ZW5fcG9ydCAqKW5ldGRldl9wcml2KG5ldGRldik7Ci0KLQlTQ0hFRFVMRV9XT1JLKCZwb3J0LT50eF90aW1lb3V0X3Rhc2spOworCXN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciA9IChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKikKKwkJCQkJCW5ldGRldl9wcml2KG5ldGRldik7CisJU0NIRURVTEVfV09SSygmYWRhcHRlci0+dHhfdGltZW91dF90YXNrKTsKIH0KIAogc3RhdGljIHZvaWQgbmV0eGVuX3R4X3RpbWVvdXRfdGFzayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IG5ldHhlbl9wb3J0ICpwb3J0ID0KLQkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBuZXR4ZW5fcG9ydCwgdHhfdGltZW91dF90YXNrKTsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gcG9ydC0+bmV0ZGV2OworCXN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciA9IAorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IG5ldHhlbl9hZGFwdGVyLCB0eF90aW1lb3V0X3Rhc2spOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlwcmludGsoS0VSTl9FUlIgIiVzICVzOiB0cmFuc21pdCB0aW1lb3V0LCByZXNldHRpbmcuXG4iLAotCSAgICAgICBuZXR4ZW5fbmljX2RyaXZlcl9uYW1lLCBuZXRkZXYtPm5hbWUpOworCSAgICAgICBuZXR4ZW5fbmljX2RyaXZlcl9uYW1lLCBhZGFwdGVyLT5uZXRkZXYtPm5hbWUpOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmFkYXB0ZXItPmxvY2ssIGZsYWdzKTsKLQluZXR4ZW5fbmljX2Nsb3NlKG5ldGRldik7Ci0JbmV0eGVuX25pY19vcGVuKG5ldGRldik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+YWRhcHRlci0+bG9jaywgZmxhZ3MpOwotCW5ldGRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOwotCW5ldGlmX3dha2VfcXVldWUobmV0ZGV2KTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+bG9jaywgZmxhZ3MpOworCW5ldHhlbl9uaWNfY2xvc2UoYWRhcHRlci0+bmV0ZGV2KTsKKwluZXR4ZW5fbmljX29wZW4oYWRhcHRlci0+bmV0ZGV2KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5sb2NrLCBmbGFncyk7CisJYWRhcHRlci0+bmV0ZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJbmV0aWZfd2FrZV9xdWV1ZShhZGFwdGVyLT5uZXRkZXYpOwogfQogCiBzdGF0aWMgaW50CkBAIC05ODgsMTcgKzExMDAsMTYgQEAKIAl1MzIgcmV0ID0gMDsKIAogCURQUklOVEsoSU5GTywgIkVudGVyZWQgaGFuZGxlIElTUlxuIik7Ci0KIAlhZGFwdGVyLT5zdGF0cy5pbnRzKys7CiAKIAlpZiAoIShhZGFwdGVyLT5mbGFncyAmIE5FVFhFTl9OSUNfTVNJX0VOQUJMRUQpKSB7CiAJCWludCBjb3VudCA9IDA7CiAJCXUzMiBtYXNrOwotCQltYXNrID0gcmVhZGwocGNpX2Jhc2Vfb2Zmc2V0KGFkYXB0ZXIsIElTUl9JTlRfVkVDVE9SKSk7Ci0JCWlmICgobWFzayAmIDB4ODApID09IDApIHsKLQkJCS8qIG5vdCBvdXIgaW50ZXJydXB0ICovCisJCXUzMiBvdXJfaW50ID0gMDsKKwkJb3VyX2ludCA9IHJlYWRsKE5FVFhFTl9DUkJfTk9STUFMSVpFKGFkYXB0ZXIsIENSQl9JTlRfVkVDVE9SKSk7CisJCS8qIG5vdCBvdXIgaW50ZXJydXB0ICovCisJCWlmICgob3VyX2ludCAmICgweDgwIDw8IGFkYXB0ZXItPnBvcnRudW0pKSA9PSAwKQogCQkJcmV0dXJuIHJldDsKLQkJfQogCQluZXR4ZW5fbmljX2Rpc2FibGVfaW50KGFkYXB0ZXIpOwogCQkvKiBXaW5kb3cgPSAwIG9yIDEgKi8KIAkJZG8gewpAQCAtMTAxMCw3ICsxMTIxLDYgQEAKIAkJCXByaW50aygiQ291bGQgbm90IGRpc2FibGUgaW50ZXJydXB0IGNvbXBsZXRlbHlcbiIpOwogCiAJfQotCWFkYXB0ZXItPnN0YXRzLmhvc3RpbnRzKys7CiAKIAlpZiAobmV0eGVuX25pY19yeF9oYXNfd29yayhhZGFwdGVyKSB8fCBuZXR4ZW5fbmljX3R4X2hhc193b3JrKGFkYXB0ZXIpKSB7CiAJCWlmIChuZXRpZl9yeF9zY2hlZHVsZV9wcmVwKG5ldGRldikpIHsKQEAgLTEwNDQsMzMgKzExNTQsMjQgQEAKIGlycXJldHVybl90IG5ldHhlbl9pbnRyKGludCBpcnEsIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyOwotCXN0cnVjdCBuZXR4ZW5fcG9ydCAqcG9ydDsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OwotCWludCBpOwogCiAJaWYgKHVubGlrZWx5KCFpcnEpKSB7CiAJCXJldHVybiBJUlFfTk9ORTsJLyogTm90IG91ciBpbnRlcnJ1cHQgKi8KIAl9CiAKIAlhZGFwdGVyID0gKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqKWRhdGE7Ci0JZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPmFody5tYXhfcG9ydHM7IGkrKykgewotCQlwb3J0ID0gYWRhcHRlci0+cG9ydFtpXTsKLQkJbmV0ZGV2ID0gcG9ydC0+bmV0ZGV2OwotCi0JCS8qIHByb2Nlc3Mgb3VyIHN0YXR1cyBxdWV1ZSAoZm9yIGFsbCA0IHBvcnRzKSAqLwotCQlpZiAobmV0aWZfcnVubmluZyhuZXRkZXYpKSB7Ci0JCQluZXR4ZW5faGFuZGxlX2ludChhZGFwdGVyLCBuZXRkZXYpOwotCQkJYnJlYWs7Ci0JCX0KLQl9CisJbmV0ZGV2ICA9IGFkYXB0ZXItPm5ldGRldjsKKwkvKiBwcm9jZXNzIG91ciBzdGF0dXMgcXVldWUgKGZvciBhbGwgNCBwb3J0cykgKi8KKwlpZiAobmV0aWZfcnVubmluZyhuZXRkZXYpKQorCQluZXR4ZW5faGFuZGxlX2ludChhZGFwdGVyLCBuZXRkZXYpOwogCiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCiBzdGF0aWMgaW50IG5ldHhlbl9uaWNfcG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgKmJ1ZGdldCkKIHsKLQlzdHJ1Y3QgbmV0eGVuX3BvcnQgKnBvcnQgPSAoc3RydWN0IG5ldHhlbl9wb3J0ICopbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQlzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwb3J0LT5hZGFwdGVyOworCXN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJaW50IHdvcmtfdG9fZG8gPSBtaW4oKmJ1ZGdldCwgbmV0ZGV2LT5xdW90YSk7CiAJaW50IGRvbmUgPSAxOwogCWludCBjdHg7CkBAIC0xMDc4LDcgKzExNzksNiBAQAogCWludCB3b3JrX2RvbmUgPSAwOwogCiAJRFBSSU5USyhJTkZPLCAicG9sbGluZyBmb3IgJWQgZGVzY3JpcHRvcnNcbiIsICpidWRnZXQpOwotCXBvcnQtPnN0YXRzLnBvbGxlZCsrOwogCiAJd29ya19kb25lID0gMDsKIAlmb3IgKGN0eCA9IDA7IGN0eCA8IE1BWF9SQ1ZfQ1RYOyArK2N0eCkgewpAQCAtMTEyMiw4ICsxMjIyLDcgQEAKICNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgogc3RhdGljIHZvaWQgbmV0eGVuX25pY19wb2xsX2NvbnRyb2xsZXIoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKIHsKLQlzdHJ1Y3QgbmV0eGVuX3BvcnQgKnBvcnQgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCXN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciA9IHBvcnQtPmFkYXB0ZXI7CisJc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlkaXNhYmxlX2lycShhZGFwdGVyLT5pcnEpOwogCW5ldHhlbl9pbnRyKGFkYXB0ZXItPmlycSwgYWRhcHRlcik7CiAJZW5hYmxlX2lycShhZGFwdGVyLT5pcnEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWNfbml1LmMgYi9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pY19uaXUuYwppbmRleCBkNWQ5NTA3Li5jZWY5MGE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pY19uaXUuYworKysgYi9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pY19uaXUuYwpAQCAtODgsMTIgKzg4LDEzIEBACiAgKgkgIC0xIG9uIGVycm9yCiAgKgogICovCi1pbnQgbmV0eGVuX25pdV9nYmVfcGh5X3JlYWQoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLCBsb25nIHBoeSwKLQkJCSAgICBsb25nIHJlZywgX191MzIgKiByZWFkdmFsKQoraW50IG5ldHhlbl9uaXVfZ2JlX3BoeV9yZWFkKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwgbG9uZyByZWcsIAorCQkJCV9fdTMyICogcmVhZHZhbCkKIHsKIAlsb25nIHRpbWVvdXQgPSAwOwogCWxvbmcgcmVzdWx0ID0gMDsKIAlsb25nIHJlc3RvcmUgPSAwOworCWxvbmcgcGh5ID0gcGh5c2ljYWxfcG9ydFthZGFwdGVyLT5wb3J0bnVtXTsKIAlfX3UzMiBhZGRyZXNzOwogCV9fdTMyIGNvbW1hbmQ7CiAJX191MzIgc3RhdHVzOwpAQCAtMTgzLDEyICsxODQsMTMgQEAKICAqCSAgLTEgb24gZXJyb3IKICAqCiAgKi8KLWludCBuZXR4ZW5fbml1X2diZV9waHlfd3JpdGUoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLAotCQkJICAgICBsb25nIHBoeSwgbG9uZyByZWcsIF9fdTMyIHZhbCkKK2ludCBuZXR4ZW5fbml1X2diZV9waHlfd3JpdGUoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLCBsb25nIHJlZywgCisJCQkJX191MzIgdmFsKQogewogCWxvbmcgdGltZW91dCA9IDA7CiAJbG9uZyByZXN1bHQgPSAwOwogCWxvbmcgcmVzdG9yZSA9IDA7CisJbG9uZyBwaHkgPSBwaHlzaWNhbF9wb3J0W2FkYXB0ZXItPnBvcnRudW1dOwogCV9fdTMyIGFkZHJlc3M7CiAJX191MzIgY29tbWFuZDsKIAlfX3UzMiBzdGF0dXM7CkBAIC0yNTgsMTUgKzI2MCwxMyBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKLWludCBuZXR4ZW5fbml1X3hnYmVfZW5hYmxlX3BoeV9pbnRlcnJ1cHRzKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwKLQkJCQkJICBpbnQgcG9ydCkKK2ludCBuZXR4ZW5fbml1X3hnYmVfZW5hYmxlX3BoeV9pbnRlcnJ1cHRzKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlcikKIHsKIAluZXR4ZW5fY3JiX3dyaXRlbGl0X2FkYXB0ZXIoYWRhcHRlciwgTkVUWEVOX05JVV9JTlRfTUFTSywgMHgzZik7CiAJcmV0dXJuIDA7CiB9CiAKLWludCBuZXR4ZW5fbml1X2diZV9lbmFibGVfcGh5X2ludGVycnVwdHMoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLAotCQkJCQkgaW50IHBvcnQpCitpbnQgbmV0eGVuX25pdV9nYmVfZW5hYmxlX3BoeV9pbnRlcnJ1cHRzKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlcikKIHsKIAlpbnQgcmVzdWx0ID0gMDsKIAlfX3UzMiBlbmFibGUgPSAwOwpAQCAtMjc1LDcgKzI3NSw3IEBACiAJbmV0eGVuX3NldF9waHlfaW50X3NwZWVkX2NoYW5nZWQoZW5hYmxlKTsKIAogCWlmICgwICE9Ci0JICAgIG5ldHhlbl9uaXVfZ2JlX3BoeV93cml0ZShhZGFwdGVyLCBwb3J0LAorCSAgICBuZXR4ZW5fbml1X2diZV9waHlfd3JpdGUoYWRhcHRlciwgCiAJCQkJICAgICBORVRYRU5fTklVX0dCX01JSV9NR01UX0FERFJfSU5UX0VOQUJMRSwKIAkJCQkgICAgIGVuYWJsZSkpCiAJCXJlc3VsdCA9IC1FSU87CkBAIC0yODMsMzggKzI4MywzNCBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKLWludCBuZXR4ZW5fbml1X3hnYmVfZGlzYWJsZV9waHlfaW50ZXJydXB0cyhzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsCi0JCQkJCSAgIGludCBwb3J0KQoraW50IG5ldHhlbl9uaXVfeGdiZV9kaXNhYmxlX3BoeV9pbnRlcnJ1cHRzKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlcikKIHsKIAluZXR4ZW5fY3JiX3dyaXRlbGl0X2FkYXB0ZXIoYWRhcHRlciwgTkVUWEVOX05JVV9JTlRfTUFTSywgMHg3Zik7CiAJcmV0dXJuIDA7CiB9CiAKLWludCBuZXR4ZW5fbml1X2diZV9kaXNhYmxlX3BoeV9pbnRlcnJ1cHRzKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwKLQkJCQkJICBpbnQgcG9ydCkKK2ludCBuZXR4ZW5fbml1X2diZV9kaXNhYmxlX3BoeV9pbnRlcnJ1cHRzKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlcikKIHsKIAlpbnQgcmVzdWx0ID0gMDsKIAlpZiAoMCAhPQotCSAgICBuZXR4ZW5fbml1X2diZV9waHlfd3JpdGUoYWRhcHRlciwgcG9ydCwKKwkgICAgbmV0eGVuX25pdV9nYmVfcGh5X3dyaXRlKGFkYXB0ZXIsCiAJCQkJICAgICBORVRYRU5fTklVX0dCX01JSV9NR01UX0FERFJfSU5UX0VOQUJMRSwgMCkpCiAJCXJlc3VsdCA9IC1FSU87CiAKIAlyZXR1cm4gcmVzdWx0OwogfQogCi1pbnQgbmV0eGVuX25pdV94Z2JlX2NsZWFyX3BoeV9pbnRlcnJ1cHRzKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwKLQkJCQkJIGludCBwb3J0KQoraW50IG5ldHhlbl9uaXVfeGdiZV9jbGVhcl9waHlfaW50ZXJydXB0cyhzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7CiAJbmV0eGVuX2NyYl93cml0ZWxpdF9hZGFwdGVyKGFkYXB0ZXIsIE5FVFhFTl9OSVVfQUNUSVZFX0lOVCwgLTEpOwogCXJldHVybiAwOwogfQogCi1pbnQgbmV0eGVuX25pdV9nYmVfY2xlYXJfcGh5X2ludGVycnVwdHMoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLAotCQkJCQlpbnQgcG9ydCkKK2ludCBuZXR4ZW5fbml1X2diZV9jbGVhcl9waHlfaW50ZXJydXB0cyhzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7CiAJaW50IHJlc3VsdCA9IDA7CiAJaWYgKDAgIT0KLQkgICAgbmV0eGVuX25pdV9nYmVfcGh5X3dyaXRlKGFkYXB0ZXIsIHBvcnQsCisJICAgIG5ldHhlbl9uaXVfZ2JlX3BoeV93cml0ZShhZGFwdGVyLCAKIAkJCQkgICAgIE5FVFhFTl9OSVVfR0JfTUlJX01HTVRfQUREUl9JTlRfU1RBVFVTLAogCQkJCSAgICAgLUVJTykpCiAJCXJlc3VsdCA9IC1FSU87CkBAIC0zNTUsOSArMzUxLDkgQEAKIAkJCQkJICAgIDB4NSk7CiAJfQogCi0JaWYgKG5ldHhlbl9uaXVfZ2JlX2VuYWJsZV9waHlfaW50ZXJydXB0cyhhZGFwdGVyLCBwb3J0KSkKKwlpZiAobmV0eGVuX25pdV9nYmVfZW5hYmxlX3BoeV9pbnRlcnJ1cHRzKGFkYXB0ZXIpKQogCQlwcmludGsoS0VSTl9FUlIgUEZYICJFUlJPUiBlbmFibGluZyBQSFkgaW50ZXJydXB0c1xuIik7Ci0JaWYgKG5ldHhlbl9uaXVfZ2JlX2NsZWFyX3BoeV9pbnRlcnJ1cHRzKGFkYXB0ZXIsIHBvcnQpKQorCWlmIChuZXR4ZW5fbml1X2diZV9jbGVhcl9waHlfaW50ZXJydXB0cyhhZGFwdGVyKSkKIAkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiRVJST1IgY2xlYXJpbmcgUEhZIGludGVycnVwdHNcbiIpOwogfQogCkBAIC0zOTMsOSArMzg5LDkgQEAKIAkJCQkJICAgIDB4NSk7CiAJfQogCi0JaWYgKG5ldHhlbl9uaXVfZ2JlX2VuYWJsZV9waHlfaW50ZXJydXB0cyhhZGFwdGVyLCBwb3J0KSkKKwlpZiAobmV0eGVuX25pdV9nYmVfZW5hYmxlX3BoeV9pbnRlcnJ1cHRzKGFkYXB0ZXIpKQogCQlwcmludGsoS0VSTl9FUlIgUEZYICJFUlJPUiBlbmFibGluZyBQSFkgaW50ZXJydXB0c1xuIik7Ci0JaWYgKG5ldHhlbl9uaXVfZ2JlX2NsZWFyX3BoeV9pbnRlcnJ1cHRzKGFkYXB0ZXIsIHBvcnQpKQorCWlmIChuZXR4ZW5fbml1X2diZV9jbGVhcl9waHlfaW50ZXJydXB0cyhhZGFwdGVyKSkKIAkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiRVJST1IgY2xlYXJpbmcgUEhZIGludGVycnVwdHNcbiIpOwogfQogCkBAIC00MDQsMTEgKzQwMCwxMSBAQAogCWludCByZXN1bHQgPSAwOwogCV9fdTMyIHN0YXR1czsKIAlpZiAoYWRhcHRlci0+ZGlzYWJsZV9waHlfaW50ZXJydXB0cykKLQkJYWRhcHRlci0+ZGlzYWJsZV9waHlfaW50ZXJydXB0cyhhZGFwdGVyLCBwb3J0KTsKKwkJYWRhcHRlci0+ZGlzYWJsZV9waHlfaW50ZXJydXB0cyhhZGFwdGVyKTsKIAltZGVsYXkoMik7CiAKIAlpZiAoMCA9PQotCSAgICBuZXR4ZW5fbml1X2diZV9waHlfcmVhZChhZGFwdGVyLCBwb3J0LAorCSAgICBuZXR4ZW5fbml1X2diZV9waHlfcmVhZChhZGFwdGVyLAogCQkJCSAgICBORVRYRU5fTklVX0dCX01JSV9NR01UX0FERFJfUEhZX1NUQVRVUywKIAkJCQkgICAgJnN0YXR1cykpIHsKIAkJaWYgKG5ldHhlbl9nZXRfcGh5X2xpbmsoc3RhdHVzKSkgewpAQCAtNDM5LDEzICs0MzUsMTMgQEAKIAkJCQkJCSAgICB8IE5FVFhFTl9HQl9NQUNfRU5BQkxFX1RYX1JYCiAJCQkJCQkgICAgfAogCQkJCQkJICAgIE5FVFhFTl9HQl9NQUNfUEFVU0VEX0ZSTVMpOwotCQkJaWYgKG5ldHhlbl9uaXVfZ2JlX2NsZWFyX3BoeV9pbnRlcnJ1cHRzKGFkYXB0ZXIsIHBvcnQpKQorCQkJaWYgKG5ldHhlbl9uaXVfZ2JlX2NsZWFyX3BoeV9pbnRlcnJ1cHRzKGFkYXB0ZXIpKQogCQkJCXByaW50ayhLRVJOX0VSUiBQRlgKIAkJCQkgICAgICAgIkVSUk9SIGNsZWFyaW5nIFBIWSBpbnRlcnJ1cHRzXG4iKTsKLQkJCWlmIChuZXR4ZW5fbml1X2diZV9lbmFibGVfcGh5X2ludGVycnVwdHMoYWRhcHRlciwgcG9ydCkpCisJCQlpZiAobmV0eGVuX25pdV9nYmVfZW5hYmxlX3BoeV9pbnRlcnJ1cHRzKGFkYXB0ZXIpKQogCQkJCXByaW50ayhLRVJOX0VSUiBQRlgKIAkJCQkgICAgICAgIkVSUk9SIGVuYWJsaW5nIFBIWSBpbnRlcnJ1cHRzXG4iKTsKLQkJCWlmIChuZXR4ZW5fbml1X2diZV9jbGVhcl9waHlfaW50ZXJydXB0cyhhZGFwdGVyLCBwb3J0KSkKKwkJCWlmIChuZXR4ZW5fbml1X2diZV9jbGVhcl9waHlfaW50ZXJydXB0cyhhZGFwdGVyKSkKIAkJCQlwcmludGsoS0VSTl9FUlIgUEZYCiAJCQkJICAgICAgICJFUlJPUiBjbGVhcmluZyBQSFkgaW50ZXJydXB0c1xuIik7CiAJCQlyZXN1bHQgPSAtMTsKQEAgLTQ1OCwyNiArNDU0LDE4IEBACiAKIGludCBuZXR4ZW5fbml1X3hnX2luaXRfcG9ydChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBwb3J0KQogewotCXUzMiByZWcgPSAwLCByZXQgPSAwOworCXUzMiByZWc7CisJdTMyIHBvcnRudW0gPSBwaHlzaWNhbF9wb3J0W2FkYXB0ZXItPnBvcnRudW1dOwogCi0JaWYgKGFkYXB0ZXItPmFody5ib2FyZGNmZy5ib2FyZF90eXBlID09IE5FVFhFTl9CUkRUWVBFX1AyX1NCMzFfMTBHX0lNRVopIHsKLQkJbmV0eGVuX2NyYl93cml0ZWxpdF9hZGFwdGVyKGFkYXB0ZXIsCi0JCQkJCSAgICBORVRYRU5fTklVX1hHMV9DT05GSUdfMCwgMHg1KTsKLQkJLyogWFhYIGhhY2sgZm9yIE1leiBjYXJkczogYm90aCBwb3J0cyBpbiBwcm9taXNjIG1vZGUgKi8KLQkJbmV0eGVuX25pY19od19yZWFkX3d4KGFkYXB0ZXIsCi0JCQkJICAgICAgTkVUWEVOX05JVV9YR0VfQ09ORklHXzEsICZyZWcsIDQpOwotCQlyZWcgPSAocmVnIHwgMHgyMDAwVUwpOwotCQluZXR4ZW5fY3JiX3dyaXRlbGl0X2FkYXB0ZXIoYWRhcHRlciwKLQkJCQkJICAgIE5FVFhFTl9OSVVfWEdFX0NPTkZJR18xLCByZWcpOwotCQlyZWcgPSAwOwotCQluZXR4ZW5fbmljX2h3X3JlYWRfd3goYWRhcHRlciwKLQkJCQkgICAgICBORVRYRU5fTklVX1hHMV9DT05GSUdfMSwgJnJlZywgNCk7Ci0JCXJlZyA9IChyZWcgfCAweDIwMDBVTCk7Ci0JCW5ldHhlbl9jcmJfd3JpdGVsaXRfYWRhcHRlcihhZGFwdGVyLAotCQkJCQkgICAgTkVUWEVOX05JVV9YRzFfQ09ORklHXzEsIHJlZyk7Ci0JfQorCW5ldHhlbl9jcmJfd3JpdGVsaXRfYWRhcHRlcihhZGFwdGVyLAorCQlORVRYRU5fTklVX1hHRV9DT05GSUdfMCsoMHgxMDAwMCpwb3J0bnVtKSwgMHg1KTsKKwluZXR4ZW5fbmljX2h3X3JlYWRfd3goYWRhcHRlciwKKwkJTkVUWEVOX05JVV9YR0VfQ09ORklHXzErKDB4MTAwMDAqcG9ydG51bSksICZyZWcsIDQpOworCXJlZyA9IChyZWcgJiB+MHgyMDAwVUwpOworCW5ldHhlbl9jcmJfd3JpdGVsaXRfYWRhcHRlcihhZGFwdGVyLAorCQlORVRYRU5fTklVX1hHRV9DT05GSUdfMSsoMHgxMDAwMCpwb3J0bnVtKSwgcmVnKTsKIAotCXJldHVybiByZXQ7CisJcmV0dXJuIDA7CiB9CiAKIC8qIApAQCAtNDk4LDcgKzQ4Niw3IEBACiAJICogVGhlIHJlYWQgb2YgdGhlIFBIWSBJTlQgc3RhdHVzIHdpbGwgY2xlYXIgdGhlIHBlbmRpbmcKIAkgKiBpbnRlcnJ1cHQgc3RhdHVzCiAJICovCi0JaWYgKG5ldHhlbl9uaXVfZ2JlX3BoeV9yZWFkKGFkYXB0ZXIsIHBvcnQsCisJaWYgKG5ldHhlbl9uaXVfZ2JlX3BoeV9yZWFkKGFkYXB0ZXIsCiAJCQkJICAgIE5FVFhFTl9OSVVfR0JfTUlJX01HTVRfQUREUl9JTlRfU1RBVFVTLAogCQkJCSAgICAmaW50X3NyYykgIT0gMCkKIAkJcmVzdWx0ID0gLUVJTlZBTDsKQEAgLTUzNSw3ICs1MjMsNyBAQAogCQkJcHJpbnRrKEtFUk5fSU5GTyBQRlgKIAkJCSAgICAgICAic3BlZWRfY2hhbmdlZCBvciBsaW5rIHN0YXR1cyBjaGFuZ2VkIik7CiAJCQlpZiAobmV0eGVuX25pdV9nYmVfcGh5X3JlYWQKLQkJCSAgICAoYWRhcHRlciwgcG9ydCwKKwkJCSAgICAoYWRhcHRlciwKIAkJCSAgICAgTkVUWEVOX05JVV9HQl9NSUlfTUdNVF9BRERSX1BIWV9TVEFUVVMsCiAJCQkgICAgICZzdGF0dXMpID09IDApIHsKIAkJCQlpZiAobmV0eGVuX2dldF9waHlfc3BlZWQoc3RhdHVzKSA9PSAyKSB7CkBAIC01ODEsMTAgKzU2OSwxMSBAQAogICogTm90ZSB0aGF0IHRoZSBwYXNzZWQtaW4gdmFsdWUgbXVzdCBhbHJlYWR5IGJlIGluIG5ldHdvcmsgYnl0ZSBvcmRlci4KICAqLwogaW50IG5ldHhlbl9uaXVfbWFjYWRkcl9nZXQoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLAotCQkJICAgaW50IHBoeSwgbmV0eGVuX2V0aGVybmV0X21hY2FkZHJfdCAqIGFkZHIpCisJCQkgICBuZXR4ZW5fZXRoZXJuZXRfbWFjYWRkcl90ICogYWRkcikKIHsKIAl1MzIgc3RhdGlvbmhpZ2g7CiAJdTMyIHN0YXRpb25sb3c7CisJaW50IHBoeSA9IHBoeXNpY2FsX3BvcnRbYWRhcHRlci0+cG9ydG51bV07CiAJdTggdmFsWzhdOwogCiAJaWYgKGFkZHIgPT0gTlVMTCkKQEAgLTYxMCwxMyArNTk5LDEyIEBACiAgKiBTZXQgdGhlIHN0YXRpb24gTUFDIGFkZHJlc3MuCiAgKiBOb3RlIHRoYXQgdGhlIHBhc3NlZC1pbiB2YWx1ZSBtdXN0IGFscmVhZHkgYmUgaW4gbmV0d29yayBieXRlIG9yZGVyLgogICovCi1pbnQgbmV0eGVuX25pdV9tYWNhZGRyX3NldChzdHJ1Y3QgbmV0eGVuX3BvcnQgKnBvcnQsCitpbnQgbmV0eGVuX25pdV9tYWNhZGRyX3NldChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsCiAJCQkgICBuZXR4ZW5fZXRoZXJuZXRfbWFjYWRkcl90IGFkZHIpCiB7CiAJdTggdGVtcFs0XTsKIAl1MzIgdmFsOwotCXN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciA9IHBvcnQtPmFkYXB0ZXI7Ci0JaW50IHBoeSA9IHBvcnQtPnBvcnRudW07CisJaW50IHBoeSA9IHBoeXNpY2FsX3BvcnRbYWRhcHRlci0+cG9ydG51bV07CiAJdW5zaWduZWQgY2hhciBtYWNfYWRkcls2XTsKIAlpbnQgaTsKIApAQCAtNjM0LDcgKzYyMiw3IEBACiAJCSAgICAoYWRhcHRlciwgTkVUWEVOX05JVV9HQl9TVEFUSU9OX0FERFJfMChwaHkpLCAmdmFsLCA0KSkKIAkJCXJldHVybiAtMjsKIAotCQluZXR4ZW5fbml1X21hY2FkZHJfZ2V0KGFkYXB0ZXIsIHBoeSwKKwkJbmV0eGVuX25pdV9tYWNhZGRyX2dldChhZGFwdGVyLCAKIAkJCQkgICAgICAgKG5ldHhlbl9ldGhlcm5ldF9tYWNhZGRyX3QgKikgbWFjX2FkZHIpOwogCQlpZiAobWVtY21wKG1hY19hZGRyLCBhZGRyLCA2KSA9PSAwKQogCQkJYnJlYWs7CkBAIC02NDIsNyArNjMwLDcgQEAKIAogCWlmIChpID09IDEwKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNhbm5vdCBzZXQgTWFjIGFkZHIgZm9yICVzXG4iLAotCQkgICAgICAgbmV0eGVuX25pY19kcml2ZXJfbmFtZSwgcG9ydC0+bmV0ZGV2LT5uYW1lKTsKKwkJICAgICAgIG5ldHhlbl9uaWNfZHJpdmVyX25hbWUsIGFkYXB0ZXItPm5ldGRldi0+bmFtZSk7CiAJCXByaW50ayhLRVJOX0VSUiAiTUFDIGFkZHJlc3Mgc2V0OiAiCiAJCSAgICAgICAiJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnguXG4iLAogCQkgICAgICAgYWRkclswXSwgYWRkclsxXSwgYWRkclsyXSwgYWRkclszXSwgYWRkcls0XSwgYWRkcls1XSk7CkBAIC03MzUsMTMgKzcyMywxMyBAQAogfQogCiAvKiBEaXNhYmxlIGEgR2JFIGludGVyZmFjZSAqLwotaW50IG5ldHhlbl9uaXVfZGlzYWJsZV9nYmVfcG9ydChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBwb3J0KQoraW50IG5ldHhlbl9uaXVfZGlzYWJsZV9nYmVfcG9ydChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7CiAJX191MzIgbWFjX2NmZzA7CisJdTMyIHBvcnQgPSBwaHlzaWNhbF9wb3J0W2FkYXB0ZXItPnBvcnRudW1dOwogCiAJaWYgKChwb3J0IDwgMCkgfHwgKHBvcnQgPiBORVRYRU5fTklVX01BWF9HQkVfUE9SVFMpKQogCQlyZXR1cm4gLUVJTlZBTDsKLQogCW1hY19jZmcwID0gMDsKIAluZXR4ZW5fZ2Jfc29mdF9yZXNldChtYWNfY2ZnMCk7CiAJaWYgKG5ldHhlbl9uaWNfaHdfd3JpdGVfd3goYWRhcHRlciwgTkVUWEVOX05JVV9HQl9NQUNfQ09ORklHXzAocG9ydCksCkBAIC03NTEsMTMgKzczOSwxMyBAQAogfQogCiAvKiBEaXNhYmxlIGFuIFhHIGludGVyZmFjZSAqLwotaW50IG5ldHhlbl9uaXVfZGlzYWJsZV94Z19wb3J0KHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwgaW50IHBvcnQpCitpbnQgbmV0eGVuX25pdV9kaXNhYmxlX3hnX3BvcnQoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyKQogewogCV9fdTMyIG1hY19jZmc7CisJdTMyIHBvcnQgPSBwaHlzaWNhbF9wb3J0W2FkYXB0ZXItPnBvcnRudW1dOwogCiAJaWYgKHBvcnQgIT0gMCkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0KIAltYWNfY2ZnID0gMDsKIAluZXR4ZW5feGdfc29mdF9yZXNldChtYWNfY2ZnKTsKIAlpZiAobmV0eGVuX25pY19od193cml0ZV93eChhZGFwdGVyLCBORVRYRU5fTklVX1hHRV9DT05GSUdfMCwKQEAgLTc2NywxMCArNzU1LDExIEBACiB9CiAKIC8qIFNldCBwcm9taXNjdW91cyBtb2RlIGZvciBhIEdiRSBpbnRlcmZhY2UgKi8KLWludCBuZXR4ZW5fbml1X3NldF9wcm9taXNjdW91c19tb2RlKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwgaW50IHBvcnQsCitpbnQgbmV0eGVuX25pdV9zZXRfcHJvbWlzY3VvdXNfbW9kZShzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsIAogCQkJCSAgICBuZXR4ZW5fbml1X3Byb21fbW9kZV90IG1vZGUpCiB7CiAJX191MzIgcmVnOworCXUzMiBwb3J0ID0gcGh5c2ljYWxfcG9ydFthZGFwdGVyLT5wb3J0bnVtXTsKIAogCWlmICgocG9ydCA8IDApIHx8IChwb3J0ID4gTkVUWEVOX05JVV9NQVhfR0JFX1BPUlRTKSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC04MjQsMjUgKzgxMyw1MCBAQAogICogU2V0IHRoZSBNQUMgYWRkcmVzcyBmb3IgYW4gWEcgcG9ydAogICogTm90ZSB0aGF0IHRoZSBwYXNzZWQtaW4gdmFsdWUgbXVzdCBhbHJlYWR5IGJlIGluIG5ldHdvcmsgYnl0ZSBvcmRlci4KICAqLwotaW50IG5ldHhlbl9uaXVfeGdfbWFjYWRkcl9zZXQoc3RydWN0IG5ldHhlbl9wb3J0ICpwb3J0LAoraW50IG5ldHhlbl9uaXVfeGdfbWFjYWRkcl9zZXQoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLAogCQkJICAgICAgbmV0eGVuX2V0aGVybmV0X21hY2FkZHJfdCBhZGRyKQogeworCWludCBwaHkgPSBwaHlzaWNhbF9wb3J0W2FkYXB0ZXItPnBvcnRudW1dOwogCXU4IHRlbXBbNF07CiAJdTMyIHZhbDsKLQlzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwb3J0LT5hZGFwdGVyOworCisJaWYgKChwaHkgPCAwKSB8fCAocGh5ID4gTkVUWEVOX05JVV9NQVhfWEdfUE9SVFMpKQorCQlyZXR1cm4gLUVJTzsKIAogCXRlbXBbMF0gPSB0ZW1wWzFdID0gMDsKLQltZW1jcHkodGVtcCArIDIsIGFkZHIsIDIpOwotCXZhbCA9IGxlMzJfdG9fY3B1KCooX19sZTMyICopdGVtcCk7Ci0JaWYgKG5ldHhlbl9uaWNfaHdfd3JpdGVfd3goYWRhcHRlciwgTkVUWEVOX05JVV9YR0VfU1RBVElPTl9BRERSXzBfMSwKLQkJCQkgICAmdmFsLCA0KSkKKwlzd2l0Y2ggKHBoeSkgeworCWNhc2UgMDoKKwkgICAgbWVtY3B5KHRlbXAgKyAyLCBhZGRyLCAyKTsKKwkgICAgdmFsID0gbGUzMl90b19jcHUoKihfX2xlMzIgKil0ZW1wKTsKKwkgICAgaWYgKG5ldHhlbl9uaWNfaHdfd3JpdGVfd3goYWRhcHRlciwgTkVUWEVOX05JVV9YR0VfU1RBVElPTl9BRERSXzBfMSwKKwkJCQkmdmFsLCA0KSkKIAkJcmV0dXJuIC1FSU87CiAKLQltZW1jcHkoJnRlbXAsICgodTggKikgYWRkcikgKyAyLCBzaXplb2YoX19sZTMyKSk7Ci0JdmFsID0gbGUzMl90b19jcHUoKihfX2xlMzIgKil0ZW1wKTsKLQlpZiAobmV0eGVuX25pY19od193cml0ZV93eChhZGFwdGVyLCBORVRYRU5fTklVX1hHRV9TVEFUSU9OX0FERFJfMF9ISSwKLQkJCQkgICAmdmFsLCA0KSkKKwkgICAgbWVtY3B5KCZ0ZW1wLCAoKHU4ICopIGFkZHIpICsgMiwgc2l6ZW9mKF9fbGUzMikpOworCSAgICB2YWwgPSBsZTMyX3RvX2NwdSgqKF9fbGUzMiAqKXRlbXApOworCSAgICBpZiAobmV0eGVuX25pY19od193cml0ZV93eChhZGFwdGVyLCBORVRYRU5fTklVX1hHRV9TVEFUSU9OX0FERFJfMF9ISSwKKwkJCQkmdmFsLCA0KSkKIAkJcmV0dXJuIC1FSU87CisJICAgIGJyZWFrOworCisJY2FzZSAxOgorCSAgICBtZW1jcHkodGVtcCArIDIsIGFkZHIsIDIpOworCSAgICB2YWwgPSBsZTMyX3RvX2NwdSgqKF9fbGUzMiAqKXRlbXApOworCSAgICBpZiAobmV0eGVuX25pY19od193cml0ZV93eChhZGFwdGVyLCBORVRYRU5fTklVX1hHMV9TVEFUSU9OX0FERFJfMF8xLAorCQkJCSZ2YWwsIDQpKQorCQlyZXR1cm4gLUVJTzsKKworCSAgICBtZW1jcHkoJnRlbXAsICgodTggKikgYWRkcikgKyAyLCBzaXplb2YoX19sZTMyKSk7CisJICAgIHZhbCA9IGxlMzJfdG9fY3B1KCooX19sZTMyICopdGVtcCk7CisJICAgIGlmIChuZXR4ZW5fbmljX2h3X3dyaXRlX3d4KGFkYXB0ZXIsIE5FVFhFTl9OSVVfWEcxX1NUQVRJT05fQUREUl8wX0hJLAorCQkJCSZ2YWwsIDQpKQorCQlyZXR1cm4gLUVJTzsKKwkgICAgYnJlYWs7CisKKwlkZWZhdWx0OgorCSAgICBwcmludGsoS0VSTl9FUlIgIlVua25vd24gcG9ydCAlZFxuIiwgcGh5KTsKKwkgICAgYnJlYWs7CisJfQogCiAJcmV0dXJuIDA7CiB9CkBAIC04NTEsOSArODY1LDEwIEBACiAgKiBSZXR1cm4gdGhlIGN1cnJlbnQgc3RhdGlvbiBNQUMgYWRkcmVzcy4KICAqIE5vdGUgdGhhdCB0aGUgcGFzc2VkLWluIHZhbHVlIG11c3QgYWxyZWFkeSBiZSBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIuCiAgKi8KLWludCBuZXR4ZW5fbml1X3hnX21hY2FkZHJfZ2V0KHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwgaW50IHBoeSwKK2ludCBuZXR4ZW5fbml1X3hnX21hY2FkZHJfZ2V0KHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwKIAkJCSAgICAgIG5ldHhlbl9ldGhlcm5ldF9tYWNhZGRyX3QgKiBhZGRyKQogeworCWludCBwaHkgPSBwaHlzaWNhbF9wb3J0W2FkYXB0ZXItPnBvcnRudW1dOwogCXUzMiBzdGF0aW9uaGlnaDsKIAl1MzIgc3RhdGlvbmxvdzsKIAl1OCB2YWxbOF07CkBAIC04NzgsMjEgKzg5MywyNCBAQAogfQogCiBpbnQgbmV0eGVuX25pdV94Z19zZXRfcHJvbWlzY3VvdXNfbW9kZShzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsCi0JCQkJICAgICAgIGludCBwb3J0LCBuZXR4ZW5fbml1X3Byb21fbW9kZV90IG1vZGUpCisJCQkJICAgICAgIG5ldHhlbl9uaXVfcHJvbV9tb2RlX3QgbW9kZSkKIHsKIAlfX3UzMiByZWc7CisJdTMyIHBvcnQgPSBwaHlzaWNhbF9wb3J0W2FkYXB0ZXItPnBvcnRudW1dOwogCi0JaWYgKChwb3J0IDwgMCkgfHwgKHBvcnQgPiBORVRYRU5fTklVX01BWF9HQkVfUE9SVFMpKQorCWlmICgocG9ydCA8IDApIHx8IChwb3J0ID4gTkVUWEVOX05JVV9NQVhfWEdfUE9SVFMpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmIChuZXR4ZW5fbmljX2h3X3JlYWRfd3goYWRhcHRlciwgTkVUWEVOX05JVV9YR0VfQ09ORklHXzEsICZyZWcsIDQpKQotCQlyZXR1cm4gLUVJTzsKKwlpZiAobmV0eGVuX25pY19od19yZWFkX3d4KGFkYXB0ZXIsCisJCU5FVFhFTl9OSVVfWEdFX0NPTkZJR18xICsgKDB4MTAwMDAgKiBwb3J0KSwgJnJlZywgNCkpCisJCQlyZXR1cm4gLUVJTzsKIAlpZiAobW9kZSA9PSBORVRYRU5fTklVX1BST01JU0NfTU9ERSkKIAkJcmVnID0gKHJlZyB8IDB4MjAwMFVMKTsKIAllbHNlCiAJCXJlZyA9IChyZWcgJiB+MHgyMDAwVUwpOwogCi0JbmV0eGVuX2NyYl93cml0ZWxpdF9hZGFwdGVyKGFkYXB0ZXIsIE5FVFhFTl9OSVVfWEdFX0NPTkZJR18xLCByZWcpOworCW5ldHhlbl9jcmJfd3JpdGVsaXRfYWRhcHRlcihhZGFwdGVyLAorCQlORVRYRU5fTklVX1hHRV9DT05GSUdfMSArICgweDEwMDAwICogcG9ydCksIHJlZyk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L25ldHhlbi9uZXR4ZW5fbmljX3BoYW5fcmVnLmggYi9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pY19waGFuX3JlZy5oCmluZGV4IDBjN2M5NDMuLjk0NTdmYzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L25ldHhlbi9uZXR4ZW5fbmljX3BoYW5fcmVnLmgKKysrIGIvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWNfcGhhbl9yZWcuaApAQCAtMTAwLDggKzEwMCwyMSBAQAogCiAjZGVmaW5lIENSQl9DTURfUFJPRFVDRVJfT0ZGU0VUXzEgICBORVRYRU5fTklDX1JFRygweDFhYykKICNkZWZpbmUgQ1JCX0NNRF9DT05TVU1FUl9PRkZTRVRfMSAgIE5FVFhFTl9OSUNfUkVHKDB4MWIwKQorI2RlZmluZSBDUkJfQ01EX1BST0RVQ0VSX09GRlNFVF8yICAgTkVUWEVOX05JQ19SRUcoMHgxYjgpCisjZGVmaW5lIENSQl9DTURfQ09OU1VNRVJfT0ZGU0VUXzIgICBORVRYRU5fTklDX1JFRygweDFiYykKKworLy8gMWMwIHRvIDFjYyB1c2VkIGZvciBzaWduYXR1cmUgcmVnCisjZGVmaW5lIENSQl9DTURfUFJPRFVDRVJfT0ZGU0VUXzMgICBORVRYRU5fTklDX1JFRygweDFkMCkKKyNkZWZpbmUgQ1JCX0NNRF9DT05TVU1FUl9PRkZTRVRfMyAgIE5FVFhFTl9OSUNfUkVHKDB4MWQ0KQogI2RlZmluZSBDUkJfVEVNUF9TVEFURSAgICAgICAgICAgICAgTkVUWEVOX05JQ19SRUcoMHgxYjQpCiAKKyNkZWZpbmUgQ1JCX1YyUF8wCQkgICAgTkVUWEVOX05JQ19SRUcoMHgyOTApCisjZGVmaW5lIENSQl9WMlBfMQkJICAgIE5FVFhFTl9OSUNfUkVHKDB4Mjk0KQorI2RlZmluZSBDUkJfVjJQXzIJCSAgICBORVRYRU5fTklDX1JFRygweDI5OCkKKyNkZWZpbmUgQ1JCX1YyUF8zCQkgICAgTkVUWEVOX05JQ19SRUcoMHgyOWMpCisjZGVmaW5lIENSQl9WMlAocG9ydCkJCSAgICAoQ1JCX1YyUF8wKygocG9ydCkqNCkpCisjZGVmaW5lIENSQl9EUklWRVJfVkVSU0lPTgkgICAgTkVUWEVOX05JQ19SRUcoMHgyYTApCisKIC8qIHVzZWQgZm9yIGV0aHRvb2wgdGVzdHMgKi8KICNkZWZpbmUgQ1JCX1NDUkFUQ0hQQURfVEVTVAkgICAgTkVUWEVOX05JQ19SRUcoMHgyODApCiAKQEAgLTEzOSwxMjggKzE1MiwxMyBAQAogfTsKIAogI2lmIGRlZmluZWQoREVGSU5FX0dMT0JBTF9SRUNWX0NSQikKLXN0cnVjdCBuZXR4ZW5fcmVjdl9jcmIgcmVjdl9jcmJfcmVnaXN0ZXJzW10gPSB7Ci0JLyoKLQkgKiBJbnN0YW5jZSAwLgotCSAqLwotCXsKLQkgLyogcmN2X2Rlc2NfY3JiOiAqLwotCSB7Ci0JICB7Ci0JICAgLyogY3JiX3Jjdl9wcm9kdWNlcl9vZmZzZXQ6ICovCi0JICAgTkVUWEVOX05JQ19SRUcoMHgxMDApLAotCSAgIC8qIGNyYl9yY3ZfY29uc3VtZXJfb2Zmc2V0OiAqLwotCSAgIE5FVFhFTl9OSUNfUkVHKDB4MTA0KSwKLQkgICAvKiBjcmJfZ2xvYWJscmN2X3Jpbmc6ICovCi0JICAgTkVUWEVOX05JQ19SRUcoMHgxMDgpLAotCSAgIC8qIGNyYl9yY3ZfcmluZ19zaXplICovCi0JICAgTkVUWEVOX05JQ19SRUcoMHgxMGMpLAotCi0JICAgfSwKLQkgIC8qIEp1bWJvIGZyYW1lcyAqLwotCSAgewotCSAgIC8qIGNyYl9yY3ZfcHJvZHVjZXJfb2Zmc2V0OiAqLwotCSAgIE5FVFhFTl9OSUNfUkVHKDB4MTEwKSwKLQkgICAvKiBjcmJfcmN2X2NvbnN1bWVyX29mZnNldDogKi8KLQkgICBORVRYRU5fTklDX1JFRygweDExNCksCi0JICAgLyogY3JiX2dsb2FibHJjdl9yaW5nOiAqLwotCSAgIE5FVFhFTl9OSUNfUkVHKDB4MTE4KSwKLQkgICAvKiBjcmJfcmN2X3Jpbmdfc2l6ZSAqLwotCSAgIE5FVFhFTl9OSUNfUkVHKDB4MTFjKSwKLQkgICB9LAotCSAgLyogTFJPICovCi0JICB7Ci0JICAgLyogY3JiX3Jjdl9wcm9kdWNlcl9vZmZzZXQ6ICovCi0JICAgTkVUWEVOX05JQ19SRUcoMHgxMjApLAotCSAgIC8qIGNyYl9yY3ZfY29uc3VtZXJfb2Zmc2V0OiAqLwotCSAgIE5FVFhFTl9OSUNfUkVHKDB4MTI0KSwKLQkgICAvKiBjcmJfZ2xvYWJscmN2X3Jpbmc6ICovCi0JICAgTkVUWEVOX05JQ19SRUcoMHgxMjgpLAotCSAgIC8qIGNyYl9yY3ZfcmluZ19zaXplICovCi0JICAgTkVUWEVOX05JQ19SRUcoMHgxMmMpLAotCSAgIH0KLQkgIH0sCi0JIC8qIGNyYl9yY3ZzdGF0dXNfcmluZzogKi8KLQkgTkVUWEVOX05JQ19SRUcoMHgxMzApLAotCSAvKiBjcmJfcmN2X3N0YXR1c19wcm9kdWNlcjogKi8KLQkgTkVUWEVOX05JQ19SRUcoMHgxMzQpLAotCSAvKiBjcmJfcmN2X3N0YXR1c19jb25zdW1lcjogKi8KLQkgTkVUWEVOX05JQ19SRUcoMHgxMzgpLAotCSAvKiBjcmJfcmN2cGVnX3N0YXRlOiAqLwotCSBORVRYRU5fTklDX1JFRygweDEzYyksCi0JIC8qIGNyYl9zdGF0dXNfcmluZ19zaXplICovCi0JIE5FVFhFTl9OSUNfUkVHKDB4MTQwKSwKLQotCSB9LAotCS8qCi0JICogSW5zdGFuY2UgMSwKLQkgKi8KLQl7Ci0JIC8qIHJjdl9kZXNjX2NyYjogKi8KLQkgewotCSAgewotCSAgIC8qIGNyYl9yY3ZfcHJvZHVjZXJfb2Zmc2V0OiAqLwotCSAgIE5FVFhFTl9OSUNfUkVHKDB4MTQ0KSwKLQkgICAvKiBjcmJfcmN2X2NvbnN1bWVyX29mZnNldDogKi8KLQkgICBORVRYRU5fTklDX1JFRygweDE0OCksCi0JICAgLyogY3JiX2dsb2JhbHJjdl9yaW5nOiAqLwotCSAgIE5FVFhFTl9OSUNfUkVHKDB4MTRjKSwKLQkgICAvKiBjcmJfcmN2X3Jpbmdfc2l6ZSAqLwotCSAgIE5FVFhFTl9OSUNfUkVHKDB4MTUwKSwKLQotCSAgIH0sCi0JICAvKiBKdW1ibyBmcmFtZXMgKi8KLQkgIHsKLQkgICAvKiBjcmJfcmN2X3Byb2R1Y2VyX29mZnNldDogKi8KLQkgICBORVRYRU5fTklDX1JFRygweDE1NCksCi0JICAgLyogY3JiX3Jjdl9jb25zdW1lcl9vZmZzZXQ6ICovCi0JICAgTkVUWEVOX05JQ19SRUcoMHgxNTgpLAotCSAgIC8qIGNyYl9nbG9iYWxyY3ZfcmluZzogKi8KLQkgICBORVRYRU5fTklDX1JFRygweDE1YyksCi0JICAgLyogY3JiX3Jjdl9yaW5nX3NpemUgKi8KLQkgICBORVRYRU5fTklDX1JFRygweDE2MCksCi0JICAgfSwKLQkgIC8qIExSTyAqLwotCSAgewotCSAgIC8qIGNyYl9yY3ZfcHJvZHVjZXJfb2Zmc2V0OiAqLwotCSAgIE5FVFhFTl9OSUNfUkVHKDB4MTY0KSwKLQkgICAvKiBjcmJfcmN2X2NvbnN1bWVyX29mZnNldDogKi8KLQkgICBORVRYRU5fTklDX1JFRygweDE2OCksCi0JICAgLyogY3JiX2dsb2JhbHJjdl9yaW5nOiAqLwotCSAgIE5FVFhFTl9OSUNfUkVHKDB4MTZjKSwKLQkgICAvKiBjcmJfcmN2X3Jpbmdfc2l6ZSAqLwotCSAgIE5FVFhFTl9OSUNfUkVHKDB4MTcwKSwKLQkgICB9Ci0KLQkgIH0sCi0JIC8qIGNyYl9yY3ZzdGF0dXNfcmluZzogKi8KLQkgTkVUWEVOX05JQ19SRUcoMHgxNzQpLAotCSAvKiBjcmJfcmN2X3N0YXR1c19wcm9kdWNlcjogKi8KLQkgTkVUWEVOX05JQ19SRUcoMHgxNzgpLAotCSAvKiBjcmJfcmN2X3N0YXR1c19jb25zdW1lcjogKi8KLQkgTkVUWEVOX05JQ19SRUcoMHgxN2MpLAotCSAvKiBjcmJfcmN2cGVnX3N0YXRlOiAqLwotCSBORVRYRU5fTklDX1JFRygweDE4MCksCi0JIC8qIGNyYl9zdGF0dXNfcmluZ19zaXplICovCi0JIE5FVFhFTl9OSUNfUkVHKDB4MTg0KSwKLQotCSB9LAotfTsKLQotdTY0IGN0eF9hZGRyX3NpZ19yZWdzW11bM10gPSB7Ci0Je05FVFhFTl9OSUNfUkVHKDB4MTg4KSwgTkVUWEVOX05JQ19SRUcoMHgxOGMpLCBORVRYRU5fTklDX1JFRygweDFjMCl9LAotCXtORVRYRU5fTklDX1JFRygweDE5MCksIE5FVFhFTl9OSUNfUkVHKDB4MTk0KSwgTkVUWEVOX05JQ19SRUcoMHgxYzQpfSwKLQl7TkVUWEVOX05JQ19SRUcoMHgxOTgpLCBORVRYRU5fTklDX1JFRygweDE5YyksIE5FVFhFTl9OSUNfUkVHKDB4MWM4KX0sCi0Je05FVFhFTl9OSUNfUkVHKDB4MWEwKSwgTkVUWEVOX05JQ19SRUcoMHgxYTQpLCBORVRYRU5fTklDX1JFRygweDFjYyl9Ci19OwotCiAjZWxzZQogZXh0ZXJuIHN0cnVjdCBuZXR4ZW5fcmVjdl9jcmIgcmVjdl9jcmJfcmVnaXN0ZXJzW107CiBleHRlcm4gdTY0IGN0eF9hZGRyX3NpZ19yZWdzW11bM107Ci0jZGVmaW5lIENSQl9DVFhfQUREUl9SRUdfTE8gICAgICAgICAgICAoY3R4X2FkZHJfc2lnX3JlZ3NbMF1bMF0pCi0jZGVmaW5lIENSQl9DVFhfQUREUl9SRUdfSEkgICAgICAgICAgICAoY3R4X2FkZHJfc2lnX3JlZ3NbMF1bMl0pCi0jZGVmaW5lIENSQl9DVFhfU0lHTkFUVVJFX1JFRyAgICAgICAoY3R4X2FkZHJfc2lnX3JlZ3NbMF1bMV0pCiAjZW5kaWYJCQkJLyogREVGSU5FX0dMT0JBTF9SRUNFSVZFX0NSQiAqLworI2RlZmluZSBDUkJfQ1RYX0FERFJfUkVHX0xPKEZVTkNfSUQpCQkoY3R4X2FkZHJfc2lnX3JlZ3NbRlVOQ19JRF1bMF0pCisjZGVmaW5lIENSQl9DVFhfQUREUl9SRUdfSEkoRlVOQ19JRCkJCShjdHhfYWRkcl9zaWdfcmVnc1tGVU5DX0lEXVsyXSkKKyNkZWZpbmUgQ1JCX0NUWF9TSUdOQVRVUkVfUkVHKEZVTkNfSUQpCQkoY3R4X2FkZHJfc2lnX3JlZ3NbRlVOQ19JRF1bMV0pCiAKIC8qCiAgKiBUZW1wZXJhdHVyZSBjb250cm9sLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbmk1MDEwLmMgYi9kcml2ZXJzL25ldC9uaTUwMTAuYwppbmRleCA4YmUwZDAzLi4zZDViNDIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9uaTUwMTAuYworKysgYi9kcml2ZXJzL25ldC9uaTUwMTAuYwpAQCAtNTYyLDcgKzU2Miw2IEBACiAJCXJldHVybjsKIAl9CiAKLQlza2ItPmRldiA9IGRldjsKIAlza2JfcmVzZXJ2ZShza2IsIDIpOwogCiAJLyogUmVhZCBwYWNrZXQgaW50byBidWZmZXIgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L25pNTIuYyBiL2RyaXZlcnMvbmV0L25pNTIuYwppbmRleCBhNmY0YjI0Li44ZGJkNmQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9uaTUyLmMKKysrIGIvZHJpdmVycy9uZXQvbmk1Mi5jCkBAIC05MzQsNyArOTM0LDYgQEAKIAkJCQkJc2tiID0gKHN0cnVjdCBza19idWZmICopIGRldl9hbGxvY19za2IodG90bGVuKzIpOwogCQkJCQlpZihza2IgIT0gTlVMTCkKIAkJCQkJewotCQkJCQkJc2tiLT5kZXYgPSBkZXY7CiAJCQkJCQlza2JfcmVzZXJ2ZShza2IsMik7CiAJCQkJCQlza2JfcHV0KHNrYix0b3RsZW4pOwogCQkJCQkJZXRoX2NvcHlfYW5kX3N1bShza2IsKGNoYXIgKikgcC0+YmFzZSsodW5zaWduZWQgbG9uZykgcmJkLT5idWZmZXIsdG90bGVuLDApOwpAQCAtMTE4Myw3ICsxMTgyLDcgQEAKIAllbHNlCiAjZW5kaWYKIAl7Ci0JCW1lbWNweSgoY2hhciAqKXAtPnhtaXRfY2J1ZmZzW3AtPnhtaXRfY291bnRdLChjaGFyICopKHNrYi0+ZGF0YSksc2tiLT5sZW4pOworCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgKGNoYXIgKikgcC0+eG1pdF9jYnVmZnNbcC0+eG1pdF9jb3VudF0sIHNrYi0+bGVuKTsKIAkJbGVuID0gc2tiLT5sZW47CiAJCWlmIChsZW4gPCBFVEhfWkxFTikgewogCQkJbGVuID0gRVRIX1pMRU47CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9uaTY1LmMgYi9kcml2ZXJzL25ldC9uaTY1LmMKaW5kZXggMTU3OGY0ZC4uMzgxOGVkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbmk2NS5jCisrKyBiL2RyaXZlcnMvbmV0L25pNjUuYwpAQCAtNjEwLDcgKzYxMCw2IEBACiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogdW5hYmxlIHRvIGFsbG9jYXRlICVzIG1lbW9yeS5cbiIsZGV2LT5uYW1lLHdoYXQpOwogCQkJcmV0dXJuIE5VTEw7CiAJCX0KLQkJc2tiLT5kZXYgPSBkZXY7CiAJCXNrYl9yZXNlcnZlKHNrYiwyKzE2KTsKIAkJc2tiX3B1dChza2IsUl9CVUZfU0laRSk7CSAvKiBncmFiIHRoZSB3aG9sZSBzcGFjZSAuLiAobm90IG5lY2Vzc2FyeSkgKi8KIAkJcHRyID0gc2tiLT5kYXRhOwpAQCAtMTA5NCw3ICsxMDkzLDYgQEAKIAkJCWlmKHNrYikKIAkJCXsKIAkJCQlza2JfcmVzZXJ2ZShza2IsMik7Ci0Jc2tiLT5kZXYgPSBkZXY7CiAjaWZkZWYgUkNWX1ZJQV9TS0IKIAkJCQlpZiggKHVuc2lnbmVkIGxvbmcpIChza2ItPmRhdGEgKyBSX0JVRl9TSVpFKSA+IDB4MTAwMDAwMCkgewogCQkJCQlza2JfcHV0KHNrYixsZW4pOwpAQCAtMTE3OCw4ICsxMTc2LDkgQEAKIAkJaWYoICh1bnNpZ25lZCBsb25nKSAoc2tiLT5kYXRhICsgc2tiLT5sZW4pID4gMHgxMDAwMDAwKSB7CiAjZW5kaWYKIAotCQkJbWVtY3B5KChjaGFyICopIHAtPnRtZGJvdW5jZVtwLT50bWRib3VuY2VudW1dICwoY2hhciAqKXNrYi0+ZGF0YSwKLQkJCQkJCQkgKHNrYi0+bGVuID4gVF9CVUZfU0laRSkgPyBUX0JVRl9TSVpFIDogc2tiLT5sZW4pOworCQkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIHAtPnRtZGJvdW5jZVtwLT50bWRib3VuY2VudW1dLAorCQkJCSAgICAgIHNrYi0+bGVuID4gVF9CVUZfU0laRSA/IFRfQlVGX1NJWkUgOgorCQkJCQkJCSAgICAgIHNrYi0+bGVuKTsKIAkJCWlmIChsZW4gPiBza2ItPmxlbikKIAkJCQltZW1zZXQoKGNoYXIgKilwLT50bWRib3VuY2VbcC0+dG1kYm91bmNlbnVtXStza2ItPmxlbiwgMCwgbGVuLXNrYi0+bGVuKTsKIAkJCWRldl9rZnJlZV9za2IgKHNrYik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9uczgzODIwLmMgYi9kcml2ZXJzL25ldC9uczgzODIwLmMKaW5kZXggOWVjNmU5ZS4uNmEzMjMzOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbnM4MzgyMC5jCisrKyBiL2RyaXZlcnMvbmV0L25zODM4MjAuYwpAQCAtNjA3LDcgKzYwNyw2IEBACiAJCXJlcyAmPSAweGY7CiAJCXNrYl9yZXNlcnZlKHNrYiwgcmVzKTsKIAotCQlza2ItPmRldiA9IG5kZXY7CiAJCWlmIChnZnAgIT0gR0ZQX0FUT01JQykKIAkJCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnJ4X2luZm8ubG9jaywgZmxhZ3MpOwogCQlyZXMgPSBuczgzODIwX2FkZF9yeF9za2IoZGV2LCBza2IpOwpAQCAtMTE1Nyw5ICsxMTU2LDkgQEAKIAlleHRzdHMgPSAwOwogCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9QQVJUSUFMKSB7CiAJCWV4dHN0cyB8PSBFWFRTVFNfSVBQS1Q7Ci0JCWlmIChJUFBST1RPX1RDUCA9PSBza2ItPm5oLmlwaC0+cHJvdG9jb2wpCisJCWlmIChJUFBST1RPX1RDUCA9PSBpcF9oZHIoc2tiKS0+cHJvdG9jb2wpCiAJCQlleHRzdHMgfD0gRVhUU1RTX1RDUFBLVDsKLQkJZWxzZSBpZiAoSVBQUk9UT19VRFAgPT0gc2tiLT5uaC5pcGgtPnByb3RvY29sKQorCQllbHNlIGlmIChJUFBST1RPX1VEUCA9PSBpcF9oZHIoc2tiKS0+cHJvdG9jb2wpCiAJCQlleHRzdHMgfD0gRVhUU1RTX1VEUFBLVDsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3Bhc2VtaV9tYWMuYyBiL2RyaXZlcnMvbmV0L3Bhc2VtaV9tYWMuYwppbmRleCBkNjcwYWM3Li43NmZlOWRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9wYXNlbWlfbWFjLmMKKysrIGIvZHJpdmVycy9uZXQvcGFzZW1pX21hYy5jCkBAIC0zMzQsOCArMzM0LDYgQEAKIAkJCWJyZWFrOwogCQl9CiAKLQkJc2tiLT5kZXYgPSBkZXY7Ci0KIAkJZG1hID0gcGNpX21hcF9zaW5nbGUobWFjLT5kbWFfcGRldiwgc2tiLT5kYXRhLCBza2ItPmxlbiwKIAkJCQkgICAgIFBDSV9ETUFfRlJPTURFVklDRSk7CiAKQEAgLTczMSwxNiArNzI5LDE4IEBACiAJZGZsYWdzID0gWENUX01BQ1RYX08gfCBYQ1RfTUFDVFhfU1QgfCBYQ1RfTUFDVFhfU1MgfCBYQ1RfTUFDVFhfQ1JDX1BBRDsKIAogCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9QQVJUSUFMKSB7Ci0JCXN3aXRjaCAoc2tiLT5uaC5pcGgtPnByb3RvY29sKSB7CisJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKm5oID0gc2tiX25ldHdvcmtfaGVhZGVyKHNrYik7CisKKwkJc3dpdGNoIChpcF9oZHIoc2tiKS0+cHJvdG9jb2wpIHsKIAkJY2FzZSBJUFBST1RPX1RDUDoKIAkJCWRmbGFncyB8PSBYQ1RfTUFDVFhfQ1NVTV9UQ1A7Ci0JCQlkZmxhZ3MgfD0gWENUX01BQ1RYX0lQSCgoc2tiLT5oLnJhdyAtIHNrYi0+bmgucmF3KSA+PiAyKTsKLQkJCWRmbGFncyB8PSBYQ1RfTUFDVFhfSVBPKHNrYi0+bmgucmF3IC0gc2tiLT5kYXRhKTsKKwkJCWRmbGFncyB8PSBYQ1RfTUFDVFhfSVBIKHNrYl9uZXR3b3JrX2hlYWRlcl9sZW4oc2tiKSA+PiAyKTsKKwkJCWRmbGFncyB8PSBYQ1RfTUFDVFhfSVBPKG5oIC0gc2tiLT5kYXRhKTsKIAkJCWJyZWFrOwogCQljYXNlIElQUFJPVE9fVURQOgogCQkJZGZsYWdzIHw9IFhDVF9NQUNUWF9DU1VNX1VEUDsKLQkJCWRmbGFncyB8PSBYQ1RfTUFDVFhfSVBIKChza2ItPmgucmF3IC0gc2tiLT5uaC5yYXcpID4+IDIpOwotCQkJZGZsYWdzIHw9IFhDVF9NQUNUWF9JUE8oc2tiLT5uaC5yYXcgLSBza2ItPmRhdGEpOworCQkJZGZsYWdzIHw9IFhDVF9NQUNUWF9JUEgoc2tiX25ldHdvcmtfaGVhZGVyX2xlbihza2IpID4+IDIpOworCQkJZGZsYWdzIHw9IFhDVF9NQUNUWF9JUE8obmggLSBza2ItPmRhdGEpOwogCQkJYnJlYWs7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wY2ktc2tlbGV0b24uYyBiL2RyaXZlcnMvbmV0L3BjaS1za2VsZXRvbi5jCmluZGV4IDZjYTRlNGYuLmRmODk5OGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BjaS1za2VsZXRvbi5jCisrKyBiL2RyaXZlcnMvbmV0L3BjaS1za2VsZXRvbi5jCkBAIC0xMzQ0LDcgKzEzNDQsNyBAQAogCiAJdHAtPnR4X2luZm9bZW50cnldLnNrYiA9IHNrYjsKIAkvKiB0cC0+dHhfaW5mb1tlbnRyeV0ubWFwcGluZyA9IDA7ICovCi0JbWVtY3B5ICh0cC0+dHhfYnVmW2VudHJ5XSwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIHRwLT50eF9idWZbZW50cnldLCBza2ItPmxlbik7CiAKIAkvKiBOb3RlOiB0aGUgY2hpcCBkb2Vzbid0IGhhdmUgYXV0by1wYWQhICovCiAJTkVURFJWX1czMiAoVHhTdGF0dXMwICsgKGVudHJ5ICogc2l6ZW9mKHUzMikpLApAQCAtMTU2NSw3ICsxNTY1LDYgQEAKIAogCQlza2IgPSBkZXZfYWxsb2Nfc2tiIChwa3Rfc2l6ZSArIDIpOwogCQlpZiAoc2tiKSB7Ci0JCQlza2ItPmRldiA9IGRldjsKIAkJCXNrYl9yZXNlcnZlIChza2IsIDIpOwkvKiAxNiBieXRlIGFsaWduIHRoZSBJUCBmaWVsZHMuICovCiAKIAkJCWV0aF9jb3B5X2FuZF9zdW0gKHNrYiwgJnJ4X3JpbmdbcmluZ19vZmZzZXQgKyA0XSwgcGt0X3NpemUsIDApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGNtY2lhLzNjNTc0X2NzLmMgYi9kcml2ZXJzL25ldC9wY21jaWEvM2M1NzRfY3MuYwppbmRleCBjN2JkOWMxLi4yYjM5NWVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9wY21jaWEvM2M1NzRfY3MuYworKysgYi9kcml2ZXJzL25ldC9wY21jaWEvM2M1NzRfY3MuYwpAQCAtMTA1Niw3ICsxMDU2LDYgQEAKIAkJCURFQlVHKDMsICIgIFJlY2VpdmluZyBwYWNrZXQgc2l6ZSAlZCBzdGF0dXMgJTQuNHguXG4iLAogCQkJCSAgcGt0X2xlbiwgcnhfc3RhdHVzKTsKIAkJCWlmIChza2IgIT0gTlVMTCkgewotCQkJCXNrYi0+ZGV2ID0gZGV2OwogCQkJCXNrYl9yZXNlcnZlKHNrYiwgMik7CiAJCQkJaW5zbChpb2FkZHIrUlhfRklGTywgc2tiX3B1dChza2IsIHBrdF9sZW4pLAogCQkJCQkJKChwa3RfbGVuKzMpPj4yKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wY21jaWEvM2M1ODlfY3MuYyBiL2RyaXZlcnMvbmV0L3BjbWNpYS8zYzU4OV9jcy5jCmluZGV4IDQ2MWU4MjcuLjE0M2FlMmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BjbWNpYS8zYzU4OV9jcy5jCisrKyBiL2RyaXZlcnMvbmV0L3BjbWNpYS8zYzU4OV9jcy5jCkBAIC04ODMsNyArODgzLDYgQEAKIAkgICAgREVCVUcoMywgIiAgICBSZWNlaXZpbmcgcGFja2V0IHNpemUgJWQgc3RhdHVzICU0LjR4LlxuIiwKIAkJICBwa3RfbGVuLCByeF9zdGF0dXMpOwogCSAgICBpZiAoc2tiICE9IE5VTEwpIHsKLQkJc2tiLT5kZXYgPSBkZXY7CiAJCXNrYl9yZXNlcnZlKHNrYiwgMik7CiAJCWluc2woaW9hZGRyK1JYX0ZJRk8sIHNrYl9wdXQoc2tiLCBwa3RfbGVuKSwKIAkJCShwa3RfbGVuKzMpPj4yKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BjbWNpYS9heG5ldF9jcy5jIGIvZHJpdmVycy9uZXQvcGNtY2lhL2F4bmV0X2NzLmMKaW5kZXggNjEzOTA0OC4uODA4ZmFlMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGNtY2lhL2F4bmV0X2NzLmMKKysrIGIvZHJpdmVycy9uZXQvcGNtY2lhL2F4bmV0X2NzLmMKQEAgLTExMzYsNyArMTEzNiw3IEBACiAJCWVpX2Jsb2NrX291dHB1dChkZXYsIGxlbmd0aCwgc2tiLT5kYXRhLCBvdXRwdXRfcGFnZSk7CiAJZWxzZSB7CiAJCW1lbXNldChwYWNrZXQsIDAsIEVUSF9aTEVOKTsKLQkJbWVtY3B5KHBhY2tldCwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCBwYWNrZXQsIHNrYi0+bGVuKTsKIAkJZWlfYmxvY2tfb3V0cHV0KGRldiwgbGVuZ3RoLCBwYWNrZXQsIG91dHB1dF9wYWdlKTsKIAl9CiAJCkBAIC0xNDk2LDcgKzE0OTYsNiBAQAogCQkJZWxzZQogCQkJewogCQkJCXNrYl9yZXNlcnZlKHNrYiwyKTsJLyogSVAgaGVhZGVycyBvbiAxNiBieXRlIGJvdW5kYXJpZXMgKi8KLQkJCQlza2ItPmRldiA9IGRldjsKIAkJCQlza2JfcHV0KHNrYiwgcGt0X2xlbik7CS8qIE1ha2Ugcm9vbSAqLwogCQkJCWVpX2Jsb2NrX2lucHV0KGRldiwgcGt0X2xlbiwgc2tiLCBjdXJyZW50X29mZnNldCArIHNpemVvZihyeF9mcmFtZSkpOwogCQkJCXNrYi0+cHJvdG9jb2w9ZXRoX3R5cGVfdHJhbnMoc2tiLGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wY21jaWEvZm12ajE4eF9jcy5jIGIvZHJpdmVycy9uZXQvcGNtY2lhL2ZtdmoxOHhfY3MuYwppbmRleCAwZDdkZTYxLi4zZjkzZDQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9wY21jaWEvZm12ajE4eF9jcy5jCisrKyBiL2RyaXZlcnMvbmV0L3BjbWNpYS9mbXZqMTh4X2NzLmMKQEAgLTk5OSw3ICs5OTksNiBAQAogCQlscC0+c3RhdHMucnhfZHJvcHBlZCsrOwogCQlicmVhazsKIAkgICAgfQotCSAgICBza2ItPmRldiA9IGRldjsKIAogCSAgICBza2JfcmVzZXJ2ZShza2IsIDIpOwogCSAgICBpbnN3KGlvYWRkciArIERBVEFQT1JULCBza2JfcHV0KHNrYiwgcGt0X2xlbiksCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wY21jaWEvbm1jbGFuX2NzLmMgYi9kcml2ZXJzL25ldC9wY21jaWEvbm1jbGFuX2NzLmMKaW5kZXggM2I3MDc3NC4uNzNkYTYxMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGNtY2lhL25tY2xhbl9jcy5jCisrKyBiL2RyaXZlcnMvbmV0L3BjbWNpYS9ubWNsYW5fY3MuYwpAQCAtMTE4MiwxMiArMTE4MiwxMCBAQAogICAgICAgc2tiID0gZGV2X2FsbG9jX3NrYihwa3RfbGVuKzIpOwogCiAgICAgICBpZiAoc2tiICE9IE5VTEwpIHsKLQlza2ItPmRldiA9IGRldjsKLQogCXNrYl9yZXNlcnZlKHNrYiwgMik7CiAJaW5zdyhpb2FkZHIgKyBBTTIxNTBfUkNWLCBza2JfcHV0KHNrYiwgcGt0X2xlbiksIHBrdF9sZW4+PjEpOwogCWlmIChwa3RfbGVuICYgMSkKLQkgICAgKihza2ItPnRhaWwtMSkgPSBpbmIoaW9hZGRyICsgQU0yMTUwX1JDVik7CisJICAgICooc2tiX3RhaWxfcG9pbnRlcihza2IpIC0gMSkgPSBpbmIoaW9hZGRyICsgQU0yMTUwX1JDVik7CiAJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKIAkKIAluZXRpZl9yeChza2IpOyAvKiBTZW5kIHRoZSBwYWNrZXQgdG8gdGhlIHVwcGVyIChwcm90b2NvbCkgbGF5ZXJzLiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGNtY2lhL3NtYzkxYzkyX2NzLmMgYi9kcml2ZXJzL25ldC9wY21jaWEvc21jOTFjOTJfY3MuYwppbmRleCAyNTYxZjc2Li43OTEyZGJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9wY21jaWEvc21jOTFjOTJfY3MuYworKysgYi9kcml2ZXJzL25ldC9wY21jaWEvc21jOTFjOTJfY3MuYwpAQCAtMTY2OSw3ICsxNjY5LDYgQEAKIAkgICAgIChwYWNrZXRfbGVuZ3RoKzEpPj4xKTsKIAlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOwogCQotCXNrYi0+ZGV2ID0gZGV2OwogCW5ldGlmX3J4KHNrYik7CiAJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKIAlzbWMtPnN0YXRzLnJ4X3BhY2tldHMrKzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BjbWNpYS94aXJjMnBzX2NzLmMgYi9kcml2ZXJzL25ldC9wY21jaWEveGlyYzJwc19jcy5jCmluZGV4IDU4NzllN2MuLjgwOWVjNDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BjbWNpYS94aXJjMnBzX2NzLmMKKysrIGIvZHJpdmVycy9uZXQvcGNtY2lhL3hpcmMycHNfY3MuYwpAQCAtMTIyNiw3ICsxMjI2LDYgQEAKIAkJCSAgICAocGt0bGVuKzEpPj4xKTsKIAkJfQogCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOwotCQlza2ItPmRldiA9IGRldjsKIAkJbmV0aWZfcngoc2tiKTsKIAkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKIAkJbHAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BjbmV0MzIuYyBiL2RyaXZlcnMvbmV0L3BjbmV0MzIuYwppbmRleCA0ZDk0YmE3Li45YzE3MWE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9wY25ldDMyLmMKKysrIGIvZHJpdmVycy9uZXQvcGNuZXQzMi5jCkBAIC0yNTMsMTIgKzI1MywxMiBAQAogICogc28gdGhlIHN0cnVjdHVyZSBzaG91bGQgYmUgYWxsb2NhdGVkIHVzaW5nIHBjaV9hbGxvY19jb25zaXN0ZW50KCkuCiAgKi8KIHN0cnVjdCBwY25ldDMyX3ByaXZhdGUgewotCXN0cnVjdCBwY25ldDMyX2luaXRfYmxvY2sgaW5pdF9ibG9jazsKKwlzdHJ1Y3QgcGNuZXQzMl9pbml0X2Jsb2NrICppbml0X2Jsb2NrOwogCS8qIFRoZSBUeCBhbmQgUnggcmluZyBlbnRyaWVzIG11c3QgYmUgYWxpZ25lZCBvbiAxNi1ieXRlIGJvdW5kYXJpZXMgaW4gMzJiaXQgbW9kZS4gKi8KIAlzdHJ1Y3QgcGNuZXQzMl9yeF9oZWFkCSpyeF9yaW5nOwogCXN0cnVjdCBwY25ldDMyX3R4X2hlYWQJKnR4X3Jpbmc7Ci0JZG1hX2FkZHJfdAkJZG1hX2FkZHI7LyogRE1BIGFkZHJlc3Mgb2YgYmVnaW5uaW5nIG9mIHRoaXMKLQkJCQkgICBvYmplY3QsIHJldHVybmVkIGJ5IHBjaV9hbGxvY19jb25zaXN0ZW50ICovCisJZG1hX2FkZHJfdAkJaW5pdF9kbWFfYWRkcjsvKiBETUEgYWRkcmVzcyBvZiBiZWdpbm5pbmcgb2YgdGhlIGluaXQgYmxvY2ssCisJCQkJICAgcmV0dXJuZWQgYnkgcGNpX2FsbG9jX2NvbnNpc3RlbnQgKi8KIAlzdHJ1Y3QgcGNpX2RldgkJKnBjaV9kZXY7CiAJY29uc3QgY2hhcgkJKm5hbWU7CiAJLyogVGhlIHNhdmVkIGFkZHJlc3Mgb2YgYSBzZW50LWluLXBsYWNlIHBhY2tldC9idWZmZXIsIGZvciBza2ZyZWUoKS4gKi8KQEAgLTY1Myw3ICs2NTMsNyBAQAogCiBzdGF0aWMgdm9pZCBwY25ldDMyX3B1cmdlX3J4X3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CiAJaW50IGk7CiAKIAkvKiBmcmVlIGFsbCBhbGxvY2F0ZWQgc2tidWZmcyAqLwpAQCAtNjgxLDcgKzY4MSw3IEBACiAKIHN0YXRpYyBpbnQgcGNuZXQzMl9nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCiB7Ci0Jc3RydWN0IHBjbmV0MzJfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CisJc3RydWN0IHBjbmV0MzJfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHIgPSAtRU9QTk9UU1VQUDsKIApAQCAtNjk2LDcgKzY5Niw3IEBACiAKIHN0YXRpYyBpbnQgcGNuZXQzMl9zZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCiB7Ci0Jc3RydWN0IHBjbmV0MzJfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CisJc3RydWN0IHBjbmV0MzJfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHIgPSAtRU9QTk9UU1VQUDsKIApAQCAtNzExLDcgKzcxMSw3IEBACiBzdGF0aWMgdm9pZCBwY25ldDMyX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkJc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKIHsKLQlzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CiAKIAlzdHJjcHkoaW5mby0+ZHJpdmVyLCBEUlZfTkFNRSk7CiAJc3RyY3B5KGluZm8tPnZlcnNpb24sIERSVl9WRVJTSU9OKTsKQEAgLTcyMyw3ICs3MjMsNyBAQAogCiBzdGF0aWMgdTMyIHBjbmV0MzJfZ2V0X2xpbmsoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcjsKIApAQCAtNzQzLDE5ICs3NDMsMTkgQEAKIAogc3RhdGljIHUzMiBwY25ldDMyX2dldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXN0cnVjdCBwY25ldDMyX3ByaXZhdGUgKmxwID0gZGV2LT5wcml2OworCXN0cnVjdCBwY25ldDMyX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlyZXR1cm4gbHAtPm1zZ19lbmFibGU7CiB9CiAKIHN0YXRpYyB2b2lkIHBjbmV0MzJfc2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiB2YWx1ZSkKIHsKLQlzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CiAJbHAtPm1zZ19lbmFibGUgPSB2YWx1ZTsKIH0KIAogc3RhdGljIGludCBwY25ldDMyX253YXlfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgciA9IC1FT1BOT1RTVVBQOwogCkBAIC03NzAsNyArNzcwLDcgQEAKIHN0YXRpYyB2b2lkIHBjbmV0MzJfZ2V0X3JpbmdwYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJCSAgc3RydWN0IGV0aHRvb2xfcmluZ3BhcmFtICplcmluZykKIHsKLQlzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CiAKIAllcmluZy0+dHhfbWF4X3BlbmRpbmcgPSBUWF9NQVhfUklOR19TSVpFOwogCWVyaW5nLT50eF9wZW5kaW5nID0gbHAtPnR4X3Jpbmdfc2l6ZTsKQEAgLTc4MSw3ICs3ODEsNyBAQAogc3RhdGljIGludCBwY25ldDMyX3NldF9yaW5ncGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCQkgc3RydWN0IGV0aHRvb2xfcmluZ3BhcmFtICplcmluZykKIHsKLQlzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1bnNpZ25lZCBpbnQgc2l6ZTsKIAl1bG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKQEAgLTg0Nyw3ICs4NDcsNyBAQAogc3RhdGljIHZvaWQgcGNuZXQzMl9ldGh0b29sX3Rlc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCQkgc3RydWN0IGV0aHRvb2xfdGVzdCAqdGVzdCwgdTY0ICogZGF0YSkKIHsKLQlzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CiAJaW50IHJjOwogCiAJaWYgKHRlc3QtPmZsYWdzID09IEVUSF9URVNUX0ZMX09GRkxJTkUpIHsKQEAgLTg2OCw3ICs4NjgsNyBAQAogCiBzdGF0aWMgaW50IHBjbmV0MzJfbG9vcGJhY2tfdGVzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1aW50NjRfdCAqIGRhdGExKQogewotCXN0cnVjdCBwY25ldDMyX3ByaXZhdGUgKmxwID0gZGV2LT5wcml2OworCXN0cnVjdCBwY25ldDMyX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgcGNuZXQzMl9hY2Nlc3MgKmEgPSAmbHAtPmE7CS8qIGFjY2VzcyB0byByZWdpc3RlcnMgKi8KIAl1bG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsJLyogY2FyZCBiYXNlIEkvTyBhZGRyZXNzICovCiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsJLyogc2sgYnVmZiAqLwpAQCAtMTA0Nyw3ICsxMDQ3LDcgQEAKIAogc3RhdGljIHZvaWQgcGNuZXQzMl9sZWRfYmxpbmtfY2FsbGJhY2soc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IHBjbmV0MzJfYWNjZXNzICphID0gJmxwLT5hOwogCXVsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC0xMDY0LDcgKzEwNjQsNyBAQAogCiBzdGF0aWMgaW50IHBjbmV0MzJfcGh5c19pZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZGF0YSkKIHsKLQlzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IHBjbmV0MzJfYWNjZXNzICphID0gJmxwLT5hOwogCXVsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC0xMTA5LDcgKzExMDksNyBAQAogCQlpbnQgY2FuX3NsZWVwKQogewogCWludCBjc3I1OwotCXN0cnVjdCBwY25ldDMyX3ByaXZhdGUgKmxwID0gZGV2LT5wcml2OworCXN0cnVjdCBwY25ldDMyX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgcGNuZXQzMl9hY2Nlc3MgKmEgPSAmbHAtPmE7CiAJdWxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CiAJaW50IHRpY2tzOwpAQCAtMTIwNiw3ICsxMjA2LDYgQEAKIAkJCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7CiAJCQlza2JfcHV0KHNrYiwgcGt0X2xlbik7CiAJCQlscC0+cnhfc2tidWZmW2VudHJ5XSA9IG5ld3NrYjsKLQkJCW5ld3NrYi0+ZGV2ID0gZGV2OwogCQkJbHAtPnJ4X2RtYV9hZGRyW2VudHJ5XSA9CiAJCQkJCSAgICBwY2lfbWFwX3NpbmdsZShscC0+cGNpX2RldiwKIAkJCQkJCQkgICBuZXdza2ItPmRhdGEsCkBAIC0xMjU4LDcgKzEyNTcsNyBAQAogCiBzdGF0aWMgaW50IHBjbmV0MzJfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHF1b3RhKQogewotCXN0cnVjdCBwY25ldDMyX3ByaXZhdGUgKmxwID0gZGV2LT5wcml2OworCXN0cnVjdCBwY25ldDMyX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlpbnQgZW50cnkgPSBscC0+Y3VyX3J4ICYgbHAtPnJ4X21vZF9tYXNrOwogCXN0cnVjdCBwY25ldDMyX3J4X2hlYWQgKnJ4cCA9ICZscC0+cnhfcmluZ1tlbnRyeV07CiAJaW50IG5wYWNrZXRzID0gMDsKQEAgLTEyODMsNyArMTI4Miw3IEBACiAKIHN0YXRpYyBpbnQgcGNuZXQzMl90eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXN0cnVjdCBwY25ldDMyX3ByaXZhdGUgKmxwID0gZGV2LT5wcml2OworCXN0cnVjdCBwY25ldDMyX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl1bnNpZ25lZCBpbnQgZGlydHlfdHggPSBscC0+ZGlydHlfdHg7CiAJaW50IGRlbHRhOwogCWludCBtdXN0X3Jlc3RhcnQgPSAwOwpAQCAtMTM4Miw3ICsxMzgxLDcgQEAKICNpZmRlZiBDT05GSUdfUENORVQzMl9OQVBJCiBzdGF0aWMgaW50IHBjbmV0MzJfcG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgKmJ1ZGdldCkKIHsKLQlzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CiAJaW50IHF1b3RhID0gbWluKGRldi0+cXVvdGEsICpidWRnZXQpOwogCXVuc2lnbmVkIGxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTE0MjksNyArMTQyOCw3IEBACiAjZGVmaW5lIFBDTkVUMzJfTUFYX1BIWVMJMzIKIHN0YXRpYyBpbnQgcGNuZXQzMl9nZXRfcmVnc19sZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CiAJaW50IGogPSBscC0+cGh5Y291bnQgKiBQQ05FVDMyX1JFR1NfUEVSX1BIWTsKIAogCXJldHVybiAoKFBDTkVUMzJfTlVNX1JFR1MgKyBqKSAqIHNpemVvZih1MTYpKTsKQEAgLTE0NDAsNyArMTQzOSw3IEBACiB7CiAJaW50IGksIGNzcjA7CiAJdTE2ICpidWZmID0gcHRyOwotCXN0cnVjdCBwY25ldDMyX3ByaXZhdGUgKmxwID0gZGV2LT5wcml2OworCXN0cnVjdCBwY25ldDMyX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgcGNuZXQzMl9hY2Nlc3MgKmEgPSAmbHAtPmE7CiAJdWxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTE1OTMsNyArMTU5Miw2IEBACiBwY25ldDMyX3Byb2JlMSh1bnNpZ25lZCBsb25nIGlvYWRkciwgaW50IHNoYXJlZCwgc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7CiAJc3RydWN0IHBjbmV0MzJfcHJpdmF0ZSAqbHA7Ci0JZG1hX2FkZHJfdCBscF9kbWFfYWRkcjsKIAlpbnQgaSwgbWVkaWE7CiAJaW50IGZkeCwgbWlpLCBmc2V0LCBkeHN1ZmxvOwogCWludCBjaGlwX3ZlcnNpb247CkBAIC0xNzE1LDcgKzE3MTMsNyBAQAogCQlkeHN1ZmxvID0gMTsKIAl9CiAKLQlkZXYgPSBhbGxvY19ldGhlcmRldigwKTsKKwlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2YoKmxwKSk7CiAJaWYgKCFkZXYpIHsKIAkJaWYgKHBjbmV0MzJfZGVidWcgJiBORVRJRl9NU0dfUFJPQkUpCiAJCQlwcmludGsoS0VSTl9FUlIgUEZYICJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQuXG4iKTsKQEAgLTE4MDYsMjUgKzE4MDQsMjIgQEAKIAl9CiAKIAlkZXYtPmJhc2VfYWRkciA9IGlvYWRkcjsKKwlscCA9IG5ldGRldl9wcml2KGRldik7CiAJLyogcGNpX2FsbG9jX2NvbnNpc3RlbnQgcmV0dXJucyBwYWdlLWFsaWduZWQgbWVtb3J5LCBzbyB3ZSBkbyBub3QgaGF2ZSB0byBjaGVjayB0aGUgYWxpZ25tZW50ICovCi0JaWYgKChscCA9Ci0JICAgICBwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LCBzaXplb2YoKmxwKSwgJmxwX2RtYV9hZGRyKSkgPT0gTlVMTCkgeworCWlmICgobHAtPmluaXRfYmxvY2sgPQorCSAgICAgcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwgc2l6ZW9mKCpscC0+aW5pdF9ibG9jayksICZscC0+aW5pdF9kbWFfYWRkcikpID09IE5VTEwpIHsKIAkJaWYgKHBjbmV0MzJfZGVidWcgJiBORVRJRl9NU0dfUFJPQkUpCiAJCQlwcmludGsoS0VSTl9FUlIgUEZYCiAJCQkgICAgICAgIkNvbnNpc3RlbnQgbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkLlxuIik7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyX2ZyZWVfbmV0ZGV2OwogCX0KLQotCW1lbXNldChscCwgMCwgc2l6ZW9mKCpscCkpOwotCWxwLT5kbWFfYWRkciA9IGxwX2RtYV9hZGRyOwogCWxwLT5wY2lfZGV2ID0gcGRldjsKIAogCXNwaW5fbG9ja19pbml0KCZscC0+bG9jayk7CiAKIAlTRVRfTU9EVUxFX09XTkVSKGRldik7CiAJU0VUX05FVERFVl9ERVYoZGV2LCAmcGRldi0+ZGV2KTsKLQlkZXYtPnByaXYgPSBscDsKIAlscC0+bmFtZSA9IGNoaXBuYW1lOwogCWxwLT5zaGFyZWRfaXJxID0gc2hhcmVkOwogCWxwLT50eF9yaW5nX3NpemUgPSBUWF9SSU5HX1NJWkU7CS8qIGRlZmF1bHQgdHggcmluZyBzaXplICovCkBAIC0xODcxLDIzICsxODY2LDIxIEBACiAJICAgICYmIGRldi0+ZGV2X2FkZHJbMl0gPT0gMHg3NSkKIAkJbHAtPm9wdGlvbnMgPSBQQ05FVDMyX1BPUlRfRkQgfCBQQ05FVDMyX1BPUlRfR1BTSTsKIAotCWxwLT5pbml0X2Jsb2NrLm1vZGUgPSBsZTE2X3RvX2NwdSgweDAwMDMpOwkvKiBEaXNhYmxlIFJ4IGFuZCBUeC4gKi8KLQlscC0+aW5pdF9ibG9jay50bGVuX3JsZW4gPQorCWxwLT5pbml0X2Jsb2NrLT5tb2RlID0gbGUxNl90b19jcHUoMHgwMDAzKTsJLyogRGlzYWJsZSBSeCBhbmQgVHguICovCisJbHAtPmluaXRfYmxvY2stPnRsZW5fcmxlbiA9CiAJICAgIGxlMTZfdG9fY3B1KGxwLT50eF9sZW5fYml0cyB8IGxwLT5yeF9sZW5fYml0cyk7CiAJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKLQkJbHAtPmluaXRfYmxvY2sucGh5c19hZGRyW2ldID0gZGV2LT5kZXZfYWRkcltpXTsKLQlscC0+aW5pdF9ibG9jay5maWx0ZXJbMF0gPSAweDAwMDAwMDAwOwotCWxwLT5pbml0X2Jsb2NrLmZpbHRlclsxXSA9IDB4MDAwMDAwMDA7Ci0JbHAtPmluaXRfYmxvY2sucnhfcmluZyA9ICh1MzIpIGxlMzJfdG9fY3B1KGxwLT5yeF9yaW5nX2RtYV9hZGRyKTsKLQlscC0+aW5pdF9ibG9jay50eF9yaW5nID0gKHUzMikgbGUzMl90b19jcHUobHAtPnR4X3JpbmdfZG1hX2FkZHIpOworCQlscC0+aW5pdF9ibG9jay0+cGh5c19hZGRyW2ldID0gZGV2LT5kZXZfYWRkcltpXTsKKwlscC0+aW5pdF9ibG9jay0+ZmlsdGVyWzBdID0gMHgwMDAwMDAwMDsKKwlscC0+aW5pdF9ibG9jay0+ZmlsdGVyWzFdID0gMHgwMDAwMDAwMDsKKwlscC0+aW5pdF9ibG9jay0+cnhfcmluZyA9ICh1MzIpIGxlMzJfdG9fY3B1KGxwLT5yeF9yaW5nX2RtYV9hZGRyKTsKKwlscC0+aW5pdF9ibG9jay0+dHhfcmluZyA9ICh1MzIpIGxlMzJfdG9fY3B1KGxwLT50eF9yaW5nX2RtYV9hZGRyKTsKIAogCS8qIHN3aXRjaCBwY25ldDMyIHRvIDMyYml0IG1vZGUgKi8KIAlhLT53cml0ZV9iY3IoaW9hZGRyLCAyMCwgMik7CiAKLQlhLT53cml0ZV9jc3IoaW9hZGRyLCAxLCAobHAtPmRtYV9hZGRyICsgb2Zmc2V0b2Yoc3RydWN0IHBjbmV0MzJfcHJpdmF0ZSwKLQkJCQkJCQkgaW5pdF9ibG9jaykpICYgMHhmZmZmKTsKLQlhLT53cml0ZV9jc3IoaW9hZGRyLCAyLCAobHAtPmRtYV9hZGRyICsgb2Zmc2V0b2Yoc3RydWN0IHBjbmV0MzJfcHJpdmF0ZSwKLQkJCQkJCQkgaW5pdF9ibG9jaykpID4+IDE2KTsKKwlhLT53cml0ZV9jc3IoaW9hZGRyLCAxLCAobHAtPmluaXRfZG1hX2FkZHIgJiAweGZmZmYpKTsKKwlhLT53cml0ZV9jc3IoaW9hZGRyLCAyLCAobHAtPmluaXRfZG1hX2FkZHIgPj4gMTYpKTsKIAogCWlmIChwZGV2KSB7CQkvKiB1c2UgdGhlIElSUSBwcm92aWRlZCBieSBQQ0kgKi8KIAkJZGV2LT5pcnEgPSBwZGV2LT5pcnE7CkBAIC0xOTkzLDcgKzE5ODYsOCBAQAogICAgICAgZXJyX2ZyZWVfcmluZzoKIAlwY25ldDMyX2ZyZWVfcmluZyhkZXYpOwogICAgICAgZXJyX2ZyZWVfY29uc2lzdGVudDoKLQlwY2lfZnJlZV9jb25zaXN0ZW50KGxwLT5wY2lfZGV2LCBzaXplb2YoKmxwKSwgbHAsIGxwLT5kbWFfYWRkcik7CisJcGNpX2ZyZWVfY29uc2lzdGVudChscC0+cGNpX2Rldiwgc2l6ZW9mKCpscC0+aW5pdF9ibG9jayksIAorCQkJICAgIGxwLT5pbml0X2Jsb2NrLCBscC0+aW5pdF9kbWFfYWRkcik7CiAgICAgICBlcnJfZnJlZV9uZXRkZXY6CiAJZnJlZV9uZXRkZXYoZGV2KTsKICAgICAgIGVycl9yZWxlYXNlX3JlZ2lvbjoKQEAgLTIwMDQsNyArMTk5OCw3IEBACiAvKiBpZiBhbnkgYWxsb2NhdGlvbiBmYWlscywgY2FsbGVyIG11c3QgYWxzbyBjYWxsIHBjbmV0MzJfZnJlZV9yaW5nICovCiBzdGF0aWMgaW50IHBjbmV0MzJfYWxsb2NfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjaGFyICpuYW1lKQogewotCXN0cnVjdCBwY25ldDMyX3ByaXZhdGUgKmxwID0gZGV2LT5wcml2OworCXN0cnVjdCBwY25ldDMyX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAogCWxwLT50eF9yaW5nID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQobHAtPnBjaV9kZXYsCiAJCQkJCSAgIHNpemVvZihzdHJ1Y3QgcGNuZXQzMl90eF9oZWFkKSAqCkBAIC0yMDcxLDcgKzIwNjUsNyBAQAogCiBzdGF0aWMgdm9pZCBwY25ldDMyX2ZyZWVfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXN0cnVjdCBwY25ldDMyX3ByaXZhdGUgKmxwID0gZGV2LT5wcml2OworCXN0cnVjdCBwY25ldDMyX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAogCWtmcmVlKGxwLT50eF9za2J1ZmYpOwogCWxwLT50eF9za2J1ZmYgPSBOVUxMOwpAQCAtMjEwNCw3ICsyMDk4LDcgQEAKIAogc3RhdGljIGludCBwY25ldDMyX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CiAJdW5zaWduZWQgbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKIAl1MTYgdmFsOwogCWludCBpOwpAQCAtMjEzNSw4ICsyMTI5LDcgQEAKIAkJICAgICAgICIlczogcGNuZXQzMl9vcGVuKCkgaXJxICVkIHR4L3J4IHJpbmdzICUjeC8lI3ggaW5pdCAlI3guXG4iLAogCQkgICAgICAgZGV2LT5uYW1lLCBkZXYtPmlycSwgKHUzMikgKGxwLT50eF9yaW5nX2RtYV9hZGRyKSwKIAkJICAgICAgICh1MzIpIChscC0+cnhfcmluZ19kbWFfYWRkciksCi0JCSAgICAgICAodTMyKSAobHAtPmRtYV9hZGRyICsKLQkJCSAgICAgIG9mZnNldG9mKHN0cnVjdCBwY25ldDMyX3ByaXZhdGUsIGluaXRfYmxvY2spKSk7CisJCSAgICAgICAodTMyKSAobHAtPmluaXRfZG1hX2FkZHIpKTsKIAogCS8qIHNldC9yZXNldCBhdXRvc2VsZWN0IGJpdCAqLwogCXZhbCA9IGxwLT5hLnJlYWRfYmNyKGlvYWRkciwgMikgJiB+MjsKQEAgLTIyNzUsNyArMjI2OCw3IEBACiAJfQogI2VuZGlmCiAKLQlscC0+aW5pdF9ibG9jay5tb2RlID0KKwlscC0+aW5pdF9ibG9jay0+bW9kZSA9CiAJICAgIGxlMTZfdG9fY3B1KChscC0+b3B0aW9ucyAmIFBDTkVUMzJfUE9SVF9QT1JUU0VMKSA8PCA3KTsKIAlwY25ldDMyX2xvYWRfbXVsdGljYXN0KGRldik7CiAKQEAgLTIyODUsMTIgKzIyNzgsOCBAQAogCX0KIAogCS8qIFJlLWluaXRpYWxpemUgdGhlIFBDTkVUMzIsIGFuZCBzdGFydCBpdCB3aGVuIGRvbmUuICovCi0JbHAtPmEud3JpdGVfY3NyKGlvYWRkciwgMSwgKGxwLT5kbWFfYWRkciArCi0JCQkJICAgIG9mZnNldG9mKHN0cnVjdCBwY25ldDMyX3ByaXZhdGUsCi0JCQkJCSAgICAgaW5pdF9ibG9jaykpICYgMHhmZmZmKTsKLQlscC0+YS53cml0ZV9jc3IoaW9hZGRyLCAyLAotCQkJKGxwLT5kbWFfYWRkciArCi0JCQkgb2Zmc2V0b2Yoc3RydWN0IHBjbmV0MzJfcHJpdmF0ZSwgaW5pdF9ibG9jaykpID4+IDE2KTsKKwlscC0+YS53cml0ZV9jc3IoaW9hZGRyLCAxLCAobHAtPmluaXRfZG1hX2FkZHIgJiAweGZmZmYpKTsKKwlscC0+YS53cml0ZV9jc3IoaW9hZGRyLCAyLCAobHAtPmluaXRfZG1hX2FkZHIgPj4gMTYpKTsKIAogCWxwLT5hLndyaXRlX2Nzcihpb2FkZHIsIENTUjQsIDB4MDkxNSk7CS8qIGF1dG8gdHggcGFkICovCiAJbHAtPmEud3JpdGVfY3NyKGlvYWRkciwgQ1NSMCwgQ1NSMF9JTklUKTsKQEAgLTIzMTcsOCArMjMwNiw3IEBACiAJCXByaW50ayhLRVJOX0RFQlVHCiAJCSAgICAgICAiJXM6IHBjbmV0MzIgb3BlbiBhZnRlciAlZCB0aWNrcywgaW5pdCBibG9jayAlI3ggY3NyMCAlNC40eC5cbiIsCiAJCSAgICAgICBkZXYtPm5hbWUsIGksCi0JCSAgICAgICAodTMyKSAobHAtPmRtYV9hZGRyICsKLQkJCSAgICAgIG9mZnNldG9mKHN0cnVjdCBwY25ldDMyX3ByaXZhdGUsIGluaXRfYmxvY2spKSwKKwkJICAgICAgICh1MzIpIChscC0+aW5pdF9kbWFfYWRkciksCiAJCSAgICAgICBscC0+YS5yZWFkX2Nzcihpb2FkZHIsIENTUjApKTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7CkBAIC0yMzU2LDcgKzIzNDQsNyBAQAogCiBzdGF0aWMgdm9pZCBwY25ldDMyX3B1cmdlX3R4X3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbHAtPnR4X3Jpbmdfc2l6ZTsgaSsrKSB7CkBAIC0yMzc2LDcgKzIzNjQsNyBAQAogLyogSW5pdGlhbGl6ZSB0aGUgUENORVQzMiBSeCBhbmQgVHggcmluZ3MuICovCiBzdGF0aWMgaW50IHBjbmV0MzJfaW5pdF9yaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IHBjbmV0MzJfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CisJc3RydWN0IHBjbmV0MzJfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOwogCWludCBpOwogCiAJbHAtPnR4X2Z1bGwgPSAwOwpAQCAtMjQxOCwxMiArMjQwNiwxMiBAQAogCQlscC0+dHhfZG1hX2FkZHJbaV0gPSAwOwogCX0KIAotCWxwLT5pbml0X2Jsb2NrLnRsZW5fcmxlbiA9CisJbHAtPmluaXRfYmxvY2stPnRsZW5fcmxlbiA9CiAJICAgIGxlMTZfdG9fY3B1KGxwLT50eF9sZW5fYml0cyB8IGxwLT5yeF9sZW5fYml0cyk7CiAJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKLQkJbHAtPmluaXRfYmxvY2sucGh5c19hZGRyW2ldID0gZGV2LT5kZXZfYWRkcltpXTsKLQlscC0+aW5pdF9ibG9jay5yeF9yaW5nID0gKHUzMikgbGUzMl90b19jcHUobHAtPnJ4X3JpbmdfZG1hX2FkZHIpOwotCWxwLT5pbml0X2Jsb2NrLnR4X3JpbmcgPSAodTMyKSBsZTMyX3RvX2NwdShscC0+dHhfcmluZ19kbWFfYWRkcik7CisJCWxwLT5pbml0X2Jsb2NrLT5waHlzX2FkZHJbaV0gPSBkZXYtPmRldl9hZGRyW2ldOworCWxwLT5pbml0X2Jsb2NrLT5yeF9yaW5nID0gKHUzMikgbGUzMl90b19jcHUobHAtPnJ4X3JpbmdfZG1hX2FkZHIpOworCWxwLT5pbml0X2Jsb2NrLT50eF9yaW5nID0gKHUzMikgbGUzMl90b19jcHUobHAtPnR4X3JpbmdfZG1hX2FkZHIpOwogCXdtYigpOwkJCS8qIE1ha2Ugc3VyZSBhbGwgY2hhbmdlcyBhcmUgdmlzaWJsZSAqLwogCXJldHVybiAwOwogfQpAQCAtMjQzNCw3ICsyNDIyLDcgQEAKICAqLwogc3RhdGljIHZvaWQgcGNuZXQzMl9yZXN0YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBjc3IwX2JpdHMpCiB7Ci0Jc3RydWN0IHBjbmV0MzJfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CisJc3RydWN0IHBjbmV0MzJfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOwogCXVuc2lnbmVkIGxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CiAJaW50IGk7CiAKQEAgLTI0NjQsNyArMjQ1Miw3IEBACiAKIHN0YXRpYyB2b2lkIHBjbmV0MzJfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXN0cnVjdCBwY25ldDMyX3ByaXZhdGUgKmxwID0gZGV2LT5wcml2OworCXN0cnVjdCBwY25ldDMyX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl1bnNpZ25lZCBsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyLCBmbGFnczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOwpAQCAtMjUwNSw3ICsyNDkzLDcgQEAKIAogc3RhdGljIGludCBwY25ldDMyX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CiAJdW5zaWduZWQgbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKIAl1MTYgc3RhdHVzOwogCWludCBlbnRyeTsKQEAgLTI1NzAsNyArMjU1OCw3IEBACiAJaW50IGJvZ3VzY250ID0gbWF4X2ludGVycnVwdF93b3JrOwogCiAJaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7Ci0JbHAgPSBkZXYtPnByaXY7CisJbHAgPSBuZXRkZXZfcHJpdihkZXYpOwogCiAJc3Bpbl9sb2NrKCZscC0+bG9jayk7CiAKQEAgLTI2NTIsNyArMjY0MCw3IEBACiBzdGF0aWMgaW50IHBjbmV0MzJfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAl1bnNpZ25lZCBsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOwotCXN0cnVjdCBwY25ldDMyX3ByaXZhdGUgKmxwID0gZGV2LT5wcml2OworCXN0cnVjdCBwY25ldDMyX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJZGVsX3RpbWVyX3N5bmMoJmxwLT53YXRjaGRvZ190aW1lcik7CkBAIC0yNjkzLDcgKzI2ODEsNyBAQAogCiBzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnBjbmV0MzJfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IHBjbmV0MzJfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CisJc3RydWN0IHBjbmV0MzJfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOwogCXVuc2lnbmVkIGxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIApAQCAtMjcwNyw4ICsyNjk1LDggQEAKIC8qIHRha2VuIGZyb20gdGhlIHN1bmxhbmNlIGRyaXZlciwgd2hpY2ggaXQgdG9vayBmcm9tIHRoZSBkZXBjYSBkcml2ZXIgKi8KIHN0YXRpYyB2b2lkIHBjbmV0MzJfbG9hZF9tdWx0aWNhc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKLQl2b2xhdGlsZSBzdHJ1Y3QgcGNuZXQzMl9pbml0X2Jsb2NrICppYiA9ICZscC0+aW5pdF9ibG9jazsKKwlzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJdm9sYXRpbGUgc3RydWN0IHBjbmV0MzJfaW5pdF9ibG9jayAqaWIgPSBscC0+aW5pdF9ibG9jazsKIAl2b2xhdGlsZSB1MTYgKm1jYXN0X3RhYmxlID0gKHUxNiAqKSAmIGliLT5maWx0ZXI7CiAJc3RydWN0IGRldl9tY19saXN0ICpkbWkgPSBkZXYtPm1jX2xpc3Q7CiAJdW5zaWduZWQgbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKQEAgLTI3NTcsNyArMjc0NSw3IEBACiBzdGF0aWMgdm9pZCBwY25ldDMyX3NldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXVuc2lnbmVkIGxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHIsIGZsYWdzOwotCXN0cnVjdCBwY25ldDMyX3ByaXZhdGUgKmxwID0gZGV2LT5wcml2OworCXN0cnVjdCBwY25ldDMyX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlpbnQgY3NyMTUsIHN1c3BlbmRlZDsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOwpAQCAtMjc2OCwxMiArMjc1NiwxMiBAQAogCQlpZiAobmV0aWZfbXNnX2h3KGxwKSkKIAkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBQcm9taXNjdW91cyBtb2RlIGVuYWJsZWQuXG4iLAogCQkJICAgICAgIGRldi0+bmFtZSk7Ci0JCWxwLT5pbml0X2Jsb2NrLm1vZGUgPQorCQlscC0+aW5pdF9ibG9jay0+bW9kZSA9CiAJCSAgICBsZTE2X3RvX2NwdSgweDgwMDAgfCAobHAtPm9wdGlvbnMgJiBQQ05FVDMyX1BPUlRfUE9SVFNFTCkgPDwKIAkJCQk3KTsKIAkJbHAtPmEud3JpdGVfY3NyKGlvYWRkciwgQ1NSMTUsIGNzcjE1IHwgMHg4MDAwKTsKIAl9IGVsc2UgewotCQlscC0+aW5pdF9ibG9jay5tb2RlID0KKwkJbHAtPmluaXRfYmxvY2stPm1vZGUgPQogCQkgICAgbGUxNl90b19jcHUoKGxwLT5vcHRpb25zICYgUENORVQzMl9QT1JUX1BPUlRTRUwpIDw8IDcpOwogCQlscC0+YS53cml0ZV9jc3IoaW9hZGRyLCBDU1IxNSwgY3NyMTUgJiAweDdmZmYpOwogCQlwY25ldDMyX2xvYWRfbXVsdGljYXN0KGRldik7CkBAIC0yNzk2LDcgKzI3ODQsNyBAQAogLyogVGhpcyByb3V0aW5lIGFzc3VtZXMgdGhhdCB0aGUgbHAtPmxvY2sgaXMgaGVsZCAqLwogc3RhdGljIGludCBtZGlvX3JlYWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwgaW50IHJlZ19udW0pCiB7Ci0Jc3RydWN0IHBjbmV0MzJfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CisJc3RydWN0IHBjbmV0MzJfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOwogCXVuc2lnbmVkIGxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CiAJdTE2IHZhbF9vdXQ7CiAKQEAgLTI4MTIsNyArMjgwMCw3IEBACiAvKiBUaGlzIHJvdXRpbmUgYXNzdW1lcyB0aGF0IHRoZSBscC0+bG9jayBpcyBoZWxkICovCiBzdGF0aWMgdm9pZCBtZGlvX3dyaXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfaWQsIGludCByZWdfbnVtLCBpbnQgdmFsKQogewotCXN0cnVjdCBwY25ldDMyX3ByaXZhdGUgKmxwID0gZGV2LT5wcml2OworCXN0cnVjdCBwY25ldDMyX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl1bnNpZ25lZCBsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOwogCiAJaWYgKCFscC0+bWlpKQpAQCAtMjgyNCw3ICsyODEyLDcgQEAKIAogc3RhdGljIGludCBwY25ldDMyX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpCiB7Ci0Jc3RydWN0IHBjbmV0MzJfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CisJc3RydWN0IHBjbmV0MzJfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOwogCWludCByYzsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC0yODQyLDcgKzI4MzAsNyBAQAogCiBzdGF0aWMgaW50IHBjbmV0MzJfY2hlY2tfb3RoZXJwaHkoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IG1paV9pZl9pbmZvIG1paSA9IGxwLT5taWlfaWY7CiAJdTE2IGJtY3I7CiAJaW50IGk7CkBAIC0yODg5LDcgKzI4NzcsNyBAQAogCiBzdGF0aWMgdm9pZCBwY25ldDMyX2NoZWNrX21lZGlhKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB2ZXJib3NlKQogewotCXN0cnVjdCBwY25ldDMyX3ByaXZhdGUgKmxwID0gZGV2LT5wcml2OworCXN0cnVjdCBwY25ldDMyX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlpbnQgY3Vycl9saW5rOwogCWludCBwcmV2X2xpbmsgPSBuZXRpZl9jYXJyaWVyX29rKGRldikgPyAxIDogMDsKIAl1MzIgYmNyOTsKQEAgLTI5NDUsNyArMjkzMyw3IEBACiAKIHN0YXRpYyB2b2lkIHBjbmV0MzJfd2F0Y2hkb2coc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCS8qIFByaW50IHRoZSBsaW5rIHN0YXR1cyBpZiBpdCBoYXMgY2hhbmdlZCAqLwpAQCAtMjk2MSwxMiArMjk0OSwxMyBAQAogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CiAKIAlpZiAoZGV2KSB7Ci0JCXN0cnVjdCBwY25ldDMyX3ByaXZhdGUgKmxwID0gZGV2LT5wcml2OworCQlzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CiAKIAkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKIAkJcGNuZXQzMl9mcmVlX3JpbmcoZGV2KTsKIAkJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIFBDTkVUMzJfVE9UQUxfU0laRSk7Ci0JCXBjaV9mcmVlX2NvbnNpc3RlbnQobHAtPnBjaV9kZXYsIHNpemVvZigqbHApLCBscCwgbHAtPmRtYV9hZGRyKTsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChscC0+cGNpX2Rldiwgc2l6ZW9mKCpscC0+aW5pdF9ibG9jayksIAorCQkJCSAgICBscC0+aW5pdF9ibG9jaywgbHAtPmluaXRfZG1hX2FkZHIpOwogCQlmcmVlX25ldGRldihkZXYpOwogCQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CiAJCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKQEAgLTMwNDEsMTIgKzMwMzAsMTMgQEAKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV4dF9kZXY7CiAKIAl3aGlsZSAocGNuZXQzMl9kZXYpIHsKLQkJc3RydWN0IHBjbmV0MzJfcHJpdmF0ZSAqbHAgPSBwY25ldDMyX2Rldi0+cHJpdjsKKwkJc3RydWN0IHBjbmV0MzJfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihwY25ldDMyX2Rldik7CiAJCW5leHRfZGV2ID0gbHAtPm5leHQ7CiAJCXVucmVnaXN0ZXJfbmV0ZGV2KHBjbmV0MzJfZGV2KTsKIAkJcGNuZXQzMl9mcmVlX3JpbmcocGNuZXQzMl9kZXYpOwogCQlyZWxlYXNlX3JlZ2lvbihwY25ldDMyX2Rldi0+YmFzZV9hZGRyLCBQQ05FVDMyX1RPVEFMX1NJWkUpOwotCQlwY2lfZnJlZV9jb25zaXN0ZW50KGxwLT5wY2lfZGV2LCBzaXplb2YoKmxwKSwgbHAsIGxwLT5kbWFfYWRkcik7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQobHAtPnBjaV9kZXYsIHNpemVvZigqbHAtPmluaXRfYmxvY2spLCAKKwkJCQkgICAgbHAtPmluaXRfYmxvY2ssIGxwLT5pbml0X2RtYV9hZGRyKTsKIAkJZnJlZV9uZXRkZXYocGNuZXQzMl9kZXYpOwogCQlwY25ldDMyX2RldiA9IG5leHRfZGV2OwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BoeS9maXhlZC5jIGIvZHJpdmVycy9uZXQvcGh5L2ZpeGVkLmMKaW5kZXggNjZkYTkxYi4uNjhjOTliNGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BoeS9maXhlZC5jCisrKyBiL2RyaXZlcnMvbmV0L3BoeS9maXhlZC5jCkBAIC0yNzYsMjEgKzI3NiwxNSBAQAogCSAgIGFydGlmaWNpYWxseSwgd2UgYXJlIGJpbmRpbmcgdGhlIGRyaXZlciBoZXJlIGJ5IGhhbmQ7CiAJICAgaXQgd2lsbCBiZSB0aGUgc2FtZSBmb3IgYWxsIHRoZSBmaXhlZCBwaHlzIGFueXdheS4KIAkgKi8KLQlkb3duX3dyaXRlKCZwaHlkZXYtPmRldi5idXMtPnN1YnN5cy5yd3NlbSk7Ci0KIAlwaHlkZXYtPmRldi5kcml2ZXIgPSAmZml4ZWRfbWRpb19kcml2ZXIuZHJpdmVyOwogCiAJZXJyID0gcGh5ZGV2LT5kZXYuZHJpdmVyLT5wcm9iZSgmcGh5ZGV2LT5kZXYpOwogCWlmKGVyciA8IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJQaHkgJXM6IHByb2JsZW1zIHdpdGggZml4ZWQgZHJpdmVyXG4iLHBoeWRldi0+ZGV2LmJ1c19pZCk7Ci0JCXVwX3dyaXRlKCZwaHlkZXYtPmRldi5idXMtPnN1YnN5cy5yd3NlbSk7CiAJCWdvdG8gcHJvYmVfZmFpbDsKIAl9CiAKIAllcnIgPSBkZXZpY2VfYmluZF9kcml2ZXIoJnBoeWRldi0+ZGV2KTsKLQotCXVwX3dyaXRlKCZwaHlkZXYtPmRldi5idXMtPnN1YnN5cy5yd3NlbSk7Ci0KIAlpZiAoZXJyKQogCQlnb3RvIHByb2JlX2ZhaWw7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BoeS9tZGlvX2J1cy5jIGIvZHJpdmVycy9uZXQvcGh5L21kaW9fYnVzLmMKaW5kZXggYjMxY2UyNy4uZmM0YWVlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGh5L21kaW9fYnVzLmMKKysrIGIvZHJpdmVycy9uZXQvcGh5L21kaW9fYnVzLmMKQEAgLTM1LDEwICszNSwxNCBAQAogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCi0vKiBtZGlvYnVzX3JlZ2lzdGVyIAorLyoqCisgKiBtZGlvYnVzX3JlZ2lzdGVyIC0gYnJpbmcgdXAgYWxsIHRoZSBQSFlzIG9uIGEgZ2l2ZW4gYnVzIGFuZCBhdHRhY2ggdGhlbSB0byBidXMKKyAqIEBidXM6IHRhcmdldCBtaWlfYnVzCiAgKgotICogZGVzY3JpcHRpb246IENhbGxlZCBieSBhIGJ1cyBkcml2ZXIgdG8gYnJpbmcgdXAgYWxsIHRoZSBQSFlzCi0gKiAgIG9uIGEgZ2l2ZW4gYnVzLCBhbmQgYXR0YWNoIHRoZW0gdG8gdGhlIGJ1cworICogRGVzY3JpcHRpb246IENhbGxlZCBieSBhIGJ1cyBkcml2ZXIgdG8gYnJpbmcgdXAgYWxsIHRoZSBQSFlzCisgKiAgIG9uIGEgZ2l2ZW4gYnVzLCBhbmQgYXR0YWNoIHRoZW0gdG8gdGhlIGJ1cy4KKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcyBvciA8IDAgb24gZXJyb3IuCiAgKi8KIGludCBtZGlvYnVzX3JlZ2lzdGVyKHN0cnVjdCBtaWlfYnVzICpidXMpCiB7CkBAIC0xMTQsMTAgKzExOCwxMyBAQAogfQogRVhQT1JUX1NZTUJPTChtZGlvYnVzX3VucmVnaXN0ZXIpOwogCi0vKiBtZGlvX2J1c19tYXRjaAorLyoqCisgKiBtZGlvX2J1c19tYXRjaCAtIGRldGVybWluZSBpZiBnaXZlbiBQSFkgZHJpdmVyIHN1cHBvcnRzIHRoZSBnaXZlbiBQSFkgZGV2aWNlCisgKiBAZGV2OiB0YXJnZXQgUEhZIGRldmljZQorICogQGRydjogZ2l2ZW4gUEhZIGRyaXZlcgogICoKLSAqIGRlc2NyaXB0aW9uOiBHaXZlbiBhIFBIWSBkZXZpY2UsIGFuZCBhIFBIWSBkcml2ZXIsIHJldHVybiAxIGlmCi0gKiAgIHRoZSBkcml2ZXIgc3VwcG9ydHMgdGhlIGRldmljZS4gIE90aGVyd2lzZSwgcmV0dXJuIDAKKyAqIERlc2NyaXB0aW9uOiBHaXZlbiBhIFBIWSBkZXZpY2UsIGFuZCBhIFBIWSBkcml2ZXIsIHJldHVybiAxIGlmCisgKiAgIHRoZSBkcml2ZXIgc3VwcG9ydHMgdGhlIGRldmljZS4gIE90aGVyd2lzZSwgcmV0dXJuIDAuCiAgKi8KIHN0YXRpYyBpbnQgbWRpb19idXNfbWF0Y2goc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGh5L3BoeS5jIGIvZHJpdmVycy9uZXQvcGh5L3BoeS5jCmluZGV4IGM5NGExZmIuLmVlZDQzM2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BoeS9waHkuYworKysgYi9kcml2ZXJzL25ldC9waHkvcGh5LmMKQEAgLTM5LDcgKzM5LDkgQEAKICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAotLyogQ29udmVuaWVuY2UgZnVuY3Rpb24gdG8gcHJpbnQgb3V0IHRoZSBjdXJyZW50IHBoeSBzdGF0dXMKKy8qKgorICogcGh5X3ByaW50X3N0YXR1cyAtIENvbnZlbmllbmNlIGZ1bmN0aW9uIHRvIHByaW50IG91dCB0aGUgY3VycmVudCBwaHkgc3RhdHVzCisgKiBAcGh5ZGV2OiB0aGUgcGh5X2RldmljZSBzdHJ1Y3QKICAqLwogdm9pZCBwaHlfcHJpbnRfc3RhdHVzKHN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYpCiB7CkBAIC01NSwxMCArNTcsMTUgQEAKIEVYUE9SVF9TWU1CT0wocGh5X3ByaW50X3N0YXR1cyk7CiAKIAotLyogQ29udmVuaWVuY2UgZnVuY3Rpb25zIGZvciByZWFkaW5nL3dyaXRpbmcgYSBnaXZlbiBQSFkKLSAqIHJlZ2lzdGVyLiBUaGV5IE1VU1QgTk9UIGJlIGNhbGxlZCBmcm9tIGludGVycnVwdCBjb250ZXh0LAorLyoqCisgKiBwaHlfcmVhZCAtIENvbnZlbmllbmNlIGZ1bmN0aW9uIGZvciByZWFkaW5nIGEgZ2l2ZW4gUEhZIHJlZ2lzdGVyCisgKiBAcGh5ZGV2OiB0aGUgcGh5X2RldmljZSBzdHJ1Y3QKKyAqIEByZWdudW06IHJlZ2lzdGVyIG51bWJlciB0byByZWFkCisgKgorICogTk9URTogTVVTVCBOT1QgYmUgY2FsbGVkIGZyb20gaW50ZXJydXB0IGNvbnRleHQsCiAgKiBiZWNhdXNlIHRoZSBidXMgcmVhZC93cml0ZSBmdW5jdGlvbnMgbWF5IHdhaXQgZm9yIGFuIGludGVycnVwdAotICogdG8gY29uY2x1ZGUgdGhlIG9wZXJhdGlvbi4gKi8KKyAqIHRvIGNvbmNsdWRlIHRoZSBvcGVyYXRpb24uCisgKi8KIGludCBwaHlfcmVhZChzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2LCB1MTYgcmVnbnVtKQogewogCWludCByZXR2YWw7CkBAIC03Miw2ICs3OSwxNiBAQAogfQogRVhQT1JUX1NZTUJPTChwaHlfcmVhZCk7CiAKKy8qKgorICogcGh5X3dyaXRlIC0gQ29udmVuaWVuY2UgZnVuY3Rpb24gZm9yIHdyaXRpbmcgYSBnaXZlbiBQSFkgcmVnaXN0ZXIKKyAqIEBwaHlkZXY6IHRoZSBwaHlfZGV2aWNlIHN0cnVjdAorICogQHJlZ251bTogcmVnaXN0ZXIgbnVtYmVyIHRvIHdyaXRlCisgKiBAdmFsOiB2YWx1ZSB0byB3cml0ZSB0byBAcmVnbnVtCisgKgorICogTk9URTogTVVTVCBOT1QgYmUgY2FsbGVkIGZyb20gaW50ZXJydXB0IGNvbnRleHQsCisgKiBiZWNhdXNlIHRoZSBidXMgcmVhZC93cml0ZSBmdW5jdGlvbnMgbWF5IHdhaXQgZm9yIGFuIGludGVycnVwdAorICogdG8gY29uY2x1ZGUgdGhlIG9wZXJhdGlvbi4KKyAqLwogaW50IHBoeV93cml0ZShzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2LCB1MTYgcmVnbnVtLCB1MTYgdmFsKQogewogCWludCBlcnI7CkBAIC04NSw3ICsxMDIsMTUgQEAKIH0KIEVYUE9SVF9TWU1CT0wocGh5X3dyaXRlKTsKIAotCisvKioKKyAqIHBoeV9jbGVhcl9pbnRlcnJ1cHQgLSBBY2sgdGhlIHBoeSBkZXZpY2UncyBpbnRlcnJ1cHQKKyAqIEBwaHlkZXY6IHRoZSBwaHlfZGV2aWNlIHN0cnVjdAorICoKKyAqIElmIHRoZSBAcGh5ZGV2IGRyaXZlciBoYXMgYW4gYWNrX2ludGVycnVwdCBmdW5jdGlvbiwgY2FsbCBpdCB0bworICogYWNrIGFuZCBjbGVhciB0aGUgcGh5IGRldmljZSdzIGludGVycnVwdC4KKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcyBvbiA8IDAgb24gZXJyb3IuCisgKi8KIGludCBwaHlfY2xlYXJfaW50ZXJydXB0KHN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYpCiB7CiAJaW50IGVyciA9IDA7CkBAIC05Niw3ICsxMjEsMTMgQEAKIAlyZXR1cm4gZXJyOwogfQogCi0KKy8qKgorICogcGh5X2NvbmZpZ19pbnRlcnJ1cHQgLSBjb25maWd1cmUgdGhlIFBIWSBkZXZpY2UgZm9yIHRoZSByZXF1ZXN0ZWQgaW50ZXJydXB0cworICogQHBoeWRldjogdGhlIHBoeV9kZXZpY2Ugc3RydWN0CisgKiBAaW50ZXJydXB0czogaW50ZXJydXB0IGZsYWdzIHRvIGNvbmZpZ3VyZSBmb3IgdGhpcyBAcGh5ZGV2CisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb24gPCAwIG9uIGVycm9yLgorICovCiBpbnQgcGh5X2NvbmZpZ19pbnRlcnJ1cHQoc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiwgdTMyIGludGVycnVwdHMpCiB7CiAJaW50IGVyciA9IDA7CkBAIC0xMDksOSArMTQwLDExIEBACiB9CiAKIAotLyogcGh5X2FuZWdfZG9uZQorLyoqCisgKiBwaHlfYW5lZ19kb25lIC0gcmV0dXJuIGF1dG8tbmVnb3RpYXRpb24gc3RhdHVzCisgKiBAcGh5ZGV2OiB0YXJnZXQgcGh5X2RldmljZSBzdHJ1Y3QKICAqCi0gKiBkZXNjcmlwdGlvbjogUmVhZHMgdGhlIHN0YXR1cyByZWdpc3RlciBhbmQgcmV0dXJucyAwIGVpdGhlciBpZgorICogRGVzY3JpcHRpb246IFJlYWRzIHRoZSBzdGF0dXMgcmVnaXN0ZXIgYW5kIHJldHVybnMgMCBlaXRoZXIgaWYKICAqICAgYXV0by1uZWdvdGlhdGlvbiBpcyBpbmNvbXBsZXRlLCBvciBpZiB0aGVyZSB3YXMgYW4gZXJyb3IuCiAgKiAgIFJldHVybnMgQk1TUl9BTkVHQ09NUExFVEUgaWYgYXV0by1uZWdvdGlhdGlvbiBpcyBkb25lLgogICovCkBAIC0xNzMsOSArMjA2LDEyIEBACiAKICNkZWZpbmUgTUFYX05VTV9TRVRUSU5HUyAoc2l6ZW9mKHNldHRpbmdzKS9zaXplb2Yoc3RydWN0IHBoeV9zZXR0aW5nKSkKIAotLyogcGh5X2ZpbmRfc2V0dGluZworLyoqCisgKiBwaHlfZmluZF9zZXR0aW5nIC0gZmluZCBhIFBIWSBzZXR0aW5ncyBhcnJheSBlbnRyeSB0aGF0IG1hdGNoZXMgc3BlZWQgJiBkdXBsZXgKKyAqIEBzcGVlZDogc3BlZWQgdG8gbWF0Y2gKKyAqIEBkdXBsZXg6IGR1cGxleCB0byBtYXRjaAogICoKLSAqIGRlc2NyaXB0aW9uOiBTZWFyY2hlcyB0aGUgc2V0dGluZ3MgYXJyYXkgZm9yIHRoZSBzZXR0aW5nIHdoaWNoCisgKiBEZXNjcmlwdGlvbjogU2VhcmNoZXMgdGhlIHNldHRpbmdzIGFycmF5IGZvciB0aGUgc2V0dGluZyB3aGljaAogICogICBtYXRjaGVzIHRoZSBkZXNpcmVkIHNwZWVkIGFuZCBkdXBsZXgsIGFuZCByZXR1cm5zIHRoZSBpbmRleAogICogICBvZiB0aGF0IHNldHRpbmcuICBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBzZXR0aW5nIGlmCiAgKiAgIG5vbmUgb2YgdGhlIG90aGVycyBtYXRjaC4KQEAgLTE5MiwxMSArMjI4LDEyIEBACiAJcmV0dXJuIGlkeCA8IE1BWF9OVU1fU0VUVElOR1MgPyBpZHggOiBNQVhfTlVNX1NFVFRJTkdTIC0gMTsKIH0KIAotLyogcGh5X2ZpbmRfdmFsaWQKLSAqIGlkeDogVGhlIGZpcnN0IGluZGV4IGluIHNldHRpbmdzW10gdG8gc2VhcmNoCi0gKiBmZWF0dXJlczogQSBtYXNrIG9mIHRoZSB2YWxpZCBzZXR0aW5ncworLyoqCisgKiBwaHlfZmluZF92YWxpZCAtIGZpbmQgYSBQSFkgc2V0dGluZyB0aGF0IG1hdGNoZXMgdGhlIHJlcXVlc3RlZCBmZWF0dXJlcyBtYXNrCisgKiBAaWR4OiBUaGUgZmlyc3QgaW5kZXggaW4gc2V0dGluZ3NbXSB0byBzZWFyY2gKKyAqIEBmZWF0dXJlczogQSBtYXNrIG9mIHRoZSB2YWxpZCBzZXR0aW5ncwogICoKLSAqIGRlc2NyaXB0aW9uOiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgdmFsaWQgc2V0dGluZyBsZXNzCisgKiBEZXNjcmlwdGlvbjogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IHZhbGlkIHNldHRpbmcgbGVzcwogICogICB0aGFuIG9yIGVxdWFsIHRvIHRoZSBvbmUgcG9pbnRlZCB0byBieSBpZHgsIGFzIGRldGVybWluZWQgYnkKICAqICAgdGhlIG1hc2sgaW4gZmVhdHVyZXMuICBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBzZXR0aW5nCiAgKiAgIGlmIG5vdGhpbmcgZWxzZSBtYXRjaGVzLgpAQCAtMjA5LDExICsyNDYsMTMgQEAKIAlyZXR1cm4gaWR4IDwgTUFYX05VTV9TRVRUSU5HUyA/IGlkeCA6IE1BWF9OVU1fU0VUVElOR1MgLSAxOwogfQogCi0vKiBwaHlfc2FuaXRpemVfc2V0dGluZ3MKKy8qKgorICogcGh5X3Nhbml0aXplX3NldHRpbmdzIC0gbWFrZSBzdXJlIHRoZSBQSFkgaXMgc2V0IHRvIHN1cHBvcnRlZCBzcGVlZCBhbmQgZHVwbGV4CisgKiBAcGh5ZGV2OiB0aGUgdGFyZ2V0IHBoeV9kZXZpY2Ugc3RydWN0CiAgKgotICogZGVzY3JpcHRpb246IE1ha2Ugc3VyZSB0aGUgUEhZIGlzIHNldCB0byBzdXBwb3J0ZWQgc3BlZWRzIGFuZAorICogRGVzY3JpcHRpb246IE1ha2Ugc3VyZSB0aGUgUEhZIGlzIHNldCB0byBzdXBwb3J0ZWQgc3BlZWRzIGFuZAogICogICBkdXBsZXhlcy4gIERyb3AgZG93biBieSBvbmUgaW4gdGhpcyBvcmRlcjogIDEwMDAvRlVMTCwKLSAqICAgMTAwMC9IQUxGLCAxMDAvRlVMTCwgMTAwL0hBTEYsIDEwL0ZVTEwsIDEwL0hBTEYKKyAqICAgMTAwMC9IQUxGLCAxMDAvRlVMTCwgMTAwL0hBTEYsIDEwL0ZVTEwsIDEwL0hBTEYuCiAgKi8KIHZvaWQgcGh5X3Nhbml0aXplX3NldHRpbmdzKHN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYpCiB7CkBAIC0yMzIsMTYgKzI3MSwxNyBAQAogfQogRVhQT1JUX1NZTUJPTChwaHlfc2FuaXRpemVfc2V0dGluZ3MpOwogCi0vKiBwaHlfZXRodG9vbF9zc2V0OgotICogQSBnZW5lcmljIGV0aHRvb2wgc3NldCBmdW5jdGlvbi4gIEhhbmRsZXMgYWxsIHRoZSBkZXRhaWxzCisvKioKKyAqIHBoeV9ldGh0b29sX3NzZXQgLSBnZW5lcmljIGV0aHRvb2wgc3NldCBmdW5jdGlvbiwgaGFuZGxlcyBhbGwgdGhlIGRldGFpbHMKKyAqIEBwaHlkZXY6IHRhcmdldCBwaHlfZGV2aWNlIHN0cnVjdAorICogQGNtZDogZXRodG9vbF9jbWQKICAqCiAgKiBBIGZldyBub3RlcyBhYm91dCBwYXJhbWV0ZXIgY2hlY2tpbmc6CiAgKiAtIFdlIGRvbid0IHNldCBwb3J0IG9yIHRyYW5zY2VpdmVyLCBzbyB3ZSBkb24ndCBjYXJlIHdoYXQgdGhleQogICogICB3ZXJlIHNldCB0by4KICAqIC0gcGh5X3N0YXJ0X2FuZWcoKSB3aWxsIG1ha2Ugc3VyZSBmb3JjZWQgc2V0dGluZ3MgYXJlIHNhbmUsIGFuZAogICogICBjaG9vc2UgdGhlIG5leHQgYmVzdCBvbmVzIGZyb20gdGhlIG9uZXMgc2VsZWN0ZWQsIHNvIHdlIGRvbid0Ci0gKiAgIGNhcmUgaWYgZXRodG9vbCB0cmllcyB0byBnaXZlIHVzIGJhZCB2YWx1ZXMKLSAqCisgKiAgIGNhcmUgaWYgZXRodG9vbCB0cmllcyB0byBnaXZlIHVzIGJhZCB2YWx1ZXMuCiAgKi8KIGludCBwaHlfZXRodG9vbF9zc2V0KHN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQogewpAQCAtMzA0LDkgKzM0NCwxNSBAQAogfQogRVhQT1JUX1NZTUJPTChwaHlfZXRodG9vbF9nc2V0KTsKIAotLyogTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gaXMgY3VycmVudGx5IGluY29tcGF0aWJsZSB3aXRoIHRoZQorLyoqCisgKiBwaHlfbWlpX2lvY3RsIC0gZ2VuZXJpYyBQSFkgTUlJIGlvY3RsIGludGVyZmFjZQorICogQHBoeWRldjogdGhlIHBoeV9kZXZpY2Ugc3RydWN0CisgKiBAbWlpX2RhdGE6IE1JSSBpb2N0bCBkYXRhCisgKiBAY21kOiBpb2N0bCBjbWQgdG8gZXhlY3V0ZQorICoKKyAqIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGlzIGN1cnJlbnRseSBpbmNvbXBhdGlibGUgd2l0aCB0aGUKICAqIFBIWUNPTlRST0wgbGF5ZXIuICBJdCBjaGFuZ2VzIHJlZ2lzdGVycyB3aXRob3V0IHJlZ2FyZCB0bwotICogY3VycmVudCBzdGF0ZS4gIFVzZSBhdCBvd24gcmlzaworICogY3VycmVudCBzdGF0ZS4gIFVzZSBhdCBvd24gcmlzay4KICAqLwogaW50IHBoeV9taWlfaW9jdGwoc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiwKIAkJc3RydWN0IG1paV9pb2N0bF9kYXRhICptaWlfZGF0YSwgaW50IGNtZCkKQEAgLTMzNiw2ICszODIsMTIgQEAKIAkJCQkJcGh5ZGV2LT5kdXBsZXggPSBEVVBMRVhfRlVMTDsKIAkJCQllbHNlCiAJCQkJCXBoeWRldi0+ZHVwbGV4ID0gRFVQTEVYX0hBTEY7CisJCQkJaWYgKCghcGh5ZGV2LT5hdXRvbmVnKSAmJgorCQkJCQkJKHZhbCAmIEJNQ1JfU1BFRUQxMDAwKSkKKwkJCQkJcGh5ZGV2LT5zcGVlZCA9IFNQRUVEXzEwMDA7CisJCQkJZWxzZSBpZiAoKCFwaHlkZXYtPmF1dG9uZWcpICYmCisJCQkJCQkodmFsICYgQk1DUl9TUEVFRDEwMCkpCisJCQkJCXBoeWRldi0+c3BlZWQgPSBTUEVFRF8xMDA7CiAJCQkJYnJlYWs7CiAJCQljYXNlIE1JSV9BRFZFUlRJU0U6CiAJCQkJcGh5ZGV2LT5hZHZlcnRpc2luZyA9IHZhbDsKQEAgLTM1OCwxMyArNDEwLDE0IEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qIHBoeV9zdGFydF9hbmVnCisvKioKKyAqIHBoeV9zdGFydF9hbmVnIC0gc3RhcnQgYXV0by1uZWdvdGlhdGlvbiBmb3IgdGhpcyBQSFkgZGV2aWNlCisgKiBAcGh5ZGV2OiB0aGUgcGh5X2RldmljZSBzdHJ1Y3QKICAqCi0gKiBkZXNjcmlwdGlvbjogU2FuaXRpemVzIHRoZSBzZXR0aW5ncyAoaWYgd2UncmUgbm90Ci0gKiAgIGF1dG9uZWdvdGlhdGluZyB0aGVtKSwgYW5kIHRoZW4gY2FsbHMgdGhlIGRyaXZlcidzCi0gKiAgIGNvbmZpZ19hbmVnIGZ1bmN0aW9uLiAgSWYgdGhlIFBIWUNPTlRST0wgTGF5ZXIgaXMgb3BlcmF0aW5nLAotICogICB3ZSBjaGFuZ2UgdGhlIHN0YXRlIHRvIHJlZmxlY3QgdGhlIGJlZ2lubmluZyBvZgotICogICBBdXRvLW5lZ290aWF0aW9uIG9yIGZvcmNpbmcuCisgKiBEZXNjcmlwdGlvbjogU2FuaXRpemVzIHRoZSBzZXR0aW5ncyAoaWYgd2UncmUgbm90IGF1dG9uZWdvdGlhdGluZworICogICB0aGVtKSwgYW5kIHRoZW4gY2FsbHMgdGhlIGRyaXZlcidzIGNvbmZpZ19hbmVnIGZ1bmN0aW9uLgorICogICBJZiB0aGUgUEhZQ09OVFJPTCBMYXllciBpcyBvcGVyYXRpbmcsIHdlIGNoYW5nZSB0aGUgc3RhdGUgdG8KKyAqICAgcmVmbGVjdCB0aGUgYmVnaW5uaW5nIG9mIEF1dG8tbmVnb3RpYXRpb24gb3IgZm9yY2luZy4KICAqLwogaW50IHBoeV9zdGFydF9hbmVnKHN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYpCiB7CkBAIC00MDAsMTUgKzQ1MywxOSBAQAogc3RhdGljIHZvaWQgcGh5X2NoYW5nZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogc3RhdGljIHZvaWQgcGh5X3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSk7CiAKLS8qIHBoeV9zdGFydF9tYWNoaW5lOgorLyoqCisgKiBwaHlfc3RhcnRfbWFjaGluZSAtIHN0YXJ0IFBIWSBzdGF0ZSBtYWNoaW5lIHRyYWNraW5nCisgKiBAcGh5ZGV2OiB0aGUgcGh5X2RldmljZSBzdHJ1Y3QKKyAqIEBoYW5kbGVyOiBjYWxsYmFjayBmdW5jdGlvbiBmb3Igc3RhdGUgY2hhbmdlIG5vdGlmaWNhdGlvbnMKICAqCi0gKiBkZXNjcmlwdGlvbjogVGhlIFBIWSBpbmZyYXN0cnVjdHVyZSBjYW4gcnVuIGEgc3RhdGUgbWFjaGluZQorICogRGVzY3JpcHRpb246IFRoZSBQSFkgaW5mcmFzdHJ1Y3R1cmUgY2FuIHJ1biBhIHN0YXRlIG1hY2hpbmUKICAqICAgd2hpY2ggdHJhY2tzIHdoZXRoZXIgdGhlIFBIWSBpcyBzdGFydGluZyB1cCwgbmVnb3RpYXRpbmcsCiAgKiAgIGV0Yy4gIFRoaXMgZnVuY3Rpb24gc3RhcnRzIHRoZSB0aW1lciB3aGljaCB0cmFja3MgdGhlIHN0YXRlCi0gKiAgIG9mIHRoZSBQSFkuICBJZiB5b3Ugd2FudCB0byBiZSBub3RpZmllZCB3aGVuIHRoZSBzdGF0ZQotICogICBjaGFuZ2VzLCBwYXNzIGluIHRoZSBjYWxsYmFjaywgb3RoZXJ3aXNlLCBwYXNzIE5VTEwuICBJZiB5b3UKKyAqICAgb2YgdGhlIFBIWS4gIElmIHlvdSB3YW50IHRvIGJlIG5vdGlmaWVkIHdoZW4gdGhlIHN0YXRlIGNoYW5nZXMsCisgKiAgIHBhc3MgaW4gdGhlIGNhbGxiYWNrIEBoYW5kbGVyLCBvdGhlcndpc2UsIHBhc3MgTlVMTC4gIElmIHlvdQogICogICB3YW50IHRvIG1haW50YWluIHlvdXIgb3duIHN0YXRlIG1hY2hpbmUsIGRvIG5vdCBjYWxsIHRoaXMKLSAqICAgZnVuY3Rpb24uICovCisgKiAgIGZ1bmN0aW9uLgorICovCiB2b2lkIHBoeV9zdGFydF9tYWNoaW5lKHN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYsCiAJCXZvaWQgKCpoYW5kbGVyKShzdHJ1Y3QgbmV0X2RldmljZSAqKSkKIHsKQEAgLTQyMCw5ICs0NzcsMTEgQEAKIAltb2RfdGltZXIoJnBoeWRldi0+cGh5X3RpbWVyLCBqaWZmaWVzICsgSFopOwogfQogCi0vKiBwaHlfc3RvcF9tYWNoaW5lCisvKioKKyAqIHBoeV9zdG9wX21hY2hpbmUgLSBzdG9wIHRoZSBQSFkgc3RhdGUgbWFjaGluZSB0cmFja2luZworICogQHBoeWRldjogdGFyZ2V0IHBoeV9kZXZpY2Ugc3RydWN0CiAgKgotICogZGVzY3JpcHRpb246IFN0b3BzIHRoZSBzdGF0ZSBtYWNoaW5lIHRpbWVyLCBzZXRzIHRoZSBzdGF0ZSB0byBVUAorICogRGVzY3JpcHRpb246IFN0b3BzIHRoZSBzdGF0ZSBtYWNoaW5lIHRpbWVyLCBzZXRzIHRoZSBzdGF0ZSB0byBVUAogICogICAodW5sZXNzIGl0IHdhc24ndCB1cCB5ZXQpLiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIEJFRk9SRQogICogICBwaHlfZGV0YWNoLgogICovCkBAIC00MzgsMTIgKzQ5NywxNCBAQAogCXBoeWRldi0+YWRqdXN0X3N0YXRlID0gTlVMTDsKIH0KIAotLyogcGh5X2ZvcmNlX3JlZHVjdGlvbgorLyoqCisgKiBwaHlfZm9yY2VfcmVkdWN0aW9uIC0gcmVkdWNlIFBIWSBzcGVlZC9kdXBsZXggc2V0dGluZ3MgYnkgb25lIHN0ZXAKKyAqIEBwaHlkZXY6IHRhcmdldCBwaHlfZGV2aWNlIHN0cnVjdAogICoKLSAqIGRlc2NyaXB0aW9uOiBSZWR1Y2VzIHRoZSBzcGVlZC9kdXBsZXggc2V0dGluZ3MgYnkKLSAqICAgb25lIG5vdGNoLiAgVGhlIG9yZGVyIGlzIHNvOgotICogICAxMDAwL0ZVTEwsIDEwMDAvSEFMRiwgMTAwL0ZVTEwsIDEwMC9IQUxGLAotICogICAxMC9GVUxMLCAxMC9IQUxGLiAgVGhlIGZ1bmN0aW9uIGJvdHRvbXMgb3V0IGF0IDEwL0hBTEYuCisgKiBEZXNjcmlwdGlvbjogUmVkdWNlcyB0aGUgc3BlZWQvZHVwbGV4IHNldHRpbmdzIGJ5IG9uZSBub3RjaCwKKyAqICAgaW4gdGhpcyBvcmRlci0tCisgKiAgIDEwMDAvRlVMTCwgMTAwMC9IQUxGLCAxMDAvRlVMTCwgMTAwL0hBTEYsIDEwL0ZVTEwsIDEwL0hBTEYuCisgKiAgIFRoZSBmdW5jdGlvbiBib3R0b21zIG91dCBhdCAxMC9IQUxGLgogICovCiBzdGF0aWMgdm9pZCBwaHlfZm9yY2VfcmVkdWN0aW9uKHN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYpCiB7CkBAIC00NjQsNyArNTI1LDkgQEAKIH0KIAogCi0vKiBwaHlfZXJyb3I6CisvKioKKyAqIHBoeV9lcnJvciAtIGVudGVyIEhBTFRFRCBzdGF0ZSBmb3IgdGhpcyBQSFkgZGV2aWNlCisgKiBAcGh5ZGV2OiB0YXJnZXQgcGh5X2RldmljZSBzdHJ1Y3QKICAqCiAgKiBNb3ZlcyB0aGUgUEhZIHRvIHRoZSBIQUxURUQgc3RhdGUgaW4gcmVzcG9uc2UgdG8gYSByZWFkCiAgKiBvciB3cml0ZSBlcnJvciwgYW5kIHRlbGxzIHRoZSBjb250cm9sbGVyIHRoZSBsaW5rIGlzIGRvd24uCkBAIC00NzgsOSArNTQxLDEyIEBACiAJc3Bpbl91bmxvY2soJnBoeWRldi0+bG9jayk7CiB9CiAKLS8qIHBoeV9pbnRlcnJ1cHQKKy8qKgorICogcGh5X2ludGVycnVwdCAtIFBIWSBpbnRlcnJ1cHQgaGFuZGxlcgorICogQGlycTogaW50ZXJydXB0IGxpbmUKKyAqIEBwaHlfZGF0OiBwaHlfZGV2aWNlIHBvaW50ZXIKICAqCi0gKiBkZXNjcmlwdGlvbjogV2hlbiBhIFBIWSBpbnRlcnJ1cHQgb2NjdXJzLCB0aGUgaGFuZGxlciBkaXNhYmxlcworICogRGVzY3JpcHRpb246IFdoZW4gYSBQSFkgaW50ZXJydXB0IG9jY3VycywgdGhlIGhhbmRsZXIgZGlzYWJsZXMKICAqIGludGVycnVwdHMsIGFuZCBzY2hlZHVsZXMgYSB3b3JrIHRhc2sgdG8gY2xlYXIgdGhlIGludGVycnVwdC4KICAqLwogc3RhdGljIGlycXJldHVybl90IHBoeV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqcGh5X2RhdCkKQEAgLTUwMSw3ICs1NjcsMTAgQEAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLS8qIEVuYWJsZSB0aGUgaW50ZXJydXB0cyBmcm9tIHRoZSBQSFkgc2lkZSAqLworLyoqCisgKiBwaHlfZW5hYmxlX2ludGVycnVwdHMgLSBFbmFibGUgdGhlIGludGVycnVwdHMgZnJvbSB0aGUgUEhZIHNpZGUKKyAqIEBwaHlkZXY6IHRhcmdldCBwaHlfZGV2aWNlIHN0cnVjdAorICovCiBpbnQgcGh5X2VuYWJsZV9pbnRlcnJ1cHRzKHN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYpCiB7CiAJaW50IGVycjsKQEAgLTUxNyw3ICs1ODYsMTAgQEAKIH0KIEVYUE9SVF9TWU1CT0wocGh5X2VuYWJsZV9pbnRlcnJ1cHRzKTsKIAotLyogRGlzYWJsZSB0aGUgUEhZIGludGVycnVwdHMgZnJvbSB0aGUgUEhZIHNpZGUgKi8KKy8qKgorICogcGh5X2Rpc2FibGVfaW50ZXJydXB0cyAtIERpc2FibGUgdGhlIFBIWSBpbnRlcnJ1cHRzIGZyb20gdGhlIFBIWSBzaWRlCisgKiBAcGh5ZGV2OiB0YXJnZXQgcGh5X2RldmljZSBzdHJ1Y3QKKyAqLwogaW50IHBoeV9kaXNhYmxlX2ludGVycnVwdHMoc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldikKIHsKIAlpbnQgZXJyOwpAQCAtNTQzLDEzICs2MTUsMTUgQEAKIH0KIEVYUE9SVF9TWU1CT0wocGh5X2Rpc2FibGVfaW50ZXJydXB0cyk7CiAKLS8qIHBoeV9zdGFydF9pbnRlcnJ1cHRzCisvKioKKyAqIHBoeV9zdGFydF9pbnRlcnJ1cHRzIC0gcmVxdWVzdCBhbmQgZW5hYmxlIGludGVycnVwdHMgZm9yIGEgUEhZIGRldmljZQorICogQHBoeWRldjogdGFyZ2V0IHBoeV9kZXZpY2Ugc3RydWN0CiAgKgotICogZGVzY3JpcHRpb246IFJlcXVlc3QgdGhlIGludGVycnVwdCBmb3IgdGhlIGdpdmVuIFBIWS4gIElmCi0gKiAgIHRoaXMgZmFpbHMsIHRoZW4gd2Ugc2V0IGlycSB0byBQSFlfUE9MTC4KKyAqIERlc2NyaXB0aW9uOiBSZXF1ZXN0IHRoZSBpbnRlcnJ1cHQgZm9yIHRoZSBnaXZlbiBQSFkuCisgKiAgIElmIHRoaXMgZmFpbHMsIHRoZW4gd2Ugc2V0IGlycSB0byBQSFlfUE9MTC4KICAqICAgT3RoZXJ3aXNlLCB3ZSBlbmFibGUgdGhlIGludGVycnVwdHMgaW4gdGhlIFBIWS4KLSAqICAgUmV0dXJucyAwIG9uIHN1Y2Nlc3MuCiAgKiAgIFRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIHdpdGggYSB2YWxpZCBJUlEgbnVtYmVyLgorICogICBSZXR1cm5zIDAgb24gc3VjY2VzcyBvciA8IDAgb24gZXJyb3IuCiAgKi8KIGludCBwaHlfc3RhcnRfaW50ZXJydXB0cyhzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2KQogewpAQCAtNTc0LDYgKzY0OCwxMCBAQAogfQogRVhQT1JUX1NZTUJPTChwaHlfc3RhcnRfaW50ZXJydXB0cyk7CiAKKy8qKgorICogcGh5X3N0b3BfaW50ZXJydXB0cyAtIGRpc2FibGUgaW50ZXJydXB0cyBmcm9tIGEgUEhZIGRldmljZQorICogQHBoeWRldjogdGFyZ2V0IHBoeV9kZXZpY2Ugc3RydWN0CisgKi8KIGludCBwaHlfc3RvcF9pbnRlcnJ1cHRzKHN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYpCiB7CiAJaW50IGVycjsKQEAgLTU5Niw3ICs2NzQsMTAgQEAKIEVYUE9SVF9TWU1CT0wocGh5X3N0b3BfaW50ZXJydXB0cyk7CiAKIAotLyogU2NoZWR1bGVkIGJ5IHRoZSBwaHlfaW50ZXJydXB0L3RpbWVyIHRvIGhhbmRsZSBQSFkgY2hhbmdlcyAqLworLyoqCisgKiBwaHlfY2hhbmdlIC0gU2NoZWR1bGVkIGJ5IHRoZSBwaHlfaW50ZXJydXB0L3RpbWVyIHRvIGhhbmRsZSBQSFkgY2hhbmdlcworICogQHdvcms6IHdvcmtfc3RydWN0IHRoYXQgZGVzY3JpYmVzIHRoZSB3b3JrIHRvIGJlIGRvbmUKKyAqLwogc3RhdGljIHZvaWQgcGh5X2NoYW5nZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJaW50IGVycjsKQEAgLTYzMCw3ICs3MTEsMTAgQEAKIAlwaHlfZXJyb3IocGh5ZGV2KTsKIH0KIAotLyogQnJpbmcgZG93biB0aGUgUEhZIGxpbmssIGFuZCBzdG9wIGNoZWNraW5nIHRoZSBzdGF0dXMuICovCisvKioKKyAqIHBoeV9zdG9wIC0gQnJpbmcgZG93biB0aGUgUEhZIGxpbmssIGFuZCBzdG9wIGNoZWNraW5nIHRoZSBzdGF0dXMKKyAqIEBwaHlkZXY6IHRhcmdldCBwaHlfZGV2aWNlIHN0cnVjdAorICovCiB2b2lkIHBoeV9zdG9wKHN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYpCiB7CiAJc3Bpbl9sb2NrKCZwaHlkZXYtPmxvY2spOwpAQCAtNjU5LDkgKzc0MywxMSBAQAogfQogCiAKLS8qIHBoeV9zdGFydAorLyoqCisgKiBwaHlfc3RhcnQgLSBzdGFydCBvciByZXN0YXJ0IGEgUEhZIGRldmljZQorICogQHBoeWRldjogdGFyZ2V0IHBoeV9kZXZpY2Ugc3RydWN0CiAgKgotICogZGVzY3JpcHRpb246IEluZGljYXRlcyB0aGUgYXR0YWNoZWQgZGV2aWNlJ3MgcmVhZGluZXNzIHRvCisgKiBEZXNjcmlwdGlvbjogSW5kaWNhdGVzIHRoZSBhdHRhY2hlZCBkZXZpY2UncyByZWFkaW5lc3MgdG8KICAqICAgaGFuZGxlIFBIWS1yZWxhdGVkIHdvcmsuICBVc2VkIGR1cmluZyBzdGFydHVwIHRvIHN0YXJ0IHRoZQogICogICBQSFksIGFuZCBhZnRlciBhIGNhbGwgdG8gcGh5X3N0b3AoKSB0byByZXN1bWUgb3BlcmF0aW9uLgogICogICBBbHNvIHVzZWQgdG8gaW5kaWNhdGUgdGhlIE1ESU8gYnVzIGhhcyBjbGVhcmVkIGFuIGVycm9yCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9waHkvcGh5X2RldmljZS5jIGIvZHJpdmVycy9uZXQvcGh5L3BoeV9kZXZpY2UuYwppbmRleCA3ZDViNmQxLi5hOGI3NGNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9waHkvcGh5X2RldmljZS5jCisrKyBiL2RyaXZlcnMvbmV0L3BoeS9waHlfZGV2aWNlLmMKQEAgLTc0LDExICs3NCwxMyBAQAogfQogRVhQT1JUX1NZTUJPTChwaHlfZGV2aWNlX2NyZWF0ZSk7CiAKLS8qIGdldF9waHlfZGV2aWNlCisvKioKKyAqIGdldF9waHlfZGV2aWNlIC0gcmVhZHMgdGhlIHNwZWNpZmllZCBQSFkgZGV2aWNlIGFuZCByZXR1cm5zIGl0cyBAcGh5X2RldmljZSBzdHJ1Y3QKKyAqIEBidXM6IHRoZSB0YXJnZXQgTUlJIGJ1cworICogQGFkZHI6IFBIWSBhZGRyZXNzIG9uIHRoZSBNSUkgYnVzCiAgKgotICogZGVzY3JpcHRpb246IFJlYWRzIHRoZSBJRCByZWdpc3RlcnMgb2YgdGhlIFBIWSBhdCBhZGRyIG9uIHRoZQotICogICBidXMsIHRoZW4gYWxsb2NhdGVzIGFuZCByZXR1cm5zIHRoZSBwaHlfZGV2aWNlIHRvCi0gKiAgIHJlcHJlc2VudCBpdC4KKyAqIERlc2NyaXB0aW9uOiBSZWFkcyB0aGUgSUQgcmVnaXN0ZXJzIG9mIHRoZSBQSFkgYXQgQGFkZHIgb24gdGhlCisgKiAgIEBidXMsIHRoZW4gYWxsb2NhdGVzIGFuZCByZXR1cm5zIHRoZSBwaHlfZGV2aWNlIHRvIHJlcHJlc2VudCBpdC4KICAqLwogc3RydWN0IHBoeV9kZXZpY2UgKiBnZXRfcGh5X2RldmljZShzdHJ1Y3QgbWlpX2J1cyAqYnVzLCBpbnQgYWRkcikKIHsKQEAgLTExMiwyMyArMTE0LDMzIEBACiAJcmV0dXJuIGRldjsKIH0KIAotLyogcGh5X3ByZXBhcmVfbGluazoKKy8qKgorICogcGh5X3ByZXBhcmVfbGluayAtIHByZXBhcmVzIHRoZSBQSFkgbGF5ZXIgdG8gbW9uaXRvciBsaW5rIHN0YXR1cworICogQHBoeWRldjogdGFyZ2V0IHBoeV9kZXZpY2Ugc3RydWN0CisgKiBAaGFuZGxlcjogY2FsbGJhY2sgZnVuY3Rpb24gZm9yIGxpbmsgc3RhdHVzIGNoYW5nZSBub3RpZmljYXRpb25zCiAgKgotICogZGVzY3JpcHRpb246IFRlbGxzIHRoZSBQSFkgaW5mcmFzdHJ1Y3R1cmUgdG8gaGFuZGxlIHRoZQorICogRGVzY3JpcHRpb246IFRlbGxzIHRoZSBQSFkgaW5mcmFzdHJ1Y3R1cmUgdG8gaGFuZGxlIHRoZQogICogICBnb3J5IGRldGFpbHMgb24gbW9uaXRvcmluZyBsaW5rIHN0YXR1cyAod2hldGhlciB0aHJvdWdoCiAgKiAgIHBvbGxpbmcgb3IgYW4gaW50ZXJydXB0KSwgYW5kIHRvIGNhbGwgYmFjayB0byB0aGUKICAqICAgY29ubmVjdGVkIGRldmljZSBkcml2ZXIgd2hlbiB0aGUgbGluayBzdGF0dXMgY2hhbmdlcy4KICAqICAgSWYgeW91IHdhbnQgdG8gbW9uaXRvciB5b3VyIG93biBsaW5rIHN0YXRlLCBkb24ndCBjYWxsCi0gKiAgIHRoaXMgZnVuY3Rpb24gKi8KKyAqICAgdGhpcyBmdW5jdGlvbi4KKyAqLwogdm9pZCBwaHlfcHJlcGFyZV9saW5rKHN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYsCiAJCXZvaWQgKCpoYW5kbGVyKShzdHJ1Y3QgbmV0X2RldmljZSAqKSkKIHsKIAlwaHlkZXYtPmFkanVzdF9saW5rID0gaGFuZGxlcjsKIH0KIAotLyogcGh5X2Nvbm5lY3Q6CisvKioKKyAqIHBoeV9jb25uZWN0IC0gY29ubmVjdCBhbiBldGhlcm5ldCBkZXZpY2UgdG8gYSBQSFkgZGV2aWNlCisgKiBAZGV2OiB0aGUgbmV0d29yayBkZXZpY2UgdG8gY29ubmVjdAorICogQHBoeV9pZDogdGhlIFBIWSBkZXZpY2UgdG8gY29ubmVjdAorICogQGhhbmRsZXI6IGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBzdGF0ZSBjaGFuZ2Ugbm90aWZpY2F0aW9ucworICogQGZsYWdzOiBQSFkgZGV2aWNlJ3MgZGV2X2ZsYWdzCisgKiBAaW50ZXJmYWNlOiBQSFkgZGV2aWNlJ3MgaW50ZXJmYWNlCiAgKgotICogZGVzY3JpcHRpb246IENvbnZlbmllbmNlIGZ1bmN0aW9uIGZvciBjb25uZWN0aW5nIGV0aGVybmV0CisgKiBEZXNjcmlwdGlvbjogQ29udmVuaWVuY2UgZnVuY3Rpb24gZm9yIGNvbm5lY3RpbmcgZXRoZXJuZXQKICAqICAgZGV2aWNlcyB0byBQSFkgZGV2aWNlcy4gIFRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIGZvcgogICogICB0aGUgUEhZIGluZnJhc3RydWN0dXJlIHRvIGhhbmRsZSBldmVyeXRoaW5nLCBhbmQgb25seSBub3RpZnkKICAqICAgdGhlIGNvbm5lY3RlZCBkcml2ZXIgd2hlbiB0aGUgbGluayBzdGF0dXMgY2hhbmdlcy4gIElmIHlvdQpAQCAtMTU4LDYgKzE3MCwxMCBAQAogfQogRVhQT1JUX1NZTUJPTChwaHlfY29ubmVjdCk7CiAKKy8qKgorICogcGh5X2Rpc2Nvbm5lY3QgLSBkaXNhYmxlIGludGVycnVwdHMsIHN0b3Agc3RhdGUgbWFjaGluZSwgYW5kIGRldGFjaCBhIFBIWSBkZXZpY2UKKyAqIEBwaHlkZXY6IHRhcmdldCBwaHlfZGV2aWNlIHN0cnVjdAorICovCiB2b2lkIHBoeV9kaXNjb25uZWN0KHN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYpCiB7CiAJaWYgKHBoeWRldi0+aXJxID4gMCkKQEAgLTE3MSwyMSArMTg3LDI1IEBACiB9CiBFWFBPUlRfU1lNQk9MKHBoeV9kaXNjb25uZWN0KTsKIAotLyogcGh5X2F0dGFjaDoKLSAqCi0gKiAgIGRlc2NyaXB0aW9uOiBDYWxsZWQgYnkgZHJpdmVycyB0byBhdHRhY2ggdG8gYSBwYXJ0aWN1bGFyIFBIWQotICogICAgIGRldmljZS4gVGhlIHBoeV9kZXZpY2UgaXMgZm91bmQsIGFuZCBwcm9wZXJseSBob29rZWQgdXAKLSAqICAgICB0byB0aGUgcGh5X2RyaXZlci4gIElmIG5vIGRyaXZlciBpcyBhdHRhY2hlZCwgdGhlbiB0aGUKLSAqICAgICBnZW5waHlfZHJpdmVyIGlzIHVzZWQuICBUaGUgcGh5X2RldmljZSBpcyBnaXZlbiBhIHB0ciB0bwotICogICAgIHRoZSBhdHRhY2hpbmcgZGV2aWNlLCBhbmQgZ2l2ZW4gYSBjYWxsYmFjayBmb3IgbGluayBzdGF0dXMKLSAqICAgICBjaGFuZ2UuICBUaGUgcGh5X2RldmljZSBpcyByZXR1cm5lZCB0byB0aGUgYXR0YWNoaW5nCi0gKiAgICAgZHJpdmVyLgotICovCiBzdGF0aWMgaW50IHBoeV9jb21wYXJlX2lkKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKIHsKIAlyZXR1cm4gc3RyY21wKChjaGFyICopZGF0YSwgZGV2LT5idXNfaWQpID8gMCA6IDE7CiB9CiAKKy8qKgorICogcGh5X2F0dGFjaCAtIGF0dGFjaCBhIG5ldHdvcmsgZGV2aWNlIHRvIGEgcGFydGljdWxhciBQSFkgZGV2aWNlCisgKiBAZGV2OiBuZXR3b3JrIGRldmljZSB0byBhdHRhY2gKKyAqIEBwaHlfaWQ6IFBIWSBkZXZpY2UgdG8gYXR0YWNoCisgKiBAZmxhZ3M6IFBIWSBkZXZpY2UncyBkZXZfZmxhZ3MKKyAqIEBpbnRlcmZhY2U6IFBIWSBkZXZpY2UncyBpbnRlcmZhY2UKKyAqCisgKiBEZXNjcmlwdGlvbjogQ2FsbGVkIGJ5IGRyaXZlcnMgdG8gYXR0YWNoIHRvIGEgcGFydGljdWxhciBQSFkKKyAqICAgICBkZXZpY2UuIFRoZSBwaHlfZGV2aWNlIGlzIGZvdW5kLCBhbmQgcHJvcGVybHkgaG9va2VkIHVwCisgKiAgICAgdG8gdGhlIHBoeV9kcml2ZXIuICBJZiBubyBkcml2ZXIgaXMgYXR0YWNoZWQsIHRoZW4gdGhlCisgKiAgICAgZ2VucGh5X2RyaXZlciBpcyB1c2VkLiAgVGhlIHBoeV9kZXZpY2UgaXMgZ2l2ZW4gYSBwdHIgdG8KKyAqICAgICB0aGUgYXR0YWNoaW5nIGRldmljZSwgYW5kIGdpdmVuIGEgY2FsbGJhY2sgZm9yIGxpbmsgc3RhdHVzCisgKiAgICAgY2hhbmdlLiAgVGhlIHBoeV9kZXZpY2UgaXMgcmV0dXJuZWQgdG8gdGhlIGF0dGFjaGluZyBkcml2ZXIuCisgKi8KIHN0cnVjdCBwaHlfZGV2aWNlICpwaHlfYXR0YWNoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCWNvbnN0IGNoYXIgKnBoeV9pZCwgdTMyIGZsYWdzLCBwaHlfaW50ZXJmYWNlX3QgaW50ZXJmYWNlKQogewpAQCAtMjA4LDE2ICsyMjgsMTIgQEAKIAkgKiBleGlzdCwgYW5kIHdlIHNob3VsZCB1c2UgdGhlIGdlbnBoeSBkcml2ZXIuICovCiAJaWYgKE5VTEwgPT0gZC0+ZHJpdmVyKSB7CiAJCWludCBlcnI7Ci0JCWRvd25fd3JpdGUoJmQtPmJ1cy0+c3Vic3lzLnJ3c2VtKTsKIAkJZC0+ZHJpdmVyID0gJmdlbnBoeV9kcml2ZXIuZHJpdmVyOwogCiAJCWVyciA9IGQtPmRyaXZlci0+cHJvYmUoZCk7Ci0KIAkJaWYgKGVyciA+PSAwKQogCQkJZXJyID0gZGV2aWNlX2JpbmRfZHJpdmVyKGQpOwogCi0JCXVwX3dyaXRlKCZkLT5idXMtPnN1YnN5cy5yd3NlbSk7Ci0KIAkJaWYgKGVycikKIAkJCXJldHVybiBFUlJfUFRSKGVycik7CiAJfQpAQCAtMjUwLDYgKzI2NiwxMCBAQAogfQogRVhQT1JUX1NZTUJPTChwaHlfYXR0YWNoKTsKIAorLyoqCisgKiBwaHlfZGV0YWNoIC0gZGV0YWNoIGEgUEhZIGRldmljZSBmcm9tIGl0cyBuZXR3b3JrIGRldmljZQorICogQHBoeWRldjogdGFyZ2V0IHBoeV9kZXZpY2Ugc3RydWN0CisgKi8KIHZvaWQgcGh5X2RldGFjaChzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2KQogewogCXBoeWRldi0+YXR0YWNoZWRfZGV2ID0gTlVMTDsKQEAgLTI1OCwyMiArMjc4LDIxIEBACiAJICogd2FzIHVzaW5nIHRoZSBnZW5lcmljIGRyaXZlciksIHdlIHVuYmluZCB0aGUgZGV2aWNlCiAJICogZnJvbSB0aGUgZ2VuZXJpYyBkcml2ZXIgc28gdGhhdCB0aGVyZSdzIGEgY2hhbmNlIGEKIAkgKiByZWFsIGRyaXZlciBjb3VsZCBiZSBsb2FkZWQgKi8KLQlpZiAocGh5ZGV2LT5kZXYuZHJpdmVyID09ICZnZW5waHlfZHJpdmVyLmRyaXZlcikgewotCQlkb3duX3dyaXRlKCZwaHlkZXYtPmRldi5idXMtPnN1YnN5cy5yd3NlbSk7CisJaWYgKHBoeWRldi0+ZGV2LmRyaXZlciA9PSAmZ2VucGh5X2RyaXZlci5kcml2ZXIpCiAJCWRldmljZV9yZWxlYXNlX2RyaXZlcigmcGh5ZGV2LT5kZXYpOwotCQl1cF93cml0ZSgmcGh5ZGV2LT5kZXYuYnVzLT5zdWJzeXMucndzZW0pOwotCX0KIH0KIEVYUE9SVF9TWU1CT0wocGh5X2RldGFjaCk7CiAKIAogLyogR2VuZXJpYyBQSFkgc3VwcG9ydCBhbmQgaGVscGVyIGZ1bmN0aW9ucyAqLwogCi0vKiBnZW5waHlfY29uZmlnX2FkdmVydAorLyoqCisgKiBnZW5waHlfY29uZmlnX2FkdmVydCAtIHNhbml0aXplIGFuZCBhZHZlcnRpc2UgYXV0by1uZWdvdGF0aW9uIHBhcmFtZXRlcnMKKyAqIEBwaHlkZXY6IHRhcmdldCBwaHlfZGV2aWNlIHN0cnVjdAogICoKLSAqIGRlc2NyaXB0aW9uOiBXcml0ZXMgTUlJX0FEVkVSVElTRSB3aXRoIHRoZSBhcHByb3ByaWF0ZSB2YWx1ZXMsCisgKiBEZXNjcmlwdGlvbjogV3JpdGVzIE1JSV9BRFZFUlRJU0Ugd2l0aCB0aGUgYXBwcm9wcmlhdGUgdmFsdWVzLAogICogICBhZnRlciBzYW5pdGl6aW5nIHRoZSB2YWx1ZXMgdG8gbWFrZSBzdXJlIHdlIG9ubHkgYWR2ZXJ0aXNlCi0gKiAgIHdoYXQgaXMgc3VwcG9ydGVkCisgKiAgIHdoYXQgaXMgc3VwcG9ydGVkLgogICovCiBpbnQgZ2VucGh5X2NvbmZpZ19hZHZlcnQoc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldikKIHsKQEAgLTMzNSwxMSArMzU0LDE0IEBACiB9CiBFWFBPUlRfU1lNQk9MKGdlbnBoeV9jb25maWdfYWR2ZXJ0KTsKIAotLyogZ2VucGh5X3NldHVwX2ZvcmNlZAorLyoqCisgKiBnZW5waHlfc2V0dXBfZm9yY2VkIC0gY29uZmlndXJlcy9mb3JjZXMgc3BlZWQvZHVwbGV4IGZyb20gQHBoeWRldgorICogQHBoeWRldjogdGFyZ2V0IHBoeV9kZXZpY2Ugc3RydWN0CiAgKgotICogZGVzY3JpcHRpb246IENvbmZpZ3VyZXMgTUlJX0JNQ1IgdG8gZm9yY2Ugc3BlZWQvZHVwbGV4CisgKiBEZXNjcmlwdGlvbjogQ29uZmlndXJlcyBNSUlfQk1DUiB0byBmb3JjZSBzcGVlZC9kdXBsZXgKICAqICAgdG8gdGhlIHZhbHVlcyBpbiBwaHlkZXYuIEFzc3VtZXMgdGhhdCB0aGUgdmFsdWVzIGFyZSB2YWxpZC4KLSAqICAgUGxlYXNlIHNlZSBwaHlfc2FuaXRpemVfc2V0dGluZ3MoKSAqLworICogICBQbGVhc2Ugc2VlIHBoeV9zYW5pdGl6ZV9zZXR0aW5ncygpLgorICovCiBpbnQgZ2VucGh5X3NldHVwX2ZvcmNlZChzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2KQogewogCWludCBjdGwgPSBCTUNSX1JFU0VUOwpAQCAtMzY4LDcgKzM5MCwxMCBAQAogfQogCiAKLS8qIEVuYWJsZSBhbmQgUmVzdGFydCBBdXRvbmVnb3RpYXRpb24gKi8KKy8qKgorICogZ2VucGh5X3Jlc3RhcnRfYW5lZyAtIEVuYWJsZSBhbmQgUmVzdGFydCBBdXRvbmVnb3RpYXRpb24KKyAqIEBwaHlkZXY6IHRhcmdldCBwaHlfZGV2aWNlIHN0cnVjdAorICovCiBpbnQgZ2VucGh5X3Jlc3RhcnRfYW5lZyhzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2KQogewogCWludCBjdGw7CkBAIC0zODksMTEgKzQxNCwxMyBAQAogfQogCiAKLS8qIGdlbnBoeV9jb25maWdfYW5lZworLyoqCisgKiBnZW5waHlfY29uZmlnX2FuZWcgLSByZXN0YXJ0IGF1dG8tbmVnb3RpYXRpb24gb3Igd3JpdGUgQk1DUgorICogQHBoeWRldjogdGFyZ2V0IHBoeV9kZXZpY2Ugc3RydWN0CiAgKgotICogZGVzY3JpcHRpb246IElmIGF1dG8tbmVnb3RpYXRpb24gaXMgZW5hYmxlZCwgd2UgY29uZmlndXJlIHRoZQorICogRGVzY3JpcHRpb246IElmIGF1dG8tbmVnb3RpYXRpb24gaXMgZW5hYmxlZCwgd2UgY29uZmlndXJlIHRoZQogICogICBhZHZlcnRpc2luZywgYW5kIHRoZW4gcmVzdGFydCBhdXRvLW5lZ290aWF0aW9uLiAgSWYgaXQgaXMgbm90Ci0gKiAgIGVuYWJsZWQsIHRoZW4gd2Ugd3JpdGUgdGhlIEJNQ1IKKyAqICAgZW5hYmxlZCwgdGhlbiB3ZSB3cml0ZSB0aGUgQk1DUi4KICAqLwogaW50IGdlbnBoeV9jb25maWdfYW5lZyhzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2KQogewpAQCAtNDEzLDExICs0NDAsMTMgQEAKIH0KIEVYUE9SVF9TWU1CT0woZ2VucGh5X2NvbmZpZ19hbmVnKTsKIAotLyogZ2VucGh5X3VwZGF0ZV9saW5rCisvKioKKyAqIGdlbnBoeV91cGRhdGVfbGluayAtIHVwZGF0ZSBsaW5rIHN0YXR1cyBpbiBAcGh5ZGV2CisgKiBAcGh5ZGV2OiB0YXJnZXQgcGh5X2RldmljZSBzdHJ1Y3QKICAqCi0gKiBkZXNjcmlwdGlvbjogVXBkYXRlIHRoZSB2YWx1ZSBpbiBwaHlkZXYtPmxpbmsgdG8gcmVmbGVjdCB0aGUKKyAqIERlc2NyaXB0aW9uOiBVcGRhdGUgdGhlIHZhbHVlIGluIHBoeWRldi0+bGluayB0byByZWZsZWN0IHRoZQogICogICBjdXJyZW50IGxpbmsgdmFsdWUuICBJbiBvcmRlciB0byBkbyB0aGlzLCB3ZSBuZWVkIHRvIHJlYWQKLSAqICAgdGhlIHN0YXR1cyByZWdpc3RlciB0d2ljZSwga2VlcGluZyB0aGUgc2Vjb25kIHZhbHVlCisgKiAgIHRoZSBzdGF0dXMgcmVnaXN0ZXIgdHdpY2UsIGtlZXBpbmcgdGhlIHNlY29uZCB2YWx1ZS4KICAqLwogaW50IGdlbnBoeV91cGRhdGVfbGluayhzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2KQogewpAQCAtNDQ0LDkgKzQ3MywxMSBAQAogfQogRVhQT1JUX1NZTUJPTChnZW5waHlfdXBkYXRlX2xpbmspOwogCi0vKiBnZW5waHlfcmVhZF9zdGF0dXMKKy8qKgorICogZ2VucGh5X3JlYWRfc3RhdHVzIC0gY2hlY2sgdGhlIGxpbmsgc3RhdHVzIGFuZCB1cGRhdGUgY3VycmVudCBsaW5rIHN0YXRlCisgKiBAcGh5ZGV2OiB0YXJnZXQgcGh5X2RldmljZSBzdHJ1Y3QKICAqCi0gKiBkZXNjcmlwdGlvbjogQ2hlY2sgdGhlIGxpbmssIHRoZW4gZmlndXJlIG91dCB0aGUgY3VycmVudCBzdGF0ZQorICogRGVzY3JpcHRpb246IENoZWNrIHRoZSBsaW5rLCB0aGVuIGZpZ3VyZSBvdXQgdGhlIGN1cnJlbnQgc3RhdGUKICAqICAgYnkgY29tcGFyaW5nIHdoYXQgd2UgYWR2ZXJ0aXNlIHdpdGggd2hhdCB0aGUgbGluayBwYXJ0bmVyCiAgKiAgIGFkdmVydGlzZXMuICBTdGFydCBieSBjaGVja2luZyB0aGUgZ2lnYWJpdCBwb3NzaWJpbGl0aWVzLAogICogICB0aGVuIG1vdmUgb24gdG8gMTAvMTAwLgpAQCAtNTg2LDkgKzYxNywxMSBAQAogfQogCiAKLS8qIHBoeV9wcm9iZQorLyoqCisgKiBwaHlfcHJvYmUgLSBwcm9iZSBhbmQgaW5pdCBhIFBIWSBkZXZpY2UKKyAqIEBkZXY6IGRldmljZSB0byBwcm9iZSBhbmQgaW5pdAogICoKLSAqIGRlc2NyaXB0aW9uOiBUYWtlIGNhcmUgb2Ygc2V0dGluZyB1cCB0aGUgcGh5X2RldmljZSBzdHJ1Y3R1cmUsCisgKiBEZXNjcmlwdGlvbjogVGFrZSBjYXJlIG9mIHNldHRpbmcgdXAgdGhlIHBoeV9kZXZpY2Ugc3RydWN0dXJlLAogICogICBzZXQgdGhlIHN0YXRlIHRvIFJFQURZICh0aGUgZHJpdmVyJ3MgaW5pdCBmdW5jdGlvbiBzaG91bGQKICAqICAgc2V0IGl0IHRvIFNUQVJUSU5HIGlmIG5lZWRlZCkuCiAgKi8KQEAgLTY1MCw2ICs2ODMsMTAgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyoqCisgKiBwaHlfZHJpdmVyX3JlZ2lzdGVyIC0gcmVnaXN0ZXIgYSBwaHlfZHJpdmVyIHdpdGggdGhlIFBIWSBsYXllcgorICogQG5ld19kcml2ZXI6IG5ldyBwaHlfZHJpdmVyIHRvIHJlZ2lzdGVyCisgKi8KIGludCBwaHlfZHJpdmVyX3JlZ2lzdGVyKHN0cnVjdCBwaHlfZHJpdmVyICpuZXdfZHJpdmVyKQogewogCWludCByZXR2YWw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wbGlwLmMgYi9kcml2ZXJzL25ldC9wbGlwLmMKaW5kZXggNmJiMDg1Zi4uODc1NGNmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGxpcC5jCisrKyBiL2RyaXZlcnMvbmV0L3BsaXAuYwpAQCAtNTQ2LDcgKzU0Niw3IEBACiAJc3RydWN0IGV0aGhkciAqZXRoOwogCXVuc2lnbmVkIGNoYXIgKnJhd3A7CiAKLQlza2ItPm1hYy5yYXc9c2tiLT5kYXRhOworCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CiAJc2tiX3B1bGwoc2tiLGRldi0+aGFyZF9oZWFkZXJfbGVuKTsKIAlldGggPSBldGhfaGRyKHNrYik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BwcF9nZW5lcmljLmMgYi9kcml2ZXJzL25ldC9wcHBfZ2VuZXJpYy5jCmluZGV4IGVmNThlNDEuLjZkNTk2Y2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BwcF9nZW5lcmljLmMKKysrIGIvZHJpdmVycy9uZXQvcHBwX2dlbmVyaWMuYwpAQCAtODgsOCArODgsNiBAQAogI2RlZmluZSBQRl9UT19QUFAocGYpCQlQRl9UT19YKHBmLCBzdHJ1Y3QgcHBwKQogI2RlZmluZSBQRl9UT19DSEFOTkVMKHBmKQlQRl9UT19YKHBmLCBzdHJ1Y3QgY2hhbm5lbCkKIAotI2RlZmluZSBST1VORFVQKG4sIHgpCQkoKChuKSArICh4KSAtIDEpIC8gKHgpKQotCiAvKgogICogRGF0YSBzdHJ1Y3R1cmUgZGVzY3JpYmluZyBvbmUgcHBwIHVuaXQuCiAgKiBBIHBwcCB1bml0IGNvcnJlc3BvbmRzIHRvIGEgcHBwIG5ldHdvcmsgaW50ZXJmYWNlIGRldmljZQpAQCAtMTI5Nyw3ICsxMjk1LDcgQEAKIAkgKi8KIAlmcmFnc2l6ZSA9IGxlbjsKIAlpZiAobmZyZWUgPiAxKQotCQlmcmFnc2l6ZSA9IFJPVU5EVVAoZnJhZ3NpemUsIG5mcmVlKTsKKwkJZnJhZ3NpemUgPSBESVZfUk9VTkRfVVAoZnJhZ3NpemUsIG5mcmVlKTsKIAkvKiBuYmlnZ2VyIGNoYW5uZWxzIGdldCBmcmFnc2l6ZSBieXRlcywgdGhlIHJlc3QgZ2V0IGZyYWdzaXplLTEsCiAJICAgZXhjZXB0IGlmIG5iaWdnZXI9PTAsIHRoZW4gdGhleSBhbGwgZ2V0IGZyYWdzaXplLiAqLwogCW5iaWdnZXIgPSBsZW4gJSBuZnJlZTsKQEAgLTE2ODUsNyArMTY4Myw3IEBACiAJCQlza2JfcHVsbF9yY3N1bShza2IsIDIpOwogCQkJc2tiLT5kZXYgPSBwcHAtPmRldjsKIAkJCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhucGluZGV4X3RvX2V0aGVydHlwZVtucGldKTsKLQkJCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKwkJCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CiAJCQluZXRpZl9yeChza2IpOwogCQkJcHBwLT5kZXYtPmxhc3RfcnggPSBqaWZmaWVzOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wcHBfc3luY3R0eS5jIGIvZHJpdmVycy9uZXQvcHBwX3N5bmN0dHkuYwppbmRleCBiNmYwZTlhLi41OTE4ZmFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9wcHBfc3luY3R0eS5jCisrKyBiL2RyaXZlcnMvbmV0L3BwcF9zeW5jdHR5LmMKQEAgLTU5NCw3ICs1OTQsOCBAQAogCQkJCXJldHVybiBOVUxMOwogCQkJfQogCQkJc2tiX3Jlc2VydmUobnBrdCwyKTsKLQkJCW1lbWNweShza2JfcHV0KG5wa3Qsc2tiLT5sZW4pLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwkJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLAorCQkJCSAgICAgIHNrYl9wdXQobnBrdCwgc2tiLT5sZW4pLCBza2ItPmxlbik7CiAJCQlrZnJlZV9za2Ioc2tiKTsKIAkJCXNrYiA9IG5wa3Q7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BwcG9lLmMgYi9kcml2ZXJzL25ldC9wcHBvZS5jCmluZGV4IGViZmEyOTYuLjZmOTg4MzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BwcG9lLmMKKysrIGIvZHJpdmVycy9uZXQvcHBwb2UuYwpAQCAtMjA3LDcgKzIwNyw3IEBACiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHBwcG94X3NvY2sgKmdldF9pdGVtX2J5X2FkZHIoc3RydWN0IHNvY2thZGRyX3BwcG94ICpzcCkKIHsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gTlVMTDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwogCWludCBpZmluZGV4OwogCiAJZGV2ID0gZGV2X2dldF9ieV9uYW1lKHNwLT5zYV9hZGRyLnBwcG9lLmRldik7CkBAIC0yMTgsMjAgKzIxOCw2IEBACiAJcmV0dXJuIGdldF9pdGVtKHNwLT5zYV9hZGRyLnBwcG9lLnNpZCwgc3AtPnNhX2FkZHIucHBwb2UucmVtb3RlLCBpZmluZGV4KTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgc2V0X2l0ZW0oc3RydWN0IHBwcG94X3NvY2sgKnBvKQotewotCWludCBpOwotCi0JaWYgKCFwbykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQl3cml0ZV9sb2NrX2JoKCZwcHBvZV9oYXNoX2xvY2spOwotCWkgPSBfX3NldF9pdGVtKHBvKTsKLQl3cml0ZV91bmxvY2tfYmgoJnBwcG9lX2hhc2hfbG9jayk7Ci0KLQlyZXR1cm4gaTsKLX0KLQogc3RhdGljIGlubGluZSBzdHJ1Y3QgcHBwb3hfc29jayAqZGVsZXRlX2l0ZW0odW5zaWduZWQgbG9uZyBzaWQsIGNoYXIgKmFkZHIsIGludCBpZmluZGV4KQogewogCXN0cnVjdCBwcHBveF9zb2NrICpyZXQ7CkBAIC0yNTUsNTQgKzI0MSw1MyBAQAogc3RhdGljIHZvaWQgcHBwb2VfZmx1c2hfZGV2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJaW50IGhhc2g7Ci0KIAlCVUdfT04oZGV2ID09IE5VTEwpOwogCi0JcmVhZF9sb2NrX2JoKCZwcHBvZV9oYXNoX2xvY2spOworCXdyaXRlX2xvY2tfYmgoJnBwcG9lX2hhc2hfbG9jayk7CiAJZm9yIChoYXNoID0gMDsgaGFzaCA8IFBQUE9FX0hBU0hfU0laRTsgaGFzaCsrKSB7CiAJCXN0cnVjdCBwcHBveF9zb2NrICpwbyA9IGl0ZW1faGFzaF90YWJsZVtoYXNoXTsKIAogCQl3aGlsZSAocG8gIT0gTlVMTCkgewotCQkJaWYgKHBvLT5wcHBvZV9kZXYgPT0gZGV2KSB7Ci0JCQkJc3RydWN0IHNvY2sgKnNrID0gc2tfcHBwb3gocG8pOwotCi0JCQkJc29ja19ob2xkKHNrKTsKLQkJCQlwby0+cHBwb2VfZGV2ID0gTlVMTDsKLQotCQkJCS8qIFdlIGhvbGQgYSByZWZlcmVuY2UgdG8gU0ssIG5vdyBkcm9wIHRoZQotCQkJCSAqIGhhc2ggdGFibGUgbG9jayBzbyB0aGF0IHdlIG1heSBhdHRlbXB0Ci0JCQkJICogdG8gbG9jayB0aGUgc29ja2V0ICh3aGljaCBjYW4gc2xlZXApLgotCQkJCSAqLwotCQkJCXJlYWRfdW5sb2NrX2JoKCZwcHBvZV9oYXNoX2xvY2spOwotCi0JCQkJbG9ja19zb2NrKHNrKTsKLQotCQkJCWlmIChzay0+c2tfc3RhdGUgJgotCQkJCSAgICAoUFBQT1hfQ09OTkVDVEVEIHwgUFBQT1hfQk9VTkQpKSB7Ci0JCQkJCXBwcG94X3VuYmluZF9zb2NrKHNrKTsKLQkJCQkJZGV2X3B1dChkZXYpOwotCQkJCQlzay0+c2tfc3RhdGUgPSBQUFBPWF9aT01CSUU7Ci0JCQkJCXNrLT5za19zdGF0ZV9jaGFuZ2Uoc2spOwotCQkJCX0KLQotCQkJCXJlbGVhc2Vfc29jayhzayk7Ci0KLQkJCQlzb2NrX3B1dChzayk7Ci0KLQkJCQlyZWFkX2xvY2tfYmgoJnBwcG9lX2hhc2hfbG9jayk7Ci0KLQkJCQkvKiBOb3cgcmVzdGFydCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhpcwotCQkJCSAqIGhhc2ggY2hhaW4uICBXZSBhbHdheXMgTlVMTCBvdXQgcHBwb2VfZGV2Ci0JCQkJICogc28gd2UgYXJlIGd1YXJhbnRlZWQgdG8gbWFrZSBmb3J3YXJkCi0JCQkJICogcHJvZ3Jlc3MuCi0JCQkJICovCi0JCQkJcG8gPSBpdGVtX2hhc2hfdGFibGVbaGFzaF07CisJCQlzdHJ1Y3Qgc29jayAqc2sgPSBza19wcHBveChwbyk7CisJCQlpZiAocG8tPnBwcG9lX2RldiAhPSBkZXYpIHsKKwkJCQlwbyA9IHBvLT5uZXh0OwogCQkJCWNvbnRpbnVlOwogCQkJfQotCQkJcG8gPSBwby0+bmV4dDsKKwkJCXBvLT5wcHBvZV9kZXYgPSBOVUxMOworCQkJZGV2X3B1dChkZXYpOworCisKKwkJCS8qIFdlIGFsd2F5cyBncmFiIHRoZSBzb2NrZXQgbG9jaywgZm9sbG93ZWQgYnkgdGhlCisJCQkgKiBwcHBvZV9oYXNoX2xvY2ssIGluIHRoYXQgb3JkZXIuICBTaW5jZSB3ZSBzaG91bGQKKwkJCSAqIGhvbGQgdGhlIHNvY2sgbG9jayB3aGlsZSBkb2luZyBhbnkgdW5iaW5kaW5nLAorCQkJICogd2UgbmVlZCB0byByZWxlYXNlIHRoZSBsb2NrIHdlJ3JlIGhvbGRpbmcuCisJCQkgKiBIb2xkIGEgcmVmZXJlbmNlIHRvIHRoZSBzb2NrIHNvIGl0IGRvZXNuJ3QgZGlzYXBwZWFyCisJCQkgKiBhcyB3ZSdyZSBqdW1waW5nIGJldHdlZW4gbG9ja3MuCisJCQkgKi8KKworCQkJc29ja19ob2xkKHNrKTsKKworCQkJd3JpdGVfdW5sb2NrX2JoKCZwcHBvZV9oYXNoX2xvY2spOworCQkJbG9ja19zb2NrKHNrKTsKKworCQkJaWYgKHNrLT5za19zdGF0ZSAmIChQUFBPWF9DT05ORUNURUQgfCBQUFBPWF9CT1VORCkpIHsKKwkJCQlwcHBveF91bmJpbmRfc29jayhzayk7CisJCQkJc2stPnNrX3N0YXRlID0gUFBQT1hfWk9NQklFOworCQkJCXNrLT5za19zdGF0ZV9jaGFuZ2Uoc2spOworCQkJfQorCisJCQlyZWxlYXNlX3NvY2soc2spOworCQkJc29ja19wdXQoc2spOworCisJCQkvKiBSZXN0YXJ0IHNjYW4gYXQgdGhlIGJlZ2lubmluZyBvZiB0aGlzIGhhc2ggY2hhaW4uCisJCQkgKiBXaGlsZSB0aGUgbG9jayB3YXMgZHJvcHBlZCB0aGUgY2hhaW4gY29udGVudHMgbWF5CisJCQkgKiBoYXZlIGNoYW5nZWQuCisJCQkgKi8KKwkJCXdyaXRlX2xvY2tfYmgoJnBwcG9lX2hhc2hfbG9jayk7CisJCQlwbyA9IGl0ZW1faGFzaF90YWJsZVtoYXNoXTsKIAkJfQogCX0KLQlyZWFkX3VubG9ja19iaCgmcHBwb2VfaGFzaF9sb2NrKTsKKwl3cml0ZV91bmxvY2tfYmgoJnBwcG9lX2hhc2hfbG9jayk7CiB9CiAKIHN0YXRpYyBpbnQgcHBwb2VfZGV2aWNlX2V2ZW50KHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcywKQEAgLTM0NCwxMCArMzI5LDEwIEBACiBzdGF0aWMgaW50IHBwcG9lX3Jjdl9jb3JlKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgcHBwb3hfc29jayAqcG8gPSBwcHBveF9zayhzayk7Ci0Jc3RydWN0IHBwcG94X3NvY2sgKnJlbGF5X3BvID0gTlVMTDsKKwlzdHJ1Y3QgcHBwb3hfc29jayAqcmVsYXlfcG87CiAKIAlpZiAoc2stPnNrX3N0YXRlICYgUFBQT1hfQk9VTkQpIHsKLQkJc3RydWN0IHBwcG9lX2hkciAqcGggPSAoc3RydWN0IHBwcG9lX2hkciAqKSBza2ItPm5oLnJhdzsKKwkJc3RydWN0IHBwcG9lX2hkciAqcGggPSBwcHBvZV9oZHIoc2tiKTsKIAkJaW50IGxlbiA9IG50b2hzKHBoLT5sZW5ndGgpOwogCQlza2JfcHVsbF9yY3N1bShza2IsIHNpemVvZihzdHJ1Y3QgcHBwb2VfaGRyKSk7CiAJCWlmIChwc2tiX3RyaW1fcmNzdW0oc2tiLCBsZW4pKQpAQCAtNDAxLDcgKzM4Niw3IEBACiAJaWYgKCEoc2tiID0gc2tiX3NoYXJlX2NoZWNrKHNrYiwgR0ZQX0FUT01JQykpKQogCQlnb3RvIG91dDsKIAotCXBoID0gKHN0cnVjdCBwcHBvZV9oZHIgKikgc2tiLT5uaC5yYXc7CisJcGggPSBwcHBvZV9oZHIoc2tiKTsKIAogCXBvID0gZ2V0X2l0ZW0oKHVuc2lnbmVkIGxvbmcpIHBoLT5zaWQsIGV0aF9oZHIoc2tiKS0+aF9zb3VyY2UsIGRldi0+aWZpbmRleCk7CiAJaWYgKHBvICE9IE5VTEwpCkBAIC00MzMsNyArNDE4LDcgQEAKIAlpZiAoIShza2IgPSBza2Jfc2hhcmVfY2hlY2soc2tiLCBHRlBfQVRPTUlDKSkpCiAJCWdvdG8gb3V0OwogCi0JcGggPSAoc3RydWN0IHBwcG9lX2hkciAqKSBza2ItPm5oLnJhdzsKKwlwaCA9IHBwcG9lX2hkcihza2IpOwogCWlmIChwaC0+Y29kZSAhPSBQQURUX0NPREUpCiAJCWdvdG8gYWJvcnQ7CiAKQEAgLTUxNCwzNiArNDk5LDQ5IEBACiB7CiAJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CiAJc3RydWN0IHBwcG94X3NvY2sgKnBvOwotCWludCBlcnJvciA9IDA7CiAKIAlpZiAoIXNrKQogCQlyZXR1cm4gMDsKIAotCWlmIChzb2NrX2ZsYWcoc2ssIFNPQ0tfREVBRCkpCisJbG9ja19zb2NrKHNrKTsKKwlpZiAoc29ja19mbGFnKHNrLCBTT0NLX0RFQUQpKXsKKwkJcmVsZWFzZV9zb2NrKHNrKTsKIAkJcmV0dXJuIC1FQkFERjsKKwl9CiAKIAlwcHBveF91bmJpbmRfc29jayhzayk7CiAKIAkvKiBTaWduYWwgdGhlIGRlYXRoIG9mIHRoZSBzb2NrZXQuICovCiAJc2stPnNrX3N0YXRlID0gUFBQT1hfREVBRDsKIAorCisJLyogV3JpdGUgbG9jayBvbiBoYXNoIGxvY2sgcHJvdGVjdHMgdGhlIGVudGlyZSAicG8iIHN0cnVjdCBmcm9tCisJICogY29uY3VycmVudCB1cGRhdGVzIHZpYSBwcHBvZV9mbHVzaF9kZXYuIFRoZSAicG8iIHN0cnVjdCBzaG91bGQKKwkgKiBiZSBjb25zaWRlcmVkIHBhcnQgb2YgdGhlIGhhc2ggdGFibGUgY29udGVudHMsIHRodXMgcHJvdGVjdGVkCisJICogYnkgdGhlIGhhc2ggdGFibGUgbG9jayAqLworCXdyaXRlX2xvY2tfYmgoJnBwcG9lX2hhc2hfbG9jayk7CisKIAlwbyA9IHBwcG94X3NrKHNrKTsKIAlpZiAocG8tPnBwcG9lX3BhLnNpZCkgewotCQlkZWxldGVfaXRlbShwby0+cHBwb2VfcGEuc2lkLCBwby0+cHBwb2VfcGEucmVtb3RlLCBwby0+cHBwb2VfaWZpbmRleCk7CisJCV9fZGVsZXRlX2l0ZW0ocG8tPnBwcG9lX3BhLnNpZCwKKwkJCSAgICAgIHBvLT5wcHBvZV9wYS5yZW1vdGUsIHBvLT5wcHBvZV9pZmluZGV4KTsKIAl9CiAKLQlpZiAocG8tPnBwcG9lX2RldikKKwlpZiAocG8tPnBwcG9lX2RldikgewogCQlkZXZfcHV0KHBvLT5wcHBvZV9kZXYpOworCQlwby0+cHBwb2VfZGV2ID0gTlVMTDsKKwl9CiAKLQlwby0+cHBwb2VfZGV2ID0gTlVMTDsKKwl3cml0ZV91bmxvY2tfYmgoJnBwcG9lX2hhc2hfbG9jayk7CiAKIAlzb2NrX29ycGhhbihzayk7CiAJc29jay0+c2sgPSBOVUxMOwogCiAJc2tiX3F1ZXVlX3B1cmdlKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSk7CisJcmVsZWFzZV9zb2NrKHNrKTsKIAlzb2NrX3B1dChzayk7CiAKLQlyZXR1cm4gZXJyb3I7CisJcmV0dXJuIDA7CiB9CiAKIApAQCAtNTk5LDE0ICs1OTcsMTggQEAKIAkJcG8tPnBwcG9lX2RldiA9IGRldjsKIAkJcG8tPnBwcG9lX2lmaW5kZXggPSBkZXYtPmlmaW5kZXg7CiAKLQkJaWYgKCEoZGV2LT5mbGFncyAmIElGRl9VUCkpCisJCXdyaXRlX2xvY2tfYmgoJnBwcG9lX2hhc2hfbG9jayk7CisJCWlmICghKGRldi0+ZmxhZ3MgJiBJRkZfVVApKXsKKwkJCXdyaXRlX3VubG9ja19iaCgmcHBwb2VfaGFzaF9sb2NrKTsKIAkJCWdvdG8gZXJyX3B1dDsKKwkJfQogCiAJCW1lbWNweSgmcG8tPnBwcG9lX3BhLAogCQkgICAgICAgJnNwLT5zYV9hZGRyLnBwcG9lLAogCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBwcHBvZV9hZGRyKSk7CiAKLQkJZXJyb3IgPSBzZXRfaXRlbShwbyk7CisJCWVycm9yID0gX19zZXRfaXRlbShwbyk7CisJCXdyaXRlX3VubG9ja19iaCgmcHBwb2VfaGFzaF9sb2NrKTsKIAkJaWYgKGVycm9yIDwgMCkKIAkJCWdvdG8gZXJyX3B1dDsKIApAQCAtNzYyLDEwICs3NjQsMTAgQEAKIHN0YXRpYyBpbnQgcHBwb2Vfc2VuZG1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCiAJCSAgc3RydWN0IG1zZ2hkciAqbSwgc2l6ZV90IHRvdGFsX2xlbikKIHsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOwogCXN0cnVjdCBwcHBveF9zb2NrICpwbyA9IHBwcG94X3NrKHNrKTsKLQlpbnQgZXJyb3IgPSAwOworCWludCBlcnJvcjsKIAlzdHJ1Y3QgcHBwb2VfaGRyIGhkcjsKIAlzdHJ1Y3QgcHBwb2VfaGRyICpwaDsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwpAQCAtNzk5LDcgKzgwMSw3IEBACiAKIAkvKiBSZXNlcnZlIHNwYWNlIGZvciBoZWFkZXJzLiAqLwogCXNrYl9yZXNlcnZlKHNrYiwgZGV2LT5oYXJkX2hlYWRlcl9sZW4pOwotCXNrYi0+bmgucmF3ID0gc2tiLT5kYXRhOworCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOwogCiAJc2tiLT5kZXYgPSBkZXY7CiAKQEAgLTg2OSw3ICs4NzEsOCBAQAogCQkJZ290byBhYm9ydDsKIAogCQlza2JfcmVzZXJ2ZShza2IyLCBkZXYtPmhhcmRfaGVhZGVyX2xlbiArIHNpemVvZihzdHJ1Y3QgcHBwb2VfaGRyKSk7Ci0JCW1lbWNweShza2JfcHV0KHNrYjIsIHNrYi0+bGVuKSwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCBza2JfcHV0KHNrYjIsIHNrYi0+bGVuKSwKKwkJCQkJICBza2ItPmxlbik7CiAJfSBlbHNlIHsKIAkJLyogTWFrZSBhIGNsb25lIHNvIGFzIHRvIG5vdCBkaXN0dXJiIHRoZSBvcmlnaW5hbCBza2IsCiAJCSAqIGdpdmUgZGV2X3F1ZXVlX3htaXQgc29tZXRoaW5nIGl0IGNhbiBmcmVlLgpAQCAtODg0LDcgKzg4Nyw3IEBACiAJbWVtY3B5KHBoLCAmaGRyLCBzaXplb2Yoc3RydWN0IHBwcG9lX2hkcikpOwogCXNrYjItPnByb3RvY29sID0gX19jb25zdGFudF9odG9ucyhFVEhfUF9QUFBfU0VTKTsKIAotCXNrYjItPm5oLnJhdyA9IHNrYjItPmRhdGE7CisJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYjIpOwogCiAJc2tiMi0+ZGV2ID0gZGV2OwogCkBAIC05MjksMTAgKzkzMiw4IEBACiAJCSAgc3RydWN0IG1zZ2hkciAqbSwgc2l6ZV90IHRvdGFsX2xlbiwgaW50IGZsYWdzKQogewogCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOwotCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworCXN0cnVjdCBza19idWZmICpza2I7CiAJaW50IGVycm9yID0gMDsKLQlpbnQgbGVuOwotCXN0cnVjdCBwcHBvZV9oZHIgKnBoID0gTlVMTDsKIAogCWlmIChzay0+c2tfc3RhdGUgJiBQUFBPWF9CT1VORCkgewogCQllcnJvciA9IC1FSU87CkBAIC05NDIsMjYgKzk0MywyMSBAQAogCXNrYiA9IHNrYl9yZWN2X2RhdGFncmFtKHNrLCBmbGFncyAmIH5NU0dfRE9OVFdBSVQsCiAJCQkJZmxhZ3MgJiBNU0dfRE9OVFdBSVQsICZlcnJvcik7CiAKLQlpZiAoZXJyb3IgPCAwKSB7CisJaWYgKGVycm9yIDwgMCkKIAkJZ290byBlbmQ7Ci0JfQogCiAJbS0+bXNnX25hbWVsZW4gPSAwOwogCiAJaWYgKHNrYikgewotCQllcnJvciA9IDA7Ci0JCXBoID0gKHN0cnVjdCBwcHBvZV9oZHIgKikgc2tiLT5uaC5yYXc7Ci0JCWxlbiA9IG50b2hzKHBoLT5sZW5ndGgpOworCQlzdHJ1Y3QgcHBwb2VfaGRyICpwaCA9IHBwcG9lX2hkcihza2IpOworCQljb25zdCBpbnQgbGVuID0gbnRvaHMocGgtPmxlbmd0aCk7CiAKIAkJZXJyb3IgPSBtZW1jcHlfdG9pb3ZlYyhtLT5tc2dfaW92LCAodW5zaWduZWQgY2hhciAqKSAmcGgtPnRhZ1swXSwgbGVuKTsKLQkJaWYgKGVycm9yIDwgMCkKLQkJCWdvdG8gZG9fc2tiX2ZyZWU7Ci0JCWVycm9yID0gbGVuOworCQlpZiAoZXJyb3IgPT0gMCkKKwkJCWVycm9yID0gbGVuOwogCX0KIAotZG9fc2tiX2ZyZWU6Ci0JaWYgKHNrYikKLQkJa2ZyZWVfc2tiKHNrYik7CisJa2ZyZWVfc2tiKHNrYik7CiBlbmQ6CiAJcmV0dXJuIGVycm9yOwogfQpAQCAtOTkxLDcgKzk4Nyw3IEBACiAKIHN0YXRpYyBfX2lubGluZV9fIHN0cnVjdCBwcHBveF9zb2NrICpwcHBvZV9nZXRfaWR4KGxvZmZfdCBwb3MpCiB7Ci0Jc3RydWN0IHBwcG94X3NvY2sgKnBvID0gTlVMTDsKKwlzdHJ1Y3QgcHBwb3hfc29jayAqcG87CiAJaW50IGkgPSAwOwogCiAJZm9yICg7IGkgPCBQUFBPRV9IQVNIX1NJWkU7IGkrKykgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcHBwb3guYyBiL2RyaXZlcnMvbmV0L3BwcG94LmMKaW5kZXggOTMxNTA0Ni4uZjNlNDdkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcHBwb3guYworKysgYi9kcml2ZXJzL25ldC9wcHBveC5jCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSA8bGludXgvcHBwX2RlZnMuaD4KICNpbmNsdWRlIDxsaW51eC9pZl9wcHAuaD4KICNpbmNsdWRlIDxsaW51eC9wcHBfY2hhbm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KIAogI2luY2x1ZGUgPG5ldC9zb2NrLmg+CiAKQEAgLTU4LDcgKzU5LDcgQEAKIHsKIAkvKiBDbGVhciBjb25uZWN0aW9uIHRvIHBwcCBkZXZpY2UsIGlmIGF0dGFjaGVkLiAqLwogCi0JaWYgKHNrLT5za19zdGF0ZSAmIChQUFBPWF9CT1VORCB8IFBQUE9YX1pPTUJJRSkpIHsKKwlpZiAoc2stPnNrX3N0YXRlICYgKFBQUE9YX0JPVU5EIHwgUFBQT1hfQ09OTkVDVEVEIHwgUFBQT1hfWk9NQklFKSkgewogCQlwcHBfdW5yZWdpc3Rlcl9jaGFubmVsKCZwcHBveF9zayhzayktPmNoYW4pOwogCQlzay0+c2tfc3RhdGUgPSBQUFBPWF9ERUFEOwogCX0KQEAgLTExNCw2ICsxMTUsMTMgQEAKIAkJZ290byBvdXQ7CiAKIAlyYyA9IC1FUFJPVE9OT1NVUFBPUlQ7CisjaWZkZWYgQ09ORklHX0tNT0QKKwlpZiAoIXBwcG94X3Byb3Rvc1twcm90b2NvbF0pIHsKKwkJY2hhciBidWZmZXJbMzJdOworCQlzcHJpbnRmKGJ1ZmZlciwgInBwcG94LXByb3RvLSVkIiwgcHJvdG9jb2wpOworCQlyZXF1ZXN0X21vZHVsZShidWZmZXIpOworCX0KKyNlbmRpZgogCWlmICghcHBwb3hfcHJvdG9zW3Byb3RvY29sXSB8fAogCSAgICAhdHJ5X21vZHVsZV9nZXQocHBwb3hfcHJvdG9zW3Byb3RvY29sXS0+b3duZXIpKQogCQlnb3RvIG91dDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3FsYTN4eHguYyBiL2RyaXZlcnMvbmV0L3FsYTN4eHguYwppbmRleCBhODI0NmViLi5kODc2NmMwIDEwMDc1NQotLS0gYS9kcml2ZXJzL25ldC9xbGEzeHh4LmMKKysrIGIvZHJpdmVycy9uZXQvcWxhM3h4eC5jCkBAIC0zOSw3ICszOSw3IEBACiAKICNkZWZpbmUgRFJWX05BTUUgIAkicWxhM3h4eCIKICNkZWZpbmUgRFJWX1NUUklORyAJIlFMb2dpYyBJU1AzWFhYIE5ldHdvcmsgRHJpdmVyIgotI2RlZmluZSBEUlZfVkVSU0lPTgkidjIuMDMuMDAtazMiCisjZGVmaW5lIERSVl9WRVJTSU9OCSJ2Mi4wMy4wMC1rNCIKICNkZWZpbmUgUEZYCQlEUlZfTkFNRSAiICIKIAogc3RhdGljIGNvbnN0IGNoYXIgcWwzeHh4X2RyaXZlcl9uYW1lW10gPSBEUlZfTkFNRTsKQEAgLTcyLDYgKzcyLDMwIEBACiBNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgcWwzeHh4X3BjaV90YmwpOwogCiAvKgorICogIFRoZXNlIGFyZSB0aGUga25vd24gUEhZJ3Mgd2hpY2ggYXJlIHVzZWQKKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgIFBIWV9UWVBFX1VOS05PV04gICA9IDAsCisgICBQSFlfVklURVNTRV9WU0M4MjExLAorICAgUEhZX0FHRVJFX0VUMTAxMUMsCisgICBNQVhfUEhZX0RFVl9UWVBFUworfSBQSFlfREVWSUNFX2V0OworCit0eXBlZGVmIHN0cnVjdCB7CisJUEhZX0RFVklDRV9ldCBwaHlEZXZpY2U7IAorCXUzMgkJcGh5SWRPVUk7CisJdTE2CQlwaHlJZE1vZGVsOworCWNoYXIgCQkqbmFtZTsKK30gUEhZX0RFVklDRV9JTkZPX3Q7CisKK3N0YXRpYyBjb25zdCBQSFlfREVWSUNFX0lORk9fdCBQSFlfREVWSUNFU1tdID0KKwl7e1BIWV9UWVBFX1VOS05PV04sICAgIDB4MDAwMDAwLCAweDAsICJQSFlfVFlQRV9VTktOT1dOIn0sCisJIHtQSFlfVklURVNTRV9WU0M4MjExLCAweDAwMDNmMSwgMHhiLCAiUEhZX1ZJVEVTU0VfVlNDODIxMSJ9LAorCSB7UEhZX0FHRVJFX0VUMTAxMUMsICAgMHgwMGEwYmMsIDB4MSwgIlBIWV9BR0VSRV9FVDEwMTFDIn0sCit9OworCisKKy8qCiAgKiBDYWxsZXIgbXVzdCB0YWtlIGh3X2xvY2suCiAgKi8KIHN0YXRpYyBpbnQgcWxfc2VtX3NwaW5sb2NrKHN0cnVjdCBxbDNfYWRhcHRlciAqcWRldiwKQEAgLTY2Miw3ICs2ODYsNyBAQAogfQogCiBzdGF0aWMgaW50IHFsX21paV93cml0ZV9yZWdfZXgoc3RydWN0IHFsM19hZGFwdGVyICpxZGV2LAotCQkJICAgICAgIHUxNiByZWdBZGRyLCB1MTYgdmFsdWUsIHUzMiBtYWNfaW5kZXgpCisJCQkgICAgICAgdTE2IHJlZ0FkZHIsIHUxNiB2YWx1ZSwgdTMyIHBoeUFkZHIpCiB7CiAJc3RydWN0IHFsM3h4eF9wb3J0X3JlZ2lzdGVycyBfX2lvbWVtICpwb3J0X3JlZ3MgPQogCSAgICAJCXFkZXYtPm1lbV9tYXBfcmVnaXN0ZXJzOwpAQCAtNjgwLDcgKzcwNCw3IEBACiAJfQogCiAJcWxfd3JpdGVfcGFnZTBfcmVnKHFkZXYsICZwb3J0X3JlZ3MtPm1hY01JSU1nbXRBZGRyUmVnLAotCQkJICAgUEhZQWRkclttYWNfaW5kZXhdIHwgcmVnQWRkcik7CisJCQkgICBwaHlBZGRyIHwgcmVnQWRkcik7CiAKIAlxbF93cml0ZV9wYWdlMF9yZWcocWRldiwgJnBvcnRfcmVncy0+bWFjTUlJTWdtdERhdGFSZWcsIHZhbHVlKTsKIApAQCAtNzAxLDcgKzcyNSw3IEBACiB9CiAKIHN0YXRpYyBpbnQgcWxfbWlpX3JlYWRfcmVnX2V4KHN0cnVjdCBxbDNfYWRhcHRlciAqcWRldiwgdTE2IHJlZ0FkZHIsCi0JCQkgICAgICB1MTYgKiB2YWx1ZSwgdTMyIG1hY19pbmRleCkKKwkJCSAgICAgIHUxNiAqIHZhbHVlLCB1MzIgcGh5QWRkcikKIHsKIAlzdHJ1Y3QgcWwzeHh4X3BvcnRfcmVnaXN0ZXJzIF9faW9tZW0gKnBvcnRfcmVncyA9CiAJICAgIAkJcWRldi0+bWVtX21hcF9yZWdpc3RlcnM7CkBAIC03MjAsNyArNzQ0LDcgQEAKIAl9CiAKIAlxbF93cml0ZV9wYWdlMF9yZWcocWRldiwgJnBvcnRfcmVncy0+bWFjTUlJTWdtdEFkZHJSZWcsCi0JCQkgICBQSFlBZGRyW21hY19pbmRleF0gfCByZWdBZGRyKTsKKwkJCSAgIHBoeUFkZHIgfCByZWdBZGRyKTsKIAogCXFsX3dyaXRlX3BhZ2UwX3JlZyhxZGV2LCAmcG9ydF9yZWdzLT5tYWNNSUlNZ210Q29udHJvbFJlZywKIAkJCSAgIChNQUNfTUlJX0NPTlRST0xfUkMgPDwgMTYpKTsKQEAgLTg1MCwyOCArODc0LDMxIEBACiAKIH0KIAotc3RhdGljIHZvaWQgcWxfcGV0YmlfcmVzZXRfZXgoc3RydWN0IHFsM19hZGFwdGVyICpxZGV2LCB1MzIgbWFjX2luZGV4KQorc3RhdGljIHZvaWQgcWxfcGV0YmlfcmVzZXRfZXgoc3RydWN0IHFsM19hZGFwdGVyICpxZGV2KQogewogCXFsX21paV93cml0ZV9yZWdfZXgocWRldiwgUEVUQklfQ09OVFJPTF9SRUcsIFBFVEJJX0NUUkxfU09GVF9SRVNFVCwKLQkJCSAgICBtYWNfaW5kZXgpOworCQkJICAgIFBIWUFkZHJbcWRldi0+bWFjX2luZGV4XSk7CiB9CiAKLXN0YXRpYyB2b2lkIHFsX3BldGJpX3N0YXJ0X25lZ19leChzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYsIHUzMiBtYWNfaW5kZXgpCitzdGF0aWMgdm9pZCBxbF9wZXRiaV9zdGFydF9uZWdfZXgoc3RydWN0IHFsM19hZGFwdGVyICpxZGV2KQogewogCXUxNiByZWc7CiAKIAkvKiBFbmFibGUgQXV0by1uZWdvdGlhdGlvbiBzZW5zZSAqLwotCXFsX21paV9yZWFkX3JlZ19leChxZGV2LCBQRVRCSV9UQklfQ1RSTCwgJnJlZywgbWFjX2luZGV4KTsKKwlxbF9taWlfcmVhZF9yZWdfZXgocWRldiwgUEVUQklfVEJJX0NUUkwsICZyZWcsIAorCQkJICAgUEhZQWRkcltxZGV2LT5tYWNfaW5kZXhdKTsKIAlyZWcgfD0gUEVUQklfVEJJX0FVVE9fU0VOU0U7Ci0JcWxfbWlpX3dyaXRlX3JlZ19leChxZGV2LCBQRVRCSV9UQklfQ1RSTCwgcmVnLCBtYWNfaW5kZXgpOworCXFsX21paV93cml0ZV9yZWdfZXgocWRldiwgUEVUQklfVEJJX0NUUkwsIHJlZywgCisJCQkgICAgUEhZQWRkcltxZGV2LT5tYWNfaW5kZXhdKTsKIAogCXFsX21paV93cml0ZV9yZWdfZXgocWRldiwgUEVUQklfTkVHX0FEVkVSLAotCQkJICAgIFBFVEJJX05FR19QQVVTRSB8IFBFVEJJX05FR19EVVBMRVgsIG1hY19pbmRleCk7CisJCQkgICAgUEVUQklfTkVHX1BBVVNFIHwgUEVUQklfTkVHX0RVUExFWCwgCisJCQkgICAgUEhZQWRkcltxZGV2LT5tYWNfaW5kZXhdKTsKIAogCXFsX21paV93cml0ZV9yZWdfZXgocWRldiwgUEVUQklfQ09OVFJPTF9SRUcsCiAJCQkgICAgUEVUQklfQ1RSTF9BVVRPX05FRyB8IFBFVEJJX0NUUkxfUkVTVEFSVF9ORUcgfAogCQkJICAgIFBFVEJJX0NUUkxfRlVMTF9EVVBMRVggfCBQRVRCSV9DVFJMX1NQRUVEXzEwMDAsCi0JCQkgICAgbWFjX2luZGV4KTsKKwkJCSAgICBQSFlBZGRyW3FkZXYtPm1hY19pbmRleF0pOwogfQogCiBzdGF0aWMgdm9pZCBxbF9wZXRiaV9pbml0KHN0cnVjdCBxbDNfYWRhcHRlciAqcWRldikKQEAgLTg4MCwxMCArOTA3LDEwIEBACiAJcWxfcGV0Ymlfc3RhcnRfbmVnKHFkZXYpOwogfQogCi1zdGF0aWMgdm9pZCBxbF9wZXRiaV9pbml0X2V4KHN0cnVjdCBxbDNfYWRhcHRlciAqcWRldiwgdTMyIG1hY19pbmRleCkKK3N0YXRpYyB2b2lkIHFsX3BldGJpX2luaXRfZXgoc3RydWN0IHFsM19hZGFwdGVyICpxZGV2KQogewotCXFsX3BldGJpX3Jlc2V0X2V4KHFkZXYsIG1hY19pbmRleCk7Ci0JcWxfcGV0Ymlfc3RhcnRfbmVnX2V4KHFkZXYsIG1hY19pbmRleCk7CisJcWxfcGV0YmlfcmVzZXRfZXgocWRldik7CisJcWxfcGV0Ymlfc3RhcnRfbmVnX2V4KHFkZXYpOwogfQogCiBzdGF0aWMgaW50IHFsX2lzX3BldGJpX25lZ19wYXVzZShzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYpCkBAIC04OTYsMzMgKzkyMywxMjggQEAKIAlyZXR1cm4gKHJlZyAmIFBFVEJJX05FR19QQVVTRV9NQVNLKSA9PSBQRVRCSV9ORUdfUEFVU0U7CiB9CiAKK3N0YXRpYyB2b2lkIHBoeUFnZXJlU3BlY2lmaWNJbml0KHN0cnVjdCBxbDNfYWRhcHRlciAqcWRldiwgdTMyIG1paUFkZHIpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGVuYWJsaW5nIEFnZXJlIHNwZWNpZmljIFBIWVxuIiwgcWRldi0+bmRldi0+bmFtZSk7CisJLyogcG93ZXIgZG93biBkZXZpY2UgYml0IDExID0gMSAqLworCXFsX21paV93cml0ZV9yZWdfZXgocWRldiwgMHgwMCwgMHgxOTQwLCBtaWlBZGRyKTsKKwkvKiBlbmFibGUgZGlhZ25vc3RpYyBtb2RlIGJpdCAyID0gMSAqLworCXFsX21paV93cml0ZV9yZWdfZXgocWRldiwgMHgxMiwgMHg4NDBlLCBtaWlBZGRyKTsKKwkvKiAxMDAwTUIgYW1wbGl0dWRlIGFkanVzdCAoc2VlIEFnZXJlIGVycmF0YSkgKi8KKwlxbF9taWlfd3JpdGVfcmVnX2V4KHFkZXYsIDB4MTAsIDB4ODgwNSwgbWlpQWRkcik7CisJLyogMTAwME1CIGFtcGxpdHVkZSBhZGp1c3QgKHNlZSBBZ2VyZSBlcnJhdGEpICovCisJcWxfbWlpX3dyaXRlX3JlZ19leChxZGV2LCAweDExLCAweGYwM2UsIG1paUFkZHIpOworCS8qIDEwME1CIGFtcGxpdHVkZSBhZGp1c3QgKHNlZSBBZ2VyZSBlcnJhdGEpICovCisJcWxfbWlpX3dyaXRlX3JlZ19leChxZGV2LCAweDEwLCAweDg4MDYsIG1paUFkZHIpOworCS8qIDEwME1CIGFtcGxpdHVkZSBhZGp1c3QgKHNlZSBBZ2VyZSBlcnJhdGEpICovCisJcWxfbWlpX3dyaXRlX3JlZ19leChxZGV2LCAweDExLCAweDAwM2UsIG1paUFkZHIpOworCS8qIDEwTUIgYW1wbGl0dWRlIGFkanVzdCAoc2VlIEFnZXJlIGVycmF0YSkgKi8KKwlxbF9taWlfd3JpdGVfcmVnX2V4KHFkZXYsIDB4MTAsIDB4ODgwNywgbWlpQWRkcik7CisJLyogMTBNQiBhbXBsaXR1ZGUgYWRqdXN0IChzZWUgQWdlcmUgZXJyYXRhKSAqLworCXFsX21paV93cml0ZV9yZWdfZXgocWRldiwgMHgxMSwgMHgxZjAwLCBtaWlBZGRyKTsKKwkvKiBwb2ludCB0byBoaWRkZW4gcmVnIDB4MjgwNiAqLworCXFsX21paV93cml0ZV9yZWdfZXgocWRldiwgMHgxMCwgMHgyODA2LCBtaWlBZGRyKTsKKwkvKiBXcml0ZSBuZXcgUEhZQUQgdy9iaXQgNSBzZXQgKi8KKwlxbF9taWlfd3JpdGVfcmVnX2V4KHFkZXYsIDB4MTEsIDB4MDAyMCB8IChQSFlBZGRyW3FkZXYtPm1hY19pbmRleF0gPj4gOCksIG1paUFkZHIpOworCS8qIAorCSAqIERpc2FibGUgZGlhZ25vc3RpYyBtb2RlIGJpdCAyID0gMAorCSAqIFBvd2VyIHVwIGRldmljZSBiaXQgMTEgPSAwCisJICogTGluayB1cCAob24pIGFuZCBhY3Rpdml0eSAoYmxpbmspCisJICovCisJcWxfbWlpX3dyaXRlX3JlZyhxZGV2LCAweDEyLCAweDg0MGEpOworCXFsX21paV93cml0ZV9yZWcocWRldiwgMHgwMCwgMHgxMTQwKTsKKwlxbF9taWlfd3JpdGVfcmVnKHFkZXYsIDB4MWMsIDB4ZmFmMCk7Cit9CisKK3N0YXRpYyBQSFlfREVWSUNFX2V0IGdldFBoeVR5cGUgKHN0cnVjdCBxbDNfYWRhcHRlciAqcWRldiwgCisJCQkJIHUxNiBwaHlJZFJlZzAsIHUxNiBwaHlJZFJlZzEpCit7CisJUEhZX0RFVklDRV9ldCByZXN1bHQgPSBQSFlfVFlQRV9VTktOT1dOOworCXUzMiAgIG91aTsgICAgIAorCXUxNiAgIG1vZGVsOworCWludCBpOyAgIAorCisJaWYgKHBoeUlkUmVnMCA9PSAweGZmZmYpIHsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisgICAKKwlpZiAocGh5SWRSZWcxID09IDB4ZmZmZikgeworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qIG91aSBpcyBzcGxpdCBiZXR3ZWVuIHR3byByZWdpc3RlcnMgKi8KKwlvdWkgPSAocGh5SWRSZWcwIDw8IDYpIHwgKChwaHlJZFJlZzEgJiBQSFlfT1VJXzFfTUFTSykgPj4gMTApOworCisJbW9kZWwgPSAocGh5SWRSZWcxICYgUEhZX01PREVMX01BU0spID4+IDQ7CisKKwkvKiBTY2FuIHRhYmxlIGZvciB0aGlzIFBIWSAqLworCWZvcihpID0gMDsgaSA8IE1BWF9QSFlfREVWX1RZUEVTOyBpKyspIHsKKwkJaWYgKChvdWkgPT0gUEhZX0RFVklDRVNbaV0ucGh5SWRPVUkpICYmIChtb2RlbCA9PSBQSFlfREVWSUNFU1tpXS5waHlJZE1vZGVsKSkKKwkJeworCQkJcmVzdWx0ID0gUEhZX0RFVklDRVNbaV0ucGh5RGV2aWNlOworCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogUGh5OiAlc1xuIiwKKwkJCQlxZGV2LT5uZGV2LT5uYW1lLCBQSFlfREVWSUNFU1tpXS5uYW1lKTsKKwkJCQorCQkgICAgICAgIGJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIHJlc3VsdDsKK30KKwogc3RhdGljIGludCBxbF9waHlfZ2V0X3NwZWVkKHN0cnVjdCBxbDNfYWRhcHRlciAqcWRldikKIHsKIAl1MTYgcmVnOwogCisJc3dpdGNoKHFkZXYtPnBoeVR5cGUpIHsKKwljYXNlIFBIWV9BR0VSRV9FVDEwMTFDOgorCXsKKwkJaWYgKHFsX21paV9yZWFkX3JlZyhxZGV2LCAweDFBLCAmcmVnKSA8IDApCisJCQlyZXR1cm4gMDsKKworCQlyZWcgPSAocmVnID4+IDgpICYgMzsKKwkJYnJlYWs7CisJfQorCWRlZmF1bHQ6CiAJaWYgKHFsX21paV9yZWFkX3JlZyhxZGV2LCBBVVhfQ09OVFJPTF9TVEFUVVMsICZyZWcpIDwgMCkKIAkJcmV0dXJuIDA7CiAKIAlyZWcgPSAoKChyZWcgJiAweDE4KSA+PiAzKSAmIDMpOworCX0KIAotCWlmIChyZWcgPT0gMikKKwlzd2l0Y2gocmVnKSB7CisJCWNhc2UgMjoKIAkJcmV0dXJuIFNQRUVEXzEwMDA7Ci0JZWxzZSBpZiAocmVnID09IDEpCisJCWNhc2UgMToKIAkJcmV0dXJuIFNQRUVEXzEwMDsKLQllbHNlIGlmIChyZWcgPT0gMCkKKwkJY2FzZSAwOgogCQlyZXR1cm4gU1BFRURfMTA7Ci0JZWxzZQorCQlkZWZhdWx0OgogCQlyZXR1cm4gLTE7CisJfQogfQogCiBzdGF0aWMgaW50IHFsX2lzX2Z1bGxfZHVwKHN0cnVjdCBxbDNfYWRhcHRlciAqcWRldikKIHsKIAl1MTYgcmVnOwogCi0JaWYgKHFsX21paV9yZWFkX3JlZyhxZGV2LCBBVVhfQ09OVFJPTF9TVEFUVVMsICZyZWcpIDwgMCkKLQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4gKHJlZyAmIFBIWV9BVVhfRFVQTEVYX1NUQVQpICE9IDA7CisJc3dpdGNoKHFkZXYtPnBoeVR5cGUpIHsKKwljYXNlIFBIWV9BR0VSRV9FVDEwMTFDOgorCXsKKwkJaWYgKHFsX21paV9yZWFkX3JlZyhxZGV2LCAweDFBLCAmcmVnKSkKKwkJCXJldHVybiAwOworCQkJCisJCXJldHVybiAoKHJlZyAmIDB4MDA4MCkgJiYgKHJlZyAmIDB4MTAwMCkpICE9IDA7CisJfQorCWNhc2UgUEhZX1ZJVEVTU0VfVlNDODIxMToKKwlkZWZhdWx0OgorCXsKKwkJaWYgKHFsX21paV9yZWFkX3JlZyhxZGV2LCBBVVhfQ09OVFJPTF9TVEFUVVMsICZyZWcpIDwgMCkKKwkJCXJldHVybiAwOworCQlyZXR1cm4gKHJlZyAmIFBIWV9BVVhfRFVQTEVYX1NUQVQpICE9IDA7CisJfQorCX0KIH0KIAogc3RhdGljIGludCBxbF9pc19waHlfbmVnX3BhdXNlKHN0cnVjdCBxbDNfYWRhcHRlciAqcWRldikKQEAgLTkzNSw2ICsxMDU3LDczIEBACiAJcmV0dXJuIChyZWcgJiBQSFlfTkVHX1BBVVNFKSAhPSAwOwogfQogCitzdGF0aWMgaW50IFBIWV9TZXR1cChzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYpCit7CisJdTE2ICAgcmVnMTsKKwl1MTYgICByZWcyOworCWJvb2wgIGFnZXJlQWRkckNoYW5nZU5lZWRlZCA9IGZhbHNlOworCXUzMiBtaWlBZGRyID0gMDsKKwlpbnQgZXJyOworCisJLyogIERldGVybWluZSB0aGUgUEhZIHdlIGFyZSB1c2luZyBieSByZWFkaW5nIHRoZSBJRCdzICovCisJZXJyID0gcWxfbWlpX3JlYWRfcmVnKHFkZXYsIFBIWV9JRF8wX1JFRywgJnJlZzEpOworCWlmKGVyciAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IENvdWxkIG5vdCByZWFkIGZyb20gcmVnIFBIWV9JRF8wX1JFR1xuIiwKKwkJICAgICAgIHFkZXYtPm5kZXYtPm5hbWUpOworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisJfQorCisJZXJyID0gcWxfbWlpX3JlYWRfcmVnKHFkZXYsIFBIWV9JRF8xX1JFRywgJnJlZzIpOworCWlmKGVyciAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IENvdWxkIG5vdCByZWFkIGZyb20gcmVnIFBIWV9JRF8wX1JFR1xuIiwKKwkJICAgICAgIHFkZXYtPm5kZXYtPm5hbWUpOworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisJfQorCisJLyogIENoZWNrIGlmIHdlIGhhdmUgYSBBZ2VyZSBQSFkgKi8KKwlpZiAoKHJlZzEgPT0gMHhmZmZmKSB8fCAocmVnMiA9PSAweGZmZmYpKSB7CisKKwkJLyogRGV0ZXJtaW5lIHdoaWNoIE1JSSBhZGRyZXNzIHdlIHNob3VsZCBiZSB1c2luZyAKKwkJICAgZGV0ZXJtaW5lZCBieSB0aGUgaW5kZXggb2YgdGhlIGNhcmQgKi8KKwkJaWYgKHFkZXYtPm1hY19pbmRleCA9PSAwKSB7CisJCQltaWlBZGRyID0gTUlJX0FHRVJFX0FERFJfMTsKKwkJfSBlbHNlIHsKKwkJCW1paUFkZHIgPSBNSUlfQUdFUkVfQUREUl8yOworCQl9CisgICAgICAKKwkJZXJyID1xbF9taWlfcmVhZF9yZWdfZXgocWRldiwgUEhZX0lEXzBfUkVHLCAmcmVnMSwgbWlpQWRkcik7CisJCWlmKGVyciAhPSAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDb3VsZCBub3QgcmVhZCBmcm9tIHJlZyBQSFlfSURfMF9SRUcgYWZ0ZXIgQWdlcmUgZGV0ZWN0ZWRcbiIsCisJCSAgICAgICAJICAgICAgIHFkZXYtPm5kZXYtPm5hbWUpOworICAgICAgICAgICAgICAgIAlyZXR1cm4gZXJyOyAKKwkJfQorCisJCWVyciA9IHFsX21paV9yZWFkX3JlZ19leChxZGV2LCBQSFlfSURfMV9SRUcsICZyZWcyLCBtaWlBZGRyKTsKKwkJaWYoZXJyICE9IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IENvdWxkIG5vdCByZWFkIGZyb20gcmVnIFBIWV9JRF8wX1JFRyBhZnRlciBBZ2VyZSBkZXRlY3RlZFxuIiwKKwkJCSAgICAgICBxZGV2LT5uZGV2LT5uYW1lKTsKKyAgICAgICAgCSAgICAgICAgcmV0dXJuIGVycjsKKwkJfQorICAgCisJCS8qICBXZSBuZWVkIHRvIHJlbWVtYmVyIHRvIGluaXRpYWxpemUgdGhlIEFnZXJlIFBIWSAqLworICAgICAgICAgCWFnZXJlQWRkckNoYW5nZU5lZWRlZCA9IHRydWU7IAorCX0KKworCS8qICBEZXRlcm1pbmUgdGhlIHBhcnRpY3VsYXIgUEhZIHdlIGhhdmUgb24gYm9hcmQgdG8gYXBwbHkKKwkgICAgUEhZIHNwZWNpZmljIGluaXRpYWxpemF0aW9ucyAqLworCXFkZXYtPnBoeVR5cGUgPSBnZXRQaHlUeXBlKHFkZXYsIHJlZzEsIHJlZzIpOworCisJaWYgKChxZGV2LT5waHlUeXBlID09IFBIWV9BR0VSRV9FVDEwMTFDKSAmJiBhZ2VyZUFkZHJDaGFuZ2VOZWVkZWQpIHsKKwkJLyogbmVlZCB0aGlzIGhlcmUgc28gYWRkcmVzcyBnZXRzIGNoYW5nZWQgKi8KKwkJcGh5QWdlcmVTcGVjaWZpY0luaXQocWRldiwgbWlpQWRkcik7ICAKKwl9IGVsc2UgaWYgKHFkZXYtPnBoeVR5cGUgPT0gUEhZX1RZUEVfVU5LTk9XTikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBQSFkgaXMgdW5rbm93blxuIiwgcWRldi0+bmRldi0+bmFtZSk7CisJCXJldHVybiAtRUlPOworCX0KKworCXJldHVybiAwOworfQorCiAvKgogICogQ2FsbGVyIGhvbGRzIGh3X2xvY2suCiAgKi8KQEAgLTEyMDUsMTUgKzEzOTQsMTQgQEAKIC8qCiAgKiBDYWxsZXIgaG9sZHMgaHdfbG9jay4KICAqLwotc3RhdGljIGludCBxbF90aGlzX2FkYXB0ZXJfY29udHJvbHNfcG9ydChzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYsCi0JCQkJCSB1MzIgbWFjX2luZGV4KQorc3RhdGljIGludCBxbF90aGlzX2FkYXB0ZXJfY29udHJvbHNfcG9ydChzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYpCiB7CiAJc3RydWN0IHFsM3h4eF9wb3J0X3JlZ2lzdGVycyBfX2lvbWVtICpwb3J0X3JlZ3MgPQogCSAgICAJCXFkZXYtPm1lbV9tYXBfcmVnaXN0ZXJzOwogCXUzMiBiaXRUb0NoZWNrID0gMDsKIAl1MzIgdGVtcDsKIAotCXN3aXRjaCAobWFjX2luZGV4KSB7CisJc3dpdGNoIChxZGV2LT5tYWNfaW5kZXgpIHsKIAljYXNlIDA6CiAJCWJpdFRvQ2hlY2sgPSBQT1JUX1NUQVRVU19GMV9FTkFCTEVEOwogCQlicmVhazsKQEAgLTEyMzgsMjcgKzE0MjYsOTYgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIHFsX3BoeV9yZXNldF9leChzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYsIHUzMiBtYWNfaW5kZXgpCitzdGF0aWMgdm9pZCBxbF9waHlfcmVzZXRfZXgoc3RydWN0IHFsM19hZGFwdGVyICpxZGV2KQogewotCXFsX21paV93cml0ZV9yZWdfZXgocWRldiwgQ09OVFJPTF9SRUcsIFBIWV9DVFJMX1NPRlRfUkVTRVQsIG1hY19pbmRleCk7CisJcWxfbWlpX3dyaXRlX3JlZ19leChxZGV2LCBDT05UUk9MX1JFRywgUEhZX0NUUkxfU09GVF9SRVNFVCwgCisJCQkgICAgUEhZQWRkcltxZGV2LT5tYWNfaW5kZXhdKTsKIH0KIAotc3RhdGljIHZvaWQgcWxfcGh5X3N0YXJ0X25lZ19leChzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYsIHUzMiBtYWNfaW5kZXgpCitzdGF0aWMgdm9pZCBxbF9waHlfc3RhcnRfbmVnX2V4KHN0cnVjdCBxbDNfYWRhcHRlciAqcWRldikKIHsKIAl1MTYgcmVnOworCXUxNiBwb3J0Q29uZmlndXJhdGlvbjsKIAotCXFsX21paV93cml0ZV9yZWdfZXgocWRldiwgUEhZX05FR19BRFZFUiwKLQkJCSAgICBQSFlfTkVHX1BBVVNFIHwgUEhZX05FR19BRFZfU1BFRUQgfCAxLCBtYWNfaW5kZXgpOworCWlmKHFkZXYtPnBoeVR5cGUgPT0gUEhZX0FHRVJFX0VUMTAxMUMpIHsKKwkJLyogdHVybiBvZmYgZXh0ZXJuYWwgbG9vcGJhY2sgKi8KKwkJcWxfbWlpX3dyaXRlX3JlZyhxZGV2LCAweDEzLCAweDAwMDApOyAKKwl9CiAKLQlxbF9taWlfcmVhZF9yZWdfZXgocWRldiwgQ09OVFJPTF9SRUcsICZyZWcsIG1hY19pbmRleCk7Ci0JcWxfbWlpX3dyaXRlX3JlZ19leChxZGV2LCBDT05UUk9MX1JFRywgcmVnIHwgUEhZX0NUUkxfUkVTVEFSVF9ORUcsCi0JCQkgICAgbWFjX2luZGV4KTsKKwlpZihxZGV2LT5tYWNfaW5kZXggPT0gMCkKKwkJcG9ydENvbmZpZ3VyYXRpb24gPSBxZGV2LT5udnJhbV9kYXRhLm1hY0NmZ19wb3J0MC5wb3J0Q29uZmlndXJhdGlvbjsKKwllbHNlCisJCXBvcnRDb25maWd1cmF0aW9uID0gcWRldi0+bnZyYW1fZGF0YS5tYWNDZmdfcG9ydDEucG9ydENvbmZpZ3VyYXRpb247CisKKwkvKiAgU29tZSBIQkEncyBpbiB0aGUgZmllbGQgYXJlIHNldCB0byAwIGFuZCB0aGV5IG5lZWQgdG8KKwkgICAgYmUgcmVpbnRlcnByZXRlZCB3aXRoIGEgZGVmYXVsdCB2YWx1ZSAqLworCWlmKHBvcnRDb25maWd1cmF0aW9uID09IDApCisJCXBvcnRDb25maWd1cmF0aW9uID0gUE9SVF9DT05GSUdfREVGQVVMVDsKKworCS8qIFNldCB0aGUgMTAwMCBhZHZlcnRpc2VtZW50cyAqLworCXFsX21paV9yZWFkX3JlZ19leChxZGV2LCBQSFlfR0lHX0NPTlRST0wsICZyZWcsIAorCQkJICAgUEhZQWRkcltxZGV2LT5tYWNfaW5kZXhdKTsKKwlyZWcgJj0gflBIWV9HSUdfQUxMX1BBUkFNUzsKKworCWlmKHBvcnRDb25maWd1cmF0aW9uICYgCisJICAgUE9SVF9DT05GSUdfRlVMTF9EVVBMRVhfRU5BQkxFRCAmCisJICAgUE9SVF9DT05GSUdfMTAwME1CX1NQRUVEKSB7CisJCXJlZyB8PSBQSFlfR0lHX0FEVl8xMDAwRjsKKwl9CisJIAorCWlmKHBvcnRDb25maWd1cmF0aW9uICYgCisJICAgUE9SVF9DT05GSUdfSEFMRl9EVVBMRVhfRU5BQkxFRCAmCisJICAgUE9SVF9DT05GSUdfMTAwME1CX1NQRUVEKSB7CisJCXJlZyB8PSBQSFlfR0lHX0FEVl8xMDAwSDsKKwl9CisKKwlxbF9taWlfd3JpdGVfcmVnX2V4KHFkZXYsIFBIWV9HSUdfQ09OVFJPTCwgcmVnLCAKKwkJCSAgICBQSFlBZGRyW3FkZXYtPm1hY19pbmRleF0pOworCisJLyogU2V0IHRoZSAxMC8xMDAgJiBwYXVzZSBuZWdvdGlhdGlvbiBhZHZlcnRpc2VtZW50cyAqLworCXFsX21paV9yZWFkX3JlZ19leChxZGV2LCBQSFlfTkVHX0FEVkVSLCAmcmVnLAorCQkJICAgUEhZQWRkcltxZGV2LT5tYWNfaW5kZXhdKTsKKwlyZWcgJj0gflBIWV9ORUdfQUxMX1BBUkFNUzsKKworCWlmKHBvcnRDb25maWd1cmF0aW9uICYgUE9SVF9DT05GSUdfU1lNX1BBVVNFX0VOQUJMRUQpCisJCXJlZyB8PSBQSFlfTkVHX0FTWV9QQVVTRSB8IFBIWV9ORUdfU1lNX1BBVVNFOworCisJaWYocG9ydENvbmZpZ3VyYXRpb24gJiBQT1JUX0NPTkZJR19GVUxMX0RVUExFWF9FTkFCTEVEKSB7CisJCWlmKHBvcnRDb25maWd1cmF0aW9uICYgUE9SVF9DT05GSUdfMTAwTUJfU1BFRUQpCisJCQlyZWcgfD0gUEhZX05FR19BRFZfMTAwRjsKKwkJCisJCWlmKHBvcnRDb25maWd1cmF0aW9uICYgUE9SVF9DT05GSUdfMTBNQl9TUEVFRCkKKwkJCXJlZyB8PSBQSFlfTkVHX0FEVl8xMEY7CisJfQorCisJaWYocG9ydENvbmZpZ3VyYXRpb24gJiBQT1JUX0NPTkZJR19IQUxGX0RVUExFWF9FTkFCTEVEKSB7CisJCWlmKHBvcnRDb25maWd1cmF0aW9uICYgUE9SVF9DT05GSUdfMTAwTUJfU1BFRUQpCisJCQlyZWcgfD0gUEhZX05FR19BRFZfMTAwSDsKKwkJCisJCWlmKHBvcnRDb25maWd1cmF0aW9uICYgUE9SVF9DT05GSUdfMTBNQl9TUEVFRCkKKwkJCXJlZyB8PSBQSFlfTkVHX0FEVl8xMEg7CisJfQorCisJaWYocG9ydENvbmZpZ3VyYXRpb24gJgorCSAgIFBPUlRfQ09ORklHXzEwMDBNQl9TUEVFRCkgeworCQlyZWcgfD0gMTsJCisJfQorCisJcWxfbWlpX3dyaXRlX3JlZ19leChxZGV2LCBQSFlfTkVHX0FEVkVSLCByZWcsIAorCQkJICAgIFBIWUFkZHJbcWRldi0+bWFjX2luZGV4XSk7CisKKwlxbF9taWlfcmVhZF9yZWdfZXgocWRldiwgQ09OVFJPTF9SRUcsICZyZWcsIFBIWUFkZHJbcWRldi0+bWFjX2luZGV4XSk7CisJCisJcWxfbWlpX3dyaXRlX3JlZ19leChxZGV2LCBDT05UUk9MX1JFRywgCisJCQkgICAgcmVnIHwgUEhZX0NUUkxfUkVTVEFSVF9ORUcgfCBQSFlfQ1RSTF9BVVRPX05FRywKKwkJCSAgICBQSFlBZGRyW3FkZXYtPm1hY19pbmRleF0pOwogfQogCi1zdGF0aWMgdm9pZCBxbF9waHlfaW5pdF9leChzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYsIHUzMiBtYWNfaW5kZXgpCitzdGF0aWMgdm9pZCBxbF9waHlfaW5pdF9leChzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYpCiB7Ci0JcWxfcGh5X3Jlc2V0X2V4KHFkZXYsIG1hY19pbmRleCk7Ci0JcWxfcGh5X3N0YXJ0X25lZ19leChxZGV2LCBtYWNfaW5kZXgpOworCXFsX3BoeV9yZXNldF9leChxZGV2KTsKKwlQSFlfU2V0dXAocWRldik7CisJcWxfcGh5X3N0YXJ0X25lZ19leChxZGV2KTsKIH0KIAogLyoKQEAgLTEyOTUsMTQgKzE1NTIsMTcgQEAKIHsKIAlpZihxbF9zZW1fc3BpbmxvY2socWRldiwgUUxfUEhZX0dJT19TRU1fTUFTSywKIAkJKFFMX1JFU09VUkNFX0JJVFNfQkFTRV9DT0RFIHwgKHFkZXYtPm1hY19pbmRleCkgKgotCQkJIDIpIDw8IDcpKQorCQkJIDIpIDw8IDcpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IENvdWxkIG5vdCBnZXQgaHcgbG9jayBmb3IgR0lPXG4iLAorCQkgICAgICAgcWRldi0+bmRldi0+bmFtZSk7CiAJCXJldHVybiAtMTsKKwl9CiAKIAlpZiAocWxfaXNfZmliZXIocWRldikpIHsKIAkJcWxfcGV0YmlfaW5pdChxZGV2KTsKIAl9IGVsc2UgewogCQkvKiBDb3BwZXIgcG9ydCAqLwotCQlxbF9waHlfaW5pdF9leChxZGV2LCBxZGV2LT5tYWNfaW5kZXgpOworCQlxbF9waHlfaW5pdF9leChxZGV2KTsKIAl9CiAKIAlxbF9zZW1fdW5sb2NrKHFkZXYsIFFMX1BIWV9HSU9fU0VNX01BU0spOwpAQCAtMTQ1Myw3ICsxNzEzLDcgQEAKICAqLwogc3RhdGljIHZvaWQgcWxfZ2V0X3BoeV9vd25lcihzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYpCiB7Ci0JaWYgKHFsX3RoaXNfYWRhcHRlcl9jb250cm9sc19wb3J0KHFkZXYsIHFkZXYtPm1hY19pbmRleCkpCisJaWYgKHFsX3RoaXNfYWRhcHRlcl9jb250cm9sc19wb3J0KHFkZXYpKQogCQlzZXRfYml0KFFMX0xJTktfTUFTVEVSLCZxZGV2LT5mbGFncyk7CiAJZWxzZQogCQljbGVhcl9iaXQoUUxfTElOS19NQVNURVIsJnFkZXYtPmZsYWdzKTsKQEAgLTE0NjcsMTEgKzE3MjcsMTEgQEAKIAlxbF9taWlfZW5hYmxlX3NjYW5fbW9kZShxZGV2KTsKIAogCWlmICh0ZXN0X2JpdChRTF9MSU5LX09QVElDQUwsJnFkZXYtPmZsYWdzKSkgewotCQlpZiAocWxfdGhpc19hZGFwdGVyX2NvbnRyb2xzX3BvcnQocWRldiwgcWRldi0+bWFjX2luZGV4KSkKLQkJCXFsX3BldGJpX2luaXRfZXgocWRldiwgcWRldi0+bWFjX2luZGV4KTsKKwkJaWYgKHFsX3RoaXNfYWRhcHRlcl9jb250cm9sc19wb3J0KHFkZXYpKQorCQkJcWxfcGV0YmlfaW5pdF9leChxZGV2KTsKIAl9IGVsc2UgewotCQlpZiAocWxfdGhpc19hZGFwdGVyX2NvbnRyb2xzX3BvcnQocWRldiwgcWRldi0+bWFjX2luZGV4KSkKLQkJCXFsX3BoeV9pbml0X2V4KHFkZXYsIHFkZXYtPm1hY19pbmRleCk7CisJCWlmIChxbF90aGlzX2FkYXB0ZXJfY29udHJvbHNfcG9ydChxZGV2KSkKKwkJCXFsX3BoeV9pbml0X2V4KHFkZXYpOwogCX0KIH0KIApAQCAtMTYyNCw2ICsxODg0LDIzIEBACiAJcWRldi0+bXNnX2VuYWJsZSA9IHZhbHVlOwogfQogCitzdGF0aWMgdm9pZCBxbF9nZXRfcGF1c2VwYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwKKwkJCSAgICAgIHN0cnVjdCBldGh0b29sX3BhdXNlcGFyYW0gKnBhdXNlKQoreworCXN0cnVjdCBxbDNfYWRhcHRlciAqcWRldiA9IG5ldGRldl9wcml2KG5kZXYpOworCXN0cnVjdCBxbDN4eHhfcG9ydF9yZWdpc3RlcnMgX19pb21lbSAqcG9ydF9yZWdzID0gcWRldi0+bWVtX21hcF9yZWdpc3RlcnM7CisKKwl1MzIgcmVnOworCWlmKHFkZXYtPm1hY19pbmRleCA9PSAwKQorCQlyZWcgPSBxbF9yZWFkX3BhZ2UwX3JlZyhxZGV2LCAmcG9ydF9yZWdzLT5tYWMwQ29uZmlnUmVnKTsKKwllbHNlCisJCXJlZyA9IHFsX3JlYWRfcGFnZTBfcmVnKHFkZXYsICZwb3J0X3JlZ3MtPm1hYzFDb25maWdSZWcpOworCisJcGF1c2UtPmF1dG9uZWcgID0gcWxfZ2V0X2F1dG9fY2ZnX3N0YXR1cyhxZGV2KTsKKwlwYXVzZS0+cnhfcGF1c2UgPSAocmVnICYgTUFDX0NPTkZJR19SRUdfUkYpID4+IDI7CisJcGF1c2UtPnR4X3BhdXNlID0gKHJlZyAmIE1BQ19DT05GSUdfUkVHX1RGKSA+PiAxOworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIHFsM3h4eF9ldGh0b29sX29wcyA9IHsKIAkuZ2V0X3NldHRpbmdzID0gcWxfZ2V0X3NldHRpbmdzLAogCS5nZXRfZHJ2aW5mbyA9IHFsX2dldF9kcnZpbmZvLApAQCAtMTYzMSw2ICsxOTA4LDcgQEAKIAkuZ2V0X2xpbmsgPSBldGh0b29sX29wX2dldF9saW5rLAogCS5nZXRfbXNnbGV2ZWwgPSBxbF9nZXRfbXNnbGV2ZWwsCiAJLnNldF9tc2dsZXZlbCA9IHFsX3NldF9tc2dsZXZlbCwKKwkuZ2V0X3BhdXNlcGFyYW0gPSBxbF9nZXRfcGF1c2VwYXJhbSwKIH07CiAKIHN0YXRpYyBpbnQgcWxfcG9wdWxhdGVfZnJlZV9xdWV1ZShzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYpCkBAIC0xODE1LDE0ICsyMDkzLDE0IEBACiAJYXRvbWljX2luYygmcWRldi0+dHhfY291bnQpOwogfQogCi12b2lkIHFsX2dldF9zYnVmKHN0cnVjdCBxbDNfYWRhcHRlciAqcWRldikKK3N0YXRpYyB2b2lkIHFsX2dldF9zYnVmKHN0cnVjdCBxbDNfYWRhcHRlciAqcWRldikKIHsKIAlpZiAoKytxZGV2LT5zbWFsbF9idWZfaW5kZXggPT0gTlVNX1NNQUxMX0JVRkZFUlMpCiAJCXFkZXYtPnNtYWxsX2J1Zl9pbmRleCA9IDA7CiAJcWRldi0+c21hbGxfYnVmX3JlbGVhc2VfY250Kys7CiB9CiAKLXN0cnVjdCBxbF9yY3ZfYnVmX2NiICpxbF9nZXRfbGJ1ZihzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYpCitzdGF0aWMgc3RydWN0IHFsX3Jjdl9idWZfY2IgKnFsX2dldF9sYnVmKHN0cnVjdCBxbDNfYWRhcHRlciAqcWRldikKIHsKIAlzdHJ1Y3QgcWxfcmN2X2J1Zl9jYiAqbHJnX2J1Zl9jYiA9IE5VTEw7CiAJbHJnX2J1Zl9jYiA9ICZxZGV2LT5scmdfYnVmW3FkZXYtPmxyZ19idWZfaW5kZXhdOwpAQCAtMTg3Myw3ICsyMTUxLDYgQEAKIAkJCSBwY2lfdW5tYXBfbGVuKGxyZ19idWZfY2IyLCBtYXBsZW4pLAogCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7CiAJcHJlZmV0Y2goc2tiLT5kYXRhKTsKLQlza2ItPmRldiA9IHFkZXYtPm5kZXY7CiAJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOwogCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIHFkZXYtPm5kZXYpOwogCkBAIC0xOTI4LDcgKzIyMDUsOCBAQAogCQkgKiBDb3B5IHRoZSBldGhoZHIgZnJvbSBmaXJzdCBidWZmZXIgdG8gc2Vjb25kLiBUaGlzCiAJCSAqIGlzIG5lY2Vzc2FyeSBmb3IgMzAyMiBJUCBjb21wbGV0aW9ucy4KIAkJICovCi0JCW1lbWNweShza2JfcHVzaChza2IyLCBzaXplKSwgc2tiMS0+ZGF0YSArIFZMQU5fSURfTEVOLCBzaXplKTsKKwkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YV9vZmZzZXQoc2tiMSwgVkxBTl9JRF9MRU4sCisJCQkJCQkgc2tiX3B1c2goc2tiMiwgc2l6ZSksIHNpemUpOwogCX0gZWxzZSB7CiAJCXUxNiBjaGVja3N1bSA9IGxlMTZfdG9fY3B1KGliX2lwX3JzcF9wdHItPmNoZWNrc3VtKTsKIAkJaWYgKGNoZWNrc3VtICYgCkBAIC0xOTQ2LDcgKzIyMjQsNiBAQAogCQkJc2tiMi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CiAJCX0KIAl9Ci0Jc2tiMi0+ZGV2ID0gcWRldi0+bmRldjsKIAlza2IyLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYjIsIHFkZXYtPm5kZXYpOwogCiAJbmV0aWZfcmVjZWl2ZV9za2Ioc2tiMik7CkBAIC0zMDc1LDYgKzMzNTIsNyBAQAogCQlnb3RvIG91dDsKIAl9CiAKKwlQSFlfU2V0dXAocWRldik7CiAJcWxfaW5pdF9zY2FuX21vZGUocWRldik7CiAJcWxfZ2V0X3BoeV9vd25lcihxZGV2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcWxhM3h4eC5oIGIvZHJpdmVycy9uZXQvcWxhM3h4eC5oCmluZGV4IDAyMDNmODguLjRhODMyYzQgMTAwNzU1Ci0tLSBhL2RyaXZlcnMvbmV0L3FsYTN4eHguaAorKysgYi9kcml2ZXJzL25ldC9xbGEzeHh4LmgKQEAgLTI5Myw2ICsyOTMsMTYgQEAKIAogI2RlZmluZSBNSUlfU0NBTl9SRUdJU1RFUiAweDAwMDAwMDAxCiAKKyNkZWZpbmUgUEhZX0lEXzBfUkVHICAgIDIKKyNkZWZpbmUgUEhZX0lEXzFfUkVHICAgIDMKKworI2RlZmluZSBQSFlfT1VJXzFfTUFTSyAgICAgICAweGZjMDAKKyNkZWZpbmUgUEhZX01PREVMX01BU0sgICAgICAgMHgwM2YwCisKKy8qICBBZGRyZXNzIGZvciB0aGUgQWdlcmUgUGh5ICovCisjZGVmaW5lIE1JSV9BR0VSRV9BRERSXzEgIDB4MDAwMDEwMDAKKyNkZWZpbmUgTUlJX0FHRVJFX0FERFJfMiAgMHgwMDAwMTEwMAorCiAvKiAzMi1iaXQgaXNwQ29udHJvbFN0YXR1cyAqLwogZW51bSB7CiAJSVNQX0NPTlRST0xfTlBfTUFTSyA9IDB4MDAwMywKQEAgLTc4OSw2ICs3OTksNyBAQAogCVBIWV9DVFJMX0xPT1BCQUNLID0gMHg0MDAwLAogCiAJUEVUQklfQ09OVFJPTF9SRUcgPSAweDAwLAorCVBFVEJJX0NUUkxfQUxMX1BBUkFNUyA9IDB4NzE0MCwKIAlQRVRCSV9DVFJMX1NPRlRfUkVTRVQgPSAweDgwMDAsCiAJUEVUQklfQ1RSTF9BVVRPX05FRyA9IDB4MTAwMCwKIAlQRVRCSV9DVFJMX1JFU1RBUlRfTkVHID0gMHgwMjAwLApAQCAtODExLDYgKzgyMiwyMyBAQAogCVBFVEJJX0VYUEFOU0lPTl9SRUcgPSAweDA2LAogCVBFVEJJX0VYUF9QQUdFX1JYID0gMHgwMDAyLAogCisJUEhZX0dJR19DT05UUk9MID0gOSwKKwlQSFlfR0lHX0VOQUJMRV9NQU4gPSAweDEwMDAsICAvKiBFbmFibGUgTWFzdGVyL1NsYXZlIE1hbnVhbCBDb25maWcqLworCVBIWV9HSUdfU0VUX01BU1RFUiA9IDB4MDgwMCwgIC8qIFNldCBNYXN0ZXIgKHNsYXZlIGlmIGNsZWFyKSovCisJUEhZX0dJR19BTExfUEFSQU1TID0gMHgwMzAwLAorCVBIWV9HSUdfQURWXzEwMDBGID0gMHgwMjAwLAorCVBIWV9HSUdfQURWXzEwMDBIID0gMHgwMTAwLAorCisJUEhZX05FR19BRFZFUiA9IDQsCisJUEhZX05FR19BTExfUEFSQU1TID0gMHgwZmUwLAorCVBIWV9ORUdfQVNZX1BBVVNFID0gIDB4MDgwMCwKKwlQSFlfTkVHX1NZTV9QQVVTRSA9ICAweDA0MDAsCisJUEhZX05FR19BRFZfU1BFRUQgPSAgMHgwMWUwLAorCVBIWV9ORUdfQURWXzEwMEYgPSAgIDB4MDEwMCwKKwlQSFlfTkVHX0FEVl8xMDBIID0gICAweDAwODAsCisJUEhZX05FR19BRFZfMTBGID0gICAgMHgwMDQwLAorCVBIWV9ORUdfQURWXzEwSCA9ICAgIDB4MDAyMCwKKwogCVBFVEJJX1RCSV9DVFJMID0gMHgxMSwKIAlQRVRCSV9UQklfUkVTRVQgPSAweDgwMDAsCiAJUEVUQklfVEJJX0FVVE9fU0VOU0UgPSAweDAxMDAsCkBAIC04MjYsOCArODU0LDcgQEAKIAlQSFlfQVVYX1JFU0VUX1NUSUNLID0gMHgwMDAyLAogCVBIWV9ORUdfUEFVU0UgPSAweDA0MDAsCiAJUEhZX0NUUkxfU09GVF9SRVNFVCA9IDB4ODAwMCwKLQlQSFlfTkVHX0FEVkVSID0gNCwKLQlQSFlfTkVHX0FEVl9TUEVFRCA9IDB4MDFlMCwKKwlQSFlfQ1RSTF9BVVRPX05FRyA9IDB4MTAwMCwKIAlQSFlfQ1RSTF9SRVNUQVJUX05FRyA9IDB4MDIwMCwKIH07CiBlbnVtIHsKQEAgLTg5Miw2ICs5MTksNyBAQAogCXUxNiBwYXVzZVRocmVzaG9sZF9tYWM7CiAJdTE2IHJlc3VtZVRocmVzaG9sZF9tYWM7CiAJdTE2IHBvcnRDb25maWd1cmF0aW9uOworI2RlZmluZSBQT1JUX0NPTkZJR19ERUZBVUxUICAgICAgICAgICAgICAgICAweGY3MDAKICNkZWZpbmUgUE9SVF9DT05GSUdfQVVUT19ORUdfRU5BQkxFRCAgICAgICAgMHg4MDAwCiAjZGVmaW5lIFBPUlRfQ09ORklHX1NZTV9QQVVTRV9FTkFCTEVEICAgICAgIDB4NDAwMAogI2RlZmluZSBQT1JUX0NPTkZJR19GVUxMX0RVUExFWF9FTkFCTEVEICAgICAweDIwMDAKQEAgLTEyNTksNiArMTI4Nyw3IEBACiAJc3RydWN0IGRlbGF5ZWRfd29yayB0eF90aW1lb3V0X3dvcms7CiAJdTMyIG1heF9mcmFtZV9zaXplOwogCXUzMiBkZXZpY2VfaWQ7CisJdTE2IHBoeVR5cGU7CiB9OwogCiAjZW5kaWYJCQkJLyogX1FMQTNYWFhfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3I4MTY5LmMgYi9kcml2ZXJzL25ldC9yODE2OS5jCmluZGV4IDZhNzdiOGEuLjQ1ODc2YTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3I4MTY5LmMKKysrIGIvZHJpdmVycy9uZXQvcjgxNjkuYwpAQCAtMjI4NCw3ICsyMjg0LDcgQEAKIAkJCXJldHVybiBMYXJnZVNlbmQgfCAoKG1zcyAmIE1TU01hc2spIDw8IE1TU1NoaWZ0KTsKIAl9CiAJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1BBUlRJQUwpIHsKLQkJY29uc3Qgc3RydWN0IGlwaGRyICppcCA9IHNrYi0+bmguaXBoOworCQljb25zdCBzdHJ1Y3QgaXBoZHIgKmlwID0gaXBfaGRyKHNrYik7CiAKIAkJaWYgKGlwLT5wcm90b2NvbCA9PSBJUFBST1RPX1RDUCkKIAkJCXJldHVybiBJUENTIHwgVENQQ1M7CkBAIC0yNTg2LDcgKzI1ODYsNiBAQAogCQkJcGNpX2FjdGlvbih0cC0+cGNpX2RldiwgbGU2NF90b19jcHUoZGVzYy0+YWRkciksCiAJCQkJICAgdHAtPnJ4X2J1Zl9zeiwgUENJX0RNQV9GUk9NREVWSUNFKTsKIAotCQkJc2tiLT5kZXYgPSBkZXY7CiAJCQlza2JfcHV0KHNrYiwgcGt0X3NpemUpOwogCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcmlvbmV0LmMgYi9kcml2ZXJzL25ldC9yaW9uZXQuYwppbmRleCBiN2ZmNDg0Li5kZjZiNzM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9yaW9uZXQuYworKysgYi9kcml2ZXJzL25ldC9yaW9uZXQuYwpAQCAtMTE1LDcgKzExNSw2IEBACiAKIAkJcm5ldC0+cnhfc2tiW2ldLT5kYXRhID0gZGF0YTsKIAkJc2tiX3B1dChybmV0LT5yeF9za2JbaV0sIFJJT19NQVhfTVNHX1NJWkUpOwotCQlybmV0LT5yeF9za2JbaV0tPmRldiA9IG5kZXY7CiAJCXJuZXQtPnJ4X3NrYltpXS0+cHJvdG9jb2wgPQogCQkgICAgZXRoX3R5cGVfdHJhbnMocm5ldC0+cnhfc2tiW2ldLCBuZGV2KTsKIAkJZXJyb3IgPSBuZXRpZl9yeChybmV0LT5yeF9za2JbaV0pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcnJ1bm5lci5jIGIvZHJpdmVycy9uZXQvcnJ1bm5lci5jCmluZGV4IGQ4MTUzNmYuLjI1YzczZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3JydW5uZXIuYworKysgYi9kcml2ZXJzL25ldC9ycnVubmVyLmMKQEAgLTEwMjksNyArMTAyOSw2IEBACiAJCQkJCWdvdG8gZGVmZXI7CiAJCQkJfQogCQkJfQotCQkJc2tiLT5kZXYgPSBkZXY7CiAJCQlza2ItPnByb3RvY29sID0gaGlwcGlfdHlwZV90cmFucyhza2IsIGRldik7CiAKIAkJCW5ldGlmX3J4KHNrYik7CQkvKiBzZW5kIGl0IHVwICovCkBAIC0xNDUyLDcgKzE0NTEsNyBAQAogCQl9CiAJCXNrYl9yZXNlcnZlKG5ld19za2IsIDgpOwogCQlza2JfcHV0KG5ld19za2IsIGxlbik7Ci0JCW1lbWNweShuZXdfc2tiLT5kYXRhLCBza2ItPmRhdGEsIGxlbik7CisJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCBuZXdfc2tiLT5kYXRhLCBsZW4pOwogCQlkZXZfa2ZyZWVfc2tiKHNrYik7CiAJCXNrYiA9IG5ld19za2I7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvczJpby1yZWdzLmggYi9kcml2ZXJzL25ldC9zMmlvLXJlZ3MuaAppbmRleCAzM2ZiN2YzLi40Y2I3MTBiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zMmlvLXJlZ3MuaAorKysgYi9kcml2ZXJzL25ldC9zMmlvLXJlZ3MuaApAQCAtMSw2ICsxLDYgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIHJlZ3MuaDogQSBMaW51eCBQQ0ktWCBFdGhlcm5ldCBkcml2ZXIgZm9yIE5ldGVyaW9uIDEwR2JFIFNlcnZlciBOSUMKLSAqIENvcHlyaWdodChjKSAyMDAyLTIwMDUgTmV0ZXJpb24gSW5jLgorICogQ29weXJpZ2h0KGMpIDIwMDItMjAwNyBOZXRlcmlvbiBJbmMuCiAKICAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YKICAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zMmlvLmMgYi9kcml2ZXJzL25ldC9zMmlvLmMKaW5kZXggNDZlYmYxNDEuLjI5MGUxYzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3MyaW8uYworKysgYi9kcml2ZXJzL25ldC9zMmlvLmMKQEAgLTEsNiArMSw2IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBzMmlvLmM6IEEgTGludXggUENJLVggRXRoZXJuZXQgZHJpdmVyIGZvciBOZXRlcmlvbiAxMEdiRSBTZXJ2ZXIgTklDCi0gKiBDb3B5cmlnaHQoYykgMjAwMi0yMDA1IE5ldGVyaW9uIEluYy4KKyAqIENvcHlyaWdodChjKSAyMDAyLTIwMDcgTmV0ZXJpb24gSW5jLgogCiAgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mCiAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCksIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgpAQCAtODQsNyArODQsNyBAQAogI2luY2x1ZGUgInMyaW8uaCIKICNpbmNsdWRlICJzMmlvLXJlZ3MuaCIKIAotI2RlZmluZSBEUlZfVkVSU0lPTiAiMi4wLjE3LjEiCisjZGVmaW5lIERSVl9WRVJTSU9OICIyLjAuMjIuMSIKIAogLyogUzJpbyBEcml2ZXIgbmFtZSAmIHZlcnNpb24uICovCiBzdGF0aWMgY2hhciBzMmlvX2RyaXZlcl9uYW1lW10gPSAiTmV0ZXJpb24iOwpAQCAtMzE2LDcgKzMxNiw3IEBACiB9CiAKIC8qIEEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgJ1JYX1BBX0NGR19TVFJJUF9WTEFOX1RBRycgYml0IGlzIHNldCBvciBub3QgKi8KLWludCB2bGFuX3N0cmlwX2ZsYWc7CitzdGF0aWMgaW50IHZsYW5fc3RyaXBfZmxhZzsKIAogLyogVW5yZWdpc3RlciB0aGUgdmxhbiAqLwogc3RhdGljIHZvaWQgczJpb192bGFuX3J4X2tpbGxfdmlkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgdmlkKQpAQCAtMzk0LDcgKzM5NCw2IEBACiAJRU5EX1NJR04KIH07CiAKLU1PRFVMRV9BVVRIT1IoIlJhZ2hhdmVuZHJhIEtvdXNoaWsgPHJhZ2hhdmVuZHJhLmtvdXNoaWtAbmV0ZXJpb24uY29tPiIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX1ZFUlNJT04oRFJWX1ZFUlNJT04pOwogCkBAIC01MTYsNyArNTE1LDcgQEAKIAkJbWFjX2NvbnRyb2wtPmZpZm9zW2ldLmxpc3RfaW5mbyA9IGttYWxsb2MobGlzdF9ob2xkZXJfc2l6ZSwKIAkJCQkJCQkgIEdGUF9LRVJORUwpOwogCQlpZiAoIW1hY19jb250cm9sLT5maWZvc1tpXS5saXN0X2luZm8pIHsKLQkJCURCR19QUklOVChFUlJfREJHLAorCQkJREJHX1BSSU5UKElORk9fREJHLAogCQkJCSAgIk1hbGxvYyBmYWlsZWQgZm9yIGxpc3RfaW5mb1xuIik7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQpAQCAtNTQyLDkgKzU0MSw5IEBACiAJCQl0bXBfdiA9IHBjaV9hbGxvY19jb25zaXN0ZW50KG5pYy0+cGRldiwKIAkJCQkJCSAgICAgUEFHRV9TSVpFLCAmdG1wX3ApOwogCQkJaWYgKCF0bXBfdikgewotCQkJCURCR19QUklOVChFUlJfREJHLAorCQkJCURCR19QUklOVChJTkZPX0RCRywKIAkJCQkJICAicGNpX2FsbG9jX2NvbnNpc3RlbnQgIik7Ci0JCQkJREJHX1BSSU5UKEVSUl9EQkcsICJmYWlsZWQgZm9yIFR4RExcbiIpOworCQkJCURCR19QUklOVChJTkZPX0RCRywgImZhaWxlZCBmb3IgVHhETFxuIik7CiAJCQkJcmV0dXJuIC1FTk9NRU07CiAJCQl9CiAJCQkvKiBJZiB3ZSBnb3QgYSB6ZXJvIERNQSBhZGRyZXNzKGNhbiBoYXBwZW4gb24KQEAgLTU2MSw5ICs1NjAsOSBAQAogCQkJCXRtcF92ID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQobmljLT5wZGV2LAogCQkJCQkJICAgICBQQUdFX1NJWkUsICZ0bXBfcCk7CiAJCQkJaWYgKCF0bXBfdikgewotCQkJCQlEQkdfUFJJTlQoRVJSX0RCRywKKwkJCQkJREJHX1BSSU5UKElORk9fREJHLAogCQkJCQkgICJwY2lfYWxsb2NfY29uc2lzdGVudCAiKTsKLQkJCQkJREJHX1BSSU5UKEVSUl9EQkcsICJmYWlsZWQgZm9yIFR4RExcbiIpOworCQkJCQlEQkdfUFJJTlQoSU5GT19EQkcsICJmYWlsZWQgZm9yIFR4RExcbiIpOwogCQkJCQlyZXR1cm4gLUVOT01FTTsKIAkJCQl9CiAJCQl9CkBAIC0yMTg3LDcgKzIxODYsNyBAQAogCS8qIHNrYl9zaGluZm8oc2tiKS0+ZnJhZ19saXN0IHdpbGwgaGF2ZSBMNCBkYXRhIHBheWxvYWQgKi8KIAlza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdCA9IGRldl9hbGxvY19za2IoZGV2LT5tdHUgKyBBTElHTl9TSVpFKTsKIAlpZiAoc2tiX3NoaW5mbyhza2IpLT5mcmFnX2xpc3QgPT0gTlVMTCkgewotCQlEQkdfUFJJTlQoRVJSX0RCRywgIiVzOiBkZXZfYWxsb2Nfc2tiIGZhaWxlZFxuICIsIGRldi0+bmFtZSk7CisJCURCR19QUklOVChJTkZPX0RCRywgIiVzOiBkZXZfYWxsb2Nfc2tiIGZhaWxlZFxuICIsIGRldi0+bmFtZSk7CiAJCXJldHVybiAtRU5PTUVNIDsKIAl9CiAJZnJhZ19saXN0ID0gc2tiX3NoaW5mbyhza2IpLT5mcmFnX2xpc3Q7CkBAIC0yMTk1LDcgKzIxOTQsNyBAQAogCWZyYWdfbGlzdC0+bmV4dCA9IE5VTEw7CiAJdG1wID0gKHZvaWQgKilBTElHTigobG9uZylmcmFnX2xpc3QtPmRhdGEsIEFMSUdOX1NJWkUgKyAxKTsKIAlmcmFnX2xpc3QtPmRhdGEgPSB0bXA7Ci0JZnJhZ19saXN0LT50YWlsID0gdG1wOworCXNrYl9yZXNldF90YWlsX3BvaW50ZXIoZnJhZ19saXN0KTsKIAogCS8qIEJ1ZmZlci0yIHJlY2VpdmVzIEw0IGRhdGEgcGF5bG9hZCAqLwogCSgoc3RydWN0IFJ4RDMqKXJ4ZHApLT5CdWZmZXIyX3B0ciA9IHBjaV9tYXBfc2luZ2xlKG5pYy0+cGRldiwKQEAgLTIyNDIsNiArMjI0MSw3IEBACiAJc3RydWN0IGJ1ZmZBZGQgKmJhOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IFJ4RF90ICpmaXJzdF9yeGRwID0gTlVMTDsKKwl1NjQgQnVmZmVyMF9wdHIgPSAwLCBCdWZmZXIxX3B0ciA9IDA7CiAKIAltYWNfY29udHJvbCA9ICZuaWMtPm1hY19jb250cm9sOwogCWNvbmZpZyA9ICZuaWMtPmNvbmZpZzsKQEAgLTIzMTMsOCArMjMxMyw4IEBACiAJCS8qIGFsbG9jYXRlIHNrYiAqLwogCQlza2IgPSBkZXZfYWxsb2Nfc2tiKHNpemUpOwogCQlpZighc2tiKSB7Ci0JCQlEQkdfUFJJTlQoRVJSX0RCRywgIiVzOiBPdXQgb2YgIiwgZGV2LT5uYW1lKTsKLQkJCURCR19QUklOVChFUlJfREJHLCAibWVtb3J5IHRvIGFsbG9jYXRlIFNLQnNcbiIpOworCQkJREJHX1BSSU5UKElORk9fREJHLCAiJXM6IE91dCBvZiAiLCBkZXYtPm5hbWUpOworCQkJREJHX1BSSU5UKElORk9fREJHLCAibWVtb3J5IHRvIGFsbG9jYXRlIFNLQnNcbiIpOwogCQkJaWYgKGZpcnN0X3J4ZHApIHsKIAkJCQl3bWIoKTsKIAkJCQlmaXJzdF9yeGRwLT5Db250cm9sXzEgfD0gUlhEX09XTl9YRU5BOwpAQCAtMjM0MiwxNCArMjM0MiwyMSBAQAogCQkJICogcGF5bG9hZAogCQkJICovCiAKKwkJCS8qIHNhdmUgdGhlIGJ1ZmZlciBwb2ludGVycyB0byBhdm9pZCBmcmVxdWVudCBkbWEgbWFwcGluZyAqLworCQkJQnVmZmVyMF9wdHIgPSAoKHN0cnVjdCBSeEQzKilyeGRwKS0+QnVmZmVyMF9wdHI7CisJCQlCdWZmZXIxX3B0ciA9ICgoc3RydWN0IFJ4RDMqKXJ4ZHApLT5CdWZmZXIxX3B0cjsKIAkJCW1lbXNldChyeGRwLCAwLCBzaXplb2Yoc3RydWN0IFJ4RDMpKTsKKwkJCS8qIHJlc3RvcmUgdGhlIGJ1ZmZlciBwb2ludGVycyBmb3IgZG1hIHN5bmMqLworCQkJKChzdHJ1Y3QgUnhEMyopcnhkcCktPkJ1ZmZlcjBfcHRyID0gQnVmZmVyMF9wdHI7CisJCQkoKHN0cnVjdCBSeEQzKilyeGRwKS0+QnVmZmVyMV9wdHIgPSBCdWZmZXIxX3B0cjsKKwogCQkJYmEgPSAmbWFjX2NvbnRyb2wtPnJpbmdzW3Jpbmdfbm9dLmJhW2Jsb2NrX25vXVtvZmZdOwogCQkJc2tiX3Jlc2VydmUoc2tiLCBCVUYwX0xFTik7CiAJCQl0bXAgPSAodTY0KSh1bnNpZ25lZCBsb25nKSBza2ItPmRhdGE7CiAJCQl0bXAgKz0gQUxJR05fU0laRTsKIAkJCXRtcCAmPSB+QUxJR05fU0laRTsKIAkJCXNrYi0+ZGF0YSA9ICh2b2lkICopICh1bnNpZ25lZCBsb25nKXRtcDsKLQkJCXNrYi0+dGFpbCA9ICh2b2lkICopICh1bnNpZ25lZCBsb25nKXRtcDsKKwkJCXNrYl9yZXNldF90YWlsX3BvaW50ZXIoc2tiKTsKIAogCQkJaWYgKCEoKChzdHJ1Y3QgUnhEMyopcnhkcCktPkJ1ZmZlcjBfcHRyKSkKIAkJCQkoKHN0cnVjdCBSeEQzKilyeGRwKS0+QnVmZmVyMF9wdHIgPQpAQCAtMjU3Myw4ICsyNTgwLDggQEAKIAogCWZvciAoaSA9IDA7IGkgPCBjb25maWctPnJ4X3JpbmdfbnVtOyBpKyspIHsKIAkJaWYgKGZpbGxfcnhfYnVmZmVycyhuaWMsIGkpID09IC1FTk9NRU0pIHsKLQkJCURCR19QUklOVChFUlJfREJHLCAiJXM6T3V0IG9mIG1lbW9yeSIsIGRldi0+bmFtZSk7Ci0JCQlEQkdfUFJJTlQoRVJSX0RCRywgIiBpbiBSeCBQb2xsISFcbiIpOworCQkJREJHX1BSSU5UKElORk9fREJHLCAiJXM6T3V0IG9mIG1lbW9yeSIsIGRldi0+bmFtZSk7CisJCQlEQkdfUFJJTlQoSU5GT19EQkcsICIgaW4gUnggUG9sbCEhXG4iKTsKIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtMjU5MCw4ICsyNTk3LDggQEAKIAogCWZvciAoaSA9IDA7IGkgPCBjb25maWctPnJ4X3JpbmdfbnVtOyBpKyspIHsKIAkJaWYgKGZpbGxfcnhfYnVmZmVycyhuaWMsIGkpID09IC1FTk9NRU0pIHsKLQkJCURCR19QUklOVChFUlJfREJHLCAiJXM6T3V0IG9mIG1lbW9yeSIsIGRldi0+bmFtZSk7Ci0JCQlEQkdfUFJJTlQoRVJSX0RCRywgIiBpbiBSeCBQb2xsISFcbiIpOworCQkJREJHX1BSSU5UKElORk9fREJHLCAiJXM6T3V0IG9mIG1lbW9yeSIsIGRldi0+bmFtZSk7CisJCQlEQkdfUFJJTlQoSU5GT19EQkcsICIgaW4gUnggUG9sbCEhXG4iKTsKIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtMjY0MCw4ICsyNjQ3LDggQEAKIAogCWZvciAoaSA9IDA7IGkgPCBjb25maWctPnJ4X3JpbmdfbnVtOyBpKyspIHsKIAkJaWYgKGZpbGxfcnhfYnVmZmVycyhuaWMsIGkpID09IC1FTk9NRU0pIHsKLQkJCURCR19QUklOVChFUlJfREJHLCAiJXM6T3V0IG9mIG1lbW9yeSIsIGRldi0+bmFtZSk7Ci0JCQlEQkdfUFJJTlQoRVJSX0RCRywgIiBpbiBSeCBOZXRwb2xsISFcbiIpOworCQkJREJHX1BSSU5UKElORk9fREJHLCAiJXM6T3V0IG9mIG1lbW9yeSIsIGRldi0+bmFtZSk7CisJCQlEQkdfUFJJTlQoSU5GT19EQkcsICIgaW4gUnggTmV0cG9sbCEhXG4iKTsKIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtMzMwNyw2ICszMzE0LDcgQEAKIAl1MTYgc3ViaWQsIHBjaV9jbWQ7CiAJaW50IGk7CiAJdTE2IHZhbDE2OworCXVuc2lnbmVkIGxvbmcgbG9uZyByZXNldF9jbnQgPSAwOwogCURCR19QUklOVChJTklUX0RCRywiJXMgLSBSZXNldHRpbmcgWEZyYW1lIGNhcmQgJXNcbiIsCiAJCQlfX0ZVTkNUSU9OX18sIHNwLT5kZXYtPm5hbWUpOwogCkBAIC0zMzcyLDYgKzMzODAsMTEgQEAKIAogCS8qIFJlc2V0IGRldmljZSBzdGF0aXN0aWNzIG1haW50YWluZWQgYnkgT1MgKi8KIAltZW1zZXQoJnNwLT5zdGF0cywgMCwgc2l6ZW9mIChzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cykpOworCS8qIHNhdmUgcmVzZXQgY291bnQgKi8KKwlyZXNldF9jbnQgPSBzcC0+bWFjX2NvbnRyb2wuc3RhdHNfaW5mby0+c3dfc3RhdC5zb2Z0X3Jlc2V0X2NudDsKKwltZW1zZXQoc3AtPm1hY19jb250cm9sLnN0YXRzX2luZm8sIDAsIHNpemVvZihzdHJ1Y3Qgc3RhdF9ibG9jaykpOworCS8qIHJlc3RvcmUgcmVzZXQgY291bnQgKi8KKwlzcC0+bWFjX2NvbnRyb2wuc3RhdHNfaW5mby0+c3dfc3RhdC5zb2Z0X3Jlc2V0X2NudCA9IHJlc2V0X2NudDsKIAogCS8qIFNYRS0wMDI6IENvbmZpZ3VyZSBsaW5rIGFuZCBhY3Rpdml0eSBMRUQgdG8gdHVybiBpdCBvZmYgKi8KIAlzdWJpZCA9IHNwLT5wZGV2LT5zdWJzeXN0ZW1fZGV2aWNlOwpAQCAtMzY1OSw3ICszNjcyLDcgQEAKIAluaWMtPmVudHJpZXMgPSBrbWFsbG9jKE1BWF9SRVFVRVNURURfTVNJX1ggKiBzaXplb2Yoc3RydWN0IG1zaXhfZW50cnkpLAogCQkJICAgICAgIEdGUF9LRVJORUwpOwogCWlmIChuaWMtPmVudHJpZXMgPT0gTlVMTCkgewotCQlEQkdfUFJJTlQoRVJSX0RCRywgIiVzOiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWRcbiIsIF9fRlVOQ1RJT05fXyk7CisJCURCR19QUklOVChJTkZPX0RCRywgIiVzOiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWRcbiIsIF9fRlVOQ1RJT05fXyk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAltZW1zZXQobmljLT5lbnRyaWVzLCAwLCBNQVhfUkVRVUVTVEVEX01TSV9YICogc2l6ZW9mKHN0cnVjdCBtc2l4X2VudHJ5KSk7CkBAIC0zNjY4LDcgKzM2ODEsNyBAQAogCQlrbWFsbG9jKE1BWF9SRVFVRVNURURfTVNJX1ggKiBzaXplb2Yoc3RydWN0IHMyaW9fbXNpeF9lbnRyeSksCiAJCQkJICAgR0ZQX0tFUk5FTCk7CiAJaWYgKG5pYy0+czJpb19lbnRyaWVzID09IE5VTEwpIHsKLQkJREJHX1BSSU5UKEVSUl9EQkcsICIlczogTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkXG4iLCBfX0ZVTkNUSU9OX18pOworCQlEQkdfUFJJTlQoSU5GT19EQkcsICIlczogTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkXG4iLCBfX0ZVTkNUSU9OX18pOwogCQlrZnJlZShuaWMtPmVudHJpZXMpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CkBAIC00MDE5LDcgKzQwMzIsNyBAQAogCQkJREJHX1BSSU5UKElOVFJfREJHLCAiJXM6IFJ4IEJEIGhpdCAiLCBfX0ZVTkNUSU9OX18pOwogCQkJREJHX1BSSU5UKElOVFJfREJHLCAiUEFOSUMgbGV2ZWxzXG4iKTsKIAkJCWlmICgocmV0ID0gZmlsbF9yeF9idWZmZXJzKHNwLCBybmdfbikpID09IC1FTk9NRU0pIHsKLQkJCQlEQkdfUFJJTlQoRVJSX0RCRywgIk91dCBvZiBtZW1vcnkgaW4gJXMiLAorCQkJCURCR19QUklOVChJTkZPX0RCRywgIk91dCBvZiBtZW1vcnkgaW4gJXMiLAogCQkJCQkgIF9fRlVOQ1RJT05fXyk7CiAJCQkJY2xlYXJfYml0KDAsICgmc3AtPnRhc2tsZXRfc3RhdHVzKSk7CiAJCQkJcmV0dXJuIC0xOwpAQCAtNDAyOSw4ICs0MDQyLDggQEAKIAkJCXRhc2tsZXRfc2NoZWR1bGUoJnNwLT50YXNrKTsKIAogCX0gZWxzZSBpZiAoZmlsbF9yeF9idWZmZXJzKHNwLCBybmdfbikgPT0gLUVOT01FTSkgewotCQkJREJHX1BSSU5UKEVSUl9EQkcsICIlczpPdXQgb2YgbWVtb3J5Iiwgc3AtPmRldi0+bmFtZSk7Ci0JCQlEQkdfUFJJTlQoRVJSX0RCRywgIiBpbiBSeCBJbnRyISFcbiIpOworCQkJREJHX1BSSU5UKElORk9fREJHLCAiJXM6T3V0IG9mIG1lbW9yeSIsIHNwLT5kZXYtPm5hbWUpOworCQkJREJHX1BSSU5UKElORk9fREJHLCAiIGluIFJ4IEludHIhIVxuIik7CiAJfQogCXJldHVybiAwOwogfQpAQCAtNDI3OSw5ICs0MjkyLDcgQEAKIAkJCWlmIChjbnQgPT0gNSkKIAkJCQlicmVhazsgLyogVXBkdCBmYWlsZWQgKi8KIAkJfSB3aGlsZSgxKTsKLQl9IGVsc2UgewotCQltZW1zZXQoc3AtPm1hY19jb250cm9sLnN0YXRzX2luZm8sIDAsIHNpemVvZihzdHJ1Y3Qgc3RhdF9ibG9jaykpOwotCX0KKwl9IAogfQogCiAvKioKQEAgLTU5NDksMTIgKzU5NjAsMTIgQEAKIAkJZm9yIChpID0gMDsgaSA8IGNvbmZpZy0+cnhfcmluZ19udW07IGkrKykgewogCQkJcmV0ID0gZmlsbF9yeF9idWZmZXJzKHNwLCBpKTsKIAkJCWlmIChyZXQgPT0gLUVOT01FTSkgewotCQkJCURCR19QUklOVChFUlJfREJHLCAiJXM6IE91dCBvZiAiLAorCQkJCURCR19QUklOVChJTkZPX0RCRywgIiVzOiBPdXQgb2YgIiwKIAkJCQkJICBkZXYtPm5hbWUpOwogCQkJCURCR19QUklOVChFUlJfREJHLCAibWVtb3J5IGluIHRhc2tsZXRcbiIpOwogCQkJCWJyZWFrOwogCQkJfSBlbHNlIGlmIChyZXQgPT0gLUVGSUxMKSB7Ci0JCQkJREJHX1BSSU5UKEVSUl9EQkcsCisJCQkJREJHX1BSSU5UKElORk9fREJHLAogCQkJCQkgICIlczogUnggUmluZyAlZCBpcyBmdWxsXG4iLAogCQkJCQkgIGRldi0+bmFtZSwgaSk7CiAJCQkJYnJlYWs7CkBAIC02MDY1LDggKzYwNzYsOCBAQAogCQl9IGVsc2UgewogCQkJKnNrYiA9IGRldl9hbGxvY19za2Ioc2l6ZSk7CiAJCQlpZiAoISgqc2tiKSkgewotCQkJCURCR19QUklOVChFUlJfREJHLCAiJXM6IE91dCBvZiAiLCBkZXYtPm5hbWUpOwotCQkJCURCR19QUklOVChFUlJfREJHLCAibWVtb3J5IHRvIGFsbG9jYXRlIFNLQnNcbiIpOworCQkJCURCR19QUklOVChJTkZPX0RCRywgIiVzOiBPdXQgb2YgIiwgZGV2LT5uYW1lKTsKKwkJCQlEQkdfUFJJTlQoSU5GT19EQkcsICJtZW1vcnkgdG8gYWxsb2NhdGUgU0tCc1xuIik7CiAJCQkJcmV0dXJuIC1FTk9NRU0gOwogCQkJfQogCQkJLyogc3RvcmluZyB0aGUgbWFwcGVkIGFkZHIgaW4gYSB0ZW1wIHZhcmlhYmxlCkBAIC02MDg4LDcgKzYwOTksNyBAQAogCQl9IGVsc2UgewogCQkJKnNrYiA9IGRldl9hbGxvY19za2Ioc2l6ZSk7CiAJCQlpZiAoISgqc2tiKSkgewotCQkJCURCR19QUklOVChFUlJfREJHLCAiJXM6IGRldl9hbGxvY19za2IgZmFpbGVkXG4iLAorCQkJCURCR19QUklOVChJTkZPX0RCRywgIiVzOiBkZXZfYWxsb2Nfc2tiIGZhaWxlZFxuIiwKIAkJCQkJZGV2LT5uYW1lKTsKIAkJCQlyZXR1cm4gLUVOT01FTTsKIAkJCX0KQEAgLTYxMTUsNyArNjEyNiw3IEBACiAJCX0gZWxzZSB7CiAJCQkqc2tiID0gZGV2X2FsbG9jX3NrYihzaXplKTsKIAkJCWlmICghKCpza2IpKSB7Ci0JCQkJREJHX1BSSU5UKEVSUl9EQkcsICIlczogZGV2X2FsbG9jX3NrYiBmYWlsZWRcbiIsCisJCQkJREJHX1BSSU5UKElORk9fREJHLCAiJXM6IGRldl9hbGxvY19za2IgZmFpbGVkXG4iLAogCQkJCQkgIGRldi0+bmFtZSk7CiAJCQkJcmV0dXJuIC1FTk9NRU07CiAJCQl9CkBAIC02NjE2LDcgKzY2MjcsNiBAQAogCiAJLyogVXBkYXRpbmcgc3RhdGlzdGljcyAqLwogCXJ4ZHAtPkhvc3RfQ29udHJvbCA9IDA7Ci0Jc3AtPnJ4X3BrdF9jb3VudCsrOwogCXNwLT5zdGF0cy5yeF9wYWNrZXRzKys7CiAJaWYgKHNwLT5yeGRfbW9kZSA9PSBSWERfTU9ERV8xKSB7CiAJCWludCBsZW4gPSBSWERfR0VUX0JVRkZFUjBfU0laRV8xKHJ4ZHAtPkNvbnRyb2xfMik7CkBAIC03MjUyLDcgKzcyNjIsNyBAQAogCQlnb3RvIHJlZ2lzdGVyX2ZhaWxlZDsKIAl9CiAJczJpb192cGRfcmVhZChzcCk7Ci0JREJHX1BSSU5UKEVSUl9EQkcsICJDb3B5cmlnaHQoYykgMjAwMi0yMDA1IE5ldGVyaW9uIEluYy5cbiIpOworCURCR19QUklOVChFUlJfREJHLCAiQ29weXJpZ2h0KGMpIDIwMDItMjAwNyBOZXRlcmlvbiBJbmMuXG4iKTsKIAlEQkdfUFJJTlQoRVJSX0RCRywgIiVzOiBOZXRlcmlvbiAlcyAocmV2ICVkKVxuIixkZXYtPm5hbWUsCiAJCSAgc3AtPnByb2R1Y3RfbmFtZSwgZ2V0X3hlbmFfcmV2X2lkKHNwLT5wZGV2KSk7CiAJREJHX1BSSU5UKEVSUl9EQkcsICIlczogRHJpdmVyIHZlcnNpb24gJXNcbiIsIGRldi0+bmFtZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3MyaW8uaCBiL2RyaXZlcnMvbmV0L3MyaW8uaAppbmRleCA4MDMxMzdjLi5hNjU2ZDE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zMmlvLmgKKysrIGIvZHJpdmVycy9uZXQvczJpby5oCkBAIC0xLDYgKzEsNiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogczJpby5oOiBBIExpbnV4IFBDSS1YIEV0aGVybmV0IGRyaXZlciBmb3IgTmV0ZXJpb24gMTBHYkUgU2VydmVyIE5JQwotICogQ29weXJpZ2h0KGMpIDIwMDItMjAwNSBOZXRlcmlvbiBJbmMuCisgKiBDb3B5cmlnaHQoYykgMjAwMi0yMDA3IE5ldGVyaW9uIEluYy4KIAogICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZgogICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KQEAgLTc2MCw3ICs3NjAsNiBAQAogI2RlZmluZSBNQVhfU1VQUE9SVEVEX01VTFRJQ0FTVFMgTUFYX01BQ19TVVBQT1JURUQKIAogCXN0cnVjdCBtYWNfYWRkciBkZWZfbWFjX2FkZHJbTUFYX01BQ19TVVBQT1JURURdOwotCXN0cnVjdCBtYWNfYWRkciBwcmVfbWFjX2FkZHJbTUFYX01BQ19TVVBQT1JURURdOwogCiAJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CiAJaW50IGhpZ2hfZG1hX2ZsYWc7CkBAIC03OTQsMTEgKzc5Myw2IEBACiAJdTE2IGFsbF9tdWx0aV9wb3M7CiAJdTE2IHByb21pc2NfZmxnOwogCi0JdTE2IHR4X3BrdF9jb3VudDsKLQl1MTYgcnhfcGt0X2NvdW50OwotCXUxNiB0eF9lcnJfY291bnQ7Ci0JdTE2IHJ4X2Vycl9jb3VudDsKLQogCS8qICBJZCB0aW1lciwgdXNlZCB0byBibGluayBOSUMgdG8gcGh5c2ljYWxseSBpZGVudGlmeSBOSUMuICovCiAJc3RydWN0IHRpbWVyX2xpc3QgaWRfdGltZXI7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NhYTk3MzAuYyBiL2RyaXZlcnMvbmV0L3NhYTk3MzAuYwppbmRleCAxNDM5NThmLi5hZDk0MzU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zYWE5NzMwLmMKKysrIGIvZHJpdmVycy9uZXQvc2FhOTczMC5jCkBAIC02ODgsNyArNjg4LDYgQEAKIAkJCX0gZWxzZSB7CiAJCQkJbHAtPnN0YXRzLnJ4X2J5dGVzICs9IGxlbjsKIAkJCQlscC0+c3RhdHMucnhfcGFja2V0cysrOwotCQkJCXNrYi0+ZGV2ID0gZGV2OwogCQkJCXNrYl9yZXNlcnZlKHNrYiwgMik7CS8qIDE2IGJ5dGUgYWxpZ24gKi8KIAkJCQlza2JfcHV0KHNrYiwgbGVuKTsJLyogbWFrZSByb29tICovCiAJCQkJZXRoX2NvcHlfYW5kX3N1bShza2IsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zYjEwMDAuYyBiL2RyaXZlcnMvbmV0L3NiMTAwMC5jCmluZGV4IGI5ZmE0ZmIuLjFkZTNlZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NiMTAwMC5jCisrKyBiL2RyaXZlcnMvbmV0L3NiMTAwMC5jCkBAIC04MzQsNyArODM0LDcgQEAKIAkJCWdvdG8gZHJvcHBlZF9mcmFtZTsKIAkJfQogCQlza2ItPmRldiA9IGRldjsKLQkJc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOworCQlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwogCQlza2ItPnByb3RvY29sID0gKHVuc2lnbmVkIHNob3J0KSBidWZmZXJbTmV3RGF0YWdyYW1IZWFkZXJTa2lwICsgMTZdOwogCQlpbnN3KGlvYWRkciwgc2tiX3B1dChza2IsIE5ld0RhdGFncmFtRGF0YVNpemUpLAogCQkJTmV3RGF0YWdyYW1EYXRhU2l6ZSAvIDIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2IxMjUwLW1hYy5jIGIvZHJpdmVycy9uZXQvc2IxMjUwLW1hYy5jCmluZGV4IDEwM2MzMTcuLjEzMmUyMTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NiMTI1MC1tYWMuYworKysgYi9kcml2ZXJzL25ldC9zYjEyNTAtbWFjLmMKQEAgLTk1LDE5ICs5NSwyOCBAQAogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfU0JNQUNfQ09BTEVTQ0UKLXN0YXRpYyBpbnQgaW50X3BrdGNudCA9IDA7Ci1tb2R1bGVfcGFyYW0oaW50X3BrdGNudCwgaW50LCBTX0lSVUdPKTsKLU1PRFVMRV9QQVJNX0RFU0MoaW50X3BrdGNudCwgIlBhY2tldCBjb3VudCIpOworc3RhdGljIGludCBpbnRfcGt0Y250X3R4ID0gMjU1OworbW9kdWxlX3BhcmFtKGludF9wa3RjbnRfdHgsIGludCwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKGludF9wa3RjbnRfdHgsICJUWCBwYWNrZXQgY291bnQiKTsKIAotc3RhdGljIGludCBpbnRfdGltZW91dCA9IDA7Ci1tb2R1bGVfcGFyYW0oaW50X3RpbWVvdXQsIGludCwgU19JUlVHTyk7Ci1NT0RVTEVfUEFSTV9ERVNDKGludF90aW1lb3V0LCAiVGltZW91dCB2YWx1ZSIpOworc3RhdGljIGludCBpbnRfdGltZW91dF90eCA9IDI1NTsKK21vZHVsZV9wYXJhbShpbnRfdGltZW91dF90eCwgaW50LCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0MoaW50X3RpbWVvdXRfdHgsICJUWCB0aW1lb3V0IHZhbHVlIik7CisKK3N0YXRpYyBpbnQgaW50X3BrdGNudF9yeCA9IDY0OworbW9kdWxlX3BhcmFtKGludF9wa3RjbnRfcngsIGludCwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKGludF9wa3RjbnRfcngsICJSWCBwYWNrZXQgY291bnQiKTsKKworc3RhdGljIGludCBpbnRfdGltZW91dF9yeCA9IDY0OworbW9kdWxlX3BhcmFtKGludF90aW1lb3V0X3J4LCBpbnQsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhpbnRfdGltZW91dF9yeCwgIlJYIHRpbWVvdXQgdmFsdWUiKTsKICNlbmRpZgogCiAjaW5jbHVkZSA8YXNtL3NpYnl0ZS9zYjEyNTAuaD4KICNpZiBkZWZpbmVkKENPTkZJR19TSUJZVEVfQkNNMXg1NSkgfHwgZGVmaW5lZChDT05GSUdfU0lCWVRFX0JDTTF4ODApCiAjaW5jbHVkZSA8YXNtL3NpYnl0ZS9iY20xNDgwX3JlZ3MuaD4KICNpbmNsdWRlIDxhc20vc2lieXRlL2JjbTE0ODBfaW50Lmg+CisjZGVmaW5lIFJfTUFDX0RNQV9PT0RQS1RMT1NUX1JYCVJfTUFDX0RNQV9PT0RQS1RMT1NUCiAjZWxpZiBkZWZpbmVkKENPTkZJR19TSUJZVEVfU0IxMjUwKSB8fCBkZWZpbmVkKENPTkZJR19TSUJZVEVfQkNNMTEyWCkKICNpbmNsdWRlIDxhc20vc2lieXRlL3NiMTI1MF9yZWdzLmg+CiAjaW5jbHVkZSA8YXNtL3NpYnl0ZS9zYjEyNTBfaW50Lmg+CkBAIC0xNTUsOCArMTY0LDggQEAKIAogI2RlZmluZSBOVU1DQUNIRUJMS1MoeCkgKCgoeCkrU01QX0NBQ0hFX0JZVEVTLTEpL1NNUF9DQUNIRV9CWVRFUykKIAotI2RlZmluZSBTQk1BQ19NQVhfVFhERVNDUgkzMgotI2RlZmluZSBTQk1BQ19NQVhfUlhERVNDUgkzMgorI2RlZmluZSBTQk1BQ19NQVhfVFhERVNDUgkyNTYKKyNkZWZpbmUgU0JNQUNfTUFYX1JYREVTQ1IJMjU2CiAKICNkZWZpbmUgRVRIRVJfQUxJR04JMgogI2RlZmluZSBFVEhFUl9BRERSX0xFTgk2CkBAIC0xODUsMTAgKzE5NCwxMCBAQAogCSAqIGFzc29jaWF0ZWQgd2l0aCBpdC4KIAkgKi8KIAotCXN0cnVjdCBzYm1hY19zb2Z0YyAqc2JkbWFfZXRoOwkgICAgICAgIC8qIGJhY2sgcG9pbnRlciB0byBhc3NvY2lhdGVkIE1BQyAqLwotCWludCAgICAgICAgICAgICAgc2JkbWFfY2hhbm5lbDsJLyogY2hhbm5lbCBudW1iZXIgKi8KKwlzdHJ1Y3Qgc2JtYWNfc29mdGMgKnNiZG1hX2V0aDsJICAgIC8qIGJhY2sgcG9pbnRlciB0byBhc3NvY2lhdGVkIE1BQyAqLworCWludCAgICAgICAgICAgICAgc2JkbWFfY2hhbm5lbDsJICAgIC8qIGNoYW5uZWwgbnVtYmVyICovCiAJaW50CQkgc2JkbWFfdHhkaXI7ICAgICAgIC8qIGRpcmVjdGlvbiAoMT10cmFuc21pdCkgKi8KLQlpbnQJCSBzYmRtYV9tYXhkZXNjcjsJLyogdG90YWwgIyBvZiBkZXNjcmlwdG9ycyBpbiByaW5nICovCisJaW50CQkgc2JkbWFfbWF4ZGVzY3I7ICAgIC8qIHRvdGFsICMgb2YgZGVzY3JpcHRvcnMgaW4gcmluZyAqLwogI2lmZGVmIENPTkZJR19TQk1BQ19DT0FMRVNDRQogCWludAkJIHNiZG1hX2ludF9wa3RjbnQ7ICAvKiAjIGRlc2NyaXB0b3JzIHJ4L3R4IGJlZm9yZSBpbnRlcnJ1cHQqLwogCWludAkJIHNiZG1hX2ludF90aW1lb3V0OyAvKiAjIHVzZWMgcngvdHggaW50ZXJydXB0ICovCkBAIC0xOTcsMTMgKzIwNiwxNiBAQAogCXZvbGF0aWxlIHZvaWQgX19pb21lbSAqc2JkbWFfY29uZmlnMDsJLyogRE1BIGNvbmZpZyByZWdpc3RlciAwICovCiAJdm9sYXRpbGUgdm9pZCBfX2lvbWVtICpzYmRtYV9jb25maWcxOwkvKiBETUEgY29uZmlnIHJlZ2lzdGVyIDEgKi8KIAl2b2xhdGlsZSB2b2lkIF9faW9tZW0gKnNiZG1hX2RzY3JiYXNlOwkvKiBEZXNjcmlwdG9yIGJhc2UgYWRkcmVzcyAqLwotCXZvbGF0aWxlIHZvaWQgX19pb21lbSAqc2JkbWFfZHNjcmNudDsgICAgIC8qIERlc2NyaXB0b3IgY291bnQgcmVnaXN0ZXIgKi8KKwl2b2xhdGlsZSB2b2lkIF9faW9tZW0gKnNiZG1hX2RzY3JjbnQ7ICAgLyogRGVzY3JpcHRvciBjb3VudCByZWdpc3RlciAqLwogCXZvbGF0aWxlIHZvaWQgX19pb21lbSAqc2JkbWFfY3VyZHNjcjsJLyogY3VycmVudCBkZXNjcmlwdG9yIGFkZHJlc3MgKi8KKwl2b2xhdGlsZSB2b2lkIF9faW9tZW0gKnNiZG1hX29vZHBrdGxvc3Q7LyogcGt0IGRyb3AgKHJ4IG9ubHkpICovCisKIAogCS8qCiAJICogVGhpcyBzdHVmZiBpcyBmb3IgbWFpbnRlbmFuY2Ugb2YgdGhlIHJpbmcKIAkgKi8KIAorCXNiZG1hZHNjcl90ICAgICAqc2JkbWFfZHNjcnRhYmxlX3VuYWxpZ25lZDsKIAlzYmRtYWRzY3JfdCAgICAgKnNiZG1hX2RzY3J0YWJsZTsJLyogYmFzZSBvZiBkZXNjcmlwdG9yIHRhYmxlICovCiAJc2JkbWFkc2NyX3QgICAgICpzYmRtYV9kc2NydGFibGVfZW5kOyAvKiBlbmQgb2YgZGVzY3JpcHRvciB0YWJsZSAqLwogCkBAIC0yODYsOCArMjk4LDggQEAKIHN0YXRpYyBpbnQgc2JkbWFfYWRkX3R4YnVmZmVyKHNibWFjZG1hX3QgKmQsc3RydWN0IHNrX2J1ZmYgKm0pOwogc3RhdGljIHZvaWQgc2JkbWFfZW1wdHlyaW5nKHNibWFjZG1hX3QgKmQpOwogc3RhdGljIHZvaWQgc2JkbWFfZmlsbHJpbmcoc2JtYWNkbWFfdCAqZCk7Ci1zdGF0aWMgdm9pZCBzYmRtYV9yeF9wcm9jZXNzKHN0cnVjdCBzYm1hY19zb2Z0YyAqc2Msc2JtYWNkbWFfdCAqZCk7Ci1zdGF0aWMgdm9pZCBzYmRtYV90eF9wcm9jZXNzKHN0cnVjdCBzYm1hY19zb2Z0YyAqc2Msc2JtYWNkbWFfdCAqZCk7CitzdGF0aWMgaW50IHNiZG1hX3J4X3Byb2Nlc3Moc3RydWN0IHNibWFjX3NvZnRjICpzYyxzYm1hY2RtYV90ICpkLCBpbnQgd29ya190b19kbywgaW50IHBvbGwpOworc3RhdGljIHZvaWQgc2JkbWFfdHhfcHJvY2VzcyhzdHJ1Y3Qgc2JtYWNfc29mdGMgKnNjLHNibWFjZG1hX3QgKmQsIGludCBwb2xsKTsKIHN0YXRpYyBpbnQgc2JtYWNfaW5pdGN0eChzdHJ1Y3Qgc2JtYWNfc29mdGMgKnMpOwogc3RhdGljIHZvaWQgc2JtYWNfY2hhbm5lbF9zdGFydChzdHJ1Y3Qgc2JtYWNfc29mdGMgKnMpOwogc3RhdGljIHZvaWQgc2JtYWNfY2hhbm5lbF9zdG9wKHN0cnVjdCBzYm1hY19zb2Z0YyAqcyk7CkBAIC0zMDgsNiArMzIwLDggQEAKIHN0YXRpYyB2b2lkIHNibWFjX3NldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogc3RhdGljIGludCBzYm1hY19taWlfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCk7CiBzdGF0aWMgaW50IHNibWFjX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzYm1hY19wb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpwb2xsX2RldiwgaW50ICpidWRnZXQpOworCiBzdGF0aWMgaW50IHNibWFjX21paV9wb2xsKHN0cnVjdCBzYm1hY19zb2Z0YyAqcyxpbnQgbm9pc3kpOwogc3RhdGljIGludCBzYm1hY19taWlfcHJvYmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiAKQEAgLTY3OSw2ICs2OTMsMTAgQEAKIAkJCSAgaW50IHR4cngsCiAJCQkgIGludCBtYXhkZXNjcikKIHsKKyNpZmRlZiBDT05GSUdfU0JNQUNfQ09BTEVTQ0UKKwlpbnQgaW50X3BrdGNudCwgaW50X3RpbWVvdXQ7CisjZW5kaWYKKwogCS8qCiAJICogU2F2ZSBhd2F5IGludGVyZXN0aW5nIHN0dWZmIGluIHRoZSBzdHJ1Y3R1cmUKIAkgKi8KQEAgLTcyOCw2ICs3NDYsMTEgQEAKIAkJcy0+c2JtX2Jhc2UgKyBSX01BQ19ETUFfUkVHSVNURVIodHhyeCxjaGFuLFJfTUFDX0RNQV9EU0NSX0NOVCk7CiAJZC0+c2JkbWFfY3VyZHNjciA9CiAJCXMtPnNibV9iYXNlICsgUl9NQUNfRE1BX1JFR0lTVEVSKHR4cngsY2hhbixSX01BQ19ETUFfQ1VSX0RTQ1JBRERSKTsKKwlpZiAoZC0+c2JkbWFfdHhkaXIpCisJCWQtPnNiZG1hX29vZHBrdGxvc3QgPSBOVUxMOworCWVsc2UKKwkJZC0+c2JkbWFfb29kcGt0bG9zdCA9CisJCQlzLT5zYm1fYmFzZSArIFJfTUFDX0RNQV9SRUdJU1RFUih0eHJ4LGNoYW4sUl9NQUNfRE1BX09PRFBLVExPU1RfUlgpOwogCiAJLyoKIAkgKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSByaW5nCkBAIC03MzUsNiArNzU4LDcgQEAKIAogCWQtPnNiZG1hX21heGRlc2NyID0gbWF4ZGVzY3I7CiAKKwlkLT5zYmRtYV9kc2NydGFibGVfdW5hbGlnbmVkID0KIAlkLT5zYmRtYV9kc2NydGFibGUgPSAoc2JkbWFkc2NyX3QgKikKIAkJa21hbGxvYygoZC0+c2JkbWFfbWF4ZGVzY3IrMSkqc2l6ZW9mKHNiZG1hZHNjcl90KSwgR0ZQX0tFUk5FTCk7CiAKQEAgLTc2NSwxMiArNzg5LDE0IEBACiAJICogU2V0dXAgUngvVHggRE1BIGNvYWxlc2NpbmcgZGVmYXVsdHMKIAkgKi8KIAorCWludF9wa3RjbnQgPSAodHhyeCA9PSBETUFfVFgpID8gaW50X3BrdGNudF90eCA6IGludF9wa3RjbnRfcng7CiAJaWYgKCBpbnRfcGt0Y250ICkgewogCQlkLT5zYmRtYV9pbnRfcGt0Y250ID0gaW50X3BrdGNudDsKIAl9IGVsc2UgewogCQlkLT5zYmRtYV9pbnRfcGt0Y250ID0gMTsKIAl9CiAKKwlpbnRfdGltZW91dCA9ICh0eHJ4ID09IERNQV9UWCkgPyBpbnRfdGltZW91dF90eCA6IGludF90aW1lb3V0X3J4OwogCWlmICggaW50X3RpbWVvdXQgKSB7CiAJCWQtPnNiZG1hX2ludF90aW1lb3V0ID0gaW50X3RpbWVvdXQ7CiAJfSBlbHNlIHsKQEAgLTkzMyw5ICs5NTksNiBAQAogCQl9CiAKIAkJc2JkbWFfYWxpZ25fc2tiKHNiX25ldywgU01QX0NBQ0hFX0JZVEVTLCBFVEhFUl9BTElHTik7Ci0KLQkJLyogbWFyayBza2J1ZmYgb3duZWQgYnkgb3VyIGRldmljZSAqLwotCQlzYl9uZXctPmRldiA9IGQtPnNiZG1hX2V0aC0+c2JtX2RldjsKIAl9CiAJZWxzZSB7CiAJCXNiX25ldyA9IHNiOwpAQCAtMTEyOCwzMiArMTE1MSw2MyBAQAogCX0KIH0KIAorI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCitzdGF0aWMgdm9pZCBzYm1hY19uZXRwb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IHNibWFjX3NvZnRjICpzYyA9IG5ldGRldl9wcml2KG5ldGRldik7CisJaW50IGlycSA9IHNjLT5zYm1fZGV2LT5pcnE7CisKKwlfX3Jhd193cml0ZXEoMCwgc2MtPnNibV9pbXIpOworCisJc2JtYWNfaW50cihpcnEsIG5ldGRldiwgTlVMTCk7CisKKyNpZmRlZiBDT05GSUdfU0JNQUNfQ09BTEVTQ0UKKwlfX3Jhd193cml0ZXEoKChNX01BQ19JTlRfRU9QX0NPVU5UIHwgTV9NQUNfSU5UX0VPUF9USU1FUikgPDwgU19NQUNfVFhfQ0gwKSB8CisJKChNX01BQ19JTlRfRU9QX0NPVU5UIHwgTV9NQUNfSU5UX0VPUF9USU1FUikgPDwgU19NQUNfUlhfQ0gwKSwKKwlzYy0+c2JtX2ltcik7CisjZWxzZQorCV9fcmF3X3dyaXRlcSgoTV9NQUNfSU5UX0NIQU5ORUwgPDwgU19NQUNfVFhfQ0gwKSB8IAorCShNX01BQ19JTlRfQ0hBTk5FTCA8PCBTX01BQ19SWF9DSDApLCBzYy0+c2JtX2ltcik7CisjZW5kaWYKK30KKyNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIFNCRE1BX1JYX1BST0NFU1Moc2MsZCkKKyAqICBTQkRNQV9SWF9QUk9DRVNTKHNjLGQsd29ya190b19kbyxwb2xsKQogICoKICAqICBQcm9jZXNzICJjb21wbGV0ZWQiIHJlY2VpdmUgYnVmZmVycyBvbiB0aGUgc3BlY2lmaWVkIERNQSBjaGFubmVsLgotICogIE5vdGUgdGhhdCB0aGlzIGlzbid0IHJlYWxseSBpZGVhbCBmb3IgcHJpb3JpdHkgY2hhbm5lbHMsIHNpbmNlCi0gKiAgaXQgcHJvY2Vzc2VzIGFsbCBvZiB0aGUgcGFja2V0cyBvbiBhIGdpdmVuIGNoYW5uZWwgYmVmb3JlCi0gKiAgcmV0dXJuaW5nLgogICoKICAqICBJbnB1dCBwYXJhbWV0ZXJzOgotICoJICAgc2MgLSBzb2Z0YyBzdHJ1Y3R1cmUKLSAqICAJICAgZCAtIERNQSBjaGFubmVsIGNvbnRleHQKKyAqICAgICAgICAgICAgc2MgLSBzb2Z0YyBzdHJ1Y3R1cmUKKyAqICAJICAgICAgIGQgLSBETUEgY2hhbm5lbCBjb250ZXh0CisgKiAgICB3b3JrX3RvX2RvIC0gbm8uIG9mIHBhY2tldHMgdG8gcHJvY2VzcyBiZWZvcmUgZW5hYmxpbmcgaW50ZXJydXB0CisgKiAgICAgICAgICAgICAgICAgYWdhaW4gKGZvciBOQVBJKQorICogICAgICAgICAgcG9sbCAtIDE6IHVzaW5nIHBvbGxpbmcgKGZvciBOQVBJKQogICoKICAqICBSZXR1cm4gdmFsdWU6CiAgKiAgCSAgIG5vdGhpbmcKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KIAotc3RhdGljIHZvaWQgc2JkbWFfcnhfcHJvY2VzcyhzdHJ1Y3Qgc2JtYWNfc29mdGMgKnNjLHNibWFjZG1hX3QgKmQpCitzdGF0aWMgaW50IHNiZG1hX3J4X3Byb2Nlc3Moc3RydWN0IHNibWFjX3NvZnRjICpzYyxzYm1hY2RtYV90ICpkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd29ya190b19kbywgaW50IHBvbGwpCiB7CiAJaW50IGN1cmlkeDsKIAlpbnQgaHdpZHg7CiAJc2JkbWFkc2NyX3QgKmRzYzsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2I7CiAJaW50IGxlbjsKKwlpbnQgd29ya19kb25lID0gMDsKKwlpbnQgZHJvcHBlZCA9IDA7CiAKLQlmb3IgKDs7KSB7CisJcHJlZmV0Y2goZCk7CisKK2FnYWluOgorCS8qIENoZWNrIGlmIHRoZSBIVyBkcm9wcGVkIGFueSBmcmFtZXMgKi8KKwlzYy0+c2JtX3N0YXRzLnJ4X2ZpZm9fZXJyb3JzCisJICAgICs9IF9fcmF3X3JlYWRxKHNjLT5zYm1fcnhkbWEuc2JkbWFfb29kcGt0bG9zdCkgJiAweGZmZmY7CisJX19yYXdfd3JpdGVxKDAsIHNjLT5zYm1fcnhkbWEuc2JkbWFfb29kcGt0bG9zdCk7CisKKwl3aGlsZSAod29ya190b19kby0tID4gMCkgewogCQkvKgogCQkgKiBmaWd1cmUgb3V0IHdoZXJlIHdlIGFyZSAoYXMgYW4gaW5kZXgpIGFuZCB3aGVyZQogCQkgKiB0aGUgaGFyZHdhcmUgaXMgKGFsc28gYXMgYW4gaW5kZXgpCkBAIC0xMTY1LDcgKzEyMTksMTIgQEAKIAkJICogKHNiZG1hX3JlbXB0cikgYW5kIHRoZSBwaHlzaWNhbCBhZGRyZXNzIChzYmRtYV9jdXJkc2NyIENTUikKIAkJICovCiAKLQkJY3VyaWR4ID0gZC0+c2JkbWFfcmVtcHRyIC0gZC0+c2JkbWFfZHNjcnRhYmxlOworCQlkc2MgPSBkLT5zYmRtYV9yZW1wdHI7CisJCWN1cmlkeCA9IGRzYyAtIGQtPnNiZG1hX2RzY3J0YWJsZTsKKworCQlwcmVmZXRjaChkc2MpOworCQlwcmVmZXRjaCgmZC0+c2JkbWFfY3R4dGFibGVbY3VyaWR4XSk7CisKIAkJaHdpZHggPSAoaW50KSAoKChfX3Jhd19yZWFkcShkLT5zYmRtYV9jdXJkc2NyKSAmIE1fRE1BX0NVUkRTQ1JfQUREUikgLQogCQkJCWQtPnNiZG1hX2RzY3J0YWJsZV9waHlzKSAvIHNpemVvZihzYmRtYWRzY3JfdCkpOwogCkBAIC0xMTc2LDEzICsxMjM1LDEyIEBACiAJCSAqLwogCiAJCWlmIChjdXJpZHggPT0gaHdpZHgpCi0JCQlicmVhazsKKwkJCWdvdG8gZG9uZTsKIAogCQkvKgogCQkgKiBPdGhlcndpc2UsIGdldCB0aGUgcGFja2V0J3Mgc2tfYnVmZiBwdHIgYmFjawogCQkgKi8KIAotCQlkc2MgPSAmKGQtPnNiZG1hX2RzY3J0YWJsZVtjdXJpZHhdKTsKIAkJc2IgPSBkLT5zYmRtYV9jdHh0YWJsZVtjdXJpZHhdOwogCQlkLT5zYmRtYV9jdHh0YWJsZVtjdXJpZHhdID0gTlVMTDsKIApAQCAtMTE5NCw3ICsxMjUyLDcgQEAKIAkJICogcmVjZWl2ZSByaW5nLgogCQkgKi8KIAotCQlpZiAoIShkc2MtPmRzY3JfYSAmIE1fRE1BX0VUSFJYX0JBRCkpIHsKKwkJaWYgKGxpa2VseSAoIShkc2MtPmRzY3JfYSAmIE1fRE1BX0VUSFJYX0JBRCkpKSB7CiAKIAkJCS8qCiAJCQkgKiBBZGQgYSBuZXcgYnVmZmVyIHRvIHJlcGxhY2UgdGhlIG9sZCBvbmUuICBJZiB3ZSBmYWlsCkBAIC0xMjAyLDkgKzEyNjAsMTQgQEAKIAkJCSAqIHBhY2tldCBhbmQgcHV0IGl0IHJpZ2h0IGJhY2sgb24gdGhlIHJlY2VpdmUgcmluZy4KIAkJCSAqLwogCi0JCQlpZiAoc2JkbWFfYWRkX3JjdmJ1ZmZlcihkLE5VTEwpID09IC1FTk9CVUZTKSB7Ci0JCQkJc2MtPnNibV9zdGF0cy5yeF9kcm9wcGVkKys7CisJCQlpZiAodW5saWtlbHkgKHNiZG1hX2FkZF9yY3ZidWZmZXIoZCxOVUxMKSA9PQorCQkJCSAgICAgIC1FTk9CVUZTKSkgeworIAkJCQlzYy0+c2JtX3N0YXRzLnJ4X2Ryb3BwZWQrKzsKIAkJCQlzYmRtYV9hZGRfcmN2YnVmZmVyKGQsc2IpOyAvKiByZS1hZGQgb2xkIGJ1ZmZlciAqLworCQkJCS8qIE5vIHBvaW50IGluIGNvbnRpbnVpbmcgYXQgdGhlIG1vbWVudCAqLworCQkJCXByaW50ayhLRVJOX0VSUiAiZHJvcHBlZCBwYWNrZXQgKDEpXG4iKTsKKwkJCQlkLT5zYmRtYV9yZW1wdHIgPSBTQkRNQV9ORVhUQlVGKGQsc2JkbWFfcmVtcHRyKTsKKwkJCQlnb3RvIGRvbmU7CiAJCQl9IGVsc2UgewogCQkJCS8qCiAJCQkJICogU2V0IGxlbmd0aCBpbnRvIHRoZSBwYWNrZXQKQEAgLTEyMTYsOCArMTI3OSw2IEBACiAJCQkJICogcmVjZWl2ZSByaW5nLiAgUGFzcyB0aGUgYnVmZmVyIHRvCiAJCQkJICogdGhlIGtlcm5lbAogCQkJCSAqLwotCQkJCXNjLT5zYm1fc3RhdHMucnhfYnl0ZXMgKz0gbGVuOwotCQkJCXNjLT5zYm1fc3RhdHMucnhfcGFja2V0cysrOwogCQkJCXNiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNiLGQtPnNiZG1hX2V0aC0+c2JtX2Rldik7CiAJCQkJLyogQ2hlY2sgaHcgSVB2NC9UQ1AgY2hlY2tzdW0gaWYgc3VwcG9ydGVkICovCiAJCQkJaWYgKHNjLT5yeF9od19jaGVja3N1bSA9PSBFTkFCTEUpIHsKQEAgLTEyMjksOCArMTI5MCwyMiBAQAogCQkJCQkJc2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CiAJCQkJCX0KIAkJCQl9CisJCQkJcHJlZmV0Y2goc2ItPmRhdGEpOworCQkJCXByZWZldGNoKChjb25zdCB2b2lkICopKCgoY2hhciAqKXNiLT5kYXRhKSszMikpOworCQkJCWlmIChwb2xsKQorCQkJCQlkcm9wcGVkID0gbmV0aWZfcmVjZWl2ZV9za2Ioc2IpOworCQkJCWVsc2UKKwkJCQkJZHJvcHBlZCA9IG5ldGlmX3J4KHNiKTsKIAotCQkJCW5ldGlmX3J4KHNiKTsKKwkJCQlpZiAoZHJvcHBlZCA9PSBORVRfUlhfRFJPUCkgeworCQkJCQlzYy0+c2JtX3N0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCQkJZC0+c2JkbWFfcmVtcHRyID0gU0JETUFfTkVYVEJVRihkLHNiZG1hX3JlbXB0cik7CisJCQkJCWdvdG8gZG9uZTsKKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCXNjLT5zYm1fc3RhdHMucnhfYnl0ZXMgKz0gbGVuOworCQkJCQlzYy0+c2JtX3N0YXRzLnJ4X3BhY2tldHMrKzsKKwkJCQl9CiAJCQl9CiAJCX0gZWxzZSB7CiAJCQkvKgpAQCAtMTI0NywxMiArMTMyMiwxNiBAQAogCQkgKi8KIAogCQlkLT5zYmRtYV9yZW1wdHIgPSBTQkRNQV9ORVhUQlVGKGQsc2JkbWFfcmVtcHRyKTsKLQorCQl3b3JrX2RvbmUrKzsKIAl9CisJaWYgKCFwb2xsKSB7CisJCXdvcmtfdG9fZG8gPSAzMjsKKwkJZ290byBhZ2FpbjsgLyogY29sbGVjdCBmaWZvIGRyb3Agc3RhdGlzdGljcyBhZ2FpbiAqLworCX0KK2RvbmU6CisJcmV0dXJuIHdvcmtfZG9uZTsKIH0KIAotCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgU0JETUFfVFhfUFJPQ0VTUyhzYyxkKQogICoKQEAgLTEyNjQsMjIgKzEzNDMsMzAgQEAKICAqCiAgKiAgSW5wdXQgcGFyYW1ldGVyczoKICAqICAgICAgc2MgLSBzb2Z0YyBzdHJ1Y3R1cmUKLSAqICAJICAgZCAtIERNQSBjaGFubmVsIGNvbnRleHQKKyAqICAJIGQgLSBETUEgY2hhbm5lbCBjb250ZXh0CisgKiAgICBwb2xsIC0gMTogdXNpbmcgcG9sbGluZyAoZm9yIE5BUEkpCiAgKgogICogIFJldHVybiB2YWx1ZToKICAqICAJICAgbm90aGluZwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwogCi1zdGF0aWMgdm9pZCBzYmRtYV90eF9wcm9jZXNzKHN0cnVjdCBzYm1hY19zb2Z0YyAqc2Msc2JtYWNkbWFfdCAqZCkKK3N0YXRpYyB2b2lkIHNiZG1hX3R4X3Byb2Nlc3Moc3RydWN0IHNibWFjX3NvZnRjICpzYyxzYm1hY2RtYV90ICpkLCBpbnQgcG9sbCkKIHsKIAlpbnQgY3VyaWR4OwogCWludCBod2lkeDsKIAlzYmRtYWRzY3JfdCAqZHNjOwogCXN0cnVjdCBza19idWZmICpzYjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBwYWNrZXRzX2hhbmRsZWQgPSAwOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJihzYy0+c2JtX2xvY2spLCBmbGFncyk7CiAKKwlpZiAoZC0+c2JkbWFfcmVtcHRyID09IGQtPnNiZG1hX2FkZHB0cikKKwkgIGdvdG8gZW5kX3VubG9jazsKKworCWh3aWR4ID0gKGludCkgKCgoX19yYXdfcmVhZHEoZC0+c2JkbWFfY3VyZHNjcikgJiBNX0RNQV9DVVJEU0NSX0FERFIpIC0KKwkJCWQtPnNiZG1hX2RzY3J0YWJsZV9waHlzKSAvIHNpemVvZihzYmRtYWRzY3JfdCkpOworCiAJZm9yICg7OykgewogCQkvKgogCQkgKiBmaWd1cmUgb3V0IHdoZXJlIHdlIGFyZSAoYXMgYW4gaW5kZXgpIGFuZCB3aGVyZQpAQCAtMTI5Myw4ICsxMzgwLDYgQEAKIAkJICovCiAKIAkJY3VyaWR4ID0gZC0+c2JkbWFfcmVtcHRyIC0gZC0+c2JkbWFfZHNjcnRhYmxlOwotCQlod2lkeCA9IChpbnQpICgoKF9fcmF3X3JlYWRxKGQtPnNiZG1hX2N1cmRzY3IpICYgTV9ETUFfQ1VSRFNDUl9BRERSKSAtCi0JCQkJZC0+c2JkbWFfZHNjcnRhYmxlX3BoeXMpIC8gc2l6ZW9mKHNiZG1hZHNjcl90KSk7CiAKIAkJLyoKIAkJICogSWYgdGhleSdyZSB0aGUgc2FtZSwgdGhhdCBtZWFucyB3ZSd2ZSBwcm9jZXNzZWQgYWxsCkBAIC0xMzMyLDYgKzE0MTcsOCBAQAogCiAJCWQtPnNiZG1hX3JlbXB0ciA9IFNCRE1BX05FWFRCVUYoZCxzYmRtYV9yZW1wdHIpOwogCisJCXBhY2tldHNfaGFuZGxlZCsrOworCiAJfQogCiAJLyoKQEAgLTEzNDAsOCArMTQyNywxMCBAQAogCSAqIHdhdGVybWFyayBvbiB0aGUgdHJhbnNtaXQgcXVldWUuCiAJICovCiAKLQluZXRpZl93YWtlX3F1ZXVlKGQtPnNiZG1hX2V0aC0+c2JtX2Rldik7CisJaWYgKHBhY2tldHNfaGFuZGxlZCkKKwkJbmV0aWZfd2FrZV9xdWV1ZShkLT5zYmRtYV9ldGgtPnNibV9kZXYpOwogCitlbmRfdW5sb2NrOgogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJihzYy0+c2JtX2xvY2spLCBmbGFncyk7CiAKIH0KQEAgLTE0MTUsOSArMTUwNCw5IEBACiAKIHN0YXRpYyB2b2lkIHNiZG1hX3VuaW5pdGN0eChzdHJ1Y3Qgc2JtYWNkbWFfcyAqZCkKIHsKLQlpZiAoZC0+c2JkbWFfZHNjcnRhYmxlKSB7Ci0JCWtmcmVlKGQtPnNiZG1hX2RzY3J0YWJsZSk7Ci0JCWQtPnNiZG1hX2RzY3J0YWJsZSA9IE5VTEw7CisJaWYgKGQtPnNiZG1hX2RzY3J0YWJsZV91bmFsaWduZWQpIHsKKwkJa2ZyZWUoZC0+c2JkbWFfZHNjcnRhYmxlX3VuYWxpZ25lZCk7CisJCWQtPnNiZG1hX2RzY3J0YWJsZV91bmFsaWduZWQgPSBkLT5zYmRtYV9kc2NydGFibGUgPSBOVUxMOwogCX0KIAogCWlmIChkLT5zYmRtYV9jdHh0YWJsZSkgewpAQCAtMTYxNSwxNSArMTcwNCw5IEBACiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19TQk1BQ19DT0FMRVNDRQotCS8qCi0JICogQWNjZXB0IGFueSBUWCBpbnRlcnJ1cHQgYW5kIEVPUCBjb3VudC90aW1lciBSWCBpbnRlcnJ1cHRzIG9uIGNoIDAKLQkgKi8KIAlfX3Jhd193cml0ZXEoKChNX01BQ19JTlRfRU9QX0NPVU5UIHwgTV9NQUNfSU5UX0VPUF9USU1FUikgPDwgU19NQUNfVFhfQ0gwKSB8CiAJCSAgICAgICAoKE1fTUFDX0lOVF9FT1BfQ09VTlQgfCBNX01BQ19JTlRfRU9QX1RJTUVSKSA8PCBTX01BQ19SWF9DSDApLCBzLT5zYm1faW1yKTsKICNlbHNlCi0JLyoKLQkgKiBBY2NlcHQgYW55IGtpbmQgb2YgaW50ZXJydXB0IG9uIFRYIGFuZCBSWCBETUEgY2hhbm5lbCAwCi0JICovCiAJX19yYXdfd3JpdGVxKChNX01BQ19JTlRfQ0hBTk5FTCA8PCBTX01BQ19UWF9DSDApIHwKIAkJICAgICAgIChNX01BQ19JTlRfQ0hBTk5FTCA8PCBTX01BQ19SWF9DSDApLCBzLT5zYm1faW1yKTsKICNlbmRpZgpAQCAtMjA1Niw1NyArMjEzOSw0NiBAQAogCXVpbnQ2NF90IGlzcjsKIAlpbnQgaGFuZGxlZCA9IDA7CiAKLQlmb3IgKDs7KSB7CisJLyoKKwkgKiBSZWFkIHRoZSBJU1IgKHRoaXMgY2xlYXJzIHRoZSBiaXRzIGluIHRoZSByZWFsCisJICogcmVnaXN0ZXIsIGV4Y2VwdCBmb3IgY291bnRlciBhZGRyKQorCSAqLwogCi0JCS8qCi0JCSAqIFJlYWQgdGhlIElTUiAodGhpcyBjbGVhcnMgdGhlIGJpdHMgaW4gdGhlIHJlYWwKLQkJICogcmVnaXN0ZXIsIGV4Y2VwdCBmb3IgY291bnRlciBhZGRyKQotCQkgKi8KKwlpc3IgPSBfX3Jhd19yZWFkcShzYy0+c2JtX2lzcikgJiB+TV9NQUNfQ09VTlRFUl9BRERSOwogCi0JCWlzciA9IF9fcmF3X3JlYWRxKHNjLT5zYm1faXNyKSAmIH5NX01BQ19DT1VOVEVSX0FERFI7CisJaWYgKGlzciA9PSAwKQorCQlyZXR1cm4gSVJRX1JFVFZBTCgwKTsKKwloYW5kbGVkID0gMTsKIAotCQlpZiAoaXNyID09IDApCi0JCQlicmVhazsKKwkvKgorCSAqIFRyYW5zbWl0cyBvbiBjaGFubmVsIDAKKwkgKi8KIAotCQloYW5kbGVkID0gMTsKLQotCQkvKgotCQkgKiBUcmFuc21pdHMgb24gY2hhbm5lbCAwCi0JCSAqLwotCi0JCWlmIChpc3IgJiAoTV9NQUNfSU5UX0NIQU5ORUwgPDwgU19NQUNfVFhfQ0gwKSkgewotCQkJc2JkbWFfdHhfcHJvY2VzcyhzYywmKHNjLT5zYm1fdHhkbWEpKTsKKwlpZiAoaXNyICYgKE1fTUFDX0lOVF9DSEFOTkVMIDw8IFNfTUFDX1RYX0NIMCkpIHsKKwkJc2JkbWFfdHhfcHJvY2VzcyhzYywmKHNjLT5zYm1fdHhkbWEpLCAwKTsKKyNpZmRlZiBDT05GSUdfTkVUUE9MTF9UUkFQCisJCWlmIChuZXRwb2xsX3RyYXAoKSkgeworCQkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChfX0xJTktfU1RBVEVfWE9GRiwgJmRldi0+c3RhdGUpKQorCQkJCV9fbmV0aWZfc2NoZWR1bGUoZGV2KTsKIAkJfQorI2VuZGlmCisJfQogCi0JCS8qCi0JCSAqIFJlY2VpdmVzIG9uIGNoYW5uZWwgMAotCQkgKi8KLQotCQkvKgotCQkgKiBJdCdzIGltcG9ydGFudCB0byB0ZXN0IGFsbCB0aGUgYml0cyAob3IgYXQgbGVhc3QgdGhlCi0JCSAqIEVPUF9TRUVOIGJpdCkgd2hlbiBkZWNpZGluZyB0byBkbyB0aGUgUlggcHJvY2VzcwotCQkgKiBwYXJ0aWN1bGFybHkgd2hlbiBjb2FsZXNjaW5nLCB0byBtYWtlIHN1cmUgd2UKLQkJICogdGFrZSBjYXJlIG9mIHRoZSBmb2xsb3dpbmc6Ci0JCSAqCi0JCSAqIElmIHlvdSBoYXZlIHNvbWUgcGFja2V0cyB3YWl0aW5nIChoYXZlIGJlZW4gcmVjZWl2ZWQKLQkJICogYnV0IG5vIGludGVycnVwdCkgYW5kIGdldCBhIFRYIGludGVycnVwdCBiZWZvcmUKLQkJICogdGhlIFJYIHRpbWVyIG9yIGNvdW50ZXIgZXhwaXJlcywgcmVhZGluZyB0aGUgSVNSCi0JCSAqIGFib3ZlIHdpbGwgY2xlYXIgdGhlIHRpbWVyIGFuZCBjb3VudGVyLCBhbmQgeW91Ci0JCSAqIHdvbid0IGdldCBhbm90aGVyIGludGVycnVwdCB1bnRpbCBhIHBhY2tldCBzaG93cwotCQkgKiB1cCB0byBzdGFydCB0aGUgdGltZXIgYWdhaW4uICBUZXN0aW5nCi0JCSAqIEVPUF9TRUVOIGhlcmUgdGFrZXMgY2FyZSBvZiB0aGlzIGNhc2UuCi0JCSAqIChFT1BfU0VFTiBpcyBwYXJ0IG9mIE1fTUFDX0lOVF9DSEFOTkVMIDw8IFNfTUFDX1JYX0NIMCkKLQkJICovCi0KLQotCQlpZiAoaXNyICYgKE1fTUFDX0lOVF9DSEFOTkVMIDw8IFNfTUFDX1JYX0NIMCkpIHsKLQkJCXNiZG1hX3J4X3Byb2Nlc3Moc2MsJihzYy0+c2JtX3J4ZG1hKSk7CisJaWYgKGlzciAmIChNX01BQ19JTlRfQ0hBTk5FTCA8PCBTX01BQ19SWF9DSDApKSB7CisJCWlmIChuZXRpZl9yeF9zY2hlZHVsZV9wcmVwKGRldikpIHsKKwkJCV9fcmF3X3dyaXRlcSgwLCBzYy0+c2JtX2ltcik7CisJCQlfX25ldGlmX3J4X3NjaGVkdWxlKGRldik7CisJCQkvKiBEZXBlbmQgb24gdGhlIGV4aXQgZnJvbSBwb2xsIHRvIHJlZW5hYmxlIGludHIgKi8KKwkJfQorCQllbHNlIHsKKwkJCS8qIG1heSBsZWF2ZSBzb21lIHBhY2tldHMgYmVoaW5kICovCisJCQlzYmRtYV9yeF9wcm9jZXNzKHNjLCYoc2MtPnNibV9yeGRtYSksCisJCQkJCSBTQk1BQ19NQVhfUlhERVNDUiAqIDIsIDApOwogCQl9CiAJfQogCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgU0JNQUNfU1RBUlRfVFgoc2tiLGRldikKICAqCkBAIC0yMjM2LDggKzIzMDgsNiBAQAogCX0KIH0KIAotCi0KICNpZiBkZWZpbmVkKFNCTUFDX0VUSDBfSFdBRERSKSB8fCBkZWZpbmVkKFNCTUFDX0VUSDFfSFdBRERSKSB8fCBkZWZpbmVkKFNCTUFDX0VUSDJfSFdBRERSKSB8fCBkZWZpbmVkKFNCTUFDX0VUSDNfSFdBRERSKQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICBTQk1BQ19QQVJTRV9YRElHSVQoc3RyKQpAQCAtMjQwMCw4ICsyNDcwLDEzIEBACiAJZGV2LT5kb19pb2N0bCAgICAgICAgICAgPSBzYm1hY19taWlfaW9jdGw7CiAJZGV2LT50eF90aW1lb3V0ICAgICAgICAgPSBzYm1hY190eF90aW1lb3V0OwogCWRldi0+d2F0Y2hkb2dfdGltZW8gICAgID0gVFhfVElNRU9VVDsKKwlkZXYtPnBvbGwgICAgICAgICAgICAgICA9IHNibWFjX3BvbGw7CisJZGV2LT53ZWlnaHQgICAgICAgICAgICAgPSAxNjsKIAogCWRldi0+Y2hhbmdlX210dSAgICAgICAgID0gc2IxMjUwX2NoYW5nZV9tdHU7CisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKwlkZXYtPnBvbGxfY29udHJvbGxlciA9IHNibWFjX25ldHBvbGw7CisjZW5kaWYKIAogCS8qIFRoaXMgaXMgbmVlZGVkIGZvciBQQVNTMiBmb3IgUnggSC9XIGNoZWNrc3VtIGZlYXR1cmUgKi8KIAlzYm1hY19zZXRfaXBoZHJfb2Zmc2V0KHNjKTsKQEAgLTI3OTksNyArMjg3NCwzOSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHNibWFjX3BvbGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50ICpidWRnZXQpCit7CisJaW50IHdvcmtfdG9fZG87CisJaW50IHdvcmtfZG9uZTsKKwlzdHJ1Y3Qgc2JtYWNfc29mdGMgKnNjID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAorCXdvcmtfdG9fZG8gPSBtaW4oKmJ1ZGdldCwgZGV2LT5xdW90YSk7CisJd29ya19kb25lID0gc2JkbWFfcnhfcHJvY2VzcyhzYywgJihzYy0+c2JtX3J4ZG1hKSwgd29ya190b19kbywgMSk7CisKKwlpZiAod29ya19kb25lID4gd29ya190b19kbykKKwkJcHJpbnRrKEtFUk5fRVJSICIlcyBleGNlZWRlZCB3b3JrX3RvX2RvIGJ1ZGdldD0lZCBxdW90YT0lZCB3b3JrLWRvbmU9JWRcbiIsCisJCSAgICAgICBzYy0+c2JtX2Rldi0+bmFtZSwgKmJ1ZGdldCwgZGV2LT5xdW90YSwgd29ya19kb25lKTsKKworCXNiZG1hX3R4X3Byb2Nlc3Moc2MsICYoc2MtPnNibV90eGRtYSksIDEpOworCisJKmJ1ZGdldCAtPSB3b3JrX2RvbmU7CisJZGV2LT5xdW90YSAtPSB3b3JrX2RvbmU7CisKKwlpZiAod29ya19kb25lIDwgd29ya190b19kbykgeworCQluZXRpZl9yeF9jb21wbGV0ZShkZXYpOworCisjaWZkZWYgQ09ORklHX1NCTUFDX0NPQUxFU0NFCisJCV9fcmF3X3dyaXRlcSgoKE1fTUFDX0lOVF9FT1BfQ09VTlQgfCBNX01BQ19JTlRfRU9QX1RJTUVSKSA8PCBTX01BQ19UWF9DSDApIHwKKwkJCSAgICAgKChNX01BQ19JTlRfRU9QX0NPVU5UIHwgTV9NQUNfSU5UX0VPUF9USU1FUikgPDwgU19NQUNfUlhfQ0gwKSwKKwkJCSAgICAgc2MtPnNibV9pbXIpOworI2Vsc2UKKwkJX19yYXdfd3JpdGVxKChNX01BQ19JTlRfQ0hBTk5FTCA8PCBTX01BQ19UWF9DSDApIHwKKwkJCSAgICAgKE1fTUFDX0lOVF9DSEFOTkVMIDw8IFNfTUFDX1JYX0NIMCksIHNjLT5zYm1faW1yKTsKKyNlbmRpZgorCX0KKworCXJldHVybiAod29ya19kb25lID49IHdvcmtfdG9fZG8pOworfQogCiAjaWYgZGVmaW5lZChTQk1BQ19FVEgwX0hXQUREUikgfHwgZGVmaW5lZChTQk1BQ19FVEgxX0hXQUREUikgfHwgZGVmaW5lZChTQk1BQ19FVEgyX0hXQUREUikgfHwgZGVmaW5lZChTQk1BQ19FVEgzX0hXQUREUikKIHN0YXRpYyB2b2lkCkBAIC0yODg2LDcgKzI5OTMsNyBAQAogCiAJCS8qCiAJCSAqIFRoZSBSX01BQ19FVEhFUk5FVF9BRERSIHJlZ2lzdGVyIHdpbGwgYmUgc2V0IHRvIHNvbWUgbm9uemVybwotCQkgKiB2YWx1ZSBmb3IgdXMgYnkgdGhlIGZpcm13YXJlIGlmIHdlJ3JlIGdvaW5nIHRvIHVzZSB0aGlzIE1BQy4KKwkJICogdmFsdWUgZm9yIHVzIGJ5IHRoZSBmaXJtd2FyZSBpZiB3ZSBhcmUgZ29pbmcgdG8gdXNlIHRoaXMgTUFDLgogCQkgKiBJZiB3ZSBmaW5kIGEgemVybywgc2tpcCB0aGlzIE1BQy4KIAkJICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NjOTIwMzEuYyBiL2RyaXZlcnMvbmV0L3NjOTIwMzEuYwppbmRleCBjMzJjMjFhLi41YjcyODRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zYzkyMDMxLmMKKysrIGIvZHJpdmVycy9uZXQvc2M5MjAzMS5jCkBAIC04MTQsNyArODE0LDYgQEAKIAkJCW1lbWNweShza2JfcHV0KHNrYiwgcGt0X3NpemUpLCByeF9yaW5nICsgcnhfcmluZ19vZmZzZXQsIHBrdF9zaXplKTsKIAkJfQogCi0JCXNrYi0+ZGV2ID0gZGV2OwogCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOwogCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOwogCQluZXRpZl9yeChza2IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2VlcTgwMDUuYyBiL2RyaXZlcnMvbmV0L3NlZXE4MDA1LmMKaW5kZXggMGQ2Yzk1Yy4uNGJjZTdjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2VlcTgwMDUuYworKysgYi9kcml2ZXJzL25ldC9zZWVxODAwNS5jCkBAIC01NTAsNyArNTUwLDYgQEAKIAkJCQlscC0+c3RhdHMucnhfZHJvcHBlZCsrOwogCQkJCWJyZWFrOwogCQkJfQotCQkJc2tiLT5kZXYgPSBkZXY7CiAJCQlza2JfcmVzZXJ2ZShza2IsIDIpOwkvKiBhbGlnbiBkYXRhIG9uIDE2IGJ5dGUgKi8KIAkJCWJ1ZiA9IHNrYl9wdXQoc2tiLHBrdF9sZW4pOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zZ2lzZWVxLmMgYi9kcml2ZXJzL25ldC9zZ2lzZWVxLmMKaW5kZXggNTJlZDUyMi4uMWZjNzczMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2dpc2VlcS5jCisrKyBiL2RyaXZlcnMvbmV0L3NnaXNlZXEuYwpAQCAtMzE4LDcgKzMxOCw2IEBACiAJCQlza2IgPSBkZXZfYWxsb2Nfc2tiKGxlbiArIDIpOwogCiAJCQlpZiAoc2tiKSB7Ci0JCQkJc2tiLT5kZXYgPSBkZXY7CiAJCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsKIAkJCQlza2JfcHV0KHNrYiwgbGVuKTsKIApAQCAtNTM1LDcgKzUzNCw3IEBACiAJICogICAgZW50cnkgYW5kIHRoZSBIUEMgZ290IHRvIHRoZSBlbmQgb2YgdGhlIGNoYWluIGJlZm9yZSB3ZQogCSAqICAgIGFkZGVkIHRoaXMgbmV3IGVudHJ5IGFuZCByZXN0YXJ0ZWQgaXQuCiAJICovCi0JbWVtY3B5KChjaGFyICopKGxvbmcpdGQtPmJ1Zl92YWRkciwgc2tiLT5kYXRhLCBza2JsZW4pOworCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCAoY2hhciAqKShsb25nKXRkLT5idWZfdmFkZHIsIHNrYmxlbik7CiAJaWYgKGxlbiAhPSBza2JsZW4pCiAJCW1lbXNldCgoY2hhciAqKShsb25nKXRkLT5idWZfdmFkZHIgKyBza2ItPmxlbiwgMCwgbGVuLXNrYmxlbik7CiAJdGQtPnRkbWEuY250aW5mbyA9IChsZW4gJiBIUENETUFfQkNOVCkgfApAQCAtNjI1LDcgKzYyNCw3IEBACiAKICNkZWZpbmUgQUxJR05FRCh4KSAgKCgoKHVuc2lnbmVkIGxvbmcpKHgpKSArIDB4ZikgJiB+KDB4ZikpCiAKLXN0YXRpYyBpbnQgc2dpc2VlcV9pbml0KHN0cnVjdCBocGMzX3JlZ3MqIGhwY3JlZ3MsIGludCBpcnEpCitzdGF0aWMgaW50IHNnaXNlZXFfaW5pdChzdHJ1Y3QgaHBjM19yZWdzKiBocGNyZWdzLCBpbnQgaXJxLCBpbnQgaGFzX2VlcHJvbSkKIHsKIAlzdHJ1Y3Qgc2dpc2VlcV9pbml0X2Jsb2NrICpzcjsKIAlzdHJ1Y3Qgc2dpc2VlcV9wcml2YXRlICpzcDsKQEAgLTY1MSw3ICs2NTAsOSBAQAogCiAjZGVmaW5lIEVBRERSX05WT0ZTICAgICAyNTAKIAlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0JCXVuc2lnbmVkIHNob3J0IHRtcCA9IGlwMjJfbnZyYW1fcmVhZChFQUREUl9OVk9GUyAvIDIgKyBpKTsKKwkJdW5zaWduZWQgc2hvcnQgdG1wID0gaGFzX2VlcHJvbSA/CisJCQlpcDIyX2VlcHJvbV9yZWFkKCZocGNyZWdzLT5lZXByb20sIEVBRERSX05WT0ZTIC8gMitpKSA6CisJCQlpcDIyX252cmFtX3JlYWQoRUFERFJfTlZPRlMgLyAyK2kpOwogCiAJCWRldi0+ZGV2X2FkZHJbMiAqIGldICAgICA9IHRtcCA+PiA4OwogCQlkZXYtPmRldl9hZGRyWzIgKiBpICsgMV0gPSB0bXAgJiAweGZmOwpAQCAtNjg0LDYgKzY4NSwxMSBAQAogCXNwLT5ocmVncy0+ZGNvbmZpZyA9IEhQQzNfRURDRkdfRklSUSB8IEhQQzNfRURDRkdfRkVPUCB8CiAJCQkgICAgIEhQQzNfRURDRkdfRlJYREMgfCBIUEMzX0VEQ0ZHX1BUTyB8IDB4MDI2OwogCisJLyogU2V0dXAgUElPIGFuZCBETUEgdHJhbnNmZXIgdGltaW5nICovCisJc3AtPmhyZWdzLT5wY29uZmlnID0gMHgxNjE7CisJc3AtPmhyZWdzLT5kY29uZmlnID0gSFBDM19FRENGR19GSVJRIHwgSFBDM19FRENGR19GRU9QIHwKKwkJCSAgICAgSFBDM19FRENGR19GUlhEQyB8IEhQQzNfRURDRkdfUFRPIHwgMHgwMjY7CisKIAkvKiBSZXNldCB0aGUgY2hpcC4gKi8KIAlocGMzX2V0aF9yZXNldChzcC0+aHJlZ3MpOwogCkBAIC03MzAsOCArNzM2LDIzIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IHNnaXNlZXFfcHJvYmUodm9pZCkKIHsKKwl1bnNpZ25lZCBpbnQgdG1wLCByZXQxLCByZXQyID0gMDsKKwogCS8qIE9uIGJvYXJkIGFkYXB0ZXIgb24gMXN0IEhQQyBpcyBhbHdheXMgcHJlc2VudCAqLwotCXJldHVybiBzZ2lzZWVxX2luaXQoaHBjM2MwLCBTR0lfRU5FVF9JUlEpOworCXJldDEgPSBzZ2lzZWVxX2luaXQoaHBjM2MwLCBTR0lfRU5FVF9JUlEsIDApOworCS8qIExldCdzIHNlZSBpZiBzZWNvbmQgSFBDIGlzIHRoZXJlICovCisJaWYgKCEoaXAyMl9pc19mdWxsaG91c2UoKSkgJiYKKwkgICAgZ2V0X2RiZSh0bXAsICh1bnNpZ25lZCBpbnQgKikmaHBjM2MxLT5wYmRtYVsxXSkgPT0gMCkgeworCQlzZ2ltYy0+Z2lvcGFyIHw9IFNHSU1DX0dJT1BBUl9NQVNURVJFWFAxIHwKKwkJCQkgU0dJTUNfR0lPUEFSX0VYUDE2NCB8CisJCQkJIFNHSU1DX0dJT1BBUl9IUEMyNjQ7CisJCWhwYzNjMS0+cGJ1c19waW9jZmdbMF1bMF0gPSAweDNmZmZmOworCQkvKiBpbnRlcnJ1cHQvY29uZmlnIHJlZ2lzdGVyIG9uIENoYWxsZW5nZSBTIE1lenogYm9hcmQgKi8KKwkJaHBjM2MxLT5wYnVzX2V4dHJlZ3NbMF1bMF0gPSAweDMwOworCQlyZXQyID0gc2dpc2VlcV9pbml0KGhwYzNjMSwgU0dJX0dJT18wX0lSUSwgMSk7CisJfQorCisJcmV0dXJuIChyZXQxICYgcmV0MikgPyByZXQxIDogMDsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IHNnaXNlZXFfZXhpdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2lzMTkwLmMgYi9kcml2ZXJzL25ldC9zaXMxOTAuYwppbmRleCAzNDQ2M2NlLi5iYzhkZTQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zaXMxOTAuYworKysgYi9kcml2ZXJzL25ldC9zaXMxOTAuYwpAQCAtNjMyLDcgKzYzMiw2IEBACiAJCQlwY2lfYWN0aW9uKHRwLT5wY2lfZGV2LCBsZTMyX3RvX2NwdShkZXNjLT5hZGRyKSwKIAkJCQkgICB0cC0+cnhfYnVmX3N6LCBQQ0lfRE1BX0ZST01ERVZJQ0UpOwogCi0JCQlza2ItPmRldiA9IGRldjsKIAkJCXNrYl9wdXQoc2tiLCBwa3Rfc2l6ZSk7CiAJCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zaXM5MDAuYyBiL2RyaXZlcnMvbmV0L3NpczkwMC5jCmluZGV4IGIyYTNiMTlkLi4yY2IyZTE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zaXM5MDAuYworKysgYi9kcml2ZXJzL25ldC9zaXM5MDAuYwpAQCAtMTE2MCw3ICsxMTYwLDYgQEAKIAkJCSAgIGJ1ZmZlciAqLwogCQkJYnJlYWs7CiAJCX0KLQkJc2tiLT5kZXYgPSBuZXRfZGV2OwogCQlzaXNfcHJpdi0+cnhfc2tidWZmW2ldID0gc2tiOwogCQlzaXNfcHJpdi0+cnhfcmluZ1tpXS5jbWRzdHMgPSBSWF9CVUZfU0laRTsKICAgICAgICAgICAgICAgICBzaXNfcHJpdi0+cnhfcmluZ1tpXS5idWZwdHIgPSBwY2lfbWFwX3NpbmdsZShzaXNfcHJpdi0+cGNpX2RldiwKQEAgLTE3NTQsNiArMTc1Myw3IEBACiAJCQlzaXNfcHJpdi0+cnhfcmluZ1tlbnRyeV0uY21kc3RzID0gUlhfQlVGX1NJWkU7CiAJCX0gZWxzZSB7CiAJCQlzdHJ1Y3Qgc2tfYnVmZiAqIHNrYjsKKwkJCXN0cnVjdCBza19idWZmICogcnhfc2tiOwogCiAJCQlwY2lfdW5tYXBfc2luZ2xlKHNpc19wcml2LT5wY2lfZGV2LAogCQkJCXNpc19wcml2LT5yeF9yaW5nW2VudHJ5XS5idWZwdHIsIFJYX0JVRl9TSVpFLApAQCAtMTc4NywxMCArMTc4NywxMCBAQAogCQkJfQogCiAJCQkvKiBnaXZlIHRoZSBzb2NrZXQgYnVmZmVyIHRvIHVwcGVyIGxheWVycyAqLwotCQkJc2tiID0gc2lzX3ByaXYtPnJ4X3NrYnVmZltlbnRyeV07Ci0JCQlza2JfcHV0KHNrYiwgcnhfc2l6ZSk7Ci0JCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBuZXRfZGV2KTsKLQkJCW5ldGlmX3J4KHNrYik7CisJCQlyeF9za2IgPSBzaXNfcHJpdi0+cnhfc2tidWZmW2VudHJ5XTsKKwkJCXNrYl9wdXQocnhfc2tiLCByeF9zaXplKTsKKwkJCXJ4X3NrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhyeF9za2IsIG5ldF9kZXYpOworCQkJbmV0aWZfcngocnhfc2tiKTsKIAogCQkJLyogc29tZSBuZXR3b3JrIHN0YXRpc3RpY3MgKi8KIAkJCWlmICgocnhfc3RhdHVzICYgQkNBU1QpID09IE1DQVNUKQpAQCAtMTgwMCw3ICsxODAwLDYgQEAKIAkJCXNpc19wcml2LT5zdGF0cy5yeF9wYWNrZXRzKys7CiAJCQlzaXNfcHJpdi0+ZGlydHlfcngrKzsKIHJlZmlsbF9yeF9yaW5nOgotCQkJc2tiLT5kZXYgPSBuZXRfZGV2OwogCQkJc2lzX3ByaXYtPnJ4X3NrYnVmZltlbnRyeV0gPSBza2I7CiAJCQlzaXNfcHJpdi0+cnhfcmluZ1tlbnRyeV0uY21kc3RzID0gUlhfQlVGX1NJWkU7CiAgICAgICAgICAgICAgICAgCXNpc19wcml2LT5yeF9yaW5nW2VudHJ5XS5idWZwdHIgPQpAQCAtMTgzMiw3ICsxODMxLDYgQEAKIAkJCQlzaXNfcHJpdi0+c3RhdHMucnhfZHJvcHBlZCsrOwogCQkJCWJyZWFrOwogCQkJfQotCQkJc2tiLT5kZXYgPSBuZXRfZGV2OwogCQkJc2lzX3ByaXYtPnJ4X3NrYnVmZltlbnRyeV0gPSBza2I7CiAJCQlzaXNfcHJpdi0+cnhfcmluZ1tlbnRyeV0uY21kc3RzID0gUlhfQlVGX1NJWkU7CiAgICAgICAgICAgICAgICAgCXNpc19wcml2LT5yeF9yaW5nW2VudHJ5XS5idWZwdHIgPQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2s5OGxpbi9za2dlLmMgYi9kcml2ZXJzL25ldC9zazk4bGluL3NrZ2UuYwppbmRleCBlOTRhYjI1Li5iZjIxODYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zazk4bGluL3NrZ2UuYworKysgYi9kcml2ZXJzL25ldC9zazk4bGluL3NrZ2UuYwpAQCAtMTU2MiwxMCArMTU2MiwxMCBAQAogCXBUeGQtPnBNQnVmICAgICA9IHBNZXNzYWdlOwogCiAJaWYgKHBNZXNzYWdlLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCkgewotCQl1MTYgaGRybGVuID0gcE1lc3NhZ2UtPmgucmF3IC0gcE1lc3NhZ2UtPmRhdGE7CisJCXUxNiBoZHJsZW4gPSBza2JfdHJhbnNwb3J0X29mZnNldChwTWVzc2FnZSk7CiAJCXUxNiBvZmZzZXQgPSBoZHJsZW4gKyBwTWVzc2FnZS0+Y3N1bV9vZmZzZXQ7CiAKLQkJaWYgKChwTWVzc2FnZS0+aC5pcGlwaC0+cHJvdG9jb2wgPT0gSVBQUk9UT19VRFAgKSAmJgorCQlpZiAoKGlwaXBfaGRyKHBNZXNzYWdlKS0+cHJvdG9jb2wgPT0gSVBQUk9UT19VRFApICYmCiAJCQkocEFDLT5HSW5pLkdJQ2hpcFJldiA9PSAwKSAmJgogCQkJKHBBQy0+R0luaS5HSUNoaXBJZCA9PSBDSElQX0lEX1lVS09OKSkgewogCQkJcFR4ZC0+VEJDb250cm9sID0gQk1VX1RDUF9DSEVDSzsKQEAgLTE2ODEsNyArMTY4MSw3IEBACiAJKiogRG9lcyB0aGUgSFcgbmVlZCB0byBldmFsdWF0ZSBjaGVja3N1bSBmb3IgVENQIG9yIFVEUCBwYWNrZXRzPyAKIAkqLwogCWlmIChwTWVzc2FnZS0+aXBfc3VtbWVkID09IENIRUNLU1VNX1BBUlRJQUwpIHsKLQkJdTE2IGhkcmxlbiA9IHBNZXNzYWdlLT5oLnJhdyAtIHBNZXNzYWdlLT5kYXRhOworCQl1MTYgaGRybGVuID0gc2tiX3RyYW5zcG9ydF9vZmZzZXQocE1lc3NhZ2UpOwogCQl1MTYgb2Zmc2V0ID0gaGRybGVuICsgcE1lc3NhZ2UtPmNzdW1fb2Zmc2V0OwogCiAJCUNvbnRyb2wgPSBCTVVfU1RGV0Q7CkBAIC0xNjkxLDcgKzE2OTEsNyBAQAogCQkqKiBvcGNvZGUgZm9yIHVkcCBpcyBub3Qgd29ya2luZyBpbiB0aGUgaGFyZHdhcmUgeWV0IAogCQkqKiAoUmV2aXNpb24gMi4wKQogCQkqLwotCQlpZiAoKHBNZXNzYWdlLT5oLmlwaXBoLT5wcm90b2NvbCA9PSBJUFBST1RPX1VEUCApICYmCisJCWlmICgoaXBpcF9oZHIocE1lc3NhZ2UpLT5wcm90b2NvbCA9PSBJUFBST1RPX1VEUCkgJiYKIAkJCShwQUMtPkdJbmkuR0lDaGlwUmV2ID09IDApICYmCiAJCQkocEFDLT5HSW5pLkdJQ2hpcElkID09IENISVBfSURfWVVLT04pKSB7CiAJCQlDb250cm9sIHw9IEJNVV9UQ1BfQ0hFQ0s7CkBAIC0yMTI3LDcgKzIxMjcsNyBAQAogCQkJCQkJICAgIChkbWFfYWRkcl90KSBQaHlzQWRkciwKIAkJCQkJCSAgICBGcmFtZUxlbmd0aCwKIAkJCQkJCSAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOwotCQkJbWVtY3B5KHBOZXdNc2ctPmRhdGEsIHBNc2csIEZyYW1lTGVuZ3RoKTsKKwkJCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhKHBOZXdNc2csIHBNc2csIEZyYW1lTGVuZ3RoKTsKIAogCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHBBQy0+UGNpRGV2LAogCQkJCQkJICAgICAgIChkbWFfYWRkcl90KSBQaHlzQWRkciwKQEAgLTIxOTMsNyArMjE5Myw2IEBACiAJCQkJU0tfUE5NSV9DTlRfUlhfT0NURVRTX0RFTElWRVJFRChwQUMsCiAJCQkJCUZyYW1lTGVuZ3RoLCBwUnhQb3J0LT5Qb3J0SW5kZXgpOwogCi0JCQkJcE1zZy0+ZGV2ID0gcEFDLT5kZXZbcFJ4UG9ydC0+UG9ydEluZGV4XTsKIAkJCQlwTXNnLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHBNc2csCiAJCQkJCXBBQy0+ZGV2W3BSeFBvcnQtPlBvcnRJbmRleF0pOwogCQkJCW5ldGlmX3J4KHBNc2cpOwpAQCAtMjI0Niw3ICsyMjQ1LDYgQEAKIAkJCQkoSUZGX1BST01JU0MgfCBJRkZfQUxMTVVMVEkpKSAhPSAwIHx8CiAJCQkJKEZvclJsbXQgJiBTS19STE1UX1JYX1BST1RPQ09MKSA9PQogCQkJCVNLX1JMTVRfUlhfUFJPVE9DT0wpIHsKLQkJCQlwTXNnLT5kZXYgPSBwQUMtPmRldltwUnhQb3J0LT5Qb3J0SW5kZXhdOwogCQkJCXBNc2ctPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMocE1zZywKIAkJCQkJcEFDLT5kZXZbcFJ4UG9ydC0+UG9ydEluZGV4XSk7CiAJCQkJbmV0aWZfcngocE1zZyk7CkBAIC01MTI1LDcgKzUxMjMsMTIgQEAKIAogCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgUENJX0QwKTsKIAlwY2lfcmVzdG9yZV9zdGF0ZShwZGV2KTsKLQlwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlyZXQgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInNrOThsaW46IHVuYWJsZSB0byBlbmFibGUgZGV2aWNlICVzICIKKwkJCQkiaW4gcmVzdW1lXG4iLCBkZXYtPm5hbWUpOworCQlnb3RvIGVycl9vdXQ7CisJfQogCXBjaV9zZXRfbWFzdGVyKHBkZXYpOwogCWlmIChwQUMtPkdJbmkuR0lNYWNzRm91bmQgPT0gMikKIAkJcmV0ID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsIFNrR2VJc3IsIElSUUZfU0hBUkVELCAic2s5OGxpbiIsIGRldik7CkBAIC01MTMzLDEwICs1MTM2LDggQEAKIAkJcmV0ID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsIFNrR2VJc3JPbmVQb3J0LCBJUlFGX1NIQVJFRCwgInNrOThsaW4iLCBkZXYpOwogCWlmIChyZXQpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAic2s5OGxpbjogdW5hYmxlIHRvIGFjcXVpcmUgSVJRICVkXG4iLCBkZXYtPmlycSk7Ci0JCXBBQy0+QWxsb2NGbGFnICY9IH5TS19BTExPQ19JUlE7Ci0JCWRldi0+aXJxID0gMDsKLQkJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwotCQlyZXR1cm4gLUVCVVNZOworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gZXJyX291dF9kaXNhYmxlX3BkZXY7CiAJfQogCiAJbmV0aWZfZGV2aWNlX2F0dGFjaChkZXYpOwpAQCAtNTE1Myw2ICs1MTU0LDEzIEBACiAJfQogCiAJcmV0dXJuIDA7CisKK2Vycl9vdXRfZGlzYWJsZV9wZGV2OgorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKK2Vycl9vdXQ6CisJcEFDLT5BbGxvY0ZsYWcgJj0gflNLX0FMTE9DX0lSUTsKKwlkZXYtPmlycSA9IDA7CisJcmV0dXJuIHJldDsKIH0KICNlbHNlCiAjZGVmaW5lIHNrZ2Vfc3VzcGVuZCBOVUxMCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9za2ZwL2gvbG5rc3RhdC5oIGIvZHJpdmVycy9uZXQvc2tmcC9oL2xua3N0YXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzczZGNkOS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC9za2ZwL2gvbG5rc3RhdC5oCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqCShDKUNvcHlyaWdodCAxOTk4LDE5OTkgU3lzS29ubmVjdCwKLSAqCWEgYnVzaW5lc3MgdW5pdCBvZiBTY2huZWlkZXIgJiBLb2NoICYgQ28uIERhdGVuc3lzdGVtZSBHbWJILgotICoKLSAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICoJVGhlIGluZm9ybWF0aW9uIGluIHRoaXMgZmlsZSBpcyBwcm92aWRlZCAiQVMgSVMiIHdpdGhvdXQgd2FycmFudHkuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIERlZmluaXRpb24gb2YgdGhlIEVycm9yIExvZyBTdHJ1Y3R1cmUKLSAqIFRoaXMgc3RydWN0dXJlIHdpbGwgYmUgY29waWVkIGludG8gdGhlIEVycm9yIExvZyBidWZmZXIKLSAqIGR1cmluZyB0aGUgTkRJUyBHZW5lcmFsIFJlcXVlc3QgUmVhZEVycm9yTG9nIGJ5IHRoZSBNQUMgRHJpdmVyCi0gKi8KLQotc3RydWN0CXNfZXJyb3JfbG9nIHsKLQotCS8qCi0JICogcGxhY2UgaG9sZGVyIGZvciB0b2tlbiByaW5nIGFkYXB0ZXIgZXJyb3IgbG9nICh6ZXJvcykKLQkgKi8KLQl1X2NoYXIJcmVzZXJ2ZWRfMCA7CQkJLyogYnl0ZSAwIGluc2lkZSBFcnJvciBMb2cgKi8KLQl1X2NoYXIJcmVzZXJ2ZWRfMSA7CQkJLyogYnl0ZSAxICovCi0JdV9jaGFyCXJlc2VydmVkXzIgOwkJCS8qIGJ5dGUgMiAqLwkKLQl1X2NoYXIJcmVzZXJ2ZWRfMyA7CQkJLyogYnl0ZSAzICovCi0JdV9jaGFyCXJlc2VydmVkXzQgOwkJCS8qIGJ5dGUgNCAqLwotCXVfY2hhcglyZXNlcnZlZF81IDsJCQkvKiBieXRlIDUgKi8KLQl1X2NoYXIJcmVzZXJ2ZWRfNiA7CQkJLyogYnl0ZSA2ICovCi0JdV9jaGFyCXJlc2VydmVkXzcgOwkJCS8qIGJ5dGUgNyAqLwotCXVfY2hhcglyZXNlcnZlZF84IDsJCQkvKiBieXRlIDggKi8KLQl1X2NoYXIJcmVzZXJ2ZWRfOSA7CQkJLyogYnl0ZSA5ICovCi0JdV9jaGFyCXJlc2VydmVkXzEwIDsJCQkvKiBieXRlIDEwICovCi0JdV9jaGFyCXJlc2VydmVkXzExIDsJCQkvKiBieXRlIDExICovCi0JdV9jaGFyCXJlc2VydmVkXzEyIDsJCQkvKiBieXRlIDEyICovCi0JdV9jaGFyCXJlc2VydmVkXzEzIDsJCQkvKiBieXRlIDEzICovCi0KLQkvKgotCSAqIEZEREkgbGluayBzdGF0aXN0aWNzIAotCSAqLwotLyoKLSAqIHNtdCBlcnJvciBsb3cKLSAqLwotI2RlZmluZSBTTVRfRVJMX0FFQgkoMTw8MTUpCQkJLyogQSBlbGFzdC4gYnVmZmVyICovCi0jZGVmaW5lIFNNVF9FUkxfQkxDCSgxPDwxNCkJCQkvKiBCIGxpbmsgZXJyb3IgY29uZGl0aW9uICovCi0jZGVmaW5lIFNNVF9FUkxfQUxDCSgxPDwxMykJCQkvKiBBIGxpbmsgZXJyb3IgY29uZGl0aW9uICovCi0jZGVmaW5lIFNNVF9FUkxfTkNDCSgxPDwxMikJCQkvKiBub3QgY29waWVkIGNvbmRpdGlvbiAqLwotI2RlZmluZSBTTVRfRVJMX0ZFQwkoMTw8MTEpCQkJLyogZnJhbWUgZXJyb3IgY29uZGl0aW9uICovCi0KLS8qCi0gKiBzbXQgZXZlbnQgbG93Ci0gKi8KLSNkZWZpbmUgU01UX0VWTF9OQ0UJKDE8PDUpCi0KLQl1X3Nob3J0CXNtdF9lcnJvcl9sb3cgOwkJCS8qIGJ5dGUgMTQvMTUgKi8KLQl1X3Nob3J0CXNtdF9lcnJvcl9oaWdoIDsJCS8qIGJ5dGUgMTYvMTcgKi8KLQl1X3Nob3J0CXNtdF9ldmVudF9sb3cgOwkJCS8qIGJ5dGUgMTgvMTkgKi8KLQl1X3Nob3J0CXNtdF9ldmVudF9oaWdoIDsJCS8qIGJ5dGUgMjAvMjEgKi8KLQl1X3Nob3J0CWNvbm5lY3Rpb25fcG9saWN5X3Zpb2xhdGlvbiA7CS8qIGJ5dGUgMjIvMjMgKi8KLQl1X3Nob3J0IHBvcnRfZXZlbnQgOwkJCS8qIGJ5dGUgMjQvMjUgKi8KLQl1X3Nob3J0IHNldF9jb3VudF9sb3cgOwkJCS8qIGJ5dGUgMjYvMjcgKi8KLQl1X3Nob3J0IHNldF9jb3VudF9oaWdoIDsJCS8qIGJ5dGUgMjgvMjkgKi8KLQl1X3Nob3J0CWFjaV9pZF9jb2RlIDsJCQkvKiBieXRlIDMwLzMxICovCi0JdV9zaG9ydAlwdXJnZV9mcmFtZV9jb3VudGVyIDsJCS8qIGJ5dGUgMzIvMzMgKi8KLQotCS8qCi0JICogQ01UIGFuZCBSTVQgc3RhdGUgbWFjaGluZXMKLQkgKi8KLQl1X3Nob3J0CWVjbV9zdGF0ZSA7CQkJLyogYnl0ZSAzNC8zNSAqLwotCXVfc2hvcnQJcGNtX2Ffc3RhdGUgOwkJCS8qIGJ5dGUgMzYvMzcgKi8KLQl1X3Nob3J0IHBjbV9iX3N0YXRlIDsJCQkvKiBieXRlIDM4LzM5ICovCi0JdV9zaG9ydAljZm1fc3RhdGUgOwkJCS8qIGJ5dGUgNDAvNDEgKi8KLQl1X3Nob3J0CXJtdF9zdGF0ZSA7CQkJLyogYnl0ZSA0Mi80MyAqLwotCi0JdV9zaG9ydAlub3RfdXNlZFszMF0gOwkJCS8qIGJ5dGUgNDQtMTAzICovCi0KLQl1X3Nob3J0CXVjb2RlX3ZlcnNpb25fbGV2ZWwgOwkJLyogYnl0ZSAxMDQvMTA1ICovCi0KLQl1X3Nob3J0CW5vdF91c2VkXzEgOwkJCS8qIGJ5dGUgMTA2LzEwNyAqLwotCXVfc2hvcnQgbm90X3VzZWRfMiA7CQkJLyogYnl0ZSAxMDgvMTA5ICovCi19IDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrZnAvc2tmZGRpLmMgYi9kcml2ZXJzL25ldC9za2ZwL3NrZmRkaS5jCmluZGV4IDk3MzNhMTEuLmE3ZWY2YzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NrZnAvc2tmZGRpLmMKKysrIGIvZHJpdmVycy9uZXQvc2tmcC9za2ZkZGkuYwpAQCAtMTY4MCw3ICsxNjgwLDYgQEAKIAlyeGQtPnJ4ZF9vcy5za2IgPSBOVUxMOwogCXNrYl90cmltKHNrYiwgbGVuKTsKIAlza2ItPnByb3RvY29sID0gZmRkaV90eXBlX3RyYW5zKHNrYiwgYnAtPmRldik7Ci0Jc2tiLT5kZXYgPSBicC0+ZGV2OwkvKiBwYXNzIHVwIGRldmljZSBwb2ludGVyICovCiAKIAluZXRpZl9yeChza2IpOwogCWJwLT5kZXYtPmxhc3RfcnggPSBqaWZmaWVzOwpAQCAtMTkzOCw3ICsxOTM3LDcgQEAKIAl9CiAJc2tiX3Jlc2VydmUoc2tiLCAzKTsKIAlza2JfcHV0KHNrYiwgbGVuKTsKLQltZW1jcHkoc2tiLT5kYXRhLCBsb29rX2FoZWFkLCBsZW4pOworCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhKHNrYiwgbG9va19haGVhZCwgbGVuKTsKIAogCS8vIGRlbGl2ZXIgZnJhbWUgdG8gc3lzdGVtCiAJc2tiLT5wcm90b2NvbCA9IGZkZGlfdHlwZV90cmFucyhza2IsIHNtYy0+b3MuZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrZ2UuYyBiL2RyaXZlcnMvbmV0L3NrZ2UuYwppbmRleCBkNDc2YTNjLi4yMWFmZTEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9za2dlLmMKKysrIGIvZHJpdmVycy9uZXQvc2tnZS5jCkBAIC00Miw3ICs0Miw3IEBACiAjaW5jbHVkZSAic2tnZS5oIgogCiAjZGVmaW5lIERSVl9OQU1FCQkic2tnZSIKLSNkZWZpbmUgRFJWX1ZFUlNJT04JCSIxLjEwIgorI2RlZmluZSBEUlZfVkVSU0lPTgkJIjEuMTEiCiAjZGVmaW5lIFBGWAkJCURSVl9OQU1FICIgIgogCiAjZGVmaW5lIERFRkFVTFRfVFhfUklOR19TSVpFCTEyOApAQCAtMjYyMSw2ICsyNjIxLDcgQEAKIAogc3RhdGljIGlubGluZSBpbnQgc2tnZV9hdmFpbChjb25zdCBzdHJ1Y3Qgc2tnZV9yaW5nICpyaW5nKQogeworCXNtcF9tYigpOwogCXJldHVybiAoKHJpbmctPnRvX2NsZWFuID4gcmluZy0+dG9fdXNlKSA/IDAgOiByaW5nLT5jb3VudCkKIAkJKyAocmluZy0+dG9fY2xlYW4gLSByaW5nLT50b191c2UpIC0gMTsKIH0KQEAgLTI2NTQsMTIgKzI2NTUsMTIgQEAKIAl0ZC0+ZG1hX2hpID0gbWFwID4+IDMyOwogCiAJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1BBUlRJQUwpIHsKLQkJaW50IG9mZnNldCA9IHNrYi0+aC5yYXcgLSBza2ItPmRhdGE7CisJCWNvbnN0IGludCBvZmZzZXQgPSBza2JfdHJhbnNwb3J0X29mZnNldChza2IpOwogCiAJCS8qIFRoaXMgc2VlbXMgYmFja3dhcmRzLCBidXQgaXQgaXMgd2hhdCB0aGUgc2s5OGxpbgogCQkgKiBkb2VzLiAgTG9va3MgbGlrZSBoYXJkd2FyZSBpcyB3cm9uZz8KIAkJICovCi0JCWlmIChza2ItPmguaXBpcGgtPnByb3RvY29sID09IElQUFJPVE9fVURQCisJCWlmIChpcGlwX2hkcihza2IpLT5wcm90b2NvbCA9PSBJUFBST1RPX1VEUAogCSAgICAgICAgICAgICYmIGh3LT5jaGlwX3JldiA9PSAwICYmIGh3LT5jaGlwX2lkID09IENISVBfSURfWVVLT04pCiAJCQljb250cm9sID0gQk1VX1RDUF9DSEVDSzsKIAkJZWxzZQpAQCAtMjcwOSw2ICsyNzEwLDggQEAKIAkJICAgICAgIGRldi0+bmFtZSwgZSAtIHNrZ2UtPnR4X3Jpbmcuc3RhcnQsIHNrYi0+bGVuKTsKIAogCXNrZ2UtPnR4X3JpbmcudG9fdXNlID0gZS0+bmV4dDsKKwlzbXBfd21iKCk7CisKIAlpZiAoc2tnZV9hdmFpbCgmc2tnZS0+dHhfcmluZykgPD0gVFhfTE9XX1dBVEVSKSB7CiAJCXByX2RlYnVnKCIlczogdHJhbnNtaXQgcXVldWUgZnVsbFxuIiwgZGV2LT5uYW1lKTsKIAkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwpAQCAtMjcyNiw4ICsyNzI5LDYgQEAKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHNrZ2UtPmh3LT5wZGV2OwogCi0JQlVHX09OKCFlLT5za2IpOwotCiAJLyogc2tiIGhlYWRlciB2cy4gZnJhZ21lbnQgKi8KIAlpZiAoY29udHJvbCAmIEJNVV9TVEYpCiAJCXBjaV91bm1hcF9zaW5nbGUocGRldiwgcGNpX3VubWFwX2FkZHIoZSwgbWFwYWRkciksCkBAIC0yNzQ1LDcgKzI3NDYsNiBAQAogCiAJCWRldl9rZnJlZV9za2IoZS0+c2tiKTsKIAl9Ci0JZS0+c2tiID0gTlVMTDsKIH0KIAogLyogRnJlZSBhbGwgYnVmZmVycyBpbiB0cmFuc21pdCByaW5nICovCkBAIC0yOTUwLDcgKzI5NTAsNyBAQAogCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoc2tnZS0+aHctPnBkZXYsCiAJCQkJCSAgICBwY2lfdW5tYXBfYWRkcihlLCBtYXBhZGRyKSwKIAkJCQkJICAgIGxlbiwgUENJX0RNQV9GUk9NREVWSUNFKTsKLQkJbWVtY3B5KHNrYi0+ZGF0YSwgZS0+c2tiLT5kYXRhLCBsZW4pOworCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKGUtPnNrYiwgc2tiLT5kYXRhLCBsZW4pOwogCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2Uoc2tnZS0+aHctPnBkZXYsCiAJCQkJCSAgICAgICBwY2lfdW5tYXBfYWRkcihlLCBtYXBhZGRyKSwKIAkJCQkJICAgICAgIGxlbiwgUENJX0RNQV9GUk9NREVWSUNFKTsKQEAgLTMwMTcsMjEgKzMwMTcsMjkgQEAKIAogCXNrZ2Vfd3JpdGU4KHNrZ2UtPmh3LCBRX0FERFIodHhxYWRkcltza2dlLT5wb3J0XSwgUV9DU1IpLCBDU1JfSVJRX0NMX0YpOwogCi0JbmV0aWZfdHhfbG9jayhkZXYpOwogCWZvciAoZSA9IHJpbmctPnRvX2NsZWFuOyBlICE9IHJpbmctPnRvX3VzZTsgZSA9IGUtPm5leHQpIHsKLQkJc3RydWN0IHNrZ2VfdHhfZGVzYyAqdGQgPSBlLT5kZXNjOworCQl1MzIgY29udHJvbCA9ICgoY29uc3Qgc3RydWN0IHNrZ2VfdHhfZGVzYyAqKSBlLT5kZXNjKS0+Y29udHJvbDsKIAotCQlpZiAodGQtPmNvbnRyb2wgJiBCTVVfT1dOKQorCQlpZiAoY29udHJvbCAmIEJNVV9PV04pCiAJCQlicmVhazsKIAotCQlza2dlX3R4X2ZyZWUoc2tnZSwgZSwgdGQtPmNvbnRyb2wpOworCQlza2dlX3R4X2ZyZWUoc2tnZSwgZSwgY29udHJvbCk7CiAJfQogCXNrZ2UtPnR4X3JpbmcudG9fY2xlYW4gPSBlOwogCi0JaWYgKHNrZ2VfYXZhaWwoJnNrZ2UtPnR4X3JpbmcpID4gVFhfTE9XX1dBVEVSKQotCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJLyogQ2FuIHJ1biBsb2NrbGVzcyB1bnRpbCB3ZSBuZWVkIHRvIHN5bmNocm9uaXplIHRvIHJlc3RhcnQgcXVldWUuICovCisJc21wX21iKCk7CiAKLQluZXRpZl90eF91bmxvY2soZGV2KTsKKwlpZiAodW5saWtlbHkobmV0aWZfcXVldWVfc3RvcHBlZChkZXYpICYmCisJCSAgICAgc2tnZV9hdmFpbCgmc2tnZS0+dHhfcmluZykgPiBUWF9MT1dfV0FURVIpKSB7CisJCW5ldGlmX3R4X2xvY2soZGV2KTsKKwkJaWYgKHVubGlrZWx5KG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSAmJgorCQkJICAgICBza2dlX2F2YWlsKCZza2dlLT50eF9yaW5nKSA+IFRYX0xPV19XQVRFUikpIHsKKwkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKworCQl9CisJCW5ldGlmX3R4X3VubG9jayhkZXYpOworCX0KIH0KIAogc3RhdGljIGludCBza2dlX3BvbGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50ICpidWRnZXQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9za2dlLmggYi9kcml2ZXJzL25ldC9za2dlLmgKaW5kZXggODY0NjdhZS4uZWRkNzE0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2tnZS5oCisrKyBiL2RyaXZlcnMvbmV0L3NrZ2UuaApAQCAtMjMyLDcgKzIzMiw2IEBACiAJSVNfUjJfUEFSX0VSUgk9IDE8PDAsCS8qIFF1ZXVlIFIyIFBhcml0eSBFcnJvciAqLwogCiAJSVNfRVJSX01TSwk9IElTX0lSUV9NU1RfRVJSIHwgSVNfSVJRX1NUQVQKLQkJCXwgSVNfTk9fU1RBVF9NMSB8IElTX05PX1NUQVRfTTIKIAkJCXwgSVNfUkFNX1JEX1BBUiB8IElTX1JBTV9XUl9QQVIKIAkJCXwgSVNfTTFfUEFSX0VSUiB8IElTX00yX1BBUl9FUlIKIAkJCXwgSVNfUjFfUEFSX0VSUiB8IElTX1IyX1BBUl9FUlIsCkBAIC0yNDQ3LDE1ICsyNDQ2LDE1IEBACiAKIAogc3RydWN0IHNrZ2VfcG9ydCB7Ci0JdTMyCQkgICAgIG1zZ19lbmFibGU7CiAJc3RydWN0IHNrZ2VfaHcJICAgICAqaHc7CiAJc3RydWN0IG5ldF9kZXZpY2UgICAgKm5ldGRldjsKIAlpbnQJCSAgICAgcG9ydDsKKwl1MzIJCSAgICAgbXNnX2VuYWJsZTsKIAogCXN0cnVjdCBza2dlX3JpbmcgICAgIHR4X3Jpbmc7Ci0Jc3RydWN0IHNrZ2VfcmluZyAgICAgcnhfcmluZzsKIAotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIG5ldF9zdGF0czsKKwlzdHJ1Y3Qgc2tnZV9yaW5nICAgICByeF9yaW5nIF9fX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXA7CisJdW5zaWduZWQgaW50CSAgICAgcnhfYnVmX3NpemU7CiAKIAlzdHJ1Y3QgdGltZXJfbGlzdCAgICBsaW5rX3RpbWVyOwogCWVudW0gcGF1c2VfY29udHJvbCAgIGZsb3dfY29udHJvbDsKQEAgLTI0NzEsNyArMjQ3MCw4IEBACiAJdm9pZAkJICAgICAqbWVtOwkvKiBQQ0kgbWVtb3J5IGZvciByaW5ncyAqLwogCWRtYV9hZGRyX3QJICAgICBkbWE7CiAJdW5zaWduZWQgbG9uZwkgICAgIG1lbV9zaXplOwotCXVuc2lnbmVkIGludAkgICAgIHJ4X2J1Zl9zaXplOworCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgbmV0X3N0YXRzOwogfTsKIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9za3kyLmMgYi9kcml2ZXJzL25ldC9za3kyLmMKaW5kZXggYWMzNjE1Mi4uMjM4YzJjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2t5Mi5jCisrKyBiL2RyaXZlcnMvbmV0L3NreTIuYwpAQCAtMzIsNiArMzIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPG5ldC9pcC5oPgogI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgogI2luY2x1ZGUgPGxpbnV4L2luLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KQEAgLTEzOTEsOCArMTM5Miw4IEBACiAJLyogQ2hlY2sgZm9yIFRDUCBTZWdtZW50YXRpb24gT2ZmbG9hZCAqLwogCW1zcyA9IHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemU7CiAJaWYgKG1zcyAhPSAwKSB7Ci0JCW1zcyArPSAoKHNrYi0+aC50aC0+ZG9mZiAtIDUpICogNCk7CS8qIFRDUCBvcHRpb25zICovCi0JCW1zcyArPSAoc2tiLT5uaC5pcGgtPmlobCAqIDQpICsgc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpOworCQltc3MgKz0gdGNwX29wdGxlbihza2IpOyAvKiBUQ1Agb3B0aW9ucyAqLworCQltc3MgKz0gaXBfaGRybGVuKHNrYikgKyBzaXplb2Yoc3RydWN0IHRjcGhkcik7CiAJCW1zcyArPSBFVEhfSExFTjsKIAogCQlpZiAobXNzICE9IHNreTItPnR4X2xhc3RfbXNzKSB7CkBAIC0xNDIwLDE0ICsxNDIxLDE0IEBACiAKIAkvKiBIYW5kbGUgVENQIGNoZWNrc3VtIG9mZmxvYWQgKi8KIAlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCkgewotCQl1bnNpZ25lZCBvZmZzZXQgPSBza2ItPmgucmF3IC0gc2tiLT5kYXRhOworCQljb25zdCB1bnNpZ25lZCBvZmZzZXQgPSBza2JfdHJhbnNwb3J0X29mZnNldChza2IpOwogCQl1MzIgdGNwc3VtOwogCiAJCXRjcHN1bSA9IG9mZnNldCA8PCAxNjsJCS8qIHN1bSBzdGFydCAqLwogCQl0Y3BzdW0gfD0gb2Zmc2V0ICsgc2tiLT5jc3VtX29mZnNldDsJLyogc3VtIHdyaXRlICovCiAKIAkJY3RybCA9IENBTFNVTSB8IFdSX1NVTSB8IElOSVRfU1VNIHwgTE9DS19TVU07Ci0JCWlmIChza2ItPm5oLmlwaC0+cHJvdG9jb2wgPT0gSVBQUk9UT19VRFApCisJCWlmIChpcF9oZHIoc2tiKS0+cHJvdG9jb2wgPT0gSVBQUk9UT19VRFApCiAJCQljdHJsIHw9IFVEUFRDUDsKIAogCQlpZiAodGNwc3VtICE9IHNreTItPnR4X3RjcHN1bSkgewpAQCAtMTk3MCw3ICsxOTcxLDcgQEAKIAkJc2tiX3Jlc2VydmUoc2tiLCAyKTsKIAkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KHNreTItPmh3LT5wZGV2LCByZS0+ZGF0YV9hZGRyLAogCQkJCQkgICAgbGVuZ3RoLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOwotCQltZW1jcHkoc2tiLT5kYXRhLCByZS0+c2tiLT5kYXRhLCBsZW5ndGgpOworCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHJlLT5za2IsIHNrYi0+ZGF0YSwgbGVuZ3RoKTsKIAkJc2tiLT5pcF9zdW1tZWQgPSByZS0+c2tiLT5pcF9zdW1tZWQ7CiAJCXNrYi0+Y3N1bSA9IHJlLT5za2ItPmNzdW07CiAJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShza3kyLT5ody0+cGRldiwgcmUtPmRhdGFfYWRkciwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NsaXAuYyBiL2RyaXZlcnMvbmV0L3NsaXAuYwppbmRleCAyZjRiMWRlLi42NWJkMjBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zbGlwLmMKKysrIGIvZHJpdmVycy9uZXQvc2xpcC5jCkBAIC0zNjMsNyArMzYzLDcgQEAKIAl9CiAJc2tiLT5kZXYgPSBzbC0+ZGV2OwogCW1lbWNweShza2JfcHV0KHNrYixjb3VudCksIHNsLT5yYnVmZiwgY291bnQpOwotCXNrYi0+bWFjLnJhdz1za2ItPmRhdGE7CisJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKIAlza2ItPnByb3RvY29sPWh0b25zKEVUSF9QX0lQKTsKIAluZXRpZl9yeChza2IpOwogCXNsLT5kZXYtPmxhc3RfcnggPSBqaWZmaWVzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc21jOTExeC5jIGIvZHJpdmVycy9uZXQvc21jOTExeC5jCmluZGV4IGM5NTYxNDEuLjgxZjI0ODQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NtYzkxMXguYworKysgYi9kcml2ZXJzL25ldC9zbWM5MTF4LmMKQEAgLTQ5OSwxMCArNDk5LDkgQEAKIAkJU01DX1NFVF9SWF9DRkcoUlhfQ0ZHX1JYX0VORF9BTEdONF8gfCAoKDI8PDgpICYgUlhfQ0ZHX1JYRE9GRl8pKTsKIAkJU01DX1BVTExfREFUQShkYXRhLCBwa3RfbGVuKzIrMyk7CiAKLQkJREJHKFNNQ19ERUJVR19QS1RTLCAiJXM6IFJlY2VpdmVkIHBhY2tldFxuIiwgZGV2LT5uYW1lLCk7CisJCURCRyhTTUNfREVCVUdfUEtUUywgIiVzOiBSZWNlaXZlZCBwYWNrZXRcbiIsIGRldi0+bmFtZSk7CiAJCVBSSU5UX1BLVChkYXRhLCAoKHBrdF9sZW4gLSA0KSA8PSA2NCkgPyBwa3RfbGVuIC0gNCA6IDY0KTsKIAkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKLQkJc2tiLT5kZXYgPSBkZXY7CiAJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CiAJCW5ldGlmX3J4KHNrYik7CiAJCWxwLT5zdGF0cy5yeF9wYWNrZXRzKys7CkBAIC0xMzA3LDcgKzEzMDYsNiBAQAogCWxwLT5jdXJyZW50X3J4X3NrYiA9IE5VTEw7CiAJUFJJTlRfUEtUKHNrYi0+ZGF0YSwgc2tiLT5sZW4pOwogCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7Ci0Jc2tiLT5kZXYgPSBkZXY7CiAJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKIAluZXRpZl9yeChza2IpOwogCWxwLT5zdGF0cy5yeF9wYWNrZXRzKys7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zbWM5MTk0LmMgYi9kcml2ZXJzL25ldC9zbWM5MTk0LmMKaW5kZXggYmQ2ZTg0NS4uMzZjMWViYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc21jOTE5NC5jCisrKyBiL2RyaXZlcnMvbmV0L3NtYzkxOTQuYwpAQCAtMTI2Miw3ICsxMjYyLDYgQEAKIAogCQlza2JfcmVzZXJ2ZSggc2tiLCAyICk7ICAgLyogMTYgYml0IGFsaWdubWVudCAqLwogCi0JCXNrYi0+ZGV2ID0gZGV2OwogCQlkYXRhID0gc2tiX3B1dCggc2tiLCBwYWNrZXRfbGVuZ3RoKTsKIAogI2lmZGVmIFVTRV8zMl9CSVQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NtYzkxeC5jIGIvZHJpdmVycy9uZXQvc21jOTF4LmMKaW5kZXggNDlmNGI3Ny4uMDFjYzNjNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc21jOTF4LmMKKysrIGIvZHJpdmVycy9uZXQvc21jOTF4LmMKQEAgLTU2OCw3ICs1NjgsNiBAQAogCQlQUklOVF9QS1QoZGF0YSwgcGFja2V0X2xlbiAtIDQpOwogCiAJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7Ci0JCXNrYi0+ZGV2ID0gZGV2OwogCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOwogCQluZXRpZl9yeChza2IpOwogCQlscC0+c3RhdHMucnhfcGFja2V0cysrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc29uaWMuYyBiL2RyaXZlcnMvbmV0L3NvbmljLmMKaW5kZXggZWQ3YWEwYS4uYzYzMjBjNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc29uaWMuYworKysgYi9kcml2ZXJzL25ldC9zb25pYy5jCkBAIC04NSw3ICs4NSw2IEBACiAJCQkgICAgICAgZGV2LT5uYW1lKTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9Ci0JCXNrYi0+ZGV2ID0gZGV2OwogCQkvKiBhbGlnbiBJUCBoZWFkZXIgdW5sZXNzIERNQSByZXF1aXJlcyBvdGhlcndpc2UgKi8KIAkJaWYgKFNPTklDX0JVU19TQ0FMRShscC0+ZG1hX2JpdG1vZGUpID09IDIpCiAJCQlza2JfcmVzZXJ2ZShza2IsIDIpOwpAQCAtNDUxLDcgKzQ1MCw2IEBACiAJCQkJbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKIAkJCQlicmVhazsKIAkJCX0KLQkJCW5ld19za2ItPmRldiA9IGRldjsKIAkJCS8qIHByb3ZpZGUgMTYgYnl0ZSBJUCBoZWFkZXIgYWxpZ25tZW50IHVubGVzcyBETUEgcmVxdWlyZXMgb3RoZXJ3aXNlICovCiAJCQlpZihTT05JQ19CVVNfU0NBTEUobHAtPmRtYV9iaXRtb2RlKSA9PSAyKQogCQkJCXNrYl9yZXNlcnZlKG5ld19za2IsIDIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3BpZGVyX25ldC5jIGIvZHJpdmVycy9uZXQvc3BpZGVyX25ldC5jCmluZGV4IGUzMDE5ZDUuLjIzMGRhMTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NwaWRlcl9uZXQuYworKysgYi9kcml2ZXJzL25ldC9zcGlkZXJfbmV0LmMKQEAgLTcyMCw3ICs3MjAsNyBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoYWluLT5sb2NrLCBmbGFncyk7CiAKIAlpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9JUCkgJiYgc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCkKLQkJc3dpdGNoIChza2ItPm5oLmlwaC0+cHJvdG9jb2wpIHsKKwkJc3dpdGNoIChpcF9oZHIoc2tiKS0+cHJvdG9jb2wpIHsKIAkJY2FzZSBJUFBST1RPX1RDUDoKIAkJCWh3ZGVzY3ItPmRtYWNfY21kX3N0YXR1cyB8PSBTUElERVJfTkVUX0RNQUNfVENQOwogCQkJYnJlYWs7CkBAIC05OTAsNyArOTkwLDYgQEAKIAluZXRkZXYgPSBjYXJkLT5uZXRkZXY7CiAKIAlza2IgPSBkZXNjci0+c2tiOwotCXNrYi0+ZGV2ID0gbmV0ZGV2OwogCXNrYl9wdXQoc2tiLCBod2Rlc2NyLT52YWxpZF9zaXplKTsKIAogCS8qIHRoZSBjYXJkIHNlZW1zIHRvIGFkZCAyIGJ5dGVzIG9mIGp1bmsgaW4gZnJvbnQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3N0YXJmaXJlLmMgYi9kcml2ZXJzL25ldC9zdGFyZmlyZS5jCmluZGV4IDhiYmEyZTMuLjlkNmU0NTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3N0YXJmaXJlLmMKKysrIGIvZHJpdmVycy9uZXQvc3RhcmZpcmUuYwpAQCAtMTQ1Miw3ICsxNDUyLDYgQEAKIAkJICAgdG8gYSBtaW5pbWFsbHktc2l6ZWQgc2tidWZmLiAqLwogCQlpZiAocGt0X2xlbiA8IHJ4X2NvcHlicmVhawogCQkgICAgJiYgKHNrYiA9IGRldl9hbGxvY19za2IocGt0X2xlbiArIDIpKSAhPSBOVUxMKSB7Ci0JCQlza2ItPmRldiA9IGRldjsKIAkJCXNrYl9yZXNlcnZlKHNrYiwgMik7CS8qIDE2IGJ5dGUgYWxpZ24gdGhlIElQIGhlYWRlciAqLwogCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KG5wLT5wY2lfZGV2LAogCQkJCQkJICAgIG5wLT5yeF9pbmZvW2VudHJ5XS5tYXBwaW5nLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3VuM184MjU4Ni5jIGIvZHJpdmVycy9uZXQvc3VuM184MjU4Ni5jCmluZGV4IDQ3NTdhYTYuLjM5NmMzZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3N1bjNfODI1ODYuYworKysgYi9kcml2ZXJzL25ldC9zdW4zXzgyNTg2LmMKQEAgLTc3NSw3ICs3NzUsNiBAQAogCQkJCQlza2IgPSAoc3RydWN0IHNrX2J1ZmYgKikgZGV2X2FsbG9jX3NrYih0b3RsZW4rMik7CiAJCQkJCWlmKHNrYiAhPSBOVUxMKQogCQkJCQl7Ci0JCQkJCQlza2ItPmRldiA9IGRldjsKIAkJCQkJCXNrYl9yZXNlcnZlKHNrYiwyKTsKIAkJCQkJCXNrYl9wdXQoc2tiLHRvdGxlbik7CiAJCQkJCQlldGhfY29weV9hbmRfc3VtKHNrYiwoY2hhciAqKSBwLT5iYXNlK3N3YWIzMigodW5zaWduZWQgbG9uZykgcmJkLT5idWZmZXIpLHRvdGxlbiwwKTsKQEAgLTEwMjcsNyArMTAyNiw3IEBACiAJCQltZW1zZXQoKGNoYXIgKilwLT54bWl0X2NidWZmc1twLT54bWl0X2NvdW50XSwgMCwgRVRIX1pMRU4pOwogCQkJbGVuID0gRVRIX1pMRU47CiAJCX0KLQkJbWVtY3B5KChjaGFyICopcC0+eG1pdF9jYnVmZnNbcC0+eG1pdF9jb3VudF0sKGNoYXIgKikoc2tiLT5kYXRhKSxza2ItPmxlbik7CisJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCBwLT54bWl0X2NidWZmc1twLT54bWl0X2NvdW50XSwgc2tiLT5sZW4pOwogCiAjaWYgKE5VTV9YTUlUX0JVRkZTID09IDEpCiAjCWlmZGVmIE5PX05PUENPTU1BTkRTCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zdW4zbGFuY2UuYyBiL2RyaXZlcnMvbmV0L3N1bjNsYW5jZS5jCmluZGV4IDdiZWU0NWIuLjc5MWUwODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3N1bjNsYW5jZS5jCisrKyBiL2RyaXZlcnMvbmV0L3N1bjNsYW5jZS5jCkBAIC02MjksNyArNjI5LDcgQEAKIAloZWFkLT5sZW5ndGggPSAoLWxlbikgfCAweGYwMDA7CiAJaGVhZC0+bWlzYyA9IDA7CiAKLQltZW1jcHkoIFBLVEJVRl9BRERSKGhlYWQpLCAodm9pZCAqKXNrYi0+ZGF0YSwgc2tiLT5sZW4gKTsKKwlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgUEtUQlVGX0FERFIoaGVhZCksIHNrYi0+bGVuKTsKIAlpZiAobGVuICE9IHNrYi0+bGVuKQogCQltZW1zZXQoUEtUQlVGX0FERFIoaGVhZCkgKyBza2ItPmxlbiwgMCwgbGVuLXNrYi0+bGVuKTsKIApAQCAtODUxLDEwICs4NTEsOSBAQAogCQkJCX0KIAogCi0JCQkJc2tiLT5kZXYgPSBkZXY7CiAJCQkJc2tiX3Jlc2VydmUoIHNrYiwgMiApOwkvKiAxNiBieXRlIGFsaWduICovCiAJCQkJc2tiX3B1dCggc2tiLCBwa3RfbGVuICk7CS8qIE1ha2Ugcm9vbSAqLwotLy8JCQkgICAgICAgIG1lbWNweSggc2tiLT5kYXRhLCBQS1RCVUZfQUREUihoZWFkKSwgcGt0X2xlbiApOworLy8JCQkgICAgICAgIHNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhKHNrYiwgUEtUQlVGX0FERFIoaGVhZCksIHBrdF9sZW4pOwogCQkJCWV0aF9jb3B5X2FuZF9zdW0oc2tiLAogCQkJCQkJIFBLVEJVRl9BRERSKGhlYWQpLAogCQkJCQkJIHBrdF9sZW4sIDApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3VuYm1hYy5jIGIvZHJpdmVycy9uZXQvc3VuYm1hYy5jCmluZGV4IDE4Zjg4ODUuLjJhZDhkNTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3N1bmJtYWMuYworKysgYi9kcml2ZXJzL25ldC9zdW5ibWFjLmMKQEAgLTg1NSw3ICs4NTUsNiBAQAogCQkJCWRyb3BzKys7CiAJCQkJZ290byBkcm9wX2l0OwogCQkJfQotCQkJY29weV9za2ItPmRldiA9IGJwLT5kZXY7CiAJCQlza2JfcmVzZXJ2ZShjb3B5X3NrYiwgMik7CiAJCQlza2JfcHV0KGNvcHlfc2tiLCBsZW4pOwogCQkJc2J1c19kbWFfc3luY19zaW5nbGVfZm9yX2NwdShicC0+YmlnbWFjX3NkZXYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zdW5kYW5jZS5jIGIvZHJpdmVycy9uZXQvc3VuZGFuY2UuYwppbmRleCBjMDZlY2M4Li5mNTFiYTMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zdW5kYW5jZS5jCisrKyBiL2RyaXZlcnMvbmV0L3N1bmRhbmNlLmMKQEAgLTEzMDgsNyArMTMwOCw2IEBACiAJCQkgICB0byBhIG1pbmltYWxseS1zaXplZCBza2J1ZmYuICovCiAJCQlpZiAocGt0X2xlbiA8IHJ4X2NvcHlicmVhawogCQkJCSYmIChza2IgPSBkZXZfYWxsb2Nfc2tiKHBrdF9sZW4gKyAyKSkgIT0gTlVMTCkgewotCQkJCXNrYi0+ZGV2ID0gZGV2OwogCQkJCXNrYl9yZXNlcnZlKHNrYiwgMik7CS8qIDE2IGJ5dGUgYWxpZ24gdGhlIElQIGhlYWRlciAqLwogCQkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdShucC0+cGNpX2RldiwKIAkJCQkJCQkgICAgZGVzYy0+ZnJhZ1swXS5hZGRyLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3VuZ2VtLmMgYi9kcml2ZXJzL25ldC9zdW5nZW0uYwppbmRleCAwOGVhNjFkLi41ZGE3MzIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zdW5nZW0uYworKysgYi9kcml2ZXJzL25ldC9zdW5nZW0uYwpAQCAtNjQsMTEgKzY0LDkgQEAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KIAotI2lmZGVmIF9fc3BhcmNfXworI2lmZGVmIENPTkZJR19TUEFSQwogI2luY2x1ZGUgPGFzbS9pZHByb20uaD4KLSNpbmNsdWRlIDxhc20vb3BlbnByb20uaD4KLSNpbmNsdWRlIDxhc20vb3BsaWIuaD4KLSNpbmNsdWRlIDxhc20vcGJtLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1BQQ19QTUFDCkBAIC04NDUsMTEgKzg0MywxMCBAQAogCQkJCWdvdG8gZHJvcF9pdDsKIAkJCX0KIAotCQkJY29weV9za2ItPmRldiA9IGdwLT5kZXY7CiAJCQlza2JfcmVzZXJ2ZShjb3B5X3NrYiwgMik7CiAJCQlza2JfcHV0KGNvcHlfc2tiLCBsZW4pOwogCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KGdwLT5wZGV2LCBkbWFfYWRkciwgbGVuLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOwotCQkJbWVtY3B5KGNvcHlfc2tiLT5kYXRhLCBza2ItPmRhdGEsIGxlbik7CisJCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgY29weV9za2ItPmRhdGEsIGxlbik7CiAJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UoZ3AtPnBkZXYsIGRtYV9hZGRyLCBsZW4sIFBDSV9ETUFfRlJPTURFVklDRSk7CiAKIAkJCS8qIFdlJ2xsIHJldXNlIHRoZSBvcmlnaW5hbCByaW5nIGJ1ZmZlci4gKi8KQEAgLTEwMjksMTAgKzEwMjYsOCBAQAogCiAJY3RybCA9IDA7CiAJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1BBUlRJQUwpIHsKLQkJdTY0IGNzdW1fc3RhcnRfb2ZmLCBjc3VtX3N0dWZmX29mZjsKLQotCQljc3VtX3N0YXJ0X29mZiA9ICh1NjQpIChza2ItPmgucmF3IC0gc2tiLT5kYXRhKTsKLQkJY3N1bV9zdHVmZl9vZmYgPSBjc3VtX3N0YXJ0X29mZiArIHNrYi0+Y3N1bV9vZmZzZXQ7CisJCWNvbnN0IHU2NCBjc3VtX3N0YXJ0X29mZiA9IHNrYl90cmFuc3BvcnRfb2Zmc2V0KHNrYik7CisJCWNvbnN0IHU2NCBjc3VtX3N0dWZmX29mZiA9IGNzdW1fc3RhcnRfb2ZmICsgc2tiLT5jc3VtX29mZnNldDsKIAogCQljdHJsID0gKFRYRENUUkxfQ0VOQUIgfAogCQkJKGNzdW1fc3RhcnRfb2ZmIDw8IDE1KSB8CkBAIC0yODQ5LDcgKzI4NDQsNyBAQAogCXJldHVybiByYzsKIH0KIAotI2lmICghZGVmaW5lZChfX3NwYXJjX18pICYmICFkZWZpbmVkKENPTkZJR19QUENfUE1BQykpCisjaWYgKCFkZWZpbmVkKENPTkZJR19TUEFSQykgJiYgIWRlZmluZWQoQ09ORklHX1BQQ19QTUFDKSkKIC8qIEZldGNoIE1BQyBhZGRyZXNzIGZyb20gdml0YWwgcHJvZHVjdCBkYXRhIG9mIFBDSSBST00uICovCiBzdGF0aWMgaW50IGZpbmRfZXRoX2FkZHJfaW5fdnBkKHZvaWQgX19pb21lbSAqcm9tX2Jhc2UsIGludCBsZW4sIHVuc2lnbmVkIGNoYXIgKmRldl9hZGRyKQogewpAQCAtMjkwNCwzNiArMjg5OSwxOSBAQAogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBnZW1fZ2V0X2RldmljZV9hZGRyZXNzKHN0cnVjdCBnZW0gKmdwKQogewotI2lmIGRlZmluZWQoX19zcGFyY19fKSB8fCBkZWZpbmVkKENPTkZJR19QUENfUE1BQykKKyNpZiBkZWZpbmVkKENPTkZJR19TUEFSQykgfHwgZGVmaW5lZChDT05GSUdfUFBDX1BNQUMpCiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGdwLT5kZXY7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoX19zcGFyY19fKQotCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gZ3AtPnBkZXY7Ci0Jc3RydWN0IHBjaWRldl9jb29raWUgKnBjcCA9IHBkZXYtPnN5c2RhdGE7Ci0JaW50IHVzZV9pZHByb20gPSAxOwotCi0JaWYgKHBjcCAhPSBOVUxMKSB7Ci0JCXVuc2lnbmVkIGNoYXIgKmFkZHI7Ci0JCWludCBsZW47Ci0KLQkJYWRkciA9IG9mX2dldF9wcm9wZXJ0eShwY3AtPnByb21fbm9kZSwgImxvY2FsLW1hYy1hZGRyZXNzIiwKLQkJCQkgICAgICAgJmxlbik7Ci0JCWlmIChhZGRyICYmIGxlbiA9PSA2KSB7Ci0JCQl1c2VfaWRwcm9tID0gMDsKLQkJCW1lbWNweShkZXYtPmRldl9hZGRyLCBhZGRyLCA2KTsKLQkJfQotCX0KLQlpZiAodXNlX2lkcHJvbSkKLQkJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIGlkcHJvbS0+aWRfZXRoYWRkciwgNik7Ci0jZWxpZiBkZWZpbmVkKENPTkZJR19QUENfUE1BQykKIAljb25zdCB1bnNpZ25lZCBjaGFyICphZGRyOwogCiAJYWRkciA9IGdldF9wcm9wZXJ0eShncC0+b2Zfbm9kZSwgImxvY2FsLW1hYy1hZGRyZXNzIiwgTlVMTCk7CiAJaWYgKGFkZHIgPT0gTlVMTCkgeworI2lmZGVmIENPTkZJR19TUEFSQworCQlhZGRyID0gaWRwcm9tLT5pZF9ldGhhZGRyOworI2Vsc2UKIAkJcHJpbnRrKCJcbiIpOwogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjYW4ndCBnZXQgbWFjLWFkZHJlc3NcbiIsIGRldi0+bmFtZSk7CiAJCXJldHVybiAtMTsKKyNlbmRpZgogCX0KIAltZW1jcHkoZGV2LT5kZXZfYWRkciwgYWRkciwgNik7CiAjZWxzZQpAQCAtMzA5MSw3ICszMDY5LDcgQEAKIAkvKiBPbiBBcHBsZSwgd2Ugd2FudCBhIHJlZmVyZW5jZSB0byB0aGUgT3BlbiBGaXJtd2FyZSBkZXZpY2UtdHJlZQogCSAqIG5vZGUuIFdlIHVzZSBpdCBmb3IgY2xvY2sgY29udHJvbC4KIAkgKi8KLSNpZmRlZiBDT05GSUdfUFBDX1BNQUMKKyNpZiBkZWZpbmVkKENPTkZJR19QUENfUE1BQykgfHwgZGVmaW5lZChDT05GSUdfU1BBUkMpCiAJZ3AtPm9mX25vZGUgPSBwY2lfZGV2aWNlX3RvX09GX25vZGUocGRldik7CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3VuZ2VtLmggYi9kcml2ZXJzL25ldC9zdW5nZW0uaAppbmRleCBhNzAwNjdjLi41OGNmODdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zdW5nZW0uaAorKysgYi9kcml2ZXJzL25ldC9zdW5nZW0uaApAQCAtMTAyNSw3ICsxMDI1LDcgQEAKIAogCXN0cnVjdCBwY2lfZGV2CQkqcGRldjsKIAlzdHJ1Y3QgbmV0X2RldmljZQkqZGV2OwotI2lmZGVmIENPTkZJR19QUENfUE1BQworI2lmIGRlZmluZWQoQ09ORklHX1BQQ19QTUFDKSB8fCBkZWZpbmVkKENPTkZJR19TUEFSQykKIAlzdHJ1Y3QgZGV2aWNlX25vZGUJKm9mX25vZGU7CiAjZW5kaWYKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zdW5obWUuYyBiL2RyaXZlcnMvbmV0L3N1bmhtZS5jCmluZGV4IDE5MmJiYzkuLjUxYzNmZTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3N1bmhtZS5jCisrKyBiL2RyaXZlcnMvbmV0L3N1bmhtZS5jCkBAIC01NSw5ICs1NSw2IEBACiAKICNpZmRlZiBDT05GSUdfUENJCiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaWZkZWYgQ09ORklHX1NQQVJDCi0jaW5jbHVkZSA8YXNtL3BibS5oPgotI2VuZGlmCiAjZW5kaWYKIAogI2luY2x1ZGUgInN1bmhtZS5oIgpAQCAtMjA1OCwxMSArMjA1NSwxMCBAQAogCQkJCWdvdG8gZHJvcF9pdDsKIAkJCX0KIAotCQkJY29weV9za2ItPmRldiA9IGRldjsKIAkJCXNrYl9yZXNlcnZlKGNvcHlfc2tiLCAyKTsKIAkJCXNrYl9wdXQoY29weV9za2IsIGxlbik7CiAJCQlobWVfZG1hX3N5bmNfZm9yX2NwdShocCwgZG1hX2FkZHIsIGxlbiwgRE1BX0ZST01ERVZJQ0UpOwotCQkJbWVtY3B5KGNvcHlfc2tiLT5kYXRhLCBza2ItPmRhdGEsIGxlbik7CisJCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgY29weV9za2ItPmRhdGEsIGxlbik7CiAJCQlobWVfZG1hX3N5bmNfZm9yX2RldmljZShocCwgZG1hX2FkZHIsIGxlbiwgRE1BX0ZST01ERVZJQ0UpOwogCiAJCQkvKiBSZXVzZSBvcmlnaW5hbCByaW5nIGJ1ZmZlci4gKi8KQEAgLTIyNzAsMTAgKzIyNjYsOCBAQAogCiAJdHhfZmxhZ3MgPSBUWEZMQUdfT1dOOwogCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9QQVJUSUFMKSB7Ci0JCXUzMiBjc3VtX3N0YXJ0X29mZiwgY3N1bV9zdHVmZl9vZmY7Ci0KLQkJY3N1bV9zdGFydF9vZmYgPSAodTMyKSAoc2tiLT5oLnJhdyAtIHNrYi0+ZGF0YSk7Ci0JCWNzdW1fc3R1ZmZfb2ZmID0gY3N1bV9zdGFydF9vZmYgKyBza2ItPmNzdW1fb2Zmc2V0OworCQljb25zdCB1MzIgY3N1bV9zdGFydF9vZmYgPSBza2JfdHJhbnNwb3J0X29mZnNldChza2IpOworCQljb25zdCB1MzIgY3N1bV9zdHVmZl9vZmYgPSBjc3VtX3N0YXJ0X29mZiArIHNrYi0+Y3N1bV9vZmZzZXQ7CiAKIAkJdHhfZmxhZ3MgPSAoVFhGTEFHX09XTiB8IFRYRkxBR19DU0VOQUJMRSB8CiAJCQkgICAgKChjc3VtX3N0YXJ0X29mZiA8PCAxNCkgJiBUWEZMQUdfQ1NCVUZCRUdJTikgfApAQCAtMjcwNCw3ICsyNjk4LDcgQEAKIAkJCWRldi0+ZGV2X2FkZHJbaV0gPSBtYWNhZGRyW2ldOwogCQltYWNhZGRyWzVdKys7CiAJfSBlbHNlIHsKLQkJdW5zaWduZWQgY2hhciAqYWRkcjsKKwkJY29uc3QgdW5zaWduZWQgY2hhciAqYWRkcjsKIAkJaW50IGxlbjsKIAogCQlhZGRyID0gb2ZfZ2V0X3Byb3BlcnR5KGRwLCAibG9jYWwtbWFjLWFkZHJlc3MiLCAmbGVuKTsKQEAgLTI5ODYsNyArMjk4MCw3IEBACiB7CiAJc3RydWN0IHF1YXR0cm8gKnFwID0gTlVMTDsKICNpZmRlZiBDT05GSUdfU1BBUkMKLQlzdHJ1Y3QgcGNpZGV2X2Nvb2tpZSAqcGNwOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHA7CiAjZW5kaWYKIAlzdHJ1Y3QgaGFwcHlfbWVhbCAqaHA7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKQEAgLTI5OTgsMTMgKzI5OTIsOCBAQAogCiAJLyogTm93IG1ha2Ugc3VyZSBwY2lfZGV2IGNvb2tpZSBpcyB0aGVyZS4gKi8KICNpZmRlZiBDT05GSUdfU1BBUkMKLQlwY3AgPSBwZGV2LT5zeXNkYXRhOwotCWlmIChwY3AgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9FUlIgImhhcHB5bWVhbChQQ0kpOiBTb21lIFBDSSBkZXZpY2UgaW5mbyBtaXNzaW5nXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0Jc3RyY3B5KHByb21fbmFtZSwgcGNwLT5wcm9tX25vZGUtPm5hbWUpOworCWRwID0gcGNpX2RldmljZV90b19PRl9ub2RlKHBkZXYpOworCXN0cmNweShwcm9tX25hbWUsIGRwLT5uYW1lKTsKICNlbHNlCiAJaWYgKGlzX3F1YXR0cm9fcChwZGV2KSkKIAkJc3RyY3B5KHByb21fbmFtZSwgIlNVTlcscWZlIik7CkBAIC0zMDgxLDExICszMDcwLDExIEBACiAJCW1hY2FkZHJbNV0rKzsKIAl9IGVsc2UgewogI2lmZGVmIENPTkZJR19TUEFSQwotCQl1bnNpZ25lZCBjaGFyICphZGRyOworCQljb25zdCB1bnNpZ25lZCBjaGFyICphZGRyOwogCQlpbnQgbGVuOwogCiAJCWlmIChxZmVfc2xvdCAhPSAtMSAmJgotCQkgICAgKGFkZHIgPSBvZl9nZXRfcHJvcGVydHkocGNwLT5wcm9tX25vZGUsCisJCSAgICAoYWRkciA9IG9mX2dldF9wcm9wZXJ0eShkcCwKIAkJCQkJICAgICJsb2NhbC1tYWMtYWRkcmVzcyIsICZsZW4pKSAhPSBOVUxMCiAJCSAgICAmJiBsZW4gPT0gNikgewogCQkJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIGFkZHIsIDYpOwpAQCAtMzEwNSw3ICszMDk0LDcgQEAKIAlocC0+dGN2cmVncyAgICA9IChocHJlZ19iYXNlICsgMHg3MDAwVUwpOwogCiAjaWZkZWYgQ09ORklHX1NQQVJDCi0JaHAtPmhtX3JldmlzaW9uID0gb2ZfZ2V0aW50cHJvcF9kZWZhdWx0KHBjcC0+cHJvbV9ub2RlLCAiaG0tcmV2IiwgMHhmZik7CisJaHAtPmhtX3JldmlzaW9uID0gb2ZfZ2V0aW50cHJvcF9kZWZhdWx0KGRwLCAiaG0tcmV2IiwgMHhmZik7CiAJaWYgKGhwLT5obV9yZXZpc2lvbiA9PSAweGZmKSB7CiAJCXVuc2lnbmVkIGNoYXIgcHJldjsKIApAQCAtMzMwMCw3ICszMjg5LDcgQEAKIHsKIAlzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYgPSB0b19zYnVzX2RldmljZSgmZGV2LT5kZXYpOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAgPSBkZXYtPm5vZGU7Ci0JY2hhciAqbW9kZWwgPSBvZl9nZXRfcHJvcGVydHkoZHAsICJtb2RlbCIsIE5VTEwpOworCWNvbnN0IGNoYXIgKm1vZGVsID0gb2ZfZ2V0X3Byb3BlcnR5KGRwLCAibW9kZWwiLCBOVUxMKTsKIAlpbnQgaXNfcWZlID0gKG1hdGNoLT5kYXRhICE9IE5VTEwpOwogCiAJaWYgKCFpc19xZmUgJiYgbW9kZWwgJiYgIXN0cmNtcChtb2RlbCwgIlNVTlcsc2J1cy1xZmUiKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3N1bmxhbmNlLmMgYi9kcml2ZXJzL25ldC9zdW5sYW5jZS5jCmluZGV4IGIwOTI5YTQuLjQyNzIyNTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3N1bmxhbmNlLmMKKysrIGIvZHJpdmVycy9uZXQvc3VubGFuY2UuYwpAQCAtNTQ3LDcgKzU0Nyw2IEBACiAKIAkJCWxwLT5zdGF0cy5yeF9ieXRlcyArPSBsZW47CiAKLQkJCXNrYi0+ZGV2ID0gZGV2OwogCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsJCS8qIDE2IGJ5dGUgYWxpZ24gKi8KIAkJCXNrYl9wdXQoc2tiLCBsZW4pOwkJLyogbWFrZSByb29tICovCiAJCQlldGhfY29weV9hbmRfc3VtKHNrYiwKQEAgLTcyMSw3ICs3MjAsNiBAQAogCiAJCQlscC0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuOwogCi0JCQlza2ItPmRldiA9IGRldjsKIAkJCXNrYl9yZXNlcnZlIChza2IsIDIpOwkJLyogMTYgYnl0ZSBhbGlnbiAqLwogCQkJc2tiX3B1dChza2IsIGxlbik7CQkvKiBtYWtlIHJvb20gKi8KIAkJCWxhbmNlX3Bpb2NvcHlfdG9fc2tiKHNrYiwgJihpYi0+cnhfYnVmW2VudHJ5XVswXSksIGxlbik7CkBAIC0xMTQ1LDcgKzExNDMsNyBAQAogCQlzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jayAqaWIgPSBscC0+aW5pdF9ibG9ja19tZW07CiAJCWliLT5idHhfcmluZyBbZW50cnldLmxlbmd0aCA9ICgtbGVuKSB8IDB4ZjAwMDsKIAkJaWItPmJ0eF9yaW5nIFtlbnRyeV0ubWlzYyA9IDA7Ci0JCW1lbWNweSgoY2hhciAqKSZpYi0+dHhfYnVmIFtlbnRyeV1bMF0sIHNrYi0+ZGF0YSwgc2tibGVuKTsKKwkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsICZpYi0+dHhfYnVmIFtlbnRyeV1bMF0sIHNrYmxlbik7CiAJCWlmIChsZW4gIT0gc2tibGVuKQogCQkJbWVtc2V0KChjaGFyICopICZpYi0+dHhfYnVmIFtlbnRyeV1bc2tibGVuXSwgMCwgbGVuIC0gc2tibGVuKTsKIAkJaWItPmJ0eF9yaW5nIFtlbnRyeV0udG1kMV9iaXRzID0gKExFX1QxX1BPSyB8IExFX1QxX09XTik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zdW5xZS5jIGIvZHJpdmVycy9uZXQvc3VucWUuYwppbmRleCBmM2JhZDU2Li5mYTcwZTBiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zdW5xZS5jCisrKyBiL2RyaXZlcnMvbmV0L3N1bnFlLmMKQEAgLTQzNyw3ICs0MzcsNiBAQAogCQkJCWRyb3BzKys7CiAJCQkJcWVwLT5uZXRfc3RhdHMucnhfZHJvcHBlZCsrOwogCQkJfSBlbHNlIHsKLQkJCQlza2ItPmRldiA9IHFlcC0+ZGV2OwogCQkJCXNrYl9yZXNlcnZlKHNrYiwgMik7CiAJCQkJc2tiX3B1dChza2IsIGxlbik7CiAJCQkJZXRoX2NvcHlfYW5kX3N1bShza2IsICh1bnNpZ25lZCBjaGFyICopIHRoaXNfcWJ1ZiwKQEAgLTU5Myw3ICs1OTIsNyBAQAogCS8qIEF2b2lkIGEgcmFjZS4uLiAqLwogCXFlcC0+cWVfYmxvY2stPnFlX3R4ZFtlbnRyeV0udHhfZmxhZ3MgPSBUWERfVVBEQVRFOwogCi0JbWVtY3B5KHR4YnVmLCBza2ItPmRhdGEsIGxlbik7CisJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIHR4YnVmLCBsZW4pOwogCiAJcWVwLT5xZV9ibG9jay0+cWVfdHhkW2VudHJ5XS50eF9hZGRyID0gdHhidWZfZHZtYTsKIAlxZXAtPnFlX2Jsb2NrLT5xZV90eGRbZW50cnldLnR4X2ZsYWdzID0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3RjMzU4MTUuYyBiL2RyaXZlcnMvbmV0L3RjMzU4MTUuYwppbmRleCBlM2E3ZTNjLi5mMWUyZGZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90YzM1ODE1LmMKKysrIGIvZHJpdmVycy9uZXQvdGMzNTgxNS5jCkBAIC0xLDM1ICsxLDM0IEBACi0vKiB0YzM1ODE1LmM6IEEgVE9TSElCQSBUQzM1ODE1Q0YgUENJIDEwLzEwME1icHMgZXRoZXJuZXQgZHJpdmVyIGZvciBsaW51eC4KLSAqCi0gKiBDb3B5cmlnaHQgMjAwMSBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KLSAqIEF1dGhvcjogTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgotICogICAgICAgICAgICAgICAgYWhlbm5lc3N5QG12aXN0YS5jb20KKy8qCisgKiB0YzM1ODE1LmM6IEEgVE9TSElCQSBUQzM1ODE1Q0YgUENJIDEwLzEwME1icHMgZXRoZXJuZXQgZHJpdmVyIGZvciBsaW51eC4KICAqCiAgKiBCYXNlZCBvbiBza2VsdG9uLmMgYnkgRG9uYWxkIEJlY2tlci4KLSAqIENvcHlyaWdodCAoQykgMjAwMC0yMDAxIFRvc2hpYmEgQ29ycG9yYXRpb24KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCi0gKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogVGhpcyBkcml2ZXIgaXMgYSByZXBsYWNlbWVudCBvZiBvbGRlciBhbmQgbGVzcyBtYWludGFpbmVkIHZlcnNpb24uCisgKiBUaGlzIGlzIGEgaGVhZGVyIG9mIHRoZSBvbGRlciB2ZXJzaW9uOgorICoJLS0tLS08c25pcD4tLS0tLQorICoJQ29weXJpZ2h0IDIwMDEgTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCisgKglBdXRob3I6IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KKyAqCQlhaGVubmVzc3lAbXZpc3RhLmNvbQorICoJQ29weXJpZ2h0IChDKSAyMDAwLTIwMDEgVG9zaGliYSBDb3Jwb3JhdGlvbgorICoJc3RhdGljIGNvbnN0IGNoYXIgKnZlcnNpb24gPQorICoJCSJ0YzM1ODE1LmM6djAuMDAgMjYvMDcvMjAwMCBieSBUb3NoaWJhIENvcnBvcmF0aW9uXG4iOworICoJLS0tLS08c25pcD4tLS0tLQogICoKLSAqIFRISVMgIFNPRlRXQVJFICBJUyBQUk9WSURFRCAgIGBgQVMgIElTJycgQU5EICAgQU5ZICBFWFBSRVNTIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsICAgSU5DTFVESU5HLCBCVVQgTk9UICBMSU1JVEVEICBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOCi0gKiBOTyAgRVZFTlQgIFNIQUxMICAgVEhFIEFVVEhPUiAgQkUgICAgTElBQkxFIEZPUiBBTlkgICBESVJFQ1QsIElORElSRUNULAotICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCAgIFRPLCBQUk9DVVJFTUVOVCBPRiAgU1VCU1RJVFVURSBHT09EUyAgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgIE9SIFBST0ZJVFM7IE9SICBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgotICogQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlICB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKiAoQykgQ29weXJpZ2h0IFRPU0hJQkEgQ09SUE9SQVRJT04gMjAwNC0yMDA1CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICovCiAKLXN0YXRpYyBjb25zdCBjaGFyICp2ZXJzaW9uID0KLQkidGMzNTgxNS5jOnYwLjAwIDI2LzA3LzIwMDAgYnkgVG9zaGliYSBDb3Jwb3JhdGlvblxuIjsKKyNpZmRlZiBUQzM1ODE1X05BUEkKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjEuMzUtTkFQSSIKKyNlbHNlCisjZGVmaW5lIERSVl9WRVJTSU9OCSIxLjM1IgorI2VuZGlmCitzdGF0aWMgY29uc3QgY2hhciAqdmVyc2lvbiA9ICJ0YzM1ODE1LmM6diIgRFJWX1ZFUlNJT04gIlxuIjsKKyNkZWZpbmUgTU9ETkFNRQkJCSJ0YzM1ODE1IgogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CkBAIC00MCw2ICszOSw3IEBACiAjaW5jbHVkZSA8bGludXgvaW4uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KQEAgLTQ3LDM2ICs0Nyw0NyBAQAogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvYml0b3BzLmg+Ci0KLSNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8bGludXgvbWlpLmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9kbWEuaD4KICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiAKLS8qCi0gKiBUaGUgbmFtZSBvZiB0aGUgY2FyZC4gSXMgdXNlZCBmb3IgbWVzc2FnZXMgYW5kIGluIHRoZSByZXF1ZXN0cyBmb3IKLSAqIGlvIHJlZ2lvbnMsIGlycXMgYW5kIGRtYSBjaGFubmVscwotICovCi1zdGF0aWMgY29uc3QgY2hhciogY2FyZG5hbWUgPSAiVEMzNTgxNUNGIjsKLSNkZWZpbmUgVEMzNTgxNV9QUk9DX0VOVFJZICJuZXQvdGMzNTgxNSIKLQotI2RlZmluZSBUQzM1ODE1X01PRFVMRV9OQU1FICJUQzM1ODE1Q0YiCi0jZGVmaW5lIFRYX1RJTUVPVVQgKDQqSFopCi0KIC8qIEZpcnN0LCBhIGZldyBkZWZpbml0aW9ucyB0aGF0IHRoZSBicmF2ZSBtaWdodCBjaGFuZ2UuICovCiAKLS8qIHVzZSAwIGZvciBwcm9kdWN0aW9uLCAxIGZvciB2ZXJpZmljYXRpb24sID4yIGZvciBkZWJ1ZyAqLwotI2lmbmRlZiBUQzM1ODE1X0RFQlVHCi0jZGVmaW5lIFRDMzU4MTVfREVCVUcgMQotI2VuZGlmCi1zdGF0aWMgdW5zaWduZWQgaW50IHRjMzU4MTVfZGVidWcgPSBUQzM1ODE1X0RFQlVHOwotCiAjZGVmaW5lIEdBVEhFUl9UWElOVAkvKiBPbi1EZW1hbmQgVHggSW50ZXJydXB0ICovCisjZGVmaW5lIFdPUktBUk9VTkRfTE9TVENBUgorI2RlZmluZSBXT1JLQVJPVU5EXzEwMEhBTEZfUFJPTUlTQworLyogI2RlZmluZSBUQzM1ODE1X1VTRV9QQUNLRURCVUZGRVIgKi8KIAotI2RlZmluZSB2dG9ub2NhY2hlKHApCUtTRUcxQUREUih2aXJ0X3RvX3BoeXMocCkpCit0eXBlZGVmIGVudW0geworCVRDMzU4MTVDRiA9IDAsCisJVEMzNTgxNV9OV1UsCisJVEMzNTgxNV9UWDQ5MzksCit9IGJvYXJkX3Q7CisKKy8qIGluZGV4ZWQgYnkgYm9hcmRfdCwgYWJvdmUgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworCWNvbnN0IGNoYXIgKm5hbWU7Cit9IGJvYXJkX2luZm9bXSBfX2RldmluaXRkYXRhID0geworCXsgIlRPU0hJQkEgVEMzNTgxNUNGIDEwLzEwMEJhc2VUWCIgfSwKKwl7ICJUT1NISUJBIFRDMzU4MTUgd2l0aCBXYWtlIG9uIExBTiIgfSwKKwl7ICJUT1NISUJBIFRDMzU4MTUvVFg0OTM5IiB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIHRjMzU4MTVfcGNpX3RibFtdID0geworCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfVE9TSElCQV8yLCBQQ0lfREVWSUNFX0lEX1RPU0hJQkFfVEMzNTgxNUNGKSwgLmRyaXZlcl9kYXRhID0gVEMzNTgxNUNGIH0sCisJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9UT1NISUJBXzIsIFBDSV9ERVZJQ0VfSURfVE9TSElCQV9UQzM1ODE1X05XVSksIC5kcml2ZXJfZGF0YSA9IFRDMzU4MTVfTldVIH0sCisJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9UT1NISUJBXzIsIFBDSV9ERVZJQ0VfSURfVE9TSElCQV9UQzM1ODE1X1RYNDkzOSksIC5kcml2ZXJfZGF0YSA9IFRDMzU4MTVfVFg0OTM5IH0sCisJezAsfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUgKHBjaSwgdGMzNTgxNV9wY2lfdGJsKTsKKworLyogc2VlIE1PRFVMRV9QQVJNX0RFU0MgKi8KK3N0YXRpYyBzdHJ1Y3QgdGMzNTgxNV9vcHRpb25zIHsKKwlpbnQgc3BlZWQ7CisJaW50IGR1cGxleDsKKwlpbnQgZG9mb3JjZTsKK30gb3B0aW9uczsKIAogLyoKICAqIFJlZ2lzdGVycwpAQCAtMTE5LDYgKzEzMCwxMSBAQAogICogQml0IGFzc2lnbm1lbnRzCiAgKi8KIC8qIERNQV9DdGwgYml0IGFzaWduIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUgRE1BX1J4QWxpZ24gICAgICAgICAgICAweDAwYzAwMDAwIC8qIDE6UmVjZXB0aW9uIEFsaWdubWVudCAgICAgICAgICAgKi8KKyNkZWZpbmUgRE1BX1J4QWxpZ25fMSAgICAgICAgICAweDAwNDAwMDAwCisjZGVmaW5lIERNQV9SeEFsaWduXzIgICAgICAgICAgMHgwMDgwMDAwMAorI2RlZmluZSBETUFfUnhBbGlnbl8zICAgICAgICAgIDB4MDBjMDAwMDAKKyNkZWZpbmUgRE1BX002NkVuU3RhdCAgICAgICAgICAweDAwMDgwMDAwIC8qIDE6NjZNSHogRW5hYmxlIFN0YXRlICAgICAgICAgICAgKi8KICNkZWZpbmUgRE1BX0ludE1hc2sgICAgICAgICAgICAweDAwMDQwMDAwIC8qIDE6SW50ZXJ1cHQgbWFzayAgICAgICAgICAgICAgICAgKi8KICNkZWZpbmUgRE1BX1NXSW50UmVxICAgICAgICAgICAweDAwMDIwMDAwIC8qIDE6U29mdHdhcmUgSW50ZXJydXB0IHJlcXVlc3QgICAgKi8KICNkZWZpbmUgRE1BX1R4V2FrZVVwICAgICAgICAgICAweDAwMDEwMDAwIC8qIDE6VHJhbnNtaXQgV2FrZSBVcCAgICAgICAgICAgICAgKi8KQEAgLTI2OSw0MiArMjg1LDYgQEAKICNkZWZpbmUgTURfQ0FfV3IgICAgICAgICAgICAgICAweDAwMDAwNDAwIC8qIDE6V3JpdGUgMDpSZWFkICAgICAgICAgICAgICAgICAgKi8KIAogCi0vKiBNSUkgcmVnaXN0ZXIgb2Zmc2V0cyAqLwotI2RlZmluZSBNSUlfQ09OVFJPTCAgICAgICAgICAgICAweDAwMDAKLSNkZWZpbmUgTUlJX1NUQVRVUyAgICAgICAgICAgICAgMHgwMDAxCi0jZGVmaW5lIE1JSV9QSFlfSUQwICAgICAgICAgICAgIDB4MDAwMgotI2RlZmluZSBNSUlfUEhZX0lEMSAgICAgICAgICAgICAweDAwMDMKLSNkZWZpbmUgTUlJX0FOQVIgICAgICAgICAgICAgICAgMHgwMDA0Ci0jZGVmaW5lIE1JSV9BTkxQQVIgICAgICAgICAgICAgIDB4MDAwNQotI2RlZmluZSBNSUlfQU5FUiAgICAgICAgICAgICAgICAweDAwMDYKLS8qIE1JSSBDb250cm9sIHJlZ2lzdGVyIGJpdCBkZWZpbml0aW9ucy4gKi8KLSNkZWZpbmUgTUlJQ05UTF9GRFggICAgICAgICAgICAgMHgwMTAwCi0jZGVmaW5lIE1JSUNOVExfUlNUX0FVVE8gICAgICAgIDB4MDIwMAotI2RlZmluZSBNSUlDTlRMX0lTT0xBVEUgICAgICAgICAweDA0MDAKLSNkZWZpbmUgTUlJQ05UTF9QV1JEV04gICAgICAgICAgMHgwODAwCi0jZGVmaW5lIE1JSUNOVExfQVVUTyAgICAgICAgICAgIDB4MTAwMAotI2RlZmluZSBNSUlDTlRMX1NQRUVEICAgICAgICAgICAweDIwMDAKLSNkZWZpbmUgTUlJQ05UTF9MUEJLICAgICAgICAgICAgMHg0MDAwCi0jZGVmaW5lIE1JSUNOVExfUkVTRVQgICAgICAgICAgIDB4ODAwMAotLyogTUlJIFN0YXR1cyByZWdpc3RlciBiaXQgc2lnbmlmaWNhbmNlLiAqLwotI2RlZmluZSBNSUlTVEFUX0VYVCAgICAgICAgICAgICAweDAwMDEKLSNkZWZpbmUgTUlJU1RBVF9KQUIgICAgICAgICAgICAgMHgwMDAyCi0jZGVmaW5lIE1JSVNUQVRfTElOSyAgICAgICAgICAgIDB4MDAwNAotI2RlZmluZSBNSUlTVEFUX0NBTl9BVVRPICAgICAgICAweDAwMDgKLSNkZWZpbmUgTUlJU1RBVF9GQVVMVCAgICAgICAgICAgMHgwMDEwCi0jZGVmaW5lIE1JSVNUQVRfQVVUT19ET05FICAgICAgIDB4MDAyMAotI2RlZmluZSBNSUlTVEFUX0NBTl9UICAgICAgICAgICAweDA4MDAKLSNkZWZpbmUgTUlJU1RBVF9DQU5fVF9GRFggICAgICAgMHgxMDAwCi0jZGVmaW5lIE1JSVNUQVRfQ0FOX1RYICAgICAgICAgIDB4MjAwMAotI2RlZmluZSBNSUlTVEFUX0NBTl9UWF9GRFggICAgICAweDQwMDAKLSNkZWZpbmUgTUlJU1RBVF9DQU5fVDQgICAgICAgICAgMHg4MDAwCi0vKiBNSUkgQXV0by1OZWdvdGlhdGlvbiBFeHBhbnNpb24vUmVtb3RlRW5kIFJlZ2lzdGVyIEJpdHMgKi8KLSNkZWZpbmUgTUlJX0FOX1RYX0ZEWCAgICAgICAgICAgMHgwMTAwCi0jZGVmaW5lIE1JSV9BTl9UWF9IRFggICAgICAgICAgIDB4MDA4MAotI2RlZmluZSBNSUlfQU5fMTBfRkRYICAgICAgICAgICAweDAwNDAKLSNkZWZpbmUgTUlJX0FOXzEwX0hEWCAgICAgICAgICAgMHgwMDIwCi0KLQogLyoKICAqIERlc2NyaXB0b3JzCiAgKi8KQEAgLTM1MiwzMiArMzMyLDUxIEBACiAKICNpZmRlZiBOT19DSEVDS19DQVJSSUVSCiAjZGVmaW5lIFRYX0NUTF9DTUQJKFR4X0VuQ29tcCB8IFR4X0VuVHhQYXIgfCBUeF9FbkxhdGVDb2xsIHwgXAotCVR4X0VuRXhDb2xsIHwgVHhfRW5MQ2FyciB8IFR4X0VuRXhEZWZlciB8IFR4X0VuVW5kZXIgfCBcCi0JVHhfRW4pCS8qIG1heWJlICAweDdkMDEgKi8KKwlUeF9FbkV4Q29sbCB8IFR4X0VuRXhEZWZlciB8IFR4X0VuVW5kZXIgfCBcCisJVHhfRW4pCS8qIG1heWJlICAweDdiMDEgKi8KICNlbHNlCiAjZGVmaW5lIFRYX0NUTF9DTUQJKFR4X0VuQ29tcCB8IFR4X0VuVHhQYXIgfCBUeF9FbkxhdGVDb2xsIHwgXAotCVR4X0VuRXhDb2xsIHwgVHhfRW5FeERlZmVyIHwgVHhfRW5VbmRlciB8IFwKLQlUeF9FbikJLyogbWF5YmUgIDB4N2YwMSAqLworCVR4X0VuRXhDb2xsIHwgVHhfRW5MQ2FyciB8IFR4X0VuRXhEZWZlciB8IFR4X0VuVW5kZXIgfCBcCisJVHhfRW4pCS8qIG1heWJlICAweDdiMDEgKi8KICNlbmRpZgogI2RlZmluZSBSWF9DVExfQ01ECShSeF9Fbkdvb2QgfCBSeF9FblJ4UGFyIHwgUnhfRW5Mb25nRXJyIHwgUnhfRW5PdmVyIFwKIAl8IFJ4X0VuQ1JDRXJyIHwgUnhfRW5BbGlnbiB8IFJ4X1J4RW4pCS8qIG1heWJlIDB4NmYwMSAqLwotCiAjZGVmaW5lIElOVF9FTl9DTUQgIChJbnRfTlJBYnRFbiB8IFwKLQkgSW50X0RQYXJERW4gfCBJbnRfRFBhckVyckVuIHwgXAorCUludF9EbVBhckVyckVuIHwgSW50X0RQYXJERW4gfCBJbnRfRFBhckVyckVuIHwgXAogCUludF9TU3lzRXJyRW4gIHwgSW50X1JNYXNBYnRFbiB8IEludF9SVGFyZ0FidEVuIHwgXAogCUludF9TVGFyZ0FidEVuIHwgXAogCUludF9CTEV4RW4gIHwgSW50X0ZEQUV4RW4pIC8qIG1heWJlIDB4YjdmKi8KKyNkZWZpbmUgRE1BX0NUTF9DTUQJRE1BX0JVUlNUX1NJWkUKKyNkZWZpbmUgSEFWRV9ETUFfUlhBTElHTihscCkJbGlrZWx5KChscCktPmJvYXJkdHlwZSAhPSBUQzM1ODE1Q0YpCiAKIC8qIFR1bmluZyBwYXJhbWV0ZXJzICovCiAjZGVmaW5lIERNQV9CVVJTVF9TSVpFCTMyCiAjZGVmaW5lIFRYX1RIUkVTSE9MRAkxMDI0CisjZGVmaW5lIFRYX1RIUkVTSE9MRF9NQVggMTUzNiAgICAgICAvKiB1c2VkIHRocmVzaG9sZCB3aXRoIHBhY2tldCBtYXggYnl0ZSBmb3IgbG93IHBjaSB0cmFuc2ZlciBhYmlsaXR5LiovCisjZGVmaW5lIFRYX1RIUkVTSE9MRF9LRUVQX0xJTUlUIDEwICAvKiBzZXR0aW5nIHRocmVzaG9sZCBtYXggdmFsdWUgd2hlbiBvdmVycnVuIGVycm9yIG9jY3VyZWQgdGhpcyBjb3VudC4gKi8KIAorLyogMTYgKyBSWF9CVUZfTlVNICogOCArIFJYX0ZEX05VTSAqIDE2ICsgVFhfRkRfTlVNICogMzIgPD0gUEFHRV9TSVpFKkZEX1BBR0VfTlVNICovCisjaWZkZWYgVEMzNTgxNV9VU0VfUEFDS0VEQlVGRkVSCiAjZGVmaW5lIEZEX1BBR0VfTlVNIDIKLSNkZWZpbmUgRkRfUEFHRV9PUkRFUiAxCi0vKiAxNiArIFJYX0JVRl9QQUdFUyAqIDggKyBSWF9GRF9OVU0gKiAxNiArIFRYX0ZEX05VTSAqIDMyIDw9IFBBR0VfU0laRSoyICovCi0jZGVmaW5lIFJYX0JVRl9QQUdFUwk4CS8qID49IDIgKi8KKyNkZWZpbmUgUlhfQlVGX05VTQk4CS8qID49IDIgKi8KICNkZWZpbmUgUlhfRkRfTlVNCTI1MAkvKiA+PSAzMiAqLwogI2RlZmluZSBUWF9GRF9OVU0JMTI4CisjZGVmaW5lIFJYX0JVRl9TSVpFCVBBR0VfU0laRQorI2Vsc2UgLyogVEMzNTgxNV9VU0VfUEFDS0VEQlVGRkVSICovCisjZGVmaW5lIEZEX1BBR0VfTlVNIDQKKyNkZWZpbmUgUlhfQlVGX05VTQkxMjgJLyogPCAyNTYgKi8KKyNkZWZpbmUgUlhfRkRfTlVNCTI1NgkvKiA+PSAzMiAqLworI2RlZmluZSBUWF9GRF9OVU0JMTI4CisjaWYgUlhfQ1RMX0NNRCAmIFJ4X0xvbmdFbgorI2RlZmluZSBSWF9CVUZfU0laRQlQQUdFX1NJWkUKKyNlbGlmIFJYX0NUTF9DTUQgJiBSeF9TdHJpcENSQworI2RlZmluZSBSWF9CVUZfU0laRQlBTElHTihFVEhfRlJBTUVfTEVOICsgNCArIDIsIDMyKSAvKiArMjogcmVzZXJ2ZSAqLworI2Vsc2UKKyNkZWZpbmUgUlhfQlVGX1NJWkUJQUxJR04oRVRIX0ZSQU1FX0xFTiArIDIsIDMyKSAvKiArMjogcmVzZXJ2ZSAqLworI2VuZGlmCisjZW5kaWYgLyogVEMzNTgxNV9VU0VfUEFDS0VEQlVGRkVSICovCisjZGVmaW5lIFJYX0ZEX1JFU0VSVkUJKDIgLyAyKQkvKiBtYXggMiBCRCBwZXIgUnhGRCAqLworI2RlZmluZSBOQVBJX1dFSUdIVAkxNgogCiBzdHJ1Y3QgVHhGRCB7CiAJc3RydWN0IEZEZXNjIGZkOwpAQCAtMzkyLDE4ICszOTEsMjcgQEAKIAogc3RydWN0IEZyRkQgewogCXN0cnVjdCBGRGVzYyBmZDsKLQlzdHJ1Y3QgQkRlc2MgYmRbUlhfQlVGX1BBR0VTXTsKKwlzdHJ1Y3QgQkRlc2MgYmRbUlhfQlVGX05VTV07CiB9OwogCiAKLWV4dGVybiB1bnNpZ25lZCBsb25nIHRjX3JlYWRsKHZvbGF0aWxlIF9fdTMyICphZGRyKTsKLWV4dGVybiB2b2lkIHRjX3dyaXRlbCh1bnNpZ25lZCBsb25nIGRhdGEsIHZvbGF0aWxlIF9fdTMyICphZGRyKTsKKyNkZWZpbmUgdGNfcmVhZGwoYWRkcikJcmVhZGwoYWRkcikKKyNkZWZpbmUgdGNfd3JpdGVsKGQsIGFkZHIpCXdyaXRlbChkLCBhZGRyKQogCi1kbWFfYWRkcl90IHByaXZfZG1hX2hhbmRsZTsKKyNkZWZpbmUgVEMzNTgxNV9UWF9USU1FT1VUICBtc2Vjc190b19qaWZmaWVzKDQwMCkKKworLyogVGltZXIgc3RhdGUgZW5naW5lLiAqLworZW51bSB0YzM1ODE1X3RpbWVyX3N0YXRlIHsKKwlhcmJ3YWl0ICA9IDAsCS8qIFdhaXRpbmcgZm9yIGF1dG8gbmVnb3RpYXRpb24gdG8gY29tcGxldGUuICAgICAgICAgICovCisJbHVwd2FpdCAgPSAxLAkvKiBBdXRvLW5lZyBjb21wbGV0ZSwgYXdhaXRpbmcgbGluay11cCBzdGF0dXMuICAgICAgICAqLworCWx0cnl3YWl0ID0gMiwJLyogRm9yY2luZyB0cnkgb2YgYWxsIG1vZGVzLCBmcm9tIGZhc3Rlc3QgdG8gc2xvd2VzdC4gKi8KKwlhc2xlZXAgICA9IDMsCS8qIFRpbWUgaW5hY3RpdmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJbGNoZWNrICAgPSA0LAkvKiBDaGVjayBsaW5rIHN0YXR1cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworfTsKIAogLyogSW5mb3JtYXRpb24gdGhhdCBuZWVkIHRvIGJlIGtlcHQgZm9yIGVhY2ggYm9hcmQuICovCiBzdHJ1Y3QgdGMzNTgxNV9sb2NhbCB7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5leHRfbW9kdWxlOworCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2OwogCiAJLyogc3RhdGlzdGljcyAqLwogCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOwpAQCAtNDExLDE1MSArNDE5LDE5MiBAQAogCQlpbnQgbWF4X3R4X3FsZW47CiAJCWludCB0eF9pbnRzOwogCQlpbnQgcnhfaW50czsKKwkgICAgICAgIGludCB0eF91bmRlcnJ1bjsKIAl9IGxzdGF0czsKIAotCWludCB0YnVzeTsKLQlpbnQgb3B0aW9uOwotI2RlZmluZSBUQzM1ODE1X09QVF9BVVRPCTB4MDAKLSNkZWZpbmUgVEMzNTgxNV9PUFRfMTBNCTB4MDEKLSNkZWZpbmUgVEMzNTgxNV9PUFRfMTAwTQkweDAyCi0jZGVmaW5lIFRDMzU4MTVfT1BUX0ZVTExEVVAJMHgwNAotCWludCBsaW5rc3BlZWQ7CS8qIDEwIG9yIDEwMCAqLworCS8qIFR4IGNvbnRyb2wgbG9jay4gIFRoaXMgcHJvdGVjdHMgdGhlIHRyYW5zbWl0IGJ1ZmZlciByaW5nCisJICogc3RhdGUgYWxvbmcgd2l0aCB0aGUgInR4IGZ1bGwiIHN0YXRlIG9mIHRoZSBkcml2ZXIuICBUaGlzCisJICogbWVhbnMgYWxsIG5ldGlmX3F1ZXVlIGZsb3cgY29udHJvbCBhY3Rpb25zIGFyZSBwcm90ZWN0ZWQKKwkgKiBieSB0aGlzIGxvY2sgYXMgd2VsbC4KKwkgKi8KKwlzcGlubG9ja190IGxvY2s7CisKKwlpbnQgcGh5X2FkZHI7CiAJaW50IGZ1bGxkdXBsZXg7CisJdW5zaWduZWQgc2hvcnQgc2F2ZWRfbHBhOworCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOworCWVudW0gdGMzNTgxNV90aW1lcl9zdGF0ZSB0aW1lcl9zdGF0ZTsgLyogU3RhdGUgb2YgYXV0by1uZWcgdGltZXIuICovCisJdW5zaWduZWQgaW50IHRpbWVyX3RpY2tzOwkvKiBOdW1iZXIgb2YgY2xpY2tzIGF0IGVhY2ggc3RhdGUgICovCiAKIAkvKgogCSAqIFRyYW5zbWl0dGluZzogQmF0Y2ggTW9kZS4KIAkgKgkxIEJEIGluIDEgVHhGRC4KLQkgKiBSZWNlaXZpbmc6IFBhY2tpbmcgTW9kZS4KKwkgKiBSZWNlaXZpbmc6IFBhY2tpbmcgTW9kZS4gKFRDMzU4MTVfVVNFX1BBQ0tFREJVRkZFUikKIAkgKgkxIGNpcmN1bGFyIEZEIGZvciBGcmVlIEJ1ZmZlciBMaXN0LgotCSAqCVJYX0JVR19QQUdFUyBCRCBpbiBGcmVlIEJ1ZmZlciBGRC4KKwkgKglSWF9CVUZfTlVNIEJEIGluIEZyZWUgQnVmZmVyIEZELgogCSAqCU9uZSBGcmVlIEJ1ZmZlciBCRCBoYXMgUEFHRV9TSVpFIGRhdGEgYnVmZmVyLgorCSAqIE9yIE5vbi1QYWNraW5nIE1vZGUuCisJICoJMSBjaXJjdWxhciBGRCBmb3IgRnJlZSBCdWZmZXIgTGlzdC4KKwkgKglSWF9CVUZfTlVNIEJEIGluIEZyZWUgQnVmZmVyIEZELgorCSAqCU9uZSBGcmVlIEJ1ZmZlciBCRCBoYXMgRVRIX0ZSQU1FX0xFTiBkYXRhIGJ1ZmZlci4KIAkgKi8KLSAgICAgICAgc3RydWN0IHBjaV9kZXYgKnBkZXY7Ci0JZG1hX2FkZHJfdCBmZF9idWZfZG1hX2hhbmRsZTsKLQl2b2lkICogZmRfYnVmOwkvKiBmb3IgVHhGRCwgVHhGRCwgRnJGRCAqLworCXZvaWQgKiBmZF9idWY7CS8qIGZvciBUeEZELCBSeEZELCBGckZEICovCisJZG1hX2FkZHJfdCBmZF9idWZfZG1hOwogCXN0cnVjdCBUeEZEICp0ZmRfYmFzZTsKLQlpbnQgdGZkX3N0YXJ0OwotCWludCB0ZmRfZW5kOworCXVuc2lnbmVkIGludCB0ZmRfc3RhcnQ7CisJdW5zaWduZWQgaW50IHRmZF9lbmQ7CiAJc3RydWN0IFJ4RkQgKnJmZF9iYXNlOwogCXN0cnVjdCBSeEZEICpyZmRfbGltaXQ7CiAJc3RydWN0IFJ4RkQgKnJmZF9jdXI7CiAJc3RydWN0IEZyRkQgKmZibF9wdHI7CisjaWZkZWYgVEMzNTgxNV9VU0VfUEFDS0VEQlVGRkVSCiAJdW5zaWduZWQgY2hhciBmYmxfY3VyaWQ7Ci0JZG1hX2FkZHJfdCBkYXRhX2J1Zl9kbWFfaGFuZGxlW1JYX0JVRl9QQUdFU107Ci0Jdm9pZCAqIGRhdGFfYnVmW1JYX0JVRl9QQUdFU107CQkvKiBwYWNraW5nICovCi0Jc3BpbmxvY2tfdCBsb2NrOworCXZvaWQgKiBkYXRhX2J1ZltSWF9CVUZfTlVNXTsJCS8qIHBhY2tpbmcgKi8KKwlkbWFfYWRkcl90IGRhdGFfYnVmX2RtYVtSWF9CVUZfTlVNXTsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQlkbWFfYWRkcl90IHNrYl9kbWE7CisJfSB0eF9za2JzW1RYX0ZEX05VTV07CisjZWxzZQorCXVuc2lnbmVkIGludCBmYmxfY291bnQ7CisJc3RydWN0IHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkJZG1hX2FkZHJfdCBza2JfZG1hOworCX0gdHhfc2tic1tUWF9GRF9OVU1dLCByeF9za2JzW1JYX0JVRl9OVU1dOworI2VuZGlmCisJc3RydWN0IG1paV9pZl9pbmZvIG1paTsKKwl1bnNpZ25lZCBzaG9ydCBtaWlfaWRbMl07CisJdTMyIG1zZ19lbmFibGU7CisJYm9hcmRfdCBib2FyZHR5cGU7CiB9OwogCitzdGF0aWMgaW5saW5lIGRtYV9hZGRyX3QgZmRfdmlydF90b19idXMoc3RydWN0IHRjMzU4MTVfbG9jYWwgKmxwLCB2b2lkICp2aXJ0KQoreworCXJldHVybiBscC0+ZmRfYnVmX2RtYSArICgodTggKil2aXJ0IC0gKHU4ICopbHAtPmZkX2J1Zik7Cit9CisjaWZkZWYgREVCVUcKK3N0YXRpYyBpbmxpbmUgdm9pZCAqZmRfYnVzX3RvX3ZpcnQoc3RydWN0IHRjMzU4MTVfbG9jYWwgKmxwLCBkbWFfYWRkcl90IGJ1cykKK3sKKwlyZXR1cm4gKHZvaWQgKikoKHU4ICopbHAtPmZkX2J1ZiArIChidXMgLSBscC0+ZmRfYnVmX2RtYSkpOworfQorI2VuZGlmCisjaWZkZWYgVEMzNTgxNV9VU0VfUEFDS0VEQlVGRkVSCitzdGF0aWMgaW5saW5lIHZvaWQgKnJ4YnVmX2J1c190b192aXJ0KHN0cnVjdCB0YzM1ODE1X2xvY2FsICpscCwgZG1hX2FkZHJfdCBidXMpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IFJYX0JVRl9OVU07IGkrKykgeworCQlpZiAoYnVzID49IGxwLT5kYXRhX2J1Zl9kbWFbaV0gJiYKKwkJICAgIGJ1cyA8IGxwLT5kYXRhX2J1Zl9kbWFbaV0gKyBQQUdFX1NJWkUpCisJCQlyZXR1cm4gKHZvaWQgKikoKHU4ICopbHAtPmRhdGFfYnVmW2ldICsKKwkJCQkJKGJ1cyAtIGxwLT5kYXRhX2J1Zl9kbWFbaV0pKTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKyNkZWZpbmUgVEMzNTgxNV9ETUFfU1lOQ19PTkRFTUFORAorc3RhdGljIHZvaWQqIGFsbG9jX3J4YnVmX3BhZ2Uoc3RydWN0IHBjaV9kZXYgKmh3ZGV2LCBkbWFfYWRkcl90ICpkbWFfaGFuZGxlKQoreworI2lmZGVmIFRDMzU4MTVfRE1BX1NZTkNfT05ERU1BTkQKKwl2b2lkICpidWY7CisJLyogcGNpX21hcCArIHBjaV9kbWFfc3luYyB3aWxsIGJlIG1vcmUgZWZmZWN0aXZlIHRoYW4KKwkgKiBwY2lfYWxsb2NfY29uc2lzdGVudCBvbiBzb21lIGFyY2hzLiAqLworCWlmICgoYnVmID0gKHZvaWQgKilfX2dldF9mcmVlX3BhZ2UoR0ZQX0FUT01JQykpID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCSpkbWFfaGFuZGxlID0gcGNpX21hcF9zaW5nbGUoaHdkZXYsIGJ1ZiwgUEFHRV9TSVpFLAorCQkJCSAgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKwlpZiAocGNpX2RtYV9tYXBwaW5nX2Vycm9yKCpkbWFfaGFuZGxlKSkgeworCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpYnVmKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiBidWY7CisjZWxzZQorCXJldHVybiBwY2lfYWxsb2NfY29uc2lzdGVudChod2RldiwgUEFHRV9TSVpFLCBkbWFfaGFuZGxlKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBmcmVlX3J4YnVmX3BhZ2Uoc3RydWN0IHBjaV9kZXYgKmh3ZGV2LCB2b2lkICpidWYsIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSkKK3sKKyNpZmRlZiBUQzM1ODE1X0RNQV9TWU5DX09OREVNQU5ECisJcGNpX3VubWFwX3NpbmdsZShod2RldiwgZG1hX2hhbmRsZSwgUEFHRV9TSVpFLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylidWYpOworI2Vsc2UKKwlwY2lfZnJlZV9jb25zaXN0ZW50KGh3ZGV2LCBQQUdFX1NJWkUsIGJ1ZiwgZG1hX2hhbmRsZSk7CisjZW5kaWYKK30KKyNlbHNlIC8qIFRDMzU4MTVfVVNFX1BBQ0tFREJVRkZFUiAqLworc3RhdGljIHN0cnVjdCBza19idWZmICphbGxvY19yeGJ1Zl9za2Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgICAgc3RydWN0IHBjaV9kZXYgKmh3ZGV2LAorCQkJCSAgICAgICBkbWFfYWRkcl90ICpkbWFfaGFuZGxlKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJc2tiID0gZGV2X2FsbG9jX3NrYihSWF9CVUZfU0laRSk7CisJaWYgKCFza2IpCisJCXJldHVybiBOVUxMOworCXNrYi0+ZGV2ID0gZGV2OworCSpkbWFfaGFuZGxlID0gcGNpX21hcF9zaW5nbGUoaHdkZXYsIHNrYi0+ZGF0YSwgUlhfQlVGX1NJWkUsCisJCQkJICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCWlmIChwY2lfZG1hX21hcHBpbmdfZXJyb3IoKmRtYV9oYW5kbGUpKSB7CisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCXJldHVybiBOVUxMOworCX0KKwlza2JfcmVzZXJ2ZShza2IsIDIpOwkvKiBtYWtlIElQIGhlYWRlciA0Ynl0ZSBhbGlnbmVkICovCisJcmV0dXJuIHNrYjsKK30KKworc3RhdGljIHZvaWQgZnJlZV9yeGJ1Zl9za2Ioc3RydWN0IHBjaV9kZXYgKmh3ZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBkbWFfYWRkcl90IGRtYV9oYW5kbGUpCit7CisJcGNpX3VubWFwX3NpbmdsZShod2RldiwgZG1hX2hhbmRsZSwgUlhfQlVGX1NJWkUsCisJCQkgUENJX0RNQV9GUk9NREVWSUNFKTsKKwlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworfQorI2VuZGlmIC8qIFRDMzU4MTVfVVNFX1BBQ0tFREJVRkZFUiAqLworCiAvKiBJbmRleCB0byBmdW5jdGlvbnMsIGFzIGZ1bmN0aW9uIHByb3RvdHlwZXMuICovCiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IHRjMzU4MTVfcHJvYmUxKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1bnNpZ25lZCBpbnQgYmFzZV9hZGRyLCB1bnNpZ25lZCBpbnQgaXJxKTsKLQogc3RhdGljIGludAl0YzM1ODE1X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBzdGF0aWMgaW50CXRjMzU4MTVfc2VuZF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci1zdGF0aWMgdm9pZCAgICAgdGMzNTgxNV90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotc3RhdGljIGlycXJldHVybl90IHRjMzU4MTVfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCk7CitzdGF0aWMgaXJxcmV0dXJuX3QJdGMzNTgxNV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKKyNpZmRlZiBUQzM1ODE1X05BUEkKK3N0YXRpYyBpbnQJdGMzNTgxNV9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbGltaXQpOworc3RhdGljIGludAl0YzM1ODE1X3BvbGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50ICpidWRnZXQpOworI2Vsc2UKIHN0YXRpYyB2b2lkCXRjMzU4MTVfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisjZW5kaWYKIHN0YXRpYyB2b2lkCXRjMzU4MTVfdHhkb25lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogc3RhdGljIGludAl0YzM1ODE1X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogc3RhdGljIHN0cnVjdAluZXRfZGV2aWNlX3N0YXRzICp0YzM1ODE1X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIHN0YXRpYyB2b2lkCXRjMzU4MTVfc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgICAgIHRjMzU4MTVfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQJdGMzNTgxNV9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKTsKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorc3RhdGljIHZvaWQJdGMzNTgxNV9wb2xsX2NvbnRyb2xsZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisjZW5kaWYKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgdGMzNTgxNV9ldGh0b29sX29wczsKIAorLyogRXhhbXBsZSByb3V0aW5lcyB5b3UgbXVzdCB3cml0ZSA7LT4uICovCiBzdGF0aWMgdm9pZCAJdGMzNTgxNV9jaGlwX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogc3RhdGljIHZvaWQgCXRjMzU4MTVfY2hpcF9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQJdGMzNTgxNV9maW5kX3BoeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIHN0YXRpYyB2b2lkIAl0YzM1ODE1X3BoeV9jaGlwX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiAKLS8qIEEgbGlzdCBvZiBhbGwgaW5zdGFsbGVkIHRjMzU4MTUgZGV2aWNlcy4gKi8KLXN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqcm9vdF90YzM1ODE1X2RldiA9IE5VTEw7CisjaWZkZWYgREVCVUcKK3N0YXRpYyB2b2lkCXBhbmljX3F1ZXVlcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKyNlbmRpZgogCi0vKgotICogUENJIGRldmljZSBpZGVudGlmaWVycyBmb3IgIm5ldyBzdHlsZSIgTGludXggUENJIERldmljZSBEcml2ZXJzCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCB0YzM1ODE1X3BjaV90YmxbXSA9IHsKLSAgICB7IFBDSV9WRU5ET1JfSURfVE9TSElCQV8yLCBQQ0lfREVWSUNFX0lEX1RPU0hJQkFfVEMzNTgxNUNGLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwIH0sCi0gICAgeyAwLCB9Ci19Oworc3RhdGljIHZvaWQgdGMzNTgxNV90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpOworc3RhdGljIHZvaWQgdGMzNTgxNV9zdGFydF9hdXRvX25lZ290aWF0aW9uKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCSAgIHN0cnVjdCBldGh0b29sX2NtZCAqZXApOworc3RhdGljIGludCB0Y19tZGlvX3JlYWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uKTsKK3N0YXRpYyB2b2lkIHRjX21kaW9fd3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uLAorCQkJICBpbnQgdmFsKTsKIAotTU9EVUxFX0RFVklDRV9UQUJMRSAocGNpLCB0YzM1ODE1X3BjaV90YmwpOwotCi1pbnQKLXRjMzU4MTVfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCi0JCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCitzdGF0aWMgdm9pZCBfX2RldmluaXQgdGMzNTgxNV9pbml0X2Rldl9hZGRyIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCWludCBlcnIgPSAwOwotCWludCByZXQ7Ci0JdW5zaWduZWQgbG9uZyBwY2lfbWVtYWRkcjsKLQl1bnNpZ25lZCBpbnQgcGNpX2lycV9saW5lOworCXN0cnVjdCB0YzM1ODE1X3JlZ3MgX19pb21lbSAqdHIgPQorCQkoc3RydWN0IHRjMzU4MTVfcmVncyBfX2lvbWVtICopZGV2LT5iYXNlX2FkZHI7CisJaW50IGk7CiAKLQlwcmludGsoS0VSTl9JTkZPICJ0YzM1ODE1X3Byb2JlOiBmb3VuZCBkZXZpY2UgJSMwOHguJSMwOHhcbiIsIGVudC0+dmVuZG9yLCBlbnQtPmRldmljZSk7Ci0KLQllcnIgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0gICAgICAgIHBjaV9tZW1hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0IChwZGV2LCAxKTsKLQotICAgICAgICBwcmludGsoS0VSTl9JTkZPICIgICAgcGNpX21lbWFkZHI9JSMwOGx4ICByZXNvdXJjZV9mbGFncz0lIzA4bHhcbiIsIHBjaV9tZW1hZGRyLCBwY2lfcmVzb3VyY2VfZmxhZ3MgKHBkZXYsIDApKTsKLQotCWlmICghcGNpX21lbWFkZHIpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAibm8gUENJIE1FTSByZXNvdXJjZXMsIGFib3J0aW5nXG4iKTsKLQkJcmV0ID0gLUVOT0RFVjsKLQkJZ290byBlcnJfb3V0OwotCX0KLQlwY2lfaXJxX2xpbmUgPSBwZGV2LT5pcnE7Ci0JLyogaXJxIGRpc2FibGVkLiAqLwotCWlmIChwY2lfaXJxX2xpbmUgPT0gMCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJubyBQQ0kgaXJxLCBhYm9ydGluZ1xuIik7Ci0JCXJldCA9IC1FTk9ERVY7Ci0JCWdvdG8gZXJyX291dDsKLQl9Ci0KLQlyZXQgPSAgdGMzNTgxNV9wcm9iZTEocGRldiwgcGNpX21lbWFkZHIsIHBjaV9pcnFfbGluZSk7Ci0JaWYgKHJldCkKLQkJZ290byBlcnJfb3V0OwotCi0JcGNpX3NldF9tYXN0ZXIocGRldik7Ci0KLQlyZXR1cm4gMDsKLQotZXJyX291dDoKLQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBfX2RldmluaXQgdGMzNTgxNV9wcm9iZTEoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHVuc2lnbmVkIGludCBiYXNlX2FkZHIsIHVuc2lnbmVkIGludCBpcnEpCi17Ci0Jc3RhdGljIHVuc2lnbmVkIHZlcnNpb25fcHJpbnRlZCA9IDA7Ci0JaW50IGksIHJldDsKLQlzdHJ1Y3QgdGMzNTgxNV9sb2NhbCAqbHA7Ci0Jc3RydWN0IHRjMzU4MTVfcmVncyAqdHI7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKLQotCS8qIEFsbG9jYXRlIGEgbmV3ICdkZXYnIGlmIG5lZWRlZC4gKi8KLQlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IHRjMzU4MTVfbG9jYWwpKTsKLQlpZiAoZGV2ID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JLyoKLQkgKiBhbGxvY19ldGhlcmRldiBhbGxvY3MgYW5kIHplcm9zIGRldi0+cHJpdgotCSAqLwotCWxwID0gZGV2LT5wcml2OwotCi0JaWYgKHRjMzU4MTVfZGVidWcgICYmICB2ZXJzaW9uX3ByaW50ZWQrKyA9PSAwKQotCQlwcmludGsoS0VSTl9ERUJVRyAiJXMiLCB2ZXJzaW9uKTsKLQotCS8qIEZpbGwgaW4gdGhlICdkZXYnIGZpZWxkcy4gKi8KLQlkZXYtPmlycSA9IGlycTsKLQlkZXYtPmJhc2VfYWRkciA9ICh1bnNpZ25lZCBsb25nKWlvcmVtYXAoYmFzZV9hZGRyLAotCQkJCQkJc2l6ZW9mKHN0cnVjdCB0YzM1ODE1X3JlZ3MpKTsKLQlpZiAoIWRldi0+YmFzZV9hZGRyKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyX291dDsKLQl9Ci0JdHIgPSAoc3RydWN0IHRjMzU4MTVfcmVncyopZGV2LT5iYXNlX2FkZHI7Ci0KLQl0YzM1ODE1X2NoaXBfcmVzZXQoZGV2KTsKLQotCS8qIFJldHJpZXZlIGFuZCBwcmludCB0aGUgZXRoZXJuZXQgYWRkcmVzcy4gKi8KKwkvKiBkZXZfYWRkciB3aWxsIGJlIG92ZXJ3cml0dGVuIG9uIE5FVERFVl9SRUdJU1RFUiBldmVudCAqLwogCXdoaWxlICh0Y19yZWFkbCgmdHItPlBST01fQ3RsKSAmIFBST01fQnVzeSkKIAkJOwogCWZvciAoaSA9IDA7IGkgPCA2OyBpICs9IDIpIHsKQEAgLTU2Nyw2MCArNjE2LDE3NSBAQAogCQlkZXYtPmRldl9hZGRyW2ldID0gZGF0YSAmIDB4ZmY7CiAJCWRldi0+ZGV2X2FkZHJbaSsxXSA9IGRhdGEgPj4gODsKIAl9Cit9CiAKLQkvKiBJbml0aWFsaXplIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiAqLwotCWxwLT5wZGV2ID0gcGRldjsKLQlscC0+bmV4dF9tb2R1bGUgPSByb290X3RjMzU4MTVfZGV2OwotCXJvb3RfdGMzNTgxNV9kZXYgPSBkZXY7CitzdGF0aWMgaW50IF9fZGV2aW5pdCB0YzM1ODE1X2luaXRfb25lIChzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQkgICAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IE5VTEw7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgdGMzNTgxNV9sb2NhbCAqbHA7CisJaW50IHJjOworCXVuc2lnbmVkIGxvbmcgbW1pb19zdGFydCwgbW1pb19lbmQsIG1taW9fZmxhZ3MsIG1taW9fbGVuOwogCi0Jc3Bpbl9sb2NrX2luaXQoJmxwLT5sb2NrKTsKLQotCWlmIChkZXYtPm1lbV9zdGFydCA+IDApIHsKLQkJbHAtPm9wdGlvbiA9IGRldi0+bWVtX3N0YXJ0OwotCQlpZiAoKGxwLT5vcHRpb24gJiBUQzM1ODE1X09QVF8xME0pICYmCi0JCSAgICAobHAtPm9wdGlvbiAmIFRDMzU4MTVfT1BUXzEwME0pKSB7Ci0JCQkvKiBpZiBib3RoIHNwZWVkIHNwZWZpY2llZCwgYXV0byBzZWxlY3QuICovCi0JCQlscC0+b3B0aW9uICY9IH4oVEMzNTgxNV9PUFRfMTBNIHwgVEMzNTgxNV9PUFRfMTAwTSk7Ci0JCX0KKwlzdGF0aWMgaW50IHByaW50ZWRfdmVyc2lvbjsKKwlpZiAoIXByaW50ZWRfdmVyc2lvbisrKSB7CisJCXByaW50ayh2ZXJzaW9uKTsKKwkJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCAmcGRldi0+ZGV2LAorCQkJICAgInNwZWVkOiVkIGR1cGxleDolZCBkb2ZvcmNlOiVkXG4iLAorCQkJICAgb3B0aW9ucy5zcGVlZCwgb3B0aW9ucy5kdXBsZXgsIG9wdGlvbnMuZG9mb3JjZSk7CiAJfQotCS8vWFhYIGZpeG1lCi0gICAgICAgIGxwLT5vcHRpb24gfD0gVEMzNTgxNV9PUFRfMTBNOwogCi0JLyogZG8gYXV0byBuZWdvdGlhdGlvbiAqLwotCXRjMzU4MTVfcGh5X2NoaXBfaW5pdChkZXYpOworCWlmICghcGRldi0+aXJxKSB7CisJCWRldl93YXJuKCZwZGV2LT5kZXYsICJubyBJUlEgYXNzaWduZWQuXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQogCi0JZGV2LT5vcGVuCQk9IHRjMzU4MTVfb3BlbjsKLQlkZXYtPnN0b3AJCT0gdGMzNTgxNV9jbG9zZTsKLQlkZXYtPnR4X3RpbWVvdXQgICAgICAgICA9IHRjMzU4MTVfdHhfdGltZW91dDsKLQlkZXYtPndhdGNoZG9nX3RpbWVvICAgICA9IFRYX1RJTUVPVVQ7Ci0JZGV2LT5oYXJkX3N0YXJ0X3htaXQJPSB0YzM1ODE1X3NlbmRfcGFja2V0OwotCWRldi0+Z2V0X3N0YXRzCQk9IHRjMzU4MTVfZ2V0X3N0YXRzOwotCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gdGMzNTgxNV9zZXRfbXVsdGljYXN0X2xpc3Q7CisJLyogZGV2IHplcm9lZCBpbiBhbGxvY19ldGhlcmRldiAqLworCWRldiA9IGFsbG9jX2V0aGVyZGV2IChzaXplb2YgKCpscCkpOworCWlmIChkZXYgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ1bmFibGUgdG8gYWxsb2MgbmV3IGV0aGVybmV0XG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQogCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKIAlTRVRfTkVUREVWX0RFVihkZXYsICZwZGV2LT5kZXYpOworCWxwID0gZGV2LT5wcml2OwogCi0JcmV0ID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7Ci0JaWYgKHJldCkKLQkJZ290byBlcnJfb3V0X2lvdW5tYXA7CisJLyogZW5hYmxlIGRldmljZSAoaW5jbC4gUENJIFBNIHdha2V1cCksIGFuZCBidXMtbWFzdGVyaW5nICovCisJcmMgPSBwY2lfZW5hYmxlX2RldmljZSAocGRldik7CisJaWYgKHJjKQorCQlnb3RvIGVycl9vdXQ7CiAKLQlwcmludGsoS0VSTl9JTkZPICIlczogJXMgZm91bmQgYXQgJSN4LCBpcnEgJWQsIE1BQyIsCi0JICAgICAgIGRldi0+bmFtZSwgY2FyZG5hbWUsIGJhc2VfYWRkciwgaXJxKTsKLQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQotCQlwcmludGsoIiAlMi4yeCIsIGRldi0+ZGV2X2FkZHJbaV0pOwotCXByaW50aygiXG4iKTsKLQlwcmludGsoS0VSTl9JTkZPICIlczogbGlua3NwZWVkICVkTWJwcywgJXMgRHVwbGV4XG4iLAotCSAgICAgICBkZXYtPm5hbWUsIGxwLT5saW5rc3BlZWQsIGxwLT5mdWxsZHVwbGV4ID8gIkZ1bGwiIDogIkhhbGYiKTsKKwltbWlvX3N0YXJ0ID0gcGNpX3Jlc291cmNlX3N0YXJ0IChwZGV2LCAxKTsKKwltbWlvX2VuZCA9IHBjaV9yZXNvdXJjZV9lbmQgKHBkZXYsIDEpOworCW1taW9fZmxhZ3MgPSBwY2lfcmVzb3VyY2VfZmxhZ3MgKHBkZXYsIDEpOworCW1taW9fbGVuID0gcGNpX3Jlc291cmNlX2xlbiAocGRldiwgMSk7CisKKwkvKiBzZXQgdGhpcyBpbW1lZGlhdGVseSwgd2UgbmVlZCB0byBrbm93IGJlZm9yZQorCSAqIHdlIHRhbGsgdG8gdGhlIGNoaXAgZGlyZWN0bHkgKi8KKworCS8qIG1ha2Ugc3VyZSBQQ0kgYmFzZSBhZGRyIDEgaXMgTU1JTyAqLworCWlmICghKG1taW9fZmxhZ3MgJiBJT1JFU09VUkNFX01FTSkpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAicmVnaW9uICMxIG5vdCBhbiBNTUlPIHJlc291cmNlLCBhYm9ydGluZ1xuIik7CisJCXJjID0gLUVOT0RFVjsKKwkJZ290byBlcnJfb3V0OworCX0KKworCS8qIGNoZWNrIGZvciB3ZWlyZC9icm9rZW4gUENJIHJlZ2lvbiByZXBvcnRpbmcgKi8KKwlpZiAoKG1taW9fbGVuIDwgc2l6ZW9mKHN0cnVjdCB0YzM1ODE1X3JlZ3MpKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJJbnZhbGlkIFBDSSByZWdpb24gc2l6ZShzKSwgYWJvcnRpbmdcbiIpOworCQlyYyA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwlyYyA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMgKHBkZXYsIE1PRE5BTUUpOworCWlmIChyYykKKwkJZ290byBlcnJfb3V0OworCisJcGNpX3NldF9tYXN0ZXIgKHBkZXYpOworCisJLyogaW9yZW1hcCBNTUlPIHJlZ2lvbiAqLworCWlvYWRkciA9IGlvcmVtYXAgKG1taW9fc3RhcnQsIG1taW9fbGVuKTsKKwlpZiAoaW9hZGRyID09IE5VTEwpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2Fubm90IHJlbWFwIE1NSU8sIGFib3J0aW5nXG4iKTsKKwkJcmMgPSAtRUlPOworCQlnb3RvIGVycl9vdXRfZnJlZV9yZXM7CisJfQorCisJLyogSW5pdGlhbGl6ZSB0aGUgZGV2aWNlIHN0cnVjdHVyZS4gKi8KKwlkZXYtPm9wZW4gPSB0YzM1ODE1X29wZW47CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSB0YzM1ODE1X3NlbmRfcGFja2V0OworCWRldi0+c3RvcCA9IHRjMzU4MTVfY2xvc2U7CisJZGV2LT5nZXRfc3RhdHMgPSB0YzM1ODE1X2dldF9zdGF0czsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IHRjMzU4MTVfc2V0X211bHRpY2FzdF9saXN0OworCWRldi0+ZG9faW9jdGwgPSB0YzM1ODE1X2lvY3RsOworCWRldi0+ZXRodG9vbF9vcHMgPSAmdGMzNTgxNV9ldGh0b29sX29wczsKKwlkZXYtPnR4X3RpbWVvdXQgPSB0YzM1ODE1X3R4X3RpbWVvdXQ7CisJZGV2LT53YXRjaGRvZ190aW1lbyA9IFRDMzU4MTVfVFhfVElNRU9VVDsKKyNpZmRlZiBUQzM1ODE1X05BUEkKKwlkZXYtPnBvbGwgPSB0YzM1ODE1X3BvbGw7CisJZGV2LT53ZWlnaHQgPSBOQVBJX1dFSUdIVDsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisJZGV2LT5wb2xsX2NvbnRyb2xsZXIgPSB0YzM1ODE1X3BvbGxfY29udHJvbGxlcjsKKyNlbmRpZgorCisJZGV2LT5pcnEgPSBwZGV2LT5pcnE7CisJZGV2LT5iYXNlX2FkZHIgPSAodW5zaWduZWQgbG9uZykgaW9hZGRyOworCisJLyogZGV2LT5wcml2L2xwIHplcm9lZCBhbmQgYWxpZ25lZCBpbiBhbGxvY19ldGhlcmRldiAqLworCWxwID0gZGV2LT5wcml2OworCXNwaW5fbG9ja19pbml0KCZscC0+bG9jayk7CisJbHAtPnBjaV9kZXYgPSBwZGV2OworCWxwLT5ib2FyZHR5cGUgPSBlbnQtPmRyaXZlcl9kYXRhOworCisJbHAtPm1zZ19lbmFibGUgPSBORVRJRl9NU0dfVFhfRVJSIHwgTkVUSUZfTVNHX0hXIHwgTkVUSUZfTVNHX0RSViB8IE5FVElGX01TR19MSU5LOworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOworCisJLyogU29mdCByZXNldCB0aGUgY2hpcC4gKi8KKwl0YzM1ODE1X2NoaXBfcmVzZXQoZGV2KTsKKworCS8qIFJldHJpZXZlIHRoZSBldGhlcm5ldCBhZGRyZXNzLiAqLworCXRjMzU4MTVfaW5pdF9kZXZfYWRkcihkZXYpOworCisJcmMgPSByZWdpc3Rlcl9uZXRkZXYgKGRldik7CisJaWYgKHJjKQorCQlnb3RvIGVycl9vdXRfdW5tYXA7CisKKwltZW1jcHkoZGV2LT5wZXJtX2FkZHIsIGRldi0+ZGV2X2FkZHIsIGRldi0+YWRkcl9sZW4pOworCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyBhdCAweCVseCwgIgorCQkiJTIuMng6JTIuMng6JTIuMng6JTIuMng6JTIuMng6JTIuMngsICIKKwkJIklSUSAlZFxuIiwKKwkJZGV2LT5uYW1lLAorCQlib2FyZF9pbmZvW2VudC0+ZHJpdmVyX2RhdGFdLm5hbWUsCisJCWRldi0+YmFzZV9hZGRyLAorCQlkZXYtPmRldl9hZGRyWzBdLCBkZXYtPmRldl9hZGRyWzFdLAorCQlkZXYtPmRldl9hZGRyWzJdLCBkZXYtPmRldl9hZGRyWzNdLAorCQlkZXYtPmRldl9hZGRyWzRdLCBkZXYtPmRldl9hZGRyWzVdLAorCQlkZXYtPmlycSk7CisKKwlzZXR1cF90aW1lcigmbHAtPnRpbWVyLCB0YzM1ODE1X3RpbWVyLCAodW5zaWduZWQgbG9uZykgZGV2KTsKKwlscC0+bWlpLmRldiA9IGRldjsKKwlscC0+bWlpLm1kaW9fcmVhZCA9IHRjX21kaW9fcmVhZDsKKwlscC0+bWlpLm1kaW9fd3JpdGUgPSB0Y19tZGlvX3dyaXRlOworCWxwLT5taWkucGh5X2lkX21hc2sgPSAweDFmOworCWxwLT5taWkucmVnX251bV9tYXNrID0gMHgxZjsKKwl0YzM1ODE1X2ZpbmRfcGh5KGRldik7CisJbHAtPm1paS5waHlfaWQgPSBscC0+cGh5X2FkZHI7CisJbHAtPm1paS5mdWxsX2R1cGxleCA9IDA7CisJbHAtPm1paS5mb3JjZV9tZWRpYSA9IDA7CiAKIAlyZXR1cm4gMDsKIAotZXJyX291dF9pb3VubWFwOgotCWlvdW5tYXAoKHZvaWQgKikgZGV2LT5iYXNlX2FkZHIpOworZXJyX291dF91bm1hcDoKKwlpb3VubWFwKGlvYWRkcik7CitlcnJfb3V0X2ZyZWVfcmVzOgorCXBjaV9yZWxlYXNlX3JlZ2lvbnMgKHBkZXYpOwogZXJyX291dDoKLQlmcmVlX25ldGRldihkZXYpOwotCXJldHVybiByZXQ7CisJZnJlZV9uZXRkZXYgKGRldik7CisJcmV0dXJuIHJjOwogfQogCiAKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCB0YzM1ODE1X3JlbW92ZV9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEgKHBkZXYpOworCXVuc2lnbmVkIGxvbmcgbW1pb19hZGRyOworCisJbW1pb19hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwl1bnJlZ2lzdGVyX25ldGRldiAoZGV2KTsKKworCWlmIChtbWlvX2FkZHIpIHsKKwkJaW91bm1hcCAoKHZvaWQgX19pb21lbSAqKW1taW9fYWRkcik7CisJCXBjaV9yZWxlYXNlX3JlZ2lvbnMgKHBkZXYpOworCX0KKworCWZyZWVfbmV0ZGV2IChkZXYpOworCisJcGNpX3NldF9kcnZkYXRhIChwZGV2LCBOVUxMKTsKK30KKwogc3RhdGljIGludAogdGMzNTgxNV9pbml0X3F1ZXVlcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewpAQCAtNjI5LDQ0ICs3OTMsNjQgQEAKIAl1bnNpZ25lZCBsb25nIGZkX2FkZHI7CiAKIAlpZiAoIWxwLT5mZF9idWYpIHsKLQkJaWYgKHNpemVvZihzdHJ1Y3QgRkRlc2MpICsKLQkJICAgIHNpemVvZihzdHJ1Y3QgQkRlc2MpICogUlhfQlVGX1BBR0VTICsKLQkJICAgIHNpemVvZihzdHJ1Y3QgRkRlc2MpICogUlhfRkRfTlVNICsKLQkJICAgIHNpemVvZihzdHJ1Y3QgVHhGRCkgKiBUWF9GRF9OVU0gPiBQQUdFX1NJWkUgKiBGRF9QQUdFX05VTSkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEludmFsaWQgUXVldWUgU2l6ZS5cbiIsIGRldi0+bmFtZSk7Ci0JCQlyZXR1cm4gLUVOT01FTTsKLQkJfQorCQlCVUdfT04oc2l6ZW9mKHN0cnVjdCBGRGVzYykgKworCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBCRGVzYykgKiBSWF9CVUZfTlVNICsKKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgRkRlc2MpICogUlhfRkRfTlVNICsKKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgVHhGRCkgKiBUWF9GRF9OVU0gPgorCQkgICAgICAgUEFHRV9TSVpFICogRkRfUEFHRV9OVU0pOwogCi0JCWlmICgobHAtPmZkX2J1ZiA9ICh2b2lkICopX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLCBGRF9QQUdFX09SREVSKSkgPT0gMCkKKwkJaWYgKChscC0+ZmRfYnVmID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQobHAtPnBjaV9kZXYsIFBBR0VfU0laRSAqIEZEX1BBR0VfTlVNLCAmbHAtPmZkX2J1Zl9kbWEpKSA9PSAwKQogCQkJcmV0dXJuIC1FTk9NRU07Ci0JCWZvciAoaSA9IDA7IGkgPCBSWF9CVUZfUEFHRVM7IGkrKykgewotCQkJaWYgKChscC0+ZGF0YV9idWZbaV0gPSAodm9pZCAqKWdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKSkgPT0gMCkgeworCQlmb3IgKGkgPSAwOyBpIDwgUlhfQlVGX05VTTsgaSsrKSB7CisjaWZkZWYgVEMzNTgxNV9VU0VfUEFDS0VEQlVGRkVSCisJCQlpZiAoKGxwLT5kYXRhX2J1ZltpXSA9IGFsbG9jX3J4YnVmX3BhZ2UobHAtPnBjaV9kZXYsICZscC0+ZGF0YV9idWZfZG1hW2ldKSkgPT0gTlVMTCkgewogCQkJCXdoaWxlICgtLWkgPj0gMCkgewotCQkJCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpbHAtPmRhdGFfYnVmW2ldKTsKLQkJCQkJbHAtPmRhdGFfYnVmW2ldID0gMDsKKwkJCQkJZnJlZV9yeGJ1Zl9wYWdlKGxwLT5wY2lfZGV2LAorCQkJCQkJCWxwLT5kYXRhX2J1ZltpXSwKKwkJCQkJCQlscC0+ZGF0YV9idWZfZG1hW2ldKTsKKwkJCQkJbHAtPmRhdGFfYnVmW2ldID0gTlVMTDsKIAkJCQl9Ci0JCQkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWxwLT5mZF9idWYpOwotCQkJCWxwLT5mZF9idWYgPSAwOworCQkJCXBjaV9mcmVlX2NvbnNpc3RlbnQobHAtPnBjaV9kZXYsCisJCQkJCQkgICAgUEFHRV9TSVpFICogRkRfUEFHRV9OVU0sCisJCQkJCQkgICAgbHAtPmZkX2J1ZiwKKwkJCQkJCSAgICBscC0+ZmRfYnVmX2RtYSk7CisJCQkJbHAtPmZkX2J1ZiA9IE5VTEw7CiAJCQkJcmV0dXJuIC1FTk9NRU07CiAJCQl9Ci0jaWZkZWYgX19taXBzX18KLQkJCWRtYV9jYWNoZV93YmFja19pbnYoKHVuc2lnbmVkIGxvbmcpbHAtPmRhdGFfYnVmW2ldLCBQQUdFX1NJWkUgKiBGRF9QQUdFX05VTSk7CisjZWxzZQorCQkJbHAtPnJ4X3NrYnNbaV0uc2tiID0KKwkJCQlhbGxvY19yeGJ1Zl9za2IoZGV2LCBscC0+cGNpX2RldiwKKwkJCQkJCSZscC0+cnhfc2tic1tpXS5za2JfZG1hKTsKKwkJCWlmICghbHAtPnJ4X3NrYnNbaV0uc2tiKSB7CisJCQkJd2hpbGUgKC0taSA+PSAwKSB7CisJCQkJCWZyZWVfcnhidWZfc2tiKGxwLT5wY2lfZGV2LAorCQkJCQkJICAgICAgIGxwLT5yeF9za2JzW2ldLnNrYiwKKwkJCQkJCSAgICAgICBscC0+cnhfc2tic1tpXS5za2JfZG1hKTsKKwkJCQkJbHAtPnJ4X3NrYnNbaV0uc2tiID0gTlVMTDsKKwkJCQl9CisJCQkJcGNpX2ZyZWVfY29uc2lzdGVudChscC0+cGNpX2RldiwKKwkJCQkJCSAgICBQQUdFX1NJWkUgKiBGRF9QQUdFX05VTSwKKwkJCQkJCSAgICBscC0+ZmRfYnVmLAorCQkJCQkJICAgIGxwLT5mZF9idWZfZG1hKTsKKwkJCQlscC0+ZmRfYnVmID0gTlVMTDsKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCX0KICNlbmRpZgogCQl9Ci0jaWZkZWYgX19taXBzX18KLQkJZG1hX2NhY2hlX3diYWNrX2ludigodW5zaWduZWQgbG9uZylscC0+ZmRfYnVmLCBQQUdFX1NJWkUgKiBGRF9QQUdFX05VTSk7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogRkQgYnVmICVwIERhdGFCdWYiLAorCQkgICAgICAgZGV2LT5uYW1lLCBscC0+ZmRfYnVmKTsKKyNpZmRlZiBUQzM1ODE1X1VTRV9QQUNLRURCVUZGRVIKKwkJcHJpbnRrKCIgRGF0YUJ1ZiIpOworCQlmb3IgKGkgPSAwOyBpIDwgUlhfQlVGX05VTTsgaSsrKQorCQkJcHJpbnRrKCIgJXAiLCBscC0+ZGF0YV9idWZbaV0pOwogI2VuZGlmCisJCXByaW50aygiXG4iKTsKIAl9IGVsc2UgewotCQltZW1zZXQobHAtPmZkX2J1ZiwgMCwgUEFHRV9TSVpFICogRkRfUEFHRV9OVU0pOwotI2lmZGVmIF9fbWlwc19fCi0JCWRtYV9jYWNoZV93YmFja19pbnYoKHVuc2lnbmVkIGxvbmcpbHAtPmZkX2J1ZiwgUEFHRV9TSVpFICogRkRfUEFHRV9OVU0pOwotI2VuZGlmCisJCWZvciAoaSA9IDA7IGkgPCBGRF9QQUdFX05VTTsgaSsrKSB7CisJCQljbGVhcl9wYWdlKCh2b2lkICopKCh1bnNpZ25lZCBsb25nKWxwLT5mZF9idWYgKyBpICogUEFHRV9TSVpFKSk7CisJCX0KIAl9Ci0jaWZkZWYgX19taXBzX18KLQlmZF9hZGRyID0gKHVuc2lnbmVkIGxvbmcpdnRvbm9jYWNoZShscC0+ZmRfYnVmKTsKLSNlbHNlCiAJZmRfYWRkciA9ICh1bnNpZ25lZCBsb25nKWxwLT5mZF9idWY7Ci0jZW5kaWYKIAogCS8qIEZyZWUgRGVzY3JpcHRvcnMgKGZvciBSZWNlaXZlKSAqLwogCWxwLT5yZmRfYmFzZSA9IChzdHJ1Y3QgUnhGRCAqKWZkX2FkZHI7CkBAIC02NzUsMzQgKzg1OSw2NiBAQAogCQlscC0+cmZkX2Jhc2VbaV0uZmQuRkRDdGwgPSBjcHVfdG9fbGUzMihGRF9Db3duc0ZEKTsKIAl9CiAJbHAtPnJmZF9jdXIgPSBscC0+cmZkX2Jhc2U7Ci0JbHAtPnJmZF9saW1pdCA9IChzdHJ1Y3QgUnhGRCAqKShmZF9hZGRyIC0KLQkJCQkJc2l6ZW9mKHN0cnVjdCBGRGVzYykgLQotCQkJCQlzaXplb2Yoc3RydWN0IEJEZXNjKSAqIDMwKTsKKwlscC0+cmZkX2xpbWl0ID0gKHN0cnVjdCBSeEZEICopZmRfYWRkciAtIChSWF9GRF9SRVNFUlZFICsgMSk7CiAKIAkvKiBUcmFuc21pdCBEZXNjcmlwdG9ycyAqLwogCWxwLT50ZmRfYmFzZSA9IChzdHJ1Y3QgVHhGRCAqKWZkX2FkZHI7CiAJZmRfYWRkciArPSBzaXplb2Yoc3RydWN0IFR4RkQpICogVFhfRkRfTlVNOwogCWZvciAoaSA9IDA7IGkgPCBUWF9GRF9OVU07IGkrKykgewotCQlscC0+dGZkX2Jhc2VbaV0uZmQuRkROZXh0ID0gY3B1X3RvX2xlMzIodmlydF90b19idXMoJmxwLT50ZmRfYmFzZVtpKzFdKSk7Ci0JCWxwLT50ZmRfYmFzZVtpXS5mZC5GRFN5c3RlbSA9IGNwdV90b19sZTMyKDApOworCQlscC0+dGZkX2Jhc2VbaV0uZmQuRkROZXh0ID0gY3B1X3RvX2xlMzIoZmRfdmlydF90b19idXMobHAsICZscC0+dGZkX2Jhc2VbaSsxXSkpOworCQlscC0+dGZkX2Jhc2VbaV0uZmQuRkRTeXN0ZW0gPSBjcHVfdG9fbGUzMigweGZmZmZmZmZmKTsKIAkJbHAtPnRmZF9iYXNlW2ldLmZkLkZEQ3RsID0gY3B1X3RvX2xlMzIoMCk7CiAJfQotCWxwLT50ZmRfYmFzZVtUWF9GRF9OVU0tMV0uZmQuRkROZXh0ID0gY3B1X3RvX2xlMzIodmlydF90b19idXMoJmxwLT50ZmRfYmFzZVswXSkpOworCWxwLT50ZmRfYmFzZVtUWF9GRF9OVU0tMV0uZmQuRkROZXh0ID0gY3B1X3RvX2xlMzIoZmRfdmlydF90b19idXMobHAsICZscC0+dGZkX2Jhc2VbMF0pKTsKIAlscC0+dGZkX3N0YXJ0ID0gMDsKIAlscC0+dGZkX2VuZCA9IDA7CiAKIAkvKiBCdWZmZXIgTGlzdCAoZm9yIFJlY2VpdmUpICovCiAJbHAtPmZibF9wdHIgPSAoc3RydWN0IEZyRkQgKilmZF9hZGRyOwotCWxwLT5mYmxfcHRyLT5mZC5GRE5leHQgPSBjcHVfdG9fbGUzMih2aXJ0X3RvX2J1cyhscC0+ZmJsX3B0cikpOwotCWxwLT5mYmxfcHRyLT5mZC5GREN0bCA9IGNwdV90b19sZTMyKFJYX0JVRl9QQUdFUyB8IEZEX0Nvd25zRkQpOwotCWZvciAoaSA9IDA7IGkgPCBSWF9CVUZfUEFHRVM7IGkrKykgewotCQlscC0+ZmJsX3B0ci0+YmRbaV0uQnVmZkRhdGEgPSBjcHVfdG9fbGUzMih2aXJ0X3RvX2J1cyhscC0+ZGF0YV9idWZbaV0pKTsKKwlscC0+ZmJsX3B0ci0+ZmQuRkROZXh0ID0gY3B1X3RvX2xlMzIoZmRfdmlydF90b19idXMobHAsIGxwLT5mYmxfcHRyKSk7CisJbHAtPmZibF9wdHItPmZkLkZEQ3RsID0gY3B1X3RvX2xlMzIoUlhfQlVGX05VTSB8IEZEX0Nvd25zRkQpOworI2lmbmRlZiBUQzM1ODE1X1VTRV9QQUNLRURCVUZGRVIKKwkvKgorCSAqIG1vdmUgYWxsIGFsbG9jYXRlZCBza2JzIHRvIGhlYWQgb2Ygcnhfc2tic1tdIGFycmF5LgorCSAqIGZibF9jb3VudCBtaWdoZSBub3QgYmUgUlhfQlVGX05VTSBpZiBhbGxvY19yeGJ1Zl9za2IoKSBpbgorCSAqIHRjMzU4MTVfcngoKSBoYWQgZmFpbGVkLgorCSAqLworCWxwLT5mYmxfY291bnQgPSAwOworCWZvciAoaSA9IDA7IGkgPCBSWF9CVUZfTlVNOyBpKyspIHsKKwkJaWYgKGxwLT5yeF9za2JzW2ldLnNrYikgeworCQkJaWYgKGkgIT0gbHAtPmZibF9jb3VudCkgeworCQkJCWxwLT5yeF9za2JzW2xwLT5mYmxfY291bnRdLnNrYiA9CisJCQkJCWxwLT5yeF9za2JzW2ldLnNrYjsKKwkJCQlscC0+cnhfc2tic1tscC0+ZmJsX2NvdW50XS5za2JfZG1hID0KKwkJCQkJbHAtPnJ4X3NrYnNbaV0uc2tiX2RtYTsKKwkJCX0KKwkJCWxwLT5mYmxfY291bnQrKzsKKwkJfQorCX0KKyNlbmRpZgorCWZvciAoaSA9IDA7IGkgPCBSWF9CVUZfTlVNOyBpKyspIHsKKyNpZmRlZiBUQzM1ODE1X1VTRV9QQUNLRURCVUZGRVIKKwkJbHAtPmZibF9wdHItPmJkW2ldLkJ1ZmZEYXRhID0gY3B1X3RvX2xlMzIobHAtPmRhdGFfYnVmX2RtYVtpXSk7CisjZWxzZQorCQlpZiAoaSA+PSBscC0+ZmJsX2NvdW50KSB7CisJCQlscC0+ZmJsX3B0ci0+YmRbaV0uQnVmZkRhdGEgPSAwOworCQkJbHAtPmZibF9wdHItPmJkW2ldLkJEQ3RsID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWxwLT5mYmxfcHRyLT5iZFtpXS5CdWZmRGF0YSA9CisJCQljcHVfdG9fbGUzMihscC0+cnhfc2tic1tpXS5za2JfZG1hKTsKKyNlbmRpZgogCQkvKiBCRElEIGlzIGluZGV4IG9mIEZyRkQuYmRbXSAqLwogCQlscC0+ZmJsX3B0ci0+YmRbaV0uQkRDdGwgPQotCQkJY3B1X3RvX2xlMzIoQkRfQ293bnNCRCB8IChpIDw8IEJEX1J4QkRJRF9TSElGVCkgfCBQQUdFX1NJWkUpOworCQkJY3B1X3RvX2xlMzIoQkRfQ293bnNCRCB8IChpIDw8IEJEX1J4QkRJRF9TSElGVCkgfAorCQkJCSAgICBSWF9CVUZfU0laRSk7CiAJfQorI2lmZGVmIFRDMzU4MTVfVVNFX1BBQ0tFREJVRkZFUgogCWxwLT5mYmxfY3VyaWQgPSAwOworI2VuZGlmCiAKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFR4RkQgJXAgUnhGRCAlcCBGckZEICVwXG4iLAorCSAgICAgICBkZXYtPm5hbWUsIGxwLT50ZmRfYmFzZSwgbHAtPnJmZF9iYXNlLCBscC0+ZmJsX3B0cik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTcxMywxMSArOTI5LDI1IEBACiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgVFhfRkRfTlVNOyBpKyspIHsKLQkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKQotCQkJbGUzMl90b19jcHUobHAtPnRmZF9iYXNlW2ldLmZkLkZEU3lzdGVtKTsKLQkJaWYgKHNrYikKKwkJdTMyIGZkc3lzdGVtID0gbGUzMl90b19jcHUobHAtPnRmZF9iYXNlW2ldLmZkLkZEU3lzdGVtKTsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9CisJCQlmZHN5c3RlbSAhPSAweGZmZmZmZmZmID8KKwkJCWxwLT50eF9za2JzW2Zkc3lzdGVtXS5za2IgOiBOVUxMOworI2lmZGVmIERFQlVHCisJCWlmIChscC0+dHhfc2tic1tpXS5za2IgIT0gc2tiKSB7CisJCQlwcmludGsoIiVzOiB0eF9za2JzIG1pc21hdGNoKCVkKS5cbiIsIGRldi0+bmFtZSwgaSk7CisJCQlwYW5pY19xdWV1ZXMoZGV2KTsKKwkJfQorI2Vsc2UKKwkJQlVHX09OKGxwLT50eF9za2JzW2ldLnNrYiAhPSBza2IpOworI2VuZGlmCisJCWlmIChza2IpIHsKKwkJCXBjaV91bm1hcF9zaW5nbGUobHAtPnBjaV9kZXYsIGxwLT50eF9za2JzW2ldLnNrYl9kbWEsIHNrYi0+bGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCWxwLT50eF9za2JzW2ldLnNrYiA9IE5VTEw7CisJCQlscC0+dHhfc2tic1tpXS5za2JfZG1hID0gMDsKIAkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7Ci0JCWxwLT50ZmRfYmFzZVtpXS5mZC5GRFN5c3RlbSA9IGNwdV90b19sZTMyKDApOworCQl9CisJCWxwLT50ZmRfYmFzZVtpXS5mZC5GRFN5c3RlbSA9IGNwdV90b19sZTMyKDB4ZmZmZmZmZmYpOwogCX0KIAogCXRjMzU4MTVfaW5pdF9xdWV1ZXMoZGV2KTsKQEAgLTczMSwyOCArOTYxLDUzIEBACiAKIAlpZiAobHAtPnRmZF9iYXNlKSB7CiAJCWZvciAoaSA9IDA7IGkgPCBUWF9GRF9OVU07IGkrKykgewotCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKQotCQkJCWxlMzJfdG9fY3B1KGxwLT50ZmRfYmFzZVtpXS5mZC5GRFN5c3RlbSk7Ci0JCQlpZiAoc2tiKQotCQkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7Ci0JCQlscC0+dGZkX2Jhc2VbaV0uZmQuRkRTeXN0ZW0gPSBjcHVfdG9fbGUzMigwKTsKKwkJCXUzMiBmZHN5c3RlbSA9IGxlMzJfdG9fY3B1KGxwLT50ZmRfYmFzZVtpXS5mZC5GRFN5c3RlbSk7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0KKwkJCQlmZHN5c3RlbSAhPSAweGZmZmZmZmZmID8KKwkJCQlscC0+dHhfc2tic1tmZHN5c3RlbV0uc2tiIDogTlVMTDsKKyNpZmRlZiBERUJVRworCQkJaWYgKGxwLT50eF9za2JzW2ldLnNrYiAhPSBza2IpIHsKKwkJCQlwcmludGsoIiVzOiB0eF9za2JzIG1pc21hdGNoKCVkKS5cbiIsIGRldi0+bmFtZSwgaSk7CisJCQkJcGFuaWNfcXVldWVzKGRldik7CisJCQl9CisjZWxzZQorCQkJQlVHX09OKGxwLT50eF9za2JzW2ldLnNrYiAhPSBza2IpOworI2VuZGlmCisJCQlpZiAoc2tiKSB7CisJCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQkJCXBjaV91bm1hcF9zaW5nbGUobHAtPnBjaV9kZXYsIGxwLT50eF9za2JzW2ldLnNrYl9kbWEsIHNrYi0+bGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCQlscC0+dHhfc2tic1tpXS5za2IgPSBOVUxMOworCQkJCWxwLT50eF9za2JzW2ldLnNrYl9kbWEgPSAwOworCQkJfQorCQkJbHAtPnRmZF9iYXNlW2ldLmZkLkZEU3lzdGVtID0gY3B1X3RvX2xlMzIoMHhmZmZmZmZmZik7CiAJCX0KIAl9CiAKIAlscC0+cmZkX2Jhc2UgPSBOVUxMOwotCWxwLT5yZmRfYmFzZSA9IE5VTEw7CiAJbHAtPnJmZF9saW1pdCA9IE5VTEw7CiAJbHAtPnJmZF9jdXIgPSBOVUxMOwogCWxwLT5mYmxfcHRyID0gTlVMTDsKIAotCWZvciAoaSA9IDA7IGkgPCBSWF9CVUZfUEFHRVM7IGkrKykgewotCQlpZiAobHAtPmRhdGFfYnVmW2ldKQotCQkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWxwLT5kYXRhX2J1ZltpXSk7Ci0JCWxwLT5kYXRhX2J1ZltpXSA9IDA7CisJZm9yIChpID0gMDsgaSA8IFJYX0JVRl9OVU07IGkrKykgeworI2lmZGVmIFRDMzU4MTVfVVNFX1BBQ0tFREJVRkZFUgorCQlpZiAobHAtPmRhdGFfYnVmW2ldKSB7CisJCQlmcmVlX3J4YnVmX3BhZ2UobHAtPnBjaV9kZXYsCisJCQkJCWxwLT5kYXRhX2J1ZltpXSwgbHAtPmRhdGFfYnVmX2RtYVtpXSk7CisJCQlscC0+ZGF0YV9idWZbaV0gPSBOVUxMOworCQl9CisjZWxzZQorCQlpZiAobHAtPnJ4X3NrYnNbaV0uc2tiKSB7CisJCQlmcmVlX3J4YnVmX3NrYihscC0+cGNpX2RldiwgbHAtPnJ4X3NrYnNbaV0uc2tiLAorCQkJCSAgICAgICBscC0+cnhfc2tic1tpXS5za2JfZG1hKTsKKwkJCWxwLT5yeF9za2JzW2ldLnNrYiA9IE5VTEw7CisJCX0KKyNlbmRpZgogCX0KLQlpZiAobHAtPmZkX2J1ZikKLQkJX19mcmVlX3BhZ2VzKGxwLT5mZF9idWYsIEZEX1BBR0VfT1JERVIpOwotCWxwLT5mZF9idWYgPSBOVUxMOworCWlmIChscC0+ZmRfYnVmKSB7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQobHAtPnBjaV9kZXYsIFBBR0VfU0laRSAqIEZEX1BBR0VfTlVNLAorCQkJCSAgICBscC0+ZmRfYnVmLCBscC0+ZmRfYnVmX2RtYSk7CisJCWxwLT5mZF9idWYgPSBOVUxMOworCX0KIH0KIAogc3RhdGljIHZvaWQKQEAgLTc5Miw2ICsxMDQ3LDcgQEAKIAlyZXR1cm4gYmRfY291bnQ7CiB9CiAKKyNpZiBkZWZpbmVkKERFQlVHKSB8fCBkZWZpbmVkKFRDMzU4MTVfVVNFX1BBQ0tFREJVRkZFUikKIHN0YXRpYyB2b2lkCiBkdW1wX2ZyZmQoc3RydWN0IEZyRkQgKmZkKQogewpAQCAtODAyLDIwICsxMDU4LDIyIEBACiAJICAgICAgIGxlMzJfdG9fY3B1KGZkLT5mZC5GRFN0YXQpLAogCSAgICAgICBsZTMyX3RvX2NwdShmZC0+ZmQuRkRDdGwpKTsKIAlwcmludGsoIkJEOiAiKTsKLQlmb3IgKGkgPSAwOyBpIDwgUlhfQlVGX1BBR0VTOyBpKyspCisJZm9yIChpID0gMDsgaSA8IFJYX0JVRl9OVU07IGkrKykKIAkJcHJpbnRrKCIgJTA4eCAlMDh4IiwKIAkJICAgICAgIGxlMzJfdG9fY3B1KGZkLT5iZFtpXS5CdWZmRGF0YSksCiAJCSAgICAgICBsZTMyX3RvX2NwdShmZC0+YmRbaV0uQkRDdGwpKTsKIAlwcmludGsoIlxuIik7CiB9CisjZW5kaWYKIAorI2lmZGVmIERFQlVHCiBzdGF0aWMgdm9pZAogcGFuaWNfcXVldWVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHRjMzU4MTVfbG9jYWwgKmxwID0gZGV2LT5wcml2OwogCWludCBpOwogCi0JcHJpbnRrKCJUeEZEIGJhc2UgJXAsIHN0YXJ0ICVkLCBlbmQgJWRcbiIsCisJcHJpbnRrKCJUeEZEIGJhc2UgJXAsIHN0YXJ0ICV1LCBlbmQgJXVcbiIsCiAJICAgICAgIGxwLT50ZmRfYmFzZSwgbHAtPnRmZF9zdGFydCwgbHAtPnRmZF9lbmQpOwogCXByaW50aygiUnhGRCBiYXNlICVwIGxpbWl0ICVwIGN1ciAlcFxuIiwKIAkgICAgICAgbHAtPnJmZF9iYXNlLCBscC0+cmZkX2xpbWl0LCBscC0+cmZkX2N1cik7CkBAIC04MjksMzEgKzEwODcsMTMgQEAKIAlkdW1wX2ZyZmQobHAtPmZibF9wdHIpOwogCXBhbmljKCIlczogSWxsZWdhbCBxdWV1ZSBzdGF0ZS4iLCBkZXYtPm5hbWUpOwogfQotCi0jaWYgMAotc3RhdGljIHZvaWQgcHJpbnRfYnVmKGNoYXIgKmFkZCwgaW50IGxlbmd0aCkKLXsKLQlpbnQgaTsKLQlpbnQgbGVuID0gbGVuZ3RoOwotCi0JcHJpbnRrKCJwcmludF9idWYoJTA4eCkoJXgpXG4iLCAodW5zaWduZWQgaW50KSBhZGQsbGVuZ3RoKTsKLQotCWlmIChsZW4gPiAxMDApCi0JCWxlbiA9IDEwMDsKLQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJcHJpbnRrKCIgJTIuMlgiLCAodW5zaWduZWQgY2hhcikgYWRkW2ldKTsKLQkJaWYgKCEoaSAlIDE2KSkKLQkJCXByaW50aygiXG4iKTsKLQl9Ci0JcHJpbnRrKCJcbiIpOwotfQogI2VuZGlmCiAKIHN0YXRpYyB2b2lkIHByaW50X2V0aChjaGFyICphZGQpCiB7CiAJaW50IGk7CiAKLQlwcmludGsoInByaW50X2V0aCglMDh4KVxuIiwgKHVuc2lnbmVkIGludCkgYWRkKTsKKwlwcmludGsoInByaW50X2V0aCglcClcbiIsIGFkZCk7CiAJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKIAkJcHJpbnRrKCIgJTIuMlgiLCAodW5zaWduZWQgY2hhcikgYWRkW2kgKyA2XSk7CiAJcHJpbnRrKCIgPT4iKTsKQEAgLTg2Miw2ICsxMTAyLDczIEBACiAJcHJpbnRrKCIgOiAlMi4yWCUyLjJYXG4iLCAodW5zaWduZWQgY2hhcikgYWRkWzEyXSwgKHVuc2lnbmVkIGNoYXIpIGFkZFsxM10pOwogfQogCitzdGF0aWMgaW50IHRjMzU4MTVfdHhfZnVsbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0YzM1ODE1X2xvY2FsICpscCA9IGRldi0+cHJpdjsKKwlyZXR1cm4gKChscC0+dGZkX3N0YXJ0ICsgMSkgJSBUWF9GRF9OVU0gPT0gbHAtPnRmZF9lbmQpOworfQorCitzdGF0aWMgdm9pZCB0YzM1ODE1X3Jlc3RhcnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdGMzNTgxNV9sb2NhbCAqbHAgPSBkZXYtPnByaXY7CisJaW50IHBpZCA9IGxwLT5waHlfYWRkcjsKKwlpbnQgZG9fcGh5X3Jlc2V0ID0gMTsKKwlkZWxfdGltZXIoJmxwLT50aW1lcik7CQkvKiBLaWxsIGlmIHJ1bm5pbmcJKi8KKworCWlmIChscC0+bWlpX2lkWzBdID09IDB4MDAxNiAmJiAobHAtPm1paV9pZFsxXSAmIDB4ZmMwMCkgPT0gMHhmODAwKSB7CisJCS8qIFJlc2V0dGluZyBQSFkgY2F1c2UgcHJvYmxlbSBvbiBzb21lIGNoaXAuLi4gKFNFRVEgODAyMjEpICovCisJCWRvX3BoeV9yZXNldCA9IDA7CisJfQorCWlmIChkb19waHlfcmVzZXQpIHsKKwkJaW50IHRpbWVvdXQ7CisJCXRjX21kaW9fd3JpdGUoZGV2LCBwaWQsIE1JSV9CTUNSLCBCTUNSX1JFU0VUKTsKKwkJdGltZW91dCA9IDEwMDsKKwkJd2hpbGUgKC0tdGltZW91dCkgeworCQkJaWYgKCEodGNfbWRpb19yZWFkKGRldiwgcGlkLCBNSUlfQk1DUikgJiBCTUNSX1JFU0VUKSkKKwkJCQlicmVhazsKKwkJCXVkZWxheSgxKTsKKwkJfQorCQlpZiAoIXRpbWVvdXQpCisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBCTUNSIHJlc2V0IGZhaWxlZC5cbiIsIGRldi0+bmFtZSk7CisJfQorCisJdGMzNTgxNV9jaGlwX3Jlc2V0KGRldik7CisJdGMzNTgxNV9jbGVhcl9xdWV1ZXMoZGV2KTsKKwl0YzM1ODE1X2NoaXBfaW5pdChkZXYpOworCS8qIFJlY29uZmlndXJlIENBTSBhZ2FpbiBzaW5jZSB0YzM1ODE1X2NoaXBfaW5pdCgpIGluaXRpYWxpemUgaXQuICovCisJdGMzNTgxNV9zZXRfbXVsdGljYXN0X2xpc3QoZGV2KTsKK30KKworc3RhdGljIHZvaWQgdGMzNTgxNV90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHRjMzU4MTVfbG9jYWwgKmxwID0gZGV2LT5wcml2OworCXN0cnVjdCB0YzM1ODE1X3JlZ3MgX19pb21lbSAqdHIgPQorCQkoc3RydWN0IHRjMzU4MTVfcmVncyBfX2lvbWVtICopZGV2LT5iYXNlX2FkZHI7CisKKwlwcmludGsoS0VSTl9XQVJOSU5HICIlczogdHJhbnNtaXQgdGltZWQgb3V0LCBzdGF0dXMgJSN4XG4iLAorCSAgICAgICBkZXYtPm5hbWUsIHRjX3JlYWRsKCZ0ci0+VHhfU3RhdCkpOworCisJLyogVHJ5IHRvIHJlc3RhcnQgdGhlIGFkYXB0b3IuICovCisJc3Bpbl9sb2NrX2lycSgmbHAtPmxvY2spOworCXRjMzU4MTVfcmVzdGFydChkZXYpOworCXNwaW5fdW5sb2NrX2lycSgmbHAtPmxvY2spOworCisJbHAtPnN0YXRzLnR4X2Vycm9ycysrOworCisJLyogSWYgd2UgaGF2ZSBzcGFjZSBhdmFpbGFibGUgdG8gYWNjZXB0IG5ldyB0cmFuc21pdAorCSAqIHJlcXVlc3RzLCB3YWtlIHVwIHRoZSBxdWV1ZWluZyBsYXllci4gIFRoaXMgd291bGQKKwkgKiBiZSB0aGUgY2FzZSBpZiB0aGUgY2hpcHNldF9pbml0KCkgY2FsbCBhYm92ZSBqdXN0CisJICogZmx1c2hlcyBvdXQgdGhlIHR4IHF1ZXVlIGFuZCBlbXB0aWVzIGl0LgorCSAqCisJICogSWYgaW5zdGVhZCwgdGhlIHR4IHF1ZXVlIGlzIHJldGFpbmVkIHRoZW4gdGhlCisJICogbmV0aWZfd2FrZV9xdWV1ZSgpIGNhbGwgc2hvdWxkIGJlIHBsYWNlZCBpbiB0aGUKKwkgKiBUWCBjb21wbGV0aW9uIGludGVycnVwdCBoYW5kbGVyIG9mIHRoZSBkcml2ZXIgaW5zdGVhZAorCSAqIG9mIGhlcmUuCisJICovCisJaWYgKCF0YzM1ODE1X3R4X2Z1bGwoZGV2KSkKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCiAvKgogICogT3Blbi9pbml0aWFsaXplIHRoZSBib2FyZC4gVGhpcyBpcyBjYWxsZWQgKGluIHRoZSBjdXJyZW50IGtlcm5lbCkKICAqIHNvbWV0aW1lIGFmdGVyIGJvb3Rpbmcgd2hlbiB0aGUgJ2lmY29uZmlnJyBwcm9ncmFtIGlzIHJ1bi4KQEAgLTg3NCwxNiArMTE4MSwxNiBAQAogdGMzNTgxNV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHRjMzU4MTVfbG9jYWwgKmxwID0gZGV2LT5wcml2OworCiAJLyoKIAkgKiBUaGlzIGlzIHVzZWQgaWYgdGhlIGludGVycnVwdCBsaW5lIGNhbiB0dXJuZWQgb2ZmIChzaGFyZWQpLgogCSAqIFNlZSAzYzUwMy5jIGZvciBhbiBleGFtcGxlIG9mIHNlbGVjdGluZyB0aGUgSVJRIGF0IGNvbmZpZy10aW1lLgogCSAqLwotCi0JaWYgKGRldi0+aXJxID09IDAgIHx8Ci0JICAgIHJlcXVlc3RfaXJxKGRldi0+aXJxLCAmdGMzNTgxNV9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELCBjYXJkbmFtZSwgZGV2KSkgeworCWlmIChyZXF1ZXN0X2lycShkZXYtPmlycSwgJnRjMzU4MTVfaW50ZXJydXB0LCBJUlFGX1NIQVJFRCwgZGV2LT5uYW1lLCBkZXYpKSB7CiAJCXJldHVybiAtRUFHQUlOOwogCX0KIAorCWRlbF90aW1lcigmbHAtPnRpbWVyKTsJCS8qIEtpbGwgaWYgcnVubmluZwkqLwogCXRjMzU4MTVfY2hpcF9yZXNldChkZXYpOwogCiAJaWYgKHRjMzU4MTVfaW5pdF9xdWV1ZXMoZGV2KSAhPSAwKSB7CkBAIC04OTIsMTM4ICsxMTk5LDExOSBAQAogCX0KIAogCS8qIFJlc2V0IHRoZSBoYXJkd2FyZSBoZXJlLiBEb24ndCBmb3JnZXQgdG8gc2V0IHRoZSBzdGF0aW9uIGFkZHJlc3MuICovCisJc3Bpbl9sb2NrX2lycSgmbHAtPmxvY2spOwogCXRjMzU4MTVfY2hpcF9pbml0KGRldik7CisJc3Bpbl91bmxvY2tfaXJxKCZscC0+bG9jayk7CiAKLQlscC0+dGJ1c3kgPSAwOworCS8qIFdlIGFyZSBub3cgcmVhZHkgdG8gYWNjZXB0IHRyYW5zbWl0IHJlcXVldXN0cyBmcm9tCisJICogdGhlIHF1ZXVlaW5nIGxheWVyIG9mIHRoZSBuZXR3b3JraW5nLgorCSAqLwogCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgdGMzNTgxNV90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IHRjMzU4MTVfbG9jYWwgKmxwID0gZGV2LT5wcml2OwotCXN0cnVjdCB0YzM1ODE1X3JlZ3MgKnRyID0gKHN0cnVjdCB0YzM1ODE1X3JlZ3MgKilkZXYtPmJhc2VfYWRkcjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5sb2NrLCBmbGFncyk7Ci0JcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHRyYW5zbWl0IHRpbWVkIG91dCwgc3RhdHVzICUjbHhcbiIsCi0JICAgICAgIGRldi0+bmFtZSwgdGNfcmVhZGwoJnRyLT5UeF9TdGF0KSk7Ci0JLyogVHJ5IHRvIHJlc3RhcnQgdGhlIGFkYXB0b3IuICovCi0JdGMzNTgxNV9jaGlwX3Jlc2V0KGRldik7Ci0JdGMzNTgxNV9jbGVhcl9xdWV1ZXMoZGV2KTsKLQl0YzM1ODE1X2NoaXBfaW5pdChkZXYpOwotCWxwLT50YnVzeT0wOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7Ci0JZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7Ci0JbmV0aWZfd2FrZV9xdWV1ZShkZXYpOwotfQotCisvKiBUaGlzIHdpbGwgb25seSBiZSBpbnZva2VkIGlmIHlvdXIgZHJpdmVyIGlzIF9ub3RfIGluIFhPRkYgc3RhdGUuCisgKiBXaGF0IHRoaXMgbWVhbnMgaXMgdGhhdCB5b3UgbmVlZCBub3QgY2hlY2sgaXQsIGFuZCB0aGF0IHRoaXMKKyAqIGludmFyaWFudCB3aWxsIGhvbGQgaWYgeW91IG1ha2Ugc3VyZSB0aGF0IHRoZSBuZXRpZl8qX3F1ZXVlKCkKKyAqIGNhbGxzIGFyZSBkb25lIGF0IHRoZSBwcm9wZXIgdGltZXMuCisgKi8KIHN0YXRpYyBpbnQgdGMzNTgxNV9zZW5kX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCB0YzM1ODE1X2xvY2FsICpscCA9IGRldi0+cHJpdjsKLQlzdHJ1Y3QgdGMzNTgxNV9yZWdzICp0ciA9IChzdHJ1Y3QgdGMzNTgxNV9yZWdzICopZGV2LT5iYXNlX2FkZHI7CisJc3RydWN0IFR4RkQgKnR4ZmQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikpIHsKLQkJLyoKLQkJICogSWYgd2UgZ2V0IGhlcmUsIHNvbWUgaGlnaGVyIGxldmVsIGhhcyBkZWNpZGVkIHdlIGFyZSBicm9rZW4uCi0JCSAqIFRoZXJlIHNob3VsZCByZWFsbHkgYmUgYSAia2ljayBtZSIgZnVuY3Rpb24gY2FsbCBpbnN0ZWFkLgotCQkgKi8KLQkJaW50IHRpY2tzc29mYXIgPSBqaWZmaWVzIC0gZGV2LT50cmFuc19zdGFydDsKLQkJaWYgKHRpY2tzc29mYXIgPCA1KQotCQkJcmV0dXJuIDE7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB0cmFuc21pdCB0aW1lZCBvdXQsIHN0YXR1cyAlI2x4XG4iLAotCQkgICAgICAgZGV2LT5uYW1lLCB0Y19yZWFkbCgmdHItPlR4X1N0YXQpKTsKLQkJLyogVHJ5IHRvIHJlc3RhcnQgdGhlIGFkYXB0b3IuICovCi0JCXRjMzU4MTVfY2hpcF9yZXNldChkZXYpOwotCQl0YzM1ODE1X2NsZWFyX3F1ZXVlcyhkZXYpOwotCQl0YzM1ODE1X2NoaXBfaW5pdChkZXYpOwotCQlscC0+dGJ1c3k9MDsKLQkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7Ci0JCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKLQl9Ci0KLQkvKgotCSAqIEJsb2NrIGEgdGltZXItYmFzZWQgdHJhbnNtaXQgZnJvbSBvdmVybGFwcGluZy4gVGhpcyBjb3VsZCBiZXR0ZXIgYmUKLQkgKiBkb25lIHdpdGggYXRvbWljX3N3YXAoMSwgbHAtPnRidXN5KSwgYnV0IHNldF9iaXQoKSB3b3JrcyBhcyB3ZWxsLgorCS8qIElmIHNvbWUgZXJyb3Igb2NjdXJzIHdoaWxlIHRyeWluZyB0byB0cmFuc21pdCB0aGlzCisJICogcGFja2V0LCB5b3Ugc2hvdWxkIHJldHVybiAnMScgZnJvbSB0aGlzIGZ1bmN0aW9uLgorCSAqIEluIHN1Y2ggYSBjYXNlIHlvdSBfbWF5IG5vdF8gZG8gYW55dGhpbmcgdG8gdGhlCisJICogU0tCLCBpdCBpcyBzdGlsbCBvd25lZCBieSB0aGUgbmV0d29yayBxdWV1ZWluZworCSAqIGxheWVyIHdoZW4gYW4gZXJyb3IgaXMgcmV0dXJuZWQuICBUaGlzIG1lYW5zIHlvdQorCSAqIG1heSBub3QgbW9kaWZ5IGFueSBTS0IgZmllbGRzLCB5b3UgbWF5IG5vdCBmcmVlCisJICogdGhlIFNLQiwgZXRjLgogCSAqLwotCWlmICh0ZXN0X2FuZF9zZXRfYml0KDAsICh2b2lkKikmbHAtPnRidXN5KSAhPSAwKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBUcmFuc21pdHRlciBhY2Nlc3MgY29uZmxpY3QuXG4iLCBkZXYtPm5hbWUpOwotCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwotCX0gZWxzZSB7Ci0JCXNob3J0IGxlbmd0aCA9IEVUSF9aTEVOIDwgc2tiLT5sZW4gPyBza2ItPmxlbiA6IEVUSF9aTEVOOwotCQl1bnNpZ25lZCBjaGFyICpidWYgPSBza2ItPmRhdGE7Ci0JCXN0cnVjdCBUeEZEICp0eGZkID0gJmxwLT50ZmRfYmFzZVtscC0+dGZkX3N0YXJ0XTsKLQkJdW5zaWduZWQgbG9uZyBmbGFnczsKLQkJbHAtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOwogCisJLyogVGhpcyBpcyB0aGUgbW9zdCBjb21tb24gY2FzZSBmb3IgbW9kZXJuIGhhcmR3YXJlLgorCSAqIFRoZSBzcGlubG9jayBwcm90ZWN0cyB0aGlzIGNvZGUgZnJvbSB0aGUgVFggY29tcGxldGUKKwkgKiBoYXJkd2FyZSBpbnRlcnJ1cHQgaGFuZGxlci4gIFF1ZXVlIGZsb3cgY29udHJvbCBpcworCSAqIHRodXMgbWFuYWdlZCB1bmRlciB0aGlzIGxvY2sgYXMgd2VsbC4KKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmxvY2ssIGZsYWdzKTsKIAotI2lmZGVmIF9fbWlwc19fCi0JCWRtYV9jYWNoZV93YmFja19pbnYoKHVuc2lnbmVkIGxvbmcpYnVmLCBsZW5ndGgpOworCS8qIGZhaWxzYWZlLi4uIChoYW5kbGUgdHhkb25lIG5vdyBpZiBoYWxmIG9mIEZEcyBhcmUgdXNlZCkgKi8KKwlpZiAoKGxwLT50ZmRfc3RhcnQgKyBUWF9GRF9OVU0gLSBscC0+dGZkX2VuZCkgJSBUWF9GRF9OVU0gPgorCSAgICBUWF9GRF9OVU0gLyAyKQorCQl0YzM1ODE1X3R4ZG9uZShkZXYpOworCisJaWYgKG5ldGlmX21zZ19wa3RkYXRhKGxwKSkKKwkJcHJpbnRfZXRoKHNrYi0+ZGF0YSk7CisjaWZkZWYgREVCVUcKKwlpZiAobHAtPnR4X3NrYnNbbHAtPnRmZF9zdGFydF0uc2tiKSB7CisJCXByaW50aygiJXM6IHR4X3NrYnMgY29uZmxpY3QuXG4iLCBkZXYtPm5hbWUpOworCQlwYW5pY19xdWV1ZXMoZGV2KTsKKwl9CisjZWxzZQorCUJVR19PTihscC0+dHhfc2tic1tscC0+dGZkX3N0YXJ0XS5za2IpOwogI2VuZGlmCisJbHAtPnR4X3NrYnNbbHAtPnRmZF9zdGFydF0uc2tiID0gc2tiOworCWxwLT50eF9za2JzW2xwLT50ZmRfc3RhcnRdLnNrYl9kbWEgPSBwY2lfbWFwX3NpbmdsZShscC0+cGNpX2Rldiwgc2tiLT5kYXRhLCBza2ItPmxlbiwgUENJX0RNQV9UT0RFVklDRSk7CiAKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5sb2NrLCBmbGFncyk7CisJLyphZGQgdG8gcmluZyAqLworCXR4ZmQgPSAmbHAtPnRmZF9iYXNlW2xwLT50ZmRfc3RhcnRdOworCXR4ZmQtPmJkLkJ1ZmZEYXRhID0gY3B1X3RvX2xlMzIobHAtPnR4X3NrYnNbbHAtPnRmZF9zdGFydF0uc2tiX2RtYSk7CisJdHhmZC0+YmQuQkRDdGwgPSBjcHVfdG9fbGUzMihza2ItPmxlbik7CisJdHhmZC0+ZmQuRkRTeXN0ZW0gPSBjcHVfdG9fbGUzMihscC0+dGZkX3N0YXJ0KTsKKwl0eGZkLT5mZC5GREN0bCA9IGNwdV90b19sZTMyKEZEX0Nvd25zRkQgfCAoMSA8PCBGRF9CRENudF9TSElGVCkpOwogCi0JCS8qIGZhaWxzYWZlLi4uICovCi0JCWlmIChscC0+dGZkX3N0YXJ0ICE9IGxwLT50ZmRfZW5kKQotCQkJdGMzNTgxNV90eGRvbmUoZGV2KTsKLQotCi0JCXR4ZmQtPmJkLkJ1ZmZEYXRhID0gY3B1X3RvX2xlMzIodmlydF90b19idXMoYnVmKSk7Ci0KLQkJdHhmZC0+YmQuQkRDdGwgPSBjcHVfdG9fbGUzMihsZW5ndGgpOwotCQl0eGZkLT5mZC5GRFN5c3RlbSA9IGNwdV90b19sZTMyKChfX3UzMilza2IpOwotCQl0eGZkLT5mZC5GREN0bCA9IGNwdV90b19sZTMyKEZEX0Nvd25zRkQgfCAoMSA8PCBGRF9CRENudF9TSElGVCkpOwotCi0JCWlmIChscC0+dGZkX3N0YXJ0ID09IGxwLT50ZmRfZW5kKSB7Ci0JCQkvKiBTdGFydCBETUEgVHJhbnNtaXR0ZXIuICovCi0JCQl0eGZkLT5mZC5GRE5leHQgfD0gY3B1X3RvX2xlMzIoRkRfTmV4dF9FT0wpOworCWlmIChscC0+dGZkX3N0YXJ0ID09IGxwLT50ZmRfZW5kKSB7CisJCXN0cnVjdCB0YzM1ODE1X3JlZ3MgX19pb21lbSAqdHIgPQorCQkJKHN0cnVjdCB0YzM1ODE1X3JlZ3MgX19pb21lbSAqKWRldi0+YmFzZV9hZGRyOworCQkvKiBTdGFydCBETUEgVHJhbnNtaXR0ZXIuICovCisJCXR4ZmQtPmZkLkZETmV4dCB8PSBjcHVfdG9fbGUzMihGRF9OZXh0X0VPTCk7CiAjaWZkZWYgR0FUSEVSX1RYSU5UCi0JCQl0eGZkLT5mZC5GREN0bCB8PSBjcHVfdG9fbGUzMihGRF9Gcm1PcHRfSW50VHgpOworCQl0eGZkLT5mZC5GREN0bCB8PSBjcHVfdG9fbGUzMihGRF9Gcm1PcHRfSW50VHgpOwogI2VuZGlmCi0JCQlpZiAodGMzNTgxNV9kZWJ1ZyA+IDIpIHsKLQkJCQlwcmludGsoIiVzOiBzdGFydGluZyBUeEZELlxuIiwgZGV2LT5uYW1lKTsKLQkJCQlkdW1wX3R4ZmQodHhmZCk7Ci0JCQkJaWYgKHRjMzU4MTVfZGVidWcgPiAzKQotCQkJCQlwcmludF9ldGgoYnVmKTsKLQkJCX0KLQkJCXRjX3dyaXRlbCh2aXJ0X3RvX2J1cyh0eGZkKSwgJnRyLT5UeEZybVB0cik7Ci0JCX0gZWxzZSB7Ci0JCQl0eGZkLT5mZC5GRE5leHQgJj0gY3B1X3RvX2xlMzIofkZEX05leHRfRU9MKTsKLQkJCWlmICh0YzM1ODE1X2RlYnVnID4gMikgewotCQkJCXByaW50aygiJXM6IHF1ZXVlaW5nIFR4RkQuXG4iLCBkZXYtPm5hbWUpOwotCQkJCWR1bXBfdHhmZCh0eGZkKTsKLQkJCQlpZiAodGMzNTgxNV9kZWJ1ZyA+IDMpCi0JCQkJCXByaW50X2V0aChidWYpOwotCQkJfQorCQlpZiAobmV0aWZfbXNnX3R4X3F1ZXVlZChscCkpIHsKKwkJCXByaW50aygiJXM6IHN0YXJ0aW5nIFR4RkQuXG4iLCBkZXYtPm5hbWUpOworCQkJZHVtcF90eGZkKHR4ZmQpOwogCQl9Ci0JCWxwLT50ZmRfc3RhcnQgPSAobHAtPnRmZF9zdGFydCArIDEpICUgVFhfRkRfTlVNOwotCi0JCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOwotCi0JCWlmICgobHAtPnRmZF9zdGFydCArIDEpICUgVFhfRkRfTlVNICE9IGxwLT50ZmRfZW5kKSB7Ci0JCQkvKiB3ZSBjYW4gc2VuZCBhbm90aGVyIHBhY2tldCAqLwotCQkJbHAtPnRidXN5ID0gMDsKLQkJCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7Ci0JCX0gZWxzZSB7Ci0JCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7Ci0JCQlpZiAodGMzNTgxNV9kZWJ1ZyA+IDEpCi0JCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFR4RkQgRXhoYXVzdGVkLlxuIiwgZGV2LT5uYW1lKTsKKwkJdGNfd3JpdGVsKGZkX3ZpcnRfdG9fYnVzKGxwLCB0eGZkKSwgJnRyLT5UeEZybVB0cik7CisJfSBlbHNlIHsKKwkJdHhmZC0+ZmQuRkROZXh0ICY9IGNwdV90b19sZTMyKH5GRF9OZXh0X0VPTCk7CisJCWlmIChuZXRpZl9tc2dfdHhfcXVldWVkKGxwKSkgeworCQkJcHJpbnRrKCIlczogcXVldWVpbmcgVHhGRC5cbiIsIGRldi0+bmFtZSk7CisJCQlkdW1wX3R4ZmQodHhmZCk7CiAJCX0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKwl9CisJbHAtPnRmZF9zdGFydCA9IChscC0+dGZkX3N0YXJ0ICsgMSkgJSBUWF9GRF9OVU07CisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCS8qIElmIHdlIGp1c3QgdXNlZCB1cCB0aGUgdmVyeSBsYXN0IGVudHJ5IGluIHRoZQorCSAqIFRYIHJpbmcgb24gdGhpcyBkZXZpY2UsIHRlbGwgdGhlIHF1ZXVlaW5nCisJICogbGF5ZXIgdG8gc2VuZCBubyBtb3JlLgorCSAqLworCWlmICh0YzM1ODE1X3R4X2Z1bGwoZGV2KSkgeworCQlpZiAobmV0aWZfbXNnX3R4X3F1ZXVlZChscCkpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVHhGRCBFeGhhdXN0ZWQuXG4iLCBkZXYtPm5hbWUpOworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CiAJfQogCisJLyogV2hlbiB0aGUgVFggY29tcGxldGlvbiBodyBpbnRlcnJ1cHQgYXJyaXZlcywgdGhpcworCSAqIGlzIHdoZW4gdGhlIHRyYW5zbWl0IHN0YXRpc3RpY3MgYXJlIHVwZGF0ZWQuCisJICovCisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOwogCXJldHVybiAwOwogfQogCiAjZGVmaW5lIEZBVEFMX0VSUk9SX0lOVCBcCiAJKEludF9JbnRQQ0kgfCBJbnRfRG1QYXJFcnIgfCBJbnRfSW50TlJBYnQpCi1zdGF0aWMgdm9pZCB0YzM1ODE1X2ZhdGFsX2Vycm9yX2ludGVycnVwdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgc3RhdHVzKQorc3RhdGljIHZvaWQgdGMzNTgxNV9mYXRhbF9lcnJvcl9pbnRlcnJ1cHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIHN0YXR1cykKIHsKIAlzdGF0aWMgaW50IGNvdW50OwogCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBGYXRhbCBFcnJvciBJbnR0ZXJydXB0ICglI3gpOiIsCiAJICAgICAgIGRldi0+bmFtZSwgc3RhdHVzKTsKLQogCWlmIChzdGF0dXMgJiBJbnRfSW50UENJKQogCQlwcmludGsoIiBJbnRQQ0kiKTsKIAlpZiAoc3RhdHVzICYgSW50X0RtUGFyRXJyKQpAQCAtMTAzMywxMTAgKzEzMjEsMTcwIEBACiAJcHJpbnRrKCJcbiIpOwogCWlmIChjb3VudCsrID4gMTAwKQogCQlwYW5pYygiJXM6IFRvbyBtYW55IGZhdGFsIGVycm9ycy4iLCBkZXYtPm5hbWUpOwotCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBSZXNldHRpbmcgJXMuLi5cbiIsIGRldi0+bmFtZSwgY2FyZG5hbWUpOworCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBSZXNldHRpbmcgLi4uXG4iLCBkZXYtPm5hbWUpOwogCS8qIFRyeSB0byByZXN0YXJ0IHRoZSBhZGFwdG9yLiAqLwotCXRjMzU4MTVfY2hpcF9yZXNldChkZXYpOwotCXRjMzU4MTVfY2xlYXJfcXVldWVzKGRldik7Ci0JdGMzNTgxNV9jaGlwX2luaXQoZGV2KTsKKwl0YzM1ODE1X3Jlc3RhcnQoZGV2KTsKK30KKworI2lmZGVmIFRDMzU4MTVfTkFQSQorc3RhdGljIGludCB0YzM1ODE1X2RvX2ludGVycnVwdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgc3RhdHVzLCBpbnQgbGltaXQpCisjZWxzZQorc3RhdGljIGludCB0YzM1ODE1X2RvX2ludGVycnVwdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgc3RhdHVzKQorI2VuZGlmCit7CisJc3RydWN0IHRjMzU4MTVfbG9jYWwgKmxwID0gZGV2LT5wcml2OworCXN0cnVjdCB0YzM1ODE1X3JlZ3MgX19pb21lbSAqdHIgPQorCQkoc3RydWN0IHRjMzU4MTVfcmVncyBfX2lvbWVtICopZGV2LT5iYXNlX2FkZHI7CisJaW50IHJldCA9IC0xOworCisJLyogRmF0YWwgZXJyb3JzLi4uICovCisJaWYgKHN0YXR1cyAmIEZBVEFMX0VSUk9SX0lOVCkgeworCQl0YzM1ODE1X2ZhdGFsX2Vycm9yX2ludGVycnVwdChkZXYsIHN0YXR1cyk7CisJCXJldHVybiAwOworCX0KKwkvKiByZWNvdmVyYWJsZSBlcnJvcnMgKi8KKwlpZiAoc3RhdHVzICYgSW50X0ludEZEQUV4KSB7CisJCS8qIGRpc2FibGUgRkRBRXggaW50LiAodW50aWwgd2UgbWFrZSByb29tcy4uLikgKi8KKwkJdGNfd3JpdGVsKHRjX3JlYWRsKCZ0ci0+SW50X0VuKSAmIH5JbnRfRkRBRXhFbiwgJnRyLT5JbnRfRW4pOworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiJXM6IEZyZWUgRGVzY3JpcHRvciBBcmVhIEV4aGF1c3RlZCAoJSN4KS5cbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIHN0YXR1cyk7CisJCWxwLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCXJldCA9IDA7CisJfQorCWlmIChzdGF0dXMgJiBJbnRfSW50QkxFeCkgeworCQkvKiBkaXNhYmxlIEJMRXggaW50LiAodW50aWwgd2UgbWFrZSByb29tcy4uLikgKi8KKwkJdGNfd3JpdGVsKHRjX3JlYWRsKCZ0ci0+SW50X0VuKSAmIH5JbnRfQkxFeEVuLCAmdHItPkludF9Fbik7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICIlczogQnVmZmVyIExpc3QgRXhoYXVzdGVkICglI3gpLlxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgc3RhdHVzKTsKKwkJbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJcmV0ID0gMDsKKwl9CisJaWYgKHN0YXR1cyAmIEludF9JbnRFeEJEKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICIlczogRXhjZXNzaXZlIEJ1ZmZlciBEZXNjcmlwdGlvcnMgKCUjeCkuXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBzdGF0dXMpOworCQlscC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQlyZXQgPSAwOworCX0KKworCS8qIG5vcm1hbCBub3RpZmljYXRpb24gKi8KKwlpZiAoc3RhdHVzICYgSW50X0ludE1hY1J4KSB7CisJCS8qIEdvdCBhIHBhY2tldChzKS4gKi8KKyNpZmRlZiBUQzM1ODE1X05BUEkKKwkJcmV0ID0gdGMzNTgxNV9yeChkZXYsIGxpbWl0KTsKKyNlbHNlCisJCXRjMzU4MTVfcngoZGV2KTsKKwkJcmV0ID0gMDsKKyNlbmRpZgorCQlscC0+bHN0YXRzLnJ4X2ludHMrKzsKKwl9CisJaWYgKHN0YXR1cyAmIEludF9JbnRNYWNUeCkgeworCQkvKiBUcmFuc21pdCBjb21wbGV0ZS4gKi8KKwkJbHAtPmxzdGF0cy50eF9pbnRzKys7CisJCXRjMzU4MTVfdHhkb25lKGRldik7CisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJcmV0ID0gMDsKKwl9CisJcmV0dXJuIHJldDsKIH0KIAogLyoKICAqIFRoZSB0eXBpY2FsIHdvcmtsb2FkIG9mIHRoZSBkcml2ZXI6Ci0gKiAgIEhhbmRsZSB0aGUgbmV0d29yayBpbnRlcmZhY2UgaW50ZXJydXB0cy4KKyAqIEhhbmRsZSB0aGUgbmV0d29yayBpbnRlcmZhY2UgaW50ZXJydXB0cy4KICAqLwogc3RhdGljIGlycXJldHVybl90IHRjMzU4MTVfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2lkOwotCXN0cnVjdCB0YzM1ODE1X3JlZ3MgKnRyOwotCXN0cnVjdCB0YzM1ODE1X2xvY2FsICpscDsKLQlpbnQgc3RhdHVzLCBib2d1c2NvdW50ID0gMDsKLQlpbnQgaGFuZGxlZCA9IDA7CisJc3RydWN0IHRjMzU4MTVfcmVncyBfX2lvbWVtICp0ciA9CisJCShzdHJ1Y3QgdGMzNTgxNV9yZWdzIF9faW9tZW0gKilkZXYtPmJhc2VfYWRkcjsKKyNpZmRlZiBUQzM1ODE1X05BUEkKKwl1MzIgZG1hY3RsID0gdGNfcmVhZGwoJnRyLT5ETUFfQ3RsKTsKIAotCWlmIChkZXYgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogaXJxICVkIGZvciB1bmtub3duIGRldmljZS5cbiIsIGNhcmRuYW1lLCBpcnEpOwotCQlyZXR1cm4gSVJRX05PTkU7CisJaWYgKCEoZG1hY3RsICYgRE1BX0ludE1hc2spKSB7CisJCS8qIGRpc2FibGUgaW50ZXJydXB0cyAqLworCQl0Y193cml0ZWwoZG1hY3RsIHwgRE1BX0ludE1hc2ssICZ0ci0+RE1BX0N0bCk7CisJCWlmIChuZXRpZl9yeF9zY2hlZHVsZV9wcmVwKGRldikpCisJCQlfX25ldGlmX3J4X3NjaGVkdWxlKGRldik7CisJCWVsc2UgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogaW50ZXJydXB0IHRha2VuIGluIHBvbGxcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJCUJVRygpOworCQl9CisJCSh2b2lkKXRjX3JlYWRsKCZ0ci0+SW50X1NyYyk7CS8qIGZsdXNoICovCisJCXJldHVybiBJUlFfSEFORExFRDsKIAl9CisJcmV0dXJuIElSUV9OT05FOworI2Vsc2UKKwlzdHJ1Y3QgdGMzNTgxNV9sb2NhbCAqbHAgPSBkZXYtPnByaXY7CisJaW50IGhhbmRsZWQ7CisJdTMyIHN0YXR1czsKIAotCXRyID0gKHN0cnVjdCB0YzM1ODE1X3JlZ3MqKWRldi0+YmFzZV9hZGRyOwotCWxwID0gZGV2LT5wcml2OwotCi0JZG8gewotCQlzdGF0dXMgPSB0Y19yZWFkbCgmdHItPkludF9TcmMpOwotCQlpZiAoc3RhdHVzID09IDApCi0JCQlicmVhazsKLQkJaGFuZGxlZCA9IDE7Ci0JCXRjX3dyaXRlbChzdGF0dXMsICZ0ci0+SW50X1NyYyk7CS8qIHdyaXRlIHRvIGNsZWFyICovCi0KLQkJLyogRmF0YWwgZXJyb3JzLi4uICovCi0JCWlmIChzdGF0dXMgJiBGQVRBTF9FUlJPUl9JTlQpIHsKLQkJCXRjMzU4MTVfZmF0YWxfZXJyb3JfaW50ZXJydXB0KGRldiwgc3RhdHVzKTsKLQkJCWJyZWFrOwotCQl9Ci0JCS8qIHJlY292ZXJhYmxlIGVycm9ycyAqLwotCQlpZiAoc3RhdHVzICYgSW50X0ludEZEQUV4KSB7Ci0JCQkvKiBkaXNhYmxlIEZEQUV4IGludC4gKHVudGlsIHdlIG1ha2Ugcm9vbXMuLi4pICovCi0JCQl0Y193cml0ZWwodGNfcmVhZGwoJnRyLT5JbnRfRW4pICYgfkludF9GREFFeEVuLCAmdHItPkludF9Fbik7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCQkgICAgICAgIiVzOiBGcmVlIERlc2NyaXB0b3IgQXJlYSBFeGhhdXN0ZWQgKCUjeCkuXG4iLAotCQkJICAgICAgIGRldi0+bmFtZSwgc3RhdHVzKTsKLQkJCWxwLT5zdGF0cy5yeF9kcm9wcGVkKys7Ci0JCX0KLQkJaWYgKHN0YXR1cyAmIEludF9JbnRCTEV4KSB7Ci0JCQkvKiBkaXNhYmxlIEJMRXggaW50LiAodW50aWwgd2UgbWFrZSByb29tcy4uLikgKi8KLQkJCXRjX3dyaXRlbCh0Y19yZWFkbCgmdHItPkludF9FbikgJiB+SW50X0JMRXhFbiwgJnRyLT5JbnRfRW4pOwotCQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkJICAgICAgICIlczogQnVmZmVyIExpc3QgRXhoYXVzdGVkICglI3gpLlxuIiwKLQkJCSAgICAgICBkZXYtPm5hbWUsIHN0YXR1cyk7Ci0JCQlscC0+c3RhdHMucnhfZHJvcHBlZCsrOwotCQl9Ci0JCWlmIChzdGF0dXMgJiBJbnRfSW50RXhCRCkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkJICAgICAgICIlczogRXhjZXNzaXZlIEJ1ZmZlciBEZXNjcmlwdGlvcnMgKCUjeCkuXG4iLAotCQkJICAgICAgIGRldi0+bmFtZSwgc3RhdHVzKTsKLQkJCWxwLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7Ci0JCX0KLQkJLyogbm9ybWFsIG5vdGlmaWNhdGlvbiAqLwotCQlpZiAoc3RhdHVzICYgSW50X0ludE1hY1J4KSB7Ci0JCQkvKiBHb3QgYSBwYWNrZXQocykuICovCi0JCQlscC0+bHN0YXRzLnJ4X2ludHMrKzsKLQkJCXRjMzU4MTVfcngoZGV2KTsKLQkJfQotCQlpZiAoc3RhdHVzICYgSW50X0ludE1hY1R4KSB7Ci0JCQlscC0+bHN0YXRzLnR4X2ludHMrKzsKLQkJCXRjMzU4MTVfdHhkb25lKGRldik7Ci0JCX0KLQl9IHdoaWxlICgrK2JvZ3VzY291bnQgPCAyMCkgOwotCi0JcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7CisJc3Bpbl9sb2NrKCZscC0+bG9jayk7CisJc3RhdHVzID0gdGNfcmVhZGwoJnRyLT5JbnRfU3JjKTsKKwl0Y193cml0ZWwoc3RhdHVzLCAmdHItPkludF9TcmMpOwkvKiB3cml0ZSB0byBjbGVhciAqLworCWhhbmRsZWQgPSB0YzM1ODE1X2RvX2ludGVycnVwdChkZXYsIHN0YXR1cyk7CisJKHZvaWQpdGNfcmVhZGwoJnRyLT5JbnRfU3JjKTsJLyogZmx1c2ggKi8KKwlzcGluX3VubG9jaygmbHAtPmxvY2spOworCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQgPj0gMCk7CisjZW5kaWYgLyogVEMzNTgxNV9OQVBJICovCiB9CiAKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorc3RhdGljIHZvaWQgdGMzNTgxNV9wb2xsX2NvbnRyb2xsZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlkaXNhYmxlX2lycShkZXYtPmlycSk7CisJdGMzNTgxNV9pbnRlcnJ1cHQoZGV2LT5pcnEsIGRldik7CisJZW5hYmxlX2lycShkZXYtPmlycSk7Cit9CisjZW5kaWYKKwogLyogV2UgaGF2ZSBhIGdvb2QgcGFja2V0KHMpLCBnZXQgaXQvdGhlbSBvdXQgb2YgdGhlIGJ1ZmZlcnMuICovCisjaWZkZWYgVEMzNTgxNV9OQVBJCitzdGF0aWMgaW50Cit0YzM1ODE1X3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBsaW1pdCkKKyNlbHNlCiBzdGF0aWMgdm9pZAogdGMzNTgxNV9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorI2VuZGlmCiB7CiAJc3RydWN0IHRjMzU4MTVfbG9jYWwgKmxwID0gZGV2LT5wcml2OwotCXN0cnVjdCB0YzM1ODE1X3JlZ3MgKnRyID0gKHN0cnVjdCB0YzM1ODE1X3JlZ3MqKWRldi0+YmFzZV9hZGRyOwogCXVuc2lnbmVkIGludCBmZGN0bDsKIAlpbnQgaTsKIAlpbnQgYnVmX2ZyZWVfY291bnQgPSAwOwogCWludCBmZF9mcmVlX2NvdW50ID0gMDsKKyNpZmRlZiBUQzM1ODE1X05BUEkKKwlpbnQgcmVjZWl2ZWQgPSAwOworI2VuZGlmCiAKIAl3aGlsZSAoISgoZmRjdGwgPSBsZTMyX3RvX2NwdShscC0+cmZkX2N1ci0+ZmQuRkRDdGwpKSAmIEZEX0Nvd25zRkQpKSB7CiAJCWludCBzdGF0dXMgPSBsZTMyX3RvX2NwdShscC0+cmZkX2N1ci0+ZmQuRkRTdGF0KTsKIAkJaW50IHBrdF9sZW4gPSBmZGN0bCAmIEZEX0ZETGVuZ3RoX01BU0s7Ci0JCXN0cnVjdCBSeEZEICpuZXh0X3JmZDsKIAkJaW50IGJkX2NvdW50ID0gKGZkY3RsICYgRkRfQkRDbnRfTUFTSykgPj4gRkRfQkRDbnRfU0hJRlQ7CisjaWZkZWYgREVCVUcKKwkJc3RydWN0IFJ4RkQgKm5leHRfcmZkOworI2VuZGlmCisjaWYgKFJYX0NUTF9DTUQgJiBSeF9TdHJpcENSQykgPT0gMAorCQlwa3RfbGVuIC09IDQ7CisjZW5kaWYKIAotCQlpZiAodGMzNTgxNV9kZWJ1ZyA+IDIpCisJCWlmIChuZXRpZl9tc2dfcnhfc3RhdHVzKGxwKSkKIAkJCWR1bXBfcnhmZChscC0+cmZkX2N1cik7CiAJCWlmIChzdGF0dXMgJiBSeF9Hb29kKSB7Ci0JCQkvKiBNYWxsb2MgdXAgbmV3IGJ1ZmZlci4gKi8KIAkJCXN0cnVjdCBza19idWZmICpza2I7CiAJCQl1bnNpZ25lZCBjaGFyICpkYXRhOwotCQkJaW50IGN1cl9iZCwgb2Zmc2V0OworCQkJaW50IGN1cl9iZDsKKyNpZmRlZiBUQzM1ODE1X1VTRV9QQUNLRURCVUZGRVIKKwkJCWludCBvZmZzZXQ7CisjZW5kaWYKIAotCQkJbHAtPnN0YXRzLnJ4X2J5dGVzICs9IHBrdF9sZW47Ci0KKyNpZmRlZiBUQzM1ODE1X05BUEkKKwkJCWlmICgtLWxpbWl0IDwgMCkKKwkJCQlicmVhazsKKyNlbmRpZgorI2lmZGVmIFRDMzU4MTVfVVNFX1BBQ0tFREJVRkZFUgorCQkJQlVHX09OKGJkX2NvdW50ID4gMik7CiAJCQlza2IgPSBkZXZfYWxsb2Nfc2tiKHBrdF9sZW4gKyAyKTsgLyogKzI6IGZvciByZXNlcnZlICovCiAJCQlpZiAoc2tiID09IE5VTEwpIHsKIAkJCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBNZW1vcnkgc3F1ZWV6ZSwgZHJvcHBpbmcgcGFja2V0LlxuIiwKQEAgLTExNDUsNyArMTQ5Myw2IEBACiAJCQkJYnJlYWs7CiAJCQl9CiAJCQlza2JfcmVzZXJ2ZShza2IsIDIpOyAgIC8qIDE2IGJpdCBhbGlnbm1lbnQgKi8KLQkJCXNrYi0+ZGV2ID0gZGV2OwogCiAJCQlkYXRhID0gc2tiX3B1dChza2IsIHBrdF9sZW4pOwogCkBAIC0xMTU1LDI1ICsxNTAyLDY5IEBACiAJCQl3aGlsZSAob2Zmc2V0IDwgcGt0X2xlbiAmJiBjdXJfYmQgPCBiZF9jb3VudCkgewogCQkJCWludCBsZW4gPSBsZTMyX3RvX2NwdShscC0+cmZkX2N1ci0+YmRbY3VyX2JkXS5CREN0bCkgJgogCQkJCQlCRF9CdWZmTGVuZ3RoX01BU0s7Ci0JCQkJdm9pZCAqcnhidWYgPQotCQkJCQlidXNfdG9fdmlydChsZTMyX3RvX2NwdShscC0+cmZkX2N1ci0+YmRbY3VyX2JkXS5CdWZmRGF0YSkpOwotI2lmZGVmIF9fbWlwc19fCi0JCQkJZG1hX2NhY2hlX2ludigodW5zaWduZWQgbG9uZylyeGJ1ZiwgbGVuKTsKKwkJCQlkbWFfYWRkcl90IGRtYSA9IGxlMzJfdG9fY3B1KGxwLT5yZmRfY3VyLT5iZFtjdXJfYmRdLkJ1ZmZEYXRhKTsKKwkJCQl2b2lkICpyeGJ1ZiA9IHJ4YnVmX2J1c190b192aXJ0KGxwLCBkbWEpOworCQkJCWlmIChvZmZzZXQgKyBsZW4gPiBwa3RfbGVuKQorCQkJCQlsZW4gPSBwa3RfbGVuIC0gb2Zmc2V0OworI2lmZGVmIFRDMzU4MTVfRE1BX1NZTkNfT05ERU1BTkQKKwkJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUobHAtPnBjaV9kZXYsCisJCQkJCQkJICAgIGRtYSwgbGVuLAorCQkJCQkJCSAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOwogI2VuZGlmCiAJCQkJbWVtY3B5KGRhdGEgKyBvZmZzZXQsIHJ4YnVmLCBsZW4pOworI2lmZGVmIFRDMzU4MTVfRE1BX1NZTkNfT05ERU1BTkQKKwkJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UobHAtPnBjaV9kZXYsCisJCQkJCQkJICAgICAgIGRtYSwgbGVuLAorCQkJCQkJCSAgICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworI2VuZGlmCiAJCQkJb2Zmc2V0ICs9IGxlbjsKIAkJCQljdXJfYmQrKzsKIAkJCX0KLSNpZiAwCi0JCQlwcmludF9idWYoZGF0YSxwa3RfbGVuKTsKKyNlbHNlIC8qIFRDMzU4MTVfVVNFX1BBQ0tFREJVRkZFUiAqLworCQkJQlVHX09OKGJkX2NvdW50ID4gMSk7CisJCQljdXJfYmQgPSAobGUzMl90b19jcHUobHAtPnJmZF9jdXItPmJkWzBdLkJEQ3RsKQorCQkJCSAgJiBCRF9SeEJESURfTUFTSykgPj4gQkRfUnhCRElEX1NISUZUOworI2lmZGVmIERFQlVHCisJCQlpZiAoY3VyX2JkID49IFJYX0JVRl9OVU0pIHsKKwkJCQlwcmludGsoIiVzOiBpbnZhbGlkIEJESUQuXG4iLCBkZXYtPm5hbWUpOworCQkJCXBhbmljX3F1ZXVlcyhkZXYpOworCQkJfQorCQkJQlVHX09OKGxwLT5yeF9za2JzW2N1cl9iZF0uc2tiX2RtYSAhPQorCQkJICAgICAgIChsZTMyX3RvX2NwdShscC0+cmZkX2N1ci0+YmRbMF0uQnVmZkRhdGEpICYgfjMpKTsKKwkJCWlmICghbHAtPnJ4X3NrYnNbY3VyX2JkXS5za2IpIHsKKwkJCQlwcmludGsoIiVzOiBOVUxMIHNrYi5cbiIsIGRldi0+bmFtZSk7CisJCQkJcGFuaWNfcXVldWVzKGRldik7CisJCQl9CisjZWxzZQorCQkJQlVHX09OKGN1cl9iZCA+PSBSWF9CVUZfTlVNKTsKICNlbmRpZgotCQkJaWYgKHRjMzU4MTVfZGVidWcgPiAzKQorCQkJc2tiID0gbHAtPnJ4X3NrYnNbY3VyX2JkXS5za2I7CisJCQlwcmVmZXRjaChza2ItPmRhdGEpOworCQkJbHAtPnJ4X3NrYnNbY3VyX2JkXS5za2IgPSBOVUxMOworCQkJbHAtPmZibF9jb3VudC0tOworCQkJcGNpX3VubWFwX3NpbmdsZShscC0+cGNpX2RldiwKKwkJCQkJIGxwLT5yeF9za2JzW2N1cl9iZF0uc2tiX2RtYSwKKwkJCQkJIFJYX0JVRl9TSVpFLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJaWYgKCFIQVZFX0RNQV9SWEFMSUdOKGxwKSkKKwkJCQltZW1tb3ZlKHNrYi0+ZGF0YSwgc2tiLT5kYXRhIC0gMiwgcGt0X2xlbik7CisJCQlkYXRhID0gc2tiX3B1dChza2IsIHBrdF9sZW4pOworI2VuZGlmIC8qIFRDMzU4MTVfVVNFX1BBQ0tFREJVRkZFUiAqLworCQkJaWYgKG5ldGlmX21zZ19wa3RkYXRhKGxwKSkKIAkJCQlwcmludF9ldGgoZGF0YSk7CiAJCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOworI2lmZGVmIFRDMzU4MTVfTkFQSQorCQkJbmV0aWZfcmVjZWl2ZV9za2Ioc2tiKTsKKwkJCXJlY2VpdmVkKys7CisjZWxzZQogCQkJbmV0aWZfcngoc2tiKTsKKyNlbmRpZgorCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKIAkJCWxwLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCQlscC0+c3RhdHMucnhfYnl0ZXMgKz0gcGt0X2xlbjsKIAkJfSBlbHNlIHsKIAkJCWxwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogUnggZXJyb3IgKHN0YXR1cyAleClcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBzdGF0dXMgJiBSeF9TdGF0X01hc2spOwogCQkJLyogV09SS0FST1VORDogTG9uZ0VyciBhbmQgQ1JDRXJyIG1lYW5zIE92ZXJmbG93LiAqLwogCQkJaWYgKChzdGF0dXMgJiBSeF9Mb25nRXJyKSAmJiAoc3RhdHVzICYgUnhfQ1JDRXJyKSkgewogCQkJCXN0YXR1cyAmPSB+KFJ4X0xvbmdFcnJ8UnhfQ1JDRXJyKTsKQEAgLTExOTAsNjMgKzE1ODEsMTUwIEBACiAJCQlpbnQgYmRjdGwgPSBsZTMyX3RvX2NwdShscC0+cmZkX2N1ci0+YmRbYmRfY291bnQgLSAxXS5CREN0bCk7CiAJCQl1bnNpZ25lZCBjaGFyIGlkID0KIAkJCQkoYmRjdGwgJiBCRF9SeEJESURfTUFTSykgPj4gQkRfUnhCRElEX1NISUZUOwotCQkJaWYgKGlkID49IFJYX0JVRl9QQUdFUykgeworI2lmZGVmIERFQlVHCisJCQlpZiAoaWQgPj0gUlhfQlVGX05VTSkgewogCQkJCXByaW50aygiJXM6IGludmFsaWQgQkRJRC5cbiIsIGRldi0+bmFtZSk7CiAJCQkJcGFuaWNfcXVldWVzKGRldik7CiAJCQl9CisjZWxzZQorCQkJQlVHX09OKGlkID49IFJYX0JVRl9OVU0pOworI2VuZGlmCiAJCQkvKiBmcmVlIG9sZCBidWZmZXJzICovCi0JCQl3aGlsZSAobHAtPmZibF9jdXJpZCAhPSBpZCkgewotCQkJCWJkY3RsID0gbGUzMl90b19jcHUobHAtPmZibF9wdHItPmJkW2xwLT5mYmxfY3VyaWRdLkJEQ3RsKTsKKyNpZmRlZiBUQzM1ODE1X1VTRV9QQUNLRURCVUZGRVIKKwkJCXdoaWxlIChscC0+ZmJsX2N1cmlkICE9IGlkKQorI2Vsc2UKKwkJCXdoaWxlIChscC0+ZmJsX2NvdW50IDwgUlhfQlVGX05VTSkKKyNlbmRpZgorCQkJeworI2lmZGVmIFRDMzU4MTVfVVNFX1BBQ0tFREJVRkZFUgorCQkJCXVuc2lnbmVkIGNoYXIgY3VyaWQgPSBscC0+ZmJsX2N1cmlkOworI2Vsc2UKKwkJCQl1bnNpZ25lZCBjaGFyIGN1cmlkID0KKwkJCQkJKGlkICsgMSArIGxwLT5mYmxfY291bnQpICUgUlhfQlVGX05VTTsKKyNlbmRpZgorCQkJCXN0cnVjdCBCRGVzYyAqYmQgPSAmbHAtPmZibF9wdHItPmJkW2N1cmlkXTsKKyNpZmRlZiBERUJVRworCQkJCWJkY3RsID0gbGUzMl90b19jcHUoYmQtPkJEQ3RsKTsKIAkJCQlpZiAoYmRjdGwgJiBCRF9Db3duc0JEKSB7CiAJCQkJCXByaW50aygiJXM6IEZyZWVpbmcgaW52YWxpZCBCRC5cbiIsCiAJCQkJCSAgICAgICBkZXYtPm5hbWUpOwogCQkJCQlwYW5pY19xdWV1ZXMoZGV2KTsKIAkJCQl9CisjZW5kaWYKIAkJCQkvKiBwYXNzIEJEIHRvIGNvbnRyb2xlciAqLworI2lmbmRlZiBUQzM1ODE1X1VTRV9QQUNLRURCVUZGRVIKKwkJCQlpZiAoIWxwLT5yeF9za2JzW2N1cmlkXS5za2IpIHsKKwkJCQkJbHAtPnJ4X3NrYnNbY3VyaWRdLnNrYiA9CisJCQkJCQlhbGxvY19yeGJ1Zl9za2IoZGV2LAorCQkJCQkJCQlscC0+cGNpX2RldiwKKwkJCQkJCQkJJmxwLT5yeF9za2JzW2N1cmlkXS5za2JfZG1hKTsKKwkJCQkJaWYgKCFscC0+cnhfc2tic1tjdXJpZF0uc2tiKQorCQkJCQkJYnJlYWs7IC8qIHRyeSBvbiBuZXh0IHJlY2VwdGlvbiAqLworCQkJCQliZC0+QnVmZkRhdGEgPSBjcHVfdG9fbGUzMihscC0+cnhfc2tic1tjdXJpZF0uc2tiX2RtYSk7CisJCQkJfQorI2VuZGlmIC8qIFRDMzU4MTVfVVNFX1BBQ0tFREJVRkZFUiAqLwogCQkJCS8qIE5vdGU6IEJETGVuZ3RoIHdhcyBtb2RpZmllZCBieSBjaGlwLiAqLwotCQkJCWxwLT5mYmxfcHRyLT5iZFtscC0+ZmJsX2N1cmlkXS5CREN0bCA9Ci0JCQkJCWNwdV90b19sZTMyKEJEX0Nvd25zQkQgfAotCQkJCQkJICAgIChscC0+ZmJsX2N1cmlkIDw8IEJEX1J4QkRJRF9TSElGVCkgfAotCQkJCQkJICAgIFBBR0VfU0laRSk7Ci0JCQkJbHAtPmZibF9jdXJpZCA9Ci0JCQkJCShscC0+ZmJsX2N1cmlkICsgMSkgJSBSWF9CVUZfUEFHRVM7Ci0JCQkJaWYgKHRjMzU4MTVfZGVidWcgPiAyKSB7CisJCQkJYmQtPkJEQ3RsID0gY3B1X3RvX2xlMzIoQkRfQ293bnNCRCB8CisJCQkJCQkJKGN1cmlkIDw8IEJEX1J4QkRJRF9TSElGVCkgfAorCQkJCQkJCVJYX0JVRl9TSVpFKTsKKyNpZmRlZiBUQzM1ODE1X1VTRV9QQUNLRURCVUZGRVIKKwkJCQlscC0+ZmJsX2N1cmlkID0gKGN1cmlkICsgMSkgJSBSWF9CVUZfTlVNOworCQkJCWlmIChuZXRpZl9tc2dfcnhfc3RhdHVzKGxwKSkgewogCQkJCQlwcmludGsoIiVzOiBFbnRlcmluZyBuZXcgRkJEICVkXG4iLAogCQkJCQkgICAgICAgZGV2LT5uYW1lLCBscC0+ZmJsX2N1cmlkKTsKIAkJCQkJZHVtcF9mcmZkKGxwLT5mYmxfcHRyKTsKIAkJCQl9CisjZWxzZQorCQkJCWxwLT5mYmxfY291bnQrKzsKKyNlbmRpZgogCQkJCWJ1Zl9mcmVlX2NvdW50Kys7CiAJCQl9CiAJCX0KIAogCQkvKiBwdXQgUnhGRCBiYWNrIHRvIGNvbnRyb2xsZXIgKi8KLQkJbmV4dF9yZmQgPSBidXNfdG9fdmlydChsZTMyX3RvX2NwdShscC0+cmZkX2N1ci0+ZmQuRkROZXh0KSk7Ci0jaWZkZWYgX19taXBzX18KLQkJbmV4dF9yZmQgPSAoc3RydWN0IFJ4RkQgKil2dG9ub2NhY2hlKG5leHRfcmZkKTsKLSNlbmRpZgorI2lmZGVmIERFQlVHCisJCW5leHRfcmZkID0gZmRfYnVzX3RvX3ZpcnQobHAsCisJCQkJCSAgbGUzMl90b19jcHUobHAtPnJmZF9jdXItPmZkLkZETmV4dCkpOwogCQlpZiAobmV4dF9yZmQgPCBscC0+cmZkX2Jhc2UgfHwgbmV4dF9yZmQgPiBscC0+cmZkX2xpbWl0KSB7CiAJCQlwcmludGsoIiVzOiBSeEZEIEZETmV4dCBpbnZhbGlkLlxuIiwgZGV2LT5uYW1lKTsKIAkJCXBhbmljX3F1ZXVlcyhkZXYpOwogCQl9CisjZW5kaWYKIAkJZm9yIChpID0gMDsgaSA8IChiZF9jb3VudCArIDEpIC8gMiArIDE7IGkrKykgewogCQkJLyogcGFzcyBGRCB0byBjb250cm9sZXIgKi8KLQkJCWxwLT5yZmRfY3VyLT5mZC5GRE5leHQgPSBjcHVfdG9fbGUzMigweGRlYWRkZWFkKTsJLyogZm9yIGRlYnVnICovCisjaWZkZWYgREVCVUcKKwkJCWxwLT5yZmRfY3VyLT5mZC5GRE5leHQgPSBjcHVfdG9fbGUzMigweGRlYWRkZWFkKTsKKyNlbHNlCisJCQlscC0+cmZkX2N1ci0+ZmQuRkROZXh0ID0gY3B1X3RvX2xlMzIoRkRfTmV4dF9FT0wpOworI2VuZGlmCiAJCQlscC0+cmZkX2N1ci0+ZmQuRkRDdGwgPSBjcHVfdG9fbGUzMihGRF9Db3duc0ZEKTsKIAkJCWxwLT5yZmRfY3VyKys7CiAJCQlmZF9mcmVlX2NvdW50Kys7CiAJCX0KLQotCQlscC0+cmZkX2N1ciA9IG5leHRfcmZkOworCQlpZiAobHAtPnJmZF9jdXIgPiBscC0+cmZkX2xpbWl0KQorCQkJbHAtPnJmZF9jdXIgPSBscC0+cmZkX2Jhc2U7CisjaWZkZWYgREVCVUcKKwkJaWYgKGxwLT5yZmRfY3VyICE9IG5leHRfcmZkKQorCQkJcHJpbnRrKCJyZmRfY3VyID0gJXAsIG5leHRfcmZkICVwXG4iLAorCQkJICAgICAgIGxwLT5yZmRfY3VyLCBuZXh0X3JmZCk7CisjZW5kaWYKIAl9CiAKIAkvKiByZS1lbmFibGUgQkwvRkRBIEV4aGF1c3QgaW50ZXJydXB0cy4gKi8KIAlpZiAoZmRfZnJlZV9jb3VudCkgewotCQl0Y193cml0ZWwodGNfcmVhZGwoJnRyLT5JbnRfRW4pIHwgSW50X0ZEQUV4RW4sICZ0ci0+SW50X0VuKTsKKwkJc3RydWN0IHRjMzU4MTVfcmVncyBfX2lvbWVtICp0ciA9CisJCQkoc3RydWN0IHRjMzU4MTVfcmVncyBfX2lvbWVtICopZGV2LT5iYXNlX2FkZHI7CisJCXUzMiBlbiwgZW5fb2xkID0gdGNfcmVhZGwoJnRyLT5JbnRfRW4pOworCQllbiA9IGVuX29sZCB8IEludF9GREFFeEVuOwogCQlpZiAoYnVmX2ZyZWVfY291bnQpCi0JCQl0Y193cml0ZWwodGNfcmVhZGwoJnRyLT5JbnRfRW4pIHwgSW50X0JMRXhFbiwgJnRyLT5JbnRfRW4pOworCQkJZW4gfD0gSW50X0JMRXhFbjsKKwkJaWYgKGVuICE9IGVuX29sZCkKKwkJCXRjX3dyaXRlbChlbiwgJnRyLT5JbnRfRW4pOwogCX0KKyNpZmRlZiBUQzM1ODE1X05BUEkKKwlyZXR1cm4gcmVjZWl2ZWQ7CisjZW5kaWYKIH0KIAorI2lmZGVmIFRDMzU4MTVfTkFQSQorc3RhdGljIGludAordGMzNTgxNV9wb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCAqYnVkZ2V0KQoreworCXN0cnVjdCB0YzM1ODE1X2xvY2FsICpscCA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgdGMzNTgxNV9yZWdzIF9faW9tZW0gKnRyID0KKwkJKHN0cnVjdCB0YzM1ODE1X3JlZ3MgX19pb21lbSAqKWRldi0+YmFzZV9hZGRyOworCWludCBsaW1pdCA9IG1pbigqYnVkZ2V0LCBkZXYtPnF1b3RhKTsKKwlpbnQgcmVjZWl2ZWQgPSAwLCBoYW5kbGVkOworCXUzMiBzdGF0dXM7CisKKwlzcGluX2xvY2soJmxwLT5sb2NrKTsKKwlzdGF0dXMgPSB0Y19yZWFkbCgmdHItPkludF9TcmMpOworCWRvIHsKKwkJdGNfd3JpdGVsKHN0YXR1cywgJnRyLT5JbnRfU3JjKTsJLyogd3JpdGUgdG8gY2xlYXIgKi8KKworCQloYW5kbGVkID0gdGMzNTgxNV9kb19pbnRlcnJ1cHQoZGV2LCBzdGF0dXMsIGxpbWl0KTsKKwkJaWYgKGhhbmRsZWQgPj0gMCkgeworCQkJcmVjZWl2ZWQgKz0gaGFuZGxlZDsKKwkJCWxpbWl0IC09IGhhbmRsZWQ7CisJCQlpZiAobGltaXQgPD0gMCkKKwkJCQlicmVhazsKKwkJfQorCQlzdGF0dXMgPSB0Y19yZWFkbCgmdHItPkludF9TcmMpOworCX0gd2hpbGUgKHN0YXR1cyk7CisJc3Bpbl91bmxvY2soJmxwLT5sb2NrKTsKKworCWRldi0+cXVvdGEgLT0gcmVjZWl2ZWQ7CisJKmJ1ZGdldCAtPSByZWNlaXZlZDsKKwlpZiAobGltaXQgPD0gMCkKKwkJcmV0dXJuIDE7CisKKwluZXRpZl9yeF9jb21wbGV0ZShkZXYpOworCS8qIGVuYWJsZSBpbnRlcnJ1cHRzICovCisJdGNfd3JpdGVsKHRjX3JlYWRsKCZ0ci0+RE1BX0N0bCkgJiB+RE1BX0ludE1hc2ssICZ0ci0+RE1BX0N0bCk7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKwogI2lmZGVmIE5PX0NIRUNLX0NBUlJJRVIKICNkZWZpbmUgVFhfU1RBX0VSUgkoVHhfRXhDb2xsfFR4X1VuZGVyfFR4X0RlZmVyfFR4X0xhdGVDb2xsfFR4X1R4UGFyfFR4X1NRRXJyKQogI2Vsc2UKQEAgLTEyNjUsOSArMTc0MywxNyBAQAogCWlmIChzdGF0dXMgJiBUeF9UeENvbGxfTUFTSykKIAkJbHAtPnN0YXRzLmNvbGxpc2lvbnMgKz0gc3RhdHVzICYgVHhfVHhDb2xsX01BU0s7CiAKLQkvKiBXT1JLQVJPVU5EOiBpZ25vcmUgTG9zdENyUyBpbiBmdWxsIGR1cGxleCBvcGVyYXRpb24gKi8KLQlpZiAobHAtPmZ1bGxkdXBsZXgpCisjaWZuZGVmIE5PX0NIRUNLX0NBUlJJRVIKKwkvKiBUWDQ5MzkgZG9lcyBub3QgaGF2ZSBOQ2FyciAqLworCWlmIChscC0+Ym9hcmR0eXBlID09IFRDMzU4MTVfVFg0OTM5KQogCQlzdGF0dXMgJj0gflR4X05DYXJyOworI2lmZGVmIFdPUktBUk9VTkRfTE9TVENBUgorCS8qIFdPUktBUk9VTkQ6IGlnbm9yZSBMb3N0Q3JTIGluIGZ1bGwgZHVwbGV4IG9wZXJhdGlvbiAqLworCWlmICgobHAtPnRpbWVyX3N0YXRlICE9IGFzbGVlcCAmJiBscC0+dGltZXJfc3RhdGUgIT0gbGNoZWNrKQorCSAgICB8fCBscC0+ZnVsbGR1cGxleCkKKwkJc3RhdHVzICY9IH5UeF9OQ2FycjsKKyNlbmRpZgorI2VuZGlmCiAKIAlpZiAoIShzdGF0dXMgJiBUWF9TVEFfRVJSKSkgewogCQkvKiBubyBlcnJvci4gKi8KQEAgLTEyODMsNiArMTc2OSwxNSBAQAogCWlmIChzdGF0dXMgJiBUeF9VbmRlcikgewogCQlscC0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKIAkJbXNnID0gIlR4IEZJRk8gVW5kZXJydW4uIjsKKwkJaWYgKGxwLT5sc3RhdHMudHhfdW5kZXJydW4gPCBUWF9USFJFU0hPTERfS0VFUF9MSU1JVCkgeworCQkJbHAtPmxzdGF0cy50eF91bmRlcnJ1bisrOworCQkJaWYgKGxwLT5sc3RhdHMudHhfdW5kZXJydW4gPj0gVFhfVEhSRVNIT0xEX0tFRVBfTElNSVQpIHsKKwkJCQlzdHJ1Y3QgdGMzNTgxNV9yZWdzIF9faW9tZW0gKnRyID0KKwkJCQkJKHN0cnVjdCB0YzM1ODE1X3JlZ3MgX19pb21lbSAqKWRldi0+YmFzZV9hZGRyOworCQkJCXRjX3dyaXRlbChUWF9USFJFU0hPTERfTUFYLCAmdHItPlR4VGhyc2gpOworCQkJCW1zZyA9ICJUeCBGSUZPIFVuZGVycnVuLkNoYW5nZSBUeCB0aHJlc2hvbGQgdG8gbWF4LiI7CisJCQl9CisJCX0KIAl9CiAJaWYgKHN0YXR1cyAmIFR4X0RlZmVyKSB7CiAJCWxwLT5zdGF0cy50eF9maWZvX2Vycm9ycysrOwpAQCAtMTMwNiwxOCArMTgwMSwxOSBAQAogCQlscC0+c3RhdHMudHhfaGVhcnRiZWF0X2Vycm9ycysrOwogCQltc2cgPSAiU2lnbmFsIFF1YWxpdHkgRXJyb3IuIjsKIAl9Ci0JaWYgKG1zZykKKwlpZiAobXNnICYmIG5ldGlmX21zZ190eF9lcnIobHApKQogCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogJXMgKCUjeClcbiIsIGRldi0+bmFtZSwgbXNnLCBzdGF0dXMpOwogfQogCisvKiBUaGlzIGhhbmRsZXMgVFggY29tcGxldGUgZXZlbnRzIHBvc3RlZCBieSB0aGUgZGV2aWNlCisgKiB2aWEgaW50ZXJydXB0cy4KKyAqLwogc3RhdGljIHZvaWQKIHRjMzU4MTVfdHhkb25lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHRjMzU4MTVfbG9jYWwgKmxwID0gZGV2LT5wcml2OwotCXN0cnVjdCB0YzM1ODE1X3JlZ3MgKnRyID0gKHN0cnVjdCB0YzM1ODE1X3JlZ3MqKWRldi0+YmFzZV9hZGRyOwogCXN0cnVjdCBUeEZEICp0eGZkOwogCXVuc2lnbmVkIGludCBmZGN0bDsKLQlpbnQgbnVtX2RvbmUgPSAwOwogCiAJdHhmZCA9ICZscC0+dGZkX2Jhc2VbbHAtPnRmZF9lbmRdOwogCXdoaWxlIChscC0+dGZkX3N0YXJ0ICE9IGxwLT50ZmRfZW5kICYmCkBAIC0xMzI1LDM4ICsxODIxLDYxIEBACiAJCWludCBzdGF0dXMgPSBsZTMyX3RvX2NwdSh0eGZkLT5mZC5GRFN0YXQpOwogCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCQl1bnNpZ25lZCBsb25nIGZkbmV4dCA9IGxlMzJfdG9fY3B1KHR4ZmQtPmZkLkZETmV4dCk7CisJCXUzMiBmZHN5c3RlbSA9IGxlMzJfdG9fY3B1KHR4ZmQtPmZkLkZEU3lzdGVtKTsKIAotCQlpZiAodGMzNTgxNV9kZWJ1ZyA+IDIpIHsKKwkJaWYgKG5ldGlmX21zZ190eF9kb25lKGxwKSkgewogCQkJcHJpbnRrKCIlczogY29tcGxldGUgVHhGRC5cbiIsIGRldi0+bmFtZSk7CiAJCQlkdW1wX3R4ZmQodHhmZCk7CiAJCX0KIAkJdGMzNTgxNV9jaGVja190eF9zdGF0KGRldiwgc3RhdHVzKTsKIAotCQlza2IgPSAoc3RydWN0IHNrX2J1ZmYgKilsZTMyX3RvX2NwdSh0eGZkLT5mZC5GRFN5c3RlbSk7Ci0JCWlmIChza2IpIHsKLQkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCXNrYiA9IGZkc3lzdGVtICE9IDB4ZmZmZmZmZmYgPworCQkJbHAtPnR4X3NrYnNbZmRzeXN0ZW1dLnNrYiA6IE5VTEw7CisjaWZkZWYgREVCVUcKKwkJaWYgKGxwLT50eF9za2JzW2xwLT50ZmRfZW5kXS5za2IgIT0gc2tiKSB7CisJCQlwcmludGsoIiVzOiB0eF9za2JzIG1pc21hdGNoLlxuIiwgZGV2LT5uYW1lKTsKKwkJCXBhbmljX3F1ZXVlcyhkZXYpOwogCQl9Ci0JCXR4ZmQtPmZkLkZEU3lzdGVtID0gY3B1X3RvX2xlMzIoMCk7CisjZWxzZQorCQlCVUdfT04obHAtPnR4X3NrYnNbbHAtPnRmZF9lbmRdLnNrYiAhPSBza2IpOworI2VuZGlmCisJCWlmIChza2IpIHsKKwkJCWxwLT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKwkJCXBjaV91bm1hcF9zaW5nbGUobHAtPnBjaV9kZXYsIGxwLT50eF9za2JzW2xwLT50ZmRfZW5kXS5za2JfZG1hLCBza2ItPmxlbiwgUENJX0RNQV9UT0RFVklDRSk7CisJCQlscC0+dHhfc2tic1tscC0+dGZkX2VuZF0uc2tiID0gTlVMTDsKKwkJCWxwLT50eF9za2JzW2xwLT50ZmRfZW5kXS5za2JfZG1hID0gMDsKKyNpZmRlZiBUQzM1ODE1X05BUEkKKwkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisjZWxzZQorCQkJZGV2X2tmcmVlX3NrYl9pcnEoc2tiKTsKKyNlbmRpZgorCQl9CisJCXR4ZmQtPmZkLkZEU3lzdGVtID0gY3B1X3RvX2xlMzIoMHhmZmZmZmZmZik7CiAKLQkJbnVtX2RvbmUrKzsKIAkJbHAtPnRmZF9lbmQgPSAobHAtPnRmZF9lbmQgKyAxKSAlIFRYX0ZEX05VTTsKIAkJdHhmZCA9ICZscC0+dGZkX2Jhc2VbbHAtPnRmZF9lbmRdOwotCQlpZiAoKGZkbmV4dCAmIH5GRF9OZXh0X0VPTCkgIT0gdmlydF90b19idXModHhmZCkpIHsKKyNpZmRlZiBERUJVRworCQlpZiAoKGZkbmV4dCAmIH5GRF9OZXh0X0VPTCkgIT0gZmRfdmlydF90b19idXMobHAsIHR4ZmQpKSB7CiAJCQlwcmludGsoIiVzOiBUeEZEIEZETmV4dCBpbnZhbGlkLlxuIiwgZGV2LT5uYW1lKTsKIAkJCXBhbmljX3F1ZXVlcyhkZXYpOwogCQl9CisjZW5kaWYKIAkJaWYgKGZkbmV4dCAmIEZEX05leHRfRU9MKSB7CiAJCQkvKiBETUEgVHJhbnNtaXR0ZXIgaGFzIGJlZW4gc3RvcHBpbmcuLi4gKi8KIAkJCWlmIChscC0+dGZkX2VuZCAhPSBscC0+dGZkX3N0YXJ0KSB7CisJCQkJc3RydWN0IHRjMzU4MTVfcmVncyBfX2lvbWVtICp0ciA9CisJCQkJCShzdHJ1Y3QgdGMzNTgxNV9yZWdzIF9faW9tZW0gKilkZXYtPmJhc2VfYWRkcjsKIAkJCQlpbnQgaGVhZCA9IChscC0+dGZkX3N0YXJ0ICsgVFhfRkRfTlVNIC0gMSkgJSBUWF9GRF9OVU07CiAJCQkJc3RydWN0IFR4RkQqIHR4aGVhZCA9ICZscC0+dGZkX2Jhc2VbaGVhZF07CiAJCQkJaW50IHFsZW4gPSAobHAtPnRmZF9zdGFydCArIFRYX0ZEX05VTQogCQkJCQkgICAgLSBscC0+dGZkX2VuZCkgJSBUWF9GRF9OVU07CiAKKyNpZmRlZiBERUJVRwogCQkJCWlmICghKGxlMzJfdG9fY3B1KHR4ZmQtPmZkLkZEQ3RsKSAmIEZEX0Nvd25zRkQpKSB7CiAJCQkJCXByaW50aygiJXM6IFR4RkQgRkRDdGwgaW52YWxpZC5cbiIsIGRldi0+bmFtZSk7CiAJCQkJCXBhbmljX3F1ZXVlcyhkZXYpOwogCQkJCX0KKyNlbmRpZgogCQkJCS8qIGxvZyBtYXggcXVldWUgbGVuZ3RoICovCiAJCQkJaWYgKGxwLT5sc3RhdHMubWF4X3R4X3FsZW4gPCBxbGVuKQogCQkJCQlscC0+bHN0YXRzLm1heF90eF9xbGVuID0gcWxlbjsKQEAgLTEzNjcsMjEgKzE4ODYsMjMgQEAKICNpZmRlZiBHQVRIRVJfVFhJTlQKIAkJCQl0eGhlYWQtPmZkLkZEQ3RsIHw9IGNwdV90b19sZTMyKEZEX0ZybU9wdF9JbnRUeCk7CiAjZW5kaWYKLQkJCQlpZiAodGMzNTgxNV9kZWJ1ZyA+IDIpIHsKKwkJCQlpZiAobmV0aWZfbXNnX3R4X3F1ZXVlZChscCkpIHsKIAkJCQkJcHJpbnRrKCIlczogc3RhcnQgVHhGRCBvbiBxdWV1ZS5cbiIsCiAJCQkJCSAgICAgICBkZXYtPm5hbWUpOwogCQkJCQlkdW1wX3R4ZmQodHhmZCk7CiAJCQkJfQotCQkJCXRjX3dyaXRlbCh2aXJ0X3RvX2J1cyh0eGZkKSwgJnRyLT5UeEZybVB0cik7CisJCQkJdGNfd3JpdGVsKGZkX3ZpcnRfdG9fYnVzKGxwLCB0eGZkKSwgJnRyLT5UeEZybVB0cik7CiAJCQl9CiAJCQlicmVhazsKIAkJfQogCX0KIAotCWlmIChudW1fZG9uZSA+IDAgJiYgbHAtPnRidXN5KSB7Ci0JCWxwLT50YnVzeSA9IDA7Ci0JCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7Ci0JfQorCS8qIElmIHdlIGhhZCBzdG9wcGVkIHRoZSBxdWV1ZSBkdWUgdG8gYSAidHggZnVsbCIKKwkgKiBjb25kaXRpb24sIGFuZCBzcGFjZSBoYXMgbm93IGJlZW4gbWFkZSBhdmFpbGFibGUsCisJICogd2FrZSB1cCB0aGUgcXVldWUuCisJICovCisJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSAmJiAhIHRjMzU4MTVfdHhfZnVsbChkZXYpKQorCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CiB9CiAKIC8qIFRoZSBpbnZlcnNlIHJvdXRpbmUgdG8gdGMzNTgxNV9vcGVuKCkuICovCkBAIC0xMzg5LDE4ICsxOTEwLDE4IEBACiB0YzM1ODE1X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHRjMzU4MTVfbG9jYWwgKmxwID0gZGV2LT5wcml2OwotCi0JbHAtPnRidXN5ID0gMTsKIAluZXRpZl9zdG9wX3F1ZXVlKGRldik7CiAKIAkvKiBGbHVzaCB0aGUgVHggYW5kIGRpc2FibGUgUnggaGVyZS4gKi8KIAorCWRlbF90aW1lcigmbHAtPnRpbWVyKTsJCS8qIEtpbGwgaWYgcnVubmluZwkqLwogCXRjMzU4MTVfY2hpcF9yZXNldChkZXYpOwogCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOwogCiAJdGMzNTgxNV9mcmVlX3F1ZXVlcyhkZXYpOwogCiAJcmV0dXJuIDA7CisKIH0KIAogLyoKQEAgLTE0MTAsMjkgKzE5MzEsMjkgQEAKIHN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqdGMzNTgxNV9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgdGMzNTgxNV9sb2NhbCAqbHAgPSBkZXYtPnByaXY7Ci0Jc3RydWN0IHRjMzU4MTVfcmVncyAqdHIgPSAoc3RydWN0IHRjMzU4MTVfcmVncyopZGV2LT5iYXNlX2FkZHI7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQorCXN0cnVjdCB0YzM1ODE1X3JlZ3MgX19pb21lbSAqdHIgPQorCQkoc3RydWN0IHRjMzU4MTVfcmVncyBfX2lvbWVtICopZGV2LT5iYXNlX2FkZHI7CiAJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmxvY2ssIGZsYWdzKTsKIAkJLyogVXBkYXRlIHRoZSBzdGF0aXN0aWNzIGZyb20gdGhlIGRldmljZSByZWdpc3RlcnMuICovCiAJCWxwLT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzID0gdGNfcmVhZGwoJnRyLT5NaXNzX0NudCk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7CiAJfQogCiAJcmV0dXJuICZscC0+c3RhdHM7CiB9CiAKLXN0YXRpYyB2b2lkIHRjMzU4MTVfc2V0X2NhbV9lbnRyeShzdHJ1Y3QgdGMzNTgxNV9yZWdzICp0ciwgaW50IGluZGV4LCB1bnNpZ25lZCBjaGFyICphZGRyKQorc3RhdGljIHZvaWQgdGMzNTgxNV9zZXRfY2FtX2VudHJ5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpbmRleCwgdW5zaWduZWQgY2hhciAqYWRkcikKIHsKKwlzdHJ1Y3QgdGMzNTgxNV9sb2NhbCAqbHAgPSBkZXYtPnByaXY7CisJc3RydWN0IHRjMzU4MTVfcmVncyBfX2lvbWVtICp0ciA9CisJCShzdHJ1Y3QgdGMzNTgxNV9yZWdzIF9faW9tZW0gKilkZXYtPmJhc2VfYWRkcjsKIAlpbnQgY2FtX2luZGV4ID0gaW5kZXggKiA2OwotCXVuc2lnbmVkIGxvbmcgY2FtX2RhdGE7Ci0JdW5zaWduZWQgbG9uZyBzYXZlZF9hZGRyOworCXUzMiBjYW1fZGF0YTsKKwl1MzIgc2F2ZWRfYWRkcjsKIAlzYXZlZF9hZGRyID0gdGNfcmVhZGwoJnRyLT5DQU1fQWRyKTsKIAotCWlmICh0YzM1ODE1X2RlYnVnID4gMSkgeworCWlmIChuZXRpZl9tc2dfaHcobHApKSB7CiAJCWludCBpOwotCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IENBTSAlZDoiLCBjYXJkbmFtZSwgaW5kZXgpOworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IENBTSAlZDoiLCBkZXYtPm5hbWUsIGluZGV4KTsKIAkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKIAkJCXByaW50aygiICUwMngiLCBhZGRyW2ldKTsKIAkJcHJpbnRrKCJcbiIpOwpAQCAtMTQ1OSwxNCArMTk4MCw2IEBACiAJCXRjX3dyaXRlbChjYW1fZGF0YSwgJnRyLT5DQU1fRGF0YSk7CiAJfQogCi0JaWYgKHRjMzU4MTVfZGVidWcgPiAyKSB7Ci0JCWludCBpOwotCQlmb3IgKGkgPSBjYW1faW5kZXggLyA0OyBpIDwgY2FtX2luZGV4IC8gNCArIDI7IGkrKykgewotCQkJdGNfd3JpdGVsKGkgKiA0LCAmdHItPkNBTV9BZHIpOwotCQkJcHJpbnRrKCJDQU0gMHgleDogJTA4bHgiLAotCQkJICAgICAgIGkgKiA0LCB0Y19yZWFkbCgmdHItPkNBTV9EYXRhKSk7Ci0JCX0KLQl9CiAJdGNfd3JpdGVsKHNhdmVkX2FkZHIsICZ0ci0+Q0FNX0Fkcik7CiB9CiAKQEAgLTE0ODEsMTAgKzE5OTQsMTkgQEAKIHN0YXRpYyB2b2lkCiB0YzM1ODE1X3NldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXN0cnVjdCB0YzM1ODE1X3JlZ3MgKnRyID0gKHN0cnVjdCB0YzM1ODE1X3JlZ3MqKWRldi0+YmFzZV9hZGRyOworCXN0cnVjdCB0YzM1ODE1X3JlZ3MgX19pb21lbSAqdHIgPQorCQkoc3RydWN0IHRjMzU4MTVfcmVncyBfX2lvbWVtICopZGV2LT5iYXNlX2FkZHI7CiAKIAlpZiAoZGV2LT5mbGFncyZJRkZfUFJPTUlTQykKIAl7CisjaWZkZWYgV09SS0FST1VORF8xMDBIQUxGX1BST01JU0MKKwkJLyogV2l0aCBzb21lIChhbGw/KSAxMDBNSGFsZiBIVUIsIGNvbnRyb2xsZXIgd2lsbCBoYW5nCisJCSAqIGlmIHdlIGVuYWJsZWQgcHJvbWlzY3VvdXMgbW9kZSBiZWZvcmUgbGlua3VwLi4uICovCisJCXN0cnVjdCB0YzM1ODE1X2xvY2FsICpscCA9IGRldi0+cHJpdjsKKwkJaW50IHBpZCA9IGxwLT5waHlfYWRkcjsKKwkJaWYgKCEodGNfbWRpb19yZWFkKGRldiwgcGlkLCBNSUlfQk1TUikgJiBCTVNSX0xTVEFUVVMpKQorCQkJcmV0dXJuOworI2VuZGlmCiAJCS8qIEVuYWJsZSBwcm9taXNjdW91cyBtb2RlICovCiAJCXRjX3dyaXRlbChDQU1fQ29tcEVuIHwgQ0FNX0Jyb2FkQWNjIHwgQ0FNX0dyb3VwQWNjIHwgQ0FNX1N0YXRpb25BY2MsICZ0ci0+Q0FNX0N0bCk7CiAJfQpAQCAtMTUwNiw3ICsyMDI4LDcgQEAKIAkJCWlmICghY3VyX2FkZHIpCiAJCQkJYnJlYWs7CiAJCQkvKiBlbnRyeSAwLDEgaXMgcmVzZXJ2ZWQuICovCi0JCQl0YzM1ODE1X3NldF9jYW1fZW50cnkodHIsIGkgKyAyLCBjdXJfYWRkci0+ZG1pX2FkZHIpOworCQkJdGMzNTgxNV9zZXRfY2FtX2VudHJ5KGRldiwgaSArIDIsIGN1cl9hZGRyLT5kbWlfYWRkcik7CiAJCQllbmFfYml0cyB8PSBDQU1fRW5hX0JpdChpICsgMik7CiAJCX0KIAkJdGNfd3JpdGVsKGVuYV9iaXRzLCAmdHItPkNBTV9FbmEpOwpAQCAtMTUxOCwxMjIgKzIwNDAsNzUzIEBACiAJfQogfQogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyB0Y19waHlfcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgdGMzNTgxNV9yZWdzICp0ciwgaW50IHBoeSwgaW50IHBoeV9yZWcpCitzdGF0aWMgdm9pZCB0YzM1ODE1X2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCiB7CiAJc3RydWN0IHRjMzU4MTVfbG9jYWwgKmxwID0gZGV2LT5wcml2OwotCXVuc2lnbmVkIGxvbmcgZGF0YTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cmNweShpbmZvLT5kcml2ZXIsIE1PRE5BTUUpOworCXN0cmNweShpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTik7CisJc3RyY3B5KGluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShscC0+cGNpX2RldikpOworfQogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5sb2NrLCBmbGFncyk7CitzdGF0aWMgaW50IHRjMzU4MTVfZ2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQoreworCXN0cnVjdCB0YzM1ODE1X2xvY2FsICpscCA9IGRldi0+cHJpdjsKKwlzcGluX2xvY2tfaXJxKCZscC0+bG9jayk7CisJbWlpX2V0aHRvb2xfZ3NldCgmbHAtPm1paSwgY21kKTsKKwlzcGluX3VubG9ja19pcnEoJmxwLT5sb2NrKTsKKwlyZXR1cm4gMDsKK30KIAotCXRjX3dyaXRlbChNRF9DQV9CdXN5IHwgKHBoeSA8PCA1KSB8IHBoeV9yZWcsICZ0ci0+TURfQ0EpOworc3RhdGljIGludCB0YzM1ODE1X3NldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3QgdGMzNTgxNV9sb2NhbCAqbHAgPSBkZXYtPnByaXY7CisJaW50IHJjOworI2lmIDEJLyogdXNlIG91ciBuZWdvdGlhdGlvbiBtZXRob2QuLi4gKi8KKwkvKiBWZXJpZnkgdGhlIHNldHRpbmdzIHdlIGNhcmUgYWJvdXQuICovCisJaWYgKGNtZC0+YXV0b25lZyAhPSBBVVRPTkVHX0VOQUJMRSAmJgorCSAgICBjbWQtPmF1dG9uZWcgIT0gQVVUT05FR19ESVNBQkxFKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoY21kLT5hdXRvbmVnID09IEFVVE9ORUdfRElTQUJMRSAmJgorCSAgICAoKGNtZC0+c3BlZWQgIT0gU1BFRURfMTAwICYmCisJICAgICAgY21kLT5zcGVlZCAhPSBTUEVFRF8xMCkgfHwKKwkgICAgIChjbWQtPmR1cGxleCAhPSBEVVBMRVhfSEFMRiAmJgorCSAgICAgIGNtZC0+ZHVwbGV4ICE9IERVUExFWF9GVUxMKSkpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogT2ssIGRvIGl0IHRvIGl0LiAqLworCXNwaW5fbG9ja19pcnEoJmxwLT5sb2NrKTsKKwlkZWxfdGltZXIoJmxwLT50aW1lcik7CisJdGMzNTgxNV9zdGFydF9hdXRvX25lZ290aWF0aW9uKGRldiwgY21kKTsKKwlzcGluX3VubG9ja19pcnEoJmxwLT5sb2NrKTsKKwlyYyA9IDA7CisjZWxzZQorCXNwaW5fbG9ja19pcnEoJmxwLT5sb2NrKTsKKwlyYyA9IG1paV9ldGh0b29sX3NzZXQoJmxwLT5taWksIGNtZCk7CisJc3Bpbl91bmxvY2tfaXJxKCZscC0+bG9jayk7CisjZW5kaWYKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgdGMzNTgxNV9ud2F5X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHRjMzU4MTVfbG9jYWwgKmxwID0gZGV2LT5wcml2OworCWludCByYzsKKwlzcGluX2xvY2tfaXJxKCZscC0+bG9jayk7CisJcmMgPSBtaWlfbndheV9yZXN0YXJ0KCZscC0+bWlpKTsKKwlzcGluX3VubG9ja19pcnEoJmxwLT5sb2NrKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB1MzIgdGMzNTgxNV9nZXRfbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0YzM1ODE1X2xvY2FsICpscCA9IGRldi0+cHJpdjsKKwlpbnQgcmM7CisJc3Bpbl9sb2NrX2lycSgmbHAtPmxvY2spOworCXJjID0gbWlpX2xpbmtfb2soJmxwLT5taWkpOworCXNwaW5fdW5sb2NrX2lycSgmbHAtPmxvY2spOworCXJldHVybiByYzsKK30KKworc3RhdGljIHUzMiB0YzM1ODE1X2dldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0YzM1ODE1X2xvY2FsICpscCA9IGRldi0+cHJpdjsKKwlyZXR1cm4gbHAtPm1zZ19lbmFibGU7Cit9CisKK3N0YXRpYyB2b2lkIHRjMzU4MTVfc2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBkYXR1bSkKK3sKKwlzdHJ1Y3QgdGMzNTgxNV9sb2NhbCAqbHAgPSBkZXYtPnByaXY7CisJbHAtPm1zZ19lbmFibGUgPSBkYXR1bTsKK30KKworc3RhdGljIGludCB0YzM1ODE1X2dldF9zdGF0c19jb3VudChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0YzM1ODE1X2xvY2FsICpscCA9IGRldi0+cHJpdjsKKwlyZXR1cm4gc2l6ZW9mKGxwLT5sc3RhdHMpIC8gc2l6ZW9mKGludCk7Cit9CisKK3N0YXRpYyB2b2lkIHRjMzU4MTVfZ2V0X2V0aHRvb2xfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfc3RhdHMgKnN0YXRzLCB1NjQgKmRhdGEpCit7CisJc3RydWN0IHRjMzU4MTVfbG9jYWwgKmxwID0gZGV2LT5wcml2OworCWRhdGFbMF0gPSBscC0+bHN0YXRzLm1heF90eF9xbGVuOworCWRhdGFbMV0gPSBscC0+bHN0YXRzLnR4X2ludHM7CisJZGF0YVsyXSA9IGxwLT5sc3RhdHMucnhfaW50czsKKwlkYXRhWzNdID0gbHAtPmxzdGF0cy50eF91bmRlcnJ1bjsKK30KKworc3RhdGljIHN0cnVjdCB7CisJY29uc3QgY2hhciBzdHJbRVRIX0dTVFJJTkdfTEVOXTsKK30gZXRodG9vbF9zdGF0c19rZXlzW10gPSB7CisJeyAibWF4X3R4X3FsZW4iIH0sCisJeyAidHhfaW50cyIgfSwKKwl7ICJyeF9pbnRzIiB9LAorCXsgInR4X3VuZGVycnVuIiB9LAorfTsKKworc3RhdGljIHZvaWQgdGMzNTgxNV9nZXRfc3RyaW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgc3RyaW5nc2V0LCB1OCAqZGF0YSkKK3sKKwltZW1jcHkoZGF0YSwgZXRodG9vbF9zdGF0c19rZXlzLCBzaXplb2YoZXRodG9vbF9zdGF0c19rZXlzKSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgdGMzNTgxNV9ldGh0b29sX29wcyA9IHsKKwkuZ2V0X2RydmluZm8JCT0gdGMzNTgxNV9nZXRfZHJ2aW5mbywKKwkuZ2V0X3NldHRpbmdzCQk9IHRjMzU4MTVfZ2V0X3NldHRpbmdzLAorCS5zZXRfc2V0dGluZ3MJCT0gdGMzNTgxNV9zZXRfc2V0dGluZ3MsCisJLm53YXlfcmVzZXQJCT0gdGMzNTgxNV9ud2F5X3Jlc2V0LAorCS5nZXRfbGluawkJPSB0YzM1ODE1X2dldF9saW5rLAorCS5nZXRfbXNnbGV2ZWwJCT0gdGMzNTgxNV9nZXRfbXNnbGV2ZWwsCisJLnNldF9tc2dsZXZlbAkJPSB0YzM1ODE1X3NldF9tc2dsZXZlbCwKKwkuZ2V0X3N0cmluZ3MJCT0gdGMzNTgxNV9nZXRfc3RyaW5ncywKKwkuZ2V0X3N0YXRzX2NvdW50CT0gdGMzNTgxNV9nZXRfc3RhdHNfY291bnQsCisJLmdldF9ldGh0b29sX3N0YXRzCT0gdGMzNTgxNV9nZXRfZXRodG9vbF9zdGF0cywKKwkuZ2V0X3Blcm1fYWRkcgkJPSBldGh0b29sX29wX2dldF9wZXJtX2FkZHIsCit9OworCitzdGF0aWMgaW50IHRjMzU4MTVfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKK3sKKwlzdHJ1Y3QgdGMzNTgxNV9sb2NhbCAqbHAgPSBkZXYtPnByaXY7CisJaW50IHJjOworCisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCisJCXJldHVybiAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2lycSgmbHAtPmxvY2spOworCXJjID0gZ2VuZXJpY19taWlfaW9jdGwoJmxwLT5taWksIGlmX21paShycSksIGNtZCwgTlVMTCk7CisJc3Bpbl91bmxvY2tfaXJxKCZscC0+bG9jayk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgdGNfbWRpb19yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfaWQsIGludCBsb2NhdGlvbikKK3sKKwlzdHJ1Y3QgdGMzNTgxNV9yZWdzIF9faW9tZW0gKnRyID0KKwkJKHN0cnVjdCB0YzM1ODE1X3JlZ3MgX19pb21lbSAqKWRldi0+YmFzZV9hZGRyOworCXUzMiBkYXRhOworCXRjX3dyaXRlbChNRF9DQV9CdXN5IHwgKHBoeV9pZCA8PCA1KSB8IGxvY2F0aW9uLCAmdHItPk1EX0NBKTsKIAl3aGlsZSAodGNfcmVhZGwoJnRyLT5NRF9DQSkgJiBNRF9DQV9CdXN5KQogCQk7CiAJZGF0YSA9IHRjX3JlYWRsKCZ0ci0+TURfRGF0YSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKLQlyZXR1cm4gZGF0YTsKKwlyZXR1cm4gZGF0YSAmIDB4ZmZmZjsKIH0KIAotc3RhdGljIHZvaWQgdGNfcGh5X3dyaXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgZCwgc3RydWN0IHRjMzU4MTVfcmVncyAqdHIsIGludCBwaHksIGludCBwaHlfcmVnKQorc3RhdGljIHZvaWQgdGNfbWRpb193cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24sCisJCQkgIGludCB2YWwpCiB7Ci0Jc3RydWN0IHRjMzU4MTVfbG9jYWwgKmxwID0gZGV2LT5wcml2OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmxvY2ssIGZsYWdzKTsKLQotCXRjX3dyaXRlbChkLCAmdHItPk1EX0RhdGEpOwotCXRjX3dyaXRlbChNRF9DQV9CdXN5IHwgTURfQ0FfV3IgfCAocGh5IDw8IDUpIHwgcGh5X3JlZywgJnRyLT5NRF9DQSk7CisJc3RydWN0IHRjMzU4MTVfcmVncyBfX2lvbWVtICp0ciA9CisJCShzdHJ1Y3QgdGMzNTgxNV9yZWdzIF9faW9tZW0gKilkZXYtPmJhc2VfYWRkcjsKKwl0Y193cml0ZWwodmFsLCAmdHItPk1EX0RhdGEpOworCXRjX3dyaXRlbChNRF9DQV9CdXN5IHwgTURfQ0FfV3IgfCAocGh5X2lkIDw8IDUpIHwgbG9jYXRpb24sICZ0ci0+TURfQ0EpOwogCXdoaWxlICh0Y19yZWFkbCgmdHItPk1EX0NBKSAmIE1EX0NBX0J1c3kpCiAJCTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworfQorCisvKiBBdXRvIG5lZ290aWF0aW9uLiAgVGhlIHNjaGVtZSBpcyB2ZXJ5IHNpbXBsZS4gIFdlIGhhdmUgYSB0aW1lciByb3V0aW5lCisgKiB0aGF0IGtlZXBzIHdhdGNoaW5nIHRoZSBhdXRvIG5lZ290aWF0aW9uIHByb2Nlc3MgYXMgaXQgcHJvZ3Jlc3Nlcy4KKyAqIFRoZSBEUDgzODQwIGlzIGZpcnN0IHRvbGQgdG8gc3RhcnQgZG9pbmcgaXQncyB0aGluZywgd2Ugc2V0IHVwIHRoZSB0aW1lCisgKiBhbmQgcGxhY2UgdGhlIHRpbWVyIHN0YXRlIG1hY2hpbmUgaW4gaXQncyBpbml0aWFsIHN0YXRlLgorICoKKyAqIEhlcmUgdGhlIHRpbWVyIHBlZWtzIGF0IHRoZSBEUDgzODQwIHN0YXR1cyByZWdpc3RlcnMgYXQgZWFjaCBjbGljayB0byBzZWUKKyAqIGlmIHRoZSBhdXRvIG5lZ290aWF0aW9uIGhhcyBjb21wbGV0ZWQsIHdlIGFzc3VtZSBoZXJlIHRoYXQgdGhlIERQODM4NDAgUEhZCisgKiB3aWxsIHRpbWUgb3V0IGF0IHNvbWUgcG9pbnQgYW5kIGp1c3QgdGVsbCB1cyB3aGF0IChkaWRuJ3QpIGhhcHBlbi4gIEZvcgorICogY29tcGxldGUgY292ZXJhZ2Ugd2Ugb25seSBhbGxvdyBzbyBtYW55IG9mIHRoZSB0aWNrcyBhdCB0aGlzIGxldmVsIHRvIHJ1biwKKyAqIHdoZW4gdGhpcyBoYXMgZXhwaXJlZCB3ZSBwcmludCBhIHdhcm5pbmcgbWVzc2FnZSBhbmQgdHJ5IGFub3RoZXIgc3RyYXRlZ3kuCisgKiBUaGlzICJvdGhlciIgc3RyYXRlZ3kgaXMgdG8gZm9yY2UgdGhlIGludGVyZmFjZSBpbnRvIHZhcmlvdXMgc3BlZWQvZHVwbGV4CisgKiBjb25maWd1cmF0aW9ucyBhbmQgd2Ugc3RvcCB3aGVuIHdlIHNlZSBhIGxpbmstdXAgY29uZGl0aW9uIGJlZm9yZSB0aGUKKyAqIG1heGltdW0gbnVtYmVyIG9mICJwZWVrIiB0aWNrcyBoYXZlIG9jY3VycmVkLgorICoKKyAqIE9uY2UgYSB2YWxpZCBsaW5rIHN0YXR1cyBoYXMgYmVlbiBkZXRlY3RlZCB3ZSBjb25maWd1cmUgdGhlIEJpZ01BQyBhbmQKKyAqIHRoZSByZXN0IG9mIHRoZSBIYXBweSBNZWFsIHRvIHNwZWFrIHRoZSBtb3N0IGVmZmljaWVudCBwcm90b2NvbCB3ZSBjb3VsZAorICogZ2V0IGEgY2xlYW4gbGluayBmb3IuICBUaGUgcHJpb3JpdHkgZm9yIGxpbmsgY29uZmlndXJhdGlvbnMsIGhpZ2hlc3QgZmlyc3QKKyAqIGlzOgorICogICAgICAgICAgICAgICAgIDEwMCBCYXNlLVQgRnVsbCBEdXBsZXgKKyAqICAgICAgICAgICAgICAgICAxMDAgQmFzZS1UIEhhbGYgRHVwbGV4CisgKiAgICAgICAgICAgICAgICAgMTAgQmFzZS1UIEZ1bGwgRHVwbGV4CisgKiAgICAgICAgICAgICAgICAgMTAgQmFzZS1UIEhhbGYgRHVwbGV4CisgKgorICogV2Ugc3RhcnQgYSBuZXcgdGltZXIgbm93LCBhZnRlciBhIHN1Y2Nlc3NmdWwgYXV0byBuZWdvdGlhdGlvbiBzdGF0dXMgaGFzCisgKiBiZWVuIGRldGVjdGVkLiAgVGhpcyB0aW1lciBqdXN0IHdhaXRzIGZvciB0aGUgbGluay11cCBiaXQgdG8gZ2V0IHNldCBpbgorICogdGhlIEJNQ1Igb2YgdGhlIERQODM4NDAuICBXaGVuIHRoaXMgb2NjdXJzIHdlIHByaW50IGEga2VybmVsIGxvZyBtZXNzYWdlCisgKiBkZXNjcmliaW5nIHRoZSBsaW5rIHR5cGUgaW4gdXNlIGFuZCB0aGUgZmFjdCB0aGF0IGl0IGlzIHVwLgorICoKKyAqIElmIGEgZmF0YWwgZXJyb3Igb2Ygc29tZSBzb3J0IGlzIHNpZ25hbGxlZCBhbmQgZGV0ZWN0ZWQgaW4gdGhlIGludGVycnVwdAorICogc2VydmljZSByb3V0aW5lLCBhbmQgdGhlIGNoaXAgaXMgcmVzZXQsIG9yIHRoZSBsaW5rIGlzIGlmY29uZmlnJ2QgZG93bgorICogYW5kIHRoZW4gYmFjayB1cCwgdGhpcyBlbnRpcmUgcHJvY2VzcyByZXBlYXRzIGl0c2VsZiBhbGwgb3ZlciBhZ2Fpbi4KKyAqLworLyogTm90ZTogQWJvdmUgY29tbWVudHMgYXJlIGNvbWUgZnJvbSBzdW5obWUgZHJpdmVyLiAqLworCitzdGF0aWMgaW50IHRjMzU4MTVfdHJ5X25leHRfcGVybXV0YXRpb24oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdGMzNTgxNV9sb2NhbCAqbHAgPSBkZXYtPnByaXY7CisJaW50IHBpZCA9IGxwLT5waHlfYWRkcjsKKwl1bnNpZ25lZCBzaG9ydCBibWNyOworCisJYm1jciA9IHRjX21kaW9fcmVhZChkZXYsIHBpZCwgTUlJX0JNQ1IpOworCisJLyogRG93bmdyYWRlIGZyb20gZnVsbCB0byBoYWxmIGR1cGxleC4gIE9ubHkgcG9zc2libGUgdmlhIGV0aHRvb2wuICAqLworCWlmIChibWNyICYgQk1DUl9GVUxMRFBMWCkgeworCQlibWNyICY9IH5CTUNSX0ZVTExEUExYOworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHRyeSBuZXh0IHBlcm11dGF0aW9uIChCTUNSICV4KVxuIiwgZGV2LT5uYW1lLCBibWNyKTsKKwkJdGNfbWRpb193cml0ZShkZXYsIHBpZCwgTUlJX0JNQ1IsIGJtY3IpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBEb3duZ3JhZGUgZnJvbSAxMDAgdG8gMTAuICovCisJaWYgKGJtY3IgJiBCTUNSX1NQRUVEMTAwKSB7CisJCWJtY3IgJj0gfkJNQ1JfU1BFRUQxMDA7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogdHJ5IG5leHQgcGVybXV0YXRpb24gKEJNQ1IgJXgpXG4iLCBkZXYtPm5hbWUsIGJtY3IpOworCQl0Y19tZGlvX3dyaXRlKGRldiwgcGlkLCBNSUlfQk1DUiwgYm1jcik7CisJCXJldHVybiAwOworCX0KKworCS8qIFdlJ3ZlIHRyaWVkIGV2ZXJ5dGhpbmcuICovCisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgdm9pZAordGMzNTgxNV9kaXNwbGF5X2xpbmtfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0YzM1ODE1X2xvY2FsICpscCA9IGRldi0+cHJpdjsKKwlpbnQgcGlkID0gbHAtPnBoeV9hZGRyOworCXVuc2lnbmVkIHNob3J0IGxwYSwgYm1jcjsKKwljaGFyICpzcGVlZCA9ICIiLCAqZHVwbGV4ID0gIiI7CisKKwlscGEgPSB0Y19tZGlvX3JlYWQoZGV2LCBwaWQsIE1JSV9MUEEpOworCWJtY3IgPSB0Y19tZGlvX3JlYWQoZGV2LCBwaWQsIE1JSV9CTUNSKTsKKwlpZiAob3B0aW9ucy5zcGVlZCA/IChibWNyICYgQk1DUl9TUEVFRDEwMCkgOiAobHBhICYgKExQQV8xMDBIQUxGIHwgTFBBXzEwMEZVTEwpKSkKKwkJc3BlZWQgPSAiMTAwTWIvcyI7CisJZWxzZQorCQlzcGVlZCA9ICIxME1iL3MiOworCWlmIChvcHRpb25zLmR1cGxleCA/IChibWNyICYgQk1DUl9GVUxMRFBMWCkgOiAobHBhICYgKExQQV8xMDBGVUxMIHwgTFBBXzEwRlVMTCkpKQorCQlkdXBsZXggPSAiRnVsbCBEdXBsZXgiOworCWVsc2UKKwkJZHVwbGV4ID0gIkhhbGYgRHVwbGV4IjsKKworCWlmIChuZXRpZl9tc2dfbGluayhscCkpCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBMaW5rIGlzIHVwIGF0ICVzLCAlcy5cbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIHNwZWVkLCBkdXBsZXgpOworCXByaW50ayhLRVJOX0RFQlVHICIlczogTUlJIEJNQ1IgJTA0eCBCTVNSICUwNHggTFBBICUwNHhcbiIsCisJICAgICAgIGRldi0+bmFtZSwKKwkgICAgICAgYm1jciwgdGNfbWRpb19yZWFkKGRldiwgcGlkLCBNSUlfQk1TUiksIGxwYSk7Cit9CisKK3N0YXRpYyB2b2lkIHRjMzU4MTVfZGlzcGxheV9mb3JjZWRfbGlua19tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHRjMzU4MTVfbG9jYWwgKmxwID0gZGV2LT5wcml2OworCWludCBwaWQgPSBscC0+cGh5X2FkZHI7CisJdW5zaWduZWQgc2hvcnQgYm1jcjsKKwljaGFyICpzcGVlZCA9ICIiLCAqZHVwbGV4ID0gIiI7CisKKwlibWNyID0gdGNfbWRpb19yZWFkKGRldiwgcGlkLCBNSUlfQk1DUik7CisJaWYgKGJtY3IgJiBCTUNSX1NQRUVEMTAwKQorCQlzcGVlZCA9ICIxMDBNYi9zIjsKKwllbHNlCisJCXNwZWVkID0gIjEwTWIvcyI7CisJaWYgKGJtY3IgJiBCTUNSX0ZVTExEUExYKQorCQlkdXBsZXggPSAiRnVsbCBEdXBsZXguXG4iOworCWVsc2UKKwkJZHVwbGV4ID0gIkhhbGYgRHVwbGV4LlxuIjsKKworCWlmIChuZXRpZl9tc2dfbGluayhscCkpCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBMaW5rIGhhcyBiZWVuIGZvcmNlZCB1cCBhdCAlcywgJXMiLAorCQkgICAgICAgZGV2LT5uYW1lLCBzcGVlZCwgZHVwbGV4KTsKK30KKworc3RhdGljIHZvaWQgdGMzNTgxNV9zZXRfbGlua19tb2RlcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0YzM1ODE1X2xvY2FsICpscCA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgdGMzNTgxNV9yZWdzIF9faW9tZW0gKnRyID0KKwkJKHN0cnVjdCB0YzM1ODE1X3JlZ3MgX19pb21lbSAqKWRldi0+YmFzZV9hZGRyOworCWludCBwaWQgPSBscC0+cGh5X2FkZHI7CisJdW5zaWduZWQgc2hvcnQgYm1jciwgbHBhOworCWludCBzcGVlZDsKKworCWlmIChscC0+dGltZXJfc3RhdGUgPT0gYXJid2FpdCkgeworCQlscGEgPSB0Y19tZGlvX3JlYWQoZGV2LCBwaWQsIE1JSV9MUEEpOworCQlibWNyID0gdGNfbWRpb19yZWFkKGRldiwgcGlkLCBNSUlfQk1DUik7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogTUlJIEJNQ1IgJTA0eCBCTVNSICUwNHggTFBBICUwNHhcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsCisJCSAgICAgICBibWNyLCB0Y19tZGlvX3JlYWQoZGV2LCBwaWQsIE1JSV9CTVNSKSwgbHBhKTsKKwkJaWYgKCEobHBhICYgKExQQV8xMEhBTEYgfCBMUEFfMTBGVUxMIHwKKwkJCSAgICAgTFBBXzEwMEhBTEYgfCBMUEFfMTAwRlVMTCkpKSB7CisJCQkvKiBmYWxsIGJhY2sgdG8gMTBIQUxGICovCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogYmFkIGFiaWxpdHkgJTA0eCAtIGZhbGxpbmcgYmFjayB0byAxMEhELlxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIGxwYSk7CisJCQlscGEgPSBMUEFfMTBIQUxGOworCQl9CisJCWlmIChvcHRpb25zLmR1cGxleCA/IChibWNyICYgQk1DUl9GVUxMRFBMWCkgOiAobHBhICYgKExQQV8xMDBGVUxMIHwgTFBBXzEwRlVMTCkpKQorCQkJbHAtPmZ1bGxkdXBsZXggPSAxOworCQllbHNlCisJCQlscC0+ZnVsbGR1cGxleCA9IDA7CisJCWlmIChvcHRpb25zLnNwZWVkID8gKGJtY3IgJiBCTUNSX1NQRUVEMTAwKSA6IChscGEgJiAoTFBBXzEwMEhBTEYgfCBMUEFfMTAwRlVMTCkpKQorCQkJc3BlZWQgPSAxMDA7CisJCWVsc2UKKwkJCXNwZWVkID0gMTA7CisJfSBlbHNlIHsKKwkJLyogRm9yY2luZyBhIGxpbmsgbW9kZS4gKi8KKwkJYm1jciA9IHRjX21kaW9fcmVhZChkZXYsIHBpZCwgTUlJX0JNQ1IpOworCQlpZiAoYm1jciAmIEJNQ1JfRlVMTERQTFgpCisJCQlscC0+ZnVsbGR1cGxleCA9IDE7CisJCWVsc2UKKwkJCWxwLT5mdWxsZHVwbGV4ID0gMDsKKwkJaWYgKGJtY3IgJiBCTUNSX1NQRUVEMTAwKQorCQkJc3BlZWQgPSAxMDA7CisJCWVsc2UKKwkJCXNwZWVkID0gMTA7CisJfQorCisJdGNfd3JpdGVsKHRjX3JlYWRsKCZ0ci0+TUFDX0N0bCkgfCBNQUNfSGFsdFJlcSwgJnRyLT5NQUNfQ3RsKTsKKwlpZiAobHAtPmZ1bGxkdXBsZXgpIHsKKwkJdGNfd3JpdGVsKHRjX3JlYWRsKCZ0ci0+TUFDX0N0bCkgfCBNQUNfRnVsbER1cCwgJnRyLT5NQUNfQ3RsKTsKKwl9IGVsc2UgeworCQl0Y193cml0ZWwodGNfcmVhZGwoJnRyLT5NQUNfQ3RsKSAmIH5NQUNfRnVsbER1cCwgJnRyLT5NQUNfQ3RsKTsKKwl9CisJdGNfd3JpdGVsKHRjX3JlYWRsKCZ0ci0+TUFDX0N0bCkgJiB+TUFDX0hhbHRSZXEsICZ0ci0+TUFDX0N0bCk7CisKKwkvKiBUWDQ5MzkgUENGRy5TUEVFRG4gYml0IHdpbGwgYmUgY2hhbmdlZCBvbiBORVRERVZfQ0hBTkdFIGV2ZW50LiAqLworCisjaWZuZGVmIE5PX0NIRUNLX0NBUlJJRVIKKwkvKiBUWDQ5MzkgZG9lcyBub3QgaGF2ZSBFbkxDYXJyICovCisJaWYgKGxwLT5ib2FyZHR5cGUgIT0gVEMzNTgxNV9UWDQ5MzkpIHsKKyNpZmRlZiBXT1JLQVJPVU5EX0xPU1RDQVIKKwkJLyogV09SS0FST1VORDogZW5hYmxlIExvc3RDclMgb25seSBpZiBoYWxmIGR1cGxleCBvcGVyYXRpb24gKi8KKwkJaWYgKCFscC0+ZnVsbGR1cGxleCAmJiBscC0+Ym9hcmR0eXBlICE9IFRDMzU4MTVfVFg0OTM5KQorCQkJdGNfd3JpdGVsKHRjX3JlYWRsKCZ0ci0+VHhfQ3RsKSB8IFR4X0VuTENhcnIsICZ0ci0+VHhfQ3RsKTsKKyNlbmRpZgorCX0KKyNlbmRpZgorCWxwLT5taWkuZnVsbF9kdXBsZXggPSBscC0+ZnVsbGR1cGxleDsKK30KKworc3RhdGljIHZvaWQgdGMzNTgxNV90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRhdGE7CisJc3RydWN0IHRjMzU4MTVfbG9jYWwgKmxwID0gZGV2LT5wcml2OworCWludCBwaWQgPSBscC0+cGh5X2FkZHI7CisJdW5zaWduZWQgc2hvcnQgYm1zciwgYm1jciwgbHBhOworCWludCByZXN0YXJ0X3RpbWVyID0gMDsKKworCXNwaW5fbG9ja19pcnEoJmxwLT5sb2NrKTsKKworCWxwLT50aW1lcl90aWNrcysrOworCXN3aXRjaCAobHAtPnRpbWVyX3N0YXRlKSB7CisJY2FzZSBhcmJ3YWl0OgorCQkvKgorCQkgKiBPbmx5IGFsbG93IGZvciA1IHRpY2tzLCB0aGF0cyAxMCBzZWNvbmRzIGFuZCBtdWNoIHRvbworCQkgKiBsb25nIHRvIHdhaXQgZm9yIGFyYml0cmF0aW9uIHRvIGNvbXBsZXRlLgorCQkgKi8KKwkJLyogVEMzNTgxNSBuZWVkIG1vcmUgdGltZXMuLi4gKi8KKwkJaWYgKGxwLT50aW1lcl90aWNrcyA+PSAxMCkgeworCQkJLyogRW50ZXIgZm9yY2UgbW9kZS4gKi8KKwkJCWlmICghb3B0aW9ucy5kb2ZvcmNlKSB7CisJCQkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogQXV0by1OZWdvdGlhdGlvbiB1bnN1Y2Nlc3NmdWwsIgorCQkJCSAgICAgICAiIGNhYmxlIHByb2JibGVtP1xuIiwgZGV2LT5uYW1lKTsKKwkJCQkvKiBUcnkgdG8gcmVzdGFydCB0aGUgYWRhcHRvci4gKi8KKwkJCQl0YzM1ODE1X3Jlc3RhcnQoZGV2KTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IEF1dG8tTmVnb3RpYXRpb24gdW5zdWNjZXNzZnVsLCIKKwkJCSAgICAgICAiIHRyeWluZyBmb3JjZSBsaW5rIG1vZGVcbiIsIGRldi0+bmFtZSk7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IEJNQ1IgJXggQk1TUiAleFxuIiwgZGV2LT5uYW1lLAorCQkJICAgICAgIHRjX21kaW9fcmVhZChkZXYsIHBpZCwgTUlJX0JNQ1IpLAorCQkJICAgICAgIHRjX21kaW9fcmVhZChkZXYsIHBpZCwgTUlJX0JNU1IpKTsKKwkJCWJtY3IgPSBCTUNSX1NQRUVEMTAwOworCQkJdGNfbWRpb193cml0ZShkZXYsIHBpZCwgTUlJX0JNQ1IsIGJtY3IpOworCisJCQkvKgorCQkJICogT0ssIHNlZW1zIHdlIG5lZWQgZG8gZGlzYWJsZSB0aGUgdHJhbnNjZWl2ZXIKKwkJCSAqIGZvciB0aGUgZmlyc3QgdGljayB0byBtYWtlIHN1cmUgd2UgZ2V0IGFuCisJCQkgKiBhY2N1cmF0ZSBsaW5rIHN0YXRlIGF0IHRoZSBzZWNvbmQgdGljay4KKwkJCSAqLworCisJCQlscC0+dGltZXJfc3RhdGUgPSBsdHJ5d2FpdDsKKwkJCWxwLT50aW1lcl90aWNrcyA9IDA7CisJCQlyZXN0YXJ0X3RpbWVyID0gMTsKKwkJfSBlbHNlIHsKKwkJCS8qIEFueXRoaW5nIGludGVyZXN0aW5nIGhhcHBlbj8gKi8KKwkJCWJtc3IgPSB0Y19tZGlvX3JlYWQoZGV2LCBwaWQsIE1JSV9CTVNSKTsKKwkJCWlmIChibXNyICYgQk1TUl9BTkVHQ09NUExFVEUpIHsKKwkJCQkvKiBKdXN0IHdoYXQgd2UndmUgYmVlbiB3YWl0aW5nIGZvci4uLiAqLworCQkJCXRjMzU4MTVfc2V0X2xpbmtfbW9kZXMoZGV2KTsKKworCQkJCS8qCisJCQkJICogU3VjY2VzcywgYXQgbGVhc3Qgc28gZmFyLCBhZHZhbmNlIG91ciBzdGF0ZQorCQkJCSAqIGVuZ2luZS4KKwkJCQkgKi8KKwkJCQlscC0+dGltZXJfc3RhdGUgPSBsdXB3YWl0OworCQkJCXJlc3RhcnRfdGltZXIgPSAxOworCQkJfSBlbHNlIHsKKwkJCQlyZXN0YXJ0X3RpbWVyID0gMTsKKwkJCX0KKwkJfQorCQlicmVhazsKKworCWNhc2UgbHVwd2FpdDoKKwkJLyoKKwkJICogQXV0byBuZWdvdGlhdGlvbiB3YXMgc3VjY2Vzc2Z1bCBhbmQgd2UgYXJlIGF3YWl0aW5nIGEKKwkJICogbGluayB1cCBzdGF0dXMuICBJIGhhdmUgZGVjaWRlZCB0byBsZXQgdGhpcyB0aW1lciBydW4KKwkJICogZm9yZXZlciB1bnRpbCBzb21lIHNvcnQgb2YgZXJyb3IgaXMgc2lnbmFsbGVkLCByZXBvcnRpbmcKKwkJICogYSBtZXNzYWdlIHRvIHRoZSB1c2VyIGF0IDEwIHNlY29uZCBpbnRlcnZhbHMuCisJCSAqLworCQlibXNyID0gdGNfbWRpb19yZWFkKGRldiwgcGlkLCBNSUlfQk1TUik7CisJCWlmIChibXNyICYgQk1TUl9MU1RBVFVTKSB7CisJCQkvKgorCQkJICogV2hlZWUsIGl0J3MgdXAsIGRpc3BsYXkgdGhlIGxpbmsgbW9kZSBpbiB1c2UgYW5kIHB1dAorCQkJICogdGhlIHRpbWVyIHRvIHNsZWVwLgorCQkJICovCisJCQl0YzM1ODE1X2Rpc3BsYXlfbGlua19tb2RlKGRldik7CisJCQluZXRpZl9jYXJyaWVyX29uKGRldik7CisjaWZkZWYgV09SS0FST1VORF8xMDBIQUxGX1BST01JU0MKKwkJCS8qIGRlbGF5ZWQgcHJvbWlzY3VvdXMgZW5hYmxpbmcgKi8KKwkJCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpCisJCQkJdGMzNTgxNV9zZXRfbXVsdGljYXN0X2xpc3QoZGV2KTsKKyNlbmRpZgorI2lmIDEKKwkJCWxwLT5zYXZlZF9scGEgPSB0Y19tZGlvX3JlYWQoZGV2LCBwaWQsIE1JSV9MUEEpOworCQkJbHAtPnRpbWVyX3N0YXRlID0gbGNoZWNrOworCQkJcmVzdGFydF90aW1lciA9IDE7CisjZWxzZQorCQkJbHAtPnRpbWVyX3N0YXRlID0gYXNsZWVwOworCQkJcmVzdGFydF90aW1lciA9IDA7CisjZW5kaWYKKwkJfSBlbHNlIHsKKwkJCWlmIChscC0+dGltZXJfdGlja3MgPj0gMTApIHsKKwkJCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBBdXRvIG5lZ290aWF0aW9uIHN1Y2Nlc3NmdWwsIGxpbmsgc3RpbGwgIgorCQkJCSAgICAgICAibm90IGNvbXBsZXRlbHkgdXAuXG4iLCBkZXYtPm5hbWUpOworCQkJCWxwLT50aW1lcl90aWNrcyA9IDA7CisJCQkJcmVzdGFydF90aW1lciA9IDE7CisJCQl9IGVsc2UgeworCQkJCXJlc3RhcnRfdGltZXIgPSAxOworCQkJfQorCQl9CisJCWJyZWFrOworCisJY2FzZSBsdHJ5d2FpdDoKKwkJLyoKKwkJICogTWFraW5nIHRoZSB0aW1lb3V0IGhlcmUgdG9vIGxvbmcgY2FuIG1ha2UgaXQgdGFrZQorCQkgKiBhbm5veWluZ2x5IGxvbmcgdG8gYXR0ZW1wdCBhbGwgb2YgdGhlIGxpbmsgbW9kZQorCQkgKiBwZXJtdXRhdGlvbnMsIGJ1dCB0aGVuIGFnYWluIHRoaXMgaXMgZXNzZW50aWFsbHkKKwkJICogZXJyb3IgcmVjb3ZlcnkgY29kZSBmb3IgdGhlIG1vc3QgcGFydC4KKwkJICovCisJCWJtc3IgPSB0Y19tZGlvX3JlYWQoZGV2LCBwaWQsIE1JSV9CTVNSKTsKKwkJYm1jciA9IHRjX21kaW9fcmVhZChkZXYsIHBpZCwgTUlJX0JNQ1IpOworCQlpZiAobHAtPnRpbWVyX3RpY2tzID09IDEpIHsKKwkJCS8qCisJCQkgKiBSZS1lbmFibGUgdHJhbnNjZWl2ZXIsIHdlJ2xsIHJlLWVuYWJsZSB0aGUKKwkJCSAqIHRyYW5zY2VpdmVyIG5leHQgdGljaywgdGhlbiBjaGVjayBsaW5rIHN0YXRlCisJCQkgKiBvbiB0aGUgZm9sbG93aW5nIHRpY2suCisJCQkgKi8KKwkJCXJlc3RhcnRfdGltZXIgPSAxOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGxwLT50aW1lcl90aWNrcyA9PSAyKSB7CisJCQlyZXN0YXJ0X3RpbWVyID0gMTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChibXNyICYgQk1TUl9MU1RBVFVTKSB7CisJCQkvKiBGb3JjZSBtb2RlIHNlbGVjdGlvbiBzdWNjZXNzLiAqLworCQkJdGMzNTgxNV9kaXNwbGF5X2ZvcmNlZF9saW5rX21vZGUoZGV2KTsKKwkJCW5ldGlmX2NhcnJpZXJfb24oZGV2KTsKKwkJCXRjMzU4MTVfc2V0X2xpbmtfbW9kZXMoZGV2KTsKKyNpZmRlZiBXT1JLQVJPVU5EXzEwMEhBTEZfUFJPTUlTQworCQkJLyogZGVsYXllZCBwcm9taXNjdW91cyBlbmFibGluZyAqLworCQkJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykKKwkJCQl0YzM1ODE1X3NldF9tdWx0aWNhc3RfbGlzdChkZXYpOworI2VuZGlmCisjaWYgMQorCQkJbHAtPnNhdmVkX2xwYSA9IHRjX21kaW9fcmVhZChkZXYsIHBpZCwgTUlJX0xQQSk7CisJCQlscC0+dGltZXJfc3RhdGUgPSBsY2hlY2s7CisJCQlyZXN0YXJ0X3RpbWVyID0gMTsKKyNlbHNlCisJCQlscC0+dGltZXJfc3RhdGUgPSBhc2xlZXA7CisJCQlyZXN0YXJ0X3RpbWVyID0gMDsKKyNlbmRpZgorCQl9IGVsc2UgeworCQkJaWYgKGxwLT50aW1lcl90aWNrcyA+PSA0KSB7IC8qIDYgc2Vjb25kcyBvciBzby4uLiAqLworCQkJCWludCByZXQ7CisKKwkJCQlyZXQgPSB0YzM1ODE1X3RyeV9uZXh0X3Blcm11dGF0aW9uKGRldik7CisJCQkJaWYgKHJldCA9PSAtMSkgeworCQkJCQkvKgorCQkJCQkgKiBBaWVlZSwgdHJpZWQgdGhlbSBhbGwsIHJlc2V0IHRoZQorCQkJCQkgKiBjaGlwIGFuZCB0cnkgYWxsIG92ZXIgYWdhaW4uCisJCQkJCSAqLworCQkJCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBMaW5rIGRvd24sICIKKwkJCQkJICAgICAgICJjYWJsZSBwcm9ibGVtP1xuIiwKKwkJCQkJICAgICAgIGRldi0+bmFtZSk7CisKKwkJCQkJLyogVHJ5IHRvIHJlc3RhcnQgdGhlIGFkYXB0b3IuICovCisJCQkJCXRjMzU4MTVfcmVzdGFydChkZXYpOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisJCQkJbHAtPnRpbWVyX3RpY2tzID0gMDsKKwkJCQlyZXN0YXJ0X3RpbWVyID0gMTsKKwkJCX0gZWxzZSB7CisJCQkJcmVzdGFydF90aW1lciA9IDE7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIGxjaGVjazoKKwkJYm1jciA9IHRjX21kaW9fcmVhZChkZXYsIHBpZCwgTUlJX0JNQ1IpOworCQlscGEgPSB0Y19tZGlvX3JlYWQoZGV2LCBwaWQsIE1JSV9MUEEpOworCQlpZiAoYm1jciAmIChCTUNSX1BET1dOIHwgQk1DUl9JU09MQVRFIHwgQk1DUl9SRVNFVCkpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IFBIWSBkb3duPyAoQk1DUiAleClcbiIsIGRldi0+bmFtZSwKKwkJCSAgICAgICBibWNyKTsKKwkJfSBlbHNlIGlmICgobHAtPnNhdmVkX2xwYSBeIGxwYSkgJgorCQkJICAgKExQQV8xMDBGVUxMfExQQV8xMDBIQUxGfExQQV8xMEZVTEx8TFBBXzEwSEFMRikpIHsKKwkJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IGxpbmsgc3RhdHVzIGNoYW5nZWQiCisJCQkgICAgICAgIiAoQk1DUiAleCBMUEEgJXgtPiV4KVxuIiwgZGV2LT5uYW1lLAorCQkJICAgICAgIGJtY3IsIGxwLT5zYXZlZF9scGEsIGxwYSk7CisJCX0gZWxzZSB7CisJCQkvKiBnbyBvbiAqLworCQkJcmVzdGFydF90aW1lciA9IDE7CisJCQlicmVhazsKKwkJfQorCQkvKiBUcnkgdG8gcmVzdGFydCB0aGUgYWRhcHRvci4gKi8KKwkJdGMzNTgxNV9yZXN0YXJ0KGRldik7CisJCWdvdG8gb3V0OworCisJY2FzZSBhc2xlZXA6CisJZGVmYXVsdDoKKwkJLyogQ2FuJ3QgaGFwcGVucy4uLi4gKi8KKwkJcHJpbnRrKEtFUk5fRVJSICIlczogQWllZWUsIGxpbmsgdGltZXIgaXMgYXNsZWVwIGJ1dCB3ZSBnb3QgIgorCQkgICAgICAgIm9uZSBhbnl3YXlzIVxuIiwgZGV2LT5uYW1lKTsKKwkJcmVzdGFydF90aW1lciA9IDA7CisJCWxwLT50aW1lcl90aWNrcyA9IDA7CisJCWxwLT50aW1lcl9zdGF0ZSA9IGFzbGVlcDsgLyogZm9vIG9uIHlvdSAqLworCQlicmVhazsKKwl9CisKKwlpZiAocmVzdGFydF90aW1lcikgeworCQlscC0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEyMDApOworCQlhZGRfdGltZXIoJmxwLT50aW1lcik7CisJfQorb3V0OgorCXNwaW5fdW5sb2NrX2lycSgmbHAtPmxvY2spOworfQorCitzdGF0aWMgdm9pZCB0YzM1ODE1X3N0YXJ0X2F1dG9fbmVnb3RpYXRpb24oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJICAgc3RydWN0IGV0aHRvb2xfY21kICplcCkKK3sKKwlzdHJ1Y3QgdGMzNTgxNV9sb2NhbCAqbHAgPSBkZXYtPnByaXY7CisJaW50IHBpZCA9IGxwLT5waHlfYWRkcjsKKwl1bnNpZ25lZCBzaG9ydCBibXNyLCBibWNyLCBhZHZlcnRpemU7CisJaW50IHRpbWVvdXQ7CisKKwluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCWJtc3IgPSB0Y19tZGlvX3JlYWQoZGV2LCBwaWQsIE1JSV9CTVNSKTsKKwlibWNyID0gdGNfbWRpb19yZWFkKGRldiwgcGlkLCBNSUlfQk1DUik7CisJYWR2ZXJ0aXplID0gdGNfbWRpb19yZWFkKGRldiwgcGlkLCBNSUlfQURWRVJUSVNFKTsKKworCWlmIChlcCA9PSBOVUxMIHx8IGVwLT5hdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFKSB7CisJCWlmIChvcHRpb25zLnNwZWVkIHx8IG9wdGlvbnMuZHVwbGV4KSB7CisJCQkvKiBBZHZlcnRpc2Ugb25seSBzcGVjaWZpZWQgY29uZmlndXJhdGlvbi4gKi8KKwkJCWFkdmVydGl6ZSAmPSB+KEFEVkVSVElTRV8xMEhBTEYgfAorCQkJCSAgICAgICBBRFZFUlRJU0VfMTBGVUxMIHwKKwkJCQkgICAgICAgQURWRVJUSVNFXzEwMEhBTEYgfAorCQkJCSAgICAgICBBRFZFUlRJU0VfMTAwRlVMTCk7CisJCQlpZiAob3B0aW9ucy5zcGVlZCAhPSAxMCkgeworCQkJCWlmIChvcHRpb25zLmR1cGxleCAhPSAxKQorCQkJCQlhZHZlcnRpemUgfD0gQURWRVJUSVNFXzEwMEZVTEw7CisJCQkJaWYgKG9wdGlvbnMuZHVwbGV4ICE9IDIpCisJCQkJCWFkdmVydGl6ZSB8PSBBRFZFUlRJU0VfMTAwSEFMRjsKKwkJCX0KKwkJCWlmIChvcHRpb25zLnNwZWVkICE9IDEwMCkgeworCQkJCWlmIChvcHRpb25zLmR1cGxleCAhPSAxKQorCQkJCQlhZHZlcnRpemUgfD0gQURWRVJUSVNFXzEwRlVMTDsKKwkJCQlpZiAob3B0aW9ucy5kdXBsZXggIT0gMikKKwkJCQkJYWR2ZXJ0aXplIHw9IEFEVkVSVElTRV8xMEhBTEY7CisJCQl9CisJCQlpZiAob3B0aW9ucy5zcGVlZCA9PSAxMDApCisJCQkJYm1jciB8PSBCTUNSX1NQRUVEMTAwOworCQkJZWxzZSBpZiAob3B0aW9ucy5zcGVlZCA9PSAxMCkKKwkJCQlibWNyICY9IH5CTUNSX1NQRUVEMTAwOworCQkJaWYgKG9wdGlvbnMuZHVwbGV4ID09IDIpCisJCQkJYm1jciB8PSBCTUNSX0ZVTExEUExYOworCQkJZWxzZSBpZiAob3B0aW9ucy5kdXBsZXggPT0gMSkKKwkJCQlibWNyICY9IH5CTUNSX0ZVTExEUExYOworCQl9IGVsc2UgeworCQkJLyogQWR2ZXJ0aXNlIGV2ZXJ5dGhpbmcgd2UgY2FuIHN1cHBvcnQuICovCisJCQlpZiAoYm1zciAmIEJNU1JfMTBIQUxGKQorCQkJCWFkdmVydGl6ZSB8PSBBRFZFUlRJU0VfMTBIQUxGOworCQkJZWxzZQorCQkJCWFkdmVydGl6ZSAmPSB+QURWRVJUSVNFXzEwSEFMRjsKKwkJCWlmIChibXNyICYgQk1TUl8xMEZVTEwpCisJCQkJYWR2ZXJ0aXplIHw9IEFEVkVSVElTRV8xMEZVTEw7CisJCQllbHNlCisJCQkJYWR2ZXJ0aXplICY9IH5BRFZFUlRJU0VfMTBGVUxMOworCQkJaWYgKGJtc3IgJiBCTVNSXzEwMEhBTEYpCisJCQkJYWR2ZXJ0aXplIHw9IEFEVkVSVElTRV8xMDBIQUxGOworCQkJZWxzZQorCQkJCWFkdmVydGl6ZSAmPSB+QURWRVJUSVNFXzEwMEhBTEY7CisJCQlpZiAoYm1zciAmIEJNU1JfMTAwRlVMTCkKKwkJCQlhZHZlcnRpemUgfD0gQURWRVJUSVNFXzEwMEZVTEw7CisJCQllbHNlCisJCQkJYWR2ZXJ0aXplICY9IH5BRFZFUlRJU0VfMTAwRlVMTDsKKwkJfQorCisJCXRjX21kaW9fd3JpdGUoZGV2LCBwaWQsIE1JSV9BRFZFUlRJU0UsIGFkdmVydGl6ZSk7CisKKwkJLyogRW5hYmxlIEF1dG8tTmVnb3RpYXRpb24sIHRoaXMgaXMgdXN1YWxseSBvbiBhbHJlYWR5Li4uICovCisJCWJtY3IgfD0gQk1DUl9BTkVOQUJMRTsKKwkJdGNfbWRpb193cml0ZShkZXYsIHBpZCwgTUlJX0JNQ1IsIGJtY3IpOworCisJCS8qIFJlc3RhcnQgaXQgdG8gbWFrZSBzdXJlIGl0IGlzIGdvaW5nLiAqLworCQlibWNyIHw9IEJNQ1JfQU5SRVNUQVJUOworCQl0Y19tZGlvX3dyaXRlKGRldiwgcGlkLCBNSUlfQk1DUiwgYm1jcik7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogQURWRVJUSVNFICV4IEJNQ1IgJXhcbiIsIGRldi0+bmFtZSwgYWR2ZXJ0aXplLCBibWNyKTsKKworCQkvKiBCTUNSX0FOUkVTVEFSVCBzZWxmIGNsZWFycyB3aGVuIHRoZSBwcm9jZXNzIGhhcyBiZWd1bi4gKi8KKwkJdGltZW91dCA9IDY0OyAgLyogTW9yZSB0aGFuIGVub3VnaC4gKi8KKwkJd2hpbGUgKC0tdGltZW91dCkgeworCQkJYm1jciA9IHRjX21kaW9fcmVhZChkZXYsIHBpZCwgTUlJX0JNQ1IpOworCQkJaWYgKCEoYm1jciAmIEJNQ1JfQU5SRVNUQVJUKSkKKwkJCQlicmVhazsgLyogZ290IGl0LiAqLworCQkJdWRlbGF5KDEwKTsKKwkJfQorCQlpZiAoIXRpbWVvdXQpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IFRDMzU4MTUgd291bGQgbm90IHN0YXJ0IGF1dG8gIgorCQkJICAgICAgICJuZWdvdGlhdGlvbiBCTUNSPTB4JTA0eFxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIGJtY3IpOworCQkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogUGVyZm9ybWluZyBmb3JjZSBsaW5rICIKKwkJCSAgICAgICAiZGV0ZWN0aW9uLlxuIiwgZGV2LT5uYW1lKTsKKwkJCWdvdG8gZm9yY2VfbGluazsKKwkJfSBlbHNlIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogYXV0byBuZWdvdGlhdGlvbiBzdGFydGVkLlxuIiwgZGV2LT5uYW1lKTsKKwkJCWxwLT50aW1lcl9zdGF0ZSA9IGFyYndhaXQ7CisJCX0KKwl9IGVsc2UgeworZm9yY2VfbGluazoKKwkJLyogRm9yY2UgdGhlIGxpbmsgdXAsIHRyeWluZyBmaXJzdCBhIHBhcnRpY3VsYXIgbW9kZS4KKwkJICogRWl0aGVyIHdlIGFyZSBoZXJlIGF0IHRoZSByZXF1ZXN0IG9mIGV0aHRvb2wgb3IKKwkJICogYmVjYXVzZSB0aGUgSGFwcHkgTWVhbCB3b3VsZCBub3Qgc3RhcnQgdG8gYXV0b25lZy4KKwkJICovCisKKwkJLyogRGlzYWJsZSBhdXRvLW5lZ290aWF0aW9uIGluIEJNQ1IsIGVuYWJsZSB0aGUgZHVwbGV4IGFuZAorCQkgKiBzcGVlZCBzZXR0aW5nLCBpbml0IHRoZSB0aW1lciBzdGF0ZSBtYWNoaW5lLCBhbmQgZmlyZSBpdCBvZmYuCisJCSAqLworCQlpZiAoZXAgPT0gTlVMTCB8fCBlcC0+YXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSkgeworCQkJYm1jciA9IEJNQ1JfU1BFRUQxMDA7CisJCX0gZWxzZSB7CisJCQlpZiAoZXAtPnNwZWVkID09IFNQRUVEXzEwMCkKKwkJCQlibWNyID0gQk1DUl9TUEVFRDEwMDsKKwkJCWVsc2UKKwkJCQlibWNyID0gMDsKKwkJCWlmIChlcC0+ZHVwbGV4ID09IERVUExFWF9GVUxMKQorCQkJCWJtY3IgfD0gQk1DUl9GVUxMRFBMWDsKKwkJfQorCQl0Y19tZGlvX3dyaXRlKGRldiwgcGlkLCBNSUlfQk1DUiwgYm1jcik7CisKKwkJLyogT0ssIHNlZW1zIHdlIG5lZWQgZG8gZGlzYWJsZSB0aGUgdHJhbnNjZWl2ZXIgZm9yIHRoZSBmaXJzdAorCQkgKiB0aWNrIHRvIG1ha2Ugc3VyZSB3ZSBnZXQgYW4gYWNjdXJhdGUgbGluayBzdGF0ZSBhdCB0aGUKKwkJICogc2Vjb25kIHRpY2suCisJCSAqLworCQlscC0+dGltZXJfc3RhdGUgPSBsdHJ5d2FpdDsKKwl9CisKKwlkZWxfdGltZXIoJmxwLT50aW1lcik7CisJbHAtPnRpbWVyX3RpY2tzID0gMDsKKwlscC0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEyMDApOworCWFkZF90aW1lcigmbHAtPnRpbWVyKTsKK30KKworc3RhdGljIHZvaWQgdGMzNTgxNV9maW5kX3BoeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0YzM1ODE1X2xvY2FsICpscCA9IGRldi0+cHJpdjsKKwlpbnQgcGlkID0gbHAtPnBoeV9hZGRyOworCXVuc2lnbmVkIHNob3J0IGlkMDsKKworCS8qIGZpbmQgTUlJIHBoeSAqLworCWZvciAocGlkID0gMzE7IHBpZCA+PSAwOyBwaWQtLSkgeworCQlpZDAgPSB0Y19tZGlvX3JlYWQoZGV2LCBwaWQsIE1JSV9CTVNSKTsKKwkJaWYgKGlkMCAhPSAweGZmZmYgJiYgaWQwICE9IDB4MDAwMCAmJgorCQkgICAgKGlkMCAmIEJNU1JfUkVTVikgIT0gKDB4ZmZmZiAmIEJNU1JfUkVTVikgLyogcGFyYW5vaWE/ICovCisJCQkpIHsKKwkJCWxwLT5waHlfYWRkciA9IHBpZDsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChwaWQgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IE5vIE1JSSBQaHkgZm91bmQuXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJbHAtPnBoeV9hZGRyID0gcGlkID0gMDsKKwl9CisKKwlscC0+bWlpX2lkWzBdID0gdGNfbWRpb19yZWFkKGRldiwgcGlkLCBNSUlfUEhZU0lEMSk7CisJbHAtPm1paV9pZFsxXSA9IHRjX21kaW9fcmVhZChkZXYsIHBpZCwgTUlJX1BIWVNJRDIpOworCWlmIChuZXRpZl9tc2dfaHcobHApKQorCQlwcmludGsoS0VSTl9JTkZPICIlczogUEhZKCUwMngpIElEICUwNHggJTA0eFxuIiwgZGV2LT5uYW1lLAorCQkgICAgICAgcGlkLCBscC0+bWlpX2lkWzBdLCBscC0+bWlpX2lkWzFdKTsKIH0KIAogc3RhdGljIHZvaWQgdGMzNTgxNV9waHlfY2hpcF9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHRjMzU4MTVfbG9jYWwgKmxwID0gZGV2LT5wcml2OwotCXN0cnVjdCB0YzM1ODE1X3JlZ3MgKnRyID0gKHN0cnVjdCB0YzM1ODE1X3JlZ3MqKWRldi0+YmFzZV9hZGRyOwotCXN0YXRpYyBpbnQgZmlyc3QgPSAxOwotCXVuc2lnbmVkIHNob3J0IGN0bDsKKwlpbnQgcGlkID0gbHAtPnBoeV9hZGRyOworCXVuc2lnbmVkIHNob3J0IGJtY3I7CisJc3RydWN0IGV0aHRvb2xfY21kIGVjbWQsICplcDsKIAotCWlmIChmaXJzdCkgewotCQl1bnNpZ25lZCBzaG9ydCBpZDAsIGlkMTsKLQkJaW50IGNvdW50OwotCQlmaXJzdCA9IDA7Ci0KLQkJLyogZmlyc3QgZGF0YSB3cml0dGVuIHRvIHRoZSBQSFkgd2lsbCBiZSBhbiBJRCBudW1iZXIgKi8KLQkJdGNfcGh5X3dyaXRlKGRldiwgMCwgdHIsIDAsIE1JSV9DT05UUk9MKTsJLyogSUQ6MCAqLwotI2lmIDAKLQkJdGNfcGh5X3dyaXRlKGRldiwgTUlJQ05UTF9SRVNFVCwgdHIsIDAsIE1JSV9DT05UUk9MKTsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJlc2V0dGluZyBQSFkuLi4iLCBkZXYtPm5hbWUpOwotCQl3aGlsZSAodGNfcGh5X3JlYWQoZGV2LCB0ciwgMCwgTUlJX0NPTlRST0wpICYgTUlJQ05UTF9SRVNFVCkKLQkJCTsKLQkJcHJpbnRrKCJcbiIpOwotCQl0Y19waHlfd3JpdGUoZGV2LCBNSUlDTlRMX0FVVE98TUlJQ05UTF9TUEVFRHxNSUlDTlRMX0ZEWCwgdHIsIDAsCi0JCQkgICAgIE1JSV9DT05UUk9MKTsKLSNlbmRpZgotCQlpZDAgPSB0Y19waHlfcmVhZChkZXYsIHRyLCAwLCBNSUlfUEhZX0lEMCk7Ci0JCWlkMSA9IHRjX3BoeV9yZWFkKGRldiwgdHIsIDAsIE1JSV9QSFlfSUQxKTsKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBQSFkgSUQgJTA0eCAlMDR4XG4iLCBkZXYtPm5hbWUsCi0JCSAgICAgICBpZDAsIGlkMSk7Ci0JCWlmIChscC0+b3B0aW9uICYgVEMzNTgxNV9PUFRfMTBNKSB7Ci0JCQlscC0+bGlua3NwZWVkID0gMTA7Ci0JCQlscC0+ZnVsbGR1cGxleCA9IChscC0+b3B0aW9uICYgVEMzNTgxNV9PUFRfRlVMTERVUCkgIT0gMDsKLQkJfSBlbHNlIGlmIChscC0+b3B0aW9uICYgVEMzNTgxNV9PUFRfMTAwTSkgewotCQkJbHAtPmxpbmtzcGVlZCA9IDEwMDsKLQkJCWxwLT5mdWxsZHVwbGV4ID0gKGxwLT5vcHRpb24gJiBUQzM1ODE1X09QVF9GVUxMRFVQKSAhPSAwOwotCQl9IGVsc2UgewotCQkJLyogYXV0byBuZWdvdGlhdGlvbiAqLwotCQkJdW5zaWduZWQgbG9uZyBuZWdfcmVzdWx0OwotCQkJdGNfcGh5X3dyaXRlKGRldiwgTUlJQ05UTF9BVVRPIHwgTUlJQ05UTF9SU1RfQVVUTywgdHIsIDAsIE1JSV9DT05UUk9MKTsKLQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBBdXRvIE5lZ290aWF0aW9uLi4uIiwgZGV2LT5uYW1lKTsKLQkJCWNvdW50ID0gMDsKLQkJCXdoaWxlICghKHRjX3BoeV9yZWFkKGRldiwgdHIsIDAsIE1JSV9TVEFUVVMpICYgTUlJU1RBVF9BVVRPX0RPTkUpKSB7Ci0JCQkJaWYgKGNvdW50KysgPiA1MDAwKSB7Ci0JCQkJCXByaW50aygiIGZhaWxlZC4gQXNzdW1lIDEwTWJwc1xuIik7Ci0JCQkJCWxwLT5saW5rc3BlZWQgPSAxMDsKLQkJCQkJbHAtPmZ1bGxkdXBsZXggPSAwOwotCQkJCQlnb3RvIGRvbmU7Ci0JCQkJfQotCQkJCWlmIChjb3VudCAlIDUxMiA9PSAwKQotCQkJCQlwcmludGsoIi4iKTsKLQkJCQltZGVsYXkoMSk7Ci0JCQl9Ci0JCQlwcmludGsoIiBkb25lLlxuIik7Ci0JCQluZWdfcmVzdWx0ID0gdGNfcGh5X3JlYWQoZGV2LCB0ciwgMCwgTUlJX0FOTFBBUik7Ci0JCQlpZiAobmVnX3Jlc3VsdCAmIChNSUlfQU5fVFhfRkRYIHwgTUlJX0FOX1RYX0hEWCkpCi0JCQkJbHAtPmxpbmtzcGVlZCA9IDEwMDsKLQkJCWVsc2UKLQkJCQlscC0+bGlua3NwZWVkID0gMTA7Ci0JCQlpZiAobmVnX3Jlc3VsdCAmIChNSUlfQU5fVFhfRkRYIHwgTUlJX0FOXzEwX0ZEWCkpCi0JCQkJbHAtPmZ1bGxkdXBsZXggPSAxOwotCQkJZWxzZQotCQkJCWxwLT5mdWxsZHVwbGV4ID0gMDsKLQkJZG9uZToKLQkJCTsKKwkvKiBkaXMtaXNvbGF0ZSBpZiBuZWVkZWQuICovCisJYm1jciA9IHRjX21kaW9fcmVhZChkZXYsIHBpZCwgTUlJX0JNQ1IpOworCWlmIChibWNyICYgQk1DUl9JU09MQVRFKSB7CisJCWludCBjb3VudCA9IDMyOworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHVuaXNvbGF0aW5nLi4uIiwgZGV2LT5uYW1lKTsKKwkJdGNfbWRpb193cml0ZShkZXYsIHBpZCwgTUlJX0JNQ1IsIGJtY3IgJiB+Qk1DUl9JU09MQVRFKTsKKwkJd2hpbGUgKC0tY291bnQpIHsKKwkJCWlmICghKHRjX21kaW9fcmVhZChkZXYsIHBpZCwgTUlJX0JNQ1IpICYgQk1DUl9JU09MQVRFKSkKKwkJCQlicmVhazsKKwkJCXVkZWxheSgyMCk7CiAJCX0KKwkJcHJpbnRrKCIgJXMuXG4iLCBjb3VudCA/ICJkb25lIiA6ICJmYWlsZWQiKTsKIAl9CiAKLQljdGwgPSAwOwotCWlmIChscC0+bGlua3NwZWVkID09IDEwMCkKLQkJY3RsIHw9IE1JSUNOVExfU1BFRUQ7Ci0JaWYgKGxwLT5mdWxsZHVwbGV4KQotCQljdGwgfD0gTUlJQ05UTF9GRFg7Ci0JdGNfcGh5X3dyaXRlKGRldiwgY3RsLCB0ciwgMCwgTUlJX0NPTlRST0wpOwotCi0JaWYgKGxwLT5mdWxsZHVwbGV4KSB7Ci0JCXRjX3dyaXRlbCh0Y19yZWFkbCgmdHItPk1BQ19DdGwpIHwgTUFDX0Z1bGxEdXAsICZ0ci0+TUFDX0N0bCk7CisJaWYgKG9wdGlvbnMuc3BlZWQgJiYgb3B0aW9ucy5kdXBsZXgpIHsKKwkJZWNtZC5hdXRvbmVnID0gQVVUT05FR19ESVNBQkxFOworCQllY21kLnNwZWVkID0gb3B0aW9ucy5zcGVlZCA9PSAxMCA/IFNQRUVEXzEwIDogU1BFRURfMTAwOworCQllY21kLmR1cGxleCA9IG9wdGlvbnMuZHVwbGV4ID09IDEgPyBEVVBMRVhfSEFMRiA6IERVUExFWF9GVUxMOworCQllcCA9ICZlY21kOworCX0gZWxzZSB7CisJCWVwID0gTlVMTDsKIAl9CisJdGMzNTgxNV9zdGFydF9hdXRvX25lZ290aWF0aW9uKGRldiwgZXApOwogfQogCiBzdGF0aWMgdm9pZCB0YzM1ODE1X2NoaXBfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgdGMzNTgxNV9yZWdzICp0ciA9IChzdHJ1Y3QgdGMzNTgxNV9yZWdzKilkZXYtPmJhc2VfYWRkcjsKLQorCXN0cnVjdCB0YzM1ODE1X3JlZ3MgX19pb21lbSAqdHIgPQorCQkoc3RydWN0IHRjMzU4MTVfcmVncyBfX2lvbWVtICopZGV2LT5iYXNlX2FkZHI7CisJaW50IGk7CiAJLyogcmVzZXQgdGhlIGNvbnRyb2xsZXIgKi8KIAl0Y193cml0ZWwoTUFDX1Jlc2V0LCAmdHItPk1BQ19DdGwpOwotCXdoaWxlICh0Y19yZWFkbCgmdHItPk1BQ19DdGwpICYgTUFDX1Jlc2V0KQotCQk7Ci0KKwl1ZGVsYXkoNCk7IC8qIDMyMDBucyAqLworCWkgPSAwOworCXdoaWxlICh0Y19yZWFkbCgmdHItPk1BQ19DdGwpICYgTUFDX1Jlc2V0KSB7CisJCWlmIChpKysgPiAxMDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IE1BQyByZXNldCBmYWlsZWQuXG4iLCBkZXYtPm5hbWUpOworCQkJYnJlYWs7CisJCX0KKwkJbWRlbGF5KDEpOworCX0KIAl0Y193cml0ZWwoMCwgJnRyLT5NQUNfQ3RsKTsKIAogCS8qIGluaXRpYWxpemUgcmVnaXN0ZXJzIHRvIGRlZmF1bHQgdmFsdWUgKi8KQEAgLTE2NTEsOTAgKzI4MDQsMTQyIEBACiAJdGNfd3JpdGVsKDAsICZ0ci0+Q0FNX0VuYSk7CiAJKHZvaWQpdGNfcmVhZGwoJnRyLT5NaXNzX0NudCk7CS8qIFJlYWQgdG8gY2xlYXIgKi8KIAorCS8qIGluaXRpYWxpemUgaW50ZXJuYWwgU1JBTSAqLworCXRjX3dyaXRlbChETUFfVGVzdE1vZGUsICZ0ci0+RE1BX0N0bCk7CisJZm9yIChpID0gMDsgaSA8IDB4MTAwMDsgaSArPSA0KSB7CisJCXRjX3dyaXRlbChpLCAmdHItPkNBTV9BZHIpOworCQl0Y193cml0ZWwoMCwgJnRyLT5DQU1fRGF0YSk7CisJfQorCXRjX3dyaXRlbCgwLCAmdHItPkRNQV9DdGwpOwogfQogCiBzdGF0aWMgdm9pZCB0YzM1ODE1X2NoaXBfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCB0YzM1ODE1X2xvY2FsICpscCA9IGRldi0+cHJpdjsKLQlzdHJ1Y3QgdGMzNTgxNV9yZWdzICp0ciA9IChzdHJ1Y3QgdGMzNTgxNV9yZWdzKilkZXYtPmJhc2VfYWRkcjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCB0YzM1ODE1X3JlZ3MgX19pb21lbSAqdHIgPQorCQkoc3RydWN0IHRjMzU4MTVfcmVncyBfX2lvbWVtICopZGV2LT5iYXNlX2FkZHI7CiAJdW5zaWduZWQgbG9uZyB0eGN0bCA9IFRYX0NUTF9DTUQ7CiAKIAl0YzM1ODE1X3BoeV9jaGlwX2luaXQoZGV2KTsKIAogCS8qIGxvYWQgc3RhdGlvbiBhZGRyZXNzIHRvIENBTSAqLwotCXRjMzU4MTVfc2V0X2NhbV9lbnRyeSh0ciwgQ0FNX0VOVFJZX1NPVVJDRSwgZGV2LT5kZXZfYWRkcik7CisJdGMzNTgxNV9zZXRfY2FtX2VudHJ5KGRldiwgQ0FNX0VOVFJZX1NPVVJDRSwgZGV2LT5kZXZfYWRkcik7CiAKIAkvKiBFbmFibGUgQ0FNIChicm9hZGNhc3QgYW5kIHVuaWNhc3QpICovCiAJdGNfd3JpdGVsKENBTV9FbmFfQml0KENBTV9FTlRSWV9TT1VSQ0UpLCAmdHItPkNBTV9FbmEpOwogCXRjX3dyaXRlbChDQU1fQ29tcEVuIHwgQ0FNX0Jyb2FkQWNjLCAmdHItPkNBTV9DdGwpOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5sb2NrLCBmbGFncyk7Ci0KLQl0Y193cml0ZWwoRE1BX0JVUlNUX1NJWkUsICZ0ci0+RE1BX0N0bCk7Ci0KKwkvKiBVc2UgRE1BX1J4QWxpZ25fMiB0byBtYWtlIElQIGhlYWRlciA0LWJ5dGUgYWxpZ25lZC4gKi8KKwlpZiAoSEFWRV9ETUFfUlhBTElHTihscCkpCisJCXRjX3dyaXRlbChETUFfQlVSU1RfU0laRSB8IERNQV9SeEFsaWduXzIsICZ0ci0+RE1BX0N0bCk7CisJZWxzZQorCQl0Y193cml0ZWwoRE1BX0JVUlNUX1NJWkUsICZ0ci0+RE1BX0N0bCk7CisjaWZkZWYgVEMzNTgxNV9VU0VfUEFDS0VEQlVGRkVSCiAJdGNfd3JpdGVsKFJ4RnJhZ19FblBhY2sgfCBFVEhfWkxFTiwgJnRyLT5SeEZyYWdTaXplKTsJLyogUGFja2luZyAqLworI2Vsc2UKKwl0Y193cml0ZWwoRVRIX1pMRU4sICZ0ci0+UnhGcmFnU2l6ZSk7CisjZW5kaWYKIAl0Y193cml0ZWwoMCwgJnRyLT5UeFBvbGxDdHIpOwkvKiBCYXRjaCBtb2RlICovCiAJdGNfd3JpdGVsKFRYX1RIUkVTSE9MRCwgJnRyLT5UeFRocnNoKTsKIAl0Y193cml0ZWwoSU5UX0VOX0NNRCwgJnRyLT5JbnRfRW4pOwogCiAJLyogc2V0IHF1ZXVlcyAqLwotCXRjX3dyaXRlbCh2aXJ0X3RvX2J1cyhscC0+cmZkX2Jhc2UpLCAmdHItPkZEQV9CYXMpOworCXRjX3dyaXRlbChmZF92aXJ0X3RvX2J1cyhscCwgbHAtPnJmZF9iYXNlKSwgJnRyLT5GREFfQmFzKTsKIAl0Y193cml0ZWwoKHVuc2lnbmVkIGxvbmcpbHAtPnJmZF9saW1pdCAtICh1bnNpZ25lZCBsb25nKWxwLT5yZmRfYmFzZSwKIAkJICAmdHItPkZEQV9MaW0pOwogCS8qCiAJICogQWN0aXZhdGlvbiBtZXRob2Q6Ci0JICogRmlyc3QsIGVuYWJsZSBlaHQgTUFDIFRyYW5zbWl0dGVyIGFuZCB0aGUgRE1BIFJlY2VpdmUgY2lyY3VpdHMuCisJICogRmlyc3QsIGVuYWJsZSB0aGUgTUFDIFRyYW5zbWl0dGVyIGFuZCB0aGUgRE1BIFJlY2VpdmUgY2lyY3VpdHMuCiAJICogVGhlbiBlbmFibGUgdGhlIERNQSBUcmFuc21pdHRlciBhbmQgdGhlIE1BQyBSZWNlaXZlIGNpcmN1aXRzLgogCSAqLwotCXRjX3dyaXRlbCh2aXJ0X3RvX2J1cyhscC0+ZmJsX3B0ciksICZ0ci0+QkxGcm1QdHIpOwkvKiBzdGFydCBETUEgcmVjZWl2ZXIgKi8KKwl0Y193cml0ZWwoZmRfdmlydF90b19idXMobHAsIGxwLT5mYmxfcHRyKSwgJnRyLT5CTEZybVB0cik7CS8qIHN0YXJ0IERNQSByZWNlaXZlciAqLwogCXRjX3dyaXRlbChSWF9DVExfQ01ELCAmdHItPlJ4X0N0bCk7CS8qIHN0YXJ0IE1BQyByZWNlaXZlciAqLworCiAJLyogc3RhcnQgTUFDIHRyYW5zbWl0dGVyICovCisjaWZuZGVmIE5PX0NIRUNLX0NBUlJJRVIKKwkvKiBUWDQ5MzkgZG9lcyBub3QgaGF2ZSBFbkxDYXJyICovCisJaWYgKGxwLT5ib2FyZHR5cGUgPT0gVEMzNTgxNV9UWDQ5MzkpCisJCXR4Y3RsICY9IH5UeF9FbkxDYXJyOworI2lmZGVmIFdPUktBUk9VTkRfTE9TVENBUgogCS8qIFdPUktBUk9VTkQ6IGlnbm9yZSBMb3N0Q3JTIGluIGZ1bGwgZHVwbGV4IG9wZXJhdGlvbiAqLwotCWlmIChscC0+ZnVsbGR1cGxleCkKLQkJdHhjdGwgPSBUWF9DVExfQ01EICYgflR4X0VuTENhcnI7CisJaWYgKChscC0+dGltZXJfc3RhdGUgIT0gYXNsZWVwICYmIGxwLT50aW1lcl9zdGF0ZSAhPSBsY2hlY2spIHx8CisJICAgIGxwLT5mdWxsZHVwbGV4KQorCQl0eGN0bCAmPSB+VHhfRW5MQ2FycjsKKyNlbmRpZgorI2VuZGlmIC8qICFOT19DSEVDS19DQVJSSUVSICovCiAjaWZkZWYgR0FUSEVSX1RYSU5UCiAJdHhjdGwgJj0gflR4X0VuQ29tcDsJLyogZGlzYWJsZSBnbG9iYWwgdHggY29tcGxldGlvbiBpbnQuICovCiAjZW5kaWYKIAl0Y193cml0ZWwodHhjdGwsICZ0ci0+VHhfQ3RsKTsKLSNpZiAwCS8qIE5vIG5lZWQgdG8gcG9sbGluZyAqLwotCXRjX3dyaXRlbCh2aXJ0X3RvX2J1cyhscC0+dGZkX2Jhc2UpLCAmdHItPlR4RnJtUHRyKTsJLyogc3RhcnQgRE1BIHRyYW5zbWl0dGVyICovCi0jZW5kaWYKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOwogfQogCi1zdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgdGMzNTgxNV9kcml2ZXIgPSB7Ci0JLm5hbWUgPSBUQzM1ODE1X01PRFVMRV9OQU1FLAotCS5wcm9iZSA9IHRjMzU4MTVfcHJvYmUsCi0JLnJlbW92ZSA9IE5VTEwsCi0JLmlkX3RhYmxlID0gdGMzNTgxNV9wY2lfdGJsLAorI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCB0YzM1ODE1X3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCB0YzM1ODE1X2xvY2FsICpscCA9IGRldi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJcGNpX3NhdmVfc3RhdGUocGRldik7CisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCisJCXJldHVybiAwOworCW5ldGlmX2RldmljZV9kZXRhY2goZGV2KTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmxvY2ssIGZsYWdzKTsKKwlkZWxfdGltZXIoJmxwLT50aW1lcik7CQkvKiBLaWxsIGlmIHJ1bm5pbmcJKi8KKwl0YzM1ODE1X2NoaXBfcmVzZXQoZGV2KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgUENJX0QzaG90KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0YzM1ODE1X3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCB0YzM1ODE1X2xvY2FsICpscCA9IGRldi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJcGNpX3Jlc3RvcmVfc3RhdGUocGRldik7CisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCisJCXJldHVybiAwOworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgUENJX0QwKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmxvY2ssIGZsYWdzKTsKKwl0YzM1ODE1X3Jlc3RhcnQoZGV2KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworCW5ldGlmX2RldmljZV9hdHRhY2goZGV2KTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHRjMzU4MTVfcGNpX2RyaXZlciA9IHsKKwkubmFtZQkJPSBNT0ROQU1FLAorCS5pZF90YWJsZQk9IHRjMzU4MTVfcGNpX3RibCwKKwkucHJvYmUJCT0gdGMzNTgxNV9pbml0X29uZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHRjMzU4MTVfcmVtb3ZlX29uZSksCisjaWZkZWYgQ09ORklHX1BNCisJLnN1c3BlbmQJPSB0YzM1ODE1X3N1c3BlbmQsCisJLnJlc3VtZQkJPSB0YzM1ODE1X3Jlc3VtZSwKKyNlbmRpZgogfTsKIAorbW9kdWxlX3BhcmFtX25hbWVkKHNwZWVkLCBvcHRpb25zLnNwZWVkLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhzcGVlZCwgIjA6YXV0bywgMTA6MTBNYnBzLCAxMDA6MTAwTWJwcyIpOworbW9kdWxlX3BhcmFtX25hbWVkKGR1cGxleCwgb3B0aW9ucy5kdXBsZXgsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGR1cGxleCwgIjA6YXV0bywgMTpoYWxmLCAyOmZ1bGwiKTsKK21vZHVsZV9wYXJhbV9uYW1lZChkb2ZvcmNlLCBvcHRpb25zLmRvZm9yY2UsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGRvZm9yY2UsICJ0cnkgZm9yY2UgbGluayBtb2RlIGlmIGF1dG8tbmVnb3RpYXRpb24gZmFpbGVkIik7CisKIHN0YXRpYyBpbnQgX19pbml0IHRjMzU4MTVfaW5pdF9tb2R1bGUodm9pZCkKIHsKLQlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmdGMzNTgxNV9kcml2ZXIpOworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZ0YzM1ODE1X3BjaV9kcml2ZXIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgdGMzNTgxNV9jbGVhbnVwX21vZHVsZSh2b2lkKQogewotCXN0cnVjdCBuZXRfZGV2aWNlICpuZXh0X2RldjsKLQotCS8qCi0JICogVE9ETzogaW1wbGVtZW50IGEgdGMzNTgxNV9kcml2ZXIucmVtb3ZlIGhvb2ssIGFuZAotCSAqIG1vdmUgdGhpcyBjb2RlIGludG8gdGhhdCBmdW5jdGlvbi4gIFRoZW4sIGRlbGV0ZQotCSAqIGFsbCByb290X3RjMzU4MTVfZGV2IGxpc3QgaGFuZGxpbmcgY29kZS4KLQkgKi8KLQl3aGlsZSAocm9vdF90YzM1ODE1X2RldikgewotCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcm9vdF90YzM1ODE1X2RldjsKLQkJbmV4dF9kZXYgPSAoKHN0cnVjdCB0YzM1ODE1X2xvY2FsICopZGV2LT5wcml2KS0+bmV4dF9tb2R1bGU7Ci0JCWlvdW5tYXAoKHZvaWQgKikoZGV2LT5iYXNlX2FkZHIpKTsKLQkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKLQkJZnJlZV9uZXRkZXYoZGV2KTsKLQkJcm9vdF90YzM1ODE1X2RldiA9IG5leHRfZGV2OwotCX0KLQotCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmdGMzNTgxNV9kcml2ZXIpOworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmdGMzNTgxNV9wY2lfZHJpdmVyKTsKIH0KIAogbW9kdWxlX2luaXQodGMzNTgxNV9pbml0X21vZHVsZSk7CiBtb2R1bGVfZXhpdCh0YzM1ODE1X2NsZWFudXBfbW9kdWxlKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJUT1NISUJBIFRDMzU4MTUgUENJIDEwTS8xMDBNIEV0aGVybmV0IGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdGczLmMgYi9kcml2ZXJzL25ldC90ZzMuYwppbmRleCAyNTY5NjllLi45NDg4ZjQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90ZzMuYworKysgYi9kcml2ZXJzL25ldC90ZzMuYwpAQCAtNDAsMTYgKzQwLDE2IEBACiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KIAogI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgorI2luY2x1ZGUgPG5ldC9pcC5oPgogCiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCi0jaWZkZWYgQ09ORklHX1NQQVJDNjQKKyNpZmRlZiBDT05GSUdfU1BBUkMKICNpbmNsdWRlIDxhc20vaWRwcm9tLmg+Ci0jaW5jbHVkZSA8YXNtL29wbGliLmg+Ci0jaW5jbHVkZSA8YXNtL3BibS5oPgorI2luY2x1ZGUgPGFzbS9wcm9tLmg+CiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX1ZMQU5fODAyMVEpIHx8IGRlZmluZWQoQ09ORklHX1ZMQU5fODAyMVFfTU9EVUxFKQpAQCAtMzM0OSw3ICszMzQ5LDcgQEAKIAkJCXNrYl9yZXNlcnZlKGNvcHlfc2tiLCAyKTsKIAkJCXNrYl9wdXQoY29weV9za2IsIGxlbik7CiAJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUodHAtPnBkZXYsIGRtYV9hZGRyLCBsZW4sIFBDSV9ETUFfRlJPTURFVklDRSk7Ci0JCQltZW1jcHkoY29weV9za2ItPmRhdGEsIHNrYi0+ZGF0YSwgbGVuKTsKKwkJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCBjb3B5X3NrYi0+ZGF0YSwgbGVuKTsKIAkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZSh0cC0+cGRldiwgZG1hX2FkZHIsIGxlbiwgUENJX0RNQV9GUk9NREVWSUNFKTsKIAogCQkJLyogV2UnbGwgcmV1c2UgdGhlIG9yaWdpbmFsIHJpbmcgYnVmZmVyLiAqLwpAQCAtMzkwOCwyMCArMzkwOCwyMCBAQAogCQlpZiAoc2tiX3NoaW5mbyhza2IpLT5nc29fdHlwZSAmIFNLQl9HU09fVENQVjYpCiAJCQltc3MgfD0gKHNrYl9oZWFkbGVuKHNrYikgLSBFVEhfSExFTikgPDwgOTsKIAkJZWxzZSB7Ci0JCQl0Y3Bfb3B0X2xlbiA9ICgoc2tiLT5oLnRoLT5kb2ZmIC0gNSkgKiA0KTsKLQkJCWlwX3RjcF9sZW4gPSAoc2tiLT5uaC5pcGgtPmlobCAqIDQpICsKLQkJCQkgICAgIHNpemVvZihzdHJ1Y3QgdGNwaGRyKTsKKwkJCXN0cnVjdCBpcGhkciAqaXBoID0gaXBfaGRyKHNrYik7CiAKLQkJCXNrYi0+bmguaXBoLT5jaGVjayA9IDA7Ci0JCQlza2ItPm5oLmlwaC0+dG90X2xlbiA9IGh0b25zKG1zcyArIGlwX3RjcF9sZW4gKwotCQkJCQkJICAgICB0Y3Bfb3B0X2xlbik7CisJCQl0Y3Bfb3B0X2xlbiA9IHRjcF9vcHRsZW4oc2tiKTsKKwkJCWlwX3RjcF9sZW4gPSBpcF9oZHJsZW4oc2tiKSArIHNpemVvZihzdHJ1Y3QgdGNwaGRyKTsKKworCQkJaXBoLT5jaGVjayA9IDA7CisJCQlpcGgtPnRvdF9sZW4gPSBodG9ucyhtc3MgKyBpcF90Y3BfbGVuICsgdGNwX29wdF9sZW4pOwogCQkJbXNzIHw9IChpcF90Y3BfbGVuICsgdGNwX29wdF9sZW4pIDw8IDk7CiAJCX0KIAogCQliYXNlX2ZsYWdzIHw9IChUWERfRkxBR19DUFVfUFJFX0RNQSB8CiAJCQkgICAgICAgVFhEX0ZMQUdfQ1BVX1BPU1RfRE1BKTsKIAotCQlza2ItPmgudGgtPmNoZWNrID0gMDsKKwkJdGNwX2hkcihza2IpLT5jaGVjayA9IDA7CiAKIAl9CiAJZWxzZSBpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCkKQEAgLTQwNTUsNiArNDA1NSw3IEBACiAJbXNzID0gMDsKIAlpZiAoc2tiLT5sZW4gPiAodHAtPmRldi0+bXR1ICsgRVRIX0hMRU4pICYmCiAJICAgIChtc3MgPSBza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplKSAhPSAwKSB7CisJCXN0cnVjdCBpcGhkciAqaXBoOwogCQlpbnQgdGNwX29wdF9sZW4sIGlwX3RjcF9sZW4sIGhkcl9sZW47CiAKIAkJaWYgKHNrYl9oZWFkZXJfY2xvbmVkKHNrYikgJiYKQEAgLTQwNjMsOCArNDA2NCw4IEBACiAJCQlnb3RvIG91dF91bmxvY2s7CiAJCX0KIAotCQl0Y3Bfb3B0X2xlbiA9ICgoc2tiLT5oLnRoLT5kb2ZmIC0gNSkgKiA0KTsKLQkJaXBfdGNwX2xlbiA9IChza2ItPm5oLmlwaC0+aWhsICogNCkgKyBzaXplb2Yoc3RydWN0IHRjcGhkcik7CisJCXRjcF9vcHRfbGVuID0gdGNwX29wdGxlbihza2IpOworCQlpcF90Y3BfbGVuID0gaXBfaGRybGVuKHNrYikgKyBzaXplb2Yoc3RydWN0IHRjcGhkcik7CiAKIAkJaGRyX2xlbiA9IGlwX3RjcF9sZW4gKyB0Y3Bfb3B0X2xlbjsKIAkJaWYgKHVubGlrZWx5KChFVEhfSExFTiArIGhkcl9sZW4pID4gODApICYmCkBAIC00MDc0LDM0ICs0MDc1LDMxIEBACiAJCWJhc2VfZmxhZ3MgfD0gKFRYRF9GTEFHX0NQVV9QUkVfRE1BIHwKIAkJCSAgICAgICBUWERfRkxBR19DUFVfUE9TVF9ETUEpOwogCi0JCXNrYi0+bmguaXBoLT5jaGVjayA9IDA7Ci0JCXNrYi0+bmguaXBoLT50b3RfbGVuID0gaHRvbnMobXNzICsgaGRyX2xlbik7CisJCWlwaCA9IGlwX2hkcihza2IpOworCQlpcGgtPmNoZWNrID0gMDsKKwkJaXBoLT50b3RfbGVuID0gaHRvbnMobXNzICsgaGRyX2xlbik7CiAJCWlmICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX0hXX1RTTykgewotCQkJc2tiLT5oLnRoLT5jaGVjayA9IDA7CisJCQl0Y3BfaGRyKHNrYiktPmNoZWNrID0gMDsKIAkJCWJhc2VfZmxhZ3MgJj0gflRYRF9GTEFHX1RDUFVEUF9DU1VNOwotCQl9Ci0JCWVsc2UgewotCQkJc2tiLT5oLnRoLT5jaGVjayA9Ci0JCQkJfmNzdW1fdGNwdWRwX21hZ2ljKHNrYi0+bmguaXBoLT5zYWRkciwKLQkJCQkJCSAgIHNrYi0+bmguaXBoLT5kYWRkciwKLQkJCQkJCSAgIDAsIElQUFJPVE9fVENQLCAwKTsKLQkJfQorCQl9IGVsc2UKKwkJCXRjcF9oZHIoc2tiKS0+Y2hlY2sgPSB+Y3N1bV90Y3B1ZHBfbWFnaWMoaXBoLT5zYWRkciwKKwkJCQkJCQkJIGlwaC0+ZGFkZHIsIDAsCisJCQkJCQkJCSBJUFBST1RPX1RDUCwKKwkJCQkJCQkJIDApOwogCiAJCWlmICgodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9IV19UU08pIHx8CiAJCSAgICAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDUpKSB7Ci0JCQlpZiAodGNwX29wdF9sZW4gfHwgc2tiLT5uaC5pcGgtPmlobCA+IDUpIHsKKwkJCWlmICh0Y3Bfb3B0X2xlbiB8fCBpcGgtPmlobCA+IDUpIHsKIAkJCQlpbnQgdHNmbGFnczsKIAotCQkJCXRzZmxhZ3MgPSAoKHNrYi0+bmguaXBoLT5paGwgLSA1KSArCi0JCQkJCSAgICh0Y3Bfb3B0X2xlbiA+PiAyKSk7CisJCQkJdHNmbGFncyA9IChpcGgtPmlobCAtIDUpICsgKHRjcF9vcHRfbGVuID4+IDIpOwogCQkJCW1zcyB8PSAodHNmbGFncyA8PCAxMSk7CiAJCQl9CiAJCX0gZWxzZSB7Ci0JCQlpZiAodGNwX29wdF9sZW4gfHwgc2tiLT5uaC5pcGgtPmlobCA+IDUpIHsKKwkJCWlmICh0Y3Bfb3B0X2xlbiB8fCBpcGgtPmlobCA+IDUpIHsKIAkJCQlpbnQgdHNmbGFnczsKIAotCQkJCXRzZmxhZ3MgPSAoKHNrYi0+bmguaXBoLT5paGwgLSA1KSArCi0JCQkJCSAgICh0Y3Bfb3B0X2xlbiA+PiAyKSk7CisJCQkJdHNmbGFncyA9IChpcGgtPmlobCAtIDUpICsgKHRjcF9vcHRfbGVuID4+IDIpOwogCQkJCWJhc2VfZmxhZ3MgfD0gdHNmbGFncyA8PCAxMjsKIAkJCX0KIAkJfQpAQCAtMTA5ODgsMjQgKzEwOTg2LDIwIEBACiAJcmV0dXJuIGVycjsKIH0KIAotI2lmZGVmIENPTkZJR19TUEFSQzY0CisjaWZkZWYgQ09ORklHX1NQQVJDCiBzdGF0aWMgaW50IF9fZGV2aW5pdCB0ZzNfZ2V0X21hY2FkZHJfc3BhcmMoc3RydWN0IHRnMyAqdHApCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHRwLT5kZXY7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0cC0+cGRldjsKLQlzdHJ1Y3QgcGNpZGV2X2Nvb2tpZSAqcGNwID0gcGRldi0+c3lzZGF0YTsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwID0gcGNpX2RldmljZV90b19PRl9ub2RlKHBkZXYpOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmFkZHI7CisJaW50IGxlbjsKIAotCWlmIChwY3AgIT0gTlVMTCkgewotCQl1bnNpZ25lZCBjaGFyICphZGRyOwotCQlpbnQgbGVuOwotCi0JCWFkZHIgPSBvZl9nZXRfcHJvcGVydHkocGNwLT5wcm9tX25vZGUsICJsb2NhbC1tYWMtYWRkcmVzcyIsCi0JCQkJCSZsZW4pOwotCQlpZiAoYWRkciAmJiBsZW4gPT0gNikgewotCQkJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIGFkZHIsIDYpOwotCQkJbWVtY3B5KGRldi0+cGVybV9hZGRyLCBkZXYtPmRldl9hZGRyLCA2KTsKLQkJCXJldHVybiAwOwotCQl9CisJYWRkciA9IG9mX2dldF9wcm9wZXJ0eShkcCwgImxvY2FsLW1hYy1hZGRyZXNzIiwgJmxlbik7CisJaWYgKGFkZHIgJiYgbGVuID09IDYpIHsKKwkJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIGFkZHIsIDYpOworCQltZW1jcHkoZGV2LT5wZXJtX2FkZHIsIGRldi0+ZGV2X2FkZHIsIDYpOworCQlyZXR1cm4gMDsKIAl9CiAJcmV0dXJuIC1FTk9ERVY7CiB9CkBAIC0xMTAyNiw3ICsxMTAyMCw3IEBACiAJdTMyIGhpLCBsbywgbWFjX29mZnNldDsKIAlpbnQgYWRkcl9vayA9IDA7CiAKLSNpZmRlZiBDT05GSUdfU1BBUkM2NAorI2lmZGVmIENPTkZJR19TUEFSQwogCWlmICghdGczX2dldF9tYWNhZGRyX3NwYXJjKHRwKSkKIAkJcmV0dXJuIDA7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3RsYW4uYyBiL2RyaXZlcnMvbmV0L3RsYW4uYwppbmRleCBmODVmMDAyLi4xMDZkYzFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90bGFuLmMKKysrIGIvZHJpdmVycy9uZXQvdGxhbi5jCkBAIC0xMTEyLDcgKzExMTIsNyBAQAogCiAJaWYgKCBiYnVmICkgewogCQl0YWlsX2J1ZmZlciA9IHByaXYtPnR4QnVmZmVyICsgKCBwcml2LT50eFRhaWwgKiBUTEFOX01BWF9GUkFNRV9TSVpFICk7Ci0JCW1lbWNweSggdGFpbF9idWZmZXIsIHNrYi0+ZGF0YSwgc2tiLT5sZW4gKTsKKwkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIHRhaWxfYnVmZmVyLCBza2ItPmxlbik7CiAJfSBlbHNlIHsKIAkJdGFpbF9saXN0LT5idWZmZXJbMF0uYWRkcmVzcyA9IHBjaV9tYXBfc2luZ2xlKHByaXYtPnBjaURldiwgc2tiLT5kYXRhLCBza2ItPmxlbiwgUENJX0RNQV9UT0RFVklDRSk7CiAJCVRMYW5fU3RvcmVTS0IodGFpbF9saXN0LCBza2IpOwpAQCAtMTU3Nyw3ICsxNTc3LDYgQEAKIAkJCQlwcmludGsoS0VSTl9JTkZPICJUTEFOOiBDb3VsZG4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHJlY2VpdmVkIGRhdGEuXG4iKTsKIAkJCWVsc2UgewogCQkJCWhlYWRfYnVmZmVyID0gcHJpdi0+cnhCdWZmZXIgKyAocHJpdi0+cnhIZWFkICogVExBTl9NQVhfRlJBTUVfU0laRSk7Ci0JCQkJc2tiLT5kZXYgPSBkZXY7CiAJCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsKIAkJCQl0ID0gKHZvaWQgKikgc2tiX3B1dChza2IsIGZyYW1lU2l6ZSk7CiAKQEAgLTE2MDgsNyArMTYwNyw2IEBACiAJCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKCBza2IsIGRldiApOwogCQkJCW5ldGlmX3J4KCBza2IgKTsKIAotCQkJCW5ld19za2ItPmRldiA9IGRldjsKIAkJCQlza2JfcmVzZXJ2ZSggbmV3X3NrYiwgMiApOwogCQkJCXQgPSAodm9pZCAqKSBza2JfcHV0KCBuZXdfc2tiLCBUTEFOX01BWF9GUkFNRV9TSVpFICk7CiAJCQkJaGVhZF9saXN0LT5idWZmZXJbMF0uYWRkcmVzcyA9IHBjaV9tYXBfc2luZ2xlKHByaXYtPnBjaURldiwgbmV3X3NrYi0+ZGF0YSwgVExBTl9NQVhfRlJBTUVfU0laRSwgUENJX0RNQV9GUk9NREVWSUNFKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3Rva2VucmluZy8zYzM1OS5jIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nLzNjMzU5LmMKaW5kZXggNzU4MGJkZS4uZTIyYTNmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdG9rZW5yaW5nLzNjMzU5LmMKKysrIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nLzNjMzU5LmMKQEAgLTkzMywyMCArOTMzLDIxIEBACiAJCQkJcmV0dXJuIDsgCQkJCQogCQkJfQogCQotCQkJc2tiLT5kZXYgPSBkZXYgOyAKLQogCQkJd2hpbGUgKHhsX3ByaXYtPnJ4X3JpbmdfdGFpbCAhPSB0ZW1wX3JpbmdfbG9jKSB7IAogCQkJCWNvcHlfbGVuID0geGxfcHJpdi0+eGxfcnhfcmluZ1t4bF9wcml2LT5yeF9yaW5nX3RhaWxdLnVwZnJhZ2xlbiAmIDB4N0ZGRiA7IAogCQkJCWZyYW1lX2xlbmd0aCAtPSBjb3B5X2xlbiA7ICAKIAkJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoeGxfcHJpdi0+cGRldix4bF9wcml2LT54bF9yeF9yaW5nW3hsX3ByaXYtPnJ4X3JpbmdfdGFpbF0udXBmcmFnYWRkcix4bF9wcml2LT5wa3RfYnVmX3N6LFBDSV9ETUFfRlJPTURFVklDRSkgOwotCQkJCW1lbWNweShza2JfcHV0KHNrYixjb3B5X2xlbiksIHhsX3ByaXYtPnJ4X3Jpbmdfc2tiW3hsX3ByaXYtPnJ4X3JpbmdfdGFpbF0tPmRhdGEsIGNvcHlfbGVuKSA7IAorCQkJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoeGxfcHJpdi0+cnhfcmluZ19za2JbeGxfcHJpdi0+cnhfcmluZ190YWlsXSwKKwkJCQkJCQkgIHNrYl9wdXQoc2tiLCBjb3B5X2xlbiksCisJCQkJCQkJICBjb3B5X2xlbik7CiAJCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHhsX3ByaXYtPnBkZXYseGxfcHJpdi0+eGxfcnhfcmluZ1t4bF9wcml2LT5yeF9yaW5nX3RhaWxdLnVwZnJhZ2FkZHIseGxfcHJpdi0+cGt0X2J1Zl9zeixQQ0lfRE1BX0ZST01ERVZJQ0UpIDsKIAkJCQlhZHZfcnhfcmluZyhkZXYpIDsgCiAJCQl9IAogCiAJCQkvKiBOb3cgd2UgaGF2ZSBmb3VuZCB0aGUgbGFzdCBmcmFnbWVudCAqLwogCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KHhsX3ByaXYtPnBkZXYseGxfcHJpdi0+eGxfcnhfcmluZ1t4bF9wcml2LT5yeF9yaW5nX3RhaWxdLnVwZnJhZ2FkZHIseGxfcHJpdi0+cGt0X2J1Zl9zeixQQ0lfRE1BX0ZST01ERVZJQ0UpIDsKLQkJCW1lbWNweShza2JfcHV0KHNrYixjb3B5X2xlbiksIHhsX3ByaXYtPnJ4X3Jpbmdfc2tiW3hsX3ByaXYtPnJ4X3JpbmdfdGFpbF0tPmRhdGEsIGZyYW1lX2xlbmd0aCkgOyAKKwkJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoeGxfcHJpdi0+cnhfcmluZ19za2JbeGxfcHJpdi0+cnhfcmluZ190YWlsXSwKKwkJCQkgICAgICBza2JfcHV0KHNrYixjb3B5X2xlbiksIGZyYW1lX2xlbmd0aCk7CiAvKgkJCW1lbWNweShza2JfcHV0KHNrYixmcmFtZV9sZW5ndGgpLCBidXNfdG9fdmlydCh4bF9wcml2LT54bF9yeF9yaW5nW3hsX3ByaXYtPnJ4X3JpbmdfdGFpbF0udXBmcmFnYWRkciksIGZyYW1lX2xlbmd0aCkgOyAqLwogCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHhsX3ByaXYtPnBkZXYseGxfcHJpdi0+eGxfcnhfcmluZ1t4bF9wcml2LT5yeF9yaW5nX3RhaWxdLnVwZnJhZ2FkZHIseGxfcHJpdi0+cGt0X2J1Zl9zeixQQ0lfRE1BX0ZST01ERVZJQ0UpIDsKIAkJCWFkdl9yeF9yaW5nKGRldikgOyAKQEAgLTk2Nyw4ICs5NjgsNiBAQAogCQkJCXJldHVybiA7IAogCQkJfQogCi0JCQlza2ItPmRldiA9IGRldiA7IAotCiAJCQlza2IyID0geGxfcHJpdi0+cnhfcmluZ19za2JbeGxfcHJpdi0+cnhfcmluZ190YWlsXSA7IAogCQkJcGNpX3VubWFwX3NpbmdsZSh4bF9wcml2LT5wZGV2LCB4bF9wcml2LT54bF9yeF9yaW5nW3hsX3ByaXYtPnJ4X3JpbmdfdGFpbF0udXBmcmFnYWRkciwgeGxfcHJpdi0+cGt0X2J1Zl9zeixQQ0lfRE1BX0ZST01ERVZJQ0UpIDsgCiAJCQlza2JfcHV0KHNrYjIsIGZyYW1lX2xlbmd0aCkgOyAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3Rva2VucmluZy9pYm10ci5jIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL2libXRyLmMKaW5kZXggMDFkNTUzMS4uMWU4OTU4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdG9rZW5yaW5nL2libXRyLmMKKysrIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL2libXRyLmMKQEAgLTE3NzEsNyArMTc3MSw2IEBACiAJLypCTVMgYWdhaW4sIGlmIHNoZSBjb21lcyBpbiB3aXRoIGZldyBidXQgbGVhdmVzIHdpdGggbWFueSAqLwogCXNrYl9yZXNlcnZlKHNrYiwgc2l6ZW9mKHN0cnVjdCB0cmhfaGRyKSAtIGxhbl9oZHJfbGVuKTsKIAlza2JfcHV0KHNrYiwgbGVuZ3RoKTsKLQlza2ItPmRldiA9IGRldjsKIAlkYXRhID0gc2tiLT5kYXRhOwogCXJidWZmZXJfbGVuID0gbnRvaHMocmVhZHcocmJ1ZiArIG9mZnNldG9mKHN0cnVjdCByZWNfYnVmLCBidWZfbGVuKSkpOwogCXJidWZkYXRhID0gcmJ1ZiArIG9mZnNldG9mKHN0cnVjdCByZWNfYnVmLCBkYXRhKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3Rva2VucmluZy9sYW5zdHJlYW1lci5jIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL2xhbnN0cmVhbWVyLmMKaW5kZXggZTk5OWZlYi4uNWQ4NDljMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdG9rZW5yaW5nL2xhbnN0cmVhbWVyLmMKKysrIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL2xhbnN0cmVhbWVyLmMKQEAgLTk0NCw4ICs5NDQsNiBAQAogCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBOb3QgZW5vdWdoIG1lbW9yeSB0byBjb3B5IHBhY2tldCB0byB1cHBlciBsYXllcnMuIFxuIiwJZGV2LT5uYW1lKTsKIAkJCQlzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9zdGF0cy5yeF9kcm9wcGVkKys7CiAJCQl9IGVsc2UgewkvKiB3ZSBhbGxvY2F0ZWQgYW4gc2tiIE9LICovCi0JCQkJc2tiLT5kZXYgPSBkZXY7Ci0KIAkJCQlpZiAoYnVmZmVyX2NudCA9PSAxKSB7CiAJCQkJCS8qIHJlbGVhc2UgdGhlIERNQSBtYXBwaW5nICovCiAJCQkJCXBjaV91bm1hcF9zaW5nbGUoc3RyZWFtZXJfcHJpdi0+cGNpX2RldiwgCkBAIC0xNjA3LDEwICsxNjA1LDExIEBACiAJCQkJICAgICAgZnJhbWVfZGF0YSwgYnVmZmVyX2xlbik7CiAJCX0gd2hpbGUgKG5leHRfcHRyICYmIChidWZmX29mZiA9IG5leHRfcHRyKSk7CiAKKwkJbWFjX2ZyYW1lLT5wcm90b2NvbCA9IHRyX3R5cGVfdHJhbnMobWFjX2ZyYW1lLCBkZXYpOwogI2lmIFNUUkVBTUVSX05FVFdPUktfTU9OSVRPUgogCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUmVjZWl2ZWQgTUFDIEZyYW1lLCBkZXRhaWxzOiBcbiIsCiAJCSAgICAgICBkZXYtPm5hbWUpOwotCQltYWNfaGRyID0gKHN0cnVjdCB0cmhfaGRyICopIG1hY19mcmFtZS0+ZGF0YTsKKwkJbWFjX2hkciA9IHRyX2hkcihtYWNfZnJhbWUpOwogCQlwcmludGsoS0VSTl9XQVJOSU5HCiAJCSAgICAgICAiJXM6IE1BQyBGcmFtZSBEZXN0LiBBZGRyOiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCBcbiIsCiAJCSAgICAgICBkZXYtPm5hbWUsIG1hY19oZHItPmRhZGRyWzBdLCBtYWNfaGRyLT5kYWRkclsxXSwKQEAgLTE2MjIsOCArMTYyMSw2IEBACiAJCSAgICAgICBtYWNfaGRyLT5zYWRkclsyXSwgbWFjX2hkci0+c2FkZHJbM10sCiAJCSAgICAgICBtYWNfaGRyLT5zYWRkcls0XSwgbWFjX2hkci0+c2FkZHJbNV0pOwogI2VuZGlmCi0JCW1hY19mcmFtZS0+ZGV2ID0gZGV2OwotCQltYWNfZnJhbWUtPnByb3RvY29sID0gdHJfdHlwZV90cmFucyhtYWNfZnJhbWUsIGRldik7CiAJCW5ldGlmX3J4KG1hY19mcmFtZSk7CiAKIAkJLyogTm93IHRlbGwgdGhlIGNhcmQgd2UgaGF2ZSBkZWFsdCB3aXRoIHRoZSByZWNlaXZlZCBmcmFtZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdG9rZW5yaW5nL29seW1waWMuYyBiL2RyaXZlcnMvbmV0L3Rva2VucmluZy9vbHltcGljLmMKaW5kZXggOGY0ZWNjMS4uMDliM2NmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdG9rZW5yaW5nL29seW1waWMuYworKysgYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvb2x5bXBpYy5jCkBAIC04MTQsOCArODE0LDYgQEAKIAkJCQkJb2x5bXBpY19wcml2LT5yeF9yaW5nX2xhc3RfcmVjZWl2ZWQgKz0gaSA7IAogCQkJCQlvbHltcGljX3ByaXYtPnJ4X3JpbmdfbGFzdF9yZWNlaXZlZCAmPSAoT0xZTVBJQ19SWF9SSU5HX1NJWkUgLTEpIDsgIAogCQkJCX0gZWxzZSAgewotCQkJCQlza2ItPmRldiA9IGRldiA7IAotCiAJCQkJCS8qIE9wdGltaXNlIGJhc2VkIHVwb24gbnVtYmVyIG9mIGJ1ZmZlcnMgdXNlZC4gCiAJCQkgICAJICAgCSAgIElmIG9ubHkgb25lIGJ1ZmZlciBpcyB1c2VkIHdlIGNhbiBzaW1wbHkgc3dhcCB0aGUgYnVmZmVycyBhcm91bmQuCiAJCQkgICAJICAgCSAgIElmIG1vcmUgdGhhbiBvbmUgdGhlbiB3ZSBtdXN0IHVzZSB0aGUgbmV3IGJ1ZmZlciBhbmQgY29weSB0aGUgaW5mb3JtYXRpb24KQEAgLTg0Nyw3ICs4NDUsOSBAQAogCQkJCQkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdShvbHltcGljX3ByaXYtPnBkZXYsCiAJCQkJCQkJCWxlMzJfdG9fY3B1KG9seW1waWNfcHJpdi0+b2x5bXBpY19yeF9yaW5nW3J4X3JpbmdfbGFzdF9yZWNlaXZlZF0uYnVmZmVyKSwKIAkJCQkJCQkJb2x5bXBpY19wcml2LT5wa3RfYnVmX3N6LFBDSV9ETUFfRlJPTURFVklDRSkgOyAKLQkJCQkJCQltZW1jcHkoc2tiX3B1dChza2IsbGVuZ3RoLTQpLG9seW1waWNfcHJpdi0+cnhfcmluZ19za2JbcnhfcmluZ19sYXN0X3JlY2VpdmVkXS0+ZGF0YSxsZW5ndGgtNCkgOyAKKwkJCQkJCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKG9seW1waWNfcHJpdi0+cnhfcmluZ19za2JbcnhfcmluZ19sYXN0X3JlY2VpdmVkXSwKKwkJCQkJCQkJICAgICAgc2tiX3B1dChza2IsbGVuZ3RoIC0gNCksCisJCQkJCQkJCSAgICAgIGxlbmd0aCAtIDQpOwogCQkJCQkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShvbHltcGljX3ByaXYtPnBkZXYsCiAJCQkJCQkJCWxlMzJfdG9fY3B1KG9seW1waWNfcHJpdi0+b2x5bXBpY19yeF9yaW5nW3J4X3JpbmdfbGFzdF9yZWNlaXZlZF0uYnVmZmVyKSwKIAkJCQkJCQkJb2x5bXBpY19wcml2LT5wa3RfYnVmX3N6LFBDSV9ETUFfRlJPTURFVklDRSkgOwpAQCAtODY0LDcgKzg2NCw5IEBACiAJCQkJCQkJCW9seW1waWNfcHJpdi0+cGt0X2J1Zl9zeixQQ0lfRE1BX0ZST01ERVZJQ0UpIDsgCiAJCQkJCQkJcnhfZGVzYyA9ICYob2x5bXBpY19wcml2LT5vbHltcGljX3J4X3JpbmdbcnhfcmluZ19sYXN0X3JlY2VpdmVkXSk7CiAJCQkJCQkJY3B5X2xlbmd0aCA9IChpID09IDEgPyBmcmFnX2xlbiA6IGxlMzJfdG9fY3B1KHJ4X2Rlc2MtPnJlc19sZW5ndGgpKTsgCi0JCQkJCQkJbWVtY3B5KHNrYl9wdXQoc2tiLCBjcHlfbGVuZ3RoKSwgb2x5bXBpY19wcml2LT5yeF9yaW5nX3NrYltyeF9yaW5nX2xhc3RfcmVjZWl2ZWRdLT5kYXRhLCBjcHlfbGVuZ3RoKSA7CisJCQkJCQkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShvbHltcGljX3ByaXYtPnJ4X3Jpbmdfc2tiW3J4X3JpbmdfbGFzdF9yZWNlaXZlZF0sCisJCQkJCQkJCSAgICAgIHNrYl9wdXQoc2tiLCBjcHlfbGVuZ3RoKSwKKwkJCQkJCQkJICAgICAgY3B5X2xlbmd0aCk7CiAJCQkJCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKG9seW1waWNfcHJpdi0+cGRldiwKIAkJCQkJCQkJbGUzMl90b19jcHUob2x5bXBpY19wcml2LT5vbHltcGljX3J4X3JpbmdbcnhfcmluZ19sYXN0X3JlY2VpdmVkXS5idWZmZXIpLAogCQkJCQkJCQlvbHltcGljX3ByaXYtPnBrdF9idWZfc3osUENJX0RNQV9GUk9NREVWSUNFKSA7CkBAIC0xNDQwLDE2ICsxNDQyLDE2IEBACiAJCQluZXh0X3B0cj1yZWFkdyhidWZfcHRyK29mZnNldG9mKHN0cnVjdCBtYWNfcmVjZWl2ZV9idWZmZXIsbmV4dCkpOyAKIAkJfSB3aGlsZSAobmV4dF9wdHIgJiYgKGJ1Zl9wdHI9b2x5bXBpY19wcml2LT5vbHltcGljX2xhcCArIG50b2hzKG5leHRfcHRyKSkpOwogCisJCW1hY19mcmFtZS0+cHJvdG9jb2wgPSB0cl90eXBlX3RyYW5zKG1hY19mcmFtZSwgZGV2KTsKKwogCQlpZiAob2x5bXBpY19wcml2LT5vbHltcGljX25ldHdvcmtfbW9uaXRvcikgeyAKIAkJCXN0cnVjdCB0cmhfaGRyICptYWNfaGRyIDsgCiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUmVjZWl2ZWQgTUFDIEZyYW1lLCBkZXRhaWxzOiBcbiIsZGV2LT5uYW1lKSA7Ci0JCQltYWNfaGRyID0gKHN0cnVjdCB0cmhfaGRyICopbWFjX2ZyYW1lLT5kYXRhIDsgCisJCQltYWNfaGRyID0gdHJfaGRyKG1hY19mcmFtZSk7CiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogTUFDIEZyYW1lIERlc3QuIEFkZHI6ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IFxuIiwgZGV2LT5uYW1lICwgbWFjX2hkci0+ZGFkZHJbMF0sIG1hY19oZHItPmRhZGRyWzFdLCBtYWNfaGRyLT5kYWRkclsyXSwgbWFjX2hkci0+ZGFkZHJbM10sIG1hY19oZHItPmRhZGRyWzRdLCBtYWNfaGRyLT5kYWRkcls1XSkgOyAKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBNQUMgRnJhbWUgU3JjZS4gQWRkcjogJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggXG4iLCBkZXYtPm5hbWUgLCBtYWNfaGRyLT5zYWRkclswXSwgbWFjX2hkci0+c2FkZHJbMV0sIG1hY19oZHItPnNhZGRyWzJdLCBtYWNfaGRyLT5zYWRkclszXSwgbWFjX2hkci0+c2FkZHJbNF0sIG1hY19oZHItPnNhZGRyWzVdKSA7IAogCQl9Ci0JCW1hY19mcmFtZS0+ZGV2ID0gZGV2IDsgCi0JCW1hY19mcmFtZS0+cHJvdG9jb2wgPSB0cl90eXBlX3RyYW5zKG1hY19mcmFtZSxkZXYpOwotCQluZXRpZl9yeChtYWNfZnJhbWUpIDsgCQorCQluZXRpZl9yeChtYWNfZnJhbWUpOwogCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOwogCiBkcm9wX2ZyYW1lOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdG9rZW5yaW5nL3NtY3RyLmMgYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvc21jdHIuYwppbmRleCBjZWMyODJhLi45YmJlYTVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90b2tlbnJpbmcvc21jdHIuYworKysgYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvc21jdHIuYwpAQCAtMzg4OSwxNCArMzg4OSwxMyBAQAogCiAgICAgICAgICAgICAgICAgLyogU2xpZGUgZGF0YSBpbnRvIGEgc2xlZWsgc2tiLiAqLwogICAgICAgICAgICAgICAgIHNrYl9wdXQoc2tiLCBza2ItPmxlbik7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KHNrYi0+ZGF0YSwgcm1mLCBza2ItPmxlbik7CisgICAgICAgICAgICAgICAgc2tiX2NvcHlfdG9fbGluZWFyX2RhdGEoc2tiLCBybWYsIHNrYi0+bGVuKTsKIAogICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBDb3VudGVycyAqLwogICAgICAgICAgICAgICAgIHRwLT5NYWNTdGF0LnJ4X3BhY2tldHMrKzsKICAgICAgICAgICAgICAgICB0cC0+TWFjU3RhdC5yeF9ieXRlcyArPSBza2ItPmxlbjsKIAogICAgICAgICAgICAgICAgIC8qIEtpY2sgdGhlIHBhY2tldCBvbiB1cC4gKi8KLSAgICAgICAgICAgICAgICBza2ItPmRldiA9IGRldjsKICAgICAgICAgICAgICAgICBza2ItPnByb3RvY29sID0gdHJfdHlwZV90cmFucyhza2IsIGRldik7CiAgICAgICAgICAgICAgICAgbmV0aWZfcngoc2tiKTsKIAkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKQEAgLTQ0NzYsMTQgKzQ0NzUsMTMgQEAKIAkJCQlpZiAoc2tiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlza2JfcHV0KHNrYiwgcnhfc2l6ZSk7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCW1lbWNweShza2ItPmRhdGEsIHBidWZmLCByeF9zaXplKTsKKwkJCQkJc2tiX2NvcHlfdG9fbGluZWFyX2RhdGEoc2tiLCBwYnVmZiwgcnhfc2l6ZSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCS8qIFVwZGF0ZSBDb3VudGVycyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJdHAtPk1hY1N0YXQucnhfcGFja2V0cysrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJdHAtPk1hY1N0YXQucnhfYnl0ZXMgKz0gc2tiLT5sZW47CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCS8qIEtpY2sgdGhlIHBhY2tldCBvbiB1cC4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCXNrYi0+ZGV2ID0gZGV2OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJc2tiLT5wcm90b2NvbCA9IHRyX3R5cGVfdHJhbnMoc2tiLCBkZXYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJbmV0aWZfcngoc2tiKTsKIAkJCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3Rva2VucmluZy90bXMzODB0ci5jIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL3RtczM4MHRyLmMKaW5kZXggZWE3OTdjYS4uMTJiZDI5NDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3Rva2VucmluZy90bXMzODB0ci5jCisrKyBiL2RyaXZlcnMvbmV0L3Rva2VucmluZy90bXMzODB0ci5jCkBAIC02NDQsNyArNjQ0LDcgQEAKIAkJZG1hYnVmICA9IDA7CiAJCWkgCT0gdHAtPlRwbEZyZWUtPlRQTEluZGV4OwogCQlidWYgCT0gdHAtPkxvY2FsVHhCdWZmZXJzW2ldOwotCQltZW1jcHkoYnVmLCBza2ItPmRhdGEsIGxlbmd0aCk7CisJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCBidWYsIGxlbmd0aCk7CiAJCW5ld2J1ZiAJPSAoKGNoYXIgKilidWYgLSAoY2hhciAqKXRwKSArIHRwLT5kbWFidWZmZXI7CiAJfQogCWVsc2UgewpAQCAtMjE2OCw3ICsyMTY4LDYgQEAKIAkJCQl9CiAJCQkJZWxzZQogCQkJCXsKLQkJCQkJc2tiLT5kZXYJPSBkZXY7CiAJCQkJCXNrYl9wdXQoc2tiLCB0cC0+TWF4UGFja2V0U2l6ZSk7CiAJCQkJCXJwbC0+U2tiU3RhdCAJPSBTS0JfREFUQV9DT1BZOwogCQkJCQlSZWNlaXZlRGF0YVB0ciAJPSBycGwtPk1EYXRhOwpAQCAtMjE3OSw3ICsyMTc4LDggQEAKIAkJCQl8fCBycGwtPlNrYlN0YXQgPT0gU0tCX0RNQV9ESVJFQ1QpKQogCQkJewogCQkJCWlmKHJwbC0+U2tiU3RhdCA9PSBTS0JfREFUQV9DT1BZKQotCQkJCQltZW1jcHkoc2tiLT5kYXRhLCBSZWNlaXZlRGF0YVB0ciwgTGVuZ3RoKTsKKwkJCQkJc2tiX2NvcHlfdG9fbGluZWFyX2RhdGEoc2tiLCBSZWNlaXZlRGF0YVB0ciwKKwkJCQkJCSAgICAgICBMZW5ndGgpOwogCiAJCQkJLyogRGVsaXZlciBmcmFtZSB0byBzeXN0ZW0gKi8KIAkJCQlycGwtPlNrYiA9IE5VTEw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90c2kxMDhfZXRoLmMgYi9kcml2ZXJzL25ldC90c2kxMDhfZXRoLmMKaW5kZXggZDkyYzVjNS4uMGJmYzJjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdHNpMTA4X2V0aC5jCisrKyBiL2RyaXZlcnMvbmV0L3RzaTEwOF9ldGguYwpAQCAtNzg4LDcgKzc4OCw2IEBACiAJCQlwcmludGsoIi5cbiIpOwogCQl9CiAKLQkJc2tiLT5kZXYgPSBkZXY7CiAJCXNrYl9wdXQoc2tiLCBkYXRhLT5yeHJpbmdbcnhdLmxlbik7CiAJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CiAJCW5ldGlmX3JlY2VpdmVfc2tiKHNrYik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90dWxpcC9kZTIxMDR4LmMgYi9kcml2ZXJzL25ldC90dWxpcC9kZTIxMDR4LmMKaW5kZXggYzgyYmVmYS4uODYxNzI5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdHVsaXAvZGUyMTA0eC5jCisrKyBiL2RyaXZlcnMvbmV0L3R1bGlwL2RlMjEwNHguYwpAQCAtNjMsNyArNjMsNyBAQAogCiAvKiBTZXQgdGhlIGNvcHkgYnJlYWtwb2ludCBmb3IgdGhlIGNvcHktb25seS10aW55LWJ1ZmZlciBSeCBzdHJ1Y3R1cmUuICovCiAjaWYgZGVmaW5lZChfX2FscGhhX18pIHx8IGRlZmluZWQoX19hcm1fXykgfHwgZGVmaW5lZChfX2hwcGFfXykgXAotICAgICAgICB8fCBkZWZpbmVkKF9fc3BhcmNfXykgfHwgZGVmaW5lZChfX2lhNjRfXykgXAorICAgICAgICB8fCBkZWZpbmVkKENPTkZJR19TUEFSQykgfHwgZGVmaW5lZChfX2lhNjRfXykgXAogICAgICAgICB8fCBkZWZpbmVkKF9fc2hfXykgfHwgZGVmaW5lZChfX21pcHNfXykKIHN0YXRpYyBpbnQgcnhfY29weWJyZWFrID0gMTUxODsKICNlbHNlCkBAIC00MzUsNyArNDM1LDYgQEAKIAkJCXJ4X3dvcmsgPSAxMDA7CiAJCQlnb3RvIHJ4X25leHQ7CiAJCX0KLQkJY29weV9za2ItPmRldiA9IGRlLT5kZXY7CiAKIAkJaWYgKCFjb3B5aW5nX3NrYikgewogCQkJcGNpX3VubWFwX3NpbmdsZShkZS0+cGRldiwgbWFwcGluZywKQEAgLTQ1MCw4ICs0NDksOCBAQAogCQl9IGVsc2UgewogCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KGRlLT5wZGV2LCBtYXBwaW5nLCBsZW4sIFBDSV9ETUFfRlJPTURFVklDRSk7CiAJCQlza2JfcmVzZXJ2ZShjb3B5X3NrYiwgUlhfT0ZGU0VUKTsKLQkJCW1lbWNweShza2JfcHV0KGNvcHlfc2tiLCBsZW4pLCBza2ItPmRhdGEsIGxlbik7Ci0KKwkJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCBza2JfcHV0KGNvcHlfc2tiLCBsZW4pLAorCQkJCQkJICBsZW4pOwogCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKGRlLT5wZGV2LCBtYXBwaW5nLCBsZW4sIFBDSV9ETUFfRlJPTURFVklDRSk7CiAKIAkJCS8qIFdlJ2xsIHJldXNlIHRoZSBvcmlnaW5hbCByaW5nIGJ1ZmZlci4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R1bGlwL2RlNHg1LmMgYi9kcml2ZXJzL25ldC90dWxpcC9kZTR4NS5jCmluZGV4IDRiM2NkM2QuLjYyMTQzZjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3R1bGlwL2RlNHg1LmMKKysrIGIvZHJpdmVycy9uZXQvdHVsaXAvZGU0eDUuYwpAQCAtMTE2MCw3ICsxMTYwLDcgQEAKIAlzcHJpbnRmKGxwLT5hZGFwdGVyX25hbWUsIiVzICglcykiLCBuYW1lLCBnZW5kZXYtPmJ1c19pZCk7CiAKIAlscC0+ZG1hX3NpemUgPSAoTlVNX1JYX0RFU0MgKyBOVU1fVFhfREVTQykgKiBzaXplb2Yoc3RydWN0IGRlNHg1X2Rlc2MpOwotI2lmIGRlZmluZWQoX19hbHBoYV9fKSB8fCBkZWZpbmVkKF9fcG93ZXJwY19fKSB8fCBkZWZpbmVkKF9fc3BhcmNfdjlfXykgfHwgZGVmaW5lZChERTRYNV9ET19NRU1DUFkpCisjaWYgZGVmaW5lZChfX2FscGhhX18pIHx8IGRlZmluZWQoX19wb3dlcnBjX18pIHx8IGRlZmluZWQoQ09ORklHX1NQQVJDKSB8fCBkZWZpbmVkKERFNFg1X0RPX01FTUNQWSkKIAlscC0+ZG1hX3NpemUgKz0gUlhfQlVGRl9TWiAqIE5VTV9SWF9ERVNDICsgREU0WDVfQUxJR047CiAjZW5kaWYKIAlscC0+cnhfcmluZyA9IGRtYV9hbGxvY19jb2hlcmVudChnZW5kZXYsIGxwLT5kbWFfc2l6ZSwKQEAgLTExNzUsNyArMTE3NSw3IEBACiAJKiogU2V0IHVwIHRoZSBSWCBkZXNjcmlwdG9yIHJpbmcgKEludGVscykKIAkqKiBBbGxvY2F0ZSBjb250aWd1b3VzIHJlY2VpdmUgYnVmZmVycywgbG9uZyB3b3JkIGFsaWduZWQgKEFscGhhcykKIAkqLwotI2lmICFkZWZpbmVkKF9fYWxwaGFfXykgJiYgIWRlZmluZWQoX19wb3dlcnBjX18pICYmICFkZWZpbmVkKF9fc3BhcmNfdjlfXykgJiYgIWRlZmluZWQoREU0WDVfRE9fTUVNQ1BZKQorI2lmICFkZWZpbmVkKF9fYWxwaGFfXykgJiYgIWRlZmluZWQoX19wb3dlcnBjX18pICYmICFkZWZpbmVkKENPTkZJR19TUEFSQykgJiYgIWRlZmluZWQoREU0WDVfRE9fTUVNQ1BZKQogCWZvciAoaT0wOyBpPE5VTV9SWF9ERVNDOyBpKyspIHsKIAkgICAgbHAtPnJ4X3JpbmdbaV0uc3RhdHVzID0gMDsKIAkgICAgbHAtPnJ4X3JpbmdbaV0uZGVzMSA9IGNwdV90b19sZTMyKFJYX0JVRkZfU1opOwpAQCAtMTI1MiwxMSArMTI1Miw3IEBACiAJICAgIG1paV9nZXRfcGh5KGRldik7CiAJfQogCi0jaWZuZGVmIF9fc3BhcmNfdjlfXwogCXByaW50aygiICAgICAgYW5kIHJlcXVpcmVzIElSUSVkIChwcm92aWRlZCBieSAlcykuXG4iLCBkZXYtPmlycSwKLSNlbHNlCi0JcHJpbnRrKCIgICAgICBhbmQgcmVxdWlyZXMgSVJRJXggKHByb3ZpZGVkIGJ5ICVzKS5cbiIsIGRldi0+aXJxLAotI2VuZGlmCiAJICAgICAgICgobHAtPmJ1cyA9PSBQQ0kpID8gIlBDSSBCSU9TIiA6ICJFSVNBIENORkciKSk7CiAgICAgfQogCkBAIC0zNjI3LDE0ICszNjIzLDEzIEBACiAgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKICAgICBzdHJ1Y3Qgc2tfYnVmZiAqcDsKIAotI2lmICFkZWZpbmVkKF9fYWxwaGFfXykgJiYgIWRlZmluZWQoX19wb3dlcnBjX18pICYmICFkZWZpbmVkKF9fc3BhcmNfdjlfXykgJiYgIWRlZmluZWQoREU0WDVfRE9fTUVNQ1BZKQorI2lmICFkZWZpbmVkKF9fYWxwaGFfXykgJiYgIWRlZmluZWQoX19wb3dlcnBjX18pICYmICFkZWZpbmVkKENPTkZJR19TUEFSQykgJiYgIWRlZmluZWQoREU0WDVfRE9fTUVNQ1BZKQogICAgIHN0cnVjdCBza19idWZmICpyZXQ7CiAgICAgdV9sb25nIGk9MCwgdG1wOwogCiAgICAgcCA9IGRldl9hbGxvY19za2IoSUVFRTgwMl8zX1NaICsgREU0WDVfQUxJR04gKyAyKTsKICAgICBpZiAoIXApIHJldHVybiBOVUxMOwogCi0gICAgcC0+ZGV2ID0gZGV2OwogICAgIHRtcCA9IHZpcnRfdG9fYnVzKHAtPmRhdGEpOwogICAgIGkgPSAoKHRtcCArIERFNFg1X0FMSUdOKSAmIH5ERTRYNV9BTElHTikgLSB0bXA7CiAgICAgc2tiX3Jlc2VydmUocCwgaSk7CkBAIC0zNjU1LDcgKzM2NTAsNiBAQAogICAgIHAgPSBkZXZfYWxsb2Nfc2tiKGxlbiArIDIpOwogICAgIGlmICghcCkgcmV0dXJuIE5VTEw7CiAKLSAgICBwLT5kZXYgPSBkZXY7CiAgICAgc2tiX3Jlc2VydmUocCwgMik7CSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBbGlnbiAqLwogICAgIGlmIChpbmRleCA8IGxwLT5yeF9vbGQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdyYXBwZWQgYnVmZmVyICovCiAJc2hvcnQgdGxlbiA9IChscC0+cnhSaW5nU2l6ZSAtIGxwLT5yeF9vbGQpICogUlhfQlVGRl9TWjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R1bGlwL2RtZmUuYyBiL2RyaXZlcnMvbmV0L3R1bGlwL2RtZmUuYwppbmRleCA5YWVhYzc2Li40ZWQ2N2ZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90dWxpcC9kbWZlLmMKKysrIGIvZHJpdmVycy9uZXQvdHVsaXAvZG1mZS5jCkBAIC01NSw5ICs1NSw2IEBACiAKICAgICBUT0RPCiAKLSAgICBJbXBsZW1lbnQgcGNpX2RyaXZlcjo6c3VzcGVuZCgpIGFuZCBwY2lfZHJpdmVyOjpyZXN1bWUoKQotICAgIHBvd2VyIG1hbmFnZW1lbnQgbWV0aG9kcy4KLQogICAgIENoZWNrIG9uIDY0IGJpdCBib3hlcy4KICAgICBDaGVjayBhbmQgZml4IG9uIGJpZyBlbmRpYW4gYm94ZXMuCiAKQEAgLTEyNSw2ICsxMjIsMTEgQEAKICNkZWZpbmUgRE05ODAxX05PSVNFX0ZMT09SIDgKICNkZWZpbmUgRE05ODAyX05PSVNFX0ZMT09SIDUKIAorI2RlZmluZSBETUZFX1dPTF9MSU5LQ0hBTkdFCTB4MjAwMDAwMDAKKyNkZWZpbmUgRE1GRV9XT0xfU0FNUExFUEFDS0VUCTB4MTAwMDAwMDAKKyNkZWZpbmUgRE1GRV9XT0xfTUFHSUNQQUNLRVQJMHgwODAwMDAwMAorCisKICNkZWZpbmUgRE1GRV8xME1IRiAgICAgIDAKICNkZWZpbmUgRE1GRV8xMDBNSEYgICAgIDEKICNkZWZpbmUgRE1GRV8xME1GRCAgICAgIDQKQEAgLTI1MSw2ICsyNTMsNyBAQAogCXU4IHdhaXRfcmVzZXQ7CQkJLyogSGFyZHdhcmUgZmFpbGVkLCBuZWVkIHRvIHJlc2V0ICovCiAJdTggZG05MTB4X2Noa19tb2RlOwkJLyogT3BlcmF0aW5nIG1vZGUgY2hlY2sgKi8KIAl1OCBmaXJzdF9pbl9jYWxsYmFjazsJCS8qIEZsYWcgdG8gcmVjb3JkIHN0YXRlICovCisJdTggd29sX21vZGU7CQkJLyogdXNlciBXT0wgc2V0dGluZ3MgKi8KIAlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKIAogCS8qIFN5c3RlbSBkZWZpbmVkIHN0YXRpc3RpYyBjb3VudGVyICovCkBAIC00MzEsNiArNDM0LDcgQEAKIAlkYi0+Y2hpcF9pZCA9IGVudC0+ZHJpdmVyX2RhdGE7CiAJZGItPmlvYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKIAlkYi0+Y2hpcF9yZXZpc2lvbiA9IGRldl9yZXY7CisJZGItPndvbF9tb2RlID0gMDsKIAogCWRiLT5wZGV2ID0gcGRldjsKIApAQCAtNjgyLDcgKzY4Niw3IEBACiAKIAkvKiB0cmFuc21pdCB0aGlzIHBhY2tldCAqLwogCXR4cHRyID0gZGItPnR4X2luc2VydF9wdHI7Ci0JbWVtY3B5KHR4cHRyLT50eF9idWZfcHRyLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgdHhwdHItPnR4X2J1Zl9wdHIsIHNrYi0+bGVuKTsKIAl0eHB0ci0+dGRlczEgPSBjcHVfdG9fbGUzMigweGUxMDAwMDAwIHwgc2tiLT5sZW4pOwogCiAJLyogUG9pbnQgdG8gbmV4dCB0cmFuc21pdCBmcmVlIGRlc2NyaXB0b3IgKi8KQEAgLTk4OCwxNCArOTkyLDE0IEBACiAKIAkJCQkJCXNrYiA9IG5ld3NrYjsKIAkJCQkJCS8qIHNpemUgbGVzcyB0aGFuIENPUFlfU0laRSwgYWxsb2NhdGUgYSByeGxlbiBTS0IgKi8KLQkJCQkJCXNrYi0+ZGV2ID0gZGV2OwogCQkJCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsgLyogMTZieXRlIGFsaWduICovCi0JCQkJCQltZW1jcHkoc2tiX3B1dChza2IsIHJ4bGVuKSwgcnhwdHItPnJ4X3NrYl9wdHItPmRhdGEsIHJ4bGVuKTsKKwkJCQkJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEocnhwdHItPnJ4X3NrYl9wdHIsCisJCQkJCQkJICBza2JfcHV0KHNrYiwgcnhsZW4pLAorCQkJCQkJCQkJICByeGxlbik7CiAJCQkJCQlkbWZlX3JldXNlX3NrYihkYiwgcnhwdHItPnJ4X3NrYl9wdHIpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJc2tiLT5kZXYgPSBkZXY7CisJCQkJCX0gZWxzZQogCQkJCQkJc2tiX3B1dChza2IsIHJ4bGVuKTsKLQkJCQkJfQorCiAJCQkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CiAJCQkJCW5ldGlmX3J4KHNrYik7CiAJCQkJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CkBAIC0xMDY1LDcgKzEwNjksMTEgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkYi0+bG9jaywgZmxhZ3MpOwogfQogCi1zdGF0aWMgdm9pZCBuZXRkZXZfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKy8qCisgKiAJRXRodG9vbCBpbnRlcmFjZQorICovCisKK3N0YXRpYyB2b2lkIGRtZmVfZXRodG9vbF9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJICAgICAgIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCiB7CiAJc3RydWN0IGRtZmVfYm9hcmRfaW5mbyAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOwpAQCAtMTA3OSw5ICsxMDg3LDM1IEBACiAJCQlkZXYtPmJhc2VfYWRkciwgZGV2LT5pcnEpOwogfQogCitzdGF0aWMgaW50IGRtZmVfZXRodG9vbF9zZXRfd29sKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGV0aHRvb2xfd29saW5mbyAqd29saW5mbykKK3sKKwlzdHJ1Y3QgZG1mZV9ib2FyZF9pbmZvICpkYiA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiAod29saW5mby0+d29sb3B0cyAmIChXQUtFX1VDQVNUIHwgV0FLRV9NQ0FTVCB8IFdBS0VfQkNBU1QgfAorCQkgICAJCVdBS0VfQVJQIHwgV0FLRV9NQUdJQ1NFQ1VSRSkpCisJCSAgIHJldHVybiAtRU9QTk9UU1VQUDsKKworCWRiLT53b2xfbW9kZSA9IHdvbGluZm8tPndvbG9wdHM7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRtZmVfZXRodG9vbF9nZXRfd29sKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJIHN0cnVjdCBldGh0b29sX3dvbGluZm8gKndvbGluZm8pCit7CisJc3RydWN0IGRtZmVfYm9hcmRfaW5mbyAqZGIgPSBuZXRkZXZfcHJpdihkZXYpOworCisJd29saW5mby0+c3VwcG9ydGVkID0gV0FLRV9QSFkgfCBXQUtFX01BR0lDOworCXdvbGluZm8tPndvbG9wdHMgPSBkYi0+d29sX21vZGU7CisJcmV0dXJuOworfQorCisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgbmV0ZGV2X2V0aHRvb2xfb3BzID0gewotCS5nZXRfZHJ2aW5mbwkJPSBuZXRkZXZfZ2V0X2RydmluZm8sCisJLmdldF9kcnZpbmZvCQk9IGRtZmVfZXRodG9vbF9nZXRfZHJ2aW5mbywKIAkuZ2V0X2xpbmsgICAgICAgICAgICAgICA9IGV0aHRvb2xfb3BfZ2V0X2xpbmssCisJLnNldF93b2wJCT0gZG1mZV9ldGh0b29sX3NldF93b2wsCisJLmdldF93b2wJCT0gZG1mZV9ldGh0b29sX2dldF93b2wsCiB9OwogCiAvKgpAQCAtMjA1MCwxMSArMjA4NCw4NSBAQAogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGRtZmVfcGNpX3RibCk7CiAKIAorI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBkbWZlX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBjaV9kZXYpOworCXN0cnVjdCBkbWZlX2JvYXJkX2luZm8gKmRiID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1MzIgdG1wOworCisJLyogRGlzYWJsZSB1cHBlciBsYXllciBpbnRlcmZhY2UgKi8KKwluZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CisKKwkvKiBEaXNhYmxlIFR4L1J4ICovCisJZGItPmNyNl9kYXRhICY9IH4oQ1I2X1JYU0MgfCBDUjZfVFhTQyk7CisJdXBkYXRlX2NyNihkYi0+Y3I2X2RhdGEsIGRldi0+YmFzZV9hZGRyKTsKKworCS8qIERpc2FibGUgSW50ZXJydXB0ICovCisJb3V0bCgwLCBkZXYtPmJhc2VfYWRkciArIERDUjcpOworCW91dGwoaW5sIChkZXYtPmJhc2VfYWRkciArIERDUjUpLCBkZXYtPmJhc2VfYWRkciArIERDUjUpOworCisJLyogRnJlIFJYIGJ1ZmZlcnMgKi8KKwlkbWZlX2ZyZWVfcnhidWZmZXIoZGIpOworCisJLyogRW5hYmxlIFdPTCAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwY2lfZGV2LCAweDQwLCAmdG1wKTsKKwl0bXAgJj0gfihETUZFX1dPTF9MSU5LQ0hBTkdFfERNRkVfV09MX01BR0lDUEFDS0VUKTsKKworCWlmIChkYi0+d29sX21vZGUgJiBXQUtFX1BIWSkKKwkJdG1wIHw9IERNRkVfV09MX0xJTktDSEFOR0U7CisJaWYgKGRiLT53b2xfbW9kZSAmIFdBS0VfTUFHSUMpCisJCXRtcCB8PSBETUZFX1dPTF9NQUdJQ1BBQ0tFVDsKKworCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGNpX2RldiwgMHg0MCwgdG1wKTsKKworCXBjaV9lbmFibGVfd2FrZShwY2lfZGV2LCBQQ0lfRDNob3QsIDEpOworCXBjaV9lbmFibGVfd2FrZShwY2lfZGV2LCBQQ0lfRDNjb2xkLCAxKTsKKworCS8qIFBvd2VyIGRvd24gZGV2aWNlKi8KKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaV9kZXYsIHBjaV9jaG9vc2Vfc3RhdGUgKHBjaV9kZXYsc3RhdGUpKTsKKwlwY2lfc2F2ZV9zdGF0ZShwY2lfZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRtZmVfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGNpX2Rldik7CisJdTMyIHRtcDsKKworCXBjaV9yZXN0b3JlX3N0YXRlKHBjaV9kZXYpOworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpX2RldiwgUENJX0QwKTsKKworCS8qIFJlLWluaXRpbGl6ZSBETTkxMFggYm9hcmQgKi8KKwlkbWZlX2luaXRfZG05MTB4KGRldik7CisKKwkvKiBEaXNhYmxlIFdPTCAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwY2lfZGV2LCAweDQwLCAmdG1wKTsKKworCXRtcCAmPSB+KERNRkVfV09MX0xJTktDSEFOR0UgfCBETUZFX1dPTF9NQUdJQ1BBQ0tFVCk7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwY2lfZGV2LCAweDQwLCB0bXApOworCisJcGNpX2VuYWJsZV93YWtlKHBjaV9kZXYsIFBDSV9EM2hvdCwgMCk7CisJcGNpX2VuYWJsZV93YWtlKHBjaV9kZXYsIFBDSV9EM2NvbGQsIDApOworCisJLyogUmVzdGFydCB1cHBlciBsYXllciBpbnRlcmZhY2UgKi8KKwluZXRpZl9kZXZpY2VfYXR0YWNoKGRldik7CisKKwlyZXR1cm4gMDsKK30KKyNlbHNlCisjZGVmaW5lIGRtZmVfc3VzcGVuZCBOVUxMCisjZGVmaW5lIGRtZmVfcmVzdW1lIE5VTEwKKyNlbmRpZgorCiBzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZG1mZV9kcml2ZXIgPSB7CiAJLm5hbWUJCT0gImRtZmUiLAogCS5pZF90YWJsZQk9IGRtZmVfcGNpX3RibCwKIAkucHJvYmUJCT0gZG1mZV9pbml0X29uZSwKIAkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGRtZmVfcmVtb3ZlX29uZSksCisJLnN1c3BlbmQgICAgICAgID0gZG1mZV9zdXNwZW5kLAorCS5yZXN1bWUgICAgICAgICA9IGRtZmVfcmVzdW1lCiB9OwogCiBNT0RVTEVfQVVUSE9SKCJTdGVuIFdhbmcsIHN0ZW5fd2FuZ0BkYXZpY29tLmNvbS50dyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdHVsaXAvaW50ZXJydXB0LmMgYi9kcml2ZXJzL25ldC90dWxpcC9pbnRlcnJ1cHQuYwppbmRleCBlMzQ4OGQ3Li45YjA4YWZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90dWxpcC9pbnRlcnJ1cHQuYworKysgYi9kcml2ZXJzL25ldC90dWxpcC9pbnRlcnJ1cHQuYwpAQCAtMTkyLDcgKzE5Miw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYSBtaW5pbWFsbHktc2l6ZWQgc2tidWZmLiAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwa3RfbGVuIDwgdHVsaXBfcnhfY29weWJyZWFrCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChza2IgPSBkZXZfYWxsb2Nfc2tiKHBrdF9sZW4gKyAyKSkgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tiLT5kZXYgPSBkZXY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2JfcmVzZXJ2ZShza2IsIDIpOyAgICAvKiAxNiBieXRlIGFsaWduIHRoZSBJUCBoZWFkZXIgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdSh0cC0+cGRldiwKIAkJCQkJCQkJICAgdHAtPnJ4X2J1ZmZlcnNbZW50cnldLm1hcHBpbmcsCkBAIC00MTYsNyArNDE1LDYgQEAKIAkJCSAgIHRvIGEgbWluaW1hbGx5LXNpemVkIHNrYnVmZi4gKi8KIAkJCWlmIChwa3RfbGVuIDwgdHVsaXBfcnhfY29weWJyZWFrCiAJCQkJJiYgKHNrYiA9IGRldl9hbGxvY19za2IocGt0X2xlbiArIDIpKSAhPSBOVUxMKSB7Ci0JCQkJc2tiLT5kZXYgPSBkZXY7CiAJCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsJLyogMTYgYnl0ZSBhbGlnbiB0aGUgSVAgaGVhZGVyICovCiAJCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KHRwLT5wZGV2LAogCQkJCQkJCSAgICB0cC0+cnhfYnVmZmVyc1tlbnRyeV0ubWFwcGluZywKQEAgLTY3NSw3ICs2NzMsNyBAQAogCQkJCWlmICh0cC0+bGlua19jaGFuZ2UpCiAJCQkJCSh0cC0+bGlua19jaGFuZ2UpKGRldiwgY3NyNSk7CiAJCQl9Ci0JCQlpZiAoY3NyNSAmIFN5dGVtRXJyb3IpIHsKKwkJCWlmIChjc3I1ICYgU3lzdGVtRXJyb3IpIHsKIAkJCQlpbnQgZXJyb3IgPSAoY3NyNSA+PiAyMykgJiA3OwogCQkJCS8qIG9vcHMsIHdlIGhpdCBhIFBDSSBlcnJvci4gIFRoZSBjb2RlIHByb2R1Y2VkIGNvcnJlc3BvbmRzCiAJCQkJICogdG8gdGhlIHJlYXNvbjoKQEAgLTc0NSw3ICs3NDMsNyBAQAogCQkJICBUeEZJRk9VbmRlcmZsb3cgfAogCQkJICBUeEphYmJlciB8CiAJCQkgIFRQTG5rRmFpbCB8Ci0JCQkgIFN5dGVtRXJyb3IgKSkgIT0gMCk7CisJCQkgIFN5c3RlbUVycm9yICkpICE9IDApOwogI2Vsc2UKIAl9IHdoaWxlICgoY3NyNSAmIChOb3JtYWxJbnRyfEFibm9ybWFsSW50cikpICE9IDApOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90dWxpcC9tZWRpYS5jIGIvZHJpdmVycy9uZXQvdHVsaXAvbWVkaWEuYwppbmRleCAyMGJkNTJiLi5iNTYyNTY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90dWxpcC9tZWRpYS5jCisrKyBiL2RyaXZlcnMvbmV0L3R1bGlwL21lZGlhLmMKQEAgLTQ0LDggKzQ0LDEwIEBACiAKIC8qIE1JSSB0cmFuc2NlaXZlciBjb250cm9sIHNlY3Rpb24uCiAgICBSZWFkIGFuZCB3cml0ZSB0aGUgTUlJIHJlZ2lzdGVycyB1c2luZyBzb2Z0d2FyZS1nZW5lcmF0ZWQgc2VyaWFsCi0gICBNRElPIHByb3RvY29sLiAgU2VlIHRoZSBNSUkgc3BlY2lmaWNhdGlvbnMgb3IgRFA4Mzg0MEEgZGF0YSBzaGVldAotICAgZm9yIGRldGFpbHMuICovCisgICBNRElPIHByb3RvY29sLgorICAgU2VlIElFRUUgODAyLjMtMjAwMi5wZGYgKFNlY3Rpb24gMiwgQ2hhcHRlciAiMjIuMi40IE1hbmFnZW1lbnQgZnVuY3Rpb25zIikKKyAgIG9yIERQODM4NDBBIGRhdGEgc2hlZXQgZm9yIG1vcmUgZGV0YWlscy4KKyAgICovCiAKIGludCB0dWxpcF9tZGlvX3JlYWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uKQogewpAQCAtMjYxLDI0ICsyNjMsNTYgQEAKIAkJCQl1MTYgKnJlc2V0X3NlcXVlbmNlID0gJigodTE2KikocCszKSlbaW5pdF9sZW5ndGhdOwogCQkJCWludCByZXNldF9sZW5ndGggPSBwWzIgKyBpbml0X2xlbmd0aCoyXTsKIAkJCQltaXNjX2luZm8gPSByZXNldF9zZXF1ZW5jZSArIHJlc2V0X2xlbmd0aDsKLQkJCQlpZiAoc3RhcnR1cCkKKwkJCQlpZiAoc3RhcnR1cCkgeworCQkJCQlpbnQgdGltZW91dCA9IDEwOwkvKiBtYXggMSBtcyAqLwogCQkJCQlmb3IgKGkgPSAwOyBpIDwgcmVzZXRfbGVuZ3RoOyBpKyspCiAJCQkJCQlpb3dyaXRlMzIoZ2V0X3UxNigmcmVzZXRfc2VxdWVuY2VbaV0pIDw8IDE2LCBpb2FkZHIgKyBDU1IxNSk7CisKKwkJCQkJLyogZmx1c2ggcG9zdGVkIHdyaXRlcyAqLworCQkJCQlpb3JlYWQzMihpb2FkZHIgKyBDU1IxNSk7CisKKwkJCQkJLyogU2VjdCAzLjEwLjMgaW4gRFA4Mzg0MEEucGRmIChwMzkpICovCisJCQkJCXVkZWxheSg1MDApOworCisJCQkJCS8qIFNlY3Rpb24gNC4yIGluIERQODM4NDBBLnBkZiAocDQzKSAqLworCQkJCQkvKiBhbmQgSUVFRSA4MDIuMyAiMjIuMi40LjEuMSBSZXNldCIgKi8KKwkJCQkJd2hpbGUgKHRpbWVvdXQtLSAmJgorCQkJCQkJKHR1bGlwX21kaW9fcmVhZCAoZGV2LCBwaHlfbnVtLCBNSUlfQk1DUikgJiBCTUNSX1JFU0VUKSkKKwkJCQkJCXVkZWxheSgxMDApOworCQkJCX0KIAkJCQlmb3IgKGkgPSAwOyBpIDwgaW5pdF9sZW5ndGg7IGkrKykKIAkJCQkJaW93cml0ZTMyKGdldF91MTYoJmluaXRfc2VxdWVuY2VbaV0pIDw8IDE2LCBpb2FkZHIgKyBDU1IxNSk7CisKKwkJCQlpb3JlYWQzMihpb2FkZHIgKyBDU1IxNSk7CS8qIGZsdXNoIHBvc3RlZCB3cml0ZXMgKi8KIAkJCX0gZWxzZSB7CiAJCQkJdTggKmluaXRfc2VxdWVuY2UgPSBwICsgMjsKIAkJCQl1OCAqcmVzZXRfc2VxdWVuY2UgPSBwICsgMyArIGluaXRfbGVuZ3RoOwogCQkJCWludCByZXNldF9sZW5ndGggPSBwWzIgKyBpbml0X2xlbmd0aF07CiAJCQkJbWlzY19pbmZvID0gKHUxNiopKHJlc2V0X3NlcXVlbmNlICsgcmVzZXRfbGVuZ3RoKTsKIAkJCQlpZiAoc3RhcnR1cCkgeworCQkJCQlpbnQgdGltZW91dCA9IDEwOwkvKiBtYXggMSBtcyAqLwogCQkJCQlpb3dyaXRlMzIobXRhYmxlLT5jc3IxMmRpciB8IDB4MTAwLCBpb2FkZHIgKyBDU1IxMik7CiAJCQkJCWZvciAoaSA9IDA7IGkgPCByZXNldF9sZW5ndGg7IGkrKykKIAkJCQkJCWlvd3JpdGUzMihyZXNldF9zZXF1ZW5jZVtpXSwgaW9hZGRyICsgQ1NSMTIpOworCisJCQkJCS8qIGZsdXNoIHBvc3RlZCB3cml0ZXMgKi8KKwkJCQkJaW9yZWFkMzIoaW9hZGRyICsgQ1NSMTIpOworCisJCQkJCS8qIFNlY3QgMy4xMC4zIGluIERQODM4NDBBLnBkZiAocDM5KSAqLworCQkJCQl1ZGVsYXkoNTAwKTsKKworCQkJCQkvKiBTZWN0aW9uIDQuMiBpbiBEUDgzODQwQS5wZGYgKHA0MykgKi8KKwkJCQkJLyogYW5kIElFRUUgODAyLjMgIjIyLjIuNC4xLjEgUmVzZXQiICovCisJCQkJCXdoaWxlICh0aW1lb3V0LS0gJiYKKwkJCQkJCSh0dWxpcF9tZGlvX3JlYWQgKGRldiwgcGh5X251bSwgTUlJX0JNQ1IpICYgQk1DUl9SRVNFVCkpCisJCQkJCQl1ZGVsYXkoMTAwKTsKIAkJCQl9CiAJCQkJZm9yIChpID0gMDsgaSA8IGluaXRfbGVuZ3RoOyBpKyspCiAJCQkJCWlvd3JpdGUzMihpbml0X3NlcXVlbmNlW2ldLCBpb2FkZHIgKyBDU1IxMik7CisKKwkJCQlpb3JlYWQzMihpb2FkZHIgKyBDU1IxMik7CS8qIGZsdXNoIHBvc3RlZCB3cml0ZXMgKi8KIAkJCX0KKwogCQkJdG1wX2luZm8gPSBnZXRfdTE2KCZtaXNjX2luZm9bMV0pOwogCQkJaWYgKHRtcF9pbmZvKQogCQkJCXRwLT5hZHZlcnRpc2luZ1twaHlfbnVtXSA9IHRtcF9pbmZvIHwgMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R1bGlwL3R1bGlwLmggYi9kcml2ZXJzL25ldC90dWxpcC90dWxpcC5oCmluZGV4IDI1ZjI1ZGEuLmM4NDBkMmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3R1bGlwL3R1bGlwLmgKKysrIGIvZHJpdmVycy9uZXQvdHVsaXAvdHVsaXAuaApAQCAtMTMyLDcgKzEzMiw3IEBACiAvKiBUaGUgYml0cyBpbiB0aGUgQ1NSNSBzdGF0dXMgcmVnaXN0ZXJzLCBtb3N0bHkgaW50ZXJydXB0IHNvdXJjZXMuICovCiBlbnVtIHN0YXR1c19iaXRzIHsKIAlUaW1lckludCA9IDB4ODAwLAotCVN5dGVtRXJyb3IgPSAweDIwMDAsCisJU3lzdGVtRXJyb3IgPSAweDIwMDAsCiAJVFBMbmtGYWlsID0gMHgxMDAwLAogCVRQTG5rUGFzcyA9IDB4MTAsCiAJTm9ybWFsSW50ciA9IDB4MTAwMDAsCkBAIC00ODIsOCArNDgyLDExIEBACiAJCQl1ZGVsYXkoMTApOwogCiAJCWlmICghaSkKLQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogdHVsaXBfc3RvcF9yeHR4KCkgZmFpbGVkXG4iLAotCQkJCQlwY2lfbmFtZSh0cC0+cGRldikpOworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB0dWxpcF9zdG9wX3J4dHgoKSBmYWlsZWQiCisJCQkJCSIgKENTUjUgMHgleCBDU1I2IDB4JXgpXG4iLAorCQkJCQlwY2lfbmFtZSh0cC0+cGRldiksCisJCQkJCWlvcmVhZDMyKGlvYWRkciArIENTUjUpLAorCQkJCQlpb3JlYWQzMihpb2FkZHIgKyBDU1I2KSk7CiAJfQogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90dWxpcC90dWxpcF9jb3JlLmMgYi9kcml2ZXJzL25ldC90dWxpcC90dWxpcF9jb3JlLmMKaW5kZXggZTM3NzRhNS4uMDQxYWY2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdHVsaXAvdHVsaXBfY29yZS5jCisrKyBiL2RyaXZlcnMvbmV0L3R1bGlwL3R1bGlwX2NvcmUuYwpAQCAtMTcsMTEgKzE3LDExIEBACiAKICNkZWZpbmUgRFJWX05BTUUJInR1bGlwIgogI2lmZGVmIENPTkZJR19UVUxJUF9OQVBJCi0jZGVmaW5lIERSVl9WRVJTSU9OICAgICIxLjEuMTQtTkFQSSIgLyogS2VlcCBhdCBsZWFzdCBmb3IgdGVzdCAqLworI2RlZmluZSBEUlZfVkVSU0lPTiAgICAiMS4xLjE1LU5BUEkiIC8qIEtlZXAgYXQgbGVhc3QgZm9yIHRlc3QgKi8KICNlbHNlCi0jZGVmaW5lIERSVl9WRVJTSU9OCSIxLjEuMTQiCisjZGVmaW5lIERSVl9WRVJTSU9OCSIxLjEuMTUiCiAjZW5kaWYKLSNkZWZpbmUgRFJWX1JFTERBVEUJIk1heSAxMSwgMjAwMiIKKyNkZWZpbmUgRFJWX1JFTERBVEUJIkZlYiAyNywgMjAwNyIKIAogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC0zNiw4ICszNiw4IEBACiAjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKLSNpZmRlZiBfX3NwYXJjX18KLSNpbmNsdWRlIDxhc20vcGJtLmg+CisjaWZkZWYgQ09ORklHX1NQQVJDCisjaW5jbHVkZSA8YXNtL3Byb20uaD4KICNlbmRpZgogCiBzdGF0aWMgY2hhciB2ZXJzaW9uW10gX19kZXZpbml0ZGF0YSA9CkBAIC02Nyw3ICs2Nyw3IEBACiAKIC8qIFNldCB0aGUgY29weSBicmVha3BvaW50IGZvciB0aGUgY29weS1vbmx5LXRpbnktYnVmZmVyIFJ4IHN0cnVjdHVyZS4gKi8KICNpZiBkZWZpbmVkKF9fYWxwaGFfXykgfHwgZGVmaW5lZChfX2FybV9fKSB8fCBkZWZpbmVkKF9faHBwYV9fKSBcCi0JfHwgZGVmaW5lZChfX3NwYXJjX18pIHx8IGRlZmluZWQoX19pYTY0X18pIFwKKwl8fCBkZWZpbmVkKENPTkZJR19TUEFSQykgfHwgZGVmaW5lZChfX2lhNjRfXykgXAogCXx8IGRlZmluZWQoX19zaF9fKSB8fCBkZWZpbmVkKF9fbWlwc19fKQogc3RhdGljIGludCByeF9jb3B5YnJlYWsgPSAxNTE4OwogI2Vsc2UKQEAgLTkxLDcgKzkxLDcgQEAKIHN0YXRpYyBpbnQgY3NyMCA9IDB4MDFBMDAwMDAgfCAweEUwMDA7CiAjZWxpZiBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9fcG93ZXJwY19fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pCiBzdGF0aWMgaW50IGNzcjAgPSAweDAxQTAwMDAwIHwgMHg4MDAwOwotI2VsaWYgZGVmaW5lZChfX3NwYXJjX18pIHx8IGRlZmluZWQoX19ocHBhX18pCisjZWxpZiBkZWZpbmVkKENPTkZJR19TUEFSQykgfHwgZGVmaW5lZChfX2hwcGFfXykKIC8qIFRoZSBVbHRyYVNwYXJjIFBDSSBjb250cm9sbGVycyB3aWxsIGRpc2Nvbm5lY3QgYXQgZXZlcnkgNjQtYnl0ZQogICogY3Jvc3NpbmcgYW55d2F5cyBzbyBpdCBtYWtlcyBubyBzZW5zZSB0byB0ZWxsIFR1bGlwIHRvIGJ1cnN0CiAgKiBhbnkgbW9yZSB0aGFuIHRoYXQuCkBAIC0xMzE1LDcgKzEzMTUsNyBAQAogCS8qIERNOTEwMkEgaGFzIHRyb3VibGVzIHdpdGggTVJNICYgY2xlYXIgcmVzZXJ2ZWQgYml0cyAyNDoyMiwgMjAsIDE2LCA3OjEgKi8KIAlpZiAodHVsaXBfdWxpX2RtX3F1aXJrKHBkZXYpKSB7CiAJCWNzcjAgJj0gfjB4MDFmMTAwZmY7Ci0jaWYgZGVmaW5lZChfX3NwYXJjX18pCisjaWYgZGVmaW5lZChDT05GSUdfU1BBUkMpCiAgICAgICAgICAgICAgICAgY3NyMCA9IChjc3IwICYgfjB4ZmYwMCkgfCAweGUwMDA7CiAjZW5kaWYKIAl9CkBAIC0xNTM1LDIzICsxNTM1LDE5IEBACiAJICAgTWFueSBQQ0kgQklPU2VzIGFsc28gaW5jb3JyZWN0bHkgcmVwb3J0IHRoZSBJUlEgbGluZSwgc28gd2UgY29ycmVjdAogCSAgIHRoYXQgaGVyZSBhcyB3ZWxsLiAqLwogCWlmIChzdW0gPT0gMCAgfHwgc3VtID09IDYqMHhmZikgewotI2lmIGRlZmluZWQoX19zcGFyY19fKQotCQlzdHJ1Y3QgcGNpZGV2X2Nvb2tpZSAqcGNwID0gcGRldi0+c3lzZGF0YTsKKyNpZiBkZWZpbmVkKENPTkZJR19TUEFSQykKKwkJc3RydWN0IGRldmljZV9ub2RlICpkcCA9IHBjaV9kZXZpY2VfdG9fT0Zfbm9kZShwZGV2KTsKKwkJY29uc3QgdW5zaWduZWQgY2hhciAqYWRkcjsKKwkJaW50IGxlbjsKICNlbmRpZgogCQllZXByb21fbWlzc2luZyA9IDE7CiAJCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspCiAJCQlkZXYtPmRldl9hZGRyW2ldID0gbGFzdF9waHlzX2FkZHJbaV07CiAJCWRldi0+ZGV2X2FkZHJbaV0gPSBsYXN0X3BoeXNfYWRkcltpXSArIDE7Ci0jaWYgZGVmaW5lZChfX3NwYXJjX18pCi0JCWlmIChwY3ApIHsKLQkJCXVuc2lnbmVkIGNoYXIgKmFkZHI7Ci0JCQlpbnQgbGVuOwotCi0JCQlhZGRyID0gb2ZfZ2V0X3Byb3BlcnR5KHBjcC0+cHJvbV9ub2RlLAotCQkJCQkgICAgICAgImxvY2FsLW1hYy1hZGRyZXNzIiwgJmxlbik7Ci0JCQlpZiAoYWRkciAmJiBsZW4gPT0gNikKLQkJCQltZW1jcHkoZGV2LT5kZXZfYWRkciwgYWRkciwgNik7Ci0JCX0KKyNpZiBkZWZpbmVkKENPTkZJR19TUEFSQykKKwkJYWRkciA9IG9mX2dldF9wcm9wZXJ0eShkcCwgImxvY2FsLW1hYy1hZGRyZXNzIiwgJmxlbik7CisJCWlmIChhZGRyICYmIGxlbiA9PSA2KQorCQkJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIGFkZHIsIDYpOwogI2VuZGlmCiAjaWYgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKQkvKiBQYXRjaCB1cCB4ODYgQklPUyBidWcuICovCiAJCWlmIChsYXN0X2lycSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R1bGlwL3VsaTUyNnguYyBiL2RyaXZlcnMvbmV0L3R1bGlwL3VsaTUyNnguYwppbmRleCAyMjkxNThlLi5jYTI1NDhlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90dWxpcC91bGk1MjZ4LmMKKysrIGIvZHJpdmVycy9uZXQvdHVsaXAvdWxpNTI2eC5jCkBAIC01ODMsNyArNTgzLDcgQEAKIAogCS8qIHRyYW5zbWl0IHRoaXMgcGFja2V0ICovCiAJdHhwdHIgPSBkYi0+dHhfaW5zZXJ0X3B0cjsKLQltZW1jcHkodHhwdHItPnR4X2J1Zl9wdHIsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCB0eHB0ci0+dHhfYnVmX3B0ciwgc2tiLT5sZW4pOwogCXR4cHRyLT50ZGVzMSA9IGNwdV90b19sZTMyKDB4ZTEwMDAwMDAgfCBza2ItPmxlbik7CiAKIAkvKiBQb2ludCB0byBuZXh0IHRyYW5zbWl0IGZyZWUgZGVzY3JpcHRvciAqLwpAQCAtODI4LDE0ICs4MjgsMTQgQEAKIAkJCQkJKCAoc2tiID0gZGV2X2FsbG9jX3NrYihyeGxlbiArIDIpICkKIAkJCQkJIT0gTlVMTCkgKSB7CiAJCQkJCS8qIHNpemUgbGVzcyB0aGFuIENPUFlfU0laRSwgYWxsb2NhdGUgYSByeGxlbiBTS0IgKi8KLQkJCQkJc2tiLT5kZXYgPSBkZXY7CiAJCQkJCXNrYl9yZXNlcnZlKHNrYiwgMik7IC8qIDE2Ynl0ZSBhbGlnbiAqLwotCQkJCQltZW1jcHkoc2tiX3B1dChza2IsIHJ4bGVuKSwgcnhwdHItPnJ4X3NrYl9wdHItPnRhaWwsIHJ4bGVuKTsKKwkJCQkJbWVtY3B5KHNrYl9wdXQoc2tiLCByeGxlbiksCisJCQkJCSAgICAgICBza2JfdGFpbF9wb2ludGVyKHJ4cHRyLT5yeF9za2JfcHRyKSwKKwkJCQkJICAgICAgIHJ4bGVuKTsKIAkJCQkJdWxpNTI2eF9yZXVzZV9za2IoZGIsIHJ4cHRyLT5yeF9za2JfcHRyKTsKLQkJCQl9IGVsc2UgewotCQkJCQlza2ItPmRldiA9IGRldjsKKwkJCQl9IGVsc2UKIAkJCQkJc2tiX3B1dChza2IsIHJ4bGVuKTsKLQkJCQl9CisKIAkJCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOwogCQkJCW5ldGlmX3J4KHNrYik7CiAJCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKQEAgLTExNzcsNyArMTE3NywxMCBAQAogCiAJaWYgKCEocnhwdHItPnJkZXMwICYgY3B1X3RvX2xlMzIoMHg4MDAwMDAwMCkpKSB7CiAJCXJ4cHRyLT5yeF9za2JfcHRyID0gc2tiOwotCQlyeHB0ci0+cmRlczIgPSBjcHVfdG9fbGUzMiggcGNpX21hcF9zaW5nbGUoZGItPnBkZXYsIHNrYi0+dGFpbCwgUlhfQUxMT0NfU0laRSwgUENJX0RNQV9GUk9NREVWSUNFKSApOworCQlyeHB0ci0+cmRlczIgPSBjcHVfdG9fbGUzMihwY2lfbWFwX3NpbmdsZShkYi0+cGRldiwKKwkJCQkJCQkgIHNrYl90YWlsX3BvaW50ZXIoc2tiKSwKKwkJCQkJCQkgIFJYX0FMTE9DX1NJWkUsCisJCQkJCQkJICBQQ0lfRE1BX0ZST01ERVZJQ0UpKTsKIAkJd21iKCk7CiAJCXJ4cHRyLT5yZGVzMCA9IGNwdV90b19sZTMyKDB4ODAwMDAwMDApOwogCQlkYi0+cnhfYXZhaWxfY250Kys7CkBAIC0xMzQxLDcgKzEzNDQsMTAgQEAKIAkJaWYgKCAoIHNrYiA9IGRldl9hbGxvY19za2IoUlhfQUxMT0NfU0laRSkgKSA9PSBOVUxMICkKIAkJCWJyZWFrOwogCQlyeHB0ci0+cnhfc2tiX3B0ciA9IHNrYjsgLyogRklYTUUgKD8pICovCi0JCXJ4cHRyLT5yZGVzMiA9IGNwdV90b19sZTMyKCBwY2lfbWFwX3NpbmdsZShkYi0+cGRldiwgc2tiLT50YWlsLCBSWF9BTExPQ19TSVpFLCBQQ0lfRE1BX0ZST01ERVZJQ0UpICk7CisJCXJ4cHRyLT5yZGVzMiA9IGNwdV90b19sZTMyKHBjaV9tYXBfc2luZ2xlKGRiLT5wZGV2LAorCQkJCQkJCSAgc2tiX3RhaWxfcG9pbnRlcihza2IpLAorCQkJCQkJCSAgUlhfQUxMT0NfU0laRSwKKwkJCQkJCQkgIFBDSV9ETUFfRlJPTURFVklDRSkpOwogCQl3bWIoKTsKIAkJcnhwdHItPnJkZXMwID0gY3B1X3RvX2xlMzIoMHg4MDAwMDAwMCk7CiAJCXJ4cHRyID0gcnhwdHItPm5leHRfcnhfZGVzYzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R1bGlwL3dpbmJvbmQtODQwLmMgYi9kcml2ZXJzL25ldC90dWxpcC93aW5ib25kLTg0MC5jCmluZGV4IDAwMmEwNWUuLmZhNDQwNzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3R1bGlwL3dpbmJvbmQtODQwLmMKKysrIGIvZHJpdmVycy9uZXQvdHVsaXAvd2luYm9uZC04NDAuYwpAQCAtODEzLDcgKzgxMyw2IEBACiAJCW5wLT5yeF9za2J1ZmZbaV0gPSBza2I7CiAJCWlmIChza2IgPT0gTlVMTCkKIAkJCWJyZWFrOwotCQlza2ItPmRldiA9IGRldjsJCQkvKiBNYXJrIGFzIGJlaW5nIHVzZWQgYnkgdGhpcyBkZXZpY2UuICovCiAJCW5wLT5yeF9hZGRyW2ldID0gcGNpX21hcF9zaW5nbGUobnAtPnBjaV9kZXYsc2tiLT5kYXRhLAogCQkJCQlucC0+cnhfYnVmX3N6LFBDSV9ETUFfRlJPTURFVklDRSk7CiAKQEAgLTkwMyw3ICs5MDIsNyBAQAogCX0KICNlbGlmIGRlZmluZWQoX19wb3dlcnBjX18pIHx8IGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX19hbHBoYV9fKSB8fCBkZWZpbmVkKF9faWE2NF9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pCiAJaSB8PSAweEUwMDA7Ci0jZWxpZiBkZWZpbmVkKF9fc3BhcmNfXykgfHwgZGVmaW5lZCAoQ09ORklHX1BBUklTQykKKyNlbGlmIGRlZmluZWQoQ09ORklHX1NQQVJDKSB8fCBkZWZpbmVkIChDT05GSUdfUEFSSVNDKQogCWkgfD0gMHg0ODAwOwogI2Vsc2UKICN3YXJuaW5nIFByb2Nlc3NvciBhcmNoaXRlY3R1cmUgdW5kZWZpbmVkCkBAIC0xMTQ4LDcgKzExNDcsNyBAQAogCQl9CiAKIAkJLyogQWJub3JtYWwgZXJyb3Igc3VtbWFyeS91bmNvbW1vbiBldmVudHMgaGFuZGxlcnMuICovCi0JCWlmIChpbnRyX3N0YXR1cyAmIChBYm5vcm1hbEludHIgfCBUeEZJRk9VbmRlcmZsb3cgfCBTeXRlbUVycm9yIHwKKwkJaWYgKGludHJfc3RhdHVzICYgKEFibm9ybWFsSW50ciB8IFR4RklGT1VuZGVyZmxvdyB8IFN5c3RlbUVycm9yIHwKIAkJCQkJCSAgIFRpbWVySW50IHwgVHhEaWVkKSkKIAkJCW5ldGRldl9lcnJvcihkZXYsIGludHJfc3RhdHVzKTsKIApAQCAtMTIyOSw3ICsxMjI4LDYgQEAKIAkJCSAgIHRvIGEgbWluaW1hbGx5LXNpemVkIHNrYnVmZi4gKi8KIAkJCWlmIChwa3RfbGVuIDwgcnhfY29weWJyZWFrCiAJCQkJJiYgKHNrYiA9IGRldl9hbGxvY19za2IocGt0X2xlbiArIDIpKSAhPSBOVUxMKSB7Ci0JCQkJc2tiLT5kZXYgPSBkZXY7CiAJCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsJLyogMTYgYnl0ZSBhbGlnbiB0aGUgSVAgaGVhZGVyICovCiAJCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KG5wLT5wY2lfZGV2LG5wLT5yeF9hZGRyW2VudHJ5XSwKIAkJCQkJCQkgICAgbnAtPnJ4X3NrYnVmZltlbnRyeV0tPmxlbiwKQEAgLTEyNzgsNyArMTI3Niw2IEBACiAJCQlucC0+cnhfc2tidWZmW2VudHJ5XSA9IHNrYjsKIAkJCWlmIChza2IgPT0gTlVMTCkKIAkJCQlicmVhazsJCQkvKiBCZXR0ZXIgbHVjayBuZXh0IHJvdW5kLiAqLwotCQkJc2tiLT5kZXYgPSBkZXY7CQkJLyogTWFyayBhcyBiZWluZyB1c2VkIGJ5IHRoaXMgZGV2aWNlLiAqLwogCQkJbnAtPnJ4X2FkZHJbZW50cnldID0gcGNpX21hcF9zaW5nbGUobnAtPnBjaV9kZXYsCiAJCQkJCQkJc2tiLT5kYXRhLAogCQkJCQkJCW5wLT5yeF9idWZfc3osIFBDSV9ETUFfRlJPTURFVklDRSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90dWxpcC94aXJjb21fY2IuYyBiL2RyaXZlcnMvbmV0L3R1bGlwL3hpcmNvbV9jYi5jCmluZGV4IDYxZDMxMzAuLjk4NWExODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3R1bGlwL3hpcmNvbV9jYi5jCisrKyBiL2RyaXZlcnMvbmV0L3R1bGlwL3hpcmNvbV9jYi5jCkBAIC00MTEsOSArNDExLDkgQEAKIAkJCSAgIHNvbWV0aW1lcyBzZW5kcyBtb3JlIHRoYW4geW91IGFzayBpdCB0by4gKi8KIAogCQkJbWVtc2V0KCZjYXJkLT50eF9idWZmZXJbYnVmZmVyb2Zmc2V0c1tkZXNjXS80XSwwLDE1MzYpOwotCQkJbWVtY3B5KCYoY2FyZC0+dHhfYnVmZmVyW2J1ZmZlcm9mZnNldHNbZGVzY10vNF0pLHNrYi0+ZGF0YSxza2ItPmxlbik7Ci0KLQorCQkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsCisJCQkJICAmKGNhcmQtPnR4X2J1ZmZlcltidWZmZXJvZmZzZXRzW2Rlc2NdIC8gNF0pLAorCQkJCQkJICBza2ItPmxlbik7CiAJCQkvKiBGSVhNRTogVGhlIHNwZWNpZmljYXRpb24gdGVsbHMgdXMgdGhhdCB0aGUgbGVuZ3RoIHdlIHNlbmQgSEFTIHRvIGJlIGEgbXVsdGlwbGUgb2YKIAkJCSAgIDQgYnl0ZXMuICovCiAKQEAgLTEyMDcsNyArMTIwNyw2IEBACiAJCQkJY2FyZC0+c3RhdHMucnhfZHJvcHBlZCsrOwogCQkJCWdvdG8gb3V0OwogCQkJfQotCQkJc2tiLT5kZXYgPSBkZXY7CiAJCQlza2JfcmVzZXJ2ZShza2IsIDIpOwogCQkJZXRoX2NvcHlfYW5kX3N1bShza2IsICh1bnNpZ25lZCBjaGFyKikmY2FyZC0+cnhfYnVmZmVyW2J1ZmZlcm9mZnNldCAvIDRdLCBwa3RfbGVuLCAwKTsKIAkJCXNrYl9wdXQoc2tiLCBwa3RfbGVuKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R1bGlwL3hpcmNvbV90dWxpcF9jYi5jIGIvZHJpdmVycy9uZXQvdHVsaXAveGlyY29tX3R1bGlwX2NiLmMKaW5kZXggYTk5OGM1ZC4uZjY0MTcyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdHVsaXAveGlyY29tX3R1bGlwX2NiLmMKKysrIGIvZHJpdmVycy9uZXQvdHVsaXAveGlyY29tX3R1bGlwX2NiLmMKQEAgLTY1LDcgKzY1LDcgQEAKIHN0YXRpYyBpbnQgY3NyMCA9IDB4MDFBMDAwMDAgfCAweEUwMDA7CiAjZWxpZiBkZWZpbmVkKF9fcG93ZXJwY19fKQogc3RhdGljIGludCBjc3IwID0gMHgwMUIwMDAwMCB8IDB4ODAwMDsKLSNlbGlmIGRlZmluZWQoX19zcGFyY19fKQorI2VsaWYgZGVmaW5lZChDT05GSUdfU1BBUkMpCiBzdGF0aWMgaW50IGNzcjAgPSAweDAxQjAwMDgwIHwgMHg4MDAwOwogI2VsaWYgZGVmaW5lZChfX2kzODZfXykKIHN0YXRpYyBpbnQgY3NyMCA9IDB4MDFBMDAwMDAgfCAweDgwMDA7CkBAIC05MTUsNyArOTE1LDkgQEAKIAogCXRwLT50eF9za2J1ZmZbZW50cnldID0gc2tiOwogCWlmICh0cC0+Y2hpcF9pZCA9PSBYMzIwMV8zKSB7Ci0JCW1lbWNweSh0cC0+dHhfYWxpZ25lZF9za2J1ZmZbZW50cnldLT5kYXRhLHNrYi0+ZGF0YSxza2ItPmxlbik7CisJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLAorCQkJCQkgIHRwLT50eF9hbGlnbmVkX3NrYnVmZltlbnRyeV0tPmRhdGEsCisJCQkJCSAgc2tiLT5sZW4pOwogCQl0cC0+dHhfcmluZ1tlbnRyeV0uYnVmZmVyMSA9IHZpcnRfdG9fYnVzKHRwLT50eF9hbGlnbmVkX3NrYnVmZltlbnRyeV0tPmRhdGEpOwogCX0gZWxzZQogCQl0cC0+dHhfcmluZ1tlbnRyeV0uYnVmZmVyMSA9IHZpcnRfdG9fYnVzKHNrYi0+ZGF0YSk7CkBAIC0xMjM4LDcgKzEyNDAsNiBAQAogCQkJICAgdG8gYSBtaW5pbWFsbHktc2l6ZWQgc2tidWZmLiAqLwogCQkJaWYgKHBrdF9sZW4gPCByeF9jb3B5YnJlYWsKIAkJCQkmJiAoc2tiID0gZGV2X2FsbG9jX3NrYihwa3RfbGVuICsgMikpICE9IE5VTEwpIHsKLQkJCQlza2ItPmRldiA9IGRldjsKIAkJCQlza2JfcmVzZXJ2ZShza2IsIDIpOwkvKiAxNiBieXRlIGFsaWduIHRoZSBJUCBoZWFkZXIgKi8KICNpZiAhIGRlZmluZWQoX19hbHBoYV9fKQogCQkJCWV0aF9jb3B5X2FuZF9zdW0oc2tiLCBidXNfdG9fdmlydCh0cC0+cnhfcmluZ1tlbnRyeV0uYnVmZmVyMSksCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90dW4uYyBiL2RyaXZlcnMvbmV0L3R1bi5jCmluZGV4IDU2NDNkMWUuLmEyYzZjYWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3R1bi5jCisrKyBiL2RyaXZlcnMvbmV0L3R1bi5jCkBAIC0xOCw2ICsxOCwxMCBAQAogLyoKICAqICBDaGFuZ2VzOgogICoKKyAqICBCcmlhbiBCcmF1bnN0ZWluIDxsaW51eGtlcm5lbEBicmlzdHlsZS5jb20+IDIwMDcvMDMvMjMKKyAqICAgIEZpeGVkIGh3IGFkZHJlc3MgaGFuZGxpbmcuICBOb3cgbmV0X2RldmljZS5kZXZfYWRkciBpcyBrZXB0IGNvbnNpc3RlbnQKKyAqICAgIHdpdGggdHVuLmRldl9hZGRyIHdoZW4gdGhlIGFkZHJlc3MgaXMgc2V0IGJ5IHRoaXMgbW9kdWxlLgorICoKICAqICBNaWtlIEtlcnNoYXcgPGRyYWdvcm5Aa2lzbWV0d2lyZWxlc3MubmV0PiAyMDA1LzA4LzE0CiAgKiAgICBBZGQgVFVOU0VUTElOSyBpb2N0bCB0byBzZXQgdGhlIGxpbmsgZW5jYXBzdWxhdGlvbgogICoKQEAgLTE5Niw3ICsyMDAsMTAgQEAKIAkJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSB0dW5fbmV0X21jbGlzdDsKIAogCQlldGhlcl9zZXR1cChkZXYpOwotCQlyYW5kb21fZXRoZXJfYWRkcihkZXYtPmRldl9hZGRyKTsKKworCQkvKiByYW5kb20gYWRkcmVzcyBhbHJlYWR5IGNyZWF0ZWQgZm9yIHVzIGJ5IHR1bl9zZXRfaWZmLCB1c2UgaXQgKi8KKwkJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIHR1bi0+ZGV2X2FkZHIsIG1pbihzaXplb2YodHVuLT5kZXZfYWRkciksIHNpemVvZihkZXYtPmRldl9hZGRyKSkgKTsKKwogCQlkZXYtPnR4X3F1ZXVlX2xlbiA9IFRVTl9SRUFEUV9TSVpFOyAgLyogV2UgcHJlZmVyIG91ciBvd24gcXVldWUgbGVuZ3RoICovCiAJCWJyZWFrOwogCX0KQEAgLTI1NCwxMSArMjYxLDExIEBACiAJCXJldHVybiAtRUZBVUxUOwogCX0KIAotCXNrYi0+ZGV2ID0gdHVuLT5kZXY7CiAJc3dpdGNoICh0dW4tPmZsYWdzICYgVFVOX1RZUEVfTUFTSykgewogCWNhc2UgVFVOX1RVTl9ERVY6Ci0JCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKwkJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKIAkJc2tiLT5wcm90b2NvbCA9IHBpLnByb3RvOworCQlza2ItPmRldiA9IHR1bi0+ZGV2OwogCQlicmVhazsKIAljYXNlIFRVTl9UQVBfREVWOgogCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCB0dW4tPmRldik7CkBAIC0zODYsOCArMzkzLDggQEAKIAkJICogICAtIHdlIGFyZSBtdWx0aWNhc3QgcHJvbWlzY291cy4KIAkJICogICAtIHdlIGJlbG9uZyB0byB0aGUgbXVsdGljYXN0IGdyb3VwLgogCQkgKi8KLQkJbWVtY3B5KGFkZHIsIHNrYi0+ZGF0YSwKLQkJICAgICAgIG1pbl90KHNpemVfdCwgc2l6ZW9mIGFkZHIsIHNrYi0+bGVuKSk7CisJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCBhZGRyLCBtaW5fdChzaXplX3QsIHNpemVvZiBhZGRyLAorCQkJCQkJCQkgICBza2ItPmxlbikpOwogCQliaXRfbnIgPSBldGhlcl9jcmMoc2l6ZW9mIGFkZHIsIGFkZHIpID4+IDI2OwogCQlpZiAoKHR1bi0+aWZfZmxhZ3MgJiBJRkZfUFJPTUlTQykgfHwKIAkJCQltZW1jbXAoYWRkciwgdHVuLT5kZXZfYWRkciwgc2l6ZW9mIGFkZHIpID09IDAgfHwKQEAgLTYzNiw2ICs2NDMsNyBAQAogCQlyZXR1cm4gMDsKIAogCWNhc2UgU0lPQ0dJRkhXQUREUjoKKwkJLyogTm90ZTogdGhlIGFjdHVhbCBuZXQgZGV2aWNlJ3MgYWRkcmVzcyBtYXkgYmUgZGlmZmVyZW50ICovCiAJCW1lbWNweShpZnIuaWZyX2h3YWRkci5zYV9kYXRhLCB0dW4tPmRldl9hZGRyLAogCQkJCW1pbihzaXplb2YgaWZyLmlmcl9od2FkZHIuc2FfZGF0YSwgc2l6ZW9mIHR1bi0+ZGV2X2FkZHIpKTsKIAkJaWYgKGNvcHlfdG9fdXNlciggYXJncCwgJmlmciwgc2l6ZW9mIGlmcikpCkBAIC02NDMsMTYgKzY1MSwyNCBAQAogCQlyZXR1cm4gMDsKIAogCWNhc2UgU0lPQ1NJRkhXQUREUjoKLQkJLyoqIFNldCB0aGUgY2hhcmFjdGVyIGRldmljZSdzIGhhcmR3YXJlIGFkZHJlc3MuIFRoaXMgaXMgdXNlZCB3aGVuCi0JCSAqIGZpbHRlcmluZyBwYWNrZXRzIGJlaW5nIHNlbnQgZnJvbSB0aGUgbmV0d29yayBkZXZpY2UgdG8gdGhlIGNoYXJhY3RlcgotCQkgKiBkZXZpY2UuICovCi0JCW1lbWNweSh0dW4tPmRldl9hZGRyLCBpZnIuaWZyX2h3YWRkci5zYV9kYXRhLAotCQkJCW1pbihzaXplb2YgaWZyLmlmcl9od2FkZHIuc2FfZGF0YSwgc2l6ZW9mIHR1bi0+ZGV2X2FkZHIpKTsKLQkJREJHKEtFUk5fREVCVUcgIiVzOiBzZXQgaGFyZHdhcmUgYWRkcmVzczogJXg6JXg6JXg6JXg6JXg6JXhcbiIsCi0JCQkJdHVuLT5kZXYtPm5hbWUsCi0JCQkJdHVuLT5kZXZfYWRkclswXSwgdHVuLT5kZXZfYWRkclsxXSwgdHVuLT5kZXZfYWRkclsyXSwKLQkJCQl0dW4tPmRldl9hZGRyWzNdLCB0dW4tPmRldl9hZGRyWzRdLCB0dW4tPmRldl9hZGRyWzVdKTsKLQkJcmV0dXJuIDA7CisJeworCQkvKiB0cnkgdG8gc2V0IHRoZSBhY3R1YWwgbmV0IGRldmljZSdzIGh3IGFkZHJlc3MgKi8KKwkJaW50IHJldCA9IGRldl9zZXRfbWFjX2FkZHJlc3ModHVuLT5kZXYsICZpZnIuaWZyX2h3YWRkcik7CisKKwkJaWYgKHJldCA9PSAwKSB7CisJCQkvKiogU2V0IHRoZSBjaGFyYWN0ZXIgZGV2aWNlJ3MgaGFyZHdhcmUgYWRkcmVzcy4gVGhpcyBpcyB1c2VkIHdoZW4KKwkJCSAqIGZpbHRlcmluZyBwYWNrZXRzIGJlaW5nIHNlbnQgZnJvbSB0aGUgbmV0d29yayBkZXZpY2UgdG8gdGhlIGNoYXJhY3RlcgorCQkJICogZGV2aWNlLiAqLworCQkJbWVtY3B5KHR1bi0+ZGV2X2FkZHIsIGlmci5pZnJfaHdhZGRyLnNhX2RhdGEsCisJCQkJCW1pbihzaXplb2YgaWZyLmlmcl9od2FkZHIuc2FfZGF0YSwgc2l6ZW9mIHR1bi0+ZGV2X2FkZHIpKTsKKwkJCURCRyhLRVJOX0RFQlVHICIlczogc2V0IGhhcmR3YXJlIGFkZHJlc3M6ICV4OiV4OiV4OiV4OiV4OiV4XG4iLAorCQkJCQl0dW4tPmRldi0+bmFtZSwKKwkJCQkJdHVuLT5kZXZfYWRkclswXSwgdHVuLT5kZXZfYWRkclsxXSwgdHVuLT5kZXZfYWRkclsyXSwKKwkJCQkJdHVuLT5kZXZfYWRkclszXSwgdHVuLT5kZXZfYWRkcls0XSwgdHVuLT5kZXZfYWRkcls1XSk7CisJCX0KKworCQlyZXR1cm4gIHJldDsKKwl9CiAKIAljYXNlIFNJT0NBRERNVUxUSToKIAkJLyoqIEFkZCB0aGUgc3BlY2lmaWVkIGdyb3VwIHRvIHRoZSBjaGFyYWN0ZXIgZGV2aWNlJ3MgbXVsdGljYXN0IGZpbHRlcgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdHlwaG9vbi5jIGIvZHJpdmVycy9uZXQvdHlwaG9vbi5jCmluZGV4IDBkOTFkMDkuLmYyZGQ3NzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3R5cGhvb24uYworKysgYi9kcml2ZXJzL25ldC90eXBob29uLmMKQEAgLTE3MDgsNyArMTcwOCw2IEBACiAKIAkJaWYocGt0X2xlbiA8IHJ4X2NvcHlicmVhayAmJgogCQkgICAobmV3X3NrYiA9IGRldl9hbGxvY19za2IocGt0X2xlbiArIDIpKSAhPSBOVUxMKSB7Ci0JCQluZXdfc2tiLT5kZXYgPSB0cC0+ZGV2OwogCQkJc2tiX3Jlc2VydmUobmV3X3NrYiwgMik7CiAJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUodHAtPnBkZXYsIGRtYV9hZGRyLAogCQkJCQkJICAgIFBLVF9CVUZfU1osCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC91Y2NfZ2V0aC5jIGIvZHJpdmVycy9uZXQvdWNjX2dldGguYwppbmRleCA2MzllMWU2Li4xNmI5YWNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC91Y2NfZ2V0aC5jCisrKyBiL2RyaXZlcnMvbmV0L3VjY19nZXRoLmMKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9mc2xfZGV2aWNlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KICNpbmNsdWRlIDxsaW51eC9taWkuaD4KKyNpbmNsdWRlIDxsaW51eC9waHkuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KIAogI2luY2x1ZGUgPGFzbS9vZl9wbGF0Zm9ybS5oPgpAQCAtNDEsMTIgKzQyLDEzIEBACiAjaW5jbHVkZSA8YXNtL3VjY19mYXN0Lmg+CiAKICNpbmNsdWRlICJ1Y2NfZ2V0aC5oIgotI2luY2x1ZGUgInVjY19nZXRoX3BoeS5oIgorI2luY2x1ZGUgInVjY19nZXRoX21paS5oIgogCiAjdW5kZWYgREVCVUcKIAotI2RlZmluZSBEUlZfREVTQyAiUUUgVUNDIEdpZ2FiaXQgRXRoZXJuZXQgQ29udHJvbGxlciB2ZXJzaW9uOlNlcHQgMTEsIDIwMDYiCisjZGVmaW5lIERSVl9ERVNDICJRRSBVQ0MgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyIgogI2RlZmluZSBEUlZfTkFNRSAidWNjX2dldGgiCisjZGVmaW5lIERSVl9WRVJTSU9OICIxLjEiCiAKICNkZWZpbmUgdWdldGhfcHJpbnRrKGxldmVsLCBmb3JtYXQsIGFyZy4uLikgIFwKICAgICAgICAgcHJpbnRrKGxldmVsIGZvcm1hdCAiXG4iLCAjIyBhcmcpCkBAIC03MywyMiArNzUsMTMgQEAKIAkJICAgIC5iZF9tZW1fcGFydCA9IE1FTV9QQVJUX1NZU1RFTSwKIAkJICAgIC5ydHNtID0gVUNDX0ZBU1RfU0VORF9JRExFU19CRVRXRUVOX0ZSQU1FUywKIAkJICAgIC5tYXhfcnhfYnVmX2xlbmd0aCA9IDE1MzYsCi0vKiBGSVhNRTogc2hvdWxkIGJlIGNoYW5nZWQgaW4gcnVuIHRpbWUgZm9yIDFHIGFuZCAxMDBNICovCi0jaWZkZWYgQ09ORklHX1VHRVRIX0hBU19HSUdBCi0JCSAgICAudXJmcyA9IFVDQ19HRVRIX1VSRlNfR0lHQV9JTklULAotCQkgICAgLnVyZmV0ID0gVUNDX0dFVEhfVVJGRVRfR0lHQV9JTklULAotCQkgICAgLnVyZnNldCA9IFVDQ19HRVRIX1VSRlNFVF9HSUdBX0lOSVQsCi0JCSAgICAudXRmcyA9IFVDQ19HRVRIX1VURlNfR0lHQV9JTklULAotCQkgICAgLnV0ZmV0ID0gVUNDX0dFVEhfVVRGRVRfR0lHQV9JTklULAotCQkgICAgLnV0ZnR0ID0gVUNDX0dFVEhfVVRGVFRfR0lHQV9JTklULAotI2Vsc2UKKwkJICAgIC8qIGFkanVzdGVkIGF0IHN0YXJ0dXAgaWYgbWF4LXNwZWVkIDEwMDAgKi8KIAkJICAgIC51cmZzID0gVUNDX0dFVEhfVVJGU19JTklULAogCQkgICAgLnVyZmV0ID0gVUNDX0dFVEhfVVJGRVRfSU5JVCwKIAkJICAgIC51cmZzZXQgPSBVQ0NfR0VUSF9VUkZTRVRfSU5JVCwKIAkJICAgIC51dGZzID0gVUNDX0dFVEhfVVRGU19JTklULAogCQkgICAgLnV0ZmV0ID0gVUNDX0dFVEhfVVRGRVRfSU5JVCwKIAkJICAgIC51dGZ0dCA9IFVDQ19HRVRIX1VURlRUX0lOSVQsCi0jZW5kaWYKIAkJICAgIC51ZnB0ID0gMjU2LAogCQkgICAgLm1vZGUgPSBVQ0NfRkFTVF9QUk9UT0NPTF9NT0RFX0VUSEVSTkVULAogCQkgICAgLnR0eF90cnggPSBVQ0NfRkFTVF9HVU1SX1RSQU5TUEFSRU5UX1RUWF9UUlhfTk9STUFMLApAQCAtMjE3LDcwICsyMTAsNiBAQAogCX0KIH0KIAotc3RhdGljIGludCBnZXRfaW50ZXJmYWNlX2RldGFpbHMoZW51bSBlbmV0X2ludGVyZmFjZSBlbmV0X2ludGVyZmFjZSwKLQkJCQkgZW51bSBlbmV0X3NwZWVkICpzcGVlZCwKLQkJCQkgaW50ICpyMTBtLAotCQkJCSBpbnQgKnJtbSwKLQkJCQkgaW50ICpycG0sCi0JCQkJIGludCAqdGJpLCBpbnQgKmxpbWl0ZWRfdG9fZnVsbF9kdXBsZXgpCi17Ci0JLyogQW5hbHl6ZSBlbmV0X2ludGVyZmFjZSBhY2NvcmRpbmcgdG8gSW50ZXJmYWNlIE1vZGUKLQlDb25maWd1cmF0aW9uIHRhYmxlICovCi0Jc3dpdGNoIChlbmV0X2ludGVyZmFjZSkgewotCWNhc2UgRU5FVF8xMF9NSUk6Ci0JCSpzcGVlZCA9IEVORVRfU1BFRURfMTBCVDsKLQkJYnJlYWs7Ci0JY2FzZSBFTkVUXzEwX1JNSUk6Ci0JCSpzcGVlZCA9IEVORVRfU1BFRURfMTBCVDsKLQkJKnIxMG0gPSAxOwotCQkqcm1tID0gMTsKLQkJYnJlYWs7Ci0JY2FzZSBFTkVUXzEwX1JHTUlJOgotCQkqc3BlZWQgPSBFTkVUX1NQRUVEXzEwQlQ7Ci0JCSpycG0gPSAxOwotCQkqcjEwbSA9IDE7Ci0JCSpsaW1pdGVkX3RvX2Z1bGxfZHVwbGV4ID0gMTsKLQkJYnJlYWs7Ci0JY2FzZSBFTkVUXzEwMF9NSUk6Ci0JCSpzcGVlZCA9IEVORVRfU1BFRURfMTAwQlQ7Ci0JCWJyZWFrOwotCWNhc2UgRU5FVF8xMDBfUk1JSToKLQkJKnNwZWVkID0gRU5FVF9TUEVFRF8xMDBCVDsKLQkJKnJtbSA9IDE7Ci0JCWJyZWFrOwotCWNhc2UgRU5FVF8xMDBfUkdNSUk6Ci0JCSpzcGVlZCA9IEVORVRfU1BFRURfMTAwQlQ7Ci0JCSpycG0gPSAxOwotCQkqbGltaXRlZF90b19mdWxsX2R1cGxleCA9IDE7Ci0JCWJyZWFrOwotCWNhc2UgRU5FVF8xMDAwX0dNSUk6Ci0JCSpzcGVlZCA9IEVORVRfU1BFRURfMTAwMEJUOwotCQkqbGltaXRlZF90b19mdWxsX2R1cGxleCA9IDE7Ci0JCWJyZWFrOwotCWNhc2UgRU5FVF8xMDAwX1JHTUlJOgotCQkqc3BlZWQgPSBFTkVUX1NQRUVEXzEwMDBCVDsKLQkJKnJwbSA9IDE7Ci0JCSpsaW1pdGVkX3RvX2Z1bGxfZHVwbGV4ID0gMTsKLQkJYnJlYWs7Ci0JY2FzZSBFTkVUXzEwMDBfVEJJOgotCQkqc3BlZWQgPSBFTkVUX1NQRUVEXzEwMDBCVDsKLQkJKnRiaSA9IDE7Ci0JCSpsaW1pdGVkX3RvX2Z1bGxfZHVwbGV4ID0gMTsKLQkJYnJlYWs7Ci0JY2FzZSBFTkVUXzEwMDBfUlRCSToKLQkJKnNwZWVkID0gRU5FVF9TUEVFRF8xMDAwQlQ7Ci0JCSpycG0gPSAxOwotCQkqdGJpID0gMTsKLQkJKmxpbWl0ZWRfdG9fZnVsbF9kdXBsZXggPSAxOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqZ2V0X25ld19za2Ioc3RydWN0IHVjY19nZXRoX3ByaXZhdGUgKnVnZXRoLCB1OCAqYmQpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CkBAIC03NTgsMjQgKzY4Nyw2IEBACiAJdWdldGhfaW5mbygiaGFmZHVwICAgICA6IGFkZHIgLSAweCUwOHgsIHZhbCAtIDB4JTA4eCIsCiAJCSAgICh1MzIpICYgdWdldGgtPnVnX3JlZ3MtPmhhZmR1cCwKIAkJICAgaW5fYmUzMigmdWdldGgtPnVnX3JlZ3MtPmhhZmR1cCkpOwotCXVnZXRoX2luZm8oIm1paW1jZmcgICAgOiBhZGRyIC0gMHglMDh4LCB2YWwgLSAweCUwOHgiLAotCQkgICAodTMyKSAmIHVnZXRoLT51Z19yZWdzLT5taWltbmcubWlpbWNmZywKLQkJICAgaW5fYmUzMigmdWdldGgtPnVnX3JlZ3MtPm1paW1uZy5taWltY2ZnKSk7Ci0JdWdldGhfaW5mbygibWlpbWNvbSAgICA6IGFkZHIgLSAweCUwOHgsIHZhbCAtIDB4JTA4eCIsCi0JCSAgICh1MzIpICYgdWdldGgtPnVnX3JlZ3MtPm1paW1uZy5taWltY29tLAotCQkgICBpbl9iZTMyKCZ1Z2V0aC0+dWdfcmVncy0+bWlpbW5nLm1paW1jb20pKTsKLQl1Z2V0aF9pbmZvKCJtaWltYWRkICAgIDogYWRkciAtIDB4JTA4eCwgdmFsIC0gMHglMDh4IiwKLQkJICAgKHUzMikgJiB1Z2V0aC0+dWdfcmVncy0+bWlpbW5nLm1paW1hZGQsCi0JCSAgIGluX2JlMzIoJnVnZXRoLT51Z19yZWdzLT5taWltbmcubWlpbWFkZCkpOwotCXVnZXRoX2luZm8oIm1paW1jb24gICAgOiBhZGRyIC0gMHglMDh4LCB2YWwgLSAweCUwOHgiLAotCQkgICAodTMyKSAmIHVnZXRoLT51Z19yZWdzLT5taWltbmcubWlpbWNvbiwKLQkJICAgaW5fYmUzMigmdWdldGgtPnVnX3JlZ3MtPm1paW1uZy5taWltY29uKSk7Ci0JdWdldGhfaW5mbygibWlpbXN0YXQgICA6IGFkZHIgLSAweCUwOHgsIHZhbCAtIDB4JTA4eCIsCi0JCSAgICh1MzIpICYgdWdldGgtPnVnX3JlZ3MtPm1paW1uZy5taWltc3RhdCwKLQkJICAgaW5fYmUzMigmdWdldGgtPnVnX3JlZ3MtPm1paW1uZy5taWltc3RhdCkpOwotCXVnZXRoX2luZm8oIm1paW1taW5kICAgOiBhZGRyIC0gMHglMDh4LCB2YWwgLSAweCUwOHgiLAotCQkgICAodTMyKSAmIHVnZXRoLT51Z19yZWdzLT5taWltbmcubWlpbWluZCwKLQkJICAgaW5fYmUzMigmdWdldGgtPnVnX3JlZ3MtPm1paW1uZy5taWltaW5kKSk7CiAJdWdldGhfaW5mbygiaWZjdGwgICAgICA6IGFkZHIgLSAweCUwOHgsIHZhbCAtIDB4JTA4eCIsCiAJCSAgICh1MzIpICYgdWdldGgtPnVnX3JlZ3MtPmlmY3RsLAogCQkgICBpbl9iZTMyKCZ1Z2V0aC0+dWdfcmVncy0+aWZjdGwpKTsKQEAgLTE0MjUsMjcgKzEzMzYsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGluaXRfbWFjX2R1cGxleF9tb2RlKGludCBmdWxsX2R1cGxleCwKLQkJCQlpbnQgbGltaXRlZF90b19mdWxsX2R1cGxleCwKLQkJCQl2b2xhdGlsZSB1MzIgKm1hY2NmZzJfcmVnaXN0ZXIpCi17Ci0JdTMyIHZhbHVlID0gMDsKLQotCS8qIHNvbWUgaW50ZXJmYWNlcyBtdXN0IHdvcmsgaW4gZnVsbCBkdXBsZXggbW9kZSAqLwotCWlmICgoZnVsbF9kdXBsZXggPT0gMCkgJiYgKGxpbWl0ZWRfdG9fZnVsbF9kdXBsZXggPT0gMSkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JdmFsdWUgPSBpbl9iZTMyKG1hY2NmZzJfcmVnaXN0ZXIpOwotCi0JaWYgKGZ1bGxfZHVwbGV4KQotCQl2YWx1ZSB8PSBNQUNDRkcyX0ZEWDsKLQllbHNlCi0JCXZhbHVlICY9IH5NQUNDRkcyX0ZEWDsKLQotCW91dF9iZTMyKG1hY2NmZzJfcmVnaXN0ZXIsIHZhbHVlKTsKLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBpbml0X2NoZWNrX2ZyYW1lX2xlbmd0aF9tb2RlKGludCBsZW5ndGhfY2hlY2ssCiAJCQkJCXZvbGF0aWxlIHUzMiAqbWFjY2ZnMl9yZWdpc3RlcikKIHsKQEAgLTE0NzcsNDAgKzEzNjcsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGluaXRfbWlpX21hbmFnZW1lbnRfY29uZmlndXJhdGlvbihpbnQgcmVzZXRfbWdtdCwKLQkJCQkJICAgICBpbnQgcHJlYW1ibGVfc3VwcmVzcywKLQkJCQkJICAgICB2b2xhdGlsZSB1MzIgKm1paW1jZmdfcmVnaXN0ZXIsCi0JCQkJCSAgICAgdm9sYXRpbGUgdTMyICptaWltaW5kX3JlZ2lzdGVyKQotewotCXVuc2lnbmVkIGludCB0aW1lb3V0ID0gUEhZX0lOSVRfVElNRU9VVDsKLQl1MzIgdmFsdWUgPSAwOwotCi0JdmFsdWUgPSBpbl9iZTMyKG1paW1jZmdfcmVnaXN0ZXIpOwotCWlmIChyZXNldF9tZ210KSB7Ci0JCXZhbHVlIHw9IE1JSU1DRkdfUkVTRVRfTUFOQUdFTUVOVDsKLQkJb3V0X2JlMzIobWlpbWNmZ19yZWdpc3RlciwgdmFsdWUpOwotCX0KLQotCXZhbHVlID0gMDsKLQotCWlmIChwcmVhbWJsZV9zdXByZXNzKQotCQl2YWx1ZSB8PSBNSUlNQ0ZHX05PX1BSRUFNQkxFOwotCi0JdmFsdWUgfD0gVUNDX0dFVEhfTUlJTUNGR19NTkdNTlRfQ0xDX0RJVl9JTklUOwotCW91dF9iZTMyKG1paW1jZmdfcmVnaXN0ZXIsIHZhbHVlKTsKLQotCS8qIFdhaXQgdW50aWwgdGhlIGJ1cyBpcyBmcmVlICovCi0Jd2hpbGUgKChpbl9iZTMyKG1paW1pbmRfcmVnaXN0ZXIpICYgTUlJTUlORF9CVVNZKSAmJiB0aW1lb3V0LS0pCi0JCWNwdV9yZWxheCgpOwotCi0JaWYgKHRpbWVvdXQgPD0gMCkgewotCQl1Z2V0aF9lcnIoIiVzOiBUaGUgTUlJIEJ1cyBpcyBzdHVjayEiLCBfX0ZVTkNUSU9OX18pOwotCQlyZXR1cm4gLUVUSU1FRE9VVDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBpbml0X3J4X3BhcmFtZXRlcnMoaW50IHJlamVjdF9icm9hZGNhc3QsCiAJCQkgICAgICBpbnQgcmVjZWl2ZV9zaG9ydF9mcmFtZXMsCiAJCQkgICAgICBpbnQgcHJvbWlzY3VvdXMsIHZvbGF0aWxlIHUzMiAqdXBzbXJfcmVnaXN0ZXIpCkBAIC0xNTcwLDEwICsxNDI2LDggQEAKIAlzdHJ1Y3QgdWNjX2dldGhfaW5mbyAqdWdfaW5mbzsKIAlzdHJ1Y3QgdWNjX2dldGggKnVnX3JlZ3M7CiAJc3RydWN0IHVjY19mYXN0ICp1Zl9yZWdzOwotCWVudW0gZW5ldF9zcGVlZCBzcGVlZDsKLQlpbnQgcmV0X3ZhbCwgcnBtID0gMCwgdGJpID0gMCwgcjEwbSA9IDAsIHJtbSA9Ci0JICAgIDAsIGxpbWl0ZWRfdG9fZnVsbF9kdXBsZXggPSAwOwotCXUzMiB1cHNtciwgbWFjY2ZnMiwgdXRiaXBhciwgdGJpQmFzZUFkZHJlc3M7CisJaW50IHJldF92YWw7CisJdTMyIHVwc21yLCBtYWNjZmcyLCB0YmlCYXNlQWRkcmVzczsKIAl1MTYgdmFsdWU7CiAKIAl1Z2V0aF92ZGJnKCIlczogSU4iLCBfX0ZVTkNUSU9OX18pOwpAQCAtMTU4MiwyNCArMTQzNiwxMyBAQAogCXVnX3JlZ3MgPSB1Z2V0aC0+dWdfcmVnczsKIAl1Zl9yZWdzID0gdWdldGgtPnVjY2YtPnVmX3JlZ3M7CiAKLQkvKiBBbmFseXplIGVuZXRfaW50ZXJmYWNlIGFjY29yZGluZyB0byBJbnRlcmZhY2UgTW9kZSBDb25maWd1cmF0aW9uCi0JdGFibGUgKi8KLQlyZXRfdmFsID0KLQkgICAgZ2V0X2ludGVyZmFjZV9kZXRhaWxzKHVnX2luZm8tPmVuZXRfaW50ZXJmYWNlLCAmc3BlZWQsICZyMTBtLCAmcm1tLAotCQkJCSAgJnJwbSwgJnRiaSwgJmxpbWl0ZWRfdG9fZnVsbF9kdXBsZXgpOwotCWlmIChyZXRfdmFsICE9IDApIHsKLQkJdWdldGhfZXJyCi0JCSAgKCIlczogaGFsZiBkdXBsZXggbm90IHN1cHBvcnRlZCBpbiByZXF1ZXN0ZWQgY29uZmlndXJhdGlvbi4iLAotCQkgICAgIF9fRlVOQ1RJT05fXyk7Ci0JCXJldHVybiByZXRfdmFsOwotCX0KLQogCS8qICAgICAgICAgICAgICAgICAgICBTZXQgTUFDQ0ZHMiAgICAgICAgICAgICAgICAgICAgKi8KIAltYWNjZmcyID0gaW5fYmUzMigmdWdfcmVncy0+bWFjY2ZnMik7CiAJbWFjY2ZnMiAmPSB+TUFDQ0ZHMl9JTlRFUkZBQ0VfTU9ERV9NQVNLOwotCWlmICgoc3BlZWQgPT0gRU5FVF9TUEVFRF8xMEJUKSB8fCAoc3BlZWQgPT0gRU5FVF9TUEVFRF8xMDBCVCkpCisJaWYgKCh1Z2V0aC0+bWF4X3NwZWVkID09IFNQRUVEXzEwKSB8fAorCSAgICAodWdldGgtPm1heF9zcGVlZCA9PSBTUEVFRF8xMDApKQogCQltYWNjZmcyIHw9IE1BQ0NGRzJfSU5URVJGQUNFX01PREVfTklCQkxFOwotCWVsc2UgaWYgKHNwZWVkID09IEVORVRfU1BFRURfMTAwMEJUKQorCWVsc2UgaWYgKHVnZXRoLT5tYXhfc3BlZWQgPT0gU1BFRURfMTAwMCkKIAkJbWFjY2ZnMiB8PSBNQUNDRkcyX0lOVEVSRkFDRV9NT0RFX0JZVEU7CiAJbWFjY2ZnMiB8PSB1Z19pbmZvLT5wYWRBbmRDcmM7CiAJb3V0X2JlMzIoJnVnX3JlZ3MtPm1hY2NmZzIsIG1hY2NmZzIpOwpAQCAtMTYwNyw1NCArMTQ1MCwzOSBAQAogCS8qICAgICAgICAgICAgICAgICAgICBTZXQgVVBTTVIgICAgICAgICAgICAgICAgICAgICAgKi8KIAl1cHNtciA9IGluX2JlMzIoJnVmX3JlZ3MtPnVwc21yKTsKIAl1cHNtciAmPSB+KFVQU01SX1JQTSB8IFVQU01SX1IxME0gfCBVUFNNUl9UQklNIHwgVVBTTVJfUk1NKTsKLQlpZiAocnBtKQorCWlmICgodWdldGgtPnBoeV9pbnRlcmZhY2UgPT0gUEhZX0lOVEVSRkFDRV9NT0RFX1JNSUkpIHx8CisJICAgICh1Z2V0aC0+cGh5X2ludGVyZmFjZSA9PSBQSFlfSU5URVJGQUNFX01PREVfUkdNSUkpIHx8CisJICAgICh1Z2V0aC0+cGh5X2ludGVyZmFjZSA9PSBQSFlfSU5URVJGQUNFX01PREVfUkdNSUlfSUQpIHx8CisJICAgICh1Z2V0aC0+cGh5X2ludGVyZmFjZSA9PSBQSFlfSU5URVJGQUNFX01PREVfUlRCSSkpIHsKIAkJdXBzbXIgfD0gVVBTTVJfUlBNOwotCWlmIChyMTBtKQotCQl1cHNtciB8PSBVUFNNUl9SMTBNOwotCWlmICh0YmkpCisJCXN3aXRjaCAodWdldGgtPm1heF9zcGVlZCkgeworCQljYXNlIFNQRUVEXzEwOgorCQkJdXBzbXIgfD0gVVBTTVJfUjEwTTsKKwkJCS8qIEZBTExUSFJPVUdIICovCisJCWNhc2UgU1BFRURfMTAwOgorCQkJaWYgKHVnZXRoLT5waHlfaW50ZXJmYWNlICE9IFBIWV9JTlRFUkZBQ0VfTU9ERV9SVEJJKQorCQkJCXVwc21yIHw9IFVQU01SX1JNTTsKKwkJfQorCX0KKwlpZiAoKHVnZXRoLT5waHlfaW50ZXJmYWNlID09IFBIWV9JTlRFUkZBQ0VfTU9ERV9UQkkpIHx8CisJICAgICh1Z2V0aC0+cGh5X2ludGVyZmFjZSA9PSBQSFlfSU5URVJGQUNFX01PREVfUlRCSSkpIHsKIAkJdXBzbXIgfD0gVVBTTVJfVEJJTTsKLQlpZiAocm1tKQotCQl1cHNtciB8PSBVUFNNUl9STU07CisJfQogCW91dF9iZTMyKCZ1Zl9yZWdzLT51cHNtciwgdXBzbXIpOwogCi0JLyogICAgICAgICAgICAgICAgICAgIFNldCBVVEJJUEFSICAgICAgICAgICAgICAgICAgICAqLwotCXV0YmlwYXIgPSBpbl9iZTMyKCZ1Z19yZWdzLT51dGJpcGFyKTsKLQl1dGJpcGFyICY9IH5VVEJJUEFSX1BIWV9BRERSRVNTX01BU0s7Ci0JaWYgKHRiaSkKLQkJdXRiaXBhciB8PQotCQkgICAgKHVnX2luZm8tPnBoeV9hZGRyZXNzICsKLQkJICAgICB1Z2V0aC0+dWdfaW5mby0+dWZfaW5mby4KLQkJICAgICB1Y2NfbnVtKSA8PCBVVEJJUEFSX1BIWV9BRERSRVNTX1NISUZUOwotCWVsc2UKLQkJdXRiaXBhciB8PQotCQkgICAgKDB4MTAgKwotCQkgICAgIHVnZXRoLT51Z19pbmZvLT51Zl9pbmZvLgotCQkgICAgIHVjY19udW0pIDw8IFVUQklQQVJfUEhZX0FERFJFU1NfU0hJRlQ7Ci0Jb3V0X2JlMzIoJnVnX3JlZ3MtPnV0YmlwYXIsIHV0YmlwYXIpOwotCiAJLyogRGlzYWJsZSBhdXRvbmVnb3RpYXRpb24gaW4gdGJpIG1vZGUsIGJlY2F1c2UgYnkgZGVmYXVsdCBpdAogCWNvbWVzIHVwIGluIGF1dG9uZWdvdGlhdGlvbiBtb2RlLiAqLwogCS8qIE5vdGUgdGhhdCB0aGlzIGRlcGVuZHMgb24gcHJvcGVyIHNldHRpbmcgaW4gdXRiaXBhciByZWdpc3Rlci4gKi8KLQlpZiAodGJpKSB7CisJaWYgKCh1Z2V0aC0+cGh5X2ludGVyZmFjZSA9PSBQSFlfSU5URVJGQUNFX01PREVfVEJJKSB8fAorCSAgICAodWdldGgtPnBoeV9pbnRlcmZhY2UgPT0gUEhZX0lOVEVSRkFDRV9NT0RFX1JUQkkpKSB7CiAJCXRiaUJhc2VBZGRyZXNzID0gaW5fYmUzMigmdWdfcmVncy0+dXRiaXBhcik7CiAJCXRiaUJhc2VBZGRyZXNzICY9IFVUQklQQVJfUEhZX0FERFJFU1NfTUFTSzsKIAkJdGJpQmFzZUFkZHJlc3MgPj49IFVUQklQQVJfUEhZX0FERFJFU1NfU0hJRlQ7Ci0JCXZhbHVlID0KLQkJICAgIHVnZXRoLT5taWlfaW5mby0+bWRpb19yZWFkKHVnZXRoLT5kZXYsICh1OCkgdGJpQmFzZUFkZHJlc3MsCi0JCQkJCSAgICAgICBFTkVUX1RCSV9NSUlfQ1IpOworCQl2YWx1ZSA9IHVnZXRoLT5waHlkZXYtPmJ1cy0+cmVhZCh1Z2V0aC0+cGh5ZGV2LT5idXMsCisJCQkJKHU4KSB0YmlCYXNlQWRkcmVzcywgRU5FVF9UQklfTUlJX0NSKTsKIAkJdmFsdWUgJj0gfjB4MTAwMDsJLyogVHVybiBvZmYgYXV0b25lZ290aWF0aW9uICovCi0JCXVnZXRoLT5taWlfaW5mby0+bWRpb193cml0ZSh1Z2V0aC0+ZGV2LCAodTgpIHRiaUJhc2VBZGRyZXNzLAotCQkJCQkgICAgRU5FVF9UQklfTUlJX0NSLCB2YWx1ZSk7Ci0JfQotCi0JcmV0X3ZhbCA9IGluaXRfbWFjX2R1cGxleF9tb2RlKDEsCi0JCQkJICAgICAgIGxpbWl0ZWRfdG9fZnVsbF9kdXBsZXgsCi0JCQkJICAgICAgICZ1Z19yZWdzLT5tYWNjZmcyKTsKLQlpZiAocmV0X3ZhbCAhPSAwKSB7Ci0JCXVnZXRoX2VycgotCQkoIiVzOiBoYWxmIGR1cGxleCBub3Qgc3VwcG9ydGVkIGluIHJlcXVlc3RlZCBjb25maWd1cmF0aW9uLiIsCi0JCSAgICAgX19GVU5DVElPTl9fKTsKLQkJcmV0dXJuIHJldF92YWw7CisJCXVnZXRoLT5waHlkZXYtPmJ1cy0+d3JpdGUodWdldGgtPnBoeWRldi0+YnVzLAorCQkJCSh1OCkgdGJpQmFzZUFkZHJlc3MsIEVORVRfVEJJX01JSV9DUiwgdmFsdWUpOwogCX0KIAogCWluaXRfY2hlY2tfZnJhbWVfbGVuZ3RoX21vZGUodWdfaW5mby0+bGVuZ3RoQ2hlY2tSeCwgJnVnX3JlZ3MtPm1hY2NmZzIpOwpAQCAtMTY3Niw3NiArMTUwNCw4OCBAQAogICogZnVuY3Rpb24gY29udmVydHMgdGhvc2UgdmFyaWFibGVzIGludG8gdGhlIGFwcHJvcHJpYXRlCiAgKiByZWdpc3RlciB2YWx1ZXMsIGFuZCBjYW4gYnJpbmcgZG93biB0aGUgZGV2aWNlIGlmIG5lZWRlZC4KICAqLworCiBzdGF0aWMgdm9pZCBhZGp1c3RfbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCB1Y2NfZ2V0aF9wcml2YXRlICp1Z2V0aCA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IHVjY19nZXRoICp1Z19yZWdzOwotCXUzMiB0ZW1wdmFsOwotCXN0cnVjdCB1Z2V0aF9taWlfaW5mbyAqbWlpX2luZm8gPSB1Z2V0aC0+bWlpX2luZm87CisJc3RydWN0IHVjY19mYXN0ICp1Zl9yZWdzOworCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYgPSB1Z2V0aC0+cGh5ZGV2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IG5ld19zdGF0ZSA9IDA7CiAKIAl1Z19yZWdzID0gdWdldGgtPnVnX3JlZ3M7CisJdWZfcmVncyA9IHVnZXRoLT51Y2NmLT51Zl9yZWdzOwogCi0JaWYgKG1paV9pbmZvLT5saW5rKSB7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnVnZXRoLT5sb2NrLCBmbGFncyk7CisKKwlpZiAocGh5ZGV2LT5saW5rKSB7CisJCXUzMiB0ZW1wdmFsID0gaW5fYmUzMigmdWdfcmVncy0+bWFjY2ZnMik7CisJCXUzMiB1cHNtciA9IGluX2JlMzIoJnVmX3JlZ3MtPnVwc21yKTsKIAkJLyogTm93IHdlIG1ha2Ugc3VyZSB0aGF0IHdlIGNhbiBiZSBpbiBmdWxsIGR1cGxleCBtb2RlLgogCQkgKiBJZiBub3QsIHdlIG9wZXJhdGUgaW4gaGFsZi1kdXBsZXggbW9kZS4gKi8KLQkJaWYgKG1paV9pbmZvLT5kdXBsZXggIT0gdWdldGgtPm9sZGR1cGxleCkgewotCQkJaWYgKCEobWlpX2luZm8tPmR1cGxleCkpIHsKLQkJCQl0ZW1wdmFsID0gaW5fYmUzMigmdWdfcmVncy0+bWFjY2ZnMik7CisJCWlmIChwaHlkZXYtPmR1cGxleCAhPSB1Z2V0aC0+b2xkZHVwbGV4KSB7CisJCQluZXdfc3RhdGUgPSAxOworCQkJaWYgKCEocGh5ZGV2LT5kdXBsZXgpKQogCQkJCXRlbXB2YWwgJj0gfihNQUNDRkcyX0ZEWCk7Ci0JCQkJb3V0X2JlMzIoJnVnX3JlZ3MtPm1hY2NmZzIsIHRlbXB2YWwpOwotCi0JCQkJdWdldGhfaW5mbygiJXM6IEhhbGYgRHVwbGV4IiwgZGV2LT5uYW1lKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGVtcHZhbCA9IGluX2JlMzIoJnVnX3JlZ3MtPm1hY2NmZzIpOworCQkJZWxzZQogCQkJCXRlbXB2YWwgfD0gTUFDQ0ZHMl9GRFg7Ci0JCQkJb3V0X2JlMzIoJnVnX3JlZ3MtPm1hY2NmZzIsIHRlbXB2YWwpOwotCi0JCQkJdWdldGhfaW5mbygiJXM6IEZ1bGwgRHVwbGV4IiwgZGV2LT5uYW1lKTsKLQkJCX0KLQotCQkJdWdldGgtPm9sZGR1cGxleCA9IG1paV9pbmZvLT5kdXBsZXg7CisJCQl1Z2V0aC0+b2xkZHVwbGV4ID0gcGh5ZGV2LT5kdXBsZXg7CiAJCX0KIAotCQlpZiAobWlpX2luZm8tPnNwZWVkICE9IHVnZXRoLT5vbGRzcGVlZCkgewotCQkJc3dpdGNoIChtaWlfaW5mby0+c3BlZWQpIHsKLQkJCWNhc2UgMTAwMDoKLQkJCQl1Z2V0aC0+dWdfaW5mby0+ZW5ldF9pbnRlcmZhY2UgPSBFTkVUXzEwMDBfUkdNSUk7CisJCWlmIChwaHlkZXYtPnNwZWVkICE9IHVnZXRoLT5vbGRzcGVlZCkgeworCQkJbmV3X3N0YXRlID0gMTsKKwkJCXN3aXRjaCAocGh5ZGV2LT5zcGVlZCkgeworCQkJY2FzZSBTUEVFRF8xMDAwOgorCQkJCXRlbXB2YWwgPSAoKHRlbXB2YWwgJgorCQkJCQkgICAgfihNQUNDRkcyX0lOVEVSRkFDRV9NT0RFX01BU0spKSB8CisJCQkJCSAgICBNQUNDRkcyX0lOVEVSRkFDRV9NT0RFX0JZVEUpOwogCQkJCWJyZWFrOwotCQkJY2FzZSAxMDA6Ci0JCQkJdWdldGgtPnVnX2luZm8tPmVuZXRfaW50ZXJmYWNlID0gRU5FVF8xMDBfUkdNSUk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDEwOgotCQkJCXVnZXRoLT51Z19pbmZvLT5lbmV0X2ludGVyZmFjZSA9IEVORVRfMTBfUkdNSUk7CisJCQljYXNlIFNQRUVEXzEwMDoKKwkJCWNhc2UgU1BFRURfMTA6CisJCQkJdGVtcHZhbCA9ICgodGVtcHZhbCAmCisJCQkJCSAgICB+KE1BQ0NGRzJfSU5URVJGQUNFX01PREVfTUFTSykpIHwKKwkJCQkJICAgIE1BQ0NGRzJfSU5URVJGQUNFX01PREVfTklCQkxFKTsKKwkJCQkvKiBpZiByZWR1Y2VkIG1vZGUsIHJlLXNldCBVUFNNUi5SMTBNICovCisJCQkJaWYgKCh1Z2V0aC0+cGh5X2ludGVyZmFjZSA9PSBQSFlfSU5URVJGQUNFX01PREVfUk1JSSkgfHwKKwkJCQkgICAgKHVnZXRoLT5waHlfaW50ZXJmYWNlID09IFBIWV9JTlRFUkZBQ0VfTU9ERV9SR01JSSkgfHwKKwkJCQkgICAgKHVnZXRoLT5waHlfaW50ZXJmYWNlID09IFBIWV9JTlRFUkZBQ0VfTU9ERV9SR01JSV9JRCkgfHwKKwkJCQkgICAgKHVnZXRoLT5waHlfaW50ZXJmYWNlID09IFBIWV9JTlRFUkZBQ0VfTU9ERV9SVEJJKSkgeworCQkJCQlpZiAocGh5ZGV2LT5zcGVlZCA9PSBTUEVFRF8xMCkKKwkJCQkJCXVwc21yIHw9IFVQU01SX1IxME07CisJCQkJCWVsc2UKKwkJCQkJCXVwc21yICY9IH4oVVBTTVJfUjEwTSk7CisJCQkJfQogCQkJCWJyZWFrOwogCQkJZGVmYXVsdDoKLQkJCQl1Z2V0aF93YXJuCi0JCQkJICAgICgiJXM6IEFjayEgIFNwZWVkICglZCkgaXMgbm90IDEwLzEwMC8xMDAwISIsCi0JCQkJICAgICBkZXYtPm5hbWUsIG1paV9pbmZvLT5zcGVlZCk7CisJCQkJaWYgKG5ldGlmX21zZ19saW5rKHVnZXRoKSkKKwkJCQkJdWdldGhfd2FybigKKwkJCQkJCSIlczogQWNrISAgU3BlZWQgKCVkKSBpcyBub3QgMTAvMTAwLzEwMDAhIiwKKwkJCQkJCWRldi0+bmFtZSwgcGh5ZGV2LT5zcGVlZCk7CiAJCQkJYnJlYWs7CiAJCQl9Ci0JCQlhZGp1c3RfZW5ldF9pbnRlcmZhY2UodWdldGgpOwotCi0JCQl1Z2V0aF9pbmZvKCIlczogU3BlZWQgJWRCVCIsIGRldi0+bmFtZSwKLQkJCQkgICBtaWlfaW5mby0+c3BlZWQpOwotCi0JCQl1Z2V0aC0+b2xkc3BlZWQgPSBtaWlfaW5mby0+c3BlZWQ7CisJCQl1Z2V0aC0+b2xkc3BlZWQgPSBwaHlkZXYtPnNwZWVkOwogCQl9CiAKKwkJb3V0X2JlMzIoJnVnX3JlZ3MtPm1hY2NmZzIsIHRlbXB2YWwpOworCQlvdXRfYmUzMigmdWZfcmVncy0+dXBzbXIsIHVwc21yKTsKKwogCQlpZiAoIXVnZXRoLT5vbGRsaW5rKSB7Ci0JCQl1Z2V0aF9pbmZvKCIlczogTGluayBpcyB1cCIsIGRldi0+bmFtZSk7CisJCQluZXdfc3RhdGUgPSAxOwogCQkJdWdldGgtPm9sZGxpbmsgPSAxOwotCQkJbmV0aWZfY2Fycmllcl9vbihkZXYpOwogCQkJbmV0aWZfc2NoZWR1bGUoZGV2KTsKIAkJfQotCX0gZWxzZSB7Ci0JCWlmICh1Z2V0aC0+b2xkbGluaykgewotCQkJdWdldGhfaW5mbygiJXM6IExpbmsgaXMgZG93biIsIGRldi0+bmFtZSk7CisJfSBlbHNlIGlmICh1Z2V0aC0+b2xkbGluaykgeworCQkJbmV3X3N0YXRlID0gMTsKIAkJCXVnZXRoLT5vbGRsaW5rID0gMDsKIAkJCXVnZXRoLT5vbGRzcGVlZCA9IDA7CiAJCQl1Z2V0aC0+b2xkZHVwbGV4ID0gLTE7Ci0JCQluZXRpZl9jYXJyaWVyX29mZihkZXYpOwotCQl9CiAJfQorCisJaWYgKG5ld19zdGF0ZSAmJiBuZXRpZl9tc2dfbGluayh1Z2V0aCkpCisJCXBoeV9wcmludF9zdGF0dXMocGh5ZGV2KTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVnZXRoLT5sb2NrLCBmbGFncyk7CiB9CiAKIC8qIENvbmZpZ3VyZSB0aGUgUEhZIGZvciBkZXYuCkBAIC0xNzUzLDEwMiArMTU5Myw0MCBAQAogICovCiBzdGF0aWMgaW50IGluaXRfcGh5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IHVjY19nZXRoX3ByaXZhdGUgKnVnZXRoID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlzdHJ1Y3QgcGh5X2luZm8gKmN1cnBoeTsKLQlzdHJ1Y3QgdWNjX21paV9tbmcgKm1paV9yZWdzOwotCXN0cnVjdCB1Z2V0aF9taWlfaW5mbyAqbWlpX2luZm87Ci0JaW50IGVycjsKKwlzdHJ1Y3QgdWNjX2dldGhfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldjsKKwljaGFyIHBoeV9pZFtCVVNfSURfU0laRV07CiAKLQltaWlfcmVncyA9ICZ1Z2V0aC0+dWdfcmVncy0+bWlpbW5nOworCXByaXYtPm9sZGxpbmsgPSAwOworCXByaXYtPm9sZHNwZWVkID0gMDsKKwlwcml2LT5vbGRkdXBsZXggPSAtMTsKIAotCXVnZXRoLT5vbGRsaW5rID0gMDsKLQl1Z2V0aC0+b2xkc3BlZWQgPSAwOwotCXVnZXRoLT5vbGRkdXBsZXggPSAtMTsKKwlzbnByaW50ZihwaHlfaWQsIEJVU19JRF9TSVpFLCBQSFlfSURfRk1ULCBwcml2LT51Z19pbmZvLT5tZGlvX2J1cywKKwkJCXByaXYtPnVnX2luZm8tPnBoeV9hZGRyZXNzKTsKIAotCW1paV9pbmZvID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHVnZXRoX21paV9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJcGh5ZGV2ID0gcGh5X2Nvbm5lY3QoZGV2LCBwaHlfaWQsICZhZGp1c3RfbGluaywgMCwgcHJpdi0+cGh5X2ludGVyZmFjZSk7CiAKLQlpZiAoTlVMTCA9PSBtaWlfaW5mbykgewotCQl1Z2V0aF9lcnIoIiVzOiBDb3VsZCBub3QgYWxsb2NhdGUgbWlpX2luZm8iLCBkZXYtPm5hbWUpOwotCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAoSVNfRVJSKHBoeWRldikpIHsKKwkJcHJpbnRrKCIlczogQ291bGQgbm90IGF0dGFjaCB0byBQSFlcbiIsIGRldi0+bmFtZSk7CisJCXJldHVybiBQVFJfRVJSKHBoeWRldik7CiAJfQogCi0JbWlpX2luZm8tPm1paV9yZWdzID0gbWlpX3JlZ3M7Ci0JbWlpX2luZm8tPnNwZWVkID0gU1BFRURfMTAwMDsKLQltaWlfaW5mby0+ZHVwbGV4ID0gRFVQTEVYX0ZVTEw7Ci0JbWlpX2luZm8tPnBhdXNlID0gMDsKLQltaWlfaW5mby0+bGluayA9IDA7Ci0KLQltaWlfaW5mby0+YWR2ZXJ0aXNpbmcgPSAoQURWRVJUSVNFRF8xMGJhc2VUX0hhbGYgfAorCXBoeWRldi0+c3VwcG9ydGVkICY9IChBRFZFUlRJU0VEXzEwYmFzZVRfSGFsZiB8CiAJCQkJIEFEVkVSVElTRURfMTBiYXNlVF9GdWxsIHwKIAkJCQkgQURWRVJUSVNFRF8xMDBiYXNlVF9IYWxmIHwKLQkJCQkgQURWRVJUSVNFRF8xMDBiYXNlVF9GdWxsIHwKLQkJCQkgQURWRVJUSVNFRF8xMDAwYmFzZVRfRnVsbCk7Ci0JbWlpX2luZm8tPmF1dG9uZWcgPSAxOworCQkJCSBBRFZFUlRJU0VEXzEwMGJhc2VUX0Z1bGwpOwogCi0JbWlpX2luZm8tPm1paV9pZCA9IHVnZXRoLT51Z19pbmZvLT5waHlfYWRkcmVzczsKKwlpZiAocHJpdi0+bWF4X3NwZWVkID09IFNQRUVEXzEwMDApCisJCXBoeWRldi0+c3VwcG9ydGVkIHw9IEFEVkVSVElTRURfMTAwMGJhc2VUX0Z1bGw7CiAKLQltaWlfaW5mby0+ZGV2ID0gZGV2OworCXBoeWRldi0+YWR2ZXJ0aXNpbmcgPSBwaHlkZXYtPnN1cHBvcnRlZDsKIAotCW1paV9pbmZvLT5tZGlvX3JlYWQgPSAmcmVhZF9waHlfcmVnOwotCW1paV9pbmZvLT5tZGlvX3dyaXRlID0gJndyaXRlX3BoeV9yZWc7Ci0KLQlzcGluX2xvY2tfaW5pdCgmbWlpX2luZm8tPm1kaW9fbG9jayk7Ci0KLQl1Z2V0aC0+bWlpX2luZm8gPSBtaWlfaW5mbzsKLQotCXNwaW5fbG9ja19pcnEoJnVnZXRoLT5sb2NrKTsKLQotCS8qIFNldCB0aGlzIFVDQyB0byBiZSB0aGUgbWFzdGVyIG9mIHRoZSBNSUkgbWFuYWdtZW50ICovCi0JdWNjX3NldF9xZV9tdXhfbWlpX21uZyh1Z2V0aC0+dWdfaW5mby0+dWZfaW5mby51Y2NfbnVtKTsKLQotCWlmIChpbml0X21paV9tYW5hZ2VtZW50X2NvbmZpZ3VyYXRpb24oMSwKLQkJCQkJICAgICAgdWdldGgtPnVnX2luZm8tPgotCQkJCQkgICAgICBtaWlQcmVhbWJsZVN1cHJlc3MsCi0JCQkJCSAgICAgICZtaWlfcmVncy0+bWlpbWNmZywKLQkJCQkJICAgICAgJm1paV9yZWdzLT5taWltaW5kKSkgewotCQl1Z2V0aF9lcnIoIiVzOiBUaGUgTUlJIEJ1cyBpcyBzdHVjayEiLCBkZXYtPm5hbWUpOwotCQllcnIgPSAtMTsKLQkJZ290byBidXNfZmFpbDsKLQl9Ci0KLQlzcGluX3VubG9ja19pcnEoJnVnZXRoLT5sb2NrKTsKLQotCS8qIGdldCBpbmZvIGZvciB0aGlzIFBIWSAqLwotCWN1cnBoeSA9IGdldF9waHlfaW5mbyh1Z2V0aC0+bWlpX2luZm8pOwotCi0JaWYgKGN1cnBoeSA9PSBOVUxMKSB7Ci0JCXVnZXRoX2VycigiJXM6IE5vIFBIWSBmb3VuZCIsIGRldi0+bmFtZSk7Ci0JCWVyciA9IC0xOwotCQlnb3RvIG5vX3BoeTsKLQl9Ci0KLQltaWlfaW5mby0+cGh5aW5mbyA9IGN1cnBoeTsKLQotCS8qIFJ1biB0aGUgY29tbWFuZHMgd2hpY2ggaW5pdGlhbGl6ZSB0aGUgUEhZICovCi0JaWYgKGN1cnBoeS0+aW5pdCkgewotCQllcnIgPSBjdXJwaHktPmluaXQodWdldGgtPm1paV9pbmZvKTsKLQkJaWYgKGVycikKLQkJCWdvdG8gcGh5X2luaXRfZmFpbDsKLQl9Ci0KLQlyZXR1cm4gMDsKLQotICAgICAgcGh5X2luaXRfZmFpbDoKLSAgICAgIG5vX3BoeToKLSAgICAgIGJ1c19mYWlsOgotCWtmcmVlKG1paV9pbmZvKTsKLQotCXJldHVybiBlcnI7Ci19Ci0KLSNpZmRlZiBDT05GSUdfVUdFVEhfVFhfT05fREVNT05ECi1zdGF0aWMgaW50IHVnZXRoX3RyYW5zbWl0X29uX2RlbWFuZChzdHJ1Y3QgdWNjX2dldGhfcHJpdmF0ZSAqdWdldGgpCi17Ci0Jc3RydWN0IHVjY19mYXN0cmFuc21pdF9vbl9kZW1hbmQodWdldGgtPnVjY2YpOworCXByaXYtPnBoeWRldiA9IHBoeWRldjsKIAogCXJldHVybiAwOwogfQotI2VuZGlmCisKKwogCiBzdGF0aWMgaW50IHVnZXRoX2dyYWNlZnVsX3N0b3BfdHgoc3RydWN0IHVjY19nZXRoX3ByaXZhdGUgKnVnZXRoKQogewpAQCAtMjM1Niw2ICsyMTM0LDggQEAKIAl9CiAJZm9yIChpID0gMDsgaSA8IHVnZXRoLT51Z19pbmZvLT5udW1RdWV1ZXNUeDsgaSsrKSB7CiAJCWJkID0gdWdldGgtPnBfdHhfYmRfcmluZ1tpXTsKKwkJaWYgKCFiZCkKKwkJCWNvbnRpbnVlOwogCQlmb3IgKGogPSAwOyBqIDwgdWdldGgtPnVnX2luZm8tPmJkUmluZ0xlblR4W2ldOyBqKyspIHsKIAkJCWlmICh1Z2V0aC0+dHhfc2tidWZmW2ldW2pdKSB7CiAJCQkJZG1hX3VubWFwX3NpbmdsZShOVUxMLApAQCAtMjQ4Nyw2ICsyMjY3LDcgQEAKIHN0YXRpYyB2b2lkIHVjY19nZXRoX3N0b3Aoc3RydWN0IHVjY19nZXRoX3ByaXZhdGUgKnVnZXRoKQogewogCXN0cnVjdCB1Y2NfZ2V0aCAqdWdfcmVncyA9IHVnZXRoLT51Z19yZWdzOworCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYgPSB1Z2V0aC0+cGh5ZGV2OwogCXUzMiB0ZW1wdmFsOwogCiAJdWdldGhfdmRiZygiJXM6IElOIiwgX19GVU5DVElPTl9fKTsKQEAgLTI0OTUsOCArMjI3Niw3IEBACiAJdWdldGhfZGlzYWJsZSh1Z2V0aCwgQ09NTV9ESVJfUlhfQU5EX1RYKTsKIAogCS8qIFRlbGwgdGhlIGtlcm5lbCB0aGUgbGluayBpcyBkb3duICovCi0JdWdldGgtPm1paV9pbmZvLT5saW5rID0gMDsKLQlhZGp1c3RfbGluayh1Z2V0aC0+ZGV2KTsKKwlwaHlfc3RvcChwaHlkZXYpOwogCiAJLyogTWFzayBhbGwgaW50ZXJydXB0cyAqLwogCW91dF9iZTMyKHVnZXRoLT51Y2NmLT5wX3VjY2UsIDB4MDAwMDAwMDApOwpAQCAtMjUwOSw1MCArMjI4OSwyNCBAQAogCXRlbXB2YWwgJj0gfihNQUNDRkcxX0VOQUJMRV9SWCB8IE1BQ0NGRzFfRU5BQkxFX1RYKTsKIAlvdXRfYmUzMigmdWdfcmVncy0+bWFjY2ZnMSwgdGVtcHZhbCk7CiAKLQlpZiAodWdldGgtPnVnX2luZm8tPmJvYXJkX2ZsYWdzICYgRlNMX1VHRVRIX0JSRF9IQVNfUEhZX0lOVFIpIHsKLQkJLyogQ2xlYXIgYW55IHBlbmRpbmcgaW50ZXJydXB0cyAqLwotCQltaWlfY2xlYXJfcGh5X2ludGVycnVwdCh1Z2V0aC0+bWlpX2luZm8pOwotCi0JCS8qIERpc2FibGUgUEhZIEludGVycnVwdHMgKi8KLQkJbWlpX2NvbmZpZ3VyZV9waHlfaW50ZXJydXB0KHVnZXRoLT5taWlfaW5mbywKLQkJCQkJICAgIE1JSV9JTlRFUlJVUFRfRElTQUJMRUQpOwotCX0KLQogCWZyZWVfaXJxKHVnZXRoLT51Z19pbmZvLT51Zl9pbmZvLmlycSwgdWdldGgtPmRldik7CiAKLQlpZiAodWdldGgtPnVnX2luZm8tPmJvYXJkX2ZsYWdzICYgRlNMX1VHRVRIX0JSRF9IQVNfUEhZX0lOVFIpIHsKLQkJZnJlZV9pcnEodWdldGgtPnVnX2luZm8tPnBoeV9pbnRlcnJ1cHQsIHVnZXRoLT5kZXYpOwotCX0gZWxzZSB7Ci0JCWRlbF90aW1lcl9zeW5jKCZ1Z2V0aC0+cGh5X2luZm9fdGltZXIpOwotCX0KLQogCXVjY19nZXRoX21lbWNsZWFuKHVnZXRoKTsKIH0KIAotc3RhdGljIGludCB1Y2NfZ2V0aF9zdGFydHVwKHN0cnVjdCB1Y2NfZ2V0aF9wcml2YXRlICp1Z2V0aCkKK3N0YXRpYyBpbnQgdWNjX3N0cnVjdF9pbml0KHN0cnVjdCB1Y2NfZ2V0aF9wcml2YXRlICp1Z2V0aCkKIHsKLQlzdHJ1Y3QgdWNjX2dldGhfODJ4eF9hZGRyZXNzX2ZpbHRlcmluZ19wcmFtICpwXzgyeHhfYWRkcl9maWx0OwotCXN0cnVjdCB1Y2NfZ2V0aF9pbml0X3ByYW0gKnBfaW5pdF9lbmV0X3ByYW07Ci0Jc3RydWN0IHVjY19mYXN0X3ByaXZhdGUgKnVjY2Y7CiAJc3RydWN0IHVjY19nZXRoX2luZm8gKnVnX2luZm87CiAJc3RydWN0IHVjY19mYXN0X2luZm8gKnVmX2luZm87Ci0Jc3RydWN0IHVjY19mYXN0ICp1Zl9yZWdzOwotCXN0cnVjdCB1Y2NfZ2V0aCAqdWdfcmVnczsKLQlpbnQgcmV0X3ZhbCA9IC1FSU5WQUw7Ci0JdTMyIHJlbW9kZXIgPSBVQ0NfR0VUSF9SRU1PREVSX0lOSVQ7Ci0JdTMyIGluaXRfZW5ldF9wcmFtX29mZnNldCwgY2Vjcl9zdWJibG9jaywgY29tbWFuZCwgbWFjY2ZnMTsKLQl1MzIgaWZzdGF0LCBpLCBqLCBzaXplLCBsMnF0LCBsM3F0LCBsZW5ndGg7Ci0JdTE2IHRlbW9kZXIgPSBVQ0NfR0VUSF9URU1PREVSX0lOSVQ7Ci0JdTE2IHRlc3Q7Ci0JdTggZnVuY3Rpb25fY29kZSA9IDA7Ci0JdTggKmJkLCAqZW5kT2ZSaW5nOwotCXU4IG51bVRocmVhZHNSeE51bWVyaWNhbCwgbnVtVGhyZWFkc1R4TnVtZXJpY2FsOwotCi0JdWdldGhfdmRiZygiJXM6IElOIiwgX19GVU5DVElPTl9fKTsKKwlpbnQgaTsKIAogCXVnX2luZm8gPSB1Z2V0aC0+dWdfaW5mbzsKIAl1Zl9pbmZvID0gJnVnX2luZm8tPnVmX2luZm87CiAKKwkvKiBDcmVhdGUgQ1FzIGZvciBoYXNoIHRhYmxlcyAqLworCUlOSVRfTElTVF9IRUFEKCZ1Z2V0aC0+Z3JvdXBfaGFzaF9xKTsKKwlJTklUX0xJU1RfSEVBRCgmdWdldGgtPmluZF9oYXNoX3EpOworCiAJaWYgKCEoKHVmX2luZm8tPmJkX21lbV9wYXJ0ID09IE1FTV9QQVJUX1NZU1RFTSkgfHwKIAkgICAgICAodWZfaW5mby0+YmRfbWVtX3BhcnQgPT0gTUVNX1BBUlRfTVVSQU0pKSkgewogCQl1Z2V0aF9lcnIoIiVzOiBCYWQgbWVtb3J5IHBhcnRpdGlvbiB2YWx1ZS4iLCBfX0ZVTkNUSU9OX18pOwpAQCAtMjY0NywxMiArMjQwMSw0MiBAQAogCWZvciAoaSA9IDA7IGkgPCB1Z19pbmZvLT5udW1RdWV1ZXNUeDsgaSsrKQogCQl1Zl9pbmZvLT51Y2NtX21hc2sgfD0gKFVDQ0VfVFhCRl9TSU5HTEVfTUFTSyA8PCBpKTsKIAkvKiBJbml0aWFsaXplIHRoZSBnZW5lcmFsIGZhc3QgVUNDIGJsb2NrLiAqLwotCWlmICh1Y2NfZmFzdF9pbml0KHVmX2luZm8sICZ1Y2NmKSkgeworCWlmICh1Y2NfZmFzdF9pbml0KHVmX2luZm8sICZ1Z2V0aC0+dWNjZikpIHsKIAkJdWdldGhfZXJyKCIlczogRmFpbGVkIHRvIGluaXQgdWNjZi4iLCBfX0ZVTkNUSU9OX18pOwogCQl1Y2NfZ2V0aF9tZW1jbGVhbih1Z2V0aCk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KLQl1Z2V0aC0+dWNjZiA9IHVjY2Y7CisKKwl1Z2V0aC0+dWdfcmVncyA9IChzdHJ1Y3QgdWNjX2dldGggKikgaW9yZW1hcCh1Zl9pbmZvLT5yZWdzLCBzaXplb2Yoc3RydWN0IHVjY19nZXRoKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1Y2NfZ2V0aF9zdGFydHVwKHN0cnVjdCB1Y2NfZ2V0aF9wcml2YXRlICp1Z2V0aCkKK3sKKwlzdHJ1Y3QgdWNjX2dldGhfODJ4eF9hZGRyZXNzX2ZpbHRlcmluZ19wcmFtICpwXzgyeHhfYWRkcl9maWx0OworCXN0cnVjdCB1Y2NfZ2V0aF9pbml0X3ByYW0gKnBfaW5pdF9lbmV0X3ByYW07CisJc3RydWN0IHVjY19mYXN0X3ByaXZhdGUgKnVjY2Y7CisJc3RydWN0IHVjY19nZXRoX2luZm8gKnVnX2luZm87CisJc3RydWN0IHVjY19mYXN0X2luZm8gKnVmX2luZm87CisJc3RydWN0IHVjY19mYXN0ICp1Zl9yZWdzOworCXN0cnVjdCB1Y2NfZ2V0aCAqdWdfcmVnczsKKwlpbnQgcmV0X3ZhbCA9IC1FSU5WQUw7CisJdTMyIHJlbW9kZXIgPSBVQ0NfR0VUSF9SRU1PREVSX0lOSVQ7CisJdTMyIGluaXRfZW5ldF9wcmFtX29mZnNldCwgY2Vjcl9zdWJibG9jaywgY29tbWFuZCwgbWFjY2ZnMTsKKwl1MzIgaWZzdGF0LCBpLCBqLCBzaXplLCBsMnF0LCBsM3F0LCBsZW5ndGg7CisJdTE2IHRlbW9kZXIgPSBVQ0NfR0VUSF9URU1PREVSX0lOSVQ7CisJdTE2IHRlc3Q7CisJdTggZnVuY3Rpb25fY29kZSA9IDA7CisJdTggKmJkLCAqZW5kT2ZSaW5nOworCXU4IG51bVRocmVhZHNSeE51bWVyaWNhbCwgbnVtVGhyZWFkc1R4TnVtZXJpY2FsOworCisJdWdldGhfdmRiZygiJXM6IElOIiwgX19GVU5DVElPTl9fKTsKKwl1Y2NmID0gdWdldGgtPnVjY2Y7CisJdWdfaW5mbyA9IHVnZXRoLT51Z19pbmZvOworCXVmX2luZm8gPSAmdWdfaW5mby0+dWZfaW5mbzsKKwl1Zl9yZWdzID0gdWNjZi0+dWZfcmVnczsKKwl1Z19yZWdzID0gdWdldGgtPnVnX3JlZ3M7CiAKIAlzd2l0Y2ggKHVnX2luZm8tPm51bVRocmVhZHNSeCkgewogCWNhc2UgVUNDX0dFVEhfTlVNX09GX1RIUkVBRFNfMToKQEAgLTI3MTEsMTAgKzI0OTUsNiBAQAogCSAgICB8fCAodWdfaW5mby0+dmxhbk9wZXJhdGlvbk5vblRhZ2dlZCAhPQogCQlVQ0NfR0VUSF9WTEFOX09QRVJBVElPTl9OT05fVEFHR0VEX05PUCk7CiAKLQl1Zl9yZWdzID0gdWNjZi0+dWZfcmVnczsKLQl1Z19yZWdzID0gKHN0cnVjdCB1Y2NfZ2V0aCAqKSAodWNjZi0+dWZfcmVncyk7Ci0JdWdldGgtPnVnX3JlZ3MgPSB1Z19yZWdzOwotCiAJaW5pdF9kZWZhdWx0X3JlZ192YWxzKCZ1Zl9yZWdzLT51cHNtciwKIAkJCSAgICAgICZ1Z19yZWdzLT5tYWNjZmcxLCAmdWdfcmVncy0+bWFjY2ZnMik7CiAKQEAgLTMxNzcsOCArMjk1Nyw4IEBACiAJLyogU2l6ZSB2YXJpZXMgd2l0aCBudW1iZXIgb2YgUnggcXVldWVzICovCiAJdWdldGgtPnJ4X2lycV9jb2FsZXNjaW5nX3RibF9vZmZzZXQgPQogCSAgICBxZV9tdXJhbV9hbGxvYyh1Z19pbmZvLT5udW1RdWV1ZXNSeCAqCi0JCQkgICBzaXplb2Yoc3RydWN0IHVjY19nZXRoX3J4X2ludGVycnVwdF9jb2FsZXNjaW5nX2VudHJ5KSwKLQkJCSAgIFVDQ19HRVRIX1JYX0lOVEVSUlVQVF9DT0FMRVNDSU5HX0FMSUdOTUVOVCk7CisJCQkgICBzaXplb2Yoc3RydWN0IHVjY19nZXRoX3J4X2ludGVycnVwdF9jb2FsZXNjaW5nX2VudHJ5KQorCQkJICAgKyA0LCBVQ0NfR0VUSF9SWF9JTlRFUlJVUFRfQ09BTEVTQ0lOR19BTElHTk1FTlQpOwogCWlmIChJU19NVVJBTV9FUlIodWdldGgtPnJ4X2lycV9jb2FsZXNjaW5nX3RibF9vZmZzZXQpKSB7CiAJCXVnZXRoX2VycgogCQkgICAgKCIlczogQ2FuIG5vdCBhbGxvY2F0ZSBEUFJBTSBtZW1vcnkgZm9yIgpAQCAtMzM1OSwxMyArMzEzOSw2IEBACiAJCWZvciAoaiA9IDA7IGogPCBOVU1fT0ZfUEFERFJTOyBqKyspCiAJCQl1Z2V0aF84Mnh4X2ZpbHRlcmluZ19jbGVhcl9hZGRyX2luX3BhZGRyKHVnZXRoLCAodTgpIGopOwogCi0JCS8qIENyZWF0ZSBDUXMgZm9yIGhhc2ggdGFibGVzICovCi0JCWlmICh1Z19pbmZvLT5tYXhHcm91cEFkZHJJbkhhc2ggPiAwKSB7Ci0JCQlJTklUX0xJU1RfSEVBRCgmdWdldGgtPmdyb3VwX2hhc2hfcSk7Ci0JCX0KLQkJaWYgKHVnX2luZm8tPm1heEluZEFkZHJJbkhhc2ggPiAwKSB7Ci0JCQlJTklUX0xJU1RfSEVBRCgmdWdldGgtPmluZF9oYXNoX3EpOwotCQl9CiAJCXBfODJ4eF9hZGRyX2ZpbHQgPQogCQkgICAgKHN0cnVjdCB1Y2NfZ2V0aF84Mnh4X2FkZHJlc3NfZmlsdGVyaW5nX3ByYW0gKikgdWdldGgtPgogCQkgICAgcF9yeF9nbGJsX3ByYW0tPmFkZHJlc3NmaWx0ZXJpbmc7CkBAIC0zNTYyLDYgKzMzMzUsOSBAQAogc3RhdGljIGludCB1Y2NfZ2V0aF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHVjY19nZXRoX3ByaXZhdGUgKnVnZXRoID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyNpZmRlZiBDT05GSUdfVUdFVEhfVFhfT05fREVNQU5ECisJc3RydWN0IHVjY19mYXN0X3ByaXZhdGUgKnVjY2Y7CisjZW5kaWYKIAl1OCAqYmQ7CQkJLyogQkQgcG9pbnRlciAqLwogCXUzMiBiZF9zdGF0dXM7CiAJdTggdHhRID0gMDsKQEAgLTM2MjAsNiArMzM5NiwxMCBAQAogCQlvdXRfYmUxNih1Z2V0aC0+cF9jcHVjb3VudFt0eFFdLCB1Z2V0aC0+Y3B1Y291bnRbdHhRXSk7CiAJfQogCisjaWZkZWYgQ09ORklHX1VHRVRIX1RYX09OX0RFTUFORAorCXVjY2YgPSB1Z2V0aC0+dWNjZjsKKwlvdXRfYmUxNih1Y2NmLT5wX3V0b2RyLCBVQ0NfRkFTVF9UT0QpOworI2VuZGlmCiAJc3Bpbl91bmxvY2tfaXJxKCZ1Z2V0aC0+bG9jayk7CiAKIAlyZXR1cm4gMDsKQEAgLTM2MzUsNyArMzQxNSw2IEBACiAKIAl1Z2V0aF92ZGJnKCIlczogSU4iLCBfX0ZVTkNUSU9OX18pOwogCi0Jc3Bpbl9sb2NrKCZ1Z2V0aC0+bG9jayk7CiAJLyogY29sbGVjdCByZWNlaXZlZCBidWZmZXJzICovCiAJYmQgPSB1Z2V0aC0+cnhCZFtyeFFdOwogCkBAIC0zNjgzLDcgKzM0NjIsNiBAQAogCQlza2IgPSBnZXRfbmV3X3NrYih1Z2V0aCwgYmQpOwogCQlpZiAoIXNrYikgewogCQkJdWdldGhfd2FybigiJXM6IE5vIFJ4IERhdGEgQnVmZmVyIiwgX19GVU5DVElPTl9fKTsKLQkJCXNwaW5fdW5sb2NrKCZ1Z2V0aC0+bG9jayk7CiAJCQl1Z2V0aC0+c3RhdHMucnhfZHJvcHBlZCsrOwogCQkJYnJlYWs7CiAJCX0KQEAgLTM3MDQsNyArMzQ4Miw2IEBACiAJfQogCiAJdWdldGgtPnJ4QmRbcnhRXSA9IGJkOwotCXNwaW5fdW5sb2NrKCZ1Z2V0aC0+bG9jayk7CiAJcmV0dXJuIGhvd21hbnk7CiB9CiAKQEAgLTM3NTYsMjMgKzM1MzMsMzggQEAKIHN0YXRpYyBpbnQgdWNjX2dldGhfcG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgKmJ1ZGdldCkKIHsKIAlzdHJ1Y3QgdWNjX2dldGhfcHJpdmF0ZSAqdWdldGggPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCB1Y2NfZ2V0aF9pbmZvICp1Z19pbmZvOworCXN0cnVjdCB1Y2NfZmFzdF9wcml2YXRlICp1Y2NmOwogCWludCBob3dtYW55OwotCWludCByeF93b3JrX2xpbWl0ID0gKmJ1ZGdldDsKLQl1OCByeFEgPSAwOworCXU4IGk7CisJaW50IHJ4X3dvcmtfbGltaXQ7CisJcmVnaXN0ZXIgdTMyIHVjY207CiAKKwl1Z19pbmZvID0gdWdldGgtPnVnX2luZm87CisKKwlyeF93b3JrX2xpbWl0ID0gKmJ1ZGdldDsKIAlpZiAocnhfd29ya19saW1pdCA+IGRldi0+cXVvdGEpCiAJCXJ4X3dvcmtfbGltaXQgPSBkZXYtPnF1b3RhOwogCi0JaG93bWFueSA9IHVjY19nZXRoX3J4KHVnZXRoLCByeFEsIHJ4X3dvcmtfbGltaXQpOworCWhvd21hbnkgPSAwOworCisJZm9yIChpID0gMDsgaSA8IHVnX2luZm8tPm51bVF1ZXVlc1J4OyBpKyspIHsKKwkJaG93bWFueSArPSB1Y2NfZ2V0aF9yeCh1Z2V0aCwgaSwgcnhfd29ya19saW1pdCk7CisJfQogCiAJZGV2LT5xdW90YSAtPSBob3dtYW55OwogCXJ4X3dvcmtfbGltaXQgLT0gaG93bWFueTsKIAkqYnVkZ2V0IC09IGhvd21hbnk7CiAKLQlpZiAocnhfd29ya19saW1pdCA+PSAwKQorCWlmIChyeF93b3JrX2xpbWl0ID4gMCkgewogCQluZXRpZl9yeF9jb21wbGV0ZShkZXYpOworCQl1Y2NmID0gdWdldGgtPnVjY2Y7CisJCXVjY20gPSBpbl9iZTMyKHVjY2YtPnBfdWNjbSk7CisJCXVjY20gfD0gVUNDRV9SWF9FVkVOVFM7CisJCW91dF9iZTMyKHVjY2YtPnBfdWNjbSwgdWNjbSk7CisJfQogCi0JcmV0dXJuIChyeF93b3JrX2xpbWl0IDwgMCkgPyAxIDogMDsKKwlyZXR1cm4gKHJ4X3dvcmtfbGltaXQgPiAwKSA/IDAgOiAxOwogfQogI2VuZGlmCQkJCS8qIENPTkZJR19VR0VUSF9OQVBJICovCiAKQEAgLTM3ODIsMTAgKzM1NzQsMTMgQEAKIAlzdHJ1Y3QgdWNjX2dldGhfcHJpdmF0ZSAqdWdldGggPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCB1Y2NfZmFzdF9wcml2YXRlICp1Y2NmOwogCXN0cnVjdCB1Y2NfZ2V0aF9pbmZvICp1Z19pbmZvOwotCXJlZ2lzdGVyIHUzMiB1Y2NlID0gMDsKLQlyZWdpc3RlciB1MzIgYml0X21hc2sgPSBVQ0NFX1JYQkZfU0lOR0xFX01BU0s7Ci0JcmVnaXN0ZXIgdTMyIHR4X21hc2sgPSBVQ0NFX1RYQkZfU0lOR0xFX01BU0s7Ci0JcmVnaXN0ZXIgdTggaTsKKwlyZWdpc3RlciB1MzIgdWNjZTsKKwlyZWdpc3RlciB1MzIgdWNjbTsKKyNpZm5kZWYgQ09ORklHX1VHRVRIX05BUEkKKwlyZWdpc3RlciB1MzIgcnhfbWFzazsKKyNlbmRpZgorCXJlZ2lzdGVyIHUzMiB0eF9tYXNrOworCXU4IGk7CiAKIAl1Z2V0aF92ZGJnKCIlczogSU4iLCBfX0ZVTkNUSU9OX18pOwogCkBAIC0zNzk1LDE3NCArMzU5MCw1NyBAQAogCXVjY2YgPSB1Z2V0aC0+dWNjZjsKIAl1Z19pbmZvID0gdWdldGgtPnVnX2luZm87CiAKLQlkbyB7Ci0JCXVjY2UgfD0gKHUzMikgKGluX2JlMzIodWNjZi0+cF91Y2NlKSAmIGluX2JlMzIodWNjZi0+cF91Y2NtKSk7CisJLyogcmVhZCBhbmQgY2xlYXIgZXZlbnRzICovCisJdWNjZSA9ICh1MzIpIGluX2JlMzIodWNjZi0+cF91Y2NlKTsKKwl1Y2NtID0gKHUzMikgaW5fYmUzMih1Y2NmLT5wX3VjY20pOworCXVjY2UgJj0gdWNjbTsKKwlvdXRfYmUzMih1Y2NmLT5wX3VjY2UsIHVjY2UpOwogCi0JCS8qIGNsZWFyIGV2ZW50IGJpdHMgZm9yIG5leHQgdGltZSAqLwotCQkvKiBTaWRlIGVmZmVjdCBoZXJlIGlzIHRvIG1hc2sgdWNjZSB2YXJpYWJsZQotCQlmb3IgZnV0dXJlIHByb2Nlc3NpbmcgYmVsb3cuICovCi0JCW91dF9iZTMyKHVjY2YtPnBfdWNjZSwgdWNjZSk7CS8qIENsZWFyIHdpdGggb25lcywKLQkJCQkJCWJ1dCBvbmx5IGJpdHMgaW4gVUNDTSAqLwotCi0JCS8qIFdlIGlnbm9yZSBUeCBpbnRlcnJ1cHRzIGJlY2F1c2UgVHggY29uZmlybWF0aW9uIGlzCi0JCWRvbmUgaW5zaWRlIFR4IHJvdXRpbmUgKi8KLQotCQlmb3IgKGkgPSAwOyBpIDwgdWdfaW5mby0+bnVtUXVldWVzUng7IGkrKykgewotCQkJaWYgKHVjY2UgJiBiaXRfbWFzaykKLQkJCQl1Y2NfZ2V0aF9yeCh1Z2V0aCwgaSwKLQkJCQkJICAgIChpbnQpdWdldGgtPnVnX2luZm8tPgotCQkJCQkgICAgYmRSaW5nTGVuUnhbaV0pOwotCQkJdWNjZSAmPSB+Yml0X21hc2s7Ci0JCQliaXRfbWFzayA8PD0gMTsKKwkvKiBjaGVjayBmb3IgcmVjZWl2ZSBldmVudHMgdGhhdCByZXF1aXJlIHByb2Nlc3NpbmcgKi8KKwlpZiAodWNjZSAmIFVDQ0VfUlhfRVZFTlRTKSB7CisjaWZkZWYgQ09ORklHX1VHRVRIX05BUEkKKwkJaWYgKG5ldGlmX3J4X3NjaGVkdWxlX3ByZXAoZGV2KSkgeworCQl1Y2NtICY9IH5VQ0NFX1JYX0VWRU5UUzsKKwkJCW91dF9iZTMyKHVjY2YtPnBfdWNjbSwgdWNjbSk7CisJCQlfX25ldGlmX3J4X3NjaGVkdWxlKGRldik7CiAJCX0KKyNlbHNlCisJCXJ4X21hc2sgPSBVQ0NFX1JYQkZfU0lOR0xFX01BU0s7CisJCWZvciAoaSA9IDA7IGkgPCB1Z19pbmZvLT5udW1RdWV1ZXNSeDsgaSsrKSB7CisJCQlpZiAodWNjZSAmIHJ4X21hc2spCisJCQkJdWNjX2dldGhfcngodWdldGgsIGksIChpbnQpdWdldGgtPnVnX2luZm8tPmJkUmluZ0xlblJ4W2ldKTsKKwkJCXVjY2UgJj0gfnJ4X21hc2s7CisJCQlyeF9tYXNrIDw8PSAxOworCQl9CisjZW5kaWYgLyogQ09ORklHX1VHRVRIX05BUEkgKi8KKwl9CiAKKwkvKiBUeCBldmVudCBwcm9jZXNzaW5nICovCisJaWYgKHVjY2UgJiBVQ0NFX1RYX0VWRU5UUykgeworCQlzcGluX2xvY2soJnVnZXRoLT5sb2NrKTsKKwkJdHhfbWFzayA9IFVDQ0VfVFhCRl9TSU5HTEVfTUFTSzsKIAkJZm9yIChpID0gMDsgaSA8IHVnX2luZm8tPm51bVF1ZXVlc1R4OyBpKyspIHsKIAkJCWlmICh1Y2NlICYgdHhfbWFzaykKIAkJCQl1Y2NfZ2V0aF90eChkZXYsIGkpOwogCQkJdWNjZSAmPSB+dHhfbWFzazsKIAkJCXR4X21hc2sgPDw9IDE7CiAJCX0KKwkJc3Bpbl91bmxvY2soJnVnZXRoLT5sb2NrKTsKKwl9CiAKLQkJLyogRXhjZXB0aW9ucyAqLworCS8qIEVycm9ycyBhbmQgb3RoZXIgZXZlbnRzICovCisJaWYgKHVjY2UgJiBVQ0NFX09USEVSKSB7CiAJCWlmICh1Y2NlICYgVUNDRV9CU1kpIHsKLQkJCXVnZXRoX3ZkYmcoIkdvdCBCVVNZIGlycSEhISEiKTsKIAkJCXVnZXRoLT5zdGF0cy5yeF9lcnJvcnMrKzsKLQkJCXVjY2UgJj0gflVDQ0VfQlNZOwogCQl9Ci0JCWlmICh1Y2NlICYgVUNDRV9PVEhFUikgewotCQkJdWdldGhfdmRiZygiR290IGZyYW1lIHdpdGggZXJyb3IgKHVjY2UgLSAweCUwOHgpISEhISIsCi0JCQkJICAgdWNjZSk7Ci0JCQl1Z2V0aC0+c3RhdHMucnhfZXJyb3JzKys7Ci0JCQl1Y2NlICY9IH51Y2NlOworCQlpZiAodWNjZSAmIFVDQ0VfVFhFKSB7CisJCQl1Z2V0aC0+c3RhdHMudHhfZXJyb3JzKys7CiAJCX0KIAl9Ci0Jd2hpbGUgKHVjY2UpOwogCiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi1zdGF0aWMgaXJxcmV0dXJuX3QgcGh5X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRldl9pZDsKLQlzdHJ1Y3QgdWNjX2dldGhfcHJpdmF0ZSAqdWdldGggPSBuZXRkZXZfcHJpdihkZXYpOwotCi0JdWdldGhfdmRiZygiJXM6IElOIiwgX19GVU5DVElPTl9fKTsKLQotCS8qIENsZWFyIHRoZSBpbnRlcnJ1cHQgKi8KLQltaWlfY2xlYXJfcGh5X2ludGVycnVwdCh1Z2V0aC0+bWlpX2luZm8pOwotCi0JLyogRGlzYWJsZSBQSFkgaW50ZXJydXB0cyAqLwotCW1paV9jb25maWd1cmVfcGh5X2ludGVycnVwdCh1Z2V0aC0+bWlpX2luZm8sIE1JSV9JTlRFUlJVUFRfRElTQUJMRUQpOwotCi0JLyogU2NoZWR1bGUgdGhlIHBoeSBjaGFuZ2UgKi8KLQlzY2hlZHVsZV93b3JrKCZ1Z2V0aC0+dHEpOwotCi0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi0vKiBTY2hlZHVsZWQgYnkgdGhlIHBoeV9pbnRlcnJ1cHQvdGltZXIgdG8gaGFuZGxlIFBIWSBjaGFuZ2VzICovCi1zdGF0aWMgdm9pZCB1Z2V0aF9waHlfY2hhbmdlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgdWNjX2dldGhfcHJpdmF0ZSAqdWdldGggPQotCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHVjY19nZXRoX3ByaXZhdGUsIHRxKTsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gdWdldGgtPmRldjsKLQlzdHJ1Y3QgdWNjX2dldGggKnVnX3JlZ3M7Ci0JaW50IHJlc3VsdCA9IDA7Ci0KLQl1Z2V0aF92ZGJnKCIlczogSU4iLCBfX0ZVTkNUSU9OX18pOwotCi0JdWdfcmVncyA9IHVnZXRoLT51Z19yZWdzOwotCi0JLyogRGVsYXkgdG8gZ2l2ZSB0aGUgUEhZIGEgY2hhbmNlIHRvIGNoYW5nZSB0aGUKLQkgKiByZWdpc3RlciBzdGF0ZSAqLwotCW1zbGVlcCgxKTsKLQotCS8qIFVwZGF0ZSB0aGUgbGluaywgc3BlZWQsIGR1cGxleCAqLwotCXJlc3VsdCA9IHVnZXRoLT5taWlfaW5mby0+cGh5aW5mby0+cmVhZF9zdGF0dXModWdldGgtPm1paV9pbmZvKTsKLQotCS8qIEFkanVzdCB0aGUga25vd24gc3RhdHVzIGFzIGxvbmcgYXMgdGhlIGxpbmsKLQkgKiBpc24ndCBzdGlsbCBjb21pbmcgdXAgKi8KLQlpZiAoKDAgPT0gcmVzdWx0KSB8fCAodWdldGgtPm1paV9pbmZvLT5saW5rID09IDApKQotCQlhZGp1c3RfbGluayhkZXYpOwotCi0JLyogUmVlbmFibGUgaW50ZXJydXB0cywgaWYgbmVlZGVkICovCi0JaWYgKHVnZXRoLT51Z19pbmZvLT5ib2FyZF9mbGFncyAmIEZTTF9VR0VUSF9CUkRfSEFTX1BIWV9JTlRSKQotCQltaWlfY29uZmlndXJlX3BoeV9pbnRlcnJ1cHQodWdldGgtPm1paV9pbmZvLAotCQkJCQkgICAgTUlJX0lOVEVSUlVQVF9FTkFCTEVEKTsKLX0KLQotLyogQ2FsbGVkIGV2ZXJ5IHNvIG9mdGVuIG9uIHN5c3RlbXMgdGhhdCBkb24ndCBpbnRlcnJ1cHQKLSAqIHRoZSBjb3JlIGZvciBQSFkgY2hhbmdlcyAqLwotc3RhdGljIHZvaWQgdWdldGhfcGh5X3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGF0YTsKLQlzdHJ1Y3QgdWNjX2dldGhfcHJpdmF0ZSAqdWdldGggPSBuZXRkZXZfcHJpdihkZXYpOwotCi0Jc2NoZWR1bGVfd29yaygmdWdldGgtPnRxKTsKLQotCW1vZF90aW1lcigmdWdldGgtPnBoeV9pbmZvX3RpbWVyLCBqaWZmaWVzICsgUEhZX0NIQU5HRV9USU1FICogSFopOwotfQotCi0vKiBLZWVwIHRyeWluZyBhbmVnIGZvciBzb21lIHRpbWUKLSAqIElmLCBhZnRlciBHRkFSX0FOX1RJTUVPVVQgc2Vjb25kcywgaXQgaGFzIG5vdAotICogZmluaXNoZWQsIHdlIHN3aXRjaCB0byBmb3JjZWQuCi0gKiBFaXRoZXIgd2F5LCBvbmNlIHRoZSBwcm9jZXNzIGhhcyBjb21wbGV0ZWQsIHdlIGVpdGhlcgotICogcmVxdWVzdCB0aGUgaW50ZXJydXB0LCBvciBzd2l0Y2ggdGhlIHRpbWVyIG92ZXIgdG8KLSAqIHVzaW5nIHVnZXRoX3BoeV90aW1lciB0byBjaGVjayBzdGF0dXMgKi8KLXN0YXRpYyB2b2lkIHVnZXRoX3BoeV9zdGFydHVwX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQlzdHJ1Y3QgdWdldGhfbWlpX2luZm8gKm1paV9pbmZvID0gKHN0cnVjdCB1Z2V0aF9taWlfaW5mbyAqKWRhdGE7Ci0Jc3RydWN0IHVjY19nZXRoX3ByaXZhdGUgKnVnZXRoID0gbmV0ZGV2X3ByaXYobWlpX2luZm8tPmRldik7Ci0Jc3RhdGljIGludCBzZWNvbmRhcnkgPSBVR0VUSF9BTl9USU1FT1VUOwotCWludCByZXN1bHQ7Ci0KLQkvKiBDb25maWd1cmUgdGhlIEF1dG8tbmVnb3RpYXRpb24gKi8KLQlyZXN1bHQgPSBtaWlfaW5mby0+cGh5aW5mby0+Y29uZmlnX2FuZWcobWlpX2luZm8pOwotCi0JLyogSWYgYXV0b25lZ290aWF0aW9uIGZhaWxlZCB0byBzdGFydCwgYW5kCi0JICogd2UgaGF2ZW4ndCB0aW1lZCBvdXQsIHJlc2V0IHRoZSB0aW1lciwgYW5kIHJldHVybiAqLwotCWlmIChyZXN1bHQgJiYgc2Vjb25kYXJ5LS0pIHsKLQkJbW9kX3RpbWVyKCZ1Z2V0aC0+cGh5X2luZm9fdGltZXIsIGppZmZpZXMgKyBIWik7Ci0JCXJldHVybjsKLQl9IGVsc2UgaWYgKHJlc3VsdCkgewotCQkvKiBDb3VsZG4ndCBzdGFydCBhdXRvbmVnb3RpYXRpb24uCi0JCSAqIFRyeSBzd2l0Y2hpbmcgdG8gZm9yY2VkICovCi0JCW1paV9pbmZvLT5hdXRvbmVnID0gMDsKLQkJcmVzdWx0ID0gbWlpX2luZm8tPnBoeWluZm8tPmNvbmZpZ19hbmVnKG1paV9pbmZvKTsKLQotCQkvKiBGb3JjaW5nIGZhaWxlZCEgIEdpdmUgdXAgKi8KLQkJaWYgKHJlc3VsdCkgewotCQkJdWdldGhfZXJyKCIlczogRm9yY2luZyBmYWlsZWQhIiwgbWlpX2luZm8tPmRldi0+bmFtZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQkvKiBLaWxsIHRoZSB0aW1lciBzbyBpdCBjYW4gYmUgcmVzdGFydGVkICovCi0JZGVsX3RpbWVyX3N5bmMoJnVnZXRoLT5waHlfaW5mb190aW1lcik7Ci0KLQkvKiBHcmFiIHRoZSBQSFkgaW50ZXJydXB0LCBpZiBuZWNlc3NhcnkvcG9zc2libGUgKi8KLQlpZiAodWdldGgtPnVnX2luZm8tPmJvYXJkX2ZsYWdzICYgRlNMX1VHRVRIX0JSRF9IQVNfUEhZX0lOVFIpIHsKLQkJaWYgKHJlcXVlc3RfaXJxKHVnZXRoLT51Z19pbmZvLT5waHlfaW50ZXJydXB0LAotCQkJCXBoeV9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAotCQkJCSJwaHlfaW50ZXJydXB0IiwgbWlpX2luZm8tPmRldikgPCAwKSB7Ci0JCQl1Z2V0aF9lcnIoIiVzOiBDYW4ndCBnZXQgSVJRICVkIChQSFkpIiwKLQkJCQkgIG1paV9pbmZvLT5kZXYtPm5hbWUsCi0JCQkJICB1Z2V0aC0+dWdfaW5mby0+cGh5X2ludGVycnVwdCk7Ci0JCX0gZWxzZSB7Ci0JCQltaWlfY29uZmlndXJlX3BoeV9pbnRlcnJ1cHQodWdldGgtPm1paV9pbmZvLAotCQkJCQkJICAgIE1JSV9JTlRFUlJVUFRfRU5BQkxFRCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQkvKiBTdGFydCB0aGUgdGltZXIgYWdhaW4sIHRoaXMgdGltZSBpbiBvcmRlciB0bwotCSAqIGhhbmRsZSBhIGNoYW5nZSBpbiBzdGF0dXMgKi8KLQlpbml0X3RpbWVyKCZ1Z2V0aC0+cGh5X2luZm9fdGltZXIpOwotCXVnZXRoLT5waHlfaW5mb190aW1lci5mdW5jdGlvbiA9ICZ1Z2V0aF9waHlfdGltZXI7Ci0JdWdldGgtPnBoeV9pbmZvX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZyltaWlfaW5mby0+ZGV2OwotCW1vZF90aW1lcigmdWdldGgtPnBoeV9pbmZvX3RpbWVyLCBqaWZmaWVzICsgUEhZX0NIQU5HRV9USU1FICogSFopOwotfQotCiAvKiBDYWxsZWQgd2hlbiBzb21ldGhpbmcgbmVlZHMgdG8gdXNlIHRoZSBldGhlcm5ldCBkZXZpY2UgKi8KIC8qIFJldHVybnMgMCBmb3Igc3VjY2Vzcy4gKi8KIHN0YXRpYyBpbnQgdWNjX2dldGhfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpAQCAtMzk3OSw2ICszNjU3LDEyIEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCWVyciA9IHVjY19zdHJ1Y3RfaW5pdCh1Z2V0aCk7CisJaWYgKGVycikgeworCQl1Z2V0aF9lcnIoIiVzOiBDYW5ub3QgY29uZmlndXJlIGludGVybmFsIHN0cnVjdCwgYWJvcnRpbmcuIiwgZGV2LT5uYW1lKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKIAllcnIgPSB1Y2NfZ2V0aF9zdGFydHVwKHVnZXRoKTsKIAlpZiAoZXJyKSB7CiAJCXVnZXRoX2VycigiJXM6IENhbm5vdCBjb25maWd1cmUgbmV0IGRldmljZSwgYWJvcnRpbmcuIiwKQEAgLTQwMDYsMTAgKzM2OTAsMTIgQEAKIAogCWVyciA9IGluaXRfcGh5KGRldik7CiAJaWYgKGVycikgewotCQl1Z2V0aF9lcnIoIiVzOiBDYW5ub3QgaW5pdGlhbHppZSBQSFksIGFib3J0aW5nLiIsIGRldi0+bmFtZSk7CisJCXVnZXRoX2VycigiJXM6IENhbm5vdCBpbml0aWFsaXplIFBIWSwgYWJvcnRpbmcuIiwgZGV2LT5uYW1lKTsKIAkJcmV0dXJuIGVycjsKIAl9Ci0jaWZuZGVmIENPTkZJR19VR0VUSF9OQVBJCisKKwlwaHlfc3RhcnQodWdldGgtPnBoeWRldik7CisKIAllcnIgPQogCSAgICByZXF1ZXN0X2lycSh1Z2V0aC0+dWdfaW5mby0+dWZfaW5mby5pcnEsIHVjY19nZXRoX2lycV9oYW5kbGVyLCAwLAogCQkJIlVDQyBHZXRoIiwgZGV2KTsKQEAgLTQwMTksMTUgKzM3MDUsNiBAQAogCQl1Y2NfZ2V0aF9zdG9wKHVnZXRoKTsKIAkJcmV0dXJuIGVycjsKIAl9Ci0jZW5kaWYJCQkJLyogQ09ORklHX1VHRVRIX05BUEkgKi8KLQotCS8qIFNldCB1cCB0aGUgUEhZIGNoYW5nZSB3b3JrIHF1ZXVlICovCi0JSU5JVF9XT1JLKCZ1Z2V0aC0+dHEsIHVnZXRoX3BoeV9jaGFuZ2UpOwotCi0JaW5pdF90aW1lcigmdWdldGgtPnBoeV9pbmZvX3RpbWVyKTsKLQl1Z2V0aC0+cGh5X2luZm9fdGltZXIuZnVuY3Rpb24gPSAmdWdldGhfcGh5X3N0YXJ0dXBfdGltZXI7Ci0JdWdldGgtPnBoeV9pbmZvX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZyl1Z2V0aC0+bWlpX2luZm87Ci0JbW9kX3RpbWVyKCZ1Z2V0aC0+cGh5X2luZm9fdGltZXIsIGppZmZpZXMgKyBIWik7CiAKIAllcnIgPSB1Z2V0aF9lbmFibGUodWdldGgsIENPTU1fRElSX1JYX0FORF9UWCk7CiAJaWYgKGVycikgewpAQCAtNDA1MCwxMSArMzcyNyw4IEBACiAKIAl1Y2NfZ2V0aF9zdG9wKHVnZXRoKTsKIAotCS8qIFNodXRkb3duIHRoZSBQSFkgKi8KLQlpZiAodWdldGgtPm1paV9pbmZvLT5waHlpbmZvLT5jbG9zZSkKLQkJdWdldGgtPm1paV9pbmZvLT5waHlpbmZvLT5jbG9zZSh1Z2V0aC0+bWlpX2luZm8pOwotCi0Ja2ZyZWUodWdldGgtPm1paV9pbmZvKTsKKwlwaHlfZGlzY29ubmVjdCh1Z2V0aC0+cGh5ZGV2KTsKKwl1Z2V0aC0+cGh5ZGV2ID0gTlVMTDsKIAogCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKIApAQCAtNDA2MywyMCArMzczNyw1MyBAQAogCiBjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgdWNjX2dldGhfZXRodG9vbF9vcHMgPSB7IH07CiAKK3N0YXRpYyBwaHlfaW50ZXJmYWNlX3QgdG9fcGh5X2ludGVyZmFjZShjb25zdCBjaGFyICppbnRlcmZhY2VfdHlwZSkKK3sKKwlpZiAoc3RyY2FzZWNtcChpbnRlcmZhY2VfdHlwZSwgIm1paSIpID09IDApCisJCXJldHVybiBQSFlfSU5URVJGQUNFX01PREVfTUlJOworCWlmIChzdHJjYXNlY21wKGludGVyZmFjZV90eXBlLCAiZ21paSIpID09IDApCisJCXJldHVybiBQSFlfSU5URVJGQUNFX01PREVfR01JSTsKKwlpZiAoc3RyY2FzZWNtcChpbnRlcmZhY2VfdHlwZSwgInRiaSIpID09IDApCisJCXJldHVybiBQSFlfSU5URVJGQUNFX01PREVfVEJJOworCWlmIChzdHJjYXNlY21wKGludGVyZmFjZV90eXBlLCAicm1paSIpID09IDApCisJCXJldHVybiBQSFlfSU5URVJGQUNFX01PREVfUk1JSTsKKwlpZiAoc3RyY2FzZWNtcChpbnRlcmZhY2VfdHlwZSwgInJnbWlpIikgPT0gMCkKKwkJcmV0dXJuIFBIWV9JTlRFUkZBQ0VfTU9ERV9SR01JSTsKKwlpZiAoc3RyY2FzZWNtcChpbnRlcmZhY2VfdHlwZSwgInJnbWlpLWlkIikgPT0gMCkKKwkJcmV0dXJuIFBIWV9JTlRFUkZBQ0VfTU9ERV9SR01JSV9JRDsKKwlpZiAoc3RyY2FzZWNtcChpbnRlcmZhY2VfdHlwZSwgInJ0YmkiKSA9PSAwKQorCQlyZXR1cm4gUEhZX0lOVEVSRkFDRV9NT0RFX1JUQkk7CisKKwlyZXR1cm4gUEhZX0lOVEVSRkFDRV9NT0RFX01JSTsKK30KKwogc3RhdGljIGludCB1Y2NfZ2V0aF9wcm9iZShzdHJ1Y3Qgb2ZfZGV2aWNlKiBvZmRldiwgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2gpCiB7CiAJc3RydWN0IGRldmljZSAqZGV2aWNlID0gJm9mZGV2LT5kZXY7CiAJc3RydWN0IGRldmljZV9ub2RlICpucCA9IG9mZGV2LT5ub2RlOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbWRpbzsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gTlVMTDsKIAlzdHJ1Y3QgdWNjX2dldGhfcHJpdmF0ZSAqdWdldGggPSBOVUxMOwogCXN0cnVjdCB1Y2NfZ2V0aF9pbmZvICp1Z19pbmZvOwogCXN0cnVjdCByZXNvdXJjZSByZXM7CiAJc3RydWN0IGRldmljZV9ub2RlICpwaHk7Ci0JaW50IGVyciwgdWNjX251bSwgcGh5X2ludGVyZmFjZTsKLQlzdGF0aWMgaW50IG1paV9tbmdfY29uZmlndXJlZCA9IDA7CisJaW50IGVyciwgdWNjX251bSwgbWF4X3NwZWVkID0gMDsKIAljb25zdCBwaGFuZGxlICpwaDsKIAljb25zdCB1bnNpZ25lZCBpbnQgKnByb3A7CiAJY29uc3Qgdm9pZCAqbWFjX2FkZHI7CisJcGh5X2ludGVyZmFjZV90IHBoeV9pbnRlcmZhY2U7CisJc3RhdGljIGNvbnN0IGludCBlbmV0X3RvX3NwZWVkW10gPSB7CisJCVNQRUVEXzEwLCBTUEVFRF8xMCwgU1BFRURfMTAsCisJCVNQRUVEXzEwMCwgU1BFRURfMTAwLCBTUEVFRF8xMDAsCisJCVNQRUVEXzEwMDAsIFNQRUVEXzEwMDAsIFNQRUVEXzEwMDAsIFNQRUVEXzEwMDAsCisJfTsKKwlzdGF0aWMgY29uc3QgcGh5X2ludGVyZmFjZV90IGVuZXRfdG9fcGh5X2ludGVyZmFjZVtdID0geworCQlQSFlfSU5URVJGQUNFX01PREVfTUlJLCBQSFlfSU5URVJGQUNFX01PREVfUk1JSSwKKwkJUEhZX0lOVEVSRkFDRV9NT0RFX1JHTUlJLCBQSFlfSU5URVJGQUNFX01PREVfTUlJLAorCQlQSFlfSU5URVJGQUNFX01PREVfUk1JSSwgUEhZX0lOVEVSRkFDRV9NT0RFX1JHTUlJLAorCQlQSFlfSU5URVJGQUNFX01PREVfR01JSSwgUEhZX0lOVEVSRkFDRV9NT0RFX1JHTUlJLAorCQlQSFlfSU5URVJGQUNFX01PREVfVEJJLCBQSFlfSU5URVJGQUNFX01PREVfUlRCSSwKKwl9OwogCiAJdWdldGhfdmRiZygiJXM6IElOIiwgX19GVU5DVElPTl9fKTsKIApAQCAtNDA4Nyw2ICszNzk0LDcgQEAKIAogCXVnX2luZm8gPSAmdWdldGhfaW5mb1t1Y2NfbnVtXTsKIAl1Z19pbmZvLT51Zl9pbmZvLnVjY19udW0gPSB1Y2NfbnVtOworCiAJcHJvcCA9IGdldF9wcm9wZXJ0eShucCwgInJ4LWNsb2NrIiwgTlVMTCk7CiAJdWdfaW5mby0+dWZfaW5mby5yeF9jbG9jayA9ICpwcm9wOwogCXByb3AgPSBnZXRfcHJvcGVydHkobnAsICJ0eC1jbG9jayIsIE5VTEwpOwpAQCAtNDEwNCwxMyArMzgxMiw3MiBAQAogCWlmIChwaHkgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKKwkvKiBzZXQgdGhlIFBIWSBhZGRyZXNzICovCiAJcHJvcCA9IGdldF9wcm9wZXJ0eShwaHksICJyZWciLCBOVUxMKTsKKwlpZiAocHJvcCA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CiAJdWdfaW5mby0+cGh5X2FkZHJlc3MgPSAqcHJvcDsKLQlwcm9wID0gZ2V0X3Byb3BlcnR5KHBoeSwgImludGVyZmFjZSIsIE5VTEwpOwotCXVnX2luZm8tPmVuZXRfaW50ZXJmYWNlID0gKnByb3A7Ci0JdWdfaW5mby0+cGh5X2ludGVycnVwdCA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKHBoeSwgMCk7Ci0JdWdfaW5mby0+Ym9hcmRfZmxhZ3MgPSAodWdfaW5mby0+cGh5X2ludGVycnVwdCA9PSBOT19JUlEpPwotCQkJMDpGU0xfVUdFVEhfQlJEX0hBU19QSFlfSU5UUjsKKworCS8qIGdldCB0aGUgcGh5IGludGVyZmFjZSB0eXBlLCBvciBkZWZhdWx0IHRvIE1JSSAqLworCXByb3AgPSBnZXRfcHJvcGVydHkobnAsICJpbnRlcmZhY2UtdHlwZSIsIE5VTEwpOworCWlmICghcHJvcCkgeworCQkvKiBoYW5kbGUgaW50ZXJmYWNlIHByb3BlcnR5IHByZXNlbnQgaW4gb2xkIHRyZWVzICovCisJCXByb3AgPSBnZXRfcHJvcGVydHkocGh5LCAiaW50ZXJmYWNlIiwgTlVMTCk7CisJCWlmIChwcm9wICE9IE5VTEwpCisJCQlwaHlfaW50ZXJmYWNlID0gZW5ldF90b19waHlfaW50ZXJmYWNlWypwcm9wXTsKKwkJZWxzZQorCQkJcGh5X2ludGVyZmFjZSA9IFBIWV9JTlRFUkZBQ0VfTU9ERV9NSUk7CisJfSBlbHNlIHsKKwkJcGh5X2ludGVyZmFjZSA9IHRvX3BoeV9pbnRlcmZhY2UoKGNvbnN0IGNoYXIgKilwcm9wKTsKKwl9CisKKwkvKiBnZXQgc3BlZWQsIG9yIGRlcml2ZSBmcm9tIGludGVyZmFjZSAqLworCXByb3AgPSBnZXRfcHJvcGVydHkobnAsICJtYXgtc3BlZWQiLCBOVUxMKTsKKwlpZiAoIXByb3ApIHsKKwkJLyogaGFuZGxlIGludGVyZmFjZSBwcm9wZXJ0eSBwcmVzZW50IGluIG9sZCB0cmVlcyAqLworCQlwcm9wID0gZ2V0X3Byb3BlcnR5KHBoeSwgImludGVyZmFjZSIsIE5VTEwpOworCQlpZiAocHJvcCAhPSBOVUxMKQorCQkJbWF4X3NwZWVkID0gZW5ldF90b19zcGVlZFsqcHJvcF07CisJfSBlbHNlIHsKKwkJbWF4X3NwZWVkID0gKnByb3A7CisJfQorCWlmICghbWF4X3NwZWVkKSB7CisJCXN3aXRjaCAocGh5X2ludGVyZmFjZSkgeworCQljYXNlIFBIWV9JTlRFUkZBQ0VfTU9ERV9HTUlJOgorCQljYXNlIFBIWV9JTlRFUkZBQ0VfTU9ERV9SR01JSToKKwkJY2FzZSBQSFlfSU5URVJGQUNFX01PREVfUkdNSUlfSUQ6CisJCWNhc2UgUEhZX0lOVEVSRkFDRV9NT0RFX1RCSToKKwkJY2FzZSBQSFlfSU5URVJGQUNFX01PREVfUlRCSToKKwkJCW1heF9zcGVlZCA9IFNQRUVEXzEwMDA7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCW1heF9zcGVlZCA9IFNQRUVEXzEwMDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKG1heF9zcGVlZCA9PSBTUEVFRF8xMDAwKSB7CisJCXVnX2luZm8tPnVmX2luZm8udXJmcyA9IFVDQ19HRVRIX1VSRlNfR0lHQV9JTklUOworCQl1Z19pbmZvLT51Zl9pbmZvLnVyZmV0ID0gVUNDX0dFVEhfVVJGRVRfR0lHQV9JTklUOworCQl1Z19pbmZvLT51Zl9pbmZvLnVyZnNldCA9IFVDQ19HRVRIX1VSRlNFVF9HSUdBX0lOSVQ7CisJCXVnX2luZm8tPnVmX2luZm8udXRmcyA9IFVDQ19HRVRIX1VURlNfR0lHQV9JTklUOworCQl1Z19pbmZvLT51Zl9pbmZvLnV0ZmV0ID0gVUNDX0dFVEhfVVRGRVRfR0lHQV9JTklUOworCQl1Z19pbmZvLT51Zl9pbmZvLnV0ZnR0ID0gVUNDX0dFVEhfVVRGVFRfR0lHQV9JTklUOworCX0KKworCS8qIFNldCB0aGUgYnVzIGlkICovCisJbWRpbyA9IG9mX2dldF9wYXJlbnQocGh5KTsKKworCWlmIChtZGlvID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCWVyciA9IG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UobWRpbywgMCwgJnJlcyk7CisJb2Zfbm9kZV9wdXQobWRpbyk7CisKKwlpZiAoZXJyKQorCQlyZXR1cm4gLTE7CisKKwl1Z19pbmZvLT5tZGlvX2J1cyA9IHJlcy5zdGFydDsKIAogCXByaW50ayhLRVJOX0lORk8gInVjY19nZXRoOiBVQ0MlMWQgYXQgMHglOHggKGlycSA9ICVkKSBcbiIsCiAJCXVnX2luZm8tPnVmX2luZm8udWNjX251bSArIDEsIHVnX2luZm8tPnVmX2luZm8ucmVncywKQEAgLTQxMjIsNDMgKzM4ODksNiBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQkvKiBGSVhNRTogV29yayBhcm91bmQgZm9yIGVhcmx5IGNoaXAgcmV2LiAgICAgICAgICAgICAgICovCi0JLyogVGhlcmUncyBhIGJ1ZyBpbiBpbml0aWFsIGNoaXAgcmV2KHMpIGluIHRoZSBSR01JSSBhYyAqLwotCS8qIHRpbWluZy4JCQkJCQkqLwotCS8qIFRoZSBmb2xsb3dpbmcgY29tcGVuc2F0ZXMgYnkgd3JpdGluZyB0byB0aGUgcmVzZXJ2ZWQgKi8KLQkvKiBRRSBQb3J0IE91dHB1dCBIb2xkIFJlZ2lzdGVycyAoQ1BPSDE/KS4gICAgICAgICAgICAgICovCi0JcHJvcCA9IGdldF9wcm9wZXJ0eShwaHksICJpbnRlcmZhY2UiLCBOVUxMKTsKLQlwaHlfaW50ZXJmYWNlID0gKnByb3A7Ci0JaWYgKChwaHlfaW50ZXJmYWNlID09IEVORVRfMTAwMF9SR01JSSkgfHwKLQkJCShwaHlfaW50ZXJmYWNlID09IEVORVRfMTAwX1JHTUlJKSB8fAotCQkJKHBoeV9pbnRlcmZhY2UgPT0gRU5FVF8xMF9SR01JSSkpIHsKLQkJc3RydWN0IGRldmljZV9ub2RlICpzb2M7Ci0JCXBoeXNfYWRkcl90IGltbXJiYXNlID0gLTE7Ci0JCXUzMiAqdG1wX3JlZzsKLQkJdTMyIHRtcF92YWw7Ci0KLQkJc29jID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUoTlVMTCwgInNvYyIpOwotCQlpZiAoc29jKSB7Ci0JCQl1bnNpZ25lZCBpbnQgc2l6ZTsKLQkJCWNvbnN0IHZvaWQgKnByb3AgPSBnZXRfcHJvcGVydHkoc29jLCAicmVnIiwgJnNpemUpOwotCQkJaW1tcmJhc2UgPSBvZl90cmFuc2xhdGVfYWRkcmVzcyhzb2MsIHByb3ApOwotCQkJb2Zfbm9kZV9wdXQoc29jKTsKLQkJfTsKLQotCQl0bXBfcmVnID0gKHUzMiAqKSBpb3JlbWFwKGltbXJiYXNlICsgMHgxNEE4LCAweDQpOwotCQl0bXBfdmFsID0gaW5fYmUzMih0bXBfcmVnKTsKLQkJaWYgKHVjY19udW0gPT0gMSkKLQkJCW91dF9iZTMyKHRtcF9yZWcsIHRtcF92YWwgfCAweDAwMDAzMDAwKTsKLQkJZWxzZSBpZiAodWNjX251bSA9PSAyKQotCQkJb3V0X2JlMzIodG1wX3JlZywgdG1wX3ZhbCB8IDB4MGMwMDAwMDApOwotCQlpb3VubWFwKHRtcF9yZWcpOwotCX0KLQotCWlmICghbWlpX21uZ19jb25maWd1cmVkKSB7Ci0JCXVjY19zZXRfcWVfbXV4X21paV9tbmcodWNjX251bSk7Ci0JCW1paV9tbmdfY29uZmlndXJlZCA9IDE7Ci0JfQotCiAJLyogQ3JlYXRlIGFuIGV0aGVybmV0IGRldmljZSBpbnN0YW5jZSAqLwogCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZigqdWdldGgpKTsKIApAQCAtNDE5Miw2ICszOTIyLDEwIEBACiAJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSB1Y2NfZ2V0aF9zZXRfbXVsdGk7CiAJZGV2LT5ldGh0b29sX29wcyA9ICZ1Y2NfZ2V0aF9ldGh0b29sX29wczsKIAorCXVnZXRoLT5tc2dfZW5hYmxlID0gKE5FVElGX01TR19JRlVQIDw8IDEgKSAtIDE7CisJdWdldGgtPnBoeV9pbnRlcmZhY2UgPSBwaHlfaW50ZXJmYWNlOworCXVnZXRoLT5tYXhfc3BlZWQgPSBtYXhfc3BlZWQ7CisKIAllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKIAlpZiAoZXJyKSB7CiAJCXVnZXRoX2VycigiJXM6IENhbm5vdCByZWdpc3RlciBuZXQgZGV2aWNlLCBhYm9ydGluZy4iLApAQCAtNDIwMCwxMyArMzkzNCwxMyBAQAogCQlyZXR1cm4gZXJyOwogCX0KIAotCXVnZXRoLT51Z19pbmZvID0gdWdfaW5mbzsKLQl1Z2V0aC0+ZGV2ID0gZGV2OwotCiAJbWFjX2FkZHIgPSBvZl9nZXRfbWFjX2FkZHJlc3MobnApOwogCWlmIChtYWNfYWRkcikKIAkJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIG1hY19hZGRyLCA2KTsKIAorCXVnZXRoLT51Z19pbmZvID0gdWdfaW5mbzsKKwl1Z2V0aC0+ZGV2ID0gZGV2OworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQyNDIsMTkgKzM5NzYsMzAgQEAKIAogc3RhdGljIGludCBfX2luaXQgdWNjX2dldGhfaW5pdCh2b2lkKQogewotCWludCBpOworCWludCBpLCByZXQ7CisKKwlyZXQgPSB1ZWNfbWRpb19pbml0KCk7CisKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCiAJcHJpbnRrKEtFUk5fSU5GTyAidWNjX2dldGg6ICIgRFJWX0RFU0MgIlxuIik7CiAJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKIAkJbWVtY3B5KCYodWdldGhfaW5mb1tpXSksICZ1Z2V0aF9wcmltYXJ5X2luZm8sCiAJCSAgICAgICBzaXplb2YodWdldGhfcHJpbWFyeV9pbmZvKSk7CiAKLQlyZXR1cm4gb2ZfcmVnaXN0ZXJfcGxhdGZvcm1fZHJpdmVyKCZ1Y2NfZ2V0aF9kcml2ZXIpOworCXJldCA9IG9mX3JlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmdWNjX2dldGhfZHJpdmVyKTsKKworCWlmIChyZXQpCisJCXVlY19tZGlvX2V4aXQoKTsKKworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCB1Y2NfZ2V0aF9leGl0KHZvaWQpCiB7CiAJb2ZfdW5yZWdpc3Rlcl9wbGF0Zm9ybV9kcml2ZXIoJnVjY19nZXRoX2RyaXZlcik7CisJdWVjX21kaW9fZXhpdCgpOwogfQogCiBtb2R1bGVfaW5pdCh1Y2NfZ2V0aF9pbml0KTsKQEAgLTQyNjIsNCArNDAwNyw1IEBACiAKIE1PRFVMRV9BVVRIT1IoIkZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMiKTsKIE1PRFVMRV9ERVNDUklQVElPTihEUlZfREVTQyk7CitNT0RVTEVfVkVSU0lPTihEUlZfVkVSU0lPTik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC91Y2NfZ2V0aC5oIGIvZHJpdmVycy9uZXQvdWNjX2dldGguaAppbmRleCBhNjY1NjEyLi5hMjllMWMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC91Y2NfZ2V0aC5oCisrKyBiL2RyaXZlcnMvbmV0L3VjY19nZXRoLmgKQEAgLTI4LDYgKzI4LDggQEAKICNpbmNsdWRlIDxhc20vdWNjLmg+CiAjaW5jbHVkZSA8YXNtL3VjY19mYXN0Lmg+CiAKKyNpbmNsdWRlICJ1Y2NfZ2V0aF9taWkuaCIKKwogI2RlZmluZSBOVU1fVFhfUVVFVUVTICAgICAgICAgICAgICAgICAgIDgKICNkZWZpbmUgTlVNX1JYX1FVRVVFUyAgICAgICAgICAgICAgICAgICA4CiAjZGVmaW5lIE5VTV9CRFNfSU5fUFJFRkVUQ0hFRF9CRFMgICAgICAgNApAQCAtMzYsMTUgKzM4LDYgQEAKICNkZWZpbmUgRU5FVF9JTklUX1BBUkFNX01BWF9FTlRSSUVTX1JYICA5CiAjZGVmaW5lIEVORVRfSU5JVF9QQVJBTV9NQVhfRU5UUklFU19UWCAgOAogCi1zdHJ1Y3QgdWNjX21paV9tbmcgewotCXUzMiBtaWltY2ZnOwkJLyogTUlJIG1hbmFnZW1lbnQgY29uZmlndXJhdGlvbiByZWcgKi8KLQl1MzIgbWlpbWNvbTsJCS8qIE1JSSBtYW5hZ2VtZW50IGNvbW1hbmQgcmVnICovCi0JdTMyIG1paW1hZGQ7CQkvKiBNSUkgbWFuYWdlbWVudCBhZGRyZXNzIHJlZyAqLwotCXUzMiBtaWltY29uOwkJLyogTUlJIG1hbmFnZW1lbnQgY29udHJvbCByZWcgKi8KLQl1MzIgbWlpbXN0YXQ7CQkvKiBNSUkgbWFuYWdlbWVudCBzdGF0dXMgcmVnICovCi0JdTMyIG1paW1pbmQ7CQkvKiBNSUkgbWFuYWdlbWVudCBpbmRpY2F0aW9uIHJlZyAqLwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KIHN0cnVjdCB1Y2NfZ2V0aCB7CiAJc3RydWN0IHVjY19mYXN0IHVjY2Y7CiAKQEAgLTUzLDcgKzQ2LDcgQEAKIAl1MzIgaXBnaWZnOwkJLyogaW50ZXJmcmFtZSBnYXAgcmVnLiAgKi8KIAl1MzIgaGFmZHVwOwkJLyogaGFsZi1kdXBsZXggcmVnLiAgKi8KIAl1OCByZXMxWzB4MTBdOwotCXN0cnVjdCB1Y2NfbWlpX21uZyBtaWltbmc7CS8qIE1JSSBtYW5hZ2VtZW50IHN0cnVjdHVyZSAqLworCXU4IG1paW1uZ1sweDE4XTsJLyogTUlJIG1hbmFnZW1lbnQgc3RydWN0dXJlIG1vdmVkIHRvIF9taWkuaCAqLwogCXUzMiBpZmN0bDsJCS8qIGludGVyZmFjZSBjb250cm9sIHJlZyAqLwogCXUzMiBpZnN0YXQ7CQkvKiBpbnRlcmZhY2Ugc3RhdHV4IHJlZyAqLwogCXUzMiBtYWNzdG5hZGRyMTsJLyogbWFjIHN0YXRpb24gYWRkcmVzcyBwYXJ0IDEgcmVnICovCkBAIC0yMTIsNiArMjA1LDkgQEAKICNkZWZpbmUgVUNDRV9PVEhFUiAgICAgICAoVUNDRV9TQ0FSIHwgVUNDRV9HUkEgIHwgVUNDRV9DQlBSIHwgVUNDRV9CU1kgIHxcCiAJCQlVQ0NFX1JYQyAgfCBVQ0NFX1RYQyAgfCBVQ0NFX1RYRSkKIAorI2RlZmluZSBVQ0NFX1JYX0VWRU5UUwkJCQkJCQkoVUNDRV9SWEYgfCBVQ0NFX0JTWSkKKyNkZWZpbmUgVUNDRV9UWF9FVkVOVFMJCQkJCQkJKFVDQ0VfVFhCIHwgVUNDRV9UWEUpCisKIC8qIFVDQyBHRVRIIFVQU01SIChQcm90b2NvbCBTcGVjaWZpYyBNb2RlIFJlZ2lzdGVyKSAqLwogI2RlZmluZSBVUFNNUl9FQ00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDAwMDAwMAkvKiBFbmFibGUgQ0FNCiAJCQkJCQkJCSAgIE1pc3Mgb3IKQEAgLTM4MSw2NiArMzc3LDYgQEAKICNkZWZpbmUgVUNDU19NUEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEJLyogTWFnaWMgUGFja2V0CiAJCQkJCQkJICAgRGV0ZWN0ZWQgKi8KIAotLyogVUNDIEdFVEggTUlJTUNGRyAoTUlJIE1hbmFnZW1lbnQgQ29uZmlndXJhdGlvbiBSZWdpc3RlcikgKi8KLSNkZWZpbmUgTUlJTUNGR19SRVNFVF9NQU5BR0VNRU5UICAgICAgICAgICAgICAgIDB4ODAwMDAwMDAJLyogUmVzZXQKLQkJCQkJCQkJICAgbWFuYWdlbWVudCAqLwotI2RlZmluZSBNSUlNQ0ZHX05PX1BSRUFNQkxFICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAkvKiBQcmVhbWJsZQotCQkJCQkJCQkgICBzdXBwcmVzcyAqLwotI2RlZmluZSBNSUlNQ0ZHX0NMT0NLX0RJVklERV9TSElGVCAgICAgICAgICAgICAgKDMxIC0gMzEpCS8qIGNsb2NrIGRpdmlkZQotCQkJCQkJCQkgICA8PCBzaGlmdCAqLwotI2RlZmluZSBNSUlNQ0ZHX0NMT0NLX0RJVklERV9NQVggICAgICAgICAgICAgICAgMHhmCS8qIGNsb2NrIGRpdmlkZSBtYXggdmFsCi0JCQkJCQkJICovCi0jZGVmaW5lIE1JSU1DRkdfTUFOQUdFTUVOVF9DTE9DS19ESVZJREVfQllfMiAgICAweDAwMDAwMDAwCS8qIGRpdmlkZSBieSAyICovCi0jZGVmaW5lIE1JSU1DRkdfTUFOQUdFTUVOVF9DTE9DS19ESVZJREVfQllfNCAgICAweDAwMDAwMDAxCS8qIGRpdmlkZSBieSA0ICovCi0jZGVmaW5lIE1JSU1DRkdfTUFOQUdFTUVOVF9DTE9DS19ESVZJREVfQllfNiAgICAweDAwMDAwMDAyCS8qIGRpdmlkZSBieSA2ICovCi0jZGVmaW5lIE1JSU1DRkdfTUFOQUdFTUVOVF9DTE9DS19ESVZJREVfQllfOCAgICAweDAwMDAwMDAzCS8qIGRpdmlkZSBieSA4ICovCi0jZGVmaW5lIE1JSU1DRkdfTUFOQUdFTUVOVF9DTE9DS19ESVZJREVfQllfMTAgICAweDAwMDAwMDA0CS8qIGRpdmlkZSBieSAxMAotCQkJCQkJCQkgKi8KLSNkZWZpbmUgTUlJTUNGR19NQU5BR0VNRU5UX0NMT0NLX0RJVklERV9CWV8xNCAgIDB4MDAwMDAwMDUJLyogZGl2aWRlIGJ5IDE0Ci0JCQkJCQkJCSAqLwotI2RlZmluZSBNSUlNQ0ZHX01BTkFHRU1FTlRfQ0xPQ0tfRElWSURFX0JZXzE2ICAgMHgwMDAwMDAwOAkvKiBkaXZpZGUgYnkgMTYKLQkJCQkJCQkJICovCi0jZGVmaW5lIE1JSU1DRkdfTUFOQUdFTUVOVF9DTE9DS19ESVZJREVfQllfMjAgICAweDAwMDAwMDA2CS8qIGRpdmlkZSBieSAyMAotCQkJCQkJCQkgKi8KLSNkZWZpbmUgTUlJTUNGR19NQU5BR0VNRU5UX0NMT0NLX0RJVklERV9CWV8yOCAgIDB4MDAwMDAwMDcJLyogZGl2aWRlIGJ5IDI4Ci0JCQkJCQkJCSAqLwotI2RlZmluZSBNSUlNQ0ZHX01BTkFHRU1FTlRfQ0xPQ0tfRElWSURFX0JZXzMyICAgMHgwMDAwMDAwOQkvKiBkaXZpZGUgYnkgMzIKLQkJCQkJCQkJICovCi0jZGVmaW5lIE1JSU1DRkdfTUFOQUdFTUVOVF9DTE9DS19ESVZJREVfQllfNDggICAweDAwMDAwMDBhCS8qIGRpdmlkZSBieSA0OAotCQkJCQkJCQkgKi8KLSNkZWZpbmUgTUlJTUNGR19NQU5BR0VNRU5UX0NMT0NLX0RJVklERV9CWV82NCAgIDB4MDAwMDAwMGIJLyogZGl2aWRlIGJ5IDY0Ci0JCQkJCQkJCSAqLwotI2RlZmluZSBNSUlNQ0ZHX01BTkFHRU1FTlRfQ0xPQ0tfRElWSURFX0JZXzgwICAgMHgwMDAwMDAwYwkvKiBkaXZpZGUgYnkgODAKLQkJCQkJCQkJICovCi0jZGVmaW5lIE1JSU1DRkdfTUFOQUdFTUVOVF9DTE9DS19ESVZJREVfQllfMTEyICAweDAwMDAwMDBkCS8qIGRpdmlkZSBieQotCQkJCQkJCQkgICAxMTIgKi8KLSNkZWZpbmUgTUlJTUNGR19NQU5BR0VNRU5UX0NMT0NLX0RJVklERV9CWV8xNjAgIDB4MDAwMDAwMGUJLyogZGl2aWRlIGJ5Ci0JCQkJCQkJCSAgIDE2MCAqLwotI2RlZmluZSBNSUlNQ0ZHX01BTkFHRU1FTlRfQ0xPQ0tfRElWSURFX0JZXzIyNCAgMHgwMDAwMDAwZgkvKiBkaXZpZGUgYnkKLQkJCQkJCQkJICAgMjI0ICovCi0KLS8qIFVDQyBHRVRIIE1JSU1DT00gKE1JSSBNYW5hZ2VtZW50IENvbW1hbmQgUmVnaXN0ZXIpICovCi0jZGVmaW5lIE1JSU1DT01fU0NBTl9DWUNMRSAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCS8qIFNjYW4gY3ljbGUgKi8KLSNkZWZpbmUgTUlJTUNPTV9SRUFEX0NZQ0xFICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEJLyogUmVhZCBjeWNsZSAqLwotCi0vKiBVQ0MgR0VUSCBNSUlNQUREIChNSUkgTWFuYWdlbWVudCBBZGRyZXNzIFJlZ2lzdGVyKSAqLwotI2RlZmluZSBNSUlNQUREX1BIWV9BRERSRVNTX1NISUZUICAgICAgICAgICAgICAgKDMxIC0gMjMpCS8qIFBIWSBBZGRyZXNzCi0JCQkJCQkJCSAgIDw8IHNoaWZ0ICovCi0jZGVmaW5lIE1JSU1BRERfUEhZX1JFR0lTVEVSX1NISUZUICAgICAgICAgICAgICAoMzEgLSAzMSkJLyogUEhZIFJlZ2lzdGVyCi0JCQkJCQkJCSAgIDw8IHNoaWZ0ICovCi0KLS8qIFVDQyBHRVRIIE1JSU1DT04gKE1JSSBNYW5hZ2VtZW50IENvbnRyb2wgUmVnaXN0ZXIpICovCi0jZGVmaW5lIE1JSU1DT05fUEhZX0NPTlRST0xfU0hJRlQgICAgICAgICAgICAgICAoMzEgLSAzMSkJLyogUEhZIENvbnRyb2wKLQkJCQkJCQkJICAgPDwgc2hpZnQgKi8KLSNkZWZpbmUgTUlJTUNPTl9QSFlfU1RBVFVTX1NISUZUICAgICAgICAgICAgICAgICgzMSAtIDMxKQkvKiBQSFkgU3RhdHVzCi0JCQkJCQkJCSAgIDw8IHNoaWZ0ICovCi0KLS8qIFVDQyBHRVRIIE1JSU1JTkQgKE1JSSBNYW5hZ2VtZW50IEluZGljYXRvciBSZWdpc3RlcikgKi8KLSNkZWZpbmUgTUlJTUlORF9OT1RfVkFMSUQgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQJLyogTm90IHZhbGlkICovCi0jZGVmaW5lIE1JSU1JTkRfU0NBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCS8qIFNjYW4gaW4KLQkJCQkJCQkJICAgcHJvZ3Jlc3MgKi8KLSNkZWZpbmUgTUlJTUlORF9CVVNZICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLQogLyogVUNDIEdFVEggSUZTVEFUIChJbnRlcmZhY2UgU3RhdHVzIFJlZ2lzdGVyKSAqLwogI2RlZmluZSBJRlNUQVRfRVhDRVNTX0RFRkVSICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMAkvKiBFeGNlc3NpdmUKIAkJCQkJCQkJICAgdHJhbnNtaXNzaW9uCkBAIC05MzEsOCArODY3LDcgQEAKICNkZWZpbmUgVUNDX0dFVEhfU0NIRURVTEVSX0FMSUdOTUVOVAkJNAkvKiBUaGlzIGlzIGEgZ3Vlc3MgKi8KICNkZWZpbmUgVUNDX0dFVEhfVFhfU1RBVElTVElDU19BTElHTk1FTlQJNAkvKiBUaGlzIGlzIGEgZ3Vlc3MgKi8KICNkZWZpbmUgVUNDX0dFVEhfUlhfU1RBVElTVElDU19BTElHTk1FTlQJNAkvKiBUaGlzIGlzIGEgZ3Vlc3MgKi8KLSNkZWZpbmUgVUNDX0dFVEhfUlhfSU5URVJSVVBUX0NPQUxFU0NJTkdfQUxJR05NRU5UCTQJLyogVGhpcyBpcyBhCi0JCQkJCQkJCSAgIGd1ZXNzICovCisjZGVmaW5lIFVDQ19HRVRIX1JYX0lOVEVSUlVQVF9DT0FMRVNDSU5HX0FMSUdOTUVOVAk2NAogI2RlZmluZSBVQ0NfR0VUSF9SWF9CRF9RVUVVRVNfQUxJR05NRU5UCQk4CS8qIFRoaXMgaXMgYSBndWVzcyAqLwogI2RlZmluZSBVQ0NfR0VUSF9SWF9QUkVGRVRDSEVEX0JEU19BTElHTk1FTlQJMTI4CS8qIFRoaXMgaXMgYSBndWVzcyAqLwogI2RlZmluZSBVQ0NfR0VUSF9SWF9FWFRFTkRFRF9GSUxURVJJTkdfR0xPQkFMX1BBUkFNRVRFUlNfQUxJR05NRU5UIDQJLyogVGhpcwpAQCAtMTAwOSwxNSArOTQ0LDYgQEAKIAkJCQkJCQkJICAgcmVnaXN0ZXIgKi8KICNkZWZpbmUgVUNDX0dFVEhfTUFDQ0ZHMV9JTklUICAgICAgICAgICAgICAgICAgIDAKICNkZWZpbmUgVUNDX0dFVEhfTUFDQ0ZHMl9JTklUICAgICAgICAgICAgICAgICAgIChNQUNDRkcyX1JFU0VSVkVEXzEpCi0jZGVmaW5lIFVDQ19HRVRIX01JSU1DRkdfTU5HTU5UX0NMQ19ESVZfSU5JVCAgICBcCi0JCQkJKE1JSU1DRkdfTUFOQUdFTUVOVF9DTE9DS19ESVZJREVfQllfMTEyKQotCi0vKiBFdGhlcm5ldCBzcGVlZCAqLwotZW51bSBlbmV0X3NwZWVkIHsKLQlFTkVUX1NQRUVEXzEwQlQsCS8qIDEwIEJhc2UgVCAqLwotCUVORVRfU1BFRURfMTAwQlQsCS8qIDEwMCBCYXNlIFQgKi8KLQlFTkVUX1NQRUVEXzEwMDBCVAkvKiAxMDAwIEJhc2UgVCAqLwotfTsKIAogLyogRXRoZXJuZXQgQWRkcmVzcyBUeXBlLiAqLwogZW51bSBlbmV0X2FkZHJfdHlwZSB7CkBAIC0xMDI2LDIyICs5NTIsNiBAQAogCUVORVRfQUREUl9UWVBFX0JST0FEQ0FTVAogfTsKIAotLyogVEJJIC8gTUlJIFNldCBSZWdpc3RlciAqLwotZW51bSBlbmV0X3RiaV9taWlfcmVnIHsKLQlFTkVUX1RCSV9NSUlfQ1IgPSAweDAwLAkvKiBDb250cm9sIChDUiApICovCi0JRU5FVF9UQklfTUlJX1NSID0gMHgwMSwJLyogU3RhdHVzIChTUiApICovCi0JRU5FVF9UQklfTUlJX0FOQSA9IDB4MDQsCS8qIEFOIGFkdmVydGlzZW1lbnQgKEFOQSApICovCi0JRU5FVF9UQklfTUlJX0FOTFBCUEEgPSAweDA1LAkvKiBBTiBsaW5rIHBhcnRuZXIgYmFzZSBwYWdlIGFiaWxpdHkKLQkJCQkJICAgKEFOTFBCUEEpICovCi0JRU5FVF9UQklfTUlJX0FORVggPSAweDA2LAkvKiBBTiBleHBhbnNpb24gKEFORVggKSAqLwotCUVORVRfVEJJX01JSV9BTk5QVCA9IDB4MDcsCS8qIEFOIG5leHQgcGFnZSB0cmFuc21pdCAoQU5OUFQgKSAqLwotCUVORVRfVEJJX01JSV9BTkxQQU5QID0gMHgwOCwJLyogQU4gbGluayBwYXJ0bmVyIGFiaWxpdHkgbmV4dCBwYWdlCi0JCQkJCSAgIChBTkxQQU5QKSAqLwotCUVORVRfVEJJX01JSV9FWFNUID0gMHgwRiwJLyogRXh0ZW5kZWQgc3RhdHVzIChFWFNUICkgKi8KLQlFTkVUX1RCSV9NSUlfSkQgPSAweDEwLAkvKiBKaXR0ZXIgZGlhZ25vc3RpY3MgKEpEICkgKi8KLQlFTkVUX1RCSV9NSUlfVEJJQ09OID0gMHgxMQkvKiBUQkkgY29udHJvbCAoVEJJQ09OICkgKi8KLX07Ci0KIC8qIFVDQyBHRVRIIDgyeHggRXRoZXJuZXQgQWRkcmVzcyBSZWNvZ25pdGlvbiBMb2NhdGlvbiAqLwogZW51bSB1Y2NfZ2V0aF9lbmV0X2FkZHJlc3NfcmVjb2duaXRpb25fbG9jYXRpb24gewogCVVDQ19HRVRIX0VORVRfQUREUkVTU19SRUNPR05JVElPTl9MT0NBVElPTl9TVEFUSU9OX0FERFJFU1MsLyogc3RhdGlvbgpAQCAtMTIzOSw4ICsxMTQ5LDcgQEAKIAl1MTYgcGF1c2VQZXJpb2Q7CiAJdTE2IGV4dGVuc2lvbkZpZWxkOwogCXU4IHBoeV9hZGRyZXNzOwotCXUzMiBib2FyZF9mbGFnczsKLQl1MzIgcGh5X2ludGVycnVwdDsKKwl1MzIgbWRpb19idXM7CiAJdTggd2VpZ2h0ZmFjdG9yW05VTV9UWF9RVUVVRVNdOwogCXU4IGludGVycnVwdGNvYWxlc2NpbmdtYXh2YWx1ZVtOVU1fUlhfUVVFVUVTXTsKIAl1OCBsMnF0W1VDQ19HRVRIX1ZMQU5fUFJJT1JJVFlfTUFYXTsKQEAgLTEyNDksNyArMTE1OCw2IEBACiAJdTggaXBob2Zmc2V0W1RYX0lQX09GRlNFVF9FTlRSWV9NQVhdOwogCXUxNiBiZFJpbmdMZW5UeFtOVU1fVFhfUVVFVUVTXTsKIAl1MTYgYmRSaW5nTGVuUnhbTlVNX1JYX1FVRVVFU107Ci0JZW51bSBlbmV0X2ludGVyZmFjZSBlbmV0X2ludGVyZmFjZTsKIAllbnVtIHVjY19nZXRoX251bV9vZl9zdGF0aW9uX2FkZHJlc3NlcyBudW1TdGF0aW9uQWRkcmVzc2VzOwogCWVudW0gcWVfZmx0cl9sYXJnZXN0X2V4dGVybmFsX3RibF9sb29rdXBfa2V5X3NpemUKIAkgICAgbGFyZ2VzdGV4dGVybmFsbG9va3Vwa2V5c2l6ZTsKQEAgLTEzMjYsOSArMTIzNCwxMSBAQAogCS8qIGluZGV4IG9mIHRoZSBmaXJzdCBza2Igd2hpY2ggaGFzbid0IGJlZW4gdHJhbnNtaXR0ZWQgeWV0LiAqLwogCXUxNiBza2JfZGlydHl0eFtOVU1fVFhfUVVFVUVTXTsKIAotCXN0cnVjdCB3b3JrX3N0cnVjdCB0cTsKLQlzdHJ1Y3QgdGltZXJfbGlzdCBwaHlfaW5mb190aW1lcjsKIAlzdHJ1Y3QgdWdldGhfbWlpX2luZm8gKm1paV9pbmZvOworCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXY7CisJcGh5X2ludGVyZmFjZV90IHBoeV9pbnRlcmZhY2U7CisJaW50IG1heF9zcGVlZDsKKwl1aW50MzJfdCBtc2dfZW5hYmxlOwogCWludCBvbGRzcGVlZDsKIAlpbnQgb2xkZHVwbGV4OwogCWludCBvbGRsaW5rOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdWNjX2dldGhfbWlpLmMgYi9kcml2ZXJzL25ldC91Y2NfZ2V0aF9taWkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2I1YTUzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvdWNjX2dldGhfbWlpLmMKQEAgLTAsMCArMSwyNzkgQEAKKy8qCisgKiBkcml2ZXJzL25ldC91Y2NfZ2V0aF9taWkuYworICoKKyAqIEdpYW5mYXIgRXRoZXJuZXQgRHJpdmVyIC0tIE1JSU0gYnVzIGltcGxlbWVudGF0aW9uCisgKiBQcm92aWRlcyBCdXMgaW50ZXJmYWNlIGZvciBNSUlNIHJlZ3MKKyAqCisgKiBBdXRob3I6IExpIFlhbmcKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGFzbS9vY3AuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorI2luY2x1ZGUgPGxpbnV4L21paS5oPgorI2luY2x1ZGUgPGxpbnV4L3BoeS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzbF9kZXZpY2VzLmg+CisKKyNpbmNsdWRlIDxhc20vb2ZfcGxhdGZvcm0uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vdWNjLmg+CisKKyNpbmNsdWRlICJ1Y2NfZ2V0aF9taWkuaCIKKyNpbmNsdWRlICJ1Y2NfZ2V0aC5oIgorCisjZGVmaW5lIERFQlVHCisjaWZkZWYgREVCVUcKKyNkZWZpbmUgdmRiZyhmb3JtYXQsIGFyZy4uLikgcHJpbnRrKEtFUk5fREVCVUcgLCBmb3JtYXQgIlxuIiAsICMjIGFyZykKKyNlbHNlCisjZGVmaW5lIHZkYmcoZm9ybWF0LCBhcmcuLi4pIGRvIHt9IHdoaWxlKDApCisjZW5kaWYKKworI2RlZmluZSBEUlZfREVTQyAiUUUgVUNDIEV0aGVybmV0IENvbnRyb2xsZXIgTUlJIEJ1cyIKKyNkZWZpbmUgRFJWX05BTUUgImZzbC11ZWNfbWRpbyIKKworLyogV3JpdGUgdmFsdWUgdG8gdGhlIFBIWSBmb3IgdGhpcyBkZXZpY2UgdG8gdGhlIHJlZ2lzdGVyIGF0IHJlZ251bSwgKi8KKy8qIHdhaXRpbmcgdW50aWwgdGhlIHdyaXRlIGlzIGRvbmUgYmVmb3JlIGl0IHJldHVybnMuICBBbGwgUEhZICovCisvKiBjb25maWd1cmF0aW9uIGhhcyB0byBiZSBkb25lIHRocm91Z2ggdGhlIG1hc3RlciBVRUMgTUlJTSByZWdzICovCitpbnQgdWVjX21kaW9fd3JpdGUoc3RydWN0IG1paV9idXMgKmJ1cywgaW50IG1paV9pZCwgaW50IHJlZ251bSwgdTE2IHZhbHVlKQoreworCXN0cnVjdCB1Y2NfbWlpX21uZyBfX2lvbWVtICpyZWdzID0gKHZvaWQgX19pb21lbSAqKWJ1cy0+cHJpdjsKKworCS8qIFNldHRpbmcgdXAgdGhlIE1JSSBNYW5nZW1lbnQgQWRkcmVzcyBSZWdpc3RlciAqLworCW91dF9iZTMyKCZyZWdzLT5taWltYWRkLAorCQkgKG1paV9pZCA8PCBNSUlNQUREX1BIWV9BRERSRVNTX1NISUZUKSB8IHJlZ251bSk7CisKKwkvKiBTZXR0aW5nIHVwIHRoZSBNSUkgTWFuZ2VtZW50IENvbnRyb2wgUmVnaXN0ZXIgd2l0aCB0aGUgdmFsdWUgKi8KKwlvdXRfYmUzMigmcmVncy0+bWlpbWNvbiwgdmFsdWUpOworCisJLyogV2FpdCB0aWxsIE1JSSBtYW5hZ2VtZW50IHdyaXRlIGlzIGNvbXBsZXRlICovCisJd2hpbGUgKChpbl9iZTMyKCZyZWdzLT5taWltaW5kKSkgJiBNSUlNSU5EX0JVU1kpCisJCWNwdV9yZWxheCgpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFJlYWRzIGZyb20gcmVnaXN0ZXIgcmVnbnVtIGluIHRoZSBQSFkgZm9yIGRldmljZSBkZXYsICovCisvKiByZXR1cm5pbmcgdGhlIHZhbHVlLiAgQ2xlYXJzIG1paW1jb20gZmlyc3QuICBBbGwgUEhZICovCisvKiBjb25maWd1cmF0aW9uIGhhcyB0byBiZSBkb25lIHRocm91Z2ggdGhlIFRTRUMxIE1JSU0gcmVncyAqLworaW50IHVlY19tZGlvX3JlYWQoc3RydWN0IG1paV9idXMgKmJ1cywgaW50IG1paV9pZCwgaW50IHJlZ251bSkKK3sKKwlzdHJ1Y3QgdWNjX21paV9tbmcgX19pb21lbSAqcmVncyA9ICh2b2lkIF9faW9tZW0gKilidXMtPnByaXY7CisJdTE2IHZhbHVlOworCisJLyogU2V0dGluZyB1cCB0aGUgTUlJIE1hbmdlbWVudCBBZGRyZXNzIFJlZ2lzdGVyICovCisJb3V0X2JlMzIoJnJlZ3MtPm1paW1hZGQsCisJCSAobWlpX2lkIDw8IE1JSU1BRERfUEhZX0FERFJFU1NfU0hJRlQpIHwgcmVnbnVtKTsKKworCS8qIENsZWFyIG1paW1jb20sIHBlcmZvcm0gYW4gTUlJIG1hbmFnZW1lbnQgcmVhZCBjeWNsZSAqLworCW91dF9iZTMyKCZyZWdzLT5taWltY29tLCAwKTsKKwlvdXRfYmUzMigmcmVncy0+bWlpbWNvbSwgTUlJTUNPTV9SRUFEX0NZQ0xFKTsKKworCS8qIFdhaXQgdGlsbCBNSUkgbWFuYWdlbWVudCB3cml0ZSBpcyBjb21wbGV0ZSAqLworCXdoaWxlICgoaW5fYmUzMigmcmVncy0+bWlpbWluZCkpICYgKE1JSU1JTkRfQlVTWSB8IE1JSU1JTkRfTk9UX1ZBTElEKSkKKwkJY3B1X3JlbGF4KCk7CisKKwkvKiBSZWFkIE1JSSBtYW5hZ2VtZW50IHN0YXR1cyAgKi8KKwl2YWx1ZSA9IGluX2JlMzIoJnJlZ3MtPm1paW1zdGF0KTsKKworCXJldHVybiB2YWx1ZTsKK30KKworLyogUmVzZXQgdGhlIE1JSU0gcmVnaXN0ZXJzLCBhbmQgd2FpdCBmb3IgdGhlIGJ1cyB0byBmcmVlICovCitpbnQgdWVjX21kaW9fcmVzZXQoc3RydWN0IG1paV9idXMgKmJ1cykKK3sKKwlzdHJ1Y3QgdWNjX21paV9tbmcgX19pb21lbSAqcmVncyA9ICh2b2lkIF9faW9tZW0gKilidXMtPnByaXY7CisJdW5zaWduZWQgaW50IHRpbWVvdXQgPSBQSFlfSU5JVF9USU1FT1VUOworCisJc3Bpbl9sb2NrX2JoKCZidXMtPm1kaW9fbG9jayk7CisKKwkvKiBSZXNldCB0aGUgbWFuYWdlbWVudCBpbnRlcmZhY2UgKi8KKwlvdXRfYmUzMigmcmVncy0+bWlpbWNmZywgTUlJTUNGR19SRVNFVF9NQU5BR0VNRU5UKTsKKworCS8qIFNldHVwIHRoZSBNSUkgTWdtdCBjbG9jayBzcGVlZCAqLworCW91dF9iZTMyKCZyZWdzLT5taWltY2ZnLCBNSUlNQ0ZHX01BTkFHRU1FTlRfQ0xPQ0tfRElWSURFX0JZXzExMik7CisKKwkvKiBXYWl0IHVudGlsIHRoZSBidXMgaXMgZnJlZSAqLworCXdoaWxlICgoaW5fYmUzMigmcmVncy0+bWlpbWluZCkgJiBNSUlNSU5EX0JVU1kpICYmIHRpbWVvdXQtLSkKKwkJY3B1X3JlbGF4KCk7CisKKwlzcGluX3VubG9ja19iaCgmYnVzLT5tZGlvX2xvY2spOworCisJaWYgKHRpbWVvdXQgPD0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBUaGUgTUlJIEJ1cyBpcyBzdHVjayFcbiIsIGJ1cy0+bmFtZSk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdWVjX21kaW9fcHJvYmUoc3RydWN0IG9mX2RldmljZSAqb2ZkZXYsIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoKQoreworCXN0cnVjdCBkZXZpY2UgKmRldmljZSA9ICZvZmRldi0+ZGV2OworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBvZmRldi0+bm9kZSwgKnRlbXBucCA9IE5VTEw7CisJc3RydWN0IGRldmljZV9ub2RlICpjaGlsZCA9IE5VTEw7CisJc3RydWN0IHVjY19taWlfbW5nIF9faW9tZW0gKnJlZ3M7CisJc3RydWN0IG1paV9idXMgKm5ld19idXM7CisJc3RydWN0IHJlc291cmNlIHJlczsKKwlpbnQgaywgZXJyID0gMDsKKworCW5ld19idXMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbWlpX2J1cyksIEdGUF9LRVJORUwpOworCisJaWYgKE5VTEwgPT0gbmV3X2J1cykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwluZXdfYnVzLT5uYW1lID0gIlVDQyBFdGhlcm5ldCBDb250cm9sbGVyIE1JSSBCdXMiOworCW5ld19idXMtPnJlYWQgPSAmdWVjX21kaW9fcmVhZDsKKwluZXdfYnVzLT53cml0ZSA9ICZ1ZWNfbWRpb193cml0ZTsKKwluZXdfYnVzLT5yZXNldCA9ICZ1ZWNfbWRpb19yZXNldDsKKworCW1lbXNldCgmcmVzLCAwLCBzaXplb2YocmVzKSk7CisKKwllcnIgPSBvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5wLCAwLCAmcmVzKTsKKwlpZiAoZXJyKQorCQlnb3RvIHJlZ19tYXBfZmFpbDsKKworCW5ld19idXMtPmlkID0gcmVzLnN0YXJ0OworCisJbmV3X2J1cy0+aXJxID0ga21hbGxvYygzMiAqIHNpemVvZihpbnQpLCBHRlBfS0VSTkVMKTsKKworCWlmIChOVUxMID09IG5ld19idXMtPmlycSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIHJlZ19tYXBfZmFpbDsKKwl9CisKKwlmb3IgKGsgPSAwOyBrIDwgMzI7IGsrKykKKwkJbmV3X2J1cy0+aXJxW2tdID0gUEhZX1BPTEw7CisKKwl3aGlsZSAoKGNoaWxkID0gb2ZfZ2V0X25leHRfY2hpbGQobnAsIGNoaWxkKSkgIT0gTlVMTCkgeworCQlpbnQgaXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAoY2hpbGQsIDApOworCQlpZiAoaXJxICE9IE5PX0lSUSkgeworCQkJY29uc3QgdTMyICppZCA9IGdldF9wcm9wZXJ0eShjaGlsZCwgInJlZyIsIE5VTEwpOworCQkJbmV3X2J1cy0+aXJxWyppZF0gPSBpcnE7CisJCX0KKwl9CisKKwkvKiBTZXQgdGhlIGJhc2UgYWRkcmVzcyAqLworCXJlZ3MgPSBpb3JlbWFwKHJlcy5zdGFydCwgc2l6ZW9mKHN0cnVjdCB1Y2NfbWlpX21uZykpOworCisJaWYgKE5VTEwgPT0gcmVncykgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGlvcmVtYXBfZmFpbDsKKwl9CisKKwluZXdfYnVzLT5wcml2ID0gKHZvaWQgX19mb3JjZSAqKXJlZ3M7CisKKwluZXdfYnVzLT5kZXYgPSBkZXZpY2U7CisJZGV2X3NldF9kcnZkYXRhKGRldmljZSwgbmV3X2J1cyk7CisKKwkvKiBSZWFkIE1JSSBtYW5hZ2VtZW50IG1hc3RlciBmcm9tIGRldmljZSB0cmVlICovCisJd2hpbGUgKCh0ZW1wbnAgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZSh0ZW1wbnAsICJuZXR3b3JrIiwgInVjY19nZXRoIikpCisJICAgICAgICE9IE5VTEwpIHsKKwkJc3RydWN0IHJlc291cmNlIHRlbXByZXM7CisKKwkJZXJyID0gb2ZfYWRkcmVzc190b19yZXNvdXJjZSh0ZW1wbnAsIDAsICZ0ZW1wcmVzKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gYnVzX3JlZ2lzdGVyX2ZhaWw7CisKKwkJLyogaWYgb3VyIG1kaW8gcmVncyBmYWxsIHdpdGhpbiB0aGlzIFVDQyByZWdzIHJhbmdlICovCisJCWlmICgocmVzLnN0YXJ0ID49IHRlbXByZXMuc3RhcnQpICYmCisJCSAgICAocmVzLmVuZCA8PSB0ZW1wcmVzLmVuZCkpIHsKKwkJCS8qIHNldCB0aGlzIFVDQyB0byBiZSB0aGUgTUlJIG1hc3RlciAqLworCQkJY29uc3QgdTMyICppZCA9IGdldF9wcm9wZXJ0eSh0ZW1wbnAsICJkZXZpY2UtaWQiLCBOVUxMKTsKKwkJCWlmIChpZCA9PSBOVUxMKQorCQkJCWdvdG8gYnVzX3JlZ2lzdGVyX2ZhaWw7CisKKwkJCXVjY19zZXRfcWVfbXV4X21paV9tbmcoKmlkIC0gMSk7CisKKwkJCS8qIGFzc2lnbiB0aGUgVEJJIGFuIGFkZHJlc3Mgd2hpY2ggd29uJ3QKKwkJCSAqIGNvbmZsaWN0IHdpdGggdGhlIFBIWXMgKi8KKwkJCW91dF9iZTMyKCZyZWdzLT51dGJpcGFyLCBVVEJJUEFSX0lOSVRfVEJJUEEpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwllcnIgPSBtZGlvYnVzX3JlZ2lzdGVyKG5ld19idXMpOworCWlmICgwICE9IGVycikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDYW5ub3QgcmVnaXN0ZXIgYXMgTURJTyBidXNcbiIsCisJCSAgICAgICBuZXdfYnVzLT5uYW1lKTsKKwkJZ290byBidXNfcmVnaXN0ZXJfZmFpbDsKKwl9CisKKwlyZXR1cm4gMDsKKworYnVzX3JlZ2lzdGVyX2ZhaWw6CisJaW91bm1hcChyZWdzKTsKK2lvcmVtYXBfZmFpbDoKKwlrZnJlZShuZXdfYnVzLT5pcnEpOworcmVnX21hcF9mYWlsOgorCWtmcmVlKG5ld19idXMpOworCisJcmV0dXJuIGVycjsKK30KKworaW50IHVlY19tZGlvX3JlbW92ZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvZmRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXZpY2UgPSAmb2ZkZXYtPmRldjsKKwlzdHJ1Y3QgbWlpX2J1cyAqYnVzID0gZGV2X2dldF9kcnZkYXRhKGRldmljZSk7CisKKwltZGlvYnVzX3VucmVnaXN0ZXIoYnVzKTsKKworCWRldl9zZXRfZHJ2ZGF0YShkZXZpY2UsIE5VTEwpOworCisJaW91bm1hcCgodm9pZCBfX2lvbWVtICopYnVzLT5wcml2KTsKKwlidXMtPnByaXYgPSBOVUxMOworCWtmcmVlKGJ1cyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgdWVjX21kaW9fbWF0Y2hbXSA9IHsKKwl7CisJCS50eXBlID0gIm1kaW8iLAorCQkuY29tcGF0aWJsZSA9ICJ1Y2NfZ2V0aF9waHkiLAorCX0sCisJe30sCit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCB1ZWNfbWRpb19tYXRjaCk7CisKK3N0YXRpYyBzdHJ1Y3Qgb2ZfcGxhdGZvcm1fZHJpdmVyIHVlY19tZGlvX2RyaXZlciA9IHsKKwkubmFtZQk9IERSVl9OQU1FLAorCS5wcm9iZQk9IHVlY19tZGlvX3Byb2JlLAorCS5yZW1vdmUJPSB1ZWNfbWRpb19yZW1vdmUsCisJLm1hdGNoX3RhYmxlCT0gdWVjX21kaW9fbWF0Y2gsCit9OworCitpbnQgX19pbml0IHVlY19tZGlvX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gb2ZfcmVnaXN0ZXJfcGxhdGZvcm1fZHJpdmVyKCZ1ZWNfbWRpb19kcml2ZXIpOworfQorCit2b2lkIF9fZXhpdCB1ZWNfbWRpb19leGl0KHZvaWQpCit7CisJb2ZfdW5yZWdpc3Rlcl9wbGF0Zm9ybV9kcml2ZXIoJnVlY19tZGlvX2RyaXZlcik7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC91Y2NfZ2V0aF9taWkuaCBiL2RyaXZlcnMvbmV0L3VjY19nZXRoX21paS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4NDMwZmUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC91Y2NfZ2V0aF9taWkuaApAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAqIGRyaXZlcnMvbmV0L3VjY19nZXRoX21paS5oCisgKgorICogR2lhbmZhciBFdGhlcm5ldCBEcml2ZXIgLS0gTUlJIE1hbmFnZW1lbnQgQnVzIEltcGxlbWVudGF0aW9uCisgKiBEcml2ZXIgZm9yIHRoZSBNRElPIGJ1cyBjb250cm9sbGVyIGluIHRoZSBHaWFuZmFyIHJlZ2lzdGVyIHNwYWNlCisgKgorICogQXV0aG9yOiBBbmR5IEZsZW1pbmcKKyAqIE1haW50YWluZXI6IEt1bWFyIEdhbGEKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisjaWZuZGVmIF9fVUVDX01JSV9ICisjZGVmaW5lIF9fVUVDX01JSV9ICisKKy8qIFVDQyBHRVRIIE1JSU1DRkcgKE1JSSBNYW5hZ2VtZW50IENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIpICovCisjZGVmaW5lIE1JSU1DRkdfUkVTRVRfTUFOQUdFTUVOVCAgICAgICAgICAgICAgICAweDgwMDAwMDAwCS8qIFJlc2V0CisJCQkJCQkJCSAgIG1hbmFnZW1lbnQgKi8KKyNkZWZpbmUgTUlJTUNGR19OT19QUkVBTUJMRSAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAJLyogUHJlYW1ibGUKKwkJCQkJCQkJICAgc3VwcHJlc3MgKi8KKyNkZWZpbmUgTUlJTUNGR19DTE9DS19ESVZJREVfU0hJRlQgICAgICAgICAgICAgICgzMSAtIDMxKQkvKiBjbG9jayBkaXZpZGUKKwkJCQkJCQkJICAgPDwgc2hpZnQgKi8KKyNkZWZpbmUgTUlJTUNGR19DTE9DS19ESVZJREVfTUFYICAgICAgICAgICAgICAgIDB4ZgkvKiBtYXggY2xvY2sgZGl2aWRlICovCisjZGVmaW5lIE1JSU1DRkdfTUFOQUdFTUVOVF9DTE9DS19ESVZJREVfQllfMiAgICAweDAwMDAwMDAwCisjZGVmaW5lIE1JSU1DRkdfTUFOQUdFTUVOVF9DTE9DS19ESVZJREVfQllfNCAgICAweDAwMDAwMDAxCisjZGVmaW5lIE1JSU1DRkdfTUFOQUdFTUVOVF9DTE9DS19ESVZJREVfQllfNiAgICAweDAwMDAwMDAyCisjZGVmaW5lIE1JSU1DRkdfTUFOQUdFTUVOVF9DTE9DS19ESVZJREVfQllfOCAgICAweDAwMDAwMDAzCisjZGVmaW5lIE1JSU1DRkdfTUFOQUdFTUVOVF9DTE9DS19ESVZJREVfQllfMTAgICAweDAwMDAwMDA0CisjZGVmaW5lIE1JSU1DRkdfTUFOQUdFTUVOVF9DTE9DS19ESVZJREVfQllfMTQgICAweDAwMDAwMDA1CisjZGVmaW5lIE1JSU1DRkdfTUFOQUdFTUVOVF9DTE9DS19ESVZJREVfQllfMTYgICAweDAwMDAwMDA4CisjZGVmaW5lIE1JSU1DRkdfTUFOQUdFTUVOVF9DTE9DS19ESVZJREVfQllfMjAgICAweDAwMDAwMDA2CisjZGVmaW5lIE1JSU1DRkdfTUFOQUdFTUVOVF9DTE9DS19ESVZJREVfQllfMjggICAweDAwMDAwMDA3CisjZGVmaW5lIE1JSU1DRkdfTUFOQUdFTUVOVF9DTE9DS19ESVZJREVfQllfMzIgICAweDAwMDAwMDA5CisjZGVmaW5lIE1JSU1DRkdfTUFOQUdFTUVOVF9DTE9DS19ESVZJREVfQllfNDggICAweDAwMDAwMDBhCisjZGVmaW5lIE1JSU1DRkdfTUFOQUdFTUVOVF9DTE9DS19ESVZJREVfQllfNjQgICAweDAwMDAwMDBiCisjZGVmaW5lIE1JSU1DRkdfTUFOQUdFTUVOVF9DTE9DS19ESVZJREVfQllfODAgICAweDAwMDAwMDBjCisjZGVmaW5lIE1JSU1DRkdfTUFOQUdFTUVOVF9DTE9DS19ESVZJREVfQllfMTEyICAweDAwMDAwMDBkCisjZGVmaW5lIE1JSU1DRkdfTUFOQUdFTUVOVF9DTE9DS19ESVZJREVfQllfMTYwICAweDAwMDAwMDBlCisjZGVmaW5lIE1JSU1DRkdfTUFOQUdFTUVOVF9DTE9DS19ESVZJREVfQllfMjI0ICAweDAwMDAwMDBmCisKKy8qIFVDQyBHRVRIIE1JSU1DT00gKE1JSSBNYW5hZ2VtZW50IENvbW1hbmQgUmVnaXN0ZXIpICovCisjZGVmaW5lIE1JSU1DT01fU0NBTl9DWUNMRSAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCS8qIFNjYW4gY3ljbGUgKi8KKyNkZWZpbmUgTUlJTUNPTV9SRUFEX0NZQ0xFICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEJLyogUmVhZCBjeWNsZSAqLworCisvKiBVQ0MgR0VUSCBNSUlNQUREIChNSUkgTWFuYWdlbWVudCBBZGRyZXNzIFJlZ2lzdGVyKSAqLworI2RlZmluZSBNSUlNQUREX1BIWV9BRERSRVNTX1NISUZUICAgICAgICAgICAgICAgKDMxIC0gMjMpCS8qIFBIWSBBZGRyZXNzCisJCQkJCQkJCSAgIDw8IHNoaWZ0ICovCisjZGVmaW5lIE1JSU1BRERfUEhZX1JFR0lTVEVSX1NISUZUICAgICAgICAgICAgICAoMzEgLSAzMSkJLyogUEhZIFJlZ2lzdGVyCisJCQkJCQkJCSAgIDw8IHNoaWZ0ICovCisKKy8qIFVDQyBHRVRIIE1JSU1DT04gKE1JSSBNYW5hZ2VtZW50IENvbnRyb2wgUmVnaXN0ZXIpICovCisjZGVmaW5lIE1JSU1DT05fUEhZX0NPTlRST0xfU0hJRlQgICAgICAgICAgICAgICAoMzEgLSAzMSkJLyogUEhZIENvbnRyb2wKKwkJCQkJCQkJICAgPDwgc2hpZnQgKi8KKyNkZWZpbmUgTUlJTUNPTl9QSFlfU1RBVFVTX1NISUZUICAgICAgICAgICAgICAgICgzMSAtIDMxKQkvKiBQSFkgU3RhdHVzCisJCQkJCQkJCSAgIDw8IHNoaWZ0ICovCisKKy8qIFVDQyBHRVRIIE1JSU1JTkQgKE1JSSBNYW5hZ2VtZW50IEluZGljYXRvciBSZWdpc3RlcikgKi8KKyNkZWZpbmUgTUlJTUlORF9OT1RfVkFMSUQgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQJLyogTm90IHZhbGlkICovCisjZGVmaW5lIE1JSU1JTkRfU0NBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCS8qIFNjYW4gaW4KKwkJCQkJCQkJICAgcHJvZ3Jlc3MgKi8KKyNkZWZpbmUgTUlJTUlORF9CVVNZICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKworLyogSW5pdGlhbCBUQkkgUGh5c2ljYWwgQWRkcmVzcyAqLworI2RlZmluZSBVVEJJUEFSX0lOSVRfVEJJUEEJCQkweDFmCisKK3N0cnVjdCB1Y2NfbWlpX21uZyB7CisJdTMyIG1paW1jZmc7CQkvKiBNSUkgbWFuYWdlbWVudCBjb25maWd1cmF0aW9uIHJlZyAqLworCXUzMiBtaWltY29tOwkJLyogTUlJIG1hbmFnZW1lbnQgY29tbWFuZCByZWcgKi8KKwl1MzIgbWlpbWFkZDsJCS8qIE1JSSBtYW5hZ2VtZW50IGFkZHJlc3MgcmVnICovCisJdTMyIG1paW1jb247CQkvKiBNSUkgbWFuYWdlbWVudCBjb250cm9sIHJlZyAqLworCXUzMiBtaWltc3RhdDsJCS8qIE1JSSBtYW5hZ2VtZW50IHN0YXR1cyByZWcgKi8KKwl1MzIgbWlpbWluZDsJCS8qIE1JSSBtYW5hZ2VtZW50IGluZGljYXRpb24gcmVnICovCisJdTggbm90Y2FyZVsyOF07CQkvKiBTcGFjZSBob2xkZXIgKi8KKwl1MzIgdXRiaXBhcjsJCS8qIFRCSSBwaHkgYWRkcmVzcyByZWcgKi8KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBUQkkgLyBNSUkgU2V0IFJlZ2lzdGVyICovCitlbnVtIGVuZXRfdGJpX21paV9yZWcgeworCUVORVRfVEJJX01JSV9DUiA9IDB4MDAsCS8qIENvbnRyb2wgKi8KKwlFTkVUX1RCSV9NSUlfU1IgPSAweDAxLAkvKiBTdGF0dXMgKi8KKwlFTkVUX1RCSV9NSUlfQU5BID0gMHgwNCwJLyogQU4gYWR2ZXJ0aXNlbWVudCAqLworCUVORVRfVEJJX01JSV9BTkxQQlBBID0gMHgwNSwJLyogQU4gbGluayBwYXJ0bmVyIGJhc2UgcGFnZSBhYmlsaXR5ICovCisJRU5FVF9UQklfTUlJX0FORVggPSAweDA2LAkvKiBBTiBleHBhbnNpb24gKi8KKwlFTkVUX1RCSV9NSUlfQU5OUFQgPSAweDA3LAkvKiBBTiBuZXh0IHBhZ2UgdHJhbnNtaXQgKi8KKwlFTkVUX1RCSV9NSUlfQU5MUEFOUCA9IDB4MDgsCS8qIEFOIGxpbmsgcGFydG5lciBhYmlsaXR5IG5leHQgcGFnZSAqLworCUVORVRfVEJJX01JSV9FWFNUID0gMHgwRiwJLyogRXh0ZW5kZWQgc3RhdHVzICovCisJRU5FVF9UQklfTUlJX0pEID0gMHgxMCwJLyogSml0dGVyIGRpYWdub3N0aWNzICovCisJRU5FVF9UQklfTUlJX1RCSUNPTiA9IDB4MTEJLyogVEJJIGNvbnRyb2wgKi8KK307CisKK2ludCB1ZWNfbWRpb19yZWFkKHN0cnVjdCBtaWlfYnVzICpidXMsIGludCBtaWlfaWQsIGludCByZWdudW0pOworaW50IHVlY19tZGlvX3dyaXRlKHN0cnVjdCBtaWlfYnVzICpidXMsIGludCBtaWlfaWQsIGludCByZWdudW0sIHUxNiB2YWx1ZSk7CitpbnQgX19pbml0IHVlY19tZGlvX2luaXQodm9pZCk7Cit2b2lkIF9fZXhpdCB1ZWNfbWRpb19leGl0KHZvaWQpOworI2VuZGlmCQkJCS8qIF9fVUVDX01JSV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC91Y2NfZ2V0aF9waHkuYyBiL2RyaXZlcnMvbmV0L3VjY19nZXRoX3BoeS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzczZDg5NS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC91Y2NfZ2V0aF9waHkuYworKysgL2Rldi9udWxsCkBAIC0xLDc4NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSBGcmVlc2NhbGUgU2VtaWNvbmR1dG9yLCBJbmMuIDIwMDYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogQXV0aG9yOiBTaGxvbWkgR3JpZGlzaCA8Z3JpZGlzaEBmcmVlc2NhbGUuY29tPgotICoKLSAqIERlc2NyaXB0aW9uOgotICogVUNDIEdFVEggRHJpdmVyIC0tIFBIWSBoYW5kbGluZwotICoKLSAqIENoYW5nZWxvZzoKLSAqIEp1biAyOCwgMjAwNiBMaSBZYW5nIDxMZW9MaUBmcmVlc2NhbGUuY29tPgotICogLSBSZWFycmFuZ2UgY29kZSBhbmQgc3R5bGUgZml4ZXMKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCi0gKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgotI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+Ci0jaW5jbHVkZSA8bGludXgvbWlpLmg+Ci0jaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgotCi0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL2lycS5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0KLSNpbmNsdWRlICJ1Y2NfZ2V0aC5oIgotI2luY2x1ZGUgInVjY19nZXRoX3BoeS5oIgotCi0jZGVmaW5lIHVncGh5X3ByaW50ayhsZXZlbCwgZm9ybWF0LCBhcmcuLi4pICBcCi0gICAgICAgIHByaW50ayhsZXZlbCBmb3JtYXQgIlxuIiwgIyMgYXJnKQotCi0jZGVmaW5lIHVncGh5X2RiZyhmb3JtYXQsIGFyZy4uLikgICAgICAgICAgICBcCi0gICAgICAgIHVncGh5X3ByaW50ayhLRVJOX0RFQlVHLCBmb3JtYXQgLCAjIyBhcmcpCi0jZGVmaW5lIHVncGh5X2Vycihmb3JtYXQsIGFyZy4uLikgICAgICAgICAgICBcCi0gICAgICAgIHVncGh5X3ByaW50ayhLRVJOX0VSUiwgZm9ybWF0ICwgIyMgYXJnKQotI2RlZmluZSB1Z3BoeV9pbmZvKGZvcm1hdCwgYXJnLi4uKSAgICAgICAgICAgXAotICAgICAgICB1Z3BoeV9wcmludGsoS0VSTl9JTkZPLCBmb3JtYXQgLCAjIyBhcmcpCi0jZGVmaW5lIHVncGh5X3dhcm4oZm9ybWF0LCBhcmcuLi4pICAgICAgICAgICBcCi0gICAgICAgIHVncGh5X3ByaW50ayhLRVJOX1dBUk5JTkcsIGZvcm1hdCAsICMjIGFyZykKLQotI2lmZGVmIFVHRVRIX1ZFUkJPU0VfREVCVUcKLSNkZWZpbmUgdWdwaHlfdmRiZyB1Z3BoeV9kYmcKLSNlbHNlCi0jZGVmaW5lIHVncGh5X3ZkYmcoZm10LCBhcmdzLi4uKSBkbyB7IH0gd2hpbGUgKDApCi0jZW5kaWYJCQkJLyogVUdFVEhfVkVSQk9TRV9ERUJVRyAqLwotCi1zdGF0aWMgdm9pZCBjb25maWdfZ2VubWlpX2FkdmVydChzdHJ1Y3QgdWdldGhfbWlpX2luZm8gKm1paV9pbmZvKTsKLXN0YXRpYyB2b2lkIGdlbm1paV9zZXR1cF9mb3JjZWQoc3RydWN0IHVnZXRoX21paV9pbmZvICptaWlfaW5mbyk7Ci1zdGF0aWMgdm9pZCBnZW5taWlfcmVzdGFydF9hbmVnKHN0cnVjdCB1Z2V0aF9taWlfaW5mbyAqbWlpX2luZm8pOwotc3RhdGljIGludCBnYml0X2NvbmZpZ19hbmVnKHN0cnVjdCB1Z2V0aF9taWlfaW5mbyAqbWlpX2luZm8pOwotc3RhdGljIGludCBnZW5taWlfY29uZmlnX2FuZWcoc3RydWN0IHVnZXRoX21paV9pbmZvICptaWlfaW5mbyk7Ci1zdGF0aWMgaW50IGdlbm1paV91cGRhdGVfbGluayhzdHJ1Y3QgdWdldGhfbWlpX2luZm8gKm1paV9pbmZvKTsKLXN0YXRpYyBpbnQgZ2VubWlpX3JlYWRfc3RhdHVzKHN0cnVjdCB1Z2V0aF9taWlfaW5mbyAqbWlpX2luZm8pOwotCi1zdGF0aWMgdTE2IHVjY19nZXRoX3BoeV9yZWFkKHN0cnVjdCB1Z2V0aF9taWlfaW5mbyAqbWlpX2luZm8sIHUxNiByZWdudW0pCi17Ci0JdTE2IHJldHZhbDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JdWdwaHlfdmRiZygiJXM6IElOIiwgX19GVU5DVElPTl9fKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZtaWlfaW5mby0+bWRpb19sb2NrLCBmbGFncyk7Ci0JcmV0dmFsID0gbWlpX2luZm8tPm1kaW9fcmVhZChtaWlfaW5mby0+ZGV2LCBtaWlfaW5mby0+bWlpX2lkLCByZWdudW0pOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1paV9pbmZvLT5tZGlvX2xvY2ssIGZsYWdzKTsKLQotCXJldHVybiByZXR2YWw7Ci19Ci0KLXN0YXRpYyB2b2lkIHVjY19nZXRoX3BoeV93cml0ZShzdHJ1Y3QgdWdldGhfbWlpX2luZm8gKm1paV9pbmZvLCB1MTYgcmVnbnVtLCB1MTYgdmFsKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQl1Z3BoeV92ZGJnKCIlczogSU4iLCBfX0ZVTkNUSU9OX18pOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJm1paV9pbmZvLT5tZGlvX2xvY2ssIGZsYWdzKTsKLQltaWlfaW5mby0+bWRpb193cml0ZShtaWlfaW5mby0+ZGV2LCBtaWlfaW5mby0+bWlpX2lkLCByZWdudW0sIHZhbCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWlpX2luZm8tPm1kaW9fbG9jaywgZmxhZ3MpOwotfQotCi0vKiBXcml0ZSB2YWx1ZSB0byB0aGUgUEhZIGZvciB0aGlzIGRldmljZSB0byB0aGUgcmVnaXN0ZXIgYXQgcmVnbnVtLCAqLwotLyogd2FpdGluZyB1bnRpbCB0aGUgd3JpdGUgaXMgZG9uZSBiZWZvcmUgaXQgcmV0dXJucy4gIEFsbCBQSFkgKi8KLS8qIGNvbmZpZ3VyYXRpb24gaGFzIHRvIGJlIGRvbmUgdGhyb3VnaCB0aGUgVFNFQzEgTUlJTSByZWdzICovCi12b2lkIHdyaXRlX3BoeV9yZWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG1paV9pZCwgaW50IHJlZ251bSwgaW50IHZhbHVlKQotewotCXN0cnVjdCB1Y2NfZ2V0aF9wcml2YXRlICp1Z2V0aCA9IG5ldGRldl9wcml2KGRldik7Ci0Jc3RydWN0IHVjY19taWlfbW5nICptaWlfcmVnczsKLQllbnVtIGVuZXRfdGJpX21paV9yZWcgbWlpX3JlZyA9IChlbnVtIGVuZXRfdGJpX21paV9yZWcpIHJlZ251bTsKLQl1MzIgdG1wX3JlZzsKLQotCXVncGh5X3ZkYmcoIiVzOiBJTiIsIF9fRlVOQ1RJT05fXyk7Ci0KLQlzcGluX2xvY2tfaXJxKCZ1Z2V0aC0+bG9jayk7Ci0KLQltaWlfcmVncyA9IHVnZXRoLT5taWlfaW5mby0+bWlpX3JlZ3M7Ci0KLQkvKiBTZXQgdGhpcyBVQ0MgdG8gYmUgdGhlIG1hc3RlciBvZiB0aGUgTUlJIG1hbmFnbWVudCAqLwotCXVjY19zZXRfcWVfbXV4X21paV9tbmcodWdldGgtPnVnX2luZm8tPnVmX2luZm8udWNjX251bSk7Ci0KLQkvKiBTdG9wIHRoZSBNSUkgbWFuYWdlbWVudCByZWFkIGN5Y2xlICovCi0Jb3V0X2JlMzIoJm1paV9yZWdzLT5taWltY29tLCAwKTsKLQkvKiBTZXR0aW5nIHVwIHRoZSBNSUkgTWFuZ2VtZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KLQl0bXBfcmVnID0gKCh1MzIpIG1paV9pZCA8PCBNSUlNQUREX1BIWV9BRERSRVNTX1NISUZUKSB8IG1paV9yZWc7Ci0Jb3V0X2JlMzIoJm1paV9yZWdzLT5taWltYWRkLCB0bXBfcmVnKTsKLQotCS8qIFNldHRpbmcgdXAgdGhlIE1JSSBNYW5nZW1lbnQgQ29udHJvbCBSZWdpc3RlciB3aXRoIHRoZSB2YWx1ZSAqLwotCW91dF9iZTMyKCZtaWlfcmVncy0+bWlpbWNvbiwgKHUzMikgdmFsdWUpOwotCi0JLyogV2FpdCB0aWxsIE1JSSBtYW5hZ2VtZW50IHdyaXRlIGlzIGNvbXBsZXRlICovCi0Jd2hpbGUgKChpbl9iZTMyKCZtaWlfcmVncy0+bWlpbWluZCkpICYgTUlJTUlORF9CVVNZKQotCQljcHVfcmVsYXgoKTsKLQotCXNwaW5fdW5sb2NrX2lycSgmdWdldGgtPmxvY2spOwotCi0JdWRlbGF5KDEwMDAwKTsKLX0KLQotLyogUmVhZHMgZnJvbSByZWdpc3RlciByZWdudW0gaW4gdGhlIFBIWSBmb3IgZGV2aWNlIGRldiwgKi8KLS8qIHJldHVybmluZyB0aGUgdmFsdWUuICBDbGVhcnMgbWlpbWNvbSBmaXJzdC4gIEFsbCBQSFkgKi8KLS8qIGNvbmZpZ3VyYXRpb24gaGFzIHRvIGJlIGRvbmUgdGhyb3VnaCB0aGUgVFNFQzEgTUlJTSByZWdzICovCi1pbnQgcmVhZF9waHlfcmVnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBtaWlfaWQsIGludCByZWdudW0pCi17Ci0Jc3RydWN0IHVjY19nZXRoX3ByaXZhdGUgKnVnZXRoID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlzdHJ1Y3QgdWNjX21paV9tbmcgKm1paV9yZWdzOwotCWVudW0gZW5ldF90YmlfbWlpX3JlZyBtaWlfcmVnID0gKGVudW0gZW5ldF90YmlfbWlpX3JlZykgcmVnbnVtOwotCXUzMiB0bXBfcmVnOwotCXUxNiB2YWx1ZTsKLQotCXVncGh5X3ZkYmcoIiVzOiBJTiIsIF9fRlVOQ1RJT05fXyk7Ci0KLQlzcGluX2xvY2tfaXJxKCZ1Z2V0aC0+bG9jayk7Ci0KLQltaWlfcmVncyA9IHVnZXRoLT5taWlfaW5mby0+bWlpX3JlZ3M7Ci0KLQkvKiBTZXR0aW5nIHVwIHRoZSBNSUkgTWFuZ2VtZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KLQl0bXBfcmVnID0gKCh1MzIpIG1paV9pZCA8PCBNSUlNQUREX1BIWV9BRERSRVNTX1NISUZUKSB8IG1paV9yZWc7Ci0Jb3V0X2JlMzIoJm1paV9yZWdzLT5taWltYWRkLCB0bXBfcmVnKTsKLQotCS8qIFBlcmZvcm0gYW4gTUlJIG1hbmFnZW1lbnQgcmVhZCBjeWNsZSAqLwotCW91dF9iZTMyKCZtaWlfcmVncy0+bWlpbWNvbSwgTUlJTUNPTV9SRUFEX0NZQ0xFKTsKLQotCS8qIFdhaXQgdGlsbCBNSUkgbWFuYWdlbWVudCB3cml0ZSBpcyBjb21wbGV0ZSAqLwotCXdoaWxlICgoaW5fYmUzMigmbWlpX3JlZ3MtPm1paW1pbmQpKSAmIE1JSU1JTkRfQlVTWSkKLQkJY3B1X3JlbGF4KCk7Ci0KLQl1ZGVsYXkoMTAwMDApOwotCi0JLyogUmVhZCBNSUkgbWFuYWdlbWVudCBzdGF0dXMgICovCi0JdmFsdWUgPSAodTE2KSBpbl9iZTMyKCZtaWlfcmVncy0+bWlpbXN0YXQpOwotCW91dF9iZTMyKCZtaWlfcmVncy0+bWlpbWNvbSwgMCk7Ci0JaWYgKHZhbHVlID09IDB4ZmZmZikKLQkJdWdwaHlfd2FybigicmVhZCB3cm9uZyB2YWx1ZSA6IG1paV9pZCAlZCxtaWlfcmVnICVkLCBiYXNlICUwOHgiLAotCQkJICAgbWlpX2lkLCBtaWlfcmVnLCAodTMyKSAmIChtaWlfcmVncy0+bWlpbWNmZykpOwotCi0Jc3Bpbl91bmxvY2tfaXJxKCZ1Z2V0aC0+bG9jayk7Ci0KLQlyZXR1cm4gKHZhbHVlKTsKLX0KLQotdm9pZCBtaWlfY2xlYXJfcGh5X2ludGVycnVwdChzdHJ1Y3QgdWdldGhfbWlpX2luZm8gKm1paV9pbmZvKQotewotCXVncGh5X3ZkYmcoIiVzOiBJTiIsIF9fRlVOQ1RJT05fXyk7Ci0KLQlpZiAobWlpX2luZm8tPnBoeWluZm8tPmFja19pbnRlcnJ1cHQpCi0JCW1paV9pbmZvLT5waHlpbmZvLT5hY2tfaW50ZXJydXB0KG1paV9pbmZvKTsKLX0KLQotdm9pZCBtaWlfY29uZmlndXJlX3BoeV9pbnRlcnJ1cHQoc3RydWN0IHVnZXRoX21paV9pbmZvICptaWlfaW5mbywKLQkJCQkgdTMyIGludGVycnVwdHMpCi17Ci0JdWdwaHlfdmRiZygiJXM6IElOIiwgX19GVU5DVElPTl9fKTsKLQotCW1paV9pbmZvLT5pbnRlcnJ1cHRzID0gaW50ZXJydXB0czsKLQlpZiAobWlpX2luZm8tPnBoeWluZm8tPmNvbmZpZ19pbnRyKQotCQltaWlfaW5mby0+cGh5aW5mby0+Y29uZmlnX2ludHIobWlpX2luZm8pOwotfQotCi0vKiBXcml0ZXMgTUlJX0FEVkVSVElTRSB3aXRoIHRoZSBhcHByb3ByaWF0ZSB2YWx1ZXMsIGFmdGVyCi0gKiBzYW5pdGl6aW5nIGFkdmVydGlzZSB0byBtYWtlIHN1cmUgb25seSBzdXBwb3J0ZWQgZmVhdHVyZXMKLSAqIGFyZSBhZHZlcnRpc2VkCi0gKi8KLXN0YXRpYyB2b2lkIGNvbmZpZ19nZW5taWlfYWR2ZXJ0KHN0cnVjdCB1Z2V0aF9taWlfaW5mbyAqbWlpX2luZm8pCi17Ci0JdTMyIGFkdmVydGlzZTsKLQl1MTYgYWR2OwotCi0JdWdwaHlfdmRiZygiJXM6IElOIiwgX19GVU5DVElPTl9fKTsKLQotCS8qIE9ubHkgYWxsb3cgYWR2ZXJ0aXNpbmcgd2hhdCB0aGlzIFBIWSBzdXBwb3J0cyAqLwotCW1paV9pbmZvLT5hZHZlcnRpc2luZyAmPSBtaWlfaW5mby0+cGh5aW5mby0+ZmVhdHVyZXM7Ci0JYWR2ZXJ0aXNlID0gbWlpX2luZm8tPmFkdmVydGlzaW5nOwotCi0JLyogU2V0dXAgc3RhbmRhcmQgYWR2ZXJ0aXNlbWVudCAqLwotCWFkdiA9IHVjY19nZXRoX3BoeV9yZWFkKG1paV9pbmZvLCBNSUlfQURWRVJUSVNFKTsKLQlhZHYgJj0gfihBRFZFUlRJU0VfQUxMIHwgQURWRVJUSVNFXzEwMEJBU0U0KTsKLQlpZiAoYWR2ZXJ0aXNlICYgQURWRVJUSVNFRF8xMGJhc2VUX0hhbGYpCi0JCWFkdiB8PSBBRFZFUlRJU0VfMTBIQUxGOwotCWlmIChhZHZlcnRpc2UgJiBBRFZFUlRJU0VEXzEwYmFzZVRfRnVsbCkKLQkJYWR2IHw9IEFEVkVSVElTRV8xMEZVTEw7Ci0JaWYgKGFkdmVydGlzZSAmIEFEVkVSVElTRURfMTAwYmFzZVRfSGFsZikKLQkJYWR2IHw9IEFEVkVSVElTRV8xMDBIQUxGOwotCWlmIChhZHZlcnRpc2UgJiBBRFZFUlRJU0VEXzEwMGJhc2VUX0Z1bGwpCi0JCWFkdiB8PSBBRFZFUlRJU0VfMTAwRlVMTDsKLQl1Y2NfZ2V0aF9waHlfd3JpdGUobWlpX2luZm8sIE1JSV9BRFZFUlRJU0UsIGFkdik7Ci19Ci0KLXN0YXRpYyB2b2lkIGdlbm1paV9zZXR1cF9mb3JjZWQoc3RydWN0IHVnZXRoX21paV9pbmZvICptaWlfaW5mbykKLXsKLQl1MTYgY3RybDsKLQl1MzIgZmVhdHVyZXMgPSBtaWlfaW5mby0+cGh5aW5mby0+ZmVhdHVyZXM7Ci0KLQl1Z3BoeV92ZGJnKCIlczogSU4iLCBfX0ZVTkNUSU9OX18pOwotCi0JY3RybCA9IHVjY19nZXRoX3BoeV9yZWFkKG1paV9pbmZvLCBNSUlfQk1DUik7Ci0KLQljdHJsICY9Ci0JICAgIH4oQk1DUl9GVUxMRFBMWCB8IEJNQ1JfU1BFRUQxMDAgfCBCTUNSX1NQRUVEMTAwMCB8IEJNQ1JfQU5FTkFCTEUpOwotCWN0cmwgfD0gQk1DUl9SRVNFVDsKLQotCXN3aXRjaCAobWlpX2luZm8tPnNwZWVkKSB7Ci0JY2FzZSBTUEVFRF8xMDAwOgotCQlpZiAoZmVhdHVyZXMgJiAoU1VQUE9SVEVEXzEwMDBiYXNlVF9IYWxmCi0JCQkJfCBTVVBQT1JURURfMTAwMGJhc2VUX0Z1bGwpKSB7Ci0JCQljdHJsIHw9IEJNQ1JfU1BFRUQxMDAwOwotCQkJYnJlYWs7Ci0JCX0KLQkJbWlpX2luZm8tPnNwZWVkID0gU1BFRURfMTAwOwotCWNhc2UgU1BFRURfMTAwOgotCQlpZiAoZmVhdHVyZXMgJiAoU1VQUE9SVEVEXzEwMGJhc2VUX0hhbGYKLQkJCQl8IFNVUFBPUlRFRF8xMDBiYXNlVF9GdWxsKSkgewotCQkJY3RybCB8PSBCTUNSX1NQRUVEMTAwOwotCQkJYnJlYWs7Ci0JCX0KLQkJbWlpX2luZm8tPnNwZWVkID0gU1BFRURfMTA7Ci0JY2FzZSBTUEVFRF8xMDoKLQkJaWYgKGZlYXR1cmVzICYgKFNVUFBPUlRFRF8xMGJhc2VUX0hhbGYKLQkJCQl8IFNVUFBPUlRFRF8xMGJhc2VUX0Z1bGwpKQotCQkJYnJlYWs7Ci0JZGVmYXVsdDoJCS8qIFVuc3VwcG9ydGVkIHNwZWVkISAqLwotCQl1Z3BoeV9lcnIoIiVzOiBCYWQgc3BlZWQhIiwgbWlpX2luZm8tPmRldi0+bmFtZSk7Ci0JCWJyZWFrOwotCX0KLQotCXVjY19nZXRoX3BoeV93cml0ZShtaWlfaW5mbywgTUlJX0JNQ1IsIGN0cmwpOwotfQotCi0vKiBFbmFibGUgYW5kIFJlc3RhcnQgQXV0b25lZ290aWF0aW9uICovCi1zdGF0aWMgdm9pZCBnZW5taWlfcmVzdGFydF9hbmVnKHN0cnVjdCB1Z2V0aF9taWlfaW5mbyAqbWlpX2luZm8pCi17Ci0JdTE2IGN0bDsKLQotCXVncGh5X3ZkYmcoIiVzOiBJTiIsIF9fRlVOQ1RJT05fXyk7Ci0KLQljdGwgPSB1Y2NfZ2V0aF9waHlfcmVhZChtaWlfaW5mbywgTUlJX0JNQ1IpOwotCWN0bCB8PSAoQk1DUl9BTkVOQUJMRSB8IEJNQ1JfQU5SRVNUQVJUKTsKLQl1Y2NfZ2V0aF9waHlfd3JpdGUobWlpX2luZm8sIE1JSV9CTUNSLCBjdGwpOwotfQotCi1zdGF0aWMgaW50IGdiaXRfY29uZmlnX2FuZWcoc3RydWN0IHVnZXRoX21paV9pbmZvICptaWlfaW5mbykKLXsKLQl1MTYgYWR2OwotCXUzMiBhZHZlcnRpc2U7Ci0KLQl1Z3BoeV92ZGJnKCIlczogSU4iLCBfX0ZVTkNUSU9OX18pOwotCi0JaWYgKG1paV9pbmZvLT5hdXRvbmVnKSB7Ci0JCS8qIENvbmZpZ3VyZSB0aGUgQURWRVJUSVNFIHJlZ2lzdGVyICovCi0JCWNvbmZpZ19nZW5taWlfYWR2ZXJ0KG1paV9pbmZvKTsKLQkJYWR2ZXJ0aXNlID0gbWlpX2luZm8tPmFkdmVydGlzaW5nOwotCi0JCWFkdiA9IHVjY19nZXRoX3BoeV9yZWFkKG1paV9pbmZvLCBNSUlfMTAwMEJBU0VUQ09OVFJPTCk7Ci0JCWFkdiAmPSB+KE1JSV8xMDAwQkFTRVRDT05UUk9MX0ZVTExEVVBMRVhDQVAgfAotCQkJIE1JSV8xMDAwQkFTRVRDT05UUk9MX0hBTEZEVVBMRVhDQVApOwotCQlpZiAoYWR2ZXJ0aXNlICYgU1VQUE9SVEVEXzEwMDBiYXNlVF9IYWxmKQotCQkJYWR2IHw9IE1JSV8xMDAwQkFTRVRDT05UUk9MX0hBTEZEVVBMRVhDQVA7Ci0JCWlmIChhZHZlcnRpc2UgJiBTVVBQT1JURURfMTAwMGJhc2VUX0Z1bGwpCi0JCQlhZHYgfD0gTUlJXzEwMDBCQVNFVENPTlRST0xfRlVMTERVUExFWENBUDsKLQkJdWNjX2dldGhfcGh5X3dyaXRlKG1paV9pbmZvLCBNSUlfMTAwMEJBU0VUQ09OVFJPTCwgYWR2KTsKLQotCQkvKiBTdGFydC9SZXN0YXJ0IGFuZWcgKi8KLQkJZ2VubWlpX3Jlc3RhcnRfYW5lZyhtaWlfaW5mbyk7Ci0JfSBlbHNlCi0JCWdlbm1paV9zZXR1cF9mb3JjZWQobWlpX2luZm8pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZ2VubWlpX2NvbmZpZ19hbmVnKHN0cnVjdCB1Z2V0aF9taWlfaW5mbyAqbWlpX2luZm8pCi17Ci0JdWdwaHlfdmRiZygiJXM6IElOIiwgX19GVU5DVElPTl9fKTsKLQotCWlmIChtaWlfaW5mby0+YXV0b25lZykgewotCQljb25maWdfZ2VubWlpX2FkdmVydChtaWlfaW5mbyk7Ci0JCWdlbm1paV9yZXN0YXJ0X2FuZWcobWlpX2luZm8pOwotCX0gZWxzZQotCQlnZW5taWlfc2V0dXBfZm9yY2VkKG1paV9pbmZvKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGdlbm1paV91cGRhdGVfbGluayhzdHJ1Y3QgdWdldGhfbWlpX2luZm8gKm1paV9pbmZvKQotewotCXUxNiBzdGF0dXM7Ci0KLQl1Z3BoeV92ZGJnKCIlczogSU4iLCBfX0ZVTkNUSU9OX18pOwotCi0JLyogRG8gYSBmYWtlIHJlYWQgKi8KLQl1Y2NfZ2V0aF9waHlfcmVhZChtaWlfaW5mbywgTUlJX0JNU1IpOwotCi0JLyogUmVhZCBsaW5rIGFuZCBhdXRvbmVnb3RpYXRpb24gc3RhdHVzICovCi0Jc3RhdHVzID0gdWNjX2dldGhfcGh5X3JlYWQobWlpX2luZm8sIE1JSV9CTVNSKTsKLQlpZiAoKHN0YXR1cyAmIEJNU1JfTFNUQVRVUykgPT0gMCkKLQkJbWlpX2luZm8tPmxpbmsgPSAwOwotCWVsc2UKLQkJbWlpX2luZm8tPmxpbmsgPSAxOwotCi0JLyogSWYgd2UgYXJlIGF1dG9uZWdvdGlhdGluZywgYW5kIG5vdCBkb25lLAotCSAqIHJldHVybiBhbiBlcnJvciAqLwotCWlmIChtaWlfaW5mby0+YXV0b25lZyAmJiAhKHN0YXR1cyAmIEJNU1JfQU5FR0NPTVBMRVRFKSkKLQkJcmV0dXJuIC1FQUdBSU47Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBnZW5taWlfcmVhZF9zdGF0dXMoc3RydWN0IHVnZXRoX21paV9pbmZvICptaWlfaW5mbykKLXsKLQl1MTYgc3RhdHVzOwotCWludCBlcnI7Ci0KLQl1Z3BoeV92ZGJnKCIlczogSU4iLCBfX0ZVTkNUSU9OX18pOwotCi0JLyogVXBkYXRlIHRoZSBsaW5rLCBidXQgcmV0dXJuIGlmIHRoZXJlCi0JICogd2FzIGFuIGVycm9yICovCi0JZXJyID0gZ2VubWlpX3VwZGF0ZV9saW5rKG1paV9pbmZvKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0JaWYgKG1paV9pbmZvLT5hdXRvbmVnKSB7Ci0JCXN0YXR1cyA9IHVjY19nZXRoX3BoeV9yZWFkKG1paV9pbmZvLCBNSUlfTFBBKTsKLQotCQlpZiAoc3RhdHVzICYgKExQQV8xMEZVTEwgfCBMUEFfMTAwRlVMTCkpCi0JCQltaWlfaW5mby0+ZHVwbGV4ID0gRFVQTEVYX0ZVTEw7Ci0JCWVsc2UKLQkJCW1paV9pbmZvLT5kdXBsZXggPSBEVVBMRVhfSEFMRjsKLQkJaWYgKHN0YXR1cyAmIChMUEFfMTAwRlVMTCB8IExQQV8xMDBIQUxGKSkKLQkJCW1paV9pbmZvLT5zcGVlZCA9IFNQRUVEXzEwMDsKLQkJZWxzZQotCQkJbWlpX2luZm8tPnNwZWVkID0gU1BFRURfMTA7Ci0JCW1paV9pbmZvLT5wYXVzZSA9IDA7Ci0JfQotCS8qIE9uIG5vbi1hbmVnLCB3ZSBhc3N1bWUgd2hhdCB3ZSBwdXQgaW4gQk1DUiBpcyB0aGUgc3BlZWQsCi0JICogdGhvdWdoIG1hZ2ljLWFuZWcgc2hvdWxkbid0IHByZXZlbnQgdGhpcyBjYXNlIGZyb20gb2NjdXJyaW5nCi0JICovCi0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtYXJ2ZWxsX2luaXQoc3RydWN0IHVnZXRoX21paV9pbmZvICptaWlfaW5mbykKLXsKLQl1Z3BoeV92ZGJnKCIlczogSU4iLCBfX0ZVTkNUSU9OX18pOwotCi0JdWNjX2dldGhfcGh5X3dyaXRlKG1paV9pbmZvLCAweDE0LCAweDBjZDIpOwotCXVjY19nZXRoX3BoeV93cml0ZShtaWlfaW5mbywgMHgxYiwKLQkJKHVjY19nZXRoX3BoeV9yZWFkKG1paV9pbmZvLCAweDFiKSAmIH4weDAwMGYpIHwgMHgwMDBiKTsKLQl1Y2NfZ2V0aF9waHlfd3JpdGUobWlpX2luZm8sIE1JSV9CTUNSLAotCQkgIHVjY19nZXRoX3BoeV9yZWFkKG1paV9pbmZvLCBNSUlfQk1DUikgfCBCTUNSX1JFU0VUKTsKLQltc2xlZXAoNDAwMCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtYXJ2ZWxsX2NvbmZpZ19hbmVnKHN0cnVjdCB1Z2V0aF9taWlfaW5mbyAqbWlpX2luZm8pCi17Ci0JdWdwaHlfdmRiZygiJXM6IElOIiwgX19GVU5DVElPTl9fKTsKLQotCS8qIFRoZSBNYXJ2ZWxsIFBIWSBoYXMgYW4gZXJyYXRhIHdoaWNoIHJlcXVpcmVzCi0JICogdGhhdCBjZXJ0YWluIHJlZ2lzdGVycyBnZXQgd3JpdHRlbiBpbiBvcmRlcgotCSAqIHRvIHJlc3RhcnQgYXV0b25lZ290aWF0aW9uICovCi0JdWNjX2dldGhfcGh5X3dyaXRlKG1paV9pbmZvLCBNSUlfQk1DUiwgQk1DUl9SRVNFVCk7Ci0KLQl1Y2NfZ2V0aF9waHlfd3JpdGUobWlpX2luZm8sIDB4MWQsIDB4MWYpOwotCXVjY19nZXRoX3BoeV93cml0ZShtaWlfaW5mbywgMHgxZSwgMHgyMDBjKTsKLQl1Y2NfZ2V0aF9waHlfd3JpdGUobWlpX2luZm8sIDB4MWQsIDB4NSk7Ci0JdWNjX2dldGhfcGh5X3dyaXRlKG1paV9pbmZvLCAweDFlLCAwKTsKLQl1Y2NfZ2V0aF9waHlfd3JpdGUobWlpX2luZm8sIDB4MWUsIDB4MTAwKTsKLQotCWdiaXRfY29uZmlnX2FuZWcobWlpX2luZm8pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbWFydmVsbF9yZWFkX3N0YXR1cyhzdHJ1Y3QgdWdldGhfbWlpX2luZm8gKm1paV9pbmZvKQotewotCXUxNiBzdGF0dXM7Ci0JaW50IGVycjsKLQotCXVncGh5X3ZkYmcoIiVzOiBJTiIsIF9fRlVOQ1RJT05fXyk7Ci0KLQkvKiBVcGRhdGUgdGhlIGxpbmssIGJ1dCByZXR1cm4gaWYgdGhlcmUKLQkgKiB3YXMgYW4gZXJyb3IgKi8KLQllcnIgPSBnZW5taWlfdXBkYXRlX2xpbmsobWlpX2luZm8pOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0KLQkvKiBJZiB0aGUgbGluayBpcyB1cCwgcmVhZCB0aGUgc3BlZWQgYW5kIGR1cGxleCAqLwotCS8qIElmIHdlIGFyZW4ndCBhdXRvbmVnb3RpYXRpbmcsIGFzc3VtZSBzcGVlZHMKLQkgKiBhcmUgYXMgc2V0ICovCi0JaWYgKG1paV9pbmZvLT5hdXRvbmVnICYmIG1paV9pbmZvLT5saW5rKSB7Ci0JCWludCBzcGVlZDsKLQkJc3RhdHVzID0gdWNjX2dldGhfcGh5X3JlYWQobWlpX2luZm8sIE1JSV9NMTAxMV9QSFlfU1BFQ19TVEFUVVMpOwotCi0JCS8qIEdldCB0aGUgZHVwbGV4aXR5ICovCi0JCWlmIChzdGF0dXMgJiBNSUlfTTEwMTFfUEhZX1NQRUNfU1RBVFVTX0ZVTExEVVBMRVgpCi0JCQltaWlfaW5mby0+ZHVwbGV4ID0gRFVQTEVYX0ZVTEw7Ci0JCWVsc2UKLQkJCW1paV9pbmZvLT5kdXBsZXggPSBEVVBMRVhfSEFMRjsKLQotCQkvKiBHZXQgdGhlIHNwZWVkICovCi0JCXNwZWVkID0gc3RhdHVzICYgTUlJX00xMDExX1BIWV9TUEVDX1NUQVRVU19TUERfTUFTSzsKLQkJc3dpdGNoIChzcGVlZCkgewotCQljYXNlIE1JSV9NMTAxMV9QSFlfU1BFQ19TVEFUVVNfMTAwMDoKLQkJCW1paV9pbmZvLT5zcGVlZCA9IFNQRUVEXzEwMDA7Ci0JCQlicmVhazsKLQkJY2FzZSBNSUlfTTEwMTFfUEhZX1NQRUNfU1RBVFVTXzEwMDoKLQkJCW1paV9pbmZvLT5zcGVlZCA9IFNQRUVEXzEwMDsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJbWlpX2luZm8tPnNwZWVkID0gU1BFRURfMTA7Ci0JCQlicmVhazsKLQkJfQotCQltaWlfaW5mby0+cGF1c2UgPSAwOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1hcnZlbGxfYWNrX2ludGVycnVwdChzdHJ1Y3QgdWdldGhfbWlpX2luZm8gKm1paV9pbmZvKQotewotCXVncGh5X3ZkYmcoIiVzOiBJTiIsIF9fRlVOQ1RJT05fXyk7Ci0KLQkvKiBDbGVhciB0aGUgaW50ZXJydXB0cyBieSByZWFkaW5nIHRoZSByZWcgKi8KLQl1Y2NfZ2V0aF9waHlfcmVhZChtaWlfaW5mbywgTUlJX00xMDExX0lFVkVOVCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtYXJ2ZWxsX2NvbmZpZ19pbnRyKHN0cnVjdCB1Z2V0aF9taWlfaW5mbyAqbWlpX2luZm8pCi17Ci0JdWdwaHlfdmRiZygiJXM6IElOIiwgX19GVU5DVElPTl9fKTsKLQotCWlmIChtaWlfaW5mby0+aW50ZXJydXB0cyA9PSBNSUlfSU5URVJSVVBUX0VOQUJMRUQpCi0JCXVjY19nZXRoX3BoeV93cml0ZShtaWlfaW5mbywgTUlJX00xMDExX0lNQVNLLCBNSUlfTTEwMTFfSU1BU0tfSU5JVCk7Ci0JZWxzZQotCQl1Y2NfZ2V0aF9waHlfd3JpdGUobWlpX2luZm8sIE1JSV9NMTAxMV9JTUFTSywgTUlJX00xMDExX0lNQVNLX0NMRUFSKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGNpczgyMHhfaW5pdChzdHJ1Y3QgdWdldGhfbWlpX2luZm8gKm1paV9pbmZvKQotewotCXVncGh5X3ZkYmcoIiVzOiBJTiIsIF9fRlVOQ1RJT05fXyk7Ci0KLQl1Y2NfZ2V0aF9waHlfd3JpdGUobWlpX2luZm8sIE1JSV9DSVM4MjAxX0FVWF9DT05TVEFULAotCQkgIE1JSV9DSVM4MjAxX0FVWENPTlNUQVRfSU5JVCk7Ci0JdWNjX2dldGhfcGh5X3dyaXRlKG1paV9pbmZvLCBNSUlfQ0lTODIwMV9FWFRfQ09OMSwgTUlJX0NJUzgyMDFfRVhUQ09OMV9JTklUKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGNpczgyMHhfcmVhZF9zdGF0dXMoc3RydWN0IHVnZXRoX21paV9pbmZvICptaWlfaW5mbykKLXsKLQl1MTYgc3RhdHVzOwotCWludCBlcnI7Ci0KLQl1Z3BoeV92ZGJnKCIlczogSU4iLCBfX0ZVTkNUSU9OX18pOwotCi0JLyogVXBkYXRlIHRoZSBsaW5rLCBidXQgcmV0dXJuIGlmIHRoZXJlCi0JICogd2FzIGFuIGVycm9yICovCi0JZXJyID0gZ2VubWlpX3VwZGF0ZV9saW5rKG1paV9pbmZvKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0JLyogSWYgdGhlIGxpbmsgaXMgdXAsIHJlYWQgdGhlIHNwZWVkIGFuZCBkdXBsZXggKi8KLQkvKiBJZiB3ZSBhcmVuJ3QgYXV0b25lZ290aWF0aW5nLCBhc3N1bWUgc3BlZWRzCi0JICogYXJlIGFzIHNldCAqLwotCWlmIChtaWlfaW5mby0+YXV0b25lZyAmJiBtaWlfaW5mby0+bGluaykgewotCQlpbnQgc3BlZWQ7Ci0KLQkJc3RhdHVzID0gdWNjX2dldGhfcGh5X3JlYWQobWlpX2luZm8sIE1JSV9DSVM4MjAxX0FVWF9DT05TVEFUKTsKLQkJaWYgKHN0YXR1cyAmIE1JSV9DSVM4MjAxX0FVWENPTlNUQVRfRFVQTEVYKQotCQkJbWlpX2luZm8tPmR1cGxleCA9IERVUExFWF9GVUxMOwotCQllbHNlCi0JCQltaWlfaW5mby0+ZHVwbGV4ID0gRFVQTEVYX0hBTEY7Ci0KLQkJc3BlZWQgPSBzdGF0dXMgJiBNSUlfQ0lTODIwMV9BVVhDT05TVEFUX1NQRUVEOwotCi0JCXN3aXRjaCAoc3BlZWQpIHsKLQkJY2FzZSBNSUlfQ0lTODIwMV9BVVhDT05TVEFUX0dCSVQ6Ci0JCQltaWlfaW5mby0+c3BlZWQgPSBTUEVFRF8xMDAwOwotCQkJYnJlYWs7Ci0JCWNhc2UgTUlJX0NJUzgyMDFfQVVYQ09OU1RBVF8xMDA6Ci0JCQltaWlfaW5mby0+c3BlZWQgPSBTUEVFRF8xMDA7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCW1paV9pbmZvLT5zcGVlZCA9IFNQRUVEXzEwOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBjaXM4MjB4X2Fja19pbnRlcnJ1cHQoc3RydWN0IHVnZXRoX21paV9pbmZvICptaWlfaW5mbykKLXsKLQl1Z3BoeV92ZGJnKCIlczogSU4iLCBfX0ZVTkNUSU9OX18pOwotCi0JdWNjX2dldGhfcGh5X3JlYWQobWlpX2luZm8sIE1JSV9DSVM4MjAxX0lTVEFUKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGNpczgyMHhfY29uZmlnX2ludHIoc3RydWN0IHVnZXRoX21paV9pbmZvICptaWlfaW5mbykKLXsKLQl1Z3BoeV92ZGJnKCIlczogSU4iLCBfX0ZVTkNUSU9OX18pOwotCi0JaWYgKG1paV9pbmZvLT5pbnRlcnJ1cHRzID09IE1JSV9JTlRFUlJVUFRfRU5BQkxFRCkKLQkJdWNjX2dldGhfcGh5X3dyaXRlKG1paV9pbmZvLCBNSUlfQ0lTODIwMV9JTUFTSywgTUlJX0NJUzgyMDFfSU1BU0tfTUFTSyk7Ci0JZWxzZQotCQl1Y2NfZ2V0aF9waHlfd3JpdGUobWlpX2luZm8sIE1JSV9DSVM4MjAxX0lNQVNLLCAwKTsKLQotCXJldHVybiAwOwotfQotCi0jZGVmaW5lIERNOTE2MV9ERUxBWSAxMAotCi1zdGF0aWMgaW50IGRtOTE2MV9yZWFkX3N0YXR1cyhzdHJ1Y3QgdWdldGhfbWlpX2luZm8gKm1paV9pbmZvKQotewotCXUxNiBzdGF0dXM7Ci0JaW50IGVycjsKLQotCXVncGh5X3ZkYmcoIiVzOiBJTiIsIF9fRlVOQ1RJT05fXyk7Ci0KLQkvKiBVcGRhdGUgdGhlIGxpbmssIGJ1dCByZXR1cm4gaWYgdGhlcmUKLQkgKiB3YXMgYW4gZXJyb3IgKi8KLQllcnIgPSBnZW5taWlfdXBkYXRlX2xpbmsobWlpX2luZm8pOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0KLQkvKiBJZiB0aGUgbGluayBpcyB1cCwgcmVhZCB0aGUgc3BlZWQgYW5kIGR1cGxleCAqLwotCS8qIElmIHdlIGFyZW4ndCBhdXRvbmVnb3RpYXRpbmcsIGFzc3VtZSBzcGVlZHMKLQkgKiBhcmUgYXMgc2V0ICovCi0JaWYgKG1paV9pbmZvLT5hdXRvbmVnICYmIG1paV9pbmZvLT5saW5rKSB7Ci0JCXN0YXR1cyA9IHVjY19nZXRoX3BoeV9yZWFkKG1paV9pbmZvLCBNSUlfRE05MTYxX1NDU1IpOwotCQlpZiAoc3RhdHVzICYgKE1JSV9ETTkxNjFfU0NTUl8xMDBGIHwgTUlJX0RNOTE2MV9TQ1NSXzEwMEgpKQotCQkJbWlpX2luZm8tPnNwZWVkID0gU1BFRURfMTAwOwotCQllbHNlCi0JCQltaWlfaW5mby0+c3BlZWQgPSBTUEVFRF8xMDsKLQotCQlpZiAoc3RhdHVzICYgKE1JSV9ETTkxNjFfU0NTUl8xMDBGIHwgTUlJX0RNOTE2MV9TQ1NSXzEwRikpCi0JCQltaWlfaW5mby0+ZHVwbGV4ID0gRFVQTEVYX0ZVTEw7Ci0JCWVsc2UKLQkJCW1paV9pbmZvLT5kdXBsZXggPSBEVVBMRVhfSEFMRjsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBkbTkxNjFfY29uZmlnX2FuZWcoc3RydWN0IHVnZXRoX21paV9pbmZvICptaWlfaW5mbykKLXsKLQlzdHJ1Y3QgZG05MTYxX3ByaXZhdGUgKnByaXYgPSBtaWlfaW5mby0+cHJpdjsKLQotCXVncGh5X3ZkYmcoIiVzOiBJTiIsIF9fRlVOQ1RJT05fXyk7Ci0KLQlpZiAoMCA9PSBwcml2LT5yZXNldGRvbmUpCi0JCXJldHVybiAtRUFHQUlOOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGRtOTE2MV90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0Jc3RydWN0IHVnZXRoX21paV9pbmZvICptaWlfaW5mbyA9IChzdHJ1Y3QgdWdldGhfbWlpX2luZm8gKilkYXRhOwotCXN0cnVjdCBkbTkxNjFfcHJpdmF0ZSAqcHJpdiA9IG1paV9pbmZvLT5wcml2OwotCXUxNiBzdGF0dXMgPSB1Y2NfZ2V0aF9waHlfcmVhZChtaWlfaW5mbywgTUlJX0JNU1IpOwotCi0JdWdwaHlfdmRiZygiJXM6IElOIiwgX19GVU5DVElPTl9fKTsKLQotCWlmIChzdGF0dXMgJiBCTVNSX0FORUdDT01QTEVURSkgewotCQlwcml2LT5yZXNldGRvbmUgPSAxOwotCX0gZWxzZQotCQltb2RfdGltZXIoJnByaXYtPnRpbWVyLCBqaWZmaWVzICsgRE05MTYxX0RFTEFZICogSFopOwotfQotCi1zdGF0aWMgaW50IGRtOTE2MV9pbml0KHN0cnVjdCB1Z2V0aF9taWlfaW5mbyAqbWlpX2luZm8pCi17Ci0Jc3RydWN0IGRtOTE2MV9wcml2YXRlICpwcml2OwotCi0JdWdwaHlfdmRiZygiJXM6IElOIiwgX19GVU5DVElPTl9fKTsKLQotCS8qIEFsbG9jYXRlIHRoZSBwcml2YXRlIGRhdGEgc3RydWN0dXJlICovCi0JcHJpdiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBkbTkxNjFfcHJpdmF0ZSksIEdGUF9LRVJORUwpOwotCi0JaWYgKE5VTEwgPT0gcHJpdikKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQltaWlfaW5mby0+cHJpdiA9IHByaXY7Ci0KLQkvKiBSZXNldCBpcyBub3QgZG9uZSB5ZXQgKi8KLQlwcml2LT5yZXNldGRvbmUgPSAwOwotCi0JdWNjX2dldGhfcGh5X3dyaXRlKG1paV9pbmZvLCBNSUlfQk1DUiwKLQkJICB1Y2NfZ2V0aF9waHlfcmVhZChtaWlfaW5mbywgTUlJX0JNQ1IpIHwgQk1DUl9SRVNFVCk7Ci0KLQl1Y2NfZ2V0aF9waHlfd3JpdGUobWlpX2luZm8sIE1JSV9CTUNSLAotCQkgIHVjY19nZXRoX3BoeV9yZWFkKG1paV9pbmZvLCBNSUlfQk1DUikgJiB+Qk1DUl9JU09MQVRFKTsKLQotCWNvbmZpZ19nZW5taWlfYWR2ZXJ0KG1paV9pbmZvKTsKLQkvKiBTdGFydC9SZXN0YXJ0IGFuZWcgKi8KLQlnZW5taWlfY29uZmlnX2FuZWcobWlpX2luZm8pOwotCi0JLyogU3RhcnQgYSB0aW1lciBmb3IgRE05MTYxX0RFTEFZIHNlY29uZHMgdG8gd2FpdAotCSAqIGZvciB0aGUgUEhZIHRvIGJlIHJlYWR5ICovCi0JaW5pdF90aW1lcigmcHJpdi0+dGltZXIpOwotCXByaXYtPnRpbWVyLmZ1bmN0aW9uID0gJmRtOTE2MV90aW1lcjsKLQlwcml2LT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpbWlpX2luZm87Ci0JbW9kX3RpbWVyKCZwcml2LT50aW1lciwgamlmZmllcyArIERNOTE2MV9ERUxBWSAqIEhaKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBkbTkxNjFfY2xvc2Uoc3RydWN0IHVnZXRoX21paV9pbmZvICptaWlfaW5mbykKLXsKLQlzdHJ1Y3QgZG05MTYxX3ByaXZhdGUgKnByaXYgPSBtaWlfaW5mby0+cHJpdjsKLQotCXVncGh5X3ZkYmcoIiVzOiBJTiIsIF9fRlVOQ1RJT05fXyk7Ci0KLQlkZWxfdGltZXJfc3luYygmcHJpdi0+dGltZXIpOwotCWtmcmVlKHByaXYpOwotfQotCi1zdGF0aWMgaW50IGRtOTE2MV9hY2tfaW50ZXJydXB0KHN0cnVjdCB1Z2V0aF9taWlfaW5mbyAqbWlpX2luZm8pCi17Ci0JdWdwaHlfdmRiZygiJXM6IElOIiwgX19GVU5DVElPTl9fKTsKLQotCS8qIENsZWFyIHRoZSBpbnRlcnJ1cHRzIGJ5IHJlYWRpbmcgdGhlIHJlZyAqLwotCXVjY19nZXRoX3BoeV9yZWFkKG1paV9pbmZvLCBNSUlfRE05MTYxX0lOVFIpOwotCi0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBkbTkxNjFfY29uZmlnX2ludHIoc3RydWN0IHVnZXRoX21paV9pbmZvICptaWlfaW5mbykKLXsKLQl1Z3BoeV92ZGJnKCIlczogSU4iLCBfX0ZVTkNUSU9OX18pOwotCi0JaWYgKG1paV9pbmZvLT5pbnRlcnJ1cHRzID09IE1JSV9JTlRFUlJVUFRfRU5BQkxFRCkKLQkJdWNjX2dldGhfcGh5X3dyaXRlKG1paV9pbmZvLCBNSUlfRE05MTYxX0lOVFIsIE1JSV9ETTkxNjFfSU5UUl9JTklUKTsKLQllbHNlCi0JCXVjY19nZXRoX3BoeV93cml0ZShtaWlfaW5mbywgTUlJX0RNOTE2MV9JTlRSLCBNSUlfRE05MTYxX0lOVFJfU1RPUCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogQ2ljYWRhIDgyMHggKi8KLXN0YXRpYyBzdHJ1Y3QgcGh5X2luZm8gcGh5X2luZm9fY2lzODIweCA9IHsKLQkucGh5X2lkID0gMHgwMDBmYzQ0MCwKLQkubmFtZSA9ICJDaWNhZGEgQ2lzODIwNCIsCi0JLnBoeV9pZF9tYXNrID0gMHgwMDBmZmZjMCwKLQkuZmVhdHVyZXMgPSBNSUlfR0JJVF9GRUFUVVJFUywKLQkuaW5pdCA9ICZjaXM4MjB4X2luaXQsCi0JLmNvbmZpZ19hbmVnID0gJmdiaXRfY29uZmlnX2FuZWcsCi0JLnJlYWRfc3RhdHVzID0gJmNpczgyMHhfcmVhZF9zdGF0dXMsCi0JLmFja19pbnRlcnJ1cHQgPSAmY2lzODIweF9hY2tfaW50ZXJydXB0LAotCS5jb25maWdfaW50ciA9ICZjaXM4MjB4X2NvbmZpZ19pbnRyLAotfTsKLQotc3RhdGljIHN0cnVjdCBwaHlfaW5mbyBwaHlfaW5mb19kbTkxNjEgPSB7Ci0JLnBoeV9pZCA9IDB4MDE4MWI4ODAsCi0JLnBoeV9pZF9tYXNrID0gMHgwZmZmZmZmMCwKLQkubmFtZSA9ICJEYXZpY29tIERNOTE2MUUiLAotCS5pbml0ID0gZG05MTYxX2luaXQsCi0JLmNvbmZpZ19hbmVnID0gZG05MTYxX2NvbmZpZ19hbmVnLAotCS5yZWFkX3N0YXR1cyA9IGRtOTE2MV9yZWFkX3N0YXR1cywKLQkuY2xvc2UgPSBkbTkxNjFfY2xvc2UsCi19OwotCi1zdGF0aWMgc3RydWN0IHBoeV9pbmZvIHBoeV9pbmZvX2RtOTE2MWEgPSB7Ci0JLnBoeV9pZCA9IDB4MDE4MWI4YTAsCi0JLnBoeV9pZF9tYXNrID0gMHgwZmZmZmZmMCwKLQkubmFtZSA9ICJEYXZpY29tIERNOTE2MUEiLAotCS5mZWF0dXJlcyA9IE1JSV9CQVNJQ19GRUFUVVJFUywKLQkuaW5pdCA9IGRtOTE2MV9pbml0LAotCS5jb25maWdfYW5lZyA9IGRtOTE2MV9jb25maWdfYW5lZywKLQkucmVhZF9zdGF0dXMgPSBkbTkxNjFfcmVhZF9zdGF0dXMsCi0JLmFja19pbnRlcnJ1cHQgPSBkbTkxNjFfYWNrX2ludGVycnVwdCwKLQkuY29uZmlnX2ludHIgPSBkbTkxNjFfY29uZmlnX2ludHIsCi0JLmNsb3NlID0gZG05MTYxX2Nsb3NlLAotfTsKLQotc3RhdGljIHN0cnVjdCBwaHlfaW5mbyBwaHlfaW5mb19tYXJ2ZWxsID0gewotCS5waHlfaWQgPSAweDAxNDEwYzAwLAotCS5waHlfaWRfbWFzayA9IDB4ZmZmZmZmMDAsCi0JLm5hbWUgPSAiTWFydmVsbCA4OEUxMXgxIiwKLQkuZmVhdHVyZXMgPSBNSUlfR0JJVF9GRUFUVVJFUywKLQkuaW5pdCA9ICZtYXJ2ZWxsX2luaXQsCi0JLmNvbmZpZ19hbmVnID0gJm1hcnZlbGxfY29uZmlnX2FuZWcsCi0JLnJlYWRfc3RhdHVzID0gJm1hcnZlbGxfcmVhZF9zdGF0dXMsCi0JLmFja19pbnRlcnJ1cHQgPSAmbWFydmVsbF9hY2tfaW50ZXJydXB0LAotCS5jb25maWdfaW50ciA9ICZtYXJ2ZWxsX2NvbmZpZ19pbnRyLAotfTsKLQotc3RhdGljIHN0cnVjdCBwaHlfaW5mbyBwaHlfaW5mb19nZW5taWkgPSB7Ci0JLnBoeV9pZCA9IDB4MDAwMDAwMDAsCi0JLnBoeV9pZF9tYXNrID0gMHgwMDAwMDAwMCwKLQkubmFtZSA9ICJHZW5lcmljIE1JSSIsCi0JLmZlYXR1cmVzID0gTUlJX0JBU0lDX0ZFQVRVUkVTLAotCS5jb25maWdfYW5lZyA9IGdlbm1paV9jb25maWdfYW5lZywKLQkucmVhZF9zdGF0dXMgPSBnZW5taWlfcmVhZF9zdGF0dXMsCi19OwotCi1zdGF0aWMgc3RydWN0IHBoeV9pbmZvICpwaHlfaW5mb1tdID0gewotCSZwaHlfaW5mb19jaXM4MjB4LAotCSZwaHlfaW5mb19tYXJ2ZWxsLAotCSZwaHlfaW5mb19kbTkxNjEsCi0JJnBoeV9pbmZvX2RtOTE2MWEsCi0JJnBoeV9pbmZvX2dlbm1paSwKLQlOVUxMCi19OwotCi0vKiBVc2UgdGhlIFBIWSBJRCByZWdpc3RlcnMgdG8gZGV0ZXJtaW5lIHdoYXQgdHlwZSBvZiBQSFkgaXMgYXR0YWNoZWQKLSAqIHRvIGRldmljZSBkZXYuICByZXR1cm4gYSBzdHJ1Y3QgcGh5X2luZm8gc3RydWN0dXJlIGRlc2NyaWJpbmcgdGhhdCBQSFkKLSAqLwotc3RydWN0IHBoeV9pbmZvICpnZXRfcGh5X2luZm8oc3RydWN0IHVnZXRoX21paV9pbmZvICptaWlfaW5mbykKLXsKLQl1MTYgcGh5X3JlZzsKLQl1MzIgcGh5X0lEOwotCWludCBpOwotCXN0cnVjdCBwaHlfaW5mbyAqdGhlSW5mbyA9IE5VTEw7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IG1paV9pbmZvLT5kZXY7Ci0KLQl1Z3BoeV92ZGJnKCIlczogSU4iLCBfX0ZVTkNUSU9OX18pOwotCi0JLyogR3JhYiB0aGUgYml0cyBmcm9tIFBIWUlSMSwgYW5kIHB1dCB0aGVtIGluIHRoZSB1cHBlciBoYWxmICovCi0JcGh5X3JlZyA9IHVjY19nZXRoX3BoeV9yZWFkKG1paV9pbmZvLCBNSUlfUEhZU0lEMSk7Ci0JcGh5X0lEID0gKHBoeV9yZWcgJiAweGZmZmYpIDw8IDE2OwotCi0JLyogR3JhYiB0aGUgYml0cyBmcm9tIFBIWUlSMiwgYW5kIHB1dCB0aGVtIGluIHRoZSBsb3dlciBoYWxmICovCi0JcGh5X3JlZyA9IHVjY19nZXRoX3BoeV9yZWFkKG1paV9pbmZvLCBNSUlfUEhZU0lEMik7Ci0JcGh5X0lEIHw9IChwaHlfcmVnICYgMHhmZmZmKTsKLQotCS8qIGxvb3AgdGhyb3VnaCBhbGwgdGhlIGtub3duIFBIWSB0eXBlcywgYW5kIGZpbmQgb25lIHRoYXQgKi8KLQkvKiBtYXRjaGVzIHRoZSBJRCB3ZSByZWFkIGZyb20gdGhlIFBIWS4gKi8KLQlmb3IgKGkgPSAwOyBwaHlfaW5mb1tpXTsgaSsrKQotCQlpZiAocGh5X2luZm9baV0tPnBoeV9pZCA9PSAocGh5X0lEICYgcGh5X2luZm9baV0tPnBoeV9pZF9tYXNrKSl7Ci0JCQl0aGVJbmZvID0gcGh5X2luZm9baV07Ci0JCQlicmVhazsKLQkJfQotCi0JLyogVGhpcyBzaG91bGRuJ3QgaGFwcGVuLCBhcyB3ZSBoYXZlIGdlbmVyaWMgUEhZIHN1cHBvcnQgKi8KLQlpZiAodGhlSW5mbyA9PSBOVUxMKSB7Ci0JCXVncGh5X2luZm8oIiVzOiBQSFkgaWQgJXggaXMgbm90IHN1cHBvcnRlZCEiLCBkZXYtPm5hbWUsCi0JCQkgICBwaHlfSUQpOwotCQlyZXR1cm4gTlVMTDsKLQl9IGVsc2UgewotCQl1Z3BoeV9pbmZvKCIlczogUEhZIGlzICVzICgleCkiLCBkZXYtPm5hbWUsIHRoZUluZm8tPm5hbWUsCi0JCQkgICBwaHlfSUQpOwotCX0KLQotCXJldHVybiB0aGVJbmZvOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdWNjX2dldGhfcGh5LmggYi9kcml2ZXJzL25ldC91Y2NfZ2V0aF9waHkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU3NDA3OC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC91Y2NfZ2V0aF9waHkuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSBGcmVlc2NhbGUgU2VtaWNvbmR1dG9yLCBJbmMuIDIwMDYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogQXV0aG9yOiBTaGxvbWkgR3JpZGlzaCA8Z3JpZGlzaEBmcmVlc2NhbGUuY29tPgotICoKLSAqIERlc2NyaXB0aW9uOgotICogVUNDIEdFVEggRHJpdmVyIC0tIFBIWSBoYW5kbGluZwotICoKLSAqIENoYW5nZWxvZzoKLSAqIEp1biAyOCwgMjAwNiBMaSBZYW5nIDxMZW9MaUBmcmVlc2NhbGUuY29tPgotICogLSBSZWFycmFuZ2UgY29kZSBhbmQgc3R5bGUgZml4ZXMKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCi0gKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqLwotI2lmbmRlZiBfX1VDQ19HRVRIX1BIWV9IX18KLSNkZWZpbmUgX19VQ0NfR0VUSF9QSFlfSF9fCi0KLSNkZWZpbmUgTUlJX2VuZCAoKHUzMiktMikKLSNkZWZpbmUgTUlJX3JlYWQgKCh1MzIpLTEpCi0KLSNkZWZpbmUgTUlJTUlORF9CVVNZICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBNSUlNSU5EX05PVFZBTElEICAgICAgICAweDAwMDAwMDA0Ci0KLSNkZWZpbmUgVUdFVEhfQU5fVElNRU9VVCAgICAgICAgMjAwMAotCi0vKiAxMDAwQlQgY29udHJvbCAoTWFydmVsbCAmIEJDTTU0eHggYXQgbGVhc3QpICovCi0jZGVmaW5lIE1JSV8xMDAwQkFTRVRDT05UUk9MICAgICAgICAgICAgICAgICAgMHgwOQotI2RlZmluZSBNSUlfMTAwMEJBU0VUQ09OVFJPTF9GVUxMRFVQTEVYQ0FQICAgIDB4MDIwMAotI2RlZmluZSBNSUlfMTAwMEJBU0VUQ09OVFJPTF9IQUxGRFVQTEVYQ0FQICAgIDB4MDEwMAotCi0vKiBDaWNhZGEgRXh0ZW5kZWQgQ29udHJvbCBSZWdpc3RlciAxICovCi0jZGVmaW5lIE1JSV9DSVM4MjAxX0VYVF9DT04xICAgICAgICAweDE3Ci0jZGVmaW5lIE1JSV9DSVM4MjAxX0VYVENPTjFfSU5JVCAgICAweDAwMDAKLQotLyogQ2ljYWRhIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyICovCi0jZGVmaW5lIE1JSV9DSVM4MjAxX0lNQVNLICAgICAgICAgICAweDE5Ci0jZGVmaW5lIE1JSV9DSVM4MjAxX0lNQVNLX0lFTiAgICAgICAweDgwMDAKLSNkZWZpbmUgTUlJX0NJUzgyMDFfSU1BU0tfU1BFRUQgICAgIDB4NDAwMAotI2RlZmluZSBNSUlfQ0lTODIwMV9JTUFTS19MSU5LICAgICAgMHgyMDAwCi0jZGVmaW5lIE1JSV9DSVM4MjAxX0lNQVNLX0RVUExFWCAgICAweDEwMDAKLSNkZWZpbmUgTUlJX0NJUzgyMDFfSU1BU0tfTUFTSyAgICAgIDB4ZjAwMAotCi0vKiBDaWNhZGEgSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAqLwotI2RlZmluZSBNSUlfQ0lTODIwMV9JU1RBVCAgICAgICAgICAgMHgxYQotI2RlZmluZSBNSUlfQ0lTODIwMV9JU1RBVF9TVEFUVVMgICAgMHg4MDAwCi0jZGVmaW5lIE1JSV9DSVM4MjAxX0lTVEFUX1NQRUVEICAgICAweDQwMDAKLSNkZWZpbmUgTUlJX0NJUzgyMDFfSVNUQVRfTElOSyAgICAgIDB4MjAwMAotI2RlZmluZSBNSUlfQ0lTODIwMV9JU1RBVF9EVVBMRVggICAgMHgxMDAwCi0KLS8qIENpY2FkYSBBdXhpbGlhcnkgQ29udHJvbC9TdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgTUlJX0NJUzgyMDFfQVVYX0NPTlNUQVQgICAgICAgIDB4MWMKLSNkZWZpbmUgTUlJX0NJUzgyMDFfQVVYQ09OU1RBVF9JTklUICAgIDB4MDAwNAotI2RlZmluZSBNSUlfQ0lTODIwMV9BVVhDT05TVEFUX0RVUExFWCAgMHgwMDIwCi0jZGVmaW5lIE1JSV9DSVM4MjAxX0FVWENPTlNUQVRfU1BFRUQgICAweDAwMTgKLSNkZWZpbmUgTUlJX0NJUzgyMDFfQVVYQ09OU1RBVF9HQklUICAgIDB4MDAxMAotI2RlZmluZSBNSUlfQ0lTODIwMV9BVVhDT05TVEFUXzEwMCAgICAgMHgwMDA4Ci0KLS8qIDg4RTEwMTEgUEhZIFN0YXR1cyBSZWdpc3RlciAqLwotI2RlZmluZSBNSUlfTTEwMTFfUEhZX1NQRUNfU1RBVFVTICAgICAgICAgICAgICAgMHgxMQotI2RlZmluZSBNSUlfTTEwMTFfUEhZX1NQRUNfU1RBVFVTXzEwMDAgICAgICAgICAgMHg4MDAwCi0jZGVmaW5lIE1JSV9NMTAxMV9QSFlfU1BFQ19TVEFUVVNfMTAwICAgICAgICAgICAweDQwMDAKLSNkZWZpbmUgTUlJX00xMDExX1BIWV9TUEVDX1NUQVRVU19TUERfTUFTSyAgICAgIDB4YzAwMAotI2RlZmluZSBNSUlfTTEwMTFfUEhZX1NQRUNfU1RBVFVTX0ZVTExEVVBMRVggICAgMHgyMDAwCi0jZGVmaW5lIE1JSV9NMTAxMV9QSFlfU1BFQ19TVEFUVVNfUkVTT0xWRUQgICAgICAweDA4MDAKLSNkZWZpbmUgTUlJX00xMDExX1BIWV9TUEVDX1NUQVRVU19MSU5LICAgICAgICAgIDB4MDQwMAotCi0jZGVmaW5lIE1JSV9NMTAxMV9JRVZFTlQgICAgICAgICAgICAgICAgMHgxMwotI2RlZmluZSBNSUlfTTEwMTFfSUVWRU5UX0NMRUFSICAgICAgICAgIDB4MDAwMAotCi0jZGVmaW5lIE1JSV9NMTAxMV9JTUFTSyAgICAgICAgICAgICAgICAgMHgxMgotI2RlZmluZSBNSUlfTTEwMTFfSU1BU0tfSU5JVCAgICAgICAgICAgIDB4NjQwMAotI2RlZmluZSBNSUlfTTEwMTFfSU1BU0tfQ0xFQVIgICAgICAgICAgIDB4MDAwMAotCi0jZGVmaW5lIE1JSV9ETTkxNjFfU0NSICAgICAgICAgICAgICAgICAgMHgxMAotI2RlZmluZSBNSUlfRE05MTYxX1NDUl9JTklUICAgICAgICAgICAgIDB4MDYxMAotCi0vKiBETTkxNjEgU3BlY2lmaWVkIENvbmZpZ3VyYXRpb24gYW5kIFN0YXR1cyBSZWdpc3RlciAqLwotI2RlZmluZSBNSUlfRE05MTYxX1NDU1IgICAgICAgICAgICAgICAgIDB4MTEKLSNkZWZpbmUgTUlJX0RNOTE2MV9TQ1NSXzEwMEYgICAgICAgICAgICAweDgwMDAKLSNkZWZpbmUgTUlJX0RNOTE2MV9TQ1NSXzEwMEggICAgICAgICAgICAweDQwMDAKLSNkZWZpbmUgTUlJX0RNOTE2MV9TQ1NSXzEwRiAgICAgICAgICAgICAweDIwMDAKLSNkZWZpbmUgTUlJX0RNOTE2MV9TQ1NSXzEwSCAgICAgICAgICAgICAweDEwMDAKLQotLyogRE05MTYxIEludGVycnVwdCBSZWdpc3RlciAqLwotI2RlZmluZSBNSUlfRE05MTYxX0lOVFIgICAgICAgICAgICAgICAgIDB4MTUKLSNkZWZpbmUgTUlJX0RNOTE2MV9JTlRSX1BFTkQgICAgICAgICAgICAweDgwMDAKLSNkZWZpbmUgTUlJX0RNOTE2MV9JTlRSX0RQTFhfTUFTSyAgICAgICAweDA4MDAKLSNkZWZpbmUgTUlJX0RNOTE2MV9JTlRSX1NQRF9NQVNLICAgICAgICAweDA0MDAKLSNkZWZpbmUgTUlJX0RNOTE2MV9JTlRSX0xJTktfTUFTSyAgICAgICAweDAyMDAKLSNkZWZpbmUgTUlJX0RNOTE2MV9JTlRSX01BU0sgICAgICAgICAgICAweDAxMDAKLSNkZWZpbmUgTUlJX0RNOTE2MV9JTlRSX0RQTFhfQ0hBTkdFICAgICAweDAwMTAKLSNkZWZpbmUgTUlJX0RNOTE2MV9JTlRSX1NQRF9DSEFOR0UgICAgICAweDAwMDgKLSNkZWZpbmUgTUlJX0RNOTE2MV9JTlRSX0xJTktfQ0hBTkdFICAgICAweDAwMDQKLSNkZWZpbmUgTUlJX0RNOTE2MV9JTlRSX0lOSVQgICAgICAgICAgICAweDAwMDAKLSNkZWZpbmUgTUlJX0RNOTE2MV9JTlRSX1NUT1AgICAgXAotKE1JSV9ETTkxNjFfSU5UUl9EUExYX01BU0sgfCBNSUlfRE05MTYxX0lOVFJfU1BEX01BU0sgXAotIHwgTUlJX0RNOTE2MV9JTlRSX0xJTktfTUFTSyB8IE1JSV9ETTkxNjFfSU5UUl9NQVNLKQotCi0vKiBETTkxNjEgMTBCVCBDb25maWd1cmF0aW9uL1N0YXR1cyAqLwotI2RlZmluZSBNSUlfRE05MTYxXzEwQlRDU1IgICAgICAgICAgICAgIDB4MTIKLSNkZWZpbmUgTUlJX0RNOTE2MV8xMEJUQ1NSX0lOSVQgICAgICAgICAweDc4MDAKLQotI2RlZmluZSBNSUlfQkFTSUNfRkVBVFVSRVMgICAgKFNVUFBPUlRFRF8xMGJhc2VUX0hhbGYgfCBcCi0gICAgICAgICAgICAgICAgIFNVUFBPUlRFRF8xMGJhc2VUX0Z1bGwgfCBcCi0gICAgICAgICAgICAgICAgIFNVUFBPUlRFRF8xMDBiYXNlVF9IYWxmIHwgXAotICAgICAgICAgICAgICAgICBTVVBQT1JURURfMTAwYmFzZVRfRnVsbCB8IFwKLSAgICAgICAgICAgICAgICAgU1VQUE9SVEVEX0F1dG9uZWcgfCBcCi0gICAgICAgICAgICAgICAgIFNVUFBPUlRFRF9UUCB8IFwKLSAgICAgICAgICAgICAgICAgU1VQUE9SVEVEX01JSSkKLQotI2RlZmluZSBNSUlfR0JJVF9GRUFUVVJFUyAgICAoTUlJX0JBU0lDX0ZFQVRVUkVTIHwgXAotICAgICAgICAgICAgICAgICBTVVBQT1JURURfMTAwMGJhc2VUX0hhbGYgfCBcCi0gICAgICAgICAgICAgICAgIFNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbCkKLQotI2RlZmluZSBNSUlfUkVBRF9DT01NQU5EICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLQotI2RlZmluZSBNSUlfSU5URVJSVVBUX0RJU0FCTEVEICAgICAgICAgIDB4MAotI2RlZmluZSBNSUlfSU5URVJSVVBUX0VOQUJMRUQgICAgICAgICAgIDB4MQotLyogVGFrZW4gZnJvbSBtaWlfaWZfaW5mbyBhbmQgc3VuZ2VtX3BoeS5oICovCi1zdHJ1Y3QgdWdldGhfbWlpX2luZm8gewotCS8qIEluZm9ybWF0aW9uIGFib3V0IHRoZSBQSFkgdHlwZSAqLwotCS8qIEFuZCBtYW5hZ2VtZW50IGZ1bmN0aW9ucyAqLwotCXN0cnVjdCBwaHlfaW5mbyAqcGh5aW5mbzsKLQotCXN0cnVjdCB1Y2NfbWlpX21uZyAqbWlpX3JlZ3M7Ci0KLQkvKiBmb3JjZWQgc3BlZWQgJiBkdXBsZXggKG5vIGF1dG9uZWcpCi0JICogcGFydG5lciBzcGVlZCAmIGR1cGxleCAmIHBhdXNlIChhdXRvbmVnKQotCSAqLwotCWludCBzcGVlZDsKLQlpbnQgZHVwbGV4OwotCWludCBwYXVzZTsKLQotCS8qIFRoZSBtb3N0IHJlY2VudGx5IHJlYWQgbGluayBzdGF0ZSAqLwotCWludCBsaW5rOwotCi0JLyogRW5hYmxlZCBJbnRlcnJ1cHRzICovCi0JdTMyIGludGVycnVwdHM7Ci0KLQl1MzIgYWR2ZXJ0aXNpbmc7Ci0JaW50IGF1dG9uZWc7Ci0JaW50IG1paV9pZDsKLQotCS8qIHByaXZhdGUgZGF0YSBwb2ludGVyICovCi0JLyogRm9yIHVzZSBieSBQSFlzIHRvIG1haW50YWluIGV4dHJhIHN0YXRlICovCi0Jdm9pZCAqcHJpdjsKLQotCS8qIFByb3ZpZGVkIGJ5IGhvc3QgY2hpcCAqLwotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7Ci0KLQkvKiBBIGxvY2sgdG8gZW5zdXJlIHRoYXQgb25seSBvbmUgdGhpbmcgY2FuIHJlYWQvd3JpdGUKLQkgKiB0aGUgTURJTyBidXMgYXQgYSB0aW1lICovCi0Jc3BpbmxvY2tfdCBtZGlvX2xvY2s7Ci0KLQkvKiBQcm92aWRlZCBieSBldGhlcm5ldCBkcml2ZXIgKi8KLQlpbnQgKCptZGlvX3JlYWQpIChzdHJ1Y3QgbmV0X2RldmljZSAqIGRldiwgaW50IG1paV9pZCwgaW50IHJlZyk7Ci0Jdm9pZCAoKm1kaW9fd3JpdGUpIChzdHJ1Y3QgbmV0X2RldmljZSAqIGRldiwgaW50IG1paV9pZCwgaW50IHJlZywKLQkJCSAgICBpbnQgdmFsKTsKLX07Ci0KLS8qIHN0cnVjdCBwaHlfaW5mbzogYSBzdHJ1Y3R1cmUgd2hpY2ggZGVmaW5lcyBhdHRyaWJ1dGVzIGZvciBhIFBIWQotICoKLSAqIGlkIHdpbGwgY29udGFpbiBhIG51bWJlciB3aGljaCByZXByZXNlbnRzIHRoZSBQSFkuICBEdXJpbmcKLSAqIHN0YXJ0dXAsIHRoZSBkcml2ZXIgd2lsbCBwb2xsIHRoZSBQSFkgdG8gZmluZCBvdXQgd2hhdCBpdHMKLSAqIFVJRC0tYXMgZGVmaW5lZCBieSByZWdpc3RlcnMgMiBhbmQgMy0taXMuICBUaGUgMzItYml0IHJlc3VsdAotICogZ290dGVuIGZyb20gdGhlIFBIWSB3aWxsIGJlIEFORGVkIHdpdGggcGh5X2lkX21hc2sgdG8KLSAqIGRpc2NhcmQgYW55IGJpdHMgd2hpY2ggbWF5IGNoYW5nZSBiYXNlZCBvbiByZXZpc2lvbiBudW1iZXJzCi0gKiB1bmltcG9ydGFudCB0byBmdW5jdGlvbmFsaXR5Ci0gKgotICogVGhlcmUgYXJlIDYgY29tbWFuZHMgd2hpY2ggdGFrZSBhIHVnZXRoX21paV9pbmZvIHN0cnVjdHVyZS4KLSAqIEVhY2ggUEhZIG11c3QgZGVjbGFyZSBjb25maWdfYW5lZywgYW5kIHJlYWRfc3RhdHVzLgotICovCi1zdHJ1Y3QgcGh5X2luZm8gewotCXUzMiBwaHlfaWQ7Ci0JY2hhciAqbmFtZTsKLQl1bnNpZ25lZCBpbnQgcGh5X2lkX21hc2s7Ci0JdTMyIGZlYXR1cmVzOwotCi0JLyogQ2FsbGVkIHRvIGluaXRpYWxpemUgdGhlIFBIWSAqLwotCWludCAoKmluaXQpIChzdHJ1Y3QgdWdldGhfbWlpX2luZm8gKiBtaWlfaW5mbyk7Ci0KLQkvKiBDYWxsZWQgdG8gc3VzcGVuZCB0aGUgUEhZIGZvciBwb3dlciAqLwotCWludCAoKnN1c3BlbmQpIChzdHJ1Y3QgdWdldGhfbWlpX2luZm8gKiBtaWlfaW5mbyk7Ci0KLQkvKiBSZWNvbmZpZ3VyZXMgYXV0b25lZ290aWF0aW9uIChvciBkaXNhYmxlcyBpdCkgKi8KLQlpbnQgKCpjb25maWdfYW5lZykgKHN0cnVjdCB1Z2V0aF9taWlfaW5mbyAqIG1paV9pbmZvKTsKLQotCS8qIERldGVybWluZXMgdGhlIG5lZ290aWF0ZWQgc3BlZWQgYW5kIGR1cGxleCAqLwotCWludCAoKnJlYWRfc3RhdHVzKSAoc3RydWN0IHVnZXRoX21paV9pbmZvICogbWlpX2luZm8pOwotCi0JLyogQ2xlYXJzIGFueSBwZW5kaW5nIGludGVycnVwdHMgKi8KLQlpbnQgKCphY2tfaW50ZXJydXB0KSAoc3RydWN0IHVnZXRoX21paV9pbmZvICogbWlpX2luZm8pOwotCi0JLyogRW5hYmxlcyBvciBkaXNhYmxlcyBpbnRlcnJ1cHRzICovCi0JaW50ICgqY29uZmlnX2ludHIpIChzdHJ1Y3QgdWdldGhfbWlpX2luZm8gKiBtaWlfaW5mbyk7Ci0KLQkvKiBDbGVhcnMgdXAgYW55IG1lbW9yeSBpZiBuZWVkZWQgKi8KLQl2b2lkICgqY2xvc2UpIChzdHJ1Y3QgdWdldGhfbWlpX2luZm8gKiBtaWlfaW5mbyk7Ci19OwotCi1zdHJ1Y3QgcGh5X2luZm8gKmdldF9waHlfaW5mbyhzdHJ1Y3QgdWdldGhfbWlpX2luZm8gKm1paV9pbmZvKTsKLXZvaWQgd3JpdGVfcGh5X3JlZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbWlpX2lkLCBpbnQgcmVnbnVtLCBpbnQgdmFsdWUpOwotaW50IHJlYWRfcGh5X3JlZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbWlpX2lkLCBpbnQgcmVnbnVtKTsKLXZvaWQgbWlpX2NsZWFyX3BoeV9pbnRlcnJ1cHQoc3RydWN0IHVnZXRoX21paV9pbmZvICptaWlfaW5mbyk7Ci12b2lkIG1paV9jb25maWd1cmVfcGh5X2ludGVycnVwdChzdHJ1Y3QgdWdldGhfbWlpX2luZm8gKm1paV9pbmZvLAotCQkJCSB1MzIgaW50ZXJydXB0cyk7Ci0KLXN0cnVjdCBkbTkxNjFfcHJpdmF0ZSB7Ci0Jc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7Ci0JaW50IHJlc2V0ZG9uZTsKLX07Ci0KLSNlbmRpZgkJCQkvKiBfX1VDQ19HRVRIX1BIWV9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3ZpYS1yaGluZS5jIGIvZHJpdmVycy9uZXQvdmlhLXJoaW5lLmMKaW5kZXggZjNhOTcyZS4uYWRlYTI5MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdmlhLXJoaW5lLmMKKysrIGIvZHJpdmVycy9uZXQvdmlhLXJoaW5lLmMKQEAgLTE0ODYsNyArMTQ4Niw2IEBACiAJCQkgICBjb3B5aW5nIHRvIGEgbWluaW1hbGx5LXNpemVkIHNrYnVmZi4gKi8KIAkJCWlmIChwa3RfbGVuIDwgcnhfY29weWJyZWFrICYmCiAJCQkJKHNrYiA9IGRldl9hbGxvY19za2IocGt0X2xlbiArIDIpKSAhPSBOVUxMKSB7Ci0JCQkJc2tiLT5kZXYgPSBkZXY7CiAJCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsJLyogMTYgYnl0ZSBhbGlnbiB0aGUgSVAgaGVhZGVyICovCiAJCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KHJwLT5wZGV2LAogCQkJCQkJCSAgICBycC0+cnhfc2tidWZmX2RtYVtlbnRyeV0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC92aWEtdmVsb2NpdHkuYyBiL2RyaXZlcnMvbmV0L3ZpYS12ZWxvY2l0eS5jCmluZGV4IDhlNWQ4MjAuLjI1Yjc1YjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3ZpYS12ZWxvY2l0eS5jCisrKyBiL2RyaXZlcnMvbmV0L3ZpYS12ZWxvY2l0eS5jCkBAIC0xMzM5LDcgKzEzMzksOCBAQAogCQkJaWYgKHZwdHItPmZsYWdzICYgVkVMT0NJVFlfRkxBR1NfSVBfQUxJR04pCiAJCQkJc2tiX3Jlc2VydmUobmV3X3NrYiwgMik7CiAKLQkJCW1lbWNweShuZXdfc2tiLT5kYXRhLCByeF9za2JbMF0tPmRhdGEsIHBrdF9zaXplKTsKKwkJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEocnhfc2tiWzBdLCBuZXdfc2tiLT5kYXRhLAorCQkJCQkJICBwa3Rfc2l6ZSk7CiAJCQkqcnhfc2tiID0gbmV3X3NrYjsKIAkJCXJldCA9IDA7CiAJCX0KQEAgLTEzOTgsNyArMTM5OSw2IEBACiAJCXZwdHItPnN0YXRzLm11bHRpY2FzdCsrOwogCiAJc2tiID0gcmRfaW5mby0+c2tiOwotCXNrYi0+ZGV2ID0gdnB0ci0+ZGV2OwogCiAJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KHZwdHItPnBkZXYsIHJkX2luZm8tPnNrYl9kbWEsCiAJCQkJICAgIHZwdHItPnJ4X2J1Zl9zeiwgUENJX0RNQV9GUk9NREVWSUNFKTsKQEAgLTE0MjgsNyArMTQyOCw3IEBACiAJCSAgIFBDSV9ETUFfRlJPTURFVklDRSk7CiAKIAlza2JfcHV0KHNrYiwgcGt0X2xlbiAtIDQpOwotCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIHNrYi0+ZGV2KTsKKwlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCB2cHRyLT5kZXYpOwogCiAJc3RhdHMtPnJ4X2J5dGVzICs9IHBrdF9sZW47CiAJbmV0aWZfcngoc2tiKTsKQEAgLTE5MjgsNyArMTkyOCw3IEBACiAJaWYgKHBrdGxlbiA8IEVUSF9aTEVOKSB7CiAJCS8qIENhbm5vdCBvY2N1ciB1bnRpbCBaQyBzdXBwb3J0ICovCiAJCXBrdGxlbiA9IEVUSF9aTEVOOwotCQltZW1jcHkodGRpbmZvLT5idWYsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgdGRpbmZvLT5idWYsIHNrYi0+bGVuKTsKIAkJbWVtc2V0KHRkaW5mby0+YnVmICsgc2tiLT5sZW4sIDAsIEVUSF9aTEVOIC0gc2tiLT5sZW4pOwogCQl0ZGluZm8tPnNrYiA9IHNrYjsKIAkJdGRpbmZvLT5za2JfZG1hWzBdID0gdGRpbmZvLT5idWZfZG1hOwpAQCAtMTk0NCw3ICsxOTQ0LDcgQEAKIAkJaW50IG5mcmFncyA9IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7CiAJCXRkaW5mby0+c2tiID0gc2tiOwogCQlpZiAobmZyYWdzID4gNikgewotCQkJbWVtY3B5KHRkaW5mby0+YnVmLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwkJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCB0ZGluZm8tPmJ1Ziwgc2tiLT5sZW4pOwogCQkJdGRpbmZvLT5za2JfZG1hWzBdID0gdGRpbmZvLT5idWZfZG1hOwogCQkJdGRfcHRyLT50ZGVzYzAucGt0c2l6ZSA9CiAJCQl0ZF9wdHItPnRkX2J1ZlswXS5wYV9sb3cgPSBjcHVfdG9fbGUzMih0ZGluZm8tPnNrYl9kbWFbMF0pOwpAQCAtMjAwNyw3ICsyMDA3LDcgQEAKIAkgKi8KIAlpZiAoKHZwdHItPmZsYWdzICYgVkVMT0NJVFlfRkxBR1NfVFhfQ1NVTSkKIAkJCQkgJiYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1BBUlRJQUwpKSB7Ci0JCXN0cnVjdCBpcGhkciAqaXAgPSBza2ItPm5oLmlwaDsKKwkJY29uc3Qgc3RydWN0IGlwaGRyICppcCA9IGlwX2hkcihza2IpOwogCQlpZiAoaXAtPnByb3RvY29sID09IElQUFJPVE9fVENQKQogCQkJdGRfcHRyLT50ZGVzYzEuVENSIHw9IFRDUjBfVENQQ0s7CiAJCWVsc2UgaWYgKGlwLT5wcm90b2NvbCA9PSBJUFBST1RPX1VEUCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9jb3NhLmMgYi9kcml2ZXJzL25ldC93YW4vY29zYS5jCmluZGV4IDViODJlNGYuLjIzNDY0NzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dhbi9jb3NhLmMKKysrIGIvZHJpdmVycy9uZXQvd2FuL2Nvc2EuYwpAQCAtNzczLDcgKzc3Myw3IEBACiAJfQogCWNoYW4tPnJ4X3NrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9XQU5fUFBQKTsKIAljaGFuLT5yeF9za2ItPmRldiA9IGNoYW4tPnBwcGRldi5kZXY7Ci0JY2hhbi0+cnhfc2tiLT5tYWMucmF3ID0gY2hhbi0+cnhfc2tiLT5kYXRhOworCXNrYl9yZXNldF9tYWNfaGVhZGVyKGNoYW4tPnJ4X3NrYik7CiAJY2hhbi0+c3RhdHMucnhfcGFja2V0cysrOwogCWNoYW4tPnN0YXRzLnJ4X2J5dGVzICs9IGNoYW4tPmNvc2EtPnJ4c2l6ZTsKIAluZXRpZl9yeChjaGFuLT5yeF9za2IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2N5Y3hfeDI1LmMgYi9kcml2ZXJzL25ldC93YW4vY3ljeF94MjUuYwppbmRleCBhNjMxZDFjLi4wMTZiM2ZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93YW4vY3ljeF94MjUuYworKysgYi9kcml2ZXJzL25ldC93YW4vY3ljeF94MjUuYwpAQCAtODM0LDcgKzgzNCw3IEBACiAJKytjaGFuLT5pZnN0YXRzLnJ4X3BhY2tldHM7CiAJY2hhbi0+aWZzdGF0cy5yeF9ieXRlcyArPSBwa3RsZW47CiAKLQlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKIAluZXRpZl9yeChza2IpOwogCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CQkvKiB0aW1lc3RhbXAgKi8KIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9kbGNpLmMgYi9kcml2ZXJzL25ldC93YW4vZGxjaS5jCmluZGV4IDczNjk4NzUuLjY2YmUyMGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dhbi9kbGNpLmMKKysrIGIvZHJpdmVycy9uZXQvd2FuL2RsY2kuYwpAQCAtMTc2LDcgKzE3Niw3IEBACiAJaWYgKHByb2Nlc3MpCiAJewogCQkvKiB3ZSd2ZSBzZXQgdXAgdGhlIHByb3RvY29sLCBzbyBkaXNjYXJkIHRoZSBoZWFkZXIgKi8KLQkJc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOyAKKwkJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKIAkJc2tiX3B1bGwoc2tiLCBoZWFkZXIpOwogCQlkbHAtPnN0YXRzLnJ4X2J5dGVzICs9IHNrYi0+bGVuOwogCQluZXRpZl9yeChza2IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2RzY2M0LmMgYi9kcml2ZXJzL25ldC93YW4vZHNjYzQuYwppbmRleCAyNTAyMWE3Li5kY2EwMjQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93YW4vZHNjYzQuYworKysgYi9kcml2ZXJzL25ldC93YW4vZHNjYzQuYwpAQCAtMTkwNCw3ICsxOTA0LDggQEAKIAkJc3RydWN0IFR4RkQgKnR4X2ZkID0gZHByaXYtPnR4X2ZkICsgbGFzdDsKIAogCQlza2ItPmxlbiA9IERVTU1ZX1NLQl9TSVpFOwotCQltZW1jcHkoc2tiLT5kYXRhLCB2ZXJzaW9uLCBzdHJsZW4odmVyc2lvbiklRFVNTVlfU0tCX1NJWkUpOworCQlza2JfY29weV90b19saW5lYXJfZGF0YShza2IsIHZlcnNpb24sCisJCQkJCXN0cmxlbih2ZXJzaW9uKSAlIERVTU1ZX1NLQl9TSVpFKTsKIAkJdHhfZmQtPnN0YXRlID0gRnJhbWVFbmQgfCBUT19TVEFURV9UWChEVU1NWV9TS0JfU0laRSk7CiAJCXR4X2ZkLT5kYXRhID0gcGNpX21hcF9zaW5nbGUoZHByaXYtPnBjaV9wcml2LT5wZGV2LCBza2ItPmRhdGEsCiAJCQkJCSAgICAgRFVNTVlfU0tCX1NJWkUsIFBDSV9ETUFfVE9ERVZJQ0UpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2ZhcnN5bmMuYyBiL2RyaXZlcnMvbmV0L3dhbi9mYXJzeW5jLmMKaW5kZXggYzQ1ZDZhOC4uNThhNTNiNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2FuL2ZhcnN5bmMuYworKysgYi9kcml2ZXJzL25ldC93YW4vZmFyc3luYy5jCkBAIC04NjQsNyArODY0LDcgQEAKIHN0YXRpYyBfX2JlMTYgZmFyc3luY190eXBlX3RyYW5zKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc2tiLT5kZXYgPSBkZXY7Ci0Jc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOworCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CiAJc2tiLT5wa3RfdHlwZSA9IFBBQ0tFVF9IT1NUOwogCXJldHVybiBodG9ucyhFVEhfUF9DVVNUKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9oZGxjX2Npc2NvLmMgYi9kcml2ZXJzL25ldC93YW4vaGRsY19jaXNjby5jCmluZGV4IGM5NjY0ZmQuLjllYzZjZjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dhbi9oZGxjX2Npc2NvLmMKKysrIGIvZHJpdmVycy9uZXQvd2FuL2hkbGNfY2lzY28uYwpAQCAtMzcsMTYgKzM3LDE2IEBACiBzdHJ1Y3QgaGRsY19oZWFkZXIgewogCXU4IGFkZHJlc3M7CiAJdTggY29udHJvbDsKLQl1MTYgcHJvdG9jb2w7CisJX19iZTE2IHByb3RvY29sOwogfV9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIAogCiBzdHJ1Y3QgY2lzY29fcGFja2V0IHsKLQl1MzIgdHlwZTsJCS8qIGNvZGUgKi8KLQl1MzIgcGFyMTsKLQl1MzIgcGFyMjsKLQl1MTYgcmVsOwkJLyogcmVsaWFiaWxpdHkgKi8KLQl1MzIgdGltZTsKKwlfX2JlMzIgdHlwZTsJCS8qIGNvZGUgKi8KKwlfX2JlMzIgcGFyMTsKKwlfX2JlMzIgcGFyMjsKKwlfX2JlMTYgcmVsOwkJLyogcmVsaWFiaWxpdHkgKi8KKwlfX2JlMzIgdGltZTsKIH1fX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAjZGVmaW5lCUNJU0NPX1BBQ0tFVF9MRU4JMTgKICNkZWZpbmUJQ0lTQ09fQklHX1BBQ0tFVF9MRU4JMjAKQEAgLTk3LDcgKzk3LDcgQEAKIAogCiBzdGF0aWMgdm9pZCBjaXNjb19rZWVwYWxpdmVfc2VuZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgdHlwZSwKLQkJCQkgdTMyIHBhcjEsIHUzMiBwYXIyKQorCQkJCSBfX2JlMzIgcGFyMSwgX19iZTMyIHBhcjIpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3QgY2lzY29fcGFja2V0ICpkYXRhOwpAQCAtMTE1LDE2ICsxMTUsMTYgQEAKIAlkYXRhID0gKHN0cnVjdCBjaXNjb19wYWNrZXQqKShza2ItPmRhdGEgKyA0KTsKIAogCWRhdGEtPnR5cGUgPSBodG9ubCh0eXBlKTsKLQlkYXRhLT5wYXIxID0gaHRvbmwocGFyMSk7Ci0JZGF0YS0+cGFyMiA9IGh0b25sKHBhcjIpOwotCWRhdGEtPnJlbCA9IDB4RkZGRjsKKwlkYXRhLT5wYXIxID0gcGFyMTsKKwlkYXRhLT5wYXIyID0gcGFyMjsKKwlkYXRhLT5yZWwgPSBfX2NvbnN0YW50X2h0b25zKDB4RkZGRik7CiAJLyogd2Ugd2lsbCBuZWVkIGRvX2RpdiBoZXJlIGlmIDEwMDAgJSBIWiAhPSAwICovCiAJZGF0YS0+dGltZSA9IGh0b25sKChqaWZmaWVzIC0gSU5JVElBTF9KSUZGSUVTKSAqICgxMDAwIC8gSFopKTsKIAogCXNrYl9wdXQoc2tiLCBzaXplb2Yoc3RydWN0IGNpc2NvX3BhY2tldCkpOwogCXNrYi0+cHJpb3JpdHkgPSBUQ19QUklPX0NPTlRST0w7CiAJc2tiLT5kZXYgPSBkZXY7Ci0Jc2tiLT5uaC5yYXcgPSBza2ItPmRhdGE7CisJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CiAKIAlkZXZfcXVldWVfeG1pdChza2IpOwogfQpAQCAtMTkzLDcgKzE5Myw3IEBACiAJCWNhc2UgQ0lTQ09fQUREUl9SRVE6IC8qIFN0b2xlbiBmcm9tIHN5bmNwcHAuYyA6LSkgKi8KIAkJCWluX2RldiA9IGRldi0+aXBfcHRyOwogCQkJYWRkciA9IDA7Ci0JCQltYXNrID0gfjA7IC8qIGlzIHRoZSBtYXNrIGNvcnJlY3Q/ICovCisJCQltYXNrID0gX19jb25zdGFudF9odG9ubCh+MCk7IC8qIGlzIHRoZSBtYXNrIGNvcnJlY3Q/ICovCiAKIAkJCWlmIChpbl9kZXYgIT0gTlVMTCkgewogCQkJCXN0cnVjdCBpbl9pZmFkZHIgKippZmFwID0gJmluX2Rldi0+aWZhX2xpc3Q7CkBAIC0yNDUsNyArMjQ1LDcgQEAKIAl9IC8qIHN3aXRjaChwcm90b2NvbCkgKi8KIAogCXByaW50ayhLRVJOX0lORk8gIiVzOiBVbnN1cHBvcnRlZCBwcm90b2NvbCAleFxuIiwgZGV2LT5uYW1lLAotCSAgICAgICBkYXRhLT5wcm90b2NvbCk7CisJICAgICAgIG50b2hzKGRhdGEtPnByb3RvY29sKSk7CiAJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKIAlyZXR1cm4gTkVUX1JYX0RST1A7CiAKQEAgLTI3MCw4ICsyNzAsOSBAQAogCQluZXRpZl9kb3JtYW50X29uKGRldik7CiAJfQogCi0JY2lzY29fa2VlcGFsaXZlX3NlbmQoZGV2LCBDSVNDT19LRUVQQUxJVkVfUkVRLCArK3N0YXRlKGhkbGMpLT50eHNlcSwKLQkJCSAgICAgc3RhdGUoaGRsYyktPnJ4c2VxKTsKKwljaXNjb19rZWVwYWxpdmVfc2VuZChkZXYsIENJU0NPX0tFRVBBTElWRV9SRVEsCisJCQkgICAgIGh0b25sKCsrc3RhdGUoaGRsYyktPnR4c2VxKSwKKwkJCSAgICAgaHRvbmwoc3RhdGUoaGRsYyktPnJ4c2VxKSk7CiAJc3RhdGUoaGRsYyktPnJlcXVlc3Rfc2VudCA9IDE7CiAJc3RhdGUoaGRsYyktPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsKIAkJc3RhdGUoaGRsYyktPnNldHRpbmdzLmludGVydmFsICogSFo7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vaGRsY19mci5jIGIvZHJpdmVycy9uZXQvd2FuL2hkbGNfZnIuYwppbmRleCBjNmMzYzc1Li4xNWI2ZTA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93YW4vaGRsY19mci5jCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9oZGxjX2ZyLmMKQEAgLTI4OCwzMSArMjg4LDMxIEBACiAJc3RydWN0IHNrX2J1ZmYgKnNrYiA9ICpza2JfcDsKIAogCXN3aXRjaCAoc2tiLT5wcm90b2NvbCkgewotCWNhc2UgX19jb25zdGFudF9udG9ocyhOTFBJRF9DQ0lUVF9BTlNJX0xNSSk6CisJY2FzZSBfX2NvbnN0YW50X2h0b25zKE5MUElEX0NDSVRUX0FOU0lfTE1JKToKIAkJaGVhZF9sZW4gPSA0OwogCQlza2JfcHVzaChza2IsIGhlYWRfbGVuKTsKIAkJc2tiLT5kYXRhWzNdID0gTkxQSURfQ0NJVFRfQU5TSV9MTUk7CiAJCWJyZWFrOwogCi0JY2FzZSBfX2NvbnN0YW50X250b2hzKE5MUElEX0NJU0NPX0xNSSk6CisJY2FzZSBfX2NvbnN0YW50X2h0b25zKE5MUElEX0NJU0NPX0xNSSk6CiAJCWhlYWRfbGVuID0gNDsKIAkJc2tiX3B1c2goc2tiLCBoZWFkX2xlbik7CiAJCXNrYi0+ZGF0YVszXSA9IE5MUElEX0NJU0NPX0xNSTsKIAkJYnJlYWs7CiAKLQljYXNlIF9fY29uc3RhbnRfbnRvaHMoRVRIX1BfSVApOgorCWNhc2UgX19jb25zdGFudF9odG9ucyhFVEhfUF9JUCk6CiAJCWhlYWRfbGVuID0gNDsKIAkJc2tiX3B1c2goc2tiLCBoZWFkX2xlbik7CiAJCXNrYi0+ZGF0YVszXSA9IE5MUElEX0lQOwogCQlicmVhazsKIAotCWNhc2UgX19jb25zdGFudF9udG9ocyhFVEhfUF9JUFY2KToKKwljYXNlIF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfSVBWNik6CiAJCWhlYWRfbGVuID0gNDsKIAkJc2tiX3B1c2goc2tiLCBoZWFkX2xlbik7CiAJCXNrYi0+ZGF0YVszXSA9IE5MUElEX0lQVjY7CiAJCWJyZWFrOwogCi0JY2FzZSBfX2NvbnN0YW50X250b2hzKEVUSF9QXzgwMl8zKToKKwljYXNlIF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfODAyXzMpOgogCQloZWFkX2xlbiA9IDEwOwogCQlpZiAoc2tiX2hlYWRyb29tKHNrYikgPCBoZWFkX2xlbikgewogCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjIgPSBza2JfcmVhbGxvY19oZWFkcm9vbShza2IsCkBAIC0zNDAsNyArMzQwLDcgQEAKIAkJc2tiLT5kYXRhWzVdID0gRlJfUEFEOwogCQlza2ItPmRhdGFbNl0gPSBGUl9QQUQ7CiAJCXNrYi0+ZGF0YVs3XSA9IEZSX1BBRDsKLQkJKih1MTYqKShza2ItPmRhdGEgKyA4KSA9IHNrYi0+cHJvdG9jb2w7CisJCSooX19iZTE2Kikoc2tiLT5kYXRhICsgOCkgPSBza2ItPnByb3RvY29sOwogCX0KIAogCWRsY2lfdG9fcTkyMihza2ItPmRhdGEsIGRsY2kpOwpAQCAtNTMzLDcgKzUzMyw3IEBACiAJCXNrYi0+cHJvdG9jb2wgPSBfX2NvbnN0YW50X2h0b25zKE5MUElEX0NDSVRUX0FOU0lfTE1JKTsKIAkJZnJfaGFyZF9oZWFkZXIoJnNrYiwgTE1JX0NDSVRUX0FOU0lfRExDSSk7CiAJfQotCWRhdGEgPSBza2ItPnRhaWw7CisJZGF0YSA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKTsKIAlkYXRhW2krK10gPSBMTUlfQ0FMTFJFRjsKIAlkYXRhW2krK10gPSBkY2UgPyBMTUlfU1RBVFVTIDogTE1JX1NUQVRVU19FTlFVSVJZOwogCWlmIChsbWkgPT0gTE1JX0FOU0kpCkBAIC01OTAsNyArNTkwLDcgQEAKIAlza2JfcHV0KHNrYiwgaSk7CiAJc2tiLT5wcmlvcml0eSA9IFRDX1BSSU9fQ09OVFJPTDsKIAlza2ItPmRldiA9IGRldjsKLQlza2ItPm5oLnJhdyA9IHNrYi0+ZGF0YTsKKwlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiKTsKIAogCWRldl9xdWV1ZV94bWl0KHNrYik7CiB9CkBAIC05NzQsOCArOTc0LDggQEAKIAogCX0gZWxzZSBpZiAoc2tiLT5sZW4gPiAxMCAmJiBkYXRhWzNdID09IEZSX1BBRCAmJgogCQkgICBkYXRhWzRdID09IE5MUElEX1NOQVAgJiYgZGF0YVs1XSA9PSBGUl9QQUQpIHsKLQkJdTE2IG91aSA9IG50b2hzKCoodTE2KikoZGF0YSArIDYpKTsKLQkJdTE2IHBpZCA9IG50b2hzKCoodTE2KikoZGF0YSArIDgpKTsKKwkJdTE2IG91aSA9IG50b2hzKCooX19iZTE2KikoZGF0YSArIDYpKTsKKwkJdTE2IHBpZCA9IG50b2hzKCooX19iZTE2KikoZGF0YSArIDgpKTsKIAkJc2tiX3B1bGwoc2tiLCAxMCk7CiAKIAkJc3dpdGNoICgoKCh1MzIpb3VpKSA8PCAxNikgfCBwaWQpIHsKQEAgLTEwMTEsNyArMTAxMSw2IEBACiAJCXN0YXRzLT5yeF9ieXRlcyArPSBza2ItPmxlbjsKIAkJaWYgKHB2Yy0+c3RhdGUuYmVjbikKIAkJCXN0YXRzLT5yeF9jb21wcmVzc2VkKys7Ci0JCXNrYi0+ZGV2ID0gZGV2OwogCQluZXRpZl9yeChza2IpOwogCQlyZXR1cm4gTkVUX1JYX1NVQ0NFU1M7CiAJfSBlbHNlIHsKQEAgLTExMjgsNyArMTEyNyw3IEBACiAJCW1lbWNweShkZXYtPmRldl9hZGRyLCAiXHgwMFx4MDEiLCAyKTsKICAgICAgICAgICAgICAgICBnZXRfcmFuZG9tX2J5dGVzKGRldi0+ZGV2X2FkZHIgKyAyLCBFVEhfQUxFTiAtIDIpOwogCX0gZWxzZSB7Ci0JCSoodTE2KilkZXYtPmRldl9hZGRyID0gaHRvbnMoZGxjaSk7CisJCSooX19iZTE2KilkZXYtPmRldl9hZGRyID0gaHRvbnMoZGxjaSk7CiAJCWRsY2lfdG9fcTkyMihkZXYtPmJyb2FkY2FzdCwgZGxjaSk7CiAJfQogCWRldi0+aGFyZF9zdGFydF94bWl0ID0gcHZjX3htaXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vaG9zdGVzc19zdjExLmMgYi9kcml2ZXJzL25ldC93YW4vaG9zdGVzc19zdjExLmMKaW5kZXggYTAyYzVmYi4uOWJhM2U0ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2FuL2hvc3Rlc3Nfc3YxMS5jCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9ob3N0ZXNzX3N2MTEuYwpAQCAtNTksNyArNTksNyBAQAogCS8qIERyb3AgdGhlIENSQyAtIGl0J3Mgbm90IGEgZ29vZCBpZGVhIHRvIHRyeSBhbmQgbmVnb3RpYXRlIGl0IDspICovCiAJc2tiX3RyaW0oc2tiLCBza2ItPmxlbi0yKTsKIAlza2ItPnByb3RvY29sPV9fY29uc3RhbnRfaHRvbnMoRVRIX1BfV0FOX1BQUCk7Ci0Jc2tiLT5tYWMucmF3PXNrYi0+ZGF0YTsKKwlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwogCXNrYi0+ZGV2PWMtPm5ldGRldmljZTsKIAkvKgogCSAqCVNlbmQgaXQgdG8gdGhlIFBQUCBsYXllci4gV2UgZG9uJ3QgaGF2ZSB0aW1lIHRvIHByb2Nlc3MKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9sbWMvbG1jX21haW4uYyBiL2RyaXZlcnMvbmV0L3dhbi9sbWMvbG1jX21haW4uYwppbmRleCAyYjU0ZjFiLi5hZTEzMmMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93YW4vbG1jL2xtY19tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvd2FuL2xtYy9sbWNfbWFpbi5jCkBAIC0xNjM2LDcgKzE2MzYsNyBAQAogICAgICAgICAgICAgaWYgKG5zYikgewogICAgICAgICAgICAgICAgIHNjLT5sbWNfcnhxW2ldID0gbnNiOwogICAgICAgICAgICAgICAgIG5zYi0+ZGV2ID0gZGV2OwotICAgICAgICAgICAgICAgIHNjLT5sbWNfcnhyaW5nW2ldLmJ1ZmZlcjEgPSB2aXJ0X3RvX2J1cyAobnNiLT50YWlsKTsKKyAgICAgICAgICAgICAgICBzYy0+bG1jX3J4cmluZ1tpXS5idWZmZXIxID0gdmlydF90b19idXMoc2tiX3RhaWxfcG9pbnRlcihuc2IpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHNjLT5mYWlsZWRfcmVjdl9hbGxvYyA9IDE7CiAgICAgICAgICAgICBnb3RvIHNraXBfcGFja2V0OwpAQCAtMTY2Nyw4ICsxNjY3LDggQEAKICAgICAgICAgICAgIHNrYl9wdXQgKHNrYiwgbGVuKTsKICAgICAgICAgICAgIHNrYi0+cHJvdG9jb2wgPSBsbWNfcHJvdG9fdHlwZShzYywgc2tiKTsKICAgICAgICAgICAgIHNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9XQU5fUFBQKTsKLSAgICAgICAgICAgIHNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKLS8vICAgICAgICAgICAgc2tiLT5uaC5yYXcgPSBza2ItPmRhdGE7CisgICAgICAgICAgICBza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOworICAgICAgICAgICAgLyogc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7ICovCiAgICAgICAgICAgICBza2ItPmRldiA9IGRldjsKICAgICAgICAgICAgIGxtY19wcm90b19uZXRpZihzYywgc2tiKTsKIApAQCAtMTY3OSw3ICsxNjc5LDcgQEAKICAgICAgICAgICAgIGlmIChuc2IpIHsKICAgICAgICAgICAgICAgICBzYy0+bG1jX3J4cVtpXSA9IG5zYjsKICAgICAgICAgICAgICAgICBuc2ItPmRldiA9IGRldjsKLSAgICAgICAgICAgICAgICBzYy0+bG1jX3J4cmluZ1tpXS5idWZmZXIxID0gdmlydF90b19idXMgKG5zYi0+dGFpbCk7CisgICAgICAgICAgICAgICAgc2MtPmxtY19yeHJpbmdbaV0uYnVmZmVyMSA9IHZpcnRfdG9fYnVzKHNrYl90YWlsX3BvaW50ZXIobnNiKSk7CiAgICAgICAgICAgICAgICAgLyogVHJhbnNmZXJyZWQgdG8gMjExNDAgYmVsb3cgKi8KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgewpAQCAtMTcwMiwxMSArMTcwMiwxMSBAQAogICAgICAgICAgICAgaWYoIW5zYikgewogICAgICAgICAgICAgICAgIGdvdG8gZ2l2ZV9pdF9hbnl3YXlzOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWVtY3B5KHNrYl9wdXQobnNiLCBsZW4pLCBza2ItPmRhdGEsIGxlbik7CisgICAgICAgICAgICBza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgc2tiX3B1dChuc2IsIGxlbiksIGxlbik7CiAgICAgICAgICAgICAKICAgICAgICAgICAgIG5zYi0+cHJvdG9jb2wgPSBsbWNfcHJvdG9fdHlwZShzYywgc2tiKTsKLSAgICAgICAgICAgIG5zYi0+bWFjLnJhdyA9IG5zYi0+ZGF0YTsKLS8vICAgICAgICAgICAgbnNiLT5uaC5yYXcgPSBuc2ItPmRhdGE7CisgICAgICAgICAgICBza2JfcmVzZXRfbWFjX2hlYWRlcihuc2IpOworICAgICAgICAgICAgLyogc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKG5zYik7ICovCiAgICAgICAgICAgICBuc2ItPmRldiA9IGRldjsKICAgICAgICAgICAgIGxtY19wcm90b19uZXRpZihzYywgbnNiKTsKICAgICAgICAgfQpAQCAtMTkzMiw3ICsxOTMyLDcgQEAKICAgICAgICAgc2MtPmxtY19yeHJpbmdbaV0uc3RhdHVzID0gMHg4MDAwMDAwMDsKIAogICAgICAgICAvKiB1c2VkIHRvIGJlIFBLVF9CVUZfU1ogbm93IHVzZXMgc2tiIHNpbmNlIHdlIGxvc2Ugc29tZSB0byBoZWFkIHJvb20gKi8KLSAgICAgICAgc2MtPmxtY19yeHJpbmdbaV0ubGVuZ3RoID0gc2tiLT5lbmQgLSBza2ItPmRhdGE7CisgICAgICAgIHNjLT5sbWNfcnhyaW5nW2ldLmxlbmd0aCA9IHNrYl90YWlscm9vbShza2IpOwogCiAgICAgICAgIC8qIHVzZSB0byBiZSB0YWlsIHdoaWNoIGlzIGR1bWIgc2luY2UgeW91J3JlIHRoaW5raW5nIHdoeSB3cml0ZQogICAgICAgICAgKiB0byB0aGUgZW5kIG9mIHRoZSBwYWNraixldCBidXQgc2luY2UgdGhlcmUncyBub3RoaW5nIHRoZXJlIHRhaWwgPT0gZGF0YQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL3BjMzAwX2Rydi5jIGIvZHJpdmVycy9uZXQvd2FuL3BjMzAwX2Rydi5jCmluZGV4IDYyMTg0ZGUuLjk5OWJmNzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dhbi9wYzMwMF9kcnYuYworKysgYi9kcml2ZXJzL25ldC93YW4vcGMzMDBfZHJ2LmMKQEAgLTE3NTUsMTcgKzE3NTUsMTcgQEAKIAogCXNrYi0+ZGV2ID0gZGV2OwogCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9DVVNUKTsKLQlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKIAlza2ItPnBrdF90eXBlID0gUEFDS0VUX0hPU1Q7CiAJc2tiLT5sZW4gPSAxMCArIHNrYl9tYWluLT5sZW47CiAKLQltZW1jcHkoc2tiLT5kYXRhLCBkZXYtPm5hbWUsIDUpOworCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhKHNrYiwgZGV2LT5uYW1lLCA1KTsKIAlza2ItPmRhdGFbNV0gPSAnWyc7CiAJc2tiLT5kYXRhWzZdID0gcnhfdHg7CiAJc2tiLT5kYXRhWzddID0gJ10nOwogCXNrYi0+ZGF0YVs4XSA9ICc6JzsKIAlza2ItPmRhdGFbOV0gPSAnICc7Ci0JbWVtY3B5KCZza2ItPmRhdGFbMTBdLCBza2JfbWFpbi0+ZGF0YSwgc2tiX21haW4tPmxlbik7CisJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2JfbWFpbiwgJnNrYi0+ZGF0YVsxMF0sIHNrYl9tYWluLT5sZW4pOwogCiAJbmV0aWZfcngoc2tiKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9wYzMwMF90dHkuYyBiL2RyaXZlcnMvbmV0L3dhbi9wYzMwMF90dHkuYwppbmRleCA1ODczYzM0Li4wN2RiZGZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93YW4vcGMzMDBfdHR5LmMKKysrIGIvZHJpdmVycy9uZXQvd2FuL3BjMzAwX3R0eS5jCkBAIC0xMDAzLDE3ICsxMDAzLDE3IEBACiAJc2tiX3B1dCAoc2tiLCAxMCArIGxlbik7IAogCXNrYi0+ZGV2ID0gZGV2LT5kZXY7IAogCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9DVVNUKTsgCi0Jc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOyAKKwlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwogCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfSE9TVDsgCiAJc2tiLT5sZW4gPSAxMCArIGxlbjsgCiAKLQltZW1jcHkoc2tiLT5kYXRhLGRldi0+ZGV2LT5uYW1lLDUpOworCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhKHNrYiwgZGV2LT5kZXYtPm5hbWUsIDUpOwogCXNrYi0+ZGF0YVs1XSA9ICdbJzsgCiAJc2tiLT5kYXRhWzZdID0gcnh0eDsgCiAJc2tiLT5kYXRhWzddID0gJ10nOyAKIAlza2ItPmRhdGFbOF0gPSAnOic7IAogCXNrYi0+ZGF0YVs5XSA9ICcgJzsgCi0JbWVtY3B5KCZza2ItPmRhdGFbMTBdLCBidWYsIGxlbik7IAorCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhX29mZnNldChza2IsIDEwLCBidWYsIGxlbik7CiAJbmV0aWZfcngoc2tiKTsgCiB9IAkKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL3NibmkuYyBiL2RyaXZlcnMvbmV0L3dhbi9zYm5pLmMKaW5kZXggZmM1YzBjNi4uMzVlZGVkNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2FuL3NibmkuYworKysgYi9kcml2ZXJzL25ldC93YW4vc2JuaS5jCkBAIC05OTksMTEgKzk5OSw2IEBACiAJaWYoICFza2IgKQogCQlyZXR1cm4gIE5VTEw7CiAKLSNpZmRlZiBDT05GSUdfU0JOSV9NVUxUSUxJTkUKLQlza2ItPmRldiA9ICgoc3RydWN0IG5ldF9sb2NhbCAqKSBkZXYtPnByaXYpLT5tYXN0ZXI7Ci0jZWxzZQotCXNrYi0+ZGV2ID0gZGV2OwotI2VuZGlmCiAJc2tiX3Jlc2VydmUoIHNrYiwgMiApOwkJLyogQWxpZ24gSVAgb24gbG9uZ3dvcmQgYm91bmRhcmllcyAqLwogCXJldHVybiAgc2tiOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL3NlYWxldmVsLmMgYi9kcml2ZXJzL25ldC93YW4vc2VhbGV2ZWwuYwppbmRleCA3MGZiMWI5Li4xMzEzNTgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93YW4vc2VhbGV2ZWwuYworKysgYi9kcml2ZXJzL25ldC93YW4vc2VhbGV2ZWwuYwpAQCAtNjEsNyArNjEsNyBAQAogCS8qIERyb3AgdGhlIENSQyAtIGl0J3Mgbm90IGEgZ29vZCBpZGVhIHRvIHRyeSBhbmQgbmVnb3RpYXRlIGl0IDspICovCiAJc2tiX3RyaW0oc2tiLCBza2ItPmxlbi0yKTsKIAlza2ItPnByb3RvY29sPWh0b25zKEVUSF9QX1dBTl9QUFApOwotCXNrYi0+bWFjLnJhdz1za2ItPmRhdGE7CisJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKIAlza2ItPmRldj1jLT5uZXRkZXZpY2U7CiAJLyoKIAkgKglTZW5kIGl0IHRvIHRoZSBQUFAgbGF5ZXIuIFdlIGRvbid0IGhhdmUgdGltZSB0byBwcm9jZXNzCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vc3luY3BwcC5jIGIvZHJpdmVycy9uZXQvd2FuL3N5bmNwcHAuYwppbmRleCAyMThmN2I1Li42N2ZjNjdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93YW4vc3luY3BwcC5jCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9zeW5jcHBwLmMKQEAgLTIyNyw3ICsyMjcsNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlza2ItPmRldj1kZXY7Ci0Jc2tiLT5tYWMucmF3PXNrYi0+ZGF0YTsKKwlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwogCiAJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUlVOTklORykKIAl7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vejg1MjMwLmMgYi9kcml2ZXJzL25ldC93YW4vejg1MjMwLmMKaW5kZXggOGI0NTQwYi4uOThlZjQwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2FuL3o4NTIzMC5jCisrKyBiL2RyaXZlcnMvbmV0L3dhbi96ODUyMzAuYwpAQCAtMTY1Niw3ICsxNjU2LDcgQEAKIAkJZWxzZQogCQl7CiAJCQlza2JfcHV0KHNrYiwgY3QpOwotCQkJbWVtY3B5KHNrYi0+ZGF0YSwgcnhiLCBjdCk7CisJCQlza2JfY29weV90b19saW5lYXJfZGF0YShza2IsIHJ4YiwgY3QpOwogCQkJYy0+c3RhdHMucnhfcGFja2V0cysrOwogCQkJYy0+c3RhdHMucnhfYnl0ZXMrPWN0OwogCQl9CkBAIC0xNzgyLDcgKzE3ODIsNyBAQAogCQkgKi8KIAkJYy0+dHhfbmV4dF9wdHI9Yy0+dHhfZG1hX2J1ZltjLT50eF9kbWFfdXNlZF07CiAJCWMtPnR4X2RtYV91c2VkXj0xOwkvKiBGbGlwIHRlbXAgYnVmZmVyICovCi0JCW1lbWNweShjLT50eF9uZXh0X3B0ciwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCBjLT50eF9uZXh0X3B0ciwgc2tiLT5sZW4pOwogCX0KIAllbHNlCiAJCWMtPnR4X25leHRfcHRyPXNrYi0+ZGF0YTsJCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9LY29uZmlnIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvS2NvbmZpZwppbmRleCBlY2UzZDljLi5jNGIzZGMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL0tjb25maWcKQEAgLTIsNDcgKzIsMjEgQEAKICMgV2lyZWxlc3MgTEFOIGRldmljZSBjb25maWd1cmF0aW9uCiAjCiAKLW1lbnUgIldpcmVsZXNzIExBTiAobm9uLWhhbXJhZGlvKSIKK21lbnUgIldpcmVsZXNzIExBTiIKKworY29uZmlnIFdMQU5fUFJFODAyMTEKKwlib29sICJXaXJlbGVzcyBMQU4gKHByZS04MDIuMTEpIgogCWRlcGVuZHMgb24gTkVUREVWSUNFUwotCi1jb25maWcgTkVUX1JBRElPCi0JYm9vbCAiV2lyZWxlc3MgTEFOIGRyaXZlcnMgKG5vbi1oYW1yYWRpbykgJiBXaXJlbGVzcyBFeHRlbnNpb25zIgotCXNlbGVjdCBXSVJFTEVTU19FWFQKIAktLS1oZWxwLS0tCi0JICBTdXBwb3J0IGZvciB3aXJlbGVzcyBMQU5zIGFuZCBldmVyeXRoaW5nIGhhdmluZyB0byBkbyB3aXRoIHJhZGlvLAotCSAgYnV0IG5vdCB3aXRoIGFtYXRldXIgcmFkaW8gb3IgRk0gYnJvYWRjYXN0aW5nLgorCSAgU2F5IFkgaWYgeW91IGhhdmUgYW55IHByZS04MDIuMTEgd2lyZWxlc3MgTEFOIGhhcmR3YXJlLgogCi0JICBTYXlpbmcgWSBoZXJlIGFsc28gZW5hYmxlcyB0aGUgV2lyZWxlc3MgRXh0ZW5zaW9ucyAoY3JlYXRlcwotCSAgL3Byb2MvbmV0L3dpcmVsZXNzIGFuZCBlbmFibGVzIGl3Y29uZmlnIGFjY2VzcykuIFRoZSBXaXJlbGVzcwotCSAgRXh0ZW5zaW9uIGlzIGEgZ2VuZXJpYyBBUEkgYWxsb3dpbmcgYSBkcml2ZXIgdG8gZXhwb3NlIHRvIHRoZSB1c2VyCi0JICBzcGFjZSBjb25maWd1cmF0aW9uIGFuZCBzdGF0aXN0aWNzIHNwZWNpZmljIHRvIGNvbW1vbiBXaXJlbGVzcyBMQU5zLgotCSAgVGhlIGJlYXV0eSBvZiBpdCBpcyB0aGF0IGEgc2luZ2xlIHNldCBvZiB0b29sIGNhbiBzdXBwb3J0IGFsbCB0aGUKLQkgIHZhcmlhdGlvbnMgb2YgV2lyZWxlc3MgTEFOcywgcmVnYXJkbGVzcyBvZiB0aGVpciB0eXBlIChhcyBsb25nIGFzCi0JICB0aGUgZHJpdmVyIHN1cHBvcnRzIFdpcmVsZXNzIEV4dGVuc2lvbikuIEFub3RoZXIgYWR2YW50YWdlIGlzIHRoYXQKLQkgIHRoZXNlIHBhcmFtZXRlcnMgbWF5IGJlIGNoYW5nZWQgb24gdGhlIGZseSB3aXRob3V0IHJlc3RhcnRpbmcgdGhlCi0JICBkcml2ZXIgKG9yIExpbnV4KS4gSWYgeW91IHdpc2ggdG8gdXNlIFdpcmVsZXNzIEV4dGVuc2lvbnMgd2l0aAotCSAgd2lyZWxlc3MgUENNQ0lBIChQQy0pIGNhcmRzLCB5b3UgbmVlZCB0byBzYXkgWSBoZXJlOyB5b3UgY2FuIGZldGNoCi0JICB0aGUgdG9vbHMgZnJvbQotCSAgPGh0dHA6Ly93d3cuaHBsLmhwLmNvbS9wZXJzb25hbC9KZWFuX1RvdXJyaWxoZXMvTGludXgvVG9vbHMuaHRtbD4uCi0KLWNvbmZpZyBORVRfV0lSRUxFU1NfUlRORVRMSU5LCi0JYm9vbCAiV2lyZWxlc3MgRXh0ZW5zaW9uIEFQSSBvdmVyIFJ0TmV0bGluayIKLQlkZXBlbmRzIG9uIE5FVF9SQURJTwotCS0tLWhlbHAtLS0KLQkgIFN1cHBvcnQgdGhlIFdpcmVsZXNzIEV4dGVuc2lvbiBBUEkgb3ZlciB0aGUgUnROZXRsaW5rIHNvY2tldAotCSAgaW4gYWRkaXRpb24gdG8gdGhlIHRyYWRpdGlvbmFsIGlvY3RsIGludGVyZmFjZSAoc2VsZWN0ZWQgYWJvdmUpLgotCi0JICBGb3Igbm93LCBmZXcgdG9vbHMgdXNlIHRoaXMgZmFjaWxpdHksIGJ1dCBpdCBtaWdodCBncm93IGluIHRoZQotCSAgZnV0dXJlLiBUaGUgb25seSBkb3duc2lkZSBpcyB0aGF0IGl0IGFkZHMgNC41IGtCIHRvIHlvdXIga2VybmVsLgotCi0jIE5vdGUgOiB0aGUgY2FyZHMgYXJlIG9ic29sZXRlIChjYW4ndCBidXkgdGhlbSBhbnltb3JlKSwgYnV0IHRoZSBkcml2ZXJzCi0jIGFyZSBub3QsIGFzIHBlb3BsZSBhcmUgc3RpbGwgdXNpbmcgdGhlbS4uLgotY29tbWVudCAiT2Jzb2xldGUgV2lyZWxlc3MgY2FyZHMgc3VwcG9ydCAocHJlLTgwMi4xMSkiCi0JZGVwZW5kcyBvbiBORVRfUkFESU8gJiYgKElORVQgfHwgSVNBIHx8IFBDTUNJQSkKKwkgIFRoaXMgb3B0aW9uIGRvZXMgbm90IGFmZmVjdCB0aGUga2VybmVsIGJ1aWxkLCBpdCBvbmx5CisJICBsZXRzIHlvdSBjaG9vc2UgZHJpdmVycy4KIAogY29uZmlnIFNUUklQCiAJdHJpc3RhdGUgIlNUUklQIChNZXRyaWNvbSBzdGFybW9kZSByYWRpbyBJUCkiCi0JZGVwZW5kcyBvbiBORVRfUkFESU8gJiYgSU5FVAorCWRlcGVuZHMgb24gSU5FVCAmJiBXTEFOX1BSRTgwMjExCisJc2VsZWN0IFdJUkVMRVNTX0VYVAogCS0tLWhlbHAtLS0KIAkgIFNheSBZIGlmIHlvdSBoYXZlIGEgTWV0cmljb20gcmFkaW8gYW5kIGludGVuZCB0byB1c2UgU3Rhcm1vZGUgUmFkaW8KIAkgIElQLiBTVFJJUCBpcyBhIHJhZGlvIHByb3RvY29sIGRldmVsb3BlZCBmb3IgdGhlIE1vc3F1aXRvTmV0IHByb2plY3QKQEAgLTY1LDcgKzM5LDggQEAKIAogY29uZmlnIEFSTEFOCiAJdHJpc3RhdGUgIkFpcm9uZXQgQXJsYW4gNjU1ICYgSUMyMjAwIERTIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBORVRfUkFESU8gJiYgSVNBICYmICE2NEJJVAorCWRlcGVuZHMgb24gSVNBICYmICE2NEJJVCAmJiBXTEFOX1BSRTgwMjExCisJc2VsZWN0IFdJUkVMRVNTX0VYVAogCS0tLWhlbHAtLS0KIAkgIEFpcm9uZXQgbWFrZXMgQXJsYW4sIGEgY2xhc3Mgb2Ygd2lyZWxlc3MgTEFOIGFkYXB0ZXJzLiBUaGVzZSB1c2UgdGhlCiAJICB3d3cuVGVseG9uLmNvbSBjaGlwLCB3aGljaCBpcyBhbHNvIHVzZWQgb24gc2V2ZXJhbCBzaW1pbGFyIGNhcmRzLgpAQCAtODAsNyArNTUsOCBAQAogCiBjb25maWcgV0FWRUxBTgogCXRyaXN0YXRlICJBVCZUL0x1Y2VudCBvbGQgV2F2ZUxBTiAmIERFQyBSb2FtQWJvdXQgRFMgSVNBIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBORVRfUkFESU8gJiYgSVNBCisJZGVwZW5kcyBvbiBJU0EgJiYgV0xBTl9QUkU4MDIxMQorCXNlbGVjdCBXSVJFTEVTU19FWFQKIAktLS1oZWxwLS0tCiAJICBUaGUgTHVjZW50IFdhdmVMQU4gKGZvcm1lcmx5IE5DUiBhbmQgQVQmVDsgb3IgREVDIFJvYW1BYm91dCBEUykgaXMKIAkgIGEgUmFkaW8gTEFOICh3aXJlbGVzcyBFdGhlcm5ldC1saWtlIExvY2FsIEFyZWEgTmV0d29yaykgdXNpbmcgdGhlCkBAIC0xMDcsNyArODMsOCBAQAogCiBjb25maWcgUENNQ0lBX1dBVkVMQU4KIAl0cmlzdGF0ZSAiQVQmVC9MdWNlbnQgb2xkIFdhdmVMQU4gUGNtY2lhIHdpcmVsZXNzIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBORVRfUkFESU8gJiYgUENNQ0lBCisJZGVwZW5kcyBvbiBQQ01DSUEgJiYgV0xBTl9QUkU4MDIxMQorCXNlbGVjdCBXSVJFTEVTU19FWFQKIAloZWxwCiAJICBTYXkgWSBoZXJlIGlmIHlvdSBpbnRlbmQgdG8gYXR0YWNoIGFuIEFUJlQvTHVjZW50IFdhdmVsYW4gUENNQ0lBCiAJICAoUEMtY2FyZCkgd2lyZWxlc3MgRXRoZXJuZXQgbmV0d29ya2luZyBjYXJkIHRvIHlvdXIgY29tcHV0ZXIuICBUaGlzCkBAIC0xMTgsNyArOTUsOCBAQAogCiBjb25maWcgUENNQ0lBX05FVFdBVkUKIAl0cmlzdGF0ZSAiWGlyY29tIE5ldHdhdmUgQWlyU3VyZmVyIFBjbWNpYSB3aXJlbGVzcyBzdXBwb3J0IgotCWRlcGVuZHMgb24gTkVUX1JBRElPICYmIFBDTUNJQQorCWRlcGVuZHMgb24gUENNQ0lBICYmIFdMQU5fUFJFODAyMTEKKwlzZWxlY3QgV0lSRUxFU1NfRVhUCiAJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB5b3UgaW50ZW5kIHRvIGF0dGFjaCB0aGlzIHR5cGUgb2YgUENNQ0lBIChQQy1jYXJkKQogCSAgd2lyZWxlc3MgRXRoZXJuZXQgbmV0d29ya2luZyBjYXJkIHRvIHlvdXIgY29tcHV0ZXIuCkBAIC0xMjYsMTIgKzEwNCwyMCBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlCiAJICBjYWxsZWQgbmV0d2F2ZV9jcy4gIElmIHVuc3VyZSwgc2F5IE4uCiAKLWNvbW1lbnQgIldpcmVsZXNzIDgwMi4xMSBGcmVxdWVuY3kgSG9wcGluZyBjYXJkcyBzdXBwb3J0IgotCWRlcGVuZHMgb24gTkVUX1JBRElPICYmIFBDTUNJQQorCitjb25maWcgV0xBTl84MDIxMQorCWJvb2wgIldpcmVsZXNzIExBTiAoSUVFRSA4MDIuMTEpIgorCWRlcGVuZHMgb24gTkVUREVWSUNFUworCS0tLWhlbHAtLS0KKwkgIFNheSBZIGlmIHlvdSBoYXZlIGFueSA4MDIuMTEgd2lyZWxlc3MgTEFOIGhhcmR3YXJlLgorCisJICBUaGlzIG9wdGlvbiBkb2VzIG5vdCBhZmZlY3QgdGhlIGtlcm5lbCBidWlsZCwgaXQgb25seQorCSAgbGV0cyB5b3UgY2hvb3NlIGRyaXZlcnMuCiAKIGNvbmZpZyBQQ01DSUFfUkFZQ1MKIAl0cmlzdGF0ZSAiQXZpYXRvci9SYXl0aGVvbiAyLjRNSHogd2lyZWxlc3Mgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIE5FVF9SQURJTyAmJiBQQ01DSUEKKwlkZXBlbmRzIG9uIFBDTUNJQSAmJiBXTEFOXzgwMjExCisJc2VsZWN0IFdJUkVMRVNTX0VYVAogCS0tLWhlbHAtLS0KIAkgIFNheSBZIGhlcmUgaWYgeW91IGludGVuZCB0byBhdHRhY2ggYW4gQXZpYXRvci9SYXl0aGVvbiBQQ01DSUEKIAkgIChQQy1jYXJkKSB3aXJlbGVzcyBFdGhlcm5ldCBuZXR3b3JraW5nIGNhcmQgdG8geW91ciBjb21wdXRlci4KQEAgLTE0MSwxMiArMTI3LDEwIEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUKIAkgIGNhbGxlZCByYXlfY3MuICBJZiB1bnN1cmUsIHNheSBOLgogCi1jb21tZW50ICJXaXJlbGVzcyA4MDIuMTFiIElTQS9QQ0kgY2FyZHMgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIE5FVF9SQURJTyAmJiAoSVNBIHx8IFBDSSB8fCBQUENfUE1BQyB8fCBQQ01DSUEpCi0KIGNvbmZpZyBJUFcyMTAwCiAJdHJpc3RhdGUgIkludGVsIFBSTy9XaXJlbGVzcyAyMTAwIE5ldHdvcmsgQ29ubmVjdGlvbiIKLQlkZXBlbmRzIG9uIE5FVF9SQURJTyAmJiBQQ0kKKwlkZXBlbmRzIG9uIFBDSSAmJiBXTEFOXzgwMjExCisJc2VsZWN0IFdJUkVMRVNTX0VYVAogCXNlbGVjdCBGV19MT0FERVIKIAlzZWxlY3QgSUVFRTgwMjExCiAJLS0taGVscC0tLQpAQCAtMjAwLDcgKzE4NCw4IEBACiAKIGNvbmZpZyBJUFcyMjAwCiAJdHJpc3RhdGUgIkludGVsIFBSTy9XaXJlbGVzcyAyMjAwQkcgYW5kIDI5MTVBQkcgTmV0d29yayBDb25uZWN0aW9uIgotCWRlcGVuZHMgb24gTkVUX1JBRElPICYmIFBDSQorCWRlcGVuZHMgb24gUENJICYmIFdMQU5fODAyMTEKKwlzZWxlY3QgV0lSRUxFU1NfRVhUCiAJc2VsZWN0IEZXX0xPQURFUgogCXNlbGVjdCBJRUVFODAyMTEKIAktLS1oZWxwLS0tCkBAIC0yODAsOSArMjY1LDIzIEBACiAKIAkgIElmIHlvdSBhcmUgbm90IHN1cmUsIHNheSBOIGhlcmUuCiAKK2NvbmZpZyBMSUJFUlRBU19VU0IKKwl0cmlzdGF0ZSAiTWFydmVsbCBMaWJlcnRhcyA4Mzg4IDgwMi4xMWEvYi9nIGNhcmRzIgorCWRlcGVuZHMgb24gTkVUX1JBRElPICYmIFVTQgorCXNlbGVjdCBGV19MT0FERVIKKwktLS1oZWxwLS0tCisJICBBIGRyaXZlciBmb3IgTWFydmVsbCBMaWJlcnRhcyA4Mzg4IFVTQiBkZXZpY2VzLgorCitjb25maWcgTElCRVJUQVNfVVNCX0RFQlVHCisJYm9vbCAiRW5hYmxlIGZ1bGwgZGVidWdnaW5nIG91dHB1dCBpbiB0aGUgTGliZXJ0YXMgVVNCIG1vZHVsZS4iCisJZGVwZW5kcyBvbiBMSUJFUlRBU19VU0IKKwktLS1oZWxwLS0tCisJICBEZWJ1Z2dpbmcgc3VwcG9ydC4KKwogY29uZmlnIEFJUk8KIAl0cmlzdGF0ZSAiQ2lzY28vQWlyb25ldCAzNFgvMzVYLzQ1MDAvNDgwMCBJU0EgYW5kIFBDSSBjYXJkcyIKLSAJZGVwZW5kcyBvbiBORVRfUkFESU8gJiYgSVNBX0RNQV9BUEkgJiYgKFBDSSB8fCBCUk9LRU4pCisJZGVwZW5kcyBvbiBJU0FfRE1BX0FQSSAmJiBXTEFOXzgwMjExICYmIChQQ0kgfHwgQlJPS0VOKQorCXNlbGVjdCBXSVJFTEVTU19FWFQKIAlzZWxlY3QgQ1JZUFRPCiAJLS0taGVscC0tLQogCSAgVGhpcyBpcyB0aGUgc3RhbmRhcmQgTGludXggZHJpdmVyIHRvIHN1cHBvcnQgQ2lzY28vQWlyb25ldCBJU0EgYW5kCkBAIC0yOTksNyArMjk4LDggQEAKIAogY29uZmlnIEhFUk1FUwogCXRyaXN0YXRlICJIZXJtZXMgY2hpcHNldCA4MDIuMTFiIHN1cHBvcnQgKE9yaW5vY28vUHJpc20yL1N5bWJvbCkiCi0JZGVwZW5kcyBvbiBORVRfUkFESU8gJiYgKFBQQ19QTUFDIHx8IFBDSSB8fCBQQ01DSUEpCisJZGVwZW5kcyBvbiAoUFBDX1BNQUMgfHwgUENJIHx8IFBDTUNJQSkgJiYgV0xBTl84MDIxMQorCXNlbGVjdCBXSVJFTEVTU19FWFQKIAktLS1oZWxwLS0tCiAJICBBIGRyaXZlciBmb3IgODAyLjExYiB3aXJlbGVzcyBjYXJkcyBiYXNlZCBvbiB0aGUgIkhlcm1lcyIgb3IKIAkgIEludGVyc2lsIEhGQTM4NHggKFByaXNtIDIpIE1BQyBjb250cm9sbGVyLiAgVGhpcyBpbmNsdWRlcyB0aGUgdmFzdApAQCAtMzczLDcgKzM3Myw4IEBACiAKIGNvbmZpZyBBVE1FTAogICAgICAgdHJpc3RhdGUgIkF0bWVsIGF0NzZjNTB4IGNoaXBzZXQgIDgwMi4xMWIgc3VwcG9ydCIKLSAgICAgIGRlcGVuZHMgb24gTkVUX1JBRElPICYmIChQQ0kgfHwgUENNQ0lBKQorICAgICAgZGVwZW5kcyBvbiAoUENJIHx8IFBDTUNJQSkgJiYgV0xBTl84MDIxMQorICAgICAgc2VsZWN0IFdJUkVMRVNTX0VYVAogICAgICAgc2VsZWN0IEZXX0xPQURFUgogICAgICAgc2VsZWN0IENSQzMyCiAgICAgICAgLS0taGVscC0tLQpAQCAtMzk0LDEzICszOTUsOSBAQAogICAgICAgICBFbmFibGUgc3VwcG9ydCBmb3IgUENJIGFuZCBtaW5pLVBDSSBjYXJkcyBjb250YWluaW5nIHRoZQogICAgICAgICBBdG1lbCBhdDc2YzUwNiBjaGlwLgogCi0jIElmIFBjbWNpYSBpcyBjb21waWxlZCBpbiwgb2ZmZXIgUGNtY2lhIGNhcmRzLi4uCi1jb21tZW50ICJXaXJlbGVzcyA4MDIuMTFiIFBjbWNpYS9DYXJkYnVzIGNhcmRzIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBORVRfUkFESU8gJiYgUENNQ0lBCi0KIGNvbmZpZyBQQ01DSUFfSEVSTUVTCiAJdHJpc3RhdGUgIkhlcm1lcyBQQ01DSUEgY2FyZCBzdXBwb3J0IgotCWRlcGVuZHMgb24gTkVUX1JBRElPICYmIFBDTUNJQSAmJiBIRVJNRVMKKwlkZXBlbmRzIG9uIFBDTUNJQSAmJiBIRVJNRVMKIAktLS1oZWxwLS0tCiAJICBBIGRyaXZlciBmb3IgIkhlcm1lcyIgY2hpcHNldCBiYXNlZCBQQ01DSUEgd2lyZWxlc3MgYWRhcHRvcnMsIHN1Y2gKIAkgIGFzIHRoZSBMdWNlbnQgV2F2ZWxhbklFRUUvT3Jpbm9jbyBjYXJkcyBhbmQgdGhlaXIgT0VNIChDYWJsZXRyb24vCkBAIC00MjAsNyArNDE3LDcgQEAKIAogY29uZmlnIFBDTUNJQV9TUEVDVFJVTQogCXRyaXN0YXRlICJTeW1ib2wgU3BlY3RydW0yNCBUcmlsb2d5IFBDTUNJQSBjYXJkIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBORVRfUkFESU8gJiYgUENNQ0lBICYmIEhFUk1FUworCWRlcGVuZHMgb24gUENNQ0lBICYmIEhFUk1FUwogCXNlbGVjdCBGV19MT0FERVIKIAktLS1oZWxwLS0tCiAKQEAgLTQzNCw3ICs0MzEsOCBAQAogCiBjb25maWcgQUlST19DUwogCXRyaXN0YXRlICJDaXNjby9BaXJvbmV0IDM0WC8zNVgvNDUwMC80ODAwIFBDTUNJQSBjYXJkcyIKLQlkZXBlbmRzIG9uIE5FVF9SQURJTyAmJiBQQ01DSUEgJiYgKEJST0tFTiB8fCAhTTMyUikKKwlkZXBlbmRzIG9uIFBDTUNJQSAmJiAoQlJPS0VOIHx8ICFNMzJSKSAmJiBXTEFOXzgwMjExCisJc2VsZWN0IFdJUkVMRVNTX0VYVAogCXNlbGVjdCBDUllQVE8KIAlzZWxlY3QgQ1JZUFRPX0FFUwogCS0tLWhlbHAtLS0KQEAgLTQ1OCw3ICs0NTYsOCBAQAogCiBjb25maWcgUENNQ0lBX0FUTUVMCiAJdHJpc3RhdGUgIkF0bWVsIGF0NzZjNTAyL2F0NzZjNTA0IFBDTUNJQSBjYXJkcyIKLQlkZXBlbmRzIG9uIE5FVF9SQURJTyAmJiBBVE1FTCAmJiBQQ01DSUEKKwlkZXBlbmRzIG9uIEFUTUVMICYmIFBDTUNJQQorCXNlbGVjdCBXSVJFTEVTU19FWFQKIAlzZWxlY3QgRldfTE9BREVSCiAJc2VsZWN0IENSQzMyCiAJLS0taGVscC0tLQpAQCAtNDY3LDE3ICs0NjYsMTcgQEAKIAogY29uZmlnIFBDTUNJQV9XTDM1MDEKICAgICAgIHRyaXN0YXRlICJQbGFuZXQgV0wzNTAxIFBDTUNJQSBjYXJkcyIKLSAgICAgIGRlcGVuZHMgb24gTkVUX1JBRElPICYmIEVYUEVSSU1FTlRBTCAmJiBQQ01DSUEKKyAgICAgIGRlcGVuZHMgb24gRVhQRVJJTUVOVEFMICYmIFBDTUNJQSAmJiBXTEFOXzgwMjExCisgICAgICBzZWxlY3QgV0lSRUxFU1NfRVhUCiAgICAgICAgLS0taGVscC0tLQogICAgICAgICAgQSBkcml2ZXIgZm9yIFdMMzUwMSBQQ01DSUEgODAyLjExIHdpcmVsZXNzIGNhcmRzIG1hZGUgYnkgUGxhbmV0LgogCSBJdCBoYXMgYmFzaWMgc3VwcG9ydCBmb3IgTGludXggd2lyZWxlc3MgZXh0ZW5zaW9ucyBhbmQgaW5pdGlhbAogCSBtaWNybyBzdXBwb3J0IGZvciBldGh0b29sLgogCi1jb21tZW50ICJQcmlzbSBHVC9EdWV0dGUgODAyLjExKGEvYi9nKSBQQ0kvQ2FyZGJ1cyBzdXBwb3J0IgotCWRlcGVuZHMgb24gTkVUX1JBRElPICYmIFBDSQogY29uZmlnIFBSSVNNNTQKIAl0cmlzdGF0ZSAnSW50ZXJzaWwgUHJpc20gR1QvRHVldHRlL0luZGlnbyBQQ0kvQ2FyZGJ1cycgCi0JZGVwZW5kcyBvbiBQQ0kgJiYgTkVUX1JBRElPICYmIEVYUEVSSU1FTlRBTAorCWRlcGVuZHMgb24gUENJICYmIEVYUEVSSU1FTlRBTCAmJiBXTEFOXzgwMjExCisJc2VsZWN0IFdJUkVMRVNTX0VYVAogCXNlbGVjdCBGV19MT0FERVIKIAktLS1oZWxwLS0tCiAJICBFbmFibGUgUENJIGFuZCBDYXJkYnVzIHN1cHBvcnQgZm9yIHRoZSBmb2xsb3dpbmcgY2hpcHNldCBiYXNlZCBjYXJkczoKQEAgLTUyMyw3ICs1MjIsOCBAQAogCiBjb25maWcgVVNCX1pEMTIwMQogCXRyaXN0YXRlICJVU0IgWkQxMjAxIGJhc2VkIFdpcmVsZXNzIGRldmljZSBzdXBwb3J0IgotCWRlcGVuZHMgb24gVVNCICYmIE5FVF9SQURJTworCWRlcGVuZHMgb24gVVNCICYmIFdMQU5fODAyMTEKKwlzZWxlY3QgV0lSRUxFU1NfRVhUCiAJc2VsZWN0IEZXX0xPQURFUgogCS0tLWhlbHAtLS0KIAkgIFNheSBZIGlmIHlvdSB3YW50IHRvIHVzZSB3aXJlbGVzcyBMQU4gYWRhcHRlcnMgYmFzZWQgb24gdGhlIFp5REFTCkBAIC01NDIsMTEgKzU0Miw0IEBACiBzb3VyY2UgImRyaXZlcnMvbmV0L3dpcmVsZXNzL2JjbTQzeHgvS2NvbmZpZyIKIHNvdXJjZSAiZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvS2NvbmZpZyIKIAotIyB5ZXMsIHRoaXMgd29ya3MgZXZlbiB3aGVuIG5vIGRyaXZlcnMgYXJlIHNlbGVjdGVkCi1jb25maWcgTkVUX1dJUkVMRVNTCi0JYm9vbAotCWRlcGVuZHMgb24gTkVUX1JBRElPICYmIChJU0EgfHwgUENJIHx8IFBQQ19QTUFDIHx8IFBDTUNJQSkKLQlkZWZhdWx0IHkKLQogZW5kbWVudQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL01ha2VmaWxlCmluZGV4IGM2MTNhZjEuLmQyMTI0NjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL01ha2VmaWxlCkBAIC00MywzICs0Myw0IEBACiBvYmotJChDT05GSUdfUENNQ0lBX1dMMzUwMSkJKz0gd2wzNTAxX2NzLm8KIAogb2JqLSQoQ09ORklHX1VTQl9aRDEyMDEpCSs9IHpkMTIwMS5vCitvYmotJChDT05GSUdfTElCRVJUQVNfVVNCKSAgICAgKz0gbGliZXJ0YXMvCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9SRUFETUUgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjMjc0YmYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotCVJFQURNRQotCS0tLS0tLQotCi0JVGhpcyBkaXJlY3RvcnkgaXMgbW9zdGx5IGZvciBXaXJlbGVzcyBMQU4gZHJpdmVycywgaW4gdGhlaXIKLXZhcmlvdXMgaW5jYXJuYXRpb25zIChJU0EsIFBDSSwgUGNtY2lhLi4uKS4KLQlUaGlzIHNlcGFyYXRlIGRpcmVjdG9yeSBpcyBuZWVkZWQgYmVjYXVzZSBhIGxvdCBvZiBkcml2ZXIgd29yawotb24gZGlmZmVyZW50IGJ1cyAodHlwaWNhbGx5IFBDSSArIFBjbWNpYSkgYW5kIHNoYXJlIDk1JSBvZiB0aGUKLWNvZGUuIFRoaXMgYWxsb3cgdGhlIGNvZGUgYW5kIHRoZSBjb25maWcgb3B0aW9ucyB0byBiZSBpbiBvbmUgc2luZ2xlCi1wbGFjZSBpbnN0ZWFkIG9mIHNjYXR0ZXJlZCBhbGwgb3ZlciB0aGUgZHJpdmVyIHRyZWUsIHdoaWNoIGlzIG5ldmVyCi0xMDAlIHNhdGlzZmFjdG9yeS4KLQotCU5vdGUgOiBpZiB5b3Ugd2FudCBtb3JlIGluZm8gb24gdGhlIHRvcGljIG9mIFdpcmVsZXNzIExBTnMsCi15b3UgYXJlIGtpbmRseSBpbnZpdGVkIHRvIGhhdmUgYSBsb29rIGF0IHRoZSBXaXJlbGVzcyBIb3d0byA6Ci0JCWh0dHA6Ly93d3cuaHBsLmhwLmNvbS9wZXJzb25hbC9KZWFuX1RvdXJyaWxoZXMvTGludXgvCi0JU29tZSBXaXJlbGVzcyBMQU4gZHJpdmVycywgbGlrZSBvcmlub2NvX2NzLCByZXF1aXJlIHRoZSB1c2Ugb2YKLVdpcmVsZXNzIFRvb2xzIHRvIGJlIGNvbmZpZ3VyZWQgOgotCQlodHRwOi8vd3d3LmhwbC5ocC5jb20vcGVyc29uYWwvSmVhbl9Ub3VycmlsaGVzL0xpbnV4L1Rvb2xzLmh0bWwKLQotCVNwZWNpYWwgbm90ZXMgZm9yIGRpc3RyaWJ1dGlvbiBtYWludGFpbmVycyA6Ci0JMSkgd3ZsYW5fY3Mgd2lsbCBiZSBkaXNjb250aW51ZWQgc29vbiBpbiBmYXZvciBvZiBvcmlub2NvX2NzCi0JMikgUGxlYXNlIGFkZCBXaXJlbGVzcyBUb29scyBzdXBwb3J0IGluIHlvdXIgc2NyaXB0cwotCi0JSGF2ZSBmdW4uLi4KLQotCUplYW4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Fpcm8uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Fpcm8uYwppbmRleCAyYWRhNzZhLi5mMjFiYmFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9haXJvLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWlyby5jCkBAIC0xMTQ1LDYgKzExNDUsNyBAQAogc3RydWN0IGFpcm9faW5mbyB7CiAJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMJc3RhdHM7CiAJc3RydWN0IG5ldF9kZXZpY2UgICAgICAgICAgICAgKmRldjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICAgICAgICBkZXZfbGlzdDsKIAkvKiBOb3RlLCB3ZSBjYW4gaGF2ZSBNQVhfRklEUyBvdXRzdGFuZGluZy4gIEZJRHMgYXJlIDE2LWJpdHMsIHNvIHdlCiAJICAgdXNlIHRoZSBoaWdoIGJpdCB0byBtYXJrIHdoZXRoZXIgaXQgaXMgaW4gdXNlLiAqLwogI2RlZmluZSBNQVhfRklEUyA2CkBAIC0yMzYwLDYgKzIzNjEsMjEgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIExJU1RfSEVBRChhaXJvX2RldmljZXMpOworCitzdGF0aWMgdm9pZCBhZGRfYWlyb19kZXYoc3RydWN0IGFpcm9faW5mbyAqYWkpCit7CisJLyogVXBwZXIgbGF5ZXJzIGFscmVhZHkga2VlcCB0cmFjayBvZiBQQ0kgZGV2aWNlcywKKwkgKiBzbyB3ZSBvbmx5IG5lZWQgdG8gcmVtZW1iZXIgb3VyIG5vbi1QQ0kgY2FyZHMuICovCisJaWYgKCFhaS0+cGNpKQorCQlsaXN0X2FkZF90YWlsKCZhaS0+ZGV2X2xpc3QsICZhaXJvX2RldmljZXMpOworfQorCitzdGF0aWMgdm9pZCBkZWxfYWlyb19kZXYoc3RydWN0IGFpcm9faW5mbyAqYWkpCit7CisJaWYgKCFhaS0+cGNpKQorCQlsaXN0X2RlbCgmYWktPmRldl9saXN0KTsKK30KIAogc3RhdGljIGludCBhaXJvX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIHsKIAlzdHJ1Y3QgYWlyb19pbmZvICphaSA9IGRldi0+cHJpdjsKQEAgLTIzODEsOCArMjM5Nyw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGRlbF9haXJvX2Rldiggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApOwotCiB2b2lkIHN0b3BfYWlyb19jYXJkKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgZnJlZXJlcyApCiB7CiAJc3RydWN0IGFpcm9faW5mbyAqYWkgPSBkZXYtPnByaXY7CkBAIC0yNDM0LDE3ICsyNDQ4LDE1IEBACiAJCX0KICAgICAgICAgfQogCWNyeXB0b19mcmVlX2NpcGhlcihhaS0+dGZtKTsKLQlkZWxfYWlyb19kZXYoIGRldiApOworCWRlbF9haXJvX2RldihhaSk7CiAJZnJlZV9uZXRkZXYoIGRldiApOwogfQogCiBFWFBPUlRfU1lNQk9MKHN0b3BfYWlyb19jYXJkKTsKIAotc3RhdGljIGludCBhZGRfYWlyb19kZXYoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKTsKLQogc3RhdGljIGludCB3bGxfaGVhZGVyX3BhcnNlKHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGNoYXIgKmhhZGRyKQogewotCW1lbWNweShoYWRkciwgc2tiLT5tYWMucmF3ICsgMTAsIEVUSF9BTEVOKTsKKwltZW1jcHkoaGFkZHIsIHNrYl9tYWNfaGVhZGVyKHNrYikgKyAxMCwgRVRIX0FMRU4pOwogCXJldHVybiBFVEhfQUxFTjsKIH0KIApAQCAtMjc0MCw4ICsyNzUyLDYgQEAKIAogc3RhdGljIHZvaWQgYWlyb19uZXR3b3Jrc19mcmVlKHN0cnVjdCBhaXJvX2luZm8gKmFpKQogewotCWlmICghYWktPm5ldHdvcmtzKQotCQlyZXR1cm47CiAJa2ZyZWUoYWktPm5ldHdvcmtzKTsKIAlhaS0+bmV0d29ya3MgPSBOVUxMOwogfQpAQCAtMjgxNiwxMiArMjgyNiwxMCBAQAogCWlmIChJU19FUlIoYWktPmFpcm9fdGhyZWFkX3Rhc2spKQogCQlnb3RvIGVycl9vdXRfZnJlZTsKIAlhaS0+dGZtID0gTlVMTDsKLQlyYyA9IGFkZF9haXJvX2RldiggZGV2ICk7Ci0JaWYgKHJjKQotCQlnb3RvIGVycl9vdXRfdGhyOworCWFkZF9haXJvX2RldihhaSk7CiAKIAlpZiAoYWlyb19uZXR3b3Jrc19hbGxvY2F0ZSAoYWkpKQotCQlnb3RvIGVycl9vdXRfdW5saW5rOworCQlnb3RvIGVycl9vdXRfdGhyOwogCWFpcm9fbmV0d29ya3NfaW5pdGlhbGl6ZSAoYWkpOwogCiAJLyogVGhlIEFpcm8tc3BlY2lmaWMgZW50cmllcyBpbiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4gKi8KQEAgLTI5MzcsOSArMjk0NSw4IEBACiAJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CiBlcnJfb3V0X25ldHM6CiAJYWlyb19uZXR3b3Jrc19mcmVlKGFpKTsKLWVycl9vdXRfdW5saW5rOgotCWRlbF9haXJvX2RldihkZXYpOwogZXJyX291dF90aHI6CisJZGVsX2Fpcm9fZGV2KGFpKTsKIAlzZXRfYml0KEpPQl9ESUUsICZhaS0+am9icyk7CiAJa3RocmVhZF9zdG9wKGFpLT5haXJvX3RocmVhZF90YXNrKTsKIGVycl9vdXRfZnJlZToKQEAgLTM0MTEsMTQgKzM0MTgsMTIgQEAKIAkJCU9VVDQ1MDAoIGFwcml2LCBFVkFDSywgRVZfUlgpOwogCiAJCQlpZiAodGVzdF9iaXQoRkxBR184MDJfMTEsICZhcHJpdi0+ZmxhZ3MpKSB7Ci0JCQkJc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOworCQkJCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CiAJCQkJc2tiLT5wa3RfdHlwZSA9IFBBQ0tFVF9PVEhFUkhPU1Q7CiAJCQkJc2tiLT5kZXYgPSBhcHJpdi0+d2lmaWRldjsKIAkJCQlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfODAyXzIpOwotCQkJfSBlbHNlIHsKLQkJCQlza2ItPmRldiA9IGRldjsKKwkJCX0gZWxzZQogCQkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsZGV2KTsKLQkJCX0KIAkJCXNrYi0+ZGV2LT5sYXN0X3J4ID0gamlmZmllczsKIAkJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKIApAQCAtMzY0MSw3ICszNjQ2LDYgQEAKIAkJfQogI2VuZGlmIC8qIFdJUkVMRVNTX1NQWSAqLwogCi0JCXNrYi0+ZGV2ID0gYWktPmRldjsKIAkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOwogCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBhaS0+ZGV2KTsKIAkJc2tiLT5kZXYtPmxhc3RfcnggPSBqaWZmaWVzOwpAQCAtMzc0OSw3ICszNzUzLDcgQEAKIAkJd2lyZWxlc3Nfc3B5X3VwZGF0ZShhaS0+ZGV2LCBzYSwgJndzdGF0cyk7CiAJfQogI2VuZGlmIC8qIElXX1dJUkVMRVNTX1NQWSAqLwotCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKwlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwogCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfT1RIRVJIT1NUOwogCXNrYi0+ZGV2ID0gYWktPndpZmlkZXY7CiAJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QXzgwMl8yKTsKQEAgLTU1MzgsMTEgKzU1NDIsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2VfbGlzdCB7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKLQlzdHJ1Y3QgbmV0X2RldmljZV9saXN0ICpuZXh0OwotfSAqYWlyb19kZXZpY2VzOwotCiAvKiBTaW5jZSB0aGUgY2FyZCBkb2Vzbid0IGF1dG9tYXRpY2FsbHkgc3dpdGNoIHRvIHRoZSByaWdodCBXRVAgbW9kZSwKICAgIHdlIHdpbGwgbWFrZSBpdCBkbyBpdC4gIElmIHRoZSBjYXJkIGlzbid0IGFzc29jaWF0ZWQsIGV2ZXJ5IHNlY3Mgd2UKICAgIHdpbGwgc3dpdGNoIFdFUCBtb2RlcyB0byBzZWUgaWYgdGhhdCB3aWxsIGhlbHAuICBJZiB0aGUgY2FyZCBpcwpAQCAtNTU4NSwyNiArNTU4NCw2IEBACiAJYXByaXYtPmV4cGlyZXMgPSBSVU5fQVQoSFoqMyk7CiB9CiAKLXN0YXRpYyBpbnQgYWRkX2Fpcm9fZGV2KCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkgewotCXN0cnVjdCBuZXRfZGV2aWNlX2xpc3QgKm5vZGUgPSBrbWFsbG9jKCBzaXplb2YoICpub2RlICksIEdGUF9LRVJORUwgKTsKLQlpZiAoICFub2RlICkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlub2RlLT5kZXYgPSBkZXY7Ci0Jbm9kZS0+bmV4dCA9IGFpcm9fZGV2aWNlczsKLQlhaXJvX2RldmljZXMgPSBub2RlOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGRlbF9haXJvX2Rldiggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApIHsKLQlzdHJ1Y3QgbmV0X2RldmljZV9saXN0ICoqcCA9ICZhaXJvX2RldmljZXM7Ci0Jd2hpbGUoICpwICYmICggKCpwKS0+ZGV2ICE9IGRldiApICkKLQkJcCA9ICYoKnApLT5uZXh0OwotCWlmICggKnAgJiYgKCpwKS0+ZGV2ID09IGRldiApCi0JCSpwID0gKCpwKS0+bmV4dDsKLX0KLQogI2lmZGVmIENPTkZJR19QQ0kKIHN0YXRpYyBpbnQgX19kZXZpbml0IGFpcm9fcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAogCQkJCSAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcGVudCkKQEAgLTU2MjgsNiArNTYwNywxMCBAQAogCiBzdGF0aWMgdm9pZCBfX2RldmV4aXQgYWlyb19wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogeworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisKKwlhaXJvX3ByaW50X2luZm8oZGV2LT5uYW1lLCAiVW5yZWdpc3RlcmluZy4uLiIpOworCXN0b3BfYWlyb19jYXJkKGRldiwgMSk7CiB9CiAKIHN0YXRpYyBpbnQgYWlyb19wY2lfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQpAQCAtNTc1Myw5ICs1NzM2LDExIEBACiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBhaXJvX2NsZWFudXBfbW9kdWxlKCB2b2lkICkKIHsKLQl3aGlsZSggYWlyb19kZXZpY2VzICkgewotCQlhaXJvX3ByaW50X2luZm8oYWlyb19kZXZpY2VzLT5kZXYtPm5hbWUsICJVbnJlZ2lzdGVyaW5nLi4uXG4iKTsKLQkJc3RvcF9haXJvX2NhcmQoIGFpcm9fZGV2aWNlcy0+ZGV2LCAxICk7CisJc3RydWN0IGFpcm9faW5mbyAqYWk7CisJd2hpbGUoIWxpc3RfZW1wdHkoJmFpcm9fZGV2aWNlcykpIHsKKwkJYWkgPSBsaXN0X2VudHJ5KGFpcm9fZGV2aWNlcy5uZXh0LCBzdHJ1Y3QgYWlyb19pbmZvLCBkZXZfbGlzdCk7CisJCWFpcm9fcHJpbnRfaW5mbyhhaS0+ZGV2LT5uYW1lLCAiVW5yZWdpc3RlcmluZy4uLiIpOworCQlzdG9wX2Fpcm9fY2FyZChhaS0+ZGV2LCAxKTsKIAl9CiAjaWZkZWYgQ09ORklHX1BDSQogCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmYWlyb19kcml2ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXJsYW4tbWFpbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXJsYW4tbWFpbi5jCmluZGV4IDQ2ODhlNTYuLjQ5OGU4NDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2FybGFuLW1haW4uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hcmxhbi1tYWluLmMKQEAgLTE1MDAsNyArMTUwMCw2IEBACiAJCQkJYnJlYWs7CiAJCQl9CiAJCQlza2JfcmVzZXJ2ZShza2IsIDIpOwotCQkJc2tiLT5kZXYgPSBkZXY7CiAJCQlza2J0bXAgPSBza2JfcHV0KHNrYiwgcGt0X2xlbik7CiAKIAkJCW1lbWNweV9mcm9taW8oc2tidG1wICsgQVJMQU5fRkFLRV9IRFJfTEVOLCAoKGNoYXIgX19pb21lbSAqKSBhcmxhbikgKyByeE9mZnNldCwgcGt0X2xlbiAtIEFSTEFOX0ZBS0VfSERSX0xFTik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdG1lbC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRtZWwuYwppbmRleCAyM2ViYTY5Li41MWE3ZGI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdG1lbC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0bWVsLmMKQEAgLTgyNywxNCArODI3LDE0IEBACiAJaWYgKHByaXYtPndlcF9pc19vbikKIAkJZnJhbWVfY3RsIHw9IElFRUU4MDIxMV9GQ1RMX1BST1RFQ1RFRDsKIAlpZiAocHJpdi0+b3BlcmF0aW5nX21vZGUgPT0gSVdfTU9ERV9BREhPQykgewotCQltZW1jcHkoJmhlYWRlci5hZGRyMSwgc2tiLT5kYXRhLCA2KTsKKwkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsICZoZWFkZXIuYWRkcjEsIDYpOwogCQltZW1jcHkoJmhlYWRlci5hZGRyMiwgZGV2LT5kZXZfYWRkciwgNik7CiAJCW1lbWNweSgmaGVhZGVyLmFkZHIzLCBwcml2LT5CU1NJRCwgNik7CiAJfSBlbHNlIHsKIAkJZnJhbWVfY3RsIHw9IElFRUU4MDIxMV9GQ1RMX1RPRFM7CiAJCW1lbWNweSgmaGVhZGVyLmFkZHIxLCBwcml2LT5DdXJyZW50QlNTSUQsIDYpOwogCQltZW1jcHkoJmhlYWRlci5hZGRyMiwgZGV2LT5kZXZfYWRkciwgNik7Ci0JCW1lbWNweSgmaGVhZGVyLmFkZHIzLCBza2ItPmRhdGEsIDYpOworCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgJmhlYWRlci5hZGRyMywgNik7CiAJfQogCiAJaWYgKHByaXYtPnVzZV93cGEpCkBAIC05MjAsNyArOTIwLDYgQEAKIAkJbWVtY3B5KCZza2JwWzZdLCBoZWFkZXItPmFkZHIyLCA2KTsgLyogc291cmNlIGFkZHJlc3MgKi8KIAogCXByaXYtPmRldi0+bGFzdF9yeCA9IGppZmZpZXM7Ci0Jc2tiLT5kZXYgPSBwcml2LT5kZXY7CiAJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgcHJpdi0+ZGV2KTsKIAlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CiAJbmV0aWZfcngoc2tiKTsKQEAgLTEwMjgsNyArMTAyNyw2IEBACiAJCQkJICAgICAgIHByaXYtPnJ4X2J1ZiwKIAkJCQkgICAgICAgcHJpdi0+ZnJhZ19sZW4gKyAxMik7CiAJCQkJcHJpdi0+ZGV2LT5sYXN0X3J4ID0gamlmZmllczsKLQkJCQlza2ItPmRldiA9IHByaXYtPmRldjsKIAkJCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBwcml2LT5kZXYpOwogCQkJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKIAkJCQluZXRpZl9yeChza2IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYmNtNDN4eC9LY29uZmlnIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYmNtNDN4eC9LY29uZmlnCmluZGV4IDUzMzk5M2YuLmNlMzk3ZTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JjbTQzeHgvS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iY200M3h4L0tjb25maWcKQEAgLTEsNiArMSw3IEBACiBjb25maWcgQkNNNDNYWAogCXRyaXN0YXRlICJCcm9hZGNvbSBCQ000M3h4IHdpcmVsZXNzIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBQQ0kgJiYgSUVFRTgwMjExICYmIElFRUU4MDIxMV9TT0ZUTUFDICYmIE5FVF9SQURJTyAmJiBFWFBFUklNRU5UQUwKKwlkZXBlbmRzIG9uIFBDSSAmJiBJRUVFODAyMTEgJiYgSUVFRTgwMjExX1NPRlRNQUMgJiYgV0xBTl84MDIxMSAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgV0lSRUxFU1NfRVhUCiAJc2VsZWN0IEZXX0xPQURFUgogCXNlbGVjdCBIV19SQU5ET00KIAktLS1oZWxwLS0tCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iY200M3h4L2JjbTQzeHguaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JjbTQzeHgvYmNtNDN4eC5oCmluZGV4IDk1ZmYxNzVkLi5mODQ4M2MxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iY200M3h4L2JjbTQzeHguaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iY200M3h4L2JjbTQzeHguaApAQCAtMjc3LDExICsyNzcsMTQgQEAKICNkZWZpbmUgQkNNNDN4eF9TQlRNU1RBVEVMT1dfUkVKRUNUCQkweDAyCiAjZGVmaW5lIEJDTTQzeHhfU0JUTVNUQVRFTE9XX0NMT0NLCQkweDEwMDAwCiAjZGVmaW5lIEJDTTQzeHhfU0JUTVNUQVRFTE9XX0ZPUkNFX0dBVEVfQ0xPQ0sJMHgyMDAwMAorI2RlZmluZSBCQ000M3h4X1NCVE1TVEFURUxPV19HX01PREVfRU5BQkxFCTB4MjAwMDAwMDAKIAogLyogc2J0bXN0YXRlaGlnaCBzdGF0ZSBmbGFncyAqLwogI2RlZmluZSBCQ000M3h4X1NCVE1TVEFURUhJR0hfU0VSUk9SCQkweDAwMDAwMDAxCiAjZGVmaW5lIEJDTTQzeHhfU0JUTVNUQVRFSElHSF9CVVNZCQkweDAwMDAwMDA0CiAjZGVmaW5lIEJDTTQzeHhfU0JUTVNUQVRFSElHSF9USU1FT1VUCQkweDAwMDAwMDIwCisjZGVmaW5lIEJDTTQzeHhfU0JUTVNUQVRFSElHSF9HX1BIWV9BVkFJTAkweDAwMDEwMDAwCisjZGVmaW5lIEJDTTQzeHhfU0JUTVNUQVRFSElHSF9BX1BIWV9BVkFJTAkweDAwMDIwMDAwCiAjZGVmaW5lIEJDTTQzeHhfU0JUTVNUQVRFSElHSF9DT1JFRkxBR1MJCTB4MUZGRjAwMDAKICNkZWZpbmUgQkNNNDN4eF9TQlRNU1RBVEVISUdIX0RNQTY0QklUCQkweDEwMDAwMDAwCiAjZGVmaW5lIEJDTTQzeHhfU0JUTVNUQVRFSElHSF9HQVRFRENMSwkJMHgyMDAwMDAwMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYmNtNDN4eC9iY200M3h4X2RtYS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYmNtNDN4eC9iY200M3h4X2RtYS5jCmluZGV4IDZlMGRjNzYuLmUzZDJlNjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JjbTQzeHgvYmNtNDN4eF9kbWEuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iY200M3h4L2JjbTQzeHhfZG1hLmMKQEAgLTk5OCw3ICs5OTgsOCBAQAogCQkJYXNzZXJ0KDApOwogCQkJcmV0dXJuOwogCQl9Ci0JCW1lbWNweShza2JfcHV0KGJvdW5jZV9za2IsIHNrYi0+bGVuKSwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCBza2JfcHV0KGJvdW5jZV9za2IsIHNrYi0+bGVuKSwKKwkJCQkJICBza2ItPmxlbik7CiAJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CiAJCXNrYiA9IGJvdW5jZV9za2I7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYmNtNDN4eC9iY200M3h4X2V0aHRvb2wuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JjbTQzeHgvYmNtNDN4eF9ldGh0b29sLmMKaW5kZXggYzk0NzAyNS4uZDJkZjZhMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYmNtNDN4eC9iY200M3h4X2V0aHRvb2wuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iY200M3h4L2JjbTQzeHhfZXRodG9vbC5jCkBAIC0zMiw3ICszMiw3IEBACiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvdXRzcmVsZWFzZS5oPgorI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KIAogCiBzdGF0aWMgdm9pZCBiY200M3h4X2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCkBAIC00MCw3ICs0MCw3IEBACiAJc3RydWN0IGJjbTQzeHhfcHJpdmF0ZSAqYmNtID0gYmNtNDN4eF9wcml2KGRldik7CiAKIAlzdHJuY3B5KGluZm8tPmRyaXZlciwgS0JVSUxEX01PRE5BTUUsIHNpemVvZihpbmZvLT5kcml2ZXIpKTsKLQlzdHJuY3B5KGluZm8tPnZlcnNpb24sIFVUU19SRUxFQVNFLCBzaXplb2YoaW5mby0+dmVyc2lvbikpOworCXN0cm5jcHkoaW5mby0+dmVyc2lvbiwgdXRzbmFtZSgpLT5yZWxlYXNlLCBzaXplb2YoaW5mby0+dmVyc2lvbikpOwogCXN0cm5jcHkoaW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKGJjbS0+cGNpX2RldiksIEVUSFRPT0xfQlVTSU5GT19MRU4pOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iY200M3h4L2JjbTQzeHhfbWFpbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYmNtNDN4eC9iY200M3h4X21haW4uYwppbmRleCBhMzhlN2VlLi41ZTk2YmNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iY200M3h4L2JjbTQzeHhfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JjbTQzeHgvYmNtNDN4eF9tYWluLmMKQEAgLTE0MDcsNyArMTQwNyw3IEBACiAJCQkJJiB+KEJDTTQzeHhfU0JGX01BQ19FTkFCTEVEIHwgMHgwMDAwMDAwMikpOwogCX0gZWxzZSB7CiAJCWlmIChjb25uZWN0X3BoeSkKLQkJCWZsYWdzIHw9IDB4MjAwMDAwMDA7CisJCQlmbGFncyB8PSBCQ000M3h4X1NCVE1TVEFURUxPV19HX01PREVfRU5BQkxFOwogCQliY200M3h4X3BoeV9jb25uZWN0KGJjbSwgY29ubmVjdF9waHkpOwogCQliY200M3h4X2NvcmVfZW5hYmxlKGJjbSwgZmxhZ3MpOwogCQliY200M3h4X3dyaXRlMTYoYmNtLCAweDAzRTYsIDB4MDAwMCk7CkBAIC0zNjA0LDcgKzM2MDQsNyBAQAogCQl1MzIgc2J0bXN0YXRlbG93OwogCiAJCXNidG1zdGF0ZWxvdyA9IGJjbTQzeHhfcmVhZDMyKGJjbSwgQkNNNDN4eF9DSVJfU0JUTVNUQVRFTE9XKTsKLQkJc2J0bXN0YXRlbG93IHw9IDB4MjAwMDAwMDA7CisJCXNidG1zdGF0ZWxvdyB8PSBCQ000M3h4X1NCVE1TVEFURUxPV19HX01PREVfRU5BQkxFOwogCQliY200M3h4X3dyaXRlMzIoYmNtLCBCQ000M3h4X0NJUl9TQlRNU1RBVEVMT1csIHNidG1zdGF0ZWxvdyk7CiAJfQogCWVyciA9IHdpcmVsZXNzX2NvcmVfdXAoYmNtLCAxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JjbTQzeHgvYmNtNDN4eF9waHkuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JjbTQzeHgvYmNtNDN4eF9waHkuYwppbmRleCA3MjUyOWE0Li5iMzdmMWUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iY200M3h4L2JjbTQzeHhfcGh5LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYmNtNDN4eC9iY200M3h4X3BoeS5jCkBAIC0xNjgsMTYgKzE2OCwxNiBAQAogCiAJZmxhZ3MgPSBiY200M3h4X3JlYWQzMihiY20sIEJDTTQzeHhfQ0lSX1NCVE1TVEFURUhJR0gpOwogCWlmIChjb25uZWN0KSB7Ci0JCWlmICghKGZsYWdzICYgMHgwMDAxMDAwMCkpCisJCWlmICghKGZsYWdzICYgQkNNNDN4eF9TQlRNU1RBVEVISUdIX0dfUEhZX0FWQUlMKSkKIAkJCXJldHVybiAtRU5PREVWOwogCQlmbGFncyA9IGJjbTQzeHhfcmVhZDMyKGJjbSwgQkNNNDN4eF9DSVJfU0JUTVNUQVRFTE9XKTsKLQkJZmxhZ3MgfD0gKDB4ODAwIDw8IDE4KTsKKwkJZmxhZ3MgfD0gQkNNNDN4eF9TQlRNU1RBVEVMT1dfR19NT0RFX0VOQUJMRTsKIAkJYmNtNDN4eF93cml0ZTMyKGJjbSwgQkNNNDN4eF9DSVJfU0JUTVNUQVRFTE9XLCBmbGFncyk7CiAJfSBlbHNlIHsKLQkJaWYgKCEoZmxhZ3MgJiAweDAwMDIwMDAwKSkKKwkJaWYgKCEoZmxhZ3MgJiBCQ000M3h4X1NCVE1TVEFURUhJR0hfQV9QSFlfQVZBSUwpKQogCQkJcmV0dXJuIC1FTk9ERVY7CiAJCWZsYWdzID0gYmNtNDN4eF9yZWFkMzIoYmNtLCBCQ000M3h4X0NJUl9TQlRNU1RBVEVMT1cpOwotCQlmbGFncyAmPSB+KDB4ODAwIDw8IDE4KTsKKwkJZmxhZ3MgJj0gfkJDTTQzeHhfU0JUTVNUQVRFTE9XX0dfTU9ERV9FTkFCTEU7CiAJCWJjbTQzeHhfd3JpdGUzMihiY20sIEJDTTQzeHhfQ0lSX1NCVE1TVEFURUxPVywgZmxhZ3MpOwogCX0KIG91dDoKQEAgLTMwMCwxNiArMzAwLDIwIEBACiAKIAlpZiAocGh5LT5yZXYgPiAyKSB7CiAJCWJjbTQzeHhfcGh5X3dyaXRlKGJjbSwgMHgwNDIyLCAweDI4N0EpOwotCQliY200M3h4X3BoeV93cml0ZShiY20sIDB4MDQyMCwgKGJjbTQzeHhfcGh5X3JlYWQoYmNtLCAweDA0MjApICYgMHgwRkZGKSB8IDB4MzAwMCk7IAorCQliY200M3h4X3BoeV93cml0ZShiY20sIDB4MDQyMCwgKGJjbTQzeHhfcGh5X3JlYWQoYmNtLCAweDA0MjApCisJCQkJICAmIDB4MEZGRikgfCAweDMwMDApOwogCX0KIAkJCi0JYmNtNDN4eF9waHlfd3JpdGUoYmNtLCAweDA0QTgsIChiY200M3h4X3BoeV9yZWFkKGJjbSwgMHgwNEE4KSAmIDB4ODA4MCkgfCAweDc4NzQpOworCWJjbTQzeHhfcGh5X3dyaXRlKGJjbSwgMHgwNEE4LCAoYmNtNDN4eF9waHlfcmVhZChiY20sIDB4MDRBOCkgJiAweDgwODApCisJCQkJCXwgMHg3ODc0KTsKIAliY200M3h4X3BoeV93cml0ZShiY20sIDB4MDQ4RSwgMHgxQzAwKTsKIAogCWlmIChwaHktPnJldiA9PSAxKSB7Ci0JCWJjbTQzeHhfcGh5X3dyaXRlKGJjbSwgMHgwNEFCLCAoYmNtNDN4eF9waHlfcmVhZChiY20sIDB4MDRBQikgJiAweEYwRkYpIHwgMHgwNjAwKTsKKwkJYmNtNDN4eF9waHlfd3JpdGUoYmNtLCAweDA0QUIsIChiY200M3h4X3BoeV9yZWFkKGJjbSwgMHgwNEFCKQorCQkJCSAgJiAweEYwRkYpIHwgMHgwNjAwKTsKIAkJYmNtNDN4eF9waHlfd3JpdGUoYmNtLCAweDA0OEIsIDB4MDA1RSk7Ci0JCWJjbTQzeHhfcGh5X3dyaXRlKGJjbSwgMHgwNDhDLCAoYmNtNDN4eF9waHlfcmVhZChiY20sIDB4MDQ4QykgJiAweEZGMDApIHwgMHgwMDFFKTsKKwkJYmNtNDN4eF9waHlfd3JpdGUoYmNtLCAweDA0OEMsIChiY200M3h4X3BoeV9yZWFkKGJjbSwgMHgwNDhDKQorCQkJCSAgJiAweEZGMDApIHwgMHgwMDFFKTsKIAkJYmNtNDN4eF9waHlfd3JpdGUoYmNtLCAweDA0OEQsIDB4MDAwMik7CiAJfQogCkBAIC0zMzUsNyArMzM5LDggQEAKIAlpZiAocGh5LT5yZXYgPT0gMSkgewogCQliY200M3h4X3BoeV93cml0ZShiY20sIDB4MDQwNiwgMHg0RjE5KTsKIAkJYmNtNDN4eF9waHlfd3JpdGUoYmNtLCBCQ000M3h4X1BIWV9HX0NSUywKLQkJCQkgIChiY200M3h4X3BoeV9yZWFkKGJjbSwgQkNNNDN4eF9QSFlfR19DUlMpICYgMHhGQzNGKSB8IDB4MDM0MCk7CisJCQkJICAoYmNtNDN4eF9waHlfcmVhZChiY20sIEJDTTQzeHhfUEhZX0dfQ1JTKQorCQkJCSAgJiAweEZDM0YpIHwgMHgwMzQwKTsKIAkJYmNtNDN4eF9waHlfd3JpdGUoYmNtLCAweDA0MkMsIDB4MDA1QSk7CiAJCWJjbTQzeHhfcGh5X3dyaXRlKGJjbSwgMHgwNDI3LCAweDAwMUEpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iY200M3h4L2JjbTQzeHhfcGh5LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iY200M3h4L2JjbTQzeHhfcGh5LmgKaW5kZXggMWYzMjFlZi4uNzMxMTgzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYmNtNDN4eC9iY200M3h4X3BoeS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JjbTQzeHgvYmNtNDN4eF9waHkuaApAQCAtNDgsNiArNDgsMTAgQEAKIAkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwlcCiAJfSB3aGlsZSAoMCkKIAorLyogQ2FyZCB1c2VzIHRoZSBsb29wYmFjayBnYWluIHN0dWZmICovCisjZGVmaW5lIGhhc19sb29wYmFja19nYWluKHBoeSkgXAorICAgICAgICAoKChwaHkpLT5yZXYgPiAxKSB8fCAoKHBoeSktPmNvbm5lY3RlZCkpCisKIHUxNiBiY200M3h4X3BoeV9yZWFkKHN0cnVjdCBiY200M3h4X3ByaXZhdGUgKmJjbSwgdTE2IG9mZnNldCk7CiB2b2lkIGJjbTQzeHhfcGh5X3dyaXRlKHN0cnVjdCBiY200M3h4X3ByaXZhdGUgKmJjbSwgdTE2IG9mZnNldCwgdTE2IHZhbCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JjbTQzeHgvYmNtNDN4eF9yYWRpby5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYmNtNDN4eC9iY200M3h4X3JhZGlvLmMKaW5kZXggNDAyNWRkMC4uNmExMDlmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYmNtNDN4eC9iY200M3h4X3JhZGlvLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYmNtNDN4eC9iY200M3h4X3JhZGlvLmMKQEAgLTEzNDMsMTEgKzEzNDMsMTEwIEBACiAJcmV0dXJuIHJldDsKIH0KIAorI2RlZmluZSBMUEQoTCwgUCwgRCkgICAgKCgoTCkgPDwgMikgfCAoKFApIDw8IDEpIHwgKChEKSA8PCAwKSkKK3N0YXRpYyB1MTYgYmNtNDN4eF9nZXRfODEyX3ZhbHVlKHN0cnVjdCBiY200M3h4X3ByaXZhdGUgKmJjbSwgdTggbHBkKQoreworCXN0cnVjdCBiY200M3h4X3BoeWluZm8gKnBoeSA9IGJjbTQzeHhfY3VycmVudF9waHkoYmNtKTsKKwlzdHJ1Y3QgYmNtNDN4eF9yYWRpb2luZm8gKnJhZGlvID0gYmNtNDN4eF9jdXJyZW50X3JhZGlvKGJjbSk7CisJdTE2IGxvb3Bfb3IgPSAwOworCXUxNiBhZGpfbG9vcGJhY2tfZ2FpbiA9IHBoeS0+bG9vcGJhY2tfZ2FpblswXTsKKwl1OCBsb29wOworCXUxNiBleHRlcm5fbG5hX2NvbnRyb2w7CisKKwlpZiAoIXBoeS0+Y29ubmVjdGVkKQorCQlyZXR1cm4gMDsKKwlpZiAoIWhhc19sb29wYmFja19nYWluKHBoeSkpIHsKKwkJaWYgKHBoeS0+cmV2IDwgNyB8fCAhKGJjbS0+c3Byb20uYm9hcmRmbGFncworCQkgICAgJiBCQ000M3h4X0JGTF9FWFRMTkEpKSB7CisJCQlzd2l0Y2ggKGxwZCkgeworCQkJY2FzZSBMUEQoMCwgMSwgMSk6CisJCQkJcmV0dXJuIDB4MEZCMjsKKwkJCWNhc2UgTFBEKDAsIDAsIDEpOgorCQkJCXJldHVybiAweDAwQjI7CisJCQljYXNlIExQRCgxLCAwLCAxKToKKwkJCQlyZXR1cm4gMHgzMEIyOworCQkJY2FzZSBMUEQoMSwgMCwgMCk6CisJCQkJcmV0dXJuIDB4MzBCMzsKKwkJCWRlZmF1bHQ6CisJCQkJYXNzZXJ0KDApOworCQkJfQorCQl9IGVsc2UgeworCQkJc3dpdGNoIChscGQpIHsKKwkJCWNhc2UgTFBEKDAsIDEsIDEpOgorCQkJCXJldHVybiAweDhGQjI7CisJCQljYXNlIExQRCgwLCAwLCAxKToKKwkJCQlyZXR1cm4gMHg4MEIyOworCQkJY2FzZSBMUEQoMSwgMCwgMSk6CisJCQkJcmV0dXJuIDB4MjBCMjsKKwkJCWNhc2UgTFBEKDEsIDAsIDApOgorCQkJCXJldHVybiAweDIwQjM7CisJCQlkZWZhdWx0OgorCQkJCWFzc2VydCgwKTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWlmIChyYWRpby0+cmV2aXNpb24gPT0gOCkKKwkJCWFkal9sb29wYmFja19nYWluICs9IDB4MDAzRTsKKwkJZWxzZQorCQkJYWRqX2xvb3BiYWNrX2dhaW4gKz0gMHgwMDI2OworCQlpZiAoYWRqX2xvb3BiYWNrX2dhaW4gPj0gMHg0NikgeworCQkJYWRqX2xvb3BiYWNrX2dhaW4gLT0gMHg0NjsKKwkJCWV4dGVybl9sbmFfY29udHJvbCA9IDB4MzAwMDsKKwkJfSBlbHNlIGlmIChhZGpfbG9vcGJhY2tfZ2FpbiA+PSAweDNBKSB7CisJCQlhZGpfbG9vcGJhY2tfZ2FpbiAtPSAweDNBOworCQkJZXh0ZXJuX2xuYV9jb250cm9sID0gMHgyMDAwOworCQl9IGVsc2UgaWYgKGFkal9sb29wYmFja19nYWluID49IDB4MkUpIHsKKwkJCWFkal9sb29wYmFja19nYWluIC09IDB4MkU7CisJCQlleHRlcm5fbG5hX2NvbnRyb2wgPSAweDEwMDA7CisJCX0gZWxzZSB7CisJCQlhZGpfbG9vcGJhY2tfZ2FpbiAtPSAweDEwOworCQkJZXh0ZXJuX2xuYV9jb250cm9sID0gMHgwMDAwOworCQl9CisJCWZvciAobG9vcCA9IDA7IGxvb3AgPCAxNjsgbG9vcCsrKSB7CisJCQl1MTYgdG1wID0gYWRqX2xvb3BiYWNrX2dhaW4gLSA2ICogbG9vcDsKKwkJCWlmICh0bXAgPCA2KQorCQkJCWJyZWFrOworCQl9CisKKwkJbG9vcF9vciA9IChsb29wIDw8IDgpIHwgZXh0ZXJuX2xuYV9jb250cm9sOworCQlpZiAocGh5LT5yZXYgPj0gNyAmJiBiY20tPnNwcm9tLmJvYXJkZmxhZ3MKKwkJICAgICYgQkNNNDN4eF9CRkxfRVhUTE5BKSB7CisJCQlpZiAoZXh0ZXJuX2xuYV9jb250cm9sKQorCQkJCWxvb3Bfb3IgfD0gMHg4MDAwOworCQkJc3dpdGNoIChscGQpIHsKKwkJCWNhc2UgTFBEKDAsIDEsIDEpOgorCQkJCXJldHVybiAweDhGOTI7CisJCQljYXNlIExQRCgwLCAwLCAxKToKKwkJCQlyZXR1cm4gKDB4ODA5MiB8IGxvb3Bfb3IpOworCQkJY2FzZSBMUEQoMSwgMCwgMSk6CisJCQkJcmV0dXJuICgweDIwOTIgfCBsb29wX29yKTsKKwkJCWNhc2UgTFBEKDEsIDAsIDApOgorCQkJCXJldHVybiAoMHgyMDkzIHwgbG9vcF9vcik7CisJCQlkZWZhdWx0OgorCQkJCWFzc2VydCgwKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXN3aXRjaCAobHBkKSB7CisJCQljYXNlIExQRCgwLCAxLCAxKToKKwkJCQlyZXR1cm4gMHgwRjkyOworCQkJY2FzZSBMUEQoMCwgMCwgMSk6CisJCQljYXNlIExQRCgxLCAwLCAxKToKKwkJCQlyZXR1cm4gKDB4MDA5MiB8IGxvb3Bfb3IpOworCQkJY2FzZSBMUEQoMSwgMCwgMCk6CisJCQkJcmV0dXJuICgweDAwOTMgfCBsb29wX29yKTsKKwkJCWRlZmF1bHQ6CisJCQkJYXNzZXJ0KDApOworCQkJfQorCQl9CisJfQorCXJldHVybiAwOworfQorCiB1MTYgYmNtNDN4eF9yYWRpb19pbml0MjA1MChzdHJ1Y3QgYmNtNDN4eF9wcml2YXRlICpiY20pCiB7CiAJc3RydWN0IGJjbTQzeHhfcGh5aW5mbyAqcGh5ID0gYmNtNDN4eF9jdXJyZW50X3BoeShiY20pOwogCXN0cnVjdCBiY200M3h4X3JhZGlvaW5mbyAqcmFkaW8gPSBiY200M3h4X2N1cnJlbnRfcmFkaW8oYmNtKTsKLQl1MTYgYmFja3VwWzE5XSA9IHsgMCB9OworCXUxNiBiYWNrdXBbMjFdID0geyAwIH07CiAJdTE2IHJldDsKIAl1MTYgaSwgajsKIAl1MzIgdG1wMSA9IDAsIHRtcDIgPSAwOwpAQCAtMTM3MywxOSArMTQ3MiwzNiBAQAogCQkJYmFja3VwWzhdID0gYmNtNDN4eF9waHlfcmVhZChiY20sIEJDTTQzeHhfUEhZX0dfQ1JTKTsKIAkJCWJhY2t1cFs5XSA9IGJjbTQzeHhfcGh5X3JlYWQoYmNtLCAweDA4MDIpOwogCQkJYmNtNDN4eF9waHlfd3JpdGUoYmNtLCAweDA4MTQsCi0JCQkgICAgICAgICAgICAgICAgICAoYmNtNDN4eF9waHlfcmVhZChiY20sIDB4MDgxNCkgfCAweDAwMDMpKTsKKwkJCSAgICAgICAgICAgICAgICAgIChiY200M3h4X3BoeV9yZWFkKGJjbSwgMHgwODE0KQorCQkJCQkgIHwgMHgwMDAzKSk7CiAJCQliY200M3h4X3BoeV93cml0ZShiY20sIDB4MDgxNSwKLQkJCSAgICAgICAgICAgICAgICAgIChiY200M3h4X3BoeV9yZWFkKGJjbSwgMHgwODE1KSAmIDB4RkZGQykpOwkKKwkJCSAgICAgICAgICAgICAgICAgIChiY200M3h4X3BoeV9yZWFkKGJjbSwgMHgwODE1KQorCQkJCQkgICYgMHhGRkZDKSk7CiAJCQliY200M3h4X3BoeV93cml0ZShiY20sIEJDTTQzeHhfUEhZX0dfQ1JTLAotCQkJICAgICAgICAgICAgICAgICAgKGJjbTQzeHhfcGh5X3JlYWQoYmNtLCBCQ000M3h4X1BIWV9HX0NSUykgJiAweDdGRkYpKTsKKwkJCSAgICAgICAgICAgICAgICAgIChiY200M3h4X3BoeV9yZWFkKGJjbSwgQkNNNDN4eF9QSFlfR19DUlMpCisJCQkJCSAgJiAweDdGRkYpKTsKIAkJCWJjbTQzeHhfcGh5X3dyaXRlKGJjbSwgMHgwODAyLAogCQkJICAgICAgICAgICAgICAgICAgKGJjbTQzeHhfcGh5X3JlYWQoYmNtLCAweDA4MDIpICYgMHhGRkZDKSk7Ci0JCQliY200M3h4X3BoeV93cml0ZShiY20sIDB4MDgxMSwgMHgwMUIzKTsKLQkJCWJjbTQzeHhfcGh5X3dyaXRlKGJjbSwgMHgwODEyLCAweDBGQjIpOworCQkJaWYgKHBoeS0+cmV2ID4gMSkgeyAvKiBsb29wYmFjayBnYWluIGVuYWJsZWQgKi8KKwkJCQliYWNrdXBbMTldID0gYmNtNDN4eF9waHlfcmVhZChiY20sIDB4MDgwRik7CisJCQkJYmFja3VwWzIwXSA9IGJjbTQzeHhfcGh5X3JlYWQoYmNtLCAweDA4MTApOworCQkJCWlmIChwaHktPnJldiA+PSAzKQorCQkJCQliY200M3h4X3BoeV93cml0ZShiY20sIDB4MDgwRiwgMHhDMDIwKTsKKwkJCQllbHNlCisJCQkJCWJjbTQzeHhfcGh5X3dyaXRlKGJjbSwgMHgwODBGLCAweDgwMjApOworCQkJCWJjbTQzeHhfcGh5X3dyaXRlKGJjbSwgMHgwODEwLCAweDAwMDApOworCQkJfQorCQkJYmNtNDN4eF9waHlfd3JpdGUoYmNtLCAweDA4MTIsCisJCQkJCSAgYmNtNDN4eF9nZXRfODEyX3ZhbHVlKGJjbSwgTFBEKDAsIDEsIDEpKSk7CisJCQlpZiAocGh5LT5yZXYgPCA3IHx8ICEoYmNtLT5zcHJvbS5ib2FyZGZsYWdzCisJCQkgICAgJiBCQ000M3h4X0JGTF9FWFRMTkEpKQorCQkJCWJjbTQzeHhfcGh5X3dyaXRlKGJjbSwgMHgwODExLCAweDAxQjMpOworCQkJZWxzZQorCQkJCWJjbTQzeHhfcGh5X3dyaXRlKGJjbSwgMHgwODExLCAweDA5QjMpOwogCQl9Ci0JCWJjbTQzeHhfd3JpdGUxNihiY20sIEJDTTQzeHhfTU1JT19QSFlfUkFESU8sCi0JCSAgICAgICAgICAgICAgICAoYmNtNDN4eF9yZWFkMTYoYmNtLCBCQ000M3h4X01NSU9fUEhZX1JBRElPKSB8IDB4ODAwMCkpOwogCX0KKwliY200M3h4X3dyaXRlMTYoYmNtLCBCQ000M3h4X01NSU9fUEhZX1JBRElPLAorCSAgICAgICAgICAgICAgICAoYmNtNDN4eF9yZWFkMTYoYmNtLCBCQ000M3h4X01NSU9fUEhZX1JBRElPKSB8IDB4ODAwMCkpOwogCWJhY2t1cFsxMF0gPSBiY200M3h4X3BoeV9yZWFkKGJjbSwgMHgwMDM1KTsKIAliY200M3h4X3BoeV93cml0ZShiY20sIDB4MDAzNSwKIAkgICAgICAgICAgICAgICAgICAoYmNtNDN4eF9waHlfcmVhZChiY20sIDB4MDAzNSkgJiAweEZGN0YpKTsKQEAgLTEzOTcsMTAgKzE1MTMsMTIgQEAKIAkJYmNtNDN4eF93cml0ZTE2KGJjbSwgMHgwM0U2LCAweDAxMjIpOwogCX0gZWxzZSB7CiAJCWlmIChwaHktPmFuYWxvZyA+PSAyKQotCQkJYmNtNDN4eF9waHlfd3JpdGUoYmNtLCAweDAwMDMsIChiY200M3h4X3BoeV9yZWFkKGJjbSwgMHgwMDAzKQotCQkJCQkmIDB4RkZCRikgfCAweDAwNDApOworCQkJYmNtNDN4eF9waHlfd3JpdGUoYmNtLCAweDAwMDMsCisJCQkJCSAgKGJjbTQzeHhfcGh5X3JlYWQoYmNtLCAweDAwMDMpCisJCQkJCSAgJiAweEZGQkYpIHwgMHgwMDQwKTsKIAkJYmNtNDN4eF93cml0ZTE2KGJjbSwgQkNNNDN4eF9NTUlPX0NIQU5ORUxfRVhULAotCQkgICAgICAgICAgICAgICAgKGJjbTQzeHhfcmVhZDE2KGJjbSwgQkNNNDN4eF9NTUlPX0NIQU5ORUxfRVhUKSB8IDB4MjAwMCkpOworCQkgICAgICAgICAgICAgICAgKGJjbTQzeHhfcmVhZDE2KGJjbSwgQkNNNDN4eF9NTUlPX0NIQU5ORUxfRVhUKQorCQkJCXwgMHgyMDAwKSk7CiAJfQogCiAJcmV0ID0gYmNtNDN4eF9yYWRpb19jYWxpYnJhdGlvbnZhbHVlKGJjbSk7CkBAIC0xNDA4LDE2ICsxNTI2LDI1IEBACiAJaWYgKHBoeS0+dHlwZSA9PSBCQ000M3h4X1BIWVRZUEVfQikKIAkJYmNtNDN4eF9yYWRpb193cml0ZTE2KGJjbSwgMHgwMDc4LCAweDAwMjYpOwogCisJaWYgKHBoeS0+Y29ubmVjdGVkKQorCQliY200M3h4X3BoeV93cml0ZShiY20sIDB4MDgxMiwKKwkJCQkgIGJjbTQzeHhfZ2V0XzgxMl92YWx1ZShiY20sIExQRCgwLCAxLCAxKSkpOwogCWJjbTQzeHhfcGh5X3dyaXRlKGJjbSwgMHgwMDE1LCAweEJGQUYpOwogCWJjbTQzeHhfcGh5X3dyaXRlKGJjbSwgMHgwMDJCLCAweDE0MDMpOwogCWlmIChwaHktPmNvbm5lY3RlZCkKLQkJYmNtNDN4eF9waHlfd3JpdGUoYmNtLCAweDA4MTIsIDB4MDBCMik7CisJCWJjbTQzeHhfcGh5X3dyaXRlKGJjbSwgMHgwODEyLAorCQkJCSAgYmNtNDN4eF9nZXRfODEyX3ZhbHVlKGJjbSwgTFBEKDAsIDAsIDEpKSk7CiAJYmNtNDN4eF9waHlfd3JpdGUoYmNtLCAweDAwMTUsIDB4QkZBMCk7CiAJYmNtNDN4eF9yYWRpb193cml0ZTE2KGJjbSwgMHgwMDUxLAogCSAgICAgICAgICAgICAgICAgICAgICAoYmNtNDN4eF9yYWRpb19yZWFkMTYoYmNtLCAweDAwNTEpIHwgMHgwMDA0KSk7Ci0JYmNtNDN4eF9yYWRpb193cml0ZTE2KGJjbSwgMHgwMDUyLCAweDAwMDApOwotCWJjbTQzeHhfcmFkaW9fd3JpdGUxNihiY20sIDB4MDA0MywKLQkJCSAgICAgIChiY200M3h4X3JhZGlvX3JlYWQxNihiY20sIDB4MDA0MykgJiAweEZGRjApIHwgMHgwMDA5KTsKKwlpZiAocmFkaW8tPnJldmlzaW9uID09IDgpCisJCWJjbTQzeHhfcmFkaW9fd3JpdGUxNihiY20sIDB4MDA0MywgMHgwMDFGKTsKKwllbHNlIHsKKwkJYmNtNDN4eF9yYWRpb193cml0ZTE2KGJjbSwgMHgwMDUyLCAweDAwMDApOworCQliY200M3h4X3JhZGlvX3dyaXRlMTYoYmNtLCAweDAwNDMsCisJCQkJICAgICAgKGJjbTQzeHhfcmFkaW9fcmVhZDE2KGJjbSwgMHgwMDQzKSAmIDB4RkZGMCkKKwkJCQkgICAgICB8IDB4MDAwOSk7CisJfQogCWJjbTQzeHhfcGh5X3dyaXRlKGJjbSwgMHgwMDU4LCAweDAwMDApOwogCiAJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKQEAgLTE0MjUsMjEgKzE1NTIsMjUgQEAKIAkJYmNtNDN4eF9waHlfd3JpdGUoYmNtLCAweDAwNTksIDB4QzgxMCk7CiAJCWJjbTQzeHhfcGh5X3dyaXRlKGJjbSwgMHgwMDU4LCAweDAwMEQpOwogCQlpZiAocGh5LT5jb25uZWN0ZWQpCi0JCQliY200M3h4X3BoeV93cml0ZShiY20sIDB4MDgxMiwgMHgzMEIyKTsKKwkJCWJjbTQzeHhfcGh5X3dyaXRlKGJjbSwgMHgwODEyLAorCQkJCQkgIGJjbTQzeHhfZ2V0XzgxMl92YWx1ZShiY20sIExQRCgxLCAwLCAxKSkpOwogCQliY200M3h4X3BoeV93cml0ZShiY20sIDB4MDAxNSwgMHhBRkIwKTsKIAkJdWRlbGF5KDEwKTsKIAkJaWYgKHBoeS0+Y29ubmVjdGVkKQotCQkJYmNtNDN4eF9waHlfd3JpdGUoYmNtLCAweDA4MTIsIDB4MzBCMik7CisJCQliY200M3h4X3BoeV93cml0ZShiY20sIDB4MDgxMiwKKwkJCQkJICBiY200M3h4X2dldF84MTJfdmFsdWUoYmNtLCBMUEQoMSwgMCwgMSkpKTsKIAkJYmNtNDN4eF9waHlfd3JpdGUoYmNtLCAweDAwMTUsIDB4RUZCMCk7CiAJCXVkZWxheSgxMCk7CiAJCWlmIChwaHktPmNvbm5lY3RlZCkKLQkJCWJjbTQzeHhfcGh5X3dyaXRlKGJjbSwgMHgwODEyLCAweDMwQjIpOworCQkJYmNtNDN4eF9waHlfd3JpdGUoYmNtLCAweDA4MTIsCisJCQkJCSAgYmNtNDN4eF9nZXRfODEyX3ZhbHVlKGJjbSwgTFBEKDEsIDAsIDApKSk7CiAJCWJjbTQzeHhfcGh5X3dyaXRlKGJjbSwgMHgwMDE1LCAweEZGRjApOwotCQl1ZGVsYXkoMTApOworCQl1ZGVsYXkoMjApOwogCQl0bXAxICs9IGJjbTQzeHhfcGh5X3JlYWQoYmNtLCAweDAwMkQpOwogCQliY200M3h4X3BoeV93cml0ZShiY20sIDB4MDA1OCwgMHgwMDAwKTsKIAkJaWYgKHBoeS0+Y29ubmVjdGVkKQotCQkJYmNtNDN4eF9waHlfd3JpdGUoYmNtLCAweDA4MTIsIDB4MzBCMik7CisJCQliY200M3h4X3BoeV93cml0ZShiY20sIDB4MDgxMiwKKwkJCQkJICBiY200M3h4X2dldF84MTJfdmFsdWUoYmNtLCBMUEQoMSwgMCwgMSkpKTsKIAkJYmNtNDN4eF9waHlfd3JpdGUoYmNtLCAweDAwMTUsIDB4QUZCMCk7CiAJfQogCkBAIC0xNDU3LDIxICsxNTg4LDI5IEBACiAJCQliY200M3h4X3BoeV93cml0ZShiY20sIDB4MDA1OSwgMHhDODEwKTsKIAkJCWJjbTQzeHhfcGh5X3dyaXRlKGJjbSwgMHgwMDU4LCAweDAwMEQpOwogCQkJaWYgKHBoeS0+Y29ubmVjdGVkKQotCQkJCWJjbTQzeHhfcGh5X3dyaXRlKGJjbSwgMHgwODEyLCAweDMwQjIpOworCQkJCWJjbTQzeHhfcGh5X3dyaXRlKGJjbSwgMHgwODEyLAorCQkJCQkJICBiY200M3h4X2dldF84MTJfdmFsdWUoYmNtLAorCQkJCQkJICBMUEQoMSwgMCwgMSkpKTsKIAkJCWJjbTQzeHhfcGh5X3dyaXRlKGJjbSwgMHgwMDE1LCAweEFGQjApOwogCQkJdWRlbGF5KDEwKTsKIAkJCWlmIChwaHktPmNvbm5lY3RlZCkKLQkJCQliY200M3h4X3BoeV93cml0ZShiY20sIDB4MDgxMiwgMHgzMEIyKTsKKwkJCQliY200M3h4X3BoeV93cml0ZShiY20sIDB4MDgxMiwKKwkJCQkJCSAgYmNtNDN4eF9nZXRfODEyX3ZhbHVlKGJjbSwKKwkJCQkJCSAgTFBEKDEsIDAsIDEpKSk7CiAJCQliY200M3h4X3BoeV93cml0ZShiY20sIDB4MDAxNSwgMHhFRkIwKTsKIAkJCXVkZWxheSgxMCk7CiAJCQlpZiAocGh5LT5jb25uZWN0ZWQpCi0JCQkJYmNtNDN4eF9waHlfd3JpdGUoYmNtLCAweDA4MTIsIDB4MzBCMyk7IC8qIDB4MzBCMyBpcyBub3QgYSB0eXBvICovCisJCQkJYmNtNDN4eF9waHlfd3JpdGUoYmNtLCAweDA4MTIsCisJCQkJCQkgIGJjbTQzeHhfZ2V0XzgxMl92YWx1ZShiY20sCisJCQkJCQkgIExQRCgxLCAwLCAwKSkpOwogCQkJYmNtNDN4eF9waHlfd3JpdGUoYmNtLCAweDAwMTUsIDB4RkZGMCk7CiAJCQl1ZGVsYXkoMTApOwogCQkJdG1wMiArPSBiY200M3h4X3BoeV9yZWFkKGJjbSwgMHgwMDJEKTsKIAkJCWJjbTQzeHhfcGh5X3dyaXRlKGJjbSwgMHgwMDU4LCAweDAwMDApOwogCQkJaWYgKHBoeS0+Y29ubmVjdGVkKQotCQkJCWJjbTQzeHhfcGh5X3dyaXRlKGJjbSwgMHgwODEyLCAweDMwQjIpOworCQkJCWJjbTQzeHhfcGh5X3dyaXRlKGJjbSwgMHgwODEyLAorCQkJCQkJICBiY200M3h4X2dldF84MTJfdmFsdWUoYmNtLAorCQkJCQkJICBMUEQoMSwgMCwgMSkpKTsKIAkJCWJjbTQzeHhfcGh5X3dyaXRlKGJjbSwgMHgwMDE1LCAweEFGQjApOwogCQl9CiAJCXRtcDIrKzsKQEAgLTE0OTcsMTUgKzE2MzYsMjAgQEAKIAkJYmNtNDN4eF9waHlfd3JpdGUoYmNtLCAweDAwMzAsIGJhY2t1cFsyXSk7CiAJCWJjbTQzeHhfd3JpdGUxNihiY20sIDB4MDNFQywgYmFja3VwWzNdKTsKIAl9IGVsc2UgewotCQliY200M3h4X3dyaXRlMTYoYmNtLCBCQ000M3h4X01NSU9fUEhZX1JBRElPLAotCQkJCShiY200M3h4X3JlYWQxNihiY20sIEJDTTQzeHhfTU1JT19QSFlfUkFESU8pICYgMHg3RkZGKSk7CiAJCWlmIChwaHktPmNvbm5lY3RlZCkgeworCQkJYmNtNDN4eF93cml0ZTE2KGJjbSwgQkNNNDN4eF9NTUlPX1BIWV9SQURJTywKKwkJCQkJKGJjbTQzeHhfcmVhZDE2KGJjbSwKKwkJCQkJQkNNNDN4eF9NTUlPX1BIWV9SQURJTykgJiAweDdGRkYpKTsKIAkJCWJjbTQzeHhfcGh5X3dyaXRlKGJjbSwgMHgwODExLCBiYWNrdXBbNF0pOwogCQkJYmNtNDN4eF9waHlfd3JpdGUoYmNtLCAweDA4MTIsIGJhY2t1cFs1XSk7CiAJCQliY200M3h4X3BoeV93cml0ZShiY20sIDB4MDgxNCwgYmFja3VwWzZdKTsKIAkJCWJjbTQzeHhfcGh5X3dyaXRlKGJjbSwgMHgwODE1LCBiYWNrdXBbN10pOwogCQkJYmNtNDN4eF9waHlfd3JpdGUoYmNtLCBCQ000M3h4X1BIWV9HX0NSUywgYmFja3VwWzhdKTsKIAkJCWJjbTQzeHhfcGh5X3dyaXRlKGJjbSwgMHgwODAyLCBiYWNrdXBbOV0pOworCQkJaWYgKHBoeS0+cmV2ID4gMSkgeworCQkJCWJjbTQzeHhfcGh5X3dyaXRlKGJjbSwgMHgwODBGLCBiYWNrdXBbMTldKTsKKwkJCQliY200M3h4X3BoeV93cml0ZShiY20sIDB4MDgxMCwgYmFja3VwWzIwXSk7CisJCQl9CiAJCX0KIAl9CiAJaWYgKGkgPj0gMTUpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9LY29uZmlnCmluZGV4IDMwOGY3NzMuLjFmZWYzMzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9LY29uZmlnCkBAIC0xLDYgKzEsNyBAQAogY29uZmlnIEhPU1RBUAogCXRyaXN0YXRlICJJRUVFIDgwMi4xMSBmb3IgSG9zdCBBUCAoUHJpc20yLzIuNS8zIGFuZCBXRVAvVEtJUC9DQ01QKSIKLQlkZXBlbmRzIG9uIE5FVF9SQURJTworCWRlcGVuZHMgb24gV0xBTl84MDIxMQorCXNlbGVjdCBXSVJFTEVTU19FWFQKIAlzZWxlY3QgSUVFRTgwMjExCiAJc2VsZWN0IElFRUU4MDIxMV9DUllQVF9XRVAKIAktLS1oZWxwLS0tCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwXzgwMjExX3J4LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwXzgwMjExX3J4LmMKaW5kZXggN2UwNGRjOS4uY2JlZGM5ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF84MDIxMV9yeC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfODAyMTFfcnguYwpAQCAtMTY3LDcgKzE2Nyw3IEBACiAKIAlyZXQgPSBza2ItPmxlbiAtIHBoZHJsZW47CiAJc2tiLT5kZXYgPSBkZXY7Ci0Jc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOworCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CiAJc2tiX3B1bGwoc2tiLCBoZHJsZW4pOwogCWlmIChwcmlzbV9oZWFkZXIpCiAJCXNrYl9wdWxsKHNrYiwgcGhkcmxlbik7CkBAIC05MzMsMTIgKzkzMywxNCBAQAogCQlpZiAoZnJhZyA9PSAwKSB7CiAJCQkvKiBjb3B5IGZpcnN0IGZyYWdtZW50IChpbmNsdWRpbmcgZnVsbCBoZWFkZXJzKSBpbnRvCiAJCQkgKiBiZWdpbm5pbmcgb2YgdGhlIGZyYWdtZW50IGNhY2hlIHNrYiAqLwotCQkJbWVtY3B5KHNrYl9wdXQoZnJhZ19za2IsIGZsZW4pLCBza2ItPmRhdGEsIGZsZW4pOworCQkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIHNrYl9wdXQoZnJhZ19za2IsIGZsZW4pLAorCQkJCQkJICBmbGVuKTsKIAkJfSBlbHNlIHsKIAkJCS8qIGFwcGVuZCBmcmFtZSBwYXlsb2FkIHRvIHRoZSBlbmQgb2YgdGhlIGZyYWdtZW50CiAJCQkgKiBjYWNoZSBza2IgKi8KLQkJCW1lbWNweShza2JfcHV0KGZyYWdfc2tiLCBmbGVuKSwgc2tiLT5kYXRhICsgaGRybGVuLAotCQkJICAgICAgIGZsZW4pOworCQkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YV9vZmZzZXQoc2tiLCBoZHJsZW4sCisJCQkJCQkJIHNrYl9wdXQoZnJhZ19za2IsCisJCQkJCQkJCSBmbGVuKSwgZmxlbik7CiAJCX0KIAkJZGV2X2tmcmVlX3NrYihza2IpOwogCQlza2IgPSBOVUxMOwpAQCAtMTA0NCw4ICsxMDQ2LDkgQEAKIAkgICAgc2tiLT5sZW4gPj0gRVRIX0hMRU4gKyBFVEhfQUxFTikgewogCQkvKiBOb24tc3RhbmRhcmQgZnJhbWU6IGdldCBhZGRyNCBmcm9tIGl0cyBib2d1cyBsb2NhdGlvbiBhZnRlcgogCQkgKiB0aGUgcGF5bG9hZCAqLwotCQltZW1jcHkoc2tiLT5kYXRhICsgRVRIX0FMRU4sCi0JCSAgICAgICBza2ItPmRhdGEgKyBza2ItPmxlbiAtIEVUSF9BTEVOLCBFVEhfQUxFTik7CisJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGFfb2Zmc2V0KHNrYiwgc2tiLT5sZW4gLSBFVEhfQUxFTiwKKwkJCQkJCSBza2ItPmRhdGEgKyBFVEhfQUxFTiwKKwkJCQkJCSBFVEhfQUxFTik7CiAJCXNrYl90cmltKHNrYiwgc2tiLT5sZW4gLSBFVEhfQUxFTik7CiAJfQogCkBAIC0xMDczLDE3ICsxMDc2LDE3IEBACiAKIAlpZiAoc2tiMiAhPSBOVUxMKSB7CiAJCS8qIHNlbmQgdG8gd2lyZWxlc3MgbWVkaWEgKi8KLQkJc2tiMi0+cHJvdG9jb2wgPSBfX2NvbnN0YW50X2h0b25zKEVUSF9QXzgwMl8zKTsKLQkJc2tiMi0+bWFjLnJhdyA9IHNrYjItPm5oLnJhdyA9IHNrYjItPmRhdGE7Ci0JCS8qIHNrYjItPm5oLnJhdyA9IHNrYjItPmRhdGEgKyBFVEhfSExFTjsgKi8KIAkJc2tiMi0+ZGV2ID0gZGV2OworCQlza2IyLT5wcm90b2NvbCA9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfODAyXzMpOworCQlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IyKTsKKwkJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYjIpOworCQkvKiBza2IyLT5uZXR3b3JrX2hlYWRlciArPSBFVEhfSExFTjsgKi8KIAkJZGV2X3F1ZXVlX3htaXQoc2tiMik7CiAJfQogCiAJaWYgKHNrYikgewogCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOwogCQltZW1zZXQoc2tiLT5jYiwgMCwgc2l6ZW9mKHNrYi0+Y2IpKTsKLQkJc2tiLT5kZXYgPSBkZXY7CiAJCW5ldGlmX3J4KHNrYik7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwXzgwMjExX3R4LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwXzgwMjExX3R4LmMKaW5kZXggNGE1YmU3MC4uMjQ2ZmFjMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF84MDIxMV90eC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfODAyMTFfdHguYwpAQCAtMTQ2LDcgKzE0Niw4IEBACiAJCQlmYyB8PSBJRUVFODAyMTFfRkNUTF9GUk9NRFMgfCBJRUVFODAyMTFfRkNUTF9UT0RTOwogCQkJLyogRnJvbSZUbyBEUzogQWRkcjEgPSBSQSwgQWRkcjIgPSBUQSwgQWRkcjMgPSBEQSwKIAkJCSAqIEFkZHI0ID0gU0EgKi8KLQkJCW1lbWNweSgmaGRyLmFkZHI0LCBza2ItPmRhdGEgKyBFVEhfQUxFTiwgRVRIX0FMRU4pOworCQkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YV9vZmZzZXQoc2tiLCBFVEhfQUxFTiwKKwkJCQkJCQkgJmhkci5hZGRyNCwgRVRIX0FMRU4pOwogCQkJaGRyX2xlbiArPSBFVEhfQUxFTjsKIAkJfSBlbHNlIHsKIAkJCS8qIGJvZ3VzIDQtYWRkciBmb3JtYXQgdG8gd29ya2Fyb3VuZCBQcmlzbTIgc3RhdGlvbgpAQCAtMTU5LDcgKzE2MCw4IEBACiAJCQkvKiBTQSBmcm9tIHNrYi0+ZGF0YSArIEVUSF9BTEVOIHdpbGwgYmUgYWRkZWQgYWZ0ZXIKIAkJCSAqIGZyYW1lIHBheWxvYWQ7IHVzZSBoZHIuYWRkcjQgYXMgYSB0ZW1wb3JhcnkgYnVmZmVyCiAJCQkgKi8KLQkJCW1lbWNweSgmaGRyLmFkZHI0LCBza2ItPmRhdGEgKyBFVEhfQUxFTiwgRVRIX0FMRU4pOworCQkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YV9vZmZzZXQoc2tiLCBFVEhfQUxFTiwKKwkJCQkJCQkgJmhkci5hZGRyNCwgRVRIX0FMRU4pOwogCQkJbmVlZF90YWlscm9vbSArPSBFVEhfQUxFTjsKIAkJfQogCkBAIC0xNzQsMjQgKzE3NiwyNyBAQAogCQllbHNlCiAJCQltZW1jcHkoJmhkci5hZGRyMSwgbG9jYWwtPmJzc2lkLCBFVEhfQUxFTik7CiAJCW1lbWNweSgmaGRyLmFkZHIyLCBkZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7Ci0JCW1lbWNweSgmaGRyLmFkZHIzLCBza2ItPmRhdGEsIEVUSF9BTEVOKTsKKwkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsICZoZHIuYWRkcjMsIEVUSF9BTEVOKTsKIAl9IGVsc2UgaWYgKGxvY2FsLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSICYmICF0b19hc3NvY19hcCkgewogCQlmYyB8PSBJRUVFODAyMTFfRkNUTF9GUk9NRFM7CiAJCS8qIEZyb20gRFM6IEFkZHIxID0gREEsIEFkZHIyID0gQlNTSUQsIEFkZHIzID0gU0EgKi8KLQkJbWVtY3B5KCZoZHIuYWRkcjEsIHNrYi0+ZGF0YSwgRVRIX0FMRU4pOworCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgJmhkci5hZGRyMSwgRVRIX0FMRU4pOwogCQltZW1jcHkoJmhkci5hZGRyMiwgZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOwotCQltZW1jcHkoJmhkci5hZGRyMywgc2tiLT5kYXRhICsgRVRIX0FMRU4sIEVUSF9BTEVOKTsKKwkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YV9vZmZzZXQoc2tiLCBFVEhfQUxFTiwgJmhkci5hZGRyMywKKwkJCQkJCSBFVEhfQUxFTik7CiAJfSBlbHNlIGlmIChsb2NhbC0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBIHx8IHRvX2Fzc29jX2FwKSB7CiAJCWZjIHw9IElFRUU4MDIxMV9GQ1RMX1RPRFM7CiAJCS8qIFRvIERTOiBBZGRyMSA9IEJTU0lELCBBZGRyMiA9IFNBLCBBZGRyMyA9IERBICovCiAJCW1lbWNweSgmaGRyLmFkZHIxLCB0b19hc3NvY19hcCA/CiAJCSAgICAgICBsb2NhbC0+YXNzb2NfYXBfYWRkciA6IGxvY2FsLT5ic3NpZCwgRVRIX0FMRU4pOwotCQltZW1jcHkoJmhkci5hZGRyMiwgc2tiLT5kYXRhICsgRVRIX0FMRU4sIEVUSF9BTEVOKTsKLQkJbWVtY3B5KCZoZHIuYWRkcjMsIHNrYi0+ZGF0YSwgRVRIX0FMRU4pOworCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhX29mZnNldChza2IsIEVUSF9BTEVOLCAmaGRyLmFkZHIyLAorCQkJCQkJIEVUSF9BTEVOKTsKKwkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsICZoZHIuYWRkcjMsIEVUSF9BTEVOKTsKIAl9IGVsc2UgaWYgKGxvY2FsLT5pd19tb2RlID09IElXX01PREVfQURIT0MpIHsKIAkJLyogbm90IEZyb20vVG8gRFM6IEFkZHIxID0gREEsIEFkZHIyID0gU0EsIEFkZHIzID0gQlNTSUQgKi8KLQkJbWVtY3B5KCZoZHIuYWRkcjEsIHNrYi0+ZGF0YSwgRVRIX0FMRU4pOwotCQltZW1jcHkoJmhkci5hZGRyMiwgc2tiLT5kYXRhICsgRVRIX0FMRU4sIEVUSF9BTEVOKTsKKwkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsICZoZHIuYWRkcjEsIEVUSF9BTEVOKTsKKwkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YV9vZmZzZXQoc2tiLCBFVEhfQUxFTiwgJmhkci5hZGRyMiwKKwkJCQkJCSBFVEhfQUxFTik7CiAJCW1lbWNweSgmaGRyLmFkZHIzLCBsb2NhbC0+YnNzaWQsIEVUSF9BTEVOKTsKIAl9CiAKQEAgLTIzNyw3ICsyNDIsNyBAQAogCWlmYWNlLT5zdGF0cy50eF9wYWNrZXRzKys7CiAJaWZhY2UtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOwogCi0Jc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOworCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CiAJbWV0YSA9IChzdHJ1Y3QgaG9zdGFwX3NrYl90eF9kYXRhICopIHNrYi0+Y2I7CiAJbWVtc2V0KG1ldGEsIDAsIHNpemVvZigqbWV0YSkpOwogCW1ldGEtPm1hZ2ljID0gSE9TVEFQX1NLQl9UWF9EQVRBX01BR0lDOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9hcC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9hcC5jCmluZGV4IGVmYjhjZjMuLjViM2FiZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfYXAuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX2FwLmMKQEAgLTEsOCArMSw4IEBACiAvKgogICogSW50ZXJzaWwgUHJpc20yIGRyaXZlciB3aXRoIEhvc3QgQVAgKHNvZnR3YXJlIGFjY2VzcyBwb2ludCkgc3VwcG9ydAogICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDIsIFNTSCBDb21tdW5pY2F0aW9ucyBTZWN1cml0eSBDb3JwIGFuZCBKb3VuaSBNYWxpbmVuCi0gKiA8amttYWxpbmVAY2MuaHV0LmZpPgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUsIEpvdW5pIE1hbGluZW4gPGprbWFsaW5lQGNjLmh1dC5maT4KKyAqIDxqQHcxLmZpPgorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUsIEpvdW5pIE1hbGluZW4gPGpAdzEuZmk+CiAgKgogICogVGhpcyBmaWxlIGlzIHRvIGJlIGluY2x1ZGVkIGludG8gaG9zdGFwLmMgd2hlbiBTL1cgQVAgZnVuY3Rpb25hbGl0eSBpcwogICogY29tcGlsZWQuCkBAIC05ODIsNyArOTgyLDggQEAKIAltZXRhLT50eF9jYl9pZHggPSB0eF9jYl9pZHg7CiAKIAlza2ItPmRldiA9IGRldjsKLQlza2ItPm1hYy5yYXcgPSBza2ItPm5oLnJhdyA9IHNrYi0+ZGF0YTsKKwlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOworCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOwogCWRldl9xdWV1ZV94bWl0KHNrYik7CiB9CiAjZW5kaWYgLyogUFJJU00yX05PX0tFUk5FTF9JRUVFODAyMTFfTUdNVCAqLwpAQCAtMTI3Niw4ICsxMjc3LDggQEAKIAkJcmV0dXJuIE5VTEw7CiAJfQogCi0JbWVtY3B5KHRtcGJ1Ziwgc2tiLT5kYXRhICsgYXAtPmNyeXB0LT5leHRyYV9tcGR1X3ByZWZpeF9sZW4sCi0JICAgICAgIFdMQU5fQVVUSF9DSEFMTEVOR0VfTEVOKTsKKwlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhX29mZnNldChza2IsIGFwLT5jcnlwdC0+ZXh0cmFfbXBkdV9wcmVmaXhfbGVuLAorCQkJCQkgdG1wYnVmLCBXTEFOX0FVVEhfQ0hBTExFTkdFX0xFTik7CiAJZGV2X2tmcmVlX3NrYihza2IpOwogCiAJcmV0dXJuIHRtcGJ1ZjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfY29tbW9uLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX2NvbW1vbi5oCmluZGV4IDAxNjI0MDAuLmIzMWU2YTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfY29tbW9uLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9jb21tb24uaApAQCAtMzY4LDkgKzM2OCw5IEBACiAKICNkZWZpbmUgUFJJU00yX0hPU1RBUERfTUFYX0JVRl9TSVpFIDEwMjQKICNkZWZpbmUgUFJJU00yX0hPU1RBUERfUklEX0hEUl9MRU4gXAotKChpbnQpICgmKChzdHJ1Y3QgcHJpc20yX2hvc3RhcGRfcGFyYW0gKikgMCktPnUucmlkLmRhdGEpKQorb2Zmc2V0b2Yoc3RydWN0IHByaXNtMl9ob3N0YXBkX3BhcmFtLCB1LnJpZC5kYXRhKQogI2RlZmluZSBQUklTTTJfSE9TVEFQRF9HRU5FUklDX0VMRU1FTlRfSERSX0xFTiBcCi0oKGludCkgKCYoKHN0cnVjdCBwcmlzbTJfaG9zdGFwZF9wYXJhbSAqKSAwKS0+dS5nZW5lcmljX2VsZW0uZGF0YSkpCitvZmZzZXRvZihzdHJ1Y3QgcHJpc20yX2hvc3RhcGRfcGFyYW0sIHUuZ2VuZXJpY19lbGVtLmRhdGEpCiAKIC8qIE1heGltdW0gbGVuZ3RoIGZvciBhbGdvcml0aG0gbmFtZXMgKC0xIGZvciBudWwgdGVybWluYXRpb24pIHVzZWQgaW4gaW9jdGwoKQogICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX2NzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX2NzLmMKaW5kZXggOGQ4ZjRiOS4uZWUxNTMyYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9jcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfY3MuYwpAQCAtMjIsNyArMjIsNyBAQAogI2luY2x1ZGUgImhvc3RhcF93bGFuLmgiCiAKIAotc3RhdGljIGNoYXIgKnZlcnNpb24gPSBQUklTTTJfVkVSU0lPTiAiIChKb3VuaSBNYWxpbmVuIDxqa21hbGluZUBjYy5odXQuZmk+KSI7CitzdGF0aWMgY2hhciAqdmVyc2lvbiA9IFBSSVNNMl9WRVJTSU9OICIgKEpvdW5pIE1hbGluZW4gPGpAdzEuZmk+KSI7CiBzdGF0aWMgZGV2X2luZm9fdCBkZXZfaW5mbyA9ICJob3N0YXBfY3MiOwogCiBNT0RVTEVfQVVUSE9SKCJKb3VuaSBNYWxpbmVuIik7CkBAIC04MzgsNiArODM4LDggQEAKIAlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweGQ2MDEsIDB4MDAwNSksCiAJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHhkNjAxLCAweDAwMTApLAogCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDEyNiwgMHgwMDAyKSwKKwlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRF9QUk9EX0lEMSgweGQ2MDEsIDB4MDAwNSwgIkFETElOSyAzNDUgQ0YiLAorCQkJCQkgMHgyZDg1ODEwNCksCiAJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkRfUFJPRF9JRDEoMHgwMTU2LCAweDAwMDIsICJJTlRFUlNJTCIsCiAJCQkJCSAweDc0YzVlNDBkKSwKIAlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRF9QUk9EX0lEMSgweDAxNTYsIDB4MDAwMiwgIkludGVyc2lsIiwKQEAgLTg0OCw2ICs4NTAsMTEgQEAKIAkJIkludGVyc2lsIiwgIlBSSVNNIDJfNSBQQ01DSUEgQURBUFRFUiIsCSJJU0wzNzMwMFAiLAogCQkiRXZhbC1SZXZBIiwKIAkJMHg0YjgwMWExNywgMHg2MzQ1YTBiZiwgMHhjOTA0OWEzOSwgMHhjMjNhZGMwZSksCisJLyogRC1MaW5rIERXTC02NTAgUmV2LiBQMTsgbWFuZmlkIDB4MDAwYiwgMHg3MTEwICovCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIzNCgKKwkJIkQtTGluayIsICJEV0wtNjUwIFdpcmVsZXNzIFBDIENhcmQgUmV2UCIsICJJU0wzNzEwMVAtMTAiLAorCQkiQTMiLAorCQkweDFhNDI0YTFjLCAweDZlYTU3NjMyLCAweGRkOTdhMjZiLCAweDU2YjIxZjUyKSwKIAlQQ01DSUFfREVWSUNFX1BST0RfSUQxMjMoCiAJCSJBZGR0cm9uIiwgIkFXUC0xMDAgV2lyZWxlc3MgUENNQ0lBIiwgIlZlcnNpb24gMDEuMDIiLAogCQkweGU2ZWM1MmNlLCAweDA4NjQ5YWYyLCAweDRiNzRiYWEwKSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfaHcuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfaHcuYwppbmRleCAzMDc5Mzc4Li45NTk4ODdiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX2h3LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9ody5jCkBAIC0zLDggKzMsOCBAQAogICogSW50ZXJzaWwgUHJpc20yLzIuNS8zLgogICoKICAqIENvcHlyaWdodCAoYykgMjAwMS0yMDAyLCBTU0ggQ29tbXVuaWNhdGlvbnMgU2VjdXJpdHkgQ29ycCBhbmQgSm91bmkgTWFsaW5lbgotICogPGprbWFsaW5lQGNjLmh1dC5maT4KLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1LCBKb3VuaSBNYWxpbmVuIDxqa21hbGluZUBjYy5odXQuZmk+CisgKiA8akB3MS5maT4KKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1LCBKb3VuaSBNYWxpbmVuIDxqQHcxLmZpPgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwpAQCAtMTgzOCwxMyArMTgzOCwxNCBAQAogCiAJLyogc2tiLT5kYXRhIHN0YXJ0cyB3aXRoIHR4ZGVzYy0+ZnJhbWVfY29udHJvbCAqLwogCWhkcl9sZW4gPSAyNDsKLQltZW1jcHkoJnR4ZGVzYy5mcmFtZV9jb250cm9sLCBza2ItPmRhdGEsIGhkcl9sZW4pOworCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCAmdHhkZXNjLmZyYW1lX2NvbnRyb2wsIGhkcl9sZW4pOwogIAlmYyA9IGxlMTZfdG9fY3B1KHR4ZGVzYy5mcmFtZV9jb250cm9sKTsKIAlpZiAoV0xBTl9GQ19HRVRfVFlQRShmYykgPT0gSUVFRTgwMjExX0ZUWVBFX0RBVEEgJiYKIAkgICAgKGZjICYgSUVFRTgwMjExX0ZDVExfRlJPTURTKSAmJiAoZmMgJiBJRUVFODAyMTFfRkNUTF9UT0RTKSAmJgogCSAgICBza2ItPmxlbiA+PSAzMCkgewogCQkvKiBBZGRyNCAqLwotCQltZW1jcHkodHhkZXNjLmFkZHI0LCBza2ItPmRhdGEgKyBoZHJfbGVuLCBFVEhfQUxFTik7CisJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGFfb2Zmc2V0KHNrYiwgaGRyX2xlbiwgdHhkZXNjLmFkZHI0LAorCQkJCQkJIEVUSF9BTEVOKTsKIAkJaGRyX2xlbiArPSBFVEhfQUxFTjsKIAl9CiAKQEAgLTIyMTcsNyArMjIxOCw3IEBACiAJCW1lbWNweShza2JfcHV0KHNrYiwgbGVuKSwgcGF5bG9hZCwgbGVuKTsKIAogCXNrYi0+ZGV2ID0gbG9jYWwtPmRldjsKLQlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKIAogCWNiLT5mdW5jKHNrYiwgb2ssIGNiLT5kYXRhKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfbWFpbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9tYWluLmMKaW5kZXggOTA3N2U2ZS4uNDc0MzQyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9tYWluLmMKQEAgLTMsOCArMyw4IEBACiAgKiBJbnRlcnNpbCBQcmlzbTIvMi41LzMgLSBob3N0YXAubyBtb2R1bGUsIGNvbW1vbiByb3V0aW5lcwogICoKICAqIENvcHlyaWdodCAoYykgMjAwMS0yMDAyLCBTU0ggQ29tbXVuaWNhdGlvbnMgU2VjdXJpdHkgQ29ycCBhbmQgSm91bmkgTWFsaW5lbgotICogPGprbWFsaW5lQGNjLmh1dC5maT4KLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1LCBKb3VuaSBNYWxpbmVuIDxqa21hbGluZUBjYy5odXQuZmk+CisgKiA8akB3MS5maT4KKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1LCBKb3VuaSBNYWxpbmVuIDxqQHcxLmZpPgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwpAQCAtNTkwLDIwICs1OTAsMjAgQEAKIAogaW50IGhvc3RhcF84MDIxMV9oZWFkZXJfcGFyc2Uoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgY2hhciAqaGFkZHIpCiB7Ci0JbWVtY3B5KGhhZGRyLCBza2ItPm1hYy5yYXcgKyAxMCwgRVRIX0FMRU4pOyAvKiBhZGRyMiAqLworCW1lbWNweShoYWRkciwgc2tiX21hY19oZWFkZXIoc2tiKSArIDEwLCBFVEhfQUxFTik7IC8qIGFkZHIyICovCiAJcmV0dXJuIEVUSF9BTEVOOwogfQogCiAKIGludCBob3N0YXBfODAyMTFfcHJpc21faGVhZGVyX3BhcnNlKHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGNoYXIgKmhhZGRyKQogewotCWlmICgqKHUzMiAqKXNrYi0+bWFjLnJhdyA9PSBMV05HX0NBUF9ESURfQkFTRSkgewotCQltZW1jcHkoaGFkZHIsIHNrYi0+bWFjLnJhdyArCi0JCSAgICAgICBzaXplb2Yoc3RydWN0IGxpbnV4X3dsYW5fbmdfcHJpc21faGRyKSArIDEwLAorCWNvbnN0IHVuc2lnbmVkIGNoYXIgKm1hYyA9IHNrYl9tYWNfaGVhZGVyKHNrYik7CisKKwlpZiAoKih1MzIgKiltYWMgPT0gTFdOR19DQVBfRElEX0JBU0UpIHsKKwkJbWVtY3B5KGhhZGRyLCBtYWMgKyBzaXplb2Yoc3RydWN0IGxpbnV4X3dsYW5fbmdfcHJpc21faGRyKSArIDEwLAogCQkgICAgICAgRVRIX0FMRU4pOyAvKiBhZGRyMiAqLwotCX0gZWxzZSB7IC8qICgqKHUzMiAqKXNrYi0+bWFjLnJhdyA9PSBodG9ubChMV05HX0NBUEhEUl9WRVJTSU9OKSkgKi8KLQkJbWVtY3B5KGhhZGRyLCBza2ItPm1hYy5yYXcgKwotCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBsaW51eF93bGFuX25nX2NhcF9oZHIpICsgMTAsCisJfSBlbHNlIHsgLyogKCoodTMyICopbWFjID09IGh0b25sKExXTkdfQ0FQSERSX1ZFUlNJT04pKSAqLworCQltZW1jcHkoaGFkZHIsIG1hYyArIHNpemVvZihzdHJ1Y3QgbGludXhfd2xhbl9uZ19jYXBfaGRyKSArIDEwLAogCQkgICAgICAgRVRIX0FMRU4pOyAvKiBhZGRyMiAqLwogCX0KIAlyZXR1cm4gRVRIX0FMRU47CkBAIC0xMDYzLDcgKzEwNjMsOCBAQAogCW1ldGEtPmlmYWNlID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAogCXNrYi0+ZGV2ID0gZGV2OwotCXNrYi0+bWFjLnJhdyA9IHNrYi0+bmgucmF3ID0gc2tiLT5kYXRhOworCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CisJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CiAJZGV2X3F1ZXVlX3htaXQoc2tiKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9wY2kuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfcGNpLmMKaW5kZXggYzRmNjAyMC4uZGI0ODk5ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9wY2kuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX3BjaS5jCkBAIC0yMCw3ICsyMCw3IEBACiAjaW5jbHVkZSAiaG9zdGFwX3dsYW4uaCIKIAogCi1zdGF0aWMgY2hhciAqdmVyc2lvbiA9IFBSSVNNMl9WRVJTSU9OICIgKEpvdW5pIE1hbGluZW4gPGprbWFsaW5lQGNjLmh1dC5maT4pIjsKK3N0YXRpYyBjaGFyICp2ZXJzaW9uID0gUFJJU00yX1ZFUlNJT04gIiAoSm91bmkgTWFsaW5lbiA8akB3MS5maT4pIjsKIHN0YXRpYyBjaGFyICpkZXZfaW5mbyA9ICJob3N0YXBfcGNpIjsKIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX3BseC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9wbHguYwppbmRleCBlMjM1ZTA2Li5mMGZkNWVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX3BseC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfcGx4LmMKQEAgLTIzLDcgKzIzLDcgQEAKICNpbmNsdWRlICJob3N0YXBfd2xhbi5oIgogCiAKLXN0YXRpYyBjaGFyICp2ZXJzaW9uID0gUFJJU00yX1ZFUlNJT04gIiAoSm91bmkgTWFsaW5lbiA8amttYWxpbmVAY2MuaHV0LmZpPikiOworc3RhdGljIGNoYXIgKnZlcnNpb24gPSBQUklTTTJfVkVSU0lPTiAiIChKb3VuaSBNYWxpbmVuIDxqQHcxLmZpPikiOwogc3RhdGljIGNoYXIgKmRldl9pbmZvID0gImhvc3RhcF9wbHgiOwogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzIxMDAuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzIxMDAuYwppbmRleCBhZDZlNGE0Li5kNTFkYWY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyMTAwLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MjEwMC5jCkBAIC0yOCw4ICsyOCw4IEBACiAKICAgUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBiYXNlZCBvbiB0aGUgSG9zdCBBUCBwcm9qZWN0LAogICBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMiwgU1NIIENvbW11bmljYXRpb25zIFNlY3VyaXR5IENvcnAgYW5kIEpvdW5pIE1hbGluZW4KLSAgICA8amttYWxpbmVAY2MuaHV0LmZpPgotICBDb3B5cmlnaHQgKGMpIDIwMDItMjAwMywgSm91bmkgTWFsaW5lbiA8amttYWxpbmVAY2MuaHV0LmZpPgorICAgIDxqQHcxLmZpPgorICBDb3B5cmlnaHQgKGMpIDIwMDItMjAwMywgSm91bmkgTWFsaW5lbiA8akB3MS5maT4KIAogICBQb3J0aW9ucyBvZiBpcHcyMTAwX21vZF9maXJtd2FyZV9sb2FkLCBpcHcyMTAwX2RvX21vZF9maXJtd2FyZV9sb2FkLCBhbmQKICAgaXB3MjEwMF9md19sb2FkIGFyZSBsb29zZWx5IGJhc2VkIG9uIGRyaXZlcnMvc291bmQvc291bmRfZmlybXdhcmUuYwpAQCAtMjQxNiw4ICsyNDE2LDkgQEAKICNpZmRlZiBJUFcyMTAwX1JYX0RFQlVHCiAJLyogTWFrZSBhIGNvcHkgb2YgdGhlIGZyYW1lIHNvIHdlIGNhbiBkdW1wIGl0IHRvIHRoZSBsb2dzIGlmCiAJICogaWVlZTgwMjExX3J4IGZhaWxzICovCi0JbWVtY3B5KHBhY2tldF9kYXRhLCBwYWNrZXQtPnNrYi0+ZGF0YSwKLQkgICAgICAgbWluX3QodTMyLCBzdGF0dXMtPmZyYW1lX3NpemUsIElQV19SWF9OSUNfQlVGRkVSX0xFTkdUSCkpOworCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEocGFja2V0LT5za2IsIHBhY2tldF9kYXRhLAorCQkJCSAgbWluX3QodTMyLCBzdGF0dXMtPmZyYW1lX3NpemUsCisJCQkJCSAgICAgSVBXX1JYX05JQ19CVUZGRVJfTEVOR1RIKSk7CiAjZW5kaWYKIAogCWlmICghaWVlZTgwMjExX3J4KHByaXYtPmllZWUsIHBhY2tldC0+c2tiLCBzdGF0cykpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzIyMDAuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzIyMDAuYwppbmRleCBjODc4YTJmLi43Y2IyMDUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyMjAwLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MjIwMC5jCkBAIC0xODQ3LDYgKzE4NDcsNTIgQEAKIHN0YXRpYyBERVZJQ0VfQVRUUihuZXRfc3RhdHMsIFNfSVdVU1IgfCBTX0lSVUdPLAogCQkgICBzaG93X25ldF9zdGF0cywgc3RvcmVfbmV0X3N0YXRzKTsKIAorc3RhdGljIHNzaXplX3Qgc2hvd19jaGFubmVscyhzdHJ1Y3QgZGV2aWNlICpkLAorCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgY2hhciAqYnVmKQoreworCXN0cnVjdCBpcHdfcHJpdiAqcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKKwljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX2dlbyAqZ2VvID0gaWVlZTgwMjExX2dldF9nZW8ocHJpdi0+aWVlZSk7CisJaW50IGxlbiA9IDAsIGk7CisKKwlsZW4gPSBzcHJpbnRmKCZidWZbbGVuXSwKKwkJICAgICAgIkRpc3BsYXlpbmcgJWQgY2hhbm5lbHMgaW4gMi40R2h6IGJhbmQgIgorCQkgICAgICAiKDgwMi4xMWJnKTpcbiIsIGdlby0+YmdfY2hhbm5lbHMpOworCisJZm9yIChpID0gMDsgaSA8IGdlby0+YmdfY2hhbm5lbHM7IGkrKykgeworCQlsZW4gKz0gc3ByaW50ZigmYnVmW2xlbl0sICIlZDogQlNTJXMlcywgJXMsIEJhbmQgJXMuXG4iLAorCQkJICAgICAgIGdlby0+YmdbaV0uY2hhbm5lbCwKKwkJCSAgICAgICBnZW8tPmJnW2ldLmZsYWdzICYgSUVFRTgwMjExX0NIX1JBREFSX0RFVEVDVCA/CisJCQkgICAgICAgIiAocmFkYXIgc3BlY3RydW0pIiA6ICIiLAorCQkJICAgICAgICgoZ2VvLT5iZ1tpXS5mbGFncyAmIElFRUU4MDIxMV9DSF9OT19JQlNTKSB8fAorCQkJCShnZW8tPmJnW2ldLmZsYWdzICYgSUVFRTgwMjExX0NIX1JBREFSX0RFVEVDVCkpCisJCQkgICAgICAgPyAiIiA6ICIsIElCU1MiLAorCQkJICAgICAgIGdlby0+YmdbaV0uZmxhZ3MgJiBJRUVFODAyMTFfQ0hfUEFTU0lWRV9PTkxZID8KKwkJCSAgICAgICAicGFzc2l2ZSBvbmx5IiA6ICJhY3RpdmUvcGFzc2l2ZSIsCisJCQkgICAgICAgZ2VvLT5iZ1tpXS5mbGFncyAmIElFRUU4MDIxMV9DSF9CX09OTFkgPworCQkJICAgICAgICJCIiA6ICJCL0ciKTsKKwl9CisKKwlsZW4gKz0gc3ByaW50ZigmYnVmW2xlbl0sCisJCSAgICAgICAiRGlzcGxheWluZyAlZCBjaGFubmVscyBpbiA1LjJHaHogYmFuZCAiCisJCSAgICAgICAiKDgwMi4xMWEpOlxuIiwgZ2VvLT5hX2NoYW5uZWxzKTsKKwlmb3IgKGkgPSAwOyBpIDwgZ2VvLT5hX2NoYW5uZWxzOyBpKyspIHsKKwkJbGVuICs9IHNwcmludGYoJmJ1ZltsZW5dLCAiJWQ6IEJTUyVzJXMsICVzLlxuIiwKKwkJCSAgICAgICBnZW8tPmFbaV0uY2hhbm5lbCwKKwkJCSAgICAgICBnZW8tPmFbaV0uZmxhZ3MgJiBJRUVFODAyMTFfQ0hfUkFEQVJfREVURUNUID8KKwkJCSAgICAgICAiIChyYWRhciBzcGVjdHJ1bSkiIDogIiIsCisJCQkgICAgICAgKChnZW8tPmFbaV0uZmxhZ3MgJiBJRUVFODAyMTFfQ0hfTk9fSUJTUykgfHwKKwkJCQkoZ2VvLT5hW2ldLmZsYWdzICYgSUVFRTgwMjExX0NIX1JBREFSX0RFVEVDVCkpCisJCQkgICAgICAgPyAiIiA6ICIsIElCU1MiLAorCQkJICAgICAgIGdlby0+YVtpXS5mbGFncyAmIElFRUU4MDIxMV9DSF9QQVNTSVZFX09OTFkgPworCQkJICAgICAgICJwYXNzaXZlIG9ubHkiIDogImFjdGl2ZS9wYXNzaXZlIik7CisJfQorCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIERFVklDRV9BVFRSKGNoYW5uZWxzLCBTX0lSVVNSLCBzaG93X2NoYW5uZWxzLCBOVUxMKTsKKwogc3RhdGljIHZvaWQgbm90aWZ5X3d4X2Fzc29jX2V2ZW50KHN0cnVjdCBpcHdfcHJpdiAqcHJpdikKIHsKIAl1bmlvbiBpd3JlcV9kYXRhIHdycXU7CkBAIC04MTMzLDcgKzgxNzksNyBAQAogCQlza2ItPmRldiA9IHByaXYtPmllZWUtPmRldjsKIAogCQkvKiBQb2ludCByYXcgYXQgdGhlIGllZWU4MDIxMV9zdGF0cyAqLwotCQlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CiAKIAkJc2tiLT5wa3RfdHlwZSA9IFBBQ0tFVF9PVEhFUkhPU1Q7CiAJCXNrYi0+cHJvdG9jb2wgPSBfX2NvbnN0YW50X2h0b25zKEVUSF9QXzgwMjExX1NUQVRTKTsKQEAgLTEwMzU1LDcgKzEwNDAxLDcgQEAKIAogCQlydF9oZHItPml0X2xlbiA9IGRzdC0+bGVuOwogCi0JCW1lbWNweShza2JfcHV0KGRzdCwgbGVuKSwgc3JjLT5kYXRhLCBsZW4pOworCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNyYywgc2tiX3B1dChkc3QsIGxlbiksIGxlbik7CiAKIAkJaWYgKCFpZWVlODAyMTFfcngocHJpdi0+cHJvbV9wcml2LT5pZWVlLCBkc3QsICZkdW1teXN0YXRzKSkKIAkJCWRldl9rZnJlZV9za2JfYW55KGRzdCk7CkBAIC0xMTM4Myw2ICsxMTQyOSw3IEBACiAJJmRldl9hdHRyX2xlZC5hdHRyLAogCSZkZXZfYXR0cl9zcGVlZF9zY2FuLmF0dHIsCiAJJmRldl9hdHRyX25ldF9zdGF0cy5hdHRyLAorCSZkZXZfYXR0cl9jaGFubmVscy5hdHRyLAogI2lmZGVmIENPTkZJR19JUFcyMjAwX1BST01JU0NVT1VTCiAJJmRldl9hdHRyX3J0YXBfaWZhY2UuYXR0ciwKIAkmZGV2X2F0dHJfcnRhcF9maWx0ZXIuYXR0ciwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzLzExZC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvMTFkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBlY2M0ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzLzExZC5jCkBAIC0wLDAgKzEsNzU0IEBACisvKioKKyAgKiBUaGlzIGZpbGUgY29udGFpbnMgZnVuY3Rpb25zIGZvciA4MDIuMTFELgorICAqLworI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKworI2luY2x1ZGUgImhvc3QuaCIKKyNpbmNsdWRlICJkZWNsLmgiCisjaW5jbHVkZSAiMTFkLmgiCisjaW5jbHVkZSAiZGV2LmgiCisjaW5jbHVkZSAid2V4dC5oIgorCisjZGVmaW5lIFRYX1BXUl9ERUZBVUxUCTEwCisKK3N0YXRpYyBzdHJ1Y3QgcmVnaW9uX2NvZGVfbWFwcGluZyByZWdpb25fY29kZV9tYXBwaW5nW10gPSB7CisJeyJVUyAiLCAweDEwfSwJCS8qIFVTIEZDQyAgICAgICovCisJeyJDQSAiLCAweDEwfSwJCS8qIElDIENhbmFkYSAgICovCisJeyJTRyAiLCAweDEwfSwJCS8qIFNpbmdhcG9yZSAgICovCisJeyJFVSAiLCAweDMwfSwJCS8qIEVUU0kgICAgICAgICovCisJeyJBVSAiLCAweDMwfSwJCS8qIEF1c3RyYWxpYSAgICovCisJeyJLUiAiLCAweDMwfSwJCS8qIFJlcHVibGljIE9mIEtvcmVhICovCisJeyJFUyAiLCAweDMxfSwJCS8qIFNwYWluICAgICAgICovCisJeyJGUiAiLCAweDMyfSwJCS8qIEZyYW5jZSAgICAgICovCisJeyJKUCAiLCAweDQwfSwJCS8qIEphcGFuICAgICAgICovCit9OworCisvKiBGb2xsb3dpbmcgMiBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgc3VwcG9ydGVkIGNoYW5uZWxzICovCitzdGF0aWMgc3RydWN0IGNoYW5fZnJlcV9wb3dlciBjaGFubmVsX2ZyZXFfcG93ZXJfVU5fQkdbXSA9IHsKKwl7MSwgMjQxMiwgVFhfUFdSX0RFRkFVTFR9LAorCXsyLCAyNDE3LCBUWF9QV1JfREVGQVVMVH0sCisJezMsIDI0MjIsIFRYX1BXUl9ERUZBVUxUfSwKKwl7NCwgMjQyNywgVFhfUFdSX0RFRkFVTFR9LAorCXs1LCAyNDMyLCBUWF9QV1JfREVGQVVMVH0sCisJezYsIDI0MzcsIFRYX1BXUl9ERUZBVUxUfSwKKwl7NywgMjQ0MiwgVFhfUFdSX0RFRkFVTFR9LAorCXs4LCAyNDQ3LCBUWF9QV1JfREVGQVVMVH0sCisJezksIDI0NTIsIFRYX1BXUl9ERUZBVUxUfSwKKwl7MTAsIDI0NTcsIFRYX1BXUl9ERUZBVUxUfSwKKwl7MTEsIDI0NjIsIFRYX1BXUl9ERUZBVUxUfSwKKwl7MTIsIDI0NjcsIFRYX1BXUl9ERUZBVUxUfSwKKwl7MTMsIDI0NzIsIFRYX1BXUl9ERUZBVUxUfSwKKwl7MTQsIDI0ODQsIFRYX1BXUl9ERUZBVUxUfQorfTsKKworc3RhdGljIHU4IHdsYW5fcmVnaW9uXzJfY29kZSh1OCAqIHJlZ2lvbikKK3sKKwl1OCBpOworCXU4IHNpemUgPSBzaXplb2YocmVnaW9uX2NvZGVfbWFwcGluZykvCisJCSAgc2l6ZW9mKHN0cnVjdCByZWdpb25fY29kZV9tYXBwaW5nKTsKKworCWZvciAoaSA9IDA7IHJlZ2lvbltpXSAmJiBpIDwgQ09VTlRSWV9DT0RFX0xFTjsgaSsrKQorCQlyZWdpb25baV0gPSB0b3VwcGVyKHJlZ2lvbltpXSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCWlmICghbWVtY21wKHJlZ2lvbiwgcmVnaW9uX2NvZGVfbWFwcGluZ1tpXS5yZWdpb24sCisJCQkgICAgQ09VTlRSWV9DT0RFX0xFTikpCisJCQlyZXR1cm4gKHJlZ2lvbl9jb2RlX21hcHBpbmdbaV0uY29kZSk7CisJfQorCisJLyogZGVmYXVsdCBpcyBVUyAqLworCXJldHVybiAocmVnaW9uX2NvZGVfbWFwcGluZ1swXS5jb2RlKTsKK30KKworc3RhdGljIHU4ICp3bGFuX2NvZGVfMl9yZWdpb24odTggY29kZSkKK3sKKwl1OCBpOworCXU4IHNpemUgPSBzaXplb2YocmVnaW9uX2NvZGVfbWFwcGluZykKKwkJICAvIHNpemVvZihzdHJ1Y3QgcmVnaW9uX2NvZGVfbWFwcGluZyk7CisJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQlpZiAocmVnaW9uX2NvZGVfbWFwcGluZ1tpXS5jb2RlID09IGNvZGUpCisJCQlyZXR1cm4gKHJlZ2lvbl9jb2RlX21hcHBpbmdbaV0ucmVnaW9uKTsKKwl9CisJLyogZGVmYXVsdCBpcyBVUyAqLworCXJldHVybiAocmVnaW9uX2NvZGVfbWFwcGluZ1swXS5yZWdpb24pOworfQorCisvKioKKyAqICBAYnJpZWYgVGhpcyBmdW5jdGlvbiBmaW5kcyB0aGUgbnJjaGFuLXRoIGNoYW4gYWZ0ZXIgdGhlIGZpcnN0Y2hhbgorICogIEBwYXJhbSBiYW5kICAgICAgIGJhbmQKKyAqICBAcGFyYW0gZmlyc3RjaGFuICBmaXJzdCBjaGFubmVsIG51bWJlcgorICogIEBwYXJhbSBucmNoYW4gICBudW1iZXIgb2YgY2hhbm5lbHMKKyAqICBAcmV0dXJuIAkgICAgICB0aGUgbnJjaGFuLXRoIGNoYW4gbnVtYmVyCisqLworc3RhdGljIHU4IHdsYW5fZ2V0X2NoYW5fMTFkKHU4IGJhbmQsIHU4IGZpcnN0Y2hhbiwgdTggbnJjaGFuLCB1OCAqIGNoYW4pCisvKmZpbmQgdGhlIG5yY2hhbi10aCBjaGFuIGFmdGVyIHRoZSBmaXJzdGNoYW4qLworeworCXU4IGk7CisJc3RydWN0IGNoYW5fZnJlcV9wb3dlciAqY2ZwOworCXU4IGNmcF9ubzsKKworCWNmcCA9IGNoYW5uZWxfZnJlcV9wb3dlcl9VTl9CRzsKKwljZnBfbm8gPSBzaXplb2YoY2hhbm5lbF9mcmVxX3Bvd2VyX1VOX0JHKSAvCisJICAgIHNpemVvZihzdHJ1Y3QgY2hhbl9mcmVxX3Bvd2VyKTsKKworCWZvciAoaSA9IDA7IGkgPCBjZnBfbm87IGkrKykgeworCQlpZiAoKGNmcCArIGkpLT5jaGFubmVsID09IGZpcnN0Y2hhbikgeworCQkJbGJzX3ByX2RlYnVnKDEsICJmaXJzdGNoYW4gZm91bmRcbiIpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoaSA8IGNmcF9ubykgeworCQkvKmlmIGJleW9uZCB0aGUgYm91bmRhcnkgKi8KKwkJaWYgKGkgKyBucmNoYW4gPCBjZnBfbm8pIHsKKwkJCSpjaGFuID0gKGNmcCArIGkgKyBucmNoYW4pLT5jaGFubmVsOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiAgQGJyaWVmIFRoaXMgZnVuY3Rpb24gQ2hlY2tzIGlmIGNoYW4gdHhwd3IgaXMgbGVhcm5lZCBmcm9tIEFQL0lCU1MKKyAqICBAcGFyYW0gY2hhbiAgICAgICAgICAgICAgICAgY2hhbiBudW1iZXIKKyAqICBAcGFyYW0gcGFyc2VkX3JlZ2lvbl9jaGFuICAgcG9pbnRlciB0byBwYXJzZWRfcmVnaW9uX2NoYW5fMTFkCisgKiAgQHJldHVybiAJICAgICAgICAgICAgICAgIFRSVUU7IEZBTFNFCisqLworc3RhdGljIHU4IHdsYW5fY2hhbm5lbF9rbm93bl8xMWQodTggY2hhbiwKKwkJCSAgc3RydWN0IHBhcnNlZF9yZWdpb25fY2hhbl8xMWQgKiBwYXJzZWRfcmVnaW9uX2NoYW4pCit7CisJc3RydWN0IGNoYW5fcG93ZXJfMTFkICpjaGFucHdyID0gcGFyc2VkX3JlZ2lvbl9jaGFuLT5jaGFucHdyOworCXU4IG5yX2NoYW4gPSBwYXJzZWRfcmVnaW9uX2NoYW4tPm5yX2NoYW47CisJdTggaSA9IDA7CisKKwlsYnNfZGJnX2hleCgiMTFEOnBhcnNlZF9yZWdpb25fY2hhbjoiLCAoY2hhciAqKWNoYW5wd3IsCisJCXNpemVvZihzdHJ1Y3QgY2hhbl9wb3dlcl8xMWQpICogbnJfY2hhbik7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnJfY2hhbjsgaSsrKSB7CisJCWlmIChjaGFuID09IGNoYW5wd3JbaV0uY2hhbikgeworCQkJbGJzX3ByX2RlYnVnKDEsICIxMUQ6IEZvdW5kIENoYW46JWRcbiIsIGNoYW4pOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisKKwlsYnNfcHJfZGVidWcoMSwgIjExRDogTm90IEZpbmQgQ2hhbjolZFxuIiwgY2hhbik7CisJcmV0dXJuIDA7Cit9CisKK3UzMiBsaWJlcnRhc19jaGFuXzJfZnJlcSh1OCBjaGFuLCB1OCBiYW5kKQoreworCXN0cnVjdCBjaGFuX2ZyZXFfcG93ZXIgKmNmOworCXUxNiBjbnQ7CisJdTE2IGk7CisJdTMyIGZyZXEgPSAwOworCisJY2YgPSBjaGFubmVsX2ZyZXFfcG93ZXJfVU5fQkc7CisJY250ID0KKwkgICAgc2l6ZW9mKGNoYW5uZWxfZnJlcV9wb3dlcl9VTl9CRykgLworCSAgICBzaXplb2Yoc3RydWN0IGNoYW5fZnJlcV9wb3dlcik7CisKKwlmb3IgKGkgPSAwOyBpIDwgY250OyBpKyspIHsKKwkJaWYgKGNoYW4gPT0gY2ZbaV0uY2hhbm5lbCkKKwkJCWZyZXEgPSBjZltpXS5mcmVxOworCX0KKworCXJldHVybiBmcmVxOworfQorCitzdGF0aWMgaW50IGdlbmVyYXRlX2RvbWFpbl9pbmZvXzExZChzdHJ1Y3QgcGFyc2VkX3JlZ2lvbl9jaGFuXzExZAorCQkJCSAgKnBhcnNlZF9yZWdpb25fY2hhbiwKKwkJCQkgIHN0cnVjdCB3bGFuXzgwMl8xMWRfZG9tYWluX3JlZyAqIGRvbWFpbmluZm8pCit7CisJdTggbnJfc3ViYmFuZCA9IDA7CisKKwl1OCBucl9jaGFuID0gcGFyc2VkX3JlZ2lvbl9jaGFuLT5ucl9jaGFuOworCXU4IG5yX3BhcnNlZGNoYW4gPSAwOworCisJdTggZmlyc3RjaGFuID0gMCwgbmV4dGNoYW4gPSAwLCBtYXhwd3IgPSAwOworCisJdTggaSwgZmxhZyA9IDA7CisKKwltZW1jcHkoZG9tYWluaW5mby0+Y291bnRyeWNvZGUsIHBhcnNlZF9yZWdpb25fY2hhbi0+Y291bnRyeWNvZGUsCisJICAgICAgIENPVU5UUllfQ09ERV9MRU4pOworCisJbGJzX3ByX2RlYnVnKDEsICIxMUQ6bnJjaGFuPSVkXG4iLCBucl9jaGFuKTsKKwlsYnNfZGJnX2hleCgiMTFEOnBhcnNlZF9yZWdpb25fY2hhbjoiLCAoY2hhciAqKXBhcnNlZF9yZWdpb25fY2hhbiwKKwkJc2l6ZW9mKHN0cnVjdCBwYXJzZWRfcmVnaW9uX2NoYW5fMTFkKSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnJfY2hhbjsgaSsrKSB7CisJCWlmICghZmxhZykgeworCQkJZmxhZyA9IDE7CisJCQluZXh0Y2hhbiA9IGZpcnN0Y2hhbiA9CisJCQkgICAgcGFyc2VkX3JlZ2lvbl9jaGFuLT5jaGFucHdyW2ldLmNoYW47CisJCQltYXhwd3IgPSBwYXJzZWRfcmVnaW9uX2NoYW4tPmNoYW5wd3JbaV0ucHdyOworCQkJbnJfcGFyc2VkY2hhbiA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChwYXJzZWRfcmVnaW9uX2NoYW4tPmNoYW5wd3JbaV0uY2hhbiA9PSBuZXh0Y2hhbiArIDEgJiYKKwkJICAgIHBhcnNlZF9yZWdpb25fY2hhbi0+Y2hhbnB3cltpXS5wd3IgPT0gbWF4cHdyKSB7CisJCQluZXh0Y2hhbisrOworCQkJbnJfcGFyc2VkY2hhbisrOworCQl9IGVsc2UgeworCQkJZG9tYWluaW5mby0+c3ViYmFuZFtucl9zdWJiYW5kXS5maXJzdGNoYW4gPSBmaXJzdGNoYW47CisJCQlkb21haW5pbmZvLT5zdWJiYW5kW25yX3N1YmJhbmRdLm5yY2hhbiA9CisJCQkgICAgbnJfcGFyc2VkY2hhbjsKKwkJCWRvbWFpbmluZm8tPnN1YmJhbmRbbnJfc3ViYmFuZF0ubWF4dHhwd3IgPSBtYXhwd3I7CisJCQlucl9zdWJiYW5kKys7CisJCQluZXh0Y2hhbiA9IGZpcnN0Y2hhbiA9CisJCQkgICAgcGFyc2VkX3JlZ2lvbl9jaGFuLT5jaGFucHdyW2ldLmNoYW47CisJCQltYXhwd3IgPSBwYXJzZWRfcmVnaW9uX2NoYW4tPmNoYW5wd3JbaV0ucHdyOworCQl9CisJfQorCisJaWYgKGZsYWcpIHsKKwkJZG9tYWluaW5mby0+c3ViYmFuZFtucl9zdWJiYW5kXS5maXJzdGNoYW4gPSBmaXJzdGNoYW47CisJCWRvbWFpbmluZm8tPnN1YmJhbmRbbnJfc3ViYmFuZF0ubnJjaGFuID0gbnJfcGFyc2VkY2hhbjsKKwkJZG9tYWluaW5mby0+c3ViYmFuZFtucl9zdWJiYW5kXS5tYXh0eHB3ciA9IG1heHB3cjsKKwkJbnJfc3ViYmFuZCsrOworCX0KKwlkb21haW5pbmZvLT5ucl9zdWJiYW5kID0gbnJfc3ViYmFuZDsKKworCWxic19wcl9kZWJ1ZygxLCAibnJfc3ViYmFuZD0leFxuIiwgZG9tYWluaW5mby0+bnJfc3ViYmFuZCk7CisJbGJzX2RiZ19oZXgoIjExRDpkb21haW5pbmZvOiIsIChjaGFyICopZG9tYWluaW5mbywKKwkJQ09VTlRSWV9DT0RFX0xFTiArIDEgKworCQlzaXplb2Yoc3RydWN0IGllZWV0eXBlc19zdWJiYW5kc2V0KSAqIG5yX3N1YmJhbmQpOworCXJldHVybiAwOworfQorCisvKioKKyAqICBAYnJpZWYgVGhpcyBmdW5jdGlvbiBnZW5lcmF0ZXMgcGFyc2VkX3JlZ2lvbl9jaGFuIGZyb20gRG9tYWluIEluZm8gbGVhcm5lZCBmcm9tIEFQL0lCU1MKKyAqICBAcGFyYW0gcmVnaW9uX2NoYW4gICAgICAgICAgcG9pbnRlciB0byBzdHJ1Y3QgcmVnaW9uX2NoYW5uZWwKKyAqICBAcGFyYW0gKnBhcnNlZF9yZWdpb25fY2hhbiAgcG9pbnRlciB0byBwYXJzZWRfcmVnaW9uX2NoYW5fMTFkCisgKiAgQHJldHVybiAJICAgICAgICAgICAgICAgIE4vQQorKi8KK3N0YXRpYyB2b2lkIHdsYW5fZ2VuZXJhdGVfcGFyc2VkX3JlZ2lvbl9jaGFuXzExZChzdHJ1Y3QgcmVnaW9uX2NoYW5uZWwgKiByZWdpb25fY2hhbiwKKwkJCQkJICBzdHJ1Y3QgcGFyc2VkX3JlZ2lvbl9jaGFuXzExZCAqCisJCQkJCSAgcGFyc2VkX3JlZ2lvbl9jaGFuKQoreworCXU4IGk7CisJc3RydWN0IGNoYW5fZnJlcV9wb3dlciAqY2ZwOworCisJaWYgKHJlZ2lvbl9jaGFuID09IE5VTEwpIHsKKwkJbGJzX3ByX2RlYnVnKDEsICIxMUQ6IHJlZ2lvbl9jaGFuIGlzIE5VTExcbiIpOworCQlyZXR1cm47CisJfQorCisJY2ZwID0gcmVnaW9uX2NoYW4tPkNGUDsKKwlpZiAoY2ZwID09IE5VTEwpIHsKKwkJbGJzX3ByX2RlYnVnKDEsICIxMUQ6IGNmcCBlcXVhbCBOVUxMIFxuIik7CisJCXJldHVybjsKKwl9CisKKwlwYXJzZWRfcmVnaW9uX2NoYW4tPmJhbmQgPSByZWdpb25fY2hhbi0+YmFuZDsKKwlwYXJzZWRfcmVnaW9uX2NoYW4tPnJlZ2lvbiA9IHJlZ2lvbl9jaGFuLT5yZWdpb247CisJbWVtY3B5KHBhcnNlZF9yZWdpb25fY2hhbi0+Y291bnRyeWNvZGUsCisJICAgICAgIHdsYW5fY29kZV8yX3JlZ2lvbihyZWdpb25fY2hhbi0+cmVnaW9uKSwgQ09VTlRSWV9DT0RFX0xFTik7CisKKwlsYnNfcHJfZGVidWcoMSwgIjExRDogcmVnaW9uWzB4JXhdIGJhbmRbJWRdXG4iLCBwYXJzZWRfcmVnaW9uX2NoYW4tPnJlZ2lvbiwKKwkgICAgICAgcGFyc2VkX3JlZ2lvbl9jaGFuLT5iYW5kKTsKKworCWZvciAoaSA9IDA7IGkgPCByZWdpb25fY2hhbi0+bnJjZnA7IGkrKywgY2ZwKyspIHsKKwkJcGFyc2VkX3JlZ2lvbl9jaGFuLT5jaGFucHdyW2ldLmNoYW4gPSBjZnAtPmNoYW5uZWw7CisJCXBhcnNlZF9yZWdpb25fY2hhbi0+Y2hhbnB3cltpXS5wd3IgPSBjZnAtPm1heHR4cG93ZXI7CisJCWxic19wcl9kZWJ1ZygxLCAiMTFEOiBDaGFuWyVkXSBQd3JbJWRdXG4iLAorCQkgICAgICAgcGFyc2VkX3JlZ2lvbl9jaGFuLT5jaGFucHdyW2ldLmNoYW4sCisJCSAgICAgICBwYXJzZWRfcmVnaW9uX2NoYW4tPmNoYW5wd3JbaV0ucHdyKTsKKwl9CisJcGFyc2VkX3JlZ2lvbl9jaGFuLT5ucl9jaGFuID0gcmVnaW9uX2NoYW4tPm5yY2ZwOworCisJbGJzX3ByX2RlYnVnKDEsICIxMUQ6IG5yY2hhblslZF1cbiIsIHBhcnNlZF9yZWdpb25fY2hhbi0+bnJfY2hhbik7CisKKwlyZXR1cm47Cit9CisKKy8qKgorICogIEBicmllZiBnZW5lcmF0ZSBwYXJzZWRfcmVnaW9uX2NoYW4gZnJvbSBEb21haW4gSW5mbyBsZWFybmVkIGZyb20gQVAvSUJTUworICogIEBwYXJhbSByZWdpb24gICAgICAgICAgICAgICByZWdpb24gSUQKKyAqICBAcGFyYW0gYmFuZCAgICAgICAgICAgICAgICAgYmFuZAorICogIEBwYXJhbSBjaGFuICAgICAgICAgICAgICAgICBjaGFuCisgKiAgQHJldHVybiAJICAgICAgICAgICAgICAgIFRSVUU7RkFMU0UKKyovCitzdGF0aWMgdTggd2xhbl9yZWdpb25fY2hhbl9zdXBwb3J0ZWRfMTFkKHU4IHJlZ2lvbiwgdTggYmFuZCwgdTggY2hhbikKK3sKKwlzdHJ1Y3QgY2hhbl9mcmVxX3Bvd2VyICpjZnA7CisJaW50IGNmcF9ubzsKKwl1OCBpZHg7CisKKwlFTlRFUigpOworCisJY2ZwID0gbGliZXJ0YXNfZ2V0X3JlZ2lvbl9jZnBfdGFibGUocmVnaW9uLCBiYW5kLCAmY2ZwX25vKTsKKwlpZiAoY2ZwID09IE5VTEwpCisJCXJldHVybiAwOworCisJZm9yIChpZHggPSAwOyBpZHggPCBjZnBfbm87IGlkeCsrKSB7CisJCWlmIChjaGFuID09IChjZnAgKyBpZHgpLT5jaGFubmVsKSB7CisJCQkvKiBJZiBNcnZsIENoaXAgU3VwcG9ydGVkPyAqLworCQkJaWYgKChjZnAgKyBpZHgpLT51bnN1cHBvcnRlZCkgeworCQkJCXJldHVybiAwOworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJfQorCX0KKworCS8qY2hhbiBpcyBub3QgaW4gdGhlIHJlZ2lvbiB0YWJsZSAqLworCUxFQVZFKCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogIEBicmllZiBUaGlzIGZ1bmN0aW9uIGNoZWNrcyBpZiBjaGFuIHR4cHdyIGlzIGxlYXJuZWQgZnJvbSBBUC9JQlNTCisgKiAgQHBhcmFtIGNoYW4gICAgICAgICAgICAgICAgIGNoYW4gbnVtYmVyCisgKiAgQHBhcmFtIHBhcnNlZF9yZWdpb25fY2hhbiAgIHBvaW50ZXIgdG8gcGFyc2VkX3JlZ2lvbl9jaGFuXzExZAorICogIEByZXR1cm4gCSAgICAgICAgICAgICAgICAwCisqLworc3RhdGljIGludCBwYXJzZV9kb21haW5faW5mb18xMWQoc3RydWN0IGllZWV0eXBlc19jb3VudHJ5aW5mb2Z1bGxzZXQqCisJCQkJIGNvdW50cnlpbmZvLAorCQkJCSB1OCBiYW5kLAorCQkJCSBzdHJ1Y3QgcGFyc2VkX3JlZ2lvbl9jaGFuXzExZCAqCisJCQkJIHBhcnNlZF9yZWdpb25fY2hhbikKK3sKKwl1OCBucl9zdWJiYW5kLCBucmNoYW47CisJdTggbGFzdGNoYW4sIGZpcnN0Y2hhbjsKKwl1OCByZWdpb247CisJdTggY3VyY2hhbiA9IDA7CisKKwl1OCBpZHggPSAwOwkJLypjaGFuIGluZGV4IGluIHBhcnNlZF9yZWdpb25fY2hhbiAqLworCisJdTggaiwgaTsKKworCUVOVEVSKCk7CisKKwkvKnZhbGlkYXRpb24gUnVsZXM6CisJICAgMS4gdmFsaWQgcmVnaW9uIENvZGUKKwkgICAyLiBGaXJzdCBDaGFuIGluY3JlbWVudAorCSAgIDMuIGNoYW5uZWwgcmFuZ2Ugbm8gb3ZlcmxhcAorCSAgIDQuIGNoYW5uZWwgaXMgdmFsaWQ/CisJICAgNS4gY2hhbm5lbCBpcyBzdXBwb3J0ZWQgYnkgcmVnaW9uPworCSAgIDYuIE90aGVycworCSAqLworCisJbGJzX2RiZ19oZXgoIkNvdW50cnlJbmZvOiIsICh1OCAqKSBjb3VudHJ5aW5mbywgMzApOworCisJaWYgKCgqKGNvdW50cnlpbmZvLT5jb3VudHJ5Y29kZSkpID09IDAKKwkgICAgfHwgKGNvdW50cnlpbmZvLT5sZW4gPD0gQ09VTlRSWV9DT0RFX0xFTikpIHsKKwkJLyogTm8gcmVnaW9uIEluZm8gb3IgV3JvbmcgcmVnaW9uIGluZm86IHRyZWF0IGFzIE5vIDExRCBpbmZvICovCisJCUxFQVZFKCk7CisJCXJldHVybiAwOworCX0KKworCS8qU3RlcDE6IGNoZWNrIHJlZ2lvbl9jb2RlICovCisJcGFyc2VkX3JlZ2lvbl9jaGFuLT5yZWdpb24gPSByZWdpb24gPQorCSAgICB3bGFuX3JlZ2lvbl8yX2NvZGUoY291bnRyeWluZm8tPmNvdW50cnljb2RlKTsKKworCWxic19wcl9kZWJ1ZygxLCAicmVnaW9uY29kZT0leFxuIiwgKHU4KSBwYXJzZWRfcmVnaW9uX2NoYW4tPnJlZ2lvbik7CisJbGJzX2RiZ19oZXgoIkNvdW50cnlDb2RlOiIsIChjaGFyICopY291bnRyeWluZm8tPmNvdW50cnljb2RlLAorCQlDT1VOVFJZX0NPREVfTEVOKTsKKworCXBhcnNlZF9yZWdpb25fY2hhbi0+YmFuZCA9IGJhbmQ7CisKKwltZW1jcHkocGFyc2VkX3JlZ2lvbl9jaGFuLT5jb3VudHJ5Y29kZSwgY291bnRyeWluZm8tPmNvdW50cnljb2RlLAorCSAgICAgICBDT1VOVFJZX0NPREVfTEVOKTsKKworCW5yX3N1YmJhbmQgPSAoY291bnRyeWluZm8tPmxlbiAtIENPVU5UUllfQ09ERV9MRU4pIC8KKwkgICAgc2l6ZW9mKHN0cnVjdCBpZWVldHlwZXNfc3ViYmFuZHNldCk7CisKKwlmb3IgKGogPSAwLCBsYXN0Y2hhbiA9IDA7IGogPCBucl9zdWJiYW5kOyBqKyspIHsKKworCQlpZiAoY291bnRyeWluZm8tPnN1YmJhbmRbal0uZmlyc3RjaGFuIDw9IGxhc3RjaGFuKSB7CisJCQkvKlN0ZXAyJjMuIENoZWNrIEZpcnN0IENoYW4gTnVtIGluY3JlbWVudCBhbmQgbm8gb3ZlcmxhcCAqLworCQkJbGJzX3ByX2RlYnVnKDEsICIxMUQ6IENoYW5bJWQ+JWRdIE92ZXJsYXBcbiIsCisJCQkgICAgICAgY291bnRyeWluZm8tPnN1YmJhbmRbal0uZmlyc3RjaGFuLCBsYXN0Y2hhbik7CisJCQljb250aW51ZTsKKwkJfQorCisJCWZpcnN0Y2hhbiA9IGNvdW50cnlpbmZvLT5zdWJiYW5kW2pdLmZpcnN0Y2hhbjsKKwkJbnJjaGFuID0gY291bnRyeWluZm8tPnN1YmJhbmRbal0ubnJjaGFuOworCisJCWZvciAoaSA9IDA7IGlkeCA8IE1BWF9OT19PRl9DSEFOICYmIGkgPCBucmNoYW47IGkrKykgeworCQkJLypzdGVwNDogY2hhbm5lbCBpcyBzdXBwb3J0ZWQ/ICovCisKKwkJCWlmICghd2xhbl9nZXRfY2hhbl8xMWQoYmFuZCwgZmlyc3RjaGFuLCBpLCAmY3VyY2hhbikpIHsKKwkJCQkvKiBDaGFuIGlzIG5vdCBmb3VuZCBpbiBVTiB0YWJsZSAqLworCQkJCWxic19wcl9kZWJ1ZygxLCAiY2hhbiBpcyBub3Qgc3VwcG9ydGVkOiAlZCBcbiIsIGkpOworCQkJCWJyZWFrOworCQkJfQorCisJCQlsYXN0Y2hhbiA9IGN1cmNoYW47CisKKwkJCWlmICh3bGFuX3JlZ2lvbl9jaGFuX3N1cHBvcnRlZF8xMWQKKwkJCSAgICAocmVnaW9uLCBiYW5kLCBjdXJjaGFuKSkgeworCQkJCS8qc3RlcDU6IENoZWNrIGlmIGN1cmNoYW4gaXMgc3VwcG9ydGVkIGJ5IG1ydmwgaW4gcmVnaW9uICovCisJCQkJcGFyc2VkX3JlZ2lvbl9jaGFuLT5jaGFucHdyW2lkeF0uY2hhbiA9IGN1cmNoYW47CisJCQkJcGFyc2VkX3JlZ2lvbl9jaGFuLT5jaGFucHdyW2lkeF0ucHdyID0KKwkJCQkgICAgY291bnRyeWluZm8tPnN1YmJhbmRbal0ubWF4dHhwd3I7CisJCQkJaWR4Kys7CisJCQl9IGVsc2UgeworCQkJCS8qbm90IHN1cHBvcnRlZCBhbmQgaWdub3JlIHRoZSBjaGFuICovCisJCQkJbGJzX3ByX2RlYnVnKDEsCisJCQkJICAgICAgICIxMUQ6aVslZF0gY2hhblslZF0gdW5zdXBwb3J0ZWQgaW4gcmVnaW9uWyV4XSBiYW5kWyVkXVxuIiwKKwkJCQkgICAgICAgaSwgY3VyY2hhbiwgcmVnaW9uLCBiYW5kKTsKKwkJCX0KKwkJfQorCisJCS8qU3RlcDY6IEFkZCBvdGhlciBjaGVja2luZyBpZiBhbnkgKi8KKworCX0KKworCXBhcnNlZF9yZWdpb25fY2hhbi0+bnJfY2hhbiA9IGlkeDsKKworCWxic19wcl9kZWJ1ZygxLCAibnJjaGFuPSV4XG4iLCBwYXJzZWRfcmVnaW9uX2NoYW4tPm5yX2NoYW4pOworCWxic19kYmdfaGV4KCIxMUQ6cGFyc2VkX3JlZ2lvbl9jaGFuOiIsICh1OCAqKSBwYXJzZWRfcmVnaW9uX2NoYW4sCisJCTIgKyBDT1VOVFJZX0NPREVfTEVOICsgc2l6ZW9mKHN0cnVjdCBwYXJzZWRfcmVnaW9uX2NoYW5fMTFkKSAqIGlkeCk7CisKKwlMRUFWRSgpOworCXJldHVybiAwOworfQorCisvKioKKyAqICBAYnJpZWYgVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBzY2FuIHR5cGUgZm9yIGNoYW5uZWxzCisgKiAgQHBhcmFtIGNoYW4gICAgICAgICAgICAgICAgIGNoYW4gbnVtYmVyCisgKiAgQHBhcmFtIHBhcnNlZF9yZWdpb25fY2hhbiAgIHBvaW50ZXIgdG8gcGFyc2VkX3JlZ2lvbl9jaGFuXzExZAorICogIEByZXR1cm4gCSAgICAgICAgICAgICAgICBQQVNTSVZFIGlmIGNoYW4gaXMgdW5rbm93bjsgQUNUSVZFIGlmIGNoYW4gaXMga25vd24KKyovCit1OCBsaWJlcnRhc19nZXRfc2Nhbl90eXBlXzExZCh1OCBjaGFuLAorCQkJICBzdHJ1Y3QgcGFyc2VkX3JlZ2lvbl9jaGFuXzExZCAqIHBhcnNlZF9yZWdpb25fY2hhbikKK3sKKwl1OCBzY2FuX3R5cGUgPSBjbWRfc2Nhbl90eXBlX3Bhc3NpdmU7CisKKwlFTlRFUigpOworCisJaWYgKHdsYW5fY2hhbm5lbF9rbm93bl8xMWQoY2hhbiwgcGFyc2VkX3JlZ2lvbl9jaGFuKSkgeworCQlsYnNfcHJfZGVidWcoMSwgIjExRDogRm91bmQgYW5kIGRvIEFjdGl2ZSBTY2FuXG4iKTsKKwkJc2Nhbl90eXBlID0gY21kX3NjYW5fdHlwZV9hY3RpdmU7CisJfSBlbHNlIHsKKwkJbGJzX3ByX2RlYnVnKDEsICIxMUQ6IE5vdCBGaW5kIGFuZCBkbyBQYXNzaXZlIFNjYW5cbiIpOworCX0KKworCUxFQVZFKCk7CisJcmV0dXJuIHNjYW5fdHlwZTsKKworfQorCit2b2lkIGxpYmVydGFzX2luaXRfMTFkKHdsYW5fcHJpdmF0ZSAqIHByaXYpCit7CisJcHJpdi0+YWRhcHRlci0+ZW5hYmxlMTFkID0gMDsKKwltZW1zZXQoJihwcml2LT5hZGFwdGVyLT5wYXJzZWRfcmVnaW9uX2NoYW4pLCAwLAorCSAgICAgICBzaXplb2Yoc3RydWN0IHBhcnNlZF9yZWdpb25fY2hhbl8xMWQpKTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgd2xhbl9lbmFibGVfMTFkKHdsYW5fcHJpdmF0ZSAqIHByaXYsIHU4IGZsYWcpCit7CisJaW50IHJldDsKKworCXByaXYtPmFkYXB0ZXItPmVuYWJsZTExZCA9IGZsYWc7CisKKwkvKiBzZW5kIGNtZCB0byBGVyB0byBlbmFibGUvZGlzYWJsZSAxMUQgZnVuY3Rpb24gaW4gRlcgKi8KKwlyZXQgPSBsaWJlcnRhc19wcmVwYXJlX2FuZF9zZW5kX2NvbW1hbmQocHJpdiwKKwkJCQkgICAgY21kXzgwMl8xMV9zbm1wX21pYiwKKwkJCQkgICAgY21kX2FjdF9zZXQsCisJCQkJICAgIGNtZF9vcHRpb25fd2FpdGZvcnJzcCwKKwkJCQkgICAgT0lEXzgwMl8xMURfRU5BQkxFLAorCQkJCSAgICAmcHJpdi0+YWRhcHRlci0+ZW5hYmxlMTFkKTsKKwlpZiAocmV0KQorCQlsYnNfcHJfZGVidWcoMSwgIjExRDogRmFpbCB0byBlbmFibGUgMTFEIFxuIik7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiAgQGJyaWVmIFRoaXMgZnVuY3Rpb24gc2V0cyBET01BSU4gSU5GTyB0byBGVworICogIEBwYXJhbSBwcml2ICAgICAgIHBvaW50ZXIgdG8gd2xhbl9wcml2YXRlCisgKiAgQHJldHVybiAJICAgICAgMDsgLTEKKyovCitzdGF0aWMgaW50IHNldF9kb21haW5faW5mb18xMWQod2xhbl9wcml2YXRlICogcHJpdikKK3sKKwlpbnQgcmV0OworCisJaWYgKCFwcml2LT5hZGFwdGVyLT5lbmFibGUxMWQpIHsKKwkJbGJzX3ByX2RlYnVnKDEsICIxMUQ6IGRubGQgZG9tYWluIEluZm8gd2l0aCAxMWQgZGlzYWJsZWRcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXQgPSBsaWJlcnRhc19wcmVwYXJlX2FuZF9zZW5kX2NvbW1hbmQocHJpdiwgY21kXzgwMl8xMWRfZG9tYWluX2luZm8sCisJCQkJICAgIGNtZF9hY3Rfc2V0LAorCQkJCSAgICBjbWRfb3B0aW9uX3dhaXRmb3Jyc3AsIDAsIE5VTEwpOworCWlmIChyZXQpCisJCWxic19wcl9kZWJ1ZygxLCAiMTFEOiBGYWlsIHRvIGRubGQgZG9tYWluIEluZm9cbiIpOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiAgQGJyaWVmIFRoaXMgZnVuY3Rpb24gc2V0dXBzIHNjYW4gY2hhbm5lbHMKKyAqICBAcGFyYW0gcHJpdiAgICAgICBwb2ludGVyIHRvIHdsYW5fcHJpdmF0ZQorICogIEBwYXJhbSBiYW5kICAgICAgIGJhbmQKKyAqICBAcmV0dXJuIAkgICAgICAwCisqLworaW50IGxpYmVydGFzX3NldF91bml2ZXJzYWx0YWJsZSh3bGFuX3ByaXZhdGUgKiBwcml2LCB1OCBiYW5kKQoreworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJdTE2IHNpemUgPSBzaXplb2Yoc3RydWN0IGNoYW5fZnJlcV9wb3dlcik7CisJdTE2IGkgPSAwOworCisJbWVtc2V0KGFkYXB0ZXItPnVuaXZlcnNhbF9jaGFubmVsLCAwLAorCSAgICAgICBzaXplb2YoYWRhcHRlci0+dW5pdmVyc2FsX2NoYW5uZWwpKTsKKworCWFkYXB0ZXItPnVuaXZlcnNhbF9jaGFubmVsW2ldLm5yY2ZwID0KKwkgICAgc2l6ZW9mKGNoYW5uZWxfZnJlcV9wb3dlcl9VTl9CRykgLyBzaXplOworCWxic19wcl9kZWJ1ZygxLCAiMTFEOiBCRy1iYW5kIG5yY2ZwPSVkXG4iLAorCSAgICAgICBhZGFwdGVyLT51bml2ZXJzYWxfY2hhbm5lbFtpXS5ucmNmcCk7CisKKwlhZGFwdGVyLT51bml2ZXJzYWxfY2hhbm5lbFtpXS5DRlAgPSBjaGFubmVsX2ZyZXFfcG93ZXJfVU5fQkc7CisJYWRhcHRlci0+dW5pdmVyc2FsX2NoYW5uZWxbaV0udmFsaWQgPSAxOworCWFkYXB0ZXItPnVuaXZlcnNhbF9jaGFubmVsW2ldLnJlZ2lvbiA9IFVOSVZFUlNBTF9SRUdJT05fQ09ERTsKKwlhZGFwdGVyLT51bml2ZXJzYWxfY2hhbm5lbFtpXS5iYW5kID0gYmFuZDsKKwlpKys7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiAgQGJyaWVmIFRoaXMgZnVuY3Rpb24gaW1wbGVtZW50cyBjb21tYW5kIENNRF84MDJfMTFEX0RPTUFJTl9JTkZPCisgKiAgQHBhcmFtIHByaXYgICAgICAgcG9pbnRlciB0byB3bGFuX3ByaXZhdGUKKyAqICBAcGFyYW0gY21kICAgICAgICBwb2ludGVyIHRvIGNtZCBidWZmZXIKKyAqICBAcGFyYW0gY21kbm8gICAgICBjbWQgSUQKKyAqICBAcGFyYW0gY21kT3B0aW9uICBjbWQgYWN0aW9uCisgKiAgQHJldHVybiAJICAgICAgMAorKi8KK2ludCBsaWJlcnRhc19jbWRfODAyXzExZF9kb21haW5faW5mbyh3bGFuX3ByaXZhdGUgKiBwcml2LAorCQkJCSBzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKmNtZCwgdTE2IGNtZG5vLAorCQkJCSB1MTYgY21kb3B0aW9uKQoreworCXN0cnVjdCBjbWRfZHNfODAyXzExZF9kb21haW5faW5mbyAqcGRvbWFpbmluZm8gPQorCSAgICAmY21kLT5wYXJhbXMuZG9tYWluaW5mbzsKKwlzdHJ1Y3QgbXJ2bGlldHlwZXNfZG9tYWlucGFyYW1zZXQgKmRvbWFpbiA9ICZwZG9tYWluaW5mby0+ZG9tYWluOworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJdTggbnJfc3ViYmFuZCA9IGFkYXB0ZXItPmRvbWFpbnJlZy5ucl9zdWJiYW5kOworCisJRU5URVIoKTsKKworCWxic19wcl9kZWJ1ZygxLCAibnJfc3ViYmFuZD0leFxuIiwgbnJfc3ViYmFuZCk7CisKKwljbWQtPmNvbW1hbmQgPSBjcHVfdG9fbGUxNihjbWRubyk7CisJcGRvbWFpbmluZm8tPmFjdGlvbiA9IGNwdV90b19sZTE2KGNtZG9wdGlvbik7CisJaWYgKGNtZG9wdGlvbiA9PSBjbWRfYWN0X2dldCkgeworCQljbWQtPnNpemUgPQorCQkgICAgY3B1X3RvX2xlMTYoc2l6ZW9mKHBkb21haW5pbmZvLT5hY3Rpb24pICsgU19EU19HRU4pOworCQlsYnNfZGJnX2hleCgiMTFEOiA4MDJfMTFEX0RPTUFJTl9JTkZPOiIsICh1OCAqKSBjbWQsCisJCQkoaW50KShjbWQtPnNpemUpKTsKKwkJTEVBVkUoKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZG9tYWluLT5oZWFkZXIudHlwZSA9IGNwdV90b19sZTE2KFRMVl9UWVBFX0RPTUFJTik7CisJbWVtY3B5KGRvbWFpbi0+Y291bnRyeWNvZGUsIGFkYXB0ZXItPmRvbWFpbnJlZy5jb3VudHJ5Y29kZSwKKwkgICAgICAgc2l6ZW9mKGRvbWFpbi0+Y291bnRyeWNvZGUpKTsKKworCWRvbWFpbi0+aGVhZGVyLmxlbiA9CisJICAgIGNwdV90b19sZTE2KG5yX3N1YmJhbmQgKiBzaXplb2Yoc3RydWN0IGllZWV0eXBlc19zdWJiYW5kc2V0KSArCisJCQkgICAgIHNpemVvZihkb21haW4tPmNvdW50cnljb2RlKSk7CisKKwlpZiAobnJfc3ViYmFuZCkgeworCQltZW1jcHkoZG9tYWluLT5zdWJiYW5kLCBhZGFwdGVyLT5kb21haW5yZWcuc3ViYmFuZCwKKwkJICAgICAgIG5yX3N1YmJhbmQgKiBzaXplb2Yoc3RydWN0IGllZWV0eXBlc19zdWJiYW5kc2V0KSk7CisKKwkJY21kLT5zaXplID0gY3B1X3RvX2xlMTYoc2l6ZW9mKHBkb21haW5pbmZvLT5hY3Rpb24pICsKKwkJCQkJICAgICBkb21haW4tPmhlYWRlci5sZW4gKworCQkJCQkgICAgIHNpemVvZihzdHJ1Y3QgbXJ2bGlldHlwZXNoZWFkZXIpICsKKwkJCQkJICAgICBTX0RTX0dFTik7CisJfSBlbHNlIHsKKwkJY21kLT5zaXplID0KKwkJICAgIGNwdV90b19sZTE2KHNpemVvZihwZG9tYWluaW5mby0+YWN0aW9uKSArIFNfRFNfR0VOKTsKKwl9CisKKwlsYnNfZGJnX2hleCgiMTFEOjgwMl8xMURfRE9NQUlOX0lORk86IiwgKHU4ICopIGNtZCwgKGludCkoY21kLT5zaXplKSk7CisKKwlMRUFWRSgpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogIEBicmllZiBUaGlzIGZ1bmN0aW9uIGltcGxlbWVudHMgcHJpdmF0ZSBjbWQ6IGVuYWJsZS9kaXNhYmxlIDExRAorICogIEBwYXJhbSBwcml2ICAgIHBvaW50ZXIgdG8gd2xhbl9wcml2YXRlCisgKiAgQHBhcmFtIHdycSAgICAgcG9pbnRlciB0byB1c2VyIGRhdGEKKyAqICBAcmV0dXJuIAkgICAwIG9yIC0xCisgKi8KK2ludCBsaWJlcnRhc19jbWRfZW5hYmxlXzExZCh3bGFuX3ByaXZhdGUgKiBwcml2LCBzdHJ1Y3QgaXdyZXEgKndycSkKK3sKKwlpbnQgZGF0YSA9IDA7CisJaW50ICp2YWw7CisKKwlFTlRFUigpOworCWRhdGEgPSBTVUJDTURfREFUQSh3cnEpOworCisJbGJzX3ByX2RlYnVnKDEsICJlbmFibGUgMTFEOiAlc1xuIiwKKwkgICAgICAgKGRhdGEgPT0gMSkgPyAiZW5hYmxlIiA6ICJEaXNhYmxlIik7CisKKwl3bGFuX2VuYWJsZV8xMWQocHJpdiwgZGF0YSk7CisJdmFsID0gKGludCAqKXdycS0+dS5uYW1lOworCSp2YWwgPSBwcml2LT5hZGFwdGVyLT5lbmFibGUxMWQ7CisKKwlMRUFWRSgpOworCXJldHVybiAwOworfQorCisvKioKKyAqICBAYnJpZWYgVGhpcyBmdW5jdGlvbiBwYXJzZXMgY291bnRyeWluZm8gZnJvbSBBUCBhbmQgZG93bmxvYWQgY291bnRyeSBpbmZvIHRvIEZXCisgKiAgQHBhcmFtIHByaXYgICAgcG9pbnRlciB0byB3bGFuX3ByaXZhdGUKKyAqICBAcGFyYW0gcmVzcCAgICBwb2ludGVyIHRvIGNvbW1hbmQgcmVzcG9uc2UgYnVmZmVyCisgKiAgQHJldHVybiAJICAgMDsgLTEKKyAqLworaW50IGxpYmVydGFzX3JldF84MDJfMTFkX2RvbWFpbl9pbmZvKHdsYW5fcHJpdmF0ZSAqIHByaXYsCisJCQkJIHN0cnVjdCBjbWRfZHNfY29tbWFuZCAqcmVzcCkKK3sKKwlzdHJ1Y3QgY21kX2RzXzgwMl8xMWRfZG9tYWluX2luZm8KKwkqZG9tYWluaW5mbyA9ICZyZXNwLT5wYXJhbXMuZG9tYWluaW5mb3Jlc3A7CisJc3RydWN0IG1ydmxpZXR5cGVzX2RvbWFpbnBhcmFtc2V0ICpkb21haW4gPSAmZG9tYWluaW5mby0+ZG9tYWluOworCXUxNiBhY3Rpb24gPSBsZTE2X3RvX2NwdShkb21haW5pbmZvLT5hY3Rpb24pOworCXMxNiByZXQgPSAwOworCXU4IG5yX3N1YmJhbmQgPSAwOworCisJRU5URVIoKTsKKworCWxic19kYmdfaGV4KCIxMUQgRE9NQUlOIEluZm8gUnNwIERhdGE6IiwgKHU4ICopIHJlc3AsCisJCShpbnQpbGUxNl90b19jcHUocmVzcC0+c2l6ZSkpOworCisJbnJfc3ViYmFuZCA9IChkb21haW4tPmhlYWRlci5sZW4gLSAzKSAvIHNpemVvZihzdHJ1Y3QgaWVlZXR5cGVzX3N1YmJhbmRzZXQpOworCS8qIGNvdW50cnljb2RlIDMgYnl0ZXMgKi8KKworCWxic19wcl9kZWJ1ZygxLCAiMTFEIERvbWFpbiBJbmZvIFJlc3A6IG5yX3N1YmJhbmQ9JWRcbiIsIG5yX3N1YmJhbmQpOworCisJaWYgKG5yX3N1YmJhbmQgPiBNUlZEUlZfTUFYX1NVQkJBTkRfODAyXzExRCkgeworCQlsYnNfcHJfZGVidWcoMSwgIkludmFsaWQgTnVtcmVyIG9mIFN1YmJhbmQgcmV0dXJuZWQhIVxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlzd2l0Y2ggKGFjdGlvbikgeworCWNhc2UgY21kX2FjdF9zZXQ6CS8qUHJvYyBTZXQgYWN0aW9uICovCisJCWJyZWFrOworCisJY2FzZSBjbWRfYWN0X2dldDoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbGJzX3ByX2RlYnVnKDEsICJJbnZhbGlkIGFjdGlvbjolZFxuIiwgZG9tYWluaW5mby0+YWN0aW9uKTsKKwkJcmV0ID0gLTE7CisJCWJyZWFrOworCX0KKworCUxFQVZFKCk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiAgQGJyaWVmIFRoaXMgZnVuY3Rpb24gcGFyc2VzIGNvdW50cnlpbmZvIGZyb20gQVAgYW5kIGRvd25sb2FkIGNvdW50cnkgaW5mbyB0byBGVworICogIEBwYXJhbSBwcml2ICAgIHBvaW50ZXIgdG8gd2xhbl9wcml2YXRlCisgKiAgQHJldHVybiAJICAgMDsgLTEKKyAqLworaW50IGxpYmVydGFzX3BhcnNlX2RubGRfY291bnRyeWluZm9fMTFkKHdsYW5fcHJpdmF0ZSAqIHByaXYpCit7CisJaW50IHJldDsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCisJRU5URVIoKTsKKwlpZiAocHJpdi0+YWRhcHRlci0+ZW5hYmxlMTFkKSB7CisJCW1lbXNldCgmYWRhcHRlci0+cGFyc2VkX3JlZ2lvbl9jaGFuLCAwLAorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBwYXJzZWRfcmVnaW9uX2NoYW5fMTFkKSk7CisJCXJldCA9IHBhcnNlX2RvbWFpbl9pbmZvXzExZCgmYWRhcHRlci0+cGF0dGVtcHRlZGJzc2Rlc2MtPgorCQkJCQkgICAgICAgY291bnRyeWluZm8sIDAsCisJCQkJCSAgICAgICAmYWRhcHRlci0+cGFyc2VkX3JlZ2lvbl9jaGFuKTsKKworCQlpZiAocmV0ID09IC0xKSB7CisJCQlsYnNfcHJfZGVidWcoMSwgIjExRDogRXJyIFBhcnNlIGRvbWFpbl9pbmZvIGZyb20gQVAuLlxuIik7CisJCQlMRUFWRSgpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCW1lbXNldCgmYWRhcHRlci0+ZG9tYWlucmVnLCAwLAorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCB3bGFuXzgwMl8xMWRfZG9tYWluX3JlZykpOworCQlnZW5lcmF0ZV9kb21haW5faW5mb18xMWQoJmFkYXB0ZXItPnBhcnNlZF9yZWdpb25fY2hhbiwKKwkJCQkgICAgICAmYWRhcHRlci0+ZG9tYWlucmVnKTsKKworCQlyZXQgPSBzZXRfZG9tYWluX2luZm9fMTFkKHByaXYpOworCisJCWlmIChyZXQpIHsKKwkJCWxic19wcl9kZWJ1ZygxLCAiMTFEOiBFcnIgc2V0IGRvbWFpbkluZm8gdG8gRldcbiIpOworCQkJTEVBVkUoKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisJTEVBVkUoKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiAgQGJyaWVmIFRoaXMgZnVuY3Rpb24gZ2VuZXJhdGVzIDExRCBpbmZvIGZyb20gdXNlciBzcGVjaWZpZWQgcmVnaW9uY29kZSBhbmQgZG93bmxvYWQgdG8gRlcKKyAqICBAcGFyYW0gcHJpdiAgICBwb2ludGVyIHRvIHdsYW5fcHJpdmF0ZQorICogIEByZXR1cm4gCSAgIDA7IC0xCisgKi8KK2ludCBsaWJlcnRhc19jcmVhdGVfZG5sZF9jb3VudHJ5aW5mb18xMWQod2xhbl9wcml2YXRlICogcHJpdikKK3sKKwlpbnQgcmV0OworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJc3RydWN0IHJlZ2lvbl9jaGFubmVsICpyZWdpb25fY2hhbjsKKwl1OCBqOworCisJRU5URVIoKTsKKwlsYnNfcHJfZGVidWcoMSwgIjExRDpjdXJic3NwYXJhbXMuYmFuZFslZF1cbiIsIGFkYXB0ZXItPmN1cmJzc3BhcmFtcy5iYW5kKTsKKworCWlmIChwcml2LT5hZGFwdGVyLT5lbmFibGUxMWQpIHsKKwkJLyogdXBkYXRlIHBhcnNlZF9yZWdpb25fY2hhbl8xMTsgZG5sZCBkb21haW5pbmYgdG8gRlcgKi8KKworCQlmb3IgKGogPSAwOyBqIDwgc2l6ZW9mKGFkYXB0ZXItPnJlZ2lvbl9jaGFubmVsKSAvCisJCSAgICAgc2l6ZW9mKGFkYXB0ZXItPnJlZ2lvbl9jaGFubmVsWzBdKTsgaisrKSB7CisJCQlyZWdpb25fY2hhbiA9ICZhZGFwdGVyLT5yZWdpb25fY2hhbm5lbFtqXTsKKworCQkJbGJzX3ByX2RlYnVnKDEsICIxMUQ6WyVkXSByZWdpb25fY2hhbi0+YmFuZFslZF1cbiIsIGosCisJCQkgICAgICAgcmVnaW9uX2NoYW4tPmJhbmQpOworCisJCQlpZiAoIXJlZ2lvbl9jaGFuIHx8ICFyZWdpb25fY2hhbi0+dmFsaWQKKwkJCSAgICB8fCAhcmVnaW9uX2NoYW4tPkNGUCkKKwkJCQljb250aW51ZTsKKwkJCWlmIChyZWdpb25fY2hhbi0+YmFuZCAhPSBhZGFwdGVyLT5jdXJic3NwYXJhbXMuYmFuZCkKKwkJCQljb250aW51ZTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGogPj0gc2l6ZW9mKGFkYXB0ZXItPnJlZ2lvbl9jaGFubmVsKSAvCisJCSAgICBzaXplb2YoYWRhcHRlci0+cmVnaW9uX2NoYW5uZWxbMF0pKSB7CisJCQlsYnNfcHJfZGVidWcoMSwgIjExRDpyZWdpb25fY2hhbiBub3QgZm91bmQuIGJhbmRbJWRdXG4iLAorCQkJICAgICAgIGFkYXB0ZXItPmN1cmJzc3BhcmFtcy5iYW5kKTsKKwkJCUxFQVZFKCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQltZW1zZXQoJmFkYXB0ZXItPnBhcnNlZF9yZWdpb25fY2hhbiwgMCwKKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgcGFyc2VkX3JlZ2lvbl9jaGFuXzExZCkpOworCQl3bGFuX2dlbmVyYXRlX3BhcnNlZF9yZWdpb25fY2hhbl8xMWQocmVnaW9uX2NoYW4sCisJCQkJCQkgICAgICZhZGFwdGVyLT4KKwkJCQkJCSAgICAgcGFyc2VkX3JlZ2lvbl9jaGFuKTsKKworCQltZW1zZXQoJmFkYXB0ZXItPmRvbWFpbnJlZywgMCwKKwkJICAgICAgIHNpemVvZihzdHJ1Y3Qgd2xhbl84MDJfMTFkX2RvbWFpbl9yZWcpKTsKKwkJZ2VuZXJhdGVfZG9tYWluX2luZm9fMTFkKCZhZGFwdGVyLT5wYXJzZWRfcmVnaW9uX2NoYW4sCisJCQkJCSAmYWRhcHRlci0+ZG9tYWlucmVnKTsKKworCQlyZXQgPSBzZXRfZG9tYWluX2luZm9fMTFkKHByaXYpOworCisJCWlmIChyZXQpIHsKKwkJCWxic19wcl9kZWJ1ZygxLCAiMTFEOiBFcnIgc2V0IGRvbWFpbkluZm8gdG8gRldcbiIpOworCQkJTEVBVkUoKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCX0KKworCUxFQVZFKCk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy8xMWQuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzLzExZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiMmViZWE5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvMTFkLmgKQEAgLTAsMCArMSwxMDUgQEAKKy8qKgorICAqIFRoaXMgaGVhZGVyIGZpbGUgY29udGFpbnMgZGF0YSBzdHJ1Y3R1cmVzIGFuZAorICAqIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyBvZiA4MDIuMTFkCisgICovCisjaWZuZGVmIF9XTEFOXzExRF8KKyNkZWZpbmUgX1dMQU5fMTFEXworCisjaW5jbHVkZSAidHlwZXMuaCIKKyNpbmNsdWRlICJkZWZzLmgiCisKKyNkZWZpbmUgVU5JVkVSU0FMX1JFR0lPTl9DT0RFCQkJMHhmZgorCisvKiogKEJlYWNvbnNpemUoMjU2KS01KElFSWQsbGVuLGNvbnRyeXN0cigzKSkvMyhGaXJzdENoYW4sTm9PZkNoYW4sTWF4UHdyKQorICovCisjZGVmaW5lIE1SVkRSVl9NQVhfU1VCQkFORF84MDJfMTFECQk4MworCisjZGVmaW5lIENPVU5UUllfQ09ERV9MRU4JCQkzCisjZGVmaW5lIE1BWF9OT19PRl9DSEFOIAkJCQk0MAorCitzdHJ1Y3QgY21kX2RzX2NvbW1hbmQ7CisKKy8qKiBEYXRhIHN0cnVjdHVyZSBmb3IgQ291bnRyeSBJRSovCitzdHJ1Y3QgaWVlZXR5cGVzX3N1YmJhbmRzZXQgeworCXU4IGZpcnN0Y2hhbjsKKwl1OCBucmNoYW47CisJdTggbWF4dHhwd3I7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGllZWV0eXBlc19jb3VudHJ5aW5mb3NldCB7CisJdTggZWxlbWVudF9pZDsKKwl1OCBsZW47CisJdTggY291bnRyeWNvZGVbQ09VTlRSWV9DT0RFX0xFTl07CisJc3RydWN0IGllZWV0eXBlc19zdWJiYW5kc2V0IHN1YmJhbmRbMV07Cit9OworCitzdHJ1Y3QgaWVlZXR5cGVzX2NvdW50cnlpbmZvZnVsbHNldCB7CisJdTggZWxlbWVudF9pZDsKKwl1OCBsZW47CisJdTggY291bnRyeWNvZGVbQ09VTlRSWV9DT0RFX0xFTl07CisJc3RydWN0IGllZWV0eXBlc19zdWJiYW5kc2V0IHN1YmJhbmRbTVJWRFJWX01BWF9TVUJCQU5EXzgwMl8xMURdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBtcnZsaWV0eXBlc19kb21haW5wYXJhbXNldCB7CisJc3RydWN0IG1ydmxpZXR5cGVzaGVhZGVyIGhlYWRlcjsKKwl1OCBjb3VudHJ5Y29kZVtDT1VOVFJZX0NPREVfTEVOXTsKKwlzdHJ1Y3QgaWVlZXR5cGVzX3N1YmJhbmRzZXQgc3ViYmFuZFsxXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgY21kX2RzXzgwMl8xMWRfZG9tYWluX2luZm8geworCXUxNiBhY3Rpb247CisJc3RydWN0IG1ydmxpZXR5cGVzX2RvbWFpbnBhcmFtc2V0IGRvbWFpbjsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiogZG9tYWluIHJlZ3VsYXRvcnkgaW5mb3JtYXRpb24gKi8KK3N0cnVjdCB3bGFuXzgwMl8xMWRfZG9tYWluX3JlZyB7CisJLyoqIGNvdW50cnkgQ29kZSovCisJdTggY291bnRyeWNvZGVbQ09VTlRSWV9DT0RFX0xFTl07CisJLyoqIE5vLiBvZiBzdWJiYW5kKi8KKwl1OCBucl9zdWJiYW5kOworCXN0cnVjdCBpZWVldHlwZXNfc3ViYmFuZHNldCBzdWJiYW5kW01SVkRSVl9NQVhfU1VCQkFORF84MDJfMTFEXTsKK307CisKK3N0cnVjdCBjaGFuX3Bvd2VyXzExZCB7CisJdTggY2hhbjsKKwl1OCBwd3I7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IHBhcnNlZF9yZWdpb25fY2hhbl8xMWQgeworCXU4IGJhbmQ7CisJdTggcmVnaW9uOworCXM4IGNvdW50cnljb2RlW0NPVU5UUllfQ09ERV9MRU5dOworCXN0cnVjdCBjaGFuX3Bvd2VyXzExZCBjaGFucHdyW01BWF9OT19PRl9DSEFOXTsKKwl1OCBucl9jaGFuOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCByZWdpb25fY29kZV9tYXBwaW5nIHsKKwl1OCByZWdpb25bQ09VTlRSWV9DT0RFX0xFTl07CisJdTggY29kZTsKK307CisKK3U4IGxpYmVydGFzX2dldF9zY2FuX3R5cGVfMTFkKHU4IGNoYW4sCisJCQkgIHN0cnVjdCBwYXJzZWRfcmVnaW9uX2NoYW5fMTFkICpwYXJzZWRfcmVnaW9uX2NoYW4pOworCit1MzIgbGliZXJ0YXNfY2hhbl8yX2ZyZXEodTggY2hhbiwgdTggYmFuZCk7CisKK2VudW0gc3RhdGVfMTFkIGxpYmVydGFzX2dldF9zdGF0ZV8xMWQod2xhbl9wcml2YXRlICogcHJpdik7CisKK3ZvaWQgbGliZXJ0YXNfaW5pdF8xMWQod2xhbl9wcml2YXRlICogcHJpdik7CisKK2ludCBsaWJlcnRhc19zZXRfdW5pdmVyc2FsdGFibGUod2xhbl9wcml2YXRlICogcHJpdiwgdTggYmFuZCk7CisKK2ludCBsaWJlcnRhc19jbWRfODAyXzExZF9kb21haW5faW5mbyh3bGFuX3ByaXZhdGUgKiBwcml2LAorCQkJCSBzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKmNtZCwgdTE2IGNtZG5vLAorCQkJCSB1MTYgY21kT3B0aW9uKTsKKworaW50IGxpYmVydGFzX2NtZF9lbmFibGVfMTFkKHdsYW5fcHJpdmF0ZSAqIHByaXYsIHN0cnVjdCBpd3JlcSAqd3JxKTsKKworaW50IGxpYmVydGFzX3JldF84MDJfMTFkX2RvbWFpbl9pbmZvKHdsYW5fcHJpdmF0ZSAqIHByaXYsCisJCQkJIHN0cnVjdCBjbWRfZHNfY29tbWFuZCAqcmVzcCk7CisKK2ludCBsaWJlcnRhc19wYXJzZV9kbmxkX2NvdW50cnlpbmZvXzExZCh3bGFuX3ByaXZhdGUgKiBwcml2KTsKKworaW50IGxpYmVydGFzX2NyZWF0ZV9kbmxkX2NvdW50cnlpbmZvXzExZCh3bGFuX3ByaXZhdGUgKiBwcml2KTsKKworI2VuZGlmCQkJCS8qIF9XTEFOXzExRF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL0xJQ0VOU0UgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9MSUNFTlNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NjI3NDIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9MSUNFTlNFCkBAIC0wLDAgKzEsMTYgQEAKKyAgQ29weXJpZ2h0IChjKSAyMDAzLTIwMDYsIE1hcnZlbGwgSW50ZXJuYXRpb25hbCBMdGQuCisgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAgbW9yZSBkZXRhaWxzLgorCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAgdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5YzkzNTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9NYWtlZmlsZQpAQCAtMCwwICsxLDIxIEBACisjIEVYVFJBX0NGTEFHUyArPSAtV3BhY2tlZAorCit1c2I4eHh4LW9ianMgOj0gbWFpbi5vIGZ3Lm8gd2V4dC5vIFwKKwkJcngubyB0eC5vIGNtZC5vIAkgIFwKKwkJY21kcmVzcC5vIHNjYW4ubwkgIFwKKwkJam9pbi5vIDExZC5vIAkJICBcCisJCWlvY3RsLm8gZGVidWdmcy5vCSAgXAorCQlldGh0b29sLm8gYXNzb2MubworCitpZmVxICgkKENPTkZJR19MSUJFUlRBU19VU0JfREVCVUcpLCB5KQorRVhUUkFfQ0ZMQUdTICs9IC1EREVCVUcgLURQUk9DX0RFQlVHCitlbmRpZgorCisKKyMgVGhpcyBpcyBuZWVkZWQgdG8gc3VwcG9ydCB0aGUgbmV3ZXIgYm9vdDIgYm9vdGxvYWRlciAodiA+PSAzMTA0KQorRVhUUkFfQ0ZMQUdTICs9IC1EU1VQUE9SVF9CT09UX0NPTU1BTkQKK3VzYjh4eHgtb2JqcyArPSBpZl9ib290Y21kLm8KK3VzYjh4eHgtb2JqcyArPSBpZl91c2IubworCitvYmotJChDT05GSUdfTElCRVJUQVNfVVNCKSArPSB1c2I4eHh4Lm8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvUkVBRE1FIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4OGRhNGMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9SRUFETUUKQEAgLTAsMCArMSwxMDQ0IEBACis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQkJUkVBRE1FIGZvciBVU0I4Mzg4CisKKyAoYykgQ29weXJpZ2h0IKkgMjAwMy0yMDA2LCBNYXJ2ZWxsIEludGVybmF0aW9uYWwgTHRkLgorIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworIFRoaXMgc29mdHdhcmUgZmlsZSAodGhlICJGaWxlIikgaXMgZGlzdHJpYnV0ZWQgYnkgTWFydmVsbCBJbnRlcm5hdGlvbmFsCisgTHRkLiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiwgSnVuZSAxOTkxCisgKHRoZSAiTGljZW5zZSIpLiAgWW91IG1heSB1c2UsIHJlZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoaXMgRmlsZSBpbgorIGFjY29yZGFuY2Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIExpY2Vuc2UsIGEgY29weSBvZiB3aGljaAorIGlzIGF2YWlsYWJsZSBhbG9uZyB3aXRoIHRoZSBGaWxlIGluIHRoZSBsaWNlbnNlLnR4dCBmaWxlIG9yIGJ5IHdyaXRpbmcgdG8KKyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorIDAyMTExLTEzMDcgb3Igb24gdGhlIHdvcmxkd2lkZSB3ZWIgYXQgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCisKKyBUSEUgRklMRSBJUyBESVNUUklCVVRFRCBBUy1JUywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgQU5EIFRIRQorIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyBBUkUgRVhQUkVTU0xZIERJU0NMQUlNRUQuICBUaGUgTGljZW5zZSBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbHMgYWJvdXQKKyB0aGlzIHdhcnJhbnR5IGRpc2NsYWltZXIuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCis9PT09PT09PT09PT09PT09PT09PT0KK0RSSVZFUiBMT0FESU5HCis9PT09PT09PT09PT09PT09PT09PT0KKworCW8uIENvcHkgdGhlIGZpcm13YXJlIGltYWdlIChlLmcuIHVzYjgzODguYmluKSB0byAvbGliL2Zpcm13YXJlLworCisJby4gTG9hZCBkcml2ZXIgYnkgdXNpbmcgdGhlIGZvbGxvd2luZyBjb21tYW5kOgorCisJCWluc21vZCB1c2I4Mzg4LmtvIFtmd19uYW1lPXVzYjgzODguYmluXQorCis9PT09PT09PT09PT09PT09PT09PT0KK0lXUFJJViBDT01NQU5ECis9PT09PT09PT09PT09PT09PT09PT0KKworTkFNRQorCVRoaXMgbWFudWFsIGRlc2NyaWJlcyB0aGUgdXNhZ2Ugb2YgcHJpdmF0ZSBjb21tYW5kcyB1c2VkIGluIE1hcnZlbGwgV0xBTgorCUxpbnV4IERyaXZlci4gQWxsIHRoZSBjb21tYW5kcyBhdmFpbGFibGUgaW4gV2xhbmNvbmZpZyB3aWxsIG5vdCBiZSBhdmFpbGFibGUKKwlpbiB0aGUgaXdwcml2LgorCitTWU5PUFNJUworCWl3cHJpdiA8ZXRoWD4gPGNvbW1hbmQ+IFtzdWItY29tbWFuZF0gLi4uCisKKwlpd3ByaXYgZXRoWCB2ZXJzaW9uCisJaXdwcml2IGV0aFggc2NhbnR5cGUgW3N1Yi1jb21tYW5kXQorCWl3cHJpdiBldGhYIGdldFNOUiA8bj4KKwlpd3ByaXYgZXRoWCBnZXRORiA8bj4KKwlpd3ByaXYgZXRoWCBnZXRSU1NJIDxuPgorCWl3cHJpdiBldGhYIHNldHJ4YW50IDxuPgorCWl3cHJpdiBldGhYIGdldHJ4YW50CisJaXdwcml2IGV0aFggc2V0dHhhbnQgPG4+CisJaXdwcml2IGV0aFggZ2V0dHhhbnQKKwlpd3ByaXYgZXRoWCBhdXRoYWxncyA8bj4KKwlpd3ByaXYgZXRoWCBwcmUtVEJUVCA8bj4KKwlpd3ByaXYgZXRoWCA4MDIxeGF1dGhhbGdzIDxuPgorCWl3cHJpdiBldGhYIGVuY3J5cHRpb25tb2RlIDxuPgorCWl3cHJpdiBldGhYIHNldHJlZ2lvbmNvZGUgPG4+CisJaXdwcml2IGV0aFggZ2V0cmVnaW9uY29kZQorCWl3cHJpdiBldGhYIHNldGJjbmF2ZyA8bj4KKwlpd3ByaXYgZXRoWCBnZXRiY25hdmcKKwlpd3ByaXYgZXRoWCBzZXRkYXRhYXZnIDxuPgorCWl3cHJpdiBldGhYIHNldGxpc3RlbmludGVyIDxuPgorCWl3cHJpdiBldGhYIGdldGxpc3RlbmludGVyCisJaXdwcml2IGV0aFggc2V0bXVsdGlwbGVkdGltIDxuPgorCWl3cHJpdiBldGhYIGdldG11bHRpcGxlZHRpbQorCWl3cHJpdiBldGhYIGF0aW13aW5kb3cgPG4+CisJaXdwcml2IGV0aFggZGVhdXRoCisJaXdwcml2IGV0aFggYWRob2NzdG9wCisJaXdwcml2IGV0aFggcmFkaW9vbgorCWl3cHJpdiBldGhYIHJhZGlvb2ZmCisJaXdwcml2IGV0aFggcmVhc3NvLW9uCisJaXdwcml2IGV0aFggcmVhc3NvLW9mZgorCWl3cHJpdiBldGhYIHNjYW5tb2RlICBbc3ViLWNvbW1hbmRdCisJaXdwcml2IGV0aFggc2V0d3BhaWUgPG4+CisJaXdwcml2IGV0aFggd2xhbmlkbGUtb2ZmCisJaXdwcml2IGV0aFggd2xhbmlkbGUtb24KKwlpd3ByaXYgZXRoWCBnZXRjaXMKKwlpd3ByaXYgZXRoWCBnZXRsb2cKKwlpd3ByaXYgZXRoWCBnZXRhZGhvY3N0YXR1cworCWl3cHJpdiBldGhYIGFkaG9jZ3JhdGUgPG4+CisKK1ZlcnNpb24gNCBDb21tYW5kOgorCWl3cHJpdiBldGhYIGluYWN0dml0eXRvIDxuPgorCWl3cHJpdiBldGhYIHNsZWVwcGQgPG4+CisJaXdwcml2IGV0aFggZW5hYmxlMTFkIDxuPgorCWl3cHJpdiBldGhYIHRwY2NmZyA8bj4KKwlpd3ByaXYgZXRoWCBwb3dlcmNmZyA8bj4KKwlpd3ByaXYgZXRoWCBzZXRhZmMgPG4+CisJaXdwcml2IGV0aFggZ2V0YWZjCisKK1ZlcnNpb24gNSBDb21tYW5kOgorCWl3cHJpdiBldGhYIGxlZGdwaW8gPG4+CisJaXdwcml2IGV0aFggc2NhbnByb2JlcyA8bj4KKwlpd3ByaXYgZXRoWCBsb2xpc3RlbmludGVyIDxuPgorCWl3cHJpdiBldGhYIHJhdGVhZGFwdCA8bj4gPG0+CisJaXdwcml2IGV0aFggdHhjb250cm9sIDxuPgorCWl3cHJpdiBldGhYIHBzbnVsbGludGVydmFsIDxuPgorCWl3cHJpdiBldGhYIHByZXNjYW4gPG4+CisJaXdwcml2IGV0aFggZ2V0cnhpbmZvCisJaXdwcml2IGV0aFggZ2V0dHhyYXRlCisJaXdwcml2IGV0aFggYmVhY29uaW50ZXJ2YWwKKworQlQgQ29tbWFuZHM6CisJVGhlIGJsaW5kaW5nIHRhYmxlIChCVCkgY29udGFpbnMgYSBsaXN0IG9mIG1hYyBhZGRyZXNzZXMgdGhhdCBzaG91bGQgYmUKKwlpZ25vcmVkIGJ5IHRoZSBmaXJtd2FyZS4gIEl0IGlzIHByaW1hcmlseSB1c2VkIGZvciBkZWJ1Z2dpbmcgYW5kCisJdGVzdGluZyBuZXR3b3Jrcy4gIEl0IGNhbiBiZSBlZGl0ZWQgYW5kIGluc3BlY3RlZCB3aXRoIHRoZSBmb2xsb3dpbmcKKwljb21tYW5kczoKKworCWl3cHJpdiBldGhYIGJ0X3Jlc2V0CisJaXdwcml2IGV0aFggYnRfYWRkIDxtYWNfYWRkcmVzcz4KKwlpd3ByaXYgZXRoWCBidF9kZWwgPG1hY19hZGRyZXNzPgorCWl3cHJpdiBldGhYIGJ0X2xpc3QgPGlkPgorCitGV1QgQ29tbWFuZHM6CisJVGhlIGZvcndhcmRpbmcgdGFibGUgKEZXVCkgaXMgYSBmZWF0dXJlIHVzZWQgdG8gbWFuYWdlIG1lc2ggbmV0d29yaworCXJvdXRpbmcgaW4gdGhlIGZpcm13YXJlLiAgVGhlIEZXVCBpcyBlc3NlbnRpYWxseSBhIHJvdXRpbmcgdGFibGUgdGhhdAorCWFzc29jaWF0ZXMgYSBkZXN0aW5hdGlvbiBtYWMgYWRkcmVzcyAoZGEpIHdpdGggYSBuZXh0IGhvcCByZWNlaXZlcgorCWFkZHJlc3MgKHJhKS4gIFRoZSBGV1QgY2FuIGJlIGluc3BlY3RlZCBhbmQgZWRpdGVkIHdpdGggdGhlIGZvbGxvd2luZworCWl3cHJpdiBjb21tYW5kcywgd2hpY2ggYXJlIGRlc2NyaWJlZCBpbiBncmVhdGVyIGRldGFpbCBiZWxvdy4KKwlFdmVudHVhbGx5LCB0aGUgdGFibGUgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IG1haW50YWluZWQgYnkgYSBjdXN0b20KKwlyb3V0aW5nIHByb3RvY29sLgorCisJTk9URTogRldUIGNvbW1hbmRzIHJlcGxhY2UgdGhlIHByZXZpb3VzIERGVCBjb21tYW5kcy4gIFdoYXQgd2VyZSB0aGUgREZUCisJY29tbWFuZHM/LCB5b3UgbWlnaHQgYXNrLiAgVGhleSB3ZXJlIGFuIGVhcmxpZXIgQVBJIHRvIHRoZSBmaXJtd2FyZSB0aGF0CisJaW1wbGVtZW50ZWQgYSBzaW1wbGUgTUFDLWxheWVyIGZvcndhcmRpbmcgbWVjaGFuaXNtLiAgSW4gdGhlIHVubGlrZWx5CisJZXZlbnQgdGhhdCB5b3Ugd2VyZSB1c2luZyB0aGVzZSBjb21tYW5kcywgeW91IG11c3QgbWlncmF0ZSB0byB0aGUgbmV3CisJRldUIGNvbW1hbmRzIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGFjaGlldmUgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eS4KKworCWl3cHJpdiBldGhYIGZ3dF9hZGQgW3BhcmFtZXRlcnNdCisJaXdwcml2IGV0aFggZnd0X2RlbCBbcGFyYW1ldGVyc10KKwlpd3ByaXYgZXRoWCBmd3RfbG9va3VwIFtwYXJhbWV0ZXJzXQorCWl3cHJpdiBldGhYIGZ3dF9saXN0IFtwYXJhbWV0ZXJzXQorCWl3cHJpdiBldGhYIGZ3dF9saXN0X3JvdXRlIFtwYXJhbWV0ZXJzXQorCWl3cHJpdiBldGhYIGZ3dF9saXN0X25laWdoIFtwYXJhbWV0ZXJzXQorCWl3cHJpdiBldGhYIGZ3dF9yZXNldCBbcGFyYW1ldGVyc10KKwlpd3ByaXYgZXRoWCBmd3RfY2xlYW51cAorCWl3cHJpdiBldGhYIGZ3dF90aW1lCisKK01FU0ggQ29tbWFuZHM6CisKKwlUaGUgTUVTSCBjb21tYW5kcyBhcmUgdXNlZCB0byBjb25maWd1cmUgdmFyaW91cyBmZWF0dXJlcyBvZiB0aGUgbWVzaAorCXJvdXRpbmcgcHJvdG9jb2wuICBUaGUgZm9sbG93aW5nIGNvbW1hbmRzIGFyZSBzdXBwb3J0ZWQ6CisKKwlpd3ByaXYgZXRoWCBtZXNoX2dldF90dGwKKwlpd3ByaXYgZXRoWCBtZXNoX3NldF90dGwgdHRsCisKK0RFU0NSSVBUSU9OCisJVGhvc2UgY29tbWFuZHMgYXJlIHVzZWQgdG8gc2VuZCBhZGRpdGlvbmFsIGNvbW1hbmRzIHRvIHRoZSBNYXJ2ZWxsIFdMQU4KKwljYXJkIHZpYSB0aGUgTGludXggZGV2aWNlIGRyaXZlci4KKworCVRoZSBldGhYIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIG5ldHdvcmsgZGV2aWNlIHRoYXQgaXMgdG8gYmUgdXNlZCB0bworCQlwZXJmb3JtIHRoaXMgY29tbWFuZCBvbi4gaXQgY291bGQgYmUgZXRoMCwgZXRoMSBldGMuCisKK3ZlcnNpb24KKwlUaGlzIGlzIHVzZWQgdG8gZ2V0IHRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlIGRyaXZlciBhbmQgdGhlIGZpcm13YXJlLgorCitzY2FudHlwZQorCVRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIHNldCB0aGUgc2NhbiB0eXBlIHRvIGJlIHVzZWQgYnkgdGhlIGRyaXZlciBpbgorCXRoZSBzY2FuIGNvbW1hbmQuIFRoaXMgc2V0dGluZyB3aWxsIG5vdCBiZSB1c2VkIHdoaWxlIHBlcmZvcm1pbmcgYSBzY2FuCisJZm9yIGEgc3BlY2lmaWMgU1NJRCwgYXMgaXQgaXMgYWx3YXlzIGRvbmUgd2l0aCBzY2FuIHR5cGUgYmVpbmcgYWN0aXZlLgorCisJd2hlcmUgdGhlIHN1Yi1jb21tYW5kcyBhcmU6IC0KKwkJCWFjdGl2ZSAJLS0gdG8gc2V0IHRoZSBzY2FuIHR5cGUgdG8gYWN0aXZlCisJCQlwYXNzaXZlIC0tIHRvIHNldCB0aGUgc2NhbiB0eXBlIHRvIHBhc3NpdmUKKwkJCWdldCAJLS0gdG8gZ2V0IHRoZSBzY2FuIHR5cGUgc2V0IGluIHRoZSBkcml2ZXIKKworZ2V0U05SCisJVGhpcyBjb21tYW5kIGdldHMgdGhlIGF2ZXJhZ2UgYW5kIG5vbiBhdmVyYWdlIHZhbHVlIG9mIFNpZ25hbCB0byBOb2lzZQorCVJhdGlvIG9mIEJlYWNvbiBhbmQgRGF0YS4KKworCXdoZXJlIHZhbHVlIGlzOi0KKwkJCTAgCS0tIEJlYWNvbiBub24tYXZlcmFnZS4KKwkJCTEgCS0tIEJlYWNvbiBhdmVyYWdlLgorCQkJMiAJLS0gRGF0YSBub24tYXZlcmFnZS4KKwkJCTMgCS0tIERhdGEgYXZlcmFnZS4KKworCUlmIG5vIHZhbHVlIGlzIGdpdmVuLCBhbGwgZm91ciB2YWx1ZXMgYXJlIHJldHVybmVkIGluIHRoZSBvcmRlciBtZW50aW9uZWQKKwlhYm92ZS4KKworCU5vdGU6IFRoaXMgY29tbWFuZCBpcyBhdmFpbGFibGUgb25seSB3aGVuIFNUQSBpcyBjb25uZWN0ZWQuCisKK2dldFJTU0kKKwlUaGlzIGNvbW1hbmQgZ2V0cyB0aGUgYXZlcmFnZSBhbmQgbm9uIGF2ZXJhZ2UgdmFsdWUgb3MgUmVjZWl2ZSBTaWduYWwKKwlTdHJlbmd0aCBvZiBCZWFjb24gYW5kIERhdGEuCisKKwl3aGVyZSB2YWx1ZSBpczotCisJCQkwIAktLSBCZWFjb24gbm9uLWF2ZXJhZ2UuCisJCQkxIAktLSBCZWFjb24gYXZlcmFnZS4KKwkJCTIgCS0tIERhdGEgbm9uLWF2ZXJhZ2UuCisJCQkzIAktLSBEYXRhIGF2ZXJhZ2UuCisKKwlOb3RlOiBUaGlzIGNvbW1hbmQgaXMgYXZhaWxhYmxlIG9ubHkgd2hlbiBTVEEgaXMgY29ubmVjdGVkLgorCitnZXRORgorCVRoaXMgY29tbWFuZCBnZXRzIHRoZSBhdmVyYWdlIGFuZCBub24gYXZlcmFnZSB2YWx1ZSBvZiBOb2lzZSBGbG9vciBvZgorCUJlYWNvbiBhbmQgRGF0YS4KKworCXdoZXJlIHZhbHVlIGlzOi0KKwkJCTAgCS0tIEJlYWNvbiBub24tYXZlcmFnZS4KKwkJCTEgCS0tIEJlYWNvbiBhdmVyYWdlLgorCQkJMiAJLS0gRGF0YSBub24tYXZlcmFnZS4KKwkJCTMgCS0tIERhdGEgYXZlcmFnZS4KKworCU5vdGU6IFRoaXMgY29tbWFuZCBpcyBhdmFpbGFibGUgb25seSB3aGVuIFNUQSBpcyBjb25uZWN0ZWQuCisKK3NldHJ4YW50CisJVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gc2V0IHRoZSBtb2RlIGZvciBSeCBhbnRlbm5hLgorCisJVGhlIG9wdGlvbnMgdGhhdCBjYW4gYmUgc2VudCBhcmU6LQorCQkJMSAJLS0gQW50ZW5uYSAxLgorCQkJMiAJLS0gQW50ZW5uYSAyLgorCQkJMHhGRkZGIAktLSBEaXZlcnNpdHkuCisKKwlVc2FnZToKKwkJaXdwcml2IGV0aFggc2V0cnhhbnQgMHgwMTogc2VsZWN0IEFudGVubmEgMS4KKworZ2V0cnhhbnQKKwlUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byBnZXQgdGhlIG1vZGUgZm9yIFJ4IGFudGVubmEuCisKKworc2V0dHhhbnQKKwlUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byBzZXQgdGhlIG1vZGUgZm9yIFR4IGFudGVubmEuCisJCVRoZSBvcHRpb25zIHRoYXQgY2FuIGJlIHNlbnQgYXJlOi0KKwkJCTEgCS0tIEFudGVubmEgMS4KKwkJCTIgCS0tIEFudGVubmEgMi4KKwkJCTB4RkZGRiAJLS0gRGl2ZXJzaXR5LgorCVVzYWdlOgorCQlpd3ByaXYgZXRoWCBzZXR0eGFudCAweDAxOiBzZWxlY3QgQW50ZW5uYSAxLgorCitnZXR0eGFudAorCVRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIGdldCB0aGUgbW9kZSBmb3IgVHggYW50ZW5uYS4KKworYXV0aGFsZ3MKKwlUaGlzIGNvbW1hbmQgaXMgdXNlZCBieSB0aGUgV1BBIHN1cHBsaWNhbnQgdG8gc2V0IHRoZSBhdXRoZW50aWNhdGlvbgorCWFsZ29yaXRobXMgaW4gdGhlIHN0YXRpb24uCisKKzgwMjF4YXV0aGFsZ3MKKwlUaGlzIGNvbW1hbmQgaXMgdXNlZCBieSB0aGUgV1BBIHN1cHBsaWNhbnQgdG8gc2V0IHRoZSA4MDIxLnggYXV0aGVudGljYXRpb24gYWxnb3JpdGhtIHR5cGUKKwlzdGF0aW9uLgorCisJd2hlcmUgdmFsdWVzIGNhbiBiZTotCisJCQkxIAktLSBOb25lCisJCQkyIAktLSBMRUFQCisJCQk0IAktLSBUTFMKKwkJCTggCS0tIFRUTHMKKwkJCTE2CS0tIE1ENQorCisKK2VuY3J5cHRpb25tb2RlCisJVGhpcyBjb21tYW5kIGlzIHVzZWQgYnkgdGhlIFdQQSBzdXBwbGljYW50IHRvIHNldCB0aGUgZW5jcnlwdGlvbiBhbGdvcml0aG0uCisKKwl3aGVyZSB2YWx1ZXMgY2FuIGJlOi0KKwkJCTAgCS0tIE5PTkUKKwkJCTEgCS0tIFdFUDQwCisJCQkyIAktLSBUS0lQCisJCQkzIAktLSBDQ01QCisJCQk0IAktLSBXRVAxMDQKKworcHJlLVRCVFQKKwlUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byBzZXQgcHJlLVRCVFQgdGltZSBwZXJpb2Qgd2hlcmUgdmFsdWUgaXMgaW4gbWljcm9zZWNvbmRzLgorCitzZXRyZWdpb25jb2RlCisJVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gc2V0IHRoZSByZWdpb24gY29kZSBpbiB0aGUgc3RhdGlvbi4KKwl3aGVyZSB2YWx1ZSBpcyAncmVnaW9uIGNvZGUnIGZvciB2YXJpb3VzIHJlZ2lvbnMgbGlrZQorCVVTQSBGQ0MsIENhbmFkYSBJQywgU3BhaW4sIEZyYW5jZSwgRXVyb3BlIEVUU0ksCUphcGFuIC4uLgorCisJVXNhZ2U6CisJCWl3cHJpdiBldGhYIHNldHJlZ2lvbmNvZGUgMHgxMDogc2V0IHJlZ2lvbiBjb2RlIHRvIFVTQSAoMHgxMCkuCisKK2dldHJlZ2lvbmNvZGUKKwlUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byBnZXQgdGhlIHJlZ2lvbiBjb2RlIGluZm9ybWF0aW9uIHNldCBpbiB0aGUKKwlzdGF0aW9uLgorCitzZXRiY25hdmcKKwlTZXQgdGhlIHdlaWdodGluZyBmYWN0b3IgZm9yIGNhbGN1bGF0aW5nIFJTU0kuCisKK2dldGJjbmF2ZworCUdldCB3ZWlnaHRpbmcgZmFjdG9yIGZvciBjYWxjdWxhdGluZyBSU1NJLgorCitzZXRkYXRhYXZnCisJU2V0IHRoZSB3ZWlnaHRpbmcgZmFjdG9yIGZvciBjYWxjdWxhdGluZyBTTlIuCisKK3NldGxpc3RlbmludGVyCisJVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gc2V0IHRoZSBsaXN0ZW4gaW50ZXJ2YWwgaW4gdGhlCisJc3RhdGlvbi4KKworCXdoZXJlIHRoZSB2YWx1ZSByYW5nZXMgYmV0d2VlbiAxIC0gMjU1CisKK2dldGxpc3RlbmludGVyCisJVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gZ2V0IHRoZSBsaXN0ZW4gaW50ZXJ2YWwgdmFsdWUgc2V0IGluIHRoZQorCXN0YXRpb24uCisKK3NldG11bHRpcGxlZHRpbQorCVRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIHNldCB0aGUgbXVsdGlwbGUgZHRpbSB2YWx1ZSBpbiB0aGUKKwlzdGF0aW9uLgorCQl3aGVyZSB0aGUgdmFsdWUgaXMgMSwyLDMsNCw1LDB4ZmZmZQorCQkweGZmZmUgbWVhbnMgdGhlIGZpcm13YXJlIHdpbGwgdXNlIGxpc3RlbiBpbnRlcnZhbCBpbiBhc3NvY2lhdGlvbgorCQljb21tYW5kIGZvciB3YWtpbmcgdXAKKworZ2V0bXVsdGlwbGVkdGltCisJVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gZ2V0IHRoZSBtdWx0aXBsZSBkdGltIHZhbHVlIHNldCBpbiB0aGUgc3RhdGlvbi4KKworYXRpbXdpbmRvdworCVRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIHNldCB0aGUgYXRpbSB2YWx1ZSBpbiB0aGUKKwlzdGF0aW9uLgorCisJd2hlcmUgdGhlIHZhbHVlIHJhbmdlcyBiZXR3ZWVuIDAgLSA1MAorCitkZWF1dGgKKwlUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byBzZW5kIHRoZSBkZS1hdXRoZW50aWNhdGlvbiB0byB0aGUgQVAgd2l0aCB3aGljaAorCXRoZSBzdGF0aW9uIGlzIGFzc29jaWF0ZWQuIFRoaXMgY29tbWFuZCBpcyB2YWxpZCBvbmx5IHdoZW4KKwlzdGF0aW9uIGlzIGluIEluZnJhc3RydWN0dXJlIG1vZGUuCisKKwlOb3RlOiBUaGlzIGNvbW1hbmQgaXMgYXZhaWxhYmxlIG9ubHkgd2hlbiBTVEEgaXMgY29ubmVjdGVkLgorCithZGhvY3N0b3AKKwlUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byBzdG9wIGJlYWNvbiB0cmFuc21pc3Npb24gZnJvbSB0aGUgc3RhdGlvbiBhbmQKKwlnbyBpbnRvIGlkbGUgc3RhdGUgaW4gYWQtaG9jIG1vZGUuCisKKwlOb3RlOiBUaGlzIGNvbW1hbmQgaXMgYXZhaWxhYmxlIG9ubHkgd2hlbiBTVEEgaXMgY29ubmVjdGVkLgorCityYWRpb29uCisJVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gdHVybiBvbiB0aGUgUkYgYW50ZW5uYS4KKworcmFkaW9vZmYKKwlUaGlzIGNvbW1hbmQgaXMgc3VlZCB0byB0dXJuIG9mZiB0aGUgUkYgYW50ZW5uYS4KKworc2Nhbm1vZGUKKwlUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byBzZXQgdGhlIHN0YXRpb24gdG8gc2NhbiBmb3IgZWl0aGVyIElCU1MKKwluZXR3b3JrcyBvciBCU1MgbmV0d29ya3Mgb3IgYm90aCBCU1MgYW5kIElCU1MgbmV0d29ya3MuIFRoaXMKKwljb21tYW5kIGNhbiBiZSB1c2VkIHdpdGggc3ViIGNvbW1hbmRzLAorCisJd2hlcmUgdGhlIHZhbHVlIGZvcgorCQkJYnNzIAktLSBTY2FuIEFsbCB0aGUgQlNTIG5ldHdvcmtzLgorCQkJaWJzcyAJLS0gU2NhbiBBbGwgdGhlIElCU1MgbmV0d29ya3MuCisJCQlhbnkgCS0tIFNjYW4gYm90aCBCU1MgYW5kIElCU1MgbmV0d29ya3MuCisKKworCitzZXR3cGFpZQorCVRoaXMgY29tbWFuZCBpcyB1c2VkIGJ5IFdQQSBzdXBwbGljYW50IHRvIHNlbmQgdGhlIFdQQS1JRSB0byB0aGUgZHJpdmVyLgorCit3bGFuaWRsZS1vZmYKKwlUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byBnZXQgaW50byBpZGxlIHN0YXRlLgorCisJTm90ZTogVGhpcyBjb21tYW5kIGlzIGF2YWlsYWJsZSBvbmx5IHdoZW4gU1RBIGlzIGNvbm5lY3RlZC4KKword2xhbmlkbGUtb24KKwlUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byBnZXQgb2ZmIHRoZSBpZGxlIHN0YXRlLgorCisJTm90ZTogVGhpcyBjb21tYW5kIGlzIGF2YWlsYWJsZSBvbmx5IHdoZW4gU1RBIGlzIGNvbm5lY3RlZC4KKworCitnZXRsb2cKKwlUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byBnZXQgdGhlIDgwMi4xMSBzdGF0aXN0aWNzIGF2YWlsYWJsZSBpbiB0aGUKKwkJc3RhdGlvbi4KKworCU5vdGU6IFRoaXMgY29tbWFuZCBpcyBhdmFpbGFibGUgb25seSB3aGVuIFNUQSBpcyBjb25uZWN0ZWQuCisKK2dldGFkaG9jc3RhdHVzCisJVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gZ2V0IHRoZSBhZC1ob2MgTmV0d29yayBTdGF0dXMuCisKKwlUaGUgdmFyaW91cyBzdGF0dXMgY29kZXMgYXJlOgorCQlBZGhvY1N0YXJ0ZWQKKwkJQWRob2NKb2luZWQKKwkJQWRob2NJZGxlCisJCUluZnJhTW9kZQorCQlBdXRvVW5rbm93bk1vZGUKKworCU5vdGU6IFRoaXMgY29tbWFuZCBpcyBhdmFpbGFibGUgb25seSB3aGVuIFNUQSBpcyBjb25uZWN0ZWQuCisKK2FkaG9jZ3JhdGUKKwlUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byBlbmFibGUoMSkgZ19yYXRlLCBEaXNhYmxlKDApIGdfcmF0ZQorCWFuZCByZXF1ZXN0KDIpIHRoZSBzdGF0dXMgd2hpY2ggZ19yYXRlIGlzIGRpc2FibGVkL2VuYWJsZWQsCisJZm9yIEFkLWhvYyBjcmVhdG9yLgorCisJd2hlcmUgdmFsdWUgaXM6LQorCQkwCS0tIERpc2FibGVkCisJCTEJLS0gRW5hYmxlZAorCQkyCS0tIEdldAorCitsZWRncGlvCisJVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gc2V0L2dldCBMRURzLgorCisJaXdwcml2IGV0aFggbGVkZ3BpbyA8TEVEcz4KKwkJd2lsbCBzZXQgdGhlIGNvcnJlc3BvbmRpbmcgTEVEIGZvciB0aGUgR1BJTyBMaW5lLgorCisJaXdwcml2IGV0aFggbGVkZ3BpbworCQl3aWxsIGdpdmUgdSB3aGljaCBMRURzIGFyZSBFbmFibGVkLgorCisJVXNhZ2U6CisJCWl3cHJpdiBldGgxIGxlZGdwaW8gMSAwIDIgMSAzIDQKKwkJCXdpbGwgZW5hYmxlCisJCQlMRUQgMSAtPiBHUElPIDAKKwkJCUxFRCAyIC0+IEdQSU8gMQorCQkJTEVEIDMgLT4gR1BJTyA0CisKKwkJaXdwcml2IGV0aDEgbGVkZ3BpbworCQkJc2hvd3MgTEVEIGluZm9ybWF0aW9uIGluIHRoZSBmb3JtYXQgYXMgbWVudGlvbmVkIGFib3ZlLgorCisJTm90ZTogTEVEMCBpcyBpbnZhbGlkCisJTm90ZTogTWF4aW11bSBOdW1iZXIgb2YgTEVEcyBhcmUgMTYuCisKK2luYWN0aXZpdHl0bworCVRoaXMgY29tbWFuZCBpcyB1c2VkIGJ5IHRoZSBob3N0IHRvIHNldC9nZXQgdGhlIGluYWN0aXZpdHkgdGltZW91dCB2YWx1ZSwKKwl3aGljaCBzcGVjaWZpZXMgd2hlbiBXTEFOIGRldmljZSBpcyBwdXQgdG8gc2xlZXAuCisKKwlVc2FnZToKKwkJaXdwcml2IGV0aFggaW5hY3Rpdml0eXRvIFs8dGltZW91dD5dCisKKwl3aGVyZSB0aGUgcGFyYW1ldGVyIGFyZToKKwkJdGltZW91dDogdGltZW91dCB2YWx1ZSBpbiBtaWxsaXNlY29uZHMuCisKKwlFeGFtcGxlOgorCQlpd3ByaXYgZXRoMSBpbmFjdGl2aXR5dG8KKwkJCSJnZXQgdGhlIHRpbWVvdXQgdmFsdWUiCisKKwkJaXdwcml2IGV0aDEgaW5hY3Rpdml0eXRvIFgKKwkJCSJzZXQgdGltZW91dCB2YWx1ZSB0byBYIG1zIgorCisKK3NsZWVwcGQKKwlUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byBjb25maWd1cmUgdGhlIHNsZWVwIHBlcmlvZCBvZiB0aGUgV0xBTiBkZXZpY2UuCisKKwlVc2FnZToKKwkJaXdwcml2IGV0aFggc2xlZXBwZCBbPHNsZWVwIHBlcmlvZD5dCisKKwl3aGVyZSB0aGUgcGFyYW1ldGVyIGFyZToKKwkJUGVyaW9kOiBzbGVlcCBwZXJpb2QgaW4gbWlsbGlzZWNvbmRzLiBSYW5nZSAxMH42MC4KKworCUV4YW1wbGU6CisJCWl3cHJpdiBldGgxIHNsZWVwcGQgMTAKKwkJCSJzZXQgcGVyaW9kIGFzIDEwIG1zIgorCQlpd3ByaXYgZXRoMSBzbGVlcHBkCisJCQkiZ2V0IHRoZSBzbGVlcCBwZXJpb2QgY29uZmlndXJhdGlvbiIKKworZW5hYmxlMTFkCisJVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gY29udHJvbCAxMWQKKwl3aGVyZSB2YWx1ZSBpczotCisJCTEJLS0gRW5hYmxlZAorCQkwCS0tIERpc2FibGVkCisJCTIJLS0gR2V0CisKKworCisKK3RwY2NmZworCUVuYWJsZXMgb3IgZGlzYWJsZXMgYXV0b21hdGljIHRyYW5zbWl0IHBvd2VyIGNvbnRyb2wuCisKKwlUaGUgZmlyc3QgcGFyYW1ldGVyIHR1cm5zIHRoaXMgZmVhdHVyZSBvbiAoMSkgb3Igb2ZmICgwKS4gIFdoZW4gdHVybmluZworCW9uLCB0aGUgdXNlciBtdXN0IGFsc28gc3VwcGx5IGZvdXIgbW9yZSBwYXJhbWV0ZXJzIGluIHRoZSBmb2xsb3dpbmcKKwlvcmRlcjoKKwkJLVVzZVNOUiAoVXNlIFNOUiAoaW4gYWRkaXRpb24gdG8gUEVSKSBmb3IgVFBDIGFsZ29yaXRobSksCisJCS1QMCAoUDAgcG93ZXIgbGV2ZWwgZm9yIFRQQyksCisJCS1QMSAoUDEgcG93ZXIgbGV2ZWwgZm9yIFRQQyksCisJCS1QMiAoUDIgcG93ZXIgbGV2ZWwgZm9yIFRQQykuCisKKwlVc2FnZToKKwkJaXdwcml2IGV0aFggdHBjY2ZnOiBHZXQgY3VycmVudCBjb25maWd1cmF0aW9uCisJCWl3cHJpdiBldGhYIHRwY2NmZyAwOiBkaXNhYmxlIGF1dG8gVFBDCisJCWl3cHJpdiBldGhYIHRwY2NmZyAweDAxIDB4MDAgMHgwNSAweDBhIDB4MGQ6IGVuYWJsZSBhdXRvIFRQQzsgZG8gbm90IHVzZSBTTlI7CisJCQkJCQkJICAgICBQMD0weDA1OyBQMT0weDBhOyBQMj0weDBkOworCQlpd3ByaXYgZXRoWCB0cGNjZmcgMHgwMSAweDAxIDB4MDUgMHgwYSAweDBkOiBlbmFibGUgYXV0byBUUEM7IHVzZSBTTlI7CisJCQkJCQkJICAgICBQMD0weDA1OyBQMT0weDBhOyBQMj0weDBkLgorCitwb3dlcmNmZworCUVuYWJsZXMgb3IgZGlzYWJsZXMgcG93ZXIgYWRhcHRhdGlvbi4KKworCVRoZSBmaXJzdCBwYXJhbWV0ZXIgdHVybnMgdGhpcyBmZWF0dXJlIG9uICgxKSBvciBvZmYgKDApLiAgV2hlbiB0dXJuaW5nCisJb24sIHRoZSB1c2VyIG11c3QgYWxzbyBzdXBwbHkgdGhyZWUgbW9yZSBwYXJhbWV0ZXJzIGluIHRoZSBmb2xsb3dpbmcKKwlvcmRlcjoKKwkJLVAwIChQMCBwb3dlciBsZXZlbCBmb3IgUG93ZXIgQWRhcHRhdGlvbiksCisJCS1QMSAoUDEgcG93ZXIgbGV2ZWwgZm9yIFBvd2VyIEFkYXB0YXRpb24pLAorCQktUDIgKFAyIHBvd2VyIGxldmVsIGZvciBQb3dlciBBZGFwdGF0aW9uKS4KKworCVVzYWdlOgorCQlpd3ByaXYgZXRoWCBwb3dlcmNmZzogR2V0IGN1cnJlbnQgY29uZmlndXJhdGlvbgorCQlpd3ByaXYgZXRoWCBwb3dlcmNmZyAwOiBkaXNhYmxlIHBvd2VyIGFkYXB0YXRpb24KKwkJaXdwcml2IGV0aFggcG93ZXJjZmcgMSAweDBkIDB4MGYgMHgxMjogZW5hYmxlIHBvd2VyIGFkYXB0YXRpb247CisJCQkJCQkgICAgICAgUDA9MHgwZDsgUDE9MHgwZjsgUDI9MHgxMi4KKworZ2V0YWZjCisJVGhpcyBjb21tYW5kIHJldHVybnMgYXV0b21hdGljIGZyZXF1ZW5jeSBjb250cm9sIHBhcmFtZXRlcnMuICBJdCByZXR1cm5zCisJdGhyZWUgaW50ZWdlcnM6CisJCS1QMDogYXV0b21hdGljIGlzIG9uICgxKSwgb3Igb2ZmICgwKSwKKwkJLVAxOiBjdXJyZW50IHRpbWluZyBvZmZzZXQgaW4gUFBNIChwYXJ0IHBlciBtaWxsaW9uKSwgYW5kCisJCS1QMjogY3VycmVudCBmcmVxdWVuY3kgb2Zmc2V0IGluIFBQTS4KKworc2V0YWZjCisJU2V0IGF1dG9tYXRpYyBmcmVxdWVuY3kgY29udHJvbCBvcHRpb25zLgorCisJVGhlIGZpcnN0IHBhcmFtZXRlciB0dXJucyBhdXRvbWF0aWMgb24gKDEpIG9yIG9mZiAoMCkuCisJVGhlIHVzZXIgbXVzdCBzdXBwbHkgdHdvIG1vcmUgcGFyYW1ldGVycyBpbiBlaXRoZXIgY2FzZSwgaW4gdGhlIGZvbGxvd2luZworICBvcmRlcjoKKworICBXaGVuIGF1dG8gaXMgb246CisKKwkJLVAwIChhdXRvbWF0aWMgYWRqdXN0bWVudCBmcmVxdWVuY3kgdGhyZXNob2xkIGluIFBQTSksCisJCS1QMSAoYXV0b21hdGljIGFkanVzdG1lbnQgcGVyaW9kIGluIGJlYWNvbiBwZXJpb2QpLAorCisgIFdoZW4gYXV0byBpcyBvZmY6CisKKwkJLVAwIChtYW51YWwgYWRqdXN0bWVudCB0aW1pbmcgb2Zmc2V0IGluIFBQTSksIGFuZAorCQktUDEgKG1hbnVhbCBhZGp1c3RtZW50IGZyZXF1ZW5jeSBvZmZzZXQgaW4gUFBNKS4KKworCVVzYWdlOgorCQlpd3ByaXYgZXRoWCBzZXRhZmMgMCAxMCAxMDogbWFudWFsIGFkanVzdG1lbnQsIGJvdGggdGltaW5nIGFuZCBmcmVxdWNuY3kKKyAgICBvZmZzZXQgYXJlIDEwIFBQTS4KKworCQlpd3ByaXYgZXRoWCBzZXRhZmMgMSAxMCAxMCBlbmFibGUgYWZjLCBhdXRvbWF0aWMgYWRqdXN0bWVudCwKKyAgICBmcmVxdWVuY3kgdGhyZXNob2xkIDEwIFBQTSwgZm9yIGV2ZXJ5IDEwIGJlYWNvbiBwZXJpb2RzLgorCisKKworc2NhbnByb2JlcworCVRoaXMgY29tbWFuZCBzZXRzIG51bWJlciBvZiBwcm9iZSByZXF1ZXN0cyBwZXIgY2hhbm5lbC4KKworCVVzYWdlOgorCQlpd3ByaXYgZXRoWCBzY2FucHJvYmVzIDMgKHNldCBzY2FuIHByb2JlcyB0byAzKQorCQlpd3ByaXYgZXRoWCBzY2FucHJvYmVzICAgKGdldCBzY2FuIHByb2JlcykKKworbG9saXN0ZW5pbnRlcgorCVRoaXMgY29tbWFuZCBzZXRzIHRoZSB2YWx1ZSBvZiBsaXN0ZW4gaW50ZXJ2YWwuCisKKwlVc2FnZToKKwlpd3ByaXYgZXRoWCBsb2xpc3RlbmludGVyIDIzNCAoc2V0IHRoZSBsb2xpc3RlbmludGVyIHRvIDIzNCkKKwlpd3ByaXYgZXRoWCBsb2xpc3RlbmludGVyICAgICAoZ2V0IHRoZSBsb2xpc3RlbmludGVyIHZhbHVlKQorCityYXRlYWRhcHQKKwlUaGlzIGNvbW1hbmQgc2V0cyB0aGUgZGF0YSByYXRlcyBiaXRtYXAuCisJV2hlcmUgPG4+CisJCTA6IERpc2FibGUgYXV0byByYXRlIGFkYXB0CisJCTE6IEVuYWJsZSBhdXRvIHJhdGUgYWRhcHQKKworCSAgICAgIDxtPgorCQkgZGF0YSByYXRlIGJpdG1hcAorCQkJQml0CURhdGEgcmF0ZQorCQkJMAkxIE1icHMKKwkJCTEJMiBNYnBzCisJCQkyCTUuNSBNYnBzCisJCQkzCTExIE1icHMKKwkJCTQJUmVzZXJ2ZWQKKwkJCTUJNiBNYnBzCisJCQk2CTkgTWJwcworCQkJNwkxMiBNYnBzCisJCQk4CTE4IE1icHMKKwkJCTkJMjQgTWJwcworCQkJMTAJMzYgTWJwcworCQkJMTEJNDggTWJwcworCQkJMTIJNTQgTWJwcworCQkJMTItMTUJUmVzZXJ2ZWQKKworCVVzYWdlOgorCWl3cHJpdiBldGhYIHJhdGVhZGFwdAorCQkJcmVhZCB0aGUgY3VycmVjdCBkYXRhIHJhdGUgc2V0dGluZworCWl3cHJpdiBldGhYIHJhdGVhZGFwdCAxIDB4MDcKKwkJCWVuYWJsZSBhdXRvIGRhdGEgcmF0ZSBhZGFwdCBhbmQKKwkJCWRhdGEgcmF0ZXMgYXJlIDFNYnBzLCAyTWJzcCBhbmQgNS41TWJwcworCisKK3R4Y29udHJvbAorCVRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIHNldCB0aGUgVHggcmF0ZSwgYWNrIHBvbGljeSwgYW5kIHJldHJ5IGxpbWl0IG9uIGEgcGVyIHBhY2tldCBiYXNpcy4KKworCVdoZXJlIHZhbHVlIDxuPiBpczoKKwkgICAgaWYgYml0WzRdID09IDE6CisJCWJpdFszOjBdICAgICAgICAtLSAwICAgMSAgIDIgICAzICAgNCAgIDUgICA2ICAgNyAgIDggICA5ICAgMTAgICAxMSAgIDEyICAgMTMtMTYKKwkJRGF0YSBSYXRlKE1icHMpIC0tIDEgICAyICAgNS41IDExICBSc3YgNiAgIDkgICAxMiAgMTggIDI0ICAzNiAgIDQ4ICAgNTQgICBSc3YKKworCSAgICBiaXRbMTI6OF0KKwkJaWYgYml0WzEyXSA9PSAxLCBiaXRbMTE6OF0gc3BlY2lmaWVzIHRoZSBUeCByZXRyeSBsaW1pdC4KKworCSAgICBiaXRbMTQ6MTNdIHNwZWNpZmllcyBwZXIgcGFja2V0IGFjayBwb2xpY3k6CisJCWJpdFsxNDoxM10KKwkJICAgICAxICAwCXVzZSBpbW1lZGlhdGUgYWNrIHBvbGljeSBmb3IgdGhpcyBwYWNrZXQKKwkJICAgICAxICAxICAgICAgIHVzZSBubyBhY2sgcG9saWN5IGZvciB0aGlzIHBhY2tldAorCQkgICAgIDAgIHgJdXNlIHRoZSBwZXItcGFja2V0IGFjayBwb2xpY3kgc2V0dGluZworCisJVXNhZ2U6CisJaXdwcml2IGV0aFggdHhjb250cm9sIDB4NzUxMworCQkJVXNlIG5vLWFjayBwb2xpY3ksIDUgcmV0aXJlcyBmb3IgVHgsIDExTWJwcyByYXRlCisKKworCitwc251bGxpbnRlcnZhbAorCVRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIHNldC9yZXF1ZXN0IE5VTEwgcGFja2FnZSBpbnRlcnZhbCBmb3IgUG93ZXIgU2F2ZQorCXVuZGVyIGluZnJhc3RydWN0dXJlIG1vZGUuCisKKwl3aGVyZSB2YWx1ZSBpczotCisJCS0xCS0tIERpc2FibGVkCisJCW4+MAktLSBTZXQgaW50ZXJ2YWwgYXMgbiAoc2Vjb25kcykKKworcHJlc2NhbgorCVRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIGVuYWJsZSAoMSkvZGlzYWJsZSgwKSBhdXRvIHByZXNjYW4gYmVmb3JlIGFzc29pY2F0ZSB0byB0aGUgYXAKKworCXdoZXJlIHZhbHVlIGlzOi0KKwkJMAktLSBEaXNhYmxlZAorCQkxCS0tIEVuYWJsZWQKKwkJMiAgICAgICAtLSBHZXQKKworZ2V0cnhpbmZvCisJVGhpcyBjb21tYW5kIGdldHMgbm9uIGF2ZXJhZ2UgdmFsdWUgb2YgU2lnbmFsIHRvIE5vaXNlIFJhdGlvIG9mIERhdGEgYW5kIHJhdGUgaW5kZXguCisKKwlUaGUgZm9sbG93aW5nIHRhYmxlIHNob3dzIFJhdGVJbmRleCBhbmQgUmF0ZQorCisJCSAgICAgUmF0ZUluZGV4CURhdGEgcmF0ZQorCQkJMAkxIE1icHMKKwkJCTEJMiBNYnBzCisJCQkyCTUuNSBNYnBzCisJCQkzCTExIE1icHMKKwkJCTQJUmVzZXJ2ZWQKKwkJCTUJNiBNYnBzCisJCQk2CTkgTWJwcworCQkJNwkxMiBNYnBzCisJCQk4CTE4IE1icHMKKwkJCTkJMjQgTWJwcworCQkJMTAJMzYgTWJwcworCQkJMTEJNDggTWJwcworCQkJMTIJNTQgTWJwcworCQkJMTMtMTUJUmVzZXJ2ZWQKKworZ2V0dHhyYXRlCisJVGhpcyBjb21tYW5kIGdldHMgY3VycmVudCBUeCByYXRlIGluZGV4IG9mIHRoZSBmaXJzdCBwYWNrZXQgYXNzb2NpYXRlZCB3aXRoIFJhdGUgQWRhcHRhdGlvbi4KKworCVRoZSBmb2xsb3dpbmcgdGFibGUgc2hvd3MgUmF0ZUluZGV4IGFuZCBSYXRlCisKKwkJICAgICBSYXRlSW5kZXgJRGF0YSByYXRlCisJCQkwCTEgTWJwcworCQkJMQkyIE1icHMKKwkJCTIJNS41IE1icHMKKwkJCTMJMTEgTWJwcworCQkJNAlSZXNlcnZlZAorCQkJNQk2IE1icHMKKwkJCTYJOSBNYnBzCisJCQk3CTEyIE1icHMKKwkJCTgJMTggTWJwcworCQkJOQkyNCBNYnBzCisJCQkxMAkzNiBNYnBzCisJCQkxMQk0OCBNYnBzCisJCQkxMgk1NCBNYnBzCisJCQkxMy0xNQlSZXNlcnZlZAorCitiY25pbnRlcnZhbAorCVRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIHNldHMgYmVhY29uIGludGVydmFsIGluIGFkaG9jIG1vZGUgd2hlbiBhbiBhcmd1bWVudCBpcyBnaXZlbiwgYW5kIGdldHMgY3VycmVudCBhZGhvYworCWJlYWNvbiBpbnRlcnZhbCB3aGVuIG5vIGFyZ3VtZW50IGlzIGdpdmVuLiBUaGUgdmFsaWQgYmVhY29uIGludGVydmFsIGlzIGJldHdlZW4gMjAgLSAxMDAwLAorCWRlZmF1bHQgYmVhY29uIGludGVydmFsIGlzIDEwMC4KKworCVVzYWdlOgorCQlpd3ByaXYgZXRoWCBiY25pbnRlcnZhbCAxMDAgIChzZXQgYWRob2MgYmVhY29uIGludGVydmFsIHRvIDEwMCkKKwkJaXdwcml2IGV0aFggYmNuaW50ZXJ2YWwgICAgICAoZ2V0IGFkaG9jIGJlYWNvbiBpbnRlcnZhbCkKKworZnd0X2FkZAorCVRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIGluc2VydCBhbiBlbnRyeSBpbnRvIHRoZSBGV1QgdGFibGUuIFRoZSBsaXN0IG9mCisJcGFyYW1ldGVycyBtdXN0IGZvbGxvdyB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZToKKworCWl3cHJpdiBldGhYIGZ3dF9hZGQgZGEgcmEgW21ldHJpYyBkaXIgc3NuIGRzbiBob3Bjb3VudCB0dGwgZXhwaXJhdGlvbiBzbGVlcG1vZGUgc25yXQorCisJVGhlIHBhcmFtZXRlcnMgYmV0d2VlbiBicmFja2V0cyBhcmUgb3B0aW9uYWwsIGJ1dCB0aGV5IG11c3QgYXBwZWFyIGluCisJdGhlIG9yZGVyIHNwZWNpZmllZC4gIEZvciBleGFtcGxlLCBpZiB5b3Ugd2FudCB0byBzcGVjaWZ5IHRoZSBtZXRyaWMsCisJeW91IG11c3QgYWxzbyBzcGVjaWZ5IHRoZSBkaXIsIHNzbiwgYW5kIGRzbiBidXQgeW91IG5lZWQgbm90IHNwZWNpZnkgdGhlCisJaG9wY291bnQsIGV4cGlyYXRpb24sIHNsZWVwbW9kZSwgb3Igc25yLiAgQW55IHVuc3BlY2lmaWVkIHBhcmFtZXRlcnMKKwl3aWxsIGJlIGFzc2lnbmVkIHRoZSBkZWZhdWx0cyBzcGVjaWZpZWQgYmVsb3cuCisKKwlUaGUgZGlmZmVyZW50IHBhcmFtZXRlcnMgYXJlOi0KKwkJZGEJCS0tIERBIE1BQyBhZGRyZXNzIGluIHRoZSBmb3JtIDAwOjExOjIyOjMzOjQ0OjU1CisJCXJhCQktLSBSQSBNQUMgYWRkcmVzcyBpbiB0aGUgZm9ybSAwMDoxMToyMjozMzo0NDo1NQorCQltZXRyaWMJCS0tIHJvdXRlIG1ldHJpYyAoY29zdDogc21hbGxlci1tZXRyaWMgcm91dGVzIGFyZQorCQkJCSAgIHByZWZlcnJlZCwgZGVmYXVsdCBpcyAwKQorCQlkaXIJCS0tIGRpcmVjdGlvbiAoMSBmb3IgZGlyZWN0LCAwIGZvciByZXZlcnNlLAorCQkJCSAgIGRlZmF1bHQgaXMgMSkKKwkJc3NuCQktLSBTb3VyY2UgU2VxdWVuY2UgTnVtYmVyICh0aW1lIGF0IHRoZSBSQSBmb3IKKwkJCQkgICByZXZlcnNlIHJvdXRlcy4gIERlZmF1bHQgaXMgMCkKKwkJZHNuCQktLSBEZXN0aW5hdGlvbiBTZXF1ZW5jZSBOdW1iZXIgKHRpbWUgYXQgdGhlIERBCisJCQkJICAgZm9yIGRpcmVjdCByb3V0ZXMuICBEZWZhdWx0IGlzIDApCisJCWhvcGNvdW50CS0tIGhvcCBjb3VudCAoY3VycmVudGx5IHVudXNlZCwgZGVmYXVsdCBpcyAwKQorCQl0dGwJCS0tIFRUTCAoT25seSB1c2VkIGluIHJldmVyc2UgZW50cmllcykKKwkJZXhwaXJhdGlvbgktLSBlbnRyeSBleHBpcmF0aW9uIChpbiB0aWNrcywgd2hlcmUgYSB0aWNrIGlzCisJCQkJICAgMTAyNHVzLCBvciB+IDFtcy4gVXNlIDAgZm9yIGFuIGluZGVmaW5pdGUKKwkJCQkgICBlbnRyeSwgZGVmYXVsdCBpcyAwKQorCQlzbGVlcG1vZGUJLS0gUkEncyBzbGVlcCBtb2RlIChjdXJyZW50bHkgdW51c2VkLCBkZWZhdWx0IGlzCisJCQkJICAgMCkKKwkJc25yCQktLSBTTlIgaW4gdGhlIGxpbmsgdG8gUkEgKGN1cnJlbnRseSB1bnVzZWQsCisJCQkJICAgZGVmYXVsdCBpcyAwKQorCisJVGhlIGNvbW1hbmQgZG9lcyBub3QgcmV0dXJuIGFueXRoaW5nLgorCitmd3RfZGVsCisJVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gcmVtb3ZlIGFuIGVudHJ5IHRvIHRoZSBGV1QgdGFibGUuIFRoZSBsaXN0IG9mCisJcGFyYW1ldGVycyBtdXN0IGZvbGxvdyB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZToKKworCQlpd3ByaXYgZXRoWCBmd3RfZGVsIGRhIHJhIFtkaXJdCisKKwl3aGVyZSB0aGUgZGlmZmVyZW50IHBhcmFtZXRlcnMgYXJlOi0KKwkJZGEJCS0tIERBIE1BQyBhZGRyZXNzIChpbiB0aGUgZm9ybSAiMDA6MTE6MjI6MzM6NDQ6NTUiKQorCQlyYQkJLS0gUkEgTUFDIGFkZHJlc3MgKGluIHRoZSBmb3JtICIwMDoxMToyMjozMzo0NDo1NSIpCisJCWRpcgkJLS0gZGlyZWN0aW9uICgxIGZvciBkaXJlY3QsIDAgZm9yIHJldmVyc2UsCisJCQkJICAgZGVmYXVsdCBpcyAxKQorCisJVGhlIGNvbW1hbmQgZG9lcyBub3QgcmV0dXJuIGFueXRoaW5nLgorCitmd3RfbG9va3VwCisJVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gZ2V0IHRoZSBiZXN0IHJvdXRlIGluIHRoZSBGV1QgdGFibGUgdG8gYSBnaXZlbgorCWhvc3QuIFRoZSBvbmx5IHBhcmFtZXRlciBpcyB0aGUgTUFDIGFkZHJlc3Mgb2YgdGhlIGhvc3QgdGhhdCBpcyBiZWluZworCWxvb2tlZCBmb3IuCisKKwkJaXdwcml2IGV0aFggZnd0X2xvb2t1cCBkYQorCisJd2hlcmU6LQorCQlkYQkJLS0gREEgTUFDIGFkZHJlc3MgKGluIHRoZSBmb3JtICIwMDoxMToyMjozMzo0NDo1NSIpCisKKwlUaGUgY29tbWFuZCByZXR1cm5zIGFuIG91dHB1dCBzdHJpbmcgaWRlbnRpY2FsIHRvIHRoZSBvbmUgcmV0dXJuZWQgYnkKKwlmd3RfbGlzdCBkZXNjcmliZWQgYmVsb3cuCisKKworZnd0X2xpc3QKKwlUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byBsaXN0IGEgcm91dGUgZnJvbSB0aGUgRldUIHRhYmxlLiBUaGUgb25seQorCXBhcmFtZXRlciBpcyB0aGUgaW5kZXggaW50byB0aGUgdGFibGUuIElmIHlvdSB3YW50IHRvIGxpc3QgYWxsIHRoZQorCXJvdXRlcyBpbiBhIHRhYmxlLCBzdGFydCB3aXRoIGluZGV4PTAsIGFuZCBrZWVwIGxpc3RpbmcgdW50aWwgeW91IGdldCBhCisJIihudWxsKSIgc3RyaW5nLiAgTm90ZSB0aGF0IHRoZSBpbmRpY2llcyBtYXkgY2hhbmdlIGFzIHRoZSBmd3QgaXMKKwl1cGRhdGVkLiAgSXQgaXMgZXhwZWN0ZWQgdGhhdCBtb3N0IHVzZXJzIHdpbGwgbm90IHVzZSBmd3RfbGlzdCBkaXJlY3RseSwKKwlidXQgdGhhdCBhIHV0aWxpdHkgc2ltaWxhciB0byB0aGUgdHJhZGl0aW9uYWwgcm91dGUgY29tbWFuZCB3aWxsIGJlIHVzZWQKKwl0byBpbnZva2UgZnd0X2xpc3Qgb3ZlciBhbmQgb3Zlci4KKworCQlpd3ByaXYgZXRoWCBmd3RfbGlzdCBpbmRleAorCisJVGhlIG91dHB1dCBpcyBhIHN0cmluZyBvZiB0aGUgZm9sbG93aW5nIGZvcm06CisKKwkJZGEgcmEgbWV0cmljIGRpciBzc24gZHNuIGhvcGNvdW50IHR0bCBleHBpcmF0aW9uIHNsZWVwbW9kZSBzbnIKKworCXdoZXJlIHRoZSBkaWZmZXJlbnQgZmllbGRzIGFyZTotCisJCWRhCQktLSBEQSBNQUMgYWRkcmVzcyAoaW4gdGhlIGZvcm0gIjAwOjExOjIyOjMzOjQ0OjU1IikKKwkJcmEJCS0tIFJBIE1BQyBhZGRyZXNzIChpbiB0aGUgZm9ybSAiMDA6MTE6MjI6MzM6NDQ6NTUiKQorCQltZXRyaWMJCS0tIHJvdXRlIG1ldHJpYyAoY29zdDogc21hbGxlci1tZXRyaWMgcm91dGVzIGFyZSBwcmVmZXJyZWQpCisJCWRpcgkJLS0gZGlyZWN0aW9uICgxIGZvciBkaXJlY3QsIDAgZm9yIHJldmVyc2UpCisJCXNzbgkJLS0gU291cmNlIFNlcXVlbmNlIE51bWJlciAodGltZSBhdCB0aGUgUkEgZm9yIHJldmVyc2Ugcm91dGVzKQorCQlkc24JCS0tIERlc3RpbmF0aW9uIFNlcXVlbmNlIE51bWJlciAodGltZSBhdCB0aGUgREEgZm9yIGRpcmVjdCByb3V0ZXMpCisJCWhvcGNvdW50CS0tIGhvcCBjb3VudCAoY3VycmVudGx5IHVudXNlZCkKKwkJdHRsCQktLSBUVEwgKG9ubHkgdXNlZCBpbiByZXZlcnNlIGVudHJpZXMpCisJCWV4cGlyYXRpb24JLS0gZW50cnkgZXhwaXJhdGlvbiAoaW4gdGlja3MsIHdoZXJlIGEgdGljayBpcyAxMDI0dXMsIG9yIH4gMW1zLiBVc2UgMCBmb3IgYW4gaW5kZWZpbml0ZSBlbnRyeSkKKwkJc2xlZXBtb2RlCS0tIFJBJ3Mgc2xlZXAgbW9kZSAoY3VycmVudGx5IHVudXNlZCkKKwkJc25yCQktLSBTTlIgaW4gdGhlIGxpbmsgdG8gUkEgKGN1cnJlbnRseSB1bnVzZWQpCisKK2Z3dF9saXN0X3JvdXRlCisJVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gbGlzdCBhIHJvdXRlIGZyb20gdGhlIEZXVCB0YWJsZS4gVGhlIG9ubHkKKwlwYXJhbWV0ZXIgaXMgdGhlIHJvdXRlIElELiBJZiB5b3Ugd2FudCB0byBsaXN0IGFsbCB0aGUgcm91dGVzIGluIGEKKwl0YWJsZSwgc3RhcnQgd2l0aCByaWQ9MCwgYW5kIGtlZXAgaW5jcmVtZW50aW5nIHJpZCB1bnRpbCB5b3UgZ2V0IGEKKwkiKG51bGwpIiBzdHJpbmcuIFRoaXMgZnVuY3Rpb24gaXMgc2ltaWxhciB0byBmd3RfbGlzdC4gVGhlIG9ubHkKKwlkaWZmZXJlbmNlIGlzIHRoZSBvdXRwdXQgZm9ybWF0LiAgQWxzbyBub3RlIHRoYXQgdGhpcyBjb21tYW5kIGlzIG1lYW50CisJZm9yIGRlYnVnZ2luZy4gIEl0IGlzIGV4cGVjdGVkIHRoYXQgdXNlcnMgd2lsbCB1c2UgZnd0X2xvb2t1cCBhbmQKKwlmd3RfbGlzdC4gIE9uZSBpbXBvcnRhbnQgcmVhc29uIGZvciB0aGlzIGlzIHRoYXQgdGhlIHJvdXRlIGlkIG1heSBjaGFuZ2UKKwlhcyB0aGUgcm91dGUgdGFibGUgaXMgYWx0ZXJlZC4KKworCQlpd3ByaXYgZXRoWCBmd3RfbGlzdF9yb3V0ZSByaWQKKworCVRoZSBvdXRwdXQgaXMgYSBzdHJpbmcgb2YgdGhlIGZvbGxvd2luZyBmb3JtOgorCisJCWRhIG1ldHJpYyBkaXIgbmlkIHNzbiBkc24gaG9wY291bnQgdHRsIGV4cGlyYXRpb24KKworCXdoZXJlIHRoZSBkaWZmZXJlbnQgZmllbGRzIGFyZTotCisJCWRhCQktLSBEQSBNQUMgYWRkcmVzcyAoaW4gdGhlIGZvcm0gIjAwOjExOjIyOjMzOjQ0OjU1IikKKwkJbWV0cmljCQktLSByb3V0ZSBtZXRyaWMgKGNvc3Q6IHNtYWxsZXItbWV0cmljIHJvdXRlcyBhcmUgcHJlZmVycmVkKQorCQlkaXIJCS0tIGRpcmVjdGlvbiAoMSBmb3IgZGlyZWN0LCAwIGZvciByZXZlcnNlKQorCQluaWQJCS0tIE5leHQtaG9wIChuZWlnaGJvcikgaG9zdCBJRCAobmlkKQorCQlzc24JCS0tIFNvdXJjZSBTZXF1ZW5jZSBOdW1iZXIgKHRpbWUgYXQgdGhlIFJBIGZvciByZXZlcnNlIHJvdXRlcykKKwkJZHNuCQktLSBEZXN0aW5hdGlvbiBTZXF1ZW5jZSBOdW1iZXIgKHRpbWUgYXQgdGhlIERBIGZvciBkaXJlY3Qgcm91dGVzKQorCQlob3Bjb3VudAktLSBob3AgY291bnQgKGN1cnJlbnRseSB1bnVzZWQpCisJCXR0bAkJLS0gVFRMIGNvdW50IChvbmx5IHVzZWQgaW4gcmV2ZXJzZSBlbnRyaWVzKQorCQlleHBpcmF0aW9uCS0tIGVudHJ5IGV4cGlyYXRpb24gKGluIHRpY2tzLCB3aGVyZSBhIHRpY2sgaXMgMTAyNHVzLCBvciB+IDFtcy4gVXNlIDAgZm9yIGFuIGluZGVmaW5pdGUgZW50cnkpCisKK2Z3dF9saXN0X25laWdoCisJVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gbGlzdCBhIG5laWdoYm9yIGZyb20gdGhlIEZXVCB0YWJsZS4gVGhlIG9ubHkKKwlwYXJhbWV0ZXIgaXMgdGhlIG5laWdoYm9yIElELiBJZiB5b3Ugd2FudCB0byBsaXN0IGFsbCB0aGUgbmVpZ2hib3JzIGluIGEKKwl0YWJsZSwgc3RhcnQgd2l0aCBuaWQ9MCwgYW5kIGtlZXAgaW5jcmVtZW50aW5nIG5pZCB1bnRpbCB5b3UgZ2V0IGEKKwkiKG51bGwpIiBzdHJpbmcuICBOb3RlIHRoYXQgdGhlIG5pZCBmcm9tIGEgZnd0X2xpc3Rfcm91dGUgY29tbWFuZCBjYW4gYmUKKwl1c2VkIGFzIGFuIGlucHV0IHRvIHRoaXMgY29tbWFuZC4gIEFsc28gbm90ZSB0aGF0IHRoaXMgY29tbWFuZCBpcyBtZWFudAorCW1vc3RseSBmb3IgZGVidWdnaW5nLiAgSXQgaXMgZXhwZWN0ZWQgdGhhdCB1c2VycyB3aWxsIHVzZSBmd3RfbG9va3VwLgorCU9uZSBpbXBvcnRhbnQgcmVhc29uIGZvciB0aGlzIGlzIHRoYXQgdGhlIG5laWdoYm9yIGlkIG1heSBjaGFuZ2UgYXMgdGhlCisJbmVpZ2hib3IgdGFibGUgaXMgYWx0ZXJlZC4KKworCQlpd3ByaXYgZXRoWCBmd3RfbGlzdF9uZWlnaCBuaWQKKworCVRoZSBvdXRwdXQgaXMgYSBzdHJpbmcgb2YgdGhlIGZvbGxvd2luZyBmb3JtOgorCisJCXJhIHNsZWVwbW9kZSBzbnIgcmVmZXJlbmNlcworCisJd2hlcmUgdGhlIGRpZmZlcmVudCBmaWVsZHMgYXJlOi0KKwkJcmEJCS0tIFJBIE1BQyBhZGRyZXNzIChpbiB0aGUgZm9ybSAiMDA6MTE6MjI6MzM6NDQ6NTUiKQorCQlzbGVlcG1vZGUJLS0gUkEncyBzbGVlcCBtb2RlIChjdXJyZW50bHkgdW51c2VkKQorCQlzbnIJCS0tIFNOUiBpbiB0aGUgbGluayB0byBSQSAoY3VycmVudGx5IHVudXNlZCkKKwkJcmVmZXJlbmNlcwktLSBSQSdzIHJlZmVyZW5jZSBjb3VudGVyCisKK2Z3dF9yZXNldAorCVRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIHJlc2V0IHRoZSBGV1QgdGFibGUsIGdldHRpbmcgcmlkIG9mIGFsbCB0aGUKKwllbnRyaWVzLiBUaGVyZSBhcmUgbm8gaW5wdXQgcGFyYW1ldGVycy4KKworCQlpd3ByaXYgZXRoWCBmd3RfcmVzZXQKKworCVRoZSBjb21tYW5kIGRvZXMgbm90IHJldHVybiBhbnl0aGluZy4KKworZnd0X2NsZWFudXAKKwlUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byBwZXJmb3JtIHVzZXItYmFzZWQgZ2FyYmFnZSByZWNvbGxlY3Rpb24uIFRoZQorCUZXVCB0YWJsZSBpcyBjaGVja2VkLCBhbmQgYWxsIHRoZSBlbnRyaWVzIHRoYXQgYXJlIGV4cGlyZWQgb3IgaW52YWxpZAorCWFyZSBjbGVhbmVkLiBOb3RlIHRoYXQgdGhpcyBpcyBleHBvcnRlZCB0byB0aGUgZHJpdmVyIGZvciBkZWJ1Z2dpbmcKKwlwdXJwb3NlcywgYXMgZ2FyYmFnZSBjb2xsZWN0aW9uIGlzIGFsc28gZmlyZWQgYnkgdGhlIGZpcm13YXJlIHdoZW4gaW4KKwlzcGFjZSBwcm9ibGVtcy4gVGhlcmUgYXJlIG5vIGlucHV0IHBhcmFtZXRlcnMuCisKKwkJaXdwcml2IGV0aFggZnd0X2NsZWFudXAKKworCVRoZSBjb21tYW5kIGRvZXMgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGludmFsaWQvZXhwaXJlZCByb3V0ZXMgZGVsZXRlZC4KKworZnd0X3RpbWUKKwlUaGlzIGNvbW1hbmQgcmV0dXJucyBhIGNhcmQncyBpbnRlcm5hbCB0aW1lIHJlcHJlc2VudGF0aW9uLiAgSXQgaXMgdGhpcworCXRpbWUgdGhhdCBpcyB1c2VkIHRvIHJlcHJlc2VudCB0aGUgZXhwaXJhdGlvbiB0aW1lcyBvZiBGV1QgZW50cmllcy4gIFRoZQorCW51bWJlciBpcyBub3QgY29uc2lzdGVudCBmcm9tIGNhcmQgdG8gY2FyZDsgaXQgaXMgc2ltcGx5IGEgdGltZXIgY291bnQuCisJVGhlIGZ3dF90aW1lIGNvbW1hbmQgaXMgdXNlZCB0byBpbnNwZWN0IHRoZSB0aW1lciBzbyB0aGF0IGV4cGlyYXRpb24KKwl0aW1lcyByZXBvcnRlZCBieSBmd3RfbGlzdCBjYW4gYmUgcHJvcGVybHkgaW50ZXJwcmV0ZWQuCisKKwkJaXdwcml2IGV0aFggZnd0X3RpbWUKKworbWVzaF9nZXRfdHRsCisKKwlUaGUgbWVzaCB0dGwgaXMgdGhlIG51bWJlciBvZiBob3BzIGEgbWVzaCBwYWNrZXQgY2FuIHRyYXZlcnNlIGJlZm9yZSBpdAorCWlzIGRyb3BwZWQuICBUaGlzIHBhcmFtZXRlciBpcyB1c2VkIHRvIHByZXZlbnQgaW5maW5pdGUgbG9vcHMgaW4gdGhlCisJbWVzaCBuZXR3b3JrLiAgVGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoaXMgZnVuY3Rpb24gaXMgdGhlIHR0bCBhc3NpZ25lZAorCXRvIGFsbCBtZXNoIHBhY2tldHMuICBDdXJyZW50bHkgdGhlcmUgaXMgbm8gd2F5IHRvIGNvbnRyb2wgdGhlIHR0bCBvbiBhCisJcGVyIHBhY2tldCBvciBwZXIgc29ja2V0IGJhc2lzLgorCisJaXdwcml2IGV0aFggbWVzaF9nZXRfdHRsCisKK21lc2hfc2V0X3R0bCB0dGwKKworCVNldCB0aGUgdHRsLiAgVGhlIGFyZ3VtZW50IG11c3QgYmUgYmV0d2VlbiAwIGFuZCAyNTUuCisKKwlpd3ByaXYgZXRoWCBtZXNoX3NldF90dGwgPHR0bD4KKworPT09PT09PT09PT09PT09PT09PT09PT09PQorRVRIVE9PTAorPT09PT09PT09PT09PT09PT09PT09PT09PQorCisKK1VzZSB0aGUgLWkgb3B0aW9uIHRvIHJldHJpZXZlIHZlcnNpb24gaW5mb3JtYXRpb24gZnJvbSB0aGUgZHJpdmVyLgorCisjIGV0aHRvb2wgLWkgZXRoMAorZHJpdmVyOiBsaWJlcnRhcwordmVyc2lvbjogQ09NTS1VU0I4Mzg4LTMxOC5wNAorZmlybXdhcmUtdmVyc2lvbjogNS4xMTAuNworYnVzLWluZm86CisKK1VzZSB0aGUgLWUgb3B0aW9uIHRvIHJlYWQgdGhlIEVFUFJPTSBjb250ZW50cyBvZiB0aGUgY2FyZC4KKworCVVzYWdlOgorCWV0aHRvb2wgLWUgZXRoWCBbcmF3IG9ufG9mZl0gW29mZnNldCBOXSBbbGVuZ3RoIE5dCisKKyAgICAgICAtZSAgICAgcmV0cmlldmVzIGFuZCBwcmludHMgYW4gRUVQUk9NIGR1bXAgZm9yIHRoZSAgc3BlY2lmaWVkICBldGhlcm5ldAorICAgICAgICAgICAgICBkZXZpY2UuICAgV2hlbiByYXcgaXMgZW5hYmxlZCwgdGhlbiBpdCBkdW1wcyB0aGUgcmF3IEVFUFJPTSBkYXRhCisgICAgICAgICAgICAgIHRvIHN0ZG91dC4gVGhlIGxlbmd0aCBhbmQgb2Zmc2V0IHBhcmFtZXRlcnMgYWxsb3cgIGR1bXBpbmcgIGNlci0KKyAgICAgICAgICAgICAgdGFpbiBwb3J0aW9ucyBvZiB0aGUgRUVQUk9NLiAgRGVmYXVsdCBpcyB0byBkdW1wIHRoZSBlbnRpcmUgRUVQLQorICAgICAgICAgICAgICBST00uCisKKyMgZXRodG9vbCAtZSBldGgwIG9mZnNldCAwIGxlbmd0aCAxNgorT2Zmc2V0ICAgICAgICAgIFZhbHVlcworLS0tLS0tICAgICAgICAgIC0tLS0tLQorMHgwMDAwICAgICAgICAgIDM4IDMzIDMwIDU4IDAwIDAwIDM0IGY0IDAwIDAwIDEwIDAwIDAwIGM0IDE3IDAwCisKKz09PT09PT09PT09PT09PT09PT09PT09PQorREVCVUdGUyBDT01NQU5EUworPT09PT09PT09PT09PT09PT09PT09PT09CisKK3Rob3NlIGNvbW1hbmRzIGFyZSB1c2VkIHZpYSBkZWJ1Z2ZzIGludGVyZmFjZQorCis9PT09PT09PT09PQorcmRtYWMKK3JkYmJwCityZHJmCisJVGhlc2UgY29tbWFuZHMgYXJlIHVzZWQgdG8gcmVhZCB0aGUgTUFDLCBCQlAgYW5kIFJGIHJlZ2lzdGVycyBmcm9tIHRoZQorCWNhcmQuICBUaGVzZSBjb21tYW5kcyB0YWtlIG9uZSBwYXJhbWV0ZXIgdGhhdCBzcGVjaWZpZXMgdGhlIG9mZnNldAorCWxvY2F0aW9uIHRoYXQgaXMgdG8gYmUgcmVhZC4gIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgc3BlY2lmaWVkIGluCisJaGV4YWRlY2ltYWwgKGl0cyBwb3NzaWJsZSB0byBwcmVjZWVkIHByZWNlZGluZyB0aGUgbnVtYmVyIHdpdGggYSAiMHgiKS4KKworCVBhdGg6IC9kZWJ1Z2ZzL2xpYmVydGFzX3dpcmVsZXNzL2V0aFgvcmVnaXN0ZXJzLworCisJVXNhZ2U6CisJCWVjaG8gIjB4YTEyMyIgPiByZG1hYyA7IGNhdCByZG1hYworCQllY2hvICIweGExMjMiID4gcmRiYnAgOyBjYXQgcmRiYnAKKwkJZWNobyAiMHhhMTIzIiA+IHJkcmYgOyBjYXQgcmRyZgord3JtYWMKK3dyYmJwCit3cnJmCisJVGhlc2UgY29tbWFuZHMgYXJlIHVzZWQgdG8gd3JpdGUgdGhlIE1BQywgQkJQIGFuZCBSRiByZWdpc3RlcnMgaW4gdGhlCisJY2FyZC4gIFRoZXNlIGNvbW1hbmRzIHRha2UgdHdvIHBhcmFtZXRlcnMgdGhhdCBzcGVjaWZ5IHRoZSBvZmZzZXQKKwlsb2NhdGlvbiBhbmQgdGhlIHZhbHVlIHRoYXQgaXMgdG8gYmUgd3JpdHRlbi4gVGhpcyBwYXJhbWV0ZXJzIG11c3QKKwliZSBzcGVjaWZpZWQgaW4gaGV4YWRlY2ltYWwgKGl0cyBwb3NzaWJsZSB0byBwcmVjZWVkIHRoZSBudW1iZXIKKwl3aXRoIGEgIjB4IikuCisKKwlVc2FnZToKKwkJZWNobyAiMHhhMTIzIDB4YWEiID4gd3JtYWMKKwkJZWNobyAiMHhhMTIzIDB4YWEiID4gd3JiYnAKKwkJZWNobyAiMHhhMTIzIDB4YWEiID4gd3JyZgorCitzbGVlcHBhcmFtcworCVRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIHNldCB0aGUgc2xlZXBjbG9jayBjb25maWd1cmF0aW9ucworCisJUGF0aDogL2RlYnVnZnMvbGliZXJ0YXNfd2lyZWxlc3MvZXRoWC8KKworCVVzYWdlOgorCQljYXQgc2xlZXBwYXJhbXM6IHJlYWRzIHRoZSBjdXJyZW50IHNsZWVwY2xvY2sgY29uZmlndXJhdGlvbgorCisJCWVjaG8gInAxIHAyIHAzIHA0IHA1IHA2IiA+IHNsZWVwcGFyYW1zOiB3cml0ZXMgdGhlIHNsZWVwY2xvY2sgY29uZmlndXJhdGlvbi4KKworCQl3aGVyZToKKwkJCXAxIGlzIFNsZWVwIGNsb2NrIGVycm9yIGluIHBwbSAoMC02NTUzNSkKKwkJCXAyIGlzIFdha2V1cCBvZmZzZXQgaW4gdXNlYyAoMC02NTUzNSkKKwkJCXAzIGlzIENsb2NrIHN0YWJpbGl6YXRpb24gdGltZSBpbiB1c2VjICgwLTY1NTM1KQorCQkJcDQgaXMgQ29udHJvbCBwZXJpb2RpYyBjYWxpYnJhdGlvbiAoMC0yKQorCQkJcDUgaXMgQ29udHJvbCB0aGUgdXNlIG9mIGV4dGVybmFsIHNsZWVwIGNsb2NrICgwLTIpCisJCQlwNiBpcyByZXNlcnZlZCBmb3IgZGVidWcgKDAtNjU1MzUpCisKK3N1YnNjcmliZWRfZXZlbnRzCisKKwlUaGUgc3Vic2NyaWJlZF9ldmVudHMgZGlyZWN0b3J5IGNvbnRhaW5zIHRoZSBpbnRlcmZhY2UgZm9yIHRoZQorCXN1YnNjcmliZWQgZXZlbnRzIEFQSS4KKworCVBhdGg6IC9kZWJ1Z2ZzL2xpYmVydGFzX3dpcmVsZXNzL2V0aFgvc3Vic2NyaWJlZF9ldmVudHMvCisKKwlFYWNoIGV2ZW50IGlzIHJlcHJlc2VudGVkIGJ5IGEgZmlsZW5hbWUuIEVhY2ggZmlsZW5hbWUgY29uc2lzdHMgb2YgdGhlCisJZm9sbG93aW5nIHRocmVlIGZpZWxkczoKKwlWYWx1ZSBGcmVxdWVuY3kgU3Vic2NyaWJlZAorCisJVG8gcmVhZCB0aGUgY3VycmVudCB2YWx1ZXMgZm9yIGEgZ2l2ZW4gZXZlbnQsIGRvOgorCQljYXQgZXZlbnQKKwlUbyBzZXQgdGhlIGN1cnJlbnQgdmFsdWVzLCBkbzoKKwkJZWNobyAiNjAgMiAxIiA+IGV2ZW50CisKKwlGcmVxdWVuY3kgZmllbGQgc3BlY2lmaWVzIHRoZSByZXBvcnRpbmcgZnJlcXVlbmN5IGZvciB0aGlzIGV2ZW50LgorCUlmIGl0IGlzIHNldCB0byAwLCB0aGVuIHRoZSBldmVudCBpcyByZXBvcnRlZCBvbmx5IG9uY2UsIGFuZCB0aGVuCisJYXV0b21hdGljYWxseSB1bnN1YnNjcmliZWQuIElmIGl0IGlzIHNldCB0byAxLCB0aGVuIHRoZSBldmVudCBpcworCXJlcG9ydGVkIGV2ZXJ5IHRpbWUgaXQgb2NjdXJzLiBJZiBpdCBpcyBzZXQgdG8gTiwgdGhlbiB0aGUgZXZlbnQgaXMKKwlyZXBvcnRlZCBldmVyeSBOdGggdGltZSBpdCBvY2N1cnMuCisKKwliZWFjb25fbWlzc2VkCisJVmFsdWUgZmllbGQgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgY29uc2VjdXRpdmUgbWlzc2luZyBiZWFjb25zIHdoaWNoCisJdHJpZ2dlcnMgdGhlIExJTktfTE9TUyBldmVudC4gVGhpcyBldmVudCBpcyBnZW5lcmF0ZWQgb25seSBvbmNlIGFmdGVyCisJd2hpY2ggdGhlIGZpcm13YXJlIHJlc2V0cyBpdHMgc3RhdGUuIEF0IGluaXRpYWxpemF0aW9uLCB0aGUgTElOS19MT1NTCisJZXZlbnQgaXMgc3Vic2NyaWJlZCBieSBkZWZhdWx0LiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiBNaXNzZWRCZWFjb25zIGlzCisJNjAuCisKKwlmYWlsdXJlX2NvdW50CisJVmFsdWUgZmllbGQgc3BlY2lmaWVzIHRoZSBjb25zZWN1dGl2ZSBmYWlsdXJlIGNvdW50IHRocmVzaG9sZCB3aGljaAorCXRyaWdnZXJzIHRoZSBnZW5lcmF0aW9uIG9mIHRoZSBNQVhfRkFJTCBldmVudC4gT25jZSB0aGlzIGV2ZW50IGlzCisJZ2VuZXJhdGVkLCB0aGUgY29uc2VjdXRpdmUgZmFpbHVyZSBjb3VudCBpcyByZXNldCB0byAwLgorCUF0IGluaXRpYWxpemF0aW9uLCB0aGUgTUFYX0ZBSUwgZXZlbnQgaXMgTk9UIHN1YnNjcmliZWQgYnkKKwlkZWZhdWx0LgorCisJaGlnaF9yc3NpCisJVGhpcyBldmVudCBpcyBnZW5lcmF0ZWQgd2hlbiB0aGUgYXZlcmFnZSByZWNlaXZlZCBSU1NJIGluIGJlYWNvbnMgZ29lcworCWFib3ZlIGEgdGhyZXNob2xkLCBzcGVjaWZpZWQgYnkgVmFsdWUuCisKKwlsb3dfcnNzaQorCVRoaXMgZXZlbnQgaXMgZ2VuZXJhdGVkIHdoZW4gdGhlIGF2ZXJhZ2UgcmVjZWl2ZWQgUlNTSSBpbiBiZWFjb25zIGdvZXMKKwliZWxvdyBhIHRocmVzaG9sZCwgc3BlY2lmaWVkIGJ5IFZhbHVlLgorCisJaGlnaF9zbnIKKwlUaGlzIGV2ZW50IGlzIGdlbmVyYXRlZCB3aGVuIHRoZSBhdmVyYWdlIHJlY2VpdmVkIFNOUiBpbiBiZWFjb25zIGdvZXMKKwlhYm92ZSBhIHRocmVzaG9sZCwgc3BlY2lmaWVkIGJ5IFZhbHVlLgorCisJbG93X3NucgorCVRoaXMgZXZlbnQgaXMgZ2VuZXJhdGVkIHdoZW4gdGhlIGF2ZXJhZ2UgcmVjZWl2ZWQgU05SIGluIGJlYWNvbnMgZ29lcworCWJlbG93IGEgdGhyZXNob2xkLCBzcGVjaWZpZWQgYnkgVmFsdWUuCisKK2V4dHNjYW4KKwlUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byBkbyBhIHNwZWNpZmljIHNjYW4uCisKKwlQYXRoOiAvZGVidWdmcy9saWJlcnRhc193aXJlbGVzcy9ldGhYLworCisJVXNhZ2U6IGVjaG8gIlNTSUQiID4gZXh0c2NhbgorCisJRXhhbXBsZToKKwkJZWNobyAiTElOS1NZUy1BUCIgPiBleHRzY2FuCisKKwlUbyBzZWUgdGhlIHJlc3VsdHMgb2YgdXNlIGdldHNjYW50YWJsZSBjb21tYW5kLgorCitnZXRzY2FudGFibGUKKworCURpc3BsYXkgdGhlIGN1cnJlbnQgY29udGVudHMgb2YgdGhlIGRyaXZlciBzY2FuIHRhYmxlIChpZS4gZ2V0IHRoZQorCXNjYW4gcmVzdWx0cykuCisKKwlQYXRoOiAvZGVidWdmcy9saWJlcnRhc193aXJlbGVzcy9ldGhYLworCisJVXNhZ2U6CisJCWNhdCBnZXRzY2FudGFibGUKKworc2V0dXNlcnNjYW4KKwlJbml0aWF0ZSBhIGN1c3RvbWl6ZWQgc2NhbiBhbmQgcmV0cmlldmUgdGhlIHJlc3VsdHMKKworCisJUGF0aDogL2RlYnVnZnMvbGliZXJ0YXNfd2lyZWxlc3MvZXRoWC8KKworICAgIFVzYWdlOgorICAgICAgIGVjaG8gIltBUkdTXSIgPiBzZXR1c2Vyc2NhbgorCisgICAgICAgICB3aGVyZSBbQVJHU106CisKKyAgICAgIGNoYW49W2NoYW4jXVtiYW5kXVttb2RlXSB3aGVyZSBiYW5kIGlzIFthLGIsZ10gYW5kIG1vZGUgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGFuayBmb3IgYWN0aXZlIG9yICdwJyBmb3IgcGFzc2l2ZQorICAgICAgYnNzaWQ9eHg6eHg6eHg6eHg6eHg6eHggIHNwZWNpZnkgYSBCU1NJRCBmaWx0ZXIgZm9yIHRoZSBzY2FuCisgICAgICBzc2lkPSJbU1NJRF0iICAgICAgICAgICAgc3BlY2lmeSBhIFNTSUQgZmlsdGVyIGZvciB0aGUgc2NhbgorICAgICAga2VlcD1bMCBvciAxXSAgICAgICAgICAgIGtlZXAgdGhlIHByZXZpb3VzIHNjYW4gcmVzdWx0cyAoMSksIGRpc2NhcmQgKDApCisgICAgICBkdXI9W3NjYW4gdGltZV0gICAgICAgICAgdGltZSB0byBzY2FuIGZvciBlYWNoIGNoYW5uZWwgaW4gbWlsbGlzZWNvbmRzCisgICAgICBwcm9iZXM9WyNdICAgICAgICAgICAgICAgbnVtYmVyIG9mIHByb2JlIHJlcXVlc3RzIHRvIHNlbmQgb24gZWFjaCBjaGFuCisgICAgICB0eXBlPVsxLDIsM10gICAgICAgICAgICAgQlNTIHR5cGU6IDEgKEluZnJhKSwgMihBZGhvYyksIDMoQW55KQorCisgICAgQW55IGNvbWJpbmF0aW9uIG9mIHRoZSBhYm92ZSBhcmd1bWVudHMgY2FuIGJlIHN1cHBsaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUuCisgICAgICBJZiB0aGUgY2hhbiB0b2tlbiBpcyBhYnNlbnQsIGEgZnVsbCBjaGFubmVsIHNjYW4gd2lsbCBiZSBjb21wbGV0ZWQgYnkKKyAgICAgIHRoZSBkcml2ZXIuICBJZiB0aGUgZHVyIG9yIHByb2JlcyB0b2tlbnMgYXJlIGFic2VudCwgdGhlIGRyaXZlciBkZWZhdWx0CisgICAgICBzZXR0aW5nIHdpbGwgYmUgdXNlZC4gIFRoZSBic3NpZCBhbmQgc3NpZCBmaWVsZHMsIGlmIGJsYW5rLAorICAgICAgd2lsbCBwcm9kdWNlIGFuIHVuZmlsdGVyZWQgc2Nhbi4gVGhlIHR5cGUgZmllbGQgd2lsbCBkZWZhdWx0IHRvIDMgKEFueSkKKyAgICAgIGFuZCB0aGUga2VlcCBmaWVsZCB3aWxsIGRlZmF1bHQgdG8gMCAoRGlzY2FyZCkuCisKKyAgICBFeGFtcGxlczoKKyAgICAxKSBQZXJmb3JtIGFuIGFjdGl2ZSBzY2FuIG9uIGNoYW5uZWxzIDEsIDYsIGFuZCAxMSBpbiB0aGUgJ2cnIGJhbmQ6CisgICAgICAgICAgICBlY2hvICJjaGFuPTFnLDZnLDExZyIgPiBzZXR1c2Vyc2NhbgorCisgICAgMikgUGVyZm9ybSBhIHBhc3NpdmUgc2NhbiBvbiBjaGFubmVsIDExIGZvciAyMCBtczoKKyAgICAgICAgICAgIGVjaG8gImNoYW49MTFncCBkdXI9MjAiID4gc2V0dXNlcnNjYW4KKworICAgIDMpIFBlcmZvcm0gYW4gYWN0aXZlIHNjYW4gb24gY2hhbm5lbHMgMSwgNiwgYW5kIDExOyBhbmQgYSBwYXNzaXZlIHNjYW4gb24KKyAgICAgICBjaGFubmVsIDM2IGluIHRoZSAnYScgYmFuZDoKKworICAgICAgICAgICAgZWNobyAiY2hhbj0xZyw2ZywxMWcsMzZhcCIgPiBzZXR1c2Vyc2NhbgorCisgICAgNCkgUGVyZm9ybSBhbiBhY3RpdmUgc2NhbiBvbiBjaGFubmVsIDYgYW5kIDM2IGZvciBhIHNwZWNpZmljIFNTSUQ6CisgICAgICAgICAgICBlY2hvICJjaGFuPTZnLDM2YSBzc2lkPSJUZXN0QVAiIiA+IHNldHVzZXJzY2FuCisKKyAgICA1KSBTY2FuIGFsbCBhdmFpbGFibGUgY2hhbm5lbHMgKEIvRywgQSBiYW5kcykgZm9yIGEgc3BlY2lmaWMgQlNTSUQsIGtlZXAKKyAgICAgICB0aGUgY3VycmVudCBzY2FuIHRhYmxlIGludGFjdCwgdXBkYXRlIGV4aXN0aW5nIG9yIGFwcGVuZCBuZXcgc2NhbiBkYXRhOgorICAgICAgICAgICAgZWNobyAiYnNzaWQ9MDA6NTA6NDM6MjA6MTI6ODIga2VlcD0xIiA+IHNldHVzZXJzY2FuCisKKyAgICA2KSBTY2FuIGNoYW5uZWwgNiwgZm9yIGFsbCBpbmZyYXN0cnVjdHVyZSBuZXR3b3Jrcywgc2VuZGluZyB0d28gcHJvYmUKKyAgICAgICByZXF1ZXN0cy4gIEtlZXAgdGhlIHByZXZpb3VzIHNjYW4gdGFibGUgaW50YWN0LiBVcGRhdGUgYW55IGR1cGxpY2F0ZQorICAgICAgIEJTU0lEL1NTSUQgbWF0Y2hlcyB3aXRoIHRoZSBuZXcgc2NhbiBkYXRhOgorICAgICAgICAgICAgZWNobyAiY2hhbj02ZyB0eXBlPTEgcHJvYmVzPTIga2VlcD0xIiA+IHNldHVzZXJzY2FuCisKKyAgICBBbGwgZW50cmllcyBpbiB0aGUgc2NhbiB0YWJsZSAobm90IGp1c3QgdGhlIG5ldyBzY2FuIGRhdGEgd2hlbiBrZWVwPTEpCisgICAgd2lsbCBiZSBkaXNwbGF5ZWQgdXBvbiBjb21wbGV0aW9uIGJ5IHVzZSBvZiB0aGUgZ2V0c2NhbnRhYmxlIGlvY3RsLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2Fzc29jLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9hc3NvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1NWM3ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9hc3NvYy5jCkBAIC0wLDAgKzEsNTg4IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDYsIFJlZCBIYXQsIEluYy4gKi8KKworI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPG5ldC9pZWVlODAyMTEuaD4KKworI2luY2x1ZGUgImFzc29jLmgiCisjaW5jbHVkZSAiam9pbi5oIgorI2luY2x1ZGUgImRlY2wuaCIKKyNpbmNsdWRlICJob3N0Y21kLmgiCisjaW5jbHVkZSAiaG9zdC5oIgorCisKK3N0YXRpYyBjb25zdCB1OCBic3NpZF9hbnlbRVRIX0FMRU5dID0geyAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGIH07CitzdGF0aWMgY29uc3QgdTggYnNzaWRfb2ZmW0VUSF9BTEVOXSA9IHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9OworCitzdGF0aWMgaW50IGFzc29jX2hlbHBlcl9lc3NpZCh3bGFuX3ByaXZhdGUgKnByaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXNzb2NfcmVxdWVzdCAqIGFzc29jX3JlcSkKK3sKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCWludCByZXQgPSAwOworCWludCBpOworCisJRU5URVIoKTsKKworCWxic19wcl9kZWJ1ZygxLCAiTmV3IFNTSUQgcmVxdWVzdGVkOiAlc1xuIiwgYXNzb2NfcmVxLT5zc2lkLnNzaWQpOworCWlmIChhc3NvY19yZXEtPm1vZGUgPT0gd2xhbjgwMl8xMWluZnJhc3RydWN0dXJlKSB7CisJCWlmIChhZGFwdGVyLT5wcmVzY2FuKSB7CisJCQlsaWJlcnRhc19zZW5kX3NwZWNpZmljX1NTSURfc2Nhbihwcml2LCAmYXNzb2NfcmVxLT5zc2lkLCAxKTsKKwkJfQorCisJCWkgPSBsaWJlcnRhc19maW5kX1NTSURfaW5fbGlzdChhZGFwdGVyLCAmYXNzb2NfcmVxLT5zc2lkLAorCQkJCU5VTEwsIHdsYW44MDJfMTFpbmZyYXN0cnVjdHVyZSk7CisJCWlmIChpID49IDApIHsKKwkJCWxic19wcl9kZWJ1ZygxLAorCQkJICAgICAgICJTU0lEIGZvdW5kIGluIHNjYW4gbGlzdCAuLi4gYXNzb2NpYXRpbmcuLi5cbiIpOworCisJCQlyZXQgPSB3bGFuX2Fzc29jaWF0ZShwcml2LCAmYWRhcHRlci0+c2NhbnRhYmxlW2ldKTsKKwkJCWlmIChyZXQgPT0gMCkgeworCQkJCW1lbWNweSgmYXNzb2NfcmVxLT5ic3NpZCwKKwkJCQkgICAgICAgJmFkYXB0ZXItPnNjYW50YWJsZVtpXS5tYWNhZGRyZXNzLAorCQkJCSAgICAgICBFVEhfQUxFTik7CisJCQl9CisJCX0gZWxzZSB7CisJCQlsYnNfcHJfZGVidWcoMSwgIlNTSUQgJyVzJyBub3QgZm91bmQ7IGNhbm5vdCBhc3NvY2lhdGVcbiIsCisJCQkJYXNzb2NfcmVxLT5zc2lkLnNzaWQpOworCQl9CisJfSBlbHNlIGlmIChhc3NvY19yZXEtPm1vZGUgPT0gd2xhbjgwMl8xMWlic3MpIHsKKwkJLyogU2NhbiBmb3IgdGhlIG5ldHdvcmssIGRvIG5vdCBzYXZlIHByZXZpb3VzIHJlc3VsdHMuICBTdGFsZQorCQkgKiAgIHNjYW4gZGF0YSB3aWxsIGNhdXNlIHVzIHRvIGpvaW4gYSBub24tZXhpc3RhbnQgYWRob2MgbmV0d29yaworCQkgKi8KKwkJbGliZXJ0YXNfc2VuZF9zcGVjaWZpY19TU0lEX3NjYW4ocHJpdiwgJmFzc29jX3JlcS0+c3NpZCwgMCk7CisKKwkJLyogU2VhcmNoIGZvciB0aGUgcmVxdWVzdGVkIFNTSUQgaW4gdGhlIHNjYW4gdGFibGUgKi8KKwkJaSA9IGxpYmVydGFzX2ZpbmRfU1NJRF9pbl9saXN0KGFkYXB0ZXIsICZhc3NvY19yZXEtPnNzaWQsIE5VTEwsCisJCQkJd2xhbjgwMl8xMWlic3MpOworCQlpZiAoaSA+PSAwKSB7CisJCQlsYnNfcHJfZGVidWcoMSwgIlNTSUQgZm91bmQgYXQgJWQgaW4gTGlzdCwgc28gam9pblxuIiwgcmV0KTsKKwkJCWxpYmVydGFzX2pvaW5fYWRob2NfbmV0d29yayhwcml2LCAmYWRhcHRlci0+c2NhbnRhYmxlW2ldKTsKKwkJfSBlbHNlIHsKKwkJCS8qIGVsc2Ugc2VuZCBTVEFSVCBjb21tYW5kICovCisJCQlsYnNfcHJfZGVidWcoMSwgIlNTSUQgbm90IGZvdW5kIGluIGxpc3QsIHNvIGNyZWF0aW5nIGFkaG9jIgorCQkJCSIgd2l0aCBTU0lEICclcydcbiIsIGFzc29jX3JlcS0+c3NpZC5zc2lkKTsKKwkJCWxpYmVydGFzX3N0YXJ0X2FkaG9jX25ldHdvcmsocHJpdiwgJmFzc29jX3JlcS0+c3NpZCk7CisJCX0KKwkJbWVtY3B5KCZhc3NvY19yZXEtPmJzc2lkLCAmYWRhcHRlci0+Y3VycmVudF9hZGRyLCBFVEhfQUxFTik7CisJfQorCisJTEVBVkUoKTsKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBpbnQgYXNzb2NfaGVscGVyX2Jzc2lkKHdsYW5fcHJpdmF0ZSAqcHJpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhc3NvY19yZXF1ZXN0ICogYXNzb2NfcmVxKQoreworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJaW50IGksIHJldCA9IDA7CisKKwlFTlRFUigpOworCisJbGJzX3ByX2RlYnVnKDEsICJBU1NPQzogV0FQOiBCU1NJRCA9ICIgTUFDX0ZNVCAiXG4iLAorCQlNQUNfQVJHKGFzc29jX3JlcS0+YnNzaWQpKTsKKworCS8qIFNlYXJjaCBmb3IgaW5kZXggcG9zaXRpb24gaW4gbGlzdCBmb3IgcmVxdWVzdGVkIE1BQyAqLworCWkgPSBsaWJlcnRhc19maW5kX0JTU0lEX2luX2xpc3QoYWRhcHRlciwgYXNzb2NfcmVxLT5ic3NpZCwKKwkJCSAgICBhc3NvY19yZXEtPm1vZGUpOworCWlmIChpIDwgMCkgeworCQlsYnNfcHJfZGVidWcoMSwgIkFTU09DOiBXQVA6IEJTU0lEICIgTUFDX0ZNVCAiIG5vdCBmb3VuZCwgIgorCQkJImNhbm5vdCBhc3NvY2lhdGUuXG4iLCBNQUNfQVJHKGFzc29jX3JlcS0+YnNzaWQpKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGFzc29jX3JlcS0+bW9kZSA9PSB3bGFuODAyXzExaW5mcmFzdHJ1Y3R1cmUpIHsKKwkJcmV0ID0gd2xhbl9hc3NvY2lhdGUocHJpdiwgJmFkYXB0ZXItPnNjYW50YWJsZVtpXSk7CisJCWxic19wcl9kZWJ1ZygxLCAiQVNTT0M6IHJldHVybiBmcm9tIHdsYW5fYXNzb2NpYXRlKGJzc2QpIHdhcyAlZFxuIiwgcmV0KTsKKwl9IGVsc2UgaWYgKGFzc29jX3JlcS0+bW9kZSA9PSB3bGFuODAyXzExaWJzcykgeworCQlsaWJlcnRhc19qb2luX2FkaG9jX25ldHdvcmsocHJpdiwgJmFkYXB0ZXItPnNjYW50YWJsZVtpXSk7CisJfQorCW1lbWNweSgmYXNzb2NfcmVxLT5zc2lkLCAmYWRhcHRlci0+c2NhbnRhYmxlW2ldLnNzaWQsCisJCXNpemVvZihzdHJ1Y3QgV0xBTl84MDJfMTFfU1NJRCkpOworCitvdXQ6CisJTEVBVkUoKTsKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBpbnQgYXNzb2NfaGVscGVyX2Fzc29jaWF0ZSh3bGFuX3ByaXZhdGUgKnByaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGFzc29jX3JlcXVlc3QgKiBhc3NvY19yZXEpCit7CisJaW50IHJldCA9IDAsIGRvbmUgPSAwOworCisJLyogSWYgd2UncmUgZ2l2ZW4gYW5kICdhbnknIEJTU0lELCB0cnkgYXNzb2NpYXRpbmcgYmFzZWQgb24gU1NJRCAqLworCisJaWYgKHRlc3RfYml0KEFTU09DX0ZMQUdfQlNTSUQsICZhc3NvY19yZXEtPmZsYWdzKSkgeworCQlpZiAobWVtY21wKGJzc2lkX2FueSwgYXNzb2NfcmVxLT5ic3NpZCwgRVRIX0FMRU4pCisJCSAgICAmJiBtZW1jbXAoYnNzaWRfb2ZmLCBhc3NvY19yZXEtPmJzc2lkLCBFVEhfQUxFTikpIHsKKwkJCXJldCA9IGFzc29jX2hlbHBlcl9ic3NpZChwcml2LCBhc3NvY19yZXEpOworCQkJZG9uZSA9IDE7CisJCQlpZiAocmV0KSB7CisJCQkJbGJzX3ByX2RlYnVnKDEsICJBU1NPQzogYnNzaWQ6IHJldCA9ICVkXG4iLCByZXQpOworCQkJfQorCQl9CisJfQorCisJaWYgKCFkb25lICYmIHRlc3RfYml0KEFTU09DX0ZMQUdfU1NJRCwgJmFzc29jX3JlcS0+ZmxhZ3MpKSB7CisJCXJldCA9IGFzc29jX2hlbHBlcl9lc3NpZChwcml2LCBhc3NvY19yZXEpOworCQlpZiAocmV0KSB7CisJCQlsYnNfcHJfZGVidWcoMSwgIkFTU09DOiBic3NpZDogcmV0ID0gJWRcbiIsIHJldCk7CisJCX0KKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBpbnQgYXNzb2NfaGVscGVyX21vZGUod2xhbl9wcml2YXRlICpwcml2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXNzb2NfcmVxdWVzdCAqIGFzc29jX3JlcSkKK3sKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCWludCByZXQgPSAwOworCisJRU5URVIoKTsKKworCWlmIChhc3NvY19yZXEtPm1vZGUgPT0gYWRhcHRlci0+aW5mcmFtb2RlKSB7CisJCUxFQVZFKCk7CisJCXJldHVybiAwOworCX0KKworCWlmIChhc3NvY19yZXEtPm1vZGUgPT0gd2xhbjgwMl8xMWluZnJhc3RydWN0dXJlKSB7CisJCWlmIChhZGFwdGVyLT5wc3N0YXRlICE9IFBTX1NUQVRFX0ZVTExfUE9XRVIpCisJCQlsaWJlcnRhc19wc193YWtldXAocHJpdiwgY21kX29wdGlvbl93YWl0Zm9ycnNwKTsKKwkJYWRhcHRlci0+cHNtb2RlID0gd2xhbjgwMl8xMXBvd2VybW9kZWNhbTsKKwl9CisKKwlhZGFwdGVyLT5pbmZyYW1vZGUgPSBhc3NvY19yZXEtPm1vZGU7CisJcmV0ID0gbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsCisJCQkJICAgIGNtZF84MDJfMTFfc25tcF9taWIsCisJCQkJICAgIDAsIGNtZF9vcHRpb25fd2FpdGZvcnJzcCwKKwkJCQkgICAgT0lEXzgwMl8xMV9JTkZSQVNUUlVDVFVSRV9NT0RFLAorCQkJCSAgICAodm9pZCAqKSBhc3NvY19yZXEtPm1vZGUpOworCisJTEVBVkUoKTsKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBpbnQgYXNzb2NfaGVscGVyX3dlcF9rZXlzKHdsYW5fcHJpdmF0ZSAqcHJpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhc3NvY19yZXF1ZXN0ICogYXNzb2NfcmVxKQoreworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJaW50IGk7CisJaW50IHJldCA9IDA7CisKKwlFTlRFUigpOworCisJLyogU2V0IG9yIHJlbW92ZSBXRVAga2V5cyAqLworCWlmICggICBhc3NvY19yZXEtPndlcF9rZXlzWzBdLmxlbgorCSAgICB8fCBhc3NvY19yZXEtPndlcF9rZXlzWzFdLmxlbgorCSAgICB8fCBhc3NvY19yZXEtPndlcF9rZXlzWzJdLmxlbgorCSAgICB8fCBhc3NvY19yZXEtPndlcF9rZXlzWzNdLmxlbikgeworCQlyZXQgPSBsaWJlcnRhc19wcmVwYXJlX2FuZF9zZW5kX2NvbW1hbmQocHJpdiwKKwkJCQkJICAgIGNtZF84MDJfMTFfc2V0X3dlcCwKKwkJCQkJICAgIGNtZF9hY3RfYWRkLAorCQkJCQkgICAgY21kX29wdGlvbl93YWl0Zm9ycnNwLAorCQkJCQkgICAgMCwgYXNzb2NfcmVxKTsKKwl9IGVsc2UgeworCQlyZXQgPSBsaWJlcnRhc19wcmVwYXJlX2FuZF9zZW5kX2NvbW1hbmQocHJpdiwKKwkJCQkJICAgIGNtZF84MDJfMTFfc2V0X3dlcCwKKwkJCQkJICAgIGNtZF9hY3RfcmVtb3ZlLAorCQkJCQkgICAgY21kX29wdGlvbl93YWl0Zm9ycnNwLAorCQkJCQkgICAgMCwgTlVMTCk7CisJfQorCisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwkvKiBlbmFibGUvZGlzYWJsZSB0aGUgTUFDJ3MgV0VQIHBhY2tldCBmaWx0ZXIgKi8KKwlpZiAoYXNzb2NfcmVxLT5zZWNpbmZvLldFUHN0YXR1cyA9PSB3bGFuODAyXzExV0VQZW5hYmxlZCkKKwkJYWRhcHRlci0+Y3VycmVudHBhY2tldGZpbHRlciB8PSBjbWRfYWN0X21hY193ZXBfZW5hYmxlOworCWVsc2UKKwkJYWRhcHRlci0+Y3VycmVudHBhY2tldGZpbHRlciAmPSB+Y21kX2FjdF9tYWNfd2VwX2VuYWJsZTsKKwlyZXQgPSBsaWJlcnRhc19zZXRfbWFjX3BhY2tldF9maWx0ZXIocHJpdik7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwltdXRleF9sb2NrKCZhZGFwdGVyLT5sb2NrKTsKKworCS8qIENvcHkgV0VQIGtleXMgaW50byBhZGFwdGVyIHdlcCBrZXkgZmllbGRzICovCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQltZW1jcHkoJmFkYXB0ZXItPndlcF9rZXlzW2ldLCAmYXNzb2NfcmVxLT53ZXBfa2V5c1tpXSwKKwkJCXNpemVvZihzdHJ1Y3QgV0xBTl84MDJfMTFfS0VZKSk7CisJfQorCWFkYXB0ZXItPndlcF90eF9rZXlpZHggPSBhc3NvY19yZXEtPndlcF90eF9rZXlpZHg7CisKKwltdXRleF91bmxvY2soJmFkYXB0ZXItPmxvY2spOworCitvdXQ6CisJTEVBVkUoKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFzc29jX2hlbHBlcl9zZWNpbmZvKHdsYW5fcHJpdmF0ZSAqcHJpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGFzc29jX3JlcXVlc3QgKiBhc3NvY19yZXEpCit7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwlpbnQgcmV0ID0gMDsKKworCUVOVEVSKCk7CisKKwltZW1jcHkoJmFkYXB0ZXItPnNlY2luZm8sICZhc3NvY19yZXEtPnNlY2luZm8sCisJCXNpemVvZihzdHJ1Y3Qgd2xhbl84MDJfMTFfc2VjdXJpdHkpKTsKKworCXJldCA9IGxpYmVydGFzX3NldF9tYWNfcGFja2V0X2ZpbHRlcihwcml2KTsKKworCUxFQVZFKCk7CisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgaW50IGFzc29jX2hlbHBlcl93cGFfa2V5cyh3bGFuX3ByaXZhdGUgKnByaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXNzb2NfcmVxdWVzdCAqIGFzc29jX3JlcSkKK3sKKwlpbnQgcmV0ID0gMDsKKworCUVOVEVSKCk7CisKKwkvKiBlbmFibGUvRGlzYWJsZSBSU04gKi8KKwlyZXQgPSBsaWJlcnRhc19wcmVwYXJlX2FuZF9zZW5kX2NvbW1hbmQocHJpdiwKKwkJCQkgICAgY21kXzgwMl8xMV9lbmFibGVfcnNuLAorCQkJCSAgICBjbWRfYWN0X3NldCwKKwkJCQkgICAgY21kX29wdGlvbl93YWl0Zm9ycnNwLAorCQkJCSAgICAwLCBhc3NvY19yZXEpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJcmV0ID0gbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsCisJCQkJICAgIGNtZF84MDJfMTFfa2V5X21hdGVyaWFsLAorCQkJCSAgICBjbWRfYWN0X3NldCwKKwkJCQkgICAgY21kX29wdGlvbl93YWl0Zm9ycnNwLAorCQkJCSAgICAwLCBhc3NvY19yZXEpOworCitvdXQ6CisJTEVBVkUoKTsKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBpbnQgYXNzb2NfaGVscGVyX3dwYV9pZSh3bGFuX3ByaXZhdGUgKnByaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGFzc29jX3JlcXVlc3QgKiBhc3NvY19yZXEpCit7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwlpbnQgcmV0ID0gMDsKKworCUVOVEVSKCk7CisKKwlpZiAoYXNzb2NfcmVxLT5zZWNpbmZvLldQQWVuYWJsZWQgfHwgYXNzb2NfcmVxLT5zZWNpbmZvLldQQTJlbmFibGVkKSB7CisJCW1lbWNweSgmYWRhcHRlci0+d3BhX2llLCAmYXNzb2NfcmVxLT53cGFfaWUsIGFzc29jX3JlcS0+d3BhX2llX2xlbik7CisJCWFkYXB0ZXItPndwYV9pZV9sZW4gPSBhc3NvY19yZXEtPndwYV9pZV9sZW47CisJfSBlbHNlIHsKKwkJbWVtc2V0KCZhZGFwdGVyLT53cGFfaWUsIDAsIE1BWF9XUEFfSUVfTEVOKTsKKwkJYWRhcHRlci0+d3BhX2llX2xlbiA9IDA7CisJfQorCisJTEVBVkUoKTsKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBpbnQgc2hvdWxkX2RlYXV0aF9pbmZyYXN0cnVjdHVyZSh3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGFzc29jX3JlcXVlc3QgKiBhc3NvY19yZXEpCit7CisJaWYgKGFkYXB0ZXItPmNvbm5lY3Rfc3RhdHVzICE9IGxpYmVydGFzX2Nvbm5lY3RlZCkKKwkJcmV0dXJuIDA7CisKKwlpZiAodGVzdF9iaXQoQVNTT0NfRkxBR19TU0lELCAmYXNzb2NfcmVxLT5mbGFncykpIHsKKwkJbGJzX3ByX2RlYnVnKDEsICJEZWF1dGhlbnRpY2F0aW5nIGR1ZSB0byBuZXcgU1NJRCBpbiAiCisJCQkiIGNvbmZpZ3VyYXRpb24gcmVxdWVzdC5cbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAodGVzdF9iaXQoQVNTT0NfRkxBR19TRUNJTkZPLCAmYXNzb2NfcmVxLT5mbGFncykpIHsKKwkJaWYgKGFkYXB0ZXItPnNlY2luZm8uYXV0aG1vZGUgIT0KKwkJICAgIGFzc29jX3JlcS0+c2VjaW5mby5hdXRobW9kZSkgeworCQkJbGJzX3ByX2RlYnVnKDEsICJEZWF1dGhlbnRpY2F0aW5nIGR1ZSB0byB1cGRhdGVkIHNlY3VyaXR5ICIKKwkJCQkiaW5mbyBpbiBjb25maWd1cmF0aW9uIHJlcXVlc3QuXG4iKTsKKwkJCXJldHVybiAxOworCQl9CisJfQorCisJaWYgKHRlc3RfYml0KEFTU09DX0ZMQUdfQlNTSUQsICZhc3NvY19yZXEtPmZsYWdzKSkgeworCQlsYnNfcHJfZGVidWcoMSwgIkRlYXV0aGVudGljYXRpbmcgZHVlIHRvIG5ldyBCU1NJRCBpbiAiCisJCQkiIGNvbmZpZ3VyYXRpb24gcmVxdWVzdC5cbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBGSVhNRTogZGVhbCB3aXRoICdhdXRvJyBtb2RlIHNvbWVob3cgKi8KKwlpZiAodGVzdF9iaXQoQVNTT0NfRkxBR19NT0RFLCAmYXNzb2NfcmVxLT5mbGFncykpIHsKKwkJaWYgKGFzc29jX3JlcS0+bW9kZSAhPSB3bGFuODAyXzExaW5mcmFzdHJ1Y3R1cmUpCisJCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHNob3VsZF9zdG9wX2FkaG9jKHdsYW5fYWRhcHRlciAqYWRhcHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGFzc29jX3JlcXVlc3QgKiBhc3NvY19yZXEpCit7CisJaWYgKGFkYXB0ZXItPmNvbm5lY3Rfc3RhdHVzICE9IGxpYmVydGFzX2Nvbm5lY3RlZCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoYWRhcHRlci0+Y3VyYnNzcGFyYW1zLnNzaWQuc3NpZGxlbmd0aCAhPSBhc3NvY19yZXEtPnNzaWQuc3NpZGxlbmd0aCkKKwkJcmV0dXJuIDE7CisJaWYgKG1lbWNtcChhZGFwdGVyLT5jdXJic3NwYXJhbXMuc3NpZC5zc2lkLCBhc3NvY19yZXEtPnNzaWQuc3NpZCwKKwkJCXNpemVvZihzdHJ1Y3QgV0xBTl84MDJfMTFfU1NJRCkpKQorCQlyZXR1cm4gMTsKKworCS8qIEZJWE1FOiBkZWFsIHdpdGggJ2F1dG8nIG1vZGUgc29tZWhvdyAqLworCWlmICh0ZXN0X2JpdChBU1NPQ19GTEFHX01PREUsICZhc3NvY19yZXEtPmZsYWdzKSkgeworCQlpZiAoYXNzb2NfcmVxLT5tb2RlICE9IHdsYW44MDJfMTFpYnNzKQorCQkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKwordm9pZCB3bGFuX2Fzc29jaWF0aW9uX3dvcmtlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJd2xhbl9wcml2YXRlICpwcml2ID0gY29udGFpbmVyX29mKHdvcmssIHdsYW5fcHJpdmF0ZSwgYXNzb2Nfd29yay53b3JrKTsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCXN0cnVjdCBhc3NvY19yZXF1ZXN0ICogYXNzb2NfcmVxID0gTlVMTDsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgZmluZF9hbnlfc3NpZCA9IDA7CisKKwlFTlRFUigpOworCisJbXV0ZXhfbG9jaygmYWRhcHRlci0+bG9jayk7CisJYXNzb2NfcmVxID0gYWRhcHRlci0+YXNzb2NfcmVxOworCWFkYXB0ZXItPmFzc29jX3JlcSA9IE5VTEw7CisJbXV0ZXhfdW5sb2NrKCZhZGFwdGVyLT5sb2NrKTsKKworCWlmICghYXNzb2NfcmVxKSB7CisJCUxFQVZFKCk7CisJCXJldHVybjsKKwl9CisKKwlsYnNfcHJfZGVidWcoMSwgIkFTU09DOiBzdGFydGluZyBuZXcgYXNzb2NpYXRpb24gcmVxdWVzdDogZmxhZ3MgPSAweCVsWFxuIiwKKwkJYXNzb2NfcmVxLT5mbGFncyk7CisKKwkvKiBJZiAnYW55JyBTU0lEIHdhcyBzcGVjaWZpZWQsIGZpbmQgYW4gU1NJRCB0byBhc3NvY2lhdGUgd2l0aCAqLworCWlmICh0ZXN0X2JpdChBU1NPQ19GTEFHX1NTSUQsICZhc3NvY19yZXEtPmZsYWdzKQorCSAgICAmJiAhYXNzb2NfcmVxLT5zc2lkLnNzaWRsZW5ndGgpCisJCWZpbmRfYW55X3NzaWQgPSAxOworCisJLyogQnV0IGRvbid0IHVzZSAnYW55JyBTU0lEIGlmIHRoZXJlJ3MgYSB2YWxpZCBsb2NrZWQgQlNTSUQgdG8gdXNlICovCisJaWYgKHRlc3RfYml0KEFTU09DX0ZMQUdfQlNTSUQsICZhc3NvY19yZXEtPmZsYWdzKSkgeworCQlpZiAobWVtY21wKCZhc3NvY19yZXEtPmJzc2lkLCBic3NpZF9hbnksIEVUSF9BTEVOKQorCQkgICAgJiYgbWVtY21wKCZhc3NvY19yZXEtPmJzc2lkLCBic3NpZF9vZmYsIEVUSF9BTEVOKSkKKwkJCWZpbmRfYW55X3NzaWQgPSAwOworCX0KKworCWlmIChmaW5kX2FueV9zc2lkKSB7CisJCWVudW0gV0xBTl84MDJfMTFfTkVUV09SS19JTkZSQVNUUlVDVFVSRSBuZXdfbW9kZTsKKworCQlyZXQgPSBsaWJlcnRhc19maW5kX2Jlc3RfbmV0d29ya19TU0lEKHByaXYsICZhc3NvY19yZXEtPnNzaWQsCisJCQkJYXNzb2NfcmVxLT5tb2RlLCAmbmV3X21vZGUpOworCQlpZiAocmV0KSB7CisJCQlsYnNfcHJfZGVidWcoMSwgIkNvdWxkIG5vdCBmaW5kIGJlc3QgbmV0d29ya1xuIik7CisJCQlyZXQgPSAtRU5FVFVOUkVBQ0g7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCS8qIEVuc3VyZSB3ZSBzd2l0Y2ggdG8gdGhlIG1vZGUgb2YgdGhlIEFQICovCisJCWlmIChhc3NvY19yZXEtPm1vZGUgPT0gd2xhbjgwMl8xMWF1dG91bmtub3duKSB7CisJCQlzZXRfYml0KEFTU09DX0ZMQUdfTU9ERSwgJmFzc29jX3JlcS0+ZmxhZ3MpOworCQkJYXNzb2NfcmVxLT5tb2RlID0gbmV3X21vZGU7CisJCX0KKwl9CisKKwkvKgorCSAqIENoZWNrIGlmIHRoZSBhdHRyaWJ1dGVzIGJlaW5nIGNoYW5naW5nIHJlcXVpcmUgZGVhdXRoZW50aWNhdGlvbgorCSAqIGZyb20gdGhlIGN1cnJlbnRseSBhc3NvY2lhdGVkIGluZnJhc3RydWN0dXJlIGFjY2VzcyBwb2ludC4KKwkgKi8KKwlpZiAoYWRhcHRlci0+aW5mcmFtb2RlID09IHdsYW44MDJfMTFpbmZyYXN0cnVjdHVyZSkgeworCQlpZiAoc2hvdWxkX2RlYXV0aF9pbmZyYXN0cnVjdHVyZShhZGFwdGVyLCBhc3NvY19yZXEpKSB7CisJCQlyZXQgPSBsaWJlcnRhc19zZW5kX2RlYXV0aGVudGljYXRpb24ocHJpdik7CisJCQlpZiAocmV0KSB7CisJCQkJbGJzX3ByX2RlYnVnKDEsICJEZWF1dGhlbnRpY2F0aW9uIGR1ZSB0byBuZXcgIgorCQkJCQkiY29uZmlndXJhdGlvbiByZXF1ZXN0IGZhaWxlZDogJWRcbiIsCisJCQkJCXJldCk7CisJCQl9CisJCX0KKwl9IGVsc2UgaWYgKGFkYXB0ZXItPmluZnJhbW9kZSA9PSB3bGFuODAyXzExaWJzcykgeworCQlpZiAoc2hvdWxkX3N0b3BfYWRob2MoYWRhcHRlciwgYXNzb2NfcmVxKSkgeworCQkJcmV0ID0gbGliZXJ0YXNfc3RvcF9hZGhvY19uZXR3b3JrKHByaXYpOworCQkJaWYgKHJldCkgeworCQkJCWxic19wcl9kZWJ1ZygxLCAiVGVhcmRvd24gb2YgQWRIb2MgbmV0d29yayBkdWUgdG8gIgorCQkJCQkibmV3IGNvbmZpZ3VyYXRpb24gcmVxdWVzdCBmYWlsZWQ6ICVkXG4iLAorCQkJCQlyZXQpOworCQkJfQorCisJCX0KKwl9CisKKwkvKiBTZW5kIHRoZSB2YXJpb3VzIGNvbmZpZ3VyYXRpb24gYml0cyB0byB0aGUgZmlybXdhcmUgKi8KKwlpZiAodGVzdF9iaXQoQVNTT0NfRkxBR19NT0RFLCAmYXNzb2NfcmVxLT5mbGFncykpIHsKKwkJcmV0ID0gYXNzb2NfaGVscGVyX21vZGUocHJpdiwgYXNzb2NfcmVxKTsKKwkJaWYgKHJldCkgeworbGJzX3ByX2RlYnVnKDEsICJBU1NPQyg6JWQpIG1vZGU6IHJldCA9ICVkXG4iLCBfX0xJTkVfXywgcmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJaWYgKCAgIHRlc3RfYml0KEFTU09DX0ZMQUdfV0VQX0tFWVMsICZhc3NvY19yZXEtPmZsYWdzKQorCSAgICB8fCB0ZXN0X2JpdChBU1NPQ19GTEFHX1dFUF9UWF9LRVlJRFgsICZhc3NvY19yZXEtPmZsYWdzKSkgeworCQlyZXQgPSBhc3NvY19oZWxwZXJfd2VwX2tleXMocHJpdiwgYXNzb2NfcmVxKTsKKwkJaWYgKHJldCkgeworbGJzX3ByX2RlYnVnKDEsICJBU1NPQyg6JWQpIHdlcF9rZXlzOiByZXQgPSAlZFxuIiwgX19MSU5FX18sIHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCWlmICh0ZXN0X2JpdChBU1NPQ19GTEFHX1NFQ0lORk8sICZhc3NvY19yZXEtPmZsYWdzKSkgeworCQlyZXQgPSBhc3NvY19oZWxwZXJfc2VjaW5mbyhwcml2LCBhc3NvY19yZXEpOworCQlpZiAocmV0KSB7CitsYnNfcHJfZGVidWcoMSwgIkFTU09DKDolZCkgc2VjaW5mbzogcmV0ID0gJWRcbiIsIF9fTElORV9fLCByZXQpOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwlpZiAodGVzdF9iaXQoQVNTT0NfRkxBR19XUEFfSUUsICZhc3NvY19yZXEtPmZsYWdzKSkgeworCQlyZXQgPSBhc3NvY19oZWxwZXJfd3BhX2llKHByaXYsIGFzc29jX3JlcSk7CisJCWlmIChyZXQpIHsKK2xic19wcl9kZWJ1ZygxLCAiQVNTT0MoOiVkKSB3cGFfaWU6IHJldCA9ICVkXG4iLCBfX0xJTkVfXywgcmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJaWYgKHRlc3RfYml0KEFTU09DX0ZMQUdfV1BBX01DQVNUX0tFWSwgJmFzc29jX3JlcS0+ZmxhZ3MpCisJICAgIHx8IHRlc3RfYml0KEFTU09DX0ZMQUdfV1BBX1VDQVNUX0tFWSwgJmFzc29jX3JlcS0+ZmxhZ3MpKSB7CisJCXJldCA9IGFzc29jX2hlbHBlcl93cGFfa2V5cyhwcml2LCBhc3NvY19yZXEpOworCQlpZiAocmV0KSB7CitsYnNfcHJfZGVidWcoMSwgIkFTU09DKDolZCkgd3BhX2tleXM6IHJldCA9ICVkXG4iLCBfX0xJTkVfXywgcmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJLyogU1NJRC9CU1NJRCBzaG91bGQgYmUgdGhlIF9sYXN0XyBjb25maWcgb3B0aW9uIHNldCwgYmVjYXVzZSB0aGV5CisJICogdHJpZ2dlciB0aGUgYXNzb2NpYXRpb24gYXR0ZW1wdC4KKwkgKi8KKwlpZiAodGVzdF9iaXQoQVNTT0NfRkxBR19CU1NJRCwgJmFzc29jX3JlcS0+ZmxhZ3MpCisJICAgIHx8IHRlc3RfYml0KEFTU09DX0ZMQUdfU1NJRCwgJmFzc29jX3JlcS0+ZmxhZ3MpKSB7CisJCWludCBzdWNjZXNzID0gMTsKKworCQlyZXQgPSBhc3NvY19oZWxwZXJfYXNzb2NpYXRlKHByaXYsIGFzc29jX3JlcSk7CisJCWlmIChyZXQpIHsKKwkJCWxic19wcl9kZWJ1ZygxLCAiQVNTT0M6IGFzc29jaWF0aW9uIGF0dGVtcHQgdW5zdWNjZXNzZnVsOiAlZFxuIiwKKwkJCQlyZXQpOworCQkJc3VjY2VzcyA9IDA7CisJCX0KKworCQlpZiAoYWRhcHRlci0+Y29ubmVjdF9zdGF0dXMgIT0gbGliZXJ0YXNfY29ubmVjdGVkKSB7CisJCQlsYnNfcHJfZGVidWcoMSwgIkFTU09DOiBhc3NvaWNhdGlvbiBhdHRlbXB0IHVuc3VjY2Vzc2Z1bCwgIgorCQkJCSJub3QgY29ubmVjdGVkLlxuIik7CisJCQlzdWNjZXNzID0gMDsKKwkJfQorCisJCWlmIChzdWNjZXNzKSB7CisJCQlsYnNfcHJfZGVidWcoMSwgIkFTU09DOiBhc3NvY2lhdGlvbiBhdHRlbXB0IHN1Y2Nlc3NmdWwuICIKKwkJCQkiQXNzb2NpYXRlZCB0byAnJXMnICgiIE1BQ19GTVQgIilcbiIsCisJCQkJYXNzb2NfcmVxLT5zc2lkLnNzaWQsIE1BQ19BUkcoYXNzb2NfcmVxLT5ic3NpZCkpOworCQkJbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsCisJCQkJY21kXzgwMl8xMV9yc3NpLAorCQkJCTAsIGNtZF9vcHRpb25fd2FpdGZvcnJzcCwgMCwgTlVMTCk7CisKKwkJCWxpYmVydGFzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZChwcml2LAorCQkJCWNtZF84MDJfMTFfZ2V0X2xvZywKKwkJCQkwLCBjbWRfb3B0aW9uX3dhaXRmb3Jyc3AsIDAsIE5VTEwpOworCQl9IGVsc2UgeworCisJCQlyZXQgPSAtMTsKKwkJfQorCX0KKworb3V0OgorCWlmIChyZXQpIHsKKwkJbGJzX3ByX2RlYnVnKDEsICJBU1NPQzogcmVjb25maWd1cmF0aW9uIGF0dGVtcHQgdW5zdWNjZXNzZnVsOiAlZFxuIiwKKwkJCXJldCk7CisJfQorCWtmcmVlKGFzc29jX3JlcSk7CisJTEVBVkUoKTsKK30KKworCisvKgorICogQ2FsbGVyIE1VU1QgaG9sZCBhbnkgbmVjZXNzYXJ5IGxvY2tzCisgKi8KK3N0cnVjdCBhc3NvY19yZXF1ZXN0ICogd2xhbl9nZXRfYXNzb2NpYXRpb25fcmVxdWVzdCh3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IGFzc29jX3JlcXVlc3QgKiBhc3NvY19yZXE7CisKKwlpZiAoIWFkYXB0ZXItPmFzc29jX3JlcSkgeworCQlhZGFwdGVyLT5hc3NvY19yZXEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYXNzb2NfcmVxdWVzdCksIEdGUF9LRVJORUwpOworCQlpZiAoIWFkYXB0ZXItPmFzc29jX3JlcSkgeworCQkJbGJzX3ByX2luZm8oIk5vdCBlbm91Z2ggbWVtb3J5IHRvIGFsbG9jYXRlIGFzc29jaWF0aW9uIgorCQkJCSIgcmVxdWVzdCFcbiIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9CisKKwkvKiBDb3B5IGN1cnJlbnQgY29uZmlndXJhdGlvbiBhdHRyaWJ1dGVzIHRvIHRoZSBhc3NvY2lhdGlvbiByZXF1ZXN0LAorCSAqIGJ1dCBkb24ndCBvdmVyd3JpdGUgYW55IHRoYXQgYXJlIGFscmVhZHkgc2V0LgorCSAqLworCWFzc29jX3JlcSA9IGFkYXB0ZXItPmFzc29jX3JlcTsKKwlpZiAoIXRlc3RfYml0KEFTU09DX0ZMQUdfU1NJRCwgJmFzc29jX3JlcS0+ZmxhZ3MpKSB7CisJCW1lbWNweSgmYXNzb2NfcmVxLT5zc2lkLCBhZGFwdGVyLT5jdXJic3NwYXJhbXMuc3NpZC5zc2lkLAorCQkJYWRhcHRlci0+Y3VyYnNzcGFyYW1zLnNzaWQuc3NpZGxlbmd0aCk7CisJfQorCisJaWYgKCF0ZXN0X2JpdChBU1NPQ19GTEFHX0NIQU5ORUwsICZhc3NvY19yZXEtPmZsYWdzKSkKKwkJYXNzb2NfcmVxLT5jaGFubmVsID0gYWRhcHRlci0+Y3VyYnNzcGFyYW1zLmNoYW5uZWw7CisKKwlpZiAoIXRlc3RfYml0KEFTU09DX0ZMQUdfTU9ERSwgJmFzc29jX3JlcS0+ZmxhZ3MpKQorCQlhc3NvY19yZXEtPm1vZGUgPSBhZGFwdGVyLT5pbmZyYW1vZGU7CisKKwlpZiAoIXRlc3RfYml0KEFTU09DX0ZMQUdfQlNTSUQsICZhc3NvY19yZXEtPmZsYWdzKSkgeworCQltZW1jcHkoJmFzc29jX3JlcS0+YnNzaWQsIGFkYXB0ZXItPmN1cmJzc3BhcmFtcy5ic3NpZCwKKwkJCUVUSF9BTEVOKTsKKwl9CisKKwlpZiAoIXRlc3RfYml0KEFTU09DX0ZMQUdfV0VQX0tFWVMsICZhc3NvY19yZXEtPmZsYWdzKSkgeworCQlpbnQgaTsKKwkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQkJbWVtY3B5KCZhc3NvY19yZXEtPndlcF9rZXlzW2ldLCAmYWRhcHRlci0+d2VwX2tleXNbaV0sCisJCQkJc2l6ZW9mKHN0cnVjdCBXTEFOXzgwMl8xMV9LRVkpKTsKKwkJfQorCX0KKworCWlmICghdGVzdF9iaXQoQVNTT0NfRkxBR19XRVBfVFhfS0VZSURYLCAmYXNzb2NfcmVxLT5mbGFncykpCisJCWFzc29jX3JlcS0+d2VwX3R4X2tleWlkeCA9IGFkYXB0ZXItPndlcF90eF9rZXlpZHg7CisKKwlpZiAoIXRlc3RfYml0KEFTU09DX0ZMQUdfV1BBX01DQVNUX0tFWSwgJmFzc29jX3JlcS0+ZmxhZ3MpKSB7CisJCW1lbWNweSgmYXNzb2NfcmVxLT53cGFfbWNhc3Rfa2V5LCAmYWRhcHRlci0+d3BhX21jYXN0X2tleSwKKwkJCXNpemVvZihzdHJ1Y3QgV0xBTl84MDJfMTFfS0VZKSk7CisJfQorCisJaWYgKCF0ZXN0X2JpdChBU1NPQ19GTEFHX1dQQV9VQ0FTVF9LRVksICZhc3NvY19yZXEtPmZsYWdzKSkgeworCQltZW1jcHkoJmFzc29jX3JlcS0+d3BhX3VuaWNhc3Rfa2V5LCAmYWRhcHRlci0+d3BhX3VuaWNhc3Rfa2V5LAorCQkJc2l6ZW9mKHN0cnVjdCBXTEFOXzgwMl8xMV9LRVkpKTsKKwl9CisKKwlpZiAoIXRlc3RfYml0KEFTU09DX0ZMQUdfU0VDSU5GTywgJmFzc29jX3JlcS0+ZmxhZ3MpKSB7CisJCW1lbWNweSgmYXNzb2NfcmVxLT5zZWNpbmZvLCAmYWRhcHRlci0+c2VjaW5mbywKKwkJCXNpemVvZihzdHJ1Y3Qgd2xhbl84MDJfMTFfc2VjdXJpdHkpKTsKKwl9CisKKwlpZiAoIXRlc3RfYml0KEFTU09DX0ZMQUdfV1BBX0lFLCAmYXNzb2NfcmVxLT5mbGFncykpIHsKKwkJbWVtY3B5KCZhc3NvY19yZXEtPndwYV9pZSwgJmFkYXB0ZXItPndwYV9pZSwKKwkJCU1BWF9XUEFfSUVfTEVOKTsKKwkJYXNzb2NfcmVxLT53cGFfaWVfbGVuID0gYWRhcHRlci0+d3BhX2llX2xlbjsKKwl9CisKKwlyZXR1cm4gYXNzb2NfcmVxOworfQorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2Fzc29jLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9hc3NvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmZmQ4MmQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9hc3NvYy5oCkBAIC0wLDAgKzEsMzAgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwNiwgUmVkIEhhdCwgSW5jLiAqLworCisjaWZuZGVmIF9XTEFOX0FTU09DX0hfCisjZGVmaW5lIF9XTEFOX0FTU09DX0hfCisKKyNpbmNsdWRlICJkZXYuaCIKKwordm9pZCB3bGFuX2Fzc29jaWF0aW9uX3dvcmtlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworCitzdHJ1Y3QgYXNzb2NfcmVxdWVzdCAqIHdsYW5fZ2V0X2Fzc29jaWF0aW9uX3JlcXVlc3Qod2xhbl9hZGFwdGVyICphZGFwdGVyKTsKKworI2RlZmluZSBBU1NPQ19ERUxBWSAoSFogLyAyKQorc3RhdGljIGlubGluZSB2b2lkIHdsYW5fcG9zdHBvbmVfYXNzb2NpYXRpb25fd29yayh3bGFuX3ByaXZhdGUgKnByaXYpCit7CisJaWYgKHByaXYtPmFkYXB0ZXItPnN1cnByaXNlcmVtb3ZlZCkKKwkJcmV0dXJuOworCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPmFzc29jX3dvcmspOworCXF1ZXVlX2RlbGF5ZWRfd29yayhwcml2LT5hc3NvY190aHJlYWQsICZwcml2LT5hc3NvY193b3JrLCBBU1NPQ19ERUxBWSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3bGFuX2NhbmNlbF9hc3NvY2lhdGlvbl93b3JrKHdsYW5fcHJpdmF0ZSAqcHJpdikKK3sKKwljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5hc3NvY193b3JrKTsKKwlpZiAocHJpdi0+YWRhcHRlci0+YXNzb2NfcmVxKSB7CisJCWtmcmVlKHByaXYtPmFkYXB0ZXItPmFzc29jX3JlcSk7CisJCXByaXYtPmFkYXB0ZXItPmFzc29jX3JlcSA9IE5VTEw7CisJfQorfQorCisjZW5kaWYgLyogX1dMQU5fQVNTT0NfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvY21kLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9jbWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmRhYzU4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvY21kLmMKQEAgLTAsMCArMSwxOTU4IEBACisvKioKKyAgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGhhbmRsaW5nIG9mIGNvbW1hbmQuCisgICogSXQgcHJlcGFyZXMgY29tbWFuZCBhbmQgc2VuZHMgaXQgdG8gZmlybXdhcmUgd2hlbiBpdCBpcyByZWFkeS4KKyAgKi8KKworI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+CisjaW5jbHVkZSAiaG9zdC5oIgorI2luY2x1ZGUgImhvc3RjbWQuaCIKKyNpbmNsdWRlICJzYmkuaCIKKyNpbmNsdWRlICJkZWNsLmgiCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgImRldi5oIgorI2luY2x1ZGUgImpvaW4uaCIKKyNpbmNsdWRlICJ3ZXh0LmgiCisKK3N0YXRpYyB2b2lkIGNsZWFudXBfY21kbm9kZShzdHJ1Y3QgY21kX2N0cmxfbm9kZSAqcHRlbXBub2RlKTsKKworc3RhdGljIHUxNiBjb21tYW5kc19hbGxvd2VkX2luX3BzW10gPSB7CisJY21kXzgwMl8xMV9yc3NpLAorfTsKKworLyoqCisgKiAgQGJyaWVmIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGlmIHRoZSBjb21tYW5zIGlzIGFsbG93ZWQKKyAqICBpbiBQUyBtb2RlIG5vdC4KKyAqCisgKiAgQHBhcmFtIGNvbW1hbmQgdGhlIGNvbW1hbmQgSUQKKyAqICBAcmV0dXJuIAkgICBUUlVFIG9yIEZBTFNFCisgKi8KK3N0YXRpYyB1OCBpc19jb21tYW5kX2FsbG93ZWRfaW5fcHModTE2IGNvbW1hbmQpCit7CisJaW50IGNvdW50ID0gc2l6ZW9mKGNvbW1hbmRzX2FsbG93ZWRfaW5fcHMpCisJICAgIC8gc2l6ZW9mKGNvbW1hbmRzX2FsbG93ZWRfaW5fcHNbMF0pOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJaWYgKGNvbW1hbmQgPT0gY3B1X3RvX2xlMTYoY29tbWFuZHNfYWxsb3dlZF9pbl9wc1tpXSkpCisJCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bGFuX2NtZF9od19zcGVjKHdsYW5fcHJpdmF0ZSAqIHByaXYsIHN0cnVjdCBjbWRfZHNfY29tbWFuZCAqY21kKQoreworCXN0cnVjdCBjbWRfZHNfZ2V0X2h3X3NwZWMgKmh3c3BlYyA9ICZjbWQtPnBhcmFtcy5od3NwZWM7CisKKwlFTlRFUigpOworCisJY21kLT5jb21tYW5kID0gY3B1X3RvX2xlMTYoY21kX2dldF9od19zcGVjKTsKKwljbWQtPnNpemUgPQorCSAgICBjcHVfdG9fbGUxNihzaXplb2Yoc3RydWN0IGNtZF9kc19nZXRfaHdfc3BlYykgKyBTX0RTX0dFTik7CisJbWVtY3B5KGh3c3BlYy0+cGVybWFuZW50YWRkciwgcHJpdi0+YWRhcHRlci0+Y3VycmVudF9hZGRyLCBFVEhfQUxFTik7CisKKwlMRUFWRSgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdsYW5fY21kXzgwMl8xMV9wc19tb2RlKHdsYW5fcHJpdmF0ZSAqIHByaXYsCisJCQkJICAgc3RydWN0IGNtZF9kc19jb21tYW5kICpjbWQsCisJCQkJICAgdTE2IGNtZF9hY3Rpb24pCit7CisJc3RydWN0IGNtZF9kc184MDJfMTFfcHNfbW9kZSAqcHNtID0gJmNtZC0+cGFyYW1zLnBzbW9kZTsKKwl1MTYgYWN0aW9uID0gY21kX2FjdGlvbjsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCisJRU5URVIoKTsKKworCWNtZC0+Y29tbWFuZCA9IGNwdV90b19sZTE2KGNtZF84MDJfMTFfcHNfbW9kZSk7CisJY21kLT5zaXplID0KKwkgICAgY3B1X3RvX2xlMTYoc2l6ZW9mKHN0cnVjdCBjbWRfZHNfODAyXzExX3BzX21vZGUpICsKKwkJCSAgICAgU19EU19HRU4pOworCXBzbS0+YWN0aW9uID0gY3B1X3RvX2xlMTYoY21kX2FjdGlvbik7CisJcHNtLT5tdWx0aXBsZWR0aW0gPSAwOworCXN3aXRjaCAoYWN0aW9uKSB7CisJY2FzZSBjbWRfc3ViY21kX2VudGVyX3BzOgorCQlsYnNfcHJfZGVidWcoMSwgIlBTIGNvbW1hbmQ6IiAiU3ViQ29kZS0gRW50ZXIgUFNcbiIpOworCQlsYnNfcHJfZGVidWcoMSwgImxvY2FsbGlzdGVuaW50ZXJ2YWwgPSAlZFxuIiwKKwkJICAgICAgIGFkYXB0ZXItPmxvY2FsbGlzdGVuaW50ZXJ2YWwpOworCisJCXBzbS0+bG9jYWxsaXN0ZW5pbnRlcnZhbCA9CisJCSAgICBjcHVfdG9fbGUxNihhZGFwdGVyLT5sb2NhbGxpc3RlbmludGVydmFsKTsKKwkJcHNtLT5udWxscGt0aW50ZXJ2YWwgPQorCQkgICAgY3B1X3RvX2xlMTYoYWRhcHRlci0+bnVsbHBrdGludGVydmFsKTsKKwkJcHNtLT5tdWx0aXBsZWR0aW0gPQorCQkgICAgY3B1X3RvX2xlMTYocHJpdi0+YWRhcHRlci0+bXVsdGlwbGVkdGltKTsKKwkJYnJlYWs7CisKKwljYXNlIGNtZF9zdWJjbWRfZXhpdF9wczoKKwkJbGJzX3ByX2RlYnVnKDEsICJQUyBjb21tYW5kOiIgIlN1YkNvZGUtIEV4aXQgUFNcbiIpOworCQlicmVhazsKKworCWNhc2UgY21kX3N1YmNtZF9zbGVlcF9jb25maXJtZWQ6CisJCWxic19wcl9kZWJ1ZygxLCAiUFMgY29tbWFuZDogU3ViQ29kZS0gc2xlZXAgY29uZmlybVxuIik7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJTEVBVkUoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bGFuX2NtZF84MDJfMTFfaW5hY3Rpdml0eV90aW1lb3V0KHdsYW5fcHJpdmF0ZSAqIHByaXYsCisJCQkJCSAgICAgIHN0cnVjdCBjbWRfZHNfY29tbWFuZCAqY21kLAorCQkJCQkgICAgICB1MTYgY21kX2FjdGlvbiwgdm9pZCAqcGRhdGFfYnVmKQoreworCXUxNiAqdGltZW91dCA9IHBkYXRhX2J1ZjsKKworCWNtZC0+Y29tbWFuZCA9IGNwdV90b19sZTE2KGNtZF84MDJfMTFfaW5hY3Rpdml0eV90aW1lb3V0KTsKKwljbWQtPnNpemUgPQorCSAgICBjcHVfdG9fbGUxNihzaXplb2Yoc3RydWN0IGNtZF9kc184MDJfMTFfaW5hY3Rpdml0eV90aW1lb3V0KQorCQkJICAgICArIFNfRFNfR0VOKTsKKworCWNtZC0+cGFyYW1zLmluYWN0aXZpdHlfdGltZW91dC5hY3Rpb24gPSBjcHVfdG9fbGUxNihjbWRfYWN0aW9uKTsKKworCWlmIChjbWRfYWN0aW9uKQorCQljbWQtPnBhcmFtcy5pbmFjdGl2aXR5X3RpbWVvdXQudGltZW91dCA9CisJCSAgICBjcHVfdG9fbGUxNigqdGltZW91dCk7CisJZWxzZQorCQljbWQtPnBhcmFtcy5pbmFjdGl2aXR5X3RpbWVvdXQudGltZW91dCA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bGFuX2NtZF84MDJfMTFfc2xlZXBfcGFyYW1zKHdsYW5fcHJpdmF0ZSAqIHByaXYsCisJCQkJCXN0cnVjdCBjbWRfZHNfY29tbWFuZCAqY21kLAorCQkJCQl1MTYgY21kX2FjdGlvbikKK3sKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCXN0cnVjdCBjbWRfZHNfODAyXzExX3NsZWVwX3BhcmFtcyAqc3AgPSAmY21kLT5wYXJhbXMuc2xlZXBfcGFyYW1zOworCisJRU5URVIoKTsKKworCWNtZC0+c2l6ZSA9CisJICAgIGNwdV90b19sZTE2KChzaXplb2Yoc3RydWN0IGNtZF9kc184MDJfMTFfc2xlZXBfcGFyYW1zKSkgKworCQkJICAgICBTX0RTX0dFTik7CisJY21kLT5jb21tYW5kID0gY3B1X3RvX2xlMTYoY21kXzgwMl8xMV9zbGVlcF9wYXJhbXMpOworCisJaWYgKGNtZF9hY3Rpb24gPT0gY21kX2FjdF9nZXQpIHsKKwkJbWVtc2V0KCZhZGFwdGVyLT5zcCwgMCwgc2l6ZW9mKHN0cnVjdCBzbGVlcF9wYXJhbXMpKTsKKwkJbWVtc2V0KHNwLCAwLCBzaXplb2Yoc3RydWN0IGNtZF9kc184MDJfMTFfc2xlZXBfcGFyYW1zKSk7CisJCXNwLT5hY3Rpb24gPSBjcHVfdG9fbGUxNihjbWRfYWN0aW9uKTsKKwl9IGVsc2UgaWYgKGNtZF9hY3Rpb24gPT0gY21kX2FjdF9zZXQpIHsKKwkJc3AtPmFjdGlvbiA9IGNwdV90b19sZTE2KGNtZF9hY3Rpb24pOworCQlzcC0+ZXJyb3IgPSBjcHVfdG9fbGUxNihhZGFwdGVyLT5zcC5zcF9lcnJvcik7CisJCXNwLT5vZmZzZXQgPSBjcHVfdG9fbGUxNihhZGFwdGVyLT5zcC5zcF9vZmZzZXQpOworCQlzcC0+c3RhYmxldGltZSA9IGNwdV90b19sZTE2KGFkYXB0ZXItPnNwLnNwX3N0YWJsZXRpbWUpOworCQlzcC0+Y2FsY29udHJvbCA9ICh1OCkgYWRhcHRlci0+c3Auc3BfY2FsY29udHJvbDsKKwkJc3AtPmV4dGVybmFsc2xlZXBjbGsgPSAodTgpIGFkYXB0ZXItPnNwLnNwX2V4dHNsZWVwY2xrOworCQlzcC0+cmVzZXJ2ZWQgPSBjcHVfdG9fbGUxNihhZGFwdGVyLT5zcC5zcF9yZXNlcnZlZCk7CisJfQorCisJTEVBVkUoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bGFuX2NtZF84MDJfMTFfc2V0X3dlcCh3bGFuX3ByaXZhdGUgKiBwcml2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKmNtZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyIGNtZF9hY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiBwZGF0YV9idWYpCit7CisJc3RydWN0IGNtZF9kc184MDJfMTFfc2V0X3dlcCAqd2VwID0gJmNtZC0+cGFyYW1zLndlcDsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCWludCByZXQgPSAwOworCXN0cnVjdCBhc3NvY19yZXF1ZXN0ICogYXNzb2NfcmVxID0gcGRhdGFfYnVmOworCisJRU5URVIoKTsKKworCWNtZC0+Y29tbWFuZCA9IGNwdV90b19sZTE2KGNtZF84MDJfMTFfc2V0X3dlcCk7CisJY21kLT5zaXplID0gY3B1X3RvX2xlMTYoKHNpemVvZihzdHJ1Y3QgY21kX2RzXzgwMl8xMV9zZXRfd2VwKSkKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgU19EU19HRU4pOworCisJaWYgKGNtZF9hY3QgPT0gY21kX2FjdF9hZGQpIHsKKwkJaW50IGk7CisKKwkJaWYgKCFhc3NvY19yZXEpIHsKKwkJCWxic19wcl9kZWJ1ZygxLCAiSW52YWxpZCBhc3NvY2lhdGlvbiByZXF1ZXN0ISIpOworCQkJcmV0ID0gLTE7CisJCQlnb3RvIGRvbmU7CisJCX0KKworCQl3ZXAtPmFjdGlvbiA9IGNwdV90b19sZTE2KGNtZF9hY3RfYWRkKTsKKworCQkvKiBkZWZhdWx0IHR4IGtleSBpbmRleCAqLworCQl3ZXAtPmtleWluZGV4ID0gY3B1X3RvX2xlMTYoKHUxNikKKwkJCQkgICAgICAgICAgICAgICAgIChhc3NvY19yZXEtPndlcF90eF9rZXlpZHggJgorCQkJCSAgICAgICAgICAgICAgICAgKHUzMiljbWRfV0VQX0tFWV9JTkRFWF9NQVNLKSk7CisKKwkJbGJzX3ByX2RlYnVnKDEsICJUeCBrZXkgSW5kZXg6ICV1XG4iLCB3ZXAtPmtleWluZGV4KTsKKworCQkvKiBDb3B5IGtleSB0eXBlcyBhbmQgbWF0ZXJpYWwgdG8gaG9zdCBjb21tYW5kIHN0cnVjdHVyZSAqLworCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCQlzdHJ1Y3QgV0xBTl84MDJfMTFfS0VZICogcGtleSA9ICZhc3NvY19yZXEtPndlcF9rZXlzW2ldOworCisJCQlzd2l0Y2ggKHBrZXktPmxlbikgeworCQkJY2FzZSBLRVlfTEVOX1dFUF80MDoKKwkJCQl3ZXAtPmtleXR5cGVbaV0gPSBjbWRfdHlwZV93ZXBfNDBfYml0OworCQkJCW1lbW1vdmUoJndlcC0+a2V5bWF0ZXJpYWxbaV0sIHBrZXktPmtleSwKKwkJCQkgICAgICAgIHBrZXktPmxlbik7CisJCQkJYnJlYWs7CisJCQljYXNlIEtFWV9MRU5fV0VQXzEwNDoKKwkJCQl3ZXAtPmtleXR5cGVbaV0gPSBjbWRfdHlwZV93ZXBfMTA0X2JpdDsKKwkJCQltZW1tb3ZlKCZ3ZXAtPmtleW1hdGVyaWFsW2ldLCBwa2V5LT5rZXksCisJCQkJICAgICAgICBwa2V5LT5sZW4pOworCQkJCWJyZWFrOworCQkJY2FzZSAwOgorCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlsYnNfcHJfZGVidWcoMSwgIkludmFsaWQgV0VQIGtleSAlZCBsZW5ndGggb2YgJWRcbiIsCisJCQkJICAgICAgIGksIHBrZXktPmxlbik7CisJCQkJcmV0ID0gLTE7CisJCQkJZ290byBkb25lOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfSBlbHNlIGlmIChjbWRfYWN0ID09IGNtZF9hY3RfcmVtb3ZlKSB7CisJCS8qIEFDVF9SRU1PVkUgY2xlYXJzIF9hbGxfIFdFUCBrZXlzICovCisJCXdlcC0+YWN0aW9uID0gY3B1X3RvX2xlMTYoY21kX2FjdF9yZW1vdmUpOworCisJCS8qIGRlZmF1bHQgdHgga2V5IGluZGV4ICovCisJCXdlcC0+a2V5aW5kZXggPSBjcHVfdG9fbGUxNigodTE2KQorCQkJCSAgICAgICAgICAgICAgICAgKGFkYXB0ZXItPndlcF90eF9rZXlpZHggJgorCQkJCSAgICAgICAgICAgICAgICAgKHUzMiljbWRfV0VQX0tFWV9JTkRFWF9NQVNLKSk7CisJfQorCisJcmV0ID0gMDsKKworZG9uZToKKwlMRUFWRSgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgd2xhbl9jbWRfODAyXzExX2VuYWJsZV9yc24od2xhbl9wcml2YXRlICogcHJpdiwKKwkJCQkgICAgICBzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKmNtZCwKKwkJCQkgICAgICB1MTYgY21kX2FjdGlvbikKK3sKKwlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9lbmFibGVfcnNuICpwZW5hYmxlUlNOID0gJmNtZC0+cGFyYW1zLmVuYnJzbjsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCisJY21kLT5jb21tYW5kID0gY3B1X3RvX2xlMTYoY21kXzgwMl8xMV9lbmFibGVfcnNuKTsKKwljbWQtPnNpemUgPQorCSAgICBjcHVfdG9fbGUxNihzaXplb2Yoc3RydWN0IGNtZF9kc184MDJfMTFfZW5hYmxlX3JzbikgKworCQkJICAgICBTX0RTX0dFTik7CisJcGVuYWJsZVJTTi0+YWN0aW9uID0gY3B1X3RvX2xlMTYoY21kX2FjdGlvbik7CisJaWYgKGFkYXB0ZXItPnNlY2luZm8uV1BBZW5hYmxlZCB8fCBhZGFwdGVyLT5zZWNpbmZvLldQQTJlbmFibGVkKSB7CisJCXBlbmFibGVSU04tPmVuYWJsZSA9IGNwdV90b19sZTE2KGNtZF9lbmFibGVfcnNuKTsKKwl9IGVsc2UgeworCQlwZW5hYmxlUlNOLT5lbmFibGUgPSBjcHVfdG9fbGUxNihjbWRfZGlzYWJsZV9yc24pOworCX0KKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIHNldF9vbmVfd3BhX2tleShzdHJ1Y3QgTXJ2bElFdHlwZV9rZXlQYXJhbVNldCAqIHBrZXlwYXJhbXNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgV0xBTl84MDJfMTFfS0VZICogcGtleSkKK3sKKwlwa2V5cGFyYW1zZXQtPmtleXR5cGVpZCA9IGNwdV90b19sZTE2KHBrZXktPnR5cGUpOworCisJaWYgKHBrZXktPmZsYWdzICYgS0VZX0lORk9fV1BBX0VOQUJMRUQpIHsKKwkJcGtleXBhcmFtc2V0LT5rZXlpbmZvID0gY3B1X3RvX2xlMTYoS0VZX0lORk9fV1BBX0VOQUJMRUQpOworCX0gZWxzZSB7CisJCXBrZXlwYXJhbXNldC0+a2V5aW5mbyA9IGNwdV90b19sZTE2KCFLRVlfSU5GT19XUEFfRU5BQkxFRCk7CisJfQorCisJaWYgKHBrZXktPmZsYWdzICYgS0VZX0lORk9fV1BBX1VOSUNBU1QpIHsKKwkJcGtleXBhcmFtc2V0LT5rZXlpbmZvIHw9IGNwdV90b19sZTE2KEtFWV9JTkZPX1dQQV9VTklDQVNUKTsKKwl9IGVsc2UgaWYgKHBrZXktPmZsYWdzICYgS0VZX0lORk9fV1BBX01DQVNUKSB7CisJCXBrZXlwYXJhbXNldC0+a2V5aW5mbyB8PSBjcHVfdG9fbGUxNihLRVlfSU5GT19XUEFfTUNBU1QpOworCX0KKworCXBrZXlwYXJhbXNldC0+dHlwZSA9IGNwdV90b19sZTE2KFRMVl9UWVBFX0tFWV9NQVRFUklBTCk7CisJcGtleXBhcmFtc2V0LT5rZXlsZW4gPSBjcHVfdG9fbGUxNihwa2V5LT5sZW4pOworCW1lbWNweShwa2V5cGFyYW1zZXQtPmtleSwgcGtleS0+a2V5LCBwa2V5LT5sZW4pOworCXBrZXlwYXJhbXNldC0+bGVuZ3RoID0gY3B1X3RvX2xlMTYoICBzaXplb2YocGtleXBhcmFtc2V0LT5rZXl0eXBlaWQpCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2l6ZW9mKHBrZXlwYXJhbXNldC0+a2V5aW5mbykKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzaXplb2YocGtleXBhcmFtc2V0LT5rZXlsZW4pCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2l6ZW9mKHBrZXlwYXJhbXNldC0+a2V5KSk7Cit9CisKK3N0YXRpYyBpbnQgd2xhbl9jbWRfODAyXzExX2tleV9tYXRlcmlhbCh3bGFuX3ByaXZhdGUgKiBwcml2LAorCQkJCQlzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKmNtZCwKKwkJCQkJdTE2IGNtZF9hY3Rpb24sCisJCQkJCXUzMiBjbWRfb2lkLCB2b2lkICpwZGF0YV9idWYpCit7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9rZXlfbWF0ZXJpYWwgKnBrZXltYXRlcmlhbCA9CisJICAgICZjbWQtPnBhcmFtcy5rZXltYXRlcmlhbDsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgaW5kZXggPSAwOworCisJRU5URVIoKTsKKworCWNtZC0+Y29tbWFuZCA9IGNwdV90b19sZTE2KGNtZF84MDJfMTFfa2V5X21hdGVyaWFsKTsKKwlwa2V5bWF0ZXJpYWwtPmFjdGlvbiA9IGNwdV90b19sZTE2KGNtZF9hY3Rpb24pOworCisJaWYgKGNtZF9hY3Rpb24gPT0gY21kX2FjdF9nZXQpIHsKKwkJY21kLT5zaXplID0gY3B1X3RvX2xlMTYoICBTX0RTX0dFTgorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2l6ZW9mIChwa2V5bWF0ZXJpYWwtPmFjdGlvbikpOworCQlyZXQgPSAwOworCQlnb3RvIGRvbmU7CisJfQorCisJbWVtc2V0KCZwa2V5bWF0ZXJpYWwtPmtleVBhcmFtU2V0LCAwLCBzaXplb2YocGtleW1hdGVyaWFsLT5rZXlQYXJhbVNldCkpOworCisJaWYgKGFkYXB0ZXItPndwYV91bmljYXN0X2tleS5sZW4pIHsKKwkJc2V0X29uZV93cGFfa2V5KCZwa2V5bWF0ZXJpYWwtPmtleVBhcmFtU2V0W2luZGV4XSwKKwkJICAgICAgICAgICAgICAgICZhZGFwdGVyLT53cGFfdW5pY2FzdF9rZXkpOworCQlpbmRleCsrOworCX0KKworCWlmIChhZGFwdGVyLT53cGFfbWNhc3Rfa2V5LmxlbikgeworCQlzZXRfb25lX3dwYV9rZXkoJnBrZXltYXRlcmlhbC0+a2V5UGFyYW1TZXRbaW5kZXhdLAorCQkgICAgICAgICAgICAgICAgJmFkYXB0ZXItPndwYV9tY2FzdF9rZXkpOworCQlpbmRleCsrOworCX0KKworCWNtZC0+c2l6ZSA9IGNwdV90b19sZTE2KCAgU19EU19HRU4KKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2l6ZW9mIChwa2V5bWF0ZXJpYWwtPmFjdGlvbikKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaW5kZXggKiBzaXplb2Yoc3RydWN0IE1ydmxJRXR5cGVfa2V5UGFyYW1TZXQpKTsKKworCXJldCA9IDA7CisKK2RvbmU6CisJTEVBVkUoKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHdsYW5fY21kXzgwMl8xMV9yZXNldCh3bGFuX3ByaXZhdGUgKiBwcml2LAorCQkJCSBzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKmNtZCwgaW50IGNtZF9hY3Rpb24pCit7CisJc3RydWN0IGNtZF9kc184MDJfMTFfcmVzZXQgKnJlc2V0ID0gJmNtZC0+cGFyYW1zLnJlc2V0OworCisJY21kLT5jb21tYW5kID0gY3B1X3RvX2xlMTYoY21kXzgwMl8xMV9yZXNldCk7CisJY21kLT5zaXplID0gY3B1X3RvX2xlMTYoc2l6ZW9mKHN0cnVjdCBjbWRfZHNfODAyXzExX3Jlc2V0KSArIFNfRFNfR0VOKTsKKwlyZXNldC0+YWN0aW9uID0gY3B1X3RvX2xlMTYoY21kX2FjdGlvbik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bGFuX2NtZF84MDJfMTFfZ2V0X2xvZyh3bGFuX3ByaXZhdGUgKiBwcml2LAorCQkJCSAgIHN0cnVjdCBjbWRfZHNfY29tbWFuZCAqY21kKQoreworCWNtZC0+Y29tbWFuZCA9IGNwdV90b19sZTE2KGNtZF84MDJfMTFfZ2V0X2xvZyk7CisJY21kLT5zaXplID0KKwkJY3B1X3RvX2xlMTYoc2l6ZW9mKHN0cnVjdCBjbWRfZHNfODAyXzExX2dldF9sb2cpICsgU19EU19HRU4pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2xhbl9jbWRfODAyXzExX2dldF9zdGF0KHdsYW5fcHJpdmF0ZSAqIHByaXYsCisJCQkJICAgIHN0cnVjdCBjbWRfZHNfY29tbWFuZCAqY21kKQoreworCWNtZC0+Y29tbWFuZCA9IGNwdV90b19sZTE2KGNtZF84MDJfMTFfZ2V0X3N0YXQpOworCWNtZC0+c2l6ZSA9CisJICAgIGNwdV90b19sZTE2KHNpemVvZihzdHJ1Y3QgY21kX2RzXzgwMl8xMV9nZXRfc3RhdCkgKworCQkJICAgICBTX0RTX0dFTik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bGFuX2NtZF84MDJfMTFfc25tcF9taWIod2xhbl9wcml2YXRlICogcHJpdiwKKwkJCQkgICAgc3RydWN0IGNtZF9kc19jb21tYW5kICpjbWQsCisJCQkJICAgIGludCBjbWRfYWN0aW9uLAorCQkJCSAgICBpbnQgY21kX29pZCwgdm9pZCAqcGRhdGFfYnVmKQoreworCXN0cnVjdCBjbWRfZHNfODAyXzExX3NubXBfbWliICpwU05NUE1JQiA9ICZjbWQtPnBhcmFtcy5zbWliOworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJdTggdWNUZW1wOworCisJRU5URVIoKTsKKworCWxic19wcl9kZWJ1ZygxLCAiU05NUF9DTUQ6IGNtZF9vaWQgPSAweCV4XG4iLCBjbWRfb2lkKTsKKworCWNtZC0+Y29tbWFuZCA9IGNwdV90b19sZTE2KGNtZF84MDJfMTFfc25tcF9taWIpOworCWNtZC0+c2l6ZSA9CisJICAgIGNwdV90b19sZTE2KHNpemVvZihzdHJ1Y3QgY21kX2RzXzgwMl8xMV9zbm1wX21pYikgKworCQkJICAgICBTX0RTX0dFTik7CisKKwlzd2l0Y2ggKGNtZF9vaWQpIHsKKwljYXNlIE9JRF84MDJfMTFfSU5GUkFTVFJVQ1RVUkVfTU9ERToKKwl7CisJCWVudW0gV0xBTl84MDJfMTFfTkVUV09SS19JTkZSQVNUUlVDVFVSRSBtb2RlID0KKwkJCShlbnVtIFdMQU5fODAyXzExX05FVFdPUktfSU5GUkFTVFJVQ1RVUkUpIHBkYXRhX2J1ZjsKKwkJcFNOTVBNSUItPnF1ZXJ5dHlwZSA9IGNwdV90b19sZTE2KGNtZF9hY3Rfc2V0KTsKKwkJcFNOTVBNSUItPm9pZCA9IGNwdV90b19sZTE2KCh1MTYpIGRlc2lyZWRfYnNzdHlwZV9pKTsKKwkJcFNOTVBNSUItPmJ1ZnNpemUgPSBzaXplb2YodTgpOworCQlpZiAobW9kZSA9PSB3bGFuODAyXzExaW5mcmFzdHJ1Y3R1cmUpCisJCQl1Y1RlbXAgPSBTTk1QX01JQl9WQUxVRV9JTkZSQTsKKwkJZWxzZQorCQkJdWNUZW1wID0gU05NUF9NSUJfVkFMVUVfQURIT0M7CisKKwkJbWVtbW92ZShwU05NUE1JQi0+dmFsdWUsICZ1Y1RlbXAsIHNpemVvZih1OCkpOworCisJCWJyZWFrOworCX0KKworCWNhc2UgT0lEXzgwMl8xMURfRU5BQkxFOgorCQl7CisJCQl1MzIgdWxUZW1wOworCisJCQlwU05NUE1JQi0+b2lkID0gY3B1X3RvX2xlMTYoKHUxNikgZG90MTFkX2kpOworCisJCQlpZiAoY21kX2FjdGlvbiA9PSBjbWRfYWN0X3NldCkgeworCQkJCXBTTk1QTUlCLT5xdWVyeXR5cGUgPSBjbWRfYWN0X3NldDsKKwkJCQlwU05NUE1JQi0+YnVmc2l6ZSA9IHNpemVvZih1MTYpOworCQkJCXVsVGVtcCA9ICoodTMyICopcGRhdGFfYnVmOworCQkJCSooKHVuc2lnbmVkIHNob3J0ICopKHBTTk1QTUlCLT52YWx1ZSkpID0KKwkJCQkgICAgY3B1X3RvX2xlMTYoKHUxNikgdWxUZW1wKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwljYXNlIE9JRF84MDJfMTFfRlJBR01FTlRBVElPTl9USFJFU0hPTEQ6CisJCXsKKwkJCXUzMiB1bFRlbXA7CisKKwkJCXBTTk1QTUlCLT5vaWQgPSBjcHVfdG9fbGUxNigodTE2KSBmcmFndGhyZXNoX2kpOworCisJCQlpZiAoY21kX2FjdGlvbiA9PSBjbWRfYWN0X2dldCkgeworCQkJCXBTTk1QTUlCLT5xdWVyeXR5cGUgPQorCQkJCSAgICBjcHVfdG9fbGUxNihjbWRfYWN0X2dldCk7CisJCQl9IGVsc2UgaWYgKGNtZF9hY3Rpb24gPT0gY21kX2FjdF9zZXQpIHsKKwkJCQlwU05NUE1JQi0+cXVlcnl0eXBlID0KKwkJCQkgICAgY3B1X3RvX2xlMTYoY21kX2FjdF9zZXQpOworCQkJCXBTTk1QTUlCLT5idWZzaXplID0KKwkJCQkgICAgY3B1X3RvX2xlMTYoc2l6ZW9mKHUxNikpOworCQkJCXVsVGVtcCA9ICooKHUzMiAqKSBwZGF0YV9idWYpOworCQkJCSooKHVuc2lnbmVkIHNob3J0ICopKHBTTk1QTUlCLT52YWx1ZSkpID0KKwkJCQkgICAgY3B1X3RvX2xlMTYoKHUxNikgdWxUZW1wKTsKKworCQkJfQorCisJCQlicmVhazsKKwkJfQorCisJY2FzZSBPSURfODAyXzExX1JUU19USFJFU0hPTEQ6CisJCXsKKworCQkJdTMyIHVsVGVtcDsKKwkJCXBTTk1QTUlCLT5vaWQgPSBsZTE2X3RvX2NwdSgodTE2KSBydHN0aHJlc2hfaSk7CisKKwkJCWlmIChjbWRfYWN0aW9uID09IGNtZF9hY3RfZ2V0KSB7CisJCQkJcFNOTVBNSUItPnF1ZXJ5dHlwZSA9CisJCQkJICAgIGNwdV90b19sZTE2KGNtZF9hY3RfZ2V0KTsKKwkJCX0gZWxzZSBpZiAoY21kX2FjdGlvbiA9PSBjbWRfYWN0X3NldCkgeworCQkJCXBTTk1QTUlCLT5xdWVyeXR5cGUgPQorCQkJCSAgICBjcHVfdG9fbGUxNihjbWRfYWN0X3NldCk7CisJCQkJcFNOTVBNSUItPmJ1ZnNpemUgPQorCQkJCSAgICBjcHVfdG9fbGUxNihzaXplb2YodTE2KSk7CisJCQkJdWxUZW1wID0gKigodTMyICopCisJCQkJCSAgIHBkYXRhX2J1Zik7CisJCQkJKih1bnNpZ25lZCBzaG9ydCAqKShwU05NUE1JQi0+dmFsdWUpID0KKwkJCQkgICAgY3B1X3RvX2xlMTYoKHUxNikgdWxUZW1wKTsKKworCQkJfQorCQkJYnJlYWs7CisJCX0KKwljYXNlIE9JRF84MDJfMTFfVFhfUkVUUllDT1VOVDoKKwkJcFNOTVBNSUItPm9pZCA9IGNwdV90b19sZTE2KCh1MTYpIHNob3J0X3JldHJ5bGltX2kpOworCisJCWlmIChjbWRfYWN0aW9uID09IGNtZF9hY3RfZ2V0KSB7CisJCQlwU05NUE1JQi0+cXVlcnl0eXBlID0KKwkJCSAgICBjcHVfdG9fbGUxNihjbWRfYWN0X2dldCk7CisJCX0gZWxzZSBpZiAoY21kX2FjdGlvbiA9PSBjbWRfYWN0X3NldCkgeworCQkJcFNOTVBNSUItPnF1ZXJ5dHlwZSA9CisJCQkgICAgY3B1X3RvX2xlMTYoY21kX2FjdF9zZXQpOworCQkJcFNOTVBNSUItPmJ1ZnNpemUgPSBjcHVfdG9fbGUxNihzaXplb2YodTE2KSk7CisJCQkqKCh1bnNpZ25lZCBzaG9ydCAqKShwU05NUE1JQi0+dmFsdWUpKSA9CisJCQkgICAgY3B1X3RvX2xlMTYoKHUxNikgYWRhcHRlci0+dHhyZXRyeWNvdW50KTsKKwkJfQorCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCWxic19wcl9kZWJ1ZygxLAorCSAgICAgICAiU05NUF9DTUQ6IGNvbW1hbmQ9MHgleCwgc2l6ZT0weCV4LCBzZXFudW09MHgleCwgcmVzdWx0PTB4JXhcbiIsCisJICAgICAgIGNtZC0+Y29tbWFuZCwgY21kLT5zaXplLCBjbWQtPnNlcW51bSwgY21kLT5yZXN1bHQpOworCisJbGJzX3ByX2RlYnVnKDEsCisJICAgICAgICJTTk1QX0NNRDogYWN0aW9uPTB4JXgsIG9pZD0weCV4LCBvaWRzaXplPTB4JXgsIHZhbHVlPTB4JXhcbiIsCisJICAgICAgIHBTTk1QTUlCLT5xdWVyeXR5cGUsIHBTTk1QTUlCLT5vaWQsIHBTTk1QTUlCLT5idWZzaXplLAorCSAgICAgICAqKHUxNiAqKSBwU05NUE1JQi0+dmFsdWUpOworCisJTEVBVkUoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bGFuX2NtZF84MDJfMTFfcmFkaW9fY29udHJvbCh3bGFuX3ByaXZhdGUgKiBwcml2LAorCQkJCQkgc3RydWN0IGNtZF9kc19jb21tYW5kICpjbWQsCisJCQkJCSBpbnQgY21kX2FjdGlvbikKK3sKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCXN0cnVjdCBjbWRfZHNfODAyXzExX3JhZGlvX2NvbnRyb2wgKnByYWRpb2NvbnRyb2wgPQorCSAgICAmY21kLT5wYXJhbXMucmFkaW87CisKKwlFTlRFUigpOworCisJY21kLT5zaXplID0KKwkgICAgY3B1X3RvX2xlMTYoKHNpemVvZihzdHJ1Y3QgY21kX2RzXzgwMl8xMV9yYWRpb19jb250cm9sKSkgKworCQkJICAgICBTX0RTX0dFTik7CisJY21kLT5jb21tYW5kID0gY3B1X3RvX2xlMTYoY21kXzgwMl8xMV9yYWRpb19jb250cm9sKTsKKworCXByYWRpb2NvbnRyb2wtPmFjdGlvbiA9IGNwdV90b19sZTE2KGNtZF9hY3Rpb24pOworCisJc3dpdGNoIChhZGFwdGVyLT5wcmVhbWJsZSkgeworCWNhc2UgY21kX3R5cGVfc2hvcnRfcHJlYW1ibGU6CisJCXByYWRpb2NvbnRyb2wtPmNvbnRyb2wgPSBjcHVfdG9fbGUxNihTRVRfU0hPUlRfUFJFQU1CTEUpOworCQlicmVhazsKKworCWNhc2UgY21kX3R5cGVfbG9uZ19wcmVhbWJsZToKKwkJcHJhZGlvY29udHJvbC0+Y29udHJvbCA9IGNwdV90b19sZTE2KFNFVF9MT05HX1BSRUFNQkxFKTsKKwkJYnJlYWs7CisKKwljYXNlIGNtZF90eXBlX2F1dG9fcHJlYW1ibGU6CisJZGVmYXVsdDoKKwkJcHJhZGlvY29udHJvbC0+Y29udHJvbCA9IGNwdV90b19sZTE2KFNFVF9BVVRPX1BSRUFNQkxFKTsKKwkJYnJlYWs7CisJfQorCisJaWYgKGFkYXB0ZXItPnJhZGlvb24pCisJCXByYWRpb2NvbnRyb2wtPmNvbnRyb2wgfD0gY3B1X3RvX2xlMTYoVFVSTl9PTl9SRik7CisJZWxzZQorCQlwcmFkaW9jb250cm9sLT5jb250cm9sICY9IGNwdV90b19sZTE2KH5UVVJOX09OX1JGKTsKKworCUxFQVZFKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2xhbl9jbWRfODAyXzExX3JmX3R4X3Bvd2VyKHdsYW5fcHJpdmF0ZSAqIHByaXYsCisJCQkJICAgICAgIHN0cnVjdCBjbWRfZHNfY29tbWFuZCAqY21kLAorCQkJCSAgICAgICB1MTYgY21kX2FjdGlvbiwgdm9pZCAqcGRhdGFfYnVmKQoreworCisJc3RydWN0IGNtZF9kc184MDJfMTFfcmZfdHhfcG93ZXIgKnBydHAgPSAmY21kLT5wYXJhbXMudHhwOworCisJRU5URVIoKTsKKworCWNtZC0+c2l6ZSA9CisJICAgIGNwdV90b19sZTE2KChzaXplb2Yoc3RydWN0IGNtZF9kc184MDJfMTFfcmZfdHhfcG93ZXIpKSArCisJCQkgICAgIFNfRFNfR0VOKTsKKwljbWQtPmNvbW1hbmQgPSBjcHVfdG9fbGUxNihjbWRfODAyXzExX3JmX3R4X3Bvd2VyKTsKKwlwcnRwLT5hY3Rpb24gPSBjbWRfYWN0aW9uOworCisJbGJzX3ByX2RlYnVnKDEsICJSRl9UWF9QT1dFUl9DTUQ6IHNpemU6JWQgY21kOjB4JXggQWN0OiVkXG4iLCBjbWQtPnNpemUsCisJICAgICAgIGNtZC0+Y29tbWFuZCwgcHJ0cC0+YWN0aW9uKTsKKworCXN3aXRjaCAoY21kX2FjdGlvbikgeworCWNhc2UgY21kX2FjdF90eF9wb3dlcl9vcHRfZ2V0OgorCQlwcnRwLT5hY3Rpb24gPSBjcHVfdG9fbGUxNihjbWRfYWN0X2dldCk7CisJCXBydHAtPmN1cnJlbnRsZXZlbCA9IDA7CisJCWJyZWFrOworCisJY2FzZSBjbWRfYWN0X3R4X3Bvd2VyX29wdF9zZXRfaGlnaDoKKwkJcHJ0cC0+YWN0aW9uID0gY3B1X3RvX2xlMTYoY21kX2FjdF9zZXQpOworCQlwcnRwLT5jdXJyZW50bGV2ZWwgPQorCQkgICAgY3B1X3RvX2xlMTYoY21kX2FjdF90eF9wb3dlcl9pbmRleF9oaWdoKTsKKwkJYnJlYWs7CisKKwljYXNlIGNtZF9hY3RfdHhfcG93ZXJfb3B0X3NldF9taWQ6CisJCXBydHAtPmFjdGlvbiA9IGNwdV90b19sZTE2KGNtZF9hY3Rfc2V0KTsKKwkJcHJ0cC0+Y3VycmVudGxldmVsID0KKwkJICAgIGNwdV90b19sZTE2KGNtZF9hY3RfdHhfcG93ZXJfaW5kZXhfbWlkKTsKKwkJYnJlYWs7CisKKwljYXNlIGNtZF9hY3RfdHhfcG93ZXJfb3B0X3NldF9sb3c6CisJCXBydHAtPmFjdGlvbiA9IGNwdV90b19sZTE2KGNtZF9hY3Rfc2V0KTsKKwkJcHJ0cC0+Y3VycmVudGxldmVsID0gY3B1X3RvX2xlMTYoKigodTE2ICopIHBkYXRhX2J1ZikpOworCQlicmVhazsKKwl9CisJTEVBVkUoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bGFuX2NtZF84MDJfMTFfcmZfYW50ZW5uYSh3bGFuX3ByaXZhdGUgKiBwcml2LAorCQkJCSAgICAgIHN0cnVjdCBjbWRfZHNfY29tbWFuZCAqY21kLAorCQkJCSAgICAgIHUxNiBjbWRfYWN0aW9uLCB2b2lkICpwZGF0YV9idWYpCit7CisJc3RydWN0IGNtZF9kc184MDJfMTFfcmZfYW50ZW5uYSAqcmFudCA9ICZjbWQtPnBhcmFtcy5yYW50OworCisJY21kLT5jb21tYW5kID0gY3B1X3RvX2xlMTYoY21kXzgwMl8xMV9yZl9hbnRlbm5hKTsKKwljbWQtPnNpemUgPQorCSAgICBjcHVfdG9fbGUxNihzaXplb2Yoc3RydWN0IGNtZF9kc184MDJfMTFfcmZfYW50ZW5uYSkgKworCQkJICAgICBTX0RTX0dFTik7CisKKwlyYW50LT5hY3Rpb24gPSBjcHVfdG9fbGUxNihjbWRfYWN0aW9uKTsKKwlpZiAoKGNtZF9hY3Rpb24gPT0gY21kX2FjdF9zZXRfcngpIHx8CisJICAgIChjbWRfYWN0aW9uID09IGNtZF9hY3Rfc2V0X3R4KSkgeworCQlyYW50LT5hbnRlbm5hbW9kZSA9CisJCSAgICBjcHVfdG9fbGUxNigodTE2KSAoKih1MzIgKikgcGRhdGFfYnVmKSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2xhbl9jbWRfODAyXzExX3JhdGVfYWRhcHRfcmF0ZXNldCh3bGFuX3ByaXZhdGUgKiBwcml2LAorCQkJCQkgICAgICBzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKmNtZCwKKwkJCQkJICAgICAgdTE2IGNtZF9hY3Rpb24pCit7CisJc3RydWN0IGNtZF9kc184MDJfMTFfcmF0ZV9hZGFwdF9yYXRlc2V0CisJKnJhdGVhZGFwdCA9ICZjbWQtPnBhcmFtcy5yYXRlc2V0OworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisKKwljbWQtPnNpemUgPQorCSAgICBjcHVfdG9fbGUxNihzaXplb2Yoc3RydWN0IGNtZF9kc184MDJfMTFfcmF0ZV9hZGFwdF9yYXRlc2V0KQorCQkJICAgICArIFNfRFNfR0VOKTsKKwljbWQtPmNvbW1hbmQgPSBjcHVfdG9fbGUxNihjbWRfODAyXzExX3JhdGVfYWRhcHRfcmF0ZXNldCk7CisKKwlFTlRFUigpOworCisJcmF0ZWFkYXB0LT5hY3Rpb24gPSBjbWRfYWN0aW9uOworCXJhdGVhZGFwdC0+ZW5hYmxlaHdhdXRvID0gYWRhcHRlci0+ZW5hYmxlaHdhdXRvOworCXJhdGVhZGFwdC0+Yml0bWFwID0gYWRhcHRlci0+cmF0ZWJpdG1hcDsKKworCUxFQVZFKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2xhbl9jbWRfODAyXzExX2RhdGFfcmF0ZSh3bGFuX3ByaXZhdGUgKiBwcml2LAorCQkJCSAgICAgc3RydWN0IGNtZF9kc19jb21tYW5kICpjbWQsCisJCQkJICAgICB1MTYgY21kX2FjdGlvbikKK3sKKwlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9kYXRhX3JhdGUgKnBkYXRhcmF0ZSA9ICZjbWQtPnBhcmFtcy5kcmF0ZTsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCXUxNiBhY3Rpb24gPSBjbWRfYWN0aW9uOworCisJRU5URVIoKTsKKworCWNtZC0+c2l6ZSA9CisJICAgIGNwdV90b19sZTE2KHNpemVvZihzdHJ1Y3QgY21kX2RzXzgwMl8xMV9kYXRhX3JhdGUpICsKKwkJCSAgICAgU19EU19HRU4pOworCisJY21kLT5jb21tYW5kID0gY3B1X3RvX2xlMTYoY21kXzgwMl8xMV9kYXRhX3JhdGUpOworCisJbWVtc2V0KHBkYXRhcmF0ZSwgMCwgc2l6ZW9mKHN0cnVjdCBjbWRfZHNfODAyXzExX2RhdGFfcmF0ZSkpOworCisJcGRhdGFyYXRlLT5hY3Rpb24gPSBjcHVfdG9fbGUxNihjbWRfYWN0aW9uKTsKKworCWlmIChhY3Rpb24gPT0gY21kX2FjdF9zZXRfdHhfZml4X3JhdGUpIHsKKwkJcGRhdGFyYXRlLT5kYXRhcmF0ZVswXSA9IGxpYmVydGFzX2RhdGFfcmF0ZV90b19pbmRleChhZGFwdGVyLT5kYXRhcmF0ZSk7CisJCWxic19wcl9kZWJ1ZygxLCAiU2V0dGluZyBGVyBmb3IgZml4ZWQgcmF0ZSAweCUwMlhcbiIsCisJCSAgICAgICBhZGFwdGVyLT5kYXRhcmF0ZSk7CisJfSBlbHNlIGlmIChhY3Rpb24gPT0gY21kX2FjdF9zZXRfdHhfYXV0bykgeworCQlsYnNfcHJfZGVidWcoMSwgIlNldHRpbmcgRlcgZm9yIEFVVE8gcmF0ZVxuIik7CisJfQorCisJTEVBVkUoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bGFuX2NtZF9tYWNfbXVsdGljYXN0X2Fkcih3bGFuX3ByaXZhdGUgKiBwcml2LAorCQkJCSAgICAgIHN0cnVjdCBjbWRfZHNfY29tbWFuZCAqY21kLAorCQkJCSAgICAgIHUxNiBjbWRfYWN0aW9uKQoreworCXN0cnVjdCBjbWRfZHNfbWFjX211bHRpY2FzdF9hZHIgKnBNQ2FzdEFkciA9ICZjbWQtPnBhcmFtcy5tYWRyOworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisKKwljbWQtPnNpemUgPQorCSAgICBjcHVfdG9fbGUxNihzaXplb2Yoc3RydWN0IGNtZF9kc19tYWNfbXVsdGljYXN0X2FkcikgKworCQkJICAgICBTX0RTX0dFTik7CisJY21kLT5jb21tYW5kID0gY3B1X3RvX2xlMTYoY21kX21hY19tdWx0aWNhc3RfYWRyKTsKKworCXBNQ2FzdEFkci0+YWN0aW9uID0gY3B1X3RvX2xlMTYoY21kX2FjdGlvbik7CisJcE1DYXN0QWRyLT5ucl9vZl9hZHJzID0KKwkgICAgY3B1X3RvX2xlMTYoKHUxNikgYWRhcHRlci0+bnJfb2ZfbXVsdGljYXN0bWFjYWRkcik7CisJbWVtY3B5KHBNQ2FzdEFkci0+bWFjbGlzdCwgYWRhcHRlci0+bXVsdGljYXN0bGlzdCwKKwkgICAgICAgYWRhcHRlci0+bnJfb2ZfbXVsdGljYXN0bWFjYWRkciAqIEVUSF9BTEVOKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdsYW5fY21kXzgwMl8xMV9yZl9jaGFubmVsKHdsYW5fcHJpdmF0ZSAqIHByaXYsCisJCQkJICAgICAgc3RydWN0IGNtZF9kc19jb21tYW5kICpjbWQsCisJCQkJICAgICAgaW50IG9wdGlvbiwgdm9pZCAqcGRhdGFfYnVmKQoreworCXN0cnVjdCBjbWRfZHNfODAyXzExX3JmX2NoYW5uZWwgKnJmY2hhbiA9ICZjbWQtPnBhcmFtcy5yZmNoYW5uZWw7CisKKwljbWQtPmNvbW1hbmQgPSBjcHVfdG9fbGUxNihjbWRfODAyXzExX3JmX2NoYW5uZWwpOworCWNtZC0+c2l6ZSA9IGNwdV90b19sZTE2KHNpemVvZihzdHJ1Y3QgY21kX2RzXzgwMl8xMV9yZl9jaGFubmVsKQorCQkJCSAgICAgKyBTX0RTX0dFTik7CisKKwlpZiAob3B0aW9uID09IGNtZF9vcHRfODAyXzExX3JmX2NoYW5uZWxfc2V0KSB7CisJCXJmY2hhbi0+Y3VycmVudGNoYW5uZWwgPSBjcHVfdG9fbGUxNigqKCh1MTYgKikgcGRhdGFfYnVmKSk7CisJfQorCisJcmZjaGFuLT5hY3Rpb24gPSBjcHVfdG9fbGUxNihvcHRpb24pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2xhbl9jbWRfODAyXzExX3Jzc2kod2xhbl9wcml2YXRlICogcHJpdiwKKwkJCQlzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKmNtZCkKK3sKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCisJY21kLT5jb21tYW5kID0gY3B1X3RvX2xlMTYoY21kXzgwMl8xMV9yc3NpKTsKKwljbWQtPnNpemUgPQorCSAgICBjcHVfdG9fbGUxNihzaXplb2Yoc3RydWN0IGNtZF9kc184MDJfMTFfcnNzaSkgKyBTX0RTX0dFTik7CisJY21kLT5wYXJhbXMucnNzaS5OID0gcHJpdi0+YWRhcHRlci0+YmNuX2F2Z19mYWN0b3I7CisKKwkvKiByZXNldCBCZWFjb24gU05SL05GL1JTU0kgdmFsdWVzICovCisJYWRhcHRlci0+U05SW1RZUEVfQkVBQ09OXVtUWVBFX05PQVZHXSA9IDA7CisJYWRhcHRlci0+U05SW1RZUEVfQkVBQ09OXVtUWVBFX0FWR10gPSAwOworCWFkYXB0ZXItPk5GW1RZUEVfQkVBQ09OXVtUWVBFX05PQVZHXSA9IDA7CisJYWRhcHRlci0+TkZbVFlQRV9CRUFDT05dW1RZUEVfQVZHXSA9IDA7CisJYWRhcHRlci0+UlNTSVtUWVBFX0JFQUNPTl1bVFlQRV9OT0FWR10gPSAwOworCWFkYXB0ZXItPlJTU0lbVFlQRV9CRUFDT05dW1RZUEVfQVZHXSA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bGFuX2NtZF9yZWdfYWNjZXNzKHdsYW5fcHJpdmF0ZSAqIHByaXYsCisJCQkgICAgICAgc3RydWN0IGNtZF9kc19jb21tYW5kICpjbWRwdHIsCisJCQkgICAgICAgdTggY21kX2FjdGlvbiwgdm9pZCAqcGRhdGFfYnVmKQoreworCXN0cnVjdCB3bGFuX29mZnNldF92YWx1ZSAqb2ZmdmFsOworCisJRU5URVIoKTsKKworCW9mZnZhbCA9IChzdHJ1Y3Qgd2xhbl9vZmZzZXRfdmFsdWUgKilwZGF0YV9idWY7CisKKwlzd2l0Y2ggKGNtZHB0ci0+Y29tbWFuZCkgeworCWNhc2UgY21kX21hY19yZWdfYWNjZXNzOgorCQl7CisJCQlzdHJ1Y3QgY21kX2RzX21hY19yZWdfYWNjZXNzICptYWNyZWc7CisKKwkJCWNtZHB0ci0+c2l6ZSA9CisJCQkgICAgY3B1X3RvX2xlMTYoc2l6ZW9mCisJCQkJCSAgICAgKHN0cnVjdCBjbWRfZHNfbWFjX3JlZ19hY2Nlc3MpCisJCQkJCSAgICAgKyBTX0RTX0dFTik7CisJCQltYWNyZWcgPQorCQkJICAgIChzdHJ1Y3QgY21kX2RzX21hY19yZWdfYWNjZXNzICopJmNtZHB0ci0+cGFyYW1zLgorCQkJICAgIG1hY3JlZzsKKworCQkJbWFjcmVnLT5hY3Rpb24gPSBjcHVfdG9fbGUxNihjbWRfYWN0aW9uKTsKKwkJCW1hY3JlZy0+b2Zmc2V0ID0gY3B1X3RvX2xlMTYoKHUxNikgb2ZmdmFsLT5vZmZzZXQpOworCQkJbWFjcmVnLT52YWx1ZSA9IGNwdV90b19sZTMyKG9mZnZhbC0+dmFsdWUpOworCisJCQlicmVhazsKKwkJfQorCisJY2FzZSBjbWRfYmJwX3JlZ19hY2Nlc3M6CisJCXsKKwkJCXN0cnVjdCBjbWRfZHNfYmJwX3JlZ19hY2Nlc3MgKmJicHJlZzsKKworCQkJY21kcHRyLT5zaXplID0KKwkJCSAgICBjcHVfdG9fbGUxNihzaXplb2YKKwkJCQkJICAgICAoc3RydWN0IGNtZF9kc19iYnBfcmVnX2FjY2VzcykKKwkJCQkJICAgICArIFNfRFNfR0VOKTsKKwkJCWJicHJlZyA9CisJCQkgICAgKHN0cnVjdCBjbWRfZHNfYmJwX3JlZ19hY2Nlc3MgKikmY21kcHRyLT5wYXJhbXMuCisJCQkgICAgYmJwcmVnOworCisJCQliYnByZWctPmFjdGlvbiA9IGNwdV90b19sZTE2KGNtZF9hY3Rpb24pOworCQkJYmJwcmVnLT5vZmZzZXQgPSBjcHVfdG9fbGUxNigodTE2KSBvZmZ2YWwtPm9mZnNldCk7CisJCQliYnByZWctPnZhbHVlID0gKHU4KSBvZmZ2YWwtPnZhbHVlOworCisJCQlicmVhazsKKwkJfQorCisJY2FzZSBjbWRfcmZfcmVnX2FjY2VzczoKKwkJeworCQkJc3RydWN0IGNtZF9kc19yZl9yZWdfYWNjZXNzICpyZnJlZzsKKworCQkJY21kcHRyLT5zaXplID0KKwkJCSAgICBjcHVfdG9fbGUxNihzaXplb2YKKwkJCQkJICAgICAoc3RydWN0IGNtZF9kc19yZl9yZWdfYWNjZXNzKSArCisJCQkJCSAgICAgU19EU19HRU4pOworCQkJcmZyZWcgPQorCQkJICAgIChzdHJ1Y3QgY21kX2RzX3JmX3JlZ19hY2Nlc3MgKikmY21kcHRyLT5wYXJhbXMuCisJCQkgICAgcmZyZWc7CisKKwkJCXJmcmVnLT5hY3Rpb24gPSBjcHVfdG9fbGUxNihjbWRfYWN0aW9uKTsKKwkJCXJmcmVnLT5vZmZzZXQgPSBjcHVfdG9fbGUxNigodTE2KSBvZmZ2YWwtPm9mZnNldCk7CisJCQlyZnJlZy0+dmFsdWUgPSAodTgpIG9mZnZhbC0+dmFsdWU7CisKKwkJCWJyZWFrOworCQl9CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlMRUFWRSgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdsYW5fY21kXzgwMl8xMV9tYWNfYWRkcmVzcyh3bGFuX3ByaXZhdGUgKiBwcml2LAorCQkJCSAgICAgICBzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKmNtZCwKKwkJCQkgICAgICAgdTE2IGNtZF9hY3Rpb24pCit7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKworCWNtZC0+Y29tbWFuZCA9IGNwdV90b19sZTE2KGNtZF84MDJfMTFfbWFjX2FkZHJlc3MpOworCWNtZC0+c2l6ZSA9CisJICAgIGNwdV90b19sZTE2KHNpemVvZihzdHJ1Y3QgY21kX2RzXzgwMl8xMV9tYWNfYWRkcmVzcykgKworCQkJICAgICBTX0RTX0dFTik7CisJY21kLT5yZXN1bHQgPSAwOworCisJY21kLT5wYXJhbXMubWFjYWRkLmFjdGlvbiA9IGNwdV90b19sZTE2KGNtZF9hY3Rpb24pOworCisJaWYgKGNtZF9hY3Rpb24gPT0gY21kX2FjdF9zZXQpIHsKKwkJbWVtY3B5KGNtZC0+cGFyYW1zLm1hY2FkZC5tYWNhZGQsCisJCSAgICAgICBhZGFwdGVyLT5jdXJyZW50X2FkZHIsIEVUSF9BTEVOKTsKKwkJbGJzX2RiZ19oZXgoIlNFVF9DTUQ6IE1BQyBBRERSRVNTLSIsIGFkYXB0ZXItPmN1cnJlbnRfYWRkciwgNik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2xhbl9jbWRfODAyXzExX2VlcHJvbV9hY2Nlc3Mod2xhbl9wcml2YXRlICogcHJpdiwKKwkJCQkJIHN0cnVjdCBjbWRfZHNfY29tbWFuZCAqY21kLAorCQkJCQkgaW50IGNtZF9hY3Rpb24sIHZvaWQgKnBkYXRhX2J1ZikKK3sKKwlzdHJ1Y3Qgd2xhbl9pb2N0bF9yZWdyZHdyICplYSA9IHBkYXRhX2J1ZjsKKworCUVOVEVSKCk7CisKKwljbWQtPmNvbW1hbmQgPSBjcHVfdG9fbGUxNihjbWRfODAyXzExX2VlcHJvbV9hY2Nlc3MpOworCWNtZC0+c2l6ZSA9CisJICAgIGNwdV90b19sZTE2KHNpemVvZihzdHJ1Y3QgY21kX2RzXzgwMl8xMV9lZXByb21fYWNjZXNzKSArCisJCQkgICAgIFNfRFNfR0VOKTsKKwljbWQtPnJlc3VsdCA9IDA7CisKKwljbWQtPnBhcmFtcy5yZGVlcHJvbS5hY3Rpb24gPSBjcHVfdG9fbGUxNihlYS0+YWN0aW9uKTsKKwljbWQtPnBhcmFtcy5yZGVlcHJvbS5vZmZzZXQgPSBjcHVfdG9fbGUxNihlYS0+b2Zmc2V0KTsKKwljbWQtPnBhcmFtcy5yZGVlcHJvbS5ieXRlY291bnQgPSBjcHVfdG9fbGUxNihlYS0+Tk9CKTsKKwljbWQtPnBhcmFtcy5yZGVlcHJvbS52YWx1ZSA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bGFuX2NtZF9idF9hY2Nlc3Mod2xhbl9wcml2YXRlICogcHJpdiwKKwkJCSAgICAgICBzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKmNtZCwKKwkJCSAgICAgICB1MTYgY21kX2FjdGlvbiwgdm9pZCAqcGRhdGFfYnVmKQoreworCXN0cnVjdCBjbWRfZHNfYnRfYWNjZXNzICpidF9hY2Nlc3MgPSAmY21kLT5wYXJhbXMuYnQ7CisJbGJzX3ByX2RlYnVnKDEsICJCVCBDTUQoJWQpXG4iLCBjbWRfYWN0aW9uKTsKKworCWNtZC0+Y29tbWFuZCA9IGNwdV90b19sZTE2KGNtZF9idF9hY2Nlc3MpOworCWNtZC0+c2l6ZSA9IGNwdV90b19sZTE2KHNpemVvZihzdHJ1Y3QgY21kX2RzX2J0X2FjY2VzcykKKwkJCQkgICAgICsgU19EU19HRU4pOworCWNtZC0+cmVzdWx0ID0gMDsKKwlidF9hY2Nlc3MtPmFjdGlvbiA9IGNwdV90b19sZTE2KGNtZF9hY3Rpb24pOworCisJc3dpdGNoIChjbWRfYWN0aW9uKSB7CisJY2FzZSBjbWRfYWN0X2J0X2FjY2Vzc19hZGQ6CisJCW1lbWNweShidF9hY2Nlc3MtPmFkZHIxLCBwZGF0YV9idWYsIDIgKiBFVEhfQUxFTik7CisJCWxic19kYmdfaGV4KCJCVF9BREQ6IGJsaW5kZWQgbWFjIGFkZHJlc3MtIiwgYnRfYWNjZXNzLT5hZGRyMSwgNik7CisJCWJyZWFrOworCWNhc2UgY21kX2FjdF9idF9hY2Nlc3NfZGVsOgorCQltZW1jcHkoYnRfYWNjZXNzLT5hZGRyMSwgcGRhdGFfYnVmLCAxICogRVRIX0FMRU4pOworCQlsYnNfZGJnX2hleCgiQlRfREVMOiBibGluZGVkIG1hYyBhZGRyZXNzLSIsIGJ0X2FjY2Vzcy0+YWRkcjEsIDYpOworCQlicmVhazsKKwljYXNlIGNtZF9hY3RfYnRfYWNjZXNzX2xpc3Q6CisJCWJ0X2FjY2Vzcy0+aWQgPSBjcHVfdG9fbGUzMigqKHUzMiAqKSBwZGF0YV9idWYpOworCQlicmVhazsKKwljYXNlIGNtZF9hY3RfYnRfYWNjZXNzX3Jlc2V0OgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2xhbl9jbWRfZnd0X2FjY2Vzcyh3bGFuX3ByaXZhdGUgKiBwcml2LAorCQkJICAgICAgIHN0cnVjdCBjbWRfZHNfY29tbWFuZCAqY21kLAorCQkJICAgICAgIHUxNiBjbWRfYWN0aW9uLCB2b2lkICpwZGF0YV9idWYpCit7CisJc3RydWN0IGNtZF9kc19md3RfYWNjZXNzICpmd3RfYWNjZXNzID0gJmNtZC0+cGFyYW1zLmZ3dDsKKwlsYnNfcHJfZGVidWcoMSwgIkZXVCBDTUQoJWQpXG4iLCBjbWRfYWN0aW9uKTsKKworCWNtZC0+Y29tbWFuZCA9IGNwdV90b19sZTE2KGNtZF9md3RfYWNjZXNzKTsKKwljbWQtPnNpemUgPSBjcHVfdG9fbGUxNihzaXplb2Yoc3RydWN0IGNtZF9kc19md3RfYWNjZXNzKQorCQkJCSAgICAgKyBTX0RTX0dFTik7CisJY21kLT5yZXN1bHQgPSAwOworCisJaWYgKHBkYXRhX2J1ZikKKwkJbWVtY3B5KGZ3dF9hY2Nlc3MsIHBkYXRhX2J1Ziwgc2l6ZW9mKCpmd3RfYWNjZXNzKSk7CisJZWxzZQorCQltZW1zZXQoZnd0X2FjY2VzcywgMCwgc2l6ZW9mKCpmd3RfYWNjZXNzKSk7CisKKwlmd3RfYWNjZXNzLT5hY3Rpb24gPSBjcHVfdG9fbGUxNihjbWRfYWN0aW9uKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdsYW5fY21kX21lc2hfYWNjZXNzKHdsYW5fcHJpdmF0ZSAqIHByaXYsCisJCQkJc3RydWN0IGNtZF9kc19jb21tYW5kICpjbWQsCisJCQkJdTE2IGNtZF9hY3Rpb24sIHZvaWQgKnBkYXRhX2J1ZikKK3sKKwlzdHJ1Y3QgY21kX2RzX21lc2hfYWNjZXNzICptZXNoX2FjY2VzcyA9ICZjbWQtPnBhcmFtcy5tZXNoOworCWxic19wcl9kZWJ1ZygxLCAiRldUIENNRCglZClcbiIsIGNtZF9hY3Rpb24pOworCisJY21kLT5jb21tYW5kID0gY3B1X3RvX2xlMTYoY21kX21lc2hfYWNjZXNzKTsKKwljbWQtPnNpemUgPSBjcHVfdG9fbGUxNihzaXplb2Yoc3RydWN0IGNtZF9kc19tZXNoX2FjY2VzcykKKwkJCQkgICAgICsgU19EU19HRU4pOworCWNtZC0+cmVzdWx0ID0gMDsKKworCWlmIChwZGF0YV9idWYpCisJCW1lbWNweShtZXNoX2FjY2VzcywgcGRhdGFfYnVmLCBzaXplb2YoKm1lc2hfYWNjZXNzKSk7CisJZWxzZQorCQltZW1zZXQobWVzaF9hY2Nlc3MsIDAsIHNpemVvZigqbWVzaF9hY2Nlc3MpKTsKKworCW1lc2hfYWNjZXNzLT5hY3Rpb24gPSBjcHVfdG9fbGUxNihjbWRfYWN0aW9uKTsKKworCXJldHVybiAwOworfQorCit2b2lkIGxpYmVydGFzX3F1ZXVlX2NtZCh3bGFuX2FkYXB0ZXIgKiBhZGFwdGVyLCBzdHJ1Y3QgY21kX2N0cmxfbm9kZSAqY21kbm9kZSwgdTggYWRkdGFpbCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBjbWRfZHNfY29tbWFuZCAqY21kcHRyOworCisJRU5URVIoKTsKKworCWlmICghY21kbm9kZSkgeworCQlsYnNfcHJfZGVidWcoMSwgIlFVRVVFX0NNRDogY21kbm9kZSBpcyBOVUxMXG4iKTsKKwkJZ290byBkb25lOworCX0KKworCWNtZHB0ciA9IChzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKiljbWRub2RlLT5idWZ2aXJ0dWFsYWRkcjsKKwlpZiAoIWNtZHB0cikgeworCQlsYnNfcHJfZGVidWcoMSwgIlFVRVVFX0NNRDogY21kcHRyIGlzIE5VTExcbiIpOworCQlnb3RvIGRvbmU7CisJfQorCisJLyogRXhpdF9QUyBjb21tYW5kIG5lZWRzIHRvIGJlIHF1ZXVlZCBpbiB0aGUgaGVhZGVyIGFsd2F5cy4gKi8KKwlpZiAoY21kcHRyLT5jb21tYW5kID09IGNtZF84MDJfMTFfcHNfbW9kZSkgeworCQlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9wc19tb2RlICpwc20gPSAmY21kcHRyLT5wYXJhbXMucHNtb2RlOworCQlpZiAocHNtLT5hY3Rpb24gPT0gY21kX3N1YmNtZF9leGl0X3BzKSB7CisJCQlpZiAoYWRhcHRlci0+cHNzdGF0ZSAhPSBQU19TVEFURV9GVUxMX1BPV0VSKQorCQkJCWFkZHRhaWwgPSAwOworCQl9CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPmRyaXZlcl9sb2NrLCBmbGFncyk7CisKKwlpZiAoYWRkdGFpbCkKKwkJbGlzdF9hZGRfdGFpbCgoc3RydWN0IGxpc3RfaGVhZCAqKWNtZG5vZGUsCisJCQkgICAgICAmYWRhcHRlci0+Y21kcGVuZGluZ3EpOworCWVsc2UKKwkJbGlzdF9hZGQoKHN0cnVjdCBsaXN0X2hlYWQgKiljbWRub2RlLCAmYWRhcHRlci0+Y21kcGVuZGluZ3EpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKKworCWxic19wcl9kZWJ1ZygxLCAiUVVFVUVfQ01EOiBJbnNlcnRlZCBub2RlPTB4JXgsIGNtZD0weCV4IGluIGNtZHBlbmRpbmdxXG4iLAorCSAgICAgICAodTMyKSBjbWRub2RlLAorCSAgICAgICAoKHN0cnVjdCBjbWRfZHNfZ2VuKiljbWRub2RlLT5idWZ2aXJ0dWFsYWRkciktPmNvbW1hbmQpOworCitkb25lOgorCUxFQVZFKCk7CisJcmV0dXJuOworfQorCisvKgorICogVE9ETzogRml4IHRoZSBpc3N1ZSB3aGVuIERvd25sb2FkY29tbWFuZFRvU3RhdGlvbiBpcyBiZWluZyBjYWxsZWQgdGhlCisgKiBzZWNvbmQgdGltZSB3aGVuIHRoZSBjb21tYW5kIHRpbWVzb3V0LiBBbGwgdGhlIGNtZHB0ci0+eHh4IGFyZSBpbiBsaXR0bGUKKyAqIGVuZGlhbiBhbmQgdGhlcmVmb3JlIGFsbCB0aGUgY29tcGFyaXNzaW9ucyB3aWxsIGZhaWwuCisgKiBGb3Igbm93IC0gd2UgYXJlIG5vdCBwZXJmb3JtaW5nIHRoZSBlbmRpYW4gY29udmVyc2lvbiB0aGUgc2Vjb25kIHRpbWUgLSBidXQKKyAqIGZvciBQUyBhbmQgREVFUF9TTEVFUCB3ZSBuZWVkIHRvIHdvcnJ5CisgKi8KK3N0YXRpYyBpbnQgRG93bmxvYWRjb21tYW5kVG9TdGF0aW9uKHdsYW5fcHJpdmF0ZSAqIHByaXYsCisJCQkJICAgIHN0cnVjdCBjbWRfY3RybF9ub2RlICpjbWRub2RlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGNtZF9kc19jb21tYW5kICpjbWRwdHI7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwlpbnQgcmV0ID0gMDsKKwl1MTYgY21kc2l6ZTsKKwl1MTYgY29tbWFuZDsKKworCUVOVEVSKCk7CisKKwlpZiAoIWFkYXB0ZXIgfHwgIWNtZG5vZGUpIHsKKwkJbGJzX3ByX2RlYnVnKDEsICJETkxEX0NNRDogYWRhcHRlciA9ICUjeCwgY21kbm9kZSA9ICUjeFxuIiwKKwkJICAgICAgIChpbnQpYWRhcHRlciwgKGludCljbWRub2RlKTsKKwkJaWYgKGNtZG5vZGUpIHsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5kcml2ZXJfbG9jaywgZmxhZ3MpOworCQkJX19saWJlcnRhc19jbGVhbnVwX2FuZF9pbnNlcnRfY21kKHByaXYsIGNtZG5vZGUpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKKwkJfQorCQlyZXQgPSAtMTsKKwkJZ290byBkb25lOworCX0KKworCWNtZHB0ciA9IChzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKiljbWRub2RlLT5idWZ2aXJ0dWFsYWRkcjsKKworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPmRyaXZlcl9sb2NrLCBmbGFncyk7CisJaWYgKCFjbWRwdHIgfHwgIWNtZHB0ci0+c2l6ZSkgeworCQlsYnNfcHJfZGVidWcoMSwgIkROTERfQ01EOiBjbWRwdHIgaXMgTnVsbCBvciBjbWQgc2l6ZSBpcyBaZXJvLCAiCisJCSAgICAgICAiTm90IHNlbmRpbmdcbiIpOworCQlfX2xpYmVydGFzX2NsZWFudXBfYW5kX2luc2VydF9jbWQocHJpdiwgY21kbm9kZSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPmRyaXZlcl9sb2NrLCBmbGFncyk7CisJCXJldCA9IC0xOworCQlnb3RvIGRvbmU7CisJfQorCisJYWRhcHRlci0+Y3VyX2NtZCA9IGNtZG5vZGU7CisJYWRhcHRlci0+Y3VyX2NtZF9yZXRjb2RlID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5kcml2ZXJfbG9jaywgZmxhZ3MpOworCWxic19wcl9kZWJ1ZygxLCAiRE5MRF9DTUQ6OiBCZWZvcmUgZG93bmxvYWQsIHNpemUgb2YgY21kID0gJWRcbiIsCisJICAgICAgIGNtZHB0ci0+c2l6ZSk7CisKKwljbWRzaXplID0gY21kcHRyLT5zaXplOworCisJY29tbWFuZCA9IGNwdV90b19sZTE2KGNtZHB0ci0+Y29tbWFuZCk7CisKKwljbWRub2RlLT5jbWR3YWl0cXdva2VuID0gMDsKKwljbWRzaXplID0gY3B1X3RvX2xlMTYoY21kc2l6ZSk7CisKKwlyZXQgPSBsaWJlcnRhc19zYmlfaG9zdF90b19jYXJkKHByaXYsIE1WTVNfQ01ELCAodTggKikgY21kcHRyLCBjbWRzaXplKTsKKworCWlmIChyZXQgIT0gMCkgeworCQlsYnNfcHJfZGVidWcoMSwgIkROTERfQ01EOiBIb3N0IHRvIENhcmQgZmFpbGVkXG4iKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPmRyaXZlcl9sb2NrLCBmbGFncyk7CisJCV9fbGliZXJ0YXNfY2xlYW51cF9hbmRfaW5zZXJ0X2NtZChwcml2LCBhZGFwdGVyLT5jdXJfY21kKTsKKwkJYWRhcHRlci0+Y3VyX2NtZCA9IE5VTEw7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPmRyaXZlcl9sb2NrLCBmbGFncyk7CisJCXJldCA9IC0xOworCQlnb3RvIGRvbmU7CisJfQorCisJbGJzX3ByX2RlYnVnKDEsICJETkxEX0NNRDogU2VudCBjb21tYW5kIDB4JXggQCAlbHVcbiIsIGNvbW1hbmQsIGppZmZpZXMpOworCWxic19kYmdfaGV4KCJETkxEX0NNRDogY29tbWFuZCIsIGNtZG5vZGUtPmJ1ZnZpcnR1YWxhZGRyLCBjbWRzaXplKTsKKworCS8qIFNldHVwIHRoZSB0aW1lciBhZnRlciB0cmFuc21pdCBjb21tYW5kICovCisJaWYgKGNvbW1hbmQgPT0gY21kXzgwMl8xMV9zY2FuCisJICAgIHx8IGNvbW1hbmQgPT0gY21kXzgwMl8xMV9hdXRoZW50aWNhdGUKKwkgICAgfHwgY29tbWFuZCA9PSBjbWRfODAyXzExX2Fzc29jaWF0ZSkKKwkJbW9kX3RpbWVyKCZhZGFwdGVyLT5jb21tYW5kX3RpbWVyLCBqaWZmaWVzICsgKDEwKkhaKSk7CisJZWxzZQorCQltb2RfdGltZXIoJmFkYXB0ZXItPmNvbW1hbmRfdGltZXIsIGppZmZpZXMgKyAoNSpIWikpOworCisJcmV0ID0gMDsKKworICAgICAgZG9uZToKKwlMRUFWRSgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgd2xhbl9jbWRfbWFjX2NvbnRyb2wod2xhbl9wcml2YXRlICogcHJpdiwKKwkJCQlzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKmNtZCkKK3sKKwlzdHJ1Y3QgY21kX2RzX21hY19jb250cm9sICptYWMgPSAmY21kLT5wYXJhbXMubWFjY3RybDsKKworCUVOVEVSKCk7CisKKwljbWQtPmNvbW1hbmQgPSBjcHVfdG9fbGUxNihjbWRfbWFjX2NvbnRyb2wpOworCWNtZC0+c2l6ZSA9CisJICAgIGNwdV90b19sZTE2KHNpemVvZihzdHJ1Y3QgY21kX2RzX21hY19jb250cm9sKSArIFNfRFNfR0VOKTsKKwltYWMtPmFjdGlvbiA9IGNwdV90b19sZTE2KHByaXYtPmFkYXB0ZXItPmN1cnJlbnRwYWNrZXRmaWx0ZXIpOworCisJbGJzX3ByX2RlYnVnKDEsICJ3bGFuX2NtZF9tYWNfY29udHJvbCgpOiBhY3Rpb249MHglWCBzaXplPSVkXG4iLAorCSAgICAgICBtYWMtPmFjdGlvbiwgY21kLT5zaXplKTsKKworCUxFQVZFKCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogIFRoaXMgZnVuY3Rpb24gaW5zZXJ0cyBjb21tYW5kIG5vZGUgdG8gY21kZnJlZXEKKyAqICBhZnRlciBjbGVhbnMgaXQuIFJlcXVpcmVzIGFkYXB0ZXItPmRyaXZlcl9sb2NrIGhlbGQuCisgKi8KK3ZvaWQgX19saWJlcnRhc19jbGVhbnVwX2FuZF9pbnNlcnRfY21kKHdsYW5fcHJpdmF0ZSAqIHByaXYsIHN0cnVjdCBjbWRfY3RybF9ub2RlICpwdGVtcGNtZCkKK3sKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCisJaWYgKCFwdGVtcGNtZCkKKwkJZ290byBkb25lOworCisJY2xlYW51cF9jbWRub2RlKHB0ZW1wY21kKTsKKwlsaXN0X2FkZF90YWlsKChzdHJ1Y3QgbGlzdF9oZWFkICopcHRlbXBjbWQsICZhZGFwdGVyLT5jbWRmcmVlcSk7Citkb25lOgorCXJldHVybjsKK30KKwordm9pZCBsaWJlcnRhc19jbGVhbnVwX2FuZF9pbnNlcnRfY21kKHdsYW5fcHJpdmF0ZSAqIHByaXYsIHN0cnVjdCBjbWRfY3RybF9ub2RlICpwdGVtcGNtZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmFkYXB0ZXItPmRyaXZlcl9sb2NrLCBmbGFncyk7CisJX19saWJlcnRhc19jbGVhbnVwX2FuZF9pbnNlcnRfY21kKHByaXYsIHB0ZW1wY21kKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5hZGFwdGVyLT5kcml2ZXJfbG9jaywgZmxhZ3MpOworfQorCitpbnQgbGliZXJ0YXNfc2V0X3JhZGlvX2NvbnRyb2wod2xhbl9wcml2YXRlICogcHJpdikKK3sKKwlpbnQgcmV0ID0gMDsKKworCUVOVEVSKCk7CisKKwlyZXQgPSBsaWJlcnRhc19wcmVwYXJlX2FuZF9zZW5kX2NvbW1hbmQocHJpdiwKKwkJCQkgICAgY21kXzgwMl8xMV9yYWRpb19jb250cm9sLAorCQkJCSAgICBjbWRfYWN0X3NldCwKKwkJCQkgICAgY21kX29wdGlvbl93YWl0Zm9ycnNwLCAwLCBOVUxMKTsKKworCWxic19wcl9kZWJ1ZygxLCAiUkFESU9fU0VUOiBvbiBvciBvZmY6IDB4JVgsIHByZWFtYmxlID0gMHglWFxuIiwKKwkgICAgICAgcHJpdi0+YWRhcHRlci0+cmFkaW9vbiwgcHJpdi0+YWRhcHRlci0+cHJlYW1ibGUpOworCisJTEVBVkUoKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgbGliZXJ0YXNfc2V0X21hY19wYWNrZXRfZmlsdGVyKHdsYW5fcHJpdmF0ZSAqIHByaXYpCit7CisJaW50IHJldCA9IDA7CisKKwlFTlRFUigpOworCisJbGJzX3ByX2RlYnVnKDEsICJsaWJlcnRhc19zZXRfbWFjX3BhY2tldF9maWx0ZXIgdmFsdWUgPSAleFxuIiwKKwkgICAgICAgcHJpdi0+YWRhcHRlci0+Y3VycmVudHBhY2tldGZpbHRlcik7CisKKwkvKiBTZW5kIE1BQyBjb250cm9sIGNvbW1hbmQgdG8gc3RhdGlvbiAqLworCXJldCA9IGxpYmVydGFzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZChwcml2LAorCQkJCSAgICBjbWRfbWFjX2NvbnRyb2wsIDAsIDAsIDAsIE5VTEwpOworCisJTEVBVkUoKTsKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqICBAYnJpZWYgVGhpcyBmdW5jdGlvbiBwcmVwYXJlIHRoZSBjb21tYW5kIGJlZm9yZSBzZW5kIHRvIGZpcm13YXJlLgorICoKKyAqICBAcGFyYW0gcHJpdgkJQSBwb2ludGVyIHRvIHdsYW5fcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqICBAcGFyYW0gY21kX25vCWNvbW1hbmQgbnVtYmVyCisgKiAgQHBhcmFtIGNtZF9hY3Rpb24JY29tbWFuZCBhY3Rpb246IEdFVCBvciBTRVQKKyAqICBAcGFyYW0gd2FpdF9vcHRpb24Jd2FpdCBvcHRpb246IHdhaXQgcmVzcG9uc2Ugb3Igbm90CisgKiAgQHBhcmFtIGNtZF9vaWQJY21kIG9pZDogdHJlYXRlZCBhcyBzdWIgY29tbWFuZAorICogIEBwYXJhbSBwZGF0YV9idWYJQSBwb2ludGVyIHRvIGluZm9ybWFpb24gYnVmZmVyCisgKiAgQHJldHVybiAJCTAgb3IgLTEKKyAqLworaW50IGxpYmVydGFzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZCh3bGFuX3ByaXZhdGUgKiBwcml2LAorCQkJICB1MTYgY21kX25vLAorCQkJICB1MTYgY21kX2FjdGlvbiwKKwkJCSAgdTE2IHdhaXRfb3B0aW9uLCB1MzIgY21kX29pZCwgdm9pZCAqcGRhdGFfYnVmKQoreworCWludCByZXQgPSAwOworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJc3RydWN0IGNtZF9jdHJsX25vZGUgKmNtZG5vZGU7CisJc3RydWN0IGNtZF9kc19jb21tYW5kICpjbWRwdHI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCUVOVEVSKCk7CisKKwlpZiAoIWFkYXB0ZXIpIHsKKwkJbGJzX3ByX2RlYnVnKDEsICJQUkVQX0NNRDogYWRhcHRlciBpcyBOdWxsXG4iKTsKKwkJcmV0ID0gLTE7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAoYWRhcHRlci0+c3VycHJpc2VyZW1vdmVkKSB7CisJCWxic19wcl9kZWJ1ZygxLCAiUFJFUF9DTUQ6IENhcmQgaXMgUmVtb3ZlZFxuIik7CisJCXJldCA9IC0xOworCQlnb3RvIGRvbmU7CisJfQorCisJY21kbm9kZSA9IGxpYmVydGFzX2dldF9mcmVlX2NtZF9jdHJsX25vZGUocHJpdik7CisKKwlpZiAoY21kbm9kZSA9PSBOVUxMKSB7CisJCWxic19wcl9kZWJ1ZygxLCAiUFJFUF9DTUQ6IE5vIGZyZWUgY21kbm9kZVxuIik7CisKKwkJLyogV2FrZSB1cCBtYWluIHRocmVhZCB0byBleGVjdXRlIG5leHQgY29tbWFuZCAqLworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnByaXYtPm1haW50aHJlYWQud2FpdHEpOworCQlyZXQgPSAtMTsKKwkJZ290byBkb25lOworCX0KKworCWxpYmVydGFzX3NldF9jbWRfY3RybF9ub2RlKHByaXYsIGNtZG5vZGUsIGNtZF9vaWQsIHdhaXRfb3B0aW9uLCBwZGF0YV9idWYpOworCisJY21kcHRyID0gKHN0cnVjdCBjbWRfZHNfY29tbWFuZCAqKWNtZG5vZGUtPmJ1ZnZpcnR1YWxhZGRyOworCisJbGJzX3ByX2RlYnVnKDEsICJQUkVQX0NNRDogVmFsIG9mIGNtZCBwdHIgPTB4JXgsIGNvbW1hbmQ9MHglWFxuIiwKKwkgICAgICAgKHUzMikgY21kcHRyLCBjbWRfbm8pOworCisJaWYgKCFjbWRwdHIpIHsKKwkJbGJzX3ByX2RlYnVnKDEsICJQUkVQX0NNRDogYnVmdmlydHVhbGFkZHIgb2YgY21kbm9kZSBpcyBOVUxMXG4iKTsKKwkJbGliZXJ0YXNfY2xlYW51cF9hbmRfaW5zZXJ0X2NtZChwcml2LCBjbWRub2RlKTsKKwkJcmV0ID0gLTE7CisJCWdvdG8gZG9uZTsKKwl9CisKKwkvKiBTZXQgc2VxdWVuY2UgbnVtYmVyLCBjb21tYW5kIGFuZCBJTlQgb3B0aW9uICovCisJYWRhcHRlci0+c2VxbnVtKys7CisJY21kcHRyLT5zZXFudW0gPSBjcHVfdG9fbGUxNihhZGFwdGVyLT5zZXFudW0pOworCisJY21kcHRyLT5jb21tYW5kID0gY21kX25vOworCWNtZHB0ci0+cmVzdWx0ID0gMDsKKworCXN3aXRjaCAoY21kX25vKSB7CisJY2FzZSBjbWRfZ2V0X2h3X3NwZWM6CisJCXJldCA9IHdsYW5fY21kX2h3X3NwZWMocHJpdiwgY21kcHRyKTsKKwkJYnJlYWs7CisJY2FzZSBjbWRfODAyXzExX3BzX21vZGU6CisJCXJldCA9IHdsYW5fY21kXzgwMl8xMV9wc19tb2RlKHByaXYsIGNtZHB0ciwgY21kX2FjdGlvbik7CisJCWJyZWFrOworCisJY2FzZSBjbWRfODAyXzExX3NjYW46CisJCXJldCA9IGxpYmVydGFzX2NtZF84MDIxMV9zY2FuKHByaXYsIGNtZHB0ciwgcGRhdGFfYnVmKTsKKwkJYnJlYWs7CisKKwljYXNlIGNtZF9tYWNfY29udHJvbDoKKwkJcmV0ID0gd2xhbl9jbWRfbWFjX2NvbnRyb2wocHJpdiwgY21kcHRyKTsKKwkJYnJlYWs7CisKKwljYXNlIGNtZF84MDJfMTFfYXNzb2NpYXRlOgorCWNhc2UgY21kXzgwMl8xMV9yZWFzc29jaWF0ZToKKwkJcmV0ID0gbGliZXJ0YXNfY21kXzgwMjExX2Fzc29jaWF0ZShwcml2LCBjbWRwdHIsIHBkYXRhX2J1Zik7CisJCWJyZWFrOworCisJY2FzZSBjbWRfODAyXzExX2RlYXV0aGVudGljYXRlOgorCQlyZXQgPSBsaWJlcnRhc19jbWRfODAyMTFfZGVhdXRoZW50aWNhdGUocHJpdiwgY21kcHRyKTsKKwkJYnJlYWs7CisKKwljYXNlIGNtZF84MDJfMTFfc2V0X3dlcDoKKwkJcmV0ID0gd2xhbl9jbWRfODAyXzExX3NldF93ZXAocHJpdiwgY21kcHRyLCBjbWRfYWN0aW9uLCBwZGF0YV9idWYpOworCQlicmVhazsKKworCWNhc2UgY21kXzgwMl8xMV9hZF9ob2Nfc3RhcnQ6CisJCXJldCA9IGxpYmVydGFzX2NtZF84MDIxMV9hZF9ob2Nfc3RhcnQocHJpdiwgY21kcHRyLCBwZGF0YV9idWYpOworCQlicmVhazsKKwljYXNlIGNtZF9jb2RlX2RubGQ6CisJCWJyZWFrOworCisJY2FzZSBjbWRfODAyXzExX3Jlc2V0OgorCQlyZXQgPSB3bGFuX2NtZF84MDJfMTFfcmVzZXQocHJpdiwgY21kcHRyLCBjbWRfYWN0aW9uKTsKKwkJYnJlYWs7CisKKwljYXNlIGNtZF84MDJfMTFfZ2V0X2xvZzoKKwkJcmV0ID0gd2xhbl9jbWRfODAyXzExX2dldF9sb2cocHJpdiwgY21kcHRyKTsKKwkJYnJlYWs7CisKKwljYXNlIGNtZF84MDJfMTFfYXV0aGVudGljYXRlOgorCQlyZXQgPSBsaWJlcnRhc19jbWRfODAyMTFfYXV0aGVudGljYXRlKHByaXYsIGNtZHB0ciwgcGRhdGFfYnVmKTsKKwkJYnJlYWs7CisKKwljYXNlIGNtZF84MDJfMTFfZ2V0X3N0YXQ6CisJCXJldCA9IHdsYW5fY21kXzgwMl8xMV9nZXRfc3RhdChwcml2LCBjbWRwdHIpOworCQlicmVhazsKKworCWNhc2UgY21kXzgwMl8xMV9zbm1wX21pYjoKKwkJcmV0ID0gd2xhbl9jbWRfODAyXzExX3NubXBfbWliKHByaXYsIGNtZHB0ciwKKwkJCQkJICAgICAgIGNtZF9hY3Rpb24sIGNtZF9vaWQsIHBkYXRhX2J1Zik7CisJCWJyZWFrOworCisJY2FzZSBjbWRfbWFjX3JlZ19hY2Nlc3M6CisJY2FzZSBjbWRfYmJwX3JlZ19hY2Nlc3M6CisJY2FzZSBjbWRfcmZfcmVnX2FjY2VzczoKKwkJcmV0ID0gd2xhbl9jbWRfcmVnX2FjY2Vzcyhwcml2LCBjbWRwdHIsIGNtZF9hY3Rpb24sIHBkYXRhX2J1Zik7CisJCWJyZWFrOworCisJY2FzZSBjbWRfODAyXzExX3JmX2NoYW5uZWw6CisJCXJldCA9IHdsYW5fY21kXzgwMl8xMV9yZl9jaGFubmVsKHByaXYsIGNtZHB0ciwKKwkJCQkJCSBjbWRfYWN0aW9uLCBwZGF0YV9idWYpOworCQlicmVhazsKKworCWNhc2UgY21kXzgwMl8xMV9yZl90eF9wb3dlcjoKKwkJcmV0ID0gd2xhbl9jbWRfODAyXzExX3JmX3R4X3Bvd2VyKHByaXYsIGNtZHB0ciwKKwkJCQkJCSAgY21kX2FjdGlvbiwgcGRhdGFfYnVmKTsKKwkJYnJlYWs7CisKKwljYXNlIGNtZF84MDJfMTFfcmFkaW9fY29udHJvbDoKKwkJcmV0ID0gd2xhbl9jbWRfODAyXzExX3JhZGlvX2NvbnRyb2wocHJpdiwgY21kcHRyLCBjbWRfYWN0aW9uKTsKKwkJYnJlYWs7CisKKwljYXNlIGNtZF84MDJfMTFfcmZfYW50ZW5uYToKKwkJcmV0ID0gd2xhbl9jbWRfODAyXzExX3JmX2FudGVubmEocHJpdiwgY21kcHRyLAorCQkJCQkJIGNtZF9hY3Rpb24sIHBkYXRhX2J1Zik7CisJCWJyZWFrOworCisJY2FzZSBjbWRfODAyXzExX2RhdGFfcmF0ZToKKwkJcmV0ID0gd2xhbl9jbWRfODAyXzExX2RhdGFfcmF0ZShwcml2LCBjbWRwdHIsIGNtZF9hY3Rpb24pOworCQlicmVhazsKKwljYXNlIGNtZF84MDJfMTFfcmF0ZV9hZGFwdF9yYXRlc2V0OgorCQlyZXQgPSB3bGFuX2NtZF84MDJfMTFfcmF0ZV9hZGFwdF9yYXRlc2V0KHByaXYsCisJCQkJCQkJIGNtZHB0ciwgY21kX2FjdGlvbik7CisJCWJyZWFrOworCisJY2FzZSBjbWRfbWFjX211bHRpY2FzdF9hZHI6CisJCXJldCA9IHdsYW5fY21kX21hY19tdWx0aWNhc3RfYWRyKHByaXYsIGNtZHB0ciwgY21kX2FjdGlvbik7CisJCWJyZWFrOworCisJY2FzZSBjbWRfODAyXzExX2FkX2hvY19qb2luOgorCQlyZXQgPSBsaWJlcnRhc19jbWRfODAyMTFfYWRfaG9jX2pvaW4ocHJpdiwgY21kcHRyLCBwZGF0YV9idWYpOworCQlicmVhazsKKworCWNhc2UgY21kXzgwMl8xMV9yc3NpOgorCQlyZXQgPSB3bGFuX2NtZF84MDJfMTFfcnNzaShwcml2LCBjbWRwdHIpOworCQlicmVhazsKKworCWNhc2UgY21kXzgwMl8xMV9hZF9ob2Nfc3RvcDoKKwkJcmV0ID0gbGliZXJ0YXNfY21kXzgwMjExX2FkX2hvY19zdG9wKHByaXYsIGNtZHB0cik7CisJCWJyZWFrOworCisJY2FzZSBjbWRfODAyXzExX2VuYWJsZV9yc246CisJCXJldCA9IHdsYW5fY21kXzgwMl8xMV9lbmFibGVfcnNuKHByaXYsIGNtZHB0ciwgY21kX2FjdGlvbik7CisJCWJyZWFrOworCisJY2FzZSBjbWRfODAyXzExX2tleV9tYXRlcmlhbDoKKwkJcmV0ID0gd2xhbl9jbWRfODAyXzExX2tleV9tYXRlcmlhbChwcml2LCBjbWRwdHIsCisJCQkJCQkgICBjbWRfYWN0aW9uLCBjbWRfb2lkLAorCQkJCQkJICAgcGRhdGFfYnVmKTsKKwkJYnJlYWs7CisKKwljYXNlIGNtZF84MDJfMTFfcGFpcndpc2VfdHNjOgorCQlicmVhazsKKwljYXNlIGNtZF84MDJfMTFfZ3JvdXBfdHNjOgorCQlicmVhazsKKworCWNhc2UgY21kXzgwMl8xMV9tYWNfYWRkcmVzczoKKwkJcmV0ID0gd2xhbl9jbWRfODAyXzExX21hY19hZGRyZXNzKHByaXYsIGNtZHB0ciwgY21kX2FjdGlvbik7CisJCWJyZWFrOworCisJY2FzZSBjbWRfODAyXzExX2VlcHJvbV9hY2Nlc3M6CisJCXJldCA9IHdsYW5fY21kXzgwMl8xMV9lZXByb21fYWNjZXNzKHByaXYsIGNtZHB0ciwKKwkJCQkJCSAgICBjbWRfYWN0aW9uLCBwZGF0YV9idWYpOworCQlicmVhazsKKworCWNhc2UgY21kXzgwMl8xMV9zZXRfYWZjOgorCWNhc2UgY21kXzgwMl8xMV9nZXRfYWZjOgorCisJCWNtZHB0ci0+Y29tbWFuZCA9IGNwdV90b19sZTE2KGNtZF9ubyk7CisJCWNtZHB0ci0+c2l6ZSA9CisJCSAgICBjcHVfdG9fbGUxNihzaXplb2Yoc3RydWN0IGNtZF9kc184MDJfMTFfYWZjKSArCisJCQkJICAgICBTX0RTX0dFTik7CisKKwkJbWVtbW92ZSgmY21kcHRyLT5wYXJhbXMuYWZjLAorCQkJcGRhdGFfYnVmLCBzaXplb2Yoc3RydWN0IGNtZF9kc184MDJfMTFfYWZjKSk7CisKKwkJcmV0ID0gMDsKKwkJZ290byBkb25lOworCisJY2FzZSBjbWRfODAyXzExZF9kb21haW5faW5mbzoKKwkJcmV0ID0gbGliZXJ0YXNfY21kXzgwMl8xMWRfZG9tYWluX2luZm8ocHJpdiwgY21kcHRyLAorCQkJCQkJICAgY21kX25vLCBjbWRfYWN0aW9uKTsKKwkJYnJlYWs7CisKKwljYXNlIGNtZF84MDJfMTFfc2xlZXBfcGFyYW1zOgorCQlyZXQgPSB3bGFuX2NtZF84MDJfMTFfc2xlZXBfcGFyYW1zKHByaXYsIGNtZHB0ciwgY21kX2FjdGlvbik7CisJCWJyZWFrOworCWNhc2UgY21kXzgwMl8xMV9pbmFjdGl2aXR5X3RpbWVvdXQ6CisJCXJldCA9IHdsYW5fY21kXzgwMl8xMV9pbmFjdGl2aXR5X3RpbWVvdXQocHJpdiwgY21kcHRyLAorCQkJCQkJCSBjbWRfYWN0aW9uLCBwZGF0YV9idWYpOworCQlsaWJlcnRhc19zZXRfY21kX2N0cmxfbm9kZShwcml2LCBjbWRub2RlLCAwLCAwLCBwZGF0YV9idWYpOworCQlicmVhazsKKworCWNhc2UgY21kXzgwMl8xMV90cGNfY2ZnOgorCQljbWRwdHItPmNvbW1hbmQgPSBjcHVfdG9fbGUxNihjbWRfODAyXzExX3RwY19jZmcpOworCQljbWRwdHItPnNpemUgPQorCQkgICAgY3B1X3RvX2xlMTYoc2l6ZW9mKHN0cnVjdCBjbWRfZHNfODAyXzExX3RwY19jZmcpICsKKwkJCQkgICAgIFNfRFNfR0VOKTsKKworCQltZW1tb3ZlKCZjbWRwdHItPnBhcmFtcy50cGNjZmcsCisJCQlwZGF0YV9idWYsIHNpemVvZihzdHJ1Y3QgY21kX2RzXzgwMl8xMV90cGNfY2ZnKSk7CisKKwkJcmV0ID0gMDsKKwkJYnJlYWs7CisJY2FzZSBjbWRfODAyXzExX2xlZF9ncGlvX2N0cmw6CisJCXsKKwkJCXN0cnVjdCBtcnZsaWV0eXBlc19sZWRncGlvICpncGlvID0KKwkJCSAgICAoc3RydWN0IG1ydmxpZXR5cGVzX2xlZGdwaW8qKQorCQkJICAgIGNtZHB0ci0+cGFyYW1zLmxlZGdwaW8uZGF0YTsKKworCQkJbWVtbW92ZSgmY21kcHRyLT5wYXJhbXMubGVkZ3BpbywKKwkJCQlwZGF0YV9idWYsCisJCQkJc2l6ZW9mKHN0cnVjdCBjbWRfZHNfODAyXzExX2xlZF9jdHJsKSk7CisKKwkJCWNtZHB0ci0+Y29tbWFuZCA9CisJCQkgICAgY3B1X3RvX2xlMTYoY21kXzgwMl8xMV9sZWRfZ3Bpb19jdHJsKTsKKworI2RlZmluZSBBQ1RJT05fTlVNTEVEX1RMVlRZUEVfTEVOX0ZJRUxEU19MRU4gOAorCQkJY21kcHRyLT5zaXplID0KKwkJCSAgICBjcHVfdG9fbGUxNihncGlvLT5oZWFkZXIubGVuICsgU19EU19HRU4gKworCQkJCQkgICAgIEFDVElPTl9OVU1MRURfVExWVFlQRV9MRU5fRklFTERTX0xFTik7CisJCQlncGlvLT5oZWFkZXIubGVuID0gY3B1X3RvX2xlMTYoZ3Bpby0+aGVhZGVyLmxlbik7CisKKwkJCXJldCA9IDA7CisJCQlicmVhazsKKwkJfQorCWNhc2UgY21kXzgwMl8xMV9wd3JfY2ZnOgorCQljbWRwdHItPmNvbW1hbmQgPSBjcHVfdG9fbGUxNihjbWRfODAyXzExX3B3cl9jZmcpOworCQljbWRwdHItPnNpemUgPQorCQkgICAgY3B1X3RvX2xlMTYoc2l6ZW9mKHN0cnVjdCBjbWRfZHNfODAyXzExX3B3cl9jZmcpICsKKwkJCQkgICAgIFNfRFNfR0VOKTsKKwkJbWVtbW92ZSgmY21kcHRyLT5wYXJhbXMucHdyY2ZnLCBwZGF0YV9idWYsCisJCQlzaXplb2Yoc3RydWN0IGNtZF9kc184MDJfMTFfcHdyX2NmZykpOworCisJCXJldCA9IDA7CisJCWJyZWFrOworCWNhc2UgY21kX2J0X2FjY2VzczoKKwkJcmV0ID0gd2xhbl9jbWRfYnRfYWNjZXNzKHByaXYsIGNtZHB0ciwgY21kX2FjdGlvbiwgcGRhdGFfYnVmKTsKKwkJYnJlYWs7CisKKwljYXNlIGNtZF9md3RfYWNjZXNzOgorCQlyZXQgPSB3bGFuX2NtZF9md3RfYWNjZXNzKHByaXYsIGNtZHB0ciwgY21kX2FjdGlvbiwgcGRhdGFfYnVmKTsKKwkJYnJlYWs7CisKKwljYXNlIGNtZF9tZXNoX2FjY2VzczoKKwkJcmV0ID0gd2xhbl9jbWRfbWVzaF9hY2Nlc3MocHJpdiwgY21kcHRyLCBjbWRfYWN0aW9uLCBwZGF0YV9idWYpOworCQlicmVhazsKKworCWNhc2UgY21kX2dldF90c2Y6CisJCWNtZHB0ci0+Y29tbWFuZCA9IGNwdV90b19sZTE2KGNtZF9nZXRfdHNmKTsKKwkJY21kcHRyLT5zaXplID0KKwkJICAgIGNwdV90b19sZTE2KHNpemVvZihzdHJ1Y3QgY21kX2RzX2dldF90c2YpCisJCQkJICAgICArIFNfRFNfR0VOKTsKKwkJcmV0ID0gMDsKKwkJYnJlYWs7CisJY2FzZSBjbWRfODAyXzExX3R4X3JhdGVfcXVlcnk6CisJCWNtZHB0ci0+Y29tbWFuZCA9CisJCSAgICBjcHVfdG9fbGUxNihjbWRfODAyXzExX3R4X3JhdGVfcXVlcnkpOworCQljbWRwdHItPnNpemUgPQorCQkgICAgY3B1X3RvX2xlMTYoc2l6ZW9mKHN0cnVjdCBjbWRfdHhfcmF0ZV9xdWVyeSkgKworCQkJCSAgICAgU19EU19HRU4pOworCQlhZGFwdGVyLT50eHJhdGUgPSAwOworCQlyZXQgPSAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlsYnNfcHJfZGVidWcoMSwgIlBSRVBfQ01EOiB1bmtub3duIGNvbW1hbmQtICUjeFxuIiwgY21kX25vKTsKKwkJcmV0ID0gLTE7CisJCWJyZWFrOworCX0KKworCS8qIHJldHVybiBlcnJvciwgc2luY2UgdGhlIGNvbW1hbmQgcHJlcGFyYXRpb24gZmFpbGVkICovCisJaWYgKHJldCAhPSAwKSB7CisJCWxic19wcl9kZWJ1ZygxLCAiUFJFUF9DTUQ6IGNvbW1hbmQgcHJlcGFyYXRpb24gZmFpbGVkXG4iKTsKKwkJbGliZXJ0YXNfY2xlYW51cF9hbmRfaW5zZXJ0X2NtZChwcml2LCBjbWRub2RlKTsKKwkJcmV0ID0gLTE7CisJCWdvdG8gZG9uZTsKKwl9CisKKwljbWRub2RlLT5jbWR3YWl0cXdva2VuID0gMDsKKworCWxpYmVydGFzX3F1ZXVlX2NtZChhZGFwdGVyLCBjbWRub2RlLCAxKTsKKwlhZGFwdGVyLT5ucl9jbWRfcGVuZGluZysrOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcHJpdi0+bWFpbnRocmVhZC53YWl0cSk7CisKKwlpZiAod2FpdF9vcHRpb24gJiBjbWRfb3B0aW9uX3dhaXRmb3Jyc3ApIHsKKwkJbGJzX3ByX2RlYnVnKDEsICJQUkVQX0NNRDogV2FpdCBmb3IgQ01EIHJlc3BvbnNlXG4iKTsKKwkJbWlnaHRfc2xlZXAoKTsKKwkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGNtZG5vZGUtPmNtZHdhaXRfcSwKKwkJCQkJIGNtZG5vZGUtPmNtZHdhaXRxd29rZW4pOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5kcml2ZXJfbG9jaywgZmxhZ3MpOworCWlmIChhZGFwdGVyLT5jdXJfY21kX3JldGNvZGUpIHsKKwkJbGJzX3ByX2RlYnVnKDEsICJQUkVQX0NNRDogY29tbWFuZCBmYWlsZWQgd2l0aCByZXR1cm4gY29kZT0lZFxuIiwKKwkJICAgICAgIGFkYXB0ZXItPmN1cl9jbWRfcmV0Y29kZSk7CisJCWFkYXB0ZXItPmN1cl9jbWRfcmV0Y29kZSA9IDA7CisJCXJldCA9IC0xOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5kcml2ZXJfbG9jaywgZmxhZ3MpOworCitkb25lOgorCUxFQVZFKCk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiAgQGJyaWVmIFRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIHRoZSBjb21tYW5kIGJ1ZmZlciBhbmQgbGluaworICogIGl0IHRvIGNvbW1hbmQgZnJlZSBxdWV1ZS4KKyAqCisgKiAgQHBhcmFtIHByaXYJCUEgcG9pbnRlciB0byB3bGFuX3ByaXZhdGUgc3RydWN0dXJlCisgKiAgQHJldHVybiAJCTAgb3IgLTEKKyAqLworaW50IGxpYmVydGFzX2FsbG9jYXRlX2NtZF9idWZmZXIod2xhbl9wcml2YXRlICogcHJpdikKK3sKKwlpbnQgcmV0ID0gMDsKKwl1MzIgdWxidWZzaXplOworCXUzMiBpOworCXN0cnVjdCBjbWRfY3RybF9ub2RlICp0ZW1wY21kX2FycmF5OworCXU4ICpwdGVtcHZpcnR1YWxhZGRyOworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisKKwlFTlRFUigpOworCisJLyogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgY21kQ3RybE5vZGUgKi8KKwl1bGJ1ZnNpemUgPSBzaXplb2Yoc3RydWN0IGNtZF9jdHJsX25vZGUpICogTVJWRFJWX05VTV9PRl9DTURfQlVGRkVSOworCisJaWYgKCEodGVtcGNtZF9hcnJheSA9IGttYWxsb2ModWxidWZzaXplLCBHRlBfS0VSTkVMKSkpIHsKKwkJbGJzX3ByX2RlYnVnKDEsCisJCSAgICAgICAiQUxMT0NfQ01EX0JVRjogZmFpbGVkIHRvIGFsbG9jYXRlIHRlbXBjbWRfYXJyYXlcbiIpOworCQlyZXQgPSAtMTsKKwkJZ290byBkb25lOworCX0KKworCWFkYXB0ZXItPmNtZF9hcnJheSA9IHRlbXBjbWRfYXJyYXk7CisJbWVtc2V0KGFkYXB0ZXItPmNtZF9hcnJheSwgMCwgdWxidWZzaXplKTsKKworCS8qIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGNvbW1hbmQgYnVmZmVycyAqLworCXVsYnVmc2l6ZSA9IE1SVkRSVl9TSVpFX09GX0NNRF9CVUZGRVI7CisJZm9yIChpID0gMDsgaSA8IE1SVkRSVl9OVU1fT0ZfQ01EX0JVRkZFUjsgaSsrKSB7CisJCWlmICghKHB0ZW1wdmlydHVhbGFkZHIgPSBrbWFsbG9jKHVsYnVmc2l6ZSwgR0ZQX0tFUk5FTCkpKSB7CisJCQlsYnNfcHJfZGVidWcoMSwKKwkJCSAgICAgICAiQUxMT0NfQ01EX0JVRjogcHRlbXB2aXJ0dWFsYWRkcjogb3V0IG9mIG1lbW9yeVxuIik7CisJCQlyZXQgPSAtMTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCisJCW1lbXNldChwdGVtcHZpcnR1YWxhZGRyLCAwLCB1bGJ1ZnNpemUpOworCisJCS8qIFVwZGF0ZSBjb21tYW5kIGJ1ZmZlciB2aXJ0dWFsICovCisJCXRlbXBjbWRfYXJyYXlbaV0uYnVmdmlydHVhbGFkZHIgPSBwdGVtcHZpcnR1YWxhZGRyOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBNUlZEUlZfTlVNX09GX0NNRF9CVUZGRVI7IGkrKykgeworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ0ZW1wY21kX2FycmF5W2ldLmNtZHdhaXRfcSk7CisJCWxpYmVydGFzX2NsZWFudXBfYW5kX2luc2VydF9jbWQocHJpdiwgJnRlbXBjbWRfYXJyYXlbaV0pOworCX0KKworCXJldCA9IDA7CisgICAgICBkb25lOgorCUxFQVZFKCk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiAgQGJyaWVmIFRoaXMgZnVuY3Rpb24gZnJlZXMgdGhlIGNvbW1hbmQgYnVmZmVyLgorICoKKyAqICBAcGFyYW0gcHJpdgkJQSBwb2ludGVyIHRvIHdsYW5fcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqICBAcmV0dXJuIAkJMCBvciAtMQorICovCitpbnQgbGliZXJ0YXNfZnJlZV9jbWRfYnVmZmVyKHdsYW5fcHJpdmF0ZSAqIHByaXYpCit7CisJdTMyIHVsYnVmc2l6ZTsKKwl1bnNpZ25lZCBpbnQgaTsKKwlzdHJ1Y3QgY21kX2N0cmxfbm9kZSAqdGVtcGNtZF9hcnJheTsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCisJRU5URVIoKTsKKworCS8qIG5lZWQgdG8gY2hlY2sgaWYgY21kIGFycmF5IGlzIGFsbG9jYXRlZCBvciBub3QgKi8KKwlpZiAoYWRhcHRlci0+Y21kX2FycmF5ID09IE5VTEwpIHsKKwkJbGJzX3ByX2RlYnVnKDEsICJGUkVFX0NNRF9CVUY6IGNtZF9hcnJheSBpcyBOdWxsXG4iKTsKKwkJZ290byBkb25lOworCX0KKworCXRlbXBjbWRfYXJyYXkgPSBhZGFwdGVyLT5jbWRfYXJyYXk7CisKKwkvKiBSZWxlYXNlIHNoYXJlZCBtZW1vcnkgYnVmZmVycyAqLworCXVsYnVmc2l6ZSA9IE1SVkRSVl9TSVpFX09GX0NNRF9CVUZGRVI7CisJZm9yIChpID0gMDsgaSA8IE1SVkRSVl9OVU1fT0ZfQ01EX0JVRkZFUjsgaSsrKSB7CisJCWlmICh0ZW1wY21kX2FycmF5W2ldLmJ1ZnZpcnR1YWxhZGRyKSB7CisJCQlsYnNfcHJfZGVidWcoMSwgIkZyZWUgYWxsIHRoZSBhcnJheVxuIik7CisJCQlrZnJlZSh0ZW1wY21kX2FycmF5W2ldLmJ1ZnZpcnR1YWxhZGRyKTsKKwkJCXRlbXBjbWRfYXJyYXlbaV0uYnVmdmlydHVhbGFkZHIgPSBOVUxMOworCQl9CisJfQorCisJLyogUmVsZWFzZSBjbWRfY3RybF9ub2RlICovCisJaWYgKGFkYXB0ZXItPmNtZF9hcnJheSkgeworCQlsYnNfcHJfZGVidWcoMSwgIkZyZWUgY21kX2FycmF5XG4iKTsKKwkJa2ZyZWUoYWRhcHRlci0+Y21kX2FycmF5KTsKKwkJYWRhcHRlci0+Y21kX2FycmF5ID0gTlVMTDsKKwl9CisKK2RvbmU6CisJTEVBVkUoKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiAgQGJyaWVmIFRoaXMgZnVuY3Rpb24gZ2V0cyBhIGZyZWUgY29tbWFuZCBub2RlIGlmIGF2YWlsYWJsZSBpbgorICogIGNvbW1hbmQgZnJlZSBxdWV1ZS4KKyAqCisgKiAgQHBhcmFtIHByaXYJCUEgcG9pbnRlciB0byB3bGFuX3ByaXZhdGUgc3RydWN0dXJlCisgKiAgQHJldHVybiBjbWRfY3RybF9ub2RlIEEgcG9pbnRlciB0byBjbWRfY3RybF9ub2RlIHN0cnVjdHVyZSBvciBOVUxMCisgKi8KK3N0cnVjdCBjbWRfY3RybF9ub2RlICpsaWJlcnRhc19nZXRfZnJlZV9jbWRfY3RybF9ub2RlKHdsYW5fcHJpdmF0ZSAqIHByaXYpCit7CisJc3RydWN0IGNtZF9jdHJsX25vZGUgKnRlbXBub2RlOworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghYWRhcHRlcikKKwkJcmV0dXJuIE5VTEw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKKworCWlmICghbGlzdF9lbXB0eSgmYWRhcHRlci0+Y21kZnJlZXEpKSB7CisJCXRlbXBub2RlID0gKHN0cnVjdCBjbWRfY3RybF9ub2RlICopYWRhcHRlci0+Y21kZnJlZXEubmV4dDsKKwkJbGlzdF9kZWwoKHN0cnVjdCBsaXN0X2hlYWQgKil0ZW1wbm9kZSk7CisJfSBlbHNlIHsKKwkJbGJzX3ByX2RlYnVnKDEsICJHRVRfQ01EX05PREU6IGNtZF9jdHJsX25vZGUgaXMgbm90IGF2YWlsYWJsZVxuIik7CisJCXRlbXBub2RlID0gTlVMTDsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5kcml2ZXJfbG9jaywgZmxhZ3MpOworCisJaWYgKHRlbXBub2RlKSB7CisJCWxic19wcl9kZWJ1ZygzLCAiR0VUX0NNRF9OT0RFOiBjbWRDdHJsTm9kZSBhdmFpbGFibGVcbiIpOworCQlsYnNfcHJfZGVidWcoMywgIkdFVF9DTURfTk9ERTogY21kQ3RybE5vZGUgQWRkcmVzcyA9ICVwXG4iLAorCQkgICAgICAgdGVtcG5vZGUpOworCQljbGVhbnVwX2NtZG5vZGUodGVtcG5vZGUpOworCX0KKworCXJldHVybiB0ZW1wbm9kZTsKK30KKworLyoqCisgKiAgQGJyaWVmIFRoaXMgZnVuY3Rpb24gY2xlYW5zIGNvbW1hbmQgbm9kZS4KKyAqCisgKiAgQHBhcmFtIHB0ZW1wbm9kZQlBIHBvaW50ZXIgdG8gY21kQ3RybE5vZGUgc3RydWN0dXJlCisgKiAgQHJldHVybiAJCW4vYQorICovCitzdGF0aWMgdm9pZCBjbGVhbnVwX2NtZG5vZGUoc3RydWN0IGNtZF9jdHJsX25vZGUgKnB0ZW1wbm9kZSkKK3sKKwlpZiAoIXB0ZW1wbm9kZSkKKwkJcmV0dXJuOworCXB0ZW1wbm9kZS0+Y21kd2FpdHF3b2tlbiA9IDE7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwdGVtcG5vZGUtPmNtZHdhaXRfcSk7CisJcHRlbXBub2RlLT5zdGF0dXMgPSAwOworCXB0ZW1wbm9kZS0+Y21kX29pZCA9ICh1MzIpIDA7CisJcHRlbXBub2RlLT53YWl0X29wdGlvbiA9IDA7CisJcHRlbXBub2RlLT5wZGF0YV9idWYgPSBOVUxMOworCisJaWYgKHB0ZW1wbm9kZS0+YnVmdmlydHVhbGFkZHIgIT0gTlVMTCkKKwkJbWVtc2V0KHB0ZW1wbm9kZS0+YnVmdmlydHVhbGFkZHIsIDAsIE1SVkRSVl9TSVpFX09GX0NNRF9CVUZGRVIpOworCXJldHVybjsKK30KKworLyoqCisgKiAgQGJyaWVmIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIGNvbW1hbmQgbm9kZS4KKyAqCisgKiAgQHBhcmFtIHByaXYJCUEgcG9pbnRlciB0byB3bGFuX3ByaXZhdGUgc3RydWN0dXJlCisgKiAgQHBhcmFtIHB0ZW1wbm9kZQlBIHBvaW50ZXIgdG8gY21kX2N0cmxfbm9kZSBzdHJ1Y3R1cmUKKyAqICBAcGFyYW0gY21kX29pZAljbWQgb2lkOiB0cmVhdGVkIGFzIHN1YiBjb21tYW5kCisgKiAgQHBhcmFtIHdhaXRfb3B0aW9uCXdhaXQgb3B0aW9uOiB3YWl0IHJlc3BvbnNlIG9yIG5vdAorICogIEBwYXJhbSBwZGF0YV9idWYJQSBwb2ludGVyIHRvIGluZm9ybWFpb24gYnVmZmVyCisgKiAgQHJldHVybiAJCTAgb3IgLTEKKyAqLwordm9pZCBsaWJlcnRhc19zZXRfY21kX2N0cmxfbm9kZSh3bGFuX3ByaXZhdGUgKiBwcml2LAorCQkgICAgc3RydWN0IGNtZF9jdHJsX25vZGUgKnB0ZW1wbm9kZSwKKwkJICAgIHUzMiBjbWRfb2lkLCB1MTYgd2FpdF9vcHRpb24sIHZvaWQgKnBkYXRhX2J1ZikKK3sKKwlFTlRFUigpOworCisJaWYgKCFwdGVtcG5vZGUpCisJCXJldHVybjsKKworCXB0ZW1wbm9kZS0+Y21kX29pZCA9IGNtZF9vaWQ7CisJcHRlbXBub2RlLT53YWl0X29wdGlvbiA9IHdhaXRfb3B0aW9uOworCXB0ZW1wbm9kZS0+cGRhdGFfYnVmID0gcGRhdGFfYnVmOworCisJTEVBVkUoKTsKK30KKworLyoqCisgKiAgQGJyaWVmIFRoaXMgZnVuY3Rpb24gZXhlY3V0ZXMgbmV4dCBjb21tYW5kIGluIGNvbW1hbmQKKyAqICBwZW5kaW5nIHF1ZXVlLiBJdCB3aWxsIHB1dCBmaW13YXJlIGJhY2sgdG8gUFMgbW9kZQorICogIGlmIGFwcGxpY2FibGUuCisgKgorICogIEBwYXJhbSBwcml2ICAgICBBIHBvaW50ZXIgdG8gd2xhbl9wcml2YXRlIHN0cnVjdHVyZQorICogIEByZXR1cm4gCSAgIDAgb3IgLTEKKyAqLworaW50IGxpYmVydGFzX2V4ZWN1dGVfbmV4dF9jb21tYW5kKHdsYW5fcHJpdmF0ZSAqIHByaXYpCit7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwlzdHJ1Y3QgY21kX2N0cmxfbm9kZSAqY21kbm9kZSA9IE5VTEw7CisJc3RydWN0IGNtZF9kc19jb21tYW5kICpjbWRwdHI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMDsKKworCWxic19wcl9kZWJ1ZygxLCAibGliZXJ0YXNfZXhlY3V0ZV9uZXh0X2NvbW1hbmRcbiIpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPmRyaXZlcl9sb2NrLCBmbGFncyk7CisKKwlpZiAoYWRhcHRlci0+Y3VyX2NtZCkgeworCQlsYnNfcHJfYWxlcnQoICJFWEVDX05FWFRfQ01EOiB0aGVyZSBpcyBjb21tYW5kIGluIHByb2Nlc3NpbmchXG4iKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKKwkJcmV0ID0gLTE7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAoIWxpc3RfZW1wdHkoJmFkYXB0ZXItPmNtZHBlbmRpbmdxKSkgeworCQljbWRub2RlID0gKHN0cnVjdCBjbWRfY3RybF9ub2RlICopCisJCSAgICBhZGFwdGVyLT5jbWRwZW5kaW5ncS5uZXh0OworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPmRyaXZlcl9sb2NrLCBmbGFncyk7CisKKwlpZiAoY21kbm9kZSkgeworCQlsYnNfcHJfZGVidWcoMSwKKwkJICAgICAgICJFWEVDX05FWFRfQ01EOiBHb3QgbmV4dCBjb21tYW5kIGZyb20gY21kcGVuZGluZ3FcbiIpOworCQljbWRwdHIgPSAoc3RydWN0IGNtZF9kc19jb21tYW5kICopY21kbm9kZS0+YnVmdmlydHVhbGFkZHI7CisKKwkJaWYgKGlzX2NvbW1hbmRfYWxsb3dlZF9pbl9wcyhjbWRwdHItPmNvbW1hbmQpKSB7CisJCQlpZiAoKGFkYXB0ZXItPnBzc3RhdGUgPT0gUFNfU1RBVEVfU0xFRVApCisJCQkgICAgfHwgKGFkYXB0ZXItPnBzc3RhdGUgPT0gUFNfU1RBVEVfUFJFX1NMRUVQKQorCQkJICAgICkgeworCQkJCWxic19wcl9kZWJ1ZygxLAorCQkJCSAgICAgICAiRVhFQ19ORVhUX0NNRDogQ2Fubm90IHNlbmQgY21kIDB4JXggaW4gcHNzdGF0ZSAlZFxuIiwKKwkJCQkgICAgICAgY21kcHRyLT5jb21tYW5kLCBhZGFwdGVyLT5wc3N0YXRlKTsKKwkJCQlyZXQgPSAtMTsKKwkJCQlnb3RvIGRvbmU7CisJCQl9CisJCQlsYnNfcHJfZGVidWcoMSwgIkVYRUNfTkVYVF9DTUQ6IE9LIHRvIHNlbmQgY29tbWFuZCAiCisJCQkgICAgICAgIjB4JXggaW4gcHNzdGF0ZSAlZFxuIiwKKwkJCSAgICAgICBjbWRwdHItPmNvbW1hbmQsIGFkYXB0ZXItPnBzc3RhdGUpOworCQl9IGVsc2UgaWYgKGFkYXB0ZXItPnBzc3RhdGUgIT0gUFNfU1RBVEVfRlVMTF9QT1dFUikgeworCQkJLyoKKwkJCSAqIDEuIE5vbi1QUyBjb21tYW5kOgorCQkJICogUXVldWUgaXQuIHNldCBuZWVkdG93YWtldXAgdG8gVFJVRSBpZiBjdXJyZW50IHN0YXRlCisJCQkgKiBpcyBTTEVFUCwgb3RoZXJ3aXNlIGNhbGwgbGliZXJ0YXNfcHNfd2FrZXVwIHRvIHNlbmQgRXhpdF9QUy4KKwkJCSAqIDIuIFBTIGNvbW1hbmQgYnV0IG5vdCBFeGl0X1BTOgorCQkJICogSWdub3JlIGl0LgorCQkJICogMy4gUFMgY29tbWFuZCBFeGl0X1BTOgorCQkJICogU2V0IG5lZWR0b3dha2V1cCB0byBUUlVFIGlmIGN1cnJlbnQgc3RhdGUgaXMgU0xFRVAsCisJCQkgKiBvdGhlcndpc2Ugc2VuZCB0aGlzIGNvbW1hbmQgZG93biB0byBmaXJtd2FyZQorCQkJICogaW1tZWRpYXRlbHkuCisJCQkgKi8KKwkJCWlmIChjbWRwdHItPmNvbW1hbmQgIT0KKwkJCSAgICBjcHVfdG9fbGUxNihjbWRfODAyXzExX3BzX21vZGUpKSB7CisJCQkJLyogIFByZXBhcmUgdG8gc2VuZCBFeGl0IFBTLAorCQkJCSAqICB0aGlzIG5vbiBQUyBjb21tYW5kIHdpbGwgYmUgc2VudCBsYXRlciAqLworCQkJCWlmICgoYWRhcHRlci0+cHNzdGF0ZSA9PSBQU19TVEFURV9TTEVFUCkKKwkJCQkgICAgfHwgKGFkYXB0ZXItPnBzc3RhdGUgPT0gUFNfU1RBVEVfUFJFX1NMRUVQKQorCQkJCSAgICApIHsKKwkJCQkJLyogdy8gbmV3IHNjaGVtZSwgaXQgd2lsbCBub3QgcmVhY2ggaGVyZS4KKwkJCQkJICAgc2luY2UgaXQgaXMgYmxvY2tlZCBpbiBtYWluX3RocmVhZC4gKi8KKwkJCQkJYWRhcHRlci0+bmVlZHRvd2FrZXVwID0gMTsKKwkJCQl9IGVsc2UKKwkJCQkJbGliZXJ0YXNfcHNfd2FrZXVwKHByaXYsIDApOworCisJCQkJcmV0ID0gMDsKKwkJCQlnb3RvIGRvbmU7CisJCQl9IGVsc2UgeworCQkJCS8qCisJCQkJICogUFMgY29tbWFuZC4gSWdub3JlIGl0IGlmIGl0IGlzIG5vdCBFeGl0X1BTLgorCQkJCSAqIG90aGVyd2lzZSBzZW5kIGl0IGRvd24gaW1tZWRpYXRlbHkuCisJCQkJICovCisJCQkJc3RydWN0IGNtZF9kc184MDJfMTFfcHNfbW9kZSAqcHNtID0KKwkJCQkgICAgJmNtZHB0ci0+cGFyYW1zLnBzbW9kZTsKKworCQkJCWxic19wcl9kZWJ1ZygxLAorCQkJCSAgICAgICAiRVhFQ19ORVhUX0NNRDogUFMgY21kLSBhY3Rpb249MHgleFxuIiwKKwkJCQkgICAgICAgcHNtLT5hY3Rpb24pOworCQkJCWlmIChwc20tPmFjdGlvbiAhPQorCQkJCSAgICBjcHVfdG9fbGUxNihjbWRfc3ViY21kX2V4aXRfcHMpKSB7CisJCQkJCWxic19wcl9kZWJ1ZygxLAorCQkJCQkgICAgICAgIkVYRUNfTkVYVF9DTUQ6IElnbm9yZSBFbnRlciBQUyBjbWRcbiIpOworCQkJCQlsaXN0X2RlbCgoc3RydWN0IGxpc3RfaGVhZCAqKWNtZG5vZGUpOworCQkJCQlsaWJlcnRhc19jbGVhbnVwX2FuZF9pbnNlcnRfY21kKHByaXYsIGNtZG5vZGUpOworCisJCQkJCXJldCA9IDA7CisJCQkJCWdvdG8gZG9uZTsKKwkJCQl9CisKKwkJCQlpZiAoKGFkYXB0ZXItPnBzc3RhdGUgPT0gUFNfU1RBVEVfU0xFRVApCisJCQkJICAgIHx8IChhZGFwdGVyLT5wc3N0YXRlID09IFBTX1NUQVRFX1BSRV9TTEVFUCkKKwkJCQkgICAgKSB7CisJCQkJCWxic19wcl9kZWJ1ZygxLAorCQkJCQkgICAgICAgIkVYRUNfTkVYVF9DTUQ6IElnbm9yZSBFeGl0UFMgY21kIGluIHNsZWVwXG4iKTsKKwkJCQkJbGlzdF9kZWwoKHN0cnVjdCBsaXN0X2hlYWQgKiljbWRub2RlKTsKKwkJCQkJbGliZXJ0YXNfY2xlYW51cF9hbmRfaW5zZXJ0X2NtZChwcml2LCBjbWRub2RlKTsKKwkJCQkJYWRhcHRlci0+bmVlZHRvd2FrZXVwID0gMTsKKworCQkJCQlyZXQgPSAwOworCQkJCQlnb3RvIGRvbmU7CisJCQkJfQorCisJCQkJbGJzX3ByX2RlYnVnKDEsCisJCQkJICAgICAgICJFWEVDX05FWFRfQ01EOiBTZW5kaW5nIEV4aXRfUFMgZG93bi4uLlxuIik7CisJCQl9CisJCX0KKwkJbGlzdF9kZWwoKHN0cnVjdCBsaXN0X2hlYWQgKiljbWRub2RlKTsKKwkJbGJzX3ByX2RlYnVnKDEsICJFWEVDX05FWFRfQ01EOiBTZW5kaW5nIDB4JTA0WCBjb21tYW5kXG4iLAorCQkgICAgICAgY21kcHRyLT5jb21tYW5kKTsKKwkJRG93bmxvYWRjb21tYW5kVG9TdGF0aW9uKHByaXYsIGNtZG5vZGUpOworCX0gZWxzZSB7CisJCS8qCisJCSAqIGNoZWNrIGlmIGluIHBvd2VyIHNhdmUgbW9kZSwgaWYgeWVzLCBwdXQgdGhlIGRldmljZSBiYWNrCisJCSAqIHRvIFBTIG1vZGUKKwkJICovCisJCWlmICgoYWRhcHRlci0+cHNtb2RlICE9IHdsYW44MDJfMTFwb3dlcm1vZGVjYW0pICYmCisJCSAgICAoYWRhcHRlci0+cHNzdGF0ZSA9PSBQU19TVEFURV9GVUxMX1BPV0VSKSAmJgorCQkgICAgKGFkYXB0ZXItPmNvbm5lY3Rfc3RhdHVzID09IGxpYmVydGFzX2Nvbm5lY3RlZCkpIHsKKwkJCWlmIChhZGFwdGVyLT5zZWNpbmZvLldQQWVuYWJsZWQKKwkJCSAgICB8fCBhZGFwdGVyLT5zZWNpbmZvLldQQTJlbmFibGVkKSB7CisJCQkJLyogY2hlY2sgZm9yIHZhbGlkIFdQQSBncm91cCBrZXlzICovCisJCQkJaWYgKGFkYXB0ZXItPndwYV9tY2FzdF9rZXkubGVuCisJCQkJICAgIHx8IGFkYXB0ZXItPndwYV91bmljYXN0X2tleS5sZW4pIHsKKwkJCQkJbGJzX3ByX2RlYnVnKDEsCisJCQkJCSAgICAgICAiRVhFQ19ORVhUX0NNRDogV1BBIGVuYWJsZWQgYW5kIEdUS19TRVQiCisJCQkJCSAgICAgICAiIGdvIGJhY2sgdG8gUFNfU0xFRVAiKTsKKwkJCQkJbGliZXJ0YXNfcHNfc2xlZXAocHJpdiwgMCk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlsYnNfcHJfZGVidWcoMSwKKwkJCQkgICAgICAgIkVYRUNfTkVYVF9DTUQ6IGNvbW1hbmQgUGVuZFEgaXMgZW1wdHksIgorCQkJCSAgICAgICAiIGdvIGJhY2sgdG8gUFNfU0xFRVAiKTsKKwkJCQlsaWJlcnRhc19wc19zbGVlcChwcml2LCAwKTsKKwkJCX0KKwkJfQorCX0KKworCXJldCA9IDA7Citkb25lOgorCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgbGliZXJ0YXNfc2VuZF9pd2V2Y3VzdG9tX2V2ZW50KHdsYW5fcHJpdmF0ZSAqIHByaXYsIHM4ICogc3RyKQoreworCXVuaW9uIGl3cmVxX2RhdGEgaXdycTsKKwl1OCBidWZbNTBdOworCisJRU5URVIoKTsKKworCW1lbXNldCgmaXdycSwgMCwgc2l6ZW9mKHVuaW9uIGl3cmVxX2RhdGEpKTsKKwltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7CisKKwlzbnByaW50ZihidWYsIHNpemVvZihidWYpIC0gMSwgIiVzIiwgc3RyKTsKKworCWl3cnEuZGF0YS5sZW5ndGggPSBzdHJsZW4oYnVmKSArIDEgKyBJV19FVl9MQ1BfTEVOOworCisJLyogU2VuZCBFdmVudCB0byB1cHBlciBsYXllciAqLworCWxic19wcl9kZWJ1ZygxLCAiRXZlbnQgSW5kaWNhdGlvbiBzdHJpbmcgPSAlc1xuIiwKKwkgICAgICAgKGNoYXIgKilidWYpOworCWxic19wcl9kZWJ1ZygxLCAiRXZlbnQgSW5kaWNhdGlvbiBTdHJpbmcgbGVuZ3RoID0gJWRcbiIsIGl3cnEuZGF0YS5sZW5ndGgpOworCisJbGJzX3ByX2RlYnVnKDEsICJTZW5kaW5nIHdpcmVsZXNzIGV2ZW50IElXRVZDVVNUT00gZm9yICVzXG4iLCBzdHIpOworCXdpcmVsZXNzX3NlbmRfZXZlbnQocHJpdi0+d2xhbl9kZXYubmV0ZGV2LCBJV0VWQ1VTVE9NLCAmaXdycSwgYnVmKTsKKworCUxFQVZFKCk7CisJcmV0dXJuOworfQorCitzdGF0aWMgaW50IHNlbmRjb25maXJtc2xlZXAod2xhbl9wcml2YXRlICogcHJpdiwgdTggKiBjbWRwdHIsIHUxNiBzaXplKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwlpbnQgcmV0ID0gMDsKKworCUVOVEVSKCk7CisKKwlsYnNfcHJfZGVidWcoMSwgIlNFTkRfU0xFRVBDX0NNRDogQmVmb3JlIGRvd25sb2FkLCBzaXplIG9mIGNtZCA9ICVkXG4iLAorCSAgICAgICBzaXplKTsKKworCWxic19kYmdfaGV4KCJTRU5EX1NMRUVQQ19DTUQ6IFNsZWVwIGNvbmZpcm0gY29tbWFuZCIsIGNtZHB0ciwgc2l6ZSk7CisKKwlyZXQgPSBsaWJlcnRhc19zYmlfaG9zdF90b19jYXJkKHByaXYsIE1WTVNfQ01ELCBjbWRwdHIsIHNpemUpOworCXByaXYtPndsYW5fZGV2LmRubGRfc2VudCA9IEROTERfUkVTX1JFQ0VJVkVEOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPmRyaXZlcl9sb2NrLCBmbGFncyk7CisJaWYgKGFkYXB0ZXItPmludGNvdW50ZXIgfHwgYWRhcHRlci0+Y3VycmVudHR4c2tiKQorCQlsYnNfcHJfZGVidWcoMSwgIlNFTkRfU0xFRVBDX0NNRDogaW50Y291bnRlcj0lZCBjdXJyZW50dHhza2I9JXBcbiIsCisJCSAgICAgICBhZGFwdGVyLT5pbnRjb3VudGVyLCBhZGFwdGVyLT5jdXJyZW50dHhza2IpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPmRyaXZlcl9sb2NrLCBmbGFncyk7CisKKwlpZiAocmV0KSB7CisJCWxic19wcl9hbGVydCgKKwkJICAgICAgICJTRU5EX1NMRUVQQ19DTUQ6IEhvc3QgdG8gQ2FyZCBmYWlsZWQgZm9yIENvbmZpcm0gU2xlZXBcbiIpOworCX0gZWxzZSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5kcml2ZXJfbG9jaywgZmxhZ3MpOworCQlpZiAoIWFkYXB0ZXItPmludGNvdW50ZXIpIHsKKwkJCWFkYXB0ZXItPnBzc3RhdGUgPSBQU19TVEFURV9TTEVFUDsKKwkJfSBlbHNlIHsKKwkJCWxic19wcl9kZWJ1ZygxLCAiU0VORF9TTEVFUENfQ01EOiBBZnRlciBzZW50LEludEM9JWRcbiIsCisJCQkgICAgICAgYWRhcHRlci0+aW50Y291bnRlcik7CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKKworCQlsYnNfcHJfZGVidWcoMSwgIlNFTkRfU0xFRVBDX0NNRDogU2VudCBDb25maXJtIFNsZWVwIGNvbW1hbmRcbiIpOworCQlsYnNfcHJfZGVidWcoMSwgIisiKTsKKwl9CisKKwlMRUFWRSgpOworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgbGliZXJ0YXNfcHNfc2xlZXAod2xhbl9wcml2YXRlICogcHJpdiwgaW50IHdhaXRfb3B0aW9uKQoreworCisJRU5URVIoKTsKKworCS8qCisJICogUFMgaXMgY3VycmVudGx5IHN1cHBvcnRlZCBvbmx5IGluIEluZnJhc3RydWN0dXJlIG1vZGUKKwkgKiBSZW1vdmUgdGhpcyBjaGVjayBpZiBpdCBpcyB0byBiZSBzdXBwb3J0ZWQgaW4gSUJTUyBtb2RlIGFsc28KKwkgKi8KKworCWxpYmVydGFzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZChwcml2LCBjbWRfODAyXzExX3BzX21vZGUsCisJCQkgICAgICBjbWRfc3ViY21kX2VudGVyX3BzLCB3YWl0X29wdGlvbiwgMCwgTlVMTCk7CisKKwlMRUFWRSgpOworCXJldHVybjsKK30KKworLyoqCisgKiAgQGJyaWVmIFRoaXMgZnVuY3Rpb24gc2VuZHMgRWl4dF9QUyBjb21tYW5kIHRvIGZpcm13YXJlLgorICoKKyAqICBAcGFyYW0gcHJpdiAgICAJQSBwb2ludGVyIHRvIHdsYW5fcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqICBAcGFyYW0gd2FpdF9vcHRpb24Jd2FpdCByZXNwb25zZSBvciBub3QKKyAqICBAcmV0dXJuIAkgICAJbi9hCisgKi8KK3ZvaWQgbGliZXJ0YXNfcHNfd2FrZXVwKHdsYW5fcHJpdmF0ZSAqIHByaXYsIGludCB3YWl0X29wdGlvbikKK3sKKwllbnVtIFdMQU5fODAyXzExX1BPV0VSX01PREUgTG9jYWxwc21vZGU7CisKKwlFTlRFUigpOworCisJTG9jYWxwc21vZGUgPSB3bGFuODAyXzExcG93ZXJtb2RlY2FtOworCisJbGJzX3ByX2RlYnVnKDEsICJFeGl0X1BTOiBMb2NhbHBzbW9kZSA9ICVkXG4iLCBMb2NhbHBzbW9kZSk7CisKKwlsaWJlcnRhc19wcmVwYXJlX2FuZF9zZW5kX2NvbW1hbmQocHJpdiwgY21kXzgwMl8xMV9wc19tb2RlLAorCQkJICAgICAgY21kX3N1YmNtZF9leGl0X3BzLAorCQkJICAgICAgd2FpdF9vcHRpb24sIDAsICZMb2NhbHBzbW9kZSk7CisKKwlMRUFWRSgpOworCXJldHVybjsKK30KKworLyoqCisgKiAgQGJyaWVmIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGNvbmRpdGlvbiBhbmQgcHJlcGFyZXMgdG8KKyAqICBzZW5kIHNsZWVwIGNvbmZpcm0gY29tbWFuZCB0byBmaXJtd2FyZSBpZiBvay4KKyAqCisgKiAgQHBhcmFtIHByaXYgICAgCUEgcG9pbnRlciB0byB3bGFuX3ByaXZhdGUgc3RydWN0dXJlCisgKiAgQHBhcmFtIHBzbW9kZSAgCVBvd2VyIFNhdmluZyBtb2RlCisgKiAgQHJldHVybiAJICAgCW4vYQorICovCit2b2lkIGxpYmVydGFzX3BzX2NvbmZpcm1fc2xlZXAod2xhbl9wcml2YXRlICogcHJpdiwgdTE2IHBzbW9kZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0wOworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJdTggYWxsb3dlZCA9IDE7CisKKwlFTlRFUigpOworCisJaWYgKHByaXYtPndsYW5fZGV2LmRubGRfc2VudCkgeworCQlhbGxvd2VkID0gMDsKKwkJbGJzX3ByX2RlYnVnKDEsICJEIik7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPmRyaXZlcl9sb2NrLCBmbGFncyk7CisJaWYgKGFkYXB0ZXItPmN1cl9jbWQpIHsKKwkJYWxsb3dlZCA9IDA7CisJCWxic19wcl9kZWJ1ZygxLCAiQyIpOworCX0KKwlpZiAoYWRhcHRlci0+aW50Y291bnRlciA+IDApIHsKKwkJYWxsb3dlZCA9IDA7CisJCWxic19wcl9kZWJ1ZygxLCAiSSVkIiwgYWRhcHRlci0+aW50Y291bnRlcik7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPmRyaXZlcl9sb2NrLCBmbGFncyk7CisKKwlpZiAoYWxsb3dlZCkgeworCQlsYnNfcHJfZGVidWcoMSwgIlNlbmRpbmcgbGliZXJ0YXNfcHNfY29uZmlybV9zbGVlcFxuIik7CisJCXNlbmRjb25maXJtc2xlZXAocHJpdiwgKHU4ICopICYgYWRhcHRlci0+bGliZXJ0YXNfcHNfY29uZmlybV9zbGVlcCwKKwkJCQkgc2l6ZW9mKHN0cnVjdCBQU19DTURfQ29uZmlybVNsZWVwKSk7CisJfSBlbHNlIHsKKwkJbGJzX3ByX2RlYnVnKDEsICJTbGVlcCBDb25maXJtIGhhcyBiZWVuIGRlbGF5ZWRcbiIpOworCX0KKworCUxFQVZFKCk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9jbWRyZXNwLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9jbWRyZXNwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RiMDEyYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2NtZHJlc3AuYwpAQCAtMCwwICsxLDEwMzEgQEAKKy8qKgorICAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgaGFuZGxpbmcgb2YgY29tbWFuZAorICAqIHJlc3BvbnNlcyBhcyB3ZWxsIGFzIGV2ZW50cyBnZW5lcmF0ZWQgYnkgZmlybXdhcmUuCisgICovCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKworI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+CisKKyNpbmNsdWRlICJob3N0LmgiCisjaW5jbHVkZSAic2JpLmgiCisjaW5jbHVkZSAiZGVjbC5oIgorI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJkZXYuaCIKKyNpbmNsdWRlICJqb2luLmgiCisjaW5jbHVkZSAid2V4dC5oIgorCisvKioKKyAqICBAYnJpZWYgVGhpcyBmdW5jdGlvbiBoYW5kbGVzIGRpc2Nvbm5lY3QgZXZlbnQuIGl0CisgKiAgcmVwb3J0cyBkaXNjb25uZWN0IHRvIHVwcGVyIGxheWVyLCBjbGVhbiB0eC9yeCBwYWNrZXRzLAorICogIHJlc2V0IGxpbmsgc3RhdGUgZXRjLgorICoKKyAqICBAcGFyYW0gcHJpdiAgICBBIHBvaW50ZXIgdG8gd2xhbl9wcml2YXRlIHN0cnVjdHVyZQorICogIEByZXR1cm4gCSAgIG4vYQorICovCit2b2lkIGxpYmVydGFzX21hY19ldmVudF9kaXNjb25uZWN0ZWQod2xhbl9wcml2YXRlICogcHJpdikKK3sKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCXVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKKworCWlmIChhZGFwdGVyLT5jb25uZWN0X3N0YXR1cyAhPSBsaWJlcnRhc19jb25uZWN0ZWQpCisJCXJldHVybjsKKworCWxic19wcl9kZWJ1ZygxLCAiSGFuZGxlcyBkaXNjb25uZWN0IGV2ZW50LlxuIik7CisKKwltZW1zZXQod3JxdS5hcF9hZGRyLnNhX2RhdGEsIDB4MDAsIEVUSF9BTEVOKTsKKwl3cnF1LmFwX2FkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCisJLyoKKwkgKiBDaXNjbyBBUCBzZW5kcyBFQVAgZmFpbHVyZSBhbmQgZGUtYXV0aCBpbiBsZXNzIHRoYW4gMC41IG1zLgorCSAqIEl0IGNhdXNlcyBwcm9ibGVtIGluIHRoZSBTdXBwbGljYW50CisJICovCisKKwltc2xlZXBfaW50ZXJydXB0aWJsZSgxMDAwKTsKKwl3aXJlbGVzc19zZW5kX2V2ZW50KHByaXYtPndsYW5fZGV2Lm5ldGRldiwgU0lPQ0dJV0FQLCAmd3JxdSwgTlVMTCk7CisKKwkvKiBGcmVlIFR4IGFuZCBSeCBwYWNrZXRzICovCisJa2ZyZWVfc2tiKHByaXYtPmFkYXB0ZXItPmN1cnJlbnR0eHNrYik7CisJcHJpdi0+YWRhcHRlci0+Y3VycmVudHR4c2tiID0gTlVMTDsKKworCS8qIHJlcG9ydCBkaXNjb25uZWN0IHRvIHVwcGVyIGxheWVyICovCisJbmV0aWZfc3RvcF9xdWV1ZShwcml2LT53bGFuX2Rldi5uZXRkZXYpOworCW5ldGlmX2NhcnJpZXJfb2ZmKHByaXYtPndsYW5fZGV2Lm5ldGRldik7CisKKwkvKiByZXNldCBTTlIvTkYvUlNTSSB2YWx1ZXMgKi8KKwltZW1zZXQoYWRhcHRlci0+U05SLCAweDAwLCBzaXplb2YoYWRhcHRlci0+U05SKSk7CisJbWVtc2V0KGFkYXB0ZXItPk5GLCAweDAwLCBzaXplb2YoYWRhcHRlci0+TkYpKTsKKwltZW1zZXQoYWRhcHRlci0+UlNTSSwgMHgwMCwgc2l6ZW9mKGFkYXB0ZXItPlJTU0kpKTsKKwltZW1zZXQoYWRhcHRlci0+cmF3U05SLCAweDAwLCBzaXplb2YoYWRhcHRlci0+cmF3U05SKSk7CisJbWVtc2V0KGFkYXB0ZXItPnJhd05GLCAweDAwLCBzaXplb2YoYWRhcHRlci0+cmF3TkYpKTsKKwlhZGFwdGVyLT5uZXh0U05STkYgPSAwOworCWFkYXB0ZXItPm51bVNOUk5GID0gMDsKKwlhZGFwdGVyLT5yeHBkX3JhdGUgPSAwOworCWxic19wcl9kZWJ1ZygxLCAiQ3VycmVudCBTU0lEPSVzLCBzc2lkIGxlbmd0aD0ldVxuIiwKKwkgICAgICAgYWRhcHRlci0+Y3VyYnNzcGFyYW1zLnNzaWQuc3NpZCwKKwkgICAgICAgYWRhcHRlci0+Y3VyYnNzcGFyYW1zLnNzaWQuc3NpZGxlbmd0aCk7CisJbGJzX3ByX2RlYnVnKDEsICJQcmV2aW91cyBTU0lEPSVzLCBzc2lkIGxlbmd0aD0ldVxuIiwKKwkgICAgICAgYWRhcHRlci0+cHJldmlvdXNzc2lkLnNzaWQsIGFkYXB0ZXItPnByZXZpb3Vzc3NpZC5zc2lkbGVuZ3RoKTsKKworCS8qIHJlc2V0IGludGVybmFsIGZsYWdzICovCisJYWRhcHRlci0+c2VjaW5mby5XUEFlbmFibGVkID0gMDsKKwlhZGFwdGVyLT5zZWNpbmZvLldQQTJlbmFibGVkID0gMDsKKwlhZGFwdGVyLT53cGFfaWVfbGVuID0gMDsKKwlhZGFwdGVyLT5zZWNpbmZvLmF1dGgxeGFsZyA9IFdMQU5fMVhfQVVUSF9BTEdfTk9ORTsKKwlhZGFwdGVyLT5zZWNpbmZvLkVuY3J5cHRpb25tb2RlID0gQ0lQSEVSX05PTkU7CisKKwlhZGFwdGVyLT5jb25uZWN0X3N0YXR1cyA9IGxpYmVydGFzX2Rpc2Nvbm5lY3RlZDsKKworCS8qCisJICogbWVtb3JpemUgdGhlIHByZXZpb3VzIFNTSUQgYW5kIEJTU0lECisJICogaXQgY291bGQgYmUgdXNlZCBmb3IgcmUtYXNzb2MKKwkgKi8KKwltZW1jcHkoJmFkYXB0ZXItPnByZXZpb3Vzc3NpZCwKKwkgICAgICAgJmFkYXB0ZXItPmN1cmJzc3BhcmFtcy5zc2lkLCBzaXplb2Yoc3RydWN0IFdMQU5fODAyXzExX1NTSUQpKTsKKwltZW1jcHkoYWRhcHRlci0+cHJldmlvdXNic3NpZCwKKwkgICAgICAgYWRhcHRlci0+Y3VyYnNzcGFyYW1zLmJzc2lkLCBFVEhfQUxFTik7CisKKwkvKiBuZWVkIHRvIGVyYXNlIHRoZSBjdXJyZW50IFNTSUQgYW5kIEJTU0lEIGluZm8gKi8KKwlhZGFwdGVyLT5wYXR0ZW1wdGVkYnNzZGVzYyA9IE5VTEw7CisJbWVtc2V0KCZhZGFwdGVyLT5jdXJic3NwYXJhbXMsIDAsIHNpemVvZihhZGFwdGVyLT5jdXJic3NwYXJhbXMpKTsKKworCWlmIChhZGFwdGVyLT5wc3N0YXRlICE9IFBTX1NUQVRFX0ZVTExfUE9XRVIpIHsKKwkJLyogbWFrZSBmaXJtd2FyZSB0byBleGl0IFBTIG1vZGUgKi8KKwkJbGJzX3ByX2RlYnVnKDEsICJEaXNjb25uZWN0ZWQsIHNvIGV4aXQgUFMgbW9kZS5cbiIpOworCQlsaWJlcnRhc19wc193YWtldXAocHJpdiwgMCk7CisJfQorfQorCisvKioKKyAqICBAYnJpZWYgVGhpcyBmdW5jdGlvbiBoYW5kbGVzIE1JQyBmYWlsdXJlIGV2ZW50LgorICoKKyAqICBAcGFyYW0gcHJpdiAgICBBIHBvaW50ZXIgdG8gd2xhbl9wcml2YXRlIHN0cnVjdHVyZQorICogIEBwYXJhICBldmVudCAgIHRoZSBldmVudCBpZAorICogIEByZXR1cm4gCSAgIG4vYQorICovCitzdGF0aWMgdm9pZCBoYW5kbGVfbWljX2ZhaWx1cmVldmVudCh3bGFuX3ByaXZhdGUgKiBwcml2LCB1MzIgZXZlbnQpCit7CisJY2hhciBidWZbNTBdOworCisJbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOworCisJc3ByaW50ZihidWYsICIlcyIsICJNTE1FLU1JQ0hBRUxNSUNGQUlMVVJFLmluZGljYXRpb24gIik7CisKKwlpZiAoZXZlbnQgPT0gTUFDUkVHX0lOVF9DT0RFX01JQ19FUlJfVU5JQ0FTVCkgeworCQlzdHJjYXQoYnVmLCAidW5pY2FzdCAiKTsKKwl9IGVsc2UgeworCQlzdHJjYXQoYnVmLCAibXVsdGljYXN0ICIpOworCX0KKworCWxpYmVydGFzX3NlbmRfaXdldmN1c3RvbV9ldmVudChwcml2LCBidWYpOworfQorCitzdGF0aWMgaW50IHdsYW5fcmV0X3JlZ19hY2Nlc3Mod2xhbl9wcml2YXRlICogcHJpdiwKKwkJCSAgICAgICB1MTYgdHlwZSwgc3RydWN0IGNtZF9kc19jb21tYW5kICpyZXNwKQoreworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisKKwlFTlRFUigpOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBjbWRfcmV0X21hY19yZWdfYWNjZXNzOgorCQl7CisJCQlzdHJ1Y3QgY21kX2RzX21hY19yZWdfYWNjZXNzICpyZWc7CisKKwkJCXJlZyA9CisJCQkgICAgKHN0cnVjdCBjbWRfZHNfbWFjX3JlZ19hY2Nlc3MgKikmcmVzcC0+cGFyYW1zLgorCQkJICAgIG1hY3JlZzsKKworCQkJYWRhcHRlci0+b2Zmc2V0dmFsdWUub2Zmc2V0ID0gcmVnLT5vZmZzZXQ7CisJCQlhZGFwdGVyLT5vZmZzZXR2YWx1ZS52YWx1ZSA9IHJlZy0+dmFsdWU7CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBjbWRfcmV0X2JicF9yZWdfYWNjZXNzOgorCQl7CisJCQlzdHJ1Y3QgY21kX2RzX2JicF9yZWdfYWNjZXNzICpyZWc7CisJCQlyZWcgPQorCQkJICAgIChzdHJ1Y3QgY21kX2RzX2JicF9yZWdfYWNjZXNzICopJnJlc3AtPnBhcmFtcy4KKwkJCSAgICBiYnByZWc7CisKKwkJCWFkYXB0ZXItPm9mZnNldHZhbHVlLm9mZnNldCA9IHJlZy0+b2Zmc2V0OworCQkJYWRhcHRlci0+b2Zmc2V0dmFsdWUudmFsdWUgPSByZWctPnZhbHVlOworCQkJYnJlYWs7CisJCX0KKworCWNhc2UgY21kX3JldF9yZl9yZWdfYWNjZXNzOgorCQl7CisJCQlzdHJ1Y3QgY21kX2RzX3JmX3JlZ19hY2Nlc3MgKnJlZzsKKwkJCXJlZyA9CisJCQkgICAgKHN0cnVjdCBjbWRfZHNfcmZfcmVnX2FjY2VzcyAqKSZyZXNwLT5wYXJhbXMuCisJCQkgICAgcmZyZWc7CisKKwkJCWFkYXB0ZXItPm9mZnNldHZhbHVlLm9mZnNldCA9IHJlZy0+b2Zmc2V0OworCQkJYWRhcHRlci0+b2Zmc2V0dmFsdWUudmFsdWUgPSByZWctPnZhbHVlOworCQkJYnJlYWs7CisJCX0KKworCWRlZmF1bHQ6CisJCUxFQVZFKCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlMRUFWRSgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdsYW5fcmV0X2dldF9od19zcGVjKHdsYW5fcHJpdmF0ZSAqIHByaXYsCisJCQkJc3RydWN0IGNtZF9kc19jb21tYW5kICpyZXNwKQoreworCXUzMiBpOworCXN0cnVjdCBjbWRfZHNfZ2V0X2h3X3NwZWMgKmh3c3BlYyA9ICZyZXNwLT5wYXJhbXMuaHdzcGVjOworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJaW50IHJldCA9IDA7CisKKwlFTlRFUigpOworCisJYWRhcHRlci0+ZndjYXBpbmZvID0gbGUzMl90b19jcHUoaHdzcGVjLT5md2NhcGluZm8pOworCisJYWRhcHRlci0+ZndyZWxlYXNlbnVtYmVyID0gaHdzcGVjLT5md3JlbGVhc2VudW1iZXI7CisKKwlsYnNfcHJfZGVidWcoMSwgIkdFVF9IV19TUEVDOiBGV1JlbGVhc2VWZXJzaW9uLSAweCVYXG4iLAorCSAgICAgICBhZGFwdGVyLT5md3JlbGVhc2VudW1iZXIpOworCWxic19wcl9kZWJ1ZygxLCAiR0VUX0hXX1NQRUM6IFBlcm1hbmVudCBhZGRyLSAlMng6JTJ4OiUyeDolMng6JTJ4OiUyeFxuIiwKKwkgICAgICAgaHdzcGVjLT5wZXJtYW5lbnRhZGRyWzBdLCBod3NwZWMtPnBlcm1hbmVudGFkZHJbMV0sCisJICAgICAgIGh3c3BlYy0+cGVybWFuZW50YWRkclsyXSwgaHdzcGVjLT5wZXJtYW5lbnRhZGRyWzNdLAorCSAgICAgICBod3NwZWMtPnBlcm1hbmVudGFkZHJbNF0sIGh3c3BlYy0+cGVybWFuZW50YWRkcls1XSk7CisJbGJzX3ByX2RlYnVnKDEsICJHRVRfSFdfU1BFQzogaHdpZnZlcnNpb249MHglWCAgdmVyc2lvbj0weCVYXG4iLAorCSAgICAgICBod3NwZWMtPmh3aWZ2ZXJzaW9uLCBod3NwZWMtPnZlcnNpb24pOworCisJYWRhcHRlci0+cmVnaW9uY29kZSA9IGxlMTZfdG9fY3B1KGh3c3BlYy0+cmVnaW9uY29kZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTVJWRFJWX01BWF9SRUdJT05fQ09ERTsgaSsrKSB7CisJCS8qIHVzZSB0aGUgcmVnaW9uIGNvZGUgdG8gc2VhcmNoIGZvciB0aGUgaW5kZXggKi8KKwkJaWYgKGFkYXB0ZXItPnJlZ2lvbmNvZGUgPT0gbGliZXJ0YXNfcmVnaW9uX2NvZGVfdG9faW5kZXhbaV0pIHsKKwkJCWFkYXB0ZXItPnJlZ2lvbnRhYmxlaW5kZXggPSAodTE2KSBpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBpZiBpdCdzIHVuaWRlbnRpZmllZCByZWdpb24gY29kZSwgdXNlIHRoZSBkZWZhdWx0IChVU0EpICovCisJaWYgKGkgPj0gTVJWRFJWX01BWF9SRUdJT05fQ09ERSkgeworCQlhZGFwdGVyLT5yZWdpb25jb2RlID0gMHgxMDsKKwkJYWRhcHRlci0+cmVnaW9udGFibGVpbmRleCA9IDA7CisJCWxic19wcl9pbmZvKAorCQkgICAgICAgInVuaWRlbnRpZmllZCByZWdpb24gY29kZSwgdXNlIHRoZSBkZWZhdWx0IChVU0EpXG4iKTsKKwl9CisKKwlpZiAoYWRhcHRlci0+Y3VycmVudF9hZGRyWzBdID09IDB4ZmYpIHsKKwkJbWVtbW92ZShhZGFwdGVyLT5jdXJyZW50X2FkZHIsIGh3c3BlYy0+cGVybWFuZW50YWRkciwKKwkJCUVUSF9BTEVOKTsKKwl9CisKKwltZW1jcHkocHJpdi0+d2xhbl9kZXYubmV0ZGV2LT5kZXZfYWRkciwgYWRhcHRlci0+Y3VycmVudF9hZGRyLCBFVEhfQUxFTik7CisJbWVtY3B5KHByaXYtPm1lc2hfZGV2LT5kZXZfYWRkciwgYWRhcHRlci0+Y3VycmVudF9hZGRyLCBFVEhfQUxFTik7CisKKwlpZiAobGliZXJ0YXNfc2V0X3JlZ2lvbnRhYmxlKHByaXYsIGFkYXB0ZXItPnJlZ2lvbmNvZGUsIDApKSB7CisJCXJldCA9IC0xOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKGxpYmVydGFzX3NldF91bml2ZXJzYWx0YWJsZShwcml2LCAwKSkgeworCQlyZXQgPSAtMTsKKwkJZ290byBkb25lOworCX0KKworICAgICAgZG9uZToKKwlMRUFWRSgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgd2xhbl9yZXRfODAyXzExX3NsZWVwX3BhcmFtcyh3bGFuX3ByaXZhdGUgKiBwcml2LAorCQkJCQlzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKnJlc3ApCit7CisJc3RydWN0IGNtZF9kc184MDJfMTFfc2xlZXBfcGFyYW1zICpzcCA9ICZyZXNwLT5wYXJhbXMuc2xlZXBfcGFyYW1zOworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisKKwlFTlRFUigpOworCisJbGJzX3ByX2RlYnVnKDEsICJlcnJvcj0leCBvZmZzZXQ9JXggc3RhYmxldGltZT0leCBjYWxjb250cm9sPSV4XG4iCisJICAgICAgICIgZXh0c2xlZXBjbGs9JXhcbiIsIHNwLT5lcnJvciwgc3AtPm9mZnNldCwKKwkgICAgICAgc3AtPnN0YWJsZXRpbWUsIHNwLT5jYWxjb250cm9sLCBzcC0+ZXh0ZXJuYWxzbGVlcGNsayk7CisJYWRhcHRlci0+c3Auc3BfZXJyb3IgPSBsZTE2X3RvX2NwdShzcC0+ZXJyb3IpOworCWFkYXB0ZXItPnNwLnNwX29mZnNldCA9IGxlMTZfdG9fY3B1KHNwLT5vZmZzZXQpOworCWFkYXB0ZXItPnNwLnNwX3N0YWJsZXRpbWUgPSBsZTE2X3RvX2NwdShzcC0+c3RhYmxldGltZSk7CisJYWRhcHRlci0+c3Auc3BfY2FsY29udHJvbCA9IGxlMTZfdG9fY3B1KHNwLT5jYWxjb250cm9sKTsKKwlhZGFwdGVyLT5zcC5zcF9leHRzbGVlcGNsayA9IGxlMTZfdG9fY3B1KHNwLT5leHRlcm5hbHNsZWVwY2xrKTsKKwlhZGFwdGVyLT5zcC5zcF9yZXNlcnZlZCA9IGxlMTZfdG9fY3B1KHNwLT5yZXNlcnZlZCk7CisKKwlMRUFWRSgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdsYW5fcmV0XzgwMl8xMV9zdGF0KHdsYW5fcHJpdmF0ZSAqIHByaXYsCisJCQkJc3RydWN0IGNtZF9kc19jb21tYW5kICpyZXNwKQoreworLyoJY3VycmVudGx5IGFkYXB0ZXItPndsYW44MDJfMTFTdGF0IGlzIHVudXNlZAorCisJc3RydWN0IGNtZF9kc184MDJfMTFfZ2V0X3N0YXQgKnAxMVN0YXQgPSAmcmVzcC0+cGFyYW1zLmdzdGF0OworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisKKwkvLyBUT0RPIENvbnZlcnQgaXQgdG8gQmlnIGVuZGlhbiBiZWZvciBjb3B5CisJbWVtY3B5KCZhZGFwdGVyLT53bGFuODAyXzExU3RhdCwKKwkgICAgICAgcDExU3RhdCwgc2l6ZW9mKHN0cnVjdCBjbWRfZHNfODAyXzExX2dldF9zdGF0KSk7CisqLworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdsYW5fcmV0XzgwMl8xMV9zbm1wX21pYih3bGFuX3ByaXZhdGUgKiBwcml2LAorCQkJCSAgICBzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKnJlc3ApCit7CisJc3RydWN0IGNtZF9kc184MDJfMTFfc25tcF9taWIgKnNtaWIgPSAmcmVzcC0+cGFyYW1zLnNtaWI7CisJdTE2IG9pZCA9IGxlMTZfdG9fY3B1KHNtaWItPm9pZCk7CisJdTE2IHF1ZXJ5dHlwZSA9IGxlMTZfdG9fY3B1KHNtaWItPnF1ZXJ5dHlwZSk7CisKKwlFTlRFUigpOworCisJbGJzX3ByX2RlYnVnKDEsICJTTk1QX1JFU1A6IHZhbHVlIG9mIHRoZSBvaWQgPSAleCwgcXVlcnl0eXBlPSV4XG4iLCBvaWQsCisJICAgICAgIHF1ZXJ5dHlwZSk7CisJbGJzX3ByX2RlYnVnKDEsICJTTk1QX1JFU1A6IEJ1ZiBzaXplICA9ICV4XG4iLAorCSAgICAgICBsZTE2X3RvX2NwdShzbWliLT5idWZzaXplKSk7CisKKwlpZiAocXVlcnl0eXBlID09IGNtZF9hY3RfZ2V0KSB7CisJCXN3aXRjaCAob2lkKSB7CisJCWNhc2UgZnJhZ3RocmVzaF9pOgorCQkJcHJpdi0+YWRhcHRlci0+ZnJhZ3Roc2QgPQorCQkJICAgIGxlMTZfdG9fY3B1KCoKKwkJCQkJICAgICAoKHVuc2lnbmVkIHNob3J0ICopKHNtaWItPnZhbHVlKSkpOworCQkJbGJzX3ByX2RlYnVnKDEsICJTTk1QX1JFU1A6IGZyYWd0aHNkID0ldVxuIiwKKwkJCSAgICAgICBwcml2LT5hZGFwdGVyLT5mcmFndGhzZCk7CisJCQlicmVhazsKKwkJY2FzZSBydHN0aHJlc2hfaToKKwkJCXByaXYtPmFkYXB0ZXItPnJ0c3Roc2QgPQorCQkJICAgIGxlMTZfdG9fY3B1KCoKKwkJCQkJICAgICAoKHVuc2lnbmVkIHNob3J0ICopKHNtaWItPnZhbHVlKSkpOworCQkJbGJzX3ByX2RlYnVnKDEsICJTTk1QX1JFU1A6IHJ0c3Roc2QgPSV1XG4iLAorCQkJICAgICAgIHByaXYtPmFkYXB0ZXItPnJ0c3Roc2QpOworCQkJYnJlYWs7CisJCWNhc2Ugc2hvcnRfcmV0cnlsaW1faToKKwkJCXByaXYtPmFkYXB0ZXItPnR4cmV0cnljb3VudCA9CisJCQkgICAgbGUxNl90b19jcHUoKgorCQkJCQkgICAgICgodW5zaWduZWQgc2hvcnQgKikoc21pYi0+dmFsdWUpKSk7CisJCQlsYnNfcHJfZGVidWcoMSwgIlNOTVBfUkVTUDogdHhyZXRyeWNvdW50ID0ldVxuIiwKKwkJCSAgICAgICBwcml2LT5hZGFwdGVyLT5ydHN0aHNkKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9CisKKwlMRUFWRSgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdsYW5fcmV0XzgwMl8xMV9rZXlfbWF0ZXJpYWwod2xhbl9wcml2YXRlICogcHJpdiwKKwkJCQkJc3RydWN0IGNtZF9kc19jb21tYW5kICpyZXNwKQoreworCXN0cnVjdCBjbWRfZHNfODAyXzExX2tleV9tYXRlcmlhbCAqcGtleW1hdGVyaWFsID0KKwkgICAgJnJlc3AtPnBhcmFtcy5rZXltYXRlcmlhbDsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCXUxNiBhY3Rpb24gPSBsZTE2X3RvX2NwdShwa2V5bWF0ZXJpYWwtPmFjdGlvbik7CisKKwlFTlRFUigpOworCisJLyogQ29weSB0aGUgcmV0dXJuZWQga2V5IHRvIGRyaXZlciBwcml2YXRlIGRhdGEgKi8KKwlpZiAoYWN0aW9uID09IGNtZF9hY3RfZ2V0KSB7CisJCXU4ICogYnVmX3B0ciA9ICh1OCAqKSAmcGtleW1hdGVyaWFsLT5rZXlQYXJhbVNldDsKKwkJdTggKiByZXNwX2VuZCA9ICh1OCAqKSAocmVzcCArIGxlMTZfdG9fY3B1KHJlc3AtPnNpemUpKTsKKworCQl3aGlsZSAoYnVmX3B0ciA8IHJlc3BfZW5kKSB7CisJCQlzdHJ1Y3QgTXJ2bElFdHlwZV9rZXlQYXJhbVNldCAqIHBrZXlwYXJhbXNldCA9CisJCQkgICAgKHN0cnVjdCBNcnZsSUV0eXBlX2tleVBhcmFtU2V0ICopIGJ1Zl9wdHI7CisJCQlzdHJ1Y3QgV0xBTl84MDJfMTFfS0VZICogcGtleTsKKwkJCXUxNiBrZXlfaW5mbyA9IGxlMTZfdG9fY3B1KHBrZXlwYXJhbXNldC0+a2V5aW5mbyk7CisJCQl1MTYgcGFyYW1fc2V0X2xlbiA9IGxlMTZfdG9fY3B1KHBrZXlwYXJhbXNldC0+bGVuZ3RoKTsKKwkJCXU4ICogZW5kOworCQkJdTE2IGtleV9sZW4gPSBsZTE2X3RvX2NwdShwa2V5cGFyYW1zZXQtPmtleWxlbik7CisKKwkJCWVuZCA9ICh1OCAqKSBwa2V5cGFyYW1zZXQgKyBzaXplb2YgKHBrZXlwYXJhbXNldC0+dHlwZSkKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzaXplb2YgKHBrZXlwYXJhbXNldC0+bGVuZ3RoKQorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICArIHBhcmFtX3NldF9sZW47CisJCQkvKiBNYWtlIHN1cmUgd2UgZG9uJ3QgYWNjZXNzIHBhc3QgdGhlIGVuZCBvZiB0aGUgSUVzICovCisJCQlpZiAoZW5kID4gcmVzcF9lbmQpCisJCQkJYnJlYWs7CisKKwkJCWlmIChrZXlfaW5mbyAmIEtFWV9JTkZPX1dQQV9VTklDQVNUKQorCQkJCXBrZXkgPSAmYWRhcHRlci0+d3BhX3VuaWNhc3Rfa2V5OworCQkJZWxzZSBpZiAoa2V5X2luZm8gJiBLRVlfSU5GT19XUEFfTUNBU1QpCisJCQkJcGtleSA9ICZhZGFwdGVyLT53cGFfbWNhc3Rfa2V5OworCQkJZWxzZQorCQkJCWJyZWFrOworCisJCQkvKiBDb3B5IHJldHVybmVkIGtleSBpbnRvIGRyaXZlciAqLworCQkJbWVtc2V0KHBrZXksIDAsIHNpemVvZihzdHJ1Y3QgV0xBTl84MDJfMTFfS0VZKSk7CisJCQlpZiAoa2V5X2xlbiA+IHNpemVvZihwa2V5LT5rZXkpKQorCQkJCWJyZWFrOworCQkJcGtleS0+dHlwZSA9IGxlMTZfdG9fY3B1KHBrZXlwYXJhbXNldC0+a2V5dHlwZWlkKTsKKwkJCXBrZXktPmZsYWdzID0gbGUxNl90b19jcHUocGtleXBhcmFtc2V0LT5rZXlpbmZvKTsKKwkJCXBrZXktPmxlbiA9IGxlMTZfdG9fY3B1KHBrZXlwYXJhbXNldC0+a2V5bGVuKTsKKwkJCW1lbWNweShwa2V5LT5rZXksIHBrZXlwYXJhbXNldC0+a2V5LCBwa2V5LT5sZW4pOworCisJCQlidWZfcHRyID0gZW5kICsgMTsKKwkJfQorCX0KKworCUxFQVZFKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2xhbl9yZXRfODAyXzExX21hY19hZGRyZXNzKHdsYW5fcHJpdmF0ZSAqIHByaXYsCisJCQkJICAgICAgIHN0cnVjdCBjbWRfZHNfY29tbWFuZCAqcmVzcCkKK3sKKwlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9tYWNfYWRkcmVzcyAqbWFjYWRkID0gJnJlc3AtPnBhcmFtcy5tYWNhZGQ7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKworCUVOVEVSKCk7CisKKwltZW1jcHkoYWRhcHRlci0+Y3VycmVudF9hZGRyLCBtYWNhZGQtPm1hY2FkZCwgRVRIX0FMRU4pOworCisJTEVBVkUoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bGFuX3JldF84MDJfMTFfcmZfdHhfcG93ZXIod2xhbl9wcml2YXRlICogcHJpdiwKKwkJCQkgICAgICAgc3RydWN0IGNtZF9kc19jb21tYW5kICpyZXNwKQoreworCXN0cnVjdCBjbWRfZHNfODAyXzExX3JmX3R4X3Bvd2VyICpydHAgPSAmcmVzcC0+cGFyYW1zLnR4cDsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCisJRU5URVIoKTsKKworCWFkYXB0ZXItPnR4cG93ZXJsZXZlbCA9IGxlMTZfdG9fY3B1KHJ0cC0+Y3VycmVudGxldmVsKTsKKworCWxic19wcl9kZWJ1ZygxLCAiQ3VycmVudCBUeFBvd2VyIExldmVsID0gJWRcbiIsIGFkYXB0ZXItPnR4cG93ZXJsZXZlbCk7CisKKwlMRUFWRSgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdsYW5fcmV0XzgwMl8xMV9yZl9hbnRlbm5hKHdsYW5fcHJpdmF0ZSAqIHByaXYsCisJCQkJICAgICAgc3RydWN0IGNtZF9kc19jb21tYW5kICpyZXNwKQoreworCXN0cnVjdCBjbWRfZHNfODAyXzExX3JmX2FudGVubmEgKnBBbnRlbm5hID0gJnJlc3AtPnBhcmFtcy5yYW50OworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJdTE2IGFjdGlvbiA9IGxlMTZfdG9fY3B1KHBBbnRlbm5hLT5hY3Rpb24pOworCisJaWYgKGFjdGlvbiA9PSBjbWRfYWN0X2dldF9yeCkKKwkJYWRhcHRlci0+cnhhbnRlbm5hbW9kZSA9CisJCSAgICBsZTE2X3RvX2NwdShwQW50ZW5uYS0+YW50ZW5uYW1vZGUpOworCisJaWYgKGFjdGlvbiA9PSBjbWRfYWN0X2dldF90eCkKKwkJYWRhcHRlci0+dHhhbnRlbm5hbW9kZSA9CisJCSAgICBsZTE2X3RvX2NwdShwQW50ZW5uYS0+YW50ZW5uYW1vZGUpOworCisJbGJzX3ByX2RlYnVnKDEsICJSRl9BTlRfUkVTUDogYWN0aW9uID0gMHgleCwgbW9kZSA9IDB4JTA0eFxuIiwKKwkgICAgICAgYWN0aW9uLCBsZTE2X3RvX2NwdShwQW50ZW5uYS0+YW50ZW5uYW1vZGUpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdsYW5fcmV0XzgwMl8xMV9yYXRlX2FkYXB0X3JhdGVzZXQod2xhbl9wcml2YXRlICogcHJpdiwKKwkJCQkJICAgICAgc3RydWN0IGNtZF9kc19jb21tYW5kICpyZXNwKQoreworCXN0cnVjdCBjbWRfZHNfODAyXzExX3JhdGVfYWRhcHRfcmF0ZXNldCAqcmF0ZXMgPQorCSAgICAmcmVzcC0+cGFyYW1zLnJhdGVzZXQ7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKworCUVOVEVSKCk7CisKKwlpZiAocmF0ZXMtPmFjdGlvbiA9PSBjbWRfYWN0X2dldCkgeworCQlhZGFwdGVyLT5lbmFibGVod2F1dG8gPSByYXRlcy0+ZW5hYmxlaHdhdXRvOworCQlhZGFwdGVyLT5yYXRlYml0bWFwID0gcmF0ZXMtPmJpdG1hcDsKKwl9CisKKwlMRUFWRSgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2xhbl9yZXRfODAyXzExX2RhdGFfcmF0ZSh3bGFuX3ByaXZhdGUgKiBwcml2LAorCQkJCSAgICAgc3RydWN0IGNtZF9kc19jb21tYW5kICpyZXNwKQoreworCXN0cnVjdCBjbWRfZHNfODAyXzExX2RhdGFfcmF0ZSAqcGRhdGFyYXRlID0gJnJlc3AtPnBhcmFtcy5kcmF0ZTsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCXU4IGRvdDExZGF0YXJhdGU7CisKKwlFTlRFUigpOworCisJbGJzX2RiZ19oZXgoIkRBVEFfUkFURV9SRVNQOiBkYXRhX3JhdGUtICIsCisJCSh1OCAqKSBwZGF0YXJhdGUsIHNpemVvZihzdHJ1Y3QgY21kX2RzXzgwMl8xMV9kYXRhX3JhdGUpKTsKKworCWRvdDExZGF0YXJhdGUgPSBwZGF0YXJhdGUtPmRhdGFyYXRlWzBdOworCWlmIChwZGF0YXJhdGUtPmFjdGlvbiA9PSBjbWRfYWN0X2dldF90eF9yYXRlKSB7CisJCW1lbWNweShhZGFwdGVyLT5saWJlcnRhc19zdXBwb3J0ZWRfcmF0ZXMsIHBkYXRhcmF0ZS0+ZGF0YXJhdGUsCisJCSAgICAgICBzaXplb2YoYWRhcHRlci0+bGliZXJ0YXNfc3VwcG9ydGVkX3JhdGVzKSk7CisJfQorCWFkYXB0ZXItPmRhdGFyYXRlID0gbGliZXJ0YXNfaW5kZXhfdG9fZGF0YV9yYXRlKGRvdDExZGF0YXJhdGUpOworCisJTEVBVkUoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bGFuX3JldF84MDJfMTFfcmZfY2hhbm5lbCh3bGFuX3ByaXZhdGUgKiBwcml2LAorCQkJCSAgICAgIHN0cnVjdCBjbWRfZHNfY29tbWFuZCAqcmVzcCkKK3sKKwlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9yZl9jaGFubmVsICpyZmNoYW5uZWwgPQorCSAgICAmcmVzcC0+cGFyYW1zLnJmY2hhbm5lbDsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCXUxNiBhY3Rpb24gPSBsZTE2X3RvX2NwdShyZmNoYW5uZWwtPmFjdGlvbik7CisJdTE2IG5ld2NoYW5uZWwgPSBsZTE2X3RvX2NwdShyZmNoYW5uZWwtPmN1cnJlbnRjaGFubmVsKTsKKworCUVOVEVSKCk7CisKKwlpZiAoYWN0aW9uID09IGNtZF9vcHRfODAyXzExX3JmX2NoYW5uZWxfZ2V0CisJICAgICYmIGFkYXB0ZXItPmN1cmJzc3BhcmFtcy5jaGFubmVsICE9IG5ld2NoYW5uZWwpIHsKKwkJbGJzX3ByX2RlYnVnKDEsICJjaGFubmVsIFN3aXRjaDogJWQgdG8gJWRcbiIsCisJCSAgICAgICBhZGFwdGVyLT5jdXJic3NwYXJhbXMuY2hhbm5lbCwgbmV3Y2hhbm5lbCk7CisKKwkJLyogVXBkYXRlIHRoZSBjaGFubmVsIGFnYWluICovCisJCWFkYXB0ZXItPmN1cmJzc3BhcmFtcy5jaGFubmVsID0gbmV3Y2hhbm5lbDsKKwl9CisKKwlMRUFWRSgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdsYW5fcmV0XzgwMl8xMV9yc3NpKHdsYW5fcHJpdmF0ZSAqIHByaXYsCisJCQkJc3RydWN0IGNtZF9kc19jb21tYW5kICpyZXNwKQoreworCXN0cnVjdCBjbWRfZHNfODAyXzExX3Jzc2lfcnNwICpyc3NpcnNwID0gJnJlc3AtPnBhcmFtcy5yc3NpcnNwOworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisKKwkvKiBzdG9yZSB0aGUgbm9uIGF2ZXJhZ2UgdmFsdWUgKi8KKwlhZGFwdGVyLT5TTlJbVFlQRV9CRUFDT05dW1RZUEVfTk9BVkddID0gbGUxNl90b19jcHUocnNzaXJzcC0+U05SKTsKKwlhZGFwdGVyLT5ORltUWVBFX0JFQUNPTl1bVFlQRV9OT0FWR10gPQorCSAgICBsZTE2X3RvX2NwdShyc3NpcnNwLT5ub2lzZWZsb29yKTsKKworCWFkYXB0ZXItPlNOUltUWVBFX0JFQUNPTl1bVFlQRV9BVkddID0gbGUxNl90b19jcHUocnNzaXJzcC0+YXZnU05SKTsKKwlhZGFwdGVyLT5ORltUWVBFX0JFQUNPTl1bVFlQRV9BVkddID0KKwkgICAgbGUxNl90b19jcHUocnNzaXJzcC0+YXZnbm9pc2VmbG9vcik7CisKKwlhZGFwdGVyLT5SU1NJW1RZUEVfQkVBQ09OXVtUWVBFX05PQVZHXSA9CisJICAgIENBTF9SU1NJKGFkYXB0ZXItPlNOUltUWVBFX0JFQUNPTl1bVFlQRV9OT0FWR10sCisJCSAgICAgYWRhcHRlci0+TkZbVFlQRV9CRUFDT05dW1RZUEVfTk9BVkddKTsKKworCWFkYXB0ZXItPlJTU0lbVFlQRV9CRUFDT05dW1RZUEVfQVZHXSA9CisJICAgIENBTF9SU1NJKGFkYXB0ZXItPlNOUltUWVBFX0JFQUNPTl1bVFlQRV9BVkddIC8gQVZHX1NDQUxFLAorCQkgICAgIGFkYXB0ZXItPk5GW1RZUEVfQkVBQ09OXVtUWVBFX0FWR10gLyBBVkdfU0NBTEUpOworCisJbGJzX3ByX2RlYnVnKDEsICJCZWFjb24gUlNTSSB2YWx1ZSA9IDB4JXhcbiIsCisJICAgICAgIGFkYXB0ZXItPlJTU0lbVFlQRV9CRUFDT05dW1RZUEVfQVZHXSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bGFuX3JldF84MDJfMTFfZWVwcm9tX2FjY2Vzcyh3bGFuX3ByaXZhdGUgKiBwcml2LAorCQkJCSAgc3RydWN0IGNtZF9kc19jb21tYW5kICpyZXNwKQoreworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJc3RydWN0IHdsYW5faW9jdGxfcmVncmR3ciAqcGJ1ZjsKKwlwYnVmID0gKHN0cnVjdCB3bGFuX2lvY3RsX3JlZ3Jkd3IgKikgYWRhcHRlci0+cHJkZWVwcm9tOworCisJbGJzX3ByX2RlYnVnKDEsICJlZXByb20gcmVhZCBsZW49JXhcbiIsCisJICAgICAgIGxlMTZfdG9fY3B1KHJlc3AtPnBhcmFtcy5yZGVlcHJvbS5ieXRlY291bnQpKTsKKwlpZiAocGJ1Zi0+Tk9CIDwgbGUxNl90b19jcHUocmVzcC0+cGFyYW1zLnJkZWVwcm9tLmJ5dGVjb3VudCkpIHsKKwkJcGJ1Zi0+Tk9CID0gMDsKKwkJbGJzX3ByX2RlYnVnKDEsICJlZXByb20gcmVhZCByZXR1cm4gbGVuZ3RoIGlzIHRvbyBiaWdcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCXBidWYtPk5PQiA9IGxlMTZfdG9fY3B1KHJlc3AtPnBhcmFtcy5yZGVlcHJvbS5ieXRlY291bnQpOworCWlmIChwYnVmLT5OT0IgPiAwKSB7CisKKwkJbWVtY3B5KCZwYnVmLT52YWx1ZSwgKHU4ICopICYgcmVzcC0+cGFyYW1zLnJkZWVwcm9tLnZhbHVlLAorCQkgICAgICAgbGUxNl90b19jcHUocmVzcC0+cGFyYW1zLnJkZWVwcm9tLmJ5dGVjb3VudCkpOworCQlsYnNfZGJnX2hleCgiYWRhcHRlciIsIChjaGFyICopJnBidWYtPnZhbHVlLAorCQkJbGUxNl90b19jcHUocmVzcC0+cGFyYW1zLnJkZWVwcm9tLmJ5dGVjb3VudCkpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bGFuX3JldF9nZXRfbG9nKHdsYW5fcHJpdmF0ZSAqIHByaXYsCisJCQkgICAgc3RydWN0IGNtZF9kc19jb21tYW5kICpyZXNwKQoreworCXN0cnVjdCBjbWRfZHNfODAyXzExX2dldF9sb2cgKmxvZ21lc3NhZ2UgPQorCSAgICAoc3RydWN0IGNtZF9kc184MDJfMTFfZ2V0X2xvZyAqKSZyZXNwLT5wYXJhbXMuZ2xvZzsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCisJRU5URVIoKTsKKworCS8qIFRPRE8gQ29udmVydCBpdCB0byBCaWcgRW5kaWFuIGJlZm9yZSBjb3B5ICovCisJbWVtY3B5KCZhZGFwdGVyLT5sb2dtc2csIGxvZ21lc3NhZ2UsCisJICAgICAgIHNpemVvZihzdHJ1Y3QgY21kX2RzXzgwMl8xMV9nZXRfbG9nKSk7CisKKwlMRUFWRSgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBoYW5kbGVfY21kX3Jlc3BvbnNlKHUxNiByZXNwY21kLAorCQkJCSAgICAgIHN0cnVjdCBjbWRfZHNfY29tbWFuZCAqcmVzcCwKKwkJCQkgICAgICB3bGFuX3ByaXZhdGUgKnByaXYpCit7CisJaW50IHJldCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCisJc3dpdGNoIChyZXNwY21kKSB7CisJY2FzZSBjbWRfcmV0X21hY19yZWdfYWNjZXNzOgorCWNhc2UgY21kX3JldF9iYnBfcmVnX2FjY2VzczoKKwljYXNlIGNtZF9yZXRfcmZfcmVnX2FjY2VzczoKKwkJcmV0ID0gd2xhbl9yZXRfcmVnX2FjY2Vzcyhwcml2LCByZXNwY21kLCByZXNwKTsKKwkJYnJlYWs7CisKKwljYXNlIGNtZF9yZXRfaHdfc3BlY19pbmZvOgorCQlyZXQgPSB3bGFuX3JldF9nZXRfaHdfc3BlYyhwcml2LCByZXNwKTsKKwkJYnJlYWs7CisKKwljYXNlIGNtZF9yZXRfODAyXzExX3NjYW46CisJCXJldCA9IGxpYmVydGFzX3JldF84MDIxMV9zY2FuKHByaXYsIHJlc3ApOworCQlicmVhazsKKworCWNhc2UgY21kX3JldF84MDJfMTFfZ2V0X2xvZzoKKwkJcmV0ID0gd2xhbl9yZXRfZ2V0X2xvZyhwcml2LCByZXNwKTsKKwkJYnJlYWs7CisKKwljYXNlIGNtZF9yZXRfODAyXzExX2Fzc29jaWF0ZToKKwljYXNlIGNtZF9yZXRfODAyXzExX3JlYXNzb2NpYXRlOgorCQlyZXQgPSBsaWJlcnRhc19yZXRfODAyMTFfYXNzb2NpYXRlKHByaXYsIHJlc3ApOworCQlicmVhazsKKworCWNhc2UgY21kX3JldF84MDJfMTFfZGlzYXNzb2NpYXRlOgorCWNhc2UgY21kX3JldF84MDJfMTFfZGVhdXRoZW50aWNhdGU6CisJCXJldCA9IGxpYmVydGFzX3JldF84MDIxMV9kaXNhc3NvY2lhdGUocHJpdiwgcmVzcCk7CisJCWJyZWFrOworCisJY2FzZSBjbWRfcmV0XzgwMl8xMV9hZF9ob2Nfc3RhcnQ6CisJY2FzZSBjbWRfcmV0XzgwMl8xMV9hZF9ob2Nfam9pbjoKKwkJcmV0ID0gbGliZXJ0YXNfcmV0XzgwMjExX2FkX2hvY19zdGFydChwcml2LCByZXNwKTsKKwkJYnJlYWs7CisKKwljYXNlIGNtZF9yZXRfODAyXzExX3N0YXQ6CisJCXJldCA9IHdsYW5fcmV0XzgwMl8xMV9zdGF0KHByaXYsIHJlc3ApOworCQlicmVhazsKKworCWNhc2UgY21kX3JldF84MDJfMTFfc25tcF9taWI6CisJCXJldCA9IHdsYW5fcmV0XzgwMl8xMV9zbm1wX21pYihwcml2LCByZXNwKTsKKwkJYnJlYWs7CisKKwljYXNlIGNtZF9yZXRfODAyXzExX3JmX3R4X3Bvd2VyOgorCQlyZXQgPSB3bGFuX3JldF84MDJfMTFfcmZfdHhfcG93ZXIocHJpdiwgcmVzcCk7CisJCWJyZWFrOworCisJY2FzZSBjbWRfcmV0XzgwMl8xMV9zZXRfYWZjOgorCWNhc2UgY21kX3JldF84MDJfMTFfZ2V0X2FmYzoKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPmRyaXZlcl9sb2NrLCBmbGFncyk7CisJCW1lbW1vdmUoYWRhcHRlci0+Y3VyX2NtZC0+cGRhdGFfYnVmLAorCQkJJnJlc3AtPnBhcmFtcy5hZmMsCisJCQlzaXplb2Yoc3RydWN0IGNtZF9kc184MDJfMTFfYWZjKSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPmRyaXZlcl9sb2NrLCBmbGFncyk7CisKKwkJYnJlYWs7CisJY2FzZSBjbWRfcmV0XzgwMl8xMV9yZl9hbnRlbm5hOgorCQlyZXQgPSB3bGFuX3JldF84MDJfMTFfcmZfYW50ZW5uYShwcml2LCByZXNwKTsKKwkJYnJlYWs7CisKKwljYXNlIGNtZF9yZXRfbWFjX211bHRpY2FzdF9hZHI6CisJY2FzZSBjbWRfcmV0X21hY19jb250cm9sOgorCWNhc2UgY21kX3JldF84MDJfMTFfc2V0X3dlcDoKKwljYXNlIGNtZF9yZXRfODAyXzExX3Jlc2V0OgorCWNhc2UgY21kX3JldF84MDJfMTFfYXV0aGVudGljYXRlOgorCWNhc2UgY21kX3JldF84MDJfMTFfcmFkaW9fY29udHJvbDoKKwljYXNlIGNtZF9yZXRfODAyXzExX2JlYWNvbl9zdG9wOgorCWNhc2UgY21kX3JldF84MDJfMTFfZW5hYmxlX3JzbjoKKwkJYnJlYWs7CisKKwljYXNlIGNtZF9yZXRfODAyXzExX2RhdGFfcmF0ZToKKwkJcmV0ID0gd2xhbl9yZXRfODAyXzExX2RhdGFfcmF0ZShwcml2LCByZXNwKTsKKwkJYnJlYWs7CisJY2FzZSBjbWRfcmV0XzgwMl8xMV9yYXRlX2FkYXB0X3JhdGVzZXQ6CisJCXJldCA9IHdsYW5fcmV0XzgwMl8xMV9yYXRlX2FkYXB0X3JhdGVzZXQocHJpdiwgcmVzcCk7CisJCWJyZWFrOworCWNhc2UgY21kX3JldF84MDJfMTFfcmZfY2hhbm5lbDoKKwkJcmV0ID0gd2xhbl9yZXRfODAyXzExX3JmX2NoYW5uZWwocHJpdiwgcmVzcCk7CisJCWJyZWFrOworCisJY2FzZSBjbWRfcmV0XzgwMl8xMV9yc3NpOgorCQlyZXQgPSB3bGFuX3JldF84MDJfMTFfcnNzaShwcml2LCByZXNwKTsKKwkJYnJlYWs7CisKKwljYXNlIGNtZF9yZXRfODAyXzExX21hY19hZGRyZXNzOgorCQlyZXQgPSB3bGFuX3JldF84MDJfMTFfbWFjX2FkZHJlc3MocHJpdiwgcmVzcCk7CisJCWJyZWFrOworCisJY2FzZSBjbWRfcmV0XzgwMl8xMV9hZF9ob2Nfc3RvcDoKKwkJcmV0ID0gbGliZXJ0YXNfcmV0XzgwMjExX2FkX2hvY19zdG9wKHByaXYsIHJlc3ApOworCQlicmVhazsKKworCWNhc2UgY21kX3JldF84MDJfMTFfa2V5X21hdGVyaWFsOgorCQlsYnNfcHJfZGVidWcoMSwgIkNNRF9SRVNQOiBLRVlfTUFURVJJQUwgY29tbWFuZCByZXNwb25zZVxuIik7CisJCXJldCA9IHdsYW5fcmV0XzgwMl8xMV9rZXlfbWF0ZXJpYWwocHJpdiwgcmVzcCk7CisJCWJyZWFrOworCisJY2FzZSBjbWRfcmV0XzgwMl8xMV9lZXByb21fYWNjZXNzOgorCQlyZXQgPSB3bGFuX3JldF84MDJfMTFfZWVwcm9tX2FjY2Vzcyhwcml2LCByZXNwKTsKKwkJYnJlYWs7CisKKwljYXNlIGNtZF9yZXRfODAyXzExZF9kb21haW5faW5mbzoKKwkJcmV0ID0gbGliZXJ0YXNfcmV0XzgwMl8xMWRfZG9tYWluX2luZm8ocHJpdiwgcmVzcCk7CisJCWJyZWFrOworCisJY2FzZSBjbWRfcmV0XzgwMl8xMV9zbGVlcF9wYXJhbXM6CisJCXJldCA9IHdsYW5fcmV0XzgwMl8xMV9zbGVlcF9wYXJhbXMocHJpdiwgcmVzcCk7CisJCWJyZWFrOworCWNhc2UgY21kX3JldF84MDJfMTFfaW5hY3Rpdml0eV90aW1lb3V0OgorCQlzcGluX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKKwkJKigodTE2ICopIGFkYXB0ZXItPmN1cl9jbWQtPnBkYXRhX2J1ZikgPQorCQkgICAgbGUxNl90b19jcHUocmVzcC0+cGFyYW1zLmluYWN0aXZpdHlfdGltZW91dC50aW1lb3V0KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKKwkJYnJlYWs7CisKKwljYXNlIGNtZF9yZXRfODAyXzExX3RwY19jZmc6CisJCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5kcml2ZXJfbG9jaywgZmxhZ3MpOworCQltZW1tb3ZlKGFkYXB0ZXItPmN1cl9jbWQtPnBkYXRhX2J1ZiwKKwkJCSZyZXNwLT5wYXJhbXMudHBjY2ZnLAorCQkJc2l6ZW9mKHN0cnVjdCBjbWRfZHNfODAyXzExX3RwY19jZmcpKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKKwkJYnJlYWs7CisJY2FzZSBjbWRfcmV0XzgwMl8xMV9sZWRfZ3Bpb19jdHJsOgorCQlzcGluX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKKwkJbWVtbW92ZShhZGFwdGVyLT5jdXJfY21kLT5wZGF0YV9idWYsCisJCQkmcmVzcC0+cGFyYW1zLmxlZGdwaW8sCisJCQlzaXplb2Yoc3RydWN0IGNtZF9kc184MDJfMTFfbGVkX2N0cmwpKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKKwkJYnJlYWs7CisJY2FzZSBjbWRfcmV0XzgwMl8xMV9wd3JfY2ZnOgorCQlzcGluX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKKwkJbWVtbW92ZShhZGFwdGVyLT5jdXJfY21kLT5wZGF0YV9idWYsCisJCQkmcmVzcC0+cGFyYW1zLnB3cmNmZywKKwkJCXNpemVvZihzdHJ1Y3QgY21kX2RzXzgwMl8xMV9wd3JfY2ZnKSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPmRyaXZlcl9sb2NrLCBmbGFncyk7CisKKwkJYnJlYWs7CisKKwljYXNlIGNtZF9yZXRfZ2V0X3RzZjoKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPmRyaXZlcl9sb2NrLCBmbGFncyk7CisJCW1lbWNweShwcml2LT5hZGFwdGVyLT5jdXJfY21kLT5wZGF0YV9idWYsCisJCSAgICAgICAmcmVzcC0+cGFyYW1zLmdldHRzZi50c2Z2YWx1ZSwgc2l6ZW9mKHU2NCkpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5kcml2ZXJfbG9jaywgZmxhZ3MpOworCQlicmVhazsKKwljYXNlIGNtZF9yZXRfYnRfYWNjZXNzOgorCQlzcGluX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKKwkJaWYgKGFkYXB0ZXItPmN1cl9jbWQtPnBkYXRhX2J1ZikKKwkJCW1lbWNweShhZGFwdGVyLT5jdXJfY21kLT5wZGF0YV9idWYsCisJCQkgICAgICAgJnJlc3AtPnBhcmFtcy5idC5hZGRyMSwgMiAqIEVUSF9BTEVOKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKKwkJYnJlYWs7CisJY2FzZSBjbWRfcmV0X2Z3dF9hY2Nlc3M6CisJCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5kcml2ZXJfbG9jaywgZmxhZ3MpOworCQlpZiAoYWRhcHRlci0+Y3VyX2NtZC0+cGRhdGFfYnVmKQorCQkJbWVtY3B5KGFkYXB0ZXItPmN1cl9jbWQtPnBkYXRhX2J1ZiwKKwkJCSAgICAgICAmcmVzcC0+cGFyYW1zLmZ3dCwKKwkJCQlzaXplb2YocmVzcC0+cGFyYW1zLmZ3dCkpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5kcml2ZXJfbG9jaywgZmxhZ3MpOworCQlicmVhazsKKwljYXNlIGNtZF9yZXRfbWVzaF9hY2Nlc3M6CisJCWlmIChhZGFwdGVyLT5jdXJfY21kLT5wZGF0YV9idWYpCisJCQltZW1jcHkoYWRhcHRlci0+Y3VyX2NtZC0+cGRhdGFfYnVmLAorCQkJICAgICAgICZyZXNwLT5wYXJhbXMubWVzaCwKKwkJCSAgICAgICBzaXplb2YocmVzcC0+cGFyYW1zLm1lc2gpKTsKKwkJYnJlYWs7CisJY2FzZSBjbWRfcnRlXzgwMl8xMV90eF9yYXRlX3F1ZXJ5OgorCQlwcml2LT5hZGFwdGVyLT50eHJhdGUgPSByZXNwLT5wYXJhbXMudHhyYXRlLnR4cmF0ZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbGJzX3ByX2RlYnVnKDEsICJDTURfUkVTUDogVW5rbm93biBjb21tYW5kIHJlc3BvbnNlICUjeFxuIiwKKwkJICAgICAgIHJlc3AtPmNvbW1hbmQpOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KKworaW50IGxpYmVydGFzX3Byb2Nlc3NfcnhfY29tbWFuZCh3bGFuX3ByaXZhdGUgKiBwcml2KQoreworCXUxNiByZXNwY21kOworCXN0cnVjdCBjbWRfZHNfY29tbWFuZCAqcmVzcDsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCWludCByZXQgPSAwOworCXVsb25nIGZsYWdzOworCXUxNiByZXN1bHQ7CisKKwlFTlRFUigpOworCisJbGJzX3ByX2RlYnVnKDEsICJDTURfUkVTUDogQCAlbHVcbiIsIGppZmZpZXMpOworCisJLyogTm93IHdlIGdvdCByZXNwb25zZSBmcm9tIEZXLCBjYW5jZWwgdGhlIGNvbW1hbmQgdGltZXIgKi8KKwlkZWxfdGltZXIoJmFkYXB0ZXItPmNvbW1hbmRfdGltZXIpOworCisJbXV0ZXhfbG9jaygmYWRhcHRlci0+bG9jayk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPmRyaXZlcl9sb2NrLCBmbGFncyk7CisKKwlpZiAoIWFkYXB0ZXItPmN1cl9jbWQpIHsKKwkJbGJzX3ByX2RlYnVnKDEsICJDTURfUkVTUDogTlVMTCBjdXJfY21kPSVwXG4iLCBhZGFwdGVyLT5jdXJfY21kKTsKKwkJcmV0ID0gLTE7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPmRyaXZlcl9sb2NrLCBmbGFncyk7CisJCWdvdG8gZG9uZTsKKwl9CisJcmVzcCA9IChzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKikoYWRhcHRlci0+Y3VyX2NtZC0+YnVmdmlydHVhbGFkZHIpOworCisJbGJzX2RiZ19oZXgoIkNNRF9SRVNQOiIsIGFkYXB0ZXItPmN1cl9jbWQtPmJ1ZnZpcnR1YWxhZGRyLAorCQlwcml2LT53bGFuX2Rldi51cGxkX2xlbik7CisKKwlyZXNwY21kID0gbGUxNl90b19jcHUocmVzcC0+Y29tbWFuZCk7CisKKwlyZXN1bHQgPSBsZTE2X3RvX2NwdShyZXNwLT5yZXN1bHQpOworCisJbGJzX3ByX2RlYnVnKDEsICJDTURfUkVTUDogJXggcmVzdWx0OiAlZCBsZW5ndGg6ICVkXG4iLCByZXNwY21kLAorCSAgICAgICByZXN1bHQsIHByaXYtPndsYW5fZGV2LnVwbGRfbGVuKTsKKworCWlmICghKHJlc3BjbWQgJiAweDgwMDApKSB7CisJCWxic19wcl9kZWJ1ZygxLCAiSW52YWxpZCByZXNwb25zZSB0byBjb21tYW5kISIpOworCQlhZGFwdGVyLT5jdXJfY21kX3JldGNvZGUgPSAtMTsKKwkJX19saWJlcnRhc19jbGVhbnVwX2FuZF9pbnNlcnRfY21kKHByaXYsIGFkYXB0ZXItPmN1cl9jbWQpOworCQlhZGFwdGVyLT5ucl9jbWRfcGVuZGluZy0tOworCQlhZGFwdGVyLT5jdXJfY21kID0gTlVMTDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKKwkJcmV0ID0gLTE7CisJCWdvdG8gZG9uZTsKKwl9CisKKwkvKiBTdG9yZSB0aGUgcmVzcG9uc2UgY29kZSB0byBjdXJfY21kX3JldGNvZGUuICovCisJYWRhcHRlci0+Y3VyX2NtZF9yZXRjb2RlID0gbGUxNl90b19jcHUocmVzcC0+cmVzdWx0KTsKKworCWlmIChyZXNwY21kID09IGNtZF9yZXRfODAyXzExX3BzX21vZGUpIHsKKwkJc3RydWN0IGNtZF9kc184MDJfMTFfcHNfbW9kZSAqcHNtb2RlOworCisJCXBzbW9kZSA9ICZyZXNwLT5wYXJhbXMucHNtb2RlOworCQlsYnNfcHJfZGVidWcoMSwKKwkJICAgICAgICJDTURfUkVTUDogUFNfTU9ERSBjbWQgcmVwbHkgcmVzdWx0PSUjeCBhY3Rpb249MHglWFxuIiwKKwkJICAgICAgIHJlc3AtPnJlc3VsdCwgcHNtb2RlLT5hY3Rpb24pOworCQlwc21vZGUtPmFjdGlvbiA9IGNwdV90b19sZTE2KHBzbW9kZS0+YWN0aW9uKTsKKworCQlpZiAocmVzdWx0KSB7CisJCQlsYnNfcHJfZGVidWcoMSwgIkNNRF9SRVNQOiBQUyBjb21tYW5kIGZhaWxlZC0gJSN4IFxuIiwKKwkJCSAgICAgICByZXNwLT5yZXN1bHQpOworCQkJaWYgKGFkYXB0ZXItPmluZnJhbW9kZSA9PSB3bGFuODAyXzExaWJzcykgeworCQkJCS8qCisJCQkJICogV2Ugc2hvdWxkIG5vdCByZS10cnkgZW50ZXItcHMgY29tbWFuZCBpbgorCQkJCSAqIGFkLWhvYyBtb2RlLiBJdCB0YWtlcyBwbGFjZSBpbgorCQkJCSAqIGxpYmVydGFzX2V4ZWN1dGVfbmV4dF9jb21tYW5kKCkuCisJCQkJICovCisJCQkJaWYgKHBzbW9kZS0+YWN0aW9uID09IGNtZF9zdWJjbWRfZW50ZXJfcHMpCisJCQkJCWFkYXB0ZXItPnBzbW9kZSA9CisJCQkJCSAgICB3bGFuODAyXzExcG93ZXJtb2RlY2FtOworCQkJfQorCQl9IGVsc2UgaWYgKHBzbW9kZS0+YWN0aW9uID09IGNtZF9zdWJjbWRfZW50ZXJfcHMpIHsKKwkJCWFkYXB0ZXItPm5lZWR0b3dha2V1cCA9IDA7CisJCQlhZGFwdGVyLT5wc3N0YXRlID0gUFNfU1RBVEVfQVdBS0U7CisKKwkJCWxic19wcl9kZWJ1ZygxLCAiQ01EX1JFU1A6IEVudGVyX1BTIGNvbW1hbmQgcmVzcG9uc2VcbiIpOworCQkJaWYgKGFkYXB0ZXItPmNvbm5lY3Rfc3RhdHVzICE9IGxpYmVydGFzX2Nvbm5lY3RlZCkgeworCQkJCS8qCisJCQkJICogV2hlbiBEZWF1dGggRXZlbnQgcmVjZWl2ZWQgYmVmb3JlIEVudGVyX1BTIGNvbW1hbmQKKwkJCQkgKiByZXNwb25zZSwgV2UgbmVlZCB0byB3YWtlIHVwIHRoZSBmaXJtd2FyZS4KKwkJCQkgKi8KKwkJCQlsYnNfcHJfZGVidWcoMSwKKwkJCQkgICAgICAgIkRpc2Nvbm5lY3RlZCwgR29pbmcgdG8gaW52b2tlIGxpYmVydGFzX3BzX3dha2V1cFxuIik7CisKKwkJCQltdXRleF91bmxvY2soJmFkYXB0ZXItPmxvY2spOworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPmRyaXZlcl9sb2NrLCBmbGFncyk7CisJCQkJbGliZXJ0YXNfcHNfd2FrZXVwKHByaXYsIDApOworCQkJCW11dGV4X2xvY2soJmFkYXB0ZXItPmxvY2spOworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5kcml2ZXJfbG9jaywgZmxhZ3MpOworCQkJfQorCQl9IGVsc2UgaWYgKHBzbW9kZS0+YWN0aW9uID09IGNtZF9zdWJjbWRfZXhpdF9wcykgeworCQkJYWRhcHRlci0+bmVlZHRvd2FrZXVwID0gMDsKKwkJCWFkYXB0ZXItPnBzc3RhdGUgPSBQU19TVEFURV9GVUxMX1BPV0VSOworCQkJbGJzX3ByX2RlYnVnKDEsICJDTURfUkVTUDogRXhpdF9QUyBjb21tYW5kIHJlc3BvbnNlXG4iKTsKKwkJfSBlbHNlIHsKKwkJCWxic19wcl9kZWJ1ZygxLCAiQ01EX1JFU1A6IFBTLSBhY3Rpb249MHglWFxuIiwKKwkJCSAgICAgICBwc21vZGUtPmFjdGlvbik7CisJCX0KKworCQlfX2xpYmVydGFzX2NsZWFudXBfYW5kX2luc2VydF9jbWQocHJpdiwgYWRhcHRlci0+Y3VyX2NtZCk7CisJCWFkYXB0ZXItPm5yX2NtZF9wZW5kaW5nLS07CisJCWFkYXB0ZXItPmN1cl9jbWQgPSBOVUxMOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5kcml2ZXJfbG9jaywgZmxhZ3MpOworCisJCXJldCA9IDA7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAoYWRhcHRlci0+Y3VyX2NtZC0+Y21kZmxhZ3MgJiBDTURfRl9IT1NUQ01EKSB7CisJCS8qIENvcHkgdGhlIHJlc3BvbnNlIGJhY2sgdG8gcmVzcG9uc2UgYnVmZmVyICovCisJCW1lbWNweShhZGFwdGVyLT5jdXJfY21kLT5wZGF0YV9idWYsIHJlc3AsIHJlc3AtPnNpemUpOworCisJCWFkYXB0ZXItPmN1cl9jbWQtPmNtZGZsYWdzICY9IH5DTURfRl9IT1NUQ01EOworCX0KKworCS8qIElmIHRoZSBjb21tYW5kIGlzIG5vdCBzdWNjZXNzZnVsLCBjbGVhbnVwIGFuZCByZXR1cm4gZmFpbHVyZSAqLworCWlmICgocmVzdWx0ICE9IDAgfHwgIShyZXNwY21kICYgMHg4MDAwKSkpIHsKKwkJbGJzX3ByX2RlYnVnKDEsICJDTURfUkVTUDogY29tbWFuZCByZXBseSAlI3ggcmVzdWx0PSUjeFxuIiwKKwkJICAgICAgIHJlc3AtPmNvbW1hbmQsIHJlc3AtPnJlc3VsdCk7CisJCS8qCisJCSAqIEhhbmRsaW5nIGVycm9ycyBoZXJlCisJCSAqLworCQlzd2l0Y2ggKHJlc3BjbWQpIHsKKwkJY2FzZSBjbWRfcmV0X2h3X3NwZWNfaW5mbzoKKwkJY2FzZSBjbWRfcmV0XzgwMl8xMV9yZXNldDoKKwkJCWxic19wcl9kZWJ1ZygxLCAiQ01EX1JFU1A6IFJlc2V0IGNvbW1hbmQgZmFpbGVkXG4iKTsKKwkJCWJyZWFrOworCisJCX0KKworCQlfX2xpYmVydGFzX2NsZWFudXBfYW5kX2luc2VydF9jbWQocHJpdiwgYWRhcHRlci0+Y3VyX2NtZCk7CisJCWFkYXB0ZXItPm5yX2NtZF9wZW5kaW5nLS07CisJCWFkYXB0ZXItPmN1cl9jbWQgPSBOVUxMOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5kcml2ZXJfbG9jaywgZmxhZ3MpOworCisJCXJldCA9IC0xOworCQlnb3RvIGRvbmU7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKKworCXJldCA9IGhhbmRsZV9jbWRfcmVzcG9uc2UocmVzcGNtZCwgcmVzcCwgcHJpdik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKKwlpZiAoYWRhcHRlci0+Y3VyX2NtZCkgeworCQkvKiBDbGVhbiB1cCBhbmQgUHV0IGN1cnJlbnQgY29tbWFuZCBiYWNrIHRvIGNtZGZyZWVxICovCisJCV9fbGliZXJ0YXNfY2xlYW51cF9hbmRfaW5zZXJ0X2NtZChwcml2LCBhZGFwdGVyLT5jdXJfY21kKTsKKwkJYWRhcHRlci0+bnJfY21kX3BlbmRpbmctLTsKKwkJV0FSTl9PTihhZGFwdGVyLT5ucl9jbWRfcGVuZGluZyA+IDEyOCk7CisJCWFkYXB0ZXItPmN1cl9jbWQgPSBOVUxMOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5kcml2ZXJfbG9jaywgZmxhZ3MpOworCitkb25lOgorCW11dGV4X3VubG9jaygmYWRhcHRlci0+bG9jayk7CisJTEVBVkUoKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgbGliZXJ0YXNfcHJvY2Vzc19ldmVudCh3bGFuX3ByaXZhdGUgKiBwcml2KQoreworCWludCByZXQgPSAwOworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJdTMyIGV2ZW50Y2F1c2U7CisKKwlzcGluX2xvY2tfaXJxKCZhZGFwdGVyLT5kcml2ZXJfbG9jayk7CisJZXZlbnRjYXVzZSA9IGFkYXB0ZXItPmV2ZW50Y2F1c2U7CisJc3Bpbl91bmxvY2tfaXJxKCZhZGFwdGVyLT5kcml2ZXJfbG9jayk7CisKKwlFTlRFUigpOworCisJbGJzX3ByX2RlYnVnKDEsICJFVkVOVCBDYXVzZSAleFxuIiwgZXZlbnRjYXVzZSk7CisKKwlzd2l0Y2ggKGV2ZW50Y2F1c2UgPj4gU0JJX0VWRU5UX0NBVVNFX1NISUZUKSB7CisJY2FzZSBNQUNSRUdfSU5UX0NPREVfTElOS19TRU5TRUQ6CisJCWxic19wcl9kZWJ1ZygxLCAiRVZFTlQ6IE1BQ1JFR19JTlRfQ09ERV9MSU5LX1NFTlNFRFxuIik7CisJCWJyZWFrOworCisJY2FzZSBNQUNSRUdfSU5UX0NPREVfREVBVVRIRU5USUNBVEVEOgorCQlsYnNfcHJfZGVidWcoMSwgIkVWRU5UOiBEZWF1dGhlbnRpY2F0ZWRcbiIpOworCQlsaWJlcnRhc19tYWNfZXZlbnRfZGlzY29ubmVjdGVkKHByaXYpOworCQlicmVhazsKKworCWNhc2UgTUFDUkVHX0lOVF9DT0RFX0RJU0FTU09DSUFURUQ6CisJCWxic19wcl9kZWJ1ZygxLCAiRVZFTlQ6IERpc2Fzc29jaWF0ZWRcbiIpOworCQlsaWJlcnRhc19tYWNfZXZlbnRfZGlzY29ubmVjdGVkKHByaXYpOworCQlicmVhazsKKworCWNhc2UgTUFDUkVHX0lOVF9DT0RFX0xJTktfTE9TRV9OT19TQ0FOOgorCQlsYnNfcHJfZGVidWcoMSwgIkVWRU5UOiBMaW5rIGxvc3RcbiIpOworCQlsaWJlcnRhc19tYWNfZXZlbnRfZGlzY29ubmVjdGVkKHByaXYpOworCQlicmVhazsKKworCWNhc2UgTUFDUkVHX0lOVF9DT0RFX1BTX1NMRUVQOgorCQlsYnNfcHJfZGVidWcoMSwgIkVWRU5UOiBTTEVFUFxuIik7CisJCWxic19wcl9kZWJ1ZygxLCAiXyIpOworCisJCS8qIGhhbmRsZSB1bmV4cGVjdGVkIFBTIFNMRUVQIGV2ZW50ICovCisJCWlmIChhZGFwdGVyLT5wc3N0YXRlID09IFBTX1NUQVRFX0ZVTExfUE9XRVIpIHsKKwkJCWxic19wcl9kZWJ1ZygxLAorCQkJICAgICAgICJFVkVOVDogSW4gRlVMTCBQT1dFUiBtb2RlIC0gaWdub3JlIFBTIFNMRUVQXG4iKTsKKwkJCWJyZWFrOworCQl9CisJCWFkYXB0ZXItPnBzc3RhdGUgPSBQU19TVEFURV9QUkVfU0xFRVA7CisKKwkJbGliZXJ0YXNfcHNfY29uZmlybV9zbGVlcChwcml2LCAodTE2KSBhZGFwdGVyLT5wc21vZGUpOworCisJCWJyZWFrOworCisJY2FzZSBNQUNSRUdfSU5UX0NPREVfUFNfQVdBS0U6CisJCWxic19wcl9kZWJ1ZygxLCAiRVZFTlQ6IEFXQUtFIFxuIik7CisJCWxic19wcl9kZWJ1ZygxLCAifCIpOworCisJCS8qIGhhbmRsZSB1bmV4cGVjdGVkIFBTIEFXQUtFIGV2ZW50ICovCisJCWlmIChhZGFwdGVyLT5wc3N0YXRlID09IFBTX1NUQVRFX0ZVTExfUE9XRVIpIHsKKwkJCWxic19wcl9kZWJ1ZygxLAorCQkJICAgICAgICJFVkVOVDogSW4gRlVMTCBQT1dFUiBtb2RlIC0gaWdub3JlIFBTIEFXQUtFXG4iKTsKKwkJCWJyZWFrOworCQl9CisKKwkJYWRhcHRlci0+cHNzdGF0ZSA9IFBTX1NUQVRFX0FXQUtFOworCisJCWlmIChhZGFwdGVyLT5uZWVkdG93YWtldXApIHsKKwkJCS8qCisJCQkgKiB3YWl0IGZvciB0aGUgY29tbWFuZCBwcm9jZXNzaW5nIHRvIGZpbmlzaAorCQkJICogYmVmb3JlIHJlc3VtaW5nIHNlbmRpbmcKKwkJCSAqIGFkYXB0ZXItPm5lZWR0b3dha2V1cCB3aWxsIGJlIHNldCB0byBGQUxTRQorCQkJICogaW4gbGliZXJ0YXNfcHNfd2FrZXVwKCkKKwkJCSAqLworCQkJbGJzX3ByX2RlYnVnKDEsICJXYWtpbmcgdXAuLi5cbiIpOworCQkJbGliZXJ0YXNfcHNfd2FrZXVwKHByaXYsIDApOworCQl9CisJCWJyZWFrOworCisJY2FzZSBNQUNSRUdfSU5UX0NPREVfTUlDX0VSUl9VTklDQVNUOgorCQlsYnNfcHJfZGVidWcoMSwgIkVWRU5UOiBVTklDQVNUIE1JQyBFUlJPUlxuIik7CisJCWhhbmRsZV9taWNfZmFpbHVyZWV2ZW50KHByaXYsIE1BQ1JFR19JTlRfQ09ERV9NSUNfRVJSX1VOSUNBU1QpOworCQlicmVhazsKKworCWNhc2UgTUFDUkVHX0lOVF9DT0RFX01JQ19FUlJfTVVMVElDQVNUOgorCQlsYnNfcHJfZGVidWcoMSwgIkVWRU5UOiBNVUxUSUNBU1QgTUlDIEVSUk9SXG4iKTsKKwkJaGFuZGxlX21pY19mYWlsdXJlZXZlbnQocHJpdiwgTUFDUkVHX0lOVF9DT0RFX01JQ19FUlJfTVVMVElDQVNUKTsKKwkJYnJlYWs7CisJY2FzZSBNQUNSRUdfSU5UX0NPREVfTUlCX0NIQU5HRUQ6CisJY2FzZSBNQUNSRUdfSU5UX0NPREVfSU5JVF9ET05FOgorCQlicmVhazsKKworCWNhc2UgTUFDUkVHX0lOVF9DT0RFX0FESE9DX0JDTl9MT1NUOgorCQlsYnNfcHJfZGVidWcoMSwgIkVWRU5UOiBIV0FDIC0gQURIT0MgQkNOIExPU1RcbiIpOworCQlicmVhazsKKworCWNhc2UgTUFDUkVHX0lOVF9DT0RFX1JTU0lfTE9XOgorCQlsYnNfcHJfYWxlcnQoICJFVkVOVDogUlNTSV9MT1dcbiIpOworCQlicmVhazsKKwljYXNlIE1BQ1JFR19JTlRfQ09ERV9TTlJfTE9XOgorCQlsYnNfcHJfYWxlcnQoICJFVkVOVDogU05SX0xPV1xuIik7CisJCWJyZWFrOworCWNhc2UgTUFDUkVHX0lOVF9DT0RFX01BWF9GQUlMOgorCQlsYnNfcHJfYWxlcnQoICJFVkVOVDogTUFYX0ZBSUxcbiIpOworCQlicmVhazsKKwljYXNlIE1BQ1JFR19JTlRfQ09ERV9SU1NJX0hJR0g6CisJCWxic19wcl9hbGVydCggIkVWRU5UOiBSU1NJX0hJR0hcbiIpOworCQlicmVhazsKKwljYXNlIE1BQ1JFR19JTlRfQ09ERV9TTlJfSElHSDoKKwkJbGJzX3ByX2FsZXJ0KCAiRVZFTlQ6IFNOUl9ISUdIXG4iKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlsYnNfcHJfYWxlcnQoICJFVkVOVDogdW5rbm93biBldmVudCBpZDogJSN4XG4iLAorCQkgICAgICAgZXZlbnRjYXVzZSA+PiBTQklfRVZFTlRfQ0FVU0VfU0hJRlQpOworCQlicmVhazsKKwl9CisKKwlzcGluX2xvY2tfaXJxKCZhZGFwdGVyLT5kcml2ZXJfbG9jayk7CisJYWRhcHRlci0+ZXZlbnRjYXVzZSA9IDA7CisJc3Bpbl91bmxvY2tfaXJxKCZhZGFwdGVyLT5kcml2ZXJfbG9jayk7CisJTEVBVkUoKTsKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvZGVidWdmcy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvZGVidWdmcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxZGZkMjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9kZWJ1Z2ZzLmMKQEAgLTAsMCArMSwxOTM1IEBACisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGNhY2hlLmg+CisjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgorI2luY2x1ZGUgImRldi5oIgorI2luY2x1ZGUgImRlY2wuaCIKKyNpbmNsdWRlICJob3N0LmgiCisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpsaWJlcnRhc19kaXIgPSBOVUxMOworc3RhdGljIGNoYXIgKnN6U3RhdGVzW10gPSB7CisJIkNvbm5lY3RlZCIsCisJIkRpc2Nvbm5lY3RlZCIKK307CisKK3ZvaWQgbGliZXJ0YXNfZGVidWdfaW5pdCh3bGFuX3ByaXZhdGUgKiBwcml2LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworc3RhdGljIGludCBvcGVuX2ZpbGVfZ2VuZXJpYyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBpbm9kZS0+aV9wcml2YXRlOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCB3cml0ZV9maWxlX2R1bW15KHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBjb25zdCBzaXplX3QgbGVuID0gUEFHRV9TSVpFOworCitzdGF0aWMgc3NpemVfdCBsaWJlcnRhc19kZXZfaW5mbyhzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJidWYsCisJCQkJICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwl3bGFuX3ByaXZhdGUgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc2l6ZV90IHBvcyA9IDA7CisJdW5zaWduZWQgbG9uZyBhZGRyID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOworCWNoYXIgKmJ1ZiA9IChjaGFyICopYWRkcjsKKwlzc2l6ZV90IHJlczsKKworCXBvcyArPSBzbnByaW50ZihidWYrcG9zLCBsZW4tcG9zLCAic3RhdGUgPSAlc1xuIiwKKwkJCQlzelN0YXRlc1twcml2LT5hZGFwdGVyLT5jb25uZWN0X3N0YXR1c10pOworCXBvcyArPSBzbnByaW50ZihidWYrcG9zLCBsZW4tcG9zLCAicmVnaW9uX2NvZGUgPSAlMDJ4XG4iLAorCQkJCSh1MzIpIHByaXYtPmFkYXB0ZXItPnJlZ2lvbmNvZGUpOworCisJcmVzID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcmJ1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcG9zKTsKKworCWZyZWVfcGFnZShhZGRyKTsKKwlyZXR1cm4gcmVzOworfQorCisKK3N0YXRpYyBzc2l6ZV90IGxpYmVydGFzX2dldHNjYW50YWJsZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJidWYsCisJCQkJICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwl3bGFuX3ByaXZhdGUgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc2l6ZV90IHBvcyA9IDA7CisJaW50IG51bXNjYW5zZG9uZSA9IDAsIHJlczsKKwl1bnNpZ25lZCBsb25nIGFkZHIgPSBnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7CisJY2hhciAqYnVmID0gKGNoYXIgKilhZGRyOworCisJcG9zICs9IHNucHJpbnRmKGJ1Zitwb3MsIGxlbi1wb3MsCisJCQkiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7CisJcG9zICs9IHNucHJpbnRmKGJ1Zitwb3MsIGxlbi1wb3MsCisJCQkiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKwlwb3MgKz0gc25wcmludGYoYnVmK3BvcywgbGVuLXBvcywKKwkJIiMgfCBjaCAgfCBzcyAgfCAgICAgICBic3NpZCAgICAgICB8ICAgY2FwICAgIHwgICAgVFNGICAgfCBRdWFsIHwgU1NJRCBcbiIpOworCXBvcyArPSBzbnByaW50ZihidWYrcG9zLCBsZW4tcG9zLAorCQkiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7CisJcG9zICs9IHNucHJpbnRmKGJ1Zitwb3MsIGxlbi1wb3MsCisJCSItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCisJd2hpbGUgKG51bXNjYW5zZG9uZSA8IHByaXYtPmFkYXB0ZXItPm51bWluc2NhbnRhYmxlKSB7CisJCXN0cnVjdCBic3NfZGVzY3JpcHRvciAqcGJzc2luZm87CisJCXUxNiBjYXA7CisKKwkJcGJzc2luZm8gPSAmcHJpdi0+YWRhcHRlci0+c2NhbnRhYmxlW251bXNjYW5zZG9uZV07CisJCW1lbWNweSgmY2FwLCAmcGJzc2luZm8tPmNhcCwgc2l6ZW9mKGNhcCkpOworCQlwb3MgKz0gc25wcmludGYoYnVmK3BvcywgbGVuLXBvcywKKwkJCSIlMDJ1fCAlMDNkIHwgJTAzbGQgfCAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCB8IiwKKwkJCW51bXNjYW5zZG9uZSwgcGJzc2luZm8tPmNoYW5uZWwsIHBic3NpbmZvLT5yc3NpLAorCQkJcGJzc2luZm8tPm1hY2FkZHJlc3NbMF0sIHBic3NpbmZvLT5tYWNhZGRyZXNzWzFdLAorCQkJcGJzc2luZm8tPm1hY2FkZHJlc3NbMl0sIHBic3NpbmZvLT5tYWNhZGRyZXNzWzNdLAorCQkJcGJzc2luZm8tPm1hY2FkZHJlc3NbNF0sIHBic3NpbmZvLT5tYWNhZGRyZXNzWzVdKTsKKwkJcG9zICs9IHNucHJpbnRmKGJ1Zitwb3MsIGxlbi1wb3MsICIgJTA0eC0iLCBjYXApOworCQlwb3MgKz0gc25wcmludGYoYnVmK3BvcywgbGVuLXBvcywgIiVjJWMlYyB8IiwKKwkJCQlwYnNzaW5mby0+Y2FwLmlic3MgPyAnQScgOiAnSScsCisJCQkJcGJzc2luZm8tPmNhcC5wcml2YWN5ID8gJ1AnIDogJyAnLAorCQkJCXBic3NpbmZvLT5jYXAuc3BlY3RydW1tZ210ID8gJ1MnIDogJyAnKTsKKwkJcG9zICs9IHNucHJpbnRmKGJ1Zitwb3MsIGxlbi1wb3MsICIgJTA4bGx4IHwiLCBwYnNzaW5mby0+bmV0d29ya3RzZik7CisJCXBvcyArPSBzbnByaW50ZihidWYrcG9zLCBsZW4tcG9zLCAiICVkIHwiLAorCQkJU0NBTl9SU1NJKHByaXYtPmFkYXB0ZXItPnNjYW50YWJsZVtudW1zY2Fuc2RvbmVdLnJzc2kpKTsKKworCQlwb3MgKz0gc25wcmludGYoYnVmK3BvcywgbGVuLXBvcywgIiAlc1xuIiwgcGJzc2luZm8tPnNzaWQuc3NpZCk7CisKKwkJbnVtc2NhbnNkb25lKys7CisJfQorCisJcmVzID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcmJ1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcG9zKTsKKworCWZyZWVfcGFnZShhZGRyKTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgc3NpemVfdCBsaWJlcnRhc19zbGVlcHBhcmFtc193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQljb25zdCBjaGFyIF9fdXNlciAqdXNlcl9idWYsIHNpemVfdCBjb3VudCwKKwkJCQlsb2ZmX3QgKnBwb3MpCit7CisJd2xhbl9wcml2YXRlICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXNzaXplX3QgYnVmX3NpemUsIHJlczsKKwlpbnQgcDEsIHAyLCBwMywgcDQsIHA1LCBwNjsKKwlzdHJ1Y3Qgc2xlZXBfcGFyYW1zIHNwOworCXVuc2lnbmVkIGxvbmcgYWRkciA9IGdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKKwljaGFyICpidWYgPSAoY2hhciAqKWFkZHI7CisKKwlidWZfc2l6ZSA9IG1pbihjb3VudCwgbGVuIC0gMSk7CisJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgdXNlcl9idWYsIGJ1Zl9zaXplKSkgeworCQlyZXMgPSAtRUZBVUxUOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCXJlcyA9IHNzY2FuZihidWYsICIlZCAlZCAlZCAlZCAlZCAlZCIsICZwMSwgJnAyLCAmcDMsICZwNCwgJnA1LCAmcDYpOworCWlmIChyZXMgIT0gNikgeworCQlyZXMgPSAtRUZBVUxUOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCXNwLnNwX2Vycm9yID0gcDE7CisJc3Auc3Bfb2Zmc2V0ID0gcDI7CisJc3Auc3Bfc3RhYmxldGltZSA9IHAzOworCXNwLnNwX2NhbGNvbnRyb2wgPSBwNDsKKwlzcC5zcF9leHRzbGVlcGNsayA9IHA1OworCXNwLnNwX3Jlc2VydmVkID0gcDY7CisKKwltZW1jcHkoJnByaXYtPmFkYXB0ZXItPnNwLCAmc3AsIHNpemVvZihzdHJ1Y3Qgc2xlZXBfcGFyYW1zKSk7CisKKyAgICAgICAgcmVzID0gbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsCisJCQkJY21kXzgwMl8xMV9zbGVlcF9wYXJhbXMsCisJCQkJY21kX2FjdF9zZXQsCisJCQkJY21kX29wdGlvbl93YWl0Zm9ycnNwLCAwLCBOVUxMKTsKKworCWlmICghcmVzKQorCQlyZXMgPSBjb3VudDsKKwllbHNlCisJCXJlcyA9IC1FSU5WQUw7CisKK291dF91bmxvY2s6CisJZnJlZV9wYWdlKGFkZHIpOworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGxpYmVydGFzX3NsZWVwcGFyYW1zX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyYnVmLAorCQkJCSAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJd2xhbl9wcml2YXRlICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJc3NpemVfdCByZXM7CisJc2l6ZV90IHBvcyA9IDA7CisJdW5zaWduZWQgbG9uZyBhZGRyID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOworCWNoYXIgKmJ1ZiA9IChjaGFyICopYWRkcjsKKworICAgICAgICByZXMgPSBsaWJlcnRhc19wcmVwYXJlX2FuZF9zZW5kX2NvbW1hbmQocHJpdiwKKwkJCQljbWRfODAyXzExX3NsZWVwX3BhcmFtcywKKwkJCQljbWRfYWN0X2dldCwKKwkJCQljbWRfb3B0aW9uX3dhaXRmb3Jyc3AsIDAsIE5VTEwpOworCWlmIChyZXMpIHsKKwkJcmVzID0gLUVGQVVMVDsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCXBvcyArPSBzbnByaW50ZihidWYsIGxlbiwgIiVkICVkICVkICVkICVkICVkXG4iLCBhZGFwdGVyLT5zcC5zcF9lcnJvciwKKwkJCWFkYXB0ZXItPnNwLnNwX29mZnNldCwgYWRhcHRlci0+c3Auc3Bfc3RhYmxldGltZSwKKwkJCWFkYXB0ZXItPnNwLnNwX2NhbGNvbnRyb2wsIGFkYXB0ZXItPnNwLnNwX2V4dHNsZWVwY2xrLAorCQkJYWRhcHRlci0+c3Auc3BfcmVzZXJ2ZWQpOworCisJcmVzID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcmJ1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcG9zKTsKKworb3V0X3VubG9jazoKKwlmcmVlX3BhZ2UoYWRkcik7CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIHNzaXplX3QgbGliZXJ0YXNfZXh0c2NhbihzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKnVzZXJidWYsCisJCQkJICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwl3bGFuX3ByaXZhdGUgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3NpemVfdCByZXMsIGJ1Zl9zaXplOworCXN0cnVjdCBXTEFOXzgwMl8xMV9TU0lEIGV4dHNjYW5fc3NpZDsKKwl1bmlvbiBpd3JlcV9kYXRhIHdycXU7CisJdW5zaWduZWQgbG9uZyBhZGRyID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOworCWNoYXIgKmJ1ZiA9IChjaGFyICopYWRkcjsKKworCWJ1Zl9zaXplID0gbWluKGNvdW50LCBsZW4gLSAxKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCB1c2VyYnVmLCBidWZfc2l6ZSkpIHsKKwkJcmVzID0gLUVGQVVMVDsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCW1lbWNweSgmZXh0c2Nhbl9zc2lkLnNzaWQsIGJ1Ziwgc3RybGVuKGJ1ZiktMSk7CisJZXh0c2Nhbl9zc2lkLnNzaWRsZW5ndGggPSBzdHJsZW4oYnVmKS0xOworCisJbGliZXJ0YXNfc2VuZF9zcGVjaWZpY19TU0lEX3NjYW4ocHJpdiwgJmV4dHNjYW5fc3NpZCwgMSk7CisKKwltZW1zZXQoJndycXUsIDAsIHNpemVvZih1bmlvbiBpd3JlcV9kYXRhKSk7CisJd2lyZWxlc3Nfc2VuZF9ldmVudChwcml2LT53bGFuX2Rldi5uZXRkZXYsIFNJT0NHSVdTQ0FOLCAmd3JxdSwgTlVMTCk7CisKK291dF91bmxvY2s6CisJZnJlZV9wYWdlKGFkZHIpOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludCBsaWJlcnRhc19wYXJzZV9jaGFuKGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAorCQkJc3RydWN0IHdsYW5faW9jdGxfdXNlcl9zY2FuX2NmZyAqc2Nhbl9jZmcsIGludCBkdXIpCit7CisJY2hhciAqc3RhcnQsICplbmQsICpob2xkLCAqc3RyOworCWludCBpID0gMDsKKworCXN0YXJ0ID0gc3Ryc3RyKGJ1ZiwgImNoYW49Iik7CisJaWYgKCFzdGFydCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJc3RhcnQgKz0gNTsKKwllbmQgPSBzdHJzdHIoc3RhcnQsICIgIik7CisJaWYgKCFlbmQpCisJCWVuZCA9IGJ1ZiArIGNvdW50OworCWhvbGQgPSBremFsbG9jKChlbmQgLSBzdGFydCkrMSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFob2xkKQorCQlyZXR1cm4gLUVOT01FTTsKKwlzdHJuY3B5KGhvbGQsIHN0YXJ0LCBlbmQgLSBzdGFydCk7CisJaG9sZFsoZW5kLXN0YXJ0KSsxXSA9ICdcMCc7CisJd2hpbGUoaG9sZCAmJiAoc3RyID0gc3Ryc2VwKCZob2xkLCAiLCIpKSkgeworCQlpbnQgY2hhbjsKKwkJY2hhciBiYW5kLCBwYXNzaXZlID0gMDsKKwkJc3NjYW5mKHN0ciwgIiVkJWMlYyIsICZjaGFuLCAmYmFuZCwgJnBhc3NpdmUpOworCQlzY2FuX2NmZy0+Y2hhbmxpc3RbaV0uY2hhbm51bWJlciA9IGNoYW47CisJCXNjYW5fY2ZnLT5jaGFubGlzdFtpXS5zY2FudHlwZSA9IHBhc3NpdmUgPyAxIDogMDsKKwkJaWYgKGJhbmQgPT0gJ2InIHx8IGJhbmQgPT0gJ2cnKQorCQkJc2Nhbl9jZmctPmNoYW5saXN0W2ldLnJhZGlvdHlwZSA9IDA7CisJCWVsc2UgaWYgKGJhbmQgPT0gJ2EnKQorCQkJc2Nhbl9jZmctPmNoYW5saXN0W2ldLnJhZGlvdHlwZSA9IDE7CisKKwkJc2Nhbl9jZmctPmNoYW5saXN0W2ldLnNjYW50aW1lID0gZHVyOworCQlpKys7CisJfQorCisJa2ZyZWUoaG9sZCk7CisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyB2b2lkIGxpYmVydGFzX3BhcnNlX2Jzc2lkKGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHdsYW5faW9jdGxfdXNlcl9zY2FuX2NmZyAqc2Nhbl9jZmcpCit7CisJY2hhciAqaG9sZDsKKwl1bnNpZ25lZCBpbnQgbWFjW0VUSF9BTEVOXTsKKwlpbnQgaTsKKworCWhvbGQgPSBzdHJzdHIoYnVmLCAiYnNzaWQ9Iik7CisJaWYgKCFob2xkKQorCQlyZXR1cm47CisJaG9sZCArPSA2OworCXNzY2FuZihob2xkLCAiJTJ4OiUyeDolMng6JTJ4OiUyeDolMngiLCBtYWMsIG1hYysxLCBtYWMrMiwgbWFjKzMsCisJCQltYWMrNCwgbWFjKzUpOworCWZvcihpPTA7aTxFVEhfQUxFTjtpKyspCisJCXNjYW5fY2ZnLT5zcGVjaWZpY0JTU0lEW2ldID0gbWFjW2ldOworfQorCitzdGF0aWMgdm9pZCBsaWJlcnRhc19wYXJzZV9zc2lkKGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHdsYW5faW9jdGxfdXNlcl9zY2FuX2NmZyAqc2Nhbl9jZmcpCit7CisJY2hhciAqaG9sZCwgKmVuZDsKKwlzc2l6ZV90IHNpemU7CisKKwlob2xkID0gc3Ryc3RyKGJ1ZiwgInNzaWQ9Iik7CisJaWYgKCFob2xkKQorCQlyZXR1cm47CisJaG9sZCArPSA1OworCWVuZCA9IHN0cnN0cihob2xkLCAiICIpOworCWlmICghZW5kKQorCQllbmQgPSBidWYgKyBjb3VudCAtIDE7CisKKwlzaXplID0gbWluKElXX0VTU0lEX01BWF9TSVpFLCBlbmQgLSBob2xkKTsKKwlzdHJuY3B5KHNjYW5fY2ZnLT5zcGVjaWZpY1NTSUQsIGhvbGQsIHNpemUpOworCisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBsaWJlcnRhc19wYXJzZV9rZWVwKGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHdsYW5faW9jdGxfdXNlcl9zY2FuX2NmZyAqc2Nhbl9jZmcpCit7CisJY2hhciAqaG9sZDsKKwlpbnQgdmFsOworCisJaG9sZCA9IHN0cnN0cihidWYsICJrZWVwPSIpOworCWlmICghaG9sZCkKKwkJcmV0dXJuOworCWhvbGQgKz0gNTsKKwlzc2NhbmYoaG9sZCwgIiVkIiwgJnZhbCk7CisKKwlpZiAodmFsICE9IDApCisJCXZhbCA9IDE7CisKKwlzY2FuX2NmZy0+a2VlcHByZXZpb3Vzc2NhbiA9IHZhbDsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgbGliZXJ0YXNfcGFyc2VfZHVyKGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHdsYW5faW9jdGxfdXNlcl9zY2FuX2NmZyAqc2Nhbl9jZmcpCit7CisJY2hhciAqaG9sZDsKKwlpbnQgdmFsOworCisJaG9sZCA9IHN0cnN0cihidWYsICJkdXI9Iik7CisJaWYgKCFob2xkKQorCQlyZXR1cm4gMDsKKwlob2xkICs9IDQ7CisJc3NjYW5mKGhvbGQsICIlZCIsICZ2YWwpOworCisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIHZvaWQgbGliZXJ0YXNfcGFyc2VfcHJvYmVzKGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHdsYW5faW9jdGxfdXNlcl9zY2FuX2NmZyAqc2Nhbl9jZmcpCit7CisJY2hhciAqaG9sZDsKKwlpbnQgdmFsOworCisJaG9sZCA9IHN0cnN0cihidWYsICJwcm9iZXM9Iik7CisJaWYgKCFob2xkKQorCQlyZXR1cm47CisJaG9sZCArPSA3OworCXNzY2FuZihob2xkLCAiJWQiLCAmdmFsKTsKKworCXNjYW5fY2ZnLT5udW1wcm9iZXMgPSB2YWw7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIGxpYmVydGFzX3BhcnNlX3R5cGUoY2hhciAqYnVmLCBzaXplX3QgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgd2xhbl9pb2N0bF91c2VyX3NjYW5fY2ZnICpzY2FuX2NmZykKK3sKKwljaGFyICpob2xkOworCWludCB2YWw7CisKKwlob2xkID0gc3Ryc3RyKGJ1ZiwgInR5cGU9Iik7CisJaWYgKCFob2xkKQorCQlyZXR1cm47CisJaG9sZCArPSA1OworCXNzY2FuZihob2xkLCAiJWQiLCAmdmFsKTsKKworCS8qIHR5cGU9MSwyIG9yIDMgKi8KKwlpZiAodmFsIDwgMSB8fCB2YWwgPiAzKQorCQlyZXR1cm47CisKKwlzY2FuX2NmZy0+YnNzdHlwZSA9IHZhbDsKKworCXJldHVybjsKK30KKworc3RhdGljIHNzaXplX3QgbGliZXJ0YXNfc2V0dXNlcnNjYW4oc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJICAgIGNvbnN0IGNoYXIgX191c2VyICp1c2VyYnVmLAorCQkJCSAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwl3bGFuX3ByaXZhdGUgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3NpemVfdCByZXMsIGJ1Zl9zaXplOworCXN0cnVjdCB3bGFuX2lvY3RsX3VzZXJfc2Nhbl9jZmcgKnNjYW5fY2ZnOworCXVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKKwlpbnQgZHVyOworCXVuc2lnbmVkIGxvbmcgYWRkciA9IGdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKKwljaGFyICpidWYgPSAoY2hhciAqKWFkZHI7CisKKwlzY2FuX2NmZyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB3bGFuX2lvY3RsX3VzZXJfc2Nhbl9jZmcpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNjYW5fY2ZnKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWJ1Zl9zaXplID0gbWluKGNvdW50LCBsZW4gLSAxKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCB1c2VyYnVmLCBidWZfc2l6ZSkpIHsKKwkJcmVzID0gLUVGQVVMVDsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCXNjYW5fY2ZnLT5ic3N0eXBlID0gV0xBTl9TQ0FOX0JTU19UWVBFX0FOWTsKKworCWR1ciA9IGxpYmVydGFzX3BhcnNlX2R1cihidWYsIGNvdW50LCBzY2FuX2NmZyk7CisJbGliZXJ0YXNfcGFyc2VfY2hhbihidWYsIGNvdW50LCBzY2FuX2NmZywgZHVyKTsKKwlsaWJlcnRhc19wYXJzZV9ic3NpZChidWYsIGNvdW50LCBzY2FuX2NmZyk7CisJbGliZXJ0YXNfcGFyc2Vfc3NpZChidWYsIGNvdW50LCBzY2FuX2NmZyk7CisJbGliZXJ0YXNfcGFyc2Vfa2VlcChidWYsIGNvdW50LCBzY2FuX2NmZyk7CisJbGliZXJ0YXNfcGFyc2VfcHJvYmVzKGJ1ZiwgY291bnQsIHNjYW5fY2ZnKTsKKwlsaWJlcnRhc19wYXJzZV90eXBlKGJ1ZiwgY291bnQsIHNjYW5fY2ZnKTsKKworCXdsYW5fc2Nhbl9uZXR3b3Jrcyhwcml2LCBzY2FuX2NmZyk7CisJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHByaXYtPmFkYXB0ZXItPmNtZF9wZW5kaW5nLAorCQkJCSAhcHJpdi0+YWRhcHRlci0+bnJfY21kX3BlbmRpbmcpOworCisJbWVtc2V0KCZ3cnF1LCAweDAwLCBzaXplb2YodW5pb24gaXdyZXFfZGF0YSkpOworCXdpcmVsZXNzX3NlbmRfZXZlbnQocHJpdi0+d2xhbl9kZXYubmV0ZGV2LCBTSU9DR0lXU0NBTiwgJndycXUsIE5VTEwpOworCitvdXRfdW5sb2NrOgorCWZyZWVfcGFnZShhZGRyKTsKKwlrZnJlZShzY2FuX2NmZyk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW50IGxpYmVydGFzX2V2ZW50X2luaXRjbWQod2xhbl9wcml2YXRlICpwcml2LCB2b2lkICoqcmVzcG9uc2VfYnVmLAorCQkJc3RydWN0IGNtZF9jdHJsX25vZGUgKipjbWRub2RlLAorCQkJc3RydWN0IGNtZF9kc19jb21tYW5kICoqY21kKQoreworCXUxNiB3YWl0X29wdGlvbiA9IGNtZF9vcHRpb25fd2FpdGZvcnJzcDsKKworCWlmICghKCpjbWRub2RlID0gbGliZXJ0YXNfZ2V0X2ZyZWVfY21kX2N0cmxfbm9kZShwcml2KSkpIHsKKwkJbGJzX3ByX2RlYnVnKDEsICJmYWlsZWQgbGliZXJ0YXNfZ2V0X2ZyZWVfY21kX2N0cmxfbm9kZVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlpZiAoISgqcmVzcG9uc2VfYnVmID0ga21hbGxvYygzMDAwLCBHRlBfS0VSTkVMKSkpIHsKKwkJbGJzX3ByX2RlYnVnKDEsICJmYWlsZWQgdG8gYWxsb2NhdGUgcmVzcG9uc2UgYnVmZmVyIVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlsaWJlcnRhc19zZXRfY21kX2N0cmxfbm9kZShwcml2LCAqY21kbm9kZSwgMCwgd2FpdF9vcHRpb24sIE5VTEwpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJigqY21kbm9kZSktPmNtZHdhaXRfcSk7CisJKCpjbWRub2RlKS0+cGRhdGFfYnVmID0gKnJlc3BvbnNlX2J1ZjsKKwkoKmNtZG5vZGUpLT5jbWRmbGFncyB8PSBDTURfRl9IT1NUQ01EOworCSgqY21kbm9kZSktPmNtZHdhaXRxd29rZW4gPSAwOworCSpjbWQgPSAoc3RydWN0IGNtZF9kc19jb21tYW5kICopKCpjbWRub2RlKS0+YnVmdmlydHVhbGFkZHI7CisJKCpjbWQpLT5jb21tYW5kID0gY21kXzgwMl8xMV9zdWJzY3JpYmVfZXZlbnQ7CisJKCpjbWQpLT5zZXFudW0gPSArK3ByaXYtPmFkYXB0ZXItPnNlcW51bTsKKwkoKmNtZCktPnJlc3VsdCA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGxpYmVydGFzX2xvd3Jzc2lfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJidWYsCisJCQkJICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwl3bGFuX3ByaXZhdGUgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwlzdHJ1Y3QgY21kX2N0cmxfbm9kZSAqcGNtZG5vZGU7CisJc3RydWN0IGNtZF9kc19jb21tYW5kICpwY21kcHRyOworCXN0cnVjdCBjbWRfZHNfODAyXzExX3N1YnNjcmliZV9ldmVudCAqZXZlbnQ7CisJdm9pZCAqcmVzcG9uc2VfYnVmOworCWludCByZXMsIGNtZF9sZW47CisJc3NpemVfdCBwb3MgPSAwOworCXVuc2lnbmVkIGxvbmcgYWRkciA9IGdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKKwljaGFyICpidWYgPSAoY2hhciAqKWFkZHI7CisKKwlyZXMgPSBsaWJlcnRhc19ldmVudF9pbml0Y21kKHByaXYsICZyZXNwb25zZV9idWYsICZwY21kbm9kZSwgJnBjbWRwdHIpOworCWlmIChyZXMgPCAwKSB7CisJCWZyZWVfcGFnZShhZGRyKTsKKwkJcmV0dXJuIHJlczsKKwl9CisKKwlldmVudCA9ICZwY21kcHRyLT5wYXJhbXMuc3Vic2NyaWJlX2V2ZW50OworCWV2ZW50LT5hY3Rpb24gPSBjbWRfYWN0X2dldDsKKwlwY21kcHRyLT5zaXplID0KKwljcHVfdG9fbGUxNihzaXplb2Yoc3RydWN0IGNtZF9kc184MDJfMTFfc3Vic2NyaWJlX2V2ZW50KSArIFNfRFNfR0VOKTsKKwlsaWJlcnRhc19xdWV1ZV9jbWQoYWRhcHRlciwgcGNtZG5vZGUsIDEpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcHJpdi0+bWFpbnRocmVhZC53YWl0cSk7CisKKwkvKiBTbGVlcCB1bnRpbCByZXNwb25zZSBpcyBnZW5lcmF0ZWQgYnkgRlcgKi8KKwl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUocGNtZG5vZGUtPmNtZHdhaXRfcSwKKwkJCQlwY21kbm9kZS0+Y21kd2FpdHF3b2tlbik7CisKKwlwY21kcHRyID0gcmVzcG9uc2VfYnVmOworCWlmIChwY21kcHRyLT5yZXN1bHQpIHsKKwkJbGJzX3ByX2VycigiJXM6IGZhaWwsIHJlc3VsdD0lZFxuIiwgX19GVU5DVElPTl9fLAorCQkJcGNtZHB0ci0+cmVzdWx0KTsKKwkJa2ZyZWUocmVzcG9uc2VfYnVmKTsKKwkJZnJlZV9wYWdlKGFkZHIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAocGNtZHB0ci0+Y29tbWFuZCAhPSBjbWRfcmV0XzgwMl8xMV9zdWJzY3JpYmVfZXZlbnQpIHsKKwkJbGJzX3ByX2VycigiY29tbWFuZCByZXNwb25zZSBpbmNvcnJlY3QhXG4iKTsKKwkJa2ZyZWUocmVzcG9uc2VfYnVmKTsKKwkJZnJlZV9wYWdlKGFkZHIpOworCQlyZXR1cm4gMDsKKwl9CisKKwljbWRfbGVuID0gU19EU19HRU4gKyBzaXplb2Yoc3RydWN0IGNtZF9kc184MDJfMTFfc3Vic2NyaWJlX2V2ZW50KTsKKwlldmVudCA9IChzdHJ1Y3QgY21kX2RzXzgwMl8xMV9zdWJzY3JpYmVfZXZlbnQgKikocmVzcG9uc2VfYnVmICsgU19EU19HRU4pOworCXdoaWxlIChjbWRfbGVuIDwgcGNtZHB0ci0+c2l6ZSkgeworCQlzdHJ1Y3QgbXJ2bGlldHlwZXNoZWFkZXIgKmhlYWRlciA9IChzdHJ1Y3QgbXJ2bGlldHlwZXNoZWFkZXIgKikocmVzcG9uc2VfYnVmICsgY21kX2xlbik7CisJCXN3aXRjaChoZWFkZXItPnR5cGUpIHsKKwkJc3RydWN0IG1ydmxpZXR5cGVzX3Jzc2l0aHJlc2hvbGQgICpMb3dyc3NpOworCQljYXNlIFRMVl9UWVBFX1JTU0lfTE9XOgorCQlMb3dyc3NpID0gKHN0cnVjdCBtcnZsaWV0eXBlc19yc3NpdGhyZXNob2xkICopKHJlc3BvbnNlX2J1ZiArIGNtZF9sZW4pOworCQlwb3MgKz0gc25wcmludGYoYnVmK3BvcywgbGVuLXBvcywgIiVkICVkICVkXG4iLAorCQkJCUxvd3Jzc2ktPnJzc2l2YWx1ZSwKKwkJCQlMb3dyc3NpLT5yc3NpZnJlcSwKKwkJCQkoZXZlbnQtPmV2ZW50cyAmIDB4MDAwMSk/MTowKTsKKwkJZGVmYXVsdDoKKwkJCWNtZF9sZW4gKz0gc2l6ZW9mKHN0cnVjdCBtcnZsaWV0eXBlc19zbnJ0aHJlc2hvbGQpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlrZnJlZShyZXNwb25zZV9idWYpOworCXJlcyA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJidWYsIGNvdW50LCBwcG9zLCBidWYsIHBvcyk7CisJZnJlZV9wYWdlKGFkZHIpOworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyB1MTYgbGliZXJ0YXNfZ2V0X2V2ZW50c19iaXRtYXAod2xhbl9wcml2YXRlICpwcml2KQoreworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJc3RydWN0IGNtZF9jdHJsX25vZGUgKnBjbWRub2RlOworCXN0cnVjdCBjbWRfZHNfY29tbWFuZCAqcGNtZHB0cjsKKwlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9zdWJzY3JpYmVfZXZlbnQgKmV2ZW50OworCXZvaWQgKnJlc3BvbnNlX2J1ZjsKKwlpbnQgcmVzOworCXUxNiBldmVudF9iaXRtYXA7CisKKwlyZXMgPSBsaWJlcnRhc19ldmVudF9pbml0Y21kKHByaXYsICZyZXNwb25zZV9idWYsICZwY21kbm9kZSwgJnBjbWRwdHIpOworCWlmIChyZXMgPCAwKQorCQlyZXR1cm4gcmVzOworCisJZXZlbnQgPSAmcGNtZHB0ci0+cGFyYW1zLnN1YnNjcmliZV9ldmVudDsKKwlldmVudC0+YWN0aW9uID0gY21kX2FjdF9nZXQ7CisJcGNtZHB0ci0+c2l6ZSA9CisJY3B1X3RvX2xlMTYoc2l6ZW9mKHN0cnVjdCBjbWRfZHNfODAyXzExX3N1YnNjcmliZV9ldmVudCkgKyBTX0RTX0dFTik7CisJbGliZXJ0YXNfcXVldWVfY21kKGFkYXB0ZXIsIHBjbWRub2RlLCAxKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnByaXYtPm1haW50aHJlYWQud2FpdHEpOworCisJLyogU2xlZXAgdW50aWwgcmVzcG9uc2UgaXMgZ2VuZXJhdGVkIGJ5IEZXICovCisJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHBjbWRub2RlLT5jbWR3YWl0X3EsCisJCQkJcGNtZG5vZGUtPmNtZHdhaXRxd29rZW4pOworCisJcGNtZHB0ciA9IHJlc3BvbnNlX2J1ZjsKKworCWlmIChwY21kcHRyLT5yZXN1bHQpIHsKKwkJbGJzX3ByX2VycigiJXM6IGZhaWwsIHJlc3VsdD0lZFxuIiwgX19GVU5DVElPTl9fLAorCQkJcGNtZHB0ci0+cmVzdWx0KTsKKwkJa2ZyZWUocmVzcG9uc2VfYnVmKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHBjbWRwdHItPmNvbW1hbmQgIT0gY21kX3JldF84MDJfMTFfc3Vic2NyaWJlX2V2ZW50KSB7CisJCWxic19wcl9lcnIoImNvbW1hbmQgcmVzcG9uc2UgaW5jb3JyZWN0IVxuIik7CisJCWtmcmVlKHJlc3BvbnNlX2J1Zik7CisJCXJldHVybiAwOworCX0KKworCWV2ZW50ID0gKHN0cnVjdCBjbWRfZHNfODAyXzExX3N1YnNjcmliZV9ldmVudCAqKShyZXNwb25zZV9idWYgKyBTX0RTX0dFTik7CisJZXZlbnRfYml0bWFwID0gZXZlbnQtPmV2ZW50czsKKwlrZnJlZShyZXNwb25zZV9idWYpOworCXJldHVybiBldmVudF9iaXRtYXA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGxpYmVydGFzX2xvd3Jzc2lfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJICAgIGNvbnN0IGNoYXIgX191c2VyICp1c2VyYnVmLAorCQkJCSAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwl3bGFuX3ByaXZhdGUgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwlzc2l6ZV90IHJlcywgYnVmX3NpemU7CisJaW50IHZhbHVlLCBmcmVxLCBzdWJzY3JpYmVkLCBjbWRfbGVuOworCXN0cnVjdCBjbWRfY3RybF9ub2RlICpwY21kbm9kZTsKKwlzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKnBjbWRwdHI7CisJc3RydWN0IGNtZF9kc184MDJfMTFfc3Vic2NyaWJlX2V2ZW50ICpldmVudDsKKwlzdHJ1Y3QgbXJ2bGlldHlwZXNfcnNzaXRocmVzaG9sZCAqcnNzaV90aHJlc2hvbGQ7CisJdm9pZCAqcmVzcG9uc2VfYnVmOworCXUxNiBldmVudF9iaXRtYXA7CisJdTggKnB0cjsKKwl1bnNpZ25lZCBsb25nIGFkZHIgPSBnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7CisJY2hhciAqYnVmID0gKGNoYXIgKilhZGRyOworCisJYnVmX3NpemUgPSBtaW4oY291bnQsIGxlbiAtIDEpOworCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIHVzZXJidWYsIGJ1Zl9zaXplKSkgeworCQlyZXMgPSAtRUZBVUxUOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCXJlcyA9IHNzY2FuZihidWYsICIlZCAlZCAlZCIsICZ2YWx1ZSwgJmZyZXEsICZzdWJzY3JpYmVkKTsKKwlpZiAocmVzICE9IDMpIHsKKwkJcmVzID0gLUVGQVVMVDsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCWV2ZW50X2JpdG1hcCA9IGxpYmVydGFzX2dldF9ldmVudHNfYml0bWFwKHByaXYpOworCisJcmVzID0gbGliZXJ0YXNfZXZlbnRfaW5pdGNtZChwcml2LCAmcmVzcG9uc2VfYnVmLCAmcGNtZG5vZGUsICZwY21kcHRyKTsKKwlpZiAocmVzIDwgMCkKKwkJZ290byBvdXRfdW5sb2NrOworCisJZXZlbnQgPSAmcGNtZHB0ci0+cGFyYW1zLnN1YnNjcmliZV9ldmVudDsKKwlldmVudC0+YWN0aW9uID0gY21kX2FjdF9zZXQ7CisJcGNtZHB0ci0+c2l6ZSA9IGNwdV90b19sZTE2KFNfRFNfR0VOICsKKwkJc2l6ZW9mKHN0cnVjdCBjbWRfZHNfODAyXzExX3N1YnNjcmliZV9ldmVudCkgKworCQlzaXplb2Yoc3RydWN0IG1ydmxpZXR5cGVzX3Jzc2l0aHJlc2hvbGQpKTsKKworCWNtZF9sZW4gPSBTX0RTX0dFTiArIHNpemVvZihzdHJ1Y3QgY21kX2RzXzgwMl8xMV9zdWJzY3JpYmVfZXZlbnQpOworCXB0ciA9ICh1OCopIHBjbWRwdHIrY21kX2xlbjsKKwlyc3NpX3RocmVzaG9sZCA9IChzdHJ1Y3QgbXJ2bGlldHlwZXNfcnNzaXRocmVzaG9sZCAqKShwdHIpOworCXJzc2lfdGhyZXNob2xkLT5oZWFkZXIudHlwZSA9IGNwdV90b19sZTE2KDB4MDEwNCk7CisJcnNzaV90aHJlc2hvbGQtPmhlYWRlci5sZW4gPSAyOworCXJzc2lfdGhyZXNob2xkLT5yc3NpdmFsdWUgPSBjcHVfdG9fbGUxNih2YWx1ZSk7CisJcnNzaV90aHJlc2hvbGQtPnJzc2lmcmVxID0gY3B1X3RvX2xlMTYoZnJlcSk7CisJZXZlbnRfYml0bWFwIHw9IHN1YnNjcmliZWQgPyAweDAwMDEgOiAweDA7CisJZXZlbnQtPmV2ZW50cyA9IGV2ZW50X2JpdG1hcDsKKworCWxpYmVydGFzX3F1ZXVlX2NtZChhZGFwdGVyLCBwY21kbm9kZSwgMSk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwcml2LT5tYWludGhyZWFkLndhaXRxKTsKKworCS8qIFNsZWVwIHVudGlsIHJlc3BvbnNlIGlzIGdlbmVyYXRlZCBieSBGVyAqLworCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShwY21kbm9kZS0+Y21kd2FpdF9xLAorCQkJCXBjbWRub2RlLT5jbWR3YWl0cXdva2VuKTsKKworCXBjbWRwdHIgPSByZXNwb25zZV9idWY7CisKKwlpZiAocGNtZHB0ci0+cmVzdWx0KSB7CisJCWxic19wcl9lcnIoIiVzOiBmYWlsLCByZXN1bHQ9JWRcbiIsIF9fRlVOQ1RJT05fXywKKwkJCXBjbWRwdHItPnJlc3VsdCk7CisJCWtmcmVlKHJlc3BvbnNlX2J1Zik7CisJCWZyZWVfcGFnZShhZGRyKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHBjbWRwdHItPmNvbW1hbmQgIT0gY21kX3JldF84MDJfMTFfc3Vic2NyaWJlX2V2ZW50KSB7CisJCWxic19wcl9lcnIoImNvbW1hbmQgcmVzcG9uc2UgaW5jb3JyZWN0IVxuIik7CisJCWtmcmVlKHJlc3BvbnNlX2J1Zik7CisJCWZyZWVfcGFnZShhZGRyKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmVzID0gY291bnQ7CitvdXRfdW5sb2NrOgorCWZyZWVfcGFnZShhZGRyKTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgc3NpemVfdCBsaWJlcnRhc19sb3dzbnJfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJidWYsCisJCQkJICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwl3bGFuX3ByaXZhdGUgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwlzdHJ1Y3QgY21kX2N0cmxfbm9kZSAqcGNtZG5vZGU7CisJc3RydWN0IGNtZF9kc19jb21tYW5kICpwY21kcHRyOworCXN0cnVjdCBjbWRfZHNfODAyXzExX3N1YnNjcmliZV9ldmVudCAqZXZlbnQ7CisJdm9pZCAqcmVzcG9uc2VfYnVmOworCWludCByZXMsIGNtZF9sZW47CisJc3NpemVfdCBwb3MgPSAwOworCXVuc2lnbmVkIGxvbmcgYWRkciA9IGdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKKwljaGFyICpidWYgPSAoY2hhciAqKWFkZHI7CisKKwlyZXMgPSBsaWJlcnRhc19ldmVudF9pbml0Y21kKHByaXYsICZyZXNwb25zZV9idWYsICZwY21kbm9kZSwgJnBjbWRwdHIpOworCWlmIChyZXMgPCAwKSB7CisJCWZyZWVfcGFnZShhZGRyKTsKKwkJcmV0dXJuIHJlczsKKwl9CisKKwlldmVudCA9ICZwY21kcHRyLT5wYXJhbXMuc3Vic2NyaWJlX2V2ZW50OworCWV2ZW50LT5hY3Rpb24gPSBjbWRfYWN0X2dldDsKKwlwY21kcHRyLT5zaXplID0KKwljcHVfdG9fbGUxNihzaXplb2Yoc3RydWN0IGNtZF9kc184MDJfMTFfc3Vic2NyaWJlX2V2ZW50KSArIFNfRFNfR0VOKTsKKwlsaWJlcnRhc19xdWV1ZV9jbWQoYWRhcHRlciwgcGNtZG5vZGUsIDEpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcHJpdi0+bWFpbnRocmVhZC53YWl0cSk7CisKKwkvKiBTbGVlcCB1bnRpbCByZXNwb25zZSBpcyBnZW5lcmF0ZWQgYnkgRlcgKi8KKwl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUocGNtZG5vZGUtPmNtZHdhaXRfcSwKKwkJCQlwY21kbm9kZS0+Y21kd2FpdHF3b2tlbik7CisKKwlwY21kcHRyID0gcmVzcG9uc2VfYnVmOworCisJaWYgKHBjbWRwdHItPnJlc3VsdCkgeworCQlsYnNfcHJfZXJyKCIlczogZmFpbCwgcmVzdWx0PSVkXG4iLCBfX0ZVTkNUSU9OX18sCisJCQlwY21kcHRyLT5yZXN1bHQpOworCQlrZnJlZShyZXNwb25zZV9idWYpOworCQlmcmVlX3BhZ2UoYWRkcik7CisJCXJldHVybiAwOworCX0KKworCWlmIChwY21kcHRyLT5jb21tYW5kICE9IGNtZF9yZXRfODAyXzExX3N1YnNjcmliZV9ldmVudCkgeworCQlsYnNfcHJfZXJyKCJjb21tYW5kIHJlc3BvbnNlIGluY29ycmVjdCFcbiIpOworCQlrZnJlZShyZXNwb25zZV9idWYpOworCQlmcmVlX3BhZ2UoYWRkcik7CisJCXJldHVybiAwOworCX0KKworCWNtZF9sZW4gPSBTX0RTX0dFTiArIHNpemVvZihzdHJ1Y3QgY21kX2RzXzgwMl8xMV9zdWJzY3JpYmVfZXZlbnQpOworCWV2ZW50ID0gKHN0cnVjdCBjbWRfZHNfODAyXzExX3N1YnNjcmliZV9ldmVudCAqKShyZXNwb25zZV9idWYgKyBTX0RTX0dFTik7CisJd2hpbGUgKGNtZF9sZW4gPCBwY21kcHRyLT5zaXplKSB7CisJCXN0cnVjdCBtcnZsaWV0eXBlc2hlYWRlciAqaGVhZGVyID0gKHN0cnVjdCBtcnZsaWV0eXBlc2hlYWRlciAqKShyZXNwb25zZV9idWYgKyBjbWRfbGVuKTsKKwkJc3dpdGNoKGhlYWRlci0+dHlwZSkgeworCQlzdHJ1Y3QgbXJ2bGlldHlwZXNfc25ydGhyZXNob2xkICpMb3dTbnI7CisJCWNhc2UgVExWX1RZUEVfU05SX0xPVzoKKwkJTG93U25yID0gKHN0cnVjdCBtcnZsaWV0eXBlc19zbnJ0aHJlc2hvbGQgKikocmVzcG9uc2VfYnVmICsgY21kX2xlbik7CisJCXBvcyArPSBzbnByaW50ZihidWYrcG9zLCBsZW4tcG9zLCAiJWQgJWQgJWRcbiIsCisJCQkJTG93U25yLT5zbnJ2YWx1ZSwKKwkJCQlMb3dTbnItPnNucmZyZXEsCisJCQkJKGV2ZW50LT5ldmVudHMgJiAweDAwMDIpPzE6MCk7CisJCWRlZmF1bHQ6CisJCQljbWRfbGVuICs9IHNpemVvZihzdHJ1Y3QgbXJ2bGlldHlwZXNfc25ydGhyZXNob2xkKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJa2ZyZWUocmVzcG9uc2VfYnVmKTsKKworCXJlcyA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJidWYsIGNvdW50LCBwcG9zLCBidWYsIHBvcyk7CisJZnJlZV9wYWdlKGFkZHIpOworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGxpYmVydGFzX2xvd3Nucl93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkgICAgY29uc3QgY2hhciBfX3VzZXIgKnVzZXJidWYsCisJCQkJICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXdsYW5fcHJpdmF0ZSAqcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCXNzaXplX3QgcmVzLCBidWZfc2l6ZTsKKwlpbnQgdmFsdWUsIGZyZXEsIHN1YnNjcmliZWQsIGNtZF9sZW47CisJc3RydWN0IGNtZF9jdHJsX25vZGUgKnBjbWRub2RlOworCXN0cnVjdCBjbWRfZHNfY29tbWFuZCAqcGNtZHB0cjsKKwlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9zdWJzY3JpYmVfZXZlbnQgKmV2ZW50OworCXN0cnVjdCBtcnZsaWV0eXBlc19zbnJ0aHJlc2hvbGQgKnNucl90aHJlc2hvbGQ7CisJdm9pZCAqcmVzcG9uc2VfYnVmOworCXUxNiBldmVudF9iaXRtYXA7CisJdTggKnB0cjsKKwl1bnNpZ25lZCBsb25nIGFkZHIgPSBnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7CisJY2hhciAqYnVmID0gKGNoYXIgKilhZGRyOworCisJYnVmX3NpemUgPSBtaW4oY291bnQsIGxlbiAtIDEpOworCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIHVzZXJidWYsIGJ1Zl9zaXplKSkgeworCQlyZXMgPSAtRUZBVUxUOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCXJlcyA9IHNzY2FuZihidWYsICIlZCAlZCAlZCIsICZ2YWx1ZSwgJmZyZXEsICZzdWJzY3JpYmVkKTsKKwlpZiAocmVzICE9IDMpIHsKKwkJcmVzID0gLUVGQVVMVDsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCWV2ZW50X2JpdG1hcCA9IGxpYmVydGFzX2dldF9ldmVudHNfYml0bWFwKHByaXYpOworCisJcmVzID0gbGliZXJ0YXNfZXZlbnRfaW5pdGNtZChwcml2LCAmcmVzcG9uc2VfYnVmLCAmcGNtZG5vZGUsICZwY21kcHRyKTsKKwlpZiAocmVzIDwgMCkKKwkJZ290byBvdXRfdW5sb2NrOworCisJZXZlbnQgPSAmcGNtZHB0ci0+cGFyYW1zLnN1YnNjcmliZV9ldmVudDsKKwlldmVudC0+YWN0aW9uID0gY21kX2FjdF9zZXQ7CisJcGNtZHB0ci0+c2l6ZSA9IGNwdV90b19sZTE2KFNfRFNfR0VOICsKKwkJc2l6ZW9mKHN0cnVjdCBjbWRfZHNfODAyXzExX3N1YnNjcmliZV9ldmVudCkgKworCQlzaXplb2Yoc3RydWN0IG1ydmxpZXR5cGVzX3NucnRocmVzaG9sZCkpOworCWNtZF9sZW4gPSBTX0RTX0dFTiArIHNpemVvZihzdHJ1Y3QgY21kX2RzXzgwMl8xMV9zdWJzY3JpYmVfZXZlbnQpOworCXB0ciA9ICh1OCopIHBjbWRwdHIrY21kX2xlbjsKKwlzbnJfdGhyZXNob2xkID0gKHN0cnVjdCBtcnZsaWV0eXBlc19zbnJ0aHJlc2hvbGQgKikocHRyKTsKKwlzbnJfdGhyZXNob2xkLT5oZWFkZXIudHlwZSA9IGNwdV90b19sZTE2KFRMVl9UWVBFX1NOUl9MT1cpOworCXNucl90aHJlc2hvbGQtPmhlYWRlci5sZW4gPSAyOworCXNucl90aHJlc2hvbGQtPnNucnZhbHVlID0gY3B1X3RvX2xlMTYodmFsdWUpOworCXNucl90aHJlc2hvbGQtPnNucmZyZXEgPSBjcHVfdG9fbGUxNihmcmVxKTsKKwlldmVudF9iaXRtYXAgfD0gc3Vic2NyaWJlZCA/IDB4MDAwMiA6IDB4MDsKKwlldmVudC0+ZXZlbnRzID0gZXZlbnRfYml0bWFwOworCisJbGliZXJ0YXNfcXVldWVfY21kKGFkYXB0ZXIsIHBjbWRub2RlLCAxKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnByaXYtPm1haW50aHJlYWQud2FpdHEpOworCisJLyogU2xlZXAgdW50aWwgcmVzcG9uc2UgaXMgZ2VuZXJhdGVkIGJ5IEZXICovCisJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHBjbWRub2RlLT5jbWR3YWl0X3EsCisJCQkJcGNtZG5vZGUtPmNtZHdhaXRxd29rZW4pOworCisJcGNtZHB0ciA9IHJlc3BvbnNlX2J1ZjsKKworCWlmIChwY21kcHRyLT5yZXN1bHQpIHsKKwkJbGJzX3ByX2VycigiJXM6IGZhaWwsIHJlc3VsdD0lZFxuIiwgX19GVU5DVElPTl9fLAorCQkJcGNtZHB0ci0+cmVzdWx0KTsKKwkJa2ZyZWUocmVzcG9uc2VfYnVmKTsKKwkJZnJlZV9wYWdlKGFkZHIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAocGNtZHB0ci0+Y29tbWFuZCAhPSBjbWRfcmV0XzgwMl8xMV9zdWJzY3JpYmVfZXZlbnQpIHsKKwkJbGJzX3ByX2VycigiY29tbWFuZCByZXNwb25zZSBpbmNvcnJlY3QhXG4iKTsKKwkJa2ZyZWUocmVzcG9uc2VfYnVmKTsKKwkJZnJlZV9wYWdlKGFkZHIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXMgPSBjb3VudDsKKworb3V0X3VubG9jazoKKwlmcmVlX3BhZ2UoYWRkcik7CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIHNzaXplX3QgbGliZXJ0YXNfZmFpbGNvdW50X3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyYnVmLAorCQkJCSAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJd2xhbl9wcml2YXRlICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJc3RydWN0IGNtZF9jdHJsX25vZGUgKnBjbWRub2RlOworCXN0cnVjdCBjbWRfZHNfY29tbWFuZCAqcGNtZHB0cjsKKwlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9zdWJzY3JpYmVfZXZlbnQgKmV2ZW50OworCXZvaWQgKnJlc3BvbnNlX2J1ZjsKKwlpbnQgcmVzLCBjbWRfbGVuOworCXNzaXplX3QgcG9zID0gMDsKKwl1bnNpZ25lZCBsb25nIGFkZHIgPSBnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7CisJY2hhciAqYnVmID0gKGNoYXIgKilhZGRyOworCisJcmVzID0gbGliZXJ0YXNfZXZlbnRfaW5pdGNtZChwcml2LCAmcmVzcG9uc2VfYnVmLCAmcGNtZG5vZGUsICZwY21kcHRyKTsKKwlpZiAocmVzIDwgMCkgeworCQlmcmVlX3BhZ2UoYWRkcik7CisJCXJldHVybiByZXM7CisJfQorCisJZXZlbnQgPSAmcGNtZHB0ci0+cGFyYW1zLnN1YnNjcmliZV9ldmVudDsKKwlldmVudC0+YWN0aW9uID0gY21kX2FjdF9nZXQ7CisJcGNtZHB0ci0+c2l6ZSA9CisJY3B1X3RvX2xlMTYoc2l6ZW9mKHN0cnVjdCBjbWRfZHNfODAyXzExX3N1YnNjcmliZV9ldmVudCkgKyBTX0RTX0dFTik7CisJbGliZXJ0YXNfcXVldWVfY21kKGFkYXB0ZXIsIHBjbWRub2RlLCAxKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnByaXYtPm1haW50aHJlYWQud2FpdHEpOworCisJLyogU2xlZXAgdW50aWwgcmVzcG9uc2UgaXMgZ2VuZXJhdGVkIGJ5IEZXICovCisJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHBjbWRub2RlLT5jbWR3YWl0X3EsCisJCQkJcGNtZG5vZGUtPmNtZHdhaXRxd29rZW4pOworCisJcGNtZHB0ciA9IHJlc3BvbnNlX2J1ZjsKKworCWlmIChwY21kcHRyLT5yZXN1bHQpIHsKKwkJbGJzX3ByX2VycigiJXM6IGZhaWwsIHJlc3VsdD0lZFxuIiwgX19GVU5DVElPTl9fLAorCQkJcGNtZHB0ci0+cmVzdWx0KTsKKwkJa2ZyZWUocmVzcG9uc2VfYnVmKTsKKwkJZnJlZV9wYWdlKGFkZHIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAocGNtZHB0ci0+Y29tbWFuZCAhPSBjbWRfcmV0XzgwMl8xMV9zdWJzY3JpYmVfZXZlbnQpIHsKKwkJbGJzX3ByX2VycigiY29tbWFuZCByZXNwb25zZSBpbmNvcnJlY3QhXG4iKTsKKwkJa2ZyZWUocmVzcG9uc2VfYnVmKTsKKwkJZnJlZV9wYWdlKGFkZHIpOworCQlyZXR1cm4gMDsKKwl9CisKKwljbWRfbGVuID0gU19EU19HRU4gKyBzaXplb2Yoc3RydWN0IGNtZF9kc184MDJfMTFfc3Vic2NyaWJlX2V2ZW50KTsKKwlldmVudCA9IChzdHJ1Y3QgY21kX2RzXzgwMl8xMV9zdWJzY3JpYmVfZXZlbnQgKikocmVzcG9uc2VfYnVmICsgU19EU19HRU4pOworCXdoaWxlIChjbWRfbGVuIDwgcGNtZHB0ci0+c2l6ZSkgeworCQlzdHJ1Y3QgbXJ2bGlldHlwZXNoZWFkZXIgKmhlYWRlciA9IChzdHJ1Y3QgbXJ2bGlldHlwZXNoZWFkZXIgKikocmVzcG9uc2VfYnVmICsgY21kX2xlbik7CisJCXN3aXRjaChoZWFkZXItPnR5cGUpIHsKKwkJc3RydWN0IG1ydmxpZXR5cGVzX2ZhaWx1cmVjb3VudCAqZmFpbGNvdW50OworCQljYXNlIFRMVl9UWVBFX0ZBSUxDT1VOVDoKKwkJZmFpbGNvdW50ID0gKHN0cnVjdCBtcnZsaWV0eXBlc19mYWlsdXJlY291bnQgKikocmVzcG9uc2VfYnVmICsgY21kX2xlbik7CisJCXBvcyArPSBzbnByaW50ZihidWYrcG9zLCBsZW4tcG9zLCAiJWQgJWQgJWRcbiIsCisJCQkJZmFpbGNvdW50LT5mYWlsdmFsdWUsCisJCQkJZmFpbGNvdW50LT5GYWlsZnJlcSwKKwkJCQkoZXZlbnQtPmV2ZW50cyAmIDB4MDAwNCk/MTowKTsKKwkJZGVmYXVsdDoKKwkJCWNtZF9sZW4gKz0gc2l6ZW9mKHN0cnVjdCBtcnZsaWV0eXBlc19mYWlsdXJlY291bnQpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlrZnJlZShyZXNwb25zZV9idWYpOworCXJlcyA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJidWYsIGNvdW50LCBwcG9zLCBidWYsIHBvcyk7CisJZnJlZV9wYWdlKGFkZHIpOworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGxpYmVydGFzX2ZhaWxjb3VudF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkgICAgY29uc3QgY2hhciBfX3VzZXIgKnVzZXJidWYsCisJCQkJICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXdsYW5fcHJpdmF0ZSAqcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCXNzaXplX3QgcmVzLCBidWZfc2l6ZTsKKwlpbnQgdmFsdWUsIGZyZXEsIHN1YnNjcmliZWQsIGNtZF9sZW47CisJc3RydWN0IGNtZF9jdHJsX25vZGUgKnBjbWRub2RlOworCXN0cnVjdCBjbWRfZHNfY29tbWFuZCAqcGNtZHB0cjsKKwlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9zdWJzY3JpYmVfZXZlbnQgKmV2ZW50OworCXN0cnVjdCBtcnZsaWV0eXBlc19mYWlsdXJlY291bnQgKmZhaWxjb3VudDsKKwl2b2lkICpyZXNwb25zZV9idWY7CisJdTE2IGV2ZW50X2JpdG1hcDsKKwl1OCAqcHRyOworCXVuc2lnbmVkIGxvbmcgYWRkciA9IGdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKKwljaGFyICpidWYgPSAoY2hhciAqKWFkZHI7CisKKwlidWZfc2l6ZSA9IG1pbihjb3VudCwgbGVuIC0gMSk7CisJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgdXNlcmJ1ZiwgYnVmX3NpemUpKSB7CisJCXJlcyA9IC1FRkFVTFQ7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisJcmVzID0gc3NjYW5mKGJ1ZiwgIiVkICVkICVkIiwgJnZhbHVlLCAmZnJlcSwgJnN1YnNjcmliZWQpOworCWlmIChyZXMgIT0gMykgeworCQlyZXMgPSAtRUZBVUxUOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJZXZlbnRfYml0bWFwID0gbGliZXJ0YXNfZ2V0X2V2ZW50c19iaXRtYXAocHJpdik7CisKKwlyZXMgPSBsaWJlcnRhc19ldmVudF9pbml0Y21kKHByaXYsICZyZXNwb25zZV9idWYsICZwY21kbm9kZSwgJnBjbWRwdHIpOworCWlmIChyZXMgPCAwKQorCQlnb3RvIG91dF91bmxvY2s7CisKKwlldmVudCA9ICZwY21kcHRyLT5wYXJhbXMuc3Vic2NyaWJlX2V2ZW50OworCWV2ZW50LT5hY3Rpb24gPSBjbWRfYWN0X3NldDsKKwlwY21kcHRyLT5zaXplID0gY3B1X3RvX2xlMTYoU19EU19HRU4gKworCQlzaXplb2Yoc3RydWN0IGNtZF9kc184MDJfMTFfc3Vic2NyaWJlX2V2ZW50KSArCisJCXNpemVvZihzdHJ1Y3QgbXJ2bGlldHlwZXNfZmFpbHVyZWNvdW50KSk7CisJY21kX2xlbiA9IFNfRFNfR0VOICsgc2l6ZW9mKHN0cnVjdCBjbWRfZHNfODAyXzExX3N1YnNjcmliZV9ldmVudCk7CisJcHRyID0gKHU4KikgcGNtZHB0citjbWRfbGVuOworCWZhaWxjb3VudCA9IChzdHJ1Y3QgbXJ2bGlldHlwZXNfZmFpbHVyZWNvdW50ICopKHB0cik7CisJZmFpbGNvdW50LT5oZWFkZXIudHlwZSA9IGNwdV90b19sZTE2KFRMVl9UWVBFX0ZBSUxDT1VOVCk7CisJZmFpbGNvdW50LT5oZWFkZXIubGVuID0gMjsKKwlmYWlsY291bnQtPmZhaWx2YWx1ZSA9IGNwdV90b19sZTE2KHZhbHVlKTsKKwlmYWlsY291bnQtPkZhaWxmcmVxID0gY3B1X3RvX2xlMTYoZnJlcSk7CisJZXZlbnRfYml0bWFwIHw9IHN1YnNjcmliZWQgPyAweDAwMDQgOiAweDA7CisJZXZlbnQtPmV2ZW50cyA9IGV2ZW50X2JpdG1hcDsKKworCWxpYmVydGFzX3F1ZXVlX2NtZChhZGFwdGVyLCBwY21kbm9kZSwgMSk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwcml2LT5tYWludGhyZWFkLndhaXRxKTsKKworCS8qIFNsZWVwIHVudGlsIHJlc3BvbnNlIGlzIGdlbmVyYXRlZCBieSBGVyAqLworCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShwY21kbm9kZS0+Y21kd2FpdF9xLAorCQkJCXBjbWRub2RlLT5jbWR3YWl0cXdva2VuKTsKKworCXBjbWRwdHIgPSAoc3RydWN0IGNtZF9kc19jb21tYW5kICopcmVzcG9uc2VfYnVmOworCisJaWYgKHBjbWRwdHItPnJlc3VsdCkgeworCQlsYnNfcHJfZXJyKCIlczogZmFpbCwgcmVzdWx0PSVkXG4iLCBfX0ZVTkNUSU9OX18sCisJCQlwY21kcHRyLT5yZXN1bHQpOworCQlrZnJlZShyZXNwb25zZV9idWYpOworCQlmcmVlX3BhZ2UoYWRkcik7CisJCXJldHVybiAwOworCX0KKworCWlmIChwY21kcHRyLT5jb21tYW5kICE9IGNtZF9yZXRfODAyXzExX3N1YnNjcmliZV9ldmVudCkgeworCQlsYnNfcHJfZXJyKCJjb21tYW5kIHJlc3BvbnNlIGluY29ycmVjdCFcbiIpOworCQlrZnJlZShyZXNwb25zZV9idWYpOworCQlmcmVlX3BhZ2UoYWRkcik7CisJCXJldHVybiAwOworCX0KKworCXJlcyA9IGNvdW50Oworb3V0X3VubG9jazoKKwlmcmVlX3BhZ2UoYWRkcik7CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIHNzaXplX3QgbGliZXJ0YXNfYmNubWlzc19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcmJ1ZiwKKwkJCQkgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXdsYW5fcHJpdmF0ZSAqcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCXN0cnVjdCBjbWRfY3RybF9ub2RlICpwY21kbm9kZTsKKwlzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKnBjbWRwdHI7CisJc3RydWN0IGNtZF9kc184MDJfMTFfc3Vic2NyaWJlX2V2ZW50ICpldmVudDsKKwl2b2lkICpyZXNwb25zZV9idWY7CisJaW50IHJlcywgY21kX2xlbjsKKwlzc2l6ZV90IHBvcyA9IDA7CisJdW5zaWduZWQgbG9uZyBhZGRyID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOworCWNoYXIgKmJ1ZiA9IChjaGFyICopYWRkcjsKKworCXJlcyA9IGxpYmVydGFzX2V2ZW50X2luaXRjbWQocHJpdiwgJnJlc3BvbnNlX2J1ZiwgJnBjbWRub2RlLCAmcGNtZHB0cik7CisJaWYgKHJlcyA8IDApIHsKKwkJZnJlZV9wYWdlKGFkZHIpOworCQlyZXR1cm4gcmVzOworCX0KKworCWV2ZW50ID0gJnBjbWRwdHItPnBhcmFtcy5zdWJzY3JpYmVfZXZlbnQ7CisJZXZlbnQtPmFjdGlvbiA9IGNtZF9hY3RfZ2V0OworCXBjbWRwdHItPnNpemUgPQorCWNwdV90b19sZTE2KHNpemVvZihzdHJ1Y3QgY21kX2RzXzgwMl8xMV9zdWJzY3JpYmVfZXZlbnQpICsgU19EU19HRU4pOworCWxpYmVydGFzX3F1ZXVlX2NtZChhZGFwdGVyLCBwY21kbm9kZSwgMSk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwcml2LT5tYWludGhyZWFkLndhaXRxKTsKKworCS8qIFNsZWVwIHVudGlsIHJlc3BvbnNlIGlzIGdlbmVyYXRlZCBieSBGVyAqLworCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShwY21kbm9kZS0+Y21kd2FpdF9xLAorCQkJCXBjbWRub2RlLT5jbWR3YWl0cXdva2VuKTsKKworCXBjbWRwdHIgPSByZXNwb25zZV9idWY7CisKKwlpZiAocGNtZHB0ci0+cmVzdWx0KSB7CisJCWxic19wcl9lcnIoIiVzOiBmYWlsLCByZXN1bHQ9JWRcbiIsIF9fRlVOQ1RJT05fXywKKwkJCXBjbWRwdHItPnJlc3VsdCk7CisJCWZyZWVfcGFnZShhZGRyKTsKKwkJa2ZyZWUocmVzcG9uc2VfYnVmKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHBjbWRwdHItPmNvbW1hbmQgIT0gY21kX3JldF84MDJfMTFfc3Vic2NyaWJlX2V2ZW50KSB7CisJCWxic19wcl9lcnIoImNvbW1hbmQgcmVzcG9uc2UgaW5jb3JyZWN0IVxuIik7CisJCWZyZWVfcGFnZShhZGRyKTsKKwkJa2ZyZWUocmVzcG9uc2VfYnVmKTsKKwkJcmV0dXJuIDA7CisJfQorCisJY21kX2xlbiA9IFNfRFNfR0VOICsgc2l6ZW9mKHN0cnVjdCBjbWRfZHNfODAyXzExX3N1YnNjcmliZV9ldmVudCk7CisJZXZlbnQgPSAoc3RydWN0IGNtZF9kc184MDJfMTFfc3Vic2NyaWJlX2V2ZW50ICopKHJlc3BvbnNlX2J1ZiArIFNfRFNfR0VOKTsKKwl3aGlsZSAoY21kX2xlbiA8IHBjbWRwdHItPnNpemUpIHsKKwkJc3RydWN0IG1ydmxpZXR5cGVzaGVhZGVyICpoZWFkZXIgPSAoc3RydWN0IG1ydmxpZXR5cGVzaGVhZGVyICopKHJlc3BvbnNlX2J1ZiArIGNtZF9sZW4pOworCQlzd2l0Y2goaGVhZGVyLT50eXBlKSB7CisJCXN0cnVjdCBtcnZsaWV0eXBlc19iZWFjb25zbWlzc2VkICpiY25taXNzOworCQljYXNlIFRMVl9UWVBFX0JDTk1JU1M6CisJCWJjbm1pc3MgPSAoc3RydWN0IG1ydmxpZXR5cGVzX2JlYWNvbnNtaXNzZWQgKikocmVzcG9uc2VfYnVmICsgY21kX2xlbik7CisJCXBvcyArPSBzbnByaW50ZihidWYrcG9zLCBsZW4tcG9zLCAiJWQgTi9BICVkXG4iLAorCQkJCWJjbm1pc3MtPmJlYWNvbm1pc3NlZCwKKwkJCQkoZXZlbnQtPmV2ZW50cyAmIDB4MDAwOCk/MTowKTsKKwkJZGVmYXVsdDoKKwkJCWNtZF9sZW4gKz0gc2l6ZW9mKHN0cnVjdCBtcnZsaWV0eXBlc19iZWFjb25zbWlzc2VkKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJa2ZyZWUocmVzcG9uc2VfYnVmKTsKKworCXJlcyA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJidWYsIGNvdW50LCBwcG9zLCBidWYsIHBvcyk7CisJZnJlZV9wYWdlKGFkZHIpOworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGxpYmVydGFzX2Jjbm1pc3Nfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJICAgIGNvbnN0IGNoYXIgX191c2VyICp1c2VyYnVmLAorCQkJCSAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwl3bGFuX3ByaXZhdGUgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwlzc2l6ZV90IHJlcywgYnVmX3NpemU7CisJaW50IHZhbHVlLCBmcmVxLCBzdWJzY3JpYmVkLCBjbWRfbGVuOworCXN0cnVjdCBjbWRfY3RybF9ub2RlICpwY21kbm9kZTsKKwlzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKnBjbWRwdHI7CisJc3RydWN0IGNtZF9kc184MDJfMTFfc3Vic2NyaWJlX2V2ZW50ICpldmVudDsKKwlzdHJ1Y3QgbXJ2bGlldHlwZXNfYmVhY29uc21pc3NlZCAqYmNubWlzczsKKwl2b2lkICpyZXNwb25zZV9idWY7CisJdTE2IGV2ZW50X2JpdG1hcDsKKwl1OCAqcHRyOworCXVuc2lnbmVkIGxvbmcgYWRkciA9IGdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKKwljaGFyICpidWYgPSAoY2hhciAqKWFkZHI7CisKKwlidWZfc2l6ZSA9IG1pbihjb3VudCwgbGVuIC0gMSk7CisJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgdXNlcmJ1ZiwgYnVmX3NpemUpKSB7CisJCXJlcyA9IC1FRkFVTFQ7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisJcmVzID0gc3NjYW5mKGJ1ZiwgIiVkICVkICVkIiwgJnZhbHVlLCAmZnJlcSwgJnN1YnNjcmliZWQpOworCWlmIChyZXMgIT0gMykgeworCQlyZXMgPSAtRUZBVUxUOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJZXZlbnRfYml0bWFwID0gbGliZXJ0YXNfZ2V0X2V2ZW50c19iaXRtYXAocHJpdik7CisKKwlyZXMgPSBsaWJlcnRhc19ldmVudF9pbml0Y21kKHByaXYsICZyZXNwb25zZV9idWYsICZwY21kbm9kZSwgJnBjbWRwdHIpOworCWlmIChyZXMgPCAwKQorCQlnb3RvIG91dF91bmxvY2s7CisKKwlldmVudCA9ICZwY21kcHRyLT5wYXJhbXMuc3Vic2NyaWJlX2V2ZW50OworCWV2ZW50LT5hY3Rpb24gPSBjbWRfYWN0X3NldDsKKwlwY21kcHRyLT5zaXplID0gY3B1X3RvX2xlMTYoU19EU19HRU4gKworCQlzaXplb2Yoc3RydWN0IGNtZF9kc184MDJfMTFfc3Vic2NyaWJlX2V2ZW50KSArCisJCXNpemVvZihzdHJ1Y3QgbXJ2bGlldHlwZXNfYmVhY29uc21pc3NlZCkpOworCWNtZF9sZW4gPSBTX0RTX0dFTiArIHNpemVvZihzdHJ1Y3QgY21kX2RzXzgwMl8xMV9zdWJzY3JpYmVfZXZlbnQpOworCXB0ciA9ICh1OCopIHBjbWRwdHIrY21kX2xlbjsKKwliY25taXNzID0gKHN0cnVjdCBtcnZsaWV0eXBlc19iZWFjb25zbWlzc2VkICopKHB0cik7CisJYmNubWlzcy0+aGVhZGVyLnR5cGUgPSBjcHVfdG9fbGUxNihUTFZfVFlQRV9CQ05NSVNTKTsKKwliY25taXNzLT5oZWFkZXIubGVuID0gMjsKKwliY25taXNzLT5iZWFjb25taXNzZWQgPSBjcHVfdG9fbGUxNih2YWx1ZSk7CisJZXZlbnRfYml0bWFwIHw9IHN1YnNjcmliZWQgPyAweDAwMDggOiAweDA7CisJZXZlbnQtPmV2ZW50cyA9IGV2ZW50X2JpdG1hcDsKKworCWxpYmVydGFzX3F1ZXVlX2NtZChhZGFwdGVyLCBwY21kbm9kZSwgMSk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwcml2LT5tYWludGhyZWFkLndhaXRxKTsKKworCS8qIFNsZWVwIHVudGlsIHJlc3BvbnNlIGlzIGdlbmVyYXRlZCBieSBGVyAqLworCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShwY21kbm9kZS0+Y21kd2FpdF9xLAorCQkJCXBjbWRub2RlLT5jbWR3YWl0cXdva2VuKTsKKworCXBjbWRwdHIgPSByZXNwb25zZV9idWY7CisKKwlpZiAocGNtZHB0ci0+cmVzdWx0KSB7CisJCWxic19wcl9lcnIoIiVzOiBmYWlsLCByZXN1bHQ9JWRcbiIsIF9fRlVOQ1RJT05fXywKKwkJCXBjbWRwdHItPnJlc3VsdCk7CisJCWtmcmVlKHJlc3BvbnNlX2J1Zik7CisJCWZyZWVfcGFnZShhZGRyKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHBjbWRwdHItPmNvbW1hbmQgIT0gY21kX3JldF84MDJfMTFfc3Vic2NyaWJlX2V2ZW50KSB7CisJCWxic19wcl9lcnIoImNvbW1hbmQgcmVzcG9uc2UgaW5jb3JyZWN0IVxuIik7CisJCWZyZWVfcGFnZShhZGRyKTsKKwkJa2ZyZWUocmVzcG9uc2VfYnVmKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmVzID0gY291bnQ7CitvdXRfdW5sb2NrOgorCWZyZWVfcGFnZShhZGRyKTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgc3NpemVfdCBsaWJlcnRhc19oaWdocnNzaV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcmJ1ZiwKKwkJCQkgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXdsYW5fcHJpdmF0ZSAqcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCXN0cnVjdCBjbWRfY3RybF9ub2RlICpwY21kbm9kZTsKKwlzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKnBjbWRwdHI7CisJc3RydWN0IGNtZF9kc184MDJfMTFfc3Vic2NyaWJlX2V2ZW50ICpldmVudDsKKwl2b2lkICpyZXNwb25zZV9idWY7CisJaW50IHJlcywgY21kX2xlbjsKKwlzc2l6ZV90IHBvcyA9IDA7CisJdW5zaWduZWQgbG9uZyBhZGRyID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOworCWNoYXIgKmJ1ZiA9IChjaGFyICopYWRkcjsKKworCXJlcyA9IGxpYmVydGFzX2V2ZW50X2luaXRjbWQocHJpdiwgJnJlc3BvbnNlX2J1ZiwgJnBjbWRub2RlLCAmcGNtZHB0cik7CisJaWYgKHJlcyA8IDApIHsKKwkJZnJlZV9wYWdlKGFkZHIpOworCQlyZXR1cm4gcmVzOworCX0KKworCWV2ZW50ID0gJnBjbWRwdHItPnBhcmFtcy5zdWJzY3JpYmVfZXZlbnQ7CisJZXZlbnQtPmFjdGlvbiA9IGNtZF9hY3RfZ2V0OworCXBjbWRwdHItPnNpemUgPQorCWNwdV90b19sZTE2KHNpemVvZihzdHJ1Y3QgY21kX2RzXzgwMl8xMV9zdWJzY3JpYmVfZXZlbnQpICsgU19EU19HRU4pOworCWxpYmVydGFzX3F1ZXVlX2NtZChhZGFwdGVyLCBwY21kbm9kZSwgMSk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwcml2LT5tYWludGhyZWFkLndhaXRxKTsKKworCS8qIFNsZWVwIHVudGlsIHJlc3BvbnNlIGlzIGdlbmVyYXRlZCBieSBGVyAqLworCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShwY21kbm9kZS0+Y21kd2FpdF9xLAorCQkJCXBjbWRub2RlLT5jbWR3YWl0cXdva2VuKTsKKworCXBjbWRwdHIgPSByZXNwb25zZV9idWY7CisKKwlpZiAocGNtZHB0ci0+cmVzdWx0KSB7CisJCWxic19wcl9lcnIoIiVzOiBmYWlsLCByZXN1bHQ9JWRcbiIsIF9fRlVOQ1RJT05fXywKKwkJCXBjbWRwdHItPnJlc3VsdCk7CisJCWtmcmVlKHJlc3BvbnNlX2J1Zik7CisJCWZyZWVfcGFnZShhZGRyKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHBjbWRwdHItPmNvbW1hbmQgIT0gY21kX3JldF84MDJfMTFfc3Vic2NyaWJlX2V2ZW50KSB7CisJCWxic19wcl9lcnIoImNvbW1hbmQgcmVzcG9uc2UgaW5jb3JyZWN0IVxuIik7CisJCWtmcmVlKHJlc3BvbnNlX2J1Zik7CisJCWZyZWVfcGFnZShhZGRyKTsKKwkJcmV0dXJuIDA7CisJfQorCisJY21kX2xlbiA9IFNfRFNfR0VOICsgc2l6ZW9mKHN0cnVjdCBjbWRfZHNfODAyXzExX3N1YnNjcmliZV9ldmVudCk7CisJZXZlbnQgPSAoc3RydWN0IGNtZF9kc184MDJfMTFfc3Vic2NyaWJlX2V2ZW50ICopKHJlc3BvbnNlX2J1ZiArIFNfRFNfR0VOKTsKKwl3aGlsZSAoY21kX2xlbiA8IHBjbWRwdHItPnNpemUpIHsKKwkJc3RydWN0IG1ydmxpZXR5cGVzaGVhZGVyICpoZWFkZXIgPSAoc3RydWN0IG1ydmxpZXR5cGVzaGVhZGVyICopKHJlc3BvbnNlX2J1ZiArIGNtZF9sZW4pOworCQlzd2l0Y2goaGVhZGVyLT50eXBlKSB7CisJCXN0cnVjdCBtcnZsaWV0eXBlc19yc3NpdGhyZXNob2xkICAqSGlnaHJzc2k7CisJCWNhc2UgVExWX1RZUEVfUlNTSV9ISUdIOgorCQlIaWdocnNzaSA9IChzdHJ1Y3QgbXJ2bGlldHlwZXNfcnNzaXRocmVzaG9sZCAqKShyZXNwb25zZV9idWYgKyBjbWRfbGVuKTsKKwkJcG9zICs9IHNucHJpbnRmKGJ1Zitwb3MsIGxlbi1wb3MsICIlZCAlZCAlZFxuIiwKKwkJCQlIaWdocnNzaS0+cnNzaXZhbHVlLAorCQkJCUhpZ2hyc3NpLT5yc3NpZnJlcSwKKwkJCQkoZXZlbnQtPmV2ZW50cyAmIDB4MDAxMCk/MTowKTsKKwkJZGVmYXVsdDoKKwkJCWNtZF9sZW4gKz0gc2l6ZW9mKHN0cnVjdCBtcnZsaWV0eXBlc19zbnJ0aHJlc2hvbGQpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlrZnJlZShyZXNwb25zZV9idWYpOworCisJcmVzID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcmJ1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcG9zKTsKKwlmcmVlX3BhZ2UoYWRkcik7CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIHNzaXplX3QgbGliZXJ0YXNfaGlnaHJzc2lfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJICAgIGNvbnN0IGNoYXIgX191c2VyICp1c2VyYnVmLAorCQkJCSAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwl3bGFuX3ByaXZhdGUgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwlzc2l6ZV90IHJlcywgYnVmX3NpemU7CisJaW50IHZhbHVlLCBmcmVxLCBzdWJzY3JpYmVkLCBjbWRfbGVuOworCXN0cnVjdCBjbWRfY3RybF9ub2RlICpwY21kbm9kZTsKKwlzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKnBjbWRwdHI7CisJc3RydWN0IGNtZF9kc184MDJfMTFfc3Vic2NyaWJlX2V2ZW50ICpldmVudDsKKwlzdHJ1Y3QgbXJ2bGlldHlwZXNfcnNzaXRocmVzaG9sZCAqcnNzaV90aHJlc2hvbGQ7CisJdm9pZCAqcmVzcG9uc2VfYnVmOworCXUxNiBldmVudF9iaXRtYXA7CisJdTggKnB0cjsKKwl1bnNpZ25lZCBsb25nIGFkZHIgPSBnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7CisJY2hhciAqYnVmID0gKGNoYXIgKilhZGRyOworCisJYnVmX3NpemUgPSBtaW4oY291bnQsIGxlbiAtIDEpOworCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIHVzZXJidWYsIGJ1Zl9zaXplKSkgeworCQlyZXMgPSAtRUZBVUxUOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCXJlcyA9IHNzY2FuZihidWYsICIlZCAlZCAlZCIsICZ2YWx1ZSwgJmZyZXEsICZzdWJzY3JpYmVkKTsKKwlpZiAocmVzICE9IDMpIHsKKwkJcmVzID0gLUVGQVVMVDsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCWV2ZW50X2JpdG1hcCA9IGxpYmVydGFzX2dldF9ldmVudHNfYml0bWFwKHByaXYpOworCisJcmVzID0gbGliZXJ0YXNfZXZlbnRfaW5pdGNtZChwcml2LCAmcmVzcG9uc2VfYnVmLCAmcGNtZG5vZGUsICZwY21kcHRyKTsKKwlpZiAocmVzIDwgMCkKKwkJZ290byBvdXRfdW5sb2NrOworCisJZXZlbnQgPSAmcGNtZHB0ci0+cGFyYW1zLnN1YnNjcmliZV9ldmVudDsKKwlldmVudC0+YWN0aW9uID0gY21kX2FjdF9zZXQ7CisJcGNtZHB0ci0+c2l6ZSA9IGNwdV90b19sZTE2KFNfRFNfR0VOICsKKwkJc2l6ZW9mKHN0cnVjdCBjbWRfZHNfODAyXzExX3N1YnNjcmliZV9ldmVudCkgKworCQlzaXplb2Yoc3RydWN0IG1ydmxpZXR5cGVzX3Jzc2l0aHJlc2hvbGQpKTsKKwljbWRfbGVuID0gU19EU19HRU4gKyBzaXplb2Yoc3RydWN0IGNtZF9kc184MDJfMTFfc3Vic2NyaWJlX2V2ZW50KTsKKwlwdHIgPSAodTgqKSBwY21kcHRyK2NtZF9sZW47CisJcnNzaV90aHJlc2hvbGQgPSAoc3RydWN0IG1ydmxpZXR5cGVzX3Jzc2l0aHJlc2hvbGQgKikocHRyKTsKKwlyc3NpX3RocmVzaG9sZC0+aGVhZGVyLnR5cGUgPSBjcHVfdG9fbGUxNihUTFZfVFlQRV9SU1NJX0hJR0gpOworCXJzc2lfdGhyZXNob2xkLT5oZWFkZXIubGVuID0gMjsKKwlyc3NpX3RocmVzaG9sZC0+cnNzaXZhbHVlID0gY3B1X3RvX2xlMTYodmFsdWUpOworCXJzc2lfdGhyZXNob2xkLT5yc3NpZnJlcSA9IGNwdV90b19sZTE2KGZyZXEpOworCWV2ZW50X2JpdG1hcCB8PSBzdWJzY3JpYmVkID8gMHgwMDEwIDogMHgwOworCWV2ZW50LT5ldmVudHMgPSBldmVudF9iaXRtYXA7CisKKwlsaWJlcnRhc19xdWV1ZV9jbWQoYWRhcHRlciwgcGNtZG5vZGUsIDEpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcHJpdi0+bWFpbnRocmVhZC53YWl0cSk7CisKKwkvKiBTbGVlcCB1bnRpbCByZXNwb25zZSBpcyBnZW5lcmF0ZWQgYnkgRlcgKi8KKwl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUocGNtZG5vZGUtPmNtZHdhaXRfcSwKKwkJCQlwY21kbm9kZS0+Y21kd2FpdHF3b2tlbik7CisKKwlwY21kcHRyID0gcmVzcG9uc2VfYnVmOworCisJaWYgKHBjbWRwdHItPnJlc3VsdCkgeworCQlsYnNfcHJfZXJyKCIlczogZmFpbCwgcmVzdWx0PSVkXG4iLCBfX0ZVTkNUSU9OX18sCisJCQlwY21kcHRyLT5yZXN1bHQpOworCQlrZnJlZShyZXNwb25zZV9idWYpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAocGNtZHB0ci0+Y29tbWFuZCAhPSBjbWRfcmV0XzgwMl8xMV9zdWJzY3JpYmVfZXZlbnQpIHsKKwkJbGJzX3ByX2VycigiY29tbWFuZCByZXNwb25zZSBpbmNvcnJlY3QhXG4iKTsKKwkJa2ZyZWUocmVzcG9uc2VfYnVmKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmVzID0gY291bnQ7CitvdXRfdW5sb2NrOgorCWZyZWVfcGFnZShhZGRyKTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgc3NpemVfdCBsaWJlcnRhc19oaWdoc25yX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyYnVmLAorCQkJCSAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJd2xhbl9wcml2YXRlICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJc3RydWN0IGNtZF9jdHJsX25vZGUgKnBjbWRub2RlOworCXN0cnVjdCBjbWRfZHNfY29tbWFuZCAqcGNtZHB0cjsKKwlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9zdWJzY3JpYmVfZXZlbnQgKmV2ZW50OworCXZvaWQgKnJlc3BvbnNlX2J1ZjsKKwlpbnQgcmVzLCBjbWRfbGVuOworCXNzaXplX3QgcG9zID0gMDsKKwl1bnNpZ25lZCBsb25nIGFkZHIgPSBnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7CisJY2hhciAqYnVmID0gKGNoYXIgKilhZGRyOworCisJcmVzID0gbGliZXJ0YXNfZXZlbnRfaW5pdGNtZChwcml2LCAmcmVzcG9uc2VfYnVmLCAmcGNtZG5vZGUsICZwY21kcHRyKTsKKwlpZiAocmVzIDwgMCkgeworCQlmcmVlX3BhZ2UoYWRkcik7CisJCXJldHVybiByZXM7CisJfQorCisJZXZlbnQgPSAmcGNtZHB0ci0+cGFyYW1zLnN1YnNjcmliZV9ldmVudDsKKwlldmVudC0+YWN0aW9uID0gY21kX2FjdF9nZXQ7CisJcGNtZHB0ci0+c2l6ZSA9CisJY3B1X3RvX2xlMTYoc2l6ZW9mKHN0cnVjdCBjbWRfZHNfODAyXzExX3N1YnNjcmliZV9ldmVudCkgKyBTX0RTX0dFTik7CisJbGliZXJ0YXNfcXVldWVfY21kKGFkYXB0ZXIsIHBjbWRub2RlLCAxKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnByaXYtPm1haW50aHJlYWQud2FpdHEpOworCisJLyogU2xlZXAgdW50aWwgcmVzcG9uc2UgaXMgZ2VuZXJhdGVkIGJ5IEZXICovCisJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHBjbWRub2RlLT5jbWR3YWl0X3EsCisJCQkJcGNtZG5vZGUtPmNtZHdhaXRxd29rZW4pOworCisJcGNtZHB0ciA9IHJlc3BvbnNlX2J1ZjsKKworCWlmIChwY21kcHRyLT5yZXN1bHQpIHsKKwkJbGJzX3ByX2VycigiJXM6IGZhaWwsIHJlc3VsdD0lZFxuIiwgX19GVU5DVElPTl9fLAorCQkJcGNtZHB0ci0+cmVzdWx0KTsKKwkJa2ZyZWUocmVzcG9uc2VfYnVmKTsKKwkJZnJlZV9wYWdlKGFkZHIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAocGNtZHB0ci0+Y29tbWFuZCAhPSBjbWRfcmV0XzgwMl8xMV9zdWJzY3JpYmVfZXZlbnQpIHsKKwkJbGJzX3ByX2VycigiY29tbWFuZCByZXNwb25zZSBpbmNvcnJlY3QhXG4iKTsKKwkJa2ZyZWUocmVzcG9uc2VfYnVmKTsKKwkJZnJlZV9wYWdlKGFkZHIpOworCQlyZXR1cm4gMDsKKwl9CisKKwljbWRfbGVuID0gU19EU19HRU4gKyBzaXplb2Yoc3RydWN0IGNtZF9kc184MDJfMTFfc3Vic2NyaWJlX2V2ZW50KTsKKwlldmVudCA9IChzdHJ1Y3QgY21kX2RzXzgwMl8xMV9zdWJzY3JpYmVfZXZlbnQgKikocmVzcG9uc2VfYnVmICsgU19EU19HRU4pOworCXdoaWxlIChjbWRfbGVuIDwgcGNtZHB0ci0+c2l6ZSkgeworCQlzdHJ1Y3QgbXJ2bGlldHlwZXNoZWFkZXIgKmhlYWRlciA9IChzdHJ1Y3QgbXJ2bGlldHlwZXNoZWFkZXIgKikocmVzcG9uc2VfYnVmICsgY21kX2xlbik7CisJCXN3aXRjaChoZWFkZXItPnR5cGUpIHsKKwkJc3RydWN0IG1ydmxpZXR5cGVzX3NucnRocmVzaG9sZCAqSGlnaFNucjsKKwkJY2FzZSBUTFZfVFlQRV9TTlJfSElHSDoKKwkJSGlnaFNuciA9IChzdHJ1Y3QgbXJ2bGlldHlwZXNfc25ydGhyZXNob2xkICopKHJlc3BvbnNlX2J1ZiArIGNtZF9sZW4pOworCQlwb3MgKz0gc25wcmludGYoYnVmK3BvcywgbGVuLXBvcywgIiVkICVkICVkXG4iLAorCQkJCUhpZ2hTbnItPnNucnZhbHVlLAorCQkJCUhpZ2hTbnItPnNucmZyZXEsCisJCQkJKGV2ZW50LT5ldmVudHMgJiAweDAwMjApPzE6MCk7CisJCWRlZmF1bHQ6CisJCQljbWRfbGVuICs9IHNpemVvZihzdHJ1Y3QgbXJ2bGlldHlwZXNfc25ydGhyZXNob2xkKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJa2ZyZWUocmVzcG9uc2VfYnVmKTsKKworCXJlcyA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJidWYsIGNvdW50LCBwcG9zLCBidWYsIHBvcyk7CisJZnJlZV9wYWdlKGFkZHIpOworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGxpYmVydGFzX2hpZ2hzbnJfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJICAgIGNvbnN0IGNoYXIgX191c2VyICp1c2VyYnVmLAorCQkJCSAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwl3bGFuX3ByaXZhdGUgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwlzc2l6ZV90IHJlcywgYnVmX3NpemU7CisJaW50IHZhbHVlLCBmcmVxLCBzdWJzY3JpYmVkLCBjbWRfbGVuOworCXN0cnVjdCBjbWRfY3RybF9ub2RlICpwY21kbm9kZTsKKwlzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKnBjbWRwdHI7CisJc3RydWN0IGNtZF9kc184MDJfMTFfc3Vic2NyaWJlX2V2ZW50ICpldmVudDsKKwlzdHJ1Y3QgbXJ2bGlldHlwZXNfc25ydGhyZXNob2xkICpzbnJfdGhyZXNob2xkOworCXZvaWQgKnJlc3BvbnNlX2J1ZjsKKwl1MTYgZXZlbnRfYml0bWFwOworCXU4ICpwdHI7CisJdW5zaWduZWQgbG9uZyBhZGRyID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOworCWNoYXIgKmJ1ZiA9IChjaGFyICopYWRkcjsKKworCWJ1Zl9zaXplID0gbWluKGNvdW50LCBsZW4gLSAxKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCB1c2VyYnVmLCBidWZfc2l6ZSkpIHsKKwkJcmVzID0gLUVGQVVMVDsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKwlyZXMgPSBzc2NhbmYoYnVmLCAiJWQgJWQgJWQiLCAmdmFsdWUsICZmcmVxLCAmc3Vic2NyaWJlZCk7CisJaWYgKHJlcyAhPSAzKSB7CisJCXJlcyA9IC1FRkFVTFQ7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwlldmVudF9iaXRtYXAgPSBsaWJlcnRhc19nZXRfZXZlbnRzX2JpdG1hcChwcml2KTsKKworCXJlcyA9IGxpYmVydGFzX2V2ZW50X2luaXRjbWQocHJpdiwgJnJlc3BvbnNlX2J1ZiwgJnBjbWRub2RlLCAmcGNtZHB0cik7CisJaWYgKHJlcyA8IDApCisJCWdvdG8gb3V0X3VubG9jazsKKworCWV2ZW50ID0gJnBjbWRwdHItPnBhcmFtcy5zdWJzY3JpYmVfZXZlbnQ7CisJZXZlbnQtPmFjdGlvbiA9IGNtZF9hY3Rfc2V0OworCXBjbWRwdHItPnNpemUgPSBjcHVfdG9fbGUxNihTX0RTX0dFTiArCisJCXNpemVvZihzdHJ1Y3QgY21kX2RzXzgwMl8xMV9zdWJzY3JpYmVfZXZlbnQpICsKKwkJc2l6ZW9mKHN0cnVjdCBtcnZsaWV0eXBlc19zbnJ0aHJlc2hvbGQpKTsKKwljbWRfbGVuID0gU19EU19HRU4gKyBzaXplb2Yoc3RydWN0IGNtZF9kc184MDJfMTFfc3Vic2NyaWJlX2V2ZW50KTsKKwlwdHIgPSAodTgqKSBwY21kcHRyK2NtZF9sZW47CisJc25yX3RocmVzaG9sZCA9IChzdHJ1Y3QgbXJ2bGlldHlwZXNfc25ydGhyZXNob2xkICopKHB0cik7CisJc25yX3RocmVzaG9sZC0+aGVhZGVyLnR5cGUgPSBjcHVfdG9fbGUxNihUTFZfVFlQRV9TTlJfSElHSCk7CisJc25yX3RocmVzaG9sZC0+aGVhZGVyLmxlbiA9IDI7CisJc25yX3RocmVzaG9sZC0+c25ydmFsdWUgPSBjcHVfdG9fbGUxNih2YWx1ZSk7CisJc25yX3RocmVzaG9sZC0+c25yZnJlcSA9IGNwdV90b19sZTE2KGZyZXEpOworCWV2ZW50X2JpdG1hcCB8PSBzdWJzY3JpYmVkID8gMHgwMDIwIDogMHgwOworCWV2ZW50LT5ldmVudHMgPSBldmVudF9iaXRtYXA7CisKKwlsaWJlcnRhc19xdWV1ZV9jbWQoYWRhcHRlciwgcGNtZG5vZGUsIDEpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcHJpdi0+bWFpbnRocmVhZC53YWl0cSk7CisKKwkvKiBTbGVlcCB1bnRpbCByZXNwb25zZSBpcyBnZW5lcmF0ZWQgYnkgRlcgKi8KKwl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUocGNtZG5vZGUtPmNtZHdhaXRfcSwKKwkJCQlwY21kbm9kZS0+Y21kd2FpdHF3b2tlbik7CisKKwlwY21kcHRyID0gcmVzcG9uc2VfYnVmOworCisJaWYgKHBjbWRwdHItPnJlc3VsdCkgeworCQlsYnNfcHJfZXJyKCIlczogZmFpbCwgcmVzdWx0PSVkXG4iLCBfX0ZVTkNUSU9OX18sCisJCQlwY21kcHRyLT5yZXN1bHQpOworCQlrZnJlZShyZXNwb25zZV9idWYpOworCQlmcmVlX3BhZ2UoYWRkcik7CisJCXJldHVybiAwOworCX0KKworCWlmIChwY21kcHRyLT5jb21tYW5kICE9IGNtZF9yZXRfODAyXzExX3N1YnNjcmliZV9ldmVudCkgeworCQlsYnNfcHJfZXJyKCJjb21tYW5kIHJlc3BvbnNlIGluY29ycmVjdCFcbiIpOworCQlrZnJlZShyZXNwb25zZV9idWYpOworCQlmcmVlX3BhZ2UoYWRkcik7CisJCXJldHVybiAwOworCX0KKworCXJlcyA9IGNvdW50Oworb3V0X3VubG9jazoKKwlmcmVlX3BhZ2UoYWRkcik7CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIHNzaXplX3QgbGliZXJ0YXNfcmRtYWNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJidWYsCisJCQkJICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwl3bGFuX3ByaXZhdGUgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwlzdHJ1Y3Qgd2xhbl9vZmZzZXRfdmFsdWUgb2ZmdmFsOworCXNzaXplX3QgcG9zID0gMDsKKwlpbnQgcmV0OworCXVuc2lnbmVkIGxvbmcgYWRkciA9IGdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKKwljaGFyICpidWYgPSAoY2hhciAqKWFkZHI7CisKKwlvZmZ2YWwub2Zmc2V0ID0gcHJpdi0+bWFjX29mZnNldDsKKwlvZmZ2YWwudmFsdWUgPSAwOworCisJcmV0ID0gbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsCisJCQkJY21kX21hY19yZWdfYWNjZXNzLCAwLAorCQkJCWNtZF9vcHRpb25fd2FpdGZvcnJzcCwgMCwgJm9mZnZhbCk7CisJbWRlbGF5KDEwKTsKKwlwb3MgKz0gc25wcmludGYoYnVmK3BvcywgbGVuLXBvcywgIk1BQ1sweCV4XSA9IDB4JTA4eFxuIiwKKwkJCQlwcml2LT5tYWNfb2Zmc2V0LCBhZGFwdGVyLT5vZmZzZXR2YWx1ZS52YWx1ZSk7CisKKwlyZXQgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyYnVmLCBjb3VudCwgcHBvcywgYnVmLCBwb3MpOworCWZyZWVfcGFnZShhZGRyKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBsaWJlcnRhc19yZG1hY193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkgICAgY29uc3QgY2hhciBfX3VzZXIgKnVzZXJidWYsCisJCQkJICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXdsYW5fcHJpdmF0ZSAqcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzc2l6ZV90IHJlcywgYnVmX3NpemU7CisJdW5zaWduZWQgbG9uZyBhZGRyID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOworCWNoYXIgKmJ1ZiA9IChjaGFyICopYWRkcjsKKworCWJ1Zl9zaXplID0gbWluKGNvdW50LCBsZW4gLSAxKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCB1c2VyYnVmLCBidWZfc2l6ZSkpIHsKKwkJcmVzID0gLUVGQVVMVDsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKwlwcml2LT5tYWNfb2Zmc2V0ID0gc2ltcGxlX3N0cnRvdWwoKGNoYXIgKilidWYsIE5VTEwsIDE2KTsKKwlyZXMgPSBjb3VudDsKK291dF91bmxvY2s6CisJZnJlZV9wYWdlKGFkZHIpOworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGxpYmVydGFzX3dybWFjX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCSAgICBjb25zdCBjaGFyIF9fdXNlciAqdXNlcmJ1ZiwKKwkJCQkgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisKKwl3bGFuX3ByaXZhdGUgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3NpemVfdCByZXMsIGJ1Zl9zaXplOworCXUzMiBvZmZzZXQsIHZhbHVlOworCXN0cnVjdCB3bGFuX29mZnNldF92YWx1ZSBvZmZ2YWw7CisJdW5zaWduZWQgbG9uZyBhZGRyID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOworCWNoYXIgKmJ1ZiA9IChjaGFyICopYWRkcjsKKworCWJ1Zl9zaXplID0gbWluKGNvdW50LCBsZW4gLSAxKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCB1c2VyYnVmLCBidWZfc2l6ZSkpIHsKKwkJcmVzID0gLUVGQVVMVDsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKwlyZXMgPSBzc2NhbmYoYnVmLCAiJXggJXgiLCAmb2Zmc2V0LCAmdmFsdWUpOworCWlmIChyZXMgIT0gMikgeworCQlyZXMgPSAtRUZBVUxUOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJb2ZmdmFsLm9mZnNldCA9IG9mZnNldDsKKwlvZmZ2YWwudmFsdWUgPSB2YWx1ZTsKKwlyZXMgPSBsaWJlcnRhc19wcmVwYXJlX2FuZF9zZW5kX2NvbW1hbmQocHJpdiwKKwkJCQljbWRfbWFjX3JlZ19hY2Nlc3MsIDEsCisJCQkJY21kX29wdGlvbl93YWl0Zm9ycnNwLCAwLCAmb2ZmdmFsKTsKKwltZGVsYXkoMTApOworCisJcmVzID0gY291bnQ7CitvdXRfdW5sb2NrOgorCWZyZWVfcGFnZShhZGRyKTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgc3NpemVfdCBsaWJlcnRhc19yZGJicF9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcmJ1ZiwKKwkJCQkgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXdsYW5fcHJpdmF0ZSAqcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCXN0cnVjdCB3bGFuX29mZnNldF92YWx1ZSBvZmZ2YWw7CisJc3NpemVfdCBwb3MgPSAwOworCWludCByZXQ7CisJdW5zaWduZWQgbG9uZyBhZGRyID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOworCWNoYXIgKmJ1ZiA9IChjaGFyICopYWRkcjsKKworCW9mZnZhbC5vZmZzZXQgPSBwcml2LT5iYnBfb2Zmc2V0OworCW9mZnZhbC52YWx1ZSA9IDA7CisKKwlyZXQgPSBsaWJlcnRhc19wcmVwYXJlX2FuZF9zZW5kX2NvbW1hbmQocHJpdiwKKwkJCQljbWRfYmJwX3JlZ19hY2Nlc3MsIDAsCisJCQkJY21kX29wdGlvbl93YWl0Zm9ycnNwLCAwLCAmb2ZmdmFsKTsKKwltZGVsYXkoMTApOworCXBvcyArPSBzbnByaW50ZihidWYrcG9zLCBsZW4tcG9zLCAiQkJQWzB4JXhdID0gMHglMDh4XG4iLAorCQkJCXByaXYtPmJicF9vZmZzZXQsIGFkYXB0ZXItPm9mZnNldHZhbHVlLnZhbHVlKTsKKworCXJldCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJidWYsIGNvdW50LCBwcG9zLCBidWYsIHBvcyk7CisJZnJlZV9wYWdlKGFkZHIpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgbGliZXJ0YXNfcmRiYnBfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJICAgIGNvbnN0IGNoYXIgX191c2VyICp1c2VyYnVmLAorCQkJCSAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwl3bGFuX3ByaXZhdGUgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3NpemVfdCByZXMsIGJ1Zl9zaXplOworCXVuc2lnbmVkIGxvbmcgYWRkciA9IGdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKKwljaGFyICpidWYgPSAoY2hhciAqKWFkZHI7CisKKwlidWZfc2l6ZSA9IG1pbihjb3VudCwgbGVuIC0gMSk7CisJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgdXNlcmJ1ZiwgYnVmX3NpemUpKSB7CisJCXJlcyA9IC1FRkFVTFQ7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisJcHJpdi0+YmJwX29mZnNldCA9IHNpbXBsZV9zdHJ0b3VsKChjaGFyICopYnVmLCBOVUxMLCAxNik7CisJcmVzID0gY291bnQ7CitvdXRfdW5sb2NrOgorCWZyZWVfcGFnZShhZGRyKTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgc3NpemVfdCBsaWJlcnRhc193cmJicF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkgICAgY29uc3QgY2hhciBfX3VzZXIgKnVzZXJidWYsCisJCQkJICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCisJd2xhbl9wcml2YXRlICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXNzaXplX3QgcmVzLCBidWZfc2l6ZTsKKwl1MzIgb2Zmc2V0LCB2YWx1ZTsKKwlzdHJ1Y3Qgd2xhbl9vZmZzZXRfdmFsdWUgb2ZmdmFsOworCXVuc2lnbmVkIGxvbmcgYWRkciA9IGdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKKwljaGFyICpidWYgPSAoY2hhciAqKWFkZHI7CisKKwlidWZfc2l6ZSA9IG1pbihjb3VudCwgbGVuIC0gMSk7CisJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgdXNlcmJ1ZiwgYnVmX3NpemUpKSB7CisJCXJlcyA9IC1FRkFVTFQ7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisJcmVzID0gc3NjYW5mKGJ1ZiwgIiV4ICV4IiwgJm9mZnNldCwgJnZhbHVlKTsKKwlpZiAocmVzICE9IDIpIHsKKwkJcmVzID0gLUVGQVVMVDsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCW9mZnZhbC5vZmZzZXQgPSBvZmZzZXQ7CisJb2ZmdmFsLnZhbHVlID0gdmFsdWU7CisJcmVzID0gbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsCisJCQkJY21kX2JicF9yZWdfYWNjZXNzLCAxLAorCQkJCWNtZF9vcHRpb25fd2FpdGZvcnJzcCwgMCwgJm9mZnZhbCk7CisJbWRlbGF5KDEwKTsKKworCXJlcyA9IGNvdW50Oworb3V0X3VubG9jazoKKwlmcmVlX3BhZ2UoYWRkcik7CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIHNzaXplX3QgbGliZXJ0YXNfcmRyZl9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcmJ1ZiwKKwkJCQkgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXdsYW5fcHJpdmF0ZSAqcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCXN0cnVjdCB3bGFuX29mZnNldF92YWx1ZSBvZmZ2YWw7CisJc3NpemVfdCBwb3MgPSAwOworCWludCByZXQ7CisJdW5zaWduZWQgbG9uZyBhZGRyID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOworCWNoYXIgKmJ1ZiA9IChjaGFyICopYWRkcjsKKworCW9mZnZhbC5vZmZzZXQgPSBwcml2LT5yZl9vZmZzZXQ7CisJb2ZmdmFsLnZhbHVlID0gMDsKKworCXJldCA9IGxpYmVydGFzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZChwcml2LAorCQkJCWNtZF9yZl9yZWdfYWNjZXNzLCAwLAorCQkJCWNtZF9vcHRpb25fd2FpdGZvcnJzcCwgMCwgJm9mZnZhbCk7CisJbWRlbGF5KDEwKTsKKwlwb3MgKz0gc25wcmludGYoYnVmK3BvcywgbGVuLXBvcywgIlJGWzB4JXhdID0gMHglMDh4XG4iLAorCQkJCXByaXYtPnJmX29mZnNldCwgYWRhcHRlci0+b2Zmc2V0dmFsdWUudmFsdWUpOworCisJcmV0ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcmJ1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcG9zKTsKKwlmcmVlX3BhZ2UoYWRkcik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBsaWJlcnRhc19yZHJmX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCSAgICBjb25zdCBjaGFyIF9fdXNlciAqdXNlcmJ1ZiwKKwkJCQkgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJd2xhbl9wcml2YXRlICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXNzaXplX3QgcmVzLCBidWZfc2l6ZTsKKwl1bnNpZ25lZCBsb25nIGFkZHIgPSBnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7CisJY2hhciAqYnVmID0gKGNoYXIgKilhZGRyOworCisJYnVmX3NpemUgPSBtaW4oY291bnQsIGxlbiAtIDEpOworCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIHVzZXJidWYsIGJ1Zl9zaXplKSkgeworCQlyZXMgPSAtRUZBVUxUOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCXByaXYtPnJmX29mZnNldCA9IHNpbXBsZV9zdHJ0b3VsKChjaGFyICopYnVmLCBOVUxMLCAxNik7CisJcmVzID0gY291bnQ7CitvdXRfdW5sb2NrOgorCWZyZWVfcGFnZShhZGRyKTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgc3NpemVfdCBsaWJlcnRhc193cnJmX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCSAgICBjb25zdCBjaGFyIF9fdXNlciAqdXNlcmJ1ZiwKKwkJCQkgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisKKwl3bGFuX3ByaXZhdGUgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3NpemVfdCByZXMsIGJ1Zl9zaXplOworCXUzMiBvZmZzZXQsIHZhbHVlOworCXN0cnVjdCB3bGFuX29mZnNldF92YWx1ZSBvZmZ2YWw7CisJdW5zaWduZWQgbG9uZyBhZGRyID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOworCWNoYXIgKmJ1ZiA9IChjaGFyICopYWRkcjsKKworCWJ1Zl9zaXplID0gbWluKGNvdW50LCBsZW4gLSAxKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCB1c2VyYnVmLCBidWZfc2l6ZSkpIHsKKwkJcmVzID0gLUVGQVVMVDsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKwlyZXMgPSBzc2NhbmYoYnVmLCAiJXggJXgiLCAmb2Zmc2V0LCAmdmFsdWUpOworCWlmIChyZXMgIT0gMikgeworCQlyZXMgPSAtRUZBVUxUOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJb2ZmdmFsLm9mZnNldCA9IG9mZnNldDsKKwlvZmZ2YWwudmFsdWUgPSB2YWx1ZTsKKwlyZXMgPSBsaWJlcnRhc19wcmVwYXJlX2FuZF9zZW5kX2NvbW1hbmQocHJpdiwKKwkJCQljbWRfcmZfcmVnX2FjY2VzcywgMSwKKwkJCQljbWRfb3B0aW9uX3dhaXRmb3Jyc3AsIDAsICZvZmZ2YWwpOworCW1kZWxheSgxMCk7CisKKwlyZXMgPSBjb3VudDsKK291dF91bmxvY2s6CisJZnJlZV9wYWdlKGFkZHIpOworCXJldHVybiByZXM7Cit9CisKKyNkZWZpbmUgRk9QUyhmcmVhZCwgZndyaXRlKSB7IFwKKwkub3duZXIgPSBUSElTX01PRFVMRSwgXAorCS5vcGVuID0gb3Blbl9maWxlX2dlbmVyaWMsIFwKKwkucmVhZCA9IChmcmVhZCksIFwKKwkud3JpdGUgPSAoZndyaXRlKSwgXAorfQorCitzdHJ1Y3QgbGliZXJ0YXNfZGVidWdmc19maWxlcyB7CisJY2hhciAqbmFtZTsKKwlpbnQgcGVybTsKKwlzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZvcHM7Cit9OworCitzdHJ1Y3QgbGliZXJ0YXNfZGVidWdmc19maWxlcyBkZWJ1Z2ZzX2ZpbGVzW10gPSB7CisJeyAiaW5mbyIsIDA0NDQsIEZPUFMobGliZXJ0YXNfZGV2X2luZm8sIHdyaXRlX2ZpbGVfZHVtbXkpLCB9LAorCXsgImdldHNjYW50YWJsZSIsIDA0NDQsIEZPUFMobGliZXJ0YXNfZ2V0c2NhbnRhYmxlLAorCQkJCQl3cml0ZV9maWxlX2R1bW15KSwgfSwKKwl7ICJzbGVlcHBhcmFtcyIsIDA2NDQsIEZPUFMobGliZXJ0YXNfc2xlZXBwYXJhbXNfcmVhZCwKKwkJCQlsaWJlcnRhc19zbGVlcHBhcmFtc193cml0ZSksIH0sCisJeyAiZXh0c2NhbiIsIDA2MDAsIEZPUFMoTlVMTCwgbGliZXJ0YXNfZXh0c2NhbiksIH0sCisJeyAic2V0dXNlcnNjYW4iLCAwNjAwLCBGT1BTKE5VTEwsIGxpYmVydGFzX3NldHVzZXJzY2FuKSwgfSwKK307CisKK3N0cnVjdCBsaWJlcnRhc19kZWJ1Z2ZzX2ZpbGVzIGRlYnVnZnNfZXZlbnRzX2ZpbGVzW10gPSB7CisJeyJsb3dfcnNzaSIsIDA2NDQsIEZPUFMobGliZXJ0YXNfbG93cnNzaV9yZWFkLAorCQkJCWxpYmVydGFzX2xvd3Jzc2lfd3JpdGUpLCB9LAorCXsibG93X3NuciIsIDA2NDQsIEZPUFMobGliZXJ0YXNfbG93c25yX3JlYWQsCisJCQkJbGliZXJ0YXNfbG93c25yX3dyaXRlKSwgfSwKKwl7ImZhaWx1cmVfY291bnQiLCAwNjQ0LCBGT1BTKGxpYmVydGFzX2ZhaWxjb3VudF9yZWFkLAorCQkJCWxpYmVydGFzX2ZhaWxjb3VudF93cml0ZSksIH0sCisJeyJiZWFjb25fbWlzc2VkIiwgMDY0NCwgRk9QUyhsaWJlcnRhc19iY25taXNzX3JlYWQsCisJCQkJbGliZXJ0YXNfYmNubWlzc193cml0ZSksIH0sCisJeyJoaWdoX3Jzc2kiLCAwNjQ0LCBGT1BTKGxpYmVydGFzX2hpZ2hyc3NpX3JlYWQsCisJCQkJbGliZXJ0YXNfaGlnaHJzc2lfd3JpdGUpLCB9LAorCXsiaGlnaF9zbnIiLCAwNjQ0LCBGT1BTKGxpYmVydGFzX2hpZ2hzbnJfcmVhZCwKKwkJCQlsaWJlcnRhc19oaWdoc25yX3dyaXRlKSwgfSwKK307CisKK3N0cnVjdCBsaWJlcnRhc19kZWJ1Z2ZzX2ZpbGVzIGRlYnVnZnNfcmVnc19maWxlc1tdID0geworCXsicmRtYWMiLCAwNjQ0LCBGT1BTKGxpYmVydGFzX3JkbWFjX3JlYWQsIGxpYmVydGFzX3JkbWFjX3dyaXRlKSwgfSwKKwl7IndybWFjIiwgMDYwMCwgRk9QUyhOVUxMLCBsaWJlcnRhc193cm1hY193cml0ZSksIH0sCisJeyJyZGJicCIsIDA2NDQsIEZPUFMobGliZXJ0YXNfcmRiYnBfcmVhZCwgbGliZXJ0YXNfcmRiYnBfd3JpdGUpLCB9LAorCXsid3JiYnAiLCAwNjAwLCBGT1BTKE5VTEwsIGxpYmVydGFzX3dyYmJwX3dyaXRlKSwgfSwKKwl7InJkcmYiLCAwNjQ0LCBGT1BTKGxpYmVydGFzX3JkcmZfcmVhZCwgbGliZXJ0YXNfcmRyZl93cml0ZSksIH0sCisJeyJ3cnJmIiwgMDYwMCwgRk9QUyhOVUxMLCBsaWJlcnRhc193cnJmX3dyaXRlKSwgfSwKK307CisKK3ZvaWQgbGliZXJ0YXNfZGVidWdmc19pbml0KHZvaWQpCit7CisJaWYgKCFsaWJlcnRhc19kaXIpCisJCWxpYmVydGFzX2RpciA9IGRlYnVnZnNfY3JlYXRlX2RpcigibGliZXJ0YXNfd2lyZWxlc3MiLCBOVUxMKTsKKworCXJldHVybjsKK30KKwordm9pZCBsaWJlcnRhc19kZWJ1Z2ZzX3JlbW92ZSh2b2lkKQoreworCWlmIChsaWJlcnRhc19kaXIpCisJCSBkZWJ1Z2ZzX3JlbW92ZShsaWJlcnRhc19kaXIpOworCXJldHVybjsKK30KKwordm9pZCBsaWJlcnRhc19kZWJ1Z2ZzX2luaXRfb25lKHdsYW5fcHJpdmF0ZSAqcHJpdiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgbGliZXJ0YXNfZGVidWdmc19maWxlcyAqZmlsZXM7CisJaWYgKCFsaWJlcnRhc19kaXIpCisJCWdvdG8gZXhpdDsKKworCXByaXYtPmRlYnVnZnNfZGlyID0gZGVidWdmc19jcmVhdGVfZGlyKGRldi0+bmFtZSwgbGliZXJ0YXNfZGlyKTsKKwlpZiAoIXByaXYtPmRlYnVnZnNfZGlyKQorCQlnb3RvIGV4aXQ7CisKKwlmb3IgKGk9MDsgaTxBUlJBWV9TSVpFKGRlYnVnZnNfZmlsZXMpOyBpKyspIHsKKwkJZmlsZXMgPSAmZGVidWdmc19maWxlc1tpXTsKKwkJcHJpdi0+ZGVidWdmc19maWxlc1tpXSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoZmlsZXMtPm5hbWUsCisJCQkJCQkJICAgICBmaWxlcy0+cGVybSwKKwkJCQkJCQkgICAgIHByaXYtPmRlYnVnZnNfZGlyLAorCQkJCQkJCSAgICAgcHJpdiwKKwkJCQkJCQkgICAgICZmaWxlcy0+Zm9wcyk7CisJfQorCisJcHJpdi0+ZXZlbnRzX2RpciA9IGRlYnVnZnNfY3JlYXRlX2Rpcigic3Vic2NyaWJlZF9ldmVudHMiLCBwcml2LT5kZWJ1Z2ZzX2Rpcik7CisJaWYgKCFwcml2LT5ldmVudHNfZGlyKQorCQlnb3RvIGV4aXQ7CisKKwlmb3IgKGk9MDsgaTxBUlJBWV9TSVpFKGRlYnVnZnNfZXZlbnRzX2ZpbGVzKTsgaSsrKSB7CisJCWZpbGVzID0gJmRlYnVnZnNfZXZlbnRzX2ZpbGVzW2ldOworCQlwcml2LT5kZWJ1Z2ZzX2V2ZW50c19maWxlc1tpXSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoZmlsZXMtPm5hbWUsCisJCQkJCQkJICAgICBmaWxlcy0+cGVybSwKKwkJCQkJCQkgICAgIHByaXYtPmV2ZW50c19kaXIsCisJCQkJCQkJICAgICBwcml2LAorCQkJCQkJCSAgICAgJmZpbGVzLT5mb3BzKTsKKwl9CisKKwlwcml2LT5yZWdzX2RpciA9IGRlYnVnZnNfY3JlYXRlX2RpcigicmVnaXN0ZXJzIiwgcHJpdi0+ZGVidWdmc19kaXIpOworCWlmICghcHJpdi0+cmVnc19kaXIpCisJCWdvdG8gZXhpdDsKKworCWZvciAoaT0wOyBpPEFSUkFZX1NJWkUoZGVidWdmc19yZWdzX2ZpbGVzKTsgaSsrKSB7CisJCWZpbGVzID0gJmRlYnVnZnNfcmVnc19maWxlc1tpXTsKKwkJcHJpdi0+ZGVidWdmc19yZWdzX2ZpbGVzW2ldID0gZGVidWdmc19jcmVhdGVfZmlsZShmaWxlcy0+bmFtZSwKKwkJCQkJCQkgICAgIGZpbGVzLT5wZXJtLAorCQkJCQkJCSAgICAgcHJpdi0+cmVnc19kaXIsCisJCQkJCQkJICAgICBwcml2LAorCQkJCQkJCSAgICAgJmZpbGVzLT5mb3BzKTsKKwl9CisKKyNpZmRlZiBQUk9DX0RFQlVHCisJbGliZXJ0YXNfZGVidWdfaW5pdChwcml2LCBkZXYpOworI2VuZGlmCitleGl0OgorCXJldHVybjsKK30KKwordm9pZCBsaWJlcnRhc19kZWJ1Z2ZzX3JlbW92ZV9vbmUod2xhbl9wcml2YXRlICpwcml2KQoreworCWludCBpOworCisJZm9yKGk9MDsgaTxBUlJBWV9TSVpFKGRlYnVnZnNfcmVnc19maWxlcyk7IGkrKykKKwkJZGVidWdmc19yZW1vdmUocHJpdi0+ZGVidWdmc19yZWdzX2ZpbGVzW2ldKTsKKworCWRlYnVnZnNfcmVtb3ZlKHByaXYtPnJlZ3NfZGlyKTsKKworCWZvcihpPTA7IGk8QVJSQVlfU0laRShkZWJ1Z2ZzX2ZpbGVzKTsgaSsrKQorCQlkZWJ1Z2ZzX3JlbW92ZShwcml2LT5kZWJ1Z2ZzX2V2ZW50c19maWxlc1tpXSk7CisKKwlkZWJ1Z2ZzX3JlbW92ZShwcml2LT5ldmVudHNfZGlyKTsKKyNpZmRlZiBQUk9DX0RFQlVHCisJZGVidWdmc19yZW1vdmUocHJpdi0+ZGVidWdmc19kZWJ1Zyk7CisjZW5kaWYKKwlmb3IoaT0wOyBpPEFSUkFZX1NJWkUoZGVidWdmc19maWxlcyk7IGkrKykKKwkJZGVidWdmc19yZW1vdmUocHJpdi0+ZGVidWdmc19maWxlc1tpXSk7Cit9CisKKy8qIGRlYnVnIGVudHJ5ICovCisKKyNkZWZpbmUgaXRlbV9zaXplKG4pCShGSUVMRF9TSVpFT0Yod2xhbl9hZGFwdGVyLCBuKSkKKyNkZWZpbmUgaXRlbV9hZGRyKG4pCShvZmZzZXRvZih3bGFuX2FkYXB0ZXIsIG4pKQorCitzdHJ1Y3QgZGVidWdfZGF0YSB7CisJY2hhciBuYW1lWzMyXTsKKwl1MzIgc2l6ZTsKKwl1MzIgYWRkcjsKK307CisKKy8qIFRvIGRlYnVnIGFueSBtZW1iZXIgb2Ygd2xhbl9hZGFwdGVyLCBzaW1wbHkgYWRkIG9uZSBsaW5lIGhlcmUuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZGVidWdfZGF0YSBpdGVtc1tdID0geworCXsiaW50Y291bnRlciIsIGl0ZW1fc2l6ZShpbnRjb3VudGVyKSwgaXRlbV9hZGRyKGludGNvdW50ZXIpfSwKKwl7InBzbW9kZSIsIGl0ZW1fc2l6ZShwc21vZGUpLCBpdGVtX2FkZHIocHNtb2RlKX0sCisJeyJwc3N0YXRlIiwgaXRlbV9zaXplKHBzc3RhdGUpLCBpdGVtX2FkZHIocHNzdGF0ZSl9LAorfTsKKworc3RhdGljIGludCBudW1fb2ZfaXRlbXMgPSBBUlJBWV9TSVpFKGl0ZW1zKTsKKworLyoqCisgKiAgQGJyaWVmIHByb2MgcmVhZCBmdW5jdGlvbgorICoKKyAqICBAcGFyYW0gcGFnZQkgICBwb2ludGVyIHRvIGJ1ZmZlcgorICogIEBwYXJhbSBzICAgICAgIHJlYWQgZGF0YSBzdGFydGluZyBwb3NpdGlvbgorICogIEBwYXJhbSBvZmYgICAgIG9mZnNldAorICogIEBwYXJhbSBjbnQgICAgIGNvdW50ZXIKKyAqICBAcGFyYW0gZW9mICAgICBlbmQgb2YgZmlsZSBmbGFnCisgKiAgQHBhcmFtIGRhdGEgICAgZGF0YSB0byBvdXRwdXQKKyAqICBAcmV0dXJuIAkgICBudW1iZXIgb2Ygb3V0cHV0IGRhdGEKKyAqLworc3RhdGljIHNzaXplX3Qgd2xhbl9kZWJ1Z2ZzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyYnVmLAorCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJaW50IHZhbCA9IDA7CisJc2l6ZV90IHBvcyA9IDA7CisJc3NpemVfdCByZXM7CisJY2hhciAqcDsKKwlpbnQgaTsKKwlzdHJ1Y3QgZGVidWdfZGF0YSAqZDsKKwl1bnNpZ25lZCBsb25nIGFkZHIgPSBnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7CisJY2hhciAqYnVmID0gKGNoYXIgKilhZGRyOworCisJcCA9IGJ1ZjsKKworCWQgPSAoc3RydWN0IGRlYnVnX2RhdGEgKilmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX29mX2l0ZW1zOyBpKyspIHsKKwkJaWYgKGRbaV0uc2l6ZSA9PSAxKQorCQkJdmFsID0gKigodTggKikgZFtpXS5hZGRyKTsKKwkJZWxzZSBpZiAoZFtpXS5zaXplID09IDIpCisJCQl2YWwgPSAqKCh1MTYgKikgZFtpXS5hZGRyKTsKKwkJZWxzZSBpZiAoZFtpXS5zaXplID09IDQpCisJCQl2YWwgPSAqKCh1MzIgKikgZFtpXS5hZGRyKTsKKworCQlwb3MgKz0gc3ByaW50ZihwICsgcG9zLCAiJXM9JWRcbiIsIGRbaV0ubmFtZSwgdmFsKTsKKwl9CisKKwlyZXMgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyYnVmLCBjb3VudCwgcHBvcywgcCwgcG9zKTsKKworCWZyZWVfcGFnZShhZGRyKTsKKwlyZXR1cm4gcmVzOworfQorCisvKioKKyAqICBAYnJpZWYgcHJvYyB3cml0ZSBmdW5jdGlvbgorICoKKyAqICBAcGFyYW0gZgkgICBmaWxlIHBvaW50ZXIKKyAqICBAcGFyYW0gYnVmICAgICBwb2ludGVyIHRvIGRhdGEgYnVmZmVyCisgKiAgQHBhcmFtIGNudCAgICAgZGF0YSBudW1iZXIgdG8gd3JpdGUKKyAqICBAcGFyYW0gZGF0YSAgICBkYXRhIHRvIHdyaXRlCisgKiAgQHJldHVybiAJICAgbnVtYmVyIG9mIGRhdGEKKyAqLworc3RhdGljIGludCB3bGFuX2RlYnVnZnNfd3JpdGUoc3RydWN0IGZpbGUgKmYsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJCQkgICAgc2l6ZV90IGNudCwgbG9mZl90ICpwcG9zKQoreworCWludCByLCBpOworCWNoYXIgKnBkYXRhOworCWNoYXIgKnA7CisJY2hhciAqcDA7CisJY2hhciAqcDE7CisJY2hhciAqcDI7CisJc3RydWN0IGRlYnVnX2RhdGEgKmQgPSAoc3RydWN0IGRlYnVnX2RhdGEgKilmLT5wcml2YXRlX2RhdGE7CisKKwlwZGF0YSA9IChjaGFyICopa21hbGxvYyhjbnQsIEdGUF9LRVJORUwpOworCWlmIChwZGF0YSA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCWlmIChjb3B5X2Zyb21fdXNlcihwZGF0YSwgYnVmLCBjbnQpKSB7CisJCWxic19wcl9kZWJ1ZygxLCAiQ29weSBmcm9tIHVzZXIgZmFpbGVkXG4iKTsKKwkJa2ZyZWUocGRhdGEpOworCQlyZXR1cm4gMDsKKwl9CisKKwlwMCA9IHBkYXRhOworCWZvciAoaSA9IDA7IGkgPCBudW1fb2ZfaXRlbXM7IGkrKykgeworCQlkbyB7CisJCQlwID0gc3Ryc3RyKHAwLCBkW2ldLm5hbWUpOworCQkJaWYgKHAgPT0gTlVMTCkKKwkJCQlicmVhazsKKwkJCXAxID0gc3RyY2hyKHAsICdcbicpOworCQkJaWYgKHAxID09IE5VTEwpCisJCQkJYnJlYWs7CisJCQlwMCA9IHAxKys7CisJCQlwMiA9IHN0cmNocihwLCAnPScpOworCQkJaWYgKCFwMikKKwkJCQlicmVhazsKKwkJCXAyKys7CisJCQlyID0gc2ltcGxlX3N0cnRvdWwocDIsIE5VTEwsIDApOworCQkJaWYgKGRbaV0uc2l6ZSA9PSAxKQorCQkJCSooKHU4ICopIGRbaV0uYWRkcikgPSAodTgpIHI7CisJCQllbHNlIGlmIChkW2ldLnNpemUgPT0gMikKKwkJCQkqKCh1MTYgKikgZFtpXS5hZGRyKSA9ICh1MTYpIHI7CisJCQllbHNlIGlmIChkW2ldLnNpemUgPT0gNCkKKwkJCQkqKCh1MzIgKikgZFtpXS5hZGRyKSA9ICh1MzIpIHI7CisJCQlicmVhazsKKwkJfSB3aGlsZSAoMSk7CisJfQorCWtmcmVlKHBkYXRhKTsKKworCXJldHVybiBjbnQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGxpYmVydGFzX2RlYnVnX2ZvcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLm9wZW4gPSBvcGVuX2ZpbGVfZ2VuZXJpYywKKwkud3JpdGUgPSB3bGFuX2RlYnVnZnNfd3JpdGUsCisJLnJlYWQgPSB3bGFuX2RlYnVnZnNfcmVhZCwKK307CisKKy8qKgorICogIEBicmllZiBjcmVhdGUgZGVidWcgcHJvYyBmaWxlCisgKgorICogIEBwYXJhbSBwcml2CSAgIHBvaW50ZXIgd2xhbl9wcml2YXRlCisgKiAgQHBhcmFtIGRldiAgICAgcG9pbnRlciBuZXRfZGV2aWNlCisgKiAgQHJldHVybiAJICAgTi9BCisgKi8KK3ZvaWQgbGliZXJ0YXNfZGVidWdfaW5pdCh3bGFuX3ByaXZhdGUgKiBwcml2LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpOworCisJaWYgKCFwcml2LT5kZWJ1Z2ZzX2RpcikKKwkJcmV0dXJuOworCisJZm9yIChpID0gMDsgaSA8IG51bV9vZl9pdGVtczsgaSsrKQorCQlpdGVtc1tpXS5hZGRyICs9ICh1MzIpIHByaXYtPmFkYXB0ZXI7CisKKwlwcml2LT5kZWJ1Z2ZzX2RlYnVnID0gZGVidWdmc19jcmVhdGVfZmlsZSgiZGVidWciLCAwNjQ0LAorCQkJCQkJICBwcml2LT5kZWJ1Z2ZzX2RpciwgJml0ZW1zWzBdLAorCQkJCQkJICAmbGliZXJ0YXNfZGVidWdfZm9wcyk7Cit9CisKKy8qKgorICogIEBicmllZiByZW1vdmUgcHJvYyBmaWxlCisgKgorICogIEBwYXJhbSBwcml2CSAgIHBvaW50ZXIgd2xhbl9wcml2YXRlCisgKiAgQHJldHVybiAJICAgTi9BCisgKi8KK3ZvaWQgbGliZXJ0YXNfZGVidWdfcmVtb3ZlKHdsYW5fcHJpdmF0ZSAqIHByaXYpCit7CisJZGVidWdmc19yZW1vdmUocHJpdi0+ZGVidWdmc19kZWJ1Zyk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9kZWJ1Z2ZzLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9kZWJ1Z2ZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgwYTExYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2RlYnVnZnMuaApAQCAtMCwwICsxLDYgQEAKK3ZvaWQgbGliZXJ0YXNfZGVidWdmc19pbml0KHZvaWQpOwordm9pZCBsaWJlcnRhc19kZWJ1Z2ZzX3JlbW92ZSh2b2lkKTsKKwordm9pZCBsaWJlcnRhc19kZWJ1Z2ZzX2luaXRfb25lKHdsYW5fcHJpdmF0ZSAqcHJpdiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIGxpYmVydGFzX2RlYnVnZnNfcmVtb3ZlX29uZSh3bGFuX3ByaXZhdGUgKnByaXYpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9kZWNsLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9kZWNsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA2YmRkMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2RlY2wuaApAQCAtMCwwICsxLDgzIEBACisvKioKKyAgKiAgVGhpcyBmaWxlIGNvbnRhaW5zIGRlY2xhcmF0aW9uIHJlZmVycmluZyB0bworICAqICBmdW5jdGlvbnMgZGVmaW5lZCBpbiBvdGhlciBzb3VyY2UgZmlsZXMKKyAgKi8KKworI2lmbmRlZiBfV0xBTl9ERUNMX0hfCisjZGVmaW5lIF9XTEFOX0RFQ0xfSF8KKworI2luY2x1ZGUgImRlZnMuaCIKKworLyoqIEZ1bmN0aW9uIFByb3RvdHlwZSBEZWNsYXJhdGlvbiAqLworc3RydWN0IHdsYW5fcHJpdmF0ZTsKK3N0cnVjdCBza19idWZmOworc3RydWN0IG5ldF9kZXZpY2U7CisKK2V4dGVybiBjaGFyICpsaWJlcnRhc19md19uYW1lOworCit2b2lkIGxpYmVydGFzX2ZyZWVfYWRhcHRlcih3bGFuX3ByaXZhdGUgKiBwcml2KTsKK2ludCBsaWJlcnRhc19zZXRfbWFjX3BhY2tldF9maWx0ZXIod2xhbl9wcml2YXRlICogcHJpdik7CisKK2ludCBsaWJlcnRhc19zZW5kX251bGxfcGFja2V0KHdsYW5fcHJpdmF0ZSAqIHByaXYsIHU4IHB3cl9tZ210KTsKK3ZvaWQgbGliZXJ0YXNfc2VuZF90eF9mZWVkYmFjayh3bGFuX3ByaXZhdGUgKiBwcml2KTsKK3U4IGxpYmVydGFzX2NoZWNrX2xhc3RfcGFja2V0X2luZGljYXRpb24od2xhbl9wcml2YXRlICogcHJpdik7CisKK2ludCBsaWJlcnRhc19mcmVlX2NtZF9idWZmZXIod2xhbl9wcml2YXRlICogcHJpdik7CitzdHJ1Y3QgY21kX2N0cmxfbm9kZTsKK3N0cnVjdCBjbWRfY3RybF9ub2RlICpsaWJlcnRhc19nZXRfZnJlZV9jbWRfY3RybF9ub2RlKHdsYW5fcHJpdmF0ZSAqIHByaXYpOworCit2b2lkIGxpYmVydGFzX3NldF9jbWRfY3RybF9ub2RlKHdsYW5fcHJpdmF0ZSAqIHByaXYsCisJCSAgICBzdHJ1Y3QgY21kX2N0cmxfbm9kZSAqcHRlbXBub2RlLAorCQkgICAgdTMyIGNtZF9vaWQsIHUxNiB3YWl0X29wdGlvbiwgdm9pZCAqcGRhdGFfYnVmKTsKKworaW50IGxpYmVydGFzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZCh3bGFuX3ByaXZhdGUgKiBwcml2LAorCQkJICB1MTYgY21kX25vLAorCQkJICB1MTYgY21kX2FjdGlvbiwKKwkJCSAgdTE2IHdhaXRfb3B0aW9uLCB1MzIgY21kX29pZCwgdm9pZCAqcGRhdGFfYnVmKTsKKwordm9pZCBsaWJlcnRhc19xdWV1ZV9jbWQod2xhbl9hZGFwdGVyICogYWRhcHRlciwgc3RydWN0IGNtZF9jdHJsX25vZGUgKmNtZG5vZGUsIHU4IGFkZHRhaWwpOworCitpbnQgbGliZXJ0YXNfYWxsb2NhdGVfY21kX2J1ZmZlcih3bGFuX3ByaXZhdGUgKiBwcml2KTsKK2ludCBsaWJlcnRhc19leGVjdXRlX25leHRfY29tbWFuZCh3bGFuX3ByaXZhdGUgKiBwcml2KTsKK2ludCBsaWJlcnRhc19wcm9jZXNzX2V2ZW50KHdsYW5fcHJpdmF0ZSAqIHByaXYpOwordm9pZCBsaWJlcnRhc19pbnRlcnJ1cHQoc3RydWN0IG5ldF9kZXZpY2UgKik7CitpbnQgbGliZXJ0YXNfc2V0X3JhZGlvX2NvbnRyb2wod2xhbl9wcml2YXRlICogcHJpdik7Cit1MzIgbGliZXJ0YXNfaW5kZXhfdG9fZGF0YV9yYXRlKHU4IGluZGV4KTsKK3U4IGxpYmVydGFzX2RhdGFfcmF0ZV90b19pbmRleCh1MzIgcmF0ZSk7Cit2b2lkIGxpYmVydGFzX2dldF9md3ZlcnNpb24od2xhbl9hZGFwdGVyICogYWRhcHRlciwgY2hhciAqZnd2ZXJzaW9uLCBpbnQgbWF4bGVuKTsKKworaW50IGxpYmVydGFzX3VwbG9hZF9yeF9wYWNrZXQod2xhbl9wcml2YXRlICogcHJpdiwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CisKKy8qKiBUaGUgcHJvYyBmcyBpbnRlcmZhY2UgKi8KK2ludCBsaWJlcnRhc19wcm9jZXNzX3J4X2NvbW1hbmQod2xhbl9wcml2YXRlICogcHJpdik7CitpbnQgbGliZXJ0YXNfcHJvY2Vzc190eCh3bGFuX3ByaXZhdGUgKiBwcml2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3ZvaWQgbGliZXJ0YXNfY2xlYW51cF9hbmRfaW5zZXJ0X2NtZCh3bGFuX3ByaXZhdGUgKiBwcml2LAorCQkJCQlzdHJ1Y3QgY21kX2N0cmxfbm9kZSAqcHRlbXBjbWQpOwordm9pZCBfX2xpYmVydGFzX2NsZWFudXBfYW5kX2luc2VydF9jbWQod2xhbl9wcml2YXRlICogcHJpdiwKKwkJCQkJc3RydWN0IGNtZF9jdHJsX25vZGUgKnB0ZW1wY21kKTsKKworaW50IGxpYmVydGFzX3NldF9yZWdpb250YWJsZSh3bGFuX3ByaXZhdGUgKiBwcml2LCB1OCByZWdpb24sIHU4IGJhbmQpOworCitpbnQgbGliZXJ0YXNfcHJvY2Vzc19yeGVkX3BhY2tldCh3bGFuX3ByaXZhdGUgKiBwcml2LCBzdHJ1Y3Qgc2tfYnVmZiAqKTsKKwordm9pZCBsaWJlcnRhc19wc19zbGVlcCh3bGFuX3ByaXZhdGUgKiBwcml2LCBpbnQgd2FpdF9vcHRpb24pOwordm9pZCBsaWJlcnRhc19wc19jb25maXJtX3NsZWVwKHdsYW5fcHJpdmF0ZSAqIHByaXYsIHUxNiBwc21vZGUpOwordm9pZCBsaWJlcnRhc19wc193YWtldXAod2xhbl9wcml2YXRlICogcHJpdiwgaW50IHdhaXRfb3B0aW9uKTsKKwordm9pZCBsaWJlcnRhc190eF9ydW5xdWV1ZSh3bGFuX3ByaXZhdGUgKnByaXYpOworCitleHRlcm4gc3RydWN0IGNoYW5fZnJlcV9wb3dlciAqbGliZXJ0YXNfZmluZF9jZnBfYnlfYmFuZF9hbmRfY2hhbm5lbCgKKwkJCQl3bGFuX2FkYXB0ZXIgKiBhZGFwdGVyLCB1OCBiYW5kLCB1MTYgY2hhbm5lbCk7CisKK2V4dGVybiB2b2lkIGxpYmVydGFzX21hY19ldmVudF9kaXNjb25uZWN0ZWQod2xhbl9wcml2YXRlICogcHJpdik7CisKK3ZvaWQgbGliZXJ0YXNfc2VuZF9pd2V2Y3VzdG9tX2V2ZW50KHdsYW5fcHJpdmF0ZSAqIHByaXYsIHM4ICogc3RyKTsKKworaW50IHJlc2V0X2RldmljZSh3bGFuX3ByaXZhdGUgKnByaXYpOworLyogbWFpbi5jICovCitleHRlcm4gc3RydWN0IGNoYW5fZnJlcV9wb3dlciAqbGliZXJ0YXNfZ2V0X3JlZ2lvbl9jZnBfdGFibGUodTggcmVnaW9uLCB1OCBiYW5kLAorCQkJCQkJICAgICAgICAgICAgIGludCAqY2ZwX25vKTsKK3dsYW5fcHJpdmF0ZSAqd2xhbl9hZGRfY2FyZCh2b2lkICpjYXJkKTsKK2ludCB3bGFuX3JlbW92ZV9jYXJkKHZvaWQgKmNhcmQpOworCisjZW5kaWYJCQkJLyogX1dMQU5fREVDTF9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvZGVmcy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvZGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiMTQ3OGMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9kZWZzLmgKQEAgLTAsMCArMSwzNjkgQEAKKy8qKgorICAqIFRoaXMgaGVhZGVyIGZpbGUgY29udGFpbnMgZ2xvYmFsIGNvbnN0YW50L2VudW0gZGVmaW5pdGlvbnMsCisgICogZ2xvYmFsIHZhcmlhYmxlIGRlY2xhcmF0aW9uLgorICAqLworI2lmbmRlZiBfV0xBTl9ERUZTX0hfCisjZGVmaW5lIF9XTEFOX0RFRlNfSF8KKworI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKK2V4dGVybiB1bnNpZ25lZCBpbnQgbGliZXJ0YXNfZGVidWc7CisKKyNkZWZpbmUgRFJWX05BTUUJCSJ1c2I4eHh4IgorCisjZGVmaW5lIGxic19wcl9pbmZvKGZvcm1hdCwgYXJncy4uLikgXAorCXByaW50ayhLRVJOX0lORk8gRFJWX05BTUUiOiAiIGZvcm1hdCwgIyMgYXJncykKKyNkZWZpbmUgbGJzX3ByX2Vycihmb3JtYXQsIGFyZ3MuLi4pIFwKKwlwcmludGsoS0VSTl9FUlIgRFJWX05BTUUiOiAiIGZvcm1hdCwgIyMgYXJncykKKyNkZWZpbmUgbGJzX3ByX2FsZXJ0KGZvcm1hdCwgYXJncy4uLikgXAorCXByaW50ayhLRVJOX0FMRVJUIERSVl9OQU1FIjogIiBmb3JtYXQsICMjIGFyZ3MpCisKKyNpZmRlZiBERUJVRworI2RlZmluZSBsYnNfcHJfZGVidWcobGV2ZWwsIGZvcm1hdCwgYXJncy4uLikgXAorCWRvIHsgaWYgKGxpYmVydGFzX2RlYnVnID49IGxldmVsKSBcCisJcHJpbnRrKEtFUk5fSU5GTyBEUlZfTkFNRSI6ICIgZm9ybWF0LCAjI2FyZ3MpOyB9IHdoaWxlICgwKQorI2RlZmluZSBsYnNfZGV2X2RiZyhsZXZlbCwgZGV2aWNlLCBmb3JtYXQsIGFyZ3MuLi4pIFwKKyAgICAgICAgbGJzX3ByX2RlYnVnKGxldmVsLCAiJXM6ICIgZm9ybWF0LCBcCisgICAgICAgIChkZXZpY2UpLT5idXNfaWQgLCAjIyBhcmdzKQorCitzdGF0aWMgaW5saW5lIHZvaWQgbGJzX2RiZ19oZXgoY2hhciAqcHJvbXB0LCB1OCAqIGJ1ZiwgaW50IGxlbikKK3sKKwlpbnQgaSA9IDA7CisKKwlpZiAoIWxpYmVydGFzX2RlYnVnKQorCQlyZXR1cm47CisKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICIsIHByb21wdCk7CisJZm9yIChpID0gMTsgaSA8PSBsZW47IGkrKykgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJTAyeCAiLCAodTgpICogYnVmKTsKKwkJYnVmKys7CisJfQorCXByaW50aygiXG4iKTsKK30KKyNlbHNlCisjZGVmaW5lIGxic19wcl9kZWJ1ZyhsZXZlbCwgZm9ybWF0LCBhcmdzLi4uKQkJZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIGxic19kZXZfZGJnKGxldmVsLCBkZXZpY2UsIGZvcm1hdCwgYXJncy4uLikJZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIGxic19kYmdfaGV4KHgseSx6KQkJCQlkbyB7fSB3aGlsZSAoMCkKKyNlbmRpZgorCisjZGVmaW5lCUVOVEVSKCkJCQlsYnNfcHJfZGVidWcoMSwgIkVudGVyOiAlcywgJXM6JWlcbiIsIFwKKwkJCQkJX19GVU5DVElPTl9fLCBfX0ZJTEVfXywgX19MSU5FX18pCisjZGVmaW5lCUxFQVZFKCkJCQlsYnNfcHJfZGVidWcoMSwgIkxlYXZlOiAlcywgJXM6JWlcbiIsIFwKKwkJCQkJX19GVU5DVElPTl9fLCBfX0ZJTEVfXywgX19MSU5FX18pCisKKy8qKiBCdWZmZXIgQ29uc3RhbnRzICovCisKKy8qCVRoZSBzaXplIG9mIFNRIG1lbW9yeSBQUEEsIERQQSBhcmUgOCBEV09SRHMsIHRoYXQga2VlcCB0aGUgcGh5c2ljYWwKKyoJYWRkcmVzc2VzIG9mIFR4UEQgYnVmZmVycy4gU3RhdGlvbiBoYXMgb25seSA4IFR4UEQgYXZhaWxhYmxlLCBXaGVyZWFzCisqCWRyaXZlciBoYXMgbW9yZSBsb2NhbCBUeFBEcy4gRWFjaCBUeFBEIG9uIHRoZSBob3N0IG1lbW9yeSBpcyBhc3NvY2lhdGVkCisqCXdpdGggYSBUeCBjb250cm9sIG5vZGUuIFRoZSBkcml2ZXIgbWFpbnRhaW5zIDggUnhQRCBkZXNjcmlwdG9ycyBmb3IKKyoJc3RhdGlvbiBmaXJtd2FyZSB0byBzdG9yZSBSeCBwYWNrZXQgaW5mb3JtYXRpb24uCisqCisqCUN1cnJlbnQgdmVyc2lvbiBvZiBNQUMgaGFzIGEgMzJ4NiBtdWx0aWNhc3QgYWRkcmVzcyBidWZmZXIuCisqCisqCTgwMi4xMWIgY2FuIGhhdmUgdXAgdG8gIDE0IGNoYW5uZWxzLCB0aGUgZHJpdmVyIGtlZXBzIHRoZQorKglCU1NJRChNQUMgYWRkcmVzcykgb2YgZWFjaCBBUHMgb3IgQWQgaG9jIHN0YXRpb25zIGl0IGhhcyBzZW5zZWQuCisqLworCisjZGVmaW5lIE1SVkRSVl9NQVhfTVVMVElDQVNUX0xJU1RfU0laRQkzMgorI2RlZmluZSBNUlZEUlZfTlVNX09GX0NNRF9CVUZGRVIgICAgICAgIDEwCisjZGVmaW5lIE1SVkRSVl9TSVpFX09GX0NNRF9CVUZGRVIgICAgICAgKDIgKiAxMDI0KQorI2RlZmluZSBNUlZEUlZfTUFYX0NIQU5ORUxfU0laRQkJMTQKKyNkZWZpbmUgTVJWRFJWX01BWF9CU1NJRF9MSVNUCQk2NAorI2RlZmluZSBNUlZEUlZfQVNTT0NJQVRJT05fVElNRV9PVVQJMjU1CisjZGVmaW5lIE1SVkRSVl9TTkFQX0hFQURFUl9MRU4gICAgICAgICAgOAorCisjZGVmaW5lCVdMQU5fVVBMRF9TSVpFCQkJMjMxMgorI2RlZmluZSBERVZfTkFNRV9MRU4JCQkzMgorCisvKiogTWlzYyBjb25zdGFudHMgKi8KKy8qIFRoaXMgc2VjdGlvbiBkZWZpbmVzIDgwMi4xMSBzcGVjaWZpYyBjb250YW50cyAqLworCisjZGVmaW5lIE1SVkRSVl9NQVhfQlNTX0RFU0NSSVBUUwkJMTYKKyNkZWZpbmUgTVJWRFJWX01BWF9SRUdJT05fQ09ERQkJCTYKKworI2RlZmluZSBNUlZEUlZfSUdOT1JFX01VTFRJUExFX0RUSU0JCTB4ZmZmZQorI2RlZmluZSBNUlZEUlZfTUlOX01VTFRJUExFX0RUSU0JCTEKKyNkZWZpbmUgTVJWRFJWX01BWF9NVUxUSVBMRV9EVElNCQk1CisjZGVmaW5lIE1SVkRSVl9ERUZBVUxUX01VTFRJUExFX0RUSU0JCTEKKworI2RlZmluZSBNUlZEUlZfREVGQVVMVF9MSVNURU5fSU5URVJWQUwJCTEwCisKKyNkZWZpbmUJTVJWRFJWX0NIQU5ORUxTX1BFUl9TQ0FOCQk0CisjZGVmaW5lCU1SVkRSVl9NQVhfQ0hBTk5FTFNfUEVSX1NDQU4JCTE0CisKKyNkZWZpbmUgTVJWRFJWX0RFQlVHX1JYX1BBVEgJCTB4MDAwMDAwMDEKKyNkZWZpbmUgTVJWRFJWX0RFQlVHX1RYX1BBVEgJCTB4MDAwMDAwMDIKKworI2RlZmluZSBNUlZEUlZfTUlOX0JFQUNPTl9JTlRFUlZBTAkJMjAKKyNkZWZpbmUgTVJWRFJWX01BWF9CRUFDT05fSU5URVJWQUwJCTEwMDAKKyNkZWZpbmUgTVJWRFJWX0JFQUNPTl9JTlRFUlZBTAkJCTEwMAorCisvKiogVHhQRCBzdGF0dXMgKi8KKworLyoJU3RhdGlvbiBmaXJtd2FyZSB1c2UgVHhQRCBzdGF0dXMgZmllbGQgdG8gcmVwb3J0IGZpbmFsIFR4IHRyYW5zbWl0CisqCXJlc3VsdCwgQml0IG1hc2tzIGFyZSB1c2VkIHRvIHByZXNlbnQgY29tYmluZWQgc2l0dWF0aW9ucy4KKyovCisKKyNkZWZpbmUgTVJWRFJWX1R4UERfUE9XRVJfTUdNVF9OVUxMX1BBQ0tFVCAweDAxCisjZGVmaW5lIE1SVkRSVl9UeFBEX1BPV0VSX01HTVRfTEFTVF9QQUNLRVQgMHgwOAorCisvKiogVHggbWVzaCBmbGFnICovCisvKiBDdXJyZW50bHkgd2UgYXJlIHVzaW5nIG5vcm1hbCBXRFMgZmxhZyBhcyBtZXNoIGZsYWcuCisgKiBUT0RPOiBjaGFuZ2UgdG8gcHJvcGVyIG1lc2ggZmxhZyB3aGVuIE1BQyB1bmRlcnN0YW5kcyBpdC4KKyAqLworI2RlZmluZSBUeFBEX0NPTlRST0xfV0RTX0ZSQU1FICgxPDwxNykKKyNkZWZpbmUgVHhQRF9NRVNIX0ZSQU1FIFR4UERfQ09OVFJPTF9XRFNfRlJBTUUKKworLyoqIFJ4UEQgc3RhdHVzICovCisKKyNkZWZpbmUgTVJWRFJWX1JYUERfU1RBVFVTX09LICAgICAgICAgICAgICAgIDB4MDAwMQorCisvKiogUnhQRCBzdGF0dXMgLSBSZWNlaXZlZCBwYWNrZXQgdHlwZXMgKi8KKy8qKiBSeCBtZXNoIGZsYWcgKi8KKy8qIEN1cnJlbnRseSB3ZSBhcmUgdXNpbmcgbm9ybWFsIFdEUyBmbGFnIGFzIG1lc2ggZmxhZy4KKyAqIFRPRE86IGNoYW5nZSB0byBwcm9wZXIgbWVzaCBmbGFnIHdoZW4gTUFDIHVuZGVyc3RhbmRzIGl0LgorICovCisjZGVmaW5lIFJ4UERfQ09OVFJPTF9XRFNfRlJBTUUgKDB4NDApCisjZGVmaW5lIFJ4UERfTUVTSF9GUkFNRSBSeFBEX0NPTlRST0xfV0RTX0ZSQU1FCisKKy8qKiBSU1NJLXJlbGF0ZWQgZGVmaW5lcyAqLworLyoJUlNTSSBjb25zdGFudHMgYXJlIHVzZWQgdG8gaW1wbGVtZW50IDgwMi4xMSBSU1NJIHRocmVzaG9sZAorKglpbmRpY2F0aW9uLiBpZiB0aGUgUnggcGFja2V0IHNpZ25hbCBnb3QgdG9vIHdlYWsgZm9yIDUgY29uc2VjdXRpdmUKKyoJdGltZXMsIG1pbmlwb3J0IGRyaXZlciAoZHJpdmVyKSB3aWxsIHJlcG9ydCB0aGlzIGV2ZW50IHRvIHdyYXBwZXIKKyovCisKKyNkZWZpbmUgTVJWRFJWX05GX0RFRkFVTFRfU0NBTl9WQUxVRQkJKC05NikKKworLyoqIFJUUy9GUkFHIHJlbGF0ZWQgZGVmaW5lcyAqLworI2RlZmluZSBNUlZEUlZfUlRTX01JTl9WQUxVRQkJMAorI2RlZmluZSBNUlZEUlZfUlRTX01BWF9WQUxVRQkJMjM0NworI2RlZmluZSBNUlZEUlZfRlJBR19NSU5fVkFMVUUJCTI1NgorI2RlZmluZSBNUlZEUlZfRlJBR19NQVhfVkFMVUUJCTIzNDYKKworLyogVGhpcyBpcyBmb3IgZmlybXdhcmUgc3BlY2lmaWMgbGVuZ3RoICovCisjZGVmaW5lIEVYVFJBX0xFTgkzNgorCisjZGVmaW5lIE1SVkRSVl9FVEhfVFhfUEFDS0VUX0JVRkZFUl9TSVpFIFwKKwkoRVRIX0ZSQU1FX0xFTiArIHNpemVvZihzdHJ1Y3QgdHhwZCkgKyBFWFRSQV9MRU4pCisKKyNkZWZpbmUgTVJWRFJWX0VUSF9SWF9QQUNLRVRfQlVGRkVSX1NJWkUgXAorCShFVEhfRlJBTUVfTEVOICsgc2l6ZW9mKHN0cnVjdCByeHBkKSBcCisJICsgTVJWRFJWX1NOQVBfSEVBREVSX0xFTiArIEVYVFJBX0xFTikKKworI2RlZmluZQlDTURfRl9IT1NUQ01ECQkoMSA8PCAwKQorI2RlZmluZSBGV19DQVBJTkZPX1dQQSAgCSgxIDw8IDApCisKKy8qKiBXUEEga2V5IExFTkdUSCovCisjZGVmaW5lIE1SVkxfTUFYX0tFWV9XUEFfS0VZX0xFTkdUSCAgICAgMzIKKworI2RlZmluZSBLRVlfTEVOX1dQQV9BRVMJCQkxNgorI2RlZmluZSBLRVlfTEVOX1dQQV9US0lQCQkzMgorI2RlZmluZSBLRVlfTEVOX1dFUF8xMDQJCQkxMworI2RlZmluZSBLRVlfTEVOX1dFUF80MAkJCTUKKworI2RlZmluZSBSRl9BTlRFTk5BXzEJCTB4MQorI2RlZmluZSBSRl9BTlRFTk5BXzIJCTB4MgorI2RlZmluZSBSRl9BTlRFTk5BX0FVVE8JCTB4RkZGRgorCisjZGVmaW5lCUJBTkRfQgkJCSgweDAxKQorI2RlZmluZQlCQU5EX0cJCQkoMHgwMikKKyNkZWZpbmUgQUxMXzgwMl8xMV9CQU5EUwkoQkFORF9CIHwgQkFORF9HKQorCisvKiogTUFDUk8gREVGSU5JVElPTlMgKi8KKyNkZWZpbmUgQ0FMX05GKE5GKQkJCSgoczMyKSgtKHMzMikoTkYpKSkKKyNkZWZpbmUgQ0FMX1JTU0koU05SLCBORikgCQkoKHMzMikoKHMzMikoU05SKSArIENBTF9ORihORikpKQorI2RlZmluZSBTQ0FOX1JTU0koUlNTSSkJCQkoMHgxMDAgLSAoKHU4KShSU1NJKSkpCisKKyNkZWZpbmUgREVGQVVMVF9CQ05fQVZHX0ZBQ1RPUgkJOAorI2RlZmluZSBERUZBVUxUX0RBVEFfQVZHX0ZBQ1RPUgkJOAorI2RlZmluZSBBVkdfU0NBTEUJCQkxMDAKKyNkZWZpbmUgQ0FMX0FWR19TTlJfTkYoQVZHLCBTTlJORiwgTikgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAoKChBVkcpID09IDApID8gKCh1MTYpKFNOUk5GKSAqIEFWR19TQ0FMRSkgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAoKCgoaW50KShBVkcpICogKE4gLTEpKSArICgodTE2KShTTlJORikgKiBcCisgICAgICAgICAgICAgICAgICAgICAgICBBVkdfU0NBTEUpKSAgLyBOKSkKKworI2RlZmluZSBCX1NVUFBPUlRFRF9SQVRFUwkJOAorI2RlZmluZSBHX1NVUFBPUlRFRF9SQVRFUwkJMTQKKworI2RlZmluZQlXTEFOX1NVUFBPUlRFRF9SQVRFUwkJMTQKKworI2RlZmluZQlNQVhfTEVEUwkJCTgKKworI2RlZmluZSBJU19NRVNIX0ZSQU1FKHgpICh4LT5jYls2XSkKKyNkZWZpbmUgU0VUX01FU0hfRlJBTUUoeCkgKHgtPmNiWzZdPTEpCisjZGVmaW5lIFVOU0VUX01FU0hfRlJBTUUoeCkgKHgtPmNiWzZdPTApCisKKy8qKiBHbG9iYWwgVmFyaWFibGUgRGVjbGFyYXRpb24gKi8KK3R5cGVkZWYgc3RydWN0IF93bGFuX3ByaXZhdGUgd2xhbl9wcml2YXRlOwordHlwZWRlZiBzdHJ1Y3QgX3dsYW5fYWRhcHRlciB3bGFuX2FkYXB0ZXI7CitleHRlcm4gY29uc3QgY2hhciBsaWJlcnRhc19kcml2ZXJfdmVyc2lvbltdOworZXh0ZXJuIHUxNiBsaWJlcnRhc19yZWdpb25fY29kZV90b19pbmRleFtNUlZEUlZfTUFYX1JFR0lPTl9DT0RFXTsKKworZXh0ZXJuIHU4IGxpYmVydGFzX3dsYW5fZGF0YV9yYXRlc1tXTEFOX1NVUFBPUlRFRF9SQVRFU107CisKK2V4dGVybiB1OCBsaWJlcnRhc19zdXBwb3J0ZWRfcmF0ZXNbR19TVVBQT1JURURfUkFURVNdOworCitleHRlcm4gdTggbGliZXJ0YXNfYWRob2NfcmF0ZXNfZ1tHX1NVUFBPUlRFRF9SQVRFU107CisKK2V4dGVybiB1OCBsaWJlcnRhc19hZGhvY19yYXRlc19iWzRdOworCisvKiogRU5VTSBkZWZpbml0aW9uKi8KKy8qKiBTTlJORl9UWVBFICovCitlbnVtIFNOUk5GX1RZUEUgeworCVRZUEVfQkVBQ09OID0gMCwKKwlUWVBFX1JYUEQsCisJTUFYX1RZUEVfQgorfTsKKworLyoqIFNOUk5GX0RBVEEqLworZW51bSBTTlJORl9EQVRBIHsKKwlUWVBFX05PQVZHID0gMCwKKwlUWVBFX0FWRywKKwlNQVhfVFlQRV9BVkcKK307CisKKy8qKiBXTEFOXzgwMl8xMV9BVVRIX0FMRyovCitlbnVtIFdMQU5fODAyXzExX0FVVEhfQUxHIHsKKwlBVVRIX0FMR19PUEVOX1NZU1RFTSA9IDEsCisJQVVUSF9BTEdfU0hBUkVEX0tFWSA9IDIsCisJQVVUSF9BTEdfTkVUV09SS19FQVAgPSA4LAorfTsKKworLyoqIFdMQU5fODAyXzFYX0FVVEhfQUxHICovCitlbnVtIFdMQU5fODAyXzFYX0FVVEhfQUxHIHsKKwlXTEFOXzFYX0FVVEhfQUxHX05PTkUgPSAxLAorCVdMQU5fMVhfQVVUSF9BTEdfTEVBUCA9IDIsCisJV0xBTl8xWF9BVVRIX0FMR19UTFMgPSA0LAorCVdMQU5fMVhfQVVUSF9BTEdfVFRMUyA9IDgsCisJV0xBTl8xWF9BVVRIX0FMR19NRDUgPSAxNiwKK307CisKKy8qKiBXTEFOXzgwMl8xMV9FTkNSWVBUSU9OX01PREUgKi8KK2VudW0gV0xBTl84MDJfMTFfRU5DUllQVElPTl9NT0RFIHsKKwlDSVBIRVJfTk9ORSwKKwlDSVBIRVJfV0VQNDAsCisJQ0lQSEVSX1RLSVAsCisJQ0lQSEVSX0NDTVAsCisJQ0lQSEVSX1dFUDEwNCwKK307CisKKy8qKiBXTEFOXzgwMl8xMV9QT1dFUl9NT0RFICovCitlbnVtIFdMQU5fODAyXzExX1BPV0VSX01PREUgeworCXdsYW44MDJfMTFwb3dlcm1vZGVjYW0sCisJd2xhbjgwMl8xMXBvd2VybW9kZW1heF9wc3AsCisJd2xhbjgwMl8xMVBvd2VybW9kZWZhc3RfcHNwLAorCS8qbm90IGEgcmVhbCBtb2RlLCBkZWZpbmVkIGFzIGFuIHVwcGVyIGJvdW5kICovCisJd2xhbjgwMl8xMXBvd2Vtb2RlbWF4Cit9OworCisvKiogUFNfU1RBVEUgKi8KK2VudW0gUFNfU1RBVEUgeworCVBTX1NUQVRFX0ZVTExfUE9XRVIsCisJUFNfU1RBVEVfQVdBS0UsCisJUFNfU1RBVEVfUFJFX1NMRUVQLAorCVBTX1NUQVRFX1NMRUVQCit9OworCisvKiogRE5MRF9TVEFURSAqLworZW51bSBETkxEX1NUQVRFIHsKKwlETkxEX1JFU19SRUNFSVZFRCwKKwlETkxEX0RBVEFfU0VOVCwKKwlETkxEX0NNRF9TRU5UCit9OworCisvKiogV0xBTl9NRURJQV9TVEFURSAqLworZW51bSBXTEFOX01FRElBX1NUQVRFIHsKKwlsaWJlcnRhc19jb25uZWN0ZWQsCisJbGliZXJ0YXNfZGlzY29ubmVjdGVkCit9OworCisvKiogV0xBTl84MDJfMTFfUFJJVkFDWV9GSUxURVIgKi8KK2VudW0gV0xBTl84MDJfMTFfUFJJVkFDWV9GSUxURVIgeworCXdsYW44MDJfMTFwcml2ZmlsdGVyYWNjZXB0YWxsLAorCXdsYW44MDJfMTFwcml2ZmlsdGVyODAyMXhXRVAKK307CisKKy8qKiBtdl9tc190eXBlICovCitlbnVtIG12X21zX3R5cGUgeworCU1WTVNfREFUID0gMCwKKwlNVk1TX0NNRCA9IDEsCisJTVZNU19UWERPTkUgPSAyLAorCU1WTVNfRVZFTlQKK307CisKKy8qKiBXTEFOXzgwMl8xMV9ORVRXT1JLX0lORlJBU1RSVUNUVVJFICovCitlbnVtIFdMQU5fODAyXzExX05FVFdPUktfSU5GUkFTVFJVQ1RVUkUgeworCXdsYW44MDJfMTFpYnNzLAorCXdsYW44MDJfMTFpbmZyYXN0cnVjdHVyZSwKKwl3bGFuODAyXzExYXV0b3Vua25vd24sCisJLypkZWZpbmVkIGFzIHVwcGVyIGJvdW5kICovCisJd2xhbjgwMl8xMWluZnJhc3RydWN0dXJlbWF4Cit9OworCisvKiogV0xBTl84MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSAqLworZW51bSBXTEFOXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFIHsKKwl3bGFuODAyXzExYXV0aG1vZGVvcGVuID0gMHgwMCwKKwl3bGFuODAyXzExYXV0aG1vZGVzaGFyZWQgPSAweDAxLAorCXdsYW44MDJfMTFhdXRobW9kZW5ldHdvcmtFQVAgPSAweDgwLAorfTsKKworLyoqIFdMQU5fODAyXzExX1dFUF9TVEFUVVMgKi8KK2VudW0gV0xBTl84MDJfMTFfV0VQX1NUQVRVUyB7CisJd2xhbjgwMl8xMVdFUGVuYWJsZWQsCisJd2xhbjgwMl8xMVdFUGRpc2FibGVkLAorfTsKKworLyoqIFNOTVBfTUlCX0lOREVYX2UgKi8KK2VudW0gU05NUF9NSUJfSU5ERVhfZSB7CisJZGVzaXJlZF9ic3N0eXBlX2kgPSAwLAorCW9wX3JhdGVzZXRfaSwKKwliY25wZXJpb2RfaSwKKwlkdGltcGVyaW9kX2ksCisJYXNzb2Nyc3BfdGltZW91dF9pLAorCXJ0c3RocmVzaF9pLAorCXNob3J0X3JldHJ5bGltX2ksCisJbG9uZ19yZXRyeWxpbV9pLAorCWZyYWd0aHJlc2hfaSwKKwlkb3QxMWRfaSwKKwlkb3QxMWhfaSwKKwltYW51ZmlkX2ksCisJcHJvZElEX2ksCisJbWFudWZfb3VpX2ksCisJbWFudWZfbmFtZV9pLAorCW1hbnVmX3Byb2RuYW1lX2ksCisJbWFudWZfcHJvZHZlcl9pLAorfTsKKworLyoqIEtFWV9UWVBFX0lEICovCitlbnVtIEtFWV9UWVBFX0lEIHsKKwlLRVlfVFlQRV9JRF9XRVAgPSAwLAorCUtFWV9UWVBFX0lEX1RLSVAsCisJS0VZX1RZUEVfSURfQUVTCit9OworCisvKiogS0VZX0lORk9fV1BBIChhcHBsaWVzIHRvIGJvdGggVEtJUCBhbmQgQUVTL0NDTVApICovCitlbnVtIEtFWV9JTkZPX1dQQSB7CisJS0VZX0lORk9fV1BBX01DQVNUID0gMHgwMSwKKwlLRVlfSU5GT19XUEFfVU5JQ0FTVCA9IDB4MDIsCisJS0VZX0lORk9fV1BBX0VOQUJMRUQgPSAweDA0Cit9OworCisvKiogU05NUF9NSUJfVkFMVUVfZSAqLworZW51bSBTTk1QX01JQl9WQUxVRV9lIHsKKwlTTk1QX01JQl9WQUxVRV9JTkZSQSA9IDEsCisJU05NUF9NSUJfVkFMVUVfQURIT0MKK307CisKKy8qIERlZmF1bHQgdmFsdWVzIGZvciBmd3QgY29tbWFuZHMuICovCisjZGVmaW5lIEZXVF9ERUZBVUxUX01FVFJJQyAwCisjZGVmaW5lIEZXVF9ERUZBVUxUX0RJUiAxCisjZGVmaW5lIEZXVF9ERUZBVUxUX1NTTiAweGZmZmZmZmZmCisjZGVmaW5lIEZXVF9ERUZBVUxUX0RTTiAwCisjZGVmaW5lIEZXVF9ERUZBVUxUX0hPUENPVU5UIDAKKyNkZWZpbmUgRldUX0RFRkFVTFRfVFRMIDAKKyNkZWZpbmUgRldUX0RFRkFVTFRfRVhQSVJBVElPTiAwCisjZGVmaW5lIEZXVF9ERUZBVUxUX1NMRUVQTU9ERSAwCisjZGVmaW5lIEZXVF9ERUZBVUxUX1NOUiAwCisKKyNlbmRpZgkJCQkvKiBfV0xBTl9ERUZTX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9kZXYuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2Rldi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxZjg3NmYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9kZXYuaApAQCAtMCwwICsxLDQwMyBAQAorLyoqCisgICogVGhpcyBmaWxlIGNvbnRhaW5zIGRlZmluaXRpb25zIGFuZCBkYXRhIHN0cnVjdHVyZXMgc3BlY2lmaWMKKyAgKiB0byBNYXJ2ZWxsIDgwMi4xMSBOSUMuIEl0IGNvbnRhaW5zIHRoZSBEZXZpY2UgSW5mb3JtYXRpb24KKyAgKiBzdHJ1Y3R1cmUgd2xhbl9hZGFwdGVyLgorICAqLworI2lmbmRlZiBfV0xBTl9ERVZfSF8KKyNkZWZpbmUgX1dMQU5fREVWX0hfCisKKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisKKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAic2Nhbi5oIgorI2luY2x1ZGUgInRocmVhZC5oIgorCitleHRlcm4gc3RydWN0IGV0aHRvb2xfb3BzIGxpYmVydGFzX2V0aHRvb2xfb3BzOworCisjZGVmaW5lCU1BWF9CU1NJRF9QRVJfQ0hBTk5FTAkJMTYKKworI2RlZmluZSBOUl9UWF9RVUVVRQkJCTMKKworLyogRm9yIHRoZSBleHRlbmRlZCBTY2FuICovCisjZGVmaW5lIE1BWF9FWFRFTkRFRF9TQ0FOX0JTU0lEX0xJU1QgICAgTUFYX0JTU0lEX1BFUl9DSEFOTkVMICogXAorCQkJCQkJTVJWRFJWX01BWF9DSEFOTkVMX1NJWkUgKyAxCisKKyNkZWZpbmUJTUFYX1JFR0lPTl9DSEFOTkVMX05VTQkyCisKKy8qKiBDaGFuLWZyZXEtVHhQb3dlciBtYXBwaW5nIHRhYmxlKi8KK3N0cnVjdCBjaGFuX2ZyZXFfcG93ZXIgeworCS8qKiBjaGFubmVsIE51bWJlcgkJKi8KKwl1MTYgY2hhbm5lbDsKKwkvKiogZnJlcXVlbmN5IG9mIHRoaXMgY2hhbm5lbAkqLworCXUzMiBmcmVxOworCS8qKiBNYXggYWxsb3dlZCBUeCBwb3dlciBsZXZlbAkqLworCXUxNiBtYXh0eHBvd2VyOworCS8qKiBUUlVFOmNoYW5uZWwgdW5zdXBwb3J0ZWQ7ICBGTEFTRTpzdXBwb3J0ZWQqLworCXU4IHVuc3VwcG9ydGVkOworfTsKKworLyoqIHJlZ2lvbi1iYW5kIG1hcHBpbmcgdGFibGUqLworc3RydWN0IHJlZ2lvbl9jaGFubmVsIHsKKwkvKiogVFJVRSBpZiB0aGlzIGVudHJ5IGlzIHZhbGlkCQkgICAgICovCisJdTggdmFsaWQ7CisJLyoqIHJlZ2lvbiBjb2RlIGZvciBVUywgSmFwYW4gLi4uCSAgICAgKi8KKwl1OCByZWdpb247CisJLyoqIGJhbmQgQi9HL0EsIHVzZWQgZm9yIEJBTkRfQ09ORklHIGNtZAkgICAgICovCisJdTggYmFuZDsKKwkvKiogQWN0dWFsIE5vLiBvZiBlbGVtZW50cyBpbiB0aGUgYXJyYXkgYmVsb3cgKi8KKwl1OCBucmNmcDsKKwkvKiogY2hhbi1mcmVxLXR4cG93ZXIgbWFwcGluZyB0YWJsZSovCisJc3RydWN0IGNoYW5fZnJlcV9wb3dlciAqQ0ZQOworfTsKKworc3RydWN0IHdsYW5fODAyXzExX3NlY3VyaXR5IHsKKwl1OCBXUEFlbmFibGVkOworCXU4IFdQQTJlbmFibGVkOworCWVudW0gV0xBTl84MDJfMTFfV0VQX1NUQVRVUyBXRVBzdGF0dXM7CisJZW51bSBXTEFOXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFIGF1dGhtb2RlOworCWVudW0gV0xBTl84MDJfMVhfQVVUSF9BTEcgYXV0aDF4YWxnOworCWVudW0gV0xBTl84MDJfMTFfRU5DUllQVElPTl9NT0RFIEVuY3J5cHRpb25tb2RlOworfTsKKworLyoqIEN1cnJlbnQgQmFzaWMgU2VydmljZSBTZXQgU3RhdGUgU3RydWN0dXJlICovCitzdHJ1Y3QgY3VycmVudF9ic3NfcGFyYW1zIHsKKwlzdHJ1Y3QgYnNzX2Rlc2NyaXB0b3IgYnNzZGVzY3JpcHRvcjsKKwkvKiogYnNzaWQgKi8KKwl1OCBic3NpZFtFVEhfQUxFTl07CisJLyoqIHNzaWQgKi8KKwlzdHJ1Y3QgV0xBTl84MDJfMTFfU1NJRCBzc2lkOworCisJLyoqIGJhbmQgKi8KKwl1OCBiYW5kOworCS8qKiBjaGFubmVsICovCisJdTggY2hhbm5lbDsKKwkvKiogbnVtYmVyIG9mIHJhdGVzIHN1cHBvcnRlZCAqLworCWludCBudW1vZnJhdGVzOworCS8qKiBzdXBwb3J0ZWQgcmF0ZXMqLworCXU4IGRhdGFyYXRlc1tXTEFOX1NVUFBPUlRFRF9SQVRFU107Cit9OworCisvKiogc2xlZXBfcGFyYW1zICovCitzdHJ1Y3Qgc2xlZXBfcGFyYW1zIHsKKwl1MTYgc3BfZXJyb3I7CisJdTE2IHNwX29mZnNldDsKKwl1MTYgc3Bfc3RhYmxldGltZTsKKwl1OCBzcF9jYWxjb250cm9sOworCXU4IHNwX2V4dHNsZWVwY2xrOworCXUxNiBzcF9yZXNlcnZlZDsKK307CisKKy8qKiBEYXRhIHN0cnVjdHVyZSBmb3IgdGhlIE1hcnZlbGwgV0xBTiBkZXZpY2UgKi8KK3R5cGVkZWYgc3RydWN0IF93bGFuX2RldiB7CisJLyoqIGRldmljZSBuYW1lICovCisJY2hhciBuYW1lW0RFVl9OQU1FX0xFTl07CisJLyoqIGNhcmQgcG9pbnRlciAqLworCXZvaWQgKmNhcmQ7CisJLyoqIElPIHBvcnQgKi8KKwl1MzIgaW9wb3J0OworCS8qKiBVcGxvYWQgcmVjZWl2ZWQgKi8KKwl1MzIgdXBsZF9yY3Y7CisJLyoqIFVwbG9hZCB0eXBlICovCisJdTMyIHVwbGRfdHlwOworCS8qKiBVcGxvYWQgbGVuZ3RoICovCisJdTMyIHVwbGRfbGVuOworCS8qKiBuZXRkZXYgcG9pbnRlciAqLworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CisJLyogVXBsb2FkIGJ1ZmZlciAqLworCXU4IHVwbGRfYnVmW1dMQU5fVVBMRF9TSVpFXTsKKwkvKiBEb3dubG9hZCBzZW50OgorCSAgIGJpdDAgMS8wPWRhdGFfc2VudC9kYXRhX3R4X2RvbmUsCisJICAgYml0MSAxLzA9Y21kX3NlbnQvY21kX3R4X2RvbmUsCisJICAgYWxsIG90aGVyIGJpdHMgcmVzZXJ2ZWQgMCAqLworCXU4IGRubGRfc2VudDsKK30gd2xhbl9kZXZfdCwgKnB3bGFuX2Rldl90OworCisvKiBNZXNoIHN0YXRpc3RpY3MgKi8KK3N0cnVjdCB3bGFuX21lc2hfc3RhdHMgeworCXUzMglmd2RfYmNhc3RfY250OwkJLyogRndkOiBCcm9hZGNhc3QgY291bnRlciAqLworCXUzMglmd2RfdW5pY2FzdF9jbnQ7CS8qIEZ3ZDogVW5pY2FzdCBjb3VudGVyICovCisJdTMyCWZ3ZF9kcm9wX3R0bDsJCS8qIEZ3ZDogVFRMIHplcm8gKi8KKwl1MzIJZndkX2Ryb3BfcmJ0OwkJLyogRndkOiBSZWNlbnRseSBCcm9hZGNhc3RlZCAqLworCXUzMglmd2RfZHJvcF9ub3JvdXRlOyAJLyogRndkOiBObyByb3V0ZSB0byBEZXN0aW5hdGlvbiAqLworCXUzMglmd2RfZHJvcF9ub2J1ZjsJCS8qIEZ3ZDogUnVuIG91dCBvZiBpbnRlcm5hbCBidWZmZXJzICovCisJdTMyCWRyb3BfYmxpbmQ7CQkvKiBSeDogIERyb3BwZWQgYnkgYmxpbmRpbmcgdGFibGUgKi8KK307CisKKy8qKiBQcml2YXRlIHN0cnVjdHVyZSBmb3IgdGhlIE1WIGRldmljZSAqLworc3RydWN0IF93bGFuX3ByaXZhdGUgeworCWludCBvcGVuOworCWludCBtZXNoX29wZW47CisJaW50IGluZnJhX29wZW47CisKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXI7CisJd2xhbl9kZXZfdCB3bGFuX2RldjsKKworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCXN0cnVjdCBuZXRfZGV2aWNlICptZXNoX2RldiA7IC8qIFZpcnR1YWwgZGV2aWNlICovCisKKwlzdHJ1Y3QgaXdfc3RhdGlzdGljcyB3c3RhdHM7CisJc3RydWN0IHdsYW5fbWVzaF9zdGF0cyBtc3RhdHM7CisJc3RydWN0IGRlbnRyeSAqZGVidWdmc19kaXI7CisJc3RydWN0IGRlbnRyeSAqZGVidWdmc19kZWJ1ZzsKKwlzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzX2ZpbGVzWzZdOworCisJc3RydWN0IGRlbnRyeSAqZXZlbnRzX2RpcjsKKwlzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzX2V2ZW50c19maWxlc1s2XTsKKworCXN0cnVjdCBkZW50cnkgKnJlZ3NfZGlyOworCXN0cnVjdCBkZW50cnkgKmRlYnVnZnNfcmVnc19maWxlc1s2XTsKKworCXUzMiBtYWNfb2Zmc2V0OworCXUzMiBiYnBfb2Zmc2V0OworCXUzMiByZl9vZmZzZXQ7CisKKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZpcm13YXJlOworCXN0cnVjdCBkZXZpY2UgKmhvdHBsdWdfZGV2aWNlOworCisJLyoqIHRocmVhZCB0byBzZXJ2aWNlIGludGVycnVwdHMgKi8KKwlzdHJ1Y3Qgd2xhbl90aHJlYWQgbWFpbnRocmVhZDsKKworCXN0cnVjdCBkZWxheWVkX3dvcmsgYXNzb2Nfd29yazsKKwlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqYXNzb2NfdGhyZWFkOworfTsKKworLyoqIEFzc29jaWF0aW9uIHJlcXVlc3QKKyAqCisgKiBFbmNhcHN1bGF0ZXMgYWxsIHRoZSBvcHRpb25zIHRoYXQgZGVzY3JpYmUgYSBzcGVjaWZpYyBhc3NvY2F0aW9uIHJlcXVlc3QKKyAqIG9yIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHdpcmVsZXNzIGNhcmQncyByYWRpbywgbW9kZSwgYW5kIHNlY3VyaXR5IHNldHRpbmdzLgorICovCitzdHJ1Y3QgYXNzb2NfcmVxdWVzdCB7CisjZGVmaW5lIEFTU09DX0ZMQUdfU1NJRAkJCTEKKyNkZWZpbmUgQVNTT0NfRkxBR19DSEFOTkVMCQkyCisjZGVmaW5lIEFTU09DX0ZMQUdfTU9ERQkJCTMKKyNkZWZpbmUgQVNTT0NfRkxBR19CU1NJRAkJNAorI2RlZmluZSBBU1NPQ19GTEFHX1dFUF9LRVlTCQk1CisjZGVmaW5lIEFTU09DX0ZMQUdfV0VQX1RYX0tFWUlEWAk2CisjZGVmaW5lIEFTU09DX0ZMQUdfV1BBX01DQVNUX0tFWQk3CisjZGVmaW5lIEFTU09DX0ZMQUdfV1BBX1VDQVNUX0tFWQk4CisjZGVmaW5lIEFTU09DX0ZMQUdfU0VDSU5GTwkJOQorI2RlZmluZSBBU1NPQ19GTEFHX1dQQV9JRQkJMTAKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3RydWN0IFdMQU5fODAyXzExX1NTSUQgc3NpZDsKKwl1OCBjaGFubmVsOworCWVudW0gV0xBTl84MDJfMTFfTkVUV09SS19JTkZSQVNUUlVDVFVSRSBtb2RlOworCXU4IGJzc2lkW0VUSF9BTEVOXTsKKworCS8qKiBXRVAga2V5cyAqLworCXN0cnVjdCBXTEFOXzgwMl8xMV9LRVkgd2VwX2tleXNbNF07CisJdTE2IHdlcF90eF9rZXlpZHg7CisKKwkvKiogV1BBIGtleXMgKi8KKwlzdHJ1Y3QgV0xBTl84MDJfMTFfS0VZIHdwYV9tY2FzdF9rZXk7CisJc3RydWN0IFdMQU5fODAyXzExX0tFWSB3cGFfdW5pY2FzdF9rZXk7CisKKwlzdHJ1Y3Qgd2xhbl84MDJfMTFfc2VjdXJpdHkgc2VjaW5mbzsKKworCS8qKiBXUEEgSW5mb3JtYXRpb24gRWxlbWVudHMqLworI2RlZmluZSBNQVhfV1BBX0lFX0xFTiA2NAorCXU4IHdwYV9pZVtNQVhfV1BBX0lFX0xFTl07CisJdTggd3BhX2llX2xlbjsKK307CisKKy8qKiBXbGFuIGFkYXB0ZXIgZGF0YSBzdHJ1Y3R1cmUqLworc3RydWN0IF93bGFuX2FkYXB0ZXIgeworCS8qKiBTVEFUVVMgdmFyaWFibGVzICovCisJdTMyIGZ3cmVsZWFzZW51bWJlcjsKKwl1MzIgZndjYXBpbmZvOworCS8qIHByb3RlY3RlZCB3aXRoIGJpZyBsb2NrICovCisKKwlzdHJ1Y3QgbXV0ZXggbG9jazsKKworCXU4IHRtcHR4YnVmW1dMQU5fVVBMRF9TSVpFXTsKKwkvKiBwcm90ZWN0ZWQgYnkgaGFyZF9zdGFydF94bWl0IHNlcmlhbGl6YXRpb24gKi8KKworCS8qKiBjb21tYW5kLXJlbGF0ZWQgdmFyaWFibGVzICovCisJdTE2IHNlcW51bTsKKwkvKiBwcm90ZWN0ZWQgYnkgYmlnIGxvY2sgKi8KKworCXN0cnVjdCBjbWRfY3RybF9ub2RlICpjbWRfYXJyYXk7CisJLyoqIEN1cnJlbnQgY29tbWFuZCAqLworCXN0cnVjdCBjbWRfY3RybF9ub2RlICpjdXJfY21kOworCWludCBjdXJfY21kX3JldGNvZGU7CisJLyoqIGNvbW1hbmQgUXVldWVzICovCisJLyoqIEZyZWUgY29tbWFuZCBidWZmZXJzICovCisJc3RydWN0IGxpc3RfaGVhZCBjbWRmcmVlcTsKKwkvKiogUGVuZGluZyBjb21tYW5kIGJ1ZmZlcnMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGNtZHBlbmRpbmdxOworCisJd2FpdF9xdWV1ZV9oZWFkX3QgY21kX3BlbmRpbmc7CisJdTggbnJfY21kX3BlbmRpbmc7CisJLyogY29tbWFuZCByZWxhdGVkIHZhcmlhYmxlcyBwcm90ZWN0ZWQgYnkgYWRhcHRlci0+ZHJpdmVyX2xvY2sgKi8KKworCS8qKiBBc3luYyBhbmQgU3luYyBFdmVudCB2YXJpYWJsZXMgKi8KKwl1MzIgaW50Y291bnRlcjsKKwl1MzIgZXZlbnRjYXVzZTsKKwl1OCBub2RlbmFtZVsxNl07CS8qIG5pY2tuYW1lICovCisKKwkvKiogc3BpbiBsb2NrcyAqLworCXNwaW5sb2NrX3QgZHJpdmVyX2xvY2s7CisKKwkvKiogVGltZXJzICovCisJc3RydWN0IHRpbWVyX2xpc3QgY29tbWFuZF90aW1lcjsKKworCS8qIFRYIHF1ZXVlIHVzZWQgaW4gUFMgbW9kZSAqLworCXNwaW5sb2NrX3QgdHhxdWV1ZV9sb2NrOworCXN0cnVjdCBza19idWZmICp0eF9xdWV1ZV9wc1tOUl9UWF9RVUVVRV07CisJdW5zaWduZWQgaW50IHR4X3F1ZXVlX2lkeDsKKworCXU4IGhpc3JlZ2NweTsKKworCS8qKiBjdXJyZW50IHNzaWQvYnNzaWQgcmVsYXRlZCBwYXJhbWV0ZXJzKi8KKwlzdHJ1Y3QgY3VycmVudF9ic3NfcGFyYW1zIGN1cmJzc3BhcmFtczsKKworCWVudW0gV0xBTl84MDJfMTFfTkVUV09SS19JTkZSQVNUUlVDVFVSRSBpbmZyYW1vZGU7CisKKwlzdHJ1Y3QgYnNzX2Rlc2NyaXB0b3IgKnBhdHRlbXB0ZWRic3NkZXNjOworCisJc3RydWN0IFdMQU5fODAyXzExX1NTSUQgcHJldmlvdXNzc2lkOworCXU4IHByZXZpb3VzYnNzaWRbRVRIX0FMRU5dOworCisJc3RydWN0IGJzc19kZXNjcmlwdG9yICpzY2FudGFibGU7CisJdTMyIG51bWluc2NhbnRhYmxlOworCisJdTggc2NhbnR5cGU7CisJdTMyIHNjYW5tb2RlOworCisJdTE2IGJlYWNvbnBlcmlvZDsKKwl1OCBhZGhvY2NyZWF0ZTsKKworCS8qKiBjYXBhYmlsaXR5IEluZm8gdXNlZCBpbiBBc3NvY2lhdGlvbiwgc3RhcnQsIGpvaW4gKi8KKwlzdHJ1Y3QgaWVlZXR5cGVzX2NhcGluZm8gY2FwaW5mbzsKKworCS8qKiBNQUMgYWRkcmVzcyBpbmZvcm1hdGlvbiAqLworCXU4IGN1cnJlbnRfYWRkcltFVEhfQUxFTl07CisJdTggbXVsdGljYXN0bGlzdFtNUlZEUlZfTUFYX01VTFRJQ0FTVF9MSVNUX1NJWkVdW0VUSF9BTEVOXTsKKwl1MzIgbnJfb2ZfbXVsdGljYXN0bWFjYWRkcjsKKworCS8qKiA4MDIuMTEgc3RhdGlzdGljcyAqLworLy8Jc3RydWN0IGNtZF9EU184MDJfMTFfR0VUX1NUQVQgd2xhbjgwMl8xMVN0YXQ7CisKKwl1MTYgZW5hYmxlaHdhdXRvOworCXUxNiByYXRlYml0bWFwOworCS8qKiBjb250cm9sIEcgcmF0ZXMgKi8KKwl1OCBhZGhvY19ncmF0ZV9lbmFibGVkOworCisJdTMyIHR4YW50ZW5uYTsKKwl1MzIgcnhhbnRlbm5hOworCisJdTggYWRob2NjaGFubmVsOworCXUzMiBmcmFndGhzZDsKKwl1MzIgcnRzdGhzZDsKKworCXUzMiBkYXRhcmF0ZTsKKwl1OCBpc19kYXRhcmF0ZV9hdXRvOworCisJdTE2IGxpc3RlbmludGVydmFsOworCXUxNiBwcmVzY2FuOworCXU4IHR4cmV0cnljb3VudDsKKworCS8qKiBUeC1yZWxhdGVkIHZhcmlhYmxlcyAoZm9yIHNpbmdsZSBwYWNrZXQgdHgpICovCisJc3RydWN0IHNrX2J1ZmYgKmN1cnJlbnR0eHNrYjsKKwl1MTYgVHhMb2NrRmxhZzsKKworCS8qKiBOSUMgT3BlcmF0aW9uIGNoYXJhY3RlcmlzdGljcyAqLworCXUxNiBjdXJyZW50cGFja2V0ZmlsdGVyOworCXUzMiBjb25uZWN0X3N0YXR1czsKKwl1MTYgcmVnaW9uY29kZTsKKwl1MTYgcmVnaW9udGFibGVpbmRleDsKKwl1MTYgdHhwb3dlcmxldmVsOworCisJLyoqIFBPV0VSIE1BTkFHRU1FTlQgQU5EIFBuUCBTVVBQT1JUICovCisJdTggc3VycHJpc2VyZW1vdmVkOworCXUxNiBhdGltd2luZG93OworCisJdTE2IHBzbW9kZTsJCS8qIFdsYW44MDJfMTFQb3dlcm1vZGVDQU09ZGlzYWJsZQorCQkJCSAgIFdsYW44MDJfMTFQb3dlcm1vZGVNQVhfUFNQPWVuYWJsZSAqLworCXUxNiBtdWx0aXBsZWR0aW07CisJdTMyIHBzc3RhdGU7CisJdTggbmVlZHRvd2FrZXVwOworCisJc3RydWN0IFBTX0NNRF9Db25maXJtU2xlZXAgbGliZXJ0YXNfcHNfY29uZmlybV9zbGVlcDsKKwl1MTYgbG9jYWxsaXN0ZW5pbnRlcnZhbDsKKwl1MTYgbnVsbHBrdGludGVydmFsOworCisJc3RydWN0IGFzc29jX3JlcXVlc3QgKiBhc3NvY19yZXE7CisKKwkvKiogRW5jcnlwdGlvbiBwYXJhbWV0ZXIgKi8KKwlzdHJ1Y3Qgd2xhbl84MDJfMTFfc2VjdXJpdHkgc2VjaW5mbzsKKworCS8qKiBXRVAga2V5cyAqLworCXN0cnVjdCBXTEFOXzgwMl8xMV9LRVkgd2VwX2tleXNbNF07CisJdTE2IHdlcF90eF9rZXlpZHg7CisKKwkvKiogV1BBIGtleXMgKi8KKwlzdHJ1Y3QgV0xBTl84MDJfMTFfS0VZIHdwYV9tY2FzdF9rZXk7CisJc3RydWN0IFdMQU5fODAyXzExX0tFWSB3cGFfdW5pY2FzdF9rZXk7CisKKwkvKiogV1BBIEluZm9ybWF0aW9uIEVsZW1lbnRzKi8KKyNkZWZpbmUgTUFYX1dQQV9JRV9MRU4gNjQKKwl1OCB3cGFfaWVbTUFYX1dQQV9JRV9MRU5dOworCXU4IHdwYV9pZV9sZW47CisKKwl1MTYgcnhhbnRlbm5hbW9kZTsKKwl1MTYgdHhhbnRlbm5hbW9kZTsKKworCS8qKiBSZXF1ZXN0ZWQgU2lnbmFsIFN0cmVuZ3RoKi8KKwl1MTYgYmNuX2F2Z19mYWN0b3I7CisJdTE2IGRhdGFfYXZnX2ZhY3RvcjsKKwl1MTYgU05SW01BWF9UWVBFX0JdW01BWF9UWVBFX0FWR107CisJdTE2IE5GW01BWF9UWVBFX0JdW01BWF9UWVBFX0FWR107CisJdTggUlNTSVtNQVhfVFlQRV9CXVtNQVhfVFlQRV9BVkddOworCXU4IHJhd1NOUltERUZBVUxUX0RBVEFfQVZHX0ZBQ1RPUl07CisJdTggcmF3TkZbREVGQVVMVF9EQVRBX0FWR19GQUNUT1JdOworCXUxNiBuZXh0U05STkY7CisJdTE2IG51bVNOUk5GOworCXUxNiByeHBkX3JhdGU7CisKKwl1OCByYWRpb29uOworCXUzMiBwcmVhbWJsZTsKKworCS8qKiBNdWx0aSBiYW5kcyBQYXJhbWV0ZXIqLworCXU4IGxpYmVydGFzX3N1cHBvcnRlZF9yYXRlc1tHX1NVUFBPUlRFRF9SQVRFU107CisKKwkvKiogQmx1ZSBUb290aCBDby1leGlzdGVuY2UgQXJiaXRyYXRpb24gKi8KKworCS8qKiBzbGVlcF9wYXJhbXMgKi8KKwlzdHJ1Y3Qgc2xlZXBfcGFyYW1zIHNwOworCisJLyoqIFJGIGNhbGlicmF0aW9uIGRhdGEgKi8KKworI2RlZmluZQlNQVhfUkVHSU9OX0NIQU5ORUxfTlVNCTIKKwkvKiogcmVnaW9uIGNoYW5uZWwgZGF0YSAqLworCXN0cnVjdCByZWdpb25fY2hhbm5lbCByZWdpb25fY2hhbm5lbFtNQVhfUkVHSU9OX0NIQU5ORUxfTlVNXTsKKworCXN0cnVjdCByZWdpb25fY2hhbm5lbCB1bml2ZXJzYWxfY2hhbm5lbFtNQVhfUkVHSU9OX0NIQU5ORUxfTlVNXTsKKworCS8qKiAxMUQgYW5kIERvbWFpbiBSZWd1bGF0b3J5IERhdGEgKi8KKwlzdHJ1Y3Qgd2xhbl84MDJfMTFkX2RvbWFpbl9yZWcgZG9tYWlucmVnOworCXN0cnVjdCBwYXJzZWRfcmVnaW9uX2NoYW5fMTFkIHBhcnNlZF9yZWdpb25fY2hhbjsKKworCS8qKiBGU00gdmFyaWFibGUgZm9yIDExZCBzdXBwb3J0ICovCisJdTMyIGVuYWJsZTExZDsKKworCS8qKglNSVNDRUxMQU5FT1VTICovCisJdTggKnByZGVlcHJvbTsKKwlzdHJ1Y3Qgd2xhbl9vZmZzZXRfdmFsdWUgb2Zmc2V0dmFsdWU7CisKKwlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9nZXRfbG9nIGxvZ21zZzsKKwl1MTYgc2NhbnByb2JlczsKKworCXUzMiBwa3R0eGN0cmw7CisKKwl1MTYgdHhyYXRlOworCXUzMiBsaW5rbW9kZTsKKwl1MzIgcmFkaW9tb2RlOworCXUzMiBkZWJ1Z21vZGU7CisJdTggZndfcmVhZHk7Cit9OworCisjZW5kaWYJCQkJLyogX1dMQU5fREVWX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9ldGh0b29sLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9ldGh0b29sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA2NGRlNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2V0aHRvb2wuYwpAQCAtMCwwICsxLDE4NCBAQAorCisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpbmNsdWRlICJob3N0LmgiCisjaW5jbHVkZSAic2JpLmgiCisjaW5jbHVkZSAiZGVjbC5oIgorI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJkZXYuaCIKKyNpbmNsdWRlICJqb2luLmgiCisjaW5jbHVkZSAid2V4dC5oIgorc3RhdGljIGNvbnN0IGNoYXIgKiBtZXNoX3N0YXRfc3RyaW5nc1tdPSB7CisJCQkiZHJvcF9kdXBsaWNhdGVfYmNhc3QiLAorCQkJImRyb3BfdHRsX3plcm8iLAorCQkJImRyb3Bfbm9fZndkX3JvdXRlIiwKKwkJCSJkcm9wX25vX2J1ZmZlcnMiLAorCQkJImZ3ZGVkX3VuaWNhc3RfY250IiwKKwkJCSJmd2RlZF9iY2FzdF9jbnQiLAorCQkJImRyb3BfYmxpbmRfdGFibGUiCit9OworCitzdGF0aWMgdm9pZCBsaWJlcnRhc19ldGh0b29sX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCSBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworCXdsYW5fcHJpdmF0ZSAqcHJpdiA9ICh3bGFuX3ByaXZhdGUgKikgZGV2LT5wcml2OworCWNoYXIgZnd2ZXJbMzJdOworCisJbGliZXJ0YXNfZ2V0X2Z3dmVyc2lvbihwcml2LT5hZGFwdGVyLCBmd3Zlciwgc2l6ZW9mKGZ3dmVyKSAtIDEpOworCisJc3RyY3B5KGluZm8tPmRyaXZlciwgImxpYmVydGFzIik7CisJc3RyY3B5KGluZm8tPnZlcnNpb24sIGxpYmVydGFzX2RyaXZlcl92ZXJzaW9uKTsKKwlzdHJjcHkoaW5mby0+ZndfdmVyc2lvbiwgZnd2ZXIpOworfQorCisvKiBBbGwgODM4OCBwYXJ0cyBoYXZlIDE2S2lCIEVFUFJPTSBzaXplIGF0IHRoZSB0aW1lIG9mIHdyaXRpbmcuCisgKiBJbiBjYXNlIHRoYXQgY2hhbmdlcyB0aGlzIG5lZWRzIGZpeGluZy4KKyAqLworI2RlZmluZSBMSUJFUlRBU19FRVBST01fTEVOIDE2Mzg0CisKK3N0YXRpYyBpbnQgbGliZXJ0YXNfZXRodG9vbF9nZXRfZWVwcm9tX2xlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXJldHVybiBMSUJFUlRBU19FRVBST01fTEVOOworfQorCitzdGF0aWMgaW50IGxpYmVydGFzX2V0aHRvb2xfZ2V0X2VlcHJvbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBldGh0b29sX2VlcHJvbSAqZWVwcm9tLCB1OCAqIGJ5dGVzKQoreworCXdsYW5fcHJpdmF0ZSAqcHJpdiA9ICh3bGFuX3ByaXZhdGUgKikgZGV2LT5wcml2OworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJc3RydWN0IHdsYW5faW9jdGxfcmVncmR3ciByZWdjdHJsOworCWNoYXIgKnB0cjsKKwlpbnQgcmV0OworCisJcmVnY3RybC5hY3Rpb24gPSAwOworCXJlZ2N0cmwub2Zmc2V0ID0gZWVwcm9tLT5vZmZzZXQ7CisJcmVnY3RybC5OT0IgPSBlZXByb20tPmxlbjsKKworCWlmIChlZXByb20tPm9mZnNldCArIGVlcHJvbS0+bGVuID4gTElCRVJUQVNfRUVQUk9NX0xFTikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKy8vICAgICAgbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOworCisJYWRhcHRlci0+cHJkZWVwcm9tID0KKwkJICAgIChjaGFyICopa21hbGxvYyhlZXByb20tPmxlbitzaXplb2YocmVnY3RybCksIEdGUF9LRVJORUwpOworCWlmICghYWRhcHRlci0+cHJkZWVwcm9tKQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1jcHkoYWRhcHRlci0+cHJkZWVwcm9tLCAmcmVnY3RybCwgc2l6ZW9mKHJlZ2N0cmwpKTsKKworCS8qICsxNCBpcyBmb3IgYWN0aW9uLCBvZmZzZXQsIGFuZCBOT0IgaW4KKwkgKiByZXNwb25zZSAqLworCWxic19wcl9kZWJ1ZygxLCAiYWN0aW9uOiVkIG9mZnNldDogJXggTk9COiAlMDJ4XG4iLAorCSAgICAgICByZWdjdHJsLmFjdGlvbiwgcmVnY3RybC5vZmZzZXQsIHJlZ2N0cmwuTk9CKTsKKworCXJldCA9IGxpYmVydGFzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZChwcml2LAorCQkJCSAgICBjbWRfODAyXzExX2VlcHJvbV9hY2Nlc3MsCisJCQkJICAgIHJlZ2N0cmwuYWN0aW9uLAorCQkJCSAgICBjbWRfb3B0aW9uX3dhaXRmb3Jyc3AsIDAsCisJCQkJICAgICZyZWdjdHJsKTsKKworCWlmIChyZXQpIHsKKwkJaWYgKGFkYXB0ZXItPnByZGVlcHJvbSkKKwkJCWtmcmVlKGFkYXB0ZXItPnByZGVlcHJvbSk7CisJCUxFQVZFKCk7CisJCQlyZXR1cm4gcmV0OworCX0KKworCW1kZWxheSgxMCk7CisKKwlwdHIgPSAoY2hhciAqKWFkYXB0ZXItPnByZGVlcHJvbTsKKworCS8qIHNraXAgdGhlIGNvbW1hbmQgaGVhZGVyLCBidXQgaW5jbHVkZSB0aGUgInZhbHVlIiB1MzIgdmFyaWFibGUgKi8KKwlwdHIgPSBwdHIgKyBzaXplb2Yoc3RydWN0IHdsYW5faW9jdGxfcmVncmR3cikgLSA0OworCisJLyoKKwkgKiBSZXR1cm4gdGhlIHJlc3VsdCBiYWNrIHRvIHRoZSB1c2VyCisJICovCisJbWVtY3B5KGJ5dGVzLCBwdHIsIGVlcHJvbS0+bGVuKTsKKworCWlmIChhZGFwdGVyLT5wcmRlZXByb20pCisJCWtmcmVlKGFkYXB0ZXItPnByZGVlcHJvbSk7CisvLwltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKKworICAgICAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbGliZXJ0YXNfZXRodG9vbF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYsCisJCQkJc3RydWN0IGV0aHRvb2xfc3RhdHMgKiBzdGF0cywgdTY0ICogZGF0YSkKK3sKKwl3bGFuX3ByaXZhdGUgKnByaXYgPSBkZXYtPnByaXY7CisKKwlFTlRFUigpOworCisJc3RhdHMtPmNtZCA9IEVUSFRPT0xfR1NUQVRTOworCUJVR19PTihzdGF0cy0+bl9zdGF0cyAhPSBNRVNIX1NUQVRTX05VTSk7CisKKyAgICAgICAgZGF0YVswXSA9IHByaXYtPm1zdGF0cy5md2RfZHJvcF9yYnQ7CisgICAgICAgIGRhdGFbMV0gPSBwcml2LT5tc3RhdHMuZndkX2Ryb3BfdHRsOworICAgICAgICBkYXRhWzJdID0gcHJpdi0+bXN0YXRzLmZ3ZF9kcm9wX25vcm91dGU7CisgICAgICAgIGRhdGFbM10gPSBwcml2LT5tc3RhdHMuZndkX2Ryb3Bfbm9idWY7CisgICAgICAgIGRhdGFbNF0gPSBwcml2LT5tc3RhdHMuZndkX3VuaWNhc3RfY250OworICAgICAgICBkYXRhWzVdID0gcHJpdi0+bXN0YXRzLmZ3ZF9iY2FzdF9jbnQ7CisgICAgICAgIGRhdGFbNl0gPSBwcml2LT5tc3RhdHMuZHJvcF9ibGluZDsKKworCUxFQVZFKCk7Cit9CisKK3N0YXRpYyBpbnQgbGliZXJ0YXNfZXRodG9vbF9nZXRfc3RhdHNfY291bnQoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYpCit7CisJaW50IHJldDsKKwl3bGFuX3ByaXZhdGUgKnByaXYgPSBkZXYtPnByaXY7CisJc3RydWN0IGNtZF9kc19tZXNoX2FjY2VzcyBtZXNoX2FjY2VzczsKKworCUVOVEVSKCk7CisJLyogR2V0IE1lc2ggU3RhdGlzdGljcyAqLworCXJldCA9IGxpYmVydGFzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZChwcml2LAorCQkJY21kX21lc2hfYWNjZXNzLCBjbWRfYWN0X21lc2hfZ2V0X3N0YXRzLAorCQkJY21kX29wdGlvbl93YWl0Zm9ycnNwLCAwLCAmbWVzaF9hY2Nlc3MpOworCisJaWYgKHJldCkgeworCQlMRUFWRSgpOworCQlyZXR1cm4gMDsKKwl9CisKKyAgICAgICAgcHJpdi0+bXN0YXRzLmZ3ZF9kcm9wX3JidCA9IG1lc2hfYWNjZXNzLmRhdGFbMF07CisgICAgICAgIHByaXYtPm1zdGF0cy5md2RfZHJvcF90dGwgPSBtZXNoX2FjY2Vzcy5kYXRhWzFdOworICAgICAgICBwcml2LT5tc3RhdHMuZndkX2Ryb3Bfbm9yb3V0ZSA9IG1lc2hfYWNjZXNzLmRhdGFbMl07CisgICAgICAgIHByaXYtPm1zdGF0cy5md2RfZHJvcF9ub2J1ZiA9IG1lc2hfYWNjZXNzLmRhdGFbM107CisgICAgICAgIHByaXYtPm1zdGF0cy5md2RfdW5pY2FzdF9jbnQgPSBtZXNoX2FjY2Vzcy5kYXRhWzRdOworICAgICAgICBwcml2LT5tc3RhdHMuZndkX2JjYXN0X2NudCA9IG1lc2hfYWNjZXNzLmRhdGFbNV07CisgICAgICAgIHByaXYtPm1zdGF0cy5kcm9wX2JsaW5kID0gbWVzaF9hY2Nlc3MuZGF0YVs2XTsKKworCUxFQVZFKCk7CisJcmV0dXJuIE1FU0hfU1RBVFNfTlVNOworfQorCitzdGF0aWMgdm9pZCBsaWJlcnRhc19ldGh0b29sX2dldF9zdHJpbmdzIChzdHJ1Y3QgbmV0X2RldmljZSAqIGRldiwKKwkJCQkJICB1MzIgc3RyaW5nc2V0LAorCQkJCQkgIHU4ICogcykKK3sKKwlpbnQgaTsKKworCUVOVEVSKCk7CisJc3dpdGNoIChzdHJpbmdzZXQpIHsKKyAgICAgICAgY2FzZSBFVEhfU1NfU1RBVFM6CisJCWZvciAoaT0wOyBpIDwgTUVTSF9TVEFUU19OVU07IGkrKykgeworCQkJbWVtY3B5KHMgKyBpICogRVRIX0dTVFJJTkdfTEVOLAorCQkJCQltZXNoX3N0YXRfc3RyaW5nc1tpXSwKKwkJCQkJRVRIX0dTVFJJTkdfTEVOKTsKKwkJfQorCQlicmVhazsKKyAgICAgICAgfQorCUxFQVZFKCk7Cit9CisKK3N0cnVjdCBldGh0b29sX29wcyBsaWJlcnRhc19ldGh0b29sX29wcyA9IHsKKwkuZ2V0X2RydmluZm8gPSBsaWJlcnRhc19ldGh0b29sX2dldF9kcnZpbmZvLAorCS5nZXRfZWVwcm9tID0gIGxpYmVydGFzX2V0aHRvb2xfZ2V0X2VlcHJvbSwKKwkuZ2V0X2VlcHJvbV9sZW4gPSBsaWJlcnRhc19ldGh0b29sX2dldF9lZXByb21fbGVuLAorCS5nZXRfc3RhdHNfY291bnQgPSBsaWJlcnRhc19ldGh0b29sX2dldF9zdGF0c19jb3VudCwKKwkuZ2V0X2V0aHRvb2xfc3RhdHMgPSBsaWJlcnRhc19ldGh0b29sX2dldF9zdGF0cywKKwkuZ2V0X3N0cmluZ3MgPSBsaWJlcnRhc19ldGh0b29sX2dldF9zdHJpbmdzLAorfTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvZncuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2Z3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE5NGE0NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2Z3LmMKQEAgLTAsMCArMSwzNjEgQEAKKy8qKgorICAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgaW5pdGlhbGl6YXRpb24gZm9yIEZXIGFuZCBIVworICAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisKKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisKKyNpbmNsdWRlICJob3N0LmgiCisjaW5jbHVkZSAic2JpLmgiCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgImRlY2wuaCIKKyNpbmNsdWRlICJkZXYuaCIKKyNpbmNsdWRlICJmdy5oIgorI2luY2x1ZGUgIndleHQuaCIKKyNpbmNsdWRlICJpZl91c2IuaCIKKworY2hhciAqbGliZXJ0YXNfZndfbmFtZSA9IE5VTEw7Cittb2R1bGVfcGFyYW1fbmFtZWQoZndfbmFtZSwgbGliZXJ0YXNfZndfbmFtZSwgY2hhcnAsIDA2NDQpOworCit1bnNpZ25lZCBpbnQgbGliZXJ0YXNfZGVidWcgPSAwOworbW9kdWxlX3BhcmFtKGxpYmVydGFzX2RlYnVnLCBpbnQsIDApOworCisvKioKKyAqICBAYnJpZWYgVGhpcyBmdW5jdGlvbiBjaGVja3MgdGhlIHZhbGlkaXR5IG9mIEJvb3QyL0ZXIGltYWdlLgorICoKKyAqICBAcGFyYW0gZGF0YSAgICAgICAgICAgICAgcG9pbnRlciB0byBpbWFnZQorICogICAgICAgICBsZW4gICAgICAgICAgICAgICBpbWFnZSBsZW5ndGgKKyAqICBAcmV0dXJuICAgICAwIG9yIC0xCisgKi8KK3N0YXRpYyBpbnQgY2hlY2tfZndmaWxlX2Zvcm1hdCh1OCAqZGF0YSwgdTMyIHRvdGxlbikKK3sKKwl1OCAgYmluY21kLCBleGl0OworCXUzMiBibGtzaXplLCBvZmZzZXQsIGxlbjsKKwlpbnQgcmV0OworCisJcmV0ID0gMTsKKwlleGl0ID0gbGVuID0gMDsKKworCWRvIHsKKwkJYmluY21kID0gKmRhdGE7CisJCWJsa3NpemUgPSAqKHUzMiopKGRhdGEgKyBvZmZzZXRvZihzdHJ1Y3QgZndoZWFkZXIsIGRhdGFsZW5ndGgpKTsKKwkJc3dpdGNoIChiaW5jbWQpIHsKKwkJY2FzZSBGV19IQVNfREFUQV9UT19SRUNWOgorCQkJb2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCBmd2hlYWRlcikgKyBibGtzaXplOworCQkJZGF0YSArPSBvZmZzZXQ7CisJCQlsZW4gKz0gb2Zmc2V0OworCQkJaWYgKGxlbiA+PSB0b3RsZW4pCisJCQkJZXhpdCA9IDE7CisJCQlicmVhazsKKwkJY2FzZSBGV19IQVNfTEFTVF9CTE9DSzoKKwkJCWV4aXQgPSAxOworCQkJcmV0ID0gMDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZXhpdCA9IDE7CisJCQlicmVhazsKKwkJfQorCX0gd2hpbGUgKCFleGl0KTsKKworCWlmIChyZXQpCisJCWxic19wcl9lcnIoImJpbiBmaWxlIGZvcm1hdCBjaGVjayBGQUlMLi4uXG4iKTsKKwllbHNlCisJCWxic19wcl9kZWJ1ZygxLCAiYmluIGZpbGUgZm9ybWF0IGNoZWNrIFBBU1MuLi5cbiIpOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiAgQGJyaWVmIFRoaXMgZnVuY3Rpb24gZG93bmxvYWRzIGZpcm13YXJlIGltYWdlLCBnZXRzCisgKiAgSFcgc3BlYyBmcm9tIGZpcm13YXJlIGFuZCBzZXQgYmFzaWMgcGFyYW1ldGVycyB0bworICogIGZpcm13YXJlLgorICoKKyAqICBAcGFyYW0gcHJpdiAgICBBIHBvaW50ZXIgdG8gd2xhbl9wcml2YXRlIHN0cnVjdHVyZQorICogIEByZXR1cm4gCSAgIDAgb3IgLTEKKyAqLworc3RhdGljIGludCB3bGFuX3NldHVwX3N0YXRpb25faHcod2xhbl9wcml2YXRlICogcHJpdikKK3sKKwlpbnQgcmV0ID0gLTE7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKworCUVOVEVSKCk7CisKKwlpZiAoKHJldCA9IHJlcXVlc3RfZmlybXdhcmUoJnByaXYtPmZpcm13YXJlLCBsaWJlcnRhc19md19uYW1lLAorCQkJCSAgICBwcml2LT5ob3RwbHVnX2RldmljZSkpIDwgMCkgeworCQlsYnNfcHJfZXJyKCJyZXF1ZXN0X2Zpcm13YXJlKCkgZmFpbGVkLCBlcnJvciBjb2RlID0gJSN4XG4iLAorCQkgICAgICAgcmV0KTsKKwkJbGJzX3ByX2VycigiJXMgbm90IGZvdW5kIGluIC9saWIvZmlybXdhcmVcbiIsIGxpYmVydGFzX2Z3X25hbWUpOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYoY2hlY2tfZndmaWxlX2Zvcm1hdChwcml2LT5maXJtd2FyZS0+ZGF0YSwgcHJpdi0+ZmlybXdhcmUtPnNpemUpKSB7CisJCXJlbGVhc2VfZmlybXdhcmUocHJpdi0+ZmlybXdhcmUpOworCQlnb3RvIGRvbmU7CisJfQorCisJcmV0ID0gbGliZXJ0YXNfc2JpX3Byb2dfZmlybXdhcmUocHJpdik7CisKKwlyZWxlYXNlX2Zpcm13YXJlKHByaXYtPmZpcm13YXJlKTsKKworCWlmIChyZXQpIHsKKwkJbGJzX3ByX2RlYnVnKDEsICJCb290bG9hZGVyIGluIGludmFsaWQgc3RhdGUhXG4iKTsKKwkJcmV0ID0gLTE7CisJCWdvdG8gZG9uZTsKKwl9CisKKwkvKgorCSAqIFJlYWQgTUFDIGFkZHJlc3MgZnJvbSBIVworCSAqLworCW1lbXNldChhZGFwdGVyLT5jdXJyZW50X2FkZHIsIDB4ZmYsIEVUSF9BTEVOKTsKKworCXJldCA9IGxpYmVydGFzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZChwcml2LCBjbWRfZ2V0X2h3X3NwZWMsCisJCQkJICAgIDAsIGNtZF9vcHRpb25fd2FpdGZvcnJzcCwgMCwgTlVMTCk7CisKKwlpZiAocmV0KSB7CisJCXJldCA9IC0xOworCQlnb3RvIGRvbmU7CisJfQorCisJbGliZXJ0YXNfc2V0X21hY19wYWNrZXRfZmlsdGVyKHByaXYpOworCisJLyogR2V0IHRoZSBzdXBwb3J0ZWQgRGF0YSByYXRlcyAqLworCXJldCA9IGxpYmVydGFzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZChwcml2LCBjbWRfODAyXzExX2RhdGFfcmF0ZSwKKwkJCQkgICAgY21kX2FjdF9nZXRfdHhfcmF0ZSwKKwkJCQkgICAgY21kX29wdGlvbl93YWl0Zm9ycnNwLCAwLCBOVUxMKTsKKworCWlmIChyZXQpIHsKKwkJcmV0ID0gLTE7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlyZXQgPSAwOworZG9uZToKKwlMRUFWRSgpOworCisJcmV0dXJuIChyZXQpOworfQorCitzdGF0aWMgaW50IHdsYW5fYWxsb2NhdGVfYWRhcHRlcih3bGFuX3ByaXZhdGUgKiBwcml2KQoreworCXUzMiB1bGJ1ZnNpemU7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKworCXN0cnVjdCBic3NfZGVzY3JpcHRvciAqcHRlbXBzY2FudGFibGU7CisKKwkvKiBBbGxvY2F0ZSBidWZmZXIgdG8gc3RvcmUgdGhlIEJTU0lEIGxpc3QgKi8KKwl1bGJ1ZnNpemUgPSBzaXplb2Yoc3RydWN0IGJzc19kZXNjcmlwdG9yKSAqIE1SVkRSVl9NQVhfQlNTSURfTElTVDsKKwlpZiAoIShwdGVtcHNjYW50YWJsZSA9IGttYWxsb2ModWxidWZzaXplLCBHRlBfS0VSTkVMKSkpIHsKKwkJbGliZXJ0YXNfZnJlZV9hZGFwdGVyKHByaXYpOworCQlyZXR1cm4gLTE7CisJfQorCisJYWRhcHRlci0+c2NhbnRhYmxlID0gcHRlbXBzY2FudGFibGU7CisJbWVtc2V0KGFkYXB0ZXItPnNjYW50YWJsZSwgMCwgdWxidWZzaXplKTsKKworCS8qIEFsbG9jYXRlIHRoZSBjb21tYW5kIGJ1ZmZlcnMgKi8KKwlsaWJlcnRhc19hbGxvY2F0ZV9jbWRfYnVmZmVyKHByaXYpOworCisJbWVtc2V0KCZhZGFwdGVyLT5saWJlcnRhc19wc19jb25maXJtX3NsZWVwLCAwLCBzaXplb2Yoc3RydWN0IFBTX0NNRF9Db25maXJtU2xlZXApKTsKKwlhZGFwdGVyLT5saWJlcnRhc19wc19jb25maXJtX3NsZWVwLnNlcW51bSA9IGNwdV90b19sZTE2KCsrYWRhcHRlci0+c2VxbnVtKTsKKwlhZGFwdGVyLT5saWJlcnRhc19wc19jb25maXJtX3NsZWVwLmNvbW1hbmQgPQorCSAgICBjcHVfdG9fbGUxNihjbWRfODAyXzExX3BzX21vZGUpOworCWFkYXB0ZXItPmxpYmVydGFzX3BzX2NvbmZpcm1fc2xlZXAuc2l6ZSA9CisJICAgIGNwdV90b19sZTE2KHNpemVvZihzdHJ1Y3QgUFNfQ01EX0NvbmZpcm1TbGVlcCkpOworCWFkYXB0ZXItPmxpYmVydGFzX3BzX2NvbmZpcm1fc2xlZXAucmVzdWx0ID0gMDsKKwlhZGFwdGVyLT5saWJlcnRhc19wc19jb25maXJtX3NsZWVwLmFjdGlvbiA9CisJICAgIGNwdV90b19sZTE2KGNtZF9zdWJjbWRfc2xlZXBfY29uZmlybWVkKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB3bGFuX2luaXRfYWRhcHRlcih3bGFuX3ByaXZhdGUgKiBwcml2KQoreworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJaW50IGk7CisKKwlhZGFwdGVyLT5zY2FucHJvYmVzID0gMDsKKworCWFkYXB0ZXItPmJjbl9hdmdfZmFjdG9yID0gREVGQVVMVF9CQ05fQVZHX0ZBQ1RPUjsKKwlhZGFwdGVyLT5kYXRhX2F2Z19mYWN0b3IgPSBERUZBVUxUX0RBVEFfQVZHX0ZBQ1RPUjsKKworCS8qIEFUSU0gcGFyYW1zICovCisJYWRhcHRlci0+YXRpbXdpbmRvdyA9IDA7CisKKwlhZGFwdGVyLT5jb25uZWN0X3N0YXR1cyA9IGxpYmVydGFzX2Rpc2Nvbm5lY3RlZDsKKwltZW1zZXQoYWRhcHRlci0+Y3VycmVudF9hZGRyLCAweGZmLCBFVEhfQUxFTik7CisKKwkvKiBzY2FuIHR5cGUgKi8KKwlhZGFwdGVyLT5zY2FudHlwZSA9IGNtZF9zY2FuX3R5cGVfYWN0aXZlOworCisJLyogc2NhbiBtb2RlICovCisJYWRhcHRlci0+c2Nhbm1vZGUgPSBjbWRfYnNzX3R5cGVfYW55OworCisJLyogODAyLjExIHNwZWNpZmljICovCisJYWRhcHRlci0+c2VjaW5mby5XRVBzdGF0dXMgPSB3bGFuODAyXzExV0VQZGlzYWJsZWQ7CisJZm9yIChpID0gMDsgaSA8IHNpemVvZihhZGFwdGVyLT53ZXBfa2V5cykgLyBzaXplb2YoYWRhcHRlci0+d2VwX2tleXNbMF0pOworCSAgICAgaSsrKQorCQltZW1zZXQoJmFkYXB0ZXItPndlcF9rZXlzW2ldLCAwLCBzaXplb2Yoc3RydWN0IFdMQU5fODAyXzExX0tFWSkpOworCWFkYXB0ZXItPndlcF90eF9rZXlpZHggPSAwOworCWFkYXB0ZXItPnNlY2luZm8uV0VQc3RhdHVzID0gd2xhbjgwMl8xMVdFUGRpc2FibGVkOworCWFkYXB0ZXItPnNlY2luZm8uYXV0aG1vZGUgPSB3bGFuODAyXzExYXV0aG1vZGVvcGVuOworCWFkYXB0ZXItPnNlY2luZm8uYXV0aDF4YWxnID0gV0xBTl8xWF9BVVRIX0FMR19OT05FOworCWFkYXB0ZXItPnNlY2luZm8uRW5jcnlwdGlvbm1vZGUgPSBDSVBIRVJfTk9ORTsKKwlhZGFwdGVyLT5pbmZyYW1vZGUgPSB3bGFuODAyXzExaW5mcmFzdHJ1Y3R1cmU7CisKKwlhZGFwdGVyLT5hc3NvY19yZXEgPSBOVUxMOworCisJYWRhcHRlci0+bnVtaW5zY2FudGFibGUgPSAwOworCWFkYXB0ZXItPnBhdHRlbXB0ZWRic3NkZXNjID0gTlVMTDsKKwltdXRleF9pbml0KCZhZGFwdGVyLT5sb2NrKTsKKworCWFkYXB0ZXItPnByZXNjYW4gPSAxOworCisJbWVtc2V0KCZhZGFwdGVyLT5jdXJic3NwYXJhbXMsIDAsIHNpemVvZihhZGFwdGVyLT5jdXJic3NwYXJhbXMpKTsKKworCS8qIFBuUCBhbmQgcG93ZXIgcHJvZmlsZSAqLworCWFkYXB0ZXItPnN1cnByaXNlcmVtb3ZlZCA9IDA7CisKKwlhZGFwdGVyLT5jdXJyZW50cGFja2V0ZmlsdGVyID0KKwkgICAgY21kX2FjdF9tYWNfcnhfb24gfCBjbWRfYWN0X21hY190eF9vbjsKKworCWFkYXB0ZXItPnJhZGlvb24gPSBSQURJT19PTjsKKwlhZGFwdGVyLT50eGFudGVubmEgPSBSRl9BTlRFTk5BXzI7CisJYWRhcHRlci0+cnhhbnRlbm5hID0gUkZfQU5URU5OQV9BVVRPOworCisJYWRhcHRlci0+aXNfZGF0YXJhdGVfYXV0byA9IDE7CisJYWRhcHRlci0+YmVhY29ucGVyaW9kID0gTVJWRFJWX0JFQUNPTl9JTlRFUlZBTDsKKworCS8vIHNldCBkZWZhdWx0IHZhbHVlIG9mIGNhcGluZm8uCisjZGVmaW5lIFNIT1JUX1BSRUFNQkxFX0FMTE9XRUQJCTEKKwltZW1zZXQoJmFkYXB0ZXItPmNhcGluZm8sIDAsIHNpemVvZihhZGFwdGVyLT5jYXBpbmZvKSk7CisJYWRhcHRlci0+Y2FwaW5mby5zaG9ydHByZWFtYmxlID0gU0hPUlRfUFJFQU1CTEVfQUxMT1dFRDsKKworCWFkYXB0ZXItPmFkaG9jY2hhbm5lbCA9IERFRkFVTFRfQURfSE9DX0NIQU5ORUw7CisKKwlhZGFwdGVyLT5wc21vZGUgPSB3bGFuODAyXzExcG93ZXJtb2RlY2FtOworCWFkYXB0ZXItPm11bHRpcGxlZHRpbSA9IE1SVkRSVl9ERUZBVUxUX01VTFRJUExFX0RUSU07CisKKwlhZGFwdGVyLT5saXN0ZW5pbnRlcnZhbCA9IE1SVkRSVl9ERUZBVUxUX0xJU1RFTl9JTlRFUlZBTDsKKworCWFkYXB0ZXItPnBzc3RhdGUgPSBQU19TVEFURV9GVUxMX1BPV0VSOworCWFkYXB0ZXItPm5lZWR0b3dha2V1cCA9IDA7CisJYWRhcHRlci0+bG9jYWxsaXN0ZW5pbnRlcnZhbCA9IDA7CS8qIGRlZmF1bHQgdmFsdWUgaW4gZmlybXdhcmUgd2lsbCBiZSB1c2VkICovCisKKwlhZGFwdGVyLT5kYXRhcmF0ZSA9IDA7CS8vIEluaXRpYWxseSBpbmRpY2F0ZSB0aGUgcmF0ZSBhcyBhdXRvCisKKwlhZGFwdGVyLT5hZGhvY19ncmF0ZV9lbmFibGVkID0gMDsKKworCWFkYXB0ZXItPmludGNvdW50ZXIgPSAwOworCisJYWRhcHRlci0+Y3VycmVudHR4c2tiID0gTlVMTDsKKwlhZGFwdGVyLT5wa3R0eGN0cmwgPSAwOworCisJbWVtc2V0KCZhZGFwdGVyLT50eF9xdWV1ZV9wcywgMCwgTlJfVFhfUVVFVUUqc2l6ZW9mKHN0cnVjdCBza19idWZmKikpOworCWFkYXB0ZXItPnR4X3F1ZXVlX2lkeCA9IDA7CisJc3Bpbl9sb2NrX2luaXQoJmFkYXB0ZXItPnR4cXVldWVfbG9jayk7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIGNvbW1hbmRfdGltZXJfZm4odW5zaWduZWQgbG9uZyBkYXRhKTsKKworaW50IGxpYmVydGFzX2luaXRfZncod2xhbl9wcml2YXRlICogcHJpdikKK3sKKwlpbnQgcmV0ID0gLTE7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKworCUVOVEVSKCk7CisKKwkvKiBBbGxvY2F0ZSBhZGFwdGVyIHN0cnVjdHVyZSAqLworCWlmICgocmV0ID0gd2xhbl9hbGxvY2F0ZV9hZGFwdGVyKHByaXYpKSAhPSAwKQorCQlnb3RvIGRvbmU7CisKKwkvKiBpbml0IGFkYXB0ZXIgc3RydWN0dXJlICovCisJd2xhbl9pbml0X2FkYXB0ZXIocHJpdik7CisKKwkvKiBpbml0IHRpbWVyIGV0Yy4gKi8KKwlzZXR1cF90aW1lcigmYWRhcHRlci0+Y29tbWFuZF90aW1lciwgY29tbWFuZF90aW1lcl9mbiwKKwkJCSh1bnNpZ25lZCBsb25nKXByaXYpOworCisJLyogZG93bmxvYWQgZmltcndhcmUgZXRjLiAqLworCWlmICgocmV0ID0gd2xhbl9zZXR1cF9zdGF0aW9uX2h3KHByaXYpKSAhPSAwKSB7CisJCWRlbF90aW1lcl9zeW5jKCZhZGFwdGVyLT5jb21tYW5kX3RpbWVyKTsKKwkJZ290byBkb25lOworCX0KKworCS8qIGluaXQgODAyLjExZCAqLworCWxpYmVydGFzX2luaXRfMTFkKHByaXYpOworCisJcmV0ID0gMDsKK2RvbmU6CisJTEVBVkUoKTsKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIGxpYmVydGFzX2ZyZWVfYWRhcHRlcih3bGFuX3ByaXZhdGUgKiBwcml2KQoreworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisKKwlpZiAoIWFkYXB0ZXIpIHsKKwkJbGJzX3ByX2RlYnVnKDEsICJXaHkgZG91YmxlIGZyZWUgYWRhcHRlcj86KVxuIik7CisJCXJldHVybjsKKwl9CisKKwlsYnNfcHJfZGVidWcoMSwgIkZyZWUgY29tbWFuZCBidWZmZXJcbiIpOworCWxpYmVydGFzX2ZyZWVfY21kX2J1ZmZlcihwcml2KTsKKworCWxic19wcl9kZWJ1ZygxLCAiRnJlZSBjb21tYW5kVGltZXJcbiIpOworCWRlbF90aW1lcigmYWRhcHRlci0+Y29tbWFuZF90aW1lcik7CisKKwlsYnNfcHJfZGVidWcoMSwgIkZyZWUgc2NhbnRhYmxlXG4iKTsKKwlpZiAoYWRhcHRlci0+c2NhbnRhYmxlKSB7CisJCWtmcmVlKGFkYXB0ZXItPnNjYW50YWJsZSk7CisJCWFkYXB0ZXItPnNjYW50YWJsZSA9IE5VTEw7CisJfQorCisJbGJzX3ByX2RlYnVnKDEsICJGcmVlIGFkYXB0ZXJcbiIpOworCisJLyogRnJlZSB0aGUgYWRhcHRlciBvYmplY3QgaXRzZWxmICovCisJa2ZyZWUoYWRhcHRlcik7CisJcHJpdi0+YWRhcHRlciA9IE5VTEw7Cit9CisKKy8qKgorICogIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyB0aGUgdGltZW91dCBvZiBjb21tYW5kIHNlbmRpbmcuCisgKiAgSXQgd2lsbCByZS1zZW5kIHRoZSBzYW1lIGNvbW1hbmQgYWdhaW4uCisgKi8KK3N0YXRpYyB2b2lkIGNvbW1hbmRfdGltZXJfZm4odW5zaWduZWQgbG9uZyBkYXRhKQoreworCXdsYW5fcHJpdmF0ZSAqcHJpdiA9ICh3bGFuX3ByaXZhdGUgKilkYXRhOworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJc3RydWN0IGNtZF9jdHJsX25vZGUgKnB0ZW1wbm9kZTsKKwlzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKmNtZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJcHRlbXBub2RlID0gYWRhcHRlci0+Y3VyX2NtZDsKKwljbWQgPSAoc3RydWN0IGNtZF9kc19jb21tYW5kICopcHRlbXBub2RlLT5idWZ2aXJ0dWFsYWRkcjsKKworCWxic19wcl9pbmZvKCJjb21tYW5kX3RpbWVyX2ZuIGZpcmVkICgleClcbiIsIGNtZC0+Y29tbWFuZCk7CisKKwlpZiAoIWFkYXB0ZXItPmZ3X3JlYWR5KQorCQlyZXR1cm47CisKKwlpZiAocHRlbXBub2RlID09IE5VTEwpIHsKKwkJbGJzX3ByX2RlYnVnKDEsICJQVGVtcG5vZGUgRW1wdHlcbiIpOworCQlyZXR1cm47CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPmRyaXZlcl9sb2NrLCBmbGFncyk7CisJYWRhcHRlci0+Y3VyX2NtZCA9IE5VTEw7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKKworCWxic19wcl9kZWJ1ZygxLCAiUmUtc2VuZGluZyBzYW1lIGNvbW1hbmQgYXMgaXQgdGltZW91dC4uLiFcbiIpOworCWxpYmVydGFzX3F1ZXVlX2NtZChhZGFwdGVyLCBwdGVtcG5vZGUsIDApOworCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwcml2LT5tYWludGhyZWFkLndhaXRxKTsKKworCXJldHVybjsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2Z3LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9mdy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmOWFlMjYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9mdy5oCkBAIC0wLDAgKzEsMTMgQEAKKy8qKgorICAqIFRoaXMgaGVhZGVyIGZpbGUgY29udGFpbnMgRlcgaW50ZXJmYWNlIHJlbGF0ZWQgZGVmaW5pdGlvbnMuCisgICovCisjaWZuZGVmIF9XTEFOX0ZXX0hfCisjZGVmaW5lIF9XTEFOX0ZXX0hfCisKKyNpZm5kZWYgREVWX05BTUVfTEVOCisjZGVmaW5lIERFVl9OQU1FX0xFTiAgICAgICAgICAgIDMyCisjZW5kaWYKKworaW50IGxpYmVydGFzX2luaXRfZncod2xhbl9wcml2YXRlICogcHJpdik7CisKKyNlbmRpZgkJCQkvKiBfV0xBTl9GV19IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvaG9zdC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvaG9zdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwZmFhZWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9ob3N0LmgKQEAgLTAsMCArMSwzMzggQEAKKy8qKgorICAqIFRoaXMgZmlsZSBjb250YWlucyBkZWZpbml0aW9ucyBvZiBXTEFOIGNvbW1hbmRzLgorICAqLworCisjaWZuZGVmIF9IT1NUX0hfCisjZGVmaW5lIF9IT1NUX0hfCisKKy8qKiBQVUJMSUMgREVGSU5JVElPTlMgKi8KKyNkZWZpbmUgREVGQVVMVF9BRF9IT0NfQ0hBTk5FTCAgICAgICA2CisjZGVmaW5lIERFRkFVTFRfQURfSE9DX0NIQU5ORUxfQSAgICAzNgorCisvKiogSUVFRSA4MDIuMTEgb2lkcyAqLworI2RlZmluZSBPSURfODAyXzExX1NTSUQgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDgwMDIKKyNkZWZpbmUgT0lEXzgwMl8xMV9JTkZSQVNUUlVDVFVSRV9NT0RFICAgICAgICAweDAwMDA4MDA4CisjZGVmaW5lIE9JRF84MDJfMTFfRlJBR01FTlRBVElPTl9USFJFU0hPTEQgICAgMHgwMDAwODAwOQorI2RlZmluZSBPSURfODAyXzExX1JUU19USFJFU0hPTEQgICAgICAgICAgICAgIDB4MDAwMDgwMEEKKyNkZWZpbmUgT0lEXzgwMl8xMV9UWF9BTlRFTk5BX1NFTEVDVEVEICAgICAgICAweDAwMDA4MDBECisjZGVmaW5lIE9JRF84MDJfMTFfU1VQUE9SVEVEX1JBVEVTICAgICAgICAgICAgMHgwMDAwODAwRQorI2RlZmluZSBPSURfODAyXzExX1NUQVRJU1RJQ1MgICAgICAgICAgICAgICAgIDB4MDAwMDgwMTIKKyNkZWZpbmUgT0lEXzgwMl8xMV9UWF9SRVRSWUNPVU5UICAgICAgICAgICAgICAweDAwMDA4MDFECisjZGVmaW5lIE9JRF84MDJfMTFEX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgMHgwMDAwODAyMAorCisjZGVmaW5lIGNtZF9vcHRpb25fd2FpdGZvcnJzcCAgICAgICAgICAgICAweDAwMDIKKworLyoqIEhvc3QgY29tbWFuZCBJRCAqLworI2RlZmluZSBjbWRfY29kZV9kbmxkICAgICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgY21kX2dldF9od19zcGVjICAgICAgICAgICAgICAgMHgwMDAzCisjZGVmaW5lIGNtZF9lZXByb21fdXBkYXRlICAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBjbWRfODAyXzExX3Jlc2V0ICAgICAgICAgICAgICAweDAwMDUKKyNkZWZpbmUgY21kXzgwMl8xMV9zY2FuICAgICAgICAgICAgICAgMHgwMDA2CisjZGVmaW5lIGNtZF84MDJfMTFfZ2V0X2xvZyAgICAgICAgICAgIDB4MDAwYgorI2RlZmluZSBjbWRfbWFjX211bHRpY2FzdF9hZHIgICAgICAgICAweDAwMTAKKyNkZWZpbmUgY21kXzgwMl8xMV9hdXRoZW50aWNhdGUgICAgICAgMHgwMDExCisjZGVmaW5lIGNtZF84MDJfMTFfZWVwcm9tX2FjY2VzcyAgICAgIDB4MDA1OQorI2RlZmluZSBjbWRfODAyXzExX2Fzc29jaWF0ZSAgICAgICAgICAweDAwNTAKKyNkZWZpbmUgY21kXzgwMl8xMV9zZXRfd2VwICAgICAgICAgICAgMHgwMDEzCisjZGVmaW5lIGNtZF84MDJfMTFfZ2V0X3N0YXQgICAgICAgICAgIDB4MDAxNAorI2RlZmluZSBjbWRfODAyXzNfZ2V0X3N0YXQgICAgICAgICAgICAweDAwMTUKKyNkZWZpbmUgY21kXzgwMl8xMV9zbm1wX21pYiAgICAgICAgICAgMHgwMDE2CisjZGVmaW5lIGNtZF9tYWNfcmVnX21hcCAgICAgICAgICAgICAgIDB4MDAxNworI2RlZmluZSBjbWRfYmJwX3JlZ19tYXAgICAgICAgICAgICAgICAweDAwMTgKKyNkZWZpbmUgY21kX21hY19yZWdfYWNjZXNzICAgICAgICAgICAgMHgwMDE5CisjZGVmaW5lIGNtZF9iYnBfcmVnX2FjY2VzcyAgICAgICAgICAgIDB4MDAxYQorI2RlZmluZSBjbWRfcmZfcmVnX2FjY2VzcyAgICAgICAgICAgICAweDAwMWIKKyNkZWZpbmUgY21kXzgwMl8xMV9yYWRpb19jb250cm9sICAgICAgMHgwMDFjCisjZGVmaW5lIGNtZF84MDJfMTFfcmZfY2hhbm5lbCAgICAgICAgIDB4MDAxZAorI2RlZmluZSBjbWRfODAyXzExX3JmX3R4X3Bvd2VyICAgICAgICAweDAwMWUKKyNkZWZpbmUgY21kXzgwMl8xMV9yc3NpICAgICAgICAgICAgICAgMHgwMDFmCisjZGVmaW5lIGNtZF84MDJfMTFfcmZfYW50ZW5uYSAgICAgICAgIDB4MDAyMAorCisjZGVmaW5lIGNtZF84MDJfMTFfcHNfbW9kZQkgICAgICAweDAwMjEKKworI2RlZmluZSBjbWRfODAyXzExX2RhdGFfcmF0ZSAgICAgICAgICAweDAwMjIKKyNkZWZpbmUgY21kX3JmX3JlZ19tYXAgICAgICAgICAgICAgICAgMHgwMDIzCisjZGVmaW5lIGNtZF84MDJfMTFfZGVhdXRoZW50aWNhdGUgICAgIDB4MDAyNAorI2RlZmluZSBjbWRfODAyXzExX3JlYXNzb2NpYXRlICAgICAgICAweDAwMjUKKyNkZWZpbmUgY21kXzgwMl8xMV9kaXNhc3NvY2lhdGUgICAgICAgMHgwMDI2CisjZGVmaW5lIGNtZF9tYWNfY29udHJvbCAgICAgICAgICAgICAgIDB4MDAyOAorI2RlZmluZSBjbWRfODAyXzExX2FkX2hvY19zdGFydCAgICAgICAweDAwMmIKKyNkZWZpbmUgY21kXzgwMl8xMV9hZF9ob2Nfam9pbiAgICAgICAgMHgwMDJjCisKKyNkZWZpbmUgY21kXzgwMl8xMV9xdWVyeV90a2lwX3JlcGx5X2NudHJzICAweDAwMmUKKyNkZWZpbmUgY21kXzgwMl8xMV9lbmFibGVfcnNuICAgICAgICAgICAgICAweDAwMmYKKyNkZWZpbmUgY21kXzgwMl8xMV9wYWlyd2lzZV90c2MgICAgICAgMHgwMDM2CisjZGVmaW5lIGNtZF84MDJfMTFfZ3JvdXBfdHNjICAgICAgICAgIDB4MDAzNworI2RlZmluZSBjbWRfODAyXzExX2tleV9tYXRlcmlhbCAgICAgICAweDAwNWUKKworI2RlZmluZSBjbWRfODAyXzExX3NldF9hZmMgICAgICAgICAgICAweDAwM2MKKyNkZWZpbmUgY21kXzgwMl8xMV9nZXRfYWZjICAgICAgICAgICAgMHgwMDNkCisKKyNkZWZpbmUgY21kXzgwMl8xMV9hZF9ob2Nfc3RvcCAgICAgICAgMHgwMDQwCisKKyNkZWZpbmUgY21kXzgwMl8xMV9iZWFjb25fc3RvcCAgICAgICAgMHgwMDQ5CisKKyNkZWZpbmUgY21kXzgwMl8xMV9tYWNfYWRkcmVzcyAgICAgICAgMHgwMDRECisjZGVmaW5lIGNtZF84MDJfMTFfZWVwcm9tX2FjY2VzcyAgICAgIDB4MDA1OQorCisjZGVmaW5lIGNtZF84MDJfMTFfYmFuZF9jb25maWcgICAgICAgIDB4MDA1OAorCisjZGVmaW5lIGNtZF84MDJfMTFkX2RvbWFpbl9pbmZvICAgICAgIDB4MDA1YgorCisjZGVmaW5lIGNtZF84MDJfMTFfc2xlZXBfcGFyYW1zICAgICAgICAgIDB4MDA2NgorCisjZGVmaW5lIGNtZF84MDJfMTFfaW5hY3Rpdml0eV90aW1lb3V0ICAgIDB4MDA2NworCisjZGVmaW5lIGNtZF84MDJfMTFfdHBjX2NmZyAgICAgICAgICAgICAgIDB4MDA3MgorI2RlZmluZSBjbWRfODAyXzExX3B3cl9jZmcgICAgICAgICAgICAgICAweDAwNzMKKworI2RlZmluZSBjbWRfODAyXzExX2xlZF9ncGlvX2N0cmwgICAgICAgICAweDAwNGUKKworI2RlZmluZSBjbWRfODAyXzExX3N1YnNjcmliZV9ldmVudCAgICAgICAweDAwNzUKKworI2RlZmluZSBjbWRfODAyXzExX3JhdGVfYWRhcHRfcmF0ZXNldCAgICAweDAwNzYKKworI2RlZmluZSBjbWRfODAyXzExX3R4X3JhdGVfcXVlcnkJMHgwMDdmCisKKyNkZWZpbmUgY21kX2dldF90c2YgICAgICAgICAgICAgICAgICAgICAgMHgwMDgwCisKKyNkZWZpbmUgY21kX2J0X2FjY2VzcyAgICAgICAgICAgICAgICAgMHgwMDg3CisjZGVmaW5lIGNtZF9yZXRfYnRfYWNjZXNzICAgICAgICAgICAgICAgICAweDgwODcKKworI2RlZmluZSBjbWRfZnd0X2FjY2VzcyAgICAgICAgICAgICAgICAweDAwODgKKyNkZWZpbmUgY21kX3JldF9md3RfYWNjZXNzICAgICAgICAgICAgICAgIDB4ODA4OAorCisjZGVmaW5lIGNtZF9tZXNoX2FjY2VzcyAgICAgICAgICAgICAgIDB4MDA5MAorI2RlZmluZSBjbWRfcmV0X21lc2hfYWNjZXNzICAgICAgICAgICAgICAgMHg4MDkwCisKKy8qIEZvciB0aGUgSUVFRSBQb3dlciBTYXZlICovCisjZGVmaW5lIGNtZF9zdWJjbWRfZW50ZXJfcHMgICAgICAgICAgICAgICAweDAwMzAKKyNkZWZpbmUgY21kX3N1YmNtZF9leGl0X3BzICAgICAgICAgICAgICAgIDB4MDAzMQorI2RlZmluZSBjbWRfc3ViY21kX3NsZWVwX2NvbmZpcm1lZCAgICAgICAgMHgwMDM0CisjZGVmaW5lIGNtZF9zdWJjbWRfZnVsbF9wb3dlcmRvd24gICAgICAgICAweDAwMzUKKyNkZWZpbmUgY21kX3N1YmNtZF9mdWxsX3Bvd2VydXAgICAgICAgICAgIDB4MDAzNgorCisvKiBjb21tYW5kIFJFVCBjb2RlLCBNU0IgaXMgc2V0IHRvIDEgKi8KKyNkZWZpbmUgY21kX3JldF9od19zcGVjX2luZm8gICAgICAgICAgICAgIDB4ODAwMworI2RlZmluZSBjbWRfcmV0X2VlcHJvbV91cGRhdGUgICAgICAgICAgICAgMHg4MDA0CisjZGVmaW5lIGNtZF9yZXRfODAyXzExX3Jlc2V0ICAgICAgICAgICAgICAweDgwMDUKKyNkZWZpbmUgY21kX3JldF84MDJfMTFfc2NhbiAgICAgICAgICAgICAgIDB4ODAwNgorI2RlZmluZSBjbWRfcmV0XzgwMl8xMV9nZXRfbG9nICAgICAgICAgICAgMHg4MDBiCisjZGVmaW5lIGNtZF9yZXRfbWFjX2NvbnRyb2wgICAgICAgICAgICAgICAweDgwMjgKKyNkZWZpbmUgY21kX3JldF9tYWNfbXVsdGljYXN0X2FkciAgICAgICAgIDB4ODAxMAorI2RlZmluZSBjbWRfcmV0XzgwMl8xMV9hdXRoZW50aWNhdGUgICAgICAgMHg4MDExCisjZGVmaW5lIGNtZF9yZXRfODAyXzExX2RlYXV0aGVudGljYXRlICAgICAweDgwMjQKKyNkZWZpbmUgY21kX3JldF84MDJfMTFfYXNzb2NpYXRlICAgICAgICAgIDB4ODAxMgorI2RlZmluZSBjbWRfcmV0XzgwMl8xMV9yZWFzc29jaWF0ZSAgICAgICAgMHg4MDI1CisjZGVmaW5lIGNtZF9yZXRfODAyXzExX2Rpc2Fzc29jaWF0ZSAgICAgICAweDgwMjYKKyNkZWZpbmUgY21kX3JldF84MDJfMTFfc2V0X3dlcCAgICAgICAgICAgIDB4ODAxMworI2RlZmluZSBjbWRfcmV0XzgwMl8xMV9zdGF0ICAgICAgICAgICAgICAgMHg4MDE0CisjZGVmaW5lIGNtZF9yZXRfODAyXzNfc3RhdCAgICAgICAgICAgICAgICAweDgwMTUKKyNkZWZpbmUgY21kX3JldF84MDJfMTFfc25tcF9taWIgICAgICAgICAgIDB4ODAxNgorI2RlZmluZSBjbWRfcmV0X21hY19yZWdfbWFwICAgICAgICAgICAgICAgMHg4MDE3CisjZGVmaW5lIGNtZF9yZXRfYmJwX3JlZ19tYXAgICAgICAgICAgICAgICAweDgwMTgKKyNkZWZpbmUgY21kX3JldF9yZl9yZWdfbWFwICAgICAgICAgICAgICAgIDB4ODAyMworI2RlZmluZSBjbWRfcmV0X21hY19yZWdfYWNjZXNzICAgICAgICAgICAgMHg4MDE5CisjZGVmaW5lIGNtZF9yZXRfYmJwX3JlZ19hY2Nlc3MgICAgICAgICAgICAweDgwMWEKKyNkZWZpbmUgY21kX3JldF9yZl9yZWdfYWNjZXNzICAgICAgICAgICAgIDB4ODAxYgorI2RlZmluZSBjbWRfcmV0XzgwMl8xMV9yYWRpb19jb250cm9sICAgICAgMHg4MDFjCisjZGVmaW5lIGNtZF9yZXRfODAyXzExX3JmX2NoYW5uZWwgICAgICAgICAweDgwMWQKKyNkZWZpbmUgY21kX3JldF84MDJfMTFfcnNzaSAgICAgICAgICAgICAgIDB4ODAxZgorI2RlZmluZSBjbWRfcmV0XzgwMl8xMV9yZl90eF9wb3dlciAgICAgICAgMHg4MDFlCisjZGVmaW5lIGNtZF9yZXRfODAyXzExX3JmX2FudGVubmEgICAgICAgICAweDgwMjAKKyNkZWZpbmUgY21kX3JldF84MDJfMTFfcHNfbW9kZSAgICAgICAgICAgIDB4ODAyMQorI2RlZmluZSBjbWRfcmV0XzgwMl8xMV9kYXRhX3JhdGUgICAgICAgICAgMHg4MDIyCisKKyNkZWZpbmUgY21kX3JldF84MDJfMTFfYWRfaG9jX3N0YXJ0ICAgICAgIDB4ODAyQgorI2RlZmluZSBjbWRfcmV0XzgwMl8xMV9hZF9ob2Nfam9pbiAgICAgICAgMHg4MDJDCisKKyNkZWZpbmUgY21kX3JldF84MDJfMTFfcXVlcnlfdGtpcF9yZXBseV9jbnRycyAgMHg4MDJlCisjZGVmaW5lIGNtZF9yZXRfODAyXzExX2VuYWJsZV9yc24gICAgICAgICAgICAgIDB4ODAyZgorI2RlZmluZSBjbWRfcmV0XzgwMl8xMV9wYWlyd2lzZV90c2MgICAgICAgMHg4MDM2CisjZGVmaW5lIGNtZF9yZXRfODAyXzExX2dyb3VwX3RzYyAgICAgICAgICAweDgwMzcKKyNkZWZpbmUgY21kX3JldF84MDJfMTFfa2V5X21hdGVyaWFsICAgICAgIDB4ODA1ZQorCisjZGVmaW5lIGNtZF9lbmFibGVfcnNuICAgICAgICAgICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgY21kX2Rpc2FibGVfcnNuICAgICAgICAgICAgICAgICAgIDB4MDAwMAorCisjZGVmaW5lIGNtZF9hY3Rfc2V0ICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgY21kX2FjdF9nZXQgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMAorCisjZGVmaW5lIGNtZF9hY3RfZ2V0X0FFUyAgICAgICAgICAgICAgICAgICAoY21kX2FjdF9nZXQgKyAyKQorI2RlZmluZSBjbWRfYWN0X3NldF9BRVMgICAgICAgICAgICAgICAgICAgKGNtZF9hY3Rfc2V0ICsgMikKKyNkZWZpbmUgY21kX2FjdF9yZW1vdmVfYWVzICAgICAgICAgICAgICAgIChjbWRfYWN0X3NldCArIDMpCisKKyNkZWZpbmUgY21kX3JldF84MDJfMTFfc2V0X2FmYyAgICAgICAgICAgIDB4ODAzYworI2RlZmluZSBjbWRfcmV0XzgwMl8xMV9nZXRfYWZjICAgICAgICAgICAgMHg4MDNkCisKKyNkZWZpbmUgY21kX3JldF84MDJfMTFfYWRfaG9jX3N0b3AgICAgICAgIDB4ODA0MAorCisjZGVmaW5lIGNtZF9yZXRfODAyXzExX2JlYWNvbl9zdG9wICAgICAgICAweDgwNDkKKworI2RlZmluZSBjbWRfcmV0XzgwMl8xMV9tYWNfYWRkcmVzcyAgICAgICAgMHg4MDRECisjZGVmaW5lIGNtZF9yZXRfODAyXzExX2VlcHJvbV9hY2Nlc3MgICAgICAweDgwNTkKKworI2RlZmluZSBjbWRfcmV0XzgwMl8xMV9iYW5kX2NvbmZpZyAgICAgICAgMHg4MDU4CisKKyNkZWZpbmUgY21kX3JldF84MDJfMTFfc2xlZXBfcGFyYW1zICAgICAgICAgIDB4ODA2NgorCisjZGVmaW5lIGNtZF9yZXRfODAyXzExX2luYWN0aXZpdHlfdGltZW91dCAgICAweDgwNjcKKworI2RlZmluZSBjbWRfcmV0XzgwMl8xMWRfZG9tYWluX2luZm8gICAgICAoMHg4MDAwIHwgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kXzgwMl8xMWRfZG9tYWluX2luZm8pCisKKyNkZWZpbmUgY21kX3JldF84MDJfMTFfdHBjX2NmZyAgICAgICAgKGNtZF84MDJfMTFfdHBjX2NmZyB8IDB4ODAwMCkKKyNkZWZpbmUgY21kX3JldF84MDJfMTFfcHdyX2NmZyAgICAgICAgKGNtZF84MDJfMTFfcHdyX2NmZyB8IDB4ODAwMCkKKworI2RlZmluZSBjbWRfcmV0XzgwMl8xMV9sZWRfZ3Bpb19jdHJsICAgICAweDgwNGUKKworI2RlZmluZSBjbWRfcmV0XzgwMl8xMV9zdWJzY3JpYmVfZXZlbnQJKGNtZF84MDJfMTFfc3Vic2NyaWJlX2V2ZW50IHwgMHg4MDAwKQorCisjZGVmaW5lIGNtZF9yZXRfODAyXzExX3JhdGVfYWRhcHRfcmF0ZXNldAkoY21kXzgwMl8xMV9yYXRlX2FkYXB0X3JhdGVzZXQgfCAweDgwMDApCisKKyNkZWZpbmUgY21kX3J0ZV84MDJfMTFfdHhfcmF0ZV9xdWVyeSAJKGNtZF84MDJfMTFfdHhfcmF0ZV9xdWVyeSB8IDB4ODAwMCkKKworI2RlZmluZSBjbWRfcmV0X2dldF90c2YgICAgICAgICAgICAgMHg4MDgwCisKKy8qIERlZmluZSBhY3Rpb24gb3Igb3B0aW9uIGZvciBjbWRfODAyXzExX3NldF93ZXAgKi8KKyNkZWZpbmUgY21kX2FjdF9hZGQgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIGNtZF9hY3RfcmVtb3ZlICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBjbWRfYWN0X3VzZV9kZWZhdWx0ICAgICAgICAgICAgICAgICAweDAwMDgKKworI2RlZmluZSBjbWRfdHlwZV93ZXBfNDBfYml0ICAgICAgICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgY21kX3R5cGVfd2VwXzEwNF9iaXQgICAgICAgICAgICAgICAgMHgwMDAyCisKKyNkZWZpbmUgY21kX05VTV9PRl9XRVBfS0VZUyAgICAgICAgICAgICAgICAgNAorCisjZGVmaW5lIGNtZF9XRVBfS0VZX0lOREVYX01BU0sgICAgICAgICAgICAgIDB4M2ZmZgorCisvKiBEZWZpbmUgYWN0aW9uIG9yIG9wdGlvbiBmb3IgY21kXzgwMl8xMV9yZXNldCAqLworI2RlZmluZSBjbWRfYWN0X2hhbHQgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDMKKworLyogRGVmaW5lIGFjdGlvbiBvciBvcHRpb24gZm9yIGNtZF84MDJfMTFfc2NhbiAqLworI2RlZmluZSBjbWRfYnNzX3R5cGVfYnNzICAgICAgICAgICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgY21kX2Jzc190eXBlX2lic3MgICAgICAgICAgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIGNtZF9ic3NfdHlwZV9hbnkgICAgICAgICAgICAgICAgICAgIDB4MDAwMworCisvKiBEZWZpbmUgYWN0aW9uIG9yIG9wdGlvbiBmb3IgY21kXzgwMl8xMV9zY2FuICovCisjZGVmaW5lIGNtZF9zY2FuX3R5cGVfYWN0aXZlICAgICAgICAgICAgICAgIDB4MDAwMAorI2RlZmluZSBjbWRfc2Nhbl90eXBlX3Bhc3NpdmUgICAgICAgICAgICAgICAweDAwMDEKKworI2RlZmluZSBjbWRfc2Nhbl9yYWRpb190eXBlX2JnCQkwCisKKyNkZWZpbmUgY21kX3NjYW5fcHJvYmVfZGVsYXlfdGltZSAgICAgICAgICAgMAorCisvKiBEZWZpbmUgYWN0aW9uIG9yIG9wdGlvbiBmb3IgY21kX21hY19jb250cm9sICovCisjZGVmaW5lIGNtZF9hY3RfbWFjX3J4X29uICAgICAgICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBjbWRfYWN0X21hY190eF9vbiAgICAgICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgY21kX2FjdF9tYWNfbG9vcGJhY2tfb24gICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIGNtZF9hY3RfbWFjX3dlcF9lbmFibGUgICAgICAgICAgICAgIDB4MDAwOAorI2RlZmluZSBjbWRfYWN0X21hY19pbnRfZW5hYmxlICAgICAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgY21kX2FjdF9tYWNfbXVsdGljYXN0X2VuYWJsZSAgICAgICAgMHgwMDIwCisjZGVmaW5lIGNtZF9hY3RfbWFjX2Jyb2FkY2FzdF9lbmFibGUgICAgICAgIDB4MDA0MAorI2RlZmluZSBjbWRfYWN0X21hY19wcm9taXNjdW91c19lbmFibGUgICAgICAweDAwODAKKyNkZWZpbmUgY21kX2FjdF9tYWNfYWxsX211bHRpY2FzdF9lbmFibGUgICAgMHgwMTAwCisjZGVmaW5lIGNtZF9hY3RfbWFjX3N0cmljdF9wcm90ZWN0aW9uX2VuYWJsZSAgMHgwNDAwCisKKy8qIERlZmluZSBhY3Rpb24gb3Igb3B0aW9uIGZvciBjbWRfODAyXzExX3JhZGlvX2NvbnRyb2wgKi8KKyNkZWZpbmUgY21kX3R5cGVfYXV0b19wcmVhbWJsZSAgICAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIGNtZF90eXBlX3Nob3J0X3ByZWFtYmxlICAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBjbWRfdHlwZV9sb25nX3ByZWFtYmxlICAgICAgICAgICAgICAweDAwMDMKKworI2RlZmluZSBUVVJOX09OX1JGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBSQURJT19PTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBSQURJT19PRkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMAorCisjZGVmaW5lIFNFVF9BVVRPX1BSRUFNQkxFICAgICAgICAgICAgICAgICAgICAgICAweDA1CisjZGVmaW5lIFNFVF9TSE9SVF9QUkVBTUJMRSAgICAgICAgICAgICAgICAgICAgICAweDAzCisjZGVmaW5lIFNFVF9MT05HX1BSRUFNQkxFICAgICAgICAgICAgICAgICAgICAgICAweDAxCisKKy8qIERlZmluZSBhY3Rpb24gb3Igb3B0aW9uIGZvciBDTURfODAyXzExX1JGX0NIQU5ORUwgKi8KKyNkZWZpbmUgY21kX29wdF84MDJfMTFfcmZfY2hhbm5lbF9nZXQgICAgICAgMHgwMAorI2RlZmluZSBjbWRfb3B0XzgwMl8xMV9yZl9jaGFubmVsX3NldCAgICAgICAweDAxCisKKy8qIERlZmluZSBhY3Rpb24gb3Igb3B0aW9uIGZvciBjbWRfODAyXzExX3JmX3R4X3Bvd2VyICovCisjZGVmaW5lIGNtZF9hY3RfdHhfcG93ZXJfb3B0X2dldCAgICAgICAgICAgIDB4MDAwMAorI2RlZmluZSBjbWRfYWN0X3R4X3Bvd2VyX29wdF9zZXRfaGlnaCAgICAgICAweDgwMDcKKyNkZWZpbmUgY21kX2FjdF90eF9wb3dlcl9vcHRfc2V0X21pZCAgICAgICAgMHg4MDA0CisjZGVmaW5lIGNtZF9hY3RfdHhfcG93ZXJfb3B0X3NldF9sb3cgICAgICAgIDB4ODAwMAorCisjZGVmaW5lIGNtZF9hY3RfdHhfcG93ZXJfaW5kZXhfaGlnaCAgICAgICAgIDB4MDAwNworI2RlZmluZSBjbWRfYWN0X3R4X3Bvd2VyX2luZGV4X21pZCAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgY21kX2FjdF90eF9wb3dlcl9pbmRleF9sb3cgICAgICAgICAgMHgwMDAwCisKKy8qIERlZmluZSBhY3Rpb24gb3Igb3B0aW9uIGZvciBjbWRfODAyXzExX2RhdGFfcmF0ZSAqLworI2RlZmluZSBjbWRfYWN0X3NldF90eF9hdXRvICAgICAgICAgICAgICAgICAweDAwMDAKKyNkZWZpbmUgY21kX2FjdF9zZXRfdHhfZml4X3JhdGUgICAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIGNtZF9hY3RfZ2V0X3R4X3JhdGUgICAgICAgICAgICAgICAgIDB4MDAwMgorCisjZGVmaW5lIGNtZF9hY3Rfc2V0X3J4ICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBjbWRfYWN0X3NldF90eCAgICAgICAgICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgY21kX2FjdF9zZXRfYm90aCAgICAgICAgICAgICAgICAgICAgMHgwMDAzCisjZGVmaW5lIGNtZF9hY3RfZ2V0X3J4ICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBjbWRfYWN0X2dldF90eCAgICAgICAgICAgICAgICAgICAgICAweDAwMDgKKyNkZWZpbmUgY21kX2FjdF9nZXRfYm90aCAgICAgICAgICAgICAgICAgICAgMHgwMDBjCisKKy8qIERlZmluZSBhY3Rpb24gb3Igb3B0aW9uIGZvciBjbWRfODAyXzExX3BzX21vZGUgKi8KKyNkZWZpbmUgY21kX3R5cGVfY2FtICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwCisjZGVmaW5lIGNtZF90eXBlX21heF9wc3AgICAgICAgICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBjbWRfdHlwZV9mYXN0X3BzcCAgICAgICAgICAgICAgICAgICAweDAwMDIKKworLyogRGVmaW5lIGFjdGlvbiBvciBvcHRpb24gZm9yIGNtZF9idF9hY2Nlc3MgKi8KK2VudW0gY21kX2J0X2FjY2Vzc19vcHRzIHsKKwkvKiBUaGUgYnQgY29tbWFuZHMgc3RhcnQgYXQgNSBpbnN0ZWFkIG9mIDEgYmVjYXVzZSB0aGUgb2xkIGRmdCBjb21tYW5kcworCSAqIGFyZSBtYXBwZWQgdG8gMS00LiAgVGhlc2Ugb2xkIGNvbW1hbmRzIGFyZSBubyBsb25nZXIgbWFpbnRhaW5lZCBhbmQKKwkgKiBzaG91bGQgbm90IGJlIGNhbGxlZC4KKwkgKi8KKwljbWRfYWN0X2J0X2FjY2Vzc19hZGQgPSA1LAorCWNtZF9hY3RfYnRfYWNjZXNzX2RlbCwKKwljbWRfYWN0X2J0X2FjY2Vzc19saXN0LAorCWNtZF9hY3RfYnRfYWNjZXNzX3Jlc2V0Cit9OworCisvKiBEZWZpbmUgYWN0aW9uIG9yIG9wdGlvbiBmb3IgY21kX2Z3dF9hY2Nlc3MgKi8KK2VudW0gY21kX2Z3dF9hY2Nlc3Nfb3B0cyB7CisJY21kX2FjdF9md3RfYWNjZXNzX2FkZCA9IDEsCisJY21kX2FjdF9md3RfYWNjZXNzX2RlbCwKKwljbWRfYWN0X2Z3dF9hY2Nlc3NfbG9va3VwLAorCWNtZF9hY3RfZnd0X2FjY2Vzc19saXN0LAorCWNtZF9hY3RfZnd0X2FjY2Vzc19saXN0X3JvdXRlLAorCWNtZF9hY3RfZnd0X2FjY2Vzc19saXN0X25laWdoYm9yLAorCWNtZF9hY3RfZnd0X2FjY2Vzc19yZXNldCwKKwljbWRfYWN0X2Z3dF9hY2Nlc3NfY2xlYW51cCwKKwljbWRfYWN0X2Z3dF9hY2Nlc3NfdGltZSwKK307CisKKy8qIERlZmluZSBhY3Rpb24gb3Igb3B0aW9uIGZvciBjbWRfbWVzaF9hY2Nlc3MgKi8KK2VudW0gY21kX21lc2hfYWNjZXNzX29wdHMgeworCWNtZF9hY3RfbWVzaF9nZXRfdHRsID0gMSwKKwljbWRfYWN0X21lc2hfc2V0X3R0bCwKKwljbWRfYWN0X21lc2hfZ2V0X3N0YXRzLAorCWNtZF9hY3RfbWVzaF9nZXRfbXBwLAorCWNtZF9hY3RfbWVzaF9zZXRfbXBwLAorfTsKKworLyoqIENhcmQgRXZlbnQgZGVmaW5pdGlvbiAqLworI2RlZmluZSBNQUNSRUdfSU5UX0NPREVfVFhfUFBBX0ZSRUUgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBNQUNSRUdfSU5UX0NPREVfVFhfRE1BX0RPTkUgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBNQUNSRUdfSU5UX0NPREVfTElOS19MT1NFX1dfU0NBTiAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBNQUNSRUdfSU5UX0NPREVfTElOS19MT1NFX05PX1NDQU4gICAgICAgMHgwMDAwMDAwMworI2RlZmluZSBNQUNSRUdfSU5UX0NPREVfTElOS19TRU5TRUQgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBNQUNSRUdfSU5UX0NPREVfQ01EX0ZJTklTSEVEICAgICAgICAgICAgMHgwMDAwMDAwNQorI2RlZmluZSBNQUNSRUdfSU5UX0NPREVfTUlCX0NIQU5HRUQgICAgICAgICAgICAgMHgwMDAwMDAwNgorI2RlZmluZSBNQUNSRUdfSU5UX0NPREVfSU5JVF9ET05FICAgICAgICAgICAgICAgMHgwMDAwMDAwNworI2RlZmluZSBNQUNSRUdfSU5UX0NPREVfREVBVVRIRU5USUNBVEVEICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBNQUNSRUdfSU5UX0NPREVfRElTQVNTT0NJQVRFRCAgICAgICAgICAgMHgwMDAwMDAwOQorI2RlZmluZSBNQUNSRUdfSU5UX0NPREVfUFNfQVdBS0UgICAgICAgICAgICAgICAgMHgwMDAwMDAwYQorI2RlZmluZSBNQUNSRUdfSU5UX0NPREVfUFNfU0xFRVAgICAgICAgICAgICAgICAgMHgwMDAwMDAwYgorI2RlZmluZSBNQUNSRUdfSU5UX0NPREVfTUlDX0VSUl9NVUxUSUNBU1QgICAgICAgMHgwMDAwMDAwZAorI2RlZmluZSBNQUNSRUdfSU5UX0NPREVfTUlDX0VSUl9VTklDQVNUICAgICAgICAgMHgwMDAwMDAwZQorI2RlZmluZSBNQUNSRUdfSU5UX0NPREVfV01fQVdBS0UgICAgICAgICAgICAgICAgMHgwMDAwMDAwZgorI2RlZmluZSBNQUNSRUdfSU5UX0NPREVfQURIT0NfQkNOX0xPU1QgICAgICAgICAgMHgwMDAwMDAxMQorI2RlZmluZSBNQUNSRUdfSU5UX0NPREVfUlNTSV9MT1cJCTB4MDAwMDAwMTkKKyNkZWZpbmUgTUFDUkVHX0lOVF9DT0RFX1NOUl9MT1cJCQkweDAwMDAwMDFhCisjZGVmaW5lIE1BQ1JFR19JTlRfQ09ERV9NQVhfRkFJTAkJMHgwMDAwMDAxYgorI2RlZmluZSBNQUNSRUdfSU5UX0NPREVfUlNTSV9ISUdICQkweDAwMDAwMDFjCisjZGVmaW5lIE1BQ1JFR19JTlRfQ09ERV9TTlJfSElHSAkJMHgwMDAwMDAxZAorCisjZW5kaWYJCQkJLyogX0hPU1RfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2hvc3RjbWQuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2hvc3RjbWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjM5ZTVkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvaG9zdGNtZC5oCkBAIC0wLDAgKzEsNjkzIEBACisvKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBmdW5jdGlvbiBwcm90b3R5cGVzLCBkYXRhIHN0cnVjdHVyZQorICogYW5kIGRlZmluZXMgZm9yIGFsbCB0aGUgaG9zdC9zdGF0aW9uIGNvbW1hbmRzCisgKi8KKyNpZm5kZWYgX19IT1NUQ01EX19ICisjZGVmaW5lIF9fSE9TVENNRF9fSAorCisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKyNpbmNsdWRlICIxMWQuaCIKKyNpbmNsdWRlICJ0eXBlcy5oIgorCisvKiA4MDIuMTEtcmVsYXRlZCBkZWZpbml0aW9ucyAqLworCisvKiBUeFBEIGRlc2NyaXB0b3IgKi8KK3N0cnVjdCB0eHBkIHsKKwkvKiBDdXJyZW50IFR4IHBhY2tldCBzdGF0dXMgKi8KKwl1MzIgdHhfc3RhdHVzOworCS8qIFR4IGNvbnRyb2wgKi8KKwl1MzIgdHhfY29udHJvbDsKKwl1MzIgdHhfcGFja2V0X2xvY2F0aW9uOworCS8qIFR4IHBhY2tldCBsZW5ndGggKi8KKwl1MTYgdHhfcGFja2V0X2xlbmd0aDsKKwkvKiBGaXJzdCAyIGJ5dGUgb2YgZGVzdGluYXRpb24gTUFDIGFkZHJlc3MgKi8KKwl1OCB0eF9kZXN0X2FkZHJfaGlnaFsyXTsKKwkvKiBMYXN0IDQgYnl0ZSBvZiBkZXN0aW5hdGlvbiBNQUMgYWRkcmVzcyAqLworCXU4IHR4X2Rlc3RfYWRkcl9sb3dbNF07CisJLyogUGt0IFByaW9yaXR5ICovCisJdTggcHJpb3JpdHk7CisJLyogUGt0IFRyYXNuaXQgUG93ZXIgY29udHJvbCAqLworCXU4IHBvd2VybWdtdDsKKwkvKiBBbW91bnQgb2YgdGltZSB0aGUgcGFja2V0IGhhcyBiZWVuIHF1ZXVlZCBpbiB0aGUgZHJpdmVyICh1bml0cyA9IDJtcykgKi8KKwl1OCBwa3RkZWxheV8ybXM7CisJLyogcmVzZXJ2ZWQgKi8KKwl1OCByZXNlcnZlZDE7Cit9OworCisvKiBSeFBEIERlc2NyaXB0b3IgKi8KK3N0cnVjdCByeHBkIHsKKwkvKiBDdXJyZW50IFJ4IHBhY2tldCBzdGF0dXMgKi8KKwl1MTYgc3RhdHVzOworCisJLyogU05SICovCisJdTggc25yOworCisJLyogVHggY29udHJvbCAqLworCXU4IHJ4X2NvbnRyb2w7CisKKwkvKiBQa3QgbGVuZ3RoICovCisJdTE2IHBrdF9sZW47CisKKwkvKiBOb2lzZSBGbG9vciAqLworCXU4IG5mOworCisJLyogUnggUGFja2V0IFJhdGUgKi8KKwl1OCByeF9yYXRlOworCisJLyogUGt0IGFkZHIgKi8KKwl1MzIgcGt0X3B0cjsKKworCS8qIE5leHQgUnggUnhQRCBhZGRyICovCisJdTMyIG5leHRfcnhwZF9wdHI7CisKKwkvKiBQa3QgUHJpb3JpdHkgKi8KKwl1OCBwcmlvcml0eTsKKwl1OCByZXNlcnZlZFszXTsKK307CisKK3N0cnVjdCBjbWRfY3RybF9ub2RlIHsKKwkvKiBDTUQgbGluayBsaXN0ICovCisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXUzMiBzdGF0dXM7CisJLyogQ01EIElEICovCisJdTMyIGNtZF9vaWQ7CisJLypDTUQgd2FpdCBvcHRpb246IHdhaXQgZm9yIGZpbmlzaCBvciBubyB3YWl0ICovCisJdTE2IHdhaXRfb3B0aW9uOworCS8qIGNvbW1hbmQgcGFyYW1ldGVyICovCisJdm9pZCAqcGRhdGFfYnVmOworCS8qY29tbWFuZCBkYXRhICovCisJdTggKmJ1ZnZpcnR1YWxhZGRyOworCXUxNiBjbWRmbGFnczsKKwkvKiB3YWl0IHF1ZXVlICovCisJdTE2IGNtZHdhaXRxd29rZW47CisJd2FpdF9xdWV1ZV9oZWFkX3QgY21kd2FpdF9xOworfTsKKworLyogV0xBTl84MDJfMTFfS0VZCisgKgorICogR2VuZXJpYyBzdHJ1Y3R1cmUgdG8gaG9sZCBhbGwga2V5IHR5cGVzLiAga2V5IHR5cGUgKFdFUDQwLCBXRVAxMDQsIFRLSVAsIEFFUykKKyAqIGlzIGRldGVybWluZWQgZnJvbSB0aGUga2V5bGVuZ3RoIGZpZWxkLgorICovCitzdHJ1Y3QgV0xBTl84MDJfMTFfS0VZIHsKKwl1MzIgbGVuOworCXUzMiBmbGFnczsgIC8qIEtFWV9JTkZPXyogZnJvbSB3bGFuX2RlZnMuaCAqLworCXU4IGtleVtNUlZMX01BWF9LRVlfV1BBX0tFWV9MRU5HVEhdOworCXUxNiB0eXBlOyAvKiBLRVlfVFlQRV8qIGZyb20gd2xhbl9kZWZzLmggKi8KK307CisKK3N0cnVjdCBJRV9XUEEgeworCXU4IGVsZW1lbnRpZDsKKwl1OCBsZW47CisJdTggb3VpWzRdOworCXUxNiB2ZXJzaW9uOworfTsKKworc3RydWN0IFdMQU5fODAyXzExX1NTSUQgeworCS8qIFNTSUQgbGVuZ3RoICovCisJdTMyIHNzaWRsZW5ndGg7CisKKwkvKiBTU0lEIGluZm9ybWF0aW9uIGZpZWxkICovCisJdTggc3NpZFtJV19FU1NJRF9NQVhfU0laRV07Cit9OworCitzdHJ1Y3QgV1BBX1NVUFBMSUNBTlQgeworCXU4IHdwYV9pZVsyNTZdOworCXU4IHdwYV9pZV9sZW47Cit9OworCisvKiB3bGFuX29mZnNldF92YWx1ZSAqLworc3RydWN0IHdsYW5fb2Zmc2V0X3ZhbHVlIHsKKwl1MzIgb2Zmc2V0OworCXUzMiB2YWx1ZTsKK307CisKK3N0cnVjdCBXTEFOXzgwMl8xMV9GSVhFRF9JRXMgeworCXU4IHRpbWVzdGFtcFs4XTsKKwl1MTYgYmVhY29uaW50ZXJ2YWw7CisJdTE2IGNhcGFiaWxpdGllczsKK307CisKK3N0cnVjdCBXTEFOXzgwMl8xMV9WQVJJQUJMRV9JRXMgeworCXU4IGVsZW1lbnRpZDsKKwl1OCBsZW5ndGg7CisJdTggZGF0YVsxXTsKK307CisKKy8qIERlZmluZSBnZW5lcmFsIGRhdGEgc3RydWN0dXJlICovCisvKiBjbWRfRFNfR0VOICovCitzdHJ1Y3QgY21kX2RzX2dlbiB7CisJdTE2IGNvbW1hbmQ7CisJdTE2IHNpemU7CisJdTE2IHNlcW51bTsKKwl1MTYgcmVzdWx0OworfTsKKworI2RlZmluZSBTX0RTX0dFTiBzaXplb2Yoc3RydWN0IGNtZF9kc19nZW4pCisvKgorICogRGVmaW5lIGRhdGEgc3RydWN0dXJlIGZvciBjbWRfZ2V0X2h3X3NwZWMKKyAqIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIHJlc3BvbnNlIGZvciB0aGUgR0VUX0hXX1NQRUMgY29tbWFuZAorICovCitzdHJ1Y3QgY21kX2RzX2dldF9od19zcGVjIHsKKwkvKiBIVyBJbnRlcmZhY2UgdmVyc2lvbiBudW1iZXIgKi8KKwl1MTYgaHdpZnZlcnNpb247CisJLyogSFcgdmVyc2lvbiBudW1iZXIgKi8KKwl1MTYgdmVyc2lvbjsKKwkvKiBNYXggbnVtYmVyIG9mIFR4UEQgRlcgY2FuIGhhbmRsZSAqLworCXUxNiBucl90eHBkOworCS8qIE1heCBubyBvZiBNdWx0aWNhc3QgYWRkcmVzcyAqLworCXUxNiBucl9tY2FzdF9hZHI7CisJLyogTUFDIGFkZHJlc3MgKi8KKwl1OCBwZXJtYW5lbnRhZGRyWzZdOworCisJLyogcmVnaW9uIENvZGUgKi8KKwl1MTYgcmVnaW9uY29kZTsKKworCS8qIE51bWJlciBvZiBhbnRlbm5hIHVzZWQgKi8KKwl1MTYgbnJfYW50ZW5uYTsKKworCS8qIEZXIHJlbGVhc2UgbnVtYmVyLCBleGFtcGxlIDB4MTIzND0xLjIuMy40ICovCisJdTMyIGZ3cmVsZWFzZW51bWJlcjsKKworCS8qIEJhc2UgQWRkcmVzcyBvZiBUeFBEIHF1ZXVlICovCisJdTMyIHdjYl9iYXNlOworCS8qIFJlYWQgUG9pbnRlciBvZiBSeFBkIHF1ZXVlICovCisJdTMyIHJ4cGRfcmRwdHI7CisKKwkvKiBXcml0ZSBQb2ludGVyIG9mIFJ4UGQgcXVldWUgKi8KKwl1MzIgcnhwZF93cnB0cjsKKworCS8qRlcvSFcgY2FwYWJpbGl0eSAqLworCXUzMiBmd2NhcGluZm87Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGNtZF9kc184MDJfMTFfcmVzZXQgeworCXUxNiBhY3Rpb247Cit9OworCitzdHJ1Y3QgY21kX2RzXzgwMl8xMV9zdWJzY3JpYmVfZXZlbnQgeworCXUxNiBhY3Rpb247CisJdTE2IGV2ZW50czsKK307CisKKy8qCisgKiBUaGlzIHNjYW4gaGFuZGxlIENvdW50cnkgSW5mb3JtYXRpb24gSUUoODAyLjExZCBjb21wbGlhbnQpCisgKiBEZWZpbmUgZGF0YSBzdHJ1Y3R1cmUgZm9yIGNtZF84MDJfMTFfc2NhbgorICovCitzdHJ1Y3QgY21kX2RzXzgwMl8xMV9zY2FuIHsKKwl1OCBic3N0eXBlOworCXU4IEJTU0lEW0VUSF9BTEVOXTsKKwl1OCB0bHZidWZmZXJbMV07CisjaWYgMAorCW1ydmxpZXR5cGVzX3NzaWRwYXJhbXNldF90IHNzaWRQYXJhbVNldDsKKwltcnZsaWV0eXBlc19jaGFubGlzdHBhcmFtc2V0X3QgQ2hhbkxpc3RQYXJhbVNldDsKKwltcnZsaWV0eXBlc19yYXRlc3BhcmFtc2V0X3QgT3BSYXRlU2V0OworI2VuZGlmCit9OworCitzdHJ1Y3QgY21kX2RzXzgwMl8xMV9zY2FuX3JzcCB7CisJdTE2IGJzc2Rlc2NyaXB0c2l6ZTsKKwl1OCBucl9zZXRzOworCXU4IGJzc2Rlc2NfYW5kX3RsdmJ1ZmZlclsxXTsKK307CisKK3N0cnVjdCBjbWRfZHNfODAyXzExX2dldF9sb2cgeworCXUzMiBtY2FzdHR4ZnJhbWU7CisJdTMyIGZhaWxlZDsKKwl1MzIgcmV0cnk7CisJdTMyIG11bHRpcmV0cnk7CisJdTMyIGZyYW1lZHVwOworCXUzMiBydHNzdWNjZXNzOworCXUzMiBydHNmYWlsdXJlOworCXUzMiBhY2tmYWlsdXJlOworCXUzMiByeGZyYWc7CisJdTMyIG1jYXN0cnhmcmFtZTsKKwl1MzIgZmNzZXJyb3I7CisJdTMyIHR4ZnJhbWU7CisJdTMyIHdlcHVuZGVjcnlwdGFibGU7Cit9OworCitzdHJ1Y3QgY21kX2RzX21hY19jb250cm9sIHsKKwl1MTYgYWN0aW9uOworCXUxNiByZXNlcnZlZDsKK307CisKK3N0cnVjdCBjbWRfZHNfbWFjX211bHRpY2FzdF9hZHIgeworCXUxNiBhY3Rpb247CisJdTE2IG5yX29mX2FkcnM7CisJdTggbWFjbGlzdFtFVEhfQUxFTiAqIE1SVkRSVl9NQVhfTVVMVElDQVNUX0xJU1RfU0laRV07Cit9OworCitzdHJ1Y3QgY21kX2RzXzgwMl8xMV9hdXRoZW50aWNhdGUgeworCXU4IG1hY2FkZHJbRVRIX0FMRU5dOworCXU4IGF1dGh0eXBlOworCXU4IHJlc2VydmVkWzEwXTsKK307CisKK3N0cnVjdCBjbWRfZHNfODAyXzExX2RlYXV0aGVudGljYXRlIHsKKwl1OCBtYWNhZGRyWzZdOworCXUxNiByZWFzb25jb2RlOworfTsKKworc3RydWN0IGNtZF9kc184MDJfMTFfYXNzb2NpYXRlIHsKKwl1OCBwZWVyc3RhYWRkcls2XTsKKwlzdHJ1Y3QgaWVlZXR5cGVzX2NhcGluZm8gY2FwaW5mbzsKKwl1MTYgbGlzdGVuaW50ZXJ2YWw7CisJdTE2IGJjbnBlcmlvZDsKKwl1OCBkdGltcGVyaW9kOworCisjaWYgMAorCW1ydmxpZXR5cGVzX3NzaWRwYXJhbXNldF90IHNzaWRQYXJhbVNldDsKKwltcnZsaWV0eXBlc19waHlwYXJhbXNldF90IHBoeXBhcmFtc2V0OworCW1ydmxpZXR5cGVzX3NzcGFyYW1zZXRfdCBzc3BhcmFtc2V0OworCW1ydmxpZXR5cGVzX3JhdGVzcGFyYW1zZXRfdCByYXRlc1BhcmFtU2V0OworI2VuZGlmCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGNtZF9kc184MDJfMTFfZGlzYXNzb2NpYXRlIHsKKwl1OCBkZXN0bWFjYWRkcls2XTsKKwl1MTYgcmVhc29uY29kZTsKK307CisKK3N0cnVjdCBjbWRfZHNfODAyXzExX2Fzc29jaWF0ZV9yc3AgeworCXN0cnVjdCBpZWVldHlwZXNfYXNzb2Nyc3AgYXNzb2NSc3A7Cit9OworCitzdHJ1Y3QgY21kX2RzXzgwMl8xMV9hZF9ob2NfcmVzdWx0IHsKKwl1OCBQQURbM107CisJdTggQlNTSURbRVRIX0FMRU5dOworfTsKKworc3RydWN0IGNtZF9kc184MDJfMTFfc2V0X3dlcCB7CisJLyogQUNUX0FERCwgQUNUX1JFTU9WRSBvciBBQ1RfRU5BQkxFICovCisJdTE2IGFjdGlvbjsKKworCS8qIGtleSBJbmRleCBzZWxlY3RlZCBmb3IgVHggKi8KKwl1MTYga2V5aW5kZXg7CisKKwkvKiA0MCwgMTI4Yml0IG9yIFRYV0VQICovCisJdTgga2V5dHlwZVs0XTsKKwl1OCBrZXltYXRlcmlhbFs0XVsxNl07Cit9OworCitzdHJ1Y3QgY21kX2RzXzgwMl8zX2dldF9zdGF0IHsKKwl1MzIgeG1pdG9rOworCXUzMiByY3ZvazsKKwl1MzIgeG1pdGVycm9yOworCXUzMiByY3ZlcnJvcjsKKwl1MzIgcmN2bm9idWZmZXI7CisJdTMyIHJjdmNyY2Vycm9yOworfTsKKworc3RydWN0IGNtZF9kc184MDJfMTFfZ2V0X3N0YXQgeworCXUzMiB0eGZyYWdtZW50Y250OworCXUzMiBtY2FzdHR4ZnJhbWVjbnQ7CisJdTMyIGZhaWxlZGNudDsKKwl1MzIgcmV0cnljbnQ7CisJdTMyIE11bHRpcGxlcmV0cnljbnQ7CisJdTMyIHJ0c3N1Y2Nlc3NjbnQ7CisJdTMyIHJ0c2ZhaWx1cmVjbnQ7CisJdTMyIGFja2ZhaWx1cmVjbnQ7CisJdTMyIGZyYW1lZHVwbGljYXRlY250OworCXUzMiByeGZyYWdtZW50Y250OworCXUzMiBtY2FzdHJ4ZnJhbWVjbnQ7CisJdTMyIGZjc2Vycm9yY250OworCXUzMiBiY2FzdHR4ZnJhbWVjbnQ7CisJdTMyIGJjYXN0cnhmcmFtZWNudDsKKwl1MzIgdHhiZWFjb247CisJdTMyIHJ4YmVhY29uOworCXUzMiB3ZXB1bmRlY3J5cHRhYmxlOworfTsKKworc3RydWN0IGNtZF9kc184MDJfMTFfc25tcF9taWIgeworCXUxNiBxdWVyeXR5cGU7CisJdTE2IG9pZDsKKwl1MTYgYnVmc2l6ZTsKKwl1OCB2YWx1ZVsxMjhdOworfTsKKworc3RydWN0IGNtZF9kc19tYWNfcmVnX21hcCB7CisJdTE2IGJ1ZmZlcnNpemU7CisJdTggcmVnbWFwWzEyOF07CisJdTE2IHJlc2VydmVkOworfTsKKworc3RydWN0IGNtZF9kc19iYnBfcmVnX21hcCB7CisJdTE2IGJ1ZmZlcnNpemU7CisJdTggcmVnbWFwWzEyOF07CisJdTE2IHJlc2VydmVkOworfTsKKworc3RydWN0IGNtZF9kc19yZl9yZWdfbWFwIHsKKwl1MTYgYnVmZmVyc2l6ZTsKKwl1OCByZWdtYXBbNjRdOworCXUxNiByZXNlcnZlZDsKK307CisKK3N0cnVjdCBjbWRfZHNfbWFjX3JlZ19hY2Nlc3MgeworCXUxNiBhY3Rpb247CisJdTE2IG9mZnNldDsKKwl1MzIgdmFsdWU7Cit9OworCitzdHJ1Y3QgY21kX2RzX2JicF9yZWdfYWNjZXNzIHsKKwl1MTYgYWN0aW9uOworCXUxNiBvZmZzZXQ7CisJdTggdmFsdWU7CisJdTggcmVzZXJ2ZWRbM107Cit9OworCitzdHJ1Y3QgY21kX2RzX3JmX3JlZ19hY2Nlc3MgeworCXUxNiBhY3Rpb247CisJdTE2IG9mZnNldDsKKwl1OCB2YWx1ZTsKKwl1OCByZXNlcnZlZFszXTsKK307CisKK3N0cnVjdCBjbWRfZHNfODAyXzExX3JhZGlvX2NvbnRyb2wgeworCXUxNiBhY3Rpb247CisJdTE2IGNvbnRyb2w7Cit9OworCitzdHJ1Y3QgY21kX2RzXzgwMl8xMV9zbGVlcF9wYXJhbXMgeworCS8qIEFDVF9HRVQvQUNUX1NFVCAqLworCXUxNiBhY3Rpb247CisKKwkvKiBTbGVlcCBjbG9jayBlcnJvciBpbiBwcG0gKi8KKwl1MTYgZXJyb3I7CisKKwkvKiBXYWtldXAgb2Zmc2V0IGluIHVzZWMgKi8KKwl1MTYgb2Zmc2V0OworCisJLyogQ2xvY2sgc3RhYmlsaXphdGlvbiB0aW1lIGluIHVzZWMgKi8KKwl1MTYgc3RhYmxldGltZTsKKworCS8qIGNvbnRyb2wgcGVyaW9kaWMgY2FsaWJyYXRpb24gKi8KKwl1OCBjYWxjb250cm9sOworCisJLyogY29udHJvbCB0aGUgdXNlIG9mIGV4dGVybmFsIHNsZWVwIGNsb2NrICovCisJdTggZXh0ZXJuYWxzbGVlcGNsazsKKworCS8qIHJlc2VydmVkIGZpZWxkLCBzaG91bGQgYmUgc2V0IHRvIHplcm8gKi8KKwl1MTYgcmVzZXJ2ZWQ7Cit9OworCitzdHJ1Y3QgY21kX2RzXzgwMl8xMV9pbmFjdGl2aXR5X3RpbWVvdXQgeworCS8qIEFDVF9HRVQvQUNUX1NFVCAqLworCXUxNiBhY3Rpb247CisKKwkvKiBJbmFjdGl2aXR5IHRpbWVvdXQgaW4gbXNlYyAqLworCXUxNiB0aW1lb3V0OworfTsKKworc3RydWN0IGNtZF9kc184MDJfMTFfcmZfY2hhbm5lbCB7CisJdTE2IGFjdGlvbjsKKwl1MTYgY3VycmVudGNoYW5uZWw7CisJdTE2IHJmdHlwZTsKKwl1MTYgcmVzZXJ2ZWQ7CisJdTggY2hhbm5lbGxpc3RbMzJdOworfTsKKworc3RydWN0IGNtZF9kc184MDJfMTFfcnNzaSB7CisJLyogd2VpZ2h0aW5nIGZhY3RvciAqLworCXUxNiBOOworCisJdTE2IHJlc2VydmVkXzA7CisJdTE2IHJlc2VydmVkXzE7CisJdTE2IHJlc2VydmVkXzI7Cit9OworCitzdHJ1Y3QgY21kX2RzXzgwMl8xMV9yc3NpX3JzcCB7CisJdTE2IFNOUjsKKwl1MTYgbm9pc2VmbG9vcjsKKwl1MTYgYXZnU05SOworCXUxNiBhdmdub2lzZWZsb29yOworfTsKKworc3RydWN0IGNtZF9kc184MDJfMTFfbWFjX2FkZHJlc3MgeworCXUxNiBhY3Rpb247CisJdTggbWFjYWRkW0VUSF9BTEVOXTsKK307CisKK3N0cnVjdCBjbWRfZHNfODAyXzExX3JmX3R4X3Bvd2VyIHsKKwl1MTYgYWN0aW9uOworCXUxNiBjdXJyZW50bGV2ZWw7Cit9OworCitzdHJ1Y3QgY21kX2RzXzgwMl8xMV9yZl9hbnRlbm5hIHsKKwl1MTYgYWN0aW9uOworCisJLyogTnVtYmVyIG9mIGFudGVubmFzIG9yIDB4ZmZmZihkaXZlcnNpdHkpICovCisJdTE2IGFudGVubmFtb2RlOworCit9OworCitzdHJ1Y3QgY21kX2RzXzgwMl8xMV9wc19tb2RlIHsKKwl1MTYgYWN0aW9uOworCXUxNiBudWxscGt0aW50ZXJ2YWw7CisJdTE2IG11bHRpcGxlZHRpbTsKKwl1MTYgcmVzZXJ2ZWQ7CisJdTE2IGxvY2FsbGlzdGVuaW50ZXJ2YWw7Cit9OworCitzdHJ1Y3QgUFNfQ01EX0NvbmZpcm1TbGVlcCB7CisJdTE2IGNvbW1hbmQ7CisJdTE2IHNpemU7CisJdTE2IHNlcW51bTsKKwl1MTYgcmVzdWx0OworCisJdTE2IGFjdGlvbjsKKwl1MTYgcmVzZXJ2ZWQxOworCXUxNiBtdWx0aXBsZWR0aW07CisJdTE2IHJlc2VydmVkOworCXUxNiBsb2NhbGxpc3RlbmludGVydmFsOworfTsKKworc3RydWN0IGNtZF9kc184MDJfMTFfZGF0YV9yYXRlIHsKKwl1MTYgYWN0aW9uOworCXUxNiByZXNlcnZlcmQ7CisJdTggZGF0YXJhdGVbR19TVVBQT1JURURfUkFURVNdOworfTsKKworc3RydWN0IGNtZF9kc184MDJfMTFfcmF0ZV9hZGFwdF9yYXRlc2V0IHsKKwl1MTYgYWN0aW9uOworCXUxNiBlbmFibGVod2F1dG87CisJdTE2IGJpdG1hcDsKK307CisKK3N0cnVjdCBjbWRfZHNfODAyXzExX2FkX2hvY19zdGFydCB7CisJdTggU1NJRFtJV19FU1NJRF9NQVhfU0laRV07CisJdTggYnNzdHlwZTsKKwl1MTYgYmVhY29ucGVyaW9kOworCXU4IGR0aW1wZXJpb2Q7CisJdW5pb24gSUVFRXR5cGVzX3NzcGFyYW1zZXQgc3NwYXJhbXNldDsKKwl1bmlvbiBpZWVldHlwZXNfcGh5cGFyYW1zZXQgcGh5cGFyYW1zZXQ7CisJdTE2IHByb2JlZGVsYXk7CisJc3RydWN0IGllZWV0eXBlc19jYXBpbmZvIGNhcDsKKwl1OCBkYXRhcmF0ZVtHX1NVUFBPUlRFRF9SQVRFU107CisJdTggdGx2X21lbW9yeV9zaXplX3BhZFsxMDBdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBhZGhvY19ic3NkZXNjIHsKKwl1OCBCU1NJRFs2XTsKKwl1OCBTU0lEWzMyXTsKKwl1OCBic3N0eXBlOworCXUxNiBiZWFjb25wZXJpb2Q7CisJdTggZHRpbXBlcmlvZDsKKwl1OCB0aW1lc3RhbXBbOF07CisJdTggbG9jYWx0aW1lWzhdOworCXVuaW9uIGllZWV0eXBlc19waHlwYXJhbXNldCBwaHlwYXJhbXNldDsKKwl1bmlvbiBJRUVFdHlwZXNfc3NwYXJhbXNldCBzc3BhcmFtc2V0OworCXN0cnVjdCBpZWVldHlwZXNfY2FwaW5mbyBjYXA7CisJdTggZGF0YXJhdGVzW0dfU1VQUE9SVEVEX1JBVEVTXTsKKworCS8qIERPIE5PVCBBREQgQU5ZIEZJRUxEUyBUTyBUSElTIFNUUlVDVFVSRS4gSXQgaXMgdXNlZCBiZWxvdyBpbiB0aGUKKwkgKiBBZGhvYyBqb2luIGNvbW1hbmQgYW5kIHdpbGwgY2F1c2UgYSBiaW5hcnkgbGF5b3V0IG1pc21hdGNoIHdpdGgKKwkgKiB0aGUgZmlybXdhcmUKKwkgKi8KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgY21kX2RzXzgwMl8xMV9hZF9ob2Nfam9pbiB7CisJc3RydWN0IGFkaG9jX2Jzc2Rlc2MgYnNzZGVzY3JpcHRvcjsKKwl1MTYgZmFpbHRpbWVvdXQ7CisJdTE2IHByb2JlZGVsYXk7CisKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgY21kX2RzXzgwMl8xMV9lbmFibGVfcnNuIHsKKwl1MTYgYWN0aW9uOworCXUxNiBlbmFibGU7Cit9OworCitzdHJ1Y3QgTXJ2bElFdHlwZV9rZXlQYXJhbVNldCB7CisJLyogdHlwZSBJRCAqLworCXUxNiB0eXBlOworCisJLyogbGVuZ3RoIG9mIFBheWxvYWQgKi8KKwl1MTYgbGVuZ3RoOworCisJLyogdHlwZSBvZiBrZXk6IFdFUD0wLCBUS0lQPTEsIEFFUz0yICovCisJdTE2IGtleXR5cGVpZDsKKworCS8qIGtleSBjb250cm9sIEluZm8gc3BlY2lmaWMgdG8gYSBrZXl0eXBlaWQgKi8KKwl1MTYga2V5aW5mbzsKKworCS8qIGxlbmd0aCBvZiBrZXkgKi8KKwl1MTYga2V5bGVuOworCisJLyoga2V5IG1hdGVyaWFsIG9mIHNpemUga2V5bGVuICovCisJdTgga2V5WzMyXTsKK307CisKK3N0cnVjdCBjbWRfZHNfODAyXzExX2tleV9tYXRlcmlhbCB7CisJdTE2IGFjdGlvbjsKKwlzdHJ1Y3QgTXJ2bElFdHlwZV9rZXlQYXJhbVNldCBrZXlQYXJhbVNldFsyXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgY21kX2RzXzgwMl8xMV9lZXByb21fYWNjZXNzIHsKKwl1MTYgYWN0aW9uOworCisJLyogbXVsdGlwbGUgNCAqLworCXUxNiBvZmZzZXQ7CisJdTE2IGJ5dGVjb3VudDsKKwl1OCB2YWx1ZTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgY21kX2RzXzgwMl8xMV90cGNfY2ZnIHsKKwl1MTYgYWN0aW9uOworCXU4IGVuYWJsZTsKKwlzOCBQMDsKKwlzOCBQMTsKKwlzOCBQMjsKKwl1OCB1c2VzbnI7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGNtZF9kc184MDJfMTFfbGVkX2N0cmwgeworCXUxNiBhY3Rpb247CisJdTE2IG51bWxlZDsKKwl1OCBkYXRhWzI1Nl07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGNtZF9kc184MDJfMTFfcHdyX2NmZyB7CisJdTE2IGFjdGlvbjsKKwl1OCBlbmFibGU7CisJczggUEFfUDA7CisJczggUEFfUDE7CisJczggUEFfUDI7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGNtZF9kc184MDJfMTFfYWZjIHsKKwl1MTYgYWZjX2F1dG87CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJdTE2IHRocmVzaG9sZDsKKwkJCXUxNiBwZXJpb2Q7CisJCX07CisJCXN0cnVjdCB7CisJCQlzMTYgdGltaW5nX29mZnNldDsKKwkJCXMxNiBjYXJyaWVyX29mZnNldDsKKwkJfTsKKwl9OworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBjbWRfdHhfcmF0ZV9xdWVyeSB7CisJdTE2IHR4cmF0ZTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgY21kX2RzX2dldF90c2YgeworCV9fbGU2NCB0c2Z2YWx1ZTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgY21kX2RzX2J0X2FjY2VzcyB7CisJdTE2IGFjdGlvbjsKKwl1MzIgaWQ7CisJdTggYWRkcjFbRVRIX0FMRU5dOworCXU4IGFkZHIyW0VUSF9BTEVOXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgY21kX2RzX2Z3dF9hY2Nlc3MgeworCXUxNiBhY3Rpb247CisJdTMyIGlkOworCXU4IGRhW0VUSF9BTEVOXTsKKwl1OCBkaXI7CisJdTggcmFbRVRIX0FMRU5dOworCXUzMiBzc247CisJdTMyIGRzbjsKKwl1MzIgbWV0cmljOworCXU4IGhvcGNvdW50OworCXU4IHR0bDsKKwl1MzIgZXhwaXJhdGlvbjsKKwl1OCBzbGVlcG1vZGU7CisJdTMyIHNucjsKKwl1MzIgcmVmZXJlbmNlczsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisjZGVmaW5lIE1FU0hfU1RBVFNfTlVNIDcKK3N0cnVjdCBjbWRfZHNfbWVzaF9hY2Nlc3MgeworCXUxNiBhY3Rpb247CisJdTMyIGRhdGFbTUVTSF9TVEFUU19OVU0gKyAxXTsJLyogbGFzdCBwb3NpdGlvbiByZXNlcnZlZCAqLworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBjbWRfZHNfY29tbWFuZCB7CisJLyogY29tbWFuZCBoZWFkZXIgKi8KKwl1MTYgY29tbWFuZDsKKwl1MTYgc2l6ZTsKKwl1MTYgc2VxbnVtOworCXUxNiByZXN1bHQ7CisKKwkvKiBjb21tYW5kIEJvZHkgKi8KKwl1bmlvbiB7CisJCXN0cnVjdCBjbWRfZHNfZ2V0X2h3X3NwZWMgaHdzcGVjOworCQlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9wc19tb2RlIHBzbW9kZTsKKwkJc3RydWN0IGNtZF9kc184MDJfMTFfc2NhbiBzY2FuOworCQlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9zY2FuX3JzcCBzY2FucmVzcDsKKwkJc3RydWN0IGNtZF9kc19tYWNfY29udHJvbCBtYWNjdHJsOworCQlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9hc3NvY2lhdGUgYXNzb2NpYXRlOworCQlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9kZWF1dGhlbnRpY2F0ZSBkZWF1dGg7CisJCXN0cnVjdCBjbWRfZHNfODAyXzExX3NldF93ZXAgd2VwOworCQlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9hZF9ob2Nfc3RhcnQgYWRzOworCQlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9yZXNldCByZXNldDsKKwkJc3RydWN0IGNtZF9kc184MDJfMTFfYWRfaG9jX3Jlc3VsdCByZXN1bHQ7CisJCXN0cnVjdCBjbWRfZHNfODAyXzExX2dldF9sb2cgZ2xvZzsKKwkJc3RydWN0IGNtZF9kc184MDJfMTFfYXV0aGVudGljYXRlIGF1dGg7CisJCXN0cnVjdCBjbWRfZHNfODAyXzExX2dldF9zdGF0IGdzdGF0OworCQlzdHJ1Y3QgY21kX2RzXzgwMl8zX2dldF9zdGF0IGdzdGF0XzgwMjM7CisJCXN0cnVjdCBjbWRfZHNfODAyXzExX3NubXBfbWliIHNtaWI7CisJCXN0cnVjdCBjbWRfZHNfODAyXzExX3JmX3R4X3Bvd2VyIHR4cDsKKwkJc3RydWN0IGNtZF9kc184MDJfMTFfcmZfYW50ZW5uYSByYW50OworCQlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9kYXRhX3JhdGUgZHJhdGU7CisJCXN0cnVjdCBjbWRfZHNfODAyXzExX3JhdGVfYWRhcHRfcmF0ZXNldCByYXRlc2V0OworCQlzdHJ1Y3QgY21kX2RzX21hY19tdWx0aWNhc3RfYWRyIG1hZHI7CisJCXN0cnVjdCBjbWRfZHNfODAyXzExX2FkX2hvY19qb2luIGFkajsKKwkJc3RydWN0IGNtZF9kc184MDJfMTFfcmFkaW9fY29udHJvbCByYWRpbzsKKwkJc3RydWN0IGNtZF9kc184MDJfMTFfcmZfY2hhbm5lbCByZmNoYW5uZWw7CisJCXN0cnVjdCBjbWRfZHNfODAyXzExX3Jzc2kgcnNzaTsKKwkJc3RydWN0IGNtZF9kc184MDJfMTFfcnNzaV9yc3AgcnNzaXJzcDsKKwkJc3RydWN0IGNtZF9kc184MDJfMTFfZGlzYXNzb2NpYXRlIGRhc3NvY2lhdGU7CisJCXN0cnVjdCBjbWRfZHNfODAyXzExX21hY19hZGRyZXNzIG1hY2FkZDsKKwkJc3RydWN0IGNtZF9kc184MDJfMTFfZW5hYmxlX3JzbiBlbmJyc247CisJCXN0cnVjdCBjbWRfZHNfODAyXzExX2tleV9tYXRlcmlhbCBrZXltYXRlcmlhbDsKKwkJc3RydWN0IGNtZF9kc19tYWNfcmVnX2FjY2VzcyBtYWNyZWc7CisJCXN0cnVjdCBjbWRfZHNfYmJwX3JlZ19hY2Nlc3MgYmJwcmVnOworCQlzdHJ1Y3QgY21kX2RzX3JmX3JlZ19hY2Nlc3MgcmZyZWc7CisJCXN0cnVjdCBjbWRfZHNfODAyXzExX2VlcHJvbV9hY2Nlc3MgcmRlZXByb207CisKKwkJc3RydWN0IGNtZF9kc184MDJfMTFkX2RvbWFpbl9pbmZvIGRvbWFpbmluZm87CisJCXN0cnVjdCBjbWRfZHNfODAyXzExZF9kb21haW5faW5mbyBkb21haW5pbmZvcmVzcDsKKworCQlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9zbGVlcF9wYXJhbXMgc2xlZXBfcGFyYW1zOworCQlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9pbmFjdGl2aXR5X3RpbWVvdXQgaW5hY3Rpdml0eV90aW1lb3V0OworCQlzdHJ1Y3QgY21kX2RzXzgwMl8xMV90cGNfY2ZnIHRwY2NmZzsKKwkJc3RydWN0IGNtZF9kc184MDJfMTFfcHdyX2NmZyBwd3JjZmc7CisJCXN0cnVjdCBjbWRfZHNfODAyXzExX2FmYyBhZmM7CisJCXN0cnVjdCBjbWRfZHNfODAyXzExX2xlZF9jdHJsIGxlZGdwaW87CisKKwkJc3RydWN0IGNtZF90eF9yYXRlX3F1ZXJ5IHR4cmF0ZTsKKwkJc3RydWN0IGNtZF9kc19idF9hY2Nlc3MgYnQ7CisJCXN0cnVjdCBjbWRfZHNfZnd0X2FjY2VzcyBmd3Q7CisJCXN0cnVjdCBjbWRfZHNfbWVzaF9hY2Nlc3MgbWVzaDsKKwkJc3RydWN0IGNtZF9kc19nZXRfdHNmIGdldHRzZjsKKwkJc3RydWN0IGNtZF9kc184MDJfMTFfc3Vic2NyaWJlX2V2ZW50IHN1YnNjcmliZV9ldmVudDsKKwl9IHBhcmFtczsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2lmX2Jvb3RjbWQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2lmX2Jvb3RjbWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjcwMDBjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvaWZfYm9vdGNtZC5jCkBAIC0wLDAgKzEsMzggQEAKKy8qKgorICAqIFRoaXMgZmlsZSBjb250YWlucyBmdW5jdGlvbnMgdXNlZCBpbiBVU0IgQm9vdCBjb21tYW5kCisgICogYW5kIEJvb3QyL0ZXIHVwZGF0ZQorICAqLworCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgImRldi5oIgorI2luY2x1ZGUgImlmX3VzYi5oIgorCisvKioKKyAqICBAYnJpZWYgVGhpcyBmdW5jdGlvbiBpc3N1ZXMgQm9vdCBjb21tYW5kIHRvIHRoZSBCb290MiBjb2RlCisgKiAgQHBhcmFtIGl2YWx1ZSAgIDE6Qm9vdCBmcm9tIEZXIGJ5IFVTQi1Eb3dubG9hZAorICogICAgICAgICAgICAgICAgICAyOkJvb3QgZnJvbSBGVyBpbiBFRVBST00KKyAqICBAcmV0dXJuIAkgICAJMAorICovCitpbnQgaWZfdXNiX2lzc3VlX2Jvb3RfY29tbWFuZCh3bGFuX3ByaXZhdGUgKnByaXYsIGludCBpdmFsdWUpCit7CisJc3RydWN0IHVzYl9jYXJkX3JlYwkqY2FyZHAgPSBwcml2LT53bGFuX2Rldi5jYXJkOworCXN0cnVjdCBib290Y21kc3RyCXNib290Y21kOworCWludCBpOworCisJLyogUHJlcGFyZSBjb21tYW5kICovCisJc2Jvb3RjbWQudTMybWFnaWNudW1iZXIgPSBCT09UX0NNRF9NQUdJQ19OVU1CRVI7CisJc2Jvb3RjbWQudThjbWRfdGFnID0gaXZhbHVlOworCWZvciAoaT0wOyBpPDExOyBpKyspCisJCXNib290Y21kLmF1OGR1bXlbaV09MHgwMDsKKwltZW1jcHkoY2FyZHAtPmJ1bGtfb3V0X2J1ZmZlciwgJnNib290Y21kLCBzaXplb2Yoc3RydWN0IGJvb3RjbWRzdHIpKTsKKworCS8qIElzc3VlIGNvbW1hbmQgKi8KKwl1c2JfdHhfYmxvY2socHJpdiwgY2FyZHAtPmJ1bGtfb3V0X2J1ZmZlciwgc2l6ZW9mKHN0cnVjdCBib290Y21kc3RyKSk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2lmX3VzYi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvaWZfdXNiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk1ZmI2YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2lmX3VzYi5jCkBAIC0wLDAgKzEsOTUyIEBACisvKioKKyAgKiBUaGlzIGZpbGUgY29udGFpbnMgZnVuY3Rpb25zIHVzZWQgaW4gVVNCIGludGVyZmFjZSBtb2R1bGUuCisgICovCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorCisjaW5jbHVkZSAiaG9zdC5oIgorI2luY2x1ZGUgInNiaS5oIgorI2luY2x1ZGUgImRlY2wuaCIKKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAiZGV2LmgiCisjaW5jbHVkZSAiaWZfdXNiLmgiCisKKyNkZWZpbmUgTUVTU0FHRV9IRUFERVJfTEVOCTQKKworc3RhdGljIGNvbnN0IGNoYXIgdXNiZHJpdmVyX25hbWVbXSA9ICJ1c2I4eHh4IjsKKworc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIGlmX3VzYl90YWJsZVtdID0geworCS8qIEVudGVyIHRoZSBkZXZpY2Ugc2lnbmF0dXJlIGluc2lkZSAqLworCXsKKwkJVVNCX0RFVklDRShVU0I4Mzg4X1ZJRF8xLCBVU0I4Mzg4X1BJRF8xKSwKKwl9LAorCXsKKwkJVVNCX0RFVklDRShVU0I4Mzg4X1ZJRF8yLCBVU0I4Mzg4X1BJRF8yKSwKKwl9LAorCXt9CS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgaWZfdXNiX3RhYmxlKTsKKworc3RhdGljIHZvaWQgaWZfdXNiX3JlY2VpdmUoc3RydWN0IHVyYiAqdXJiKTsKK3N0YXRpYyB2b2lkIGlmX3VzYl9yZWNlaXZlX2Z3bG9hZChzdHJ1Y3QgdXJiICp1cmIpOworCisvKioKKyAqICBAYnJpZWYgIGNhbGwgYmFjayBmdW5jdGlvbiB0byBoYW5kbGUgdGhlIHN0YXR1cyBvZiB0aGUgVVJCCisgKiAgQHBhcmFtIHVyYiAJCXBvaW50ZXIgdG8gdXJiIHN0cnVjdHVyZQorICogIEByZXR1cm4gCSAgIAlOL0EKKyAqLworc3RhdGljIHZvaWQgaWZfdXNiX3dyaXRlX2J1bGtfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKQoreworCXdsYW5fcHJpdmF0ZSAqcHJpdiA9ICh3bGFuX3ByaXZhdGUgKikgKHVyYi0+Y29udGV4dCk7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcHJpdi0+d2xhbl9kZXYubmV0ZGV2OworCisJLyogaGFuZGxlIHRoZSB0cmFuc21pc3Npb24gY29tcGxldGUgdmFsaWRhdGlvbnMgKi8KKworCWlmICh1cmItPnN0YXR1cyAhPSAwKSB7CisJCS8qIHByaW50IHRoZSBmYWlsdXJlIHN0YXR1cyBudW1iZXIgZm9yIGRlYnVnICovCisJCWxic19wcl9pbmZvKCJVUkIgaW4gZmFpbHVyZSBzdGF0dXNcbiIpOworCX0gZWxzZSB7CisJCWxic19kZXZfZGJnKDIsICZ1cmItPmRldi0+ZGV2LCAiVVJCIHN0YXR1cyBpcyBzdWNjZXNzZnVsbFxuIik7CisJCWxic19kZXZfZGJnKDIsICZ1cmItPmRldi0+ZGV2LCAiQWN0dWFsIGxlbmd0aCB0cmFuc21pdHRlZCAlZFxuIiwKKwkJICAgICAgIHVyYi0+YWN0dWFsX2xlbmd0aCk7CisJCXByaXYtPndsYW5fZGV2LmRubGRfc2VudCA9IEROTERfUkVTX1JFQ0VJVkVEOworCQkvKiBXYWtlIG1haW4gdGhyZWFkIGlmIGNvbW1hbmRzIGFyZSBwZW5kaW5nICovCisJCWlmICghYWRhcHRlci0+Y3VyX2NtZCkKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcHJpdi0+bWFpbnRocmVhZC53YWl0cSk7CisJCWlmICgoYWRhcHRlci0+Y29ubmVjdF9zdGF0dXMgPT0gbGliZXJ0YXNfY29ubmVjdGVkKSkKKwkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwl9CisKKwlyZXR1cm47Cit9CisKKy8qKgorICogIEBicmllZiAgZnJlZSB0eC9yeCB1cmIsIHNrYiBhbmQgcnggYnVmZmVyCisgKiAgQHBhcmFtIGNhcmRwCXBvaW50ZXIgdXNiX2NhcmRfcmVjCisgKiAgQHJldHVybiAJICAgCU4vQQorICovCit2b2lkIGlmX3VzYl9mcmVlKHN0cnVjdCB1c2JfY2FyZF9yZWMgKmNhcmRwKQoreworCUVOVEVSKCk7CisKKwkvKiBVbmxpbmsgdHggJiByeCB1cmIgKi8KKwl1c2Jfa2lsbF91cmIoY2FyZHAtPnR4X3VyYik7CisJdXNiX2tpbGxfdXJiKGNhcmRwLT5yeF91cmIpOworCisJdXNiX2ZyZWVfdXJiKGNhcmRwLT50eF91cmIpOworCWNhcmRwLT50eF91cmIgPSBOVUxMOworCisJdXNiX2ZyZWVfdXJiKGNhcmRwLT5yeF91cmIpOworCWNhcmRwLT5yeF91cmIgPSBOVUxMOworCisJa2ZyZWUoY2FyZHAtPmJ1bGtfb3V0X2J1ZmZlcik7CisJY2FyZHAtPmJ1bGtfb3V0X2J1ZmZlciA9IE5VTEw7CisKKwlMRUFWRSgpOworCXJldHVybjsKK30KKworLyoqCisgKiAgQGJyaWVmIHNldHMgdGhlIGNvbmZpZ3VyYXRpb24gdmFsdWVzCisgKiAgQHBhcmFtIGlmbnVtCWludGVyZmFjZSBudW1iZXIKKyAqICBAcGFyYW0gaWQJCXBvaW50ZXIgdG8gdXNiX2RldmljZV9pZAorICogIEByZXR1cm4gCSAgIAkwIG9uIHN1Y2Nlc3MsIGVycm9yIGNvZGUgb24gZmFpbHVyZQorICovCitzdGF0aWMgaW50IGlmX3VzYl9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKKwkJCWNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldjsKKwlzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICppZmFjZV9kZXNjOworCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZW5kcG9pbnQ7CisJd2xhbl9wcml2YXRlICpwd2xhbnByaXY7CisJc3RydWN0IHVzYl9jYXJkX3JlYyAqdXNiX2NhcmRwOworCWludCBpOworCisJdWRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CisKKwl1c2JfY2FyZHAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdXNiX2NhcmRfcmVjKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF1c2JfY2FyZHApIHsKKwkJbGJzX3ByX2VycigiT3V0IG9mIG1lbW9yeSBhbGxvY2F0aW5nIHByaXZhdGUgZGF0YS5cbiIpOworCQlnb3RvIGVycm9yOworCX0KKworCXVzYl9jYXJkcC0+dWRldiA9IHVkZXY7CisJaWZhY2VfZGVzYyA9IGludGYtPmN1cl9hbHRzZXR0aW5nOworCisJbGJzX2Rldl9kYmcoMSwgJnVkZXYtPmRldiwgImJjZFVTQiA9IDB4JVggYkRldmljZUNsYXNzID0gMHglWCIKKwkgICAgICAgIiBiRGV2aWNlU3ViQ2xhc3MgPSAweCVYLCBiRGV2aWNlUHJvdG9jb2wgPSAweCVYXG4iLAorCSAgICAgICB1ZGV2LT5kZXNjcmlwdG9yLmJjZFVTQiwKKwkgICAgICAgdWRldi0+ZGVzY3JpcHRvci5iRGV2aWNlQ2xhc3MsCisJICAgICAgIHVkZXYtPmRlc2NyaXB0b3IuYkRldmljZVN1YkNsYXNzLAorCSAgICAgICB1ZGV2LT5kZXNjcmlwdG9yLmJEZXZpY2VQcm90b2NvbCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgaWZhY2VfZGVzYy0+ZGVzYy5iTnVtRW5kcG9pbnRzOyArK2kpIHsKKwkJZW5kcG9pbnQgPSAmaWZhY2VfZGVzYy0+ZW5kcG9pbnRbaV0uZGVzYzsKKwkJaWYgKChlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyAmIFVTQl9FTkRQT0lOVF9ESVJfTUFTSykKKwkJICAgICYmICgoZW5kcG9pbnQtPmJtQXR0cmlidXRlcyAmIFVTQl9FTkRQT0lOVF9YRkVSVFlQRV9NQVNLKSA9PQorCQkJVVNCX0VORFBPSU5UX1hGRVJfQlVMSykpIHsKKwkJCS8qIHdlIGZvdW5kIGEgYnVsayBpbiBlbmRwb2ludCAqLworCQkJbGJzX2Rldl9kYmcoMSwgJnVkZXYtPmRldiwgIkJ1bGsgaW4gc2l6ZSBpcyAlZFxuIiwKKwkJCSAgICAgICBlbmRwb2ludC0+d01heFBhY2tldFNpemUpOworCQkJaWYgKCEKKwkJCSAgICAodXNiX2NhcmRwLT5yeF91cmIgPQorCQkJICAgICB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpKSkgeworCQkJCWxic19kZXZfZGJnKDEsICZ1ZGV2LT5kZXYsCisJCQkJICAgICAgICJSeCBVUkIgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQkJCWdvdG8gZGVhbGxvYzsKKwkJCX0KKwkJCXVzYl9jYXJkcC0+cnhfdXJiX3JlY2FsbCA9IDA7CisKKwkJCXVzYl9jYXJkcC0+YnVsa19pbl9zaXplID0KKwkJCSAgICBlbmRwb2ludC0+d01heFBhY2tldFNpemU7CisJCQl1c2JfY2FyZHAtPmJ1bGtfaW5fZW5kcG9pbnRBZGRyID0KKwkJCSAgICAoZW5kcG9pbnQtPgorCQkJICAgICBiRW5kcG9pbnRBZGRyZXNzICYgVVNCX0VORFBPSU5UX05VTUJFUl9NQVNLKTsKKwkJCWxic19kZXZfZGJnKDEsICZ1ZGV2LT5kZXYsICJpbl9lbmRwb2ludCA9ICVkXG4iLAorCQkJICAgICAgIGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzKTsKKwkJfQorCisJCWlmICgoKGVuZHBvaW50LT4KKwkJICAgICAgYkVuZHBvaW50QWRkcmVzcyAmIFVTQl9FTkRQT0lOVF9ESVJfTUFTSykgPT0KKwkJICAgICBVU0JfRElSX09VVCkKKwkJICAgICYmICgoZW5kcG9pbnQtPmJtQXR0cmlidXRlcyAmIFVTQl9FTkRQT0lOVF9YRkVSVFlQRV9NQVNLKSA9PQorCQkJVVNCX0VORFBPSU5UX1hGRVJfQlVMSykpIHsKKwkJCS8qIFdlIGZvdW5kIGJ1bGsgb3V0IGVuZHBvaW50ICovCisJCQlpZiAoIQorCQkJICAgICh1c2JfY2FyZHAtPnR4X3VyYiA9CisJCQkgICAgIHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCkpKSB7CisJCQkJbGJzX2Rldl9kYmcoMSwmdWRldi0+ZGV2LAorCQkJCSAgICAgICAiVHggVVJCIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJCQlnb3RvIGRlYWxsb2M7CisJCQl9CisKKwkJCXVzYl9jYXJkcC0+YnVsa19vdXRfc2l6ZSA9CisJCQkgICAgZW5kcG9pbnQtPndNYXhQYWNrZXRTaXplOworCQkJbGJzX2Rldl9kYmcoMSwgJnVkZXYtPmRldiwKKwkJCQkgICAgIkJ1bGsgb3V0IHNpemUgaXMgJWRcbiIsCisJCQkJICAgIGVuZHBvaW50LT53TWF4UGFja2V0U2l6ZSk7CisJCQl1c2JfY2FyZHAtPmJ1bGtfb3V0X2VuZHBvaW50QWRkciA9CisJCQkgICAgZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3M7CisJCQlsYnNfZGV2X2RiZygxLCAmdWRldi0+ZGV2LCAib3V0X2VuZHBvaW50ID0gJWRcbiIsCisJCQkJICAgIGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzKTsKKwkJCXVzYl9jYXJkcC0+YnVsa19vdXRfYnVmZmVyID0KKwkJCSAgICBrbWFsbG9jKE1SVkRSVl9FVEhfVFhfUEFDS0VUX0JVRkZFUl9TSVpFLAorCQkJCSAgICBHRlBfS0VSTkVMKTsKKworCQkJaWYgKCF1c2JfY2FyZHAtPmJ1bGtfb3V0X2J1ZmZlcikgeworCQkJCWxic19kZXZfZGJnKDEsICZ1ZGV2LT5kZXYsCisJCQkJICAgICAgICJDb3VsZCBub3QgYWxsb2NhdGUgYnVmZmVyXG4iKTsKKwkJCQlnb3RvIGRlYWxsb2M7CisJCQl9CisJCX0KKwl9CisKKworCS8qIEF0IHRoaXMgcG9pbnQgd2xhbl9hZGRfY2FyZCgpIHdpbGwgYmUgY2FsbGVkLiAgRG9uJ3Qgd29ycnkKKwkgKiBhYm91dCBrZWVwaW5nIHB3bGFucHJpdiBhcm91bmQgc2luY2UgaXQgd2lsbCBiZSBzZXQgb24gb3VyCisJICogdXNiIGRldmljZSBkYXRhIGluIC0+IGFkZCgpIC0+IGxpYmVydGFzX3NiaV9yZWdpc3Rlcl9kZXYoKS4KKwkgKi8KKwlpZiAoIShwd2xhbnByaXYgPSB3bGFuX2FkZF9jYXJkKHVzYl9jYXJkcCkpKQorCQlnb3RvIGRlYWxsb2M7CisKKwl1c2JfZ2V0X2Rldih1ZGV2KTsKKwl1c2Jfc2V0X2ludGZkYXRhKGludGYsIHVzYl9jYXJkcCk7CisKKwkvKgorCSAqIHJldHVybiBjYXJkIHN0cnVjdHVyZSwgd2hpY2ggY2FuIGJlIGdvdCBiYWNrIGluIHRoZQorCSAqIGRpY29ubmVjdCBmdW5jdGlvbiBhcyB0aGUgcHRyCisJICogYXJndW1lbnQuCisJICovCisJcmV0dXJuIDA7CisKK2RlYWxsb2M6CisJaWZfdXNiX2ZyZWUodXNiX2NhcmRwKTsKKworZXJyb3I6CisJcmV0dXJuIC1FTk9NRU07Cit9CisKKy8qKgorICogIEBicmllZiBmcmVlIHJlc291cmNlIGFuZCBjbGVhbnVwCisgKiAgQHBhcmFtIHVkZXYJCXBvaW50ZXIgdG8gdXNiX2RldmljZQorICogIEBwYXJhbSBwdHIJCXBvaW50ZXIgdG8gdXNiX2NhcmRwCisgKiAgQHJldHVybiAJICAgCU4vQQorICovCitzdGF0aWMgdm9pZCBpZl91c2JfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlzdHJ1Y3QgdXNiX2NhcmRfcmVjICpjYXJkcCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CisJd2xhbl9wcml2YXRlICpwcml2ID0gKHdsYW5fcHJpdmF0ZSAqKSBjYXJkcC0+cHJpdjsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBOVUxMOworCisJYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisKKwkvKgorCSAqIFVwZGF0ZSBTdXJwcmlzZSByZW1vdmVkIHRvIFRSVUUKKwkgKi8KKwlhZGFwdGVyLT5zdXJwcmlzZXJlbW92ZWQgPSAxOworCisJLyogY2FyZCBpcyByZW1vdmVkIGFuZCB3ZSBjYW4gY2FsbCB3bGFuX3JlbW92ZV9jYXJkICovCisJbGJzX2Rldl9kYmcoMSwgJmNhcmRwLT51ZGV2LT5kZXYsICJjYWxsIHJlbW92ZSBjYXJkXG4iKTsKKwl3bGFuX3JlbW92ZV9jYXJkKGNhcmRwKTsKKworCS8qIFVubGluayBhbmQgZnJlZSB1cmIgKi8KKwlpZl91c2JfZnJlZShjYXJkcCk7CisKKwl1c2Jfc2V0X2ludGZkYXRhKGludGYsIE5VTEwpOworCXVzYl9wdXRfZGV2KGludGVyZmFjZV90b191c2JkZXYoaW50ZikpOworCisJcmV0dXJuOworfQorCisvKioKKyAqICBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gZG93bmxvYWQgRlcKKyAqICBAcGFyYW0gcHJpdgkJcG9pbnRlciB0byB3bGFuX3ByaXZhdGUKKyAqICBAcmV0dXJuIAkgICAJMAorICovCitzdGF0aWMgaW50IGlmX3Byb2dfZmlybXdhcmUod2xhbl9wcml2YXRlICogcHJpdikKK3sKKwlzdHJ1Y3QgdXNiX2NhcmRfcmVjICpjYXJkcCA9IHByaXYtPndsYW5fZGV2LmNhcmQ7CisJc3RydWN0IEZXRGF0YSAqZndkYXRhOworCXN0cnVjdCBmd2hlYWRlciAqZndoZWFkZXI7CisJdTggKmZpcm13YXJlID0gcHJpdi0+ZmlybXdhcmUtPmRhdGE7CisKKwlmd2RhdGEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgRldEYXRhKSwgR0ZQX0FUT01JQyk7CisKKwlpZiAoIWZ3ZGF0YSkKKwkJcmV0dXJuIC0xOworCisJZndoZWFkZXIgPSAmZndkYXRhLT5md2hlYWRlcjsKKworCWlmICghY2FyZHAtPkNSQ19PSykgeworCQljYXJkcC0+dG90YWxieXRlcyA9IGNhcmRwLT5md2xhc3RibGtzZW50OworCQljYXJkcC0+ZndzZXFudW0gPSBjYXJkcC0+bGFzdHNlcW51bSAtIDE7CisJfQorCisJbGJzX2Rldl9kYmcoMiwgJmNhcmRwLT51ZGV2LT5kZXYsICJ0b3RhbGJ5dGVzID0gJWRcbiIsCisJCSAgICBjYXJkcC0+dG90YWxieXRlcyk7CisKKwltZW1jcHkoZndoZWFkZXIsICZmaXJtd2FyZVtjYXJkcC0+dG90YWxieXRlc10sCisJICAgICAgIHNpemVvZihzdHJ1Y3QgZndoZWFkZXIpKTsKKworCWNhcmRwLT5md2xhc3RibGtzZW50ID0gY2FyZHAtPnRvdGFsYnl0ZXM7CisJY2FyZHAtPnRvdGFsYnl0ZXMgKz0gc2l6ZW9mKHN0cnVjdCBmd2hlYWRlcik7CisKKwlsYnNfZGV2X2RiZygyLCAmY2FyZHAtPnVkZXYtPmRldiwiQ29weSBEYXRhXG4iKTsKKwltZW1jcHkoZndkYXRhLT5kYXRhLCAmZmlybXdhcmVbY2FyZHAtPnRvdGFsYnl0ZXNdLAorCSAgICAgICBmd2RhdGEtPmZ3aGVhZGVyLmRhdGFsZW5ndGgpOworCisJbGJzX2Rldl9kYmcoMiwgJmNhcmRwLT51ZGV2LT5kZXYsCisJCSAgICAiRGF0YSBsZW5ndGggPSAlZFxuIiwgZndkYXRhLT5md2hlYWRlci5kYXRhbGVuZ3RoKTsKKworCWNhcmRwLT5md3NlcW51bSA9IGNhcmRwLT5md3NlcW51bSArIDE7CisKKwlmd2RhdGEtPnNlcW51bSA9IGNhcmRwLT5md3NlcW51bTsKKwljYXJkcC0+bGFzdHNlcW51bSA9IGZ3ZGF0YS0+c2VxbnVtOworCWNhcmRwLT50b3RhbGJ5dGVzICs9IGZ3ZGF0YS0+ZndoZWFkZXIuZGF0YWxlbmd0aDsKKworCWlmIChmd2hlYWRlci0+ZG5sZGNtZCA9PSBGV19IQVNfREFUQV9UT19SRUNWKSB7CisJCWxic19kZXZfZGJnKDIsICZjYXJkcC0+dWRldi0+ZGV2LCAiVGhlcmUgaXMgZGF0YSB0byBmb2xsb3dcbiIpOworCQlsYnNfZGV2X2RiZygyLCAmY2FyZHAtPnVkZXYtPmRldiwKKwkJCSAgICAic2VxbnVtID0gJWQgdG90YWxieXRlcyA9ICVkXG4iLCBjYXJkcC0+ZndzZXFudW0sCisJCQkgICAgY2FyZHAtPnRvdGFsYnl0ZXMpOworCQltZW1jcHkoY2FyZHAtPmJ1bGtfb3V0X2J1ZmZlciwgZndoZWFkZXIsIEZXX0RBVEFfWE1JVF9TSVpFKTsKKwkJdXNiX3R4X2Jsb2NrKHByaXYsIGNhcmRwLT5idWxrX291dF9idWZmZXIsIEZXX0RBVEFfWE1JVF9TSVpFKTsKKworCX0gZWxzZSBpZiAoZndkYXRhLT5md2hlYWRlci5kbmxkY21kID09IEZXX0hBU19MQVNUX0JMT0NLKSB7CisJCWxic19kZXZfZGJnKDIsICZjYXJkcC0+dWRldi0+ZGV2LAorCQkJICAgICJIb3N0IGhhcyBmaW5pc2hlZCBGVyBkb3dubG9hZGluZ1xuIik7CisJCWxic19kZXZfZGJnKDIsICZjYXJkcC0+dWRldi0+ZGV2LAorCQkJICAgICJEb253bG9hZGluZyBGVyBKVU1QIEJMT0NLXG4iKTsKKwkJbWVtY3B5KGNhcmRwLT5idWxrX291dF9idWZmZXIsIGZ3aGVhZGVyLCBGV19EQVRBX1hNSVRfU0laRSk7CisJCXVzYl90eF9ibG9jayhwcml2LCBjYXJkcC0+YnVsa19vdXRfYnVmZmVyLCBGV19EQVRBX1hNSVRfU0laRSk7CisJCWNhcmRwLT5md2ZpbmFsYmxrID0gMTsKKwl9CisKKwlsYnNfZGV2X2RiZygyLCAmY2FyZHAtPnVkZXYtPmRldiwKKwkJICAgICJUaGUgZmlybXdhcmUgZG93bmxvYWQgaXMgZG9uZSBzaXplIGlzICVkXG4iLAorCQkgICAgY2FyZHAtPnRvdGFsYnl0ZXMpOworCisJa2ZyZWUoZndkYXRhKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxpYmVydGFzX2RvX3Jlc2V0KHdsYW5fcHJpdmF0ZSAqcHJpdikKK3sKKwlpbnQgcmV0OworCXN0cnVjdCB1c2JfY2FyZF9yZWMgKmNhcmRwID0gcHJpdi0+d2xhbl9kZXYuY2FyZDsKKworCXJldCA9IHVzYl9yZXNldF9kZXZpY2UoY2FyZHAtPnVkZXYpOworCWlmICghcmV0KSB7CisJCW1zbGVlcCgxMCk7CisJCXJlc2V0X2RldmljZShwcml2KTsKKwkJbXNsZWVwKDEwKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiAgQGJyaWVmIFRoaXMgZnVuY3Rpb24gdHJhbnNmZXIgdGhlIGRhdGEgdG8gdGhlIGRldmljZS4KKyAqICBAcGFyYW0gcHJpdiAJcG9pbnRlciB0byB3bGFuX3ByaXZhdGUKKyAqICBAcGFyYW0gcGF5bG9hZAlwb2ludGVyIHRvIHBheWxvYWQgZGF0YQorICogIEBwYXJhbSBuYgkJZGF0YSBsZW5ndGgKKyAqICBAcmV0dXJuIAkgICAJMCBvciAtMQorICovCitpbnQgdXNiX3R4X2Jsb2NrKHdsYW5fcHJpdmF0ZSAqIHByaXYsIHU4ICogcGF5bG9hZCwgdTE2IG5iKQoreworCS8qIHBvaW50ZXIgdG8gY2FyZCBzdHJ1Y3R1cmUgKi8KKwlzdHJ1Y3QgdXNiX2NhcmRfcmVjICpjYXJkcCA9IHByaXYtPndsYW5fZGV2LmNhcmQ7CisJaW50IHJldCA9IC0xOworCisJLyogY2hlY2sgaWYgZGV2aWNlIGlzIHJlbW92ZWQgKi8KKwlpZiAocHJpdi0+YWRhcHRlci0+c3VycHJpc2VyZW1vdmVkKSB7CisJCWxic19kZXZfZGJnKDEsICZjYXJkcC0+dWRldi0+ZGV2LCAiRGV2aWNlIHJlbW92ZWRcbiIpOworCQlnb3RvIHR4X3JldDsKKwl9CisKKwl1c2JfZmlsbF9idWxrX3VyYihjYXJkcC0+dHhfdXJiLCBjYXJkcC0+dWRldiwKKwkJCSAgdXNiX3NuZGJ1bGtwaXBlKGNhcmRwLT51ZGV2LAorCQkJCQkgIGNhcmRwLT5idWxrX291dF9lbmRwb2ludEFkZHIpLAorCQkJICBwYXlsb2FkLCBuYiwgaWZfdXNiX3dyaXRlX2J1bGtfY2FsbGJhY2ssIHByaXYpOworCisJY2FyZHAtPnR4X3VyYi0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX1pFUk9fUEFDS0VUOworCisJaWYgKChyZXQgPSB1c2Jfc3VibWl0X3VyYihjYXJkcC0+dHhfdXJiLCBHRlBfQVRPTUlDKSkpIHsKKwkJLyogIHRyYW5zZmVyIGZhaWxlZCAqLworCQlsYnNfZGV2X2RiZygxLCAmY2FyZHAtPnVkZXYtPmRldiwgInVzYl9zdWJtaXRfdXJiIGZhaWxlZFxuIik7CisJCXJldCA9IC0xOworCX0gZWxzZSB7CisJCWxic19kZXZfZGJnKDIsICZjYXJkcC0+dWRldi0+ZGV2LCAidXNiX3N1Ym1pdF91cmIgc3VjY2Vzc1xuIik7CisJCXJldCA9IDA7CisJfQorCit0eF9yZXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2lmX3VzYl9zdWJtaXRfcnhfdXJiKHdsYW5fcHJpdmF0ZSAqIHByaXYsCisJCQkJICB2b2lkICgqY2FsbGJhY2tmbikKKwkJCQkgIChzdHJ1Y3QgdXJiICp1cmIpKQoreworCXN0cnVjdCB1c2JfY2FyZF9yZWMgKmNhcmRwID0gcHJpdi0+d2xhbl9kZXYuY2FyZDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCByZWFkX2NiX2luZm8gKnJpbmZvID0gJmNhcmRwLT5yaW5mbzsKKwlpbnQgcmV0ID0gLTE7CisKKwlpZiAoIShza2IgPSBkZXZfYWxsb2Nfc2tiKE1SVkRSVl9FVEhfUlhfUEFDS0VUX0JVRkZFUl9TSVpFKSkpIHsKKwkJbGJzX3ByX2VycigiTm8gZnJlZSBza2JcbiIpOworCQlnb3RvIHJ4X3JldDsKKwl9CisKKwlyaW5mby0+c2tiID0gc2tiOworCisJLyogRmlsbCB0aGUgcmVjZWl2ZSBjb25maWd1cmF0aW9uIFVSQiBhbmQgaW5pdGlhbGlzZSB0aGUgUnggY2FsbCBiYWNrICovCisJdXNiX2ZpbGxfYnVsa191cmIoY2FyZHAtPnJ4X3VyYiwgY2FyZHAtPnVkZXYsCisJCQkgIHVzYl9yY3ZidWxrcGlwZShjYXJkcC0+dWRldiwKKwkJCQkJICBjYXJkcC0+YnVsa19pbl9lbmRwb2ludEFkZHIpLAorCQkJICBza2ItPnRhaWwgKyBJUEZJRUxEX0FMSUdOX09GRlNFVCwKKwkJCSAgTVJWRFJWX0VUSF9SWF9QQUNLRVRfQlVGRkVSX1NJWkUsIGNhbGxiYWNrZm4sCisJCQkgIHJpbmZvKTsKKworCWNhcmRwLT5yeF91cmItPnRyYW5zZmVyX2ZsYWdzIHw9IFVSQl9aRVJPX1BBQ0tFVDsKKworCWxic19kZXZfZGJnKDIsICZjYXJkcC0+dWRldi0+ZGV2LCAiUG9pbnRlciBmb3IgcnhfdXJiICVwXG4iLCBjYXJkcC0+cnhfdXJiKTsKKwlpZiAoKHJldCA9IHVzYl9zdWJtaXRfdXJiKGNhcmRwLT5yeF91cmIsIEdGUF9BVE9NSUMpKSkgeworCQkvKiBoYW5kbGUgZmFpbHVyZSBjb25kaXRpb25zICovCisJCWxic19kZXZfZGJnKDEsICZjYXJkcC0+dWRldi0+ZGV2LCAiU3VibWl0IFJ4IFVSQiBmYWlsZWRcbiIpOworCQlyZXQgPSAtMTsKKwl9IGVsc2UgeworCQlsYnNfZGV2X2RiZygyLCAmY2FyZHAtPnVkZXYtPmRldiwgIlN1Ym1pdCBSeCBVUkIgc3VjY2Vzc1xuIik7CisJCXJldCA9IDA7CisJfQorCityeF9yZXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBpbnQgaWZfdXNiX3N1Ym1pdF9yeF91cmJfZndsb2FkKHdsYW5fcHJpdmF0ZSAqIHByaXYpCit7CisJcmV0dXJuIF9faWZfdXNiX3N1Ym1pdF9yeF91cmIocHJpdiwgJmlmX3VzYl9yZWNlaXZlX2Z3bG9hZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlmX3VzYl9zdWJtaXRfcnhfdXJiKHdsYW5fcHJpdmF0ZSAqIHByaXYpCit7CisJcmV0dXJuIF9faWZfdXNiX3N1Ym1pdF9yeF91cmIocHJpdiwgJmlmX3VzYl9yZWNlaXZlKTsKK30KKworc3RhdGljIHZvaWQgaWZfdXNiX3JlY2VpdmVfZndsb2FkKHN0cnVjdCB1cmIgKnVyYikKK3sKKwlzdHJ1Y3QgcmVhZF9jYl9pbmZvICpyaW5mbyA9IChzdHJ1Y3QgcmVhZF9jYl9pbmZvICopdXJiLT5jb250ZXh0OworCXdsYW5fcHJpdmF0ZSAqcHJpdiA9IHJpbmZvLT5wcml2OworCXN0cnVjdCBza19idWZmICpza2IgPSByaW5mby0+c2tiOworCXN0cnVjdCB1c2JfY2FyZF9yZWMgKmNhcmRwID0gKHN0cnVjdCB1c2JfY2FyZF9yZWMgKilwcml2LT53bGFuX2Rldi5jYXJkOworCXN0cnVjdCBmd3N5bmNoZWFkZXIgKnN5bmNmd2hlYWRlcjsKKwlzdHJ1Y3QgYm9vdGNtZHJlc3BTdHIgYm9vdGNtZHJlc3A7CisKKwlpZiAodXJiLT5zdGF0dXMpIHsKKwkJbGJzX2Rldl9kYmcoMSwgJmNhcmRwLT51ZGV2LT5kZXYsCisJCQkgICAgIlVSQiBzdGF0dXMgaXMgZmFpbGVkIGR1cmluZyBmdyBsb2FkXG4iKTsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoY2FyZHAtPmJvb3RjbWRyZXNwID09IDApIHsKKwkJbWVtY3B5ICgmYm9vdGNtZHJlc3AsIHNrYi0+ZGF0YSArIElQRklFTERfQUxJR05fT0ZGU0VULAorCQkJc2l6ZW9mKGJvb3RjbWRyZXNwKSk7CisJCWlmIChjYXJkcC0+dWRldi0+ZGVzY3JpcHRvci5iY2REZXZpY2UgPCAweDMxMDYpIHsKKwkJCWtmcmVlX3NrYihza2IpOworCQkJaWZfdXNiX3N1Ym1pdF9yeF91cmJfZndsb2FkKHByaXYpOworCQkJY2FyZHAtPmJvb3RjbWRyZXNwID0gMTsKKwkJCWxic19kZXZfZGJnKDEsICZjYXJkcC0+dWRldi0+ZGV2LAorCQkJCSAgICAiUmVjZWl2ZWQgdmFsaWQgYm9vdCBjb21tYW5kIHJlc3BvbnNlXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAoYm9vdGNtZHJlc3AudTMybWFnaWNudW1iZXIgIT0gQk9PVF9DTURfTUFHSUNfTlVNQkVSKSB7CisJCQlsYnNfcHJfaW5mbygKKwkJCQkiYm9vdCBjbWQgcmVzcG9uc2Ugd3JvbmcgbWFnaWMgbnVtYmVyICgweCV4KVxuIiwKKwkJCQlib290Y21kcmVzcC51MzJtYWdpY251bWJlcik7CisJCX0gZWxzZSBpZiAoYm9vdGNtZHJlc3AudThjbWRfdGFnICE9IEJPT1RfQ01EX0ZXX0JZX1VTQikgeworCQkJbGJzX3ByX2luZm8oCisJCQkJImJvb3QgY21kIHJlc3BvbnNlIGNtZF90YWcgZXJyb3IgKCVkKVxuIiwKKwkJCQlib290Y21kcmVzcC51OGNtZF90YWcpOworCQl9IGVsc2UgaWYgKGJvb3RjbWRyZXNwLnU4cmVzdWx0ICE9IEJPT1RfQ01EX1JFU1BfT0spIHsKKwkJCWxic19wcl9pbmZvKAorCQkJCSJib290IGNtZCByZXNwb25zZSByZXN1bHQgZXJyb3IgKCVkKVxuIiwKKwkJCQlib290Y21kcmVzcC51OHJlc3VsdCk7CisJCX0gZWxzZSB7CisJCQljYXJkcC0+Ym9vdGNtZHJlc3AgPSAxOworCQkJbGJzX2Rldl9kYmcoMSwgJmNhcmRwLT51ZGV2LT5kZXYsCisJCQkJICAgICJSZWNlaXZlZCB2YWxpZCBib290IGNvbW1hbmQgcmVzcG9uc2VcbiIpOworCQl9CisJCWtmcmVlX3NrYihza2IpOworCQlpZl91c2Jfc3VibWl0X3J4X3VyYl9md2xvYWQocHJpdik7CisJCXJldHVybjsKKwl9CisKKwlzeW5jZndoZWFkZXIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZndzeW5jaGVhZGVyKSwgR0ZQX0FUT01JQyk7CisJaWYgKCFzeW5jZndoZWFkZXIpIHsKKwkJbGJzX2Rldl9kYmcoMSwgJmNhcmRwLT51ZGV2LT5kZXYsICJGYWlsdXJlIHRvIGFsbG9jYXRlIHN5bmNmd2hlYWRlclxuIik7CisJCWtmcmVlX3NrYihza2IpOworCQlyZXR1cm47CisJfQorCisJbWVtY3B5KHN5bmNmd2hlYWRlciwgc2tiLT5kYXRhICsgSVBGSUVMRF9BTElHTl9PRkZTRVQsCisJCQlzaXplb2Yoc3RydWN0IGZ3c3luY2hlYWRlcikpOworCisJaWYgKCFzeW5jZndoZWFkZXItPmNtZCkgeworCQlsYnNfZGV2X2RiZygyLCAmY2FyZHAtPnVkZXYtPmRldiwKKwkJCSAgICAiRlcgcmVjZWl2ZWQgQmxrIHdpdGggY29ycmVjdCBDUkNcbiIpOworCQlsYnNfZGV2X2RiZygyLCAmY2FyZHAtPnVkZXYtPmRldiwKKwkJCSAgICAiRlcgcmVjZWl2ZWQgQmxrIHNlcW51bSA9ICVkXG4iLAorCQkgICAgICAgc3luY2Z3aGVhZGVyLT5zZXFudW0pOworCQljYXJkcC0+Q1JDX09LID0gMTsKKwl9IGVsc2UgeworCQlsYnNfZGV2X2RiZygxLCAmY2FyZHAtPnVkZXYtPmRldiwKKwkJCSAgICAiRlcgcmVjZWl2ZWQgQmxrIHdpdGggQ1JDIGVycm9yXG4iKTsKKwkJY2FyZHAtPkNSQ19PSyA9IDA7CisJfQorCisJa2ZyZWVfc2tiKHNrYik7CisKKwlpZiAoY2FyZHAtPmZ3ZmluYWxibGspIHsKKwkJY2FyZHAtPmZ3ZG5sZG92ZXIgPSAxOworCQlnb3RvIGV4aXQ7CisJfQorCisJaWZfcHJvZ19maXJtd2FyZShwcml2KTsKKworCWlmX3VzYl9zdWJtaXRfcnhfdXJiX2Z3bG9hZChwcml2KTsKK2V4aXQ6CisJa2ZyZWUoc3luY2Z3aGVhZGVyKTsKKworCXJldHVybjsKKworfQorCisjZGVmaW5lIE1SVkRSVl9NSU5fUEtUX0xFTgkzMAorCitzdGF0aWMgaW5saW5lIHZvaWQgcHJvY2Vzc19jbWR0eXBlZGF0YShpbnQgcmVjdmxlbmd0aCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgICAgICAgc3RydWN0IHVzYl9jYXJkX3JlYyAqY2FyZHAsCisJCQkJICAgICAgIHdsYW5fcHJpdmF0ZSAqcHJpdikKK3sKKwlpZiAocmVjdmxlbmd0aCA+IE1SVkRSVl9FVEhfUlhfUEFDS0VUX0JVRkZFUl9TSVpFICsKKwkgICAgTUVTU0FHRV9IRUFERVJfTEVOIHx8IHJlY3ZsZW5ndGggPCBNUlZEUlZfTUlOX1BLVF9MRU4pIHsKKwkJbGJzX2Rldl9kYmcoMSwgJmNhcmRwLT51ZGV2LT5kZXYsCisJCQkgICAgIlBhY2tldCBsZW5ndGggaXMgSW52YWxpZFxuIik7CisJCWtmcmVlX3NrYihza2IpOworCQlyZXR1cm47CisJfQorCisJc2tiX3Jlc2VydmUoc2tiLCBJUEZJRUxEX0FMSUdOX09GRlNFVCk7CisJc2tiX3B1dChza2IsIHJlY3ZsZW5ndGgpOworCXNrYl9wdWxsKHNrYiwgTUVTU0FHRV9IRUFERVJfTEVOKTsKKwlsaWJlcnRhc19wcm9jZXNzX3J4ZWRfcGFja2V0KHByaXYsIHNrYik7CisJcHJpdi0+d2xhbl9kZXYudXBsZF9sZW4gPSAocmVjdmxlbmd0aCAtIE1FU1NBR0VfSEVBREVSX0xFTik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwcm9jZXNzX2NtZHJlcXVlc3QoaW50IHJlY3ZsZW5ndGgsIHU4ICpyZWN2YnVmZiwKKwkJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSAgICAgIHN0cnVjdCB1c2JfY2FyZF9yZWMgKmNhcmRwLAorCQkJCSAgICAgIHdsYW5fcHJpdmF0ZSAqcHJpdikKK3sKKwl1OCAqY21kYnVmOworCWlmIChyZWN2bGVuZ3RoID4gTVJWRFJWX1NJWkVfT0ZfQ01EX0JVRkZFUikgeworCQlsYnNfZGV2X2RiZygxLCAmY2FyZHAtPnVkZXYtPmRldiwKKwkJCSAgICAiVGhlIHJlY2VpdmUgYnVmZmVyIGlzIHRvbyBsYXJnZVxuIik7CisJCWtmcmVlX3NrYihza2IpOworCQlyZXR1cm47CisJfQorCisJaWYgKCFpbl9pbnRlcnJ1cHQoKSkKKwkJQlVHKCk7CisKKwlzcGluX2xvY2soJnByaXYtPmFkYXB0ZXItPmRyaXZlcl9sb2NrKTsKKwkvKiB0YWtlIGNhcmUgb2YgY3VyX2NtZCA9IE5VTEwgY2FzZSBieSByZWFkaW5nIHRoZQorCSAqIGRhdGEgdG8gY2xlYXIgdGhlIGludGVycnVwdCAqLworCWlmICghcHJpdi0+YWRhcHRlci0+Y3VyX2NtZCkgeworCQljbWRidWYgPSBwcml2LT53bGFuX2Rldi51cGxkX2J1ZjsKKwkJcHJpdi0+YWRhcHRlci0+aGlzcmVnY3B5ICY9IH5oaXNfY21kdXBsZHJkeTsKKwl9IGVsc2UKKwkJY21kYnVmID0gcHJpdi0+YWRhcHRlci0+Y3VyX2NtZC0+YnVmdmlydHVhbGFkZHI7CisKKwljYXJkcC0+dXNiX2ludF9jYXVzZSB8PSBoaXNfY21kdXBsZHJkeTsKKwlwcml2LT53bGFuX2Rldi51cGxkX2xlbiA9IChyZWN2bGVuZ3RoIC0gTUVTU0FHRV9IRUFERVJfTEVOKTsKKwltZW1jcHkoY21kYnVmLCByZWN2YnVmZiArIE1FU1NBR0VfSEVBREVSX0xFTiwKKwkgICAgICAgcHJpdi0+d2xhbl9kZXYudXBsZF9sZW4pOworCisJa2ZyZWVfc2tiKHNrYik7CisJbGliZXJ0YXNfaW50ZXJydXB0KHByaXYtPndsYW5fZGV2Lm5ldGRldik7CisJc3Bpbl91bmxvY2soJnByaXYtPmFkYXB0ZXItPmRyaXZlcl9sb2NrKTsKKworCWxic19kZXZfZGJnKDEsICZjYXJkcC0+dWRldi0+ZGV2LAorCQkgICAgIldha2UgdXAgbWFpbiB0aHJlYWQgdG8gaGFuZGxlIGNtZCByZXNwb25zZVxuIik7CisKKwlyZXR1cm47Cit9CisKKy8qKgorICogIEBicmllZiBUaGlzIGZ1bmN0aW9uIHJlYWRzIG9mIHRoZSBwYWNrZXQgaW50byB0aGUgdXBsb2FkIGJ1ZmYsCisgKiAgd2FrZSB1cCB0aGUgbWFpbiB0aHJlYWQgYW5kIGluaXRpYWxpc2UgdGhlIFJ4IGNhbGxhY2suCisgKgorICogIEBwYXJhbSB1cmIJCXBvaW50ZXIgdG8gc3RydWN0IHVyYgorICogIEByZXR1cm4gCSAgIAlOL0EKKyAqLworc3RhdGljIHZvaWQgaWZfdXNiX3JlY2VpdmUoc3RydWN0IHVyYiAqdXJiKQoreworCXN0cnVjdCByZWFkX2NiX2luZm8gKnJpbmZvID0gKHN0cnVjdCByZWFkX2NiX2luZm8gKil1cmItPmNvbnRleHQ7CisJd2xhbl9wcml2YXRlICpwcml2ID0gcmluZm8tPnByaXY7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHJpbmZvLT5za2I7CisJc3RydWN0IHVzYl9jYXJkX3JlYyAqY2FyZHAgPSAoc3RydWN0IHVzYl9jYXJkX3JlYyAqKXByaXYtPndsYW5fZGV2LmNhcmQ7CisKKwlpbnQgcmVjdmxlbmd0aCA9IHVyYi0+YWN0dWFsX2xlbmd0aDsKKwl1OCAqcmVjdmJ1ZmYgPSBOVUxMOworCXUzMiByZWN2dHlwZTsKKworCUVOVEVSKCk7CisKKwlpZiAocmVjdmxlbmd0aCkgeworCQlpZiAodXJiLT5zdGF0dXMpIHsKKwkJCWxic19kZXZfZGJnKDEsICZjYXJkcC0+dWRldi0+ZGV2LAorCQkJCSAgICAiVVJCIHN0YXR1cyBpcyBmYWlsZWRcbiIpOworCQkJa2ZyZWVfc2tiKHNrYik7CisJCQlnb3RvIHNldHVwX2Zvcl9uZXh0OworCQl9CisKKwkJcmVjdmJ1ZmYgPSBza2ItPmRhdGEgKyBJUEZJRUxEX0FMSUdOX09GRlNFVDsKKwkJbWVtY3B5KCZyZWN2dHlwZSwgcmVjdmJ1ZmYsIHNpemVvZih1MzIpKTsKKwkJbGJzX2Rldl9kYmcoMSwgJmNhcmRwLT51ZGV2LT5kZXYsCisJCQkgICAgIlJlY3YgbGVuZ3RoID0gMHgleFxuIiwgcmVjdmxlbmd0aCk7CisJCWxic19kZXZfZGJnKDEsICZjYXJkcC0+dWRldi0+ZGV2LAorCQkJICAgICJSZWNlaXZlIHR5cGUgPSAweCVYXG4iLCByZWN2dHlwZSk7CisJCXJlY3Z0eXBlID0gbGUzMl90b19jcHUocmVjdnR5cGUpOworCQlsYnNfZGV2X2RiZygxLCAmY2FyZHAtPnVkZXYtPmRldiwKKwkJCSAgICAiUmVjZWl2ZSB0eXBlIGFmdGVyID0gMHglWFxuIiwgcmVjdnR5cGUpOworCX0gZWxzZSBpZiAodXJiLT5zdGF0dXMpCisJCWdvdG8gcnhfZXhpdDsKKworCisJc3dpdGNoIChyZWN2dHlwZSkgeworCWNhc2UgQ01EX1RZUEVfREFUQToKKwkJcHJvY2Vzc19jbWR0eXBlZGF0YShyZWN2bGVuZ3RoLCBza2IsIGNhcmRwLCBwcml2KTsKKwkJYnJlYWs7CisKKwljYXNlIENNRF9UWVBFX1JFUVVFU1Q6CisJCXByb2Nlc3NfY21kcmVxdWVzdChyZWN2bGVuZ3RoLCByZWN2YnVmZiwgc2tiLCBjYXJkcCwgcHJpdik7CisJCWJyZWFrOworCisJY2FzZSBDTURfVFlQRV9JTkRJQ0FUSU9OOgorCQkvKiBFdmVudCBjYXVzZSBoYW5kbGluZyAqLworCQlzcGluX2xvY2soJnByaXYtPmFkYXB0ZXItPmRyaXZlcl9sb2NrKTsKKwkJY2FyZHAtPnVzYl9ldmVudF9jYXVzZSA9ICoodTMyICopIChyZWN2YnVmZiArIE1FU1NBR0VfSEVBREVSX0xFTik7CisJCWxic19kZXZfZGJnKDEsICZjYXJkcC0+dWRldi0+ZGV2LCIqKkVWRU5UKiogMHglWFxuIiwKKwkJCSAgICBjYXJkcC0+dXNiX2V2ZW50X2NhdXNlKTsKKwkJaWYgKGNhcmRwLT51c2JfZXZlbnRfY2F1c2UgJiAweGZmZmYwMDAwKSB7CisJCQlsaWJlcnRhc19zZW5kX3R4X2ZlZWRiYWNrKHByaXYpOworCQkJYnJlYWs7CisJCX0KKwkJY2FyZHAtPnVzYl9ldmVudF9jYXVzZSA9IGxlMzJfdG9fY3B1KGNhcmRwLT51c2JfZXZlbnRfY2F1c2UpIDw8IDM7CisJCWNhcmRwLT51c2JfaW50X2NhdXNlIHw9IGhpc19jYXJkZXZlbnQ7CisJCWtmcmVlX3NrYihza2IpOworCQlsaWJlcnRhc19pbnRlcnJ1cHQocHJpdi0+d2xhbl9kZXYubmV0ZGV2KTsKKwkJc3Bpbl91bmxvY2soJnByaXYtPmFkYXB0ZXItPmRyaXZlcl9sb2NrKTsKKwkJZ290byByeF9leGl0OworCWRlZmF1bHQ6CisJCWtmcmVlX3NrYihza2IpOworCQlicmVhazsKKwl9CisKK3NldHVwX2Zvcl9uZXh0OgorCWlmX3VzYl9zdWJtaXRfcnhfdXJiKHByaXYpOworcnhfZXhpdDoKKwlMRUFWRSgpOworCXJldHVybjsKK30KKworLyoqCisgKiAgQGJyaWVmIFRoaXMgZnVuY3Rpb24gZG93bmxvYWRzIGRhdGEgdG8gRlcKKyAqICBAcGFyYW0gcHJpdgkJcG9pbnRlciB0byB3bGFuX3ByaXZhdGUgc3RydWN0dXJlCisgKiAgQHBhcmFtIHR5cGUJCXR5cGUgb2YgZGF0YQorICogIEBwYXJhbSBidWYJCXBvaW50ZXIgdG8gZGF0YSBidWZmZXIKKyAqICBAcGFyYW0gbGVuCQludW1iZXIgb2YgYnl0ZXMKKyAqICBAcmV0dXJuIAkgICAJMCBvciAtMQorICovCitpbnQgbGliZXJ0YXNfc2JpX2hvc3RfdG9fY2FyZCh3bGFuX3ByaXZhdGUgKiBwcml2LCB1OCB0eXBlLCB1OCAqIHBheWxvYWQsIHUxNiBuYikKK3sKKwlpbnQgcmV0ID0gLTE7CisJdTMyIHRtcDsKKwlzdHJ1Y3QgdXNiX2NhcmRfcmVjICpjYXJkcCA9IChzdHJ1Y3QgdXNiX2NhcmRfcmVjICopcHJpdi0+d2xhbl9kZXYuY2FyZDsKKworCWxic19kZXZfZGJnKDEsICZjYXJkcC0+dWRldi0+ZGV2LCIqKiogdHlwZSA9ICV1XG4iLCB0eXBlKTsKKwlsYnNfZGV2X2RiZygxLCAmY2FyZHAtPnVkZXYtPmRldiwic2l6ZSBhZnRlciA9ICVkXG4iLCBuYik7CisKKwlpZiAodHlwZSA9PSBNVk1TX0NNRCkgeworCQl0bXAgPSBjcHVfdG9fbGUzMihDTURfVFlQRV9SRVFVRVNUKTsKKwkJcHJpdi0+d2xhbl9kZXYuZG5sZF9zZW50ID0gRE5MRF9DTURfU0VOVDsKKwkJbWVtY3B5KGNhcmRwLT5idWxrX291dF9idWZmZXIsICh1OCAqKSAmIHRtcCwKKwkJICAgICAgIE1FU1NBR0VfSEVBREVSX0xFTik7CisKKwl9IGVsc2UgeworCQl0bXAgPSBjcHVfdG9fbGUzMihDTURfVFlQRV9EQVRBKTsKKwkJcHJpdi0+d2xhbl9kZXYuZG5sZF9zZW50ID0gRE5MRF9EQVRBX1NFTlQ7CisJCW1lbWNweShjYXJkcC0+YnVsa19vdXRfYnVmZmVyLCAodTggKikgJiB0bXAsCisJCSAgICAgICBNRVNTQUdFX0hFQURFUl9MRU4pOworCX0KKworCW1lbWNweSgoY2FyZHAtPmJ1bGtfb3V0X2J1ZmZlciArIE1FU1NBR0VfSEVBREVSX0xFTiksIHBheWxvYWQsIG5iKTsKKworCXJldCA9CisJICAgIHVzYl90eF9ibG9jayhwcml2LCBjYXJkcC0+YnVsa19vdXRfYnVmZmVyLCBuYiArIE1FU1NBR0VfSEVBREVSX0xFTik7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBjYWxsZWQgd2l0aCBhZGFwdGVyLT5kcml2ZXJfbG9jayBoZWxkICovCitpbnQgbGliZXJ0YXNfc2JpX2dldF9pbnRfc3RhdHVzKHdsYW5fcHJpdmF0ZSAqIHByaXYsIHU4ICogaXJlZykKK3sKKwlzdHJ1Y3QgdXNiX2NhcmRfcmVjICpjYXJkcCA9IHByaXYtPndsYW5fZGV2LmNhcmQ7CisKKwkqaXJlZyA9IGNhcmRwLT51c2JfaW50X2NhdXNlOworCWNhcmRwLT51c2JfaW50X2NhdXNlID0gMDsKKworCWxic19kZXZfZGJnKDEsICZjYXJkcC0+dWRldi0+ZGV2LCJJbnQgY2F1c2UgaXMgMHglWFxuIiwgKmlyZWcpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBsaWJlcnRhc19zYmlfcmVhZF9ldmVudF9jYXVzZSh3bGFuX3ByaXZhdGUgKiBwcml2KQoreworCXN0cnVjdCB1c2JfY2FyZF9yZWMgKmNhcmRwID0gcHJpdi0+d2xhbl9kZXYuY2FyZDsKKwlwcml2LT5hZGFwdGVyLT5ldmVudGNhdXNlID0gY2FyZHAtPnVzYl9ldmVudF9jYXVzZTsKKwkvKiBSZS1zdWJtaXQgcnggdXJiIGhlcmUgdG8gYXZvaWQgZXZlbnQgbG9zdCBpc3N1ZSAqLworCWlmX3VzYl9zdWJtaXRfcnhfdXJiKHByaXYpOworCXJldHVybiAwOworfQorCitpbnQgcmVzZXRfZGV2aWNlKHdsYW5fcHJpdmF0ZSAqcHJpdikKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsIGNtZF84MDJfMTFfcmVzZXQsCisJCQkJICAgIGNtZF9hY3RfaGFsdCwgMCwgMCwgTlVMTCk7CisJbXNsZWVwX2ludGVycnVwdGlibGUoMTApOworCisJcmV0dXJuIHJldDsKK30KKworaW50IGxpYmVydGFzX3NiaV91bnJlZ2lzdGVyX2Rldih3bGFuX3ByaXZhdGUgKiBwcml2KQoreworCWludCByZXQgPSAwOworCisJLyogTmVlZCB0byBzZW5kIGEgUmVzZXQgY29tbWFuZCB0byBkZXZpY2UgYmVmb3JlIFVTQiByZXNvdXJjZXMgZnJlZWQKKwkgKiBhbmQgd2xhbl9yZW1vdmVfY2FyZCgpIGNhbGxlZCwgdGhlbiBkZXZpY2UgY2FuIGhhbmRsZSBGVyBkb3dubG9hZAorCSAqIGFnYWluLgorCSAqLworCWlmIChwcml2KQorCQlyZXNldF9kZXZpY2UocHJpdik7CisKKwlyZXR1cm4gcmV0OworfQorCisKKy8qKgorICogIEBicmllZiAgVGhpcyBmdW5jdGlvbiByZWdpc3RlciB1c2IgZGV2aWNlIGFuZCBpbml0aWFsaXplIHBhcmFtZXRlcgorICogIEBwYXJhbQkJcHJpdiBwb2ludGVyIHRvIHdsYW5fcHJpdmF0ZQorICogIEByZXR1cm4JCTAgb3IgLTEKKyAqLworaW50IGxpYmVydGFzX3NiaV9yZWdpc3Rlcl9kZXYod2xhbl9wcml2YXRlICogcHJpdikKK3sKKworCXN0cnVjdCB1c2JfY2FyZF9yZWMgKmNhcmRwID0gKHN0cnVjdCB1c2JfY2FyZF9yZWMgKilwcml2LT53bGFuX2Rldi5jYXJkOworCUVOVEVSKCk7CisKKwljYXJkcC0+cHJpdiA9IHByaXY7CisJY2FyZHAtPmV0aF9kZXYgPSBwcml2LT53bGFuX2Rldi5uZXRkZXY7CisJcHJpdi0+aG90cGx1Z19kZXZpY2UgPSAmKGNhcmRwLT51ZGV2LT5kZXYpOworCisJU0VUX05FVERFVl9ERVYoY2FyZHAtPmV0aF9kZXYsICYoY2FyZHAtPnVkZXYtPmRldikpOworCisJbGJzX2Rldl9kYmcoMSwgJmNhcmRwLT51ZGV2LT5kZXYsICJ1ZGV2IHBvaW50ZXIgaXMgYXQgJXBcbiIsCisJCSAgICBjYXJkcC0+dWRldik7CisKKwlMRUFWRSgpOworCXJldHVybiAwOworfQorCisKKworaW50IGxpYmVydGFzX3NiaV9wcm9nX2Zpcm13YXJlKHdsYW5fcHJpdmF0ZSAqIHByaXYpCit7CisJc3RydWN0IHVzYl9jYXJkX3JlYyAqY2FyZHAgPSBwcml2LT53bGFuX2Rldi5jYXJkOworCWludCBpID0gMDsKKwlzdGF0aWMgaW50IHJlc2V0X2NvdW50ID0gMTA7CisKKwlFTlRFUigpOworCisJY2FyZHAtPnJpbmZvLnByaXYgPSBwcml2OworCityZXN0YXJ0OgorCWlmIChpZl91c2Jfc3VibWl0X3J4X3VyYl9md2xvYWQocHJpdikgPCAwKSB7CisJCWxic19kZXZfZGJnKDEsICZjYXJkcC0+dWRldi0+ZGV2LCAiVVJCIHN1Ym1pc3Npb24gaXMgZmFpbGVkXG4iKTsKKwkJTEVBVkUoKTsKKwkJcmV0dXJuIC0xOworCX0KKworI2lmZGVmIFNVUFBPUlRfQk9PVF9DT01NQU5ECisJY2FyZHAtPmJvb3RjbWRyZXNwID0gMDsKKwlkbyB7CisJCWludCBqID0gMDsKKwkJaSsrOworCQkvKiBJc3N1ZSBCb290IGNvbW1hbmQgPSAxLCBCb290IGZyb20gRG93bmxvYWQtRlcgKi8KKwkJaWZfdXNiX2lzc3VlX2Jvb3RfY29tbWFuZChwcml2LCBCT09UX0NNRF9GV19CWV9VU0IpOworCQkvKiB3YWl0IGZvciBjb21tYW5kIHJlc3BvbnNlICovCisJCWRvIHsKKwkJCWorKzsKKwkJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKDEwMCk7CisJCX0gd2hpbGUgKGNhcmRwLT5ib290Y21kcmVzcCA9PSAwICYmIGogPCAxMCk7CisJfSB3aGlsZSAoY2FyZHAtPmJvb3RjbWRyZXNwID09IDAgJiYgaSA8IDUpOworCisJaWYgKGNhcmRwLT5ib290Y21kcmVzcCA9PSAwKSB7CisJCWlmICgtLXJlc2V0X2NvdW50ID49IDApIHsKKwkJCWxpYmVydGFzX2RvX3Jlc2V0KHByaXYpOworCQkJZ290byByZXN0YXJ0OworCQl9CisJCXJldHVybiAtMTsKKwl9CisjZW5kaWYKKworCWkgPSAwOworCXByaXYtPmFkYXB0ZXItPmZ3X3JlYWR5ID0gMDsKKworCWNhcmRwLT50b3RhbGJ5dGVzID0gMDsKKwljYXJkcC0+ZndsYXN0Ymxrc2VudCA9IDA7CisJY2FyZHAtPkNSQ19PSyA9IDE7CisJY2FyZHAtPmZ3ZG5sZG92ZXIgPSAwOworCWNhcmRwLT5md3NlcW51bSA9IC0xOworCWNhcmRwLT50b3RhbGJ5dGVzID0gMDsKKwljYXJkcC0+ZndmaW5hbGJsayA9IDA7CisKKwlpZl9wcm9nX2Zpcm13YXJlKHByaXYpOworCisJZG8geworCQlsYnNfZGV2X2RiZygxLCAmY2FyZHAtPnVkZXYtPmRldiwiV2xhbiBzY2hlZCB0aW1lb3V0XG4iKTsKKwkJaSsrOworCQltc2xlZXBfaW50ZXJydXB0aWJsZSgxMDApOworCQlpZiAocHJpdi0+YWRhcHRlci0+c3VycHJpc2VyZW1vdmVkIHx8IGkgPj0gMjApCisJCQlicmVhazsKKwl9IHdoaWxlICghY2FyZHAtPmZ3ZG5sZG92ZXIpOworCisJaWYgKCFjYXJkcC0+Zndkbmxkb3ZlcikgeworCQlsYnNfcHJfaW5mbygiZmFpbGVkIHRvIGxvYWQgZncsIHJlc2V0dGluZyBkZXZpY2UhXG4iKTsKKwkJaWYgKC0tcmVzZXRfY291bnQgPj0gMCkgeworCQkJbGliZXJ0YXNfZG9fcmVzZXQocHJpdik7CisJCQlnb3RvIHJlc3RhcnQ7CisJCX0KKworCQlsYnNfcHJfaW5mbygiRlcgZG93bmxvYWQgZmFpbHVyZSwgdGltZSA9ICVkIG1zXG4iLCBpICogMTAwKTsKKwkJTEVBVkUoKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmX3VzYl9zdWJtaXRfcnhfdXJiKHByaXYpOworCisJLyogRGVsYXkgMjAwIG1zIHRvIHdhaXRpbmcgZm9yIHRoZSBGVyByZWFkeSAqLworCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKDIwMCk7CisKKwlwcml2LT5hZGFwdGVyLT5md19yZWFkeSA9IDE7CisKKwlMRUFWRSgpOworCXJldHVybiAwOworfQorCisvKioKKyAqICBAYnJpZWYgR2l2ZW4gYSB1c2JfY2FyZF9yZWMgcmV0dXJuIGl0cyB3bGFuX3ByaXZhdGUKKyAqICBAcGFyYW0gY2FyZAkJcG9pbnRlciB0byBhIHVzYl9jYXJkX3JlYworICogIEByZXR1cm4gCSAgIAlwb2ludGVyIHRvIHdsYW5fcHJpdmF0ZQorICovCit3bGFuX3ByaXZhdGUgKmxpYmVydGFzX3NiaV9nZXRfcHJpdih2b2lkICpjYXJkKQoreworCXN0cnVjdCB1c2JfY2FyZF9yZWMgKmNhcmRwID0gY2FyZDsKKwlyZXR1cm4gY2FyZHAtPnByaXY7Cit9CisKKyNpZmRlZiBFTkFCTEVfUE0KK2ludCBsaWJlcnRhc19zYmlfc3VzcGVuZCh3bGFuX3ByaXZhdGUgKiBwcml2KQoreworCXJldHVybiAwOworfQorCitpbnQgbGliZXJ0YXNfc2JpX3Jlc3VtZSh3bGFuX3ByaXZhdGUgKiBwcml2KQoreworCXJldHVybiAwOworfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgaWZfdXNiX3N1c3BlbmQoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIHBtX21lc3NhZ2VfdCBtZXNzYWdlKQoreworCXN0cnVjdCB1c2JfY2FyZF9yZWMgKmNhcmRwID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKKwl3bGFuX3ByaXZhdGUgKnByaXYgPSBjYXJkcC0+cHJpdjsKKworCUVOVEVSKCk7CisKKwlpZiAocHJpdi0+YWRhcHRlci0+cHNzdGF0ZSAhPSBQU19TVEFURV9GVUxMX1BPV0VSKQorCQlyZXR1cm4gLTE7CisKKwluZXRpZl9kZXZpY2VfZGV0YWNoKGNhcmRwLT5ldGhfZGV2KTsKKworCS8qIFVubGluayB0eCAmIHJ4IHVyYiAqLworCXVzYl9raWxsX3VyYihjYXJkcC0+dHhfdXJiKTsKKwl1c2Jfa2lsbF91cmIoY2FyZHAtPnJ4X3VyYik7CisKKwljYXJkcC0+cnhfdXJiX3JlY2FsbCA9IDE7CisKKwlMRUFWRSgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlmX3VzYl9yZXN1bWUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7CisJc3RydWN0IHVzYl9jYXJkX3JlYyAqY2FyZHAgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOworCisJRU5URVIoKTsKKworCWNhcmRwLT5yeF91cmJfcmVjYWxsID0gMDsKKworCWlmX3VzYl9zdWJtaXRfcnhfdXJiKGNhcmRwLT5wcml2KTsKKworCW5ldGlmX2RldmljZV9hdHRhY2goY2FyZHAtPmV0aF9kZXYpOworCisJTEVBVkUoKTsKKwlyZXR1cm4gMDsKK30KKyNlbHNlCisjZGVmaW5lIGlmX3VzYl9zdXNwZW5kIE5VTEwKKyNkZWZpbmUgaWZfdXNiX3Jlc3VtZSBOVUxMCisjZW5kaWYKKworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIGlmX3VzYl9kcml2ZXIgPSB7CisJLyogZHJpdmVyIG5hbWUgKi8KKwkubmFtZSA9IHVzYmRyaXZlcl9uYW1lLAorCS8qIHByb2JlIGZ1bmN0aW9uIG5hbWUgKi8KKwkucHJvYmUgPSBpZl91c2JfcHJvYmUsCisJLyogZGlzY29ubmVjdCBmdW5jdGlvbiAgbmFtZSAqLworCS5kaXNjb25uZWN0ID0gaWZfdXNiX2Rpc2Nvbm5lY3QsCisJLyogZGV2aWNlIHNpZ25hdHVyZSB0YWJsZSAqLworCS5pZF90YWJsZSA9IGlmX3VzYl90YWJsZSwKKwkuc3VzcGVuZCA9IGlmX3VzYl9zdXNwZW5kLAorCS5yZXN1bWUgPSBpZl91c2JfcmVzdW1lLAorfTsKKworLyoqCisgKiAgQGJyaWVmIFRoaXMgZnVuY3Rpb24gcmVnaXN0ZXJzIGRyaXZlci4KKyAqICBAcGFyYW0gYWRkCQlwb2ludGVyIHRvIGFkZF9jYXJkIGNhbGxiYWNrIGZ1bmN0aW9uCisgKiAgQHBhcmFtIHJlbW92ZQlwb2ludGVyIHRvIHJlbW92ZSBjYXJkIGNhbGxiYWNrIGZ1bmN0aW9uCisgKiAgQHBhcmFtIGFyZwkJcG9pbnRlciB0byBjYWxsIGJhY2sgZnVuY3Rpb24gcGFyYW1ldGVyCisgKiAgQHJldHVybiAJICAgCWR1bW15IHN1Y2Nlc3MgdmFyaWFibGUKKyAqLworaW50IGxpYmVydGFzX3NiaV9yZWdpc3Rlcih2b2lkKQoreworCS8qCisJICogQVBJIHJlZ2lzdGVycyB0aGUgTWFydmVsbCBVU0IgZHJpdmVyCisJICogdG8gdGhlIFVTQiBzeXN0ZW0KKwkgKi8KKwl1c2JfcmVnaXN0ZXIoJmlmX3VzYl9kcml2ZXIpOworCisJLyogUmV0dXJuIHN1Y2Nlc3MgdG8gd2xhbiBsYXllciAqLworCXJldHVybiAwOworfQorCisvKioKKyAqICBAYnJpZWYgVGhpcyBmdW5jdGlvbiByZW1vdmVzIHVzYiBkcml2ZXIuCisgKiAgQHJldHVybiAJICAgCU4vQQorICovCit2b2lkIGxpYmVydGFzX3NiaV91bnJlZ2lzdGVyKHZvaWQpCit7CisJLyogQVBJIHVucmVnaXN0ZXJzIHRoZSBkcml2ZXIgZnJvbSBVU0Igc3Vic3lzdGVtICovCisJdXNiX2RlcmVnaXN0ZXIoJmlmX3VzYl9kcml2ZXIpOworCXJldHVybjsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2lmX3VzYi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvaWZfdXNiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg1MTE2NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2lmX3VzYi5oCkBAIC0wLDAgKzEsMTA5IEBACisvKioKKyAgKiBUaGlzIGZpbGUgY29udGFpbnMgZGVmaW5pdGlvbiBmb3IgVVNCIGludGVyZmFjZS4KKyAgKi8KKyNkZWZpbmUgQ01EX1RZUEVfUkVRVUVTVCAgICAgICAgICAgICAgICAweEYwMERGQUNFCisjZGVmaW5lIENNRF9UWVBFX0RBVEEgICAgICAgICAgICAgICAgICAgMHhCRUFEQzBERQorI2RlZmluZSBDTURfVFlQRV9JTkRJQ0FUSU9OICAgICAgICAgICAgIDB4QkVFRkZBQ0UKKworI2RlZmluZSBJUEZJRUxEX0FMSUdOX09GRlNFVAkyCisKKyNkZWZpbmUgVVNCODM4OF9WSURfMQkweDEyODYKKyNkZWZpbmUgVVNCODM4OF9QSURfMQkweDIwMDEKKyNkZWZpbmUgVVNCODM4OF9WSURfMgkweDA1YTMKKyNkZWZpbmUgVVNCODM4OF9QSURfMgkweDgzODgKKworI2lmZGVmIFNVUFBPUlRfQk9PVF9DT01NQU5ECisjZGVmaW5lIEJPT1RfQ01EX0ZXX0JZX1VTQiAgICAgMHgwMQorI2RlZmluZSBCT09UX0NNRF9GV19JTl9FRVBST00gIDB4MDIKKyNkZWZpbmUgQk9PVF9DTURfVVBEQVRFX0JPT1QyICAweDAzCisjZGVmaW5lIEJPT1RfQ01EX1VQREFURV9GVyAgICAgMHgwNAorI2RlZmluZSBCT09UX0NNRF9NQUdJQ19OVU1CRVIgIDB4NEM1NjUyNEQgICAvKiBNPT4weDRELFI9PjB4NTIsVj0+MHg1NixMPT4weDRDICovCisKK3N0cnVjdCBib290Y21kc3RyCit7CisJdTMyIHUzMm1hZ2ljbnVtYmVyOworCXU4ICB1OGNtZF90YWc7CisJdTggIGF1OGR1bXlbMTFdOworfTsKKworI2RlZmluZSBCT09UX0NNRF9SRVNQX09LICAgICAweDAwMDEKKyNkZWZpbmUgQk9PVF9DTURfUkVTUF9GQUlMICAgMHgwMDAwCisKK3N0cnVjdCBib290Y21kcmVzcFN0cgoreworCXUzMiB1MzJtYWdpY251bWJlcjsKKwl1OCAgdThjbWRfdGFnOworCXU4ICB1OHJlc3VsdDsKKwl1OCAgYXU4ZHVteVsyXTsKK307CisjZW5kaWYgLyogU1VQUE9SVF9CT09UX0NPTU1BTkQgKi8KKworLyogcmVhZCBjYWxsYmFjayBwcml2YXRlIGRhdGEgKi8KK3N0cnVjdCByZWFkX2NiX2luZm8geworICAgICAgICB3bGFuX3ByaXZhdGUgKnByaXY7CisgICAgICAgIHN0cnVjdCBza19idWZmICpza2I7Cit9OworCisvKiogVVNCIGNhcmQgZGVzY3JpcHRpb24gc3RydWN0dXJlKi8KK3N0cnVjdCB1c2JfY2FyZF9yZWMgeworCXN0cnVjdCBuZXRfZGV2aWNlICpldGhfZGV2OworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2OworCXN0cnVjdCB1cmIgKnJ4X3VyYiwgKnR4X3VyYjsKKwl2b2lkICpwcml2OworCXN0cnVjdCByZWFkX2NiX2luZm8gcmluZm87CisKKwlpbnQgYnVsa19pbl9zaXplOworCXU4IGJ1bGtfaW5fZW5kcG9pbnRBZGRyOworCisJdTggKmJ1bGtfb3V0X2J1ZmZlcjsKKwlpbnQgYnVsa19vdXRfc2l6ZTsKKwl1OCBidWxrX291dF9lbmRwb2ludEFkZHI7CisKKwl1OCBDUkNfT0s7CisJdTMyIGZ3c2VxbnVtOworCXUzMiBsYXN0c2VxbnVtOworCXUzMiB0b3RhbGJ5dGVzOworCXUzMiBmd2xhc3RibGtzZW50OworCXU4IGZ3ZG5sZG92ZXI7CisJdTggZndmaW5hbGJsazsKKworCXUzMiB1c2JfZXZlbnRfY2F1c2U7CisJdTggdXNiX2ludF9jYXVzZTsKKworCXU4IHJ4X3VyYl9yZWNhbGw7CisKKwl1OCBib290Y21kcmVzcDsKK307CisKKy8qKiBmd2hlYWRlciAqLworc3RydWN0IGZ3aGVhZGVyIHsKKwl1MzIgZG5sZGNtZDsKKwl1MzIgYmFzZWFkZHI7CisJdTMyIGRhdGFsZW5ndGg7CisJdTMyIENSQzsKK307CisKKyNkZWZpbmUgRldfTUFYX0RBVEFfQkxLX1NJWkUJNjAwCisvKiogRldEYXRhICovCitzdHJ1Y3QgRldEYXRhIHsKKwlzdHJ1Y3QgZndoZWFkZXIgZndoZWFkZXI7CisJdTMyIHNlcW51bTsKKwl1OCBkYXRhW0ZXX01BWF9EQVRBX0JMS19TSVpFXTsKK307CisKKy8qKiBmd3N5bmNoZWFkZXIgKi8KK3N0cnVjdCBmd3N5bmNoZWFkZXIgeworCXUzMiBjbWQ7CisJdTMyIHNlcW51bTsKK307CisKKyNkZWZpbmUgRldfSEFTX0RBVEFfVE9fUkVDVgkJMHgwMDAwMDAwMQorI2RlZmluZSBGV19IQVNfTEFTVF9CTE9DSwkJMHgwMDAwMDAwNAorCisjZGVmaW5lIEZXX0RBVEFfWE1JVF9TSVpFIFwKKwlzaXplb2Yoc3RydWN0IGZ3aGVhZGVyKSArIGZ3ZGF0YS0+ZndoZWFkZXIuZGF0YWxlbmd0aCArIHNpemVvZih1MzIpCisKK2ludCB1c2JfdHhfYmxvY2sod2xhbl9wcml2YXRlICpwcml2LCB1OCAqcGF5bG9hZCwgdTE2IG5iKTsKK3ZvaWQgaWZfdXNiX2ZyZWUoc3RydWN0IHVzYl9jYXJkX3JlYyAqY2FyZHApOworaW50IGlmX3VzYl9pc3N1ZV9ib290X2NvbW1hbmQod2xhbl9wcml2YXRlICpwcml2LCBpbnQgaXZhbHVlKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvaW9jdGwuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2lvY3RsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJiMzk2NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2lvY3RsLmMKQEAgLTAsMCArMSwyNTAwIEBACisvKioKKyAgKiBUaGlzIGZpbGUgY29udGFpbnMgaW9jdGwgZnVuY3Rpb25zCisgICovCisKKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaWYuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorCisjaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4KKyNpbmNsdWRlIDxuZXQvaWVlZTgwMjExLmg+CisKKyNpbmNsdWRlICJob3N0LmgiCisjaW5jbHVkZSAicmFkaW90YXAuaCIKKyNpbmNsdWRlICJkZWNsLmgiCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgImRldi5oIgorI2luY2x1ZGUgImpvaW4uaCIKKyNpbmNsdWRlICJ3ZXh0LmgiCisKKyNkZWZpbmUgTUFYX1NDQU5fQ0VMTF9TSVpFICAgICAgKElXX0VWX0FERFJfTEVOICsgXAorCQkJCUlXX0VTU0lEX01BWF9TSVpFICsgXAorCQkJCUlXX0VWX1VJTlRfTEVOICsgSVdfRVZfRlJFUV9MRU4gKyBcCisJCQkJSVdfRVZfUVVBTF9MRU4gKyBJV19FU1NJRF9NQVhfU0laRSArIFwKKwkJCQlJV19FVl9QQVJBTV9MRU4gKyA0MCkJLyogNDAgZm9yIFdQQUlFICovCisKKyNkZWZpbmUgV0FJVF9GT1JfU0NBTl9SUkVTVUxUX01BWF9USU1FICgxMCAqIEhaKQorCitzdGF0aWMgaW50IHNldHJ4YW50ZW5uYSh3bGFuX3ByaXZhdGUgKiBwcml2LCBpbnQgbW9kZSkKK3sKKwlpbnQgcmV0ID0gMDsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCisJaWYgKG1vZGUgIT0gUkZfQU5URU5OQV8xICYmIG1vZGUgIT0gUkZfQU5URU5OQV8yCisJICAgICYmIG1vZGUgIT0gUkZfQU5URU5OQV9BVVRPKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWFkYXB0ZXItPnJ4YW50ZW5uYW1vZGUgPSBtb2RlOworCisJbGJzX3ByX2RlYnVnKDEsICJTRVQgUlggQW50ZW5uYSBtb2RlIHRvIDB4JTA0eFxuIiwgYWRhcHRlci0+cnhhbnRlbm5hbW9kZSk7CisKKwlyZXQgPSBsaWJlcnRhc19wcmVwYXJlX2FuZF9zZW5kX2NvbW1hbmQocHJpdiwgY21kXzgwMl8xMV9yZl9hbnRlbm5hLAorCQkJCSAgICBjbWRfYWN0X3NldF9yeCwKKwkJCQkgICAgY21kX29wdGlvbl93YWl0Zm9ycnNwLCAwLAorCQkJCSAgICAmYWRhcHRlci0+cnhhbnRlbm5hbW9kZSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBzZXR0eGFudGVubmEod2xhbl9wcml2YXRlICogcHJpdiwgaW50IG1vZGUpCit7CisJaW50IHJldCA9IDA7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKworCWlmICgobW9kZSAhPSBSRl9BTlRFTk5BXzEpICYmIChtb2RlICE9IFJGX0FOVEVOTkFfMikKKwkgICAgJiYgKG1vZGUgIT0gUkZfQU5URU5OQV9BVVRPKSkgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlhZGFwdGVyLT50eGFudGVubmFtb2RlID0gbW9kZTsKKworCWxic19wcl9kZWJ1ZygxLCAiU0VUIFRYIEFudGVubmEgbW9kZSB0byAweCUwNHhcbiIsIGFkYXB0ZXItPnR4YW50ZW5uYW1vZGUpOworCisJcmV0ID0gbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsIGNtZF84MDJfMTFfcmZfYW50ZW5uYSwKKwkJCQkgICAgY21kX2FjdF9zZXRfdHgsCisJCQkJICAgIGNtZF9vcHRpb25fd2FpdGZvcnJzcCwgMCwKKwkJCQkgICAgJmFkYXB0ZXItPnR4YW50ZW5uYW1vZGUpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBnZXRyeGFudGVubmEod2xhbl9wcml2YXRlICogcHJpdiwgY2hhciAqYnVmKQoreworCWludCByZXQgPSAwOworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisKKwkvLyBjbGVhciBpdCwgc28gd2Ugd2lsbCBrbm93IGlmIHRoZSB2YWx1ZQorCS8vIHJldHVybmVkIGJlbG93IGlzIGNvcnJlY3Qgb3Igbm90LgorCWFkYXB0ZXItPnJ4YW50ZW5uYW1vZGUgPSAwOworCisJcmV0ID0gbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsIGNtZF84MDJfMTFfcmZfYW50ZW5uYSwKKwkJCQkgICAgY21kX2FjdF9nZXRfcngsCisJCQkJICAgIGNtZF9vcHRpb25fd2FpdGZvcnJzcCwgMCwgTlVMTCk7CisKKwlpZiAocmV0KSB7CisJCUxFQVZFKCk7CisJCXJldHVybiByZXQ7CisJfQorCisJbGJzX3ByX2RlYnVnKDEsICJHZXQgUnggQW50ZW5uYSBtb2RlOjB4JTA0eFxuIiwgYWRhcHRlci0+cnhhbnRlbm5hbW9kZSk7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIweCUwNHgiLCBhZGFwdGVyLT5yeGFudGVubmFtb2RlKSArIDE7Cit9CisKK3N0YXRpYyBpbnQgZ2V0dHhhbnRlbm5hKHdsYW5fcHJpdmF0ZSAqIHByaXYsIGNoYXIgKmJ1ZikKK3sKKwlpbnQgcmV0ID0gMDsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCisJLy8gY2xlYXIgaXQsIHNvIHdlIHdpbGwga25vdyBpZiB0aGUgdmFsdWUKKwkvLyByZXR1cm5lZCBiZWxvdyBpcyBjb3JyZWN0IG9yIG5vdC4KKwlhZGFwdGVyLT50eGFudGVubmFtb2RlID0gMDsKKworCXJldCA9IGxpYmVydGFzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZChwcml2LCBjbWRfODAyXzExX3JmX2FudGVubmEsCisJCQkJICAgIGNtZF9hY3RfZ2V0X3R4LAorCQkJCSAgICBjbWRfb3B0aW9uX3dhaXRmb3Jyc3AsIDAsIE5VTEwpOworCisJaWYgKHJldCkgeworCQlMRUFWRSgpOworCQlyZXR1cm4gcmV0OworCX0KKworCWxic19wcl9kZWJ1ZygxLCAiR2V0IFR4IEFudGVubmEgbW9kZToweCUwNHhcbiIsIGFkYXB0ZXItPnR4YW50ZW5uYW1vZGUpOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiMHglMDR4IiwgYWRhcHRlci0+dHhhbnRlbm5hbW9kZSkgKyAxOworfQorCitzdGF0aWMgaW50IHdsYW5fc2V0X3JlZ2lvbih3bGFuX3ByaXZhdGUgKiBwcml2LCB1MTYgcmVnaW9uX2NvZGUpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTVJWRFJWX01BWF9SRUdJT05fQ09ERTsgaSsrKSB7CisJCS8vIHVzZSB0aGUgcmVnaW9uIGNvZGUgdG8gc2VhcmNoIGZvciB0aGUgaW5kZXgKKwkJaWYgKHJlZ2lvbl9jb2RlID09IGxpYmVydGFzX3JlZ2lvbl9jb2RlX3RvX2luZGV4W2ldKSB7CisJCQlwcml2LT5hZGFwdGVyLT5yZWdpb250YWJsZWluZGV4ID0gKHUxNikgaTsKKwkJCXByaXYtPmFkYXB0ZXItPnJlZ2lvbmNvZGUgPSByZWdpb25fY29kZTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLy8gaWYgaXQncyB1bmlkZW50aWZpZWQgcmVnaW9uIGNvZGUKKwlpZiAoaSA+PSBNUlZEUlZfTUFYX1JFR0lPTl9DT0RFKSB7CisJCWxic19wcl9kZWJ1ZygxLCAicmVnaW9uIENvZGUgbm90IGlkZW50aWZpZWRcbiIpOworCQlMRUFWRSgpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGxpYmVydGFzX3NldF9yZWdpb250YWJsZShwcml2LCBwcml2LT5hZGFwdGVyLT5yZWdpb25jb2RlLCAwKSkgeworCQlMRUFWRSgpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiAgQGJyaWVmIEdldC9TZXQgRmlybXdhcmUgd2FrZXVwIG1ldGhvZAorICoKKyAqICBAcGFyYW0gcHJpdgkJQSBwb2ludGVyIHRvIHdsYW5fcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqICBAcGFyYW0gd3JxCSAgIAlBIHBvaW50ZXIgdG8gdXNlciBkYXRhCisgKiAgQHJldHVybiAJICAgCTAtLXN1Y2Nlc3MsIG90aGVyd2lzZSBmYWlsCisgKi8KK3N0YXRpYyBpbnQgd2xhbl90eGNvbnRyb2wod2xhbl9wcml2YXRlICogcHJpdiwgc3RydWN0IGl3cmVxICp3cnEpCit7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwlpbnQgZGF0YTsKKwlFTlRFUigpOworCisJaWYgKChpbnQpd3JxLT51LmRhdGEubGVuZ3RoID09IDApIHsKKwkJaWYgKGNvcHlfdG9fdXNlcgorCQkgICAgKHdycS0+dS5kYXRhLnBvaW50ZXIsICZhZGFwdGVyLT5wa3R0eGN0cmwsIHNpemVvZih1MzIpKSkgeworCQkJbGJzX3ByX2FsZXJ0KCJjb3B5X3RvX3VzZXIgZmFpbGVkIVxuIik7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCX0gZWxzZSB7CisJCWlmICgoaW50KXdycS0+dS5kYXRhLmxlbmd0aCA+IDEpIHsKKwkJCWxic19wcl9hbGVydCgiaW9jdGwgdG9vIG1hbnkgYXJncyFcbiIpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZkYXRhLCB3cnEtPnUuZGF0YS5wb2ludGVyLCBzaXplb2YoaW50KSkpIHsKKwkJCWxic19wcl9hbGVydCgiQ29weSBmcm9tIHVzZXIgZmFpbGVkXG4iKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisKKwkJYWRhcHRlci0+cGt0dHhjdHJsID0gKHUzMikgZGF0YTsKKwl9CisKKwl3cnEtPnUuZGF0YS5sZW5ndGggPSAxOworCisJTEVBVkUoKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiAgQGJyaWVmIEdldC9TZXQgTlVMTCBQYWNrYWdlIGdlbmVyYXRpb24gaW50ZXJ2YWwKKyAqCisgKiAgQHBhcmFtIHByaXYJCUEgcG9pbnRlciB0byB3bGFuX3ByaXZhdGUgc3RydWN0dXJlCisgKiAgQHBhcmFtIHdycQkgICAJQSBwb2ludGVyIHRvIHVzZXIgZGF0YQorICogIEByZXR1cm4gCSAgIAkwLS1zdWNjZXNzLCBvdGhlcndpc2UgZmFpbAorICovCitzdGF0aWMgaW50IHdsYW5fbnVsbF9wa3RfaW50ZXJ2YWwod2xhbl9wcml2YXRlICogcHJpdiwgc3RydWN0IGl3cmVxICp3cnEpCit7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwlpbnQgZGF0YTsKKwlFTlRFUigpOworCisJaWYgKChpbnQpd3JxLT51LmRhdGEubGVuZ3RoID09IDApIHsKKwkJZGF0YSA9IGFkYXB0ZXItPm51bGxwa3RpbnRlcnZhbDsKKworCQlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZkYXRhLCBzaXplb2YoaW50KSkpIHsKKwkJCWxic19wcl9hbGVydCggImNvcHlfdG9fdXNlciBmYWlsZWQhXG4iKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKChpbnQpd3JxLT51LmRhdGEubGVuZ3RoID4gMSkgeworCQkJbGJzX3ByX2FsZXJ0KCAiaW9jdGwgdG9vIG1hbnkgYXJncyFcbiIpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZkYXRhLCB3cnEtPnUuZGF0YS5wb2ludGVyLCBzaXplb2YoaW50KSkpIHsKKwkJCWxic19wcl9kZWJ1ZygxLCAiQ29weSBmcm9tIHVzZXIgZmFpbGVkXG4iKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisKKwkJYWRhcHRlci0+bnVsbHBrdGludGVydmFsID0gZGF0YTsKKwl9CisKKwl3cnEtPnUuZGF0YS5sZW5ndGggPSAxOworCisJTEVBVkUoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bGFuX2dldF9yeGluZm8od2xhbl9wcml2YXRlICogcHJpdiwgc3RydWN0IGl3cmVxICp3cnEpCit7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwlpbnQgZGF0YVsyXTsKKwlFTlRFUigpOworCWRhdGFbMF0gPSBhZGFwdGVyLT5TTlJbVFlQRV9SWFBEXVtUWVBFX05PQVZHXTsKKwlkYXRhWzFdID0gYWRhcHRlci0+cnhwZF9yYXRlOworCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgZGF0YSwgc2l6ZW9mKGludCkgKiAyKSkgeworCQlsYnNfcHJfZGVidWcoMSwgIkNvcHkgdG8gdXNlciBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJd3JxLT51LmRhdGEubGVuZ3RoID0gMjsKKwlMRUFWRSgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdsYW5fZ2V0X3Nucih3bGFuX3ByaXZhdGUgKiBwcml2LCBzdHJ1Y3QgaXdyZXEgKndycSkKK3sKKwlpbnQgcmV0ID0gMDsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCWludCBkYXRhWzRdOworCisJRU5URVIoKTsKKwltZW1zZXQoZGF0YSwgMCwgc2l6ZW9mKGRhdGEpKTsKKwlpZiAod3JxLT51LmRhdGEubGVuZ3RoKSB7CisJCWlmIChjb3B5X2Zyb21fdXNlcihkYXRhLCB3cnEtPnUuZGF0YS5wb2ludGVyLAorCQkgICAgIG1pbl90KHNpemVfdCwgd3JxLT51LmRhdGEubGVuZ3RoLCA0KSAqIHNpemVvZihpbnQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCX0KKwlpZiAoKHdycS0+dS5kYXRhLmxlbmd0aCA9PSAwKSB8fCAoZGF0YVswXSA9PSAwKSB8fCAoZGF0YVswXSA9PSAxKSkgeworCQlpZiAoYWRhcHRlci0+Y29ubmVjdF9zdGF0dXMgPT0gbGliZXJ0YXNfY29ubmVjdGVkKSB7CisJCQlyZXQgPSBsaWJlcnRhc19wcmVwYXJlX2FuZF9zZW5kX2NvbW1hbmQocHJpdiwKKwkJCQkJCSAgICBjbWRfODAyXzExX3Jzc2ksCisJCQkJCQkgICAgMCwKKwkJCQkJCSAgICBjbWRfb3B0aW9uX3dhaXRmb3Jyc3AsCisJCQkJCQkgICAgMCwgTlVMTCk7CisKKwkJCWlmIChyZXQpIHsKKwkJCQlMRUFWRSgpOworCQkJCXJldHVybiByZXQ7CisJCQl9CisJCX0KKwl9CisKKwlpZiAod3JxLT51LmRhdGEubGVuZ3RoID09IDApIHsKKwkJZGF0YVswXSA9IGFkYXB0ZXItPlNOUltUWVBFX0JFQUNPTl1bVFlQRV9OT0FWR107CisJCWRhdGFbMV0gPSBhZGFwdGVyLT5TTlJbVFlQRV9CRUFDT05dW1RZUEVfQVZHXTsKKwkJZGF0YVsyXSA9IGFkYXB0ZXItPlNOUltUWVBFX1JYUERdW1RZUEVfTk9BVkddOworCQlkYXRhWzNdID0gYWRhcHRlci0+U05SW1RZUEVfUlhQRF1bVFlQRV9BVkddIC8gQVZHX1NDQUxFOworCQlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIGRhdGEsIHNpemVvZihpbnQpICogNCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJd3JxLT51LmRhdGEubGVuZ3RoID0gNDsKKwl9IGVsc2UgaWYgKGRhdGFbMF0gPT0gMCkgeworCQlkYXRhWzBdID0gYWRhcHRlci0+U05SW1RZUEVfQkVBQ09OXVtUWVBFX05PQVZHXTsKKwkJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBkYXRhLCBzaXplb2YoaW50KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJd3JxLT51LmRhdGEubGVuZ3RoID0gMTsKKwl9IGVsc2UgaWYgKGRhdGFbMF0gPT0gMSkgeworCQlkYXRhWzBdID0gYWRhcHRlci0+U05SW1RZUEVfQkVBQ09OXVtUWVBFX0FWR107CisJCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgZGF0YSwgc2l6ZW9mKGludCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXdycS0+dS5kYXRhLmxlbmd0aCA9IDE7CisJfSBlbHNlIGlmIChkYXRhWzBdID09IDIpIHsKKwkJZGF0YVswXSA9IGFkYXB0ZXItPlNOUltUWVBFX1JYUERdW1RZUEVfTk9BVkddOworCQlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIGRhdGEsIHNpemVvZihpbnQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQl3cnEtPnUuZGF0YS5sZW5ndGggPSAxOworCX0gZWxzZSBpZiAoZGF0YVswXSA9PSAzKSB7CisJCWRhdGFbMF0gPSBhZGFwdGVyLT5TTlJbVFlQRV9SWFBEXVtUWVBFX0FWR10gLyBBVkdfU0NBTEU7CisJCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgZGF0YSwgc2l6ZW9mKGludCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXdycS0+dS5kYXRhLmxlbmd0aCA9IDE7CisJfSBlbHNlCisJCXJldHVybiAtRU5PVFNVUFA7CisKKwlMRUFWRSgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdsYW5fYmVhY29uX2ludGVydmFsKHdsYW5fcHJpdmF0ZSAqIHByaXYsIHN0cnVjdCBpd3JlcSAqd3JxKQoreworCWludCBkYXRhOworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisKKwlpZiAod3JxLT51LmRhdGEubGVuZ3RoID4gMCkgeworCQlpZiAoY29weV9mcm9tX3VzZXIoJmRhdGEsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHNpemVvZihpbnQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWxic19wcl9kZWJ1ZygxLCAiV0xBTiBTRVQgQkVBQ09OIElOVEVSVkFMOiAlZFxuIiwgZGF0YSk7CisJCWlmICgoZGF0YSA+IE1SVkRSVl9NQVhfQkVBQ09OX0lOVEVSVkFMKQorCQkgICAgfHwgKGRhdGEgPCBNUlZEUlZfTUlOX0JFQUNPTl9JTlRFUlZBTCkpCisJCQlyZXR1cm4gLUVOT1RTVVBQOworCQlhZGFwdGVyLT5iZWFjb25wZXJpb2QgPSBkYXRhOworCX0KKwlkYXRhID0gYWRhcHRlci0+YmVhY29ucGVyaW9kOworCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJmRhdGEsIHNpemVvZihpbnQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwl3cnEtPnUuZGF0YS5sZW5ndGggPSAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2xhbl9nZXRfcnNzaSh3bGFuX3ByaXZhdGUgKiBwcml2LCBzdHJ1Y3QgaXdyZXEgKndycSkKK3sKKwlpbnQgcmV0ID0gMDsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCWludCB0ZW1wOworCWludCBkYXRhID0gMDsKKwlpbnQgKnZhbDsKKworCUVOVEVSKCk7CisJZGF0YSA9IFNVQkNNRF9EQVRBKHdycSk7CisJaWYgKChkYXRhID09IDApIHx8IChkYXRhID09IDEpKSB7CisJCXJldCA9IGxpYmVydGFzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZChwcml2LAorCQkJCQkgICAgY21kXzgwMl8xMV9yc3NpLAorCQkJCQkgICAgMCwgY21kX29wdGlvbl93YWl0Zm9ycnNwLAorCQkJCQkgICAgMCwgTlVMTCk7CisJCWlmIChyZXQpIHsKKwkJCUxFQVZFKCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJc3dpdGNoIChkYXRhKSB7CisJY2FzZSAwOgorCisJCXRlbXAgPSBDQUxfUlNTSShhZGFwdGVyLT5TTlJbVFlQRV9CRUFDT05dW1RZUEVfTk9BVkddLAorCQkJCWFkYXB0ZXItPk5GW1RZUEVfQkVBQ09OXVtUWVBFX05PQVZHXSk7CisJCWJyZWFrOworCWNhc2UgMToKKwkJdGVtcCA9IENBTF9SU1NJKGFkYXB0ZXItPlNOUltUWVBFX0JFQUNPTl1bVFlQRV9BVkddLAorCQkJCWFkYXB0ZXItPk5GW1RZUEVfQkVBQ09OXVtUWVBFX0FWR10pOworCQlicmVhazsKKwljYXNlIDI6CisJCXRlbXAgPSBDQUxfUlNTSShhZGFwdGVyLT5TTlJbVFlQRV9SWFBEXVtUWVBFX05PQVZHXSwKKwkJCQlhZGFwdGVyLT5ORltUWVBFX1JYUERdW1RZUEVfTk9BVkddKTsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQl0ZW1wID0gQ0FMX1JTU0koYWRhcHRlci0+U05SW1RZUEVfUlhQRF1bVFlQRV9BVkddIC8gQVZHX1NDQUxFLAorCQkJCWFkYXB0ZXItPk5GW1RZUEVfUlhQRF1bVFlQRV9BVkddIC8gQVZHX1NDQUxFKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9UU1VQUDsKKwl9CisJdmFsID0gKGludCAqKXdycS0+dS5uYW1lOworCSp2YWwgPSB0ZW1wOworCisJTEVBVkUoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bGFuX2dldF9uZih3bGFuX3ByaXZhdGUgKiBwcml2LCBzdHJ1Y3QgaXdyZXEgKndycSkKK3sKKwlpbnQgcmV0ID0gMDsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCWludCB0ZW1wOworCWludCBkYXRhID0gMDsKKwlpbnQgKnZhbDsKKworCWRhdGEgPSBTVUJDTURfREFUQSh3cnEpOworCWlmICgoZGF0YSA9PSAwKSB8fCAoZGF0YSA9PSAxKSkgeworCQlyZXQgPSBsaWJlcnRhc19wcmVwYXJlX2FuZF9zZW5kX2NvbW1hbmQocHJpdiwKKwkJCQkJICAgIGNtZF84MDJfMTFfcnNzaSwKKwkJCQkJICAgIDAsIGNtZF9vcHRpb25fd2FpdGZvcnJzcCwKKwkJCQkJICAgIDAsIE5VTEwpOworCisJCWlmIChyZXQpIHsKKwkJCUxFQVZFKCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJc3dpdGNoIChkYXRhKSB7CisJY2FzZSAwOgorCQl0ZW1wID0gYWRhcHRlci0+TkZbVFlQRV9CRUFDT05dW1RZUEVfTk9BVkddOworCQlicmVhazsKKwljYXNlIDE6CisJCXRlbXAgPSBhZGFwdGVyLT5ORltUWVBFX0JFQUNPTl1bVFlQRV9BVkddOworCQlicmVhazsKKwljYXNlIDI6CisJCXRlbXAgPSBhZGFwdGVyLT5ORltUWVBFX1JYUERdW1RZUEVfTk9BVkddOworCQlicmVhazsKKwljYXNlIDM6CisJCXRlbXAgPSBhZGFwdGVyLT5ORltUWVBFX1JYUERdW1RZUEVfQVZHXSAvIEFWR19TQ0FMRTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9UU1VQUDsKKwl9CisKKwl0ZW1wID0gQ0FMX05GKHRlbXApOworCisJbGJzX3ByX2RlYnVnKDEsICIlczogdGVtcCA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sIHRlbXApOworCXZhbCA9IChpbnQgKil3cnEtPnUubmFtZTsKKwkqdmFsID0gdGVtcDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bGFuX2dldF90eHJhdGVfaW9jdGwod2xhbl9wcml2YXRlICogcHJpdiwgc3RydWN0IGlmcmVxICpyZXEpCit7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwlpbnQgKnBkYXRhOworCXN0cnVjdCBpd3JlcSAqd3JxID0gKHN0cnVjdCBpd3JlcSAqKXJlcTsKKwlpbnQgcmV0ID0gMDsKKwlhZGFwdGVyLT50eHJhdGUgPSAwOworCWxic19wcl9kZWJ1ZygxLCAid2xhbl9nZXRfdHhyYXRlX2lvY3RsXG4iKTsKKwlyZXQgPSBsaWJlcnRhc19wcmVwYXJlX2FuZF9zZW5kX2NvbW1hbmQocHJpdiwgY21kXzgwMl8xMV90eF9yYXRlX3F1ZXJ5LAorCQkJCSAgICBjbWRfYWN0X2dldCwgY21kX29wdGlvbl93YWl0Zm9ycnNwLAorCQkJCSAgICAwLCBOVUxMKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcGRhdGEgPSAoaW50ICopd3JxLT51Lm5hbWU7CisJKnBkYXRhID0gKGludClhZGFwdGVyLT50eHJhdGU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2xhbl9nZXRfYWRob2Nfc3RhdHVzX2lvY3RsKHdsYW5fcHJpdmF0ZSAqIHByaXYsIHN0cnVjdCBpd3JlcSAqd3JxKQoreworCWNoYXIgc3RhdHVzWzY0XTsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCisJbWVtc2V0KHN0YXR1cywgMCwgc2l6ZW9mKHN0YXR1cykpOworCisJc3dpdGNoIChhZGFwdGVyLT5pbmZyYW1vZGUpIHsKKwljYXNlIHdsYW44MDJfMTFpYnNzOgorCQlpZiAoYWRhcHRlci0+Y29ubmVjdF9zdGF0dXMgPT0gbGliZXJ0YXNfY29ubmVjdGVkKSB7CisJCQlpZiAoYWRhcHRlci0+YWRob2NjcmVhdGUpCisJCQkJbWVtY3B5KCZzdGF0dXMsICJBZGhvY1N0YXJ0ZWQiLCBzaXplb2Yoc3RhdHVzKSk7CisJCQllbHNlCisJCQkJbWVtY3B5KCZzdGF0dXMsICJBZGhvY0pvaW5lZCIsIHNpemVvZihzdGF0dXMpKTsKKwkJfSBlbHNlIHsKKwkJCW1lbWNweSgmc3RhdHVzLCAiQWRob2NJZGxlIiwgc2l6ZW9mKHN0YXR1cykpOworCQl9CisJCWJyZWFrOworCWNhc2Ugd2xhbjgwMl8xMWluZnJhc3RydWN0dXJlOgorCQltZW1jcHkoJnN0YXR1cywgIkluZnJhbW9kZSIsIHNpemVvZihzdGF0dXMpKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbWVtY3B5KCZzdGF0dXMsICJBdXRvVW5rbm93bm1vZGUiLCBzaXplb2Yoc3RhdHVzKSk7CisJCWJyZWFrOworCX0KKworCWxic19wcl9kZWJ1ZygxLCAic3RhdHVzID0gJXNcbiIsIHN0YXR1cyk7CisJd3JxLT51LmRhdGEubGVuZ3RoID0gc3RybGVuKHN0YXR1cykgKyAxOworCisJaWYgKHdycS0+dS5kYXRhLnBvaW50ZXIpIHsKKwkJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLAorCQkJCSAmc3RhdHVzLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJTEVBVkUoKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiAgQGJyaWVmIFNldC9HZXQgV1BBIElFCisgKiAgQHBhcmFtIHByaXYgICAgICAgICAgICAgICAgIEEgcG9pbnRlciB0byB3bGFuX3ByaXZhdGUgc3RydWN0dXJlCisgKiAgQHBhcmFtIHJlcQkJCUEgcG9pbnRlciB0byBpZnJlcSBzdHJ1Y3R1cmUKKyAqICBAcmV0dXJuIAkgICAJCTAgLS1zdWNjZXNzLCBvdGhlcndpc2UgZmFpbAorICovCitzdGF0aWMgaW50IHdsYW5fc2V0d3BhaWVfaW9jdGwod2xhbl9wcml2YXRlICogcHJpdiwgc3RydWN0IGlmcmVxICpyZXEpCit7CisJc3RydWN0IGl3cmVxICp3cnEgPSAoc3RydWN0IGl3cmVxICopcmVxOworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJaW50IHJldCA9IDA7CisKKwlFTlRFUigpOworCisJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCkgeworCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoID4gc2l6ZW9mKGFkYXB0ZXItPndwYV9pZSkpIHsKKwkJCWxic19wcl9kZWJ1ZygxLCAiZmFpbGVkIHRvIGNvcHkgV1BBIElFLCB0b28gYmlnIFxuIik7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlpZiAoY29weV9mcm9tX3VzZXIoYWRhcHRlci0+d3BhX2llLCB3cnEtPnUuZGF0YS5wb2ludGVyLAorCQkJCSAgIHdycS0+dS5kYXRhLmxlbmd0aCkpIHsKKwkJCWxic19wcl9kZWJ1ZygxLCAiZmFpbGVkIHRvIGNvcHkgV1BBIElFIFxuIik7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlhZGFwdGVyLT53cGFfaWVfbGVuID0gd3JxLT51LmRhdGEubGVuZ3RoOworCQlsYnNfcHJfZGVidWcoMSwgIlNldCB3cGFfaWVfbGVuPSVkIElFPSUjeFxuIiwgYWRhcHRlci0+d3BhX2llX2xlbiwKKwkJICAgICAgIGFkYXB0ZXItPndwYV9pZVswXSk7CisJCWxic19kYmdfaGV4KCJ3cGFfaWUiLCBhZGFwdGVyLT53cGFfaWUsIGFkYXB0ZXItPndwYV9pZV9sZW4pOworCQlpZiAoYWRhcHRlci0+d3BhX2llWzBdID09IFdQQV9JRSkKKwkJCWFkYXB0ZXItPnNlY2luZm8uV1BBZW5hYmxlZCA9IDE7CisJCWVsc2UgaWYgKGFkYXB0ZXItPndwYV9pZVswXSA9PSBXUEEyX0lFKQorCQkJYWRhcHRlci0+c2VjaW5mby5XUEEyZW5hYmxlZCA9IDE7CisJCWVsc2UgeworCQkJYWRhcHRlci0+c2VjaW5mby5XUEFlbmFibGVkID0gMDsKKwkJCWFkYXB0ZXItPnNlY2luZm8uV1BBMmVuYWJsZWQgPSAwOworCQl9CisJfSBlbHNlIHsKKwkJbWVtc2V0KGFkYXB0ZXItPndwYV9pZSwgMCwgc2l6ZW9mKGFkYXB0ZXItPndwYV9pZSkpOworCQlhZGFwdGVyLT53cGFfaWVfbGVuID0gd3JxLT51LmRhdGEubGVuZ3RoOworCQlsYnNfcHJfZGVidWcoMSwgIlJlc2V0IHdwYV9pZV9sZW49JWQgSUU9JSN4XG4iLAorCQkgICAgICAgYWRhcHRlci0+d3BhX2llX2xlbiwgYWRhcHRlci0+d3BhX2llWzBdKTsKKwkJYWRhcHRlci0+c2VjaW5mby5XUEFlbmFibGVkID0gMDsKKwkJYWRhcHRlci0+c2VjaW5mby5XUEEyZW5hYmxlZCA9IDA7CisJfQorCisJLy8gZW5hYmxlL2Rpc2FibGUgUlNOIGluIGZpcm13YXJlIGlmIFdQQSBpcyBlbmFibGVkL2Rpc2FibGVkCisJLy8gZGVwZW5kaW5nIG9uIHZhcmlhYmxlIGFkYXB0ZXItPnNlY2luZm8uV1BBZW5hYmxlZCBpcyBzZXQgb3Igbm90CisJcmV0ID0gbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsIGNtZF84MDJfMTFfZW5hYmxlX3JzbiwKKwkJCQkgICAgY21kX2FjdF9zZXQsIGNtZF9vcHRpb25fd2FpdGZvcnJzcCwKKwkJCQkgICAgMCwgTlVMTCk7CisKKwlMRUFWRSgpOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogIEBicmllZiBTZXQgQXV0byBwcmVzY2FuCisgKiAgQHBhcmFtIHByaXYgICAgICAgICAgICAgICAgIEEgcG9pbnRlciB0byB3bGFuX3ByaXZhdGUgc3RydWN0dXJlCisgKiAgQHBhcmFtIHdycQkJCUEgcG9pbnRlciB0byBpd3JlcSBzdHJ1Y3R1cmUKKyAqICBAcmV0dXJuIAkgICAJCTAgLS1zdWNjZXNzLCBvdGhlcndpc2UgZmFpbAorICovCitzdGF0aWMgaW50IHdsYW5fc3ViY21kX3NldHByZXNjYW5faW9jdGwod2xhbl9wcml2YXRlICogcHJpdiwgc3RydWN0IGl3cmVxICp3cnEpCit7CisJaW50IGRhdGE7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwlpbnQgKnZhbDsKKworCWRhdGEgPSBTVUJDTURfREFUQSh3cnEpOworCWxic19wcl9kZWJ1ZygxLCAiV0xBTl9TVUJDTURfU0VUX1BSRVNDQU4gJWRcbiIsIGRhdGEpOworCWFkYXB0ZXItPnByZXNjYW4gPSBkYXRhOworCisJdmFsID0gKGludCAqKXdycS0+dS5uYW1lOworCSp2YWwgPSBkYXRhOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdsYW5fc2V0X211bHRpcGxlX2R0aW1faW9jdGwod2xhbl9wcml2YXRlICogcHJpdiwgc3RydWN0IGlmcmVxICpyZXEpCit7CisJc3RydWN0IGl3cmVxICp3cnEgPSAoc3RydWN0IGl3cmVxICopcmVxOworCXUzMiBtZHRpbTsKKwlpbnQgaWRhdGE7CisJaW50IHJldCA9IC1FSU5WQUw7CisKKwlFTlRFUigpOworCisJaWRhdGEgPSBTVUJDTURfREFUQSh3cnEpOworCW1kdGltID0gKHUzMikgaWRhdGE7CisJaWYgKCgobWR0aW0gPj0gTVJWRFJWX01JTl9NVUxUSVBMRV9EVElNKQorCSAgICAgJiYgKG1kdGltIDw9IE1SVkRSVl9NQVhfTVVMVElQTEVfRFRJTSkpCisJICAgIHx8IChtZHRpbSA9PSBNUlZEUlZfSUdOT1JFX01VTFRJUExFX0RUSU0pKSB7CisJCXByaXYtPmFkYXB0ZXItPm11bHRpcGxlZHRpbSA9IG1kdGltOworCQlyZXQgPSAwOworCX0KKwlpZiAocmV0KQorCQlsYnNfcHJfZGVidWcoMSwgIkludmFsaWQgcGFyYW1ldGVyLCBtdWx0aXBsZWR0aW0gbm90IGNoYW5nZWQuXG4iKTsKKworCUxFQVZFKCk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiAgQGJyaWVmIFNldCBhdXRoZW50aWNhdGlvbiBtb2RlCisgKiAgQHBhcmFtIHByaXYgICAgICAgICAgICAgICAgIEEgcG9pbnRlciB0byB3bGFuX3ByaXZhdGUgc3RydWN0dXJlCisgKiAgQHBhcmFtIHJlcQkJCUEgcG9pbnRlciB0byBpZnJlcSBzdHJ1Y3R1cmUKKyAqICBAcmV0dXJuIAkgICAJCTAgLS1zdWNjZXNzLCBvdGhlcndpc2UgZmFpbAorICovCitzdGF0aWMgaW50IHdsYW5fc2V0YXV0aGFsZ19pb2N0bCh3bGFuX3ByaXZhdGUgKiBwcml2LCBzdHJ1Y3QgaWZyZXEgKnJlcSkKK3sKKwlpbnQgYWxnOworCXN0cnVjdCBpd3JlcSAqd3JxID0gKHN0cnVjdCBpd3JlcSAqKXJlcTsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCisJaWYgKHdycS0+dS5kYXRhLmZsYWdzID09IDApIHsKKwkJLy9mcm9tIGl3cHJpdiBzdWJjbWQKKwkJYWxnID0gU1VCQ01EX0RBVEEod3JxKTsKKwl9IGVsc2UgeworCQkvL2Zyb20gd3BhX3N1cHBsaWNhbnQgc3ViY21kCisJCWlmIChjb3B5X2Zyb21fdXNlcigmYWxnLCB3cnEtPnUuZGF0YS5wb2ludGVyLCBzaXplb2YoYWxnKSkpIHsKKwkJCWxic19wcl9kZWJ1ZygxLCAiQ29weSBmcm9tIHVzZXIgZmFpbGVkXG4iKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJfQorCisJbGJzX3ByX2RlYnVnKDEsICJhdXRoIGFsZyBpcyAlI3hcbiIsIGFsZyk7CisKKwlzd2l0Y2ggKGFsZykgeworCWNhc2UgQVVUSF9BTEdfU0hBUkVEX0tFWToKKwkJYWRhcHRlci0+c2VjaW5mby5hdXRobW9kZSA9IHdsYW44MDJfMTFhdXRobW9kZXNoYXJlZDsKKwkJYnJlYWs7CisJY2FzZSBBVVRIX0FMR19ORVRXT1JLX0VBUDoKKwkJYWRhcHRlci0+c2VjaW5mby5hdXRobW9kZSA9CisJCSAgICB3bGFuODAyXzExYXV0aG1vZGVuZXR3b3JrRUFQOworCQlicmVhazsKKwljYXNlIEFVVEhfQUxHX09QRU5fU1lTVEVNOgorCWRlZmF1bHQ6CisJCWFkYXB0ZXItPnNlY2luZm8uYXV0aG1vZGUgPSB3bGFuODAyXzExYXV0aG1vZGVvcGVuOworCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogIEBicmllZiBTZXQgODAyLjF4IGF1dGhlbnRpY2F0aW9uIG1vZGUKKyAqICBAcGFyYW0gcHJpdiAgICAgICAgICAgICAgICAgQSBwb2ludGVyIHRvIHdsYW5fcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqICBAcGFyYW0gcmVxCQkJQSBwb2ludGVyIHRvIGlmcmVxIHN0cnVjdHVyZQorICogIEByZXR1cm4gCSAgIAkJMCAtLXN1Y2Nlc3MsIG90aGVyd2lzZSBmYWlsCisgKi8KK3N0YXRpYyBpbnQgd2xhbl9zZXQ4MDIxeGF1dGhhbGdfaW9jdGwod2xhbl9wcml2YXRlICogcHJpdiwgc3RydWN0IGlmcmVxICpyZXEpCit7CisJaW50IGFsZzsKKwlzdHJ1Y3QgaXdyZXEgKndycSA9IChzdHJ1Y3QgaXdyZXEgKilyZXE7CisKKwlpZiAod3JxLT51LmRhdGEuZmxhZ3MgPT0gMCkgeworCQkvL2Zyb20gaXdwcml2IHN1YmNtZAorCQlhbGcgPSBTVUJDTURfREFUQSh3cnEpOworCX0gZWxzZSB7CisJCS8vZnJvbSB3cGFfc3VwcGxpY2FudCBzdWJjbWQKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZhbGcsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHNpemVvZihpbnQpKSkgeworCQkJbGJzX3ByX2RlYnVnKDEsICJDb3B5IGZyb20gdXNlciBmYWlsZWRcbiIpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwl9CisJbGJzX3ByX2RlYnVnKDEsICI4MDIuMXggYXV0aCBhbGcgaXMgJSN4XG4iLCBhbGcpOworCXByaXYtPmFkYXB0ZXItPnNlY2luZm8uYXV0aDF4YWxnID0gYWxnOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdsYW5fc2V0ZW5jcnlwdGlvbm1vZGVfaW9jdGwod2xhbl9wcml2YXRlICogcHJpdiwgc3RydWN0IGlmcmVxICpyZXEpCit7CisJaW50IG1vZGU7CisJc3RydWN0IGl3cmVxICp3cnEgPSAoc3RydWN0IGl3cmVxICopcmVxOworCisJRU5URVIoKTsKKworCWlmICh3cnEtPnUuZGF0YS5mbGFncyA9PSAwKSB7CisJCS8vZnJvbSBpd3ByaXYgc3ViY21kCisJCW1vZGUgPSBTVUJDTURfREFUQSh3cnEpOworCX0gZWxzZSB7CisJCS8vZnJvbSB3cGFfc3VwcGxpY2FudCBzdWJjbWQKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZtb2RlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCBzaXplb2YoaW50KSkpIHsKKwkJCWxic19wcl9kZWJ1ZygxLCAiQ29weSBmcm9tIHVzZXIgZmFpbGVkXG4iKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJfQorCWxic19wcl9kZWJ1ZygxLCAiZW5jcnlwdGlvbiBtb2RlIGlzICUjeFxuIiwgbW9kZSk7CisJcHJpdi0+YWRhcHRlci0+c2VjaW5mby5FbmNyeXB0aW9ubW9kZSA9IG1vZGU7CisKKwlMRUFWRSgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhZGp1c3RfbXR1KHdsYW5fcHJpdmF0ZSAqIHByaXYpCit7CisJaW50IG10dV9pbmNyZW1lbnQgPSAwOworCisJaWYgKHByaXYtPmFkYXB0ZXItPmxpbmttb2RlID09IFdMQU5fTElOS01PREVfODAyXzExKQorCQltdHVfaW5jcmVtZW50ICs9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkcik7CisKKwlpZiAocHJpdi0+YWRhcHRlci0+cmFkaW9tb2RlID09IFdMQU5fUkFESU9NT0RFX1JBRElPVEFQKQorCQltdHVfaW5jcmVtZW50ICs9IG1heChzaXplb2Yoc3RydWN0IHR4X3JhZGlvdGFwX2hkciksCisJCQkJICAgICBzaXplb2Yoc3RydWN0IHJ4X3JhZGlvdGFwX2hkcikpOworCXByaXYtPndsYW5fZGV2Lm5ldGRldi0+bXR1ID0gRVRIX0ZSQU1FX0xFTgorCSAgICAtIHNpemVvZihzdHJ1Y3QgZXRoaGRyKQorCSAgICArIG10dV9pbmNyZW1lbnQ7Cit9CisKKy8qKgorICogIEBicmllZiBTZXQgTGluay1MYXllciBMYXllciBtb2RlCisgKiAgQHBhcmFtIHByaXYgICAgICAgICAgICAgICAgIEEgcG9pbnRlciB0byB3bGFuX3ByaXZhdGUgc3RydWN0dXJlCisgKiAgQHBhcmFtIHJlcQkJCUEgcG9pbnRlciB0byBpZnJlcSBzdHJ1Y3R1cmUKKyAqICBAcmV0dXJuIAkgICAJCTAgLS1zdWNjZXNzLCBvdGhlcndpc2UgZmFpbAorICovCitzdGF0aWMgaW50IHdsYW5fc2V0X2xpbmttb2RlX2lvY3RsKHdsYW5fcHJpdmF0ZSAqIHByaXYsIHN0cnVjdCBpZnJlcSAqcmVxKQoreworCWludCBtb2RlOworCisJbW9kZSA9IChpbnQpKChzdHJ1Y3QgaWZyZXEgKikoKHU4ICopIHJlcSArIDQpKS0+aWZyX2RhdGE7CisKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIFdMQU5fTElOS01PREVfODAyXzM6CisJCXByaXYtPmFkYXB0ZXItPmxpbmttb2RlID0gbW9kZTsKKwkJYnJlYWs7CisJY2FzZSBXTEFOX0xJTktNT0RFXzgwMl8xMToKKwkJcHJpdi0+YWRhcHRlci0+bGlua21vZGUgPSBtb2RlOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlsYnNfcHJfaW5mbygidXNiODM4OC01OiBpbnZhbGlkIGxpbmstbGF5ZXIgbW9kZSAoJSN4KVxuIiwKKwkJICAgICAgIG1vZGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCWxic19wcl9kZWJ1ZygxLCAidXNiODM4OC01OiBsaW5rLWxheWVyIG1vZGUgaXMgJSN4XG4iLCBtb2RlKTsKKworCWFkanVzdF9tdHUocHJpdik7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiAgQGJyaWVmIFNldCBSYWRpbyBoZWFkZXIgbW9kZQorICogIEBwYXJhbSBwcml2ICAgICAgICAgICAgICAgICBBIHBvaW50ZXIgdG8gd2xhbl9wcml2YXRlIHN0cnVjdHVyZQorICogIEBwYXJhbSByZXEJCQlBIHBvaW50ZXIgdG8gaWZyZXEgc3RydWN0dXJlCisgKiAgQHJldHVybiAJICAgCQkwIC0tc3VjY2Vzcywgb3RoZXJ3aXNlIGZhaWwKKyAqLworc3RhdGljIGludCB3bGFuX3NldF9yYWRpb21vZGVfaW9jdGwod2xhbl9wcml2YXRlICogcHJpdiwgc3RydWN0IGlmcmVxICpyZXEpCit7CisJaW50IG1vZGU7CisKKwltb2RlID0gKGludCkoKHN0cnVjdCBpZnJlcSAqKSgodTggKikgcmVxICsgNCkpLT5pZnJfZGF0YTsKKworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgV0xBTl9SQURJT01PREVfTk9ORToKKwkJcHJpdi0+YWRhcHRlci0+cmFkaW9tb2RlID0gbW9kZTsKKwkJYnJlYWs7CisJY2FzZSBXTEFOX1JBRElPTU9ERV9SQURJT1RBUDoKKwkJcHJpdi0+YWRhcHRlci0+cmFkaW9tb2RlID0gbW9kZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbGJzX3ByX2RlYnVnKDEsICJ1c2I4Mzg4LTU6IGludmFsaWQgcmFkaW8gaGVhZGVyIG1vZGUgKCUjeClcbiIsCisJCSAgICAgICBtb2RlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWxic19wcl9kZWJ1ZygxLCAidXNiODM4OC01OiByYWRpby1oZWFkZXIgbW9kZSBpcyAlI3hcbiIsIG1vZGUpOworCisJYWRqdXN0X210dShwcml2KTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiAgQGJyaWVmIFNldCBEZWJ1ZyBoZWFkZXIgbW9kZQorICogIEBwYXJhbSBwcml2ICAgICAgICAgICAgICAgICBBIHBvaW50ZXIgdG8gd2xhbl9wcml2YXRlIHN0cnVjdHVyZQorICogIEBwYXJhbSByZXEJCQlBIHBvaW50ZXIgdG8gaWZyZXEgc3RydWN0dXJlCisgKiAgQHJldHVybiAJICAgCQkwIC0tc3VjY2Vzcywgb3RoZXJ3aXNlIGZhaWwKKyAqLworc3RhdGljIGludCB3bGFuX3NldF9kZWJ1Z21vZGVfaW9jdGwod2xhbl9wcml2YXRlICogcHJpdiwgc3RydWN0IGlmcmVxICpyZXEpCit7CisJcHJpdi0+YWRhcHRlci0+ZGVidWdtb2RlID0gKGludCkoKHN0cnVjdCBpZnJlcSAqKQorCQkJCQkgKCh1OCAqKSByZXEgKyA0KSktPmlmcl9kYXRhOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdsYW5fc3ViY21kX2dldHJ4YW50ZW5uYV9pb2N0bCh3bGFuX3ByaXZhdGUgKiBwcml2LAorCQkJCQkgIHN0cnVjdCBpZnJlcSAqcmVxKQoreworCWludCBsZW47CisJY2hhciBidWZbOF07CisJc3RydWN0IGl3cmVxICp3cnEgPSAoc3RydWN0IGl3cmVxICopcmVxOworCisJbGJzX3ByX2RlYnVnKDEsICJXTEFOX1NVQkNNRF9HRVRSWEFOVEVOTkFcbiIpOworCWxlbiA9IGdldHJ4YW50ZW5uYShwcml2LCBidWYpOworCisJd3JxLT51LmRhdGEubGVuZ3RoID0gbGVuOworCWlmICh3cnEtPnUuZGF0YS5wb2ludGVyKSB7CisJCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJmJ1ZiwgbGVuKSkgeworCQkJbGJzX3ByX2RlYnVnKDEsICJDb3B5VG9Vc2VyIGZhaWxlZFxuIik7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdsYW5fc3ViY21kX2dldHR4YW50ZW5uYV9pb2N0bCh3bGFuX3ByaXZhdGUgKiBwcml2LAorCQkJCQkgIHN0cnVjdCBpZnJlcSAqcmVxKQoreworCWludCBsZW47CisJY2hhciBidWZbOF07CisJc3RydWN0IGl3cmVxICp3cnEgPSAoc3RydWN0IGl3cmVxICopcmVxOworCisJbGJzX3ByX2RlYnVnKDEsICJXTEFOX1NVQkNNRF9HRVRUWEFOVEVOTkFcbiIpOworCWxlbiA9IGdldHR4YW50ZW5uYShwcml2LCBidWYpOworCisJd3JxLT51LmRhdGEubGVuZ3RoID0gbGVuOworCWlmICh3cnEtPnUuZGF0YS5wb2ludGVyKSB7CisJCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJmJ1ZiwgbGVuKSkgeworCQkJbGJzX3ByX2RlYnVnKDEsICJDb3B5VG9Vc2VyIGZhaWxlZFxuIik7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiAgQGJyaWVmIEdldCB0aGUgTUFDIFRTRiB2YWx1ZSBmcm9tIHRoZSBmaXJtd2FyZQorICoKKyAqICBAcGFyYW0gcHJpdiAgICAgICAgIEEgcG9pbnRlciB0byB3bGFuX3ByaXZhdGUgc3RydWN0dXJlCisgKiAgQHBhcmFtIHdycSAgICAgICAgICBBIHBvaW50ZXIgdG8gaXdyZXEgc3RydWN0dXJlIGNvbnRhaW5pbmcgYnVmZmVyCisgKiAgICAgICAgICAgICAgICAgICAgICBzcGFjZSB0byBzdG9yZSBhIFRTRiB2YWx1ZSByZXRyaWV2ZWQgZnJvbSB0aGUgZmlybXdhcmUKKyAqCisgKiAgQHJldHVybiAgICAgICAgICAgICAwIGlmIHN1Y2Nlc3NmdWw7IElPQ1RMIGVycm9yIGNvZGUgb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbnQgd2xhbl9nZXRfdHNmX2lvY3RsKHdsYW5fcHJpdmF0ZSAqIHByaXYsIHN0cnVjdCBpd3JlcSAqd3JxKQoreworCXU2NCB0c2Z2YWw7CisJaW50IHJldDsKKworCXJldCA9IGxpYmVydGFzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZChwcml2LAorCQkJCSAgICBjbWRfZ2V0X3RzZiwKKwkJCQkgICAgMCwgY21kX29wdGlvbl93YWl0Zm9ycnNwLCAwLCAmdHNmdmFsKTsKKworCWxic19wcl9kZWJ1ZygxLCAiSU9DVEw6IEdldCBUU0YgPSAweCUwMTZsbHhcbiIsIHRzZnZhbCk7CisKKwlpZiAocmV0ICE9IDApIHsKKwkJbGJzX3ByX2RlYnVnKDEsICJJT0NUTDogR2V0IFRTRjsgY29tbWFuZCBleGVjIGZhaWxlZFxuIik7CisJCXJldCA9IC1FRkFVTFQ7CisJfSBlbHNlIHsKKwkJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLAorCQkJCSAmdHNmdmFsLAorCQkJCSBtaW5fdChzaXplX3QsIHdycS0+dS5kYXRhLmxlbmd0aCwKKwkJCQkgICAgIHNpemVvZih0c2Z2YWwpKSkgIT0gMCkgeworCisJCQlsYnNfcHJfZGVidWcoMSwgIklPQ1RMOiBHZXQgVFNGOyBDb3B5IHRvIHVzZXIgZmFpbGVkXG4iKTsKKwkJCXJldCA9IC1FRkFVTFQ7CisJCX0gZWxzZSB7CisJCQlyZXQgPSAwOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogIEBicmllZiBHZXQvU2V0IGFkYXB0IHJhdGUKKyAqICBAcGFyYW0gcHJpdiAgICAgICAgICAgICAgICAgQSBwb2ludGVyIHRvIHdsYW5fcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqICBAcGFyYW0gd3JxCQkJQSBwb2ludGVyIHRvIGl3cmVxIHN0cnVjdHVyZQorICogIEByZXR1cm4gCSAgIAkJMCAtLXN1Y2Nlc3MsIG90aGVyd2lzZSBmYWlsCisgKi8KK3N0YXRpYyBpbnQgd2xhbl9hZGFwdF9yYXRlc2V0KHdsYW5fcHJpdmF0ZSAqIHByaXYsIHN0cnVjdCBpd3JlcSAqd3JxKQoreworCWludCByZXQ7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwlpbnQgZGF0YVsyXTsKKworCW1lbXNldChkYXRhLCAwLCBzaXplb2YoZGF0YSkpOworCWlmICghd3JxLT51LmRhdGEubGVuZ3RoKSB7CisJCWxic19wcl9kZWJ1ZygxLCAiR2V0IEFEQVBUIFJBVEUgU0VUXG4iKTsKKwkJcmV0ID0gbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsCisJCQkJCSAgICBjbWRfODAyXzExX3JhdGVfYWRhcHRfcmF0ZXNldCwKKwkJCQkJICAgIGNtZF9hY3RfZ2V0LAorCQkJCQkgICAgY21kX29wdGlvbl93YWl0Zm9ycnNwLCAwLCBOVUxMKTsKKwkJZGF0YVswXSA9IGFkYXB0ZXItPmVuYWJsZWh3YXV0bzsKKwkJZGF0YVsxXSA9IGFkYXB0ZXItPnJhdGViaXRtYXA7CisJCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgZGF0YSwgc2l6ZW9mKGludCkgKiAyKSkgeworCQkJbGJzX3ByX2RlYnVnKDEsICJDb3B5IHRvIHVzZXIgZmFpbGVkXG4iKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisjZGVmaW5lIEdFVF9UV09fSU5UCTIKKwkJd3JxLT51LmRhdGEubGVuZ3RoID0gR0VUX1RXT19JTlQ7CisJfSBlbHNlIHsKKwkJbGJzX3ByX2RlYnVnKDEsICJTZXQgQURBUFQgUkFURSBTRVRcbiIpOworCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoID4gMikKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoY29weV9mcm9tX3VzZXIKKwkJICAgIChkYXRhLCB3cnEtPnUuZGF0YS5wb2ludGVyLAorCQkgICAgIHNpemVvZihpbnQpICogd3JxLT51LmRhdGEubGVuZ3RoKSkgeworCQkJbGJzX3ByX2RlYnVnKDEsICJDb3B5IGZyb20gdXNlciBmYWlsZWRcbiIpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKworCQlhZGFwdGVyLT5lbmFibGVod2F1dG8gPSBkYXRhWzBdOworCQlhZGFwdGVyLT5yYXRlYml0bWFwID0gZGF0YVsxXTsKKwkJcmV0ID0gbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsCisJCQkJCSAgICBjbWRfODAyXzExX3JhdGVfYWRhcHRfcmF0ZXNldCwKKwkJCQkJICAgIGNtZF9hY3Rfc2V0LAorCQkJCQkgICAgY21kX29wdGlvbl93YWl0Zm9ycnNwLCAwLCBOVUxMKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiAgQGJyaWVmIEdldC9TZXQgaW5hY3Rpdml0eSB0aW1lb3V0CisgKiAgQHBhcmFtIHByaXYgICAgICAgICAgICAgICAgIEEgcG9pbnRlciB0byB3bGFuX3ByaXZhdGUgc3RydWN0dXJlCisgKiAgQHBhcmFtIHdycQkJCUEgcG9pbnRlciB0byBpd3JlcSBzdHJ1Y3R1cmUKKyAqICBAcmV0dXJuIAkgICAJCTAgLS1zdWNjZXNzLCBvdGhlcndpc2UgZmFpbAorICovCitzdGF0aWMgaW50IHdsYW5faW5hY3Rpdml0eV90aW1lb3V0KHdsYW5fcHJpdmF0ZSAqIHByaXYsIHN0cnVjdCBpd3JlcSAqd3JxKQoreworCWludCByZXQ7CisJaW50IGRhdGEgPSAwOworCXUxNiB0aW1lb3V0ID0gMDsKKworCUVOVEVSKCk7CisJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCA+IDEpCisJCXJldHVybiAtRU5PVFNVUFA7CisKKwlpZiAod3JxLT51LmRhdGEubGVuZ3RoID09IDApIHsKKwkJLyogR2V0ICovCisJCXJldCA9IGxpYmVydGFzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZChwcml2LAorCQkJCQkgICAgY21kXzgwMl8xMV9pbmFjdGl2aXR5X3RpbWVvdXQsCisJCQkJCSAgICBjbWRfYWN0X2dldCwKKwkJCQkJICAgIGNtZF9vcHRpb25fd2FpdGZvcnJzcCwgMCwKKwkJCQkJICAgICZ0aW1lb3V0KTsKKwkJZGF0YSA9IHRpbWVvdXQ7CisJCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJmRhdGEsIHNpemVvZihpbnQpKSkgeworCQkJbGJzX3ByX2RlYnVnKDEsICJDb3B5IHRvIHVzZXIgZmFpbGVkXG4iKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJfSBlbHNlIHsKKwkJLyogU2V0ICovCisJCWlmIChjb3B5X2Zyb21fdXNlcigmZGF0YSwgd3JxLT51LmRhdGEucG9pbnRlciwgc2l6ZW9mKGludCkpKSB7CisJCQlsYnNfcHJfZGVidWcoMSwgIkNvcHkgZnJvbSB1c2VyIGZhaWxlZFxuIik7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCisJCXRpbWVvdXQgPSBkYXRhOworCQlyZXQgPSBsaWJlcnRhc19wcmVwYXJlX2FuZF9zZW5kX2NvbW1hbmQocHJpdiwKKwkJCQkJICAgIGNtZF84MDJfMTFfaW5hY3Rpdml0eV90aW1lb3V0LAorCQkJCQkgICAgY21kX2FjdF9zZXQsCisJCQkJCSAgICBjbWRfb3B0aW9uX3dhaXRmb3Jyc3AsIDAsCisJCQkJCSAgICAmdGltZW91dCk7CisJfQorCisJd3JxLT51LmRhdGEubGVuZ3RoID0gMTsKKworCUxFQVZFKCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB3bGFuX2RvX2dldGxvZ19pb2N0bCh3bGFuX3ByaXZhdGUgKiBwcml2LCBzdHJ1Y3QgaXdyZXEgKndycSkKK3sKKwlpbnQgcmV0OworCWNoYXIgYnVmW0dFVExPR19CVUZTSVpFIC0gMV07CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKworCWxic19wcl9kZWJ1ZygxLCAiIEdFVCBTVEFUU1xuIik7CisKKwlyZXQgPSBsaWJlcnRhc19wcmVwYXJlX2FuZF9zZW5kX2NvbW1hbmQocHJpdiwgY21kXzgwMl8xMV9nZXRfbG9nLAorCQkJCSAgICAwLCBjbWRfb3B0aW9uX3dhaXRmb3Jyc3AsIDAsIE5VTEwpOworCisJaWYgKHJldCkgeworCQlyZXR1cm4gcmV0OworCX0KKworCWlmICh3cnEtPnUuZGF0YS5wb2ludGVyKSB7CisJCXNwcmludGYoYnVmLCAiXG4gIG1jYXN0dHhmcmFtZSAldSBmYWlsZWQgJXUgcmV0cnkgJXUgIgorCQkJIm11bHRpcmV0cnkgJXUgZnJhbWVkdXAgJXUgIgorCQkJInJ0c3N1Y2Nlc3MgJXUgcnRzZmFpbHVyZSAldSBhY2tmYWlsdXJlICV1XG4iCisJCQkicnhmcmFnICV1IG1jYXN0cnhmcmFtZSAldSBmY3NlcnJvciAldSAiCisJCQkidHhmcmFtZSAldSB3ZXB1bmRlY3J5cHRhYmxlICV1ICIsCisJCQlhZGFwdGVyLT5sb2dtc2cubWNhc3R0eGZyYW1lLAorCQkJYWRhcHRlci0+bG9nbXNnLmZhaWxlZCwKKwkJCWFkYXB0ZXItPmxvZ21zZy5yZXRyeSwKKwkJCWFkYXB0ZXItPmxvZ21zZy5tdWx0aXJldHJ5LAorCQkJYWRhcHRlci0+bG9nbXNnLmZyYW1lZHVwLAorCQkJYWRhcHRlci0+bG9nbXNnLnJ0c3N1Y2Nlc3MsCisJCQlhZGFwdGVyLT5sb2dtc2cucnRzZmFpbHVyZSwKKwkJCWFkYXB0ZXItPmxvZ21zZy5hY2tmYWlsdXJlLAorCQkJYWRhcHRlci0+bG9nbXNnLnJ4ZnJhZywKKwkJCWFkYXB0ZXItPmxvZ21zZy5tY2FzdHJ4ZnJhbWUsCisJCQlhZGFwdGVyLT5sb2dtc2cuZmNzZXJyb3IsCisJCQlhZGFwdGVyLT5sb2dtc2cudHhmcmFtZSwKKwkJCWFkYXB0ZXItPmxvZ21zZy53ZXB1bmRlY3J5cHRhYmxlKTsKKwkJd3JxLT51LmRhdGEubGVuZ3RoID0gc3RybGVuKGJ1ZikgKyAxOworCQlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIGJ1Ziwgd3JxLT51LmRhdGEubGVuZ3RoKSkgeworCQkJbGJzX3ByX2RlYnVnKDEsICJDb3B5IHRvIHVzZXIgZmFpbGVkXG4iKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2xhbl9zY2FuX3R5cGVfaW9jdGwod2xhbl9wcml2YXRlICogcHJpdiwgc3RydWN0IGl3cmVxICp3cnEpCit7CisJdTggYnVmWzEyXTsKKwl1OCAqb3B0aW9uW10gPSB7ICJhY3RpdmUiLCAicGFzc2l2ZSIsICJnZXQiLCB9OworCWludCBpLCBtYXhfb3B0aW9ucyA9IChzaXplb2Yob3B0aW9uKSAvIHNpemVvZihvcHRpb25bMF0pKTsKKwlpbnQgcmV0ID0gMDsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCisJaWYgKHByaXYtPmFkYXB0ZXItPmVuYWJsZTExZCkgeworCQlsYnNfcHJfZGVidWcoMSwgIjExRDogQ2Fubm90IHNldCBzY2FudHlwZSB3aGVuIDExRCBlbmFibGVkXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOworCisJaWYgKGNvcHlfZnJvbV91c2VyKGJ1Ziwgd3JxLT51LmRhdGEucG9pbnRlciwgbWluX3Qoc2l6ZV90LCBzaXplb2YoYnVmKSwKKwkJCQkJCQkgd3JxLT51LmRhdGEubGVuZ3RoKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJbGJzX3ByX2RlYnVnKDEsICJTY2FuIHR5cGUgT3B0aW9uID0gJXNcbiIsIGJ1Zik7CisKKwlidWZbc2l6ZW9mKGJ1ZikgLSAxXSA9ICdcMCc7CisKKwlmb3IgKGkgPSAwOyBpIDwgbWF4X29wdGlvbnM7IGkrKykgeworCQlpZiAoIXN0cmNtcChidWYsIG9wdGlvbltpXSkpCisJCQlicmVhazsKKwl9CisKKwlzd2l0Y2ggKGkpIHsKKwljYXNlIDA6CisJCWFkYXB0ZXItPnNjYW50eXBlID0gY21kX3NjYW5fdHlwZV9hY3RpdmU7CisJCWJyZWFrOworCWNhc2UgMToKKwkJYWRhcHRlci0+c2NhbnR5cGUgPSBjbWRfc2Nhbl90eXBlX3Bhc3NpdmU7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJd3JxLT51LmRhdGEubGVuZ3RoID0gc3RybGVuKG9wdGlvblthZGFwdGVyLT5zY2FudHlwZV0pICsgMTsKKworCQlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsCisJCQkJIG9wdGlvblthZGFwdGVyLT5zY2FudHlwZV0sCisJCQkJIHdycS0+dS5kYXRhLmxlbmd0aCkpIHsKKwkJCWxic19wcl9kZWJ1ZygxLCAiQ29weSB0byB1c2VyIGZhaWxlZFxuIik7CisJCQlyZXQgPSAtRUZBVUxUOworCQl9CisKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbGJzX3ByX2RlYnVnKDEsICJJbnZhbGlkIFNjYW4gdHlwZSBJb2N0bCBPcHRpb25cbiIpOworCQlyZXQgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHdsYW5fc2Nhbl9tb2RlX2lvY3RsKHdsYW5fcHJpdmF0ZSAqIHByaXYsIHN0cnVjdCBpd3JlcSAqd3JxKQoreworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJdTggYnVmWzEyXTsKKwl1OCAqb3B0aW9uW10gPSB7ICJic3MiLCAiaWJzcyIsICJhbnkiLCAiZ2V0IiB9OworCWludCBpLCBtYXhfb3B0aW9ucyA9IChzaXplb2Yob3B0aW9uKSAvIHNpemVvZihvcHRpb25bMF0pKTsKKwlpbnQgcmV0ID0gMDsKKworCUVOVEVSKCk7CisKKwltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCB3cnEtPnUuZGF0YS5wb2ludGVyLCBtaW5fdChzaXplX3QsIHNpemVvZihidWYpLAorCQkJCQkJCSB3cnEtPnUuZGF0YS5sZW5ndGgpKSkgeworCQlsYnNfcHJfZGVidWcoMSwgIkNvcHkgZnJvbSB1c2VyIGZhaWxlZFxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWxic19wcl9kZWJ1ZygxLCAiU2NhbiBtb2RlIE9wdGlvbiA9ICVzXG4iLCBidWYpOworCisJYnVmW3NpemVvZihidWYpIC0gMV0gPSAnXDAnOworCisJZm9yIChpID0gMDsgaSA8IG1heF9vcHRpb25zOyBpKyspIHsKKwkJaWYgKCFzdHJjbXAoYnVmLCBvcHRpb25baV0pKQorCQkJYnJlYWs7CisJfQorCisJc3dpdGNoIChpKSB7CisKKwljYXNlIDA6CisJCWFkYXB0ZXItPnNjYW5tb2RlID0gY21kX2Jzc190eXBlX2JzczsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlhZGFwdGVyLT5zY2FubW9kZSA9IGNtZF9ic3NfdHlwZV9pYnNzOworCQlicmVhazsKKwljYXNlIDI6CisJCWFkYXB0ZXItPnNjYW5tb2RlID0gY21kX2Jzc190eXBlX2FueTsKKwkJYnJlYWs7CisJY2FzZSAzOgorCisJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHN0cmxlbihvcHRpb25bYWRhcHRlci0+c2Nhbm1vZGUgLSAxXSkgKyAxOworCisJCWxic19wcl9kZWJ1ZygxLCAiR2V0IFNjYW4gbW9kZSBPcHRpb24gPSAlc1xuIiwKKwkJICAgICAgIG9wdGlvblthZGFwdGVyLT5zY2FubW9kZSAtIDFdKTsKKworCQlsYnNfcHJfZGVidWcoMSwgIlNjYW4gbW9kZSBsZW5ndGggJWRcbiIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisKKwkJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLAorCQkJCSBvcHRpb25bYWRhcHRlci0+c2Nhbm1vZGUgLSAxXSwKKwkJCQkgd3JxLT51LmRhdGEubGVuZ3RoKSkgeworCQkJbGJzX3ByX2RlYnVnKDEsICJDb3B5IHRvIHVzZXIgZmFpbGVkXG4iKTsKKwkJCXJldCA9IC1FRkFVTFQ7CisJCX0KKwkJbGJzX3ByX2RlYnVnKDEsICJHRVQgU2NhbiB0eXBlIE9wdGlvbiBhZnRlciBjb3B5ID0gJXNcbiIsCisJCSAgICAgICAoY2hhciAqKXdycS0+dS5kYXRhLnBvaW50ZXIpOworCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJbGJzX3ByX2RlYnVnKDEsICJJbnZhbGlkIFNjYW4gbW9kZSBJb2N0bCBPcHRpb25cbiIpOworCQlyZXQgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisKKwlMRUFWRSgpOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogIEBicmllZiBHZXQvU2V0IEFkaG9jIEcgUmF0ZQorICoKKyAqICBAcGFyYW0gcHJpdgkJQSBwb2ludGVyIHRvIHdsYW5fcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqICBAcGFyYW0gd3JxCSAgIAlBIHBvaW50ZXIgdG8gdXNlciBkYXRhCisgKiAgQHJldHVybiAJICAgCTAtLXN1Y2Nlc3MsIG90aGVyd2lzZSBmYWlsCisgKi8KK3N0YXRpYyBpbnQgd2xhbl9kb19zZXRfZ3JhdGVfaW9jdGwod2xhbl9wcml2YXRlICogcHJpdiwgc3RydWN0IGl3cmVxICp3cnEpCit7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwlpbnQgZGF0YSwgZGF0YTE7CisJaW50ICp2YWw7CisKKwlFTlRFUigpOworCisJZGF0YTEgPSBTVUJDTURfREFUQSh3cnEpOworCXN3aXRjaCAoZGF0YTEpIHsKKwljYXNlIDA6CisJCWFkYXB0ZXItPmFkaG9jX2dyYXRlX2VuYWJsZWQgPSAwOworCQlicmVhazsKKwljYXNlIDE6CisJCWFkYXB0ZXItPmFkaG9jX2dyYXRlX2VuYWJsZWQgPSAxOworCQlicmVhazsKKwljYXNlIDI6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlkYXRhID0gYWRhcHRlci0+YWRob2NfZ3JhdGVfZW5hYmxlZDsKKwl2YWwgPSAoaW50ICopd3JxLT51Lm5hbWU7CisJKnZhbCA9IGRhdGE7CisJTEVBVkUoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgaGV4MmludChjaGFyIGMpCit7CisJaWYgKGMgPj0gJzAnICYmIGMgPD0gJzknKQorCQlyZXR1cm4gKGMgLSAnMCcpOworCWlmIChjID49ICdhJyAmJiBjIDw9ICdmJykKKwkJcmV0dXJuIChjIC0gJ2EnICsgMTApOworCWlmIChjID49ICdBJyAmJiBjIDw9ICdGJykKKwkJcmV0dXJuIChjIC0gJ0EnICsgMTApOworCXJldHVybiAtMTsKK30KKworLyogQ29udmVydCBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIE1BQyBhZGRyZXNzICgieHg6eHg6eHg6eHg6eHg6eHgiKQorICAgaW50byBiaW5hcnkgZm9ybWF0ICg2IGJ5dGVzKS4KKworICAgVGhpcyBmdW5jdGlvbiBleHBlY3RzIHRoYXQgZWFjaCBieXRlIGlzIHJlcHJlc2VudGVkIHdpdGggMiBjaGFyYWN0ZXJzCisgICAoZS5nLiwgMTE6MjoxMToxMToxMToxMSBpcyBpbnZhbGlkKQorCisgKi8KK3N0YXRpYyBjaGFyICpldGhfc3RyMmFkZHIoY2hhciAqZXRoc3RyLCB1OCAqIGFkZHIpCit7CisJaW50IGksIHZhbCwgdmFsMjsKKwljaGFyICpwb3MgPSBldGhzdHI7CisKKwkvKiBnZXQgcmlkIG9mIGluaXRpYWwgYmxhbmtzICovCisJd2hpbGUgKCpwb3MgPT0gJyAnIHx8ICpwb3MgPT0gJ1x0JykKKwkJKytwb3M7CisKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisJCXZhbCA9IGhleDJpbnQoKnBvcysrKTsKKwkJaWYgKHZhbCA8IDApCisJCQlyZXR1cm4gTlVMTDsKKwkJdmFsMiA9IGhleDJpbnQoKnBvcysrKTsKKwkJaWYgKHZhbDIgPCAwKQorCQkJcmV0dXJuIE5VTEw7CisJCWFkZHJbaV0gPSAodmFsICogMTYgKyB2YWwyKSAmIDB4ZmY7CisKKwkJaWYgKGkgPCA1ICYmICpwb3MrKyAhPSAnOicpCisJCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIHBvczsKK30KKworLyogdGhpcyB3cml0ZXMgeHg6eHg6eHg6eHg6eHg6eHggaW50byBldGhzdHIKKyAgIChldGhzdHIgbXVzdCBoYXZlIHNwYWNlIGZvciAxOCBjaGFycykgKi8KK3N0YXRpYyBpbnQgZXRoX2FkZHIyc3RyKHU4ICogYWRkciwgY2hhciAqZXRoc3RyKQoreworCWludCBpOworCWNoYXIgKnBvcyA9IGV0aHN0cjsKKworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKwkJc3ByaW50Zihwb3MsICIlMDJ4IiwgYWRkcltpXSAmIDB4ZmYpOworCQlwb3MgKz0gMjsKKwkJaWYgKGkgPCA1KQorCQkJKnBvcysrID0gJzonOworCX0KKwlyZXR1cm4gMTc7Cit9CisKKy8qKgorICogIEBicmllZiAgICAgICAgICBBZGQgYW4gZW50cnkgdG8gdGhlIEJUIHRhYmxlCisgKiAgQHBhcmFtIHByaXYgICAgIEEgcG9pbnRlciB0byB3bGFuX3ByaXZhdGUgc3RydWN0dXJlCisgKiAgQHBhcmFtIHJlcSAgICAgIEEgcG9pbnRlciB0byBpZnJlcSBzdHJ1Y3R1cmUKKyAqICBAcmV0dXJuICAgICAgICAgMCAtLXN1Y2Nlc3MsIG90aGVyd2lzZSBmYWlsCisgKi8KK3N0YXRpYyBpbnQgd2xhbl9idF9hZGRfaW9jdGwod2xhbl9wcml2YXRlICogcHJpdiwgc3RydWN0IGlmcmVxICpyZXEpCit7CisJc3RydWN0IGl3cmVxICp3cnEgPSAoc3RydWN0IGl3cmVxICopcmVxOworCWNoYXIgZXRoYWRkcnNfc3RyWzE4XTsKKwljaGFyICpwb3M7CisJdTggZXRoYWRkcltFVEhfQUxFTl07CisKKwlFTlRFUigpOworCWlmIChjb3B5X2Zyb21fdXNlcihldGhhZGRyc19zdHIsIHdycS0+dS5kYXRhLnBvaW50ZXIsCisJCQkgICBzaXplb2YoZXRoYWRkcnNfc3RyKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKChwb3MgPSBldGhfc3RyMmFkZHIoZXRoYWRkcnNfc3RyLCBldGhhZGRyKSkgPT0gTlVMTCkgeworCQlsYnNfcHJfaW5mbygiQlRfQUREOiBJbnZhbGlkIE1BQyBhZGRyZXNzXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbGJzX3ByX2RlYnVnKDEsICJCVDogYWRkaW5nICVzXG4iLCBldGhhZGRyc19zdHIpOworCUxFQVZFKCk7CisJcmV0dXJuIChsaWJlcnRhc19wcmVwYXJlX2FuZF9zZW5kX2NvbW1hbmQocHJpdiwgY21kX2J0X2FjY2VzcywKKwkJCQkgICAgICBjbWRfYWN0X2J0X2FjY2Vzc19hZGQsCisJCQkJICAgICAgY21kX29wdGlvbl93YWl0Zm9ycnNwLCAwLCBldGhhZGRyKSk7Cit9CisKKy8qKgorICogIEBicmllZiAgICAgICAgICBEZWxldGUgYW4gZW50cnkgZnJvbSB0aGUgQlQgdGFibGUKKyAqICBAcGFyYW0gcHJpdiAgICAgQSBwb2ludGVyIHRvIHdsYW5fcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqICBAcGFyYW0gcmVxICAgICAgQSBwb2ludGVyIHRvIGlmcmVxIHN0cnVjdHVyZQorICogIEByZXR1cm4gICAgICAgICAwIC0tc3VjY2Vzcywgb3RoZXJ3aXNlIGZhaWwKKyAqLworc3RhdGljIGludCB3bGFuX2J0X2RlbF9pb2N0bCh3bGFuX3ByaXZhdGUgKiBwcml2LCBzdHJ1Y3QgaWZyZXEgKnJlcSkKK3sKKwlzdHJ1Y3QgaXdyZXEgKndycSA9IChzdHJ1Y3QgaXdyZXEgKilyZXE7CisJY2hhciBldGhhZGRyc19zdHJbMThdOworCXU4IGV0aGFkZHJbRVRIX0FMRU5dOworCWNoYXIgKnBvczsKKworCUVOVEVSKCk7CisJaWYgKGNvcHlfZnJvbV91c2VyKGV0aGFkZHJzX3N0ciwgd3JxLT51LmRhdGEucG9pbnRlciwKKwkJCSAgIHNpemVvZihldGhhZGRyc19zdHIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoKHBvcyA9IGV0aF9zdHIyYWRkcihldGhhZGRyc19zdHIsIGV0aGFkZHIpKSA9PSBOVUxMKSB7CisJCWxic19wcl9pbmZvKCJJbnZhbGlkIE1BQyBhZGRyZXNzXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbGJzX3ByX2RlYnVnKDEsICJCVDogZGVsZXRpbmcgJXNcbiIsIGV0aGFkZHJzX3N0cik7CisKKwlyZXR1cm4gKGxpYmVydGFzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZChwcml2LAorCQkJCSAgICAgIGNtZF9idF9hY2Nlc3MsCisJCQkJICAgICAgY21kX2FjdF9idF9hY2Nlc3NfZGVsLAorCQkJCSAgICAgIGNtZF9vcHRpb25fd2FpdGZvcnJzcCwgMCwgZXRoYWRkcikpOworCUxFQVZFKCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogIEBicmllZiAgICAgICAgICBSZXNldCBhbGwgZW50cmllcyBmcm9tIHRoZSBCVCB0YWJsZQorICogIEBwYXJhbSBwcml2ICAgICBBIHBvaW50ZXIgdG8gd2xhbl9wcml2YXRlIHN0cnVjdHVyZQorICogIEByZXR1cm4gICAgICAgICAwIC0tc3VjY2Vzcywgb3RoZXJ3aXNlIGZhaWwKKyAqLworc3RhdGljIGludCB3bGFuX2J0X3Jlc2V0X2lvY3RsKHdsYW5fcHJpdmF0ZSAqIHByaXYpCit7CisJRU5URVIoKTsKKworCWxic19wcl9hbGVydCggIkJUOiByZXNldHRpbmdcbiIpOworCisJcmV0dXJuIChsaWJlcnRhc19wcmVwYXJlX2FuZF9zZW5kX2NvbW1hbmQocHJpdiwKKwkJCQkgICAgICBjbWRfYnRfYWNjZXNzLAorCQkJCSAgICAgIGNtZF9hY3RfYnRfYWNjZXNzX3Jlc2V0LAorCQkJCSAgICAgIGNtZF9vcHRpb25fd2FpdGZvcnJzcCwgMCwgTlVMTCkpOworCisJTEVBVkUoKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiAgQGJyaWVmICAgICAgICAgIExpc3QgYW4gZW50cnkgZnJvbSB0aGUgQlQgdGFibGUKKyAqICBAcGFyYW0gcHJpdiAgICAgQSBwb2ludGVyIHRvIHdsYW5fcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqICBAcGFyYW0gcmVxICAgICAgQSBwb2ludGVyIHRvIGlmcmVxIHN0cnVjdHVyZQorICogIEByZXR1cm4gICAgICAgICAwIC0tc3VjY2Vzcywgb3RoZXJ3aXNlIGZhaWwKKyAqLworc3RhdGljIGludCB3bGFuX2J0X2xpc3RfaW9jdGwod2xhbl9wcml2YXRlICogcHJpdiwgc3RydWN0IGlmcmVxICpyZXEpCit7CisJaW50IHBvczsKKwljaGFyICphZGRyMTsKKwlzdHJ1Y3QgaXdyZXEgKndycSA9IChzdHJ1Y3QgaXdyZXEgKilyZXE7CisJLyogdXNlZCB0byBwYXNzIGlkIGFuZCBzdG9yZSB0aGUgYnQgZW50cnkgcmV0dXJuZWQgYnkgdGhlIEZXICovCisJdW5pb24geworCQlpbnQgaWQ7CisJCWNoYXIgYWRkcjFhZGRyMlsyICogRVRIX0FMRU5dOworCX0gcGFyYW07CisJc3RhdGljIGNoYXIgb3V0c3RyWzY0XTsKKwljaGFyICpwYnVmID0gb3V0c3RyOworCWludCByZXQ7CisKKwlFTlRFUigpOworCisJaWYgKGNvcHlfZnJvbV91c2VyKG91dHN0ciwgd3JxLT51LmRhdGEucG9pbnRlciwgc2l6ZW9mKG91dHN0cikpKSB7CisJCWxic19wcl9kZWJ1ZygxLCAiQ29weSBmcm9tIHVzZXIgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlwYXJhbS5pZCA9IHNpbXBsZV9zdHJ0b3VsKG91dHN0ciwgTlVMTCwgMTApOworCXBvcyA9IHNwcmludGYocGJ1ZiwgIiVkOiAiLCBwYXJhbS5pZCk7CisJcGJ1ZiArPSBwb3M7CisKKwlyZXQgPSBsaWJlcnRhc19wcmVwYXJlX2FuZF9zZW5kX2NvbW1hbmQocHJpdiwgY21kX2J0X2FjY2VzcywKKwkJCQkgICAgY21kX2FjdF9idF9hY2Nlc3NfbGlzdCwKKwkJCQkgICAgY21kX29wdGlvbl93YWl0Zm9ycnNwLCAwLAorCQkJCSAgICAoY2hhciAqKSZwYXJhbSk7CisKKwlpZiAocmV0ID09IDApIHsKKwkJYWRkcjEgPSBwYXJhbS5hZGRyMWFkZHIyOworCisJCXBvcyA9IHNwcmludGYocGJ1ZiwgImlnbm9yaW5nIHRyYWZmaWMgZnJvbSAiKTsKKwkJcGJ1ZiArPSBwb3M7CisJCXBvcyA9IGV0aF9hZGRyMnN0cihhZGRyMSwgcGJ1Zik7CisJCXBidWYgKz0gcG9zOworCX0gZWxzZSB7CisJCXNwcmludGYocGJ1ZiwgIihudWxsKSIpOworCQlwYnVmICs9IHBvczsKKwl9CisKKwl3cnEtPnUuZGF0YS5sZW5ndGggPSBzdHJsZW4ob3V0c3RyKTsKKwlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIChjaGFyICopb3V0c3RyLAorCQkJIHdycS0+dS5kYXRhLmxlbmd0aCkpIHsKKwkJbGJzX3ByX2RlYnVnKDEsICJCVF9MSVNUOiBDb3B5IHRvIHVzZXIgZmFpbGVkIVxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCUxFQVZFKCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogIEBicmllZiAgICAgICAgICBGaW5kIHRoZSBuZXh0IHBhcmFtZXRlciBpbiBhbiBpbnB1dCBzdHJpbmcKKyAqICBAcGFyYW0gcHRyICAgICAgQSBwb2ludGVyIHRvIHRoZSBpbnB1dCBwYXJhbWV0ZXIgc3RyaW5nCisgKiAgQHJldHVybiAgICAgICAgIEEgcG9pbnRlciB0byB0aGUgbmV4dCBwYXJhbWV0ZXIsIG9yIDAgaWYgbm8gcGFyYW1ldGVycyBsZWZ0LgorICovCitzdGF0aWMgY2hhciAqIG5leHRfcGFyYW0oY2hhciAqIHB0cikKK3sKKwlpZiAoIXB0cikgcmV0dXJuIE5VTEw7CisJd2hpbGUgKCpwdHIgPT0gJyAnIHx8ICpwdHIgPT0gJ1x0JykgKytwdHI7CisJcmV0dXJuICgqcHRyID09ICdcMCcpID8gTlVMTCA6IHB0cjsKK30KKworLyoqCisgKiAgQGJyaWVmICAgICAgICAgIEFkZCBhbiBlbnRyeSB0byB0aGUgRldUIHRhYmxlCisgKiAgQHBhcmFtIHByaXYgICAgIEEgcG9pbnRlciB0byB3bGFuX3ByaXZhdGUgc3RydWN0dXJlCisgKiAgQHBhcmFtIHJlcSAgICAgIEEgcG9pbnRlciB0byBpZnJlcSBzdHJ1Y3R1cmUKKyAqICBAcmV0dXJuICAgICAgICAgMCAtLXN1Y2Nlc3MsIG90aGVyd2lzZSBmYWlsCisgKi8KK3N0YXRpYyBpbnQgd2xhbl9md3RfYWRkX2lvY3RsKHdsYW5fcHJpdmF0ZSAqIHByaXYsIHN0cnVjdCBpZnJlcSAqcmVxKQoreworCXN0cnVjdCBpd3JlcSAqd3JxID0gKHN0cnVjdCBpd3JlcSAqKXJlcTsKKwljaGFyIGluX3N0clsxMjhdOworCXN0YXRpYyBzdHJ1Y3QgY21kX2RzX2Z3dF9hY2Nlc3MgZnd0X2FjY2VzczsKKwljaGFyICpwdHI7CisKKwlFTlRFUigpOworCWlmIChjb3B5X2Zyb21fdXNlcihpbl9zdHIsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHNpemVvZihpbl9zdHIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoKHB0ciA9IGV0aF9zdHIyYWRkcihpbl9zdHIsIGZ3dF9hY2Nlc3MuZGEpKSA9PSBOVUxMKSB7CisJCWxic19wcl9hbGVydCggIkZXVF9BREQ6IEludmFsaWQgTUFDIGFkZHJlc3MgMVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICgocHRyID0gZXRoX3N0cjJhZGRyKHB0ciwgZnd0X2FjY2Vzcy5yYSkpID09IE5VTEwpIHsKKwkJbGJzX3ByX2FsZXJ0KCAiRldUX0FERDogSW52YWxpZCBNQUMgYWRkcmVzcyAyXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKChwdHIgPSBuZXh0X3BhcmFtKHB0cikpKQorCQlmd3RfYWNjZXNzLm1ldHJpYyA9CisJCQljcHVfdG9fbGUzMihzaW1wbGVfc3RydG91bChwdHIsICZwdHIsIDEwKSk7CisJZWxzZQorCQlmd3RfYWNjZXNzLm1ldHJpYyA9IEZXVF9ERUZBVUxUX01FVFJJQzsKKworCWlmICgocHRyID0gbmV4dF9wYXJhbShwdHIpKSkKKwkJZnd0X2FjY2Vzcy5kaXIgPSAodTgpc2ltcGxlX3N0cnRvdWwocHRyLCAmcHRyLCAxMCk7CisJZWxzZQorCQlmd3RfYWNjZXNzLmRpciA9IEZXVF9ERUZBVUxUX0RJUjsKKworCWlmICgocHRyID0gbmV4dF9wYXJhbShwdHIpKSkKKwkJZnd0X2FjY2Vzcy5zc24gPQorCQkJY3B1X3RvX2xlMzIoc2ltcGxlX3N0cnRvdWwocHRyLCAmcHRyLCAxMCkpOworCWVsc2UKKwkJZnd0X2FjY2Vzcy5zc24gPSBGV1RfREVGQVVMVF9TU047CisKKwlpZiAoKHB0ciA9IG5leHRfcGFyYW0ocHRyKSkpCisJCWZ3dF9hY2Nlc3MuZHNuID0KKwkJCWNwdV90b19sZTMyKHNpbXBsZV9zdHJ0b3VsKHB0ciwgJnB0ciwgMTApKTsKKwllbHNlCisJCWZ3dF9hY2Nlc3MuZHNuID0gRldUX0RFRkFVTFRfRFNOOworCisJaWYgKChwdHIgPSBuZXh0X3BhcmFtKHB0cikpKQorCQlmd3RfYWNjZXNzLmhvcGNvdW50ID0gc2ltcGxlX3N0cnRvdWwocHRyLCAmcHRyLCAxMCk7CisJZWxzZQorCQlmd3RfYWNjZXNzLmhvcGNvdW50ID0gRldUX0RFRkFVTFRfSE9QQ09VTlQ7CisKKwlpZiAoKHB0ciA9IG5leHRfcGFyYW0ocHRyKSkpCisJCWZ3dF9hY2Nlc3MudHRsID0gc2ltcGxlX3N0cnRvdWwocHRyLCAmcHRyLCAxMCk7CisJZWxzZQorCQlmd3RfYWNjZXNzLnR0bCA9IEZXVF9ERUZBVUxUX1RUTDsKKworCWlmICgocHRyID0gbmV4dF9wYXJhbShwdHIpKSkKKwkJZnd0X2FjY2Vzcy5leHBpcmF0aW9uID0KKwkJCWNwdV90b19sZTMyKHNpbXBsZV9zdHJ0b3VsKHB0ciwgJnB0ciwgMTApKTsKKwllbHNlCisJCWZ3dF9hY2Nlc3MuZXhwaXJhdGlvbiA9IEZXVF9ERUZBVUxUX0VYUElSQVRJT047CisKKwlpZiAoKHB0ciA9IG5leHRfcGFyYW0ocHRyKSkpCisJCWZ3dF9hY2Nlc3Muc2xlZXBtb2RlID0gKHU4KXNpbXBsZV9zdHJ0b3VsKHB0ciwgJnB0ciwgMTApOworCWVsc2UKKwkJZnd0X2FjY2Vzcy5zbGVlcG1vZGUgPSBGV1RfREVGQVVMVF9TTEVFUE1PREU7CisKKwlpZiAoKHB0ciA9IG5leHRfcGFyYW0ocHRyKSkpCisJCWZ3dF9hY2Nlc3Muc25yID0KKwkJCWNwdV90b19sZTMyKHNpbXBsZV9zdHJ0b3VsKHB0ciwgJnB0ciwgMTApKTsKKwllbHNlCisJCWZ3dF9hY2Nlc3Muc25yID0gRldUX0RFRkFVTFRfU05SOworCisjaWZkZWYgREVCVUcKKwl7CisJCWNoYXIgZXRoYWRkcjFfc3RyWzE4XSwgZXRoYWRkcjJfc3RyWzE4XTsKKwkJZXRoX2FkZHIyc3RyKGZ3dF9hY2Nlc3MuZGEsIGV0aGFkZHIxX3N0cik7CisJCWV0aF9hZGRyMnN0cihmd3RfYWNjZXNzLnJhLCBldGhhZGRyMl9zdHIpOworCQlsYnNfcHJfZGVidWcoMSwgIkZXVF9BREQ6IGFkZGluZyAoZGE6JXMsJWkscmE6JXMpXG4iLCBldGhhZGRyMV9zdHIsCisJCSAgICAgICBmd3RfYWNjZXNzLmRpciwgZXRoYWRkcjJfc3RyKTsKKwkJbGJzX3ByX2RlYnVnKDEsICJGV1RfQUREOiBzc246JXUgZHNuOiV1IG1ldDoldSBob3A6JXUgdHRsOiV1IGV4cDoldSBzbHA6JXUgc25yOiV1XG4iLAorCQkgICAgICAgZnd0X2FjY2Vzcy5zc24sIGZ3dF9hY2Nlc3MuZHNuLCBmd3RfYWNjZXNzLm1ldHJpYywKKwkJICAgICAgIGZ3dF9hY2Nlc3MuaG9wY291bnQsIGZ3dF9hY2Nlc3MudHRsLCBmd3RfYWNjZXNzLmV4cGlyYXRpb24sCisJCSAgICAgICBmd3RfYWNjZXNzLnNsZWVwbW9kZSwgZnd0X2FjY2Vzcy5zbnIpOworCX0KKyNlbmRpZgorCisJTEVBVkUoKTsKKwlyZXR1cm4gKGxpYmVydGFzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZChwcml2LCBjbWRfZnd0X2FjY2VzcywKKwkJCQkJCSAgY21kX2FjdF9md3RfYWNjZXNzX2FkZCwKKwkJCQkJCSAgY21kX29wdGlvbl93YWl0Zm9ycnNwLCAwLAorCQkJCQkJICAodm9pZCAqKSZmd3RfYWNjZXNzKSk7Cit9CisKKy8qKgorICogIEBicmllZiAgICAgICAgICBEZWxldGUgYW4gZW50cnkgZnJvbSB0aGUgRldUIHRhYmxlCisgKiAgQHBhcmFtIHByaXYgICAgIEEgcG9pbnRlciB0byB3bGFuX3ByaXZhdGUgc3RydWN0dXJlCisgKiAgQHBhcmFtIHJlcSAgICAgIEEgcG9pbnRlciB0byBpZnJlcSBzdHJ1Y3R1cmUKKyAqICBAcmV0dXJuICAgICAgICAgMCAtLXN1Y2Nlc3MsIG90aGVyd2lzZSBmYWlsCisgKi8KK3N0YXRpYyBpbnQgd2xhbl9md3RfZGVsX2lvY3RsKHdsYW5fcHJpdmF0ZSAqIHByaXYsIHN0cnVjdCBpZnJlcSAqcmVxKQoreworCXN0cnVjdCBpd3JlcSAqd3JxID0gKHN0cnVjdCBpd3JlcSAqKXJlcTsKKwljaGFyIGluX3N0cls2NF07CisJc3RhdGljIHN0cnVjdCBjbWRfZHNfZnd0X2FjY2VzcyBmd3RfYWNjZXNzOworCWNoYXIgKnB0cjsKKworCUVOVEVSKCk7CisJaWYgKGNvcHlfZnJvbV91c2VyKGluX3N0ciwgd3JxLT51LmRhdGEucG9pbnRlciwgc2l6ZW9mKGluX3N0cikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmICgocHRyID0gZXRoX3N0cjJhZGRyKGluX3N0ciwgZnd0X2FjY2Vzcy5kYSkpID09IE5VTEwpIHsKKwkJbGJzX3ByX2FsZXJ0KCAiRldUX0RFTDogSW52YWxpZCBNQUMgYWRkcmVzcyAxXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKChwdHIgPSBldGhfc3RyMmFkZHIocHRyLCBmd3RfYWNjZXNzLnJhKSkgPT0gTlVMTCkgeworCQlsYnNfcHJfYWxlcnQoICJGV1RfREVMOiBJbnZhbGlkIE1BQyBhZGRyZXNzIDJcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoKHB0ciA9IG5leHRfcGFyYW0ocHRyKSkpCisJCWZ3dF9hY2Nlc3MuZGlyID0gKHU4KXNpbXBsZV9zdHJ0b3VsKHB0ciwgJnB0ciwgMTApOworCWVsc2UKKwkJZnd0X2FjY2Vzcy5kaXIgPSBGV1RfREVGQVVMVF9ESVI7CisKKyNpZmRlZiBERUJVRworCXsKKwkJY2hhciBldGhhZGRyMV9zdHJbMThdLCBldGhhZGRyMl9zdHJbMThdOworCQlsYnNfcHJfZGVidWcoMSwgIkZXVF9ERUw6IGxpbmUgaXMgJXNcbiIsIGluX3N0cik7CisJCWV0aF9hZGRyMnN0cihmd3RfYWNjZXNzLmRhLCBldGhhZGRyMV9zdHIpOworCQlldGhfYWRkcjJzdHIoZnd0X2FjY2Vzcy5yYSwgZXRoYWRkcjJfc3RyKTsKKwkJbGJzX3ByX2RlYnVnKDEsICJGV1RfREVMOiByZW1vdmluZyAoZGE6JXMscmE6JXMsZGlyOiVkKVxuIiwgZXRoYWRkcjFfc3RyLAorCQkgICAgICAgZXRoYWRkcjJfc3RyLCBmd3RfYWNjZXNzLmRpcik7CisJfQorI2VuZGlmCisKKwlMRUFWRSgpOworCXJldHVybiAobGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsCisJCQkJCQkgIGNtZF9md3RfYWNjZXNzLAorCQkJCQkJICBjbWRfYWN0X2Z3dF9hY2Nlc3NfZGVsLAorCQkJCQkJICBjbWRfb3B0aW9uX3dhaXRmb3Jyc3AsIDAsCisJCQkJCQkgICh2b2lkICopJmZ3dF9hY2Nlc3MpKTsKK30KKworCisvKioKKyAqICBAYnJpZWYgICAgICAgICAgICAgUHJpbnQgcm91dGUgcGFyYW1ldGVycworICogIEBwYXJhbSBmd3RfYWNjZXNzICBzdHJ1Y3QgY21kX2RzX2Z3dF9hY2Nlc3Mgd2l0aCByb3V0ZSBpbmZvCisgKiAgQHBhcmFtIGJ1ZiAgICAgICAgIGRlc3RpbmF0aW9uIGJ1ZmZlciBmb3Igcm91dGUgaW5mbworICovCitzdGF0aWMgdm9pZCBwcmludF9yb3V0ZShzdHJ1Y3QgY21kX2RzX2Z3dF9hY2Nlc3MgZnd0X2FjY2VzcywgY2hhciAqYnVmKQoreworCWJ1ZiArPSBzcHJpbnRmKGJ1ZiwgIiAiKTsKKwlidWYgKz0gZXRoX2FkZHIyc3RyKGZ3dF9hY2Nlc3MuZGEsIGJ1Zik7CisJYnVmICs9IHNwcmludGYoYnVmLCAiICIpOworCWJ1ZiArPSBldGhfYWRkcjJzdHIoZnd0X2FjY2Vzcy5yYSwgYnVmKTsKKwlidWYgKz0gc3ByaW50ZihidWYsICIgJXUiLCBsZTMyX3RvX2NwdShmd3RfYWNjZXNzLm1ldHJpYykpOworCWJ1ZiArPSBzcHJpbnRmKGJ1ZiwgIiAldSIsIGZ3dF9hY2Nlc3MuZGlyKTsKKwlidWYgKz0gc3ByaW50ZihidWYsICIgJXUiLCBsZTMyX3RvX2NwdShmd3RfYWNjZXNzLnNzbikpOworCWJ1ZiArPSBzcHJpbnRmKGJ1ZiwgIiAldSIsIGxlMzJfdG9fY3B1KGZ3dF9hY2Nlc3MuZHNuKSk7CisJYnVmICs9IHNwcmludGYoYnVmLCAiICV1IiwgZnd0X2FjY2Vzcy5ob3Bjb3VudCk7CisJYnVmICs9IHNwcmludGYoYnVmLCAiICV1IiwgZnd0X2FjY2Vzcy50dGwpOworCWJ1ZiArPSBzcHJpbnRmKGJ1ZiwgIiAldSIsIGxlMzJfdG9fY3B1KGZ3dF9hY2Nlc3MuZXhwaXJhdGlvbikpOworCWJ1ZiArPSBzcHJpbnRmKGJ1ZiwgIiAldSIsIGZ3dF9hY2Nlc3Muc2xlZXBtb2RlKTsKKwlidWYgKz0gc3ByaW50ZihidWYsICIgJXUiLCBsZTMyX3RvX2NwdShmd3RfYWNjZXNzLnNucikpOworfQorCisvKioKKyAqICBAYnJpZWYgICAgICAgICAgTG9va3VwIGFuIGVudHJ5IGluIHRoZSBGV1QgdGFibGUKKyAqICBAcGFyYW0gcHJpdiAgICAgQSBwb2ludGVyIHRvIHdsYW5fcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqICBAcGFyYW0gcmVxICAgICAgQSBwb2ludGVyIHRvIGlmcmVxIHN0cnVjdHVyZQorICogIEByZXR1cm4gICAgICAgICAwIC0tc3VjY2Vzcywgb3RoZXJ3aXNlIGZhaWwKKyAqLworc3RhdGljIGludCB3bGFuX2Z3dF9sb29rdXBfaW9jdGwod2xhbl9wcml2YXRlICogcHJpdiwgc3RydWN0IGlmcmVxICpyZXEpCit7CisJc3RydWN0IGl3cmVxICp3cnEgPSAoc3RydWN0IGl3cmVxICopcmVxOworCWNoYXIgaW5fc3RyWzY0XTsKKwljaGFyICpwdHI7CisJc3RhdGljIHN0cnVjdCBjbWRfZHNfZnd0X2FjY2VzcyBmd3RfYWNjZXNzOworCXN0YXRpYyBjaGFyIG91dF9zdHJbMTI4XTsKKwlpbnQgcmV0OworCisJRU5URVIoKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoaW5fc3RyLCB3cnEtPnUuZGF0YS5wb2ludGVyLCBzaXplb2YoaW5fc3RyKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKChwdHIgPSBldGhfc3RyMmFkZHIoaW5fc3RyLCBmd3RfYWNjZXNzLmRhKSkgPT0gTlVMTCkgeworCQlsYnNfcHJfYWxlcnQoICJGV1RfTE9PS1VQOiBJbnZhbGlkIE1BQyBhZGRyZXNzXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisjaWZkZWYgREVCVUcKKwl7CisJCWNoYXIgZXRoYWRkcjFfc3RyWzE4XTsKKwkJbGJzX3ByX2RlYnVnKDEsICJGV1RfTE9PS1VQOiBsaW5lIGlzICVzXG4iLCBpbl9zdHIpOworCQlldGhfYWRkcjJzdHIoZnd0X2FjY2Vzcy5kYSwgZXRoYWRkcjFfc3RyKTsKKwkJbGJzX3ByX2RlYnVnKDEsICJGV1RfTE9PS1VQOiBsb29raW5nIGZvciAoZGE6JXMpXG4iLCBldGhhZGRyMV9zdHIpOworCX0KKyNlbmRpZgorCisJcmV0ID0gbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsCisJCQkJCQljbWRfZnd0X2FjY2VzcywKKwkJCQkJCWNtZF9hY3RfZnd0X2FjY2Vzc19sb29rdXAsCisJCQkJCQljbWRfb3B0aW9uX3dhaXRmb3Jyc3AsIDAsCisJCQkJCQkodm9pZCAqKSZmd3RfYWNjZXNzKTsKKworCWlmIChyZXQgPT0gMCkKKwkJcHJpbnRfcm91dGUoZnd0X2FjY2Vzcywgb3V0X3N0cik7CisJZWxzZQorCQlzcHJpbnRmKG91dF9zdHIsICIobnVsbCkiKTsKKworCXdycS0+dS5kYXRhLmxlbmd0aCA9IHN0cmxlbihvdXRfc3RyKTsKKwlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIChjaGFyICopb3V0X3N0ciwKKwkJCSB3cnEtPnUuZGF0YS5sZW5ndGgpKSB7CisJCWxic19wcl9kZWJ1ZygxLCAiRldUX0xPT0tVUDogQ29weSB0byB1c2VyIGZhaWxlZCFcbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlMRUFWRSgpOworCXJldHVybiAwOworfQorCisvKioKKyAqICBAYnJpZWYgICAgICAgICAgUmVzZXQgYWxsIGVudHJpZXMgZnJvbSB0aGUgRldUIHRhYmxlCisgKiAgQHBhcmFtIHByaXYgICAgIEEgcG9pbnRlciB0byB3bGFuX3ByaXZhdGUgc3RydWN0dXJlCisgKiAgQHJldHVybiAgICAgICAgIDAgLS1zdWNjZXNzLCBvdGhlcndpc2UgZmFpbAorICovCitzdGF0aWMgaW50IHdsYW5fZnd0X3Jlc2V0X2lvY3RsKHdsYW5fcHJpdmF0ZSAqIHByaXYpCit7CisJbGJzX3ByX2RlYnVnKDEsICJGV1Q6IHJlc2V0dGluZ1xuIik7CisKKwlyZXR1cm4gKGxpYmVydGFzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZChwcml2LAorCQkJCSAgICAgIGNtZF9md3RfYWNjZXNzLAorCQkJCSAgICAgIGNtZF9hY3RfZnd0X2FjY2Vzc19yZXNldCwKKwkJCQkgICAgICBjbWRfb3B0aW9uX3dhaXRmb3Jyc3AsIDAsIE5VTEwpKTsKK30KKworLyoqCisgKiAgQGJyaWVmICAgICAgICAgIExpc3QgYW4gZW50cnkgZnJvbSB0aGUgRldUIHRhYmxlCisgKiAgQHBhcmFtIHByaXYgICAgIEEgcG9pbnRlciB0byB3bGFuX3ByaXZhdGUgc3RydWN0dXJlCisgKiAgQHBhcmFtIHJlcSAgICAgIEEgcG9pbnRlciB0byBpZnJlcSBzdHJ1Y3R1cmUKKyAqICBAcmV0dXJuICAgICAgICAgMCAtLXN1Y2Nlc3MsIG90aGVyd2lzZSBmYWlsCisgKi8KK3N0YXRpYyBpbnQgd2xhbl9md3RfbGlzdF9pb2N0bCh3bGFuX3ByaXZhdGUgKiBwcml2LCBzdHJ1Y3QgaWZyZXEgKnJlcSkKK3sKKwlzdHJ1Y3QgaXdyZXEgKndycSA9IChzdHJ1Y3QgaXdyZXEgKilyZXE7CisJY2hhciBpbl9zdHJbOF07CisJc3RhdGljIHN0cnVjdCBjbWRfZHNfZnd0X2FjY2VzcyBmd3RfYWNjZXNzOworCWNoYXIgKnB0ciA9IGluX3N0cjsKKwlzdGF0aWMgY2hhciBvdXRfc3RyWzEyOF07CisJY2hhciAqcGJ1ZiA9IG91dF9zdHI7CisJaW50IHJldDsKKworCUVOVEVSKCk7CisJaWYgKGNvcHlfZnJvbV91c2VyKGluX3N0ciwgd3JxLT51LmRhdGEucG9pbnRlciwgc2l6ZW9mKGluX3N0cikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWZ3dF9hY2Nlc3MuaWQgPSBjcHVfdG9fbGUzMihzaW1wbGVfc3RydG91bChwdHIsICZwdHIsIDEwKSk7CisKKyNpZmRlZiBERUJVRworCXsKKwkJbGJzX3ByX2RlYnVnKDEsICJGV1RfTElTVDogbGluZSBpcyAlc1xuIiwgaW5fc3RyKTsKKwkJbGJzX3ByX2RlYnVnKDEsICJGV1RfTElTVDogbGlzdGluZyBpZDolaVxuIiwgbGUzMl90b19jcHUoZnd0X2FjY2Vzcy5pZCkpOworCX0KKyNlbmRpZgorCisJcmV0ID0gbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsIGNtZF9md3RfYWNjZXNzLAorCQkJCSAgICBjbWRfYWN0X2Z3dF9hY2Nlc3NfbGlzdCwKKwkJCQkgICAgY21kX29wdGlvbl93YWl0Zm9ycnNwLCAwLCAodm9pZCAqKSZmd3RfYWNjZXNzKTsKKworCWlmIChyZXQgPT0gMCkKKwkJcHJpbnRfcm91dGUoZnd0X2FjY2VzcywgcGJ1Zik7CisJZWxzZQorCQlwYnVmICs9IHNwcmludGYocGJ1ZiwgIiAobnVsbCkiKTsKKworCXdycS0+dS5kYXRhLmxlbmd0aCA9IHN0cmxlbihvdXRfc3RyKTsKKwlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIChjaGFyICopb3V0X3N0ciwKKwkJCSB3cnEtPnUuZGF0YS5sZW5ndGgpKSB7CisJCWxic19wcl9kZWJ1ZygxLCAiRldUX0xJU1Q6IENvcHkgdG8gdXNlciBmYWlsZWQhXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJTEVBVkUoKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiAgQGJyaWVmICAgICAgICAgIExpc3QgYW4gZW50cnkgZnJvbSB0aGUgRlJUIHRhYmxlCisgKiAgQHBhcmFtIHByaXYgICAgIEEgcG9pbnRlciB0byB3bGFuX3ByaXZhdGUgc3RydWN0dXJlCisgKiAgQHBhcmFtIHJlcSAgICAgIEEgcG9pbnRlciB0byBpZnJlcSBzdHJ1Y3R1cmUKKyAqICBAcmV0dXJuICAgICAgICAgMCAtLXN1Y2Nlc3MsIG90aGVyd2lzZSBmYWlsCisgKi8KK3N0YXRpYyBpbnQgd2xhbl9md3RfbGlzdF9yb3V0ZV9pb2N0bCh3bGFuX3ByaXZhdGUgKiBwcml2LCBzdHJ1Y3QgaWZyZXEgKnJlcSkKK3sKKwlzdHJ1Y3QgaXdyZXEgKndycSA9IChzdHJ1Y3QgaXdyZXEgKilyZXE7CisJY2hhciBpbl9zdHJbNjRdOworCXN0YXRpYyBzdHJ1Y3QgY21kX2RzX2Z3dF9hY2Nlc3MgZnd0X2FjY2VzczsKKwljaGFyICpwdHIgPSBpbl9zdHI7CisJc3RhdGljIGNoYXIgb3V0X3N0clsxMjhdOworCWNoYXIgKnBidWYgPSBvdXRfc3RyOworCWludCByZXQ7CisKKwlFTlRFUigpOworCWlmIChjb3B5X2Zyb21fdXNlcihpbl9zdHIsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHNpemVvZihpbl9zdHIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlmd3RfYWNjZXNzLmlkID0gY3B1X3RvX2xlMzIoc2ltcGxlX3N0cnRvdWwocHRyLCAmcHRyLCAxMCkpOworCisjaWZkZWYgREVCVUcKKwl7CisJCWxic19wcl9kZWJ1ZygxLCAiRldUX0xJU1RfUk9VVEU6IGxpbmUgaXMgJXNcbiIsIGluX3N0cik7CisJCWxic19wcl9kZWJ1ZygxLCAiRldUX0xJU1RfUk9VVEU6IGxpc3RpbmcgaWQ6JWlcbiIsIGxlMzJfdG9fY3B1KGZ3dF9hY2Nlc3MuaWQpKTsKKwl9CisjZW5kaWYKKworCXJldCA9IGxpYmVydGFzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZChwcml2LCBjbWRfZnd0X2FjY2VzcywKKwkJCQkgICAgY21kX2FjdF9md3RfYWNjZXNzX2xpc3Rfcm91dGUsCisJCQkJICAgIGNtZF9vcHRpb25fd2FpdGZvcnJzcCwgMCwgKHZvaWQgKikmZnd0X2FjY2Vzcyk7CisKKwlpZiAocmV0ID09IDApIHsKKwkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICIgIik7CisJCXBidWYgKz0gZXRoX2FkZHIyc3RyKGZ3dF9hY2Nlc3MuZGEsIHBidWYpOworCQlwYnVmICs9IHNwcmludGYocGJ1ZiwgIiAldSIsIGxlMzJfdG9fY3B1KGZ3dF9hY2Nlc3MubWV0cmljKSk7CisJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAiICV1IiwgZnd0X2FjY2Vzcy5kaXIpOworCQkvKiBub3RlIHRoYXQgdGhlIGZpcm13YXJlIHJldHVybnMgdGhlIG5pZCBpbiB0aGUgaWQgZmllbGQgKi8KKwkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICIgJXUiLCBsZTMyX3RvX2NwdShmd3RfYWNjZXNzLmlkKSk7CisJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAiICV1IiwgbGUzMl90b19jcHUoZnd0X2FjY2Vzcy5zc24pKTsKKwkJcGJ1ZiArPSBzcHJpbnRmKHBidWYsICIgJXUiLCBsZTMyX3RvX2NwdShmd3RfYWNjZXNzLmRzbikpOworCQlwYnVmICs9IHNwcmludGYocGJ1ZiwgIiAgaG9wICV1IiwgZnd0X2FjY2Vzcy5ob3Bjb3VudCk7CisJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAiICB0dGwgJXUiLCBmd3RfYWNjZXNzLnR0bCk7CisJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAiICV1IiwgbGUzMl90b19jcHUoZnd0X2FjY2Vzcy5leHBpcmF0aW9uKSk7CisJfSBlbHNlCisJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAiIChudWxsKSIpOworCisJd3JxLT51LmRhdGEubGVuZ3RoID0gc3RybGVuKG91dF9zdHIpOworCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgKGNoYXIgKilvdXRfc3RyLAorCQkJIHdycS0+dS5kYXRhLmxlbmd0aCkpIHsKKwkJbGJzX3ByX2RlYnVnKDEsICJGV1RfTElTVF9ST1VURTogQ29weSB0byB1c2VyIGZhaWxlZCFcbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlMRUFWRSgpOworCXJldHVybiAwOworfQorCisvKioKKyAqICBAYnJpZWYgICAgICAgICAgTGlzdCBhbiBlbnRyeSBmcm9tIHRoZSBGTlQgdGFibGUKKyAqICBAcGFyYW0gcHJpdiAgICAgQSBwb2ludGVyIHRvIHdsYW5fcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqICBAcGFyYW0gcmVxICAgICAgQSBwb2ludGVyIHRvIGlmcmVxIHN0cnVjdHVyZQorICogIEByZXR1cm4gICAgICAgICAwIC0tc3VjY2Vzcywgb3RoZXJ3aXNlIGZhaWwKKyAqLworc3RhdGljIGludCB3bGFuX2Z3dF9saXN0X25laWdoYm9yX2lvY3RsKHdsYW5fcHJpdmF0ZSAqIHByaXYsIHN0cnVjdCBpZnJlcSAqcmVxKQoreworCXN0cnVjdCBpd3JlcSAqd3JxID0gKHN0cnVjdCBpd3JlcSAqKXJlcTsKKwljaGFyIGluX3N0cls4XTsKKwlzdGF0aWMgc3RydWN0IGNtZF9kc19md3RfYWNjZXNzIGZ3dF9hY2Nlc3M7CisJY2hhciAqcHRyID0gaW5fc3RyOworCXN0YXRpYyBjaGFyIG91dF9zdHJbMTI4XTsKKwljaGFyICpwYnVmID0gb3V0X3N0cjsKKwlpbnQgcmV0OworCisJRU5URVIoKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoaW5fc3RyLCB3cnEtPnUuZGF0YS5wb2ludGVyLCBzaXplb2YoaW5fc3RyKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJbWVtc2V0KCZmd3RfYWNjZXNzLCAwLCBzaXplb2YoZnd0X2FjY2VzcykpOworCWZ3dF9hY2Nlc3MuaWQgPSBjcHVfdG9fbGUzMihzaW1wbGVfc3RydG91bChwdHIsICZwdHIsIDEwKSk7CisKKyNpZmRlZiBERUJVRworCXsKKwkJbGJzX3ByX2RlYnVnKDEsICJGV1RfTElTVF9ORUlHSEJPUjogbGluZSBpcyAlc1xuIiwgaW5fc3RyKTsKKwkJbGJzX3ByX2RlYnVnKDEsICJGV1RfTElTVF9ORUlHSEJPUjogbGlzdGluZyBpZDolaVxuIiwgbGUzMl90b19jcHUoZnd0X2FjY2Vzcy5pZCkpOworCX0KKyNlbmRpZgorCisJcmV0ID0gbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsIGNtZF9md3RfYWNjZXNzLAorCQkJCSAgICBjbWRfYWN0X2Z3dF9hY2Nlc3NfbGlzdF9uZWlnaGJvciwKKwkJCQkgICAgY21kX29wdGlvbl93YWl0Zm9ycnNwLCAwLAorCQkJCSAgICAodm9pZCAqKSZmd3RfYWNjZXNzKTsKKworCWlmIChyZXQgPT0gMCkgeworCQlwYnVmICs9IHNwcmludGYocGJ1ZiwgIiByYSAiKTsKKwkJcGJ1ZiArPSBldGhfYWRkcjJzdHIoZnd0X2FjY2Vzcy5yYSwgcGJ1Zik7CisJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAiICBzbHAgJXUiLCBmd3RfYWNjZXNzLnNsZWVwbW9kZSk7CisJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAiICBzbnIgJXUiLCBsZTMyX3RvX2NwdShmd3RfYWNjZXNzLnNucikpOworCQlwYnVmICs9IHNwcmludGYocGJ1ZiwgIiAgcmVmICV1IiwgbGUzMl90b19jcHUoZnd0X2FjY2Vzcy5yZWZlcmVuY2VzKSk7CisJfSBlbHNlCisJCXBidWYgKz0gc3ByaW50ZihwYnVmLCAiIChudWxsKSIpOworCisJd3JxLT51LmRhdGEubGVuZ3RoID0gc3RybGVuKG91dF9zdHIpOworCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgKGNoYXIgKilvdXRfc3RyLAorCQkJIHdycS0+dS5kYXRhLmxlbmd0aCkpIHsKKwkJbGJzX3ByX2RlYnVnKDEsICJGV1RfTElTVF9ORUlHSEJPUjogQ29weSB0byB1c2VyIGZhaWxlZCFcbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlMRUFWRSgpOworCXJldHVybiAwOworfQorCisvKioKKyAqICBAYnJpZWYgICAgICAgICAgQ2xlYW5zIHVwIHRoZSByb3V0ZSAoRlJUKSBhbmQgbmVpZ2hib3IgKEZOVCkgdGFibGVzCisgKiAgICAgICAgICAgICAgICAgIChHYXJiYWdlIENvbGxlY3Rpb24pCisgKiAgQHBhcmFtIHByaXYgICAgIEEgcG9pbnRlciB0byB3bGFuX3ByaXZhdGUgc3RydWN0dXJlCisgKiAgQHBhcmFtIHJlcSAgICAgIEEgcG9pbnRlciB0byBpZnJlcSBzdHJ1Y3R1cmUKKyAqICBAcmV0dXJuICAgICAgICAgMCAtLXN1Y2Nlc3MsIG90aGVyd2lzZSBmYWlsCisgKi8KK3N0YXRpYyBpbnQgd2xhbl9md3RfY2xlYW51cF9pb2N0bCh3bGFuX3ByaXZhdGUgKiBwcml2LCBzdHJ1Y3QgaWZyZXEgKnJlcSkKK3sKKwlzdGF0aWMgc3RydWN0IGNtZF9kc19md3RfYWNjZXNzIGZ3dF9hY2Nlc3M7CisJaW50IHJldDsKKworCUVOVEVSKCk7CisKKwlsYnNfcHJfZGVidWcoMSwgIkZXVDogY2xlYW5pbmcgdXBcbiIpOworCisJbWVtc2V0KCZmd3RfYWNjZXNzLCAwLCBzaXplb2YoZnd0X2FjY2VzcykpOworCisJcmV0ID0gbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsIGNtZF9md3RfYWNjZXNzLAorCQkJCSAgICBjbWRfYWN0X2Z3dF9hY2Nlc3NfY2xlYW51cCwKKwkJCQkgICAgY21kX29wdGlvbl93YWl0Zm9ycnNwLCAwLAorCQkJCSAgICAodm9pZCAqKSZmd3RfYWNjZXNzKTsKKworCWlmIChyZXQgPT0gMCkKKwkJcmVxLT5pZnJfZGF0YSA9IChjaGFyICopKGxlMzJfdG9fY3B1KGZ3dF9hY2Nlc3MucmVmZXJlbmNlcykpOworCWVsc2UKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlMRUFWRSgpOworCXJldHVybiAwOworfQorCisvKioKKyAqICBAYnJpZWYgICAgICAgICAgR2V0cyBmaXJtd2FyZSBpbnRlcm5hbCB0aW1lIChkZWJ1ZyBwdXJwb3NlcykKKyAqICBAcGFyYW0gcHJpdiAgICAgQSBwb2ludGVyIHRvIHdsYW5fcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqICBAcGFyYW0gcmVxICAgICAgQSBwb2ludGVyIHRvIGlmcmVxIHN0cnVjdHVyZQorICogIEByZXR1cm4gICAgICAgICAwIC0tc3VjY2Vzcywgb3RoZXJ3aXNlIGZhaWwKKyAqLworc3RhdGljIGludCB3bGFuX2Z3dF90aW1lX2lvY3RsKHdsYW5fcHJpdmF0ZSAqIHByaXYsIHN0cnVjdCBpZnJlcSAqcmVxKQoreworCXN0YXRpYyBzdHJ1Y3QgY21kX2RzX2Z3dF9hY2Nlc3MgZnd0X2FjY2VzczsKKwlpbnQgcmV0OworCisJRU5URVIoKTsKKworCWxic19wcl9kZWJ1ZygxLCAiRldUOiBnZXR0aW5nIHRpbWVcbiIpOworCisJbWVtc2V0KCZmd3RfYWNjZXNzLCAwLCBzaXplb2YoZnd0X2FjY2VzcykpOworCisJcmV0ID0gbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsIGNtZF9md3RfYWNjZXNzLAorCQkJCSAgICBjbWRfYWN0X2Z3dF9hY2Nlc3NfdGltZSwKKwkJCQkgICAgY21kX29wdGlvbl93YWl0Zm9ycnNwLCAwLAorCQkJCSAgICAodm9pZCAqKSZmd3RfYWNjZXNzKTsKKworCWlmIChyZXQgPT0gMCkKKwkJcmVxLT5pZnJfZGF0YSA9IChjaGFyICopKGxlMzJfdG9fY3B1KGZ3dF9hY2Nlc3MucmVmZXJlbmNlcykpOworCWVsc2UKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlMRUFWRSgpOworCXJldHVybiAwOworfQorCisvKioKKyAqICBAYnJpZWYgICAgICAgICAgR2V0cyBtZXNoIHR0bCBmcm9tIGZpcm13YXJlCisgKiAgQHBhcmFtIHByaXYgICAgIEEgcG9pbnRlciB0byB3bGFuX3ByaXZhdGUgc3RydWN0dXJlCisgKiAgQHBhcmFtIHJlcSAgICAgIEEgcG9pbnRlciB0byBpZnJlcSBzdHJ1Y3R1cmUKKyAqICBAcmV0dXJuICAgICAgICAgMCAtLXN1Y2Nlc3MsIG90aGVyd2lzZSBmYWlsCisgKi8KK3N0YXRpYyBpbnQgd2xhbl9tZXNoX2dldF90dGxfaW9jdGwod2xhbl9wcml2YXRlICogcHJpdiwgc3RydWN0IGlmcmVxICpyZXEpCit7CisJc3RydWN0IGNtZF9kc19tZXNoX2FjY2VzcyBtZXNoX2FjY2VzczsKKwlpbnQgcmV0OworCisJRU5URVIoKTsKKworCW1lbXNldCgmbWVzaF9hY2Nlc3MsIDAsIHNpemVvZihtZXNoX2FjY2VzcykpOworCisJcmV0ID0gbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsIGNtZF9tZXNoX2FjY2VzcywKKwkJCQkgICAgY21kX2FjdF9tZXNoX2dldF90dGwsCisJCQkJICAgIGNtZF9vcHRpb25fd2FpdGZvcnJzcCwgMCwKKwkJCQkgICAgKHZvaWQgKikmbWVzaF9hY2Nlc3MpOworCisJaWYgKHJldCA9PSAwKSB7CisJCXJlcS0+aWZyX2RhdGEgPSAoY2hhciAqKShsZTMyX3RvX2NwdShtZXNoX2FjY2Vzcy5kYXRhWzBdKSk7CisJfQorCWVsc2UKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlMRUFWRSgpOworCXJldHVybiAwOworfQorCisvKioKKyAqICBAYnJpZWYgICAgICAgICAgR2V0cyBtZXNoIHR0bCBmcm9tIGZpcm13YXJlCisgKiAgQHBhcmFtIHByaXYgICAgIEEgcG9pbnRlciB0byB3bGFuX3ByaXZhdGUgc3RydWN0dXJlCisgKiAgQHBhcmFtIHR0bCAgICAgIE5ldyB0dGwgdmFsdWUKKyAqICBAcmV0dXJuICAgICAgICAgMCAtLXN1Y2Nlc3MsIG90aGVyd2lzZSBmYWlsCisgKi8KK3N0YXRpYyBpbnQgd2xhbl9tZXNoX3NldF90dGxfaW9jdGwod2xhbl9wcml2YXRlICogcHJpdiwgaW50IHR0bCkKK3sKKwlzdHJ1Y3QgY21kX2RzX21lc2hfYWNjZXNzIG1lc2hfYWNjZXNzOworCWludCByZXQ7CisKKwlFTlRFUigpOworCisJaWYoICh0dGwgPiAweGZmKSB8fCAodHRsIDwgMCkgKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1lbXNldCgmbWVzaF9hY2Nlc3MsIDAsIHNpemVvZihtZXNoX2FjY2VzcykpOworCW1lc2hfYWNjZXNzLmRhdGFbMF0gPSB0dGw7CisKKwlyZXQgPSBsaWJlcnRhc19wcmVwYXJlX2FuZF9zZW5kX2NvbW1hbmQocHJpdiwgY21kX21lc2hfYWNjZXNzLAorCQkJCQkJY21kX2FjdF9tZXNoX3NldF90dGwsCisJCQkJCQljbWRfb3B0aW9uX3dhaXRmb3Jyc3AsIDAsCisJCQkJCQkodm9pZCAqKSZtZXNoX2FjY2Vzcyk7CisKKwlpZiAocmV0ICE9IDApCisJCXJldCA9IC1FRkFVTFQ7CisKKwlMRUFWRSgpOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogIEBicmllZiBpb2N0bCBmdW5jdGlvbiAtIGVudHJ5IHBvaW50CisgKgorICogIEBwYXJhbSBkZXYJCUEgcG9pbnRlciB0byBuZXRfZGV2aWNlIHN0cnVjdHVyZQorICogIEBwYXJhbSByZXEJICAgCUEgcG9pbnRlciB0byBpZnJlcSBzdHJ1Y3R1cmUKKyAqICBAcGFyYW0gY21kIAkJY29tbWFuZAorICogIEByZXR1cm4gCSAgIAkwLS1zdWNjZXNzLCBvdGhlcndpc2UgZmFpbAorICovCitpbnQgbGliZXJ0YXNfZG9faW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpyZXEsIGludCBjbWQpCit7CisJaW50IHN1YmNtZCA9IDA7CisJaW50IGlkYXRhID0gMDsKKwlpbnQgKnBkYXRhOworCWludCByZXQgPSAwOworCXdsYW5fcHJpdmF0ZSAqcHJpdiA9IGRldi0+cHJpdjsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCXN0cnVjdCBpd3JlcSAqd3JxID0gKHN0cnVjdCBpd3JlcSAqKXJlcTsKKworCUVOVEVSKCk7CisKKwlsYnNfcHJfZGVidWcoMSwgImxpYmVydGFzX2RvX2lvY3RsOiBpb2N0bCBjbWQgPSAweCV4XG4iLCBjbWQpOworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBXTEFOU0NBTl9UWVBFOgorCQlsYnNfcHJfZGVidWcoMSwgIlNjYW4gdHlwZSBJb2N0bFxuIik7CisJCXJldCA9IHdsYW5fc2Nhbl90eXBlX2lvY3RsKHByaXYsIHdycSk7CisJCWJyZWFrOworCisJY2FzZSBXTEFOX1NFVE5PTkVfR0VUTk9ORToJLyogc2V0IFdQQSBtb2RlIG9uL29mZiBpb2N0bCAjMjAgKi8KKwkJc3dpdGNoICh3cnEtPnUuZGF0YS5mbGFncykgeworCQljYXNlIFdMQU5ERUFVVEg6CisJCQlsYnNfcHJfZGVidWcoMSwgIkRlYXV0aFxuIik7CisJCQlsaWJlcnRhc19zZW5kX2RlYXV0aChwcml2KTsKKwkJCWJyZWFrOworCisJCWNhc2UgV0xBTkFESE9DU1RPUDoKKwkJCWxic19wcl9kZWJ1ZygxLCAiQWRob2Mgc3RvcFxuIik7CisJCQlyZXQgPSBsaWJlcnRhc19kb19hZGhvY3N0b3BfaW9jdGwocHJpdik7CisJCQlicmVhazsKKworCQljYXNlIFdMQU5SQURJT09OOgorCQkJd2xhbl9yYWRpb19pb2N0bChwcml2LCAxKTsKKwkJCWJyZWFrOworCisJCWNhc2UgV0xBTlJBRElPT0ZGOgorCQkJd2xhbl9yYWRpb19pb2N0bChwcml2LCAwKTsKKwkJCWJyZWFrOworCQljYXNlIFdMQU5XTEFOSURMRU9OOgorCQkJbGliZXJ0YXNfaWRsZV9vbihwcml2KTsKKwkJCWJyZWFrOworCQljYXNlIFdMQU5XTEFOSURMRU9GRjoKKwkJCWxpYmVydGFzX2lkbGVfb2ZmKHByaXYpOworCQkJYnJlYWs7CisJCWNhc2UgV0xBTl9TVUJDTURfQlRfUkVTRVQ6CS8qIGJ0X3Jlc2V0ICovCisJCQl3bGFuX2J0X3Jlc2V0X2lvY3RsKHByaXYpOworCQkJYnJlYWs7CisJCWNhc2UgV0xBTl9TVUJDTURfRldUX1JFU0VUOgkvKiBmd3RfcmVzZXQgKi8KKwkJCXdsYW5fZnd0X3Jlc2V0X2lvY3RsKHByaXYpOworCQkJYnJlYWs7CisJCX0JCS8qIEVuZCBvZiBzd2l0Y2ggKi8KKwkJYnJlYWs7CisKKwljYXNlIFdMQU5TRVRXUEFJRToKKwkJcmV0ID0gd2xhbl9zZXR3cGFpZV9pb2N0bChwcml2LCByZXEpOworCQlicmVhazsKKwljYXNlIFdMQU5fU0VUSU5UX0dFVElOVDoKKwkJLyogVGhlIGZpcnN0IDQgYnl0ZXMgb2YgcmVxLT5pZnJfZGF0YSBpcyBzdWItaW9jdGwgbnVtYmVyCisJCSAqIGFmdGVyIDQgYnl0ZXMgc2l0cyB0aGUgcGF5bG9hZC4KKwkJICovCisJCXN1YmNtZCA9IChpbnQpcmVxLT5pZnJfZGF0YTsJLy9mcm9tIGl3cHJpdiBzdWJjbWQKKwkJc3dpdGNoIChzdWJjbWQpIHsKKwkJY2FzZSBXTEFOTkY6CisJCQlyZXQgPSB3bGFuX2dldF9uZihwcml2LCB3cnEpOworCQkJYnJlYWs7CisJCWNhc2UgV0xBTlJTU0k6CisJCQlyZXQgPSB3bGFuX2dldF9yc3NpKHByaXYsIHdycSk7CisJCQlicmVhazsKKwkJY2FzZSBXTEFORU5BQkxFMTFEOgorCQkJcmV0ID0gbGliZXJ0YXNfY21kX2VuYWJsZV8xMWQocHJpdiwgd3JxKTsKKwkJCWJyZWFrOworCQljYXNlIFdMQU5BREhPQ0dSQVRFOgorCQkJcmV0ID0gd2xhbl9kb19zZXRfZ3JhdGVfaW9jdGwocHJpdiwgd3JxKTsKKwkJCWJyZWFrOworCQljYXNlIFdMQU5fU1VCQ01EX1NFVF9QUkVTQ0FOOgorCQkJcmV0ID0gd2xhbl9zdWJjbWRfc2V0cHJlc2Nhbl9pb2N0bChwcml2LCB3cnEpOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFdMQU5fU0VUT05FSU5UX0dFVE9ORUlOVDoKKwkJc3dpdGNoICh3cnEtPnUuZGF0YS5mbGFncykgeworCQljYXNlIFdMQU5fQkVBQ09OX0lOVEVSVkFMOgorCQkJcmV0ID0gd2xhbl9iZWFjb25faW50ZXJ2YWwocHJpdiwgd3JxKTsKKwkJCWJyZWFrOworCisJCWNhc2UgV0xBTl9MSVNURU5JTlRSVkw6CisJCQlpZiAoIXdycS0+dS5kYXRhLmxlbmd0aCkgeworCQkJCWludCBkYXRhOworCQkJCWxic19wcl9kZWJ1ZygxLCAiR2V0IGxvY2FsbGlzdGVuaW50ZXJ2YWwgdmFsdWVcbiIpOworI2RlZmluZSBHRVRfT05FX0lOVAkxCisJCQkJZGF0YSA9IGFkYXB0ZXItPmxvY2FsbGlzdGVuaW50ZXJ2YWw7CisJCQkJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLAorCQkJCQkJICZkYXRhLCBzaXplb2YoaW50KSkpIHsKKwkJCQkJbGJzX3ByX2RlYnVnKDEsICJDb3B5IHRvIHVzZXIgZmFpbGVkXG4iKTsKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJfQorCisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gR0VUX09ORV9JTlQ7CisJCQl9IGVsc2UgeworCQkJCWludCBkYXRhOworCQkJCWlmIChjb3B5X2Zyb21fdXNlcgorCQkJCSAgICAoJmRhdGEsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHNpemVvZihpbnQpKSkgeworCQkJCQlsYnNfcHJfZGVidWcoMSwgIkNvcHkgZnJvbSB1c2VyIGZhaWxlZFxuIik7CisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCX0KKworCQkJCWxic19wcl9kZWJ1ZygxLCAiU2V0IGxvY2FsbGlzdGVuaW50ZXJ2YWwgPSAlZFxuIiwKKwkJCQkgICAgICAgZGF0YSk7CisjZGVmaW5lIE1BWF9VMTZfVkFMCTY1NTM1CisJCQkJaWYgKGRhdGEgPiBNQVhfVTE2X1ZBTCkgeworCQkJCQlsYnNfcHJfZGVidWcoMSwgIkV4Y2VlZHMgVTE2IHZhbHVlXG4iKTsKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJfQorCQkJCWFkYXB0ZXItPmxvY2FsbGlzdGVuaW50ZXJ2YWwgPSBkYXRhOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgV0xBTl9UWENPTlRST0w6CisJCQlyZXQgPSB3bGFuX3R4Y29udHJvbChwcml2LCB3cnEpOwkvL2FkZHMgZm9yIHR4Y29udHJvbCBpb2N0bAorCQkJYnJlYWs7CisKKwkJY2FzZSBXTEFOX05VTExQS1RJTlRFUlZBTDoKKwkJCXJldCA9IHdsYW5fbnVsbF9wa3RfaW50ZXJ2YWwocHJpdiwgd3JxKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCisJY2FzZSBXTEFOX1NFVE9ORUlOVF9HRVROT05FOgorCQkvKiBUaGUgZmlyc3QgNCBieXRlcyBvZiByZXEtPmlmcl9kYXRhIGlzIHN1Yi1pb2N0bCBudW1iZXIKKwkJICogYWZ0ZXIgNCBieXRlcyBzaXRzIHRoZSBwYXlsb2FkLgorCQkgKi8KKwkJc3ViY21kID0gd3JxLT51LmRhdGEuZmxhZ3M7CS8vZnJvbSB3cGFfc3VwcGxpY2FudCBzdWJjbWQKKworCQlpZiAoIXN1YmNtZCkKKwkJCXN1YmNtZCA9IChpbnQpcmVxLT5pZnJfZGF0YTsJLy9mcm9tIGl3cHJpdiBzdWJjbWQKKworCQlzd2l0Y2ggKHN1YmNtZCkgeworCQljYXNlIFdMQU5fU1VCQ01EX1NFVFJYQU5URU5OQToJLyogU0VUUlhBTlRFTk5BICovCisJCQlpZGF0YSA9IFNVQkNNRF9EQVRBKHdycSk7CisJCQlyZXQgPSBzZXRyeGFudGVubmEocHJpdiwgaWRhdGEpOworCQkJYnJlYWs7CisJCWNhc2UgV0xBTl9TVUJDTURfU0VUVFhBTlRFTk5BOgkvKiBTRVRUWEFOVEVOTkEgKi8KKwkJCWlkYXRhID0gU1VCQ01EX0RBVEEod3JxKTsKKwkJCXJldCA9IHNldHR4YW50ZW5uYShwcml2LCBpZGF0YSk7CisJCQlicmVhazsKKwkJY2FzZSBXTEFOX1NFVF9BVElNX1dJTkRPVzoKKwkJCWFkYXB0ZXItPmF0aW13aW5kb3cgPSBTVUJDTURfREFUQSh3cnEpOworCQkJYWRhcHRlci0+YXRpbXdpbmRvdyA9IG1pbl90KF9fdTE2LCBhZGFwdGVyLT5hdGltd2luZG93LCA1MCk7CisJCQlicmVhazsKKwkJY2FzZSBXTEFOU0VUQkNOQVZHOgorCQkJYWRhcHRlci0+YmNuX2F2Z19mYWN0b3IgPSBTVUJDTURfREFUQSh3cnEpOworCQkJaWYgKGFkYXB0ZXItPmJjbl9hdmdfZmFjdG9yID09IDApCisJCQkJYWRhcHRlci0+YmNuX2F2Z19mYWN0b3IgPQorCQkJCSAgICBERUZBVUxUX0JDTl9BVkdfRkFDVE9SOworCQkJaWYgKGFkYXB0ZXItPmJjbl9hdmdfZmFjdG9yID4gREVGQVVMVF9CQ05fQVZHX0ZBQ1RPUikKKwkJCQlhZGFwdGVyLT5iY25fYXZnX2ZhY3RvciA9CisJCQkJICAgIERFRkFVTFRfQkNOX0FWR19GQUNUT1I7CisJCQlicmVhazsKKwkJY2FzZSBXTEFOU0VUREFUQUFWRzoKKwkJCWFkYXB0ZXItPmRhdGFfYXZnX2ZhY3RvciA9IFNVQkNNRF9EQVRBKHdycSk7CisJCQlpZiAoYWRhcHRlci0+ZGF0YV9hdmdfZmFjdG9yID09IDApCisJCQkJYWRhcHRlci0+ZGF0YV9hdmdfZmFjdG9yID0KKwkJCQkgICAgREVGQVVMVF9EQVRBX0FWR19GQUNUT1I7CisJCQlpZiAoYWRhcHRlci0+ZGF0YV9hdmdfZmFjdG9yID4gREVGQVVMVF9EQVRBX0FWR19GQUNUT1IpCisJCQkJYWRhcHRlci0+ZGF0YV9hdmdfZmFjdG9yID0KKwkJCQkgICAgREVGQVVMVF9EQVRBX0FWR19GQUNUT1I7CisJCQlicmVhazsKKwkJY2FzZSBXTEFOU0VUUkVHSU9OOgorCQkJaWRhdGEgPSBTVUJDTURfREFUQSh3cnEpOworCQkJcmV0ID0gd2xhbl9zZXRfcmVnaW9uKHByaXYsICh1MTYpIGlkYXRhKTsKKwkJCWJyZWFrOworCisJCWNhc2UgV0xBTl9TRVRfTElTVEVOX0lOVEVSVkFMOgorCQkJaWRhdGEgPSBTVUJDTURfREFUQSh3cnEpOworCQkJYWRhcHRlci0+bGlzdGVuaW50ZXJ2YWwgPSAodTE2KSBpZGF0YTsKKwkJCWJyZWFrOworCisJCWNhc2UgV0xBTl9TRVRfTVVMVElQTEVfRFRJTToKKwkJCXJldCA9IHdsYW5fc2V0X211bHRpcGxlX2R0aW1faW9jdGwocHJpdiwgcmVxKTsKKwkJCWJyZWFrOworCisJCWNhc2UgV0xBTlNFVEFVVEhBTEc6CisJCQlyZXQgPSB3bGFuX3NldGF1dGhhbGdfaW9jdGwocHJpdiwgcmVxKTsKKwkJCWJyZWFrOworCisJCWNhc2UgV0xBTlNFVDgwMjFYQVVUSEFMRzoKKwkJCXJldCA9IHdsYW5fc2V0ODAyMXhhdXRoYWxnX2lvY3RsKHByaXYsIHJlcSk7CisJCQlicmVhazsKKworCQljYXNlIFdMQU5TRVRFTkNSWVBUSU9OTU9ERToKKwkJCXJldCA9IHdsYW5fc2V0ZW5jcnlwdGlvbm1vZGVfaW9jdGwocHJpdiwgcmVxKTsKKwkJCWJyZWFrOworCisJCWNhc2UgV0xBTl9TRVRfTElOS01PREU6CisJCQlyZXQgPSB3bGFuX3NldF9saW5rbW9kZV9pb2N0bChwcml2LCByZXEpOworCQkJYnJlYWs7CisKKwkJY2FzZSBXTEFOX1NFVF9SQURJT01PREU6CisJCQlyZXQgPSB3bGFuX3NldF9yYWRpb21vZGVfaW9jdGwocHJpdiwgcmVxKTsKKwkJCWJyZWFrOworCisJCWNhc2UgV0xBTl9TRVRfREVCVUdNT0RFOgorCQkJcmV0ID0gd2xhbl9zZXRfZGVidWdtb2RlX2lvY3RsKHByaXYsIHJlcSk7CisJCQlicmVhazsKKworCQljYXNlIFdMQU5fU1VCQ01EX01FU0hfU0VUX1RUTDoKKwkJCWlkYXRhID0gU1VCQ01EX0RBVEEod3JxKTsKKwkJCXJldCA9IHdsYW5fbWVzaF9zZXRfdHRsX2lvY3RsKHByaXYsIGlkYXRhKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwkJCWJyZWFrOworCQl9CisKKwkJYnJlYWs7CisKKwljYXNlIFdMQU5fU0VUTk9ORV9HRVRUV0VMVkVfQ0hBUjoJLyogR2V0IEFudGVubmEgc2V0dGluZ3MgKi8KKwkJLyoKKwkJICogV2UndmUgbm90IHVzZWQgSVdfUFJJVl9UWVBFX0ZJWEVEIHNvIHN1Yi1pb2N0bCBudW1iZXIgaXMKKwkJICogaW4gZmxhZ3Mgb2YgaXdyZXEgc3RydWN0dXJlLCBvdGhlcndpc2UgaXQgd2lsbCBiZSBpbgorCQkgKiBtb2RlIG1lbWJlciBvZiBpd3JlcSBzdHJ1Y3R1cmUuCisJCSAqLworCQlzd2l0Y2ggKChpbnQpd3JxLT51LmRhdGEuZmxhZ3MpIHsKKwkJY2FzZSBXTEFOX1NVQkNNRF9HRVRSWEFOVEVOTkE6CS8qIEdldCBSeCBBbnRlbm5hICovCisJCQlyZXQgPSB3bGFuX3N1YmNtZF9nZXRyeGFudGVubmFfaW9jdGwocHJpdiwgcmVxKTsKKwkJCWJyZWFrOworCisJCWNhc2UgV0xBTl9TVUJDTURfR0VUVFhBTlRFTk5BOgkvKiBHZXQgVHggQW50ZW5uYSAqLworCQkJcmV0ID0gd2xhbl9zdWJjbWRfZ2V0dHhhbnRlbm5hX2lvY3RsKHByaXYsIHJlcSk7CisJCQlicmVhazsKKworCQljYXNlIFdMQU5fR0VUX1RTRjoKKwkJCXJldCA9IHdsYW5fZ2V0X3RzZl9pb2N0bChwcml2LCB3cnEpOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFdMQU5fU0VUMTI4Q0hBUl9HRVQxMjhDSEFSOgorCQlzd2l0Y2ggKChpbnQpd3JxLT51LmRhdGEuZmxhZ3MpIHsKKworCQljYXNlIFdMQU5TQ0FOX01PREU6CisJCQlsYnNfcHJfZGVidWcoMSwgIlNjYW4gbW9kZSBJb2N0bFxuIik7CisJCQlyZXQgPSB3bGFuX3NjYW5fbW9kZV9pb2N0bChwcml2LCB3cnEpOworCQkJYnJlYWs7CisKKwkJY2FzZSBXTEFOX0dFVF9BREhPQ19TVEFUVVM6CisJCQlyZXQgPSB3bGFuX2dldF9hZGhvY19zdGF0dXNfaW9jdGwocHJpdiwgd3JxKTsKKwkJCWJyZWFrOworCQljYXNlIFdMQU5fU1VCQ01EX0JUX0FERDoKKwkJCXJldCA9IHdsYW5fYnRfYWRkX2lvY3RsKHByaXYsIHJlcSk7CisJCQlicmVhazsKKwkJY2FzZSBXTEFOX1NVQkNNRF9CVF9ERUw6CisJCQlyZXQgPSB3bGFuX2J0X2RlbF9pb2N0bChwcml2LCByZXEpOworCQkJYnJlYWs7CisJCWNhc2UgV0xBTl9TVUJDTURfQlRfTElTVDoKKwkJCXJldCA9IHdsYW5fYnRfbGlzdF9pb2N0bChwcml2LCByZXEpOworCQkJYnJlYWs7CisJCWNhc2UgV0xBTl9TVUJDTURfRldUX0FERDoKKwkJCXJldCA9IHdsYW5fZnd0X2FkZF9pb2N0bChwcml2LCByZXEpOworCQkJYnJlYWs7CisJCWNhc2UgV0xBTl9TVUJDTURfRldUX0RFTDoKKwkJCXJldCA9IHdsYW5fZnd0X2RlbF9pb2N0bChwcml2LCByZXEpOworCQkJYnJlYWs7CisJCWNhc2UgV0xBTl9TVUJDTURfRldUX0xPT0tVUDoKKwkJCXJldCA9IHdsYW5fZnd0X2xvb2t1cF9pb2N0bChwcml2LCByZXEpOworCQkJYnJlYWs7CisJCWNhc2UgV0xBTl9TVUJDTURfRldUX0xJU1RfTkVJR0hCT1I6CisJCQlyZXQgPSB3bGFuX2Z3dF9saXN0X25laWdoYm9yX2lvY3RsKHByaXYsIHJlcSk7CisJCQlicmVhazsKKwkJY2FzZSBXTEFOX1NVQkNNRF9GV1RfTElTVDoKKwkJCXJldCA9IHdsYW5fZnd0X2xpc3RfaW9jdGwocHJpdiwgcmVxKTsKKwkJCWJyZWFrOworCQljYXNlIFdMQU5fU1VCQ01EX0ZXVF9MSVNUX1JPVVRFOgorCQkJcmV0ID0gd2xhbl9md3RfbGlzdF9yb3V0ZV9pb2N0bChwcml2LCByZXEpOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFdMQU5fU0VUTk9ORV9HRVRPTkVJTlQ6CisJCXN3aXRjaCAoKGludClyZXEtPmlmcl9kYXRhKSB7CisJCWNhc2UgV0xBTkdFVEJDTkFWRzoKKwkJCXBkYXRhID0gKGludCAqKXdycS0+dS5uYW1lOworCQkJKnBkYXRhID0gKGludClhZGFwdGVyLT5iY25fYXZnX2ZhY3RvcjsKKwkJCWJyZWFrOworCisJCWNhc2UgV0xBTkdFVFJFR0lPTjoKKwkJCXBkYXRhID0gKGludCAqKXdycS0+dS5uYW1lOworCQkJKnBkYXRhID0gKGludClhZGFwdGVyLT5yZWdpb25jb2RlOworCQkJYnJlYWs7CisKKwkJY2FzZSBXTEFOX0dFVF9MSVNURU5fSU5URVJWQUw6CisJCQlwZGF0YSA9IChpbnQgKil3cnEtPnUubmFtZTsKKwkJCSpwZGF0YSA9IChpbnQpYWRhcHRlci0+bGlzdGVuaW50ZXJ2YWw7CisJCQlicmVhazsKKworCQljYXNlIFdMQU5fR0VUX0xJTktNT0RFOgorCQkJcmVxLT5pZnJfZGF0YSA9IChjaGFyICopKCh1MzIpIGFkYXB0ZXItPmxpbmttb2RlKTsKKwkJCWJyZWFrOworCisJCWNhc2UgV0xBTl9HRVRfUkFESU9NT0RFOgorCQkJcmVxLT5pZnJfZGF0YSA9IChjaGFyICopKCh1MzIpIGFkYXB0ZXItPnJhZGlvbW9kZSk7CisJCQlicmVhazsKKworCQljYXNlIFdMQU5fR0VUX0RFQlVHTU9ERToKKwkJCXJlcS0+aWZyX2RhdGEgPSAoY2hhciAqKSgodTMyKSBhZGFwdGVyLT5kZWJ1Z21vZGUpOworCQkJYnJlYWs7CisKKwkJY2FzZSBXTEFOX0dFVF9NVUxUSVBMRV9EVElNOgorCQkJcGRhdGEgPSAoaW50ICopd3JxLT51Lm5hbWU7CisJCQkqcGRhdGEgPSAoaW50KWFkYXB0ZXItPm11bHRpcGxlZHRpbTsKKwkJCWJyZWFrOworCQljYXNlIFdMQU5fR0VUX1RYX1JBVEU6CisJCQlyZXQgPSB3bGFuX2dldF90eHJhdGVfaW9jdGwocHJpdiwgcmVxKTsKKwkJCWJyZWFrOworCQljYXNlIFdMQU5fU1VCQ01EX0ZXVF9DTEVBTlVQOgkvKiBmd3RfY2xlYW51cCAqLworCQkJcmV0ID0gd2xhbl9md3RfY2xlYW51cF9pb2N0bChwcml2LCByZXEpOworCQkJYnJlYWs7CisKKwkJY2FzZSBXTEFOX1NVQkNNRF9GV1RfVElNRToJLyogZnd0X3RpbWUgKi8KKwkJCXJldCA9IHdsYW5fZnd0X3RpbWVfaW9jdGwocHJpdiwgcmVxKTsKKwkJCWJyZWFrOworCisJCWNhc2UgV0xBTl9TVUJDTURfTUVTSF9HRVRfVFRMOgorCQkJcmV0ID0gd2xhbl9tZXNoX2dldF90dGxfaW9jdGwocHJpdiwgcmVxKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlyZXQgPSAtRU9QTk9UU1VQUDsKKworCQl9CisKKwkJYnJlYWs7CisKKwljYXNlIFdMQU5HRVRMT0c6CisJCXJldCA9IHdsYW5fZG9fZ2V0bG9nX2lvY3RsKHByaXYsIHdycSk7CisJCWJyZWFrOworCisJY2FzZSBXTEFOX1NFVF9HRVRfU0lYVEVFTl9JTlQ6CisJCXN3aXRjaCAoKGludCl3cnEtPnUuZGF0YS5mbGFncykgeworCQljYXNlIFdMQU5fVFBDQ0ZHOgorCQkJeworCQkJCWludCBkYXRhWzVdOworCQkJCXN0cnVjdCBjbWRfZHNfODAyXzExX3RwY19jZmcgY2ZnOworCQkJCW1lbXNldCgmY2ZnLCAwLCBzaXplb2YoY2ZnKSk7CisJCQkJaWYgKCh3cnEtPnUuZGF0YS5sZW5ndGggPiAxKQorCQkJCSAgICAmJiAod3JxLT51LmRhdGEubGVuZ3RoICE9IDUpKQorCQkJCQlyZXR1cm4gLTE7CisKKwkJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoID09IDApIHsKKwkJCQkJY2ZnLmFjdGlvbiA9CisJCQkJCSAgICBjcHVfdG9fbGUxNgorCQkJCQkgICAgKGNtZF9hY3RfZ2V0KTsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoY29weV9mcm9tX3VzZXIKKwkJCQkJICAgIChkYXRhLCB3cnEtPnUuZGF0YS5wb2ludGVyLAorCQkJCQkgICAgIHNpemVvZihpbnQpICogNSkpIHsKKwkJCQkJCWxic19wcl9kZWJ1ZygxLAorCQkJCQkJICAgICAgICJDb3B5IGZyb20gdXNlciBmYWlsZWRcbiIpOworCQkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJCX0KKworCQkJCQljZmcuYWN0aW9uID0KKwkJCQkJICAgIGNwdV90b19sZTE2CisJCQkJCSAgICAoY21kX2FjdF9zZXQpOworCQkJCQljZmcuZW5hYmxlID0gZGF0YVswXTsKKwkJCQkJY2ZnLnVzZXNuciA9IGRhdGFbMV07CisJCQkJCWNmZy5QMCA9IGRhdGFbMl07CisJCQkJCWNmZy5QMSA9IGRhdGFbM107CisJCQkJCWNmZy5QMiA9IGRhdGFbNF07CisJCQkJfQorCisJCQkJcmV0ID0KKwkJCQkgICAgbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsCisJCQkJCQkJICBjbWRfODAyXzExX3RwY19jZmcsCisJCQkJCQkJICAwLAorCQkJCQkJCSAgY21kX29wdGlvbl93YWl0Zm9ycnNwLAorCQkJCQkJCSAgMCwgKHZvaWQgKikmY2ZnKTsKKworCQkJCWRhdGFbMF0gPSBjZmcuZW5hYmxlOworCQkJCWRhdGFbMV0gPSBjZmcudXNlc25yOworCQkJCWRhdGFbMl0gPSBjZmcuUDA7CisJCQkJZGF0YVszXSA9IGNmZy5QMTsKKwkJCQlkYXRhWzRdID0gY2ZnLlAyOworCQkJCWlmIChjb3B5X3RvX3VzZXIKKwkJCQkgICAgKHdycS0+dS5kYXRhLnBvaW50ZXIsIGRhdGEsCisJCQkJICAgICBzaXplb2YoaW50KSAqIDUpKSB7CisJCQkJCWxic19wcl9kZWJ1ZygxLCAiQ29weSB0byB1c2VyIGZhaWxlZFxuIik7CisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCX0KKworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IDU7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFdMQU5fUE9XRVJDRkc6CisJCQl7CisJCQkJaW50IGRhdGFbNF07CisJCQkJc3RydWN0IGNtZF9kc184MDJfMTFfcHdyX2NmZyBjZmc7CisJCQkJbWVtc2V0KCZjZmcsIDAsIHNpemVvZihjZmcpKTsKKwkJCQlpZiAoKHdycS0+dS5kYXRhLmxlbmd0aCA+IDEpCisJCQkJICAgICYmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gNCkpCisJCQkJCXJldHVybiAtMTsKKwkJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoID09IDApIHsKKwkJCQkJY2ZnLmFjdGlvbiA9CisJCQkJCSAgICBjcHVfdG9fbGUxNgorCQkJCQkgICAgKGNtZF9hY3RfZ2V0KTsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoY29weV9mcm9tX3VzZXIKKwkJCQkJICAgIChkYXRhLCB3cnEtPnUuZGF0YS5wb2ludGVyLAorCQkJCQkgICAgIHNpemVvZihpbnQpICogNCkpIHsKKwkJCQkJCWxic19wcl9kZWJ1ZygxLAorCQkJCQkJICAgICAgICJDb3B5IGZyb20gdXNlciBmYWlsZWRcbiIpOworCQkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJCX0KKworCQkJCQljZmcuYWN0aW9uID0KKwkJCQkJICAgIGNwdV90b19sZTE2CisJCQkJCSAgICAoY21kX2FjdF9zZXQpOworCQkJCQljZmcuZW5hYmxlID0gZGF0YVswXTsKKwkJCQkJY2ZnLlBBX1AwID0gZGF0YVsxXTsKKwkJCQkJY2ZnLlBBX1AxID0gZGF0YVsyXTsKKwkJCQkJY2ZnLlBBX1AyID0gZGF0YVszXTsKKwkJCQl9CisJCQkJcmV0ID0KKwkJCQkgICAgbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsCisJCQkJCQkJICBjbWRfODAyXzExX3B3cl9jZmcsCisJCQkJCQkJICAwLAorCQkJCQkJCSAgY21kX29wdGlvbl93YWl0Zm9ycnNwLAorCQkJCQkJCSAgMCwgKHZvaWQgKikmY2ZnKTsKKwkJCQlkYXRhWzBdID0gY2ZnLmVuYWJsZTsKKwkJCQlkYXRhWzFdID0gY2ZnLlBBX1AwOworCQkJCWRhdGFbMl0gPSBjZmcuUEFfUDE7CisJCQkJZGF0YVszXSA9IGNmZy5QQV9QMjsKKwkJCQlpZiAoY29weV90b191c2VyCisJCQkJICAgICh3cnEtPnUuZGF0YS5wb2ludGVyLCBkYXRhLAorCQkJCSAgICAgc2l6ZW9mKGludCkgKiA0KSkgeworCQkJCQlsYnNfcHJfZGVidWcoMSwgIkNvcHkgdG8gdXNlciBmYWlsZWRcbiIpOworCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQl9CisKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSA0OworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgV0xBTl9BVVRPX0ZSRVFfU0VUOgorCQkJeworCQkJCWludCBkYXRhWzNdOworCQkJCXN0cnVjdCBjbWRfZHNfODAyXzExX2FmYyBhZmM7CisJCQkJbWVtc2V0KCZhZmMsIDAsIHNpemVvZihhZmMpKTsKKwkJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IDMpCisJCQkJCXJldHVybiAtMTsKKwkJCQlpZiAoY29weV9mcm9tX3VzZXIKKwkJCQkgICAgKGRhdGEsIHdycS0+dS5kYXRhLnBvaW50ZXIsCisJCQkJICAgICBzaXplb2YoaW50KSAqIDMpKSB7CisJCQkJCWxic19wcl9kZWJ1ZygxLCAiQ29weSBmcm9tIHVzZXIgZmFpbGVkXG4iKTsKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJfQorCQkJCWFmYy5hZmNfYXV0byA9IGRhdGFbMF07CisKKwkJCQlpZiAoYWZjLmFmY19hdXRvICE9IDApIHsKKwkJCQkJYWZjLnRocmVzaG9sZCA9IGRhdGFbMV07CisJCQkJCWFmYy5wZXJpb2QgPSBkYXRhWzJdOworCQkJCX0gZWxzZSB7CisJCQkJCWFmYy50aW1pbmdfb2Zmc2V0ID0gZGF0YVsxXTsKKwkJCQkJYWZjLmNhcnJpZXJfb2Zmc2V0ID0gZGF0YVsyXTsKKwkJCQl9CisJCQkJcmV0ID0KKwkJCQkgICAgbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsCisJCQkJCQkJICBjbWRfODAyXzExX3NldF9hZmMsCisJCQkJCQkJICAwLAorCQkJCQkJCSAgY21kX29wdGlvbl93YWl0Zm9ycnNwLAorCQkJCQkJCSAgMCwgKHZvaWQgKikmYWZjKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFdMQU5fQVVUT19GUkVRX0dFVDoKKwkJCXsKKwkJCQlpbnQgZGF0YVszXTsKKwkJCQlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9hZmMgYWZjOworCQkJCW1lbXNldCgmYWZjLCAwLCBzaXplb2YoYWZjKSk7CisJCQkJcmV0ID0KKwkJCQkgICAgbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsCisJCQkJCQkJICBjbWRfODAyXzExX2dldF9hZmMsCisJCQkJCQkJICAwLAorCQkJCQkJCSAgY21kX29wdGlvbl93YWl0Zm9ycnNwLAorCQkJCQkJCSAgMCwgKHZvaWQgKikmYWZjKTsKKwkJCQlkYXRhWzBdID0gYWZjLmFmY19hdXRvOworCQkJCWRhdGFbMV0gPSBhZmMudGltaW5nX29mZnNldDsKKwkJCQlkYXRhWzJdID0gYWZjLmNhcnJpZXJfb2Zmc2V0OworCQkJCWlmIChjb3B5X3RvX3VzZXIKKwkJCQkgICAgKHdycS0+dS5kYXRhLnBvaW50ZXIsIGRhdGEsCisJCQkJICAgICBzaXplb2YoaW50KSAqIDMpKSB7CisJCQkJCWxic19wcl9kZWJ1ZygxLCAiQ29weSB0byB1c2VyIGZhaWxlZFxuIik7CisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCX0KKworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IDM7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBXTEFOX1NDQU5QUk9CRVM6CisJCQl7CisJCQkJaW50IGRhdGE7CisJCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCA+IDApIHsKKwkJCQkJaWYgKGNvcHlfZnJvbV91c2VyCisJCQkJCSAgICAoJmRhdGEsIHdycS0+dS5kYXRhLnBvaW50ZXIsCisJCQkJCSAgICAgc2l6ZW9mKGludCkpKSB7CisJCQkJCQlsYnNfcHJfZGVidWcoMSwKKwkJCQkJCSAgICAgICAiQ29weSBmcm9tIHVzZXIgZmFpbGVkXG4iKTsKKwkJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCQl9CisKKwkJCQkJYWRhcHRlci0+c2NhbnByb2JlcyA9IGRhdGE7CisJCQkJfSBlbHNlIHsKKwkJCQkJZGF0YSA9IGFkYXB0ZXItPnNjYW5wcm9iZXM7CisJCQkJCWlmIChjb3B5X3RvX3VzZXIKKwkJCQkJICAgICh3cnEtPnUuZGF0YS5wb2ludGVyLCAmZGF0YSwKKwkJCQkJICAgICBzaXplb2YoaW50KSkpIHsKKwkJCQkJCWxic19wcl9kZWJ1ZygxLAorCQkJCQkJICAgICAgICJDb3B5IHRvIHVzZXIgZmFpbGVkXG4iKTsKKwkJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCQl9CisJCQkJfQorCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IDE7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBXTEFOX0xFRF9HUElPX0NUUkw6CisJCQl7CisJCQkJaW50IGk7CisJCQkJaW50IGRhdGFbMTZdOworCisJCQkJc3RydWN0IGNtZF9kc184MDJfMTFfbGVkX2N0cmwgY3RybDsKKwkJCQlzdHJ1Y3QgbXJ2bGlldHlwZXNfbGVkZ3BpbyAqZ3BpbyA9CisJCQkJICAgIChzdHJ1Y3QgbXJ2bGlldHlwZXNfbGVkZ3BpbyAqKSBjdHJsLmRhdGE7CisKKwkJCQltZW1zZXQoJmN0cmwsIDAsIHNpemVvZihjdHJsKSk7CisJCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCA+IE1BWF9MRURTICogMikKKwkJCQkJcmV0dXJuIC1FTk9UU1VQUDsKKwkJCQlpZiAoKHdycS0+dS5kYXRhLmxlbmd0aCAlIDIpICE9IDApCisJCQkJCXJldHVybiAtRU5PVFNVUFA7CisJCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCA9PSAwKSB7CisJCQkJCWN0cmwuYWN0aW9uID0KKwkJCQkJICAgIGNwdV90b19sZTE2CisJCQkJCSAgICAoY21kX2FjdF9nZXQpOworCQkJCX0gZWxzZSB7CisJCQkJCWlmIChjb3B5X2Zyb21fdXNlcgorCQkJCQkgICAgKGRhdGEsIHdycS0+dS5kYXRhLnBvaW50ZXIsCisJCQkJCSAgICAgc2l6ZW9mKGludCkgKgorCQkJCQkgICAgIHdycS0+dS5kYXRhLmxlbmd0aCkpIHsKKwkJCQkJCWxic19wcl9kZWJ1ZygxLAorCQkJCQkJICAgICAgICJDb3B5IGZyb20gdXNlciBmYWlsZWRcbiIpOworCQkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJCX0KKworCQkJCQljdHJsLmFjdGlvbiA9CisJCQkJCSAgICBjcHVfdG9fbGUxNgorCQkJCQkgICAgKGNtZF9hY3Rfc2V0KTsKKwkJCQkJY3RybC5udW1sZWQgPSBjcHVfdG9fbGUxNigwKTsKKwkJCQkJZ3Bpby0+aGVhZGVyLnR5cGUgPQorCQkJCQkgICAgY3B1X3RvX2xlMTYoVExWX1RZUEVfTEVEX0dQSU8pOworCQkJCQlncGlvLT5oZWFkZXIubGVuID0gd3JxLT51LmRhdGEubGVuZ3RoOworCQkJCQlmb3IgKGkgPSAwOyBpIDwgd3JxLT51LmRhdGEubGVuZ3RoOworCQkJCQkgICAgIGkgKz0gMikgeworCQkJCQkJZ3Bpby0+bGVkcGluW2kgLyAyXS5sZWQgPQorCQkJCQkJICAgIGRhdGFbaV07CisJCQkJCQlncGlvLT5sZWRwaW5baSAvIDJdLnBpbiA9CisJCQkJCQkgICAgZGF0YVtpICsgMV07CisJCQkJCX0KKwkJCQl9CisJCQkJcmV0ID0KKwkJCQkgICAgbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsCisJCQkJCQkJICBjbWRfODAyXzExX2xlZF9ncGlvX2N0cmwsCisJCQkJCQkJICAwLAorCQkJCQkJCSAgY21kX29wdGlvbl93YWl0Zm9ycnNwLAorCQkJCQkJCSAgMCwgKHZvaWQgKikmY3RybCk7CisJCQkJZm9yIChpID0gMDsgaSA8IGdwaW8tPmhlYWRlci5sZW47IGkgKz0gMikgeworCQkJCQlkYXRhW2ldID0gZ3Bpby0+bGVkcGluW2kgLyAyXS5sZWQ7CisJCQkJCWRhdGFbaSArIDFdID0gZ3Bpby0+bGVkcGluW2kgLyAyXS5waW47CisJCQkJfQorCQkJCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgZGF0YSwKKwkJCQkJCSBzaXplb2YoaW50KSAqCisJCQkJCQkgZ3Bpby0+aGVhZGVyLmxlbikpIHsKKwkJCQkJbGJzX3ByX2RlYnVnKDEsICJDb3B5IHRvIHVzZXIgZmFpbGVkXG4iKTsKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJfQorCisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gZ3Bpby0+aGVhZGVyLmxlbjsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFdMQU5fQURBUFRfUkFURVNFVDoKKwkJCXJldCA9IHdsYW5fYWRhcHRfcmF0ZXNldChwcml2LCB3cnEpOworCQkJYnJlYWs7CisJCWNhc2UgV0xBTl9JTkFDVElWSVRZX1RJTUVPVVQ6CisJCQlyZXQgPSB3bGFuX2luYWN0aXZpdHlfdGltZW91dChwcml2LCB3cnEpOworCQkJYnJlYWs7CisJCWNhc2UgV0xBTlNOUjoKKwkJCXJldCA9IHdsYW5fZ2V0X3Nucihwcml2LCB3cnEpOworCQkJYnJlYWs7CisJCWNhc2UgV0xBTl9HRVRfUlhJTkZPOgorCQkJcmV0ID0gd2xhbl9nZXRfcnhpbmZvKHByaXYsIHdycSk7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisJTEVBVkUoKTsKKwlyZXR1cm4gcmV0OworfQorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2pvaW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2pvaW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTY4MmNiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvam9pbi5jCkBAIC0wLDAgKzEsMTA1NSBAQAorLyoqCisgICogIEZ1bmN0aW9ucyBpbXBsZW1lbnRpbmcgd2xhbiBpbmZyYXN0cnVjdHVyZSBhbmQgYWRob2Mgam9pbiByb3V0aW5lcywKKyAgKiAgSU9DVEwgaGFuZGxlcnMgYXMgd2VsbCBhcyBjb21tYW5kIHByZXBlcmF0aW9uIGFuZCByZXNwb25zZSByb3V0aW5lcworICAqICBmb3Igc2VuZGluZyBhZGhvYyBzdGFydCwgYWRob2Mgam9pbiwgYW5kIGFzc29jaWF0aW9uIGNvbW1hbmRzCisgICogIHRvIHRoZSBmaXJtd2FyZS4KKyAgKi8KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorCisjaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4KKworI2luY2x1ZGUgImhvc3QuaCIKKyNpbmNsdWRlICJkZWNsLmgiCisjaW5jbHVkZSAiam9pbi5oIgorI2luY2x1ZGUgImRldi5oIgorCisvKioKKyAqICBAYnJpZWYgVGhpcyBmdW5jdGlvbiBmaW5kcyBvdXQgdGhlIGNvbW1vbiByYXRlcyBiZXR3ZWVuIHJhdGUxIGFuZCByYXRlMi4KKyAqCisgKiBJdCB3aWxsIGZpbGwgY29tbW9uIHJhdGVzIGluIHJhdGUxIGFzIG91dHB1dCBpZiBmb3VuZC4KKyAqCisgKiBOT1RFOiBTZXR0aW5nIHRoZSBNU0Igb2YgdGhlIGJhc2ljIHJhdGVzIG5lZWQgdG8gYmUgdGFrZW4KKyAqICAgY2FyZSwgZWl0aGVyIGJlZm9yZSBvciBhZnRlciBjYWxsaW5nIHRoaXMgZnVuY3Rpb24KKyAqCisgKiAgQHBhcmFtIGFkYXB0ZXIgICAgIEEgcG9pbnRlciB0byB3bGFuX2FkYXB0ZXIgc3RydWN0dXJlCisgKiAgQHBhcmFtIHJhdGUxICAgICAgIHRoZSBidWZmZXIgd2hpY2gga2VlcHMgaW5wdXQgYW5kIG91dHB1dAorICogIEBwYXJhbSByYXRlMV9zaXplICB0aGUgc2l6ZSBvZiByYXRlMSBidWZmZXIKKyAqICBAcGFyYW0gcmF0ZTIgICAgICAgdGhlIGJ1ZmZlciB3aGljaCBrZWVwcyByYXRlMgorICogIEBwYXJhbSByYXRlMl9zaXplICB0aGUgc2l6ZSBvZiByYXRlMiBidWZmZXIuCisgKgorICogIEByZXR1cm4gICAgICAgICAgICAwIG9yIC0xCisgKi8KK3N0YXRpYyBpbnQgZ2V0X2NvbW1vbl9yYXRlcyh3bGFuX2FkYXB0ZXIgKiBhZGFwdGVyLCB1OCAqIHJhdGUxLAorCQkJICAgIGludCByYXRlMV9zaXplLCB1OCAqIHJhdGUyLCBpbnQgcmF0ZTJfc2l6ZSkKK3sKKwl1OCAqcHRyID0gcmF0ZTE7CisJaW50IHJldCA9IDA7CisJdTggdG1wWzMwXTsKKwlpbnQgaTsKKworCW1lbXNldCgmdG1wLCAwLCBzaXplb2YodG1wKSk7CisJbWVtY3B5KCZ0bXAsIHJhdGUxLCBtaW5fdChzaXplX3QsIHJhdGUxX3NpemUsIHNpemVvZih0bXApKSk7CisJbWVtc2V0KHJhdGUxLCAwLCByYXRlMV9zaXplKTsKKworCS8qIE1hc2sgdGhlIHRvcCBiaXQgb2YgdGhlIG9yaWdpbmFsIHZhbHVlcyAqLworCWZvciAoaSA9IDA7IHRtcFtpXSAmJiBpIDwgc2l6ZW9mKHRtcCk7IGkrKykKKwkJdG1wW2ldICY9IDB4N0Y7CisKKwlmb3IgKGkgPSAwOyByYXRlMltpXSAmJiBpIDwgcmF0ZTJfc2l6ZTsgaSsrKSB7CisJCS8qIENoZWNrIGZvciBDYXJkIFJhdGUgaW4gdG1wLCBleGNsdWRpbmcgdGhlIHRvcCBiaXQgKi8KKwkJaWYgKHN0cmNocih0bXAsIHJhdGUyW2ldICYgMHg3RikpIHsKKwkJCS8qIHZhbHVlcyBtYXRjaCwgc28gY29weSB0aGUgQ2FyZCBSYXRlIHRvIHJhdGUxICovCisJCQkqcmF0ZTErKyA9IHJhdGUyW2ldOworCQl9CisJfQorCisJbGJzX2RiZ19oZXgoInJhdGUxIChBUCkgcmF0ZXM6IiwgdG1wLCBzaXplb2YodG1wKSk7CisJbGJzX2RiZ19oZXgoInJhdGUyIChDYXJkKSByYXRlczoiLCByYXRlMiwgcmF0ZTJfc2l6ZSk7CisJbGJzX2RiZ19oZXgoIkNvbW1vbiByYXRlczoiLCBwdHIsIHJhdGUxX3NpemUpOworCWxic19wcl9kZWJ1ZygxLCAiVHggZGF0YXJhdGUgaXMgc2V0IHRvIDB4JVhcbiIsIGFkYXB0ZXItPmRhdGFyYXRlKTsKKworCWlmICghYWRhcHRlci0+aXNfZGF0YXJhdGVfYXV0bykgeworCQl3aGlsZSAoKnB0cikgeworCQkJaWYgKCgqcHRyICYgMHg3ZikgPT0gYWRhcHRlci0+ZGF0YXJhdGUpIHsKKwkJCQlyZXQgPSAwOworCQkJCWdvdG8gZG9uZTsKKwkJCX0KKwkJCXB0cisrOworCQl9CisJCWxic19wcl9hbGVydCggIlByZXZpb3VzbHkgc2V0IGZpeGVkIGRhdGEgcmF0ZSAlI3ggaXNuJ3QgIgorCQkgICAgICAgImNvbXBhdGlibGUgd2l0aCB0aGUgbmV0d29yay5cbiIsIGFkYXB0ZXItPmRhdGFyYXRlKTsKKworCQlyZXQgPSAtMTsKKwkJZ290byBkb25lOworCX0KKworCXJldCA9IDA7Citkb25lOgorCXJldHVybiByZXQ7Cit9CisKK2ludCBsaWJlcnRhc19zZW5kX2RlYXV0aCh3bGFuX3ByaXZhdGUgKiBwcml2KQoreworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJaW50IHJldCA9IDA7CisKKwlpZiAoYWRhcHRlci0+aW5mcmFtb2RlID09IHdsYW44MDJfMTFpbmZyYXN0cnVjdHVyZSAmJgorCSAgICBhZGFwdGVyLT5jb25uZWN0X3N0YXR1cyA9PSBsaWJlcnRhc19jb25uZWN0ZWQpCisJCXJldCA9IGxpYmVydGFzX3NlbmRfZGVhdXRoZW50aWNhdGlvbihwcml2KTsKKwllbHNlCisJCXJldCA9IC1FTk9UU1VQUDsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCBsaWJlcnRhc19kb19hZGhvY3N0b3BfaW9jdGwod2xhbl9wcml2YXRlICogcHJpdikKK3sKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCWludCByZXQgPSAwOworCisJaWYgKGFkYXB0ZXItPmluZnJhbW9kZSA9PSB3bGFuODAyXzExaWJzcyAmJgorCSAgICBhZGFwdGVyLT5jb25uZWN0X3N0YXR1cyA9PSBsaWJlcnRhc19jb25uZWN0ZWQpCisJCXJldCA9IGxpYmVydGFzX3N0b3BfYWRob2NfbmV0d29yayhwcml2KTsKKwllbHNlCisJCXJldCA9IC1FTk9UU1VQUDsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogIEBicmllZiBBc3NvY2lhdGUgdG8gYSBzcGVjaWZpYyBCU1MgZGlzY292ZXJlZCBpbiBhIHNjYW4KKyAqCisgKiAgQHBhcmFtIHByaXYgICAgICBBIHBvaW50ZXIgdG8gd2xhbl9wcml2YXRlIHN0cnVjdHVyZQorICogIEBwYXJhbSBwYnNzZGVzYyAgUG9pbnRlciB0byB0aGUgQlNTIGRlc2NyaXB0b3IgdG8gYXNzb2NpYXRlIHdpdGguCisgKgorICogIEByZXR1cm4gICAgICAgICAgMC1zdWNjZXNzLCBvdGhlcndpc2UgZmFpbAorICovCitpbnQgd2xhbl9hc3NvY2lhdGUod2xhbl9wcml2YXRlICogcHJpdiwgc3RydWN0IGJzc19kZXNjcmlwdG9yICogcGJzc2Rlc2MpCit7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwlpbnQgcmV0OworCisJRU5URVIoKTsKKworCXJldCA9IGxpYmVydGFzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZChwcml2LCBjbWRfODAyXzExX2F1dGhlbnRpY2F0ZSwKKwkJCQkgICAgMCwgY21kX29wdGlvbl93YWl0Zm9ycnNwLAorCQkJCSAgICAwLCBwYnNzZGVzYy0+bWFjYWRkcmVzcyk7CisKKwlpZiAocmV0KSB7CisJCUxFQVZFKCk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogc2V0IHByZWFtYmxlIHRvIGZpcm13YXJlICovCisJaWYgKGFkYXB0ZXItPmNhcGluZm8uc2hvcnRwcmVhbWJsZSAmJiBwYnNzZGVzYy0+Y2FwLnNob3J0cHJlYW1ibGUpCisJCWFkYXB0ZXItPnByZWFtYmxlID0gY21kX3R5cGVfc2hvcnRfcHJlYW1ibGU7CisJZWxzZQorCQlhZGFwdGVyLT5wcmVhbWJsZSA9IGNtZF90eXBlX2xvbmdfcHJlYW1ibGU7CisKKwlsaWJlcnRhc19zZXRfcmFkaW9fY29udHJvbChwcml2KTsKKworCXJldCA9IGxpYmVydGFzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZChwcml2LCBjbWRfODAyXzExX2Fzc29jaWF0ZSwKKwkJCQkgICAgMCwgY21kX29wdGlvbl93YWl0Zm9ycnNwLCAwLCBwYnNzZGVzYyk7CisKKwlMRUFWRSgpOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogIEBicmllZiBTdGFydCBhbiBBZGhvYyBOZXR3b3JrCisgKgorICogIEBwYXJhbSBwcml2ICAgICAgICAgQSBwb2ludGVyIHRvIHdsYW5fcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqICBAcGFyYW0gYWRob2Nzc2lkICAgIFRoZSBzc2lkIG9mIHRoZSBBZGhvYyBOZXR3b3JrCisgKiAgQHJldHVybiAgICAgICAgICAgICAwLS1zdWNjZXNzLCAtMS0tZmFpbAorICovCitpbnQgbGliZXJ0YXNfc3RhcnRfYWRob2NfbmV0d29yayh3bGFuX3ByaXZhdGUgKiBwcml2LCBzdHJ1Y3QgV0xBTl84MDJfMTFfU1NJRCAqYWRob2Nzc2lkKQoreworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJaW50IHJldCA9IDA7CisKKwlhZGFwdGVyLT5hZGhvY2NyZWF0ZSA9IDE7CisKKwlpZiAoIWFkYXB0ZXItPmNhcGluZm8uc2hvcnRwcmVhbWJsZSkgeworCQlsYnNfcHJfZGVidWcoMSwgIkFkaG9jU3RhcnQ6IExvbmcgcHJlYW1ibGVcbiIpOworCQlhZGFwdGVyLT5wcmVhbWJsZSA9IGNtZF90eXBlX2xvbmdfcHJlYW1ibGU7CisJfSBlbHNlIHsKKwkJbGJzX3ByX2RlYnVnKDEsICJBZGhvY1N0YXJ0OiBTaG9ydCBwcmVhbWJsZVxuIik7CisJCWFkYXB0ZXItPnByZWFtYmxlID0gY21kX3R5cGVfc2hvcnRfcHJlYW1ibGU7CisJfQorCisJbGliZXJ0YXNfc2V0X3JhZGlvX2NvbnRyb2wocHJpdik7CisKKwlsYnNfcHJfZGVidWcoMSwgIkFkaG9jIGNoYW5uZWwgPSAlZFxuIiwgYWRhcHRlci0+YWRob2NjaGFubmVsKTsKKwlsYnNfcHJfZGVidWcoMSwgImN1cmJzc3BhcmFtcy5jaGFubmVsID0gJWRcbiIsCisJICAgICAgIGFkYXB0ZXItPmN1cmJzc3BhcmFtcy5jaGFubmVsKTsKKwlsYnNfcHJfZGVidWcoMSwgImN1cmJzc3BhcmFtcy5iYW5kID0gJWRcbiIsIGFkYXB0ZXItPmN1cmJzc3BhcmFtcy5iYW5kKTsKKworCXJldCA9IGxpYmVydGFzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZChwcml2LCBjbWRfODAyXzExX2FkX2hvY19zdGFydCwKKwkJCQkgICAgMCwgY21kX29wdGlvbl93YWl0Zm9ycnNwLCAwLCBhZGhvY3NzaWQpOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiAgQGJyaWVmIEpvaW4gYW4gYWRob2MgbmV0d29yayBmb3VuZCBpbiBhIHByZXZpb3VzIHNjYW4KKyAqCisgKiAgQHBhcmFtIHByaXYgICAgICAgICBBIHBvaW50ZXIgdG8gd2xhbl9wcml2YXRlIHN0cnVjdHVyZQorICogIEBwYXJhbSBwYnNzZGVzYyAgICAgUG9pbnRlciB0byBhIEJTUyBkZXNjcmlwdG9yIGZvdW5kIGluIGEgcHJldmlvdXMgc2NhbgorICogICAgICAgICAgICAgICAgICAgICAgdG8gYXR0ZW1wdCB0byBqb2luCisgKgorICogIEByZXR1cm4gICAgICAgICAgICAgMC0tc3VjY2VzcywgLTEtLWZhaWwKKyAqLworaW50IGxpYmVydGFzX2pvaW5fYWRob2NfbmV0d29yayh3bGFuX3ByaXZhdGUgKiBwcml2LCBzdHJ1Y3QgYnNzX2Rlc2NyaXB0b3IgKiBwYnNzZGVzYykKK3sKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCWludCByZXQgPSAwOworCisJbGJzX3ByX2RlYnVnKDEsICJsaWJlcnRhc19qb2luX2FkaG9jX25ldHdvcms6IEN1ckJzcy5zc2lkID0lc1xuIiwKKwkgICAgICAgYWRhcHRlci0+Y3VyYnNzcGFyYW1zLnNzaWQuc3NpZCk7CisJbGJzX3ByX2RlYnVnKDEsICJsaWJlcnRhc19qb2luX2FkaG9jX25ldHdvcms6IEN1ckJzcy5zc2lkX2xlbiA9JXVcbiIsCisJICAgICAgIGFkYXB0ZXItPmN1cmJzc3BhcmFtcy5zc2lkLnNzaWRsZW5ndGgpOworCWxic19wcl9kZWJ1ZygxLCAibGliZXJ0YXNfam9pbl9hZGhvY19uZXR3b3JrOiBzc2lkID0lc1xuIiwgcGJzc2Rlc2MtPnNzaWQuc3NpZCk7CisJbGJzX3ByX2RlYnVnKDEsICJsaWJlcnRhc19qb2luX2FkaG9jX25ldHdvcms6IHNzaWQgbGVuID0ldVxuIiwKKwkgICAgICAgcGJzc2Rlc2MtPnNzaWQuc3NpZGxlbmd0aCk7CisKKwkvKiBjaGVjayBpZiB0aGUgcmVxdWVzdGVkIFNTSUQgaXMgYWxyZWFkeSBqb2luZWQgKi8KKwlpZiAoYWRhcHRlci0+Y3VyYnNzcGFyYW1zLnNzaWQuc3NpZGxlbmd0aAorCSAgICAmJiAhbGliZXJ0YXNfU1NJRF9jbXAoJnBic3NkZXNjLT5zc2lkLCAmYWRhcHRlci0+Y3VyYnNzcGFyYW1zLnNzaWQpCisJICAgICYmIChhZGFwdGVyLT5jdXJic3NwYXJhbXMuYnNzZGVzY3JpcHRvci5pbmZyYW1vZGUgPT0KKwkJd2xhbjgwMl8xMWlic3MpKSB7CisKKyAgICAgICAgbGJzX3ByX2RlYnVnKDEsCisJCSAgICAgICAiQURIT0NfSl9DTUQ6IE5ldyBhZC1ob2MgU1NJRCBpcyB0aGUgc2FtZSBhcyBjdXJyZW50LCAiCisJCSAgICAgICAibm90IGF0dGVtcHRpbmcgdG8gcmUtam9pbiIpOworCisJCXJldHVybiAtMTsKKwl9CisKKwkvKlVzZSBzaG9ydHByZWFtYmxlIG9ubHkgd2hlbiBib3RoIGNyZWF0b3IgYW5kIGNhcmQgc3VwcG9ydHMKKwkgICBzaG9ydCBwcmVhbWJsZSAqLworCWlmICghcGJzc2Rlc2MtPmNhcC5zaG9ydHByZWFtYmxlIHx8ICFhZGFwdGVyLT5jYXBpbmZvLnNob3J0cHJlYW1ibGUpIHsKKwkJbGJzX3ByX2RlYnVnKDEsICJBZGhvY0pvaW46IExvbmcgcHJlYW1ibGVcbiIpOworCQlhZGFwdGVyLT5wcmVhbWJsZSA9IGNtZF90eXBlX2xvbmdfcHJlYW1ibGU7CisJfSBlbHNlIHsKKwkJbGJzX3ByX2RlYnVnKDEsICJBZGhvY0pvaW46IFNob3J0IHByZWFtYmxlXG4iKTsKKwkJYWRhcHRlci0+cHJlYW1ibGUgPSBjbWRfdHlwZV9zaG9ydF9wcmVhbWJsZTsKKwl9CisKKwlsaWJlcnRhc19zZXRfcmFkaW9fY29udHJvbChwcml2KTsKKworCWxic19wcl9kZWJ1ZygxLCAiY3VyYnNzcGFyYW1zLmNoYW5uZWwgPSAlZFxuIiwKKwkgICAgICAgYWRhcHRlci0+Y3VyYnNzcGFyYW1zLmNoYW5uZWwpOworCWxic19wcl9kZWJ1ZygxLCAiY3VyYnNzcGFyYW1zLmJhbmQgPSAlY1xuIiwgYWRhcHRlci0+Y3VyYnNzcGFyYW1zLmJhbmQpOworCisJYWRhcHRlci0+YWRob2NjcmVhdGUgPSAwOworCisJcmV0ID0gbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsIGNtZF84MDJfMTFfYWRfaG9jX2pvaW4sCisJCQkJICAgIDAsIGNtZF9vcHRpb25fd2FpdGZvcnJzcCwKKwkJCQkgICAgT0lEXzgwMl8xMV9TU0lELCBwYnNzZGVzYyk7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgbGliZXJ0YXNfc3RvcF9hZGhvY19uZXR3b3JrKHdsYW5fcHJpdmF0ZSAqIHByaXYpCit7CisJcmV0dXJuIGxpYmVydGFzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZChwcml2LCBjbWRfODAyXzExX2FkX2hvY19zdG9wLAorCQkJCSAgICAgMCwgY21kX29wdGlvbl93YWl0Zm9ycnNwLCAwLCBOVUxMKTsKK30KKworLyoqCisgKiAgQGJyaWVmIFNlbmQgRGVhdXRoZW50aWNhdGlvbiBSZXF1ZXN0CisgKgorICogIEBwYXJhbSBwcml2ICAgICAgQSBwb2ludGVyIHRvIHdsYW5fcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqICBAcmV0dXJuICAgICAgICAgIDAtLXN1Y2Nlc3MsIC0xLS1mYWlsCisgKi8KK2ludCBsaWJlcnRhc19zZW5kX2RlYXV0aGVudGljYXRpb24od2xhbl9wcml2YXRlICogcHJpdikKK3sKKwlyZXR1cm4gbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsIGNtZF84MDJfMTFfZGVhdXRoZW50aWNhdGUsCisJCQkJICAgICAwLCBjbWRfb3B0aW9uX3dhaXRmb3Jyc3AsIDAsIE5VTEwpOworfQorCisvKioKKyAqICBAYnJpZWYgU2V0IElkbGUgT2ZmCisgKgorICogIEBwYXJhbSBwcml2ICAgICAgICAgQSBwb2ludGVyIHRvIHdsYW5fcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqICBAcmV0dXJuICAgICAgICAgICAgIDAgLS1zdWNjZXNzLCBvdGhlcndpc2UgZmFpbAorICovCitpbnQgbGliZXJ0YXNfaWRsZV9vZmYod2xhbl9wcml2YXRlICogcHJpdikKK3sKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCWludCByZXQgPSAwOworCWNvbnN0IHU4IHplcm9tYWNbXSA9IHsgMCwgMCwgMCwgMCwgMCwgMCB9OworCWludCBpOworCisJRU5URVIoKTsKKworCWlmIChhZGFwdGVyLT5jb25uZWN0X3N0YXR1cyA9PSBsaWJlcnRhc19kaXNjb25uZWN0ZWQpIHsKKwkJaWYgKGFkYXB0ZXItPmluZnJhbW9kZSA9PSB3bGFuODAyXzExaW5mcmFzdHJ1Y3R1cmUpIHsKKwkJCWlmIChtZW1jbXAoYWRhcHRlci0+cHJldmlvdXNic3NpZCwgemVyb21hYywKKwkJCQkgICBzaXplb2YoemVyb21hYykpICE9IDApIHsKKworCQkJCWxic19wcl9kZWJ1ZygxLCAiUHJldmlvdXMgU1NJRCA9ICVzXG4iLAorCQkJCSAgICAgICBhZGFwdGVyLT5wcmV2aW91c3NzaWQuc3NpZCk7CisJCQkJbGJzX3ByX2RlYnVnKDEsICJQcmV2aW91cyBCU1NJRCA9ICIKKwkJCQkgICAgICAgIiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OlxuIiwKKwkJCQkgICAgICAgYWRhcHRlci0+cHJldmlvdXNic3NpZFswXSwKKwkJCQkgICAgICAgYWRhcHRlci0+cHJldmlvdXNic3NpZFsxXSwKKwkJCQkgICAgICAgYWRhcHRlci0+cHJldmlvdXNic3NpZFsyXSwKKwkJCQkgICAgICAgYWRhcHRlci0+cHJldmlvdXNic3NpZFszXSwKKwkJCQkgICAgICAgYWRhcHRlci0+cHJldmlvdXNic3NpZFs0XSwKKwkJCQkgICAgICAgYWRhcHRlci0+cHJldmlvdXNic3NpZFs1XSk7CisKKwkJCQlpID0gbGliZXJ0YXNfZmluZF9TU0lEX2luX2xpc3QoYWRhcHRlciwKKwkJCQkJCSAgICZhZGFwdGVyLT5wcmV2aW91c3NzaWQsCisJCQkJCQkgICBhZGFwdGVyLT5wcmV2aW91c2Jzc2lkLAorCQkJCQkJICAgYWRhcHRlci0+aW5mcmFtb2RlKTsKKworCQkJCWlmIChpIDwgMCkgeworCQkJCQlsaWJlcnRhc19zZW5kX3NwZWNpZmljX0JTU0lEX3NjYW4ocHJpdiwKKwkJCQkJCQkgICAgICBhZGFwdGVyLT4KKwkJCQkJCQkgICAgICBwcmV2aW91c2Jzc2lkLAorCQkJCQkJCSAgICAgIDEpOworCQkJCQlpID0gbGliZXJ0YXNfZmluZF9TU0lEX2luX2xpc3QoYWRhcHRlciwKKwkJCQkJCQkgICAmYWRhcHRlci0+CisJCQkJCQkJICAgcHJldmlvdXNzc2lkLAorCQkJCQkJCSAgIGFkYXB0ZXItPgorCQkJCQkJCSAgIHByZXZpb3VzYnNzaWQsCisJCQkJCQkJICAgYWRhcHRlci0+CisJCQkJCQkJICAgaW5mcmFtb2RlKTsKKwkJCQl9CisKKwkJCQlpZiAoaSA8IDApIHsKKwkJCQkJLyogSWYgdGhlIEJTU0lEIGNvdWxkIG5vdCBiZSBmb3VuZCwgdHJ5IGp1c3QgdGhlIFNTSUQgKi8KKwkJCQkJaSA9IGxpYmVydGFzX2ZpbmRfU1NJRF9pbl9saXN0KGFkYXB0ZXIsCisJCQkJCQkJICAgJmFkYXB0ZXItPgorCQkJCQkJCSAgIHByZXZpb3Vzc3NpZCwgTlVMTCwKKwkJCQkJCQkgICBhZGFwdGVyLT4KKwkJCQkJCQkgICBpbmZyYW1vZGUpOworCQkJCX0KKworCQkJCWlmIChpIDwgMCkgeworCQkJCQlsaWJlcnRhc19zZW5kX3NwZWNpZmljX1NTSURfc2Nhbihwcml2LAorCQkJCQkJCSAgICAgJmFkYXB0ZXItPgorCQkJCQkJCSAgICAgcHJldmlvdXNzc2lkLAorCQkJCQkJCSAgICAgMSk7CisJCQkJCWkgPSBsaWJlcnRhc19maW5kX1NTSURfaW5fbGlzdChhZGFwdGVyLAorCQkJCQkJCSAgICZhZGFwdGVyLT4KKwkJCQkJCQkgICBwcmV2aW91c3NzaWQsIE5VTEwsCisJCQkJCQkJICAgYWRhcHRlci0+CisJCQkJCQkJICAgaW5mcmFtb2RlKTsKKwkJCQl9CisKKwkJCQlpZiAoaSA+PSAwKSB7CisJCQkJCXJldCA9CisJCQkJCSAgICB3bGFuX2Fzc29jaWF0ZShwcml2LAorCQkJCQkJCSAgICZhZGFwdGVyLT4KKwkJCQkJCQkgICBzY2FudGFibGVbaV0pOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIGlmIChhZGFwdGVyLT5pbmZyYW1vZGUgPT0gd2xhbjgwMl8xMWlic3MpIHsKKwkJCXJldCA9IGxpYmVydGFzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZChwcml2LAorCQkJCQkJICAgIGNtZF84MDJfMTFfYWRfaG9jX3N0YXJ0LAorCQkJCQkJICAgIDAsCisJCQkJCQkgICAgY21kX29wdGlvbl93YWl0Zm9ycnNwLAorCQkJCQkJICAgIDAsICZhZGFwdGVyLT5wcmV2aW91c3NzaWQpOworCQl9CisJfQorCS8qIGVsc2UgaXQgaXMgY29ubmVjdGVkICovCisKKwlsYnNfcHJfZGVidWcoMSwgIlxud2xhbmlkbGUgaXMgb2ZmIik7CisJTEVBVkUoKTsKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqICBAYnJpZWYgU2V0IElkbGUgT24KKyAqCisgKiAgQHBhcmFtIHByaXYgICAgICAgICBBIHBvaW50ZXIgdG8gd2xhbl9wcml2YXRlIHN0cnVjdHVyZQorICogIEByZXR1cm4gICAgICAgICAgICAgMCAtLXN1Y2Nlc3MsIG90aGVyd2lzZSBmYWlsCisgKi8KK2ludCBsaWJlcnRhc19pZGxlX29uKHdsYW5fcHJpdmF0ZSAqIHByaXYpCit7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChhZGFwdGVyLT5jb25uZWN0X3N0YXR1cyA9PSBsaWJlcnRhc19jb25uZWN0ZWQpIHsKKwkJaWYgKGFkYXB0ZXItPmluZnJhbW9kZSA9PSB3bGFuODAyXzExaW5mcmFzdHJ1Y3R1cmUpIHsKKwkJCWxic19wcl9kZWJ1ZygxLCAiUHJldmlvdXMgU1NJRCA9ICVzXG4iLAorCQkJICAgICAgIGFkYXB0ZXItPnByZXZpb3Vzc3NpZC5zc2lkKTsKKwkJCW1lbW1vdmUoJmFkYXB0ZXItPnByZXZpb3Vzc3NpZCwKKwkJCQkmYWRhcHRlci0+Y3VyYnNzcGFyYW1zLnNzaWQsCisJCQkJc2l6ZW9mKHN0cnVjdCBXTEFOXzgwMl8xMV9TU0lEKSk7CisJCQlsaWJlcnRhc19zZW5kX2RlYXV0aChwcml2KTsKKworCQl9IGVsc2UgaWYgKGFkYXB0ZXItPmluZnJhbW9kZSA9PSB3bGFuODAyXzExaWJzcykgeworCQkJcmV0ID0gbGliZXJ0YXNfc3RvcF9hZGhvY19uZXR3b3JrKHByaXYpOworCQl9CisKKwl9CisKKwlsYnNfcHJfZGVidWcoMSwgIlxud2xhbmlkbGUgaXMgb24iKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogIEBicmllZiBUaGlzIGZ1bmN0aW9uIHByZXBhcmVzIGNvbW1hbmQgb2YgYXV0aGVudGljYXRlLgorICoKKyAqICBAcGFyYW0gcHJpdiAgICAgIEEgcG9pbnRlciB0byB3bGFuX3ByaXZhdGUgc3RydWN0dXJlCisgKiAgQHBhcmFtIGNtZCAgICAgICBBIHBvaW50ZXIgdG8gY21kX2RzX2NvbW1hbmQgc3RydWN0dXJlCisgKiAgQHBhcmFtIHBkYXRhX2J1ZiBWb2lkIGNhc3Qgb2YgcG9pbnRlciB0byBhIEJTU0lEIHRvIGF1dGhlbnRpY2F0ZSB3aXRoCisgKgorICogIEByZXR1cm4gICAgICAgICAwIG9yIC0xCisgKi8KK2ludCBsaWJlcnRhc19jbWRfODAyMTFfYXV0aGVudGljYXRlKHdsYW5fcHJpdmF0ZSAqIHByaXYsCisJCQkJIHN0cnVjdCBjbWRfZHNfY29tbWFuZCAqY21kLAorCQkJCSB2b2lkICpwZGF0YV9idWYpCit7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9hdXRoZW50aWNhdGUgKnBhdXRoZW50aWNhdGUgPQorCSAgICAmY21kLT5wYXJhbXMuYXV0aDsKKwl1OCAqYnNzaWQgPSBwZGF0YV9idWY7CisKKwljbWQtPmNvbW1hbmQgPSBjcHVfdG9fbGUxNihjbWRfODAyXzExX2F1dGhlbnRpY2F0ZSk7CisJY21kLT5zaXplID0KKwkgICAgY3B1X3RvX2xlMTYoc2l6ZW9mKHN0cnVjdCBjbWRfZHNfODAyXzExX2F1dGhlbnRpY2F0ZSkKKwkJCSAgICAgKyBTX0RTX0dFTik7CisKKwlwYXV0aGVudGljYXRlLT5hdXRodHlwZSA9IGFkYXB0ZXItPnNlY2luZm8uYXV0aG1vZGU7CisJbWVtY3B5KHBhdXRoZW50aWNhdGUtPm1hY2FkZHIsIGJzc2lkLCBFVEhfQUxFTik7CisKKwlsYnNfcHJfZGVidWcoMSwgIkFVVEhfQ01EOiBCc3NpZCBpcyA6ICV4OiV4OiV4OiV4OiV4OiV4XG4iLAorCSAgICAgICBic3NpZFswXSwgYnNzaWRbMV0sIGJzc2lkWzJdLCBic3NpZFszXSwgYnNzaWRbNF0sIGJzc2lkWzVdKTsKKworCXJldHVybiAwOworfQorCitpbnQgbGliZXJ0YXNfY21kXzgwMjExX2RlYXV0aGVudGljYXRlKHdsYW5fcHJpdmF0ZSAqIHByaXYsCisJCQkJICAgc3RydWN0IGNtZF9kc19jb21tYW5kICpjbWQpCit7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9kZWF1dGhlbnRpY2F0ZSAqZGF1dGggPSAmY21kLT5wYXJhbXMuZGVhdXRoOworCisJRU5URVIoKTsKKworCWNtZC0+Y29tbWFuZCA9IGNwdV90b19sZTE2KGNtZF84MDJfMTFfZGVhdXRoZW50aWNhdGUpOworCWNtZC0+c2l6ZSA9CisJICAgIGNwdV90b19sZTE2KHNpemVvZihzdHJ1Y3QgY21kX2RzXzgwMl8xMV9kZWF1dGhlbnRpY2F0ZSkgKworCQkJICAgICBTX0RTX0dFTik7CisKKwkvKiBzZXQgQVAgTUFDIGFkZHJlc3MgKi8KKwltZW1tb3ZlKGRhdXRoLT5tYWNhZGRyLCBhZGFwdGVyLT5jdXJic3NwYXJhbXMuYnNzaWQsCisJCUVUSF9BTEVOKTsKKworCS8qIFJlYXNvbiBjb2RlIDMgPSBTdGF0aW9uIGlzIGxlYXZpbmcgKi8KKyNkZWZpbmUgUkVBU09OX0NPREVfU1RBX0xFQVZJTkcgMworCWRhdXRoLT5yZWFzb25jb2RlID0gY3B1X3RvX2xlMTYoUkVBU09OX0NPREVfU1RBX0xFQVZJTkcpOworCisJTEVBVkUoKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGxpYmVydGFzX2NtZF84MDIxMV9hc3NvY2lhdGUod2xhbl9wcml2YXRlICogcHJpdiwKKwkJCSAgICAgIHN0cnVjdCBjbWRfZHNfY29tbWFuZCAqY21kLCB2b2lkICpwZGF0YV9idWYpCit7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9hc3NvY2lhdGUgKnBhc3NvID0gJmNtZC0+cGFyYW1zLmFzc29jaWF0ZTsKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgYnNzX2Rlc2NyaXB0b3IgKnBic3NkZXNjOworCXU4ICpjYXJkX3JhdGVzOworCXU4ICpwb3M7CisJaW50IGNhcmRfcmF0ZXNfc2l6ZTsKKwl1MTYgdG1wY2FwOworCXN0cnVjdCBtcnZsaWV0eXBlc19zc2lkcGFyYW1zZXQgKnNzaWQ7CisJc3RydWN0IG1ydmxpZXR5cGVzX3BoeXBhcmFtc2V0ICpwaHk7CisJc3RydWN0IG1ydmxpZXR5cGVzX3NzcGFyYW1zZXQgKnNzOworCXN0cnVjdCBtcnZsaWV0eXBlc19yYXRlc3BhcmFtc2V0ICpyYXRlczsKKwlzdHJ1Y3QgbXJ2bGlldHlwZXNfcnNucGFyYW1zZXQgKnJzbjsKKworCUVOVEVSKCk7CisKKwlwYnNzZGVzYyA9IHBkYXRhX2J1ZjsKKwlwb3MgPSAodTggKikgcGFzc287CisKKwlpZiAoIWFkYXB0ZXIpIHsKKwkJcmV0ID0gLTE7CisJCWdvdG8gZG9uZTsKKwl9CisKKwljbWQtPmNvbW1hbmQgPSBjcHVfdG9fbGUxNihjbWRfODAyXzExX2Fzc29jaWF0ZSk7CisKKwkvKiBTYXZlIHNvIHdlIGtub3cgd2hpY2ggQlNTIERlc2MgdG8gdXNlIGluIHRoZSByZXNwb25zZSBoYW5kbGVyICovCisJYWRhcHRlci0+cGF0dGVtcHRlZGJzc2Rlc2MgPSBwYnNzZGVzYzsKKworCW1lbWNweShwYXNzby0+cGVlcnN0YWFkZHIsCisJICAgICAgIHBic3NkZXNjLT5tYWNhZGRyZXNzLCBzaXplb2YocGFzc28tPnBlZXJzdGFhZGRyKSk7CisJcG9zICs9IHNpemVvZihwYXNzby0+cGVlcnN0YWFkZHIpOworCisJLyogc2V0IHRoZSBsaXN0ZW4gaW50ZXJ2YWwgKi8KKwlwYXNzby0+bGlzdGVuaW50ZXJ2YWwgPSBhZGFwdGVyLT5saXN0ZW5pbnRlcnZhbDsKKworCXBvcyArPSBzaXplb2YocGFzc28tPmNhcGluZm8pOworCXBvcyArPSBzaXplb2YocGFzc28tPmxpc3RlbmludGVydmFsKTsKKwlwb3MgKz0gc2l6ZW9mKHBhc3NvLT5iY25wZXJpb2QpOworCXBvcyArPSBzaXplb2YocGFzc28tPmR0aW1wZXJpb2QpOworCisJc3NpZCA9IChzdHJ1Y3QgbXJ2bGlldHlwZXNfc3NpZHBhcmFtc2V0ICopIHBvczsKKwlzc2lkLT5oZWFkZXIudHlwZSA9IGNwdV90b19sZTE2KFRMVl9UWVBFX1NTSUQpOworCXNzaWQtPmhlYWRlci5sZW4gPSBwYnNzZGVzYy0+c3NpZC5zc2lkbGVuZ3RoOworCW1lbWNweShzc2lkLT5zc2lkLCBwYnNzZGVzYy0+c3NpZC5zc2lkLCBzc2lkLT5oZWFkZXIubGVuKTsKKwlwb3MgKz0gc2l6ZW9mKHNzaWQtPmhlYWRlcikgKyBzc2lkLT5oZWFkZXIubGVuOworCXNzaWQtPmhlYWRlci5sZW4gPSBjcHVfdG9fbGUxNihzc2lkLT5oZWFkZXIubGVuKTsKKworCXBoeSA9IChzdHJ1Y3QgbXJ2bGlldHlwZXNfcGh5cGFyYW1zZXQgKikgcG9zOworCXBoeS0+aGVhZGVyLnR5cGUgPSBjcHVfdG9fbGUxNihUTFZfVFlQRV9QSFlfRFMpOworCXBoeS0+aGVhZGVyLmxlbiA9IHNpemVvZihwaHktPmZoX2RzLmRzcGFyYW1zZXQpOworCW1lbWNweSgmcGh5LT5maF9kcy5kc3BhcmFtc2V0LAorCSAgICAgICAmcGJzc2Rlc2MtPnBoeXBhcmFtc2V0LmRzcGFyYW1zZXQuY3VycmVudGNoYW4sCisJICAgICAgIHNpemVvZihwaHktPmZoX2RzLmRzcGFyYW1zZXQpKTsKKwlwb3MgKz0gc2l6ZW9mKHBoeS0+aGVhZGVyKSArIHBoeS0+aGVhZGVyLmxlbjsKKwlwaHktPmhlYWRlci5sZW4gPSBjcHVfdG9fbGUxNihwaHktPmhlYWRlci5sZW4pOworCisJc3MgPSAoc3RydWN0IG1ydmxpZXR5cGVzX3NzcGFyYW1zZXQgKikgcG9zOworCXNzLT5oZWFkZXIudHlwZSA9IGNwdV90b19sZTE2KFRMVl9UWVBFX0NGKTsKKwlzcy0+aGVhZGVyLmxlbiA9IHNpemVvZihzcy0+Y2ZfaWJzcy5jZnBhcmFtc2V0KTsKKwlwb3MgKz0gc2l6ZW9mKHNzLT5oZWFkZXIpICsgc3MtPmhlYWRlci5sZW47CisJc3MtPmhlYWRlci5sZW4gPSBjcHVfdG9fbGUxNihzcy0+aGVhZGVyLmxlbik7CisKKwlyYXRlcyA9IChzdHJ1Y3QgbXJ2bGlldHlwZXNfcmF0ZXNwYXJhbXNldCAqKSBwb3M7CisJcmF0ZXMtPmhlYWRlci50eXBlID0gY3B1X3RvX2xlMTYoVExWX1RZUEVfUkFURVMpOworCisJbWVtY3B5KCZyYXRlcy0+cmF0ZXMsICZwYnNzZGVzYy0+bGliZXJ0YXNfc3VwcG9ydGVkX3JhdGVzLCBXTEFOX1NVUFBPUlRFRF9SQVRFUyk7CisKKwljYXJkX3JhdGVzID0gbGliZXJ0YXNfc3VwcG9ydGVkX3JhdGVzOworCWNhcmRfcmF0ZXNfc2l6ZSA9IHNpemVvZihsaWJlcnRhc19zdXBwb3J0ZWRfcmF0ZXMpOworCisJaWYgKGdldF9jb21tb25fcmF0ZXMoYWRhcHRlciwgcmF0ZXMtPnJhdGVzLCBXTEFOX1NVUFBPUlRFRF9SQVRFUywKKwkJCSAgICAgY2FyZF9yYXRlcywgY2FyZF9yYXRlc19zaXplKSkgeworCQlyZXQgPSAtMTsKKwkJZ290byBkb25lOworCX0KKworCXJhdGVzLT5oZWFkZXIubGVuID0gbWluX3Qoc2l6ZV90LCBzdHJsZW4ocmF0ZXMtPnJhdGVzKSwgV0xBTl9TVVBQT1JURURfUkFURVMpOworCWFkYXB0ZXItPmN1cmJzc3BhcmFtcy5udW1vZnJhdGVzID0gcmF0ZXMtPmhlYWRlci5sZW47CisKKwlwb3MgKz0gc2l6ZW9mKHJhdGVzLT5oZWFkZXIpICsgcmF0ZXMtPmhlYWRlci5sZW47CisJcmF0ZXMtPmhlYWRlci5sZW4gPSBjcHVfdG9fbGUxNihyYXRlcy0+aGVhZGVyLmxlbik7CisKKwlpZiAoYWRhcHRlci0+c2VjaW5mby5XUEFlbmFibGVkIHx8IGFkYXB0ZXItPnNlY2luZm8uV1BBMmVuYWJsZWQpIHsKKwkJcnNuID0gKHN0cnVjdCBtcnZsaWV0eXBlc19yc25wYXJhbXNldCAqKSBwb3M7CisJCXJzbi0+aGVhZGVyLnR5cGUgPSAodTE2KSBhZGFwdGVyLT53cGFfaWVbMF07CS8qIFdQQV9JRSBvciBXUEEyX0lFICovCisJCXJzbi0+aGVhZGVyLnR5cGUgPSBjcHVfdG9fbGUxNihyc24tPmhlYWRlci50eXBlKTsKKwkJcnNuLT5oZWFkZXIubGVuID0gKHUxNikgYWRhcHRlci0+d3BhX2llWzFdOworCQltZW1jcHkocnNuLT5yc25pZSwgJmFkYXB0ZXItPndwYV9pZVsyXSwgcnNuLT5oZWFkZXIubGVuKTsKKwkJbGJzX2RiZ19oZXgoIkFTU09DX0NNRDogUlNOIElFIiwgKHU4ICopIHJzbiwKKwkJCXNpemVvZihyc24tPmhlYWRlcikgKyByc24tPmhlYWRlci5sZW4pOworCQlwb3MgKz0gc2l6ZW9mKHJzbi0+aGVhZGVyKSArIHJzbi0+aGVhZGVyLmxlbjsKKwkJcnNuLT5oZWFkZXIubGVuID0gY3B1X3RvX2xlMTYocnNuLT5oZWFkZXIubGVuKTsKKwl9CisKKwkvKiB1cGRhdGUgY3VyYnNzcGFyYW1zICovCisJYWRhcHRlci0+Y3VyYnNzcGFyYW1zLmNoYW5uZWwgPQorCSAgICAocGJzc2Rlc2MtPnBoeXBhcmFtc2V0LmRzcGFyYW1zZXQuY3VycmVudGNoYW4pOworCisJLyogQ29weSB0aGUgaW5mcmEuIGFzc29jaWF0aW9uIHJhdGVzIGludG8gQ3VycmVudCBCU1Mgc3RhdGUgc3RydWN0dXJlICovCisJbWVtY3B5KCZhZGFwdGVyLT5jdXJic3NwYXJhbXMuZGF0YXJhdGVzLCAmcmF0ZXMtPnJhdGVzLAorCSAgICAgICBtaW5fdChzaXplX3QsIHNpemVvZihhZGFwdGVyLT5jdXJic3NwYXJhbXMuZGF0YXJhdGVzKSwgcmF0ZXMtPmhlYWRlci5sZW4pKTsKKworCWxic19wcl9kZWJ1ZygxLCAiQVNTT0NfQ01EOiByYXRlcy0+aGVhZGVyLmxlbiA9ICVkXG4iLCByYXRlcy0+aGVhZGVyLmxlbik7CisKKwkvKiBzZXQgSUJTUyBmaWVsZCAqLworCWlmIChwYnNzZGVzYy0+aW5mcmFtb2RlID09IHdsYW44MDJfMTFpbmZyYXN0cnVjdHVyZSkgeworI2RlZmluZSBDQVBJTkZPX0VTU19NT0RFIDEKKwkJcGFzc28tPmNhcGluZm8uZXNzID0gQ0FQSU5GT19FU1NfTU9ERTsKKwl9CisKKwlpZiAobGliZXJ0YXNfcGFyc2VfZG5sZF9jb3VudHJ5aW5mb18xMWQocHJpdikpIHsKKwkJcmV0ID0gLTE7CisJCWdvdG8gZG9uZTsKKwl9CisKKwljbWQtPnNpemUgPSBjcHVfdG9fbGUxNigodTE2KSAocG9zIC0gKHU4ICopIHBhc3NvKSArIFNfRFNfR0VOKTsKKworCS8qIHNldCB0aGUgY2FwYWJpbGl0eSBpbmZvIGF0IGxhc3QgKi8KKwltZW1jcHkoJnRtcGNhcCwgJnBic3NkZXNjLT5jYXAsIHNpemVvZihwYXNzby0+Y2FwaW5mbykpOworCXRtcGNhcCAmPSBDQVBJTkZPX01BU0s7CisJbGJzX3ByX2RlYnVnKDEsICJBU1NPQ19DTUQ6IHRtcGNhcD0lNFggQ0FQSU5GT19NQVNLPSU0WFxuIiwKKwkgICAgICAgdG1wY2FwLCBDQVBJTkZPX01BU0spOworCXRtcGNhcCA9IGNwdV90b19sZTE2KHRtcGNhcCk7CisJbWVtY3B5KCZwYXNzby0+Y2FwaW5mbywgJnRtcGNhcCwgc2l6ZW9mKHBhc3NvLT5jYXBpbmZvKSk7CisKKyAgICAgIGRvbmU6CisJTEVBVkUoKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgbGliZXJ0YXNfY21kXzgwMjExX2FkX2hvY19zdGFydCh3bGFuX3ByaXZhdGUgKiBwcml2LAorCQkJCSBzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKmNtZCwgdm9pZCAqcHNzaWQpCit7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9hZF9ob2Nfc3RhcnQgKmFkaHMgPSAmY21kLT5wYXJhbXMuYWRzOworCWludCByZXQgPSAwOworCWludCBjbWRhcHBlbmRzaXplID0gMDsKKwlpbnQgaTsKKwl1MTYgdG1wY2FwOworCXN0cnVjdCBic3NfZGVzY3JpcHRvciAqcGJzc2Rlc2M7CisJc3RydWN0IFdMQU5fODAyXzExX1NTSUQgKnNzaWQgPSBwc3NpZDsKKworCUVOVEVSKCk7CisKKwlpZiAoIWFkYXB0ZXIpIHsKKwkJcmV0ID0gLTE7CisJCWdvdG8gZG9uZTsKKwl9CisKKwljbWQtPmNvbW1hbmQgPSBjcHVfdG9fbGUxNihjbWRfODAyXzExX2FkX2hvY19zdGFydCk7CisKKwlwYnNzZGVzYyA9ICZhZGFwdGVyLT5jdXJic3NwYXJhbXMuYnNzZGVzY3JpcHRvcjsKKwlhZGFwdGVyLT5wYXR0ZW1wdGVkYnNzZGVzYyA9IHBic3NkZXNjOworCisJLyoKKwkgKiBGaWxsIGluIHRoZSBwYXJhbWV0ZXJzIGZvciAyIGRhdGEgc3RydWN0dXJlczoKKwkgKiAgIDEuIGNtZF9kc184MDJfMTFfYWRfaG9jX3N0YXJ0IGNvbW1hbmQKKwkgKiAgIDIuIGFkYXB0ZXItPnNjYW50YWJsZVtpXQorCSAqCisJICogRHJpdmVyIHdpbGwgZmlsbCB1cCBTU0lELCBic3N0eXBlLElCU1MgcGFyYW0sIFBoeXNpY2FsIFBhcmFtLAorCSAqICAgcHJvYmUgZGVsYXksIGFuZCBjYXAgaW5mby4KKwkgKgorCSAqIEZpcm13YXJlIHdpbGwgZmlsbCB1cCBiZWFjb24gcGVyaW9kLCBEVElNLCBCYXNpYyByYXRlcworCSAqICAgYW5kIG9wZXJhdGlvbmFsIHJhdGVzLgorCSAqLworCisJbWVtc2V0KGFkaHMtPlNTSUQsIDAsIElXX0VTU0lEX01BWF9TSVpFKTsKKworCW1lbWNweShhZGhzLT5TU0lELCBzc2lkLT5zc2lkLCBzc2lkLT5zc2lkbGVuZ3RoKTsKKworCWxic19wcl9kZWJ1ZygxLCAiQURIT0NfU19DTUQ6IFNTSUQgPSAlc1xuIiwgYWRocy0+U1NJRCk7CisKKwltZW1zZXQocGJzc2Rlc2MtPnNzaWQuc3NpZCwgMCwgSVdfRVNTSURfTUFYX1NJWkUpOworCW1lbWNweShwYnNzZGVzYy0+c3NpZC5zc2lkLCBzc2lkLT5zc2lkLCBzc2lkLT5zc2lkbGVuZ3RoKTsKKworCXBic3NkZXNjLT5zc2lkLnNzaWRsZW5ndGggPSBzc2lkLT5zc2lkbGVuZ3RoOworCisJLyogc2V0IHRoZSBCU1MgdHlwZSAqLworCWFkaHMtPmJzc3R5cGUgPSBjbWRfYnNzX3R5cGVfaWJzczsKKwlwYnNzZGVzYy0+aW5mcmFtb2RlID0gd2xhbjgwMl8xMWlic3M7CisJYWRocy0+YmVhY29ucGVyaW9kID0gYWRhcHRlci0+YmVhY29ucGVyaW9kOworCisJLyogc2V0IFBoeXNpY2FsIHBhcmFtIHNldCAqLworI2RlZmluZSBEU19QQVJBX0lFX0lEICAgMworI2RlZmluZSBEU19QQVJBX0lFX0xFTiAgMQorCisJYWRocy0+cGh5cGFyYW1zZXQuZHNwYXJhbXNldC5lbGVtZW50aWQgPSBEU19QQVJBX0lFX0lEOworCWFkaHMtPnBoeXBhcmFtc2V0LmRzcGFyYW1zZXQubGVuID0gRFNfUEFSQV9JRV9MRU47CisKKwlXQVJOX09OKCFhZGFwdGVyLT5hZGhvY2NoYW5uZWwpOworCisJbGJzX3ByX2RlYnVnKDEsICJBREhPQ19TX0NNRDogQ3JlYXRpbmcgQURIT0Mgb24gY2hhbm5lbCAlZFxuIiwKKwkgICAgICAgYWRhcHRlci0+YWRob2NjaGFubmVsKTsKKworCWFkYXB0ZXItPmN1cmJzc3BhcmFtcy5jaGFubmVsID0gYWRhcHRlci0+YWRob2NjaGFubmVsOworCisJcGJzc2Rlc2MtPmNoYW5uZWwgPSBhZGFwdGVyLT5hZGhvY2NoYW5uZWw7CisJYWRocy0+cGh5cGFyYW1zZXQuZHNwYXJhbXNldC5jdXJyZW50Y2hhbiA9IGFkYXB0ZXItPmFkaG9jY2hhbm5lbDsKKworCW1lbWNweSgmcGJzc2Rlc2MtPnBoeXBhcmFtc2V0LAorCSAgICAgICAmYWRocy0+cGh5cGFyYW1zZXQsIHNpemVvZih1bmlvbiBpZWVldHlwZXNfcGh5cGFyYW1zZXQpKTsKKworCS8qIHNldCBJQlNTIHBhcmFtIHNldCAqLworI2RlZmluZSBJQlNTX1BBUkFfSUVfSUQgICA2CisjZGVmaW5lIElCU1NfUEFSQV9JRV9MRU4gIDIKKworCWFkaHMtPnNzcGFyYW1zZXQuaWJzc3BhcmFtc2V0LmVsZW1lbnRpZCA9IElCU1NfUEFSQV9JRV9JRDsKKwlhZGhzLT5zc3BhcmFtc2V0Lmlic3NwYXJhbXNldC5sZW4gPSBJQlNTX1BBUkFfSUVfTEVOOworCWFkaHMtPnNzcGFyYW1zZXQuaWJzc3BhcmFtc2V0LmF0aW13aW5kb3cgPSBhZGFwdGVyLT5hdGltd2luZG93OworCW1lbWNweSgmcGJzc2Rlc2MtPnNzcGFyYW1zZXQsCisJICAgICAgICZhZGhzLT5zc3BhcmFtc2V0LCBzaXplb2YodW5pb24gSUVFRXR5cGVzX3NzcGFyYW1zZXQpKTsKKworCS8qIHNldCBjYXBhYmlsaXR5IGluZm8gKi8KKwlhZGhzLT5jYXAuZXNzID0gMDsKKwlhZGhzLT5jYXAuaWJzcyA9IDE7CisJcGJzc2Rlc2MtPmNhcC5pYnNzID0gMTsKKworCS8qIHByb2JlZGVsYXkgKi8KKwlhZGhzLT5wcm9iZWRlbGF5ID0gY3B1X3RvX2xlMTYoY21kX3NjYW5fcHJvYmVfZGVsYXlfdGltZSk7CisKKwkvKiBzZXQgdXAgcHJpdmFjeSBpbiBhZGFwdGVyLT5zY2FudGFibGVbaV0gKi8KKwlpZiAoYWRhcHRlci0+c2VjaW5mby5XRVBzdGF0dXMgPT0gd2xhbjgwMl8xMVdFUGVuYWJsZWQpIHsKKworI2RlZmluZSBBRF9IT0NfQ0FQX1BSSVZBQ1lfT04gMQorCQlsYnNfcHJfZGVidWcoMSwgIkFESE9DX1NfQ01EOiBXRVBzdGF0dXMgc2V0LCBwcml2YWN5IHRvIFdFUFxuIik7CisJCXBic3NkZXNjLT5wcml2YWN5ID0gd2xhbjgwMl8xMXByaXZmaWx0ZXI4MDIxeFdFUDsKKwkJYWRocy0+Y2FwLnByaXZhY3kgPSBBRF9IT0NfQ0FQX1BSSVZBQ1lfT047CisJfSBlbHNlIHsKKwkJbGJzX3ByX2RlYnVnKDEsICJBREhPQ19TX0NNRDogV0VQc3RhdHVzIE5PVCBzZXQsIFNldHRpbmcgIgorCQkgICAgICAgInByaXZhY3kgdG8gQUNDRVBUIEFMTFxuIik7CisJCXBic3NkZXNjLT5wcml2YWN5ID0gd2xhbjgwMl8xMXByaXZmaWx0ZXJhY2NlcHRhbGw7CisJfQorCisJbWVtc2V0KGFkaHMtPmRhdGFyYXRlLCAwLCBzaXplb2YoYWRocy0+ZGF0YXJhdGUpKTsKKworCWlmIChhZGFwdGVyLT5hZGhvY19ncmF0ZV9lbmFibGVkKSB7CisJCW1lbWNweShhZGhzLT5kYXRhcmF0ZSwgbGliZXJ0YXNfYWRob2NfcmF0ZXNfZywKKwkJICAgICAgIG1pbihzaXplb2YoYWRocy0+ZGF0YXJhdGUpLCBzaXplb2YobGliZXJ0YXNfYWRob2NfcmF0ZXNfZykpKTsKKwl9IGVsc2UgeworCQltZW1jcHkoYWRocy0+ZGF0YXJhdGUsIGxpYmVydGFzX2FkaG9jX3JhdGVzX2IsCisJCSAgICAgICBtaW4oc2l6ZW9mKGFkaHMtPmRhdGFyYXRlKSwgc2l6ZW9mKGxpYmVydGFzX2FkaG9jX3JhdGVzX2IpKSk7CisJfQorCisJLyogRmluZCB0aGUgbGFzdCBub24gemVybyAqLworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YoYWRocy0+ZGF0YXJhdGUpICYmIGFkaHMtPmRhdGFyYXRlW2ldOyBpKyspIDsKKworCWFkYXB0ZXItPmN1cmJzc3BhcmFtcy5udW1vZnJhdGVzID0gaTsKKworCS8qIENvcHkgdGhlIGFkLWhvYyBjcmVhdGluZyByYXRlcyBpbnRvIEN1cnJlbnQgQlNTIHN0YXRlIHN0cnVjdHVyZSAqLworCW1lbWNweSgmYWRhcHRlci0+Y3VyYnNzcGFyYW1zLmRhdGFyYXRlcywKKwkgICAgICAgJmFkaHMtPmRhdGFyYXRlLCBhZGFwdGVyLT5jdXJic3NwYXJhbXMubnVtb2ZyYXRlcyk7CisKKwlsYnNfcHJfZGVidWcoMSwgIkFESE9DX1NfQ01EOiByYXRlcz0lMDJ4ICUwMnggJTAyeCAlMDJ4IFxuIiwKKwkgICAgICAgYWRocy0+ZGF0YXJhdGVbMF0sIGFkaHMtPmRhdGFyYXRlWzFdLAorCSAgICAgICBhZGhzLT5kYXRhcmF0ZVsyXSwgYWRocy0+ZGF0YXJhdGVbM10pOworCisJbGJzX3ByX2RlYnVnKDEsICJBREhPQ19TX0NNRDogQUQgSE9DIFN0YXJ0IGNvbW1hbmQgaXMgcmVhZHlcbiIpOworCisJaWYgKGxpYmVydGFzX2NyZWF0ZV9kbmxkX2NvdW50cnlpbmZvXzExZChwcml2KSkgeworCQlsYnNfcHJfZGVidWcoMSwgIkFESE9DX1NfQ01EOiBkbmxkX2NvdW50cnlpbmZvXzExZCBmYWlsZWRcbiIpOworCQlyZXQgPSAtMTsKKwkJZ290byBkb25lOworCX0KKworCWNtZC0+c2l6ZSA9CisJICAgIGNwdV90b19sZTE2KHNpemVvZihzdHJ1Y3QgY21kX2RzXzgwMl8xMV9hZF9ob2Nfc3RhcnQpCisJCQkgICAgICsgU19EU19HRU4gKyBjbWRhcHBlbmRzaXplKTsKKworCW1lbWNweSgmdG1wY2FwLCAmYWRocy0+Y2FwLCBzaXplb2YodTE2KSk7CisJdG1wY2FwID0gY3B1X3RvX2xlMTYodG1wY2FwKTsKKwltZW1jcHkoJmFkaHMtPmNhcCwgJnRtcGNhcCwgc2l6ZW9mKHUxNikpOworCisJcmV0ID0gMDsKK2RvbmU6CisJTEVBVkUoKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgbGliZXJ0YXNfY21kXzgwMjExX2FkX2hvY19zdG9wKHdsYW5fcHJpdmF0ZSAqIHByaXYsCisJCQkJc3RydWN0IGNtZF9kc19jb21tYW5kICpjbWQpCit7CisJY21kLT5jb21tYW5kID0gY3B1X3RvX2xlMTYoY21kXzgwMl8xMV9hZF9ob2Nfc3RvcCk7CisJY21kLT5zaXplID0gY3B1X3RvX2xlMTYoU19EU19HRU4pOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBsaWJlcnRhc19jbWRfODAyMTFfYWRfaG9jX2pvaW4od2xhbl9wcml2YXRlICogcHJpdiwKKwkJCQlzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKmNtZCwgdm9pZCAqcGRhdGFfYnVmKQoreworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJc3RydWN0IGNtZF9kc184MDJfMTFfYWRfaG9jX2pvaW4gKnBhZGhvY2pvaW4gPSAmY21kLT5wYXJhbXMuYWRqOworCXN0cnVjdCBic3NfZGVzY3JpcHRvciAqcGJzc2Rlc2MgPSBwZGF0YV9idWY7CisJaW50IGNtZGFwcGVuZHNpemUgPSAwOworCWludCByZXQgPSAwOworCXU4ICpjYXJkX3JhdGVzOworCWludCBjYXJkX3JhdGVzX3NpemU7CisJdTE2IHRtcGNhcDsKKwlpbnQgaTsKKworCUVOVEVSKCk7CisKKwlhZGFwdGVyLT5wYXR0ZW1wdGVkYnNzZGVzYyA9IHBic3NkZXNjOworCisJY21kLT5jb21tYW5kID0gY3B1X3RvX2xlMTYoY21kXzgwMl8xMV9hZF9ob2Nfam9pbik7CisKKwlwYWRob2Nqb2luLT5ic3NkZXNjcmlwdG9yLmJzc3R5cGUgPSBjbWRfYnNzX3R5cGVfaWJzczsKKworCXBhZGhvY2pvaW4tPmJzc2Rlc2NyaXB0b3IuYmVhY29ucGVyaW9kID0gcGJzc2Rlc2MtPmJlYWNvbnBlcmlvZDsKKworCW1lbWNweSgmcGFkaG9jam9pbi0+YnNzZGVzY3JpcHRvci5CU1NJRCwKKwkgICAgICAgJnBic3NkZXNjLT5tYWNhZGRyZXNzLCBFVEhfQUxFTik7CisKKwltZW1jcHkoJnBhZGhvY2pvaW4tPmJzc2Rlc2NyaXB0b3IuU1NJRCwKKwkgICAgICAgJnBic3NkZXNjLT5zc2lkLnNzaWQsIHBic3NkZXNjLT5zc2lkLnNzaWRsZW5ndGgpOworCisJbWVtY3B5KCZwYWRob2Nqb2luLT5ic3NkZXNjcmlwdG9yLnBoeXBhcmFtc2V0LAorCSAgICAgICAmcGJzc2Rlc2MtPnBoeXBhcmFtc2V0LCBzaXplb2YodW5pb24gaWVlZXR5cGVzX3BoeXBhcmFtc2V0KSk7CisKKwltZW1jcHkoJnBhZGhvY2pvaW4tPmJzc2Rlc2NyaXB0b3Iuc3NwYXJhbXNldCwKKwkgICAgICAgJnBic3NkZXNjLT5zc3BhcmFtc2V0LCBzaXplb2YodW5pb24gSUVFRXR5cGVzX3NzcGFyYW1zZXQpKTsKKworCW1lbWNweSgmdG1wY2FwLCAmcGJzc2Rlc2MtPmNhcCwgc2l6ZW9mKHN0cnVjdCBpZWVldHlwZXNfY2FwaW5mbykpOworCXRtcGNhcCAmPSBDQVBJTkZPX01BU0s7CisKKwlsYnNfcHJfZGVidWcoMSwgIkFESE9DX0pfQ01EOiB0bXBjYXA9JTRYIENBUElORk9fTUFTSz0lNFhcbiIsCisJICAgICAgIHRtcGNhcCwgQ0FQSU5GT19NQVNLKTsKKwltZW1jcHkoJnBhZGhvY2pvaW4tPmJzc2Rlc2NyaXB0b3IuY2FwLCAmdG1wY2FwLAorCSAgICAgICBzaXplb2Yoc3RydWN0IGllZWV0eXBlc19jYXBpbmZvKSk7CisKKwkvKiBpbmZvcm1hdGlvbiBvbiBCU1NJRCBkZXNjcmlwdG9yIHBhc3NlZCB0byBGVyAqLworICAgIGxic19wcl9kZWJ1ZygxLAorCSAgICAgICAiQURIT0NfSl9DTUQ6IEJTU0lEID0gJTJ4LSUyeC0lMngtJTJ4LSUyeC0lMngsIFNTSUQgPSAlc1xuIiwKKwkgICAgICAgcGFkaG9jam9pbi0+YnNzZGVzY3JpcHRvci5CU1NJRFswXSwKKwkgICAgICAgcGFkaG9jam9pbi0+YnNzZGVzY3JpcHRvci5CU1NJRFsxXSwKKwkgICAgICAgcGFkaG9jam9pbi0+YnNzZGVzY3JpcHRvci5CU1NJRFsyXSwKKwkgICAgICAgcGFkaG9jam9pbi0+YnNzZGVzY3JpcHRvci5CU1NJRFszXSwKKwkgICAgICAgcGFkaG9jam9pbi0+YnNzZGVzY3JpcHRvci5CU1NJRFs0XSwKKwkgICAgICAgcGFkaG9jam9pbi0+YnNzZGVzY3JpcHRvci5CU1NJRFs1XSwKKwkgICAgICAgcGFkaG9jam9pbi0+YnNzZGVzY3JpcHRvci5TU0lEKTsKKworCWxic19wcl9kZWJ1ZygxLCAiQURIT0NfSl9DTUQ6IERhdGEgUmF0ZSA9ICV4XG4iLAorCSAgICAgICAodTMyKSBwYWRob2Nqb2luLT5ic3NkZXNjcmlwdG9yLmRhdGFyYXRlcyk7CisKKwkvKiBmYWlsdGltZW91dCAqLworCXBhZGhvY2pvaW4tPmZhaWx0aW1lb3V0ID0gY3B1X3RvX2xlMTYoTVJWRFJWX0FTU09DSUFUSU9OX1RJTUVfT1VUKTsKKworCS8qIHByb2JlZGVsYXkgKi8KKwlwYWRob2Nqb2luLT5wcm9iZWRlbGF5ID0KKwkgICAgY3B1X3RvX2xlMTYoY21kX3NjYW5fcHJvYmVfZGVsYXlfdGltZSk7CisKKwkvKiBDb3B5IERhdGEgcmF0ZXMgZnJvbSB0aGUgcmF0ZXMgcmVjb3JkZWQgaW4gc2NhbiByZXNwb25zZSAqLworCW1lbXNldChwYWRob2Nqb2luLT5ic3NkZXNjcmlwdG9yLmRhdGFyYXRlcywgMCwKKwkgICAgICAgc2l6ZW9mKHBhZGhvY2pvaW4tPmJzc2Rlc2NyaXB0b3IuZGF0YXJhdGVzKSk7CisJbWVtY3B5KHBhZGhvY2pvaW4tPmJzc2Rlc2NyaXB0b3IuZGF0YXJhdGVzLCBwYnNzZGVzYy0+ZGF0YXJhdGVzLAorCSAgICAgICBtaW4oc2l6ZW9mKHBhZGhvY2pvaW4tPmJzc2Rlc2NyaXB0b3IuZGF0YXJhdGVzKSwKKwkJICAgc2l6ZW9mKHBic3NkZXNjLT5kYXRhcmF0ZXMpKSk7CisKKwljYXJkX3JhdGVzID0gbGliZXJ0YXNfc3VwcG9ydGVkX3JhdGVzOworCWNhcmRfcmF0ZXNfc2l6ZSA9IHNpemVvZihsaWJlcnRhc19zdXBwb3J0ZWRfcmF0ZXMpOworCisJYWRhcHRlci0+Y3VyYnNzcGFyYW1zLmNoYW5uZWwgPSBwYnNzZGVzYy0+Y2hhbm5lbDsKKworCWlmIChnZXRfY29tbW9uX3JhdGVzKGFkYXB0ZXIsIHBhZGhvY2pvaW4tPmJzc2Rlc2NyaXB0b3IuZGF0YXJhdGVzLAorCQkJICAgICBzaXplb2YocGFkaG9jam9pbi0+YnNzZGVzY3JpcHRvci5kYXRhcmF0ZXMpLAorCQkJICAgICBjYXJkX3JhdGVzLCBjYXJkX3JhdGVzX3NpemUpKSB7CisJCWxic19wcl9kZWJ1ZygxLCAiQURIT0NfSl9DTUQ6IGdldF9jb21tb25fcmF0ZXMgcmV0dXJucyBlcnJvci5cbiIpOworCQlyZXQgPSAtMTsKKwkJZ290byBkb25lOworCX0KKworCS8qIEZpbmQgdGhlIGxhc3Qgbm9uIHplcm8gKi8KKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHBhZGhvY2pvaW4tPmJzc2Rlc2NyaXB0b3IuZGF0YXJhdGVzKQorCSAgICAgJiYgcGFkaG9jam9pbi0+YnNzZGVzY3JpcHRvci5kYXRhcmF0ZXNbaV07IGkrKykgOworCisJYWRhcHRlci0+Y3VyYnNzcGFyYW1zLm51bW9mcmF0ZXMgPSBpOworCisJLyoKKwkgKiBDb3B5IHRoZSBhZGhvYyBqb2luaW5nIHJhdGVzIHRvIEN1cnJlbnQgQlNTIFN0YXRlIHN0cnVjdHVyZQorCSAqLworCW1lbWNweShhZGFwdGVyLT5jdXJic3NwYXJhbXMuZGF0YXJhdGVzLAorCSAgICAgICBwYWRob2Nqb2luLT5ic3NkZXNjcmlwdG9yLmRhdGFyYXRlcywKKwkgICAgICAgYWRhcHRlci0+Y3VyYnNzcGFyYW1zLm51bW9mcmF0ZXMpOworCisJcGFkaG9jam9pbi0+YnNzZGVzY3JpcHRvci5zc3BhcmFtc2V0Lmlic3NwYXJhbXNldC5hdGltd2luZG93ID0KKwkgICAgY3B1X3RvX2xlMTYocGJzc2Rlc2MtPmF0aW13aW5kb3cpOworCisJaWYgKGFkYXB0ZXItPnNlY2luZm8uV0VQc3RhdHVzID09IHdsYW44MDJfMTFXRVBlbmFibGVkKSB7CisJCXBhZGhvY2pvaW4tPmJzc2Rlc2NyaXB0b3IuY2FwLnByaXZhY3kgPSBBRF9IT0NfQ0FQX1BSSVZBQ1lfT047CisJfQorCisJaWYgKGFkYXB0ZXItPnBzbW9kZSA9PSB3bGFuODAyXzExcG93ZXJtb2RlbWF4X3BzcCkgeworCQkvKiB3YWtlIHVwIGZpcnN0ICovCisJCWVudW0gV0xBTl84MDJfMTFfUE9XRVJfTU9ERSBMb2NhbHBzbW9kZTsKKworCQlMb2NhbHBzbW9kZSA9IHdsYW44MDJfMTFwb3dlcm1vZGVjYW07CisJCXJldCA9IGxpYmVydGFzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZChwcml2LAorCQkJCQkgICAgY21kXzgwMl8xMV9wc19tb2RlLAorCQkJCQkgICAgY21kX2FjdF9zZXQsCisJCQkJCSAgICAwLCAwLCAmTG9jYWxwc21vZGUpOworCisJCWlmIChyZXQpIHsKKwkJCXJldCA9IC0xOworCQkJZ290byBkb25lOworCQl9CisJfQorCisJaWYgKGxpYmVydGFzX3BhcnNlX2RubGRfY291bnRyeWluZm9fMTFkKHByaXYpKSB7CisJCXJldCA9IC0xOworCQlnb3RvIGRvbmU7CisJfQorCisJY21kLT5zaXplID0KKwkgICAgY3B1X3RvX2xlMTYoc2l6ZW9mKHN0cnVjdCBjbWRfZHNfODAyXzExX2FkX2hvY19qb2luKQorCQkJICAgICArIFNfRFNfR0VOICsgY21kYXBwZW5kc2l6ZSk7CisKKwltZW1jcHkoJnRtcGNhcCwgJnBhZGhvY2pvaW4tPmJzc2Rlc2NyaXB0b3IuY2FwLAorCSAgICAgICBzaXplb2Yoc3RydWN0IGllZWV0eXBlc19jYXBpbmZvKSk7CisJdG1wY2FwID0gY3B1X3RvX2xlMTYodG1wY2FwKTsKKworCW1lbWNweSgmcGFkaG9jam9pbi0+YnNzZGVzY3JpcHRvci5jYXAsCisJICAgICAgICZ0bXBjYXAsIHNpemVvZihzdHJ1Y3QgaWVlZXR5cGVzX2NhcGluZm8pKTsKKworICAgICAgZG9uZToKKwlMRUFWRSgpOworCXJldHVybiByZXQ7Cit9CisKK2ludCBsaWJlcnRhc19yZXRfODAyMTFfYXNzb2NpYXRlKHdsYW5fcHJpdmF0ZSAqIHByaXYsCisJCQkgICAgICBzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKnJlc3ApCit7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwlpbnQgcmV0ID0gMDsKKwl1bmlvbiBpd3JlcV9kYXRhIHdycXU7CisJc3RydWN0IGllZWV0eXBlc19hc3NvY3JzcCAqcGFzc29jcnNwOworCXN0cnVjdCBic3NfZGVzY3JpcHRvciAqcGJzc2Rlc2M7CisKKwlFTlRFUigpOworCisJcGFzc29jcnNwID0gKHN0cnVjdCBpZWVldHlwZXNfYXNzb2Nyc3AgKikgJiByZXNwLT5wYXJhbXM7CisKKwlpZiAocGFzc29jcnNwLT5zdGF0dXNjb2RlKSB7CisKKwkJbGliZXJ0YXNfbWFjX2V2ZW50X2Rpc2Nvbm5lY3RlZChwcml2KTsKKworICAgICAgICBsYnNfcHJfZGVidWcoMSwKKwkJICAgICAgICJBU1NPQ19SRVNQOiBBc3NvY2lhdGlvbiBmYWlsZWQsIHN0YXR1cyBjb2RlID0gJWRcbiIsCisJCSAgICAgICBwYXNzb2Nyc3AtPnN0YXR1c2NvZGUpOworCisJCXJldCA9IC0xOworCQlnb3RvIGRvbmU7CisJfQorCisJbGJzX2RiZ19oZXgoIkFTU09DX1JFU1A6IiwgKHZvaWQgKikmcmVzcC0+cGFyYW1zLAorCQlsZTE2X3RvX2NwdShyZXNwLT5zaXplKSAtIFNfRFNfR0VOKTsKKworCS8qIFNlbmQgYSBNZWRpYSBDb25uZWN0ZWQgZXZlbnQsIGFjY29yZGluZyB0byB0aGUgU3BlYyAqLworCWFkYXB0ZXItPmNvbm5lY3Rfc3RhdHVzID0gbGliZXJ0YXNfY29ubmVjdGVkOworCisJLyogU2V0IHRoZSBhdHRlbXB0ZWQgQlNTSUQgSW5kZXggdG8gY3VycmVudCAqLworCXBic3NkZXNjID0gYWRhcHRlci0+cGF0dGVtcHRlZGJzc2Rlc2M7CisKKwlsYnNfcHJfZGVidWcoMSwgIkFTU09DX1JFU1A6ICVzXG4iLCBwYnNzZGVzYy0+c3NpZC5zc2lkKTsKKworCS8qIFNldCB0aGUgbmV3IFNTSUQgdG8gY3VycmVudCBTU0lEICovCisJbWVtY3B5KCZhZGFwdGVyLT5jdXJic3NwYXJhbXMuc3NpZCwKKwkgICAgICAgJnBic3NkZXNjLT5zc2lkLCBzaXplb2Yoc3RydWN0IFdMQU5fODAyXzExX1NTSUQpKTsKKworCS8qIFNldCB0aGUgbmV3IEJTU0lEIChBUCdzIE1BQyBhZGRyZXNzKSB0byBjdXJyZW50IEJTU0lEICovCisJbWVtY3B5KGFkYXB0ZXItPmN1cmJzc3BhcmFtcy5ic3NpZCwKKwkgICAgICAgcGJzc2Rlc2MtPm1hY2FkZHJlc3MsIEVUSF9BTEVOKTsKKworCS8qIE1ha2UgYSBjb3B5IG9mIGN1cnJlbnQgQlNTSUQgZGVzY3JpcHRvciAqLworCW1lbWNweSgmYWRhcHRlci0+Y3VyYnNzcGFyYW1zLmJzc2Rlc2NyaXB0b3IsCisJICAgICAgIHBic3NkZXNjLCBzaXplb2Yoc3RydWN0IGJzc19kZXNjcmlwdG9yKSk7CisKKwlsYnNfcHJfZGVidWcoMSwgIkFTU09DX1JFU1A6IGN1cnJlbnRwYWNrZXRmaWx0ZXIgaXMgJXhcbiIsCisJICAgICAgIGFkYXB0ZXItPmN1cnJlbnRwYWNrZXRmaWx0ZXIpOworCisJYWRhcHRlci0+U05SW1RZUEVfUlhQRF1bVFlQRV9BVkddID0gMDsKKwlhZGFwdGVyLT5ORltUWVBFX1JYUERdW1RZUEVfQVZHXSA9IDA7CisKKwltZW1zZXQoYWRhcHRlci0+cmF3U05SLCAweDAwLCBzaXplb2YoYWRhcHRlci0+cmF3U05SKSk7CisJbWVtc2V0KGFkYXB0ZXItPnJhd05GLCAweDAwLCBzaXplb2YoYWRhcHRlci0+cmF3TkYpKTsKKwlhZGFwdGVyLT5uZXh0U05STkYgPSAwOworCWFkYXB0ZXItPm51bVNOUk5GID0gMDsKKworCW5ldGlmX2NhcnJpZXJfb24ocHJpdi0+d2xhbl9kZXYubmV0ZGV2KTsKKwluZXRpZl93YWtlX3F1ZXVlKHByaXYtPndsYW5fZGV2Lm5ldGRldik7CisKKwlsYnNfcHJfZGVidWcoMSwgIkFTU09DX1JFU1A6IEFzc29jaWF0ZWQgXG4iKTsKKworCW1lbWNweSh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgYWRhcHRlci0+Y3VyYnNzcGFyYW1zLmJzc2lkLCBFVEhfQUxFTik7CisJd3JxdS5hcF9hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKwl3aXJlbGVzc19zZW5kX2V2ZW50KHByaXYtPndsYW5fZGV2Lm5ldGRldiwgU0lPQ0dJV0FQLCAmd3JxdSwgTlVMTCk7CisKKyAgICAgIGRvbmU6CisJTEVBVkUoKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgbGliZXJ0YXNfcmV0XzgwMjExX2Rpc2Fzc29jaWF0ZSh3bGFuX3ByaXZhdGUgKiBwcml2LAorCQkJCSBzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKnJlc3ApCit7CisJRU5URVIoKTsKKworCWxpYmVydGFzX21hY19ldmVudF9kaXNjb25uZWN0ZWQocHJpdik7CisKKwlMRUFWRSgpOworCXJldHVybiAwOworfQorCitpbnQgbGliZXJ0YXNfcmV0XzgwMjExX2FkX2hvY19zdGFydCh3bGFuX3ByaXZhdGUgKiBwcml2LAorCQkJCSBzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKnJlc3ApCit7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwlpbnQgcmV0ID0gMDsKKwl1MTYgY29tbWFuZCA9IGxlMTZfdG9fY3B1KHJlc3AtPmNvbW1hbmQpOworCXUxNiByZXN1bHQgPSBsZTE2X3RvX2NwdShyZXNwLT5yZXN1bHQpOworCXN0cnVjdCBjbWRfZHNfODAyXzExX2FkX2hvY19yZXN1bHQgKnBhZGhvY3Jlc3VsdDsKKwl1bmlvbiBpd3JlcV9kYXRhIHdycXU7CisJc3RydWN0IGJzc19kZXNjcmlwdG9yICpwYnNzZGVzYzsKKworCUVOVEVSKCk7CisKKwlwYWRob2NyZXN1bHQgPSAmcmVzcC0+cGFyYW1zLnJlc3VsdDsKKworCWxic19wcl9kZWJ1ZygxLCAiQURIT0NfU19SRVNQOiBzaXplID0gJWRcbiIsIGxlMTZfdG9fY3B1KHJlc3AtPnNpemUpKTsKKwlsYnNfcHJfZGVidWcoMSwgIkFESE9DX1NfUkVTUDogY29tbWFuZCA9ICV4XG4iLCBjb21tYW5kKTsKKwlsYnNfcHJfZGVidWcoMSwgIkFESE9DX1NfUkVTUDogcmVzdWx0ID0gJXhcbiIsIHJlc3VsdCk7CisKKwlwYnNzZGVzYyA9IGFkYXB0ZXItPnBhdHRlbXB0ZWRic3NkZXNjOworCisJLyoKKwkgKiBKb2luIHJlc3VsdCBjb2RlIDAgLS0+IFNVQ0NFU1MKKwkgKi8KKwlpZiAocmVzdWx0KSB7CisJCWxic19wcl9kZWJ1ZygxLCAiQURIT0NfUkVTUCBmYWlsZWRcbiIpOworCQlpZiAoYWRhcHRlci0+Y29ubmVjdF9zdGF0dXMgPT0gbGliZXJ0YXNfY29ubmVjdGVkKSB7CisJCQlsaWJlcnRhc19tYWNfZXZlbnRfZGlzY29ubmVjdGVkKHByaXYpOworCQl9CisKKwkJbWVtc2V0KCZhZGFwdGVyLT5jdXJic3NwYXJhbXMuYnNzZGVzY3JpcHRvciwKKwkJICAgICAgIDB4MDAsIHNpemVvZihhZGFwdGVyLT5jdXJic3NwYXJhbXMuYnNzZGVzY3JpcHRvcikpOworCisJCUxFQVZFKCk7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKgorCSAqIE5vdyB0aGUgam9pbiBjbWQgc2hvdWxkIGJlIHN1Y2Nlc3NmdWwKKwkgKiBJZiBCU1NJRCBoYXMgY2hhbmdlZCB1c2UgU1NJRCB0byBjb21wYXJlIGluc3RlYWQgb2YgQlNTSUQKKwkgKi8KKwlsYnNfcHJfZGVidWcoMSwgIkFESE9DX0pfUkVTUCAgJXNcbiIsIHBic3NkZXNjLT5zc2lkLnNzaWQpOworCisJLyogU2VuZCBhIE1lZGlhIENvbm5lY3RlZCBldmVudCwgYWNjb3JkaW5nIHRvIHRoZSBTcGVjICovCisJYWRhcHRlci0+Y29ubmVjdF9zdGF0dXMgPSBsaWJlcnRhc19jb25uZWN0ZWQ7CisKKwlpZiAoY29tbWFuZCA9PSBjbWRfcmV0XzgwMl8xMV9hZF9ob2Nfc3RhcnQpIHsKKwkJLyogVXBkYXRlIHRoZSBjcmVhdGVkIG5ldHdvcmsgZGVzY3JpcHRvciB3aXRoIHRoZSBuZXcgQlNTSUQgKi8KKwkJbWVtY3B5KHBic3NkZXNjLT5tYWNhZGRyZXNzLAorCQkgICAgICAgcGFkaG9jcmVzdWx0LT5CU1NJRCwgRVRIX0FMRU4pOworCX0gZWxzZSB7CisKKwkJLyogTWFrZSBhIGNvcHkgb2YgY3VycmVudCBCU1NJRCBkZXNjcmlwdG9yLCBvbmx5IG5lZWRlZCBmb3Igam9pbiBzaW5jZQorCQkgKiAgIHRoZSBjdXJyZW50IGRlc2NyaXB0b3IgaXMgYWxyZWFkeSBiZWluZyB1c2VkIGZvciBhZGhvYyBzdGFydAorCQkgKi8KKwkJbWVtbW92ZSgmYWRhcHRlci0+Y3VyYnNzcGFyYW1zLmJzc2Rlc2NyaXB0b3IsCisJCQlwYnNzZGVzYywgc2l6ZW9mKHN0cnVjdCBic3NfZGVzY3JpcHRvcikpOworCX0KKworCS8qIFNldCB0aGUgQlNTSUQgZnJvbSB0aGUgam9pbmVkL3N0YXJ0ZWQgZGVzY3JpcHRvciAqLworCW1lbWNweSgmYWRhcHRlci0+Y3VyYnNzcGFyYW1zLmJzc2lkLAorCSAgICAgICBwYnNzZGVzYy0+bWFjYWRkcmVzcywgRVRIX0FMRU4pOworCisJLyogU2V0IHRoZSBuZXcgU1NJRCB0byBjdXJyZW50IFNTSUQgKi8KKwltZW1jcHkoJmFkYXB0ZXItPmN1cmJzc3BhcmFtcy5zc2lkLAorCSAgICAgICAmcGJzc2Rlc2MtPnNzaWQsIHNpemVvZihzdHJ1Y3QgV0xBTl84MDJfMTFfU1NJRCkpOworCisJbmV0aWZfY2Fycmllcl9vbihwcml2LT53bGFuX2Rldi5uZXRkZXYpOworCW5ldGlmX3dha2VfcXVldWUocHJpdi0+d2xhbl9kZXYubmV0ZGV2KTsKKworCW1lbXNldCgmd3JxdSwgMCwgc2l6ZW9mKHdycXUpKTsKKwltZW1jcHkod3JxdS5hcF9hZGRyLnNhX2RhdGEsIGFkYXB0ZXItPmN1cmJzc3BhcmFtcy5ic3NpZCwgRVRIX0FMRU4pOworCXdycXUuYXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisJd2lyZWxlc3Nfc2VuZF9ldmVudChwcml2LT53bGFuX2Rldi5uZXRkZXYsIFNJT0NHSVdBUCwgJndycXUsIE5VTEwpOworCisJbGJzX3ByX2RlYnVnKDEsICJBREhPQ19SRVNQOiAtIEpvaW5lZC9TdGFydGVkIEFkIEhvY1xuIik7CisJbGJzX3ByX2RlYnVnKDEsICJBREhPQ19SRVNQOiBjaGFubmVsID0gJWRcbiIsIGFkYXB0ZXItPmFkaG9jY2hhbm5lbCk7CisJbGJzX3ByX2RlYnVnKDEsICJBREhPQ19SRVNQOiBCU1NJRCA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCSAgICAgICBwYWRob2NyZXN1bHQtPkJTU0lEWzBdLCBwYWRob2NyZXN1bHQtPkJTU0lEWzFdLAorCSAgICAgICBwYWRob2NyZXN1bHQtPkJTU0lEWzJdLCBwYWRob2NyZXN1bHQtPkJTU0lEWzNdLAorCSAgICAgICBwYWRob2NyZXN1bHQtPkJTU0lEWzRdLCBwYWRob2NyZXN1bHQtPkJTU0lEWzVdKTsKKworCUxFQVZFKCk7CisJcmV0dXJuIHJldDsKK30KKworaW50IGxpYmVydGFzX3JldF84MDIxMV9hZF9ob2Nfc3RvcCh3bGFuX3ByaXZhdGUgKiBwcml2LAorCQkJCXN0cnVjdCBjbWRfZHNfY29tbWFuZCAqcmVzcCkKK3sKKwlFTlRFUigpOworCisJbGliZXJ0YXNfbWFjX2V2ZW50X2Rpc2Nvbm5lY3RlZChwcml2KTsKKworCUxFQVZFKCk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9qb2luLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9qb2luLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVmYTI0NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2pvaW4uaApAQCAtMCwwICsxLDY0IEBACisvKiAtKi0gbW9kZTogQzsgdGFiLXdpZHRoOiA0OyBpbmRlbnQtdGFicy1tb2RlOiBuaWwgLSotICovCisvKiB2aTogc2V0IGV4cGFuZHRhYiBzaGlmdHdpZHRoPTQgdGFic3RvcD00IHRleHR3aWR0aD03ODogKi8KKworLyoqCisgICogSW50ZXJmYWNlIGZvciB0aGUgd2xhbiBpbmZyYXN0cnVjdHVyZSBhbmQgYWRob2Mgam9pbiByb3V0aW5lcworICAqCisgICogRHJpdmVyIGludGVyZmFjZSBmdW5jdGlvbnMgYW5kIHR5cGUgZGVjbGFyYXRpb25zIGZvciB0aGUgam9pbiBtb2R1bGUKKyAgKiAgIGltcGxlbWVudGVkIGluIHdsYW5fam9pbi5jLiAgUHJvY2VzcyBhbGwgc3RhcnQvam9pbiByZXF1ZXN0cyBmb3IKKyAgKiAgIGJvdGggYWRob2MgYW5kIGluZnJhc3RydWN0dXJlIG5ldHdvcmtzCisgICovCisjaWZuZGVmIF9XTEFOX0pPSU5fSAorI2RlZmluZSBfV0xBTl9KT0lOX0gKKworI2luY2x1ZGUgImRlZnMuaCIKKworc3RydWN0IGNtZF9kc19jb21tYW5kOworZXh0ZXJuIGludCBsaWJlcnRhc19jbWRfODAyMTFfYXV0aGVudGljYXRlKHdsYW5fcHJpdmF0ZSAqIHByaXYsCisJCQkJCXN0cnVjdCBjbWRfZHNfY29tbWFuZCAqY21kLAorCQkJCQl2b2lkICpwZGF0YV9idWYpOworZXh0ZXJuIGludCBsaWJlcnRhc19jbWRfODAyMTFfYWRfaG9jX2pvaW4od2xhbl9wcml2YXRlICogcHJpdiwKKwkJCQkgICAgICAgc3RydWN0IGNtZF9kc19jb21tYW5kICpjbWQsCisJCQkJICAgICAgIHZvaWQgKnBkYXRhX2J1Zik7CitleHRlcm4gaW50IGxpYmVydGFzX2NtZF84MDIxMV9hZF9ob2Nfc3RvcCh3bGFuX3ByaXZhdGUgKiBwcml2LAorCQkJCSAgICAgICBzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKmNtZCk7CitleHRlcm4gaW50IGxpYmVydGFzX2NtZF84MDIxMV9hZF9ob2Nfc3RhcnQod2xhbl9wcml2YXRlICogcHJpdiwKKwkJCQkJc3RydWN0IGNtZF9kc19jb21tYW5kICpjbWQsCisJCQkJCXZvaWQgKnBzc2lkKTsKK2V4dGVybiBpbnQgbGliZXJ0YXNfY21kXzgwMjExX2RlYXV0aGVudGljYXRlKHdsYW5fcHJpdmF0ZSAqIHByaXYsCisJCQkJCSAgc3RydWN0IGNtZF9kc19jb21tYW5kICpjbWQpOworZXh0ZXJuIGludCBsaWJlcnRhc19jbWRfODAyMTFfYXNzb2NpYXRlKHdsYW5fcHJpdmF0ZSAqIHByaXYsCisJCQkJICAgICBzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKmNtZCwKKwkJCQkgICAgIHZvaWQgKnBkYXRhX2J1Zik7CisKK2V4dGVybiBpbnQgbGliZXJ0YXNfcmV0XzgwMjExX2FkX2hvY19zdGFydCh3bGFuX3ByaXZhdGUgKiBwcml2LAorCQkJCQlzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKnJlc3ApOworZXh0ZXJuIGludCBsaWJlcnRhc19yZXRfODAyMTFfYWRfaG9jX3N0b3Aod2xhbl9wcml2YXRlICogcHJpdiwKKwkJCQkgICAgICAgc3RydWN0IGNtZF9kc19jb21tYW5kICpyZXNwKTsKK2V4dGVybiBpbnQgbGliZXJ0YXNfcmV0XzgwMjExX2Rpc2Fzc29jaWF0ZSh3bGFuX3ByaXZhdGUgKiBwcml2LAorCQkJCQlzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKnJlc3ApOworZXh0ZXJuIGludCBsaWJlcnRhc19yZXRfODAyMTFfYXNzb2NpYXRlKHdsYW5fcHJpdmF0ZSAqIHByaXYsCisJCQkJICAgICBzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKnJlc3ApOworCitleHRlcm4gaW50IGxpYmVydGFzX2lkbGVfb24od2xhbl9wcml2YXRlICogcHJpdik7CitleHRlcm4gaW50IGxpYmVydGFzX2lkbGVfb2ZmKHdsYW5fcHJpdmF0ZSAqIHByaXYpOworCitleHRlcm4gaW50IGxpYmVydGFzX2RvX2FkaG9jc3RvcF9pb2N0bCh3bGFuX3ByaXZhdGUgKiBwcml2KTsKK2V4dGVybiBpbnQgbGliZXJ0YXNfcmVhc3NvY2lhdGlvbl90aHJlYWQodm9pZCAqZGF0YSk7CisKK3N0cnVjdCBXTEFOXzgwMl8xMV9TU0lEOworc3RydWN0IGJzc19kZXNjcmlwdG9yOworCitleHRlcm4gaW50IGxpYmVydGFzX3N0YXJ0X2FkaG9jX25ldHdvcmsod2xhbl9wcml2YXRlICogcHJpdiwKKwkJCSAgICAgc3RydWN0IFdMQU5fODAyXzExX1NTSUQgKmFkaG9jc3NpZCk7CitleHRlcm4gaW50IGxpYmVydGFzX2pvaW5fYWRob2NfbmV0d29yayh3bGFuX3ByaXZhdGUgKiBwcml2LCBzdHJ1Y3QgYnNzX2Rlc2NyaXB0b3IgKnBic3NkZXNjKTsKK2V4dGVybiBpbnQgbGliZXJ0YXNfc3RvcF9hZGhvY19uZXR3b3JrKHdsYW5fcHJpdmF0ZSAqIHByaXYpOworCitleHRlcm4gaW50IGxpYmVydGFzX3NlbmRfZGVhdXRoZW50aWNhdGlvbih3bGFuX3ByaXZhdGUgKiBwcml2KTsKK2V4dGVybiBpbnQgbGliZXJ0YXNfc2VuZF9kZWF1dGgod2xhbl9wcml2YXRlICogcHJpdik7CisKK2V4dGVybiBpbnQgbGliZXJ0YXNfZG9fYWRob2NzdG9wX2lvY3RsKHdsYW5fcHJpdmF0ZSAqIHByaXYpOworCitpbnQgd2xhbl9hc3NvY2lhdGUod2xhbl9wcml2YXRlICogcHJpdiwgc3RydWN0IGJzc19kZXNjcmlwdG9yICogcGJzc2Rlc2MpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL21haW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2JmMTAyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvbWFpbi5jCkBAIC0wLDAgKzEsMTI1OCBAQAorLyoqCisgICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBtYWpvciBmdW5jdGlvbnMgaW4gV0xBTgorICAqIGRyaXZlci4gSXQgaW5jbHVkZXMgaW5pdCwgZXhpdCwgb3BlbiwgY2xvc2UgYW5kIG1haW4KKyAgKiB0aHJlYWQgZXRjLi4KKyAgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisKKyNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgorCisjaW5jbHVkZSAiaG9zdC5oIgorI2luY2x1ZGUgInNiaS5oIgorI2luY2x1ZGUgImRlY2wuaCIKKyNpbmNsdWRlICJkZXYuaCIKKyNpbmNsdWRlICJmdy5oIgorI2luY2x1ZGUgIndleHQuaCIKKyNpbmNsdWRlICJkZWJ1Z2ZzLmgiCisjaW5jbHVkZSAiYXNzb2MuaCIKKworI2lmZGVmIEVOQUJMRV9QTQorc3RhdGljIHN0cnVjdCBwbV9kZXYgKndsYW5fcG1fZGV2ID0gTlVMTDsKKyNlbmRpZgorCisjZGVmaW5lIFdMQU5fVFhfUFdSX0RFRkFVTFQJCTIwCS8qMTAwbVcgKi8KKyNkZWZpbmUgV0xBTl9UWF9QV1JfVVNfREVGQVVMVAkJMjAJLyoxMDBtVyAqLworI2RlZmluZSBXTEFOX1RYX1BXUl9KUF9ERUZBVUxUCQkxNgkvKjUwbVcgKi8KKyNkZWZpbmUgV0xBTl9UWF9QV1JfRlJfREVGQVVMVAkJMjAJLyoxMDBtVyAqLworI2RlZmluZSBXTEFOX1RYX1BXUl9FTUVBX0RFRkFVTFQJMjAJLyoxMDBtVyAqLworCisvKiBGb3JtYXQgeyBjaGFubmVsLCBmcmVxdWVuY3kgKE1IeiksIG1heHR4cG93ZXIgfSAqLworLyogYmFuZDogJ0IvRycsIHJlZ2lvbjogVVNBIEZDQy9DYW5hZGEgSUMgKi8KK3N0YXRpYyBzdHJ1Y3QgY2hhbl9mcmVxX3Bvd2VyIGNoYW5uZWxfZnJlcV9wb3dlcl9VU19CR1tdID0geworCXsxLCAyNDEyLCBXTEFOX1RYX1BXUl9VU19ERUZBVUxUfSwKKwl7MiwgMjQxNywgV0xBTl9UWF9QV1JfVVNfREVGQVVMVH0sCisJezMsIDI0MjIsIFdMQU5fVFhfUFdSX1VTX0RFRkFVTFR9LAorCXs0LCAyNDI3LCBXTEFOX1RYX1BXUl9VU19ERUZBVUxUfSwKKwl7NSwgMjQzMiwgV0xBTl9UWF9QV1JfVVNfREVGQVVMVH0sCisJezYsIDI0MzcsIFdMQU5fVFhfUFdSX1VTX0RFRkFVTFR9LAorCXs3LCAyNDQyLCBXTEFOX1RYX1BXUl9VU19ERUZBVUxUfSwKKwl7OCwgMjQ0NywgV0xBTl9UWF9QV1JfVVNfREVGQVVMVH0sCisJezksIDI0NTIsIFdMQU5fVFhfUFdSX1VTX0RFRkFVTFR9LAorCXsxMCwgMjQ1NywgV0xBTl9UWF9QV1JfVVNfREVGQVVMVH0sCisJezExLCAyNDYyLCBXTEFOX1RYX1BXUl9VU19ERUZBVUxUfQorfTsKKworLyogYmFuZDogJ0IvRycsIHJlZ2lvbjogRXVyb3BlIEVUU0kgKi8KK3N0YXRpYyBzdHJ1Y3QgY2hhbl9mcmVxX3Bvd2VyIGNoYW5uZWxfZnJlcV9wb3dlcl9FVV9CR1tdID0geworCXsxLCAyNDEyLCBXTEFOX1RYX1BXUl9FTUVBX0RFRkFVTFR9LAorCXsyLCAyNDE3LCBXTEFOX1RYX1BXUl9FTUVBX0RFRkFVTFR9LAorCXszLCAyNDIyLCBXTEFOX1RYX1BXUl9FTUVBX0RFRkFVTFR9LAorCXs0LCAyNDI3LCBXTEFOX1RYX1BXUl9FTUVBX0RFRkFVTFR9LAorCXs1LCAyNDMyLCBXTEFOX1RYX1BXUl9FTUVBX0RFRkFVTFR9LAorCXs2LCAyNDM3LCBXTEFOX1RYX1BXUl9FTUVBX0RFRkFVTFR9LAorCXs3LCAyNDQyLCBXTEFOX1RYX1BXUl9FTUVBX0RFRkFVTFR9LAorCXs4LCAyNDQ3LCBXTEFOX1RYX1BXUl9FTUVBX0RFRkFVTFR9LAorCXs5LCAyNDUyLCBXTEFOX1RYX1BXUl9FTUVBX0RFRkFVTFR9LAorCXsxMCwgMjQ1NywgV0xBTl9UWF9QV1JfRU1FQV9ERUZBVUxUfSwKKwl7MTEsIDI0NjIsIFdMQU5fVFhfUFdSX0VNRUFfREVGQVVMVH0sCisJezEyLCAyNDY3LCBXTEFOX1RYX1BXUl9FTUVBX0RFRkFVTFR9LAorCXsxMywgMjQ3MiwgV0xBTl9UWF9QV1JfRU1FQV9ERUZBVUxUfQorfTsKKworLyogYmFuZDogJ0IvRycsIHJlZ2lvbjogU3BhaW4gKi8KK3N0YXRpYyBzdHJ1Y3QgY2hhbl9mcmVxX3Bvd2VyIGNoYW5uZWxfZnJlcV9wb3dlcl9TUE5fQkdbXSA9IHsKKwl7MTAsIDI0NTcsIFdMQU5fVFhfUFdSX0RFRkFVTFR9LAorCXsxMSwgMjQ2MiwgV0xBTl9UWF9QV1JfREVGQVVMVH0KK307CisKKy8qIGJhbmQ6ICdCL0cnLCByZWdpb246IEZyYW5jZSAqLworc3RhdGljIHN0cnVjdCBjaGFuX2ZyZXFfcG93ZXIgY2hhbm5lbF9mcmVxX3Bvd2VyX0ZSX0JHW10gPSB7CisJezEwLCAyNDU3LCBXTEFOX1RYX1BXUl9GUl9ERUZBVUxUfSwKKwl7MTEsIDI0NjIsIFdMQU5fVFhfUFdSX0ZSX0RFRkFVTFR9LAorCXsxMiwgMjQ2NywgV0xBTl9UWF9QV1JfRlJfREVGQVVMVH0sCisJezEzLCAyNDcyLCBXTEFOX1RYX1BXUl9GUl9ERUZBVUxUfQorfTsKKworLyogYmFuZDogJ0IvRycsIHJlZ2lvbjogSmFwYW4gKi8KK3N0YXRpYyBzdHJ1Y3QgY2hhbl9mcmVxX3Bvd2VyIGNoYW5uZWxfZnJlcV9wb3dlcl9KUE5fQkdbXSA9IHsKKwl7MSwgMjQxMiwgV0xBTl9UWF9QV1JfSlBfREVGQVVMVH0sCisJezIsIDI0MTcsIFdMQU5fVFhfUFdSX0pQX0RFRkFVTFR9LAorCXszLCAyNDIyLCBXTEFOX1RYX1BXUl9KUF9ERUZBVUxUfSwKKwl7NCwgMjQyNywgV0xBTl9UWF9QV1JfSlBfREVGQVVMVH0sCisJezUsIDI0MzIsIFdMQU5fVFhfUFdSX0pQX0RFRkFVTFR9LAorCXs2LCAyNDM3LCBXTEFOX1RYX1BXUl9KUF9ERUZBVUxUfSwKKwl7NywgMjQ0MiwgV0xBTl9UWF9QV1JfSlBfREVGQVVMVH0sCisJezgsIDI0NDcsIFdMQU5fVFhfUFdSX0pQX0RFRkFVTFR9LAorCXs5LCAyNDUyLCBXTEFOX1RYX1BXUl9KUF9ERUZBVUxUfSwKKwl7MTAsIDI0NTcsIFdMQU5fVFhfUFdSX0pQX0RFRkFVTFR9LAorCXsxMSwgMjQ2MiwgV0xBTl9UWF9QV1JfSlBfREVGQVVMVH0sCisJezEyLCAyNDY3LCBXTEFOX1RYX1BXUl9KUF9ERUZBVUxUfSwKKwl7MTMsIDI0NzIsIFdMQU5fVFhfUFdSX0pQX0RFRkFVTFR9LAorCXsxNCwgMjQ4NCwgV0xBTl9UWF9QV1JfSlBfREVGQVVMVH0KK307CisKKy8qKgorICogdGhlIHN0cnVjdHVyZSBmb3IgY2hhbm5lbCwgZnJlcXVlbmN5IGFuZCBwb3dlcgorICovCitzdHJ1Y3QgcmVnaW9uX2NmcF90YWJsZSB7CisJdTggcmVnaW9uOworCXN0cnVjdCBjaGFuX2ZyZXFfcG93ZXIgKmNmcF9CRzsKKwlpbnQgY2ZwX25vX0JHOworfTsKKworLyoqCisgKiB0aGUgc3RydWN0dXJlIGZvciB0aGUgbWFwcGluZyBiZXR3ZWVuIHJlZ2lvbiBhbmQgQ0ZQCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcmVnaW9uX2NmcF90YWJsZSByZWdpb25fY2ZwX3RhYmxlW10gPSB7CisJezB4MTAsCQkJLypVUyBGQ0MgKi8KKwkgY2hhbm5lbF9mcmVxX3Bvd2VyX1VTX0JHLAorCSBzaXplb2YoY2hhbm5lbF9mcmVxX3Bvd2VyX1VTX0JHKSAvIHNpemVvZihzdHJ1Y3QgY2hhbl9mcmVxX3Bvd2VyKSwKKwkgfQorCSwKKwl7MHgyMCwJCQkvKkNBTkFEQSBJQyAqLworCSBjaGFubmVsX2ZyZXFfcG93ZXJfVVNfQkcsCisJIHNpemVvZihjaGFubmVsX2ZyZXFfcG93ZXJfVVNfQkcpIC8gc2l6ZW9mKHN0cnVjdCBjaGFuX2ZyZXFfcG93ZXIpLAorCSB9CisJLAorCXsweDMwLCAvKkVVKi8gY2hhbm5lbF9mcmVxX3Bvd2VyX0VVX0JHLAorCSBzaXplb2YoY2hhbm5lbF9mcmVxX3Bvd2VyX0VVX0JHKSAvIHNpemVvZihzdHJ1Y3QgY2hhbl9mcmVxX3Bvd2VyKSwKKwkgfQorCSwKKwl7MHgzMSwgLypTUEFJTiovIGNoYW5uZWxfZnJlcV9wb3dlcl9TUE5fQkcsCisJIHNpemVvZihjaGFubmVsX2ZyZXFfcG93ZXJfU1BOX0JHKSAvIHNpemVvZihzdHJ1Y3QgY2hhbl9mcmVxX3Bvd2VyKSwKKwkgfQorCSwKKwl7MHgzMiwgLypGUkFOQ0UqLyBjaGFubmVsX2ZyZXFfcG93ZXJfRlJfQkcsCisJIHNpemVvZihjaGFubmVsX2ZyZXFfcG93ZXJfRlJfQkcpIC8gc2l6ZW9mKHN0cnVjdCBjaGFuX2ZyZXFfcG93ZXIpLAorCSB9CisJLAorCXsweDQwLCAvKkpBUEFOKi8gY2hhbm5lbF9mcmVxX3Bvd2VyX0pQTl9CRywKKwkgc2l6ZW9mKGNoYW5uZWxfZnJlcV9wb3dlcl9KUE5fQkcpIC8gc2l6ZW9mKHN0cnVjdCBjaGFuX2ZyZXFfcG93ZXIpLAorCSB9CisJLAorLypBZGQgbmV3IHJlZ2lvbiBoZXJlICovCit9OworCisvKioKKyAqIHRoZSByYXRlcyBzdXBwb3J0ZWQgYnkgdGhlIGNhcmQKKyAqLwordTggbGliZXJ0YXNfd2xhbl9kYXRhX3JhdGVzW1dMQU5fU1VQUE9SVEVEX1JBVEVTXSA9CisgICAgeyAweDAyLCAweDA0LCAweDBCLCAweDE2LCAweDAwLCAweDBDLCAweDEyLAorCTB4MTgsIDB4MjQsIDB4MzAsIDB4NDgsIDB4NjAsIDB4NkMsIDB4MDAKK307CisKKy8qKgorICogdGhlIHJhdGVzIHN1cHBvcnRlZAorICovCit1OCBsaWJlcnRhc19zdXBwb3J0ZWRfcmF0ZXNbR19TVVBQT1JURURfUkFURVNdID0KKyAgICB7IDB4ODIsIDB4ODQsIDB4OGIsIDB4OTYsIDB4MGMsIDB4MTIsIDB4MTgsIDB4MjQsIDB4MzAsIDB4NDgsIDB4NjAsIDB4NmMsCiswIH07CisKKy8qKgorICogdGhlIHJhdGVzIHN1cHBvcnRlZCBmb3IgYWQtaG9jIEcgbW9kZQorICovCit1OCBsaWJlcnRhc19hZGhvY19yYXRlc19nW0dfU1VQUE9SVEVEX1JBVEVTXSA9CisgICAgeyAweDgyLCAweDg0LCAweDhiLCAweDk2LCAweDBjLCAweDEyLCAweDE4LCAweDI0LCAweDMwLCAweDQ4LCAweDYwLCAweDZjLAorMCB9OworCisvKioKKyAqIHRoZSByYXRlcyBzdXBwb3J0ZWQgZm9yIGFkLWhvYyBCIG1vZGUKKyAqLwordTggbGliZXJ0YXNfYWRob2NfcmF0ZXNfYls0XSA9IHsgMHg4MiwgMHg4NCwgMHg4YiwgMHg5NiB9OworCisvKioKKyAqIHRoZSBnbG9iYWwgdmFyaWFibGUgb2YgYSBwb2ludGVyIHRvIHdsYW5fcHJpdmF0ZQorICogc3RydWN0dXJlIHZhcmlhYmxlCisgKi8KK3N0YXRpYyB3bGFuX3ByaXZhdGUgKndsYW5wcml2ID0gTlVMTDsKKworI2RlZmluZSBNQVhfREVWUyA1CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmxpYmVydGFzX2RldnNbTUFYX0RFVlNdOworc3RhdGljIGludCBsaWJlcnRhc19mb3VuZCA9IDA7CisKKy8qKgorICogdGhlIHRhYmxlIHRvIGtlZXAgcmVnaW9uIGNvZGUKKyAqLwordTE2IGxpYmVydGFzX3JlZ2lvbl9jb2RlX3RvX2luZGV4W01SVkRSVl9NQVhfUkVHSU9OX0NPREVdID0KKyAgICB7IDB4MTAsIDB4MjAsIDB4MzAsIDB4MzEsIDB4MzIsIDB4NDAgfTsKKworc3RhdGljIHU4ICpkZWZhdWx0X2Z3X25hbWUgPSAidXNiODM4OC5iaW4iOworCisvKioKKyAqIEF0dHJpYnV0ZXMgZXhwb3J0ZWQgdGhyb3VnaCBzeXNmcworICovCisKKy8qKgorICogQGJyaWVmIEdldCBmdW5jdGlvbiBmb3Igc3lzZnMgYXR0cmlidXRlIGxpYmVydGFzX21wcAorICovCitzdGF0aWMgc3NpemVfdCBsaWJlcnRhc19tcHBfZ2V0KHN0cnVjdCBkZXZpY2UgKiBkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICogYnVmKSB7CisJc3RydWN0IGNtZF9kc19tZXNoX2FjY2VzcyBtZXNoX2FjY2VzczsKKworCW1lbXNldCgmbWVzaF9hY2Nlc3MsIDAsIHNpemVvZihtZXNoX2FjY2VzcykpOworCWxpYmVydGFzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZCh0b19uZXRfZGV2KGRldiktPnByaXYsCisJCQljbWRfbWVzaF9hY2Nlc3MsCisJCQljbWRfYWN0X21lc2hfZ2V0X21wcCwKKwkJCWNtZF9vcHRpb25fd2FpdGZvcnJzcCwgMCwgKHZvaWQgKikmbWVzaF9hY2Nlc3MpOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgMywgIiVkXG4iLCBtZXNoX2FjY2Vzcy5kYXRhWzBdKTsKK30KKworLyoqCisgKiBAYnJpZWYgU2V0IGZ1bmN0aW9uIGZvciBzeXNmcyBhdHRyaWJ1dGUgbGliZXJ0YXNfbXBwCisgKi8KK3N0YXRpYyBzc2l6ZV90IGxpYmVydGFzX21wcF9zZXQoc3RydWN0IGRldmljZSAqIGRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKiBidWYsIHNpemVfdCBjb3VudCkgeworCXN0cnVjdCBjbWRfZHNfbWVzaF9hY2Nlc3MgbWVzaF9hY2Nlc3M7CisKKworCW1lbXNldCgmbWVzaF9hY2Nlc3MsIDAsIHNpemVvZihtZXNoX2FjY2VzcykpOworCXNzY2FuZihidWYsICIlZCIsICYobWVzaF9hY2Nlc3MuZGF0YVswXSkpOworCWxpYmVydGFzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZCgodG9fbmV0X2RldihkZXYpKS0+cHJpdiwKKwkJCWNtZF9tZXNoX2FjY2VzcywKKwkJCWNtZF9hY3RfbWVzaF9zZXRfbXBwLAorCQkJY21kX29wdGlvbl93YWl0Zm9ycnNwLCAwLCAodm9pZCAqKSZtZXNoX2FjY2Vzcyk7CisJcmV0dXJuIHN0cmxlbihidWYpOworfQorCisvKioKKyAqIGxpYmVydGFzX21wcCBhdHRyaWJ1dGUgdG8gYmUgZXhwb3J0ZWQgcGVyIG1zaFggaW50ZXJmYWNlCisgKiB0aHJvdWdoIHN5c2ZzICgvc3lzL2NsYXNzL25ldC9tc2hYL2xpYmVydGFzLW1wcCkKKyAqLworc3RhdGljIERFVklDRV9BVFRSKGxpYmVydGFzX21wcCwgMDY0NCwgbGliZXJ0YXNfbXBwX2dldCwKKwkJbGliZXJ0YXNfbXBwX3NldCApOworCisvKioKKyAqICBAYnJpZWYgQ2hlY2sgaWYgdGhlIGRldmljZSBjYW4gYmUgb3BlbiBhbmQgd2FpdCBpZiBuZWNlc3NhcnkuCisgKgorICogIEBwYXJhbSBkZXYgICAgIEEgcG9pbnRlciB0byBuZXRfZGV2aWNlIHN0cnVjdHVyZQorICogIEByZXR1cm4gCSAgIDAKKyAqCisgKiBGb3IgVVNCIGFkYXB0ZXIsIG9uIHNvbWUgc3lzdGVtcyB0aGUgZGV2aWNlIG9wZW4gaGFuZGxlciB3aWxsIGJlCisgKiBjYWxsZWQgYmVmb3JlIEZXIHJlYWR5LiBVc2UgdGhlIGZvbGxvd2luZyBmbGFnIGNoZWNrIGFuZCB3YWl0CisgKiBmdW5jdGlvbiB0byB3b3JrIGFyb3VuZCB0aGUgaXNzdWUuCisgKgorICovCitzdGF0aWMgaW50IHByZV9vcGVuX2NoZWNrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIHsKKwl3bGFuX3ByaXZhdGUgKnByaXYgPSAod2xhbl9wcml2YXRlICopIGRldi0+cHJpdjsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCWludCBpID0gMDsKKworCXdoaWxlICghYWRhcHRlci0+ZndfcmVhZHkgJiYgaSA8IDIwKSB7CisJCWkrKzsKKwkJbXNsZWVwX2ludGVycnVwdGlibGUoMTAwKTsKKwl9CisJaWYgKCFhZGFwdGVyLT5md19yZWFkeSkgeworCQlsYnNfcHJfaW5mbygiRlcgbm90IHJlYWR5LCBwcmVfb3Blbl9jaGVjaygpIHJldHVybiBmYWlsdXJlXG4iKTsKKwkJTEVBVkUoKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqICBAYnJpZWYgVGhpcyBmdW5jdGlvbiBvcGVucyB0aGUgZGV2aWNlCisgKgorICogIEBwYXJhbSBkZXYgICAgIEEgcG9pbnRlciB0byBuZXRfZGV2aWNlIHN0cnVjdHVyZQorICogIEByZXR1cm4gCSAgIDAKKyAqLworc3RhdGljIGludCB3bGFuX2Rldl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJd2xhbl9wcml2YXRlICpwcml2ID0gKHdsYW5fcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKworCUVOVEVSKCk7CisKKworCXByaXYtPm9wZW4gPSAxOworCisJaWYgKGFkYXB0ZXItPmNvbm5lY3Rfc3RhdHVzID09IGxpYmVydGFzX2Nvbm5lY3RlZCkgeworCQluZXRpZl9jYXJyaWVyX29uKHByaXYtPndsYW5fZGV2Lm5ldGRldik7CisJfSBlbHNlCisJCW5ldGlmX2NhcnJpZXJfb2ZmKHByaXYtPndsYW5fZGV2Lm5ldGRldik7CisKKwlMRUFWRSgpOworCXJldHVybiAwOworfQorLyoqCisgKiAgQGJyaWVmIFRoaXMgZnVuY3Rpb24gb3BlbnMgdGhlIG1zaFggaW50ZXJmYWNlCisgKgorICogIEBwYXJhbSBkZXYgICAgIEEgcG9pbnRlciB0byBuZXRfZGV2aWNlIHN0cnVjdHVyZQorICogIEByZXR1cm4gCSAgIDAKKyAqLworc3RhdGljIGludCBtZXNoX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl3bGFuX3ByaXZhdGUgKnByaXYgPSAod2xhbl9wcml2YXRlICopIGRldi0+cHJpdiA7CisKKwlpZihwcmVfb3Blbl9jaGVjayhkZXYpID09IC0xKQorCQlyZXR1cm4gLTE7CisJcHJpdi0+bWVzaF9vcGVuID0gMSA7CisJbmV0aWZfc3RhcnRfcXVldWUocHJpdi0+bWVzaF9kZXYpOworCWlmIChwcml2LT5pbmZyYV9vcGVuID09IDApCisJCXJldHVybiB3bGFuX2Rldl9vcGVuKHByaXYtPndsYW5fZGV2Lm5ldGRldikgOworCXJldHVybiAwOworfQorCisvKioKKyAqICBAYnJpZWYgVGhpcyBmdW5jdGlvbiBvcGVucyB0aGUgZXRoWCBpbnRlcmZhY2UKKyAqCisgKiAgQHBhcmFtIGRldiAgICAgQSBwb2ludGVyIHRvIG5ldF9kZXZpY2Ugc3RydWN0dXJlCisgKiAgQHJldHVybiAJICAgMAorICovCitzdGF0aWMgaW50IHdsYW5fb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXdsYW5fcHJpdmF0ZSAqcHJpdiA9ICh3bGFuX3ByaXZhdGUgKikgZGV2LT5wcml2IDsKKworCWlmKHByZV9vcGVuX2NoZWNrKGRldikgPT0gLTEpCisJCXJldHVybiAtMTsKKwlwcml2LT5pbmZyYV9vcGVuID0gMSA7CisJbmV0aWZfd2FrZV9xdWV1ZShwcml2LT53bGFuX2Rldi5uZXRkZXYpOworCWlmIChwcml2LT5vcGVuID09IDApCisJCXJldHVybiB3bGFuX2Rldl9vcGVuKHByaXYtPndsYW5fZGV2Lm5ldGRldikgOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdsYW5fZGV2X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJd2xhbl9wcml2YXRlICpwcml2ID0gZGV2LT5wcml2OworCisJRU5URVIoKTsKKworCW5ldGlmX2NhcnJpZXJfb2ZmKHByaXYtPndsYW5fZGV2Lm5ldGRldik7CisJcHJpdi0+b3BlbiA9IDA7CisKKwlMRUFWRSgpOworCXJldHVybiAwOworfQorCisvKioKKyAqICBAYnJpZWYgVGhpcyBmdW5jdGlvbiBjbG9zZXMgdGhlIG1zaFggaW50ZXJmYWNlCisgKgorICogIEBwYXJhbSBkZXYgICAgIEEgcG9pbnRlciB0byBuZXRfZGV2aWNlIHN0cnVjdHVyZQorICogIEByZXR1cm4gCSAgIDAKKyAqLworc3RhdGljIGludCBtZXNoX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJd2xhbl9wcml2YXRlICpwcml2ID0gKHdsYW5fcHJpdmF0ZSAqKSAoZGV2LT5wcml2KTsKKworCXByaXYtPm1lc2hfb3BlbiA9IDA7CisJbmV0aWZfc3RvcF9xdWV1ZShwcml2LT5tZXNoX2Rldik7CisJaWYgKHByaXYtPmluZnJhX29wZW4gPT0gMCkKKwkJcmV0dXJuIHdsYW5fZGV2X2Nsb3NlKCAoKHdsYW5fcHJpdmF0ZSAqKSBkZXYtPnByaXYpLT53bGFuX2Rldi5uZXRkZXYpIDsKKwllbHNlCisJCXJldHVybiAwOworfQorCisvKioKKyAqICBAYnJpZWYgVGhpcyBmdW5jdGlvbiBjbG9zZXMgdGhlIGV0aFggaW50ZXJmYWNlCisgKgorICogIEBwYXJhbSBkZXYgICAgIEEgcG9pbnRlciB0byBuZXRfZGV2aWNlIHN0cnVjdHVyZQorICogIEByZXR1cm4gCSAgIDAKKyAqLworc3RhdGljIGludCB3bGFuX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIHsKKwl3bGFuX3ByaXZhdGUgKnByaXYgPSAod2xhbl9wcml2YXRlICopIGRldi0+cHJpdjsKKworCW5ldGlmX3N0b3BfcXVldWUocHJpdi0+d2xhbl9kZXYubmV0ZGV2KTsKKwlwcml2LT5pbmZyYV9vcGVuID0gMDsKKwlpZiAocHJpdi0+bWVzaF9vcGVuID09IDApCisJCXJldHVybiB3bGFuX2Rldl9jbG9zZSggKCh3bGFuX3ByaXZhdGUgKikgZGV2LT5wcml2KS0+d2xhbl9kZXYubmV0ZGV2KSA7CisJZWxzZQorCQlyZXR1cm4gMDsKK30KKworCisjaWZkZWYgRU5BQkxFX1BNCisKKy8qKgorICogIEBicmllZiBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FsbGJhY2sgZnVuY3Rpb24uIGl0IGlzIGNhbGxlZCBieQorICogIGtlcm5lbCB0byBlbnRlciBvciBleGl0IHBvd2VyIHNhdmluZyBtb2RlLgorICoKKyAqICBAcGFyYW0gcG1kZXYgICBBIHBvaW50ZXIgdG8gcG1fZGV2CisgKiAgQHBhcmFtIHBtcmVxICAgcG1fcmVxdWVzdF90CisgKiAgQHBhcmFtIHBtZGF0YSAgQSBwb2ludGVyIHRvIHBtZGF0YQorICogIEByZXR1cm4gCSAgIDAgb3IgLTEKKyAqLworc3RhdGljIGludCB3bGFuX3BtX2NhbGxiYWNrKHN0cnVjdCBwbV9kZXYgKnBtZGV2LCBwbV9yZXF1ZXN0X3QgcG1yZXEsCisJCQkgICAgdm9pZCAqcG1kYXRhKQoreworCXdsYW5fcHJpdmF0ZSAqcHJpdiA9IHdsYW5wcml2OworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHByaXYtPndsYW5fZGV2Lm5ldGRldjsKKworCWxic19wcl9kZWJ1ZygxLCAiV1BSTV9QTV9DQUxMQkFDSzogcG1yZXEgPSAlZC5cbiIsIHBtcmVxKTsKKworCXN3aXRjaCAocG1yZXEpIHsKKwljYXNlIFBNX1NVU1BFTkQ6CisJCWxic19wcl9kZWJ1ZygxLCAiV1BSTV9QTV9DQUxMQkFDSzogZW50ZXIgUE1fU1VTUEVORC5cbiIpOworCisJCS8qIGluIGFzc29jaWF0ZWQgbW9kZSAqLworCQlpZiAoYWRhcHRlci0+Y29ubmVjdF9zdGF0dXMgPT0gbGliZXJ0YXNfY29ubmVjdGVkKSB7CisJCQlpZiAoKGFkYXB0ZXItPnBzc3RhdGUgIT0gUFNfU1RBVEVfU0xFRVApCisJCQkgICAgKSB7CisJCQkJbGJzX3ByX2RlYnVnKDEsCisJCQkJICAgICAgICJ3bGFuX3BtX2NhbGxiYWNrOiBjYW4ndCBlbnRlciBzbGVlcCBtb2RlXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9IGVsc2UgeworCisJCQkJLyoKKwkJCQkgKiBEZXRhY2ggdGhlIG5ldHdvcmsgaW50ZXJmYWNlCisJCQkJICogaWYgdGhlIG5ldHdvcmsgaXMgcnVubmluZworCQkJCSAqLworCQkJCWlmIChuZXRpZl9ydW5uaW5nKGRldikpIHsKKwkJCQkJbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOworCQkJCQlsYnNfcHJfZGVidWcoMSwKKwkJCQkJICAgICAgICJuZXRpZl9kZXZpY2VfZGV0YWNoKCkuXG4iKTsKKwkJCQl9CisJCQkJbGliZXJ0YXNfc2JpX3N1c3BlbmQocHJpdik7CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJCS8qIGluIG5vbiBhc3NvY2lhdGVkIG1vZGUgKi8KKworCQkvKgorCQkgKiBEZXRhY2ggdGhlIG5ldHdvcmsgaW50ZXJmYWNlCisJCSAqIGlmIHRoZSBuZXR3b3JrIGlzIHJ1bm5pbmcKKwkJICovCisJCWlmIChuZXRpZl9ydW5uaW5nKGRldikpCisJCQluZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CisKKwkJLyoKKwkJICogU3RvcmluZyBhbmQgcmVzdG9yaW5nIG9mIHRoZSByZWdzIGJlIHRha2VuIGNhcmUKKwkJICogYXQgdGhlIGRyaXZlciByZXN0IHdpbGwgYmUgZG9uZSBhdCB3bGFuIGRyaXZlcgorCQkgKiB0aGlzIG1ha2VzIGRyaXZlciBpbmRlcGVuZGVudCBvZiB0aGUgY2FyZAorCQkgKi8KKworCQlsaWJlcnRhc19zYmlfc3VzcGVuZChwcml2KTsKKworCQlicmVhazsKKworCWNhc2UgUE1fUkVTVU1FOgorCQkvKiBpbiBhc3NvY2lhdGVkIG1vZGUgKi8KKwkJaWYgKGFkYXB0ZXItPmNvbm5lY3Rfc3RhdHVzID09IGxpYmVydGFzX2Nvbm5lY3RlZCkgeworCQkJeworCQkJCS8qCisJCQkJICogQnJpbmcgdGhlIGludGVmYWNlIHVwIGZpcnN0CisJCQkJICogVGhpcyBjYXNlIHNob3VsZCBub3QgaGFwcGVuIHN0aWxsIC4uLgorCQkJCSAqLworCQkJCWxpYmVydGFzX3NiaV9yZXN1bWUocHJpdik7CisKKwkJCQkvKgorCQkJCSAqIEF0dGFjaCB0aGUgbmV0d29yayBpbnRlcmZhY2UKKwkJCQkgKiBpZiB0aGUgbmV0d29yayBpcyBydW5uaW5nCisJCQkJICovCisJCQkJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkgeworCQkJCQluZXRpZl9kZXZpY2VfYXR0YWNoKGRldik7CisJCQkJCWxic19wcl9kZWJ1ZygxLAorCQkJCQkgICAgICAgImFmdGVyIG5ldGlmX2RldmljZV9hdHRhY2goKS5cbiIpOworCQkJCX0KKwkJCQlsYnNfcHJfZGVidWcoMSwKKwkJCQkgICAgICAgIkFmdGVyIG5ldGlmIGF0dGFjaCwgaW4gYXNzb2NpYXRlZCBtb2RlLlxuIik7CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJCS8qIGluIG5vbiBhc3NvY2lhdGVkIG1vZGUgKi8KKworCQkvKgorCQkgKiBCcmluZyB0aGUgaW50ZWZhY2UgdXAgZmlyc3QKKwkJICogVGhpcyBjYXNlIHNob3VsZCBub3QgaGFwcGVuIHN0aWxsIC4uLgorCQkgKi8KKworCQlsaWJlcnRhc19zYmlfcmVzdW1lKHByaXYpOworCisJCWlmIChuZXRpZl9ydW5uaW5nKGRldikpCisJCQluZXRpZl9kZXZpY2VfYXR0YWNoKGRldik7CisKKwkJbGJzX3ByX2RlYnVnKDEsICJhZnRlciBuZXRpZiBhdHRhY2gsIGluIE5PTiBhc3NvY2lhdGVkIG1vZGUuXG4iKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisjZW5kaWYJCQkJLyogRU5BQkxFX1BNICovCisKK3N0YXRpYyBpbnQgd2xhbl9oYXJkX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgcmV0ID0gMDsKKwl3bGFuX3ByaXZhdGUgKnByaXYgPSBkZXYtPnByaXY7CisKKwlFTlRFUigpOworCisJaWYgKHByaXYtPndsYW5fZGV2LmRubGRfc2VudCB8fCBwcml2LT5hZGFwdGVyLT5UeExvY2tGbGFnKSB7CisJCXByaXYtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKKwkJZ290byBkb25lOworCX0KKworCW5ldGlmX3N0b3BfcXVldWUocHJpdi0+d2xhbl9kZXYubmV0ZGV2KTsKKworCWlmIChsaWJlcnRhc19wcm9jZXNzX3R4KHByaXYsIHNrYikgPT0gMCkKKwkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7Citkb25lOgorCUxFQVZFKCk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBAYnJpZWYgTWFyayBtZXNoIHBhY2tldHMgYW5kIGhhbmRvdmVyIHRoZW0gdG8gd2xhbl9oYXJkX3N0YXJ0X3htaXQKKyAqCisgKi8KK3N0YXRpYyBpbnQgbWVzaF9wcmVfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXdsYW5fcHJpdmF0ZSAqcHJpdiA9IGRldi0+cHJpdjsKKwlFTlRFUigpOworCVNFVF9NRVNIX0ZSQU1FKHNrYik7CisJTEVBVkUoKTsKKworCXJldHVybiB3bGFuX2hhcmRfc3RhcnRfeG1pdChza2IsIHByaXYtPndsYW5fZGV2Lm5ldGRldik7Cit9CisKKy8qKgorICogQGJyaWVmIE1hcmsgbm9uLW1lc2ggcGFja2V0cyBhbmQgaGFuZG92ZXIgdGhlbSB0byB3bGFuX2hhcmRfc3RhcnRfeG1pdAorICoKKyAqLworc3RhdGljIGludCB3bGFuX3ByZV9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIHsKKwlFTlRFUigpOworCVVOU0VUX01FU0hfRlJBTUUoc2tiKTsKKwlMRUFWRSgpOworCXJldHVybiB3bGFuX2hhcmRfc3RhcnRfeG1pdChza2IsIGRldik7Cit9CisKK3N0YXRpYyB2b2lkIHdsYW5fdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXdsYW5fcHJpdmF0ZSAqcHJpdiA9ICh3bGFuX3ByaXZhdGUgKikgZGV2LT5wcml2OworCisJRU5URVIoKTsKKworCWxic19wcl9lcnIoInR4IHdhdGNoIGRvZyB0aW1lb3V0IVxuIik7CisKKwlwcml2LT53bGFuX2Rldi5kbmxkX3NlbnQgPSBETkxEX1JFU19SRUNFSVZFRDsKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCWlmIChwcml2LT5hZGFwdGVyLT5jdXJyZW50dHhza2IpIHsKKwkJaWYgKHByaXYtPmFkYXB0ZXItPnJhZGlvbW9kZSA9PSBXTEFOX1JBRElPTU9ERV9SQURJT1RBUCkgeworCQkJLyogSWYgd2UgYXJlIGhlcmUsIHdlIGhhdmUgbm90IHJlY2VpdmVkIGZlZWRiYWNrIGZyb20KKwkJCSAgIHRoZSBwcmV2aW91cyBwYWNrZXQuICBBc3N1bWUgVFhfRkFJTCBhbmQgbW92ZSBvbi4gKi8KKwkJCXByaXYtPmFkYXB0ZXItPmV2ZW50Y2F1c2UgPSAweDAxMDAwMDAwOworCQkJbGliZXJ0YXNfc2VuZF90eF9mZWVkYmFjayhwcml2KTsKKwkJfSBlbHNlCisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnByaXYtPm1haW50aHJlYWQud2FpdHEpOworCX0gZWxzZSBpZiAocHJpdi0+YWRhcHRlci0+Y29ubmVjdF9zdGF0dXMgPT0gbGliZXJ0YXNfY29ubmVjdGVkKQorCQluZXRpZl93YWtlX3F1ZXVlKHByaXYtPndsYW5fZGV2Lm5ldGRldik7CisKKwlMRUFWRSgpOworfQorCisvKioKKyAqICBAYnJpZWYgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBuZXR3b3JrIHN0YXRpc3RpY3MKKyAqCisgKiAgQHBhcmFtIGRldiAgICAgQSBwb2ludGVyIHRvIHdsYW5fcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqICBAcmV0dXJuIAkgICBBIHBvaW50ZXIgdG8gbmV0X2RldmljZV9zdGF0cyBzdHJ1Y3R1cmUKKyAqLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICp3bGFuX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXdsYW5fcHJpdmF0ZSAqcHJpdiA9ICh3bGFuX3ByaXZhdGUgKikgZGV2LT5wcml2OworCisJcmV0dXJuICZwcml2LT5zdGF0czsKK30KKworc3RhdGljIGludCB3bGFuX3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICphZGRyKQoreworCWludCByZXQgPSAwOworCXdsYW5fcHJpdmF0ZSAqcHJpdiA9ICh3bGFuX3ByaXZhdGUgKikgZGV2LT5wcml2OworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJc3RydWN0IHNvY2thZGRyICpwaHdhZGRyID0gYWRkcjsKKworCUVOVEVSKCk7CisKKwltZW1zZXQoYWRhcHRlci0+Y3VycmVudF9hZGRyLCAwLCBFVEhfQUxFTik7CisKKwkvKiBkZXYtPmRldl9hZGRyIGlzIDggYnl0ZXMgKi8KKwlsYnNfZGJnX2hleCgiZGV2LT5kZXZfYWRkcjoiLCBkZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisKKwlsYnNfZGJnX2hleCgiYWRkcjoiLCBwaHdhZGRyLT5zYV9kYXRhLCBFVEhfQUxFTik7CisJbWVtY3B5KGFkYXB0ZXItPmN1cnJlbnRfYWRkciwgcGh3YWRkci0+c2FfZGF0YSwgRVRIX0FMRU4pOworCisJcmV0ID0gbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsIGNtZF84MDJfMTFfbWFjX2FkZHJlc3MsCisJCQkJICAgIGNtZF9hY3Rfc2V0LAorCQkJCSAgICBjbWRfb3B0aW9uX3dhaXRmb3Jyc3AsIDAsIE5VTEwpOworCisJaWYgKHJldCkgeworCQlsYnNfcHJfZGVidWcoMSwgInNldCBtYWMgYWRkcmVzcyBmYWlsZWQuXG4iKTsKKwkJcmV0ID0gLTE7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlsYnNfZGJnX2hleCgiYWRhcHRlci0+bWFjYWRkcjoiLCBhZGFwdGVyLT5jdXJyZW50X2FkZHIsIEVUSF9BTEVOKTsKKwltZW1jcHkoZGV2LT5kZXZfYWRkciwgYWRhcHRlci0+Y3VycmVudF9hZGRyLCBFVEhfQUxFTik7CisJbWVtY3B5KCgod2xhbl9wcml2YXRlICopIGRldi0+cHJpdiktPm1lc2hfZGV2LT5kZXZfYWRkciwgYWRhcHRlci0+Y3VycmVudF9hZGRyLCBFVEhfQUxFTik7CisKK2RvbmU6CisJTEVBVkUoKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHdsYW5fY29weV9tdWx0aWNhc3RfYWRkcmVzcyh3bGFuX2FkYXB0ZXIgKiBhZGFwdGVyLAorCQkJCSAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaSA9IDA7CisJc3RydWN0IGRldl9tY19saXN0ICptY3B0ciA9IGRldi0+bWNfbGlzdDsKKworCWZvciAoaSA9IDA7IGkgPCBkZXYtPm1jX2NvdW50OyBpKyspIHsKKwkJbWVtY3B5KCZhZGFwdGVyLT5tdWx0aWNhc3RsaXN0W2ldLCBtY3B0ci0+ZG1pX2FkZHIsIEVUSF9BTEVOKTsKKwkJbWNwdHIgPSBtY3B0ci0+bmV4dDsKKwl9CisKKwlyZXR1cm4gaTsKKworfQorCitzdGF0aWMgdm9pZCB3bGFuX3NldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXdsYW5fcHJpdmF0ZSAqcHJpdiA9IGRldi0+cHJpdjsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCWludCBvbGRwYWNrZXRmaWx0ZXI7CisKKwlFTlRFUigpOworCisJb2xkcGFja2V0ZmlsdGVyID0gYWRhcHRlci0+Y3VycmVudHBhY2tldGZpbHRlcjsKKworCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsKKwkJbGJzX3ByX2RlYnVnKDEsICJlbmFibGUgUHJvbWlzY3VvdXMgbW9kZVxuIik7CisJCWFkYXB0ZXItPmN1cnJlbnRwYWNrZXRmaWx0ZXIgfD0KKwkJICAgIGNtZF9hY3RfbWFjX3Byb21pc2N1b3VzX2VuYWJsZTsKKwkJYWRhcHRlci0+Y3VycmVudHBhY2tldGZpbHRlciAmPQorCQkgICAgfihjbWRfYWN0X21hY19hbGxfbXVsdGljYXN0X2VuYWJsZSB8CisJCSAgICAgIGNtZF9hY3RfbWFjX211bHRpY2FzdF9lbmFibGUpOworCX0gZWxzZSB7CisJCS8qIE11bHRpY2FzdCAqLworCQlhZGFwdGVyLT5jdXJyZW50cGFja2V0ZmlsdGVyICY9CisJCSAgICB+Y21kX2FjdF9tYWNfcHJvbWlzY3VvdXNfZW5hYmxlOworCisJCWlmIChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJIHx8IGRldi0+bWNfY291bnQgPgorCQkgICAgTVJWRFJWX01BWF9NVUxUSUNBU1RfTElTVF9TSVpFKSB7CisJCQlsYnNfcHJfZGVidWcoMSwgIkVuYWJsaW5nIEFsbCBNdWx0aWNhc3QhXG4iKTsKKwkJCWFkYXB0ZXItPmN1cnJlbnRwYWNrZXRmaWx0ZXIgfD0KKwkJCSAgICBjbWRfYWN0X21hY19hbGxfbXVsdGljYXN0X2VuYWJsZTsKKwkJCWFkYXB0ZXItPmN1cnJlbnRwYWNrZXRmaWx0ZXIgJj0KKwkJCSAgICB+Y21kX2FjdF9tYWNfbXVsdGljYXN0X2VuYWJsZTsKKwkJfSBlbHNlIHsKKwkJCWFkYXB0ZXItPmN1cnJlbnRwYWNrZXRmaWx0ZXIgJj0KKwkJCSAgICB+Y21kX2FjdF9tYWNfYWxsX211bHRpY2FzdF9lbmFibGU7CisKKwkJCWlmICghZGV2LT5tY19jb3VudCkgeworCQkJCWxic19wcl9kZWJ1ZygxLCAiTm8gbXVsdGljYXN0IGFkZHJlc3NlcyAtICIKKwkJCQkgICAgICAgImRpc2FibGluZyBtdWx0aWNhc3QhXG4iKTsKKwkJCQlhZGFwdGVyLT5jdXJyZW50cGFja2V0ZmlsdGVyICY9CisJCQkJICAgIH5jbWRfYWN0X21hY19tdWx0aWNhc3RfZW5hYmxlOworCQkJfSBlbHNlIHsKKwkJCQlpbnQgaTsKKworCQkJCWFkYXB0ZXItPmN1cnJlbnRwYWNrZXRmaWx0ZXIgfD0KKwkJCQkgICAgY21kX2FjdF9tYWNfbXVsdGljYXN0X2VuYWJsZTsKKworCQkJCWFkYXB0ZXItPm5yX29mX211bHRpY2FzdG1hY2FkZHIgPQorCQkJCSAgICB3bGFuX2NvcHlfbXVsdGljYXN0X2FkZHJlc3MoYWRhcHRlciwgZGV2KTsKKworCQkJCWxic19wcl9kZWJ1ZygxLCAiTXVsdGljYXN0IGFkZHJlc3NlczogJWRcbiIsCisJCQkJICAgICAgIGRldi0+bWNfY291bnQpOworCisJCQkJZm9yIChpID0gMDsgaSA8IGRldi0+bWNfY291bnQ7IGkrKykgeworCQkJCQlsYnNfcHJfZGVidWcoMSwgIk11bHRpY2FzdCBhZGRyZXNzICVkOiIKKwkJCQkJICAgICAgICIleCAleCAleCAleCAleCAleFxuIiwgaSwKKwkJCQkJICAgICAgIGFkYXB0ZXItPm11bHRpY2FzdGxpc3RbaV1bMF0sCisJCQkJCSAgICAgICBhZGFwdGVyLT5tdWx0aWNhc3RsaXN0W2ldWzFdLAorCQkJCQkgICAgICAgYWRhcHRlci0+bXVsdGljYXN0bGlzdFtpXVsyXSwKKwkJCQkJICAgICAgIGFkYXB0ZXItPm11bHRpY2FzdGxpc3RbaV1bM10sCisJCQkJCSAgICAgICBhZGFwdGVyLT5tdWx0aWNhc3RsaXN0W2ldWzRdLAorCQkJCQkgICAgICAgYWRhcHRlci0+bXVsdGljYXN0bGlzdFtpXVs1XSk7CisJCQkJfQorCQkJCS8qIHNldCBtdWx0aWNhc3QgYWRkcmVzc2VzIHRvIGZpcm13YXJlICovCisJCQkJbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsCisJCQkJCQkgICAgICBjbWRfbWFjX211bHRpY2FzdF9hZHIsCisJCQkJCQkgICAgICBjbWRfYWN0X3NldCwgMCwgMCwKKwkJCQkJCSAgICAgIE5VTEwpOworCQkJfQorCQl9CisJfQorCisJaWYgKGFkYXB0ZXItPmN1cnJlbnRwYWNrZXRmaWx0ZXIgIT0gb2xkcGFja2V0ZmlsdGVyKSB7CisJCWxpYmVydGFzX3NldF9tYWNfcGFja2V0X2ZpbHRlcihwcml2KTsKKwl9CisKKwlMRUFWRSgpOworfQorCisvKioKKyAqICBAYnJpZWYgVGhpcyBmdW5jdGlvbiBoYW5sZGVzIHRoZSBtYWpvciBqb2IgaW4gV0xBTiBkcml2ZXIuCisgKiAgaXQgaGFuZGxlcyB0aGUgZXZlbnQgZ2VuZXJhdGVkIGJ5IGZpcm13YXJlLCByeCBkYXRhIHJlY2VpdmVkCisgKiAgZnJvbSBmaXJtd2FyZSBhbmQgdHggZGF0YSBzZW50IGZyb20ga2VybmVsLgorICoKKyAqICBAcGFyYW0gZGF0YSAgICBBIHBvaW50ZXIgdG8gd2xhbl90aHJlYWQgc3RydWN0dXJlCisgKiAgQHJldHVybiAJICAgMAorICovCitzdGF0aWMgaW50IHdsYW5fc2VydmljZV9tYWluX3RocmVhZCh2b2lkICpkYXRhKQoreworCXN0cnVjdCB3bGFuX3RocmVhZCAqdGhyZWFkID0gZGF0YTsKKwl3bGFuX3ByaXZhdGUgKnByaXYgPSB0aHJlYWQtPnByaXY7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwl3YWl0X3F1ZXVlX3Qgd2FpdDsKKwl1OCBpcmVnID0gMDsKKworCUVOVEVSKCk7CisKKwl3bGFuX2FjdGl2YXRlX3RocmVhZCh0aHJlYWQpOworCisJaW5pdF93YWl0cXVldWVfZW50cnkoJndhaXQsIGN1cnJlbnQpOworCisJZm9yICg7OykgeworCQlsYnNfcHJfZGVidWcoMSwgIm1haW4tdGhyZWFkIDExMTogaW50Y291bnRlcj0lZCAiCisJCSAgICAgICAiY3VycmVudHR4c2tiPSVwIGRubGRfc2VudD0lZFxuIiwKKwkJICAgICAgIGFkYXB0ZXItPmludGNvdW50ZXIsCisJCSAgICAgICBhZGFwdGVyLT5jdXJyZW50dHhza2IsIHByaXYtPndsYW5fZGV2LmRubGRfc2VudCk7CisKKwkJYWRkX3dhaXRfcXVldWUoJnRocmVhZC0+d2FpdHEsICZ3YWl0KTsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJc3Bpbl9sb2NrX2lycSgmYWRhcHRlci0+ZHJpdmVyX2xvY2spOworCQlpZiAoKGFkYXB0ZXItPnBzc3RhdGUgPT0gUFNfU1RBVEVfU0xFRVApIHx8CisJCSAgICAoIWFkYXB0ZXItPmludGNvdW50ZXIKKwkJICAgICAmJiAocHJpdi0+d2xhbl9kZXYuZG5sZF9zZW50IHx8IGFkYXB0ZXItPmN1cl9jbWQgfHwKKwkJCSBsaXN0X2VtcHR5KCZhZGFwdGVyLT5jbWRwZW5kaW5ncSkpKSkgeworCQkJbGJzX3ByX2RlYnVnKDEsCisJCQkgICAgICAgIm1haW4tdGhyZWFkIHNsZWVwaW5nLi4uIENvbm49JWQgSW50Qz0lZCBQU19tb2RlPSVkIFBTX1N0YXRlPSVkXG4iLAorCQkJICAgICAgIGFkYXB0ZXItPmNvbm5lY3Rfc3RhdHVzLCBhZGFwdGVyLT5pbnRjb3VudGVyLAorCQkJICAgICAgIGFkYXB0ZXItPnBzbW9kZSwgYWRhcHRlci0+cHNzdGF0ZSk7CisJCQlzcGluX3VubG9ja19pcnEoJmFkYXB0ZXItPmRyaXZlcl9sb2NrKTsKKwkJCXNjaGVkdWxlKCk7CisJCX0gZWxzZQorCQkJc3Bpbl91bmxvY2tfaXJxKCZhZGFwdGVyLT5kcml2ZXJfbG9jayk7CisKKworCQlsYnNfcHJfZGVidWcoMSwKKwkJICAgICAgICJtYWluLXRocmVhZCAyMjIgKHdha2luZyB1cCk6IGludGNvdW50ZXI9JWQgY3VycmVudHR4c2tiPSVwICIKKwkJICAgICAgICJkbmxkX3NlbnQ9JWRcbiIsIGFkYXB0ZXItPmludGNvdW50ZXIsCisJCSAgICAgICBhZGFwdGVyLT5jdXJyZW50dHhza2IsIHByaXYtPndsYW5fZGV2LmRubGRfc2VudCk7CisKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwkJcmVtb3ZlX3dhaXRfcXVldWUoJnRocmVhZC0+d2FpdHEsICZ3YWl0KTsKKwkJdHJ5X3RvX2ZyZWV6ZSgpOworCisJCWxic19wcl9kZWJ1ZygxLCAibWFpbi10aHJlYWQgMzMzOiBpbnRjb3VudGVyPSVkIGN1cnJlbnR0eHNrYj0lcCAiCisJCSAgICAgICAiZG5sZF9zZW50PSVkXG4iLAorCQkgICAgICAgYWRhcHRlci0+aW50Y291bnRlciwKKwkJICAgICAgIGFkYXB0ZXItPmN1cnJlbnR0eHNrYiwgcHJpdi0+d2xhbl9kZXYuZG5sZF9zZW50KTsKKworCQlpZiAoa3RocmVhZF9zaG91bGRfc3RvcCgpCisJCSAgICB8fCBhZGFwdGVyLT5zdXJwcmlzZXJlbW92ZWQpIHsKKwkJCWxic19wcl9kZWJ1ZygxLAorCQkJICAgICAgICJtYWluLXRocmVhZDogYnJlYWsgZnJvbSBtYWluIHRocmVhZDogc3VycHJpc2VyZW1vdmVkPTB4JXhcbiIsCisJCQkgICAgICAgYWRhcHRlci0+c3VycHJpc2VyZW1vdmVkKTsKKwkJCWJyZWFrOworCQl9CisKKworCQlzcGluX2xvY2tfaXJxKCZhZGFwdGVyLT5kcml2ZXJfbG9jayk7CisJCWlmIChhZGFwdGVyLT5pbnRjb3VudGVyKSB7CisJCQl1OCBpbnRfc3RhdHVzOworCQkJYWRhcHRlci0+aW50Y291bnRlciA9IDA7CisJCQlpbnRfc3RhdHVzID0gbGliZXJ0YXNfc2JpX2dldF9pbnRfc3RhdHVzKHByaXYsICZpcmVnKTsKKworCQkJaWYgKGludF9zdGF0dXMpIHsKKwkJCQlsYnNfcHJfZGVidWcoMSwKKwkJCQkgICAgICAgIm1haW4tdGhyZWFkOiByZWFkaW5nIEhPU1RfSU5UX1NUQVRVU19SRUcgZmFpbGVkXG4iKTsKKwkJCQlzcGluX3VubG9ja19pcnEoJmFkYXB0ZXItPmRyaXZlcl9sb2NrKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWFkYXB0ZXItPmhpc3JlZ2NweSB8PSBpcmVnOworCQl9CisKKwkJbGJzX3ByX2RlYnVnKDEsICJtYWluLXRocmVhZCA0NDQ6IGludGNvdW50ZXI9JWQgY3VycmVudHR4c2tiPSVwICIKKwkJICAgICAgICJkbmxkX3NlbnQ9JWRcbiIsCisJCSAgICAgICBhZGFwdGVyLT5pbnRjb3VudGVyLAorCQkgICAgICAgYWRhcHRlci0+Y3VycmVudHR4c2tiLCBwcml2LT53bGFuX2Rldi5kbmxkX3NlbnQpOworCisJCS8qIGNvbW1hbmQgcmVzcG9uc2U/ICovCisJCWlmIChhZGFwdGVyLT5oaXNyZWdjcHkgJiBoaXNfY21kdXBsZHJkeSkgeworCQkJbGJzX3ByX2RlYnVnKDEsICJtYWluLXRocmVhZDogY21kIHJlc3BvbnNlIHJlYWR5LlxuIik7CisKKwkJCWFkYXB0ZXItPmhpc3JlZ2NweSAmPSB+aGlzX2NtZHVwbGRyZHk7CisJCQlzcGluX3VubG9ja19pcnEoJmFkYXB0ZXItPmRyaXZlcl9sb2NrKTsKKwkJCWxpYmVydGFzX3Byb2Nlc3NfcnhfY29tbWFuZChwcml2KTsKKwkJCXNwaW5fbG9ja19pcnEoJmFkYXB0ZXItPmRyaXZlcl9sb2NrKTsKKwkJfQorCisJCS8qIEFueSBDYXJkIEV2ZW50ICovCisJCWlmIChhZGFwdGVyLT5oaXNyZWdjcHkgJiBoaXNfY2FyZGV2ZW50KSB7CisJCQlsYnNfcHJfZGVidWcoMSwgIm1haW4tdGhyZWFkOiBDYXJkIEV2ZW50IEFjdGl2aXR5LlxuIik7CisKKwkJCWFkYXB0ZXItPmhpc3JlZ2NweSAmPSB+aGlzX2NhcmRldmVudDsKKworCQkJaWYgKGxpYmVydGFzX3NiaV9yZWFkX2V2ZW50X2NhdXNlKHByaXYpKSB7CisJCQkJbGJzX3ByX2FsZXJ0KAorCQkJCSAgICAgICAibWFpbi10aHJlYWQ6IGxpYmVydGFzX3NiaV9yZWFkX2V2ZW50X2NhdXNlIGZhaWxlZC5cbiIpOworCQkJCXNwaW5fdW5sb2NrX2lycSgmYWRhcHRlci0+ZHJpdmVyX2xvY2spOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJc3Bpbl91bmxvY2tfaXJxKCZhZGFwdGVyLT5kcml2ZXJfbG9jayk7CisJCQlsaWJlcnRhc19wcm9jZXNzX2V2ZW50KHByaXYpOworCQl9IGVsc2UKKwkJCXNwaW5fdW5sb2NrX2lycSgmYWRhcHRlci0+ZHJpdmVyX2xvY2spOworCisJCS8qIENoZWNrIGlmIHdlIG5lZWQgdG8gY29uZmlybSBTbGVlcCBSZXF1ZXN0IHJlY2VpdmVkIHByZXZpb3VzbHkgKi8KKwkJaWYgKGFkYXB0ZXItPnBzc3RhdGUgPT0gUFNfU1RBVEVfUFJFX1NMRUVQKSB7CisJCQlpZiAoIXByaXYtPndsYW5fZGV2LmRubGRfc2VudCAmJiAhYWRhcHRlci0+Y3VyX2NtZCkgeworCQkJCWlmIChhZGFwdGVyLT5jb25uZWN0X3N0YXR1cyA9PQorCQkJCSAgICBsaWJlcnRhc19jb25uZWN0ZWQpIHsKKwkJCQkJbGJzX3ByX2RlYnVnKDEsCisJCQkJCSAgICAgICAibWFpbl90aHJlYWQ6IFBSRV9TTEVFUC0taW50Y291bnRlcj0lZCBjdXJyZW50dHhza2I9JXAgIgorCQkJCQkgICAgICAgImRubGRfc2VudD0lZCBjdXJfY21kPSVwLCBjb25maXJtIG5vd1xuIiwKKwkJCQkJICAgICAgIGFkYXB0ZXItPmludGNvdW50ZXIsCisJCQkJCSAgICAgICBhZGFwdGVyLT5jdXJyZW50dHhza2IsCisJCQkJCSAgICAgICBwcml2LT53bGFuX2Rldi5kbmxkX3NlbnQsCisJCQkJCSAgICAgICBhZGFwdGVyLT5jdXJfY21kKTsKKworCQkJCQlsaWJlcnRhc19wc19jb25maXJtX3NsZWVwKHByaXYsCisJCQkJCQkgICAgICAgKHUxNikgYWRhcHRlci0+cHNtb2RlKTsKKwkJCQl9IGVsc2UgeworCQkJCQkvKiB3b3JrYXJvdW5kIGZvciBmaXJtd2FyZSBzZW5kaW5nCisJCQkJCSAqIGRlYXV0aC9saW5rbG9zcyBldmVudCBpbW1lZGlhdGVseQorCQkJCQkgKiBhZnRlciBzbGVlcCByZXF1ZXN0LCByZW1vdmUgdGhpcworCQkJCQkgKiBhZnRlciBmaXJtd2FyZSBmaXhlcyBpdAorCQkJCQkgKi8KKwkJCQkJYWRhcHRlci0+cHNzdGF0ZSA9IFBTX1NUQVRFX0FXQUtFOworCQkJCQlsYnNfcHJfYWxlcnQoCisJCQkJCSAgICAgICAibWFpbi10aHJlYWQ6IGlnbm9yZSBQU19TbGVlcENvbmZpcm0gaW4gbm9uLWNvbm5lY3RlZCBzdGF0ZVxuIik7CisJCQkJfQorCQkJfQorCQl9CisKKwkJLyogVGhlIFBTIHN0YXRlIGlzIGNoYW5nZWQgZHVyaW5nIHByb2Nlc3Npbmcgb2YgU2xlZXAgUmVxdWVzdAorCQkgKiBldmVudCBhYm92ZQorCQkgKi8KKwkJaWYgKChwcml2LT5hZGFwdGVyLT5wc3N0YXRlID09IFBTX1NUQVRFX1NMRUVQKSB8fAorCQkgICAgKHByaXYtPmFkYXB0ZXItPnBzc3RhdGUgPT0gUFNfU1RBVEVfUFJFX1NMRUVQKSkKKwkJCWNvbnRpbnVlOworCisJCS8qIEV4ZWN1dGUgdGhlIG5leHQgY29tbWFuZCAqLworCQlpZiAoIXByaXYtPndsYW5fZGV2LmRubGRfc2VudCAmJiAhcHJpdi0+YWRhcHRlci0+Y3VyX2NtZCkKKwkJCWxpYmVydGFzX2V4ZWN1dGVfbmV4dF9jb21tYW5kKHByaXYpOworCisJCS8qIFdha2UtdXAgY29tbWFuZCB3YWl0ZXJzIHdoaWNoIGNhbid0IHNsZWVwIGluCisJCSAqIGxpYmVydGFzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZAorCQkgKi8KKwkJaWYgKCFhZGFwdGVyLT5ucl9jbWRfcGVuZGluZykKKwkJCXdha2VfdXBfYWxsKCZhZGFwdGVyLT5jbWRfcGVuZGluZyk7CisKKwkJbGliZXJ0YXNfdHhfcnVucXVldWUocHJpdik7CisJfQorCisJZGVsX3RpbWVyKCZhZGFwdGVyLT5jb21tYW5kX3RpbWVyKTsKKwlhZGFwdGVyLT5ucl9jbWRfcGVuZGluZyA9IDA7CisJd2FrZV91cF9hbGwoJmFkYXB0ZXItPmNtZF9wZW5kaW5nKTsKKwl3bGFuX2RlYWN0aXZhdGVfdGhyZWFkKHRocmVhZCk7CisKKwlMRUFWRSgpOworCXJldHVybiAwOworfQorCisvKioKKyAqIEBicmllZiBUaGlzIGZ1bmN0aW9uIGFkZHMgdGhlIGNhcmQuIGl0IHdpbGwgcHJvYmUgdGhlCisgKiBjYXJkLCBhbGxvY2F0ZSB0aGUgd2xhbl9wcml2IGFuZCBpbml0aWFsaXplIHRoZSBkZXZpY2UuCisgKgorICogIEBwYXJhbSBjYXJkICAgIEEgcG9pbnRlciB0byBjYXJkCisgKiAgQHJldHVybiAJICAgQSBwb2ludGVyIHRvIHdsYW5fcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqLword2xhbl9wcml2YXRlICp3bGFuX2FkZF9jYXJkKHZvaWQgKmNhcmQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IE5VTEw7CisJc3RydWN0IG5ldF9kZXZpY2UgKm1lc2hfZGV2ID0gTlVMTDsKKwl3bGFuX3ByaXZhdGUgKnByaXYgPSBOVUxMOworCisJRU5URVIoKTsKKworCS8qIEFsbG9jYXRlIGFuIEV0aGVybmV0IGRldmljZSBhbmQgcmVnaXN0ZXIgaXQgKi8KKwlpZiAoIShkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yod2xhbl9wcml2YXRlKSkpKSB7CisJCWxic19wcl9hbGVydCggIkluaXQgZXRoZXJuZXQgZGV2aWNlIGZhaWxlZCFcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlwcml2ID0gZGV2LT5wcml2OworCisJLyogYWxsb2NhdGUgYnVmZmVyIGZvciB3bGFuX2FkYXB0ZXIgKi8KKwlpZiAoIShwcml2LT5hZGFwdGVyID0ga21hbGxvYyhzaXplb2Yod2xhbl9hZGFwdGVyKSwgR0ZQX0tFUk5FTCkpKSB7CisJCWxic19wcl9hbGVydCggIkFsbG9jYXRlIGJ1ZmZlciBmb3Igd2xhbl9hZGFwdGVyIGZhaWxlZCFcbiIpOworCQlnb3RvIGVycl9rbWFsbG9jOworCX0KKworCS8qIEFsbG9jYXRlIGEgdmlydHVhbCBtZXNoIGRldmljZSAqLworCWlmICghKG1lc2hfZGV2ID0gYWxsb2NfbmV0ZGV2KDAsICJtc2glZCIsIGV0aGVyX3NldHVwKSkpIHsKKwkJbGJzX3ByX2RlYnVnKDEsICJJbml0IGV0aGVybmV0IGRldmljZSBmYWlsZWQhXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogQm90aCBpbnRlcnZhY2VzIHNoYXJlIHRoZSBwcml2IHN0cnVjdHVyZSAqLworCW1lc2hfZGV2LT5wcml2ID0gcHJpdjsKKworCS8qIGluaXQgd2xhbl9hZGFwdGVyICovCisJbWVtc2V0KHByaXYtPmFkYXB0ZXIsIDAsIHNpemVvZih3bGFuX2FkYXB0ZXIpKTsKKworCXByaXYtPndsYW5fZGV2Lm5ldGRldiA9IGRldjsKKwlwcml2LT53bGFuX2Rldi5jYXJkID0gY2FyZDsKKwlwcml2LT5tZXNoX29wZW4gPSAwOworCXByaXYtPmluZnJhX29wZW4gPSAwOworCXByaXYtPm1lc2hfZGV2ID0gbWVzaF9kZXY7CisJd2xhbnByaXYgPSBwcml2OworCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCVNFVF9NT0RVTEVfT1dORVIobWVzaF9kZXYpOworCisJLyogU2V0dXAgdGhlIE9TIEludGVyZmFjZSB0byBvdXIgZnVuY3Rpb25zICovCisJZGV2LT5vcGVuID0gd2xhbl9vcGVuOworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gd2xhbl9wcmVfc3RhcnRfeG1pdDsKKwlkZXYtPnN0b3AgPSB3bGFuX2Nsb3NlOworCWRldi0+ZG9faW9jdGwgPSBsaWJlcnRhc19kb19pb2N0bDsKKwlkZXYtPnNldF9tYWNfYWRkcmVzcyA9IHdsYW5fc2V0X21hY19hZGRyZXNzOworCW1lc2hfZGV2LT5vcGVuID0gbWVzaF9vcGVuOworCW1lc2hfZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBtZXNoX3ByZV9zdGFydF94bWl0OworCW1lc2hfZGV2LT5zdG9wID0gbWVzaF9jbG9zZTsKKwltZXNoX2Rldi0+ZG9faW9jdGwgPSBsaWJlcnRhc19kb19pb2N0bDsKKwltZW1jcHkobWVzaF9kZXYtPmRldl9hZGRyLCB3bGFucHJpdi0+d2xhbl9kZXYubmV0ZGV2LT5kZXZfYWRkciwKKwkJCXNpemVvZih3bGFucHJpdi0+d2xhbl9kZXYubmV0ZGV2LT5kZXZfYWRkcikpOworCisjZGVmaW5lCVdMQU5fV0FUQ0hET0dfVElNRU9VVAkoNSAqIEhaKQorCisJZGV2LT50eF90aW1lb3V0ID0gd2xhbl90eF90aW1lb3V0OworCWRldi0+Z2V0X3N0YXRzID0gd2xhbl9nZXRfc3RhdHM7CisJZGV2LT53YXRjaGRvZ190aW1lbyA9IFdMQU5fV0FUQ0hET0dfVElNRU9VVDsKKwlkZXYtPmV0aHRvb2xfb3BzID0gJmxpYmVydGFzX2V0aHRvb2xfb3BzOworCW1lc2hfZGV2LT5nZXRfc3RhdHMgPSB3bGFuX2dldF9zdGF0czsKKwltZXNoX2Rldi0+ZXRodG9vbF9vcHMgPSAmbGliZXJ0YXNfZXRodG9vbF9vcHM7CisKKyNpZmRlZglXSVJFTEVTU19FWFQKKwlkZXYtPndpcmVsZXNzX2hhbmRsZXJzID0gKHN0cnVjdCBpd19oYW5kbGVyX2RlZiAqKSZsaWJlcnRhc19oYW5kbGVyX2RlZjsKKwltZXNoX2Rldi0+d2lyZWxlc3NfaGFuZGxlcnMgPSAoc3RydWN0IGl3X2hhbmRsZXJfZGVmICopJmxpYmVydGFzX2hhbmRsZXJfZGVmOworI2VuZGlmCisjZGVmaW5lIE5FVElGX0ZfRFlOQUxMT0MgMTYKKwlkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfRFlOQUxMT0M7CisJZGV2LT5mbGFncyB8PSBJRkZfQlJPQURDQVNUIHwgSUZGX01VTFRJQ0FTVDsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IHdsYW5fc2V0X211bHRpY2FzdF9saXN0OworCisJSU5JVF9MSVNUX0hFQUQoJnByaXYtPmFkYXB0ZXItPmNtZGZyZWVxKTsKKwlJTklUX0xJU1RfSEVBRCgmcHJpdi0+YWRhcHRlci0+Y21kcGVuZGluZ3EpOworCisJc3Bpbl9sb2NrX2luaXQoJnByaXYtPmFkYXB0ZXItPmRyaXZlcl9sb2NrKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwcml2LT5hZGFwdGVyLT5jbWRfcGVuZGluZyk7CisJcHJpdi0+YWRhcHRlci0+bnJfY21kX3BlbmRpbmcgPSAwOworCisJbGJzX3ByX2RlYnVnKDEsICJTdGFydGluZyBrdGhyZWFkLi4uXG4iKTsKKwlwcml2LT5tYWludGhyZWFkLnByaXYgPSBwcml2OworCXdsYW5fY3JlYXRlX3RocmVhZCh3bGFuX3NlcnZpY2VfbWFpbl90aHJlYWQsCisJCQkgICAmcHJpdi0+bWFpbnRocmVhZCwgIndsYW5fbWFpbl9zZXJ2aWNlIik7CisKKwlwcml2LT5hc3NvY190aHJlYWQgPQorCQljcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgibGliZXJ0YXNfYXNzb2MiKTsKKwlJTklUX0RFTEFZRURfV09SSygmcHJpdi0+YXNzb2Nfd29yaywgd2xhbl9hc3NvY2lhdGlvbl93b3JrZXIpOworCisJLyoKKwkgKiBSZWdpc3RlciB0aGUgZGV2aWNlLiBGaWxsdXAgdGhlIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUgd2l0aAorCSAqIHJlbGV2YW50IGluZm9ybWF0aW9uIGZyb20gdGhlIGNhcmQgYW5kIHJlcXVlc3QgZm9yIHRoZSByZXF1aXJlZAorCSAqIElSUS4KKwkgKi8KKwlpZiAobGliZXJ0YXNfc2JpX3JlZ2lzdGVyX2Rldihwcml2KSA8IDApIHsKKwkJbGJzX3ByX2luZm8oImZhaWxlZCB0byByZWdpc3RlciB3bGFuIGRldmljZSFcbiIpOworCQlnb3RvIGVycl9yZWdpc3RlcmRldjsKKwl9CisKKwkvKiBpbml0IEZXIGFuZCBIVyAqLworCWlmIChsaWJlcnRhc19pbml0X2Z3KHByaXYpKSB7CisJCWxic19wcl9kZWJ1ZygxLCAiRmlybXdhcmUgSW5pdCBmYWlsZWRcbiIpOworCQlnb3RvIGVycl9yZWdpc3RlcmRldjsKKwl9CisKKwlpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldikpIHsKKwkJbGJzX3ByX2VycigiQ2Fubm90IHJlZ2lzdGVyIG5ldHdvcmsgZGV2aWNlIVxuIik7CisJCWdvdG8gZXJyX2luaXRfZnc7CisJfQorCisJLyogUmVnaXN0ZXIgdmlydHVhbCBtZXNoIGludGVyZmFjZSAqLworCWlmIChyZWdpc3Rlcl9uZXRkZXYobWVzaF9kZXYpKSB7CisJCWxic19wcl9pbmZvKCJDYW5ub3QgcmVnaXN0ZXIgbWVzaCB2aXJ0dWFsIGludGVyZmFjZSFcbiIpOworCQlnb3RvIGVycl9pbml0X2Z3OworCX0KKworCWxic19wcl9pbmZvKCIlczogTWFydmVsbCBXbGFuIDgwMi4xMSBhZGFwdGVyICIsIGRldi0+bmFtZSk7CisKKwlsaWJlcnRhc19kZWJ1Z2ZzX2luaXRfb25lKHByaXYsIGRldik7CisKKwlpZiAobGliZXJ0YXNfZm91bmQgPT0gTUFYX0RFVlMpCisJCWdvdG8gZXJyX2luaXRfZnc7CisJbGliZXJ0YXNfZGV2c1tsaWJlcnRhc19mb3VuZF0gPSBkZXY7CisJbGliZXJ0YXNfZm91bmQrKzsKKyNpZmRlZiBFTkFCTEVfUE0KKwlpZiAoISh3bGFuX3BtX2RldiA9IHBtX3JlZ2lzdGVyKFBNX1VOS05PV05fREVWLCAwLCB3bGFuX3BtX2NhbGxiYWNrKSkpCisJCWxic19wcl9hbGVydCggImZhaWxlZCB0byByZWdpc3RlciBQTSBjYWxsYmFja1xuIik7CisjZW5kaWYKKwlpZiAoZGV2aWNlX2NyZWF0ZV9maWxlKCYobWVzaF9kZXYtPmRldiksICZkZXZfYXR0cl9saWJlcnRhc19tcHApKQorCQlnb3RvIGVycl9jcmVhdGVfZmlsZTsKKworCUxFQVZFKCk7CisJcmV0dXJuIHByaXY7CisKK2Vycl9jcmVhdGVfZmlsZToKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJihtZXNoX2Rldi0+ZGV2KSwgJmRldl9hdHRyX2xpYmVydGFzX21wcCk7CitlcnJfaW5pdF9mdzoKKwlsaWJlcnRhc19zYmlfdW5yZWdpc3Rlcl9kZXYocHJpdik7CitlcnJfcmVnaXN0ZXJkZXY6CisJZGVzdHJveV93b3JrcXVldWUocHJpdi0+YXNzb2NfdGhyZWFkKTsKKwkvKiBTdG9wIHRoZSB0aHJlYWQgc2VydmljaW5nIHRoZSBpbnRlcnJ1cHRzICovCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwcml2LT5tYWludGhyZWFkLndhaXRxKTsKKwl3bGFuX3Rlcm1pbmF0ZV90aHJlYWQoJnByaXYtPm1haW50aHJlYWQpOworCWtmcmVlKHByaXYtPmFkYXB0ZXIpOworZXJyX2ttYWxsb2M6CisJZnJlZV9uZXRkZXYoZGV2KTsKKwlmcmVlX25ldGRldihtZXNoX2Rldik7CisJd2xhbnByaXYgPSBOVUxMOworCisJTEVBVkUoKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgd2FrZV9wZW5kaW5nX2NtZG5vZGVzKHdsYW5fcHJpdmF0ZSAqcHJpdikKK3sKKwlzdHJ1Y3QgY21kX2N0cmxfbm9kZSAqY21kbm9kZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmFkYXB0ZXItPmRyaXZlcl9sb2NrLCBmbGFncyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjbWRub2RlLCAmcHJpdi0+YWRhcHRlci0+Y21kcGVuZGluZ3EsIGxpc3QpIHsKKwkJY21kbm9kZS0+Y21kd2FpdHF3b2tlbiA9IDE7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY21kbm9kZS0+Y21kd2FpdF9xKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+YWRhcHRlci0+ZHJpdmVyX2xvY2ssIGZsYWdzKTsKK30KKworCitpbnQgd2xhbl9yZW1vdmVfY2FyZCh2b2lkICpjYXJkKQoreworCXdsYW5fcHJpdmF0ZSAqcHJpdiA9IGxpYmVydGFzX3NiaV9nZXRfcHJpdihjYXJkKTsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXI7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbWVzaF9kZXY7CisJdW5pb24gaXdyZXFfZGF0YSB3cnF1OworCWludCBpOworCisJRU5URVIoKTsKKworCWlmICghcHJpdikgeworCQlMRUFWRSgpOworCQlyZXR1cm4gMDsKKwl9CisKKwlhZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKworCWlmICghYWRhcHRlcikgeworCQlMRUFWRSgpOworCQlyZXR1cm4gMDsKKwl9CisKKwlkZXYgPSBwcml2LT53bGFuX2Rldi5uZXRkZXY7CisJbWVzaF9kZXYgPSBwcml2LT5tZXNoX2RldjsKKworCW5ldGlmX3N0b3BfcXVldWUobWVzaF9kZXYpOworCW5ldGlmX3N0b3BfcXVldWUocHJpdi0+d2xhbl9kZXYubmV0ZGV2KTsKKwluZXRpZl9jYXJyaWVyX29mZihwcml2LT53bGFuX2Rldi5uZXRkZXYpOworCisJd2FrZV9wZW5kaW5nX2NtZG5vZGVzKHByaXYpOworCisJZGV2aWNlX3JlbW92ZV9maWxlKCYobWVzaF9kZXYtPmRldiksICZkZXZfYXR0cl9saWJlcnRhc19tcHApOworCXVucmVnaXN0ZXJfbmV0ZGV2KG1lc2hfZGV2KTsKKwl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCisJY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+YXNzb2Nfd29yayk7CisJZGVzdHJveV93b3JrcXVldWUocHJpdi0+YXNzb2NfdGhyZWFkKTsKKworCWlmIChhZGFwdGVyLT5wc21vZGUgPT0gd2xhbjgwMl8xMXBvd2VybW9kZW1heF9wc3ApIHsKKwkJYWRhcHRlci0+cHNtb2RlID0gd2xhbjgwMl8xMXBvd2VybW9kZWNhbTsKKwkJbGliZXJ0YXNfcHNfd2FrZXVwKHByaXYsIGNtZF9vcHRpb25fd2FpdGZvcnJzcCk7CisJfQorCisJbWVtc2V0KHdycXUuYXBfYWRkci5zYV9kYXRhLCAweGFhLCBFVEhfQUxFTik7CisJd3JxdS5hcF9hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKwl3aXJlbGVzc19zZW5kX2V2ZW50KHByaXYtPndsYW5fZGV2Lm5ldGRldiwgU0lPQ0dJV0FQLCAmd3JxdSwgTlVMTCk7CisKKyNpZmRlZiBFTkFCTEVfUE0KKwlwbV91bnJlZ2lzdGVyKHdsYW5fcG1fZGV2KTsKKyNlbmRpZgorCisJYWRhcHRlci0+c3VycHJpc2VyZW1vdmVkID0gMTsKKworCS8qIFN0b3AgdGhlIHRocmVhZCBzZXJ2aWNpbmcgdGhlIGludGVycnVwdHMgKi8KKwl3bGFuX3Rlcm1pbmF0ZV90aHJlYWQoJnByaXYtPm1haW50aHJlYWQpOworCisJbGliZXJ0YXNfZGVidWdmc19yZW1vdmVfb25lKHByaXYpOworCisJbGJzX3ByX2RlYnVnKDEsICJGcmVlIGFkYXB0ZXJcbiIpOworCWxpYmVydGFzX2ZyZWVfYWRhcHRlcihwcml2KTsKKworCWZvciAoaSA9IDA7IGk8bGliZXJ0YXNfZm91bmQ7IGkrKykgeworCQlpZiAobGliZXJ0YXNfZGV2c1tpXT09cHJpdi0+d2xhbl9kZXYubmV0ZGV2KSB7CisJCQlsaWJlcnRhc19kZXZzW2ldID0gbGliZXJ0YXNfZGV2c1stLWxpYmVydGFzX2ZvdW5kXTsKKwkJCWxpYmVydGFzX2RldnNbbGliZXJ0YXNfZm91bmRdID0gTlVMTCA7CisJCQlicmVhayA7CisJCX0KKwl9CisKKwlsYnNfcHJfZGVidWcoMSwgIlVucmVnaXN0ZXIgZmluaXNoXG4iKTsKKworCXByaXYtPndsYW5fZGV2Lm5ldGRldiA9IE5VTEw7CisJcHJpdi0+bWVzaF9kZXYgPSBOVUxMIDsKKwlmcmVlX25ldGRldihtZXNoX2Rldik7CisJZnJlZV9uZXRkZXYoZGV2KTsKKwl3bGFucHJpdiA9IE5VTEw7CisKKwlMRUFWRSgpOworCXJldHVybiAwOworfQorCisvKioKKyAqICBAYnJpZWYgVGhpcyBmdW5jdGlvbiBmaW5kcyB0aGUgQ0ZQIGluCisgKiAgcmVnaW9uX2NmcF90YWJsZSBiYXNlZCBvbiByZWdpb24gYW5kIGJhbmQgcGFyYW1ldGVyLgorICoKKyAqICBAcGFyYW0gcmVnaW9uICBUaGUgcmVnaW9uIGNvZGUKKyAqICBAcGFyYW0gYmFuZAkgICBUaGUgYmFuZAorICogIEBwYXJhbSBjZnBfbm8gIEEgcG9pbnRlciB0byBDRlAgbnVtYmVyCisgKiAgQHJldHVybiAJICAgQSBwb2ludGVyIHRvIENGUAorICovCitzdHJ1Y3QgY2hhbl9mcmVxX3Bvd2VyICpsaWJlcnRhc19nZXRfcmVnaW9uX2NmcF90YWJsZSh1OCByZWdpb24sIHU4IGJhbmQsIGludCAqY2ZwX25vKQoreworCWludCBpLCBlbmQ7CisKKwlFTlRFUigpOworCisJZW5kID0gc2l6ZW9mKHJlZ2lvbl9jZnBfdGFibGUpL3NpemVvZihzdHJ1Y3QgcmVnaW9uX2NmcF90YWJsZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZW5kIDsgaSsrKSB7CisJCWxic19wcl9kZWJ1ZygxLCAicmVnaW9uX2NmcF90YWJsZVtpXS5yZWdpb249JWRcbiIsCisJCQlyZWdpb25fY2ZwX3RhYmxlW2ldLnJlZ2lvbik7CisJCWlmIChyZWdpb25fY2ZwX3RhYmxlW2ldLnJlZ2lvbiA9PSByZWdpb24pIHsKKwkJCSpjZnBfbm8gPSByZWdpb25fY2ZwX3RhYmxlW2ldLmNmcF9ub19CRzsKKwkJCUxFQVZFKCk7CisJCQlyZXR1cm4gcmVnaW9uX2NmcF90YWJsZVtpXS5jZnBfQkc7CisJCX0KKwl9CisKKwlMRUFWRSgpOworCXJldHVybiBOVUxMOworfQorCitpbnQgbGliZXJ0YXNfc2V0X3JlZ2lvbnRhYmxlKHdsYW5fcHJpdmF0ZSAqIHByaXYsIHU4IHJlZ2lvbiwgdTggYmFuZCkKK3sKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCWludCBpID0gMDsKKworCXN0cnVjdCBjaGFuX2ZyZXFfcG93ZXIgKmNmcDsKKwlpbnQgY2ZwX25vOworCisJRU5URVIoKTsKKworCW1lbXNldChhZGFwdGVyLT5yZWdpb25fY2hhbm5lbCwgMCwgc2l6ZW9mKGFkYXB0ZXItPnJlZ2lvbl9jaGFubmVsKSk7CisKKwl7CisJCWNmcCA9IGxpYmVydGFzX2dldF9yZWdpb25fY2ZwX3RhYmxlKHJlZ2lvbiwgYmFuZCwgJmNmcF9ubyk7CisJCWlmIChjZnAgIT0gTlVMTCkgeworCQkJYWRhcHRlci0+cmVnaW9uX2NoYW5uZWxbaV0ubnJjZnAgPSBjZnBfbm87CisJCQlhZGFwdGVyLT5yZWdpb25fY2hhbm5lbFtpXS5DRlAgPSBjZnA7CisJCX0gZWxzZSB7CisJCQlsYnNfcHJfZGVidWcoMSwgIndyb25nIHJlZ2lvbiBjb2RlICUjeCBpbiBiYW5kIEItR1xuIiwKKwkJCSAgICAgICByZWdpb24pOworCQkJcmV0dXJuIC0xOworCQl9CisJCWFkYXB0ZXItPnJlZ2lvbl9jaGFubmVsW2ldLnZhbGlkID0gMTsKKwkJYWRhcHRlci0+cmVnaW9uX2NoYW5uZWxbaV0ucmVnaW9uID0gcmVnaW9uOworCQlhZGFwdGVyLT5yZWdpb25fY2hhbm5lbFtpXS5iYW5kID0gYmFuZDsKKwkJaSsrOworCX0KKwlMRUFWRSgpOworCXJldHVybiAwOworfQorCisvKioKKyAqICBAYnJpZWYgVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRoZSBpbnRlcnJ1cHQuIGl0IHdpbGwgY2hhbmdlIFBTCisgKiAgc3RhdGUgaWYgYXBwbGljYWJsZS4gaXQgd2lsbCB3YWtlIHVwIG1haW5fdGhyZWFkIHRvIGhhbmRsZQorICogIHRoZSBpbnRlcnJ1cHQgZXZlbnQgYXMgd2VsbC4KKyAqCisgKiAgQHBhcmFtIGRldiAgICAgQSBwb2ludGVyIHRvIG5ldF9kZXZpY2Ugc3RydWN0dXJlCisgKiAgQHJldHVybiAJICAgbi9hCisgKi8KK3ZvaWQgbGliZXJ0YXNfaW50ZXJydXB0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJd2xhbl9wcml2YXRlICpwcml2ID0gZGV2LT5wcml2OworCisJRU5URVIoKTsKKworCWxic19wcl9kZWJ1ZygxLCAibGliZXJ0YXNfaW50ZXJydXB0OiBpbnRjb3VudGVyPSVkXG4iLAorCSAgICAgICBwcml2LT5hZGFwdGVyLT5pbnRjb3VudGVyKTsKKworCXByaXYtPmFkYXB0ZXItPmludGNvdW50ZXIrKzsKKworCWlmIChwcml2LT5hZGFwdGVyLT5wc3N0YXRlID09IFBTX1NUQVRFX1NMRUVQKSB7CisJCXByaXYtPmFkYXB0ZXItPnBzc3RhdGUgPSBQU19TVEFURV9BV0FLRTsKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCX0KKworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcHJpdi0+bWFpbnRocmVhZC53YWl0cSk7CisKKwlMRUFWRSgpOworfQorCitzdGF0aWMgaW50IHdsYW5faW5pdF9tb2R1bGUodm9pZCkKK3sKKwlpbnQgcmV0ID0gMDsKKworCUVOVEVSKCk7CisKKwlpZiAobGliZXJ0YXNfZndfbmFtZSA9PSBOVUxMKSB7CisJCWxpYmVydGFzX2Z3X25hbWUgPSBkZWZhdWx0X2Z3X25hbWU7CisJfQorCisJbGliZXJ0YXNfZGVidWdmc19pbml0KCk7CisKKwlpZiAobGliZXJ0YXNfc2JpX3JlZ2lzdGVyKCkpIHsKKwkJcmV0ID0gLTE7CisJCWxpYmVydGFzX2RlYnVnZnNfcmVtb3ZlKCk7CisJCWdvdG8gZG9uZTsKKwl9CisKK2RvbmU6CisJTEVBVkUoKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCB3bGFuX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJaW50IGk7CisKKwlFTlRFUigpOworCisJZm9yIChpID0gMDsgaTxsaWJlcnRhc19mb3VuZDsgaSsrKSB7CisJCXdsYW5fcHJpdmF0ZSAqcHJpdiA9IGxpYmVydGFzX2RldnNbaV0tPnByaXY7CisJCXJlc2V0X2RldmljZShwcml2KTsKKwl9CisKKwlsaWJlcnRhc19zYmlfdW5yZWdpc3RlcigpOworCWxpYmVydGFzX2RlYnVnZnNfcmVtb3ZlKCk7CisKKwlMRUFWRSgpOworfQorCittb2R1bGVfaW5pdCh3bGFuX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KHdsYW5fY2xlYW51cF9tb2R1bGUpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIk0tV0xBTiBEcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIk1hcnZlbGwgSW50ZXJuYXRpb25hbCBMdGQuIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9yYWRpb3RhcC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvcmFkaW90YXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDExOGY0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvcmFkaW90YXAuaApAQCAtMCwwICsxLDU3IEBACisjaW5jbHVkZSA8bmV0L2llZWU4MDIxMV9yYWRpb3RhcC5oPgorCitzdHJ1Y3QgdHhfcmFkaW90YXBfaGRyIHsKKwlzdHJ1Y3QgaWVlZTgwMjExX3JhZGlvdGFwX2hlYWRlciBoZHI7CisJdTggcmF0ZTsKKwl1OCB0eHBvd2VyOworCXU4IHJ0c19yZXRyaWVzOworCXU4IGRhdGFfcmV0cmllczsKKyNpZiAwCisJdTggcGFkW0lFRUU4MDIxMV9SQURJT1RBUF9IRFJMRU4gLSAxMl07CisjZW5kaWYKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisjZGVmaW5lIFRYX1JBRElPVEFQX1BSRVNFTlQgKAkJCQlcCisJKDEgPDwgSUVFRTgwMjExX1JBRElPVEFQX1JBVEUpIHwJCVwKKwkoMSA8PCBJRUVFODAyMTFfUkFESU9UQVBfREJNX1RYX1BPV0VSKSB8CVwKKwkoMSA8PCBJRUVFODAyMTFfUkFESU9UQVBfUlRTX1JFVFJJRVMpIHwJCVwKKwkoMSA8PCBJRUVFODAyMTFfUkFESU9UQVBfREFUQV9SRVRSSUVTKSAgfAlcCisJMCkKKworI2RlZmluZSBJRUVFODAyMTFfRkNfVkVSU0lPTl9NQVNLICAgIDB4MDAwMworI2RlZmluZSBJRUVFODAyMTFfRkNfVFlQRV9NQVNLICAgICAgIDB4MDAwYworI2RlZmluZSBJRUVFODAyMTFfRkNfVFlQRV9NR1QgICAgICAgIDB4MDAwMAorI2RlZmluZSBJRUVFODAyMTFfRkNfVFlQRV9DVEwgICAgICAgIDB4MDAwNAorI2RlZmluZSBJRUVFODAyMTFfRkNfVFlQRV9EQVRBICAgICAgIDB4MDAwOAorI2RlZmluZSBJRUVFODAyMTFfRkNfU1VCVFlQRV9NQVNLICAgIDB4MDBmMAorI2RlZmluZSBJRUVFODAyMTFfRkNfVE9GUk9NRFNfTUFTSyAgIDB4MDMwMAorI2RlZmluZSBJRUVFODAyMTFfRkNfVE9EU19NQVNLICAgICAgIDB4MDEwMAorI2RlZmluZSBJRUVFODAyMTFfRkNfRlJPTURTX01BU0sgICAgIDB4MDIwMAorI2RlZmluZSBJRUVFODAyMTFfRkNfTk9EUyAgICAgICAgICAgIDB4MDAwMAorI2RlZmluZSBJRUVFODAyMTFfRkNfVE9EUyAgICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBJRUVFODAyMTFfRkNfRlJPTURTICAgICAgICAgIDB4MDIwMAorI2RlZmluZSBJRUVFODAyMTFfRkNfRFNUT0RTICAgICAgICAgIDB4MDMwMAorCitzdHJ1Y3QgcnhfcmFkaW90YXBfaGRyIHsKKwlzdHJ1Y3QgaWVlZTgwMjExX3JhZGlvdGFwX2hlYWRlciBoZHI7CisJdTggZmxhZ3M7CisJdTggcmF0ZTsKKwl1MTYgY2hhbl9mcmVxOworCXUxNiBjaGFuX2ZsYWdzOworCXU4IGFudGVubmE7CisJdTggYW50c2lnbmFsOworCXUxNiByeF9mbGFnczsKKyNpZiAwCisJdTggcGFkW0lFRUU4MDIxMV9SQURJT1RBUF9IRFJMRU4gLSAxOF07CisjZW5kaWYKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisjZGVmaW5lIFJYX1JBRElPVEFQX1BSRVNFTlQgKAkJCVwKKwkoMSA8PCBJRUVFODAyMTFfUkFESU9UQVBfRkxBR1MpIHwJXAorCSgxIDw8IElFRUU4MDIxMV9SQURJT1RBUF9SQVRFKSB8CVwKKwkoMSA8PCBJRUVFODAyMTFfUkFESU9UQVBfQ0hBTk5FTCkgfAlcCisJKDEgPDwgSUVFRTgwMjExX1JBRElPVEFQX0FOVEVOTkEpIHwJXAorCSgxIDw8IElFRUU4MDIxMV9SQURJT1RBUF9EQl9BTlRTSUdOQUwpIHxcCisJKDEgPDwgSUVFRTgwMjExX1JBRElPVEFQX1JYX0ZMQUdTKSB8CVwKKwkwKQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9yeC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvcnguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTNmNzhmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvcnguYwpAQCAtMCwwICsxLDQ1OSBAQAorLyoqCisgICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBoYW5kbGluZyBvZiBSWCBpbiB3bGFuIGRyaXZlci4KKyAgKi8KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNpbmNsdWRlICJob3N0Y21kLmgiCisjaW5jbHVkZSAicmFkaW90YXAuaCIKKyNpbmNsdWRlICJkZWNsLmgiCisjaW5jbHVkZSAiZGV2LmgiCisjaW5jbHVkZSAid2V4dC5oIgorCitzdHJ1Y3QgZXRoODAzaGRyIHsKKwl1OCBkZXN0X2FkZHJbNl07CisJdTggc3JjX2FkZHJbNl07CisJdTE2IGg4MDNfbGVuOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCByZmMxMDQyaGRyIHsKKwl1OCBsbGNfZHNhcDsKKwl1OCBsbGNfc3NhcDsKKwl1OCBsbGNfY3RybDsKKwl1OCBzbmFwX291aVszXTsKKwl1MTYgc25hcF90eXBlOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCByeHBhY2tldGhkciB7CisJc3RydWN0IHJ4cGQgcnhfcGQ7CisJc3RydWN0IGV0aDgwM2hkciBldGg4MDNfaGRyOworCXN0cnVjdCByZmMxMDQyaGRyIHJmYzEwNDJfaGRyOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCByeDgwMjExcGFja2V0aGRyIHsKKwlzdHJ1Y3QgcnhwZCByeF9wZDsKKwl2b2lkICpldGg4MDIxMV9oZHI7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RhdGljIGludCBwcm9jZXNzX3J4ZWRfODAyXzExX3BhY2tldCh3bGFuX3ByaXZhdGUgKiBwcml2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKKworLyoqCisgKiAgQGJyaWVmIFRoaXMgZnVuY3Rpb24gY29tcHV0ZXMgdGhlIGF2Z1NOUiAuCisgKgorICogIEBwYXJhbSBwcml2ICAgIEEgcG9pbnRlciB0byB3bGFuX3ByaXZhdGUgc3RydWN0dXJlCisgKiAgQHJldHVybiAJICAgYXZnU05SCisgKi8KK3N0YXRpYyB1OCB3bGFuX2dldGF2Z3Nucih3bGFuX3ByaXZhdGUgKiBwcml2KQoreworCXU4IGk7CisJdTE2IHRlbXAgPSAwOworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJaWYgKGFkYXB0ZXItPm51bVNOUk5GID09IDApCisJCXJldHVybiAwOworCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5udW1TTlJORjsgaSsrKQorCQl0ZW1wICs9IGFkYXB0ZXItPnJhd1NOUltpXTsKKwlyZXR1cm4gKHU4KSAodGVtcCAvIGFkYXB0ZXItPm51bVNOUk5GKTsKKworfQorCisvKioKKyAqICBAYnJpZWYgVGhpcyBmdW5jdGlvbiBjb21wdXRlcyB0aGUgQXZnTkYKKyAqCisgKiAgQHBhcmFtIHByaXYgICAgQSBwb2ludGVyIHRvIHdsYW5fcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqICBAcmV0dXJuIAkgICBBdmdORgorICovCitzdGF0aWMgdTggd2xhbl9nZXRhdmduZih3bGFuX3ByaXZhdGUgKiBwcml2KQoreworCXU4IGk7CisJdTE2IHRlbXAgPSAwOworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJaWYgKGFkYXB0ZXItPm51bVNOUk5GID09IDApCisJCXJldHVybiAwOworCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5udW1TTlJORjsgaSsrKQorCQl0ZW1wICs9IGFkYXB0ZXItPnJhd05GW2ldOworCXJldHVybiAodTgpICh0ZW1wIC8gYWRhcHRlci0+bnVtU05STkYpOworCit9CisKKy8qKgorICogIEBicmllZiBUaGlzIGZ1bmN0aW9uIHNhdmUgdGhlIHJhdyBTTlIvTkYgdG8gb3VyIGludGVybmVsIGJ1ZmZlcgorICoKKyAqICBAcGFyYW0gcHJpdiAgICBBIHBvaW50ZXIgdG8gd2xhbl9wcml2YXRlIHN0cnVjdHVyZQorICogIEBwYXJhbSBwcnhwZCAgIEEgcG9pbnRlciB0byByeHBkIHN0cnVjdHVyZSBvZiByZWNlaXZlZCBwYWNrZXQKKyAqICBAcmV0dXJuIAkgICBuL2EKKyAqLworc3RhdGljIHZvaWQgd2xhbl9zYXZlX3Jhd1NOUk5GKHdsYW5fcHJpdmF0ZSAqIHByaXYsIHN0cnVjdCByeHBkICpwX3J4X3BkKQoreworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJaWYgKGFkYXB0ZXItPm51bVNOUk5GIDwgYWRhcHRlci0+ZGF0YV9hdmdfZmFjdG9yKQorCQlhZGFwdGVyLT5udW1TTlJORisrOworCWFkYXB0ZXItPnJhd1NOUlthZGFwdGVyLT5uZXh0U05STkZdID0gcF9yeF9wZC0+c25yOworCWFkYXB0ZXItPnJhd05GW2FkYXB0ZXItPm5leHRTTlJORl0gPSBwX3J4X3BkLT5uZjsKKwlhZGFwdGVyLT5uZXh0U05STkYrKzsKKwlpZiAoYWRhcHRlci0+bmV4dFNOUk5GID49IGFkYXB0ZXItPmRhdGFfYXZnX2ZhY3RvcikKKwkJYWRhcHRlci0+bmV4dFNOUk5GID0gMDsKKwlyZXR1cm47Cit9CisKKy8qKgorICogIEBicmllZiBUaGlzIGZ1bmN0aW9uIGNvbXB1dGVzIHRoZSBSU1NJIGluIHJlY2VpdmVkIHBhY2tldC4KKyAqCisgKiAgQHBhcmFtIHByaXYgICAgQSBwb2ludGVyIHRvIHdsYW5fcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqICBAcGFyYW0gcHJ4cGQgICBBIHBvaW50ZXIgdG8gcnhwZCBzdHJ1Y3R1cmUgb2YgcmVjZWl2ZWQgcGFja2V0CisgKiAgQHJldHVybiAJICAgbi9hCisgKi8KK3N0YXRpYyB2b2lkIHdsYW5fY29tcHV0ZV9yc3NpKHdsYW5fcHJpdmF0ZSAqIHByaXYsIHN0cnVjdCByeHBkICpwX3J4X3BkKQoreworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisKKwlFTlRFUigpOworCisJbGJzX3ByX2RlYnVnKDEsICJyeHBkOiBTTlIgPSAlZCwgTkYgPSAlZFxuIiwgcF9yeF9wZC0+c25yLCBwX3J4X3BkLT5uZik7CisJbGJzX3ByX2RlYnVnKDEsICJCZWZvcmUgY29tcHV0aW5nIFNOUjogU05SLSBhdmcgPSAlZCwgTkYtYXZnID0gJWRcbiIsCisJICAgICAgIGFkYXB0ZXItPlNOUltUWVBFX1JYUERdW1RZUEVfQVZHXSAvIEFWR19TQ0FMRSwKKwkgICAgICAgYWRhcHRlci0+TkZbVFlQRV9SWFBEXVtUWVBFX0FWR10gLyBBVkdfU0NBTEUpOworCisJYWRhcHRlci0+U05SW1RZUEVfUlhQRF1bVFlQRV9OT0FWR10gPSBwX3J4X3BkLT5zbnI7CisJYWRhcHRlci0+TkZbVFlQRV9SWFBEXVtUWVBFX05PQVZHXSA9IHBfcnhfcGQtPm5mOworCXdsYW5fc2F2ZV9yYXdTTlJORihwcml2LCBwX3J4X3BkKTsKKworCWFkYXB0ZXItPnJ4cGRfcmF0ZSA9IHBfcnhfcGQtPnJ4X3JhdGU7CisKKwlhZGFwdGVyLT5TTlJbVFlQRV9SWFBEXVtUWVBFX0FWR10gPSB3bGFuX2dldGF2Z3Nucihwcml2KSAqIEFWR19TQ0FMRTsKKwlhZGFwdGVyLT5ORltUWVBFX1JYUERdW1RZUEVfQVZHXSA9IHdsYW5fZ2V0YXZnbmYocHJpdikgKiBBVkdfU0NBTEU7CisJbGJzX3ByX2RlYnVnKDEsICJBZnRlciBjb21wdXRpbmcgU05SOiBTTlItYXZnID0gJWQsIE5GLWF2ZyA9ICVkXG4iLAorCSAgICAgICBhZGFwdGVyLT5TTlJbVFlQRV9SWFBEXVtUWVBFX0FWR10gLyBBVkdfU0NBTEUsCisJICAgICAgIGFkYXB0ZXItPk5GW1RZUEVfUlhQRF1bVFlQRV9BVkddIC8gQVZHX1NDQUxFKTsKKworCWFkYXB0ZXItPlJTU0lbVFlQRV9SWFBEXVtUWVBFX05PQVZHXSA9CisJICAgIENBTF9SU1NJKGFkYXB0ZXItPlNOUltUWVBFX1JYUERdW1RZUEVfTk9BVkddLAorCQkgICAgIGFkYXB0ZXItPk5GW1RZUEVfUlhQRF1bVFlQRV9OT0FWR10pOworCisJYWRhcHRlci0+UlNTSVtUWVBFX1JYUERdW1RZUEVfQVZHXSA9CisJICAgIENBTF9SU1NJKGFkYXB0ZXItPlNOUltUWVBFX1JYUERdW1RZUEVfQVZHXSAvIEFWR19TQ0FMRSwKKwkJICAgICBhZGFwdGVyLT5ORltUWVBFX1JYUERdW1RZUEVfQVZHXSAvIEFWR19TQ0FMRSk7CisKKwlMRUFWRSgpOworfQorCitpbnQgbGliZXJ0YXNfdXBsb2FkX3J4X3BhY2tldCh3bGFuX3ByaXZhdGUgKiBwcml2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWxic19wcl9kZWJ1ZygxLCAic2tiLT5kYXRhPSVwXG4iLCBza2ItPmRhdGEpOworCisJaWYoSVNfTUVTSF9GUkFNRShza2IpKQorCQlza2ItPmRldiA9IHByaXYtPm1lc2hfZGV2OworCWVsc2UKKwkJc2tiLT5kZXYgPSBwcml2LT53bGFuX2Rldi5uZXRkZXY7CisJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgcHJpdi0+d2xhbl9kZXYubmV0ZGV2KTsKKwlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOworCisJbmV0aWZfcngoc2tiKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqICBAYnJpZWYgVGhpcyBmdW5jdGlvbiBwcm9jZXNzZXMgcmVjZWl2ZWQgcGFja2V0IGFuZCBmb3J3YXJkcyBpdAorICogIHRvIGtlcm5lbC91cHBlciBsYXllcgorICoKKyAqICBAcGFyYW0gcHJpdiAgICBBIHBvaW50ZXIgdG8gd2xhbl9wcml2YXRlCisgKiAgQHBhcmFtIHNrYiAgICAgQSBwb2ludGVyIHRvIHNrYiB3aGljaCBpbmNsdWRlcyB0aGUgcmVjZWl2ZWQgcGFja2V0CisgKiAgQHJldHVybiAJICAgMCBvciAtMQorICovCitpbnQgbGliZXJ0YXNfcHJvY2Vzc19yeGVkX3BhY2tldCh3bGFuX3ByaXZhdGUgKiBwcml2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJaW50IHJldCA9IDA7CisKKwlzdHJ1Y3QgcnhwYWNrZXRoZHIgKnBfcnhfcGt0OworCXN0cnVjdCByeHBkICpwX3J4X3BkOworCisJaW50IGhkcmNob3A7CisJc3RydWN0IGV0aGhkciAqcF9ldGhoZHI7CisKKwljb25zdCB1OCByZmMxMDQyX2V0aF9oZHJbXSA9IHsgMHhhYSwgMHhhYSwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCB9OworCisJRU5URVIoKTsKKworCWlmIChwcml2LT5hZGFwdGVyLT5kZWJ1Z21vZGUgJiBNUlZEUlZfREVCVUdfUlhfUEFUSCkKKwkJbGJzX2RiZ19oZXgoIlJYIHBhY2tldDogIiwgc2tiLT5kYXRhLAorCQkJIG1pbl90KHVuc2lnbmVkIGludCwgc2tiLT5sZW4sIDEwMCkpOworCisJaWYgKHByaXYtPmFkYXB0ZXItPmxpbmttb2RlID09IFdMQU5fTElOS01PREVfODAyXzExKQorCQlyZXR1cm4gcHJvY2Vzc19yeGVkXzgwMl8xMV9wYWNrZXQocHJpdiwgc2tiKTsKKworCXBfcnhfcGt0ID0gKHN0cnVjdCByeHBhY2tldGhkciAqKSBza2ItPmRhdGE7CisJcF9yeF9wZCA9ICZwX3J4X3BrdC0+cnhfcGQ7CisJaWYgKHBfcnhfcGQtPnJ4X2NvbnRyb2wgJiBSeFBEX01FU0hfRlJBTUUpCisJCVNFVF9NRVNIX0ZSQU1FKHNrYik7CisJZWxzZQorCQlVTlNFVF9NRVNIX0ZSQU1FKHNrYik7CisKKwlsYnNfZGJnX2hleCgiUlggRGF0YTogQmVmb3JlIGNob3AgcnhwZCIsIHNrYi0+ZGF0YSwKKwkJIG1pbl90KHVuc2lnbmVkIGludCwgc2tiLT5sZW4sIDEwMCkpOworCisJaWYgKHNrYi0+bGVuIDwgKEVUSF9ITEVOICsgOCArIHNpemVvZihzdHJ1Y3QgcnhwZCkpKSB7CisJCWxic19wcl9kZWJ1ZygxLCAiUlggZXJyb3I6IEZSQU1FIFJFQ0VJVkVEIFdJVEggQkFEIExFTkdUSFxuIik7CisJCXByaXYtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJcmV0ID0gMDsKKwkJZ290byBkb25lOworCX0KKworCS8qCisJICogQ2hlY2sgcnhwZCBzdGF0dXMgYW5kIHVwZGF0ZSA4MDIuMyBzdGF0LAorCSAqLworCWlmICghKHBfcnhfcGQtPnN0YXR1cyAmIE1SVkRSVl9SWFBEX1NUQVRVU19PSykpIHsKKwkJbGJzX3ByX2RlYnVnKDEsICJSWCBlcnJvcjogZnJhbWUgcmVjZWl2ZWQgd2l0aCBiYWQgc3RhdHVzXG4iKTsKKwkJbGJzX3ByX2FsZXJ0KCJyeHBkIE5vdCBPS1xuIik7CisJCXByaXYtPnN0YXRzLnJ4X2Vycm9ycysrOworCQlyZXQgPSAwOworCQlnb3RvIGRvbmU7CisJfQorCisJbGJzX3ByX2RlYnVnKDEsICJSWCBEYXRhOiBza2ItPmxlbiAtIHNpemVvZihSeFBkKSA9ICVkIC0gJWQgPSAlZFxuIiwKKwkgICAgICAgc2tiLT5sZW4sIHNpemVvZihzdHJ1Y3QgcnhwZCksIHNrYi0+bGVuIC0gc2l6ZW9mKHN0cnVjdCByeHBkKSk7CisKKwlsYnNfZGJnX2hleCgiUlggRGF0YTogRGVzdCIsIHBfcnhfcGt0LT5ldGg4MDNfaGRyLmRlc3RfYWRkciwKKwkJc2l6ZW9mKHBfcnhfcGt0LT5ldGg4MDNfaGRyLmRlc3RfYWRkcikpOworCWxic19kYmdfaGV4KCJSWCBEYXRhOiBTcmMiLCBwX3J4X3BrdC0+ZXRoODAzX2hkci5zcmNfYWRkciwKKwkJc2l6ZW9mKHBfcnhfcGt0LT5ldGg4MDNfaGRyLnNyY19hZGRyKSk7CisKKwlpZiAobWVtY21wKCZwX3J4X3BrdC0+cmZjMTA0Ml9oZHIsCisJCSAgIHJmYzEwNDJfZXRoX2hkciwgc2l6ZW9mKHJmYzEwNDJfZXRoX2hkcikpID09IDApIHsKKwkJLyoKKwkJICogIFJlcGxhY2UgdGhlIDgwMyBoZWFkZXIgYW5kIHJmYzEwNDIgaGVhZGVyIChsbGMvc25hcCkgd2l0aCBhbgorCQkgKiAgICBFdGhlcm5ldElJIGhlYWRlciwga2VlcCB0aGUgc3JjL2RzdCBhbmQgc25hcF90eXBlIChldGhlcnR5cGUpCisJCSAqCisJCSAqICBUaGUgZmlybXdhcmUgb25seSBwYXNzZXMgdXAgU05BUCBmcmFtZXMgY29udmVydGluZworCQkgKiAgICBhbGwgUlggRGF0YSBmcm9tIDgwMi4xMSB0byA4MDIuMi9MTEMvU05BUCBmcmFtZXMuCisJCSAqCisJCSAqICBUbyBjcmVhdGUgdGhlIEV0aGVybmV0IElJLCBqdXN0IG1vdmUgdGhlIHNyYywgZHN0IGFkZHJlc3MgcmlnaHQKKwkJICogICAgYmVmb3JlIHRoZSBzbmFwX3R5cGUuCisJCSAqLworCQlwX2V0aGhkciA9IChzdHJ1Y3QgZXRoaGRyICopCisJCSAgICAoKHU4ICopICYgcF9yeF9wa3QtPmV0aDgwM19oZHIKKwkJICAgICArIHNpemVvZihwX3J4X3BrdC0+ZXRoODAzX2hkcikgKyBzaXplb2YocF9yeF9wa3QtPnJmYzEwNDJfaGRyKQorCQkgICAgIC0gc2l6ZW9mKHBfcnhfcGt0LT5ldGg4MDNfaGRyLmRlc3RfYWRkcikKKwkJICAgICAtIHNpemVvZihwX3J4X3BrdC0+ZXRoODAzX2hkci5zcmNfYWRkcikKKwkJICAgICAtIHNpemVvZihwX3J4X3BrdC0+cmZjMTA0Ml9oZHIuc25hcF90eXBlKSk7CisKKwkJbWVtY3B5KHBfZXRoaGRyLT5oX3NvdXJjZSwgcF9yeF9wa3QtPmV0aDgwM19oZHIuc3JjX2FkZHIsCisJCSAgICAgICBzaXplb2YocF9ldGhoZHItPmhfc291cmNlKSk7CisJCW1lbWNweShwX2V0aGhkci0+aF9kZXN0LCBwX3J4X3BrdC0+ZXRoODAzX2hkci5kZXN0X2FkZHIsCisJCSAgICAgICBzaXplb2YocF9ldGhoZHItPmhfZGVzdCkpOworCisJCS8qIENob3Agb2ZmIHRoZSByeHBkICsgdGhlIGV4Y2VzcyBtZW1vcnkgZnJvbSB0aGUgODAyLjIvbGxjL3NuYXAgaGVhZGVyCisJCSAqICAgdGhhdCB3YXMgcmVtb3ZlZAorCQkgKi8KKwkJaGRyY2hvcCA9ICh1OCAqKSBwX2V0aGhkciAtICh1OCAqKSBwX3J4X3BrdDsKKwl9IGVsc2UgeworCQlsYnNfZGJnX2hleCgiUlggRGF0YTogTExDL1NOQVAiLAorCQkJKHU4ICopICYgcF9yeF9wa3QtPnJmYzEwNDJfaGRyLAorCQkJc2l6ZW9mKHBfcnhfcGt0LT5yZmMxMDQyX2hkcikpOworCisJCS8qIENob3Agb2ZmIHRoZSByeHBkICovCisJCWhkcmNob3AgPSAodTggKikgJiBwX3J4X3BrdC0+ZXRoODAzX2hkciAtICh1OCAqKSBwX3J4X3BrdDsKKwl9CisKKwkvKiBDaG9wIG9mZiB0aGUgbGVhZGluZyBoZWFkZXIgYnl0ZXMgc28gdGhlIHNrYiBwb2ludHMgdG8gdGhlIHN0YXJ0IG9mCisJICogICBlaXRoZXIgdGhlIHJlY29uc3RydWN0ZWQgRXRoSUkgZnJhbWUgb3IgdGhlIDgwMi4yL2xsYy9zbmFwIGZyYW1lCisJICovCisJc2tiX3B1bGwoc2tiLCBoZHJjaG9wKTsKKworCS8qIFRha2UgdGhlIGRhdGEgcmF0ZSBmcm9tIHRoZSByeHBkIHN0cnVjdHVyZQorCSAqIG9ubHkgaWYgdGhlIHJhdGUgaXMgYXV0bworCSAqLworCWlmIChhZGFwdGVyLT5pc19kYXRhcmF0ZV9hdXRvKQorCQlhZGFwdGVyLT5kYXRhcmF0ZSA9IGxpYmVydGFzX2luZGV4X3RvX2RhdGFfcmF0ZShwX3J4X3BkLT5yeF9yYXRlKTsKKworCXdsYW5fY29tcHV0ZV9yc3NpKHByaXYsIHBfcnhfcGQpOworCisJbGJzX3ByX2RlYnVnKDEsICJSWCBEYXRhOiBzaXplIG9mIGFjdHVhbCBwYWNrZXQgPSAlZFxuIiwgc2tiLT5sZW4pOworCWlmIChsaWJlcnRhc191cGxvYWRfcnhfcGFja2V0KHByaXYsIHNrYikpIHsKKwkJbGJzX3ByX2RlYnVnKDEsICJSWCBlcnJvcjogbGliZXJ0YXNfdXBsb2FkX3J4X3BhY2tldCIKKwkJICAgICAgICIgcmV0dXJucyBmYWlsdXJlXG4iKTsKKwkJcmV0ID0gLTE7CisJCWdvdG8gZG9uZTsKKwl9CisJcHJpdi0+c3RhdHMucnhfYnl0ZXMgKz0gc2tiLT5sZW47CisJcHJpdi0+c3RhdHMucnhfcGFja2V0cysrOworCisJcmV0ID0gMDsKK2RvbmU6CisJTEVBVkUoKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogIEBicmllZiBUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIFR4L1J4IHJhdGVzIGZyb20gdGhlIE1hcnZlbGwgV0xBTiBmb3JtYXQKKyAqICAoc2VlIFRhYmxlIDIgaW4gU2VjdGlvbiAzLjEpIHRvIElFRUU4MDIxMV9SQURJT1RBUF9SQVRFIHVuaXRzICg1MDAgS2IvcykKKyAqCisgKiAgQHBhcmFtIHJhdGUgICAgSW5wdXQgcmF0ZQorICogIEByZXR1cm4gCSAgIE91dHB1dCBSYXRlICgwIGlmIGludmFsaWQpCisgKi8KK3N0YXRpYyB1OCBjb252ZXJ0X212X3JhdGVfdG9fcmFkaW90YXAodTggcmF0ZSkKK3sKKwlzd2l0Y2ggKHJhdGUpIHsKKwljYXNlIDA6CQkvKiAgIDEgTWJwcyAqLworCQlyZXR1cm4gMjsKKwljYXNlIDE6CQkvKiAgIDIgTWJwcyAqLworCQlyZXR1cm4gNDsKKwljYXNlIDI6CQkvKiA1LjUgTWJwcyAqLworCQlyZXR1cm4gMTE7CisJY2FzZSAzOgkJLyogIDExIE1icHMgKi8KKwkJcmV0dXJuIDIyOworCWNhc2UgNDoJCS8qICAgNiBNYnBzICovCisJCXJldHVybiAxMjsKKwljYXNlIDU6CQkvKiAgIDkgTWJwcyAqLworCQlyZXR1cm4gMTg7CisJY2FzZSA2OgkJLyogIDEyIE1icHMgKi8KKwkJcmV0dXJuIDI0OworCWNhc2UgNzoJCS8qICAxOCBNYnBzICovCisJCXJldHVybiAzNjsKKwljYXNlIDg6CQkvKiAgMjQgTWJwcyAqLworCQlyZXR1cm4gNDg7CisJY2FzZSA5OgkJLyogIDM2IE1icHMgKi8KKwkJcmV0dXJuIDcyOworCWNhc2UgMTA6CQkvKiAgNDggTWJwcyAqLworCQlyZXR1cm4gOTY7CisJY2FzZSAxMToJCS8qICA1NCBNYnBzICovCisJCXJldHVybiAxMDg7CisJfQorCWxic19wcl9hbGVydCggIkludmFsaWQgTWFydmVsbCBXTEFOIHJhdGUgKCVpKVxuIiwgcmF0ZSk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogIEBicmllZiBUaGlzIGZ1bmN0aW9uIHByb2Nlc3NlcyBhIHJlY2VpdmVkIDgwMi4xMSBwYWNrZXQgYW5kIGZvcndhcmRzIGl0CisgKiAgdG8ga2VybmVsL3VwcGVyIGxheWVyCisgKgorICogIEBwYXJhbSBwcml2ICAgIEEgcG9pbnRlciB0byB3bGFuX3ByaXZhdGUKKyAqICBAcGFyYW0gc2tiICAgICBBIHBvaW50ZXIgdG8gc2tiIHdoaWNoIGluY2x1ZGVzIHRoZSByZWNlaXZlZCBwYWNrZXQKKyAqICBAcmV0dXJuIAkgICAwIG9yIC0xCisgKi8KK3N0YXRpYyBpbnQgcHJvY2Vzc19yeGVkXzgwMl8xMV9wYWNrZXQod2xhbl9wcml2YXRlICogcHJpdiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCWludCByZXQgPSAwOworCisJc3RydWN0IHJ4ODAyMTFwYWNrZXRoZHIgKnBfcnhfcGt0OworCXN0cnVjdCByeHBkICpwcnhwZDsKKwlzdHJ1Y3QgcnhfcmFkaW90YXBfaGRyIHJhZGlvdGFwX2hkcjsKKwlzdHJ1Y3QgcnhfcmFkaW90YXBfaGRyICpwcmFkaW90YXBfaGRyOworCisJRU5URVIoKTsKKworCXBfcnhfcGt0ID0gKHN0cnVjdCByeDgwMjExcGFja2V0aGRyICopIHNrYi0+ZGF0YTsKKwlwcnhwZCA9ICZwX3J4X3BrdC0+cnhfcGQ7CisKKwkvLyBsYnNfZGJnX2hleCgiUlggRGF0YTogQmVmb3JlIGNob3AgcnhwZCIsIHNrYi0+ZGF0YSwgbWluKHNrYi0+bGVuLCAxMDApKTsKKworCWlmIChza2ItPmxlbiA8IChFVEhfSExFTiArIDggKyBzaXplb2Yoc3RydWN0IHJ4cGQpKSkgeworCQlsYnNfcHJfZGVidWcoMSwgIlJYIGVycm9yOiBGUkFNRSBSRUNFSVZFRCBXSVRIIEJBRCBMRU5HVEhcbiIpOworCQlwcml2LT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCXJldCA9IDA7CisJCWdvdG8gZG9uZTsKKwl9CisKKwkvKgorCSAqIENoZWNrIHJ4cGQgc3RhdHVzIGFuZCB1cGRhdGUgODAyLjMgc3RhdCwKKwkgKi8KKwlpZiAoIShwcnhwZC0+c3RhdHVzICYgTVJWRFJWX1JYUERfU1RBVFVTX09LKSkgeworCQkvL2xic19wcl9kZWJ1ZygxLCAiUlggZXJyb3I6IGZyYW1lIHJlY2VpdmVkIHdpdGggYmFkIHN0YXR1c1xuIik7CisJCXByaXYtPnN0YXRzLnJ4X2Vycm9ycysrOworCX0KKworCWxic19wcl9kZWJ1ZygxLCAiUlggRGF0YTogc2tiLT5sZW4gLSBzaXplb2YoUnhQZCkgPSAlZCAtICVkID0gJWRcbiIsCisJICAgICAgIHNrYi0+bGVuLCBzaXplb2Yoc3RydWN0IHJ4cGQpLCBza2ItPmxlbiAtIHNpemVvZihzdHJ1Y3QgcnhwZCkpOworCisJLyogY3JlYXRlIHRoZSBleHBvcnRlZCByYWRpbyBoZWFkZXIgKi8KKwlzd2l0Y2ggKHByaXYtPmFkYXB0ZXItPnJhZGlvbW9kZSkgeworCWNhc2UgV0xBTl9SQURJT01PREVfTk9ORToKKwkJLyogbm8gcmFkaW8gaGVhZGVyICovCisJCS8qIGNob3AgdGhlIHJ4cGQgKi8KKwkJc2tiX3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IHJ4cGQpKTsKKwkJYnJlYWs7CisKKwljYXNlIFdMQU5fUkFESU9NT0RFX1JBRElPVEFQOgorCQkvKiByYWRpb3RhcCBoZWFkZXIgKi8KKwkJcmFkaW90YXBfaGRyLmhkci5pdF92ZXJzaW9uID0gMDsKKwkJLyogWFhYIG11c3QgY2hlY2sgdGhpcyB2YWx1ZSBmb3IgcGFkICovCisJCXJhZGlvdGFwX2hkci5oZHIuaXRfcGFkID0gMDsKKwkJcmFkaW90YXBfaGRyLmhkci5pdF9sZW4gPSBzaXplb2Yoc3RydWN0IHJ4X3JhZGlvdGFwX2hkcik7CisJCXJhZGlvdGFwX2hkci5oZHIuaXRfcHJlc2VudCA9IFJYX1JBRElPVEFQX1BSRVNFTlQ7CisJCS8qIHVua25vd24gdmFsdWVzICovCisJCXJhZGlvdGFwX2hkci5mbGFncyA9IDA7CisJCXJhZGlvdGFwX2hkci5jaGFuX2ZyZXEgPSAwOworCQlyYWRpb3RhcF9oZHIuY2hhbl9mbGFncyA9IDA7CisJCXJhZGlvdGFwX2hkci5hbnRlbm5hID0gMDsKKwkJLyoga25vd24gdmFsdWVzICovCisJCXJhZGlvdGFwX2hkci5yYXRlID0gY29udmVydF9tdl9yYXRlX3RvX3JhZGlvdGFwKHByeHBkLT5yeF9yYXRlKTsKKwkJLyogWFhYIG11c3QgY2hlY2sgbm8gY2FycnlvdXQgKi8KKwkJcmFkaW90YXBfaGRyLmFudHNpZ25hbCA9IHByeHBkLT5zbnIgKyBwcnhwZC0+bmY7CisJCXJhZGlvdGFwX2hkci5yeF9mbGFncyA9IDA7CisJCWlmICghKHByeHBkLT5zdGF0dXMgJiBNUlZEUlZfUlhQRF9TVEFUVVNfT0spKQorCQkJcmFkaW90YXBfaGRyLnJ4X2ZsYWdzIHw9IElFRUU4MDIxMV9SQURJT1RBUF9GX1JYX0JBREZDUzsKKwkJLy9tZW1zZXQocmFkaW90YXBfaGRyLnBhZCwgMHgxMSwgSUVFRTgwMjExX1JBRElPVEFQX0hEUkxFTiAtIDE4KTsKKworCQkvLyBsYnNfZGJnX2hleDEoIlJYIHJhZGlvbW9kZSBwYWNrZXQgQkVGOiAiLCBza2ItPmRhdGEsIG1pbihza2ItPmxlbiwgMTAwKSk7CisKKwkJLyogY2hvcCB0aGUgcnhwZCAqLworCQlza2JfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgcnhwZCkpOworCisJCS8qIGFkZCBzcGFjZSBmb3IgdGhlIG5ldyByYWRpbyBoZWFkZXIgKi8KKwkJaWYgKChza2JfaGVhZHJvb20oc2tiKSA8IHNpemVvZihzdHJ1Y3QgcnhfcmFkaW90YXBfaGRyKSkgJiYKKwkJICAgIHBza2JfZXhwYW5kX2hlYWQoc2tiLCBzaXplb2Yoc3RydWN0IHJ4X3JhZGlvdGFwX2hkciksIDAsCisJCQkJICAgICBHRlBfQVRPTUlDKSkgeworCQkJbGJzX3ByX2FsZXJ0KCAiJXM6IGNvdWxkbid0IHBza2JfZXhwYW5kX2hlYWRcbiIsCisJCQkgICAgICAgX19mdW5jX18pOworCQl9CisKKwkJcHJhZGlvdGFwX2hkciA9CisJCSAgICAoc3RydWN0IHJ4X3JhZGlvdGFwX2hkciAqKXNrYl9wdXNoKHNrYiwKKwkJCQkJCSAgICAgc2l6ZW9mKHN0cnVjdAorCQkJCQkJCSAgICByeF9yYWRpb3RhcF9oZHIpKTsKKwkJbWVtY3B5KHByYWRpb3RhcF9oZHIsICZyYWRpb3RhcF9oZHIsCisJCSAgICAgICBzaXplb2Yoc3RydWN0IHJ4X3JhZGlvdGFwX2hkcikpOworCQkvL2xic19kYmdfaGV4MSgiUlggcmFkaW9tb2RlIHBhY2tldCBBRlQ6ICIsIHNrYi0+ZGF0YSwgbWluKHNrYi0+bGVuLCAxMDApKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQkvKiB1bmtub3duIGhlYWRlciAqLworCQlsYnNfcHJfYWxlcnQoICJVbmtub3duIHJhZGlvbW9kZSAoJWkpXG4iLAorCQkgICAgICAgcHJpdi0+YWRhcHRlci0+cmFkaW9tb2RlKTsKKwkJLyogZG9uJ3QgZXhwb3J0IGFueSBoZWFkZXIgKi8KKwkJLyogY2hvcCB0aGUgcnhwZCAqLworCQlza2JfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgcnhwZCkpOworCQlicmVhazsKKwl9CisKKwkvKiBUYWtlIHRoZSBkYXRhIHJhdGUgZnJvbSB0aGUgcnhwZCBzdHJ1Y3R1cmUKKwkgKiBvbmx5IGlmIHRoZSByYXRlIGlzIGF1dG8KKwkgKi8KKwlpZiAoYWRhcHRlci0+aXNfZGF0YXJhdGVfYXV0bykgeworCQlhZGFwdGVyLT5kYXRhcmF0ZSA9IGxpYmVydGFzX2luZGV4X3RvX2RhdGFfcmF0ZShwcnhwZC0+cnhfcmF0ZSk7CisJfQorCisJd2xhbl9jb21wdXRlX3Jzc2kocHJpdiwgcHJ4cGQpOworCisJbGJzX3ByX2RlYnVnKDEsICJSWCBEYXRhOiBzaXplIG9mIGFjdHVhbCBwYWNrZXQgPSAlZFxuIiwgc2tiLT5sZW4pOworCisJaWYgKGxpYmVydGFzX3VwbG9hZF9yeF9wYWNrZXQocHJpdiwgc2tiKSkgeworCQlsYnNfcHJfZGVidWcoMSwgIlJYIGVycm9yOiBsaWJlcnRhc191cGxvYWRfcnhfcGFja2V0ICIKKwkJCSJyZXR1cm5zIGZhaWx1cmVcbiIpOworCQlyZXQgPSAtMTsKKwkJZ290byBkb25lOworCX0KKworCXByaXYtPnN0YXRzLnJ4X2J5dGVzICs9IHNrYi0+bGVuOworCXByaXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKworCXJldCA9IDA7Citkb25lOgorCUxFQVZFKCk7CisKKwlza2ItPnByb3RvY29sID0gX19jb25zdGFudF9odG9ucygweDAwMTkpOwkvKiBFVEhfUF84MDIxMV9SQVcgKi8KKworCXJldHVybiAocmV0KTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL3NiaS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvc2JpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTlkM2E1OWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9zYmkuaApAQCAtMCwwICsxLDQwIEBACisvKioKKyAgKiBUaGlzIGZpbGUgY29udGFpbnMgSUYgbGF5ZXIgZGVmaW5pdGlvbnMuCisgICovCisKKyNpZm5kZWYJX1NCSV9IXworI2RlZmluZQlfU0JJX0hfCisKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKworI2luY2x1ZGUgImRlZnMuaCIKKworLyoqIElOVCBzdGF0dXMgQml0IERlZmluaXRpb24qLworI2RlZmluZSBoaXNfY21kZG5sZHJkeQkJCTB4MDEKKyNkZWZpbmUgaGlzX2NhcmRldmVudAkJCTB4MDIKKyNkZWZpbmUgaGlzX2NtZHVwbGRyZHkJCQkweDA0CisKKyNpZm5kZWYgREVWX05BTUVfTEVOCisjZGVmaW5lIERFVl9OQU1FX0xFTgkJCTMyCisjZW5kaWYKKworI2RlZmluZSBTQklfRVZFTlRfQ0FVU0VfU0hJRlQJCTMKKworLyogUHJvYmUgYW5kIENoZWNrIGlmIHRoZSBjYXJkIGlzIHByZXNlbnQqLworaW50IGxpYmVydGFzX3NiaV9yZWdpc3Rlcl9kZXYod2xhbl9wcml2YXRlICogcHJpdik7CitpbnQgbGliZXJ0YXNfc2JpX3VucmVnaXN0ZXJfZGV2KHdsYW5fcHJpdmF0ZSAqKTsKK2ludCBsaWJlcnRhc19zYmlfZ2V0X2ludF9zdGF0dXMod2xhbl9wcml2YXRlICogcHJpdiwgdTggKik7CitpbnQgbGliZXJ0YXNfc2JpX3JlZ2lzdGVyKHZvaWQpOwordm9pZCBsaWJlcnRhc19zYmlfdW5yZWdpc3Rlcih2b2lkKTsKK2ludCBsaWJlcnRhc19zYmlfcHJvZ19maXJtd2FyZSh3bGFuX3ByaXZhdGUgKik7CisKK2ludCBsaWJlcnRhc19zYmlfcmVhZF9ldmVudF9jYXVzZSh3bGFuX3ByaXZhdGUgKik7CitpbnQgbGliZXJ0YXNfc2JpX2hvc3RfdG9fY2FyZCh3bGFuX3ByaXZhdGUgKiBwcml2LCB1OCB0eXBlLCB1OCAqIHBheWxvYWQsIHUxNiBuYik7Cit3bGFuX3ByaXZhdGUgKmxpYmVydGFzX3NiaV9nZXRfcHJpdih2b2lkICpjYXJkKTsKKworI2lmZGVmIEVOQUJMRV9QTQoraW50IGxpYmVydGFzX3NiaV9zdXNwZW5kKHdsYW5fcHJpdmF0ZSAqKTsKK2ludCBsaWJlcnRhc19zYmlfcmVzdW1lKHdsYW5fcHJpdmF0ZSAqKTsKKyNlbmRpZgorCisjZW5kaWYJCQkJLyogX1NCSV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9zY2FuLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9zY2FuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE4NzA2MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL3NjYW4uYwpAQCAtMCwwICsxLDIwNDQgQEAKKy8qIC0qLSBtb2RlOiBDOyB0YWItd2lkdGg6IDQ7IGluZGVudC10YWJzLW1vZGU6IG5pbCAtKi0gKi8KKy8qIHZpOiBzZXQgZXhwYW5kdGFiIHNoaWZ0d2lkdGg9NCB0YWJzdG9wPTQgdGV4dHdpZHRoPTc4OiAqLworCisvKioKKyAgKiBGdW5jdGlvbnMgaW1wbGVtZW50aW5nIHdsYW4gc2NhbiBJT0NUTCBhbmQgZmlybXdhcmUgY29tbWFuZCBBUElzCisgICoKKyAgKiBJT0NUTCBoYW5kbGVycyBhcyB3ZWxsIGFzIGNvbW1hbmQgcHJlcGVyYXRpb24gYW5kIHJlc3BvbnNlIHJvdXRpbmVzCisgICogIGZvciBzZW5kaW5nIHNjYW4gY29tbWFuZHMgdG8gdGhlIGZpcm13YXJlLgorICAqLworI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvaWYuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorCisjaW5jbHVkZSA8bmV0L2llZWU4MDIxMS5oPgorI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+CisKKyNpbmNsdWRlICJob3N0LmgiCisjaW5jbHVkZSAiZGVjbC5oIgorI2luY2x1ZGUgImRldi5oIgorI2luY2x1ZGUgInNjYW4uaCIKKworLy8hIEFwcHJveGltYXRlIGFtb3VudCBvZiBkYXRhIG5lZWRlZCB0byBwYXNzIGEgc2NhbiByZXN1bHQgYmFjayB0byBpd2xpc3QKKyNkZWZpbmUgTUFYX1NDQU5fQ0VMTF9TSVpFICAoSVdfRVZfQUREUl9MRU4gICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIElXX0VTU0lEX01BWF9TSVpFICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgSVdfRVZfVUlOVF9MRU4gICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBJV19FVl9GUkVRX0xFTiAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIElXX0VWX1FVQUxfTEVOICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgSVdfRVNTSURfTUFYX1NJWkUgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBJV19FVl9QQVJBTV9MRU4gICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIDQwKQkvKiA0MCBmb3IgV1BBSUUgKi8KKworLy8hIE1lbW9yeSBuZWVkZWQgdG8gc3RvcmUgYSBtYXggc2l6ZWQgY2hhbm5lbCBMaXN0IFRMViBmb3IgYSBmaXJtd2FyZSBzY2FuCisjZGVmaW5lIENIQU5fVExWX01BWF9TSVpFICAoc2l6ZW9mKHN0cnVjdCBtcnZsaWV0eXBlc2hlYWRlcikgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKE1SVkRSVl9NQVhfQ0hBTk5FTFNfUEVSX1NDQU4gICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHNpemVvZihzdHJ1Y3QgY2hhbnNjYW5wYXJhbXNldCkpKQorCisvLyEgTWVtb3J5IG5lZWRlZCB0byBzdG9yZSBhIG1heCBudW1iZXIvc2l6ZSBTU0lEIFRMViBmb3IgYSBmaXJtd2FyZSBzY2FuCisjZGVmaW5lIFNTSURfVExWX01BWF9TSVpFICAoMSAqIHNpemVvZihzdHJ1Y3QgbXJ2bGlldHlwZXNfc3NpZHBhcmFtc2V0KSkKKworLy8hIE1heGltdW0gbWVtb3J5IG5lZWRlZCBmb3IgYSB3bGFuX3NjYW5fY21kX2NvbmZpZyB3aXRoIGFsbCBUTFZzIGF0IG1heAorI2RlZmluZSBNQVhfU0NBTl9DRkdfQUxMT0MgKHNpemVvZihzdHJ1Y3Qgd2xhbl9zY2FuX2NtZF9jb25maWcpICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzaXplb2Yoc3RydWN0IG1ydmxpZXR5cGVzX251bXByb2JlcykgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBDSEFOX1RMVl9NQVhfU0laRSAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgU1NJRF9UTFZfTUFYX1NJWkUpCisKKy8vISBUaGUgbWF4aW11bSBudW1iZXIgb2YgY2hhbm5lbHMgdGhlIGZpcm13YXJlIGNhbiBzY2FuIHBlciBjb21tYW5kCisjZGVmaW5lIE1SVkRSVl9NQVhfQ0hBTk5FTFNfUEVSX1NDQU4gICAxNAorCisvKioKKyAqIEBicmllZiBOdW1iZXIgb2YgY2hhbm5lbHMgdG8gc2NhbiBwZXIgZmlybXdhcmUgc2NhbiBjb21tYW5kIGlzc3VhbmNlLgorICoKKyAqICBOdW1iZXIgcmVzdHJpY3RlZCB0byBwcmV2ZW50IGhpdHRpbmcgdGhlIGxpbWl0IG9uIHRoZSBhbW91bnQgb2Ygc2NhbiBkYXRhCisgKiAgcmV0dXJuZWQgaW4gYSBzaW5nbGUgZmlybXdhcmUgc2NhbiBjb21tYW5kLgorICovCisjZGVmaW5lIE1SVkRSVl9DSEFOTkVMU19QRVJfU0NBTl9DTUQgICA0CisKKy8vISBTY2FuIHRpbWUgc3BlY2lmaWVkIGluIHRoZSBjaGFubmVsIFRMViBmb3IgZWFjaCBjaGFubmVsIGZvciBwYXNzaXZlIHNjYW5zCisjZGVmaW5lIE1SVkRSVl9QQVNTSVZFX1NDQU5fQ0hBTl9USU1FICAxMDAKKworLy8hIFNjYW4gdGltZSBzcGVjaWZpZWQgaW4gdGhlIGNoYW5uZWwgVExWIGZvciBlYWNoIGNoYW5uZWwgZm9yIGFjdGl2ZSBzY2FucworI2RlZmluZSBNUlZEUlZfQUNUSVZFX1NDQU5fQ0hBTl9USU1FICAgMTAwCisKKy8vISBNYWNybyB0byBlbmFibGUvZGlzYWJsZSBTU0lEIGNoZWNraW5nIGJlZm9yZSBzdG9yaW5nIGEgc2NhbiB0YWJsZQorI2lmZGVmIERJU0NBUkRfQkFEX1NTSUQKKyNkZWZpbmUgQ0hFQ0tfU1NJRF9JU19WQUxJRCh4KSBzc2lkX3ZhbGlkKCZic3NpZEVudHJ5LnNzaWQpCisjZWxzZQorI2RlZmluZSBDSEVDS19TU0lEX0lTX1ZBTElEKHgpIDEKKyNlbmRpZgorCisvKioKKyAqICBAYnJpZWYgQ2hlY2sgaWYgYSBzY2FubmVkIG5ldHdvcmsgY29tcGF0aWJsZSB3aXRoIHRoZSBkcml2ZXIgc2V0dGluZ3MKKyAqCisgKiAgIFdFUCAgICAgV1BBICAgICBXUEEyICAgIGFkLWhvYyAgZW5jcnlwdCAgICAgICAgICAgICAgICAgICAgICBOZXR3b3JrCisgKiBlbmFibGVkIGVuYWJsZWQgIGVuYWJsZWQgICBBRVMgICAgIG1vZGUgICBwcml2YWN5ICBXUEEgIFdQQTIgIENvbXBhdGlibGUKKyAqICAgIDAgICAgICAgMCAgICAgICAgMCAgICAgICAwICAgICAgTk9ORSAgICAgIDAgICAgICAwICAgIDAgICB5ZXMgTm8gc2VjdXJpdHkKKyAqICAgIDEgICAgICAgMCAgICAgICAgMCAgICAgICAwICAgICAgTk9ORSAgICAgIDEgICAgICAwICAgIDAgICB5ZXMgU3RhdGljIFdFUAorICogICAgMCAgICAgICAxICAgICAgICAwICAgICAgIDAgICAgICAgeCAgICAgICAgMXggICAgIDEgICAgeCAgIHllcyBXUEEKKyAqICAgIDAgICAgICAgMCAgICAgICAgMSAgICAgICAwICAgICAgIHggICAgICAgIDF4ICAgICB4ICAgIDEgICB5ZXMgV1BBMgorICogICAgMCAgICAgICAwICAgICAgICAwICAgICAgIDEgICAgICBOT05FICAgICAgMSAgICAgIDAgICAgMCAgIHllcyBBZC1ob2MgQUVTCisgKiAgICAwICAgICAgIDAgICAgICAgIDAgICAgICAgMCAgICAgIT1OT05FICAgICAxICAgICAgMCAgICAwICAgeWVzIER5bmFtaWMgV0VQCisgKgorICoKKyAqICBAcGFyYW0gYWRhcHRlciBBIHBvaW50ZXIgdG8gd2xhbl9hZGFwdGVyCisgKiAgQHBhcmFtIGluZGV4ICAgSW5kZXggaW4gc2NhbnRhYmxlIHRvIGNoZWNrIGFnYWluc3QgY3VycmVudCBkcml2ZXIgc2V0dGluZ3MKKyAqICBAcGFyYW0gbW9kZSAgICBOZXR3b3JrIG1vZGU6IEluZnJhc3RydWN0dXJlIG9yIElCU1MKKyAqCisgKiAgQHJldHVybiAgICAgICAgSW5kZXggaW4gc2NhbnRhYmxlLCBvciBlcnJvciBjb2RlIGlmIG5lZ2F0aXZlCisgKi8KK3N0YXRpYyBpbnQgaXNfbmV0d29ya19jb21wYXRpYmxlKHdsYW5fYWRhcHRlciAqIGFkYXB0ZXIsIGludCBpbmRleCwgaW50IG1vZGUpCit7CisJRU5URVIoKTsKKworCWlmIChhZGFwdGVyLT5zY2FudGFibGVbaW5kZXhdLmluZnJhbW9kZSA9PSBtb2RlKSB7CisJCWlmIChhZGFwdGVyLT5zZWNpbmZvLldFUHN0YXR1cyA9PSB3bGFuODAyXzExV0VQZGlzYWJsZWQKKwkJICAgICYmICFhZGFwdGVyLT5zZWNpbmZvLldQQWVuYWJsZWQKKwkJICAgICYmICFhZGFwdGVyLT5zZWNpbmZvLldQQTJlbmFibGVkCisJCSAgICAmJiBhZGFwdGVyLT5zY2FudGFibGVbaW5kZXhdLndwYV9zdXBwbGljYW50LndwYV9pZVswXSAhPQorCQkgICAgV1BBX0lFCisJCSAgICAmJiBhZGFwdGVyLT5zY2FudGFibGVbaW5kZXhdLndwYTJfc3VwcGxpY2FudC53cGFfaWVbMF0gIT0KKwkJICAgIFdQQTJfSUUgJiYgYWRhcHRlci0+c2VjaW5mby5FbmNyeXB0aW9ubW9kZSA9PSBDSVBIRVJfTk9ORQorCQkgICAgJiYgIWFkYXB0ZXItPnNjYW50YWJsZVtpbmRleF0ucHJpdmFjeSkgeworCQkJLyogbm8gc2VjdXJpdHkgKi8KKwkJCUxFQVZFKCk7CisJCQlyZXR1cm4gaW5kZXg7CisJCX0gZWxzZSBpZiAoYWRhcHRlci0+c2VjaW5mby5XRVBzdGF0dXMgPT0gd2xhbjgwMl8xMVdFUGVuYWJsZWQKKwkJCSAgICYmICFhZGFwdGVyLT5zZWNpbmZvLldQQWVuYWJsZWQKKwkJCSAgICYmICFhZGFwdGVyLT5zZWNpbmZvLldQQTJlbmFibGVkCisJCQkgICAmJiBhZGFwdGVyLT5zY2FudGFibGVbaW5kZXhdLnByaXZhY3kpIHsKKwkJCS8qIHN0YXRpYyBXRVAgZW5hYmxlZCAqLworCQkJTEVBVkUoKTsKKwkJCXJldHVybiBpbmRleDsKKwkJfSBlbHNlIGlmIChhZGFwdGVyLT5zZWNpbmZvLldFUHN0YXR1cyA9PSB3bGFuODAyXzExV0VQZGlzYWJsZWQKKwkJCSAgICYmIGFkYXB0ZXItPnNlY2luZm8uV1BBZW5hYmxlZAorCQkJICAgJiYgIWFkYXB0ZXItPnNlY2luZm8uV1BBMmVuYWJsZWQKKwkJCSAgICYmIChhZGFwdGVyLT5zY2FudGFibGVbaW5kZXhdLndwYV9zdXBwbGljYW50LgorCQkJICAgICAgIHdwYV9pZVswXQorCQkJICAgICAgID09IFdQQV9JRSkKKwkJCSAgIC8qIHByaXZhY3kgYml0IG1heSBOT1QgYmUgc2V0IGluIHNvbWUgQVBzIGxpa2UgTGlua1N5cyBXUlQ1NEcKKwkJCSAgICAgICYmIGFkYXB0ZXItPnNjYW50YWJsZVtpbmRleF0ucHJpdmFjeSAqLworCQkgICAgKSB7CisJCQkvKiBXUEEgZW5hYmxlZCAqLworICAgICAgICAgICAgbGJzX3ByX2RlYnVnKDEsCisJCQkgICAgICAgImlzX25ldHdvcmtfY29tcGF0aWJsZSgpIFdQQTogaW5kZXg9JWQgd3BhX2llPSUjeCAiCisJCQkgICAgICAgIndwYTJfaWU9JSN4IFdFUD0lcyBXUEE9JXMgV1BBMj0lcyBFbmNtb2RlPSUjeCAiCisJCQkgICAgICAgInByaXZhY3k9JSN4XG4iLCBpbmRleCwKKwkJCSAgICAgICBhZGFwdGVyLT5zY2FudGFibGVbaW5kZXhdLndwYV9zdXBwbGljYW50LgorCQkJICAgICAgIHdwYV9pZVswXSwKKwkJCSAgICAgICBhZGFwdGVyLT5zY2FudGFibGVbaW5kZXhdLndwYTJfc3VwcGxpY2FudC4KKwkJCSAgICAgICB3cGFfaWVbMF0sCisJCQkgICAgICAgKGFkYXB0ZXItPnNlY2luZm8uV0VQc3RhdHVzID09CisJCQkJd2xhbjgwMl8xMVdFUGVuYWJsZWQpID8gImUiIDogImQiLAorCQkJICAgICAgIChhZGFwdGVyLT5zZWNpbmZvLldQQWVuYWJsZWQpID8gImUiIDogImQiLAorCQkJICAgICAgIChhZGFwdGVyLT5zZWNpbmZvLldQQTJlbmFibGVkKSA/ICJlIiA6ICJkIiwKKwkJCSAgICAgICBhZGFwdGVyLT5zZWNpbmZvLkVuY3J5cHRpb25tb2RlLAorCQkJICAgICAgIGFkYXB0ZXItPnNjYW50YWJsZVtpbmRleF0ucHJpdmFjeSk7CisJCQlMRUFWRSgpOworCQkJcmV0dXJuIGluZGV4OworCQl9IGVsc2UgaWYgKGFkYXB0ZXItPnNlY2luZm8uV0VQc3RhdHVzID09IHdsYW44MDJfMTFXRVBkaXNhYmxlZAorCQkJICAgJiYgIWFkYXB0ZXItPnNlY2luZm8uV1BBZW5hYmxlZAorCQkJICAgJiYgYWRhcHRlci0+c2VjaW5mby5XUEEyZW5hYmxlZAorCQkJICAgJiYgKGFkYXB0ZXItPnNjYW50YWJsZVtpbmRleF0ud3BhMl9zdXBwbGljYW50LgorCQkJICAgICAgIHdwYV9pZVswXQorCQkJICAgICAgID09IFdQQTJfSUUpCisJCQkgICAvKiBwcml2YWN5IGJpdCBtYXkgTk9UIGJlIHNldCBpbiBzb21lIEFQcyBsaWtlIExpbmtTeXMgV1JUNTRHCisJCQkgICAgICAmJiBhZGFwdGVyLT5zY2FudGFibGVbaW5kZXhdLnByaXZhY3kgKi8KKwkJICAgICkgeworCQkJLyogV1BBMiBlbmFibGVkICovCisgICAgICAgICAgICBsYnNfcHJfZGVidWcoMSwKKwkJCSAgICAgICAiaXNfbmV0d29ya19jb21wYXRpYmxlKCkgV1BBMjogaW5kZXg9JWQgd3BhX2llPSUjeCAiCisJCQkgICAgICAgIndwYTJfaWU9JSN4IFdFUD0lcyBXUEE9JXMgV1BBMj0lcyBFbmNtb2RlPSUjeCAiCisJCQkgICAgICAgInByaXZhY3k9JSN4XG4iLCBpbmRleCwKKwkJCSAgICAgICBhZGFwdGVyLT5zY2FudGFibGVbaW5kZXhdLndwYV9zdXBwbGljYW50LgorCQkJICAgICAgIHdwYV9pZVswXSwKKwkJCSAgICAgICBhZGFwdGVyLT5zY2FudGFibGVbaW5kZXhdLndwYTJfc3VwcGxpY2FudC4KKwkJCSAgICAgICB3cGFfaWVbMF0sCisJCQkgICAgICAgKGFkYXB0ZXItPnNlY2luZm8uV0VQc3RhdHVzID09CisJCQkJd2xhbjgwMl8xMVdFUGVuYWJsZWQpID8gImUiIDogImQiLAorCQkJICAgICAgIChhZGFwdGVyLT5zZWNpbmZvLldQQWVuYWJsZWQpID8gImUiIDogImQiLAorCQkJICAgICAgIChhZGFwdGVyLT5zZWNpbmZvLldQQTJlbmFibGVkKSA/ICJlIiA6ICJkIiwKKwkJCSAgICAgICBhZGFwdGVyLT5zZWNpbmZvLkVuY3J5cHRpb25tb2RlLAorCQkJICAgICAgIGFkYXB0ZXItPnNjYW50YWJsZVtpbmRleF0ucHJpdmFjeSk7CisJCQlMRUFWRSgpOworCQkJcmV0dXJuIGluZGV4OworCQl9IGVsc2UgaWYgKGFkYXB0ZXItPnNlY2luZm8uV0VQc3RhdHVzID09IHdsYW44MDJfMTFXRVBkaXNhYmxlZAorCQkJICAgJiYgIWFkYXB0ZXItPnNlY2luZm8uV1BBZW5hYmxlZAorCQkJICAgJiYgIWFkYXB0ZXItPnNlY2luZm8uV1BBMmVuYWJsZWQKKwkJCSAgICYmIChhZGFwdGVyLT5zY2FudGFibGVbaW5kZXhdLndwYV9zdXBwbGljYW50LgorCQkJICAgICAgIHdwYV9pZVswXQorCQkJICAgICAgICE9IFdQQV9JRSkKKwkJCSAgICYmIChhZGFwdGVyLT5zY2FudGFibGVbaW5kZXhdLndwYTJfc3VwcGxpY2FudC4KKwkJCSAgICAgICB3cGFfaWVbMF0KKwkJCSAgICAgICAhPSBXUEEyX0lFKQorCQkJICAgJiYgYWRhcHRlci0+c2VjaW5mby5FbmNyeXB0aW9ubW9kZSAhPSBDSVBIRVJfTk9ORQorCQkJICAgJiYgYWRhcHRlci0+c2NhbnRhYmxlW2luZGV4XS5wcml2YWN5KSB7CisJCQkvKiBkeW5hbWljIFdFUCBlbmFibGVkICovCisgICAgICAgICAgICBsYnNfcHJfZGVidWcoMSwKKwkJCSAgICAgICAiaXNfbmV0d29ya19jb21wYXRpYmxlKCkgZHluYW1pYyBXRVA6IGluZGV4PSVkICIKKwkJCSAgICAgICAid3BhX2llPSUjeCB3cGEyX2llPSUjeCBFbmNtb2RlPSUjeCBwcml2YWN5PSUjeFxuIiwKKwkJCSAgICAgICBpbmRleCwKKwkJCSAgICAgICBhZGFwdGVyLT5zY2FudGFibGVbaW5kZXhdLndwYV9zdXBwbGljYW50LgorCQkJICAgICAgIHdwYV9pZVswXSwKKwkJCSAgICAgICBhZGFwdGVyLT5zY2FudGFibGVbaW5kZXhdLndwYTJfc3VwcGxpY2FudC4KKwkJCSAgICAgICB3cGFfaWVbMF0sIGFkYXB0ZXItPnNlY2luZm8uRW5jcnlwdGlvbm1vZGUsCisJCQkgICAgICAgYWRhcHRlci0+c2NhbnRhYmxlW2luZGV4XS5wcml2YWN5KTsKKwkJCUxFQVZFKCk7CisJCQlyZXR1cm4gaW5kZXg7CisJCX0KKworCQkvKiBzZWN1cml0eSBkb2Vzbid0IG1hdGNoICovCisgICAgICAgIGxic19wcl9kZWJ1ZygxLAorCQkgICAgICAgImlzX25ldHdvcmtfY29tcGF0aWJsZSgpIEZBSUxFRDogaW5kZXg9JWQgd3BhX2llPSUjeCAiCisJCSAgICAgICAid3BhMl9pZT0lI3ggV0VQPSVzIFdQQT0lcyBXUEEyPSVzIEVuY21vZGU9JSN4IHByaXZhY3k9JSN4XG4iLAorCQkgICAgICAgaW5kZXgsCisJCSAgICAgICBhZGFwdGVyLT5zY2FudGFibGVbaW5kZXhdLndwYV9zdXBwbGljYW50LndwYV9pZVswXSwKKwkJICAgICAgIGFkYXB0ZXItPnNjYW50YWJsZVtpbmRleF0ud3BhMl9zdXBwbGljYW50LndwYV9pZVswXSwKKwkJICAgICAgIChhZGFwdGVyLT5zZWNpbmZvLldFUHN0YXR1cyA9PQorCQkJd2xhbjgwMl8xMVdFUGVuYWJsZWQpID8gImUiIDogImQiLAorCQkgICAgICAgKGFkYXB0ZXItPnNlY2luZm8uV1BBZW5hYmxlZCkgPyAiZSIgOiAiZCIsCisJCSAgICAgICAoYWRhcHRlci0+c2VjaW5mby5XUEEyZW5hYmxlZCkgPyAiZSIgOiAiZCIsCisJCSAgICAgICBhZGFwdGVyLT5zZWNpbmZvLkVuY3J5cHRpb25tb2RlLAorCQkgICAgICAgYWRhcHRlci0+c2NhbnRhYmxlW2luZGV4XS5wcml2YWN5KTsKKwkJTEVBVkUoKTsKKwkJcmV0dXJuIC1FQ09OTlJFRlVTRUQ7CisJfQorCisJLyogbW9kZSBkb2Vzbid0IG1hdGNoICovCisJTEVBVkUoKTsKKwlyZXR1cm4gLUVORVRVTlJFQUNIOworfQorCisvKioKKyAqICBAYnJpZWYgVGhpcyBmdW5jdGlvbiB2YWxpZGF0ZXMgYSBTU0lEIGFzIGJlaW5nIGFibGUgdG8gYmUgcHJpbnRlZAorICoKKyAqICBAcGFyYW0gcHNzaWQgICBTU0lEIHN0cnVjdHVyZSB0byB2YWxpZGF0ZQorICoKKyAqICBAcmV0dXJuICAgICAgICBUUlVFIG9yIEZBTFNFCisgKi8KK3N0YXRpYyB1OCBzc2lkX3ZhbGlkKHN0cnVjdCBXTEFOXzgwMl8xMV9TU0lEICpwc3NpZCkKK3sKKwlpbnQgc3NpZGlkeDsKKworCWZvciAoc3NpZGlkeCA9IDA7IHNzaWRpZHggPCBwc3NpZC0+c3NpZGxlbmd0aDsgc3NpZGlkeCsrKSB7CisJCWlmICghaXNwcmludChwc3NpZC0+c3NpZFtzc2lkaWR4XSkpIHsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJcmV0dXJuIDE7Cit9CisKKy8qKgorICogIEBicmllZiBQb3N0IHByb2Nlc3MgdGhlIHNjYW4gdGFibGUgYWZ0ZXIgYSBuZXcgc2NhbiBjb21tYW5kIGhhcyBjb21wbGV0ZWQKKyAqCisgKiAgSW5zcGVjdCBlYWNoIGVudHJ5IG9mIHRoZSBzY2FuIHRhYmxlIGFuZCB0cnkgdG8gZmluZCBhbiBlbnRyeSB0aGF0CisgKiAgICBtYXRjaGVzIG91ciBjdXJyZW50IGFzc29jaWF0ZWQvam9pbmVkIG5ldHdvcmsgZnJvbSB0aGUgc2Nhbi4gIElmCisgKiAgICBvbmUgaXMgZm91bmQsIHVwZGF0ZSB0aGUgc3RvcmVkIGNvcHkgb2YgdGhlIGJzc2Rlc2NyaXB0b3IgZm9yIG91cgorICogICAgY3VycmVudCBuZXR3b3JrLgorICoKKyAqICBEZWJ1ZyBkdW1wIHRoZSBjdXJyZW50IHNjYW4gdGFibGUgY29udGVudHMgaWYgY29tcGlsZWQgYWNjb3JkaW5nbHkuCisgKgorICogIEBwYXJhbSBwcml2ICAgQSBwb2ludGVyIHRvIHdsYW5fcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqCisgKiAgQHJldHVybiAgICAgICB2b2lkCisgKi8KK3N0YXRpYyB2b2lkIHdsYW5fc2Nhbl9wcm9jZXNzX3Jlc3VsdHMod2xhbl9wcml2YXRlICogcHJpdikKK3sKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCWludCBmb3VuZGN1cnJlbnQ7CisJaW50IGk7CisKKwlmb3VuZGN1cnJlbnQgPSAwOworCisJaWYgKGFkYXB0ZXItPmNvbm5lY3Rfc3RhdHVzID09IGxpYmVydGFzX2Nvbm5lY3RlZCkgeworCQkvKiB0cnkgdG8gZmluZCB0aGUgY3VycmVudCBCU1NJRCBpbiB0aGUgbmV3IHNjYW4gbGlzdCAqLworCQlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+bnVtaW5zY2FudGFibGU7IGkrKykgeworCQkJaWYgKCFsaWJlcnRhc19TU0lEX2NtcCgmYWRhcHRlci0+c2NhbnRhYmxlW2ldLnNzaWQsCisJCQkJICAgICAmYWRhcHRlci0+Y3VyYnNzcGFyYW1zLnNzaWQpICYmCisJCQkgICAgIW1lbWNtcChhZGFwdGVyLT5jdXJic3NwYXJhbXMuYnNzaWQsCisJCQkJICAgIGFkYXB0ZXItPnNjYW50YWJsZVtpXS5tYWNhZGRyZXNzLAorCQkJCSAgICBFVEhfQUxFTikpIHsKKwkJCQlmb3VuZGN1cnJlbnQgPSAxOworCQkJfQorCQl9CisKKwkJaWYgKGZvdW5kY3VycmVudCkgeworCQkJLyogTWFrZSBhIGNvcHkgb2YgY3VycmVudCBCU1NJRCBkZXNjcmlwdG9yICovCisJCQltZW1jcHkoJmFkYXB0ZXItPmN1cmJzc3BhcmFtcy5ic3NkZXNjcmlwdG9yLAorCQkJICAgICAgICZhZGFwdGVyLT5zY2FudGFibGVbaV0sCisJCQkgICAgICAgc2l6ZW9mKGFkYXB0ZXItPmN1cmJzc3BhcmFtcy5ic3NkZXNjcmlwdG9yKSk7CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+bnVtaW5zY2FudGFibGU7IGkrKykgeworCQlsYnNfcHJfZGVidWcoMSwgIlNjYW46KCUwMmQpICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4LCAiCisJCSAgICAgICAiUlNTSVslMDNkXSwgU1NJRFslc11cbiIsCisJCSAgICAgICBpLAorCQkgICAgICAgYWRhcHRlci0+c2NhbnRhYmxlW2ldLm1hY2FkZHJlc3NbMF0sCisJCSAgICAgICBhZGFwdGVyLT5zY2FudGFibGVbaV0ubWFjYWRkcmVzc1sxXSwKKwkJICAgICAgIGFkYXB0ZXItPnNjYW50YWJsZVtpXS5tYWNhZGRyZXNzWzJdLAorCQkgICAgICAgYWRhcHRlci0+c2NhbnRhYmxlW2ldLm1hY2FkZHJlc3NbM10sCisJCSAgICAgICBhZGFwdGVyLT5zY2FudGFibGVbaV0ubWFjYWRkcmVzc1s0XSwKKwkJICAgICAgIGFkYXB0ZXItPnNjYW50YWJsZVtpXS5tYWNhZGRyZXNzWzVdLAorCQkgICAgICAgKHMzMikgYWRhcHRlci0+c2NhbnRhYmxlW2ldLnJzc2ksCisJCSAgICAgICBhZGFwdGVyLT5zY2FudGFibGVbaV0uc3NpZC5zc2lkKTsKKwl9Cit9CisKKy8qKgorICogIEBicmllZiBDcmVhdGUgYSBjaGFubmVsIGxpc3QgZm9yIHRoZSBkcml2ZXIgdG8gc2NhbiBiYXNlZCBvbiByZWdpb24gaW5mbworICoKKyAqICBVc2UgdGhlIGRyaXZlciByZWdpb24vYmFuZCBpbmZvcm1hdGlvbiB0byBjb25zdHJ1Y3QgYSBjb21wcmVoZW5zaXZlIGxpc3QKKyAqICAgIG9mIGNoYW5uZWxzIHRvIHNjYW4uICBUaGlzIHJvdXRpbmUgaXMgdXNlZCBmb3IgYW55IHNjYW4gdGhhdCBpcyBub3QKKyAqICAgIHByb3ZpZGVkIGEgc3BlY2lmaWMgY2hhbm5lbCBsaXN0IHRvIHNjYW4uCisgKgorICogIEBwYXJhbSBwcml2ICAgICAgICAgIEEgcG9pbnRlciB0byB3bGFuX3ByaXZhdGUgc3RydWN0dXJlCisgKiAgQHBhcmFtIHNjYW5jaGFubGlzdCAgT3V0cHV0IHBhcmFtZXRlcjogcmVzdWx0aW5nIGNoYW5uZWwgbGlzdCB0byBzY2FuCisgKiAgQHBhcmFtIGZpbHRlcmVkc2NhbiAgRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IGEgQlNTSUQgb3IgU1NJRCBmaWx0ZXIKKyAqICAgICAgICAgICAgICAgICAgICAgICBpcyBiZWluZyBzZW50IGluIHRoZSBjb21tYW5kIHRvIGZpcm13YXJlLiAgVXNlZCB0bworICogICAgICAgICAgICAgICAgICAgICAgIGluY3JlYXNlIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgc2VudCBpbiBhIHNjYW4KKyAqICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kIGFuZCB0byBkaXNhYmxlIHRoZSBmaXJtd2FyZSBjaGFubmVsIHNjYW4KKyAqICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIuCisgKgorICogIEByZXR1cm4gICAgICAgICAgICAgIHZvaWQKKyAqLworc3RhdGljIHZvaWQgd2xhbl9zY2FuX2NyZWF0ZV9jaGFubmVsX2xpc3Qod2xhbl9wcml2YXRlICogcHJpdiwKKwkJCQkJICBzdHJ1Y3QgY2hhbnNjYW5wYXJhbXNldCAqIHNjYW5jaGFubGlzdCwKKwkJCQkJICB1OCBmaWx0ZXJlZHNjYW4pCit7CisKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCXN0cnVjdCByZWdpb25fY2hhbm5lbCAqc2NhbnJlZ2lvbjsKKwlzdHJ1Y3QgY2hhbl9mcmVxX3Bvd2VyICpjZnA7CisJaW50IHJnbmlkeDsKKwlpbnQgY2hhbmlkeDsKKwlpbnQgbmV4dGNoYW47CisJdTggc2NhbnR5cGU7CisKKwljaGFuaWR4ID0gMDsKKworCS8qIFNldCB0aGUgZGVmYXVsdCBzY2FuIHR5cGUgdG8gdGhlIHVzZXIgc3BlY2lmaWVkIHR5cGUsIHdpbGwgbGF0ZXIKKwkgKiAgIGJlIGNoYW5nZWQgdG8gcGFzc2l2ZSBvbiBhIHBlciBjaGFubmVsIGJhc2lzIGlmIHJlc3RyaWN0ZWQgYnkKKwkgKiAgIHJlZ3VsYXRvcnkgcmVxdWlyZW1lbnRzICgxMWQgb3IgMTFoKQorCSAqLworCXNjYW50eXBlID0gYWRhcHRlci0+c2NhbnR5cGU7CisKKwlmb3IgKHJnbmlkeCA9IDA7IHJnbmlkeCA8IEFSUkFZX1NJWkUoYWRhcHRlci0+cmVnaW9uX2NoYW5uZWwpOyByZ25pZHgrKykgeworCQlpZiAocHJpdi0+YWRhcHRlci0+ZW5hYmxlMTFkICYmCisJCSAgICBhZGFwdGVyLT5jb25uZWN0X3N0YXR1cyAhPSBsaWJlcnRhc19jb25uZWN0ZWQpIHsKKwkJCS8qIFNjYW4gYWxsIHRoZSBzdXBwb3J0ZWQgY2hhbiBmb3IgdGhlIGZpcnN0IHNjYW4gKi8KKwkJCWlmICghYWRhcHRlci0+dW5pdmVyc2FsX2NoYW5uZWxbcmduaWR4XS52YWxpZCkKKwkJCQljb250aW51ZTsKKwkJCXNjYW5yZWdpb24gPSAmYWRhcHRlci0+dW5pdmVyc2FsX2NoYW5uZWxbcmduaWR4XTsKKworCQkJLyogY2xlYXIgdGhlIHBhcnNlZF9yZWdpb25fY2hhbiBmb3IgdGhlIGZpcnN0IHNjYW4gKi8KKwkJCW1lbXNldCgmYWRhcHRlci0+cGFyc2VkX3JlZ2lvbl9jaGFuLCAweDAwLAorCQkJICAgICAgIHNpemVvZihhZGFwdGVyLT5wYXJzZWRfcmVnaW9uX2NoYW4pKTsKKwkJfSBlbHNlIHsKKwkJCWlmICghYWRhcHRlci0+cmVnaW9uX2NoYW5uZWxbcmduaWR4XS52YWxpZCkKKwkJCQljb250aW51ZTsKKwkJCXNjYW5yZWdpb24gPSAmYWRhcHRlci0+cmVnaW9uX2NoYW5uZWxbcmduaWR4XTsKKwkJfQorCisJCWZvciAobmV4dGNoYW4gPSAwOworCQkgICAgIG5leHRjaGFuIDwgc2NhbnJlZ2lvbi0+bnJjZnA7IG5leHRjaGFuKyssIGNoYW5pZHgrKykgeworCisJCQljZnAgPSBzY2FucmVnaW9uLT5DRlAgKyBuZXh0Y2hhbjsKKworCQkJaWYgKHByaXYtPmFkYXB0ZXItPmVuYWJsZTExZCkgeworCQkJCXNjYW50eXBlID0KKwkJCQkgICAgbGliZXJ0YXNfZ2V0X3NjYW5fdHlwZV8xMWQoY2ZwLT5jaGFubmVsLAorCQkJCQkJCSAgICZhZGFwdGVyLT4KKwkJCQkJCQkgICBwYXJzZWRfcmVnaW9uX2NoYW4pOworCQkJfQorCisJCQlzd2l0Y2ggKHNjYW5yZWdpb24tPmJhbmQpIHsKKwkJCWNhc2UgQkFORF9COgorCQkJY2FzZSBCQU5EX0c6CisJCQlkZWZhdWx0OgorCQkJCXNjYW5jaGFubGlzdFtjaGFuaWR4XS5yYWRpb3R5cGUgPQorCQkJCSAgICBjbWRfc2Nhbl9yYWRpb190eXBlX2JnOworCQkJCWJyZWFrOworCQkJfQorCisJCQlpZiAoc2NhbnR5cGUgPT0gY21kX3NjYW5fdHlwZV9wYXNzaXZlKSB7CisJCQkJc2NhbmNoYW5saXN0W2NoYW5pZHhdLm1heHNjYW50aW1lID0KKwkJCQkgICAgY3B1X3RvX2xlMTYKKwkJCQkgICAgKE1SVkRSVl9QQVNTSVZFX1NDQU5fQ0hBTl9USU1FKTsKKwkJCQlzY2FuY2hhbmxpc3RbY2hhbmlkeF0uY2hhbnNjYW5tb2RlLnBhc3NpdmVzY2FuID0KKwkJCQkgICAgMTsKKwkJCX0gZWxzZSB7CisJCQkJc2NhbmNoYW5saXN0W2NoYW5pZHhdLm1heHNjYW50aW1lID0KKwkJCQkgICAgY3B1X3RvX2xlMTYKKwkJCQkgICAgKE1SVkRSVl9BQ1RJVkVfU0NBTl9DSEFOX1RJTUUpOworCQkJCXNjYW5jaGFubGlzdFtjaGFuaWR4XS5jaGFuc2Nhbm1vZGUucGFzc2l2ZXNjYW4gPQorCQkJCSAgICAwOworCQkJfQorCisJCQlzY2FuY2hhbmxpc3RbY2hhbmlkeF0uY2hhbm51bWJlciA9IGNmcC0+Y2hhbm5lbDsKKworCQkJaWYgKGZpbHRlcmVkc2NhbikgeworCQkJCXNjYW5jaGFubGlzdFtjaGFuaWR4XS5jaGFuc2Nhbm1vZGUuCisJCQkJICAgIGRpc2FibGVjaGFuZmlsdCA9IDE7CisJCQl9CisJCX0KKwl9Cit9CisKKy8qKgorICogIEBicmllZiBDb25zdHJ1Y3QgYSB3bGFuX3NjYW5fY21kX2NvbmZpZyBzdHJ1Y3R1cmUgdG8gdXNlIGluIGlzc3VlIHNjYW4gY21kcworICoKKyAqICBBcHBsaWNhdGlvbiBsYXllciBvciBvdGhlciBmdW5jdGlvbnMgY2FuIGludm9rZSB3bGFuX3NjYW5fbmV0d29ya3MKKyAqICAgIHdpdGggYSBzY2FuIGNvbmZpZ3VyYXRpb24gc3VwcGxpZWQgaW4gYSB3bGFuX2lvY3RsX3VzZXJfc2Nhbl9jZmcgc3RydWN0LgorICogICAgVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBhcyB0aGUgYmFzaXMgb2Ygb25lIG9yIG1hbnkgd2xhbl9zY2FuX2NtZF9jb25maWcKKyAqICAgIGNvbW1hbmRzIHRoYXQgYXJlIHNlbnQgdG8gdGhlIGNvbW1hbmQgcHJvY2Vzc2luZyBtb2R1bGUgYW5kIHNlbnQgdG8KKyAqICAgIGZpcm13YXJlLgorICoKKyAqICBDcmVhdGUgYSB3bGFuX3NjYW5fY21kX2NvbmZpZyBiYXNlZCBvbiB0aGUgZm9sbG93aW5nIHVzZXIgc3VwcGxpZWQKKyAqICAgIHBhcmFtZXRlcnMgKGlmIHByZXNlbnQpOgorICogICAgICAgICAgICAgLSBTU0lEIGZpbHRlcgorICogICAgICAgICAgICAgLSBCU1NJRCBmaWx0ZXIKKyAqICAgICAgICAgICAgIC0gTnVtYmVyIG9mIFByb2JlcyB0byBiZSBzZW50CisgKiAgICAgICAgICAgICAtIGNoYW5uZWwgbGlzdAorICoKKyAqICBJZiB0aGUgU1NJRCBvciBCU1NJRCBmaWx0ZXIgaXMgbm90IHByZXNlbnQsIGRpc2FibGUvY2xlYXIgdGhlIGZpbHRlci4KKyAqICBJZiB0aGUgbnVtYmVyIG9mIHByb2JlcyBpcyBub3Qgc2V0LCB1c2UgdGhlIGFkYXB0ZXIgZGVmYXVsdCBzZXR0aW5nCisgKiAgUXVhbGlmeSB0aGUgY2hhbm5lbAorICoKKyAqICBAcGFyYW0gcHJpdiAgICAgICAgICAgICBBIHBvaW50ZXIgdG8gd2xhbl9wcml2YXRlIHN0cnVjdHVyZQorICogIEBwYXJhbSBwdXNlcnNjYW5pbiAgICAgIE5VTEwgb3IgcG9pbnRlciB0byBzY2FuIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycworICogIEBwYXJhbSBwcGNoYW50bHZvdXQgICAgIE91dHB1dCBwYXJhbWV0ZXI6IFBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwgVExWIHBvcnRpb24gb2YgdGhlIG91dHB1dCBzY2FuIGNvbmZpZworICogIEBwYXJhbSBwc2NhbmNoYW5saXN0ICAgIE91dHB1dCBwYXJhbWV0ZXI6IFBvaW50ZXIgdG8gdGhlIHJlc3VsdGluZyBjaGFubmVsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdCB0byBzY2FuCisgKiAgQHBhcmFtIHBtYXhjaGFucGVyc2NhbiAgT3V0cHV0IHBhcmFtZXRlcjogTnVtYmVyIG9mIGNoYW5uZWxzIHRvIHNjYW4gZm9yCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgZWFjaCBpc3N1YW5jZSBvZiB0aGUgZmlybXdhcmUgc2NhbiBjb21tYW5kCisgKiAgQHBhcmFtIHBmaWx0ZXJlZHNjYW4gICAgT3V0cHV0IHBhcmFtZXRlcjogRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYSBCU1NJRCBvciBTU0lEIGZpbHRlciBpcyBiZWluZyBzZW50IGluIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQgdG8gZmlybXdhcmUuICBVc2VkIHRvIGluY3JlYXNlIHRoZSBudW1iZXIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBvZiBjaGFubmVscyBzZW50IGluIGEgc2NhbiBjb21tYW5kIGFuZCB0bworICogICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGUgdGhlIGZpcm13YXJlIGNoYW5uZWwgc2NhbiBmaWx0ZXIuCisgKiAgQHBhcmFtIHBzY2FuY3VycmVudG9ubHkgT3V0cHV0IHBhcmFtZXRlcjogRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgd2UgYXJlIG9ubHkgc2Nhbm5pbmcgb3VyIGN1cnJlbnQgYWN0aXZlIGNoYW5uZWwKKyAqCisgKiAgQHJldHVybiAgICAgICAgICAgICAgICAgcmVzdWx0aW5nIHNjYW4gY29uZmlndXJhdGlvbgorICovCitzdGF0aWMgc3RydWN0IHdsYW5fc2Nhbl9jbWRfY29uZmlnICoKK3dsYW5fc2Nhbl9zZXR1cF9zY2FuX2NvbmZpZyh3bGFuX3ByaXZhdGUgKiBwcml2LAorCQkJICAgIGNvbnN0IHN0cnVjdCB3bGFuX2lvY3RsX3VzZXJfc2Nhbl9jZmcgKiBwdXNlcnNjYW5pbiwKKwkJCSAgICBzdHJ1Y3QgbXJ2bGlldHlwZXNfY2hhbmxpc3RwYXJhbXNldCAqKiBwcGNoYW50bHZvdXQsCisJCQkgICAgc3RydWN0IGNoYW5zY2FucGFyYW1zZXQgKiBwc2NhbmNoYW5saXN0LAorCQkJICAgIGludCAqcG1heGNoYW5wZXJzY2FuLAorCQkJICAgIHU4ICogcGZpbHRlcmVkc2NhbiwKKwkJCSAgICB1OCAqIHBzY2FuY3VycmVudG9ubHkpCit7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwljb25zdCB1OCB6ZXJvbWFjW0VUSF9BTEVOXSA9IHsgMCwgMCwgMCwgMCwgMCwgMCB9OworCXN0cnVjdCBtcnZsaWV0eXBlc19udW1wcm9iZXMgKnBudW1wcm9iZXN0bHY7CisJc3RydWN0IG1ydmxpZXR5cGVzX3NzaWRwYXJhbXNldCAqcHNzaWR0bHY7CisJc3RydWN0IHdsYW5fc2Nhbl9jbWRfY29uZmlnICogcHNjYW5jZmdvdXQgPSBOVUxMOworCXU4ICpwdGx2cG9zOworCXUxNiBudW1wcm9iZXM7CisJdTE2IHNzaWRsZW47CisJaW50IGNoYW5pZHg7CisJaW50IHNjYW50eXBlOworCWludCBzY2FuZHVyOworCWludCBjaGFubmVsOworCWludCByYWRpb3R5cGU7CisKKwlwc2NhbmNmZ291dCA9IGt6YWxsb2MoTUFYX1NDQU5fQ0ZHX0FMTE9DLCBHRlBfS0VSTkVMKTsKKwlpZiAocHNjYW5jZmdvdXQgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisKKwkvKiBUaGUgdGx2YnVmZmVybGVuIGlzIGNhbGN1bGF0ZWQgZm9yIGVhY2ggc2NhbiBjb21tYW5kLiAgVGhlIFRMVnMgYWRkZWQKKwkgKiAgIGluIHRoaXMgcm91dGluZSB3aWxsIGJlIHByZXNlcnZlZCBzaW5jZSB0aGUgcm91dGluZSB0aGF0IHNlbmRzCisJICogICB0aGUgY29tbWFuZCB3aWxsIGFwcGVuZCBjaGFubmVsVExWcyBhdCAqcHBjaGFudGx2b3V0LiAgVGhlIGRpZmZlcmVuY2UKKwkgKiAgIGJldHdlZW4gdGhlICpwcGNoYW50bHZvdXQgYW5kIHRoZSB0bHZidWZmZXIgc3RhcnQgd2lsbCBiZSB1c2VkCisJICogICB0byBjYWxjdWxhdGUgdGhlIHNpemUgb2YgYW55dGhpbmcgd2UgYWRkIGluIHRoaXMgcm91dGluZS4KKwkgKi8KKwlwc2NhbmNmZ291dC0+dGx2YnVmZmVybGVuID0gMDsKKworCS8qIFJ1bm5pbmcgdGx2IHBvaW50ZXIuICBBc3NpZ25lZCB0byBwcGNoYW50bHZvdXQgYXQgZW5kIG9mIGZ1bmN0aW9uCisJICogIHNvIGxhdGVyIHJvdXRpbmVzIGtub3cgd2hlcmUgY2hhbm5lbHMgY2FuIGJlIGFkZGVkIHRvIHRoZSBjb21tYW5kIGJ1ZgorCSAqLworCXB0bHZwb3MgPSBwc2NhbmNmZ291dC0+dGx2YnVmZmVyOworCisJLyoKKwkgKiBTZXQgdGhlIGluaXRpYWwgc2NhbiBwYXJhbXRlcnMgZm9yIHByb2dyZXNzaXZlIHNjYW5uaW5nLiAgSWYgYSBzcGVjaWZpYworCSAqICAgQlNTSUQgb3IgU1NJRCBpcyB1c2VkLCB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIGluIHRoZSBzY2FuIGNvbW1hbmQKKwkgKiAgIHdpbGwgYmUgaW5jcmVhc2VkIHRvIHRoZSBhYnNvbHV0ZSBtYXhpbXVtCisJICovCisJKnBtYXhjaGFucGVyc2NhbiA9IE1SVkRSVl9DSEFOTkVMU19QRVJfU0NBTl9DTUQ7CisKKwkvKiBJbml0aWFsaXplIHRoZSBzY2FuIGFzIHVuLWZpbHRlcmVkIGJ5IGZpcm13YXJlLCBzZXQgdG8gVFJVRSBiZWxvdyBpZgorCSAqICAgYSBTU0lEIG9yIEJTU0lEIGZpbHRlciBpcyBzZW50IGluIHRoZSBjb21tYW5kCisJICovCisJKnBmaWx0ZXJlZHNjYW4gPSAwOworCisJLyogSW5pdGlhbGl6ZSB0aGUgc2NhbiBhcyBub3QgYmVpbmcgb25seSBvbiB0aGUgY3VycmVudCBjaGFubmVsLiAgSWYKKwkgKiAgIHRoZSBjaGFubmVsIGxpc3QgaXMgY3VzdG9taXplZCwgb25seSBjb250YWlucyBvbmUgY2hhbm5lbCwgYW5kCisJICogICBpcyB0aGUgYWN0aXZlIGNoYW5uZWwsIHRoaXMgaXMgc2V0IHRydWUgYW5kIGRhdGEgZmxvdyBpcyBub3QgaGFsdGVkLgorCSAqLworCSpwc2NhbmN1cnJlbnRvbmx5ID0gMDsKKworCWlmIChwdXNlcnNjYW5pbikgeworCisJCS8qIFNldCB0aGUgYnNzIHR5cGUgc2NhbiBmaWx0ZXIsIHVzZSBhZGFwdGVyIHNldHRpbmcgaWYgdW5zZXQgKi8KKwkJcHNjYW5jZmdvdXQtPmJzc3R5cGUgPQorCQkgICAgKHB1c2Vyc2NhbmluLT5ic3N0eXBlID8gcHVzZXJzY2FuaW4tPmJzc3R5cGUgOiBhZGFwdGVyLT4KKwkJICAgICBzY2FubW9kZSk7CisKKwkJLyogU2V0IHRoZSBudW1iZXIgb2YgcHJvYmVzIHRvIHNlbmQsIHVzZSBhZGFwdGVyIHNldHRpbmcgaWYgdW5zZXQgKi8KKwkJbnVtcHJvYmVzID0gKHB1c2Vyc2NhbmluLT5udW1wcm9iZXMgPyBwdXNlcnNjYW5pbi0+bnVtcHJvYmVzIDoKKwkJCSAgICAgYWRhcHRlci0+c2NhbnByb2Jlcyk7CisKKwkJLyoKKwkJICogU2V0IHRoZSBCU1NJRCBmaWx0ZXIgdG8gdGhlIGluY29taW5nIGNvbmZpZ3VyYXRpb24sCisJCSAqICAgaWYgbm9uLXplcm8uICBJZiBub3Qgc2V0LCBpdCB3aWxsIHJlbWFpbiBkaXNhYmxlZCAoYWxsIHplcm9zKS4KKwkJICovCisJCW1lbWNweShwc2NhbmNmZ291dC0+c3BlY2lmaWNCU1NJRCwKKwkJICAgICAgIHB1c2Vyc2NhbmluLT5zcGVjaWZpY0JTU0lELAorCQkgICAgICAgc2l6ZW9mKHBzY2FuY2Znb3V0LT5zcGVjaWZpY0JTU0lEKSk7CisKKwkJc3NpZGxlbiA9IHN0cmxlbihwdXNlcnNjYW5pbi0+c3BlY2lmaWNTU0lEKTsKKworCQlpZiAoc3NpZGxlbikgeworCQkJcHNzaWR0bHYgPQorCQkJICAgIChzdHJ1Y3QgbXJ2bGlldHlwZXNfc3NpZHBhcmFtc2V0ICopIHBzY2FuY2Znb3V0LT4KKwkJCSAgICB0bHZidWZmZXI7CisJCQlwc3NpZHRsdi0+aGVhZGVyLnR5cGUgPSBjcHVfdG9fbGUxNihUTFZfVFlQRV9TU0lEKTsKKwkJCXBzc2lkdGx2LT5oZWFkZXIubGVuID0gY3B1X3RvX2xlMTYoc3NpZGxlbik7CisJCQltZW1jcHkocHNzaWR0bHYtPnNzaWQsIHB1c2Vyc2NhbmluLT5zcGVjaWZpY1NTSUQsCisJCQkgICAgICAgc3NpZGxlbik7CisJCQlwdGx2cG9zICs9IHNpemVvZihwc3NpZHRsdi0+aGVhZGVyKSArIHNzaWRsZW47CisJCX0KKworCQkvKgorCQkgKiAgVGhlIGRlZmF1bHQgbnVtYmVyIG9mIGNoYW5uZWxzIHNlbnQgaW4gdGhlIGNvbW1hbmQgaXMgbG93IHRvCisJCSAqICAgIGVuc3VyZSB0aGUgcmVzcG9uc2UgYnVmZmVyIGZyb20gdGhlIGZpcm13YXJlIGRvZXMgbm90IHRydW5jYXRlCisJCSAqICAgIHNjYW4gcmVzdWx0cy4gIFRoYXQgaXMgbm90IGFuIGlzc3VlIHdpdGggYW4gU1NJRCBvciBCU1NJRAorCQkgKiAgICBmaWx0ZXIgYXBwbGllZCB0byB0aGUgc2NhbiByZXN1bHRzIGluIHRoZSBmaXJtd2FyZS4KKwkJICovCisJCWlmIChzc2lkbGVuIHx8IChtZW1jbXAocHNjYW5jZmdvdXQtPnNwZWNpZmljQlNTSUQsCisJCQkJICAgICAgICZ6ZXJvbWFjLCBzaXplb2YoemVyb21hYykpICE9IDApKSB7CisJCQkqcG1heGNoYW5wZXJzY2FuID0gTVJWRFJWX01BWF9DSEFOTkVMU19QRVJfU0NBTjsKKwkJCSpwZmlsdGVyZWRzY2FuID0gMTsKKwkJfQorCX0gZWxzZSB7CisJCXBzY2FuY2Znb3V0LT5ic3N0eXBlID0gYWRhcHRlci0+c2Nhbm1vZGU7CisJCW51bXByb2JlcyA9IGFkYXB0ZXItPnNjYW5wcm9iZXM7CisJfQorCisJLyogSWYgdGhlIGlucHV0IGNvbmZpZyBvciBhZGFwdGVyIGhhcyB0aGUgbnVtYmVyIG9mIFByb2JlcyBzZXQsIGFkZCB0bHYgKi8KKwlpZiAobnVtcHJvYmVzKSB7CisJCXBudW1wcm9iZXN0bHYgPSAoc3RydWN0IG1ydmxpZXR5cGVzX251bXByb2JlcyAqKSBwdGx2cG9zOworCQlwbnVtcHJvYmVzdGx2LT5oZWFkZXIudHlwZSA9CisJCSAgICBjcHVfdG9fbGUxNihUTFZfVFlQRV9OVU1QUk9CRVMpOworCQlwbnVtcHJvYmVzdGx2LT5oZWFkZXIubGVuID0gc2l6ZW9mKHBudW1wcm9iZXN0bHYtPm51bXByb2Jlcyk7CisJCXBudW1wcm9iZXN0bHYtPm51bXByb2JlcyA9IGNwdV90b19sZTE2KG51bXByb2Jlcyk7CisKKwkJcHRsdnBvcyArPQorCQkgICAgc2l6ZW9mKHBudW1wcm9iZXN0bHYtPmhlYWRlcikgKyBwbnVtcHJvYmVzdGx2LT5oZWFkZXIubGVuOworCisJCXBudW1wcm9iZXN0bHYtPmhlYWRlci5sZW4gPQorCQkgICAgY3B1X3RvX2xlMTYocG51bXByb2Jlc3Rsdi0+aGVhZGVyLmxlbik7CisJfQorCisJLyoKKwkgKiBTZXQgdGhlIG91dHB1dCBmb3IgdGhlIGNoYW5uZWwgVExWIHRvIHRoZSBhZGRyZXNzIGluIHRoZSB0bHYgYnVmZmVyCisJICogICBwYXN0IGFueSBUTFZzIHRoYXQgd2VyZSBhZGRlZCBpbiB0aGlzIGZ1Y3Rpb24gKFNTSUQsIG51bXByb2JlcykuCisJICogICBjaGFubmVsIFRMVnMgd2lsbCBiZSBhZGRlZCBwYXN0IHRoaXMgZm9yIGVhY2ggc2NhbiBjb21tYW5kLCBwcmVzZXJ2aW5nCisJICogICB0aGUgVExWcyB0aGF0IHdlcmUgcHJldmlvdXNseSBhZGRlZC4KKwkgKi8KKwkqcHBjaGFudGx2b3V0ID0gKHN0cnVjdCBtcnZsaWV0eXBlc19jaGFubGlzdHBhcmFtc2V0ICopIHB0bHZwb3M7CisKKwlpZiAocHVzZXJzY2FuaW4gJiYgcHVzZXJzY2FuaW4tPmNoYW5saXN0WzBdLmNoYW5udW1iZXIpIHsKKworCQlsYnNfcHJfZGVidWcoMSwgIlNjYW46IFVzaW5nIHN1cHBsaWVkIGNoYW5uZWwgbGlzdFxuIik7CisKKwkJZm9yIChjaGFuaWR4ID0gMDsKKwkJICAgICBjaGFuaWR4IDwgV0xBTl9JT0NUTF9VU0VSX1NDQU5fQ0hBTl9NQVgKKwkJICAgICAmJiBwdXNlcnNjYW5pbi0+Y2hhbmxpc3RbY2hhbmlkeF0uY2hhbm51bWJlcjsgY2hhbmlkeCsrKSB7CisKKwkJCWNoYW5uZWwgPSBwdXNlcnNjYW5pbi0+Y2hhbmxpc3RbY2hhbmlkeF0uY2hhbm51bWJlcjsKKwkJCShwc2NhbmNoYW5saXN0ICsgY2hhbmlkeCktPmNoYW5udW1iZXIgPSBjaGFubmVsOworCisJCQlyYWRpb3R5cGUgPSBwdXNlcnNjYW5pbi0+Y2hhbmxpc3RbY2hhbmlkeF0ucmFkaW90eXBlOworCQkJKHBzY2FuY2hhbmxpc3QgKyBjaGFuaWR4KS0+cmFkaW90eXBlID0gcmFkaW90eXBlOworCisJCQlzY2FudHlwZSA9IHB1c2Vyc2NhbmluLT5jaGFubGlzdFtjaGFuaWR4XS5zY2FudHlwZTsKKworCQkJaWYgKHNjYW50eXBlID09IGNtZF9zY2FuX3R5cGVfcGFzc2l2ZSkgeworCQkJCShwc2NhbmNoYW5saXN0ICsKKwkJCQkgY2hhbmlkeCktPmNoYW5zY2FubW9kZS5wYXNzaXZlc2NhbiA9IDE7CisJCQl9IGVsc2UgeworCQkJCShwc2NhbmNoYW5saXN0ICsKKwkJCQkgY2hhbmlkeCktPmNoYW5zY2FubW9kZS5wYXNzaXZlc2NhbiA9IDA7CisJCQl9CisKKwkJCWlmIChwdXNlcnNjYW5pbi0+Y2hhbmxpc3RbY2hhbmlkeF0uc2NhbnRpbWUpIHsKKwkJCQlzY2FuZHVyID0KKwkJCQkgICAgcHVzZXJzY2FuaW4tPmNoYW5saXN0W2NoYW5pZHhdLnNjYW50aW1lOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoc2NhbnR5cGUgPT0gY21kX3NjYW5fdHlwZV9wYXNzaXZlKSB7CisJCQkJCXNjYW5kdXIgPSBNUlZEUlZfUEFTU0lWRV9TQ0FOX0NIQU5fVElNRTsKKwkJCQl9IGVsc2UgeworCQkJCQlzY2FuZHVyID0gTVJWRFJWX0FDVElWRV9TQ0FOX0NIQU5fVElNRTsKKwkJCQl9CisJCQl9CisKKwkJCShwc2NhbmNoYW5saXN0ICsgY2hhbmlkeCktPm1pbnNjYW50aW1lID0KKwkJCSAgICBjcHVfdG9fbGUxNihzY2FuZHVyKTsKKwkJCShwc2NhbmNoYW5saXN0ICsgY2hhbmlkeCktPm1heHNjYW50aW1lID0KKwkJCSAgICBjcHVfdG9fbGUxNihzY2FuZHVyKTsKKwkJfQorCisJCS8qIENoZWNrIGlmIHdlIGFyZSBvbmx5IHNjYW5uaW5nIHRoZSBjdXJyZW50IGNoYW5uZWwgKi8KKwkJaWYgKChjaGFuaWR4ID09IDEpICYmIChwdXNlcnNjYW5pbi0+Y2hhbmxpc3RbMF0uY2hhbm51bWJlcgorCQkJCSAgICAgICA9PQorCQkJCSAgICAgICBwcml2LT5hZGFwdGVyLT5jdXJic3NwYXJhbXMuY2hhbm5lbCkpIHsKKwkJCSpwc2NhbmN1cnJlbnRvbmx5ID0gMTsKKwkJCWxic19wcl9kZWJ1ZygxLCAiU2NhbjogU2Nhbm5pbmcgY3VycmVudCBjaGFubmVsIG9ubHkiKTsKKwkJfQorCisJfSBlbHNlIHsKKwkJbGJzX3ByX2RlYnVnKDEsICJTY2FuOiBDcmVhdGluZyBmdWxsIHJlZ2lvbiBjaGFubmVsIGxpc3RcbiIpOworCQl3bGFuX3NjYW5fY3JlYXRlX2NoYW5uZWxfbGlzdChwcml2LCBwc2NhbmNoYW5saXN0LAorCQkJCQkgICAgICAqcGZpbHRlcmVkc2Nhbik7CisJfQorCitvdXQ6CisJcmV0dXJuIHBzY2FuY2Znb3V0OworfQorCisvKioKKyAqICBAYnJpZWYgQ29uc3RydWN0IGFuZCBzZW5kIG11bHRpcGxlIHNjYW4gY29uZmlnIGNvbW1hbmRzIHRvIHRoZSBmaXJtd2FyZQorICoKKyAqICBQcmV2aW91cyByb3V0aW5lcyBoYXZlIGNyZWF0ZWQgYSB3bGFuX3NjYW5fY21kX2NvbmZpZyB3aXRoIGFueSByZXF1ZXN0ZWQKKyAqICAgVExWcy4gIFRoaXMgZnVuY3Rpb24gc3BsaXRzIHRoZSBjaGFubmVsIFRMViBpbnRvIG1heGNoYW5wZXJzY2FuIGxpc3RzCisgKiAgIGFuZCBzZW5kcyB0aGUgcG9ydGlvbiBvZiB0aGUgY2hhbm5lbCBUTFYgYWxvbmcgd2l0aCB0aGUgb3RoZXIgVExWcworICogICB0byB0aGUgd2xhbl9jbWQgcm91dGluZXMgZm9yIGV4ZWN1dGlvbiBpbiB0aGUgZmlybXdhcmUuCisgKgorICogIEBwYXJhbSBwcml2ICAgICAgICAgICAgQSBwb2ludGVyIHRvIHdsYW5fcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqICBAcGFyYW0gbWF4Y2hhbnBlcnNjYW4gIE1heGltdW0gbnVtYmVyIGNoYW5uZWxzIHRvIGJlIGluY2x1ZGVkIGluIGVhY2gKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW4gY29tbWFuZCBzZW50IHRvIGZpcm13YXJlCisgKiAgQHBhcmFtIGZpbHRlcmVkc2NhbiAgICBGbGFnIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgYSBCU1NJRCBvciBTU0lECisgKiAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIgaXMgYmVpbmcgdXNlZCBmb3IgdGhlIGZpcm13YXJlIGNvbW1hbmQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW4gY29tbWFuZCBzZW50IHRvIGZpcm13YXJlCisgKiAgQHBhcmFtIHBzY2FuY2Znb3V0ICAgICBTY2FuIGNvbmZpZ3VyYXRpb24gdXNlZCBmb3IgdGhpcyBzY2FuLgorICogIEBwYXJhbSBwY2hhbnRsdm91dCAgICAgUG9pbnRlciBpbiB0aGUgcHNjYW5jZmdvdXQgd2hlcmUgdGhlIGNoYW5uZWwgVExWCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgc3RhcnQuICBUaGlzIGlzIHBhc3QgYW55IG90aGVyIFRMVnMgdGhhdAorICogICAgICAgICAgICAgICAgICAgICAgICAgbXVzdCBiZSBzZW50IGRvd24gaW4gZWFjaCBmaXJtd2FyZSBjb21tYW5kLgorICogIEBwYXJhbSBwc2NhbmNoYW5saXN0ICAgTGlzdCBvZiBjaGFubmVscyB0byBzY2FuIGluIG1heGNoYW5wZXJzY2FuIHNlZ21lbnRzCisgKgorICogIEByZXR1cm4gICAgICAgICAgICAgICAgMCBvciBlcnJvciByZXR1cm4gb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbnQgd2xhbl9zY2FuX2NoYW5uZWxfbGlzdCh3bGFuX3ByaXZhdGUgKiBwcml2LAorCQkJCSAgaW50IG1heGNoYW5wZXJzY2FuLAorCQkJCSAgdTggZmlsdGVyZWRzY2FuLAorCQkJCSAgc3RydWN0IHdsYW5fc2Nhbl9jbWRfY29uZmlnICogcHNjYW5jZmdvdXQsCisJCQkJICBzdHJ1Y3QgbXJ2bGlldHlwZXNfY2hhbmxpc3RwYXJhbXNldCAqIHBjaGFudGx2b3V0LAorCQkJCSAgc3RydWN0IGNoYW5zY2FucGFyYW1zZXQgKiBwc2NhbmNoYW5saXN0KQoreworCXN0cnVjdCBjaGFuc2NhbnBhcmFtc2V0ICpwdG1wY2hhbjsKKwlzdHJ1Y3QgY2hhbnNjYW5wYXJhbXNldCAqcHN0YXJ0Y2hhbjsKKwl1OCBzY2FuYmFuZDsKKwlpbnQgZG9uZWVhcmx5OworCWludCB0bHZpZHg7CisJaW50IHJldCA9IDA7CisKKwlFTlRFUigpOworCisJaWYgKHBzY2FuY2Znb3V0ID09IDAgfHwgcGNoYW50bHZvdXQgPT0gMCB8fCBwc2NhbmNoYW5saXN0ID09IDApIHsKKwkJbGJzX3ByX2RlYnVnKDEsICJTY2FuOiBOdWxsIGRldGVjdDogJXAsICVwLCAlcFxuIiwKKwkJICAgICAgIHBzY2FuY2Znb3V0LCBwY2hhbnRsdm91dCwgcHNjYW5jaGFubGlzdCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlwY2hhbnRsdm91dC0+aGVhZGVyLnR5cGUgPSBjcHVfdG9fbGUxNihUTFZfVFlQRV9DSEFOTElTVCk7CisKKwkvKiBTZXQgdGhlIHRlbXAgY2hhbm5lbCBzdHJ1Y3QgcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIGRlc2lyZWQgbGlzdCAqLworCXB0bXBjaGFuID0gcHNjYW5jaGFubGlzdDsKKworCS8qIExvb3AgdGhyb3VnaCB0aGUgZGVzaXJlZCBjaGFubmVsIGxpc3QsIHNlbmRpbmcgYSBuZXcgZmlybXdhcmUgc2NhbgorCSAqICAgY29tbWFuZHMgZm9yIGVhY2ggbWF4Y2hhbnBlcnNjYW4gY2hhbm5lbHMgKG9yIGZvciAxLDYsMTEgaW5kaXZpZHVhbGx5CisJICogICBpZiBjb25maWd1cmVkIGFjY29yZGluZ2x5KQorCSAqLworCXdoaWxlIChwdG1wY2hhbi0+Y2hhbm51bWJlcikgeworCisJCXRsdmlkeCA9IDA7CisJCXBjaGFudGx2b3V0LT5oZWFkZXIubGVuID0gMDsKKwkJc2NhbmJhbmQgPSBwdG1wY2hhbi0+cmFkaW90eXBlOworCQlwc3RhcnRjaGFuID0gcHRtcGNoYW47CisJCWRvbmVlYXJseSA9IDA7CisKKwkJLyogQ29uc3RydWN0IHRoZSBjaGFubmVsIFRMViBmb3IgdGhlIHNjYW4gY29tbWFuZC4gIENvbnRpbnVlIHRvCisJCSAqICBpbnNlcnQgY2hhbm5lbCBUTFZzIHVudGlsOgorCQkgKiAgICAtIHRoZSB0bHZpZHggaGl0cyB0aGUgbWF4aW11bSBjb25maWd1cmVkIHBlciBzY2FuIGNvbW1hbmQKKwkJICogICAgLSB0aGUgbmV4dCBjaGFubmVsIHRvIGluc2VydCBpcyAwIChlbmQgb2YgZGVzaXJlZCBjaGFubmVsIGxpc3QpCisJCSAqICAgIC0gZG9uZWVhcmx5IGlzIHNldCAoY29udHJvbGxpbmcgaW5kaXZpZHVhbCBzY2FubmluZyBvZiAxLDYsMTEpCisJCSAqLworCQl3aGlsZSAodGx2aWR4IDwgbWF4Y2hhbnBlcnNjYW4gJiYgcHRtcGNoYW4tPmNoYW5udW1iZXIKKwkJICAgICAgICYmICFkb25lZWFybHkpIHsKKworICAgICAgICAgICAgbGJzX3ByX2RlYnVnKDEsCisgICAgICAgICAgICAgICAgICAgICJTY2FuOiBDaGFuKCUzZCksIFJhZGlvKCVkKSwgbW9kZSglZCwlZCksIER1ciglZClcbiIsCisgICAgICAgICAgICAgICAgcHRtcGNoYW4tPmNoYW5udW1iZXIsIHB0bXBjaGFuLT5yYWRpb3R5cGUsCisgICAgICAgICAgICAgICAgcHRtcGNoYW4tPmNoYW5zY2FubW9kZS5wYXNzaXZlc2NhbiwKKyAgICAgICAgICAgICAgICBwdG1wY2hhbi0+Y2hhbnNjYW5tb2RlLmRpc2FibGVjaGFuZmlsdCwKKyAgICAgICAgICAgICAgICBwdG1wY2hhbi0+bWF4c2NhbnRpbWUpOworCisJCQkvKiBDb3B5IHRoZSBjdXJyZW50IGNoYW5uZWwgVExWIHRvIHRoZSBjb21tYW5kIGJlaW5nIHByZXBhcmVkICovCisJCQltZW1jcHkocGNoYW50bHZvdXQtPmNoYW5zY2FucGFyYW0gKyB0bHZpZHgsCisJCQkgICAgICAgcHRtcGNoYW4sIHNpemVvZihwY2hhbnRsdm91dC0+Y2hhbnNjYW5wYXJhbSkpOworCisJCQkvKiBJbmNyZW1lbnQgdGhlIFRMViBoZWFkZXIgbGVuZ3RoIGJ5IHRoZSBzaXplIGFwcGVuZGVkICovCisJCQlwY2hhbnRsdm91dC0+aGVhZGVyLmxlbiArPQorCQkJICAgIHNpemVvZihwY2hhbnRsdm91dC0+Y2hhbnNjYW5wYXJhbSk7CisKKwkJCS8qCisJCQkgKiAgVGhlIHRsdiBidWZmZXIgbGVuZ3RoIGlzIHNldCB0byB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9mIHRoZQorCQkJICogICAgYmV0d2VlbiB0aGUgY2hhbm5lbCB0bHYgcG9pbnRlciBhbmQgdGhlIHN0YXJ0IG9mIHRoZQorCQkJICogICAgdGx2IGJ1ZmZlci4gIFRoaXMgY29tcGVuc2F0ZXMgZm9yIGFueSBUTFZzIHRoYXQgd2VyZSBhcHBlbmRlZAorCQkJICogICAgYmVmb3JlIHRoZSBjaGFubmVsIGxpc3QuCisJCQkgKi8KKwkJCXBzY2FuY2Znb3V0LT50bHZidWZmZXJsZW4gPSAoKHU4ICopIHBjaGFudGx2b3V0CisJCQkJCQkgICAgIC0gcHNjYW5jZmdvdXQtPnRsdmJ1ZmZlcik7CisKKwkJCS8qICBBZGQgdGhlIHNpemUgb2YgdGhlIGNoYW5uZWwgdGx2IGhlYWRlciBhbmQgdGhlIGRhdGEgbGVuZ3RoICovCisJCQlwc2NhbmNmZ291dC0+dGx2YnVmZmVybGVuICs9CisJCQkgICAgKHNpemVvZihwY2hhbnRsdm91dC0+aGVhZGVyKQorCQkJICAgICArIHBjaGFudGx2b3V0LT5oZWFkZXIubGVuKTsKKworCQkJLyogSW5jcmVtZW50IHRoZSBpbmRleCB0byB0aGUgY2hhbm5lbCB0bHYgd2UgYXJlIGNvbnN0cnVjdGluZyAqLworCQkJdGx2aWR4Kys7CisKKwkJCWRvbmVlYXJseSA9IDA7CisKKwkJCS8qIFN0b3AgdGhlIGxvb3AgaWYgdGhlICpjdXJyZW50KiBjaGFubmVsIGlzIGluIHRoZSAxLDYsMTEgc2V0CisJCQkgKiAgIGFuZCB3ZSBhcmUgbm90IGZpbHRlcmluZyBvbiBhIEJTU0lEIG9yIFNTSUQuCisJCQkgKi8KKwkJCWlmICghZmlsdGVyZWRzY2FuICYmIChwdG1wY2hhbi0+Y2hhbm51bWJlciA9PSAxCisJCQkJCSAgICAgIHx8IHB0bXBjaGFuLT5jaGFubnVtYmVyID09IDYKKwkJCQkJICAgICAgfHwgcHRtcGNoYW4tPmNoYW5udW1iZXIgPT0gMTEpKSB7CisJCQkJZG9uZWVhcmx5ID0gMTsKKwkJCX0KKworCQkJLyogSW5jcmVtZW50IHRoZSB0bXAgcG9pbnRlciB0byB0aGUgbmV4dCBjaGFubmVsIHRvIGJlIHNjYW5uZWQgKi8KKwkJCXB0bXBjaGFuKys7CisKKwkJCS8qIFN0b3AgdGhlIGxvb3AgaWYgdGhlICpuZXh0KiBjaGFubmVsIGlzIGluIHRoZSAxLDYsMTEgc2V0LgorCQkJICogIFRoaXMgd2lsbCBjYXVzZSBpdCB0byBiZSB0aGUgb25seSBjaGFubmVsIHNjYW5uZWQgb24gdGhlIG5leHQKKwkJCSAqICBpbnRlcmF0aW9uCisJCQkgKi8KKwkJCWlmICghZmlsdGVyZWRzY2FuICYmIChwdG1wY2hhbi0+Y2hhbm51bWJlciA9PSAxCisJCQkJCSAgICAgIHx8IHB0bXBjaGFuLT5jaGFubnVtYmVyID09IDYKKwkJCQkJICAgICAgfHwgcHRtcGNoYW4tPmNoYW5udW1iZXIgPT0gMTEpKSB7CisJCQkJZG9uZWVhcmx5ID0gMTsKKwkJCX0KKwkJfQorCisJCS8qIFNlbmQgdGhlIHNjYW4gY29tbWFuZCB0byB0aGUgZmlybXdhcmUgd2l0aCB0aGUgc3BlY2lmaWVkIGNmZyAqLworCQlyZXQgPSBsaWJlcnRhc19wcmVwYXJlX2FuZF9zZW5kX2NvbW1hbmQocHJpdiwgY21kXzgwMl8xMV9zY2FuLCAwLAorCQkJCQkgICAgMCwgMCwgcHNjYW5jZmdvdXQpOworCX0KKworCUxFQVZFKCk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiAgQGJyaWVmIEludGVybmFsIGZ1bmN0aW9uIHVzZWQgdG8gc3RhcnQgYSBzY2FuIGJhc2VkIG9uIGFuIGlucHV0IGNvbmZpZworICoKKyAqICBVc2UgdGhlIGlucHV0IHVzZXIgc2NhbiBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIHdoZW4gcHJvdmlkZWQgaW4KKyAqICAgIG9yZGVyIHRvIHNlbmQgdGhlIGFwcHJvcHJpYXRlIHNjYW4gY29tbWFuZHMgdG8gZmlybXdhcmUgdG8gcG9wdWxhdGUgb3IKKyAqICAgIHVwZGF0ZSB0aGUgaW50ZXJuYWwgZHJpdmVyIHNjYW4gdGFibGUKKyAqCisgKiAgQHBhcmFtIHByaXYgICAgICAgICAgQSBwb2ludGVyIHRvIHdsYW5fcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqICBAcGFyYW0gcHVzZXJzY2FuaW4gICBQb2ludGVyIHRvIHRoZSBpbnB1dCBjb25maWd1cmF0aW9uIGZvciB0aGUgcmVxdWVzdGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgc2Nhbi4KKyAqCisgKiAgQHJldHVybiAgICAgICAgICAgICAgMCBvciA8IDAgaWYgZXJyb3IKKyAqLworaW50IHdsYW5fc2Nhbl9uZXR3b3Jrcyh3bGFuX3ByaXZhdGUgKiBwcml2LAorCQkJICAgICAgY29uc3Qgc3RydWN0IHdsYW5faW9jdGxfdXNlcl9zY2FuX2NmZyAqIHB1c2Vyc2NhbmluKQoreworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJc3RydWN0IG1ydmxpZXR5cGVzX2NoYW5saXN0cGFyYW1zZXQgKnBjaGFudGx2b3V0OworCXN0cnVjdCBjaGFuc2NhbnBhcmFtc2V0ICogc2Nhbl9jaGFuX2xpc3QgPSBOVUxMOworCXN0cnVjdCB3bGFuX3NjYW5fY21kX2NvbmZpZyAqIHNjYW5fY2ZnID0gTlVMTDsKKwl1OCBrZWVwcHJldmlvdXNzY2FuOworCXU4IGZpbHRlcmVkc2NhbjsKKwl1OCBzY2FuY3VycmVudGNoYW5vbmx5OworCWludCBtYXhjaGFucGVyc2NhbjsKKwlpbnQgcmV0OworCisJRU5URVIoKTsKKworCXNjYW5fY2hhbl9saXN0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNoYW5zY2FucGFyYW1zZXQpICoKKwkJCQlXTEFOX0lPQ1RMX1VTRVJfU0NBTl9DSEFOX01BWCwgR0ZQX0tFUk5FTCk7CisJaWYgKHNjYW5fY2hhbl9saXN0ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJc2Nhbl9jZmcgPSB3bGFuX3NjYW5fc2V0dXBfc2Nhbl9jb25maWcocHJpdiwKKwkJCQkJICAgICAgIHB1c2Vyc2NhbmluLAorCQkJCQkgICAgICAgJnBjaGFudGx2b3V0LAorCQkJCQkgICAgICAgc2Nhbl9jaGFuX2xpc3QsCisJCQkJCSAgICAgICAmbWF4Y2hhbnBlcnNjYW4sCisJCQkJCSAgICAgICAmZmlsdGVyZWRzY2FuLAorCQkJCQkgICAgICAgJnNjYW5jdXJyZW50Y2hhbm9ubHkpOworCWlmIChzY2FuX2NmZyA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCWtlZXBwcmV2aW91c3NjYW4gPSAwOworCisJaWYgKHB1c2Vyc2NhbmluKSB7CisJCWtlZXBwcmV2aW91c3NjYW4gPSBwdXNlcnNjYW5pbi0+a2VlcHByZXZpb3Vzc2NhbjsKKwl9CisKKwlpZiAoIWtlZXBwcmV2aW91c3NjYW4pIHsKKwkJbWVtc2V0KGFkYXB0ZXItPnNjYW50YWJsZSwgMHgwMCwKKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgYnNzX2Rlc2NyaXB0b3IpICogTVJWRFJWX01BWF9CU1NJRF9MSVNUKTsKKwkJYWRhcHRlci0+bnVtaW5zY2FudGFibGUgPSAwOworCX0KKworCS8qIEtlZXAgdGhlIGRhdGEgcGF0aCBhY3RpdmUgaWYgd2UgYXJlIG9ubHkgc2Nhbm5pbmcgb3VyIGN1cnJlbnQgY2hhbm5lbCAqLworCWlmICghc2NhbmN1cnJlbnRjaGFub25seSkgeworCQluZXRpZl9zdG9wX3F1ZXVlKHByaXYtPndsYW5fZGV2Lm5ldGRldik7CisJCW5ldGlmX2NhcnJpZXJfb2ZmKHByaXYtPndsYW5fZGV2Lm5ldGRldik7CisJfQorCisJcmV0ID0gd2xhbl9zY2FuX2NoYW5uZWxfbGlzdChwcml2LAorCQkJCSAgICAgbWF4Y2hhbnBlcnNjYW4sCisJCQkJICAgICBmaWx0ZXJlZHNjYW4sCisJCQkJICAgICBzY2FuX2NmZywKKwkJCQkgICAgIHBjaGFudGx2b3V0LAorCQkJCSAgICAgc2Nhbl9jaGFuX2xpc3QpOworCisJLyogIFByb2Nlc3MgdGhlIHJlc3VsdGluZyBzY2FuIHRhYmxlOgorCSAqICAgIC0gUmVtb3ZlIGFueSBiYWQgc3NpZHMKKwkgKiAgICAtIFVwZGF0ZSBvdXIgY3VycmVudCBCU1MgaW5mb3JtYXRpb24gZnJvbSBzY2FuIGRhdGEKKwkgKi8KKwl3bGFuX3NjYW5fcHJvY2Vzc19yZXN1bHRzKHByaXYpOworCisJaWYgKHByaXYtPmFkYXB0ZXItPmNvbm5lY3Rfc3RhdHVzID09IGxpYmVydGFzX2Nvbm5lY3RlZCkgeworCQluZXRpZl9jYXJyaWVyX29uKHByaXYtPndsYW5fZGV2Lm5ldGRldik7CisJCW5ldGlmX3dha2VfcXVldWUocHJpdi0+d2xhbl9kZXYubmV0ZGV2KTsKKwl9CisKK291dDoKKwlpZiAoc2Nhbl9jZmcpCisJCWtmcmVlKHNjYW5fY2ZnKTsKKworCWlmIChzY2FuX2NoYW5fbGlzdCkKKwkJa2ZyZWUoc2Nhbl9jaGFuX2xpc3QpOworCisJTEVBVkUoKTsKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqICBAYnJpZWYgSW5zcGVjdCB0aGUgc2NhbiByZXNwb25zZSBidWZmZXIgZm9yIHBvaW50ZXJzIHRvIGV4cGVjdGVkIFRMVnMKKyAqCisgKiAgVExWcyBjYW4gYmUgaW5jbHVkZWQgYXQgdGhlIGVuZCBvZiB0aGUgc2NhbiByZXNwb25zZSBCU1MgaW5mb3JtYXRpb24uCisgKiAgICBQYXJzZSB0aGUgZGF0YSBpbiB0aGUgYnVmZmVyIGZvciBwb2ludGVycyB0byBUTFZzIHRoYXQgY2FuIHBvdGVudGlhbGx5CisgKiAgICBiZSBwYXNzZWQgYmFjayBpbiB0aGUgcmVzcG9uc2UKKyAqCisgKiAgQHBhcmFtIHB0bHYgICAgICAgIFBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBUTFYgYnVmZmVyIHRvIHBhcnNlCisgKiAgQHBhcmFtIHRsdmJ1ZnNpemUgIHNpemUgb2YgdGhlIFRMViBidWZmZXIKKyAqICBAcGFyYW0gcHRzZnRsdiAgICAgT3V0cHV0IHBhcmFtZXRlcjogUG9pbnRlciB0byB0aGUgVFNGIFRMViBpZiBmb3VuZAorICoKKyAqICBAcmV0dXJuICAgICAgICAgICAgdm9pZAorICovCitzdGF0aWMKK3ZvaWQgd2xhbl9yZXRfODAyXzExX3NjYW5fZ2V0X3Rsdl9wdHJzKHN0cnVjdCBtcnZsaWV0eXBlc19kYXRhICogcHRsdiwKKwkJCQkgICAgICAgaW50IHRsdmJ1ZnNpemUsCisJCQkJICAgICAgIHN0cnVjdCBtcnZsaWV0eXBlc190c2Z0aW1lc3RhbXAgKiogcHRzZnRsdikKK3sKKwlzdHJ1Y3QgbXJ2bGlldHlwZXNfZGF0YSAqcGN1cnJlbnR0bHY7CisJaW50IHRsdmJ1ZmxlZnQ7CisJdTE2IHRsdnR5cGU7CisJdTE2IHRsdmxlbjsKKworCXBjdXJyZW50dGx2ID0gcHRsdjsKKwl0bHZidWZsZWZ0ID0gdGx2YnVmc2l6ZTsKKwkqcHRzZnRsdiA9IE5VTEw7CisKKwlsYnNfcHJfZGVidWcoMSwgIlNDQU5fUkVTUDogdGx2YnVmc2l6ZSA9ICVkXG4iLCB0bHZidWZzaXplKTsKKwlsYnNfZGJnX2hleCgiU0NBTl9SRVNQOiBUTFYgQnVmIiwgKHU4ICopIHB0bHYsIHRsdmJ1ZnNpemUpOworCisJd2hpbGUgKHRsdmJ1ZmxlZnQgPj0gc2l6ZW9mKHN0cnVjdCBtcnZsaWV0eXBlc2hlYWRlcikpIHsKKwkJdGx2dHlwZSA9IGxlMTZfdG9fY3B1KHBjdXJyZW50dGx2LT5oZWFkZXIudHlwZSk7CisJCXRsdmxlbiA9IGxlMTZfdG9fY3B1KHBjdXJyZW50dGx2LT5oZWFkZXIubGVuKTsKKworCQlzd2l0Y2ggKHRsdnR5cGUpIHsKKwkJY2FzZSBUTFZfVFlQRV9UU0ZUSU1FU1RBTVA6CisJCQkqcHRzZnRsdiA9IChzdHJ1Y3QgbXJ2bGlldHlwZXNfdHNmdGltZXN0YW1wICopIHBjdXJyZW50dGx2OworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWxic19wcl9kZWJ1ZygxLCAiU0NBTl9SRVNQOiBVbmhhbmRsZWQgVExWID0gJWRcbiIsCisJCQkgICAgICAgdGx2dHlwZSk7CisJCQkvKiBHaXZlIHVwLCB0aGlzIHNlZW1zIGNvcnJ1cHRlZCAqLworCQkJcmV0dXJuOworCQl9CQkvKiBzd2l0Y2ggKi8KKworCQl0bHZidWZsZWZ0IC09IChzaXplb2YocHRsdi0+aGVhZGVyKSArIHRsdmxlbik7CisJCXBjdXJyZW50dGx2ID0KKwkJICAgIChzdHJ1Y3QgbXJ2bGlldHlwZXNfZGF0YSAqKSAocGN1cnJlbnR0bHYtPkRhdGEgKyB0bHZsZW4pOworCX0JCQkvKiB3aGlsZSAqLworfQorCisvKioKKyAqICBAYnJpZWYgSW50ZXJwcmV0IGEgQlNTIHNjYW4gcmVzcG9uc2UgcmV0dXJuZWQgZnJvbSB0aGUgZmlybXdhcmUKKyAqCisgKiAgUGFyc2UgdGhlIHZhcmlvdXMgZml4ZWQgZmllbGRzIGFuZCBJRXMgcGFzc2VkIGJhY2sgZm9yIGEgYSBCU1MgcHJvYmUKKyAqICAgcmVzcG9uc2Ugb3IgYmVhY29uIGZyb20gdGhlIHNjYW4gY29tbWFuZC4gIFJlY29yZCBpbmZvcm1hdGlvbiBhcyBuZWVkZWQKKyAqICAgaW4gdGhlIHNjYW4gdGFibGUgc3RydWN0IGJzc19kZXNjcmlwdG9yIGZvciB0aGF0IGVudHJ5LgorICoKKyAqICBAcGFyYW0gcEJTU0lERW50cnkgIE91dHB1dCBwYXJhbWV0ZXI6IFBvaW50ZXIgdG8gdGhlIEJTUyBFbnRyeQorICoKKyAqICBAcmV0dXJuICAgICAgICAgICAgIDAgb3IgLTEKKyAqLworc3RhdGljIGludCBJbnRlcnByZXRCU1NEZXNjcmlwdGlvbldpdGhJRShzdHJ1Y3QgYnNzX2Rlc2NyaXB0b3IgKiBwQlNTRW50cnksCisJCQkJCSB1OCAqKiBwYmVhY29uaW5mbywgaW50ICpieXRlc2xlZnQpCit7CisJZW51bSBpZWVldHlwZXNfZWxlbWVudGlkIGVsZW1JRDsKKwlzdHJ1Y3QgaWVlZXR5cGVzX2ZocGFyYW1zZXQgKnBGSDsKKwlzdHJ1Y3QgaWVlZXR5cGVzX2RzcGFyYW1zZXQgKnBEUzsKKwlzdHJ1Y3QgaWVlZXR5cGVzX2NmcGFyYW1zZXQgKnBDRjsKKwlzdHJ1Y3QgaWVlZXR5cGVzX2lic3NwYXJhbXNldCAqcGlic3M7CisJc3RydWN0IGllZWV0eXBlc19jYXBpbmZvICpwY2FwOworCXN0cnVjdCBXTEFOXzgwMl8xMV9GSVhFRF9JRXMgZml4ZWRpZTsKKwl1OCAqcGN1cnJlbnRwdHI7CisJdTggKnBSYXRlOworCXU4IGVsZW1sZW47CisJdTggYnl0ZXN0b2NvcHk7CisJdTggcmF0ZXNpemU7CisJdTE2IGJlYWNvbnNpemU7CisJdTggZm91bmRkYXRhcmF0ZWllOworCWludCBieXRlc2xlZnRmb3JjdXJyZW50YmVhY29uOworCisJc3RydWN0IFdQQV9TVVBQTElDQU5UICpwd3BhX3N1cHBsaWNhbnQ7CisJc3RydWN0IFdQQV9TVVBQTElDQU5UICpwd3BhMl9zdXBwbGljYW50OworCXN0cnVjdCBJRV9XUEEgKnBJZTsKKwljb25zdCB1OCBvdWkwMVs0XSA9IHsgMHgwMCwgMHg1MCwgMHhmMiwgMHgwMSB9OworCisJc3RydWN0IGllZWV0eXBlc19jb3VudHJ5aW5mb3NldCAqcGNvdW50cnlpbmZvOworCisJRU5URVIoKTsKKworCWZvdW5kZGF0YXJhdGVpZSA9IDA7CisJcmF0ZXNpemUgPSAwOworCWJlYWNvbnNpemUgPSAwOworCisJaWYgKCpieXRlc2xlZnQgPj0gc2l6ZW9mKGJlYWNvbnNpemUpKSB7CisJCS8qIEV4dHJhY3QgJiBjb252ZXJ0IGJlYWNvbiBzaXplIGZyb20gdGhlIGNvbW1hbmQgYnVmZmVyICovCisJCW1lbWNweSgmYmVhY29uc2l6ZSwgKnBiZWFjb25pbmZvLCBzaXplb2YoYmVhY29uc2l6ZSkpOworCQliZWFjb25zaXplID0gbGUxNl90b19jcHUoYmVhY29uc2l6ZSk7CisJCSpieXRlc2xlZnQgLT0gc2l6ZW9mKGJlYWNvbnNpemUpOworCQkqcGJlYWNvbmluZm8gKz0gc2l6ZW9mKGJlYWNvbnNpemUpOworCX0KKworCWlmIChiZWFjb25zaXplID09IDAgfHwgYmVhY29uc2l6ZSA+ICpieXRlc2xlZnQpIHsKKworCQkqcGJlYWNvbmluZm8gKz0gKmJ5dGVzbGVmdDsKKwkJKmJ5dGVzbGVmdCA9IDA7CisKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIEluaXRpYWxpemUgdGhlIGN1cnJlbnQgd29ya2luZyBiZWFjb24gcG9pbnRlciBmb3IgdGhpcyBCU1MgaXRlcmF0aW9uICovCisJcGN1cnJlbnRwdHIgPSAqcGJlYWNvbmluZm87CisKKwkvKiBBZHZhbmNlIHRoZSByZXR1cm4gYmVhY29uIHBvaW50ZXIgcGFzdCB0aGUgY3VycmVudCBiZWFjb24gKi8KKwkqcGJlYWNvbmluZm8gKz0gYmVhY29uc2l6ZTsKKwkqYnl0ZXNsZWZ0IC09IGJlYWNvbnNpemU7CisKKwlieXRlc2xlZnRmb3JjdXJyZW50YmVhY29uID0gYmVhY29uc2l6ZTsKKworCXB3cGFfc3VwcGxpY2FudCA9ICZwQlNTRW50cnktPndwYV9zdXBwbGljYW50OworCXB3cGEyX3N1cHBsaWNhbnQgPSAmcEJTU0VudHJ5LT53cGEyX3N1cHBsaWNhbnQ7CisKKwltZW1jcHkocEJTU0VudHJ5LT5tYWNhZGRyZXNzLCBwY3VycmVudHB0ciwgRVRIX0FMRU4pOworCWxic19wcl9kZWJ1ZygxLCAiSW50ZXJwcmV0SUU6IEFQIE1BQyBBZGRyLSV4OiV4OiV4OiV4OiV4OiV4XG4iLAorCSAgICAgICBwQlNTRW50cnktPm1hY2FkZHJlc3NbMF0sIHBCU1NFbnRyeS0+bWFjYWRkcmVzc1sxXSwKKwkgICAgICAgcEJTU0VudHJ5LT5tYWNhZGRyZXNzWzJdLCBwQlNTRW50cnktPm1hY2FkZHJlc3NbM10sCisJICAgICAgIHBCU1NFbnRyeS0+bWFjYWRkcmVzc1s0XSwgcEJTU0VudHJ5LT5tYWNhZGRyZXNzWzVdKTsKKworCXBjdXJyZW50cHRyICs9IEVUSF9BTEVOOworCWJ5dGVzbGVmdGZvcmN1cnJlbnRiZWFjb24gLT0gRVRIX0FMRU47CisKKwlpZiAoYnl0ZXNsZWZ0Zm9yY3VycmVudGJlYWNvbiA8IDEyKSB7CisJCWxic19wcl9kZWJ1ZygxLCAiSW50ZXJwcmV0SUU6IE5vdCBlbm91Z2ggYnl0ZXMgbGVmdFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKgorCSAqIG5leHQgNCBmaWVsZHMgYXJlIFJTU0ksIHRpbWUgc3RhbXAsIGJlYWNvbiBpbnRlcnZhbCwKKwkgKiAgIGFuZCBjYXBhYmlsaXR5IGluZm9ybWF0aW9uCisJICovCisKKwkvKiBSU1NJIGlzIDEgYnl0ZSBsb25nICovCisJcEJTU0VudHJ5LT5yc3NpID0gbGUzMl90b19jcHUoKGxvbmcpKCpwY3VycmVudHB0cikpOworCWxic19wcl9kZWJ1ZygxLCAiSW50ZXJwcmV0SUU6IFJTU0k9JTAyWFxuIiwgKnBjdXJyZW50cHRyKTsKKwlwY3VycmVudHB0ciArPSAxOworCWJ5dGVzbGVmdGZvcmN1cnJlbnRiZWFjb24gLT0gMTsKKworCS8qIHRpbWUgc3RhbXAgaXMgOCBieXRlcyBsb25nICovCisJbWVtY3B5KGZpeGVkaWUudGltZXN0YW1wLCBwY3VycmVudHB0ciwgOCk7CisJbWVtY3B5KHBCU1NFbnRyeS0+dGltZXN0YW1wLCBwY3VycmVudHB0ciwgOCk7CisJcGN1cnJlbnRwdHIgKz0gODsKKwlieXRlc2xlZnRmb3JjdXJyZW50YmVhY29uIC09IDg7CisKKwkvKiBiZWFjb24gaW50ZXJ2YWwgaXMgMiBieXRlcyBsb25nICovCisJbWVtY3B5KCZmaXhlZGllLmJlYWNvbmludGVydmFsLCBwY3VycmVudHB0ciwgMik7CisJcEJTU0VudHJ5LT5iZWFjb25wZXJpb2QgPSBsZTE2X3RvX2NwdShmaXhlZGllLmJlYWNvbmludGVydmFsKTsKKwlwY3VycmVudHB0ciArPSAyOworCWJ5dGVzbGVmdGZvcmN1cnJlbnRiZWFjb24gLT0gMjsKKworCS8qIGNhcGFiaWxpdHkgaW5mb3JtYXRpb24gaXMgMiBieXRlcyBsb25nICovCisJbWVtY3B5KCZmaXhlZGllLmNhcGFiaWxpdGllcywgcGN1cnJlbnRwdHIsIDIpOworCWxic19wcl9kZWJ1ZygxLCAiSW50ZXJwcmV0SUU6IGZpeGVkaWUuY2FwYWJpbGl0aWVzPTB4JVhcbiIsCisJICAgICAgIGZpeGVkaWUuY2FwYWJpbGl0aWVzKTsKKwlmaXhlZGllLmNhcGFiaWxpdGllcyA9IGxlMTZfdG9fY3B1KGZpeGVkaWUuY2FwYWJpbGl0aWVzKTsKKwlwY2FwID0gKHN0cnVjdCBpZWVldHlwZXNfY2FwaW5mbyAqKSAmIGZpeGVkaWUuY2FwYWJpbGl0aWVzOworCW1lbWNweSgmcEJTU0VudHJ5LT5jYXAsIHBjYXAsIHNpemVvZihzdHJ1Y3QgaWVlZXR5cGVzX2NhcGluZm8pKTsKKwlwY3VycmVudHB0ciArPSAyOworCWJ5dGVzbGVmdGZvcmN1cnJlbnRiZWFjb24gLT0gMjsKKworCS8qIHJlc3Qgb2YgdGhlIGN1cnJlbnQgYnVmZmVyIGFyZSBJRSdzICovCisJbGJzX3ByX2RlYnVnKDEsICJJbnRlcnByZXRJRTogSUVsZW5ndGggZm9yIHRoaXMgQVAgPSAlZFxuIiwKKwkgICAgICAgYnl0ZXNsZWZ0Zm9yY3VycmVudGJlYWNvbik7CisKKwlsYnNfZGJnX2hleCgiSW50ZXJwcmV0SUU6IElFIGluZm8iLCAodTggKikgcGN1cnJlbnRwdHIsCisJCWJ5dGVzbGVmdGZvcmN1cnJlbnRiZWFjb24pOworCisJaWYgKHBjYXAtPnByaXZhY3kpIHsKKwkJbGJzX3ByX2RlYnVnKDEsICJJbnRlcnByZXRJRTogQVAgV0VQIGVuYWJsZWRcbiIpOworCQlwQlNTRW50cnktPnByaXZhY3kgPSB3bGFuODAyXzExcHJpdmZpbHRlcjgwMjF4V0VQOworCX0gZWxzZSB7CisJCXBCU1NFbnRyeS0+cHJpdmFjeSA9IHdsYW44MDJfMTFwcml2ZmlsdGVyYWNjZXB0YWxsOworCX0KKworCWlmIChwY2FwLT5pYnNzID09IDEpIHsKKwkJcEJTU0VudHJ5LT5pbmZyYW1vZGUgPSB3bGFuODAyXzExaWJzczsKKwl9IGVsc2UgeworCQlwQlNTRW50cnktPmluZnJhbW9kZSA9IHdsYW44MDJfMTFpbmZyYXN0cnVjdHVyZTsKKwl9CisKKwkvKiBwcm9jZXNzIHZhcmlhYmxlIElFICovCisJd2hpbGUgKGJ5dGVzbGVmdGZvcmN1cnJlbnRiZWFjb24gPj0gMikgeworCQllbGVtSUQgPSAoZW51bSBpZWVldHlwZXNfZWxlbWVudGlkKSAoKigodTggKikgcGN1cnJlbnRwdHIpKTsKKwkJZWxlbWxlbiA9ICooKHU4ICopIHBjdXJyZW50cHRyICsgMSk7CisKKwkJaWYgKGJ5dGVzbGVmdGZvcmN1cnJlbnRiZWFjb24gPCBlbGVtbGVuKSB7CisJCQlsYnNfcHJfZGVidWcoMSwgIkludGVycHJldElFOiBlcnJvciBpbiBwcm9jZXNzaW5nIElFLCAiCisJCQkgICAgICAgImJ5dGVzIGxlZnQgPCBJRSBsZW5ndGhcbiIpOworCQkJYnl0ZXNsZWZ0Zm9yY3VycmVudGJlYWNvbiA9IDA7CisJCQljb250aW51ZTsKKwkJfQorCisJCXN3aXRjaCAoZWxlbUlEKSB7CisKKwkJY2FzZSBTU0lEOgorCQkJcEJTU0VudHJ5LT5zc2lkLnNzaWRsZW5ndGggPSBlbGVtbGVuOworCQkJbWVtY3B5KHBCU1NFbnRyeS0+c3NpZC5zc2lkLCAocGN1cnJlbnRwdHIgKyAyKSwKKwkJCSAgICAgICBlbGVtbGVuKTsKKwkJCWxic19wcl9kZWJ1ZygxLCAic3NpZDogJTMycyIsIHBCU1NFbnRyeS0+c3NpZC5zc2lkKTsKKwkJCWJyZWFrOworCisJCWNhc2UgU1VQUE9SVEVEX1JBVEVTOgorCQkJbWVtY3B5KHBCU1NFbnRyeS0+ZGF0YXJhdGVzLCAocGN1cnJlbnRwdHIgKyAyKSwKKwkJCSAgICAgICBlbGVtbGVuKTsKKwkJCW1lbW1vdmUocEJTU0VudHJ5LT5saWJlcnRhc19zdXBwb3J0ZWRfcmF0ZXMsIChwY3VycmVudHB0ciArIDIpLAorCQkJCWVsZW1sZW4pOworCQkJcmF0ZXNpemUgPSBlbGVtbGVuOworCQkJZm91bmRkYXRhcmF0ZWllID0gMTsKKwkJCWJyZWFrOworCisJCWNhc2UgRVhUUkFfSUU6CisJCQlsYnNfcHJfZGVidWcoMSwgIkludGVycHJldElFOiBFWFRSQV9JRSBGb3VuZCFcbiIpOworCQkJcEJTU0VudHJ5LT5leHRyYV9pZSA9IDE7CisJCQlicmVhazsKKworCQljYXNlIEZIX1BBUkFNX1NFVDoKKwkJCXBGSCA9IChzdHJ1Y3QgaWVlZXR5cGVzX2ZocGFyYW1zZXQgKikgcGN1cnJlbnRwdHI7CisJCQltZW1tb3ZlKCZwQlNTRW50cnktPnBoeXBhcmFtc2V0LmZocGFyYW1zZXQsIHBGSCwKKwkJCQlzaXplb2Yoc3RydWN0IGllZWV0eXBlc19maHBhcmFtc2V0KSk7CisJCQlwQlNTRW50cnktPnBoeXBhcmFtc2V0LmZocGFyYW1zZXQuZHdlbGx0aW1lCisJCQkgICAgPQorCQkJICAgIGxlMTZfdG9fY3B1KHBCU1NFbnRyeS0+cGh5cGFyYW1zZXQuZmhwYXJhbXNldC4KKwkJCQkJICAgICBkd2VsbHRpbWUpOworCQkJYnJlYWs7CisKKwkJY2FzZSBEU19QQVJBTV9TRVQ6CisJCQlwRFMgPSAoc3RydWN0IGllZWV0eXBlc19kc3BhcmFtc2V0ICopIHBjdXJyZW50cHRyOworCisJCQlwQlNTRW50cnktPmNoYW5uZWwgPSBwRFMtPmN1cnJlbnRjaGFuOworCisJCQltZW1jcHkoJnBCU1NFbnRyeS0+cGh5cGFyYW1zZXQuZHNwYXJhbXNldCwgcERTLAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgaWVlZXR5cGVzX2RzcGFyYW1zZXQpKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQ0ZfUEFSQU1fU0VUOgorCQkJcENGID0gKHN0cnVjdCBpZWVldHlwZXNfY2ZwYXJhbXNldCAqKSBwY3VycmVudHB0cjsKKworCQkJbWVtY3B5KCZwQlNTRW50cnktPnNzcGFyYW1zZXQuY2ZwYXJhbXNldCwgcENGLAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgaWVlZXR5cGVzX2NmcGFyYW1zZXQpKTsKKwkJCWJyZWFrOworCisJCWNhc2UgSUJTU19QQVJBTV9TRVQ6CisJCQlwaWJzcyA9IChzdHJ1Y3QgaWVlZXR5cGVzX2lic3NwYXJhbXNldCAqKSBwY3VycmVudHB0cjsKKwkJCXBCU1NFbnRyeS0+YXRpbXdpbmRvdyA9CisJCQkgICAgbGUzMl90b19jcHUocGlic3MtPmF0aW13aW5kb3cpOworCisJCQltZW1tb3ZlKCZwQlNTRW50cnktPnNzcGFyYW1zZXQuaWJzc3BhcmFtc2V0LCBwaWJzcywKKwkJCQlzaXplb2Yoc3RydWN0IGllZWV0eXBlc19pYnNzcGFyYW1zZXQpKTsKKworCQkJcEJTU0VudHJ5LT5zc3BhcmFtc2V0Lmlic3NwYXJhbXNldC5hdGltd2luZG93CisJCQkgICAgPQorCQkJICAgIGxlMTZfdG9fY3B1KHBCU1NFbnRyeS0+c3NwYXJhbXNldC5pYnNzcGFyYW1zZXQuCisJCQkJCSAgICAgYXRpbXdpbmRvdyk7CisJCQlicmVhazsKKworCQkJLyogSGFuZGxlIENvdW50cnkgSW5mbyBJRSAqLworCQljYXNlIENPVU5UUllfSU5GTzoKKwkJCXBjb3VudHJ5aW5mbyA9CisJCQkgICAgKHN0cnVjdCBpZWVldHlwZXNfY291bnRyeWluZm9zZXQgKikgcGN1cnJlbnRwdHI7CisKKwkJCWlmIChwY291bnRyeWluZm8tPmxlbiA8CisJCQkgICAgc2l6ZW9mKHBjb3VudHJ5aW5mby0+Y291bnRyeWNvZGUpCisJCQkgICAgfHwgcGNvdW50cnlpbmZvLT5sZW4gPiAyNTQpIHsKKwkJCQlsYnNfcHJfZGVidWcoMSwgIkludGVycHJldElFOiAxMUQtIEVyciAiCisJCQkJICAgICAgICJDb3VudHJ5SW5mbyBsZW4gPSVkIG1pbj0lZCBtYXg9MjU0XG4iLAorCQkJCSAgICAgICBwY291bnRyeWluZm8tPmxlbiwKKwkJCQkgICAgICAgc2l6ZW9mKHBjb3VudHJ5aW5mby0+Y291bnRyeWNvZGUpKTsKKwkJCQlMRUFWRSgpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKworCQkJbWVtY3B5KCZwQlNTRW50cnktPmNvdW50cnlpbmZvLAorCQkJICAgICAgIHBjb3VudHJ5aW5mbywgcGNvdW50cnlpbmZvLT5sZW4gKyAyKTsKKwkJCWxic19kYmdfaGV4KCJJbnRlcnByZXRJRTogMTFELSBDb3VudHJ5SW5mbzoiLAorCQkJCSh1OCAqKSBwY291bnRyeWluZm8sCisJCQkJKHUzMikgKHBjb3VudHJ5aW5mby0+bGVuICsgMikpOworCQkJYnJlYWs7CisKKwkJY2FzZSBFWFRFTkRFRF9TVVBQT1JURURfUkFURVM6CisJCQkvKgorCQkJICogb25seSBwcm9jZXNzIGV4dGVuZGVkIHN1cHBvcnRlZCByYXRlCisJCQkgKiBpZiBkYXRhIHJhdGUgaXMgYWxyZWFkeSBmb3VuZC4KKwkJCSAqIGRhdGEgcmF0ZSBJRSBzaG91bGQgY29tZSBiZWZvcmUKKwkJCSAqIGV4dGVuZGVkIHN1cHBvcnRlZCByYXRlIElFCisJCQkgKi8KKwkJCWlmIChmb3VuZGRhdGFyYXRlaWUpIHsKKwkJCQlpZiAoKGVsZW1sZW4gKyByYXRlc2l6ZSkgPiBXTEFOX1NVUFBPUlRFRF9SQVRFUykgeworCQkJCQlieXRlc3RvY29weSA9CisJCQkJCSAgICAoV0xBTl9TVVBQT1JURURfUkFURVMgLSByYXRlc2l6ZSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJYnl0ZXN0b2NvcHkgPSBlbGVtbGVuOworCQkJCX0KKworCQkJCXBSYXRlID0gKHU4ICopIHBCU1NFbnRyeS0+ZGF0YXJhdGVzOworCQkJCXBSYXRlICs9IHJhdGVzaXplOworCQkJCW1lbW1vdmUocFJhdGUsIChwY3VycmVudHB0ciArIDIpLCBieXRlc3RvY29weSk7CisKKwkJCQlwUmF0ZSA9ICh1OCAqKSBwQlNTRW50cnktPmxpYmVydGFzX3N1cHBvcnRlZF9yYXRlczsKKworCQkJCXBSYXRlICs9IHJhdGVzaXplOworCQkJCW1lbW1vdmUocFJhdGUsIChwY3VycmVudHB0ciArIDIpLCBieXRlc3RvY29weSk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFZFTkRPUl9TUEVDSUZJQ18yMjE6CisjZGVmaW5lIElFX0lEX0xFTl9GSUVMRFNfQllURVMgMgorCQkJcEllID0gKHN0cnVjdCBJRV9XUEEgKilwY3VycmVudHB0cjsKKworCQkJaWYgKCFtZW1jbXAocEllLT5vdWksIG91aTAxLCBzaXplb2Yob3VpMDEpKSkgeworCQkJCXB3cGFfc3VwcGxpY2FudC0+d3BhX2llX2xlbgorCQkJCSAgICA9IG1pbl90KHNpemVfdCwgZWxlbWxlbiArIElFX0lEX0xFTl9GSUVMRFNfQllURVMsCisJCQkJCSAgc2l6ZW9mKHB3cGFfc3VwcGxpY2FudC0+d3BhX2llKSk7CisJCQkJbWVtY3B5KHB3cGFfc3VwcGxpY2FudC0+d3BhX2llLAorCQkJCSAgICAgICBwY3VycmVudHB0ciwKKwkJCQkgICAgICAgcHdwYV9zdXBwbGljYW50LT53cGFfaWVfbGVuKTsKKwkJCQlsYnNfZGJnX2hleCgiSW50ZXJwcmV0SUU6IFJlc3AgV1BBX0lFIiwKKwkJCQkJcHdwYV9zdXBwbGljYW50LT53cGFfaWUsIGVsZW1sZW4pOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgV1BBMl9JRToKKwkJCXBJZSA9IChzdHJ1Y3QgSUVfV1BBICopcGN1cnJlbnRwdHI7CisJCQlwd3BhMl9zdXBwbGljYW50LT53cGFfaWVfbGVuCisJCQkgICAgPSBtaW5fdChzaXplX3QsIGVsZW1sZW4gKyBJRV9JRF9MRU5fRklFTERTX0JZVEVTLAorCQkJCSAgc2l6ZW9mKHB3cGEyX3N1cHBsaWNhbnQtPndwYV9pZSkpOworCQkJbWVtY3B5KHB3cGEyX3N1cHBsaWNhbnQtPndwYV9pZSwKKwkJCSAgICAgICBwY3VycmVudHB0ciwgcHdwYTJfc3VwcGxpY2FudC0+d3BhX2llX2xlbik7CisKKwkJCWxic19kYmdfaGV4KCJJbnRlcnByZXRJRTogUmVzcCBXUEEyX0lFIiwKKwkJCQlwd3BhMl9zdXBwbGljYW50LT53cGFfaWUsIGVsZW1sZW4pOworCQkJYnJlYWs7CisJCWNhc2UgVElNOgorCQkJYnJlYWs7CisKKwkJY2FzZSBDSEFMTEVOR0VfVEVYVDoKKwkJCWJyZWFrOworCQl9CisKKwkJcGN1cnJlbnRwdHIgKz0gZWxlbWxlbiArIDI7CisKKwkJLyogbmVlZCB0byBhY2NvdW50IGZvciBJRSBJRCBhbmQgSUUgbGVuICovCisJCWJ5dGVzbGVmdGZvcmN1cnJlbnRiZWFjb24gLT0gKGVsZW1sZW4gKyAyKTsKKworCX0JCQkvKiB3aGlsZSAoYnl0ZXNsZWZ0Zm9yY3VycmVudGJlYWNvbiA+IDIpICovCisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiAgQGJyaWVmIENvbXBhcmUgdHdvIFNTSURzCisgKgorICogIEBwYXJhbSBzc2lkMSAgICBBIHBvaW50ZXIgdG8gc3NpZCB0byBjb21wYXJlCisgKiAgQHBhcmFtIHNzaWQyICAgIEEgcG9pbnRlciB0byBzc2lkIHRvIGNvbXBhcmUKKyAqCisgKiAgQHJldHVybiAgICAgICAgIDAtLXNzaWQgaXMgc2FtZSwgb3RoZXJ3aXNlIGlzIGRpZmZlcmVudAorICovCitpbnQgbGliZXJ0YXNfU1NJRF9jbXAoc3RydWN0IFdMQU5fODAyXzExX1NTSUQgKnNzaWQxLCBzdHJ1Y3QgV0xBTl84MDJfMTFfU1NJRCAqc3NpZDIpCit7CisJaWYgKCFzc2lkMSB8fCAhc3NpZDIpCisJCXJldHVybiAtMTsKKworCWlmIChzc2lkMS0+c3NpZGxlbmd0aCAhPSBzc2lkMi0+c3NpZGxlbmd0aCkKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIG1lbWNtcChzc2lkMS0+c3NpZCwgc3NpZDItPnNzaWQsIHNzaWQxLT5zc2lkbGVuZ3RoKTsKK30KKworLyoqCisgKiAgQGJyaWVmIFRoaXMgZnVuY3Rpb24gZmluZHMgYSBzcGVjaWZpYyBjb21wYXRpYmxlIEJTU0lEIGluIHRoZSBzY2FuIGxpc3QKKyAqCisgKiAgQHBhcmFtIGFkYXB0ZXIgIEEgcG9pbnRlciB0byB3bGFuX2FkYXB0ZXIKKyAqICBAcGFyYW0gYnNzaWQgICAgQlNTSUQgdG8gZmluZCBpbiB0aGUgc2NhbiBsaXN0CisgKiAgQHBhcmFtIG1vZGUgICAgIE5ldHdvcmsgbW9kZTogSW5mcmFzdHJ1Y3R1cmUgb3IgSUJTUworICoKKyAqICBAcmV0dXJuICAgICAgICAgaW5kZXggaW4gQlNTSUQgbGlzdCwgb3IgZXJyb3IgcmV0dXJuIGNvZGUgKDwgMCkKKyAqLworaW50IGxpYmVydGFzX2ZpbmRfQlNTSURfaW5fbGlzdCh3bGFuX2FkYXB0ZXIgKiBhZGFwdGVyLCB1OCAqIGJzc2lkLCBpbnQgbW9kZSkKK3sKKwlpbnQgcmV0ID0gLUVORVRVTlJFQUNIOworCWludCBpOworCisJaWYgKCFic3NpZCkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlsYnNfcHJfZGVidWcoMSwgIkZpbmRCU1NJRDogTnVtIG9mIEJTU0lEcyA9ICVkXG4iLAorCSAgICAgICBhZGFwdGVyLT5udW1pbnNjYW50YWJsZSk7CisKKwkvKiBMb29rIHRocm91Z2ggdGhlIHNjYW4gdGFibGUgZm9yIGEgY29tcGF0aWJsZSBtYXRjaC4gVGhlIHJldCByZXR1cm4KKwkgKiAgIHZhcmlhYmxlIHdpbGwgYmUgZXF1YWwgdG8gdGhlIGluZGV4IGluIHRoZSBzY2FuIHRhYmxlIChncmVhdGVyCisJICogICB0aGFuIHplcm8pIGlmIHRoZSBuZXR3b3JrIGlzIGNvbXBhdGlibGUuICBUaGUgbG9vcCB3aWxsIGNvbnRpbnVlCisJICogICBwYXN0IGEgbWF0Y2hlZCBic3NpZCB0aGF0IGlzIG5vdCBjb21wYXRpYmxlIGluIGNhc2UgdGhlcmUgaXMgYW4KKwkgKiAgIEFQIHdpdGggbXVsdGlwbGUgU1NJRHMgYXNzaWduZWQgdG8gdGhlIHNhbWUgQlNTSUQKKwkgKi8KKwlmb3IgKGkgPSAwOyByZXQgPCAwICYmIGkgPCBhZGFwdGVyLT5udW1pbnNjYW50YWJsZTsgaSsrKSB7CisJCWlmICghbWVtY21wKGFkYXB0ZXItPnNjYW50YWJsZVtpXS5tYWNhZGRyZXNzLCBic3NpZCwgRVRIX0FMRU4pKSB7CisJCQlzd2l0Y2ggKG1vZGUpIHsKKwkJCWNhc2Ugd2xhbjgwMl8xMWluZnJhc3RydWN0dXJlOgorCQkJY2FzZSB3bGFuODAyXzExaWJzczoKKwkJCQlyZXQgPSBpc19uZXR3b3JrX2NvbXBhdGlibGUoYWRhcHRlciwgaSwgbW9kZSk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXJldCA9IGk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqICBAYnJpZWYgVGhpcyBmdW5jdGlvbiBmaW5kcyBzc2lkIGluIHNzaWQgbGlzdC4KKyAqCisgKiAgQHBhcmFtIGFkYXB0ZXIgIEEgcG9pbnRlciB0byB3bGFuX2FkYXB0ZXIKKyAqICBAcGFyYW0gc3NpZCAgICAgU1NJRCB0byBmaW5kIGluIHRoZSBsaXN0CisgKiAgQHBhcmFtIGJzc2lkICAgIEJTU0lEIHRvIHF1YWxpZnkgdGhlIFNTSUQgc2VsZWN0aW9uIChpZiBwcm92aWRlZCkKKyAqICBAcGFyYW0gbW9kZSAgICAgTmV0d29yayBtb2RlOiBJbmZyYXN0cnVjdHVyZSBvciBJQlNTCisgKgorICogIEByZXR1cm4gICAgICAgICBpbmRleCBpbiBCU1NJRCBsaXN0CisgKi8KK2ludCBsaWJlcnRhc19maW5kX1NTSURfaW5fbGlzdCh3bGFuX2FkYXB0ZXIgKiBhZGFwdGVyLAorCQkgICBzdHJ1Y3QgV0xBTl84MDJfMTFfU1NJRCAqc3NpZCwgdTggKiBic3NpZCwgaW50IG1vZGUpCit7CisJaW50IG5ldCA9IC1FTkVUVU5SRUFDSDsKKwl1OCBiZXN0cnNzaSA9IDA7CisJaW50IGk7CisJaW50IGo7CisKKwlsYnNfcHJfZGVidWcoMSwgIk51bSBvZiBFbnRyaWVzIGluIFRhYmxlID0gJWRcbiIsIGFkYXB0ZXItPm51bWluc2NhbnRhYmxlKTsKKworCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5udW1pbnNjYW50YWJsZTsgaSsrKSB7CisJCWlmICghbGliZXJ0YXNfU1NJRF9jbXAoJmFkYXB0ZXItPnNjYW50YWJsZVtpXS5zc2lkLCBzc2lkKSAmJgorCQkgICAgKCFic3NpZCB8fAorCQkgICAgICFtZW1jbXAoYWRhcHRlci0+c2NhbnRhYmxlW2ldLgorCQkJICAgICBtYWNhZGRyZXNzLCBic3NpZCwgRVRIX0FMRU4pKSkgeworCQkJc3dpdGNoIChtb2RlKSB7CisJCQljYXNlIHdsYW44MDJfMTFpbmZyYXN0cnVjdHVyZToKKwkJCWNhc2Ugd2xhbjgwMl8xMWlic3M6CisJCQkJaiA9IGlzX25ldHdvcmtfY29tcGF0aWJsZShhZGFwdGVyLCBpLCBtb2RlKTsKKworCQkJCWlmIChqID49IDApIHsKKwkJCQkJaWYgKGJzc2lkKSB7CisJCQkJCQlyZXR1cm4gaTsKKwkJCQkJfQorCisJCQkJCWlmIChTQ0FOX1JTU0kKKwkJCQkJICAgIChhZGFwdGVyLT5zY2FudGFibGVbaV0ucnNzaSkKKwkJCQkJICAgID4gYmVzdHJzc2kpIHsKKwkJCQkJCWJlc3Ryc3NpID0KKwkJCQkJCSAgICBTQ0FOX1JTU0koYWRhcHRlci0+CisJCQkJCQkJICAgICAgc2NhbnRhYmxlW2ldLgorCQkJCQkJCSAgICAgIHJzc2kpOworCQkJCQkJbmV0ID0gaTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCWlmIChuZXQgPT0gLUVORVRVTlJFQUNIKSB7CisJCQkJCQluZXQgPSBqOworCQkJCQl9CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSB3bGFuODAyXzExYXV0b3Vua25vd246CisJCQlkZWZhdWx0OgorCQkJCWlmIChTQ0FOX1JTU0koYWRhcHRlci0+c2NhbnRhYmxlW2ldLnJzc2kpCisJCQkJICAgID4gYmVzdHJzc2kpIHsKKwkJCQkJYmVzdHJzc2kgPQorCQkJCQkgICAgU0NBTl9SU1NJKGFkYXB0ZXItPnNjYW50YWJsZVtpXS4KKwkJCQkJCSAgICAgIHJzc2kpOworCQkJCQluZXQgPSBpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiBuZXQ7Cit9CisKKy8qKgorICogIEBicmllZiBUaGlzIGZ1bmN0aW9uIGZpbmRzIHRoZSBiZXN0IFNTSUQgaW4gdGhlIFNjYW4gTGlzdAorICoKKyAqICBTZWFyY2ggdGhlIHNjYW4gdGFibGUgZm9yIHRoZSBiZXN0IFNTSUQgdGhhdCBhbHNvIG1hdGNoZXMgdGhlIGN1cnJlbnQKKyAqICAgYWRhcHRlciBuZXR3b3JrIHByZWZlcmVuY2UgKGluZnJhc3RydWN0dXJlIG9yIGFkaG9jKQorICoKKyAqICBAcGFyYW0gYWRhcHRlciAgQSBwb2ludGVyIHRvIHdsYW5fYWRhcHRlcgorICoKKyAqICBAcmV0dXJuICAgICAgICAgaW5kZXggaW4gQlNTSUQgbGlzdAorICovCitpbnQgbGliZXJ0YXNfZmluZF9iZXN0X1NTSURfaW5fbGlzdCh3bGFuX2FkYXB0ZXIgKiBhZGFwdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBXTEFOXzgwMl8xMV9ORVRXT1JLX0lORlJBU1RSVUNUVVJFIG1vZGUpCit7CisJaW50IGJlc3RuZXQgPSAtRU5FVFVOUkVBQ0g7CisJdTggYmVzdHJzc2kgPSAwOworCWludCBpOworCisJRU5URVIoKTsKKworCWxic19wcl9kZWJ1ZygxLCAiTnVtIG9mIEJTU0lEcyA9ICVkXG4iLCBhZGFwdGVyLT5udW1pbnNjYW50YWJsZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+bnVtaW5zY2FudGFibGU7IGkrKykgeworCQlzd2l0Y2ggKG1vZGUpIHsKKwkJY2FzZSB3bGFuODAyXzExaW5mcmFzdHJ1Y3R1cmU6CisJCWNhc2Ugd2xhbjgwMl8xMWlic3M6CisJCQlpZiAoaXNfbmV0d29ya19jb21wYXRpYmxlKGFkYXB0ZXIsIGksIG1vZGUpID49IDApIHsKKwkJCQlpZiAoU0NBTl9SU1NJKGFkYXB0ZXItPnNjYW50YWJsZVtpXS5yc3NpKSA+CisJCQkJICAgIGJlc3Ryc3NpKSB7CisJCQkJCWJlc3Ryc3NpID0KKwkJCQkJICAgIFNDQU5fUlNTSShhZGFwdGVyLT5zY2FudGFibGVbaV0uCisJCQkJCQkgICAgICByc3NpKTsKKwkJCQkJYmVzdG5ldCA9IGk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2Ugd2xhbjgwMl8xMWF1dG91bmtub3duOgorCQlkZWZhdWx0OgorCQkJaWYgKFNDQU5fUlNTSShhZGFwdGVyLT5zY2FudGFibGVbaV0ucnNzaSkgPiBiZXN0cnNzaSkgeworCQkJCWJlc3Ryc3NpID0KKwkJCQkgICAgU0NBTl9SU1NJKGFkYXB0ZXItPnNjYW50YWJsZVtpXS5yc3NpKTsKKwkJCQliZXN0bmV0ID0gaTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJfQorCisJTEVBVkUoKTsKKwlyZXR1cm4gYmVzdG5ldDsKK30KKworLyoqCisgKiAgQGJyaWVmIEZpbmQgdGhlIEFQIHdpdGggc3BlY2lmaWMgc3NpZCBpbiB0aGUgc2NhbiBsaXN0CisgKgorICogIEBwYXJhbSBwcml2ICAgICAgICAgQSBwb2ludGVyIHRvIHdsYW5fcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqICBAcGFyYW0gcFNTSUQgICAgICAgIEEgcG9pbnRlciB0byBBUCdzIHNzaWQKKyAqCisgKiAgQHJldHVybiAgICAgICAgICAgICAwLS1zdWNjZXNzLCBvdGhlcndpc2UtLWZhaWwKKyAqLworaW50IGxpYmVydGFzX2ZpbmRfYmVzdF9uZXR3b3JrX1NTSUQod2xhbl9wcml2YXRlICogcHJpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBXTEFOXzgwMl8xMV9TU0lEICpwU1NJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gV0xBTl84MDJfMTFfTkVUV09SS19JTkZSQVNUUlVDVFVSRSBwcmVmZXJyZWRfbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gV0xBTl84MDJfMTFfTkVUV09SS19JTkZSQVNUUlVDVFVSRSAqb3V0X21vZGUpCit7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgYnNzX2Rlc2NyaXB0b3IgKnByZXFic3NpZDsKKwlpbnQgaTsKKworCUVOVEVSKCk7CisKKwltZW1zZXQocFNTSUQsIDAsIHNpemVvZihzdHJ1Y3QgV0xBTl84MDJfMTFfU1NJRCkpOworCisJd2xhbl9zY2FuX25ldHdvcmtzKHByaXYsIE5VTEwpOworCWlmIChhZGFwdGVyLT5zdXJwcmlzZXJlbW92ZWQpCisJCXJldHVybiAtMTsKKwl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYWRhcHRlci0+Y21kX3BlbmRpbmcsICFhZGFwdGVyLT5ucl9jbWRfcGVuZGluZyk7CisKKwlpID0gbGliZXJ0YXNfZmluZF9iZXN0X1NTSURfaW5fbGlzdChhZGFwdGVyLCBwcmVmZXJyZWRfbW9kZSk7CisJaWYgKGkgPCAwKSB7CisJCXJldCA9IC0xOworCQlnb3RvIG91dDsKKwl9CisKKwlwcmVxYnNzaWQgPSAmYWRhcHRlci0+c2NhbnRhYmxlW2ldOworCW1lbWNweShwU1NJRCwgJnByZXFic3NpZC0+c3NpZCwKKwkgICAgICAgc2l6ZW9mKHN0cnVjdCBXTEFOXzgwMl8xMV9TU0lEKSk7CisJKm91dF9tb2RlID0gcHJlcWJzc2lkLT5pbmZyYW1vZGU7CisKKwlpZiAoIXBTU0lELT5zc2lkbGVuZ3RoKSB7CisJCXJldCA9IC0xOworCX0KKworb3V0OgorCUxFQVZFKCk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiAgQGJyaWVmIFNjYW4gTmV0d29yaworICoKKyAqICBAcGFyYW0gZGV2ICAgICAgICAgIEEgcG9pbnRlciB0byBuZXRfZGV2aWNlIHN0cnVjdHVyZQorICogIEBwYXJhbSBpbmZvICAgICAgICAgQSBwb2ludGVyIHRvIGl3X3JlcXVlc3RfaW5mbyBzdHJ1Y3R1cmUKKyAqICBAcGFyYW0gdndycSAgICAgICAgIEEgcG9pbnRlciB0byBpd19wYXJhbSBzdHJ1Y3R1cmUKKyAqICBAcGFyYW0gZXh0cmEgICAgICAgIEEgcG9pbnRlciB0byBleHRyYSBkYXRhIGJ1ZgorICoKKyAqICBAcmV0dXJuICAgICAgICAgICAgIDAgLS1zdWNjZXNzLCBvdGhlcndpc2UgZmFpbAorICovCitpbnQgbGliZXJ0YXNfc2V0X3NjYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICBzdHJ1Y3QgaXdfcGFyYW0gKnZ3cnEsIGNoYXIgKmV4dHJhKQoreworCXdsYW5fcHJpdmF0ZSAqcHJpdiA9IGRldi0+cHJpdjsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCXVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKKworCUVOVEVSKCk7CisKKwlpZiAoIXdsYW5fc2Nhbl9uZXR3b3Jrcyhwcml2LCBOVUxMKSkgeworCQltZW1zZXQoJndycXUsIDAsIHNpemVvZih1bmlvbiBpd3JlcV9kYXRhKSk7CisJCXdpcmVsZXNzX3NlbmRfZXZlbnQocHJpdi0+d2xhbl9kZXYubmV0ZGV2LCBTSU9DR0lXU0NBTiwgJndycXUsCisJCQkJICAgIE5VTEwpOworCX0KKworCWlmIChhZGFwdGVyLT5zdXJwcmlzZXJlbW92ZWQpCisJCXJldHVybiAtMTsKKworCUxFQVZFKCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogIEBicmllZiBTZW5kIGEgc2NhbiBjb21tYW5kIGZvciBhbGwgYXZhaWxhYmxlIGNoYW5uZWxzIGZpbHRlcmVkIG9uIGEgc3BlYworICoKKyAqICBAcGFyYW0gcHJpdiAgICAgICAgICAgICBBIHBvaW50ZXIgdG8gd2xhbl9wcml2YXRlIHN0cnVjdHVyZQorICogIEBwYXJhbSBwcmVxdWVzdGVkc3NpZCAgIEEgcG9pbnRlciB0byBBUCdzIHNzaWQKKyAqICBAcGFyYW0ga2VlcHByZXZpb3Vzc2NhbiBGbGFnIHVzZWQgdG8gc2F2ZS9jbGVhciBzY2FuIHRhYmxlIGJlZm9yZSBzY2FuCisgKgorICogIEByZXR1cm4gICAgICAgICAgICAgICAgMC1zdWNjZXNzLCBvdGhlcndpc2UgZmFpbAorICovCitpbnQgbGliZXJ0YXNfc2VuZF9zcGVjaWZpY19TU0lEX3NjYW4od2xhbl9wcml2YXRlICogcHJpdiwKKwkJCSBzdHJ1Y3QgV0xBTl84MDJfMTFfU1NJRCAqcHJlcXVlc3RlZHNzaWQsCisJCQkgdTgga2VlcHByZXZpb3Vzc2NhbikKK3sKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCXN0cnVjdCB3bGFuX2lvY3RsX3VzZXJfc2Nhbl9jZmcgc2NhbmNmZzsKKworCUVOVEVSKCk7CisKKwlpZiAocHJlcXVlc3RlZHNzaWQgPT0gTlVMTCkgeworCQlyZXR1cm4gLTE7CisJfQorCisJbWVtc2V0KCZzY2FuY2ZnLCAweDAwLCBzaXplb2Yoc2NhbmNmZykpOworCisJbWVtY3B5KHNjYW5jZmcuc3BlY2lmaWNTU0lELCBwcmVxdWVzdGVkc3NpZC0+c3NpZCwKKwkgICAgICAgcHJlcXVlc3RlZHNzaWQtPnNzaWRsZW5ndGgpOworCXNjYW5jZmcua2VlcHByZXZpb3Vzc2NhbiA9IGtlZXBwcmV2aW91c3NjYW47CisKKwl3bGFuX3NjYW5fbmV0d29ya3MocHJpdiwgJnNjYW5jZmcpOworCWlmIChhZGFwdGVyLT5zdXJwcmlzZXJlbW92ZWQpCisJCXJldHVybiAtMTsKKwl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYWRhcHRlci0+Y21kX3BlbmRpbmcsICFhZGFwdGVyLT5ucl9jbWRfcGVuZGluZyk7CisKKwlMRUFWRSgpOworCXJldHVybiAwOworfQorCisvKioKKyAqICBAYnJpZWYgc2NhbiBhbiBBUCB3aXRoIHNwZWNpZmljIEJTU0lECisgKgorICogIEBwYXJhbSBwcml2ICAgICAgICAgICAgIEEgcG9pbnRlciB0byB3bGFuX3ByaXZhdGUgc3RydWN0dXJlCisgKiAgQHBhcmFtIGJzc2lkICAgICAgICAgICAgQSBwb2ludGVyIHRvIEFQJ3MgYnNzaWQKKyAqICBAcGFyYW0ga2VlcHByZXZpb3Vzc2NhbiBGbGFnIHVzZWQgdG8gc2F2ZS9jbGVhciBzY2FuIHRhYmxlIGJlZm9yZSBzY2FuCisgKgorICogIEByZXR1cm4gICAgICAgICAgMC1zdWNjZXNzLCBvdGhlcndpc2UgZmFpbAorICovCitpbnQgbGliZXJ0YXNfc2VuZF9zcGVjaWZpY19CU1NJRF9zY2FuKHdsYW5fcHJpdmF0ZSAqIHByaXYsIHU4ICogYnNzaWQsIHU4IGtlZXBwcmV2aW91c3NjYW4pCit7CisJc3RydWN0IHdsYW5faW9jdGxfdXNlcl9zY2FuX2NmZyBzY2FuY2ZnOworCisJRU5URVIoKTsKKworCWlmIChic3NpZCA9PSBOVUxMKSB7CisJCXJldHVybiAtMTsKKwl9CisKKwltZW1zZXQoJnNjYW5jZmcsIDB4MDAsIHNpemVvZihzY2FuY2ZnKSk7CisJbWVtY3B5KHNjYW5jZmcuc3BlY2lmaWNCU1NJRCwgYnNzaWQsIHNpemVvZihzY2FuY2ZnLnNwZWNpZmljQlNTSUQpKTsKKwlzY2FuY2ZnLmtlZXBwcmV2aW91c3NjYW4gPSBrZWVwcHJldmlvdXNzY2FuOworCisJd2xhbl9zY2FuX25ldHdvcmtzKHByaXYsICZzY2FuY2ZnKTsKKwlpZiAocHJpdi0+YWRhcHRlci0+c3VycHJpc2VyZW1vdmVkKQorCQlyZXR1cm4gLTE7CisJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHByaXYtPmFkYXB0ZXItPmNtZF9wZW5kaW5nLAorCQkhcHJpdi0+YWRhcHRlci0+bnJfY21kX3BlbmRpbmcpOworCisJTEVBVkUoKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiAgQGJyaWVmICBSZXRyaWV2ZSB0aGUgc2NhbiB0YWJsZSBlbnRyaWVzIHZpYSB3aXJlbGVzcyB0b29scyBJT0NUTCBjYWxsCisgKgorICogIEBwYXJhbSBkZXYgICAgICAgICAgQSBwb2ludGVyIHRvIG5ldF9kZXZpY2Ugc3RydWN0dXJlCisgKiAgQHBhcmFtIGluZm8gICAgICAgICBBIHBvaW50ZXIgdG8gaXdfcmVxdWVzdF9pbmZvIHN0cnVjdHVyZQorICogIEBwYXJhbSBkd3JxICAgICAgICAgQSBwb2ludGVyIHRvIGl3X3BvaW50IHN0cnVjdHVyZQorICogIEBwYXJhbSBleHRyYSAgICAgICAgQSBwb2ludGVyIHRvIGV4dHJhIGRhdGEgYnVmCisgKgorICogIEByZXR1cm4gICAgICAgICAgICAgMCAtLXN1Y2Nlc3MsIG90aGVyd2lzZSBmYWlsCisgKi8KK2ludCBsaWJlcnRhc19nZXRfc2NhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgIHN0cnVjdCBpd19wb2ludCAqZHdycSwgY2hhciAqZXh0cmEpCit7CisJd2xhbl9wcml2YXRlICpwcml2ID0gZGV2LT5wcml2OworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJaW50IHJldCA9IDA7CisJY2hhciAqY3VycmVudF9ldiA9IGV4dHJhOworCWNoYXIgKmVuZF9idWYgPSBleHRyYSArIElXX1NDQU5fTUFYX0RBVEE7CisJc3RydWN0IGNoYW5fZnJlcV9wb3dlciAqY2ZwOworCXN0cnVjdCBic3NfZGVzY3JpcHRvciAqcHNjYW50YWJsZTsKKwljaGFyICpjdXJyZW50X3ZhbDsJLyogRm9yIHJhdGVzICovCisJc3RydWN0IGl3X2V2ZW50IGl3ZTsJLyogVGVtcG9yYXJ5IGJ1ZmZlciAqLworCWludCBpOworCWludCBqOworCWludCByYXRlOworI2RlZmluZSBQRVJGRUNUX1JTU0kgKCh1OCk1MCkKKyNkZWZpbmUgV09SU1RfUlNTSSAgICgodTgpMCkKKyNkZWZpbmUgUlNTSV9ESUZGICAgICgodTgpKFBFUkZFQ1RfUlNTSSAtIFdPUlNUX1JTU0kpKQorCXU4IHJzc2k7CisKKwl1OCBidWZbMTYgKyAyNTYgKiAyXTsKKwl1OCAqcHRyOworCisJRU5URVIoKTsKKworCS8qCisJICogaWYgdGhlcmUncyBlaXRoZXIgY29tbWFuZHMgaW4gdGhlIHF1ZXVlIG9yIG9uZSBiZWluZworCSAqIHByb2Nlc3NlZCByZXR1cm4gLUVBR0FJTiBmb3IgaXdsaXN0IHRvIHJldHJ5IGxhdGVyLgorCSAqLworICAgIGlmIChhZGFwdGVyLT5ucl9jbWRfcGVuZGluZykKKwkJcmV0dXJuIC1FQUdBSU47CisKKwlpZiAoYWRhcHRlci0+Y29ubmVjdF9zdGF0dXMgPT0gbGliZXJ0YXNfY29ubmVjdGVkKQorCQlsYnNfcHJfZGVidWcoMSwgIkN1cnJlbnQgc3NpZDogJTMyc1xuIiwKKwkJICAgICAgIGFkYXB0ZXItPmN1cmJzc3BhcmFtcy5zc2lkLnNzaWQpOworCisJbGJzX3ByX2RlYnVnKDEsICJTY2FuOiBHZXQ6IG51bWluc2NhbnRhYmxlID0gJWRcbiIsCisJICAgICAgIGFkYXB0ZXItPm51bWluc2NhbnRhYmxlKTsKKworCS8qIFRoZSBvbGQgQVBJIHVzaW5nIFNJT0NHSVdBUExJU1QgaGFkIGEgaGFyZCBsaW1pdCBvZiBJV19NQVhfQVAuCisJICogVGhlIG5ldyBBUEkgdXNpbmcgU0lPQ0dJV1NDQU4gaXMgb25seSBsaW1pdGVkIGJ5IGJ1ZmZlciBzaXplCisJICogV0UtMTQgLT4gV0UtMTYgdGhlIGJ1ZmZlciBpcyBsaW1pdGVkIHRvIElXX1NDQU5fTUFYX0RBVEEgYnl0ZXMKKwkgKiB3aGljaCBpcyA0MDk2LgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5udW1pbnNjYW50YWJsZTsgaSsrKSB7CisJCWlmICgoY3VycmVudF9ldiArIE1BWF9TQ0FOX0NFTExfU0laRSkgPj0gZW5kX2J1ZikgeworCQkJbGJzX3ByX2RlYnVnKDEsICJpPSVkIGJyZWFrIG91dDogY3VycmVudF9ldj0lcCBlbmRfYnVmPSVwICIKKwkJCSAgICAgICAiTUFYX1NDQU5fQ0VMTF9TSVpFPSVkXG4iLAorCQkJICAgICAgIGksIGN1cnJlbnRfZXYsIGVuZF9idWYsIE1BWF9TQ0FOX0NFTExfU0laRSk7CisJCQlicmVhazsKKwkJfQorCisJCXBzY2FudGFibGUgPSAmYWRhcHRlci0+c2NhbnRhYmxlW2ldOworCisJCWxic19wcl9kZWJ1ZygxLCAiaT0lZCAgc3NpZDogJTMyc1xuIiwgaSwgcHNjYW50YWJsZS0+c3NpZC5zc2lkKTsKKworCQljZnAgPQorCQkgICAgbGliZXJ0YXNfZmluZF9jZnBfYnlfYmFuZF9hbmRfY2hhbm5lbChhZGFwdGVyLCAwLAorCQkJCQkJIHBzY2FudGFibGUtPmNoYW5uZWwpOworCQlpZiAoIWNmcCkgeworCQkJbGJzX3ByX2RlYnVnKDEsICJJbnZhbGlkIGNoYW5uZWwgbnVtYmVyICVkXG4iLAorCQkJICAgICAgIHBzY2FudGFibGUtPmNoYW5uZWwpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoIXNzaWRfdmFsaWQoJmFkYXB0ZXItPnNjYW50YWJsZVtpXS5zc2lkKSkgeworCQkJY29udGludWU7CisJCX0KKworCQkvKiBGaXJzdCBlbnRyeSAqTVVTVCogYmUgdGhlIEFQIE1BQyBhZGRyZXNzICovCisJCWl3ZS5jbWQgPSBTSU9DR0lXQVA7CisJCWl3ZS51LmFwX2FkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCQltZW1jcHkoaXdlLnUuYXBfYWRkci5zYV9kYXRhLAorCQkgICAgICAgJmFkYXB0ZXItPnNjYW50YWJsZVtpXS5tYWNhZGRyZXNzLCBFVEhfQUxFTik7CisKKwkJaXdlLmxlbiA9IElXX0VWX0FERFJfTEVOOworCQljdXJyZW50X2V2ID0KKwkJICAgIGl3ZV9zdHJlYW1fYWRkX2V2ZW50KGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsIGl3ZS5sZW4pOworCisJCS8vQWRkIHRoZSBFU1NJRAorCQlpd2UudS5kYXRhLmxlbmd0aCA9IGFkYXB0ZXItPnNjYW50YWJsZVtpXS5zc2lkLnNzaWRsZW5ndGg7CisKKwkJaWYgKGl3ZS51LmRhdGEubGVuZ3RoID4gMzIpIHsKKwkJCWl3ZS51LmRhdGEubGVuZ3RoID0gMzI7CisJCX0KKworCQlpd2UuY21kID0gU0lPQ0dJV0VTU0lEOworCQlpd2UudS5kYXRhLmZsYWdzID0gMTsKKwkJaXdlLmxlbiA9IElXX0VWX1BPSU5UX0xFTiArIGl3ZS51LmRhdGEubGVuZ3RoOworCQljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwKKwkJCQkJCSAgYWRhcHRlci0+c2NhbnRhYmxlW2ldLnNzaWQuCisJCQkJCQkgIHNzaWQpOworCisJCS8vQWRkIG1vZGUKKwkJaXdlLmNtZCA9IFNJT0NHSVdNT0RFOworCQlpd2UudS5tb2RlID0gYWRhcHRlci0+c2NhbnRhYmxlW2ldLmluZnJhbW9kZSArIDE7CisJCWl3ZS5sZW4gPSBJV19FVl9VSU5UX0xFTjsKKwkJY3VycmVudF9ldiA9CisJCSAgICBpd2Vfc3RyZWFtX2FkZF9ldmVudChjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLCBpd2UubGVuKTsKKworCQkvL2ZyZXF1ZW5jeQorCQlpd2UuY21kID0gU0lPQ0dJV0ZSRVE7CisJCWl3ZS51LmZyZXEubSA9IChsb25nKWNmcC0+ZnJlcSAqIDEwMDAwMDsKKwkJaXdlLnUuZnJlcS5lID0gMTsKKwkJaXdlLmxlbiA9IElXX0VWX0ZSRVFfTEVOOworCQljdXJyZW50X2V2ID0KKwkJICAgIGl3ZV9zdHJlYW1fYWRkX2V2ZW50KGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsIGl3ZS5sZW4pOworCisJCS8qIEFkZCBxdWFsaXR5IHN0YXRpc3RpY3MgKi8KKwkJaXdlLmNtZCA9IElXRVZRVUFMOworCQlpd2UudS5xdWFsLnVwZGF0ZWQgPSBJV19RVUFMX0FMTF9VUERBVEVEOworCQlpd2UudS5xdWFsLmxldmVsID0gU0NBTl9SU1NJKGFkYXB0ZXItPnNjYW50YWJsZVtpXS5yc3NpKTsKKworCQlyc3NpID0gaXdlLnUucXVhbC5sZXZlbCAtIE1SVkRSVl9ORl9ERUZBVUxUX1NDQU5fVkFMVUU7CisJCWl3ZS51LnF1YWwucXVhbCA9CisJCSAgICAoMTAwICogUlNTSV9ESUZGICogUlNTSV9ESUZGIC0gKFBFUkZFQ1RfUlNTSSAtIHJzc2kpICoKKwkJICAgICAoMTUgKiAoUlNTSV9ESUZGKSArIDYyICogKFBFUkZFQ1RfUlNTSSAtIHJzc2kpKSkgLworCQkgICAgKFJTU0lfRElGRiAqIFJTU0lfRElGRik7CisJCWlmIChpd2UudS5xdWFsLnF1YWwgPiAxMDApCisJCQlpd2UudS5xdWFsLnF1YWwgPSAxMDA7CisJCWVsc2UgaWYgKGl3ZS51LnF1YWwucXVhbCA8IDEpCisJCQlpd2UudS5xdWFsLnF1YWwgPSAwOworCisJCWlmIChhZGFwdGVyLT5ORltUWVBFX0JFQUNPTl1bVFlQRV9OT0FWR10gPT0gMCkgeworCQkJaXdlLnUucXVhbC5ub2lzZSA9IE1SVkRSVl9ORl9ERUZBVUxUX1NDQU5fVkFMVUU7CisJCX0gZWxzZSB7CisJCQlpd2UudS5xdWFsLm5vaXNlID0KKwkJCSAgICBDQUxfTkYoYWRhcHRlci0+TkZbVFlQRV9CRUFDT05dW1RZUEVfTk9BVkddKTsKKwkJfQorCQlpZiAoKGFkYXB0ZXItPmluZnJhbW9kZSA9PSB3bGFuODAyXzExaWJzcykgJiYKKwkJICAgICFsaWJlcnRhc19TU0lEX2NtcCgmYWRhcHRlci0+Y3VyYnNzcGFyYW1zLnNzaWQsCisJCQkgICAgICZhZGFwdGVyLT5zY2FudGFibGVbaV0uc3NpZCkKKwkJICAgICYmIGFkYXB0ZXItPmFkaG9jY3JlYXRlKSB7CisJCQlyZXQgPSBsaWJlcnRhc19wcmVwYXJlX2FuZF9zZW5kX2NvbW1hbmQocHJpdiwKKwkJCQkJCSAgICBjbWRfODAyXzExX3Jzc2ksCisJCQkJCQkgICAgMCwKKwkJCQkJCSAgICBjbWRfb3B0aW9uX3dhaXRmb3Jyc3AsCisJCQkJCQkgICAgMCwgTlVMTCk7CisKKwkJCWlmICghcmV0KSB7CisJCQkJaXdlLnUucXVhbC5sZXZlbCA9CisJCQkJICAgIENBTF9SU1NJKGFkYXB0ZXItPlNOUltUWVBFX1JYUERdW1RZUEVfQVZHXSAvCisJCQkJCSAgICAgQVZHX1NDQUxFLAorCQkJCQkgICAgIGFkYXB0ZXItPk5GW1RZUEVfUlhQRF1bVFlQRV9BVkddIC8KKwkJCQkJICAgICBBVkdfU0NBTEUpOworCQkJfQorCQl9CisJCWl3ZS5sZW4gPSBJV19FVl9RVUFMX0xFTjsKKwkJY3VycmVudF9ldiA9CisJCSAgICBpd2Vfc3RyZWFtX2FkZF9ldmVudChjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLCBpd2UubGVuKTsKKworCQkvKiBBZGQgZW5jcnlwdGlvbiBjYXBhYmlsaXR5ICovCisJCWl3ZS5jbWQgPSBTSU9DR0lXRU5DT0RFOworCQlpZiAoYWRhcHRlci0+c2NhbnRhYmxlW2ldLnByaXZhY3kpIHsKKwkJCWl3ZS51LmRhdGEuZmxhZ3MgPSBJV19FTkNPREVfRU5BQkxFRCB8IElXX0VOQ09ERV9OT0tFWTsKKwkJfSBlbHNlIHsKKwkJCWl3ZS51LmRhdGEuZmxhZ3MgPSBJV19FTkNPREVfRElTQUJMRUQ7CisJCX0KKwkJaXdlLnUuZGF0YS5sZW5ndGggPSAwOworCQlpd2UubGVuID0gSVdfRVZfUE9JTlRfTEVOICsgaXdlLnUuZGF0YS5sZW5ndGg7CisJCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLAorCQkJCQkJICBhZGFwdGVyLT5zY2FudGFibGUtPnNzaWQuCisJCQkJCQkgIHNzaWQpOworCisJCWN1cnJlbnRfdmFsID0gY3VycmVudF9ldiArIElXX0VWX0xDUF9MRU47CisKKwkJaXdlLmNtZCA9IFNJT0NHSVdSQVRFOworCisJCWl3ZS51LmJpdHJhdGUuZml4ZWQgPSAwOworCQlpd2UudS5iaXRyYXRlLmRpc2FibGVkID0gMDsKKwkJaXdlLnUuYml0cmF0ZS52YWx1ZSA9IDA7CisKKwkJLyogQml0IHJhdGUgZ2l2ZW4gaW4gNTAwIGtiL3MgdW5pdHMgKCsgMHg4MCkgKi8KKwkJZm9yIChqID0gMDsgaiA8IHNpemVvZihhZGFwdGVyLT5zY2FudGFibGVbaV0ubGliZXJ0YXNfc3VwcG9ydGVkX3JhdGVzKTsKKwkJICAgICBqKyspIHsKKwkJCWlmIChhZGFwdGVyLT5zY2FudGFibGVbaV0ubGliZXJ0YXNfc3VwcG9ydGVkX3JhdGVzW2pdID09IDApIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXJhdGUgPQorCQkJICAgIChhZGFwdGVyLT5zY2FudGFibGVbaV0ubGliZXJ0YXNfc3VwcG9ydGVkX3JhdGVzW2pdICYgMHg3RikgKgorCQkJICAgIDUwMDAwMDsKKwkJCWlmIChyYXRlID4gaXdlLnUuYml0cmF0ZS52YWx1ZSkgeworCQkJCWl3ZS51LmJpdHJhdGUudmFsdWUgPSByYXRlOworCQkJfQorCisJCQlpd2UudS5iaXRyYXRlLnZhbHVlID0KKwkJCSAgICAoYWRhcHRlci0+c2NhbnRhYmxlW2ldLmxpYmVydGFzX3N1cHBvcnRlZF9yYXRlc1tqXQorCQkJICAgICAmIDB4N2YpICogNTAwMDAwOworCQkJaXdlLmxlbiA9IElXX0VWX1BBUkFNX0xFTjsKKwkJCWN1cnJlbnRfZXYgPQorCQkJICAgIGl3ZV9zdHJlYW1fYWRkX3ZhbHVlKGN1cnJlbnRfZXYsIGN1cnJlbnRfdmFsLAorCQkJCQkJIGVuZF9idWYsICZpd2UsIGl3ZS5sZW4pOworCisJCX0KKwkJaWYgKChhZGFwdGVyLT5zY2FudGFibGVbaV0uaW5mcmFtb2RlID09IHdsYW44MDJfMTFpYnNzKQorCQkgICAgJiYgIWxpYmVydGFzX1NTSURfY21wKCZhZGFwdGVyLT5jdXJic3NwYXJhbXMuc3NpZCwKKwkJCQkmYWRhcHRlci0+c2NhbnRhYmxlW2ldLnNzaWQpCisJCSAgICAmJiBhZGFwdGVyLT5hZGhvY2NyZWF0ZSkgeworCQkJaXdlLnUuYml0cmF0ZS52YWx1ZSA9IDIyICogNTAwMDAwOworCQl9CisJCWl3ZS5sZW4gPSBJV19FVl9QQVJBTV9MRU47CisJCWN1cnJlbnRfZXYgPQorCQkgICAgaXdlX3N0cmVhbV9hZGRfdmFsdWUoY3VycmVudF9ldiwgY3VycmVudF92YWwsIGVuZF9idWYsICZpd2UsCisJCQkJCSBpd2UubGVuKTsKKworCQkvKiBBZGQgbmV3IHZhbHVlIHRvIGV2ZW50ICovCisJCWN1cnJlbnRfdmFsID0gY3VycmVudF9ldiArIElXX0VWX0xDUF9MRU47CisKKwkJaWYgKGFkYXB0ZXItPnNjYW50YWJsZVtpXS53cGEyX3N1cHBsaWNhbnQud3BhX2llWzBdID09IFdQQTJfSUUpIHsKKwkJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisJCQltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7CisJCQltZW1jcHkoYnVmLCBhZGFwdGVyLT5zY2FudGFibGVbaV0uCisJCQkJCQl3cGEyX3N1cHBsaWNhbnQud3BhX2llLAorCQkJCQlhZGFwdGVyLT5zY2FudGFibGVbaV0ud3BhMl9zdXBwbGljYW50LgorCQkJCQkJd3BhX2llX2xlbik7CisJCQlpd2UuY21kID0gSVdFVkdFTklFOworCQkJaXdlLnUuZGF0YS5sZW5ndGggPSBhZGFwdGVyLT5zY2FudGFibGVbaV0uCisJCQkJCXdwYTJfc3VwcGxpY2FudC53cGFfaWVfbGVuOworCQkJaXdlLmxlbiA9IElXX0VWX1BPSU5UX0xFTiArIGl3ZS51LmRhdGEubGVuZ3RoOworCQkJY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGN1cnJlbnRfZXYsIGVuZF9idWYsCisJCQkJCSZpd2UsIGJ1Zik7CisJCX0KKwkJaWYgKGFkYXB0ZXItPnNjYW50YWJsZVtpXS53cGFfc3VwcGxpY2FudC53cGFfaWVbMF0gPT0gV1BBX0lFKSB7CisJCQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOworCQkJbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOworCQkJbWVtY3B5KGJ1ZiwgYWRhcHRlci0+c2NhbnRhYmxlW2ldLgorCQkJCQkJd3BhX3N1cHBsaWNhbnQud3BhX2llLAorCQkJCQlhZGFwdGVyLT5zY2FudGFibGVbaV0ud3BhX3N1cHBsaWNhbnQuCisJCQkJCQl3cGFfaWVfbGVuKTsKKwkJCWl3ZS5jbWQgPSBJV0VWR0VOSUU7CisJCQlpd2UudS5kYXRhLmxlbmd0aCA9IGFkYXB0ZXItPnNjYW50YWJsZVtpXS4KKwkJCQkJd3BhX3N1cHBsaWNhbnQud3BhX2llX2xlbjsKKwkJCWl3ZS5sZW4gPSBJV19FVl9QT0lOVF9MRU4gKyBpd2UudS5kYXRhLmxlbmd0aDsKKwkJCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChjdXJyZW50X2V2LCBlbmRfYnVmLAorCQkJCQkmaXdlLCBidWYpOworCQl9CisKKworCQlpZiAoYWRhcHRlci0+c2NhbnRhYmxlW2ldLmV4dHJhX2llICE9IDApIHsKKwkJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisJCQltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7CisJCQlwdHIgPSBidWY7CisJCQlwdHIgKz0gc3ByaW50ZihwdHIsICJleHRyYV9pZSIpOworCQkJaXdlLnUuZGF0YS5sZW5ndGggPSBzdHJsZW4oYnVmKTsKKworCQkJbGJzX3ByX2RlYnVnKDEsICJpd2UudS5kYXRhLmxlbmd0aCAlZFxuIiwKKwkJCSAgICAgICBpd2UudS5kYXRhLmxlbmd0aCk7CisJCQlsYnNfcHJfZGVidWcoMSwgIkJVRjogJXMgXG4iLCBidWYpOworCisJCQlpd2UuY21kID0gSVdFVkNVU1RPTTsKKwkJCWl3ZS5sZW4gPSBJV19FVl9QT0lOVF9MRU4gKyBpd2UudS5kYXRhLmxlbmd0aDsKKwkJCWN1cnJlbnRfZXYgPQorCQkJICAgIGl3ZV9zdHJlYW1fYWRkX3BvaW50KGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsCisJCQkJCQkgYnVmKTsKKwkJfQorCisJCWN1cnJlbnRfdmFsID0gY3VycmVudF9ldiArIElXX0VWX0xDUF9MRU47CisKKwkJLyoKKwkJICogQ2hlY2sgaWYgd2UgYWRkZWQgYW55IGV2ZW50CisJCSAqLworCQlpZiAoKGN1cnJlbnRfdmFsIC0gY3VycmVudF9ldikgPiBJV19FVl9MQ1BfTEVOKQorCQkJY3VycmVudF9ldiA9IGN1cnJlbnRfdmFsOworCX0KKworCWR3cnEtPmxlbmd0aCA9IChjdXJyZW50X2V2IC0gZXh0cmEpOworCWR3cnEtPmZsYWdzID0gMDsKKworCUxFQVZFKCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogIEBicmllZiBQcmVwYXJlIGEgc2NhbiBjb21tYW5kIHRvIGJlIHNlbnQgdG8gdGhlIGZpcm13YXJlCisgKgorICogIFVzZSB0aGUgd2xhbl9zY2FuX2NtZF9jb25maWcgc2VudCB0byB0aGUgY29tbWFuZCBwcm9jZXNzaW5nIG1vZHVsZSBpbgorICogICB0aGUgbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kIHRvIGNvbmZpZ3VyZSBhIGNtZF9kc184MDJfMTFfc2NhbiBjb21tYW5kCisgKiAgIHN0cnVjdCB0byBzZW5kIHRvIGZpcm13YXJlLgorICoKKyAqICBUaGUgZml4ZWQgZmllbGRzIHNwZWNpZnlpbmcgdGhlIEJTUyB0eXBlIGFuZCBCU1NJRCBmaWx0ZXJzIGFzIHdlbGwgYXMgYQorICogICB2YXJpYWJsZSBudW1iZXIvbGVuZ3RoIG9mIFRMVnMgYXJlIHNlbnQgaW4gdGhlIGNvbW1hbmQgdG8gZmlybXdhcmUuCisgKgorICogIEBwYXJhbSBwcml2ICAgICAgIEEgcG9pbnRlciB0byB3bGFuX3ByaXZhdGUgc3RydWN0dXJlCisgKiAgQHBhcmFtIGNtZCAgICAgICAgQSBwb2ludGVyIHRvIGNtZF9kc19jb21tYW5kIHN0cnVjdHVyZSB0byBiZSBzZW50IHRvCisgKiAgICAgICAgICAgICAgICAgICAgZmlybXdhcmUgd2l0aCB0aGUgY21kX0RTXzgwMV8xMV9TQ0FOIHN0cnVjdHVyZQorICogIEBwYXJhbSBwZGF0YV9idWYgIFZvaWQgcG9pbnRlciBjYXN0IG9mIGEgd2xhbl9zY2FuX2NtZF9jb25maWcgc3RydWN0IHVzZWQKKyAqICAgICAgICAgICAgICAgICAgICB0byBzZXQgdGhlIGZpZWxkcy9UTFZzIGZvciB0aGUgY29tbWFuZCBzZW50IHRvIGZpcm13YXJlCisgKgorICogIEByZXR1cm4gICAgICAgICAgIDAgb3IgLTEKKyAqCisgKiAgQHNhIHdsYW5fc2Nhbl9jcmVhdGVfY2hhbm5lbF9saXN0CisgKi8KK2ludCBsaWJlcnRhc19jbWRfODAyMTFfc2Nhbih3bGFuX3ByaXZhdGUgKiBwcml2LAorCQkJIHN0cnVjdCBjbWRfZHNfY29tbWFuZCAqY21kLCB2b2lkICpwZGF0YV9idWYpCit7CisJc3RydWN0IGNtZF9kc184MDJfMTFfc2NhbiAqcHNjYW4gPSAmY21kLT5wYXJhbXMuc2NhbjsKKwlzdHJ1Y3Qgd2xhbl9zY2FuX2NtZF9jb25maWcgKnBzY2FuY2ZnOworCisJRU5URVIoKTsKKworCXBzY2FuY2ZnID0gcGRhdGFfYnVmOworCisJLyogU2V0IGZpeGVkIGZpZWxkIHZhcmlhYmxlcyBpbiBzY2FuIGNvbW1hbmQgKi8KKwlwc2Nhbi0+YnNzdHlwZSA9IHBzY2FuY2ZnLT5ic3N0eXBlOworCW1lbWNweShwc2Nhbi0+QlNTSUQsIHBzY2FuY2ZnLT5zcGVjaWZpY0JTU0lELCBzaXplb2YocHNjYW4tPkJTU0lEKSk7CisJbWVtY3B5KHBzY2FuLT50bHZidWZmZXIsIHBzY2FuY2ZnLT50bHZidWZmZXIsIHBzY2FuY2ZnLT50bHZidWZmZXJsZW4pOworCisJY21kLT5jb21tYW5kID0gY3B1X3RvX2xlMTYoY21kXzgwMl8xMV9zY2FuKTsKKworCS8qIHNpemUgaXMgZXF1YWwgdG8gdGhlIHNpemVvZihmaXhlZCBwb3J0aW9ucykgKyB0aGUgVExWIGxlbiArIGhlYWRlciAqLworCWNtZC0+c2l6ZSA9IGNwdV90b19sZTE2KHNpemVvZihwc2Nhbi0+YnNzdHlwZSkKKwkJCQkgICAgICsgc2l6ZW9mKHBzY2FuLT5CU1NJRCkKKwkJCQkgICAgICsgcHNjYW5jZmctPnRsdmJ1ZmZlcmxlbiArIFNfRFNfR0VOKTsKKworCWxic19wcl9kZWJ1ZygxLCAiU0NBTl9DTUQ6IGNvbW1hbmQ9JXgsIHNpemU9JXgsIHNlcW51bT0leFxuIiwKKwkgICAgICAgY21kLT5jb21tYW5kLCBjbWQtPnNpemUsIGNtZC0+c2VxbnVtKTsKKwlMRUFWRSgpOworCXJldHVybiAwOworfQorCisvKioKKyAqICBAYnJpZWYgVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRoZSBjb21tYW5kIHJlc3BvbnNlIG9mIHNjYW4KKyAqCisgKiAgIFRoZSByZXNwb25zZSBidWZmZXIgZm9yIHRoZSBzY2FuIGNvbW1hbmQgaGFzIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgbWVtb3J5IGxheW91dDoKKyAqCisgKiAgICAgLi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorICogICAgIHwgIGhlYWRlciAoNCAqIHNpemVvZih1MTYpKTogIFN0YW5kYXJkIGNvbW1hbmQgcmVzcG9uc2UgaGRyIHwKKyAqICAgICAuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCisgKiAgICAgfCAgYnVmc2l6ZSAodTE2KSA6IHNpemVvZiB0aGUgQlNTIERlc2NyaXB0aW9uIGRhdGEgICAgICAgICAgfAorICogICAgIC4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KKyAqICAgICB8ICBOdW1PZlNldCAodTgpIDogTnVtYmVyIG9mIEJTUyBEZXNjcyByZXR1cm5lZCAgICAgICAgICAgICB8CisgKiAgICAgLi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorICogICAgIHwgIEJTU0Rlc2NyaXB0aW9uIGRhdGEgKHZhcmlhYmxlLCBzaXplIGdpdmVuIGluIGJ1ZnNpemUpICAgIHwKKyAqICAgICAuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCisgKiAgICAgfCAgVExWIGRhdGEgKHZhcmlhYmxlLCBzaXplIGNhbGN1bGF0ZWQgdXNpbmcgaGVhZGVyLT5zaXplLCAgfAorICogICAgIHwgICAgICAgICAgICBidWZzaXplIGFuZCBzaXplb2YgdGhlIGZpeGVkIGZpZWxkcyBhYm92ZSkgICAgIHwKKyAqICAgICAuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCisgKgorICogIEBwYXJhbSBwcml2ICAgIEEgcG9pbnRlciB0byB3bGFuX3ByaXZhdGUgc3RydWN0dXJlCisgKiAgQHBhcmFtIHJlc3AgICAgQSBwb2ludGVyIHRvIGNtZF9kc19jb21tYW5kCisgKgorICogIEByZXR1cm4gICAgICAgIDAgb3IgLTEKKyAqLworaW50IGxpYmVydGFzX3JldF84MDIxMV9zY2FuKHdsYW5fcHJpdmF0ZSAqIHByaXYsIHN0cnVjdCBjbWRfZHNfY29tbWFuZCAqcmVzcCkKK3sKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCXN0cnVjdCBjbWRfZHNfODAyXzExX3NjYW5fcnNwICpwc2NhbjsKKwlzdHJ1Y3QgYnNzX2Rlc2NyaXB0b3IgbmV3YnNzZW50cnk7CisJc3RydWN0IG1ydmxpZXR5cGVzX2RhdGEgKnB0bHY7CisJc3RydWN0IG1ydmxpZXR5cGVzX3RzZnRpbWVzdGFtcCAqcHRzZnRsdjsKKwl1OCAqcGJzc2luZm87CisJdTE2IHNjYW5yZXNwc2l6ZTsKKwlpbnQgYnl0ZXNsZWZ0OworCWludCBudW1pbnRhYmxlOworCWludCBic3NJZHg7CisJaW50IGlkeDsKKwlpbnQgdGx2YnVmc2l6ZTsKKwl1NjQgdHNmdmFsOworCisJRU5URVIoKTsKKworCXBzY2FuID0gJnJlc3AtPnBhcmFtcy5zY2FucmVzcDsKKworCWlmIChwc2Nhbi0+bnJfc2V0cyA+IE1SVkRSVl9NQVhfQlNTSURfTElTVCkgeworICAgICAgICBsYnNfcHJfZGVidWcoMSwKKwkJICAgICAgICJTQ0FOX1JFU1A6IEludmFsaWQgbnVtYmVyIG9mIEFQIHJldHVybmVkICglZCkhIVxuIiwKKwkJICAgICAgIHBzY2FuLT5ucl9zZXRzKTsKKwkJTEVBVkUoKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWJ5dGVzbGVmdCA9IGxlMTZfdG9fY3B1KHBzY2FuLT5ic3NkZXNjcmlwdHNpemUpOworCWxic19wcl9kZWJ1ZygxLCAiU0NBTl9SRVNQOiBic3NkZXNjcmlwdHNpemUgJWRcbiIsIGJ5dGVzbGVmdCk7CisKKwlzY2FucmVzcHNpemUgPSBsZTE2X3RvX2NwdShyZXNwLT5zaXplKTsKKwlsYnNfcHJfZGVidWcoMSwgIlNDQU5fUkVTUDogcmV0dXJuZWQgJWQgQVAgYmVmb3JlIHBhcnNpbmdcbiIsCisJICAgICAgIHBzY2FuLT5ucl9zZXRzKTsKKworCW51bWludGFibGUgPSBhZGFwdGVyLT5udW1pbnNjYW50YWJsZTsKKwlwYnNzaW5mbyA9IHBzY2FuLT5ic3NkZXNjX2FuZF90bHZidWZmZXI7CisKKwkvKiBUaGUgc2l6ZSBvZiB0aGUgVExWIGJ1ZmZlciBpcyBlcXVhbCB0byB0aGUgZW50aXJlIGNvbW1hbmQgcmVzcG9uc2UKKwkgKiAgIHNpemUgKHNjYW5yZXNwc2l6ZSkgbWludXMgdGhlIGZpeGVkIGZpZWxkcyAoc2l6ZW9mKCkncyksIHRoZQorCSAqICAgQlNTIERlc2NyaXB0aW9ucyAoYnNzZGVzY3JpcHRzaXplIGFzIGJ5dGVzTGVmKSBhbmQgdGhlIGNvbW1hbmQKKwkgKiAgIHJlc3BvbnNlIGhlYWRlciAoU19EU19HRU4pCisJICovCisJdGx2YnVmc2l6ZSA9IHNjYW5yZXNwc2l6ZSAtIChieXRlc2xlZnQgKyBzaXplb2YocHNjYW4tPmJzc2Rlc2NyaXB0c2l6ZSkKKwkJCQkgICAgICsgc2l6ZW9mKHBzY2FuLT5ucl9zZXRzKQorCQkJCSAgICAgKyBTX0RTX0dFTik7CisKKwlwdGx2ID0gKHN0cnVjdCBtcnZsaWV0eXBlc19kYXRhICopIChwc2Nhbi0+YnNzZGVzY19hbmRfdGx2YnVmZmVyICsgYnl0ZXNsZWZ0KTsKKworCS8qIFNlYXJjaCB0aGUgVExWIGJ1ZmZlciBzcGFjZSBpbiB0aGUgc2NhbiByZXNwb25zZSBmb3IgYW55IHZhbGlkIFRMVnMgKi8KKwl3bGFuX3JldF84MDJfMTFfc2Nhbl9nZXRfdGx2X3B0cnMocHRsdiwgdGx2YnVmc2l6ZSwgJnB0c2Z0bHYpOworCisJLyoKKwkgKiAgUHJvY2VzcyBlYWNoIHNjYW4gcmVzcG9uc2UgcmV0dXJuZWQgKHBzY2FuLT5ucl9zZXRzKS4gIFNhdmUKKwkgKiAgICB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIG5ld2Jzc2VudHJ5IGFuZCB0aGVuIGluc2VydCBpbnRvIHRoZQorCSAqICAgIGRyaXZlciBzY2FuIHRhYmxlIGVpdGhlciBhcyBhbiB1cGRhdGUgdG8gYW4gZXhpc3RpbmcgZW50cnkKKwkgKiAgICBvciBhcyBhbiBhZGRpdGlvbiBhdCB0aGUgZW5kIG9mIHRoZSB0YWJsZQorCSAqLworCWZvciAoaWR4ID0gMDsgaWR4IDwgcHNjYW4tPm5yX3NldHMgJiYgYnl0ZXNsZWZ0OyBpZHgrKykgeworCQkvKiBaZXJvIG91dCB0aGUgbmV3YnNzZW50cnkgd2UgYXJlIGFib3V0IHRvIHN0b3JlIGluZm8gaW4gKi8KKwkJbWVtc2V0KCZuZXdic3NlbnRyeSwgMHgwMCwgc2l6ZW9mKG5ld2Jzc2VudHJ5KSk7CisKKwkJLyogUHJvY2VzcyB0aGUgZGF0YSBmaWVsZHMgYW5kIElFcyByZXR1cm5lZCBmb3IgdGhpcyBCU1MgKi8KKwkJaWYgKChJbnRlcnByZXRCU1NEZXNjcmlwdGlvbldpdGhJRSgmbmV3YnNzZW50cnksCisJCQkJCQkgICAmcGJzc2luZm8sCisJCQkJCQkgICAmYnl0ZXNsZWZ0KSA9PQorCQkgICAgIDApCisJCSAgICAmJiBDSEVDS19TU0lEX0lTX1ZBTElEKCZuZXdic3NlbnRyeS5zc2lkKSkgeworCisgICAgICAgICAgICBsYnNfcHJfZGVidWcoMSwKKwkJCSAgICAgICAiU0NBTl9SRVNQOiBCU1NJRCA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQkJICAgICAgIG5ld2Jzc2VudHJ5Lm1hY2FkZHJlc3NbMF0sCisJCQkgICAgICAgbmV3YnNzZW50cnkubWFjYWRkcmVzc1sxXSwKKwkJCSAgICAgICBuZXdic3NlbnRyeS5tYWNhZGRyZXNzWzJdLAorCQkJICAgICAgIG5ld2Jzc2VudHJ5Lm1hY2FkZHJlc3NbM10sCisJCQkgICAgICAgbmV3YnNzZW50cnkubWFjYWRkcmVzc1s0XSwKKwkJCSAgICAgICBuZXdic3NlbnRyeS5tYWNhZGRyZXNzWzVdKTsKKworCQkJLyoKKwkJCSAqIFNlYXJjaCB0aGUgc2NhbiB0YWJsZSBmb3IgdGhlIHNhbWUgYnNzaWQKKwkJCSAqLworCQkJZm9yIChic3NJZHggPSAwOyBic3NJZHggPCBudW1pbnRhYmxlOyBic3NJZHgrKykgeworCQkJCWlmIChtZW1jbXAobmV3YnNzZW50cnkubWFjYWRkcmVzcywKKwkJCQkJICAgYWRhcHRlci0+c2NhbnRhYmxlW2Jzc0lkeF0uCisJCQkJCSAgIG1hY2FkZHJlc3MsCisJCQkJCSAgIHNpemVvZihuZXdic3NlbnRyeS5tYWNhZGRyZXNzKSkgPT0KKwkJCQkgICAgMCkgeworCQkJCQkvKgorCQkJCQkgKiBJZiB0aGUgU1NJRCBtYXRjaGVzIGFzIHdlbGwsIGl0IGlzIGEgZHVwbGljYXRlIG9mCisJCQkJCSAqICAgdGhpcyBlbnRyeS4gIEtlZXAgdGhlIGJzc0lkeCBzZXQgdG8gdGhpcworCQkJCQkgKiAgIGVudHJ5IHNvIHdlIHJlcGxhY2UgdGhlIG9sZCBjb250ZW50cyBpbiB0aGUgdGFibGUKKwkJCQkJICovCisJCQkJCWlmICgobmV3YnNzZW50cnkuc3NpZC5zc2lkbGVuZ3RoID09CisJCQkJCSAgICAgYWRhcHRlci0+c2NhbnRhYmxlW2Jzc0lkeF0uc3NpZC4KKwkJCQkJICAgICBzc2lkbGVuZ3RoKQorCQkJCQkgICAgJiYKKwkJCQkJICAgIChtZW1jbXAKKwkJCQkJICAgICAobmV3YnNzZW50cnkuc3NpZC5zc2lkLAorCQkJCQkgICAgICBhZGFwdGVyLT5zY2FudGFibGVbYnNzSWR4XS5zc2lkLgorCQkJCQkgICAgICBzc2lkLAorCQkJCQkgICAgICBuZXdic3NlbnRyeS5zc2lkLnNzaWRsZW5ndGgpID09CisJCQkJCSAgICAgMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxic19wcl9kZWJ1ZygxLAorCQkJCQkJICAgICAgICJTQ0FOX1JFU1A6IER1cGxpY2F0ZSBvZiBpbmRleDogJWRcbiIsCisJCQkJCQkgICAgICAgYnNzSWR4KTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJLyoKKwkJCSAqIElmIHRoZSBic3NJZHggaXMgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSB0YWJsZSwKKwkJCSAqICAgdGhlIG5ldyBlbnRyeSB3YXMgbm90IGEgZHVwbGljYXRlOyBhcHBlbmQgaXQgdG8gdGhlIHNjYW4KKwkJCSAqICAgdGFibGUKKwkJCSAqLworCQkJaWYgKGJzc0lkeCA9PSBudW1pbnRhYmxlKSB7CisJCQkJLyogUmFuZ2UgY2hlY2sgdGhlIGJzc0lkeCwga2VlcCBpdCBsaW1pdGVkIHRvIHRoZSBsYXN0IGVudHJ5ICovCisJCQkJaWYgKGJzc0lkeCA9PSBNUlZEUlZfTUFYX0JTU0lEX0xJU1QpIHsKKwkJCQkJYnNzSWR4LS07CisJCQkJfSBlbHNlIHsKKwkJCQkJbnVtaW50YWJsZSsrOworCQkJCX0KKwkJCX0KKworCQkJLyoKKwkJCSAqIElmIHRoZSBUU0YgVExWIHdhcyBhcHBlbmRlZCB0byB0aGUgc2NhbiByZXN1bHRzLCBzYXZlIHRoZQorCQkJICogICB0aGlzIGVudHJpZXMgVFNGIHZhbHVlIGluIHRoZSBuZXR3b3JrdHNmIGZpZWxkLiAgVGhlCisJCQkgKiAgIG5ldHdvcmt0c2YgaXMgdGhlIGZpcm13YXJlJ3MgVFNGIHZhbHVlIGF0IHRoZSB0aW1lIHRoZQorCQkJICogICBiZWFjb24gb3IgcHJvYmUgcmVzcG9uc2Ugd2FzIHJlY2VpdmVkLgorCQkJICovCisJCQlpZiAocHRzZnRsdikgeworCQkJCW1lbWNweSgmdHNmdmFsLCAmcHRzZnRsdi0+dHNmdGFibGVbaWR4XSwKKwkJCQkgICAgICAgc2l6ZW9mKHRzZnZhbCkpOworCQkJCXRzZnZhbCA9IGxlNjRfdG9fY3B1KHRzZnZhbCk7CisKKwkJCQltZW1jcHkoJm5ld2Jzc2VudHJ5Lm5ldHdvcmt0c2YsCisJCQkJICAgICAgICZ0c2Z2YWwsIHNpemVvZihuZXdic3NlbnRyeS5uZXR3b3JrdHNmKSk7CisJCQl9CisKKwkJCS8qIENvcHkgdGhlIGxvY2FsbHkgY3JlYXRlZCBuZXdic3NlbnRyeSB0byB0aGUgc2NhbiB0YWJsZSAqLworCQkJbWVtY3B5KCZhZGFwdGVyLT5zY2FudGFibGVbYnNzSWR4XSwKKwkJCSAgICAgICAmbmV3YnNzZW50cnksCisJCQkgICAgICAgc2l6ZW9mKGFkYXB0ZXItPnNjYW50YWJsZVtic3NJZHhdKSk7CisKKwkJfSBlbHNlIHsKKworCQkJLyogZXJyb3IgcGFyc2luZy9pbnRlcnByZXRpbmcgdGhlIHNjYW4gcmVzcG9uc2UsIHNraXBwZWQgKi8KKwkJCWxic19wcl9kZWJ1ZygxLCAiU0NBTl9SRVNQOiAiCisJCQkgICAgICAgIkludGVycHJldEJTU0Rlc2NyaXB0aW9uV2l0aElFIHJldHVybmVkIEVSUk9SXG4iKTsKKwkJfQorCX0KKworCWxic19wcl9kZWJ1ZygxLCAiU0NBTl9SRVNQOiBTY2FubmVkICUyZCBBUHMsICVkIHZhbGlkLCAlZCB0b3RhbFxuIiwKKwkgICAgICAgcHNjYW4tPm5yX3NldHMsIG51bWludGFibGUgLSBhZGFwdGVyLT5udW1pbnNjYW50YWJsZSwKKwkgICAgICAgbnVtaW50YWJsZSk7CisKKwkvKiBVcGRhdGUgdGhlIHRvdGFsIG51bWJlciBvZiBCU1NJRHMgaW4gdGhlIHNjYW4gdGFibGUgKi8KKwlhZGFwdGVyLT5udW1pbnNjYW50YWJsZSA9IG51bWludGFibGU7CisKKwlMRUFWRSgpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvc2Nhbi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvc2Nhbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5M2FhN2YKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9zY2FuLmgKQEAgLTAsMCArMSwyMTYgQEAKKy8qIC0qLSBtb2RlOiBDOyB0YWItd2lkdGg6IDQ7IGluZGVudC10YWJzLW1vZGU6IG5pbCAtKi0gKi8KKy8qIHZpOiBzZXQgZXhwYW5kdGFiIHNoaWZ0d2lkdGg9NCB0YWJzdG9wPTQgdGV4dHdpZHRoPTc4OiAqLworCisvKioKKyAgKiBJbnRlcmZhY2UgZm9yIHRoZSB3bGFuIG5ldHdvcmsgc2NhbiByb3V0aW5lcworICAqCisgICogRHJpdmVyIGludGVyZmFjZSBmdW5jdGlvbnMgYW5kIHR5cGUgZGVjbGFyYXRpb25zIGZvciB0aGUgc2NhbiBtb2R1bGUKKyAgKiAgIGltcGxlbWVudGVkIGluIHdsYW5fc2Nhbi5jLgorICAqLworI2lmbmRlZiBfV0xBTl9TQ0FOX0gKKyNkZWZpbmUgX1dMQU5fU0NBTl9ICisKKyNpbmNsdWRlICJob3N0Y21kLmgiCisKKy8qKgorICogIEBicmllZiBNYXhpbXVtIG51bWJlciBvZiBjaGFubmVscyB0aGF0IGNhbiBiZSBzZW50IGluIGEgc2V0dXNlcnNjYW4gaW9jdGwKKyAqCisgKiAgQHNhIHdsYW5faW9jdGxfdXNlcl9zY2FuX2NmZworICovCisjZGVmaW5lIFdMQU5fSU9DVExfVVNFUl9TQ0FOX0NIQU5fTUFYICA1MAorCisvLyEgSW5mcmFzdHJ1Y3R1cmUgQlNTIHNjYW4gdHlwZSBpbiB3bGFuX3NjYW5fY21kX2NvbmZpZworI2RlZmluZSBXTEFOX1NDQU5fQlNTX1RZUEVfQlNTICAgICAgICAgMQorCisvLyEgQWRob2MgQlNTIHNjYW4gdHlwZSBpbiB3bGFuX3NjYW5fY21kX2NvbmZpZworI2RlZmluZSBXTEFOX1NDQU5fQlNTX1RZUEVfSUJTUyAgICAgICAgMgorCisvLyEgQWRob2Mgb3IgSW5mcmFzdHJ1Y3R1cmUgQlNTIHNjYW4gdHlwZSBpbiB3bGFuX3NjYW5fY21kX2NvbmZpZywgbm8gZmlsdGVyCisjZGVmaW5lIFdMQU5fU0NBTl9CU1NfVFlQRV9BTlkgICAgICAgICAzCisKKy8qKgorICogQGJyaWVmIFN0cnVjdHVyZSB1c2VkIGludGVybmFsbHkgaW4gdGhlIHdsYW4gZHJpdmVyIHRvIGNvbmZpZ3VyZSBhIHNjYW4uCisgKgorICogU2VudCB0byB0aGUgY29tbWFuZCBwcm9jZXNzaW5nIG1vZHVsZSB0byBjb25maWd1cmUgdGhlIGZpcm13YXJlCisgKiAgIHNjYW4gY29tbWFuZCBwcmVwYXJlZCBieSBsaWJlcnRhc19jbWRfODAyMTFfc2Nhbi4KKyAqCisgKiBAc2Egd2xhbl9zY2FuX25ldHdvcmtzCisgKgorICovCitzdHJ1Y3Qgd2xhbl9zY2FuX2NtZF9jb25maWcgeworICAgIC8qKgorICAgICAqICBAYnJpZWYgQlNTIHR5cGUgdG8gYmUgc2VudCBpbiB0aGUgZmlybXdhcmUgY29tbWFuZAorICAgICAqCisgICAgICogIEZpZWxkIGNhbiBiZSB1c2VkIHRvIHJlc3RyaWN0IHRoZSB0eXBlcyBvZiBuZXR3b3JrcyByZXR1cm5lZCBpbiB0aGUKKyAgICAgKiAgICBzY2FuLiAgdmFsaWQgc2V0dGluZ3MgYXJlOgorICAgICAqCisgICAgICogICAtIFdMQU5fU0NBTl9CU1NfVFlQRV9CU1MgIChpbmZyYXN0cnVjdHVyZSkKKyAgICAgKiAgIC0gV0xBTl9TQ0FOX0JTU19UWVBFX0lCU1MgKGFkaG9jKQorICAgICAqICAgLSBXTEFOX1NDQU5fQlNTX1RZUEVfQU5ZICAodW5yZXN0cmljdGVkLCBhZGhvYyBhbmQgaW5mcmFzdHJ1Y3R1cmUpCisgICAgICovCisJdTggYnNzdHlwZTsKKworICAgIC8qKgorICAgICAqICBAYnJpZWYgU3BlY2lmaWMgQlNTSUQgdXNlZCB0byBmaWx0ZXIgc2NhbiByZXN1bHRzIGluIHRoZSBmaXJtd2FyZQorICAgICAqLworCXU4IHNwZWNpZmljQlNTSURbRVRIX0FMRU5dOworCisgICAgLyoqCisgICAgICogIEBicmllZiBsZW5ndGggb2YgVExWcyBzZW50IGluIGNvbW1hbmQgc3RhcnRpbmcgYXQgdGx2QnVmZmVyCisgICAgICovCisJaW50IHRsdmJ1ZmZlcmxlbjsKKworICAgIC8qKgorICAgICAqICBAYnJpZWYgU1NJRCBUTFYocykgYW5kIENoYW5MaXN0IFRMVnMgdG8gYmUgc2VudCBpbiB0aGUgZmlybXdhcmUgY29tbWFuZAorICAgICAqCisgICAgICogIEBzYSBUTFZfVFlQRV9DSEFOTElTVCwgbXJ2bGlldHlwZXNfY2hhbmxpc3RwYXJhbXNldF90CisgICAgICogIEBzYSBUTFZfVFlQRV9TU0lELCBtcnZsaWV0eXBlc19zc2lkcGFyYW1zZXRfdAorICAgICAqLworCXU4IHRsdmJ1ZmZlclsxXTsJLy8hPCBTU0lEIFRMVihzKSBhbmQgQ2hhbkxpc3QgVExWcyBhcmUgc3RvcmVkIGhlcmUKK307CisKKy8qKgorICogIEBicmllZiBJT0NUTCBjaGFubmVsIHN1Yi1zdHJ1Y3R1cmUgc2VudCBpbiB3bGFuX2lvY3RsX3VzZXJfc2Nhbl9jZmcKKyAqCisgKiAgTXVsdGlwbGUgaW5zdGFuY2VzIG9mIHRoaXMgc3RydWN0dXJlIGFyZSBpbmNsdWRlZCBpbiB0aGUgSU9DVEwgY29tbWFuZAorICogICB0byBjb25maWd1cmUgYSBpbnN0YW5jZSBvZiBhIHNjYW4gb24gdGhlIHNwZWNpZmljIGNoYW5uZWwuCisgKi8KK3N0cnVjdCB3bGFuX2lvY3RsX3VzZXJfc2Nhbl9jaGFuIHsKKwl1OCBjaGFubnVtYmVyOwkJLy8hPCBjaGFubmVsIE51bWJlciB0byBzY2FuCisJdTggcmFkaW90eXBlOwkJLy8hPCBSYWRpbyB0eXBlOiAnQi9HJyBiYW5kID0gMCwgJ0EnIGJhbmQgPSAxCisJdTggc2NhbnR5cGU7CQkvLyE8IFNjYW4gdHlwZTogQWN0aXZlID0gMCwgUGFzc2l2ZSA9IDEKKwl1MTYgc2NhbnRpbWU7CQkvLyE8IFNjYW4gZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzOyBpZiAwIGRlZmF1bHQgdXNlZAorfTsKKworLyoqCisgKiAgQGJyaWVmIElPQ1RMIGlucHV0IHN0cnVjdHVyZSB0byBjb25maWd1cmUgYW4gaW1tZWRpYXRlIHNjYW4gY21kIHRvIGZpcm13YXJlCisgKgorICogIFVzZWQgaW4gdGhlIHNldHVzZXJzY2FuIChXTEFOX1NFVF9VU0VSX1NDQU4pIHByaXZhdGUgaW9jdGwuICBTcGVjaWZpZXMKKyAqICAgYSBudW1iZXIgb2YgcGFyYW1ldGVycyB0byBiZSB1c2VkIGluIGdlbmVyYWwgZm9yIHRoZSBzY2FuIGFzIHdlbGwKKyAqICAgYXMgYSBjaGFubmVsIGxpc3QgKHdsYW5faW9jdGxfdXNlcl9zY2FuX2NoYW4pIGZvciBlYWNoIHNjYW4gcGVyaW9kCisgKiAgIGRlc2lyZWQuCisgKgorICogIEBzYSBsaWJlcnRhc19zZXRfdXNlcl9zY2FuX2lvY3RsCisgKi8KK3N0cnVjdCB3bGFuX2lvY3RsX3VzZXJfc2Nhbl9jZmcgeworCisgICAgLyoqCisgICAgICogIEBicmllZiBGbGFnIHNldCB0byBrZWVwIHRoZSBwcmV2aW91cyBzY2FuIHRhYmxlIGludGFjdAorICAgICAqCisgICAgICogIElmIHNldCwgdGhlIHNjYW4gcmVzdWx0cyB3aWxsIGFjY3VtdWxhdGUsIHJlcGxhY2luZyBhbnkgcHJldmlvdXMKKyAgICAgKiAgIG1hdGNoZWQgZW50cmllcyBmb3IgYSBCU1Mgd2l0aCB0aGUgbmV3IHNjYW4gZGF0YQorICAgICAqLworCXU4IGtlZXBwcmV2aW91c3NjYW47CS8vITwgRG8gbm90IGVyYXNlIHRoZSBleGlzdGluZyBzY2FuIHJlc3VsdHMKKworICAgIC8qKgorICAgICAqICBAYnJpZWYgQlNTIHR5cGUgdG8gYmUgc2VudCBpbiB0aGUgZmlybXdhcmUgY29tbWFuZAorICAgICAqCisgICAgICogIEZpZWxkIGNhbiBiZSB1c2VkIHRvIHJlc3RyaWN0IHRoZSB0eXBlcyBvZiBuZXR3b3JrcyByZXR1cm5lZCBpbiB0aGUKKyAgICAgKiAgICBzY2FuLiAgdmFsaWQgc2V0dGluZ3MgYXJlOgorICAgICAqCisgICAgICogICAtIFdMQU5fU0NBTl9CU1NfVFlQRV9CU1MgIChpbmZyYXN0cnVjdHVyZSkKKyAgICAgKiAgIC0gV0xBTl9TQ0FOX0JTU19UWVBFX0lCU1MgKGFkaG9jKQorICAgICAqICAgLSBXTEFOX1NDQU5fQlNTX1RZUEVfQU5ZICAodW5yZXN0cmljdGVkLCBhZGhvYyBhbmQgaW5mcmFzdHJ1Y3R1cmUpCisgICAgICovCisJdTggYnNzdHlwZTsKKworICAgIC8qKgorICAgICAqICBAYnJpZWYgQ29uZmlndXJlIHRoZSBudW1iZXIgb2YgcHJvYmUgcmVxdWVzdHMgZm9yIGFjdGl2ZSBjaGFuIHNjYW5zCisgICAgICovCisJdTggbnVtcHJvYmVzOworCisgICAgLyoqCisgICAgICogIEBicmllZiBCU1NJRCBmaWx0ZXIgc2VudCBpbiB0aGUgZmlybXdhcmUgY29tbWFuZCB0byBsaW1pdCB0aGUgcmVzdWx0cworICAgICAqLworCXU4IHNwZWNpZmljQlNTSURbRVRIX0FMRU5dOworCisgICAgLyoqCisgICAgICogIEBicmllZiBTU0lEIGZpbHRlciBzZW50IGluIHRoZSBmaXJtd2FyZSBjb21tYW5kIHRvIGxpbWl0IHRoZSByZXN1bHRzCisgICAgICovCisJY2hhciBzcGVjaWZpY1NTSURbSVdfRVNTSURfTUFYX1NJWkUgKyAxXTsKKworICAgIC8qKgorICAgICAqICBAYnJpZWYgVmFyaWFibGUgbnVtYmVyIChmaXhlZCBtYXhpbXVtKSBvZiBjaGFubmVscyB0byBzY2FuIHVwCisgICAgICovCisJc3RydWN0IHdsYW5faW9jdGxfdXNlcl9zY2FuX2NoYW4gY2hhbmxpc3RbV0xBTl9JT0NUTF9VU0VSX1NDQU5fQ0hBTl9NQVhdOworfTsKKworLyoqCisgKiAgQGJyaWVmIFN0cnVjdHVyZSB1c2VkIHRvIHN0b3JlIGluZm9ybWF0aW9uIGZvciBlYWNoIGJlYWNvbi9wcm9iZSByZXNwb25zZQorICovCitzdHJ1Y3QgYnNzX2Rlc2NyaXB0b3IgeworCXU4IG1hY2FkZHJlc3NbRVRIX0FMRU5dOworCisJc3RydWN0IFdMQU5fODAyXzExX1NTSUQgc3NpZDsKKworCS8qIFdFUCBlbmNyeXB0aW9uIHJlcXVpcmVtZW50ICovCisJdTMyIHByaXZhY3k7CisKKwkvKiByZWNlaXZlIHNpZ25hbCBzdHJlbmd0aCBpbiBkQm0gKi8KKwlsb25nIHJzc2k7CisKKwl1MzIgY2hhbm5lbDsKKworCXUxNiBiZWFjb25wZXJpb2Q7CisKKwl1MzIgYXRpbXdpbmRvdzsKKworCWVudW0gV0xBTl84MDJfMTFfTkVUV09SS19JTkZSQVNUUlVDVFVSRSBpbmZyYW1vZGU7CisJdTggbGliZXJ0YXNfc3VwcG9ydGVkX3JhdGVzW1dMQU5fU1VQUE9SVEVEX1JBVEVTXTsKKworCWludCBleHRyYV9pZTsKKworCXU4IHRpbWVzdGFtcFs4XTsJLy8hPCBUU0YgdmFsdWUgaW5jbHVkZWQgaW4gdGhlIGJlYWNvbi9wcm9iZSByZXNwb25zZQorCXVuaW9uIGllZWV0eXBlc19waHlwYXJhbXNldCBwaHlwYXJhbXNldDsKKwl1bmlvbiBJRUVFdHlwZXNfc3NwYXJhbXNldCBzc3BhcmFtc2V0OworCXN0cnVjdCBpZWVldHlwZXNfY2FwaW5mbyBjYXA7CisJdTggZGF0YXJhdGVzW1dMQU5fU1VQUE9SVEVEX1JBVEVTXTsKKworCV9fbGU2NCBuZXR3b3JrdHNmOwkJLy8hPCBUU0YgdGltZXN0YW1wIGZyb20gdGhlIGN1cnJlbnQgZmlybXdhcmUgVFNGCisKKwlzdHJ1Y3QgaWVlZXR5cGVzX2NvdW50cnlpbmZvZnVsbHNldCBjb3VudHJ5aW5mbzsKKworCXN0cnVjdCBXUEFfU1VQUExJQ0FOVCB3cGFfc3VwcGxpY2FudDsKKwlzdHJ1Y3QgV1BBX1NVUFBMSUNBTlQgd3BhMl9zdXBwbGljYW50OworCit9OworCitleHRlcm4gaW50IGxpYmVydGFzX1NTSURfY21wKHN0cnVjdCBXTEFOXzgwMl8xMV9TU0lEICpzc2lkMSwKKwkJICAgc3RydWN0IFdMQU5fODAyXzExX1NTSUQgKnNzaWQyKTsKK2V4dGVybiBpbnQgbGliZXJ0YXNfZmluZF9TU0lEX2luX2xpc3Qod2xhbl9hZGFwdGVyICogYWRhcHRlciwgc3RydWN0IFdMQU5fODAyXzExX1NTSUQgKnNzaWQsCisJCQkgIHU4ICogYnNzaWQsIGludCBtb2RlKTsKK2ludCBsaWJlcnRhc19maW5kX2Jlc3RfU1NJRF9pbl9saXN0KHdsYW5fYWRhcHRlciAqIGFkYXB0ZXIsIGVudW0gV0xBTl84MDJfMTFfTkVUV09SS19JTkZSQVNUUlVDVFVSRSBtb2RlKTsKK2V4dGVybiBpbnQgbGliZXJ0YXNfZmluZF9CU1NJRF9pbl9saXN0KHdsYW5fYWRhcHRlciAqIGFkYXB0ZXIsIHU4ICogYnNzaWQsIGludCBtb2RlKTsKKworaW50IGxpYmVydGFzX2ZpbmRfYmVzdF9uZXR3b3JrX1NTSUQod2xhbl9wcml2YXRlICogcHJpdiwKKwkJCXN0cnVjdCBXTEFOXzgwMl8xMV9TU0lEICpwU1NJRCwKKwkJCWVudW0gV0xBTl84MDJfMTFfTkVUV09SS19JTkZSQVNUUlVDVFVSRSBwcmVmZXJyZWRfbW9kZSwKKwkJCWVudW0gV0xBTl84MDJfMTFfTkVUV09SS19JTkZSQVNUUlVDVFVSRSAqb3V0X21vZGUpOworCitleHRlcm4gaW50IGxpYmVydGFzX3NlbmRfc3BlY2lmaWNfU1NJRF9zY2FuKHdsYW5fcHJpdmF0ZSAqIHByaXYsCisJCQkJc3RydWN0IFdMQU5fODAyXzExX1NTSUQgKnByZXF1ZXN0ZWRzc2lkLAorCQkJCXU4IGtlZXBwcmV2aW91c3NjYW4pOworZXh0ZXJuIGludCBsaWJlcnRhc19zZW5kX3NwZWNpZmljX0JTU0lEX3NjYW4od2xhbl9wcml2YXRlICogcHJpdiwKKwkJCQkgdTggKiBic3NpZCwgdTgga2VlcHByZXZpb3Vzc2Nhbik7CisKK2V4dGVybiBpbnQgbGliZXJ0YXNfY21kXzgwMjExX3NjYW4od2xhbl9wcml2YXRlICogcHJpdiwKKwkJCQlzdHJ1Y3QgY21kX2RzX2NvbW1hbmQgKmNtZCwKKwkJCQl2b2lkICpwZGF0YV9idWYpOworCitleHRlcm4gaW50IGxpYmVydGFzX3JldF84MDIxMV9zY2FuKHdsYW5fcHJpdmF0ZSAqIHByaXYsCisJCQkJc3RydWN0IGNtZF9kc19jb21tYW5kICpyZXNwKTsKKworaW50IHdsYW5fc2Nhbl9uZXR3b3Jrcyh3bGFuX3ByaXZhdGUgKiBwcml2LAorICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB3bGFuX2lvY3RsX3VzZXJfc2Nhbl9jZmcgKiBwdXNlcnNjYW5pbik7CisKK3N0cnVjdCBpZnJlcTsKKworc3RydWN0IGl3X3BvaW50Oworc3RydWN0IGl3X3BhcmFtOworc3RydWN0IGl3X3JlcXVlc3RfaW5mbzsKK2V4dGVybiBpbnQgbGliZXJ0YXNfZ2V0X3NjYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSBzdHJ1Y3QgaXdfcG9pbnQgKmR3cnEsIGNoYXIgKmV4dHJhKTsKK2V4dGVybiBpbnQgbGliZXJ0YXNfc2V0X3NjYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSBzdHJ1Y3QgaXdfcGFyYW0gKnZ3cnEsIGNoYXIgKmV4dHJhKTsKKworI2VuZGlmCQkJCS8qIF9XTEFOX1NDQU5fSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvdGhyZWFkLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy90aHJlYWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDdiOGE2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvdGhyZWFkLmgKQEAgLTAsMCArMSw1MiBAQAorI2lmbmRlZglfX1dMQU5fVEhSRUFEX0hfCisjZGVmaW5lCV9fV0xBTl9USFJFQURfSF8KKworI2luY2x1ZGUJPGxpbnV4L2t0aHJlYWQuaD4KKworc3RydWN0IHdsYW5fdGhyZWFkIHsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdHE7CisJcGlkX3QgcGlkOworCXZvaWQgKnByaXY7Cit9OworCitzdGF0aWMgaW5saW5lIHZvaWQgd2xhbl9hY3RpdmF0ZV90aHJlYWQoc3RydWN0IHdsYW5fdGhyZWFkICogdGhyKQoreworCS8qKiBSZWNvcmQgdGhlIHRocmVhZCBwaWQgKi8KKwl0aHItPnBpZCA9IGN1cnJlbnQtPnBpZDsKKworCS8qKiBJbml0aWFsaXplIHRoZSB3YWl0IHF1ZXVlICovCisJaW5pdF93YWl0cXVldWVfaGVhZCgmdGhyLT53YWl0cSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3bGFuX2RlYWN0aXZhdGVfdGhyZWFkKHN0cnVjdCB3bGFuX3RocmVhZCAqIHRocikKK3sKKwlFTlRFUigpOworCisJdGhyLT5waWQgPSAwOworCisJTEVBVkUoKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHdsYW5fY3JlYXRlX3RocmVhZChpbnQgKCp3bGFuZnVuYykgKHZvaWQgKiksCisJCQkJICAgICAgc3RydWN0IHdsYW5fdGhyZWFkICogdGhyLCBjaGFyICpuYW1lKQoreworCXRoci0+dGFzayA9IGt0aHJlYWRfcnVuKHdsYW5mdW5jLCB0aHIsICIlcyIsIG5hbWUpOworfQorCitzdGF0aWMgaW5saW5lIGludCB3bGFuX3Rlcm1pbmF0ZV90aHJlYWQoc3RydWN0IHdsYW5fdGhyZWFkICogdGhyKQoreworCUVOVEVSKCk7CisKKwkvKiBDaGVjayBpZiB0aGUgdGhyZWFkIGlzIGFjdGl2ZSBvciBub3QgKi8KKwlpZiAoIXRoci0+cGlkKSB7CisJCXByaW50ayhLRVJOX0VSUiAiVGhyZWFkIGRvZXMgbm90IGV4aXN0XG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlrdGhyZWFkX3N0b3AodGhyLT50YXNrKTsKKworCUxFQVZFKCk7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvdHguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL3R4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJkMDYyMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL3R4LmMKQEAgLTAsMCArMSwyODUgQEAKKy8qKgorICAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgaGFuZGxpbmcgb2YgVFggaW4gd2xhbiBkcml2ZXIuCisgICovCisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisKKyNpbmNsdWRlICJob3N0Y21kLmgiCisjaW5jbHVkZSAicmFkaW90YXAuaCIKKyNpbmNsdWRlICJzYmkuaCIKKyNpbmNsdWRlICJkZWNsLmgiCisjaW5jbHVkZSAiZGVmcy5oIgorI2luY2x1ZGUgImRldi5oIgorI2luY2x1ZGUgIndleHQuaCIKKworLyoqCisgKiAgQGJyaWVmIFRoaXMgZnVuY3Rpb24gY29udmVydHMgVHgvUnggcmF0ZXMgZnJvbSBJRUVFODAyMTFfUkFESU9UQVBfUkFURQorICogIHVuaXRzICg1MDAgS2IvcykgaW50byBNYXJ2ZWxsIFdMQU4gZm9ybWF0IChzZWUgVGFibGUgOCBpbiBTZWN0aW9uIDMuMi4xKQorICoKKyAqICBAcGFyYW0gcmF0ZSAgICBJbnB1dCByYXRlCisgKiAgQHJldHVybiAgICAgIE91dHB1dCBSYXRlICgwIGlmIGludmFsaWQpCisgKi8KK3N0YXRpYyB1MzIgY29udmVydF9yYWRpb3RhcF9yYXRlX3RvX212KHU4IHJhdGUpCit7CisJc3dpdGNoIChyYXRlKSB7CisJY2FzZSAyOgkJLyogICAxIE1icHMgKi8KKwkJcmV0dXJuIDAgfCAoMSA8PCA0KTsKKwljYXNlIDQ6CQkvKiAgIDIgTWJwcyAqLworCQlyZXR1cm4gMSB8ICgxIDw8IDQpOworCWNhc2UgMTE6CQkvKiA1LjUgTWJwcyAqLworCQlyZXR1cm4gMiB8ICgxIDw8IDQpOworCWNhc2UgMjI6CQkvKiAgMTEgTWJwcyAqLworCQlyZXR1cm4gMyB8ICgxIDw8IDQpOworCWNhc2UgMTI6CQkvKiAgIDYgTWJwcyAqLworCQlyZXR1cm4gNCB8ICgxIDw8IDQpOworCWNhc2UgMTg6CQkvKiAgIDkgTWJwcyAqLworCQlyZXR1cm4gNSB8ICgxIDw8IDQpOworCWNhc2UgMjQ6CQkvKiAgMTIgTWJwcyAqLworCQlyZXR1cm4gNiB8ICgxIDw8IDQpOworCWNhc2UgMzY6CQkvKiAgMTggTWJwcyAqLworCQlyZXR1cm4gNyB8ICgxIDw8IDQpOworCWNhc2UgNDg6CQkvKiAgMjQgTWJwcyAqLworCQlyZXR1cm4gOCB8ICgxIDw8IDQpOworCWNhc2UgNzI6CQkvKiAgMzYgTWJwcyAqLworCQlyZXR1cm4gOSB8ICgxIDw8IDQpOworCWNhc2UgOTY6CQkvKiAgNDggTWJwcyAqLworCQlyZXR1cm4gMTAgfCAoMSA8PCA0KTsKKwljYXNlIDEwODoJCS8qICA1NCBNYnBzICovCisJCXJldHVybiAxMSB8ICgxIDw8IDQpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiAgQGJyaWVmIFRoaXMgZnVuY3Rpb24gcHJvY2Vzc2VzIGEgc2luZ2xlIHBhY2tldCBhbmQgc2VuZHMKKyAqICB0byBJRiBsYXllcgorICoKKyAqICBAcGFyYW0gcHJpdiAgICBBIHBvaW50ZXIgdG8gd2xhbl9wcml2YXRlIHN0cnVjdHVyZQorICogIEBwYXJhbSBza2IgICAgIEEgcG9pbnRlciB0byBza2Igd2hpY2ggaW5jbHVkZXMgVFggcGFja2V0CisgKiAgQHJldHVybiAJICAgMCBvciAtMQorICovCitzdGF0aWMgaW50IFNlbmRTaW5nbGVQYWNrZXQod2xhbl9wcml2YXRlICogcHJpdiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCWludCByZXQgPSAwOworCXN0cnVjdCB0eHBkIGxvY2FsdHhwZDsKKwlzdHJ1Y3QgdHhwZCAqcGxvY2FsdHhwZCA9ICZsb2NhbHR4cGQ7CisJdTggKnA4MDJ4X2hkcjsKKwlzdHJ1Y3QgdHhfcmFkaW90YXBfaGRyICpwcmFkaW90YXBfaGRyOworCXUzMiBuZXdfcmF0ZTsKKwl1OCAqcHRyID0gcHJpdi0+YWRhcHRlci0+dG1wdHhidWY7CisKKwlFTlRFUigpOworCisJaWYgKHByaXYtPmFkYXB0ZXItPnN1cnByaXNlcmVtb3ZlZCkKKwkJcmV0dXJuIC0xOworCisJaWYgKChwcml2LT5hZGFwdGVyLT5kZWJ1Z21vZGUgJiBNUlZEUlZfREVCVUdfVFhfUEFUSCkgIT0gMCkKKwkJbGJzX2RiZ19oZXgoIlRYIHBhY2tldDogIiwgc2tiLT5kYXRhLAorCQkJIG1pbl90KHVuc2lnbmVkIGludCwgc2tiLT5sZW4sIDEwMCkpOworCisJaWYgKCFza2ItPmxlbiB8fCAoc2tiLT5sZW4gPiBNUlZEUlZfRVRIX1RYX1BBQ0tFVF9CVUZGRVJfU0laRSkpIHsKKwkJbGJzX3ByX2RlYnVnKDEsICJUeCBlcnJvcjogQmFkIHNrYiBsZW5ndGggJWQgOiAlZFxuIiwKKwkJICAgICAgIHNrYi0+bGVuLCBNUlZEUlZfRVRIX1RYX1BBQ0tFVF9CVUZGRVJfU0laRSk7CisJCXJldCA9IC0xOworCQlnb3RvIGRvbmU7CisJfQorCisJbWVtc2V0KHBsb2NhbHR4cGQsIDAsIHNpemVvZihzdHJ1Y3QgdHhwZCkpOworCisJcGxvY2FsdHhwZC0+dHhfcGFja2V0X2xlbmd0aCA9IHNrYi0+bGVuOworCisJLyogb2Zmc2V0IG9mIGFjdHVhbCBkYXRhICovCisJcGxvY2FsdHhwZC0+dHhfcGFja2V0X2xvY2F0aW9uID0gc2l6ZW9mKHN0cnVjdCB0eHBkKTsKKworCS8qIFR4Q3RybCBzZXQgYnkgdXNlciBvciBkZWZhdWx0ICovCisJcGxvY2FsdHhwZC0+dHhfY29udHJvbCA9IGFkYXB0ZXItPnBrdHR4Y3RybDsKKworCXA4MDJ4X2hkciA9IHNrYi0+ZGF0YTsKKwlpZiAocHJpdi0+YWRhcHRlci0+cmFkaW9tb2RlID09IFdMQU5fUkFESU9NT0RFX1JBRElPVEFQKSB7CisKKwkJLyogbG9jYXRlIHJhZGlvdGFwIGhlYWRlciAqLworCQlwcmFkaW90YXBfaGRyID0gKHN0cnVjdCB0eF9yYWRpb3RhcF9oZHIgKilza2ItPmRhdGE7CisKKwkJLyogc2V0IHR4cGQgZmllbGRzIGZyb20gdGhlIHJhZGlvdGFwIGhlYWRlciAqLworCQluZXdfcmF0ZSA9IGNvbnZlcnRfcmFkaW90YXBfcmF0ZV90b19tdihwcmFkaW90YXBfaGRyLT5yYXRlKTsKKwkJaWYgKG5ld19yYXRlICE9IDApIHsKKwkJCS8qIGVyYXNlIHR4X2NvbnRyb2xbNDowXSAqLworCQkJcGxvY2FsdHhwZC0+dHhfY29udHJvbCAmPSB+MHgxZjsKKwkJCS8qIHdyaXRlIG5ldyB0eF9jb250cm9sWzQ6MF0gKi8KKwkJCXBsb2NhbHR4cGQtPnR4X2NvbnRyb2wgfD0gbmV3X3JhdGU7CisJCX0KKworCQkvKiBza2lwIHRoZSByYWRpb3RhcCBoZWFkZXIgKi8KKwkJcDgwMnhfaGRyICs9IHNpemVvZihzdHJ1Y3QgdHhfcmFkaW90YXBfaGRyKTsKKwkJcGxvY2FsdHhwZC0+dHhfcGFja2V0X2xlbmd0aCAtPSBzaXplb2Yoc3RydWN0IHR4X3JhZGlvdGFwX2hkcik7CisKKwl9CisJLyogY29weSBkZXN0aW5hdGlvbiBhZGRyZXNzIGZyb20gODAyLjMgb3IgODAyLjExIGhlYWRlciAqLworCWlmIChwcml2LT5hZGFwdGVyLT5saW5rbW9kZSA9PSBXTEFOX0xJTktNT0RFXzgwMl8xMSkKKwkJbWVtY3B5KHBsb2NhbHR4cGQtPnR4X2Rlc3RfYWRkcl9oaWdoLCBwODAyeF9oZHIgKyA0LCBFVEhfQUxFTik7CisJZWxzZQorCQltZW1jcHkocGxvY2FsdHhwZC0+dHhfZGVzdF9hZGRyX2hpZ2gsIHA4MDJ4X2hkciwgRVRIX0FMRU4pOworCisJbGJzX2RiZ19oZXgoInR4cGQiLCAodTggKikgcGxvY2FsdHhwZCwgc2l6ZW9mKHN0cnVjdCB0eHBkKSk7CisKKwlpZiAoSVNfTUVTSF9GUkFNRShza2IpKSB7CisJCXBsb2NhbHR4cGQtPnR4X2NvbnRyb2wgfD0gVHhQRF9NRVNIX0ZSQU1FOworCX0KKworCW1lbWNweShwdHIsIHBsb2NhbHR4cGQsIHNpemVvZihzdHJ1Y3QgdHhwZCkpOworCisJcHRyICs9IHNpemVvZihzdHJ1Y3QgdHhwZCk7CisKKwlsYnNfZGJnX2hleCgiVHggRGF0YSIsICh1OCAqKSBwODAyeF9oZHIsIHBsb2NhbHR4cGQtPnR4X3BhY2tldF9sZW5ndGgpOworCW1lbWNweShwdHIsIHA4MDJ4X2hkciwgcGxvY2FsdHhwZC0+dHhfcGFja2V0X2xlbmd0aCk7CisJcmV0ID0gbGliZXJ0YXNfc2JpX2hvc3RfdG9fY2FyZChwcml2LCBNVk1TX0RBVCwKKwkJCSAgICAgICBwcml2LT5hZGFwdGVyLT50bXB0eGJ1ZiwKKwkJCSAgICAgICBwbG9jYWx0eHBkLT50eF9wYWNrZXRfbGVuZ3RoICsKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IHR4cGQpKTsKKworCWlmIChyZXQpIHsKKwkJbGJzX3ByX2RlYnVnKDEsICJUeCBlcnJvcjogbGliZXJ0YXNfc2JpX2hvc3RfdG9fY2FyZCBmYWlsZWQ6IDB4JVhcbiIsIHJldCk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlsYnNfcHJfZGVidWcoMSwgIlNlbmRTaW5nbGVQYWNrZXQgc3VjY2VlZHNcbiIpOworCisgICAgICBkb25lOgorCWlmICghcmV0KSB7CisJCXByaXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJcHJpdi0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJfSBlbHNlIHsKKwkJcHJpdi0+c3RhdHMudHhfZHJvcHBlZCsrOworCQlwcml2LT5zdGF0cy50eF9lcnJvcnMrKzsKKwl9CisKKwlpZiAoIXJldCAmJiBwcml2LT5hZGFwdGVyLT5yYWRpb21vZGUgPT0gV0xBTl9SQURJT01PREVfUkFESU9UQVApIHsKKwkJLyogS2VlcCB0aGUgc2tiIHRvIGVjaG8gaXQgYmFjayBvbmNlIFR4IGZlZWRiYWNrIGlzCisJCSAgIHJlY2VpdmVkIGZyb20gRlcgKi8KKwkJc2tiX29ycGhhbihza2IpOworCQkvKiBzdG9wIHByb2Nlc3Npbmcgb3V0Z29pbmcgcGt0cyAqLworCQluZXRpZl9zdG9wX3F1ZXVlKHByaXYtPndsYW5fZGV2Lm5ldGRldik7CisJCS8qIGZyZWV6ZSBhbnkgcGFja2V0cyBhbHJlYWR5IGluIG91ciBxdWV1ZXMgKi8KKwkJcHJpdi0+YWRhcHRlci0+VHhMb2NrRmxhZyA9IDE7CisJfSBlbHNlIHsKKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJcHJpdi0+YWRhcHRlci0+Y3VycmVudHR4c2tiID0gTlVMTDsKKwl9CisKKwlMRUFWRSgpOworCXJldHVybiByZXQ7Cit9CisKKwordm9pZCBsaWJlcnRhc190eF9ydW5xdWV1ZSh3bGFuX3ByaXZhdGUgKnByaXYpCit7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwlpbnQgaTsKKworCXNwaW5fbG9jaygmYWRhcHRlci0+dHhxdWV1ZV9sb2NrKTsKKwlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+dHhfcXVldWVfaWR4OyBpKyspIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGFkYXB0ZXItPnR4X3F1ZXVlX3BzW2ldOworCQlzcGluX3VubG9jaygmYWRhcHRlci0+dHhxdWV1ZV9sb2NrKTsKKwkJU2VuZFNpbmdsZVBhY2tldChwcml2LCBza2IpOworCQlzcGluX2xvY2soJmFkYXB0ZXItPnR4cXVldWVfbG9jayk7CisJfQorCWFkYXB0ZXItPnR4X3F1ZXVlX2lkeCA9IDA7CisJc3Bpbl91bmxvY2soJmFkYXB0ZXItPnR4cXVldWVfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIHdsYW5fdHhfcXVldWUod2xhbl9wcml2YXRlICpwcml2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisKKwlzcGluX2xvY2soJmFkYXB0ZXItPnR4cXVldWVfbG9jayk7CisKKwlXQVJOX09OKHByaXYtPmFkYXB0ZXItPnR4X3F1ZXVlX2lkeCA+PSBOUl9UWF9RVUVVRSk7CisJYWRhcHRlci0+dHhfcXVldWVfcHNbYWRhcHRlci0+dHhfcXVldWVfaWR4KytdID0gc2tiOworCWlmIChhZGFwdGVyLT50eF9xdWV1ZV9pZHggPT0gTlJfVFhfUVVFVUUpCisJCW5ldGlmX3N0b3BfcXVldWUocHJpdi0+d2xhbl9kZXYubmV0ZGV2KTsKKwllbHNlCisJCW5ldGlmX3N0YXJ0X3F1ZXVlKHByaXYtPndsYW5fZGV2Lm5ldGRldik7CisKKwlzcGluX3VubG9jaygmYWRhcHRlci0+dHhxdWV1ZV9sb2NrKTsKK30KKworLyoqCisgKiAgQGJyaWVmIFRoaXMgZnVuY3Rpb24gY2hlY2tzIHRoZSBjb25kaXRpb25zIGFuZCBzZW5kcyBwYWNrZXQgdG8gSUYKKyAqICBsYXllciBpZiBldmVyeXRoaW5nIGlzIG9rLgorICoKKyAqICBAcGFyYW0gcHJpdiAgICBBIHBvaW50ZXIgdG8gd2xhbl9wcml2YXRlIHN0cnVjdHVyZQorICogIEByZXR1cm4gCSAgIG4vYQorICovCitpbnQgbGliZXJ0YXNfcHJvY2Vzc190eCh3bGFuX3ByaXZhdGUgKiBwcml2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWludCByZXQgPSAtMTsKKworCUVOVEVSKCk7CisKKwlsYnNfZGJnX2hleCgiVFggRGF0YSIsIHNrYi0+ZGF0YSwgbWluX3QodW5zaWduZWQgaW50LCBza2ItPmxlbiwgMTAwKSk7CisKKwlpZiAocHJpdi0+d2xhbl9kZXYuZG5sZF9zZW50KSB7CisJCWxic19wcl9hbGVydCggIlRYIGVycm9yOiBkbmxkX3NlbnQgPSAlZCwgbm90IHNlbmRpbmdcbiIsCisJCSAgICAgICBwcml2LT53bGFuX2Rldi5kbmxkX3NlbnQpOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKChwcml2LT5hZGFwdGVyLT5wc3N0YXRlID09IFBTX1NUQVRFX1NMRUVQKSB8fAorCSAgICAocHJpdi0+YWRhcHRlci0+cHNzdGF0ZSA9PSBQU19TVEFURV9QUkVfU0xFRVApKSB7CisJCXdsYW5fdHhfcXVldWUocHJpdiwgc2tiKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlwcml2LT5hZGFwdGVyLT5jdXJyZW50dHhza2IgPSBza2I7CisKKwlyZXQgPSBTZW5kU2luZ2xlUGFja2V0KHByaXYsIHNrYik7Citkb25lOgorCUxFQVZFKCk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiAgQGJyaWVmIFRoaXMgZnVuY3Rpb24gc2VuZHMgdG8gdGhlIGhvc3QgdGhlIGxhc3QgdHJhbnNtaXR0ZWQgcGFja2V0LAorICogIGZpbGxpbmcgdGhlIHJhZGlvdGFwIGhlYWRlcnMgd2l0aCB0cmFuc21pc3Npb24gaW5mb3JtYXRpb24uCisgKgorICogIEBwYXJhbSBwcml2ICAgICBBIHBvaW50ZXIgdG8gd2xhbl9wcml2YXRlIHN0cnVjdHVyZQorICogIEBwYXJhbSBzdGF0dXMgICBBIDMyIGJpdCB2YWx1ZSBjb250YWluaW5nIHRyYW5zbWlzc2lvbiBzdGF0dXMuCisgKgorICogIEByZXR1cm5zIHZvaWQKKyAqLwordm9pZCBsaWJlcnRhc19zZW5kX3R4X2ZlZWRiYWNrKHdsYW5fcHJpdmF0ZSAqIHByaXYpCit7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwlzdHJ1Y3QgdHhfcmFkaW90YXBfaGRyICpyYWRpb3RhcF9oZHI7CisJdTMyIHN0YXR1cyA9IGFkYXB0ZXItPmV2ZW50Y2F1c2U7CisJaW50IHR4ZmFpbDsKKwlpbnQgdHJ5X2NvdW50OworCisJaWYgKGFkYXB0ZXItPnJhZGlvbW9kZSAhPSBXTEFOX1JBRElPTU9ERV9SQURJT1RBUCB8fAorCSAgICBhZGFwdGVyLT5jdXJyZW50dHhza2IgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJcmFkaW90YXBfaGRyID0gKHN0cnVjdCB0eF9yYWRpb3RhcF9oZHIgKilhZGFwdGVyLT5jdXJyZW50dHhza2ItPmRhdGE7CisKKwlpZiAoKGFkYXB0ZXItPmRlYnVnbW9kZSAmIE1SVkRSVl9ERUJVR19UWF9QQVRIKSAhPSAwKQorCQlsYnNfZGJnX2hleCgiVFggZmVlZGJhY2s6ICIsICh1OCAqKSByYWRpb3RhcF9oZHIsCisJCQltaW5fdCh1bnNpZ25lZCBpbnQsIGFkYXB0ZXItPmN1cnJlbnR0eHNrYi0+bGVuLCAxMDApKTsKKworCXR4ZmFpbCA9IChzdGF0dXMgPj4gMjQpOworCisjaWYgMAorCS8qIFRoZSB2ZXJzaW9uIG9mIHJvb2ZuZXQgdGhhdCB3ZSd2ZSB0ZXN0ZWQgZG9lcyBub3QgdXNlIHRoaXMgeWV0CisJICogQnV0IGl0IG1heSBiZSB1c2VkIGluIHRoZSBmdXR1cmUuCisJICovCisJaWYgKHR4ZmFpbCkKKwkJcmFkaW90YXBfaGRyLT5mbGFncyAmPSBJRUVFODAyMTFfUkFESU9UQVBfRl9UWF9GQUlMOworI2VuZGlmCisJdHJ5X2NvdW50ID0gKHN0YXR1cyA+PiAxNikgJiAweGZmOworCXJhZGlvdGFwX2hkci0+ZGF0YV9yZXRyaWVzID0gKHRyeV9jb3VudCkgPworCSAgICAoMSArIGFkYXB0ZXItPnR4cmV0cnljb3VudCAtIHRyeV9jb3VudCkgOiAwOworCWxpYmVydGFzX3VwbG9hZF9yeF9wYWNrZXQocHJpdiwgYWRhcHRlci0+Y3VycmVudHR4c2tiKTsKKwlhZGFwdGVyLT5jdXJyZW50dHhza2IgPSBOVUxMOworCXByaXYtPmFkYXB0ZXItPlR4TG9ja0ZsYWcgPSAwOworCWlmIChwcml2LT5hZGFwdGVyLT5jb25uZWN0X3N0YXR1cyA9PSBsaWJlcnRhc19jb25uZWN0ZWQpCisJCW5ldGlmX3dha2VfcXVldWUocHJpdi0+d2xhbl9kZXYubmV0ZGV2KTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL3R5cGVzLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5ZDYyZjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy90eXBlcy5oCkBAIC0wLDAgKzEsMjg5IEBACisvKioKKyAgKiBUaGlzIGhlYWRlciBmaWxlIGNvbnRhaW5zIGRlZmluaXRpb24gZm9yIGdsb2JhbCB0eXBlcworICAqLworI2lmbmRlZiBfV0xBTl9UWVBFU18KKyNkZWZpbmUgX1dMQU5fVFlQRVNfCisKKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgorCisvKiogSUVFRSB0eXBlIGRlZmluaXRpb25zICAqLworZW51bSBpZWVldHlwZXNfZWxlbWVudGlkIHsKKwlTU0lEID0gMCwKKwlTVVBQT1JURURfUkFURVMsCisJRkhfUEFSQU1fU0VULAorCURTX1BBUkFNX1NFVCwKKwlDRl9QQVJBTV9TRVQsCisJVElNLAorCUlCU1NfUEFSQU1fU0VULAorCUNPVU5UUllfSU5GTyA9IDcsCisKKwlDSEFMTEVOR0VfVEVYVCA9IDE2LAorCisJRVhURU5ERURfU1VQUE9SVEVEX1JBVEVTID0gNTAsCisKKwlWRU5ET1JfU1BFQ0lGSUNfMjIxID0gMjIxLAorCisJV1BBX0lFID0gMjIxLAorCVdQQTJfSUUgPSA0OCwKKworCUVYVFJBX0lFID0gMTMzLAorfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKyNkZWZpbmUgQ0FQSU5GT19NQVNLCSh+KDB4ZGEwMCkpCisKK3N0cnVjdCBpZWVldHlwZXNfY2FwaW5mbyB7CisJdTggZXNzOjE7CisJdTggaWJzczoxOworCXU4IGNmcG9sbGFibGU6MTsKKwl1OCBjZnBvbGxycXN0OjE7CisJdTggcHJpdmFjeToxOworCXU4IHNob3J0cHJlYW1ibGU6MTsKKwl1OCBwYmNjOjE7CisJdTggY2hhbmFnaWxpdHk6MTsKKwl1OCBzcGVjdHJ1bW1nbXQ6MTsKKwl1OCByc3J2ZDM6MTsKKwl1OCBzaG9ydHNsb3R0aW1lOjE7CisJdTggYXBzZDoxOworCXU4IHJzdnJkMjoxOworCXU4IGRzc3NvZmRtOjE7CisJdTggcnNydmQxOjI7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGllZWV0eXBlc19jZnBhcmFtc2V0IHsKKwl1OCBlbGVtZW50aWQ7CisJdTggbGVuOworCXU4IGNmcGNudDsKKwl1OCBjZnBwZXJpb2Q7CisJdTE2IGNmcG1heGR1cmF0aW9uOworCXUxNiBjZnBkdXJhdGlvbnJlbWFpbmluZzsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisKK3N0cnVjdCBpZWVldHlwZXNfaWJzc3BhcmFtc2V0IHsKKwl1OCBlbGVtZW50aWQ7CisJdTggbGVuOworCXUxNiBhdGltd2luZG93OworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3VuaW9uIElFRUV0eXBlc19zc3BhcmFtc2V0IHsKKwlzdHJ1Y3QgaWVlZXR5cGVzX2NmcGFyYW1zZXQgY2ZwYXJhbXNldDsKKwlzdHJ1Y3QgaWVlZXR5cGVzX2lic3NwYXJhbXNldCBpYnNzcGFyYW1zZXQ7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGllZWV0eXBlc19maHBhcmFtc2V0IHsKKwl1OCBlbGVtZW50aWQ7CisJdTggbGVuOworCXUxNiBkd2VsbHRpbWU7CisJdTggaG9wc2V0OworCXU4IGhvcHBhdHRlcm47CisJdTggaG9waW5kZXg7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGllZWV0eXBlc19kc3BhcmFtc2V0IHsKKwl1OCBlbGVtZW50aWQ7CisJdTggbGVuOworCXU4IGN1cnJlbnRjaGFuOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3VuaW9uIGllZWV0eXBlc19waHlwYXJhbXNldCB7CisJc3RydWN0IGllZWV0eXBlc19maHBhcmFtc2V0IGZocGFyYW1zZXQ7CisJc3RydWN0IGllZWV0eXBlc19kc3BhcmFtc2V0IGRzcGFyYW1zZXQ7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGllZWV0eXBlc19hc3NvY3JzcCB7CisJc3RydWN0IGllZWV0eXBlc19jYXBpbmZvIGNhcGFiaWxpdHk7CisJdTE2IHN0YXR1c2NvZGU7CisJdTE2IGFpZDsKKwl1OCBpZWJ1ZmZlclsxXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiogVExWICB0eXBlIElEIGRlZmluaXRpb24gKi8KKyNkZWZpbmUgUFJPUFJJRVRBUllfVExWX0JBU0VfSUQJCTB4MDEwMAorCisvKiBUZXJtaW5hdGluZyBUTFYgdHlwZSAqLworI2RlZmluZSBNUlZMX1RFUk1JTkFURV9UTFZfSUQJCTB4ZmZmZgorCisjZGVmaW5lIFRMVl9UWVBFX1NTSUQJCQkJMHgwMDAwCisjZGVmaW5lIFRMVl9UWVBFX1JBVEVTCQkJCTB4MDAwMQorI2RlZmluZSBUTFZfVFlQRV9QSFlfRkgJCQkJMHgwMDAyCisjZGVmaW5lIFRMVl9UWVBFX1BIWV9EUwkJCQkweDAwMDMKKyNkZWZpbmUgVExWX1RZUEVfQ0YJCQkJICAgIDB4MDAwNAorI2RlZmluZSBUTFZfVFlQRV9JQlNTCQkJCTB4MDAwNgorCisjZGVmaW5lIFRMVl9UWVBFX0RPTUFJTgkJCQkweDAwMDcKKworI2RlZmluZSBUTFZfVFlQRV9QT1dFUl9DQVBBQklMSVRZCTB4MDAyMQorCisjZGVmaW5lIFRMVl9UWVBFX0tFWV9NQVRFUklBTCAgICAgICAoUFJPUFJJRVRBUllfVExWX0JBU0VfSUQgKyAwKQorI2RlZmluZSBUTFZfVFlQRV9DSEFOTElTVCAgICAgICAgICAgKFBST1BSSUVUQVJZX1RMVl9CQVNFX0lEICsgMSkKKyNkZWZpbmUgVExWX1RZUEVfTlVNUFJPQkVTICAgICAgICAgIChQUk9QUklFVEFSWV9UTFZfQkFTRV9JRCArIDIpCisjZGVmaW5lIFRMVl9UWVBFX1JTU0lfTE9XICAgICAgICAgICAoUFJPUFJJRVRBUllfVExWX0JBU0VfSUQgKyA0KQorI2RlZmluZSBUTFZfVFlQRV9TTlJfTE9XICAgICAgICAgICAgKFBST1BSSUVUQVJZX1RMVl9CQVNFX0lEICsgNSkKKyNkZWZpbmUgVExWX1RZUEVfRkFJTENPVU5UICAgICAgICAgIChQUk9QUklFVEFSWV9UTFZfQkFTRV9JRCArIDYpCisjZGVmaW5lIFRMVl9UWVBFX0JDTk1JU1MgICAgICAgICAgICAoUFJPUFJJRVRBUllfVExWX0JBU0VfSUQgKyA3KQorI2RlZmluZSBUTFZfVFlQRV9MRURfR1BJTyAgICAgICAgICAgKFBST1BSSUVUQVJZX1RMVl9CQVNFX0lEICsgOCkKKyNkZWZpbmUgVExWX1RZUEVfTEVEQkVIQVZJT1IgICAgICAgIChQUk9QUklFVEFSWV9UTFZfQkFTRV9JRCArIDkpCisjZGVmaW5lIFRMVl9UWVBFX1BBU1NUSFJPVUdIICAgICAgICAoUFJPUFJJRVRBUllfVExWX0JBU0VfSUQgKyAxMCkKKyNkZWZpbmUgVExWX1RZUEVfUkVBU1NPQ0FQICAgICAgICAgIChQUk9QUklFVEFSWV9UTFZfQkFTRV9JRCArIDExKQorI2RlZmluZSBUTFZfVFlQRV9QT1dFUl9UQkxfMl80R0haICAgKFBST1BSSUVUQVJZX1RMVl9CQVNFX0lEICsgMTIpCisjZGVmaW5lIFRMVl9UWVBFX1BPV0VSX1RCTF81R0haICAgICAoUFJPUFJJRVRBUllfVExWX0JBU0VfSUQgKyAxMykKKyNkZWZpbmUgVExWX1RZUEVfQkNBU1RQUk9CRQkgICAgKFBST1BSSUVUQVJZX1RMVl9CQVNFX0lEICsgMTQpCisjZGVmaW5lIFRMVl9UWVBFX05VTVNTSURfUFJPQkUJICAgIChQUk9QUklFVEFSWV9UTFZfQkFTRV9JRCArIDE1KQorI2RlZmluZSBUTFZfVFlQRV9XTU1RU1RBVFVTICAgCSAgICAoUFJPUFJJRVRBUllfVExWX0JBU0VfSUQgKyAxNikKKyNkZWZpbmUgVExWX1RZUEVfQ1JZUFRPX0RBVEEJICAgIChQUk9QUklFVEFSWV9UTFZfQkFTRV9JRCArIDE3KQorI2RlZmluZSBUTFZfVFlQRV9XSUxEQ0FSRFNTSUQJICAgIChQUk9QUklFVEFSWV9UTFZfQkFTRV9JRCArIDE4KQorI2RlZmluZSBUTFZfVFlQRV9UU0ZUSU1FU1RBTVAJICAgIChQUk9QUklFVEFSWV9UTFZfQkFTRV9JRCArIDE5KQorI2RlZmluZSBUTFZfVFlQRV9SU1NJX0hJR0ggICAgICAgICAgKFBST1BSSUVUQVJZX1RMVl9CQVNFX0lEICsgMjIpCisjZGVmaW5lIFRMVl9UWVBFX1NOUl9ISUdIICAgICAgICAgICAoUFJPUFJJRVRBUllfVExWX0JBU0VfSUQgKyAyMykKKworLyoqIFRMViByZWxhdGVkIGRhdGEgc3RydWN0dXJlcyovCitzdHJ1Y3QgbXJ2bGlldHlwZXNoZWFkZXIgeworCXUxNiB0eXBlOworCXUxNiBsZW47Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IG1ydmxpZXR5cGVzX2RhdGEgeworCXN0cnVjdCBtcnZsaWV0eXBlc2hlYWRlciBoZWFkZXI7CisJdTggRGF0YVsxXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgbXJ2bGlldHlwZXNfcmF0ZXNwYXJhbXNldCB7CisJc3RydWN0IG1ydmxpZXR5cGVzaGVhZGVyIGhlYWRlcjsKKwl1OCByYXRlc1sxXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgbXJ2bGlldHlwZXNfc3NpZHBhcmFtc2V0IHsKKwlzdHJ1Y3QgbXJ2bGlldHlwZXNoZWFkZXIgaGVhZGVyOworCXU4IHNzaWRbMV07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IG1ydmxpZXR5cGVzX3dpbGRjYXJkc3NpZHBhcmFtc2V0IHsKKwlzdHJ1Y3QgbXJ2bGlldHlwZXNoZWFkZXIgaGVhZGVyOworCXU4IE1heFNzaWRsZW5ndGg7CisJdTggc3NpZFsxXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgY2hhbnNjYW5tb2RlIHsKKwl1OCBwYXNzaXZlc2NhbjoxOworCXU4IGRpc2FibGVjaGFuZmlsdDoxOworCXU4IHJlc2VydmVkXzJfNzo2OworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBjaGFuc2NhbnBhcmFtc2V0IHsKKwl1OCByYWRpb3R5cGU7CisJdTggY2hhbm51bWJlcjsKKwlzdHJ1Y3QgY2hhbnNjYW5tb2RlIGNoYW5zY2FubW9kZTsKKwl1MTYgbWluc2NhbnRpbWU7CisJdTE2IG1heHNjYW50aW1lOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBtcnZsaWV0eXBlc19jaGFubGlzdHBhcmFtc2V0IHsKKwlzdHJ1Y3QgbXJ2bGlldHlwZXNoZWFkZXIgaGVhZGVyOworCXN0cnVjdCBjaGFuc2NhbnBhcmFtc2V0IGNoYW5zY2FucGFyYW1bMV07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGNmcGFyYW1zZXQgeworCXU4IGNmcGNudDsKKwl1OCBjZnBwZXJpb2Q7CisJdTE2IGNmcG1heGR1cmF0aW9uOworCXUxNiBjZnBkdXJhdGlvbnJlbWFpbmluZzsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaWJzc3BhcmFtc2V0IHsKKwl1MTYgYXRpbXdpbmRvdzsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgbXJ2bGlldHlwZXNfc3NwYXJhbXNldCB7CisJc3RydWN0IG1ydmxpZXR5cGVzaGVhZGVyIGhlYWRlcjsKKwl1bmlvbiB7CisJCXN0cnVjdCBjZnBhcmFtc2V0IGNmcGFyYW1zZXRbMV07CisJCXN0cnVjdCBpYnNzcGFyYW1zZXQgaWJzc3BhcmFtc2V0WzFdOworCX0gY2ZfaWJzczsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgZmhwYXJhbXNldCB7CisJdTE2IGR3ZWxsdGltZTsKKwl1OCBob3BzZXQ7CisJdTggaG9wcGF0dGVybjsKKwl1OCBob3BpbmRleDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgZHNwYXJhbXNldCB7CisJdTggY3VycmVudGNoYW47Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IG1ydmxpZXR5cGVzX3BoeXBhcmFtc2V0IHsKKwlzdHJ1Y3QgbXJ2bGlldHlwZXNoZWFkZXIgaGVhZGVyOworCXVuaW9uIHsKKwkJc3RydWN0IGZocGFyYW1zZXQgZmhwYXJhbXNldFsxXTsKKwkJc3RydWN0IGRzcGFyYW1zZXQgZHNwYXJhbXNldFsxXTsKKwl9IGZoX2RzOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBtcnZsaWV0eXBlc19yc25wYXJhbXNldCB7CisJc3RydWN0IG1ydmxpZXR5cGVzaGVhZGVyIGhlYWRlcjsKKwl1OCByc25pZVsxXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgbXJ2bGlldHlwZXNfdHNmdGltZXN0YW1wIHsKKwlzdHJ1Y3QgbXJ2bGlldHlwZXNoZWFkZXIgaGVhZGVyOworCV9fbGU2NCB0c2Z0YWJsZVsxXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiogIExvY2FsIFBvd2VyIGNhcGFiaWxpdHkgKi8KK3N0cnVjdCBtcnZsaWV0eXBlc19wb3dlcmNhcGFiaWxpdHkgeworCXN0cnVjdCBtcnZsaWV0eXBlc2hlYWRlciBoZWFkZXI7CisJczggbWlucG93ZXI7CisJczggbWF4cG93ZXI7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IG1ydmxpZXR5cGVzX3Jzc2l0aHJlc2hvbGQgeworCXN0cnVjdCBtcnZsaWV0eXBlc2hlYWRlciBoZWFkZXI7CisJdTggcnNzaXZhbHVlOworCXU4IHJzc2lmcmVxOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBtcnZsaWV0eXBlc19zbnJ0aHJlc2hvbGQgeworCXN0cnVjdCBtcnZsaWV0eXBlc2hlYWRlciBoZWFkZXI7CisJdTggc25ydmFsdWU7CisJdTggc25yZnJlcTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgbXJ2bGlldHlwZXNfZmFpbHVyZWNvdW50IHsKKwlzdHJ1Y3QgbXJ2bGlldHlwZXNoZWFkZXIgaGVhZGVyOworCXU4IGZhaWx2YWx1ZTsKKwl1OCBGYWlsZnJlcTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgbXJ2bGlldHlwZXNfYmVhY29uc21pc3NlZCB7CisJc3RydWN0IG1ydmxpZXR5cGVzaGVhZGVyIGhlYWRlcjsKKwl1OCBiZWFjb25taXNzZWQ7CisJdTggcmVzZXJ2ZWQ7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IG1ydmxpZXR5cGVzX251bXByb2JlcyB7CisJc3RydWN0IG1ydmxpZXR5cGVzaGVhZGVyIGhlYWRlcjsKKwl1MTYgbnVtcHJvYmVzOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBtcnZsaWV0eXBlc19iY2FzdHByb2JlIHsKKwlzdHJ1Y3QgbXJ2bGlldHlwZXNoZWFkZXIgaGVhZGVyOworCXUxNiBiY2FzdHByb2JlOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBtcnZsaWV0eXBlc19udW1zc2lkcHJvYmUgeworCXN0cnVjdCBtcnZsaWV0eXBlc2hlYWRlciBoZWFkZXI7CisJdTE2IG51bXNzaWRwcm9iZTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgbGVkX3BpbiB7CisJdTggbGVkOworCXU4IHBpbjsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgbXJ2bGlldHlwZXNfbGVkZ3BpbyB7CisJc3RydWN0IG1ydmxpZXR5cGVzaGVhZGVyIGhlYWRlcjsKKwlzdHJ1Y3QgbGVkX3BpbiBsZWRwaW5bMV07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworI2VuZGlmCQkJCS8qIF9XTEFOX1RZUEVTXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvdmVyc2lvbi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvdmVyc2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NmY2NWFlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvdmVyc2lvbi5oCkBAIC0wLDAgKzEsOCBAQAorI2RlZmluZSBEUklWRVJfUkVMRUFTRV9WRVJTSU9OICIzMjAucDAiCitjb25zdCBjaGFyIGxpYmVydGFzX2RyaXZlcl92ZXJzaW9uW10gPSAiQ09NTS1VU0I4Mzg4LSIgRFJJVkVSX1JFTEVBU0VfVkVSU0lPTgorI2lmZGVmICBERUJVRworICAgICItZGJnIgorI2VuZGlmCisgICAgIiI7CisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvd2V4dC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvd2V4dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhNTIzMzYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy93ZXh0LmMKQEAgLTAsMCArMSwyNzY5IEBACisvKioKKyAgKiBUaGlzIGZpbGUgY29udGFpbnMgaW9jdGwgZnVuY3Rpb25zCisgICovCisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPG5ldC9pZWVlODAyMTEuaD4KKyNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgorCisjaW5jbHVkZSAiaG9zdC5oIgorI2luY2x1ZGUgInJhZGlvdGFwLmgiCisjaW5jbHVkZSAiZGVjbC5oIgorI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJkZXYuaCIKKyNpbmNsdWRlICJqb2luLmgiCisjaW5jbHVkZSAidmVyc2lvbi5oIgorI2luY2x1ZGUgIndleHQuaCIKKyNpbmNsdWRlICJhc3NvYy5oIgorCisKKy8qKgorICogIEBicmllZiBDb252ZXJ0IG13IHZhbHVlIHRvIGRibSB2YWx1ZQorICoKKyAqICBAcGFyYW0gbXcJICAgdGhlIHZhbHVlIG9mIG13CisgKiAgQHJldHVybiAJICAgdGhlIHZhbHVlIG9mIGRibQorICovCitzdGF0aWMgaW50IG13X3RvX2RibShpbnQgbXcpCit7CisJaWYgKG13IDwgMikKKwkJcmV0dXJuIDA7CisJZWxzZSBpZiAobXcgPCAzKQorCQlyZXR1cm4gMzsKKwllbHNlIGlmIChtdyA8IDQpCisJCXJldHVybiA1OworCWVsc2UgaWYgKG13IDwgNikKKwkJcmV0dXJuIDc7CisJZWxzZSBpZiAobXcgPCA3KQorCQlyZXR1cm4gODsKKwllbHNlIGlmIChtdyA8IDgpCisJCXJldHVybiA5OworCWVsc2UgaWYgKG13IDwgMTApCisJCXJldHVybiAxMDsKKwllbHNlIGlmIChtdyA8IDEzKQorCQlyZXR1cm4gMTE7CisJZWxzZSBpZiAobXcgPCAxNikKKwkJcmV0dXJuIDEyOworCWVsc2UgaWYgKG13IDwgMjApCisJCXJldHVybiAxMzsKKwllbHNlIGlmIChtdyA8IDI1KQorCQlyZXR1cm4gMTQ7CisJZWxzZSBpZiAobXcgPCAzMikKKwkJcmV0dXJuIDE1OworCWVsc2UgaWYgKG13IDwgNDApCisJCXJldHVybiAxNjsKKwllbHNlIGlmIChtdyA8IDUwKQorCQlyZXR1cm4gMTc7CisJZWxzZSBpZiAobXcgPCA2MykKKwkJcmV0dXJuIDE4OworCWVsc2UgaWYgKG13IDwgNzkpCisJCXJldHVybiAxOTsKKwllbHNlIGlmIChtdyA8IDEwMCkKKwkJcmV0dXJuIDIwOworCWVsc2UKKwkJcmV0dXJuIDIxOworfQorCisvKioKKyAqICBAYnJpZWYgRmluZCB0aGUgY2hhbm5lbCBmcmVxdWVuY3kgcG93ZXIgaW5mbyB3aXRoIHNwZWNpZmljIGNoYW5uZWwKKyAqCisgKiAgQHBhcmFtIGFkYXB0ZXIgCUEgcG9pbnRlciB0byB3bGFuX2FkYXB0ZXIgc3RydWN0dXJlCisgKiAgQHBhcmFtIGJhbmQJCWl0IGNhbiBiZSBCQU5EX0EsIEJBTkRfRyBvciBCQU5EX0IKKyAqICBAcGFyYW0gY2hhbm5lbCAgICAgIHRoZSBjaGFubmVsIGZvciBsb29raW5nCisgKiAgQHJldHVybiAJICAgCUEgcG9pbnRlciB0byBzdHJ1Y3QgY2hhbl9mcmVxX3Bvd2VyIHN0cnVjdHVyZSBvciBOVUxMIGlmIG5vdCBmaW5kLgorICovCitzdHJ1Y3QgY2hhbl9mcmVxX3Bvd2VyICpsaWJlcnRhc19maW5kX2NmcF9ieV9iYW5kX2FuZF9jaGFubmVsKHdsYW5fYWRhcHRlciAqIGFkYXB0ZXIsCisJCQkJCQkgdTggYmFuZCwgdTE2IGNoYW5uZWwpCit7CisJc3RydWN0IGNoYW5fZnJlcV9wb3dlciAqY2ZwID0gTlVMTDsKKwlzdHJ1Y3QgcmVnaW9uX2NoYW5uZWwgKnJjOworCWludCBjb3VudCA9IHNpemVvZihhZGFwdGVyLT5yZWdpb25fY2hhbm5lbCkgLworCSAgICBzaXplb2YoYWRhcHRlci0+cmVnaW9uX2NoYW5uZWxbMF0pOworCWludCBpLCBqOworCisJZm9yIChqID0gMDsgIWNmcCAmJiAoaiA8IGNvdW50KTsgaisrKSB7CisJCXJjID0gJmFkYXB0ZXItPnJlZ2lvbl9jaGFubmVsW2pdOworCisJCWlmIChhZGFwdGVyLT5lbmFibGUxMWQpCisJCQlyYyA9ICZhZGFwdGVyLT51bml2ZXJzYWxfY2hhbm5lbFtqXTsKKwkJaWYgKCFyYy0+dmFsaWQgfHwgIXJjLT5DRlApCisJCQljb250aW51ZTsKKwkJaWYgKHJjLT5iYW5kICE9IGJhbmQpCisJCQljb250aW51ZTsKKwkJZm9yIChpID0gMDsgaSA8IHJjLT5ucmNmcDsgaSsrKSB7CisJCQlpZiAocmMtPkNGUFtpXS5jaGFubmVsID09IGNoYW5uZWwpIHsKKwkJCQljZnAgPSAmcmMtPkNGUFtpXTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCWlmICghY2ZwICYmIGNoYW5uZWwpCisJCWxic19wcl9kZWJ1ZygxLCAibGliZXJ0YXNfZmluZF9jZnBfYnlfYmFuZF9hbmRfY2hhbm5lbCgpOiBjYW5ub3QgZmluZCAiCisJCSAgICAgICAiY2ZwIGJ5IGJhbmQgJWQgJiBjaGFubmVsICVkXG4iLCBiYW5kLCBjaGFubmVsKTsKKworCXJldHVybiBjZnA7Cit9CisKKy8qKgorICogIEBicmllZiBGaW5kIHRoZSBjaGFubmVsIGZyZXF1ZW5jeSBwb3dlciBpbmZvIHdpdGggc3BlY2lmaWMgZnJlcXVlbmN5CisgKgorICogIEBwYXJhbSBhZGFwdGVyIAlBIHBvaW50ZXIgdG8gd2xhbl9hZGFwdGVyIHN0cnVjdHVyZQorICogIEBwYXJhbSBiYW5kCQlpdCBjYW4gYmUgQkFORF9BLCBCQU5EX0cgb3IgQkFORF9CCisgKiAgQHBhcmFtIGZyZXEJICAgICAgICB0aGUgZnJlcXVlbmN5IGZvciBsb29raW5nCisgKiAgQHJldHVybiAJICAgCUEgcG9pbnRlciB0byBzdHJ1Y3QgY2hhbl9mcmVxX3Bvd2VyIHN0cnVjdHVyZSBvciBOVUxMIGlmIG5vdCBmaW5kLgorICovCitzdGF0aWMgc3RydWN0IGNoYW5fZnJlcV9wb3dlciAqZmluZF9jZnBfYnlfYmFuZF9hbmRfZnJlcSh3bGFuX2FkYXB0ZXIgKiBhZGFwdGVyLAorCQkJCQkJICAgICB1OCBiYW5kLCB1MzIgZnJlcSkKK3sKKwlzdHJ1Y3QgY2hhbl9mcmVxX3Bvd2VyICpjZnAgPSBOVUxMOworCXN0cnVjdCByZWdpb25fY2hhbm5lbCAqcmM7CisJaW50IGNvdW50ID0gc2l6ZW9mKGFkYXB0ZXItPnJlZ2lvbl9jaGFubmVsKSAvCisJICAgIHNpemVvZihhZGFwdGVyLT5yZWdpb25fY2hhbm5lbFswXSk7CisJaW50IGksIGo7CisKKwlmb3IgKGogPSAwOyAhY2ZwICYmIChqIDwgY291bnQpOyBqKyspIHsKKwkJcmMgPSAmYWRhcHRlci0+cmVnaW9uX2NoYW5uZWxbal07CisKKwkJaWYgKGFkYXB0ZXItPmVuYWJsZTExZCkKKwkJCXJjID0gJmFkYXB0ZXItPnVuaXZlcnNhbF9jaGFubmVsW2pdOworCQlpZiAoIXJjLT52YWxpZCB8fCAhcmMtPkNGUCkKKwkJCWNvbnRpbnVlOworCQlpZiAocmMtPmJhbmQgIT0gYmFuZCkKKwkJCWNvbnRpbnVlOworCQlmb3IgKGkgPSAwOyBpIDwgcmMtPm5yY2ZwOyBpKyspIHsKKwkJCWlmIChyYy0+Q0ZQW2ldLmZyZXEgPT0gZnJlcSkgeworCQkJCWNmcCA9ICZyYy0+Q0ZQW2ldOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJaWYgKCFjZnAgJiYgZnJlcSkKKwkJbGJzX3ByX2RlYnVnKDEsICJmaW5kX2NmcF9ieV9iYW5kX2FuZF9mcmVxbCgpOiBjYW5ub3QgZmluZCBjZnAgYnkgIgorCQkgICAgICAgImJhbmQgJWQgJiBmcmVxICVkXG4iLCBiYW5kLCBmcmVxKTsKKworCXJldHVybiBjZnA7Cit9CisKK3N0YXRpYyBpbnQgdXBkYXRlY3VycmVudGNoYW5uZWwod2xhbl9wcml2YXRlICogcHJpdikKK3sKKwlpbnQgcmV0OworCisJLyoKKwkgKiogdGhlIGNoYW5uZWwgaW4gZi93IGNvdWxkIGJlIG91dCBvZiBzeW5jLCBnZXQgdGhlIGN1cnJlbnQgY2hhbm5lbAorCSAqLworCXJldCA9IGxpYmVydGFzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZChwcml2LCBjbWRfODAyXzExX3JmX2NoYW5uZWwsCisJCQkJICAgIGNtZF9vcHRfODAyXzExX3JmX2NoYW5uZWxfZ2V0LAorCQkJCSAgICBjbWRfb3B0aW9uX3dhaXRmb3Jyc3AsIDAsIE5VTEwpOworCisJbGJzX3ByX2RlYnVnKDEsICJDdXJyZW50IGNoYW5uZWwgPSAlZFxuIiwKKwkgICAgICAgcHJpdi0+YWRhcHRlci0+Y3VyYnNzcGFyYW1zLmNoYW5uZWwpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBzZXRjdXJyZW50Y2hhbm5lbCh3bGFuX3ByaXZhdGUgKiBwcml2LCBpbnQgY2hhbm5lbCkKK3sKKwlsYnNfcHJfZGVidWcoMSwgIlNldCBjaGFubmVsID0gJWRcbiIsIGNoYW5uZWwpOworCisJLyoKKwkgKiogIEN1cnJlbnQgY2hhbm5lbCBpcyBub3Qgc2V0IHRvIGFkaG9jY2hhbm5lbCByZXF1ZXN0ZWQsIHNldCBjaGFubmVsCisJICovCisJcmV0dXJuIChsaWJlcnRhc19wcmVwYXJlX2FuZF9zZW5kX2NvbW1hbmQocHJpdiwgY21kXzgwMl8xMV9yZl9jaGFubmVsLAorCQkJCSAgICAgIGNtZF9vcHRfODAyXzExX3JmX2NoYW5uZWxfc2V0LAorCQkJCSAgICAgIGNtZF9vcHRpb25fd2FpdGZvcnJzcCwgMCwgJmNoYW5uZWwpKTsKK30KKworc3RhdGljIGludCBjaGFuZ2VhZGhvY2NoYW5uZWwod2xhbl9wcml2YXRlICogcHJpdiwgaW50IGNoYW5uZWwpCit7CisJaW50IHJldCA9IDA7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKworCWFkYXB0ZXItPmFkaG9jY2hhbm5lbCA9IGNoYW5uZWw7CisKKwl1cGRhdGVjdXJyZW50Y2hhbm5lbChwcml2KTsKKworCWlmIChhZGFwdGVyLT5jdXJic3NwYXJhbXMuY2hhbm5lbCA9PSBhZGFwdGVyLT5hZGhvY2NoYW5uZWwpIHsKKwkJLyogYWRob2NjaGFubmVsIGlzIHNldCB0byB0aGUgY3VycmVudCBjaGFubmVsIGFscmVhZHkgKi8KKwkJTEVBVkUoKTsKKwkJcmV0dXJuIDA7CisJfQorCisJbGJzX3ByX2RlYnVnKDEsICJVcGRhdGluZyBjaGFubmVsIGZyb20gJWQgdG8gJWRcbiIsCisJICAgICAgIGFkYXB0ZXItPmN1cmJzc3BhcmFtcy5jaGFubmVsLCBhZGFwdGVyLT5hZGhvY2NoYW5uZWwpOworCisJc2V0Y3VycmVudGNoYW5uZWwocHJpdiwgYWRhcHRlci0+YWRob2NjaGFubmVsKTsKKworCXVwZGF0ZWN1cnJlbnRjaGFubmVsKHByaXYpOworCisJaWYgKGFkYXB0ZXItPmN1cmJzc3BhcmFtcy5jaGFubmVsICE9IGFkYXB0ZXItPmFkaG9jY2hhbm5lbCkgeworCQlsYnNfcHJfZGVidWcoMSwgImZhaWxlZCB0byB1cGRhdGVkIGNoYW5uZWwgdG8gJWQsIGNoYW5uZWwgPSAlZFxuIiwKKwkJICAgICAgIGFkYXB0ZXItPmFkaG9jY2hhbm5lbCwgYWRhcHRlci0+Y3VyYnNzcGFyYW1zLmNoYW5uZWwpOworCQlMRUFWRSgpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGFkYXB0ZXItPmNvbm5lY3Rfc3RhdHVzID09IGxpYmVydGFzX2Nvbm5lY3RlZCkgeworCQlpbnQgaTsKKwkJc3RydWN0IFdMQU5fODAyXzExX1NTSUQgY3VyYWRob2Nzc2lkOworCisJCWxic19wcl9kZWJ1ZygxLCAiY2hhbm5lbCBDaGFuZ2VkIHdoaWxlIGluIGFuIElCU1NcbiIpOworCisJCS8qIENvcHkgdGhlIGN1cnJlbnQgc3NpZCAqLworCQltZW1jcHkoJmN1cmFkaG9jc3NpZCwgJmFkYXB0ZXItPmN1cmJzc3BhcmFtcy5zc2lkLAorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBXTEFOXzgwMl8xMV9TU0lEKSk7CisKKwkJLyogRXhpdCBBZGhvYyBtb2RlICovCisJCWxic19wcl9kZWJ1ZygxLCAiSW4gY2hhbmdlYWRob2NjaGFubmVsKCk6IFNlbmRpbmcgQWRob2MgU3RvcFxuIik7CisJCXJldCA9IGxpYmVydGFzX3N0b3BfYWRob2NfbmV0d29yayhwcml2KTsKKworCQlpZiAocmV0KSB7CisJCQlMRUFWRSgpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQkvKiBTY2FuIGZvciB0aGUgbmV0d29yaywgZG8gbm90IHNhdmUgcHJldmlvdXMgcmVzdWx0cy4gIFN0YWxlCisJCSAqICAgc2NhbiBkYXRhIHdpbGwgY2F1c2UgdXMgdG8gam9pbiBhIG5vbi1leGlzdGFudCBhZGhvYyBuZXR3b3JrCisJCSAqLworCQlsaWJlcnRhc19zZW5kX3NwZWNpZmljX1NTSURfc2Nhbihwcml2LCAmY3VyYWRob2Nzc2lkLCAwKTsKKworCQkvLyBmaW5kIG91dCB0aGUgQlNTSUQgdGhhdCBtYXRjaGVzIHRoZSBjdXJyZW50IFNTSUQKKwkJaSA9IGxpYmVydGFzX2ZpbmRfU1NJRF9pbl9saXN0KGFkYXB0ZXIsICZjdXJhZGhvY3NzaWQsIE5VTEwsCisJCQkJICAgd2xhbjgwMl8xMWlic3MpOworCisJCWlmIChpID49IDApIHsKKwkJCWxic19wcl9kZWJ1ZygxLCAiU1NJRCBmb3VuZCBhdCAlZCBpbiBMaXN0LCIKKwkJCSAgICAgICAic28gam9pblxuIiwgaSk7CisJCQlsaWJlcnRhc19qb2luX2FkaG9jX25ldHdvcmsocHJpdiwgJmFkYXB0ZXItPnNjYW50YWJsZVtpXSk7CisJCX0gZWxzZSB7CisJCQkvLyBlbHNlIHNlbmQgU1RBUlQgY29tbWFuZAorCQkJbGJzX3ByX2RlYnVnKDEsICJTU0lEIG5vdCBmb3VuZCBpbiBsaXN0LCAiCisJCQkgICAgICAgInNvIGNyZWF0aW5nIGFkaG9jIHdpdGggc3NpZCA9ICVzXG4iLAorCQkJICAgICAgIGN1cmFkaG9jc3NpZC5zc2lkKTsKKwkJCWxpYmVydGFzX3N0YXJ0X2FkaG9jX25ldHdvcmsocHJpdiwgJmN1cmFkaG9jc3NpZCk7CisJCX0JCS8vIGVuZCBvZiBlbHNlIChTVEFSVCBjb21tYW5kKQorCX0KKworCUxFQVZFKCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogIEBicmllZiBTZXQgUmFkaW8gT24vT0ZGCisgKgorICogIEBwYXJhbSBwcml2ICAgICAgICAgICAgICAgICBBIHBvaW50ZXIgdG8gd2xhbl9wcml2YXRlIHN0cnVjdHVyZQorICogIEBvcHRpb24gCQkJUmFkaW8gT3B0aW9uCisgKiAgQHJldHVybiAJICAgCQkwIC0tc3VjY2Vzcywgb3RoZXJ3aXNlIGZhaWwKKyAqLworaW50IHdsYW5fcmFkaW9faW9jdGwod2xhbl9wcml2YXRlICogcHJpdiwgdTggb3B0aW9uKQoreworCWludCByZXQgPSAwOworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisKKwlFTlRFUigpOworCisJaWYgKGFkYXB0ZXItPnJhZGlvb24gIT0gb3B0aW9uKSB7CisJCWxic19wcl9kZWJ1ZygxLCAiU3dpdGNoaW5nICVzIHRoZSBSYWRpb1xuIiwgb3B0aW9uID8gIk9uIiA6ICJPZmYiKTsKKwkJYWRhcHRlci0+cmFkaW9vbiA9IG9wdGlvbjsKKworCQlyZXQgPSBsaWJlcnRhc19wcmVwYXJlX2FuZF9zZW5kX2NvbW1hbmQocHJpdiwKKwkJCQkJICAgIGNtZF84MDJfMTFfcmFkaW9fY29udHJvbCwKKwkJCQkJICAgIGNtZF9hY3Rfc2V0LAorCQkJCQkgICAgY21kX29wdGlvbl93YWl0Zm9ycnNwLCAwLCBOVUxMKTsKKwl9CisKKwlMRUFWRSgpOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogIEBicmllZiBDb3B5IHJhdGVzCisgKgorICogIEBwYXJhbSBkZXN0ICAgICAgICAgICAgICAgICBBIHBvaW50ZXIgdG8gRGVzdCBCdWYKKyAqICBAcGFyYW0gc3JjCQkgICAgICAgIEEgcG9pbnRlciB0byBTcmMgQnVmCisgKiAgQHBhcmFtIGxlbiAgICAgICAgICAgICAgICAgIFRoZSBsZW4gb2YgU3JjIEJ1ZgorICogIEByZXR1cm4gCSAgIAkgICAgICAgIE51bWJlciBvZiByYXRlcyBjb3B5ZWQKKyAqLworc3RhdGljIGlubGluZSBpbnQgY29weXJhdGVzKHU4ICogZGVzdCwgaW50IHBvcywgdTggKiBzcmMsIGludCBsZW4pCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuICYmIHNyY1tpXTsgaSsrLCBwb3MrKykgeworCQlpZiAocG9zID49IHNpemVvZih1OCkgKiBXTEFOX1NVUFBPUlRFRF9SQVRFUykKKwkJCWJyZWFrOworCQlkZXN0W3Bvc10gPSBzcmNbaV07CisJfQorCisJcmV0dXJuIHBvczsKK30KKworLyoqCisgKiAgQGJyaWVmIEdldCBhY3RpdmUgZGF0YSByYXRlcworICoKKyAqICBAcGFyYW0gYWRhcHRlciAgICAgICAgICAgICAgQSBwb2ludGVyIHRvIHdsYW5fYWRhcHRlciBzdHJ1Y3R1cmUKKyAqICBAcGFyYW0gcmF0ZQkJICAgICAgICBUaGUgYnVmIHRvIHJldHVybiB0aGUgYWN0aXZlIHJhdGVzCisgKiAgQHJldHVybiAJICAgCSAgICAgICAgVGhlIG51bWJlciBvZiByYXRlcworICovCitzdGF0aWMgaW50IGdldF9hY3RpdmVfZGF0YV9yYXRlcyh3bGFuX2FkYXB0ZXIgKiBhZGFwdGVyLAorCQkJCSB1OCogcmF0ZXMpCit7CisJaW50IGsgPSAwOworCisJRU5URVIoKTsKKworCWlmIChhZGFwdGVyLT5jb25uZWN0X3N0YXR1cyAhPSBsaWJlcnRhc19jb25uZWN0ZWQpIHsKKwkJaWYgKGFkYXB0ZXItPmluZnJhbW9kZSA9PSB3bGFuODAyXzExaW5mcmFzdHJ1Y3R1cmUpIHsKKwkJCS8vSW5mcmEuIG1vZGUKKwkJCWxic19wcl9kZWJ1ZygxLCAiSW5mcmFcbiIpOworCQkJayA9IGNvcHlyYXRlcyhyYXRlcywgaywgbGliZXJ0YXNfc3VwcG9ydGVkX3JhdGVzLAorCQkJCSAgICAgIHNpemVvZihsaWJlcnRhc19zdXBwb3J0ZWRfcmF0ZXMpKTsKKwkJfSBlbHNlIHsKKwkJCS8vYWQtaG9jIG1vZGUKKwkJCWxic19wcl9kZWJ1ZygxLCAiQWRob2MgR1xuIik7CisJCQlrID0gY29weXJhdGVzKHJhdGVzLCBrLCBsaWJlcnRhc19hZGhvY19yYXRlc19nLAorCQkJCSAgICAgIHNpemVvZihsaWJlcnRhc19hZGhvY19yYXRlc19nKSk7CisJCX0KKwl9IGVsc2UgeworCQlrID0gY29weXJhdGVzKHJhdGVzLCAwLCBhZGFwdGVyLT5jdXJic3NwYXJhbXMuZGF0YXJhdGVzLAorCQkJICAgICAgYWRhcHRlci0+Y3VyYnNzcGFyYW1zLm51bW9mcmF0ZXMpOworCX0KKworCUxFQVZFKCk7CisKKwlyZXR1cm4gazsKK30KKworc3RhdGljIGludCB3bGFuX2dldF9uYW1lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgY2hhciAqY3dycSwgY2hhciAqZXh0cmEpCit7CisJY29uc3QgY2hhciAqY3A7CisJY2hhciBjb21tWzZdID0geyAiQ09NTS0iIH07CisJY2hhciBtcnZsWzZdID0geyAiTVJWTC0iIH07CisJaW50IGNudDsKKworCUVOVEVSKCk7CisKKwlzdHJjcHkoY3dycSwgbXJ2bCk7CisKKwljcCA9IHN0cnN0cihsaWJlcnRhc19kcml2ZXJfdmVyc2lvbiwgY29tbSk7CisJaWYgKGNwID09IGxpYmVydGFzX2RyaXZlcl92ZXJzaW9uKQkvL3NraXAgbGVhZGluZyAiQ09NTS0iCisJCWNwID0gbGliZXJ0YXNfZHJpdmVyX3ZlcnNpb24gKyBzdHJsZW4oY29tbSk7CisJZWxzZQorCQljcCA9IGxpYmVydGFzX2RyaXZlcl92ZXJzaW9uOworCisJY250ID0gc3RybGVuKG1ydmwpOworCWN3cnEgKz0gY250OworCXdoaWxlIChjbnQgPCAxNiAmJiAoKmNwICE9ICctJykpIHsKKwkJKmN3cnErKyA9IHRvdXBwZXIoKmNwKyspOworCQljbnQrKzsKKwl9CisJKmN3cnEgPSAnXDAnOworCisJTEVBVkUoKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdsYW5fZ2V0X2ZyZXEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSBzdHJ1Y3QgaXdfZnJlcSAqZndycSwgY2hhciAqZXh0cmEpCit7CisJd2xhbl9wcml2YXRlICpwcml2ID0gZGV2LT5wcml2OworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJc3RydWN0IGNoYW5fZnJlcV9wb3dlciAqY2ZwOworCisJRU5URVIoKTsKKworCWNmcCA9IGxpYmVydGFzX2ZpbmRfY2ZwX2J5X2JhbmRfYW5kX2NoYW5uZWwoYWRhcHRlciwgMCwKKwkJCQkJICAgYWRhcHRlci0+Y3VyYnNzcGFyYW1zLmNoYW5uZWwpOworCisJaWYgKCFjZnApIHsKKwkJaWYgKGFkYXB0ZXItPmN1cmJzc3BhcmFtcy5jaGFubmVsKQorCQkJbGJzX3ByX2RlYnVnKDEsICJJbnZhbGlkIGNoYW5uZWw9JWRcbiIsCisJCQkgICAgICAgYWRhcHRlci0+Y3VyYnNzcGFyYW1zLmNoYW5uZWwpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlmd3JxLT5tID0gKGxvbmcpY2ZwLT5mcmVxICogMTAwMDAwOworCWZ3cnEtPmUgPSAxOworCisJbGJzX3ByX2RlYnVnKDEsICJmcmVxPSV1XG4iLCBmd3JxLT5tKTsKKworCUxFQVZFKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2xhbl9nZXRfd2FwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQlzdHJ1Y3Qgc29ja2FkZHIgKmF3cnEsIGNoYXIgKmV4dHJhKQoreworCXdsYW5fcHJpdmF0ZSAqcHJpdiA9IGRldi0+cHJpdjsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCisJRU5URVIoKTsKKworCWlmIChhZGFwdGVyLT5jb25uZWN0X3N0YXR1cyA9PSBsaWJlcnRhc19jb25uZWN0ZWQpIHsKKwkJbWVtY3B5KGF3cnEtPnNhX2RhdGEsIGFkYXB0ZXItPmN1cmJzc3BhcmFtcy5ic3NpZCwgRVRIX0FMRU4pOworCX0gZWxzZSB7CisJCW1lbXNldChhd3JxLT5zYV9kYXRhLCAwLCBFVEhfQUxFTik7CisJfQorCWF3cnEtPnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKworCUxFQVZFKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2xhbl9zZXRfbmljayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJIHN0cnVjdCBpd19wb2ludCAqZHdycSwgY2hhciAqZXh0cmEpCit7CisJd2xhbl9wcml2YXRlICpwcml2ID0gZGV2LT5wcml2OworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisKKwlFTlRFUigpOworCisJLyoKKwkgKiBDaGVjayB0aGUgc2l6ZSBvZiB0aGUgc3RyaW5nCisJICovCisKKwlpZiAoZHdycS0+bGVuZ3RoID4gMTYpIHsKKwkJcmV0dXJuIC1FMkJJRzsKKwl9CisKKwltdXRleF9sb2NrKCZhZGFwdGVyLT5sb2NrKTsKKwltZW1zZXQoYWRhcHRlci0+bm9kZW5hbWUsIDAsIHNpemVvZihhZGFwdGVyLT5ub2RlbmFtZSkpOworCW1lbWNweShhZGFwdGVyLT5ub2RlbmFtZSwgZXh0cmEsIGR3cnEtPmxlbmd0aCk7CisJbXV0ZXhfdW5sb2NrKCZhZGFwdGVyLT5sb2NrKTsKKworCUxFQVZFKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2xhbl9nZXRfbmljayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJIHN0cnVjdCBpd19wb2ludCAqZHdycSwgY2hhciAqZXh0cmEpCit7CisJd2xhbl9wcml2YXRlICpwcml2ID0gZGV2LT5wcml2OworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisKKwlFTlRFUigpOworCisJLyoKKwkgKiBHZXQgdGhlIE5pY2sgTmFtZSBzYXZlZAorCSAqLworCisJbXV0ZXhfbG9jaygmYWRhcHRlci0+bG9jayk7CisJc3RybmNweShleHRyYSwgYWRhcHRlci0+bm9kZW5hbWUsIDE2KTsKKwltdXRleF91bmxvY2soJmFkYXB0ZXItPmxvY2spOworCisJZXh0cmFbMTZdID0gJ1wwJzsKKworCS8qCisJICogSWYgbm9uZSwgd2UgbWF5IHdhbnQgdG8gZ2V0IHRoZSBvbmUgdGhhdCB3YXMgc2V0CisJICovCisKKwkvKgorCSAqIFB1c2ggaXQgb3V0ICEKKwkgKi8KKwlkd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsKKworCUxFQVZFKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2xhbl9zZXRfcnRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQlzdHJ1Y3QgaXdfcGFyYW0gKnZ3cnEsIGNoYXIgKmV4dHJhKQoreworCWludCByZXQgPSAwOworCXdsYW5fcHJpdmF0ZSAqcHJpdiA9IGRldi0+cHJpdjsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCWludCBydGhyID0gdndycS0+dmFsdWU7CisKKwlFTlRFUigpOworCisJaWYgKHZ3cnEtPmRpc2FibGVkKSB7CisJCWFkYXB0ZXItPnJ0c3Roc2QgPSBydGhyID0gTVJWRFJWX1JUU19NQVhfVkFMVUU7CisJfSBlbHNlIHsKKwkJaWYgKHJ0aHIgPCBNUlZEUlZfUlRTX01JTl9WQUxVRSB8fCBydGhyID4gTVJWRFJWX1JUU19NQVhfVkFMVUUpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJYWRhcHRlci0+cnRzdGhzZCA9IHJ0aHI7CisJfQorCisJcmV0ID0gbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsIGNtZF84MDJfMTFfc25tcF9taWIsCisJCQkJICAgIGNtZF9hY3Rfc2V0LCBjbWRfb3B0aW9uX3dhaXRmb3Jyc3AsCisJCQkJICAgIE9JRF84MDJfMTFfUlRTX1RIUkVTSE9MRCwgJnJ0aHIpOworCisJTEVBVkUoKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHdsYW5fZ2V0X3J0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJc3RydWN0IGl3X3BhcmFtICp2d3JxLCBjaGFyICpleHRyYSkKK3sKKwlpbnQgcmV0ID0gMDsKKwl3bGFuX3ByaXZhdGUgKnByaXYgPSBkZXYtPnByaXY7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKworCUVOVEVSKCk7CisKKwlhZGFwdGVyLT5ydHN0aHNkID0gMDsKKwlyZXQgPSBsaWJlcnRhc19wcmVwYXJlX2FuZF9zZW5kX2NvbW1hbmQocHJpdiwgY21kXzgwMl8xMV9zbm1wX21pYiwKKwkJCQkgICAgY21kX2FjdF9nZXQsIGNtZF9vcHRpb25fd2FpdGZvcnJzcCwKKwkJCQkgICAgT0lEXzgwMl8xMV9SVFNfVEhSRVNIT0xELCBOVUxMKTsKKwlpZiAocmV0KSB7CisJCUxFQVZFKCk7CisJCXJldHVybiByZXQ7CisJfQorCisJdndycS0+dmFsdWUgPSBhZGFwdGVyLT5ydHN0aHNkOworCXZ3cnEtPmRpc2FibGVkID0gKCh2d3JxLT52YWx1ZSA8IE1SVkRSVl9SVFNfTUlOX1ZBTFVFKQorCQkJICB8fCAodndycS0+dmFsdWUgPiBNUlZEUlZfUlRTX01BWF9WQUxVRSkpOworCXZ3cnEtPmZpeGVkID0gMTsKKworCUxFQVZFKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2xhbl9zZXRfZnJhZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJIHN0cnVjdCBpd19wYXJhbSAqdndycSwgY2hhciAqZXh0cmEpCit7CisJaW50IHJldCA9IDA7CisJaW50IGZ0aHIgPSB2d3JxLT52YWx1ZTsKKwl3bGFuX3ByaXZhdGUgKnByaXYgPSBkZXYtPnByaXY7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKworCUVOVEVSKCk7CisKKwlpZiAodndycS0+ZGlzYWJsZWQpIHsKKwkJYWRhcHRlci0+ZnJhZ3Roc2QgPSBmdGhyID0gTVJWRFJWX0ZSQUdfTUFYX1ZBTFVFOworCX0gZWxzZSB7CisJCWlmIChmdGhyIDwgTVJWRFJWX0ZSQUdfTUlOX1ZBTFVFCisJCSAgICB8fCBmdGhyID4gTVJWRFJWX0ZSQUdfTUFYX1ZBTFVFKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWFkYXB0ZXItPmZyYWd0aHNkID0gZnRocjsKKwl9CisKKwlyZXQgPSBsaWJlcnRhc19wcmVwYXJlX2FuZF9zZW5kX2NvbW1hbmQocHJpdiwgY21kXzgwMl8xMV9zbm1wX21pYiwKKwkJCQkgICAgY21kX2FjdF9zZXQsIGNtZF9vcHRpb25fd2FpdGZvcnJzcCwKKwkJCQkgICAgT0lEXzgwMl8xMV9GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRCwgJmZ0aHIpOworCUxFQVZFKCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB3bGFuX2dldF9mcmFnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgc3RydWN0IGl3X3BhcmFtICp2d3JxLCBjaGFyICpleHRyYSkKK3sKKwlpbnQgcmV0ID0gMDsKKwl3bGFuX3ByaXZhdGUgKnByaXYgPSBkZXYtPnByaXY7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKworCUVOVEVSKCk7CisKKwlhZGFwdGVyLT5mcmFndGhzZCA9IDA7CisJcmV0ID0gbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsCisJCQkJICAgIGNtZF84MDJfMTFfc25tcF9taWIsCisJCQkJICAgIGNtZF9hY3RfZ2V0LCBjbWRfb3B0aW9uX3dhaXRmb3Jyc3AsCisJCQkJICAgIE9JRF84MDJfMTFfRlJBR01FTlRBVElPTl9USFJFU0hPTEQsIE5VTEwpOworCWlmIChyZXQpIHsKKwkJTEVBVkUoKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwl2d3JxLT52YWx1ZSA9IGFkYXB0ZXItPmZyYWd0aHNkOworCXZ3cnEtPmRpc2FibGVkID0gKCh2d3JxLT52YWx1ZSA8IE1SVkRSVl9GUkFHX01JTl9WQUxVRSkKKwkJCSAgfHwgKHZ3cnEtPnZhbHVlID4gTVJWRFJWX0ZSQUdfTUFYX1ZBTFVFKSk7CisJdndycS0+Zml4ZWQgPSAxOworCisJTEVBVkUoKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHdsYW5fZ2V0X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLCB1MzIgKiB1d3JxLCBjaGFyICpleHRyYSkKK3sKKwl3bGFuX3ByaXZhdGUgKnByaXYgPSBkZXYtPnByaXY7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKworCUVOVEVSKCk7CisKKwlzd2l0Y2ggKGFkYXB0ZXItPmluZnJhbW9kZSkgeworCWNhc2Ugd2xhbjgwMl8xMWlic3M6CisJCSp1d3JxID0gSVdfTU9ERV9BREhPQzsKKwkJYnJlYWs7CisKKwljYXNlIHdsYW44MDJfMTFpbmZyYXN0cnVjdHVyZToKKwkJKnV3cnEgPSBJV19NT0RFX0lORlJBOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJY2FzZSB3bGFuODAyXzExYXV0b3Vua25vd246CisJCSp1d3JxID0gSVdfTU9ERV9BVVRPOworCQlicmVhazsKKwl9CisKKwlMRUFWRSgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdsYW5fZ2V0X3R4cG93KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIHN0cnVjdCBpd19wYXJhbSAqdndycSwgY2hhciAqZXh0cmEpCit7CisJaW50IHJldCA9IDA7CisJd2xhbl9wcml2YXRlICpwcml2ID0gZGV2LT5wcml2OworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisKKwlFTlRFUigpOworCisJcmV0ID0gbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsCisJCQkJICAgIGNtZF84MDJfMTFfcmZfdHhfcG93ZXIsCisJCQkJICAgIGNtZF9hY3RfdHhfcG93ZXJfb3B0X2dldCwKKwkJCQkgICAgY21kX29wdGlvbl93YWl0Zm9ycnNwLCAwLCBOVUxMKTsKKworCWlmIChyZXQpIHsKKwkJTEVBVkUoKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlsYnNfcHJfZGVidWcoMSwgIlRYUE9XRVIgR0VUICVkIGRibS5cbiIsIGFkYXB0ZXItPnR4cG93ZXJsZXZlbCk7CisJdndycS0+dmFsdWUgPSBhZGFwdGVyLT50eHBvd2VybGV2ZWw7CisJdndycS0+Zml4ZWQgPSAxOworCWlmIChhZGFwdGVyLT5yYWRpb29uKSB7CisJCXZ3cnEtPmRpc2FibGVkID0gMDsKKwkJdndycS0+ZmxhZ3MgPSBJV19UWFBPV19EQk07CisJfSBlbHNlIHsKKwkJdndycS0+ZGlzYWJsZWQgPSAxOworCX0KKworCUxFQVZFKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2xhbl9zZXRfcmV0cnkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgc3RydWN0IGl3X3BhcmFtICp2d3JxLCBjaGFyICpleHRyYSkKK3sKKwlpbnQgcmV0ID0gMDsKKwl3bGFuX3ByaXZhdGUgKnByaXYgPSBkZXYtPnByaXY7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKworCUVOVEVSKCk7CisKKwlpZiAodndycS0+ZmxhZ3MgPT0gSVdfUkVUUllfTElNSVQpIHsKKwkJLyogVGhlIE1BQyBoYXMgYSA0LWJpdCBUb3RhbF9UeF9Db3VudCByZWdpc3RlcgorCQkgICBUb3RhbF9UeF9Db3VudCA9IDEgKyBUeF9SZXRyeV9Db3VudCAqLworI2RlZmluZSBUWF9SRVRSWV9NSU4gMAorI2RlZmluZSBUWF9SRVRSWV9NQVggMTQKKwkJaWYgKHZ3cnEtPnZhbHVlIDwgVFhfUkVUUllfTUlOIHx8IHZ3cnEtPnZhbHVlID4gVFhfUkVUUllfTUFYKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJLyogQWRkaW5nIDEgdG8gY29udmVydCByZXRyeSBjb3VudCB0byB0cnkgY291bnQgKi8KKwkJYWRhcHRlci0+dHhyZXRyeWNvdW50ID0gdndycS0+dmFsdWUgKyAxOworCisJCXJldCA9IGxpYmVydGFzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZChwcml2LCBjbWRfODAyXzExX3NubXBfbWliLAorCQkJCQkgICAgY21kX2FjdF9zZXQsCisJCQkJCSAgICBjbWRfb3B0aW9uX3dhaXRmb3Jyc3AsCisJCQkJCSAgICBPSURfODAyXzExX1RYX1JFVFJZQ09VTlQsIE5VTEwpOworCisJCWlmIChyZXQpIHsKKwkJCUxFQVZFKCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfSBlbHNlIHsKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KKworCUxFQVZFKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2xhbl9nZXRfcmV0cnkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgc3RydWN0IGl3X3BhcmFtICp2d3JxLCBjaGFyICpleHRyYSkKK3sKKwl3bGFuX3ByaXZhdGUgKnByaXYgPSBkZXYtPnByaXY7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwlpbnQgcmV0ID0gMDsKKworCUVOVEVSKCk7CisJYWRhcHRlci0+dHhyZXRyeWNvdW50ID0gMDsKKwlyZXQgPSBsaWJlcnRhc19wcmVwYXJlX2FuZF9zZW5kX2NvbW1hbmQocHJpdiwKKwkJCQkgICAgY21kXzgwMl8xMV9zbm1wX21pYiwKKwkJCQkgICAgY21kX2FjdF9nZXQsIGNtZF9vcHRpb25fd2FpdGZvcnJzcCwKKwkJCQkgICAgT0lEXzgwMl8xMV9UWF9SRVRSWUNPVU5ULCBOVUxMKTsKKwlpZiAocmV0KSB7CisJCUxFQVZFKCk7CisJCXJldHVybiByZXQ7CisJfQorCXZ3cnEtPmRpc2FibGVkID0gMDsKKwlpZiAoIXZ3cnEtPmZsYWdzKSB7CisJCXZ3cnEtPmZsYWdzID0gSVdfUkVUUllfTElNSVQ7CisJCS8qIFN1YnRyYWN0IDEgdG8gY29udmVydCB0cnkgY291bnQgdG8gcmV0cnkgY291bnQgKi8KKwkJdndycS0+dmFsdWUgPSBhZGFwdGVyLT50eHJldHJ5Y291bnQgLSAxOworCX0KKworCUxFQVZFKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzb3J0X2NoYW5uZWxzKHN0cnVjdCBpd19mcmVxICpmcmVxLCBpbnQgbnVtKQoreworCWludCBpLCBqOworCXN0cnVjdCBpd19mcmVxIHRlbXA7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspCisJCWZvciAoaiA9IGkgKyAxOyBqIDwgbnVtOyBqKyspCisJCQlpZiAoZnJlcVtpXS5pID4gZnJlcVtqXS5pKSB7CisJCQkJdGVtcC5pID0gZnJlcVtpXS5pOworCQkJCXRlbXAubSA9IGZyZXFbaV0ubTsKKworCQkJCWZyZXFbaV0uaSA9IGZyZXFbal0uaTsKKwkJCQlmcmVxW2ldLm0gPSBmcmVxW2pdLm07CisKKwkJCQlmcmVxW2pdLmkgPSB0ZW1wLmk7CisJCQkJZnJlcVtqXS5tID0gdGVtcC5tOworCQkJfQorfQorCisvKiBkYXRhIHJhdGUgbGlzdGluZworCU1VTFRJX0JBTkRTOgorCQlhYmcJCWEJYgliL2cKKyAgIEluZnJhIAlHKDEyKQkJQSg4KQlCKDQpCUcoMTIpCisgICBBZGhvYyAJQStCKDEyKQkJQSg4KQlCKDQpCUIoNCkKKworCW5vbi1NVUxUSV9CQU5EUzoKKwkJCQkJYgliL2cKKyAgIEluZnJhIAkgICAgIAkJICAgIAlCKDQpCUcoMTIpCisgICBBZGhvYyAJICAgICAgCQkgICAgCUIoNCkJQig0KQorICovCisvKioKKyAqICBAYnJpZWYgR2V0IFJhbmdlIEluZm8KKyAqCisgKiAgQHBhcmFtIGRldiAgICAgICAgICAgICAgICAgIEEgcG9pbnRlciB0byBuZXRfZGV2aWNlIHN0cnVjdHVyZQorICogIEBwYXJhbSBpbmZvCQkJQSBwb2ludGVyIHRvIGl3X3JlcXVlc3RfaW5mbyBzdHJ1Y3R1cmUKKyAqICBAcGFyYW0gdndycSAJCUEgcG9pbnRlciB0byBpd19wYXJhbSBzdHJ1Y3R1cmUKKyAqICBAcGFyYW0gZXh0cmEJCUEgcG9pbnRlciB0byBleHRyYSBkYXRhIGJ1ZgorICogIEByZXR1cm4gCSAgIAkJMCAtLXN1Y2Nlc3MsIG90aGVyd2lzZSBmYWlsCisgKi8KK3N0YXRpYyBpbnQgd2xhbl9nZXRfcmFuZ2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgc3RydWN0IGl3X3BvaW50ICpkd3JxLCBjaGFyICpleHRyYSkKK3sKKwlpbnQgaSwgajsKKwl3bGFuX3ByaXZhdGUgKnByaXYgPSBkZXYtPnByaXY7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwlzdHJ1Y3QgaXdfcmFuZ2UgKnJhbmdlID0gKHN0cnVjdCBpd19yYW5nZSAqKWV4dHJhOworCXN0cnVjdCBjaGFuX2ZyZXFfcG93ZXIgKmNmcDsKKwl1OCByYXRlc1tXTEFOX1NVUFBPUlRFRF9SQVRFU107CisKKwl1OCBmbGFnID0gMDsKKworCUVOVEVSKCk7CisKKwlkd3JxLT5sZW5ndGggPSBzaXplb2Yoc3RydWN0IGl3X3JhbmdlKTsKKwltZW1zZXQocmFuZ2UsIDAsIHNpemVvZihzdHJ1Y3QgaXdfcmFuZ2UpKTsKKworCXJhbmdlLT5taW5fbndpZCA9IDA7CisJcmFuZ2UtPm1heF9ud2lkID0gMDsKKworCW1lbXNldChyYXRlcywgMCwgc2l6ZW9mKHJhdGVzKSk7CisJcmFuZ2UtPm51bV9iaXRyYXRlcyA9IGdldF9hY3RpdmVfZGF0YV9yYXRlcyhhZGFwdGVyLCByYXRlcyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbWluX3QoX191OCwgcmFuZ2UtPm51bV9iaXRyYXRlcywgSVdfTUFYX0JJVFJBVEVTKSAmJiByYXRlc1tpXTsKKwkgICAgIGkrKykgeworCQlyYW5nZS0+Yml0cmF0ZVtpXSA9IChyYXRlc1tpXSAmIDB4N2YpICogNTAwMDAwOworCX0KKwlyYW5nZS0+bnVtX2JpdHJhdGVzID0gaTsKKwlsYnNfcHJfZGVidWcoMSwgIklXX01BWF9CSVRSQVRFUz0lZCBudW1fYml0cmF0ZXM9JWRcbiIsIElXX01BWF9CSVRSQVRFUywKKwkgICAgICAgcmFuZ2UtPm51bV9iaXRyYXRlcyk7CisKKwlyYW5nZS0+bnVtX2ZyZXF1ZW5jeSA9IDA7CisJaWYgKHByaXYtPmFkYXB0ZXItPmVuYWJsZTExZCAmJgorCSAgICBhZGFwdGVyLT5jb25uZWN0X3N0YXR1cyA9PSBsaWJlcnRhc19jb25uZWN0ZWQpIHsKKwkJdTggY2hhbl9ubzsKKwkJdTggYmFuZDsKKworCQlzdHJ1Y3QgcGFyc2VkX3JlZ2lvbl9jaGFuXzExZCAqcGFyc2VkX3JlZ2lvbl9jaGFuID0KKwkJICAgICZhZGFwdGVyLT5wYXJzZWRfcmVnaW9uX2NoYW47CisKKwkJaWYgKHBhcnNlZF9yZWdpb25fY2hhbiA9PSBOVUxMKSB7CisJCQlsYnNfcHJfZGVidWcoMSwgIjExRDpwYXJzZWRfcmVnaW9uX2NoYW4gaXMgTlVMTFxuIik7CisJCQlMRUFWRSgpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJYmFuZCA9IHBhcnNlZF9yZWdpb25fY2hhbi0+YmFuZDsKKwkJbGJzX3ByX2RlYnVnKDEsICJiYW5kPSVkIE5vT2ZDaGFuPSVkXG4iLCBiYW5kLAorCQkgICAgICAgcGFyc2VkX3JlZ2lvbl9jaGFuLT5ucl9jaGFuKTsKKworCQlmb3IgKGkgPSAwOyAocmFuZ2UtPm51bV9mcmVxdWVuY3kgPCBJV19NQVhfRlJFUVVFTkNJRVMpCisJCSAgICAgJiYgKGkgPCBwYXJzZWRfcmVnaW9uX2NoYW4tPm5yX2NoYW4pOyBpKyspIHsKKwkJCWNoYW5fbm8gPSBwYXJzZWRfcmVnaW9uX2NoYW4tPmNoYW5wd3JbaV0uY2hhbjsKKwkJCWxic19wcl9kZWJ1ZygxLCAiY2hhbl9ubz0lZFxuIiwgY2hhbl9ubyk7CisJCQlyYW5nZS0+ZnJlcVtyYW5nZS0+bnVtX2ZyZXF1ZW5jeV0uaSA9IChsb25nKWNoYW5fbm87CisJCQlyYW5nZS0+ZnJlcVtyYW5nZS0+bnVtX2ZyZXF1ZW5jeV0ubSA9CisJCQkgICAgKGxvbmcpbGliZXJ0YXNfY2hhbl8yX2ZyZXEoY2hhbl9ubywgYmFuZCkgKiAxMDAwMDA7CisJCQlyYW5nZS0+ZnJlcVtyYW5nZS0+bnVtX2ZyZXF1ZW5jeV0uZSA9IDE7CisJCQlyYW5nZS0+bnVtX2ZyZXF1ZW5jeSsrOworCQl9CisJCWZsYWcgPSAxOworCX0KKwlpZiAoIWZsYWcpIHsKKwkJZm9yIChqID0gMDsgKHJhbmdlLT5udW1fZnJlcXVlbmN5IDwgSVdfTUFYX0ZSRVFVRU5DSUVTKQorCQkgICAgICYmIChqIDwgc2l6ZW9mKGFkYXB0ZXItPnJlZ2lvbl9jaGFubmVsKQorCQkJIC8gc2l6ZW9mKGFkYXB0ZXItPnJlZ2lvbl9jaGFubmVsWzBdKSk7IGorKykgeworCQkJY2ZwID0gYWRhcHRlci0+cmVnaW9uX2NoYW5uZWxbal0uQ0ZQOworCQkJZm9yIChpID0gMDsgKHJhbmdlLT5udW1fZnJlcXVlbmN5IDwgSVdfTUFYX0ZSRVFVRU5DSUVTKQorCQkJICAgICAmJiBhZGFwdGVyLT5yZWdpb25fY2hhbm5lbFtqXS52YWxpZAorCQkJICAgICAmJiBjZnAKKwkJCSAgICAgJiYgKGkgPCBhZGFwdGVyLT5yZWdpb25fY2hhbm5lbFtqXS5ucmNmcCk7IGkrKykgeworCQkJCXJhbmdlLT5mcmVxW3JhbmdlLT5udW1fZnJlcXVlbmN5XS5pID0KKwkJCQkgICAgKGxvbmcpY2ZwLT5jaGFubmVsOworCQkJCXJhbmdlLT5mcmVxW3JhbmdlLT5udW1fZnJlcXVlbmN5XS5tID0KKwkJCQkgICAgKGxvbmcpY2ZwLT5mcmVxICogMTAwMDAwOworCQkJCXJhbmdlLT5mcmVxW3JhbmdlLT5udW1fZnJlcXVlbmN5XS5lID0gMTsKKwkJCQljZnArKzsKKwkJCQlyYW5nZS0+bnVtX2ZyZXF1ZW5jeSsrOworCQkJfQorCQl9CisJfQorCisJbGJzX3ByX2RlYnVnKDEsICJJV19NQVhfRlJFUVVFTkNJRVM9JWQgbnVtX2ZyZXF1ZW5jeT0lZFxuIiwKKwkgICAgICAgSVdfTUFYX0ZSRVFVRU5DSUVTLCByYW5nZS0+bnVtX2ZyZXF1ZW5jeSk7CisKKwlyYW5nZS0+bnVtX2NoYW5uZWxzID0gcmFuZ2UtPm51bV9mcmVxdWVuY3k7CisKKwlzb3J0X2NoYW5uZWxzKCZyYW5nZS0+ZnJlcVswXSwgcmFuZ2UtPm51bV9mcmVxdWVuY3kpOworCisJLyoKKwkgKiBTZXQgYW4gaW5kaWNhdGlvbiBvZiB0aGUgbWF4IFRDUCB0aHJvdWdocHV0IGluIGJpdC9zIHRoYXQgd2UgY2FuCisJICogZXhwZWN0IHVzaW5nIHRoaXMgaW50ZXJmYWNlCisJICovCisJaWYgKGkgPiAyKQorCQlyYW5nZS0+dGhyb3VnaHB1dCA9IDUwMDAgKiAxMDAwOworCWVsc2UKKwkJcmFuZ2UtPnRocm91Z2hwdXQgPSAxNTAwICogMTAwMDsKKworCXJhbmdlLT5taW5fcnRzID0gTVJWRFJWX1JUU19NSU5fVkFMVUU7CisJcmFuZ2UtPm1heF9ydHMgPSBNUlZEUlZfUlRTX01BWF9WQUxVRTsKKwlyYW5nZS0+bWluX2ZyYWcgPSBNUlZEUlZfRlJBR19NSU5fVkFMVUU7CisJcmFuZ2UtPm1heF9mcmFnID0gTVJWRFJWX0ZSQUdfTUFYX1ZBTFVFOworCisJcmFuZ2UtPmVuY29kaW5nX3NpemVbMF0gPSA1OworCXJhbmdlLT5lbmNvZGluZ19zaXplWzFdID0gMTM7CisJcmFuZ2UtPm51bV9lbmNvZGluZ19zaXplcyA9IDI7CisJcmFuZ2UtPm1heF9lbmNvZGluZ190b2tlbnMgPSA0OworCisJcmFuZ2UtPm1pbl9wbXAgPSAxMDAwMDAwOworCXJhbmdlLT5tYXhfcG1wID0gMTIwMDAwMDAwOworCXJhbmdlLT5taW5fcG10ID0gMTAwMDsKKwlyYW5nZS0+bWF4X3BtdCA9IDEwMDAwMDA7CisJcmFuZ2UtPnBtcF9mbGFncyA9IElXX1BPV0VSX1BFUklPRDsKKwlyYW5nZS0+cG10X2ZsYWdzID0gSVdfUE9XRVJfVElNRU9VVDsKKwlyYW5nZS0+cG1fY2FwYSA9IElXX1BPV0VSX1BFUklPRCB8IElXX1BPV0VSX1RJTUVPVVQgfCBJV19QT1dFUl9BTExfUjsKKworCS8qCisJICogTWluaW11bSB2ZXJzaW9uIHdlIHJlY29tbWVuZAorCSAqLworCXJhbmdlLT53ZV92ZXJzaW9uX3NvdXJjZSA9IDE1OworCisJLyoKKwkgKiBWZXJzaW9uIHdlIGFyZSBjb21waWxlZCB3aXRoCisJICovCisJcmFuZ2UtPndlX3ZlcnNpb25fY29tcGlsZWQgPSBXSVJFTEVTU19FWFQ7CisKKwlyYW5nZS0+cmV0cnlfY2FwYSA9IElXX1JFVFJZX0xJTUlUOworCXJhbmdlLT5yZXRyeV9mbGFncyA9IElXX1JFVFJZX0xJTUlUIHwgSVdfUkVUUllfTUFYOworCisJcmFuZ2UtPm1pbl9yZXRyeSA9IFRYX1JFVFJZX01JTjsKKwlyYW5nZS0+bWF4X3JldHJ5ID0gVFhfUkVUUllfTUFYOworCisJLyoKKwkgKiBTZXQgdGhlIHF1YWwsIGxldmVsIGFuZCBub2lzZSByYW5nZSB2YWx1ZXMKKwkgKi8KKwlyYW5nZS0+bWF4X3F1YWwucXVhbCA9IDEwMDsKKwlyYW5nZS0+bWF4X3F1YWwubGV2ZWwgPSAwOworCXJhbmdlLT5tYXhfcXVhbC5ub2lzZSA9IDA7CisJcmFuZ2UtPm1heF9xdWFsLnVwZGF0ZWQgPSBJV19RVUFMX0FMTF9VUERBVEVEIHwgSVdfUVVBTF9EQk07CisKKwlyYW5nZS0+YXZnX3F1YWwucXVhbCA9IDcwOworCS8qIFRPRE86IEZpbmQgcmVhbCAnZ29vZCcgdG8gJ2JhZCcgdGhyZXNob2xkIHZhbHVlIGZvciBSU1NJICovCisJcmFuZ2UtPmF2Z19xdWFsLmxldmVsID0gMDsKKwlyYW5nZS0+YXZnX3F1YWwubm9pc2UgPSAwOworCXJhbmdlLT5hdmdfcXVhbC51cGRhdGVkID0gSVdfUVVBTF9BTExfVVBEQVRFRCB8IElXX1FVQUxfREJNOworCisJcmFuZ2UtPnNlbnNpdGl2aXR5ID0gMDsKKworCS8qCisJICogU2V0dXAgdGhlIHN1cHBvcnRlZCBwb3dlciBsZXZlbCByYW5nZXMKKwkgKi8KKwltZW1zZXQocmFuZ2UtPnR4cG93ZXIsIDAsIHNpemVvZihyYW5nZS0+dHhwb3dlcikpOworCXJhbmdlLT50eHBvd2VyWzBdID0gNTsKKwlyYW5nZS0+dHhwb3dlclsxXSA9IDc7CisJcmFuZ2UtPnR4cG93ZXJbMl0gPSA5OworCXJhbmdlLT50eHBvd2VyWzNdID0gMTE7CisJcmFuZ2UtPnR4cG93ZXJbNF0gPSAxMzsKKwlyYW5nZS0+dHhwb3dlcls1XSA9IDE1OworCXJhbmdlLT50eHBvd2VyWzZdID0gMTc7CisJcmFuZ2UtPnR4cG93ZXJbN10gPSAxOTsKKworCXJhbmdlLT5udW1fdHhwb3dlciA9IDg7CisJcmFuZ2UtPnR4cG93ZXJfY2FwYSA9IElXX1RYUE9XX0RCTTsKKwlyYW5nZS0+dHhwb3dlcl9jYXBhIHw9IElXX1RYUE9XX1JBTkdFOworCisJcmFuZ2UtPmV2ZW50X2NhcGFbMF0gPSAoSVdfRVZFTlRfQ0FQQV9LXzAgfAorCQkJCUlXX0VWRU5UX0NBUEFfTUFTSyhTSU9DR0lXQVApIHwKKwkJCQlJV19FVkVOVF9DQVBBX01BU0soU0lPQ0dJV1NDQU4pKTsKKwlyYW5nZS0+ZXZlbnRfY2FwYVsxXSA9IElXX0VWRU5UX0NBUEFfS18xOworCisJaWYgKGFkYXB0ZXItPmZ3Y2FwaW5mbyAmIEZXX0NBUElORk9fV1BBKSB7CisJCXJhbmdlLT5lbmNfY2FwYSA9ICAgSVdfRU5DX0NBUEFfV1BBCisJCSAgICAgICAgICAgICAgICAgIHwgSVdfRU5DX0NBUEFfV1BBMgorCQkgICAgICAgICAgICAgICAgICB8IElXX0VOQ19DQVBBX0NJUEhFUl9US0lQCisJCSAgICAgICAgICAgICAgICAgIHwgSVdfRU5DX0NBUEFfQ0lQSEVSX0NDTVA7CisJfQorCisJTEVBVkUoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bGFuX3NldF9wb3dlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICBzdHJ1Y3QgaXdfcGFyYW0gKnZ3cnEsIGNoYXIgKmV4dHJhKQoreworCXdsYW5fcHJpdmF0ZSAqcHJpdiA9IGRldi0+cHJpdjsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCisJRU5URVIoKTsKKworCS8qIFBTIGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQgb25seSBpbiBJbmZyYXN0cnVjdHVyZSBtb2RlCisJICogUmVtb3ZlIHRoaXMgY2hlY2sgaWYgaXQgaXMgdG8gYmUgc3VwcG9ydGVkIGluIElCU1MgbW9kZSBhbHNvCisJICovCisKKwlpZiAodndycS0+ZGlzYWJsZWQpIHsKKwkJYWRhcHRlci0+cHNtb2RlID0gd2xhbjgwMl8xMXBvd2VybW9kZWNhbTsKKwkJaWYgKGFkYXB0ZXItPnBzc3RhdGUgIT0gUFNfU1RBVEVfRlVMTF9QT1dFUikgeworCQkJbGliZXJ0YXNfcHNfd2FrZXVwKHByaXYsIGNtZF9vcHRpb25fd2FpdGZvcnJzcCk7CisJCX0KKworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoKHZ3cnEtPmZsYWdzICYgSVdfUE9XRVJfVFlQRSkgPT0gSVdfUE9XRVJfVElNRU9VVCkgeworCQlsYnNfcHJfZGVidWcoMSwKKwkJICAgICAgICJTZXR0aW5nIHBvd2VyIHRpbWVvdXQgY29tbWFuZCBpcyBub3Qgc3VwcG9ydGVkXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfSBlbHNlIGlmICgodndycS0+ZmxhZ3MgJiBJV19QT1dFUl9UWVBFKSA9PSBJV19QT1dFUl9QRVJJT0QpIHsKKwkJbGJzX3ByX2RlYnVnKDEsICJTZXR0aW5nIHBvd2VyIHBlcmlvZCBjb21tYW5kIGlzIG5vdCBzdXBwb3J0ZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoYWRhcHRlci0+cHNtb2RlICE9IHdsYW44MDJfMTFwb3dlcm1vZGVjYW0pIHsKKwkJcmV0dXJuIDA7CisJfQorCisJYWRhcHRlci0+cHNtb2RlID0gd2xhbjgwMl8xMXBvd2VybW9kZW1heF9wc3A7CisKKwlpZiAoYWRhcHRlci0+Y29ubmVjdF9zdGF0dXMgPT0gbGliZXJ0YXNfY29ubmVjdGVkKSB7CisJCWxpYmVydGFzX3BzX3NsZWVwKHByaXYsIGNtZF9vcHRpb25fd2FpdGZvcnJzcCk7CisJfQorCisJTEVBVkUoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bGFuX2dldF9wb3dlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICBzdHJ1Y3QgaXdfcGFyYW0gKnZ3cnEsIGNoYXIgKmV4dHJhKQoreworCXdsYW5fcHJpdmF0ZSAqcHJpdiA9IGRldi0+cHJpdjsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCWludCBtb2RlOworCisJRU5URVIoKTsKKworCW1vZGUgPSBhZGFwdGVyLT5wc21vZGU7CisKKwlpZiAoKHZ3cnEtPmRpc2FibGVkID0gKG1vZGUgPT0gd2xhbjgwMl8xMXBvd2VybW9kZWNhbSkpCisJICAgIHx8IGFkYXB0ZXItPmNvbm5lY3Rfc3RhdHVzID09IGxpYmVydGFzX2Rpc2Nvbm5lY3RlZCkgeworCQlMRUFWRSgpOworCQlyZXR1cm4gMDsKKwl9CisKKwl2d3JxLT52YWx1ZSA9IDA7CisKKwlMRUFWRSgpOworCXJldHVybiAwOworfQorCisvKgorICogaXdwcml2IHNldHRhYmxlIGNhbGxiYWNrcworICovCisKK3N0YXRpYyBjb25zdCBpd19oYW5kbGVyIHdsYW5fcHJpdmF0ZV9oYW5kbGVyW10gPSB7CisJTlVMTCwJCQkvKiBTSU9DSVdGSVJTVFBSSVYgKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaXdfcHJpdl9hcmdzIHdsYW5fcHJpdmF0ZV9hcmdzW10gPSB7CisJLyoKKwkgKiB7IGNtZCwgc2V0X2FyZ3MsIGdldF9hcmdzLCBuYW1lIH0KKwkgKi8KKwl7CisJIFdMQU5TQ0FOX1RZUEUsCisJIElXX1BSSVZfVFlQRV9DSEFSIHwgOCwKKwkgSVdfUFJJVl9UWVBFX0NIQVIgfCA4LAorCSAic2NhbnR5cGUifSwKKworCXsKKwkgV0xBTl9TRVRJTlRfR0VUSU5ULAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJICIifSwKKwl7CisJIFdMQU5ORiwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCSAiZ2V0TkYifSwKKwl7CisJIFdMQU5SU1NJLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJICJnZXRSU1NJIn0sCisJeworCSBXTEFORU5BQkxFMTFELAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJICJlbmFibGUxMWQifSwKKwl7CisJIFdMQU5BREhPQ0dSQVRFLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJICJhZGhvY2dyYXRlIn0sCisKKwl7CisJIFdMQU5fU1VCQ01EX1NFVF9QUkVTQ0FOLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJICJwcmVzY2FuIn0sCisJeworCSBXTEFOX1NFVE9ORUlOVF9HRVRPTkVJTlQsCisJIElXX1BSSVZfVFlQRV9JTlQgfCAxLAorCSBJV19QUklWX1RZUEVfSU5UIHwgMSwKKwkgIiJ9LAorCXsKKwkgV0xBTl9CRUFDT05fSU5URVJWQUwsCisJIElXX1BSSVZfVFlQRV9JTlQgfCAxLAorCSBJV19QUklWX1RZUEVfSU5UIHwgMSwKKwkgImJjbmludGVydmFsIn0sCisJeworCSBXTEFOX0xJU1RFTklOVFJWTCwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IDEsCisJIElXX1BSSVZfVFlQRV9JTlQgfCAxLAorCSAibG9saXN0ZW5pbnRlciJ9LAorCXsKKwkgV0xBTl9UWENPTlRST0wsCisJIElXX1BSSVZfVFlQRV9JTlQgfCAxLAorCSBJV19QUklWX1RZUEVfSU5UIHwgMSwKKwkgInR4Y29udHJvbCJ9LAorCXsKKwkgV0xBTl9OVUxMUEtUSU5URVJWQUwsCisJIElXX1BSSVZfVFlQRV9JTlQgfCAxLAorCSBJV19QUklWX1RZUEVfSU5UIHwgMSwKKwkgInBzbnVsbGludGVydmFsIn0sCisJLyogVXNpbmcgaXdwcml2IHN1Yi1jb21tYW5kIGZlYXR1cmUgKi8KKwl7CisJIFdMQU5fU0VUT05FSU5UX0dFVE5PTkUsCS8qIElPQ1RMOiAyNCAqLworCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgSVdfUFJJVl9UWVBFX05PTkUsCisJICIifSwKKworCXsKKwkgV0xBTl9TVUJDTURfU0VUUlhBTlRFTk5BLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgSVdfUFJJVl9UWVBFX05PTkUsCisJICJzZXRyeGFudCJ9LAorCXsKKwkgV0xBTl9TVUJDTURfU0VUVFhBTlRFTk5BLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgSVdfUFJJVl9UWVBFX05PTkUsCisJICJzZXR0eGFudCJ9LAorCXsKKwkgV0xBTlNFVEFVVEhBTEcsCisJIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCSBJV19QUklWX1RZUEVfTk9ORSwKKwkgImF1dGhhbGdzIiwKKwkgfSwKKwl7CisJIFdMQU5TRVQ4MDIxWEFVVEhBTEcsCisJIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCSBJV19QUklWX1RZUEVfTk9ORSwKKwkgIjgwMjF4YXV0aGFsZ3MiLAorCSB9LAorCXsKKwkgV0xBTlNFVEVOQ1JZUFRJT05NT0RFLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgSVdfUFJJVl9UWVBFX05PTkUsCisJICJlbmNyeXB0aW9ubW9kZSIsCisJIH0sCisJeworCSBXTEFOU0VUUkVHSU9OLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgSVdfUFJJVl9UWVBFX05PTkUsCisJICJzZXRyZWdpb25jb2RlIn0sCisJeworCSBXTEFOX1NFVF9MSVNURU5fSU5URVJWQUwsCisJIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCSBJV19QUklWX1RZUEVfTk9ORSwKKwkgInNldGxpc3RlbmludGVyIn0sCisJeworCSBXTEFOX1NFVF9NVUxUSVBMRV9EVElNLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgSVdfUFJJVl9UWVBFX05PTkUsCisJICJzZXRtdWx0aXBsZWR0aW0ifSwKKwl7CisJIFdMQU5fU0VUX0FUSU1fV0lORE9XLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgSVdfUFJJVl9UWVBFX05PTkUsCisJICJhdGltd2luZG93In0sCisJeworCSBXTEFOU0VUQkNOQVZHLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgSVdfUFJJVl9UWVBFX05PTkUsCisJICJzZXRiY25hdmcifSwKKwl7CisJIFdMQU5TRVREQVRBQVZHLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgSVdfUFJJVl9UWVBFX05PTkUsCisJICJzZXRkYXRhYXZnIn0sCisJeworCSBXTEFOX1NFVF9MSU5LTU9ERSwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJIElXX1BSSVZfVFlQRV9OT05FLAorCSAibGlua21vZGUifSwKKwl7CisJIFdMQU5fU0VUX1JBRElPTU9ERSwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJIElXX1BSSVZfVFlQRV9OT05FLAorCSAicmFkaW9tb2RlIn0sCisJeworCSBXTEFOX1NFVF9ERUJVR01PREUsCisJIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCSBJV19QUklWX1RZUEVfTk9ORSwKKwkgImRlYnVnbW9kZSJ9LAorCXsKKwkgV0xBTl9TVUJDTURfTUVTSF9TRVRfVFRMLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgSVdfUFJJVl9UWVBFX05PTkUsCisJICJtZXNoX3NldF90dGwifSwKKwl7CisJIFdMQU5fU0VUTk9ORV9HRVRPTkVJTlQsCisJIElXX1BSSVZfVFlQRV9OT05FLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgIiJ9LAorCXsKKwkgV0xBTkdFVFJFR0lPTiwKKwkgSVdfUFJJVl9UWVBFX05PTkUsCisJIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCSAiZ2V0cmVnaW9uY29kZSJ9LAorCXsKKwkgV0xBTl9HRVRfTElTVEVOX0lOVEVSVkFMLAorCSBJV19QUklWX1RZUEVfTk9ORSwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJICJnZXRsaXN0ZW5pbnRlciJ9LAorCXsKKwkgV0xBTl9HRVRfTVVMVElQTEVfRFRJTSwKKwkgSVdfUFJJVl9UWVBFX05PTkUsCisJIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCSAiZ2V0bXVsdGlwbGVkdGltIn0sCisJeworCSBXTEFOX0dFVF9UWF9SQVRFLAorCSBJV19QUklWX1RZUEVfTk9ORSwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJICJnZXR0eHJhdGUifSwKKwl7CisJIFdMQU5HRVRCQ05BVkcsCisJIElXX1BSSVZfVFlQRV9OT05FLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgImdldGJjbmF2ZyJ9LAorCXsKKwkgV0xBTl9HRVRfTElOS01PREUsCisJIElXX1BSSVZfVFlQRV9OT05FLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgImdldF9saW5rbW9kZSJ9LAorCXsKKwkgV0xBTl9HRVRfUkFESU9NT0RFLAorCSBJV19QUklWX1RZUEVfTk9ORSwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJICJnZXRfcmFkaW9tb2RlIn0sCisJeworCSBXTEFOX0dFVF9ERUJVR01PREUsCisJIElXX1BSSVZfVFlQRV9OT05FLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgImdldF9kZWJ1Z21vZGUifSwKKwl7CisJIFdMQU5fU1VCQ01EX0ZXVF9DTEVBTlVQLAorCSBJV19QUklWX1RZUEVfTk9ORSwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJICJmd3RfY2xlYW51cCJ9LAorCXsKKwkgV0xBTl9TVUJDTURfRldUX1RJTUUsCisJIElXX1BSSVZfVFlQRV9OT05FLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgImZ3dF90aW1lIn0sCisJeworCSBXTEFOX1NVQkNNRF9NRVNIX0dFVF9UVEwsCisJIElXX1BSSVZfVFlQRV9OT05FLAorCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgIm1lc2hfZ2V0X3R0bCJ9LAorCXsKKwkgV0xBTl9TRVROT05FX0dFVFRXRUxWRV9DSEFSLAorCSBJV19QUklWX1RZUEVfTk9ORSwKKwkgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMiwKKwkgIiJ9LAorCXsKKwkgV0xBTl9TVUJDTURfR0VUUlhBTlRFTk5BLAorCSBJV19QUklWX1RZUEVfTk9ORSwKKwkgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMiwKKwkgImdldHJ4YW50In0sCisJeworCSBXTEFOX1NVQkNNRF9HRVRUWEFOVEVOTkEsCisJIElXX1BSSVZfVFlQRV9OT05FLAorCSBJV19QUklWX1RZUEVfQ0hBUiB8IDEyLAorCSAiZ2V0dHhhbnQifSwKKwl7CisJIFdMQU5fR0VUX1RTRiwKKwkgSVdfUFJJVl9UWVBFX05PTkUsCisJIElXX1BSSVZfVFlQRV9DSEFSIHwgMTIsCisJICJnZXR0c2YifSwKKwl7CisJIFdMQU5fU0VUTk9ORV9HRVROT05FLAorCSBJV19QUklWX1RZUEVfTk9ORSwKKwkgSVdfUFJJVl9UWVBFX05PTkUsCisJICIifSwKKwl7CisJIFdMQU5ERUFVVEgsCisJIElXX1BSSVZfVFlQRV9OT05FLAorCSBJV19QUklWX1RZUEVfTk9ORSwKKwkgImRlYXV0aCJ9LAorCXsKKwkgV0xBTkFESE9DU1RPUCwKKwkgSVdfUFJJVl9UWVBFX05PTkUsCisJIElXX1BSSVZfVFlQRV9OT05FLAorCSAiYWRob2NzdG9wIn0sCisJeworCSBXTEFOUkFESU9PTiwKKwkgSVdfUFJJVl9UWVBFX05PTkUsCisJIElXX1BSSVZfVFlQRV9OT05FLAorCSAicmFkaW9vbiJ9LAorCXsKKwkgV0xBTlJBRElPT0ZGLAorCSBJV19QUklWX1RZUEVfTk9ORSwKKwkgSVdfUFJJVl9UWVBFX05PTkUsCisJICJyYWRpb29mZiJ9LAorCXsKKwkgV0xBTldMQU5JRExFT04sCisJIElXX1BSSVZfVFlQRV9OT05FLAorCSBJV19QUklWX1RZUEVfTk9ORSwKKwkgIndsYW5pZGxlLW9uIn0sCisJeworCSBXTEFOV0xBTklETEVPRkYsCisJIElXX1BSSVZfVFlQRV9OT05FLAorCSBJV19QUklWX1RZUEVfTk9ORSwKKwkgIndsYW5pZGxlLW9mZiJ9LAorCXsKKwkgV0xBTl9TVUJDTURfRldUX1JFU0VULAorCSBJV19QUklWX1RZUEVfTk9ORSwKKwkgSVdfUFJJVl9UWVBFX05PTkUsCisJICJmd3RfcmVzZXQifSwKKwl7CisJIFdMQU5fU1VCQ01EX0JUX1JFU0VULAorCSBJV19QUklWX1RZUEVfTk9ORSwKKwkgSVdfUFJJVl9UWVBFX05PTkUsCisJICJidF9yZXNldCJ9LAorCXsKKwkgV0xBTl9TRVQxMjhDSEFSX0dFVDEyOENIQVIsCisJIElXX1BSSVZfVFlQRV9DSEFSIHwgMTI4LAorCSBJV19QUklWX1RZUEVfQ0hBUiB8IDEyOCwKKwkgIiJ9LAorCS8qIEJUIE1hbmFnZW1lbnQgKi8KKwl7CisJIFdMQU5fU1VCQ01EX0JUX0FERCwKKwkgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMjgsCisJIElXX1BSSVZfVFlQRV9DSEFSIHwgMTI4LAorCSAiYnRfYWRkIn0sCisJeworCSBXTEFOX1NVQkNNRF9CVF9ERUwsCisJIElXX1BSSVZfVFlQRV9DSEFSIHwgMTI4LAorCSBJV19QUklWX1RZUEVfQ0hBUiB8IDEyOCwKKwkgImJ0X2RlbCJ9LAorCXsKKwkgV0xBTl9TVUJDTURfQlRfTElTVCwKKwkgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMjgsCisJIElXX1BSSVZfVFlQRV9DSEFSIHwgMTI4LAorCSAiYnRfbGlzdCJ9LAorCS8qIEZXVCBNYW5hZ2VtZW50ICovCisJeworCSBXTEFOX1NVQkNNRF9GV1RfQURELAorCSBJV19QUklWX1RZUEVfQ0hBUiB8IDEyOCwKKwkgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMjgsCisJICJmd3RfYWRkIn0sCisJeworCSBXTEFOX1NVQkNNRF9GV1RfREVMLAorCSBJV19QUklWX1RZUEVfQ0hBUiB8IDEyOCwKKwkgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMjgsCisJICJmd3RfZGVsIn0sCisJeworCSBXTEFOX1NVQkNNRF9GV1RfTE9PS1VQLAorCSBJV19QUklWX1RZUEVfQ0hBUiB8IDEyOCwKKwkgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMjgsCisJICJmd3RfbG9va3VwIn0sCisJeworCSBXTEFOX1NVQkNNRF9GV1RfTElTVF9ORUlHSEJPUiwKKwkgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMjgsCisJIElXX1BSSVZfVFlQRV9DSEFSIHwgMTI4LAorCSAiZnd0X2xpc3RfbmVpZ2gifSwKKwl7CisJIFdMQU5fU1VCQ01EX0ZXVF9MSVNULAorCSBJV19QUklWX1RZUEVfQ0hBUiB8IDEyOCwKKwkgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMjgsCisJICJmd3RfbGlzdCJ9LAorCXsKKwkgV0xBTl9TVUJDTURfRldUX0xJU1RfUk9VVEUsCisJIElXX1BSSVZfVFlQRV9DSEFSIHwgMTI4LAorCSBJV19QUklWX1RZUEVfQ0hBUiB8IDEyOCwKKwkgImZ3dF9saXN0X3JvdXRlIn0sCisJeworCSBXTEFOU0NBTl9NT0RFLAorCSBJV19QUklWX1RZUEVfQ0hBUiB8IDEyOCwKKwkgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMjgsCisJICJzY2FubW9kZSJ9LAorCXsKKwkgV0xBTl9HRVRfQURIT0NfU1RBVFVTLAorCSBJV19QUklWX1RZUEVfQ0hBUiB8IDEyOCwKKwkgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMjgsCisJICJnZXRhZGhvY3N0YXR1cyJ9LAorCXsKKwkgV0xBTl9TRVROT05FX0dFVFdPUkRDSEFSLAorCSBJV19QUklWX1RZUEVfTk9ORSwKKwkgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMjgsCisJICIifSwKKwl7CisJIFdMQU5TRVRXUEFJRSwKKwkgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfRklYRUQgfCAyNCwKKwkgSVdfUFJJVl9UWVBFX05PTkUsCisJICJzZXR3cGFpZSJ9LAorCXsKKwkgV0xBTkdFVExPRywKKwkgSVdfUFJJVl9UWVBFX05PTkUsCisJIElXX1BSSVZfVFlQRV9DSEFSIHwgR0VUTE9HX0JVRlNJWkUsCisJICJnZXRsb2cifSwKKwl7CisJIFdMQU5fU0VUX0dFVF9TSVhURUVOX0lOVCwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IDE2LAorCSBJV19QUklWX1RZUEVfSU5UIHwgMTYsCisJICIifSwKKwl7CisJIFdMQU5fVFBDQ0ZHLAorCSBJV19QUklWX1RZUEVfSU5UIHwgMTYsCisJIElXX1BSSVZfVFlQRV9JTlQgfCAxNiwKKwkgInRwY2NmZyJ9LAorCXsKKwkgV0xBTl9QT1dFUkNGRywKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IDE2LAorCSBJV19QUklWX1RZUEVfSU5UIHwgMTYsCisJICJwb3dlcmNmZyJ9LAorCXsKKwkgV0xBTl9BVVRPX0ZSRVFfU0VULAorCSBJV19QUklWX1RZUEVfSU5UIHwgMTYsCisJIElXX1BSSVZfVFlQRV9JTlQgfCAxNiwKKwkgInNldGFmYyJ9LAorCXsKKwkgV0xBTl9BVVRPX0ZSRVFfR0VULAorCSBJV19QUklWX1RZUEVfSU5UIHwgMTYsCisJIElXX1BSSVZfVFlQRV9JTlQgfCAxNiwKKwkgImdldGFmYyJ9LAorCXsKKwkgV0xBTl9TQ0FOUFJPQkVTLAorCSBJV19QUklWX1RZUEVfSU5UIHwgMTYsCisJIElXX1BSSVZfVFlQRV9JTlQgfCAxNiwKKwkgInNjYW5wcm9iZXMifSwKKwl7CisJIFdMQU5fTEVEX0dQSU9fQ1RSTCwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IDE2LAorCSBJV19QUklWX1RZUEVfSU5UIHwgMTYsCisJICJsZWRncGlvIn0sCisJeworCSBXTEFOX0FEQVBUX1JBVEVTRVQsCisJIElXX1BSSVZfVFlQRV9JTlQgfCAxNiwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IDE2LAorCSAicmF0ZWFkYXB0In0sCisJeworCSBXTEFOX0lOQUNUSVZJVFlfVElNRU9VVCwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IDE2LAorCSBJV19QUklWX1RZUEVfSU5UIHwgMTYsCisJICJpbmFjdGl2aXR5dG8ifSwKKwl7CisJIFdMQU5TTlIsCisJIElXX1BSSVZfVFlQRV9JTlQgfCAxNiwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IDE2LAorCSAiZ2V0U05SIn0sCisJeworCSBXTEFOX0dFVF9SQVRFLAorCSBJV19QUklWX1RZUEVfSU5UIHwgMTYsCisJIElXX1BSSVZfVFlQRV9JTlQgfCAxNiwKKwkgImdldHJhdGUifSwKKwl7CisJIFdMQU5fR0VUX1JYSU5GTywKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IDE2LAorCSBJV19QUklWX1RZUEVfSU5UIHwgMTYsCisJICJnZXRyeGluZm8ifSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaXdfc3RhdGlzdGljcyAqd2xhbl9nZXRfd2lyZWxlc3Nfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwllbnVtIHsKKwkJUE9PUiA9IDMwLAorCQlGQUlSID0gNjAsCisJCUdPT0QgPSA4MCwKKwkJVkVSWV9HT09EID0gOTAsCisJCUVYQ0VMTEVOVCA9IDk1LAorCQlQRVJGRUNUID0gMTAwCisJfTsKKwl3bGFuX3ByaXZhdGUgKnByaXYgPSBkZXYtPnByaXY7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwl1MzIgcnNzaV9xdWFsOworCXUzMiB0eF9xdWFsOworCXUzMiBxdWFsaXR5ID0gMDsKKwlpbnQgc3RhdHNfdmFsaWQgPSAwOworCXU4IHJzc2k7CisJdTMyIHR4X3JldHJpZXM7CisKKwlFTlRFUigpOworCisJcHJpdi0+d3N0YXRzLnN0YXR1cyA9IGFkYXB0ZXItPmluZnJhbW9kZTsKKworCS8qIElmIHdlJ3JlIG5vdCBhc3NvY2lhdGVkLCBhbGwgcXVhbGl0eSB2YWx1ZXMgYXJlIG1lYW5pbmdsZXNzICovCisJaWYgKGFkYXB0ZXItPmNvbm5lY3Rfc3RhdHVzICE9IGxpYmVydGFzX2Nvbm5lY3RlZCkKKwkJZ290byBvdXQ7CisKKwkvKiBRdWFsaXR5IGJ5IFJTU0kgKi8KKwlwcml2LT53c3RhdHMucXVhbC5sZXZlbCA9CisJICAgIENBTF9SU1NJKGFkYXB0ZXItPlNOUltUWVBFX0JFQUNPTl1bVFlQRV9OT0FWR10sCisJICAgICBhZGFwdGVyLT5ORltUWVBFX0JFQUNPTl1bVFlQRV9OT0FWR10pOworCisJaWYgKGFkYXB0ZXItPk5GW1RZUEVfQkVBQ09OXVtUWVBFX05PQVZHXSA9PSAwKSB7CisJCXByaXYtPndzdGF0cy5xdWFsLm5vaXNlID0gTVJWRFJWX05GX0RFRkFVTFRfU0NBTl9WQUxVRTsKKwl9IGVsc2UgeworCQlwcml2LT53c3RhdHMucXVhbC5ub2lzZSA9CisJCSAgICBDQUxfTkYoYWRhcHRlci0+TkZbVFlQRV9CRUFDT05dW1RZUEVfTk9BVkddKTsKKwl9CisKKwlsYnNfcHJfZGVidWcoMSwgIlNpZ25hbCBMZXZlbCA9ICUjeFxuIiwgcHJpdi0+d3N0YXRzLnF1YWwubGV2ZWwpOworCWxic19wcl9kZWJ1ZygxLCAiTm9pc2UgPSAlI3hcbiIsIHByaXYtPndzdGF0cy5xdWFsLm5vaXNlKTsKKworCXJzc2kgPSBwcml2LT53c3RhdHMucXVhbC5sZXZlbCAtIHByaXYtPndzdGF0cy5xdWFsLm5vaXNlOworCWlmIChyc3NpIDwgMTUpCisJCXJzc2lfcXVhbCA9IHJzc2kgKiBQT09SIC8gMTA7CisJZWxzZSBpZiAocnNzaSA8IDIwKQorCQlyc3NpX3F1YWwgPSAocnNzaSAtIDE1KSAqIChGQUlSIC0gUE9PUikgLyA1ICsgUE9PUjsKKwllbHNlIGlmIChyc3NpIDwgMzApCisJCXJzc2lfcXVhbCA9IChyc3NpIC0gMjApICogKEdPT0QgLSBGQUlSKSAvIDUgKyBGQUlSOworCWVsc2UgaWYgKHJzc2kgPCA0MCkKKwkJcnNzaV9xdWFsID0gKHJzc2kgLSAzMCkgKiAoVkVSWV9HT09EIC0gR09PRCkgLworCQkgICAgMTAgKyBHT09EOworCWVsc2UKKwkJcnNzaV9xdWFsID0gKHJzc2kgLSA0MCkgKiAoUEVSRkVDVCAtIFZFUllfR09PRCkgLworCQkgICAgMTAgKyBWRVJZX0dPT0Q7CisJcXVhbGl0eSA9IHJzc2lfcXVhbDsKKworCS8qIFF1YWxpdHkgYnkgVFggZXJyb3JzICovCisJcHJpdi0+d3N0YXRzLmRpc2NhcmQucmV0cmllcyA9IHByaXYtPnN0YXRzLnR4X2Vycm9yczsKKworCXR4X3JldHJpZXMgPSBhZGFwdGVyLT5sb2dtc2cucmV0cnk7CisKKwlpZiAodHhfcmV0cmllcyA+IDc1KQorCQl0eF9xdWFsID0gKDkwIC0gdHhfcmV0cmllcykgKiBQT09SIC8gMTU7CisJZWxzZSBpZiAodHhfcmV0cmllcyA+IDcwKQorCQl0eF9xdWFsID0gKDc1IC0gdHhfcmV0cmllcykgKiAoRkFJUiAtIFBPT1IpIC8gNSArIFBPT1I7CisJZWxzZSBpZiAodHhfcmV0cmllcyA+IDY1KQorCQl0eF9xdWFsID0gKDcwIC0gdHhfcmV0cmllcykgKiAoR09PRCAtIEZBSVIpIC8gNSArIEZBSVI7CisJZWxzZSBpZiAodHhfcmV0cmllcyA+IDUwKQorCQl0eF9xdWFsID0gKDY1IC0gdHhfcmV0cmllcykgKiAoVkVSWV9HT09EIC0gR09PRCkgLworCQkgICAgMTUgKyBHT09EOworCWVsc2UKKwkJdHhfcXVhbCA9ICg1MCAtIHR4X3JldHJpZXMpICoKKwkJICAgIChQRVJGRUNUIC0gVkVSWV9HT09EKSAvIDUwICsgVkVSWV9HT09EOworCXF1YWxpdHkgPSBtaW4ocXVhbGl0eSwgdHhfcXVhbCk7CisKKwlwcml2LT53c3RhdHMuZGlzY2FyZC5jb2RlID0gYWRhcHRlci0+bG9nbXNnLndlcHVuZGVjcnlwdGFibGU7CisJcHJpdi0+d3N0YXRzLmRpc2NhcmQuZnJhZ21lbnQgPSBhZGFwdGVyLT5sb2dtc2cuZmNzZXJyb3I7CisJcHJpdi0+d3N0YXRzLmRpc2NhcmQucmV0cmllcyA9IHR4X3JldHJpZXM7CisJcHJpdi0+d3N0YXRzLmRpc2NhcmQubWlzYyA9IGFkYXB0ZXItPmxvZ21zZy5hY2tmYWlsdXJlOworCisJLyogQ2FsY3VsYXRlIHF1YWxpdHkgKi8KKwlwcml2LT53c3RhdHMucXVhbC5xdWFsID0gbWF4KHF1YWxpdHksICh1MzIpMTAwKTsKKwlwcml2LT53c3RhdHMucXVhbC51cGRhdGVkID0gSVdfUVVBTF9BTExfVVBEQVRFRCB8IElXX1FVQUxfREJNOworCXN0YXRzX3ZhbGlkID0gMTsKKworCS8qIHVwZGF0ZSBzdGF0cyBhc3luY2hyb25vdXNseSBmb3IgZnV0dXJlIGNhbGxzICovCisJbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsIGNtZF84MDJfMTFfcnNzaSwgMCwKKwkJCQkJMCwgMCwgTlVMTCk7CisJbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsIGNtZF84MDJfMTFfZ2V0X2xvZywgMCwKKwkJCQkJMCwgMCwgTlVMTCk7CitvdXQ6CisJaWYgKCFzdGF0c192YWxpZCkgeworCQlwcml2LT53c3RhdHMubWlzcy5iZWFjb24gPSAwOworCQlwcml2LT53c3RhdHMuZGlzY2FyZC5yZXRyaWVzID0gMDsKKwkJcHJpdi0+d3N0YXRzLnF1YWwucXVhbCA9IDA7CisJCXByaXYtPndzdGF0cy5xdWFsLmxldmVsID0gMDsKKwkJcHJpdi0+d3N0YXRzLnF1YWwubm9pc2UgPSAwOworCQlwcml2LT53c3RhdHMucXVhbC51cGRhdGVkID0gSVdfUVVBTF9BTExfVVBEQVRFRDsKKwkJcHJpdi0+d3N0YXRzLnF1YWwudXBkYXRlZCB8PSBJV19RVUFMX05PSVNFX0lOVkFMSUQgfAorCQkgICAgSVdfUVVBTF9RVUFMX0lOVkFMSUQgfCBJV19RVUFMX0xFVkVMX0lOVkFMSUQ7CisJfQorCisJTEVBVkUgKCk7CisJcmV0dXJuICZwcml2LT53c3RhdHM7CisKKworfQorCitzdGF0aWMgaW50IHdsYW5fc2V0X2ZyZXEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICBzdHJ1Y3QgaXdfZnJlcSAqZndycSwgY2hhciAqZXh0cmEpCit7CisJaW50IHJldCA9IDA7CisJd2xhbl9wcml2YXRlICpwcml2ID0gZGV2LT5wcml2OworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJaW50IHJjID0gLUVJTlBST0dSRVNTOwkvKiBDYWxsIGNvbW1pdCBoYW5kbGVyICovCisJc3RydWN0IGNoYW5fZnJlcV9wb3dlciAqY2ZwOworCisJRU5URVIoKTsKKworCS8qCisJICogSWYgc2V0dGluZyBieSBmcmVxdWVuY3ksIGNvbnZlcnQgdG8gYSBjaGFubmVsCisJICovCisJaWYgKGZ3cnEtPmUgPT0gMSkgeworCisJCWxvbmcgZiA9IGZ3cnEtPm0gLyAxMDAwMDA7CisJCWludCBjID0gMDsKKworCQljZnAgPSBmaW5kX2NmcF9ieV9iYW5kX2FuZF9mcmVxKGFkYXB0ZXIsIDAsIGYpOworCQlpZiAoIWNmcCkgeworCQkJbGJzX3ByX2RlYnVnKDEsICJJbnZhbGlkIGZyZXE9JWxkXG4iLCBmKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJYyA9IChpbnQpY2ZwLT5jaGFubmVsOworCisJCWlmIChjIDwgMCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWZ3cnEtPmUgPSAwOworCQlmd3JxLT5tID0gYzsKKwl9CisKKwkvKgorCSAqIFNldHRpbmcgYnkgY2hhbm5lbCBudW1iZXIKKwkgKi8KKwlpZiAoZndycS0+bSA+IDEwMDAgfHwgZndycS0+ZSA+IDApIHsKKwkJcmMgPSAtRU9QTk9UU1VQUDsKKwl9IGVsc2UgeworCQlpbnQgY2hhbm5lbCA9IGZ3cnEtPm07CisKKwkJY2ZwID0gbGliZXJ0YXNfZmluZF9jZnBfYnlfYmFuZF9hbmRfY2hhbm5lbChhZGFwdGVyLCAwLCBjaGFubmVsKTsKKwkJaWYgKCFjZnApIHsKKwkJCXJjID0gLUVJTlZBTDsKKwkJfSBlbHNlIHsKKwkJCWlmIChhZGFwdGVyLT5pbmZyYW1vZGUgPT0gd2xhbjgwMl8xMWlic3MpIHsKKwkJCQlyYyA9IGNoYW5nZWFkaG9jY2hhbm5lbChwcml2LCBjaGFubmVsKTsKKwkJCQkvKiAgSWYgc3RhdGlvbiBpcyBXRVAgZW5hYmxlZCwgc2VuZCB0aGUKKwkJCQkgKiAgY29tbWFuZCB0byBzZXQgV0VQIGluIGZpcm13YXJlCisJCQkJICovCisJCQkJaWYgKGFkYXB0ZXItPnNlY2luZm8uV0VQc3RhdHVzID09CisJCQkJICAgIHdsYW44MDJfMTFXRVBlbmFibGVkKSB7CisJCQkJCWxic19wcl9kZWJ1ZygxLCAic2V0X2ZyZXE6IFdFUCBlbmFibGVkXG4iKTsKKwkJCQkJcmV0ID0gbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsCisJCQkJCQkJCSAgICBjbWRfODAyXzExX3NldF93ZXAsCisJCQkJCQkJCSAgICBjbWRfYWN0X2FkZCwKKwkJCQkJCQkJICAgIGNtZF9vcHRpb25fd2FpdGZvcnJzcCwKKwkJCQkJCQkJICAgIDAsCisJCQkJCQkJCSAgICBOVUxMKTsKKworCQkJCQlpZiAocmV0KSB7CisJCQkJCQlMRUFWRSgpOworCQkJCQkJcmV0dXJuIHJldDsKKwkJCQkJfQorCisJCQkJCWFkYXB0ZXItPmN1cnJlbnRwYWNrZXRmaWx0ZXIgfD0KKwkJCQkJICAgIGNtZF9hY3RfbWFjX3dlcF9lbmFibGU7CisKKwkJCQkJbGliZXJ0YXNfc2V0X21hY19wYWNrZXRfZmlsdGVyKHByaXYpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJcmMgPSAtRU9QTk9UU1VQUDsKKwkJCX0KKwkJfQorCX0KKworCUxFQVZFKCk7CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqICBAYnJpZWYgdXNlIGluZGV4IHRvIGdldCB0aGUgZGF0YSByYXRlCisgKgorICogIEBwYXJhbSBpbmRleCAgICAgICAgICAgICAgICBUaGUgaW5kZXggb2YgZGF0YSByYXRlCisgKiAgQHJldHVybiAJICAgCQlkYXRhIHJhdGUgb3IgMAorICovCit1MzIgbGliZXJ0YXNfaW5kZXhfdG9fZGF0YV9yYXRlKHU4IGluZGV4KQoreworCWlmIChpbmRleCA+PSBzaXplb2YobGliZXJ0YXNfd2xhbl9kYXRhX3JhdGVzKSkKKwkJaW5kZXggPSAwOworCisJcmV0dXJuIGxpYmVydGFzX3dsYW5fZGF0YV9yYXRlc1tpbmRleF07Cit9CisKKy8qKgorICogIEBicmllZiB1c2UgcmF0ZSB0byBnZXQgdGhlIGluZGV4CisgKgorICogIEBwYXJhbSByYXRlICAgICAgICAgICAgICAgICBkYXRhIHJhdGUKKyAqICBAcmV0dXJuIAkgICAJCWluZGV4IG9yIDAKKyAqLwordTggbGliZXJ0YXNfZGF0YV9yYXRlX3RvX2luZGV4KHUzMiByYXRlKQoreworCXU4ICpwdHI7CisKKwlpZiAocmF0ZSkKKwkJaWYgKChwdHIgPSBtZW1jaHIobGliZXJ0YXNfd2xhbl9kYXRhX3JhdGVzLCAodTgpIHJhdGUsCisJCQkJICBzaXplb2YobGliZXJ0YXNfd2xhbl9kYXRhX3JhdGVzKSkpKQorCQkJcmV0dXJuIChwdHIgLSBsaWJlcnRhc193bGFuX2RhdGFfcmF0ZXMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2xhbl9zZXRfcmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgIHN0cnVjdCBpd19wYXJhbSAqdndycSwgY2hhciAqZXh0cmEpCit7CisJd2xhbl9wcml2YXRlICpwcml2ID0gZGV2LT5wcml2OworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJdTMyIGRhdGFfcmF0ZTsKKwl1MTYgYWN0aW9uOworCWludCByZXQgPSAwOworCXU4IHJhdGVzW1dMQU5fU1VQUE9SVEVEX1JBVEVTXTsKKwl1OCAqcmF0ZTsKKworCUVOVEVSKCk7CisKKwlsYnNfcHJfZGVidWcoMSwgIlZ3cnEtPnZhbHVlID0gJWRcbiIsIHZ3cnEtPnZhbHVlKTsKKworCWlmICh2d3JxLT52YWx1ZSA9PSAtMSkgeworCQlhY3Rpb24gPSBjbWRfYWN0X3NldF90eF9hdXRvOwkvLyBBdXRvCisJCWFkYXB0ZXItPmlzX2RhdGFyYXRlX2F1dG8gPSAxOworCQlhZGFwdGVyLT5kYXRhcmF0ZSA9IDA7CisJfSBlbHNlIHsKKwkJaWYgKHZ3cnEtPnZhbHVlICUgMTAwMDAwKSB7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWRhdGFfcmF0ZSA9IHZ3cnEtPnZhbHVlIC8gNTAwMDAwOworCisJCW1lbXNldChyYXRlcywgMCwgc2l6ZW9mKHJhdGVzKSk7CisJCWdldF9hY3RpdmVfZGF0YV9yYXRlcyhhZGFwdGVyLCByYXRlcyk7CisJCXJhdGUgPSByYXRlczsKKwkJd2hpbGUgKCpyYXRlKSB7CisJCQlsYnNfcHJfZGVidWcoMSwgIlJhdGU9MHglWCAgV2FudGVkPTB4JVhcbiIsICpyYXRlLAorCQkJICAgICAgIGRhdGFfcmF0ZSk7CisJCQlpZiAoKCpyYXRlICYgMHg3ZikgPT0gKGRhdGFfcmF0ZSAmIDB4N2YpKQorCQkJCWJyZWFrOworCQkJcmF0ZSsrOworCQl9CisJCWlmICghKnJhdGUpIHsKKwkJCWxic19wcl9hbGVydCggIlRoZSBmaXhlZCBkYXRhIHJhdGUgMHglWCBpcyBvdXQgIgorCQkJICAgICAgICJvZiByYW5nZS5cbiIsIGRhdGFfcmF0ZSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWFkYXB0ZXItPmRhdGFyYXRlID0gZGF0YV9yYXRlOworCQlhY3Rpb24gPSBjbWRfYWN0X3NldF90eF9maXhfcmF0ZTsKKwkJYWRhcHRlci0+aXNfZGF0YXJhdGVfYXV0byA9IDA7CisJfQorCisJcmV0ID0gbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsIGNtZF84MDJfMTFfZGF0YV9yYXRlLAorCQkJCSAgICBhY3Rpb24sIGNtZF9vcHRpb25fd2FpdGZvcnJzcCwgMCwgTlVMTCk7CisKKwlMRUFWRSgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgd2xhbl9nZXRfcmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgIHN0cnVjdCBpd19wYXJhbSAqdndycSwgY2hhciAqZXh0cmEpCit7CisJd2xhbl9wcml2YXRlICpwcml2ID0gZGV2LT5wcml2OworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisKKwlFTlRFUigpOworCisJaWYgKGFkYXB0ZXItPmlzX2RhdGFyYXRlX2F1dG8pIHsKKwkJdndycS0+Zml4ZWQgPSAwOworCX0gZWxzZSB7CisJCXZ3cnEtPmZpeGVkID0gMTsKKwl9CisKKwl2d3JxLT52YWx1ZSA9IGFkYXB0ZXItPmRhdGFyYXRlICogNTAwMDAwOworCisJTEVBVkUoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bGFuX3NldF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywgdTMyICogdXdycSwgY2hhciAqZXh0cmEpCit7CisJaW50IHJldCA9IDA7CisJd2xhbl9wcml2YXRlICpwcml2ID0gZGV2LT5wcml2OworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJc3RydWN0IGFzc29jX3JlcXVlc3QgKiBhc3NvY19yZXE7CisJZW51bSBXTEFOXzgwMl8xMV9ORVRXT1JLX0lORlJBU1RSVUNUVVJFIG5ld19tb2RlOworCisJRU5URVIoKTsKKworCXN3aXRjaCAoKnV3cnEpIHsKKwljYXNlIElXX01PREVfQURIT0M6CisJCWxic19wcl9kZWJ1ZygxLCAiV2FudGVkIG1vZGUgaXMgYWQtaG9jOiBjdXJyZW50IGRhdGFyYXRlPSUjeFxuIiwKKwkJICAgICAgIGFkYXB0ZXItPmRhdGFyYXRlKTsKKwkJbmV3X21vZGUgPSB3bGFuODAyXzExaWJzczsKKwkJYWRhcHRlci0+YWRob2NjaGFubmVsID0gREVGQVVMVF9BRF9IT0NfQ0hBTk5FTDsKKwkJYnJlYWs7CisKKwljYXNlIElXX01PREVfSU5GUkE6CisJCWxic19wcl9kZWJ1ZygxLCAiV2FudGVkIG1vZGUgaXMgSW5mcmFzdHJ1Y3R1cmVcbiIpOworCQluZXdfbW9kZSA9IHdsYW44MDJfMTFpbmZyYXN0cnVjdHVyZTsKKwkJYnJlYWs7CisKKwljYXNlIElXX01PREVfQVVUTzoKKwkJbGJzX3ByX2RlYnVnKDEsICJXYW50ZWQgbW9kZSBpcyBBdXRvXG4iKTsKKwkJbmV3X21vZGUgPSB3bGFuODAyXzExYXV0b3Vua25vd247CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJbGJzX3ByX2RlYnVnKDEsICJXYW50ZWQgbW9kZSBpcyBVbmtub3duOiAweCV4XG4iLCAqdXdycSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW11dGV4X2xvY2soJmFkYXB0ZXItPmxvY2spOworCWFzc29jX3JlcSA9IHdsYW5fZ2V0X2Fzc29jaWF0aW9uX3JlcXVlc3QoYWRhcHRlcik7CisJaWYgKCFhc3NvY19yZXEpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwl9IGVsc2UgeworCQlhc3NvY19yZXEtPm1vZGUgPSBuZXdfbW9kZTsKKwl9CisKKwlpZiAocmV0ID09IDApIHsKKwkJc2V0X2JpdChBU1NPQ19GTEFHX01PREUsICZhc3NvY19yZXEtPmZsYWdzKTsKKwkJd2xhbl9wb3N0cG9uZV9hc3NvY2lhdGlvbl93b3JrKHByaXYpOworCX0gZWxzZSB7CisJCXdsYW5fY2FuY2VsX2Fzc29jaWF0aW9uX3dvcmsocHJpdik7CisJfQorCW11dGV4X3VubG9jaygmYWRhcHRlci0+bG9jayk7CisKKwlMRUFWRSgpOworCXJldHVybiByZXQ7Cit9CisKKworLyoqCisgKiAgQGJyaWVmIEdldCBFbmNyeXB0aW9uIGtleQorICoKKyAqICBAcGFyYW0gZGV2ICAgICAgICAgICAgICAgICAgQSBwb2ludGVyIHRvIG5ldF9kZXZpY2Ugc3RydWN0dXJlCisgKiAgQHBhcmFtIGluZm8JCQlBIHBvaW50ZXIgdG8gaXdfcmVxdWVzdF9pbmZvIHN0cnVjdHVyZQorICogIEBwYXJhbSB2d3JxIAkJQSBwb2ludGVyIHRvIGl3X3BhcmFtIHN0cnVjdHVyZQorICogIEBwYXJhbSBleHRyYQkJQSBwb2ludGVyIHRvIGV4dHJhIGRhdGEgYnVmCisgKiAgQHJldHVybiAJICAgCQkwIC0tc3VjY2Vzcywgb3RoZXJ3aXNlIGZhaWwKKyAqLworc3RhdGljIGludCB3bGFuX2dldF9lbmNvZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICBzdHJ1Y3QgaXdfcG9pbnQgKmR3cnEsIHU4ICogZXh0cmEpCit7CisJd2xhbl9wcml2YXRlICpwcml2ID0gZGV2LT5wcml2OworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJaW50IGluZGV4ID0gKGR3cnEtPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKSAtIDE7CisKKwlFTlRFUigpOworCisJbGJzX3ByX2RlYnVnKDEsICJmbGFncz0weCV4IGluZGV4PSVkIGxlbmd0aD0lZCB3ZXBfdHhfa2V5aWR4PSVkXG4iLAorCSAgICAgICBkd3JxLT5mbGFncywgaW5kZXgsIGR3cnEtPmxlbmd0aCwgYWRhcHRlci0+d2VwX3R4X2tleWlkeCk7CisKKwlkd3JxLT5mbGFncyA9IDA7CisKKwkvKiBBdXRoZW50aWNhdGlvbiBtZXRob2QgKi8KKwlzd2l0Y2ggKGFkYXB0ZXItPnNlY2luZm8uYXV0aG1vZGUpIHsKKwljYXNlIHdsYW44MDJfMTFhdXRobW9kZW9wZW46CisJCWR3cnEtPmZsYWdzID0gSVdfRU5DT0RFX09QRU47CisJCWJyZWFrOworCisJY2FzZSB3bGFuODAyXzExYXV0aG1vZGVzaGFyZWQ6CisJY2FzZSB3bGFuODAyXzExYXV0aG1vZGVuZXR3b3JrRUFQOgorCQlkd3JxLT5mbGFncyA9IElXX0VOQ09ERV9SRVNUUklDVEVEOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkd3JxLT5mbGFncyA9IElXX0VOQ09ERV9ESVNBQkxFRCB8IElXX0VOQ09ERV9PUEVOOworCQlicmVhazsKKwl9CisKKwlpZiAoKGFkYXB0ZXItPnNlY2luZm8uV0VQc3RhdHVzID09IHdsYW44MDJfMTFXRVBlbmFibGVkKQorCSAgICB8fCBhZGFwdGVyLT5zZWNpbmZvLldQQWVuYWJsZWQgfHwgYWRhcHRlci0+c2VjaW5mby5XUEEyZW5hYmxlZCkgeworCQlkd3JxLT5mbGFncyAmPSB+SVdfRU5DT0RFX0RJU0FCTEVEOworCX0gZWxzZSB7CisJCWR3cnEtPmZsYWdzIHw9IElXX0VOQ09ERV9ESVNBQkxFRDsKKwl9CisKKwltZW1zZXQoZXh0cmEsIDAsIDE2KTsKKworCW11dGV4X2xvY2soJmFkYXB0ZXItPmxvY2spOworCisJLyogRGVmYXVsdCB0byByZXR1cm5pbmcgY3VycmVudCB0cmFuc21pdCBrZXkgKi8KKwlpZiAoaW5kZXggPCAwKQorCQlpbmRleCA9IGFkYXB0ZXItPndlcF90eF9rZXlpZHg7CisKKwlpZiAoKGFkYXB0ZXItPndlcF9rZXlzW2luZGV4XS5sZW4pICYmCisJICAgIChhZGFwdGVyLT5zZWNpbmZvLldFUHN0YXR1cyA9PSB3bGFuODAyXzExV0VQZW5hYmxlZCkpIHsKKwkJbWVtY3B5KGV4dHJhLCBhZGFwdGVyLT53ZXBfa2V5c1tpbmRleF0ua2V5LAorCQkgICAgICAgYWRhcHRlci0+d2VwX2tleXNbaW5kZXhdLmxlbik7CisJCWR3cnEtPmxlbmd0aCA9IGFkYXB0ZXItPndlcF9rZXlzW2luZGV4XS5sZW47CisKKwkJZHdycS0+ZmxhZ3MgfD0gKGluZGV4ICsgMSk7CisJCS8qIFJldHVybiBXRVAgZW5hYmxlZCAqLworCQlkd3JxLT5mbGFncyAmPSB+SVdfRU5DT0RFX0RJU0FCTEVEOworCX0gZWxzZSBpZiAoKGFkYXB0ZXItPnNlY2luZm8uV1BBZW5hYmxlZCkKKwkJICAgfHwgKGFkYXB0ZXItPnNlY2luZm8uV1BBMmVuYWJsZWQpKSB7CisJCS8qIHJldHVybiBXUEEgZW5hYmxlZCAqLworCQlkd3JxLT5mbGFncyAmPSB+SVdfRU5DT0RFX0RJU0FCTEVEOworCX0gZWxzZSB7CisJCWR3cnEtPmZsYWdzIHw9IElXX0VOQ09ERV9ESVNBQkxFRDsKKwl9CisKKwltdXRleF91bmxvY2soJmFkYXB0ZXItPmxvY2spOworCisJZHdycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX05PS0VZOworCisJbGJzX3ByX2RlYnVnKDEsICJrZXk6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngga2V5bGVuPSVkXG4iLAorCSAgICAgICBleHRyYVswXSwgZXh0cmFbMV0sIGV4dHJhWzJdLAorCSAgICAgICBleHRyYVszXSwgZXh0cmFbNF0sIGV4dHJhWzVdLCBkd3JxLT5sZW5ndGgpOworCisJbGJzX3ByX2RlYnVnKDEsICJSZXR1cm4gZmxhZ3M9MHgleFxuIiwgZHdycS0+ZmxhZ3MpOworCisJTEVBVkUoKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiAgQGJyaWVmIFNldCBFbmNyeXB0aW9uIGtleSAoaW50ZXJuYWwpCisgKgorICogIEBwYXJhbSBwcml2CQkJQSBwb2ludGVyIHRvIHByaXZhdGUgY2FyZCBzdHJ1Y3R1cmUKKyAqICBAcGFyYW0ga2V5X21hdGVyaWFsCQlBIHBvaW50ZXIgdG8ga2V5IG1hdGVyaWFsCisgKiAgQHBhcmFtIGtleV9sZW5ndGgJCWxlbmd0aCBvZiBrZXkgbWF0ZXJpYWwKKyAqICBAcGFyYW0gaW5kZXgJCWtleSBpbmRleCB0byBzZXQKKyAqICBAcGFyYW0gc2V0X3R4X2tleQkJRm9yY2Ugc2V0IFRYIGtleSAoMSA9IHllcywgMCA9IG5vKQorICogIEByZXR1cm4gCSAgIAkJMCAtLXN1Y2Nlc3MsIG90aGVyd2lzZSBmYWlsCisgKi8KK3N0YXRpYyBpbnQgd2xhbl9zZXRfd2VwX2tleShzdHJ1Y3QgYXNzb2NfcmVxdWVzdCAqYXNzb2NfcmVxLAorCQkJICAgIGNvbnN0IGNoYXIgKmtleV9tYXRlcmlhbCwKKwkJCSAgICB1MTYga2V5X2xlbmd0aCwKKwkJCSAgICB1MTYgaW5kZXgsCisJCQkgICAgaW50IHNldF90eF9rZXkpCit7CisJc3RydWN0IFdMQU5fODAyXzExX0tFWSAqcGtleTsKKworCUVOVEVSKCk7CisKKwkvKiBQYXJhbm9pZCB2YWxpZGF0aW9uIG9mIGtleSBpbmRleCAqLworCWlmIChpbmRleCA+IDMpIHsKKwkJTEVBVkUoKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogdmFsaWRhdGUgbWF4IGtleSBsZW5ndGggKi8KKwlpZiAoa2V5X2xlbmd0aCA+IEtFWV9MRU5fV0VQXzEwNCkgeworCQlMRUFWRSgpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwa2V5ID0gJmFzc29jX3JlcS0+d2VwX2tleXNbaW5kZXhdOworCisJaWYgKGtleV9sZW5ndGggPiAwKSB7CisJCW1lbXNldChwa2V5LCAwLCBzaXplb2Yoc3RydWN0IFdMQU5fODAyXzExX0tFWSkpOworCQlwa2V5LT50eXBlID0gS0VZX1RZUEVfSURfV0VQOworCisJCS8qIFN0YW5kYXJkaXplIHRoZSBrZXkgbGVuZ3RoICovCisJCXBrZXktPmxlbiA9IChrZXlfbGVuZ3RoID4gS0VZX0xFTl9XRVBfNDApID8KKwkJICAgICAgICAgICAgICAgIEtFWV9MRU5fV0VQXzEwNCA6IEtFWV9MRU5fV0VQXzQwOworCQltZW1jcHkocGtleS0+a2V5LCBrZXlfbWF0ZXJpYWwsIGtleV9sZW5ndGgpOworCX0KKworCWlmIChzZXRfdHhfa2V5KSB7CisJCS8qIEVuc3VyZSB0aGUgY2hvc2VuIGtleSBpcyB2YWxpZCAqLworCQlpZiAoIXBrZXktPmxlbikgeworCQkJbGJzX3ByX2RlYnVnKDEsICJrZXkgbm90IHNldCwgc28gY2Fubm90IGVuYWJsZSBpdFxuIik7CisJCQlMRUFWRSgpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJYXNzb2NfcmVxLT53ZXBfdHhfa2V5aWR4ID0gaW5kZXg7CisJfQorCisJYXNzb2NfcmVxLT5zZWNpbmZvLldFUHN0YXR1cyA9IHdsYW44MDJfMTFXRVBlbmFibGVkOworCisJTEVBVkUoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2YWxpZGF0ZV9rZXlfaW5kZXgodTE2IGRlZl9pbmRleCwgdTE2IHJhd19pbmRleCwKKwkJCSAgICAgIHUxNiAqb3V0X2luZGV4LCB1MTYgKmlzX2RlZmF1bHQpCit7CisJaWYgKCFvdXRfaW5kZXggfHwgIWlzX2RlZmF1bHQpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogVmVyaWZ5IGluZGV4IGlmIHByZXNlbnQsIG90aGVyd2lzZSB1c2UgZGVmYXVsdCBUWCBrZXkgaW5kZXggKi8KKwlpZiAocmF3X2luZGV4ID4gMCkgeworCQlpZiAocmF3X2luZGV4ID4gNCkKKwkJCXJldHVybiAtRUlOVkFMOworCQkqb3V0X2luZGV4ID0gcmF3X2luZGV4IC0gMTsKKwl9IGVsc2UgeworCQkqb3V0X2luZGV4ID0gZGVmX2luZGV4OworCQkqaXNfZGVmYXVsdCA9IDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkaXNhYmxlX3dlcChzdHJ1Y3QgYXNzb2NfcmVxdWVzdCAqYXNzb2NfcmVxKQoreworCWludCBpOworCisJLyogU2V0IE9wZW4gU3lzdGVtIGF1dGggbW9kZSAqLworCWFzc29jX3JlcS0+c2VjaW5mby5hdXRobW9kZSA9IHdsYW44MDJfMTFhdXRobW9kZW9wZW47CisKKwkvKiBDbGVhciBXRVAga2V5cyBhbmQgbWFyayBXRVAgYXMgZGlzYWJsZWQgKi8KKwlhc3NvY19yZXEtPnNlY2luZm8uV0VQc3RhdHVzID0gd2xhbjgwMl8xMVdFUGRpc2FibGVkOworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJCWFzc29jX3JlcS0+d2VwX2tleXNbaV0ubGVuID0gMDsKKworCXNldF9iaXQoQVNTT0NfRkxBR19TRUNJTkZPLCAmYXNzb2NfcmVxLT5mbGFncyk7CisJc2V0X2JpdChBU1NPQ19GTEFHX1dFUF9LRVlTLCAmYXNzb2NfcmVxLT5mbGFncyk7Cit9CisKKy8qKgorICogIEBicmllZiBTZXQgRW5jcnlwdGlvbiBrZXkKKyAqCisgKiAgQHBhcmFtIGRldiAgICAgICAgICAgICAgICAgIEEgcG9pbnRlciB0byBuZXRfZGV2aWNlIHN0cnVjdHVyZQorICogIEBwYXJhbSBpbmZvCQkJQSBwb2ludGVyIHRvIGl3X3JlcXVlc3RfaW5mbyBzdHJ1Y3R1cmUKKyAqICBAcGFyYW0gdndycSAJCUEgcG9pbnRlciB0byBpd19wYXJhbSBzdHJ1Y3R1cmUKKyAqICBAcGFyYW0gZXh0cmEJCUEgcG9pbnRlciB0byBleHRyYSBkYXRhIGJ1ZgorICogIEByZXR1cm4gCSAgIAkJMCAtLXN1Y2Nlc3MsIG90aGVyd2lzZSBmYWlsCisgKi8KK3N0YXRpYyBpbnQgd2xhbl9zZXRfZW5jb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgc3RydWN0IGl3X3BvaW50ICpkd3JxLCBjaGFyICpleHRyYSkKK3sKKwlpbnQgcmV0ID0gMDsKKwl3bGFuX3ByaXZhdGUgKnByaXYgPSBkZXYtPnByaXY7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwlzdHJ1Y3QgYXNzb2NfcmVxdWVzdCAqIGFzc29jX3JlcTsKKwl1MTYgaXNfZGVmYXVsdCA9IDAsIGluZGV4ID0gMCwgc2V0X3R4X2tleSA9IDA7CisKKwlFTlRFUigpOworCisJbXV0ZXhfbG9jaygmYWRhcHRlci0+bG9jayk7CisJYXNzb2NfcmVxID0gd2xhbl9nZXRfYXNzb2NpYXRpb25fcmVxdWVzdChhZGFwdGVyKTsKKwlpZiAoIWFzc29jX3JlcSkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoZHdycS0+ZmxhZ3MgJiBJV19FTkNPREVfRElTQUJMRUQpIHsKKwkJZGlzYWJsZV93ZXAgKGFzc29jX3JlcSk7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IHZhbGlkYXRlX2tleV9pbmRleChhc3NvY19yZXEtPndlcF90eF9rZXlpZHgsCisJICAgICAgICAgICAgICAgICAgICAgICAgIChkd3JxLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCksCisJICAgICAgICAgICAgICAgICAgICAgICAgICZpbmRleCwgJmlzX2RlZmF1bHQpOworCWlmIChyZXQpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJLyogSWYgV0VQIGlzbid0IGVuYWJsZWQsIG9yIGlmIHRoZXJlIGlzIG5vIGtleSBkYXRhIGJ1dCBhIHZhbGlkCisJICogaW5kZXgsIHNldCB0aGUgVFgga2V5LgorCSAqLworCWlmICgoYXNzb2NfcmVxLT5zZWNpbmZvLldFUHN0YXR1cyAhPSB3bGFuODAyXzExV0VQZW5hYmxlZCkKKwkgICAgfHwgKGR3cnEtPmxlbmd0aCA9PSAwICYmICFpc19kZWZhdWx0KSkKKwkJc2V0X3R4X2tleSA9IDE7CisKKwlyZXQgPSB3bGFuX3NldF93ZXBfa2V5KGFzc29jX3JlcSwgZXh0cmEsIGR3cnEtPmxlbmd0aCwgaW5kZXgsIHNldF90eF9rZXkpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJaWYgKGR3cnEtPmxlbmd0aCkKKwkJc2V0X2JpdChBU1NPQ19GTEFHX1dFUF9LRVlTLCAmYXNzb2NfcmVxLT5mbGFncyk7CisJaWYgKHNldF90eF9rZXkpCisJCXNldF9iaXQoQVNTT0NfRkxBR19XRVBfVFhfS0VZSURYLCAmYXNzb2NfcmVxLT5mbGFncyk7CisKKwlpZiAoZHdycS0+ZmxhZ3MgJiBJV19FTkNPREVfUkVTVFJJQ1RFRCkgeworCQlhc3NvY19yZXEtPnNlY2luZm8uYXV0aG1vZGUgPSB3bGFuODAyXzExYXV0aG1vZGVzaGFyZWQ7CisJfSBlbHNlIGlmIChkd3JxLT5mbGFncyAmIElXX0VOQ09ERV9PUEVOKSB7CisJCWFzc29jX3JlcS0+c2VjaW5mby5hdXRobW9kZSA9IHdsYW44MDJfMTFhdXRobW9kZW9wZW47CisJfQorCitvdXQ6CisJaWYgKHJldCA9PSAwKSB7CisJCXNldF9iaXQoQVNTT0NfRkxBR19TRUNJTkZPLCAmYXNzb2NfcmVxLT5mbGFncyk7CisJCXdsYW5fcG9zdHBvbmVfYXNzb2NpYXRpb25fd29yayhwcml2KTsKKwl9IGVsc2UgeworCQl3bGFuX2NhbmNlbF9hc3NvY2lhdGlvbl93b3JrKHByaXYpOworCX0KKwltdXRleF91bmxvY2soJmFkYXB0ZXItPmxvY2spOworCisJTEVBVkUoKTsKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqICBAYnJpZWYgR2V0IEV4dGVuZGVkIEVuY3J5cHRpb24ga2V5IChXUEEvODAyLjF4IGFuZCBXRVApCisgKgorICogIEBwYXJhbSBkZXYgICAgICAgICAgICAgICAgICBBIHBvaW50ZXIgdG8gbmV0X2RldmljZSBzdHJ1Y3R1cmUKKyAqICBAcGFyYW0gaW5mbwkJCUEgcG9pbnRlciB0byBpd19yZXF1ZXN0X2luZm8gc3RydWN0dXJlCisgKiAgQHBhcmFtIHZ3cnEgCQlBIHBvaW50ZXIgdG8gaXdfcGFyYW0gc3RydWN0dXJlCisgKiAgQHBhcmFtIGV4dHJhCQlBIHBvaW50ZXIgdG8gZXh0cmEgZGF0YSBidWYKKyAqICBAcmV0dXJuIAkgICAJCTAgb24gc3VjY2Vzcywgb3RoZXJ3aXNlIGZhaWx1cmUKKyAqLworc3RhdGljIGludCB3bGFuX2dldF9lbmNvZGVleHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICBzdHJ1Y3QgaXdfcG9pbnQgKmR3cnEsCisJCQkgICAgICBjaGFyICpleHRyYSkKK3sKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKwl3bGFuX3ByaXZhdGUgKnByaXYgPSBkZXYtPnByaXY7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwlzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqZXh0ID0gKHN0cnVjdCBpd19lbmNvZGVfZXh0ICopZXh0cmE7CisJaW50IGluZGV4LCBtYXhfa2V5X2xlbjsKKworCUVOVEVSKCk7CisKKwltYXhfa2V5X2xlbiA9IGR3cnEtPmxlbmd0aCAtIHNpemVvZigqZXh0KTsKKwlpZiAobWF4X2tleV9sZW4gPCAwKQorCQlnb3RvIG91dDsKKworCWluZGV4ID0gZHdycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVg7CisJaWYgKGluZGV4KSB7CisJCWlmIChpbmRleCA8IDEgfHwgaW5kZXggPiA0KQorCQkJZ290byBvdXQ7CisJCWluZGV4LS07CisJfSBlbHNlIHsKKwkJaW5kZXggPSBhZGFwdGVyLT53ZXBfdHhfa2V5aWR4OworCX0KKworCWlmICghZXh0LT5leHRfZmxhZ3MgJiBJV19FTkNPREVfRVhUX0dST1VQX0tFWSAmJgorCSAgICBleHQtPmFsZyAhPSBJV19FTkNPREVfQUxHX1dFUCkgeworCQlpZiAoaW5kZXggIT0gMCB8fCBhZGFwdGVyLT5pbmZyYW1vZGUgIT0gd2xhbjgwMl8xMWluZnJhc3RydWN0dXJlKQorCQkJZ290byBvdXQ7CisJfQorCisJZHdycS0+ZmxhZ3MgPSBpbmRleCArIDE7CisJbWVtc2V0KGV4dCwgMCwgc2l6ZW9mKCpleHQpKTsKKworCWlmICgoYWRhcHRlci0+c2VjaW5mby5XRVBzdGF0dXMgPT0gd2xhbjgwMl8xMVdFUGRpc2FibGVkKQorCSAgICAmJiAhYWRhcHRlci0+c2VjaW5mby5XUEFlbmFibGVkICYmICFhZGFwdGVyLT5zZWNpbmZvLldQQTJlbmFibGVkKSB7CisJCWV4dC0+YWxnID0gSVdfRU5DT0RFX0FMR19OT05FOworCQlleHQtPmtleV9sZW4gPSAwOworCQlkd3JxLT5mbGFncyB8PSBJV19FTkNPREVfRElTQUJMRUQ7CisJfSBlbHNlIHsKKwkJdTggKmtleSA9IE5VTEw7CisKKwkJaWYgKChhZGFwdGVyLT5zZWNpbmZvLldFUHN0YXR1cyA9PSB3bGFuODAyXzExV0VQZW5hYmxlZCkKKwkJICAgICYmICFhZGFwdGVyLT5zZWNpbmZvLldQQWVuYWJsZWQKKwkJICAgICYmICFhZGFwdGVyLT5zZWNpbmZvLldQQTJlbmFibGVkKSB7CisJCQlleHQtPmFsZyA9IElXX0VOQ09ERV9BTEdfV0VQOworCQkJZXh0LT5rZXlfbGVuID0gYWRhcHRlci0+d2VwX2tleXNbaW5kZXhdLmxlbjsKKwkJCWtleSA9ICZhZGFwdGVyLT53ZXBfa2V5c1tpbmRleF0ua2V5WzBdOworCQl9IGVsc2UgaWYgKChhZGFwdGVyLT5zZWNpbmZvLldFUHN0YXR1cyA9PSB3bGFuODAyXzExV0VQZGlzYWJsZWQpICYmCisJCSAgICAgICAgICAgKGFkYXB0ZXItPnNlY2luZm8uV1BBZW5hYmxlZCB8fAorCQkgICAgICAgICAgICBhZGFwdGVyLT5zZWNpbmZvLldQQTJlbmFibGVkKSkgeworCQkJLyogV1BBICovCisJCQlleHQtPmFsZyA9IElXX0VOQ09ERV9BTEdfVEtJUDsKKwkJCWV4dC0+a2V5X2xlbiA9IDA7CisJCX0gZWxzZSB7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlmIChleHQtPmtleV9sZW4gPiBtYXhfa2V5X2xlbikgeworCQkJcmV0ID0gLUUyQklHOworCQkJZ290byBvdXQ7CisJCX0KKworCQlpZiAoZXh0LT5rZXlfbGVuKQorCQkJbWVtY3B5KGV4dC0+a2V5LCBrZXksIGV4dC0+a2V5X2xlbik7CisJCWVsc2UKKwkJCWR3cnEtPmZsYWdzIHw9IElXX0VOQ09ERV9OT0tFWTsKKwkJZHdycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX0VOQUJMRUQ7CisJfQorCXJldCA9IDA7CisKK291dDoKKwlMRUFWRSgpOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogIEBicmllZiBTZXQgRW5jcnlwdGlvbiBrZXkgRXh0ZW5kZWQgKFdQQS84MDIuMXggYW5kIFdFUCkKKyAqCisgKiAgQHBhcmFtIGRldiAgICAgICAgICAgICAgICAgIEEgcG9pbnRlciB0byBuZXRfZGV2aWNlIHN0cnVjdHVyZQorICogIEBwYXJhbSBpbmZvCQkJQSBwb2ludGVyIHRvIGl3X3JlcXVlc3RfaW5mbyBzdHJ1Y3R1cmUKKyAqICBAcGFyYW0gdndycSAJCUEgcG9pbnRlciB0byBpd19wYXJhbSBzdHJ1Y3R1cmUKKyAqICBAcGFyYW0gZXh0cmEJCUEgcG9pbnRlciB0byBleHRyYSBkYXRhIGJ1ZgorICogIEByZXR1cm4gCSAgIAkJMCAtLXN1Y2Nlc3MsIG90aGVyd2lzZSBmYWlsCisgKi8KK3N0YXRpYyBpbnQgd2xhbl9zZXRfZW5jb2RlZXh0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICAgc3RydWN0IGl3X3BvaW50ICpkd3JxLAorCQkJICAgICAgY2hhciAqZXh0cmEpCit7CisJaW50IHJldCA9IDA7CisJd2xhbl9wcml2YXRlICpwcml2ID0gZGV2LT5wcml2OworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisJc3RydWN0IGl3X2VuY29kZV9leHQgKmV4dCA9IChzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqKWV4dHJhOworCWludCBhbGcgPSBleHQtPmFsZzsKKwlzdHJ1Y3QgYXNzb2NfcmVxdWVzdCAqIGFzc29jX3JlcTsKKworCUVOVEVSKCk7CisKKwltdXRleF9sb2NrKCZhZGFwdGVyLT5sb2NrKTsKKwlhc3NvY19yZXEgPSB3bGFuX2dldF9hc3NvY2lhdGlvbl9yZXF1ZXN0KGFkYXB0ZXIpOworCWlmICghYXNzb2NfcmVxKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCWlmICgoYWxnID09IElXX0VOQ09ERV9BTEdfTk9ORSkgfHwgKGR3cnEtPmZsYWdzICYgSVdfRU5DT0RFX0RJU0FCTEVEKSkgeworCQlkaXNhYmxlX3dlcCAoYXNzb2NfcmVxKTsKKwl9IGVsc2UgaWYgKGFsZyA9PSBJV19FTkNPREVfQUxHX1dFUCkgeworCQl1MTYgaXNfZGVmYXVsdCA9IDAsIGluZGV4LCBzZXRfdHhfa2V5ID0gMDsKKworCQlyZXQgPSB2YWxpZGF0ZV9rZXlfaW5kZXgoYXNzb2NfcmVxLT53ZXBfdHhfa2V5aWR4LAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgKGR3cnEtPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKSwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICZpbmRleCwgJmlzX2RlZmF1bHQpOworCQlpZiAocmV0KQorCQkJZ290byBvdXQ7CisKKwkJLyogSWYgV0VQIGlzbid0IGVuYWJsZWQsIG9yIGlmIHRoZXJlIGlzIG5vIGtleSBkYXRhIGJ1dCBhIHZhbGlkCisJCSAqIGluZGV4LCBvciBpZiB0aGUgc2V0LVRYLWtleSBmbGFnIHdhcyBwYXNzZWQsIHNldCB0aGUgVFgga2V5LgorCQkgKi8KKwkJaWYgKChhc3NvY19yZXEtPnNlY2luZm8uV0VQc3RhdHVzICE9IHdsYW44MDJfMTFXRVBlbmFibGVkKQorCQkgICAgfHwgKGR3cnEtPmxlbmd0aCA9PSAwICYmICFpc19kZWZhdWx0KQorCQkgICAgfHwgKGV4dC0+ZXh0X2ZsYWdzICYgSVdfRU5DT0RFX0VYVF9TRVRfVFhfS0VZKSkKKwkJCXNldF90eF9rZXkgPSAxOworCisJCS8qIENvcHkga2V5IHRvIGRyaXZlciAqLworCQlyZXQgPSB3bGFuX3NldF93ZXBfa2V5IChhc3NvY19yZXEsIGV4dC0+a2V5LCBleHQtPmtleV9sZW4sIGluZGV4LAorCQkJCQlzZXRfdHhfa2V5KTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0OworCisJCWlmIChkd3JxLT5mbGFncyAmIElXX0VOQ09ERV9SRVNUUklDVEVEKSB7CisJCQlhc3NvY19yZXEtPnNlY2luZm8uYXV0aG1vZGUgPQorCQkJICAgIHdsYW44MDJfMTFhdXRobW9kZXNoYXJlZDsKKwkJfSBlbHNlIGlmIChkd3JxLT5mbGFncyAmIElXX0VOQ09ERV9PUEVOKSB7CisJCQlhc3NvY19yZXEtPnNlY2luZm8uYXV0aG1vZGUgPQorCQkJICAgIHdsYW44MDJfMTFhdXRobW9kZW9wZW47CisJCX0KKworCQkvKiBNYXJrIHRoZSB2YXJpb3VzIFdFUCBiaXRzIGFzIG1vZGlmaWVkICovCisJCXNldF9iaXQoQVNTT0NfRkxBR19TRUNJTkZPLCAmYXNzb2NfcmVxLT5mbGFncyk7CisJCWlmIChkd3JxLT5sZW5ndGgpCisJCQlzZXRfYml0KEFTU09DX0ZMQUdfV0VQX0tFWVMsICZhc3NvY19yZXEtPmZsYWdzKTsKKwkJaWYgKHNldF90eF9rZXkpCisJCQlzZXRfYml0KEFTU09DX0ZMQUdfV0VQX1RYX0tFWUlEWCwgJmFzc29jX3JlcS0+ZmxhZ3MpOworCisJfSBlbHNlIGlmICgoYWxnID09IElXX0VOQ09ERV9BTEdfVEtJUCkgfHwgKGFsZyA9PSBJV19FTkNPREVfQUxHX0NDTVApKSB7CisJCXN0cnVjdCBXTEFOXzgwMl8xMV9LRVkgKiBwa2V5OworCisJCS8qIHZhbGlkYXRlIGtleSBsZW5ndGggKi8KKwkJaWYgKCgoYWxnID09IElXX0VOQ09ERV9BTEdfVEtJUCkKKwkJCSYmIChleHQtPmtleV9sZW4gIT0gS0VZX0xFTl9XUEFfVEtJUCkpCisJCSAgICB8fCAoKGFsZyA9PSBJV19FTkNPREVfQUxHX0NDTVApCisJCSAgICAgICAgJiYgKGV4dC0+a2V5X2xlbiAhPSBLRVlfTEVOX1dQQV9BRVMpKSkgeworCQkJCWxic19wcl9kZWJ1ZygxLCAiSW52YWxpZCBzaXplICVkIGZvciBrZXkgb2YgYWxnIgorCQkJCSAgICAgICAidHlwZSAlZC5cbiIsCisJCQkJICAgICAgIGV4dC0+a2V5X2xlbiwKKwkJCQkgICAgICAgYWxnKTsKKwkJCQlyZXQgPSAtRUlOVkFMOworCQkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKGV4dC0+ZXh0X2ZsYWdzICYgSVdfRU5DT0RFX0VYVF9HUk9VUF9LRVkpCisJCQlwa2V5ID0gJmFzc29jX3JlcS0+d3BhX21jYXN0X2tleTsKKwkJZWxzZQorCQkJcGtleSA9ICZhc3NvY19yZXEtPndwYV91bmljYXN0X2tleTsKKworCQltZW1zZXQocGtleSwgMCwgc2l6ZW9mIChzdHJ1Y3QgV0xBTl84MDJfMTFfS0VZKSk7CisJCW1lbWNweShwa2V5LT5rZXksIGV4dC0+a2V5LCBleHQtPmtleV9sZW4pOworCQlwa2V5LT5sZW4gPSBleHQtPmtleV9sZW47CisJCXBrZXktPmZsYWdzID0gS0VZX0lORk9fV1BBX0VOQUJMRUQ7CisKKwkJaWYgKGV4dC0+ZXh0X2ZsYWdzICYgSVdfRU5DT0RFX0VYVF9HUk9VUF9LRVkpIHsKKwkJCXBrZXktPmZsYWdzIHw9IEtFWV9JTkZPX1dQQV9NQ0FTVDsKKwkJCXNldF9iaXQoQVNTT0NfRkxBR19XUEFfTUNBU1RfS0VZLCAmYXNzb2NfcmVxLT5mbGFncyk7CisJCX0gZWxzZSB7CisJCQlwa2V5LT5mbGFncyB8PSBLRVlfSU5GT19XUEFfVU5JQ0FTVDsKKwkJCXNldF9iaXQoQVNTT0NfRkxBR19XUEFfVUNBU1RfS0VZLCAmYXNzb2NfcmVxLT5mbGFncyk7CisJCX0KKworCQlpZiAoYWxnID09IElXX0VOQ09ERV9BTEdfVEtJUCkKKwkJCXBrZXktPnR5cGUgPSBLRVlfVFlQRV9JRF9US0lQOworCQllbHNlIGlmIChhbGcgPT0gSVdfRU5DT0RFX0FMR19DQ01QKQorCQkJcGtleS0+dHlwZSA9IEtFWV9UWVBFX0lEX0FFUzsKKworCQkvKiBJZiBXUEEgaXNuJ3QgZW5hYmxlZCB5ZXQsIGRvIHRoYXQgbm93ICovCisJCWlmICggICBhc3NvY19yZXEtPnNlY2luZm8uV1BBZW5hYmxlZCA9PSAwCisJCSAgICAmJiBhc3NvY19yZXEtPnNlY2luZm8uV1BBMmVuYWJsZWQgPT0gMCkgeworCQkJYXNzb2NfcmVxLT5zZWNpbmZvLldQQWVuYWJsZWQgPSAxOworCQkJYXNzb2NfcmVxLT5zZWNpbmZvLldQQTJlbmFibGVkID0gMTsKKwkJCXNldF9iaXQoQVNTT0NfRkxBR19TRUNJTkZPLCAmYXNzb2NfcmVxLT5mbGFncyk7CisJCX0KKworCQlkaXNhYmxlX3dlcCAoYXNzb2NfcmVxKTsKKwl9CisKK291dDoKKwlpZiAocmV0ID09IDApIHsKKwkJd2xhbl9wb3N0cG9uZV9hc3NvY2lhdGlvbl93b3JrKHByaXYpOworCX0gZWxzZSB7CisJCXdsYW5fY2FuY2VsX2Fzc29jaWF0aW9uX3dvcmsocHJpdik7CisJfQorCW11dGV4X3VubG9jaygmYWRhcHRlci0+bG9jayk7CisKKwlMRUFWRSgpOworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludCB3bGFuX3NldF9nZW5pZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICBzdHJ1Y3QgaXdfcG9pbnQgKmR3cnEsCisJCQkgIGNoYXIgKmV4dHJhKQoreworCXdsYW5fcHJpdmF0ZSAqcHJpdiA9IGRldi0+cHJpdjsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCWludCByZXQgPSAwOworCXN0cnVjdCBhc3NvY19yZXF1ZXN0ICogYXNzb2NfcmVxOworCisJRU5URVIoKTsKKworCW11dGV4X2xvY2soJmFkYXB0ZXItPmxvY2spOworCWFzc29jX3JlcSA9IHdsYW5fZ2V0X2Fzc29jaWF0aW9uX3JlcXVlc3QoYWRhcHRlcik7CisJaWYgKCFhc3NvY19yZXEpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGR3cnEtPmxlbmd0aCA+IE1BWF9XUEFfSUVfTEVOIHx8CisJICAgIChkd3JxLT5sZW5ndGggJiYgZXh0cmEgPT0gTlVMTCkpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGR3cnEtPmxlbmd0aCkgeworCQltZW1jcHkoJmFzc29jX3JlcS0+d3BhX2llWzBdLCBleHRyYSwgZHdycS0+bGVuZ3RoKTsKKwkJYXNzb2NfcmVxLT53cGFfaWVfbGVuID0gZHdycS0+bGVuZ3RoOworCX0gZWxzZSB7CisJCW1lbXNldCgmYXNzb2NfcmVxLT53cGFfaWVbMF0sIDAsIHNpemVvZihhZGFwdGVyLT53cGFfaWUpKTsKKwkJYXNzb2NfcmVxLT53cGFfaWVfbGVuID0gMDsKKwl9CisKK291dDoKKwlpZiAocmV0ID09IDApIHsKKwkJc2V0X2JpdChBU1NPQ19GTEFHX1dQQV9JRSwgJmFzc29jX3JlcS0+ZmxhZ3MpOworCQl3bGFuX3Bvc3Rwb25lX2Fzc29jaWF0aW9uX3dvcmsocHJpdik7CisJfSBlbHNlIHsKKwkJd2xhbl9jYW5jZWxfYXNzb2NpYXRpb25fd29yayhwcml2KTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZhZGFwdGVyLT5sb2NrKTsKKworCUxFQVZFKCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB3bGFuX2dldF9nZW5pZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICBzdHJ1Y3QgaXdfcG9pbnQgKmR3cnEsCisJCQkgIGNoYXIgKmV4dHJhKQoreworCXdsYW5fcHJpdmF0ZSAqcHJpdiA9IGRldi0+cHJpdjsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCisJRU5URVIoKTsKKworCWlmIChhZGFwdGVyLT53cGFfaWVfbGVuID09IDApIHsKKwkJZHdycS0+bGVuZ3RoID0gMDsKKwkJTEVBVkUoKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGR3cnEtPmxlbmd0aCA8IGFkYXB0ZXItPndwYV9pZV9sZW4pIHsKKwkJTEVBVkUoKTsKKwkJcmV0dXJuIC1FMkJJRzsKKwl9CisKKwlkd3JxLT5sZW5ndGggPSBhZGFwdGVyLT53cGFfaWVfbGVuOworCW1lbWNweShleHRyYSwgJmFkYXB0ZXItPndwYV9pZVswXSwgYWRhcHRlci0+d3BhX2llX2xlbik7CisKKwlMRUFWRSgpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgd2xhbl9zZXRfYXV0aChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgc3RydWN0IGl3X3BhcmFtICpkd3JxLAorCQkJIGNoYXIgKmV4dHJhKQoreworCXdsYW5fcHJpdmF0ZSAqcHJpdiA9IGRldi0+cHJpdjsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCXN0cnVjdCBhc3NvY19yZXF1ZXN0ICogYXNzb2NfcmVxOworCWludCByZXQgPSAwOworCWludCB1cGRhdGVkID0gMDsKKworCUVOVEVSKCk7CisKKwltdXRleF9sb2NrKCZhZGFwdGVyLT5sb2NrKTsKKwlhc3NvY19yZXEgPSB3bGFuX2dldF9hc3NvY2lhdGlvbl9yZXF1ZXN0KGFkYXB0ZXIpOworCWlmICghYXNzb2NfcmVxKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCXN3aXRjaCAoZHdycS0+ZmxhZ3MgJiBJV19BVVRIX0lOREVYKSB7CisJY2FzZSBJV19BVVRIX1RLSVBfQ09VTlRFUk1FQVNVUkVTOgorCWNhc2UgSVdfQVVUSF9DSVBIRVJfUEFJUldJU0U6CisJY2FzZSBJV19BVVRIX0NJUEhFUl9HUk9VUDoKKwljYXNlIElXX0FVVEhfS0VZX01HTVQ6CisJCS8qCisJCSAqIGxpYmVydGFzIGRvZXMgbm90IHVzZSB0aGVzZSBwYXJhbWV0ZXJzCisJCSAqLworCQlicmVhazsKKworCWNhc2UgSVdfQVVUSF9XUEFfVkVSU0lPTjoKKwkJaWYgKGR3cnEtPnZhbHVlICYgSVdfQVVUSF9XUEFfVkVSU0lPTl9ESVNBQkxFRCkgeworCQkJYXNzb2NfcmVxLT5zZWNpbmZvLldQQWVuYWJsZWQgPSAwOworCQkJYXNzb2NfcmVxLT5zZWNpbmZvLldQQTJlbmFibGVkID0gMDsKKwkJfQorCQlpZiAoZHdycS0+dmFsdWUgJiBJV19BVVRIX1dQQV9WRVJTSU9OX1dQQSkgeworCQkJYXNzb2NfcmVxLT5zZWNpbmZvLldQQWVuYWJsZWQgPSAxOworCQkJYXNzb2NfcmVxLT5zZWNpbmZvLldFUHN0YXR1cyA9IHdsYW44MDJfMTFXRVBkaXNhYmxlZDsKKwkJCWFzc29jX3JlcS0+c2VjaW5mby5hdXRobW9kZSA9CisJCQkgICAgd2xhbjgwMl8xMWF1dGhtb2Rlb3BlbjsKKwkJfQorCQlpZiAoZHdycS0+dmFsdWUgJiBJV19BVVRIX1dQQV9WRVJTSU9OX1dQQTIpIHsKKwkJCWFzc29jX3JlcS0+c2VjaW5mby5XUEEyZW5hYmxlZCA9IDE7CisJCQlhc3NvY19yZXEtPnNlY2luZm8uV0VQc3RhdHVzID0gd2xhbjgwMl8xMVdFUGRpc2FibGVkOworCQkJYXNzb2NfcmVxLT5zZWNpbmZvLmF1dGhtb2RlID0KKwkJCSAgICB3bGFuODAyXzExYXV0aG1vZGVvcGVuOworCQl9CisJCXVwZGF0ZWQgPSAxOworCQlicmVhazsKKworCWNhc2UgSVdfQVVUSF9EUk9QX1VORU5DUllQVEVEOgorCQlpZiAoZHdycS0+dmFsdWUpIHsKKwkJCWFkYXB0ZXItPmN1cnJlbnRwYWNrZXRmaWx0ZXIgfD0KKwkJCSAgICBjbWRfYWN0X21hY19zdHJpY3RfcHJvdGVjdGlvbl9lbmFibGU7CisJCX0gZWxzZSB7CisJCQlhZGFwdGVyLT5jdXJyZW50cGFja2V0ZmlsdGVyICY9CisJCQkgICAgfmNtZF9hY3RfbWFjX3N0cmljdF9wcm90ZWN0aW9uX2VuYWJsZTsKKwkJfQorCQl1cGRhdGVkID0gMTsKKwkJYnJlYWs7CisKKwljYXNlIElXX0FVVEhfODAyMTFfQVVUSF9BTEc6CisJCWlmIChkd3JxLT52YWx1ZSAmIElXX0FVVEhfQUxHX1NIQVJFRF9LRVkpIHsKKwkJCWFzc29jX3JlcS0+c2VjaW5mby5hdXRobW9kZSA9CisJCQkgICAgd2xhbjgwMl8xMWF1dGhtb2Rlc2hhcmVkOworCQl9IGVsc2UgaWYgKGR3cnEtPnZhbHVlICYgSVdfQVVUSF9BTEdfT1BFTl9TWVNURU0pIHsKKwkJCWFzc29jX3JlcS0+c2VjaW5mby5hdXRobW9kZSA9CisJCQkgICAgd2xhbjgwMl8xMWF1dGhtb2Rlb3BlbjsKKwkJfSBlbHNlIGlmIChkd3JxLT52YWx1ZSAmIElXX0FVVEhfQUxHX0xFQVApIHsKKwkJCWFzc29jX3JlcS0+c2VjaW5mby5hdXRobW9kZSA9CisJCQkgICAgd2xhbjgwMl8xMWF1dGhtb2RlbmV0d29ya0VBUDsKKwkJfSBlbHNlIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCX0KKwkJdXBkYXRlZCA9IDE7CisJCWJyZWFrOworCisJY2FzZSBJV19BVVRIX1dQQV9FTkFCTEVEOgorCQlpZiAoZHdycS0+dmFsdWUpIHsKKwkJCWlmICghYXNzb2NfcmVxLT5zZWNpbmZvLldQQWVuYWJsZWQgJiYKKwkJCSAgICAhYXNzb2NfcmVxLT5zZWNpbmZvLldQQTJlbmFibGVkKSB7CisJCQkJYXNzb2NfcmVxLT5zZWNpbmZvLldQQWVuYWJsZWQgPSAxOworCQkJCWFzc29jX3JlcS0+c2VjaW5mby5XUEEyZW5hYmxlZCA9IDE7CisJCQkJYXNzb2NfcmVxLT5zZWNpbmZvLldFUHN0YXR1cyA9IHdsYW44MDJfMTFXRVBkaXNhYmxlZDsKKwkJCQlhc3NvY19yZXEtPnNlY2luZm8uYXV0aG1vZGUgPQorCQkJCSAgICB3bGFuODAyXzExYXV0aG1vZGVvcGVuOworCQkJfQorCQl9IGVsc2UgeworCQkJYXNzb2NfcmVxLT5zZWNpbmZvLldQQWVuYWJsZWQgPSAwOworCQkJYXNzb2NfcmVxLT5zZWNpbmZvLldQQTJlbmFibGVkID0gMDsKKwkJfQorCQl1cGRhdGVkID0gMTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwkJYnJlYWs7CisJfQorCitvdXQ6CisJaWYgKHJldCA9PSAwKSB7CisJCWlmICh1cGRhdGVkKQorCQkJc2V0X2JpdChBU1NPQ19GTEFHX1NFQ0lORk8sICZhc3NvY19yZXEtPmZsYWdzKTsKKwkJd2xhbl9wb3N0cG9uZV9hc3NvY2lhdGlvbl93b3JrKHByaXYpOworCX0gZWxzZSBpZiAocmV0ICE9IC1FT1BOT1RTVVBQKSB7CisJCXdsYW5fY2FuY2VsX2Fzc29jaWF0aW9uX3dvcmsocHJpdik7CisJfQorCW11dGV4X3VubG9jaygmYWRhcHRlci0+bG9jayk7CisKKwlMRUFWRSgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgd2xhbl9nZXRfYXV0aChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgc3RydWN0IGl3X3BhcmFtICpkd3JxLAorCQkJIGNoYXIgKmV4dHJhKQoreworCXdsYW5fcHJpdmF0ZSAqcHJpdiA9IGRldi0+cHJpdjsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCisJRU5URVIoKTsKKworCXN3aXRjaCAoZHdycS0+ZmxhZ3MgJiBJV19BVVRIX0lOREVYKSB7CisJY2FzZSBJV19BVVRIX1dQQV9WRVJTSU9OOgorCQlkd3JxLT52YWx1ZSA9IDA7CisJCWlmIChhZGFwdGVyLT5zZWNpbmZvLldQQWVuYWJsZWQpCisJCQlkd3JxLT52YWx1ZSB8PSBJV19BVVRIX1dQQV9WRVJTSU9OX1dQQTsKKwkJaWYgKGFkYXB0ZXItPnNlY2luZm8uV1BBMmVuYWJsZWQpCisJCQlkd3JxLT52YWx1ZSB8PSBJV19BVVRIX1dQQV9WRVJTSU9OX1dQQTI7CisJCWlmICghZHdycS0+dmFsdWUpCisJCQlkd3JxLT52YWx1ZSB8PSBJV19BVVRIX1dQQV9WRVJTSU9OX0RJU0FCTEVEOworCQlicmVhazsKKworCWNhc2UgSVdfQVVUSF9EUk9QX1VORU5DUllQVEVEOgorCQlkd3JxLT52YWx1ZSA9IDA7CisJCWlmIChhZGFwdGVyLT5jdXJyZW50cGFja2V0ZmlsdGVyICYKKwkJICAgIGNtZF9hY3RfbWFjX3N0cmljdF9wcm90ZWN0aW9uX2VuYWJsZSkKKwkJCWR3cnEtPnZhbHVlID0gMTsKKwkJYnJlYWs7CisKKwljYXNlIElXX0FVVEhfODAyMTFfQVVUSF9BTEc6CisJCXN3aXRjaCAoYWRhcHRlci0+c2VjaW5mby5hdXRobW9kZSkgeworCQljYXNlIHdsYW44MDJfMTFhdXRobW9kZXNoYXJlZDoKKwkJCWR3cnEtPnZhbHVlID0gSVdfQVVUSF9BTEdfU0hBUkVEX0tFWTsKKwkJCWJyZWFrOworCQljYXNlIHdsYW44MDJfMTFhdXRobW9kZW9wZW46CisJCQlkd3JxLT52YWx1ZSA9IElXX0FVVEhfQUxHX09QRU5fU1lTVEVNOworCQkJYnJlYWs7CisJCWNhc2Ugd2xhbjgwMl8xMWF1dGhtb2RlbmV0d29ya0VBUDoKKwkJCWR3cnEtPnZhbHVlID0gSVdfQVVUSF9BTEdfTEVBUDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIElXX0FVVEhfV1BBX0VOQUJMRUQ6CisJCWlmIChhZGFwdGVyLT5zZWNpbmZvLldQQWVuYWJsZWQgJiYgYWRhcHRlci0+c2VjaW5mby5XUEEyZW5hYmxlZCkKKwkJCWR3cnEtPnZhbHVlID0gMTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlMRUFWRSgpOworCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorCisJTEVBVkUoKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHdsYW5fc2V0X3R4cG93KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgIHN0cnVjdCBpd19wYXJhbSAqdndycSwgY2hhciAqZXh0cmEpCit7CisJaW50IHJldCA9IDA7CisJd2xhbl9wcml2YXRlICpwcml2ID0gZGV2LT5wcml2OworCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisKKwl1MTYgZGJtOworCisJRU5URVIoKTsKKworCWlmICh2d3JxLT5kaXNhYmxlZCkgeworCQl3bGFuX3JhZGlvX2lvY3RsKHByaXYsIFJBRElPX09GRik7CisJCXJldHVybiAwOworCX0KKworCWFkYXB0ZXItPnByZWFtYmxlID0gY21kX3R5cGVfYXV0b19wcmVhbWJsZTsKKworCXdsYW5fcmFkaW9faW9jdGwocHJpdiwgUkFESU9fT04pOworCisJaWYgKCh2d3JxLT5mbGFncyAmIElXX1RYUE9XX1RZUEUpID09IElXX1RYUE9XX01XQVRUKSB7CisJCWRibSA9ICh1MTYpIG13X3RvX2RibSh2d3JxLT52YWx1ZSk7CisJfSBlbHNlCisJCWRibSA9ICh1MTYpIHZ3cnEtPnZhbHVlOworCisJLyogYXV0byB0eCBwb3dlciBjb250cm9sICovCisKKwlpZiAodndycS0+Zml4ZWQgPT0gMCkKKwkJZGJtID0gMHhmZmZmOworCisJbGJzX3ByX2RlYnVnKDEsICI8MT5UWFBPV0VSIFNFVCAlZCBkYm0uXG4iLCBkYm0pOworCisJcmV0ID0gbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsCisJCQkJICAgIGNtZF84MDJfMTFfcmZfdHhfcG93ZXIsCisJCQkJICAgIGNtZF9hY3RfdHhfcG93ZXJfb3B0X3NldF9sb3csCisJCQkJICAgIGNtZF9vcHRpb25fd2FpdGZvcnJzcCwgMCwgKHZvaWQgKikmZGJtKTsKKworCUxFQVZFKCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB3bGFuX2dldF9lc3NpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICBzdHJ1Y3QgaXdfcG9pbnQgKmR3cnEsIGNoYXIgKmV4dHJhKQoreworCXdsYW5fcHJpdmF0ZSAqcHJpdiA9IGRldi0+cHJpdjsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCisJRU5URVIoKTsKKwkvKgorCSAqIE5vdGUgOiBpZiBkd3JxLT5mbGFncyAhPSAwLCB3ZSBzaG91bGQgZ2V0IHRoZSByZWxldmFudCBTU0lEIGZyb20KKwkgKiB0aGUgU1NJRCBsaXN0Li4uCisJICovCisKKwkvKgorCSAqIEdldCB0aGUgY3VycmVudCBTU0lECisJICovCisJaWYgKGFkYXB0ZXItPmNvbm5lY3Rfc3RhdHVzID09IGxpYmVydGFzX2Nvbm5lY3RlZCkgeworCQltZW1jcHkoZXh0cmEsIGFkYXB0ZXItPmN1cmJzc3BhcmFtcy5zc2lkLnNzaWQsCisJCSAgICAgICBhZGFwdGVyLT5jdXJic3NwYXJhbXMuc3NpZC5zc2lkbGVuZ3RoKTsKKwkJZXh0cmFbYWRhcHRlci0+Y3VyYnNzcGFyYW1zLnNzaWQuc3NpZGxlbmd0aF0gPSAnXDAnOworCX0gZWxzZSB7CisJCW1lbXNldChleHRyYSwgMCwgMzIpOworCQlleHRyYVthZGFwdGVyLT5jdXJic3NwYXJhbXMuc3NpZC5zc2lkbGVuZ3RoXSA9ICdcMCc7CisJfQorCS8qCisJICogSWYgbm9uZSwgd2UgbWF5IHdhbnQgdG8gZ2V0IHRoZSBvbmUgdGhhdCB3YXMgc2V0CisJICovCisKKwkvKiBUbyBtYWtlIHRoZSBkcml2ZXIgYmFja3dhcmQgY29tcGF0aWJsZSB3aXRoIFdQQSBzdXBwbGljYW50IHYwLjIuNCAqLworCWlmIChkd3JxLT5sZW5ndGggPT0gMzIpCS8qIGNoZWNrIHdpdGggV1BBIHN1cHBsaWNhbnQgYnVmZmVyIHNpemUgKi8KKwkJZHdycS0+bGVuZ3RoID0gbWluX3Qoc2l6ZV90LCBhZGFwdGVyLT5jdXJic3NwYXJhbXMuc3NpZC5zc2lkbGVuZ3RoLAorCQkJCSAgIElXX0VTU0lEX01BWF9TSVpFKTsKKwllbHNlCisJCWR3cnEtPmxlbmd0aCA9IGFkYXB0ZXItPmN1cmJzc3BhcmFtcy5zc2lkLnNzaWRsZW5ndGggKyAxOworCisJZHdycS0+ZmxhZ3MgPSAxOwkvKiBhY3RpdmUgKi8KKworCUxFQVZFKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2xhbl9zZXRfZXNzaWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgc3RydWN0IGl3X3BvaW50ICpkd3JxLCBjaGFyICpleHRyYSkKK3sKKwl3bGFuX3ByaXZhdGUgKnByaXYgPSBkZXYtPnByaXY7CisJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgV0xBTl84MDJfMTFfU1NJRCBzc2lkOworCXN0cnVjdCBhc3NvY19yZXF1ZXN0ICogYXNzb2NfcmVxOworCWludCBzc2lkX2xlbiA9IGR3cnEtPmxlbmd0aDsKKworCUVOVEVSKCk7CisKKwkvKgorCSAqIFdFLTIwIGFuZCBlYXJsaWVyIE5VTEwgcGFkIHRoZSBlbmQgb2YgdGhlIFNTSUQgYW5kIGluY3JlbWVudAorCSAqIFNTSUQgbGVuZ3RoIHNvIGl0IGNhbiBiZSB1c2VkIGxpa2UgYSBzdHJpbmcuICBXRS0yMSBhbmQgbGF0ZXIgZG9uJ3QsCisJICogYnV0IHNvbWUgdXNlcnNwYWNlIHRvb2xzIGFyZW4ndCBhYmxlIHRvIGNvcGUgd2l0aCB0aGUgY2hhbmdlLgorCSAqLworCWlmICgoc3NpZF9sZW4gPiAwKSAmJiAoZXh0cmFbc3NpZF9sZW4gLSAxXSA9PSAnXDAnKSkKKwkJc3NpZF9sZW4tLTsKKworCS8qIENoZWNrIHRoZSBzaXplIG9mIHRoZSBzdHJpbmcgKi8KKwlpZiAoc3NpZF9sZW4gPiBJV19FU1NJRF9NQVhfU0laRSkgeworCQlyZXQgPSAtRTJCSUc7CisJCWdvdG8gb3V0OworCX0KKworCW1lbXNldCgmc3NpZCwgMCwgc2l6ZW9mKHN0cnVjdCBXTEFOXzgwMl8xMV9TU0lEKSk7CisKKwlpZiAoIWR3cnEtPmZsYWdzIHx8ICFzc2lkX2xlbikgeworCQkvKiAiYW55IiBTU0lEIHJlcXVlc3RlZDsgbGVhdmUgU1NJRCBibGFuayAqLworCX0gZWxzZSB7CisJCS8qIFNwZWNpZmljIFNTSUQgcmVxdWVzdGVkICovCisJCW1lbWNweSgmc3NpZC5zc2lkLCBleHRyYSwgc3NpZF9sZW4pOworCQlzc2lkLnNzaWRsZW5ndGggPSBzc2lkX2xlbjsKKwl9CisKKwlsYnNfcHJfZGVidWcoMSwgIlJlcXVlc3RlZCBuZXcgU1NJRCA9ICVzXG4iLAorCSAgICAgICAoc3NpZC5zc2lkbGVuZ3RoID4gMCkgPyAoY2hhciAqKXNzaWQuc3NpZCA6ICJhbnkiKTsKKworb3V0OgorCW11dGV4X2xvY2soJmFkYXB0ZXItPmxvY2spOworCWlmIChyZXQgPT0gMCkgeworCQkvKiBHZXQgb3IgY3JlYXRlIHRoZSBjdXJyZW50IGFzc29jaWF0aW9uIHJlcXVlc3QgKi8KKwkJYXNzb2NfcmVxID0gd2xhbl9nZXRfYXNzb2NpYXRpb25fcmVxdWVzdChhZGFwdGVyKTsKKwkJaWYgKCFhc3NvY19yZXEpIHsKKwkJCXJldCA9IC1FTk9NRU07CisJCX0gZWxzZSB7CisJCQkvKiBDb3B5IHRoZSBTU0lEIHRvIHRoZSBhc3NvY2lhdGlvbiByZXF1ZXN0ICovCisJCQltZW1jcHkoJmFzc29jX3JlcS0+c3NpZCwgJnNzaWQsIHNpemVvZihzdHJ1Y3QgV0xBTl84MDJfMTFfU1NJRCkpOworCQkJc2V0X2JpdChBU1NPQ19GTEFHX1NTSUQsICZhc3NvY19yZXEtPmZsYWdzKTsKKwkJCXdsYW5fcG9zdHBvbmVfYXNzb2NpYXRpb25fd29yayhwcml2KTsKKwkJfQorCX0KKworCS8qIENhbmNlbCB0aGUgYXNzb2NpYXRpb24gcmVxdWVzdCBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgKi8KKwlpZiAocmV0ICE9IDApIHsKKwkJd2xhbl9jYW5jZWxfYXNzb2NpYXRpb25fd29yayhwcml2KTsKKwl9CisKKwltdXRleF91bmxvY2soJmFkYXB0ZXItPmxvY2spOworCisJTEVBVkUoKTsKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqICBAYnJpZWYgQ29ubmVjdCB0byB0aGUgQVAgb3IgQWQtaG9jIE5ldHdvcmsgd2l0aCBzcGVjaWZpYyBic3NpZAorICoKKyAqICBAcGFyYW0gZGV2ICAgICAgICAgIEEgcG9pbnRlciB0byBuZXRfZGV2aWNlIHN0cnVjdHVyZQorICogIEBwYXJhbSBpbmZvICAgICAgICAgQSBwb2ludGVyIHRvIGl3X3JlcXVlc3RfaW5mbyBzdHJ1Y3R1cmUKKyAqICBAcGFyYW0gYXdycSAgICAgICAgIEEgcG9pbnRlciB0byBpd19wYXJhbSBzdHJ1Y3R1cmUKKyAqICBAcGFyYW0gZXh0cmEgICAgICAgIEEgcG9pbnRlciB0byBleHRyYSBkYXRhIGJ1ZgorICogIEByZXR1cm4gICAgICAgICAgICAgMCAtLXN1Y2Nlc3MsIG90aGVyd2lzZSBmYWlsCisgKi8KK3N0YXRpYyBpbnQgd2xhbl9zZXRfd2FwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSBzdHJ1Y3Qgc29ja2FkZHIgKmF3cnEsIGNoYXIgKmV4dHJhKQoreworCXdsYW5fcHJpdmF0ZSAqcHJpdiA9IGRldi0+cHJpdjsKKwl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCXN0cnVjdCBhc3NvY19yZXF1ZXN0ICogYXNzb2NfcmVxOworCWludCByZXQgPSAwOworCisJRU5URVIoKTsKKworCWlmIChhd3JxLT5zYV9mYW1pbHkgIT0gQVJQSFJEX0VUSEVSKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWxic19wcl9kZWJ1ZygxLCAiQVNTT0M6IFdBUDogc2FfZGF0YTogIiBNQUNfRk1UICJcbiIsIE1BQ19BUkcoYXdycS0+c2FfZGF0YSkpOworCisJbXV0ZXhfbG9jaygmYWRhcHRlci0+bG9jayk7CisKKwkvKiBHZXQgb3IgY3JlYXRlIHRoZSBjdXJyZW50IGFzc29jaWF0aW9uIHJlcXVlc3QgKi8KKwlhc3NvY19yZXEgPSB3bGFuX2dldF9hc3NvY2lhdGlvbl9yZXF1ZXN0KGFkYXB0ZXIpOworCWlmICghYXNzb2NfcmVxKSB7CisJCXdsYW5fY2FuY2VsX2Fzc29jaWF0aW9uX3dvcmsocHJpdik7CisJCXJldCA9IC1FTk9NRU07CisJfSBlbHNlIHsKKwkJLyogQ29weSB0aGUgQlNTSUQgdG8gdGhlIGFzc29jaWF0aW9uIHJlcXVlc3QgKi8KKwkJbWVtY3B5KCZhc3NvY19yZXEtPmJzc2lkLCBhd3JxLT5zYV9kYXRhLCBFVEhfQUxFTik7CisJCXNldF9iaXQoQVNTT0NfRkxBR19CU1NJRCwgJmFzc29jX3JlcS0+ZmxhZ3MpOworCQl3bGFuX3Bvc3Rwb25lX2Fzc29jaWF0aW9uX3dvcmsocHJpdik7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZhZGFwdGVyLT5sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgbGliZXJ0YXNfZ2V0X2Z3dmVyc2lvbih3bGFuX2FkYXB0ZXIgKiBhZGFwdGVyLCBjaGFyICpmd3ZlcnNpb24sIGludCBtYXhsZW4pCit7CisJdW5pb24geworCQl1MzIgbDsKKwkJdTggY1s0XTsKKwl9IHZlcjsKKwljaGFyIGZ3dmVyWzMyXTsKKworCW11dGV4X2xvY2soJmFkYXB0ZXItPmxvY2spOworCXZlci5sID0gYWRhcHRlci0+ZndyZWxlYXNlbnVtYmVyOworCW11dGV4X3VubG9jaygmYWRhcHRlci0+bG9jayk7CisKKwlpZiAodmVyLmNbM10gPT0gMCkKKwkJc3ByaW50Zihmd3ZlciwgIiV1LiV1LiV1IiwgdmVyLmNbMl0sIHZlci5jWzFdLCB2ZXIuY1swXSk7CisJZWxzZQorCQlzcHJpbnRmKGZ3dmVyLCAiJXUuJXUuJXUucCV1IiwKKwkJCXZlci5jWzJdLCB2ZXIuY1sxXSwgdmVyLmNbMF0sIHZlci5jWzNdKTsKKworCXNucHJpbnRmKGZ3dmVyc2lvbiwgbWF4bGVuLCBmd3Zlcik7Cit9CisKKworLyoKKyAqIGl3Y29uZmlnIHNldHRhYmxlIGNhbGxiYWNrcworICovCitzdGF0aWMgY29uc3QgaXdfaGFuZGxlciB3bGFuX2hhbmRsZXJbXSA9IHsKKwkoaXdfaGFuZGxlcikgTlVMTCwJLyogU0lPQ1NJV0NPTU1JVCAqLworCShpd19oYW5kbGVyKSB3bGFuX2dldF9uYW1lLAkvKiBTSU9DR0lXTkFNRSAqLworCShpd19oYW5kbGVyKSBOVUxMLAkvKiBTSU9DU0lXTldJRCAqLworCShpd19oYW5kbGVyKSBOVUxMLAkvKiBTSU9DR0lXTldJRCAqLworCShpd19oYW5kbGVyKSB3bGFuX3NldF9mcmVxLAkvKiBTSU9DU0lXRlJFUSAqLworCShpd19oYW5kbGVyKSB3bGFuX2dldF9mcmVxLAkvKiBTSU9DR0lXRlJFUSAqLworCShpd19oYW5kbGVyKSB3bGFuX3NldF9tb2RlLAkvKiBTSU9DU0lXTU9ERSAqLworCShpd19oYW5kbGVyKSB3bGFuX2dldF9tb2RlLAkvKiBTSU9DR0lXTU9ERSAqLworCShpd19oYW5kbGVyKSBOVUxMLAkvKiBTSU9DU0lXU0VOUyAqLworCShpd19oYW5kbGVyKSBOVUxMLAkvKiBTSU9DR0lXU0VOUyAqLworCShpd19oYW5kbGVyKSBOVUxMLAkvKiBTSU9DU0lXUkFOR0UgKi8KKwkoaXdfaGFuZGxlcikgd2xhbl9nZXRfcmFuZ2UsCS8qIFNJT0NHSVdSQU5HRSAqLworCShpd19oYW5kbGVyKSBOVUxMLAkvKiBTSU9DU0lXUFJJViAqLworCShpd19oYW5kbGVyKSBOVUxMLAkvKiBTSU9DR0lXUFJJViAqLworCShpd19oYW5kbGVyKSBOVUxMLAkvKiBTSU9DU0lXU1RBVFMgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJLyogU0lPQ0dJV1NUQVRTICovCisJaXdfaGFuZGxlcl9zZXRfc3B5LAkvKiBTSU9DU0lXU1BZICovCisJaXdfaGFuZGxlcl9nZXRfc3B5LAkvKiBTSU9DR0lXU1BZICovCisJaXdfaGFuZGxlcl9zZXRfdGhyc3B5LAkvKiBTSU9DU0lXVEhSU1BZICovCisJaXdfaGFuZGxlcl9nZXRfdGhyc3B5LAkvKiBTSU9DR0lXVEhSU1BZICovCisJKGl3X2hhbmRsZXIpIHdsYW5fc2V0X3dhcCwJLyogU0lPQ1NJV0FQICovCisJKGl3X2hhbmRsZXIpIHdsYW5fZ2V0X3dhcCwJLyogU0lPQ0dJV0FQICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCS8qIFNJT0NTSVdNTE1FICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCS8qIFNJT0NHSVdBUExJU1QgLSBkZXByZWNhdGVkICovCisJKGl3X2hhbmRsZXIpIGxpYmVydGFzX3NldF9zY2FuLAkvKiBTSU9DU0lXU0NBTiAqLworCShpd19oYW5kbGVyKSBsaWJlcnRhc19nZXRfc2NhbiwJLyogU0lPQ0dJV1NDQU4gKi8KKwkoaXdfaGFuZGxlcikgd2xhbl9zZXRfZXNzaWQsCS8qIFNJT0NTSVdFU1NJRCAqLworCShpd19oYW5kbGVyKSB3bGFuX2dldF9lc3NpZCwJLyogU0lPQ0dJV0VTU0lEICovCisJKGl3X2hhbmRsZXIpIHdsYW5fc2V0X25pY2ssCS8qIFNJT0NTSVdOSUNLTiAqLworCShpd19oYW5kbGVyKSB3bGFuX2dldF9uaWNrLAkvKiBTSU9DR0lXTklDS04gKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJLyogLS0gaG9sZSAtLSAqLworCShpd19oYW5kbGVyKSBOVUxMLAkvKiAtLSBob2xlIC0tICovCisJKGl3X2hhbmRsZXIpIHdsYW5fc2V0X3JhdGUsCS8qIFNJT0NTSVdSQVRFICovCisJKGl3X2hhbmRsZXIpIHdsYW5fZ2V0X3JhdGUsCS8qIFNJT0NHSVdSQVRFICovCisJKGl3X2hhbmRsZXIpIHdsYW5fc2V0X3J0cywJLyogU0lPQ1NJV1JUUyAqLworCShpd19oYW5kbGVyKSB3bGFuX2dldF9ydHMsCS8qIFNJT0NHSVdSVFMgKi8KKwkoaXdfaGFuZGxlcikgd2xhbl9zZXRfZnJhZywJLyogU0lPQ1NJV0ZSQUcgKi8KKwkoaXdfaGFuZGxlcikgd2xhbl9nZXRfZnJhZywJLyogU0lPQ0dJV0ZSQUcgKi8KKwkoaXdfaGFuZGxlcikgd2xhbl9zZXRfdHhwb3csCS8qIFNJT0NTSVdUWFBPVyAqLworCShpd19oYW5kbGVyKSB3bGFuX2dldF90eHBvdywJLyogU0lPQ0dJV1RYUE9XICovCisJKGl3X2hhbmRsZXIpIHdsYW5fc2V0X3JldHJ5LAkvKiBTSU9DU0lXUkVUUlkgKi8KKwkoaXdfaGFuZGxlcikgd2xhbl9nZXRfcmV0cnksCS8qIFNJT0NHSVdSRVRSWSAqLworCShpd19oYW5kbGVyKSB3bGFuX3NldF9lbmNvZGUsCS8qIFNJT0NTSVdFTkNPREUgKi8KKwkoaXdfaGFuZGxlcikgd2xhbl9nZXRfZW5jb2RlLAkvKiBTSU9DR0lXRU5DT0RFICovCisJKGl3X2hhbmRsZXIpIHdsYW5fc2V0X3Bvd2VyLAkvKiBTSU9DU0lXUE9XRVIgKi8KKwkoaXdfaGFuZGxlcikgd2xhbl9nZXRfcG93ZXIsCS8qIFNJT0NHSVdQT1dFUiAqLworCShpd19oYW5kbGVyKSBOVUxMLAkvKiAtLSBob2xlIC0tICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCS8qIC0tIGhvbGUgLS0gKi8KKwkoaXdfaGFuZGxlcikgd2xhbl9zZXRfZ2VuaWUsCS8qIFNJT0NTSVdHRU5JRSAqLworCShpd19oYW5kbGVyKSB3bGFuX2dldF9nZW5pZSwJLyogU0lPQ0dJV0dFTklFICovCisJKGl3X2hhbmRsZXIpIHdsYW5fc2V0X2F1dGgsCS8qIFNJT0NTSVdBVVRIICovCisJKGl3X2hhbmRsZXIpIHdsYW5fZ2V0X2F1dGgsCS8qIFNJT0NHSVdBVVRIICovCisJKGl3X2hhbmRsZXIpIHdsYW5fc2V0X2VuY29kZWV4dCwvKiBTSU9DU0lXRU5DT0RFRVhUICovCisJKGl3X2hhbmRsZXIpIHdsYW5fZ2V0X2VuY29kZWV4dCwvKiBTSU9DR0lXRU5DT0RFRVhUICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkvKiBTSU9DU0lXUE1LU0EgKi8KK307CisKK3N0cnVjdCBpd19oYW5kbGVyX2RlZiBsaWJlcnRhc19oYW5kbGVyX2RlZiA9IHsKKwkubnVtX3N0YW5kYXJkCT0gc2l6ZW9mKHdsYW5faGFuZGxlcikgLyBzaXplb2YoaXdfaGFuZGxlciksCisJLm51bV9wcml2YXRlCT0gc2l6ZW9mKHdsYW5fcHJpdmF0ZV9oYW5kbGVyKSAvIHNpemVvZihpd19oYW5kbGVyKSwKKwkubnVtX3ByaXZhdGVfYXJncyA9IHNpemVvZih3bGFuX3ByaXZhdGVfYXJncykgLworCQlzaXplb2Yoc3RydWN0IGl3X3ByaXZfYXJncyksCisJLnN0YW5kYXJkCT0gKGl3X2hhbmRsZXIgKikgd2xhbl9oYW5kbGVyLAorCS5wcml2YXRlCT0gKGl3X2hhbmRsZXIgKikgd2xhbl9wcml2YXRlX2hhbmRsZXIsCisJLnByaXZhdGVfYXJncwk9IChzdHJ1Y3QgaXdfcHJpdl9hcmdzICopd2xhbl9wcml2YXRlX2FyZ3MsCisJLmdldF93aXJlbGVzc19zdGF0cyA9IHdsYW5fZ2V0X3dpcmVsZXNzX3N0YXRzLAorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL3dleHQuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL3dleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWYzNjdjMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL3dleHQuaApAQCAtMCwwICsxLDE0NyBAQAorLyoqCisgICogVGhpcyBmaWxlIGNvbnRhaW5zIGRlZmluaXRpb24gZm9yIElPQ1RMIGNhbGwuCisgICovCisjaWZuZGVmCV9XTEFOX1dFWFRfSF8KKyNkZWZpbmUJX1dMQU5fV0VYVF9IXworCisjZGVmaW5lIFNVQkNNRF9PRkZTRVQJCQk0CisjZGVmaW5lIFNVQkNNRF9EQVRBKHgpCQkJKigoaW50ICopKHgtPnUubmFtZSArIFNVQkNNRF9PRkZTRVQpKQorCisvKiogUFJJVkFURSBDTUQgSUQgKi8KKyNkZWZpbmUJV0xBTklPQ1RMCQkJU0lPQ0lXRklSU1RQUklWCisKKyNkZWZpbmUgV0xBTlNFVFdQQUlFCQkJKFdMQU5JT0NUTCArIDApCisKKyNkZWZpbmUgV0xBTl9TRVRJTlRfR0VUSU5UCQkoV0xBTklPQ1RMICsgNykKKyNkZWZpbmUgV0xBTk5GCQkJCQkxCisjZGVmaW5lIFdMQU5SU1NJCQkJCTIKKyNkZWZpbmUgV0xBTkVOQUJMRTExRAkJCQk1CisjZGVmaW5lIFdMQU5BREhPQ0dSQVRFCQkJCTYKKyNkZWZpbmUgV0xBTl9TVUJDTURfU0VUX1BSRVNDQU4JCQkxMQorCisjZGVmaW5lIFdMQU5fU0VUTk9ORV9HRVROT05FCSAgICAgICAgKFdMQU5JT0NUTCArIDgpCisjZGVmaW5lIFdMQU5ERUFVVEggICAgICAgICAgICAgICAgICAJCTEKKyNkZWZpbmUgV0xBTlJBRElPT04gICAgICAgICAgICAgICAgIAkJMgorI2RlZmluZSBXTEFOUkFESU9PRkYgICAgICAgICAgICAgICAgCQkzCisjZGVmaW5lIFdMQU5SRU1PVkVBREhPQ0FFUyAgICAgICAgICAJCTQKKyNkZWZpbmUgV0xBTkFESE9DU1RPUCAgICAgICAgICAgICAgIAkJNQorI2RlZmluZSBXTEFOQ0lQSEVSVEVTVCAgICAgICAgICAgICAgCQk2CisjZGVmaW5lIFdMQU5DUllQVE9URVNUCQkJCTcKKworI2RlZmluZSBXTEFOV0xBTklETEVPTgkJCQkxMAorI2RlZmluZSBXTEFOV0xBTklETEVPRkYJCQkJMTEKKyNkZWZpbmUgV0xBTl9TVUJDTURfQlRfUkVTRVQJCQkxMworI2RlZmluZSBXTEFOX1NVQkNNRF9GV1RfUkVTRVQJCQkxNAorCisjZGVmaW5lIFdMQU5HRVRMT0cgICAgICAgICAgICAgICAgICAJKFdMQU5JT0NUTCArIDkpCisjZGVmaW5lIEdFVExPR19CVUZTSVpFICAzMDAKKworI2RlZmluZSBXTEFOU0NBTl9UWVBFCQkJKFdMQU5JT0NUTCArIDExKQorCisjZGVmaW5lIFdMQU5fU0VUTk9ORV9HRVRPTkVJTlQJCShXTEFOSU9DVEwgKyAxNSkKKyNkZWZpbmUgV0xBTkdFVFJFR0lPTgkJCQkxCisjZGVmaW5lIFdMQU5fR0VUX0xJU1RFTl9JTlRFUlZBTAkJMgorI2RlZmluZSBXTEFOX0dFVF9NVUxUSVBMRV9EVElNCQkJMworI2RlZmluZSBXTEFOX0dFVF9UWF9SQVRFCQkJNAorI2RlZmluZQlXTEFOR0VUQkNOQVZHCQkJCTUKKworI2RlZmluZSBXTEFOX0dFVF9MSU5LTU9ERQkJCTYKKyNkZWZpbmUgV0xBTl9HRVRfUkFESU9NT0RFCQkJNworI2RlZmluZSBXTEFOX0dFVF9ERUJVR01PREUJCQk4CisjZGVmaW5lIFdMQU5fU1VCQ01EX0ZXVF9DTEVBTlVQCQkJMTUKKyNkZWZpbmUgV0xBTl9TVUJDTURfRldUX1RJTUUJCQkxNgorI2RlZmluZSBXTEFOX1NVQkNNRF9NRVNIX0dFVF9UVEwJCTE3CisKKyNkZWZpbmUgV0xBTlJFR0NGUkRXUgkJCShXTEFOSU9DVEwgKyAxOCkKKworI2RlZmluZSBXTEFOX1NFVE5PTkVfR0VUVFdFTFZFX0NIQVIgKFdMQU5JT0NUTCArIDE5KQorI2RlZmluZSBXTEFOX1NVQkNNRF9HRVRSWEFOVEVOTkEgICAgMQorI2RlZmluZSBXTEFOX1NVQkNNRF9HRVRUWEFOVEVOTkEgICAgMgorI2RlZmluZSBXTEFOX0dFVF9UU0YgICAgICAgICAgICAgICAgMworCisjZGVmaW5lIFdMQU5fU0VUTk9ORV9HRVRXT1JEQ0hBUgkoV0xBTklPQ1RMICsgMjEpCisjZGVmaW5lIFdMQU5HRVRBREhPQ0FFUwkJCQkxCisKKyNkZWZpbmUgV0xBTl9TRVRPTkVJTlRfR0VUT05FSU5UCShXTEFOSU9DVEwgKyAyMykKKyNkZWZpbmUgV0xBTl9CRUFDT05fSU5URVJWQUwJCQkxCisjZGVmaW5lCVdMQU5fTElTVEVOSU5UUlZMCQkJNAorCisjZGVmaW5lIFdMQU5fVFhDT05UUk9MCQkJCTYKKyNkZWZpbmUgV0xBTl9OVUxMUEtUSU5URVJWQUwJCQk3CisKKyNkZWZpbmUgV0xBTl9TRVRPTkVJTlRfR0VUTk9ORQkJKFdMQU5JT0NUTCArIDI0KQorI2RlZmluZSBXTEFOX1NVQkNNRF9TRVRSWEFOVEVOTkEJCTEKKyNkZWZpbmUgV0xBTl9TVUJDTURfU0VUVFhBTlRFTk5BCQkyCisjZGVmaW5lIFdMQU5TRVRBVVRIQUxHCQkJCTUKKyNkZWZpbmUgV0xBTlNFVDgwMjFYQVVUSEFMRwkJCTYKKyNkZWZpbmUgV0xBTlNFVEVOQ1JZUFRJT05NT0RFCQkJNworI2RlZmluZSBXTEFOU0VUUkVHSU9OCQkJCTgKKyNkZWZpbmUgV0xBTl9TRVRfTElTVEVOX0lOVEVSVkFMCQk5CisKKyNkZWZpbmUgV0xBTl9TRVRfTVVMVElQTEVfRFRJTQkJCTEwCisjZGVmaW5lIFdMQU5fU0VUX0FUSU1fV0lORE9XCQkJMTEKKyNkZWZpbmUgV0xBTlNFVEJDTkFWRwkJCQkxMworI2RlZmluZSBXTEFOU0VUREFUQUFWRwkJCQkxNAorI2RlZmluZSBXTEFOX1NFVF9MSU5LTU9ERQkJCTE1CisjZGVmaW5lIFdMQU5fU0VUX1JBRElPTU9ERQkJCTE2CisjZGVmaW5lIFdMQU5fU0VUX0RFQlVHTU9ERQkJCTE3CisjZGVmaW5lIFdMQU5fU1VCQ01EX01FU0hfU0VUX1RUTAkJMTgKKworI2RlZmluZSBXTEFOX1NFVDEyOENIQVJfR0VUMTI4Q0hBUgkoV0xBTklPQ1RMICsgMjUpCisjZGVmaW5lIFdMQU5TQ0FOX01PREUJCQkJNgorCisjZGVmaW5lIFdMQU5fR0VUX0FESE9DX1NUQVRVUwkJCTkKKworI2RlZmluZSBXTEFOX1NVQkNNRF9CVF9BREQJCQkxOAorI2RlZmluZSBXTEFOX1NVQkNNRF9CVF9ERUwgICAJCQkxOQorI2RlZmluZSBXTEFOX1NVQkNNRF9CVF9MSVNUCQkJMjAKKyNkZWZpbmUgV0xBTl9TVUJDTURfRldUX0FERAkJCQkyMQorI2RlZmluZSBXTEFOX1NVQkNNRF9GV1RfREVMICAgCQkyMgorI2RlZmluZSBXTEFOX1NVQkNNRF9GV1RfTE9PS1VQCQkyMworI2RlZmluZSBXTEFOX1NVQkNNRF9GV1RfTElTVF9ORUlHSEJPUgkJCTI0CisjZGVmaW5lIFdMQU5fU1VCQ01EX0ZXVF9MSVNUCQkJMjUKKyNkZWZpbmUgV0xBTl9TVUJDTURfRldUX0xJU1RfUk9VVEUJCQkyNgorCisjZGVmaW5lIFdMQU5fU0VUX0dFVF9TSVhURUVOX0lOVCAgICAgICAoV0xBTklPQ1RMICsgMjkpCisjZGVmaW5lIFdMQU5fVFBDQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFdMQU5fUE9XRVJDRkcgICAgICAgICAgICAgICAgICAgICAgICAgICAyCisKKyNkZWZpbmUgV0xBTl9BVVRPX0ZSRVFfU0VUCQkJMworI2RlZmluZSBXTEFOX0FVVE9fRlJFUV9HRVQJCQk0CisjZGVmaW5lIFdMQU5fTEVEX0dQSU9fQ1RSTAkJCTUKKyNkZWZpbmUgV0xBTl9TQ0FOUFJPQkVTIAkJCTYKKyNkZWZpbmUJV0xBTl9BREFQVF9SQVRFU0VUCQkJOAorI2RlZmluZQlXTEFOX0lOQUNUSVZJVFlfVElNRU9VVAkJCTkKKyNkZWZpbmUgV0xBTlNOUgkJCQkJMTAKKyNkZWZpbmUgV0xBTl9HRVRfUkFURQkJCQkxMQorI2RlZmluZQlXTEFOX0dFVF9SWElORk8JCQkJMTIKKworI2RlZmluZSBXTEFOQ01ENTJSRFdSCQkJKFdMQU5JT0NUTCArIDMwKQorI2RlZmluZSBXTEFOQ01ENTNSRFdSCQkJKFdMQU5JT0NUTCArIDMxKQorI2RlZmluZSBDTUQ1M0JVRkxFTgkJCQkzMgorCisjZGVmaW5lCVJFR19NQUMJCQkJCTB4MTkKKyNkZWZpbmUJUkVHX0JCUAkJCQkJMHgxYQorI2RlZmluZQlSRUdfUkYJCQkJCTB4MWIKKyNkZWZpbmUJUkVHX0VFUFJPTQkJCQkweDU5CisjZGVmaW5lIFdMQU5fTElOS01PREVfODAyXzMJCQkwCisjZGVmaW5lIFdMQU5fTElOS01PREVfODAyXzExCQkJMgorI2RlZmluZSBXTEFOX1JBRElPTU9ERV9OT05FICAgIAkJCTAKKyNkZWZpbmUgV0xBTl9SQURJT01PREVfUkFESU9UQVAJCQkyCisKKy8qKiB3bGFuX2lvY3RsX3JlZ3Jkd3IgKi8KK3N0cnVjdCB3bGFuX2lvY3RsX3JlZ3Jkd3IgeworCS8qKiBXaGljaCByZWdpc3RlciB0byBhY2Nlc3MgKi8KKwl1MTYgd2hpY2hyZWc7CisJLyoqIFJlYWQgb3IgV3JpdGUgKi8KKwl1MTYgYWN0aW9uOworCXUzMiBvZmZzZXQ7CisJdTE2IE5PQjsKKwl1MzIgdmFsdWU7Cit9OworCitleHRlcm4gc3RydWN0IGl3X2hhbmRsZXJfZGVmIGxpYmVydGFzX2hhbmRsZXJfZGVmOworaW50IGxpYmVydGFzX2RvX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcmVxLCBpbnQgaSk7CitpbnQgd2xhbl9yYWRpb19pb2N0bCh3bGFuX3ByaXZhdGUgKiBwcml2LCB1OCBvcHRpb24pOworCisjZW5kaWYJCQkJLyogX1dMQU5fV0VYVF9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbmV0d2F2ZV9jcy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbmV0d2F2ZV9jcy5jCmluZGV4IGEwMDlhYjUuLjQ1YjAwZTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL25ldHdhdmVfY3MuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9uZXR3YXZlX2NzLmMKQEAgLTEyODMsNyArMTI4Myw2IEBACiAKIAlza2JfcmVzZXJ2ZSggc2tiLCAyKTsgIC8qIEFsaWduIElQIG9uIDE2IGJ5dGUgKi8KIAlza2JfcHV0KCBza2IsIHJjdkxlbik7Ci0Jc2tiLT5kZXYgPSBkZXY7CiAKIAkvKiBDb3B5IHBhY2tldCBmcmFnbWVudHMgdG8gdGhlIHNrYiBkYXRhIGFyZWEgKi8KIAlwdHIgPSAodV9jaGFyKikgc2tiLT5kYXRhOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby5jCmluZGV4IDRlN2Y2Y2YuLjA2MjI4NmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvLmMKQEAgLTY4OSw3ICs2ODksNyBAQAogCS8qIE5vdGUgOiBnY2Mgd2lsbCBvcHRpbWlzZSB0aGUgd2hvbGUgc2VjdGlvbiBhd2F5IGlmCiAJICogV0lSRUxFU1NfU1BZIGlzIG5vdCBkZWZpbmVkLi4uIC0gSmVhbiBJSSAqLwogCWlmIChTUFlfTlVNQkVSKHByaXYpKSB7Ci0JCW9yaW5vY29fc3B5X2dhdGhlcihkZXYsIHNrYi0+bWFjLnJhdyArIEVUSF9BTEVOLAorCQlvcmlub2NvX3NweV9nYXRoZXIoZGV2LCBza2JfbWFjX2hlYWRlcihza2IpICsgRVRIX0FMRU4sCiAJCQkJICAgZGVzYy0+c2lnbmFsLCBkZXNjLT5zaWxlbmNlKTsKIAl9CiB9CkBAIC03NzAsNyArNzcwLDcgQEAKIAogCS8qIENvcHkgdGhlIDgwMi4xMSBoZWFkZXIgdG8gdGhlIHNrYiAqLwogCW1lbWNweShza2JfcHV0KHNrYiwgaGRybGVuKSwgJihkZXNjLT5mcmFtZV9jdGwpLCBoZHJsZW4pOwotCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKwlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwogCiAJLyogSWYgYW55LCBjb3B5IHRoZSBkYXRhIGZyb20gdGhlIGNhcmQgdG8gdGhlIHNrYiAqLwogCWlmIChkYXRhbGVuID4gMCkgewpAQCAtOTE1LDcgKzkxNSw2IEBACiAJCW1lbWNweShoZHItPmhfc291cmNlLCBkZXNjLmFkZHIyLCBFVEhfQUxFTik7CiAKIAlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOwotCXNrYi0+ZGV2ID0gZGV2OwogCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CiAJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOwogCWlmIChmYyAmIElFRUU4MDIxMV9GQ1RMX1RPRFMpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9ldGguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2V0aC5jCmluZGV4IGIxMTIyOTEuLmRkMDcwY2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2V0aC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2V0aC5jCkBAIC0xMzYsNyArMTM2LDcgQEAKIAkJCQlwcmludGsoImlzbHBjaV9ldGhfdHJhbnNtaXQ6d2RzX21hY1xuIik7CiAjZW5kaWYKIAkJCQltZW1tb3ZlKHNrYi0+ZGF0YSArIDYsIHNyYywgc2tiLT5sZW4pOwotCQkJCW1lbWNweShza2ItPmRhdGEsIHdkc19tYWMsIDYpOworCQkJCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhKHNrYiwgd2RzX21hYywgNik7CiAJCQl9IGVsc2UgewogCQkJCW1lbW1vdmUoc2tiLT5kYXRhLCBzcmMsIHNrYi0+bGVuKTsKIAkJCX0KQEAgLTE2MiwxMyArMTYyLDE2IEBACiAKIAkJCXNrYl9wdXQobmV3c2tiLCBpbml0X3dkcyA/IHNrYi0+bGVuICsgNiA6IHNrYi0+bGVuKTsKIAkJCWlmIChpbml0X3dkcykgewotCQkJCW1lbWNweShuZXdza2ItPmRhdGEgKyA2LCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKLQkJCQltZW1jcHkobmV3c2tiLT5kYXRhLCB3ZHNfbWFjLCA2KTsKKwkJCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwKKwkJCQkJCQkgIG5ld3NrYi0+ZGF0YSArIDYsCisJCQkJCQkJICBza2ItPmxlbik7CisJCQkJc2tiX2NvcHlfdG9fbGluZWFyX2RhdGEobmV3c2tiLCB3ZHNfbWFjLCA2KTsKICNpZmRlZiBJU0xQQ0lfRVRIX0RFQlVHCiAJCQkJcHJpbnRrKCJpc2xwY2lfZXRoX3RyYW5zbWl0Ondkc19tYWNcbiIpOwogI2VuZGlmCiAJCQl9IGVsc2UKLQkJCQltZW1jcHkobmV3c2tiLT5kYXRhLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwkJCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgbmV3c2tiLT5kYXRhLAorCQkJCQkJCSAgc2tiLT5sZW4pOwogCiAjaWYgVkVSQk9TRSA+IFNIT1dfRVJST1JfTUVTU0FHRVMKIAkJCURFQlVHKFNIT1dfVFJBQ0lORywgIm1lbWNweSAlcCAlcCAlaSB3ZHMgJWlcbiIsCkBAIC0zMDMsNyArMzA2LDcgQEAKIAkJc2tiX3B1bGwoKnNrYiwgc2l6ZW9mIChzdHJ1Y3QgcmZtb25faGVhZGVyKSk7CiAKIAkoKnNrYiktPnByb3RvY29sID0gaHRvbnMoRVRIX1BfODAyXzIpOwotCSgqc2tiKS0+bWFjLnJhdyA9ICgqc2tiKS0+ZGF0YTsKKwlza2JfcmVzZXRfbWFjX2hlYWRlcigqc2tiKTsKIAkoKnNrYiktPnBrdF90eXBlID0gUEFDS0VUX09USEVSSE9TVDsKIAogCXJldHVybiAwOwpAQCAtMzc0LDEwICszNzcsNiBAQAogCURFQlVHKFNIT1dfQlVGRkVSX0NPTlRFTlRTLCAiXG5yeCAlcCAiLCBza2ItPmRhdGEpOwogCWRpc3BsYXlfYnVmZmVyKChjaGFyICopIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOwogI2VuZGlmCi0KLQkvKiBkbyBzb21lIGFkZGl0aW9uYWwgc2tfYnVmZiBhbmQgbmV0d29yayBsYXllciBwYXJhbWV0ZXJzICovCi0Jc2tiLT5kZXYgPSBuZGV2OwotCiAJLyogdGFrZSBjYXJlIG9mIG1vbml0b3IgbW9kZSBhbmQgc3B5IG1vbml0b3JpbmcuICovCiAJaWYgKHVubGlrZWx5KHByaXYtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SKSkKIAkJZGlzY2FyZCA9IGlzbHBjaV9tb25pdG9yX3J4KHByaXYsICZza2IpOwpAQCAtMzk4LDggKzM5NywxMCBAQAogCQkJLyogVXBkYXRlIHNweSByZWNvcmRzICovCiAJCQl3aXJlbGVzc19zcHlfdXBkYXRlKG5kZXYsIGFubmV4LT5hZGRyMiwgJndzdGF0cyk7CiAKLQkJCW1lbWNweShza2ItPmRhdGEgKyBzaXplb2YgKHN0cnVjdCByZm1vbl9oZWFkZXIpLAotCQkJICAgICAgIHNrYi0+ZGF0YSwgMiAqIEVUSF9BTEVOKTsKKwkJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLAorCQkJCQkJICAoc2tiLT5kYXRhICsKKwkJCQkJCSAgIHNpemVvZihzdHJ1Y3QgcmZtb25faGVhZGVyKSksCisJCQkJCQkgIDIgKiBFVEhfQUxFTik7CiAJCQlza2JfcHVsbChza2IsIHNpemVvZiAoc3RydWN0IHJmbW9uX2hlYWRlcikpOwogCQl9CiAJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIG5kZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmF5X2NzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yYXlfY3MuYwppbmRleCA0N2IyY2NiLi4zYmU2MjQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yYXlfY3MuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yYXlfY3MuYwpAQCAtMjIzMiw3ICsyMjMyLDYgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBza2JfcmVzZXJ2ZSggc2tiLCAyKTsgICAvKiBBbGlnbiBJUCBvbiAxNiBieXRlIChUQkQgY2hlY2sgdGhpcykqLwotICAgIHNrYi0+ZGV2ID0gZGV2OwogCiAgICAgREVCVUcoNCwicmF5X2NzIHJ4X2RhdGEgdG90YWxfbGVuID0gJXgsIHJ4X2xlbiA9ICV4XG4iLHRvdGFsX2xlbixyeF9sZW4pOwogCkBAIC0yMjQzLDcgKzIyNDIsOCBAQAogICAgIHJ4X3B0ciArPSBjb3B5X2Zyb21fcnhfYnVmZihsb2NhbCwgcnhfcHRyLCBwa3RfYWRkciAmIFJYX0JVRkZfRU5ELCByeF9sZW4pOwogICAgIC8qIEdldCBzb3VyY2UgYWRkcmVzcyAqLwogI2lmZGVmIFdJUkVMRVNTX1NQWQotICAgIG1lbWNweShsaW5rc3JjYWRkciwgKChzdHJ1Y3QgbWFjX2hlYWRlciAqKXNrYi0+ZGF0YSktPmFkZHJfMiwgRVRIX0FMRU4pOworICAgIHNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGFfb2Zmc2V0KHNrYiwgb2Zmc2V0b2Yoc3RydWN0IG1hY19oZWFkZXIsIGFkZHJfMiksCisJCQkJICAgICBsaW5rc3JjYWRkciwgRVRIX0FMRU4pOwogI2VuZGlmCiAgICAgLyogTm93LCBkZWFsIHdpdGggZW5jYXBzdWxhdGlvbi90cmFuc2xhdGlvbi9zbmlmZmVyICovCiAgICAgaWYgKCFzbmlmZmVyKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9zdHJpcC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvc3RyaXAuYwppbmRleCBmNWNlMWM2Li4yYTI5OWEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9zdHJpcC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3N0cmlwLmMKQEAgLTIwMDksNyArMjAwOSw3IEBACiAJCSAgICAgICBwYWNrZXRsZW4pOwogCQlza2ItPmRldiA9IGdldF9zdHJpcF9kZXYoc3RyaXBfaW5mbyk7CiAJCXNrYi0+cHJvdG9jb2wgPSBoZWFkZXItPnByb3RvY29sOwotCQlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CiAKIAkJLyogSGF2aW5nIHB1dCBhIGZha2UgaGVhZGVyIG9uIHRoZSBmcm9udCBvZiB0aGUgc2tfYnVmZiBmb3IgdGhlICovCiAJCS8qIGJlbmVmaXQgb2YgdG9vbHMgbGlrZSB0Y3BkdW1wLCBza2JfcHVsbCBub3cgJ2NvbnN1bWVzJyB0aGF0ICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvdG9kby50eHQgYi9kcml2ZXJzL25ldC93aXJlbGVzcy90b2RvLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIyMzQwMS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy90b2RvLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLQlXaXJlbGVzcyBUb2RvCi0JLS0tLS0tLS0tLS0tLQotCi0xKSBCcmluZyBvdGhlciBrZXJuZWwgV2lyZWxlc3MgTEFOIGRyaXZlcnMgaGVyZQotCUNvbXBsZXRlZAotCi0yKSBCcmluZyBuZXcgV2lyZWxlc3MgTEFOIGRyaXZlciBub3QgeWV0IGluIHRoZSBrZXJuZWwgdGhlcmUKLQlTZWUgbXkgd2ViIHBhZ2UgZm9yIGRldGFpbHMKLQlJbiBwYXJ0aWN1bGFyIDogSG9zdEFQCi0KLTMpIE1pc2MKLQlvIE1hcmsgd2F2ZWxhbiwgd2F2ZWxhbl9jcywgbmV0d2F2ZV9jcyBkcml2ZXJzIGFzIG9ic29sZXRlCi0JbyBNYXliZSBhcmxhbi5jLCByYXlfY3MuYyBhbmQgc3RyaXAuYyBhbHNvIGRlc2VydmUgdG8gYmUgb2Jzb2xldGUKLQotCUplYW4gSUkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dhdmVsYW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dhdmVsYW4uYwppbmRleCAyYWEzYzc2Li4xY2YwOTBkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy93YXZlbGFuLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2F2ZWxhbi5jCkBAIC0yNTEyLDE0ICsyNTEyLDEzIEBACiAJCXJldHVybjsKIAl9CiAKLQlza2ItPmRldiA9IGRldjsKLQogCS8qIENvcHkgdGhlIHBhY2tldCB0byB0aGUgYnVmZmVyLiAqLwogCW9icmFtX3JlYWQoaW9hZGRyLCBidWZfb2ZmLCBza2JfcHV0KHNrYiwgc2tzaXplKSwgc2tzaXplKTsKIAlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOwogCiAjaWZkZWYgREVCVUdfUlhfSU5GTwotCXd2X3BhY2tldF9pbmZvKHNrYi0+bWFjLnJhdywgc2tzaXplLCBkZXYtPm5hbWUsICJ3dl9wYWNrZXRfcmVhZCIpOworCXd2X3BhY2tldF9pbmZvKHNrYl9tYWNfaGVhZGVyKHNrYiksIHNrc2l6ZSwgZGV2LT5uYW1lLAorCQkgICAgICAgInd2X3BhY2tldF9yZWFkIik7CiAjZW5kaWYJCQkJLyogREVCVUdfUlhfSU5GTyAqLwogCiAJLyogU3RhdGlzdGljcy1nYXRoZXJpbmcgYW5kIGFzc29jaWF0ZWQgc3R1ZmYuCkBAIC0yNTU1LDcgKzI1NTQsNyBAQAogCiAJCS8qIFNweWluZyBzdHVmZiAqLwogI2lmZGVmIElXX1dJUkVMRVNTX1NQWQotCQl3bF9zcHlfZ2F0aGVyKGRldiwgc2tiLT5tYWMucmF3ICsgV0FWRUxBTl9BRERSX1NJWkUsCisJCXdsX3NweV9nYXRoZXIoZGV2LCBza2JfbWFjX2hlYWRlcihza2IpICsgV0FWRUxBTl9BRERSX1NJWkUsCiAJCQkgICAgICBzdGF0cyk7CiAjZW5kaWYgLyogSVdfV0lSRUxFU1NfU1BZICovCiAjaWZkZWYgSElTVE9HUkFNCkBAIC0yOTM5LDcgKzI5MzgsNyBAQAogCSAqIG5lZWQgdG8gcGFkLiBKZWFuIElJICovCiAJaWYgKHNrYi0+bGVuIDwgRVRIX1pMRU4pIHsKIAkJbWVtc2V0KGRhdGEsIDAsIEVUSF9aTEVOKTsKLQkJbWVtY3B5KGRhdGEsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgZGF0YSwgc2tiLT5sZW4pOwogCQkvKiBXcml0ZSBwYWNrZXQgb24gdGhlIGNhcmQgKi8KIAkJaWYod3ZfcGFja2V0X3dyaXRlKGRldiwgZGF0YSwgRVRIX1pMRU4pKQogCQkJcmV0dXJuIDE7CS8qIFdlIGZhaWxlZCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2F2ZWxhbl9jcy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2F2ZWxhbl9jcy5jCmluZGV4IGIwNDIzOTcuLjY3Yjg2N2Y4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy93YXZlbGFuX2NzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2F2ZWxhbl9jcy5jCkBAIC0yODg0LDE0ICsyODg0LDEyIEBACiAgICAgICByZXR1cm47CiAgICAgfQogCi0gIHNrYi0+ZGV2ID0gZGV2OwotCiAgIHNrYl9yZXNlcnZlKHNrYiwgMik7CiAgIGZkX3AgPSByZWFkX3JpbmdidWYoZGV2LCBmZF9wLCAoY2hhciAqKSBza2JfcHV0KHNrYiwgc2tzaXplKSwgc2tzaXplKTsKICAgc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKIAogI2lmZGVmIERFQlVHX1JYX0lORk8KLSAgd3ZfcGFja2V0X2luZm8oc2tiLT5tYWMucmF3LCBza3NpemUsIGRldi0+bmFtZSwgInd2X3BhY2tldF9yZWFkIik7CisgIHd2X3BhY2tldF9pbmZvKHNrYl9tYWNfaGVhZGVyKHNrYiksIHNrc2l6ZSwgZGV2LT5uYW1lLCAid3ZfcGFja2V0X3JlYWQiKTsKICNlbmRpZgkvKiBERUJVR19SWF9JTkZPICovCiAgICAgIAogICAvKiBTdGF0aXN0aWNzIGdhdGhlcmluZyAmIHN0dWZmIGFzc29jaWF0ZWQuCkBAIC0yOTI1LDcgKzI5MjMsNyBAQAogI2VuZGlmCS8qIFdBVkVMQU5fUk9BTUlORyAqLwogCSAgCiAjaWZkZWYgV0lSRUxFU1NfU1BZCi0gICAgICB3bF9zcHlfZ2F0aGVyKGRldiwgc2tiLT5tYWMucmF3ICsgV0FWRUxBTl9BRERSX1NJWkUsIHN0YXRzKTsKKyAgICAgIHdsX3NweV9nYXRoZXIoZGV2LCBza2JfbWFjX2hlYWRlcihza2IpICsgV0FWRUxBTl9BRERSX1NJWkUsIHN0YXRzKTsKICNlbmRpZgkvKiBXSVJFTEVTU19TUFkgKi8KICNpZmRlZiBISVNUT0dSQU0KICAgICAgIHdsX2hpc19nYXRoZXIoZGV2LCBzdGF0cyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMDEuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIwMS5jCmluZGV4IDZjYjY2YTMuLjkzNWIxNDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIwMS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIwMS5jCkBAIC0zMjcsNyArMzI3LDYgQEAKIAkJCW1lbWNweShza2JfcHV0KHNrYiwgNiksICZkYXRhW2RhdGFsZW4tOF0sIDYpOwogCQkJbWVtY3B5KHNrYl9wdXQoc2tiLCAyKSwgJmRhdGFbZGF0YWxlbi0yNF0sIDIpOwogCQkJbWVtY3B5KHNrYl9wdXQoc2tiLCBsZW4pLCBkYXRhLCBsZW4pOwotCQkJc2tiLT5kZXYgPSB6ZC0+ZGV2OwogCQkJc2tiLT5kZXYtPmxhc3RfcnggPSBqaWZmaWVzOwogCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgemQtPmRldik7CiAJCQl6ZC0+c3RhdHMucnhfcGFja2V0cysrOwpAQCAtMzg1LDcgKzM4NCw2IEBACiAJCQltZW1jcHkoc2tiX3B1dChza2IsIDIpLCAmZGF0YVs2XSwgMik7CiAJCQltZW1jcHkoc2tiX3B1dChza2IsIGxlbiksIGRhdGErOCwgbGVuKTsKIAkJfQotCQlza2ItPmRldiA9IHpkLT5kZXY7CiAJCXNrYi0+ZGV2LT5sYXN0X3J4ID0gamlmZmllczsKIAkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgemQtPmRldik7CiAJCXpkLT5zdGF0cy5yeF9wYWNrZXRzKys7CkBAIC04MDksMTAgKzgwNywxMCBAQAogCXR4YnVmWzRdID0gMHgwMDsKIAl0eGJ1Zls1XSA9IDB4MDA7CiAKLQltZW1jcHkodHhidWYrNiwgc2tiLT5kYXRhKzEyLCBza2ItPmxlbi0xMik7CisJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YV9vZmZzZXQoc2tiLCAxMiwgdHhidWYgKyA2LCBza2ItPmxlbiAtIDEyKTsKIAlpZiAocGFkKQogCQl0eGJ1Zltza2ItPmxlbi0xMis2XT0wOwotCW1lbWNweSh0eGJ1Zitza2ItPmxlbi0xMis2K3BhZCwgc2tiLT5kYXRhLCAxMik7CisJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIHR4YnVmICsgc2tiLT5sZW4gLSAxMiArIDYgKyBwYWQsIDEyKTsKIAkqKF9fYmUxNiopJnR4YnVmW3NrYi0+bGVuKzYrcGFkXSA9IGh0b25zKHNrYi0+bGVuLTEyKzYpOwogCXR4YnVmW3R4YnVmbGVuLTFdID0gMDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L0tjb25maWcKaW5kZXggNjZlZDU1Yi4uZDFhYjI0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy9LY29uZmlnCkBAIC0xLDYgKzEsNyBAQAogY29uZmlnIFpEMTIxMVJXCiAJdHJpc3RhdGUgIlp5REFTIFpEMTIxMS9aRDEyMTFCIFVTQi13aXJlbGVzcyBzdXBwb3J0IgotCWRlcGVuZHMgb24gVVNCICYmIElFRUU4MDIxMSAmJiBJRUVFODAyMTFfU09GVE1BQyAmJiBORVRfUkFESU8gJiYgRVhQRVJJTUVOVEFMCisJZGVwZW5kcyBvbiBVU0IgJiYgSUVFRTgwMjExX1NPRlRNQUMgJiYgV0xBTl84MDIxMSAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgV0lSRUxFU1NfRVhUCiAJc2VsZWN0IEZXX0xPQURFUgogCS0tLWhlbHAtLS0KIAkgIFRoaXMgaXMgYW4gZXhwZXJpbWVudGFsIGRyaXZlciBmb3IgdGhlIFp5REFTIFpEMTIxMS9aRDEyMTFCIHdpcmVsZXNzCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9jaGlwLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9jaGlwLmMKaW5kZXggODdlZTNlZS4uOTViNGEyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfY2hpcC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX2NoaXAuYwpAQCAtNjcsMTEgKzY3LDEyIEBACiAJaSArPSBzY25wcmludF9tYWNfb3VpKGNoaXAtPmUycF9tYWMsIGJ1ZmZlcitpLCBzaXplLWkpOwogCWkgKz0gc2NucHJpbnRmKGJ1ZmZlcitpLCBzaXplLWksICIgIik7CiAJaSArPSB6ZF9yZl9zY25wcmludF9pZCgmY2hpcC0+cmYsIGJ1ZmZlcitpLCBzaXplLWkpOwotCWkgKz0gc2NucHJpbnRmKGJ1ZmZlcitpLCBzaXplLWksICIgcGElMXggJWMlYyVjJWMiLCBjaGlwLT5wYV90eXBlLAorCWkgKz0gc2NucHJpbnRmKGJ1ZmZlcitpLCBzaXplLWksICIgcGElMXggJWMlYyVjJWMlYyIsIGNoaXAtPnBhX3R5cGUsCiAJCWNoaXAtPnBhdGNoX2Nja19nYWluID8gJ2cnIDogJy0nLAogCQljaGlwLT5wYXRjaF9jcjE1NyA/ICc3JyA6ICctJywKIAkJY2hpcC0+cGF0Y2hfNm1fYmFuZF9lZGdlID8gJzYnIDogJy0nLAotCQljaGlwLT5uZXdfcGh5X2xheW91dCA/ICdOJyA6ICctJyk7CisJCWNoaXAtPm5ld19waHlfbGF5b3V0ID8gJ04nIDogJy0nLAorCQljaGlwLT5hbDIyMzBzX2JpdCA/ICdTJyA6ICctJyk7CiAJcmV0dXJuIGk7CiB9CiAKQEAgLTExNCw3ICsxMTUsNyBAQAogCS8qIEFsbG9jYXRlIGEgc2luZ2xlIG1lbW9yeSBibG9jayBmb3IgdmFsdWVzIGFuZCBhZGRyZXNzZXMuICovCiAJY291bnQxNiA9IDIqY291bnQ7CiAJYTE2ID0gKHpkX2FkZHJfdCAqKSBrbWFsbG9jKGNvdW50MTYgKiAoc2l6ZW9mKHpkX2FkZHJfdCkgKyBzaXplb2YodTE2KSksCi0JCSAgICAgICAgICAgICAgICAgICBHRlBfTk9GUyk7CisJCSAgICAgICAgICAgICAgICAgICBHRlBfS0VSTkVMKTsKIAlpZiAoIWExNikgewogCQlkZXZfZGJnX2YoemRfY2hpcF9kZXYoY2hpcCksCiAJCQkgICJlcnJvciBFTk9NRU0gaW4gYWxsb2NhdGlvbiBvZiBhMTZcbiIpOwpAQCAtMTYzLDcgKzE2NCw3IEBACiAKIAkvKiBBbGxvY2F0ZSBhIHNpbmdsZSBtZW1vcnkgYmxvY2sgZm9yIHZhbHVlcyBhbmQgYWRkcmVzc2VzLiAqLwogCWNvdW50MTYgPSAyKmNvdW50OwotCWlvcmVxczE2ID0ga21hbGxvYyhjb3VudDE2ICogc2l6ZW9mKHN0cnVjdCB6ZF9pb3JlcTE2KSwgR0ZQX05PRlMpOworCWlvcmVxczE2ID0ga21hbGxvYyhjb3VudDE2ICogc2l6ZW9mKHN0cnVjdCB6ZF9pb3JlcTE2KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFpb3JlcXMxNikgewogCQlyID0gLUVOT01FTTsKIAkJZGV2X2RiZ19mKHpkX2NoaXBfZGV2KGNoaXApLApAQCAtNjE0LDE2ICs2MTUsMjQgQEAKICAqIFZlbmRvciBkcml2ZXIgc2F5czogZm9yIEZDQyByZWd1bGF0aW9uLCBlbmFibGVkIHBlciBIV0ZlYXR1cmUgNk0gYmFuZCBlZGdlCiAgKiBiaXQgKGZvciBBTDIyMzAsIEFMMjIzMFMpCiAgKi8KLXN0YXRpYyBpbnQgcGF0Y2hfNm1fYmFuZF9lZGdlKHN0cnVjdCB6ZF9jaGlwICpjaGlwLCBpbnQgY2hhbm5lbCkKK3N0YXRpYyBpbnQgcGF0Y2hfNm1fYmFuZF9lZGdlKHN0cnVjdCB6ZF9jaGlwICpjaGlwLCB1OCBjaGFubmVsKQoreworCVpEX0FTU0VSVChtdXRleF9pc19sb2NrZWQoJmNoaXAtPm11dGV4KSk7CisJaWYgKCFjaGlwLT5wYXRjaF82bV9iYW5kX2VkZ2UpCisJCXJldHVybiAwOworCisJcmV0dXJuIHpkX3JmX3BhdGNoXzZtX2JhbmRfZWRnZSgmY2hpcC0+cmYsIGNoYW5uZWwpOworfQorCisvKiBHZW5lcmljIGltcGxlbWVudGF0aW9uIG9mIDZNIGJhbmQgZWRnZSBwYXRjaGluZywgdXNlZCBieSBtb3N0IFJGcyB2aWEKKyAqIHpkX3JmX2dlbmVyaWNfcGF0Y2hfNm0oKSAqLworaW50IHpkX2NoaXBfZ2VuZXJpY19wYXRjaF82bV9iYW5kKHN0cnVjdCB6ZF9jaGlwICpjaGlwLCBpbnQgY2hhbm5lbCkKIHsKIAlzdHJ1Y3QgemRfaW9yZXExNiBpb3JlcXNbXSA9IHsKIAkJeyBDUjEyOCwgMHgxNCB9LCB7IENSMTI5LCAweDEyIH0sIHsgQ1IxMzAsIDB4MTAgfSwKIAkJeyBDUjQ3LCAgMHgxZSB9LAogCX07CiAKLQlpZiAoIWNoaXAtPnBhdGNoXzZtX2JhbmRfZWRnZSB8fCAhY2hpcC0+cmYucGF0Y2hfNm1fYmFuZF9lZGdlKQotCQlyZXR1cm4gMDsKLQogCS8qIEZJWE1FOiBDaGFubmVsIDExIGlzIG5vdCB0aGUgZWRnZSBmb3IgYWxsIHJlZ3VsYXRvcnkgZG9tYWlucy4gKi8KIAlpZiAoY2hhbm5lbCA9PSAxIHx8IGNoYW5uZWwgPT0gMTEpCiAJCWlvcmVxc1swXS52YWx1ZSA9IDB4MTI7CkBAIC02ODMsMTcgKzY5MiwxNyBAQAogCQl7IENSMTExLCAweDI3IH0sIHsgQ1IxMTIsIDB4MjcgfSwgeyBDUjExMywgMHgyNyB9LAogCQl7IENSMTE0LCAweDI3IH0sIHsgQ1IxMTUsIDB4MjYgfSwgeyBDUjExNiwgMHgyNCB9LAogCQl7IENSMTE3LCAweGZjIH0sIHsgQ1IxMTgsIDB4ZmEgfSwgeyBDUjEyMCwgMHg0ZiB9LAotCQl7IENSMTIzLCAweDI3IH0sIHsgQ1IxMjUsIDB4YWEgfSwgeyBDUjEyNywgMHgwMyB9LAotCQl7IENSMTI4LCAweDE0IH0sIHsgQ1IxMjksIDB4MTIgfSwgeyBDUjEzMCwgMHgxMCB9LAotCQl7IENSMTMxLCAweDBDIH0sIHsgQ1IxMzYsIDB4ZGYgfSwgeyBDUjEzNywgMHg0MCB9LAotCQl7IENSMTM4LCAweGEwIH0sIHsgQ1IxMzksIDB4YjAgfSwgeyBDUjE0MCwgMHg5OSB9LAotCQl7IENSMTQxLCAweDgyIH0sIHsgQ1IxNDIsIDB4NTQgfSwgeyBDUjE0MywgMHgxYyB9LAotCQl7IENSMTQ0LCAweDZjIH0sIHsgQ1IxNDcsIDB4MDcgfSwgeyBDUjE0OCwgMHg0YyB9LAotCQl7IENSMTQ5LCAweDUwIH0sIHsgQ1IxNTAsIDB4MGUgfSwgeyBDUjE1MSwgMHgxOCB9LAotCQl7IENSMTYwLCAweGZlIH0sIHsgQ1IxNjEsIDB4ZWUgfSwgeyBDUjE2MiwgMHhhYSB9LAotCQl7IENSMTYzLCAweGZhIH0sIHsgQ1IxNjQsIDB4ZmEgfSwgeyBDUjE2NSwgMHhlYSB9LAotCQl7IENSMTY2LCAweGJlIH0sIHsgQ1IxNjcsIDB4YmUgfSwgeyBDUjE2OCwgMHg2YSB9LAotCQl7IENSMTY5LCAweGJhIH0sIHsgQ1IxNzAsIDB4YmEgfSwgeyBDUjE3MSwgMHhiYSB9LAorCQl7IENSMTI1LCAweGFhIH0sIHsgQ1IxMjcsIDB4MDMgfSwgeyBDUjEyOCwgMHgxNCB9LAorCQl7IENSMTI5LCAweDEyIH0sIHsgQ1IxMzAsIDB4MTAgfSwgeyBDUjEzMSwgMHgwQyB9LAorCQl7IENSMTM2LCAweGRmIH0sIHsgQ1IxMzcsIDB4NDAgfSwgeyBDUjEzOCwgMHhhMCB9LAorCQl7IENSMTM5LCAweGIwIH0sIHsgQ1IxNDAsIDB4OTkgfSwgeyBDUjE0MSwgMHg4MiB9LAorCQl7IENSMTQyLCAweDU0IH0sIHsgQ1IxNDMsIDB4MWMgfSwgeyBDUjE0NCwgMHg2YyB9LAorCQl7IENSMTQ3LCAweDA3IH0sIHsgQ1IxNDgsIDB4NGMgfSwgeyBDUjE0OSwgMHg1MCB9LAorCQl7IENSMTUwLCAweDBlIH0sIHsgQ1IxNTEsIDB4MTggfSwgeyBDUjE2MCwgMHhmZSB9LAorCQl7IENSMTYxLCAweGVlIH0sIHsgQ1IxNjIsIDB4YWEgfSwgeyBDUjE2MywgMHhmYSB9LAorCQl7IENSMTY0LCAweGZhIH0sIHsgQ1IxNjUsIDB4ZWEgfSwgeyBDUjE2NiwgMHhiZSB9LAorCQl7IENSMTY3LCAweGJlIH0sIHsgQ1IxNjgsIDB4NmEgfSwgeyBDUjE2OSwgMHhiYSB9LAorCQl7IENSMTcwLCAweGJhIH0sIHsgQ1IxNzEsIDB4YmEgfSwKIAkJLyogTm90ZTogQ1IyMDQgbXVzdCBsZWFkIHRoZSBDUjIwMyAqLwogCQl7IENSMjA0LCAweDdkIH0sCiAJCXsgfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX2NoaXAuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX2NoaXAuaAppbmRleCBlNTdlZDc1Li5jZTBhNWY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9jaGlwLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfY2hpcC5oCkBAIC04MzMsNiArODMzLDcgQEAKIHZvaWQgemRfY2hpcF9kaXNhYmxlX3J4KHN0cnVjdCB6ZF9jaGlwICpjaGlwKTsKIGludCB6ZF9jaGlwX2VuYWJsZV9od2ludChzdHJ1Y3QgemRfY2hpcCAqY2hpcCk7CiBpbnQgemRfY2hpcF9kaXNhYmxlX2h3aW50KHN0cnVjdCB6ZF9jaGlwICpjaGlwKTsKK2ludCB6ZF9jaGlwX2dlbmVyaWNfcGF0Y2hfNm1fYmFuZChzdHJ1Y3QgemRfY2hpcCAqY2hpcCwgaW50IGNoYW5uZWwpOwogCiBpbnQgemRfY2hpcF9zZXRfcnRzX2N0c19yYXRlX2xvY2tlZChzdHJ1Y3QgemRfY2hpcCAqY2hpcCwKIAl1OCBydHNfcmF0ZSwgaW50IHByZWFtYmxlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX21hYy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfbWFjLmMKaW5kZXggNGM1Zjc4ZS4uNjc1M2QyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfbWFjLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfbWFjLmMKQEAgLTE1NiwxNyArMTU2LDggQEAKIHN0YXRpYyBpbnQgcmVzZXRfbW9kZShzdHJ1Y3QgemRfbWFjICptYWMpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSB6ZF9tYWNfdG9faWVlZTgwMjExKG1hYyk7Ci0Jc3RydWN0IHpkX2lvcmVxMzIgaW9yZXFzW10gPSB7Ci0JCXsgQ1JfUlhfRklMVEVSLCBTVEFfUlhfRklMVEVSIH0sCi0JCXsgQ1JfU05JRkZFUl9PTiwgMFUgfSwKLQl9OwotCi0JaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SKSB7Ci0JCWlvcmVxc1swXS52YWx1ZSA9IDB4ZmZmZmZmZmY7Ci0JCWlvcmVxc1sxXS52YWx1ZSA9IDB4MTsKLQl9Ci0KLQlyZXR1cm4gemRfaW93cml0ZTMyYSgmbWFjLT5jaGlwLCBpb3JlcXMsIEFSUkFZX1NJWkUoaW9yZXFzKSk7CisJdTMyIGZpbHRlciA9IChpZWVlLT5pd19tb2RlID09IElXX01PREVfTU9OSVRPUikgPyB+MCA6IFNUQV9SWF9GSUxURVI7CisJcmV0dXJuIHpkX2lvd3JpdGUzMigmbWFjLT5jaGlwLCBDUl9SWF9GSUxURVIsIGZpbHRlcik7CiB9CiAKIGludCB6ZF9tYWNfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQpAQCAtOTc0LDE0ICs5NjUsMTQgQEAKIAlzd2l0Y2ggKGllZWUtPml3X21vZGUpIHsKIAljYXNlIElXX01PREVfQURIT0M6CiAJCWlmICgoZmMgJiAoSUVFRTgwMjExX0ZDVExfVE9EU3xJRUVFODAyMTFfRkNUTF9GUk9NRFMpKSAhPSAwIHx8Ci0JCSAgICBtZW1jbXAoaGRyLT5hZGRyMywgaWVlZS0+YnNzaWQsIEVUSF9BTEVOKSAhPSAwKQorCQkgICAgY29tcGFyZV9ldGhlcl9hZGRyKGhkci0+YWRkcjMsIGllZWUtPmJzc2lkKSAhPSAwKQogCQkJcmV0dXJuIDA7CiAJCWJyZWFrOwogCWNhc2UgSVdfTU9ERV9BVVRPOgogCWNhc2UgSVdfTU9ERV9JTkZSQToKIAkJaWYgKChmYyAmIChJRUVFODAyMTFfRkNUTF9UT0RTfElFRUU4MDIxMV9GQ1RMX0ZST01EUykpICE9CiAJCSAgICBJRUVFODAyMTFfRkNUTF9GUk9NRFMgfHwKLQkJICAgIG1lbWNtcChoZHItPmFkZHIyLCBpZWVlLT5ic3NpZCwgRVRIX0FMRU4pICE9IDApCisJCSAgICBjb21wYXJlX2V0aGVyX2FkZHIoaGRyLT5hZGRyMiwgaWVlZS0+YnNzaWQpICE9IDApCiAJCQlyZXR1cm4gMDsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKQEAgLTk4OSw5ICs5ODAsOSBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQlyZXR1cm4gbWVtY21wKGhkci0+YWRkcjEsIG5ldGRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKSA9PSAwIHx8CisJcmV0dXJuIGNvbXBhcmVfZXRoZXJfYWRkcihoZHItPmFkZHIxLCBuZXRkZXYtPmRldl9hZGRyKSA9PSAwIHx8CiAJICAgICAgIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihoZHItPmFkZHIxKSAmJgotCQltZW1jbXAoaGRyLT5hZGRyMywgbmV0ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pICE9IDApIHx8CisJCWNvbXBhcmVfZXRoZXJfYWRkcihoZHItPmFkZHIzLCBuZXRkZXYtPmRldl9hZGRyKSAhPSAwKSB8fAogCSAgICAgICAobmV0ZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKTsKIH0KIApAQCAtMTA0Nyw3ICsxMDM4LDcgQEAKIAloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKilidWZmZXI7CiAJaWYgKGxlbmd0aCA8IG9mZnNldG9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyLCBhZGRyMykpCiAJCXJldHVybjsKLQlpZiAobWVtY21wKGhkci0+YWRkcjIsIHpkX21hY190b19pZWVlODAyMTEobWFjKS0+YnNzaWQsIEVUSF9BTEVOKSAhPSAwKQorCWlmIChjb21wYXJlX2V0aGVyX2FkZHIoaGRyLT5hZGRyMiwgemRfbWFjX3RvX2llZWU4MDIxMShtYWMpLT5ic3NpZCkgIT0gMCkKIAkJcmV0dXJuOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm1hYy0+bG9jaywgZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfcmYuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3JmLmMKaW5kZXggZjUwY2ZmMy4uNTQ5YzIzYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfcmYuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9yZi5jCkBAIC0yMyw3ICsyMyw3IEBACiAjaW5jbHVkZSAiemRfaWVlZTgwMjExLmgiCiAjaW5jbHVkZSAiemRfY2hpcC5oIgogCi1zdGF0aWMgY29uc3QgY2hhciAqcmZzW10gPSB7CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJmc1tdID0gewogCVswXQkJPSAidW5rbm93biBSRjAiLAogCVsxXQkJPSAidW5rbm93biBSRjEiLAogCVtVVzI0NTFfUkZdCT0gIlVXMjQ1MV9SRiIsCkBAIC0zNCw3ICszNCw3IEBACiAJW0FMMjIxMF9SRl0JPSAiQUwyMjEwX1JGIiwKIAlbTUFYSU1fTkVXX1JGXQk9ICJNQVhJTV9ORVdfUkYiLAogCVtVVzI0NTNfUkZdCT0gIlVXMjQ1M19SRiIsCi0JW0FMMjIzMFNfUkZdCT0gIkFMMjIzMFNfUkYiLAorCVtVTktOT1dOX0FfUkZdCT0gIlVOS05PV05fQV9SRiIsCiAJW1JBTElOS19SRl0JPSAiUkFMSU5LX1JGIiwKIAlbSU5URVJTSUxfUkZdCT0gIklOVEVSU0lMX1JGIiwKIAlbUkYyOTU5X1JGXQk9ICJSRjI5NTlfUkYiLApAQCAtMTU0LDMgKzE1NCwxNyBAQAogCQlyID0gdDsKIAlyZXR1cm4gcjsKIH0KKworaW50IHpkX3JmX3BhdGNoXzZtX2JhbmRfZWRnZShzdHJ1Y3QgemRfcmYgKnJmLCB1OCBjaGFubmVsKQoreworCWlmICghcmYtPnBhdGNoXzZtX2JhbmRfZWRnZSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gcmYtPnBhdGNoXzZtX2JhbmRfZWRnZShyZiwgY2hhbm5lbCk7Cit9CisKK2ludCB6ZF9yZl9nZW5lcmljX3BhdGNoXzZtKHN0cnVjdCB6ZF9yZiAqcmYsIHU4IGNoYW5uZWwpCit7CisJcmV0dXJuIHpkX2NoaXBfZ2VuZXJpY19wYXRjaF82bV9iYW5kKHpkX3JmX3RvX2NoaXAocmYpLCBjaGFubmVsKTsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfcmYuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3JmLmgKaW5kZXggYTU3NzMyZS4uYWE5Y2MxMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfcmYuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9yZi5oCkBAIC0yNiw3ICsyNiw3IEBACiAjZGVmaW5lIEFMMjIxMF9SRgkJCTB4NwogI2RlZmluZSBNQVhJTV9ORVdfUkYJCQkweDgKICNkZWZpbmUgVVcyNDUzX1JGCQkJMHg5Ci0jZGVmaW5lIEFMMjIzMFNfUkYJCQkweGEKKyNkZWZpbmUgVU5LTk9XTl9BX1JGCQkJMHhhCiAjZGVmaW5lIFJBTElOS19SRgkJCTB4YgogI2RlZmluZSBJTlRFUlNJTF9SRgkJCTB4YwogI2RlZmluZSBSRjI5NTlfUkYJCQkweGQKQEAgLTQ3LDE3ICs0NywxMyBAQAogCXU4IHR5cGU7CiAKIAl1OCBjaGFubmVsOwotCS8qCi0JICogV2hldGhlciB0aGlzIFJGIHNob3VsZCBwYXRjaCB0aGUgNk0gYmFuZCBlZGdlCi0JICogKGFzc3VtaW5nIEUyUF9QT0QgYWdyZWVzKQotCSAqLwotCXU4IHBhdGNoXzZtX2JhbmRfZWRnZToxOwogCiAJLyogUkYtc3BlY2lmaWMgZnVuY3Rpb25zICovCiAJaW50ICgqaW5pdF9odykoc3RydWN0IHpkX3JmICpyZik7CiAJaW50ICgqc2V0X2NoYW5uZWwpKHN0cnVjdCB6ZF9yZiAqcmYsIHU4IGNoYW5uZWwpOwogCWludCAoKnN3aXRjaF9yYWRpb19vbikoc3RydWN0IHpkX3JmICpyZik7CiAJaW50ICgqc3dpdGNoX3JhZGlvX29mZikoc3RydWN0IHpkX3JmICpyZik7CisJaW50ICgqcGF0Y2hfNm1fYmFuZF9lZGdlKShzdHJ1Y3QgemRfcmYgKnJmLCB1OCBjaGFubmVsKTsKIH07CiAKIGNvbnN0IGNoYXIgKnpkX3JmX25hbWUodTggdHlwZSk7CkBAIC03Miw2ICs2OCw5IEBACiBpbnQgemRfc3dpdGNoX3JhZGlvX29uKHN0cnVjdCB6ZF9yZiAqcmYpOwogaW50IHpkX3N3aXRjaF9yYWRpb19vZmYoc3RydWN0IHpkX3JmICpyZik7CiAKK2ludCB6ZF9yZl9wYXRjaF82bV9iYW5kX2VkZ2Uoc3RydWN0IHpkX3JmICpyZiwgdTggY2hhbm5lbCk7CitpbnQgemRfcmZfZ2VuZXJpY19wYXRjaF82bShzdHJ1Y3QgemRfcmYgKnJmLCB1OCBjaGFubmVsKTsKKwogLyogRnVuY3Rpb25zIGZvciBpbmRpdmlkdWFsIFJGIGNoaXBzICovCiAKIGludCB6ZF9yZl9pbml0X3JmMjk1OShzdHJ1Y3QgemRfcmYgKnJmKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3JmX2FsMjIzMC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfcmZfYWwyMjMwLmMKaW5kZXggNTIzNWE3OC4uNTExMzkyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfcmZfYWwyMjMwLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfcmZfYWwyMjMwLmMKQEAgLTU5LDYgKzU5LDE4IEBACiAJeyBDUjI0MCwgMHg1NyB9LCB7IENSOSwgICAweGUwIH0sCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IHpkX2lvcmVxMTYgaW9yZXFzX2luaXRfYWwyMjMwc1tdID0geworCXsgQ1I0NywgICAweDFlIH0sIC8qIE1BUktfMDAyICovCisJeyBDUjEwNiwgIDB4MjIgfSwKKwl7IENSMTA3LCAgMHgyYSB9LCAvKiBNQVJLXzAwMiAqLworCXsgQ1IxMDksICAweDEzIH0sIC8qIE1BUktfMDAyICovCisJeyBDUjExOCwgIDB4ZjggfSwgLyogTUFSS18wMDIgKi8KKwl7IENSMTE5LCAgMHgxMiB9LCB7IENSMTIyLCAgMHhlMCB9LAorCXsgQ1IxMjgsICAweDEwIH0sIC8qIE1BUktfMDAxIGZyb20gMHhlLT4weDEwICovCisJeyBDUjEyOSwgIDB4MGUgfSwgLyogTUFSS18wMDEgZnJvbSAweGQtPjB4MGUgKi8KKwl7IENSMTMwLCAgMHgxMCB9LCAvKiBNQVJLXzAwMSBmcm9tIDB4Yi0+MHgwZCAqLworfTsKKwogc3RhdGljIGludCB6ZDEyMTFiX2FsMjIzMF9maW5hbGl6ZV9yZihzdHJ1Y3QgemRfY2hpcCAqY2hpcCkKIHsKIAlpbnQgcjsKQEAgLTkwLDcgKzEwMiw3IEBACiAJaW50IHI7CiAJc3RydWN0IHpkX2NoaXAgKmNoaXAgPSB6ZF9yZl90b19jaGlwKHJmKTsKIAotCXN0YXRpYyBjb25zdCBzdHJ1Y3QgemRfaW9yZXExNiBpb3JlcXNbXSA9IHsKKwlzdGF0aWMgY29uc3Qgc3RydWN0IHpkX2lvcmVxMTYgaW9yZXFzX2luaXRbXSA9IHsKIAkJeyBDUjE1LCAgIDB4MjAgfSwgeyBDUjIzLCAgIDB4NDAgfSwgeyBDUjI0LCAgMHgyMCB9LAogCQl7IENSMjYsICAgMHgxMSB9LCB7IENSMjgsICAgMHgzZSB9LCB7IENSMjksICAweDAwIH0sCiAJCXsgQ1I0NCwgICAweDMzIH0sIHsgQ1IxMDYsICAweDJhIH0sIHsgQ1IxMDcsIDB4MWEgfSwKQEAgLTExNywxMCArMTI5LDkgQEAKIAkJeyBDUjExOSwgIDB4MTAgfSwgeyBDUjEyMCwgIDB4NGYgfSwgeyBDUjEyMSwgMHg3NyB9LAogCQl7IENSMTIyLCAgMHhlMCB9LCB7IENSMTM3LCAgMHg4OCB9LCB7IENSMjUyLCAweGZmIH0sCiAJCXsgQ1IyNTMsICAweGZmIH0sCisJfTsKIAotCQkvKiBUaGVzZSBmb2xsb3dpbmcgaGFwcGVuIHNlcGFyYXRlbHkgaW4gdGhlIHZlbmRvciBkcml2ZXIgKi8KLQkJeyB9LAotCisJc3RhdGljIGNvbnN0IHN0cnVjdCB6ZF9pb3JlcTE2IGlvcmVxc19wbGxbXSA9IHsKIAkJLyogc2hkbmIoUExMX09OKT0wICovCiAJCXsgQ1IyNTEsICAweDJmIH0sCiAJCS8qIHNoZG5iKFBMTF9PTik9MSAqLwpAQCAtMTI4LDcgKzEzOSw3IEBACiAJCXsgQ1IxMzgsICAweDI4IH0sIHsgQ1IyMDMsICAweDA2IH0sCiAJfTsKIAotCXN0YXRpYyBjb25zdCB1MzIgcnZbXSA9IHsKKwlzdGF0aWMgY29uc3QgdTMyIHJ2MVtdID0gewogCQkvKiBDaGFubmVsIDEgKi8KIAkJMHgwM2Y3OTAsCiAJCTB4MDMzMzMxLApAQCAtMTM3LDYgKzE0OCw5IEBACiAJCTB4MGIzMzMxLAogCQkweDAzYjgxMiwKIAkJMHgwMGZmZjMsCisJfTsKKworCXN0YXRpYyBjb25zdCB1MzIgcnYyW10gPSB7CiAJCTB4MDAwZGE0LAogCQkweDBmNGRjNSwgLyogZml4IGZyZXEgc2hpZnQsIDB4MDRlZGM1ICovCiAJCTB4MDgwNWI2LApAQCAtMTQ4LDggKzE2Miw5IEBACiAJCTB4MGJkZmZjLAogCQkweDAwMDAwZCwKIAkJMHgwMDUwMGYsCisJfTsKIAotCQkvKiBUaGVzZSB3cml0ZXMgaGFwcGVuIHNlcGFyYXRlbHkgaW4gdGhlIHZlbmRvciBkcml2ZXIgKi8KKwlzdGF0aWMgY29uc3QgdTMyIHJ2M1tdID0gewogCQkweDAwZDAwZiwKIAkJMHgwMDRjMGYsCiAJCTB4MDA1NDBmLApAQCAtMTU3LDExICsxNzIsMzggQEAKIAkJMHgwMDUwMGYsCiAJfTsKIAotCXIgPSB6ZF9pb3dyaXRlMTZhX2xvY2tlZChjaGlwLCBpb3JlcXMsIEFSUkFZX1NJWkUoaW9yZXFzKSk7CisJciA9IHpkX2lvd3JpdGUxNmFfbG9ja2VkKGNoaXAsIGlvcmVxc19pbml0LCBBUlJBWV9TSVpFKGlvcmVxc19pbml0KSk7CiAJaWYgKHIpCiAJCXJldHVybiByOwogCi0JciA9IHpkX3Jmd3JpdGV2X2xvY2tlZChjaGlwLCBydiwgQVJSQVlfU0laRShydiksIFJGX1JWX0JJVFMpOworCWlmIChjaGlwLT5hbDIyMzBzX2JpdCkgeworCQlyID0gemRfaW93cml0ZTE2YV9sb2NrZWQoY2hpcCwgaW9yZXFzX2luaXRfYWwyMjMwcywKKwkJCUFSUkFZX1NJWkUoaW9yZXFzX2luaXRfYWwyMjMwcykpOworCQlpZiAocikKKwkJCXJldHVybiByOworCX0KKworCXIgPSB6ZF9yZndyaXRldl9sb2NrZWQoY2hpcCwgcnYxLCBBUlJBWV9TSVpFKHJ2MSksIFJGX1JWX0JJVFMpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCS8qIGltcHJvdmUgYmFuZCBlZGdlIGZvciBBTDIyMzBTICovCisJaWYgKGNoaXAtPmFsMjIzMHNfYml0KQorCQlyID0gemRfcmZ3cml0ZV9sb2NrZWQoY2hpcCwgMHgwMDA4MjQsIFJGX1JWX0JJVFMpOworCWVsc2UKKwkJciA9IHpkX3Jmd3JpdGVfbG9ja2VkKGNoaXAsIDB4MDAwNWE0LCBSRl9SVl9CSVRTKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlyID0gemRfcmZ3cml0ZXZfbG9ja2VkKGNoaXAsIHJ2MiwgQVJSQVlfU0laRShydjIpLCBSRl9SVl9CSVRTKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlyID0gemRfaW93cml0ZTE2YV9sb2NrZWQoY2hpcCwgaW9yZXFzX3BsbCwgQVJSQVlfU0laRShpb3JlcXNfcGxsKSk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJciA9IHpkX3Jmd3JpdGV2X2xvY2tlZChjaGlwLCBydjMsIEFSUkFZX1NJWkUocnYzKSwgUkZfUlZfQklUUyk7CiAJaWYgKHIpCiAJCXJldHVybiByOwogCkBAIC0yMjcsNyArMjY5LDkgQEAKIAkJMHg0ODFkYzAsCiAJCTB4Y2ZmZjAwLAogCQkweDI1YTAwMCwKKwl9OwogCisJc3RhdGljIGNvbnN0IHUzMiBydjJbXSA9IHsKIAkJLyogVG8gaW1wcm92ZSBBTDIyMzAgeWllbGQsIGltcHJvdmUgcGhhc2Ugbm9pc2UsIDQ3MTMgKi8KIAkJMHgyNWEwMDAsCiAJCTB4YTNiMmYwLApAQCAtMjUwLDcgKzI5NCw3IEBACiAJCXsgQ1IyNTEsIDB4N2YgfSwgLyogc2hkbmIoUExMX09OKT0xICovCiAJfTsKIAotCXN0YXRpYyBjb25zdCB1MzIgcnYyW10gPSB7CisJc3RhdGljIGNvbnN0IHUzMiBydjNbXSA9IHsKIAkJLyogVG8gaW1wcm92ZSBBTDIyMzAgeWllbGQsIDQ3MTMgKi8KIAkJMHhmMDFiMDAsCiAJCTB4ZjAxZTAwLApAQCAtMjY5LDE2ICszMTMsMzUgQEAKIAlyID0gemRfaW93cml0ZTE2YV9sb2NrZWQoY2hpcCwgaW9yZXFzMSwgQVJSQVlfU0laRShpb3JlcXMxKSk7CiAJaWYgKHIpCiAJCXJldHVybiByOworCisJaWYgKGNoaXAtPmFsMjIzMHNfYml0KSB7CisJCXIgPSB6ZF9pb3dyaXRlMTZhX2xvY2tlZChjaGlwLCBpb3JlcXNfaW5pdF9hbDIyMzBzLAorCQkJQVJSQVlfU0laRShpb3JlcXNfaW5pdF9hbDIyMzBzKSk7CisJCWlmIChyKQorCQkJcmV0dXJuIHI7CisJfQorCiAJciA9IHpkX3Jmd3JpdGV2X2NyX2xvY2tlZChjaGlwLCB6ZDEyMTFiX2FsMjIzMF90YWJsZVswXSwgMyk7CiAJaWYgKHIpCiAJCXJldHVybiByOwogCXIgPSB6ZF9yZndyaXRldl9jcl9sb2NrZWQoY2hpcCwgcnYxLCBBUlJBWV9TSVpFKHJ2MSkpOwogCWlmIChyKQogCQlyZXR1cm4gcjsKKworCWlmIChjaGlwLT5hbDIyMzBzX2JpdCkKKwkJciA9IHpkX3Jmd3JpdGVfbG9ja2VkKGNoaXAsIDB4MjQxMDAwLCBSRl9SVl9CSVRTKTsKKwllbHNlCisJCXIgPSB6ZF9yZndyaXRlX2xvY2tlZChjaGlwLCAweDI1YTAwMCwgUkZfUlZfQklUUyk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJciA9IHpkX3Jmd3JpdGV2X2NyX2xvY2tlZChjaGlwLCBydjIsIEFSUkFZX1NJWkUocnYyKSk7CisJaWYgKHIpCisJCXJldHVybiByOwogCXIgPSB6ZF9pb3dyaXRlMTZhX2xvY2tlZChjaGlwLCBpb3JlcXMyLCBBUlJBWV9TSVpFKGlvcmVxczIpKTsKIAlpZiAocikKIAkJcmV0dXJuIHI7Ci0JciA9IHpkX3Jmd3JpdGV2X2NyX2xvY2tlZChjaGlwLCBydjIsIEFSUkFZX1NJWkUocnYyKSk7CisJciA9IHpkX3Jmd3JpdGV2X2NyX2xvY2tlZChjaGlwLCBydjMsIEFSUkFZX1NJWkUocnYzKSk7CiAJaWYgKHIpCiAJCXJldHVybiByOwogCXIgPSB6ZF9pb3dyaXRlMTZhX2xvY2tlZChjaGlwLCBpb3JlcXMzLCBBUlJBWV9TSVpFKGlvcmVxczMpKTsKQEAgLTM1OCwxMiArNDIxLDYgQEAKIHsKIAlzdHJ1Y3QgemRfY2hpcCAqY2hpcCA9IHpkX3JmX3RvX2NoaXAocmYpOwogCi0JaWYgKGNoaXAtPmFsMjIzMHNfYml0KSB7Ci0JCWRldl9lcnIoemRfY2hpcF9kZXYoY2hpcCksICJBTDIyMzBTIGRldmljZXMgYXJlIG5vdCB5ZXQgIgotCQkJInN1cHBvcnRlZCBieSB0aGlzIGRyaXZlci5cbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KIAlyZi0+c3dpdGNoX3JhZGlvX29mZiA9IGFsMjIzMF9zd2l0Y2hfcmFkaW9fb2ZmOwogCWlmIChjaGlwLT5pc196ZDEyMTFiKSB7CiAJCXJmLT5pbml0X2h3ID0gemQxMjExYl9hbDIyMzBfaW5pdF9odzsKQEAgLTM3NCw2ICs0MzEsNiBAQAogCQlyZi0+c2V0X2NoYW5uZWwgPSB6ZDEyMTFfYWwyMjMwX3NldF9jaGFubmVsOwogCQlyZi0+c3dpdGNoX3JhZGlvX29uID0gemQxMjExX2FsMjIzMF9zd2l0Y2hfcmFkaW9fb247CiAJfQotCXJmLT5wYXRjaF82bV9iYW5kX2VkZ2UgPSAxOworCXJmLT5wYXRjaF82bV9iYW5kX2VkZ2UgPSB6ZF9yZl9nZW5lcmljX3BhdGNoXzZtOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfcmZfYWw3MjMwYi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfcmZfYWw3MjMwYi5jCmluZGV4IGEyODlmOTUuLjVlNWU5ZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3JmX2FsNzIzMGIuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9yZl9hbDcyMzBiLmMKQEAgLTUxLDkgKzUxLDUyIEBACiAJMHhkOGMwMTAsCiB9OwogCi1zdGF0aWMgaW50IGFsNzIzMGJfaW5pdF9odyhzdHJ1Y3QgemRfcmYgKnJmKQorc3RhdGljIGNvbnN0IHUzMiBydl9pbml0MVtdID0geworCTB4M2M5MDAwLAorCTB4YmZmZmZmLAorCTB4NzAwMDAwLAorCTB4ZjE1ZDU4LAorfTsKKworc3RhdGljIGNvbnN0IHUzMiBydl9pbml0MltdID0geworCTB4ZjE1ZDU5LAorCTB4ZjE1ZDVjLAorCTB4ZjE1ZDU4LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB6ZF9pb3JlcTE2IGlvcmVxc19zd1tdID0geworCXsgQ1IxMjgsIDB4MTQgfSwgeyBDUjEyOSwgMHgxMiB9LCB7IENSMTMwLCAweDEwIH0sCisJeyBDUjM4LCAgMHgzOCB9LCB7IENSMTM2LCAweGRmIH0sCit9OworCitzdGF0aWMgaW50IHpkMTIxMWJfYWw3MjMwYl9maW5hbGl6ZShzdHJ1Y3QgemRfY2hpcCAqY2hpcCkKIHsKLQlpbnQgaSwgcjsKKwlpbnQgcjsKKwlzdGF0aWMgY29uc3Qgc3RydWN0IHpkX2lvcmVxMTYgaW9yZXFzW10gPSB7CisJCXsgQ1I4MCwgIDB4MzAgfSwgeyBDUjgxLCAgMHgzMCB9LCB7IENSNzksICAweDU4IH0sCisJCXsgQ1IxMiwgIDB4ZjAgfSwgeyBDUjc3LCAgMHgxYiB9LCB7IENSNzgsICAweDU4IH0sCisJCXsgQ1IyMDMsIDB4MDQgfSwKKwkJeyB9LAorCQl7IENSMjQwLCAweDgwIH0sCisJfTsKKworCXIgPSB6ZF9pb3dyaXRlMTZhX2xvY2tlZChjaGlwLCBpb3JlcXMsIEFSUkFZX1NJWkUoaW9yZXFzKSk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJaWYgKGNoaXAtPm5ld19waHlfbGF5b3V0KSB7CisJCS8qIGFudGVubmEgc2VsZWN0aW9uPyAqLworCQlyID0gemRfaW93cml0ZTE2X2xvY2tlZChjaGlwLCAweGU1LCBDUjkpOworCQlpZiAocikKKwkJCXJldHVybiByOworCX0KKworCXJldHVybiB6ZF9pb3dyaXRlMTZfbG9ja2VkKGNoaXAsIDB4MDQsIENSMjAzKTsKK30KKworc3RhdGljIGludCB6ZDEyMTFfYWw3MjMwYl9pbml0X2h3KHN0cnVjdCB6ZF9yZiAqcmYpCit7CisJaW50IHI7CiAJc3RydWN0IHpkX2NoaXAgKmNoaXAgPSB6ZF9yZl90b19jaGlwKHJmKTsKIAogCS8qIEFsbCBvZiB0aGVzZSB3cml0ZXMgYXJlIGlkZW50aWNhbCB0byBBTDIyMzAgdW5sZXNzIG90aGVyd2lzZQpAQCAtMTE3LDM5ICsxNjAsMjQgQEAKIAl9OwogCiAJc3RhdGljIGNvbnN0IHN0cnVjdCB6ZF9pb3JlcTE2IGlvcmVxc18yW10gPSB7Ci0JCS8qIFBMTF9PTiAqLwotCQl7IENSMjUxLCAweDNmIH0sCisJCXsgQ1IyNTEsIDB4M2YgfSwgLyogUExMX09OICovCiAJCXsgQ1IxMjgsIDB4MTQgfSwgeyBDUjEyOSwgMHgxMiB9LCB7IENSMTMwLCAweDEwIH0sCi0JCXsgQ1IzOCwgMHgzOCB9LCB7IENSMTM2LCAweGRmIH0sCisJCXsgQ1IzOCwgIDB4MzggfSwgeyBDUjEzNiwgMHhkZiB9LAogCX07CiAKIAlyID0gemRfaW93cml0ZTE2YV9sb2NrZWQoY2hpcCwgaW9yZXFzXzEsIEFSUkFZX1NJWkUoaW9yZXFzXzEpKTsKIAlpZiAocikKIAkJcmV0dXJuIHI7CiAKLQlyID0gemRfcmZ3cml0ZV9jcl9sb2NrZWQoY2hpcCwgMHgwOWVjMDQpOwotCWlmIChyKQotCQlyZXR1cm4gcjsKLQlyID0gemRfcmZ3cml0ZV9jcl9sb2NrZWQoY2hpcCwgMHg4Y2NjYzgpOworCXIgPSB6ZF9yZndyaXRldl9jcl9sb2NrZWQoY2hpcCwgY2hhbl9ydlswXSwgQVJSQVlfU0laRShjaGFuX3J2WzBdKSk7CiAJaWYgKHIpCiAJCXJldHVybiByOwogCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc3RkX3J2KTsgaSsrKSB7Ci0JCXIgPSB6ZF9yZndyaXRlX2NyX2xvY2tlZChjaGlwLCBzdGRfcnZbaV0pOwotCQlpZiAocikKLQkJCXJldHVybiByOwotCX0KKwlyID0gemRfcmZ3cml0ZXZfY3JfbG9ja2VkKGNoaXAsIHN0ZF9ydiwgQVJSQVlfU0laRShzdGRfcnYpKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CiAKLQlyID0gemRfcmZ3cml0ZV9jcl9sb2NrZWQoY2hpcCwgMHgzYzkwMDApOwotCWlmIChyKQotCQlyZXR1cm4gcjsKLQlyID0gemRfcmZ3cml0ZV9jcl9sb2NrZWQoY2hpcCwgMHhiZmZmZmYpOwotCWlmIChyKQotCQlyZXR1cm4gcjsKLQlyID0gemRfcmZ3cml0ZV9jcl9sb2NrZWQoY2hpcCwgMHg3MDAwMDApOwotCWlmIChyKQotCQlyZXR1cm4gcjsKLQlyID0gemRfcmZ3cml0ZV9jcl9sb2NrZWQoY2hpcCwgMHhmMTVkNTgpOworCXIgPSB6ZF9yZndyaXRldl9jcl9sb2NrZWQoY2hpcCwgcnZfaW5pdDEsIEFSUkFZX1NJWkUocnZfaW5pdDEpKTsKIAlpZiAocikKIAkJcmV0dXJuIHI7CiAKQEAgLTE1NywxMyArMTg1LDcgQEAKIAlpZiAocikKIAkJcmV0dXJuIHI7CiAKLQlyID0gemRfcmZ3cml0ZV9jcl9sb2NrZWQoY2hpcCwgMHhmMTVkNTkpOwotCWlmIChyKQotCQlyZXR1cm4gcjsKLQlyID0gemRfcmZ3cml0ZV9jcl9sb2NrZWQoY2hpcCwgMHhmMTVkNWMpOwotCWlmIChyKQotCQlyZXR1cm4gcjsKLQlyID0gemRfcmZ3cml0ZV9jcl9sb2NrZWQoY2hpcCwgMHhmMTVkNTgpOworCXIgPSB6ZF9yZndyaXRldl9jcl9sb2NrZWQoY2hpcCwgcnZfaW5pdDIsIEFSUkFZX1NJWkUocnZfaW5pdDIpKTsKIAlpZiAocikKIAkJcmV0dXJuIHI7CiAKQEAgLTE3NywxOCArMTk5LDEzNCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGFsNzIzMGJfc2V0X2NoYW5uZWwoc3RydWN0IHpkX3JmICpyZiwgdTggY2hhbm5lbCkKK3N0YXRpYyBpbnQgemQxMjExYl9hbDcyMzBiX2luaXRfaHcoc3RydWN0IHpkX3JmICpyZikKIHsKLQlpbnQgaSwgcjsKLQljb25zdCB1MzIgKnJ2ID0gY2hhbl9ydltjaGFubmVsLTFdOworCWludCByOwogCXN0cnVjdCB6ZF9jaGlwICpjaGlwID0gemRfcmZfdG9fY2hpcChyZik7CiAKLQlzdHJ1Y3QgemRfaW9yZXExNiBpb3JlcXNfMVtdID0geworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgemRfaW9yZXExNiBpb3JlcXNfMVtdID0geworCQl7IENSMjQwLCAweDU3IH0sIHsgQ1I5LCAgIDB4OSB9LAorCQl7IH0sCisJCXsgQ1IxMCwgIDB4OGIgfSwgeyBDUjE1LCAgMHgyMCB9LAorCQl7IENSMTcsICAweDJCIH0sIC8qIGZvciBuZXdlc3QgKDNyZCBjdXQpIEFMMjIzMCAqLworCQl7IENSMjAsICAweDEwIH0sIC8qIDROMjUtPlN0b25lIFJlcXVlc3QgKi8KKwkJeyBDUjIzLCAgMHg0MCB9LCB7IENSMjQsICAweDIwIH0sIHsgQ1IyNiwgIDB4OTMgfSwKKwkJeyBDUjI4LCAgMHgzZSB9LCB7IENSMjksICAweDAwIH0sCisJCXsgQ1IzMywgIDB4MjggfSwgLyogNTYxMyAqLworCQl7IENSMzQsICAweDMwIH0sCisJCXsgQ1IzNSwgIDB4M2UgfSwgLyogZm9yIG5ld2VzdCAoM3JkIGN1dCkgQUwyMjMwICovCisJCXsgQ1I0MSwgIDB4MjQgfSwgeyBDUjQ0LCAgMHgzMiB9LAorCQl7IENSNDYsICAweDk5IH0sIC8qIGZvciBuZXdlc3QgKDNyZCBjdXQpIEFMMjIzMCAqLworCQl7IENSNDcsICAweDFlIH0sCisKKwkJLyogWkQxMjE1IDU2MTAgKi8KKwkJeyBDUjQ4LCAgMHgwMCB9LCB7IENSNDksICAweDAwIH0sIHsgQ1I1MSwgIDB4MDEgfSwKKwkJeyBDUjUyLCAgMHg4MCB9LCB7IENSNTMsICAweDdlIH0sIHsgQ1I2NSwgIDB4MDAgfSwKKwkJeyBDUjY2LCAgMHgwMCB9LCB7IENSNjcsICAweDAwIH0sIHsgQ1I2OCwgIDB4MDAgfSwKKwkJeyBDUjY5LCAgMHgyOCB9LAorCisJCXsgQ1I3OSwgIDB4NTggfSwgeyBDUjgwLCAgMHgzMCB9LCB7IENSODEsICAweDMwIH0sCisJCXsgQ1I4NywgIDB4MEEgfSwgeyBDUjg5LCAgMHgwNCB9LAorCQl7IENSOTAsICAweDU4IH0sIC8qIDUxMTIgKi8KKwkJeyBDUjkxLCAgMHgwMCB9LCAvKiA1NjEzICovCisJCXsgQ1I5MiwgIDB4MGEgfSwKKwkJeyBDUjk4LCAgMHg4ZCB9LCAvKiA0ODA0LCBmb3IgMTIxMiBuZXcgYWxnb3JpdGhtICovCisJCXsgQ1I5OSwgIDB4MDAgfSwgeyBDUjEwMCwgMHgwMiB9LCB7IENSMTAxLCAweDEzIH0sCisJCXsgQ1IxMDIsIDB4MjcgfSwKKwkJeyBDUjEwNiwgMHgyMCB9LCAvKiBjaGFuZ2UgdG8gMHgyNCBmb3IgQUw3MjMwQiAqLworCQl7IENSMTA5LCAweDEzIH0sIC8qIDQ4MDQsIGZvciAxMjEyIG5ldyBhbGdvcml0aG0gKi8KKwkJeyBDUjExMiwgMHgxZiB9LAorCX07CisKKwlzdGF0aWMgY29uc3Qgc3RydWN0IHpkX2lvcmVxMTYgaW9yZXFzX25ld19waHlbXSA9IHsKKwkJeyBDUjEwNywgMHgyOCB9LAorCQl7IENSMTEwLCAweDFmIH0sIC8qIDUxMjcsIDB4MTMtPjB4MWYgKi8KKwkJeyBDUjExMSwgMHgxZiB9LCAvKiAweDEzIHRvIDB4MWYgZm9yIEFMNzIzMEIgKi8KKwkJeyBDUjExNiwgMHgyYSB9LCB7IENSMTE4LCAweGZhIH0sIHsgQ1IxMTksIDB4MTIgfSwKKwkJeyBDUjEyMSwgMHg2YyB9LCAvKiA1NjEzICovCisJfTsKKworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgemRfaW9yZXExNiBpb3JlcXNfb2xkX3BoeVtdID0geworCQl7IENSMTA3LCAweDI0IH0sCisJCXsgQ1IxMTAsIDB4MTMgfSwgLyogNTEyNywgMHgxMy0+MHgxZiAqLworCQl7IENSMTExLCAweDEzIH0sIC8qIDB4MTMgdG8gMHgxZiBmb3IgQUw3MjMwQiAqLworCQl7IENSMTE2LCAweDI0IH0sIHsgQ1IxMTgsIDB4ZmMgfSwgeyBDUjExOSwgMHgxMSB9LAorCQl7IENSMTIxLCAweDZhIH0sIC8qIDU2MTMgKi8KKwl9OworCisJc3RhdGljIGNvbnN0IHN0cnVjdCB6ZF9pb3JlcTE2IGlvcmVxc18yW10gPSB7CisJCXsgQ1IxMTMsIDB4MjcgfSwgeyBDUjExNCwgMHgyNyB9LCB7IENSMTE1LCAweDI0IH0sCisJCXsgQ1IxMTcsIDB4ZmEgfSwgeyBDUjEyMCwgMHg0ZiB9LAorCQl7IENSMTIyLCAweGZjIH0sIC8qIEUwLT5GQ2ggYXQgNDkwMSAqLworCQl7IENSMTIzLCAweDU3IH0sIC8qIDU2MTMgKi8KKwkJeyBDUjEyNSwgMHhhZCB9LCAvKiA0ODA0LCBmb3IgMTIxMiBuZXcgYWxnb3JpdGhtICovCisJCXsgQ1IxMjYsIDB4NmMgfSwgLyogNTYxMyAqLworCQl7IENSMTI3LCAweDAzIH0sIC8qIDQ4MDQsIGZvciAxMjEyIG5ldyBhbGdvcml0aG0gKi8KKwkJeyBDUjEzMCwgMHgxMCB9LAorCQl7IENSMTMxLCAweDAwIH0sIC8qIDUxMTIgKi8KKwkJeyBDUjEzNywgMHg1MCB9LCAvKiA1NjEzICovCisJCXsgQ1IxMzgsIDB4YTggfSwgLyogNTExMiAqLworCQl7IENSMTQ0LCAweGFjIH0sIC8qIDU2MTMgKi8KKwkJeyBDUjE0OCwgMHg0MCB9LCAvKiA1MTEyICovCisJCXsgQ1IxNDksIDB4NDAgfSwgLyogNE8wNywgNTAtPjQwICovCisJCXsgQ1IxNTAsIDB4MWEgfSwgLyogNTExMiwgMEMtPjFBICovCisJCXsgQ1IyNTIsIDB4MzQgfSwgeyBDUjI1MywgMHgzNCB9LAorCQl7IENSMjUxLCAweDJmIH0sIC8qIFBMTF9PRkYgKi8KKwl9OworCisJc3RhdGljIGNvbnN0IHN0cnVjdCB6ZF9pb3JlcTE2IGlvcmVxc18zW10gPSB7CisJCXsgQ1IyNTEsIDB4N2YgfSwgLyogUExMX09OICovCiAJCXsgQ1IxMjgsIDB4MTQgfSwgeyBDUjEyOSwgMHgxMiB9LCB7IENSMTMwLCAweDEwIH0sCiAJCXsgQ1IzOCwgIDB4MzggfSwgeyBDUjEzNiwgMHhkZiB9LAogCX07CiAKLQlzdHJ1Y3QgemRfaW9yZXExNiBpb3JlcXNfMltdID0geworCXIgPSB6ZF9pb3dyaXRlMTZhX2xvY2tlZChjaGlwLCBpb3JlcXNfMSwgQVJSQVlfU0laRShpb3JlcXNfMSkpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCWlmIChjaGlwLT5uZXdfcGh5X2xheW91dCkKKwkJciA9IHpkX2lvd3JpdGUxNmFfbG9ja2VkKGNoaXAsIGlvcmVxc19uZXdfcGh5LAorCQkJQVJSQVlfU0laRShpb3JlcXNfbmV3X3BoeSkpOworCWVsc2UKKwkJciA9IHpkX2lvd3JpdGUxNmFfbG9ja2VkKGNoaXAsIGlvcmVxc19vbGRfcGh5LAorCQkJQVJSQVlfU0laRShpb3JlcXNfb2xkX3BoeSkpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCXIgPSB6ZF9pb3dyaXRlMTZhX2xvY2tlZChjaGlwLCBpb3JlcXNfMiwgQVJSQVlfU0laRShpb3JlcXNfMikpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCXIgPSB6ZF9yZndyaXRldl9jcl9sb2NrZWQoY2hpcCwgY2hhbl9ydlswXSwgQVJSQVlfU0laRShjaGFuX3J2WzBdKSk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJciA9IHpkX3Jmd3JpdGV2X2NyX2xvY2tlZChjaGlwLCBzdGRfcnYsIEFSUkFZX1NJWkUoc3RkX3J2KSk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJciA9IHpkX3Jmd3JpdGV2X2NyX2xvY2tlZChjaGlwLCBydl9pbml0MSwgQVJSQVlfU0laRShydl9pbml0MSkpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCXIgPSB6ZF9pb3dyaXRlMTZhX2xvY2tlZChjaGlwLCBpb3JlcXNfMywgQVJSQVlfU0laRShpb3JlcXNfMykpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCXIgPSB6ZF9yZndyaXRldl9jcl9sb2NrZWQoY2hpcCwgcnZfaW5pdDIsIEFSUkFZX1NJWkUocnZfaW5pdDIpKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlyZXR1cm4gemQxMjExYl9hbDcyMzBiX2ZpbmFsaXplKGNoaXApOworfQorCitzdGF0aWMgaW50IHpkMTIxMV9hbDcyMzBiX3NldF9jaGFubmVsKHN0cnVjdCB6ZF9yZiAqcmYsIHU4IGNoYW5uZWwpCit7CisJaW50IHI7CisJY29uc3QgdTMyICpydiA9IGNoYW5fcnZbY2hhbm5lbC0xXTsKKwlzdHJ1Y3QgemRfY2hpcCAqY2hpcCA9IHpkX3JmX3RvX2NoaXAocmYpOworCisJc3RhdGljIGNvbnN0IHN0cnVjdCB6ZF9pb3JlcTE2IGlvcmVxc1tdID0gewogCQkvKiBQTExfT04gKi8KIAkJeyBDUjI1MSwgMHgzZiB9LAogCQl7IENSMjAzLCAweDA2IH0sIHsgQ1IyNDAsIDB4MDggfSwKQEAgLTIwMywxMSArMzQxLDkgQEAKIAlpZiAocikKIAkJcmV0dXJuIHI7CiAKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzdGRfcnYpOyBpKyspIHsKLQkJciA9IHpkX3Jmd3JpdGVfY3JfbG9ja2VkKGNoaXAsIHN0ZF9ydltpXSk7Ci0JCWlmIChyKQotCQkJcmV0dXJuIHI7Ci0JfQorCXIgPSB6ZF9yZndyaXRldl9jcl9sb2NrZWQoY2hpcCwgc3RkX3J2LCBBUlJBWV9TSVpFKHN0ZF9ydikpOworCWlmIChyKQorCQlyZXR1cm4gcjsKIAogCXIgPSB6ZF9yZndyaXRlX2NyX2xvY2tlZChjaGlwLCAweDNjOTAwMCk7CiAJaWYgKHIpCkBAIC0yMTYsMjQgKzM1Miw2OSBAQAogCWlmIChyKQogCQlyZXR1cm4gcjsKIAotCXIgPSB6ZF9pb3dyaXRlMTZhX2xvY2tlZChjaGlwLCBpb3JlcXNfMSwgQVJSQVlfU0laRShpb3JlcXNfMSkpOworCXIgPSB6ZF9pb3dyaXRlMTZhX2xvY2tlZChjaGlwLCBpb3JlcXNfc3csIEFSUkFZX1NJWkUoaW9yZXFzX3N3KSk7CiAJaWYgKHIpCiAJCXJldHVybiByOwogCi0JZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewotCQlyID0gemRfcmZ3cml0ZV9jcl9sb2NrZWQoY2hpcCwgcnZbaV0pOwotCQlpZiAocikKLQkJCXJldHVybiByOwotCX0KKwlyID0gemRfcmZ3cml0ZXZfY3JfbG9ja2VkKGNoaXAsIHJ2LCAyKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CiAKIAlyID0gemRfcmZ3cml0ZV9jcl9sb2NrZWQoY2hpcCwgMHgzYzkwMDApOwogCWlmIChyKQogCQlyZXR1cm4gcjsKIAotCXJldHVybiB6ZF9pb3dyaXRlMTZhX2xvY2tlZChjaGlwLCBpb3JlcXNfMiwgQVJSQVlfU0laRShpb3JlcXNfMikpOworCXJldHVybiB6ZF9pb3dyaXRlMTZhX2xvY2tlZChjaGlwLCBpb3JlcXMsIEFSUkFZX1NJWkUoaW9yZXFzKSk7CiB9CiAKLXN0YXRpYyBpbnQgYWw3MjMwYl9zd2l0Y2hfcmFkaW9fb24oc3RydWN0IHpkX3JmICpyZikKK3N0YXRpYyBpbnQgemQxMjExYl9hbDcyMzBiX3NldF9jaGFubmVsKHN0cnVjdCB6ZF9yZiAqcmYsIHU4IGNoYW5uZWwpCit7CisJaW50IHI7CisJY29uc3QgdTMyICpydiA9IGNoYW5fcnZbY2hhbm5lbC0xXTsKKwlzdHJ1Y3QgemRfY2hpcCAqY2hpcCA9IHpkX3JmX3RvX2NoaXAocmYpOworCisJciA9IHpkX2lvd3JpdGUxNl9sb2NrZWQoY2hpcCwgMHg1NywgQ1IyNDApOworCWlmIChyKQorCQlyZXR1cm4gcjsKKwlyID0gemRfaW93cml0ZTE2X2xvY2tlZChjaGlwLCAweGU0LCBDUjkpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCS8qIFBMTF9PRkYgKi8KKwlyID0gemRfaW93cml0ZTE2X2xvY2tlZChjaGlwLCAweDJmLCBDUjI1MSk7CisJaWYgKHIpCisJCXJldHVybiByOworCXIgPSB6ZF9yZndyaXRldl9jcl9sb2NrZWQoY2hpcCwgc3RkX3J2LCBBUlJBWV9TSVpFKHN0ZF9ydikpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCXIgPSB6ZF9yZndyaXRlX2NyX2xvY2tlZChjaGlwLCAweDNjOTAwMCk7CisJaWYgKHIpCisJCXJldHVybiByOworCXIgPSB6ZF9yZndyaXRlX2NyX2xvY2tlZChjaGlwLCAweGYxNWQ1OCk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJciA9IHpkX2lvd3JpdGUxNmFfbG9ja2VkKGNoaXAsIGlvcmVxc19zdywgQVJSQVlfU0laRShpb3JlcXNfc3cpKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlyID0gemRfcmZ3cml0ZXZfY3JfbG9ja2VkKGNoaXAsIHJ2LCAyKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlyID0gemRfcmZ3cml0ZV9jcl9sb2NrZWQoY2hpcCwgMHgzYzkwMDApOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCXIgPSB6ZF9pb3dyaXRlMTZfbG9ja2VkKGNoaXAsIDB4N2YsIENSMjUxKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlyZXR1cm4gemQxMjExYl9hbDcyMzBiX2ZpbmFsaXplKGNoaXApOworfQorCitzdGF0aWMgaW50IHpkMTIxMV9hbDcyMzBiX3N3aXRjaF9yYWRpb19vbihzdHJ1Y3QgemRfcmYgKnJmKQogewogCXN0cnVjdCB6ZF9jaGlwICpjaGlwID0gemRfcmZfdG9fY2hpcChyZik7CiAJc3RhdGljIGNvbnN0IHN0cnVjdCB6ZF9pb3JlcTE2IGlvcmVxc1tdID0gewpAQCAtMjQ0LDYgKzQyNSwxNyBAQAogCXJldHVybiB6ZF9pb3dyaXRlMTZhX2xvY2tlZChjaGlwLCBpb3JlcXMsIEFSUkFZX1NJWkUoaW9yZXFzKSk7CiB9CiAKK3N0YXRpYyBpbnQgemQxMjExYl9hbDcyMzBiX3N3aXRjaF9yYWRpb19vbihzdHJ1Y3QgemRfcmYgKnJmKQoreworCXN0cnVjdCB6ZF9jaGlwICpjaGlwID0gemRfcmZfdG9fY2hpcChyZik7CisJc3RhdGljIGNvbnN0IHN0cnVjdCB6ZF9pb3JlcTE2IGlvcmVxc1tdID0geworCQl7IENSMTEsICAweDAwIH0sCisJCXsgQ1IyNTEsIDB4N2YgfSwKKwl9OworCisJcmV0dXJuIHpkX2lvd3JpdGUxNmFfbG9ja2VkKGNoaXAsIGlvcmVxcywgQVJSQVlfU0laRShpb3JlcXMpKTsKK30KKwogc3RhdGljIGludCBhbDcyMzBiX3N3aXRjaF9yYWRpb19vZmYoc3RydWN0IHpkX3JmICpyZikKIHsKIAlzdHJ1Y3QgemRfY2hpcCAqY2hpcCA9IHpkX3JmX3RvX2NoaXAocmYpOwpAQCAtMjU1LDIwICs0NDcsNDUgQEAKIAlyZXR1cm4gemRfaW93cml0ZTE2YV9sb2NrZWQoY2hpcCwgaW9yZXFzLCBBUlJBWV9TSVpFKGlvcmVxcykpOwogfQogCisvKiBaRDEyMTFCK0FMNzIzMEIgNm0gYmFuZCBlZGdlIHBhdGNoaW5nIGRpZmZlcnMgc2xpZ2h0bHkgZnJvbSBvdGhlcgorICogY29uZmlndXJhdGlvbnMgKi8KK3N0YXRpYyBpbnQgemQxMjExYl9hbDcyMzBiX3BhdGNoXzZtKHN0cnVjdCB6ZF9yZiAqcmYsIHU4IGNoYW5uZWwpCit7CisJc3RydWN0IHpkX2NoaXAgKmNoaXAgPSB6ZF9yZl90b19jaGlwKHJmKTsKKwlzdHJ1Y3QgemRfaW9yZXExNiBpb3JlcXNbXSA9IHsKKwkJeyBDUjEyOCwgMHgxNCB9LCB7IENSMTI5LCAweDEyIH0sCisJfTsKKworCS8qIEZJWE1FOiBDaGFubmVsIDExIGlzIG5vdCB0aGUgZWRnZSBmb3IgYWxsIHJlZ3VsYXRvcnkgZG9tYWlucy4gKi8KKwlpZiAoY2hhbm5lbCA9PSAxKSB7CisJCWlvcmVxc1swXS52YWx1ZSA9IDB4MGU7CisJCWlvcmVxc1sxXS52YWx1ZSA9IDB4MTA7CisJfSBlbHNlIGlmIChjaGFubmVsID09IDExKSB7CisJCWlvcmVxc1swXS52YWx1ZSA9IDB4MTA7CisJCWlvcmVxc1sxXS52YWx1ZSA9IDB4MTA7CisJfQorCisJZGV2X2RiZ19mKHpkX2NoaXBfZGV2KGNoaXApLCAicGF0Y2hpbmcgZm9yIGNoYW5uZWwgJWRcbiIsIGNoYW5uZWwpOworCXJldHVybiB6ZF9pb3dyaXRlMTZhX2xvY2tlZChjaGlwLCBpb3JlcXMsIEFSUkFZX1NJWkUoaW9yZXFzKSk7Cit9CisKIGludCB6ZF9yZl9pbml0X2FsNzIzMGIoc3RydWN0IHpkX3JmICpyZikKIHsKIAlzdHJ1Y3QgemRfY2hpcCAqY2hpcCA9IHpkX3JmX3RvX2NoaXAocmYpOwogCiAJaWYgKGNoaXAtPmlzX3pkMTIxMWIpIHsKLQkJZGV2X2Vycih6ZF9jaGlwX2RldihjaGlwKSwgIkFMNzIzMEIgaXMgY3VycmVudGx5IG5vdCAiCi0JCQkic3VwcG9ydGVkIGZvciBaRDEyMTFCIGRldmljZXNcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKKwkJcmYtPmluaXRfaHcgPSB6ZDEyMTFiX2FsNzIzMGJfaW5pdF9odzsKKwkJcmYtPnN3aXRjaF9yYWRpb19vbiA9IHpkMTIxMWJfYWw3MjMwYl9zd2l0Y2hfcmFkaW9fb247CisJCXJmLT5zZXRfY2hhbm5lbCA9IHpkMTIxMWJfYWw3MjMwYl9zZXRfY2hhbm5lbDsKKwkJcmYtPnBhdGNoXzZtX2JhbmRfZWRnZSA9IHpkMTIxMWJfYWw3MjMwYl9wYXRjaF82bTsKKwl9IGVsc2UgeworCQlyZi0+aW5pdF9odyA9IHpkMTIxMV9hbDcyMzBiX2luaXRfaHc7CisJCXJmLT5zd2l0Y2hfcmFkaW9fb24gPSB6ZDEyMTFfYWw3MjMwYl9zd2l0Y2hfcmFkaW9fb247CisJCXJmLT5zZXRfY2hhbm5lbCA9IHpkMTIxMV9hbDcyMzBiX3NldF9jaGFubmVsOworCQlyZi0+cGF0Y2hfNm1fYmFuZF9lZGdlID0gemRfcmZfZ2VuZXJpY19wYXRjaF82bTsKIAl9CiAKLQlyZi0+aW5pdF9odyA9IGFsNzIzMGJfaW5pdF9odzsKLQlyZi0+c2V0X2NoYW5uZWwgPSBhbDcyMzBiX3NldF9jaGFubmVsOwotCXJmLT5zd2l0Y2hfcmFkaW9fb24gPSBhbDcyMzBiX3N3aXRjaF9yYWRpb19vbjsKIAlyZi0+c3dpdGNoX3JhZGlvX29mZiA9IGFsNzIzMGJfc3dpdGNoX3JhZGlvX29mZjsKLQlyZi0+cGF0Y2hfNm1fYmFuZF9lZGdlID0gMTsKKwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfcmZfcmYyOTU5LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9yZl9yZjI5NTkuYwppbmRleCA1ODI0NzI3Li4yZDczNmJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9yZl9yZjI5NTkuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9yZl9yZjI5NTkuYwpAQCAtMjEsNyArMjEsNyBAQAogI2luY2x1ZGUgInpkX3VzYi5oIgogI2luY2x1ZGUgInpkX2NoaXAuaCIKIAotc3RhdGljIHUzMiByZjI5NTlfdGFibGVbXVsyXSA9IHsKK3N0YXRpYyBjb25zdCB1MzIgcmYyOTU5X3RhYmxlW11bMl0gPSB7CiAJUkZfQ0hBTk5FTCggMSkgPSB7IDB4MTgxOTc5LCAweDFlNjY2NiB9LAogCVJGX0NIQU5ORUwoIDIpID0geyAweDE4MTk4OSwgMHgxZTY2NjYgfSwKIAlSRl9DSEFOTkVMKCAzKSA9IHsgMHgxODE5OTksIDB4MWU2NjY2IH0sCkBAIC0yMjgsNyArMjI4LDcgQEAKIHN0YXRpYyBpbnQgcmYyOTU5X3NldF9jaGFubmVsKHN0cnVjdCB6ZF9yZiAqcmYsIHU4IGNoYW5uZWwpCiB7CiAJaW50IGksIHI7Ci0JdTMyICpydiA9IHJmMjk1OV90YWJsZVtjaGFubmVsLTFdOworCWNvbnN0IHUzMiAqcnYgPSByZjI5NTlfdGFibGVbY2hhbm5lbC0xXTsKIAlzdHJ1Y3QgemRfY2hpcCAqY2hpcCA9IHpkX3JmX3RvX2NoaXAocmYpOwogCiAJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfdXNiLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF91c2IuYwppbmRleCBlZGFhYWQyLi5lMDRjZmZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF91c2IuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF91c2IuYwpAQCAtNTIsNiArNTIsNyBAQAogCXsgVVNCX0RFVklDRSgweDBiM2IsIDB4MTYzMCksIC5kcml2ZXJfaW5mbyA9IERFVklDRV9aRDEyMTEgfSwKIAl7IFVTQl9ERVZJQ0UoMHgwNTg2LCAweDM0MDEpLCAuZHJpdmVyX2luZm8gPSBERVZJQ0VfWkQxMjExIH0sCiAJeyBVU0JfREVWSUNFKDB4MTRlYSwgMHhhYjEzKSwgLmRyaXZlcl9pbmZvID0gREVWSUNFX1pEMTIxMSB9LAorCXsgVVNCX0RFVklDRSgweDEzYjEsIDB4MDAxZSksIC5kcml2ZXJfaW5mbyA9IERFVklDRV9aRDEyMTEgfSwKIAkvKiBaRDEyMTFCICovCiAJeyBVU0JfREVWSUNFKDB4MGFjZSwgMHgxMjE1KSwgLmRyaXZlcl9pbmZvID0gREVWSUNFX1pEMTIxMUIgfSwKIAl7IFVTQl9ERVZJQ0UoMHgxNTdlLCAweDMwMGQpLCAuZHJpdmVyX2luZm8gPSBERVZJQ0VfWkQxMjExQiB9LApAQCAtNjIsNyArNjMsMTAgQEAKIAl7IFVTQl9ERVZJQ0UoMHgwNDcxLCAweDEyMzYpLCAuZHJpdmVyX2luZm8gPSBERVZJQ0VfWkQxMjExQiB9LAogCXsgVVNCX0RFVklDRSgweDEzYjEsIDB4MDAyNCksIC5kcml2ZXJfaW5mbyA9IERFVklDRV9aRDEyMTFCIH0sCiAJeyBVU0JfREVWSUNFKDB4MDU4NiwgMHgzNDBmKSwgLmRyaXZlcl9pbmZvID0gREVWSUNFX1pEMTIxMUIgfSwKKwl7IFVTQl9ERVZJQ0UoMHgwYjA1LCAweDE3MWIpLCAuZHJpdmVyX2luZm8gPSBERVZJQ0VfWkQxMjExQiB9LAorCXsgVVNCX0RFVklDRSgweDA1ODYsIDB4MzQxMCksIC5kcml2ZXJfaW5mbyA9IERFVklDRV9aRDEyMTFCIH0sCiAJeyBVU0JfREVWSUNFKDB4MGJhZiwgMHgwMTIxKSwgLmRyaXZlcl9pbmZvID0gREVWSUNFX1pEMTIxMUIgfSwKKwl7IFVTQl9ERVZJQ0UoMHgwNTg2LCAweDM0MTIpLCAuZHJpdmVyX2luZm8gPSBERVZJQ0VfWkQxMjExQiB9LAogCS8qICJEcml2ZXJsZXNzIiBkZXZpY2VzIHRoYXQgbmVlZCBlamVjdGluZyAqLwogCXsgVVNCX0RFVklDRSgweDBhY2UsIDB4MjAxMSksIC5kcml2ZXJfaW5mbyA9IERFVklDRV9JTlNUQUxMRVIgfSwKIAl7fQpAQCAtNDEzLDcgKzQxNyw3IEBACiAKIAlkZXZfZGJnX2YoemRfdXNiX2Rldih1c2IpLCAiXG4iKTsKIAotCXVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX05PRlMpOworCXVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF1cmIpIHsKIAkJciA9IC1FTk9NRU07CiAJCWdvdG8gb3V0OwpAQCAtNDMxLDcgKzQzNSw3IEBACiAKIAkvKiBUT0RPOiBtYWtlIGl0IGEgRE1BIGJ1ZmZlciAqLwogCXIgPSAtRU5PTUVNOwotCXRyYW5zZmVyX2J1ZmZlciA9IGttYWxsb2MoVVNCX01BWF9FUF9JTlRfQlVGRkVSLCBHRlBfTk9GUyk7CisJdHJhbnNmZXJfYnVmZmVyID0ga21hbGxvYyhVU0JfTUFYX0VQX0lOVF9CVUZGRVIsIEdGUF9LRVJORUwpOwogCWlmICghdHJhbnNmZXJfYnVmZmVyKSB7CiAJCWRldl9kYmdfZih6ZF91c2JfZGV2KHVzYiksCiAJCQkiY291bGRuJ3QgYWxsb2NhdGUgdHJhbnNmZXJfYnVmZmVyXG4iKTsKQEAgLTQ0NSw3ICs0NDksNyBAQAogCQkJIGludHItPmludGVydmFsKTsKIAogCWRldl9kYmdfZih6ZF91c2JfZGV2KHVzYiksICJzdWJtaXQgdXJiICVwXG4iLCBpbnRyLT51cmIpOwotCXIgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9OT0ZTKTsKKwlyID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfS0VSTkVMKTsKIAlpZiAocikgewogCQlkZXZfZGJnX2YoemRfdXNiX2Rldih1c2IpLAogCQkJICJDb3VsZG4ndCBzdWJtaXQgdXJiLiBFcnJvciBudW1iZXIgJWRcbiIsIHIpOwpAQCAtNTk0LDEwICs1OTgsMTAgQEAKIAlzdHJ1Y3QgdXJiICp1cmI7CiAJdm9pZCAqYnVmZmVyOwogCi0JdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfTk9GUyk7CisJdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXVyYikKIAkJcmV0dXJuIE5VTEw7Ci0JYnVmZmVyID0gdXNiX2J1ZmZlcl9hbGxvYyh1ZGV2LCBVU0JfTUFYX1JYX1NJWkUsIEdGUF9OT0ZTLAorCWJ1ZmZlciA9IHVzYl9idWZmZXJfYWxsb2ModWRldiwgVVNCX01BWF9SWF9TSVpFLCBHRlBfS0VSTkVMLAogCQkgICAgICAgICAgICAgICAgICAmdXJiLT50cmFuc2Zlcl9kbWEpOwogCWlmICghYnVmZmVyKSB7CiAJCXVzYl9mcmVlX3VyYih1cmIpOwpAQCAtNjMwLDcgKzYzNCw3IEBACiAJZGV2X2RiZ19mKHpkX3VzYl9kZXYodXNiKSwgIlxuIik7CiAKIAlyID0gLUVOT01FTTsKLQl1cmJzID0ga2NhbGxvYyhVUkJTX0NPVU5ULCBzaXplb2Yoc3RydWN0IHVyYiAqKSwgR0ZQX05PRlMpOworCXVyYnMgPSBrY2FsbG9jKFVSQlNfQ09VTlQsIHNpemVvZihzdHJ1Y3QgdXJiICopLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXVyYnMpCiAJCWdvdG8gZXJyb3I7CiAJZm9yIChpID0gMDsgaSA8IFVSQlNfQ09VTlQ7IGkrKykgewpAQCAtNjUxLDcgKzY1NSw3IEBACiAJc3Bpbl91bmxvY2tfaXJxKCZyeC0+bG9jayk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgVVJCU19DT1VOVDsgaSsrKSB7Ci0JCXIgPSB1c2Jfc3VibWl0X3VyYih1cmJzW2ldLCBHRlBfTk9GUyk7CisJCXIgPSB1c2Jfc3VibWl0X3VyYih1cmJzW2ldLCBHRlBfS0VSTkVMKTsKIAkJaWYgKHIpCiAJCQlnb3RvIGVycm9yX3N1Ym1pdDsKIAl9CkBAIC0xMTU3LDcgKzExNjEsNyBAQAogCX0KIAogCXJlcV9sZW4gPSBzaXplb2Yoc3RydWN0IHVzYl9yZXFfcmVhZF9yZWdzKSArIGNvdW50ICogc2l6ZW9mKF9fbGUxNik7Ci0JcmVxID0ga21hbGxvYyhyZXFfbGVuLCBHRlBfTk9GUyk7CisJcmVxID0ga21hbGxvYyhyZXFfbGVuLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXJlcSkKIAkJcmV0dXJuIC1FTk9NRU07CiAJcmVxLT5pZCA9IGNwdV90b19sZTE2KFVTQl9SRVFfUkVBRF9SRUdTKTsKQEAgLTEyMjAsNyArMTIyNCw3IEBACiAKIAlyZXFfbGVuID0gc2l6ZW9mKHN0cnVjdCB1c2JfcmVxX3dyaXRlX3JlZ3MpICsKIAkJICBjb3VudCAqIHNpemVvZihzdHJ1Y3QgcmVnX2RhdGEpOwotCXJlcSA9IGttYWxsb2MocmVxX2xlbiwgR0ZQX05PRlMpOworCXJlcSA9IGttYWxsb2MocmVxX2xlbiwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFyZXEpCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC0xMzAwLDcgKzEzMDQsNyBAQAogCWJpdF92YWx1ZV90ZW1wbGF0ZSAmPSB+KFJGX0lGX0xFfFJGX0NMS3xSRl9EQVRBKTsKIAogCXJlcV9sZW4gPSBzaXplb2Yoc3RydWN0IHVzYl9yZXFfcmZ3cml0ZSkgKyBiaXRzICogc2l6ZW9mKF9fbGUxNik7Ci0JcmVxID0ga21hbGxvYyhyZXFfbGVuLCBHRlBfTk9GUyk7CisJcmVxID0ga21hbGxvYyhyZXFfbGVuLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXJlcSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3llbGxvd2Zpbi5jIGIvZHJpdmVycy9uZXQveWVsbG93ZmluLmMKaW5kZXggMjQxMmNlNC4uM2Y0YTdjZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQveWVsbG93ZmluLmMKKysrIGIvZHJpdmVycy9uZXQveWVsbG93ZmluLmMKQEAgLTExMzcsNyArMTEzNyw2IEBACiAJCQkJc2tiID0gZGV2X2FsbG9jX3NrYihwa3RfbGVuICsgMik7CiAJCQkJaWYgKHNrYiA9PSBOVUxMKQogCQkJCQlicmVhazsKLQkJCQlza2ItPmRldiA9IGRldjsKIAkJCQlza2JfcmVzZXJ2ZShza2IsIDIpOwkvKiAxNiBieXRlIGFsaWduIHRoZSBJUCBoZWFkZXIgKi8KIAkJCQlldGhfY29weV9hbmRfc3VtKHNrYiwgcnhfc2tiLT5kYXRhLCBwa3RfbGVuLCAwKTsKIAkJCQlza2JfcHV0KHNrYiwgcGt0X2xlbik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC96bmV0LmMgYi9kcml2ZXJzL25ldC96bmV0LmMKaW5kZXggYjI0YjA3Mi4uNDAzMmU5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvem5ldC5jCisrKyBiL2RyaXZlcnMvbmV0L3puZXQuYwpAQCAtNzc0LDcgKzc3NCw2IEBACiAJCQkJem5ldC0+c3RhdHMucnhfZHJvcHBlZCsrOwogCQkJCWJyZWFrOwogCQkJfQotCQkJc2tiLT5kZXYgPSBkZXY7CiAKIAkJCWlmICgmem5ldC0+cnhfY3VyWyhwa3RfbGVuKzEpPj4xXSA+IHpuZXQtPnJ4X2VuZCkgewogCQkJCWludCBzZW1pX2NudCA9ICh6bmV0LT5yeF9lbmQgLSB6bmV0LT5yeF9jdXIpPDwxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wYXJpc2MvbGVkLmMgYi9kcml2ZXJzL3BhcmlzYy9sZWQuYwppbmRleCBkMTkwYzA1Li4zZGY4MmZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BhcmlzYy9sZWQuYworKysgYi9kcml2ZXJzL3BhcmlzYy9sZWQuYwpAQCAtMzcyLDggKzM3Miw2IEBACiAJCWNvbnRpbnVlOwogCSAgICBpZiAoTE9PUEJBQ0soaW5fZGV2LT5pZmFfbGlzdC0+aWZhX2xvY2FsKSkKIAkJY29udGludWU7Ci0JICAgIGlmICghZGV2LT5nZXRfc3RhdHMpIAotCQljb250aW51ZTsKIAkgICAgc3RhdHMgPSBkZXYtPmdldF9zdGF0cyhkZXYpOwogCSAgICByeF90b3RhbCArPSBzdGF0cy0+cnhfcGFja2V0czsKIAkgICAgdHhfdG90YWwgKz0gc3RhdHMtPnR4X3BhY2tldHM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2ktYWNwaS5jIGIvZHJpdmVycy9wY2kvcGNpLWFjcGkuYwppbmRleCBhMDY0ZjM2Li5iNWFjODEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2ktYWNwaS5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaS1hY3BpLmMKQEAgLTMxNyw2ICszMTcsMTAgQEAKIHsKIAlpbnQgcmV0OwogCisJaWYgKGFjcGlfZ2JsX0ZBRFQuYm9vdF9mbGFncyAmIEJBRl9NU0lfTk9UX1NVUFBPUlRFRCkgeworCQlwcmludGsoS0VSTl9JTkZPIkFDUEkgRkFEVCBkZWNsYXJlcyB0aGUgc3lzdGVtIGRvZXNuJ3Qgc3VwcG9ydCBNU0ksIHNvIGRpc2FibGUgaXRcbiIpOworCQlwY2lfbm9fbXNpKCk7CisJfQogCXJldCA9IHJlZ2lzdGVyX2FjcGlfYnVzX3R5cGUoJmFjcGlfcGNpX2J1cyk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2ktZHJpdmVyLmMgYi9kcml2ZXJzL3BjaS9wY2ktZHJpdmVyLmMKaW5kZXggYTNjMTc1NS4uMzllODBmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcGNpLWRyaXZlci5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaS1kcml2ZXIuYwpAQCAtNDM0LDExICs0MzQsNiBAQAogCWRydi0+ZHJpdmVyLm1vZF9uYW1lID0gbW9kX25hbWU7CiAJZHJ2LT5kcml2ZXIua29iai5rdHlwZSA9ICZwY2lfZHJpdmVyX2tvYmpfdHlwZTsKIAotCWlmIChwY2lfbXVsdGl0aHJlYWRfcHJvYmUpCi0JCWRydi0+ZHJpdmVyLm11bHRpdGhyZWFkX3Byb2JlID0gcGNpX211bHRpdGhyZWFkX3Byb2JlOwotCWVsc2UKLQkJZHJ2LT5kcml2ZXIubXVsdGl0aHJlYWRfcHJvYmUgPSBkcnYtPm11bHRpdGhyZWFkX3Byb2JlOwotCiAJc3Bpbl9sb2NrX2luaXQoJmRydi0+ZHluaWRzLmxvY2spOwogCUlOSVRfTElTVF9IRUFEKCZkcnYtPmR5bmlkcy5saXN0KTsKIApAQCAtNTc0LDYgKzU2OSw3IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IHBjaV9kcml2ZXJfaW5pdCh2b2lkKQogeworCXBjaV9idXNfdHlwZS5tdWx0aXRocmVhZF9wcm9iZSA9IHBjaV9tdWx0aXRocmVhZF9wcm9iZTsKIAlyZXR1cm4gYnVzX3JlZ2lzdGVyKCZwY2lfYnVzX3R5cGUpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2kuYyBiL2RyaXZlcnMvcGNpL3BjaS5jCmluZGV4IGQzZWFiMDUuLjJhNDU4MjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaS5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaS5jCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvcG0uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgpAQCAtODkxLDMxICs4OTIsNDggQEAKIH0KIAogLyoqCi0gKiBwY2lfZW5hYmxlX3dha2UgLSBlbmFibGUgZGV2aWNlIHRvIGdlbmVyYXRlIFBNRSMgd2hlbiBzdXNwZW5kZWQKLSAqIEBkZXY6IC0gUENJIGRldmljZSB0byBvcGVyYXRlIG9uCi0gKiBAc3RhdGU6IC0gQ3VycmVudCBzdGF0ZSBvZiBkZXZpY2UuCi0gKiBAZW5hYmxlOiAtIEZsYWcgdG8gZW5hYmxlIG9yIGRpc2FibGUgZ2VuZXJhdGlvbgotICogCi0gKiBTZXQgdGhlIGJpdHMgaW4gdGhlIGRldmljZSdzIFBNIENhcGFiaWxpdGllcyB0byBnZW5lcmF0ZSBQTUUjIHdoZW4KLSAqIHRoZSBzeXN0ZW0gaXMgc3VzcGVuZGVkLiAKKyAqIHBjaV9lbmFibGVfd2FrZSAtIGVuYWJsZSBQQ0kgZGV2aWNlIGFzIHdha2V1cCBldmVudCBzb3VyY2UKKyAqIEBkZXY6IFBDSSBkZXZpY2UgYWZmZWN0ZWQKKyAqIEBzdGF0ZTogUENJIHN0YXRlIGZyb20gd2hpY2ggZGV2aWNlIHdpbGwgaXNzdWUgd2FrZXVwIGV2ZW50cworICogQGVuYWJsZTogVHJ1ZSB0byBlbmFibGUgZXZlbnQgZ2VuZXJhdGlvbjsgZmFsc2UgdG8gZGlzYWJsZQogICoKLSAqIC1FSU8gaXMgcmV0dXJuZWQgaWYgZGV2aWNlIGRvZXNuJ3QgaGF2ZSBQTSBDYXBhYmlsaXRpZXMuIAotICogLUVJTlZBTCBpcyByZXR1cm5lZCBpZiBkZXZpY2Ugc3VwcG9ydHMgaXQsIGJ1dCBjYW4ndCBnZW5lcmF0ZSB3YWtlIGV2ZW50cy4KLSAqIDAgaWYgb3BlcmF0aW9uIGlzIHN1Y2Nlc3NmdWwuCi0gKiAKKyAqIFRoaXMgZW5hYmxlcyB0aGUgZGV2aWNlIGFzIGEgd2FrZXVwIGV2ZW50IHNvdXJjZSwgb3IgZGlzYWJsZXMgaXQuCisgKiBXaGVuIHN1Y2ggZXZlbnRzIGludm9sdmVzIHBsYXRmb3JtLXNwZWNpZmljIGhvb2tzLCB0aG9zZSBob29rcyBhcmUKKyAqIGNhbGxlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoaXMgcm91dGluZS4KKyAqCisgKiBEZXZpY2VzIHdpdGggbGVnYWN5IHBvd2VyIG1hbmFnZW1lbnQgKG5vIHN0YW5kYXJkIFBDSSBQTSBjYXBhYmlsaXRpZXMpCisgKiBhbHdheXMgcmVxdWlyZSBzdWNoIHBsYXRmb3JtIGhvb2tzLiAgRGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybSwgZGV2aWNlcworICogc3VwcG9ydGluZyB0aGUgc3RhbmRhcmQgUENJIFBNRSMgc2lnbmFsIG1heSByZXF1aXJlIHN1Y2ggcGxhdGZvcm0gaG9va3M7CisgKiB0aGV5IGFsd2F5cyB1cGRhdGUgYml0cyBpbiBjb25maWcgc3BhY2UgdG8gYWxsb3cgUE1FIyBnZW5lcmF0aW9uLgorICoKKyAqIC1FSU8gaXMgcmV0dXJuZWQgaWYgdGhlIGRldmljZSBjYW4ndCBldmVyIGJlIGEgd2FrZXVwIGV2ZW50IHNvdXJjZS4KKyAqIC1FSU5WQUwgaXMgcmV0dXJuZWQgaWYgdGhlIGRldmljZSBjYW4ndCBnZW5lcmF0ZSB3YWtldXAgZXZlbnRzIGZyb20KKyAqIHRoZSBzcGVjaWZpZWQgUENJIHN0YXRlLiAgUmV0dXJucyB6ZXJvIGlmIHRoZSBvcGVyYXRpb24gaXMgc3VjY2Vzc2Z1bC4KICAqLwogaW50IHBjaV9lbmFibGVfd2FrZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBwY2lfcG93ZXJfdCBzdGF0ZSwgaW50IGVuYWJsZSkKIHsKIAlpbnQgcG07CisJaW50IHN0YXR1czsKIAl1MTYgdmFsdWU7CiAKKwkvKiBOb3RlIHRoYXQgZHJpdmVycyBzaG91bGQgdmVyaWZ5IGRldmljZV9tYXlfd2FrZXVwKCZkZXYtPmRldikKKwkgKiBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLiAgUGxhdGZvcm0gY29kZSBzaG91bGQgcmVwb3J0CisJICogZXJyb3JzIHdoZW4gZHJpdmVycyB0cnkgdG8gZW5hYmxlIHdha2V1cCBvbiBkZXZpY2VzIHRoYXQKKwkgKiBjYW4ndCBpc3N1ZSB3YWtldXBzLCBvciBvbiB3aGljaCB3YWtldXBzIHdlcmUgZGlzYWJsZWQgYnkKKwkgKiB1c2Vyc3BhY2UgdXBkYXRpbmcgdGhlIC9zeXMvZGV2aWNlcy4uLi9wb3dlci93YWtldXAgZmlsZS4KKwkgKi8KKworCXN0YXR1cyA9IGNhbGxfcGxhdGZvcm1fZW5hYmxlX3dha2V1cCgmZGV2LT5kZXYsIGVuYWJsZSk7CisKIAkvKiBmaW5kIFBDSSBQTSBjYXBhYmlsaXR5IGluIGxpc3QgKi8KIAlwbSA9IHBjaV9maW5kX2NhcGFiaWxpdHkoZGV2LCBQQ0lfQ0FQX0lEX1BNKTsKIAotCS8qIElmIGRldmljZSBkb2Vzbid0IHN1cHBvcnQgUE0gQ2FwYWJpbGl0aWVzLCBidXQgcmVxdWVzdCBpcyB0byBkaXNhYmxlCi0JICogd2FrZSBldmVudHMsIGl0J3MgYSBub3A7IG90aGVyd2lzZSBmYWlsICovCi0JaWYgKCFwbSkgCi0JCXJldHVybiBlbmFibGUgPyAtRUlPIDogMDsgCisJLyogSWYgZGV2aWNlIGRvZXNuJ3Qgc3VwcG9ydCBQTSBDYXBhYmlsaXRpZXMsIGJ1dCBjYWxsZXIgd2FudHMgdG8KKwkgKiBkaXNhYmxlIHdha2UgZXZlbnRzLCBpdCdzIGEgTk9QLiAgT3RoZXJ3aXNlIGZhaWwgdW5sZXNzIHRoZQorCSAqIHBsYXRmb3JtIGhvb2tzIGhhbmRsZWQgdGhpcyBsZWdhY3kgZGV2aWNlIGFscmVhZHkuCisJICovCisJaWYgKCFwbSkKKwkJcmV0dXJuIGVuYWJsZSA/IHN0YXR1cyA6IDA7CiAKIAkvKiBDaGVjayBkZXZpY2UncyBhYmlsaXR5IHRvIGdlbmVyYXRlIFBNRSMgKi8KIAlwY2lfcmVhZF9jb25maWdfd29yZChkZXYscG0rUENJX1BNX1BNQywmdmFsdWUpOwpAQCAtOTI0LDggKzk0MiwxNCBAQAogCXZhbHVlID4+PSBmZnMoUENJX1BNX0NBUF9QTUVfTUFTSykgLSAxOyAgIC8qIEZpcnN0IGJpdCBvZiBtYXNrICovCiAKIAkvKiBDaGVjayBpZiBpdCBjYW4gZ2VuZXJhdGUgUE1FIyBmcm9tIHJlcXVlc3RlZCBzdGF0ZS4gKi8KLQlpZiAoIXZhbHVlIHx8ICEodmFsdWUgJiAoMSA8PCBzdGF0ZSkpKSAKKwlpZiAoIXZhbHVlIHx8ICEodmFsdWUgJiAoMSA8PCBzdGF0ZSkpKSB7CisJCS8qIGlmIGl0IGNhbid0LCByZXZlcnQgd2hhdCB0aGUgcGxhdGZvcm0gaG9vayBjaGFuZ2VkLAorCQkgKiBhbHdheXMgcmVwb3J0aW5nIHRoZSBiYXNlICJFSU5WQUwsIGNhbid0IFBNRSMiIGVycm9yCisJCSAqLworCQlpZiAoZW5hYmxlKQorCQkJY2FsbF9wbGF0Zm9ybV9lbmFibGVfd2FrZXVwKCZkZXYtPmRldiwgMCk7CiAJCXJldHVybiBlbmFibGUgPyAtRUlOVkFMIDogMDsKKwl9CiAKIAlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIHBtICsgUENJX1BNX0NUUkwsICZ2YWx1ZSk7CiAKQEAgLTkzNiw3ICs5NjAsNyBAQAogCQl2YWx1ZSAmPSB+UENJX1BNX0NUUkxfUE1FX0VOQUJMRTsKIAogCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIHBtICsgUENJX1BNX0NUUkwsIHZhbHVlKTsKLQkKKwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9xdWlya3MuYyBiL2RyaXZlcnMvcGNpL3F1aXJrcy5jCmluZGV4IDY1ZDZmMjMuLjM0MTE0ODMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3F1aXJrcy5jCisrKyBiL2RyaXZlcnMvcGNpL3F1aXJrcy5jCkBAIC0xMzAzLDExOSArMTMwMyw2IEBACiBERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9JTlRFTCwJUENJX0RFVklDRV9JRF9JTlRFTF9FRVNTQywJcXVpcmtfYWxkZXJfaW9hcGljICk7CiAjZW5kaWYKIAotZW51bSBpZGVfY29tYmluZWRfdHlwZSB7IENPTUJJTkVEID0gMCwgSURFID0gMSwgTElCQVRBID0gMiB9OwotLyogRGVmYXVsdHMgdG8gY29tYmluZWQgKi8KLXN0YXRpYyBlbnVtIGlkZV9jb21iaW5lZF90eXBlIGNvbWJpbmVkX21vZGU7Ci0KLXN0YXRpYyBpbnQgX19pbml0IGNvbWJpbmVkX3NldHVwKGNoYXIgKnN0cikKLXsKLQlpZiAoIXN0cm5jbXAoc3RyLCAiaWRlIiwgMykpCi0JCWNvbWJpbmVkX21vZGUgPSBJREU7Ci0JZWxzZSBpZiAoIXN0cm5jbXAoc3RyLCAibGliYXRhIiwgNikpCi0JCWNvbWJpbmVkX21vZGUgPSBMSUJBVEE7Ci0JZWxzZSAvKiAiY29tYmluZWQiIG9yIGFueXRoaW5nIGVsc2UgZGVmYXVsdHMgdG8gb2xkIGJlaGF2aW9yICovCi0JCWNvbWJpbmVkX21vZGUgPSBDT01CSU5FRDsKLQotCXJldHVybiAxOwotfQotX19zZXR1cCgiY29tYmluZWRfbW9kZT0iLCBjb21iaW5lZF9zZXR1cCk7Ci0KLSNpZmRlZiBDT05GSUdfU0FUQV9JTlRFTF9DT01CSU5FRAotc3RhdGljIHZvaWQgX19kZXZpbml0IHF1aXJrX2ludGVsX2lkZV9jb21iaW5lZChzdHJ1Y3QgcGNpX2RldiAqcGRldikKLXsKLQl1OCBwcm9nLCBjb21iLCB0bXA7Ci0JaW50IGljaCA9IDA7Ci0KLQkvKgotCSAqIE5hcnJvdyBkb3duIHRvIEludGVsIFNBVEEgUENJIGRldmljZXMuCi0JICovCi0Jc3dpdGNoIChwZGV2LT5kZXZpY2UpIHsKLQkvKiBQQ0kgaWRzIHRha2VuIGZyb20gZHJpdmVycy9zY3NpL2F0YV9waWl4LmMgKi8KLQljYXNlIDB4MjRkMToKLQljYXNlIDB4MjRkZjoKLQljYXNlIDB4MjVhMzoKLQljYXNlIDB4MjViMDoKLQkJaWNoID0gNTsKLQkJYnJlYWs7Ci0JY2FzZSAweDI2NTE6Ci0JY2FzZSAweDI2NTI6Ci0JY2FzZSAweDI2NTM6Ci0JY2FzZSAweDI2ODA6CS8qIEVTQjIgKi8KLQkJaWNoID0gNjsKLQkJYnJlYWs7Ci0JY2FzZSAweDI3YzA6Ci0JY2FzZSAweDI3YzQ6Ci0JCWljaCA9IDc7Ci0JCWJyZWFrOwotCWNhc2UgMHgyODI4OgkvKiBJQ0g4TSAqLwotCQlpY2ggPSA4OwotCQlicmVhazsKLQlkZWZhdWx0OgotCQkvKiB3ZSBkbyBub3QgaGFuZGxlIHRoaXMgUENJIGRldmljZSAqLwotCQlyZXR1cm47Ci0JfQotCi0JLyoKLQkgKiBSZWFkIGNvbWJpbmVkIG1vZGUgcmVnaXN0ZXIuCi0JICovCi0JcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgMHg5MCwgJnRtcCk7CS8qIGNvbWJpbmVkIG1vZGUgcmVnICovCi0KLQlpZiAoaWNoID09IDUpIHsKLQkJdG1wICY9IDB4NjsgIC8qIGludGVyZXN0aW5nIGJpdHMgMjoxLCBQQVRBIHByaW1hcnkvc2Vjb25kYXJ5ICovCi0JCWlmICh0bXAgPT0gMHg0KQkJLyogYml0cyAxMHggKi8KLQkJCWNvbWIgPSAoMSA8PCAwKTsJLyogU0FUQSBwb3J0IDAsIFBBVEEgcG9ydCAxICovCi0JCWVsc2UgaWYgKHRtcCA9PSAweDYpCS8qIGJpdHMgMTF4ICovCi0JCQljb21iID0gKDEgPDwgMik7CS8qIFBBVEEgcG9ydCAwLCBTQVRBIHBvcnQgMSAqLwotCQllbHNlCi0JCQlyZXR1cm47CQkJLyogbm90IGluIGNvbWJpbmVkIG1vZGUgKi8KLQl9IGVsc2UgewotCQlXQVJOX09OKChpY2ggIT0gNikgJiYgKGljaCAhPSA3KSAmJiAoaWNoICE9IDgpKTsKLQkJdG1wICY9IDB4MzsgIC8qIGludGVyZXN0aW5nIGJpdHMgMTowICovCi0JCWlmICh0bXAgJiAoMSA8PCAwKSkKLQkJCWNvbWIgPSAoMSA8PCAyKTsJLyogUEFUQSBwb3J0IDAsIFNBVEEgcG9ydCAxICovCi0JCWVsc2UgaWYgKHRtcCAmICgxIDw8IDEpKQotCQkJY29tYiA9ICgxIDw8IDApOwkvKiBTQVRBIHBvcnQgMCwgUEFUQSBwb3J0IDEgKi8KLQkJZWxzZQotCQkJcmV0dXJuOwkJCS8qIG5vdCBpbiBjb21iaW5lZCBtb2RlICovCi0JfQotCi0JLyoKLQkgKiBSZWFkIHByb2dyYW1taW5nIGludGVyZmFjZSByZWdpc3Rlci4KLQkgKiAoVGVsbHMgdXMgaWYgaXQncyBsZWdhY3kgb3IgbmF0aXZlIG1vZGUpCi0JICovCi0JcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgUENJX0NMQVNTX1BST0csICZwcm9nKTsKLQotCS8qIGlmIFNBVEEgcG9ydCBpcyBpbiBuYXRpdmUgbW9kZSwgd2UncmUgb2suICovCi0JaWYgKHByb2cgJiBjb21iKQotCQlyZXR1cm47Ci0KLQkvKiBEb24ndCByZXNlcnZlIGFueSBzbyB0aGUgSURFIGRyaXZlciBjYW4gZ2V0IHRoZW0gKGJ1dCBvbmx5IGlmCi0JICogY29tYmluZWRfbW9kZT1pZGUpLgotCSAqLwotCWlmIChjb21iaW5lZF9tb2RlID09IElERSkKLQkJcmV0dXJuOwotCi0JLyogR3JhYiB0aGVtIGJvdGggZm9yIGxpYmF0YSBpZiBjb21iaW5lZF9tb2RlPWxpYmF0YS4gKi8KLQlpZiAoY29tYmluZWRfbW9kZSA9PSBMSUJBVEEpIHsKLQkJcmVxdWVzdF9yZWdpb24oMHgxZjAsIDgsICJsaWJhdGEiKTsJLyogcG9ydCAwICovCi0JCXJlcXVlc3RfcmVnaW9uKDB4MTcwLCA4LCAibGliYXRhIik7CS8qIHBvcnQgMSAqLwotCQlyZXR1cm47Ci0JfQotCi0JLyogU0FUQSBwb3J0IGlzIGluIGxlZ2FjeSBtb2RlLiAgUmVzZXJ2ZSBwb3J0IHNvIHRoYXQKLQkgKiBJREUgZHJpdmVyIGRvZXMgbm90IGF0dGVtcHQgdG8gdXNlIGl0LiAgSWYgcmVxdWVzdF9yZWdpb24KLQkgKiBmYWlscywgaXQgd2lsbCBiZSBvYnZpb3VzIGF0IGJvb3QgdGltZSwgc28gd2UgZG9uJ3QgYm90aGVyCi0JICogY2hlY2tpbmcgcmV0dXJuIHZhbHVlcy4KLQkgKi8KLQlpZiAoY29tYiA9PSAoMSA8PCAwKSkKLQkJcmVxdWVzdF9yZWdpb24oMHgxZjAsIDgsICJsaWJhdGEiKTsJLyogcG9ydCAwICovCi0JZWxzZQotCQlyZXF1ZXN0X3JlZ2lvbigweDE3MCwgOCwgImxpYmF0YSIpOwkvKiBwb3J0IDEgKi8KLX0KLURFQ0xBUkVfUENJX0ZJWFVQX0ZJTkFMKFBDSV9WRU5ET1JfSURfSU5URUwsICAgIFBDSV9BTllfSUQsCSAgcXVpcmtfaW50ZWxfaWRlX2NvbWJpbmVkICk7Ci0jZW5kaWYgLyogQ09ORklHX1NBVEFfSU5URUxfQ09NQklORUQgKi8KLQotCiBpbnQgcGNpZV9tY2hfcXVpcms7CiBFWFBPUlRfU1lNQk9MKHBjaWVfbWNoX3F1aXJrKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbnAvY2FyZC5jIGIvZHJpdmVycy9wbnAvY2FyZC5jCmluZGV4IDkxYzA0N2EuLmRkNjM4NGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG5wL2NhcmQuYworKysgYi9kcml2ZXJzL3BucC9jYXJkLmMKQEAgLTMxMSw3ICszMTEsNiBAQAogCXJldHVybiBOVUxMOwogCiBmb3VuZDoKLQlkb3duX3dyaXRlKCZkZXYtPmRldi5idXMtPnN1YnN5cy5yd3NlbSk7CiAJZGV2LT5jYXJkX2xpbmsgPSBjbGluazsKIAlkZXYtPmRldi5kcml2ZXIgPSAmZHJ2LT5saW5rLmRyaXZlcjsKIAlpZiAocG5wX2J1c190eXBlLnByb2JlKCZkZXYtPmRldikpCkBAIC0zMTksMTQgKzMxOCwxMSBAQAogCWlmIChkZXZpY2VfYmluZF9kcml2ZXIoJmRldi0+ZGV2KSkKIAkJZ290byBlcnJfb3V0OwogCi0JdXBfd3JpdGUoJmRldi0+ZGV2LmJ1cy0+c3Vic3lzLnJ3c2VtKTsKLQogCXJldHVybiBkZXY7CiAKIGVycl9vdXQ6CiAJZGV2LT5kZXYuZHJpdmVyID0gTlVMTDsKIAlkZXYtPmNhcmRfbGluayA9IE5VTEw7Ci0JdXBfd3JpdGUoJmRldi0+ZGV2LmJ1cy0+c3Vic3lzLnJ3c2VtKTsKIAlyZXR1cm4gTlVMTDsKIH0KIApAQCAtMzQwLDExICszMzYsOSBAQAogCXN0cnVjdCBwbnBfY2FyZF9kcml2ZXIgKiBkcnYgPSBkZXYtPmNhcmRfbGluay0+ZHJpdmVyOwogCWlmICghZHJ2KQogCQlyZXR1cm47Ci0JZG93bl93cml0ZSgmZGV2LT5kZXYuYnVzLT5zdWJzeXMucndzZW0pOwogCWRydi0+bGluay5yZW1vdmUgPSAmY2FyZF9yZW1vdmU7CiAJZGV2aWNlX3JlbGVhc2VfZHJpdmVyKCZkZXYtPmRldik7CiAJZHJ2LT5saW5rLnJlbW92ZSA9ICZjYXJkX3JlbW92ZV9maXJzdDsKLQl1cF93cml0ZSgmZGV2LT5kZXYuYnVzLT5zdWJzeXMucndzZW0pOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wczMvdnVhcnQuYyBiL2RyaXZlcnMvcHMzL3Z1YXJ0LmMKaW5kZXggNmMxMjc0NC4uN2Q3Y2FiMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wczMvdnVhcnQuYworKysgYi9kcml2ZXJzL3BzMy92dWFydC5jCkBAIC04MiwxNCArODIsNiBAQAogCXU2NCB1bnVzZWRbM107CiB9IF9fYXR0cmlidXRlX18gKChhbGlnbmVkICgzMikpKTsKIAotLyogcmVkZWZpbmUgZGV2X2RiZyB0byBkbyBhIHN5bnRheCBjaGVjayAqLwotCi0jaWYgIWRlZmluZWQoREVCVUcpCi0jdW5kZWYgZGV2X2RiZwotc3RhdGljIGlubGluZSBpbnQgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpIGRldl9kYmcoCi0JY29uc3Qgc3RydWN0IGRldmljZSAqX2RldiwgY29uc3QgY2hhciAqZm10LCAuLi4pIHtyZXR1cm4gMDt9Ci0jZW5kaWYKLQogI2RlZmluZSBkdW1wX3BvcnRzX2JtcChfYikgX2R1bXBfcG9ydHNfYm1wKF9iLCBfX2Z1bmNfXywgX19MSU5FX18pCiBzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkgX2R1bXBfcG9ydHNfYm1wKAogCWNvbnN0IHN0cnVjdCBwb3J0c19ibXAqIGJtcCwgY29uc3QgY2hhciogZnVuYywgaW50IGxpbmUpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZC5jIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2QuYwppbmRleCBlYjVkYzYyLi45Nzc1MjEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZC5jCisrKyBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkLmMKQEAgLTM5OCw2ICszOTgsOSBAQAogCiAJaWYgKGRldmljZS0+c3RhdGUgPT0gZGV2aWNlLT50YXJnZXQpCiAJCXdha2VfdXAoJmRhc2RfaW5pdF93YWl0cSk7CisKKwkvKiBsZXQgdXNlci1zcGFjZSBrbm93IHRoYXQgdGhlIGRldmljZSBzdGF0dXMgY2hhbmdlZCAqLworCWtvYmplY3RfdWV2ZW50KCZkZXZpY2UtPmNkZXYtPmRldi5rb2JqLCBLT0JKX0NIQU5HRSk7CiB9CiAKIC8qCkBAIC0yMTcxLDYgKzIxNzQsNTEgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdHJ1Y3QgZGFzZF9jY3dfcmVxICogZGFzZF9nZW5lcmljX2J1aWxkX3JkYyhzdHJ1Y3QgZGFzZF9kZXZpY2UgKmRldmljZSwKKwkJCQkJICAgICB2b2lkICpyZGNfYnVmZmVyLAorCQkJCQkgICAgIGludCByZGNfYnVmZmVyX3NpemUsIGNoYXIgKm1hZ2ljKQoreworCXN0cnVjdCBkYXNkX2Njd19yZXEgKmNxcjsKKwlzdHJ1Y3QgY2N3MSAqY2N3OworCisJY3FyID0gZGFzZF9zbWFsbG9jX3JlcXVlc3QobWFnaWMsIDEgLyogUkRDICovLCByZGNfYnVmZmVyX3NpemUsIGRldmljZSk7CisKKwlpZiAoSVNfRVJSKGNxcikpIHsKKwkJREVWX01FU1NBR0UoS0VSTl9XQVJOSU5HLCBkZXZpY2UsICIlcyIsCisJCQkgICAgIkNvdWxkIG5vdCBhbGxvY2F0ZSBSREMgcmVxdWVzdCIpOworCQlyZXR1cm4gY3FyOworCX0KKworCWNjdyA9IGNxci0+Y3BhZGRyOworCWNjdy0+Y21kX2NvZGUgPSBDQ1dfQ01EX1JEQzsKKwljY3ctPmNkYSA9IChfX3UzMikoYWRkcl90KXJkY19idWZmZXI7CisJY2N3LT5jb3VudCA9IHJkY19idWZmZXJfc2l6ZTsKKworCWNxci0+ZGV2aWNlID0gZGV2aWNlOworCWNxci0+ZXhwaXJlcyA9IDEwKkhaOworCWNsZWFyX2JpdChEQVNEX0NRUl9GTEFHU19VU0VfRVJQLCAmY3FyLT5mbGFncyk7CisJY3FyLT5yZXRyaWVzID0gMjsKKwljcXItPmJ1aWxkY2xrID0gZ2V0X2Nsb2NrKCk7CisJY3FyLT5zdGF0dXMgPSBEQVNEX0NRUl9GSUxMRUQ7CisJcmV0dXJuIGNxcjsKK30KKworCitpbnQgZGFzZF9nZW5lcmljX3JlYWRfZGV2X2NoYXJzKHN0cnVjdCBkYXNkX2RldmljZSAqZGV2aWNlLCBjaGFyICptYWdpYywKKwkJCQl2b2lkICoqcmRjX2J1ZmZlciwgaW50IHJkY19idWZmZXJfc2l6ZSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBkYXNkX2Njd19yZXEgKmNxcjsKKworCWNxciA9IGRhc2RfZ2VuZXJpY19idWlsZF9yZGMoZGV2aWNlLCAqcmRjX2J1ZmZlciwgcmRjX2J1ZmZlcl9zaXplLAorCQkJCSAgICAgbWFnaWMpOworCWlmIChJU19FUlIoY3FyKSkKKwkJcmV0dXJuIFBUUl9FUlIoY3FyKTsKKworCXJldCA9IGRhc2Rfc2xlZXBfb24oY3FyKTsKKwlkYXNkX3NmcmVlX3JlcXVlc3QoY3FyLCBjcXItPmRldmljZSk7CisJcmV0dXJuIHJldDsKK30KIAogc3RhdGljIGludCBfX2luaXQKIGRhc2RfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfZGV2bWFwLmMgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9kZXZtYXAuYwppbmRleCBlZDcwODUyLi42YTg5Y2VmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9kZXZtYXAuYworKysgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9kZXZtYXAuYwpAQCAtMTksNiArMTksNyBAQAogCiAjaW5jbHVkZSA8YXNtL2RlYnVnLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaXBsLmg+CiAKIC8qIFRoaXMgaXMgdWdseS4uLiAqLwogI2RlZmluZSBQUklOVEtfSEVBREVSICJkYXNkX2Rldm1hcDoiCkBAIC0xMzMsNiArMTM0LDggQEAKIF9fc2V0dXAgKCJkYXNkPSIsIGRhc2RfY2FsbF9zZXR1cCk7CiAjZW5kaWYJLyogI2lmbmRlZiBNT0RVTEUgKi8KIAorI2RlZmluZQlEQVNEX0lQTERFVgkiaXBsZGV2IgorCiAvKgogICogUmVhZCBhIGRldmljZSBidXNpZC9kZXZubyBmcm9tIGEgc3RyaW5nLgogICovCkBAIC0xNDEsNiArMTQ0LDIwIEBACiB7CiAJaW50IHZhbCwgb2xkX3N0eWxlOwogCisJLyogSW50ZXJwcmV0IGlwbGRldiBidXNpZCAqLworCWlmIChzdHJuY21wKERBU0RfSVBMREVWLCAqc3RyLCBzdHJsZW4oREFTRF9JUExERVYpKSA9PSAwKSB7CisJCWlmIChpcGxfaW5mby50eXBlICE9IElQTF9UWVBFX0NDVykgeworCQkJTUVTU0FHRShLRVJOX0VSUiwgIiVzIiwgImlwbCBkZXZpY2UgaXMgbm90IGEgY2N3ICIKKwkJCQkiZGV2aWNlIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQkqaWQwID0gMDsKKwkJKmlkMSA9IGlwbF9pbmZvLmRhdGEuY2N3LmRldl9pZC5zc2lkOworCQkqZGV2bm8gPSBpcGxfaW5mby5kYXRhLmNjdy5kZXZfaWQuZGV2bm87CisJCSpzdHIgKz0gc3RybGVuKERBU0RfSVBMREVWKTsKKworCQlyZXR1cm4gMDsKKwl9CiAJLyogY2hlY2sgZm9yIGxlYWRpbmcgJzB4JyAqLwogCW9sZF9zdHlsZSA9IDA7CiAJaWYgKCgqc3RyKVswXSA9PSAnMCcgJiYgKCpzdHIpWzFdID09ICd4JykgewpAQCAtODI5LDYgKzg0Niw0NiBAQAogc3RhdGljIERFVklDRV9BVFRSKGRpc2NpcGxpbmUsIDA0NDQsIGRhc2RfZGlzY2lwbGluZV9zaG93LCBOVUxMKTsKIAogc3RhdGljIHNzaXplX3QKK2Rhc2RfZGV2aWNlX3N0YXR1c19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCSAgICAgY2hhciAqYnVmKQoreworCXN0cnVjdCBkYXNkX2RldmljZSAqZGV2aWNlOworCXNzaXplX3QgbGVuOworCisJZGV2aWNlID0gZGFzZF9kZXZpY2VfZnJvbV9jZGV2KHRvX2Njd2RldihkZXYpKTsKKwlpZiAoIUlTX0VSUihkZXZpY2UpKSB7CisJCXN3aXRjaCAoZGV2aWNlLT5zdGF0ZSkgeworCQljYXNlIERBU0RfU1RBVEVfTkVXOgorCQkJbGVuID0gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICJuZXdcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgREFTRF9TVEFURV9LTk9XTjoKKwkJCWxlbiA9IHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiZGV0ZWN0ZWRcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgREFTRF9TVEFURV9CQVNJQzoKKwkJCWxlbiA9IHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiYmFzaWNcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgREFTRF9TVEFURV9VTkZNVDoKKwkJCWxlbiA9IHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAidW5mb3JtYXR0ZWRcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgREFTRF9TVEFURV9SRUFEWToKKwkJCWxlbiA9IHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAicmVhZHlcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgREFTRF9TVEFURV9PTkxJTkU6CisJCQlsZW4gPSBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIm9ubGluZVxuIik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWxlbiA9IHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAibm8gc3RhdFxuIik7CisJCQlicmVhazsKKwkJfQorCQlkYXNkX3B1dF9kZXZpY2UoZGV2aWNlKTsKKwl9IGVsc2UKKwkJbGVuID0gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICJ1bmtub3duXG4iKTsKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgREVWSUNFX0FUVFIoc3RhdHVzLCAwNDQ0LCBkYXNkX2RldmljZV9zdGF0dXNfc2hvdywgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90CiBkYXNkX2FsaWFzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCBkYXNkX2Rldm1hcCAqZGV2bWFwOwpAQCAtOTM5LDYgKzk5Niw3IEBACiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqIGRhc2RfYXR0cnNbXSA9IHsKIAkmZGV2X2F0dHJfcmVhZG9ubHkuYXR0ciwKIAkmZGV2X2F0dHJfZGlzY2lwbGluZS5hdHRyLAorCSZkZXZfYXR0cl9zdGF0dXMuYXR0ciwKIAkmZGV2X2F0dHJfYWxpYXMuYXR0ciwKIAkmZGV2X2F0dHJfdmVuZG9yLmF0dHIsCiAJJmRldl9hdHRyX3VpZC5hdHRyLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfZWNrZC5jIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfZWNrZC5jCmluZGV4IGNlY2FiMjIuLmM5NTgzZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2Vja2QuYworKysgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9lY2tkLmMKQEAgLTQ1MCw2ICs0NTAsODEgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RydWN0IGRhc2RfY2N3X3JlcSAqIGRhc2RfZWNrZF9idWlsZF9yY2RfbHBtKHN0cnVjdCBkYXNkX2RldmljZSAqZGV2aWNlLAorCQkJCQkgICAgICB2b2lkICpyY2RfYnVmZmVyLAorCQkJCQkgICAgICBzdHJ1Y3QgY2l3ICpjaXcsIF9fdTggbHBtKQoreworCXN0cnVjdCBkYXNkX2Njd19yZXEgKmNxcjsKKwlzdHJ1Y3QgY2N3MSAqY2N3OworCisJY3FyID0gZGFzZF9zbWFsbG9jX3JlcXVlc3QoIkVDS0QiLCAxIC8qIFJDRCAqLywgY2l3LT5jb3VudCwgZGV2aWNlKTsKKworCWlmIChJU19FUlIoY3FyKSkgeworCQlERVZfTUVTU0FHRShLRVJOX1dBUk5JTkcsIGRldmljZSwgIiVzIiwKKwkJCSAgICAiQ291bGQgbm90IGFsbG9jYXRlIFJDRCByZXF1ZXN0Iik7CisJCXJldHVybiBjcXI7CisJfQorCisJY2N3ID0gY3FyLT5jcGFkZHI7CisJY2N3LT5jbWRfY29kZSA9IGNpdy0+Y21kOworCWNjdy0+Y2RhID0gKF9fdTMyKShhZGRyX3QpcmNkX2J1ZmZlcjsKKwljY3ctPmNvdW50ID0gY2l3LT5jb3VudDsKKworCWNxci0+ZGV2aWNlID0gZGV2aWNlOworCWNxci0+ZXhwaXJlcyA9IDEwKkhaOworCWNxci0+bHBtID0gbHBtOworCWNsZWFyX2JpdChEQVNEX0NRUl9GTEFHU19VU0VfRVJQLCAmY3FyLT5mbGFncyk7CisJY3FyLT5yZXRyaWVzID0gMjsKKwljcXItPmJ1aWxkY2xrID0gZ2V0X2Nsb2NrKCk7CisJY3FyLT5zdGF0dXMgPSBEQVNEX0NRUl9GSUxMRUQ7CisJcmV0dXJuIGNxcjsKK30KKworc3RhdGljIGludCBkYXNkX2Vja2RfcmVhZF9jb25mX2xwbShzdHJ1Y3QgZGFzZF9kZXZpY2UgKmRldmljZSwKKwkJCQkgICB2b2lkICoqcmNkX2J1ZmZlciwKKwkJCQkgICBpbnQgKnJjZF9idWZmZXJfc2l6ZSwgX191OCBscG0pCit7CisJc3RydWN0IGNpdyAqY2l3OworCWNoYXIgKnJjZF9idWYgPSBOVUxMOworCWludCByZXQ7CisJc3RydWN0IGRhc2RfY2N3X3JlcSAqY3FyOworCisJLyoKKwkgKiBzY2FuIGZvciBSQ0QgY29tbWFuZCBpbiBleHRlbmRlZCBTZW5zZUlEIGRhdGEKKwkgKi8KKwljaXcgPSBjY3dfZGV2aWNlX2dldF9jaXcoZGV2aWNlLT5jZGV2LCBDSVdfVFlQRV9SQ0QpOworCWlmICghY2l3IHx8IGNpdy0+Y21kID09IDApIHsKKwkJcmV0ID0gLUVPUE5PVFNVUFA7CisJCWdvdG8gb3V0X2Vycm9yOworCX0KKwlyY2RfYnVmID0ga3phbGxvYyhjaXctPmNvdW50LCBHRlBfS0VSTkVMIHwgR0ZQX0RNQSk7CisJaWYgKCFyY2RfYnVmKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0X2Vycm9yOworCX0KKwljcXIgPSBkYXNkX2Vja2RfYnVpbGRfcmNkX2xwbShkZXZpY2UsIHJjZF9idWYsIGNpdywgbHBtKTsKKwlpZiAoSVNfRVJSKGNxcikpIHsKKwkJcmV0ID0gIFBUUl9FUlIoY3FyKTsKKwkJZ290byBvdXRfZXJyb3I7CisJfQorCXJldCA9IGRhc2Rfc2xlZXBfb24oY3FyKTsKKwkvKgorCSAqIG9uIHN1Y2Nlc3Mgd2UgdXBkYXRlIHRoZSB1c2VyIGlucHV0IHBhcm1zCisJICovCisJZGFzZF9zZnJlZV9yZXF1ZXN0KGNxciwgY3FyLT5kZXZpY2UpOworCWlmIChyZXQpCisJCWdvdG8gb3V0X2Vycm9yOworCisJKnJjZF9idWZmZXJfc2l6ZSA9IGNpdy0+Y291bnQ7CisJKnJjZF9idWZmZXIgPSByY2RfYnVmOworCXJldHVybiAwOworb3V0X2Vycm9yOgorCWtmcmVlKHJjZF9idWYpOworCSpyY2RfYnVmZmVyID0gTlVMTDsKKwkqcmNkX2J1ZmZlcl9zaXplID0gMDsKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgaW50CiBkYXNkX2Vja2RfcmVhZF9jb25mKHN0cnVjdCBkYXNkX2RldmljZSAqZGV2aWNlKQogewpAQCAtNDY5LDggKzU0NCw4IEBACiAJLyogZ2V0IGNvbmZpZ3VyYXRpb24gZGF0YSBwZXIgb3BlcmF0aW9uYWwgcGF0aCAqLwogCWZvciAobHBtID0gMHg4MDsgbHBtOyBscG0+Pj0gMSkgewogCQlpZiAobHBtICYgcGF0aF9kYXRhLT5vcG0pewotCQkJcmMgPSByZWFkX2NvbmZfZGF0YV9scG0oZGV2aWNlLT5jZGV2LCAmY29uZl9kYXRhLAotCQkJCQkJJmNvbmZfbGVuLCBscG0pOworCQkJcmMgPSBkYXNkX2Vja2RfcmVhZF9jb25mX2xwbShkZXZpY2UsICZjb25mX2RhdGEsCisJCQkJCQkgICAgICZjb25mX2xlbiwgbHBtKTsKIAkJCWlmIChyYyAmJiByYyAhPSAtRU9QTk9UU1VQUCkgewkvKiAtRU9QTk9UU1VQUCBpcyBvayAqLwogCQkJCU1FU1NBR0UoS0VSTl9XQVJOSU5HLAogCQkJCQkiUmVhZCBjb25maWd1cmF0aW9uIGRhdGEgcmV0dXJuZWQgIgpAQCAtNjM5LDcgKzcxNCw3IEBACiAJLyogUmVhZCBEZXZpY2UgQ2hhcmFjdGVyaXN0aWNzICovCiAJcmRjX2RhdGEgPSAodm9pZCAqKSAmKHByaXZhdGUtPnJkY19kYXRhKTsKIAltZW1zZXQocmRjX2RhdGEsIDAsIHNpemVvZihyZGNfZGF0YSkpOwotCXJjID0gcmVhZF9kZXZfY2hhcnMoZGV2aWNlLT5jZGV2LCAmcmRjX2RhdGEsIDY0KTsKKwlyYyA9IGRhc2RfZ2VuZXJpY19yZWFkX2Rldl9jaGFycyhkZXZpY2UsICJFQ0tEIiwgJnJkY19kYXRhLCA2NCk7CiAJaWYgKHJjKQogCQlERVZfTUVTU0FHRShLRVJOX1dBUk5JTkcsIGRldmljZSwKIAkJCSAgICAiUmVhZCBkZXZpY2UgY2hhcmFjdGVyaXN0aWNzIHJldHVybmVkICIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2ZiYS5jIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfZmJhLmMKaW5kZXggYmUwOTA5ZS4uZGExNmVhZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfZmJhLmMKKysrIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfZmJhLmMKQEAgLTEzNSw3ICsxMzUsNyBAQAogCX0KIAkvKiBSZWFkIERldmljZSBDaGFyYWN0ZXJpc3RpY3MgKi8KIAlyZGNfZGF0YSA9ICh2b2lkICopICYocHJpdmF0ZS0+cmRjX2RhdGEpOwotCXJjID0gcmVhZF9kZXZfY2hhcnMoZGV2aWNlLT5jZGV2LCAmcmRjX2RhdGEsIDMyKTsKKwlyYyA9IGRhc2RfZ2VuZXJpY19yZWFkX2Rldl9jaGFycyhkZXZpY2UsICJGQkEgIiwgJnJkY19kYXRhLCAzMik7CiAJaWYgKHJjKSB7CiAJCURFVl9NRVNTQUdFKEtFUk5fV0FSTklORywgZGV2aWNlLAogCQkJICAgICJSZWFkIGRldmljZSBjaGFyYWN0ZXJpc3RpY3MgcmV0dXJuZWQgZXJyb3IgJWQiLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfaW50LmggYi9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9pbnQuaAppbmRleCBhMmNjNjllLi4yNDEyOTRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9pbnQuaAorKysgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9pbnQuaApAQCAtNTA5LDYgKzUwOSw4IEBACiBpbnQgZGFzZF9nZW5lcmljX3NldF9vZmZsaW5lIChzdHJ1Y3QgY2N3X2RldmljZSAqY2Rldik7CiBpbnQgZGFzZF9nZW5lcmljX25vdGlmeShzdHJ1Y3QgY2N3X2RldmljZSAqLCBpbnQpOwogCitpbnQgZGFzZF9nZW5lcmljX3JlYWRfZGV2X2NoYXJzKHN0cnVjdCBkYXNkX2RldmljZSAqLCBjaGFyICosIHZvaWQgKiosIGludCk7CisKIC8qIGV4dGVybmFscyBpbiBkYXNkX2Rldm1hcC5jICovCiBleHRlcm4gaW50IGRhc2RfbWF4X2RldmluZGV4OwogZXh0ZXJuIGludCBkYXNkX3Byb2Jlb25seTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaGFyL01ha2VmaWxlIGIvZHJpdmVycy9zMzkwL2NoYXIvTWFrZWZpbGUKaW5kZXggMjkzZTY2Ny4uYzIxMDc4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2NoYXIvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zMzkwL2NoYXIvTWFrZWZpbGUKQEAgLTMsNyArMyw3IEBACiAjCiAKIG9iai15ICs9IGN0cmxjaGFyLm8ga2V5Ym9hcmQubyBkZWZrZXltYXAubyBzY2xwLm8gc2NscF9ydy5vIHNjbHBfcXVpZXNjZS5vIFwKLQkgc2NscF9pbmZvLm8KKwkgc2NscF9pbmZvLm8gc2NscF9jb25maWcubyBzY2xwX2NocC5vCiAKIG9iai0kKENPTkZJR19UTjMyNzApICs9IHJhdzMyNzAubwogb2JqLSQoQ09ORklHX1ROMzI3MF9DT05TT0xFKSArPSBjb24zMjcwLm8KQEAgLTI5LDMgKzI5LDYgQEAKIG9iai0kKENPTkZJR19TMzkwX1RBUEVfMzU5MCkgKz0gdGFwZV8zNTkwLm8KIG9iai0kKENPTkZJR19NT05SRUFERVIpICs9IG1vbnJlYWRlci5vCiBvYmotJChDT05GSUdfTU9OV1JJVEVSKSArPSBtb253cml0ZXIubworCit6Y29yZV9tb2Qtb2JqcyA6PSBzY2xwX3NkaWFzLm8gemNvcmUubworb2JqLSQoQ09ORklHX1pGQ1BEVU1QKSArPSB6Y29yZV9tb2QubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2NoYXIvY29uMzIxNS5jIGIvZHJpdmVycy9zMzkwL2NoYXIvY29uMzIxNS5jCmluZGV4IDlhMzI4ZjEuLjYwMDBiZGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaGFyL2NvbjMyMTUuYworKysgYi9kcml2ZXJzL3MzOTAvY2hhci9jb24zMjE1LmMKQEAgLTgxMywxMiArODEzLDYgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKGdldF9jY3dkZXZfbG9jayhyYXctPmNkZXYpLCBmbGFncyk7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IAotY29uMzIxNV9jb25zZXR1cChzdHJ1Y3QgY29uc29sZSAqY28sIGNoYXIgKm9wdGlvbnMpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KIC8qCiAgKiAgVGhlIGNvbnNvbGUgc3RydWN0dXJlIGZvciB0aGUgMzIxNSBjb25zb2xlCiAgKi8KQEAgLTgyNyw3ICs4MjEsNiBAQAogCS53cml0ZQkgPSBjb24zMjE1X3dyaXRlLAogCS5kZXZpY2UJID0gY29uMzIxNV9kZXZpY2UsCiAJLnVuYmxhbmsgPSBjb24zMjE1X3VuYmxhbmssCi0JLnNldHVwCSA9IGNvbjMyMTVfY29uc2V0dXAsCiAJLmZsYWdzCSA9IENPTl9QUklOVEJVRkZFUiwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaGFyL2NvbjMyNzAuYyBiL2RyaXZlcnMvczM5MC9jaGFyL2NvbjMyNzAuYwppbmRleCA4ZTdmMmQ3Li5mZDM0NzkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2hhci9jb24zMjcwLmMKKysrIGIvZHJpdmVycy9zMzkwL2NoYXIvY29uMzI3MC5jCkBAIC01NTUsMTIgKzU1NSw2IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3AtPnZpZXcubG9jaywgZmxhZ3MpOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCAKLWNvbjMyNzBfY29uc2V0dXAoc3RydWN0IGNvbnNvbGUgKmNvLCBjaGFyICpvcHRpb25zKQotewotCXJldHVybiAwOwotfQotCiAvKgogICogIFRoZSBjb25zb2xlIHN0cnVjdHVyZSBmb3IgdGhlIDMyNzAgY29uc29sZQogICovCkBAIC01NjksNyArNTYzLDYgQEAKIAkud3JpdGUJID0gY29uMzI3MF93cml0ZSwKIAkuZGV2aWNlCSA9IGNvbjMyNzBfZGV2aWNlLAogCS51bmJsYW5rID0gY29uMzI3MF91bmJsYW5rLAotCS5zZXR1cAkgPSBjb24zMjcwX2NvbnNldHVwLAogCS5mbGFncwkgPSBDT05fUFJJTlRCVUZGRVIsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2hhci9zY2xwLmMgYi9kcml2ZXJzL3MzOTAvY2hhci9zY2xwLmMKaW5kZXggZjE3MWRlMy4uZmE2MmU2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2NoYXIvc2NscC5jCisrKyBiL2RyaXZlcnMvczM5MC9jaGFyL3NjbHAuYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CiAjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxhc20vdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vczM5MF9leHQuaD4KIApAQCAtNTEwLDcgKzUxMSw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc2NscF9yZWdpc3RlciBzY2xwX3N0YXRlX2NoYW5nZV9ldmVudCA9IHsKLQkucmVjZWl2ZV9tYXNrID0gRXZUeXBfU3RhdGVDaGFuZ2VfTWFzaywKKwkucmVjZWl2ZV9tYXNrID0gRVZUWVBfU1RBVEVDSEFOR0VfTUFTSywKIAkucmVjZWl2ZXJfZm4gPSBzY2xwX3N0YXRlX2NoYW5nZV9jYgogfTsKIApAQCAtOTMwLDMgKzkzMSwxMCBAQAogCXNjbHBfaW5pdF9tYXNrKDEpOwogCXJldHVybiAwOwogfQorCitzdGF0aWMgX19pbml0IGludCBzY2xwX2luaXRjYWxsKHZvaWQpCit7CisJcmV0dXJuIHNjbHBfaW5pdCgpOworfQorCithcmNoX2luaXRjYWxsKHNjbHBfaW5pdGNhbGwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2NoYXIvc2NscC5oIGIvZHJpdmVycy9zMzkwL2NoYXIvc2NscC5oCmluZGV4IDdkMjlhYjQuLjg3YWM0YTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaGFyL3NjbHAuaAorKysgYi9kcml2ZXJzL3MzOTAvY2hhci9zY2xwLmgKQEAgLTE5LDMzICsxOSwzNyBAQAogI2RlZmluZSBNQVhfS01FTV9QQUdFUyAoc2l6ZW9mKHVuc2lnbmVkIGxvbmcpIDw8IDMpCiAjZGVmaW5lIE1BWF9DT05TT0xFX1BBR0VTCTQKIAotI2RlZmluZSBFdlR5cF9PcENtZAkJMHgwMQotI2RlZmluZSBFdlR5cF9Nc2cJCTB4MDIKLSNkZWZpbmUgRXZUeXBfU3RhdGVDaGFuZ2UJMHgwOAotI2RlZmluZSBFdlR5cF9QTXNnQ21kCQkweDA5Ci0jZGVmaW5lIEV2VHlwX0NudGxQcm9nT3BDbWQJMHgyMAotI2RlZmluZSBFdlR5cF9DbnRsUHJvZ0lkZW50CTB4MEIKLSNkZWZpbmUgRXZUeXBfU2lnUXVpZXNjZQkweDFECi0jZGVmaW5lIEV2VHlwX1ZUMjIwTXNnCQkweDFBCisjZGVmaW5lIEVWVFlQX09QQ01ECQkweDAxCisjZGVmaW5lIEVWVFlQX01TRwkJMHgwMgorI2RlZmluZSBFVlRZUF9TVEFURUNIQU5HRQkweDA4CisjZGVmaW5lIEVWVFlQX1BNU0dDTUQJCTB4MDkKKyNkZWZpbmUgRVZUWVBfQ05UTFBST0dPUENNRAkweDIwCisjZGVmaW5lIEVWVFlQX0NOVExQUk9HSURFTlQJMHgwQgorI2RlZmluZSBFVlRZUF9TSUdRVUlFU0NFCTB4MUQKKyNkZWZpbmUgRVZUWVBfVlQyMjBNU0cJCTB4MUEKKyNkZWZpbmUgRVZUWVBfQ09ORk1HTURBVEEJMHgwNAorI2RlZmluZSBFVlRZUF9TRElBUwkJMHgxQwogCi0jZGVmaW5lIEV2VHlwX09wQ21kX01hc2sJMHg4MDAwMDAwMAotI2RlZmluZSBFdlR5cF9Nc2dfTWFzawkJMHg0MDAwMDAwMAotI2RlZmluZSBFdlR5cF9TdGF0ZUNoYW5nZV9NYXNrCTB4MDEwMDAwMDAKLSNkZWZpbmUgRXZUeXBfUE1zZ0NtZF9NYXNrCTB4MDA4MDAwMDAKLSNkZWZpbmUgRXZUeXBfQ3RsUHJvZ09wQ21kX01hc2sJMHgwMDAwMDAwMQotI2RlZmluZSBFdlR5cF9DdGxQcm9nSWRlbnRfTWFzawkweDAwMjAwMDAwCi0jZGVmaW5lIEV2VHlwX1NpZ1F1aWVzY2VfTWFzawkweDAwMDAwMDA4Ci0jZGVmaW5lIEV2VHlwX1ZUMjIwTXNnX01hc2sJMHgwMDAwMDA0MAorI2RlZmluZSBFVlRZUF9PUENNRF9NQVNLCTB4ODAwMDAwMDAKKyNkZWZpbmUgRVZUWVBfTVNHX01BU0sJCTB4NDAwMDAwMDAKKyNkZWZpbmUgRVZUWVBfU1RBVEVDSEFOR0VfTUFTSwkweDAxMDAwMDAwCisjZGVmaW5lIEVWVFlQX1BNU0dDTURfTUFTSwkweDAwODAwMDAwCisjZGVmaW5lIEVWVFlQX0NUTFBST0dPUENNRF9NQVNLCTB4MDAwMDAwMDEKKyNkZWZpbmUgRVZUWVBfQ1RMUFJPR0lERU5UX01BU0sJMHgwMDIwMDAwMAorI2RlZmluZSBFVlRZUF9TSUdRVUlFU0NFX01BU0sJMHgwMDAwMDAwOAorI2RlZmluZSBFVlRZUF9WVDIyME1TR19NQVNLCTB4MDAwMDAwNDAKKyNkZWZpbmUgRVZUWVBfQ09ORk1HTURBVEFfTUFTSwkweDEwMDAwMDAwCisjZGVmaW5lIEVWVFlQX1NESUFTX01BU0sJMHgwMDAwMDAxMAogCi0jZGVmaW5lIEducmxNc2dGbGdzX0RPTQkJMHg4MDAwCi0jZGVmaW5lIEducmxNc2dGbGdzX1NuZEFscm0JMHg0MDAwCi0jZGVmaW5lIEducmxNc2dGbGdzX0hvbGRNc2cJMHgyMDAwCisjZGVmaW5lIEdOUkxNU0dGTEdTX0RPTQkJMHg4MDAwCisjZGVmaW5lIEdOUkxNU0dGTEdTX1NOREFMUk0JMHg0MDAwCisjZGVmaW5lIEdOUkxNU0dGTEdTX0hPTERNU0cJMHgyMDAwCiAKLSNkZWZpbmUgTG5UcEZsZ3NfQ250bFRleHQJMHg4MDAwCi0jZGVmaW5lIExuVHBGbGdzX0xhYmVsVGV4dAkweDQwMDAKLSNkZWZpbmUgTG5UcEZsZ3NfRGF0YVRleHQJMHgyMDAwCi0jZGVmaW5lIExuVHBGbGdzX0VuZFRleHQJMHgxMDAwCi0jZGVmaW5lIExuVHBGbGdzX1Byb21wdFRleHQJMHgwODAwCisjZGVmaW5lIExOVFBGTEdTX0NOVExURVhUCTB4ODAwMAorI2RlZmluZSBMTlRQRkxHU19MQUJFTFRFWFQJMHg0MDAwCisjZGVmaW5lIExOVFBGTEdTX0RBVEFURVhUCTB4MjAwMAorI2RlZmluZSBMTlRQRkxHU19FTkRURVhUCTB4MTAwMAorI2RlZmluZSBMTlRQRkxHU19QUk9NUFRURVhUCTB4MDgwMAogCiB0eXBlZGVmIHVuc2lnbmVkIGludCBzY2xwX2NtZHdfdDsKIApAQCAtNTYsMTUgKzYwLDE1IEBACiAjZGVmaW5lIFNDTFBfQ01EV19SRUFEX1NDUF9JTkZPX0ZPUkNFRAkweDAwMTIwMDAxCiAKICNkZWZpbmUgR0RTX0lEX01EU01VCQkweDEzMTAKLSNkZWZpbmUgR0RTX0lEX01EU1JvdXRlSW5mbwkweDEzMTEKLSNkZWZpbmUgR0RTX0lEX0FnVW5XcmtDb3JyCTB4MTU0OQotI2RlZmluZSBHRFNfSURfU05BQ29uZFJlcG9ydAkweDE1MzIKKyNkZWZpbmUgR0RTX0lEX01EU1JPVVRFSU5GTwkweDEzMTEKKyNkZWZpbmUgR0RTX0lEX0FHVU5XUktDT1JSCTB4MTU0OQorI2RlZmluZSBHRFNfSURfU05BQ09ORFJFUE9SVAkweDE1MzIKICNkZWZpbmUgR0RTX0lEX0NQTVNVCQkweDEyMTIKLSNkZWZpbmUgR0RTX0lEX1JvdXRUYXJnSW5zdHIJMHgxNTRECi0jZGVmaW5lIEdEU19JRF9PcFJlcQkJMHg4MDcwCi0jZGVmaW5lIEdEU19JRF9UZXh0Q21kCQkweDEzMjAKKyNkZWZpbmUgR0RTX0lEX1JPVVRUQVJHSU5TVFIJMHgxNTRECisjZGVmaW5lIEdEU19JRF9PUFJFUQkJMHg4MDcwCisjZGVmaW5lIEdEU19JRF9URVhUQ01ECQkweDEzMjAKIAotI2RlZmluZSBHRFNfS0VZX1NlbGZEZWZUZXh0TXNnCTB4MzEKKyNkZWZpbmUgR0RTX0tFWV9TRUxGREVGVEVYVE1TRwkweDMxCiAKIHR5cGVkZWYgdTMyIHNjY2JfbWFza190OwkvKiBBVFRFTlRJT046IGFzc3VtZXMgMzJiaXQgbWFzayAhISEgKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2NoYXIvc2NscF9jaHAuYyBiL2RyaXZlcnMvczM5MC9jaGFyL3NjbHBfY2hwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY2YjkxNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvczM5MC9jaGFyL3NjbHBfY2hwLmMKQEAgLTAsMCArMSwxOTYgQEAKKy8qCisgKiAgZHJpdmVycy9zMzkwL2NoYXIvc2NscF9jaHAuYworICoKKyAqICAgIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwNworICogICAgQXV0aG9yKHMpOiBQZXRlciBPYmVycGFybGVpdGVyIDxwZXRlci5vYmVycGFybGVpdGVyQGRlLmlibS5jb20+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisjaW5jbHVkZSA8YXNtL3NjbHAuaD4KKyNpbmNsdWRlIDxhc20vY2hwaWQuaD4KKworI2luY2x1ZGUgInNjbHAuaCIKKworI2RlZmluZSBUQUcJInNjbHBfY2hwOiAiCisKKyNkZWZpbmUgU0NMUF9DTURXX0NPTkZJR1VSRV9DSEFOTkVMX1BBVEgJMHgwMDBmMDAwMQorI2RlZmluZSBTQ0xQX0NNRFdfREVDT05GSUdVUkVfQ0hBTk5FTF9QQVRICTB4MDAwZTAwMDEKKyNkZWZpbmUgU0NMUF9DTURXX1JFQURfQ0hBTk5FTF9QQVRIX0lORk9STUFUSU9OCTB4MDAwMzAwMDEKKworc3RhdGljIGlubGluZSBzY2xwX2NtZHdfdCBnZXRfY29uZmlndXJlX2NtZHcoc3RydWN0IGNocF9pZCBjaHBpZCkKK3sKKwlyZXR1cm4gU0NMUF9DTURXX0NPTkZJR1VSRV9DSEFOTkVMX1BBVEggfCBjaHBpZC5pZCA8PCA4OworfQorCitzdGF0aWMgaW5saW5lIHNjbHBfY21kd190IGdldF9kZWNvbmZpZ3VyZV9jbWR3KHN0cnVjdCBjaHBfaWQgY2hwaWQpCit7CisJcmV0dXJuIFNDTFBfQ01EV19ERUNPTkZJR1VSRV9DSEFOTkVMX1BBVEggfCBjaHBpZC5pZCA8PCA4OworfQorCitzdGF0aWMgdm9pZCBjaHBfY2FsbGJhY2soc3RydWN0IHNjbHBfcmVxICpyZXEsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGNvbXBsZXRpb24gKmNvbXBsZXRpb24gPSBkYXRhOworCisJY29tcGxldGUoY29tcGxldGlvbik7Cit9CisKK3N0cnVjdCBjaHBfY2ZnX3NjY2IgeworCXN0cnVjdCBzY2NiX2hlYWRlciBoZWFkZXI7CisJdTggY2NtOworCXU4IHJlc2VydmVkWzZdOworCXU4IGNzc2lkOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IGNocF9jZmdfZGF0YSB7CisJc3RydWN0IGNocF9jZmdfc2NjYiBzY2NiOworCXN0cnVjdCBzY2xwX3JlcSByZXE7CisJc3RydWN0IGNvbXBsZXRpb24gY29tcGxldGlvbjsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0YXRpYyBpbnQgZG9fY29uZmlndXJlKHNjbHBfY21kd190IGNtZCkKK3sKKwlzdHJ1Y3QgY2hwX2NmZ19kYXRhICpkYXRhOworCWludCByYzsKKworCS8qIFByZXBhcmUgc2NjYi4gKi8KKwlkYXRhID0gKHN0cnVjdCBjaHBfY2ZnX2RhdGEgKikgZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwgfCBHRlBfRE1BKTsKKwlpZiAoIWRhdGEpCisJCXJldHVybiAtRU5PTUVNOworCWRhdGEtPnNjY2IuaGVhZGVyLmxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgY2hwX2NmZ19zY2NiKTsKKwlkYXRhLT5yZXEuY29tbWFuZCA9IGNtZDsKKwlkYXRhLT5yZXEuc2NjYiA9ICYoZGF0YS0+c2NjYik7CisJZGF0YS0+cmVxLnN0YXR1cyA9IFNDTFBfUkVRX0ZJTExFRDsKKwlkYXRhLT5yZXEuY2FsbGJhY2sgPSBjaHBfY2FsbGJhY2s7CisJZGF0YS0+cmVxLmNhbGxiYWNrX2RhdGEgPSAmKGRhdGEtPmNvbXBsZXRpb24pOworCWluaXRfY29tcGxldGlvbigmZGF0YS0+Y29tcGxldGlvbik7CisKKwkvKiBQZXJmb3JtIHNjbHAgcmVxdWVzdC4gKi8KKwlyYyA9IHNjbHBfYWRkX3JlcXVlc3QoJihkYXRhLT5yZXEpKTsKKwlpZiAocmMpCisJCWdvdG8gb3V0OworCXdhaXRfZm9yX2NvbXBsZXRpb24oJmRhdGEtPmNvbXBsZXRpb24pOworCisJLyogQ2hlY2sgcmVzcG9uc2UgLiovCisJaWYgKGRhdGEtPnJlcS5zdGF0dXMgIT0gU0NMUF9SRVFfRE9ORSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIFRBRyAiY29uZmlndXJlIGNoYW5uZWwtcGF0aCByZXF1ZXN0IGZhaWxlZCAiCisJCSAgICAgICAiKHN0YXR1cz0weCUwMngpXG4iLCBkYXRhLT5yZXEuc3RhdHVzKTsKKwkJcmMgPSAtRUlPOworCQlnb3RvIG91dDsKKwl9CisJc3dpdGNoIChkYXRhLT5zY2NiLmhlYWRlci5yZXNwb25zZV9jb2RlKSB7CisJY2FzZSAweDAwMjA6CisJY2FzZSAweDAxMjA6CisJY2FzZSAweDA0NDA6CisJY2FzZSAweDA0NTA6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX1dBUk5JTkcgVEFHICJjb25maWd1cmUgY2hhbm5lbC1wYXRoIGZhaWxlZCAiCisJCSAgICAgICAiKGNtZD0weCUwOHgsIHJlc3BvbnNlPTB4JTA0eClcbiIsIGNtZCwKKwkJICAgICAgIGRhdGEtPnNjY2IuaGVhZGVyLnJlc3BvbnNlX2NvZGUpOworCQlyYyA9IC1FSU87CisJCWJyZWFrOworCX0KK291dDoKKwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIGRhdGEpOworCisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIHNjbHBfY2hwX2NvbmZpZ3VyZSAtIHBlcmZvcm0gY29uZmlndXJlIGNoYW5uZWwtcGF0aCBzY2xwIGNvbW1hbmQKKyAqIEBjaHBpZDogY2hhbm5lbC1wYXRoIElECisgKgorICogUGVyZm9ybSBjb25maWd1cmUgY2hhbm5lbC1wYXRoIGNvbW1hbmQgc2NscCBjb21tYW5kIGZvciBzcGVjaWZpZWQgY2hwaWQuCisgKiBSZXR1cm4gMCBhZnRlciBjb21tYW5kIHN1Y2Nlc3NmdWxseSBmaW5pc2hlZCwgbm9uLXplcm8gb3RoZXJ3aXNlLgorICovCitpbnQgc2NscF9jaHBfY29uZmlndXJlKHN0cnVjdCBjaHBfaWQgY2hwaWQpCit7CisJcmV0dXJuIGRvX2NvbmZpZ3VyZShnZXRfY29uZmlndXJlX2NtZHcoY2hwaWQpKTsKK30KKworLyoqCisgKiBzY2xwX2NocF9kZWNvbmZpZ3VyZSAtIHBlcmZvcm0gZGVjb25maWd1cmUgY2hhbm5lbC1wYXRoIHNjbHAgY29tbWFuZAorICogQGNocGlkOiBjaGFubmVsLXBhdGggSUQKKyAqCisgKiBQZXJmb3JtIGRlY29uZmlndXJlIGNoYW5uZWwtcGF0aCBjb21tYW5kIHNjbHAgY29tbWFuZCBmb3Igc3BlY2lmaWVkIGNocGlkCisgKiBhbmQgd2FpdCBmb3IgY29tcGxldGlvbi4gT24gc3VjY2VzcyByZXR1cm4gMC4gUmV0dXJuIG5vbi16ZXJvIG90aGVyd2lzZS4KKyAqLworaW50IHNjbHBfY2hwX2RlY29uZmlndXJlKHN0cnVjdCBjaHBfaWQgY2hwaWQpCit7CisJcmV0dXJuIGRvX2NvbmZpZ3VyZShnZXRfZGVjb25maWd1cmVfY21kdyhjaHBpZCkpOworfQorCitzdHJ1Y3QgY2hwX2luZm9fc2NjYiB7CisJc3RydWN0IHNjY2JfaGVhZGVyIGhlYWRlcjsKKwl1OCByZWNvZ25pemVkW1NDTFBfQ0hQX0lORk9fTUFTS19TSVpFXTsKKwl1OCBzdGFuZGJ5W1NDTFBfQ0hQX0lORk9fTUFTS19TSVpFXTsKKwl1OCBjb25maWd1cmVkW1NDTFBfQ0hQX0lORk9fTUFTS19TSVpFXTsKKwl1OCBjY207CisJdTggcmVzZXJ2ZWRbNl07CisJdTggY3NzaWQ7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgY2hwX2luZm9fZGF0YSB7CisJc3RydWN0IGNocF9pbmZvX3NjY2Igc2NjYjsKKwlzdHJ1Y3Qgc2NscF9yZXEgcmVxOworCXN0cnVjdCBjb21wbGV0aW9uIGNvbXBsZXRpb247Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKioKKyAqIHNjbHBfY2hwX3JlYWRfaW5mbyAtIHBlcmZvcm0gcmVhZCBjaGFubmVsLXBhdGggaW5mb3JtYXRpb24gc2NscCBjb21tYW5kCisgKiBAaW5mbzogcmVzdWx0aW5nIGNoYW5uZWwtcGF0aCBpbmZvcm1hdGlvbiBkYXRhCisgKgorICogUGVyZm9ybSByZWFkIGNoYW5uZWwtcGF0aCBpbmZvcm1hdGlvbiBzY2xwIGNvbW1hbmQgYW5kIHdhaXQgZm9yIGNvbXBsZXRpb24uCisgKiBPbiBzdWNjZXNzLCBzdG9yZSBjaGFubmVsLXBhdGggaW5mb3JtYXRpb24gaW4gQGluZm8gYW5kIHJldHVybiAwLiBSZXR1cm4KKyAqIG5vbi16ZXJvIG90aGVyd2lzZS4KKyAqLworaW50IHNjbHBfY2hwX3JlYWRfaW5mbyhzdHJ1Y3Qgc2NscF9jaHBfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgY2hwX2luZm9fZGF0YSAqZGF0YTsKKwlpbnQgcmM7CisKKwkvKiBQcmVwYXJlIHNjY2IuICovCisJZGF0YSA9IChzdHJ1Y3QgY2hwX2luZm9fZGF0YSAqKSBnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCB8IEdGUF9ETUEpOworCWlmICghZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisJZGF0YS0+c2NjYi5oZWFkZXIubGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBjaHBfaW5mb19zY2NiKTsKKwlkYXRhLT5yZXEuY29tbWFuZCA9IFNDTFBfQ01EV19SRUFEX0NIQU5ORUxfUEFUSF9JTkZPUk1BVElPTjsKKwlkYXRhLT5yZXEuc2NjYiA9ICYoZGF0YS0+c2NjYik7CisJZGF0YS0+cmVxLnN0YXR1cyA9IFNDTFBfUkVRX0ZJTExFRDsKKwlkYXRhLT5yZXEuY2FsbGJhY2sgPSBjaHBfY2FsbGJhY2s7CisJZGF0YS0+cmVxLmNhbGxiYWNrX2RhdGEgPSAmKGRhdGEtPmNvbXBsZXRpb24pOworCWluaXRfY29tcGxldGlvbigmZGF0YS0+Y29tcGxldGlvbik7CisKKwkvKiBQZXJmb3JtIHNjbHAgcmVxdWVzdC4gKi8KKwlyYyA9IHNjbHBfYWRkX3JlcXVlc3QoJihkYXRhLT5yZXEpKTsKKwlpZiAocmMpCisJCWdvdG8gb3V0OworCXdhaXRfZm9yX2NvbXBsZXRpb24oJmRhdGEtPmNvbXBsZXRpb24pOworCisJLyogQ2hlY2sgcmVzcG9uc2UgLiovCisJaWYgKGRhdGEtPnJlcS5zdGF0dXMgIT0gU0NMUF9SRVFfRE9ORSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIFRBRyAicmVhZCBjaGFubmVsLXBhdGggaW5mbyByZXF1ZXN0IGZhaWxlZCAiCisJCSAgICAgICAiKHN0YXR1cz0weCUwMngpXG4iLCBkYXRhLT5yZXEuc3RhdHVzKTsKKwkJcmMgPSAtRUlPOworCQlnb3RvIG91dDsKKwl9CisJaWYgKGRhdGEtPnNjY2IuaGVhZGVyLnJlc3BvbnNlX2NvZGUgIT0gMHgwMDEwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgVEFHICJyZWFkIGNoYW5uZWwtcGF0aCBpbmZvIGZhaWxlZCAiCisJCSAgICAgICAiKHJlc3BvbnNlPTB4JTA0eClcbiIsIGRhdGEtPnNjY2IuaGVhZGVyLnJlc3BvbnNlX2NvZGUpOworCQlyYyA9IC1FSU87CisJCWdvdG8gb3V0OworCX0KKwltZW1jcHkoaW5mby0+cmVjb2duaXplZCwgZGF0YS0+c2NjYi5yZWNvZ25pemVkLAorCSAgICAgICBTQ0xQX0NIUF9JTkZPX01BU0tfU0laRSk7CisJbWVtY3B5KGluZm8tPnN0YW5kYnksIGRhdGEtPnNjY2Iuc3RhbmRieSwKKwkgICAgICAgU0NMUF9DSFBfSU5GT19NQVNLX1NJWkUpOworCW1lbWNweShpbmZvLT5jb25maWd1cmVkLCBkYXRhLT5zY2NiLmNvbmZpZ3VyZWQsCisJICAgICAgIFNDTFBfQ0hQX0lORk9fTUFTS19TSVpFKTsKK291dDoKKwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIGRhdGEpOworCisJcmV0dXJuIHJjOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2NoYXIvc2NscF9jb25maWcuYyBiL2RyaXZlcnMvczM5MC9jaGFyL3NjbHBfY29uZmlnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMyMmU1ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvczM5MC9jaGFyL3NjbHBfY29uZmlnLmMKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqICBkcml2ZXJzL3MzOTAvY2hhci9zY2xwX2NvbmZpZy5jCisgKgorICogICAgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDA3CisgKiAgICBBdXRob3Iocyk6IEhlaWtvIENhcnN0ZW5zIDxoZWlrby5jYXJzdGVuc0BkZS5pYm0uY29tPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9jcHUuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlICJzY2xwLmgiCisKKyNkZWZpbmUgVEFHCSJzY2xwX2NvbmZpZzogIgorCitzdHJ1Y3QgY29uZl9tZ21fZGF0YSB7CisJdTggcmVzZXJ2ZWQ7CisJdTggZXZfcXVhbGlmaWVyOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworI2RlZmluZSBFVl9RVUFMX0NBUF9DSEFOR0UJMworCitzdGF0aWMgc3RydWN0IHdvcmtfc3RydWN0IHNjbHBfY3B1X2NhcGFiaWxpdHlfd29yazsKKworc3RhdGljIHZvaWQgc2NscF9jcHVfY2FwYWJpbGl0eV9ub3RpZnkoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCWludCBjcHU7CisJc3RydWN0IHN5c19kZXZpY2UgKnN5c2RldjsKKworCXByaW50ayhLRVJOX1dBUk5JTkcgVEFHICJjcHUgY2FwYWJpbGl0eSBjaGFuZ2VkLlxuIik7CisJbG9ja19jcHVfaG90cGx1ZygpOworCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KSB7CisJCXN5c2RldiA9IGdldF9jcHVfc3lzZGV2KGNwdSk7CisJCWtvYmplY3RfdWV2ZW50KCZzeXNkZXYtPmtvYmosIEtPQkpfQ0hBTkdFKTsKKwl9CisJdW5sb2NrX2NwdV9ob3RwbHVnKCk7Cit9CisKK3N0YXRpYyB2b2lkIHNjbHBfY29uZl9yZWNlaXZlcl9mbihzdHJ1Y3QgZXZidWZfaGVhZGVyICpldmJ1ZikKK3sKKwlzdHJ1Y3QgY29uZl9tZ21fZGF0YSAqY2RhdGE7CisKKwljZGF0YSA9IChzdHJ1Y3QgY29uZl9tZ21fZGF0YSAqKShldmJ1ZiArIDEpOworCWlmIChjZGF0YS0+ZXZfcXVhbGlmaWVyID09IEVWX1FVQUxfQ0FQX0NIQU5HRSkKKwkJc2NoZWR1bGVfd29yaygmc2NscF9jcHVfY2FwYWJpbGl0eV93b3JrKTsKK30KKworc3RhdGljIHN0cnVjdCBzY2xwX3JlZ2lzdGVyIHNjbHBfY29uZl9yZWdpc3RlciA9Cit7CisJLnJlY2VpdmVfbWFzayA9IEVWVFlQX0NPTkZNR01EQVRBX01BU0ssCisJLnJlY2VpdmVyX2ZuICA9IHNjbHBfY29uZl9yZWNlaXZlcl9mbiwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHNjbHBfY29uZl9pbml0KHZvaWQpCit7CisJaW50IHJjOworCisJSU5JVF9XT1JLKCZzY2xwX2NwdV9jYXBhYmlsaXR5X3dvcmssIHNjbHBfY3B1X2NhcGFiaWxpdHlfbm90aWZ5KTsKKworCXJjID0gc2NscF9yZWdpc3Rlcigmc2NscF9jb25mX3JlZ2lzdGVyKTsKKwlpZiAocmMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFRBRyAiZmFpbGVkIHRvIHJlZ2lzdGVyICglZCkuXG4iLCByYyk7CisJCXJldHVybiByYzsKKwl9CisKKwlpZiAoIShzY2xwX2NvbmZfcmVnaXN0ZXIuc2NscF9yZWNlaXZlX21hc2sgJiBFVlRZUF9DT05GTUdNREFUQV9NQVNLKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIFRBRyAibm8gY29uZmlndXJhdGlvbiBtYW5hZ2VtZW50LlxuIik7CisJCXNjbHBfdW5yZWdpc3Rlcigmc2NscF9jb25mX3JlZ2lzdGVyKTsKKwkJcmMgPSAtRU5PU1lTOworCX0KKwlyZXR1cm4gcmM7Cit9CisKK19faW5pdGNhbGwoc2NscF9jb25mX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2NoYXIvc2NscF9jcGkuYyBiL2RyaXZlcnMvczM5MC9jaGFyL3NjbHBfY3BpLmMKaW5kZXggNjVhYTJjOC4uMjlmZTJhNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2NoYXIvc2NscF9jcGkuYworKysgYi9kcml2ZXJzL3MzOTAvY2hhci9zY2xwX2NwaS5jCkBAIC00Niw3ICs0Niw3IEBACiAvKiBFdmVudCB0eXBlIHN0cnVjdHVyZSBmb3Igd3JpdGUgbWVzc2FnZSBhbmQgd3JpdGUgcHJpb3JpdHkgbWVzc2FnZSAqLwogc3RhdGljIHN0cnVjdCBzY2xwX3JlZ2lzdGVyIHNjbHBfY3BpX2V2ZW50ID0KIHsKLQkuc2VuZF9tYXNrID0gRXZUeXBfQ3RsUHJvZ0lkZW50X01hc2sKKwkuc2VuZF9tYXNrID0gRVZUWVBfQ1RMUFJPR0lERU5UX01BU0sKIH07CiAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKQEAgLTIwMSw3ICsyMDEsNyBAQAogCQkgICAgICAgImNvbnNvbGUuXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCWlmICghKHNjbHBfY3BpX2V2ZW50LnNjbHBfc2VuZF9tYXNrICYgRXZUeXBfQ3RsUHJvZ0lkZW50X01hc2spKSB7CisJaWYgKCEoc2NscF9jcGlfZXZlbnQuc2NscF9zZW5kX21hc2sgJiBFVlRZUF9DVExQUk9HSURFTlRfTUFTSykpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiY3BpOiBubyBjb250cm9sIHByb2dyYW0gaWRlbnRpZmljYXRpb24gIgogCQkgICAgICAgInN1cHBvcnRcbiIpOwogCQlzY2xwX3VucmVnaXN0ZXIoJnNjbHBfY3BpX2V2ZW50KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaGFyL3NjbHBfcXVpZXNjZS5jIGIvZHJpdmVycy9zMzkwL2NoYXIvc2NscF9xdWllc2NlLmMKaW5kZXggYmFhOGZlNi4uNDVmZjI1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2NoYXIvc2NscF9xdWllc2NlLmMKKysrIGIvZHJpdmVycy9zMzkwL2NoYXIvc2NscF9xdWllc2NlLmMKQEAgLTQzLDcgKzQzLDcgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBzY2xwX3JlZ2lzdGVyIHNjbHBfcXVpZXNjZV9ldmVudCA9IHsKLQkucmVjZWl2ZV9tYXNrID0gRXZUeXBfU2lnUXVpZXNjZV9NYXNrLAorCS5yZWNlaXZlX21hc2sgPSBFVlRZUF9TSUdRVUlFU0NFX01BU0ssCiAJLnJlY2VpdmVyX2ZuID0gc2NscF9xdWllc2NlX2hhbmRsZXIKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaGFyL3NjbHBfcncuYyBiL2RyaXZlcnMvczM5MC9jaGFyL3NjbHBfcncuYwppbmRleCAyNDg2NzgzLi5iYmQ1YjhiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2hhci9zY2xwX3J3LmMKKysrIGIvZHJpdmVycy9zMzkwL2NoYXIvc2NscF9ydy5jCkBAIC0zMCw3ICszMCw3IEBACiAKIC8qIEV2ZW50IHR5cGUgc3RydWN0dXJlIGZvciB3cml0ZSBtZXNzYWdlIGFuZCB3cml0ZSBwcmlvcml0eSBtZXNzYWdlICovCiBzdGF0aWMgc3RydWN0IHNjbHBfcmVnaXN0ZXIgc2NscF9yd19ldmVudCA9IHsKLQkuc2VuZF9tYXNrID0gRXZUeXBfTXNnX01hc2sgfCBFdlR5cF9QTXNnQ21kX01hc2sKKwkuc2VuZF9tYXNrID0gRVZUWVBfTVNHX01BU0sgfCBFVlRZUF9QTVNHQ01EX01BU0sKIH07CiAKIC8qCkBAIC02NCw3ICs2NCw3IEBACiAJbWVtc2V0KHNjY2IsIDAsIHNpemVvZihzdHJ1Y3Qgd3JpdGVfc2NjYikpOwogCXNjY2ItPmhlYWRlci5sZW5ndGggPSBzaXplb2Yoc3RydWN0IHdyaXRlX3NjY2IpOwogCXNjY2ItPm1zZ19idWYuaGVhZGVyLmxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgbXNnX2J1Zik7Ci0Jc2NjYi0+bXNnX2J1Zi5oZWFkZXIudHlwZSA9IEV2VHlwX01zZzsKKwlzY2NiLT5tc2dfYnVmLmhlYWRlci50eXBlID0gRVZUWVBfTVNHOwogCXNjY2ItPm1zZ19idWYubWRiLmhlYWRlci5sZW5ndGggPSBzaXplb2Yoc3RydWN0IG1kYik7CiAJc2NjYi0+bXNnX2J1Zi5tZGIuaGVhZGVyLnR5cGUgPSAxOwogCXNjY2ItPm1zZ19idWYubWRiLmhlYWRlci50YWcgPSAweEQ0QzRDMjQwOwkvKiBlYmNkaWMgIk1EQiAiICovCkBAIC0xMTQsNyArMTE0LDcgQEAKIAltZW1zZXQobXRvLCAwLCBzaXplb2Yoc3RydWN0IG10bykpOwogCW10by0+bGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBtdG8pOwogCW10by0+dHlwZSA9IDQ7CS8qIG1lc3NhZ2UgdGV4dCBvYmplY3QgKi8KLQltdG8tPmxpbmVfdHlwZV9mbGFncyA9IExuVHBGbGdzX0VuZFRleHQ7IC8qIGVuZCB0ZXh0ICovCisJbXRvLT5saW5lX3R5cGVfZmxhZ3MgPSBMTlRQRkxHU19FTkRURVhUOyAvKiBlbmQgdGV4dCAqLwogCiAJLyogc2V0IHBvaW50ZXIgdG8gZmlyc3QgYnl0ZSBhZnRlciBzdHJ1Y3QgbXRvLiAqLwogCWJ1ZmZlci0+Y3VycmVudF9saW5lID0gKGNoYXIgKikgKG10byArIDEpOwpAQCAtMjE1LDcgKzIxNSw3IEBACiAJCWNhc2UgJ1xhJzoJLyogYmVsbCwgb25lIGZvciBzZXZlcmFsIHRpbWVzCSovCiAJCQkvKiBzZXQgU0NMUCBzb3VuZCBhbGFybSBiaXQgaW4gR2VuZXJhbCBPYmplY3QgKi8KIAkJCWJ1ZmZlci0+c2NjYi0+bXNnX2J1Zi5tZGIuZ28uZ2VuZXJhbF9tc2dfZmxhZ3MgfD0KLQkJCQlHbnJsTXNnRmxnc19TbmRBbHJtOworCQkJCUdOUkxNU0dGTEdTX1NOREFMUk07CiAJCQlicmVhazsKIAkJY2FzZSAnXHQnOgkvKiBob3Jpem9udGFsIHRhYnVsYXRvcgkgKi8KIAkJCS8qIGNoZWNrIGlmIG5ldyBtdG8gbmVlZHMgdG8gYmUgY3JlYXRlZCAqLwpAQCAtNDUyLDEyICs0NTIsMTIgQEAKIAkJcmV0dXJuIC1FSU87CiAKIAlzY2NiID0gYnVmZmVyLT5zY2NiOwotCWlmIChzY2xwX3J3X2V2ZW50LnNjbHBfc2VuZF9tYXNrICYgRXZUeXBfTXNnX01hc2spCisJaWYgKHNjbHBfcndfZXZlbnQuc2NscF9zZW5kX21hc2sgJiBFVlRZUF9NU0dfTUFTSykKIAkJLyogVXNlIG5vcm1hbCB3cml0ZSBtZXNzYWdlICovCi0JCXNjY2ItPm1zZ19idWYuaGVhZGVyLnR5cGUgPSBFdlR5cF9Nc2c7Ci0JZWxzZSBpZiAoc2NscF9yd19ldmVudC5zY2xwX3NlbmRfbWFzayAmIEV2VHlwX1BNc2dDbWRfTWFzaykKKwkJc2NjYi0+bXNnX2J1Zi5oZWFkZXIudHlwZSA9IEVWVFlQX01TRzsKKwllbHNlIGlmIChzY2xwX3J3X2V2ZW50LnNjbHBfc2VuZF9tYXNrICYgRVZUWVBfUE1TR0NNRF9NQVNLKQogCQkvKiBVc2Ugd3JpdGUgcHJpb3JpdHkgbWVzc2FnZSAqLwotCQlzY2NiLT5tc2dfYnVmLmhlYWRlci50eXBlID0gRXZUeXBfUE1zZ0NtZDsKKwkJc2NjYi0+bXNnX2J1Zi5oZWFkZXIudHlwZSA9IEVWVFlQX1BNU0dDTUQ7CiAJZWxzZQogCQlyZXR1cm4gLUVOT1NZUzsKIAlidWZmZXItPnJlcXVlc3QuY29tbWFuZCA9IFNDTFBfQ01EV19XUklURV9FVkVOVF9EQVRBOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2NoYXIvc2NscF9zZGlhcy5jIGIvZHJpdmVycy9zMzkwL2NoYXIvc2NscF9zZGlhcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyMjgzZGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3MzOTAvY2hhci9zY2xwX3NkaWFzLmMKQEAgLTAsMCArMSwyNTUgQEAKKy8qCisgKiBTY2xwICJzdG9yZSBkYXRhIGluIGFic29sdXQgc3RvcmFnZSIKKyAqCisgKiBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDMsMjAwNworICogQXV0aG9yKHMpOiBNaWNoYWVsIEhvbHpoZXUKKyAqLworCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxhc20vc2NscC5oPgorI2luY2x1ZGUgPGFzbS9kZWJ1Zy5oPgorI2luY2x1ZGUgPGFzbS9pcGwuaD4KKyNpbmNsdWRlICJzY2xwLmgiCisjaW5jbHVkZSAic2NscF9ydy5oIgorCisjZGVmaW5lIFRSQUNFKHguLi4pIGRlYnVnX3NwcmludGZfZXZlbnQoc2RpYXNfZGJmLCAxLCB4KQorI2RlZmluZSBFUlJPUl9NU0coeC4uLikgcHJpbnRrICggS0VSTl9BTEVSVCAiU0RJQVM6ICIgeCApCisKKyNkZWZpbmUgU0RJQVNfUkVUUklFUyAzMDAKKyNkZWZpbmUgU0RJQVNfU0xFRVBfVElDS1MgNTAKKworI2RlZmluZSBFUV9TVE9SRV9EQVRBCTB4MAorI2RlZmluZSBFUV9TSVpFCQkweDEKKyNkZWZpbmUgRElfRkNQX0RVTVAJMHgwCisjZGVmaW5lIEFTQV9TSVpFXzMyCTB4MAorI2RlZmluZSBBU0FfU0laRV82NAkweDEKKyNkZWZpbmUgRVZTVEFURV9BTExfU1RPUkVECTB4MAorI2RlZmluZSBFVlNUQVRFX05PX0RBVEEJCTB4MworI2RlZmluZSBFVlNUQVRFX1BBUlRfU1RPUkVECTB4MTAKKworc3RhdGljIHN0cnVjdCBkZWJ1Z19pbmZvICpzZGlhc19kYmY7CisKK3N0YXRpYyBzdHJ1Y3Qgc2NscF9yZWdpc3RlciBzY2xwX3NkaWFzX3JlZ2lzdGVyID0geworCS5zZW5kX21hc2sgPSBFVlRZUF9TRElBU19NQVNLLAorfTsKKworc3RydWN0IHNkaWFzX2V2YnVmIHsKKwlzdHJ1Y3QJZXZidWZfaGVhZGVyIGhkcjsKKwl1OAlldmVudF9xdWFsOworCXU4CWRhdGFfaWQ7CisJdTY0CXJlc2VydmVkMjsKKwl1MzIJZXZlbnRfaWQ7CisJdTE2CXJlc2VydmVkMzsKKwl1OAlhc2Ffc2l6ZTsKKwl1OAlldmVudF9zdGF0dXM7CisJdTMyCXJlc2VydmVkNDsKKwl1MzIJYmxrX2NudDsKKwl1NjQJYXNhOworCXUzMglyZXNlcnZlZDU7CisJdTMyCWZibjsKKwl1MzIJcmVzZXJ2ZWQ2OworCXUzMglsYm47CisJdTE2CXJlc2VydmVkNzsKKwl1MTYJZGJzOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHNkaWFzX3NjY2IgeworCXN0cnVjdCBzY2NiX2hlYWRlciAgaGRyOworCXN0cnVjdCBzZGlhc19ldmJ1ZiAgZXZidWY7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdGF0aWMgc3RydWN0IHNkaWFzX3NjY2Igc2NjYiBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDQwOTYpKSk7CisKK3N0YXRpYyBpbnQgc2NscF9yZXFfZG9uZTsKK3N0YXRpYyB3YWl0X3F1ZXVlX2hlYWRfdCBzZGlhc193cTsKK3N0YXRpYyBERUZJTkVfTVVURVgoc2RpYXNfbXV0ZXgpOworCitzdGF0aWMgdm9pZCBzZGlhc19jYWxsYmFjayhzdHJ1Y3Qgc2NscF9yZXEgKnJlcXVlc3QsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHNkaWFzX3NjY2IgKnNjY2I7CisKKwlzY2NiID0gKHN0cnVjdCBzZGlhc19zY2NiICopIHJlcXVlc3QtPnNjY2I7CisJc2NscF9yZXFfZG9uZSA9IDE7CisJd2FrZV91cCgmc2RpYXNfd3EpOyAvKiBJbmZvcm0gY2FsbGVyLCB0aGF0IHJlcXVlc3QgaXMgY29tcGxldGUgKi8KKwlUUkFDRSgiY2FsbGJhY2sgZG9uZVxuIik7Cit9CisKK3N0YXRpYyBpbnQgc2RpYXNfc2NscF9zZW5kKHN0cnVjdCBzY2xwX3JlcSAqcmVxKQoreworCWludCByZXRyaWVzOworCWludCByYzsKKworCWZvciAocmV0cmllcyA9IFNESUFTX1JFVFJJRVM7IHJldHJpZXM7IHJldHJpZXMtLSkgeworCQlzY2xwX3JlcV9kb25lID0gMDsKKwkJVFJBQ0UoImFkZCByZXF1ZXN0XG4iKTsKKwkJcmMgPSBzY2xwX2FkZF9yZXF1ZXN0KHJlcSk7CisJCWlmIChyYykgeworCQkJLyogbm90IGluaXRpYXRlZCwgd2FpdCBzb21lIHRpbWUgYW5kIHJldHJ5ICovCisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJVFJBQ0UoImFkZCByZXF1ZXN0IGZhaWxlZDogcmMgPSAlaVxuIixyYyk7CisJCQlzY2hlZHVsZV90aW1lb3V0KFNESUFTX1NMRUVQX1RJQ0tTKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCS8qIGluaXRpYXRlZCwgd2FpdCBmb3IgY29tcGxldGlvbiBvZiBzZXJ2aWNlIGNhbGwgKi8KKwkJd2FpdF9ldmVudChzZGlhc193cSwgKHNjbHBfcmVxX2RvbmUgPT0gMSkpOworCQlpZiAocmVxLT5zdGF0dXMgPT0gU0NMUF9SRVFfRkFJTEVEKSB7CisJCQlUUkFDRSgic2NscCByZXF1ZXN0IGZhaWxlZFxuIik7CisJCQlyYyA9IC1FSU87CisJCQljb250aW51ZTsKKwkJfQorCQlUUkFDRSgicmVxdWVzdCBkb25lXG4iKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiByYzsKK30KKworLyoKKyAqIEdldCBudW1iZXIgb2YgYmxvY2tzICg0SykgYXZhaWxhYmxlIGluIHRoZSBIU0EKKyAqLworaW50IHNjbHBfc2RpYXNfYmxrX2NvdW50KHZvaWQpCit7CisJc3RydWN0IHNjbHBfcmVxIHJlcXVlc3Q7CisJaW50IHJjOworCisJbXV0ZXhfbG9jaygmc2RpYXNfbXV0ZXgpOworCisJbWVtc2V0KCZzY2NiLCAwLCBzaXplb2Yoc2NjYikpOworCW1lbXNldCgmcmVxdWVzdCwgMCwgc2l6ZW9mKHJlcXVlc3QpKTsKKworCXNjY2IuaGRyLmxlbmd0aCA9IHNpemVvZihzY2NiKTsKKwlzY2NiLmV2YnVmLmhkci5sZW5ndGggPSBzaXplb2Yoc3RydWN0IHNkaWFzX2V2YnVmKTsKKwlzY2NiLmV2YnVmLmhkci50eXBlID0gRVZUWVBfU0RJQVM7CisJc2NjYi5ldmJ1Zi5ldmVudF9xdWFsID0gRVFfU0laRTsKKwlzY2NiLmV2YnVmLmRhdGFfaWQgPSBESV9GQ1BfRFVNUDsKKwlzY2NiLmV2YnVmLmV2ZW50X2lkID0gNDcxMjsKKwlzY2NiLmV2YnVmLmRicyA9IDE7CisKKwlyZXF1ZXN0LnNjY2IgPSAmc2NjYjsKKwlyZXF1ZXN0LmNvbW1hbmQgPSBTQ0xQX0NNRFdfV1JJVEVfRVZFTlRfREFUQTsKKwlyZXF1ZXN0LnN0YXR1cyA9IFNDTFBfUkVRX0ZJTExFRDsKKwlyZXF1ZXN0LmNhbGxiYWNrID0gc2RpYXNfY2FsbGJhY2s7CisKKwlyYyA9IHNkaWFzX3NjbHBfc2VuZCgmcmVxdWVzdCk7CisJaWYgKHJjKSB7CisJCUVSUk9SX01TRygic2NscF9zZW5kIGZhaWxlZCBmb3IgZ2V0X25yX2Jsb2Nrc1xuIik7CisJCWdvdG8gb3V0OworCX0KKwlpZiAoc2NjYi5oZHIucmVzcG9uc2VfY29kZSAhPSAweDAwMjApIHsKKwkJVFJBQ0UoInNlbmQgZmFpbGVkOiAleFxuIiwgc2NjYi5oZHIucmVzcG9uc2VfY29kZSk7CisJCXJjID0gLUVJTzsKKwkJZ290byBvdXQ7CisJfQorCisJc3dpdGNoIChzY2NiLmV2YnVmLmV2ZW50X3N0YXR1cykgeworCQljYXNlIDA6CisJCQlyYyA9IHNjY2IuZXZidWYuYmxrX2NudDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJRVJST1JfTVNHKCJTQ0xQIGVycm9yOiAleFxuIiwgc2NjYi5ldmJ1Zi5ldmVudF9zdGF0dXMpOworCQkJcmMgPSAtRUlPOworCQkJZ290byBvdXQ7CisJfQorCVRSQUNFKCIlaSBibG9ja3NcbiIsIHJjKTsKK291dDoKKwltdXRleF91bmxvY2soJnNkaWFzX211dGV4KTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qCisgKiBDb3B5IGZyb20gSFNBIHRvIGFic29sdXRlIHN0b3JhZ2UgKG5vdCByZWVudHJhbnQpOgorICoKKyAqIEBkZXN0ICAgICA6IEFkZHJlc3Mgb2YgYnVmZmVyIHdoZXJlIGRhdGEgc2hvdWxkIGJlIGNvcGllZAorICogQHN0YXJ0X2JsazogU3RhcnQgQmxvY2sgKGJlZ2lubmluZyB3aXRoIDEpCisgKiBAbnJfYmxrcyAgOiBOdW1iZXIgb2YgNEsgYmxvY2tzIHRvIGNvcHkKKyAqCisgKiBSZXR1cm4gVmFsdWU6IDAgOiBSZXF1ZXN0ZWQgJ251bWJlcicgb2YgYmxvY2tzIG9mIGRhdGEgY29waWVkCisgKgkJIDwwOiBFUlJPUiAtIG5lZ2F0aXZlIGV2ZW50IHN0YXR1cworICovCitpbnQgc2NscF9zZGlhc19jb3B5KHZvaWQgKmRlc3QsIGludCBzdGFydF9ibGssIGludCBucl9ibGtzKQoreworCXN0cnVjdCBzY2xwX3JlcSByZXF1ZXN0OworCWludCByYzsKKworCW11dGV4X2xvY2soJnNkaWFzX211dGV4KTsKKworCW1lbXNldCgmc2NjYiwgMCwgc2l6ZW9mKHNjY2IpKTsKKwltZW1zZXQoJnJlcXVlc3QsIDAsIHNpemVvZihyZXF1ZXN0KSk7CisKKwlzY2NiLmhkci5sZW5ndGggPSBzaXplb2Yoc2NjYik7CisJc2NjYi5ldmJ1Zi5oZHIubGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBzZGlhc19ldmJ1Zik7CisJc2NjYi5ldmJ1Zi5oZHIudHlwZSA9IEVWVFlQX1NESUFTOworCXNjY2IuZXZidWYuaGRyLmZsYWdzID0gMDsKKwlzY2NiLmV2YnVmLmV2ZW50X3F1YWwgPSBFUV9TVE9SRV9EQVRBOworCXNjY2IuZXZidWYuZGF0YV9pZCA9IERJX0ZDUF9EVU1QOworCXNjY2IuZXZidWYuZXZlbnRfaWQgPSA0NzEyOworI2lmZGVmIF9fczM5MHhfXworCXNjY2IuZXZidWYuYXNhX3NpemUgPSBBU0FfU0laRV82NDsKKyNlbHNlCisJc2NjYi5ldmJ1Zi5hc2Ffc2l6ZSA9IEFTQV9TSVpFXzMyOworI2VuZGlmCisJc2NjYi5ldmJ1Zi5ldmVudF9zdGF0dXMgPSAwOworCXNjY2IuZXZidWYuYmxrX2NudCA9IG5yX2Jsa3M7CisJc2NjYi5ldmJ1Zi5hc2EgPSAodW5zaWduZWQgbG9uZylkZXN0OworCXNjY2IuZXZidWYuZmJuID0gc3RhcnRfYmxrOworCXNjY2IuZXZidWYubGJuID0gMDsKKwlzY2NiLmV2YnVmLmRicyA9IDE7CisKKwlyZXF1ZXN0LnNjY2IJID0gJnNjY2I7CisJcmVxdWVzdC5jb21tYW5kICA9IFNDTFBfQ01EV19XUklURV9FVkVOVF9EQVRBOworCXJlcXVlc3Quc3RhdHVzCSA9IFNDTFBfUkVRX0ZJTExFRDsKKwlyZXF1ZXN0LmNhbGxiYWNrID0gc2RpYXNfY2FsbGJhY2s7CisKKwlyYyA9IHNkaWFzX3NjbHBfc2VuZCgmcmVxdWVzdCk7CisJaWYgKHJjKSB7CisJCUVSUk9SX01TRygic2NscF9zZW5kIGZhaWxlZDogJXhcbiIsIHJjKTsKKwkJZ290byBvdXQ7CisJfQorCWlmIChzY2NiLmhkci5yZXNwb25zZV9jb2RlICE9IDB4MDAyMCkgeworCQlUUkFDRSgiY29weSBmYWlsZWQ6ICV4XG4iLCBzY2NiLmhkci5yZXNwb25zZV9jb2RlKTsKKwkJcmMgPSAtRUlPOworCQlnb3RvIG91dDsKKwl9CisKKwlzd2l0Y2ggKHNjY2IuZXZidWYuZXZlbnRfc3RhdHVzKSB7CisJCWNhc2UgRVZTVEFURV9BTExfU1RPUkVEOgorCQkJVFJBQ0UoImFsbCBzdG9yZWRcbiIpOworCQljYXNlIEVWU1RBVEVfUEFSVF9TVE9SRUQ6CisJCQlUUkFDRSgicGFydCBzdG9yZWQ6ICVpXG4iLCBzY2NiLmV2YnVmLmJsa19jbnQpOworCQkJYnJlYWs7CisJCWNhc2UgRVZTVEFURV9OT19EQVRBOgorCQkJVFJBQ0UoIm5vIGRhdGFcbiIpOworCQlkZWZhdWx0OgorCQkJRVJST1JfTVNHKCJFcnJvciBmcm9tIFNDTFAgd2hpbGUgY29weWluZyBoc2EuICIKKwkJCQkgICJFdmVudCBzdGF0dXMgPSAleFxuIiwKKwkJCQlzY2NiLmV2YnVmLmV2ZW50X3N0YXR1cyk7CisJCQlyYyA9IC1FSU87CisJfQorb3V0OgorCW11dGV4X3VubG9jaygmc2RpYXNfbXV0ZXgpOworCXJldHVybiByYzsKK30KKworaW50IF9faW5pdCBzZGlhc19pbml0KHZvaWQpCit7CisJaW50IHJjOworCisJaWYgKGlwbF9pbmZvLnR5cGUgIT0gSVBMX1RZUEVfRkNQX0RVTVApCisJCXJldHVybiAwOworCXNkaWFzX2RiZiA9IGRlYnVnX3JlZ2lzdGVyKCJkdW1wX3NkaWFzIiwgNCwgMSwgNCAqIHNpemVvZihsb25nKSk7CisJZGVidWdfcmVnaXN0ZXJfdmlldyhzZGlhc19kYmYsICZkZWJ1Z19zcHJpbnRmX3ZpZXcpOworCWRlYnVnX3NldF9sZXZlbChzZGlhc19kYmYsIDYpOworCXJjID0gc2NscF9yZWdpc3Rlcigmc2NscF9zZGlhc19yZWdpc3Rlcik7CisJaWYgKHJjKSB7CisJCUVSUk9SX01TRygic2NscCByZWdpc3RlciBmYWlsZWRcbiIpOworCQlyZXR1cm4gcmM7CisJfQorCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnNkaWFzX3dxKTsKKwlUUkFDRSgiaW5pdCBkb25lXG4iKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBfX2V4aXQgc2RpYXNfZXhpdCh2b2lkKQoreworCWRlYnVnX3VucmVnaXN0ZXIoc2RpYXNfZGJmKTsKKwlzY2xwX3VucmVnaXN0ZXIoJnNjbHBfc2RpYXNfcmVnaXN0ZXIpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2NoYXIvc2NscF90dHkuYyBiL2RyaXZlcnMvczM5MC9jaGFyL3NjbHBfdHR5LmMKaW5kZXggMDc2ODE2Yi4uZTNiM2QzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2NoYXIvc2NscF90dHkuYworKysgYi9kcml2ZXJzL3MzOTAvY2hhci9zY2xwX3R0eS5jCkBAIC02NDgsNyArNjQ4LDcgQEAKIAlzdWJ2ZWMgPSBzdGFydDsKIAl3aGlsZSAoc3VidmVjIDwgZW5kKSB7CiAJCXN1YnZlYyA9IGZpbmRfZ2RzX3N1YnZlY3RvcihzdWJ2ZWMsIGVuZCwKLQkJCQkJICAgIEdEU19LRVlfU2VsZkRlZlRleHRNc2cpOworCQkJCQkgICAgR0RTX0tFWV9TRUxGREVGVEVYVE1TRyk7CiAJCWlmICghc3VidmVjKQogCQkJYnJlYWs7CiAJCXNjbHBfZXZhbF9zZWxmZGVmdGV4dG1zZygoc3RydWN0IGdkc19zdWJ2ZWN0b3IgKikoc3VidmVjICsgMSksCkBAIC02NjQsNyArNjY0LDcgQEAKIAogCXZlYyA9IHN0YXJ0OwogCXdoaWxlICh2ZWMgPCBlbmQpIHsKLQkJdmVjID0gZmluZF9nZHNfdmVjdG9yKHZlYywgZW5kLCBHRFNfSURfVGV4dENtZCk7CisJCXZlYyA9IGZpbmRfZ2RzX3ZlY3Rvcih2ZWMsIGVuZCwgR0RTX0lEX1RFWFRDTUQpOwogCQlpZiAoIXZlYykKIAkJCWJyZWFrOwogCQlzY2xwX2V2YWxfdGV4dGNtZCgoc3RydWN0IGdkc19zdWJ2ZWN0b3IgKikodmVjICsgMSksCkBAIC03MDMsNyArNzAzLDcgQEAKIAogc3RhdGljIHN0cnVjdCBzY2xwX3JlZ2lzdGVyIHNjbHBfaW5wdXRfZXZlbnQgPQogewotCS5yZWNlaXZlX21hc2sgPSBFdlR5cF9PcENtZF9NYXNrIHwgRXZUeXBfUE1zZ0NtZF9NYXNrLAorCS5yZWNlaXZlX21hc2sgPSBFVlRZUF9PUENNRF9NQVNLIHwgRVZUWVBfUE1TR0NNRF9NQVNLLAogCS5zdGF0ZV9jaGFuZ2VfZm4gPSBzY2xwX3R0eV9zdGF0ZV9jaGFuZ2UsCiAJLnJlY2VpdmVyX2ZuID0gc2NscF90dHlfcmVjZWl2ZXIKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2hhci9zY2xwX3Z0MjIwLmMgYi9kcml2ZXJzL3MzOTAvY2hhci9zY2xwX3Z0MjIwLmMKaW5kZXggZjc3ZGMzMy4uNzI2MzM0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2NoYXIvc2NscF92dDIyMC5jCisrKyBiL2RyaXZlcnMvczM5MC9jaGFyL3NjbHBfdnQyMjAuYwpAQCAtOTksOCArOTksOCBAQAogCiAvKiBSZWdpc3RyYXRpb24gc3RydWN0dXJlIGZvciBvdXIgaW50ZXJlc3QgaW4gU0NMUCBldmVudCBidWZmZXJzICovCiBzdGF0aWMgc3RydWN0IHNjbHBfcmVnaXN0ZXIgc2NscF92dDIyMF9yZWdpc3RlciA9IHsKLQkuc2VuZF9tYXNrCQk9IEV2VHlwX1ZUMjIwTXNnX01hc2ssCi0JLnJlY2VpdmVfbWFzawkJPSBFdlR5cF9WVDIyME1zZ19NYXNrLAorCS5zZW5kX21hc2sJCT0gRVZUWVBfVlQyMjBNU0dfTUFTSywKKwkucmVjZWl2ZV9tYXNrCQk9IEVWVFlQX1ZUMjIwTVNHX01BU0ssCiAJLnN0YXRlX2NoYW5nZV9mbgk9IE5VTEwsCiAJLnJlY2VpdmVyX2ZuCQk9IHNjbHBfdnQyMjBfcmVjZWl2ZXJfZm4KIH07CkBAIC0yMDIsNyArMjAyLDcgQEAKIHN0YXRpYyBpbnQKIF9fc2NscF92dDIyMF9lbWl0KHN0cnVjdCBzY2xwX3Z0MjIwX3JlcXVlc3QgKnJlcXVlc3QpCiB7Ci0JaWYgKCEoc2NscF92dDIyMF9yZWdpc3Rlci5zY2xwX3NlbmRfbWFzayAmIEV2VHlwX1ZUMjIwTXNnX01hc2spKSB7CisJaWYgKCEoc2NscF92dDIyMF9yZWdpc3Rlci5zY2xwX3NlbmRfbWFzayAmIEVWVFlQX1ZUMjIwTVNHX01BU0spKSB7CiAJCXJlcXVlc3QtPnNjbHBfcmVxLnN0YXR1cyA9IFNDTFBfUkVRX0ZBSUxFRDsKIAkJcmV0dXJuIC1FSU87CiAJfQpAQCAtMjg0LDcgKzI4NCw3IEBACiAJc2NjYi0+aGVhZGVyLmxlbmd0aCA9IHNpemVvZihzdHJ1Y3Qgc2NscF92dDIyMF9zY2NiKTsKIAlzY2NiLT5oZWFkZXIuZnVuY3Rpb25fY29kZSA9IFNDTFBfTk9STUFMX1dSSVRFOwogCXNjY2ItPmhlYWRlci5yZXNwb25zZV9jb2RlID0gMHgwMDAwOwotCXNjY2ItPmV2YnVmLnR5cGUgPSBFdlR5cF9WVDIyME1zZzsKKwlzY2NiLT5ldmJ1Zi50eXBlID0gRVZUWVBfVlQyMjBNU0c7CiAJc2NjYi0+ZXZidWYubGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBldmJ1Zl9oZWFkZXIpOwogCiAJcmV0dXJuIHJlcXVlc3Q7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2hhci90YXBlLmggYi9kcml2ZXJzL3MzOTAvY2hhci90YXBlLmgKaW5kZXggYmI0ZmY1My4uM2I1MmY1YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2NoYXIvdGFwZS5oCisrKyBiL2RyaXZlcnMvczM5MC9jaGFyL3RhcGUuaApAQCAtMTAzLDYgKzEwMyw3IEBACiAJVE9fQ1JZUFRfT0ZGLAkvKiBEaXNhYmxlIGVuY3JweXRpb24gKi8KIAlUT19LRUtMX1NFVCwJLyogU2V0IEtFSyBsYWJlbCAqLwogCVRPX0tFS0xfUVVFUlksCS8qIFF1ZXJ5IEtFSyBsYWJlbCAqLworCVRPX1JEQywJCS8qIFJlYWQgZGV2aWNlIGNoYXJhY3RlcmlzdGljcyAqLwogCVRPX1NJWkUsCS8qICNlbnRyaWVzIGluIHRhcGVfb3BfdCAqLwogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2NoYXIvdGFwZV8zNTkwLmMgYi9kcml2ZXJzL3MzOTAvY2hhci90YXBlXzM1OTAuYwppbmRleCA1MGY1ZWRhLi43ZTJiMmFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2hhci90YXBlXzM1OTAuYworKysgYi9kcml2ZXJzL3MzOTAvY2hhci90YXBlXzM1OTAuYwpAQCAtNzg4LDYgKzc4OCw3IEBACiAJY2FzZSBUT19TSVpFOgogCWNhc2UgVE9fS0VLTF9TRVQ6CiAJY2FzZSBUT19LRUtMX1FVRVJZOgorCWNhc2UgVE9fUkRDOgogCQlicmVhazsKIAl9CiAJcmV0dXJuIFRBUEVfSU9fU1VDQ0VTUzsKQEAgLTE1NDksNiArMTU1MCwyNiBAQAogCXJldHVybiBUQVBFX0lPX1NUT1A7CiB9CiAKKworc3RhdGljIGludCB0YXBlXzM1OTBfcmVhZF9kZXZfY2hhcnMoc3RydWN0IHRhcGVfZGV2aWNlICpkZXZpY2UsCisJCQkJICAgIHN0cnVjdCB0YXBlXzM1OTBfcmRjX2RhdGEgKnJkY19kYXRhKQoreworCWludCByYzsKKwlzdHJ1Y3QgdGFwZV9yZXF1ZXN0ICpyZXF1ZXN0OworCisJcmVxdWVzdCA9IHRhcGVfYWxsb2NfcmVxdWVzdCgxLCBzaXplb2YoKnJkY19kYXRhKSk7CisJaWYgKElTX0VSUihyZXF1ZXN0KSkKKwkJcmV0dXJuIFBUUl9FUlIocmVxdWVzdCk7CisJcmVxdWVzdC0+b3AgPSBUT19SREM7CisJdGFwZV9jY3dfZW5kKHJlcXVlc3QtPmNwYWRkciwgQ0NXX0NNRF9SREMsIHNpemVvZigqcmRjX2RhdGEpLAorCQkgICAgIHJlcXVlc3QtPmNwZGF0YSk7CisJcmMgPSB0YXBlX2RvX2lvKGRldmljZSwgcmVxdWVzdCk7CisJaWYgKHJjID09IDApCisJCW1lbWNweShyZGNfZGF0YSwgcmVxdWVzdC0+Y3BkYXRhLCBzaXplb2YoKnJkY19kYXRhKSk7CisJdGFwZV9mcmVlX3JlcXVlc3QocmVxdWVzdCk7CisJcmV0dXJuIHJjOworfQorCiAvKgogICogU2V0dXAgZGV2aWNlIGZ1bmN0aW9uCiAgKi8KQEAgLTE1NTcsNyArMTU3OCw3IEBACiB7CiAJaW50IHJjOwogCXN0cnVjdCB0YXBlXzM1OTBfZGlzY19kYXRhICpkYXRhOwotCWNoYXIgKnJkY19kYXRhOworCXN0cnVjdCB0YXBlXzM1OTBfcmRjX2RhdGEgKnJkY19kYXRhOwogCiAJREJGX0VWRU5UKDYsICIzNTkwIGRldmljZSBzZXR1cFxuIik7CiAJZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB0YXBlXzM1OTBfZGlzY19kYXRhKSwgR0ZQX0tFUk5FTCB8IEdGUF9ETUEpOwpAQCAtMTU2NiwxMiArMTU4NywxMiBAQAogCWRhdGEtPnJlYWRfYmFja19vcCA9IFJFQURfUFJFVklPVVM7CiAJZGV2aWNlLT5kaXNjZGF0YSA9IGRhdGE7CiAKLQlyZGNfZGF0YSA9IGttYWxsb2MoNjQsIEdGUF9LRVJORUwgfCBHRlBfRE1BKTsKKwlyZGNfZGF0YSA9IGttYWxsb2Moc2l6ZW9mKCpyZGNfZGF0YSksIEdGUF9LRVJORUwgfCBHRlBfRE1BKTsKIAlpZiAoIXJkY19kYXRhKSB7CiAJCXJjID0gLUVOT01FTTsKIAkJZ290byBmYWlsX2ttYWxsb2M7CiAJfQotCXJjID0gcmVhZF9kZXZfY2hhcnMoZGV2aWNlLT5jZGV2LCAodm9pZCoqKSZyZGNfZGF0YSwgNjQpOworCXJjID0gdGFwZV8zNTkwX3JlYWRfZGV2X2NoYXJzKGRldmljZSwgcmRjX2RhdGEpOwogCWlmIChyYykgewogCQlEQkZfTEgoMywgIlJlYWQgZGV2aWNlIGNoYXJhY3RlcmlzdGljcyBmYWlsZWQhXG4iKTsKIAkJZ290byBmYWlsX2ttYWxsb2M7CkBAIC0xNTc5LDcgKzE2MDAsNyBAQAogCXJjID0gdGFwZV9zdGRfYXNzaWduKGRldmljZSk7CiAJaWYgKHJjKQogCQlnb3RvIGZhaWxfcmRjX2RhdGE7Ci0JaWYgKHJkY19kYXRhWzMxXSA9PSAweDEzKSB7CisJaWYgKHJkY19kYXRhLT5kYXRhWzMxXSA9PSAweDEzKSB7CiAJCVBSSU5UX0lORk8oIkRldmljZSBoYXMgY3J5cHRvIHN1cHBvcnRcbiIpOwogCQlkYXRhLT5jcnlwdF9pbmZvLmNhcGFiaWxpdHkgfD0gVEFQRTM5MF9DUllQVF9TVVBQT1JURURfTUFTSzsKIAkJdGFwZV8zNTkyX2Rpc2FibGVfY3J5cHQoZGV2aWNlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaGFyL3RhcGVfMzU5MC5oIGIvZHJpdmVycy9zMzkwL2NoYXIvdGFwZV8zNTkwLmgKaW5kZXggYWE1MTM4OC4uNDUzNDA1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2NoYXIvdGFwZV8zNTkwLmgKKysrIGIvZHJpdmVycy9zMzkwL2NoYXIvdGFwZV8zNTkwLmgKQEAgLTEyOSw2ICsxMjksMTAgQEAKIAljaGFyIHBhZDJbMTE2XTsKIH0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCitzdHJ1Y3QgdGFwZV8zNTkwX3JkY19kYXRhIHsKKwljaGFyIGRhdGFbNjRdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKIC8qIERhdGFzdHJ1Y3R1cmVzIGZvciAzNTkyIGVuY3J5cHRpb24gc3VwcG9ydCAqLwogCiBzdHJ1Y3QgdGFwZTM1OTJfa2VrbCB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2hhci90YXBlX2NvcmUuYyBiL2RyaXZlcnMvczM5MC9jaGFyL3RhcGVfY29yZS5jCmluZGV4IGUyYThhMWEuLjJmYWU2MzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaGFyL3RhcGVfY29yZS5jCisrKyBiL2RyaXZlcnMvczM5MC9jaGFyL3RhcGVfY29yZS5jCkBAIC03Myw3ICs3Myw3IEBACiAJW1RPX0RJU10gPSAiRElTIiwJW1RPX0FTU0lHTl0gPSAiQVNTIiwKIAlbVE9fVU5BU1NJR05dID0gIlVBUyIsICBbVE9fQ1JZUFRfT05dID0gIkNPTiIsCiAJW1RPX0NSWVBUX09GRl0gPSAiQ09GIiwJW1RPX0tFS0xfU0VUXSA9ICJLTFMiLAotCVtUT19LRUtMX1FVRVJZXSA9ICJLTFEiLAorCVtUT19LRUtMX1FVRVJZXSA9ICJLTFEiLFtUT19SRENdID0gIlJEQyIsCiB9OwogCiBzdGF0aWMgaW50CkBAIC05MTEsNiArOTExLDcgQEAKIAkJY2FzZSBUT19BU1NJR046CiAJCWNhc2UgVE9fVU5BU1NJR046CiAJCWNhc2UgVE9fUkVBRF9BVFRNU0c6CisJCWNhc2UgVE9fUkRDOgogCQkJaWYgKGRldmljZS0+dGFwZV9zdGF0ZSA9PSBUU19JTklUKQogCQkJCWJyZWFrOwogCQkJaWYgKGRldmljZS0+dGFwZV9zdGF0ZSA9PSBUU19VTlVTRUQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2hhci92bWxvZ3Jkci5jIGIvZHJpdmVycy9zMzkwL2NoYXIvdm1sb2dyZHIuYwppbmRleCBiODdkM2IwLi5hNWEwMGU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2hhci92bWxvZ3Jkci5jCisrKyBiL2RyaXZlcnMvczM5MC9jaGFyL3ZtbG9ncmRyLmMKQEAgLTEyNSw3ICsxMjUsNyBAQAogCSAgLnJlY29yZGluZ19uYW1lID0gIkVSRVAiLAogCSAgLm1pbm9yX251bSAgICAgID0gMCwKIAkgIC5idWZmZXJfZnJlZSAgICA9IDEsCi0JICAucHJpdl9sb2NrICAgICAgPSBTUElOX0xPQ0tfVU5MT0NLRUQsCisJICAucHJpdl9sb2NrCSAgPSBfX1NQSU5fTE9DS19VTkxPQ0tFRChzeXNfc2VyWzBdLnByaXZfbG9jayksCiAJICAuYXV0b3JlY29yZGluZyAgPSAxLAogCSAgLmF1dG9wdXJnZSAgICAgID0gMSwKIAl9LApAQCAtMTM0LDcgKzEzNCw3IEBACiAJICAucmVjb3JkaW5nX25hbWUgPSAiQUNDT1VOVCIsCiAJICAubWlub3JfbnVtICAgICAgPSAxLAogCSAgLmJ1ZmZlcl9mcmVlICAgID0gMSwKLQkgIC5wcml2X2xvY2sgICAgICA9IFNQSU5fTE9DS19VTkxPQ0tFRCwKKwkgIC5wcml2X2xvY2sJICA9IF9fU1BJTl9MT0NLX1VOTE9DS0VEKHN5c19zZXJbMV0ucHJpdl9sb2NrKSwKIAkgIC5hdXRvcmVjb3JkaW5nICA9IDEsCiAJICAuYXV0b3B1cmdlICAgICAgPSAxLAogCX0sCkBAIC0xNDMsNyArMTQzLDcgQEAKIAkgIC5yZWNvcmRpbmdfbmFtZSA9ICJTWU1QVE9NIiwKIAkgIC5taW5vcl9udW0gICAgICA9IDIsCiAJICAuYnVmZmVyX2ZyZWUgICAgPSAxLAotCSAgLnByaXZfbG9jayAgICAgID0gU1BJTl9MT0NLX1VOTE9DS0VELAorCSAgLnByaXZfbG9jawkgID0gX19TUElOX0xPQ0tfVU5MT0NLRUQoc3lzX3NlclsyXS5wcml2X2xvY2spLAogCSAgLmF1dG9yZWNvcmRpbmcgID0gMSwKIAkgIC5hdXRvcHVyZ2UgICAgICA9IDEsCiAJfQpAQCAtMzg1LDYgKzM4NSw5IEBACiAKIAlzdHJ1Y3Qgdm1sb2dyZHJfcHJpdl90ICogbG9ncHRyID0gZmlscC0+cHJpdmF0ZV9kYXRhOwogCisJaXVjdl9wYXRoX3NldmVyKGxvZ3B0ci0+cGF0aCwgTlVMTCk7CisJa2ZyZWUobG9ncHRyLT5wYXRoKTsKKwlsb2dwdHItPnBhdGggPSBOVUxMOwogCWlmIChsb2dwdHItPmF1dG9yZWNvcmRpbmcpIHsKIAkJcmV0ID0gdm1sb2dyZHJfcmVjb3JkaW5nKGxvZ3B0ciwwLGxvZ3B0ci0+YXV0b3B1cmdlKTsKIAkJaWYgKHJldCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaGFyL3pjb3JlLmMgYi9kcml2ZXJzL3MzOTAvY2hhci96Y29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5ZDQzOTMxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zMzkwL2NoYXIvemNvcmUuYwpAQCAtMCwwICsxLDY1MSBAQAorLyoKKyAqIHpjb3JlIG1vZHVsZSB0byBleHBvcnQgbWVtb3J5IGNvbnRlbnQgYW5kIHJlZ2lzdGVyIHNldHMgZm9yIGNyZWF0aW5nIHN5c3RlbQorICogZHVtcHMgb24gU0NTSSBkaXNrcyAoemZjcGR1bXApLiBUaGUgInpjb3JlL21lbSIgZGVidWdmcyBmaWxlIHNob3dzIHRoZSBzYW1lCisgKiBkdW1wIGZvcm1hdCBhcyBzMzkwIHN0YW5kYWxvbmUgZHVtcHMuCisgKgorICogRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHJlZmVyIHRvIERvY3VtZW50YXRpb24vczM5MC96ZmNwZHVtcC50eHQKKyAqCisgKiBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDMsMjAwNworICogQXV0aG9yKHMpOiBNaWNoYWVsIEhvbHpoZXUKKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC91dHNuYW1lLmg+CisjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgorI2luY2x1ZGUgPGFzbS9pcGwuaD4KKyNpbmNsdWRlIDxhc20vc2NscC5oPgorI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgorI2luY2x1ZGUgPGFzbS9zaWdwLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vZGVidWcuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL2lycWZsYWdzLmg+CisKKyNkZWZpbmUgVFJBQ0UoeC4uLikgZGVidWdfc3ByaW50Zl9ldmVudCh6Y29yZV9kYmYsIDEsIHgpCisjZGVmaW5lIE1TRyh4Li4uKSBwcmludGsoIEtFUk5fQUxFUlQgeCApCisjZGVmaW5lIEVSUk9SX01TRyh4Li4uKSBwcmludGsgKCBLRVJOX0FMRVJUICJEVU1QOiAiIHggKQorCisjZGVmaW5lIFRPX1VTRVIJCTAKKyNkZWZpbmUgVE9fS0VSTkVMCTEKKworZW51bSBhcmNoX2lkIHsKKwlBUkNIX1MzOTAJPSAwLAorCUFSQ0hfUzM5MFgJPSAxLAorfTsKKworLyogZHVtcCBzeXN0ZW0gaW5mbyAqLworCitzdHJ1Y3Qgc3lzX2luZm8geworCWVudW0gYXJjaF9pZAlhcmNoOworCXVuc2lnbmVkIGxvbmcJc2FfYmFzZTsKKwl1MzIJCXNhX3NpemU7CisJaW50CQljcHVfbWFwW05SX0NQVVNdOworCXVuc2lnbmVkIGxvbmcJbWVtX3NpemU7CisJdW5pb24gc2F2ZV9hcmVhCWxjX21hc2s7Cit9OworCitzdGF0aWMgc3RydWN0IHN5c19pbmZvIHN5c19pbmZvOworc3RhdGljIHN0cnVjdCBkZWJ1Z19pbmZvICp6Y29yZV9kYmY7CitzdGF0aWMgaW50IGhzYV9hdmFpbGFibGU7CitzdGF0aWMgc3RydWN0IGRlbnRyeSAqemNvcmVfZGlyOworc3RhdGljIHN0cnVjdCBkZW50cnkgKnpjb3JlX2ZpbGU7CisKKy8qCisgKiBDb3B5IG1lbW9yeSBmcm9tIEhTQSB0byBrZXJuZWwgb3IgdXNlciBtZW1vcnkgKG5vdCByZWVudHJhbnQpOgorICoKKyAqIEBkZXN0OiAgS2VybmVsIG9yIHVzZXIgYnVmZmVyIHdoZXJlIG1lbW9yeSBzaG91bGQgYmUgY29waWVkIHRvCisgKiBAc3JjOiAgIFN0YXJ0IGFkZHJlc3Mgd2l0aGluIEhTQSB3aGVyZSBkYXRhIHNob3VsZCBiZSBjb3BpZWQKKyAqIEBjb3VudDogU2l6ZSBvZiBidWZmZXIsIHdoaWNoIHNob3VsZCBiZSBjb3BpZWQKKyAqIEBtb2RlOiAgRWl0aGVyIFRPX0tFUk5FTCBvciBUT19VU0VSCisgKi8KK3N0YXRpYyBpbnQgbWVtY3B5X2hzYSh2b2lkICpkZXN0LCB1bnNpZ25lZCBsb25nIHNyYywgc2l6ZV90IGNvdW50LCBpbnQgbW9kZSkKK3sKKwlpbnQgb2ZmcywgYmxrX251bTsKKwlzdGF0aWMgY2hhciBidWZbUEFHRV9TSVpFXSBfX2F0dHJpYnV0ZV9fKChfX2FsaWduZWRfXyhQQUdFX1NJWkUpKSk7CisKKwlpZiAoY291bnQgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwkvKiBjb3B5IGZpcnN0IGJsb2NrICovCisJb2ZmcyA9IDA7CisJaWYgKChzcmMgJSBQQUdFX1NJWkUpICE9IDApIHsKKwkJYmxrX251bSA9IHNyYyAvIFBBR0VfU0laRSArIDI7CisJCWlmIChzY2xwX3NkaWFzX2NvcHkoYnVmLCBibGtfbnVtLCAxKSkgeworCQkJVFJBQ0UoInNjbHBfc2RpYXNfY29weSgpIGZhaWxlZFxuIik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQlvZmZzID0gbWluKChQQUdFX1NJWkUgLSAoc3JjICUgUEFHRV9TSVpFKSksIGNvdW50KTsKKwkJaWYgKG1vZGUgPT0gVE9fVVNFUikgeworCQkJaWYgKGNvcHlfdG9fdXNlcigoX19mb3JjZSBfX3VzZXIgdm9pZCopIGRlc3QsCisJCQkJCSBidWYgKyAoc3JjICUgUEFHRV9TSVpFKSwgb2ZmcykpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0gZWxzZQorCQkJbWVtY3B5KGRlc3QsIGJ1ZiArIChzcmMgJSBQQUdFX1NJWkUpLCBvZmZzKTsKKwl9CisJaWYgKG9mZnMgPT0gY291bnQpCisJCWdvdG8gb3V0OworCisJLyogY29weSBtaWRkbGUgKi8KKwlmb3IgKDsgKG9mZnMgKyBQQUdFX1NJWkUpIDw9IGNvdW50OyBvZmZzICs9IFBBR0VfU0laRSkgeworCQlibGtfbnVtID0gKHNyYyArIG9mZnMpIC8gUEFHRV9TSVpFICsgMjsKKwkJaWYgKHNjbHBfc2RpYXNfY29weShidWYsIGJsa19udW0sIDEpKSB7CisJCQlUUkFDRSgic2NscF9zZGlhc19jb3B5KCkgZmFpbGVkXG4iKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJCWlmIChtb2RlID09IFRPX1VTRVIpIHsKKwkJCWlmIChjb3B5X3RvX3VzZXIoKF9fZm9yY2UgX191c2VyIHZvaWQqKSBkZXN0ICsgb2ZmcywKKwkJCQkJIGJ1ZiwgUEFHRV9TSVpFKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfSBlbHNlCisJCQltZW1jcHkoZGVzdCArIG9mZnMsIGJ1ZiwgUEFHRV9TSVpFKTsKKwl9CisJaWYgKG9mZnMgPT0gY291bnQpCisJCWdvdG8gb3V0OworCisJLyogY29weSBsYXN0IGJsb2NrICovCisJYmxrX251bSA9IChzcmMgKyBvZmZzKSAvIFBBR0VfU0laRSArIDI7CisJaWYgKHNjbHBfc2RpYXNfY29weShidWYsIGJsa19udW0sIDEpKSB7CisJCVRSQUNFKCJzY2xwX3NkaWFzX2NvcHkoKSBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJaWYgKG1vZGUgPT0gVE9fVVNFUikgeworCQlpZiAoY29weV90b191c2VyKChfX2ZvcmNlIF9fdXNlciB2b2lkKikgZGVzdCArIG9mZnMsIGJ1ZiwKKwkJCQkgUEFHRV9TSVpFKSkKKwkJCXJldHVybiAtRUZBVUxUOworCX0gZWxzZQorCQltZW1jcHkoZGVzdCArIG9mZnMsIGJ1ZiwgY291bnQgLSBvZmZzKTsKK291dDoKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtZW1jcHlfaHNhX3VzZXIodm9pZCBfX3VzZXIgKmRlc3QsIHVuc2lnbmVkIGxvbmcgc3JjLCBzaXplX3QgY291bnQpCit7CisJcmV0dXJuIG1lbWNweV9oc2EoKHZvaWQgX19mb3JjZSAqKSBkZXN0LCBzcmMsIGNvdW50LCBUT19VU0VSKTsKK30KKworc3RhdGljIGludCBtZW1jcHlfaHNhX2tlcm5lbCh2b2lkICpkZXN0LCB1bnNpZ25lZCBsb25nIHNyYywgc2l6ZV90IGNvdW50KQoreworCXJldHVybiBtZW1jcHlfaHNhKGRlc3QsIHNyYywgY291bnQsIFRPX0tFUk5FTCk7Cit9CisKK3N0YXRpYyBpbnQgbWVtY3B5X3JlYWwodm9pZCAqZGVzdCwgdW5zaWduZWQgbG9uZyBzcmMsIHNpemVfdCBjb3VudCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByYyA9IC1FRkFVTFQ7CisJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBfZGVzdCBhc20oIjIiKSA9ICh1bnNpZ25lZCBsb25nKSBkZXN0OworCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgX2xlbjEgYXNtKCIzIikgPSAodW5zaWduZWQgbG9uZykgY291bnQ7CisJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBfc3JjICBhc20oIjQiKSA9IHNyYzsKKwlyZWdpc3RlciB1bnNpZ25lZCBsb25nIF9sZW4yIGFzbSgiNSIpID0gKHVuc2lnbmVkIGxvbmcpIGNvdW50OworCisJaWYgKGNvdW50ID09IDApCisJCXJldHVybiAwOworCWZsYWdzID0gX19yYXdfbG9jYWxfaXJxX3N0bnNtKDB4ZjgpOyAvKiBzd2l0Y2ggdG8gcmVhbCBtb2RlICovCisJYXNtIHZvbGF0aWxlICgKKwkJIjA6CW12Y2xlCSUxLCUyLDB4MFxuIgorCQkiMToJam8JMGJcbiIKKwkJIglsaGkJJTAsMHgwXG4iCisJCSIyOlxuIgorCQlFWF9UQUJMRSgxYiwyYikKKwkJOiAiK2QiIChyYykKKwkJOiAiZCIgKF9kZXN0KSwgImQiIChfc3JjKSwgImQiIChfbGVuMSksICJkIiAoX2xlbjIpCisJCTogImNjIiwgIm1lbW9yeSIpOworCV9fcmF3X2xvY2FsX2lycV9zc20oZmxhZ3MpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IG1lbWNweV9yZWFsX3VzZXIoX191c2VyIHZvaWQgKmRlc3QsIHVuc2lnbmVkIGxvbmcgc3JjLCBzaXplX3QgY291bnQpCit7CisJc3RhdGljIGNoYXIgYnVmWzQwOTZdOworCWludCBvZmZzID0gMCwgc2l6ZTsKKworCXdoaWxlIChvZmZzIDwgY291bnQpIHsKKwkJc2l6ZSA9IG1pbihzaXplb2YoYnVmKSwgY291bnQgLSBvZmZzKTsKKwkJaWYgKG1lbWNweV9yZWFsKGJ1Ziwgc3JjICsgb2Zmcywgc2l6ZSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKGNvcHlfdG9fdXNlcihkZXN0ICsgb2ZmcywgYnVmLCBzaXplKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlvZmZzICs9IHNpemU7CisJfQorCXJldHVybiAwOworfQorCisjaWZkZWYgX19zMzkweF9fCisvKgorICogQ29udmVydCBzMzkweCAoNjQgYml0KSBjcHUgaW5mbyB0byBzMzkwICgzMiBiaXQpIGNwdSBpbmZvCisgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBzMzkweF90b19zMzkwX3JlZ3ModW5pb24gc2F2ZV9hcmVhICpvdXQsIHVuaW9uIHNhdmVfYXJlYSAqaW4sCisJCQkJICAgICAgaW50IGNwdSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJCW91dC0+czM5MC5ncF9yZWdzW2ldID0gaW4tPnMzOTB4LmdwX3JlZ3NbaV0gJiAweDAwMDAwMDAwZmZmZmZmZmY7CisJCW91dC0+czM5MC5hY2NfcmVnc1tpXSA9IGluLT5zMzkweC5hY2NfcmVnc1tpXTsKKwkJb3V0LT5zMzkwLmN0cmxfcmVnc1tpXSA9CisJCQlpbi0+czM5MHguY3RybF9yZWdzW2ldICYgMHgwMDAwMDAwMGZmZmZmZmZmOworCX0KKwkvKiBsb2NvcmUgZm9yIDMxIGJpdCBoYXMgb25seSBzcGFjZSBmb3IgZnByZWdzIDAsMiw0LDYgKi8KKwlvdXQtPnMzOTAuZnBfcmVnc1swXSA9IGluLT5zMzkweC5mcF9yZWdzWzBdOworCW91dC0+czM5MC5mcF9yZWdzWzFdID0gaW4tPnMzOTB4LmZwX3JlZ3NbMl07CisJb3V0LT5zMzkwLmZwX3JlZ3NbMl0gPSBpbi0+czM5MHguZnBfcmVnc1s0XTsKKwlvdXQtPnMzOTAuZnBfcmVnc1szXSA9IGluLT5zMzkweC5mcF9yZWdzWzZdOworCW1lbWNweSgmKG91dC0+czM5MC5wc3dbMF0pLCAmKGluLT5zMzkweC5wc3dbMF0pLCA0KTsKKwlvdXQtPnMzOTAucHN3WzFdIHw9IDB4ODsgLyogc2V0IGJpdCAxMiAqLworCW1lbWNweSgmKG91dC0+czM5MC5wc3dbNF0pLCYoaW4tPnMzOTB4LnBzd1sxMl0pLCA0KTsKKwlvdXQtPnMzOTAucHN3WzRdIHw9IDB4ODA7IC8qIHNldCAoMzFiaXQpIGFkZHJlc3NpbmcgYml0ICovCisJb3V0LT5zMzkwLnByZWZfcmVnID0gaW4tPnMzOTB4LnByZWZfcmVnOworCW91dC0+czM5MC50aW1lciA9IGluLT5zMzkweC50aW1lcjsKKwlvdXQtPnMzOTAuY2xrX2NtcCA9IGluLT5zMzkweC5jbGtfY21wOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgczM5MHhfdG9fczM5MF9zYXZlX2FyZWFzKHZvaWQpCit7CisJaW50IGkgPSAxOworCXN0YXRpYyB1bmlvbiBzYXZlX2FyZWEgdG1wOworCisJd2hpbGUgKHpmY3BkdW1wX3NhdmVfYXJlYXNbaV0pIHsKKwkJczM5MHhfdG9fczM5MF9yZWdzKCZ0bXAsIHpmY3BkdW1wX3NhdmVfYXJlYXNbaV0sIGkpOworCQltZW1jcHkoemZjcGR1bXBfc2F2ZV9hcmVhc1tpXSwgJnRtcCwgc2l6ZW9mKHRtcCkpOworCQlpKys7CisJfQorfQorCisjZW5kaWYgLyogX19zMzkweF9fICovCisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfY3B1X2luZm8oZW51bSBhcmNoX2lkIGFyY2gpCit7CisJdW5pb24gc2F2ZV9hcmVhICpzYTsKKworCS8qIGdldCBpbmZvIGZvciBib290IGNwdSBmcm9tIGxvd2NvcmUsIHN0b3JlZCBpbiB0aGUgSFNBICovCisKKwlzYSA9IGttYWxsb2Moc2l6ZW9mKCpzYSksIEdGUF9LRVJORUwpOworCWlmICghc2EpIHsKKwkJRVJST1JfTVNHKCJrbWFsbG9jIGZhaWxlZDogJXM6ICVpXG4iLF9fRlVOQ1RJT05fXywgX19MSU5FX18pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJaWYgKG1lbWNweV9oc2Ffa2VybmVsKHNhLCBzeXNfaW5mby5zYV9iYXNlLCBzeXNfaW5mby5zYV9zaXplKSA8IDApIHsKKwkJRVJST1JfTVNHKCJjb3VsZCBub3QgY29weSBmcm9tIEhTQVxuIik7CisJCWtmcmVlKHNhKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCXpmY3BkdW1wX3NhdmVfYXJlYXNbMF0gPSBzYTsKKworI2lmZGVmIF9fczM5MHhfXworCS8qIGNvbnZlcnQgczM5MHggcmVncyB0byBzMzkwLCBpZiB3ZSBhcmUgZHVtcGluZyBhbiBzMzkwIExpbnV4ICovCisKKwlpZiAoYXJjaCA9PSBBUkNIX1MzOTApCisJCXMzOTB4X3RvX3MzOTBfc2F2ZV9hcmVhcygpOworI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIERFRklORV9NVVRFWCh6Y29yZV9tdXRleCk7CisKKyNkZWZpbmUgRFVNUF9WRVJTSU9OCTB4MworI2RlZmluZSBEVU1QX01BR0lDCTB4YTgxOTAxNzM2MThmMjNmZFVMTAorI2RlZmluZSBEVU1QX0FSQ0hfUzM5MFgJMgorI2RlZmluZSBEVU1QX0FSQ0hfUzM5MAkxCisjZGVmaW5lIEhFQURFUl9TSVpFCTQwOTYKKworLyogZHVtcCBoZWFkZXIgZHVtcGVkIGFjY29yZGluZyB0byBzMzkwIGNyYXNoIGR1bXAgZm9ybWF0ICovCisKK3N0cnVjdCB6Y29yZV9oZWFkZXIgeworCXU2NCBtYWdpYzsKKwl1MzIgdmVyc2lvbjsKKwl1MzIgaGVhZGVyX3NpemU7CisJdTMyIGR1bXBfbGV2ZWw7CisJdTMyIHBhZ2Vfc2l6ZTsKKwl1NjQgbWVtX3NpemU7CisJdTY0IG1lbV9zdGFydDsKKwl1NjQgbWVtX2VuZDsKKwl1MzIgbnVtX3BhZ2VzOworCXUzMiBwYWQxOworCXU2NCB0b2Q7CisJY3B1aWRfdCBjcHVfaWQ7CisJdTMyIGFyY2hfaWQ7CisJdTMyIGJ1aWxkX2FyY2g7CisJY2hhciBwYWQyWzQwMTZdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsX19hbGlnbmVkX18oMTYpKSk7CisKK3N0YXRpYyBzdHJ1Y3QgemNvcmVfaGVhZGVyIHpjb3JlX2hlYWRlciA9IHsKKwkubWFnaWMJCT0gRFVNUF9NQUdJQywKKwkudmVyc2lvbgk9IERVTVBfVkVSU0lPTiwKKwkuaGVhZGVyX3NpemUJPSA0MDk2LAorCS5kdW1wX2xldmVsCT0gMCwKKwkucGFnZV9zaXplCT0gUEFHRV9TSVpFLAorCS5tZW1fc3RhcnQJPSAwLAorI2lmZGVmIF9fczM5MHhfXworCS5idWlsZF9hcmNoCT0gRFVNUF9BUkNIX1MzOTBYLAorI2Vsc2UKKwkuYnVpbGRfYXJjaAk9IERVTVBfQVJDSF9TMzkwLAorI2VuZGlmCit9OworCisvKgorICogQ29weSBsb3djb3JlIGluZm8gdG8gYnVmZmVyLiBVc2UgbWFwIGluIG9yZGVyIHRvIGNvcHkgb25seSByZWdpc3RlciBwYXJ0cy4KKyAqCisgKiBAYnVmOiAgICBVc2VyIGJ1ZmZlcgorICogQHNhOiAgICAgUG9pbnRlciB0byBzYXZlIGFyZWEKKyAqIEBzYV9vZmY6IE9mZnNldCBpbiBzYXZlIGFyZWEgdG8gY29weQorICogQGxlbjogICAgTnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHkKKyAqLworc3RhdGljIGludCBjb3B5X2xjKHZvaWQgX191c2VyICpidWYsIHZvaWQgKnNhLCBpbnQgc2Ffb2ZmLCBpbnQgbGVuKQoreworCWludCBpOworCWNoYXIgKmxjX21hc2sgPSAoY2hhciopJnN5c19pbmZvLmxjX21hc2s7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJaWYgKCFsY19tYXNrW2kgKyBzYV9vZmZdKQorCQkJY29udGludWU7CisJCWlmIChjb3B5X3RvX3VzZXIoYnVmICsgaSwgc2EgKyBzYV9vZmYgKyBpLCAxKSkKKwkJCXJldHVybiAtRUZBVUxUOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENvcHkgbG93Y29yZXMgaW5mbyB0byBtZW1vcnksIGlmIG5lY2Vzc2FyeQorICoKKyAqIEBidWY6ICAgVXNlciBidWZmZXIKKyAqIEBhZGRyOiAgU3RhcnQgYWRkcmVzcyBvZiBidWZmZXIgaW4gZHVtcCBtZW1vcnkKKyAqIEBjb3VudDogU2l6ZSBvZiBidWZmZXIKKyAqLworc3RhdGljIGludCB6Y29yZV9hZGRfbGMoY2hhciBfX3VzZXIgKmJ1ZiwgdW5zaWduZWQgbG9uZyBzdGFydCwgc2l6ZV90IGNvdW50KQoreworCXVuc2lnbmVkIGxvbmcgZW5kOworCWludCBpID0gMDsKKworCWlmIChjb3VudCA9PSAwKQorCQlyZXR1cm4gMDsKKworCWVuZCA9IHN0YXJ0ICsgY291bnQ7CisJd2hpbGUgKHpmY3BkdW1wX3NhdmVfYXJlYXNbaV0pIHsKKwkJdW5zaWduZWQgbG9uZyBjcF9zdGFydCwgY3BfZW5kOyAvKiBjb3B5IHJhbmdlICovCisJCXVuc2lnbmVkIGxvbmcgc2Ffc3RhcnQsIHNhX2VuZDsgLyogc2F2ZSBhcmVhIHJhbmdlICovCisJCXVuc2lnbmVkIGxvbmcgcHJlZml4OworCQl1bnNpZ25lZCBsb25nIHNhX29mZiwgbGVuLCBidWZfb2ZmOworCisJCWlmIChzeXNfaW5mby5hcmNoID09IEFSQ0hfUzM5MCkKKwkJCXByZWZpeCA9IHpmY3BkdW1wX3NhdmVfYXJlYXNbaV0tPnMzOTAucHJlZl9yZWc7CisJCWVsc2UKKwkJCXByZWZpeCA9IHpmY3BkdW1wX3NhdmVfYXJlYXNbaV0tPnMzOTB4LnByZWZfcmVnOworCisJCXNhX3N0YXJ0ID0gcHJlZml4ICsgc3lzX2luZm8uc2FfYmFzZTsKKwkJc2FfZW5kID0gcHJlZml4ICsgc3lzX2luZm8uc2FfYmFzZSArIHN5c19pbmZvLnNhX3NpemU7CisKKwkJaWYgKChlbmQgPCBzYV9zdGFydCkgfHwgKHN0YXJ0ID4gc2FfZW5kKSkKKwkJCWdvdG8gbmV4dDsKKwkJY3Bfc3RhcnQgPSBtYXgoc3RhcnQsIHNhX3N0YXJ0KTsKKwkJY3BfZW5kID0gbWluKGVuZCwgc2FfZW5kKTsKKworCQlidWZfb2ZmID0gY3Bfc3RhcnQgLSBzdGFydDsKKwkJc2Ffb2ZmID0gY3Bfc3RhcnQgLSBzYV9zdGFydDsKKwkJbGVuID0gY3BfZW5kIC0gY3Bfc3RhcnQ7CisKKwkJVFJBQ0UoImNvcHlfbGMgZm9yOiAlbHhcbiIsIHN0YXJ0KTsKKwkJaWYgKGNvcHlfbGMoYnVmICsgYnVmX29mZiwgemZjcGR1bXBfc2F2ZV9hcmVhc1tpXSwgc2Ffb2ZmLCBsZW4pKQorCQkJcmV0dXJuIC1FRkFVTFQ7CituZXh0OgorCQlpKys7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogUmVhZCByb3V0aW5lIGZvciB6Y29yZSBjaGFyYWN0ZXIgZGV2aWNlCisgKiBGaXJzdCA0SyBhcmUgZHVtcCBoZWFkZXIKKyAqIE5leHQgMzJNQiBhcmUgSFNBIE1lbW9yeQorICogUmVzdCBpcyByZWFkIGZyb20gYWJzb2x1dGUgTWVtb3J5CisgKi8KK3N0YXRpYyBzc2l6ZV90IHpjb3JlX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwKKwkJCSAgbG9mZl90ICpwcG9zKQoreworCXVuc2lnbmVkIGxvbmcgbWVtX3N0YXJ0OyAvKiBTdGFydCBhZGRyZXNzIGluIG1lbW9yeSAqLworCXNpemVfdCBtZW1fb2ZmczsJIC8qIE9mZnNldCBpbiBkdW1wIG1lbW9yeSAqLworCXNpemVfdCBoZHJfY291bnQ7CSAvKiBTaXplIG9mIGhlYWRlciBwYXJ0IG9mIG91dHB1dCBidWZmZXIgKi8KKwlzaXplX3Qgc2l6ZTsKKwlpbnQgcmM7CisKKwltdXRleF9sb2NrKCZ6Y29yZV9tdXRleCk7CisKKwlpZiAoKnBwb3MgPiAoc3lzX2luZm8ubWVtX3NpemUgKyBIRUFERVJfU0laRSkpIHsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGZhaWw7CisJfQorCisJY291bnQgPSBtaW4oY291bnQsIChzaXplX3QpIChzeXNfaW5mby5tZW1fc2l6ZSArIEhFQURFUl9TSVpFIC0gKnBwb3MpKTsKKworCS8qIENvcHkgZHVtcCBoZWFkZXIgKi8KKwlpZiAoKnBwb3MgPCBIRUFERVJfU0laRSkgeworCQlzaXplID0gbWluKGNvdW50LCAoc2l6ZV90KSAoSEVBREVSX1NJWkUgLSAqcHBvcykpOworCQlpZiAoY29weV90b191c2VyKGJ1ZiwgJnpjb3JlX2hlYWRlciArICpwcG9zLCBzaXplKSkgeworCQkJcmMgPSAtRUZBVUxUOworCQkJZ290byBmYWlsOworCQl9CisJCWhkcl9jb3VudCA9IHNpemU7CisJCW1lbV9zdGFydCA9IDA7CisJfSBlbHNlIHsKKwkJaGRyX2NvdW50ID0gMDsKKwkJbWVtX3N0YXJ0ID0gKnBwb3MgLSBIRUFERVJfU0laRTsKKwl9CisKKwltZW1fb2ZmcyA9IDA7CisKKwkvKiBDb3B5IGZyb20gSFNBIGRhdGEgKi8KKwlpZiAoKnBwb3MgPCAoWkZDUERVTVBfSFNBX1NJWkUgKyBIRUFERVJfU0laRSkpIHsKKwkJc2l6ZSA9IG1pbigoY291bnQgLSBoZHJfY291bnQpLCAoc2l6ZV90KSAoWkZDUERVTVBfSFNBX1NJWkUKKwkJCSAgIC0gbWVtX3N0YXJ0KSk7CisJCXJjID0gbWVtY3B5X2hzYV91c2VyKGJ1ZiArIGhkcl9jb3VudCwgbWVtX3N0YXJ0LCBzaXplKTsKKwkJaWYgKHJjKQorCQkJZ290byBmYWlsOworCisJCW1lbV9vZmZzICs9IHNpemU7CisJfQorCisJLyogQ29weSBmcm9tIHJlYWwgbWVtICovCisJc2l6ZSA9IGNvdW50IC0gbWVtX29mZnMgLSBoZHJfY291bnQ7CisJcmMgPSBtZW1jcHlfcmVhbF91c2VyKGJ1ZiArIGhkcl9jb3VudCArIG1lbV9vZmZzLCBtZW1fc3RhcnQgKyBtZW1fb2ZmcywKKwkJCSAgICAgIHNpemUpOworCWlmIChyYykKKwkJZ290byBmYWlsOworCisJLyoKKwkgKiBTaW5jZSBzMzkwIGR1bXAgYW5hbHlzaXMgdG9vbHMgbGlrZSBsY3Jhc2ggb3IgY3Jhc2gKKwkgKiBleHBlY3QgcmVnaXN0ZXIgc2V0cyBpbiB0aGUgcHJlZml4IHBhZ2VzIG9mIHRoZSBjcHVzLAorCSAqIHdlIGNvcHkgdGhlbSBpbnRvIHRoZSByZWFkIGJ1ZmZlciwgaWYgbmVjZXNzYXJ5LgorCSAqIGJ1ZiArIGhkcl9jb3VudDogU3RhcnQgb2YgbWVtb3J5IHBhcnQgb2Ygb3V0cHV0IGJ1ZmZlcgorCSAqIG1lbV9zdGFydDogU3RhcnQgbWVtb3J5IGFkZHJlc3MgdG8gY29weSBmcm9tCisJICogY291bnQgLSBoZHJfY291bnQ6IFNpemUgb2YgbWVtb3J5IGFyZWEgdG8gY29weQorCSAqLworCWlmICh6Y29yZV9hZGRfbGMoYnVmICsgaGRyX2NvdW50LCBtZW1fc3RhcnQsIGNvdW50IC0gaGRyX2NvdW50KSkgeworCQlyYyA9IC1FRkFVTFQ7CisJCWdvdG8gZmFpbDsKKwl9CisJKnBwb3MgKz0gY291bnQ7CitmYWlsOgorCW11dGV4X3VubG9jaygmemNvcmVfbXV0ZXgpOworCXJldHVybiAocmMgPCAwKSA/IHJjIDogY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgemNvcmVfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlpZiAoIWhzYV9hdmFpbGFibGUpCisJCXJldHVybiAtRU5PREFUQTsKKwllbHNlCisJCXJldHVybiBjYXBhYmxlKENBUF9TWVNfUkFXSU8pID8gMCA6IC1FUEVSTTsKK30KKworc3RhdGljIGludCB6Y29yZV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlcCkKK3sKKwlkaWFnMzA4KERJQUczMDhfUkVMX0hTQSwgTlVMTCk7CisJaHNhX2F2YWlsYWJsZSA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBsb2ZmX3QgemNvcmVfbHNlZWsoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBvZmZzZXQsIGludCBvcmlnKQoreworCWxvZmZfdCByYzsKKworCW11dGV4X2xvY2soJnpjb3JlX211dGV4KTsKKwlzd2l0Y2ggKG9yaWcpIHsKKwljYXNlIDA6CisJCWZpbGUtPmZfcG9zID0gb2Zmc2V0OworCQlyYyA9IGZpbGUtPmZfcG9zOworCQlicmVhazsKKwljYXNlIDE6CisJCWZpbGUtPmZfcG9zICs9IG9mZnNldDsKKwkJcmMgPSBmaWxlLT5mX3BvczsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmMgPSAtRUlOVkFMOworCX0KKwltdXRleF91bmxvY2soJnpjb3JlX211dGV4KTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHpjb3JlX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJCT0gemNvcmVfbHNlZWssCisJLnJlYWQJCT0gemNvcmVfcmVhZCwKKwkub3BlbgkJPSB6Y29yZV9vcGVuLAorCS5yZWxlYXNlCT0gemNvcmVfcmVsZWFzZSwKK307CisKKworc3RhdGljIHZvaWQgX19pbml0IHNldF9zMzkwX2xjX21hc2sodW5pb24gc2F2ZV9hcmVhICptYXApCit7CisJbWVtc2V0KCZtYXAtPnMzOTAuZXh0X3NhdmUsIDB4ZmYsIHNpemVvZihtYXAtPnMzOTAuZXh0X3NhdmUpKTsKKwltZW1zZXQoJm1hcC0+czM5MC50aW1lciwgMHhmZiwgc2l6ZW9mKG1hcC0+czM5MC50aW1lcikpOworCW1lbXNldCgmbWFwLT5zMzkwLmNsa19jbXAsIDB4ZmYsIHNpemVvZihtYXAtPnMzOTAuY2xrX2NtcCkpOworCW1lbXNldCgmbWFwLT5zMzkwLnBzdywgMHhmZiwgc2l6ZW9mKG1hcC0+czM5MC5wc3cpKTsKKwltZW1zZXQoJm1hcC0+czM5MC5wcmVmX3JlZywgMHhmZiwgc2l6ZW9mKG1hcC0+czM5MC5wcmVmX3JlZykpOworCW1lbXNldCgmbWFwLT5zMzkwLmFjY19yZWdzLCAweGZmLCBzaXplb2YobWFwLT5zMzkwLmFjY19yZWdzKSk7CisJbWVtc2V0KCZtYXAtPnMzOTAuZnBfcmVncywgMHhmZiwgc2l6ZW9mKG1hcC0+czM5MC5mcF9yZWdzKSk7CisJbWVtc2V0KCZtYXAtPnMzOTAuZ3BfcmVncywgMHhmZiwgc2l6ZW9mKG1hcC0+czM5MC5ncF9yZWdzKSk7CisJbWVtc2V0KCZtYXAtPnMzOTAuY3RybF9yZWdzLCAweGZmLCBzaXplb2YobWFwLT5zMzkwLmN0cmxfcmVncykpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgc2V0X3MzOTB4X2xjX21hc2sodW5pb24gc2F2ZV9hcmVhICptYXApCit7CisJbWVtc2V0KCZtYXAtPnMzOTB4LmZwX3JlZ3MsIDB4ZmYsIHNpemVvZihtYXAtPnMzOTB4LmZwX3JlZ3MpKTsKKwltZW1zZXQoJm1hcC0+czM5MHguZ3BfcmVncywgMHhmZiwgc2l6ZW9mKG1hcC0+czM5MHguZ3BfcmVncykpOworCW1lbXNldCgmbWFwLT5zMzkweC5wc3csIDB4ZmYsIHNpemVvZihtYXAtPnMzOTB4LnBzdykpOworCW1lbXNldCgmbWFwLT5zMzkweC5wcmVmX3JlZywgMHhmZiwgc2l6ZW9mKG1hcC0+czM5MHgucHJlZl9yZWcpKTsKKwltZW1zZXQoJm1hcC0+czM5MHguZnBfY3RybF9yZWcsIDB4ZmYsIHNpemVvZihtYXAtPnMzOTB4LmZwX2N0cmxfcmVnKSk7CisJbWVtc2V0KCZtYXAtPnMzOTB4LnRvZF9yZWcsIDB4ZmYsIHNpemVvZihtYXAtPnMzOTB4LnRvZF9yZWcpKTsKKwltZW1zZXQoJm1hcC0+czM5MHgudGltZXIsIDB4ZmYsIHNpemVvZihtYXAtPnMzOTB4LnRpbWVyKSk7CisJbWVtc2V0KCZtYXAtPnMzOTB4LmNsa19jbXAsIDB4ZmYsIHNpemVvZihtYXAtPnMzOTB4LmNsa19jbXApKTsKKwltZW1zZXQoJm1hcC0+czM5MHguYWNjX3JlZ3MsIDB4ZmYsIHNpemVvZihtYXAtPnMzOTB4LmFjY19yZWdzKSk7CisJbWVtc2V0KCZtYXAtPnMzOTB4LmN0cmxfcmVncywgMHhmZiwgc2l6ZW9mKG1hcC0+czM5MHguY3RybF9yZWdzKSk7Cit9CisKKy8qCisgKiBJbml0aWFsaXplIGR1bXAgZ2xvYmFscyBmb3IgYSBnaXZlbiBhcmNoaXRlY3R1cmUKKyAqLworc3RhdGljIGludCBfX2luaXQgc3lzX2luZm9faW5pdChlbnVtIGFyY2hfaWQgYXJjaCkKK3sKKwlzd2l0Y2ggKGFyY2gpIHsKKwljYXNlIEFSQ0hfUzM5MFg6CisJCU1TRygiREVURUNURUQgJ1MzOTBYICg2NCBiaXQpIE9TJ1xuIik7CisJCXN5c19pbmZvLnNhX2Jhc2UgPSBTQVZFX0FSRUFfQkFTRV9TMzkwWDsKKwkJc3lzX2luZm8uc2Ffc2l6ZSA9IHNpemVvZihzdHJ1Y3Qgc2F2ZV9hcmVhX3MzOTB4KTsKKwkJc2V0X3MzOTB4X2xjX21hc2soJnN5c19pbmZvLmxjX21hc2spOworCQlicmVhazsKKwljYXNlIEFSQ0hfUzM5MDoKKwkJTVNHKCJERVRFQ1RFRCAnUzM5MCAoMzIgYml0KSBPUydcbiIpOworCQlzeXNfaW5mby5zYV9iYXNlID0gU0FWRV9BUkVBX0JBU0VfUzM5MDsKKwkJc3lzX2luZm8uc2Ffc2l6ZSA9IHNpemVvZihzdHJ1Y3Qgc2F2ZV9hcmVhX3MzOTApOworCQlzZXRfczM5MF9sY19tYXNrKCZzeXNfaW5mby5sY19tYXNrKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJRVJST1JfTVNHKCJ1bmtub3duIGFyY2hpdGVjdHVyZSAweCV4LlxuIixhcmNoKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXN5c19pbmZvLmFyY2ggPSBhcmNoOworCWlmIChpbml0X2NwdV9pbmZvKGFyY2gpKSB7CisJCUVSUk9SX01TRygiZ2V0IGNwdSBpbmZvIGZhaWxlZFxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlzeXNfaW5mby5tZW1fc2l6ZSA9IHJlYWxfbWVtb3J5X3NpemU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgY2hlY2tfc2RpYXModm9pZCkKK3sKKwlpbnQgcmMsIGFjdF9oc2Ffc2l6ZTsKKworCXJjID0gc2NscF9zZGlhc19ibGtfY291bnQoKTsKKwlpZiAocmMgPCAwKSB7CisJCUVSUk9SX01TRygiQ291bGQgbm90IGRldGVybWluZSBIU0Egc2l6ZVxuIik7CisJCXJldHVybiByYzsKKwl9CisJYWN0X2hzYV9zaXplID0gKHJjIC0gMSkgKiBQQUdFX1NJWkU7CisJaWYgKGFjdF9oc2Ffc2l6ZSA8IFpGQ1BEVU1QX0hTQV9TSVpFKSB7CisJCUVSUk9SX01TRygiSFNBIHNpemUgdG9vIHNtYWxsOiAlaVxuIiwgYWN0X2hzYV9zaXplKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgemNvcmVfaGVhZGVyX2luaXQoaW50IGFyY2gsIHN0cnVjdCB6Y29yZV9oZWFkZXIgKmhkcikKK3sKKwlpZiAoYXJjaCA9PSBBUkNIX1MzOTBYKQorCQloZHItPmFyY2hfaWQgPSBEVU1QX0FSQ0hfUzM5MFg7CisJZWxzZQorCQloZHItPmFyY2hfaWQgPSBEVU1QX0FSQ0hfUzM5MDsKKwloZHItPm1lbV9zaXplID0gc3lzX2luZm8ubWVtX3NpemU7CisJaGRyLT5tZW1fZW5kID0gc3lzX2luZm8ubWVtX3NpemU7CisJaGRyLT5udW1fcGFnZXMgPSBzeXNfaW5mby5tZW1fc2l6ZSAvIFBBR0VfU0laRTsKKwloZHItPnRvZCA9IGdldF9jbG9jaygpOworCWdldF9jcHVfaWQoJmhkci0+Y3B1X2lkKTsKK30KKworZXh0ZXJuIGludCBzZGlhc19pbml0KHZvaWQpOworCitzdGF0aWMgaW50IF9faW5pdCB6Y29yZV9pbml0KHZvaWQpCit7CisJdW5zaWduZWQgY2hhciBhcmNoOworCWludCByYzsKKworCWlmIChpcGxfaW5mby50eXBlICE9IElQTF9UWVBFX0ZDUF9EVU1QKQorCQlyZXR1cm4gLUVOT0RBVEE7CisKKwl6Y29yZV9kYmYgPSBkZWJ1Z19yZWdpc3RlcigiemNvcmUiLCA0LCAxLCA0ICogc2l6ZW9mKGxvbmcpKTsKKwlkZWJ1Z19yZWdpc3Rlcl92aWV3KHpjb3JlX2RiZiwgJmRlYnVnX3NwcmludGZfdmlldyk7CisJZGVidWdfc2V0X2xldmVsKHpjb3JlX2RiZiwgNik7CisKKwlUUkFDRSgiZGV2bm86ICAleFxuIiwgaXBsX2luZm8uZGF0YS5mY3AuZGV2X2lkLmRldm5vKTsKKwlUUkFDRSgid3dwbjogICAlbGx4XG4iLCAodW5zaWduZWQgbG9uZyBsb25nKSBpcGxfaW5mby5kYXRhLmZjcC53d3BuKTsKKwlUUkFDRSgibHVuOiAgICAlbGx4XG4iLCAodW5zaWduZWQgbG9uZyBsb25nKSBpcGxfaW5mby5kYXRhLmZjcC5sdW4pOworCisJcmMgPSBzZGlhc19pbml0KCk7CisJaWYgKHJjKQorCQlnb3RvIGZhaWw7CisKKwlyYyA9IGNoZWNrX3NkaWFzKCk7CisJaWYgKHJjKSB7CisJCUVSUk9SX01TRygiRHVtcCBpbml0aWFsaXphdGlvbiBmYWlsZWRcbiIpOworCQlnb3RvIGZhaWw7CisJfQorCisJcmMgPSBtZW1jcHlfaHNhX2tlcm5lbCgmYXJjaCwgX19MQ19BUl9NT0RFX0lELCAxKTsKKwlpZiAocmMpIHsKKwkJRVJST1JfTVNHKCJzZGlhbCBtZW1jcHkgZm9yIGFyY2ggaWQgZmFpbGVkXG4iKTsKKwkJZ290byBmYWlsOworCX0KKworI2lmbmRlZiBfX3MzOTB4X18KKwlpZiAoYXJjaCA9PSBBUkNIX1MzOTBYKSB7CisJCUVSUk9SX01TRygiMzIgYml0IGR1bXBlciBjYW4ndCBkdW1wIDY0IGJpdCBzeXN0ZW0hXG4iKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGZhaWw7CisJfQorI2VuZGlmCisKKwlyYyA9IHN5c19pbmZvX2luaXQoYXJjaCk7CisJaWYgKHJjKSB7CisJCUVSUk9SX01TRygiYXJjaCBpbml0IGZhaWxlZFxuIik7CisJCWdvdG8gZmFpbDsKKwl9CisKKwl6Y29yZV9oZWFkZXJfaW5pdChhcmNoLCAmemNvcmVfaGVhZGVyKTsKKworCXpjb3JlX2RpciA9IGRlYnVnZnNfY3JlYXRlX2RpcigiemNvcmUiICwgTlVMTCk7CisJaWYgKCF6Y29yZV9kaXIpIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGZhaWw7CisJfQorCXpjb3JlX2ZpbGUgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJtZW0iLCBTX0lSVVNSLCB6Y29yZV9kaXIsIE5VTEwsCisJCQkJCSAmemNvcmVfZm9wcyk7CisJaWYgKCF6Y29yZV9maWxlKSB7CisJCWRlYnVnZnNfcmVtb3ZlKHpjb3JlX2Rpcik7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBmYWlsOworCX0KKwloc2FfYXZhaWxhYmxlID0gMTsKKwlyZXR1cm4gMDsKKworZmFpbDoKKwlkaWFnMzA4KERJQUczMDhfUkVMX0hTQSwgTlVMTCk7CisJcmV0dXJuIHJjOworfQorCitleHRlcm4gdm9pZCBzZGlhc19leGl0KHZvaWQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgemNvcmVfZXhpdCh2b2lkKQoreworCWRlYnVnX3VucmVnaXN0ZXIoemNvcmVfZGJmKTsKKwlzZGlhc19leGl0KCk7CisJZGlhZzMwOChESUFHMzA4X1JFTF9IU0EsIE5VTEwpOworfQorCitNT0RVTEVfQVVUSE9SKCJDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDMsMjAwNyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJ6Y29yZSBtb2R1bGUgZm9yIHpmY3BkdW1wIHN1cHBvcnQiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3Vic3lzX2luaXRjYWxsKHpjb3JlX2luaXQpOworbW9kdWxlX2V4aXQoemNvcmVfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2lvL01ha2VmaWxlIGIvZHJpdmVycy9zMzkwL2Npby9NYWtlZmlsZQppbmRleCBjNDkwYzJhLi5jZmFmNzdiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2lvL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvczM5MC9jaW8vTWFrZWZpbGUKQEAgLTIsNyArMiw3IEBACiAjIE1ha2VmaWxlIGZvciB0aGUgUy8zOTAgY29tbW9uIGkvbyBkcml2ZXJzCiAjCiAKLW9iai15ICs9IGFpcnEubyBibGFja2xpc3QubyBjaHNjLm8gY2lvLm8gY3NzLm8KK29iai15ICs9IGFpcnEubyBibGFja2xpc3QubyBjaHNjLm8gY2lvLm8gY3NzLm8gY2hwLm8gaWRzZXQubwogY2N3X2RldmljZS1vYmpzICs9IGRldmljZS5vIGRldmljZV9mc20ubyBkZXZpY2Vfb3BzLm8KIGNjd19kZXZpY2Utb2JqcyArPSBkZXZpY2VfaWQubyBkZXZpY2VfcGdpZC5vIGRldmljZV9zdGF0dXMubwogb2JqLXkgKz0gY2N3X2RldmljZS5vIGNtZi5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2lvL2Njd2dyb3VwLmMgYi9kcml2ZXJzL3MzOTAvY2lvL2Njd2dyb3VwLmMKaW5kZXggNWFlYjY4ZS4uZTVjY2RhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9jY3dncm91cC5jCisrKyBiL2RyaXZlcnMvczM5MC9jaW8vY2N3Z3JvdXAuYwpAQCAtNzUsOCArNzUsMTAgQEAKIHsKIAlzdHJ1Y3QgY2N3Z3JvdXBfZGV2aWNlICpnZGV2ID0gdG9fY2N3Z3JvdXBkZXYoZGV2KTsKIAorCW11dGV4X2xvY2soJmdkZXYtPnJlZ19tdXRleCk7CiAJX19jY3dncm91cF9yZW1vdmVfc3ltbGlua3MoZ2Rldik7CiAJZGV2aWNlX3VucmVnaXN0ZXIoZGV2KTsKKwltdXRleF91bmxvY2soJmdkZXYtPnJlZ19tdXRleCk7CiB9CiAKIHN0YXRpYyBzc2l6ZV90CkBAIC0xNzMsNyArMTc1LDggQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlhdG9taWNfc2V0KCZnZGV2LT5vbm9mZiwgMCk7Ci0KKwltdXRleF9pbml0KCZnZGV2LT5yZWdfbXV0ZXgpOworCW11dGV4X2xvY2soJmdkZXYtPnJlZ19tdXRleCk7CiAJZm9yIChpID0gMDsgaSA8IGFyZ2M7IGkrKykgewogCQlnZGV2LT5jZGV2W2ldID0gZ2V0X2Njd2Rldl9ieV9idXNpZChjZHJ2LCBhcmd2W2ldKTsKIApAQCAtMTgzLDEyICsxODYsMTIgQEAKIAkJICAgIHx8IGdkZXYtPmNkZXZbaV0tPmlkLmRyaXZlcl9pbmZvICE9CiAJCSAgICBnZGV2LT5jZGV2WzBdLT5pZC5kcml2ZXJfaW5mbykgewogCQkJcmMgPSAtRUlOVkFMOwotCQkJZ290byBmcmVlX2RldjsKKwkJCWdvdG8gZXJyb3I7CiAJCX0KIAkJLyogRG9uJ3QgYWxsb3cgYSBkZXZpY2UgdG8gYmVsb25nIHRvIG1vcmUgdGhhbiBvbmUgZ3JvdXAuICovCiAJCWlmIChnZGV2LT5jZGV2W2ldLT5kZXYuZHJpdmVyX2RhdGEpIHsKIAkJCXJjID0gLUVJTlZBTDsKLQkJCWdvdG8gZnJlZV9kZXY7CisJCQlnb3RvIGVycm9yOwogCQl9CiAJCWdkZXYtPmNkZXZbaV0tPmRldi5kcml2ZXJfZGF0YSA9IGdkZXY7CiAJfQpAQCAtMjAzLDkgKzIwNiw4IEBACiAJCQlnZGV2LT5jZGV2WzBdLT5kZXYuYnVzX2lkKTsKIAogCXJjID0gZGV2aWNlX3JlZ2lzdGVyKCZnZGV2LT5kZXYpOwotCQogCWlmIChyYykKLQkJZ290byBmcmVlX2RldjsKKwkJZ290byBlcnJvcjsKIAlnZXRfZGV2aWNlKCZnZGV2LT5kZXYpOwogCXJjID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZnZGV2LT5kZXYsICZkZXZfYXR0cl91bmdyb3VwKTsKIApAQCAtMjE2LDYgKzIxOCw3IEBACiAKIAlyYyA9IF9fY2N3Z3JvdXBfY3JlYXRlX3N5bWxpbmtzKGdkZXYpOwogCWlmICghcmMpIHsKKwkJbXV0ZXhfdW5sb2NrKCZnZGV2LT5yZWdfbXV0ZXgpOwogCQlwdXRfZGV2aWNlKCZnZGV2LT5kZXYpOwogCQlyZXR1cm4gMDsKIAl9CkBAIC0yMjQsMTkgKzIyNywxMiBAQAogZXJyb3I6CiAJZm9yIChpID0gMDsgaSA8IGFyZ2M7IGkrKykKIAkJaWYgKGdkZXYtPmNkZXZbaV0pIHsKLQkJCXB1dF9kZXZpY2UoJmdkZXYtPmNkZXZbaV0tPmRldik7Ci0JCQlnZGV2LT5jZGV2W2ldLT5kZXYuZHJpdmVyX2RhdGEgPSBOVUxMOwotCQl9Ci0JcHV0X2RldmljZSgmZ2Rldi0+ZGV2KTsKLQlyZXR1cm4gcmM7Ci1mcmVlX2RldjoKLQlmb3IgKGkgPSAwOyBpIDwgYXJnYzsgaSsrKQotCQlpZiAoZ2Rldi0+Y2RldltpXSkgewogCQkJaWYgKGdkZXYtPmNkZXZbaV0tPmRldi5kcml2ZXJfZGF0YSA9PSBnZGV2KQogCQkJCWdkZXYtPmNkZXZbaV0tPmRldi5kcml2ZXJfZGF0YSA9IE5VTEw7CiAJCQlwdXRfZGV2aWNlKCZnZGV2LT5jZGV2W2ldLT5kZXYpOwogCQl9Ci0Ja2ZyZWUoZ2Rldik7CisJbXV0ZXhfdW5sb2NrKCZnZGV2LT5yZWdfbXV0ZXgpOworCXB1dF9kZXZpY2UoJmdkZXYtPmRldik7CiAJcmV0dXJuIHJjOwogfQogCkBAIC00MjIsOCArNDE4LDEyIEBACiAJZ2V0X2RyaXZlcigmY2RyaXZlci0+ZHJpdmVyKTsKIAl3aGlsZSAoKGRldiA9IGRyaXZlcl9maW5kX2RldmljZSgmY2RyaXZlci0+ZHJpdmVyLCBOVUxMLCBOVUxMLAogCQkJCQkgX19jY3dncm91cF9tYXRjaF9hbGwpKSkgewotCQlfX2Njd2dyb3VwX3JlbW92ZV9zeW1saW5rcyh0b19jY3dncm91cGRldihkZXYpKTsKKwkJc3RydWN0IGNjd2dyb3VwX2RldmljZSAqZ2RldiA9IHRvX2Njd2dyb3VwZGV2KGRldik7CisKKwkJbXV0ZXhfbG9jaygmZ2Rldi0+cmVnX211dGV4KTsKKwkJX19jY3dncm91cF9yZW1vdmVfc3ltbGlua3MoZ2Rldik7CiAJCWRldmljZV91bnJlZ2lzdGVyKGRldik7CisJCW11dGV4X3VubG9jaygmZ2Rldi0+cmVnX211dGV4KTsKIAkJcHV0X2RldmljZShkZXYpOwogCX0KIAlwdXRfZHJpdmVyKCZjZHJpdmVyLT5kcml2ZXIpOwpAQCAtNDQ0LDggKzQ0NCwxMCBAQAogCWlmIChjZGV2LT5kZXYuZHJpdmVyX2RhdGEpIHsKIAkJZ2RldiA9IChzdHJ1Y3QgY2N3Z3JvdXBfZGV2aWNlICopY2Rldi0+ZGV2LmRyaXZlcl9kYXRhOwogCQlpZiAoZ2V0X2RldmljZSgmZ2Rldi0+ZGV2KSkgeworCQkJbXV0ZXhfbG9jaygmZ2Rldi0+cmVnX211dGV4KTsKIAkJCWlmIChkZXZpY2VfaXNfcmVnaXN0ZXJlZCgmZ2Rldi0+ZGV2KSkKIAkJCQlyZXR1cm4gZ2RldjsKKwkJCW11dGV4X3VubG9jaygmZ2Rldi0+cmVnX211dGV4KTsKIAkJCXB1dF9kZXZpY2UoJmdkZXYtPmRldik7CiAJCX0KIAkJcmV0dXJuIE5VTEw7CkBAIC00NjUsNiArNDY3LDcgQEAKIAlpZiAoZ2RldikgewogCQlfX2Njd2dyb3VwX3JlbW92ZV9zeW1saW5rcyhnZGV2KTsKIAkJZGV2aWNlX3VucmVnaXN0ZXIoJmdkZXYtPmRldik7CisJCW11dGV4X3VubG9jaygmZ2Rldi0+cmVnX211dGV4KTsKIAkJcHV0X2RldmljZSgmZ2Rldi0+ZGV2KTsKIAl9CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2lvL2NocC5jIGIvZHJpdmVycy9zMzkwL2Npby9jaHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzI4OWU2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zMzkwL2Npby9jaHAuYwpAQCAtMCwwICsxLDY4MyBAQAorLyoKKyAqICBkcml2ZXJzL3MzOTAvY2lvL2NocC5jCisgKgorICogICAgQ29weXJpZ2h0IElCTSBDb3JwLiAxOTk5LDIwMDcKKyAqICAgIEF1dGhvcihzKTogQ29ybmVsaWEgSHVjayAoY29ybmVsaWEuaHVja0BkZS5pYm0uY29tKQorICoJCSBBcm5kIEJlcmdtYW5uIChhcm5kYkBkZS5pYm0uY29tKQorICoJCSBQZXRlciBPYmVycGFybGVpdGVyIDxwZXRlci5vYmVycGFybGVpdGVyQGRlLmlibS5jb20+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2J1Zy5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxhc20vZXJybm8uaD4KKyNpbmNsdWRlIDxhc20vY2hwaWQuaD4KKyNpbmNsdWRlIDxhc20vc2NscC5oPgorCisjaW5jbHVkZSAiY2lvLmgiCisjaW5jbHVkZSAiY3NzLmgiCisjaW5jbHVkZSAiaW9hc20uaCIKKyNpbmNsdWRlICJjaW9fZGVidWcuaCIKKyNpbmNsdWRlICJjaHAuaCIKKworI2RlZmluZSB0b19jaGFubmVscGF0aChkZXZpY2UpIGNvbnRhaW5lcl9vZihkZXZpY2UsIHN0cnVjdCBjaGFubmVsX3BhdGgsIGRldikKKyNkZWZpbmUgQ0hQX0lORk9fVVBEQVRFX0lOVEVSVkFMCTEqSFoKKworZW51bSBjZmdfdGFza190IHsKKwljZmdfbm9uZSwKKwljZmdfY29uZmlndXJlLAorCWNmZ19kZWNvbmZpZ3VyZQorfTsKKworLyogTWFwIGZvciBwZW5kaW5nIGNvbmZpZ3VyZSB0YXNrcy4gKi8KK3N0YXRpYyBlbnVtIGNmZ190YXNrX3QgY2hwX2NmZ190YXNrW19fTUFYX0NTU0lEICsgMV1bX19NQVhfQ0hQSUQgKyAxXTsKK3N0YXRpYyBERUZJTkVfTVVURVgoY2ZnX2xvY2spOworc3RhdGljIGludCBjZmdfYnVzeTsKKworLyogTWFwIGZvciBjaGFubmVsLXBhdGggc3RhdHVzLiAqLworc3RhdGljIHN0cnVjdCBzY2xwX2NocF9pbmZvIGNocF9pbmZvOworc3RhdGljIERFRklORV9NVVRFWChpbmZvX2xvY2spOworCisvKiBUaW1lIGFmdGVyIHdoaWNoIGNoYW5uZWwtcGF0aCBzdGF0dXMgbWF5IGJlIG91dGRhdGVkLiAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgY2hwX2luZm9fZXhwaXJlczsKKworLyogV29ya3F1ZXVlIHRvIHBlcmZvcm0gcGVuZGluZyBjb25maWd1cmUgdGFza3MuICovCitzdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmNocF93cTsKK3N0YXRpYyBzdHJ1Y3Qgd29ya19zdHJ1Y3QgY2ZnX3dvcms7CisKKy8qIFdhaXQgcXVldWUgZm9yIGNvbmZpZ3VyZSBjb21wbGV0aW9uIGV2ZW50cy4gKi8KK3N0YXRpYyB3YWl0X3F1ZXVlX2hlYWRfdCBjZmdfd2FpdF9xdWV1ZTsKKworLyogUmV0dXJuIGNoYW5uZWxfcGF0aCBzdHJ1Y3QgZm9yIGdpdmVuIGNocGlkLiAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgY2hhbm5lbF9wYXRoICpjaHBpZF90b19jaHAoc3RydWN0IGNocF9pZCBjaHBpZCkKK3sKKwlyZXR1cm4gY3NzW2NocGlkLmNzc2lkXS0+Y2hwc1tjaHBpZC5pZF07Cit9CisKKy8qIFNldCB2YXJ5IHN0YXRlIGZvciBnaXZlbiBjaHBpZC4gKi8KK3N0YXRpYyB2b2lkIHNldF9jaHBfbG9naWNhbGx5X29ubGluZShzdHJ1Y3QgY2hwX2lkIGNocGlkLCBpbnQgb25vZmYpCit7CisJY2hwaWRfdG9fY2hwKGNocGlkKS0+c3RhdGUgPSBvbm9mZjsKK30KKworLyogT24gc3VjY2VzIHJldHVybiAwIGlmIGNoYW5uZWwtcGF0aCBpcyB2YXJpZWQgb2ZmbGluZSwgMSBpZiBpdCBpcyB2YXJpZWQKKyAqIG9ubGluZS4gUmV0dXJuIC1FTk9ERVYgaWYgY2hhbm5lbC1wYXRoIGlzIG5vdCByZWdpc3RlcmVkLiAqLworaW50IGNocF9nZXRfc3RhdHVzKHN0cnVjdCBjaHBfaWQgY2hwaWQpCit7CisJcmV0dXJuIChjaHBpZF90b19jaHAoY2hwaWQpID8gY2hwaWRfdG9fY2hwKGNocGlkKS0+c3RhdGUgOiAtRU5PREVWKTsKK30KKworLyoqCisgKiBjaHBfZ2V0X3NjaF9vcG0gLSByZXR1cm4gb3BtIGZvciBzdWJjaGFubmVsCisgKiBAc2NoOiBzdWJjaGFubmVsCisgKgorICogQ2FsY3VsYXRlIGFuZCByZXR1cm4gdGhlIG9wZXJhdGlvbmFsIHBhdGggbWFzayAob3BtKSBiYXNlZCBvbiB0aGUgY2hwaWRzCisgKiB1c2VkIGJ5IHRoZSBzdWJjaGFubmVsIGFuZCB0aGUgc3RhdHVzIG9mIHRoZSBhc3NvY2lhdGVkIGNoYW5uZWwtcGF0aHMuCisgKi8KK3U4IGNocF9nZXRfc2NoX29wbShzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoKQoreworCXN0cnVjdCBjaHBfaWQgY2hwaWQ7CisJaW50IG9wbTsKKwlpbnQgaTsKKworCW9wbSA9IDA7CisJY2hwX2lkX2luaXQoJmNocGlkKTsKKwlmb3IgKGk9MDsgaSA8IDg7IGkrKykgeworCQlvcG0gPDw9IDE7CisJCWNocGlkLmlkID0gc2NoLT5zY2hpYi5wbWN3LmNocGlkW2ldOworCQlpZiAoY2hwX2dldF9zdGF0dXMoY2hwaWQpICE9IDApCisJCQlvcG0gfD0gMTsKKwl9CisJcmV0dXJuIG9wbTsKK30KKworLyoqCisgKiBjaHBfaXNfcmVnaXN0ZXJlZCAtIGNoZWNrIGlmIGEgY2hhbm5lbC1wYXRoIGlzIHJlZ2lzdGVyZWQKKyAqIEBjaHBpZDogY2hhbm5lbC1wYXRoIElECisgKgorICogUmV0dXJuIG5vbi16ZXJvIGlmIGEgY2hhbm5lbC1wYXRoIHdpdGggdGhlIGdpdmVuIGNocGlkIGlzIHJlZ2lzdGVyZWQsCisgKiB6ZXJvIG90aGVyd2lzZS4KKyAqLworaW50IGNocF9pc19yZWdpc3RlcmVkKHN0cnVjdCBjaHBfaWQgY2hwaWQpCit7CisJcmV0dXJuIGNocGlkX3RvX2NocChjaHBpZCkgIT0gTlVMTDsKK30KKworLyoKKyAqIEZ1bmN0aW9uOiBzMzkwX3ZhcnlfY2hwaWQKKyAqIFZhcmllcyB0aGUgc3BlY2lmaWVkIGNocGlkIG9ubGluZSBvciBvZmZsaW5lCisgKi8KK3N0YXRpYyBpbnQgczM5MF92YXJ5X2NocGlkKHN0cnVjdCBjaHBfaWQgY2hwaWQsIGludCBvbikKK3sKKwljaGFyIGRiZl90ZXh0WzE1XTsKKwlpbnQgc3RhdHVzOworCisJc3ByaW50ZihkYmZfdGV4dCwgb24/InZhcnlvbiV4LiUwMngiOiJ2YXJ5b2ZmJXguJTAyeCIsIGNocGlkLmNzc2lkLAorCQljaHBpZC5pZCk7CisJQ0lPX1RSQUNFX0VWRU5UKCAyLCBkYmZfdGV4dCk7CisKKwlzdGF0dXMgPSBjaHBfZ2V0X3N0YXR1cyhjaHBpZCk7CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJDYW4ndCB2YXJ5IHVua25vd24gY2hwaWQgJXguJTAyeFxuIiwKKwkJICAgICAgIGNocGlkLmNzc2lkLCBjaHBpZC5pZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghb24gJiYgIXN0YXR1cykgeworCQlwcmludGsoS0VSTl9FUlIgImNocGlkICV4LiUwMnggaXMgYWxyZWFkeSBvZmZsaW5lXG4iLAorCQkgICAgICAgY2hwaWQuY3NzaWQsIGNocGlkLmlkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc2V0X2NocF9sb2dpY2FsbHlfb25saW5lKGNocGlkLCBvbik7CisJY2hzY19jaHBfdmFyeShjaHBpZCwgb24pOworCXJldHVybiAwOworfQorCisvKgorICogQ2hhbm5lbCBtZWFzdXJlbWVudCByZWxhdGVkIGZ1bmN0aW9ucworICovCitzdGF0aWMgc3NpemVfdCBjaHBfbWVhc3VyZW1lbnRfY2hhcnNfcmVhZChzdHJ1Y3Qga29iamVjdCAqa29iaiwgY2hhciAqYnVmLAorCQkJCQkgIGxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgY2hhbm5lbF9wYXRoICpjaHA7CisJdW5zaWduZWQgaW50IHNpemU7CisKKwljaHAgPSB0b19jaGFubmVscGF0aChjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaikpOworCWlmICghY2hwLT5jbWdfY2hhcnMpCisJCXJldHVybiAwOworCisJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgY21nX2NoYXJzKTsKKworCWlmIChvZmYgPiBzaXplKQorCQlyZXR1cm4gMDsKKwlpZiAob2ZmICsgY291bnQgPiBzaXplKQorCQljb3VudCA9IHNpemUgLSBvZmY7CisJbWVtY3B5KGJ1ZiwgY2hwLT5jbWdfY2hhcnMgKyBvZmYsIGNvdW50KTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSBjaHBfbWVhc3VyZW1lbnRfY2hhcnNfYXR0ciA9IHsKKwkuYXR0ciA9IHsKKwkJLm5hbWUgPSAibWVhc3VyZW1lbnRfY2hhcnMiLAorCQkubW9kZSA9IFNfSVJVU1IsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCisJLnNpemUgPSBzaXplb2Yoc3RydWN0IGNtZ19jaGFycyksCisJLnJlYWQgPSBjaHBfbWVhc3VyZW1lbnRfY2hhcnNfcmVhZCwKK307CisKK3N0YXRpYyB2b2lkIGNocF9tZWFzdXJlbWVudF9jb3B5X2Jsb2NrKHN0cnVjdCBjbWdfZW50cnkgKmJ1ZiwKKwkJCQkgICAgICAgc3RydWN0IGNoYW5uZWxfc3Vic3lzdGVtICpjc3MsCisJCQkJICAgICAgIHN0cnVjdCBjaHBfaWQgY2hwaWQpCit7CisJdm9pZCAqYXJlYTsKKwlzdHJ1Y3QgY21nX2VudHJ5ICplbnRyeSwgcmVmZXJlbmNlX2J1ZjsKKwlpbnQgaWR4OworCisJaWYgKGNocGlkLmlkIDwgMTI4KSB7CisJCWFyZWEgPSBjc3MtPmN1Yl9hZGRyMTsKKwkJaWR4ID0gY2hwaWQuaWQ7CisJfSBlbHNlIHsKKwkJYXJlYSA9IGNzcy0+Y3ViX2FkZHIyOworCQlpZHggPSBjaHBpZC5pZCAtIDEyODsKKwl9CisJZW50cnkgPSBhcmVhICsgKGlkeCAqIHNpemVvZihzdHJ1Y3QgY21nX2VudHJ5KSk7CisJZG8geworCQltZW1jcHkoYnVmLCBlbnRyeSwgc2l6ZW9mKCplbnRyeSkpOworCQltZW1jcHkoJnJlZmVyZW5jZV9idWYsIGVudHJ5LCBzaXplb2YoKmVudHJ5KSk7CisJfSB3aGlsZSAocmVmZXJlbmNlX2J1Zi52YWx1ZXNbMF0gIT0gYnVmLT52YWx1ZXNbMF0pOworfQorCitzdGF0aWMgc3NpemVfdCBjaHBfbWVhc3VyZW1lbnRfcmVhZChzdHJ1Y3Qga29iamVjdCAqa29iaiwgY2hhciAqYnVmLAorCQkJCSAgICBsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGNoYW5uZWxfcGF0aCAqY2hwOworCXN0cnVjdCBjaGFubmVsX3N1YnN5c3RlbSAqY3NzOworCXVuc2lnbmVkIGludCBzaXplOworCisJY2hwID0gdG9fY2hhbm5lbHBhdGgoY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopKTsKKwljc3MgPSB0b19jc3MoY2hwLT5kZXYucGFyZW50KTsKKworCXNpemUgPSBzaXplb2Yoc3RydWN0IGNtZ19lbnRyeSk7CisKKwkvKiBPbmx5IGFsbG93IHNpbmdsZSByZWFkcy4gKi8KKwlpZiAob2ZmIHx8IGNvdW50IDwgc2l6ZSkKKwkJcmV0dXJuIDA7CisJY2hwX21lYXN1cmVtZW50X2NvcHlfYmxvY2soKHN0cnVjdCBjbWdfZW50cnkgKilidWYsIGNzcywgY2hwLT5jaHBpZCk7CisJY291bnQgPSBzaXplOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHN0cnVjdCBiaW5fYXR0cmlidXRlIGNocF9tZWFzdXJlbWVudF9hdHRyID0geworCS5hdHRyID0geworCQkubmFtZSA9ICJtZWFzdXJlbWVudCIsCisJCS5tb2RlID0gU19JUlVTUiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkuc2l6ZSA9IHNpemVvZihzdHJ1Y3QgY21nX2VudHJ5KSwKKwkucmVhZCA9IGNocF9tZWFzdXJlbWVudF9yZWFkLAorfTsKKwordm9pZCBjaHBfcmVtb3ZlX2NtZ19hdHRyKHN0cnVjdCBjaGFubmVsX3BhdGggKmNocCkKK3sKKwlkZXZpY2VfcmVtb3ZlX2Jpbl9maWxlKCZjaHAtPmRldiwgJmNocF9tZWFzdXJlbWVudF9jaGFyc19hdHRyKTsKKwlkZXZpY2VfcmVtb3ZlX2Jpbl9maWxlKCZjaHAtPmRldiwgJmNocF9tZWFzdXJlbWVudF9hdHRyKTsKK30KKworaW50IGNocF9hZGRfY21nX2F0dHIoc3RydWN0IGNoYW5uZWxfcGF0aCAqY2hwKQoreworCWludCByZXQ7CisKKwlyZXQgPSBkZXZpY2VfY3JlYXRlX2Jpbl9maWxlKCZjaHAtPmRldiwgJmNocF9tZWFzdXJlbWVudF9jaGFyc19hdHRyKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCXJldCA9IGRldmljZV9jcmVhdGVfYmluX2ZpbGUoJmNocC0+ZGV2LCAmY2hwX21lYXN1cmVtZW50X2F0dHIpOworCWlmIChyZXQpCisJCWRldmljZV9yZW1vdmVfYmluX2ZpbGUoJmNocC0+ZGV2LCAmY2hwX21lYXN1cmVtZW50X2NoYXJzX2F0dHIpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBGaWxlcyBmb3IgdGhlIGNoYW5uZWwgcGF0aCBlbnRyaWVzLgorICovCitzdGF0aWMgc3NpemVfdCBjaHBfc3RhdHVzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGNoYW5uZWxfcGF0aCAqY2hwID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IGNoYW5uZWxfcGF0aCwgZGV2KTsKKworCWlmICghY2hwKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gKGNocF9nZXRfc3RhdHVzKGNocC0+Y2hwaWQpID8gc3ByaW50ZihidWYsICJvbmxpbmVcbiIpIDoKKwkJc3ByaW50ZihidWYsICJvZmZsaW5lXG4iKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGNocF9zdGF0dXNfd3JpdGUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBjaGFubmVsX3BhdGggKmNwID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IGNoYW5uZWxfcGF0aCwgZGV2KTsKKwljaGFyIGNtZFsxMF07CisJaW50IG51bV9hcmdzOworCWludCBlcnJvcjsKKworCW51bV9hcmdzID0gc3NjYW5mKGJ1ZiwgIiU1cyIsIGNtZCk7CisJaWYgKCFudW1fYXJncykKKwkJcmV0dXJuIGNvdW50OworCisJaWYgKCFzdHJuaWNtcChjbWQsICJvbiIsIDIpIHx8ICFzdHJjbXAoY21kLCAiMSIpKQorCQllcnJvciA9IHMzOTBfdmFyeV9jaHBpZChjcC0+Y2hwaWQsIDEpOworCWVsc2UgaWYgKCFzdHJuaWNtcChjbWQsICJvZmYiLCAzKSB8fCAhc3RyY21wKGNtZCwgIjAiKSkKKwkJZXJyb3IgPSBzMzkwX3ZhcnlfY2hwaWQoY3AtPmNocGlkLCAwKTsKKwllbHNlCisJCWVycm9yID0gLUVJTlZBTDsKKworCXJldHVybiBlcnJvciA8IDAgPyBlcnJvciA6IGNvdW50OworCit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihzdGF0dXMsIDA2NDQsIGNocF9zdGF0dXNfc2hvdywgY2hwX3N0YXR1c193cml0ZSk7CisKK3N0YXRpYyBzc2l6ZV90IGNocF9jb25maWd1cmVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBjaGFubmVsX3BhdGggKmNwOworCWludCBzdGF0dXM7CisKKwljcCA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBjaGFubmVsX3BhdGgsIGRldik7CisJc3RhdHVzID0gY2hwX2luZm9fZ2V0X3N0YXR1cyhjcC0+Y2hwaWQpOworCWlmIChzdGF0dXMgPCAwKQorCQlyZXR1cm4gc3RhdHVzOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIHN0YXR1cyk7Cit9CisKK3N0YXRpYyBpbnQgY2ZnX3dhaXRfaWRsZSh2b2lkKTsKKworc3RhdGljIHNzaXplX3QgY2hwX2NvbmZpZ3VyZV93cml0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGNoYW5uZWxfcGF0aCAqY3A7CisJaW50IHZhbDsKKwljaGFyIGRlbGltOworCisJaWYgKHNzY2FuZihidWYsICIlZCAlYyIsICZ2YWwsICZkZWxpbSkgIT0gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHZhbCAhPSAwICYmIHZhbCAhPSAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKwljcCA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBjaGFubmVsX3BhdGgsIGRldik7CisJY2hwX2NmZ19zY2hlZHVsZShjcC0+Y2hwaWQsIHZhbCk7CisJY2ZnX3dhaXRfaWRsZSgpOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgREVWSUNFX0FUVFIoY29uZmlndXJlLCAwNjQ0LCBjaHBfY29uZmlndXJlX3Nob3csIGNocF9jb25maWd1cmVfd3JpdGUpOworCitzdGF0aWMgc3NpemVfdCBjaHBfdHlwZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgY2hhbm5lbF9wYXRoICpjaHAgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgY2hhbm5lbF9wYXRoLCBkZXYpOworCisJaWYgKCFjaHApCisJCXJldHVybiAwOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV4XG4iLCBjaHAtPmRlc2MuZGVzYyk7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUih0eXBlLCAwNDQ0LCBjaHBfdHlwZV9zaG93LCBOVUxMKTsKKworc3RhdGljIHNzaXplX3QgY2hwX2NtZ19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgY2hhciAqYnVmKQoreworCXN0cnVjdCBjaGFubmVsX3BhdGggKmNocCA9IHRvX2NoYW5uZWxwYXRoKGRldik7CisKKwlpZiAoIWNocCkKKwkJcmV0dXJuIDA7CisJaWYgKGNocC0+Y21nID09IC0xKSAvKiBjaGFubmVsIG1lYXN1cmVtZW50cyBub3QgYXZhaWxhYmxlICovCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgInVua25vd25cbiIpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV4XG4iLCBjaHAtPmNtZyk7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihjbWcsIDA0NDQsIGNocF9jbWdfc2hvdywgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IGNocF9zaGFyZWRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgY2hhbm5lbF9wYXRoICpjaHAgPSB0b19jaGFubmVscGF0aChkZXYpOworCisJaWYgKCFjaHApCisJCXJldHVybiAwOworCWlmIChjaHAtPnNoYXJlZCA9PSAtMSkgLyogY2hhbm5lbCBtZWFzdXJlbWVudHMgbm90IGF2YWlsYWJsZSAqLworCQlyZXR1cm4gc3ByaW50ZihidWYsICJ1bmtub3duXG4iKTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIleFxuIiwgY2hwLT5zaGFyZWQpOworfQorCitzdGF0aWMgREVWSUNFX0FUVFIoc2hhcmVkLCAwNDQ0LCBjaHBfc2hhcmVkX3Nob3csIE5VTEwpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqIGNocF9hdHRyc1tdID0geworCSZkZXZfYXR0cl9zdGF0dXMuYXR0ciwKKwkmZGV2X2F0dHJfY29uZmlndXJlLmF0dHIsCisJJmRldl9hdHRyX3R5cGUuYXR0ciwKKwkmZGV2X2F0dHJfY21nLmF0dHIsCisJJmRldl9hdHRyX3NoYXJlZC5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBjaHBfYXR0cl9ncm91cCA9IHsKKwkuYXR0cnMgPSBjaHBfYXR0cnMsCit9OworCitzdGF0aWMgdm9pZCBjaHBfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGNoYW5uZWxfcGF0aCAqY3A7CisKKwljcCA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBjaGFubmVsX3BhdGgsIGRldik7CisJa2ZyZWUoY3ApOworfQorCisvKioKKyAqIGNocF9uZXcgLSByZWdpc3RlciBhIG5ldyBjaGFubmVsLXBhdGgKKyAqIEBjaHBpZCAtIGNoYW5uZWwtcGF0aCBJRAorICoKKyAqIENyZWF0ZSBhbmQgcmVnaXN0ZXIgZGF0YSBzdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIG5ldyBjaGFubmVsLXBhdGguIFJldHVybgorICogemVybyBvbiBzdWNjZXNzLCBub24temVybyBvdGhlcndpc2UuCisgKi8KK2ludCBjaHBfbmV3KHN0cnVjdCBjaHBfaWQgY2hwaWQpCit7CisJc3RydWN0IGNoYW5uZWxfcGF0aCAqY2hwOworCWludCByZXQ7CisKKwlpZiAoY2hwX2lzX3JlZ2lzdGVyZWQoY2hwaWQpKQorCQlyZXR1cm4gMDsKKwljaHAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY2hhbm5lbF9wYXRoKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjaHApCisJCXJldHVybiAtRU5PTUVNOworCisJLyogZmlsbCBpbiBzdGF0dXMsIGV0Yy4gKi8KKwljaHAtPmNocGlkID0gY2hwaWQ7CisJY2hwLT5zdGF0ZSA9IDE7CisJY2hwLT5kZXYucGFyZW50ID0gJmNzc1tjaHBpZC5jc3NpZF0tPmRldmljZTsKKwljaHAtPmRldi5yZWxlYXNlID0gY2hwX3JlbGVhc2U7CisJc25wcmludGYoY2hwLT5kZXYuYnVzX2lkLCBCVVNfSURfU0laRSwgImNocCV4LiUwMngiLCBjaHBpZC5jc3NpZCwKKwkJIGNocGlkLmlkKTsKKworCS8qIE9idGFpbiBjaGFubmVsIHBhdGggZGVzY3JpcHRpb24gYW5kIGZpbGwgaXQgaW4uICovCisJcmV0ID0gY2hzY19kZXRlcm1pbmVfY2hhbm5lbF9wYXRoX2Rlc2NyaXB0aW9uKGNocGlkLCAmY2hwLT5kZXNjKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF9mcmVlOworCWlmICgoY2hwLT5kZXNjLmZsYWdzICYgMHg4MCkgPT0gMCkgeworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIG91dF9mcmVlOworCX0KKwkvKiBHZXQgY2hhbm5lbC1tZWFzdXJlbWVudCBjaGFyYWN0ZXJpc3RpY3MuICovCisJaWYgKGNzc19jaGFyYWN0ZXJpc3RpY3NfYXZhaWwgJiYgY3NzX2Noc2NfY2hhcmFjdGVyaXN0aWNzLnNjbWMKKwkgICAgJiYgY3NzX2Noc2NfY2hhcmFjdGVyaXN0aWNzLnNlY20pIHsKKwkJcmV0ID0gY2hzY19nZXRfY2hhbm5lbF9tZWFzdXJlbWVudF9jaGFycyhjaHApOworCQlpZiAocmV0KQorCQkJZ290byBvdXRfZnJlZTsKKwl9IGVsc2UgeworCQlzdGF0aWMgaW50IG1zZ19kb25lOworCisJCWlmICghbXNnX2RvbmUpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImNpbzogQ2hhbm5lbCBtZWFzdXJlbWVudHMgbm90ICIKKwkJCSAgICAgICAiYXZhaWxhYmxlLCBjb250aW51aW5nLlxuIik7CisJCQltc2dfZG9uZSA9IDE7CisJCX0KKwkJY2hwLT5jbWcgPSAtMTsKKwl9CisKKwkvKiBtYWtlIGl0IGtub3duIHRvIHRoZSBzeXN0ZW0gKi8KKwlyZXQgPSBkZXZpY2VfcmVnaXN0ZXIoJmNocC0+ZGV2KTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBjb3VsZCBub3QgcmVnaXN0ZXIgJXguJTAyeFxuIiwKKwkJICAgICAgIF9fZnVuY19fLCBjaHBpZC5jc3NpZCwgY2hwaWQuaWQpOworCQlnb3RvIG91dF9mcmVlOworCX0KKwlyZXQgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmNocC0+ZGV2LmtvYmosICZjaHBfYXR0cl9ncm91cCk7CisJaWYgKHJldCkgeworCQlkZXZpY2VfdW5yZWdpc3RlcigmY2hwLT5kZXYpOworCQlnb3RvIG91dF9mcmVlOworCX0KKwltdXRleF9sb2NrKCZjc3NbY2hwaWQuY3NzaWRdLT5tdXRleCk7CisJaWYgKGNzc1tjaHBpZC5jc3NpZF0tPmNtX2VuYWJsZWQpIHsKKwkJcmV0ID0gY2hwX2FkZF9jbWdfYXR0cihjaHApOworCQlpZiAocmV0KSB7CisJCQlzeXNmc19yZW1vdmVfZ3JvdXAoJmNocC0+ZGV2LmtvYmosICZjaHBfYXR0cl9ncm91cCk7CisJCQlkZXZpY2VfdW5yZWdpc3RlcigmY2hwLT5kZXYpOworCQkJbXV0ZXhfdW5sb2NrKCZjc3NbY2hwaWQuY3NzaWRdLT5tdXRleCk7CisJCQlnb3RvIG91dF9mcmVlOworCQl9CisJfQorCWNzc1tjaHBpZC5jc3NpZF0tPmNocHNbY2hwaWQuaWRdID0gY2hwOworCW11dGV4X3VubG9jaygmY3NzW2NocGlkLmNzc2lkXS0+bXV0ZXgpOworCXJldHVybiByZXQ7CitvdXRfZnJlZToKKwlrZnJlZShjaHApOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogY2hwX2dldF9jaHBfZGVzYyAtIHJldHVybiBuZXdseSBhbGxvY2F0ZWQgY2hhbm5lbC1wYXRoIGRlc2NyaXB0aW9uCisgKiBAY2hwaWQ6IGNoYW5uZWwtcGF0aCBJRAorICoKKyAqIE9uIHN1Y2Nlc3MgcmV0dXJuIGEgbmV3bHkgYWxsb2NhdGVkIGNvcHkgb2YgdGhlIGNoYW5uZWwtcGF0aCBkZXNjcmlwdGlvbgorICogZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGNoYW5uZWwtcGF0aCBJRC4gUmV0dXJuICVOVUxMIG9uIGVycm9yLgorICovCit2b2lkICpjaHBfZ2V0X2NocF9kZXNjKHN0cnVjdCBjaHBfaWQgY2hwaWQpCit7CisJc3RydWN0IGNoYW5uZWxfcGF0aCAqY2hwOworCXN0cnVjdCBjaGFubmVsX3BhdGhfZGVzYyAqZGVzYzsKKworCWNocCA9IGNocGlkX3RvX2NocChjaHBpZCk7CisJaWYgKCFjaHApCisJCXJldHVybiBOVUxMOworCWRlc2MgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgY2hhbm5lbF9wYXRoX2Rlc2MpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRlc2MpCisJCXJldHVybiBOVUxMOworCW1lbWNweShkZXNjLCAmY2hwLT5kZXNjLCBzaXplb2Yoc3RydWN0IGNoYW5uZWxfcGF0aF9kZXNjKSk7CisJcmV0dXJuIGRlc2M7Cit9CisKKy8qKgorICogY2hwX3Byb2Nlc3NfY3J3IC0gcHJvY2VzcyBjaGFubmVsLXBhdGggc3RhdHVzIGNoYW5nZQorICogQGlkOiBjaGFubmVsLXBhdGggSUQgbnVtYmVyCisgKiBAc3RhdHVzOiBub24temVybyBpZiBjaGFubmVsLXBhdGggaGFzIGJlY29tZSBhdmFpbGFibGUsIHplcm8gb3RoZXJ3aXNlCisgKgorICogSGFuZGxlIGNoYW5uZWwtcmVwb3J0LXdvcmRzIGluZGljYXRpbmcgdGhhdCB0aGUgc3RhdHVzIG9mIGEgY2hhbm5lbC1wYXRoCisgKiBoYXMgY2hhbmdlZC4KKyAqLwordm9pZCBjaHBfcHJvY2Vzc19jcncoaW50IGlkLCBpbnQgc3RhdHVzKQoreworCXN0cnVjdCBjaHBfaWQgY2hwaWQ7CisKKwljaHBfaWRfaW5pdCgmY2hwaWQpOworCWNocGlkLmlkID0gaWQ7CisJaWYgKHN0YXR1cykgeworCQlpZiAoIWNocF9pc19yZWdpc3RlcmVkKGNocGlkKSkKKwkJCWNocF9uZXcoY2hwaWQpOworCQljaHNjX2NocF9vbmxpbmUoY2hwaWQpOworCX0gZWxzZQorCQljaHNjX2NocF9vZmZsaW5lKGNocGlkKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgaW5mb19iaXRfbnVtKHN0cnVjdCBjaHBfaWQgaWQpCit7CisJcmV0dXJuIGlkLmlkICsgaWQuY3NzaWQgKiAoX19NQVhfQ0hQSUQgKyAxKTsKK30KKworLyogRm9yY2UgY2hwX2luZm8gcmVmcmVzaCBvbiBuZXh0IGNhbGwgdG8gaW5mb192YWxpZGF0ZSgpLiAqLworc3RhdGljIHZvaWQgaW5mb19leHBpcmUodm9pZCkKK3sKKwltdXRleF9sb2NrKCZpbmZvX2xvY2spOworCWNocF9pbmZvX2V4cGlyZXMgPSBqaWZmaWVzIC0gMTsKKwltdXRleF91bmxvY2soJmluZm9fbG9jayk7Cit9CisKKy8qIEVuc3VyZSB0aGF0IGNocF9pbmZvIGlzIHVwLXRvLWRhdGUuICovCitzdGF0aWMgaW50IGluZm9fdXBkYXRlKHZvaWQpCit7CisJaW50IHJjOworCisJbXV0ZXhfbG9jaygmaW5mb19sb2NrKTsKKwlyYyA9IDA7CisJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgY2hwX2luZm9fZXhwaXJlcykpIHsKKwkJLyogRGF0YSBpcyB0b28gb2xkLCB1cGRhdGUuICovCisJCXJjID0gc2NscF9jaHBfcmVhZF9pbmZvKCZjaHBfaW5mbyk7CisJCWNocF9pbmZvX2V4cGlyZXMgPSBqaWZmaWVzICsgQ0hQX0lORk9fVVBEQVRFX0lOVEVSVkFMIDsKKwl9CisJbXV0ZXhfdW5sb2NrKCZpbmZvX2xvY2spOworCisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIGNocF9pbmZvX2dldF9zdGF0dXMgLSByZXRyaWV2ZSBjb25maWd1cmUgc3RhdHVzIG9mIGEgY2hhbm5lbC1wYXRoCisgKiBAY2hwaWQ6IGNoYW5uZWwtcGF0aCBJRAorICoKKyAqIE9uIHN1Y2Nlc3MsIHJldHVybiAwIGZvciBzdGFuZGJ5LCAxIGZvciBjb25maWd1cmVkLCAyIGZvciByZXNlcnZlZCwKKyAqIDMgZm9yIG5vdCByZWNvZ25pemVkLiBSZXR1cm4gbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBlcnJvci4KKyAqLworaW50IGNocF9pbmZvX2dldF9zdGF0dXMoc3RydWN0IGNocF9pZCBjaHBpZCkKK3sKKwlpbnQgcmM7CisJaW50IGJpdDsKKworCXJjID0gaW5mb191cGRhdGUoKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCWJpdCA9IGluZm9fYml0X251bShjaHBpZCk7CisJbXV0ZXhfbG9jaygmaW5mb19sb2NrKTsKKwlpZiAoIWNocF90ZXN0X2JpdChjaHBfaW5mby5yZWNvZ25pemVkLCBiaXQpKQorCQlyYyA9IENIUF9TVEFUVVNfTk9UX1JFQ09HTklaRUQ7CisJZWxzZSBpZiAoY2hwX3Rlc3RfYml0KGNocF9pbmZvLmNvbmZpZ3VyZWQsIGJpdCkpCisJCXJjID0gQ0hQX1NUQVRVU19DT05GSUdVUkVEOworCWVsc2UgaWYgKGNocF90ZXN0X2JpdChjaHBfaW5mby5zdGFuZGJ5LCBiaXQpKQorCQlyYyA9IENIUF9TVEFUVVNfU1RBTkRCWTsKKwllbHNlCisJCXJjID0gQ0hQX1NUQVRVU19SRVNFUlZFRDsKKwltdXRleF91bmxvY2soJmluZm9fbG9jayk7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qIFJldHVybiBjb25maWd1cmUgdGFzayBmb3IgY2hwaWQuICovCitzdGF0aWMgZW51bSBjZmdfdGFza190IGNmZ19nZXRfdGFzayhzdHJ1Y3QgY2hwX2lkIGNocGlkKQoreworCXJldHVybiBjaHBfY2ZnX3Rhc2tbY2hwaWQuY3NzaWRdW2NocGlkLmlkXTsKK30KKworLyogU2V0IGNvbmZpZ3VyZSB0YXNrIGZvciBjaHBpZC4gKi8KK3N0YXRpYyB2b2lkIGNmZ19zZXRfdGFzayhzdHJ1Y3QgY2hwX2lkIGNocGlkLCBlbnVtIGNmZ190YXNrX3QgY2ZnKQoreworCWNocF9jZmdfdGFza1tjaHBpZC5jc3NpZF1bY2hwaWQuaWRdID0gY2ZnOworfQorCisvKiBQZXJmb3JtIG9uZSBjb25maWd1cmUvZGVjb25maWd1cmUgcmVxdWVzdC4gUmVzY2hlZHVsZSB3b3JrIGZ1bmN0aW9uIHVudGlsCisgKiBsYXN0IHJlcXVlc3QuICovCitzdGF0aWMgdm9pZCBjZmdfZnVuYyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGNocF9pZCBjaHBpZDsKKwllbnVtIGNmZ190YXNrX3QgdDsKKworCW11dGV4X2xvY2soJmNmZ19sb2NrKTsKKwl0ID0gY2ZnX25vbmU7CisJY2hwX2lkX2Zvcl9lYWNoKCZjaHBpZCkgeworCQl0ID0gY2ZnX2dldF90YXNrKGNocGlkKTsKKwkJaWYgKHQgIT0gY2ZnX25vbmUpIHsKKwkJCWNmZ19zZXRfdGFzayhjaHBpZCwgY2ZnX25vbmUpOworCQkJYnJlYWs7CisJCX0KKwl9CisJbXV0ZXhfdW5sb2NrKCZjZmdfbG9jayk7CisKKwlzd2l0Y2ggKHQpIHsKKwljYXNlIGNmZ19jb25maWd1cmU6CisJCXNjbHBfY2hwX2NvbmZpZ3VyZShjaHBpZCk7CisJCWluZm9fZXhwaXJlKCk7CisJCWNoc2NfY2hwX29ubGluZShjaHBpZCk7CisJCWJyZWFrOworCWNhc2UgY2ZnX2RlY29uZmlndXJlOgorCQlzY2xwX2NocF9kZWNvbmZpZ3VyZShjaHBpZCk7CisJCWluZm9fZXhwaXJlKCk7CisJCWNoc2NfY2hwX29mZmxpbmUoY2hwaWQpOworCQlicmVhazsKKwljYXNlIGNmZ19ub25lOgorCQkvKiBHZXQgdXBkYXRlZCBpbmZvcm1hdGlvbiBhZnRlciBsYXN0IGNoYW5nZS4gKi8KKwkJaW5mb191cGRhdGUoKTsKKwkJbXV0ZXhfbG9jaygmY2ZnX2xvY2spOworCQljZmdfYnVzeSA9IDA7CisJCW11dGV4X3VubG9jaygmY2ZnX2xvY2spOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNmZ193YWl0X3F1ZXVlKTsKKwkJcmV0dXJuOworCX0KKwlxdWV1ZV93b3JrKGNocF93cSwgJmNmZ193b3JrKTsKK30KKworLyoqCisgKiBjaHBfY2ZnX3NjaGVkdWxlIC0gc2NoZWR1bGUgY2hwaWQgY29uZmlndXJhdGlvbiByZXF1ZXN0CisgKiBAY2hwaWQgLSBjaGFubmVsLXBhdGggSUQKKyAqIEBjb25maWd1cmUgLSBOb24temVybyBmb3IgY29uZmlndXJlLCB6ZXJvIGZvciBkZWNvbmZpZ3VyZQorICoKKyAqIFNjaGVkdWxlIGEgY2hhbm5lbC1wYXRoIGNvbmZpZ3VyYXRpb24vZGVjb25maWd1cmF0aW9uIHJlcXVlc3QuCisgKi8KK3ZvaWQgY2hwX2NmZ19zY2hlZHVsZShzdHJ1Y3QgY2hwX2lkIGNocGlkLCBpbnQgY29uZmlndXJlKQoreworCUNJT19NU0dfRVZFTlQoMiwgImNocF9jZmdfc2NoZWQleC4lMDJ4PSVkXG4iLCBjaHBpZC5jc3NpZCwgY2hwaWQuaWQsCisJCSAgICAgIGNvbmZpZ3VyZSk7CisJbXV0ZXhfbG9jaygmY2ZnX2xvY2spOworCWNmZ19zZXRfdGFzayhjaHBpZCwgY29uZmlndXJlID8gY2ZnX2NvbmZpZ3VyZSA6IGNmZ19kZWNvbmZpZ3VyZSk7CisJY2ZnX2J1c3kgPSAxOworCW11dGV4X3VubG9jaygmY2ZnX2xvY2spOworCXF1ZXVlX3dvcmsoY2hwX3dxLCAmY2ZnX3dvcmspOworfQorCisvKioKKyAqIGNocF9jZmdfY2FuY2VsX2RlY29uZmlndXJlIC0gY2FuY2VsIGNocGlkIGRlY29uZmlndXJhdGlvbiByZXF1ZXN0CisgKiBAY2hwaWQgLSBjaGFubmVsLXBhdGggSUQKKyAqCisgKiBDYW5jZWwgYW4gYWN0aXZlIGNoYW5uZWwtcGF0aCBkZWNvbmZpZ3VyYXRpb24gcmVxdWVzdCBpZiBpdCBoYXMgbm90IHlldAorICogYmVlbiBwZXJmb3JtZWQuCisgKi8KK3ZvaWQgY2hwX2NmZ19jYW5jZWxfZGVjb25maWd1cmUoc3RydWN0IGNocF9pZCBjaHBpZCkKK3sKKwlDSU9fTVNHX0VWRU5UKDIsICJjaHBfY2ZnX2NhbmNlbDoleC4lMDJ4XG4iLCBjaHBpZC5jc3NpZCwgY2hwaWQuaWQpOworCW11dGV4X2xvY2soJmNmZ19sb2NrKTsKKwlpZiAoY2ZnX2dldF90YXNrKGNocGlkKSA9PSBjZmdfZGVjb25maWd1cmUpCisJCWNmZ19zZXRfdGFzayhjaHBpZCwgY2ZnX25vbmUpOworCW11dGV4X3VubG9jaygmY2ZnX2xvY2spOworfQorCitzdGF0aWMgaW50IGNmZ193YWl0X2lkbGUodm9pZCkKK3sKKwlpZiAod2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGNmZ193YWl0X3F1ZXVlLCAhY2ZnX2J1c3kpKQorCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBjaHBfaW5pdCh2b2lkKQoreworCXN0cnVjdCBjaHBfaWQgY2hwaWQ7CisKKwljaHBfd3EgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgiY2lvX2NocCIpOworCWlmICghY2hwX3dxKQorCQlyZXR1cm4gLUVOT01FTTsKKwlJTklUX1dPUksoJmNmZ193b3JrLCBjZmdfZnVuYyk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmY2ZnX3dhaXRfcXVldWUpOworCWlmIChpbmZvX3VwZGF0ZSgpKQorCQlyZXR1cm4gMDsKKwkvKiBSZWdpc3RlciBhdmFpbGFibGUgY2hhbm5lbC1wYXRocy4gKi8KKwljaHBfaWRfZm9yX2VhY2goJmNocGlkKSB7CisJCWlmIChjaHBfaW5mb19nZXRfc3RhdHVzKGNocGlkKSAhPSBDSFBfU1RBVFVTX05PVF9SRUNPR05JWkVEKQorCQkJY2hwX25ldyhjaHBpZCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N1YnN5c19pbml0Y2FsbChjaHBfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2lvL2NocC5oIGIvZHJpdmVycy9zMzkwL2Npby9jaHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTI4NjU2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zMzkwL2Npby9jaHAuaApAQCAtMCwwICsxLDUzIEBACisvKgorICogIGRyaXZlcnMvczM5MC9jaW8vY2hwLmgKKyAqCisgKiAgICBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDcKKyAqICAgIEF1dGhvcihzKTogUGV0ZXIgT2JlcnBhcmxlaXRlciA8cGV0ZXIub2JlcnBhcmxlaXRlckBkZS5pYm0uY29tPgorICovCisKKyNpZm5kZWYgUzM5MF9DSFBfSAorI2RlZmluZSBTMzkwX0NIUF9IIFMzOTBfQ0hQX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8YXNtL2NocGlkLmg+CisjaW5jbHVkZSAiY2hzYy5oIgorCisjZGVmaW5lIENIUF9TVEFUVVNfU1RBTkRCWQkJMAorI2RlZmluZSBDSFBfU1RBVFVTX0NPTkZJR1VSRUQJCTEKKyNkZWZpbmUgQ0hQX1NUQVRVU19SRVNFUlZFRAkJMgorI2RlZmluZSBDSFBfU1RBVFVTX05PVF9SRUNPR05JWkVECTMKKworc3RhdGljIGlubGluZSBpbnQgY2hwX3Rlc3RfYml0KHU4ICpiaXRtYXAsIGludCBudW0pCit7CisJaW50IGJ5dGUgPSBudW0gPj4gMzsKKwlpbnQgbWFzayA9IDEyOCA+PiAobnVtICYgNyk7CisKKwlyZXR1cm4gKGJpdG1hcFtieXRlXSAmIG1hc2spID8gMSA6IDA7Cit9CisKKworc3RydWN0IGNoYW5uZWxfcGF0aCB7CisJc3RydWN0IGNocF9pZCBjaHBpZDsKKwlpbnQgc3RhdGU7CisJc3RydWN0IGNoYW5uZWxfcGF0aF9kZXNjIGRlc2M7CisJLyogQ2hhbm5lbC1tZWFzdXJlbWVudCByZWxhdGVkIHN0dWZmOiAqLworCWludCBjbWc7CisJaW50IHNoYXJlZDsKKwl2b2lkICpjbWdfY2hhcnM7CisJc3RydWN0IGRldmljZSBkZXY7Cit9OworCitpbnQgY2hwX2dldF9zdGF0dXMoc3RydWN0IGNocF9pZCBjaHBpZCk7Cit1OCBjaHBfZ2V0X3NjaF9vcG0oc3RydWN0IHN1YmNoYW5uZWwgKnNjaCk7CitpbnQgY2hwX2lzX3JlZ2lzdGVyZWQoc3RydWN0IGNocF9pZCBjaHBpZCk7Cit2b2lkICpjaHBfZ2V0X2NocF9kZXNjKHN0cnVjdCBjaHBfaWQgY2hwaWQpOwordm9pZCBjaHBfcHJvY2Vzc19jcncoaW50IGlkLCBpbnQgYXZhaWxhYmxlKTsKK3ZvaWQgY2hwX3JlbW92ZV9jbWdfYXR0cihzdHJ1Y3QgY2hhbm5lbF9wYXRoICpjaHApOworaW50IGNocF9hZGRfY21nX2F0dHIoc3RydWN0IGNoYW5uZWxfcGF0aCAqY2hwKTsKK2ludCBjaHBfbmV3KHN0cnVjdCBjaHBfaWQgY2hwaWQpOwordm9pZCBjaHBfY2ZnX3NjaGVkdWxlKHN0cnVjdCBjaHBfaWQgY2hwaWQsIGludCBjb25maWd1cmUpOwordm9pZCBjaHBfY2ZnX2NhbmNlbF9kZWNvbmZpZ3VyZShzdHJ1Y3QgY2hwX2lkIGNocGlkKTsKK2ludCBjaHBfaW5mb19nZXRfc3RhdHVzKHN0cnVjdCBjaHBfaWQgY2hwaWQpOworCisjZW5kaWYgLyogUzM5MF9DSFBfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9jaHNjLmMgYi9kcml2ZXJzL3MzOTAvY2lvL2Noc2MuYwppbmRleCA2ZjA1YTQ0Li5lYTkyYWM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2lvL2Noc2MuYworKysgYi9kcml2ZXJzL3MzOTAvY2lvL2Noc2MuYwpAQCAtMTUsMjAyICsxNSwxMjQgQEAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KIAogI2luY2x1ZGUgPGFzbS9jaW8uaD4KKyNpbmNsdWRlIDxhc20vY2hwaWQuaD4KIAogI2luY2x1ZGUgImNzcy5oIgogI2luY2x1ZGUgImNpby5oIgogI2luY2x1ZGUgImNpb19kZWJ1Zy5oIgogI2luY2x1ZGUgImlvYXNtLmgiCisjaW5jbHVkZSAiY2hwLmgiCiAjaW5jbHVkZSAiY2hzYy5oIgogCiBzdGF0aWMgdm9pZCAqc2VpX3BhZ2U7CiAKLXN0YXRpYyBpbnQgbmV3X2NoYW5uZWxfcGF0aChpbnQgY2hwaWQpOworc3RydWN0IGNoc2Nfc3NkX2FyZWEgeworCXN0cnVjdCBjaHNjX2hlYWRlciByZXF1ZXN0OworCXUxNiA6MTA7CisJdTE2IHNzaWQ6MjsKKwl1MTYgOjQ7CisJdTE2IGZfc2NoOwkgIC8qIGZpcnN0IHN1YmNoYW5uZWwgKi8KKwl1MTYgOjE2OworCXUxNiBsX3NjaDsJICAvKiBsYXN0IHN1YmNoYW5uZWwgKi8KKwl1MzIgOjMyOworCXN0cnVjdCBjaHNjX2hlYWRlciByZXNwb25zZTsKKwl1MzIgOjMyOworCXU4IHNjaF92YWxpZCA6IDE7CisJdTggZGV2X3ZhbGlkIDogMTsKKwl1OCBzdAkgICAgIDogMzsgLyogc3ViY2hhbm5lbCB0eXBlICovCisJdTggemVyb2VzICAgIDogMzsKKwl1OCAgdW5pdF9hZGRyOwkgIC8qIHVuaXQgYWRkcmVzcyAqLworCXUxNiBkZXZubzsJICAvKiBkZXZpY2UgbnVtYmVyICovCisJdTggcGF0aF9tYXNrOworCXU4IGZsYV92YWxpZF9tYXNrOworCXUxNiBzY2g7CSAgLyogc3ViY2hhbm5lbCAqLworCXU4IGNocGlkWzhdOwkgIC8qIGNocGlkcyAwLTcgKi8KKwl1MTYgZmxhWzhdOwkgIC8qIGZ1bGwgbGluayBhZGRyZXNzZXMgMC03ICovCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIAotc3RhdGljIGlubGluZSB2b2lkCi1zZXRfY2hwX2xvZ2ljYWxseV9vbmxpbmUoaW50IGNocCwgaW50IG9ub2ZmKQoraW50IGNoc2NfZ2V0X3NzZF9pbmZvKHN0cnVjdCBzdWJjaGFubmVsX2lkIHNjaGlkLCBzdHJ1Y3QgY2hzY19zc2RfaW5mbyAqc3NkKQogewotCWNzc1swXS0+Y2hwc1tjaHBdLT5zdGF0ZSA9IG9ub2ZmOwotfQorCXVuc2lnbmVkIGxvbmcgcGFnZTsKKwlzdHJ1Y3QgY2hzY19zc2RfYXJlYSAqc3NkX2FyZWE7CisJaW50IGNjb2RlOworCWludCByZXQ7CisJaW50IGk7CisJaW50IG1hc2s7CiAKLXN0YXRpYyBpbnQKLWdldF9jaHBfc3RhdHVzKGludCBjaHApCi17Ci0JcmV0dXJuIChjc3NbMF0tPmNocHNbY2hwXSA/IGNzc1swXS0+Y2hwc1tjaHBdLT5zdGF0ZSA6IC1FTk9ERVYpOwotfQotCi12b2lkCi1jaHNjX3ZhbGlkYXRlX2NocGlkcyhzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoKQotewotCWludCBtYXNrLCBjaHA7Ci0KLQlmb3IgKGNocCA9IDA7IGNocCA8PSA3OyBjaHArKykgewotCQltYXNrID0gMHg4MCA+PiBjaHA7Ci0JCWlmICghZ2V0X2NocF9zdGF0dXMoc2NoLT5zY2hpYi5wbWN3LmNocGlkW2NocF0pKQotCQkJLyogZGlzYWJsZSB1c2luZyB0aGlzIHBhdGggKi8KLQkJCXNjaC0+b3BtICY9IH5tYXNrOwotCX0KLX0KLQotdm9pZAotY2hwaWRfaXNfYWN0dWFsbHlfb25saW5lKGludCBjaHApCi17Ci0JaW50IHN0YXRlOwotCi0Jc3RhdGUgPSBnZXRfY2hwX3N0YXR1cyhjaHApOwotCWlmIChzdGF0ZSA8IDApIHsKLQkJbmVlZF9yZXNjYW4gPSAxOwotCQlxdWV1ZV93b3JrKHNsb3dfcGF0aF93cSwgJnNsb3dfcGF0aF93b3JrKTsKLQl9IGVsc2UKLQkJV0FSTl9PTighc3RhdGUpOwotfQotCi0vKiBGSVhNRTogdGhpcyBpcyBfYWx3YXlzXyBjYWxsZWQgZm9yIGV2ZXJ5IHN1YmNoYW5uZWwuIHNob3VsZG4ndCB3ZQotICoJICBwcm9jZXNzIG1vcmUgdGhhbiBvbmUgYXQgYSB0aW1lPyAqLwotc3RhdGljIGludAotY2hzY19nZXRfc2NoX2Rlc2NfaXJxKHN0cnVjdCBzdWJjaGFubmVsICpzY2gsIHZvaWQgKnBhZ2UpCi17Ci0JaW50IGNjb2RlLCBqOwotCi0Jc3RydWN0IHsKLQkJc3RydWN0IGNoc2NfaGVhZGVyIHJlcXVlc3Q7Ci0JCXUxNiByZXNlcnZlZDFhOjEwOwotCQl1MTYgc3NpZDoyOwotCQl1MTYgcmVzZXJ2ZWQxYjo0OwotCQl1MTYgZl9zY2g7CSAgLyogZmlyc3Qgc3ViY2hhbm5lbCAqLwotCQl1MTYgcmVzZXJ2ZWQyOwotCQl1MTYgbF9zY2g7CSAgLyogbGFzdCBzdWJjaGFubmVsICovCi0JCXUzMiByZXNlcnZlZDM7Ci0JCXN0cnVjdCBjaHNjX2hlYWRlciByZXNwb25zZTsKLQkJdTMyIHJlc2VydmVkNDsKLQkJdTggc2NoX3ZhbGlkIDogMTsKLQkJdTggZGV2X3ZhbGlkIDogMTsKLQkJdTggc3QJICAgICA6IDM7IC8qIHN1YmNoYW5uZWwgdHlwZSAqLwotCQl1OCB6ZXJvZXMgICAgOiAzOwotCQl1OCAgdW5pdF9hZGRyOwkgIC8qIHVuaXQgYWRkcmVzcyAqLwotCQl1MTYgZGV2bm87CSAgLyogZGV2aWNlIG51bWJlciAqLwotCQl1OCBwYXRoX21hc2s7Ci0JCXU4IGZsYV92YWxpZF9tYXNrOwotCQl1MTYgc2NoOwkgIC8qIHN1YmNoYW5uZWwgKi8KLQkJdTggY2hwaWRbOF07CSAgLyogY2hwaWRzIDAtNyAqLwotCQl1MTYgZmxhWzhdOwkgIC8qIGZ1bGwgbGluayBhZGRyZXNzZXMgMC03ICovCi0JfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgKnNzZF9hcmVhOwotCi0Jc3NkX2FyZWEgPSBwYWdlOwotCisJcGFnZSA9IGdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMIHwgR0ZQX0RNQSk7CisJaWYgKCFwYWdlKQorCQlyZXR1cm4gLUVOT01FTTsKKwlzc2RfYXJlYSA9IChzdHJ1Y3QgY2hzY19zc2RfYXJlYSAqKSBwYWdlOwogCXNzZF9hcmVhLT5yZXF1ZXN0Lmxlbmd0aCA9IDB4MDAxMDsKIAlzc2RfYXJlYS0+cmVxdWVzdC5jb2RlID0gMHgwMDA0OwotCi0Jc3NkX2FyZWEtPnNzaWQgPSBzY2gtPnNjaGlkLnNzaWQ7Ci0Jc3NkX2FyZWEtPmZfc2NoID0gc2NoLT5zY2hpZC5zY2hfbm87Ci0Jc3NkX2FyZWEtPmxfc2NoID0gc2NoLT5zY2hpZC5zY2hfbm87CisJc3NkX2FyZWEtPnNzaWQgPSBzY2hpZC5zc2lkOworCXNzZF9hcmVhLT5mX3NjaCA9IHNjaGlkLnNjaF9ubzsKKwlzc2RfYXJlYS0+bF9zY2ggPSBzY2hpZC5zY2hfbm87CiAKIAljY29kZSA9IGNoc2Moc3NkX2FyZWEpOworCS8qIENoZWNrIHJlc3BvbnNlLiAqLwogCWlmIChjY29kZSA+IDApIHsKLQkJcHJfZGVidWcoImNoc2MgcmV0dXJuZWQgd2l0aCBjY29kZSA9ICVkXG4iLCBjY29kZSk7Ci0JCXJldHVybiAoY2NvZGUgPT0gMykgPyAtRU5PREVWIDogLUVCVVNZOworCQlyZXQgPSAoY2NvZGUgPT0gMykgPyAtRU5PREVWIDogLUVCVVNZOworCQlnb3RvIG91dF9mcmVlOwogCX0KLQotCXN3aXRjaCAoc3NkX2FyZWEtPnJlc3BvbnNlLmNvZGUpIHsKLQljYXNlIDB4MDAwMTogLyogZXZlcnl0aGluZyBvayAqLwotCQlicmVhazsKLQljYXNlIDB4MDAwMjoKLQkJQ0lPX0NSV19FVkVOVCgyLCAiSW52YWxpZCBjb21tYW5kIVxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCWNhc2UgMHgwMDAzOgotCQlDSU9fQ1JXX0VWRU5UKDIsICJFcnJvciBpbiBjaHNjIHJlcXVlc3QgYmxvY2shXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JY2FzZSAweDAwMDQ6Ci0JCUNJT19DUldfRVZFTlQoMiwgIk1vZGVsIGRvZXMgbm90IHByb3ZpZGUgc3NkXG4iKTsKLQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCWRlZmF1bHQ6Ci0JCUNJT19DUldfRVZFTlQoMiwgIlVua25vd24gQ0hTQyByZXNwb25zZSAlZFxuIiwKKwlpZiAoc3NkX2FyZWEtPnJlc3BvbnNlLmNvZGUgIT0gMHgwMDAxKSB7CisJCUNJT19NU0dfRVZFTlQoMiwgImNoc2M6IHNzZCBmYWlsZWQgZm9yIDAuJXguJTA0eCAocmM9JTA0eClcbiIsCisJCQkgICAgICBzY2hpZC5zc2lkLCBzY2hpZC5zY2hfbm8sCiAJCQkgICAgICBzc2RfYXJlYS0+cmVzcG9uc2UuY29kZSk7Ci0JCXJldHVybiAtRUlPOworCQlyZXQgPSAtRUlPOworCQlnb3RvIG91dF9mcmVlOwogCX0KLQotCS8qCi0JICogc3NkX2FyZWEtPnN0IHN0b3JlcyB0aGUgdHlwZSBvZiB0aGUgZGV0ZWN0ZWQKLQkgKiBzdWJjaGFubmVsLCB3aXRoIHRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnM6Ci0JICoKLQkgKiAwOiBJL08gc3ViY2hhbm5lbDoJICBBbGwgZmllbGRzIGhhdmUgbWVhbmluZwotCSAqIDE6IENIU0Mgc3ViY2hhbm5lbDoJICBPbmx5IHNjaF92YWwsIHN0IGFuZCBzY2gKLQkgKgkJCSAgaGF2ZSBtZWFuaW5nCi0JICogMjogTWVzc2FnZSBzdWJjaGFubmVsOiBBbGwgZmllbGRzIGV4Y2VwdCB1bml0X2FkZHIKLQkgKgkJCSAgaGF2ZSBtZWFuaW5nCi0JICogMzogQURNIHN1YmNoYW5uZWw6CSAgT25seSBzY2hfdmFsLCBzdCBhbmQgc2NoCi0JICoJCQkgIGhhdmUgbWVhbmluZwotCSAqCi0JICogT3RoZXIgdHlwZXMgYXJlIGN1cnJlbnRseSB1bmRlZmluZWQuCi0JICovCi0JaWYgKHNzZF9hcmVhLT5zdCA+IDMpIHsgLyogdWhtLCB0aGF0IGxvb2tzIHN0cmFuZ2UuLi4gKi8KLQkJQ0lPX0NSV19FVkVOVCgwLCAiU3RyYW5nZSBzdWJjaGFubmVsIHR5cGUgJWQiCi0JCQkgICAgICAiIGZvciBzY2ggMC4leC4lMDR4XG4iLCBzc2RfYXJlYS0+c3QsCi0JCQkgICAgICBzY2gtPnNjaGlkLnNzaWQsIHNjaC0+c2NoaWQuc2NoX25vKTsKLQkJLyoKLQkJICogVGhlcmUgbWF5IGhhdmUgYmVlbiBhIG5ldyBzdWJjaGFubmVsIHR5cGUgZGVmaW5lZCBpbiB0aGUKLQkJICogdGltZSBzaW5jZSB0aGlzIGNvZGUgd2FzIHdyaXR0ZW47IHNpbmNlIHdlIGRvbid0IGtub3cgd2hpY2gKLQkJICogZmllbGRzIGhhdmUgbWVhbmluZyBhbmQgd2hhdCB0byBkbyB3aXRoIGl0IHdlIGp1c3QganVtcCBvdXQKLQkJICovCi0JCXJldHVybiAwOwotCX0gZWxzZSB7Ci0JCWNvbnN0IGNoYXIgKnR5cGVbNF0gPSB7IkkvTyIsICJjaHNjIiwgIm1lc3NhZ2UiLCAiQURNIn07Ci0JCUNJT19DUldfRVZFTlQoNiwgInNzZDogc2NoIDAuJXguJTA0eCBpcyAlcyBzdWJjaGFubmVsXG4iLAotCQkJICAgICAgc2NoLT5zY2hpZC5zc2lkLCBzY2gtPnNjaGlkLnNjaF9ubywKLQkJCSAgICAgIHR5cGVbc3NkX2FyZWEtPnN0XSk7Ci0KLQkJc2NoLT5zc2RfaW5mby52YWxpZCA9IDE7Ci0JCXNjaC0+c3NkX2luZm8udHlwZSA9IHNzZF9hcmVhLT5zdDsKKwlpZiAoIXNzZF9hcmVhLT5zY2hfdmFsaWQpIHsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBvdXRfZnJlZTsKIAl9Ci0KLQlpZiAoc3NkX2FyZWEtPnN0ID09IDAgfHwgc3NkX2FyZWEtPnN0ID09IDIpIHsKLQkJZm9yIChqID0gMDsgaiA8IDg7IGorKykgewotCQkJaWYgKCEoKDB4ODAgPj4gaikgJiBzc2RfYXJlYS0+cGF0aF9tYXNrICYKLQkJCSAgICAgIHNzZF9hcmVhLT5mbGFfdmFsaWRfbWFzaykpCi0JCQkJY29udGludWU7Ci0JCQlzY2gtPnNzZF9pbmZvLmNocGlkW2pdID0gc3NkX2FyZWEtPmNocGlkW2pdOwotCQkJc2NoLT5zc2RfaW5mby5mbGFbal0gICA9IHNzZF9hcmVhLT5mbGFbal07CisJLyogQ29weSBkYXRhICovCisJcmV0ID0gMDsKKwltZW1zZXQoc3NkLCAwLCBzaXplb2Yoc3RydWN0IGNoc2Nfc3NkX2luZm8pKTsKKwlpZiAoKHNzZF9hcmVhLT5zdCAhPSAwKSAmJiAoc3NkX2FyZWEtPnN0ICE9IDIpKQorCQlnb3RvIG91dF9mcmVlOworCXNzZC0+cGF0aF9tYXNrID0gc3NkX2FyZWEtPnBhdGhfbWFzazsKKwlzc2QtPmZsYV92YWxpZF9tYXNrID0gc3NkX2FyZWEtPmZsYV92YWxpZF9tYXNrOworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJbWFzayA9IDB4ODAgPj4gaTsKKwkJaWYgKHNzZF9hcmVhLT5wYXRoX21hc2sgJiBtYXNrKSB7CisJCQljaHBfaWRfaW5pdCgmc3NkLT5jaHBpZFtpXSk7CisJCQlzc2QtPmNocGlkW2ldLmlkID0gc3NkX2FyZWEtPmNocGlkW2ldOwogCQl9CisJCWlmIChzc2RfYXJlYS0+ZmxhX3ZhbGlkX21hc2sgJiBtYXNrKQorCQkJc3NkLT5mbGFbaV0gPSBzc2RfYXJlYS0+ZmxhW2ldOwogCX0KK291dF9mcmVlOgorCWZyZWVfcGFnZShwYWdlKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGNoZWNrX2Zvcl9pb19vbl9wYXRoKHN0cnVjdCBzdWJjaGFubmVsICpzY2gsIGludCBtYXNrKQoreworCWludCBjYzsKKworCWNjID0gc3RzY2goc2NoLT5zY2hpZCwgJnNjaC0+c2NoaWIpOworCWlmIChjYykKKwkJcmV0dXJuIDA7CisJaWYgKHNjaC0+c2NoaWIuc2Nzdy5hY3RsICYmIHNjaC0+c2NoaWIucG1jdy5scHVtID09IG1hc2spCisJCXJldHVybiAxOwogCXJldHVybiAwOwogfQogCi1pbnQKLWNzc19nZXRfc3NkX2luZm8oc3RydWN0IHN1YmNoYW5uZWwgKnNjaCkKK3N0YXRpYyB2b2lkIHRlcm1pbmF0ZV9pbnRlcm5hbF9pbyhzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoKQogewotCWludCByZXQ7Ci0Jdm9pZCAqcGFnZTsKLQotCXBhZ2UgPSAodm9pZCAqKWdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMIHwgR0ZQX0RNQSk7Ci0JaWYgKCFwYWdlKQotCQlyZXR1cm4gLUVOT01FTTsKLQlzcGluX2xvY2tfaXJxKHNjaC0+bG9jayk7Ci0JcmV0ID0gY2hzY19nZXRfc2NoX2Rlc2NfaXJxKHNjaCwgcGFnZSk7Ci0JaWYgKHJldCkgewotCQlzdGF0aWMgaW50IGNpb19jaHNjX2Vycl9tc2c7Ci0JCQotCQlpZiAoIWNpb19jaHNjX2Vycl9tc2cpIHsKLQkJCXByaW50ayhLRVJOX0VSUgotCQkJICAgICAgICJjaHNjX2dldF9zY2hfZGVzY3JpcHRpb25zOiIKLQkJCSAgICAgICAiIEVycm9yICVkIHdoaWxlIGRvaW5nIGNoc2M7ICIKLQkJCSAgICAgICAicHJvY2Vzc2luZyBzb21lIG1hY2hpbmUgY2hlY2tzIG1heSAiCi0JCQkgICAgICAgIm5vdCB3b3JrXG4iLCByZXQpOwotCQkJY2lvX2Noc2NfZXJyX21zZyA9IDE7Ci0JCX0KKwlpZiAoY2lvX2NsZWFyKHNjaCkpIHsKKwkJLyogUmVjaGVjayBkZXZpY2UgaW4gY2FzZSBjbGVhciBmYWlsZWQuICovCisJCXNjaC0+bHBtID0gMDsKKwkJaWYgKGRldmljZV90cmlnZ2VyX3ZlcmlmeShzY2gpICE9IDApCisJCQljc3Nfc2NoZWR1bGVfZXZhbChzY2gtPnNjaGlkKTsKKwkJcmV0dXJuOwogCX0KLQlzcGluX3VubG9ja19pcnEoc2NoLT5sb2NrKTsKLQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpcGFnZSk7Ci0JaWYgKCFyZXQpIHsKLQkJaW50IGosIGNocGlkLCBtYXNrOwotCQkvKiBBbGxvY2F0ZSBjaGFubmVsIHBhdGggc3RydWN0dXJlcywgaWYgbmVlZGVkLiAqLwotCQlmb3IgKGogPSAwOyBqIDwgODsgaisrKSB7Ci0JCQltYXNrID0gMHg4MCA+PiBqOwotCQkJY2hwaWQgPSBzY2gtPnNzZF9pbmZvLmNocGlkW2pdOwotCQkJaWYgKChzY2gtPnNjaGliLnBtY3cucGltICYgbWFzaykgJiYKLQkJCSAgICAoZ2V0X2NocF9zdGF0dXMoY2hwaWQpIDwgMCkpCi0JCQkgICAgbmV3X2NoYW5uZWxfcGF0aChjaHBpZCk7Ci0JCX0KLQl9Ci0JcmV0dXJuIHJldDsKKwkvKiBSZXF1ZXN0IHJldHJ5IG9mIGludGVybmFsIG9wZXJhdGlvbi4gKi8KKwlkZXZpY2Vfc2V0X2ludHJldHJ5KHNjaCk7CisJLyogQ2FsbCBoYW5kbGVyLiAqLworCWlmIChzY2gtPmRyaXZlciAmJiBzY2gtPmRyaXZlci0+dGVybWluYXRpb24pCisJCXNjaC0+ZHJpdmVyLT50ZXJtaW5hdGlvbigmc2NoLT5kZXYpOwogfQogCiBzdGF0aWMgaW50CkBAIC0yMTksNyArMTQxLDcgQEAKIAlpbnQgajsKIAlpbnQgbWFzazsKIAlzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoOwotCXN0cnVjdCBjaGFubmVsX3BhdGggKmNocGlkOworCXN0cnVjdCBjaHBfaWQgKmNocGlkOwogCXN0cnVjdCBzY2hpYiBzY2hpYjsKIAogCXNjaCA9IHRvX3N1YmNoYW5uZWwoZGV2KTsKQEAgLTI0MywxMDYgKzE2NSw1MCBAQAogCWlmIChzY2gtPnNjaGliLnBtY3cucGltID09IDB4ODApCiAJCWdvdG8gb3V0X3VucmVnOwogCi0JaWYgKChzY2gtPnNjaGliLnNjc3cuYWN0bCAmIFNDU1dfQUNUTF9ERVZBQ1QpICYmCi0JICAgIChzY2gtPnNjaGliLnNjc3cuYWN0bCAmIFNDU1dfQUNUTF9TQ0hBQ1QpICYmCi0JICAgIChzY2gtPnNjaGliLnBtY3cubHB1bSA9PSBtYXNrKSkgewotCQlpbnQgY2M7Ci0KLQkJY2MgPSBjaW9fY2xlYXIoc2NoKTsKLQkJaWYgKGNjID09IC1FTk9ERVYpCisJaWYgKGNoZWNrX2Zvcl9pb19vbl9wYXRoKHNjaCwgbWFzaykpIHsKKwkJaWYgKGRldmljZV9pc19vbmxpbmUoc2NoKSkKKwkJCWRldmljZV9raWxsX2lvKHNjaCk7CisJCWVsc2UgeworCQkJdGVybWluYXRlX2ludGVybmFsX2lvKHNjaCk7CisJCQkvKiBSZS1zdGFydCBwYXRoIHZlcmlmaWNhdGlvbi4gKi8KKwkJCWlmIChzY2gtPmRyaXZlciAmJiBzY2gtPmRyaXZlci0+dmVyaWZ5KQorCQkJCXNjaC0+ZHJpdmVyLT52ZXJpZnkoJnNjaC0+ZGV2KTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIHRyaWdnZXIgcGF0aCB2ZXJpZmljYXRpb24uICovCisJCWlmIChzY2gtPmRyaXZlciAmJiBzY2gtPmRyaXZlci0+dmVyaWZ5KQorCQkJc2NoLT5kcml2ZXItPnZlcmlmeSgmc2NoLT5kZXYpOworCQllbHNlIGlmIChzY2gtPmxwbSA9PSBtYXNrKQogCQkJZ290byBvdXRfdW5yZWc7Ci0JCS8qIFJlcXVlc3QgcmV0cnkgb2YgaW50ZXJuYWwgb3BlcmF0aW9uLiAqLwotCQlkZXZpY2Vfc2V0X2ludHJldHJ5KHNjaCk7Ci0JCS8qIENhbGwgaGFuZGxlci4gKi8KLQkJaWYgKHNjaC0+ZHJpdmVyICYmIHNjaC0+ZHJpdmVyLT50ZXJtaW5hdGlvbikKLQkJCXNjaC0+ZHJpdmVyLT50ZXJtaW5hdGlvbigmc2NoLT5kZXYpOwotCQlnb3RvIG91dF91bmxvY2s7CiAJfQogCi0JLyogdHJpZ2dlciBwYXRoIHZlcmlmaWNhdGlvbi4gKi8KLQlpZiAoc2NoLT5kcml2ZXIgJiYgc2NoLT5kcml2ZXItPnZlcmlmeSkKLQkJc2NoLT5kcml2ZXItPnZlcmlmeSgmc2NoLT5kZXYpOwotCWVsc2UgaWYgKHNjaC0+bHBtID09IG1hc2spCi0JCWdvdG8gb3V0X3VucmVnOwotb3V0X3VubG9jazoKIAlzcGluX3VubG9ja19pcnEoc2NoLT5sb2NrKTsKIAlyZXR1cm4gMDsKKwogb3V0X3VucmVnOgotCXNwaW5fdW5sb2NrX2lycShzY2gtPmxvY2spOwogCXNjaC0+bHBtID0gMDsKLQlpZiAoY3NzX2VucXVldWVfc3ViY2hhbm5lbF9zbG93KHNjaC0+c2NoaWQpKSB7Ci0JCWNzc19jbGVhcl9zdWJjaGFubmVsX3Nsb3dfbGlzdCgpOwotCQluZWVkX3Jlc2NhbiA9IDE7Ci0JfQorCXNwaW5fdW5sb2NrX2lycShzY2gtPmxvY2spOworCWNzc19zY2hlZHVsZV9ldmFsKHNjaC0+c2NoaWQpOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZAotczM5MF9zZXRfY2hwaWRfb2ZmbGluZSggX191OCBjaHBpZCkKK3ZvaWQgY2hzY19jaHBfb2ZmbGluZShzdHJ1Y3QgY2hwX2lkIGNocGlkKQogewogCWNoYXIgZGJmX3R4dFsxNV07Ci0Jc3RydWN0IGRldmljZSAqZGV2OwogCi0Jc3ByaW50ZihkYmZfdHh0LCAiY2hwciV4IiwgY2hwaWQpOworCXNwcmludGYoZGJmX3R4dCwgImNocHIleC4lMDJ4IiwgY2hwaWQuY3NzaWQsIGNocGlkLmlkKTsKIAlDSU9fVFJBQ0VfRVZFTlQoMiwgZGJmX3R4dCk7CiAKLQlpZiAoZ2V0X2NocF9zdGF0dXMoY2hwaWQpIDw9IDApCisJaWYgKGNocF9nZXRfc3RhdHVzKGNocGlkKSA8PSAwKQogCQlyZXR1cm47Ci0JZGV2ID0gZ2V0X2RldmljZSgmY3NzWzBdLT5jaHBzW2NocGlkXS0+ZGV2KTsKLQlidXNfZm9yX2VhY2hfZGV2KCZjc3NfYnVzX3R5cGUsIE5VTEwsIHRvX2NoYW5uZWxwYXRoKGRldiksCisJYnVzX2Zvcl9lYWNoX2RldigmY3NzX2J1c190eXBlLCBOVUxMLCAmY2hwaWQsCiAJCQkgczM5MF9zdWJjaGFubmVsX3JlbW92ZV9jaHBpZCk7Ci0KLQlpZiAobmVlZF9yZXNjYW4gfHwgY3NzX3Nsb3dfc3ViY2hhbm5lbHNfZXhpc3QoKSkKLQkJcXVldWVfd29yayhzbG93X3BhdGhfd3EsICZzbG93X3BhdGhfd29yayk7Ci0JcHV0X2RldmljZShkZXYpOwotfQotCi1zdHJ1Y3QgcmVzX2FjY19kYXRhIHsKLQlzdHJ1Y3QgY2hhbm5lbF9wYXRoICpjaHA7Ci0JdTMyIGZsYV9tYXNrOwotCXUxNiBmbGE7Ci19OwotCi1zdGF0aWMgaW50Ci1zMzkwX3Byb2Nlc3NfcmVzX2FjY19zY2goc3RydWN0IHJlc19hY2NfZGF0YSAqcmVzX2RhdGEsIHN0cnVjdCBzdWJjaGFubmVsICpzY2gpCi17Ci0JaW50IGZvdW5kOwotCWludCBjaHA7Ci0JaW50IGNjb2RlOwotCQotCWZvdW5kID0gMDsKLQlmb3IgKGNocCA9IDA7IGNocCA8PSA3OyBjaHArKykKLQkJLyoKLQkJICogY2hlY2sgaWYgY2hwaWQgaXMgaW4gaW5mb3JtYXRpb24gdXBkYXRlZCBieSBzc2QKLQkJICovCi0JCWlmIChzY2gtPnNzZF9pbmZvLnZhbGlkICYmCi0JCSAgICBzY2gtPnNzZF9pbmZvLmNocGlkW2NocF0gPT0gcmVzX2RhdGEtPmNocC0+aWQgJiYKLQkJICAgIChzY2gtPnNzZF9pbmZvLmZsYVtjaHBdICYgcmVzX2RhdGEtPmZsYV9tYXNrKQotCQkgICAgPT0gcmVzX2RhdGEtPmZsYSkgewotCQkJZm91bmQgPSAxOwotCQkJYnJlYWs7Ci0JCX0KLQkKLQlpZiAoZm91bmQgPT0gMCkKLQkJcmV0dXJuIDA7Ci0KLQkvKgotCSAqIERvIGEgc3RzY2ggdG8gdXBkYXRlIG91ciBzdWJjaGFubmVsIHN0cnVjdHVyZSB3aXRoIHRoZQotCSAqIG5ldyBwYXRoIGluZm9ybWF0aW9uIGFuZCBldmVudHVhbGx5IGNoZWNrIGZvciBsb2dpY2FsbHkKLQkgKiBvZmZsaW5lIGNocGlkcy4KLQkgKi8KLQljY29kZSA9IHN0c2NoKHNjaC0+c2NoaWQsICZzY2gtPnNjaGliKTsKLQlpZiAoY2NvZGUgPiAwKQotCQlyZXR1cm4gMDsKLQotCXJldHVybiAweDgwID4+IGNocDsKIH0KIAogc3RhdGljIGludAogczM5MF9wcm9jZXNzX3Jlc19hY2NfbmV3X3NjaChzdHJ1Y3Qgc3ViY2hhbm5lbF9pZCBzY2hpZCkKIHsKIAlzdHJ1Y3Qgc2NoaWIgc2NoaWI7Ci0JaW50IHJldDsKIAkvKgogCSAqIFdlIGRvbid0IGtub3cgdGhlIGRldmljZSB5ZXQsIGJ1dCBzaW5jZSBhIHBhdGgKIAkgKiBtYXkgYmUgYXZhaWxhYmxlIG5vdyB0byB0aGUgZGV2aWNlIHdlJ2xsIGhhdmUKQEAgLTM1MywxNCArMjE5LDM1IEBACiAJICovCiAJaWYgKHN0c2NoX2VycihzY2hpZCwgJnNjaGliKSkKIAkJLyogV2UncmUgdGhyb3VnaCAqLwotCQlyZXR1cm4gbmVlZF9yZXNjYW4gPyAtRUFHQUlOIDogLUVOWElPOworCQlyZXR1cm4gLUVOWElPOwogCiAJLyogUHV0IGl0IG9uIHRoZSBzbG93IHBhdGguICovCi0JcmV0ID0gY3NzX2VucXVldWVfc3ViY2hhbm5lbF9zbG93KHNjaGlkKTsKLQlpZiAocmV0KSB7Ci0JCWNzc19jbGVhcl9zdWJjaGFubmVsX3Nsb3dfbGlzdCgpOwotCQluZWVkX3Jlc2NhbiA9IDE7Ci0JCXJldHVybiAtRUFHQUlOOworCWNzc19zY2hlZHVsZV9ldmFsKHNjaGlkKTsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHJlc19hY2NfZGF0YSB7CisJc3RydWN0IGNocF9pZCBjaHBpZDsKKwl1MzIgZmxhX21hc2s7CisJdTE2IGZsYTsKK307CisKK3N0YXRpYyBpbnQgZ2V0X3Jlc19jaHBpZF9tYXNrKHN0cnVjdCBjaHNjX3NzZF9pbmZvICpzc2QsCisJCQkgICAgICBzdHJ1Y3QgcmVzX2FjY19kYXRhICpkYXRhKQoreworCWludCBpOworCWludCBtYXNrOworCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQltYXNrID0gMHg4MCA+PiBpOworCQlpZiAoIShzc2QtPnBhdGhfbWFzayAmIG1hc2spKQorCQkJY29udGludWU7CisJCWlmICghY2hwX2lkX2lzX2VxdWFsKCZzc2QtPmNocGlkW2ldLCAmZGF0YS0+Y2hwaWQpKQorCQkJY29udGludWU7CisJCWlmICgoc3NkLT5mbGFfdmFsaWRfbWFzayAmIG1hc2spICYmCisJCSAgICAoKHNzZC0+ZmxhW2ldICYgZGF0YS0+ZmxhX21hc2spICE9IGRhdGEtPmZsYSkpCisJCQljb250aW51ZTsKKwkJcmV0dXJuIG1hc2s7CiAJfQogCXJldHVybiAwOwogfQpAQCAtMzc5LDE0ICsyNjYsMTEgQEAKIAkJcmV0dXJuIHMzOTBfcHJvY2Vzc19yZXNfYWNjX25ld19zY2goc2NoaWQpOwogCiAJc3Bpbl9sb2NrX2lycShzY2gtPmxvY2spOwotCi0JY2hwX21hc2sgPSBzMzkwX3Byb2Nlc3NfcmVzX2FjY19zY2gocmVzX2RhdGEsIHNjaCk7Ci0KLQlpZiAoY2hwX21hc2sgPT0gMCkgewotCQlzcGluX3VubG9ja19pcnEoc2NoLT5sb2NrKTsKLQkJcHV0X2RldmljZSgmc2NoLT5kZXYpOwotCQlyZXR1cm4gMDsKLQl9CisJY2hwX21hc2sgPSBnZXRfcmVzX2NocGlkX21hc2soJnNjaC0+c3NkX2luZm8sIHJlc19kYXRhKTsKKwlpZiAoY2hwX21hc2sgPT0gMCkKKwkJZ290byBvdXQ7CisJaWYgKHN0c2NoKHNjaC0+c2NoaWQsICZzY2gtPnNjaGliKSkKKwkJZ290byBvdXQ7CiAJb2xkX2xwbSA9IHNjaC0+bHBtOwogCXNjaC0+bHBtID0gKChzY2gtPnNjaGliLnBtY3cucGltICYKIAkJICAgICBzY2gtPnNjaGliLnBtY3cucGFtICYKQEAgLTM5NiwyMCArMjgwLDE4IEBACiAJCWRldmljZV90cmlnZ2VyX3JlcHJvYmUoc2NoKTsKIAllbHNlIGlmIChzY2gtPmRyaXZlciAmJiBzY2gtPmRyaXZlci0+dmVyaWZ5KQogCQlzY2gtPmRyaXZlci0+dmVyaWZ5KCZzY2gtPmRldik7Ci0KK291dDoKIAlzcGluX3VubG9ja19pcnEoc2NoLT5sb2NrKTsKIAlwdXRfZGV2aWNlKCZzY2gtPmRldik7CiAJcmV0dXJuIDA7CiB9CiAKLQotc3RhdGljIGludAotczM5MF9wcm9jZXNzX3Jlc19hY2MgKHN0cnVjdCByZXNfYWNjX2RhdGEgKnJlc19kYXRhKQorc3RhdGljIHZvaWQgczM5MF9wcm9jZXNzX3Jlc19hY2MgKHN0cnVjdCByZXNfYWNjX2RhdGEgKnJlc19kYXRhKQogewotCWludCByYzsKIAljaGFyIGRiZl90eHRbMTVdOwogCi0Jc3ByaW50ZihkYmZfdHh0LCAiYWNjcHIleCIsIHJlc19kYXRhLT5jaHAtPmlkKTsKKwlzcHJpbnRmKGRiZl90eHQsICJhY2NwciV4LiUwMngiLCByZXNfZGF0YS0+Y2hwaWQuY3NzaWQsCisJCXJlc19kYXRhLT5jaHBpZC5pZCk7CiAJQ0lPX1RSQUNFX0VWRU5UKCAyLCBkYmZfdHh0KTsKIAlpZiAocmVzX2RhdGEtPmZsYSAhPSAwKSB7CiAJCXNwcmludGYoZGJmX3R4dCwgImZsYSV4IiwgcmVzX2RhdGEtPmZsYSk7CkBAIC00MjMsMTIgKzMwNSw3IEBACiAJICogVGhlIG1vcmUgaW5mb3JtYXRpb24gd2UgaGF2ZSAoaW5mbyksIHRoZSBsZXNzIHNjYW5uaW5nCiAJICogd2lsbCB3ZSBoYXZlIHRvIGRvLgogCSAqLwotCXJjID0gZm9yX2VhY2hfc3ViY2hhbm5lbChfX3MzOTBfcHJvY2Vzc19yZXNfYWNjLCByZXNfZGF0YSk7Ci0JaWYgKGNzc19zbG93X3N1YmNoYW5uZWxzX2V4aXN0KCkpCi0JCXJjID0gLUVBR0FJTjsKLQllbHNlIGlmIChyYyAhPSAtRUFHQUlOKQotCQlyYyA9IDA7Ci0JcmV0dXJuIHJjOworCWZvcl9lYWNoX3N1YmNoYW5uZWwoX19zMzkwX3Byb2Nlc3NfcmVzX2FjYywgcmVzX2RhdGEpOwogfQogCiBzdGF0aWMgaW50CkBAIC00ODAsNDMgKzM1Nyw0NSBAQAogCS8qIGNjZGYgaGFzIHRvIGJlIGJpZyBlbm91Z2ggZm9yIGEgbGluay1pbmNpZGVudCByZWNvcmQgKi8KIH0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCi1zdGF0aWMgaW50IGNoc2NfcHJvY2Vzc19zZWlfbGlua19pbmNpZGVudChzdHJ1Y3QgY2hzY19zZWlfYXJlYSAqc2VpX2FyZWEpCitzdGF0aWMgdm9pZCBjaHNjX3Byb2Nlc3Nfc2VpX2xpbmtfaW5jaWRlbnQoc3RydWN0IGNoc2Nfc2VpX2FyZWEgKnNlaV9hcmVhKQogewotCWludCBjaHBpZDsKKwlzdHJ1Y3QgY2hwX2lkIGNocGlkOworCWludCBpZDsKIAogCUNJT19DUldfRVZFTlQoNCwgImNoc2M6IGxpbmsgaW5jaWRlbnQgKHJzPSUwMngsIHJzX2lkPSUwNHgpXG4iLAogCQkgICAgICBzZWlfYXJlYS0+cnMsIHNlaV9hcmVhLT5yc2lkKTsKIAlpZiAoc2VpX2FyZWEtPnJzICE9IDQpCi0JCXJldHVybiAwOwotCWNocGlkID0gX19nZXRfY2hwaWRfZnJvbV9saXIoc2VpX2FyZWEtPmNjZGYpOwotCWlmIChjaHBpZCA8IDApCisJCXJldHVybjsKKwlpZCA9IF9fZ2V0X2NocGlkX2Zyb21fbGlyKHNlaV9hcmVhLT5jY2RmKTsKKwlpZiAoaWQgPCAwKQogCQlDSU9fQ1JXX0VWRU5UKDQsICJjaHNjOiBsaW5rIGluY2lkZW50IC0gaW52YWxpZCBMSVJcbiIpOwotCWVsc2UKLQkJczM5MF9zZXRfY2hwaWRfb2ZmbGluZShjaHBpZCk7Ci0KLQlyZXR1cm4gMDsKKwllbHNlIHsKKwkJY2hwX2lkX2luaXQoJmNocGlkKTsKKwkJY2hwaWQuaWQgPSBpZDsKKwkJY2hzY19jaHBfb2ZmbGluZShjaHBpZCk7CisJfQogfQogCi1zdGF0aWMgaW50IGNoc2NfcHJvY2Vzc19zZWlfcmVzX2FjYyhzdHJ1Y3QgY2hzY19zZWlfYXJlYSAqc2VpX2FyZWEpCitzdGF0aWMgdm9pZCBjaHNjX3Byb2Nlc3Nfc2VpX3Jlc19hY2Moc3RydWN0IGNoc2Nfc2VpX2FyZWEgKnNlaV9hcmVhKQogewogCXN0cnVjdCByZXNfYWNjX2RhdGEgcmVzX2RhdGE7Ci0Jc3RydWN0IGRldmljZSAqZGV2OworCXN0cnVjdCBjaHBfaWQgY2hwaWQ7CiAJaW50IHN0YXR1czsKLQlpbnQgcmM7CiAKIAlDSU9fQ1JXX0VWRU5UKDQsICJjaHNjOiByZXNvdXJjZSBhY2Nlc3NpYmlsaXR5IGV2ZW50IChycz0lMDJ4LCAiCiAJCSAgICAgICJyc19pZD0lMDR4KVxuIiwgc2VpX2FyZWEtPnJzLCBzZWlfYXJlYS0+cnNpZCk7CiAJaWYgKHNlaV9hcmVhLT5ycyAhPSA0KQotCQlyZXR1cm4gMDsKKwkJcmV0dXJuOworCWNocF9pZF9pbml0KCZjaHBpZCk7CisJY2hwaWQuaWQgPSBzZWlfYXJlYS0+cnNpZDsKIAkvKiBhbGxvY2F0ZSBhIG5ldyBjaGFubmVsIHBhdGggc3RydWN0dXJlLCBpZiBuZWVkZWQgKi8KLQlzdGF0dXMgPSBnZXRfY2hwX3N0YXR1cyhzZWlfYXJlYS0+cnNpZCk7CisJc3RhdHVzID0gY2hwX2dldF9zdGF0dXMoY2hwaWQpOwogCWlmIChzdGF0dXMgPCAwKQotCQluZXdfY2hhbm5lbF9wYXRoKHNlaV9hcmVhLT5yc2lkKTsKKwkJY2hwX25ldyhjaHBpZCk7CiAJZWxzZSBpZiAoIXN0YXR1cykKLQkJcmV0dXJuIDA7Ci0JZGV2ID0gZ2V0X2RldmljZSgmY3NzWzBdLT5jaHBzW3NlaV9hcmVhLT5yc2lkXS0+ZGV2KTsKKwkJcmV0dXJuOwogCW1lbXNldCgmcmVzX2RhdGEsIDAsIHNpemVvZihzdHJ1Y3QgcmVzX2FjY19kYXRhKSk7Ci0JcmVzX2RhdGEuY2hwID0gdG9fY2hhbm5lbHBhdGgoZGV2KTsKKwlyZXNfZGF0YS5jaHBpZCA9IGNocGlkOwogCWlmICgoc2VpX2FyZWEtPnZmICYgMHhjMCkgIT0gMCkgewogCQlyZXNfZGF0YS5mbGEgPSBzZWlfYXJlYS0+ZmxhOwogCQlpZiAoKHNlaV9hcmVhLT52ZiAmIDB4YzApID09IDB4YzApCkBAIC01MjYsNTEgKzQwNSw4MiBAQAogCQkJLyogbGluayBhZGRyZXNzICovCiAJCQlyZXNfZGF0YS5mbGFfbWFzayA9IDB4ZmYwMDsKIAl9Ci0JcmMgPSBzMzkwX3Byb2Nlc3NfcmVzX2FjYygmcmVzX2RhdGEpOwotCXB1dF9kZXZpY2UoZGV2KTsKLQotCXJldHVybiByYzsKKwlzMzkwX3Byb2Nlc3NfcmVzX2FjYygmcmVzX2RhdGEpOwogfQogCi1zdGF0aWMgaW50IGNoc2NfcHJvY2Vzc19zZWkoc3RydWN0IGNoc2Nfc2VpX2FyZWEgKnNlaV9hcmVhKQotewotCWludCByYzsKK3N0cnVjdCBjaHBfY29uZmlnX2RhdGEgeworCXU4IG1hcFszMl07CisJdTggb3A7CisJdTggcGM7Cit9OwogCitzdGF0aWMgdm9pZCBjaHNjX3Byb2Nlc3Nfc2VpX2NocF9jb25maWcoc3RydWN0IGNoc2Nfc2VpX2FyZWEgKnNlaV9hcmVhKQoreworCXN0cnVjdCBjaHBfY29uZmlnX2RhdGEgKmRhdGE7CisJc3RydWN0IGNocF9pZCBjaHBpZDsKKwlpbnQgbnVtOworCisJQ0lPX0NSV19FVkVOVCg0LCAiY2hzYzogY2hhbm5lbC1wYXRoLWNvbmZpZ3VyYXRpb24gbm90aWZpY2F0aW9uXG4iKTsKKwlpZiAoc2VpX2FyZWEtPnJzICE9IDApCisJCXJldHVybjsKKwlkYXRhID0gKHN0cnVjdCBjaHBfY29uZmlnX2RhdGEgKikgJihzZWlfYXJlYS0+Y2NkZik7CisJY2hwX2lkX2luaXQoJmNocGlkKTsKKwlmb3IgKG51bSA9IDA7IG51bSA8PSBfX01BWF9DSFBJRDsgbnVtKyspIHsKKwkJaWYgKCFjaHBfdGVzdF9iaXQoZGF0YS0+bWFwLCBudW0pKQorCQkJY29udGludWU7CisJCWNocGlkLmlkID0gbnVtOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJjaW86IHByb2Nlc3NpbmcgY29uZmlndXJlIGV2ZW50ICVkIGZvciAiCisJCSAgICAgICAiY2hwaWQgJXguJTAyeFxuIiwgZGF0YS0+b3AsIGNocGlkLmNzc2lkLCBjaHBpZC5pZCk7CisJCXN3aXRjaCAoZGF0YS0+b3ApIHsKKwkJY2FzZSAwOgorCQkJY2hwX2NmZ19zY2hlZHVsZShjaHBpZCwgMSk7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJY2hwX2NmZ19zY2hlZHVsZShjaHBpZCwgMCk7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJY2hwX2NmZ19jYW5jZWxfZGVjb25maWd1cmUoY2hwaWQpOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGNoc2NfcHJvY2Vzc19zZWkoc3RydWN0IGNoc2Nfc2VpX2FyZWEgKnNlaV9hcmVhKQorewogCS8qIENoZWNrIGlmIHdlIG1pZ2h0IGhhdmUgbG9zdCBzb21lIGluZm9ybWF0aW9uLiAqLwotCWlmIChzZWlfYXJlYS0+ZmxhZ3MgJiAweDQwKQorCWlmIChzZWlfYXJlYS0+ZmxhZ3MgJiAweDQwKSB7CiAJCUNJT19DUldfRVZFTlQoMiwgImNoc2M6IGV2ZW50IG92ZXJmbG93XG4iKTsKKwkJY3NzX3NjaGVkdWxlX2V2YWxfYWxsKCk7CisJfQogCS8qIHdoaWNoIGtpbmQgb2YgaW5mb3JtYXRpb24gd2FzIHN0b3JlZD8gKi8KLQlyYyA9IDA7CiAJc3dpdGNoIChzZWlfYXJlYS0+Y2MpIHsKIAljYXNlIDE6IC8qIGxpbmsgaW5jaWRlbnQqLwotCQlyYyA9IGNoc2NfcHJvY2Vzc19zZWlfbGlua19pbmNpZGVudChzZWlfYXJlYSk7CisJCWNoc2NfcHJvY2Vzc19zZWlfbGlua19pbmNpZGVudChzZWlfYXJlYSk7CiAJCWJyZWFrOwogCWNhc2UgMjogLyogaS9vIHJlc291cmNlIGFjY2Vzc2liaWxpeSAqLwotCQlyYyA9IGNoc2NfcHJvY2Vzc19zZWlfcmVzX2FjYyhzZWlfYXJlYSk7CisJCWNoc2NfcHJvY2Vzc19zZWlfcmVzX2FjYyhzZWlfYXJlYSk7CisJCWJyZWFrOworCWNhc2UgODogLyogY2hhbm5lbC1wYXRoLWNvbmZpZ3VyYXRpb24gbm90aWZpY2F0aW9uICovCisJCWNoc2NfcHJvY2Vzc19zZWlfY2hwX2NvbmZpZyhzZWlfYXJlYSk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6IC8qIG90aGVyIHN0dWZmICovCiAJCUNJT19DUldfRVZFTlQoNCwgImNoc2M6IHVuaGFuZGxlZCBzZWkgY29udGVudCBjb2RlICVkXG4iLAogCQkJICAgICAgc2VpX2FyZWEtPmNjKTsKIAkJYnJlYWs7CiAJfQotCi0JcmV0dXJuIHJjOwogfQogCi1pbnQgY2hzY19wcm9jZXNzX2Nydyh2b2lkKQordm9pZCBjaHNjX3Byb2Nlc3NfY3J3KHZvaWQpCiB7CiAJc3RydWN0IGNoc2Nfc2VpX2FyZWEgKnNlaV9hcmVhOwotCWludCByZXQ7Ci0JaW50IHJjOwogCiAJaWYgKCFzZWlfcGFnZSkKLQkJcmV0dXJuIDA7CisJCXJldHVybjsKIAkvKiBBY2Nlc3MgdG8gc2VpX3BhZ2UgaXMgc2VyaWFsaXplZCB0aHJvdWdoIG1hY2hpbmUgY2hlY2sgaGFuZGxlcgogCSAqIHRocmVhZCwgc28gbm8gbmVlZCBmb3IgbG9ja2luZy4gKi8KIAlzZWlfYXJlYSA9IHNlaV9wYWdlOwogCiAJQ0lPX1RSQUNFX0VWRU5UKCAyLCAicHJjc3MiKTsKLQlyZXQgPSAwOwogCWRvIHsKIAkJbWVtc2V0KHNlaV9hcmVhLCAwLCBzaXplb2YoKnNlaV9hcmVhKSk7CiAJCXNlaV9hcmVhLT5yZXF1ZXN0Lmxlbmd0aCA9IDB4MDAxMDsKQEAgLTU4MCwzNyArNDkwLDI2IEBACiAKIAkJaWYgKHNlaV9hcmVhLT5yZXNwb25zZS5jb2RlID09IDB4MDAwMSkgewogCQkJQ0lPX0NSV19FVkVOVCg0LCAiY2hzYzogc2VpIHN1Y2Nlc3NmdWxcbiIpOwotCQkJcmMgPSBjaHNjX3Byb2Nlc3Nfc2VpKHNlaV9hcmVhKTsKLQkJCWlmIChyYykKLQkJCQlyZXQgPSByYzsKKwkJCWNoc2NfcHJvY2Vzc19zZWkoc2VpX2FyZWEpOwogCQl9IGVsc2UgewogCQkJQ0lPX0NSV19FVkVOVCgyLCAiY2hzYzogc2VpIGZhaWxlZCAocmM9JTA0eClcbiIsCiAJCQkJICAgICAgc2VpX2FyZWEtPnJlc3BvbnNlLmNvZGUpOwotCQkJcmV0ID0gMDsKIAkJCWJyZWFrOwogCQl9CiAJfSB3aGlsZSAoc2VpX2FyZWEtPmZsYWdzICYgMHg4MCk7Ci0KLQlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50CiBfX2NocF9hZGRfbmV3X3NjaChzdHJ1Y3Qgc3ViY2hhbm5lbF9pZCBzY2hpZCkKIHsKIAlzdHJ1Y3Qgc2NoaWIgc2NoaWI7Ci0JaW50IHJldDsKIAogCWlmIChzdHNjaF9lcnIoc2NoaWQsICZzY2hpYikpCiAJCS8qIFdlJ3JlIHRocm91Z2ggKi8KLQkJcmV0dXJuIG5lZWRfcmVzY2FuID8gLUVBR0FJTiA6IC1FTlhJTzsKKwkJcmV0dXJuIC1FTlhJTzsKIAogCS8qIFB1dCBpdCBvbiB0aGUgc2xvdyBwYXRoLiAqLwotCXJldCA9IGNzc19lbnF1ZXVlX3N1YmNoYW5uZWxfc2xvdyhzY2hpZCk7Ci0JaWYgKHJldCkgewotCQljc3NfY2xlYXJfc3ViY2hhbm5lbF9zbG93X2xpc3QoKTsKLQkJbmVlZF9yZXNjYW4gPSAxOwotCQlyZXR1cm4gLUVBR0FJTjsKLQl9CisJY3NzX3NjaGVkdWxlX2V2YWwoc2NoaWQpOwogCXJldHVybiAwOwogfQogCkBAIC02MTksMTAgKzUxOCwxMCBAQAogX19jaHBfYWRkKHN0cnVjdCBzdWJjaGFubmVsX2lkIHNjaGlkLCB2b2lkICpkYXRhKQogewogCWludCBpLCBtYXNrOwotCXN0cnVjdCBjaGFubmVsX3BhdGggKmNocDsKKwlzdHJ1Y3QgY2hwX2lkICpjaHBpZDsKIAlzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoOwogCi0JY2hwID0gZGF0YTsKKwljaHBpZCA9IGRhdGE7CiAJc2NoID0gZ2V0X3N1YmNoYW5uZWxfYnlfc2NoaWQoc2NoaWQpOwogCWlmICghc2NoKQogCQkvKiBDaGVjayBpZiB0aGUgc3ViY2hhbm5lbCBpcyBub3cgYXZhaWxhYmxlLiAqLwpAQCAtNjMxLDcgKzUzMCw3IEBACiAJZm9yIChpPTA7IGk8ODsgaSsrKSB7CiAJCW1hc2sgPSAweDgwID4+IGk7CiAJCWlmICgoc2NoLT5zY2hpYi5wbWN3LnBpbSAmIG1hc2spICYmCi0JCSAgICAoc2NoLT5zY2hpYi5wbWN3LmNocGlkW2ldID09IGNocC0+aWQpKSB7CisJCSAgICAoc2NoLT5zY2hpYi5wbWN3LmNocGlkW2ldID09IGNocGlkLT5pZCkpIHsKIAkJCWlmIChzdHNjaChzY2gtPnNjaGlkLCAmc2NoLT5zY2hpYikgIT0gMCkgewogCQkJCS8qIEVuZGdhbWUuICovCiAJCQkJc3Bpbl91bmxvY2tfaXJxKHNjaC0+bG9jayk7CkBAIC02NTcsMTIyICs1NTYsNTggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludAotY2hwX2FkZChpbnQgY2hwaWQpCit2b2lkIGNoc2NfY2hwX29ubGluZShzdHJ1Y3QgY2hwX2lkIGNocGlkKQogewotCWludCByYzsKIAljaGFyIGRiZl90eHRbMTVdOwotCXN0cnVjdCBkZXZpY2UgKmRldjsKIAotCWlmICghZ2V0X2NocF9zdGF0dXMoY2hwaWQpKQotCQlyZXR1cm4gMDsgLyogbm8gbmVlZCB0byBkbyB0aGUgcmVzdCAqLwotCQotCXNwcmludGYoZGJmX3R4dCwgImNhZGQleCIsIGNocGlkKTsKKwlzcHJpbnRmKGRiZl90eHQsICJjYWRkJXguJTAyeCIsIGNocGlkLmNzc2lkLCBjaHBpZC5pZCk7CiAJQ0lPX1RSQUNFX0VWRU5UKDIsIGRiZl90eHQpOwogCi0JZGV2ID0gZ2V0X2RldmljZSgmY3NzWzBdLT5jaHBzW2NocGlkXS0+ZGV2KTsKLQlyYyA9IGZvcl9lYWNoX3N1YmNoYW5uZWwoX19jaHBfYWRkLCB0b19jaGFubmVscGF0aChkZXYpKTsKLQlpZiAoY3NzX3Nsb3dfc3ViY2hhbm5lbHNfZXhpc3QoKSkKLQkJcmMgPSAtRUFHQUlOOwotCWlmIChyYyAhPSAtRUFHQUlOKQotCQlyYyA9IDA7Ci0JcHV0X2RldmljZShkZXYpOwotCXJldHVybiByYzsKKwlpZiAoY2hwX2dldF9zdGF0dXMoY2hwaWQpICE9IDApCisJCWZvcl9lYWNoX3N1YmNoYW5uZWwoX19jaHBfYWRkLCAmY2hwaWQpOwogfQogCi0vKiAKLSAqIEhhbmRsaW5nIG9mIGNydyBtYWNoaW5lIGNoZWNrcyB3aXRoIGNoYW5uZWwgcGF0aCBzb3VyY2UuCi0gKi8KLWludAotY2hwX3Byb2Nlc3NfY3J3KGludCBjaHBpZCwgaW50IG9uKQotewotCWlmIChvbiA9PSAwKSB7Ci0JCS8qIFBhdGggaGFzIGdvbmUuIFdlIHVzZSB0aGUgbGluayBpbmNpZGVudCByb3V0aW5lLiovCi0JCXMzOTBfc2V0X2NocGlkX29mZmxpbmUoY2hwaWQpOwotCQlyZXR1cm4gMDsgLyogRGUtcmVnaXN0ZXIgaXMgYXN5bmMgYW55d2F5LiAqLwotCX0KLQkvKgotCSAqIFBhdGggaGFzIGNvbWUuIEFsbG9jYXRlIGEgbmV3IGNoYW5uZWwgcGF0aCBzdHJ1Y3R1cmUsCi0JICogaWYgbmVlZGVkLgotCSAqLwotCWlmIChnZXRfY2hwX3N0YXR1cyhjaHBpZCkgPCAwKQotCQluZXdfY2hhbm5lbF9wYXRoKGNocGlkKTsKLQkvKiBBdm9pZCB0aGUgZXh0cmEgb3ZlcmhlYWQgaW4gcHJvY2Vzc19yZWNfYWNjLiAqLwotCXJldHVybiBjaHBfYWRkKGNocGlkKTsKLX0KLQotc3RhdGljIGludCBjaGVja19mb3JfaW9fb25fcGF0aChzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoLCBpbnQgaW5kZXgpCi17Ci0JaW50IGNjOwotCi0JY2MgPSBzdHNjaChzY2gtPnNjaGlkLCAmc2NoLT5zY2hpYik7Ci0JaWYgKGNjKQotCQlyZXR1cm4gMDsKLQlpZiAoc2NoLT5zY2hpYi5zY3N3LmFjdGwgJiYgc2NoLT5zY2hpYi5wbWN3LmxwdW0gPT0gKDB4ODAgPj4gaW5kZXgpKQotCQlyZXR1cm4gMTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgdGVybWluYXRlX2ludGVybmFsX2lvKHN0cnVjdCBzdWJjaGFubmVsICpzY2gpCi17Ci0JaWYgKGNpb19jbGVhcihzY2gpKSB7Ci0JCS8qIFJlY2hlY2sgZGV2aWNlIGluIGNhc2UgY2xlYXIgZmFpbGVkLiAqLwotCQlzY2gtPmxwbSA9IDA7Ci0JCWlmIChkZXZpY2VfdHJpZ2dlcl92ZXJpZnkoc2NoKSAhPSAwKSB7Ci0JCQlpZihjc3NfZW5xdWV1ZV9zdWJjaGFubmVsX3Nsb3coc2NoLT5zY2hpZCkpIHsKLQkJCQljc3NfY2xlYXJfc3ViY2hhbm5lbF9zbG93X2xpc3QoKTsKLQkJCQluZWVkX3Jlc2NhbiA9IDE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQkvKiBSZXF1ZXN0IHJldHJ5IG9mIGludGVybmFsIG9wZXJhdGlvbi4gKi8KLQlkZXZpY2Vfc2V0X2ludHJldHJ5KHNjaCk7Ci0JLyogQ2FsbCBoYW5kbGVyLiAqLwotCWlmIChzY2gtPmRyaXZlciAmJiBzY2gtPmRyaXZlci0+dGVybWluYXRpb24pCi0JCXNjaC0+ZHJpdmVyLT50ZXJtaW5hdGlvbigmc2NoLT5kZXYpOwotfQotCi1zdGF0aWMgdm9pZAotX19zMzkwX3N1YmNoYW5uZWxfdmFyeV9jaHBpZChzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoLCBfX3U4IGNocGlkLCBpbnQgb24pCitzdGF0aWMgdm9pZCBfX3MzOTBfc3ViY2hhbm5lbF92YXJ5X2NocGlkKHN0cnVjdCBzdWJjaGFubmVsICpzY2gsCisJCQkJCSBzdHJ1Y3QgY2hwX2lkIGNocGlkLCBpbnQgb24pCiB7CiAJaW50IGNocCwgb2xkX2xwbTsKKwlpbnQgbWFzazsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JaWYgKCFzY2gtPnNzZF9pbmZvLnZhbGlkKQotCQlyZXR1cm47Ci0JCiAJc3Bpbl9sb2NrX2lycXNhdmUoc2NoLT5sb2NrLCBmbGFncyk7CiAJb2xkX2xwbSA9IHNjaC0+bHBtOwogCWZvciAoY2hwID0gMDsgY2hwIDwgODsgY2hwKyspIHsKLQkJaWYgKHNjaC0+c3NkX2luZm8uY2hwaWRbY2hwXSAhPSBjaHBpZCkKKwkJbWFzayA9IDB4ODAgPj4gY2hwOworCQlpZiAoIShzY2gtPnNzZF9pbmZvLnBhdGhfbWFzayAmIG1hc2spKQorCQkJY29udGludWU7CisJCWlmICghY2hwX2lkX2lzX2VxdWFsKCZzY2gtPnNzZF9pbmZvLmNocGlkW2NocF0sICZjaHBpZCkpCiAJCQljb250aW51ZTsKIAogCQlpZiAob24pIHsKLQkJCXNjaC0+b3BtIHw9ICgweDgwID4+IGNocCk7Ci0JCQlzY2gtPmxwbSB8PSAoMHg4MCA+PiBjaHApOworCQkJc2NoLT5vcG0gfD0gbWFzazsKKwkJCXNjaC0+bHBtIHw9IG1hc2s7CiAJCQlpZiAoIW9sZF9scG0pCiAJCQkJZGV2aWNlX3RyaWdnZXJfcmVwcm9iZShzY2gpOwogCQkJZWxzZSBpZiAoc2NoLT5kcml2ZXIgJiYgc2NoLT5kcml2ZXItPnZlcmlmeSkKIAkJCQlzY2gtPmRyaXZlci0+dmVyaWZ5KCZzY2gtPmRldik7CiAJCQlicmVhazsKIAkJfQotCQlzY2gtPm9wbSAmPSB+KDB4ODAgPj4gY2hwKTsKLQkJc2NoLT5scG0gJj0gfigweDgwID4+IGNocCk7Ci0JCWlmIChjaGVja19mb3JfaW9fb25fcGF0aChzY2gsIGNocCkpIHsKKwkJc2NoLT5vcG0gJj0gfm1hc2s7CisJCXNjaC0+bHBtICY9IH5tYXNrOworCQlpZiAoY2hlY2tfZm9yX2lvX29uX3BhdGgoc2NoLCBtYXNrKSkgewogCQkJaWYgKGRldmljZV9pc19vbmxpbmUoc2NoKSkKIAkJCQkvKiBQYXRoIHZlcmlmaWNhdGlvbiBpcyBkb25lIGFmdGVyIGtpbGxpbmcuICovCiAJCQkJZGV2aWNlX2tpbGxfaW8oc2NoKTsKLQkJCWVsc2UKKwkJCWVsc2UgewogCQkJCS8qIEtpbGwgYW5kIHJldHJ5IGludGVybmFsIEkvTy4gKi8KIAkJCQl0ZXJtaW5hdGVfaW50ZXJuYWxfaW8oc2NoKTsKLQkJfSBlbHNlIGlmICghc2NoLT5scG0pIHsKLQkJCWlmIChkZXZpY2VfdHJpZ2dlcl92ZXJpZnkoc2NoKSAhPSAwKSB7Ci0JCQkJaWYgKGNzc19lbnF1ZXVlX3N1YmNoYW5uZWxfc2xvdyhzY2gtPnNjaGlkKSkgewotCQkJCQljc3NfY2xlYXJfc3ViY2hhbm5lbF9zbG93X2xpc3QoKTsKLQkJCQkJbmVlZF9yZXNjYW4gPSAxOwotCQkJCX0KKwkJCQkvKiBSZS1zdGFydCBwYXRoIHZlcmlmaWNhdGlvbi4gKi8KKwkJCQlpZiAoc2NoLT5kcml2ZXIgJiYgc2NoLT5kcml2ZXItPnZlcmlmeSkKKwkJCQkJc2NoLT5kcml2ZXItPnZlcmlmeSgmc2NoLT5kZXYpOwogCQkJfQorCQl9IGVsc2UgaWYgKCFzY2gtPmxwbSkgeworCQkJaWYgKGRldmljZV90cmlnZ2VyX3ZlcmlmeShzY2gpICE9IDApCisJCQkJY3NzX3NjaGVkdWxlX2V2YWwoc2NoLT5zY2hpZCk7CiAJCX0gZWxzZSBpZiAoc2NoLT5kcml2ZXIgJiYgc2NoLT5kcml2ZXItPnZlcmlmeSkKIAkJCXNjaC0+ZHJpdmVyLT52ZXJpZnkoJnNjaC0+ZGV2KTsKIAkJYnJlYWs7CkBAIC03ODAsMTEgKzYxNSwxMCBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoc2NoLT5sb2NrLCBmbGFncyk7CiB9CiAKLXN0YXRpYyBpbnQKLXMzOTBfc3ViY2hhbm5lbF92YXJ5X2NocGlkX29mZihzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCitzdGF0aWMgaW50IHMzOTBfc3ViY2hhbm5lbF92YXJ5X2NocGlkX29mZihzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IHN1YmNoYW5uZWwgKnNjaDsKLQlfX3U4ICpjaHBpZDsKKwlzdHJ1Y3QgY2hwX2lkICpjaHBpZDsKIAogCXNjaCA9IHRvX3N1YmNoYW5uZWwoZGV2KTsKIAljaHBpZCA9IGRhdGE7CkBAIC03OTMsMTEgKzYyNywxMCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50Ci1zMzkwX3N1YmNoYW5uZWxfdmFyeV9jaHBpZF9vbihzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCitzdGF0aWMgaW50IHMzOTBfc3ViY2hhbm5lbF92YXJ5X2NocGlkX29uKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoOwotCV9fdTggKmNocGlkOworCXN0cnVjdCBjaHBfaWQgKmNocGlkOwogCiAJc2NoID0gdG9fc3ViY2hhbm5lbChkZXYpOwogCWNocGlkID0gZGF0YTsKQEAgLTgyMSw0MCArNjU0LDE3IEBACiAJCS8qIFdlJ3JlIHRocm91Z2ggKi8KIAkJcmV0dXJuIC1FTlhJTzsKIAkvKiBQdXQgaXQgb24gdGhlIHNsb3cgcGF0aC4gKi8KLQlpZiAoY3NzX2VucXVldWVfc3ViY2hhbm5lbF9zbG93KHNjaGlkKSkgewotCQljc3NfY2xlYXJfc3ViY2hhbm5lbF9zbG93X2xpc3QoKTsKLQkJbmVlZF9yZXNjYW4gPSAxOwotCQlyZXR1cm4gLUVBR0FJTjsKLQl9CisJY3NzX3NjaGVkdWxlX2V2YWwoc2NoaWQpOwogCXJldHVybiAwOwogfQogCi0vKgotICogRnVuY3Rpb246IHMzOTBfdmFyeV9jaHBpZAotICogVmFyaWVzIHRoZSBzcGVjaWZpZWQgY2hwaWQgb25saW5lIG9yIG9mZmxpbmUKKy8qKgorICogY2hzY19jaHBfdmFyeSAtIHByb3BhZ2F0ZSBjaGFubmVsLXBhdGggdmFyeSBvcGVyYXRpb24gdG8gc3ViY2hhbm5lbHMKKyAqIEBjaHBpZDogY2hhbm5sLXBhdGggSUQKKyAqIEBvbjogbm9uLXplcm8gZm9yIHZhcnkgb25saW5lLCB6ZXJvIGZvciB2YXJ5IG9mZmxpbmUKICAqLwotc3RhdGljIGludAotczM5MF92YXJ5X2NocGlkKCBfX3U4IGNocGlkLCBpbnQgb24pCitpbnQgY2hzY19jaHBfdmFyeShzdHJ1Y3QgY2hwX2lkIGNocGlkLCBpbnQgb24pCiB7Ci0JY2hhciBkYmZfdGV4dFsxNV07Ci0JaW50IHN0YXR1czsKLQotCXNwcmludGYoZGJmX3RleHQsIG9uPyJ2YXJ5b24leCI6InZhcnlvZmYleCIsIGNocGlkKTsKLQlDSU9fVFJBQ0VfRVZFTlQoIDIsIGRiZl90ZXh0KTsKLQotCXN0YXR1cyA9IGdldF9jaHBfc3RhdHVzKGNocGlkKTsKLQlpZiAoc3RhdHVzIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgIkNhbid0IHZhcnkgdW5rbm93biBjaHBpZCAlMDJYXG4iLCBjaHBpZCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmICghb24gJiYgIXN0YXR1cykgewotCQlwcmludGsoS0VSTl9FUlIgImNocGlkICV4IGlzIGFscmVhZHkgb2ZmbGluZVxuIiwgY2hwaWQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlzZXRfY2hwX2xvZ2ljYWxseV9vbmxpbmUoY2hwaWQsIG9uKTsKLQogCS8qCiAJICogUmVkbyBQYXRoVmVyaWZpY2F0aW9uIG9uIHRoZSBkZXZpY2VzIHRoZSBjaHBpZCBjb25uZWN0cyB0bwogCSAqLwpAQCAtODY1LDExOCArNjc1LDkgQEAKIAlpZiAob24pCiAJCS8qIFNjYW4gZm9yIG5ldyBkZXZpY2VzIG9uIHZhcmllZCBvbiBwYXRoLiAqLwogCQlmb3JfZWFjaF9zdWJjaGFubmVsKF9fczM5MF92YXJ5X2NocGlkX29uLCBOVUxMKTsKLQlpZiAobmVlZF9yZXNjYW4gfHwgY3NzX3Nsb3dfc3ViY2hhbm5lbHNfZXhpc3QoKSkKLQkJcXVldWVfd29yayhzbG93X3BhdGhfd3EsICZzbG93X3BhdGhfd29yayk7CiAJcmV0dXJuIDA7CiB9CiAKLS8qCi0gKiBDaGFubmVsIG1lYXN1cmVtZW50IHJlbGF0ZWQgZnVuY3Rpb25zCi0gKi8KLXN0YXRpYyBzc2l6ZV90Ci1jaHBfbWVhc3VyZW1lbnRfY2hhcnNfcmVhZChzdHJ1Y3Qga29iamVjdCAqa29iaiwgY2hhciAqYnVmLCBsb2ZmX3Qgb2ZmLAotCQkJICAgc2l6ZV90IGNvdW50KQotewotCXN0cnVjdCBjaGFubmVsX3BhdGggKmNocDsKLQl1bnNpZ25lZCBpbnQgc2l6ZTsKLQotCWNocCA9IHRvX2NoYW5uZWxwYXRoKGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKSk7Ci0JaWYgKCFjaHAtPmNtZ19jaGFycykKLQkJcmV0dXJuIDA7Ci0KLQlzaXplID0gc2l6ZW9mKHN0cnVjdCBjbWdfY2hhcnMpOwotCi0JaWYgKG9mZiA+IHNpemUpCi0JCXJldHVybiAwOwotCWlmIChvZmYgKyBjb3VudCA+IHNpemUpCi0JCWNvdW50ID0gc2l6ZSAtIG9mZjsKLQltZW1jcHkoYnVmLCBjaHAtPmNtZ19jaGFycyArIG9mZiwgY291bnQpOwotCXJldHVybiBjb3VudDsKLX0KLQotc3RhdGljIHN0cnVjdCBiaW5fYXR0cmlidXRlIGNocF9tZWFzdXJlbWVudF9jaGFyc19hdHRyID0gewotCS5hdHRyID0gewotCQkubmFtZSA9ICJtZWFzdXJlbWVudF9jaGFycyIsCi0JCS5tb2RlID0gU19JUlVTUiwKLQkJLm93bmVyID0gVEhJU19NT0RVTEUsCi0JfSwKLQkuc2l6ZSA9IHNpemVvZihzdHJ1Y3QgY21nX2NoYXJzKSwKLQkucmVhZCA9IGNocF9tZWFzdXJlbWVudF9jaGFyc19yZWFkLAotfTsKLQotc3RhdGljIHZvaWQKLWNocF9tZWFzdXJlbWVudF9jb3B5X2Jsb2NrKHN0cnVjdCBjbWdfZW50cnkgKmJ1ZiwKLQkJCSAgIHN0cnVjdCBjaGFubmVsX3N1YnN5c3RlbSAqY3NzLCBpbnQgY2hwaWQpCi17Ci0Jdm9pZCAqYXJlYTsKLQlzdHJ1Y3QgY21nX2VudHJ5ICplbnRyeSwgcmVmZXJlbmNlX2J1ZjsKLQlpbnQgaWR4OwotCi0JaWYgKGNocGlkIDwgMTI4KSB7Ci0JCWFyZWEgPSBjc3MtPmN1Yl9hZGRyMTsKLQkJaWR4ID0gY2hwaWQ7Ci0JfSBlbHNlIHsKLQkJYXJlYSA9IGNzcy0+Y3ViX2FkZHIyOwotCQlpZHggPSBjaHBpZCAtIDEyODsKLQl9Ci0JZW50cnkgPSBhcmVhICsgKGlkeCAqIHNpemVvZihzdHJ1Y3QgY21nX2VudHJ5KSk7Ci0JZG8gewotCQltZW1jcHkoYnVmLCBlbnRyeSwgc2l6ZW9mKCplbnRyeSkpOwotCQltZW1jcHkoJnJlZmVyZW5jZV9idWYsIGVudHJ5LCBzaXplb2YoKmVudHJ5KSk7Ci0JfSB3aGlsZSAocmVmZXJlbmNlX2J1Zi52YWx1ZXNbMF0gIT0gYnVmLT52YWx1ZXNbMF0pOwotfQotCi1zdGF0aWMgc3NpemVfdAotY2hwX21lYXN1cmVtZW50X3JlYWQoc3RydWN0IGtvYmplY3QgKmtvYmosIGNoYXIgKmJ1ZiwgbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KQotewotCXN0cnVjdCBjaGFubmVsX3BhdGggKmNocDsKLQlzdHJ1Y3QgY2hhbm5lbF9zdWJzeXN0ZW0gKmNzczsKLQl1bnNpZ25lZCBpbnQgc2l6ZTsKLQotCWNocCA9IHRvX2NoYW5uZWxwYXRoKGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKSk7Ci0JY3NzID0gdG9fY3NzKGNocC0+ZGV2LnBhcmVudCk7Ci0KLQlzaXplID0gc2l6ZW9mKHN0cnVjdCBjbWdfZW50cnkpOwotCi0JLyogT25seSBhbGxvdyBzaW5nbGUgcmVhZHMuICovCi0JaWYgKG9mZiB8fCBjb3VudCA8IHNpemUpCi0JCXJldHVybiAwOwotCWNocF9tZWFzdXJlbWVudF9jb3B5X2Jsb2NrKChzdHJ1Y3QgY21nX2VudHJ5ICopYnVmLCBjc3MsIGNocC0+aWQpOwotCWNvdW50ID0gc2l6ZTsKLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSBjaHBfbWVhc3VyZW1lbnRfYXR0ciA9IHsKLQkuYXR0ciA9IHsKLQkJLm5hbWUgPSAibWVhc3VyZW1lbnQiLAotCQkubW9kZSA9IFNfSVJVU1IsCi0JCS5vd25lciA9IFRISVNfTU9EVUxFLAotCX0sCi0JLnNpemUgPSBzaXplb2Yoc3RydWN0IGNtZ19lbnRyeSksCi0JLnJlYWQgPSBjaHBfbWVhc3VyZW1lbnRfcmVhZCwKLX07Ci0KLXN0YXRpYyB2b2lkCi1jaHNjX3JlbW92ZV9jaHBfY21nX2F0dHIoc3RydWN0IGNoYW5uZWxfcGF0aCAqY2hwKQotewotCWRldmljZV9yZW1vdmVfYmluX2ZpbGUoJmNocC0+ZGV2LCAmY2hwX21lYXN1cmVtZW50X2NoYXJzX2F0dHIpOwotCWRldmljZV9yZW1vdmVfYmluX2ZpbGUoJmNocC0+ZGV2LCAmY2hwX21lYXN1cmVtZW50X2F0dHIpOwotfQotCi1zdGF0aWMgaW50Ci1jaHNjX2FkZF9jaHBfY21nX2F0dHIoc3RydWN0IGNoYW5uZWxfcGF0aCAqY2hwKQotewotCWludCByZXQ7Ci0KLQlyZXQgPSBkZXZpY2VfY3JlYXRlX2Jpbl9maWxlKCZjaHAtPmRldiwgJmNocF9tZWFzdXJlbWVudF9jaGFyc19hdHRyKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCXJldCA9IGRldmljZV9jcmVhdGVfYmluX2ZpbGUoJmNocC0+ZGV2LCAmY2hwX21lYXN1cmVtZW50X2F0dHIpOwotCWlmIChyZXQpCi0JCWRldmljZV9yZW1vdmVfYmluX2ZpbGUoJmNocC0+ZGV2LCAmY2hwX21lYXN1cmVtZW50X2NoYXJzX2F0dHIpOwotCXJldHVybiByZXQ7Ci19Ci0KIHN0YXRpYyB2b2lkCiBjaHNjX3JlbW92ZV9jbWdfYXR0cihzdHJ1Y3QgY2hhbm5lbF9zdWJzeXN0ZW0gKmNzcykKIHsKQEAgLTk4NSw3ICs2ODYsNyBAQAogCWZvciAoaSA9IDA7IGkgPD0gX19NQVhfQ0hQSUQ7IGkrKykgewogCQlpZiAoIWNzcy0+Y2hwc1tpXSkKIAkJCWNvbnRpbnVlOwotCQljaHNjX3JlbW92ZV9jaHBfY21nX2F0dHIoY3NzLT5jaHBzW2ldKTsKKwkJY2hwX3JlbW92ZV9jbWdfYXR0cihjc3MtPmNocHNbaV0pOwogCX0KIH0KIApAQCAtOTk4LDcgKzY5OSw3IEBACiAJZm9yIChpID0gMDsgaSA8PSBfX01BWF9DSFBJRDsgaSsrKSB7CiAJCWlmICghY3NzLT5jaHBzW2ldKQogCQkJY29udGludWU7Ci0JCXJldCA9IGNoc2NfYWRkX2NocF9jbWdfYXR0cihjc3MtPmNocHNbaV0pOworCQlyZXQgPSBjaHBfYWRkX2NtZ19hdHRyKGNzcy0+Y2hwc1tpXSk7CiAJCWlmIChyZXQpCiAJCQlnb3RvIGNsZWFudXA7CiAJfQpAQCAtMTAwNywxMiArNzA4LDExIEBACiAJZm9yICgtLWk7IGkgPj0gMDsgaS0tKSB7CiAJCWlmICghY3NzLT5jaHBzW2ldKQogCQkJY29udGludWU7Ci0JCWNoc2NfcmVtb3ZlX2NocF9jbWdfYXR0cihjc3MtPmNocHNbaV0pOworCQljaHBfcmVtb3ZlX2NtZ19hdHRyKGNzcy0+Y2hwc1tpXSk7CiAJfQogCXJldHVybiByZXQ7CiB9CiAKLQogc3RhdGljIGludAogX19jaHNjX2RvX3NlY20oc3RydWN0IGNoYW5uZWxfc3Vic3lzdGVtICpjc3MsIGludCBlbmFibGUsIHZvaWQgKnBhZ2UpCiB7CkBAIC0xMTE4LDcgKzgxOCw3IEBACiAJCX0gZWxzZQogCQkJY2hzY19yZW1vdmVfY21nX2F0dHIoY3NzKTsKIAl9Ci0JaWYgKGVuYWJsZSAmJiAhY3NzLT5jbV9lbmFibGVkKSB7CisJaWYgKCFjc3MtPmNtX2VuYWJsZWQpIHsKIAkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWNzcy0+Y3ViX2FkZHIxKTsKIAkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWNzcy0+Y3ViX2FkZHIyKTsKIAl9CkBAIC0xMTI3LDEwOSArODI3LDggQEAKIAlyZXR1cm4gcmV0OwogfQogCi0vKgotICogRmlsZXMgZm9yIHRoZSBjaGFubmVsIHBhdGggZW50cmllcy4KLSAqLwotc3RhdGljIHNzaXplX3QKLWNocF9zdGF0dXNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IGNoYW5uZWxfcGF0aCAqY2hwID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IGNoYW5uZWxfcGF0aCwgZGV2KTsKLQotCWlmICghY2hwKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gKGdldF9jaHBfc3RhdHVzKGNocC0+aWQpID8gc3ByaW50ZihidWYsICJvbmxpbmVcbiIpIDoKLQkJc3ByaW50ZihidWYsICJvZmZsaW5lXG4iKSk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90Ci1jaHBfc3RhdHVzX3dyaXRlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCXN0cnVjdCBjaGFubmVsX3BhdGggKmNwID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IGNoYW5uZWxfcGF0aCwgZGV2KTsKLQljaGFyIGNtZFsxMF07Ci0JaW50IG51bV9hcmdzOwotCWludCBlcnJvcjsKLQotCW51bV9hcmdzID0gc3NjYW5mKGJ1ZiwgIiU1cyIsIGNtZCk7Ci0JaWYgKCFudW1fYXJncykKLQkJcmV0dXJuIGNvdW50OwotCi0JaWYgKCFzdHJuaWNtcChjbWQsICJvbiIsIDIpKQotCQllcnJvciA9IHMzOTBfdmFyeV9jaHBpZChjcC0+aWQsIDEpOwotCWVsc2UgaWYgKCFzdHJuaWNtcChjbWQsICJvZmYiLCAzKSkKLQkJZXJyb3IgPSBzMzkwX3ZhcnlfY2hwaWQoY3AtPmlkLCAwKTsKLQllbHNlCi0JCWVycm9yID0gLUVJTlZBTDsKLQotCXJldHVybiBlcnJvciA8IDAgPyBlcnJvciA6IGNvdW50OwotCi19Ci0KLXN0YXRpYyBERVZJQ0VfQVRUUihzdGF0dXMsIDA2NDQsIGNocF9zdGF0dXNfc2hvdywgY2hwX3N0YXR1c193cml0ZSk7Ci0KLXN0YXRpYyBzc2l6ZV90Ci1jaHBfdHlwZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgY2hhbm5lbF9wYXRoICpjaHAgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgY2hhbm5lbF9wYXRoLCBkZXYpOwotCi0JaWYgKCFjaHApCi0JCXJldHVybiAwOwotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV4XG4iLCBjaHAtPmRlc2MuZGVzYyk7Ci19Ci0KLXN0YXRpYyBERVZJQ0VfQVRUUih0eXBlLCAwNDQ0LCBjaHBfdHlwZV9zaG93LCBOVUxMKTsKLQotc3RhdGljIHNzaXplX3QKLWNocF9jbWdfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IGNoYW5uZWxfcGF0aCAqY2hwID0gdG9fY2hhbm5lbHBhdGgoZGV2KTsKLQotCWlmICghY2hwKQotCQlyZXR1cm4gMDsKLQlpZiAoY2hwLT5jbWcgPT0gLTEpIC8qIGNoYW5uZWwgbWVhc3VyZW1lbnRzIG5vdCBhdmFpbGFibGUgKi8KLQkJcmV0dXJuIHNwcmludGYoYnVmLCAidW5rbm93blxuIik7Ci0JcmV0dXJuIHNwcmludGYoYnVmLCAiJXhcbiIsIGNocC0+Y21nKTsKLX0KLQotc3RhdGljIERFVklDRV9BVFRSKGNtZywgMDQ0NCwgY2hwX2NtZ19zaG93LCBOVUxMKTsKLQotc3RhdGljIHNzaXplX3QKLWNocF9zaGFyZWRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IGNoYW5uZWxfcGF0aCAqY2hwID0gdG9fY2hhbm5lbHBhdGgoZGV2KTsKLQotCWlmICghY2hwKQotCQlyZXR1cm4gMDsKLQlpZiAoY2hwLT5zaGFyZWQgPT0gLTEpIC8qIGNoYW5uZWwgbWVhc3VyZW1lbnRzIG5vdCBhdmFpbGFibGUgKi8KLQkJcmV0dXJuIHNwcmludGYoYnVmLCAidW5rbm93blxuIik7Ci0JcmV0dXJuIHNwcmludGYoYnVmLCAiJXhcbiIsIGNocC0+c2hhcmVkKTsKLX0KLQotc3RhdGljIERFVklDRV9BVFRSKHNoYXJlZCwgMDQ0NCwgY2hwX3NoYXJlZF9zaG93LCBOVUxMKTsKLQotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKiBjaHBfYXR0cnNbXSA9IHsKLQkmZGV2X2F0dHJfc3RhdHVzLmF0dHIsCi0JJmRldl9hdHRyX3R5cGUuYXR0ciwKLQkmZGV2X2F0dHJfY21nLmF0dHIsCi0JJmRldl9hdHRyX3NoYXJlZC5hdHRyLAotCU5VTEwsCi19OwotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBjaHBfYXR0cl9ncm91cCA9IHsKLQkuYXR0cnMgPSBjaHBfYXR0cnMsCi19OwotCi1zdGF0aWMgdm9pZAotY2hwX3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBjaGFubmVsX3BhdGggKmNwOwotCQotCWNwID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IGNoYW5uZWxfcGF0aCwgZGV2KTsKLQlrZnJlZShjcCk7Ci19Ci0KLXN0YXRpYyBpbnQKLWNoc2NfZGV0ZXJtaW5lX2NoYW5uZWxfcGF0aF9kZXNjcmlwdGlvbihpbnQgY2hwaWQsCi0JCQkJCXN0cnVjdCBjaGFubmVsX3BhdGhfZGVzYyAqZGVzYykKK2ludCBjaHNjX2RldGVybWluZV9jaGFubmVsX3BhdGhfZGVzY3JpcHRpb24oc3RydWN0IGNocF9pZCBjaHBpZCwKKwkJCQkJICAgIHN0cnVjdCBjaGFubmVsX3BhdGhfZGVzYyAqZGVzYykKIHsKIAlpbnQgY2NvZGUsIHJldDsKIApAQCAtMTI1Miw4ICs4NTEsOCBAQAogCXNjcGRfYXJlYS0+cmVxdWVzdC5sZW5ndGggPSAweDAwMTA7CiAJc2NwZF9hcmVhLT5yZXF1ZXN0LmNvZGUgPSAweDAwMDI7CiAKLQlzY3BkX2FyZWEtPmZpcnN0X2NocGlkID0gY2hwaWQ7Ci0Jc2NwZF9hcmVhLT5sYXN0X2NocGlkID0gY2hwaWQ7CisJc2NwZF9hcmVhLT5maXJzdF9jaHBpZCA9IGNocGlkLmlkOworCXNjcGRfYXJlYS0+bGFzdF9jaHBpZCA9IGNocGlkLmlkOwogCiAJY2NvZGUgPSBjaHNjKHNjcGRfYXJlYSk7CiAJaWYgKGNjb2RlID4gMCkgewpAQCAtMTMxNiw4ICs5MTUsNyBAQAogCX0KIH0KIAotc3RhdGljIGludAotY2hzY19nZXRfY2hhbm5lbF9tZWFzdXJlbWVudF9jaGFycyhzdHJ1Y3QgY2hhbm5lbF9wYXRoICpjaHApCitpbnQgY2hzY19nZXRfY2hhbm5lbF9tZWFzdXJlbWVudF9jaGFycyhzdHJ1Y3QgY2hhbm5lbF9wYXRoICpjaHApCiB7CiAJaW50IGNjb2RlLCByZXQ7CiAKQEAgLTEzNDksOCArOTQ3LDggQEAKIAlzY21jX2FyZWEtPnJlcXVlc3QubGVuZ3RoID0gMHgwMDEwOwogCXNjbWNfYXJlYS0+cmVxdWVzdC5jb2RlID0gMHgwMDIyOwogCi0Jc2NtY19hcmVhLT5maXJzdF9jaHBpZCA9IGNocC0+aWQ7Ci0Jc2NtY19hcmVhLT5sYXN0X2NocGlkID0gY2hwLT5pZDsKKwlzY21jX2FyZWEtPmZpcnN0X2NocGlkID0gY2hwLT5jaHBpZC5pZDsKKwlzY21jX2FyZWEtPmxhc3RfY2hwaWQgPSBjaHAtPmNocGlkLmlkOwogCiAJY2NvZGUgPSBjaHNjKHNjbWNfYXJlYSk7CiAJaWYgKGNjb2RlID4gMCkgewpAQCAtMTM5Miw5NCArOTkwLDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0vKgotICogRW50cmllcyBmb3IgY2hwaWRzIG9uIHRoZSBzeXN0ZW0gYnVzLgotICogVGhpcyByZXBsYWNlcyAvcHJvYy9jaHBpZHMuCi0gKi8KLXN0YXRpYyBpbnQKLW5ld19jaGFubmVsX3BhdGgoaW50IGNocGlkKQotewotCXN0cnVjdCBjaGFubmVsX3BhdGggKmNocDsKLQlpbnQgcmV0OwotCi0JY2hwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNoYW5uZWxfcGF0aCksIEdGUF9LRVJORUwpOwotCWlmICghY2hwKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCS8qIGZpbGwgaW4gc3RhdHVzLCBldGMuICovCi0JY2hwLT5pZCA9IGNocGlkOwotCWNocC0+c3RhdGUgPSAxOwotCWNocC0+ZGV2LnBhcmVudCA9ICZjc3NbMF0tPmRldmljZTsKLQljaHAtPmRldi5yZWxlYXNlID0gY2hwX3JlbGVhc2U7Ci0Jc25wcmludGYoY2hwLT5kZXYuYnVzX2lkLCBCVVNfSURfU0laRSwgImNocDAuJXgiLCBjaHBpZCk7Ci0KLQkvKiBPYnRhaW4gY2hhbm5lbCBwYXRoIGRlc2NyaXB0aW9uIGFuZCBmaWxsIGl0IGluLiAqLwotCXJldCA9IGNoc2NfZGV0ZXJtaW5lX2NoYW5uZWxfcGF0aF9kZXNjcmlwdGlvbihjaHBpZCwgJmNocC0+ZGVzYyk7Ci0JaWYgKHJldCkKLQkJZ290byBvdXRfZnJlZTsKLQkvKiBHZXQgY2hhbm5lbC1tZWFzdXJlbWVudCBjaGFyYWN0ZXJpc3RpY3MuICovCi0JaWYgKGNzc19jaGFyYWN0ZXJpc3RpY3NfYXZhaWwgJiYgY3NzX2Noc2NfY2hhcmFjdGVyaXN0aWNzLnNjbWMKLQkgICAgJiYgY3NzX2Noc2NfY2hhcmFjdGVyaXN0aWNzLnNlY20pIHsKLQkJcmV0ID0gY2hzY19nZXRfY2hhbm5lbF9tZWFzdXJlbWVudF9jaGFycyhjaHApOwotCQlpZiAocmV0KQotCQkJZ290byBvdXRfZnJlZTsKLQl9IGVsc2UgewotCQlzdGF0aWMgaW50IG1zZ19kb25lOwotCi0JCWlmICghbXNnX2RvbmUpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImNpbzogQ2hhbm5lbCBtZWFzdXJlbWVudHMgbm90ICIKLQkJCSAgICAgICAiYXZhaWxhYmxlLCBjb250aW51aW5nLlxuIik7Ci0JCQltc2dfZG9uZSA9IDE7Ci0JCX0KLQkJY2hwLT5jbWcgPSAtMTsKLQl9Ci0KLQkvKiBtYWtlIGl0IGtub3duIHRvIHRoZSBzeXN0ZW0gKi8KLQlyZXQgPSBkZXZpY2VfcmVnaXN0ZXIoJmNocC0+ZGV2KTsKLQlpZiAocmV0KSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBjb3VsZCBub3QgcmVnaXN0ZXIgJTAyeFxuIiwKLQkJICAgICAgIF9fZnVuY19fLCBjaHBpZCk7Ci0JCWdvdG8gb3V0X2ZyZWU7Ci0JfQotCXJldCA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmY2hwLT5kZXYua29iaiwgJmNocF9hdHRyX2dyb3VwKTsKLQlpZiAocmV0KSB7Ci0JCWRldmljZV91bnJlZ2lzdGVyKCZjaHAtPmRldik7Ci0JCWdvdG8gb3V0X2ZyZWU7Ci0JfQotCW11dGV4X2xvY2soJmNzc1swXS0+bXV0ZXgpOwotCWlmIChjc3NbMF0tPmNtX2VuYWJsZWQpIHsKLQkJcmV0ID0gY2hzY19hZGRfY2hwX2NtZ19hdHRyKGNocCk7Ci0JCWlmIChyZXQpIHsKLQkJCXN5c2ZzX3JlbW92ZV9ncm91cCgmY2hwLT5kZXYua29iaiwgJmNocF9hdHRyX2dyb3VwKTsKLQkJCWRldmljZV91bnJlZ2lzdGVyKCZjaHAtPmRldik7Ci0JCQltdXRleF91bmxvY2soJmNzc1swXS0+bXV0ZXgpOwotCQkJZ290byBvdXRfZnJlZTsKLQkJfQotCX0KLQljc3NbMF0tPmNocHNbY2hwaWRdID0gY2hwOwotCW11dGV4X3VubG9jaygmY3NzWzBdLT5tdXRleCk7Ci0JcmV0dXJuIHJldDsKLW91dF9mcmVlOgotCWtmcmVlKGNocCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotdm9pZCAqCi1jaHNjX2dldF9jaHBfZGVzYyhzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoLCBpbnQgY2hwX25vKQotewotCXN0cnVjdCBjaGFubmVsX3BhdGggKmNocDsKLQlzdHJ1Y3QgY2hhbm5lbF9wYXRoX2Rlc2MgKmRlc2M7Ci0KLQljaHAgPSBjc3NbMF0tPmNocHNbc2NoLT5zY2hpYi5wbWN3LmNocGlkW2NocF9ub11dOwotCWlmICghY2hwKQotCQlyZXR1cm4gTlVMTDsKLQlkZXNjID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGNoYW5uZWxfcGF0aF9kZXNjKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkZXNjKQotCQlyZXR1cm4gTlVMTDsKLQltZW1jcHkoZGVzYywgJmNocC0+ZGVzYywgc2l6ZW9mKHN0cnVjdCBjaGFubmVsX3BhdGhfZGVzYykpOwotCXJldHVybiBkZXNjOwotfQotCiBzdGF0aWMgaW50IF9faW5pdAogY2hzY19hbGxvY19zZWlfYXJlYSh2b2lkKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9jaHNjLmggYi9kcml2ZXJzL3MzOTAvY2lvL2Noc2MuaAppbmRleCAwZmIyYjAyLi4yYWQ4MWQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2lvL2Noc2MuaAorKysgYi9kcml2ZXJzL3MzOTAvY2lvL2Noc2MuaApAQCAtMSw5ICsxLDEwIEBACiAjaWZuZGVmIFMzOTBfQ0hTQ19ICiAjZGVmaW5lIFMzOTBfQ0hTQ19ICiAKLSNkZWZpbmUgQ0hTQ19TRUlfQUNDX0NIUElEICAgICAgICAxCi0jZGVmaW5lIENIU0NfU0VJX0FDQ19MSU5LQUREUiAgICAgMgotI2RlZmluZSBDSFNDX1NFSV9BQ0NfRlVMTExJTktBRERSIDMKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGFzbS9jaHBpZC5oPgorI2luY2x1ZGUgInNjaGlkLmgiCiAKICNkZWZpbmUgQ0hTQ19TREFfT0NfTVNTICAgMHgyCiAKQEAgLTMzLDIzICszNCw5IEBACiAJdTggY2hwcDsKIH0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCi1zdHJ1Y3QgY2hhbm5lbF9wYXRoIHsKLQlpbnQgaWQ7Ci0JaW50IHN0YXRlOwotCXN0cnVjdCBjaGFubmVsX3BhdGhfZGVzYyBkZXNjOwotCS8qIENoYW5uZWwtbWVhc3VyZW1lbnQgcmVsYXRlZCBzdHVmZjogKi8KLQlpbnQgY21nOwotCWludCBzaGFyZWQ7Ci0Jdm9pZCAqY21nX2NoYXJzOwotCXN0cnVjdCBkZXZpY2UgZGV2OwotfTsKK3N0cnVjdCBjaGFubmVsX3BhdGg7CiAKLWV4dGVybiB2b2lkIHMzOTBfcHJvY2Vzc19jc3MoIHZvaWQgKTsKLWV4dGVybiB2b2lkIGNoc2NfdmFsaWRhdGVfY2hwaWRzKHN0cnVjdCBzdWJjaGFubmVsICopOwotZXh0ZXJuIHZvaWQgY2hwaWRfaXNfYWN0dWFsbHlfb25saW5lKGludCk7Ci1leHRlcm4gaW50IGNzc19nZXRfc3NkX2luZm8oc3RydWN0IHN1YmNoYW5uZWwgKik7Ci1leHRlcm4gaW50IGNoc2NfcHJvY2Vzc19jcncodm9pZCk7Ci1leHRlcm4gaW50IGNocF9wcm9jZXNzX2NydyhpbnQsIGludCk7CitleHRlcm4gdm9pZCBjaHNjX3Byb2Nlc3NfY3J3KHZvaWQpOwogCiBzdHJ1Y3QgY3NzX2dlbmVyYWxfY2hhciB7CiAJdTY0IDogNDE7CkBAIC04MiwxNSArNjksMjYgQEAKIGV4dGVybiBzdHJ1Y3QgY3NzX2dlbmVyYWxfY2hhciBjc3NfZ2VuZXJhbF9jaGFyYWN0ZXJpc3RpY3M7CiBleHRlcm4gc3RydWN0IGNzc19jaHNjX2NoYXIgY3NzX2Noc2NfY2hhcmFjdGVyaXN0aWNzOwogCitzdHJ1Y3QgY2hzY19zc2RfaW5mbyB7CisJdTggcGF0aF9tYXNrOworCXU4IGZsYV92YWxpZF9tYXNrOworCXN0cnVjdCBjaHBfaWQgY2hwaWRbOF07CisJdTE2IGZsYVs4XTsKK307CitleHRlcm4gaW50IGNoc2NfZ2V0X3NzZF9pbmZvKHN0cnVjdCBzdWJjaGFubmVsX2lkIHNjaGlkLAorCQkJICAgICBzdHJ1Y3QgY2hzY19zc2RfaW5mbyAqc3NkKTsKIGV4dGVybiBpbnQgY2hzY19kZXRlcm1pbmVfY3NzX2NoYXJhY3RlcmlzdGljcyh2b2lkKTsKIGV4dGVybiBpbnQgY3NzX2NoYXJhY3RlcmlzdGljc19hdmFpbDsKIAotZXh0ZXJuIHZvaWQgKmNoc2NfZ2V0X2NocF9kZXNjKHN0cnVjdCBzdWJjaGFubmVsKiwgaW50KTsKLQogZXh0ZXJuIGludCBjaHNjX2VuYWJsZV9mYWNpbGl0eShpbnQpOwogc3RydWN0IGNoYW5uZWxfc3Vic3lzdGVtOwogZXh0ZXJuIGludCBjaHNjX3NlY20oc3RydWN0IGNoYW5uZWxfc3Vic3lzdGVtICosIGludCk7CiAKLSNkZWZpbmUgdG9fY2hhbm5lbHBhdGgoZGV2aWNlKSBjb250YWluZXJfb2YoZGV2aWNlLCBzdHJ1Y3QgY2hhbm5lbF9wYXRoLCBkZXYpCitpbnQgY2hzY19jaHBfdmFyeShzdHJ1Y3QgY2hwX2lkIGNocGlkLCBpbnQgb24pOworaW50IGNoc2NfZGV0ZXJtaW5lX2NoYW5uZWxfcGF0aF9kZXNjcmlwdGlvbihzdHJ1Y3QgY2hwX2lkIGNocGlkLAorCQkJCQkgICAgc3RydWN0IGNoYW5uZWxfcGF0aF9kZXNjICpkZXNjKTsKK3ZvaWQgY2hzY19jaHBfb25saW5lKHN0cnVjdCBjaHBfaWQgY2hwaWQpOwordm9pZCBjaHNjX2NocF9vZmZsaW5lKHN0cnVjdCBjaHBfaWQgY2hwaWQpOworaW50IGNoc2NfZ2V0X2NoYW5uZWxfbWVhc3VyZW1lbnRfY2hhcnMoc3RydWN0IGNoYW5uZWxfcGF0aCAqY2hwKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2lvL2Npby5jIGIvZHJpdmVycy9zMzkwL2Npby9jaW8uYwppbmRleCA5Y2IxMjlhLi5lYTFkZWZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2lvL2Npby5jCisrKyBiL2RyaXZlcnMvczM5MC9jaW8vY2lvLmMKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KICNpbmNsdWRlIDxhc20vcmVzZXQuaD4KICNpbmNsdWRlIDxhc20vaXBsLmg+CisjaW5jbHVkZSA8YXNtL2NocGlkLmg+CiAjaW5jbHVkZSAiYWlycS5oIgogI2luY2x1ZGUgImNpby5oIgogI2luY2x1ZGUgImNzcy5oIgpAQCAtMjksNiArMzAsNyBAQAogI2luY2x1ZGUgImlvYXNtLmgiCiAjaW5jbHVkZSAiYmxhY2tsaXN0LmgiCiAjaW5jbHVkZSAiY2lvX2RlYnVnLmgiCisjaW5jbHVkZSAiY2hwLmgiCiAjaW5jbHVkZSAiLi4vczM5MG1hY2guaCIKIAogZGVidWdfaW5mb190ICpjaW9fZGVidWdfbXNnX2lkOwpAQCAtNTkyLDkgKzU5NCwxMCBAQAogCQllcnIgPSAtRU5PREVWOwogCQlnb3RvIG91dDsKIAl9Ci0Jc2NoLT5vcG0gPSAweGZmOwotCWlmICghY2lvX2lzX2NvbnNvbGUoc2NoLT5zY2hpZCkpCi0JCWNoc2NfdmFsaWRhdGVfY2hwaWRzKHNjaCk7CisJaWYgKGNpb19pc19jb25zb2xlKHNjaC0+c2NoaWQpKQorCQlzY2gtPm9wbSA9IDB4ZmY7CisJZWxzZQorCQlzY2gtPm9wbSA9IGNocF9nZXRfc2NoX29wbShzY2gpOwogCXNjaC0+bHBtID0gc2NoLT5zY2hpYi5wbWN3LnBhbSAmIHNjaC0+b3BtOwogCiAJQ0lPX0RFQlVHKEtFUk5fSU5GTywgMCwKQEAgLTk1NCw2ICs5NTcsNyBAQAogewogCWludCBpLCByZXQ7CiAJdW5zaWduZWQgbG9uZyBsb25nIHRpbWVvdXQ7CisJc3RydWN0IGNocF9pZCBjaHBpZDsKIAogCS8qIFJlc2V0IHN1YmNoYW5uZWxzLiAqLwogCWZvcl9lYWNoX3N1YmNoYW5uZWwoX19zaHV0ZG93bl9zdWJjaGFubmVsX2Vhc3ksICBOVUxMKTsKQEAgLTk2Myw4ICs5NjcsMTAgQEAKIAlfX2N0bF9zZXRfYml0KDE0LCAyOCk7CiAJLyogVGVtcG9yYXJpbHkgcmVlbmFibGUgbWFjaGluZSBjaGVja3MuICovCiAJbG9jYWxfbWNja19lbmFibGUoKTsKKwljaHBfaWRfaW5pdCgmY2hwaWQpOwogCWZvciAoaSA9IDA7IGkgPD0gX19NQVhfQ0hQSUQ7IGkrKykgewotCQlyZXQgPSByY2hwKGkpOworCQljaHBpZC5pZCA9IGk7CisJCXJldCA9IHJjaHAoY2hwaWQpOwogCQlpZiAoKHJldCA9PSAwKSB8fCAocmV0ID09IDIpKQogCQkJLyoKIAkJCSAqIHJjaHAgZWl0aGVyIHN1Y2NlZWRlZCwgb3IgYW5vdGhlciByY2hwIGlzIGFscmVhZHkKQEAgLTEwNDgsMzcgKzEwNTQsMTkgQEAKIAlkb19yZWlwbF9hc20oKigoX191MzIqKSZzY2hpZCkpOwogfQogCi1zdGF0aWMgc3RydWN0IHNjaGliIF9faW5pdGRhdGEgaXBsX3NjaGliOwotCi0vKgotICogaXBsX3NhdmVfcGFyYW1ldGVycyBnZXRzIGNhbGxlZCB2ZXJ5IGVhcmx5LiBJdCBpcyBub3QgYWxsb3dlZCB0byBhY2Nlc3MKLSAqIGFueXRoaW5nIGluIHRoZSBic3Mgc2VjdGlvbiBhdCBhbGwuIFRoZSBic3Mgc2VjdGlvbiBpcyBub3QgY2xlYXJlZCB5ZXQsCi0gKiBidXQgbWF5IGNvbnRhaW4gc29tZSBpcGwgcGFyYW1ldGVycyB3cml0dGVuIGJ5IHRoZSBmaXJtd2FyZS4KLSAqIFRoZXNlIHBhcmFtZXRlcnMgKGlmIHByZXNlbnQpIGFyZSBjb3BpZWQgdG8gMHgyMDAwLgotICogVG8gYXZvaWQgY29ycnVwdGlvbiBvZiB0aGUgaXBsIHBhcmFtZXRlcnMsIGFsbCB2YXJpYWJsZXMgdXNlZCBieSB0aGlzCi0gKiBmdW5jdGlvbiBtdXN0IHJlc2lkZSBvbiB0aGUgc3RhY2sgb3IgaW4gdGhlIGRhdGEgc2VjdGlvbi4KLSAqLwotdm9pZCBpcGxfc2F2ZV9wYXJhbWV0ZXJzKHZvaWQpCitpbnQgX19pbml0IGNpb19nZXRfaXBsaW5mbyhzdHJ1Y3QgY2lvX2lwbGluZm8gKmlwbGluZm8pCiB7CiAJc3RydWN0IHN1YmNoYW5uZWxfaWQgc2NoaWQ7Ci0JdW5zaWduZWQgaW50ICppcGxfcHRyOwotCXZvaWQgKnNyYywgKmRzdDsKKwlzdHJ1Y3Qgc2NoaWIgc2NoaWI7CiAKIAlzY2hpZCA9ICooc3RydWN0IHN1YmNoYW5uZWxfaWQgKilfX0xDX1NVQkNIQU5ORUxfSUQ7CiAJaWYgKCFzY2hpZC5vbmUpCi0JCXJldHVybjsKLQlpZiAoc3RzY2goc2NoaWQsICZpcGxfc2NoaWIpKQotCQlyZXR1cm47Ci0JaWYgKCFpcGxfc2NoaWIucG1jdy5kbnYpCi0JCXJldHVybjsKLQlpcGxfZGV2bm8gPSBpcGxfc2NoaWIucG1jdy5kZXY7Ci0JaXBsX2ZsYWdzIHw9IElQTF9ERVZOT19WQUxJRDsKLQlpZiAoIWlwbF9zY2hpYi5wbWN3LnFmKQotCQlyZXR1cm47Ci0JaXBsX2ZsYWdzIHw9IElQTF9QQVJNQkxPQ0tfVkFMSUQ7Ci0JaXBsX3B0ciA9ICh1bnNpZ25lZCBpbnQgKilfX0xDX0lQTF9QQVJNQkxPQ0tfUFRSOwotCXNyYyA9ICh2b2lkICopKHVuc2lnbmVkIGxvbmcpKmlwbF9wdHI7Ci0JZHN0ID0gKHZvaWQgKilJUExfUEFSTUJMT0NLX09SSUdJTjsKLQltZW1tb3ZlKGRzdCwgc3JjLCBQQUdFX1NJWkUpOwotCSppcGxfcHRyID0gSVBMX1BBUk1CTE9DS19PUklHSU47CisJCXJldHVybiAtRU5PREVWOworCWlmIChzdHNjaChzY2hpZCwgJnNjaGliKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKCFzY2hpYi5wbWN3LmRudikKKwkJcmV0dXJuIC1FTk9ERVY7CisJaXBsaW5mby0+ZGV2bm8gPSBzY2hpYi5wbWN3LmRldjsKKwlpcGxpbmZvLT5pc19xZGlvID0gc2NoaWIucG1jdy5xZjsKKwlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vY2lvLmggYi9kcml2ZXJzL3MzOTAvY2lvL2Npby5oCmluZGV4IDM1MTU0YTIuLjc0NDZjMzk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2lvL2Npby5oCisrKyBiL2RyaXZlcnMvczM5MC9jaW8vY2lvLmgKQEAgLTEsMTggKzEsMTEgQEAKICNpZm5kZWYgUzM5MF9DSU9fSAogI2RlZmluZSBTMzkwX0NJT19ICiAKLSNpbmNsdWRlICJzY2hpZC5oIgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0KLS8qCi0gKiB3aGVyZSB3ZSBwdXQgdGhlIHNzZCBpbmZvCi0gKi8KLXN0cnVjdCBzc2RfaW5mbyB7Ci0JX191OCAgdmFsaWQ6MTsKLQlfX3U4ICB0eXBlOjc7CQkvKiBzdWJjaGFubmVsIHR5cGUgKi8KLQlfX3U4ICBjaHBpZFs4XTsJCS8qIGNocGlkcyAqLwotCV9fdTE2IGZsYVs4XTsJCS8qIGZ1bGwgbGluayBhZGRyZXNzZXMgKi8KLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGFzbS9jaHBpZC5oPgorI2luY2x1ZGUgImNoc2MuaCIKKyNpbmNsdWRlICJzY2hpZC5oIgogCiAvKgogICogcGF0aCBtYW5hZ2VtZW50IGNvbnRyb2wgd29yZApAQCAtMTA4LDcgKzEwMSw3IEBACiAJc3RydWN0IHNjaGliIHNjaGliOwkvKiBzdWJjaGFubmVsIGluZm9ybWF0aW9uIGJsb2NrICovCiAJc3RydWN0IG9yYiBvcmI7CQkvKiBvcGVyYXRpb24gcmVxdWVzdCBibG9jayAqLwogCXN0cnVjdCBjY3cxIHNlbnNlX2NjdzsJLyogc3RhdGljIGNjdyBmb3Igc2Vuc2UgY29tbWFuZCAqLwotCXN0cnVjdCBzc2RfaW5mbyBzc2RfaW5mbzsJLyogc3ViY2hhbm5lbCBkZXNjcmlwdGlvbiAqLworCXN0cnVjdCBjaHNjX3NzZF9pbmZvIHNzZF9pbmZvOwkvKiBzdWJjaGFubmVsIGRlc2NyaXB0aW9uICovCiAJc3RydWN0IGRldmljZSBkZXY7CS8qIGVudHJ5IGluIGRldmljZSB0cmVlICovCiAJc3RydWN0IGNzc19kcml2ZXIgKmRyaXZlcjsKIH0gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoOCkpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vY21mLmMgYi9kcml2ZXJzL3MzOTAvY2lvL2NtZi5jCmluZGV4IDkwYjIyZmEuLjI4YWJkNjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vY21mLmMKKysrIGIvZHJpdmVycy9zMzkwL2Npby9jbWYuYwpAQCAtNDc2LDcgKzQ3Niw3IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IGNtYl9hcmVhIGNtYl9hcmVhID0gewotCS5sb2NrID0gU1BJTl9MT0NLX1VOTE9DS0VELAorCS5sb2NrID0gX19TUElOX0xPQ0tfVU5MT0NLRUQoY21iX2FyZWEubG9jayksCiAJLmxpc3QgPSBMSVNUX0hFQURfSU5JVChjbWJfYXJlYS5saXN0KSwKIAkubnVtX2NoYW5uZWxzICA9IDEwMjQsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9jc3MuYyBiL2RyaXZlcnMvczM5MC9jaW8vY3NzLmMKaW5kZXggZmUwYWNlNy4uMjdjNmQ5ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9jc3MuYworKysgYi9kcml2ZXJzL3MzOTAvY2lvL2Nzcy5jCkBAIC0yMCw4ICsyMCw5IEBACiAjaW5jbHVkZSAiaW9hc20uaCIKICNpbmNsdWRlICJjaHNjLmgiCiAjaW5jbHVkZSAiZGV2aWNlLmgiCisjaW5jbHVkZSAiaWRzZXQuaCIKKyNpbmNsdWRlICJjaHAuaCIKIAotaW50IG5lZWRfcmVzY2FuID0gMDsKIGludCBjc3NfaW5pdF9kb25lID0gMDsKIHN0YXRpYyBpbnQgbmVlZF9yZXByb2JlID0gMDsKIHN0YXRpYyBpbnQgbWF4X3NzaWQgPSAwOwpAQCAtMTI1LDggKzEyNiw1MiBAQAogCW11dGV4X3VubG9jaygmc2NoLT5yZWdfbXV0ZXgpOwogfQogCi1zdGF0aWMgaW50Ci1jc3NfcmVnaXN0ZXJfc3ViY2hhbm5lbChzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoKQorc3RhdGljIHZvaWQgc3NkX2Zyb21fcG1jdyhzdHJ1Y3QgY2hzY19zc2RfaW5mbyAqc3NkLCBzdHJ1Y3QgcG1jdyAqcG1jdykKK3sKKwlpbnQgaTsKKwlpbnQgbWFzazsKKworCW1lbXNldChzc2QsIDAsIHNpemVvZihzdHJ1Y3QgY2hzY19zc2RfaW5mbykpOworCXNzZC0+cGF0aF9tYXNrID0gcG1jdy0+cGltOworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJbWFzayA9IDB4ODAgPj4gaTsKKwkJaWYgKHBtY3ctPnBpbSAmIG1hc2spIHsKKwkJCWNocF9pZF9pbml0KCZzc2QtPmNocGlkW2ldKTsKKwkJCXNzZC0+Y2hwaWRbaV0uaWQgPSBwbWN3LT5jaHBpZFtpXTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgc3NkX3JlZ2lzdGVyX2NocGlkcyhzdHJ1Y3QgY2hzY19zc2RfaW5mbyAqc3NkKQoreworCWludCBpOworCWludCBtYXNrOworCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQltYXNrID0gMHg4MCA+PiBpOworCQlpZiAoc3NkLT5wYXRoX21hc2sgJiBtYXNrKQorCQkJaWYgKCFjaHBfaXNfcmVnaXN0ZXJlZChzc2QtPmNocGlkW2ldKSkKKwkJCQljaHBfbmV3KHNzZC0+Y2hwaWRbaV0pOworCX0KK30KKwordm9pZCBjc3NfdXBkYXRlX3NzZF9pbmZvKHN0cnVjdCBzdWJjaGFubmVsICpzY2gpCit7CisJaW50IHJldDsKKworCWlmIChjaW9faXNfY29uc29sZShzY2gtPnNjaGlkKSkgeworCQkvKiBDb25zb2xlIGlzIGluaXRpYWxpemVkIHRvbyBlYXJseSBmb3IgZnVuY3Rpb25zIHJlcXVpcmluZworCQkgKiBtZW1vcnkgYWxsb2NhdGlvbi4gKi8KKwkJc3NkX2Zyb21fcG1jdygmc2NoLT5zc2RfaW5mbywgJnNjaC0+c2NoaWIucG1jdyk7CisJfSBlbHNlIHsKKwkJcmV0ID0gY2hzY19nZXRfc3NkX2luZm8oc2NoLT5zY2hpZCwgJnNjaC0+c3NkX2luZm8pOworCQlpZiAocmV0KQorCQkJc3NkX2Zyb21fcG1jdygmc2NoLT5zc2RfaW5mbywgJnNjaC0+c2NoaWIucG1jdyk7CisJCXNzZF9yZWdpc3Rlcl9jaHBpZHMoJnNjaC0+c3NkX2luZm8pOworCX0KK30KKworc3RhdGljIGludCBjc3NfcmVnaXN0ZXJfc3ViY2hhbm5lbChzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoKQogewogCWludCByZXQ7CiAKQEAgLTEzNSw5ICsxODAsNyBAQAogCXNjaC0+ZGV2LmJ1cyA9ICZjc3NfYnVzX3R5cGU7CiAJc2NoLT5kZXYucmVsZWFzZSA9ICZjc3Nfc3ViY2hhbm5lbF9yZWxlYXNlOwogCXNjaC0+ZGV2Lmdyb3VwcyA9IHN1YmNoX2F0dHJfZ3JvdXBzOwotCi0JY3NzX2dldF9zc2RfaW5mbyhzY2gpOwotCisJY3NzX3VwZGF0ZV9zc2RfaW5mbyhzY2gpOwogCS8qIG1ha2UgaXQga25vd24gdG8gdGhlIHN5c3RlbSAqLwogCXJldCA9IGNzc19zY2hfZGV2aWNlX3JlZ2lzdGVyKHNjaCk7CiAJaWYgKHJldCkgewpAQCAtMzA2LDcgKzM0OSw3IEBACiAJcmV0dXJuIGNzc19wcm9iZV9kZXZpY2Uoc2NoaWQpOwogfQogCi1zdGF0aWMgaW50IGNzc19ldmFsdWF0ZV9zdWJjaGFubmVsKHN0cnVjdCBzdWJjaGFubmVsX2lkIHNjaGlkLCBpbnQgc2xvdykKK3N0YXRpYyB2b2lkIGNzc19ldmFsdWF0ZV9zdWJjaGFubmVsKHN0cnVjdCBzdWJjaGFubmVsX2lkIHNjaGlkLCBpbnQgc2xvdykKIHsKIAlzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoOwogCWludCByZXQ7CkBAIC0zMTcsNTMgKzM2MCw2NiBAQAogCQlwdXRfZGV2aWNlKCZzY2gtPmRldik7CiAJfSBlbHNlCiAJCXJldCA9IGNzc19ldmFsdWF0ZV9uZXdfc3ViY2hhbm5lbChzY2hpZCwgc2xvdyk7Ci0KLQlyZXR1cm4gcmV0OworCWlmIChyZXQgPT0gLUVBR0FJTikKKwkJY3NzX3NjaGVkdWxlX2V2YWwoc2NoaWQpOwogfQogCi1zdGF0aWMgaW50Ci1jc3NfcmVzY2FuX2RldmljZXMoc3RydWN0IHN1YmNoYW5uZWxfaWQgc2NoaWQsIHZvaWQgKmRhdGEpCitzdGF0aWMgc3RydWN0IGlkc2V0ICpzbG93X3N1YmNoYW5uZWxfc2V0Oworc3RhdGljIHNwaW5sb2NrX3Qgc2xvd19zdWJjaGFubmVsX2xvY2s7CisKK3N0YXRpYyBpbnQgX19pbml0IHNsb3dfc3ViY2hhbm5lbF9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIGNzc19ldmFsdWF0ZV9zdWJjaGFubmVsKHNjaGlkLCAxKTsKLX0KLQotc3RydWN0IHNsb3dfc3ViY2hhbm5lbCB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBzbG93X2xpc3Q7Ci0Jc3RydWN0IHN1YmNoYW5uZWxfaWQgc2NoaWQ7Ci19OwotCi1zdGF0aWMgTElTVF9IRUFEKHNsb3dfc3ViY2hhbm5lbHNfaGVhZCk7Ci1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKHNsb3dfc3ViY2hhbm5lbF9sb2NrKTsKLQotc3RhdGljIHZvaWQKLWNzc190cmlnZ2VyX3Nsb3dfcGF0aChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKnVudXNlZCkKLXsKLQlDSU9fVFJBQ0VfRVZFTlQoNCwgInNsb3dwYXRoIik7Ci0KLQlpZiAobmVlZF9yZXNjYW4pIHsKLQkJbmVlZF9yZXNjYW4gPSAwOwotCQlmb3JfZWFjaF9zdWJjaGFubmVsKGNzc19yZXNjYW5fZGV2aWNlcywgTlVMTCk7Ci0JCXJldHVybjsKKwlzcGluX2xvY2tfaW5pdCgmc2xvd19zdWJjaGFubmVsX2xvY2spOworCXNsb3dfc3ViY2hhbm5lbF9zZXQgPSBpZHNldF9zY2hfbmV3KCk7CisJaWYgKCFzbG93X3N1YmNoYW5uZWxfc2V0KSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImNpbzogY291bGQgbm90IGFsbG9jYXRlIHNsb3cgc3ViY2hhbm5lbCAiCisJCSAgICAgICAic2V0XG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CiAJfQorCXJldHVybiAwOworfQogCitzdWJzeXNfaW5pdGNhbGwoc2xvd19zdWJjaGFubmVsX2luaXQpOworCitzdGF0aWMgdm9pZCBjc3Nfc2xvd19wYXRoX2Z1bmMoc3RydWN0IHdvcmtfc3RydWN0ICp1bnVzZWQpCit7CisJc3RydWN0IHN1YmNoYW5uZWxfaWQgc2NoaWQ7CisKKwlDSU9fVFJBQ0VfRVZFTlQoNCwgInNsb3dwYXRoIik7CiAJc3Bpbl9sb2NrX2lycSgmc2xvd19zdWJjaGFubmVsX2xvY2spOwotCXdoaWxlICghbGlzdF9lbXB0eSgmc2xvd19zdWJjaGFubmVsc19oZWFkKSkgewotCQlzdHJ1Y3Qgc2xvd19zdWJjaGFubmVsICpzbG93X3NjaCA9Ci0JCQlsaXN0X2VudHJ5KHNsb3dfc3ViY2hhbm5lbHNfaGVhZC5uZXh0LAotCQkJCSAgIHN0cnVjdCBzbG93X3N1YmNoYW5uZWwsIHNsb3dfbGlzdCk7Ci0KLQkJbGlzdF9kZWxfaW5pdChzbG93X3N1YmNoYW5uZWxzX2hlYWQubmV4dCk7CisJaW5pdF9zdWJjaGFubmVsX2lkKCZzY2hpZCk7CisJd2hpbGUgKGlkc2V0X3NjaF9nZXRfZmlyc3Qoc2xvd19zdWJjaGFubmVsX3NldCwgJnNjaGlkKSkgeworCQlpZHNldF9zY2hfZGVsKHNsb3dfc3ViY2hhbm5lbF9zZXQsIHNjaGlkKTsKIAkJc3Bpbl91bmxvY2tfaXJxKCZzbG93X3N1YmNoYW5uZWxfbG9jayk7Ci0JCWNzc19ldmFsdWF0ZV9zdWJjaGFubmVsKHNsb3dfc2NoLT5zY2hpZCwgMSk7CisJCWNzc19ldmFsdWF0ZV9zdWJjaGFubmVsKHNjaGlkLCAxKTsKIAkJc3Bpbl9sb2NrX2lycSgmc2xvd19zdWJjaGFubmVsX2xvY2spOwotCQlrZnJlZShzbG93X3NjaCk7CiAJfQogCXNwaW5fdW5sb2NrX2lycSgmc2xvd19zdWJjaGFubmVsX2xvY2spOwogfQogCi1ERUNMQVJFX1dPUksoc2xvd19wYXRoX3dvcmssIGNzc190cmlnZ2VyX3Nsb3dfcGF0aCk7CitzdGF0aWMgREVDTEFSRV9XT1JLKHNsb3dfcGF0aF93b3JrLCBjc3Nfc2xvd19wYXRoX2Z1bmMpOwogc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKnNsb3dfcGF0aF93cTsKIAordm9pZCBjc3Nfc2NoZWR1bGVfZXZhbChzdHJ1Y3Qgc3ViY2hhbm5lbF9pZCBzY2hpZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNsb3dfc3ViY2hhbm5lbF9sb2NrLCBmbGFncyk7CisJaWRzZXRfc2NoX2FkZChzbG93X3N1YmNoYW5uZWxfc2V0LCBzY2hpZCk7CisJcXVldWVfd29yayhzbG93X3BhdGhfd3EsICZzbG93X3BhdGhfd29yayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2xvd19zdWJjaGFubmVsX2xvY2ssIGZsYWdzKTsKK30KKwordm9pZCBjc3Nfc2NoZWR1bGVfZXZhbF9hbGwodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNsb3dfc3ViY2hhbm5lbF9sb2NrLCBmbGFncyk7CisJaWRzZXRfZmlsbChzbG93X3N1YmNoYW5uZWxfc2V0KTsKKwlxdWV1ZV93b3JrKHNsb3dfcGF0aF93cSwgJnNsb3dfcGF0aF93b3JrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzbG93X3N1YmNoYW5uZWxfbG9jaywgZmxhZ3MpOworfQorCiAvKiBSZXByb2JlIHN1YmNoYW5uZWwgaWYgdW5yZWdpc3RlcmVkLiAqLwogc3RhdGljIGludCByZXByb2JlX3N1YmNoYW5uZWwoc3RydWN0IHN1YmNoYW5uZWxfaWQgc2NoaWQsIHZvaWQgKmRhdGEpCiB7CkBAIC00MjYsMzMgKzQ4MiwxNCBAQAogRVhQT1JUX1NZTUJPTF9HUEwoY3NzX3NjaGVkdWxlX3JlcHJvYmUpOwogCiAvKgotICogUmVzY2FuIGZvciBuZXcgZGV2aWNlcy4gRklYTUU6IFRoaXMgaXMgc2xvdy4KLSAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gd2UgaGF2ZSBsb3N0IENSV3MgZHVlIHRvIG92ZXJmbG93cyBhbmQgd2UgaGF2ZQotICogdG8gZG8gc3ViY2hhbm5lbCBob3VzZWtlZXBpbmcuCi0gKi8KLXZvaWQKLWNzc19yZWl0ZXJhdGVfc3ViY2hhbm5lbHModm9pZCkKLXsKLQljc3NfY2xlYXJfc3ViY2hhbm5lbF9zbG93X2xpc3QoKTsKLQluZWVkX3Jlc2NhbiA9IDE7Ci19Ci0KLS8qCiAgKiBDYWxsZWQgZnJvbSB0aGUgbWFjaGluZSBjaGVjayBoYW5kbGVyIGZvciBzdWJjaGFubmVsIHJlcG9ydCB3b3Jkcy4KICAqLwotaW50Ci1jc3NfcHJvY2Vzc19jcncoaW50IHJzaWQxLCBpbnQgcnNpZDIpCit2b2lkIGNzc19wcm9jZXNzX2NydyhpbnQgcnNpZDEsIGludCByc2lkMikKIHsKLQlpbnQgcmV0OwogCXN0cnVjdCBzdWJjaGFubmVsX2lkIG1jaGtfc2NoaWQ7CiAKIAlDSU9fQ1JXX0VWRU5UKDIsICJzb3VyY2UgaXMgc3ViY2hhbm5lbCAlMDRYLCBzdWJzeXN0ZW0gaWQgJXhcbiIsCiAJCSAgICAgIHJzaWQxLCByc2lkMik7Ci0KLQlpZiAobmVlZF9yZXNjYW4pCi0JCS8qIFdlIG5lZWQgdG8gaXRlcmF0ZSBhbGwgc3ViY2hhbm5lbHMgYW55d2F5LiAqLwotCQlyZXR1cm4gLUVBR0FJTjsKLQogCWluaXRfc3ViY2hhbm5lbF9pZCgmbWNoa19zY2hpZCk7CiAJbWNoa19zY2hpZC5zY2hfbm8gPSByc2lkMTsKIAlpZiAocnNpZDIgIT0gMCkKQEAgLTQ2MywxNCArNTAwLDcgQEAKIAkgKiB1c2Ugc3RzY2goKSB0byBmaW5kIG91dCBpZiB0aGUgc3ViY2hhbm5lbCBpbiBxdWVzdGlvbiBoYXMgY29tZQogCSAqIG9yIGdvbmUuCiAJICovCi0JcmV0ID0gY3NzX2V2YWx1YXRlX3N1YmNoYW5uZWwobWNoa19zY2hpZCwgMCk7Ci0JaWYgKHJldCA9PSAtRUFHQUlOKSB7Ci0JCWlmIChjc3NfZW5xdWV1ZV9zdWJjaGFubmVsX3Nsb3cobWNoa19zY2hpZCkpIHsKLQkJCWNzc19jbGVhcl9zdWJjaGFubmVsX3Nsb3dfbGlzdCgpOwotCQkJbmVlZF9yZXNjYW4gPSAxOwotCQl9Ci0JfQotCXJldHVybiByZXQ7CisJY3NzX2V2YWx1YXRlX3N1YmNoYW5uZWwobWNoa19zY2hpZCwgMCk7CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0CkBAIC03NDUsNDcgKzc3NSw2IEBACiAKIHN1YnN5c19pbml0Y2FsbChpbml0X2NoYW5uZWxfc3Vic3lzdGVtKTsKIAotaW50Ci1jc3NfZW5xdWV1ZV9zdWJjaGFubmVsX3Nsb3coc3RydWN0IHN1YmNoYW5uZWxfaWQgc2NoaWQpCi17Ci0Jc3RydWN0IHNsb3dfc3ViY2hhbm5lbCAqbmV3X3Nsb3dfc2NoOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQluZXdfc2xvd19zY2ggPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc2xvd19zdWJjaGFubmVsKSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFuZXdfc2xvd19zY2gpCi0JCXJldHVybiAtRU5PTUVNOwotCW5ld19zbG93X3NjaC0+c2NoaWQgPSBzY2hpZDsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmc2xvd19zdWJjaGFubmVsX2xvY2ssIGZsYWdzKTsKLQlsaXN0X2FkZF90YWlsKCZuZXdfc2xvd19zY2gtPnNsb3dfbGlzdCwgJnNsb3dfc3ViY2hhbm5lbHNfaGVhZCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2xvd19zdWJjaGFubmVsX2xvY2ssIGZsYWdzKTsKLQlyZXR1cm4gMDsKLX0KLQotdm9pZAotY3NzX2NsZWFyX3N1YmNoYW5uZWxfc2xvd19saXN0KHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZzbG93X3N1YmNoYW5uZWxfbG9jaywgZmxhZ3MpOwotCXdoaWxlICghbGlzdF9lbXB0eSgmc2xvd19zdWJjaGFubmVsc19oZWFkKSkgewotCQlzdHJ1Y3Qgc2xvd19zdWJjaGFubmVsICpzbG93X3NjaCA9Ci0JCQlsaXN0X2VudHJ5KHNsb3dfc3ViY2hhbm5lbHNfaGVhZC5uZXh0LAotCQkJCSAgIHN0cnVjdCBzbG93X3N1YmNoYW5uZWwsIHNsb3dfbGlzdCk7Ci0KLQkJbGlzdF9kZWxfaW5pdChzbG93X3N1YmNoYW5uZWxzX2hlYWQubmV4dCk7Ci0JCWtmcmVlKHNsb3dfc2NoKTsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2xvd19zdWJjaGFubmVsX2xvY2ssIGZsYWdzKTsKLX0KLQotCi0KLWludAotY3NzX3Nsb3dfc3ViY2hhbm5lbHNfZXhpc3Qodm9pZCkKLXsKLQlyZXR1cm4gKCFsaXN0X2VtcHR5KCZzbG93X3N1YmNoYW5uZWxzX2hlYWQpKTsKLX0KLQogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogRVhQT1JUX1NZTUJPTChjc3NfYnVzX3R5cGUpOwogRVhQT1JUX1NZTUJPTF9HUEwoY3NzX2NoYXJhY3RlcmlzdGljc19hdmFpbCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2lvL2Nzcy5oIGIvZHJpdmVycy9zMzkwL2Npby9jc3MuaAppbmRleCBjYTJiYWI5Li43MWZjZmRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2lvL2Nzcy5oCisrKyBiL2RyaXZlcnMvczM5MC9jaW8vY3NzLmgKQEAgLTQsOCArNCwxMSBAQAogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKICNpbmNsdWRlIDxhc20vY2lvLmg+CisjaW5jbHVkZSA8YXNtL2NocGlkLmg+CiAKICNpbmNsdWRlICJzY2hpZC5oIgogCkBAIC0xNDMsMTMgKzE0NiwxMiBAQAogZXh0ZXJuIHN0cnVjdCBzdWJjaGFubmVsICogZ2V0X3N1YmNoYW5uZWxfYnlfc2NoaWQoc3RydWN0IHN1YmNoYW5uZWxfaWQpOwogZXh0ZXJuIGludCBjc3NfaW5pdF9kb25lOwogZXh0ZXJuIGludCBmb3JfZWFjaF9zdWJjaGFubmVsKGludCgqZm4pKHN0cnVjdCBzdWJjaGFubmVsX2lkLCB2b2lkICopLCB2b2lkICopOwotZXh0ZXJuIGludCBjc3NfcHJvY2Vzc19jcncoaW50LCBpbnQpOworZXh0ZXJuIHZvaWQgY3NzX3Byb2Nlc3NfY3J3KGludCwgaW50KTsKIGV4dGVybiB2b2lkIGNzc19yZWl0ZXJhdGVfc3ViY2hhbm5lbHModm9pZCk7Cit2b2lkIGNzc191cGRhdGVfc3NkX2luZm8oc3RydWN0IHN1YmNoYW5uZWwgKnNjaCk7CiAKICNkZWZpbmUgX19NQVhfU1VCQ0hBTk5FTCA2NTUzNQogI2RlZmluZSBfX01BWF9TU0lEIDMKLSNkZWZpbmUgX19NQVhfQ0hQSUQgMjU1Ci0jZGVmaW5lIF9fTUFYX0NTU0lEIDAKIAogc3RydWN0IGNoYW5uZWxfc3Vic3lzdGVtIHsKIAl1OCBjc3NpZDsKQEAgLTE4NSwxNiArMTg3LDEyIEBACiB2b2lkIGRldmljZV9raWxsX3BlbmRpbmdfdGltZXIoc3RydWN0IHN1YmNoYW5uZWwgKik7CiAKIC8qIEhlbHBlciBmdW5jdGlvbnMgdG8gYnVpbGQgbGlzdHMgZm9yIHRoZSBzbG93IHBhdGguICovCi1leHRlcm4gaW50IGNzc19lbnF1ZXVlX3N1YmNoYW5uZWxfc2xvdyhzdHJ1Y3Qgc3ViY2hhbm5lbF9pZCBzY2hpZCk7Ci12b2lkIGNzc193YWxrX3N1YmNoYW5uZWxfc2xvd19saXN0KHZvaWQgKCpmbikodW5zaWduZWQgbG9uZykpOwotdm9pZCBjc3NfY2xlYXJfc3ViY2hhbm5lbF9zbG93X2xpc3Qodm9pZCk7Ci1pbnQgY3NzX3Nsb3dfc3ViY2hhbm5lbHNfZXhpc3Qodm9pZCk7Ci1leHRlcm4gaW50IG5lZWRfcmVzY2FuOwordm9pZCBjc3Nfc2NoZWR1bGVfZXZhbChzdHJ1Y3Qgc3ViY2hhbm5lbF9pZCBzY2hpZCk7Cit2b2lkIGNzc19zY2hlZHVsZV9ldmFsX2FsbCh2b2lkKTsKIAogaW50IHNjaF9pc19wc2V1ZG9fc2NoKHN0cnVjdCBzdWJjaGFubmVsICopOwogCiBleHRlcm4gc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKnNsb3dfcGF0aF93cTsKLWV4dGVybiBzdHJ1Y3Qgd29ya19zdHJ1Y3Qgc2xvd19wYXRoX3dvcms7CiAKIGludCBzdWJjaGFubmVsX2FkZF9maWxlcyAoc3RydWN0IGRldmljZSAqKTsKIGV4dGVybiBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICpzdWJjaF9hdHRyX2dyb3Vwc1tdOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9kZXZpY2UuYyBiL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlLmMKaW5kZXggZTMyMjExMS4uYTIzZmY1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9kZXZpY2UuYworKysgYi9kcml2ZXJzL3MzOTAvY2lvL2RldmljZS5jCkBAIC01NiwxMyArNTYsMTIgQEAKIC8qIFN0b3JlIG1vZGFsaWFzIHN0cmluZyBkZWxpbWl0ZWQgYnkgcHJlZml4L3N1ZmZpeCBzdHJpbmcgaW50byBidWZmZXIgd2l0aAogICogc3BlY2lmaWVkIHNpemUuIFJldHVybiBsZW5ndGggb2YgcmVzdWx0aW5nIHN0cmluZyAoZXhjbHVkaW5nIHRyYWlsaW5nICdcMCcpCiAgKiBldmVuIGlmIHN0cmluZyBkb2Vzbid0IGZpdCBidWZmZXIgKHNucHJpbnRmIHNlbWFudGljcykuICovCi1zdGF0aWMgaW50IHNucHJpbnRfYWxpYXMoY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciAqcHJlZml4LAorc3RhdGljIGludCBzbnByaW50X2FsaWFzKGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUsCiAJCQkgc3RydWN0IGNjd19kZXZpY2VfaWQgKmlkLCBjb25zdCBjaGFyICpzdWZmaXgpCiB7CiAJaW50IGxlbjsKIAotCWxlbiA9IHNucHJpbnRmKGJ1Ziwgc2l6ZSwgIiVzY2N3OnQlMDRYbSUwMlgiLCBwcmVmaXgsIGlkLT5jdV90eXBlLAotCQkgICAgICAgaWQtPmN1X21vZGVsKTsKKwlsZW4gPSBzbnByaW50ZihidWYsIHNpemUsICJjY3c6dCUwNFhtJTAyWCIsIGlkLT5jdV90eXBlLCBpZC0+Y3VfbW9kZWwpOwogCWlmIChsZW4gPiBzaXplKQogCQlyZXR1cm4gbGVuOwogCWJ1ZiArPSBsZW47CkBAIC04NSw1MyArODQsNDAgQEAKIAlzdHJ1Y3QgY2N3X2RldmljZSAqY2RldiA9IHRvX2Njd2RldihkZXYpOwogCXN0cnVjdCBjY3dfZGV2aWNlX2lkICppZCA9ICYoY2Rldi0+aWQpOwogCWludCBpID0gMDsKLQlpbnQgbGVuOworCWludCBsZW4gPSAwOworCWludCByZXQ7CisJY2hhciBtb2RhbGlhc19idWZbMzBdOwogCiAJLyogQ1VfVFlQRT0gKi8KLQlsZW4gPSBzbnByaW50ZihidWZmZXIsIGJ1ZmZlcl9zaXplLCAiQ1VfVFlQRT0lMDRYIiwgaWQtPmN1X3R5cGUpICsgMTsKLQlpZiAobGVuID4gYnVmZmVyX3NpemUgfHwgaSA+PSBudW1fZW52cCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0JZW52cFtpKytdID0gYnVmZmVyOwotCWJ1ZmZlciArPSBsZW47Ci0JYnVmZmVyX3NpemUgLT0gbGVuOworCXJldCA9IGFkZF91ZXZlbnRfdmFyKGVudnAsIG51bV9lbnZwLCAmaSwgYnVmZmVyLCBidWZmZXJfc2l6ZSwgJmxlbiwKKwkJCSAgICAgIkNVX1RZUEU9JTA0WCIsIGlkLT5jdV90eXBlKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCiAJLyogQ1VfTU9ERUw9ICovCi0JbGVuID0gc25wcmludGYoYnVmZmVyLCBidWZmZXJfc2l6ZSwgIkNVX01PREVMPSUwMlgiLCBpZC0+Y3VfbW9kZWwpICsgMTsKLQlpZiAobGVuID4gYnVmZmVyX3NpemUgfHwgaSA+PSBudW1fZW52cCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0JZW52cFtpKytdID0gYnVmZmVyOwotCWJ1ZmZlciArPSBsZW47Ci0JYnVmZmVyX3NpemUgLT0gbGVuOworCXJldCA9IGFkZF91ZXZlbnRfdmFyKGVudnAsIG51bV9lbnZwLCAmaSwgYnVmZmVyLCBidWZmZXJfc2l6ZSwgJmxlbiwKKwkJCSAgICAgIkNVX01PREVMPSUwMlgiLCBpZC0+Y3VfbW9kZWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKIAkvKiBUaGUgbmV4dCB0d28gY2FuIGJlIHplcm8sIHRoYXQncyBvayBmb3IgdXMgKi8KIAkvKiBERVZfVFlQRT0gKi8KLQlsZW4gPSBzbnByaW50ZihidWZmZXIsIGJ1ZmZlcl9zaXplLCAiREVWX1RZUEU9JTA0WCIsIGlkLT5kZXZfdHlwZSkgKyAxOwotCWlmIChsZW4gPiBidWZmZXJfc2l6ZSB8fCBpID49IG51bV9lbnZwKQotCQlyZXR1cm4gLUVOT01FTTsKLQllbnZwW2krK10gPSBidWZmZXI7Ci0JYnVmZmVyICs9IGxlbjsKLQlidWZmZXJfc2l6ZSAtPSBsZW47CisJcmV0ID0gYWRkX3VldmVudF92YXIoZW52cCwgbnVtX2VudnAsICZpLCBidWZmZXIsIGJ1ZmZlcl9zaXplLCAmbGVuLAorCQkJICAgICAiREVWX1RZUEU9JTA0WCIsIGlkLT5kZXZfdHlwZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAogCS8qIERFVl9NT0RFTD0gKi8KLQlsZW4gPSBzbnByaW50ZihidWZmZXIsIGJ1ZmZlcl9zaXplLCAiREVWX01PREVMPSUwMlgiLAotCQkJKHVuc2lnbmVkIGNoYXIpIGlkLT5kZXZfbW9kZWwpICsgMTsKLQlpZiAobGVuID4gYnVmZmVyX3NpemUgfHwgaSA+PSBudW1fZW52cCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0JZW52cFtpKytdID0gYnVmZmVyOwotCWJ1ZmZlciArPSBsZW47Ci0JYnVmZmVyX3NpemUgLT0gbGVuOworCXJldCA9IGFkZF91ZXZlbnRfdmFyKGVudnAsIG51bV9lbnZwLCAmaSwgYnVmZmVyLCBidWZmZXJfc2l6ZSwgJmxlbiwKKwkJCSAgICAgIkRFVl9NT0RFTD0lMDJYIiwgaWQtPmRldl9tb2RlbCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAogCS8qIE1PREFMSUFTPSAgKi8KLQlsZW4gPSBzbnByaW50X2FsaWFzKGJ1ZmZlciwgYnVmZmVyX3NpemUsICJNT0RBTElBUz0iLCBpZCwgIiIpICsgMTsKLQlpZiAobGVuID4gYnVmZmVyX3NpemUgfHwgaSA+PSBudW1fZW52cCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0JZW52cFtpKytdID0gYnVmZmVyOwotCWJ1ZmZlciArPSBsZW47Ci0JYnVmZmVyX3NpemUgLT0gbGVuOwotCi0JZW52cFtpXSA9IE5VTEw7Ci0KLQlyZXR1cm4gMDsKKwlzbnByaW50X2FsaWFzKG1vZGFsaWFzX2J1Ziwgc2l6ZW9mKG1vZGFsaWFzX2J1ZiksIGlkLCAiIik7CisJcmV0ID0gYWRkX3VldmVudF92YXIoZW52cCwgbnVtX2VudnAsICZpLCBidWZmZXIsIGJ1ZmZlcl9zaXplLCAmbGVuLAorCQkJICAgICAiTU9EQUxJQVM9JXMiLCBtb2RhbGlhc19idWYpOworCXJldHVybiByZXQ7CiB9CiAKIHN0cnVjdCBidXNfdHlwZSBjY3dfYnVzX3R5cGU7CkBAIC0yMzAsMTIgKzIxNiwxOCBAQAogY2hwaWRzX3Nob3cgKHN0cnVjdCBkZXZpY2UgKiBkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICogYnVmKQogewogCXN0cnVjdCBzdWJjaGFubmVsICpzY2ggPSB0b19zdWJjaGFubmVsKGRldik7Ci0Jc3RydWN0IHNzZF9pbmZvICpzc2QgPSAmc2NoLT5zc2RfaW5mbzsKKwlzdHJ1Y3QgY2hzY19zc2RfaW5mbyAqc3NkID0gJnNjaC0+c3NkX2luZm87CiAJc3NpemVfdCByZXQgPSAwOwogCWludCBjaHA7CisJaW50IG1hc2s7CiAKLQlmb3IgKGNocCA9IDA7IGNocCA8IDg7IGNocCsrKQotCQlyZXQgKz0gc3ByaW50ZiAoYnVmK3JldCwgIiUwMnggIiwgc3NkLT5jaHBpZFtjaHBdKTsKKwlmb3IgKGNocCA9IDA7IGNocCA8IDg7IGNocCsrKSB7CisJCW1hc2sgPSAweDgwID4+IGNocDsKKwkJaWYgKHNzZC0+cGF0aF9tYXNrICYgbWFzaykKKwkJCXJldCArPSBzcHJpbnRmKGJ1ZiArIHJldCwgIiUwMnggIiwgc3NkLT5jaHBpZFtjaHBdLmlkKTsKKwkJZWxzZQorCQkJcmV0ICs9IHNwcmludGYoYnVmICsgcmV0LCAiMDAgIik7CisJfQogCXJldCArPSBzcHJpbnRmIChidWYrcmV0LCAiXG4iKTsKIAlyZXR1cm4gbWluKChzc2l6ZV90KVBBR0VfU0laRSwgcmV0KTsKIH0KQEAgLTI4MCw3ICsyNzIsNyBAQAogCXN0cnVjdCBjY3dfZGV2aWNlX2lkICppZCA9ICYoY2Rldi0+aWQpOwogCWludCBsZW47CiAKLQlsZW4gPSBzbnByaW50X2FsaWFzKGJ1ZiwgUEFHRV9TSVpFLCAiIiwgaWQsICJcbiIpICsgMTsKKwlsZW4gPSBzbnByaW50X2FsaWFzKGJ1ZiwgUEFHRV9TSVpFLCBpZCwgIlxuIikgKyAxOwogCiAJcmV0dXJuIGxlbiA+IFBBR0VfU0laRSA/IFBBR0VfU0laRSA6IGxlbjsKIH0KQEAgLTI5OCwxNiArMjkwLDEwIEBACiAJcmV0dXJuIHNjaF9pc19wc2V1ZG9fc2NoKHRvX3N1YmNoYW5uZWwoY2Rldi0+ZGV2LnBhcmVudCkpOwogfQogCi1zdGF0aWMgdm9pZCBjY3dfZGV2aWNlX3VucmVnaXN0ZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQorc3RhdGljIHZvaWQgY2N3X2RldmljZV91bnJlZ2lzdGVyKHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2KQogewotCXN0cnVjdCBjY3dfZGV2aWNlX3ByaXZhdGUgKnByaXY7Ci0Jc3RydWN0IGNjd19kZXZpY2UgKmNkZXY7Ci0KLQlwcml2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBjY3dfZGV2aWNlX3ByaXZhdGUsIGtpY2tfd29yayk7Ci0JY2RldiA9IHByaXYtPmNkZXY7CiAJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdCgxLCAmY2Rldi0+cHJpdmF0ZS0+cmVnaXN0ZXJlZCkpCi0JCWRldmljZV91bnJlZ2lzdGVyKCZjZGV2LT5kZXYpOwotCXB1dF9kZXZpY2UoJmNkZXYtPmRldik7CisJCWRldmljZV9kZWwoJmNkZXYtPmRldik7CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC0zMjQsMTEgKzMxMCw4IEBACiAJCXNwaW5fbG9ja19pcnFzYXZlKGNkZXYtPmNjd2xvY2ssIGZsYWdzKTsKIAkJY2Rldi0+cHJpdmF0ZS0+c3RhdGUgPSBERVZfU1RBVEVfTk9UX09QRVI7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoY2Rldi0+Y2N3bG9jaywgZmxhZ3MpOwotCQlpZiAoZ2V0X2RldmljZSgmY2Rldi0+ZGV2KSkgewotCQkJUFJFUEFSRV9XT1JLKCZjZGV2LT5wcml2YXRlLT5raWNrX3dvcmssCi0JCQkJICAgICBjY3dfZGV2aWNlX3VucmVnaXN0ZXIpOwotCQkJcXVldWVfd29yayhjY3dfZGV2aWNlX3dvcmssICZjZGV2LT5wcml2YXRlLT5raWNrX3dvcmspOwotCQl9CisJCWNjd19kZXZpY2VfdW5yZWdpc3RlcihjZGV2KTsKKwkJcHV0X2RldmljZSgmY2Rldi0+ZGV2KTsKIAkJcmV0dXJuIDsKIAl9CiAJc2NoID0gdG9fc3ViY2hhbm5lbChjZGV2LT5kZXYucGFyZW50KTsKQEAgLTQxMywxMSArMzk2LDYwIEBACiAJcmV0dXJuIChyZXQgPT0gMCkgPyAtRU5PREVWIDogcmV0OwogfQogCi1zdGF0aWMgc3NpemVfdAotb25saW5lX3N0b3JlIChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3N0YXRpYyB2b2lkIG9ubGluZV9zdG9yZV9oYW5kbGVfb2ZmbGluZShzdHJ1Y3QgY2N3X2RldmljZSAqY2RldikKK3sKKwlpZiAoY2Rldi0+cHJpdmF0ZS0+c3RhdGUgPT0gREVWX1NUQVRFX0RJU0NPTk5FQ1RFRCkKKwkJY2N3X2RldmljZV9yZW1vdmVfZGlzY29ubmVjdGVkKGNkZXYpOworCWVsc2UgaWYgKGNkZXYtPmRydiAmJiBjZGV2LT5kcnYtPnNldF9vZmZsaW5lKQorCQljY3dfZGV2aWNlX3NldF9vZmZsaW5lKGNkZXYpOworfQorCitzdGF0aWMgaW50IG9ubGluZV9zdG9yZV9yZWNvZ19hbmRfb25saW5lKHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2KQoreworCWludCByZXQ7CisKKwkvKiBEbyBkZXZpY2UgcmVjb2duaXRpb24sIGlmIG5lZWRlZC4gKi8KKwlpZiAoY2Rldi0+aWQuY3VfdHlwZSA9PSAwKSB7CisJCXJldCA9IGNjd19kZXZpY2VfcmVjb2duaXRpb24oY2Rldik7CisJCWlmIChyZXQpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkciQ291bGRuJ3Qgc3RhcnQgcmVjb2duaXRpb24gIgorCQkJICAgICAgICJmb3IgZGV2aWNlICVzIChyZXQ9JWQpXG4iLAorCQkJICAgICAgIGNkZXYtPmRldi5idXNfaWQsIHJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCXdhaXRfZXZlbnQoY2Rldi0+cHJpdmF0ZS0+d2FpdF9xLAorCQkJICAgY2Rldi0+cHJpdmF0ZS0+ZmxhZ3MucmVjb2dfZG9uZSk7CisJfQorCWlmIChjZGV2LT5kcnYgJiYgY2Rldi0+ZHJ2LT5zZXRfb25saW5lKQorCQljY3dfZGV2aWNlX3NldF9vbmxpbmUoY2Rldik7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgdm9pZCBvbmxpbmVfc3RvcmVfaGFuZGxlX29ubGluZShzdHJ1Y3QgY2N3X2RldmljZSAqY2RldiwgaW50IGZvcmNlKQoreworCWludCByZXQ7CisKKwlyZXQgPSBvbmxpbmVfc3RvcmVfcmVjb2dfYW5kX29ubGluZShjZGV2KTsKKwlpZiAocmV0KQorCQlyZXR1cm47CisJaWYgKGZvcmNlICYmIGNkZXYtPnByaXZhdGUtPnN0YXRlID09IERFVl9TVEFURV9CT1hFRCkgeworCQlyZXQgPSBjY3dfZGV2aWNlX3N0bGNrKGNkZXYpOworCQlpZiAocmV0KSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HImNjd19kZXZpY2Vfc3RsY2sgZm9yIGRldmljZSAlcyAiCisJCQkgICAgICAgInJldHVybmVkICVkIVxuIiwgY2Rldi0+ZGV2LmJ1c19pZCwgcmV0KTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAoY2Rldi0+aWQuY3VfdHlwZSA9PSAwKQorCQkJY2Rldi0+cHJpdmF0ZS0+c3RhdGUgPSBERVZfU1RBVEVfTk9UX09QRVI7CisJCW9ubGluZV9zdG9yZV9yZWNvZ19hbmRfb25saW5lKGNkZXYpOworCX0KKworfQorCitzdGF0aWMgc3NpemVfdCBvbmxpbmVfc3RvcmUgKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCXN0cnVjdCBjY3dfZGV2aWNlICpjZGV2ID0gdG9fY2N3ZGV2KGRldik7Ci0JaW50IGksIGZvcmNlLCByZXQ7CisJaW50IGksIGZvcmNlOwogCWNoYXIgKnRtcDsKIAogCWlmIChhdG9taWNfY21weGNoZygmY2Rldi0+cHJpdmF0ZS0+b25vZmYsIDAsIDEpICE9IDApCkBAIC00MzQsNTEgKzQ2NiwxNyBAQAogCQlmb3JjZSA9IDA7CiAJCWkgPSBzaW1wbGVfc3RydG91bChidWYsICZ0bXAsIDE2KTsKIAl9Ci0JaWYgKGkgPT0gMSkgewotCQkvKiBEbyBkZXZpY2UgcmVjb2duaXRpb24sIGlmIG5lZWRlZC4gKi8KLQkJaWYgKGNkZXYtPmlkLmN1X3R5cGUgPT0gMCkgewotCQkJcmV0ID0gY2N3X2RldmljZV9yZWNvZ25pdGlvbihjZGV2KTsKLQkJCWlmIChyZXQpIHsKLQkJCQlwcmludGsoS0VSTl9XQVJOSU5HIkNvdWxkbid0IHN0YXJ0IHJlY29nbml0aW9uICIKLQkJCQkgICAgICAgImZvciBkZXZpY2UgJXMgKHJldD0lZClcbiIsCi0JCQkJICAgICAgIGNkZXYtPmRldi5idXNfaWQsIHJldCk7Ci0JCQkJZ290byBvdXQ7Ci0JCQl9Ci0JCQl3YWl0X2V2ZW50KGNkZXYtPnByaXZhdGUtPndhaXRfcSwKLQkJCQkgICBjZGV2LT5wcml2YXRlLT5mbGFncy5yZWNvZ19kb25lKTsKLQkJfQotCQlpZiAoY2Rldi0+ZHJ2ICYmIGNkZXYtPmRydi0+c2V0X29ubGluZSkKLQkJCWNjd19kZXZpY2Vfc2V0X29ubGluZShjZGV2KTsKLQl9IGVsc2UgaWYgKGkgPT0gMCkgewotCQlpZiAoY2Rldi0+cHJpdmF0ZS0+c3RhdGUgPT0gREVWX1NUQVRFX0RJU0NPTk5FQ1RFRCkKLQkJCWNjd19kZXZpY2VfcmVtb3ZlX2Rpc2Nvbm5lY3RlZChjZGV2KTsKLQkJZWxzZSBpZiAoY2Rldi0+ZHJ2ICYmIGNkZXYtPmRydi0+c2V0X29mZmxpbmUpCi0JCQljY3dfZGV2aWNlX3NldF9vZmZsaW5lKGNkZXYpOworCisJc3dpdGNoIChpKSB7CisJY2FzZSAwOgorCQlvbmxpbmVfc3RvcmVfaGFuZGxlX29mZmxpbmUoY2Rldik7CisJCWJyZWFrOworCWNhc2UgMToKKwkJb25saW5lX3N0b3JlX2hhbmRsZV9vbmxpbmUoY2RldiwgZm9yY2UpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQljb3VudCA9IC1FSU5WQUw7CiAJfQotCWlmIChmb3JjZSAmJiBjZGV2LT5wcml2YXRlLT5zdGF0ZSA9PSBERVZfU1RBVEVfQk9YRUQpIHsKLQkJcmV0ID0gY2N3X2RldmljZV9zdGxjayhjZGV2KTsKLQkJaWYgKHJldCkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyJjY3dfZGV2aWNlX3N0bGNrIGZvciBkZXZpY2UgJXMgIgotCQkJICAgICAgICJyZXR1cm5lZCAlZCFcbiIsIGNkZXYtPmRldi5idXNfaWQsIHJldCk7Ci0JCQlnb3RvIG91dDsKLQkJfQotCQkvKiBEbyBkZXZpY2UgcmVjb2duaXRpb24sIGlmIG5lZWRlZC4gKi8KLQkJaWYgKGNkZXYtPmlkLmN1X3R5cGUgPT0gMCkgewotCQkJY2Rldi0+cHJpdmF0ZS0+c3RhdGUgPSBERVZfU1RBVEVfTk9UX09QRVI7Ci0JCQlyZXQgPSBjY3dfZGV2aWNlX3JlY29nbml0aW9uKGNkZXYpOwotCQkJaWYgKHJldCkgewotCQkJCXByaW50ayhLRVJOX1dBUk5JTkciQ291bGRuJ3Qgc3RhcnQgcmVjb2duaXRpb24gIgotCQkJCSAgICAgICAiZm9yIGRldmljZSAlcyAocmV0PSVkKVxuIiwKLQkJCQkgICAgICAgY2Rldi0+ZGV2LmJ1c19pZCwgcmV0KTsKLQkJCQlnb3RvIG91dDsKLQkJCX0KLQkJCXdhaXRfZXZlbnQoY2Rldi0+cHJpdmF0ZS0+d2FpdF9xLAotCQkJCSAgIGNkZXYtPnByaXZhdGUtPmZsYWdzLnJlY29nX2RvbmUpOwotCQl9Ci0JCWlmIChjZGV2LT5kcnYgJiYgY2Rldi0+ZHJ2LT5zZXRfb25saW5lKQotCQkJY2N3X2RldmljZV9zZXRfb25saW5lKGNkZXYpOwotCX0KLQlvdXQ6CiAJaWYgKGNkZXYtPmRydikKIAkJbW9kdWxlX3B1dChjZGV2LT5kcnYtPm93bmVyKTsKIAlhdG9taWNfc2V0KCZjZGV2LT5wcml2YXRlLT5vbm9mZiwgMCk7CkBAIC01NDgsMTcgKzU0NiwxMCBAQAogCS5hdHRycyA9IGNjd2Rldl9hdHRycywKIH07CiAKLXN0YXRpYyBpbnQKLWRldmljZV9hZGRfZmlsZXMgKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlyZXR1cm4gc3lzZnNfY3JlYXRlX2dyb3VwKCZkZXYtPmtvYmosICZjY3dkZXZfYXR0cl9ncm91cCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kZXZpY2VfcmVtb3ZlX2ZpbGVzKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzeXNmc19yZW1vdmVfZ3JvdXAoJmRldi0+a29iaiwgJmNjd2Rldl9hdHRyX2dyb3VwKTsKLX0KK3N0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKmNjd2Rldl9hdHRyX2dyb3Vwc1tdID0geworCSZjY3dkZXZfYXR0cl9ncm91cCwKKwlOVUxMLAorfTsKIAogLyogdGhpcyBpcyBhIHNpbXBsZSBhYnN0cmFjdGlvbiBmb3IgZGV2aWNlX3JlZ2lzdGVyIHRoYXQgc2V0cyB0aGUKICAqIGNvcnJlY3QgYnVzIHR5cGUgYW5kIGFkZHMgdGhlIGJ1cyBzcGVjaWZpYyBmaWxlcyAqLwpAQCAtNTczLDEwICs1NjQsNiBAQAogCQlyZXR1cm4gcmV0OwogCiAJc2V0X2JpdCgxLCAmY2Rldi0+cHJpdmF0ZS0+cmVnaXN0ZXJlZCk7Ci0JaWYgKChyZXQgPSBkZXZpY2VfYWRkX2ZpbGVzKGRldikpKSB7Ci0JCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoMSwgJmNkZXYtPnByaXZhdGUtPnJlZ2lzdGVyZWQpKQotCQkJZGV2aWNlX2RlbChkZXYpOwotCX0KIAlyZXR1cm4gcmV0OwogfQogCkBAIC02NDgsMTAgKzYzNSw2IEBACiAJCXJldHVybjsKIAl9CiAJc2V0X2JpdCgxLCAmY2Rldi0+cHJpdmF0ZS0+cmVnaXN0ZXJlZCk7Ci0JaWYgKGRldmljZV9hZGRfZmlsZXMoJmNkZXYtPmRldikpIHsKLQkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdCgxLCAmY2Rldi0+cHJpdmF0ZS0+cmVnaXN0ZXJlZCkpCi0JCQlkZXZpY2VfdW5yZWdpc3RlcigmY2Rldi0+ZGV2KTsKLQl9CiB9CiAKIHZvaWQgY2N3X2RldmljZV9kb191bnJlZ19yZXJlZyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCkBAIC02NjQsOSArNjQ3LDcgQEAKIAljZGV2ID0gcHJpdi0+Y2RldjsKIAlzY2ggPSB0b19zdWJjaGFubmVsKGNkZXYtPmRldi5wYXJlbnQpOwogCi0JZGV2aWNlX3JlbW92ZV9maWxlcygmY2Rldi0+ZGV2KTsKLQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KDEsICZjZGV2LT5wcml2YXRlLT5yZWdpc3RlcmVkKSkKLQkJZGV2aWNlX2RlbCgmY2Rldi0+ZGV2KTsKKwljY3dfZGV2aWNlX3VucmVnaXN0ZXIoY2Rldik7CiAJUFJFUEFSRV9XT1JLKCZjZGV2LT5wcml2YXRlLT5raWNrX3dvcmssCiAJCSAgICAgY2N3X2RldmljZV9hZGRfY2hhbmdlZCk7CiAJcXVldWVfd29yayhjY3dfZGV2aWNlX3dvcmssICZjZGV2LT5wcml2YXRlLT5raWNrX3dvcmspOwpAQCAtNzA1LDYgKzY4Niw3IEBACiAJY2Rldi0+ZGV2LnBhcmVudCA9ICZzY2gtPmRldjsKIAljZGV2LT5kZXYucmVsZWFzZSA9IGNjd19kZXZpY2VfcmVsZWFzZTsKIAlJTklUX0xJU1RfSEVBRCgmY2Rldi0+cHJpdmF0ZS0+a2lja193b3JrLmVudHJ5KTsKKwljZGV2LT5kZXYuZ3JvdXBzID0gY2N3ZGV2X2F0dHJfZ3JvdXBzOwogCS8qIERvIGZpcnN0IGhhbGYgb2YgZGV2aWNlX3JlZ2lzdGVyLiAqLwogCWRldmljZV9pbml0aWFsaXplKCZjZGV2LT5kZXYpOwogCWlmICghZ2V0X2RldmljZSgmc2NoLT5kZXYpKSB7CkBAIC03MzYsNiArNzE4LDcgQEAKIHN0YXRpYyB2b2lkIHNjaF9hdHRhY2hfZGV2aWNlKHN0cnVjdCBzdWJjaGFubmVsICpzY2gsCiAJCQkgICAgICBzdHJ1Y3QgY2N3X2RldmljZSAqY2RldikKIHsKKwljc3NfdXBkYXRlX3NzZF9pbmZvKHNjaCk7CiAJc3Bpbl9sb2NrX2lycShzY2gtPmxvY2spOwogCXNjaC0+ZGV2LmRyaXZlcl9kYXRhID0gY2RldjsKIAljZGV2LT5wcml2YXRlLT5zY2hpZCA9IHNjaC0+c2NoaWQ7CkBAIC04NzEsNyArODU0LDcgQEAKIAlwcml2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBjY3dfZGV2aWNlX3ByaXZhdGUsIGtpY2tfd29yayk7CiAJY2RldiA9IHByaXYtPmNkZXY7CiAJc2NoID0gdG9fc3ViY2hhbm5lbChjZGV2LT5kZXYucGFyZW50KTsKLQorCWNzc191cGRhdGVfc3NkX2luZm8oc2NoKTsKIAkvKgogCSAqIGlvX3N1YmNoYW5uZWxfcmVnaXN0ZXIoKSB3aWxsIGFsc28gYmUgY2FsbGVkIGFmdGVyIGRldmljZQogCSAqIHJlY29nbml0aW9uIGhhcyBiZWVuIGRvbmUgZm9yIGEgYm94ZWQgZGV2aWNlICh3aGljaCB3aWxsIGFscmVhZHkKQEAgLTg4OCw2ICs4NzEsMTIgQEAKIAkJfQogCQlnb3RvIG91dDsKIAl9CisJLyoKKwkgKiBOb3cgd2Uga25vdyB0aGlzIHN1YmNoYW5uZWwgd2lsbCBzdGF5LCB3ZSBjYW4gdGhyb3cKKwkgKiBvdXIgZGVsYXllZCB1ZXZlbnQuCisJICovCisJc2NoLT5kZXYudWV2ZW50X3N1cHByZXNzID0gMDsKKwlrb2JqZWN0X3VldmVudCgmc2NoLT5kZXYua29iaiwgS09CSl9BREQpOwogCS8qIG1ha2UgaXQga25vd24gdG8gdGhlIHN5c3RlbSAqLwogCXJldCA9IGNjd19kZXZpY2VfcmVnaXN0ZXIoY2Rldik7CiAJaWYgKHJldCkgewpAQCAtMTEzMywxNSArMTEyMiw4IEBACiAJc2NoLT5kZXYuZHJpdmVyX2RhdGEgPSBOVUxMOwogCWNkZXYtPnByaXZhdGUtPnN0YXRlID0gREVWX1NUQVRFX05PVF9PUEVSOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoY2Rldi0+Y2N3bG9jaywgZmxhZ3MpOwotCS8qCi0JICogUHV0IHVucmVnaXN0cmF0aW9uIG9uIHdvcmtxdWV1ZSB0byBhdm9pZCBsaXZlbG9ja3Mgb24gdGhlIGNzcyBidXMKLQkgKiBzZW1hcGhvcmUuCi0JICovCi0JaWYgKGdldF9kZXZpY2UoJmNkZXYtPmRldikpIHsKLQkJUFJFUEFSRV9XT1JLKCZjZGV2LT5wcml2YXRlLT5raWNrX3dvcmssCi0JCQkgICAgIGNjd19kZXZpY2VfdW5yZWdpc3Rlcik7Ci0JCXF1ZXVlX3dvcmsoY2N3X2RldmljZV93b3JrLCAmY2Rldi0+cHJpdmF0ZS0+a2lja193b3JrKTsKLQl9CisJY2N3X2RldmljZV91bnJlZ2lzdGVyKGNkZXYpOworCXB1dF9kZXZpY2UoJmNkZXYtPmRldik7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlX2ZzbS5jIGIvZHJpdmVycy9zMzkwL2Npby9kZXZpY2VfZnNtLmMKaW5kZXggMDg5YTNkZC4uODk4ZWMzYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9kZXZpY2VfZnNtLmMKKysrIGIvZHJpdmVycy9zMzkwL2Npby9kZXZpY2VfZnNtLmMKQEAgLTE1LDYgKzE1LDcgQEAKIAogI2luY2x1ZGUgPGFzbS9jY3dkZXYuaD4KICNpbmNsdWRlIDxhc20vY2lvLmg+CisjaW5jbHVkZSA8YXNtL2NocGlkLmg+CiAKICNpbmNsdWRlICJjaW8uaCIKICNpbmNsdWRlICJjaW9fZGVidWcuaCIKQEAgLTIyLDYgKzIzLDcgQEAKICNpbmNsdWRlICJkZXZpY2UuaCIKICNpbmNsdWRlICJjaHNjLmgiCiAjaW5jbHVkZSAiaW9hc20uaCIKKyNpbmNsdWRlICJjaHAuaCIKIAogaW50CiBkZXZpY2VfaXNfb25saW5lKHN0cnVjdCBzdWJjaGFubmVsICpzY2gpCkBAIC0yMTAsMTQgKzIxMiwxOCBAQAogX19yZWNvdmVyX2xvc3RfY2hwaWRzKHN0cnVjdCBzdWJjaGFubmVsICpzY2gsIGludCBvbGRfbHBtKQogewogCWludCBtYXNrLCBpOworCXN0cnVjdCBjaHBfaWQgY2hwaWQ7CiAKKwljaHBfaWRfaW5pdCgmY2hwaWQpOwogCWZvciAoaSA9IDA7IGk8ODsgaSsrKSB7CiAJCW1hc2sgPSAweDgwID4+IGk7CiAJCWlmICghKHNjaC0+bHBtICYgbWFzaykpCiAJCQljb250aW51ZTsKIAkJaWYgKG9sZF9scG0gJiBtYXNrKQogCQkJY29udGludWU7Ci0JCWNocGlkX2lzX2FjdHVhbGx5X29ubGluZShzY2gtPnNjaGliLnBtY3cuY2hwaWRbaV0pOworCQljaHBpZC5pZCA9IHNjaC0+c2NoaWIucG1jdy5jaHBpZFtpXTsKKwkJaWYgKCFjaHBfaXNfcmVnaXN0ZXJlZChjaHBpZCkpCisJCQljc3Nfc2NoZWR1bGVfZXZhbF9hbGwoKTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlX29wcy5jIGIvZHJpdmVycy9zMzkwL2Npby9kZXZpY2Vfb3BzLmMKaW5kZXggN2M3Nzc1YS4uMTZmNTlmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9kZXZpY2Vfb3BzLmMKKysrIGIvZHJpdmVycy9zMzkwL2Npby9kZXZpY2Vfb3BzLmMKQEAgLTE2LDEyICsxNiwxNCBAQAogCiAjaW5jbHVkZSA8YXNtL2Njd2Rldi5oPgogI2luY2x1ZGUgPGFzbS9pZGFscy5oPgorI2luY2x1ZGUgPGFzbS9jaHBpZC5oPgogCiAjaW5jbHVkZSAiY2lvLmgiCiAjaW5jbHVkZSAiY2lvX2RlYnVnLmgiCiAjaW5jbHVkZSAiY3NzLmgiCiAjaW5jbHVkZSAiY2hzYy5oIgogI2luY2x1ZGUgImRldmljZS5oIgorI2luY2x1ZGUgImNocC5oIgogCiBpbnQgY2N3X2RldmljZV9zZXRfb3B0aW9uc19tYXNrKHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2LCB1bnNpZ25lZCBsb25nIGZsYWdzKQogewpAQCAtNjA2LDkgKzYwOCwxMiBAQAogY2N3X2RldmljZV9nZXRfY2hwX2Rlc2Moc3RydWN0IGNjd19kZXZpY2UgKmNkZXYsIGludCBjaHBfbm8pCiB7CiAJc3RydWN0IHN1YmNoYW5uZWwgKnNjaDsKKwlzdHJ1Y3QgY2hwX2lkIGNocGlkOwogCiAJc2NoID0gdG9fc3ViY2hhbm5lbChjZGV2LT5kZXYucGFyZW50KTsKLQlyZXR1cm4gY2hzY19nZXRfY2hwX2Rlc2Moc2NoLCBjaHBfbm8pOworCWNocF9pZF9pbml0KCZjaHBpZCk7CisJY2hwaWQuaWQgPSBzY2gtPnNjaGliLnBtY3cuY2hwaWRbY2hwX25vXTsKKwlyZXR1cm4gY2hwX2dldF9jaHBfZGVzYyhjaHBpZCk7CiB9CiAKIC8vIEZJWE1FOiB0aGVzZSBoYXZlIHRvIGdvOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9pZHNldC5jIGIvZHJpdmVycy9zMzkwL2Npby9pZHNldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2ZWE4MjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3MzOTAvY2lvL2lkc2V0LmMKQEAgLTAsMCArMSwxMTIgQEAKKy8qCisgKiAgZHJpdmVycy9zMzkwL2Npby9pZHNldC5jCisgKgorICogICAgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDA3CisgKiAgICBBdXRob3Iocyk6IFBldGVyIE9iZXJwYXJsZWl0ZXIgPHBldGVyLm9iZXJwYXJsZWl0ZXJAZGUuaWJtLmNvbT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGFzbS9iaXRvcHMuaD4KKyNpbmNsdWRlICJpZHNldC5oIgorI2luY2x1ZGUgImNzcy5oIgorCitzdHJ1Y3QgaWRzZXQgeworCWludCBudW1fc3NpZDsKKwlpbnQgbnVtX2lkOworCXVuc2lnbmVkIGxvbmcgYml0bWFwWzBdOworfTsKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGJpdG1hcF9zaXplKGludCBudW1fc3NpZCwgaW50IG51bV9pZCkKK3sKKwlyZXR1cm4gX19CSVRPUFNfV09SRFMobnVtX3NzaWQgKiBudW1faWQpICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOworfQorCitzdGF0aWMgc3RydWN0IGlkc2V0ICppZHNldF9uZXcoaW50IG51bV9zc2lkLCBpbnQgbnVtX2lkKQoreworCXN0cnVjdCBpZHNldCAqc2V0OworCisJc2V0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGlkc2V0KSArIGJpdG1hcF9zaXplKG51bV9zc2lkLCBudW1faWQpLAorCQkgICAgICBHRlBfS0VSTkVMKTsKKwlpZiAoc2V0KSB7CisJCXNldC0+bnVtX3NzaWQgPSBudW1fc3NpZDsKKwkJc2V0LT5udW1faWQgPSBudW1faWQ7CisJfQorCXJldHVybiBzZXQ7Cit9CisKK3ZvaWQgaWRzZXRfZnJlZShzdHJ1Y3QgaWRzZXQgKnNldCkKK3sKKwlrZnJlZShzZXQpOworfQorCit2b2lkIGlkc2V0X2NsZWFyKHN0cnVjdCBpZHNldCAqc2V0KQoreworCW1lbXNldChzZXQtPmJpdG1hcCwgMCwgYml0bWFwX3NpemUoc2V0LT5udW1fc3NpZCwgc2V0LT5udW1faWQpKTsKK30KKwordm9pZCBpZHNldF9maWxsKHN0cnVjdCBpZHNldCAqc2V0KQoreworCW1lbXNldChzZXQtPmJpdG1hcCwgMHhmZiwgYml0bWFwX3NpemUoc2V0LT5udW1fc3NpZCwgc2V0LT5udW1faWQpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGlkc2V0X2FkZChzdHJ1Y3QgaWRzZXQgKnNldCwgaW50IHNzaWQsIGludCBpZCkKK3sKKwlzZXRfYml0KHNzaWQgKiBzZXQtPm51bV9pZCArIGlkLCBzZXQtPmJpdG1hcCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpZHNldF9kZWwoc3RydWN0IGlkc2V0ICpzZXQsIGludCBzc2lkLCBpbnQgaWQpCit7CisJY2xlYXJfYml0KHNzaWQgKiBzZXQtPm51bV9pZCArIGlkLCBzZXQtPmJpdG1hcCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlkc2V0X2NvbnRhaW5zKHN0cnVjdCBpZHNldCAqc2V0LCBpbnQgc3NpZCwgaW50IGlkKQoreworCXJldHVybiB0ZXN0X2JpdChzc2lkICogc2V0LT5udW1faWQgKyBpZCwgc2V0LT5iaXRtYXApOworfQorCitzdGF0aWMgaW5saW5lIGludCBpZHNldF9nZXRfZmlyc3Qoc3RydWN0IGlkc2V0ICpzZXQsIGludCAqc3NpZCwgaW50ICppZCkKK3sKKwlpbnQgYml0bnVtOworCisJYml0bnVtID0gZmluZF9maXJzdF9iaXQoc2V0LT5iaXRtYXAsIHNldC0+bnVtX3NzaWQgKiBzZXQtPm51bV9pZCk7CisJaWYgKGJpdG51bSA+PSBzZXQtPm51bV9zc2lkICogc2V0LT5udW1faWQpCisJCXJldHVybiAwOworCSpzc2lkID0gYml0bnVtIC8gc2V0LT5udW1faWQ7CisJKmlkID0gYml0bnVtICUgc2V0LT5udW1faWQ7CisJcmV0dXJuIDE7Cit9CisKK3N0cnVjdCBpZHNldCAqaWRzZXRfc2NoX25ldyh2b2lkKQoreworCXJldHVybiBpZHNldF9uZXcoX19NQVhfU1NJRCArIDEsIF9fTUFYX1NVQkNIQU5ORUwgKyAxKTsKK30KKwordm9pZCBpZHNldF9zY2hfYWRkKHN0cnVjdCBpZHNldCAqc2V0LCBzdHJ1Y3Qgc3ViY2hhbm5lbF9pZCBzY2hpZCkKK3sKKwlpZHNldF9hZGQoc2V0LCBzY2hpZC5zc2lkLCBzY2hpZC5zY2hfbm8pOworfQorCit2b2lkIGlkc2V0X3NjaF9kZWwoc3RydWN0IGlkc2V0ICpzZXQsIHN0cnVjdCBzdWJjaGFubmVsX2lkIHNjaGlkKQoreworCWlkc2V0X2RlbChzZXQsIHNjaGlkLnNzaWQsIHNjaGlkLnNjaF9ubyk7Cit9CisKK2ludCBpZHNldF9zY2hfY29udGFpbnMoc3RydWN0IGlkc2V0ICpzZXQsIHN0cnVjdCBzdWJjaGFubmVsX2lkIHNjaGlkKQoreworCXJldHVybiBpZHNldF9jb250YWlucyhzZXQsIHNjaGlkLnNzaWQsIHNjaGlkLnNjaF9ubyk7Cit9CisKK2ludCBpZHNldF9zY2hfZ2V0X2ZpcnN0KHN0cnVjdCBpZHNldCAqc2V0LCBzdHJ1Y3Qgc3ViY2hhbm5lbF9pZCAqc2NoaWQpCit7CisJaW50IHNzaWQgPSAwOworCWludCBpZCA9IDA7CisJaW50IHJjOworCisJcmMgPSBpZHNldF9nZXRfZmlyc3Qoc2V0LCAmc3NpZCwgJmlkKTsKKwlpZiAocmMpIHsKKwkJaW5pdF9zdWJjaGFubmVsX2lkKHNjaGlkKTsKKwkJc2NoaWQtPnNzaWQgPSBzc2lkOworCQlzY2hpZC0+c2NoX25vID0gaWQ7CisJfQorCXJldHVybiByYzsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vaWRzZXQuaCBiL2RyaXZlcnMvczM5MC9jaW8vaWRzZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDQ0NjZhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zMzkwL2Npby9pZHNldC5oCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiAgZHJpdmVycy9zMzkwL2Npby9pZHNldC5oCisgKgorICogICAgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDA3CisgKiAgICBBdXRob3Iocyk6IFBldGVyIE9iZXJwYXJsZWl0ZXIgPHBldGVyLm9iZXJwYXJsZWl0ZXJAZGUuaWJtLmNvbT4KKyAqLworCisjaWZuZGVmIFMzOTBfSURTRVRfSAorI2RlZmluZSBTMzkwX0lEU0VUX0ggUzM5MF9JRFNFVF9ICisKKyNpbmNsdWRlICJzY2hpZC5oIgorCitzdHJ1Y3QgaWRzZXQ7CisKK3ZvaWQgaWRzZXRfZnJlZShzdHJ1Y3QgaWRzZXQgKnNldCk7Cit2b2lkIGlkc2V0X2NsZWFyKHN0cnVjdCBpZHNldCAqc2V0KTsKK3ZvaWQgaWRzZXRfZmlsbChzdHJ1Y3QgaWRzZXQgKnNldCk7CisKK3N0cnVjdCBpZHNldCAqaWRzZXRfc2NoX25ldyh2b2lkKTsKK3ZvaWQgaWRzZXRfc2NoX2FkZChzdHJ1Y3QgaWRzZXQgKnNldCwgc3RydWN0IHN1YmNoYW5uZWxfaWQgaWQpOwordm9pZCBpZHNldF9zY2hfZGVsKHN0cnVjdCBpZHNldCAqc2V0LCBzdHJ1Y3Qgc3ViY2hhbm5lbF9pZCBpZCk7CitpbnQgaWRzZXRfc2NoX2NvbnRhaW5zKHN0cnVjdCBpZHNldCAqc2V0LCBzdHJ1Y3Qgc3ViY2hhbm5lbF9pZCBpZCk7CitpbnQgaWRzZXRfc2NoX2dldF9maXJzdChzdHJ1Y3QgaWRzZXQgKnNldCwgc3RydWN0IHN1YmNoYW5uZWxfaWQgKmlkKTsKKworI2VuZGlmIC8qIFMzOTBfSURTRVRfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9pb2FzbS5oIGIvZHJpdmVycy9zMzkwL2Npby9pb2FzbS5oCmluZGV4IGFkNmQ4MjkuLjcxNTNkZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vaW9hc20uaAorKysgYi9kcml2ZXJzL3MzOTAvY2lvL2lvYXNtLmgKQEAgLTEsNiArMSw3IEBACiAjaWZuZGVmIFMzOTBfQ0lPX0lPQVNNX0gKICNkZWZpbmUgUzM5MF9DSU9fSU9BU01fSAogCisjaW5jbHVkZSA8YXNtL2NocGlkLmg+CiAjaW5jbHVkZSAic2NoaWQuaCIKIAogLyoKQEAgLTE4OSw5ICsxOTAsOSBAQAogCXJldHVybiBjYzsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgcmNocChpbnQgY2hwaWQpCitzdGF0aWMgaW5saW5lIGludCByY2hwKHN0cnVjdCBjaHBfaWQgY2hwaWQpCiB7Ci0JcmVnaXN0ZXIgdW5zaWduZWQgaW50IHJlZzEgYXNtICgiMSIpID0gY2hwaWQ7CisJcmVnaXN0ZXIgc3RydWN0IGNocF9pZCByZWcxIGFzbSAoIjEiKSA9IGNocGlkOwogCWludCBjY29kZTsKIAogCWFzbSB2b2xhdGlsZSgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vcWRpby5jIGIvZHJpdmVycy9zMzkwL2Npby9xZGlvLmMKaW5kZXggMDVmYWMwNy4uY2JhNjRlNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9xZGlvLmMKKysrIGIvZHJpdmVycy9zMzkwL2Npby9xZGlvLmMKQEAgLTY5LDcgKzY5LDYgQEAKIAogc3RhdGljIGludCBxZGlvX3BlcmZvcm1hbmNlX3N0YXRzID0gMDsKIHN0YXRpYyBpbnQgcHJvY19wZXJmX2ZpbGVfcmVnaXN0cmF0aW9uOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgaV9wX2MsIGlfcF9uYywgb19wX2MsIG9fcF9uYywgaWlfcF9jLCBpaV9wX25jOwogc3RhdGljIHN0cnVjdCBxZGlvX3BlcmZfc3RhdHMgcGVyZl9zdGF0czsKIAogc3RhdGljIGludCBoeWRyYV90aGluaW50czsKQEAgLTExMSw2ICsxMTAsMzEgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqIFNDUlVCQkVSIEhFTFBFUiBST1VUSU5FUyAqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIENPTkZJR182NEJJVAorc3RhdGljIGlubGluZSB2b2lkIHFkaW9fcGVyZl9zdGF0X2luYyhhdG9taWM2NF90ICpjb3VudCkKK3sKKwlpZiAocWRpb19wZXJmb3JtYW5jZV9zdGF0cykKKwkJYXRvbWljNjRfaW5jKGNvdW50KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHFkaW9fcGVyZl9zdGF0X2RlYyhhdG9taWM2NF90ICpjb3VudCkKK3sKKwlpZiAocWRpb19wZXJmb3JtYW5jZV9zdGF0cykKKwkJYXRvbWljNjRfZGVjKGNvdW50KTsKK30KKyNlbHNlIC8qIENPTkZJR182NEJJVCAqLworc3RhdGljIGlubGluZSB2b2lkIHFkaW9fcGVyZl9zdGF0X2luYyhhdG9taWNfdCAqY291bnQpCit7CisJaWYgKHFkaW9fcGVyZm9ybWFuY2Vfc3RhdHMpCisJCWF0b21pY19pbmMoY291bnQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcWRpb19wZXJmX3N0YXRfZGVjKGF0b21pY190ICpjb3VudCkKK3sKKwlpZiAocWRpb19wZXJmb3JtYW5jZV9zdGF0cykKKwkJYXRvbWljX2RlYyhjb3VudCk7Cit9CisjZW5kaWYgLyogQ09ORklHXzY0QklUICovCiAKIHN0YXRpYyBpbmxpbmUgX191NjQgCiBxZGlvX2dldF9taWNyb3Modm9pZCkKQEAgLTI3Nyw4ICszMDEsNyBAQAogCVFESU9fREJGX1RFWFQ0KDAsdHJhY2UsInNpZ2FzeW5jIik7CiAJUURJT19EQkZfSEVYNCgwLHRyYWNlLCZxLHNpemVvZih2b2lkKikpOwogCi0JaWYgKHFkaW9fcGVyZm9ybWFuY2Vfc3RhdHMpCi0JCXBlcmZfc3RhdHMuc2lnYV9zeW5jcysrOworCXFkaW9fcGVyZl9zdGF0X2luYygmcGVyZl9zdGF0cy5zaWdhX3N5bmNzKTsKIAogCWNjID0gZG9fc2lnYV9zeW5jKHEtPnNjaGlkLCBncHIyLCBncHIzKTsKIAlpZiAoY2MpCkBAIC0zMjMsOCArMzQ2LDcgQEAKIAlfX3UzMiBidXN5X2JpdDsKIAlfX3U2NCBzdGFydF90aW1lPTA7CiAKLQlpZiAocWRpb19wZXJmb3JtYW5jZV9zdGF0cykKLQkJcGVyZl9zdGF0cy5zaWdhX291dHMrKzsKKwlxZGlvX3BlcmZfc3RhdF9pbmMoJnBlcmZfc3RhdHMuc2lnYV9vdXRzKTsKIAogCVFESU9fREJGX1RFWFQ0KDAsdHJhY2UsInNpZ2FvdXQiKTsKIAlRRElPX0RCRl9IRVg0KDAsdHJhY2UsJnEsc2l6ZW9mKHZvaWQqKSk7CkBAIC0zNTgsOCArMzgwLDcgQEAKIAlRRElPX0RCRl9URVhUNCgwLHRyYWNlLCJzaWdhaW4iKTsKIAlRRElPX0RCRl9IRVg0KDAsdHJhY2UsJnEsc2l6ZW9mKHZvaWQqKSk7CiAKLQlpZiAocWRpb19wZXJmb3JtYW5jZV9zdGF0cykKLQkJcGVyZl9zdGF0cy5zaWdhX2lucysrOworCXFkaW9fcGVyZl9zdGF0X2luYygmcGVyZl9zdGF0cy5zaWdhX2lucyk7CiAKIAljYyA9IGRvX3NpZ2FfaW5wdXQocS0+c2NoaWQsIHEtPm1hc2spOwogCQpAQCAtOTUzLDggKzk3NCw3IEBACiAKIAlpZiAodW5saWtlbHkocWRpb19yZXNlcnZlX3EocSkpKSB7CiAJCXFkaW9fcmVsZWFzZV9xKHEpOwotCQlpZiAocWRpb19wZXJmb3JtYW5jZV9zdGF0cykKLQkJCW9fcF9jKys7CisJCXFkaW9fcGVyZl9zdGF0X2luYygmcGVyZl9zdGF0cy5vdXRib3VuZF90bF9ydW5zX3Jlc2NoZWQpOwogCQkvKiBhcyB3ZSdyZSBzaXNzaWVzLCB3ZSdsbCBjaGVjayBuZXh0IHRpbWUgKi8KIAkJaWYgKGxpa2VseSghYXRvbWljX3JlYWQoJnEtPmlzX2luX3NodXRkb3duKSkpIHsKIAkJCXFkaW9fbWFya19xKHEpOwpAQCAtOTYyLDEwICs5ODIsOCBAQAogCQl9CiAJCXJldHVybjsKIAl9Ci0JaWYgKHFkaW9fcGVyZm9ybWFuY2Vfc3RhdHMpIHsKLQkJb19wX25jKys7Ci0JCXBlcmZfc3RhdHMudGxfcnVucysrOwotCX0KKwlxZGlvX3BlcmZfc3RhdF9pbmMoJnBlcmZfc3RhdHMub3V0Ym91bmRfdGxfcnVucyk7CisJcWRpb19wZXJmX3N0YXRfaW5jKCZwZXJmX3N0YXRzLnRsX3J1bnMpOwogCiAJLyogc2VlIGNvbW1lbnQgaW4gcWRpb19raWNrX291dGJvdW5kX3EgKi8KIAlzaWdhX2F0dGVtcHRzPWF0b21pY19yZWFkKCZxLT5idXN5X3NpZ2FfY291bnRlcik7CkBAIC0xMTM5LDE3ICsxMTU3LDYgQEAKIHsKIAlpbnQgaTsKIAotCXN0YXRpYyBpbnQgb2xkX3BjaXM9MDsKLQlzdGF0aWMgaW50IG9sZF90aGluaW50cz0wOwotCi0JaWYgKHFkaW9fcGVyZm9ybWFuY2Vfc3RhdHMpIHsKLQkJaWYgKChvbGRfcGNpcz09cGVyZl9zdGF0cy5wY2lzKSYmCi0JCSAgICAob2xkX3RoaW5pbnRzPT1wZXJmX3N0YXRzLnRoaW5pbnRzKSkKLQkJCXBlcmZfc3RhdHMuc3RhcnRfdGltZV9pbmJvdW5kPU5PVzsKLQkJZWxzZQotCQkJb2xkX3BjaXM9cGVyZl9zdGF0cy5wY2lzOwotCX0KLQogCWk9cWRpb19nZXRfaW5ib3VuZF9idWZmZXJfZnJvbnRpZXIocSk7CiAJaWYgKCAoaSE9R0VUX1NBVkVEX0ZST05USUVSKHEpKSB8fAogCSAgICAgKHEtPmVycm9yX3N0YXR1c19mbGFncyZRRElPX1NUQVRVU19MT09LX0ZPUl9FUlJPUikgKSB7CkBAIC0xMzM3LDEwICsxMzQ0LDcgQEAKIAlxLT5zaWdhX2Vycm9yPTA7CiAJcS0+ZXJyb3Jfc3RhdHVzX2ZsYWdzPTA7CiAKLQlpZiAocWRpb19wZXJmb3JtYW5jZV9zdGF0cykgewotCQlwZXJmX3N0YXRzLmluYm91bmRfdGltZSs9Tk9XLXBlcmZfc3RhdHMuc3RhcnRfdGltZV9pbmJvdW5kOwotCQlwZXJmX3N0YXRzLmluYm91bmRfY250Kys7Ci0JfQorCXFkaW9fcGVyZl9zdGF0X2luYygmcGVyZl9zdGF0cy5pbmJvdW5kX2NudCk7CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC0xMzYwLDggKzEzNjQsNyBAQAogCSAqLwogCWlmICh1bmxpa2VseShxZGlvX3Jlc2VydmVfcShxKSkpIHsKIAkJcWRpb19yZWxlYXNlX3EocSk7Ci0JCWlmIChxZGlvX3BlcmZvcm1hbmNlX3N0YXRzKQotCQkJaWlfcF9jKys7CisJCXFkaW9fcGVyZl9zdGF0X2luYygmcGVyZl9zdGF0cy5pbmJvdW5kX3RoaW5fdGxfcnVuc19yZXNjaGVkKTsKIAkJLyogCiAJCSAqIGFzIHdlIG1pZ2h0IGp1c3QgYmUgYWJvdXQgdG8gc3RvcCBwb2xsaW5nLCB3ZSBtYWtlCiAJCSAqIHN1cmUgdGhhdCB3ZSBjaGVjayBhZ2FpbiBhdCBsZWFzdCBvbmNlIG1vcmUgCkBAIC0xMzY5LDggKzEzNzIsNyBAQAogCQl0aXFkaW9fc2NoZWRfdGwoKTsKIAkJcmV0dXJuOwogCX0KLQlpZiAocWRpb19wZXJmb3JtYW5jZV9zdGF0cykKLQkJaWlfcF9uYysrOworCXFkaW9fcGVyZl9zdGF0X2luYygmcGVyZl9zdGF0cy5pbmJvdW5kX3RoaW5fdGxfcnVucyk7CiAJaWYgKHVubGlrZWx5KGF0b21pY19yZWFkKCZxLT5pc19pbl9zaHV0ZG93bikpKSB7CiAJCXFkaW9fdW5tYXJrX3EocSk7CiAJCWdvdG8gb3V0OwpAQCAtMTQxMiw4ICsxNDE0LDcgQEAKIAkJZm9yIChpPTA7aTxpcnFfcHRyLT5ub19vdXRwdXRfcXM7aSsrKSB7CiAJCQlvcSA9IGlycV9wdHItPm91dHB1dF9xc1tpXTsKIAkJCWlmICghcWRpb19pc19vdXRib3VuZF9xX2RvbmUob3EpKSB7Ci0JCQkJaWYgKHFkaW9fcGVyZm9ybWFuY2Vfc3RhdHMpCi0JCQkJCXBlcmZfc3RhdHMudGxfcnVucy0tOworCQkJCXFkaW9fcGVyZl9zdGF0X2RlYygmcGVyZl9zdGF0cy50bF9ydW5zKTsKIAkJCQlfX3FkaW9fb3V0Ym91bmRfcHJvY2Vzc2luZyhvcSk7CiAJCQl9CiAJCX0KQEAgLTE0NTIsOCArMTQ1Myw3IEBACiAKIAlpZiAodW5saWtlbHkocWRpb19yZXNlcnZlX3EocSkpKSB7CiAJCXFkaW9fcmVsZWFzZV9xKHEpOwotCQlpZiAocWRpb19wZXJmb3JtYW5jZV9zdGF0cykKLQkJCWlfcF9jKys7CisJCXFkaW9fcGVyZl9zdGF0X2luYygmcGVyZl9zdGF0cy5pbmJvdW5kX3RsX3J1bnNfcmVzY2hlZCk7CiAJCS8qIGFzIHdlJ3JlIHNpc3NpZXMsIHdlJ2xsIGNoZWNrIG5leHQgdGltZSAqLwogCQlpZiAobGlrZWx5KCFhdG9taWNfcmVhZCgmcS0+aXNfaW5fc2h1dGRvd24pKSkgewogCQkJcWRpb19tYXJrX3EocSk7CkBAIC0xNDYxLDEwICsxNDYxLDggQEAKIAkJfQogCQlyZXR1cm47CiAJfQotCWlmIChxZGlvX3BlcmZvcm1hbmNlX3N0YXRzKSB7Ci0JCWlfcF9uYysrOwotCQlwZXJmX3N0YXRzLnRsX3J1bnMrKzsKLQl9CisJcWRpb19wZXJmX3N0YXRfaW5jKCZwZXJmX3N0YXRzLmluYm91bmRfdGxfcnVucyk7CisJcWRpb19wZXJmX3N0YXRfaW5jKCZwZXJmX3N0YXRzLnRsX3J1bnMpOwogCiBhZ2FpbjoKIAlpZiAocWRpb19oYXNfaW5ib3VuZF9xX21vdmVkKHEpKSB7CkBAIC0xNTEwLDggKzE1MDgsNyBAQAogCiAJaWYgKHVubGlrZWx5KHFkaW9fcmVzZXJ2ZV9xKHEpKSkgewogCQlxZGlvX3JlbGVhc2VfcShxKTsKLQkJaWYgKHFkaW9fcGVyZm9ybWFuY2Vfc3RhdHMpCi0JCQlpaV9wX2MrKzsKKwkJcWRpb19wZXJmX3N0YXRfaW5jKCZwZXJmX3N0YXRzLmluYm91bmRfdGhpbl90bF9ydW5zX3Jlc2NoZWQpOwogCQkvKiAKIAkJICogYXMgd2UgbWlnaHQganVzdCBiZSBhYm91dCB0byBzdG9wIHBvbGxpbmcsIHdlIG1ha2UKIAkJICogc3VyZSB0aGF0IHdlIGNoZWNrIGFnYWluIGF0IGxlYXN0IG9uY2UgbW9yZSAKQEAgLTE2MDIsOCArMTU5OSw3IEBACiB7CiAJUURJT19EQkZfVEVYVDQoMCx0cmFjZSwiaXFkaW9fdGwiKTsKIAotCWlmIChxZGlvX3BlcmZvcm1hbmNlX3N0YXRzKQotCQlwZXJmX3N0YXRzLnRsX3J1bnMrKzsKKwlxZGlvX3BlcmZfc3RhdF9pbmMoJnBlcmZfc3RhdHMudGxfcnVucyk7CiAKIAl0aXFkaW9faW5ib3VuZF9jaGVja3MoKTsKIH0KQEAgLTE5MTQsMTAgKzE5MTAsNyBAQAogewogCVFESU9fREJGX1RFWFQ0KDAsdHJhY2UsInRoaW5faW50Iik7CiAKLQlpZiAocWRpb19wZXJmb3JtYW5jZV9zdGF0cykgewotCQlwZXJmX3N0YXRzLnRoaW5pbnRzKys7Ci0JCXBlcmZfc3RhdHMuc3RhcnRfdGltZV9pbmJvdW5kPU5PVzsKLQl9CisJcWRpb19wZXJmX3N0YXRfaW5jKCZwZXJmX3N0YXRzLnRoaW5pbnRzKTsKIAogCS8qIFNWUyBvbmx5IHdoZW4gbmVlZGVkOgogCSAqIGlzc3VlIFNWUyB0byBiZW5lZml0IGZyb20gaXFkaW8gaW50ZXJydXB0IGF2b2lkYW5jZQpAQCAtMTk3MiwxNyArMTk2NSwxMiBAQAogCWludCBpOwogCXN0cnVjdCBxZGlvX3EgKnE7CiAKLQlpZiAocWRpb19wZXJmb3JtYW5jZV9zdGF0cykgewotCQlwZXJmX3N0YXRzLnBjaXMrKzsKLQkJcGVyZl9zdGF0cy5zdGFydF90aW1lX2luYm91bmQ9Tk9XOwotCX0KKwlxZGlvX3BlcmZfc3RhdF9pbmMoJnBlcmZfc3RhdHMucGNpcyk7CiAJZm9yIChpPTA7aTxpcnFfcHRyLT5ub19pbnB1dF9xcztpKyspIHsKIAkJcT1pcnFfcHRyLT5pbnB1dF9xc1tpXTsKIAkJaWYgKHEtPmlzX2lucHV0X3EmUURJT19GTEFHX05PX0lOUFVUX0lOVEVSUlVQVF9DT05URVhUKQogCQkJcWRpb19tYXJrX3EocSk7CiAJCWVsc2UgewotCQkJaWYgKHFkaW9fcGVyZm9ybWFuY2Vfc3RhdHMpCi0JCQkJcGVyZl9zdGF0cy50bF9ydW5zLS07CiAJCQlfX3FkaW9faW5ib3VuZF9wcm9jZXNzaW5nKHEpOwogCQl9CiAJfQpAQCAtMTk5Miw4ICsxOTgwLDcgQEAKIAkJcT1pcnFfcHRyLT5vdXRwdXRfcXNbaV07CiAJCWlmIChxZGlvX2lzX291dGJvdW5kX3FfZG9uZShxKSkKIAkJCWNvbnRpbnVlOwotCQlpZiAocWRpb19wZXJmb3JtYW5jZV9zdGF0cykKLQkJCXBlcmZfc3RhdHMudGxfcnVucy0tOworCQlxZGlvX3BlcmZfc3RhdF9kZWMoJnBlcmZfc3RhdHMudGxfcnVucyk7CiAJCWlmICghaXJxX3B0ci0+c3luY19kb25lX29uX291dGJfcGNpcykKIAkJCVNZTkNfTUVNT1JZOwogCQlfX3FkaW9fb3V0Ym91bmRfcHJvY2Vzc2luZyhxKTsKQEAgLTM0NjMsMTggKzM0NTAsMTIgQEAKIAlzdHJ1Y3QgcWRpb19pcnEgKmlycSA9IChzdHJ1Y3QgcWRpb19pcnEgKikgcS0+aXJxX3B0cjsKIAogCS8qIFRoaXMgaXMgdGhlIG91dGJvdW5kIGhhbmRsaW5nIG9mIHF1ZXVlcyAqLwotCWlmIChxZGlvX3BlcmZvcm1hbmNlX3N0YXRzKQotCQlwZXJmX3N0YXRzLnN0YXJ0X3RpbWVfb3V0Ym91bmQ9Tk9XOwotCiAJcWRpb19kb19xZGlvX2ZpbGxfb3V0cHV0KHEscWlkeCxjb3VudCxidWZmZXJzKTsKIAogCXVzZWRfZWxlbWVudHM9YXRvbWljX2FkZF9yZXR1cm4oY291bnQsICZxLT5udW1iZXJfb2ZfYnVmZmVyc191c2VkKSAtIGNvdW50OwogCiAJaWYgKGNhbGxmbGFncyZRRElPX0ZMQUdfRE9OVF9TSUdBKSB7Ci0JCWlmIChxZGlvX3BlcmZvcm1hbmNlX3N0YXRzKSB7Ci0JCQlwZXJmX3N0YXRzLm91dGJvdW5kX3RpbWUrPU5PVy1wZXJmX3N0YXRzLnN0YXJ0X3RpbWVfb3V0Ym91bmQ7Ci0JCQlwZXJmX3N0YXRzLm91dGJvdW5kX2NudCsrOwotCQl9CisJCXFkaW9fcGVyZl9zdGF0X2luYygmcGVyZl9zdGF0cy5vdXRib3VuZF9jbnQpOwogCQlyZXR1cm47CiAJfQogCWlmIChxLT5pc19pcWRpb19xKSB7CkBAIC0zNTA0LDggKzM0ODUsNyBAQAogCQkJCXFkaW9fa2lja19vdXRib3VuZF9xKHEpOwogCQkJfSBlbHNlIHsKIAkJCQlRRElPX0RCRl9URVhUMygwLHRyYWNlLCAiZmFzdC1yZXEiKTsKLQkJCQlpZiAocWRpb19wZXJmb3JtYW5jZV9zdGF0cykKLQkJCQkJcGVyZl9zdGF0cy5mYXN0X3JlcXMrKzsKKwkJCQlxZGlvX3BlcmZfc3RhdF9pbmMoJnBlcmZfc3RhdHMuZmFzdF9yZXFzKTsKIAkJCX0KIAkJfQogCQkvKiAKQEAgLTM1MTYsMTAgKzM0OTYsNyBAQAogCQlfX3FkaW9fb3V0Ym91bmRfcHJvY2Vzc2luZyhxKTsKIAl9CiAKLQlpZiAocWRpb19wZXJmb3JtYW5jZV9zdGF0cykgewotCQlwZXJmX3N0YXRzLm91dGJvdW5kX3RpbWUrPU5PVy1wZXJmX3N0YXRzLnN0YXJ0X3RpbWVfb3V0Ym91bmQ7Ci0JCXBlcmZfc3RhdHMub3V0Ym91bmRfY250Kys7Ci0JfQorCXFkaW9fcGVyZl9zdGF0X2luYygmcGVyZl9zdGF0cy5vdXRib3VuZF9jbnQpOwogfQogCiAvKiBjb3VudCBtdXN0IGJlIDEgaW4gaXFkaW8gKi8KQEAgLTM1ODksMzMgKzM1NjYsNjcgQEAKIAkJcmV0dXJuIDA7CiAKICNkZWZpbmUgX09VVFBfSVQoeC4uLikgYys9c3ByaW50ZihidWZmZXIrYyx4KQotCV9PVVRQX0lUKCJpX3BfbmMvYz0lbHUvJWx1XG4iLGlfcF9uYyxpX3BfYyk7Ci0JX09VVFBfSVQoImlpX3BfbmMvYz0lbHUvJWx1XG4iLGlpX3BfbmMsaWlfcF9jKTsKLQlfT1VUUF9JVCgib19wX25jL2M9JWx1LyVsdVxuIixvX3BfbmMsb19wX2MpOwotCV9PVVRQX0lUKCJOdW1iZXIgb2YgdGFza2xldCBydW5zICh0b3RhbCkgICAgICAgICAgICAgICAgICA6ICVsdVxuIiwKLQkJIHBlcmZfc3RhdHMudGxfcnVucyk7CisjaWZkZWYgQ09ORklHXzY0QklUCisJX09VVFBfSVQoIk51bWJlciBvZiB0YXNrbGV0IHJ1bnMgKHRvdGFsKSAgICAgICAgICAgICAgICAgIDogJWxpXG4iLAorCQkgKGxvbmcpYXRvbWljNjRfcmVhZCgmcGVyZl9zdGF0cy50bF9ydW5zKSk7CisJX09VVFBfSVQoIkluYm91bmQgdGFza2xldCBydW5zICAgICAgdHJpZWQvcmV0cmllZCAgICAgICAgIDogJWxpLyVsaVxuIiwKKwkJIChsb25nKWF0b21pYzY0X3JlYWQoJnBlcmZfc3RhdHMuaW5ib3VuZF90bF9ydW5zKSwKKwkJIChsb25nKWF0b21pYzY0X3JlYWQoJnBlcmZfc3RhdHMuaW5ib3VuZF90bF9ydW5zX3Jlc2NoZWQpKTsKKwlfT1VUUF9JVCgiSW5ib3VuZC10aGluIHRhc2tsZXQgcnVucyB0cmllZC9yZXRyaWVkICAgICAgICAgOiAlbGkvJWxpXG4iLAorCQkgKGxvbmcpYXRvbWljNjRfcmVhZCgmcGVyZl9zdGF0cy5pbmJvdW5kX3RoaW5fdGxfcnVucyksCisJCSAobG9uZylhdG9taWM2NF9yZWFkKCZwZXJmX3N0YXRzLmluYm91bmRfdGhpbl90bF9ydW5zX3Jlc2NoZWQpKTsKKwlfT1VUUF9JVCgiT3V0Ym91bmQgdGFza2xldCBydW5zICAgICB0cmllZC9yZXRyaWVkICAgICAgICAgOiAlbGkvJWxpXG4iLAorCQkgKGxvbmcpYXRvbWljNjRfcmVhZCgmcGVyZl9zdGF0cy5vdXRib3VuZF90bF9ydW5zKSwKKwkJIChsb25nKWF0b21pYzY0X3JlYWQoJnBlcmZfc3RhdHMub3V0Ym91bmRfdGxfcnVuc19yZXNjaGVkKSk7CiAJX09VVFBfSVQoIlxuIik7Ci0JX09VVFBfSVQoIk51bWJlciBvZiBTSUdBIHN5bmMncyBpc3N1ZWQgICAgICAgICAgICAgICAgICAgIDogJWx1XG4iLAotCQkgcGVyZl9zdGF0cy5zaWdhX3N5bmNzKTsKLQlfT1VUUF9JVCgiTnVtYmVyIG9mIFNJR0EgaW4ncyBpc3N1ZWQgICAgICAgICAgICAgICAgICAgICAgOiAlbHVcbiIsCi0JCSBwZXJmX3N0YXRzLnNpZ2FfaW5zKTsKLQlfT1VUUF9JVCgiTnVtYmVyIG9mIFNJR0Egb3V0J3MgaXNzdWVkICAgICAgICAgICAgICAgICAgICAgOiAlbHVcbiIsCi0JCSBwZXJmX3N0YXRzLnNpZ2Ffb3V0cyk7Ci0JX09VVFBfSVQoIk51bWJlciBvZiBQQ0lzIGNhdWdodCAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJWx1XG4iLAotCQkgcGVyZl9zdGF0cy5wY2lzKTsKLQlfT1VUUF9JVCgiTnVtYmVyIG9mIGFkYXB0ZXIgaW50ZXJydXB0cyBjYXVnaHQgICAgICAgICAgICAgOiAlbHVcbiIsCi0JCSBwZXJmX3N0YXRzLnRoaW5pbnRzKTsKLQlfT1VUUF9JVCgiTnVtYmVyIG9mIGZhc3QgcmVxdWV1ZXMgKG91dGcuIFNCQUxzIHcvbyBTSUdBKSAgOiAlbHVcbiIsCi0JCSBwZXJmX3N0YXRzLmZhc3RfcmVxcyk7CisJX09VVFBfSVQoIk51bWJlciBvZiBTSUdBIHN5bmMncyBpc3N1ZWQgICAgICAgICAgICAgICAgICAgIDogJWxpXG4iLAorCQkgKGxvbmcpYXRvbWljNjRfcmVhZCgmcGVyZl9zdGF0cy5zaWdhX3N5bmNzKSk7CisJX09VVFBfSVQoIk51bWJlciBvZiBTSUdBIGluJ3MgaXNzdWVkICAgICAgICAgICAgICAgICAgICAgIDogJWxpXG4iLAorCQkgKGxvbmcpYXRvbWljNjRfcmVhZCgmcGVyZl9zdGF0cy5zaWdhX2lucykpOworCV9PVVRQX0lUKCJOdW1iZXIgb2YgU0lHQSBvdXQncyBpc3N1ZWQgICAgICAgICAgICAgICAgICAgICA6ICVsaVxuIiwKKwkJIChsb25nKWF0b21pYzY0X3JlYWQoJnBlcmZfc3RhdHMuc2lnYV9vdXRzKSk7CisJX09VVFBfSVQoIk51bWJlciBvZiBQQ0lzIGNhdWdodCAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJWxpXG4iLAorCQkgKGxvbmcpYXRvbWljNjRfcmVhZCgmcGVyZl9zdGF0cy5wY2lzKSk7CisJX09VVFBfSVQoIk51bWJlciBvZiBhZGFwdGVyIGludGVycnVwdHMgY2F1Z2h0ICAgICAgICAgICAgIDogJWxpXG4iLAorCQkgKGxvbmcpYXRvbWljNjRfcmVhZCgmcGVyZl9zdGF0cy50aGluaW50cykpOworCV9PVVRQX0lUKCJOdW1iZXIgb2YgZmFzdCByZXF1ZXVlcyAob3V0Zy4gU0JBTHMgdy9vIFNJR0EpICA6ICVsaVxuIiwKKwkJIChsb25nKWF0b21pYzY0X3JlYWQoJnBlcmZfc3RhdHMuZmFzdF9yZXFzKSk7CiAJX09VVFBfSVQoIlxuIik7Ci0JX09VVFBfSVQoIlRvdGFsIHRpbWUgb2YgYWxsIGluYm91bmQgYWN0aW9ucyAodXMpIGluY2wuIFVMIDogJWx1XG4iLAotCQkgcGVyZl9zdGF0cy5pbmJvdW5kX3RpbWUpOwotCV9PVVRQX0lUKCJOdW1iZXIgb2YgaW5ib3VuZCB0cmFuc2ZlcnMgICAgICAgICAgICAgICAgICAgICA6ICVsdVxuIiwKLQkJIHBlcmZfc3RhdHMuaW5ib3VuZF9jbnQpOwotCV9PVVRQX0lUKCJUb3RhbCB0aW1lIG9mIGFsbCBvdXRib3VuZCBkb19RRElPcyAodXMpICAgICAgICA6ICVsdVxuIiwKLQkJIHBlcmZfc3RhdHMub3V0Ym91bmRfdGltZSk7Ci0JX09VVFBfSVQoIk51bWJlciBvZiBkb19RRElPcyBvdXRib3VuZCAgICAgICAgICAgICAgICAgICAgIDogJWx1XG4iLAotCQkgcGVyZl9zdGF0cy5vdXRib3VuZF9jbnQpOworCV9PVVRQX0lUKCJOdW1iZXIgb2YgaW5ib3VuZCB0cmFuc2ZlcnMgICAgICAgICAgICAgICAgICAgICA6ICVsaVxuIiwKKwkJIChsb25nKWF0b21pYzY0X3JlYWQoJnBlcmZfc3RhdHMuaW5ib3VuZF9jbnQpKTsKKwlfT1VUUF9JVCgiTnVtYmVyIG9mIGRvX1FESU9zIG91dGJvdW5kICAgICAgICAgICAgICAgICAgICAgOiAlbGlcbiIsCisJCSAobG9uZylhdG9taWM2NF9yZWFkKCZwZXJmX3N0YXRzLm91dGJvdW5kX2NudCkpOworI2Vsc2UgLyogQ09ORklHXzY0QklUICovCisJX09VVFBfSVQoIk51bWJlciBvZiB0YXNrbGV0IHJ1bnMgKHRvdGFsKSAgICAgICAgICAgICAgICAgIDogJWlcbiIsCisJCSBhdG9taWNfcmVhZCgmcGVyZl9zdGF0cy50bF9ydW5zKSk7CisJX09VVFBfSVQoIkluYm91bmQgdGFza2xldCBydW5zICAgICAgdHJpZWQvcmV0cmllZCAgICAgICAgIDogJWkvJWlcbiIsCisJCSBhdG9taWNfcmVhZCgmcGVyZl9zdGF0cy5pbmJvdW5kX3RsX3J1bnMpLAorCQkgYXRvbWljX3JlYWQoJnBlcmZfc3RhdHMuaW5ib3VuZF90bF9ydW5zX3Jlc2NoZWQpKTsKKwlfT1VUUF9JVCgiSW5ib3VuZC10aGluIHRhc2tsZXQgcnVucyB0cmllZC9yZXRyaWVkICAgICAgICAgOiAlaS8laVxuIiwKKwkJIGF0b21pY19yZWFkKCZwZXJmX3N0YXRzLmluYm91bmRfdGhpbl90bF9ydW5zKSwKKwkJIGF0b21pY19yZWFkKCZwZXJmX3N0YXRzLmluYm91bmRfdGhpbl90bF9ydW5zX3Jlc2NoZWQpKTsKKwlfT1VUUF9JVCgiT3V0Ym91bmQgdGFza2xldCBydW5zICAgICB0cmllZC9yZXRyaWVkICAgICAgICAgOiAlaS8laVxuIiwKKwkJIGF0b21pY19yZWFkKCZwZXJmX3N0YXRzLm91dGJvdW5kX3RsX3J1bnMpLAorCQkgYXRvbWljX3JlYWQoJnBlcmZfc3RhdHMub3V0Ym91bmRfdGxfcnVuc19yZXNjaGVkKSk7CisJX09VVFBfSVQoIlxuIik7CisJX09VVFBfSVQoIk51bWJlciBvZiBTSUdBIHN5bmMncyBpc3N1ZWQgICAgICAgICAgICAgICAgICAgIDogJWlcbiIsCisJCSBhdG9taWNfcmVhZCgmcGVyZl9zdGF0cy5zaWdhX3N5bmNzKSk7CisJX09VVFBfSVQoIk51bWJlciBvZiBTSUdBIGluJ3MgaXNzdWVkICAgICAgICAgICAgICAgICAgICAgIDogJWlcbiIsCisJCSBhdG9taWNfcmVhZCgmcGVyZl9zdGF0cy5zaWdhX2lucykpOworCV9PVVRQX0lUKCJOdW1iZXIgb2YgU0lHQSBvdXQncyBpc3N1ZWQgICAgICAgICAgICAgICAgICAgICA6ICVpXG4iLAorCQkgYXRvbWljX3JlYWQoJnBlcmZfc3RhdHMuc2lnYV9vdXRzKSk7CisJX09VVFBfSVQoIk51bWJlciBvZiBQQ0lzIGNhdWdodCAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJWlcbiIsCisJCSBhdG9taWNfcmVhZCgmcGVyZl9zdGF0cy5wY2lzKSk7CisJX09VVFBfSVQoIk51bWJlciBvZiBhZGFwdGVyIGludGVycnVwdHMgY2F1Z2h0ICAgICAgICAgICAgIDogJWlcbiIsCisJCSBhdG9taWNfcmVhZCgmcGVyZl9zdGF0cy50aGluaW50cykpOworCV9PVVRQX0lUKCJOdW1iZXIgb2YgZmFzdCByZXF1ZXVlcyAob3V0Zy4gU0JBTHMgdy9vIFNJR0EpICA6ICVpXG4iLAorCQkgYXRvbWljX3JlYWQoJnBlcmZfc3RhdHMuZmFzdF9yZXFzKSk7CisJX09VVFBfSVQoIlxuIik7CisJX09VVFBfSVQoIk51bWJlciBvZiBpbmJvdW5kIHRyYW5zZmVycyAgICAgICAgICAgICAgICAgICAgIDogJWlcbiIsCisJCSBhdG9taWNfcmVhZCgmcGVyZl9zdGF0cy5pbmJvdW5kX2NudCkpOworCV9PVVRQX0lUKCJOdW1iZXIgb2YgZG9fUURJT3Mgb3V0Ym91bmQgICAgICAgICAgICAgICAgICAgICA6ICVpXG4iLAorCQkgYXRvbWljX3JlYWQoJnBlcmZfc3RhdHMub3V0Ym91bmRfY250KSk7CisjZW5kaWYgLyogQ09ORklHXzY0QklUICovCiAJX09VVFBfSVQoIlxuIik7CiAKICAgICAgICAgcmV0dXJuIGM7CkBAIC0zNjQyLDggKzM2NTMsNiBAQAogc3RhdGljIHZvaWQKIHFkaW9fcmVtb3ZlX3Byb2Nmc19lbnRyeSh2b2lkKQogewotCXBlcmZfc3RhdHMudGxfcnVucz0wOwotCiAgICAgICAgIGlmICghcHJvY19wZXJmX2ZpbGVfcmVnaXN0cmF0aW9uKSAvKiBtZWFucyBpZiBpdCB3ZW50IG9rIGVhcmxpZXIgKi8KIAkJcmVtb3ZlX3Byb2NfZW50cnkoUURJT19QRVJGLCZwcm9jX3Jvb3QpOwogfQpAQCAtMzY3MSwxMyArMzY4MCwzOCBAQAogCQlxZGlvX3BlcmZvcm1hbmNlX3N0YXRzID0gaTsKIAkJaWYgKGk9PTApIHsKIAkJCS8qIHJlc2V0IHBlcmYuIHN0YXQuIGluZm8gKi8KLQkJCWlfcF9uYyA9IDA7Ci0JCQlpX3BfYyA9IDA7Ci0JCQlpaV9wX25jID0gMDsKLQkJCWlpX3BfYyA9IDA7Ci0JCQlvX3BfbmMgPSAwOwotCQkJb19wX2MgPSAwOwotCQkJbWVtc2V0KCZwZXJmX3N0YXRzLCAwLCBzaXplb2Yoc3RydWN0IHFkaW9fcGVyZl9zdGF0cykpOworI2lmZGVmIENPTkZJR182NEJJVAorCQkJYXRvbWljNjRfc2V0KCZwZXJmX3N0YXRzLnRsX3J1bnMsIDApOworCQkJYXRvbWljNjRfc2V0KCZwZXJmX3N0YXRzLm91dGJvdW5kX3RsX3J1bnMsIDApOworCQkJYXRvbWljNjRfc2V0KCZwZXJmX3N0YXRzLmluYm91bmRfdGxfcnVucywgMCk7CisJCQlhdG9taWM2NF9zZXQoJnBlcmZfc3RhdHMuaW5ib3VuZF90bF9ydW5zX3Jlc2NoZWQsIDApOworCQkJYXRvbWljNjRfc2V0KCZwZXJmX3N0YXRzLmluYm91bmRfdGhpbl90bF9ydW5zLCAwKTsKKwkJCWF0b21pYzY0X3NldCgmcGVyZl9zdGF0cy5pbmJvdW5kX3RoaW5fdGxfcnVuc19yZXNjaGVkLAorCQkJCSAgICAgMCk7CisJCQlhdG9taWM2NF9zZXQoJnBlcmZfc3RhdHMuc2lnYV9vdXRzLCAwKTsKKwkJCWF0b21pYzY0X3NldCgmcGVyZl9zdGF0cy5zaWdhX2lucywgMCk7CisJCQlhdG9taWM2NF9zZXQoJnBlcmZfc3RhdHMuc2lnYV9zeW5jcywgMCk7CisJCQlhdG9taWM2NF9zZXQoJnBlcmZfc3RhdHMucGNpcywgMCk7CisJCQlhdG9taWM2NF9zZXQoJnBlcmZfc3RhdHMudGhpbmludHMsIDApOworCQkJYXRvbWljNjRfc2V0KCZwZXJmX3N0YXRzLmZhc3RfcmVxcywgMCk7CisJCQlhdG9taWM2NF9zZXQoJnBlcmZfc3RhdHMub3V0Ym91bmRfY250LCAwKTsKKwkJCWF0b21pYzY0X3NldCgmcGVyZl9zdGF0cy5pbmJvdW5kX2NudCwgMCk7CisjZWxzZSAvKiBDT05GSUdfNjRCSVQgKi8KKwkJCWF0b21pY19zZXQoJnBlcmZfc3RhdHMudGxfcnVucywgMCk7CisJCQlhdG9taWNfc2V0KCZwZXJmX3N0YXRzLm91dGJvdW5kX3RsX3J1bnMsIDApOworCQkJYXRvbWljX3NldCgmcGVyZl9zdGF0cy5pbmJvdW5kX3RsX3J1bnMsIDApOworCQkJYXRvbWljX3NldCgmcGVyZl9zdGF0cy5pbmJvdW5kX3RsX3J1bnNfcmVzY2hlZCwgMCk7CisJCQlhdG9taWNfc2V0KCZwZXJmX3N0YXRzLmluYm91bmRfdGhpbl90bF9ydW5zLCAwKTsKKwkJCWF0b21pY19zZXQoJnBlcmZfc3RhdHMuaW5ib3VuZF90aGluX3RsX3J1bnNfcmVzY2hlZCwgMCk7CisJCQlhdG9taWNfc2V0KCZwZXJmX3N0YXRzLnNpZ2Ffb3V0cywgMCk7CisJCQlhdG9taWNfc2V0KCZwZXJmX3N0YXRzLnNpZ2FfaW5zLCAwKTsKKwkJCWF0b21pY19zZXQoJnBlcmZfc3RhdHMuc2lnYV9zeW5jcywgMCk7CisJCQlhdG9taWNfc2V0KCZwZXJmX3N0YXRzLnBjaXMsIDApOworCQkJYXRvbWljX3NldCgmcGVyZl9zdGF0cy50aGluaW50cywgMCk7CisJCQlhdG9taWNfc2V0KCZwZXJmX3N0YXRzLmZhc3RfcmVxcywgMCk7CisJCQlhdG9taWNfc2V0KCZwZXJmX3N0YXRzLm91dGJvdW5kX2NudCwgMCk7CisJCQlhdG9taWNfc2V0KCZwZXJmX3N0YXRzLmluYm91bmRfY250LCAwKTsKKyNlbmRpZiAvKiBDT05GSUdfNjRCSVQgKi8KIAkJfQogCX0gZWxzZSB7CiAJCVFESU9fUFJJTlRfV0FSTigiUURJTyBwZXJmb3JtYW5jZV9zdGF0czogd3JpdGUgMCBvciAxIHRvIHRoaXMgZmlsZSFcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9xZGlvLmggYi9kcml2ZXJzL3MzOTAvY2lvL3FkaW8uaAppbmRleCBlYzlhZjcyLi4yODk1MzkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2lvL3FkaW8uaAorKysgYi9kcml2ZXJzL3MzOTAvY2lvL3FkaW8uaApAQCAtNDA2LDIxICs0MDYsNDMgQEAKICNkZWZpbmUgQ0hTQ19GTEFHX1NJR0FfU1lOQ19ET05FX09OX09VVEJfUENJUyAweDA0CiAKIHN0cnVjdCBxZGlvX3BlcmZfc3RhdHMgewotCXVuc2lnbmVkIGxvbmcgdGxfcnVuczsKKyNpZmRlZiBDT05GSUdfNjRCSVQKKwlhdG9taWM2NF90IHRsX3J1bnM7CisJYXRvbWljNjRfdCBvdXRib3VuZF90bF9ydW5zOworCWF0b21pYzY0X3Qgb3V0Ym91bmRfdGxfcnVuc19yZXNjaGVkOworCWF0b21pYzY0X3QgaW5ib3VuZF90bF9ydW5zOworCWF0b21pYzY0X3QgaW5ib3VuZF90bF9ydW5zX3Jlc2NoZWQ7CisJYXRvbWljNjRfdCBpbmJvdW5kX3RoaW5fdGxfcnVuczsKKwlhdG9taWM2NF90IGluYm91bmRfdGhpbl90bF9ydW5zX3Jlc2NoZWQ7CiAKLQl1bnNpZ25lZCBsb25nIHNpZ2Ffb3V0czsKLQl1bnNpZ25lZCBsb25nIHNpZ2FfaW5zOwotCXVuc2lnbmVkIGxvbmcgc2lnYV9zeW5jczsKLQl1bnNpZ25lZCBsb25nIHBjaXM7Ci0JdW5zaWduZWQgbG9uZyB0aGluaW50czsKLQl1bnNpZ25lZCBsb25nIGZhc3RfcmVxczsKKwlhdG9taWM2NF90IHNpZ2Ffb3V0czsKKwlhdG9taWM2NF90IHNpZ2FfaW5zOworCWF0b21pYzY0X3Qgc2lnYV9zeW5jczsKKwlhdG9taWM2NF90IHBjaXM7CisJYXRvbWljNjRfdCB0aGluaW50czsKKwlhdG9taWM2NF90IGZhc3RfcmVxczsKIAotCV9fdTY0IHN0YXJ0X3RpbWVfb3V0Ym91bmQ7Ci0JdW5zaWduZWQgbG9uZyBvdXRib3VuZF9jbnQ7Ci0JdW5zaWduZWQgbG9uZyBvdXRib3VuZF90aW1lOwotCV9fdTY0IHN0YXJ0X3RpbWVfaW5ib3VuZDsKLQl1bnNpZ25lZCBsb25nIGluYm91bmRfY250OwotCXVuc2lnbmVkIGxvbmcgaW5ib3VuZF90aW1lOworCWF0b21pYzY0X3Qgb3V0Ym91bmRfY250OworCWF0b21pYzY0X3QgaW5ib3VuZF9jbnQ7CisjZWxzZSAvKiBDT05GSUdfNjRCSVQgKi8KKwlhdG9taWNfdCB0bF9ydW5zOworCWF0b21pY190IG91dGJvdW5kX3RsX3J1bnM7CisJYXRvbWljX3Qgb3V0Ym91bmRfdGxfcnVuc19yZXNjaGVkOworCWF0b21pY190IGluYm91bmRfdGxfcnVuczsKKwlhdG9taWNfdCBpbmJvdW5kX3RsX3J1bnNfcmVzY2hlZDsKKwlhdG9taWNfdCBpbmJvdW5kX3RoaW5fdGxfcnVuczsKKwlhdG9taWNfdCBpbmJvdW5kX3RoaW5fdGxfcnVuc19yZXNjaGVkOworCisJYXRvbWljX3Qgc2lnYV9vdXRzOworCWF0b21pY190IHNpZ2FfaW5zOworCWF0b21pY190IHNpZ2Ffc3luY3M7CisJYXRvbWljX3QgcGNpczsKKwlhdG9taWNfdCB0aGluaW50czsKKwlhdG9taWNfdCBmYXN0X3JlcXM7CisKKwlhdG9taWNfdCBvdXRib3VuZF9jbnQ7CisJYXRvbWljX3QgaW5ib3VuZF9jbnQ7CisjZW5kaWYgLyogQ09ORklHXzY0QklUICovCiB9OwogCiAvKiB1bmxpa2VseSBhcyB0aGUgbGF0ZXIgdGhlIGJldHRlciAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2NyeXB0by9hcF9idXMuYyBiL2RyaXZlcnMvczM5MC9jcnlwdG8vYXBfYnVzLmMKaW5kZXggYmYzN2NkZi4uNWFhYzBlYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2NyeXB0by9hcF9idXMuYworKysgYi9kcml2ZXJzL3MzOTAvY3J5cHRvL2FwX2J1cy5jCkBAIC00MjMsMjcgKzQyMywyNSBAQAogCQkgICAgICAgY2hhciAqYnVmZmVyLCBpbnQgYnVmZmVyX3NpemUpCiB7CiAJc3RydWN0IGFwX2RldmljZSAqYXBfZGV2ID0gdG9fYXBfZGV2KGRldik7Ci0JaW50IGxlbmd0aDsKKwlpbnQgcmV0dmFsID0gMCwgbGVuZ3RoID0gMCwgaSA9IDA7CiAKIAlpZiAoIWFwX2RldikKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAkvKiBTZXQgdXAgREVWX1RZUEUgZW52aXJvbm1lbnQgdmFyaWFibGUuICovCi0JZW52cFswXSA9IGJ1ZmZlcjsKLQlsZW5ndGggPSBzY25wcmludGYoYnVmZmVyLCBidWZmZXJfc2l6ZSwgIkRFVl9UWVBFPSUwNFgiLAotCQkJICAgYXBfZGV2LT5kZXZpY2VfdHlwZSk7Ci0JaWYgKGJ1ZmZlcl9zaXplIC0gbGVuZ3RoIDw9IDApCi0JCXJldHVybiAtRU5PTUVNOwotCWJ1ZmZlciArPSBsZW5ndGg7Ci0JYnVmZmVyX3NpemUgLT0gbGVuZ3RoOworCXJldHZhbCA9IGFkZF91ZXZlbnRfdmFyKGVudnAsIG51bV9lbnZwLCAmaSwKKwkJCQlidWZmZXIsIGJ1ZmZlcl9zaXplLCAmbGVuZ3RoLAorCQkJCSJERVZfVFlQRT0lMDRYIiwgYXBfZGV2LT5kZXZpY2VfdHlwZSk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKwogCS8qIEFkZCBNT0RBTElBUz0gKi8KLQllbnZwWzFdID0gYnVmZmVyOwotCWxlbmd0aCA9IHNjbnByaW50ZihidWZmZXIsIGJ1ZmZlcl9zaXplLCAiTU9EQUxJQVM9YXA6dCUwMlgiLAotCQkJICAgYXBfZGV2LT5kZXZpY2VfdHlwZSk7Ci0JaWYgKGJ1ZmZlcl9zaXplIC0gbGVuZ3RoIDw9IDApCi0JCXJldHVybiAtRU5PTUVNOwotCWVudnBbMl0gPSBOVUxMOwotCXJldHVybiAwOworCXJldHZhbCA9IGFkZF91ZXZlbnRfdmFyKGVudnAsIG51bV9lbnZwLCAmaSwKKwkJCQlidWZmZXIsIGJ1ZmZlcl9zaXplLCAmbGVuZ3RoLAorCQkJCSJNT0RBTElBUz1hcDp0JTAyWCIsIGFwX2Rldi0+ZGV2aWNlX3R5cGUpOworCisJZW52cFtpXSA9IE5VTEw7CisJcmV0dXJuIHJldHZhbDsKIH0KIAogc3RhdGljIHN0cnVjdCBidXNfdHlwZSBhcF9idXNfdHlwZSA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9uZXQvY2xhdy5jIGIvZHJpdmVycy9zMzkwL25ldC9jbGF3LmMKaW5kZXggNzgwOWE3OS4uNmRkNjRkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL25ldC9jbGF3LmMKKysrIGIvZHJpdmVycy9zMzkwL25ldC9jbGF3LmMKQEAgLTM1MjUsOCArMzUyNSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShza2JfcHV0KHNrYixsZW5fb2ZfZGF0YSksCiAJCQkJCXByaXZwdHItPnBfbXRjX2VudmVsb3BlLAogCQkJCQlsZW5fb2ZfZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNrYi0+bWFjLnJhdz1za2ItPmRhdGE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNrYi0+ZGV2PWRldjsKKwkJCQlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2ItPnByb3RvY29sPWh0b25zKEVUSF9QX0lQKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tiLT5pcF9zdW1tZWQ9Q0hFQ0tTVU1fVU5ORUNFU1NBUlk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaXZwdHItPnN0YXRzLnJ4X3BhY2tldHMrKzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9uZXQvY3RjbWFpbi5jIGIvZHJpdmVycy9zMzkwL25ldC9jdGNtYWluLmMKaW5kZXggMGQ2ZDVmYy4uYjIwZmQwNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL25ldC9jdGNtYWluLmMKKysrIGIvZHJpdmVycy9zMzkwL25ldC9jdGNtYWluLmMKQEAgLTQ1NSw3ICs0NTUsNyBAQAogCQkJcmV0dXJuOwogCQl9CiAJCXNrYl9wdXQocHNrYiwgaGVhZGVyLT5sZW5ndGgpOwotCQlwc2tiLT5tYWMucmF3ID0gcHNrYi0+ZGF0YTsKKwkJc2tiX3Jlc2V0X21hY19oZWFkZXIocHNrYik7CiAJCWxlbiAtPSBoZWFkZXItPmxlbmd0aDsKIAkJc2tiID0gZGV2X2FsbG9jX3NrYihwc2tiLT5sZW4pOwogCQlpZiAoIXNrYikgewpAQCAtNDcyLDggKzQ3Miw5IEBACiAJCQlwcml2cHRyLT5zdGF0cy5yeF9kcm9wcGVkKys7CiAJCQlyZXR1cm47CiAJCX0KLQkJbWVtY3B5KHNrYl9wdXQoc2tiLCBwc2tiLT5sZW4pLCBwc2tiLT5kYXRhLCBwc2tiLT5sZW4pOwotCQlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEocHNrYiwgc2tiX3B1dChza2IsIHBza2ItPmxlbiksCisJCQkJCSAgcHNrYi0+bGVuKTsKKwkJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKIAkJc2tiLT5kZXYgPSBwc2tiLT5kZXY7CiAJCXNrYi0+cHJvdG9jb2wgPSBwc2tiLT5wcm90b2NvbDsKIAkJcHNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CkBAIC03MDYsNyArNzA3LDggQEAKIAkJCXNwaW5fdW5sb2NrKCZjaC0+Y29sbGVjdF9sb2NrKTsKIAkJCXJldHVybjsKIAkJfQotCQljaC0+dHJhbnNfc2tiLT50YWlsID0gY2gtPnRyYW5zX3NrYi0+ZGF0YSA9IGNoLT50cmFuc19za2JfZGF0YTsKKwkJY2gtPnRyYW5zX3NrYi0+ZGF0YSA9IGNoLT50cmFuc19za2JfZGF0YTsKKwkJc2tiX3Jlc2V0X3RhaWxfcG9pbnRlcihjaC0+dHJhbnNfc2tiKTsKIAkJY2gtPnRyYW5zX3NrYi0+bGVuID0gMDsKIAkJaWYgKGNoLT5wcm9mLm1heG11bHRpIDwgKGNoLT5jb2xsZWN0X2xlbiArIDIpKQogCQkJY2gtPnByb2YubWF4bXVsdGkgPSBjaC0+Y29sbGVjdF9sZW4gKyAyOwpAQCAtNzE1LDggKzcxNyw5IEBACiAJCSooKF9fdTE2ICopIHNrYl9wdXQoY2gtPnRyYW5zX3NrYiwgMikpID0gY2gtPmNvbGxlY3RfbGVuICsgMjsKIAkJaSA9IDA7CiAJCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJmNoLT5jb2xsZWN0X3F1ZXVlKSkpIHsKLQkJCW1lbWNweShza2JfcHV0KGNoLT50cmFuc19za2IsIHNrYi0+bGVuKSwgc2tiLT5kYXRhLAotCQkJICAgICAgIHNrYi0+bGVuKTsKKwkJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCBza2JfcHV0KGNoLT50cmFuc19za2IsCisJCQkJCQkJICAgICAgIHNrYi0+bGVuKSwKKwkJCQkJCSAgc2tiLT5sZW4pOwogCQkJcHJpdnB0ci0+c3RhdHMudHhfcGFja2V0cysrOwogCQkJcHJpdnB0ci0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW4gLSBMTF9IRUFERVJfTEVOR1RIOwogCQkJYXRvbWljX2RlYygmc2tiLT51c2Vycyk7CkBAIC04MzEsNyArODM0LDggQEAKIAkJY3RjX3VucGFja19za2IoY2gsIHNrYik7CiAJfQogIGFnYWluOgotCXNrYi0+ZGF0YSA9IHNrYi0+dGFpbCA9IGNoLT50cmFuc19za2JfZGF0YTsKKwlza2ItPmRhdGEgPSBjaC0+dHJhbnNfc2tiX2RhdGE7CisJc2tiX3Jlc2V0X3RhaWxfcG9pbnRlcihza2IpOwogCXNrYi0+bGVuID0gMDsKIAlpZiAoY3RjX2NoZWNrYWxsb2NfYnVmZmVyKGNoLCAxKSkKIAkJcmV0dXJuOwpAQCAtMTYzOCwyMSArMTY0MiwxOSBAQAogCXN0cnVjdCBjaGFubmVsICpjaDsKIAogCURCRl9URVhUKHRyYWNlLCAyLCBfX0ZVTkNUSU9OX18pOwotCWlmICgoY2ggPQotCSAgICAgKHN0cnVjdCBjaGFubmVsICopIGttYWxsb2Moc2l6ZW9mIChzdHJ1Y3QgY2hhbm5lbCksCi0JCQkJCUdGUF9LRVJORUwpKSA9PSBOVUxMKSB7CisJY2ggPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY2hhbm5lbCksIEdGUF9LRVJORUwpOworCWlmICghY2gpIHsKIAkJY3RjX3ByX3dhcm4oImN0YzogT3V0IG9mIG1lbW9yeSBpbiBhZGRfY2hhbm5lbFxuIik7CiAJCXJldHVybiAtMTsKIAl9Ci0JbWVtc2V0KGNoLCAwLCBzaXplb2YgKHN0cnVjdCBjaGFubmVsKSk7Ci0JaWYgKChjaC0+Y2N3ID0ga21hbGxvYyg4KnNpemVvZihzdHJ1Y3QgY2N3MSksCi0JCQkJCSAgICAgICBHRlBfS0VSTkVMIHwgR0ZQX0RNQSkpID09IE5VTEwpIHsKKwkvKiBhc3N1cmUgYWxsIGZsYWdzIGFuZCBjb3VudGVycyBhcmUgcmVzZXQgKi8KKwljaC0+Y2N3ID0ga3phbGxvYyg4ICogc2l6ZW9mKHN0cnVjdCBjY3cxKSwgR0ZQX0tFUk5FTCB8IEdGUF9ETUEpOworCWlmICghY2gtPmNjdykgewogCQlrZnJlZShjaCk7CiAJCWN0Y19wcl93YXJuKCJjdGM6IE91dCBvZiBtZW1vcnkgaW4gYWRkX2NoYW5uZWxcbiIpOwogCQlyZXR1cm4gLTE7CiAJfQogCi0JbWVtc2V0KGNoLT5jY3csIDAsIDgqc2l6ZW9mKHN0cnVjdCBjY3cxKSk7CS8vIGFzc3VyZSBhbGwgZmxhZ3MgYW5kIGNvdW50ZXJzIGFyZSByZXNldAogCiAJLyoqCiAJICogInN0YXRpYyIgY2N3cyBhcmUgdXNlZCBpbiB0aGUgZm9sbG93aW5nIHdheToKQEAgLTE2OTIsMTUgKzE2OTQsMTQgQEAKIAkJcmV0dXJuIC0xOwogCX0KIAlmc21fbmV3c3RhdGUoY2gtPmZzbSwgQ0hfU1RBVEVfSURMRSk7Ci0JaWYgKChjaC0+aXJiID0ga21hbGxvYyhzaXplb2YgKHN0cnVjdCBpcmIpLAotCQkJCQkgICAgICBHRlBfS0VSTkVMKSkgPT0gTlVMTCkgeworCWNoLT5pcmIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaXJiKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjaC0+aXJiKSB7CiAJCWN0Y19wcl93YXJuKCJjdGM6IE91dCBvZiBtZW1vcnkgaW4gYWRkX2NoYW5uZWxcbiIpOwogCQlrZnJlZV9mc20oY2gtPmZzbSk7CiAJCWtmcmVlKGNoLT5jY3cpOwogCQlrZnJlZShjaCk7CiAJCXJldHVybiAtMTsKIAl9Ci0JbWVtc2V0KGNoLT5pcmIsIDAsIHNpemVvZiAoc3RydWN0IGlyYikpOwogCXdoaWxlICgqYyAmJiBsZXNzX3RoYW4oKCpjKS0+aWQsIGNoLT5pZCkpCiAJCWMgPSAmKCpjKS0+bmV4dDsKIAlpZiAoKmMgJiYgKCFzdHJuY21wKCgqYyktPmlkLCBjaC0+aWQsIENUQ19JRF9TSVpFKSkpIHsKQEAgLTIyMjYsNyArMjIyNyw4IEBACiAJCSAqIElEQUwgc3VwcG9ydCBpbiBDVEMgaXMgYnJva2VuLCBzbyB3ZSBoYXZlIHRvCiAJCSAqIGNhcmUgYWJvdXQgc2tiJ3MgYWJvdmUgMkcgb3Vyc2VsdmVzLgogCQkgKi8KLQkJaGkgPSAoKHVuc2lnbmVkIGxvbmcpIHNrYi0+dGFpbCArIExMX0hFQURFUl9MRU5HVEgpID4+IDMxOworCQloaSA9ICgodW5zaWduZWQgbG9uZylza2JfdGFpbF9wb2ludGVyKHNrYikgKworCQkgICAgICBMTF9IRUFERVJfTEVOR1RIKSA+PiAzMTsKIAkJaWYgKGhpKSB7CiAJCQluc2tiID0gYWxsb2Nfc2tiKHNrYi0+bGVuLCBHRlBfQVRPTUlDIHwgR0ZQX0RNQSk7CiAJCQlpZiAoIW5za2IpIHsKQEAgLTIyNjIsMTEgKzIyNjQsMTIgQEAKIAkJCQlyZXR1cm4gLUVCVVNZOwogCQkJfQogCi0JCQljaC0+dHJhbnNfc2tiLT50YWlsID0gY2gtPnRyYW5zX3NrYi0+ZGF0YTsKKwkJCXNrYl9yZXNldF90YWlsX3BvaW50ZXIoY2gtPnRyYW5zX3NrYik7CiAJCQljaC0+dHJhbnNfc2tiLT5sZW4gPSAwOwogCQkJY2gtPmNjd1sxXS5jb3VudCA9IHNrYi0+bGVuOwotCQkJbWVtY3B5KHNrYl9wdXQoY2gtPnRyYW5zX3NrYiwgc2tiLT5sZW4pLCBza2ItPmRhdGEsCi0JCQkgICAgICAgc2tiLT5sZW4pOworCQkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIHNrYl9wdXQoY2gtPnRyYW5zX3NrYiwKKwkJCQkJCQkgICAgICAgc2tiLT5sZW4pLAorCQkJCQkJICBza2ItPmxlbik7CiAJCQlhdG9taWNfZGVjKCZza2ItPnVzZXJzKTsKIAkJCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CiAJCQljY3dfaWR4ID0gMDsKQEAgLTI3NDUsMTQgKzI3NDgsMTMgQEAKIAlpZiAoIWdldF9kZXZpY2UoJmNnZGV2LT5kZXYpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCXByaXYgPSBrbWFsbG9jKHNpemVvZiAoc3RydWN0IGN0Y19wcml2KSwgR0ZQX0tFUk5FTCk7CisJcHJpdiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjdGNfcHJpdiksIEdGUF9LRVJORUwpOwogCWlmICghcHJpdikgewogCQljdGNfcHJfZXJyKCIlczogT3V0IG9mIG1lbW9yeVxuIiwgX19mdW5jX18pOwogCQlwdXRfZGV2aWNlKCZjZ2Rldi0+ZGV2KTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JbWVtc2V0KHByaXYsIDAsIHNpemVvZiAoc3RydWN0IGN0Y19wcml2KSk7CiAJcmMgPSBjdGNfYWRkX2ZpbGVzKCZjZ2Rldi0+ZGV2KTsKIAlpZiAocmMpIHsKIAkJa2ZyZWUocHJpdik7CkBAIC0yNzkzLDEwICsyNzk1LDkgQEAKIAlEQkZfVEVYVChzZXR1cCwgMywgX19GVU5DVElPTl9fKTsKIAogCWlmIChhbGxvY19kZXZpY2UpIHsKLQkJZGV2ID0ga21hbGxvYyhzaXplb2YgKHN0cnVjdCBuZXRfZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CisJCWRldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBuZXRfZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CiAJCWlmICghZGV2KQogCQkJcmV0dXJuIE5VTEw7Ci0JCW1lbXNldChkZXYsIDAsIHNpemVvZiAoc3RydWN0IG5ldF9kZXZpY2UpKTsKIAl9CiAKIAlkZXYtPnByaXYgPSBwcml2cHRyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL25ldC9sY3MuYyBiL2RyaXZlcnMvczM5MC9uZXQvbGNzLmMKaW5kZXggZWNjYTEwNC4uMDhhOTk0ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL25ldC9sY3MuYworKysgYi9kcml2ZXJzL3MzOTAvbmV0L2xjcy5jCkBAIC0xNTc2LDcgKzE1NzYsNyBAQAogCWhlYWRlci0+b2Zmc2V0ID0gY2FyZC0+dHhfYnVmZmVyLT5jb3VudDsKIAloZWFkZXItPnR5cGUgPSBjYXJkLT5sYW5fdHlwZTsKIAloZWFkZXItPnNsb3QgPSBjYXJkLT5wb3J0bm87Ci0JbWVtY3B5KGhlYWRlciArIDEsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCBoZWFkZXIgKyAxLCBza2ItPmxlbik7CiAJc3Bpbl91bmxvY2soJmNhcmQtPmxvY2spOwogCWNhcmQtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOwogCWNhcmQtPnN0YXRzLnR4X3BhY2tldHMrKzsKQEAgLTE3ODQsNyArMTc4NCw2IEBACiAJCWNhcmQtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKIAkJcmV0dXJuOwogCX0KLQlza2ItPmRldiA9IGNhcmQtPmRldjsKIAltZW1jcHkoc2tiX3B1dChza2IsIHNrYl9sZW4pLCBza2JfZGF0YSwgc2tiX2xlbik7CiAJc2tiLT5wcm90b2NvbCA9CWNhcmQtPmxhbl90eXBlX3RyYW5zKHNrYiwgY2FyZC0+ZGV2KTsKIAljYXJkLT5zdGF0cy5yeF9ieXRlcyArPSBza2JfbGVuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL25ldC9uZXRpdWN2LmMgYi9kcml2ZXJzL3MzOTAvbmV0L25ldGl1Y3YuYwppbmRleCA1OTQzMjBjLi5lMTBlODVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvbmV0L25ldGl1Y3YuYworKysgYi9kcml2ZXJzL3MzOTAvbmV0L25ldGl1Y3YuYwpAQCAtNjM1LDcgKzYzNSw3IEBACiAJCQlyZXR1cm47CiAJCX0KIAkJc2tiX3B1dChwc2tiLCBoZWFkZXItPm5leHQpOwotCQlwc2tiLT5tYWMucmF3ID0gcHNrYi0+ZGF0YTsKKwkJc2tiX3Jlc2V0X21hY19oZWFkZXIocHNrYik7CiAJCXNrYiA9IGRldl9hbGxvY19za2IocHNrYi0+bGVuKTsKIAkJaWYgKCFza2IpIHsKIAkJCVBSSU5UX1dBUk4oIiVzIE91dCBvZiBtZW1vcnkgaW4gbmV0aXVjdl91bnBhY2tfc2tiXG4iLApAQCAtNjQ1LDggKzY0NSw5IEBACiAJCQlwcml2cHRyLT5zdGF0cy5yeF9kcm9wcGVkKys7CiAJCQlyZXR1cm47CiAJCX0KLQkJbWVtY3B5KHNrYl9wdXQoc2tiLCBwc2tiLT5sZW4pLCBwc2tiLT5kYXRhLCBwc2tiLT5sZW4pOwotCQlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEocHNrYiwgc2tiX3B1dChza2IsIHBza2ItPmxlbiksCisJCQkJCSAgcHNrYi0+bGVuKTsKKwkJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKIAkJc2tiLT5kZXYgPSBwc2tiLT5kZXY7CiAJCXNrYi0+cHJvdG9jb2wgPSBwc2tiLT5wcm90b2NvbDsKIAkJcHNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CkBAIC02ODksNyArNjkwLDggQEAKIAkJCSAgICAgICBtc2ctPmxlbmd0aCwgY29ubi0+bWF4X2J1ZmZzaXplKTsKIAkJcmV0dXJuOwogCX0KLQljb25uLT5yeF9idWZmLT5kYXRhID0gY29ubi0+cnhfYnVmZi0+dGFpbCA9IGNvbm4tPnJ4X2J1ZmYtPmhlYWQ7CisJY29ubi0+cnhfYnVmZi0+ZGF0YSA9IGNvbm4tPnJ4X2J1ZmYtPmhlYWQ7CisJc2tiX3Jlc2V0X3RhaWxfcG9pbnRlcihjb25uLT5yeF9idWZmKTsKIAljb25uLT5yeF9idWZmLT5sZW4gPSAwOwogCXJjID0gaXVjdl9tZXNzYWdlX3JlY2VpdmUoY29ubi0+cGF0aCwgbXNnLCAwLCBjb25uLT5yeF9idWZmLT5kYXRhLAogCQkJCSAgbXNnLT5sZW5ndGgsIE5VTEwpOwpAQCAtNzM1LDE0ICs3MzcsMTcgQEAKIAkJCX0KIAkJfQogCX0KLQljb25uLT50eF9idWZmLT5kYXRhID0gY29ubi0+dHhfYnVmZi0+dGFpbCA9IGNvbm4tPnR4X2J1ZmYtPmhlYWQ7CisJY29ubi0+dHhfYnVmZi0+ZGF0YSA9IGNvbm4tPnR4X2J1ZmYtPmhlYWQ7CisJc2tiX3Jlc2V0X3RhaWxfcG9pbnRlcihjb25uLT50eF9idWZmKTsKIAljb25uLT50eF9idWZmLT5sZW4gPSAwOwogCXNwaW5fbG9ja19pcnFzYXZlKCZjb25uLT5jb2xsZWN0X2xvY2ssIHNhdmVmbGFncyk7CiAJd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZSgmY29ubi0+Y29sbGVjdF9xdWV1ZSkpKSB7CiAJCWhlYWRlci5uZXh0ID0gY29ubi0+dHhfYnVmZi0+bGVuICsgc2tiLT5sZW4gKyBORVRJVUNWX0hEUkxFTjsKIAkJbWVtY3B5KHNrYl9wdXQoY29ubi0+dHhfYnVmZiwgTkVUSVVDVl9IRFJMRU4pLCAmaGVhZGVyLAogCQkgICAgICAgTkVUSVVDVl9IRFJMRU4pOwotCQltZW1jcHkoc2tiX3B1dChjb25uLT50eF9idWZmLCBza2ItPmxlbiksIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwKKwkJCQkJICBza2JfcHV0KGNvbm4tPnR4X2J1ZmYsIHNrYi0+bGVuKSwKKwkJCQkJICBza2ItPmxlbik7CiAJCXR4Ynl0ZXMgKz0gc2tiLT5sZW47CiAJCXR4cGFja2V0cysrOwogCQlzdGF0X21heGNxKys7CkBAIC0xMTY0LDggKzExNjksOCBAQAogCQkgKiBDb3B5IHRoZSBza2IgdG8gYSBuZXcgYWxsb2NhdGVkIHNrYiBpbiBsb3dtZW0gb25seSBpZiB0aGUKIAkJICogZGF0YSBpcyBsb2NhdGVkIGFib3ZlIDJHIGluIG1lbW9yeSBvciB0YWlscm9vbSBpcyA8IDIuCiAJCSAqLwotCQl1bnNpZ25lZCBsb25nIGhpID0KLQkJCSgodW5zaWduZWQgbG9uZykoc2tiLT50YWlsICsgTkVUSVVDVl9IRFJMRU4pKSA+PiAzMTsKKwkJdW5zaWduZWQgbG9uZyBoaSA9ICgodW5zaWduZWQgbG9uZykoc2tiX3RhaWxfcG9pbnRlcihza2IpICsKKwkJCQkgICAgTkVUSVVDVl9IRFJMRU4pKSA+PiAzMTsKIAkJaW50IGNvcGllZCA9IDA7CiAJCWlmIChoaSB8fCAoc2tiX3RhaWxyb29tKHNrYikgPCAyKSkgewogCQkJbnNrYiA9IGFsbG9jX3NrYihza2ItPmxlbiArIE5FVElVQ1ZfSERSTEVOICsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9uZXQvcWV0aC5oIGIvZHJpdmVycy9zMzkwL25ldC9xZXRoLmgKaW5kZXggODRiMTA4ZC4uYjM0ZWI4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL25ldC9xZXRoLmgKKysrIGIvZHJpdmVycy9zMzkwL25ldC9xZXRoLmgKQEAgLTI4OCw2ICsyODgsNyBAQAogICovCiAjZGVmaW5lIElGX05BTUVfTEVOCSAJMTYKICNkZWZpbmUgUUVUSF9UWF9USU1FT1VUCQkxMDAgKiBIWgorI2RlZmluZSBRRVRIX1JDRF9USU1FT1VUCTYwICogSFoKICNkZWZpbmUgUUVUSF9IRUFERVJfU0laRQkzMgogI2RlZmluZSBNQVhfUE9SVE5PIAkJMTUKICNkZWZpbmUgUUVUSF9GQUtFX0xMX0xFTl9FVEgJRVRIX0hMRU4KQEAgLTU4Miw2ICs1ODMsOCBAQAogCUNIX1NUQVRFX0FDVElWQVRJTkcsCiAJQ0hfU1RBVEVfSEFMVEVELAogCUNIX1NUQVRFX1NUT1BQRUQsCisJQ0hfU1RBVEVfUkNELAorCUNIX1NUQVRFX1JDRF9ET05FLAogfTsKIC8qKgogICogY2FyZCBzdGF0ZSBtYWNoaW5lCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvbmV0L3FldGhfZWRkcC5jIGIvZHJpdmVycy9zMzkwL25ldC9xZXRoX2VkZHAuYwppbmRleCA3YzczNWUxLi5kZDcwMzRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvbmV0L3FldGhfZWRkcC5jCisrKyBiL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9lZGRwLmMKQEAgLTI2Nyw3ICsyNjcsOCBAQAogCiAJUUVUSF9EQkZfVEVYVCh0cmFjZSwgNSwgImVkZHBjZHRjIik7CiAJaWYgKHNrYl9zaGluZm8oZWRkcC0+c2tiKS0+bnJfZnJhZ3MgPT0gMCkgewotCQltZW1jcHkoZHN0LCBlZGRwLT5za2ItPmRhdGEgKyBlZGRwLT5za2Jfb2Zmc2V0LCBsZW4pOworCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhX29mZnNldChlZGRwLT5za2IsIGVkZHAtPnNrYl9vZmZzZXQsCisJCQkJCQkgZHN0LCBsZW4pOwogCQkqaGNzdW0gPSBjc3VtX3BhcnRpYWwoZWRkcC0+c2tiLT5kYXRhICsgZWRkcC0+c2tiX29mZnNldCwgbGVuLAogCQkJCSAgICAgICpoY3N1bSk7CiAJCWVkZHAtPnNrYl9vZmZzZXQgKz0gbGVuOwpAQCAtNDE2LDcgKzQxNyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgIGVkZHAtPnNrYl9vZmZzZXQgKz0gVkxBTl9ITEVOOwogI2VuZGlmIC8qIENPTkZJR19RRVRIX1ZMQU4gKi8KICAgICAgICB9Ci0JdGNwaCA9IGVkZHAtPnNrYi0+aC50aDsKKwl0Y3BoID0gdGNwX2hkcihlZGRwLT5za2IpOwogCXdoaWxlIChlZGRwLT5za2Jfb2Zmc2V0IDwgZWRkcC0+c2tiLT5sZW4pIHsKIAkJZGF0YV9sZW4gPSBtaW4oKGludClza2Jfc2hpbmZvKGVkZHAtPnNrYiktPmdzb19zaXplLAogCQkJICAgICAgIChpbnQpKGVkZHAtPnNrYi0+bGVuIC0gZWRkcC0+c2tiX29mZnNldCkpOwpAQCAtNDczLDIwICs0NzQsMjQgQEAKIAlRRVRIX0RCRl9URVhUKHRyYWNlLCA1LCAiZWRkcGZpY3giKTsKIAkvKiBjcmVhdGUgb3VyIHNlZ21lbnRhdGlvbiBoZWFkZXJzIGFuZCBjb3B5IG9yaWdpbmFsIGhlYWRlcnMgKi8KIAlpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9JUCkpCi0JCWVkZHAgPSBxZXRoX2VkZHBfY3JlYXRlX2VkZHBfZGF0YShxaGRyLCAodTggKilza2ItPm5oLmlwaCwKLQkJCQlza2ItPm5oLmlwaC0+aWhsKjQsCi0JCQkJKHU4ICopc2tiLT5oLnRoLCBza2ItPmgudGgtPmRvZmYqNCk7CisJCWVkZHAgPSBxZXRoX2VkZHBfY3JlYXRlX2VkZHBfZGF0YShxaGRyLAorCQkJCQkJICBza2JfbmV0d29ya19oZWFkZXIoc2tiKSwKKwkJCQkJCSAgaXBfaGRybGVuKHNrYiksCisJCQkJCQkgIHNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYiksCisJCQkJCQkgIHRjcF9oZHJsZW4oc2tiKSk7CiAJZWxzZQotCQllZGRwID0gcWV0aF9lZGRwX2NyZWF0ZV9lZGRwX2RhdGEocWhkciwgKHU4ICopc2tiLT5uaC5pcHY2aCwKLQkJCQlzaXplb2Yoc3RydWN0IGlwdjZoZHIpLAotCQkJCSh1OCAqKXNrYi0+aC50aCwgc2tiLT5oLnRoLT5kb2ZmKjQpOworCQllZGRwID0gcWV0aF9lZGRwX2NyZWF0ZV9lZGRwX2RhdGEocWhkciwKKwkJCQkJCSAgc2tiX25ldHdvcmtfaGVhZGVyKHNrYiksCisJCQkJCQkgIHNpemVvZihzdHJ1Y3QgaXB2NmhkciksCisJCQkJCQkgIHNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYiksCisJCQkJCQkgIHRjcF9oZHJsZW4oc2tiKSk7CiAKIAlpZiAoZWRkcCA9PSBOVUxMKSB7CiAJCVFFVEhfREJGX1RFWFQodHJhY2UsIDIsICJlZGRwZmNubSIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJaWYgKHFoZHItPmhkci5sMi5pZCA9PSBRRVRIX0hFQURFUl9UWVBFX0xBWUVSMikgewotCQlza2ItPm1hYy5yYXcgPSAoc2tiLT5kYXRhKSArIHNpemVvZihzdHJ1Y3QgcWV0aF9oZHIpOworCQlza2Jfc2V0X21hY19oZWFkZXIoc2tiLCBzaXplb2Yoc3RydWN0IHFldGhfaGRyKSk7CiAJCW1lbWNweSgmZWRkcC0+bWFjLCBldGhfaGRyKHNrYiksIEVUSF9ITEVOKTsKICNpZmRlZiBDT05GSUdfUUVUSF9WTEFOCiAJCWlmIChlZGRwLT5tYWMuaF9wcm90byA9PSBfX2NvbnN0YW50X2h0b25zKEVUSF9QXzgwMjFRKSkgewpAQCAtNTkwLDEyICs1OTUsMTMgQEAKIAlRRVRIX0RCRl9URVhUKHRyYWNlLCA1LCAiY3JlZGRwY3QiKTsKIAlpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9JUCkpCiAJCWN0eCA9IHFldGhfZWRkcF9jcmVhdGVfY29udGV4dF9nZW5lcmljKGNhcmQsIHNrYiwKLQkJCXNpemVvZihzdHJ1Y3QgcWV0aF9oZHIpICsgc2tiLT5uaC5pcGgtPmlobCo0ICsKLQkJCXNrYi0+aC50aC0+ZG9mZio0KTsKKwkJCQkJCSAgICAgICAoc2l6ZW9mKHN0cnVjdCBxZXRoX2hkcikgKworCQkJCQkJICAgICAgICBpcF9oZHJsZW4oc2tiKSArCisJCQkJCQkJdGNwX2hkcmxlbihza2IpKSk7CiAJZWxzZSBpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9JUFY2KSkKIAkJY3R4ID0gcWV0aF9lZGRwX2NyZWF0ZV9jb250ZXh0X2dlbmVyaWMoY2FyZCwgc2tiLAogCQkJc2l6ZW9mKHN0cnVjdCBxZXRoX2hkcikgKyBzaXplb2Yoc3RydWN0IGlwdjZoZHIpICsKLQkJCXNrYi0+aC50aC0+ZG9mZio0KTsKKwkJCXRjcF9oZHJsZW4oc2tiKSk7CiAJZWxzZQogCQlRRVRIX0RCRl9URVhUKHRyYWNlLCAyLCAiY2V0Y3BpbnYiKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL25ldC9xZXRoX21haW4uYyBiL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9tYWluLmMKaW5kZXggZDhhODZmNS4uNmZkODg3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL25ldC9xZXRoX21haW4uYworKysgYi9kcml2ZXJzL3MzOTAvbmV0L3FldGhfbWFpbi5jCkBAIC0zMTUsNyArMzE1LDggQEAKIH0KIAogc3RhdGljIGxvbmcKLV9fcWV0aF9jaGVja19pcmJfZXJyb3Ioc3RydWN0IGNjd19kZXZpY2UgKmNkZXYsIHN0cnVjdCBpcmIgKmlyYikKK19fcWV0aF9jaGVja19pcmJfZXJyb3Ioc3RydWN0IGNjd19kZXZpY2UgKmNkZXYsIHVuc2lnbmVkIGxvbmcgaW50cGFybSwKKwkJICAgICAgIHN0cnVjdCBpcmIgKmlyYikKIHsKIAlpZiAoIUlTX0VSUihpcmIpKQogCQlyZXR1cm4gMDsKQEAgLTMzMCw2ICszMzEsMTQgQEAKIAkJUFJJTlRfV0FSTigidGltZW91dCBvbiBkZXZpY2UgJXNcbiIsIGNkZXYtPmRldi5idXNfaWQpOwogCQlRRVRIX0RCRl9URVhUKHRyYWNlLCAyLCAiY2tpcmJlcnIiKTsKIAkJUUVUSF9EQkZfVEVYVF8odHJhY2UsIDIsICIgIHJjJWQiLCAtRVRJTUVET1VUKTsKKwkJaWYgKGludHBhcm0gPT0gUUVUSF9SQ0RfUEFSTSkgeworCQkJc3RydWN0IHFldGhfY2FyZCAqY2FyZCA9IENBUkRfRlJPTV9DREVWKGNkZXYpOworCisJCQlpZiAoY2FyZCAmJiAoY2FyZC0+ZGF0YS5jY3dkZXYgPT0gY2RldikpIHsKKwkJCQljYXJkLT5kYXRhLnN0YXRlID0gQ0hfU1RBVEVfRE9XTjsKKwkJCQl3YWtlX3VwKCZjYXJkLT53YWl0X3EpOworCQkJfQorCQl9CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCVBSSU5UX1dBUk4oInVua25vd24gZXJyb3IgJWxkIG9uIGRldmljZSAlc1xuIiwgUFRSX0VSUihpcmIpLApAQCAtNDAxLDcgKzQxMCw3IEBACiAKIAlRRVRIX0RCRl9URVhUKHRyYWNlLDUsImlycSIpOwogCi0JaWYgKF9fcWV0aF9jaGVja19pcmJfZXJyb3IoY2RldiwgaXJiKSkKKwlpZiAoX19xZXRoX2NoZWNrX2lyYl9lcnJvcihjZGV2LCBpbnRwYXJtLCBpcmIpKQogCQlyZXR1cm47CiAJY3N0YXQgPSBpcmItPnNjc3cuY3N0YXQ7CiAJZHN0YXQgPSBpcmItPnNjc3cuZHN0YXQ7CkBAIC00MjksNyArNDM4LDggQEAKIAkJY2hhbm5lbC0+c3RhdGUgPSBDSF9TVEFURV9IQUxURUQ7CiAKIAkvKmxldCdzIHdha2UgdXAgaW1tZWRpYXRlbHkgb24gZGF0YSBjaGFubmVsKi8KLQlpZiAoKGNoYW5uZWwgPT0gJmNhcmQtPmRhdGEpICYmIChpbnRwYXJtICE9IDApKQorCWlmICgoY2hhbm5lbCA9PSAmY2FyZC0+ZGF0YSkgJiYgKGludHBhcm0gIT0gMCkgJiYKKwkgICAgKGludHBhcm0gIT0gUUVUSF9SQ0RfUEFSTSkpCiAJCWdvdG8gb3V0OwogCiAJaWYgKGludHBhcm0gPT0gUUVUSF9DTEVBUl9DSEFOTkVMX1BBUk0pIHsKQEAgLTQ1Myw2ICs0NjMsMTAgQEAKIAkJCUhFWERVTVAxNihXQVJOLCJpcmI6ICIsaXJiKTsKIAkJCUhFWERVTVAxNihXQVJOLCJzZW5zZSBkYXRhOiAiLGlyYi0+ZWN3KTsKIAkJfQorCQlpZiAoaW50cGFybSA9PSBRRVRIX1JDRF9QQVJNKSB7CisJCQljaGFubmVsLT5zdGF0ZSA9IENIX1NUQVRFX0RPV047CisJCQlnb3RvIG91dDsKKwkJfQogCQlyYyA9IHFldGhfZ2V0X3Byb2JsZW0oY2RldixpcmIpOwogCQlpZiAocmMpIHsKIAkJCXFldGhfc2NoZWR1bGVfcmVjb3ZlcnkoY2FyZCk7CkBAIC00NjAsNiArNDc0LDEwIEBACiAJCX0KIAl9CiAKKwlpZiAoaW50cGFybSA9PSBRRVRIX1JDRF9QQVJNKSB7CisJCWNoYW5uZWwtPnN0YXRlID0gQ0hfU1RBVEVfUkNEX0RPTkU7CisJCWdvdG8gb3V0OworCX0KIAlpZiAoaW50cGFybSkgewogCQlidWZmZXIgPSAoc3RydWN0IHFldGhfY21kX2J1ZmZlciAqKSBfX3ZhKChhZGRyX3QpaW50cGFybSk7CiAJCWJ1ZmZlci0+c3RhdGUgPSBCVUZfU1RBVEVfUFJPQ0VTU0VEOwpAQCAtMTIwNCw2ICsxMjIyLDU0IEBACiB9CiAKIAorc3RhdGljIGludCBxZXRoX3JlYWRfY29uZl9kYXRhKHN0cnVjdCBxZXRoX2NhcmQgKmNhcmQsIHZvaWQgKipidWZmZXIsCisJCQkgICAgICAgaW50ICpsZW5ndGgpCit7CisJc3RydWN0IGNpdyAqY2l3OworCWNoYXIgKnJjZF9idWY7CisJaW50IHJldDsKKwlzdHJ1Y3QgcWV0aF9jaGFubmVsICpjaGFubmVsID0gJmNhcmQtPmRhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qCisJICogc2NhbiBmb3IgUkNEIGNvbW1hbmQgaW4gZXh0ZW5kZWQgU2Vuc2VJRCBkYXRhCisJICovCisJY2l3ID0gY2N3X2RldmljZV9nZXRfY2l3KGNoYW5uZWwtPmNjd2RldiwgQ0lXX1RZUEVfUkNEKTsKKwlpZiAoIWNpdyB8fCBjaXctPmNtZCA9PSAwKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJcmNkX2J1ZiA9IGt6YWxsb2MoY2l3LT5jb3VudCwgR0ZQX0tFUk5FTCB8IEdGUF9ETUEpOworCWlmICghcmNkX2J1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljaGFubmVsLT5jY3cuY21kX2NvZGUgPSBjaXctPmNtZDsKKwljaGFubmVsLT5jY3cuY2RhID0gKF9fdTMyKSBfX3BhIChyY2RfYnVmKTsKKwljaGFubmVsLT5jY3cuY291bnQgPSBjaXctPmNvdW50OworCWNoYW5uZWwtPmNjdy5mbGFncyA9IENDV19GTEFHX1NMSTsKKwljaGFubmVsLT5zdGF0ZSA9IENIX1NUQVRFX1JDRDsKKwlzcGluX2xvY2tfaXJxc2F2ZShnZXRfY2N3ZGV2X2xvY2soY2hhbm5lbC0+Y2N3ZGV2KSwgZmxhZ3MpOworCXJldCA9IGNjd19kZXZpY2Vfc3RhcnRfdGltZW91dChjaGFubmVsLT5jY3dkZXYsICZjaGFubmVsLT5jY3csCisJCQkJICAgICAgIFFFVEhfUkNEX1BBUk0sIExQTV9BTllQQVRILCAwLAorCQkJCSAgICAgICBRRVRIX1JDRF9USU1FT1VUKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGdldF9jY3dkZXZfbG9jayhjaGFubmVsLT5jY3dkZXYpLCBmbGFncyk7CisJaWYgKCFyZXQpCisJCXdhaXRfZXZlbnQoY2FyZC0+d2FpdF9xLAorCQkJICAgKGNoYW5uZWwtPnN0YXRlID09IENIX1NUQVRFX1JDRF9ET05FIHx8CisJCQkgICAgY2hhbm5lbC0+c3RhdGUgPT0gQ0hfU1RBVEVfRE9XTikpOworCWlmIChjaGFubmVsLT5zdGF0ZSA9PSBDSF9TVEFURV9ET1dOKQorCQlyZXQgPSAtRUlPOworCWVsc2UKKwkJY2hhbm5lbC0+c3RhdGUgPSBDSF9TVEFURV9ET1dOOworCWlmIChyZXQpIHsKKwkJa2ZyZWUocmNkX2J1Zik7CisJCSpidWZmZXIgPSBOVUxMOworCQkqbGVuZ3RoID0gMDsKKwl9IGVsc2UgeworCQkqbGVuZ3RoID0gY2l3LT5jb3VudDsKKwkJKmJ1ZmZlciA9IHJjZF9idWY7CisJfQorCXJldHVybiByZXQ7Cit9CisKIHN0YXRpYyBpbnQKIHFldGhfZ2V0X3VuaXRhZGRyKHN0cnVjdCBxZXRoX2NhcmQgKmNhcmQpCiB7CkBAIC0xMjEyLDkgKzEyNzgsOSBAQAogCWludCByYzsKIAogCVFFVEhfREJGX1RFWFQoc2V0dXAsIDIsICJnZXR1bml0Iik7Ci0JcmMgPSByZWFkX2NvbmZfZGF0YShDQVJEX0RERVYoY2FyZCksICh2b2lkICoqKSAmcHJjZCwgJmxlbmd0aCk7CisJcmMgPSBxZXRoX3JlYWRfY29uZl9kYXRhKGNhcmQsICh2b2lkICoqKSAmcHJjZCwgJmxlbmd0aCk7CiAJaWYgKHJjKSB7Ci0JCVBSSU5UX0VSUigicmVhZF9jb25mX2RhdGEgZm9yIGRldmljZSAlcyByZXR1cm5lZCAlaVxuIiwKKwkJUFJJTlRfRVJSKCJxZXRoX3JlYWRfY29uZl9kYXRhIGZvciBkZXZpY2UgJXMgcmV0dXJuZWQgJWlcbiIsCiAJCQkgIENBUkRfRERFVl9JRChjYXJkKSwgcmMpOwogCQlyZXR1cm4gcmM7CiAJfQpAQCAtMTIyMyw2ICsxMjg5LDcgQEAKIAljYXJkLT5pbmZvLmN1bGEgPSBwcmNkWzYzXTsKIAljYXJkLT5pbmZvLmd1ZXN0bGFuID0gKChwcmNkWzB4MTBdID09IF9hc2NlYmNbJ1YnXSkgJiYKIAkJCSAgICAgICAocHJjZFsweDExXSA9PSBfYXNjZWJjWydNJ10pKTsKKwlrZnJlZShwcmNkKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjI3OCw3ICsyMzQ1LDcgQEAKIAkgICAgKGNhcmQtPmluZm8ubGlua190eXBlID09IFFFVEhfTElOS19UWVBFX0xBTkVfVFIpKQogCSAJcmV0dXJuIHRyX3R5cGVfdHJhbnMoc2tiLGRldik7CiAjZW5kaWYgLyogQ09ORklHX1RSICovCi0Jc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOworCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CiAJc2tiX3B1bGwoc2tiLCBFVEhfSExFTiApOwogCWV0aCA9IGV0aF9oZHIoc2tiKTsKIApAQCAtMjMwNiw5ICsyMzczLDkgQEAKIAlzdHJ1Y3QgaXBoZHIgKmlwX2hkcjsKIAogCVFFVEhfREJGX1RFWFQodHJhY2UsNSwic2tiZmt0ciIpOwotCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YSAtIFFFVEhfRkFLRV9MTF9MRU5fVFI7CisJc2tiX3NldF9tYWNfaGVhZGVyKHNrYiwgLVFFVEhfRkFLRV9MTF9MRU5fVFIpOwogCS8qIHRoaXMgaXMgYSBmYWtlIGV0aGVybmV0IGhlYWRlciAqLwotCWZha2VfaGRyID0gKHN0cnVjdCB0cmhfaGRyICopIHNrYi0+bWFjLnJhdzsKKwlmYWtlX2hkciA9IHRyX2hkcihza2IpOwogCiAJLyogdGhlIGRlc3RpbmF0aW9uIE1BQyBhZGRyZXNzICovCiAJc3dpdGNoIChza2ItPnBrdF90eXBlKXsKQEAgLTIzNTksOSArMjQyNiw5IEBACiAJc3RydWN0IGlwaGRyICppcF9oZHI7CiAKIAlRRVRIX0RCRl9URVhUKHRyYWNlLDUsInNrYmZrZXRoIik7Ci0Jc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhIC0gUUVUSF9GQUtFX0xMX0xFTl9FVEg7CisJc2tiX3NldF9tYWNfaGVhZGVyKHNrYiwgLVFFVEhfRkFLRV9MTF9MRU5fRVRIKTsKIAkvKiB0aGlzIGlzIGEgZmFrZSBldGhlcm5ldCBoZWFkZXIgKi8KLQlmYWtlX2hkciA9IChzdHJ1Y3QgZXRoaGRyICopIHNrYi0+bWFjLnJhdzsKKwlmYWtlX2hkciA9IGV0aF9oZHIoc2tiKTsKIAogCS8qIHRoZSBkZXN0aW5hdGlvbiBNQUMgYWRkcmVzcyAqLwogCXN3aXRjaCAoc2tiLT5wa3RfdHlwZSl7CkBAIC0yNDYxLDcgKzI1MjgsNyBAQAogCWlmIChjYXJkLT5vcHRpb25zLmZha2VfbGwpCiAJCXFldGhfcmVidWlsZF9za2JfZmFrZV9sbChjYXJkLCBza2IsIGhkcik7CiAJZWxzZQotCQlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CiAJc2tiLT5pcF9zdW1tZWQgPSBjYXJkLT5vcHRpb25zLmNoZWNrc3VtX3R5cGU7CiAJaWYgKGNhcmQtPm9wdGlvbnMuY2hlY2tzdW1fdHlwZSA9PSBIV19DSEVDS1NVTU1JTkcpewogCQlpZiAoIChoZHItPmhkci5sMy5leHRfZmxhZ3MgJgpAQCAtMjUwMSw3ICsyNTY4LDggQEAKIAkJCXZsYW5fdGFnID0gcWV0aF9yZWJ1aWxkX3NrYihjYXJkLCBza2IsIGhkcik7CiAJCWVsc2UgeyAvKmluIGNhc2Ugb2YgT1NOKi8KIAkJCXNrYl9wdXNoKHNrYiwgc2l6ZW9mKHN0cnVjdCBxZXRoX2hkcikpOwotCQkJbWVtY3B5KHNrYi0+ZGF0YSwgaGRyLCBzaXplb2Yoc3RydWN0IHFldGhfaGRyKSk7CisJCQlza2JfY29weV90b19saW5lYXJfZGF0YShza2IsIGhkciwKKwkJCQkJCXNpemVvZihzdHJ1Y3QgcWV0aF9oZHIpKTsKIAkJfQogCQkvKiBpcyBkZXZpY2UgVVAgPyAqLwogCQlpZiAoIShjYXJkLT5kZXYtPmZsYWdzICYgSUZGX1VQKSl7CkBAIC0zNzc4LDkgKzM4NDYsMTEgQEAKIAl9CiAJLyogdHJ5IHNvbWV0aGluZyBlbHNlICovCiAJaWYgKHNrYi0+cHJvdG9jb2wgPT0gRVRIX1BfSVBWNikKLQkJcmV0dXJuIChza2ItPm5oLnJhd1syNF0gPT0gMHhmZikgPyBSVE5fTVVMVElDQVNUIDogMDsKKwkJcmV0dXJuIChza2JfbmV0d29ya19oZWFkZXIoc2tiKVsyNF0gPT0gMHhmZikgPworCQkJCVJUTl9NVUxUSUNBU1QgOiAwOwogCWVsc2UgaWYgKHNrYi0+cHJvdG9jb2wgPT0gRVRIX1BfSVApCi0JCXJldHVybiAoKHNrYi0+bmgucmF3WzE2XSAmIDB4ZjApID09IDB4ZTApID8gUlROX01VTFRJQ0FTVCA6IDA7CisJCXJldHVybiAoKHNrYl9uZXR3b3JrX2hlYWRlcihza2IpWzE2XSAmIDB4ZjApID09IDB4ZTApID8KKwkJCQlSVE5fTVVMVElDQVNUIDogMDsKIAkvKiAuLi4gKi8KIAlpZiAoIW1lbWNtcChza2ItPmRhdGEsIHNrYi0+ZGV2LT5icm9hZGNhc3QsIDYpKQogCQlyZXR1cm4gUlROX0JST0FEQ0FTVDsKQEAgLTM4MTgsMTggKzM4ODgsMjAgQEAKIAkJCXJldHVybiBjYXJkLT5pbmZvLmlzX211bHRpY2FzdF9kaWZmZXJlbnQgJgogCQkJCShjYXJkLT5xZGlvLm5vX291dF9xdWV1ZXMgLSAxKTsKIAkJaWYgKGNhcmQtPnFkaW8uZG9fcHJpb19xdWV1ZWluZyAmJiAoaXB2ID09IDQpKSB7CisJCQljb25zdCB1OCB0b3MgPSBpcF9oZHIoc2tiKS0+dG9zOworCiAJCQlpZiAoY2FyZC0+cWRpby5kb19wcmlvX3F1ZXVlaW5nPT1RRVRIX1BSSU9fUV9JTkdfVE9TKXsKLQkJCQlpZiAoc2tiLT5uaC5pcGgtPnRvcyAmIElQX1RPU19OT1RJTVBPUlRBTlQpCisJCQkJaWYgKHRvcyAmIElQX1RPU19OT1RJTVBPUlRBTlQpCiAJCQkJCXJldHVybiAzOwotCQkJCWlmIChza2ItPm5oLmlwaC0+dG9zICYgSVBfVE9TX0hJR0hSRUxJQUJJTElUWSkKKwkJCQlpZiAodG9zICYgSVBfVE9TX0hJR0hSRUxJQUJJTElUWSkKIAkJCQkJcmV0dXJuIDI7Ci0JCQkJaWYgKHNrYi0+bmguaXBoLT50b3MgJiBJUF9UT1NfSElHSFRIUk9VR0hQVVQpCisJCQkJaWYgKHRvcyAmIElQX1RPU19ISUdIVEhST1VHSFBVVCkKIAkJCQkJcmV0dXJuIDE7Ci0JCQkJaWYgKHNrYi0+bmguaXBoLT50b3MgJiBJUF9UT1NfTE9XREVMQVkpCisJCQkJaWYgKHRvcyAmIElQX1RPU19MT1dERUxBWSkKIAkJCQkJcmV0dXJuIDA7CiAJCQl9CiAJCQlpZiAoY2FyZC0+cWRpby5kb19wcmlvX3F1ZXVlaW5nPT1RRVRIX1BSSU9fUV9JTkdfUFJFQykKLQkJCQlyZXR1cm4gMyAtIChza2ItPm5oLmlwaC0+dG9zID4+IDYpOworCQkJCXJldHVybiAzIC0gKHRvcyA+PiA2KTsKIAkJfSBlbHNlIGlmIChjYXJkLT5xZGlvLmRvX3ByaW9fcXVldWVpbmcgJiYgKGlwdiA9PSA2KSkgewogCQkJLyogVE9ETzogSVB2NiEhISAqLwogCQl9CkBAIC0zODY2LDkgKzM5MzgsOSBAQAogCQkgKiBtZW1jcHlzIGluc3RlYWQgb2Ygb25lIG1lbW1vdmUgdG8gc2F2ZSBjeWNsZXMuCiAJCSAqLwogCQlza2JfcHVzaChza2IsIFZMQU5fSExFTik7Ci0JCW1lbWNweShza2ItPmRhdGEsIHNrYi0+ZGF0YSArIDQsIDQpOwotCQltZW1jcHkoc2tiLT5kYXRhICsgNCwgc2tiLT5kYXRhICsgOCwgNCk7Ci0JCW1lbWNweShza2ItPmRhdGEgKyA4LCBza2ItPmRhdGEgKyAxMiwgNCk7CisJCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhKHNrYiwgc2tiLT5kYXRhICsgNCwgNCk7CisJCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhX29mZnNldChza2IsIDQsIHNrYi0+ZGF0YSArIDgsIDQpOworCQlza2JfY29weV90b19saW5lYXJfZGF0YV9vZmZzZXQoc2tiLCA4LCBza2ItPmRhdGEgKyAxMiwgNCk7CiAJCXRhZyA9ICh1MTYgKikoc2tiLT5kYXRhICsgMTIpOwogCQkvKgogCQkgKiBmaXJzdCB0d28gYnl0ZXMgID0gRVRIX1BfODAyMVEgKDB4ODEwMCkKQEAgLTQwMzksNyArNDExMSw4IEBACiAJCQkgICAgKigodTMyICopIHNrYi0+ZHN0LT5uZWlnaGJvdXItPnByaW1hcnlfa2V5KTsKIAkJfSBlbHNlIHsKIAkJCS8qIGZpbGwgaW4gZGVzdGluYXRpb24gYWRkcmVzcyB1c2VkIGluIGlwIGhlYWRlciAqLwotCQkJKigodTMyICopICgmaGRyLT5oZHIubDMuZGVzdF9hZGRyWzEyXSkpID0gc2tiLT5uaC5pcGgtPmRhZGRyOworCQkJKigodTMyICopKCZoZHItPmhkci5sMy5kZXN0X2FkZHJbMTJdKSkgPQorCQkJCQkJCSAgIGlwX2hkcihza2IpLT5kYWRkcjsKIAkJfQogCX0gZWxzZSBpZiAoaXB2ID09IDYpIHsgLyogSVB2NiBvciBwYXNzdGhydSAqLwogCQloZHItPmhkci5sMy5mbGFncyA9IHFldGhfZ2V0X3FldGhfaGRyX2ZsYWdzNihjYXN0X3R5cGUpOwpAQCAtNDA0OCw3ICs0MTIxLDggQEAKIAkJCSAgICAgICBza2ItPmRzdC0+bmVpZ2hib3VyLT5wcmltYXJ5X2tleSwgMTYpOwogCQl9IGVsc2UgewogCQkJLyogZmlsbCBpbiBkZXN0aW5hdGlvbiBhZGRyZXNzIHVzZWQgaW4gaXAgaGVhZGVyICovCi0JCQltZW1jcHkoaGRyLT5oZHIubDMuZGVzdF9hZGRyLCAmc2tiLT5uaC5pcHY2aC0+ZGFkZHIsIDE2KTsKKwkJCW1lbWNweShoZHItPmhkci5sMy5kZXN0X2FkZHIsCisJCQkgICAgICAgJmlwdjZfaGRyKHNrYiktPmRhZGRyLCAxNik7CiAJCX0KIAl9IGVsc2UgeyAvKiBwYXNzdGhyb3VnaCAqLwogICAgICAgICAgICAgICAgIGlmKChza2ItPmRldi0+dHlwZSA9PSBBUlBIUkRfSUVFRTgwMl9UUikgJiYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9tcGMuaCBiL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9tcGMuaAppbmRleCAwNDc3YzQ3Li5kNzRiYzQzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL25ldC9xZXRoX21wYy5oCisrKyBiL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9tcGMuaApAQCAtMzcsNiArMzcsNyBAQAogCiAjZGVmaW5lIFFFVEhfQ0xFQVJfQ0hBTk5FTF9QQVJNCS0xMAogI2RlZmluZSBRRVRIX0hBTFRfQ0hBTk5FTF9QQVJNCS0xMQorI2RlZmluZSBRRVRIX1JDRF9QQVJNIC0xMgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBJUCBBc3Npc3QgcmVsYXRlZCBkZWZpbml0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvbmV0L3FldGhfcHJvYy5jIGIvZHJpdmVycy9zMzkwL25ldC9xZXRoX3Byb2MuYwppbmRleCA4MWY4MDVjLi44OWQ1NmM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvbmV0L3FldGhfcHJvYy5jCisrKyBiL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9wcm9jLmMKQEAgLTM3LDcgKzM3LDYgQEAKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBOVUxMOwogCWxvZmZfdCBuciA9IDA7CiAKLQlkb3duX3JlYWQoJnFldGhfY2N3Z3JvdXBfZHJpdmVyLmRyaXZlci5idXMtPnN1YnN5cy5yd3NlbSk7CiAJaWYgKCpvZmZzZXQgPT0gMCkKIAkJcmV0dXJuIFNFUV9TVEFSVF9UT0tFTjsKIAl3aGlsZSAoMSkgewpAQCAtNTMsNyArNTIsNiBAQAogc3RhdGljIHZvaWQKIHFldGhfcHJvY2ZpbGVfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzLCB2b2lkKiBpdCkKIHsKLQl1cF9yZWFkKCZxZXRoX2Njd2dyb3VwX2RyaXZlci5kcml2ZXIuYnVzLT5zdWJzeXMucndzZW0pOwogfQogCiBzdGF0aWMgdm9pZCAqCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvbmV0L3FldGhfdHNvLmggYi9kcml2ZXJzL3MzOTAvbmV0L3FldGhfdHNvLmgKaW5kZXggMTQ1MDRhZi4uYzIwZTkyMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL25ldC9xZXRoX3Rzby5oCisrKyBiL2RyaXZlcnMvczM5MC9uZXQvcWV0aF90c28uaApAQCAtNDAsOCArNDAsOCBAQAogCVFFVEhfREJGX1RFWFQodHJhY2UsIDUsICJ0c29maGRyIik7CiAKIAloZHIgID0gKHN0cnVjdCBxZXRoX2hkcl90c28gKikgc2tiLT5kYXRhOwotCWlwaCAgPSBza2ItPm5oLmlwaDsKLQl0Y3BoID0gc2tiLT5oLnRoOworCWlwaCAgPSBpcF9oZHIoc2tiKTsKKwl0Y3BoID0gdGNwX2hkcihza2IpOwogCS8qZml4IGhlYWRlciB0byBUU08gdmFsdWVzIC4uLiovCiAJaGRyLT5oZHIuaGRyLmwzLmlkID0gUUVUSF9IRUFERVJfVFlQRV9UU087CiAJLypzZXQgdmFsdWVzIHdoaWNoIGFyZSBmaXggZm9yIHRoZSBmaXJzdCBhcHByb2FjaCAuLi4qLwpAQCAtNjMsMTMgKzYzLDkgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZAogcWV0aF90c29fc2V0X3RjcGlwX2hlYWRlcihzdHJ1Y3QgcWV0aF9jYXJkICpjYXJkLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXN0cnVjdCBpcGhkciAqaXBoOwotCXN0cnVjdCBpcHY2aGRyICppcDZoOwotCXN0cnVjdCB0Y3BoZHIgKnRjcGg7Ci0KLQlpcGggID0gc2tiLT5uaC5pcGg7Ci0JaXA2aCA9IHNrYi0+bmguaXB2Nmg7Ci0JdGNwaCA9IHNrYi0+aC50aDsKKwlzdHJ1Y3QgaXBoZHIgKmlwaCAgICA9IGlwX2hkcihza2IpOworCXN0cnVjdCBpcHY2aGRyICppcDZoID0gaXB2Nl9oZHIoc2tiKTsKKwlzdHJ1Y3QgdGNwaGRyICp0Y3BoICA9IHRjcF9oZHIoc2tiKTsKIAogCXRjcGgtPmNoZWNrID0gMDsKIAlpZiAoc2tiLT5wcm90b2NvbCA9PSBFVEhfUF9JUFY2KSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvczM5MG1hY2guYyBiL2RyaXZlcnMvczM5MC9zMzkwbWFjaC5jCmluZGV4IDgwNmJiMWEuLjY0NGEwNmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9zMzkwbWFjaC5jCisrKyBiL2RyaXZlcnMvczM5MC9zMzkwbWFjaC5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSAiY2lvL2Npby5oIgogI2luY2x1ZGUgImNpby9jaHNjLmgiCiAjaW5jbHVkZSAiY2lvL2Nzcy5oIgorI2luY2x1ZGUgImNpby9jaHAuaCIKICNpbmNsdWRlICJzMzkwbWFjaC5oIgogCiBzdGF0aWMgc3RydWN0IHNlbWFwaG9yZSBtX3NlbTsKQEAgLTQ0LDE0ICs0NSwxMyBAQAogczM5MF9jb2xsZWN0X2Nyd19pbmZvKHZvaWQgKnBhcmFtKQogewogCXN0cnVjdCBjcncgY3J3WzJdOwotCWludCBjY29kZSwgcmV0LCBzbG93OworCWludCBjY29kZTsKIAlzdHJ1Y3Qgc2VtYXBob3JlICpzZW07CiAJdW5zaWduZWQgaW50IGNoYWluOwogCiAJc2VtID0gKHN0cnVjdCBzZW1hcGhvcmUgKilwYXJhbTsKIHJlcGVhdDoKIAlkb3duX2ludGVycnVwdGlibGUoc2VtKTsKLQlzbG93ID0gMDsKIAljaGFpbiA9IDA7CiAJd2hpbGUgKDEpIHsKIAkJaWYgKHVubGlrZWx5KGNoYWluID4gMSkpIHsKQEAgLTg0LDkgKzg0LDggQEAKIAkJLyogQ2hlY2sgZm9yIG92ZXJmbG93cy4gKi8KIAkJaWYgKGNyd1tjaGFpbl0ub2ZsdykgewogCQkJcHJfZGVidWcoIiVzOiBjcncgb3ZlcmZsb3cgZGV0ZWN0ZWQhXG4iLCBfX0ZVTkNUSU9OX18pOwotCQkJY3NzX3JlaXRlcmF0ZV9zdWJjaGFubmVscygpOworCQkJY3NzX3NjaGVkdWxlX2V2YWxfYWxsKCk7CiAJCQljaGFpbiA9IDA7Ci0JCQlzbG93ID0gMTsKIAkJCWNvbnRpbnVlOwogCQl9CiAJCXN3aXRjaCAoY3J3W2NoYWluXS5yc2MpIHsKQEAgLTk0LDEwICs5Myw3IEBACiAJCQlpZiAoY3J3WzBdLmNobiAmJiAhY2hhaW4pCiAJCQkJYnJlYWs7CiAJCQlwcl9kZWJ1Zygic291cmNlIGlzIHN1YmNoYW5uZWwgJTA0WFxuIiwgY3J3WzBdLnJzaWQpOwotCQkJcmV0ID0gY3NzX3Byb2Nlc3NfY3J3IChjcndbMF0ucnNpZCwKLQkJCQkJICAgICAgIGNoYWluID8gY3J3WzFdLnJzaWQgOiAwKTsKLQkJCWlmIChyZXQgPT0gLUVBR0FJTikKLQkJCQlzbG93ID0gMTsKKwkJCWNzc19wcm9jZXNzX2NydyhjcndbMF0ucnNpZCwgY2hhaW4gPyBjcndbMV0ucnNpZCA6IDApOwogCQkJYnJlYWs7CiAJCWNhc2UgQ1JXX1JTQ19NT05JVE9SOgogCQkJcHJfZGVidWcoInNvdXJjZSBpcyBtb25pdG9yaW5nIGZhY2lsaXR5XG4iKTsKQEAgLTExNiwyOCArMTEyLDIzIEBACiAJCQl9CiAJCQlzd2l0Y2ggKGNyd1swXS5lcmMpIHsKIAkJCWNhc2UgQ1JXX0VSQ19JUEFSTTogLyogUGF0aCBoYXMgY29tZS4gKi8KLQkJCQlyZXQgPSBjaHBfcHJvY2Vzc19jcncoY3J3WzBdLnJzaWQsIDEpOworCQkJCWNocF9wcm9jZXNzX2NydyhjcndbMF0ucnNpZCwgMSk7CiAJCQkJYnJlYWs7CiAJCQljYXNlIENSV19FUkNfUEVSUkk6IC8qIFBhdGggaGFzIGdvbmUuICovCiAJCQljYXNlIENSV19FUkNfUEVSUk46Ci0JCQkJcmV0ID0gY2hwX3Byb2Nlc3NfY3J3KGNyd1swXS5yc2lkLCAwKTsKKwkJCQljaHBfcHJvY2Vzc19jcncoY3J3WzBdLnJzaWQsIDApOwogCQkJCWJyZWFrOwogCQkJZGVmYXVsdDoKIAkJCQlwcl9kZWJ1ZygiRG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlIGVyYz0leFxuIiwKIAkJCQkJIGNyd1swXS5lcmMpOwotCQkJCXJldCA9IDA7CiAJCQl9Ci0JCQlpZiAocmV0ID09IC1FQUdBSU4pCi0JCQkJc2xvdyA9IDE7CiAJCQlicmVhazsKIAkJY2FzZSBDUldfUlNDX0NPTkZJRzoKIAkJCXByX2RlYnVnKCJzb3VyY2UgaXMgY29uZmlndXJhdGlvbi1hbGVydCBmYWNpbGl0eVxuIik7CiAJCQlicmVhazsKIAkJY2FzZSBDUldfUlNDX0NTUzoKIAkJCXByX2RlYnVnKCJzb3VyY2UgaXMgY2hhbm5lbCBzdWJzeXN0ZW1cbiIpOwotCQkJcmV0ID0gY2hzY19wcm9jZXNzX2NydygpOwotCQkJaWYgKHJldCA9PSAtRUFHQUlOKQotCQkJCXNsb3cgPSAxOworCQkJY2hzY19wcm9jZXNzX2NydygpOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlwcl9kZWJ1ZygidW5rbm93biBzb3VyY2VcbiIpOwpAQCAtMTQ2LDggKzEzNyw2IEBACiAJCS8qIGNoYWluIGlzIGFsd2F5cyAwIG9yIDEgaGVyZS4gKi8KIAkJY2hhaW4gPSBjcndbY2hhaW5dLmNobiA/IGNoYWluICsgMSA6IDA7CiAJfQotCWlmIChzbG93KQotCQlxdWV1ZV93b3JrKHNsb3dfcGF0aF93cSwgJnNsb3dfcGF0aF93b3JrKTsKIAlnb3RvIHJlcGVhdDsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9zeXNpbmZvLmMgYi9kcml2ZXJzL3MzOTAvc3lzaW5mby5jCmluZGV4IDA5MDc0M2QuLjE5MzQzZjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9zeXNpbmZvLmMKKysrIGIvZHJpdmVycy9zMzkwL3N5c2luZm8uYwpAQCAtMzU3LDYgKzM1NywyNCBAQAogCiBfX2luaXRjYWxsKGNyZWF0ZV9wcm9jX3N5c2luZm8pOwogCitpbnQgZ2V0X2NwdV9jYXBhYmlsaXR5KHVuc2lnbmVkIGludCAqY2FwYWJpbGl0eSkKK3sKKwlzdHJ1Y3Qgc3lzaW5mb18xXzJfMiAqaW5mbzsKKwlpbnQgcmM7CisKKwlpbmZvID0gKHZvaWQgKikgZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOworCWlmICghaW5mbykKKwkJcmV0dXJuIC1FTk9NRU07CisJcmMgPSBzdHNpKGluZm8sIDEsIDIsIDIpOworCWlmIChyYyA9PSAtRU5PU1lTKQorCQlnb3RvIG91dDsKKwlyYyA9IDA7CisJKmNhcGFiaWxpdHkgPSBpbmZvLT5jYXBhYmlsaXR5Oworb3V0OgorCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgaW5mbyk7CisJcmV0dXJuIHJjOworfQorCiAvKgogICogQ1BVIGNhcGFiaWxpdHkgbWlnaHQgaGF2ZSBjaGFuZ2VkLiBUaGVyZWZvcmUgcmVjYWxjdWxhdGUgbG9vcHNfcGVyX2ppZmZ5LgogICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NidXMvY2hhci9lbnZjdHJsLmMgYi9kcml2ZXJzL3NidXMvY2hhci9lbnZjdHJsLmMKaW5kZXggMmNlYTRmNS4uZjJiZTJlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zYnVzL2NoYXIvZW52Y3RybC5jCisrKyBiL2RyaXZlcnMvc2J1cy9jaGFyL2VudmN0cmwuYwpAQCAtNzI2LDcgKzcyNiw3IEBACiAgKiBSZXR1cm46IE5vbmUuCiAgKi8KIHN0YXRpYyB2b2lkIGVudmN0cmxfc2V0X21vbihzdHJ1Y3QgaTJjX2NoaWxkX3QgKnBjaGlsZCwKLQkJCSAgICBjaGFyICpjaG5sX2Rlc2MsCisJCQkgICAgY29uc3QgY2hhciAqY2hubF9kZXNjLAogCQkJICAgIGludCBjaG5sX25vKQogewogCS8qIEZpcm13YXJlIG9ubHkgaGFzIHRlbXBlcmF0dXJlIHR5cGUuICBJdCBkb2VzIG5vdCBkaXN0aW5ndWlzaApAQCAtNzYzLDggKzc2Myw4IEBACiBzdGF0aWMgdm9pZCBlbnZjdHJsX2luaXRfYWRjKHN0cnVjdCBpMmNfY2hpbGRfdCAqcGNoaWxkLCBzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwKQogewogCWludCBpID0gMCwgbGVuOwotCWNoYXIgKnBvczsKLQl1bnNpZ25lZCBpbnQgKnB2YWw7CisJY29uc3QgY2hhciAqcG9zOworCWNvbnN0IHVuc2lnbmVkIGludCAqcHZhbDsKIAogCS8qIEZpcm13YXJlIGRlc2NyaWJlIGNoYW5uZWxzIGludG8gYSBzdHJlYW0gc2VwYXJhdGVkIGJ5IGEgJ1wwJy4gKi8KIAlwb3MgPSBvZl9nZXRfcHJvcGVydHkoZHAsICJjaGFubmVscy1kZXNjcmlwdGlvbiIsICZsZW4pOwpAQCAtODU5LDcgKzg1OSw3IEBACiB7CiAJaW50IGxlbiwgaSwgdGJsc19zaXplID0gMDsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwID0gZWRldl9jaGlsZC0+cHJvbV9ub2RlOwotCXZvaWQgKnB2YWw7CisJY29uc3Qgdm9pZCAqcHZhbDsKIAogCS8qIEdldCBkZXZpY2UgYWRkcmVzcy4gKi8KIAlwdmFsID0gb2ZfZ2V0X3Byb3BlcnR5KGRwLCAicmVnIiwgJmxlbik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NidXMvY2hhci9mbGFzaC5jIGIvZHJpdmVycy9zYnVzL2NoYXIvZmxhc2guYwppbmRleCA2ZTk5NTA3Li4yNjJmMDFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NidXMvY2hhci9mbGFzaC5jCisrKyBiL2RyaXZlcnMvc2J1cy9jaGFyL2ZsYXNoLmMKQEAgLTE5MCw3ICsxOTAsNyBAQAogCX0KIAlpZiAoIXNkZXYpIHsKICNpZmRlZiBDT05GSUdfUENJCi0JCXN0cnVjdCBsaW51eF9wcm9tX3JlZ2lzdGVycyAqZWJ1c19yZWdzOworCQljb25zdCBzdHJ1Y3QgbGludXhfcHJvbV9yZWdpc3RlcnMgKmVidXNfcmVnczsKIAogCQlmb3JfZWFjaF9lYnVzKGVidXMpIHsKIAkJCWZvcl9lYWNoX2VidXNkZXYoZWRldiwgZWJ1cykgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zYnVzL2NoYXIvb3BlbnByb20uYyBiL2RyaXZlcnMvc2J1cy9jaGFyL29wZW5wcm9tLmMKaW5kZXggNTA0MWM5ZC4uZmJmZWI4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zYnVzL2NoYXIvb3BlbnByb20uYworKysgYi9kcml2ZXJzL3NidXMvY2hhci9vcGVucHJvbS5jCkBAIC00NCw3ICs0NCw2IEBACiAjaW5jbHVkZSA8YXNtL29wZW5wcm9taW8uaD4KICNpZmRlZiBDT05GSUdfUENJCiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8YXNtL3BibS5oPgogI2VuZGlmCiAKIE1PRFVMRV9BVVRIT1IoIlRob21hcyBLLiBEeWFzICh0ZHlhc0Bub2MucnV0Z2Vycy5lZHUpIGFuZCBFZGRpZSBDLiBEb3N0ICAoZWNkQHNreW5ldC5iZSkiKTsKQEAgLTE0MSw3ICsxNDAsNyBAQAogCiBzdGF0aWMgaW50IG9wcm9tZ2V0cHJvcCh2b2lkIF9fdXNlciAqYXJncCwgc3RydWN0IGRldmljZV9ub2RlICpkcCwgc3RydWN0IG9wZW5wcm9taW8gKm9wLCBpbnQgYnVmc2l6ZSkKIHsKLQl2b2lkICpwdmFsOworCWNvbnN0IHZvaWQgKnB2YWw7CiAJaW50IGxlbjsKIAogCWlmICghZHAgfHwKQEAgLTI0OCwxOCArMjQ3LDE3IEBACiAJaWYgKGJ1ZnNpemUgPj0gMipzaXplb2YoaW50KSkgewogI2lmZGVmIENPTkZJR19QQ0kKIAkJc3RydWN0IHBjaV9kZXYgKnBkZXY7Ci0JCXN0cnVjdCBwY2lkZXZfY29va2llICpwY3A7CisJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHA7CisKIAkJcGRldiA9IHBjaV9nZXRfYnVzX2FuZF9zbG90ICgoKGludCAqKSBvcC0+b3Byb21fYXJyYXkpWzBdLAogCQkJCSAgICAgICgoaW50ICopIG9wLT5vcHJvbV9hcnJheSlbMV0pOwogCi0JCXBjcCA9IHBkZXYtPnN5c2RhdGE7Ci0JCWlmIChwY3AgIT0gTlVMTCkgewotCQkJZHAgPSBwY3AtPnByb21fbm9kZTsKLQkJCWRhdGEtPmN1cnJlbnRfbm9kZSA9IGRwOwotCQkJKigoaW50ICopb3AtPm9wcm9tX2FycmF5KSA9IGRwLT5ub2RlOwotCQkJb3AtPm9wcm9tX3NpemUgPSBzaXplb2YoaW50KTsKLQkJCWVyciA9IGNvcHlvdXQoYXJncCwgb3AsIGJ1ZnNpemUgKyBzaXplb2YoaW50KSk7Ci0JCX0KKwkJZHAgPSBwY2lfZGV2aWNlX3RvX09GX25vZGUocGRldik7CisJCWRhdGEtPmN1cnJlbnRfbm9kZSA9IGRwOworCQkqKChpbnQgKilvcC0+b3Byb21fYXJyYXkpID0gZHAtPm5vZGU7CisJCW9wLT5vcHJvbV9zaXplID0gc2l6ZW9mKGludCk7CisJCWVyciA9IGNvcHlvdXQoYXJncCwgb3AsIGJ1ZnNpemUgKyBzaXplb2YoaW50KSk7CisKIAkJcGNpX2Rldl9wdXQocGRldik7CiAjZW5kaWYKIAl9CkBAIC00MTAsNyArNDA4LDcgQEAKIAlzdHJ1Y3Qgb3Bpb2NkZXNjIG9wOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHA7CiAJY2hhciAqc3RyOwotCXZvaWQgKnB2YWw7CisJY29uc3Qgdm9pZCAqcHZhbDsKIAlpbnQgZXJyLCBsZW47CiAKIAlpZiAoY29weV9mcm9tX3VzZXIoJm9wLCBhcmdwLCBzaXplb2Yob3ApKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2J1cy9zYnVzLmMgYi9kcml2ZXJzL3NidXMvc2J1cy5jCmluZGV4IDYzNDlkZDYuLmVlZTU5MGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2J1cy9zYnVzLmMKKysrIGIvZHJpdmVycy9zYnVzL3NidXMuYwpAQCAtMzUsNyArMzUsNyBAQAogc3RhdGljIHZvaWQgX19pbml0IGZpbGxfc2J1c19kZXZpY2Uoc3RydWN0IGRldmljZV9ub2RlICpkcCwgc3RydWN0IHNidXNfZGV2ICpzZGV2KQogewogCXVuc2lnbmVkIGxvbmcgYmFzZTsKLQl2b2lkICpwdmFsOworCWNvbnN0IHZvaWQgKnB2YWw7CiAJaW50IGxlbiwgZXJyOwogCiAJc2Rldi0+cHJvbV9ub2RlID0gZHAtPm5vZGU7CkBAIC04Niw3ICs4Niw3IEBACiAKIHN0YXRpYyB2b2lkIF9faW5pdCBzYnVzX2J1c19yYW5nZXNfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwLCBzdHJ1Y3Qgc2J1c19idXMgKnNidXMpCiB7Ci0Jdm9pZCAqcHZhbDsKKwljb25zdCB2b2lkICpwdmFsOwogCWludCBsZW47CiAKIAlwdmFsID0gb2ZfZ2V0X3Byb3BlcnR5KGRwLCAicmFuZ2VzIiwgJmxlbik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvS2NvbmZpZyBiL2RyaXZlcnMvc2NzaS9LY29uZmlnCmluZGV4IDRjZDI4MGUuLmZjYzRjYjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9LY29uZmlnCisrKyBiL2RyaXZlcnMvc2NzaS9LY29uZmlnCkBAIC0xNzYzLDkgKzE3NjMsMTUgQEAKIAkgIFRoZSBFU1Agd2FzIGFuIG9uLWJvYXJkIFNDU0kgY29udHJvbGxlciB1c2VkIG9uIFN1biAzLzgwCiAJICBtYWNoaW5lcy4gIFNheSBZIGhlcmUgdG8gY29tcGlsZSBpbiBzdXBwb3J0IGZvciBpdC4KIAorY29uZmlnIFNDU0lfRVNQX0NPUkUKKwl0cmlzdGF0ZSAiRVNQIFNjc2kgRHJpdmVyIENvcmUiCisJZGVwZW5kcyBvbiBTQ1NJCisJc2VsZWN0IFNDU0lfU1BJX0FUVFJTCisKIGNvbmZpZyBTQ1NJX1NVTkVTUAogCXRyaXN0YXRlICJTcGFyYyBFU1AgU2NzaSBEcml2ZXIiCiAJZGVwZW5kcyBvbiBTQlVTICYmIFNDU0kKKwlzZWxlY3QgU0NTSV9FU1BfQ09SRQogCWhlbHAKIAkgIFRoaXMgaXMgdGhlIGRyaXZlciBmb3IgdGhlIFN1biBFU1AgU0NTSSBob3N0IGFkYXB0ZXIuIFRoZSBFU1AKIAkgIGNoaXBzZXQgaXMgcHJlc2VudCBpbiBtb3N0IFNQQVJDIFNCVVMtYmFzZWQgY29tcHV0ZXJzLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL01ha2VmaWxlIGIvZHJpdmVycy9zY3NpL01ha2VmaWxlCmluZGV4IDc5ZWNmNGUuLjcwY2ZmNGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3Njc2kvTWFrZWZpbGUKQEAgLTEwNiw3ICsxMDYsOCBAQAogb2JqLSQoQ09ORklHX01FR0FSQUlEX05FV0dFTikJKz0gbWVnYXJhaWQvCiBvYmotJChDT05GSUdfTUVHQVJBSURfU0FTKQkrPSBtZWdhcmFpZC8KIG9iai0kKENPTkZJR19TQ1NJX0FDQVJEKQkrPSBhdHA4NzB1Lm8KLW9iai0kKENPTkZJR19TQ1NJX1NVTkVTUCkJKz0gZXNwLm8KK29iai0kKENPTkZJR19TQ1NJX0VTUF9DT1JFKQkrPSBlc3Bfc2NzaS5vCitvYmotJChDT05GSUdfU0NTSV9TVU5FU1ApCSs9IHN1bl9lc3Aubwogb2JqLSQoQ09ORklHX1NDU0lfR0RUSCkJCSs9IGdkdGgubwogb2JqLSQoQ09ORklHX1NDU0lfSU5JVElPKQkrPSBpbml0aW8ubwogb2JqLSQoQ09ORklHX1NDU0lfSU5JQTEwMCkJKz0gYTEwMHUydy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvZXNwLmMgYi9kcml2ZXJzL3Njc2kvZXNwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjMmZlODAuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zY3NpL2VzcC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDM5NCArMCwwIEBACi0vKiBlc3AuYzogRVNQIFN1biBTQ1NJIGRyaXZlci4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTgsIDIwMDYgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBkYXZlbWxvZnQubmV0KQotICovCi0KLS8qIFRPRE86Ci0gKgotICogMSkgTWF5YmUgZGlzYWJsZSBwYXJpdHkgY2hlY2tpbmcgaW4gY29uZmlnIHJlZ2lzdGVyIG9uZSBmb3IgU0NTSTEKLSAqICAgIHRhcmdldHMuICAoR2lsbW9yZSBzYXlzIHBhcml0eSBlcnJvciBvbiB0aGUgU0J1cyBjYW4gbG9jayB1cAotICogICAgb2xkIHN1bjRjJ3MpCi0gKiAyKSBBZGQgc3VwcG9ydCBmb3IgRE1BMiBwaXBlbGluaW5nLgotICogMykgQWRkIHRhZ2dlZCBxdWV1ZWluZy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KLSNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RhdC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotCi0jaW5jbHVkZSAiZXNwLmgiCi0KLSNpbmNsdWRlIDxhc20vc2J1cy5oPgotI2luY2x1ZGUgPGFzbS9kbWEuaD4KLSNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci0jaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgotI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+Ci0jaW5jbHVkZSA8YXNtL29wbGliLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL2lycS5oPgotI2lmbmRlZiBfX3NwYXJjX3Y5X18KLSNpbmNsdWRlIDxhc20vbWFjaGluZXMuaD4KLSNpbmNsdWRlIDxhc20vaWRwcm9tLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgotI2luY2x1ZGUgPHNjc2kvc2NzaV9jbW5kLmg+Ci0jaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgotI2luY2x1ZGUgPHNjc2kvc2NzaV9laC5oPgotI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+Ci0jaW5jbHVkZSA8c2NzaS9zY3NpX3RjcS5oPgotCi0jZGVmaW5lIERSVl9WRVJTSU9OICIxLjEwMSIKLQotI2RlZmluZSBERUJVR19FU1AKLS8qICNkZWZpbmUgREVCVUdfRVNQX0hNRSAqLwotLyogI2RlZmluZSBERUJVR19FU1BfREFUQSAqLwotLyogI2RlZmluZSBERUJVR19FU1BfUVVFVUUgKi8KLS8qICNkZWZpbmUgREVCVUdfRVNQX0RJU0NPTk5FQ1QgKi8KLS8qICNkZWZpbmUgREVCVUdfRVNQX1NUQVRVUyAqLwotLyogI2RlZmluZSBERUJVR19FU1BfUEhBU0VTICovCi0vKiAjZGVmaW5lIERFQlVHX0VTUF9XT1JLQlVTICovCi0vKiAjZGVmaW5lIERFQlVHX1NUQVRFX01BQ0hJTkUgKi8KLS8qICNkZWZpbmUgREVCVUdfRVNQX0NNRFMgKi8KLS8qICNkZWZpbmUgREVCVUdfRVNQX0lSUVMgKi8KLS8qICNkZWZpbmUgREVCVUdfU0RUUiAqLwotLyogI2RlZmluZSBERUJVR19FU1BfU0cgKi8KLQotLyogVXNlIHRoZSBmb2xsb3dpbmcgdG8gc3ByaW5rbGUgZGVidWdnaW5nIG1lc3NhZ2VzIGluIGEgd2F5IHdoaWNoCi0gKiBzdWl0cyB5b3UgaWYgY29tYmluYXRpb25zIG9mIHRoZSBhYm92ZSBiZWNvbWUgdG9vIHZlcmJvc2Ugd2hlbgotICogdHJ5aW5nIHRvIHRyYWNrIGRvd24gYSBzcGVjaWZpYyBwcm9ibGVtLgotICovCi0vKiAjZGVmaW5lIERFQlVHX0VTUF9NSVNDICovCi0KLSNpZiBkZWZpbmVkKERFQlVHX0VTUCkKLSNkZWZpbmUgRVNQTE9HKGZvbykgIHByaW50ayBmb28KLSNlbHNlCi0jZGVmaW5lIEVTUExPRyhmb28pCi0jZW5kaWYgLyogKERFQlVHX0VTUCkgKi8KLQotI2lmIGRlZmluZWQoREVCVUdfRVNQX0hNRSkKLSNkZWZpbmUgRVNQSE1FKGZvbykgIHByaW50ayBmb28KLSNlbHNlCi0jZGVmaW5lIEVTUEhNRShmb28pCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoREVCVUdfRVNQX0RBVEEpCi0jZGVmaW5lIEVTUERBVEEoZm9vKSAgcHJpbnRrIGZvbwotI2Vsc2UKLSNkZWZpbmUgRVNQREFUQShmb28pCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoREVCVUdfRVNQX1FVRVVFKQotI2RlZmluZSBFU1BRVUVVRShmb28pICBwcmludGsgZm9vCi0jZWxzZQotI2RlZmluZSBFU1BRVUVVRShmb28pCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoREVCVUdfRVNQX0RJU0NPTk5FQ1QpCi0jZGVmaW5lIEVTUERJU0MoZm9vKSAgcHJpbnRrIGZvbwotI2Vsc2UKLSNkZWZpbmUgRVNQRElTQyhmb28pCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoREVCVUdfRVNQX1NUQVRVUykKLSNkZWZpbmUgRVNQU1RBVChmb28pICBwcmludGsgZm9vCi0jZWxzZQotI2RlZmluZSBFU1BTVEFUKGZvbykKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChERUJVR19FU1BfUEhBU0VTKQotI2RlZmluZSBFU1BQSEFTRShmb28pICBwcmludGsgZm9vCi0jZWxzZQotI2RlZmluZSBFU1BQSEFTRShmb28pCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoREVCVUdfRVNQX1dPUktCVVMpCi0jZGVmaW5lIEVTUEJVUyhmb28pICBwcmludGsgZm9vCi0jZWxzZQotI2RlZmluZSBFU1BCVVMoZm9vKQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKERFQlVHX0VTUF9JUlFTKQotI2RlZmluZSBFU1BJUlEoZm9vKSAgcHJpbnRrIGZvbwotI2Vsc2UKLSNkZWZpbmUgRVNQSVJRKGZvbykKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChERUJVR19TRFRSKQotI2RlZmluZSBFU1BTRFRSKGZvbykgIHByaW50ayBmb28KLSNlbHNlCi0jZGVmaW5lIEVTUFNEVFIoZm9vKQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKERFQlVHX0VTUF9NSVNDKQotI2RlZmluZSBFU1BNSVNDKGZvbykgIHByaW50ayBmb28KLSNlbHNlCi0jZGVmaW5lIEVTUE1JU0MoZm9vKQotI2VuZGlmCi0KLS8qIENvbW1hbmQgcGhhc2UgZW51bWVyYXRpb24uICovCi1lbnVtIHsKLQlub3RfaXNzdWVkICAgID0gMHgwMCwgIC8qIFN0aWxsIGluIHRoZSBpc3N1ZV9TQyBxdWV1ZS4gICAgICAgICAgKi8KLQotCS8qIFZhcmlvdXMgZm9ybXMgb2Ygc2VsZWN0aW5nIGEgdGFyZ2V0LiAqLwotI2RlZmluZSBpbl9zbGN0X21hc2sgICAgMHgxMAotCWluX3NsY3Rfbm9ybSAgPSAweDEwLCAgLyogRVNQIGlzIGFyYml0cmF0aW5nLCBub3JtYWwgc2VsZWN0aW9uICAqLwotCWluX3NsY3Rfc3RvcCAgPSAweDExLCAgLyogRVNQIHdpbGwgc2VsZWN0LCB0aGVuIHN0b3Agd2l0aCBJUlEgICAqLwotCWluX3NsY3RfbXNnICAgPSAweDEyLCAgLyogc2VsZWN0LCB0aGVuIHNlbmQgYSBtZXNzYWdlICAgICAgICAgICAqLwotCWluX3NsY3RfdGFnICAgPSAweDEzLCAgLyogc2VsZWN0IGFuZCBzZW5kIHRhZ2dlZCBxdWV1ZSBtc2cgICAgICAqLwotCWluX3NsY3Rfc25lZyAgPSAweDE0LCAgLyogc2VsZWN0IGFuZCBhY3F1aXJlIHN5bmMgY2FwYWJpbGl0aWVzICAqLwotCi0JLyogQW55IHBvc3Qgc2VsZWN0aW9uIGFjdGl2aXR5LiAqLwotI2RlZmluZSBpbl9waGFzZXNfbWFzayAgMHgyMAotCWluX2RhdGFpbiAgICAgPSAweDIwLCAgLyogRGF0YSBpcyB0cmFuc2ZlcnJpbmcgZnJvbSB0aGUgYnVzICAgICAqLwotCWluX2RhdGFvdXQgICAgPSAweDIxLCAgLyogRGF0YSBpcyB0cmFuc2ZlcnJpbmcgdG8gdGhlIGJ1cyAgICAgICAqLwotCWluX2RhdGFfZG9uZSAgPSAweDIyLCAgLyogTGFzdCBETUEgZGF0YSBvcGVyYXRpb24gZG9uZSAobWF5YmUpICAqLwotCWluX21zZ2luICAgICAgPSAweDIzLCAgLyogRWF0aW5nIG1lc3NhZ2UgZnJvbSB0YXJnZXQgICAgICAgICAgICAqLwotCWluX21zZ2luY29udCAgPSAweDI0LCAgLyogRWF0aW5nIG1vcmUgbXNnIGJ5dGVzIGZyb20gdGFyZ2V0ICAgICAqLwotCWluX21zZ2luZG9uZSAgPSAweDI1LCAgLyogRGVjaWRlIHdoYXQgdG8gZG8gd2l0aCB3aGF0IHdlIGdvdCAgICAqLwotCWluX21zZ291dCAgICAgPSAweDI2LCAgLyogU2VuZGluZyBtZXNzYWdlIHRvIHRhcmdldCAgICAgICAgICAgICAqLwotCWluX21zZ291dGRvbmUgPSAweDI3LCAgLyogRG9uZSBzZW5kaW5nIG1zZyBvdXQgICAgICAgICAgICAgICAgICAqLwotCWluX2NtZGJlZ2luICAgPSAweDI4LCAgLyogU2VuZGluZyBjbWQgYWZ0ZXIgYWJub3JtYWwgc2VsZWN0aW9uICAqLwotCWluX2NtZGVuZCAgICAgPSAweDI5LCAgLyogRG9uZSBzZW5kaW5nIHNsb3cgY21kICAgICAgICAgICAgICAgICAqLwotCWluX3N0YXR1cyAgICAgPSAweDJhLCAgLyogV2FzIGluIHN0YXR1cyBwaGFzZSwgZmluaXNoaW5nIGNtZCAgICAqLwotCWluX2ZyZWVpbmcgICAgPSAweDJiLCAgLyogZnJlZWluZyB0aGUgYnVzIGZvciBjbWQgY21wbHQgb3IgZGlzYyAqLwotCWluX3RoZV9kYXJrICAgPSAweDJjLCAgLyogRG9uJ3Qga25vdyB3aGF0IGJ1cyBwaGFzZSB3ZSBhcmUgaW4gICAqLwotCi0JLyogU3BlY2lhbCBzdGF0ZXMsIGllLiBub3Qgbm9ybWFsIGJ1cyB0cmFuc2l0aW9ucy4uLiAqLwotI2RlZmluZSBpbl9zcGVjX21hc2sgICAgMHg4MAotCWluX2Fib3J0b25lICAgPSAweDgwLCAgLyogQWJvcnRpbmcgb25lIGNvbW1hbmQgY3VycmVudGx5ICAgICAgICAqLwotCWluX2Fib3J0YWxsICAgPSAweDgxLCAgLyogQmxvd2luZyBhd2F5IGFsbCBjb21tYW5kcyB3ZSBoYXZlICAgICAqLwotCWluX3Jlc2V0ZGV2ICAgPSAweDgyLCAgLyogU0NTSSB0YXJnZXQgcmVzZXQgaW4gcHJvZ3Jlc3MgICAgICAgICAqLwotCWluX3Jlc2V0YnVzICAgPSAweDgzLCAgLyogU0NTSSBidXMgcmVzZXQgaW4gcHJvZ3Jlc3MgICAgICAgICAgICAqLwotCWluX3RndGVycm9yICAgPSAweDg0LCAgLyogVGFyZ2V0IGRpZCBzb21ldGhpbmcgc3R1cGlkICAgICAgICAgICAqLwotfTsKLQotZW51bSB7Ci0JLyogWmVybyBoYXMgc3BlY2lhbCBtZWFuaW5nLCBzZWUgc2tpcGFoZWFkWzEyXS4gKi8KLS8qMCovCWRvX25ldmVyLAotCi0vKjEqLwlkb19waGFzZV9kZXRlcm1pbmUsCi0vKjIqLwlkb19yZXNldF9idXMsCi0vKjMqLwlkb19yZXNldF9jb21wbGV0ZSwKLS8qNCovCWRvX3dvcmtfYnVzLAotLyo1Ki8JZG9faW50cl9lbmQKLX07Ci0KLS8qIEZvcndhcmQgZGVjbGFyYXRpb25zLiAqLwotc3RhdGljIGlycXJldHVybl90IGVzcF9pbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCk7Ci0KLS8qIERlYnVnZ2luZyByb3V0aW5lcyAqLwotc3RydWN0IGVzcF9jbWRzdHJpbmdzIHsKLQl1OCBjbWRjaGFyOwotCWNoYXIgKnRleHQ7Ci19IGVzcF9jbWRfc3RyaW5nc1tdID0gewotCS8qIE1pc2NlbGxhbmVvdXMgKi8KLQl7IEVTUF9DTURfTlVMTCwgIkVTUF9OT1AiLCB9LAotCXsgRVNQX0NNRF9GTFVTSCwgIkZJRk9fRkxVU0giLCB9LAotCXsgRVNQX0NNRF9SQywgIlJTVEVTUCIsIH0sCi0JeyBFU1BfQ01EX1JTLCAiUlNUU0NTSSIsIH0sCi0JLyogRGlzY29ubmVjdGVkIFN0YXRlIEdyb3VwICovCi0JeyBFU1BfQ01EX1JTRUwsICJSRVNMQ1RTRVEiLCB9LAotCXsgRVNQX0NNRF9TRUwsICJTTENUTkFUTiIsIH0sCi0JeyBFU1BfQ01EX1NFTEEsICJTTENUQVROIiwgfSwKLQl7IEVTUF9DTURfU0VMQVMsICJTTENUQVROU1RPUCIsIH0sCi0JeyBFU1BfQ01EX0VTRUwsICJFTlNMQ1RSRVNFTCIsIH0sCi0JeyBFU1BfQ01EX0RTRUwsICJESVNTRUxSRVNFTCIsIH0sCi0JeyBFU1BfQ01EX1NBMywgIlNMQ1RBVE4zIiwgfSwKLQl7IEVTUF9DTURfUlNFTDMsICJSRVNMQ1RTRVEiLCB9LAotCS8qIFRhcmdldCBTdGF0ZSBHcm91cCAqLwotCXsgRVNQX0NNRF9TTVNHLCAiU05ETVNHIiwgfSwKLQl7IEVTUF9DTURfU1NUQVQsICJTTkRTVEFUVVMiLCB9LAotCXsgRVNQX0NNRF9TREFUQSwgIlNORERBVEEiLCB9LAotCXsgRVNQX0NNRF9EU0VRLCAiRElTQ1NFUSIsIH0sCi0JeyBFU1BfQ01EX1RTRVEsICJURVJNU0VRIiwgfSwKLQl7IEVTUF9DTURfVENDU0VRLCAiVFJHVENNRENPTVBTRVEiLCB9LAotCXsgRVNQX0NNRF9EQ05DVCwgIkRJU0MiLCB9LAotCXsgRVNQX0NNRF9STVNHLCAiUkNWTVNHIiwgfSwKLQl7IEVTUF9DTURfUkNNRCwgIlJDVkNNRCIsIH0sCi0JeyBFU1BfQ01EX1JEQVRBLCAiUkNWREFUQSIsIH0sCi0JeyBFU1BfQ01EX1JDU0VRLCAiUkNWQ01EU0VRIiwgfSwKLQkvKiBJbml0aWF0b3IgU3RhdGUgR3JvdXAgKi8KLQl7IEVTUF9DTURfVEksICJUUkFOU0lORk8iLCB9LAotCXsgRVNQX0NNRF9JQ0NTRVEsICJJTklDTURTRVFDT01QIiwgfSwKLQl7IEVTUF9DTURfTU9LLCAiTVNHQUNDRVBURUQiLCB9LAotCXsgRVNQX0NNRF9UUEFELCAiVFBBRCIsIH0sCi0JeyBFU1BfQ01EX1NBVE4sICJTQVROIiwgfSwKLQl7IEVTUF9DTURfUkFUTiwgIlJBVE4iLCB9LAotfTsKLSNkZWZpbmUgTlVNX0VTUF9DT01NQU5EUyAgKChzaXplb2YoZXNwX2NtZF9zdHJpbmdzKSkgLyAoc2l6ZW9mKHN0cnVjdCBlc3BfY21kc3RyaW5ncykpKQotCi0vKiBQcmludCB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIGFuIEVTUCBjb21tYW5kICovCi1zdGF0aWMgaW5saW5lIHZvaWQgZXNwX3ByaW50X2NtZCh1OCBlc3BjbWQpCi17Ci0JdTggZG1hX2JpdCA9IGVzcGNtZCAmIEVTUF9DTURfRE1BOwotCWludCBpOwotCi0JZXNwY21kICY9IH5kbWFfYml0OwotCWZvciAoaSA9IDA7IGkgPCBOVU1fRVNQX0NPTU1BTkRTOyBpKyspCi0JCWlmIChlc3BfY21kX3N0cmluZ3NbaV0uY21kY2hhciA9PSBlc3BjbWQpCi0JCQlicmVhazsKLQlpZiAoaSA9PSBOVU1fRVNQX0NPTU1BTkRTKQotCQlwcmludGsoIkVTUF9Vbmtub3duIik7Ci0JZWxzZQotCQlwcmludGsoIiVzJXMiLCBlc3BfY21kX3N0cmluZ3NbaV0udGV4dCwKLQkJICAgICAgICgoZG1hX2JpdCkgPyAiK0RNQSIgOiAiIikpOwotfQotCi0vKiBQcmludCB0aGUgc3RhdHVzIHJlZ2lzdGVyJ3MgdmFsdWUgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBlc3BfcHJpbnRfc3RhdHJlZyh1OCBzdGF0cmVnKQotewotCXU4IHBoYXNlOwotCi0JcHJpbnRrKCJTVEFUVVM8Iik7Ci0JcGhhc2UgPSBzdGF0cmVnICYgRVNQX1NUQVRfUE1BU0s7Ci0JcHJpbnRrKCIlcywiLCAocGhhc2UgPT0gRVNQX0RPUCA/ICJEQVRBLU9VVCIgOgotCQkgICAgICAgKHBoYXNlID09IEVTUF9ESVAgPyAiREFUQS1JTiIgOgotCQkJKHBoYXNlID09IEVTUF9DTURQID8gIkNPTU1BTkQiIDoKLQkJCSAocGhhc2UgPT0gRVNQX1NUQVRQID8gIlNUQVRVUyIgOgotCQkJICAocGhhc2UgPT0gRVNQX01PUCA/ICJNU0ctT1VUIiA6Ci0JCQkgICAocGhhc2UgPT0gRVNQX01JUCA/ICJNU0dfSU4iIDoKLQkJCSAgICAidW5rbm93biIpKSkpKSkpOwotCWlmIChzdGF0cmVnICYgRVNQX1NUQVRfVERPTkUpCi0JCXByaW50aygiVFJBTlNfRE9ORSwiKTsKLQlpZiAoc3RhdHJlZyAmIEVTUF9TVEFUX1RDTlQpCi0JCXByaW50aygiVENPVU5UX1pFUk8sIik7Ci0JaWYgKHN0YXRyZWcgJiBFU1BfU1RBVF9QRVJSKQotCQlwcmludGsoIlBfRVJST1IsIik7Ci0JaWYgKHN0YXRyZWcgJiBFU1BfU1RBVF9TUEFNKQotCQlwcmludGsoIlNQQU0sIik7Ci0JaWYgKHN0YXRyZWcgJiBFU1BfU1RBVF9JTlRSKQotCQlwcmludGsoIklSUSwiKTsKLQlwcmludGsoIj4iKTsKLX0KLQotLyogUHJpbnQgdGhlIGludGVycnVwdCByZWdpc3RlcidzIHZhbHVlICovCi1zdGF0aWMgaW5saW5lIHZvaWQgZXNwX3ByaW50X2lyZWcodTggaW50cmVnKQotewotCXByaW50aygiSU5UUkVHPCAiKTsKLQlpZiAoaW50cmVnICYgRVNQX0lOVFJfUykKLQkJcHJpbnRrKCJTTENUX05BVE4gIik7Ci0JaWYgKGludHJlZyAmIEVTUF9JTlRSX1NBVE4pCi0JCXByaW50aygiU0xDVF9BVE4gIik7Ci0JaWYgKGludHJlZyAmIEVTUF9JTlRSX1JTRUwpCi0JCXByaW50aygiUlNMQ1QgIik7Ci0JaWYgKGludHJlZyAmIEVTUF9JTlRSX0ZET05FKQotCQlwcmludGsoIkZET05FICIpOwotCWlmIChpbnRyZWcgJiBFU1BfSU5UUl9CU0VSVikKLQkJcHJpbnRrKCJCU0VSViAiKTsKLQlpZiAoaW50cmVnICYgRVNQX0lOVFJfREMpCi0JCXByaW50aygiRElTQ05DVCAiKTsKLQlpZiAoaW50cmVnICYgRVNQX0lOVFJfSUMpCi0JCXByaW50aygiSUxMX0NNRCAiKTsKLQlpZiAoaW50cmVnICYgRVNQX0lOVFJfU1IpCi0JCXByaW50aygiU0NTSV9CVVNfUkVTRVQgIik7Ci0JcHJpbnRrKCI+Iik7Ci19Ci0KLS8qIFByaW50IHRoZSBzZXF1ZW5jZSBzdGVwIHJlZ2lzdGVycyBjb250ZW50cyAqLwotc3RhdGljIGlubGluZSB2b2lkIGVzcF9wcmludF9zZXFyZWcodTggc3RlcHJlZykKLXsKLQlzdGVwcmVnICY9IEVTUF9TVEVQX1ZCSVRTOwotCXByaW50aygiU1RFUDwlcz4iLAotCSAgICAgICAoc3RlcHJlZyA9PSBFU1BfU1RFUF9BU0VMID8gIlNMQ1RfQVJCX0NNUExUIiA6Ci0JCShzdGVwcmVnID09IEVTUF9TVEVQX1NJRCA/ICIxQllURV9NU0dfU0VOVCIgOgotCQkgKHN0ZXByZWcgPT0gRVNQX1NURVBfTkNNRCA/ICJOT1RfSU5fQ01EX1BIQVNFIiA6Ci0JCSAgKHN0ZXByZWcgPT0gRVNQX1NURVBfUFBDID8gIkNNRF9CWVRFU19MT1NUIiA6Ci0JCSAgIChzdGVwcmVnID09IEVTUF9TVEVQX0ZJTkk0ID8gIkNNRF9TRU5UX09LIiA6Ci0JCSAgICAiVU5LTk9XTiIpKSkpKSk7Ci19Ci0KLXN0YXRpYyBjaGFyICpwaGFzZV9zdHJpbmcoaW50IHBoYXNlKQotewotCXN3aXRjaCAocGhhc2UpIHsKLQljYXNlIG5vdF9pc3N1ZWQ6Ci0JCXJldHVybiAiVU5JU1NVRUQiOwotCWNhc2UgaW5fc2xjdF9ub3JtOgotCQlyZXR1cm4gIlNMQ1ROT1JNIjsKLQljYXNlIGluX3NsY3Rfc3RvcDoKLQkJcmV0dXJuICJTTENUU1RPUCI7Ci0JY2FzZSBpbl9zbGN0X21zZzoKLQkJcmV0dXJuICJTTENUTVNHIjsKLQljYXNlIGluX3NsY3RfdGFnOgotCQlyZXR1cm4gIlNMQ1RUQUciOwotCWNhc2UgaW5fc2xjdF9zbmVnOgotCQlyZXR1cm4gIlNMQ1RTTkVHIjsKLQljYXNlIGluX2RhdGFpbjoKLQkJcmV0dXJuICJEQVRBSU4iOwotCWNhc2UgaW5fZGF0YW91dDoKLQkJcmV0dXJuICJEQVRBT1VUIjsKLQljYXNlIGluX2RhdGFfZG9uZToKLQkJcmV0dXJuICJEQVRBRE9ORSI7Ci0JY2FzZSBpbl9tc2dpbjoKLQkJcmV0dXJuICJNU0dJTiI7Ci0JY2FzZSBpbl9tc2dpbmNvbnQ6Ci0JCXJldHVybiAiTVNHSU5DT05UIjsKLQljYXNlIGluX21zZ2luZG9uZToKLQkJcmV0dXJuICJNU0dJTkRPTkUiOwotCWNhc2UgaW5fbXNnb3V0OgotCQlyZXR1cm4gIk1TR09VVCI7Ci0JY2FzZSBpbl9tc2dvdXRkb25lOgotCQlyZXR1cm4gIk1TR09VVERPTkUiOwotCWNhc2UgaW5fY21kYmVnaW46Ci0JCXJldHVybiAiQ01EQkVHSU4iOwotCWNhc2UgaW5fY21kZW5kOgotCQlyZXR1cm4gIkNNREVORCI7Ci0JY2FzZSBpbl9zdGF0dXM6Ci0JCXJldHVybiAiU1RBVFVTIjsKLQljYXNlIGluX2ZyZWVpbmc6Ci0JCXJldHVybiAiRlJFRUlORyI7Ci0JY2FzZSBpbl90aGVfZGFyazoKLQkJcmV0dXJuICJDTFVFTEVTUyI7Ci0JY2FzZSBpbl9hYm9ydG9uZToKLQkJcmV0dXJuICJBQk9SVE9ORSI7Ci0JY2FzZSBpbl9hYm9ydGFsbDoKLQkJcmV0dXJuICJBQk9SVEFMTCI7Ci0JY2FzZSBpbl9yZXNldGRldjoKLQkJcmV0dXJuICJSRVNFVERFViI7Ci0JY2FzZSBpbl9yZXNldGJ1czoKLQkJcmV0dXJuICJSRVNFVEJVUyI7Ci0JY2FzZSBpbl90Z3RlcnJvcjoKLQkJcmV0dXJuICJUR1RFUlJPUiI7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuICJVTktOT1dOIjsKLQl9OwotfQotCi0jaWZkZWYgREVCVUdfU1RBVEVfTUFDSElORQotc3RhdGljIGlubGluZSB2b2lkIGVzcF9hZHZhbmNlX3BoYXNlKHN0cnVjdCBzY3NpX2NtbmQgKnMsIGludCBuZXdwaGFzZSkKLXsKLQlFU1BMT0coKCI8JXM+IiwgcGhhc2Vfc3RyaW5nKG5ld3BoYXNlKSkpOwotCXMtPlNDcC5zZW50X2NvbW1hbmQgPSBzLT5TQ3AucGhhc2U7Ci0Jcy0+U0NwLnBoYXNlID0gbmV3cGhhc2U7Ci19Ci0jZWxzZQotI2RlZmluZSBlc3BfYWR2YW5jZV9waGFzZShfX3MsIF9fbmV3cGhhc2UpIFwKLQkoX19zKS0+U0NwLnNlbnRfY29tbWFuZCA9IChfX3MpLT5TQ3AucGhhc2U7IFwKLQkoX19zKS0+U0NwLnBoYXNlID0gKF9fbmV3cGhhc2UpOwotI2VuZGlmCi0KLSNpZmRlZiBERUJVR19FU1BfQ01EUwotc3RhdGljIGlubGluZSB2b2lkIGVzcF9jbWQoc3RydWN0IGVzcCAqZXNwLCB1OCBjbWQpCi17Ci0JZXNwLT5lc3BjbWRsb2dbZXNwLT5lc3BjbWRlbnRdID0gY21kOwotCWVzcC0+ZXNwY21kZW50ID0gKGVzcC0+ZXNwY21kZW50ICsgMSkgJiAzMTsKLQlzYnVzX3dyaXRlYihjbWQsIGVzcC0+ZXJlZ3MgKyBFU1BfQ01EKTsKLX0KLSNlbHNlCi0jZGVmaW5lIGVzcF9jbWQoX19lc3AsIF9fY21kKQlcCi0Jc2J1c193cml0ZWIoKF9fY21kKSwgKChfX2VzcCktPmVyZWdzKSArIEVTUF9DTUQpCi0jZW5kaWYKLQotI2RlZmluZSBFU1BfSU5UU09GRihfX2RyZWdzKQlcCi0Jc2J1c193cml0ZWwoc2J1c19yZWFkbCgoX19kcmVncykrRE1BX0NTUikmfihETUFfSU5UX0VOQUIpLCAoX19kcmVncykrRE1BX0NTUikKLSNkZWZpbmUgRVNQX0lOVFNPTihfX2RyZWdzKQlcCi0Jc2J1c193cml0ZWwoc2J1c19yZWFkbCgoX19kcmVncykrRE1BX0NTUil8RE1BX0lOVF9FTkFCLCAoX19kcmVncykrRE1BX0NTUikKLSNkZWZpbmUgRVNQX0lSUV9QKF9fZHJlZ3MpCVwKLQkoc2J1c19yZWFkbCgoX19kcmVncykrRE1BX0NTUikgJiAoRE1BX0hORExfSU5UUnxETUFfSE5ETF9FUlJPUikpCi0KLS8qIEhvdyB3ZSB1c2UgdGhlIHZhcmlvdXMgTGludXggU0NTSSBkYXRhIHN0cnVjdHVyZXMgZm9yIG9wZXJhdGlvbi4KLSAqCi0gKiBzdHJ1Y3Qgc2NzaV9jbW5kOgotICoKLSAqICAgV2Uga2VlcCB0cmFjayBvZiB0aGUgc3luY2hyb25vdXMgY2FwYWJpbGl0aWVzIG9mIGEgdGFyZ2V0Ci0gKiAgIGluIHRoZSBkZXZpY2UgbWVtYmVyLCB1c2luZyBzeW5jX21pbl9wZXJpb2QgYW5kCi0gKiAgIHN5bmNfbWF4X29mZnNldC4gIFRoZXNlIGFyZSB0aGUgdmFsdWVzIHdlIGRpcmVjdGx5IHdyaXRlCi0gKiAgIGludG8gdGhlIEVTUCByZWdpc3RlcnMgd2hpbGUgcnVubmluZyBhIGNvbW1hbmQuICBJZiBvZmZzZXQKLSAqICAgaXMgemVybyB0aGUgRVNQIHdpbGwgdXNlIGFzeW5jaHJvbm91cyB0cmFuc2ZlcnMuCi0gKiAgIElmIHRoZSBib3JrZW4gZmxhZyBpcyBzZXQgd2UgYXNzdW1lIHdlIHNob3VsZG4ndCBldmVuIGJvdGhlcgotICogICB0cnlpbmcgdG8gbmVnb3RpYXRlIGZvciBzeW5jaHJvbm91cyB0cmFuc2ZlciBhcyB0aGlzIHRhcmdldAotICogICBpcyByZWFsbHkgc3R1cGlkLiAgSWYgd2Ugbm90aWNlIHRoZSB0YXJnZXQgaXMgZHJvcHBpbmcgdGhlCi0gKiAgIGJ1cywgYW5kIHdlIGhhdmUgYmVlbiBhbGxvd2luZyBpdCB0byBkaXNjb25uZWN0LCB3ZSBjbGVhcgotICogICB0aGUgZGlzY29ubmVjdCBmbGFnLgotICovCi0KLQotLyogTWFuaXB1bGF0aW9uIG9mIHRoZSBFU1AgY29tbWFuZCBxdWV1ZXMuICBUaGFua3MgdG8gdGhlIGFoYTE1MnggZHJpdmVyCi0gKiBhbmQgaXRzIGF1dGhvciwgSnVlcmdlbiBFLiBGaXNjaGVyLCBmb3IgdGhlIG1ldGhvZHMgdXNlZCBoZXJlLgotICogTm90ZSB0aGF0IHRoZXNlIGFyZSBwZXItRVNQIHF1ZXVlcywgbm90IGdsb2JhbCBxdWV1ZXMgbGlrZQotICogdGhlIGFoYTE1MnggZHJpdmVyIHVzZXMuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBhcHBlbmRfU0Moc3RydWN0IHNjc2lfY21uZCAqKlNDLCBzdHJ1Y3Qgc2NzaV9jbW5kICpuZXdfU0MpCi17Ci0Jc3RydWN0IHNjc2lfY21uZCAqZW5kOwotCi0JbmV3X1NDLT5ob3N0X3NjcmliYmxlID0gKHVuc2lnbmVkIGNoYXIgKikgTlVMTDsKLQlpZiAoISpTQykKLQkJKlNDID0gbmV3X1NDOwotCWVsc2UgewotCQlmb3IgKGVuZD0qU0M7ZW5kLT5ob3N0X3NjcmliYmxlO2VuZD0oc3RydWN0IHNjc2lfY21uZCAqKWVuZC0+aG9zdF9zY3JpYmJsZSkKLQkJCTsKLQkJZW5kLT5ob3N0X3NjcmliYmxlID0gKHVuc2lnbmVkIGNoYXIgKikgbmV3X1NDOwotCX0KLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHByZXBlbmRfU0Moc3RydWN0IHNjc2lfY21uZCAqKlNDLCBzdHJ1Y3Qgc2NzaV9jbW5kICpuZXdfU0MpCi17Ci0JbmV3X1NDLT5ob3N0X3NjcmliYmxlID0gKHVuc2lnbmVkIGNoYXIgKikgKlNDOwotCSpTQyA9IG5ld19TQzsKLX0KLQotc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2NzaV9jbW5kICpyZW1vdmVfZmlyc3RfU0Moc3RydWN0IHNjc2lfY21uZCAqKlNDKQotewotCXN0cnVjdCBzY3NpX2NtbmQgKnB0cjsKLQlwdHIgPSAqU0M7Ci0JaWYgKHB0cikKLQkJKlNDID0gKHN0cnVjdCBzY3NpX2NtbmQgKikgKCpTQyktPmhvc3Rfc2NyaWJibGU7Ci0JcmV0dXJuIHB0cjsKLX0KLQotc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2NzaV9jbW5kICpyZW1vdmVfU0Moc3RydWN0IHNjc2lfY21uZCAqKlNDLCBpbnQgdGFyZ2V0LCBpbnQgbHVuKQotewotCXN0cnVjdCBzY3NpX2NtbmQgKnB0ciwgKnByZXY7Ci0KLQlmb3IgKHB0ciA9ICpTQywgcHJldiA9IE5VTEw7Ci0JICAgICBwdHIgJiYgKChwdHItPmRldmljZS0+aWQgIT0gdGFyZ2V0KSB8fCAocHRyLT5kZXZpY2UtPmx1biAhPSBsdW4pKTsKLQkgICAgIHByZXYgPSBwdHIsIHB0ciA9IChzdHJ1Y3Qgc2NzaV9jbW5kICopIHB0ci0+aG9zdF9zY3JpYmJsZSkKLQkJOwotCWlmIChwdHIpIHsKLQkJaWYgKHByZXYpCi0JCQlwcmV2LT5ob3N0X3NjcmliYmxlPXB0ci0+aG9zdF9zY3JpYmJsZTsKLQkJZWxzZQotCQkJKlNDPShzdHJ1Y3Qgc2NzaV9jbW5kICopcHRyLT5ob3N0X3NjcmliYmxlOwotCX0KLQlyZXR1cm4gcHRyOwotfQotCi0vKiBSZXNldHRpbmcgdmFyaW91cyBwaWVjZXMgb2YgdGhlIEVTUCBzY3NpIGRyaXZlciBjaGlwc2V0L2J1c2VzLiAqLwotc3RhdGljIHZvaWQgZXNwX3Jlc2V0X2RtYShzdHJ1Y3QgZXNwICplc3ApCi17Ci0JaW50IGNhbl9kb19idXJzdDE2LCBjYW5fZG9fYnVyc3QzMiwgY2FuX2RvX2J1cnN0NjQ7Ci0JaW50IGNhbl9kb19zYnVzNjQ7Ci0JdTMyIHRtcDsKLQotCWNhbl9kb19idXJzdDE2ID0gKGVzcC0+YnVyc3RzICYgRE1BX0JVUlNUMTYpICE9IDA7Ci0JY2FuX2RvX2J1cnN0MzIgPSAoZXNwLT5idXJzdHMgJiBETUFfQlVSU1QzMikgIT0gMDsKLQljYW5fZG9fYnVyc3Q2NCA9IDA7Ci0JY2FuX2RvX3NidXM2NCA9IDA7Ci0JaWYgKHNidXNfY2FuX2RtYV82NGJpdChlc3AtPnNkZXYpKQotCQljYW5fZG9fc2J1czY0ID0gMTsKLQlpZiAoc2J1c19jYW5fYnVyc3Q2NChlc3AtPnNkZXYpKQotCQljYW5fZG9fYnVyc3Q2NCA9IChlc3AtPmJ1cnN0cyAmIERNQV9CVVJTVDY0KSAhPSAwOwotCi0JLyogUHVudCB0aGUgRFZNQSBpbnRvIGEga25vd24gc3RhdGUuICovCi0JaWYgKGVzcC0+ZG1hLT5yZXZpc2lvbiAhPSBkdm1haG1lKSB7Ci0JCXRtcCA9IHNidXNfcmVhZGwoZXNwLT5kcmVncyArIERNQV9DU1IpOwotCQlzYnVzX3dyaXRlbCh0bXAgfCBETUFfUlNUX1NDU0ksIGVzcC0+ZHJlZ3MgKyBETUFfQ1NSKTsKLQkJc2J1c193cml0ZWwodG1wICYgfkRNQV9SU1RfU0NTSSwgZXNwLT5kcmVncyArIERNQV9DU1IpOwotCX0KLQlzd2l0Y2ggKGVzcC0+ZG1hLT5yZXZpc2lvbikgewotCWNhc2UgZHZtYWhtZToKLQkJLyogVGhpcyBpcyB0aGUgSE1FIERWTUEgZ2F0ZSBhcnJheS4gKi8KLQotCQlzYnVzX3dyaXRlbChETUFfUkVTRVRfRkFTMzY2LCBlc3AtPmRyZWdzICsgRE1BX0NTUik7Ci0JCXNidXNfd3JpdGVsKERNQV9SU1RfU0NTSSwgZXNwLT5kcmVncyArIERNQV9DU1IpOwotCi0JCWVzcC0+cHJldl9obWVfZG1hY3NyID0gKERNQV9QQVJJVFlfT0ZGfERNQV8yQ0xLU3xETUFfU0NTSV9ESVNBQnxETUFfSU5UX0VOQUIpOwotCQllc3AtPnByZXZfaG1lX2RtYWNzciAmPSB+KERNQV9FTkFCTEV8RE1BX1NUX1dSSVRFfERNQV9CUlNUX1NaKTsKLQotCQlpZiAoY2FuX2RvX2J1cnN0NjQpCi0JCQllc3AtPnByZXZfaG1lX2RtYWNzciB8PSBETUFfQlJTVDY0OwotCQllbHNlIGlmIChjYW5fZG9fYnVyc3QzMikKLQkJCWVzcC0+cHJldl9obWVfZG1hY3NyIHw9IERNQV9CUlNUMzI7Ci0KLQkJaWYgKGNhbl9kb19zYnVzNjQpIHsKLQkJCWVzcC0+cHJldl9obWVfZG1hY3NyIHw9IERNQV9TQ1NJX1NCVVM2NDsKLQkJCXNidXNfc2V0X3NidXM2NChlc3AtPnNkZXYsIGVzcC0+YnVyc3RzKTsKLQkJfQotCi0JCS8qIFRoaXMgY2hpcCBpcyBob3JyaWJsZS4gKi8KLQkJd2hpbGUgKHNidXNfcmVhZGwoZXNwLT5kcmVncyArIERNQV9DU1IpICYgRE1BX1BFTkRfUkVBRCkKLQkJCXVkZWxheSgxKTsKLQotCQlzYnVzX3dyaXRlbCgwLCBlc3AtPmRyZWdzICsgRE1BX0NTUik7Ci0JCXNidXNfd3JpdGVsKGVzcC0+cHJldl9obWVfZG1hY3NyLCBlc3AtPmRyZWdzICsgRE1BX0NTUik7Ci0KLQkJLyogVGhpcyBpcyBuZWNlc3NhcnkgdG8gYXZvaWQgaGF2aW5nIHRoZSBTQ1NJIGNoYW5uZWwKLQkJICogZW5naW5lIGxvY2sgdXAgb24gdXMuCi0JCSAqLwotCQlzYnVzX3dyaXRlbCgwLCBlc3AtPmRyZWdzICsgRE1BX0FERFIpOwotCi0JCWJyZWFrOwotCWNhc2UgZHZtYXJldjI6Ci0JCS8qIFRoaXMgaXMgdGhlIGdhdGUgYXJyYXkgZm91bmQgaW4gdGhlIHN1bjRtCi0JCSAqIE5DUiBTQlVTIEkvTyBzdWJzeXN0ZW0uCi0JCSAqLwotCQlpZiAoZXNwLT5lcmV2ICE9IGVzcDEwMCkgewotCQkJdG1wID0gc2J1c19yZWFkbChlc3AtPmRyZWdzICsgRE1BX0NTUik7Ci0JCQlzYnVzX3dyaXRlbCh0bXAgfCBETUFfM0NMS1MsIGVzcC0+ZHJlZ3MgKyBETUFfQ1NSKTsKLQkJfQotCQlicmVhazsKLQljYXNlIGR2bWFyZXYzOgotCQl0bXAgPSBzYnVzX3JlYWRsKGVzcC0+ZHJlZ3MgKyBETUFfQ1NSKTsKLQkJdG1wICY9IH5ETUFfM0NMS1M7Ci0JCXRtcCB8PSBETUFfMkNMS1M7Ci0JCWlmIChjYW5fZG9fYnVyc3QzMikgewotCQkJdG1wICY9IH5ETUFfQlJTVF9TWjsKLQkJCXRtcCB8PSBETUFfQlJTVDMyOwotCQl9Ci0JCXNidXNfd3JpdGVsKHRtcCwgZXNwLT5kcmVncyArIERNQV9DU1IpOwotCQlicmVhazsKLQljYXNlIGR2bWFlc2MxOgotCQkvKiBUaGlzIGlzIHRoZSBETUEgdW5pdCBmb3VuZCBvbiBTQ1NJL0V0aGVyIGNhcmRzLiAqLwotCQl0bXAgPSBzYnVzX3JlYWRsKGVzcC0+ZHJlZ3MgKyBETUFfQ1NSKTsKLQkJdG1wIHw9IERNQV9BRERfRU5BQkxFOwotCQl0bXAgJj0gfkRNQV9CQ05UX0VOQUI7Ci0JCWlmICghY2FuX2RvX2J1cnN0MzIgJiYgY2FuX2RvX2J1cnN0MTYpIHsKLQkJCXRtcCB8PSBETUFfRVNDX0JVUlNUOwotCQl9IGVsc2UgewotCQkJdG1wICY9IH4oRE1BX0VTQ19CVVJTVCk7Ci0JCX0KLQkJc2J1c193cml0ZWwodG1wLCBlc3AtPmRyZWdzICsgRE1BX0NTUik7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX07Ci0JRVNQX0lOVFNPTihlc3AtPmRyZWdzKTsKLX0KLQotLyogUmVzZXQgdGhlIEVTUCBjaGlwLCBfbm90XyB0aGUgU0NTSSBidXMuICovCi1zdGF0aWMgdm9pZCBfX2luaXQgZXNwX3Jlc2V0X2VzcChzdHJ1Y3QgZXNwICplc3ApCi17Ci0JdTggZmFtaWx5X2NvZGUsIHZlcnNpb247Ci0JaW50IGk7Ci0KLQkvKiBOb3cgcmVzZXQgdGhlIEVTUCBjaGlwICovCi0JZXNwX2NtZChlc3AsIEVTUF9DTURfUkMpOwotCWVzcF9jbWQoZXNwLCBFU1BfQ01EX05VTEwgfCBFU1BfQ01EX0RNQSk7Ci0JZXNwX2NtZChlc3AsIEVTUF9DTURfTlVMTCB8IEVTUF9DTURfRE1BKTsKLQotCS8qIFJlbG9hZCB0aGUgY29uZmlndXJhdGlvbiByZWdpc3RlcnMgKi8KLQlzYnVzX3dyaXRlYihlc3AtPmNmYWN0LCBlc3AtPmVyZWdzICsgRVNQX0NGQUNUKTsKLQllc3AtPnByZXZfc3RwID0gMDsKLQlzYnVzX3dyaXRlYihlc3AtPnByZXZfc3RwLCBlc3AtPmVyZWdzICsgRVNQX1NUUCk7Ci0JZXNwLT5wcmV2X3NvZmYgPSAwOwotCXNidXNfd3JpdGViKGVzcC0+cHJldl9zb2ZmLCBlc3AtPmVyZWdzICsgRVNQX1NPRkYpOwotCXNidXNfd3JpdGViKGVzcC0+bmVnX2RlZnAsIGVzcC0+ZXJlZ3MgKyBFU1BfVElNRU8pOwotCi0JLyogVGhpcyBpcyB0aGUgb25seSBwb2ludCBhdCB3aGljaCBpdCBpcyByZWxpYWJsZSB0byByZWFkCi0JICogdGhlIElELWNvZGUgZm9yIGEgZmFzdCBFU1AgY2hpcCB2YXJpYW50cy4KLQkgKi8KLQllc3AtPm1heF9wZXJpb2QgPSAoKDM1ICogZXNwLT5jY3ljbGUpIC8gMTAwMCk7Ci0JaWYgKGVzcC0+ZXJldiA9PSBmYXN0KSB7Ci0JCXZlcnNpb24gPSBzYnVzX3JlYWRiKGVzcC0+ZXJlZ3MgKyBFU1BfVUlEKTsKLQkJZmFtaWx5X2NvZGUgPSAodmVyc2lvbiAmIDB4ZjgpID4+IDM7Ci0JCWlmIChmYW1pbHlfY29kZSA9PSAweDAyKQotCQkJZXNwLT5lcmV2ID0gZmFzMjM2OwotCQllbHNlIGlmIChmYW1pbHlfY29kZSA9PSAweDBhKQotCQkJZXNwLT5lcmV2ID0gZmFzaG1lOyAvKiBWZXJzaW9uIGlzIHVzdWFsbHkgJzUnLiAqLwotCQllbHNlCi0JCQllc3AtPmVyZXYgPSBmYXMxMDBhOwotCQlFU1BNSVNDKCgiZXNwJWQ6IEZBU1QgY2hpcCBpcyAlcyAoZmFtaWx5PSVkLCB2ZXJzaW9uPSVkKVxuIiwKLQkJCSBlc3AtPmVzcF9pZCwKLQkJCSAoZXNwLT5lcmV2ID09IGZhczIzNikgPyAiZmFzMjM2IiA6Ci0JCQkgKChlc3AtPmVyZXYgPT0gZmFzMTAwYSkgPyAiZmFzMTAwYSIgOgotCQkJICAiZmFzSE1FIiksIGZhbWlseV9jb2RlLCAodmVyc2lvbiAmIDcpKSk7Ci0KLQkJZXNwLT5taW5fcGVyaW9kID0gKCg0ICogZXNwLT5jY3ljbGUpIC8gMTAwMCk7Ci0JfSBlbHNlIHsKLQkJZXNwLT5taW5fcGVyaW9kID0gKCg1ICogZXNwLT5jY3ljbGUpIC8gMTAwMCk7Ci0JfQotCWVzcC0+bWF4X3BlcmlvZCA9IChlc3AtPm1heF9wZXJpb2QgKyAzKT4+MjsKLQllc3AtPm1pbl9wZXJpb2QgPSAoZXNwLT5taW5fcGVyaW9kICsgMyk+PjI7Ci0KLQlzYnVzX3dyaXRlYihlc3AtPmNvbmZpZzEsIGVzcC0+ZXJlZ3MgKyBFU1BfQ0ZHMSk7Ci0Jc3dpdGNoIChlc3AtPmVyZXYpIHsKLQljYXNlIGVzcDEwMDoKLQkJLyogbm90aGluZyB0byBkbyAqLwotCQlicmVhazsKLQljYXNlIGVzcDEwMGE6Ci0JCXNidXNfd3JpdGViKGVzcC0+Y29uZmlnMiwgZXNwLT5lcmVncyArIEVTUF9DRkcyKTsKLQkJYnJlYWs7Ci0JY2FzZSBlc3AyMzY6Ci0JCS8qIFNsb3cgMjM2ICovCi0JCXNidXNfd3JpdGViKGVzcC0+Y29uZmlnMiwgZXNwLT5lcmVncyArIEVTUF9DRkcyKTsKLQkJZXNwLT5wcmV2X2NmZzMgPSBlc3AtPmNvbmZpZzNbMF07Ci0JCXNidXNfd3JpdGViKGVzcC0+cHJldl9jZmczLCBlc3AtPmVyZWdzICsgRVNQX0NGRzMpOwotCQlicmVhazsKLQljYXNlIGZhc2htZToKLQkJZXNwLT5jb25maWcyIHw9IChFU1BfQ09ORklHMl9ITUUzMiB8IEVTUF9DT05GSUcyX0hNRUZFTkFCKTsKLQkJLyogZmFsbHRocm91Z2guLi4gKi8KLQljYXNlIGZhczIzNjoKLQkJLyogRmFzdCAyMzYgb3IgSE1FICovCi0JCXNidXNfd3JpdGViKGVzcC0+Y29uZmlnMiwgZXNwLT5lcmVncyArIEVTUF9DRkcyKTsKLQkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKLQkJCWlmIChlc3AtPmVyZXYgPT0gZmFzaG1lKSB7Ci0JCQkJdTggY2ZnMzsKLQotCQkJCWNmZzMgPSBFU1BfQ09ORklHM19GQ0xPQ0sgfCBFU1BfQ09ORklHM19PQlBVU0g7Ci0JCQkJaWYgKGVzcC0+c2NzaV9pZCA+PSA4KQotCQkJCQljZmczIHw9IEVTUF9DT05GSUczX0lEQklUMzsKLQkJCQllc3AtPmNvbmZpZzNbaV0gfD0gY2ZnMzsKLQkJCX0gZWxzZSB7Ci0JCQkJZXNwLT5jb25maWczW2ldIHw9IEVTUF9DT05GSUczX0ZDTEs7Ci0JCQl9Ci0JCX0KLQkJZXNwLT5wcmV2X2NmZzMgPSBlc3AtPmNvbmZpZzNbMF07Ci0JCXNidXNfd3JpdGViKGVzcC0+cHJldl9jZmczLCBlc3AtPmVyZWdzICsgRVNQX0NGRzMpOwotCQlpZiAoZXNwLT5lcmV2ID09IGZhc2htZSkgewotCQkJZXNwLT5yYWRlbGF5ID0gODA7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZXNwLT5kaWZmKQotCQkJCWVzcC0+cmFkZWxheSA9IDA7Ci0JCQllbHNlCi0JCQkJZXNwLT5yYWRlbGF5ID0gOTY7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBmYXMxMDBhOgotCQkvKiBGYXN0IDEwMGEgKi8KLQkJc2J1c193cml0ZWIoZXNwLT5jb25maWcyLCBlc3AtPmVyZWdzICsgRVNQX0NGRzIpOwotCQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKLQkJCWVzcC0+Y29uZmlnM1tpXSB8PSBFU1BfQ09ORklHM19GQ0xPQ0s7Ci0JCWVzcC0+cHJldl9jZmczID0gZXNwLT5jb25maWczWzBdOwotCQlzYnVzX3dyaXRlYihlc3AtPnByZXZfY2ZnMywgZXNwLT5lcmVncyArIEVTUF9DRkczKTsKLQkJZXNwLT5yYWRlbGF5ID0gMzI7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXBhbmljKCJlc3A6IHdoYXQgY291bGQgaXQgYmUuLi4gSSB3b25kZXIuLi4iKTsKLQkJYnJlYWs7Ci0JfTsKLQotCS8qIEVhdCBhbnkgYml0cm90IGluIHRoZSBjaGlwICovCi0Jc2J1c19yZWFkYihlc3AtPmVyZWdzICsgRVNQX0lOVFJQVCk7Ci0JdWRlbGF5KDEwMCk7Ci19Ci0KLS8qIFRoaXMgcGxhY2VzIHRoZSBFU1AgaW50byBhIGtub3duIHN0YXRlIGF0IGJvb3QgdGltZS4gKi8KLXN0YXRpYyB2b2lkIF9faW5pdCBlc3BfYm9vdHVwX3Jlc2V0KHN0cnVjdCBlc3AgKmVzcCkKLXsKLQl1OCB0bXA7Ci0KLQkvKiBSZXNldCB0aGUgRE1BICovCi0JZXNwX3Jlc2V0X2RtYShlc3ApOwotCi0JLyogUmVzZXQgdGhlIEVTUCAqLwotCWVzcF9yZXNldF9lc3AoZXNwKTsKLQotCS8qIFJlc2V0IHRoZSBTQ1NJIGJ1cywgYnV0IHRlbGwgRVNQIG5vdCB0byBnZW5lcmF0ZSBhbiBpcnEgKi8KLQl0bXAgPSBzYnVzX3JlYWRiKGVzcC0+ZXJlZ3MgKyBFU1BfQ0ZHMSk7Ci0JdG1wIHw9IEVTUF9DT05GSUcxX1NSUkRJU0FCOwotCXNidXNfd3JpdGViKHRtcCwgZXNwLT5lcmVncyArIEVTUF9DRkcxKTsKLQotCWVzcF9jbWQoZXNwLCBFU1BfQ01EX1JTKTsKLQl1ZGVsYXkoNDAwKTsKLQotCXNidXNfd3JpdGViKGVzcC0+Y29uZmlnMSwgZXNwLT5lcmVncyArIEVTUF9DRkcxKTsKLQotCS8qIEVhdCBhbnkgYml0cm90IGluIHRoZSBjaGlwIGFuZCB3ZSBhcmUgZG9uZS4uLiAqLwotCXNidXNfcmVhZGIoZXNwLT5lcmVncyArIEVTUF9JTlRSUFQpOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBlc3BfZmluZF9kdm1hKHN0cnVjdCBlc3AgKmVzcCwgc3RydWN0IHNidXNfZGV2ICpkbWFfc2RldikKLXsKLQlzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYgPSBlc3AtPnNkZXY7Ci0Jc3RydWN0IHNidXNfZG1hICpkbWE7Ci0KLQlpZiAoZG1hX3NkZXYgIT0gTlVMTCkgewotCQlmb3JfZWFjaF9kdm1hKGRtYSkgewotCQkJaWYgKGRtYS0+c2RldiA9PSBkbWFfc2RldikKLQkJCQlicmVhazsKLQkJfQotCX0gZWxzZSB7Ci0JCWZvcl9lYWNoX2R2bWEoZG1hKSB7Ci0JCQkvKiBJZiBhbGxvY2F0ZWQgYWxyZWFkeSwgY2FuJ3QgdXNlIGl0LiAqLwotCQkJaWYgKGRtYS0+YWxsb2NhdGVkKQotCQkJCWNvbnRpbnVlOwotCi0JCQlpZiAoZG1hLT5zZGV2ID09IE5VTEwpCi0JCQkJYnJlYWs7Ci0KLQkJCS8qIElmIGJ1cyArIHNsb3QgYXJlIHRoZSBzYW1lIGFuZCBpdCBoYXMgdGhlCi0JCQkgKiBjb3JyZWN0IE9CUCBuYW1lLCBpdCdzIG91cnMuCi0JCQkgKi8KLQkJCWlmIChzZGV2LT5idXMgPT0gZG1hLT5zZGV2LT5idXMgJiYKLQkJCSAgICBzZGV2LT5zbG90ID09IGRtYS0+c2Rldi0+c2xvdCAmJgotCQkJICAgICghc3RyY21wKGRtYS0+c2Rldi0+cHJvbV9uYW1lLCAiZG1hIikgfHwKLQkJCSAgICAgIXN0cmNtcChkbWEtPnNkZXYtPnByb21fbmFtZSwgImVzcGRtYSIpKSkKLQkJCQlicmVhazsKLQkJfQotCX0KLQotCS8qIElmIHdlIGRvbid0IGtub3cgaG93IHRvIGhhbmRsZSB0aGUgZHZtYSwKLQkgKiBkbyBub3QgdXNlIHRoaXMgZGV2aWNlLgotCSAqLwotCWlmIChkbWEgPT0gTlVMTCkgewotCQlwcmludGsoIkNhbm5vdCBmaW5kIGR2bWEgZm9yIEVTUCVkJ3MgU0NTSVxuIiwgZXNwLT5lc3BfaWQpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmIChkbWEtPmFsbG9jYXRlZCkgewotCQlwcmludGsoImVzcCVkOiBjYW4ndCB1c2UgbXkgZXNwZG1hXG4iLCBlc3AtPmVzcF9pZCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JZG1hLT5hbGxvY2F0ZWQgPSAxOwotCWVzcC0+ZG1hID0gZG1hOwotCWVzcC0+ZHJlZ3MgPSBkbWEtPnJlZ3M7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBfX2luaXQgZXNwX21hcF9yZWdzKHN0cnVjdCBlc3AgKmVzcCwgaW50IGhtZSkKLXsKLQlzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYgPSBlc3AtPnNkZXY7Ci0Jc3RydWN0IHJlc291cmNlICpyZXM7Ci0KLQkvKiBPbiBITUUsIHR3byByZWcgc2V0cyBleGlzdCwgZmlyc3QgaXMgRFZNQSwKLQkgKiBzZWNvbmQgaXMgRVNQIHJlZ2lzdGVycy4KLQkgKi8KLQlpZiAoaG1lKQotCQlyZXMgPSAmc2Rldi0+cmVzb3VyY2VbMV07Ci0JZWxzZQotCQlyZXMgPSAmc2Rldi0+cmVzb3VyY2VbMF07Ci0KLQllc3AtPmVyZWdzID0gc2J1c19pb3JlbWFwKHJlcywgMCwgRVNQX1JFR19TSVpFLCAiRVNQIFJlZ2lzdGVycyIpOwotCi0JaWYgKGVzcC0+ZXJlZ3MgPT0gMCkKLQkJcmV0dXJuIC0xOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBlc3BfbWFwX2NtZGFyZWEoc3RydWN0IGVzcCAqZXNwKQotewotCXN0cnVjdCBzYnVzX2RldiAqc2RldiA9IGVzcC0+c2RldjsKLQotCWVzcC0+ZXNwX2NvbW1hbmQgPSBzYnVzX2FsbG9jX2NvbnNpc3RlbnQoc2RldiwgMTYsCi0JCQkJCQkgJmVzcC0+ZXNwX2NvbW1hbmRfZHZtYSk7Ci0JaWYgKGVzcC0+ZXNwX2NvbW1hbmQgPT0gTlVMTCB8fAotCSAgICBlc3AtPmVzcF9jb21tYW5kX2R2bWEgPT0gMCkKLQkJcmV0dXJuIC0xOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBlc3BfcmVnaXN0ZXJfaXJxKHN0cnVjdCBlc3AgKmVzcCkKLXsKLQllc3AtPmVob3N0LT5pcnEgPSBlc3AtPmlycSA9IGVzcC0+c2Rldi0+aXJxc1swXTsKLQotCS8qIFdlIHVzZWQgdG8gdHJ5IHZhcmlvdXMgb3Zlcmx5LWNsZXZlciB0aGluZ3MgdG8KLQkgKiByZWR1Y2UgdGhlIGludGVycnVwdCBwcm9jZXNzaW5nIG92ZXJoZWFkIG9uCi0JICogc3VuNGMvc3VuNG0gd2hlbiBtdWx0aXBsZSBFU1AncyBzaGFyZWQgdGhlCi0JICogc2FtZSBJUlEuICBJdCB3YXMgdG9vIGNvbXBsZXggYW5kIG1lc3N5IHRvCi0JICogc2FuZWx5IG1haW50YWluLgotCSAqLwotCWlmIChyZXF1ZXN0X2lycShlc3AtPmVob3N0LT5pcnEsIGVzcF9pbnRyLAotCQkJSVJRRl9TSEFSRUQsICJFU1AgU0NTSSIsIGVzcCkpIHsKLQkJcHJpbnRrKCJlc3AlZDogQ2Fubm90IGFjcXVpcmUgaXJxIGxpbmVcbiIsCi0JCSAgICAgICBlc3AtPmVzcF9pZCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwcmludGsoImVzcCVkOiBJUlEgJWQgIiwgZXNwLT5lc3BfaWQsCi0JICAgICAgIGVzcC0+ZWhvc3QtPmlycSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgX19pbml0IGVzcF9nZXRfc2NzaV9pZChzdHJ1Y3QgZXNwICplc3ApCi17Ci0Jc3RydWN0IHNidXNfZGV2ICpzZGV2ID0gZXNwLT5zZGV2OwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAgPSBzZGV2LT5vZmRldi5ub2RlOwotCi0JZXNwLT5zY3NpX2lkID0gb2ZfZ2V0aW50cHJvcF9kZWZhdWx0KGRwLAotCQkJCQkgICAgICJpbml0aWF0b3ItaWQiLAotCQkJCQkgICAgIC0xKTsKLQlpZiAoZXNwLT5zY3NpX2lkID09IC0xKQotCQllc3AtPnNjc2lfaWQgPSBvZl9nZXRpbnRwcm9wX2RlZmF1bHQoZHAsCi0JCQkJCQkgICAgICJzY3NpLWluaXRpYXRvci1pZCIsCi0JCQkJCQkgICAgIC0xKTsKLQlpZiAoZXNwLT5zY3NpX2lkID09IC0xKQotCQllc3AtPnNjc2lfaWQgPSAoc2Rldi0+YnVzID09IE5VTEwpID8gNyA6Ci0JCQlvZl9nZXRpbnRwcm9wX2RlZmF1bHQoc2Rldi0+YnVzLT5vZmRldi5ub2RlLAotCQkJCQkgICAgICAic2NzaS1pbml0aWF0b3ItaWQiLAotCQkJCQkgICAgICA3KTsKLQllc3AtPmVob3N0LT50aGlzX2lkID0gZXNwLT5zY3NpX2lkOwotCWVzcC0+c2NzaV9pZF9tYXNrID0gKDEgPDwgZXNwLT5zY3NpX2lkKTsKLQotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgZXNwX2dldF9jbG9ja19wYXJhbXMoc3RydWN0IGVzcCAqZXNwKQotewotCXN0cnVjdCBzYnVzX2RldiAqc2RldiA9IGVzcC0+c2RldjsKLQlpbnQgcHJvbV9ub2RlID0gZXNwLT5wcm9tX25vZGU7Ci0JaW50IHNidXNfcHJvbV9ub2RlOwotCXVuc2lnbmVkIGludCBmbWh6OwotCXU4IGNjZjsKLQotCWlmIChzZGV2ICE9IE5VTEwgJiYgc2Rldi0+YnVzICE9IE5VTEwpCi0JCXNidXNfcHJvbV9ub2RlID0gc2Rldi0+YnVzLT5wcm9tX25vZGU7Ci0JZWxzZQotCQlzYnVzX3Byb21fbm9kZSA9IDA7Ci0KLQkvKiBUaGlzIGlzIGdldHRpbmcgbWVzc3kgYnV0IGl0IGhhcyB0byBiZSBkb25lCi0JICogY29ycmVjdGx5IG9yIGVsc2UgeW91IGdldCB3ZWlyZCBiZWhhdmlvciBhbGwKLQkgKiBvdmVyIHRoZSBwbGFjZS4gIFdlIGFyZSB0cnlpbmcgdG8gYmFzaWNhbGx5Ci0JICogZmlndXJlIG91dCB0aHJlZSBwaWVjZXMgb2YgaW5mb3JtYXRpb24uCi0JICoKLQkgKiBhKSBDbG9jayBDb252ZXJzaW9uIEZhY3RvcgotCSAqCi0JICogICAgVGhpcyBpcyBhIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBpbnB1dAotCSAqICAgIGNyeXN0YWwgY2xvY2sgZnJlcXVlbmN5IGdvaW5nIGludG8gdGhlCi0JICogICAgRVNQIG9uIHRoaXMgbWFjaGluZS4gIEFueSBvcGVyYXRpb24gd2hvc2UKLQkgKiAgICB0aW1pbmcgaXMgbG9uZ2VyIHRoYW4gNDAwbnMgZGVwZW5kcyBvbiB0aGlzCi0JICogICAgdmFsdWUgYmVpbmcgY29ycmVjdC4gIEZvciBleGFtcGxlLCB5b3UnbGwKLQkgKiAgICBnZXQgYmxpcHMgZm9yIGFyYml0cmF0aW9uL3NlbGVjdGlvbiBkdXJpbmcKLQkgKiAgICBoaWdoIGxvYWQgb3Igd2l0aCBtdWx0aXBsZSB0YXJnZXRzIGlmIHRoaXMKLQkgKiAgICBpcyBub3Qgc2V0IGNvcnJlY3RseS4KLQkgKgotCSAqIGIpIFNlbGVjdGlvbiBUaW1lLU91dAotCSAqCi0JICogICAgVGhlIEVTUCBpc24ndCB2ZXJ5IGJyaWdodCBhbmQgd2lsbCBhcmJpdHJhdGUKLQkgKiAgICBmb3IgdGhlIGJ1cyBhbmQgdHJ5IHRvIHNlbGVjdCBhIHRhcmdldAotCSAqICAgIGZvcmV2ZXIgaWYgeW91IGxldCBpdC4gIFRoaXMgdmFsdWUgdGVsbHMKLQkgKiAgICB0aGUgRVNQIHdoZW4gaXQgaGFzIHRha2VuIHRvbyBsb25nIHRvCi0JICogICAgbmVnb3RpYXRlIGFuZCB0aGF0IGl0IHNob3VsZCBpbnRlcnJ1cHQKLQkgKiAgICB0aGUgQ1BVIHNvIHdlIGNhbiBzZWUgd2hhdCBoYXBwZW5lZC4KLQkgKiAgICBUaGUgdmFsdWUgaXMgY29tcHV0ZWQgYXMgZm9sbG93cyAoZnJvbQotCSAqICAgIE5DUi9TeW1iaW9zIGNoaXAgZG9jcykuCi0JICoKLQkgKiAgICAgICAgICAoVGltZSBPdXQgUGVyaW9kKSAqICAoSW5wdXQgQ2xvY2spCi0JICogICAgU1RPID0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCSAqICAgICAgICAgICg4MTkyKSAqIChDbG9jayBDb252ZXJzaW9uIEZhY3RvcikKLQkgKgotCSAqICAgIFlvdSB1c3VhbGx5IHdhbnQgdGhlIHRpbWUgb3V0IHBlcmlvZCB0byBiZQotCSAqICAgIGFyb3VuZCAyNTBtcywgSSB0aGluayB3ZSdsbCBzZXQgaXQgYSBsaXR0bGUKLQkgKiAgICBiaXQgaGlnaGVyIHRvIGFjY291bnQgZm9yIGZ1bGx5IGxvYWRlZCBTQ1NJCi0JICogICAgYnVzJ3MgYW5kIHNsb3cgZGV2aWNlcyB0aGF0IGRvbid0IHJlc3BvbmQgc28KLQkgKiAgICBxdWlja2x5IHRvIHNlbGVjdGlvbiBhdHRlbXB0cy4gKHllYWgsIEkga25vdwotCSAqICAgIHRoaXMgaXMgb3V0IG9mIHNwZWMuIGJ1dCB0aGVyZSBpcyBhIGxvdCBvZgotCSAqICAgIGJ1Z2d5IHBpZWNlcyBvZiBmaXJtd2FyZSBvdXQgdGhlcmUgc28gYml0ZSBtZSkKLQkgKgotCSAqIGMpIEltcGVyaWNhbCBjb25zdGFudHMgZm9yIHN5bmNocm9ub3VzIG9mZnNldAotCSAqICAgIGFuZCB0cmFuc2ZlciBwZXJpb2QgcmVnaXN0ZXIgdmFsdWVzCi0JICoKLQkgKiAgICBUaGlzIGVudGFpbHMgdGhlIHNtYWxsZXN0IGFuZCBsYXJnZXN0IHN5bmMKLQkgKiAgICBwZXJpb2Qgd2UgY291bGQgZXZlciBoYW5kbGUgb24gdGhpcyBFU1AuCi0JICovCi0KLQlmbWh6ID0gcHJvbV9nZXRpbnRkZWZhdWx0KHByb21fbm9kZSwgImNsb2NrLWZyZXF1ZW5jeSIsIC0xKTsKLQlpZiAoZm1oeiA9PSAtMSkKLQkJZm1oeiA9ICghc2J1c19wcm9tX25vZGUpID8gMCA6Ci0JCQlwcm9tX2dldGludGRlZmF1bHQoc2J1c19wcm9tX25vZGUsICJjbG9jay1mcmVxdWVuY3kiLCAtMSk7Ci0KLQlpZiAoZm1oeiA8PSAoNTAwMDAwMCkpCi0JCWNjZiA9IDA7Ci0JZWxzZQotCQljY2YgPSAoKCg1MDAwMDAwIC0gMSkgKyAoZm1oeikpLyg1MDAwMDAwKSk7Ci0KLQlpZiAoIWNjZiB8fCBjY2YgPiA4KSB7Ci0JCS8qIElmIHdlIGNhbid0IGZpbmQgYW55dGhpbmcgcmVhc29uYWJsZSwKLQkJICoganVzdCBhc3N1bWUgMjBNSFouICBUaGlzIGlzIHRoZSBjbG9jawotCQkgKiBmcmVxdWVuY3kgb2YgdGhlIG9sZGVyIHN1bjRjJ3Mgd2hlcmUgSSd2ZQotCQkgKiBiZWVuIHVuYWJsZSB0byBmaW5kIHRoZSBjbG9jay1mcmVxdWVuY3kKLQkJICogUFJPTSBwcm9wZXJ0eS4gIEFsbCBvdGhlciBtYWNoaW5lcyBwcm92aWRlCi0JCSAqIHVzZWZ1bCB2YWx1ZXMgaXQgc2VlbXMuCi0JCSAqLwotCQljY2YgPSBFU1BfQ0NGX0Y0OwotCQlmbWh6ID0gKDIwMDAwMDAwKTsKLQl9Ci0KLQlpZiAoY2NmID09IChFU1BfQ0NGX0Y3ICsgMSkpCi0JCWVzcC0+Y2ZhY3QgPSBFU1BfQ0NGX0YwOwotCWVsc2UgaWYgKGNjZiA9PSBFU1BfQ0NGX05FVkVSKQotCQllc3AtPmNmYWN0ID0gRVNQX0NDRl9GMjsKLQllbHNlCi0JCWVzcC0+Y2ZhY3QgPSBjY2Y7Ci0JZXNwLT5yYXdfY2ZhY3QgPSBjY2Y7Ci0KLQllc3AtPmNmcmVxID0gZm1oejsKLQllc3AtPmNjeWNsZSA9IEVTUF9NSFpfVE9fQ1lDTEUoZm1oeik7Ci0JZXNwLT5jdGljayA9IEVTUF9USUNLKGNjZiwgZXNwLT5jY3ljbGUpOwotCWVzcC0+bmVnX2RlZnAgPSBFU1BfTkVHX0RFRlAoZm1oeiwgY2NmKTsKLQllc3AtPnN5bmNfZGVmcCA9IFNZTkNfREVGUF9TTE9XOwotCi0JcHJpbnRrKCJTQ1NJIElEICVkIENsayAlZE1IeiBDQ1lDPSVkIENDRj0lZCBUT3V0ICVkICIsCi0JICAgICAgIGVzcC0+c2NzaV9pZCwgKGZtaHogLyAxMDAwMDAwKSwKLQkgICAgICAgKGludCllc3AtPmNjeWNsZSwgKGludCljY2YsIChpbnQpIGVzcC0+bmVnX2RlZnApOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgZXNwX2dldF9idXJzdHMoc3RydWN0IGVzcCAqZXNwLCBzdHJ1Y3Qgc2J1c19kZXYgKmRtYSkKLXsKLQlzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYgPSBlc3AtPnNkZXY7Ci0JdTggYnVyc3RzOwotCi0JYnVyc3RzID0gcHJvbV9nZXRpbnRkZWZhdWx0KGVzcC0+cHJvbV9ub2RlLCAiYnVyc3Qtc2l6ZXMiLCAweGZmKTsKLQotCWlmIChkbWEpIHsKLQkJdTggdG1wID0gcHJvbV9nZXRpbnRkZWZhdWx0KGRtYS0+cHJvbV9ub2RlLAotCQkJCQkgICAgImJ1cnN0LXNpemVzIiwgMHhmZik7Ci0JCWlmICh0bXAgIT0gMHhmZikKLQkJCWJ1cnN0cyAmPSB0bXA7Ci0JfQotCi0JaWYgKHNkZXYtPmJ1cykgewotCQl1OCB0bXAgPSBwcm9tX2dldGludGRlZmF1bHQoc2Rldi0+YnVzLT5wcm9tX25vZGUsCi0JCQkJCSAgICAiYnVyc3Qtc2l6ZXMiLCAweGZmKTsKLQkJaWYgKHRtcCAhPSAweGZmKQotCQkJYnVyc3RzICY9IHRtcDsKLQl9Ci0KLQlpZiAoYnVyc3RzID09IDB4ZmYgfHwKLQkgICAgKGJ1cnN0cyAmIERNQV9CVVJTVDE2KSA9PSAwIHx8Ci0JICAgIChidXJzdHMgJiBETUFfQlVSU1QzMikgPT0gMCkKLQkJYnVyc3RzID0gKERNQV9CVVJTVDMyIC0gMSk7Ci0KLQllc3AtPmJ1cnN0cyA9IGJ1cnN0czsKLX0KLQotc3RhdGljIHZvaWQgX19pbml0IGVzcF9nZXRfcmV2aXNpb24oc3RydWN0IGVzcCAqZXNwKQotewotCXU4IHRtcDsKLQotCWVzcC0+Y29uZmlnMSA9IChFU1BfQ09ORklHMV9QRU5BQkxFIHwgKGVzcC0+c2NzaV9pZCAmIDcpKTsKLQllc3AtPmNvbmZpZzIgPSAoRVNQX0NPTkZJRzJfU0NTSTJFTkFCIHwgRVNQX0NPTkZJRzJfUkVHUEFSSVRZKTsKLQlzYnVzX3dyaXRlYihlc3AtPmNvbmZpZzIsIGVzcC0+ZXJlZ3MgKyBFU1BfQ0ZHMik7Ci0KLQl0bXAgPSBzYnVzX3JlYWRiKGVzcC0+ZXJlZ3MgKyBFU1BfQ0ZHMik7Ci0JdG1wICY9IH5FU1BfQ09ORklHMl9NQUdJQzsKLQlpZiAodG1wICE9IChFU1BfQ09ORklHMl9TQ1NJMkVOQUIgfCBFU1BfQ09ORklHMl9SRUdQQVJJVFkpKSB7Ci0JCS8qIElmIHdoYXQgd2Ugd3JpdGUgdG8gY2ZnMiBkb2VzIG5vdCBjb21lIGJhY2ssIGNmZzIKLQkJICogaXMgbm90IGltcGxlbWVudGVkLCB0aGVyZWZvcmUgdGhpcyBtdXN0IGJlIGEgcGxhaW4KLQkJICogZXNwMTAwLgotCQkgKi8KLQkJZXNwLT5lcmV2ID0gZXNwMTAwOwotCQlwcmludGsoIk5DUjUzQzkwKGVzcDEwMClcbiIpOwotCX0gZWxzZSB7Ci0JCWVzcC0+Y29uZmlnMiA9IDA7Ci0JCWVzcC0+cHJldl9jZmczID0gZXNwLT5jb25maWczWzBdID0gNTsKLQkJc2J1c193cml0ZWIoZXNwLT5jb25maWcyLCBlc3AtPmVyZWdzICsgRVNQX0NGRzIpOwotCQlzYnVzX3dyaXRlYigwLCBlc3AtPmVyZWdzICsgRVNQX0NGRzMpOwotCQlzYnVzX3dyaXRlYihlc3AtPnByZXZfY2ZnMywgZXNwLT5lcmVncyArIEVTUF9DRkczKTsKLQotCQl0bXAgPSBzYnVzX3JlYWRiKGVzcC0+ZXJlZ3MgKyBFU1BfQ0ZHMyk7Ci0JCWlmICh0bXAgIT0gNSkgewotCQkJLyogVGhlIGNmZzIgcmVnaXN0ZXIgaXMgaW1wbGVtZW50ZWQsIGhvd2V2ZXIKLQkJCSAqIGNmZzMgaXMgbm90LCBtdXN0IGJlIGVzcDEwMGEuCi0JCQkgKi8KLQkJCWVzcC0+ZXJldiA9IGVzcDEwMGE7Ci0JCQlwcmludGsoIk5DUjUzQzkwQShlc3AxMDBhKVxuIik7Ci0JCX0gZWxzZSB7Ci0JCQlpbnQgdGFyZ2V0OwotCi0JCQlmb3IgKHRhcmdldCA9IDA7IHRhcmdldCA8IDE2OyB0YXJnZXQrKykKLQkJCQllc3AtPmNvbmZpZzNbdGFyZ2V0XSA9IDA7Ci0JCQllc3AtPnByZXZfY2ZnMyA9IDA7Ci0JCQlzYnVzX3dyaXRlYihlc3AtPnByZXZfY2ZnMywgZXNwLT5lcmVncyArIEVTUF9DRkczKTsKLQotCQkJLyogQWxsIG9mIGNmZ3sxLDIsM30gaW1wbGVtZW50ZWQsIG11c3QgYmUgb25lIG9mCi0JCQkgKiB0aGUgZmFzIHZhcmlhbnRzLCBmaWd1cmUgb3V0IHdoaWNoIG9uZS4KLQkJCSAqLwotCQkJaWYgKGVzcC0+cmF3X2NmYWN0ID4gRVNQX0NDRl9GNSkgewotCQkJCWVzcC0+ZXJldiA9IGZhc3Q7Ci0JCQkJZXNwLT5zeW5jX2RlZnAgPSBTWU5DX0RFRlBfRkFTVDsKLQkJCQlwcmludGsoIk5DUjUzQzlYRihlc3BmYXN0KVxuIik7Ci0JCQl9IGVsc2UgewotCQkJCWVzcC0+ZXJldiA9IGVzcDIzNjsKLQkJCQlwcmludGsoIk5DUjUzQzl4KGVzcDIzNilcbiIpOwotCQkJfQotCQkJZXNwLT5jb25maWcyID0gMDsKLQkJCXNidXNfd3JpdGViKGVzcC0+Y29uZmlnMiwgZXNwLT5lcmVncyArIEVTUF9DRkcyKTsKLQkJfQotCX0KLX0KLQotc3RhdGljIHZvaWQgX19pbml0IGVzcF9pbml0X3N3c3RhdGUoc3RydWN0IGVzcCAqZXNwKQotewotCWludCBpOwotCi0JLyogQ29tbWFuZCBxdWV1ZXMuLi4gKi8KLQllc3AtPmN1cnJlbnRfU0MgPSBOVUxMOwotCWVzcC0+ZGlzY29ubmVjdGVkX1NDID0gTlVMTDsKLQllc3AtPmlzc3VlX1NDID0gTlVMTDsKLQotCS8qIFRhcmdldCBhbmQgY3VycmVudCBjb21tYW5kIHN0YXRlLi4uICovCi0JZXNwLT50YXJnZXRzX3ByZXNlbnQgPSAwOwotCWVzcC0+cmVzZXR0aW5nX2J1cyA9IDA7Ci0JZXNwLT5zbmlwID0gMDsKLQotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmVzcC0+cmVzZXRfcXVldWUpOwotCi0JLyogRGVidWdnaW5nLi4uICovCi0JZm9yKGkgPSAwOyBpIDwgMzI7IGkrKykKLQkJZXNwLT5lc3BjbWRsb2dbaV0gPSAwOwotCWVzcC0+ZXNwY21kZW50ID0gMDsKLQotCS8qIE1TRyBwaGFzZSBzdGF0ZS4uLiAqLwotCWZvcihpID0gMDsgaSA8IDE2OyBpKyspIHsKLQkJZXNwLT5jdXJfbXNnb3V0W2ldID0gMDsKLQkJZXNwLT5jdXJfbXNnaW5baV0gPSAwOwotCX0KLQllc3AtPnByZXZtc2dvdXQgPSBlc3AtPnByZXZtc2dpbiA9IDA7Ci0JZXNwLT5tc2dvdXRfbGVuID0gZXNwLT5tc2dpbl9sZW4gPSAwOwotCi0JLyogQ2xlYXIgdGhlIG9uZSBiZWhpbmQgY2FjaGVzIHRvIGhvbGQgdW5tYXRjaGFibGUgdmFsdWVzLiAqLwotCWVzcC0+cHJldl9zb2ZmID0gZXNwLT5wcmV2X3N0cCA9IGVzcC0+cHJldl9jZmczID0gMHhmZjsKLQllc3AtPnByZXZfaG1lX2RtYWNzciA9IDB4ZmZmZmZmZmY7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IGRldGVjdF9vbmVfZXNwKHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgKnRwbnQsCi0JCQkJIHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkgc3RydWN0IHNidXNfZGV2ICplc3BfZGV2LAotCQkJCSBzdHJ1Y3Qgc2J1c19kZXYgKmVzcGRtYSwKLQkJCQkgc3RydWN0IHNidXNfYnVzICpzYnVzLAotCQkJCSBpbnQgaG1lKQotewotCXN0YXRpYyBpbnQgaW5zdGFuY2U7Ci0Jc3RydWN0IFNjc2lfSG9zdCAqZXNwX2hvc3QgPSBzY3NpX2hvc3RfYWxsb2ModHBudCwgc2l6ZW9mKHN0cnVjdCBlc3ApKTsKLQlzdHJ1Y3QgZXNwICplc3A7Ci0JCi0JaWYgKCFlc3BfaG9zdCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlpZiAoaG1lKQotCQllc3BfaG9zdC0+bWF4X2lkID0gMTY7Ci0JZXNwID0gKHN0cnVjdCBlc3AgKikgZXNwX2hvc3QtPmhvc3RkYXRhOwotCWVzcC0+ZWhvc3QgPSBlc3BfaG9zdDsKLQllc3AtPnNkZXYgPSBlc3BfZGV2OwotCWVzcC0+ZXNwX2lkID0gaW5zdGFuY2U7Ci0JZXNwLT5wcm9tX25vZGUgPSBlc3BfZGV2LT5wcm9tX25vZGU7Ci0JcHJvbV9nZXRzdHJpbmcoZXNwLT5wcm9tX25vZGUsICJuYW1lIiwgZXNwLT5wcm9tX25hbWUsCi0JCSAgICAgICBzaXplb2YoZXNwLT5wcm9tX25hbWUpKTsKLQotCWlmIChlc3BfZmluZF9kdm1hKGVzcCwgZXNwZG1hKSA8IDApCi0JCWdvdG8gZmFpbF91bmxpbms7Ci0JaWYgKGVzcF9tYXBfcmVncyhlc3AsIGhtZSkgPCAwKSB7Ci0JCXByaW50aygiRVNQIHJlZ2lzdGVycyB1bm1hcHBhYmxlIik7Ci0JCWdvdG8gZmFpbF9kdm1hX3JlbGVhc2U7Ci0JfQotCWlmIChlc3BfbWFwX2NtZGFyZWEoZXNwKSA8IDApIHsKLQkJcHJpbnRrKCJFU1AgRFZNQSB0cmFuc3BvcnQgYXJlYSB1bm1hcHBhYmxlIik7Ci0JCWdvdG8gZmFpbF91bm1hcF9yZWdzOwotCX0KLQlpZiAoZXNwX3JlZ2lzdGVyX2lycShlc3ApIDwgMCkKLQkJZ290byBmYWlsX3VubWFwX2NtZGFyZWE7Ci0KLQllc3BfZ2V0X3Njc2lfaWQoZXNwKTsKLQotCWVzcC0+ZGlmZiA9IHByb21fZ2V0Ym9vbChlc3AtPnByb21fbm9kZSwgImRpZmZlcmVudGlhbCIpOwotCWlmIChlc3AtPmRpZmYpCi0JCXByaW50aygiRGlmZmVyZW50aWFsICIpOwotCi0JZXNwX2dldF9jbG9ja19wYXJhbXMoZXNwKTsKLQllc3BfZ2V0X2J1cnN0cyhlc3AsIGVzcGRtYSk7Ci0JZXNwX2dldF9yZXZpc2lvbihlc3ApOwotCWVzcF9pbml0X3N3c3RhdGUoZXNwKTsKLQotCWVzcF9ib290dXBfcmVzZXQoZXNwKTsKLQotCWlmIChzY3NpX2FkZF9ob3N0KGVzcF9ob3N0LCBkZXYpKQotCQlnb3RvIGZhaWxfZnJlZV9pcnE7Ci0KLQlkZXZfc2V0X2RydmRhdGEoJmVzcF9kZXYtPm9mZGV2LmRldiwgZXNwKTsKLQotCXNjc2lfc2Nhbl9ob3N0KGVzcF9ob3N0KTsKLQlpbnN0YW5jZSsrOwotCi0JcmV0dXJuIDA7Ci0KLWZhaWxfZnJlZV9pcnE6Ci0JZnJlZV9pcnEoZXNwLT5laG9zdC0+aXJxLCBlc3ApOwotCi1mYWlsX3VubWFwX2NtZGFyZWE6Ci0Jc2J1c19mcmVlX2NvbnNpc3RlbnQoZXNwLT5zZGV2LCAxNiwKLQkJCSAgICAgKHZvaWQgKikgZXNwLT5lc3BfY29tbWFuZCwKLQkJCSAgICAgZXNwLT5lc3BfY29tbWFuZF9kdm1hKTsKLQotZmFpbF91bm1hcF9yZWdzOgotCXNidXNfaW91bm1hcChlc3AtPmVyZWdzLCBFU1BfUkVHX1NJWkUpOwotCi1mYWlsX2R2bWFfcmVsZWFzZToKLQllc3AtPmRtYS0+YWxsb2NhdGVkID0gMDsKLQotZmFpbF91bmxpbms6Ci0Jc2NzaV9ob3N0X3B1dChlc3BfaG9zdCk7Ci0JcmV0dXJuIC0xOwotfQotCi0vKiBEZXRlY3RpbmcgRVNQIGNoaXBzIG9uIHRoZSBtYWNoaW5lLiAgVGhpcyBpcyB0aGUgc2ltcGxlIGFuZCBlYXN5Ci0gKiB2ZXJzaW9uLgotICovCi1zdGF0aWMgaW50IF9fZGV2ZXhpdCBlc3BfcmVtb3ZlX2NvbW1vbihzdHJ1Y3QgZXNwICplc3ApCi17Ci0JdW5zaWduZWQgaW50IGlycSA9IGVzcC0+ZWhvc3QtPmlycTsKLQotCXNjc2lfcmVtb3ZlX2hvc3QoZXNwLT5laG9zdCk7Ci0KLQlFU1BfSU5UU09GRihlc3AtPmRyZWdzKTsKLSNpZiAwCi0JZXNwX3Jlc2V0X2RtYShlc3ApOwotCWVzcF9yZXNldF9lc3AoZXNwKTsKLSNlbmRpZgotCi0JZnJlZV9pcnEoaXJxLCBlc3ApOwotCXNidXNfZnJlZV9jb25zaXN0ZW50KGVzcC0+c2RldiwgMTYsCi0JCQkgICAgICh2b2lkICopIGVzcC0+ZXNwX2NvbW1hbmQsIGVzcC0+ZXNwX2NvbW1hbmRfZHZtYSk7Ci0Jc2J1c19pb3VubWFwKGVzcC0+ZXJlZ3MsIEVTUF9SRUdfU0laRSk7Ci0JZXNwLT5kbWEtPmFsbG9jYXRlZCA9IDA7Ci0KLQlzY3NpX2hvc3RfcHV0KGVzcC0+ZWhvc3QpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLQotI2lmZGVmIENPTkZJR19TVU40Ci0KLSNpbmNsdWRlIDxhc20vc3VuNHBhZGRyLmg+Ci0KLXN0YXRpYyBzdHJ1Y3Qgc2J1c19kZXYgc3VuNF9lc3BfZGV2OwotCi1zdGF0aWMgaW50IF9faW5pdCBlc3Bfc3VuNF9wcm9iZShzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlICp0cG50KQotewotCWlmIChzdW40X2VzcF9waHlzYWRkcikgewotCQltZW1zZXQoJnN1bjRfZXNwX2RldiwgMCwgc2l6ZW9mKHN1bjRfZXNwX2RldikpOwotCQlzdW40X2VzcF9kZXYucmVnX2FkZHJzWzBdLnBoeXNfYWRkciA9IHN1bjRfZXNwX3BoeXNhZGRyOwotCQlzdW40X2VzcF9kZXYuaXJxc1swXSA9IDQ7Ci0JCXN1bjRfZXNwX2Rldi5yZXNvdXJjZVswXS5zdGFydCA9IHN1bjRfZXNwX3BoeXNhZGRyOwotCQlzdW40X2VzcF9kZXYucmVzb3VyY2VbMF0uZW5kID0KLQkJCXN1bjRfZXNwX3BoeXNhZGRyICsgRVNQX1JFR19TSVpFIC0gMTsKLQkJc3VuNF9lc3BfZGV2LnJlc291cmNlWzBdLmZsYWdzID0gSU9SRVNPVVJDRV9JTzsKLQotCQlyZXR1cm4gZGV0ZWN0X29uZV9lc3AodHBudCwgTlVMTCwKLQkJCQkgICAgICAmc3VuNF9lc3BfZGV2LCBOVUxMLCBOVUxMLCAwKTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgX19kZXZleGl0IGVzcF9zdW40X3JlbW92ZSh2b2lkKQotewotCXN0cnVjdCBvZl9kZXZpY2UgKmRldiA9ICZzdW40X2VzcF9kZXYub2ZkZXY7Ci0Jc3RydWN0IGVzcCAqZXNwID0gZGV2X2dldF9kcnZkYXRhKCZkZXYtPmRldik7Ci0KLQlyZXR1cm4gZXNwX3JlbW92ZV9jb21tb24oZXNwKTsKLX0KLQotI2Vsc2UgLyogIUNPTkZJR19TVU40ICovCi0KLXN0YXRpYyBpbnQgX19kZXZpbml0IGVzcF9zYnVzX3Byb2JlKHN0cnVjdCBvZl9kZXZpY2UgKmRldiwgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2gpCi17Ci0Jc3RydWN0IHNidXNfZGV2ICpzZGV2ID0gdG9fc2J1c19kZXZpY2UoJmRldi0+ZGV2KTsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwID0gZGV2LT5ub2RlOwotCXN0cnVjdCBzYnVzX2RldiAqZG1hX3NkZXYgPSBOVUxMOwotCWludCBobWUgPSAwOwotCi0JaWYgKGRwLT5wYXJlbnQgJiYKLQkgICAgKCFzdHJjbXAoZHAtPnBhcmVudC0+bmFtZSwgImVzcGRtYSIpIHx8Ci0JICAgICAhc3RyY21wKGRwLT5wYXJlbnQtPm5hbWUsICJkbWEiKSkpCi0JCWRtYV9zZGV2ID0gc2Rldi0+cGFyZW50OwotCWVsc2UgaWYgKCFzdHJjbXAoZHAtPm5hbWUsICJTVU5XLGZhcyIpKSB7Ci0JCWRtYV9zZGV2ID0gc2RldjsKLQkJaG1lID0gMTsKLQl9Ci0KLQlyZXR1cm4gZGV0ZWN0X29uZV9lc3AobWF0Y2gtPmRhdGEsICZkZXYtPmRldiwKLQkJCSAgICAgIHNkZXYsIGRtYV9zZGV2LCBzZGV2LT5idXMsIGhtZSk7Ci19Ci0KLXN0YXRpYyBpbnQgX19kZXZleGl0IGVzcF9zYnVzX3JlbW92ZShzdHJ1Y3Qgb2ZfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGVzcCAqZXNwID0gZGV2X2dldF9kcnZkYXRhKCZkZXYtPmRldik7Ci0KLQlyZXR1cm4gZXNwX3JlbW92ZV9jb21tb24oZXNwKTsKLX0KLQotI2VuZGlmIC8qICFDT05GSUdfU1VONCAqLwotCi0vKiBUaGUgaW5mbyBmdW5jdGlvbiB3aWxsIHJldHVybiB3aGF0ZXZlciB1c2VmdWwKLSAqIGluZm9ybWF0aW9uIHRoZSBkZXZlbG9wZXIgc2VlcyBmaXQuICBJZiBub3QgcHJvdmlkZWQsIHRoZW4KLSAqIHRoZSBuYW1lIGZpZWxkIHdpbGwgYmUgdXNlZCBpbnN0ZWFkLgotICovCi1zdGF0aWMgY29uc3QgY2hhciAqZXNwX2luZm8oc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkKLXsKLQlzdHJ1Y3QgZXNwICplc3A7Ci0KLQllc3AgPSAoc3RydWN0IGVzcCAqKSBob3N0LT5ob3N0ZGF0YTsKLQlzd2l0Y2ggKGVzcC0+ZXJldikgewotCWNhc2UgZXNwMTAwOgotCQlyZXR1cm4gIlNwYXJjIEVTUDEwMCAoTkNSNTNDOTApIjsKLQljYXNlIGVzcDEwMGE6Ci0JCXJldHVybiAiU3BhcmMgRVNQMTAwQSAoTkNSNTNDOTBBKSI7Ci0JY2FzZSBlc3AyMzY6Ci0JCXJldHVybiAiU3BhcmMgRVNQMjM2IjsKLQljYXNlIGZhczIzNjoKLQkJcmV0dXJuICJTcGFyYyBFU1AyMzYtRkFTVCI7Ci0JY2FzZSBmYXNobWU6Ci0JCXJldHVybiAiU3BhcmMgRVNQMzY2LUhNRSI7Ci0JY2FzZSBmYXMxMDBhOgotCQlyZXR1cm4gIlNwYXJjIEVTUDEwMEEtRkFTVCI7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuICJCb2dvbiBFU1AgcmV2aXNpb24iOwotCX07Ci19Ci0KLS8qIEZyb20gV29sZmdhbmcgU3RhbmdsbWVpZXIncyBOQ1Igc2NzaSBkcml2ZXIuICovCi1zdHJ1Y3QgaW5mb19zdHIKLXsKLQljaGFyICpidWZmZXI7Ci0JaW50IGxlbmd0aDsKLQlpbnQgb2Zmc2V0OwotCWludCBwb3M7Ci19OwotCi1zdGF0aWMgdm9pZCBjb3B5X21lbV9pbmZvKHN0cnVjdCBpbmZvX3N0ciAqaW5mbywgY2hhciAqZGF0YSwgaW50IGxlbikKLXsKLQlpZiAoaW5mby0+cG9zICsgbGVuID4gaW5mby0+bGVuZ3RoKQotCQlsZW4gPSBpbmZvLT5sZW5ndGggLSBpbmZvLT5wb3M7Ci0KLQlpZiAoaW5mby0+cG9zICsgbGVuIDwgaW5mby0+b2Zmc2V0KSB7Ci0JCWluZm8tPnBvcyArPSBsZW47Ci0JCXJldHVybjsKLQl9Ci0JaWYgKGluZm8tPnBvcyA8IGluZm8tPm9mZnNldCkgewotCQlkYXRhICs9IChpbmZvLT5vZmZzZXQgLSBpbmZvLT5wb3MpOwotCQlsZW4gIC09IChpbmZvLT5vZmZzZXQgLSBpbmZvLT5wb3MpOwotCX0KLQotCWlmIChsZW4gPiAwKSB7Ci0JCW1lbWNweShpbmZvLT5idWZmZXIgKyBpbmZvLT5wb3MsIGRhdGEsIGxlbik7Ci0JCWluZm8tPnBvcyArPSBsZW47Ci0JfQotfQotCi1zdGF0aWMgaW50IGNvcHlfaW5mbyhzdHJ1Y3QgaW5mb19zdHIgKmluZm8sIGNoYXIgKmZtdCwgLi4uKQotewotCXZhX2xpc3QgYXJnczsKLQljaGFyIGJ1Zls4MV07Ci0JaW50IGxlbjsKLQotCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7Ci0JbGVuID0gdnNwcmludGYoYnVmLCBmbXQsIGFyZ3MpOwotCXZhX2VuZChhcmdzKTsKLQotCWNvcHlfbWVtX2luZm8oaW5mbywgYnVmLCBsZW4pOwotCXJldHVybiBsZW47Ci19Ci0KLXN0YXRpYyBpbnQgZXNwX2hvc3RfaW5mbyhzdHJ1Y3QgZXNwICplc3AsIGNoYXIgKnB0ciwgb2ZmX3Qgb2Zmc2V0LCBpbnQgbGVuKQotewotCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldjsKLQlzdHJ1Y3QgaW5mb19zdHIgaW5mbzsKLQlpbnQgaTsKLQotCWluZm8uYnVmZmVyCT0gcHRyOwotCWluZm8ubGVuZ3RoCT0gbGVuOwotCWluZm8ub2Zmc2V0CT0gb2Zmc2V0OwotCWluZm8ucG9zCT0gMDsKLQotCWNvcHlfaW5mbygmaW5mbywgIlNwYXJjIEVTUCBIb3N0IEFkYXB0ZXI6XG4iKTsKLQljb3B5X2luZm8oJmluZm8sICJcdFBST00gbm9kZVx0XHQlMDh4XG4iLCAodW5zaWduZWQgaW50KSBlc3AtPnByb21fbm9kZSk7Ci0JY29weV9pbmZvKCZpbmZvLCAiXHRQUk9NIG5hbWVcdFx0JXNcbiIsIGVzcC0+cHJvbV9uYW1lKTsKLQljb3B5X2luZm8oJmluZm8sICJcdEVTUCBNb2RlbFx0XHQiKTsKLQlzd2l0Y2ggKGVzcC0+ZXJldikgewotCWNhc2UgZXNwMTAwOgotCQljb3B5X2luZm8oJmluZm8sICJFU1AxMDBcbiIpOwotCQlicmVhazsKLQljYXNlIGVzcDEwMGE6Ci0JCWNvcHlfaW5mbygmaW5mbywgIkVTUDEwMEFcbiIpOwotCQlicmVhazsKLQljYXNlIGVzcDIzNjoKLQkJY29weV9pbmZvKCZpbmZvLCAiRVNQMjM2XG4iKTsKLQkJYnJlYWs7Ci0JY2FzZSBmYXMyMzY6Ci0JCWNvcHlfaW5mbygmaW5mbywgIkZBUzIzNlxuIik7Ci0JCWJyZWFrOwotCWNhc2UgZmFzMTAwYToKLQkJY29weV9pbmZvKCZpbmZvLCAiRkFTMTAwQVxuIik7Ci0JCWJyZWFrOwotCWNhc2UgZmFzdDoKLQkJY29weV9pbmZvKCZpbmZvLCAiRkFTVFxuIik7Ci0JCWJyZWFrOwotCWNhc2UgZmFzaG1lOgotCQljb3B5X2luZm8oJmluZm8sICJIYXBweSBNZWFsIEZBU1xuIik7Ci0JCWJyZWFrOwotCWNhc2UgZXNwdW5rbm93bjoKLQlkZWZhdWx0OgotCQljb3B5X2luZm8oJmluZm8sICJVbmtub3duIVxuIik7Ci0JCWJyZWFrOwotCX07Ci0JY29weV9pbmZvKCZpbmZvLCAiXHRETUEgUmV2aXNpb25cdFx0Iik7Ci0Jc3dpdGNoIChlc3AtPmRtYS0+cmV2aXNpb24pIHsKLQljYXNlIGR2bWFyZXYwOgotCQljb3B5X2luZm8oJmluZm8sICJSZXYgMFxuIik7Ci0JCWJyZWFrOwotCWNhc2UgZHZtYWVzYzE6Ci0JCWNvcHlfaW5mbygmaW5mbywgIkVTQyBSZXYgMVxuIik7Ci0JCWJyZWFrOwotCWNhc2UgZHZtYXJldjE6Ci0JCWNvcHlfaW5mbygmaW5mbywgIlJldiAxXG4iKTsKLQkJYnJlYWs7Ci0JY2FzZSBkdm1hcmV2MjoKLQkJY29weV9pbmZvKCZpbmZvLCAiUmV2IDJcbiIpOwotCQlicmVhazsKLQljYXNlIGR2bWFyZXYzOgotCQljb3B5X2luZm8oJmluZm8sICJSZXYgM1xuIik7Ci0JCWJyZWFrOwotCWNhc2UgZHZtYXJldnBsdXM6Ci0JCWNvcHlfaW5mbygmaW5mbywgIlJldiAxK1xuIik7Ci0JCWJyZWFrOwotCWNhc2UgZHZtYWhtZToKLQkJY29weV9pbmZvKCZpbmZvLCAiUmV2IEhNRS9GQVNcbiIpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQljb3B5X2luZm8oJmluZm8sICJVbmtub3duIVxuIik7Ci0JCWJyZWFrOwotCX07Ci0JY29weV9pbmZvKCZpbmZvLCAiXHRMaXZlIFRhcmdldHNcdFx0WyAiKTsKLQlmb3IgKGkgPSAwOyBpIDwgMTU7IGkrKykgewotCQlpZiAoZXNwLT50YXJnZXRzX3ByZXNlbnQgJiAoMSA8PCBpKSkKLQkJCWNvcHlfaW5mbygmaW5mbywgIiVkICIsIGkpOwotCX0KLQljb3B5X2luZm8oJmluZm8sICJdXG5cbiIpOwotCQotCS8qIE5vdyBkZXNjcmliZSB0aGUgc3RhdGUgb2YgZWFjaCBleGlzdGluZyB0YXJnZXQuICovCi0JY29weV9pbmZvKCZpbmZvLCAiVGFyZ2V0ICNcdGNvbmZpZzNcdFx0U3luYyBDYXBhYmlsaXRpZXNcdERpc2Nvbm5lY3RcdFdpZGVcbiIpOwotCi0Jc2hvc3RfZm9yX2VhY2hfZGV2aWNlKHNkZXYsIGVzcC0+ZWhvc3QpIHsKLQkJc3RydWN0IGVzcF9kZXZpY2UgKmVzcF9kZXYgPSBzZGV2LT5ob3N0ZGF0YTsKLQkJdWludCBpZCA9IHNkZXYtPmlkOwotCi0JCWlmICghKGVzcC0+dGFyZ2V0c19wcmVzZW50ICYgKDEgPDwgaWQpKSkKLQkJCWNvbnRpbnVlOwotCi0JCWNvcHlfaW5mbygmaW5mbywgIiVkXHRcdCIsIGlkKTsKLQkJY29weV9pbmZvKCZpbmZvLCAiJTA4bHhcdCIsIGVzcC0+Y29uZmlnM1tpZF0pOwotCQljb3B5X2luZm8oJmluZm8sICJbJTAybHgsJTAybHhdXHRcdFx0IiwKLQkJCWVzcF9kZXYtPnN5bmNfbWF4X29mZnNldCwKLQkJCWVzcF9kZXYtPnN5bmNfbWluX3BlcmlvZCk7Ci0JCWNvcHlfaW5mbygmaW5mbywgIiVzXHRcdCIsCi0JCQllc3BfZGV2LT5kaXNjb25uZWN0ID8gInllcyIgOiAibm8iKTsKLQkJY29weV9pbmZvKCZpbmZvLCAiJXNcbiIsCi0JCQkoZXNwLT5jb25maWczW2lkXSAmIEVTUF9DT05GSUczX0VXSURFKSA/ICJ5ZXMiIDogIm5vIik7Ci0JfQotCXJldHVybiBpbmZvLnBvcyA+IGluZm8ub2Zmc2V0PyBpbmZvLnBvcyAtIGluZm8ub2Zmc2V0IDogMDsKLX0KLQotLyogRVNQIHByb2MgZmlsZXN5c3RlbSBjb2RlLiAqLwotc3RhdGljIGludCBlc3BfcHJvY19pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsIGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsCi0JCQkgaW50IGxlbmd0aCwgaW50IGlub3V0KQotewotCXN0cnVjdCBlc3AgKmVzcCA9IChzdHJ1Y3QgZXNwICopIGhvc3QtPmhvc3RkYXRhOwotCi0JaWYgKGlub3V0KQotCQlyZXR1cm4gLUVJTlZBTDsgLyogbm90IHlldCAqLwotCi0JaWYgKHN0YXJ0KQotCQkqc3RhcnQgPSBidWZmZXI7Ci0KLQlyZXR1cm4gZXNwX2hvc3RfaW5mbyhlc3AsIGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgpOwotfQotCi1zdGF0aWMgdm9pZCBlc3BfZ2V0X2RtYWJ1ZnMoc3RydWN0IGVzcCAqZXNwLCBzdHJ1Y3Qgc2NzaV9jbW5kICpzcCkKLXsKLQlpZiAoc3AtPnVzZV9zZyA9PSAwKSB7Ci0JCXNwLT5TQ3AudGhpc19yZXNpZHVhbCA9IHNwLT5yZXF1ZXN0X2J1ZmZsZW47Ci0JCXNwLT5TQ3AuYnVmZmVyID0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKSBzcC0+cmVxdWVzdF9idWZmZXI7Ci0JCXNwLT5TQ3AuYnVmZmVyc19yZXNpZHVhbCA9IDA7Ci0JCWlmIChzcC0+cmVxdWVzdF9idWZmbGVuKSB7Ci0JCQlzcC0+U0NwLmhhdmVfZGF0YV9pbiA9IHNidXNfbWFwX3NpbmdsZShlc3AtPnNkZXYsIHNwLT5TQ3AuYnVmZmVyLAotCQkJCQkJCSAgICAgICBzcC0+U0NwLnRoaXNfcmVzaWR1YWwsCi0JCQkJCQkJICAgICAgIHNwLT5zY19kYXRhX2RpcmVjdGlvbik7Ci0JCQlzcC0+U0NwLnB0ciA9IChjaGFyICopICgodW5zaWduZWQgbG9uZylzcC0+U0NwLmhhdmVfZGF0YV9pbik7Ci0JCX0gZWxzZSB7Ci0JCQlzcC0+U0NwLnB0ciA9IE5VTEw7Ci0JCX0KLQl9IGVsc2UgewotCQlzcC0+U0NwLmJ1ZmZlciA9IChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKikgc3AtPnJlcXVlc3RfYnVmZmVyOwotCQlzcC0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWwgPSBzYnVzX21hcF9zZyhlc3AtPnNkZXYsCi0JCQkJCQkgICAgICAgc3AtPlNDcC5idWZmZXIsCi0JCQkJCQkgICAgICAgc3AtPnVzZV9zZywKLQkJCQkJCSAgICAgICBzcC0+c2NfZGF0YV9kaXJlY3Rpb24pOwotCQlzcC0+U0NwLnRoaXNfcmVzaWR1YWwgPSBzZ19kbWFfbGVuKHNwLT5TQ3AuYnVmZmVyKTsKLQkJc3AtPlNDcC5wdHIgPSAoY2hhciAqKSAoKHVuc2lnbmVkIGxvbmcpc2dfZG1hX2FkZHJlc3Moc3AtPlNDcC5idWZmZXIpKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGVzcF9yZWxlYXNlX2RtYWJ1ZnMoc3RydWN0IGVzcCAqZXNwLCBzdHJ1Y3Qgc2NzaV9jbW5kICpzcCkKLXsKLQlpZiAoc3AtPnVzZV9zZykgewotCQlzYnVzX3VubWFwX3NnKGVzcC0+c2Rldiwgc3AtPnJlcXVlc3RfYnVmZmVyLCBzcC0+dXNlX3NnLAotCQkJICAgICAgc3AtPnNjX2RhdGFfZGlyZWN0aW9uKTsKLQl9IGVsc2UgaWYgKHNwLT5yZXF1ZXN0X2J1ZmZsZW4pIHsKLQkJc2J1c191bm1hcF9zaW5nbGUoZXNwLT5zZGV2LAotCQkJCSAgc3AtPlNDcC5oYXZlX2RhdGFfaW4sCi0JCQkJICBzcC0+cmVxdWVzdF9idWZmbGVuLAotCQkJCSAgc3AtPnNjX2RhdGFfZGlyZWN0aW9uKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGVzcF9yZXN0b3JlX3BvaW50ZXJzKHN0cnVjdCBlc3AgKmVzcCwgc3RydWN0IHNjc2lfY21uZCAqc3ApCi17Ci0Jc3RydWN0IGVzcF9wb2ludGVycyAqZXAgPSAmZXNwLT5kYXRhX3BvaW50ZXJzW3NwLT5kZXZpY2UtPmlkXTsKLQotCXNwLT5TQ3AucHRyID0gZXAtPnNhdmVkX3B0cjsKLQlzcC0+U0NwLmJ1ZmZlciA9IGVwLT5zYXZlZF9idWZmZXI7Ci0Jc3AtPlNDcC50aGlzX3Jlc2lkdWFsID0gZXAtPnNhdmVkX3RoaXNfcmVzaWR1YWw7Ci0Jc3AtPlNDcC5idWZmZXJzX3Jlc2lkdWFsID0gZXAtPnNhdmVkX2J1ZmZlcnNfcmVzaWR1YWw7Ci19Ci0KLXN0YXRpYyB2b2lkIGVzcF9zYXZlX3BvaW50ZXJzKHN0cnVjdCBlc3AgKmVzcCwgc3RydWN0IHNjc2lfY21uZCAqc3ApCi17Ci0Jc3RydWN0IGVzcF9wb2ludGVycyAqZXAgPSAmZXNwLT5kYXRhX3BvaW50ZXJzW3NwLT5kZXZpY2UtPmlkXTsKLQotCWVwLT5zYXZlZF9wdHIgPSBzcC0+U0NwLnB0cjsKLQllcC0+c2F2ZWRfYnVmZmVyID0gc3AtPlNDcC5idWZmZXI7Ci0JZXAtPnNhdmVkX3RoaXNfcmVzaWR1YWwgPSBzcC0+U0NwLnRoaXNfcmVzaWR1YWw7Ci0JZXAtPnNhdmVkX2J1ZmZlcnNfcmVzaWR1YWwgPSBzcC0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWw7Ci19Ci0KLS8qIFNvbWUgcnVsZXM6Ci0gKgotICogICAxKSBOZXZlciBldmVyIHBhbmljIHdoaWxlIHNvbWV0aGluZyBpcyBsaXZlIG9uIHRoZSBidXMuCi0gKiAgICAgIElmIHRoZXJlIGlzIHRvIGJlIGFueSBjaGFuY2Ugb2Ygc3luY2luZyB0aGUgZGlza3MgdGhpcwotICogICAgICBydWxlIGlzIHRvIGJlIG9iZXllZC4KLSAqCi0gKiAgIDIpIEFueSB0YXJnZXQgdGhhdCBjYXVzZXMgYSBmb3VsIGNvbmRpdGlvbiB3aWxsIG5vIGxvbmdlcgotICogICAgICBoYXZlIHN5bmNocm9ub3VzIHRyYW5zZmVycyBkb25lIHRvIGl0LCBubyBxdWVzdGlvbnMKLSAqICAgICAgYXNrZWQuCi0gKgotICogICAzKSBLZWVwIHJlZ2lzdGVyIGFjY2Vzc2VzIHRvIGEgbWluaW11bS4gIFRoaW5rIGFib3V0IHNvbWUKLSAqICAgICAgZGF5IHdoZW4gd2UgaGF2ZSBYYnVzIG1hY2hpbmVzIHRoaXMgaXMgcnVubmluZyBvbiBhbmQKLSAqICAgICAgdGhlIEVTUCBjaGlwIGlzIG9uIHRoZSBvdGhlciBlbmQgb2YgdGhlIG1hY2hpbmUgb24gYQotICogICAgICBkaWZmZXJlbnQgYm9hcmQgZnJvbSB0aGUgY3B1IHdoZXJlIHRoaXMgaXMgcnVubmluZy4KLSAqLwotCi0vKiBGaXJlIG9mZiBhIGNvbW1hbmQuICBXZSBhc3N1bWUgdGhlIGJ1cyBpcyBmcmVlIGFuZCB0aGF0IHRoZSBvbmx5Ci0gKiBjYXNlIHdoZXJlIHdlIGNvdWxkIHNlZSBhbiBpbnRlcnJ1cHQgaXMgd2hlcmUgd2UgaGF2ZSBkaXNjb25uZWN0ZWQKLSAqIGNvbW1hbmRzIGFjdGl2ZSBhbmQgdGhleSBhcmUgdHJ5aW5nIHRvIHJlc2VsZWN0IHVzLgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgZXNwX2NoZWNrX2NtZChzdHJ1Y3QgZXNwICplc3AsIHN0cnVjdCBzY3NpX2NtbmQgKnNwKQotewotCXN3aXRjaCAoc3AtPmNtZF9sZW4pIHsKLQljYXNlIDY6Ci0JY2FzZSAxMDoKLQljYXNlIDEyOgotCQllc3AtPmVzcF9zbG93Y21kID0gMDsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQllc3AtPmVzcF9zbG93Y21kID0gMTsKLQkJZXNwLT5lc3Bfc2NtZGxlZnQgPSBzcC0+Y21kX2xlbjsKLQkJZXNwLT5lc3Bfc2NtZHAgPSAmc3AtPmNtbmRbMF07Ci0JCWJyZWFrOwotCX07Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBidWlsZF9zeW5jX25lZ29fbXNnKHN0cnVjdCBlc3AgKmVzcCwgaW50IHBlcmlvZCwgaW50IG9mZnNldCkKLXsKLQllc3AtPmN1cl9tc2dvdXRbMF0gPSBFWFRFTkRFRF9NRVNTQUdFOwotCWVzcC0+Y3VyX21zZ291dFsxXSA9IDM7Ci0JZXNwLT5jdXJfbXNnb3V0WzJdID0gRVhURU5ERURfU0RUUjsKLQllc3AtPmN1cl9tc2dvdXRbM10gPSBwZXJpb2Q7Ci0JZXNwLT5jdXJfbXNnb3V0WzRdID0gb2Zmc2V0OwotCWVzcC0+bXNnb3V0X2xlbiA9IDU7Ci19Ci0KLS8qIFNJWkUgaXMgaW4gYml0cywgY3VycmVudGx5IEhNRSBvbmx5IHN1cHBvcnRzIDE2IGJpdCB3aWRlIHRyYW5zZmVycy4gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBidWlsZF93aWRlX25lZ29fbXNnKHN0cnVjdCBlc3AgKmVzcCwgaW50IHNpemUpCi17Ci0JZXNwLT5jdXJfbXNnb3V0WzBdID0gRVhURU5ERURfTUVTU0FHRTsKLQllc3AtPmN1cl9tc2dvdXRbMV0gPSAyOwotCWVzcC0+Y3VyX21zZ291dFsyXSA9IEVYVEVOREVEX1dEVFI7Ci0Jc3dpdGNoIChzaXplKSB7Ci0JY2FzZSAzMjoKLQkJZXNwLT5jdXJfbXNnb3V0WzNdID0gMjsKLQkJYnJlYWs7Ci0JY2FzZSAxNjoKLQkJZXNwLT5jdXJfbXNnb3V0WzNdID0gMTsKLQkJYnJlYWs7Ci0JY2FzZSA4OgotCWRlZmF1bHQ6Ci0JCWVzcC0+Y3VyX21zZ291dFszXSA9IDA7Ci0JCWJyZWFrOwotCX07Ci0KLQllc3AtPm1zZ291dF9sZW4gPSA0OwotfQotCi1zdGF0aWMgdm9pZCBlc3BfZXhlY19jbWQoc3RydWN0IGVzcCAqZXNwKQotewotCXN0cnVjdCBzY3NpX2NtbmQgKlNDcHRyOwotCXN0cnVjdCBzY3NpX2RldmljZSAqU0RwdHI7Ci0Jc3RydWN0IGVzcF9kZXZpY2UgKmVzcF9kZXY7Ci0Jdm9sYXRpbGUgdTggKmNtZHAgPSBlc3AtPmVzcF9jb21tYW5kOwotCXU4IHRoZV9lc3BfY29tbWFuZDsKLQlpbnQgbHVuLCB0YXJnZXQ7Ci0JaW50IGk7Ci0KLQkvKiBIb2xkIG9mZiBpZiB3ZSBoYXZlIGRpc2Nvbm5lY3RlZCBjb21tYW5kcyBhbmQKLQkgKiBhbiBJUlEgaXMgc2hvd2luZy4uLgotCSAqLwotCWlmIChlc3AtPmRpc2Nvbm5lY3RlZF9TQyAmJiBFU1BfSVJRX1AoZXNwLT5kcmVncykpCi0JCXJldHVybjsKLQotCS8qIEdyYWIgZmlyc3QgbWVtYmVyIG9mIHRoZSBpc3N1ZSBxdWV1ZS4gKi8KLQlTQ3B0ciA9IGVzcC0+Y3VycmVudF9TQyA9IHJlbW92ZV9maXJzdF9TQygmZXNwLT5pc3N1ZV9TQyk7Ci0KLQkvKiBTYWZlIHRvIHBhbmljIGhlcmUgYmVjYXVzZSBjdXJyZW50X1NDIGlzIG51bGwuICovCi0JaWYgKCFTQ3B0cikKLQkJcGFuaWMoImVzcDogZXNwX2V4ZWNfY21kIGFuZCBpc3N1ZSBxdWV1ZSBpcyBOVUxMIik7Ci0KLQlTRHB0ciA9IFNDcHRyLT5kZXZpY2U7Ci0JZXNwX2RldiA9IFNEcHRyLT5ob3N0ZGF0YTsKLQlsdW4gPSBTQ3B0ci0+ZGV2aWNlLT5sdW47Ci0JdGFyZ2V0ID0gU0NwdHItPmRldmljZS0+aWQ7Ci0KLQllc3AtPnNuaXAgPSAwOwotCWVzcC0+bXNnb3V0X2xlbiA9IDA7Ci0KLQkvKiBTZW5kIGl0IG91dCB3aG9sZSwgb3IgcGllY2UgYnkgcGllY2U/ICAgVGhlIEVTUAotCSAqIG9ubHkga25vd3MgaG93IHRvIGF1dG9tYXRpY2FsbHkgc2VuZCBvdXQgNiwgMTAsCi0JICogYW5kIDEyIGJ5dGUgY29tbWFuZHMuICBJIHVzZWQgdG8gdGhpbmsgdGhhdCB0aGUKLQkgKiBMaW51eCBTQ1NJIGNvZGUgd291bGQgbmV2ZXIgdGhyb3cgYW55dGhpbmcgb3RoZXIKLQkgKiB0aGFuIHRoYXQgdG8gdXMsIGJ1dCB0aGVuIGFnYWluIHRoZXJlIGlzIHRoZQotCSAqIFNDU0kgZ2VuZXJpYyBkcml2ZXIgd2hpY2ggY2FuIHNlbmQgdXMgYW55dGhpbmcuCi0JICovCi0JZXNwX2NoZWNrX2NtZChlc3AsIFNDcHRyKTsKLQotCS8qIElmIGFyYml0cmF0aW9uL3NlbGVjdGlvbiBpcyBzdWNjZXNzZnVsLCB0aGUgRVNQIHdpbGwgbGVhdmUKLQkgKiBBVE4gYXNzZXJ0ZWQsIGNhdXNpbmcgdGhlIHRhcmdldCB0byBnbyBpbnRvIG1lc3NhZ2Ugb3V0Ci0JICogcGhhc2UuICBUaGUgRVNQIHdpbGwgZmVlZCB0aGUgdGFyZ2V0IHRoZSBpZGVudGlmeSBhbmQgdGhlbgotCSAqIHRoZSB0YXJnZXQgY2FuIG9ubHkgbGVnYWxseSBnbyB0byBvbmUgb2YgY29tbWFuZCwKLQkgKiBkYXRhaW4vb3V0LCBzdGF0dXMsIG9yIG1lc3NhZ2UgaW4gcGhhc2UsIG9yIHN0YXkgaW4gbWVzc2FnZQotCSAqIG91dCBwaGFzZSAoc2hvdWxkIHdlIGJlIHRyeWluZyB0byBzZW5kIGEgc3luYyBuZWdvdGlhdGlvbgotCSAqIG1lc3NhZ2UgYWZ0ZXIgdGhlIGlkZW50aWZ5KS4gIEl0IGlzIG5vdCBhbGxvd2VkIHRvIGRyb3AKLQkgKiBCU1ksIGJ1dCBzb21lIGJ1Z2d5IHRhcmdldHMgZG8gYW5kIHdlIGNoZWNrIGZvciB0aGlzCi0JICogY29uZGl0aW9uIGluIHRoZSBzZWxlY3Rpb24gY29tcGxldGUgY29kZS4gIE1vc3Qgb2YgdGhlIHRpbWUKLQkgKiB3ZSdsbCBtYWtlIHRoZSBjb21tYW5kIGJ5dGVzIGF2YWlsYWJsZSB0byB0aGUgRVNQIGFuZCBpdAotCSAqIHdpbGwgbm90IGludGVycnVwdCB1cyB1bnRpbCBpdCBmaW5pc2hlcyBjb21tYW5kIHBoYXNlLCB3ZQotCSAqIGNhbm5vdCBkbyB0aGlzIGZvciBjb21tYW5kIHNpemVzIHRoZSBFU1AgZG9lcyBub3QKLQkgKiB1bmRlcnN0YW5kIGFuZCBpbiB0aGlzIGNhc2Ugd2UnbGwgZ2V0IGludGVycnVwdGVkIHJpZ2h0Ci0JICogd2hlbiB0aGUgdGFyZ2V0IGdvZXMgaW50byBjb21tYW5kIHBoYXNlLgotCSAqCi0JICogSXQgaXMgYWJzb2x1dGVseSBfaWxsZWdhbF8gaW4gdGhlIHByZXNlbmNlIG9mIFNDU0ktMiBkZXZpY2VzCi0JICogdG8gdXNlIHRoZSBFU1Agc2VsZWN0IHcvbyBBVE4gY29tbWFuZC4gIFdoZW4gU0NTSS0yIGRldmljZXMgYXJlCi0JICogcHJlc2VudCBvbiB0aGUgYnVzIHdlIF9tdXN0XyBhbHdheXMgZ28gc3RyYWlnaHQgdG8gbWVzc2FnZSBvdXQKLQkgKiBwaGFzZSB3aXRoIGFuIGlkZW50aWZ5IG1lc3NhZ2UgZm9yIHRoZSB0YXJnZXQuICBCZWluZyB0aGF0Ci0JICogc2VsZWN0aW9uIGF0dGVtcHRzIGluIFNDU0ktMSB3L28gQVROIHdhcyBhbiBvcHRpb24sIGRvaW5nIFNDU0ktMgotCSAqIHNlbGVjdGlvbnMgc2hvdWxkIG5vdCBjb25mdXNlIFNDU0ktMSB3ZSBob3BlLgotCSAqLwotCi0JaWYgKGVzcF9kZXYtPnN5bmMpIHsKLQkJLyogdGhpcyB0YXJnZXRzIHN5bmMgaXMga25vd24gKi8KLSNpZm5kZWYgX19zcGFyY192OV9fCi1kb19zeW5jX2tub3duOgotI2VuZGlmCi0JCWlmIChlc3BfZGV2LT5kaXNjb25uZWN0KQotCQkJKmNtZHArKyA9IElERU5USUZZKDEsIGx1bik7Ci0JCWVsc2UKLQkJCSpjbWRwKysgPSBJREVOVElGWSgwLCBsdW4pOwotCi0JCWlmIChlc3AtPmVzcF9zbG93Y21kKSB7Ci0JCQl0aGVfZXNwX2NvbW1hbmQgPSAoRVNQX0NNRF9TRUxBUyB8IEVTUF9DTURfRE1BKTsKLQkJCWVzcF9hZHZhbmNlX3BoYXNlKFNDcHRyLCBpbl9zbGN0X3N0b3ApOwotCQl9IGVsc2UgewotCQkJdGhlX2VzcF9jb21tYW5kID0gKEVTUF9DTURfU0VMQSB8IEVTUF9DTURfRE1BKTsKLQkJCWVzcF9hZHZhbmNlX3BoYXNlKFNDcHRyLCBpbl9zbGN0X25vcm0pOwotCQl9Ci0JfSBlbHNlIGlmICghKGVzcC0+dGFyZ2V0c19wcmVzZW50ICYgKDE8PHRhcmdldCkpIHx8ICEoZXNwX2Rldi0+ZGlzY29ubmVjdCkpIHsKLQkJLyogQWZ0ZXIgdGhlIGJvb3R1cCBTQ1NJIGNvZGUgc2VuZHMgYm90aCB0aGUKLQkJICogVEVTVF9VTklUX1JFQURZIGFuZCBJTlFVSVJZIGNvbW1hbmRzIHdlIHdhbnQKLQkJICogdG8gYXQgbGVhc3QgYXR0ZW1wdCBhbGxvd2luZyB0aGUgZGV2aWNlIHRvCi0JCSAqIGRpc2Nvbm5lY3QuCi0JCSAqLwotCQlFU1BNSVNDKCgiZXNwOiBTZWxlY3RpbmcgZGV2aWNlIGZvciBmaXJzdCB0aW1lLiB0YXJnZXQ9JWQgIgotCQkJICJsdW49JWRcbiIsIHRhcmdldCwgU0NwdHItPmRldmljZS0+bHVuKSk7Ci0JCWlmICghU0RwdHItPmJvcmtlbiAmJiAhZXNwX2Rldi0+ZGlzY29ubmVjdCkKLQkJCWVzcF9kZXYtPmRpc2Nvbm5lY3QgPSAxOwotCi0JCSpjbWRwKysgPSBJREVOVElGWSgwLCBsdW4pOwotCQllc3AtPnByZXZtc2dvdXQgPSBOT1A7Ci0JCWVzcF9hZHZhbmNlX3BoYXNlKFNDcHRyLCBpbl9zbGN0X25vcm0pOwotCQl0aGVfZXNwX2NvbW1hbmQgPSAoRVNQX0NNRF9TRUxBIHwgRVNQX0NNRF9ETUEpOwotCi0JCS8qIFRha2Ugbm8gY2hhbmNlcy4uLiAqLwotCQllc3BfZGV2LT5zeW5jX21heF9vZmZzZXQgPSAwOwotCQllc3BfZGV2LT5zeW5jX21pbl9wZXJpb2QgPSAwOwotCX0gZWxzZSB7Ci0JCS8qIFNvcnJ5LCBJIGhhdmUgaGFkIHdheSB0b28gbWFueSBwcm9ibGVtcyB3aXRoCi0JCSAqIHZhcmlvdXMgQ0RST00gZGV2aWNlcyBvbiBFU1AuIC1EYXZlTQotCQkgKi8KLQkJaW50IGNkcm9tX2h3YnVnX3drYXJvdW5kID0gMDsKLQotI2lmbmRlZiBfX3NwYXJjX3Y5X18KLQkJLyogTmV2ZXIgYWxsb3cgZGlzY29ubmVjdHMgb3Igc3luY2hyb25vdXMgdHJhbnNmZXJzIG9uCi0JCSAqIFNwYXJjU3RhdGlvbjEgYW5kIFNwYXJjU3RhdGlvbjErLiAgQWxsb3dpbmcgdGhvc2UKLQkJICogdG8gYmUgZW5hYmxlZCBzZWVtcyB0byBsb2NrdXAgdGhlIG1hY2hpbmUgY29tcGxldGVseS4KLQkJICovCi0JCWlmICgoaWRwcm9tLT5pZF9tYWNodHlwZSA9PSAoU01fU1VONEMgfCBTTV80Q19TUzEpKSB8fAotCQkgICAgKGlkcHJvbS0+aWRfbWFjaHR5cGUgPT0gKFNNX1NVTjRDIHwgU01fNENfU1MxUExVUykpKSB7Ci0JCQkvKiBCdXQgd2UgYXJlIG5pY2UgYW5kIGFsbG93IHRhcGVzIGFuZCByZW1vdmFibGUKLQkJCSAqIGRpc2tzIChidXQgbm90IENEUk9NcykgdG8gZGlzY29ubmVjdC4KLQkJCSAqLwotCQkJaWYoU0RwdHItPnR5cGUgPT0gVFlQRV9UQVBFIHx8Ci0JCQkgICAoU0RwdHItPnR5cGUgIT0gVFlQRV9ST00gJiYgU0RwdHItPnJlbW92YWJsZSkpCi0JCQkJZXNwX2Rldi0+ZGlzY29ubmVjdCA9IDE7Ci0JCQllbHNlCi0JCQkJZXNwX2Rldi0+ZGlzY29ubmVjdCA9IDA7Ci0JCQllc3BfZGV2LT5zeW5jX21heF9vZmZzZXQgPSAwOwotCQkJZXNwX2Rldi0+c3luY19taW5fcGVyaW9kID0gMDsKLQkJCWVzcF9kZXYtPnN5bmMgPSAxOwotCQkJZXNwLT5zbmlwID0gMDsKLQkJCWdvdG8gZG9fc3luY19rbm93bjsKLQkJfQotI2VuZGlmIC8qICEoX19zcGFyY192OV9fKSAqLwotCi0JCS8qIFdlJ3ZlIHRhbGtlZCB0byB0aGlzIGd1eSBiZWZvcmUsCi0JCSAqIGJ1dCBuZXZlciBuZWdvdGlhdGVkLiAgTGV0J3MgdHJ5LAotCQkgKiBuZWVkIHRvIGF0dGVtcHQgV0lERSBmaXJzdCwgYmVmb3JlCi0JCSAqIHN5bmMgbmVnbywgYXMgcGVyIFNDU0kgMiBzdGFuZGFyZC4KLQkJICovCi0JCWlmIChlc3AtPmVyZXYgPT0gZmFzaG1lICYmICFlc3BfZGV2LT53aWRlKSB7Ci0JCQlpZiAoIVNEcHRyLT5ib3JrZW4gJiYKLQkJCSAgIFNEcHRyLT50eXBlICE9IFRZUEVfUk9NICYmCi0JCQkgICBTRHB0ci0+cmVtb3ZhYmxlID09IDApIHsKLQkJCQlidWlsZF93aWRlX25lZ29fbXNnKGVzcCwgMTYpOwotCQkJCWVzcF9kZXYtPndpZGUgPSAxOwotCQkJCWVzcC0+d25pcCA9IDE7Ci0JCQkJZ290byBhZnRlcl9uZWdvX21zZ19idWlsdDsKLQkJCX0gZWxzZSB7Ci0JCQkJZXNwX2Rldi0+d2lkZSA9IDE7Ci0JCQkJLyogRmFsbCB0aHJvdWdoIGFuZCB0cnkgc3luYy4gKi8KLQkJCX0KLQkJfQotCi0JCWlmICghU0RwdHItPmJvcmtlbikgewotCQkJaWYgKChTRHB0ci0+dHlwZSA9PSBUWVBFX1JPTSkpIHsKLQkJCQkvKiBOaWNlIHRyeSBzdWNrZXIuLi4gKi8KLQkJCQlFU1BNSVNDKCgiZXNwJWQ6IERpc2FibGluZyBzeW5jIGZvciBidWdneSAiCi0JCQkJCSAiQ0RST00uXG4iLCBlc3AtPmVzcF9pZCkpOwotCQkJCWNkcm9tX2h3YnVnX3drYXJvdW5kID0gMTsKLQkJCQlidWlsZF9zeW5jX25lZ29fbXNnKGVzcCwgMCwgMCk7Ci0JCQl9IGVsc2UgaWYgKFNEcHRyLT5yZW1vdmFibGUgIT0gMCkgewotCQkJCUVTUE1JU0MoKCJlc3AlZDogTm90IG5lZ290aWF0aW5nIHN5bmMvd2lkZSBidXQgIgotCQkJCQkgImFsbG93aW5nIGRpc2Nvbm5lY3QgZm9yIHJlbW92YWJsZSBtZWRpYS5cbiIsCi0JCQkJCSBlc3AtPmVzcF9pZCkpOwotCQkJCWJ1aWxkX3N5bmNfbmVnb19tc2coZXNwLCAwLCAwKTsKLQkJCX0gZWxzZSB7Ci0JCQkJYnVpbGRfc3luY19uZWdvX21zZyhlc3AsIGVzcC0+c3luY19kZWZwLCAxNSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlidWlsZF9zeW5jX25lZ29fbXNnKGVzcCwgMCwgMCk7Ci0JCX0KLQkJZXNwX2Rldi0+c3luYyA9IDE7Ci0JCWVzcC0+c25pcCA9IDE7Ci0KLWFmdGVyX25lZ29fbXNnX2J1aWx0OgotCQkvKiBBIGZpeCBmb3IgYnJva2VuIFNDU0kxIHRhcmdldHMsIHdoZW4gdGhleSBkaXNjb25uZWN0Ci0JCSAqIHRoZXkgbG9jayB1cCB0aGUgYnVzIGFuZCBjb25mdXNlIEVTUC4gIFNvIGRpc2FsbG93Ci0JCSAqIGRpc2Nvbm5lY3RzIGZvciBTQ1NJMSB0YXJnZXRzIGZvciBub3cgdW50aWwgd2UKLQkJICogZmluZCBhIGJldHRlciBmaXguCi0JCSAqCi0JCSAqIEFkZGVuZHVtOiBUaGlzIGlzIGZ1bm55LCBJIGZpZ3VyZWQgb3V0IHdoYXQgd2FzIGdvaW5nCi0JCSAqICAgICAgICAgICBvbi4gIFRoZSBibG90emVkIFNDU0kxIHRhcmdldCB3b3VsZCBkaXNjb25uZWN0LAotCQkgKiAgICAgICAgICAgb25lIG9mIHRoZSBvdGhlciBTQ1NJMiB0YXJnZXRzIG9yIGJvdGggd291bGQgYmUKLQkJICogICAgICAgICAgIGRpc2Nvbm5lY3RlZCBhcyB3ZWxsLiAgVGhlIFNDU0kxIHRhcmdldCB3b3VsZAotCQkgKiAgICAgICAgICAgc3RheSBkaXNjb25uZWN0ZWQgbG9uZyBlbm91Z2ggdGhhdCB3ZSBzdGFydAotCQkgKiAgICAgICAgICAgdXAgYSBjb21tYW5kIG9uIG9uZSBvZiB0aGUgU0NTSTIgdGFyZ2V0cy4gIEFzCi0JCSAqICAgICAgICAgICB0aGUgRVNQIGlzIGFyYml0cmF0aW5nIGZvciB0aGUgYnVzIHRoZSBTQ1NJMQotCQkgKiAgICAgICAgICAgdGFyZ2V0IGJlZ2lucyB0byBhcmJpdHJhdGUgYXMgd2VsbCB0byByZXNlbGVjdAotCQkgKiAgICAgICAgICAgdGhlIEVTUC4gIFRoZSBTQ1NJMSB0YXJnZXQgcmVmdXNlcyB0byBkcm9wIGl0J3MKLQkJICogICAgICAgICAgIElEIGJpdCBvbiB0aGUgZGF0YSBidXMgZXZlbiB0aG91Z2ggdGhlIEVTUCBpcwotCQkgKiAgICAgICAgICAgYXQgSUQgNyBhbmQgaXMgdGhlIG9idmlvdXMgd2lubmVyIGZvciBhbnkKLQkJICogICAgICAgICAgIGFyYml0cmF0aW9uLiAgVGhlIEVTUCBpcyBhIHBvb3Igc3BvcnQgYW5kIHJlZnVzZXMKLQkJICogICAgICAgICAgIHRvIGxvc2UgYXJiaXRyYXRpb24sIGl0IHdpbGwgY29udGludWUgaW5kZWZpbml0ZWx5Ci0JCSAqICAgICAgICAgICB0cnlpbmcgdG8gYXJiaXRyYXRlIGZvciB0aGUgYnVzIGFuZCBjYW4gb25seSBiZQotCQkgKiAgICAgICAgICAgc3RvcHBlZCB2aWEgYSBjaGlwIHJlc2V0IG9yIFNDU0kgYnVzIHJlc2V0LgotCQkgKiAgICAgICAgICAgVGhlcmVmb3JlIF9ub18gZGlzY29ubmVjdHMgZm9yIFNDU0kxIHRhcmdldHMKLQkJICogICAgICAgICAgIHRoYW5rIHlvdSB2ZXJ5IG11Y2guIDstKQotCQkgKi8KLQkJaWYoKChTRHB0ci0+c2NzaV9sZXZlbCA8IDMpICYmCi0JCSAgICAoU0RwdHItPnR5cGUgIT0gVFlQRV9UQVBFKSAmJgotCQkgICAgU0RwdHItPnJlbW92YWJsZSA9PSAwKSB8fAotCQkgICAgY2Ryb21faHdidWdfd2thcm91bmQgfHwgU0RwdHItPmJvcmtlbikgewotCQkJRVNQTUlTQygoS0VSTl9JTkZPICJlc3AlZDogRGlzYWJsaW5nIERJU0NPTk5FQ1QgZm9yIHRhcmdldCAlZCAiCi0JCQkJICJsdW4gJWRcbiIsIGVzcC0+ZXNwX2lkLCBTQ3B0ci0+ZGV2aWNlLT5pZCwgU0NwdHItPmRldmljZS0+bHVuKSk7Ci0JCQllc3BfZGV2LT5kaXNjb25uZWN0ID0gMDsKLQkJCSpjbWRwKysgPSBJREVOVElGWSgwLCBsdW4pOwotCQl9IGVsc2UgewotCQkJKmNtZHArKyA9IElERU5USUZZKDEsIGx1bik7Ci0JCX0KLQotCQkvKiBFU1AgZmlmbyBpcyBvbmx5IHNvIGJpZy4uLgotCQkgKiBNYWtlIHRoaXMgbG9vayBsaWtlIGEgc2xvdyBjb21tYW5kLgotCQkgKi8KLQkJZXNwLT5lc3Bfc2xvd2NtZCA9IDE7Ci0JCWVzcC0+ZXNwX3NjbWRsZWZ0ID0gU0NwdHItPmNtZF9sZW47Ci0JCWVzcC0+ZXNwX3NjbWRwID0gJlNDcHRyLT5jbW5kWzBdOwotCi0JCXRoZV9lc3BfY29tbWFuZCA9IChFU1BfQ01EX1NFTEFTIHwgRVNQX0NNRF9ETUEpOwotCQllc3BfYWR2YW5jZV9waGFzZShTQ3B0ciwgaW5fc2xjdF9tc2cpOwotCX0KLQotCWlmICghZXNwLT5lc3Bfc2xvd2NtZCkKLQkJZm9yIChpID0gMDsgaSA8IFNDcHRyLT5jbWRfbGVuOyBpKyspCi0JCQkqY21kcCsrID0gU0NwdHItPmNtbmRbaV07Ci0KLQkvKiBITUUgc3Vja3MuLi4gKi8KLQlpZiAoZXNwLT5lcmV2ID09IGZhc2htZSkKLQkJc2J1c193cml0ZWIoKHRhcmdldCAmIDB4ZikgfCAoRVNQX0JVU0lEX1JFU0VMSUQgfCBFU1BfQlVTSURfQ1RSMzJCSVQpLAotCQkJICAgIGVzcC0+ZXJlZ3MgKyBFU1BfQlVTSUQpOwotCWVsc2UKLQkJc2J1c193cml0ZWIodGFyZ2V0ICYgNywgZXNwLT5lcmVncyArIEVTUF9CVVNJRCk7Ci0JaWYgKGVzcC0+cHJldl9zb2ZmICE9IGVzcF9kZXYtPnN5bmNfbWF4X29mZnNldCB8fAotCSAgICBlc3AtPnByZXZfc3RwICAhPSBlc3BfZGV2LT5zeW5jX21pbl9wZXJpb2QgfHwKLQkgICAgKGVzcC0+ZXJldiA+IGVzcDEwMGEgJiYKLQkgICAgIGVzcC0+cHJldl9jZmczICE9IGVzcC0+Y29uZmlnM1t0YXJnZXRdKSkgewotCQllc3AtPnByZXZfc29mZiA9IGVzcF9kZXYtPnN5bmNfbWF4X29mZnNldDsKLQkJZXNwLT5wcmV2X3N0cCA9IGVzcF9kZXYtPnN5bmNfbWluX3BlcmlvZDsKLQkJc2J1c193cml0ZWIoZXNwLT5wcmV2X3NvZmYsIGVzcC0+ZXJlZ3MgKyBFU1BfU09GRik7Ci0JCXNidXNfd3JpdGViKGVzcC0+cHJldl9zdHAsIGVzcC0+ZXJlZ3MgKyBFU1BfU1RQKTsKLQkJaWYgKGVzcC0+ZXJldiA+IGVzcDEwMGEpIHsKLQkJCWVzcC0+cHJldl9jZmczID0gZXNwLT5jb25maWczW3RhcmdldF07Ci0JCQlzYnVzX3dyaXRlYihlc3AtPnByZXZfY2ZnMywgZXNwLT5lcmVncyArIEVTUF9DRkczKTsKLQkJfQotCX0KLQlpID0gKGNtZHAgLSBlc3AtPmVzcF9jb21tYW5kKTsKLQotCWlmIChlc3AtPmVyZXYgPT0gZmFzaG1lKSB7Ci0JCWVzcF9jbWQoZXNwLCBFU1BfQ01EX0ZMVVNIKTsgLyogR3JyciEgKi8KLQotCQkvKiBTZXQgdXAgdGhlIERNQSBhbmQgSE1FIGNvdW50ZXJzICovCi0JCXNidXNfd3JpdGViKGksIGVzcC0+ZXJlZ3MgKyBFU1BfVENMT1cpOwotCQlzYnVzX3dyaXRlYigwLCBlc3AtPmVyZWdzICsgRVNQX1RDTUVEKTsKLQkJc2J1c193cml0ZWIoMCwgZXNwLT5lcmVncyArIEZBU19STE8pOwotCQlzYnVzX3dyaXRlYigwLCBlc3AtPmVyZWdzICsgRkFTX1JISSk7Ci0JCWVzcF9jbWQoZXNwLCB0aGVfZXNwX2NvbW1hbmQpOwotCi0JCS8qIFRhbGsgYWJvdXQgdG91Y2h5IGhhcmR3YXJlLi4uICovCi0JCWVzcC0+cHJldl9obWVfZG1hY3NyID0gKChlc3AtPnByZXZfaG1lX2RtYWNzciB8Ci0JCQkJCSAoRE1BX1NDU0lfRElTQUIgfCBETUFfRU5BQkxFKSkgJgotCQkJCQl+KERNQV9TVF9XUklURSkpOwotCQlzYnVzX3dyaXRlbCgxNiwgZXNwLT5kcmVncyArIERNQV9DT1VOVCk7Ci0JCXNidXNfd3JpdGVsKGVzcC0+ZXNwX2NvbW1hbmRfZHZtYSwgZXNwLT5kcmVncyArIERNQV9BRERSKTsKLQkJc2J1c193cml0ZWwoZXNwLT5wcmV2X2htZV9kbWFjc3IsIGVzcC0+ZHJlZ3MgKyBETUFfQ1NSKTsKLQl9IGVsc2UgewotCQl1MzIgdG1wOwotCi0JCS8qIFNldCB1cCB0aGUgRE1BIGFuZCBFU1AgY291bnRlcnMgKi8KLQkJc2J1c193cml0ZWIoaSwgZXNwLT5lcmVncyArIEVTUF9UQ0xPVyk7Ci0JCXNidXNfd3JpdGViKDAsIGVzcC0+ZXJlZ3MgKyBFU1BfVENNRUQpOwotCQl0bXAgPSBzYnVzX3JlYWRsKGVzcC0+ZHJlZ3MgKyBETUFfQ1NSKTsKLQkJdG1wICY9IH5ETUFfU1RfV1JJVEU7Ci0JCXRtcCB8PSBETUFfRU5BQkxFOwotCQlzYnVzX3dyaXRlbCh0bXAsIGVzcC0+ZHJlZ3MgKyBETUFfQ1NSKTsKLQkJaWYgKGVzcC0+ZG1hLT5yZXZpc2lvbiA9PSBkdm1hZXNjMSkgewotCQkJaWYgKGkpIC8qIFdvcmthcm91bmQgRVNDIGdhdGUgYXJyYXkgU0JVUyByZXJ1biBidWcuICovCi0JCQkJc2J1c193cml0ZWwoUEFHRV9TSVpFLCBlc3AtPmRyZWdzICsgRE1BX0NPVU5UKTsKLQkJfQotCQlzYnVzX3dyaXRlbChlc3AtPmVzcF9jb21tYW5kX2R2bWEsIGVzcC0+ZHJlZ3MgKyBETUFfQUREUik7Ci0KLQkJLyogVGVsbCBFU1AgdG8gImdvIi4gKi8KLQkJZXNwX2NtZChlc3AsIHRoZV9lc3BfY29tbWFuZCk7Ci0JfQotfQotCi0vKiBRdWV1ZSBhIFNDU0kgY29tbWFuZCBkZWxpdmVyZWQgZnJvbSB0aGUgbWlkLWxldmVsIExpbnV4IFNDU0kgY29kZS4gKi8KLXN0YXRpYyBpbnQgZXNwX3F1ZXVlKHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50LCB2b2lkICgqZG9uZSkoc3RydWN0IHNjc2lfY21uZCAqKSkKLXsKLQlzdHJ1Y3QgZXNwICplc3A7Ci0KLQkvKiBTZXQgdXAgZnVuYyBwdHIgYW5kIGluaXRpYWwgZHJpdmVyIGNtZC1waGFzZS4gKi8KLQlTQ3BudC0+c2NzaV9kb25lID0gZG9uZTsKLQlTQ3BudC0+U0NwLnBoYXNlID0gbm90X2lzc3VlZDsKLQotCS8qIFdlIHVzZSB0aGUgc2NyYXRjaCBhcmVhLiAqLwotCUVTUFFVRVVFKCgiZXNwX3F1ZXVlOiB0YXJnZXQ9JWQgbHVuPSVkICIsIFNDcG50LT5kZXZpY2UtPmlkLCBTQ3BudC0+ZGV2aWNlLT5sdW4pKTsKLQlFU1BESVNDKCgiTjwlMDJ4LCUwMng+IiwgU0NwbnQtPmRldmljZS0+aWQsIFNDcG50LT5kZXZpY2UtPmx1bikpOwotCi0JZXNwID0gKHN0cnVjdCBlc3AgKikgU0NwbnQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7Ci0JZXNwX2dldF9kbWFidWZzKGVzcCwgU0NwbnQpOwotCWVzcF9zYXZlX3BvaW50ZXJzKGVzcCwgU0NwbnQpOyAvKiBGSVhNRSBmb3IgdGFnIHF1ZXVlaW5nICovCi0KLQlTQ3BudC0+U0NwLlN0YXR1cyAgICAgICAgICAgPSBDSEVDS19DT05ESVRJT047Ci0JU0NwbnQtPlNDcC5NZXNzYWdlICAgICAgICAgID0gMHhmZjsKLQlTQ3BudC0+U0NwLnNlbnRfY29tbWFuZCAgICAgPSAwOwotCi0JLyogUGxhY2UgaW50byBvdXIgcXVldWUuICovCi0JaWYgKFNDcG50LT5jbW5kWzBdID09IFJFUVVFU1RfU0VOU0UpIHsKLQkJRVNQUVVFVUUoKCJSUVNFTlNFXG4iKSk7Ci0JCXByZXBlbmRfU0MoJmVzcC0+aXNzdWVfU0MsIFNDcG50KTsKLQl9IGVsc2UgewotCQlFU1BRVUVVRSgoIlxuIikpOwotCQlhcHBlbmRfU0MoJmVzcC0+aXNzdWVfU0MsIFNDcG50KTsKLQl9Ci0KLQkvKiBSdW4gaXQgbm93IGlmIHdlIGNhbi4gKi8KLQlpZiAoIWVzcC0+Y3VycmVudF9TQyAmJiAhZXNwLT5yZXNldHRpbmdfYnVzKQotCQllc3BfZXhlY19jbWQoZXNwKTsKLQotCXJldHVybiAwOwotfQotCi0vKiBEdW1wIGRyaXZlciBzdGF0ZS4gKi8KLXN0YXRpYyB2b2lkIGVzcF9kdW1wX2NtZChzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3B0cikKLXsKLQlFU1BMT0coKCJbdGd0PCUwMng+IGx1bjwlMDJ4PiAiCi0JCSJwcGhhc2U8JXM+IGNwaGFzZTwlcz5dIiwKLQkJU0NwdHItPmRldmljZS0+aWQsIFNDcHRyLT5kZXZpY2UtPmx1biwKLQkJcGhhc2Vfc3RyaW5nKFNDcHRyLT5TQ3Auc2VudF9jb21tYW5kKSwKLQkJcGhhc2Vfc3RyaW5nKFNDcHRyLT5TQ3AucGhhc2UpKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGVzcF9kdW1wX3N0YXRlKHN0cnVjdCBlc3AgKmVzcCkKLXsKLQlzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3B0ciA9IGVzcC0+Y3VycmVudF9TQzsKLSNpZmRlZiBERUJVR19FU1BfQ01EUwotCWludCBpOwotI2VuZGlmCi0KLQlFU1BMT0coKCJlc3AlZDogZHVtcGluZyBzdGF0ZVxuIiwgZXNwLT5lc3BfaWQpKTsKLQlFU1BMT0coKCJlc3AlZDogZG1hIC0tIGNvbmRfcmVnPCUwOHg+IGFkZHI8JTA4eD5cbiIsCi0JCWVzcC0+ZXNwX2lkLAotCQlzYnVzX3JlYWRsKGVzcC0+ZHJlZ3MgKyBETUFfQ1NSKSwKLQkJc2J1c19yZWFkbChlc3AtPmRyZWdzICsgRE1BX0FERFIpKSk7Ci0JRVNQTE9HKCgiZXNwJWQ6IFNXIFtzcmVnPCUwMng+IHNzdGVwPCUwMng+IGlyZWc8JTAyeD5dXG4iLAotCQllc3AtPmVzcF9pZCwgZXNwLT5zcmVnLCBlc3AtPnNlcXJlZywgZXNwLT5pcmVnKSk7Ci0JRVNQTE9HKCgiZXNwJWQ6IEhXIHJlcmVhZCBbc3JlZzwlMDJ4PiBzc3RlcDwlMDJ4PiBpcmVnPCUwMng+XVxuIiwKLQkJZXNwLT5lc3BfaWQsCi0JCXNidXNfcmVhZGIoZXNwLT5lcmVncyArIEVTUF9TVEFUVVMpLAotCQlzYnVzX3JlYWRiKGVzcC0+ZXJlZ3MgKyBFU1BfU1NURVApLAotCQlzYnVzX3JlYWRiKGVzcC0+ZXJlZ3MgKyBFU1BfSU5UUlBUKSkpOwotI2lmZGVmIERFQlVHX0VTUF9DTURTCi0JcHJpbnRrKCJlc3AlZDogbGFzdCBFU1AgY21kcyBbIiwgZXNwLT5lc3BfaWQpOwotCWkgPSAoZXNwLT5lc3BjbWRlbnQgLSAxKSAmIDMxOwotCXByaW50aygiPCIpOyBlc3BfcHJpbnRfY21kKGVzcC0+ZXNwY21kbG9nW2ldKTsgcHJpbnRrKCI+Iik7Ci0JaSA9IChpIC0gMSkgJiAzMTsKLQlwcmludGsoIjwiKTsgZXNwX3ByaW50X2NtZChlc3AtPmVzcGNtZGxvZ1tpXSk7IHByaW50aygiPiIpOwotCWkgPSAoaSAtIDEpICYgMzE7Ci0JcHJpbnRrKCI8Iik7IGVzcF9wcmludF9jbWQoZXNwLT5lc3BjbWRsb2dbaV0pOyBwcmludGsoIj4iKTsKLQlpID0gKGkgLSAxKSAmIDMxOwotCXByaW50aygiPCIpOyBlc3BfcHJpbnRfY21kKGVzcC0+ZXNwY21kbG9nW2ldKTsgcHJpbnRrKCI+Iik7Ci0JcHJpbnRrKCJdXG4iKTsKLSNlbmRpZiAvKiAoREVCVUdfRVNQX0NNRFMpICovCi0KLQlpZiAoU0NwdHIpIHsKLQkJRVNQTE9HKCgiZXNwJWQ6IGN1cnJlbnQgY29tbWFuZCAiLCBlc3AtPmVzcF9pZCkpOwotCQllc3BfZHVtcF9jbWQoU0NwdHIpOwotCX0KLQlFU1BMT0coKCJcbiIpKTsKLQlTQ3B0ciA9IGVzcC0+ZGlzY29ubmVjdGVkX1NDOwotCUVTUExPRygoImVzcCVkOiBkaXNjb25uZWN0ZWQgIiwgZXNwLT5lc3BfaWQpKTsKLQl3aGlsZSAoU0NwdHIpIHsKLQkJZXNwX2R1bXBfY21kKFNDcHRyKTsKLQkJU0NwdHIgPSAoc3RydWN0IHNjc2lfY21uZCAqKSBTQ3B0ci0+aG9zdF9zY3JpYmJsZTsKLQl9Ci0JRVNQTE9HKCgiXG4iKSk7Ci19Ci0KLS8qIEFib3J0IGEgY29tbWFuZC4gIFRoZSBob3N0X2xvY2sgaXMgYWNxdWlyZWQgYnkgY2FsbGVyLiAqLwotc3RhdGljIGludCBlc3BfYWJvcnQoc3RydWN0IHNjc2lfY21uZCAqU0NwdHIpCi17Ci0Jc3RydWN0IGVzcCAqZXNwID0gKHN0cnVjdCBlc3AgKikgU0NwdHItPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7Ci0JaW50IGRvbjsKLQotCUVTUExPRygoImVzcCVkOiBBYm9ydGluZyBjb21tYW5kXG4iLCBlc3AtPmVzcF9pZCkpOwotCWVzcF9kdW1wX3N0YXRlKGVzcCk7Ci0KLQkvKiBXaGVlZSwgaWYgdGhpcyBpcyB0aGUgY3VycmVudCBjb21tYW5kIG9uIHRoZSBidXMsIHRoZQotCSAqIGJlc3Qgd2UgY2FuIGRvIGlzIGFzc2VydCBBVE4gYW5kIHdhaXQgZm9yIG1zZ291dCBwaGFzZS4KLQkgKiBUaGlzIHNob3VsZCBldmVuIGZpeCBhIGh1bmcgU0NTSSBidXMgd2hlbiB3ZSBsb3NlIHN0YXRlCi0JICogaW4gdGhlIGRyaXZlciBhbmQgdGltZW91dCBiZWNhdXNlIHRoZSBldmVudHVhbCBwaGFzZSBjaGFuZ2UKLQkgKiB3aWxsIGNhdXNlIHRoZSBFU1AgdG8gKGV2ZW50dWFsbHkpIGdpdmUgYW4gaW50ZXJydXB0LgotCSAqLwotCWlmIChlc3AtPmN1cnJlbnRfU0MgPT0gU0NwdHIpIHsKLQkJZXNwLT5jdXJfbXNnb3V0WzBdID0gQUJPUlQ7Ci0JCWVzcC0+bXNnb3V0X2xlbiA9IDE7Ci0JCWVzcC0+bXNnb3V0X2N0ciA9IDA7Ci0JCWVzcF9jbWQoZXNwLCBFU1BfQ01EX1NBVE4pOwotCQlyZXR1cm4gU1VDQ0VTUzsKLQl9Ci0KLQkvKiBJZiBpdCBpcyBzdGlsbCBpbiB0aGUgaXNzdWUgcXVldWUgdGhlbiB3ZSBjYW4gc2FmZWx5Ci0JICogY2FsbCB0aGUgY29tcGxldGlvbiByb3V0aW5lIGFuZCByZXBvcnQgYWJvcnQgc3VjY2Vzcy4KLQkgKi8KLQlkb24gPSAoc2J1c19yZWFkbChlc3AtPmRyZWdzICsgRE1BX0NTUikgJiBETUFfSU5UX0VOQUIpOwotCWlmIChkb24pIHsKLQkJRVNQX0lOVFNPRkYoZXNwLT5kcmVncyk7Ci0JfQotCWlmIChlc3AtPmlzc3VlX1NDKSB7Ci0JCXN0cnVjdCBzY3NpX2NtbmQgKipwcmV2LCAqdGhpczsKLQkJZm9yIChwcmV2ID0gKCZlc3AtPmlzc3VlX1NDKSwgdGhpcyA9IGVzcC0+aXNzdWVfU0M7Ci0JCSAgICAgdGhpcyAhPSBOVUxMOwotCQkgICAgIHByZXYgPSAoc3RydWN0IHNjc2lfY21uZCAqKikgJih0aGlzLT5ob3N0X3NjcmliYmxlKSwKLQkJCSAgICAgdGhpcyA9IChzdHJ1Y3Qgc2NzaV9jbW5kICopIHRoaXMtPmhvc3Rfc2NyaWJibGUpIHsKLQotCQkJaWYgKHRoaXMgPT0gU0NwdHIpIHsKLQkJCQkqcHJldiA9IChzdHJ1Y3Qgc2NzaV9jbW5kICopIHRoaXMtPmhvc3Rfc2NyaWJibGU7Ci0JCQkJdGhpcy0+aG9zdF9zY3JpYmJsZSA9IE5VTEw7Ci0KLQkJCQllc3BfcmVsZWFzZV9kbWFidWZzKGVzcCwgdGhpcyk7Ci0JCQkJdGhpcy0+cmVzdWx0ID0gRElEX0FCT1JUIDw8IDE2OwotCQkJCXRoaXMtPnNjc2lfZG9uZSh0aGlzKTsKLQotCQkJCWlmIChkb24pCi0JCQkJCUVTUF9JTlRTT04oZXNwLT5kcmVncyk7Ci0KLQkJCQlyZXR1cm4gU1VDQ0VTUzsKLQkJCX0KLQkJfQotCX0KLQotCS8qIFl1Y2ssIHRoZSBjb21tYW5kIHRvIGFib3J0IGlzIGRpc2Nvbm5lY3RlZCwgaXQgaXMgbm90Ci0JICogd29ydGggdHJ5aW5nIHRvIGFib3J0IGl0IG5vdyBpZiBzb21ldGhpbmcgZWxzZSBpcyBsaXZlCi0JICogb24gdGhlIGJ1cyBhdCB0aGlzIHRpbWUuICBTbywgd2UgbGV0IHRoZSBTQ1NJIGNvZGUgd2FpdAotCSAqIGEgbGl0dGxlIGJpdCBhbmQgdHJ5IGFnYWluIGxhdGVyLgotCSAqLwotCWlmIChlc3AtPmN1cnJlbnRfU0MpIHsKLQkJaWYgKGRvbikKLQkJCUVTUF9JTlRTT04oZXNwLT5kcmVncyk7Ci0JCXJldHVybiBGQUlMRUQ7Ci0JfQotCi0JLyogSXQncyBkaXNjb25uZWN0ZWQsIHdlIGhhdmUgdG8gcmVjb25uZWN0IHRvIHJlLWVzdGFibGlzaAotCSAqIHRoZSBuZXh1cyBhbmQgdGVsbCB0aGUgZGV2aWNlIHRvIGFib3J0LiAgSG93ZXZlciwgd2UgcmVhbGx5Ci0JICogY2Fubm90ICdyZWNvbm5lY3QnIHBlciBzZS4gIERvbid0IHRyeSB0byBiZSBmYW5jeSwganVzdAotCSAqIGluZGljYXRlIGZhaWx1cmUsIHdoaWNoIGNhdXNlcyBvdXIgY2FsbGVyIHRvIHJlc2V0IHRoZSB3aG9sZQotCSAqIGJ1cy4KLQkgKi8KLQotCWlmIChkb24pCi0JCUVTUF9JTlRTT04oZXNwLT5kcmVncyk7Ci0KLQlyZXR1cm4gRkFJTEVEOwotfQotCi0vKiBXZSd2ZSBzZW50IEVTUF9DTURfUlMgdG8gdGhlIEVTUCwgdGhlIGludGVycnVwdCBoYWQganVzdAotICogYXJyaXZlZCBpbmRpY2F0aW5nIHRoZSBlbmQgb2YgdGhlIFNDU0kgYnVzIHJlc2V0LiAgT3VyIGpvYgotICogaXMgdG8gY2xlYW4gb3V0IHRoZSBjb21tYW5kIHF1ZXVlcyBhbmQgYmVnaW4gcmUtZXhlY3V0aW9uCi0gKiBvZiBTQ1NJIGNvbW1hbmRzIG9uY2UgbW9yZS4KLSAqLwotc3RhdGljIGludCBlc3BfZmluaXNoX3Jlc2V0KHN0cnVjdCBlc3AgKmVzcCkKLXsKLQlzdHJ1Y3Qgc2NzaV9jbW5kICpzcCA9IGVzcC0+Y3VycmVudF9TQzsKLQotCS8qIENsZWFuIHVwIGN1cnJlbnRseSBleGVjdXRpbmcgY29tbWFuZCwgaWYgYW55LiAqLwotCWlmIChzcCAhPSBOVUxMKSB7Ci0JCWVzcC0+Y3VycmVudF9TQyA9IE5VTEw7Ci0KLQkJZXNwX3JlbGVhc2VfZG1hYnVmcyhlc3AsIHNwKTsKLQkJc3AtPnJlc3VsdCA9IChESURfUkVTRVQgPDwgMTYpOwotCi0JCXNwLT5zY3NpX2RvbmUoc3ApOwotCX0KLQotCS8qIENsZWFuIHVwIGRpc2Nvbm5lY3RlZCBxdWV1ZSwgdGhleSBoYXZlIGJlZW4gaW52YWxpZGF0ZWQKLQkgKiBieSB0aGUgYnVzIHJlc2V0LgotCSAqLwotCWlmIChlc3AtPmRpc2Nvbm5lY3RlZF9TQykgewotCQl3aGlsZSAoKHNwID0gcmVtb3ZlX2ZpcnN0X1NDKCZlc3AtPmRpc2Nvbm5lY3RlZF9TQykpICE9IE5VTEwpIHsKLQkJCWVzcF9yZWxlYXNlX2RtYWJ1ZnMoZXNwLCBzcCk7Ci0JCQlzcC0+cmVzdWx0ID0gKERJRF9SRVNFVCA8PCAxNik7Ci0KLQkJCXNwLT5zY3NpX2RvbmUoc3ApOwotCQl9Ci0JfQotCi0JLyogU0NTSSBidXMgcmVzZXQgaXMgY29tcGxldGUuICovCi0JZXNwLT5yZXNldHRpbmdfYnVzID0gMDsKLQl3YWtlX3VwKCZlc3AtPnJlc2V0X3F1ZXVlKTsKLQotCS8qIE9rLCBub3cgaXQgaXMgc2FmZSB0byBnZXQgY29tbWFuZHMgZ29pbmcgb25jZSBtb3JlLiAqLwotCWlmIChlc3AtPmlzc3VlX1NDKQotCQllc3BfZXhlY19jbWQoZXNwKTsKLQotCXJldHVybiBkb19pbnRyX2VuZDsKLX0KLQotc3RhdGljIGludCBlc3BfZG9fcmVzZXRidXMoc3RydWN0IGVzcCAqZXNwKQotewotCUVTUExPRygoImVzcCVkOiBSZXNldHRpbmcgc2NzaSBidXNcbiIsIGVzcC0+ZXNwX2lkKSk7Ci0JZXNwLT5yZXNldHRpbmdfYnVzID0gMTsKLQllc3BfY21kKGVzcCwgRVNQX0NNRF9SUyk7Ci0KLQlyZXR1cm4gZG9faW50cl9lbmQ7Ci19Ci0KLS8qIFJlc2V0IEVTUCBjaGlwLCByZXNldCBoYW5naW5nIGJ1cywgdGhlbiBraWxsIGFjdGl2ZSBhbmQKLSAqIGRpc2Nvbm5lY3RlZCBjb21tYW5kcyBmb3IgdGFyZ2V0cyB3aXRob3V0IHNvZnQgcmVzZXQuCi0gKgotICogVGhlIGhvc3RfbG9jayBpcyBhY3F1aXJlZCBieSBjYWxsZXIuCi0gKi8KLXN0YXRpYyBpbnQgZXNwX3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKlNDcHRyKQotewotCXN0cnVjdCBlc3AgKmVzcCA9IChzdHJ1Y3QgZXNwICopIFNDcHRyLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOwotCi0Jc3Bpbl9sb2NrX2lycShlc3AtPmVob3N0LT5ob3N0X2xvY2spOwotCSh2b2lkKSBlc3BfZG9fcmVzZXRidXMoZXNwKTsKLQlzcGluX3VubG9ja19pcnEoZXNwLT5laG9zdC0+aG9zdF9sb2NrKTsKLQotCXdhaXRfZXZlbnQoZXNwLT5yZXNldF9xdWV1ZSwgKGVzcC0+cmVzZXR0aW5nX2J1cyA9PSAwKSk7Ci0KLQlyZXR1cm4gU1VDQ0VTUzsKLX0KLQotLyogSW50ZXJuYWwgRVNQIGRvbmUgZnVuY3Rpb24uICovCi1zdGF0aWMgdm9pZCBlc3BfZG9uZShzdHJ1Y3QgZXNwICplc3AsIGludCBlcnJvcikKLXsKLQlzdHJ1Y3Qgc2NzaV9jbW5kICpkb25lX1NDID0gZXNwLT5jdXJyZW50X1NDOwotCi0JZXNwLT5jdXJyZW50X1NDID0gTlVMTDsKLQotCWVzcF9yZWxlYXNlX2RtYWJ1ZnMoZXNwLCBkb25lX1NDKTsKLQlkb25lX1NDLT5yZXN1bHQgPSBlcnJvcjsKLQotCWRvbmVfU0MtPnNjc2lfZG9uZShkb25lX1NDKTsKLQotCS8qIEJ1cyBpcyBmcmVlLCBpc3N1ZSBhbnkgY29tbWFuZHMgaW4gdGhlIHF1ZXVlLiAqLwotCWlmIChlc3AtPmlzc3VlX1NDICYmICFlc3AtPmN1cnJlbnRfU0MpCi0JCWVzcF9leGVjX2NtZChlc3ApOwotCi19Ci0KLS8qIFdoZWVlLCBFU1AgaW50ZXJydXB0IGVuZ2luZS4gKi8gIAotCi0vKiBGb3J3YXJkIGRlY2xhcmF0aW9ucy4gKi8KLXN0YXRpYyBpbnQgZXNwX2RvX3BoYXNlX2RldGVybWluZShzdHJ1Y3QgZXNwICplc3ApOwotc3RhdGljIGludCBlc3BfZG9fZGF0YV9maW5hbGUoc3RydWN0IGVzcCAqZXNwKTsKLXN0YXRpYyBpbnQgZXNwX3NlbGVjdF9jb21wbGV0ZShzdHJ1Y3QgZXNwICplc3ApOwotc3RhdGljIGludCBlc3BfZG9fc3RhdHVzKHN0cnVjdCBlc3AgKmVzcCk7Ci1zdGF0aWMgaW50IGVzcF9kb19tc2dpbihzdHJ1Y3QgZXNwICplc3ApOwotc3RhdGljIGludCBlc3BfZG9fbXNnaW5kb25lKHN0cnVjdCBlc3AgKmVzcCk7Ci1zdGF0aWMgaW50IGVzcF9kb19tc2dvdXQoc3RydWN0IGVzcCAqZXNwKTsKLXN0YXRpYyBpbnQgZXNwX2RvX2NtZGJlZ2luKHN0cnVjdCBlc3AgKmVzcCk7Ci0KLSNkZWZpbmUgc3JlZ19kYXRhaW5wKF9fc3JlZykgICgoKF9fc3JlZykgJiBFU1BfU1RBVF9QTUFTSykgPT0gRVNQX0RJUCkKLSNkZWZpbmUgc3JlZ19kYXRhb3V0cChfX3NyZWcpICgoKF9fc3JlZykgJiBFU1BfU1RBVF9QTUFTSykgPT0gRVNQX0RPUCkKLQotLyogUmVhZCBhbnkgYnl0ZXMgZm91bmQgaW4gdGhlIEZBUzM2NiBmaWZvLCBzdG9yaW5nIHRoZW0gaW50bwotICogdGhlIEVTUCBkcml2ZXIgc29mdHdhcmUgc3RhdGUgc3RydWN0dXJlLgotICovCi1zdGF0aWMgdm9pZCBobWVfZmlmb19yZWFkKHN0cnVjdCBlc3AgKmVzcCkKLXsKLQl1OCBjb3VudCA9IDA7Ci0JdTggc3RhdHVzID0gZXNwLT5zcmVnOwotCi0JLyogQ2Fubm90IHNhZmVseSBmcm9iIHRoZSBmaWZvIGZvciB0aGVzZSBmb2xsb3dpbmcgY2FzZXMsIGJ1dAotCSAqIHdlIG11c3QgYWx3YXlzIHJlYWQgdGhlIGZpZm8gd2hlbiB0aGUgcmVzZWxlY3QgaW50ZXJydXB0Ci0JICogaXMgcGVuZGluZy4KLQkgKi8KLQlpZiAoKChlc3AtPmlyZWcgJiBFU1BfSU5UUl9SU0VMKSA9PSAwKQkmJgotCSAgICAoc3JlZ19kYXRhaW5wKHN0YXR1cykJCXx8Ci0JICAgICBzcmVnX2RhdGFvdXRwKHN0YXR1cykJCXx8Ci0JICAgICAoZXNwLT5jdXJyZW50X1NDICYmCi0JICAgICAgZXNwLT5jdXJyZW50X1NDLT5TQ3AucGhhc2UgPT0gaW5fZGF0YV9kb25lKSkpIHsKLQkJRVNQSE1FKCgiPHdrYXJvdW5kX3NraXBwZWQ+IikpOwotCX0gZWxzZSB7Ci0JCXVuc2lnbmVkIGxvbmcgZmNudCA9IHNidXNfcmVhZGIoZXNwLT5lcmVncyArIEVTUF9GRkxBR1MpICYgRVNQX0ZGX0ZCWVRFUzsKLQotCQkvKiBUaGUgSE1FIHN0b3JlcyBieXRlcyBpbiBtdWx0aXBsZXMgb2YgMiBpbiB0aGUgZmlmby4gKi8KLQkJRVNQSE1FKCgiaG1lX2ZpZm9bZmNudD0lZCIsIChpbnQpZmNudCkpOwotCQl3aGlsZSAoZmNudCkgewotCQkJZXNwLT5obWVfZmlmb193b3JrYXJvdW5kX2J1ZmZlcltjb3VudCsrXSA9Ci0JCQkJc2J1c19yZWFkYihlc3AtPmVyZWdzICsgRVNQX0ZEQVRBKTsKLQkJCWVzcC0+aG1lX2ZpZm9fd29ya2Fyb3VuZF9idWZmZXJbY291bnQrK10gPQotCQkJCXNidXNfcmVhZGIoZXNwLT5lcmVncyArIEVTUF9GREFUQSk7Ci0JCQlFU1BITUUoKCI8JTAyeCwlMDJ4PiIsIGVzcC0+aG1lX2ZpZm9fd29ya2Fyb3VuZF9idWZmZXJbY291bnQtMl0sIGVzcC0+aG1lX2ZpZm9fd29ya2Fyb3VuZF9idWZmZXJbY291bnQtMV0pKTsKLQkJCWZjbnQtLTsKLQkJfQotCQlpZiAoc2J1c19yZWFkYihlc3AtPmVyZWdzICsgRVNQX1NUQVRVUzIpICYgRVNQX1NUQVQyX0YxQllURSkgewotCQkJRVNQSE1FKCgiPHBva2VfYnl0ZT4iKSk7Ci0JCQlzYnVzX3dyaXRlYigwLCBlc3AtPmVyZWdzICsgRVNQX0ZEQVRBKTsKLQkJCWVzcC0+aG1lX2ZpZm9fd29ya2Fyb3VuZF9idWZmZXJbY291bnQrK10gPQotCQkJCXNidXNfcmVhZGIoZXNwLT5lcmVncyArIEVTUF9GREFUQSk7Ci0JCQlFU1BITUUoKCI8JTAyeCwweDAwPiIsIGVzcC0+aG1lX2ZpZm9fd29ya2Fyb3VuZF9idWZmZXJbY291bnQtMV0pKTsKLQkJCUVTUEhNRSgoIkNNRF9GTFVTSCIpKTsKLQkJCWVzcF9jbWQoZXNwLCBFU1BfQ01EX0ZMVVNIKTsKLQkJfSBlbHNlIHsKLQkJCUVTUEhNRSgoIm5vX3h0cmFfYnl0ZSIpKTsKLQkJfQotCX0KLQlFU1BITUUoKCJ3a2FybmRfY250PSVkXSIsIChpbnQpY291bnQpKTsKLQllc3AtPmhtZV9maWZvX3dvcmthcm91bmRfY291bnQgPSBjb3VudDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGhtZV9maWZvX3B1c2goc3RydWN0IGVzcCAqZXNwLCB1OCAqYnl0ZXMsIHU4IGNvdW50KQotewotCWVzcF9jbWQoZXNwLCBFU1BfQ01EX0ZMVVNIKTsKLQl3aGlsZSAoY291bnQpIHsKLQkJdTggdG1wID0gKmJ5dGVzKys7Ci0JCXNidXNfd3JpdGViKHRtcCwgZXNwLT5lcmVncyArIEVTUF9GREFUQSk7Ci0JCXNidXNfd3JpdGViKDAsIGVzcC0+ZXJlZ3MgKyBFU1BfRkRBVEEpOwotCQljb3VudC0tOwotCX0KLX0KLQotLyogV2UgdHJ5IHRvIGF2b2lkIHNvbWUgaW50ZXJydXB0cyBieSBqdW1waW5nIGFoZWFkIGFuZCBzZWUgaWYgdGhlIEVTUAotICogaGFzIGdvdHRlbiBmYXIgZW5vdWdoIHlldC4gIEhlbmNlIHRoZSBmb2xsb3dpbmcuCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IHNraXBhaGVhZDEoc3RydWN0IGVzcCAqZXNwLCBzdHJ1Y3Qgc2NzaV9jbW5kICpzY3AsCi0JCQkgICAgIGludCBwcmV2X3BoYXNlLCBpbnQgbmV3X3BoYXNlKQotewotCWlmIChzY3AtPlNDcC5zZW50X2NvbW1hbmQgIT0gcHJldl9waGFzZSkKLQkJcmV0dXJuIDA7Ci0JaWYgKEVTUF9JUlFfUChlc3AtPmRyZWdzKSkgewotCQkvKiBZZXMsIHdlIGFyZSBhYmxlIHRvIHNhdmUgYW4gaW50ZXJydXB0LiAqLwotCQlpZiAoZXNwLT5lcmV2ID09IGZhc2htZSkKLQkJCWVzcC0+c3JlZzIgPSBzYnVzX3JlYWRiKGVzcC0+ZXJlZ3MgKyBFU1BfU1RBVFVTMik7Ci0JCWVzcC0+c3JlZyA9IChzYnVzX3JlYWRiKGVzcC0+ZXJlZ3MgKyBFU1BfU1RBVFVTKSAmIH4oRVNQX1NUQVRfSU5UUikpOwotCQllc3AtPmlyZWcgPSBzYnVzX3JlYWRiKGVzcC0+ZXJlZ3MgKyBFU1BfSU5UUlBUKTsKLQkJaWYgKGVzcC0+ZXJldiA9PSBmYXNobWUpIHsKLQkJCS8qIFRoaXMgY2hpcCBpcyByZWFsbHkgbG9zaW5nLiAqLwotCQkJRVNQSE1FKCgiSE1FWyIpKTsKLQkJCS8qIE11c3QgbGF0Y2ggZmlmbyBiZWZvcmUgcmVhZGluZyB0aGUgaW50ZXJydXB0Ci0JCQkgKiByZWdpc3RlciBlbHNlIGdhcmJhZ2UgZW5kcyB1cCBpbiB0aGUgRklGTwotCQkJICogd2hpY2ggY29uZnVzZXMgdGhlIGRyaXZlciB1dHRlcmx5LgotCQkJICogSGFwcHkgTWVhbCBpbmRlZWQuLi4uCi0JCQkgKi8KLQkJCUVTUEhNRSgoImZpZm9fd29ya2Fyb3VuZF0iKSk7Ci0JCQlpZiAoIShlc3AtPnNyZWcyICYgRVNQX1NUQVQyX0ZFTVBUWSkgfHwKLQkJCSAgICAoZXNwLT5zcmVnMiAmIEVTUF9TVEFUMl9GMUJZVEUpKQotCQkJCWhtZV9maWZvX3JlYWQoZXNwKTsKLQkJfQotCQlpZiAoIShlc3AtPmlyZWcgJiBFU1BfSU5UUl9TUikpCi0JCQlyZXR1cm4gMDsKLQkJZWxzZQotCQkJcmV0dXJuIGRvX3Jlc2V0X2NvbXBsZXRlOwotCX0KLQkvKiBIbyBodW0sIHRhcmdldCBpcyB0YWtpbmcgZm9yZXZlci4uLiAqLwotCXNjcC0+U0NwLnNlbnRfY29tbWFuZCA9IG5ld19waGFzZTsgLyogc28gd2UgZG9uJ3QgcmVjdXJzZS4uLiAqLwotCXJldHVybiBkb19pbnRyX2VuZDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgc2tpcGFoZWFkMihzdHJ1Y3QgZXNwICplc3AsIHN0cnVjdCBzY3NpX2NtbmQgKnNjcCwKLQkJCSAgICAgaW50IHByZXZfcGhhc2UxLCBpbnQgcHJldl9waGFzZTIsIGludCBuZXdfcGhhc2UpCi17Ci0JaWYgKHNjcC0+U0NwLnNlbnRfY29tbWFuZCAhPSBwcmV2X3BoYXNlMSAmJgotCSAgICBzY3AtPlNDcC5zZW50X2NvbW1hbmQgIT0gcHJldl9waGFzZTIpCi0JCXJldHVybiAwOwotCWlmIChFU1BfSVJRX1AoZXNwLT5kcmVncykpIHsKLQkJLyogWWVzLCB3ZSBhcmUgYWJsZSB0byBzYXZlIGFuIGludGVycnVwdC4gKi8KLQkJaWYgKGVzcC0+ZXJldiA9PSBmYXNobWUpCi0JCQllc3AtPnNyZWcyID0gc2J1c19yZWFkYihlc3AtPmVyZWdzICsgRVNQX1NUQVRVUzIpOwotCQllc3AtPnNyZWcgPSAoc2J1c19yZWFkYihlc3AtPmVyZWdzICsgRVNQX1NUQVRVUykgJiB+KEVTUF9TVEFUX0lOVFIpKTsKLQkJZXNwLT5pcmVnID0gc2J1c19yZWFkYihlc3AtPmVyZWdzICsgRVNQX0lOVFJQVCk7Ci0JCWlmIChlc3AtPmVyZXYgPT0gZmFzaG1lKSB7Ci0JCQkvKiBUaGlzIGNoaXAgaXMgcmVhbGx5IGxvc2luZy4gKi8KLQkJCUVTUEhNRSgoIkhNRVsiKSk7Ci0KLQkJCS8qIE11c3QgbGF0Y2ggZmlmbyBiZWZvcmUgcmVhZGluZyB0aGUgaW50ZXJydXB0Ci0JCQkgKiByZWdpc3RlciBlbHNlIGdhcmJhZ2UgZW5kcyB1cCBpbiB0aGUgRklGTwotCQkJICogd2hpY2ggY29uZnVzZXMgdGhlIGRyaXZlciB1dHRlcmx5LgotCQkJICogSGFwcHkgTWVhbCBpbmRlZWQuLi4uCi0JCQkgKi8KLQkJCUVTUEhNRSgoImZpZm9fd29ya2Fyb3VuZF0iKSk7Ci0JCQlpZiAoIShlc3AtPnNyZWcyICYgRVNQX1NUQVQyX0ZFTVBUWSkgfHwKLQkJCSAgICAoZXNwLT5zcmVnMiAmIEVTUF9TVEFUMl9GMUJZVEUpKQotCQkJCWhtZV9maWZvX3JlYWQoZXNwKTsKLQkJfQotCQlpZiAoIShlc3AtPmlyZWcgJiBFU1BfSU5UUl9TUikpCi0JCQlyZXR1cm4gMDsKLQkJZWxzZQotCQkJcmV0dXJuIGRvX3Jlc2V0X2NvbXBsZXRlOwotCX0KLQkvKiBIbyBodW0sIHRhcmdldCBpcyB0YWtpbmcgZm9yZXZlci4uLiAqLwotCXNjcC0+U0NwLnNlbnRfY29tbWFuZCA9IG5ld19waGFzZTsgLyogc28gd2UgZG9uJ3QgcmVjdXJzZS4uLiAqLwotCXJldHVybiBkb19pbnRyX2VuZDsKLX0KLQotLyogTm93IHNvbWUgZG1hIGhlbHBlcnMuICovCi1zdGF0aWMgdm9pZCBkbWFfc2V0dXAoc3RydWN0IGVzcCAqZXNwLCBfX3UzMiBhZGRyLCBpbnQgY291bnQsIGludCB3cml0ZSkKLXsKLQl1MzIgbnJlZyA9IHNidXNfcmVhZGwoZXNwLT5kcmVncyArIERNQV9DU1IpOwotCi0JaWYgKHdyaXRlKQotCQlucmVnIHw9IERNQV9TVF9XUklURTsKLQllbHNlCi0JCW5yZWcgJj0gfihETUFfU1RfV1JJVEUpOwotCW5yZWcgfD0gRE1BX0VOQUJMRTsKLQlzYnVzX3dyaXRlbChucmVnLCBlc3AtPmRyZWdzICsgRE1BX0NTUik7Ci0JaWYgKGVzcC0+ZG1hLT5yZXZpc2lvbiA9PSBkdm1hZXNjMSkgewotCQkvKiBUaGlzIEVTQyBnYXRlIGFycmF5IHN1Y2tzISAqLwotCQlfX3UzMiBzcmMgPSBhZGRyOwotCQlfX3UzMiBkZXN0ID0gc3JjICsgY291bnQ7Ci0KLQkJaWYgKGRlc3QgJiAoUEFHRV9TSVpFIC0gMSkpCi0JCQljb3VudCA9IFBBR0VfQUxJR04oY291bnQpOwotCQlzYnVzX3dyaXRlbChjb3VudCwgZXNwLT5kcmVncyArIERNQV9DT1VOVCk7Ci0JfQotCXNidXNfd3JpdGVsKGFkZHIsIGVzcC0+ZHJlZ3MgKyBETUFfQUREUik7Ci19Ci0KLXN0YXRpYyB2b2lkIGRtYV9kcmFpbihzdHJ1Y3QgZXNwICplc3ApCi17Ci0JdTMyIHRtcDsKLQotCWlmIChlc3AtPmRtYS0+cmV2aXNpb24gPT0gZHZtYWhtZSkKLQkJcmV0dXJuOwotCWlmICgodG1wID0gc2J1c19yZWFkbChlc3AtPmRyZWdzICsgRE1BX0NTUikpICYgRE1BX0ZJRk9fSVNEUkFJTikgewotCQlzd2l0Y2ggKGVzcC0+ZG1hLT5yZXZpc2lvbikgewotCQlkZWZhdWx0OgotCQkJdG1wIHw9IERNQV9GSUZPX1NURFJBSU47Ci0JCQlzYnVzX3dyaXRlbCh0bXAsIGVzcC0+ZHJlZ3MgKyBETUFfQ1NSKTsKLQotCQljYXNlIGR2bWFyZXYzOgotCQljYXNlIGR2bWFlc2MxOgotCQkJd2hpbGUgKHNidXNfcmVhZGwoZXNwLT5kcmVncyArIERNQV9DU1IpICYgRE1BX0ZJRk9fSVNEUkFJTikKLQkJCQl1ZGVsYXkoMSk7Ci0JCX07Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBkbWFfaW52YWxpZGF0ZShzdHJ1Y3QgZXNwICplc3ApCi17Ci0JdTMyIHRtcDsKLQotCWlmIChlc3AtPmRtYS0+cmV2aXNpb24gPT0gZHZtYWhtZSkgewotCQlzYnVzX3dyaXRlbChETUFfUlNUX1NDU0ksIGVzcC0+ZHJlZ3MgKyBETUFfQ1NSKTsKLQotCQllc3AtPnByZXZfaG1lX2RtYWNzciA9ICgoZXNwLT5wcmV2X2htZV9kbWFjc3IgfAotCQkJCQkgKERNQV9QQVJJVFlfT0ZGIHwgRE1BXzJDTEtTIHwKLQkJCQkJICBETUFfU0NTSV9ESVNBQiB8IERNQV9JTlRfRU5BQikpICYKLQkJCQkJfihETUFfU1RfV1JJVEUgfCBETUFfRU5BQkxFKSk7Ci0KLQkJc2J1c193cml0ZWwoMCwgZXNwLT5kcmVncyArIERNQV9DU1IpOwotCQlzYnVzX3dyaXRlbChlc3AtPnByZXZfaG1lX2RtYWNzciwgZXNwLT5kcmVncyArIERNQV9DU1IpOwotCi0JCS8qIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIGF2b2lkIGhhdmluZyB0aGUgU0NTSSBjaGFubmVsCi0JCSAqIGVuZ2luZSBsb2NrIHVwIG9uIHVzLgotCQkgKi8KLQkJc2J1c193cml0ZWwoMCwgZXNwLT5kcmVncyArIERNQV9BRERSKTsKLQl9IGVsc2UgewotCQl3aGlsZSAoKHRtcCA9IHNidXNfcmVhZGwoZXNwLT5kcmVncyArIERNQV9DU1IpKSAmIERNQV9QRU5EX1JFQUQpCi0JCQl1ZGVsYXkoMSk7Ci0KLQkJdG1wICY9IH4oRE1BX0VOQUJMRSB8IERNQV9TVF9XUklURSB8IERNQV9CQ05UX0VOQUIpOwotCQl0bXAgfD0gRE1BX0ZJRk9fSU5WOwotCQlzYnVzX3dyaXRlbCh0bXAsIGVzcC0+ZHJlZ3MgKyBETUFfQ1NSKTsKLQkJdG1wICY9IH5ETUFfRklGT19JTlY7Ci0JCXNidXNfd3JpdGVsKHRtcCwgZXNwLT5kcmVncyArIERNQV9DU1IpOwotCX0KLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGRtYV9mbGFzaGNsZWFyKHN0cnVjdCBlc3AgKmVzcCkKLXsKLQlkbWFfZHJhaW4oZXNwKTsKLQlkbWFfaW52YWxpZGF0ZShlc3ApOwotfQotCi1zdGF0aWMgaW50IGRtYV9jYW5fdHJhbnNmZXIoc3RydWN0IGVzcCAqZXNwLCBzdHJ1Y3Qgc2NzaV9jbW5kICpzcCkKLXsKLQlfX3UzMiBiYXNlLCBlbmQsIHN6OwotCi0JaWYgKGVzcC0+ZG1hLT5yZXZpc2lvbiA9PSBkdm1hcmV2MykgewotCQlzeiA9IHNwLT5TQ3AudGhpc19yZXNpZHVhbDsKLQkJaWYgKHN6ID4gMHgxMDAwMDAwKQotCQkJc3ogPSAweDEwMDAwMDA7Ci0JfSBlbHNlIHsKLQkJYmFzZSA9ICgoX191MzIpKCh1bnNpZ25lZCBsb25nKXNwLT5TQ3AucHRyKSk7Ci0JCWJhc2UgJj0gKDB4MTAwMDAwMCAtIDEpOwotCQllbmQgPSAoYmFzZSArIHNwLT5TQ3AudGhpc19yZXNpZHVhbCk7Ci0JCWlmIChlbmQgPiAweDEwMDAwMDApCi0JCQllbmQgPSAweDEwMDAwMDA7Ci0JCXN6ID0gKGVuZCAtIGJhc2UpOwotCX0KLQlyZXR1cm4gc3o7Ci19Ci0KLS8qIE1pc2MuIGVzcCBoZWxwZXIgbWFjcm9zLiAqLwotI2RlZmluZSBlc3Bfc2V0Y291bnQoX19lcmVncywgX19jbnQsIF9faG1lKSBcCi0Jc2J1c193cml0ZWIoKChfX2NudCkmMHhmZiksIChfX2VyZWdzKSArIEVTUF9UQ0xPVyk7IFwKLQlzYnVzX3dyaXRlYigoKChfX2NudCk+PjgpJjB4ZmYpLCAoX19lcmVncykgKyBFU1BfVENNRUQpOyBcCi0JaWYgKF9faG1lKSB7IFwKLQkJc2J1c193cml0ZWIoKCgoX19jbnQpPj4xNikmMHhmZiksIChfX2VyZWdzKSArIEZBU19STE8pOyBcCi0JCXNidXNfd3JpdGViKDAsIChfX2VyZWdzKSArIEZBU19SSEkpOyBcCi0JfQotCi0jZGVmaW5lIGVzcF9nZXRjb3VudChfX2VyZWdzLCBfX2htZSkgXAotCSgoc2J1c19yZWFkYigoX19lcmVncykgKyBFU1BfVENMT1cpJjB4ZmYpIHwgXAotCSAoKHNidXNfcmVhZGIoKF9fZXJlZ3MpICsgRVNQX1RDTUVEKSYweGZmKSA8PCA4KSB8IFwKLSAgICAgICAgICgoX19obWUpID8gc2J1c19yZWFkYigoX19lcmVncykgKyBGQVNfUkxPKSA8PCAxNiA6IDApKQotCi0jZGVmaW5lIGZjb3VudChfX2VzcCkgXAotCSgoKF9fZXNwKS0+ZXJldiA9PSBmYXNobWUpID8gXAotCSAgKF9fZXNwKS0+aG1lX2ZpZm9fd29ya2Fyb3VuZF9jb3VudCA6IFwKLQkgIHNidXNfcmVhZGIoKChfX2VzcCktPmVyZWdzKSArIEVTUF9GRkxBR1MpICYgRVNQX0ZGX0ZCWVRFUykKLQotI2RlZmluZSBmbnplcm8oX19lc3ApIFwKLQkoKChfX2VzcCktPmVyZXYgPT0gZmFzaG1lKSA/IDAgOiBcCi0JIHNidXNfcmVhZGIoKChfX2VzcCktPmVyZWdzKSArIEVTUF9GRkxBR1MpICYgRVNQX0ZGX09OT1RaRVJPKQotCi0vKiBYWFggc3BlY3VsYXRpdmUgbm9wcyB1bm5lY2Vzc2FyeSB3aGVuIGNvbnRpbnVpbmcgYW1pZHN0IGEgZGF0YSBwaGFzZQotICogWFhYIGV2ZW4gb24gZXNwMTAwISEhICBhbm90aGVyIGNhc2Ugb2YgZmxvb2RpbmcgdGhlIGJ1cyB3aXRoIEkvTyByZWcKLSAqIFhYWCB3cml0ZXMuLi4KLSAqLwotI2RlZmluZSBlc3BfbWF5YmVfbm9wKF9fZXNwKSBcCi0JaWYgKChfX2VzcCktPmVyZXYgPT0gZXNwMTAwKSBcCi0JCWVzcF9jbWQoKF9fZXNwKSwgRVNQX0NNRF9OVUxMKQotCi0jZGVmaW5lIHNyZWdfdG9fZGF0YXBoYXNlKF9fc3JlZykgXAotCSgoKChfX3NyZWcpICYgRVNQX1NUQVRfUE1BU0spID09IEVTUF9ET1ApID8gaW5fZGF0YW91dCA6IGluX2RhdGFpbikKLQotLyogVGhlIEVTUDEwMCB3aGVuIGluIHN5bmNocm9ub3VzIGRhdGEgcGhhc2UsIGNhbiBtaXN0YWtlIGEgbG9uZyBmaW5hbAotICogUkVRIHB1bHNlIGZyb20gdGhlIHRhcmdldCBhcyBhbiBleHRyYSBieXRlLCBpdCBwbGFjZXMgd2hhdGV2ZXIgaXMgb24KLSAqIHRoZSBkYXRhIGxpbmVzIGludG8gdGhlIGZpZm8uICBGb3Igbm93LCB3ZSB3aWxsIGFzc3VtZSB3aGVuIHRoaXMKLSAqIGhhcHBlbnMgdGhhdCB0aGUgdGFyZ2V0IGlzIGEgYml0IHF1aXJreSBhbmQgd2UgZG9uJ3Qgd2FudCB0bwotICogYmUgdGFsa2luZyBzeW5jaHJvbm91c2x5IHRvIGl0IGFueXdheXMuICBSZWdhcmRsZXNzLCB3ZSBuZWVkIHRvCi0gKiB0ZWxsIHRoZSBFU1AgdG8gZWF0IHRoZSBleHRyYW5lb3VzIGJ5dGUgc28gdGhhdCB3ZSBjYW4gcHJvY2VlZAotICogdG8gdGhlIG5leHQgcGhhc2UuCi0gKi8KLXN0YXRpYyBpbnQgZXNwMTAwX3N5bmNfaHdidWcoc3RydWN0IGVzcCAqZXNwLCBzdHJ1Y3Qgc2NzaV9jbW5kICpzcCwgaW50IGZpZm9jbnQpCi17Ci0JLyogRG8gbm90IHRvdWNoIHRoaXMgcGllY2Ugb2YgY29kZS4gKi8KLQlpZiAoKCEoZXNwLT5lcmV2ID09IGVzcDEwMCkpIHx8Ci0JICAgICghKHNyZWdfZGF0YWlucCgoZXNwLT5zcmVnID0gc2J1c19yZWFkYihlc3AtPmVyZWdzICsgRVNQX1NUQVRVUykpKSAmJgotCSAgICAgICAhZmlmb2NudCkgJiYKLQkgICAgICEoc3JlZ19kYXRhb3V0cChlc3AtPnNyZWcpICYmICFmbnplcm8oZXNwKSkpKSB7Ci0JCWlmIChzcC0+U0NwLnBoYXNlID09IGluX2RhdGFvdXQpCi0JCQllc3BfY21kKGVzcCwgRVNQX0NNRF9GTFVTSCk7Ci0JCXJldHVybiAwOwotCX0gZWxzZSB7Ci0JCS8qIEFzeW5jIG1vZGUgZm9yIHRoaXMgZ3V5LiAqLwotCQlidWlsZF9zeW5jX25lZ29fbXNnKGVzcCwgMCwgMCk7Ci0KLQkJLyogQWNrIHRoZSBib2d1cyBieXRlLCBidXQgc2V0IEFUTiBmaXJzdC4gKi8KLQkJZXNwX2NtZChlc3AsIEVTUF9DTURfU0FUTik7Ci0JCWVzcF9jbWQoZXNwLCBFU1BfQ01EX01PSyk7Ci0JCXJldHVybiAxOwotCX0KLX0KLQotLyogVGhpcyBjbG9zZXMgdGhlIHdpbmRvdyBkdXJpbmcgYSBzZWxlY3Rpb24gd2l0aCBhIHJlc2VsZWN0IHBlbmRpbmcsIGJlY2F1c2UKLSAqIHdlIHVzZSBETUEgZm9yIHRoZSBzZWxlY3Rpb24gcHJvY2VzcyB0aGUgRklGTyBzaG91bGQgaG9sZCB0aGUgY29ycmVjdAotICogY29udGVudHMgaWYgd2UgZ2V0IHJlc2VsZWN0ZWQgZHVyaW5nIHRoaXMgcHJvY2Vzcy4gIFNvIHdlIGp1c3QgbmVlZCB0bwotICogYWNrIHRoZSBwb3NzaWJsZSBpbGxlZ2FsIGNtZCBpbnRlcnJ1cHQgcGVuZGluZyBvbiB0aGUgZXNwMTAwLgotICovCi1zdGF0aWMgaW5saW5lIGludCBlc3AxMDBfcmVjb25uZWN0X2h3YnVnKHN0cnVjdCBlc3AgKmVzcCkKLXsKLQl1OCB0bXA7Ci0KLQlpZiAoZXNwLT5lcmV2ICE9IGVzcDEwMCkKLQkJcmV0dXJuIDA7Ci0JdG1wID0gc2J1c19yZWFkYihlc3AtPmVyZWdzICsgRVNQX0lOVFJQVCk7Ci0JaWYgKHRtcCAmIEVTUF9JTlRSX1NSKQotCQlyZXR1cm4gMTsKLQlyZXR1cm4gMDsKLX0KLQotLyogVGhpcyB2ZXJpZmllcyB0aGUgQlVTSUQgYml0cyBkdXJpbmcgYSByZXNlbGVjdGlvbiBzbyB0aGF0IHdlIGtub3cgd2hpY2gKLSAqIHRhcmdldCBpcyB0YWxraW5nIHRvIHVzLgotICovCi1zdGF0aWMgaW5saW5lIGludCByZWNvbm5lY3RfdGFyZ2V0KHN0cnVjdCBlc3AgKmVzcCkKLXsKLQlpbnQgaXQsIG1lID0gZXNwLT5zY3NpX2lkX21hc2ssIHRhcmcgPSAwOwotCi0JaWYgKDIgIT0gZmNvdW50KGVzcCkpCi0JCXJldHVybiAtMTsKLQlpZiAoZXNwLT5lcmV2ID09IGZhc2htZSkgewotCQkvKiBITUUgZG9lcyBub3QgbGF0Y2ggaXQncyBvd24gQlVTIElEIGJpdHMgZHVyaW5nCi0JCSAqIGEgcmVzZWxlY3Rpb24uICBBbHNvIHRoZSB0YXJnZXQgbnVtYmVyIGlzIGdpdmVuCi0JCSAqIGFzIGFuIHVuc2lnbmVkIGNoYXIsIG5vdCBhcyBhIHNvbGUgYml0IG51bWJlcgotCQkgKiBsaWtlIHRoZSBvdGhlciBFU1AncyBkby4KLQkJICogSGFwcHkgTWVhbCBpbmRlZWQuLi4uCi0JCSAqLwotCQl0YXJnID0gZXNwLT5obWVfZmlmb193b3JrYXJvdW5kX2J1ZmZlclswXTsKLQl9IGVsc2UgewotCQlpdCA9IHNidXNfcmVhZGIoZXNwLT5lcmVncyArIEVTUF9GREFUQSk7Ci0JCWlmICghKGl0ICYgbWUpKQotCQkJcmV0dXJuIC0xOwotCQlpdCAmPSB+bWU7Ci0JCWlmIChpdCAmIChpdCAtIDEpKQotCQkJcmV0dXJuIC0xOwotCQl3aGlsZSAoIShpdCAmIDEpKQotCQkJdGFyZysrLCBpdCA+Pj0gMTsKLQl9Ci0JcmV0dXJuIHRhcmc7Ci19Ci0KLS8qIFRoaXMgdmVyaWZpZXMgdGhlIGlkZW50aWZ5IGZyb20gdGhlIHRhcmdldCBzbyB0aGF0IHdlIGtub3cgd2hpY2ggbHVuIGlzCi0gKiBiZWluZyByZWNvbm5lY3RlZC4KLSAqLwotc3RhdGljIGlubGluZSBpbnQgcmVjb25uZWN0X2x1bihzdHJ1Y3QgZXNwICplc3ApCi17Ci0JaW50IGx1bjsKLQotCWlmICgoZXNwLT5zcmVnICYgRVNQX1NUQVRfUE1BU0spICE9IEVTUF9NSVApCi0JCXJldHVybiAtMTsKLQlpZiAoZXNwLT5lcmV2ID09IGZhc2htZSkKLQkJbHVuID0gZXNwLT5obWVfZmlmb193b3JrYXJvdW5kX2J1ZmZlclsxXTsKLQllbHNlCi0JCWx1biA9IHNidXNfcmVhZGIoZXNwLT5lcmVncyArIEVTUF9GREFUQSk7Ci0KLQkvKiBZZXMsIHlvdSByZWFkIHRoaXMgY29ycmVjdGx5LiAgV2UgcmVwb3J0IGx1biBvZiB6ZXJvCi0JICogaWYgd2Ugc2VlIHBhcml0eSBlcnJvci4gIEVTUCByZXBvcnRzIHBhcml0eSBlcnJvciBmb3IKLQkgKiB0aGUgbHVuIGJ5dGUsIGFuZCB0aGlzIGlzIHRoZSBvbmx5IHdheSB0byBob3BlIHRvIHJlY292ZXIKLQkgKiBiZWNhdXNlIHRoZSB0YXJnZXQgaXMgY29ubmVjdGVkLgotCSAqLwotCWlmIChlc3AtPnNyZWcgJiBFU1BfU1RBVF9QRVJSKQotCQlyZXR1cm4gMDsKLQotCS8qIENoZWNrIGZvciBpbGxlZ2FsIGJpdHMgYmVpbmcgc2V0IGluIHRoZSBsdW4uICovCi0JaWYgKChsdW4gJiAweDQwKSB8fCAhKGx1biAmIDB4ODApKQotCQlyZXR1cm4gLTE7Ci0KLQlyZXR1cm4gbHVuICYgNzsKLX0KLQotLyogVGhpcyBwdXRzIHRoZSBkcml2ZXIgaW4gYSBzdGF0ZSB3aGVyZSBpdCBjYW4gcmV2aXRhbGl6ZSBhIGNvbW1hbmQgdGhhdAotICogaXMgYmVpbmcgY29udGludWVkIGR1ZSB0byByZXNlbGVjdGlvbi4KLSAqLwotc3RhdGljIGlubGluZSB2b2lkIGVzcF9jb25uZWN0KHN0cnVjdCBlc3AgKmVzcCwgc3RydWN0IHNjc2lfY21uZCAqc3ApCi17Ci0Jc3RydWN0IGVzcF9kZXZpY2UgKmVzcF9kZXYgPSBzcC0+ZGV2aWNlLT5ob3N0ZGF0YTsKLQotCWlmIChlc3AtPnByZXZfc29mZiAgIT0gZXNwX2Rldi0+c3luY19tYXhfb2Zmc2V0IHx8Ci0JICAgIGVzcC0+cHJldl9zdHAgICAhPSBlc3BfZGV2LT5zeW5jX21pbl9wZXJpb2QgfHwKLQkgICAgKGVzcC0+ZXJldiA+IGVzcDEwMGEgJiYKLQkgICAgIGVzcC0+cHJldl9jZmczICE9IGVzcC0+Y29uZmlnM1tzcC0+ZGV2aWNlLT5pZF0pKSB7Ci0JCWVzcC0+cHJldl9zb2ZmID0gZXNwX2Rldi0+c3luY19tYXhfb2Zmc2V0OwotCQllc3AtPnByZXZfc3RwID0gZXNwX2Rldi0+c3luY19taW5fcGVyaW9kOwotCQlzYnVzX3dyaXRlYihlc3AtPnByZXZfc29mZiwgZXNwLT5lcmVncyArIEVTUF9TT0ZGKTsKLQkJc2J1c193cml0ZWIoZXNwLT5wcmV2X3N0cCwgZXNwLT5lcmVncyArIEVTUF9TVFApOwotCQlpZiAoZXNwLT5lcmV2ID4gZXNwMTAwYSkgewotCQkJZXNwLT5wcmV2X2NmZzMgPSBlc3AtPmNvbmZpZzNbc3AtPmRldmljZS0+aWRdOwotCQkJc2J1c193cml0ZWIoZXNwLT5wcmV2X2NmZzMsIGVzcC0+ZXJlZ3MgKyBFU1BfQ0ZHMyk7Ci0JCX0KLQl9Ci0JZXNwLT5jdXJyZW50X1NDID0gc3A7Ci19Ci0KLS8qIFRoaXMgd2lsbCBwbGFjZSB0aGUgY3VycmVudCB3b3JraW5nIGNvbW1hbmQgYmFjayBpbnRvIHRoZSBpc3N1ZSBxdWV1ZQotICogaWYgd2UgYXJlIHRvIHJlY2VpdmUgYSByZXNlbGVjdGlvbiBhbWlkc3QgYSBzZWxlY3Rpb24gYXR0ZW1wdC4KLSAqLwotc3RhdGljIGlubGluZSB2b2lkIGVzcF9yZWNvbm5lY3Qoc3RydWN0IGVzcCAqZXNwLCBzdHJ1Y3Qgc2NzaV9jbW5kICpzcCkKLXsKLQlpZiAoIWVzcC0+ZGlzY29ubmVjdGVkX1NDKQotCQlFU1BMT0coKCJlc3AlZDogV2VpcmQsIGJlaW5nIHJlc2VsZWN0ZWQgYnV0IGRpc2Nvbm5lY3RlZCAiCi0JCQkiY29tbWFuZCBxdWV1ZSBpcyBlbXB0eS5cbiIsIGVzcC0+ZXNwX2lkKSk7Ci0JZXNwLT5zbmlwID0gMDsKLQllc3AtPmN1cnJlbnRfU0MgPSBOVUxMOwotCXNwLT5TQ3AucGhhc2UgPSBub3RfaXNzdWVkOwotCWFwcGVuZF9TQygmZXNwLT5pc3N1ZV9TQywgc3ApOwotfQotCi0vKiBCZWdpbiBtZXNzYWdlIGluIHBoYXNlLiAqLwotc3RhdGljIGludCBlc3BfZG9fbXNnaW4oc3RydWN0IGVzcCAqZXNwKQotewotCS8qIE11c3QgYmUgdmVyeSBjYXJlZnVsIHdpdGggdGhlIGZpZm8gb24gdGhlIEhNRSAqLwotCWlmICgoZXNwLT5lcmV2ICE9IGZhc2htZSkgfHwKLQkgICAgIShzYnVzX3JlYWRiKGVzcC0+ZXJlZ3MgKyBFU1BfU1RBVFVTMikgJiBFU1BfU1RBVDJfRkVNUFRZKSkKLQkJZXNwX2NtZChlc3AsIEVTUF9DTURfRkxVU0gpOwotCWVzcF9tYXliZV9ub3AoZXNwKTsKLQllc3BfY21kKGVzcCwgRVNQX0NNRF9USSk7Ci0JZXNwLT5tc2dpbl9sZW4gPSAxOwotCWVzcC0+bXNnaW5fY3RyID0gMDsKLQllc3BfYWR2YW5jZV9waGFzZShlc3AtPmN1cnJlbnRfU0MsIGluX21zZ2luZG9uZSk7Ci0JcmV0dXJuIGRvX3dvcmtfYnVzOwotfQotCi0vKiBUaGlzIHVzZXMgdmFyaW91cyBETUEgY3NyIGZpZWxkcyBhbmQgdGhlIGZpZm8gZmxhZ3MgY291bnQgdmFsdWUgdG8KLSAqIGRldGVybWluZSBob3cgbWFueSBieXRlcyB3ZXJlIHN1Y2Nlc3NmdWxseSBzZW50L3JlY2VpdmVkIGJ5IHRoZSBFU1AuCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IGVzcF9ieXRlc19zZW50KHN0cnVjdCBlc3AgKmVzcCwgaW50IGZpZm9fY291bnQpCi17Ci0JaW50IHJ2YWwgPSBzYnVzX3JlYWRsKGVzcC0+ZHJlZ3MgKyBETUFfQUREUikgLSBlc3AtPmVzcF9jb21tYW5kX2R2bWE7Ci0KLQlpZiAoZXNwLT5kbWEtPnJldmlzaW9uID09IGR2bWFyZXYxKQotCQlydmFsIC09ICg0IC0gKChzYnVzX3JlYWRsKGVzcC0+ZHJlZ3MgKyBETUFfQ1NSKSAmIERNQV9SRUFEX0FIRUFEKT4+MTEpKTsKLQlyZXR1cm4gcnZhbCAtIGZpZm9fY291bnQ7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBhZHZhbmNlX3NnKHN0cnVjdCBzY3NpX2NtbmQgKnNwKQotewotCSsrc3AtPlNDcC5idWZmZXI7Ci0JLS1zcC0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWw7Ci0Jc3AtPlNDcC50aGlzX3Jlc2lkdWFsID0gc2dfZG1hX2xlbihzcC0+U0NwLmJ1ZmZlcik7Ci0Jc3AtPlNDcC5wdHIgPSAoY2hhciAqKSgodW5zaWduZWQgbG9uZylzZ19kbWFfYWRkcmVzcyhzcC0+U0NwLmJ1ZmZlcikpOwotfQotCi0vKiBQbGVhc2Ugbm90ZSB0aGF0IHRoZSB3YXkgSSd2ZSBjb2RlZCB0aGVzZSByb3V0aW5lcyBpcyB0aGF0IEkgX2Fsd2F5c18KLSAqIGNoZWNrIGZvciBhIGRpc2Nvbm5lY3QgZHVyaW5nIGFueSBhbmQgYWxsIGluZm9ybWF0aW9uIHRyYW5zZmVyCi0gKiBwaGFzZXMuICBUaGUgU0NTSSBzdGFuZGFyZCBzdGF0ZXMgdGhhdCB0aGUgdGFyZ2V0IF9jYW5fIGNhdXNlIGEgQlVTCi0gKiBGUkVFIGNvbmRpdGlvbiBieSBkcm9wcGluZyBhbGwgTVNHL0NEL0lPL0JTWSBzaWduYWxzLiAgQWxzbyBub3RlCi0gKiB0aGF0IGR1cmluZyBpbmZvcm1hdGlvbiB0cmFuc2ZlciBwaGFzZXMgdGhlIHRhcmdldCBjb250cm9scyBldmVyeQotICogY2hhbmdlIGluIHBoYXNlLCB0aGUgb25seSB0aGluZyB0aGUgaW5pdGlhdG9yIGNhbiBkbyBpcyAiYXNrIiBmb3IKLSAqIGEgbWVzc2FnZSBvdXQgcGhhc2UgYnkgZHJpdmluZyBBVE4gdHJ1ZS4gIFRoZSB0YXJnZXQgY2FuLCBhbmQgc29tZXRpbWVzCi0gKiB3aWxsLCBjb21wbGV0ZWx5IGlnbm9yZSB0aGlzIHJlcXVlc3Qgc28gd2UgY2Fubm90IGFzc3VtZSBhbnl0aGluZyB3aGVuCi0gKiB3ZSB0cnkgdG8gZm9yY2UgYSBtZXNzYWdlIG91dCBwaGFzZSB0byBhYm9ydC9yZXNldCBhIHRhcmdldC4gIE1vc3Qgb2YKLSAqIHRoZSB0aW1lIHRoZSB0YXJnZXQgd2lsbCBldmVudHVhbGx5IGJlIG5pY2UgYW5kIGdvIHRvIG1lc3NhZ2Ugb3V0LCBzbwotICogd2UgbWF5IGhhdmUgdG8gaG9sZCBvbiB0byBvdXIgc3RhdGUgYWJvdXQgd2hhdCB3ZSB3YW50IHRvIHRlbGwgdGhlIHRhcmdldAotICogZm9yIHNvbWUgcGVyaW9kIG9mIHRpbWUuCi0gKi8KLQotLyogSSB0aGluayBJIGhhdmUgdGhpbmdzIHdvcmtpbmcgaGVyZSBjb3JyZWN0bHkuICBFdmVuIHBhcnRpYWwgdHJhbnNmZXJzCi0gKiB3aXRoaW4gYSBidWZmZXIgb3Igc3ViLWJ1ZmZlciBzaG91bGQgbm90IHVwc2V0IHVzIGF0IGFsbCBubyBtYXR0ZXIKLSAqIGhvdyBiYWQgdGhlIHRhcmdldCBhbmQvb3IgRVNQIGZ1Y2tzIHRoaW5ncyB1cC4KLSAqLwotc3RhdGljIGludCBlc3BfZG9fZGF0YShzdHJ1Y3QgZXNwICplc3ApCi17Ci0Jc3RydWN0IHNjc2lfY21uZCAqU0NwdHIgPSBlc3AtPmN1cnJlbnRfU0M7Ci0JaW50IHRoaXNwaGFzZSwgaG11Y2g7Ci0KLQlFU1BEQVRBKCgiZXNwX2RvX2RhdGE6ICIpKTsKLQllc3BfbWF5YmVfbm9wKGVzcCk7Ci0JdGhpc3BoYXNlID0gc3JlZ190b19kYXRhcGhhc2UoZXNwLT5zcmVnKTsKLQllc3BfYWR2YW5jZV9waGFzZShTQ3B0ciwgdGhpc3BoYXNlKTsKLQlFU1BEQVRBKCgibmV3cGhhc2U8JXM+ICIsICh0aGlzcGhhc2UgPT0gaW5fZGF0YWluKSA/ICJEQVRBSU4iIDogIkRBVEFPVVQiKSk7Ci0JaG11Y2ggPSBkbWFfY2FuX3RyYW5zZmVyKGVzcCwgU0NwdHIpOwotCWlmIChobXVjaCA+ICg2NCAqIDEwMjQpICYmIChlc3AtPmVyZXYgIT0gZmFzaG1lKSkKLQkJaG11Y2ggPSAoNjQgKiAxMDI0KTsKLQlFU1BEQVRBKCgiaG11Y2g8JWQ+ICIsIGhtdWNoKSk7Ci0JZXNwLT5jdXJyZW50X3RyYW5zZmVyX3NpemUgPSBobXVjaDsKLQotCWlmIChlc3AtPmVyZXYgPT0gZmFzaG1lKSB7Ci0JCXUzMiB0bXAgPSBlc3AtPnByZXZfaG1lX2RtYWNzcjsKLQotCQkvKiBBbHdheXMgc2V0IHRoZSBFU1AgY291bnQgcmVnaXN0ZXJzIGZpcnN0LiAqLwotCQllc3Bfc2V0Y291bnQoZXNwLT5lcmVncywgaG11Y2gsIDEpOwotCi0JCS8qIEdldCB0aGUgRE1BIGNzciBjb21wdXRlZC4gKi8KLQkJdG1wIHw9IChETUFfU0NTSV9ESVNBQiB8IERNQV9FTkFCTEUpOwotCQlpZiAodGhpc3BoYXNlID09IGluX2RhdGFpbikKLQkJCXRtcCB8PSBETUFfU1RfV1JJVEU7Ci0JCWVsc2UKLQkJCXRtcCAmPSB+KERNQV9TVF9XUklURSk7Ci0JCWVzcC0+cHJldl9obWVfZG1hY3NyID0gdG1wOwotCi0JCUVTUERBVEEoKCJETUF8VEkgLS0+IGRvX2ludHJfZW5kXG4iKSk7Ci0JCWlmICh0aGlzcGhhc2UgPT0gaW5fZGF0YWluKSB7Ci0JCQlzYnVzX3dyaXRlbChobXVjaCwgZXNwLT5kcmVncyArIERNQV9DT1VOVCk7Ci0JCQllc3BfY21kKGVzcCwgRVNQX0NNRF9ETUEgfCBFU1BfQ01EX1RJKTsKLQkJfSBlbHNlIHsKLQkJCWVzcF9jbWQoZXNwLCBFU1BfQ01EX0RNQSB8IEVTUF9DTURfVEkpOwotCQkJc2J1c193cml0ZWwoaG11Y2gsIGVzcC0+ZHJlZ3MgKyBETUFfQ09VTlQpOwotCQl9Ci0JCXNidXNfd3JpdGVsKChfX3UzMikoKHVuc2lnbmVkIGxvbmcpU0NwdHItPlNDcC5wdHIpLCBlc3AtPmRyZWdzK0RNQV9BRERSKTsKLQkJc2J1c193cml0ZWwoZXNwLT5wcmV2X2htZV9kbWFjc3IsIGVzcC0+ZHJlZ3MgKyBETUFfQ1NSKTsKLQl9IGVsc2UgewotCQllc3Bfc2V0Y291bnQoZXNwLT5lcmVncywgaG11Y2gsIDApOwotCQlkbWFfc2V0dXAoZXNwLCAoKF9fdTMyKSgodW5zaWduZWQgbG9uZylTQ3B0ci0+U0NwLnB0cikpLAotCQkJICBobXVjaCwgKHRoaXNwaGFzZSA9PSBpbl9kYXRhaW4pKTsKLQkJRVNQREFUQSgoIkRNQXxUSSAtLT4gZG9faW50cl9lbmRcbiIpKTsKLQkJZXNwX2NtZChlc3AsIEVTUF9DTURfRE1BIHwgRVNQX0NNRF9USSk7Ci0JfQotCXJldHVybiBkb19pbnRyX2VuZDsKLX0KLQotLyogU2VlIGhvdyBzdWNjZXNzZnVsIHRoZSBkYXRhIHRyYW5zZmVyIHdhcy4gKi8KLXN0YXRpYyBpbnQgZXNwX2RvX2RhdGFfZmluYWxlKHN0cnVjdCBlc3AgKmVzcCkKLXsKLQlzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3B0ciA9IGVzcC0+Y3VycmVudF9TQzsKLQlzdHJ1Y3QgZXNwX2RldmljZSAqZXNwX2RldiA9IFNDcHRyLT5kZXZpY2UtPmhvc3RkYXRhOwotCWludCBib2d1c19kYXRhID0gMCwgYnl0ZXNfc2VudCA9IDAsIGZpZm9jbnQsIGVjb3VudCA9IDA7Ci0KLQlFU1BEQVRBKCgiZXNwX2RvX2RhdGFfZmluYWxlOiAiKSk7Ci0KLQlpZiAoU0NwdHItPlNDcC5waGFzZSA9PSBpbl9kYXRhaW4pIHsKLQkJaWYgKGVzcC0+c3JlZyAmIEVTUF9TVEFUX1BFUlIpIHsKLQkJCS8qIFl1Y2ssIHBhcml0eSBlcnJvci4gIFRoZSBFU1AgYXNzZXJ0cyBBVE4KLQkJCSAqIHNvIHRoYXQgd2UgY2FuIGdvIHRvIG1lc3NhZ2Ugb3V0IHBoYXNlCi0JCQkgKiBpbW1lZGlhdGVseSBhbmQgaW5mb3JtIHRoZSB0YXJnZXQgdGhhdAotCQkJICogc29tZXRoaW5nIGJhZCBoYXBwZW5lZC4KLQkJCSAqLwotCQkJRVNQTE9HKCgiZXNwJWQ6IGRhdGEgYmFkIHBhcml0eSBkZXRlY3RlZC5cbiIsCi0JCQkJZXNwLT5lc3BfaWQpKTsKLQkJCWVzcC0+Y3VyX21zZ291dFswXSA9IElOSVRJQVRPUl9FUlJPUjsKLQkJCWVzcC0+bXNnb3V0X2xlbiA9IDE7Ci0JCX0KLQkJZG1hX2RyYWluKGVzcCk7Ci0JfQotCWRtYV9pbnZhbGlkYXRlKGVzcCk7Ci0KLQkvKiBUaGlzIGNvdWxkIGhhcHBlbiBmb3IgdGhlIGFib3ZlIHBhcml0eSBlcnJvciBjYXNlLiAqLwotCWlmIChlc3AtPmlyZWcgIT0gRVNQX0lOVFJfQlNFUlYpIHsKLQkJLyogUGxlYXNlIGdvIHRvIG1zZ291dCBwaGFzZSwgcGxlYXNlIHBsZWFzZSBwbGVhc2UuLi4gKi8KLQkJRVNQTE9HKCgiZXNwJWQ6ICFCU0VSViBhZnRlciBkYXRhLCBwcm9iYWJseSB0byBtc2dvdXRcbiIsCi0JCQllc3AtPmVzcF9pZCkpOwotCQlyZXR1cm4gZXNwX2RvX3BoYXNlX2RldGVybWluZShlc3ApOwotCX0JCi0KLQkvKiBDaGVjayBmb3IgcGFydGlhbCB0cmFuc2ZlcnMgYW5kIG90aGVyIGhvcnJpYmxlIGV2ZW50cy4KLQkgKiBOb3RlLCBoZXJlIHdlIHJlYWQgdGhlIHJlYWwgZmlmbyBmbGFncyByZWdpc3RlciBldmVuCi0JICogb24gSE1FIGJyb2tlbiBhZGFwdGVycyBiZWNhdXNlIHdlIHNraXAgdGhlIEhNRSBmaWZvCi0JICogd29ya2Fyb3VuZCBjb2RlIGluIGVzcF9oYW5kbGUoKSBpZiB3ZSBhcmUgZG9pbmcgZGF0YQotCSAqIHBoYXNlIHRoaW5ncy4gIFdlIGRvbid0IHdhbnQgdG8gZnVjayBkaXJlY3RseSB3aXRoCi0JICogdGhlIGZpZm8gbGlrZSB0aGF0LCBlc3BlY2lhbGx5IGlmIGRvaW5nIHN5bmNocm9ub3VzCi0JICogdHJhbnNmZXJzISAgQWxzbywgd2lsbCBuZWVkIHRvIGRvdWJsZSB0aGUgY291bnQgb24KLQkgKiBITUUgaWYgd2UgYXJlIGRvaW5nIHdpZGUgdHJhbnNmZXJzLCBhcyB0aGUgSE1FIGZpZm8KLQkgKiB3aWxsIG1vdmUgYW5kIGNvdW50IDE2LWJpdCBxdWFudGl0aWVzIGR1cmluZyB3aWRlIGRhdGEuCi0JICogU01DQyBfYW5kXyBRbG9naWMgY2FuIGJvdGggYml0ZSBtZS4KLQkgKi8KLQlmaWZvY250ID0gKHNidXNfcmVhZGIoZXNwLT5lcmVncyArIEVTUF9GRkxBR1MpICYgRVNQX0ZGX0ZCWVRFUyk7Ci0JaWYgKGVzcC0+ZXJldiAhPSBmYXNobWUpCi0JCWVjb3VudCA9IGVzcF9nZXRjb3VudChlc3AtPmVyZWdzLCAwKTsKLQlieXRlc19zZW50ID0gZXNwLT5jdXJyZW50X3RyYW5zZmVyX3NpemU7Ci0KLQlFU1BEQVRBKCgidHJhbnNfc3ooJWQpLCAiLCBieXRlc19zZW50KSk7Ci0JaWYgKGVzcC0+ZXJldiA9PSBmYXNobWUpIHsKLQkJaWYgKCEoZXNwLT5zcmVnICYgRVNQX1NUQVRfVENOVCkpIHsKLQkJCWVjb3VudCA9IGVzcF9nZXRjb3VudChlc3AtPmVyZWdzLCAxKTsKLQkJCWJ5dGVzX3NlbnQgLT0gZWNvdW50OwotCQl9Ci0KLQkJLyogQWx3YXlzIHN1YnRyYWN0IGFueSBjcnVmdCByZW1haW5pbmcgaW4gdGhlIEZJRk8uICovCi0JCWlmIChlc3AtPnByZXZfY2ZnMyAmIEVTUF9DT05GSUczX0VXSURFKQotCQkJZmlmb2NudCA8PD0gMTsKLQkJaWYgKFNDcHRyLT5TQ3AucGhhc2UgPT0gaW5fZGF0YW91dCkKLQkJCWJ5dGVzX3NlbnQgLT0gZmlmb2NudDsKLQotCQkvKiBJIGhhdmUgYW4gSUJNIGRpc2sgd2hpY2ggZXhoaWJpdHMgdGhlIGZvbGxvd2luZwotCQkgKiBiZWhhdmlvciBkdXJpbmcgd3JpdGVzIHRvIGl0LiAgSXQgZGlzY29ubmVjdHMgaW4KLQkJICogdGhlIG1pZGRsZSBvZiBhIHBhcnRpYWwgdHJhbnNmZXIsIHRoZSBjdXJyZW50IHNnbGlzdAotCQkgKiBidWZmZXIgaXMgMTAyNCBieXRlcywgdGhlIGRpc2sgc3RvcHMgZGF0YSB0cmFuc2ZlcgotCQkgKiBhdCA1MTIgYnl0ZXMuCi0JCSAqCi0JCSAqIEhvd2V2ZXIgdGhlIEZBUzM2NiByZXBvcnRzIHRoYXQgMzIgbW9yZSBieXRlcyB3ZXJlCi0JCSAqIHRyYW5zZmVycmVkIHRoYW4gcmVhbGx5IHdlcmUuICBUaGlzIGlzIHByZWNpc2VseQotCQkgKiB0aGUgc2l6ZSBvZiBhIGZ1bGx5IGxvYWRlZCBGSUZPIGluIHdpZGUgc2NzaSBtb2RlLgotCQkgKiBUaGUgRklGTyBzdGF0ZSByZWNvcmRlZCBpbmRpY2F0ZXMgdGhhdCBpdCBpcyBlbXB0eS4KLQkJICoKLQkJICogSSBoYXZlIG5vIGlkZWEgaWYgdGhpcyBpcyBhIGJ1ZyBpbiB0aGUgRkFTMzY2IGNoaXAKLQkJICogb3IgYSBidWcgaW4gdGhlIGZpcm13YXJlIG9uIHRoaXMgSUJNIGRpc2suICBJbiBhbnkKLQkJICogZXZlbnQgdGhlIGZvbGxvd2luZyBzZWVtcyB0byBiZSBhIGdvb2Qgd29ya2Fyb3VuZC4gIC1EYXZlTQotCQkgKi8KLQkJaWYgKGJ5dGVzX3NlbnQgIT0gZXNwLT5jdXJyZW50X3RyYW5zZmVyX3NpemUgJiYKLQkJICAgIFNDcHRyLT5TQ3AucGhhc2UgPT0gaW5fZGF0YW91dCkgewotCQkJaW50IG1hc2sgPSAoNjQgLSAxKTsKLQotCQkJaWYgKChlc3AtPnByZXZfY2ZnMyAmIEVTUF9DT05GSUczX0VXSURFKSA9PSAwKQotCQkJCW1hc2sgPj49IDE7Ci0KLQkJCWlmIChieXRlc19zZW50ICYgbWFzaykKLQkJCQlieXRlc19zZW50IC09IChieXRlc19zZW50ICYgbWFzayk7Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAoIShlc3AtPnNyZWcgJiBFU1BfU1RBVF9UQ05UKSkKLQkJCWJ5dGVzX3NlbnQgLT0gZWNvdW50OwotCQlpZiAoU0NwdHItPlNDcC5waGFzZSA9PSBpbl9kYXRhb3V0KQotCQkJYnl0ZXNfc2VudCAtPSBmaWZvY250OwotCX0KLQotCUVTUERBVEEoKCJieXRlc19zZW50KCVkKSwgIiwgYnl0ZXNfc2VudCkpOwotCi0JLyogSWYgd2Ugd2VyZSBpbiBzeW5jaHJvbm91cyBtb2RlLCBjaGVjayBmb3IgcGVjdWxpYXJpdGllcy4gKi8KLQlpZiAoZXNwLT5lcmV2ID09IGZhc2htZSkgewotCQlpZiAoZXNwX2Rldi0+c3luY19tYXhfb2Zmc2V0KSB7Ci0JCQlpZiAoU0NwdHItPlNDcC5waGFzZSA9PSBpbl9kYXRhb3V0KQotCQkJCWVzcF9jbWQoZXNwLCBFU1BfQ01EX0ZMVVNIKTsKLQkJfSBlbHNlIHsKLQkJCWVzcF9jbWQoZXNwLCBFU1BfQ01EX0ZMVVNIKTsKLQkJfQotCX0gZWxzZSB7Ci0JCWlmIChlc3BfZGV2LT5zeW5jX21heF9vZmZzZXQpCi0JCQlib2d1c19kYXRhID0gZXNwMTAwX3N5bmNfaHdidWcoZXNwLCBTQ3B0ciwgZmlmb2NudCk7Ci0JCWVsc2UKLQkJCWVzcF9jbWQoZXNwLCBFU1BfQ01EX0ZMVVNIKTsKLQl9Ci0KLQkvKiBVbnRpbCB3ZSBhcmUgc3VyZSBvZiB3aGF0IGhhcyBoYXBwZW5lZCwgd2UgYXJlIGNlcnRhaW5seQotCSAqIGluIHRoZSBkYXJrLgotCSAqLwotCWVzcF9hZHZhbmNlX3BoYXNlKFNDcHRyLCBpbl90aGVfZGFyayk7Ci0KLQlpZiAoYnl0ZXNfc2VudCA8IDApIHsKLQkJLyogSSd2ZSBzZWVuIHRoaXMgaGFwcGVuIGR1ZSB0byBsb3N0IHN0YXRlIGluIHRoaXMKLQkJICogZHJpdmVyLiAgTm8gaWRlYSB3aHkgaXQgaGFwcGVuZWQsIGJ1dCBhbGxvd2luZwotCQkgKiB0aGlzIHZhbHVlIHRvIGJlIG5lZ2F0aXZlIGNhdXNlZCB0aGluZ3MgdG8KLQkJICogbG9jayB1cC4gIFRoaXMgYWxsb3dzIGdyZWF0ZXIgY2hhbmNlIG9mIHJlY292ZXJ5LgotCQkgKiBJbiBmYWN0IGV2ZXJ5IHRpbWUgSSd2ZSBzZWVuIHRoaXMsIGl0IGhhcyBiZWVuCi0JCSAqIGEgZHJpdmVyIGJ1ZyB3aXRob3V0IHF1ZXN0aW9uLgotCQkgKi8KLQkJRVNQTE9HKCgiZXNwJWQ6IHlpZWVlLCBieXRlc19zZW50IDwgMCFcbiIsIGVzcC0+ZXNwX2lkKSk7Ci0JCUVTUExPRygoImVzcCVkOiBjc3o9JWQgZmlmb2NvdW50PSVkIGVjb3VudD0lZFxuIiwKLQkJCWVzcC0+ZXNwX2lkLAotCQkJZXNwLT5jdXJyZW50X3RyYW5zZmVyX3NpemUsIGZpZm9jbnQsIGVjb3VudCkpOwotCQlFU1BMT0coKCJlc3AlZDogdXNlX3NnPSVkIHB0cj0lcCB0aGlzX3Jlc2lkdWFsPSVkXG4iLAotCQkJZXNwLT5lc3BfaWQsCi0JCQlTQ3B0ci0+dXNlX3NnLCBTQ3B0ci0+U0NwLnB0ciwgU0NwdHItPlNDcC50aGlzX3Jlc2lkdWFsKSk7Ci0JCUVTUExPRygoImVzcCVkOiBGb3JjaW5nIGFzeW5jIGZvciB0YXJnZXQgJWRcbiIsIGVzcC0+ZXNwX2lkLCAKLQkJCVNDcHRyLT5kZXZpY2UtPmlkKSk7Ci0JCVNDcHRyLT5kZXZpY2UtPmJvcmtlbiA9IDE7Ci0JCWVzcF9kZXYtPnN5bmMgPSAwOwotCQlieXRlc19zZW50ID0gMDsKLQl9Ci0KLQkvKiBVcGRhdGUgdGhlIHN0YXRlIG9mIG91ciB0cmFuc2Zlci4gKi8KLQlTQ3B0ci0+U0NwLnB0ciArPSBieXRlc19zZW50OwotCVNDcHRyLT5TQ3AudGhpc19yZXNpZHVhbCAtPSBieXRlc19zZW50OwotCWlmIChTQ3B0ci0+U0NwLnRoaXNfcmVzaWR1YWwgPCAwKSB7Ci0JCS8qIHNoaXQgKi8KLQkJRVNQTE9HKCgiZXNwJWQ6IERhdGEgdHJhbnNmZXIgb3ZlcnJ1bi5cbiIsIGVzcC0+ZXNwX2lkKSk7Ci0JCVNDcHRyLT5TQ3AudGhpc19yZXNpZHVhbCA9IDA7Ci0JfQotCi0JLyogTWF5YmUgY29udGludWUuICovCi0JaWYgKCFib2d1c19kYXRhKSB7Ci0JCUVTUERBVEEoKCIhYm9ndXNfZGF0YSwgIikpOwotCi0JCS8qIE5PIE1BVFRFUiBXSEFULCB3ZSBhZHZhbmNlIHRoZSBzY2F0dGVybGlzdCwKLQkJICogaWYgdGhlIHRhcmdldCBzaG91bGQgZGVjaWRlIHRvIGRpc2Nvbm5lY3QKLQkJICogaW4gYmV0d2VlbiBzY2F0dGVyIGNodW5rcyAod2hpY2ggaXMgY29tbW9uKQotCQkgKiB3ZSBjb3VsZCBkaWUgaG9ycmlibHkhICBJIHVzZWQgdG8gaGF2ZSB0aGUgc2cKLQkJICogYWR2YW5jZSBvY2N1ciBvbmx5IGlmIHdlIGFyZSBnb2luZyBiYWNrIGludG8KLQkJICogKG9yIGFyZSBzdGF5aW5nIGluKSBhIGRhdGEgcGhhc2UsIHlvdSBjYW4KLQkJICogaW1hZ2luZSB0aGUgaGVsbCBJIHdlbnQgdGhyb3VnaCB0cnlpbmcgdG8KLQkJICogZmlndXJlIHRoaXMgb3V0LgotCQkgKi8KLQkJaWYgKFNDcHRyLT51c2Vfc2cgJiYgIVNDcHRyLT5TQ3AudGhpc19yZXNpZHVhbCkKLQkJCWFkdmFuY2Vfc2coU0NwdHIpOwotCQlpZiAoc3JlZ19kYXRhaW5wKGVzcC0+c3JlZykgfHwgc3JlZ19kYXRhb3V0cChlc3AtPnNyZWcpKSB7Ci0JCQlFU1BEQVRBKCgidG8gbW9yZSBkYXRhXG4iKSk7Ci0JCQlyZXR1cm4gZXNwX2RvX2RhdGEoZXNwKTsKLQkJfQotCQlFU1BEQVRBKCgidG8gbmV3IHBoYXNlXG4iKSk7Ci0JCXJldHVybiBlc3BfZG9fcGhhc2VfZGV0ZXJtaW5lKGVzcCk7Ci0JfQotCS8qIEJvZ3VzIGRhdGEsIGp1c3Qgd2FpdCBmb3IgbmV4dCBpbnRlcnJ1cHQuICovCi0JRVNQTE9HKCgiZXNwJWQ6IGJvZ3VzX2RhdGEgZHVyaW5nIGVuZCBvZiBkYXRhIHBoYXNlXG4iLAotCQllc3AtPmVzcF9pZCkpOwotCXJldHVybiBkb19pbnRyX2VuZDsKLX0KLQotLyogV2UgcmVjZWl2ZWQgYSBub24tZ29vZCBzdGF0dXMgcmV0dXJuIGF0IHRoZSBlbmQgb2YKLSAqIHJ1bm5pbmcgYSBTQ1NJIGNvbW1hbmQuICBUaGlzIGlzIHVzZWQgdG8gZGVjaWRlIGlmCi0gKiB3ZSBzaG91bGQgY2xlYXIgb3VyIHN5bmNocm9ub3VzIHRyYW5zZmVyIHN0YXRlIGZvcgotICogc3VjaCBhIGRldmljZSB3aGVuIHRoYXQgaGFwcGVucy4KLSAqCi0gKiBUaGUgaWRlYSBpcyB0aGF0IHdoZW4gc3Bpbm5pbmcgdXAgYSBkaXNrIG9yIHJld2luZGluZwotICogYSB0YXBlLCB3ZSBkb24ndCB3YW50IHRvIGdvIGludG8gYSBsb29wIHJlLW5lZ290aWF0aW5nCi0gKiBzeW5jaHJvbm91cyBjYXBhYmlsaXRpZXMgb3ZlciBhbmQgb3Zlci4KLSAqLwotc3RhdGljIGludCBlc3Bfc2hvdWxkX2NsZWFyX3N5bmMoc3RydWN0IHNjc2lfY21uZCAqc3ApCi17Ci0JdTggY21kID0gc3AtPmNtbmRbMF07Ci0KLQkvKiBUaGVzZSBjYXNlcyBhcmUgZm9yIHNwaW5uaW5nIHVwIGEgZGlzayBhbmQKLQkgKiB3YWl0aW5nIGZvciB0aGF0IHNwaW51cCB0byBjb21wbGV0ZS4KLQkgKi8KLQlpZiAoY21kID09IFNUQVJUX1NUT1ApCi0JCXJldHVybiAwOwotCi0JaWYgKGNtZCA9PSBURVNUX1VOSVRfUkVBRFkpCi0JCXJldHVybiAwOwotCi0JLyogT25lIG1vcmUgc3BlY2lhbCBjYXNlIGZvciBTQ1NJIHRhcGUgZHJpdmVzLAotCSAqIHRoaXMgaXMgd2hhdCBpcyB1c2VkIHRvIHByb2JlIHRoZSBkZXZpY2UgZm9yCi0JICogY29tcGxldGlvbiBvZiBhIHJld2luZCBvciB0YXBlIGxvYWQgb3BlcmF0aW9uLgotCSAqLwotCWlmIChzcC0+ZGV2aWNlLT50eXBlID09IFRZUEVfVEFQRSkgewotCQlpZiAoY21kID09IE1PREVfU0VOU0UpCi0JCQlyZXR1cm4gMDsKLQl9Ci0KLQlyZXR1cm4gMTsKLX0KLQotLyogRWl0aGVyIGEgY29tbWFuZCBpcyBjb21wbGV0aW5nIG9yIGEgdGFyZ2V0IGlzIGRyb3BwaW5nIG9mZiB0aGUgYnVzCi0gKiB0byBjb250aW51ZSB0aGUgY29tbWFuZCBpbiB0aGUgYmFja2dyb3VuZCBzbyB3ZSBjYW4gZG8gb3RoZXIgd29yay4KLSAqLwotc3RhdGljIGludCBlc3BfZG9fZnJlZWJ1cyhzdHJ1Y3QgZXNwICplc3ApCi17Ci0Jc3RydWN0IHNjc2lfY21uZCAqU0NwdHIgPSBlc3AtPmN1cnJlbnRfU0M7Ci0Jc3RydWN0IGVzcF9kZXZpY2UgKmVzcF9kZXYgPSBTQ3B0ci0+ZGV2aWNlLT5ob3N0ZGF0YTsKLQlpbnQgcnZhbDsKLQotCXJ2YWwgPSBza2lwYWhlYWQyKGVzcCwgU0NwdHIsIGluX3N0YXR1cywgaW5fbXNnaW5kb25lLCBpbl9mcmVlaW5nKTsKLQlpZiAocnZhbCkKLQkJcmV0dXJuIHJ2YWw7Ci0JaWYgKGVzcC0+aXJlZyAhPSBFU1BfSU5UUl9EQykgewotCQlFU1BMT0coKCJlc3AlZDogVGFyZ2V0IHdpbGwgbm90IGRpc2Nvbm5lY3RcbiIsIGVzcC0+ZXNwX2lkKSk7Ci0JCXJldHVybiBkb19yZXNldF9idXM7IC8qIHRhcmdldCB3aWxsIG5vdCBkcm9wIEJTWS4uLiAqLwotCX0KLQllc3AtPm1zZ291dF9sZW4gPSAwOwotCWVzcC0+cHJldm1zZ291dCA9IE5PUDsKLQlpZiAoZXNwLT5wcmV2bXNnaW4gPT0gQ09NTUFORF9DT01QTEVURSkgewotCQkvKiBOb3JtYWwgZW5kIG9mIG5leHVzLiAqLwotCQlpZiAoZXNwLT5kaXNjb25uZWN0ZWRfU0MgfHwgKGVzcC0+ZXJldiA9PSBmYXNobWUpKQotCQkJZXNwX2NtZChlc3AsIEVTUF9DTURfRVNFTCk7Ci0KLQkJaWYgKFNDcHRyLT5TQ3AuU3RhdHVzICE9IEdPT0QgJiYKLQkJICAgIFNDcHRyLT5TQ3AuU3RhdHVzICE9IENPTkRJVElPTl9HT09EICYmCi0JCSAgICAoKDE8PFNDcHRyLT5kZXZpY2UtPmlkKSAmIGVzcC0+dGFyZ2V0c19wcmVzZW50KSAmJgotCQkgICAgZXNwX2Rldi0+c3luYyAmJgotCQkgICAgZXNwX2Rldi0+c3luY19tYXhfb2Zmc2V0KSB7Ci0JCQkvKiBTQ1NJIHN0YW5kYXJkIHNheXMgdGhhdCB0aGUgc3luY2hyb25vdXMgY2FwYWJpbGl0aWVzCi0JCQkgKiBzaG91bGQgYmUgcmVuZWdvdGlhdGVkIGF0IHRoaXMgcG9pbnQuICBNb3N0IGxpa2VseQotCQkJICogd2UgYXJlIGFib3V0IHRvIHJlcXVlc3Qgc2Vuc2UgZnJvbSB0aGlzIHRhcmdldAotCQkJICogaW4gd2hpY2ggY2FzZSB3ZSB3YW50IHRvIGF2b2lkIHVzaW5nIHN5bmMKLQkJCSAqIHRyYW5zZmVycyB1bnRpbCB3ZSBhcmUgc3VyZSBvZiB0aGUgY3VycmVudCB0YXJnZXQKLQkJCSAqIHN0YXRlLgotCQkJICovCi0JCQlFU1BNSVNDKCgiZXNwOiBTdGF0dXMgPCVkPiBmb3IgdGFyZ2V0ICVkIGx1biAlZFxuIiwKLQkJCQkgU0NwdHItPlNDcC5TdGF0dXMsIFNDcHRyLT5kZXZpY2UtPmlkLCBTQ3B0ci0+ZGV2aWNlLT5sdW4pKTsKLQotCQkJLyogQnV0IGRvbid0IGRvIHRoaXMgd2hlbiBzcGlubmluZyB1cCBhIGRpc2sgYXQKLQkJCSAqIGJvb3QgdGltZSB3aGlsZSB3ZSBwb2xsIGZvciBjb21wbGV0aW9uIGFzIGl0Ci0JCQkgKiBmaWxscyB1cCB0aGUgY29uc29sZSB3aXRoIG1lc3NhZ2VzLiAgQWxzbywgdGFwZXMKLQkJCSAqIGNhbiByZXBvcnQgbm90IHJlYWR5IG1hbnkgdGltZXMgcmlnaHQgYWZ0ZXIKLQkJCSAqIGxvYWRpbmcgdXAgYSB0YXBlLgotCQkJICovCi0JCQlpZiAoZXNwX3Nob3VsZF9jbGVhcl9zeW5jKFNDcHRyKSAhPSAwKQotCQkJCWVzcF9kZXYtPnN5bmMgPSAwOwotCQl9Ci0JCUVTUERJU0MoKCJGPCUwMngsJTAyeD4iLCBTQ3B0ci0+ZGV2aWNlLT5pZCwgU0NwdHItPmRldmljZS0+bHVuKSk7Ci0JCWVzcF9kb25lKGVzcCwgKChTQ3B0ci0+U0NwLlN0YXR1cyAmIDB4ZmYpIHwKLQkJCSAgICAgICAoKFNDcHRyLT5TQ3AuTWVzc2FnZSAmIDB4ZmYpPDw4KSB8Ci0JCQkgICAgICAgKERJRF9PSyA8PCAxNikpKTsKLQl9IGVsc2UgaWYgKGVzcC0+cHJldm1zZ2luID09IERJU0NPTk5FQ1QpIHsKLQkJLyogTm9ybWFsIGRpc2Nvbm5lY3QuICovCi0JCWVzcF9jbWQoZXNwLCBFU1BfQ01EX0VTRUwpOwotCQlFU1BESVNDKCgiRDwlMDJ4LCUwMng+IiwgU0NwdHItPmRldmljZS0+aWQsIFNDcHRyLT5kZXZpY2UtPmx1bikpOwotCQlhcHBlbmRfU0MoJmVzcC0+ZGlzY29ubmVjdGVkX1NDLCBTQ3B0cik7Ci0JCWVzcC0+Y3VycmVudF9TQyA9IE5VTEw7Ci0JCWlmIChlc3AtPmlzc3VlX1NDKQotCQkJZXNwX2V4ZWNfY21kKGVzcCk7Ci0JfSBlbHNlIHsKLQkJLyogRHJpdmVyIGJ1Zywgd2UgZG8gbm90IGV4cGVjdCBhIGRpc2Nvbm5lY3QgaGVyZQotCQkgKiBhbmQgc2hvdWxkIG5vdCBoYXZlIGFkdmFuY2VkIHRoZSBzdGF0ZSBlbmdpbmUKLQkJICogdG8gaW5fZnJlZWluZy4KLQkJICovCi0JCUVTUExPRygoImVzcCVkOiBsYXN0IG1zZyBub3QgZGlzYyBhbmQgbm90IGNtZCBjbXBsdC5cbiIsCi0JCQllc3AtPmVzcF9pZCkpOwotCQlyZXR1cm4gZG9fcmVzZXRfYnVzOwotCX0KLQlyZXR1cm4gZG9faW50cl9lbmQ7Ci19Ci0KLS8qIFdoZW4gYSByZXNlbGVjdCBvY2N1cnMsIGFuZCB3ZSBjYW5ub3QgZmluZCB0aGUgY29tbWFuZCB0bwotICogcmVjb25uZWN0IHRvIGluIG91ciBxdWV1ZXMsIHdlIGRvIHRoaXMuCi0gKi8KLXN0YXRpYyBpbnQgZXNwX2JhZF9yZWNvbm5lY3Qoc3RydWN0IGVzcCAqZXNwKQotewotCXN0cnVjdCBzY3NpX2NtbmQgKnNwOwotCi0JRVNQTE9HKCgiZXNwJWQ6IEVpZWVlZSwgcmVjb25uZWN0aW5nIHVua25vd24gY29tbWFuZCFcbiIsCi0JCWVzcC0+ZXNwX2lkKSk7Ci0JRVNQTE9HKCgiUVVFVUUgRFVNUFxuIikpOwotCXNwID0gZXNwLT5pc3N1ZV9TQzsKLQlFU1BMT0coKCJlc3AlZDogaXNzdWVfU0NbIiwgZXNwLT5lc3BfaWQpKTsKLQl3aGlsZSAoc3ApIHsKLQkJRVNQTE9HKCgiPCUwMngsJTAyeD4iLCBzcC0+ZGV2aWNlLT5pZCwgc3AtPmRldmljZS0+bHVuKSk7Ci0JCXNwID0gKHN0cnVjdCBzY3NpX2NtbmQgKikgc3AtPmhvc3Rfc2NyaWJibGU7Ci0JfQotCUVTUExPRygoIl1cbiIpKTsKLQlzcCA9IGVzcC0+Y3VycmVudF9TQzsKLQlFU1BMT0coKCJlc3AlZDogY3VycmVudF9TQ1siLCBlc3AtPmVzcF9pZCkpOwotCWlmIChzcCkKLQkJRVNQTE9HKCgiPCUwMngsJTAyeD4iLCBzcC0+ZGV2aWNlLT5pZCwgc3AtPmRldmljZS0+bHVuKSk7Ci0JZWxzZQotCQlFU1BMT0coKCI8TlVMTD4iKSk7Ci0JRVNQTE9HKCgiXVxuIikpOwotCXNwID0gZXNwLT5kaXNjb25uZWN0ZWRfU0M7Ci0JRVNQTE9HKCgiZXNwJWQ6IGRpc2Nvbm5lY3RlZF9TQ1siLCBlc3AtPmVzcF9pZCkpOwotCXdoaWxlIChzcCkgewotCQlFU1BMT0coKCI8JTAyeCwlMDJ4PiIsIHNwLT5kZXZpY2UtPmlkLCBzcC0+ZGV2aWNlLT5sdW4pKTsKLQkJc3AgPSAoc3RydWN0IHNjc2lfY21uZCAqKSBzcC0+aG9zdF9zY3JpYmJsZTsKLQl9Ci0JRVNQTE9HKCgiXVxuIikpOwotCXJldHVybiBkb19yZXNldF9idXM7Ci19Ci0KLS8qIERvIHRoZSBuZWVkeSB3aGVuIGEgdGFyZ2V0IHRyaWVzIHRvIHJlY29ubmVjdCB0byB1cy4gKi8KLXN0YXRpYyBpbnQgZXNwX2RvX3JlY29ubmVjdChzdHJ1Y3QgZXNwICplc3ApCi17Ci0JaW50IGx1biwgdGFyZ2V0OwotCXN0cnVjdCBzY3NpX2NtbmQgKlNDcHRyOwotCi0JLyogQ2hlY2sgZm9yIGFsbCBib2d1cyBjb25kaXRpb25zIGZpcnN0LiAqLwotCXRhcmdldCA9IHJlY29ubmVjdF90YXJnZXQoZXNwKTsKLQlpZiAodGFyZ2V0IDwgMCkgewotCQlFU1BESVNDKCgiYmFkIGJ1cyBiaXRzXG4iKSk7Ci0JCXJldHVybiBkb19yZXNldF9idXM7Ci0JfQotCWx1biA9IHJlY29ubmVjdF9sdW4oZXNwKTsKLQlpZiAobHVuIDwgMCkgewotCQlFU1BESVNDKCgidGFyZ2V0PSUyeCwgYmFkIGlkZW50aWZ5IG1zZ1xuIiwgdGFyZ2V0KSk7Ci0JCXJldHVybiBkb19yZXNldF9idXM7Ci0JfQotCi0JLyogVGhpbmdzIGxvb2sgb2suLi4gKi8KLQlFU1BESVNDKCgiUjwlMDJ4LCUwMng+IiwgdGFyZ2V0LCBsdW4pKTsKLQotCS8qIE11c3Qgbm90IGZsdXNoIEZJRk8gb3IgRFZNQSBvbiBITUUuICovCi0JaWYgKGVzcC0+ZXJldiAhPSBmYXNobWUpIHsKLQkJZXNwX2NtZChlc3AsIEVTUF9DTURfRkxVU0gpOwotCQlpZiAoZXNwMTAwX3JlY29ubmVjdF9od2J1Zyhlc3ApKQotCQkJcmV0dXJuIGRvX3Jlc2V0X2J1czsKLQkJZXNwX2NtZChlc3AsIEVTUF9DTURfTlVMTCk7Ci0JfQotCi0JU0NwdHIgPSByZW1vdmVfU0MoJmVzcC0+ZGlzY29ubmVjdGVkX1NDLCAodTgpIHRhcmdldCwgKHU4KSBsdW4pOwotCWlmICghU0NwdHIpCi0JCXJldHVybiBlc3BfYmFkX3JlY29ubmVjdChlc3ApOwotCi0JZXNwX2Nvbm5lY3QoZXNwLCBTQ3B0cik7Ci0JZXNwX2NtZChlc3AsIEVTUF9DTURfTU9LKTsKLQotCWlmIChlc3AtPmVyZXYgPT0gZmFzaG1lKQotCQlzYnVzX3dyaXRlYigoKFNDcHRyLT5kZXZpY2UtPmlkICYgMHhmKSB8Ci0JCQkgICAgIChFU1BfQlVTSURfUkVTRUxJRCB8IEVTUF9CVVNJRF9DVFIzMkJJVCkpLAotCQkJICAgIGVzcC0+ZXJlZ3MgKyBFU1BfQlVTSUQpOwotCi0JLyogUmVjb25uZWN0IGltcGxpZXMgYSByZXN0b3JlIHBvaW50ZXJzIG9wZXJhdGlvbi4gKi8KLQllc3BfcmVzdG9yZV9wb2ludGVycyhlc3AsIFNDcHRyKTsKLQotCWVzcC0+c25pcCA9IDA7Ci0JZXNwX2FkdmFuY2VfcGhhc2UoU0NwdHIsIGluX3RoZV9kYXJrKTsKLQlyZXR1cm4gZG9faW50cl9lbmQ7Ci19Ci0KLS8qIEVuZCBvZiBORVhVUyAoaG9wZWZ1bGx5KSwgcGljayB1cCBzdGF0dXMgKyBtZXNzYWdlIGJ5dGUgdGhlbiBsZWF2ZSBpZgotICogYWxsIGdvZXMgd2VsbC4KLSAqLwotc3RhdGljIGludCBlc3BfZG9fc3RhdHVzKHN0cnVjdCBlc3AgKmVzcCkKLXsKLQlzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3B0ciA9IGVzcC0+Y3VycmVudF9TQzsKLQlpbnQgaW50ciwgcnZhbDsKLQotCXJ2YWwgPSBza2lwYWhlYWQxKGVzcCwgU0NwdHIsIGluX3RoZV9kYXJrLCBpbl9zdGF0dXMpOwotCWlmIChydmFsKQotCQlyZXR1cm4gcnZhbDsKLQlpbnRyID0gZXNwLT5pcmVnOwotCUVTUFNUQVQoKCJlc3BfZG9fc3RhdHVzOiAiKSk7Ci0JaWYgKGludHIgIT0gRVNQX0lOVFJfREMpIHsKLQkJaW50IG1lc3NhZ2Vfb3V0ID0gMDsgLyogZm9yIHBhcml0eSBwcm9ibGVtcyAqLwotCi0JCS8qIEFjayB0aGUgbWVzc2FnZS4gKi8KLQkJRVNQU1RBVCgoImFjayBtc2csICIpKTsKLQkJZXNwX2NtZChlc3AsIEVTUF9DTURfTU9LKTsKLQotCQlpZiAoZXNwLT5lcmV2ICE9IGZhc2htZSkgewotCQkJZG1hX2ZsYXNoY2xlYXIoZXNwKTsKLQotCQkJLyogV2FpdCB0aWxsIHRoZSBmaXJzdCBiaXRzIHNldHRsZS4gKi8KLQkJCXdoaWxlIChlc3AtPmVzcF9jb21tYW5kWzBdID09IDB4ZmYpCi0JCQkJdWRlbGF5KDEpOwotCQl9IGVsc2UgewotCQkJZXNwLT5lc3BfY29tbWFuZFswXSA9IGVzcC0+aG1lX2ZpZm9fd29ya2Fyb3VuZF9idWZmZXJbMF07Ci0JCQllc3AtPmVzcF9jb21tYW5kWzFdID0gZXNwLT5obWVfZmlmb193b3JrYXJvdW5kX2J1ZmZlclsxXTsKLQkJfQotCi0JCUVTUFNUQVQoKCJnb3Qgc29tZXRoaW5nLCAiKSk7Ci0JCS8qIEVTUCBjaGltZXMgaW4gd2l0aCBvbmUgb2YKLQkJICoKLQkJICogMSkgZnVuY3Rpb24gZG9uZSBpbnRlcnJ1cHQ6Ci0JCSAqCWJvdGggc3RhdHVzIGFuZCBtZXNzYWdlIGluIGJ5dGVzCi0JCSAqCWFyZSBhdmFpbGFibGUKLQkJICoKLQkJICogMikgYnVzIHNlcnZpY2UgaW50ZXJydXB0OgotCQkgKglvbmx5IHN0YXR1cyBieXRlIHdhcyBhY3F1aXJlZAotCQkgKgotCQkgKiAzKSBBbnl0aGluZyBlbHNlOgotCQkgKgljYW4ndCBoYXBwZW4sIGJ1dCB3ZSB0ZXN0IGZvciBpdAotCQkgKglhbnl3YXlzCi0JCSAqCi0JCSAqIEFMU086IElmIGJhZCBwYXJpdHkgd2FzIGRldGVjdGVkIG9uIGVpdGhlcgotCQkgKiAgICAgICB0aGUgc3RhdHVzIF9vcl8gdGhlIG1lc3NhZ2UgYnl0ZSB0aGVuCi0JCSAqICAgICAgIHRoZSBFU1AgaGFzIGFzc2VydGVkIEFUTiBvbiB0aGUgYnVzCi0JCSAqICAgICAgIGFuZCB3ZSBtdXN0IHRoZXJlZm9yZSB3YWl0IGZvciB0aGUKLQkJICogICAgICAgbmV4dCBwaGFzZSBjaGFuZ2UuCi0JCSAqLwotCQlpZiAoaW50ciAmIEVTUF9JTlRSX0ZET05FKSB7Ci0JCQkvKiBXZSBnb3QgaXQgYWxsLCBoYWxsZWp1bGlhLiAqLwotCQkJRVNQU1RBVCgoImdvdCBib3RoLCAiKSk7Ci0JCQlTQ3B0ci0+U0NwLlN0YXR1cyA9IGVzcC0+ZXNwX2NvbW1hbmRbMF07Ci0JCQlTQ3B0ci0+U0NwLk1lc3NhZ2UgPSBlc3AtPmVzcF9jb21tYW5kWzFdOwotCQkJZXNwLT5wcmV2bXNnaW4gPSBTQ3B0ci0+U0NwLk1lc3NhZ2U7Ci0JCQllc3AtPmN1cl9tc2dpblswXSA9IFNDcHRyLT5TQ3AuTWVzc2FnZTsKLQkJCWlmIChlc3AtPnNyZWcgJiBFU1BfU1RBVF9QRVJSKSB7Ci0JCQkJLyogVGhlcmUgd2FzIGJhZCBwYXJpdHkgZm9yIHRoZQotCQkJCSAqIG1lc3NhZ2UgYnl0ZSwgdGhlIHN0YXR1cyBieXRlCi0JCQkJICogd2FzIG9rLgotCQkJCSAqLwotCQkJCW1lc3NhZ2Vfb3V0ID0gTVNHX1BBUklUWV9FUlJPUjsKLQkJCX0KLQkJfSBlbHNlIGlmIChpbnRyID09IEVTUF9JTlRSX0JTRVJWKSB7Ci0JCQkvKiBPbmx5IGdvdCBzdGF0dXMgYnl0ZS4gKi8KLQkJCUVTUExPRygoImVzcCVkOiBnb3Qgc3RhdHVzIG9ubHksICIsIGVzcC0+ZXNwX2lkKSk7Ci0JCQlpZiAoIShlc3AtPnNyZWcgJiBFU1BfU1RBVF9QRVJSKSkgewotCQkJCVNDcHRyLT5TQ3AuU3RhdHVzID0gZXNwLT5lc3BfY29tbWFuZFswXTsKLQkJCQlTQ3B0ci0+U0NwLk1lc3NhZ2UgPSAweGZmOwotCQkJfSBlbHNlIHsKLQkJCQkvKiBUaGUgc3RhdHVzIGJ5dGUgaGFkIGJhZCBwYXJpdHkuCi0JCQkJICogd2UgbGVhdmUgdGhlIHNjc2lfcG9pbnRlciBTdGF0dXMKLQkJCQkgKiBmaWVsZCBhbG9uZSBhcyB3ZSBzZXQgaXQgdG8gYSBkZWZhdWx0Ci0JCQkJICogb2YgQ0hFQ0tfQ09ORElUSU9OIGluIGVzcF9xdWV1ZS4KLQkJCQkgKi8KLQkJCQltZXNzYWdlX291dCA9IElOSVRJQVRPUl9FUlJPUjsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCS8qIFRoaXMgc2hvdWxkbid0IGhhcHBlbiBldmVyLiAqLwotCQkJRVNQU1RBVCgoImdvdCBib2xpeGVkXG4iKSk7Ci0JCQllc3BfYWR2YW5jZV9waGFzZShTQ3B0ciwgaW5fdGhlX2RhcmspOwotCQkJcmV0dXJuIGVzcF9kb19waGFzZV9kZXRlcm1pbmUoZXNwKTsKLQkJfQotCi0JCWlmICghbWVzc2FnZV9vdXQpIHsKLQkJCUVTUFNUQVQoKCJzdGF0dXM9JTJ4IG1zZz0lMngsICIsIFNDcHRyLT5TQ3AuU3RhdHVzLAotCQkJCVNDcHRyLT5TQ3AuTWVzc2FnZSkpOwotCQkJaWYgKFNDcHRyLT5TQ3AuTWVzc2FnZSA9PSBDT01NQU5EX0NPTVBMRVRFKSB7Ci0JCQkJRVNQU1RBVCgoImFuZCB3YXMgQ09NTUFORF9DT01QTEVURVxuIikpOwotCQkJCWVzcF9hZHZhbmNlX3BoYXNlKFNDcHRyLCBpbl9mcmVlaW5nKTsKLQkJCQlyZXR1cm4gZXNwX2RvX2ZyZWVidXMoZXNwKTsKLQkJCX0gZWxzZSB7Ci0JCQkJRVNQTE9HKCgiZXNwJWQ6IGFuZCBfbm90XyBDT01NQU5EX0NPTVBMRVRFXG4iLAotCQkJCQllc3AtPmVzcF9pZCkpOwotCQkJCWVzcC0+bXNnaW5fbGVuID0gZXNwLT5tc2dpbl9jdHIgPSAxOwotCQkJCWVzcF9hZHZhbmNlX3BoYXNlKFNDcHRyLCBpbl9tc2dpbmRvbmUpOwotCQkJCXJldHVybiBlc3BfZG9fbXNnaW5kb25lKGVzcCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvKiBXaXRoIGx1Y2sgd2UnbGwgYmUgYWJsZSB0byBsZXQgdGhlIHRhcmdldAotCQkJICoga25vdyB0aGF0IGJhZCBwYXJpdHkgaGFwcGVuZWQsIGl0IHdpbGwga25vdwotCQkJICogd2hpY2ggYnl0ZSBjYXVzZWQgdGhlIHByb2JsZW1zIGFuZCBzZW5kIGl0Ci0JCQkgKiBhZ2Fpbi4gIEZvciB0aGUgY2FzZSB3aGVyZSB0aGUgc3RhdHVzIGJ5dGUKLQkJCSAqIHJlY2VpdmVzIGJhZCBwYXJpdHksIEkgZG8gbm90IGJlbGlldmUgbW9zdAotCQkJICogdGFyZ2V0cyByZWNvdmVyIHZlcnkgd2VsbC4gIFdlJ2xsIHNlZS4KLQkJCSAqLwotCQkJRVNQTE9HKCgiZXNwJWQ6IGJhZCBwYXJpdHkgc29tZXdoZXJlIG1vdXQ9JTJ4XG4iLAotCQkJCWVzcC0+ZXNwX2lkLCBtZXNzYWdlX291dCkpOwotCQkJZXNwLT5jdXJfbXNnb3V0WzBdID0gbWVzc2FnZV9vdXQ7Ci0JCQllc3AtPm1zZ291dF9sZW4gPSBlc3AtPm1zZ291dF9jdHIgPSAxOwotCQkJZXNwX2FkdmFuY2VfcGhhc2UoU0NwdHIsIGluX3RoZV9kYXJrKTsKLQkJCXJldHVybiBlc3BfZG9fcGhhc2VfZGV0ZXJtaW5lKGVzcCk7Ci0JCX0KLQl9IGVsc2UgewotCQkvKiBJZiB3ZSBkaXNjb25uZWN0IG5vdywgYWxsIGhlbGwgYnJlYWtzIGxvb3NlLiAqLwotCQlFU1BMT0coKCJlc3AlZDogd2hvb3BzLCBkaXNjb25uZWN0XG4iLCBlc3AtPmVzcF9pZCkpOwotCQllc3BfYWR2YW5jZV9waGFzZShTQ3B0ciwgaW5fdGhlX2RhcmspOwotCQlyZXR1cm4gZXNwX2RvX3BoYXNlX2RldGVybWluZShlc3ApOwotCX0KLX0KLQotc3RhdGljIGludCBlc3BfZW50ZXJfc3RhdHVzKHN0cnVjdCBlc3AgKmVzcCkKLXsKLQl1OCB0aGVjbWQgPSBFU1BfQ01EX0lDQ1NFUTsKLQotCWVzcF9jbWQoZXNwLCBFU1BfQ01EX0ZMVVNIKTsKLQlpZiAoZXNwLT5lcmV2ICE9IGZhc2htZSkgewotCQl1MzIgdG1wOwotCi0JCWVzcC0+ZXNwX2NvbW1hbmRbMF0gPSBlc3AtPmVzcF9jb21tYW5kWzFdID0gMHhmZjsKLQkJc2J1c193cml0ZWIoMiwgZXNwLT5lcmVncyArIEVTUF9UQ0xPVyk7Ci0JCXNidXNfd3JpdGViKDAsIGVzcC0+ZXJlZ3MgKyBFU1BfVENNRUQpOwotCQl0bXAgPSBzYnVzX3JlYWRsKGVzcC0+ZHJlZ3MgKyBETUFfQ1NSKTsKLQkJdG1wIHw9IChETUFfU1RfV1JJVEUgfCBETUFfRU5BQkxFKTsKLQkJc2J1c193cml0ZWwodG1wLCBlc3AtPmRyZWdzICsgRE1BX0NTUik7Ci0JCWlmIChlc3AtPmRtYS0+cmV2aXNpb24gPT0gZHZtYWVzYzEpCi0JCQlzYnVzX3dyaXRlbCgweDEwMCwgZXNwLT5kcmVncyArIERNQV9DT1VOVCk7Ci0JCXNidXNfd3JpdGVsKGVzcC0+ZXNwX2NvbW1hbmRfZHZtYSwgZXNwLT5kcmVncyArIERNQV9BRERSKTsKLQkJdGhlY21kIHw9IEVTUF9DTURfRE1BOwotCX0KLQllc3BfY21kKGVzcCwgdGhlY21kKTsKLQllc3BfYWR2YW5jZV9waGFzZShlc3AtPmN1cnJlbnRfU0MsIGluX3N0YXR1cyk7Ci0KLQlyZXR1cm4gZXNwX2RvX3N0YXR1cyhlc3ApOwotfQotCi1zdGF0aWMgaW50IGVzcF9kaXNjb25uZWN0X2FtaWRzdF9waGFzZXMoc3RydWN0IGVzcCAqZXNwKQotewotCXN0cnVjdCBzY3NpX2NtbmQgKnNwID0gZXNwLT5jdXJyZW50X1NDOwotCXN0cnVjdCBlc3BfZGV2aWNlICplc3BfZGV2ID0gc3AtPmRldmljZS0+aG9zdGRhdGE7Ci0KLQkvKiBUaGlzIG1lYW5zIHJlYWwgcHJvYmxlbXMgaWYgd2Ugc2VlIHRoaXMKLQkgKiBoZXJlLiAgVW5sZXNzIHdlIHdlcmUgYWN0dWFsbHkgdHJ5aW5nCi0JICogdG8gZm9yY2UgdGhlIGRldmljZSB0byBhYm9ydC9yZXNldC4KLQkgKi8KLQlFU1BMT0coKCJlc3AlZCBEaXNjb25uZWN0IGFtaWRzdCBwaGFzZXMsICIsIGVzcC0+ZXNwX2lkKSk7Ci0JRVNQTE9HKCgicHBoYXNlPCVzPiBjcGhhc2U8JXM+LCAiLAotCQlwaGFzZV9zdHJpbmcoc3AtPlNDcC5waGFzZSksCi0JCXBoYXNlX3N0cmluZyhzcC0+U0NwLnNlbnRfY29tbWFuZCkpKTsKLQotCWlmIChlc3AtPmRpc2Nvbm5lY3RlZF9TQyAhPSBOVUxMIHx8IChlc3AtPmVyZXYgPT0gZmFzaG1lKSkKLQkJZXNwX2NtZChlc3AsIEVTUF9DTURfRVNFTCk7Ci0KLQlzd2l0Y2ggKGVzcC0+Y3VyX21zZ291dFswXSkgewotCWRlZmF1bHQ6Ci0JCS8qIFdlIGRpZG4ndCBleHBlY3QgdGhpcyB0byBoYXBwZW4gYXQgYWxsLiAqLwotCQlFU1BMT0coKCJkZXZpY2UgaXMgYm9saXhlZFxuIikpOwotCQllc3BfYWR2YW5jZV9waGFzZShzcCwgaW5fdGd0ZXJyb3IpOwotCQllc3BfZG9uZShlc3AsIChESURfRVJST1IgPDwgMTYpKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEJVU19ERVZJQ0VfUkVTRVQ6Ci0JCUVTUExPRygoImRldmljZSByZXNldCBzdWNjZXNzZnVsXG4iKSk7Ci0JCWVzcF9kZXYtPnN5bmNfbWF4X29mZnNldCA9IDA7Ci0JCWVzcF9kZXYtPnN5bmNfbWluX3BlcmlvZCA9IDA7Ci0JCWVzcF9kZXYtPnN5bmMgPSAwOwotCQllc3BfYWR2YW5jZV9waGFzZShzcCwgaW5fcmVzZXRkZXYpOwotCQllc3BfZG9uZShlc3AsIChESURfUkVTRVQgPDwgMTYpKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFCT1JUOgotCQlFU1BMT0coKCJkZXZpY2UgYWJvcnQgc3VjY2Vzc2Z1bFxuIikpOwotCQllc3BfYWR2YW5jZV9waGFzZShzcCwgaW5fYWJvcnRvbmUpOwotCQllc3BfZG9uZShlc3AsIChESURfQUJPUlQgPDwgMTYpKTsKLQkJYnJlYWs7Ci0KLQl9OwotCXJldHVybiBkb19pbnRyX2VuZDsKLX0KLQotc3RhdGljIGludCBlc3BfZW50ZXJfbXNnb3V0KHN0cnVjdCBlc3AgKmVzcCkKLXsKLQllc3BfYWR2YW5jZV9waGFzZShlc3AtPmN1cnJlbnRfU0MsIGluX21zZ291dCk7Ci0JcmV0dXJuIGVzcF9kb19tc2dvdXQoZXNwKTsKLX0KLQotc3RhdGljIGludCBlc3BfZW50ZXJfbXNnaW4oc3RydWN0IGVzcCAqZXNwKQotewotCWVzcF9hZHZhbmNlX3BoYXNlKGVzcC0+Y3VycmVudF9TQywgaW5fbXNnaW4pOwotCXJldHVybiBlc3BfZG9fbXNnaW4oZXNwKTsKLX0KLQotc3RhdGljIGludCBlc3BfZW50ZXJfY21kKHN0cnVjdCBlc3AgKmVzcCkKLXsKLQllc3BfYWR2YW5jZV9waGFzZShlc3AtPmN1cnJlbnRfU0MsIGluX2NtZGJlZ2luKTsKLQlyZXR1cm4gZXNwX2RvX2NtZGJlZ2luKGVzcCk7Ci19Ci0KLXN0YXRpYyBpbnQgZXNwX2VudGVyX2JhZHBoYXNlKHN0cnVjdCBlc3AgKmVzcCkKLXsKLQlFU1BMT0coKCJlc3AlZDogQml6YXJyZSBidXMgcGhhc2UgJTJ4LlxuIiwgZXNwLT5lc3BfaWQsCi0JCWVzcC0+c3JlZyAmIEVTUF9TVEFUX1BNQVNLKSk7Ci0JcmV0dXJuIGRvX3Jlc2V0X2J1czsKLX0KLQotdHlwZWRlZiBpbnQgKCplc3BmdW5jX3QpKHN0cnVjdCBlc3AgKik7Ci0KLXN0YXRpYyBlc3BmdW5jX3QgcGhhc2VfdmVjdG9yW10gPSB7Ci0JZXNwX2RvX2RhdGEsCQkvKiBFU1BfRE9QICovCi0JZXNwX2RvX2RhdGEsCQkvKiBFU1BfRElQICovCi0JZXNwX2VudGVyX2NtZCwJCS8qIEVTUF9DTURQICovCi0JZXNwX2VudGVyX3N0YXR1cywJLyogRVNQX1NUQVRQICovCi0JZXNwX2VudGVyX2JhZHBoYXNlLAkvKiBFU1BfU1RBVF9QTVNHICovCi0JZXNwX2VudGVyX2JhZHBoYXNlLAkvKiBFU1BfU1RBVF9QTVNHIHwgRVNQX1NUQVRfUElPICovCi0JZXNwX2VudGVyX21zZ291dCwJLyogRVNQX01PUCAqLwotCWVzcF9lbnRlcl9tc2dpbiwJLyogRVNQX01JUCAqLwotfTsKLQotLyogVGhlIHRhcmdldCBoYXMgY29udHJvbCBvZiB0aGUgYnVzIGFuZCB3ZSBoYXZlIHRvIHNlZSB3aGVyZSBpdCBoYXMKLSAqIHRha2VuIHVzLgotICovCi1zdGF0aWMgaW50IGVzcF9kb19waGFzZV9kZXRlcm1pbmUoc3RydWN0IGVzcCAqZXNwKQotewotCWlmICgoZXNwLT5pcmVnICYgRVNQX0lOVFJfREMpICE9IDApCi0JCXJldHVybiBlc3BfZGlzY29ubmVjdF9hbWlkc3RfcGhhc2VzKGVzcCk7Ci0JcmV0dXJuIHBoYXNlX3ZlY3Rvcltlc3AtPnNyZWcgJiBFU1BfU1RBVF9QTUFTS10oZXNwKTsKLX0KLQotLyogRmlyc3QgaW50ZXJydXB0IGFmdGVyIGV4ZWMnaW5nIGEgY21kIGNvbWVzIGhlcmUuICovCi1zdGF0aWMgaW50IGVzcF9zZWxlY3RfY29tcGxldGUoc3RydWN0IGVzcCAqZXNwKQotewotCXN0cnVjdCBzY3NpX2NtbmQgKlNDcHRyID0gZXNwLT5jdXJyZW50X1NDOwotCXN0cnVjdCBlc3BfZGV2aWNlICplc3BfZGV2ID0gU0NwdHItPmRldmljZS0+aG9zdGRhdGE7Ci0JaW50IGNtZF9ieXRlc19zZW50LCBmY250OwotCi0JaWYgKGVzcC0+ZXJldiAhPSBmYXNobWUpCi0JCWVzcC0+c2VxcmVnID0gKHNidXNfcmVhZGIoZXNwLT5lcmVncyArIEVTUF9TU1RFUCkgJiBFU1BfU1RFUF9WQklUUyk7Ci0KLQlpZiAoZXNwLT5lcmV2ID09IGZhc2htZSkKLQkJZmNudCA9IGVzcC0+aG1lX2ZpZm9fd29ya2Fyb3VuZF9jb3VudDsKLQllbHNlCi0JCWZjbnQgPSAoc2J1c19yZWFkYihlc3AtPmVyZWdzICsgRVNQX0ZGTEFHUykgJiBFU1BfRkZfRkJZVEVTKTsKLQotCWNtZF9ieXRlc19zZW50ID0gZXNwX2J5dGVzX3NlbnQoZXNwLCBmY250KTsKLQlkbWFfaW52YWxpZGF0ZShlc3ApOwotCi0JLyogTGV0J3MgY2hlY2sgdG8gc2VlIGlmIGEgcmVzZWxlY3QgaGFwcGVuZWQKLQkgKiB3aGlsZSB3ZSB3ZSdyZSB0cnlpbmcgdG8gc2VsZWN0LiAgVGhpcyBtdXN0Ci0JICogYmUgY2hlY2tlZCBmaXJzdC4KLQkgKi8KLQlpZiAoZXNwLT5pcmVnID09IChFU1BfSU5UUl9SU0VMIHwgRVNQX0lOVFJfRkRPTkUpKSB7Ci0JCWVzcF9yZWNvbm5lY3QoZXNwLCBTQ3B0cik7Ci0JCXJldHVybiBlc3BfZG9fcmVjb25uZWN0KGVzcCk7Ci0JfQotCi0JLyogTG9va3MgbGlrZSB0aGluZ3Mgd29ya2VkLCB3ZSBzaG91bGQgc2VlIGEgYnVzIHNlcnZpY2UgJgotCSAqIGEgZnVuY3Rpb24gY29tcGxldGUgaW50ZXJydXB0IGF0IHRoaXMgcG9pbnQuICBOb3RlIHdlCi0JICogYXJlIGRvaW5nIGEgZGlyZWN0IGNvbXBhcmlzb24gYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvCi0JICogYmUgZm9vbGVkIGludG8gdGhpbmtpbmcgc2VsZWN0aW9uIHdhcyBzdWNjZXNzZnVsIGlmCi0JICogRVNQX0lOVFJfREMgaXMgc2V0LCBzZWUgYmVsb3cuCi0JICovCi0JaWYgKGVzcC0+aXJlZyA9PSAoRVNQX0lOVFJfRkRPTkUgfCBFU1BfSU5UUl9CU0VSVikpIHsKLQkJLyogdGFyZ2V0IHNwZWFrcy4uLiAqLwotCQllc3AtPnRhcmdldHNfcHJlc2VudCB8PSAoMTw8U0NwdHItPmRldmljZS0+aWQpOwotCi0JCS8qIFdoYXQgaWYgdGhlIHRhcmdldCBpZ25vcmVzIHRoZSBzZHRyPyAqLwotCQlpZiAoZXNwLT5zbmlwKQotCQkJZXNwX2Rldi0+c3luYyA9IDE7Ci0KLQkJLyogU2VlIGhvdyBmYXIsIGlmIGF0IGFsbCwgd2UgZ290IGluIGdldHRpbmcKLQkJICogdGhlIGluZm9ybWF0aW9uIG91dCB0byB0aGUgdGFyZ2V0LgotCQkgKi8KLQkJc3dpdGNoIChlc3AtPnNlcXJlZykgewotCQlkZWZhdWx0OgotCi0JCWNhc2UgRVNQX1NURVBfQVNFTDoKLQkJCS8qIEFyYml0cmF0aW9uIHdvbiwgdGFyZ2V0IHNlbGVjdGVkLCBidXQKLQkJCSAqIHdlIGFyZSBpbiBzb21lIHBoYXNlIHdoaWNoIGlzIG5vdCBjb21tYW5kCi0JCQkgKiBwaGFzZSBub3IgaXMgaXQgbWVzc2FnZSBvdXQgcGhhc2UuCi0JCQkgKgotCQkJICogWFhYIFdlJ3ZlIGNvbmZ1c2VkIHRoZSB0YXJnZXQsIG9idmlvdXNseS4KLQkJCSAqIFhYWCBTbyBjbGVhciBpdCdzIHN0YXRlLCBidXQgd2UgYWxzbyBlbmQKLQkJCSAqIFhYWCB1cCBjbGVhcmluZyBldmVyeW9uZSBlbHNlcy4gIFRoYXQgaXNuJ3QKLQkJCSAqIFhYWCBzbyBuaWNlLiAgSSdkIGxpa2UgdG8ganVzdCByZXNldCB0aGlzCi0JCQkgKiBYWFggdGFyZ2V0LCBidXQgaWYgSSBjYW5ub3QgZXZlbiBnZXQgaXQncwotCQkJICogWFhYIGF0dGVudGlvbiBhbmQgZmluaXNoIHNlbGVjdGlvbiB0byB0YWxrCi0JCQkgKiBYWFggdG8gaXQsIHRoZXJlIGlzIG5vdCBtdWNoIG1vcmUgSSBjYW4gZG8uCi0JCQkgKiBYWFggSWYgd2UgaGF2ZSBhIGxvYWRlZCBidXMgd2UncmUgZ29pbmcgdG8KLQkJCSAqIFhYWCBzcGVuZCB0aGUgbmV4dCBzZWNvbmQgb3Igc28gcmVuZWdvdGlhdGluZwotCQkJICogWFhYIGZvciBzeW5jaHJvbm91cyB0cmFuc2ZlcnMuCi0JCQkgKi8KLQkJCUVTUExPRygoImVzcCVkOiBTVEVQX0FTRUwgZm9yIHRndCAlZFxuIiwKLQkJCQllc3AtPmVzcF9pZCwgU0NwdHItPmRldmljZS0+aWQpKTsKLQotCQljYXNlIEVTUF9TVEVQX1NJRDoKLQkJCS8qIEFyYml0cmF0aW9uIHdvbiwgdGFyZ2V0IHNlbGVjdGVkLCB3ZW50Ci0JCQkgKiB0byBtZXNzYWdlIG91dCBwaGFzZSwgc2VudCBvbmUgbWVzc2FnZQotCQkJICogYnl0ZSwgdGhlbiB3ZSBzdG9wcGVkLiAgQVROIGlzIGFzc2VydGVkCi0JCQkgKiBvbiB0aGUgU0NTSSBidXMgYW5kIHRoZSB0YXJnZXQgaXMgc3RpbGwKLQkJCSAqIHRoZXJlIGhhbmdpbmcgb24uICBUaGlzIGlzIGEgbGVnYWwKLQkJCSAqIHNlcXVlbmNlIHN0ZXAgaWYgd2UgZ2F2ZSB0aGUgRVNQIGEgc2VsZWN0Ci0JCQkgKiBhbmQgc3RvcCBjb21tYW5kLgotCQkJICoKLQkJCSAqIFhYWCBTZWUgYWJvdmUsIEkgY291bGQgc2V0IHRoZSBib3JrZW4gZmxhZwotCQkJICogWFhYIGluIHRoZSBkZXZpY2Ugc3RydWN0IGFuZCByZXRyeSB0aGUKLQkJCSAqIFhYWCBjb21tYW5kLiAgQnV0IHdvdWxkIHRoYXQgaGVscCBmb3IKLQkJCSAqIFhYWCB0YWdnZWQgY2FwYWJsZSB0YXJnZXRzPwotCQkJICovCi0KLQkJY2FzZSBFU1BfU1RFUF9OQ01EOgotCQkJLyogQXJiaXRyYXRpb24gd29uLCB0YXJnZXQgc2VsZWN0ZWQsIG1heWJlCi0JCQkgKiBzZW50IHRoZSBvbmUgbWVzc2FnZSBieXRlIGluIG1lc3NhZ2Ugb3V0Ci0JCQkgKiBwaGFzZSwgYnV0IHdlIGRpZCBub3QgZ28gdG8gY29tbWFuZCBwaGFzZQotCQkJICogaW4gdGhlIGVuZC4gIEFjdHVhbGx5LCB3ZSBjb3VsZCBoYXZlIHNlbnQKLQkJCSAqIG9ubHkgc29tZSBvZiB0aGUgbWVzc2FnZSBieXRlcyBpZiB3ZSB0cmllZAotCQkJICogdG8gc2VuZCBvdXQgdGhlIGVudGlyZSBpZGVudGlmeSBhbmQgdGFnCi0JCQkgKiBtZXNzYWdlIHVzaW5nIEVTUF9DTURfU0EzLgotCQkJICovCi0JCQljbWRfYnl0ZXNfc2VudCA9IDA7Ci0JCQlicmVhazsKLQotCQljYXNlIEVTUF9TVEVQX1BQQzoKLQkJCS8qIE5vLCBub3QgdGhlIHBvd2VyUEMgcGluaGVhZC4gIEFyYml0cmF0aW9uCi0JCQkgKiB3b24sIGFsbCBtZXNzYWdlIGJ5dGVzIHNlbnQgaWYgd2Ugd2VudCB0bwotCQkJICogbWVzc2FnZSBvdXQgcGhhc2UsIHdlbnQgdG8gY29tbWFuZCBwaGFzZQotCQkJICogYnV0IG9ubHkgcGFydCBvZiB0aGUgY29tbWFuZCB3YXMgc2VudC4KLQkJCSAqCi0JCQkgKiBYWFggSSd2ZSBzZWVuIHRoaXMsIGJ1dCB1c3VhbGx5IGluIGNvbmp1bmN0aW9uCi0JCQkgKiBYWFggd2l0aCBhIGdyb3NzIGVycm9yIHdoaWNoIGFwcGVhcnMgdG8gaGF2ZQotCQkJICogWFhYIG9jY3VycmVkIGJldHdlZW4gdGhlIHRpbWUgSSB0b2xkIHRoZQotCQkJICogWFhYIEVTUCB0byBhcmJpdHJhdGUgYW5kIHdoZW4gSSBnb3QgdGhlCi0JCQkgKiBYWFggaW50ZXJydXB0LiAgQ291bGQgSSBoYXZlIG1pc2xvYWRlZCB0aGUKLQkJCSAqIFhYWCBjb21tYW5kIGJ5dGVzIGludG8gdGhlIGZpZm8/ICBBY3R1YWxseSwKLQkJCSAqIFhYWCBJIG1vc3QgbGlrZWx5IG1pc3NlZCBhIHBoYXNlLCBhbmQgdGhlcmVmb3JlCi0JCQkgKiBYWFggd2VudCBpbnRvIG5ldmVyIG5ldmVyIGxhbmQgYW5kIGRpZG4ndCBldmVuCi0JCQkgKiBYWFgga25vdyBpdC4gIFRoYXQgd2FzIHRoZSBvbGQgZHJpdmVyIHRob3VnaC4KLQkJCSAqIFhYWCBXaGF0IGlzIGV2ZW4gbW9yZSBwZWN1bGlhciBpcyB0aGF0IHRoZSBFU1AKLQkJCSAqIFhYWCBzaG93ZWQgdGhlIHByb3BlciBmdW5jdGlvbiBjb21wbGV0ZSBhbmQKLQkJCSAqIFhYWCBidXMgc2VydmljZSBiaXRzIGluIHRoZSBpbnRlcnJ1cHQgcmVnaXN0ZXIuCi0JCQkgKi8KLQotCQljYXNlIEVTUF9TVEVQX0ZJTkk0OgotCQljYXNlIEVTUF9TVEVQX0ZJTkk1OgotCQljYXNlIEVTUF9TVEVQX0ZJTkk2OgotCQljYXNlIEVTUF9TVEVQX0ZJTkk3OgotCQkJLyogQWNjb3VudCBmb3IgdGhlIGlkZW50aWZ5IG1lc3NhZ2UgKi8KLQkJCWlmIChTQ3B0ci0+U0NwLnBoYXNlID09IGluX3NsY3Rfbm9ybSkKLQkJCQljbWRfYnl0ZXNfc2VudCAtPSAxOwotCQl9OwotCi0JCWlmIChlc3AtPmVyZXYgIT0gZmFzaG1lKQotCQkJZXNwX2NtZChlc3AsIEVTUF9DTURfTlVMTCk7Ci0KLQkJLyogQmUgY2FyZWZ1bCwgd2UgY291bGQgcmVhbGx5IGdldCBmdWNrZWQgZHVyaW5nIHN5bmNocm9ub3VzCi0JCSAqIGRhdGEgdHJhbnNmZXJzIGlmIHdlIHRyeSB0byBmbHVzaCB0aGUgZmlmbyBub3cuCi0JCSAqLwotCQlpZiAoKGVzcC0+ZXJldiAhPSBmYXNobWUpICYmIC8qIG5vdCBhIEhhcHB5IE1lYWwgYW5kLi4uICovCi0JCSAgICAhZmNudCAmJiAvKiBGaWZvIGlzIGVtcHR5IGFuZC4uLiAqLwotCQkgICAgLyogZWl0aGVyIHdlIGFyZSBub3QgZG9pbmcgc3luY2hyb25vdXMgdHJhbnNmZXJzIG9yLi4uICovCi0JCSAgICAoIWVzcF9kZXYtPnN5bmNfbWF4X29mZnNldCB8fAotCQkgICAgIC8qIFdlIGFyZSBub3QgZ29pbmcgaW50byBkYXRhIGluIHBoYXNlLiAqLwotCQkgICAgICgoZXNwLT5zcmVnICYgRVNQX1NUQVRfUE1BU0spICE9IEVTUF9ESVApKSkKLQkJCWVzcF9jbWQoZXNwLCBFU1BfQ01EX0ZMVVNIKTsgLyogZmx1c2ggaXMgc2FmZSAqLwotCi0JCS8qIFNlZSBob3cgZmFyIHdlIGdvdCBpZiB0aGlzIGlzIG5vdCBhIHNsb3cgY29tbWFuZC4gKi8KLQkJaWYgKCFlc3AtPmVzcF9zbG93Y21kKSB7Ci0JCQlpZiAoY21kX2J5dGVzX3NlbnQgPCAwKQotCQkJCWNtZF9ieXRlc19zZW50ID0gMDsKLQkJCWlmIChjbWRfYnl0ZXNfc2VudCAhPSBTQ3B0ci0+Y21kX2xlbikgewotCQkJCS8qIENyYXBvbGEsIG1hcmsgaXQgYXMgYSBzbG93Y21kCi0JCQkJICogc28gdGhhdCB3ZSBoYXZlIHNvbWUgY2hhbmNlIG9mCi0JCQkJICoga2VlcGluZyB0aGUgY29tbWFuZCBhbGl2ZSB3aXRoCi0JCQkJICogZ29vZCBsdWNrLgotCQkJCSAqCi0JCQkJICogWFhYIEFjdHVhbGx5LCBpZiB3ZSBkaWRuJ3Qgc2VuZCBpdCBhbGwKLQkJCQkgKiBYWFggdGhpcyBtZWFucyBlaXRoZXIgd2UgZGlkbid0IHNldCB0aGluZ3MKLQkJCQkgKiBYWFggdXAgcHJvcGVybHkgKGRyaXZlciBidWcpIG9yIHRoZSB0YXJnZXQKLQkJCQkgKiBYWFggb3IgdGhlIEVTUCBkZXRlY3RlZCBwYXJpdHkgb24gb25lIG9mCi0JCQkJICogWFhYIHRoZSBjb21tYW5kIGJ5dGVzLiAgVGhpcyBtYWtlcyBtdWNoCi0JCQkJICogWFhYIG1vcmUgc2Vuc2UsIGFuZCB0aGVyZWZvcmUgdGhpcyBjb2RlCi0JCQkJICogWFhYIHNob3VsZCBiZSBjaGFuZ2VkIHRvIHNlbmQgb3V0IGEKLQkJCQkgKiBYWFggcGFyaXR5IGVycm9yIG1lc3NhZ2Ugb3IgaWYgdGhlIHN0YXR1cwotCQkJCSAqIFhYWCByZWdpc3RlciBzaG93cyBubyBwYXJpdHkgZXJyb3IgdGhlbgotCQkJCSAqIFhYWCBqdXN0IGV4cGVjdCB0aGUgdGFyZ2V0IHRvIGJyaW5nIHRoZQotCQkJCSAqIFhYWCBidXMgaW50byBtZXNzYWdlIGluIHBoYXNlIHNvIHRoYXQgaXQKLQkJCQkgKiBYWFggY2FuIHNlbmQgdXMgdGhlIHBhcml0eSBlcnJvciBtZXNzYWdlLgotCQkJCSAqIFhYWCBTQ1NJIHN1Y2tzLi4uCi0JCQkJICovCi0JCQkJZXNwLT5lc3Bfc2xvd2NtZCA9IDE7Ci0JCQkJZXNwLT5lc3Bfc2NtZHAgPSAmKFNDcHRyLT5jbW5kW2NtZF9ieXRlc19zZW50XSk7Ci0JCQkJZXNwLT5lc3Bfc2NtZGxlZnQgPSAoU0NwdHItPmNtZF9sZW4gLSBjbWRfYnl0ZXNfc2VudCk7Ci0JCQl9Ci0JCX0KLQotCQkvKiBOb3cgZmlndXJlIG91dCB3aGVyZSB3ZSB3ZW50LiAqLwotCQllc3BfYWR2YW5jZV9waGFzZShTQ3B0ciwgaW5fdGhlX2RhcmspOwotCQlyZXR1cm4gZXNwX2RvX3BoYXNlX2RldGVybWluZShlc3ApOwotCX0KLQotCS8qIERpZCB0aGUgdGFyZ2V0IGV2ZW4gbWFrZSBpdD8gKi8KLQlpZiAoZXNwLT5pcmVnID09IEVTUF9JTlRSX0RDKSB7Ci0JCS8qIHdoZWVlLi4uIG5vYm9keSB0aGVyZSBvciB0aGV5IGRpZG4ndCBsaWtlCi0JCSAqIHdoYXQgd2UgdG9sZCBpdCB0byBkbywgY2xlYW4gdXAuCi0JCSAqLwotCi0JCS8qIElmIGFueW9uZSBpcyBvZmYgdGhlIGJ1cywgYnV0IHdvcmtpbmcgb24KLQkJICogYSBjb21tYW5kIGluIHRoZSBiYWNrZ3JvdW5kIGZvciB1cywgdGVsbAotCQkgKiB0aGUgRVNQIHRvIGxpc3RlbiBmb3IgdGhlbS4KLQkJICovCi0JCWlmIChlc3AtPmRpc2Nvbm5lY3RlZF9TQykKLQkJCWVzcF9jbWQoZXNwLCBFU1BfQ01EX0VTRUwpOwotCi0JCWlmICgoKDE8PFNDcHRyLT5kZXZpY2UtPmlkKSAmIGVzcC0+dGFyZ2V0c19wcmVzZW50KSAmJgotCQkgICAgZXNwLT5zZXFyZWcgIT0gMCAmJgotCQkgICAgKGVzcC0+Y3VyX21zZ291dFswXSA9PSBFWFRFTkRFRF9NRVNTQUdFKSAmJgotCQkgICAgKFNDcHRyLT5TQ3AucGhhc2UgPT0gaW5fc2xjdF9tc2cgfHwKLQkJICAgICBTQ3B0ci0+U0NwLnBoYXNlID09IGluX3NsY3Rfc3RvcCkpIHsKLQkJCS8qIHNoaXQgKi8KLQkJCWVzcC0+c25pcCA9IDA7Ci0JCQlFU1BMT0coKCJlc3AlZDogRmFpbGVkIHN5bmNocm9ub3VzIG5lZ290aWF0aW9uIGZvciB0YXJnZXQgJWQgIgotCQkJCSJsdW4gJWRcbiIsIGVzcC0+ZXNwX2lkLCBTQ3B0ci0+ZGV2aWNlLT5pZCwgU0NwdHItPmRldmljZS0+bHVuKSk7Ci0JCQllc3BfZGV2LT5zeW5jX21heF9vZmZzZXQgPSAwOwotCQkJZXNwX2Rldi0+c3luY19taW5fcGVyaW9kID0gMDsKLQkJCWVzcF9kZXYtPnN5bmMgPSAxOyAvKiBzbyB3ZSBkb24ndCBuZWdvdGlhdGUgYWdhaW4gKi8KLQotCQkJLyogUnVuIHRoZSBjb21tYW5kIGFnYWluLCB0aGlzIHRpbWUgdGhvdWdoIHdlCi0JCQkgKiB3b24ndCB0cnkgdG8gbmVnb3RpYXRlIGZvciBzeW5jaHJvbm91cyB0cmFuc2ZlcnMuCi0JCQkgKgotCQkJICogWFhYIEknZCBsaWtlIHRvIGRvIHNvbWV0aGluZyBsaWtlIHNlbmQgYW4KLQkJCSAqIFhYWCBJTklUSUFUT1JfRVJST1Igb3IgQUJPUlQgbWVzc2FnZSB0byB0aGUKLQkJCSAqIFhYWCB0YXJnZXQgdG8gdGVsbCBpdCwgIlNvcnJ5IEkgY29uZnVzZWQgeW91LAotCQkJICogWFhYIHBsZWFzZSBjb21lIGJhY2sgYW5kIEkgd2lsbCBiZSBuaWNlciBuZXh0Ci0JCQkgKiBYWFggdGltZSIuICBCdXQgdGhhdCByZXF1aXJlcyBoYXZpbmcgdGhlIHRhcmdldAotCQkJICogWFhYIG9uIHRoZSBidXMsIGFuZCBpdCBoYXMgZHJvcHBlZCBCU1kgb24gdXMuCi0JCQkgKi8KLQkJCWVzcC0+Y3VycmVudF9TQyA9IE5VTEw7Ci0JCQllc3BfYWR2YW5jZV9waGFzZShTQ3B0ciwgbm90X2lzc3VlZCk7Ci0JCQlwcmVwZW5kX1NDKCZlc3AtPmlzc3VlX1NDLCBTQ3B0cik7Ci0JCQllc3BfZXhlY19jbWQoZXNwKTsKLQkJCXJldHVybiBkb19pbnRyX2VuZDsKLQkJfQotCi0JCS8qIE9rLCB0aGlzIGlzIG5vcm1hbCwgdGhpcyBpcyB3aGF0IHdlIHNlZSBkdXJpbmcgYm9vdAotCQkgKiBvciB3aGVuZXZlciB3aGVuIHdlIGFyZSBzY2FubmluZyB0aGUgYnVzIGZvciB0YXJnZXRzLgotCQkgKiBCdXQgZmlyc3QgbWFrZSBzdXJlIHRoYXQgaXMgcmVhbGx5IHdoYXQgaXMgaGFwcGVuaW5nLgotCQkgKi8KLQkJaWYgKCgoMTw8U0NwdHItPmRldmljZS0+aWQpICYgZXNwLT50YXJnZXRzX3ByZXNlbnQpKSB7Ci0JCQlFU1BMT0coKCJlc3AlZDogV2FybmluZywgbGl2ZSB0YXJnZXQgJWQgbm90IHJlc3BvbmRpbmcgdG8gIgotCQkJCSJzZWxlY3Rpb24uXG4iLCBlc3AtPmVzcF9pZCwgU0NwdHItPmRldmljZS0+aWQpKTsKLQotCQkJLyogVGhpcyBfQ0FOXyBoYXBwZW4uICBUaGUgU0NTSSBzdGFuZGFyZCBzdGF0ZXMgdGhhdAotCQkJICogdGhlIHRhcmdldCBpcyB0byBfbm90XyByZXNwb25kIHRvIHNlbGVjdGlvbiBpZgotCQkJICogX2l0XyBkZXRlY3RzIGJhZCBwYXJpdHkgb24gdGhlIGJ1cyBmb3IgYW55IHJlYXNvbi4KLQkJCSAqIFRoZXJlZm9yZSwgd2UgYXNzdW1lIHRoYXQgaWYgd2UndmUgdGFsa2VkIHN1Y2Nlc3NmdWxseQotCQkJICogdG8gdGhpcyB0YXJnZXQgYmVmb3JlLCBiYWQgcGFyaXR5IGlzIHRoZSBwcm9ibGVtLgotCQkJICovCi0JCQllc3BfZG9uZShlc3AsIChESURfUEFSSVRZIDw8IDE2KSk7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBFbHNlLCB0aGVyZSByZWFsbHkgaXNuJ3QgYW55b25lIHRoZXJlLiAqLwotCQkJRVNQTUlTQygoImVzcDogc2VsZWN0aW9uIGZhaWx1cmUsIG1heWJlIG5vYm9keSB0aGVyZT9cbiIpKTsKLQkJCUVTUE1JU0MoKCJlc3A6IHRhcmdldCAlZCBsdW4gJWRcbiIsCi0JCQkJIFNDcHRyLT5kZXZpY2UtPmlkLCBTQ3B0ci0+ZGV2aWNlLT5sdW4pKTsKLQkJCWVzcF9kb25lKGVzcCwgKERJRF9CQURfVEFSR0VUIDw8IDE2KSk7Ci0JCX0KLQkJcmV0dXJuIGRvX2ludHJfZW5kOwotCX0KLQotCUVTUExPRygoImVzcCVkOiBTZWxlY3Rpb24gZmFpbHVyZS5cbiIsIGVzcC0+ZXNwX2lkKSk7Ci0JcHJpbnRrKCJlc3AlZDogQ3VycmVudGx5IC0tICIsIGVzcC0+ZXNwX2lkKTsKLQllc3BfcHJpbnRfaXJlZyhlc3AtPmlyZWcpOyBwcmludGsoIiAiKTsKLQllc3BfcHJpbnRfc3RhdHJlZyhlc3AtPnNyZWcpOyBwcmludGsoIiAiKTsKLQllc3BfcHJpbnRfc2VxcmVnKGVzcC0+c2VxcmVnKTsgcHJpbnRrKCJcbiIpOwotCXByaW50aygiZXNwJWQ6IE5ldyAtLSAiLCBlc3AtPmVzcF9pZCk7Ci0JZXNwLT5zcmVnID0gc2J1c19yZWFkYihlc3AtPmVyZWdzICsgRVNQX1NUQVRVUyk7Ci0JZXNwLT5zZXFyZWcgPSBzYnVzX3JlYWRiKGVzcC0+ZXJlZ3MgKyBFU1BfU1NURVApOwotCWVzcC0+aXJlZyA9IHNidXNfcmVhZGIoZXNwLT5lcmVncyArIEVTUF9JTlRSUFQpOwotCWVzcF9wcmludF9pcmVnKGVzcC0+aXJlZyk7IHByaW50aygiICIpOwotCWVzcF9wcmludF9zdGF0cmVnKGVzcC0+c3JlZyk7IHByaW50aygiICIpOwotCWVzcF9wcmludF9zZXFyZWcoZXNwLT5zZXFyZWcpOyBwcmludGsoIlxuIik7Ci0JRVNQTE9HKCgiZXNwJWQ6IHJlc2V0dGluZyBidXNcbiIsIGVzcC0+ZXNwX2lkKSk7Ci0JcmV0dXJuIGRvX3Jlc2V0X2J1czsgLyogdWdoLi4uICovCi19Ci0KLS8qIENvbnRpbnVlIHJlYWRpbmcgYnl0ZXMgZm9yIG1zZ2luIHBoYXNlLiAqLwotc3RhdGljIGludCBlc3BfZG9fbXNnaW5jb250KHN0cnVjdCBlc3AgKmVzcCkKLXsKLQlpZiAoZXNwLT5pcmVnICYgRVNQX0lOVFJfQlNFUlYpIHsKLQkJLyogaW4gdGhlIHJpZ2h0IHBoYXNlIHRvbz8gKi8KLQkJaWYgKChlc3AtPnNyZWcgJiBFU1BfU1RBVF9QTUFTSykgPT0gRVNQX01JUCkgewotCQkJLyogcGhldy4uLiAqLwotCQkJZXNwX2NtZChlc3AsIEVTUF9DTURfVEkpOwotCQkJZXNwX2FkdmFuY2VfcGhhc2UoZXNwLT5jdXJyZW50X1NDLCBpbl9tc2dpbmRvbmUpOwotCQkJcmV0dXJuIGRvX2ludHJfZW5kOwotCQl9Ci0KLQkJLyogV2UgY2hhbmdlZCBwaGFzZSBidXQgRVNQIHNob3dzIGJ1cyBzZXJ2aWNlLAotCQkgKiBpbiB0aGlzIGNhc2UgaXQgaXMgbW9zdCBsaWtlbHkgdGhhdCB3ZSwgdGhlCi0JCSAqIGhhY2tlciB3aG8gaGFzIGJlZW4gdXAgZm9yIDIwaHJzIHN0cmFpZ2h0Ci0JCSAqIHN0YXJpbmcgYXQgdGhlIHNjcmVlbiwgZHJvd25lZCBpbiBjb2ZmZWUKLQkJICogc21lbGxpbmcgbGlrZSByZXRjaGVkIGNpZ2FyZXR0ZSBhc2hlcwotCQkgKiBoYXZlIG1pc2NvZGVkIHNvbWV0aGluZy4uLi4uIHNvLCB0cnkgdG8KLQkJICogcmVjb3ZlciBhcyBiZXN0IHdlIGNhbi4KLQkJICovCi0JCUVTUExPRygoImVzcCVkOiBtZXNzYWdlIGluIG1pcy1jYXJyaWFnZS5cbiIsIGVzcC0+ZXNwX2lkKSk7Ci0JfQotCWVzcF9hZHZhbmNlX3BoYXNlKGVzcC0+Y3VycmVudF9TQywgaW5fdGhlX2RhcmspOwotCXJldHVybiBkb19waGFzZV9kZXRlcm1pbmU7Ci19Ci0KLXN0YXRpYyBpbnQgY2hlY2tfc2luZ2xlYnl0ZV9tc2coc3RydWN0IGVzcCAqZXNwKQotewotCWVzcC0+cHJldm1zZ2luID0gZXNwLT5jdXJfbXNnaW5bMF07Ci0JaWYgKGVzcC0+Y3VyX21zZ2luWzBdICYgMHg4MCkgewotCQkvKiB3aGVlZS4uLiAqLwotCQlFU1BMT0coKCJlc3AlZDogdGFyZ2V0IHNlbmRzIGlkZW50aWZ5IGFtaWRzdCBwaGFzZXNcbiIsCi0JCQllc3AtPmVzcF9pZCkpOwotCQllc3BfYWR2YW5jZV9waGFzZShlc3AtPmN1cnJlbnRfU0MsIGluX3RoZV9kYXJrKTsKLQkJcmV0dXJuIDA7Ci0JfSBlbHNlIGlmICgoKGVzcC0+Y3VyX21zZ2luWzBdICYgMHhmMCkgPT0gMHgyMCkgfHwKLQkJICAgKGVzcC0+Y3VyX21zZ2luWzBdID09IEVYVEVOREVEX01FU1NBR0UpKSB7Ci0JCWVzcC0+bXNnaW5fbGVuID0gMjsKLQkJZXNwX2FkdmFuY2VfcGhhc2UoZXNwLT5jdXJyZW50X1NDLCBpbl9tc2dpbmNvbnQpOwotCQlyZXR1cm4gMDsKLQl9Ci0JZXNwX2FkdmFuY2VfcGhhc2UoZXNwLT5jdXJyZW50X1NDLCBpbl90aGVfZGFyayk7Ci0Jc3dpdGNoIChlc3AtPmN1cl9tc2dpblswXSkgewotCWRlZmF1bHQ6Ci0JCS8qIFdlIGRvbid0IHdhbnQgdG8gaGVhciBhYm91dCBpdC4gKi8KLQkJRVNQTE9HKCgiZXNwJWQ6IG1zZyAlMDJ4IHdoaWNoIHdlIGRvbid0IGtub3cgYWJvdXRcbiIsIGVzcC0+ZXNwX2lkLAotCQkJZXNwLT5jdXJfbXNnaW5bMF0pKTsKLQkJcmV0dXJuIE1FU1NBR0VfUkVKRUNUOwotCi0JY2FzZSBOT1A6Ci0JCUVTUExPRygoImVzcCVkOiB0YXJnZXQgJWQgc2VuZHMgYSBub3BcbiIsIGVzcC0+ZXNwX2lkLAotCQkJZXNwLT5jdXJyZW50X1NDLT5kZXZpY2UtPmlkKSk7Ci0JCXJldHVybiAwOwotCi0JY2FzZSBSRVNUT1JFX1BPSU5URVJTOgotCQkvKiBJbiB0aGlzIGNhc2Ugd2UgbWlnaHQgYWxzbyBoYXZlIHRvIGJhY2t1cCB0aGUKLQkJICogInNsb3cgY29tbWFuZCIgcG9pbnRlci4gIEl0IGlzIHJhcmUgdG8gZ2V0IHN1Y2gKLQkJICogYSBzYXZlL3Jlc3RvcmUgcG9pbnRlciBzZXF1ZW5jZSBzbyBlYXJseSBpbiB0aGUKLQkJICogYnVzIHRyYW5zaXRpb24gc2VxdWVuY2VzLCBidXQgY292ZXIgaXQuCi0JCSAqLwotCQlpZiAoZXNwLT5lc3Bfc2xvd2NtZCkgewotCQkJZXNwLT5lc3Bfc2NtZGxlZnQgPSBlc3AtPmN1cnJlbnRfU0MtPmNtZF9sZW47Ci0JCQllc3AtPmVzcF9zY21kcCA9ICZlc3AtPmN1cnJlbnRfU0MtPmNtbmRbMF07Ci0JCX0KLQkJZXNwX3Jlc3RvcmVfcG9pbnRlcnMoZXNwLCBlc3AtPmN1cnJlbnRfU0MpOwotCQlyZXR1cm4gMDsKLQotCWNhc2UgU0FWRV9QT0lOVEVSUzoKLQkJZXNwX3NhdmVfcG9pbnRlcnMoZXNwLCBlc3AtPmN1cnJlbnRfU0MpOwotCQlyZXR1cm4gMDsKLQotCWNhc2UgQ09NTUFORF9DT01QTEVURToKLQljYXNlIERJU0NPTk5FQ1Q6Ci0JCS8qIEZyZWVpbmcgdGhlIGJ1cywgbGV0IGl0IGdvLiAqLwotCQllc3AtPmN1cnJlbnRfU0MtPlNDcC5waGFzZSA9IGluX2ZyZWVpbmc7Ci0JCXJldHVybiAwOwotCi0JY2FzZSBNRVNTQUdFX1JFSkVDVDoKLQkJRVNQTUlTQygoIm1zZyByZWplY3QsICIpKTsKLQkJaWYgKGVzcC0+cHJldm1zZ291dCA9PSBFWFRFTkRFRF9NRVNTQUdFKSB7Ci0JCQlzdHJ1Y3QgZXNwX2RldmljZSAqZXNwX2RldiA9IGVzcC0+Y3VycmVudF9TQy0+ZGV2aWNlLT5ob3N0ZGF0YTsKLQotCQkJLyogRG9lc24ndCBsb29rIGxpa2UgdGhpcyB0YXJnZXQgY2FuCi0JCQkgKiBkbyBzeW5jaHJvbm91cyBvciBXSURFIHRyYW5zZmVycy4KLQkJCSAqLwotCQkJRVNQU0RUUigoImdvdCByZWplY3QsIHdhcyB0cnlpbmcgbmVnbywgY2xlYXJpbmcgc3luYy9XSURFXG4iKSk7Ci0JCQllc3BfZGV2LT5zeW5jID0gMTsKLQkJCWVzcF9kZXYtPndpZGUgPSAxOwotCQkJZXNwX2Rldi0+c3luY19taW5fcGVyaW9kID0gMDsKLQkJCWVzcF9kZXYtPnN5bmNfbWF4X29mZnNldCA9IDA7Ci0JCQlyZXR1cm4gMDsKLQkJfSBlbHNlIHsKLQkJCUVTUE1JU0MoKCJub3Qgc3luYyBuZWdvLCBzZW5kaW5nIEFCT1JUXG4iKSk7Ci0JCQlyZXR1cm4gQUJPUlQ7Ci0JCX0KLQl9OwotfQotCi0vKiBUYXJnZXQgbmVnb3RpYXRlcyBmb3Igc3luY2hyb25vdXMgdHJhbnNmZXJzIGJlZm9yZSB3ZSBkbywgdGhpcwotICogaXMgbGVnYWwgYWx0aG91Z2ggdmVyeSBzdHJhbmdlLiAgV2hhdCBpcyBldmVuIGZ1bm5pZXIgaXMgdGhhdAotICogdGhlIFNDU0kyIHN0YW5kYXJkIHNwZWNpZmljYWxseSByZWNvbW1lbmRzIGFnYWluc3QgdGFyZ2V0cyBkb2luZwotICogdGhpcyBiZWNhdXNlIHNvIG1hbnkgaW5pdGlhdG9ycyBjYW5ub3QgY29wZSB3aXRoIHRoaXMgb2NjdXJyaW5nLgotICovCi1zdGF0aWMgaW50IHRhcmdldF93aXRoX2FudHNfaW5fcGFudHMoc3RydWN0IGVzcCAqZXNwLAotCQkJCSAgICAgc3RydWN0IHNjc2lfY21uZCAqU0NwdHIsCi0JCQkJICAgICBzdHJ1Y3QgZXNwX2RldmljZSAqZXNwX2RldikKLXsKLQlpZiAoZXNwX2Rldi0+c3luYyB8fCBTQ3B0ci0+ZGV2aWNlLT5ib3JrZW4pIHsKLQkJLyogc29ycnksIG5vIGNhbiBkbyAqLwotCQlFU1BTRFRSKCgiZm9yY2luZyB0byBhc3luYywgIikpOwotCQlidWlsZF9zeW5jX25lZ29fbXNnKGVzcCwgMCwgMCk7Ci0JCWVzcF9kZXYtPnN5bmMgPSAxOwotCQllc3AtPnNuaXAgPSAxOwotCQlFU1BMT0coKCJlc3AlZDogaG9waW5nIGZvciBtc2dvdXRcbiIsIGVzcC0+ZXNwX2lkKSk7Ci0JCWVzcF9hZHZhbmNlX3BoYXNlKFNDcHRyLCBpbl90aGVfZGFyayk7Ci0JCXJldHVybiBFWFRFTkRFRF9NRVNTQUdFOwotCX0KLQotCS8qIE9rLCB3ZSdsbCBjaGVjayB0aGVtIG91dC4uLiAqLwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBzeW5jX3JlcG9ydChzdHJ1Y3QgZXNwICplc3ApCi17Ci0JaW50IG1zZzMsIG1zZzQ7Ci0JY2hhciAqdHlwZTsKLQotCW1zZzMgPSBlc3AtPmN1cl9tc2dpblszXTsKLQltc2c0ID0gZXNwLT5jdXJfbXNnaW5bNF07Ci0JaWYgKG1zZzQpIHsKLQkJaW50IGh6ID0gMTAwMDAwMDAwMCAvIChtc2czICogNCk7Ci0JCWludCBpbnRlZ2VyID0gaHogLyAxMDAwMDAwOwotCQlpbnQgZnJhY3Rpb24gPSAoaHogLSAoaW50ZWdlciAqIDEwMDAwMDApKSAvIDEwMDAwOwotCQlpZiAoKGVzcC0+ZXJldiA9PSBmYXNobWUpICYmCi0JCSAgICAoZXNwLT5jb25maWczW2VzcC0+Y3VycmVudF9TQy0+ZGV2aWNlLT5pZF0gJiBFU1BfQ09ORklHM19FV0lERSkpIHsKLQkJCXR5cGUgPSAiRkFTVC1XSURFIjsKLQkJCWludGVnZXIgPDw9IDE7Ci0JCQlmcmFjdGlvbiA8PD0gMTsKLQkJfSBlbHNlIGlmICgobXNnMyAqIDQpIDwgMjAwKSB7Ci0JCQl0eXBlID0gIkZBU1QiOwotCQl9IGVsc2UgewotCQkJdHlwZSA9ICJzeW5jaHJvbm91cyI7Ci0JCX0KLQotCQkvKiBEbyBub3QgdHJhbnNmb3JtIHRoaXMgYmFjayBpbnRvIG9uZSBiaWcgcHJpbnRrCi0JCSAqIGFnYWluLCBpdCB0cmlnZ2VycyBhIGJ1ZyBpbiBvdXIgc3BhcmM2NC1nY2MyNzIKLQkJICogc2libGluZyBjYWxsIG9wdGltaXphdGlvbi4gIC1EYXZlTQotCQkgKi8KLQkJRVNQTE9HKChLRVJOX0lORk8gImVzcCVkOiB0YXJnZXQgJWQgIiwKLQkJCWVzcC0+ZXNwX2lkLCBlc3AtPmN1cnJlbnRfU0MtPmRldmljZS0+aWQpKTsKLQkJRVNQTE9HKCgiW3BlcmlvZCAlZG5zIG9mZnNldCAlZCAlZC4lMDJkTUh6ICIsCi0JCQkoaW50KSBtc2czICogNCwgKGludCkgbXNnNCwKLQkJCWludGVnZXIsIGZyYWN0aW9uKSk7Ci0JCUVTUExPRygoIiVzIFNDU0klc11cbiIsIHR5cGUsCi0JCQkoKChtc2czICogNCkgPCAyMDApID8gIi1JSSIgOiAiIikpKTsKLQl9IGVsc2UgewotCQlFU1BMT0coKEtFUk5fSU5GTyAiZXNwJWQ6IHRhcmdldCAlZCBhc3luY2hyb25vdXNcbiIsCi0JCQllc3AtPmVzcF9pZCwgZXNwLT5jdXJyZW50X1NDLT5kZXZpY2UtPmlkKSk7Ci0JfQotfQotCi1zdGF0aWMgaW50IGNoZWNrX211bHRpYnl0ZV9tc2coc3RydWN0IGVzcCAqZXNwKQotewotCXN0cnVjdCBzY3NpX2NtbmQgKlNDcHRyID0gZXNwLT5jdXJyZW50X1NDOwotCXN0cnVjdCBlc3BfZGV2aWNlICplc3BfZGV2ID0gU0NwdHItPmRldmljZS0+aG9zdGRhdGE7Ci0JdTggcmVndmFsID0gMDsKLQlpbnQgbWVzc2FnZV9vdXQgPSAwOwotCi0JRVNQU0RUUigoImNoayBtdWx0aWJ5dGUgbXNnOiAiKSk7Ci0JaWYgKGVzcC0+Y3VyX21zZ2luWzJdID09IEVYVEVOREVEX1NEVFIpIHsKLQkJaW50IHBlcmlvZCA9IGVzcC0+Y3VyX21zZ2luWzNdOwotCQlpbnQgb2Zmc2V0ID0gZXNwLT5jdXJfbXNnaW5bNF07Ci0KLQkJRVNQU0RUUigoImlzIHN5bmMgbmVnbyByZXNwb25zZSwgIikpOwotCQlpZiAoIWVzcC0+c25pcCkgewotCQkJaW50IHJ2YWw7Ci0KLQkJCS8qIFRhcmdldCBuZWdvdGlhdGVzIGZpcnN0ISAqLwotCQkJRVNQU0RUUigoInRhcmdldCBqdW1wcyB0aGUgZ3VuLCAiKSk7Ci0JCQltZXNzYWdlX291dCA9IEVYVEVOREVEX01FU1NBR0U7IC8qIHdlIG11c3QgcmVzcG9uZCAqLwotCQkJcnZhbCA9IHRhcmdldF93aXRoX2FudHNfaW5fcGFudHMoZXNwLCBTQ3B0ciwgZXNwX2Rldik7Ci0JCQlpZiAocnZhbCkKLQkJCQlyZXR1cm4gcnZhbDsKLQkJfQotCi0JCUVTUFNEVFIoKCJleGFtaW5pbmcgc2R0ciwgIikpOwotCi0JCS8qIE9mZnNldCBjYW5ub3QgYmUgbGFyZ2VyIHRoYW4gRVNQIGZpZm8gc2l6ZS4gKi8KLQkJaWYgKG9mZnNldCA+IDE1KSB7Ci0JCQlFU1BTRFRSKCgib2Zmc2V0IHRvbyBiaWcgJTJ4LCAiLCBvZmZzZXQpKTsKLQkJCW9mZnNldCA9IDE1OwotCQkJRVNQU0RUUigoInNlbmRpbmcgYmFjayBuZXcgb2Zmc2V0XG4iKSk7Ci0JCQlidWlsZF9zeW5jX25lZ29fbXNnKGVzcCwgcGVyaW9kLCBvZmZzZXQpOwotCQkJcmV0dXJuIEVYVEVOREVEX01FU1NBR0U7Ci0JCX0KLQotCQlpZiAob2Zmc2V0ICYmIHBlcmlvZCA+IGVzcC0+bWF4X3BlcmlvZCkgewotCQkJLyogWWVlZSwgYXN5bmMgZm9yIHRoaXMgc2xvdyBkZXZpY2UuICovCi0JCQlFU1BTRFRSKCgicGVyaW9kIHRvbyBsb25nICUyeCwgIiwgcGVyaW9kKSk7Ci0JCQlidWlsZF9zeW5jX25lZ29fbXNnKGVzcCwgMCwgMCk7Ci0JCQlFU1BTRFRSKCgiaG9waW5nIGZvciBtc2dvdXRcbiIpKTsKLQkJCWVzcF9hZHZhbmNlX3BoYXNlKGVzcC0+Y3VycmVudF9TQywgaW5fdGhlX2RhcmspOwotCQkJcmV0dXJuIEVYVEVOREVEX01FU1NBR0U7Ci0JCX0gZWxzZSBpZiAob2Zmc2V0ICYmIHBlcmlvZCA8IGVzcC0+bWluX3BlcmlvZCkgewotCQkJRVNQU0RUUigoInBlcmlvZCB0b28gc2hvcnQgJTJ4LCAiLCBwZXJpb2QpKTsKLQkJCXBlcmlvZCA9IGVzcC0+bWluX3BlcmlvZDsKLQkJCWlmIChlc3AtPmVyZXYgPiBlc3AyMzYpCi0JCQkJcmVndmFsID0gNDsKLQkJCWVsc2UKLQkJCQlyZWd2YWwgPSA1OwotCQl9IGVsc2UgaWYgKG9mZnNldCkgewotCQkJaW50IHRtcDsKLQotCQkJRVNQU0RUUigoInBlcmlvZCBpcyBvaywgIikpOwotCQkJdG1wID0gZXNwLT5jY3ljbGUgLyAxMDAwOwotCQkJcmVndmFsID0gKCgocGVyaW9kIDw8IDIpICsgdG1wIC0gMSkgLyB0bXApOwotCQkJaWYgKHJlZ3ZhbCAmJiAoKGVzcC0+ZXJldiA9PSBmYXMxMDBhIHx8Ci0JCQkJCWVzcC0+ZXJldiA9PSBmYXMyMzYgIHx8Ci0JCQkJCWVzcC0+ZXJldiA9PSBmYXNobWUpKSkgewotCQkJCWlmIChwZXJpb2QgPj0gNTApCi0JCQkJCXJlZ3ZhbC0tOwotCQkJfQotCQl9Ci0KLQkJaWYgKG9mZnNldCkgewotCQkJdTggYml0OwotCi0JCQllc3BfZGV2LT5zeW5jX21pbl9wZXJpb2QgPSAocmVndmFsICYgMHgxZik7Ci0JCQllc3BfZGV2LT5zeW5jX21heF9vZmZzZXQgPSAob2Zmc2V0IHwgZXNwLT5yYWRlbGF5KTsKLQkJCWlmIChlc3AtPmVyZXYgPT0gZmFzMTAwYSB8fCBlc3AtPmVyZXYgPT0gZmFzMjM2IHx8IGVzcC0+ZXJldiA9PSBmYXNobWUpIHsKLQkJCQlpZiAoKGVzcC0+ZXJldiA9PSBmYXMxMDBhKSB8fCAoZXNwLT5lcmV2ID09IGZhc2htZSkpCi0JCQkJCWJpdCA9IEVTUF9DT05GSUczX0ZBU1Q7Ci0JCQkJZWxzZQotCQkJCQliaXQgPSBFU1BfQ09ORklHM19GU0NTSTsKLQkJCQlpZiAocGVyaW9kIDwgNTApIHsKLQkJCQkJLyogT24gRkFTMzY2LCBpZiB1c2luZyBmYXN0LTIwIHN5bmNocm9ub3VzIHRyYW5zZmVycwotCQkJCQkgKiB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGUgUkVRL0FDSyBhc3NlcnQvZGVhc3NlcnQKLQkJCQkJICogY29udHJvbCBiaXRzIGFyZSBjbGVhci4KLQkJCQkJICovCi0JCQkJCWlmIChlc3AtPmVyZXYgPT0gZmFzaG1lKQotCQkJCQkJZXNwX2Rldi0+c3luY19tYXhfb2Zmc2V0ICY9IH5lc3AtPnJhZGVsYXk7Ci0JCQkJCWVzcC0+Y29uZmlnM1tTQ3B0ci0+ZGV2aWNlLT5pZF0gfD0gYml0OwotCQkJCX0gZWxzZSB7Ci0JCQkJCWVzcC0+Y29uZmlnM1tTQ3B0ci0+ZGV2aWNlLT5pZF0gJj0gfmJpdDsKLQkJCQl9Ci0JCQkJZXNwLT5wcmV2X2NmZzMgPSBlc3AtPmNvbmZpZzNbU0NwdHItPmRldmljZS0+aWRdOwotCQkJCXNidXNfd3JpdGViKGVzcC0+cHJldl9jZmczLCBlc3AtPmVyZWdzICsgRVNQX0NGRzMpOwotCQkJfQotCQkJZXNwLT5wcmV2X3NvZmYgPSBlc3BfZGV2LT5zeW5jX21heF9vZmZzZXQ7Ci0JCQllc3AtPnByZXZfc3RwID0gZXNwX2Rldi0+c3luY19taW5fcGVyaW9kOwotCQkJc2J1c193cml0ZWIoZXNwLT5wcmV2X3NvZmYsIGVzcC0+ZXJlZ3MgKyBFU1BfU09GRik7Ci0JCQlzYnVzX3dyaXRlYihlc3AtPnByZXZfc3RwLCBlc3AtPmVyZWdzICsgRVNQX1NUUCk7Ci0JCQlFU1BTRFRSKCgic29mZj0lMnggc3RwPSUyeCBjZmczPSUyeFxuIiwKLQkJCQkgZXNwX2Rldi0+c3luY19tYXhfb2Zmc2V0LAotCQkJCSBlc3BfZGV2LT5zeW5jX21pbl9wZXJpb2QsCi0JCQkJIGVzcC0+Y29uZmlnM1tTQ3B0ci0+ZGV2aWNlLT5pZF0pKTsKLQotCQkJZXNwLT5zbmlwID0gMDsKLQkJfSBlbHNlIGlmIChlc3BfZGV2LT5zeW5jX21heF9vZmZzZXQpIHsKLQkJCXU4IGJpdDsKLQotCQkJLyogYmFjayB0byBhc3luYyBtb2RlICovCi0JCQlFU1BTRFRSKCgidW5hY2NhcHRhYmxlIHN5bmMgbmVnbywgZm9yY2luZyBhc3luY1xuIikpOwotCQkJZXNwX2Rldi0+c3luY19tYXhfb2Zmc2V0ID0gMDsKLQkJCWVzcF9kZXYtPnN5bmNfbWluX3BlcmlvZCA9IDA7Ci0JCQllc3AtPnByZXZfc29mZiA9IDA7Ci0JCQllc3AtPnByZXZfc3RwID0gMDsKLQkJCXNidXNfd3JpdGViKGVzcC0+cHJldl9zb2ZmLCBlc3AtPmVyZWdzICsgRVNQX1NPRkYpOwotCQkJc2J1c193cml0ZWIoZXNwLT5wcmV2X3N0cCwgZXNwLT5lcmVncyArIEVTUF9TVFApOwotCQkJaWYgKGVzcC0+ZXJldiA9PSBmYXMxMDBhIHx8IGVzcC0+ZXJldiA9PSBmYXMyMzYgfHwgZXNwLT5lcmV2ID09IGZhc2htZSkgewotCQkJCWlmICgoZXNwLT5lcmV2ID09IGZhczEwMGEpIHx8IChlc3AtPmVyZXYgPT0gZmFzaG1lKSkKLQkJCQkJYml0ID0gRVNQX0NPTkZJRzNfRkFTVDsKLQkJCQllbHNlCi0JCQkJCWJpdCA9IEVTUF9DT05GSUczX0ZTQ1NJOwotCQkJCWVzcC0+Y29uZmlnM1tTQ3B0ci0+ZGV2aWNlLT5pZF0gJj0gfmJpdDsKLQkJCQllc3AtPnByZXZfY2ZnMyA9IGVzcC0+Y29uZmlnM1tTQ3B0ci0+ZGV2aWNlLT5pZF07Ci0JCQkJc2J1c193cml0ZWIoZXNwLT5wcmV2X2NmZzMsIGVzcC0+ZXJlZ3MgKyBFU1BfQ0ZHMyk7Ci0JCQl9Ci0JCX0KLQotCQlzeW5jX3JlcG9ydChlc3ApOwotCi0JCUVTUFNEVFIoKCJjaGsgbXVsdGlieXRlIG1zZzogc3luYyBpcyBrbm93biwgIikpOwotCQllc3BfZGV2LT5zeW5jID0gMTsKLQotCQlpZiAobWVzc2FnZV9vdXQpIHsKLQkJCUVTUExPRygoImVzcCVkOiBzZW5kaW5nIHNkdHIgYmFjaywgaG9waW5nIGZvciBtc2dvdXRcbiIsCi0JCQkJZXNwLT5lc3BfaWQpKTsKLQkJCWJ1aWxkX3N5bmNfbmVnb19tc2coZXNwLCBwZXJpb2QsIG9mZnNldCk7Ci0JCQllc3BfYWR2YW5jZV9waGFzZShTQ3B0ciwgaW5fdGhlX2RhcmspOwotCQkJcmV0dXJuIEVYVEVOREVEX01FU1NBR0U7Ci0JCX0KLQotCQlFU1BTRFRSKCgicmV0dXJuaW5nIHplcm9cbiIpKTsKLQkJZXNwX2FkdmFuY2VfcGhhc2UoU0NwdHIsIGluX3RoZV9kYXJrKTsgLyogLi4ub3IgZWxzZSEgKi8KLQkJcmV0dXJuIDA7Ci0JfSBlbHNlIGlmIChlc3AtPmN1cl9tc2dpblsyXSA9PSBFWFRFTkRFRF9XRFRSKSB7Ci0JCWludCBzaXplID0gOCA8PCBlc3AtPmN1cl9tc2dpblszXTsKLQotCQllc3AtPnduaXAgPSAwOwotCQlpZiAoZXNwLT5lcmV2ICE9IGZhc2htZSkgewotCQkJRVNQTE9HKCgiZXNwJWQ6IEFJRUVFIHdpZGUgbXNnIHJlY2VpdmVkIGFuZCBub3QgSE1FLlxuIiwKLQkJCQllc3AtPmVzcF9pZCkpOwotCQkJbWVzc2FnZV9vdXQgPSBNRVNTQUdFX1JFSkVDVDsKLQkJfSBlbHNlIGlmIChzaXplID4gMTYpIHsKLQkJCUVTUExPRygoImVzcCVkOiBBSUVFRSB3aWRlIHRyYW5zZmVyIGZvciAlZCBzaXplICIKLQkJCQkibm90IHN1cHBvcnRlZC5cbiIsIGVzcC0+ZXNwX2lkLCBzaXplKSk7Ci0JCQltZXNzYWdlX291dCA9IE1FU1NBR0VfUkVKRUNUOwotCQl9IGVsc2UgewotCQkJLyogVGhpbmdzIGxvb2sgZ29vZDsgbGV0J3Mgc2VlIHdoYXQgd2UgZ290LiAqLwotCQkJaWYgKHNpemUgPT0gMTYpIHsKLQkJCQkvKiBTZXQgY29uZmlnIDMgcmVnaXN0ZXIgZm9yIHRoaXMgdGFyZ2V0LiAqLwotCQkJCWVzcC0+Y29uZmlnM1tTQ3B0ci0+ZGV2aWNlLT5pZF0gfD0gRVNQX0NPTkZJRzNfRVdJREU7Ci0JCQl9IGVsc2UgewotCQkJCS8qIEp1c3QgbWFrZSBzdXJlIGl0IHdhcyBvbmUgYnl0ZSBzaXplZC4gKi8KLQkJCQlpZiAoc2l6ZSAhPSA4KSB7Ci0JCQkJCUVTUExPRygoImVzcCVkOiBBaWVlZSwgd2lkZSBuZWdvIG9mICVkIHNpemUuXG4iLAotCQkJCQkJZXNwLT5lc3BfaWQsIHNpemUpKTsKLQkJCQkJbWVzc2FnZV9vdXQgPSBNRVNTQUdFX1JFSkVDVDsKLQkJCQkJZ290byBmaW5pc2g7Ci0JCQkJfQotCQkJCS8qIFB1cmUgcGFyYW5vaWEuICovCi0JCQkJZXNwLT5jb25maWczW1NDcHRyLT5kZXZpY2UtPmlkXSAmPSB+KEVTUF9DT05GSUczX0VXSURFKTsKLQkJCX0KLQkJCWVzcC0+cHJldl9jZmczID0gZXNwLT5jb25maWczW1NDcHRyLT5kZXZpY2UtPmlkXTsKLQkJCXNidXNfd3JpdGViKGVzcC0+cHJldl9jZmczLCBlc3AtPmVyZWdzICsgRVNQX0NGRzMpOwotCi0JCQkvKiBSZWdhcmRsZXNzLCBuZXh0IHRyeSBmb3Igc3luYyB0cmFuc2ZlcnMuICovCi0JCQlidWlsZF9zeW5jX25lZ29fbXNnKGVzcCwgZXNwLT5zeW5jX2RlZnAsIDE1KTsKLQkJCWVzcF9kZXYtPnN5bmMgPSAxOwotCQkJZXNwLT5zbmlwID0gMTsKLQkJCW1lc3NhZ2Vfb3V0ID0gRVhURU5ERURfTUVTU0FHRTsKLQkJfQotCX0gZWxzZSBpZiAoZXNwLT5jdXJfbXNnaW5bMl0gPT0gRVhURU5ERURfTU9ESUZZX0RBVEFfUE9JTlRFUikgewotCQlFU1BMT0coKCJlc3AlZDogcmVqZWN0aW5nIG1vZGlmeSBkYXRhIHB0ciBtc2dcbiIsIGVzcC0+ZXNwX2lkKSk7Ci0JCW1lc3NhZ2Vfb3V0ID0gTUVTU0FHRV9SRUpFQ1Q7Ci0JfQotZmluaXNoOgotCWVzcF9hZHZhbmNlX3BoYXNlKFNDcHRyLCBpbl90aGVfZGFyayk7Ci0JcmV0dXJuIG1lc3NhZ2Vfb3V0OwotfQotCi1zdGF0aWMgaW50IGVzcF9kb19tc2dpbmRvbmUoc3RydWN0IGVzcCAqZXNwKQotewotCXN0cnVjdCBzY3NpX2NtbmQgKlNDcHRyID0gZXNwLT5jdXJyZW50X1NDOwotCWludCBtZXNzYWdlX291dCA9IDAsIGl0ID0gMCwgcnZhbDsKLQotCXJ2YWwgPSBza2lwYWhlYWQxKGVzcCwgU0NwdHIsIGluX21zZ2luLCBpbl9tc2dpbmRvbmUpOwotCWlmIChydmFsKQotCQlyZXR1cm4gcnZhbDsKLQlpZiAoU0NwdHItPlNDcC5zZW50X2NvbW1hbmQgIT0gaW5fc3RhdHVzKSB7Ci0JCWlmICghKGVzcC0+aXJlZyAmIEVTUF9JTlRSX0RDKSkgewotCQkJaWYgKGVzcC0+bXNnaW5fbGVuICYmIChlc3AtPnNyZWcgJiBFU1BfU1RBVF9QRVJSKSkgewotCQkJCW1lc3NhZ2Vfb3V0ID0gTVNHX1BBUklUWV9FUlJPUjsKLQkJCQllc3BfY21kKGVzcCwgRVNQX0NNRF9GTFVTSCk7Ci0JCQl9IGVsc2UgaWYgKGVzcC0+ZXJldiAhPSBmYXNobWUgJiYKLQkJCSAgKGl0ID0gKHNidXNfcmVhZGIoZXNwLT5lcmVncyArIEVTUF9GRkxBR1MpICYgRVNQX0ZGX0ZCWVRFUykpICE9IDEpIHsKLQkJCQkvKiBXZSBjZXJ0YWlubHkgZHJvcHBlZCB0aGUgYmFsbCBzb21ld2hlcmUuICovCi0JCQkJbWVzc2FnZV9vdXQgPSBJTklUSUFUT1JfRVJST1I7Ci0JCQkJZXNwX2NtZChlc3AsIEVTUF9DTURfRkxVU0gpOwotCQkJfSBlbHNlIGlmICghZXNwLT5tc2dpbl9sZW4pIHsKLQkJCQlpZiAoZXNwLT5lcmV2ID09IGZhc2htZSkKLQkJCQkJaXQgPSBlc3AtPmhtZV9maWZvX3dvcmthcm91bmRfYnVmZmVyWzBdOwotCQkJCWVsc2UKLQkJCQkJaXQgPSBzYnVzX3JlYWRiKGVzcC0+ZXJlZ3MgKyBFU1BfRkRBVEEpOwotCQkJCWVzcF9hZHZhbmNlX3BoYXNlKFNDcHRyLCBpbl9tc2dpbmNvbnQpOwotCQkJfSBlbHNlIHsKLQkJCQkvKiBpdCBpcyBvayBhbmQgd2Ugd2FudCBpdCAqLwotCQkJCWlmIChlc3AtPmVyZXYgPT0gZmFzaG1lKQotCQkJCQlpdCA9IGVzcC0+Y3VyX21zZ2luW2VzcC0+bXNnaW5fY3RyXSA9Ci0JCQkJCQllc3AtPmhtZV9maWZvX3dvcmthcm91bmRfYnVmZmVyWzBdOwotCQkJCWVsc2UKLQkJCQkJaXQgPSBlc3AtPmN1cl9tc2dpbltlc3AtPm1zZ2luX2N0cl0gPQotCQkJCQkJc2J1c19yZWFkYihlc3AtPmVyZWdzICsgRVNQX0ZEQVRBKTsKLQkJCQllc3AtPm1zZ2luX2N0cisrOwotCQkJfQotCQl9IGVsc2UgewotCQkJZXNwX2FkdmFuY2VfcGhhc2UoU0NwdHIsIGluX3RoZV9kYXJrKTsKLQkJCXJldHVybiBkb193b3JrX2J1czsKLQkJfQotCX0gZWxzZSB7Ci0JCWl0ID0gZXNwLT5jdXJfbXNnaW5bMF07Ci0JfQotCWlmICghbWVzc2FnZV9vdXQgJiYgZXNwLT5tc2dpbl9sZW4pIHsKLQkJaWYgKGVzcC0+bXNnaW5fY3RyIDwgZXNwLT5tc2dpbl9sZW4pIHsKLQkJCWVzcF9hZHZhbmNlX3BoYXNlKFNDcHRyLCBpbl9tc2dpbmNvbnQpOwotCQl9IGVsc2UgaWYgKGVzcC0+bXNnaW5fbGVuID09IDEpIHsKLQkJCW1lc3NhZ2Vfb3V0ID0gY2hlY2tfc2luZ2xlYnl0ZV9tc2coZXNwKTsKLQkJfSBlbHNlIGlmIChlc3AtPm1zZ2luX2xlbiA9PSAyKSB7Ci0JCQlpZiAoZXNwLT5jdXJfbXNnaW5bMF0gPT0gRVhURU5ERURfTUVTU0FHRSkgewotCQkJCWlmICgoaXQgKyAyKSA+PSAxNSkgewotCQkJCQltZXNzYWdlX291dCA9IE1FU1NBR0VfUkVKRUNUOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWVzcC0+bXNnaW5fbGVuID0gKGl0ICsgMik7Ci0JCQkJCWVzcF9hZHZhbmNlX3BoYXNlKFNDcHRyLCBpbl9tc2dpbmNvbnQpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJbWVzc2FnZV9vdXQgPSBNRVNTQUdFX1JFSkVDVDsgLyogZm9vIG9uIHlvdSAqLwotCQkJfQotCQl9IGVsc2UgewotCQkJbWVzc2FnZV9vdXQgPSBjaGVja19tdWx0aWJ5dGVfbXNnKGVzcCk7Ci0JCX0KLQl9Ci0JaWYgKG1lc3NhZ2Vfb3V0IDwgMCkgewotCQlyZXR1cm4gLW1lc3NhZ2Vfb3V0OwotCX0gZWxzZSBpZiAobWVzc2FnZV9vdXQpIHsKLQkJaWYgKCgobWVzc2FnZV9vdXQgIT0gMSkgJiYKLQkJICAgICAoKG1lc3NhZ2Vfb3V0IDwgMHgyMCkgfHwgKG1lc3NhZ2Vfb3V0ICYgMHg4MCkpKSkKLQkJCWVzcC0+bXNnb3V0X2xlbiA9IDE7Ci0JCWVzcC0+Y3VyX21zZ291dFswXSA9IG1lc3NhZ2Vfb3V0OwotCQllc3BfY21kKGVzcCwgRVNQX0NNRF9TQVROKTsKLQkJZXNwX2FkdmFuY2VfcGhhc2UoU0NwdHIsIGluX3RoZV9kYXJrKTsKLQkJZXNwLT5tc2dpbl9sZW4gPSAwOwotCX0KLQllc3AtPnNyZWcgPSBzYnVzX3JlYWRiKGVzcC0+ZXJlZ3MgKyBFU1BfU1RBVFVTKTsKLQllc3AtPnNyZWcgJj0gfihFU1BfU1RBVF9JTlRSKTsKLQlpZiAoKGVzcC0+c3JlZyAmIChFU1BfU1RBVF9QTVNHfEVTUF9TVEFUX1BDRCkpID09IChFU1BfU1RBVF9QTVNHfEVTUF9TVEFUX1BDRCkpCi0JCWVzcF9jbWQoZXNwLCBFU1BfQ01EX01PSyk7Ci0JaWYgKChTQ3B0ci0+U0NwLnNlbnRfY29tbWFuZCA9PSBpbl9tc2dpbmRvbmUpICYmCi0JICAgIChTQ3B0ci0+U0NwLnBoYXNlID09IGluX2ZyZWVpbmcpKQotCQlyZXR1cm4gZXNwX2RvX2ZyZWVidXMoZXNwKTsKLQlyZXR1cm4gZG9faW50cl9lbmQ7Ci19Ci0KLXN0YXRpYyBpbnQgZXNwX2RvX2NtZGJlZ2luKHN0cnVjdCBlc3AgKmVzcCkKLXsKLQlzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3B0ciA9IGVzcC0+Y3VycmVudF9TQzsKLQotCWVzcF9hZHZhbmNlX3BoYXNlKFNDcHRyLCBpbl9jbWRlbmQpOwotCWlmIChlc3AtPmVyZXYgPT0gZmFzaG1lKSB7Ci0JCXUzMiB0bXAgPSBzYnVzX3JlYWRsKGVzcC0+ZHJlZ3MgKyBETUFfQ1NSKTsKLQkJaW50IGk7Ci0KLQkJZm9yIChpID0gMDsgaSA8IGVzcC0+ZXNwX3NjbWRsZWZ0OyBpKyspCi0JCQllc3AtPmVzcF9jb21tYW5kW2ldID0gKmVzcC0+ZXNwX3NjbWRwKys7Ci0JCWVzcC0+ZXNwX3NjbWRsZWZ0ID0gMDsKLQkJZXNwX2NtZChlc3AsIEVTUF9DTURfRkxVU0gpOwotCQllc3Bfc2V0Y291bnQoZXNwLT5lcmVncywgaSwgMSk7Ci0JCWVzcF9jbWQoZXNwLCAoRVNQX0NNRF9ETUEgfCBFU1BfQ01EX1RJKSk7Ci0JCXRtcCB8PSAoRE1BX1NDU0lfRElTQUIgfCBETUFfRU5BQkxFKTsKLQkJdG1wICY9IH4oRE1BX1NUX1dSSVRFKTsKLQkJc2J1c193cml0ZWwoaSwgZXNwLT5kcmVncyArIERNQV9DT1VOVCk7Ci0JCXNidXNfd3JpdGVsKGVzcC0+ZXNwX2NvbW1hbmRfZHZtYSwgZXNwLT5kcmVncyArIERNQV9BRERSKTsKLQkJc2J1c193cml0ZWwodG1wLCBlc3AtPmRyZWdzICsgRE1BX0NTUik7Ci0JfSBlbHNlIHsKLQkJdTggdG1wOwotCi0JCWVzcF9jbWQoZXNwLCBFU1BfQ01EX0ZMVVNIKTsKLQkJdG1wID0gKmVzcC0+ZXNwX3NjbWRwKys7Ci0JCWVzcC0+ZXNwX3NjbWRsZWZ0LS07Ci0JCXNidXNfd3JpdGViKHRtcCwgZXNwLT5lcmVncyArIEVTUF9GREFUQSk7Ci0JCWVzcF9jbWQoZXNwLCBFU1BfQ01EX1RJKTsKLQl9Ci0JcmV0dXJuIGRvX2ludHJfZW5kOwotfQotCi1zdGF0aWMgaW50IGVzcF9kb19jbWRkb25lKHN0cnVjdCBlc3AgKmVzcCkKLXsKLQlpZiAoZXNwLT5lcmV2ID09IGZhc2htZSkKLQkJZG1hX2ludmFsaWRhdGUoZXNwKTsKLQllbHNlCi0JCWVzcF9jbWQoZXNwLCBFU1BfQ01EX05VTEwpOwotCi0JaWYgKGVzcC0+aXJlZyAmIEVTUF9JTlRSX0JTRVJWKSB7Ci0JCWVzcF9hZHZhbmNlX3BoYXNlKGVzcC0+Y3VycmVudF9TQywgaW5fdGhlX2RhcmspOwotCQlyZXR1cm4gZXNwX2RvX3BoYXNlX2RldGVybWluZShlc3ApOwotCX0KLQotCUVTUExPRygoImVzcCVkOiBpbiBkb19jbWRkb25lKCkgYnV0IGRpZG4ndCBnZXQgQlNFUlYgaW50ZXJydXB0LlxuIiwKLQkJZXNwLT5lc3BfaWQpKTsKLQlyZXR1cm4gZG9fcmVzZXRfYnVzOwotfQotCi1zdGF0aWMgaW50IGVzcF9kb19tc2dvdXQoc3RydWN0IGVzcCAqZXNwKQotewotCWVzcF9jbWQoZXNwLCBFU1BfQ01EX0ZMVVNIKTsKLQlzd2l0Y2ggKGVzcC0+bXNnb3V0X2xlbikgewotCWNhc2UgMToKLQkJaWYgKGVzcC0+ZXJldiA9PSBmYXNobWUpCi0JCQlobWVfZmlmb19wdXNoKGVzcCwgJmVzcC0+Y3VyX21zZ291dFswXSwgMSk7Ci0JCWVsc2UKLQkJCXNidXNfd3JpdGViKGVzcC0+Y3VyX21zZ291dFswXSwgZXNwLT5lcmVncyArIEVTUF9GREFUQSk7Ci0KLQkJZXNwX2NtZChlc3AsIEVTUF9DTURfVEkpOwotCQlicmVhazsKLQotCWNhc2UgMjoKLQkJZXNwLT5lc3BfY29tbWFuZFswXSA9IGVzcC0+Y3VyX21zZ291dFswXTsKLQkJZXNwLT5lc3BfY29tbWFuZFsxXSA9IGVzcC0+Y3VyX21zZ291dFsxXTsKLQotCQlpZiAoZXNwLT5lcmV2ID09IGZhc2htZSkgewotCQkJaG1lX2ZpZm9fcHVzaChlc3AsICZlc3AtPmN1cl9tc2dvdXRbMF0sIDIpOwotCQkJZXNwX2NtZChlc3AsIEVTUF9DTURfVEkpOwotCQl9IGVsc2UgewotCQkJZG1hX3NldHVwKGVzcCwgZXNwLT5lc3BfY29tbWFuZF9kdm1hLCAyLCAwKTsKLQkJCWVzcF9zZXRjb3VudChlc3AtPmVyZWdzLCAyLCAwKTsKLQkJCWVzcF9jbWQoZXNwLCBFU1BfQ01EX0RNQSB8IEVTUF9DTURfVEkpOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSA0OgotCQllc3AtPmVzcF9jb21tYW5kWzBdID0gZXNwLT5jdXJfbXNnb3V0WzBdOwotCQllc3AtPmVzcF9jb21tYW5kWzFdID0gZXNwLT5jdXJfbXNnb3V0WzFdOwotCQllc3AtPmVzcF9jb21tYW5kWzJdID0gZXNwLT5jdXJfbXNnb3V0WzJdOwotCQllc3AtPmVzcF9jb21tYW5kWzNdID0gZXNwLT5jdXJfbXNnb3V0WzNdOwotCQllc3AtPnNuaXAgPSAxOwotCi0JCWlmIChlc3AtPmVyZXYgPT0gZmFzaG1lKSB7Ci0JCQlobWVfZmlmb19wdXNoKGVzcCwgJmVzcC0+Y3VyX21zZ291dFswXSwgNCk7Ci0JCQllc3BfY21kKGVzcCwgRVNQX0NNRF9USSk7Ci0JCX0gZWxzZSB7Ci0JCQlkbWFfc2V0dXAoZXNwLCBlc3AtPmVzcF9jb21tYW5kX2R2bWEsIDQsIDApOwotCQkJZXNwX3NldGNvdW50KGVzcC0+ZXJlZ3MsIDQsIDApOwotCQkJZXNwX2NtZChlc3AsIEVTUF9DTURfRE1BIHwgRVNQX0NNRF9USSk7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIDU6Ci0JCWVzcC0+ZXNwX2NvbW1hbmRbMF0gPSBlc3AtPmN1cl9tc2dvdXRbMF07Ci0JCWVzcC0+ZXNwX2NvbW1hbmRbMV0gPSBlc3AtPmN1cl9tc2dvdXRbMV07Ci0JCWVzcC0+ZXNwX2NvbW1hbmRbMl0gPSBlc3AtPmN1cl9tc2dvdXRbMl07Ci0JCWVzcC0+ZXNwX2NvbW1hbmRbM10gPSBlc3AtPmN1cl9tc2dvdXRbM107Ci0JCWVzcC0+ZXNwX2NvbW1hbmRbNF0gPSBlc3AtPmN1cl9tc2dvdXRbNF07Ci0JCWVzcC0+c25pcCA9IDE7Ci0KLQkJaWYgKGVzcC0+ZXJldiA9PSBmYXNobWUpIHsKLQkJCWhtZV9maWZvX3B1c2goZXNwLCAmZXNwLT5jdXJfbXNnb3V0WzBdLCA1KTsKLQkJCWVzcF9jbWQoZXNwLCBFU1BfQ01EX1RJKTsKLQkJfSBlbHNlIHsKLQkJCWRtYV9zZXR1cChlc3AsIGVzcC0+ZXNwX2NvbW1hbmRfZHZtYSwgNSwgMCk7Ci0JCQllc3Bfc2V0Y291bnQoZXNwLT5lcmVncywgNSwgMCk7Ci0JCQllc3BfY21kKGVzcCwgRVNQX0NNRF9ETUEgfCBFU1BfQ01EX1RJKTsKLQkJfQotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCS8qIHdob29wcyAqLwotCQlFU1BNSVNDKCgiYm9ndXMgbXNnb3V0IHNlbmRpbmcgTk9QXG4iKSk7Ci0JCWVzcC0+Y3VyX21zZ291dFswXSA9IE5PUDsKLQotCQlpZiAoZXNwLT5lcmV2ID09IGZhc2htZSkgewotCQkJaG1lX2ZpZm9fcHVzaChlc3AsICZlc3AtPmN1cl9tc2dvdXRbMF0sIDEpOwotCQl9IGVsc2UgewotCQkJc2J1c193cml0ZWIoZXNwLT5jdXJfbXNnb3V0WzBdLCBlc3AtPmVyZWdzICsgRVNQX0ZEQVRBKTsKLQkJfQotCi0JCWVzcC0+bXNnb3V0X2xlbiA9IDE7Ci0JCWVzcF9jbWQoZXNwLCBFU1BfQ01EX1RJKTsKLQkJYnJlYWs7Ci0JfTsKLQotCWVzcF9hZHZhbmNlX3BoYXNlKGVzcC0+Y3VycmVudF9TQywgaW5fbXNnb3V0ZG9uZSk7Ci0JcmV0dXJuIGRvX2ludHJfZW5kOwotfQotCi1zdGF0aWMgaW50IGVzcF9kb19tc2dvdXRkb25lKHN0cnVjdCBlc3AgKmVzcCkKLXsKLQlpZiAoZXNwLT5tc2dvdXRfbGVuID4gMSkgewotCQkvKiBYWFggSE1FL0ZBUyBBVE4gZGVhc3NlcnQgd29ya2Fyb3VuZCByZXF1aXJlZCwKLQkJICogWFhYIG5vIERNQSBmbHVzaGluZywgb25seSBwb3NzaWJsZSBFU1BfQ01EX0ZMVVNICi0JCSAqIFhYWCB0byBraWxsIHRoZSBmaWZvLgotCQkgKi8KLQkJaWYgKGVzcC0+ZXJldiAhPSBmYXNobWUpIHsKLQkJCXUzMiB0bXA7Ci0KLQkJCXdoaWxlICgodG1wID0gc2J1c19yZWFkbChlc3AtPmRyZWdzICsgRE1BX0NTUikpICYgRE1BX1BFTkRfUkVBRCkKLQkJCQl1ZGVsYXkoMSk7Ci0JCQl0bXAgJj0gfkRNQV9FTkFCTEU7Ci0JCQlzYnVzX3dyaXRlbCh0bXAsIGVzcC0+ZHJlZ3MgKyBETUFfQ1NSKTsKLQkJCWRtYV9pbnZhbGlkYXRlKGVzcCk7Ci0JCX0gZWxzZSB7Ci0JCQllc3BfY21kKGVzcCwgRVNQX0NNRF9GTFVTSCk7Ci0JCX0KLQl9Ci0JaWYgKCEoZXNwLT5pcmVnICYgRVNQX0lOVFJfREMpKSB7Ci0JCWlmIChlc3AtPmVyZXYgIT0gZmFzaG1lKQotCQkJZXNwX2NtZChlc3AsIEVTUF9DTURfTlVMTCk7Ci0JCXN3aXRjaCAoZXNwLT5zcmVnICYgRVNQX1NUQVRfUE1BU0spIHsKLQkJY2FzZSBFU1BfTU9QOgotCQkJLyogd2hvb3BzLCBwYXJpdHkgZXJyb3IgKi8KLQkJCUVTUExPRygoImVzcCVkOiBzdGlsbCBpbiBtc2dvdXQsIHBhcml0eSBlcnJvciBhc3N1bWVkXG4iLAotCQkJCWVzcC0+ZXNwX2lkKSk7Ci0JCQlpZiAoZXNwLT5tc2dvdXRfbGVuID4gMSkKLQkJCQllc3BfY21kKGVzcCwgRVNQX0NNRF9TQVROKTsKLQkJCWVzcF9hZHZhbmNlX3BoYXNlKGVzcC0+Y3VycmVudF9TQywgaW5fbXNnb3V0KTsKLQkJCXJldHVybiBkb193b3JrX2J1czsKLQotCQljYXNlIEVTUF9ESVA6Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJLyogSGFwcHkgTWVhbCBmaWZvIGlzIHRvdWNoeS4uLiAqLwotCQkJaWYgKChlc3AtPmVyZXYgIT0gZmFzaG1lKSAmJgotCQkJICAgICFmY291bnQoZXNwKSAmJgotCQkJICAgICEoKChzdHJ1Y3QgZXNwX2RldmljZSAqKWVzcC0+Y3VycmVudF9TQy0+ZGV2aWNlLT5ob3N0ZGF0YSktPnN5bmNfbWF4X29mZnNldCkpCi0JCQkJZXNwX2NtZChlc3AsIEVTUF9DTURfRkxVU0gpOwotCQkJYnJlYWs7Ci0KLQkJfTsKLQl9IGVsc2UgewotCQlFU1BMT0coKCJlc3AlZDogZGlzY29ubmVjdCwgcmVzZXR0aW5nIGJ1c1xuIiwgZXNwLT5lc3BfaWQpKTsKLQkJcmV0dXJuIGRvX3Jlc2V0X2J1czsKLQl9Ci0KLQkvKiBJZiB3ZSBzZW50IG91dCBhIHN5bmNocm9ub3VzIG5lZ290aWF0aW9uIG1lc3NhZ2UsIHVwZGF0ZQotCSAqIG91ciBzdGF0ZS4KLQkgKi8KLQlpZiAoZXNwLT5jdXJfbXNnb3V0WzJdID09IEVYVEVOREVEX01FU1NBR0UgJiYKLQkgICAgZXNwLT5jdXJfbXNnb3V0WzRdID09IEVYVEVOREVEX1NEVFIpIHsKLQkJZXNwLT5zbmlwID0gMTsgLyogYW5hbCByZXRlbnRpdmVuZXNzLi4uICovCi0JfQotCi0JZXNwLT5wcmV2bXNnb3V0ID0gZXNwLT5jdXJfbXNnb3V0WzBdOwotCWVzcC0+bXNnb3V0X2xlbiA9IDA7Ci0JZXNwX2FkdmFuY2VfcGhhc2UoZXNwLT5jdXJyZW50X1NDLCBpbl90aGVfZGFyayk7Ci0JcmV0dXJuIGVzcF9kb19waGFzZV9kZXRlcm1pbmUoZXNwKTsKLX0KLQotc3RhdGljIGludCBlc3BfYnVzX3VuZXhwZWN0ZWQoc3RydWN0IGVzcCAqZXNwKQotewotCUVTUExPRygoImVzcCVkOiBjb21tYW5kIGluIHdlaXJkIHN0YXRlICUyeFxuIiwKLQkJZXNwLT5lc3BfaWQsIGVzcC0+Y3VycmVudF9TQy0+U0NwLnBoYXNlKSk7Ci0JcmV0dXJuIGRvX3Jlc2V0X2J1czsKLX0KLQotc3RhdGljIGVzcGZ1bmNfdCBidXNfdmVjdG9yW10gPSB7Ci0JZXNwX2RvX2RhdGFfZmluYWxlLAotCWVzcF9kb19kYXRhX2ZpbmFsZSwKLQllc3BfYnVzX3VuZXhwZWN0ZWQsCi0JZXNwX2RvX21zZ2luLAotCWVzcF9kb19tc2dpbmNvbnQsCi0JZXNwX2RvX21zZ2luZG9uZSwKLQllc3BfZG9fbXNnb3V0LAotCWVzcF9kb19tc2dvdXRkb25lLAotCWVzcF9kb19jbWRiZWdpbiwKLQllc3BfZG9fY21kZG9uZSwKLQllc3BfZG9fc3RhdHVzLAotCWVzcF9kb19mcmVlYnVzLAotCWVzcF9kb19waGFzZV9kZXRlcm1pbmUsCi0JZXNwX2J1c191bmV4cGVjdGVkLAotCWVzcF9idXNfdW5leHBlY3RlZCwKLQllc3BfYnVzX3VuZXhwZWN0ZWQsCi19OwotCi0vKiBUaGlzIGlzIHRoZSBzZWNvbmQgdGllciBpbiBvdXIgZHVhbC1sZXZlbCBTQ1NJIHN0YXRlIG1hY2hpbmUuICovCi1zdGF0aWMgaW50IGVzcF93b3JrX2J1cyhzdHJ1Y3QgZXNwICplc3ApCi17Ci0Jc3RydWN0IHNjc2lfY21uZCAqU0NwdHIgPSBlc3AtPmN1cnJlbnRfU0M7Ci0JdW5zaWduZWQgaW50IHBoYXNlOwotCi0JRVNQQlVTKCgiZXNwX3dvcmtfYnVzOiAiKSk7Ci0JaWYgKCFTQ3B0cikgewotCQlFU1BCVVMoKCJyZWNvbm5lY3RcbiIpKTsKLQkJcmV0dXJuIGVzcF9kb19yZWNvbm5lY3QoZXNwKTsKLQl9Ci0JcGhhc2UgPSBTQ3B0ci0+U0NwLnBoYXNlOwotCWlmICgocGhhc2UgJiAweGYwKSA9PSBpbl9waGFzZXNfbWFzaykKLQkJcmV0dXJuIGJ1c192ZWN0b3JbKHBoYXNlICYgMHgwZildKGVzcCk7Ci0JZWxzZSBpZiAoKHBoYXNlICYgMHhmMCkgPT0gaW5fc2xjdF9tYXNrKQotCQlyZXR1cm4gZXNwX3NlbGVjdF9jb21wbGV0ZShlc3ApOwotCWVsc2UKLQkJcmV0dXJuIGVzcF9idXNfdW5leHBlY3RlZChlc3ApOwotfQotCi1zdGF0aWMgZXNwZnVuY190IGlzdmNfdmVjdG9yW10gPSB7Ci0JTlVMTCwKLQllc3BfZG9fcGhhc2VfZGV0ZXJtaW5lLAotCWVzcF9kb19yZXNldGJ1cywKLQllc3BfZmluaXNoX3Jlc2V0LAotCWVzcF93b3JrX2J1cwotfTsKLQotLyogTWFpbiBpbnRlcnJ1cHQgaGFuZGxlciBmb3IgYW4gZXNwIGFkYXB0ZXIuICovCi1zdGF0aWMgdm9pZCBlc3BfaGFuZGxlKHN0cnVjdCBlc3AgKmVzcCkKLXsKLQlzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3B0cjsKLQlpbnQgd2hhdF9uZXh0ID0gZG9faW50cl9lbmQ7Ci0KLQlTQ3B0ciA9IGVzcC0+Y3VycmVudF9TQzsKLQotCS8qIENoZWNrIGZvciBlcnJvcnMuICovCi0JZXNwLT5zcmVnID0gc2J1c19yZWFkYihlc3AtPmVyZWdzICsgRVNQX1NUQVRVUyk7Ci0JZXNwLT5zcmVnICY9ICh+RVNQX1NUQVRfSU5UUik7Ci0JaWYgKGVzcC0+ZXJldiA9PSBmYXNobWUpIHsKLQkJZXNwLT5zcmVnMiA9IHNidXNfcmVhZGIoZXNwLT5lcmVncyArIEVTUF9TVEFUVVMyKTsKLQkJZXNwLT5zZXFyZWcgPSAoc2J1c19yZWFkYihlc3AtPmVyZWdzICsgRVNQX1NTVEVQKSAmIEVTUF9TVEVQX1ZCSVRTKTsKLQl9Ci0KLQlpZiAoZXNwLT5zcmVnICYgKEVTUF9TVEFUX1NQQU0pKSB7Ci0JCS8qIEdyb3NzIGVycm9yLCBjb3VsZCBiZSBkdWUgdG8gb25lIG9mOgotCQkgKgotCQkgKiAtIHRvcCBvZiBmaWZvIG92ZXJ3cml0dGVuLCBjb3VsZCBiZSBiZWNhdXNlCi0JCSAqICAgd2UgdHJpZWQgdG8gZG8gYSBzeW5jaHJvbm91cyB0cmFuc2ZlciB3aXRoCi0JCSAqICAgYW4gb2Zmc2V0IGdyZWF0ZXIgdGhhbiBFU1AgZmlmbyBzaXplCi0JCSAqCi0JCSAqIC0gdG9wIG9mIGNvbW1hbmQgcmVnaXN0ZXIgb3ZlcndyaXR0ZW4KLQkJICoKLQkJICogLSBETUEgc2V0dXAgdG8gZ28gaW4gb25lIGRpcmVjdGlvbiwgU0NTSQotCQkgKiAgIGJ1cyBwb2ludHMgaW4gdGhlIG90aGVyLCB3aG9vcHMKLQkJICoKLQkJICogLSB3ZWlyZCBwaGFzZSBjaGFuZ2UgZHVyaW5nIGFzeW5jaHJvbm91cwotCQkgKiAgIGRhdGEgcGhhc2Ugd2hpbGUgd2UgYXJlIGluaXRpYXRvcgotCQkgKi8KLQkJRVNQTE9HKCgiZXNwJWQ6IEdyb3NzIGVycm9yIHNyZWc9JTJ4XG4iLCBlc3AtPmVzcF9pZCwgZXNwLT5zcmVnKSk7Ci0KLQkJLyogSWYgYSBjb21tYW5kIGlzIGxpdmUgb24gdGhlIGJ1cyB3ZSBjYW5ub3Qgc2FmZWx5Ci0JCSAqIHJlc2V0IHRoZSBidXMsIHNvIHdlJ2xsIGp1c3QgbGV0IHRoZSBwaWVjZXMgZmFsbAotCQkgKiB3aGVyZSB0aGV5IG1heS4gIEhlcmUgd2UgYXJlIGhvcGluZyB0aGF0IHRoZQotCQkgKiB0YXJnZXQgd2lsbCBiZSBhYmxlIHRvIGNsZWFubHkgZ28gYXdheSBzb29uCi0JCSAqIHNvIHdlIGNhbiBzYWZlbHkgcmVzZXQgdGhpbmdzLgotCQkgKi8KLQkJaWYgKCFTQ3B0cikgewotCQkJRVNQTE9HKCgiZXNwJWQ6IE5vIGN1cnJlbnQgY21kIGR1cmluZyBncm9zcyBlcnJvciwgIgotCQkJCSJyZXNldHRpbmcgYnVzXG4iLCBlc3AtPmVzcF9pZCkpOwotCQkJd2hhdF9uZXh0ID0gZG9fcmVzZXRfYnVzOwotCQkJZ290byBzdGF0ZV9tYWNoaW5lOwotCQl9Ci0JfQotCi0JaWYgKHNidXNfcmVhZGwoZXNwLT5kcmVncyArIERNQV9DU1IpICYgRE1BX0hORExfRVJST1IpIHsKLQkJLyogQSBETUEgZ2F0ZSBhcnJheSBlcnJvci4gIEhlcmUgd2UgbXVzdAotCQkgKiBiZSBzZWVpbmcgb25lIG9mIHR3byB0aGluZ3MuICBFaXRoZXIgdGhlCi0JCSAqIHZpcnR1YWwgdG8gcGh5c2ljYWwgYWRkcmVzcyB0cmFuc2xhdGlvbgotCQkgKiBvbiB0aGUgU0JVUyBjb3VsZCBub3Qgb2NjdXIsIGVsc2UgdGhlCi0JCSAqIHRyYW5zbGF0aW9uIGl0IGRpZCBnZXQgcG9pbnRlZCB0byBhIGJvZ3VzCi0JCSAqIHBhZ2UuICBIbyBodW0uLi4KLQkJICovCi0JCUVTUExPRygoImVzcCVkOiBETUEgZXJyb3IgJTA4eFxuIiwgZXNwLT5lc3BfaWQsCi0JCQlzYnVzX3JlYWRsKGVzcC0+ZHJlZ3MgKyBETUFfQ1NSKSkpOwotCi0JCS8qIERNQSBnYXRlIGFycmF5IGl0c2VsZiBtdXN0IGJlIHJlc2V0IHRvIGNsZWFyIHRoZQotCQkgKiBlcnJvciBjb25kaXRpb24uCi0JCSAqLwotCQllc3BfcmVzZXRfZG1hKGVzcCk7Ci0KLQkJd2hhdF9uZXh0ID0gZG9fcmVzZXRfYnVzOwotCQlnb3RvIHN0YXRlX21hY2hpbmU7Ci0JfQotCi0JZXNwLT5pcmVnID0gc2J1c19yZWFkYihlc3AtPmVyZWdzICsgRVNQX0lOVFJQVCk7ICAgLyogVW5sYXRjaCBpbnRyIHJlZyAqLwotCi0JaWYgKGVzcC0+ZXJldiA9PSBmYXNobWUpIHsKLQkJLyogVGhpcyBjaGlwIGlzIHJlYWxseSBsb3NpbmcuICovCi0JCUVTUEhNRSgoIkhNRVsiKSk7Ci0KLQkJRVNQSE1FKCgic3JlZzI9JTAyeCwiLCBlc3AtPnNyZWcyKSk7Ci0JCS8qIE11c3QgbGF0Y2ggZmlmbyBiZWZvcmUgcmVhZGluZyB0aGUgaW50ZXJydXB0Ci0JCSAqIHJlZ2lzdGVyIGVsc2UgZ2FyYmFnZSBlbmRzIHVwIGluIHRoZSBGSUZPCi0JCSAqIHdoaWNoIGNvbmZ1c2VzIHRoZSBkcml2ZXIgdXR0ZXJseS4KLQkJICovCi0JCWlmICghKGVzcC0+c3JlZzIgJiBFU1BfU1RBVDJfRkVNUFRZKSB8fAotCQkgICAgKGVzcC0+c3JlZzIgJiBFU1BfU1RBVDJfRjFCWVRFKSkgewotCQkJRVNQSE1FKCgiZmlmb193b3JrYXJvdW5kXSIpKTsKLQkJCWhtZV9maWZvX3JlYWQoZXNwKTsKLQkJfSBlbHNlIHsKLQkJCUVTUEhNRSgoIm5vX2ZpZm9fd29ya2Fyb3VuZF0iKSk7Ci0JCX0KLQl9Ci0KLQkvKiBObyBjdXJyZW50IGNtZCBpcyBvbmx5IHZhbGlkIGF0IHRoaXMgcG9pbnQgd2hlbiB0aGVyZSBhcmUKLQkgKiBjb21tYW5kcyBvZmYgdGhlIGJ1cyBvciB3ZSBhcmUgdHJ5aW5nIGEgcmVzZXQuCi0JICovCi0JaWYgKCFTQ3B0ciAmJiAhZXNwLT5kaXNjb25uZWN0ZWRfU0MgJiYgIShlc3AtPmlyZWcgJiBFU1BfSU5UUl9TUikpIHsKLQkJLyogUGFuaWMgaXMgc2FmZSwgc2luY2UgY3VycmVudF9TQyBpcyBudWxsLiAqLwotCQlFU1BMT0coKCJlc3AlZDogbm8gY29tbWFuZCBpbiBlc3BfaGFuZGxlKClcbiIsIGVzcC0+ZXNwX2lkKSk7Ci0JCXBhbmljKCJlc3BfaGFuZGxlOiBjdXJyZW50X1NDID09IHBlbmd1aW4gd2l0aGluIGludGVycnVwdCEiKTsKLQl9Ci0KLQlpZiAoZXNwLT5pcmVnICYgKEVTUF9JTlRSX0lDKSkgewotCQkvKiBJbGxlZ2FsIGNvbW1hbmQgZmVkIHRvIEVTUC4gIE91dHNpZGUgb2Ygb2J2aW91cwotCQkgKiBzb2Z0d2FyZSBidWdzIHRoYXQgY291bGQgY2F1c2UgdGhpcywgdGhlcmUgaXMKLQkJICogYSBjb25kaXRpb24gd2l0aCBlc3AxMDAgd2hlcmUgd2UgY2FuIGNvbmZ1c2UgdGhlCi0JCSAqIEVTUCBpbnRvIGFuIGVycm9uZW91cyBpbGxlZ2FsIGNvbW1hbmQgaW50ZXJydXB0Ci0JCSAqIGJlY2F1c2UgaXQgZG9lcyBub3Qgc2NyYXBlIHRoZSBGSUZPIHByb3Blcmx5Ci0JCSAqIGZvciByZXNlbGVjdGlvbi4gIFNlZSBlc3AxMDBfcmVjb25uZWN0X2h3YnVnKCkKLQkJICogdG8gc2VlIGhvdyB3ZSB0cnkgdmVyeSBoYXJkIHRvIGF2b2lkIHRoaXMuCi0JCSAqLwotCQlFU1BMT0coKCJlc3AlZDogaW52YWxpZCBjb21tYW5kXG4iLCBlc3AtPmVzcF9pZCkpOwotCi0JCWVzcF9kdW1wX3N0YXRlKGVzcCk7Ci0KLQkJaWYgKFNDcHRyICE9IE5VTEwpIHsKLQkJCS8qIERldmljZXMgd2l0aCB2ZXJ5IGJ1Z2d5IGZpcm13YXJlIGNhbiBkcm9wIEJTWQotCQkJICogZHVyaW5nIGEgc2NhdHRlciBsaXN0IGludGVycnVwdCB3aGVuIHVzaW5nIHN5bmMKLQkJCSAqIG1vZGUgdHJhbnNmZXJzLiAgV2UgY29udGludWUgdGhlIHRyYW5zZmVyIGFzCi0JCQkgKiBleHBlY3RlZCwgdGhlIHRhcmdldCBkcm9wcyB0aGUgYnVzLCB0aGUgRVNQCi0JCQkgKiBnZXRzIGNvbmZ1c2VkLCBhbmQgd2UgZ2V0IGEgaWxsZWdhbCBjb21tYW5kCi0JCQkgKiBpbnRlcnJ1cHQgYmVjYXVzZSB0aGUgYnVzIGlzIGluIHRoZSBkaXNjb25uZWN0ZWQKLQkJCSAqIHN0YXRlIG5vdyBhbmQgRVNQX0NNRF9USSBpcyBvbmx5IGFsbG93ZWQgd2hlbgotCQkJICogYSBuZXh1cyBpcyBhbGl2ZSBvbiB0aGUgYnVzLgotCQkJICovCi0JCQlFU1BMT0coKCJlc3AlZDogRm9yY2luZyBhc3luYyBhbmQgZGlzYWJsaW5nIGRpc2Nvbm5lY3QgZm9yICIKLQkJCQkidGFyZ2V0ICVkXG4iLCBlc3AtPmVzcF9pZCwgU0NwdHItPmRldmljZS0+aWQpKTsKLQkJCVNDcHRyLT5kZXZpY2UtPmJvcmtlbiA9IDE7IC8qIGZvbyBvbiB5b3UgKi8KLQkJfQotCi0JCXdoYXRfbmV4dCA9IGRvX3Jlc2V0X2J1czsKLQl9IGVsc2UgaWYgKCEoZXNwLT5pcmVnICYgfihFU1BfSU5UUl9GRE9ORSB8IEVTUF9JTlRSX0JTRVJWIHwgRVNQX0lOVFJfREMpKSkgewotCQlpZiAoU0NwdHIpIHsKLQkJCXVuc2lnbmVkIGludCBwaGFzZSA9IFNDcHRyLT5TQ3AucGhhc2U7Ci0KLQkJCWlmIChwaGFzZSAmIGluX3BoYXNlc19tYXNrKSB7Ci0JCQkJd2hhdF9uZXh0ID0gZXNwX3dvcmtfYnVzKGVzcCk7Ci0JCQl9IGVsc2UgaWYgKHBoYXNlICYgaW5fc2xjdF9tYXNrKSB7Ci0JCQkJd2hhdF9uZXh0ID0gZXNwX3NlbGVjdF9jb21wbGV0ZShlc3ApOwotCQkJfSBlbHNlIHsKLQkJCQlFU1BMT0coKCJlc3AlZDogaW50ZXJydXB0IGZvciBubyBnb29kIHJlYXNvbi4uLlxuIiwKLQkJCQkJZXNwLT5lc3BfaWQpKTsKLQkJCQl3aGF0X25leHQgPSBkb19pbnRyX2VuZDsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCUVTUExPRygoImVzcCVkOiBCU0VSViBvciBGRE9ORSBvciBEQyB3aGlsZSBTQ3B0cj09TlVMTFxuIiwKLQkJCQllc3AtPmVzcF9pZCkpOwotCQkJd2hhdF9uZXh0ID0gZG9fcmVzZXRfYnVzOwotCQl9Ci0JfSBlbHNlIGlmIChlc3AtPmlyZWcgJiBFU1BfSU5UUl9TUikgewotCQlFU1BMT0coKCJlc3AlZDogU0NTSSBidXMgcmVzZXQgaW50ZXJydXB0XG4iLCBlc3AtPmVzcF9pZCkpOwotCQl3aGF0X25leHQgPSBkb19yZXNldF9jb21wbGV0ZTsKLQl9IGVsc2UgaWYgKGVzcC0+aXJlZyAmIChFU1BfSU5UUl9TIHwgRVNQX0lOVFJfU0FUTikpIHsKLQkJRVNQTE9HKCgiZXNwJWQ6IEFJRUVFIHdlIGhhdmUgYmVlbiBzZWxlY3RlZCBieSBhbm90aGVyIGluaXRpYXRvciFcbiIsCi0JCQllc3AtPmVzcF9pZCkpOwotCQl3aGF0X25leHQgPSBkb19yZXNldF9idXM7Ci0JfSBlbHNlIGlmIChlc3AtPmlyZWcgJiBFU1BfSU5UUl9SU0VMKSB7Ci0JCWlmIChTQ3B0ciA9PSBOVUxMKSB7Ci0JCQkvKiBUaGlzIGlzIG9rLiAqLwotCQkJd2hhdF9uZXh0ID0gZXNwX2RvX3JlY29ubmVjdChlc3ApOwotCQl9IGVsc2UgaWYgKFNDcHRyLT5TQ3AucGhhc2UgJiBpbl9zbGN0X21hc2spIHsKLQkJCS8qIE9ubHkgc2VsZWN0aW9uIGNvZGUga25vd3MgaG93IHRvIGNsZWFuCi0JCQkgKiB1cCBwcm9wZXJseS4KLQkJCSAqLwotCQkJRVNQRElTQygoIlJlc2VsZWN0ZWQgZHVyaW5nIHNlbGVjdGlvbiBhdHRlbXB0XG4iKSk7Ci0JCQl3aGF0X25leHQgPSBlc3Bfc2VsZWN0X2NvbXBsZXRlKGVzcCk7Ci0JCX0gZWxzZSB7Ci0JCQlFU1BMT0coKCJlc3AlZDogUmVzZWxlY3RlZCB3aGlsZSBidXMgaXMgYnVzeVxuIiwKLQkJCQllc3AtPmVzcF9pZCkpOwotCQkJd2hhdF9uZXh0ID0gZG9fcmVzZXRfYnVzOwotCQl9Ci0JfQotCi0JLyogVGhpcyBpcyB0aWVyLW9uZSBpbiBvdXIgZHVhbCBsZXZlbCBTQ1NJIHN0YXRlIG1hY2hpbmUuICovCi1zdGF0ZV9tYWNoaW5lOgotCXdoaWxlICh3aGF0X25leHQgIT0gZG9faW50cl9lbmQpIHsKLQkJaWYgKHdoYXRfbmV4dCA+PSBkb19waGFzZV9kZXRlcm1pbmUgJiYKLQkJICAgIHdoYXRfbmV4dCA8IGRvX2ludHJfZW5kKSB7Ci0JCQl3aGF0X25leHQgPSBpc3ZjX3ZlY3Rvclt3aGF0X25leHRdKGVzcCk7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBzdGF0ZSBpcyBjb21wbGV0ZWx5IGxvc3QgOy0oICovCi0JCQlFU1BMT0coKCJlc3AlZDogaW50ZXJydXB0IGVuZ2luZSBsb3NlcyBzdGF0ZSwgcmVzZXR0aW5nIGJ1c1xuIiwKLQkJCQllc3AtPmVzcF9pZCkpOwotCQkJd2hhdF9uZXh0ID0gZG9fcmVzZXRfYnVzOwotCQl9Ci0JfQotfQotCi0vKiBTZXJ2aWNlIG9ubHkgdGhlIEVTUCBkZXNjcmliZWQgYnkgZGV2X2lkLiAqLwotc3RhdGljIGlycXJldHVybl90IGVzcF9pbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKLXsKLQlzdHJ1Y3QgZXNwICplc3AgPSBkZXZfaWQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKGVzcC0+ZWhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOwotCWlmIChFU1BfSVJRX1AoZXNwLT5kcmVncykpIHsKLQkJRVNQX0lOVFNPRkYoZXNwLT5kcmVncyk7Ci0KLQkJRVNQSVJRKCgiSVslZDolZF0oIiwgc21wX3Byb2Nlc3Nvcl9pZCgpLCBlc3AtPmVzcF9pZCkpOwotCQllc3BfaGFuZGxlKGVzcCk7Ci0JCUVTUElSUSgoIikiKSk7Ci0KLQkJRVNQX0lOVFNPTihlc3AtPmRyZWdzKTsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShlc3AtPmVob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKLQotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotc3RhdGljIGludCBlc3Bfc2xhdmVfYWxsb2Moc3RydWN0IHNjc2lfZGV2aWNlICpTRHB0cikKLXsKLQlzdHJ1Y3QgZXNwX2RldmljZSAqZXNwX2RldiA9Ci0JCWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBlc3BfZGV2aWNlKSwgR0ZQX0FUT01JQyk7Ci0KLQlpZiAoIWVzcF9kZXYpCi0JCXJldHVybiAtRU5PTUVNOwotCW1lbXNldChlc3BfZGV2LCAwLCBzaXplb2Yoc3RydWN0IGVzcF9kZXZpY2UpKTsKLQlTRHB0ci0+aG9zdGRhdGEgPSBlc3BfZGV2OwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBlc3Bfc2xhdmVfZGVzdHJveShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKlNEcHRyKQotewotCXN0cnVjdCBlc3AgKmVzcCA9IChzdHJ1Y3QgZXNwICopIFNEcHRyLT5ob3N0LT5ob3N0ZGF0YTsKLQotCWVzcC0+dGFyZ2V0c19wcmVzZW50ICY9IH4oMSA8PCBTRHB0ci0+aWQpOwotCWtmcmVlKFNEcHRyLT5ob3N0ZGF0YSk7Ci0JU0RwdHItPmhvc3RkYXRhID0gTlVMTDsKLX0KLQotc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgZXNwX3RlbXBsYXRlID0gewotCS5tb2R1bGUJCQk9IFRISVNfTU9EVUxFLAotCS5uYW1lCQkJPSAiZXNwIiwKLQkuaW5mbwkJCT0gZXNwX2luZm8sCi0JLnNsYXZlX2FsbG9jCQk9IGVzcF9zbGF2ZV9hbGxvYywKLQkuc2xhdmVfZGVzdHJveQkJPSBlc3Bfc2xhdmVfZGVzdHJveSwKLQkucXVldWVjb21tYW5kCQk9IGVzcF9xdWV1ZSwKLQkuZWhfYWJvcnRfaGFuZGxlcgk9IGVzcF9hYm9ydCwKLQkuZWhfYnVzX3Jlc2V0X2hhbmRsZXIJPSBlc3BfcmVzZXQsCi0JLmNhbl9xdWV1ZQkJPSA3LAotCS50aGlzX2lkCQk9IDcsCi0JLnNnX3RhYmxlc2l6ZQkJPSBTR19BTEwsCi0JLmNtZF9wZXJfbHVuCQk9IDEsCi0JLnVzZV9jbHVzdGVyaW5nCQk9IEVOQUJMRV9DTFVTVEVSSU5HLAotCS5wcm9jX25hbWUJCT0gImVzcCIsCi0JLnByb2NfaW5mbwkJPSBlc3BfcHJvY19pbmZvLAotfTsKLQotI2lmbmRlZiBDT05GSUdfU1VONAotc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgZXNwX21hdGNoW10gPSB7Ci0JewotCQkubmFtZSA9ICJTVU5XLGVzcCIsCi0JCS5kYXRhID0gJmVzcF90ZW1wbGF0ZSwKLQl9LAotCXsKLQkJLm5hbWUgPSAiU1VOVyxmYXMiLAotCQkuZGF0YSA9ICZlc3BfdGVtcGxhdGUsCi0JfSwKLQl7Ci0JCS5uYW1lID0gImVzcCIsCi0JCS5kYXRhID0gJmVzcF90ZW1wbGF0ZSwKLQl9LAotCXt9LAotfTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGVzcF9tYXRjaCk7Ci0KLXN0YXRpYyBzdHJ1Y3Qgb2ZfcGxhdGZvcm1fZHJpdmVyIGVzcF9zYnVzX2RyaXZlciA9IHsKLQkubmFtZQkJPSAiZXNwIiwKLQkubWF0Y2hfdGFibGUJPSBlc3BfbWF0Y2gsCi0JLnByb2JlCQk9IGVzcF9zYnVzX3Byb2JlLAotCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoZXNwX3NidXNfcmVtb3ZlKSwKLX07Ci0jZW5kaWYKLQotc3RhdGljIGludCBfX2luaXQgZXNwX2luaXQodm9pZCkKLXsKLSNpZmRlZiBDT05GSUdfU1VONAotCXJldHVybiBlc3Bfc3VuNF9wcm9iZSgmZXNwX3RlbXBsYXRlKTsKLSNlbHNlCi0JcmV0dXJuIG9mX3JlZ2lzdGVyX2RyaXZlcigmZXNwX3NidXNfZHJpdmVyLCAmc2J1c19idXNfdHlwZSk7Ci0jZW5kaWYKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGVzcF9leGl0KHZvaWQpCi17Ci0jaWZkZWYgQ09ORklHX1NVTjQKLQllc3Bfc3VuNF9yZW1vdmUoKTsKLSNlbHNlCi0Jb2ZfdW5yZWdpc3Rlcl9kcml2ZXIoJmVzcF9zYnVzX2RyaXZlcik7Ci0jZW5kaWYKLX0KLQotTU9EVUxFX0RFU0NSSVBUSU9OKCJFU1AgU3VuIFNDU0kgZHJpdmVyIik7Ci1NT0RVTEVfQVVUSE9SKCJEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQGRhdmVtbG9mdC5uZXQpIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfVkVSU0lPTihEUlZfVkVSU0lPTik7Ci0KLW1vZHVsZV9pbml0KGVzcF9pbml0KTsKLW1vZHVsZV9leGl0KGVzcF9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9lc3AuaCBiL2RyaXZlcnMvc2NzaS9lc3AuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk4Y2RhOS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3Njc2kvZXNwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MDYgKzAsMCBAQAotLyogJElkOiBlc3AuaCx2IDEuMjkgMjAwMS8xMi8xMSAwNDo1NTo0NyBkYXZlbSBFeHAgJAotICogZXNwLmg6ICBEZWZpbmVzIGFuZCBzdHJ1Y3R1cmVzIGZvciB0aGUgU3BhcmMgRVNQIChFbmhhbmNlZCBTQ1NJCi0gKiAgICAgICAgIFByb2Nlc3NvcikgZHJpdmVyIHVuZGVyIExpbnV4LgotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NSBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQGNhaXAucnV0Z2Vycy5lZHUpCi0gKi8KLQotI2lmbmRlZiBfU1BBUkNfRVNQX0gKLSNkZWZpbmUgX1NQQVJDX0VTUF9ICi0KLS8qIEZvciBkdm1hIGNvbnRyb2xsZXIgcmVnaXN0ZXIgZGVmaW5pdGlvbnMuICovCi0jaW5jbHVkZSA8YXNtL2RtYS5oPgotCi0vKiBUaGUgRVNQIFNDU0kgY29udHJvbGxlcnMgaGF2ZSB0aGVpciByZWdpc3RlciBzZXRzIGluIHRocmVlCi0gKiAiY2xhc3NlcyI6Ci0gKgotICogMSkgUmVnaXN0ZXJzIHdoaWNoIGFyZSBib3RoIHJlYWQgYW5kIHdyaXRlLgotICogMikgUmVnaXN0ZXJzIHdoaWNoIGFyZSByZWFkIG9ubHkuCi0gKiAzKSBSZWdpc3RlcnMgd2hpY2ggYXJlIHdyaXRlIG9ubHkuCi0gKgotICogWWV0LCB0aGV5IGFsbCBsaXZlIHdpdGhpbiB0aGUgc2FtZSBJTyBzcGFjZS4KLSAqLwotCi0vKiBBbGwgdGhlIEVTUCByZWdpc3RlcnMgYXJlIG9uZSBieXRlIGVhY2ggYW5kIGFyZSBhY2Nlc3NlZCBsb25nd29yZHMKLSAqIGFwYXJ0IHdpdGggYSBiaWctZW5kaWFuIG9yZGVyaW5nIHRvIHRoZSBieXRlcy4KLSAqLwotCQkJCQkvKiBBY2Nlc3MgICAgRGVzY3JpcHRpb24gICAgICAgICAgICAgIE9mZnNldCAqLwotI2RlZmluZSBFU1BfVENMT1cJMHgwMFVMCQkvKiBydyAgTG93IGJpdHMgb2YgdGhlIHRyYW5zZmVyIGNvdW50IDB4MDAgICAqLwotI2RlZmluZSBFU1BfVENNRUQJMHgwNFVMCQkvKiBydyAgTWlkIGJpdHMgb2YgdGhlIHRyYW5zZmVyIGNvdW50IDB4MDQgICAqLwotI2RlZmluZSBFU1BfRkRBVEEJMHgwOFVMCQkvKiBydyAgRklGTyBkYXRhIGJpdHMgICAgICAgICAgICAgICAgIDB4MDggICAqLwotI2RlZmluZSBFU1BfQ01ECQkweDBjVUwJCS8qIHJ3ICBTQ1NJIGNvbW1hbmQgYml0cyAgICAgICAgICAgICAgMHgwYyAgICovCi0jZGVmaW5lIEVTUF9TVEFUVVMJMHgxMFVMCQkvKiBybyAgRVNQIHN0YXR1cyByZWdpc3RlciAgICAgICAgICAgIDB4MTAgICAqLwotI2RlZmluZSBFU1BfQlVTSUQJRVNQX1NUQVRVUwkvKiB3byAgQnVzIElEIGZvciBzZWxlY3QvcmVzZWxlY3QgICAgIDB4MTAgICAqLwotI2RlZmluZSBFU1BfSU5UUlBUCTB4MTRVTAkJLyogcm8gIEtpbmQgb2YgaW50ZXJydXB0ICAgICAgICAgICAgICAweDE0ICAgKi8KLSNkZWZpbmUgRVNQX1RJTUVPCUVTUF9JTlRSUFQJLyogd28gIFRpbWVvdXQgdmFsdWUgZm9yIHNlbGVjdC9yZXNlbCAweDE0ICAgKi8KLSNkZWZpbmUgRVNQX1NTVEVQCTB4MThVTAkJLyogcm8gIFNlcXVlbmNlIHN0ZXAgcmVnaXN0ZXIgICAgICAgICAweDE4ICAgKi8KLSNkZWZpbmUgRVNQX1NUUAkJRVNQX1NTVEVQCS8qIHdvICBUcmFuc2ZlciBwZXJpb2QgcGVyIHN5bmMgICAgICAgMHgxOCAgICovCi0jZGVmaW5lIEVTUF9GRkxBR1MJMHgxY1VMCQkvKiBybyAgQml0cyBvZiBjdXJyZW50IEZJRk8gaW5mbyAgICAgIDB4MWMgICAqLwotI2RlZmluZSBFU1BfU09GRglFU1BfRkZMQUdTCS8qIHdvICBTeW5jIG9mZnNldCAgICAgICAgICAgICAgICAgICAgMHgxYyAgICovCi0jZGVmaW5lIEVTUF9DRkcxCTB4MjBVTAkJLyogcncgIEZpcnN0IGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgICAweDIwICAgKi8KLSNkZWZpbmUgRVNQX0NGQUNUCTB4MjRVTAkJLyogd28gIENsb2NrIGNvbnZlcnNpb24gZmFjdG9yICAgICAgICAweDI0ICAgKi8KLSNkZWZpbmUgRVNQX1NUQVRVUzIJRVNQX0NGQUNUCS8qIHJvICBITUUgc3RhdHVzMiByZWdpc3RlciAgICAgICAgICAgMHgyNCAgICovCi0jZGVmaW5lIEVTUF9DVEVTVAkweDI4VUwJCS8qIHdvICBDaGlwIHRlc3QgcmVnaXN0ZXIgICAgICAgICAgICAgMHgyOCAgICovCi0jZGVmaW5lIEVTUF9DRkcyCTB4MmNVTAkJLyogcncgIFNlY29uZCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICAweDJjICAgKi8KLSNkZWZpbmUgRVNQX0NGRzMJMHgzMFVMCQkvKiBydyAgVGhpcmQgY29uZmlndXJhdGlvbiByZWdpc3RlciAgIDB4MzAgICAqLwotI2RlZmluZSBFU1BfVENISQkweDM4VUwJCS8qIHJ3ICBIaWdoIGJpdHMgb2YgdHJhbnNmZXIgY291bnQgICAgMHgzOCAgICovCi0jZGVmaW5lIEVTUF9VSUQJCUVTUF9UQ0hJCS8qIHJvICBVbmlxdWUgSUQgY29kZSAgICAgICAgICAgICAgICAgMHgzOCAgICovCi0jZGVmaW5lIEZBU19STE8JCUVTUF9UQ0hJCS8qIHJ3ICBITUUgZXh0ZW5kZWQgY291bnRlciAgICAgICAgICAgMHgzOCAgICovCi0jZGVmaW5lIEVTUF9GR1JORAkweDNjVUwJCS8qIHJ3ICBEYXRhIGJhc2UgZm9yIGZpZm8gICAgICAgICAgICAgMHgzYyAgICovCi0jZGVmaW5lIEZBU19SSEkJCUVTUF9GR1JORAkvKiBydyAgSE1FIGV4dGVuZGVkIGNvdW50ZXIgICAgICAgICAgIDB4M2MgICAqLwotI2RlZmluZSBFU1BfUkVHX1NJWkUJMHg0MFVMCi0KLS8qIFZhcmlvdXMgcmV2aXNpb25zIG9mIHRoZSBFU1AgYm9hcmQuICovCi1lbnVtIGVzcF9yZXYgewotCWVzcDEwMCAgICAgPSAweDAwLCAgLyogTkNSNTNDOTAgLSB2ZXJ5IGJyb2tlbiAqLwotCWVzcDEwMGEgICAgPSAweDAxLCAgLyogTkNSNTNDOTBBICovCi0JZXNwMjM2ICAgICA9IDB4MDIsCi0JZmFzMjM2ICAgICA9IDB4MDMsCi0JZmFzMTAwYSAgICA9IDB4MDQsCi0JZmFzdCAgICAgICA9IDB4MDUsCi0JZmFzaG1lICAgICA9IDB4MDYsCi0JZXNwdW5rbm93biA9IDB4MDcKLX07Ci0KLS8qIFdlIGFsbG9jYXRlIG9uZSBvZiB0aGVzZSBmb3IgZWFjaCBzY3NpIGRldmljZSBhbmQgYXR0YWNoIGl0IHRvCi0gKiBTRHB0ci0+aG9zdGRhdGEgZm9yIHVzZSBpbiB0aGUgZHJpdmVyCi0gKi8KLXN0cnVjdCBlc3BfZGV2aWNlIHsKLSAgdW5zaWduZWQgY2hhciBzeW5jX21pbl9wZXJpb2Q7Ci0gIHVuc2lnbmVkIGNoYXIgc3luY19tYXhfb2Zmc2V0OwotICB1bnNpZ25lZCBzeW5jOjE7Ci0gIHVuc2lnbmVkIHdpZGU6MTsKLSAgdW5zaWduZWQgZGlzY29ubmVjdDoxOwotfTsKLQotc3RydWN0IHNjc2lfY21uZDsKLQotLyogV2UgZ2V0IG9uZSBvZiB0aGVzZSBmb3IgZWFjaCBFU1AgcHJvYmVkLiAqLwotc3RydWN0IGVzcCB7Ci0Jdm9pZCBfX2lvbWVtCQkqZXJlZ3M7CQkvKiBFU1AgY29udHJvbGxlciByZWdpc3RlcnMgKi8KLQl2b2lkIF9faW9tZW0JCSpkcmVnczsJCS8qIERNQSBjb250cm9sbGVyIHJlZ2lzdGVycyAqLwotCXN0cnVjdCBzYnVzX2RtYQkJKmRtYTsJCS8qIERNQSBjb250cm9sbGVyIHN3IHN0YXRlICovCi0Jc3RydWN0IFNjc2lfSG9zdAkqZWhvc3Q7CQkvKiBCYWNrcG9pbnRlciB0byBTQ1NJIEhvc3QgKi8KLQlzdHJ1Y3Qgc2J1c19kZXYJCSpzZGV2OwkJLyogUG9pbnRlciB0byBTQnVzIGVudHJ5ICovCi0KLQkvKiBFU1AgQ29uZmlndXJhdGlvbiBSZWdpc3RlcnMgKi8KLQl1OAkJCWNvbmZpZzE7CS8qIENvcHkgb2YgdGhlIDFzdCBjb25maWcgcmVnaXN0ZXIgKi8KLQl1OAkJCWNvbmZpZzI7CS8qIENvcHkgb2YgdGhlIDJuZCBjb25maWcgcmVnaXN0ZXIgKi8KLQl1OAkJCWNvbmZpZzNbMTZdOwkvKiBDb3B5IG9mIHRoZSAzcmQgY29uZmlnIHJlZ2lzdGVyICovCi0KLQkvKiBUaGUgY3VycmVudCBjb21tYW5kIHdlIGFyZSBzZW5kaW5nIHRvIHRoZSBFU1AgY2hpcC4gIFRoaXMgZXNwX2NvbW1hbmQKLQkgKiBwdHIgbmVlZHMgdG8gYmUgbWFwcGVkIGluIERWTUEgYXJlYSBzbyB3ZSBjYW4gc2VuZCBjb21tYW5kcyBhbmQgcmVhZAotCSAqIGZyb20gdGhlIEVTUCBmaWZvIHdpdGhvdXQgYnVybmluZyBwcmVjaW91cyBDUFUgY3ljbGVzLiAgUHJvZ3JhbW1lZCBJL08KLQkgKiBzdWNrcyB3aGVuIHdlIGhhdmUgdGhlIERWTUEgdG8gZG8gaXQgZm9yIHVzLiAgVGhlIEVTUCBpcyBzdHVwaWQgYW5kIHdpbGwKLQkgKiBvbmx5IHNlbmQgb3V0IDYsIDEwLCBhbmQgMTIgYnl0ZSBTQ1NJIGNvbW1hbmRzLCBvdGhlcnMgd2UgbmVlZCB0byBzZW5kCi0JICogb25lIGJ5dGUgYXQgYSB0aW1lLiAgZXNwX3Nsb3djbWQgYmVpbmcgc2V0IHNheXMgdGhhdCB3ZSBhcmUgZG9pbmcgb25lCi0JICogb2YgdGhlIGNvbW1hbmQgdHlwZXMgRVNQIGRvZXNuJ3QgdW5kZXJzdGFuZCwgZXNwX3NjbWRwIGtlZXBzIHRyYWNrIG9mCi0JICogd2hpY2ggYnl0ZSB3ZSBhcmUgc2VuZGluZywgZXNwX3NjbWRsZWZ0IHNheXMgaG93IG1hbnkgYnl0ZXMgdG8gZ28uCi0JICovCi0Jdm9sYXRpbGUgdTgJCSplc3BfY29tbWFuZDsgICAgLyogTG9jYXRpb24gb2YgY29tbWFuZCAoQ1BVIHZpZXcpICAqLwotCV9fdTMyCQkJZXNwX2NvbW1hbmRfZHZtYTsvKiBMb2NhdGlvbiBvZiBjb21tYW5kIChEVk1BIHZpZXcpICovCi0JdW5zaWduZWQgY2hhcgkJZXNwX2NsZW47CSAvKiBMZW5ndGggb2YgdGhpcyBjb21tYW5kICovCi0JdW5zaWduZWQgY2hhcgkJZXNwX3Nsb3djbWQ7Ci0JdW5zaWduZWQgY2hhcgkJKmVzcF9zY21kcDsKLQl1bnNpZ25lZCBjaGFyCQllc3Bfc2NtZGxlZnQ7Ci0KLQkvKiBUaGUgZm9sbG93aW5nIGFyZSB1c2VkIHRvIGRldGVybWluZSB0aGUgY2F1c2Ugb2YgYW4gSVJRLiBVcG9uIGV2ZXJ5Ci0JICogSVJRIGVudHJ5IHdlIHN5bmNocm9uaXplIHRoZXNlIHdpdGggdGhlIGhhcmR3YXJlIHJlZ2lzdGVycy4KLQkgKi8KLQl1OAkJCWlyZWc7CQkvKiBDb3B5IG9mIEVTUCBpbnRlcnJ1cHQgcmVnaXN0ZXIgKi8KLQl1OAkJCXNyZWc7CQkvKiBDb3B5IG9mIEVTUCBzdGF0dXMgcmVnaXN0ZXIgKi8KLQl1OAkJCXNlcXJlZzsJCS8qIENvcHkgb2YgRVNQIHNlcXVlbmNlIHN0ZXAgcmVnaXN0ZXIgKi8KLQl1OAkJCXNyZWcyOwkJLyogQ29weSBvZiBITUUgc3RhdHVzMiByZWdpc3RlciAqLwotCi0JLyogVG8gc2F2ZSByZWdpc3RlciB3cml0ZXMgdG8gdGhlIEVTUCwgd2hpY2ggY2FuIGJlIGV4cGVuc2l2ZSwgd2UKLQkgKiBrZWVwIHRyYWNrIG9mIHRoZSBwcmV2aW91cyB2YWx1ZSB0aGF0IHZhcmlvdXMgcmVnaXN0ZXJzIGhhZCBmb3IKLQkgKiB0aGUgbGFzdCB0YXJnZXQgd2UgY29ubmVjdGVkIHRvLiAgSWYgdGhleSBhcmUgdGhlIHNhbWUgZm9yIHRoZQotCSAqIGN1cnJlbnQgdGFyZ2V0LCB3ZSBza2lwIHRoZSByZWdpc3RlciB3cml0ZXMgYXMgdGhleSBhcmUgbm90IG5lZWRlZC4KLQkgKi8KLQl1OAkJCXByZXZfc29mZiwgcHJldl9zdHA7Ci0JdTgJCQlwcmV2X2NmZzMsIF9fY2FjaGVfcGFkOwotCi0JLyogV2UgYWxzbyBrZWVwIGEgY2FjaGUgb2YgdGhlIHByZXZpb3VzIEZBUy9ITUUgRE1BIENTUiByZWdpc3RlciB2YWx1ZS4gICovCi0JdTMyCQkJcHJldl9obWVfZG1hY3NyOwotCi0JLyogVGhlIEhNRSBpcyB0aGUgYmlnZ2VzdCBwaWVjZSBvZiBzaGl0IEkgaGF2ZSBldmVyIHNlZW4uICovCi0JdTgJCQlobWVfZmlmb193b3JrYXJvdW5kX2J1ZmZlclsxNiAqIDJdOwotCXU4CQkJaG1lX2ZpZm9fd29ya2Fyb3VuZF9jb3VudDsKLQotCS8qIEZvciBlYWNoIHRhcmdldCB3ZSBrZWVwIHRyYWNrIG9mIHNhdmUvcmVzdG9yZSBkYXRhCi0JICogcG9pbnRlciBpbmZvcm1hdGlvbi4gIFRoaXMgbmVlZHMgdG8gYmUgdXBkYXRlZCBtYWpvcmx5Ci0JICogd2hlbiB3ZSBhZGQgc3VwcG9ydCBmb3IgdGFnZ2VkIHF1ZXVlaW5nLiAgLURhdmVNCi0JICovCi0Jc3RydWN0IGVzcF9wb2ludGVycyB7Ci0JCWNoYXIJCQkqc2F2ZWRfcHRyOwotCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QJKnNhdmVkX2J1ZmZlcjsKLQkJaW50CQkJc2F2ZWRfdGhpc19yZXNpZHVhbDsKLQkJaW50CQkJc2F2ZWRfYnVmZmVyc19yZXNpZHVhbDsKLQl9IGRhdGFfcG9pbnRlcnNbMTZdIC8qWFhYIFtNQVhfVEFHU19QRVJfVEFSR0VUXSovOwotCi0JLyogQ2xvY2sgcGVyaW9kcywgZnJlcXVlbmNpZXMsIHN5bmNocm9uaXphdGlvbiwgZXRjLiAqLwotCXVuc2lnbmVkIGludAkJY2ZyZXE7CQkvKiBDbG9jayBmcmVxdWVuY3kgaW4gSFogKi8KLQl1bnNpZ25lZCBpbnQJCWNmYWN0OwkJLyogQ2xvY2sgY29udmVyc2lvbiBmYWN0b3IgKi8KLQl1bnNpZ25lZCBpbnQJCXJhd19jZmFjdDsJLyogUmF3IGNvcHkgZnJvbSBwcm9iaW5nICovCi0JdW5zaWduZWQgaW50CQljY3ljbGU7CQkvKiBPbmUgRVNQIGNsb2NrIGN5Y2xlICovCi0JdW5zaWduZWQgaW50CQljdGljazsJCS8qIE9uZSBFU1AgY2xvY2sgdGltZSAqLwotCXVuc2lnbmVkIGludAkJcmFkZWxheTsJLyogRkFTVCBjaGlwIHJlcS9hY2sgZGVsYXkgKi8KLQl1bnNpZ25lZCBpbnQJCW5lZ19kZWZwOwkvKiBEZWZhdWx0IG5lZ290aWF0aW9uIHBlcmlvZCAqLwotCXVuc2lnbmVkIGludAkJc3luY19kZWZwOwkvKiBEZWZhdWx0IHN5bmMgdHJhbnNmZXIgcGVyaW9kICovCi0JdW5zaWduZWQgaW50CQltYXhfcGVyaW9kOwkvKiBsb25nZXN0IG91ciBwZXJpb2QgY2FuIGJlICovCi0JdW5zaWduZWQgaW50CQltaW5fcGVyaW9kOwkvKiBzaG9ydGVzdCBwZXJpb2Qgd2UgY2FuIHdpdGhzdGFuZCAqLwotCi0Jc3RydWN0IGVzcAkJKm5leHQ7CQkvKiBOZXh0IEVTUCB3ZSBwcm9iZWQgb3IgTlVMTCAqLwotCWNoYXIJCQlwcm9tX25hbWVbNjRdOwkvKiBOYW1lIG9mIEVTUCBkZXZpY2UgZnJvbSBwcm9tICovCi0JaW50CQkJcHJvbV9ub2RlOwkvKiBQcm9tIG5vZGUgd2hlcmUgRVNQIGZvdW5kICovCi0JaW50CQkJZXNwX2lkOwkJLyogVW5pcXVlIHBlci1FU1AgSUQgbnVtYmVyICovCi0KLQkvKiBGb3Igc2xvdyB0byBtZWRpdW0gc3BlZWQgaW5wdXQgY2xvY2sgcmF0ZXMgd2Ugc2hvb3QgZm9yIDVtYi9zLAotCSAqIGJ1dCBmb3IgaGlnaCBpbnB1dCBjbG9jayByYXRlcyB3ZSB0cnkgdG8gZG8gMTBtYi9zIGFsdGhvdWdoIEkKLQkgKiBkb24ndCB0aGluayBhIHRyYW5zZmVyIGNhbiBldmVuIHJ1biB0aGF0IGZhc3Qgd2l0aCBhbiBFU1AgZXZlbgotCSAqIHdpdGggRE1BMiBzY2F0dGVyIGdhdGhlciBwaXBlbGluaW5nLgotCSAqLwotI2RlZmluZSBTWU5DX0RFRlBfU0xPVyAgICAgICAgICAgIDB4MzIgICAvKiA1bWIvcyAgKi8KLSNkZWZpbmUgU1lOQ19ERUZQX0ZBU1QgICAgICAgICAgICAweDE5ICAgLyogMTBtYi9zICovCi0KLQl1bnNpZ25lZCBpbnQJCXNuaXA7CQkvKiBTeW5jLiBuZWdvdGlhdGlvbiBpbiBwcm9ncmVzcyAqLwotCXVuc2lnbmVkIGludAkJd25pcDsJCS8qIFdJREUgbmVnb3RpYXRpb24gaW4gcHJvZ3Jlc3MgKi8KLQl1bnNpZ25lZCBpbnQJCXRhcmdldHNfcHJlc2VudDsvKiB0YXJnZXRzIHNwb2tlbiB0byBiZWZvcmUgKi8KLQotCWludAkJY3VycmVudF90cmFuc2Zlcl9zaXplOwkvKiBTZXQgYXQgYmVnaW5uaW5nIG9mIGRhdGEgZG1hICovCi0KLQl1OAkJCWVzcGNtZGxvZ1szMl07CS8qIExvZyBvZiBjdXJyZW50IGVzcCBjbWRzIHNlbnQuICovCi0JdTgJCQllc3BjbWRlbnQ7CS8qIEN1cnJlbnQgZW50cnkgaW4gZXNwIGNtZCBsb2cuICovCi0KLQkvKiBNaXNjLiBpbmZvIGFib3V0IHRoaXMgRVNQICovCi0JZW51bSBlc3BfcmV2CQllcmV2OwkJLyogRVNQIHJldmlzaW9uICovCi0JaW50CQkJaXJxOwkJLyogU0J1cyBJUlEgZm9yIHRoaXMgRVNQICovCi0JaW50CQkJc2NzaV9pZDsJLyogV2hvIGFtIEkgYXMgaW5pdGlhdG9yPyAqLwotCWludAkJCXNjc2lfaWRfbWFzazsJLyogQml0bWFzayBvZiAnbWUnLiAqLwotCWludAkJCWRpZmY7CQkvKiBEaWZmZXJlbnRpYWwgU0NTSSBidXM/ICovCi0JaW50CQkJYnVyc3RzOwkJLyogQnVyc3Qgc2l6ZXMgb3VyIERWTUEgc3VwcG9ydHMgKi8KLQotCS8qIE91ciBjb21tYW5kIHF1ZXVlcywgb25seSBvbmUgY21kIGxpdmVzIGluIHRoZSBjdXJyZW50X1NDIHF1ZXVlLiAqLwotCXN0cnVjdCBzY3NpX2NtbmQJKmlzc3VlX1NDOwkvKiBDb21tYW5kcyB0byBiZSBpc3N1ZWQgKi8KLQlzdHJ1Y3Qgc2NzaV9jbW5kCSpjdXJyZW50X1NDOwkvKiBXaG8gaXMgY3VycmVudGx5IHdvcmtpbmcgdGhlIGJ1cyAqLwotCXN0cnVjdCBzY3NpX2NtbmQJKmRpc2Nvbm5lY3RlZF9TQzsvKiBDb21tYW5kcyBkaXNjb25uZWN0ZWQgZnJvbSB0aGUgYnVzICovCi0KLQkvKiBNZXNzYWdlIGdvbyAqLwotCXU4CQkJY3VyX21zZ291dFsxNl07Ci0JdTgJCQljdXJfbXNnaW5bMTZdOwotCXU4CQkJcHJldm1zZ291dCwgcHJldm1zZ2luOwotCXU4CQkJbXNnb3V0X2xlbiwgbXNnaW5fbGVuOwotCXU4CQkJbXNnb3V0X2N0ciwgbXNnaW5fY3RyOwotCi0JLyogU3RhdGVzIHRoYXQgd2UgY2Fubm90IGtlZXAgaW4gdGhlIHBlciBjbWQgc3RydWN0dXJlIGJlY2F1c2UgdGhleQotCSAqIGNhbm5vdCBiZSBhc3Nvc2NpYXRlZCB3aXRoIGFueSBzcGVjaWZpYyBjb21tYW5kLgotCSAqLwotCXU4CQkJcmVzZXR0aW5nX2J1czsKLQl3YWl0X3F1ZXVlX2hlYWRfdAlyZXNldF9xdWV1ZTsKLX07Ci0KLS8qIEJpdGZpZWxkIG1lYW5pbmdzIGZvciB0aGUgYWJvdmUgcmVnaXN0ZXJzLiAqLwotCi0vKiBFU1AgY29uZmlnIHJlZyAxLCByZWFkLXdyaXRlLCBmb3VuZCBvbiBhbGwgRVNQIGNoaXBzICovCi0jZGVmaW5lIEVTUF9DT05GSUcxX0lEICAgICAgICAweDA3ICAgICAgICAgICAgIC8qIE15IEJVUyBJRCBiaXRzICovCi0jZGVmaW5lIEVTUF9DT05GSUcxX0NIVEVTVCAgICAweDA4ICAgICAgICAgICAgIC8qIEVuYWJsZSBFU1AgY2hpcCB0ZXN0cyAqLwotI2RlZmluZSBFU1BfQ09ORklHMV9QRU5BQkxFICAgMHgxMCAgICAgICAgICAgICAvKiBFbmFibGUgcGFyaXR5IGNoZWNrcyAqLwotI2RlZmluZSBFU1BfQ09ORklHMV9QQVJURVNUICAgMHgyMCAgICAgICAgICAgICAvKiBQYXJpdHkgdGVzdCBtb2RlIGVuYWJsZWQ/ICovCi0jZGVmaW5lIEVTUF9DT05GSUcxX1NSUkRJU0FCICAweDQwICAgICAgICAgICAgIC8qIERpc2FibGUgU0NTSSByZXNldCByZXBvcnRzICovCi0jZGVmaW5lIEVTUF9DT05GSUcxX1NMQ0FCTEUgICAweDgwICAgICAgICAgICAgIC8qIEVuYWJsZSBzbG93IGNhYmxlIG1vZGUgKi8KLQotLyogRVNQIGNvbmZpZyByZWcgMiwgcmVhZC13cml0ZSwgZm91bmQgb25seSBvbiBlc3AxMDBhK2VzcDIwMCtlc3AyMzYgY2hpcHMgKi8KLSNkZWZpbmUgRVNQX0NPTkZJRzJfRE1BUEFSSVRZIDB4MDEgICAgICAgICAgICAgLyogZW5hYmxlIERNQSBQYXJpdHkgKDIwMCwyMzYpICovCi0jZGVmaW5lIEVTUF9DT05GSUcyX1JFR1BBUklUWSAweDAyICAgICAgICAgICAgIC8qIGVuYWJsZSByZWcgUGFyaXR5ICgyMDAsMjM2KSAqLwotI2RlZmluZSBFU1BfQ09ORklHMl9CQURQQVJJVFkgMHgwNCAgICAgICAgICAgICAvKiBCYWQgcGFyaXR5IHRhcmdldCBhYm9ydCAgKi8KLSNkZWZpbmUgRVNQX0NPTkZJRzJfU0NTSTJFTkFCIDB4MDggICAgICAgICAgICAgLyogRW5hYmxlIFNDU0ktMiBmZWF0dXJlcyAodG1vZGUgb25seSkgKi8KLSNkZWZpbmUgRVNQX0NPTkZJRzJfSEkgICAgICAgIDB4MTAgICAgICAgICAgICAgLyogSGlnaCBJbXBlZGFuY2UgRFJFUSA/Pz8gICovCi0jZGVmaW5lIEVTUF9DT05GSUcyX0hNRUZFTkFCICAweDEwICAgICAgICAgICAgIC8qIEhNRSBmZWF0dXJlcyBlbmFibGUgKi8KLSNkZWZpbmUgRVNQX0NPTkZJRzJfQkNNICAgICAgIDB4MjAgICAgICAgICAgICAgLyogRW5hYmxlIGJ5dGUtY3RybCAoMjM2KSAgICovCi0jZGVmaW5lIEVTUF9DT05GSUcyX0RJU1BJTlQgICAweDIwICAgICAgICAgICAgIC8qIERpc2FibGUgcGF1c2UgaXJxIChobWUpICovCi0jZGVmaW5lIEVTUF9DT05GSUcyX0ZFTkFCICAgICAweDQwICAgICAgICAgICAgIC8qIEVuYWJsZSBmZWF0dXJlcyAoZmFzMTAwLGVzcDIxNikgICAgICAqLwotI2RlZmluZSBFU1BfQ09ORklHMl9TUEwgICAgICAgMHg0MCAgICAgICAgICAgICAvKiBFbmFibGUgc3RhdHVzLXBoYXNlIGxhdGNoIChlc3AyMzYpICAgKi8KLSNkZWZpbmUgRVNQX0NPTkZJRzJfTUtET05FICAgIDB4NDAgICAgICAgICAgICAgLyogSE1FIG1hZ2ljIGZlYXR1cmUgKi8KLSNkZWZpbmUgRVNQX0NPTkZJRzJfSE1FMzIgICAgIDB4ODAgICAgICAgICAgICAgLyogSE1FIDMyIGV4dGVuZGVkICovCi0jZGVmaW5lIEVTUF9DT05GSUcyX01BR0lDICAgICAweGUwICAgICAgICAgICAgIC8qIEludmFsaWQgYml0cy4uLiAqLwotCi0vKiBFU1AgY29uZmlnIHJlZ2lzdGVyIDMgcmVhZC13cml0ZSwgZm91bmQgb25seSBlc3AyMzYrZmFzMjM2K2ZhczEwMGEraG1lIGNoaXBzICovCi0jZGVmaW5lIEVTUF9DT05GSUczX0ZDTE9DSyAgICAweDAxICAgICAgICAgICAgIC8qIEZBU1QgU0NTSSBjbG9jayByYXRlIChlc3AxMDBhL2htZSkgKi8KLSNkZWZpbmUgRVNQX0NPTkZJRzNfVEVNICAgICAgIDB4MDEgICAgICAgICAgICAgLyogRW5hYmxlIHRocmVzaC04IG1vZGUgKGVzcC9mYXMyMzYpICAqLwotI2RlZmluZSBFU1BfQ09ORklHM19GQVNUICAgICAgMHgwMiAgICAgICAgICAgICAvKiBFbmFibGUgRkFTVCBTQ1NJICAgICAoZXNwMTAwYS9obWUpICovCi0jZGVmaW5lIEVTUF9DT05GSUczX0FETUEgICAgICAweDAyICAgICAgICAgICAgIC8qIEVuYWJsZSBhbHRlcm5hdGUtZG1hIChlc3AvZmFzMjM2KSAgKi8KLSNkZWZpbmUgRVNQX0NPTkZJRzNfVEVOQiAgICAgIDB4MDQgICAgICAgICAgICAgLyogZ3JvdXAyIFNDU0kyIHN1cHBvcnQgKGVzcDEwMGEvaG1lKSAqLwotI2RlZmluZSBFU1BfQ09ORklHM19TUkIgICAgICAgMHgwNCAgICAgICAgICAgICAvKiBTYXZlIHJlc2lkdWFsIGJ5dGUgICAoZXNwL2ZhczIzNikgICovCi0jZGVmaW5lIEVTUF9DT05GSUczX1RNUyAgICAgICAweDA4ICAgICAgICAgICAgIC8qIFRocmVlLWJ5dGUgbXNnJ3Mgb2sgIChlc3AxMDBhL2htZSkgKi8KLSNkZWZpbmUgRVNQX0NPTkZJRzNfRkNMSyAgICAgIDB4MDggICAgICAgICAgICAgLyogRmFzdCBTQ1NJIGNsb2NrIHJhdGUgKGVzcC9mYXMyMzYpICAqLwotI2RlZmluZSBFU1BfQ09ORklHM19JRE1TRyAgICAgMHgxMCAgICAgICAgICAgICAvKiBJRCBtZXNzYWdlIGNoZWNraW5nICAoZXNwMTAwYS9obWUpICovCi0jZGVmaW5lIEVTUF9DT05GSUczX0ZTQ1NJICAgICAweDEwICAgICAgICAgICAgIC8qIEVuYWJsZSBGQVNUIFNDU0kgICAgIChlc3AvZmFzMjM2KSAgKi8KLSNkZWZpbmUgRVNQX0NPTkZJRzNfR1RNICAgICAgIDB4MjAgICAgICAgICAgICAgLyogZ3JvdXAyIFNDU0kyIHN1cHBvcnQgKGVzcC9mYXMyMzYpICAqLwotI2RlZmluZSBFU1BfQ09ORklHM19JREJJVDMgICAgMHgyMCAgICAgICAgICAgICAvKiBCaXQgMyBvZiBITUUgU0NTSS1JRCAoaG1lKSAgICAgICAgICovCi0jZGVmaW5lIEVTUF9DT05GSUczX1RCTVMgICAgICAweDQwICAgICAgICAgICAgIC8qIFRocmVlLWJ5dGUgbXNnJ3Mgb2sgIChlc3AvZmFzMjM2KSAgKi8KLSNkZWZpbmUgRVNQX0NPTkZJRzNfRVdJREUgICAgIDB4NDAgICAgICAgICAgICAgLyogRW5hYmxlIFdpZGUtU0NTSSAgICAgKGhtZSkgICAgICAgICAqLwotI2RlZmluZSBFU1BfQ09ORklHM19JTVMgICAgICAgMHg4MCAgICAgICAgICAgICAvKiBJRCBtc2cgY2hrJ25nICAgICAgICAoZXNwL2ZhczIzNikgICovCi0jZGVmaW5lIEVTUF9DT05GSUczX09CUFVTSCAgICAweDgwICAgICAgICAgICAgIC8qIFB1c2ggb2RkLWJ5dGUgdG8gZG1hIChobWUpICAgICAgICAgKi8KLQotLyogRVNQIGNvbW1hbmQgcmVnaXN0ZXIgcmVhZC13cml0ZSAqLwotLyogR3JvdXAgMSBjb21tYW5kczogIFRoZXNlIG1heSBiZSBzZW50IGF0IGFueSBwb2ludCBpbiB0aW1lIHRvIHRoZSBFU1AKLSAqICAgICAgICAgICAgICAgICAgICBjaGlwLiAgTm9uZSBvZiB0aGVtIGNhbiBnZW5lcmF0ZSBpbnRlcnJ1cHRzICdjZXB0Ci0gKiAgICAgICAgICAgICAgICAgICAgdGhlICJTQ1NJIGJ1cyByZXNldCIgY29tbWFuZCBpZiB5b3UgaGF2ZSBub3QgZGlzYWJsZWQKLSAqICAgICAgICAgICAgICAgICAgICBTQ1NJIHJlc2V0IGludGVycnVwdHMgaW4gdGhlIGNvbmZpZzEgRVNQIHJlZ2lzdGVyLgotICovCi0jZGVmaW5lIEVTUF9DTURfTlVMTCAgICAgICAgICAweDAwICAgICAgICAgICAgIC8qIE51bGwgY29tbWFuZCwgaWUuIGEgbm9wICovCi0jZGVmaW5lIEVTUF9DTURfRkxVU0ggICAgICAgICAweDAxICAgICAgICAgICAgIC8qIEZJRk8gRmx1c2ggKi8KLSNkZWZpbmUgRVNQX0NNRF9SQyAgICAgICAgICAgIDB4MDIgICAgICAgICAgICAgLyogQ2hpcCByZXNldCAqLwotI2RlZmluZSBFU1BfQ01EX1JTICAgICAgICAgICAgMHgwMyAgICAgICAgICAgICAvKiBTQ1NJIGJ1cyByZXNldCAqLwotCi0vKiBHcm91cCAyIGNvbW1hbmRzOiAgRVNQIG11c3QgYmUgYW4gaW5pdGlhdG9yIGFuZCBjb25uZWN0ZWQgdG8gYSB0YXJnZXQKLSAqICAgICAgICAgICAgICAgICAgICBmb3IgdGhlc2UgY29tbWFuZHMgdG8gd29yay4KLSAqLwotI2RlZmluZSBFU1BfQ01EX1RJICAgICAgICAgICAgMHgxMCAgICAgICAgICAgICAvKiBUcmFuc2ZlciBJbmZvcm1hdGlvbiAqLwotI2RlZmluZSBFU1BfQ01EX0lDQ1NFUSAgICAgICAgMHgxMSAgICAgICAgICAgICAvKiBJbml0aWF0b3IgY21kIGNvbXBsZXRlIHNlcXVlbmNlICovCi0jZGVmaW5lIEVTUF9DTURfTU9LICAgICAgICAgICAweDEyICAgICAgICAgICAgIC8qIE1lc3NhZ2Ugb2tpZS1kb2tpZSAqLwotI2RlZmluZSBFU1BfQ01EX1RQQUQgICAgICAgICAgMHgxOCAgICAgICAgICAgICAvKiBUcmFuc2ZlciBQYWQgKi8KLSNkZWZpbmUgRVNQX0NNRF9TQVROICAgICAgICAgIDB4MWEgICAgICAgICAgICAgLyogU2V0IEFUTiAqLwotI2RlZmluZSBFU1BfQ01EX1JBVE4gICAgICAgICAgMHgxYiAgICAgICAgICAgICAvKiBEZS1hc3NlcnQgQVROICovCi0KLS8qIEdyb3VwIDMgY29tbWFuZHM6ICBFU1AgbXVzdCBiZSBpbiB0aGUgTVNHT1VUIG9yIE1TR0lOIHN0YXRlIGFuZCBiZSBjb25uZWN0ZWQKLSAqICAgICAgICAgICAgICAgICAgICB0byBhIHRhcmdldCBhcyB0aGUgaW5pdGlhdG9yIGZvciB0aGVzZSBjb21tYW5kcyB0byB3b3JrLgotICovCi0jZGVmaW5lIEVTUF9DTURfU01TRyAgICAgICAgICAweDIwICAgICAgICAgICAgIC8qIFNlbmQgbWVzc2FnZSAqLwotI2RlZmluZSBFU1BfQ01EX1NTVEFUICAgICAgICAgMHgyMSAgICAgICAgICAgICAvKiBTZW5kIHN0YXR1cyAqLwotI2RlZmluZSBFU1BfQ01EX1NEQVRBICAgICAgICAgMHgyMiAgICAgICAgICAgICAvKiBTZW5kIGRhdGEgKi8KLSNkZWZpbmUgRVNQX0NNRF9EU0VRICAgICAgICAgIDB4MjMgICAgICAgICAgICAgLyogRGlzY29udGludWUgU2VxdWVuY2UgKi8KLSNkZWZpbmUgRVNQX0NNRF9UU0VRICAgICAgICAgIDB4MjQgICAgICAgICAgICAgLyogVGVybWluYXRlIFNlcXVlbmNlICovCi0jZGVmaW5lIEVTUF9DTURfVENDU0VRICAgICAgICAweDI1ICAgICAgICAgICAgIC8qIFRhcmdldCBjbWQgY21wbHQgc2VxdWVuY2UgKi8KLSNkZWZpbmUgRVNQX0NNRF9EQ05DVCAgICAgICAgIDB4MjcgICAgICAgICAgICAgLyogRGlzY29ubmVjdCAqLwotI2RlZmluZSBFU1BfQ01EX1JNU0cgICAgICAgICAgMHgyOCAgICAgICAgICAgICAvKiBSZWNlaXZlIE1lc3NhZ2UgKi8KLSNkZWZpbmUgRVNQX0NNRF9SQ01EICAgICAgICAgIDB4MjkgICAgICAgICAgICAgLyogUmVjZWl2ZSBDb21tYW5kICovCi0jZGVmaW5lIEVTUF9DTURfUkRBVEEgICAgICAgICAweDJhICAgICAgICAgICAgIC8qIFJlY2VpdmUgRGF0YSAqLwotI2RlZmluZSBFU1BfQ01EX1JDU0VRICAgICAgICAgMHgyYiAgICAgICAgICAgICAvKiBSZWNlaXZlIGNtZCBzZXF1ZW5jZSAqLwotCi0vKiBHcm91cCA0IGNvbW1hbmRzOiAgVGhlIEVTUCBtdXN0IGJlIGluIHRoZSBkaXNjb25uZWN0ZWQgc3RhdGUgYW5kIG11c3QKLSAqICAgICAgICAgICAgICAgICAgICBub3QgYmUgY29ubmVjdGVkIHRvIGFueSB0YXJnZXRzIGFzIGluaXRpYXRvciBmb3IKLSAqICAgICAgICAgICAgICAgICAgICB0aGVzZSBjb21tYW5kcyB0byB3b3JrLgotICovCi0jZGVmaW5lIEVTUF9DTURfUlNFTCAgICAgICAgICAweDQwICAgICAgICAgICAgIC8qIFJlc2VsZWN0ICovCi0jZGVmaW5lIEVTUF9DTURfU0VMICAgICAgICAgICAweDQxICAgICAgICAgICAgIC8qIFNlbGVjdCB3L28gQVROICovCi0jZGVmaW5lIEVTUF9DTURfU0VMQSAgICAgICAgICAweDQyICAgICAgICAgICAgIC8qIFNlbGVjdCB3L0FUTiAqLwotI2RlZmluZSBFU1BfQ01EX1NFTEFTICAgICAgICAgMHg0MyAgICAgICAgICAgICAvKiBTZWxlY3Qgdy9BVE4gJiBTVE9QICovCi0jZGVmaW5lIEVTUF9DTURfRVNFTCAgICAgICAgICAweDQ0ICAgICAgICAgICAgIC8qIEVuYWJsZSBzZWxlY3Rpb24gKi8KLSNkZWZpbmUgRVNQX0NNRF9EU0VMICAgICAgICAgIDB4NDUgICAgICAgICAgICAgLyogRGlzYWJsZSBzZWxlY3Rpb25zICovCi0jZGVmaW5lIEVTUF9DTURfU0EzICAgICAgICAgICAweDQ2ICAgICAgICAgICAgIC8qIFNlbGVjdCB3L0FUTjMgKi8KLSNkZWZpbmUgRVNQX0NNRF9SU0VMMyAgICAgICAgIDB4NDcgICAgICAgICAgICAgLyogUmVzZWxlY3QzICovCi0KLS8qIFRoaXMgYml0IGVuYWJsZXMgdGhlIEVTUCdzIERNQSBvbiB0aGUgU0J1cyAqLwotI2RlZmluZSBFU1BfQ01EX0RNQSAgICAgICAgICAgMHg4MCAgICAgICAgICAgICAvKiBEbyBETUE/ICovCi0KLQotLyogRVNQIHN0YXR1cyByZWdpc3RlciByZWFkLW9ubHkgKi8KLSNkZWZpbmUgRVNQX1NUQVRfUElPICAgICAgICAgIDB4MDEgICAgICAgICAgICAgLyogSU8gcGhhc2UgYml0ICovCi0jZGVmaW5lIEVTUF9TVEFUX1BDRCAgICAgICAgICAweDAyICAgICAgICAgICAgIC8qIENEIHBoYXNlIGJpdCAqLwotI2RlZmluZSBFU1BfU1RBVF9QTVNHICAgICAgICAgMHgwNCAgICAgICAgICAgICAvKiBNU0cgcGhhc2UgYml0ICovCi0jZGVmaW5lIEVTUF9TVEFUX1BNQVNLICAgICAgICAweDA3ICAgICAgICAgICAgIC8qIE1hc2sgb2YgcGhhc2UgYml0cyAqLwotI2RlZmluZSBFU1BfU1RBVF9URE9ORSAgICAgICAgMHgwOCAgICAgICAgICAgICAvKiBUcmFuc2ZlciBDb21wbGV0ZWQgKi8KLSNkZWZpbmUgRVNQX1NUQVRfVENOVCAgICAgICAgIDB4MTAgICAgICAgICAgICAgLyogVHJhbnNmZXIgQ291bnRlciBJcyBaZXJvICovCi0jZGVmaW5lIEVTUF9TVEFUX1BFUlIgICAgICAgICAweDIwICAgICAgICAgICAgIC8qIFBhcml0eSBlcnJvciAqLwotI2RlZmluZSBFU1BfU1RBVF9TUEFNICAgICAgICAgMHg0MCAgICAgICAgICAgICAvKiBSZWFsIGJhZCBlcnJvciAqLwotLyogVGhpcyBpbmRpY2F0ZXMgdGhlICdpbnRlcnJ1cHQgcGVuZGluZycgY29uZGl0aW9uIG9uIGVzcDIzNiwgaXQgaXMgYSByZXNlcnZlZAotICogYml0IG9uIG90aGVyIHJldnMgb2YgdGhlIEVTUC4KLSAqLwotI2RlZmluZSBFU1BfU1RBVF9JTlRSICAgICAgICAgMHg4MCAgICAgICAgICAgICAvKiBJbnRlcnJ1cHQgKi8KLQotLyogSE1FIG9ubHk6IHN0YXR1cyAyIHJlZ2lzdGVyICovCi0jZGVmaW5lIEVTUF9TVEFUMl9TQ0hCSVQgICAgICAweDAxIC8qIFVwcGVyIGJpdHMgMy03IG9mIHNzdGVwIGVuYWJsZWQgKi8KLSNkZWZpbmUgRVNQX1NUQVQyX0ZGTEFHUyAgICAgIDB4MDIgLyogVGhlIGZpZm8gZmxhZ3MgYXJlIG5vdyBsYXRjaGVkICovCi0jZGVmaW5lIEVTUF9TVEFUMl9YQ05UICAgICAgICAweDA0IC8qIFRoZSB0cmFuc2ZlciBjb3VudGVyIGlzIGxhdGNoZWQgKi8KLSNkZWZpbmUgRVNQX1NUQVQyX0NSRUdBICAgICAgIDB4MDggLyogVGhlIGNvbW1hbmQgcmVnIGlzIGFjdGl2ZSBub3cgKi8KLSNkZWZpbmUgRVNQX1NUQVQyX1dJREUgICAgICAgIDB4MTAgLyogSW50ZXJmYWNlIG9uIHRoaXMgYWRhcHRlciBpcyB3aWRlICovCi0jZGVmaW5lIEVTUF9TVEFUMl9GMUJZVEUgICAgICAweDIwIC8qIFRoZXJlIGlzIG9uZSBieXRlIGF0IHRvcCBvZiBmaWZvICovCi0jZGVmaW5lIEVTUF9TVEFUMl9GTVNCICAgICAgICAweDQwIC8qIE5leHQgYnl0ZSBpbiBmaWZvIGlzIG1vc3Qgc2lnbmlmaWNhbnQgKi8KLSNkZWZpbmUgRVNQX1NUQVQyX0ZFTVBUWSAgICAgIDB4ODAgLyogRklGTyBpcyBlbXB0eSAqLwotCi0vKiBUaGUgc3RhdHVzIHJlZ2lzdGVyIGNhbiBiZSBtYXNrZWQgd2l0aCBFU1BfU1RBVF9QTUFTSyBhbmQgY29tcGFyZWQKLSAqIHdpdGggdGhlIGZvbGxvd2luZyB2YWx1ZXMgdG8gZGV0ZXJtaW5lIHRoZSBjdXJyZW50IHBoYXNlIHRoZSBFU1AKLSAqIChhdCBsZWFzdCB0aGlua3MgaXQpIGlzIGluLiAgRm9yIG91ciBwdXJwb3NlcyB3ZSBhbHNvIGFkZCBvdXIgb3duCi0gKiBzb2Z0d2FyZSAnZG9uZScgYml0IGZvciBvdXIgcGhhc2UgbWFuYWdlbWVudCBlbmdpbmUuCi0gKi8KLSNkZWZpbmUgRVNQX0RPUCAgICgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERhdGEgT3V0ICAqLwotI2RlZmluZSBFU1BfRElQICAgKEVTUF9TVEFUX1BJTykgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGF0YSBJbiAgICovCi0jZGVmaW5lIEVTUF9DTURQICAoRVNQX1NUQVRfUENEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb21tYW5kICAgKi8KLSNkZWZpbmUgRVNQX1NUQVRQIChFU1BfU1RBVF9QQ0R8RVNQX1NUQVRfUElPKSAgICAgICAgICAgICAgIC8qIFN0YXR1cyAgICAqLwotI2RlZmluZSBFU1BfTU9QICAgKEVTUF9TVEFUX1BNU0d8RVNQX1NUQVRfUENEKSAgICAgICAgICAgICAgLyogTWVzc2FnZSBPdXQgKi8KLSNkZWZpbmUgRVNQX01JUCAgIChFU1BfU1RBVF9QTVNHfEVTUF9TVEFUX1BDRHxFU1BfU1RBVF9QSU8pIC8qIE1lc3NhZ2UgSW4gKi8KLQotLyogRVNQIGludGVycnVwdCByZWdpc3RlciByZWFkLW9ubHkgKi8KLSNkZWZpbmUgRVNQX0lOVFJfUyAgICAgICAgICAgIDB4MDEgICAgICAgICAgICAgLyogU2VsZWN0IHcvbyBBVE4gKi8KLSNkZWZpbmUgRVNQX0lOVFJfU0FUTiAgICAgICAgIDB4MDIgICAgICAgICAgICAgLyogU2VsZWN0IHcvQVROICovCi0jZGVmaW5lIEVTUF9JTlRSX1JTRUwgICAgICAgICAweDA0ICAgICAgICAgICAgIC8qIFJlc2VsZWN0ZWQgKi8KLSNkZWZpbmUgRVNQX0lOVFJfRkRPTkUgICAgICAgIDB4MDggICAgICAgICAgICAgLyogRnVuY3Rpb24gZG9uZSAqLwotI2RlZmluZSBFU1BfSU5UUl9CU0VSViAgICAgICAgMHgxMCAgICAgICAgICAgICAvKiBCdXMgc2VydmljZSAqLwotI2RlZmluZSBFU1BfSU5UUl9EQyAgICAgICAgICAgMHgyMCAgICAgICAgICAgICAvKiBEaXNjb25uZWN0ICovCi0jZGVmaW5lIEVTUF9JTlRSX0lDICAgICAgICAgICAweDQwICAgICAgICAgICAgIC8qIElsbGVnYWwgY29tbWFuZCBnaXZlbiAqLwotI2RlZmluZSBFU1BfSU5UUl9TUiAgICAgICAgICAgMHg4MCAgICAgICAgICAgICAvKiBTQ1NJIGJ1cyByZXNldCBkZXRlY3RlZCAqLwotCi0vKiBJbnRlcnJ1cHQgc3RhdHVzIG1hY3JvcyAqLwotI2RlZmluZSBFU1BfU1JFU0VUX0lSUShlc3ApICAoKGVzcCktPmludHJlZyAmIChFU1BfSU5UUl9TUikpCi0jZGVmaW5lIEVTUF9JTExDTURfSVJRKGVzcCkgICgoZXNwKS0+aW50cmVnICYgKEVTUF9JTlRSX0lDKSkKLSNkZWZpbmUgRVNQX1NFTEVDVF9XSVRIX0FUTl9JUlEoZXNwKSAgICAgKChlc3ApLT5pbnRyZWcgJiAoRVNQX0lOVFJfU0FUTikpCi0jZGVmaW5lIEVTUF9TRUxFQ1RfV0lUSE9VVF9BVE5fSVJRKGVzcCkgICgoZXNwKS0+aW50cmVnICYgKEVTUF9JTlRSX1MpKQotI2RlZmluZSBFU1BfU0VMRUNUSU9OX0lSUShlc3ApICAoKEVTUF9TRUxFQ1RfV0lUSF9BVE5fSVJRKGVzcCkpIHx8ICAgICAgICAgXAotCQkJCSAoRVNQX1NFTEVDVF9XSVRIT1VUX0FUTl9JUlEoZXNwKSkpCi0jZGVmaW5lIEVTUF9SRVNFTEVDVElPTl9JUlEoZXNwKSAgICAgICAgICgoZXNwKS0+aW50cmVnICYgKEVTUF9JTlRSX1JTRUwpKQotCi0vKiBFU1Agc2VxdWVuY2Ugc3RlcCByZWdpc3RlciByZWFkLW9ubHkgKi8KLSNkZWZpbmUgRVNQX1NURVBfVkJJVFMgICAgICAgIDB4MDcgICAgICAgICAgICAgLyogVmFsaWQgYml0cyAqLwotI2RlZmluZSBFU1BfU1RFUF9BU0VMICAgICAgICAgMHgwMCAgICAgICAgICAgICAvKiBTZWxlY3Rpb24mQXJiaXRyYXRlIGNtcGx0ICovCi0jZGVmaW5lIEVTUF9TVEVQX1NJRCAgICAgICAgICAweDAxICAgICAgICAgICAgIC8qIE9uZSBtc2cgYnl0ZSBzZW50ICovCi0jZGVmaW5lIEVTUF9TVEVQX05DTUQgICAgICAgICAweDAyICAgICAgICAgICAgIC8qIFdhcyBub3QgaW4gY29tbWFuZCBwaGFzZSAqLwotI2RlZmluZSBFU1BfU1RFUF9QUEMgICAgICAgICAgMHgwMyAgICAgICAgICAgICAvKiBFYXJseSBwaGFzZSBjaGcgY2F1c2VkIGNtbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYnl0ZXMgdG8gYmUgbG9zdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgRVNQX1NURVBfRklOSTQgICAgICAgIDB4MDQgICAgICAgICAgICAgLyogQ29tbWFuZCB3YXMgc2VudCBvayAqLwotCi0vKiBIbyBodW0sIHNvbWUgRVNQJ3Mgc2V0IHRoZSBzdGVwIHJlZ2lzdGVyIHRvIHRoaXMgYXMgd2VsbC4uLiAqLwotI2RlZmluZSBFU1BfU1RFUF9GSU5JNSAgICAgICAgMHgwNQotI2RlZmluZSBFU1BfU1RFUF9GSU5JNiAgICAgICAgMHgwNgotI2RlZmluZSBFU1BfU1RFUF9GSU5JNyAgICAgICAgMHgwNwotCi0vKiBFU1AgY2hpcC10ZXN0IHJlZ2lzdGVyIHJlYWQtd3JpdGUgKi8KLSNkZWZpbmUgRVNQX1RFU1RfVEFSRyAgICAgICAgIDB4MDEgICAgICAgICAgICAgLyogVGFyZ2V0IHRlc3QgbW9kZSAqLwotI2RlZmluZSBFU1BfVEVTVF9JTkkgICAgICAgICAgMHgwMiAgICAgICAgICAgICAvKiBJbml0aWF0b3IgdGVzdCBtb2RlICovCi0jZGVmaW5lIEVTUF9URVNUX1RTICAgICAgICAgICAweDA0ICAgICAgICAgICAgIC8qIFRyaXN0YXRlIHRlc3QgbW9kZSAqLwotCi0vKiBFU1AgdW5pcXVlIElEIHJlZ2lzdGVyIHJlYWQtb25seSwgZm91bmQgb24gZmFzMjM2K2ZhczEwMGEgb25seSAqLwotI2RlZmluZSBFU1BfVUlEX0YxMDBBICAgICAgICAgMHgwMCAgICAgICAgICAgICAvKiBFU1AgRkFTMTAwQSAgKi8KLSNkZWZpbmUgRVNQX1VJRF9GMjM2ICAgICAgICAgIDB4MDIgICAgICAgICAgICAgLyogRVNQIEZBUzIzNiAgICovCi0jZGVmaW5lIEVTUF9VSURfUkVWICAgICAgICAgICAweDA3ICAgICAgICAgICAgIC8qIEVTUCByZXZpc2lvbiAqLwotI2RlZmluZSBFU1BfVUlEX0ZBTSAgICAgICAgICAgMHhmOCAgICAgICAgICAgICAvKiBFU1AgZmFtaWx5ICAgKi8KLQotLyogRVNQIGZpZm8gZmxhZ3MgcmVnaXN0ZXIgcmVhZC1vbmx5ICovCi0vKiBOb3RlIHRoYXQgdGhlIGZvbGxvd2luZyBpbXBsaWVzIGEgMTYgYnl0ZSBGSUZPIG9uIHRoZSBFU1AuICovCi0jZGVmaW5lIEVTUF9GRl9GQllURVMgICAgICAgICAweDFmICAgICAgICAgICAgIC8qIE51bSBieXRlcyBpbiBGSUZPICovCi0jZGVmaW5lIEVTUF9GRl9PTk9UWkVSTyAgICAgICAweDIwICAgICAgICAgICAgIC8qIG9mZnNldCBjdHIgbm90IHplcm8gKGVzcDEwMCkgKi8KLSNkZWZpbmUgRVNQX0ZGX1NTVEVQICAgICAgICAgIDB4ZTAgICAgICAgICAgICAgLyogU2VxdWVuY2Ugc3RlcCAqLwotCi0vKiBFU1AgY2xvY2sgY29udmVyc2lvbiBmYWN0b3IgcmVnaXN0ZXIgd3JpdGUtb25seSAqLwotI2RlZmluZSBFU1BfQ0NGX0YwICAgICAgICAgICAgMHgwMCAgICAgICAgICAgICAvKiAzNS4wMU1IeiAtIDQwTUh6ICovCi0jZGVmaW5lIEVTUF9DQ0ZfTkVWRVIgICAgICAgICAweDAxICAgICAgICAgICAgIC8qIFNldCBpdCB0byB0aGlzIGFuZCBkaWUgKi8KLSNkZWZpbmUgRVNQX0NDRl9GMiAgICAgICAgICAgIDB4MDIgICAgICAgICAgICAgLyogMTBNSHogKi8KLSNkZWZpbmUgRVNQX0NDRl9GMyAgICAgICAgICAgIDB4MDMgICAgICAgICAgICAgLyogMTAuMDFNSHogLSAxNU1IeiAqLwotI2RlZmluZSBFU1BfQ0NGX0Y0ICAgICAgICAgICAgMHgwNCAgICAgICAgICAgICAvKiAxNS4wMU1IeiAtIDIwTUh6ICovCi0jZGVmaW5lIEVTUF9DQ0ZfRjUgICAgICAgICAgICAweDA1ICAgICAgICAgICAgIC8qIDIwLjAxTUh6IC0gMjVNSHogKi8KLSNkZWZpbmUgRVNQX0NDRl9GNiAgICAgICAgICAgIDB4MDYgICAgICAgICAgICAgLyogMjUuMDFNSHogLSAzME1IeiAqLwotI2RlZmluZSBFU1BfQ0NGX0Y3ICAgICAgICAgICAgMHgwNyAgICAgICAgICAgICAvKiAzMC4wMU1IeiAtIDM1TUh6ICovCi0KLS8qIEhNRSBvbmx5Li4uICovCi0jZGVmaW5lIEVTUF9CVVNJRF9SRVNFTElEICAgICAweDEwCi0jZGVmaW5lIEVTUF9CVVNJRF9DVFIzMkJJVCAgICAweDQwCi0KLSNkZWZpbmUgRVNQX0JVU19USU1FT1VUICAgICAgICAyNzUgICAgICAgICAgICAgLyogSW4gbWlsbGktc2Vjb25kcyAqLwotI2RlZmluZSBFU1BfVElNRU9fQ09OU1QgICAgICAgODE5MgotI2RlZmluZSBFU1BfTkVHX0RFRlAobWh6LCBjZmFjdCkgXAotICAgICAgICAoKEVTUF9CVVNfVElNRU9VVCAqICgobWh6KSAvIDEwMDApKSAvICg4MTkyICogKGNmYWN0KSkpCi0jZGVmaW5lIEVTUF9NSFpfVE9fQ1lDTEUobWhlcnR6KSAgKCgxMDAwMDAwMDAwKSAvICgobWhlcnR6KSAvIDEwMDApKQotI2RlZmluZSBFU1BfVElDSyhjY2YsIGN5Y2xlKSAgKCg3NjgyICogKGNjZikgKiAoY3ljbGUpIC8gMTAwMCkpCi0KLSNlbmRpZiAvKiAhKF9TUEFSQ19FU1BfSCkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9lc3Bfc2NzaS5jIGIvZHJpdmVycy9zY3NpL2VzcF9zY3NpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTljZTAzMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9lc3Bfc2NzaS5jCkBAIC0wLDAgKzEsMjcxMSBAQAorLyogZXNwX3Njc2kuYzogRVNQIFNDU0kgZHJpdmVyLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQGRhdmVtbG9mdC5uZXQpCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9rYWxsc3ltcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycXJldHVybi5oPgorCisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKworI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX3RjcS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9kYmcuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfdHJhbnNwb3J0X3NwaS5oPgorCisjaW5jbHVkZSAiZXNwX3Njc2kuaCIKKworI2RlZmluZSBEUlZfTU9EVUxFX05BTUUJCSJlc3AiCisjZGVmaW5lIFBGWCBEUlZfTU9EVUxFX05BTUUJIjogIgorI2RlZmluZSBEUlZfVkVSU0lPTgkJIjIuMDAwIgorI2RlZmluZSBEUlZfTU9EVUxFX1JFTERBVEUJIkFwcmlsIDE5LCAyMDA3IgorCisvKiBTQ1NJIGJ1cyByZXNldCBzZXR0bGUgdGltZSBpbiBzZWNvbmRzLiAgKi8KK3N0YXRpYyBpbnQgZXNwX2J1c19yZXNldF9zZXR0bGUgPSAzOworCitzdGF0aWMgdTMyIGVzcF9kZWJ1ZzsKKyNkZWZpbmUgRVNQX0RFQlVHX0lOVFIJCTB4MDAwMDAwMDEKKyNkZWZpbmUgRVNQX0RFQlVHX1NDU0lDTUQJMHgwMDAwMDAwMgorI2RlZmluZSBFU1BfREVCVUdfUkVTRVQJCTB4MDAwMDAwMDQKKyNkZWZpbmUgRVNQX0RFQlVHX01TR0lOCQkweDAwMDAwMDA4CisjZGVmaW5lIEVTUF9ERUJVR19NU0dPVVQJMHgwMDAwMDAxMAorI2RlZmluZSBFU1BfREVCVUdfQ01ERE9ORQkweDAwMDAwMDIwCisjZGVmaW5lIEVTUF9ERUJVR19ESVNDT05ORUNUCTB4MDAwMDAwNDAKKyNkZWZpbmUgRVNQX0RFQlVHX0RBVEFTVEFSVAkweDAwMDAwMDgwCisjZGVmaW5lIEVTUF9ERUJVR19EQVRBRE9ORQkweDAwMDAwMTAwCisjZGVmaW5lIEVTUF9ERUJVR19SRUNPTk5FQ1QJMHgwMDAwMDIwMAorI2RlZmluZSBFU1BfREVCVUdfQVVUT1NFTlNFCTB4MDAwMDA0MDAKKworI2RlZmluZSBlc3BfbG9nX2ludHIoZiwgYS4uLikgXAorZG8gewlpZiAoZXNwX2RlYnVnICYgRVNQX0RFQlVHX0lOVFIpIFwKKwkJcHJpbnRrKGYsICMjIGEpOyBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIGVzcF9sb2dfcmVzZXQoZiwgYS4uLikgXAorZG8gewlpZiAoZXNwX2RlYnVnICYgRVNQX0RFQlVHX1JFU0VUKSBcCisJCXByaW50ayhmLCAjIyBhKTsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBlc3BfbG9nX21zZ2luKGYsIGEuLi4pIFwKK2RvIHsJaWYgKGVzcF9kZWJ1ZyAmIEVTUF9ERUJVR19NU0dJTikgXAorCQlwcmludGsoZiwgIyMgYSk7IFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgZXNwX2xvZ19tc2dvdXQoZiwgYS4uLikgXAorZG8gewlpZiAoZXNwX2RlYnVnICYgRVNQX0RFQlVHX01TR09VVCkgXAorCQlwcmludGsoZiwgIyMgYSk7IFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgZXNwX2xvZ19jbWRkb25lKGYsIGEuLi4pIFwKK2RvIHsJaWYgKGVzcF9kZWJ1ZyAmIEVTUF9ERUJVR19DTURET05FKSBcCisJCXByaW50ayhmLCAjIyBhKTsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBlc3BfbG9nX2Rpc2Nvbm5lY3QoZiwgYS4uLikgXAorZG8gewlpZiAoZXNwX2RlYnVnICYgRVNQX0RFQlVHX0RJU0NPTk5FQ1QpIFwKKwkJcHJpbnRrKGYsICMjIGEpOyBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIGVzcF9sb2dfZGF0YXN0YXJ0KGYsIGEuLi4pIFwKK2RvIHsJaWYgKGVzcF9kZWJ1ZyAmIEVTUF9ERUJVR19EQVRBU1RBUlQpIFwKKwkJcHJpbnRrKGYsICMjIGEpOyBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIGVzcF9sb2dfZGF0YWRvbmUoZiwgYS4uLikgXAorZG8gewlpZiAoZXNwX2RlYnVnICYgRVNQX0RFQlVHX0RBVEFET05FKSBcCisJCXByaW50ayhmLCAjIyBhKTsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBlc3BfbG9nX3JlY29ubmVjdChmLCBhLi4uKSBcCitkbyB7CWlmIChlc3BfZGVidWcgJiBFU1BfREVCVUdfUkVDT05ORUNUKSBcCisJCXByaW50ayhmLCAjIyBhKTsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBlc3BfbG9nX2F1dG9zZW5zZShmLCBhLi4uKSBcCitkbyB7CWlmIChlc3BfZGVidWcgJiBFU1BfREVCVUdfQVVUT1NFTlNFKSBcCisJCXByaW50ayhmLCAjIyBhKTsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBlc3BfcmVhZDgoUkVHKQkJZXNwLT5vcHMtPmVzcF9yZWFkOChlc3AsIFJFRykKKyNkZWZpbmUgZXNwX3dyaXRlOChWQUwsUkVHKQllc3AtPm9wcy0+ZXNwX3dyaXRlOChlc3AsIFZBTCwgUkVHKQorCitzdGF0aWMgdm9pZCBlc3BfbG9nX2ZpbGxfcmVncyhzdHJ1Y3QgZXNwICplc3AsCisJCQkgICAgICBzdHJ1Y3QgZXNwX2V2ZW50X2VudCAqcCkKK3sKKwlwLT5zcmVnID0gZXNwLT5zcmVnOworCXAtPnNlcXJlZyA9IGVzcC0+c2VxcmVnOworCXAtPnNyZWcyID0gZXNwLT5zcmVnMjsKKwlwLT5pcmVnID0gZXNwLT5pcmVnOworCXAtPnNlbGVjdF9zdGF0ZSA9IGVzcC0+c2VsZWN0X3N0YXRlOworCXAtPmV2ZW50ID0gZXNwLT5ldmVudDsKK30KKwordm9pZCBzY3NpX2VzcF9jbWQoc3RydWN0IGVzcCAqZXNwLCB1OCB2YWwpCit7CisJc3RydWN0IGVzcF9ldmVudF9lbnQgKnA7CisJaW50IGlkeCA9IGVzcC0+ZXNwX2V2ZW50X2N1cjsKKworCXAgPSAmZXNwLT5lc3BfZXZlbnRfbG9nW2lkeF07CisJcC0+dHlwZSA9IEVTUF9FVkVOVF9UWVBFX0NNRDsKKwlwLT52YWwgPSB2YWw7CisJZXNwX2xvZ19maWxsX3JlZ3MoZXNwLCBwKTsKKworCWVzcC0+ZXNwX2V2ZW50X2N1ciA9IChpZHggKyAxKSAmIChFU1BfRVZFTlRfTE9HX1NaIC0gMSk7CisKKwllc3Bfd3JpdGU4KHZhbCwgRVNQX0NNRCk7Cit9CitFWFBPUlRfU1lNQk9MKHNjc2lfZXNwX2NtZCk7CisKK3N0YXRpYyB2b2lkIGVzcF9ldmVudChzdHJ1Y3QgZXNwICplc3AsIHU4IHZhbCkKK3sKKwlzdHJ1Y3QgZXNwX2V2ZW50X2VudCAqcDsKKwlpbnQgaWR4ID0gZXNwLT5lc3BfZXZlbnRfY3VyOworCisJcCA9ICZlc3AtPmVzcF9ldmVudF9sb2dbaWR4XTsKKwlwLT50eXBlID0gRVNQX0VWRU5UX1RZUEVfRVZFTlQ7CisJcC0+dmFsID0gdmFsOworCWVzcF9sb2dfZmlsbF9yZWdzKGVzcCwgcCk7CisKKwllc3AtPmVzcF9ldmVudF9jdXIgPSAoaWR4ICsgMSkgJiAoRVNQX0VWRU5UX0xPR19TWiAtIDEpOworCisJZXNwLT5ldmVudCA9IHZhbDsKK30KKworc3RhdGljIHZvaWQgZXNwX2R1bXBfY21kX2xvZyhzdHJ1Y3QgZXNwICplc3ApCit7CisJaW50IGlkeCA9IGVzcC0+ZXNwX2V2ZW50X2N1cjsKKwlpbnQgc3RvcCA9IGlkeDsKKworCXByaW50ayhLRVJOX0lORk8gUEZYICJlc3AlZDogRHVtcGluZyBjb21tYW5kIGxvZ1xuIiwKKwkgICAgICAgZXNwLT5ob3N0LT51bmlxdWVfaWQpOworCWRvIHsKKwkJc3RydWN0IGVzcF9ldmVudF9lbnQgKnAgPSAmZXNwLT5lc3BfZXZlbnRfbG9nW2lkeF07CisKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggImVzcCVkOiBlbnRbJWRdICVzICIsCisJCSAgICAgICBlc3AtPmhvc3QtPnVuaXF1ZV9pZCwgaWR4LAorCQkgICAgICAgcC0+dHlwZSA9PSBFU1BfRVZFTlRfVFlQRV9DTUQgPyAiQ01EIiA6ICJFVkVOVCIpOworCisJCXByaW50aygidmFsWyUwMnhdIHNyZWdbJTAyeF0gc2VxcmVnWyUwMnhdICIKKwkJICAgICAgICJzcmVnMlslMDJ4XSBpcmVnWyUwMnhdIHNzWyUwMnhdIGV2ZW50WyUwMnhdXG4iLAorCQkgICAgICAgcC0+dmFsLCBwLT5zcmVnLCBwLT5zZXFyZWcsCisJCSAgICAgICBwLT5zcmVnMiwgcC0+aXJlZywgcC0+c2VsZWN0X3N0YXRlLCBwLT5ldmVudCk7CisKKwkJaWR4ID0gKGlkeCArIDEpICYgKEVTUF9FVkVOVF9MT0dfU1ogLSAxKTsKKwl9IHdoaWxlIChpZHggIT0gc3RvcCk7Cit9CisKK3N0YXRpYyB2b2lkIGVzcF9mbHVzaF9maWZvKHN0cnVjdCBlc3AgKmVzcCkKK3sKKwlzY3NpX2VzcF9jbWQoZXNwLCBFU1BfQ01EX0ZMVVNIKTsKKwlpZiAoZXNwLT5yZXYgPT0gRVNQMjM2KSB7CisJCWludCBsaW0gPSAxMDAwOworCisJCXdoaWxlIChlc3BfcmVhZDgoRVNQX0ZGTEFHUykgJiBFU1BfRkZfRkJZVEVTKSB7CisJCQlpZiAoLS1saW0gPT0gMCkgeworCQkJCXByaW50ayhLRVJOX0FMRVJUIFBGWCAiZXNwJWQ6IEVTUF9GRl9CWVRFUyAiCisJCQkJICAgICAgICJ3aWxsIG5vdCBjbGVhciFcbiIsCisJCQkJICAgICAgIGVzcC0+aG9zdC0+dW5pcXVlX2lkKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXVkZWxheSgxKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgaG1lX3JlYWRfZmlmbyhzdHJ1Y3QgZXNwICplc3ApCit7CisJaW50IGZjbnQgPSBlc3BfcmVhZDgoRVNQX0ZGTEFHUykgJiBFU1BfRkZfRkJZVEVTOworCWludCBpZHggPSAwOworCisJd2hpbGUgKGZjbnQtLSkgeworCQllc3AtPmZpZm9baWR4KytdID0gZXNwX3JlYWQ4KEVTUF9GREFUQSk7CisJCWVzcC0+Zmlmb1tpZHgrK10gPSBlc3BfcmVhZDgoRVNQX0ZEQVRBKTsKKwl9CisJaWYgKGVzcC0+c3JlZzIgJiBFU1BfU1RBVDJfRjFCWVRFKSB7CisJCWVzcF93cml0ZTgoMCwgRVNQX0ZEQVRBKTsKKwkJZXNwLT5maWZvW2lkeCsrXSA9IGVzcF9yZWFkOChFU1BfRkRBVEEpOworCQlzY3NpX2VzcF9jbWQoZXNwLCBFU1BfQ01EX0ZMVVNIKTsKKwl9CisJZXNwLT5maWZvX2NudCA9IGlkeDsKK30KKworc3RhdGljIHZvaWQgZXNwX3NldF9hbGxfY29uZmlnMyhzdHJ1Y3QgZXNwICplc3AsIHU4IHZhbCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBFU1BfTUFYX1RBUkdFVDsgaSsrKQorCQllc3AtPnRhcmdldFtpXS5lc3BfY29uZmlnMyA9IHZhbDsKK30KKworLyogUmVzZXQgdGhlIEVTUCBjaGlwLCBfbm90XyB0aGUgU0NTSSBidXMuICovCitzdGF0aWMgdm9pZCBlc3BfcmVzZXRfZXNwKHN0cnVjdCBlc3AgKmVzcCkKK3sKKwl1OCBmYW1pbHlfY29kZSwgdmVyc2lvbjsKKworCS8qIE5vdyByZXNldCB0aGUgRVNQIGNoaXAgKi8KKwlzY3NpX2VzcF9jbWQoZXNwLCBFU1BfQ01EX1JDKTsKKwlzY3NpX2VzcF9jbWQoZXNwLCBFU1BfQ01EX05VTEwgfCBFU1BfQ01EX0RNQSk7CisJc2NzaV9lc3BfY21kKGVzcCwgRVNQX0NNRF9OVUxMIHwgRVNQX0NNRF9ETUEpOworCisJLyogUmVsb2FkIHRoZSBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyAqLworCWVzcF93cml0ZTgoZXNwLT5jZmFjdCwgRVNQX0NGQUNUKTsKKworCWVzcC0+cHJldl9zdHAgPSAwOworCWVzcF93cml0ZTgoZXNwLT5wcmV2X3N0cCwgRVNQX1NUUCk7CisKKwllc3AtPnByZXZfc29mZiA9IDA7CisJZXNwX3dyaXRlOChlc3AtPnByZXZfc29mZiwgRVNQX1NPRkYpOworCisJZXNwX3dyaXRlOChlc3AtPm5lZ19kZWZwLCBFU1BfVElNRU8pOworCisJLyogVGhpcyBpcyB0aGUgb25seSBwb2ludCBhdCB3aGljaCBpdCBpcyByZWxpYWJsZSB0byByZWFkCisJICogdGhlIElELWNvZGUgZm9yIGEgZmFzdCBFU1AgY2hpcCB2YXJpYW50cy4KKwkgKi8KKwllc3AtPm1heF9wZXJpb2QgPSAoKDM1ICogZXNwLT5jY3ljbGUpIC8gMTAwMCk7CisJaWYgKGVzcC0+cmV2ID09IEZBU1QpIHsKKwkJdmVyc2lvbiA9IGVzcF9yZWFkOChFU1BfVUlEKTsKKwkJZmFtaWx5X2NvZGUgPSAodmVyc2lvbiAmIDB4ZjgpID4+IDM7CisJCWlmIChmYW1pbHlfY29kZSA9PSAweDAyKQorCQkJZXNwLT5yZXYgPSBGQVMyMzY7CisJCWVsc2UgaWYgKGZhbWlseV9jb2RlID09IDB4MGEpCisJCQllc3AtPnJldiA9IEZBU0hNRTsgLyogVmVyc2lvbiBpcyB1c3VhbGx5ICc1Jy4gKi8KKwkJZWxzZQorCQkJZXNwLT5yZXYgPSBGQVMxMDBBOworCQllc3AtPm1pbl9wZXJpb2QgPSAoKDQgKiBlc3AtPmNjeWNsZSkgLyAxMDAwKTsKKwl9IGVsc2UgeworCQllc3AtPm1pbl9wZXJpb2QgPSAoKDUgKiBlc3AtPmNjeWNsZSkgLyAxMDAwKTsKKwl9CisJZXNwLT5tYXhfcGVyaW9kID0gKGVzcC0+bWF4X3BlcmlvZCArIDMpPj4yOworCWVzcC0+bWluX3BlcmlvZCA9IChlc3AtPm1pbl9wZXJpb2QgKyAzKT4+MjsKKworCWVzcF93cml0ZTgoZXNwLT5jb25maWcxLCBFU1BfQ0ZHMSk7CisJc3dpdGNoIChlc3AtPnJldikgeworCWNhc2UgRVNQMTAwOgorCQkvKiBub3RoaW5nIHRvIGRvICovCisJCWJyZWFrOworCisJY2FzZSBFU1AxMDBBOgorCQllc3Bfd3JpdGU4KGVzcC0+Y29uZmlnMiwgRVNQX0NGRzIpOworCQlicmVhazsKKworCWNhc2UgRVNQMjM2OgorCQkvKiBTbG93IDIzNiAqLworCQllc3Bfd3JpdGU4KGVzcC0+Y29uZmlnMiwgRVNQX0NGRzIpOworCQllc3AtPnByZXZfY2ZnMyA9IGVzcC0+dGFyZ2V0WzBdLmVzcF9jb25maWczOworCQllc3Bfd3JpdGU4KGVzcC0+cHJldl9jZmczLCBFU1BfQ0ZHMyk7CisJCWJyZWFrOworCisJY2FzZSBGQVNITUU6CisJCWVzcC0+Y29uZmlnMiB8PSAoRVNQX0NPTkZJRzJfSE1FMzIgfCBFU1BfQ09ORklHMl9ITUVGRU5BQik7CisJCS8qIGZhbGx0aHJvdWdoLi4uICovCisKKwljYXNlIEZBUzIzNjoKKwkJLyogRmFzdCAyMzYgb3IgSE1FICovCisJCWVzcF93cml0ZTgoZXNwLT5jb25maWcyLCBFU1BfQ0ZHMik7CisJCWlmIChlc3AtPnJldiA9PSBGQVNITUUpIHsKKwkJCXU4IGNmZzMgPSBlc3AtPnRhcmdldFswXS5lc3BfY29uZmlnMzsKKworCQkJY2ZnMyB8PSBFU1BfQ09ORklHM19GQ0xPQ0sgfCBFU1BfQ09ORklHM19PQlBVU0g7CisJCQlpZiAoZXNwLT5zY3NpX2lkID49IDgpCisJCQkJY2ZnMyB8PSBFU1BfQ09ORklHM19JREJJVDM7CisJCQllc3Bfc2V0X2FsbF9jb25maWczKGVzcCwgY2ZnMyk7CisJCX0gZWxzZSB7CisJCQl1MzIgY2ZnMyA9IGVzcC0+dGFyZ2V0WzBdLmVzcF9jb25maWczOworCisJCQljZmczIHw9IEVTUF9DT05GSUczX0ZDTEs7CisJCQllc3Bfc2V0X2FsbF9jb25maWczKGVzcCwgY2ZnMyk7CisJCX0KKwkJZXNwLT5wcmV2X2NmZzMgPSBlc3AtPnRhcmdldFswXS5lc3BfY29uZmlnMzsKKwkJZXNwX3dyaXRlOChlc3AtPnByZXZfY2ZnMywgRVNQX0NGRzMpOworCQlpZiAoZXNwLT5yZXYgPT0gRkFTSE1FKSB7CisJCQllc3AtPnJhZGVsYXkgPSA4MDsKKwkJfSBlbHNlIHsKKwkJCWlmIChlc3AtPmZsYWdzICYgRVNQX0ZMQUdfRElGRkVSRU5USUFMKQorCQkJCWVzcC0+cmFkZWxheSA9IDA7CisJCQllbHNlCisJCQkJZXNwLT5yYWRlbGF5ID0gOTY7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEZBUzEwMEE6CisJCS8qIEZhc3QgMTAwYSAqLworCQllc3Bfd3JpdGU4KGVzcC0+Y29uZmlnMiwgRVNQX0NGRzIpOworCQllc3Bfc2V0X2FsbF9jb25maWczKGVzcCwKKwkJCQkgICAgKGVzcC0+dGFyZ2V0WzBdLmVzcF9jb25maWczIHwKKwkJCQkgICAgIEVTUF9DT05GSUczX0ZDTE9DSykpOworCQllc3AtPnByZXZfY2ZnMyA9IGVzcC0+dGFyZ2V0WzBdLmVzcF9jb25maWczOworCQllc3Bfd3JpdGU4KGVzcC0+cHJldl9jZmczLCBFU1BfQ0ZHMyk7CisJCWVzcC0+cmFkZWxheSA9IDMyOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCS8qIEVhdCBhbnkgYml0cm90IGluIHRoZSBjaGlwICovCisJZXNwX3JlYWQ4KEVTUF9JTlRSUFQpOworCXVkZWxheSgxMDApOworfQorCitzdGF0aWMgdm9pZCBlc3BfbWFwX2RtYShzdHJ1Y3QgZXNwICplc3AsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwlzdHJ1Y3QgZXNwX2NtZF9wcml2ICpzcHJpdiA9IEVTUF9DTURfUFJJVihjbWQpOworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2cgPSBjbWQtPnJlcXVlc3RfYnVmZmVyOworCWludCBkaXIgPSBjbWQtPnNjX2RhdGFfZGlyZWN0aW9uOworCWludCB0b3RhbCwgaTsKKworCWlmIChkaXIgPT0gRE1BX05PTkUpCisJCXJldHVybjsKKworCUJVR19PTihjbWQtPnVzZV9zZyA9PSAwKTsKKworCXNwcml2LT51Lm51bV9zZyA9IGVzcC0+b3BzLT5tYXBfc2coZXNwLCBzZywKKwkJCQkJICAgY21kLT51c2Vfc2csIGRpcik7CisJc3ByaXYtPmN1cl9yZXNpZHVlID0gc2dfZG1hX2xlbihzZyk7CisJc3ByaXYtPmN1cl9zZyA9IHNnOworCisJdG90YWwgPSAwOworCWZvciAoaSA9IDA7IGkgPCBzcHJpdi0+dS5udW1fc2c7IGkrKykKKwkJdG90YWwgKz0gc2dfZG1hX2xlbigmc2dbaV0pOworCXNwcml2LT50b3RfcmVzaWR1ZSA9IHRvdGFsOworfQorCitzdGF0aWMgZG1hX2FkZHJfdCBlc3BfY3VyX2RtYV9hZGRyKHN0cnVjdCBlc3BfY21kX2VudHJ5ICplbnQsCisJCQkJICAgc3RydWN0IHNjc2lfY21uZCAqY21kKQoreworCXN0cnVjdCBlc3BfY21kX3ByaXYgKnAgPSBFU1BfQ01EX1BSSVYoY21kKTsKKworCWlmIChlbnQtPmZsYWdzICYgRVNQX0NNRF9GTEFHX0FVVE9TRU5TRSkgeworCQlyZXR1cm4gZW50LT5zZW5zZV9kbWEgKworCQkJKGVudC0+c2Vuc2VfcHRyIC0gY21kLT5zZW5zZV9idWZmZXIpOworCX0KKworCXJldHVybiBzZ19kbWFfYWRkcmVzcyhwLT5jdXJfc2cpICsKKwkJKHNnX2RtYV9sZW4ocC0+Y3VyX3NnKSAtCisJCSBwLT5jdXJfcmVzaWR1ZSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZXNwX2N1cl9kbWFfbGVuKHN0cnVjdCBlc3BfY21kX2VudHJ5ICplbnQsCisJCQkJICAgIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwlzdHJ1Y3QgZXNwX2NtZF9wcml2ICpwID0gRVNQX0NNRF9QUklWKGNtZCk7CisKKwlpZiAoZW50LT5mbGFncyAmIEVTUF9DTURfRkxBR19BVVRPU0VOU0UpIHsKKwkJcmV0dXJuIFNDU0lfU0VOU0VfQlVGRkVSU0laRSAtCisJCQkoZW50LT5zZW5zZV9wdHIgLSBjbWQtPnNlbnNlX2J1ZmZlcik7CisJfQorCXJldHVybiBwLT5jdXJfcmVzaWR1ZTsKK30KKworc3RhdGljIHZvaWQgZXNwX2FkdmFuY2VfZG1hKHN0cnVjdCBlc3AgKmVzcCwgc3RydWN0IGVzcF9jbWRfZW50cnkgKmVudCwKKwkJCSAgICBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsIHVuc2lnbmVkIGludCBsZW4pCit7CisJc3RydWN0IGVzcF9jbWRfcHJpdiAqcCA9IEVTUF9DTURfUFJJVihjbWQpOworCisJaWYgKGVudC0+ZmxhZ3MgJiBFU1BfQ01EX0ZMQUdfQVVUT1NFTlNFKSB7CisJCWVudC0+c2Vuc2VfcHRyICs9IGxlbjsKKwkJcmV0dXJuOworCX0KKworCXAtPmN1cl9yZXNpZHVlIC09IGxlbjsKKwlwLT50b3RfcmVzaWR1ZSAtPSBsZW47CisJaWYgKHAtPmN1cl9yZXNpZHVlIDwgMCB8fCBwLT50b3RfcmVzaWR1ZSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiZXNwJWQ6IERhdGEgdHJhbnNmZXIgb3ZlcmZsb3cuXG4iLAorCQkgICAgICAgZXNwLT5ob3N0LT51bmlxdWVfaWQpOworCQlwcmludGsoS0VSTl9FUlIgUEZYICJlc3AlZDogY3VyX3Jlc2lkdWVbJWRdIHRvdF9yZXNpZHVlWyVkXSAiCisJCSAgICAgICAibGVuWyV1XVxuIiwKKwkJICAgICAgIGVzcC0+aG9zdC0+dW5pcXVlX2lkLAorCQkgICAgICAgcC0+Y3VyX3Jlc2lkdWUsIHAtPnRvdF9yZXNpZHVlLCBsZW4pOworCQlwLT5jdXJfcmVzaWR1ZSA9IDA7CisJCXAtPnRvdF9yZXNpZHVlID0gMDsKKwl9CisJaWYgKCFwLT5jdXJfcmVzaWR1ZSAmJiBwLT50b3RfcmVzaWR1ZSkgeworCQlwLT5jdXJfc2crKzsKKwkJcC0+Y3VyX3Jlc2lkdWUgPSBzZ19kbWFfbGVuKHAtPmN1cl9zZyk7CisJfQorfQorCitzdGF0aWMgdm9pZCBlc3BfdW5tYXBfZG1hKHN0cnVjdCBlc3AgKmVzcCwgc3RydWN0IHNjc2lfY21uZCAqY21kKQoreworCXN0cnVjdCBlc3BfY21kX3ByaXYgKnNwcml2ID0gRVNQX0NNRF9QUklWKGNtZCk7CisJaW50IGRpciA9IGNtZC0+c2NfZGF0YV9kaXJlY3Rpb247CisKKwlpZiAoZGlyID09IERNQV9OT05FKQorCQlyZXR1cm47CisKKwllc3AtPm9wcy0+dW5tYXBfc2coZXNwLCBjbWQtPnJlcXVlc3RfYnVmZmVyLAorCQkJICAgc3ByaXYtPnUubnVtX3NnLCBkaXIpOworfQorCitzdGF0aWMgdm9pZCBlc3Bfc2F2ZV9wb2ludGVycyhzdHJ1Y3QgZXNwICplc3AsIHN0cnVjdCBlc3BfY21kX2VudHJ5ICplbnQpCit7CisJc3RydWN0IHNjc2lfY21uZCAqY21kID0gZW50LT5jbWQ7CisJc3RydWN0IGVzcF9jbWRfcHJpdiAqc3ByaXYgPSBFU1BfQ01EX1BSSVYoY21kKTsKKworCWlmIChlbnQtPmZsYWdzICYgRVNQX0NNRF9GTEFHX0FVVE9TRU5TRSkgeworCQllbnQtPnNhdmVkX3NlbnNlX3B0ciA9IGVudC0+c2Vuc2VfcHRyOworCQlyZXR1cm47CisJfQorCWVudC0+c2F2ZWRfY3VyX3Jlc2lkdWUgPSBzcHJpdi0+Y3VyX3Jlc2lkdWU7CisJZW50LT5zYXZlZF9jdXJfc2cgPSBzcHJpdi0+Y3VyX3NnOworCWVudC0+c2F2ZWRfdG90X3Jlc2lkdWUgPSBzcHJpdi0+dG90X3Jlc2lkdWU7Cit9CisKK3N0YXRpYyB2b2lkIGVzcF9yZXN0b3JlX3BvaW50ZXJzKHN0cnVjdCBlc3AgKmVzcCwgc3RydWN0IGVzcF9jbWRfZW50cnkgKmVudCkKK3sKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQgPSBlbnQtPmNtZDsKKwlzdHJ1Y3QgZXNwX2NtZF9wcml2ICpzcHJpdiA9IEVTUF9DTURfUFJJVihjbWQpOworCisJaWYgKGVudC0+ZmxhZ3MgJiBFU1BfQ01EX0ZMQUdfQVVUT1NFTlNFKSB7CisJCWVudC0+c2Vuc2VfcHRyID0gZW50LT5zYXZlZF9zZW5zZV9wdHI7CisJCXJldHVybjsKKwl9CisJc3ByaXYtPmN1cl9yZXNpZHVlID0gZW50LT5zYXZlZF9jdXJfcmVzaWR1ZTsKKwlzcHJpdi0+Y3VyX3NnID0gZW50LT5zYXZlZF9jdXJfc2c7CisJc3ByaXYtPnRvdF9yZXNpZHVlID0gZW50LT5zYXZlZF90b3RfcmVzaWR1ZTsKK30KKworc3RhdGljIHZvaWQgZXNwX2NoZWNrX2NvbW1hbmRfbGVuKHN0cnVjdCBlc3AgKmVzcCwgc3RydWN0IHNjc2lfY21uZCAqY21kKQoreworCWlmIChjbWQtPmNtZF9sZW4gPT0gNiB8fAorCSAgICBjbWQtPmNtZF9sZW4gPT0gMTAgfHwKKwkgICAgY21kLT5jbWRfbGVuID09IDEyKSB7CisJCWVzcC0+ZmxhZ3MgJj0gfkVTUF9GTEFHX0RPSU5HX1NMT1dDTUQ7CisJfSBlbHNlIHsKKwkJZXNwLT5mbGFncyB8PSBFU1BfRkxBR19ET0lOR19TTE9XQ01EOworCX0KK30KKworc3RhdGljIHZvaWQgZXNwX3dyaXRlX3RndF9jb25maWczKHN0cnVjdCBlc3AgKmVzcCwgaW50IHRndCkKK3sKKwlpZiAoZXNwLT5yZXYgPiBFU1AxMDBBKSB7CisJCXU4IHZhbCA9IGVzcC0+dGFyZ2V0W3RndF0uZXNwX2NvbmZpZzM7CisKKwkJaWYgKHZhbCAhPSBlc3AtPnByZXZfY2ZnMykgeworCQkJZXNwLT5wcmV2X2NmZzMgPSB2YWw7CisJCQllc3Bfd3JpdGU4KHZhbCwgRVNQX0NGRzMpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBlc3Bfd3JpdGVfdGd0X3N5bmMoc3RydWN0IGVzcCAqZXNwLCBpbnQgdGd0KQoreworCXU4IG9mZiA9IGVzcC0+dGFyZ2V0W3RndF0uZXNwX29mZnNldDsKKwl1OCBwZXIgPSBlc3AtPnRhcmdldFt0Z3RdLmVzcF9wZXJpb2Q7CisKKwlpZiAob2ZmICE9IGVzcC0+cHJldl9zb2ZmKSB7CisJCWVzcC0+cHJldl9zb2ZmID0gb2ZmOworCQllc3Bfd3JpdGU4KG9mZiwgRVNQX1NPRkYpOworCX0KKwlpZiAocGVyICE9IGVzcC0+cHJldl9zdHApIHsKKwkJZXNwLT5wcmV2X3N0cCA9IHBlcjsKKwkJZXNwX3dyaXRlOChwZXIsIEVTUF9TVFApOworCX0KK30KKworc3RhdGljIHUzMiBlc3BfZG1hX2xlbmd0aF9saW1pdChzdHJ1Y3QgZXNwICplc3AsIHUzMiBkbWFfYWRkciwgdTMyIGRtYV9sZW4pCit7CisJaWYgKGVzcC0+cmV2ID09IEZBU0hNRSkgeworCQkvKiBBcmJpdHJhcnkgc2VnbWVudCBib3VuZGFyaWVzLCAyNC1iaXQgY291bnRzLiAgKi8KKwkJaWYgKGRtYV9sZW4gPiAoMVUgPDwgMjQpKQorCQkJZG1hX2xlbiA9ICgxVSA8PCAyNCk7CisJfSBlbHNlIHsKKwkJdTMyIGJhc2UsIGVuZDsKKworCQkvKiBFU1AgY2hpcCBsaW1pdHMgb3RoZXIgdmFyaWFudHMgYnkgMTYtYml0cyBvZiB0cmFuc2ZlcgorCQkgKiBjb3VudC4gIEFjdHVhbGx5IG9uIEZBUzEwMEEgYW5kIEZBUzIzNiB3ZSBjb3VsZCBnZXQKKwkJICogMjQtYml0cyBvZiB0cmFuc2ZlciBjb3VudCBieSBlbmFibGluZyBFU1BfQ09ORklHMl9GRU5BQgorCQkgKiBpbiB0aGUgRVNQX0NGRzIgcmVnaXN0ZXIgYnV0IHRoYXQgY2F1c2VzIG90aGVyIHVud2FudGVkCisJCSAqIGNoYW5nZXMgc28gd2UgZG9uJ3QgdXNlIGl0IGN1cnJlbnRseS4KKwkJICovCisJCWlmIChkbWFfbGVuID4gKDFVIDw8IDE2KSkKKwkJCWRtYV9sZW4gPSAoMVUgPDwgMTYpOworCisJCS8qIEFsbCBvZiB0aGUgRE1BIHZhcmlhbnRzIGhvb2tlZCB1cCB0byB0aGVzZSBjaGlwcworCQkgKiBjYW5ub3QgaGFuZGxlIGNyb3NzaW5nIGEgMjQtYml0IGFkZHJlc3MgYm91bmRhcnkuCisJCSAqLworCQliYXNlID0gZG1hX2FkZHIgJiAoKDFVIDw8IDI0KSAtIDFVKTsKKwkJZW5kID0gYmFzZSArIGRtYV9sZW47CisJCWlmIChlbmQgPiAoMVUgPDwgMjQpKQorCQkJZW5kID0gKDFVIDw8MjQpOworCQlkbWFfbGVuID0gZW5kIC0gYmFzZTsKKwl9CisJcmV0dXJuIGRtYV9sZW47Cit9CisKK3N0YXRpYyBpbnQgZXNwX25lZWRfdG9fbmVnb193aWRlKHN0cnVjdCBlc3BfdGFyZ2V0X2RhdGEgKnRwKQoreworCXN0cnVjdCBzY3NpX3RhcmdldCAqdGFyZ2V0ID0gdHAtPnN0YXJnZXQ7CisKKwlyZXR1cm4gc3BpX3dpZHRoKHRhcmdldCkgIT0gdHAtPm5lZ29fZ29hbF93aWR0aDsKK30KKworc3RhdGljIGludCBlc3BfbmVlZF90b19uZWdvX3N5bmMoc3RydWN0IGVzcF90YXJnZXRfZGF0YSAqdHApCit7CisJc3RydWN0IHNjc2lfdGFyZ2V0ICp0YXJnZXQgPSB0cC0+c3RhcmdldDsKKworCS8qIFdoZW4gb2Zmc2V0IGlzIHplcm8sIHBlcmlvZCBpcyAiZG9uJ3QgY2FyZSIuICAqLworCWlmICghc3BpX29mZnNldCh0YXJnZXQpICYmICF0cC0+bmVnb19nb2FsX29mZnNldCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoc3BpX29mZnNldCh0YXJnZXQpID09IHRwLT5uZWdvX2dvYWxfb2Zmc2V0ICYmCisJICAgIHNwaV9wZXJpb2QodGFyZ2V0KSA9PSB0cC0+bmVnb19nb2FsX3BlcmlvZCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBlc3BfYWxsb2NfbHVuX3RhZyhzdHJ1Y3QgZXNwX2NtZF9lbnRyeSAqZW50LAorCQkJICAgICBzdHJ1Y3QgZXNwX2x1bl9kYXRhICpscCkKK3sKKwlpZiAoIWVudC0+dGFnWzBdKSB7CisJCS8qIE5vbi10YWdnZWQsIHNsb3QgYWxyZWFkeSB0YWtlbj8gICovCisJCWlmIChscC0+bm9uX3RhZ2dlZF9jbWQpCisJCQlyZXR1cm4gLUVCVVNZOworCisJCWlmIChscC0+aG9sZCkgeworCQkJLyogV2UgYXJlIGJlaW5nIGhlbGQgYnkgYWN0aXZlIHRhZ2dlZAorCQkJICogY29tbWFuZHMuCisJCQkgKi8KKwkJCWlmIChscC0+bnVtX3RhZ2dlZCkKKwkJCQlyZXR1cm4gLUVCVVNZOworCisJCQkvKiBUYWdnZWQgY29tbWFuZHMgY29tcGxldGVkLCB3ZSBjYW4gdW5wbHVnCisJCQkgKiB0aGUgcXVldWUgYW5kIHJ1biB0aGlzIHVudGFnZ2VkIGNvbW1hbmQuCisJCQkgKi8KKwkJCWxwLT5ob2xkID0gMDsKKwkJfSBlbHNlIGlmIChscC0+bnVtX3RhZ2dlZCkgeworCQkJLyogUGx1ZyB0aGUgcXVldWUgdW50aWwgbnVtX3RhZ2dlZCBkZWNyZWFzZXMKKwkJCSAqIHRvIHplcm8gaW4gZXNwX2ZyZWVfbHVuX3RhZy4KKwkJCSAqLworCQkJbHAtPmhvbGQgPSAxOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCisJCWxwLT5ub25fdGFnZ2VkX2NtZCA9IGVudDsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJLyogVGFnZ2VkIGNvbW1hbmQsIHNlZSBpZiBibG9ja2VkIGJ5IGEKKwkJICogbm9uLXRhZ2dlZCBvbmUuCisJCSAqLworCQlpZiAobHAtPm5vbl90YWdnZWRfY21kIHx8IGxwLT5ob2xkKQorCQkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlCVUdfT04obHAtPnRhZ2dlZF9jbWRzW2VudC0+dGFnWzFdXSk7CisKKwlscC0+dGFnZ2VkX2NtZHNbZW50LT50YWdbMV1dID0gZW50OworCWxwLT5udW1fdGFnZ2VkKys7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZXNwX2ZyZWVfbHVuX3RhZyhzdHJ1Y3QgZXNwX2NtZF9lbnRyeSAqZW50LAorCQkJICAgICBzdHJ1Y3QgZXNwX2x1bl9kYXRhICpscCkKK3sKKwlpZiAoZW50LT50YWdbMF0pIHsKKwkJQlVHX09OKGxwLT50YWdnZWRfY21kc1tlbnQtPnRhZ1sxXV0gIT0gZW50KTsKKwkJbHAtPnRhZ2dlZF9jbWRzW2VudC0+dGFnWzFdXSA9IE5VTEw7CisJCWxwLT5udW1fdGFnZ2VkLS07CisJfSBlbHNlIHsKKwkJQlVHX09OKGxwLT5ub25fdGFnZ2VkX2NtZCAhPSBlbnQpOworCQlscC0+bm9uX3RhZ2dlZF9jbWQgPSBOVUxMOworCX0KK30KKworLyogV2hlbiBhIGNvbnRpbmdlbnQgYWxsZWdpYW5jZSBjb25kaXRvbiBpcyBjcmVhdGVkLCB3ZSBmb3JjZSBmZWVkIGEKKyAqIFJFUVVFU1RfU0VOU0UgY29tbWFuZCB0byB0aGUgZGV2aWNlIHRvIGZldGNoIHRoZSBzZW5zZSBkYXRhLiAgSQorICogdHJpZWQgbWFueSBvdGhlciBzY2hlbWVzLCByZWx5aW5nIG9uIHRoZSBzY3NpIGVycm9yIGhhbmRsaW5nIGxheWVyCisgKiB0byBzZW5kIG91dCB0aGUgUkVRVUVTVF9TRU5TRSBhdXRvbWF0aWNhbGx5LCBidXQgdGhpcyB3YXMgZGlmZmljdWx0CisgKiB0byBnZXQgcmlnaHQgZXNwZWNpYWxseSBpbiB0aGUgcHJlc2VuY2Ugb2YgYXBwbGljYXRpb25zIGxpa2Ugc21hcnRkCisgKiB3aGljaCB1c2UgU0dfSU8gdG8gc2VuZCBvdXQgdGhlaXIgb3duIFJFUVVFU1RfU0VOU0UgY29tbWFuZHMuCisgKi8KK3N0YXRpYyB2b2lkIGVzcF9hdXRvc2Vuc2Uoc3RydWN0IGVzcCAqZXNwLCBzdHJ1Y3QgZXNwX2NtZF9lbnRyeSAqZW50KQoreworCXN0cnVjdCBzY3NpX2NtbmQgKmNtZCA9IGVudC0+Y21kOworCXN0cnVjdCBzY3NpX2RldmljZSAqZGV2ID0gY21kLT5kZXZpY2U7CisJaW50IHRndCwgbHVuOworCXU4ICpwLCB2YWw7CisKKwl0Z3QgPSBkZXYtPmlkOworCWx1biA9IGRldi0+bHVuOworCisKKwlpZiAoIWVudC0+c2Vuc2VfcHRyKSB7CisJCWVzcF9sb2dfYXV0b3NlbnNlKCJlc3AlZDogRG9pbmcgYXV0by1zZW5zZSBmb3IgIgorCQkJCSAgInRndFslZF0gbHVuWyVkXVxuIiwKKwkJCQkgIGVzcC0+aG9zdC0+dW5pcXVlX2lkLCB0Z3QsIGx1bik7CisKKwkJZW50LT5zZW5zZV9wdHIgPSBjbWQtPnNlbnNlX2J1ZmZlcjsKKwkJZW50LT5zZW5zZV9kbWEgPSBlc3AtPm9wcy0+bWFwX3NpbmdsZShlc3AsCisJCQkJCQkgICAgICBlbnQtPnNlbnNlX3B0ciwKKwkJCQkJCSAgICAgIFNDU0lfU0VOU0VfQlVGRkVSU0laRSwKKwkJCQkJCSAgICAgIERNQV9GUk9NX0RFVklDRSk7CisJfQorCWVudC0+c2F2ZWRfc2Vuc2VfcHRyID0gZW50LT5zZW5zZV9wdHI7CisKKwllc3AtPmFjdGl2ZV9jbWQgPSBlbnQ7CisKKwlwID0gZXNwLT5jb21tYW5kX2Jsb2NrOworCWVzcC0+bXNnX291dF9sZW4gPSAwOworCisJKnArKyA9IElERU5USUZZKDAsIGx1bik7CisJKnArKyA9IFJFUVVFU1RfU0VOU0U7CisJKnArKyA9ICgoZGV2LT5zY3NpX2xldmVsIDw9IFNDU0lfMikgPworCQkobHVuIDw8IDUpIDogMCk7CisJKnArKyA9IDA7CisJKnArKyA9IDA7CisJKnArKyA9IFNDU0lfU0VOU0VfQlVGRkVSU0laRTsKKwkqcCsrID0gMDsKKworCWVzcC0+c2VsZWN0X3N0YXRlID0gRVNQX1NFTEVDVF9CQVNJQzsKKworCXZhbCA9IHRndDsKKwlpZiAoZXNwLT5yZXYgPT0gRkFTSE1FKQorCQl2YWwgfD0gRVNQX0JVU0lEX1JFU0VMSUQgfCBFU1BfQlVTSURfQ1RSMzJCSVQ7CisJZXNwX3dyaXRlOCh2YWwsIEVTUF9CVVNJRCk7CisKKwllc3Bfd3JpdGVfdGd0X3N5bmMoZXNwLCB0Z3QpOworCWVzcF93cml0ZV90Z3RfY29uZmlnMyhlc3AsIHRndCk7CisKKwl2YWwgPSAocCAtIGVzcC0+Y29tbWFuZF9ibG9jayk7CisKKwlpZiAoZXNwLT5yZXYgPT0gRkFTSE1FKQorCQlzY3NpX2VzcF9jbWQoZXNwLCBFU1BfQ01EX0ZMVVNIKTsKKwllc3AtPm9wcy0+c2VuZF9kbWFfY21kKGVzcCwgZXNwLT5jb21tYW5kX2Jsb2NrX2RtYSwKKwkJCSAgICAgICB2YWwsIDE2LCAwLCBFU1BfQ01EX0RNQSB8IEVTUF9DTURfU0VMQSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXNwX2NtZF9lbnRyeSAqZmluZF9hbmRfcHJlcF9pc3N1YWJsZV9jb21tYW5kKHN0cnVjdCBlc3AgKmVzcCkKK3sKKwlzdHJ1Y3QgZXNwX2NtZF9lbnRyeSAqZW50OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShlbnQsICZlc3AtPnF1ZXVlZF9jbWRzLCBsaXN0KSB7CisJCXN0cnVjdCBzY3NpX2NtbmQgKmNtZCA9IGVudC0+Y21kOworCQlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKmRldiA9IGNtZC0+ZGV2aWNlOworCQlzdHJ1Y3QgZXNwX2x1bl9kYXRhICpscCA9IGRldi0+aG9zdGRhdGE7CisKKwkJaWYgKGVudC0+ZmxhZ3MgJiBFU1BfQ01EX0ZMQUdfQVVUT1NFTlNFKSB7CisJCQllbnQtPnRhZ1swXSA9IDA7CisJCQllbnQtPnRhZ1sxXSA9IDA7CisJCQlyZXR1cm4gZW50OworCQl9CisKKwkJaWYgKCFzY3NpX3BvcHVsYXRlX3RhZ19tc2coY21kLCAmZW50LT50YWdbMF0pKSB7CisJCQllbnQtPnRhZ1swXSA9IDA7CisJCQllbnQtPnRhZ1sxXSA9IDA7CisJCX0KKworCQlpZiAoZXNwX2FsbG9jX2x1bl90YWcoZW50LCBscCkgPCAwKQorCQkJY29udGludWU7CisKKwkJcmV0dXJuIGVudDsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgZXNwX21heWJlX2V4ZWN1dGVfY29tbWFuZChzdHJ1Y3QgZXNwICplc3ApCit7CisJc3RydWN0IGVzcF90YXJnZXRfZGF0YSAqdHA7CisJc3RydWN0IGVzcF9sdW5fZGF0YSAqbHA7CisJc3RydWN0IHNjc2lfZGV2aWNlICpkZXY7CisJc3RydWN0IHNjc2lfY21uZCAqY21kOworCXN0cnVjdCBlc3BfY21kX2VudHJ5ICplbnQ7CisJaW50IHRndCwgbHVuLCBpOworCXUzMiB2YWwsIHN0YXJ0X2NtZDsKKwl1OCAqcDsKKworCWlmIChlc3AtPmFjdGl2ZV9jbWQgfHwKKwkgICAgKGVzcC0+ZmxhZ3MgJiBFU1BfRkxBR19SRVNFVFRJTkcpKQorCQlyZXR1cm47CisKKwllbnQgPSBmaW5kX2FuZF9wcmVwX2lzc3VhYmxlX2NvbW1hbmQoZXNwKTsKKwlpZiAoIWVudCkKKwkJcmV0dXJuOworCisJaWYgKGVudC0+ZmxhZ3MgJiBFU1BfQ01EX0ZMQUdfQVVUT1NFTlNFKSB7CisJCWVzcF9hdXRvc2Vuc2UoZXNwLCBlbnQpOworCQlyZXR1cm47CisJfQorCisJY21kID0gZW50LT5jbWQ7CisJZGV2ID0gY21kLT5kZXZpY2U7CisJdGd0ID0gZGV2LT5pZDsKKwlsdW4gPSBkZXYtPmx1bjsKKwl0cCA9ICZlc3AtPnRhcmdldFt0Z3RdOworCWxwID0gZGV2LT5ob3N0ZGF0YTsKKworCWxpc3RfZGVsKCZlbnQtPmxpc3QpOworCWxpc3RfYWRkKCZlbnQtPmxpc3QsICZlc3AtPmFjdGl2ZV9jbWRzKTsKKworCWVzcC0+YWN0aXZlX2NtZCA9IGVudDsKKworCWVzcF9tYXBfZG1hKGVzcCwgY21kKTsKKwllc3Bfc2F2ZV9wb2ludGVycyhlc3AsIGVudCk7CisKKwllc3BfY2hlY2tfY29tbWFuZF9sZW4oZXNwLCBjbWQpOworCisJcCA9IGVzcC0+Y29tbWFuZF9ibG9jazsKKworCWVzcC0+bXNnX291dF9sZW4gPSAwOworCWlmICh0cC0+ZmxhZ3MgJiBFU1BfVEdUX0NIRUNLX05FR08pIHsKKwkJLyogTmVlZCB0byBuZWdvdGlhdGUuICBJZiB0aGUgdGFyZ2V0IGlzIGJyb2tlbgorCQkgKiBnbyBmb3Igc3luY2hyb25vdXMgdHJhbnNmZXJzIGFuZCBub24td2lkZS4KKwkJICovCisJCWlmICh0cC0+ZmxhZ3MgJiBFU1BfVEdUX0JST0tFTikgeworCQkJdHAtPmZsYWdzICY9IH5FU1BfVEdUX0RJU0NPTk5FQ1Q7CisJCQl0cC0+bmVnb19nb2FsX3BlcmlvZCA9IDA7CisJCQl0cC0+bmVnb19nb2FsX29mZnNldCA9IDA7CisJCQl0cC0+bmVnb19nb2FsX3dpZHRoID0gMDsKKwkJCXRwLT5uZWdvX2dvYWxfdGFncyA9IDA7CisJCX0KKworCQkvKiBJZiB0aGUgc2V0dGluZ3MgYXJlIG5vdCBjaGFuZ2luZywgc2tpcCB0aGlzLiAgKi8KKwkJaWYgKHNwaV93aWR0aCh0cC0+c3RhcmdldCkgPT0gdHAtPm5lZ29fZ29hbF93aWR0aCAmJgorCQkgICAgc3BpX3BlcmlvZCh0cC0+c3RhcmdldCkgPT0gdHAtPm5lZ29fZ29hbF9wZXJpb2QgJiYKKwkJICAgIHNwaV9vZmZzZXQodHAtPnN0YXJnZXQpID09IHRwLT5uZWdvX2dvYWxfb2Zmc2V0KSB7CisJCQl0cC0+ZmxhZ3MgJj0gfkVTUF9UR1RfQ0hFQ0tfTkVHTzsKKwkJCWdvdG8gYnVpbGRfaWRlbnRpZnk7CisJCX0KKworCQlpZiAoZXNwLT5yZXYgPT0gRkFTSE1FICYmIGVzcF9uZWVkX3RvX25lZ29fd2lkZSh0cCkpIHsKKwkJCWVzcC0+bXNnX291dF9sZW4gPQorCQkJCXNwaV9wb3B1bGF0ZV93aWR0aF9tc2coJmVzcC0+bXNnX291dFswXSwKKwkJCQkJCSAgICAgICAodHAtPm5lZ29fZ29hbF93aWR0aCA/CisJCQkJCQkJMSA6IDApKTsKKwkJCXRwLT5mbGFncyB8PSBFU1BfVEdUX05FR09fV0lERTsKKwkJfSBlbHNlIGlmIChlc3BfbmVlZF90b19uZWdvX3N5bmModHApKSB7CisJCQllc3AtPm1zZ19vdXRfbGVuID0KKwkJCQlzcGlfcG9wdWxhdGVfc3luY19tc2coJmVzcC0+bXNnX291dFswXSwKKwkJCQkJCSAgICAgIHRwLT5uZWdvX2dvYWxfcGVyaW9kLAorCQkJCQkJICAgICAgdHAtPm5lZ29fZ29hbF9vZmZzZXQpOworCQkJdHAtPmZsYWdzIHw9IEVTUF9UR1RfTkVHT19TWU5DOworCQl9IGVsc2UgeworCQkJdHAtPmZsYWdzICY9IH5FU1BfVEdUX0NIRUNLX05FR087CisJCX0KKworCQkvKiBQcm9jZXNzIGl0IGxpa2UgYSBzbG93IGNvbW1hbmQuICAqLworCQlpZiAodHAtPmZsYWdzICYgKEVTUF9UR1RfTkVHT19XSURFIHwgRVNQX1RHVF9ORUdPX1NZTkMpKQorCQkJZXNwLT5mbGFncyB8PSBFU1BfRkxBR19ET0lOR19TTE9XQ01EOworCX0KKworYnVpbGRfaWRlbnRpZnk6CisJLyogSWYgd2UgZG9uJ3QgaGF2ZSBhIGx1bi1kYXRhIHN0cnVjdCB5ZXQsIHdlJ3JlIHByb2JpbmcKKwkgKiBzbyBkbyBub3QgZGlzY29ubmVjdC4gIEFsc28sIGRvIG5vdCBkaXNjb25uZWN0IHVubGVzcworCSAqIHdlIGhhdmUgYSB0YWcgb24gdGhpcyBjb21tYW5kLgorCSAqLworCWlmIChscCAmJiAodHAtPmZsYWdzICYgRVNQX1RHVF9ESVNDT05ORUNUKSAmJiBlbnQtPnRhZ1swXSkKKwkJKnArKyA9IElERU5USUZZKDEsIGx1bik7CisJZWxzZQorCQkqcCsrID0gSURFTlRJRlkoMCwgbHVuKTsKKworCWlmIChlbnQtPnRhZ1swXSAmJiBlc3AtPnJldiA9PSBFU1AxMDApIHsKKwkJLyogRVNQMTAwIGxhY2tzIHNlbGVjdCB3L2F0bjMgY29tbWFuZCwgdXNlIHNlbGVjdAorCQkgKiBhbmQgc3RvcCBpbnN0ZWFkLgorCQkgKi8KKwkJZXNwLT5mbGFncyB8PSBFU1BfRkxBR19ET0lOR19TTE9XQ01EOworCX0KKworCWlmICghKGVzcC0+ZmxhZ3MgJiBFU1BfRkxBR19ET0lOR19TTE9XQ01EKSkgeworCQlzdGFydF9jbWQgPSBFU1BfQ01EX0RNQSB8IEVTUF9DTURfU0VMQTsKKwkJaWYgKGVudC0+dGFnWzBdKSB7CisJCQkqcCsrID0gZW50LT50YWdbMF07CisJCQkqcCsrID0gZW50LT50YWdbMV07CisKKwkJCXN0YXJ0X2NtZCA9IEVTUF9DTURfRE1BIHwgRVNQX0NNRF9TQTM7CisJCX0KKworCQlmb3IgKGkgPSAwOyBpIDwgY21kLT5jbWRfbGVuOyBpKyspCisJCQkqcCsrID0gY21kLT5jbW5kW2ldOworCisJCWVzcC0+c2VsZWN0X3N0YXRlID0gRVNQX1NFTEVDVF9CQVNJQzsKKwl9IGVsc2UgeworCQllc3AtPmNtZF9ieXRlc19sZWZ0ID0gY21kLT5jbWRfbGVuOworCQllc3AtPmNtZF9ieXRlc19wdHIgPSAmY21kLT5jbW5kWzBdOworCisJCWlmIChlbnQtPnRhZ1swXSkgeworCQkJZm9yIChpID0gZXNwLT5tc2dfb3V0X2xlbiAtIDE7CisJCQkgICAgIGkgPj0gMDsgaS0tKQorCQkJCWVzcC0+bXNnX291dFtpICsgMl0gPSBlc3AtPm1zZ19vdXRbaV07CisJCQllc3AtPm1zZ19vdXRbMF0gPSBlbnQtPnRhZ1swXTsKKwkJCWVzcC0+bXNnX291dFsxXSA9IGVudC0+dGFnWzFdOworCQkJZXNwLT5tc2dfb3V0X2xlbiArPSAyOworCQl9CisKKwkJc3RhcnRfY21kID0gRVNQX0NNRF9ETUEgfCBFU1BfQ01EX1NFTEFTOworCQllc3AtPnNlbGVjdF9zdGF0ZSA9IEVTUF9TRUxFQ1RfTVNHT1VUOworCX0KKwl2YWwgPSB0Z3Q7CisJaWYgKGVzcC0+cmV2ID09IEZBU0hNRSkKKwkJdmFsIHw9IEVTUF9CVVNJRF9SRVNFTElEIHwgRVNQX0JVU0lEX0NUUjMyQklUOworCWVzcF93cml0ZTgodmFsLCBFU1BfQlVTSUQpOworCisJZXNwX3dyaXRlX3RndF9zeW5jKGVzcCwgdGd0KTsKKwllc3Bfd3JpdGVfdGd0X2NvbmZpZzMoZXNwLCB0Z3QpOworCisJdmFsID0gKHAgLSBlc3AtPmNvbW1hbmRfYmxvY2spOworCisJaWYgKGVzcF9kZWJ1ZyAmIEVTUF9ERUJVR19TQ1NJQ01EKSB7CisJCXByaW50aygiRVNQOiB0Z3RbJWRdIGx1blslZF0gc2NzaV9jbWQgWyAiLCB0Z3QsIGx1bik7CisJCWZvciAoaSA9IDA7IGkgPCBjbWQtPmNtZF9sZW47IGkrKykKKwkJCXByaW50aygiJTAyeCAiLCBjbWQtPmNtbmRbaV0pOworCQlwcmludGsoIl1cbiIpOworCX0KKworCWlmIChlc3AtPnJldiA9PSBGQVNITUUpCisJCXNjc2lfZXNwX2NtZChlc3AsIEVTUF9DTURfRkxVU0gpOworCWVzcC0+b3BzLT5zZW5kX2RtYV9jbWQoZXNwLCBlc3AtPmNvbW1hbmRfYmxvY2tfZG1hLAorCQkJICAgICAgIHZhbCwgMTYsIDAsIHN0YXJ0X2NtZCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXNwX2NtZF9lbnRyeSAqZXNwX2dldF9lbnQoc3RydWN0IGVzcCAqZXNwKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQgPSAmZXNwLT5lc3BfY21kX3Bvb2w7CisJc3RydWN0IGVzcF9jbWRfZW50cnkgKnJldDsKKworCWlmIChsaXN0X2VtcHR5KGhlYWQpKSB7CisJCXJldCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBlc3BfY21kX2VudHJ5KSwgR0ZQX0FUT01JQyk7CisJfSBlbHNlIHsKKwkJcmV0ID0gbGlzdF9lbnRyeShoZWFkLT5uZXh0LCBzdHJ1Y3QgZXNwX2NtZF9lbnRyeSwgbGlzdCk7CisJCWxpc3RfZGVsKCZyZXQtPmxpc3QpOworCQltZW1zZXQocmV0LCAwLCBzaXplb2YoKnJldCkpOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBlc3BfcHV0X2VudChzdHJ1Y3QgZXNwICplc3AsIHN0cnVjdCBlc3BfY21kX2VudHJ5ICplbnQpCit7CisJbGlzdF9hZGQoJmVudC0+bGlzdCwgJmVzcC0+ZXNwX2NtZF9wb29sKTsKK30KKworc3RhdGljIHZvaWQgZXNwX2NtZF9pc19kb25lKHN0cnVjdCBlc3AgKmVzcCwgc3RydWN0IGVzcF9jbWRfZW50cnkgKmVudCwKKwkJCSAgICBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsIHVuc2lnbmVkIGludCByZXN1bHQpCit7CisJc3RydWN0IHNjc2lfZGV2aWNlICpkZXYgPSBjbWQtPmRldmljZTsKKwlpbnQgdGd0ID0gZGV2LT5pZDsKKwlpbnQgbHVuID0gZGV2LT5sdW47CisKKwllc3AtPmFjdGl2ZV9jbWQgPSBOVUxMOworCWVzcF91bm1hcF9kbWEoZXNwLCBjbWQpOworCWVzcF9mcmVlX2x1bl90YWcoZW50LCBkZXYtPmhvc3RkYXRhKTsKKwljbWQtPnJlc3VsdCA9IHJlc3VsdDsKKworCWlmIChlbnQtPmVoX2RvbmUpIHsKKwkJY29tcGxldGUoZW50LT5laF9kb25lKTsKKwkJZW50LT5laF9kb25lID0gTlVMTDsKKwl9CisKKwlpZiAoZW50LT5mbGFncyAmIEVTUF9DTURfRkxBR19BVVRPU0VOU0UpIHsKKwkJZXNwLT5vcHMtPnVubWFwX3NpbmdsZShlc3AsIGVudC0+c2Vuc2VfZG1hLAorCQkJCSAgICAgICBTQ1NJX1NFTlNFX0JVRkZFUlNJWkUsIERNQV9GUk9NX0RFVklDRSk7CisJCWVudC0+c2Vuc2VfcHRyID0gTlVMTDsKKworCQkvKiBSZXN0b3JlIHRoZSBtZXNzYWdlL3N0YXR1cyBieXRlcyB0byB3aGF0IHdlIGFjdHVhbGx5CisJCSAqIHNhdyBvcmlnaW5hbGx5LiAgQWxzbywgcmVwb3J0IHRoYXQgd2UgYXJlIHByb3ZpZGluZworCQkgKiB0aGUgc2Vuc2UgZGF0YS4KKwkJICovCisJCWNtZC0+cmVzdWx0ID0gKChEUklWRVJfU0VOU0UgPDwgMjQpIHwKKwkJCSAgICAgICAoRElEX09LIDw8IDE2KSB8CisJCQkgICAgICAgKENPTU1BTkRfQ09NUExFVEUgPDwgOCkgfAorCQkJICAgICAgIChTQU1fU1RBVF9DSEVDS19DT05ESVRJT04gPDwgMCkpOworCisJCWVudC0+ZmxhZ3MgJj0gfkVTUF9DTURfRkxBR19BVVRPU0VOU0U7CisJCWlmIChlc3BfZGVidWcgJiBFU1BfREVCVUdfQVVUT1NFTlNFKSB7CisJCQlpbnQgaTsKKworCQkJcHJpbnRrKCJlc3AlZDogdGd0WyVkXSBsdW5bJWRdIEFVVE8gU0VOU0VbICIsCisJCQkgICAgICAgZXNwLT5ob3N0LT51bmlxdWVfaWQsIHRndCwgbHVuKTsKKwkJCWZvciAoaSA9IDA7IGkgPCAxODsgaSsrKQorCQkJCXByaW50aygiJTAyeCAiLCBjbWQtPnNlbnNlX2J1ZmZlcltpXSk7CisJCQlwcmludGsoIl1cbiIpOworCQl9CisJfQorCisJY21kLT5zY3NpX2RvbmUoY21kKTsKKworCWxpc3RfZGVsKCZlbnQtPmxpc3QpOworCWVzcF9wdXRfZW50KGVzcCwgZW50KTsKKworCWVzcF9tYXliZV9leGVjdXRlX2NvbW1hbmQoZXNwKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBjb21wb3NlX3Jlc3VsdCh1bnNpZ25lZCBpbnQgc3RhdHVzLCB1bnNpZ25lZCBpbnQgbWVzc2FnZSwKKwkJCQkgICB1bnNpZ25lZCBpbnQgZHJpdmVyX2NvZGUpCit7CisJcmV0dXJuIChzdGF0dXMgfCAobWVzc2FnZSA8PCA4KSB8IChkcml2ZXJfY29kZSA8PCAxNikpOworfQorCitzdGF0aWMgdm9pZCBlc3BfZXZlbnRfcXVldWVfZnVsbChzdHJ1Y3QgZXNwICplc3AsIHN0cnVjdCBlc3BfY21kX2VudHJ5ICplbnQpCit7CisJc3RydWN0IHNjc2lfZGV2aWNlICpkZXYgPSBlbnQtPmNtZC0+ZGV2aWNlOworCXN0cnVjdCBlc3BfbHVuX2RhdGEgKmxwID0gZGV2LT5ob3N0ZGF0YTsKKworCXNjc2lfdHJhY2tfcXVldWVfZnVsbChkZXYsIGxwLT5udW1fdGFnZ2VkIC0gMSk7Cit9CisKK3N0YXRpYyBpbnQgZXNwX3F1ZXVlY29tbWFuZChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsIHZvaWQgKCpkb25lKShzdHJ1Y3Qgc2NzaV9jbW5kICopKQoreworCXN0cnVjdCBzY3NpX2RldmljZSAqZGV2ID0gY21kLT5kZXZpY2U7CisJc3RydWN0IGVzcCAqZXNwID0gaG9zdF90b19lc3AoZGV2LT5ob3N0KTsKKwlzdHJ1Y3QgZXNwX2NtZF9wcml2ICpzcHJpdjsKKwlzdHJ1Y3QgZXNwX2NtZF9lbnRyeSAqZW50OworCisJZW50ID0gZXNwX2dldF9lbnQoZXNwKTsKKwlpZiAoIWVudCkKKwkJcmV0dXJuIFNDU0lfTUxRVUVVRV9IT1NUX0JVU1k7CisKKwllbnQtPmNtZCA9IGNtZDsKKworCWNtZC0+c2NzaV9kb25lID0gZG9uZTsKKworCXNwcml2ID0gRVNQX0NNRF9QUklWKGNtZCk7CisJc3ByaXYtPnUuZG1hX2FkZHIgPSB+KGRtYV9hZGRyX3QpMHgwOworCisJbGlzdF9hZGRfdGFpbCgmZW50LT5saXN0LCAmZXNwLT5xdWV1ZWRfY21kcyk7CisKKwllc3BfbWF5YmVfZXhlY3V0ZV9jb21tYW5kKGVzcCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlc3BfY2hlY2tfZ3Jvc3NfZXJyb3Ioc3RydWN0IGVzcCAqZXNwKQoreworCWlmIChlc3AtPnNyZWcgJiBFU1BfU1RBVF9TUEFNKSB7CisJCS8qIEdyb3NzIEVycm9yLCBjb3VsZCBiZSBvbmUgb2Y6CisJCSAqIC0gdG9wIG9mIGZpZm8gb3ZlcndyaXR0ZW4KKwkJICogLSB0b3Agb2YgY29tbWFuZCByZWdpc3RlciBvdmVyd3JpdHRlbgorCQkgKiAtIERNQSBwcm9ncmFtbWVkIHdpdGggd3JvbmcgZGlyZWN0aW9uCisJCSAqIC0gaW1wcm9wZXIgcGhhc2UgY2hhbmdlCisJCSAqLworCQlwcmludGsoS0VSTl9FUlIgUEZYICJlc3AlZDogR3Jvc3MgZXJyb3Igc3JlZ1slMDJ4XVxuIiwKKwkJICAgICAgIGVzcC0+aG9zdC0+dW5pcXVlX2lkLCBlc3AtPnNyZWcpOworCQkvKiBYWFggUmVzZXQgdGhlIGNoaXAuIFhYWCAqLworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZXNwX2NoZWNrX3NwdXJfaW50cihzdHJ1Y3QgZXNwICplc3ApCit7CisJc3dpdGNoIChlc3AtPnJldikgeworCWNhc2UgRVNQMTAwOgorCWNhc2UgRVNQMTAwQToKKwkJLyogVGhlIGludGVycnVwdCBwZW5kaW5nIGJpdCBvZiB0aGUgc3RhdHVzIHJlZ2lzdGVyIGNhbm5vdAorCQkgKiBiZSB0cnVzdGVkIG9uIHRoZXNlIHJldmlzaW9ucy4KKwkJICovCisJCWVzcC0+c3JlZyAmPSB+RVNQX1NUQVRfSU5UUjsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlpZiAoIShlc3AtPnNyZWcgJiBFU1BfU1RBVF9JTlRSKSkgeworCQkJZXNwLT5pcmVnID0gZXNwX3JlYWQ4KEVTUF9JTlRSUFQpOworCQkJaWYgKGVzcC0+aXJlZyAmIEVTUF9JTlRSX1NSKQorCQkJCXJldHVybiAxOworCisJCQkvKiBJZiB0aGUgRE1BIGlzIGluZGljYXRpbmcgaW50ZXJydXB0IHBlbmRpbmcgYW5kIHRoZQorCQkJICogRVNQIGlzIG5vdCwgdGhlIG9ubHkgcG9zc2liaWxpdHkgaXMgYSBETUEgZXJyb3IuCisJCQkgKi8KKwkJCWlmICghZXNwLT5vcHMtPmRtYV9lcnJvcihlc3ApKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiZXNwJWQ6IFNwdXJpb3VzIGlycSwgIgorCQkJCSAgICAgICAic3JlZz0leC5cbiIsCisJCQkJICAgICAgIGVzcC0+aG9zdC0+dW5pcXVlX2lkLCBlc3AtPnNyZWcpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKworCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiZXNwJWQ6IERNQSBlcnJvclxuIiwKKwkJCSAgICAgICBlc3AtPmhvc3QtPnVuaXF1ZV9pZCk7CisKKwkJCS8qIFhYWCBSZXNldCB0aGUgY2hpcC4gWFhYICovCisJCQlyZXR1cm4gLTE7CisJCX0KKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGVzcF9zY2hlZHVsZV9yZXNldChzdHJ1Y3QgZXNwICplc3ApCit7CisJZXNwX2xvZ19yZXNldCgiRVNQOiBlc3Bfc2NoZWR1bGVfcmVzZXQoKSBmcm9tICVwXG4iLAorCQkgICAgICBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOworCWVzcC0+ZmxhZ3MgfD0gRVNQX0ZMQUdfUkVTRVRUSU5HOworCWVzcF9ldmVudChlc3AsIEVTUF9FVkVOVF9SRVNFVCk7Cit9CisKKy8qIEluIG9yZGVyIHRvIGF2b2lkIGhhdmluZyB0byBhZGQgYSBzcGVjaWFsIGhhbGYtcmVjb25uZWN0ZWQgc3RhdGUKKyAqIGludG8gdGhlIGRyaXZlciB3ZSBqdXN0IHNpdCBoZXJlIGFuZCBwb2xsIHRocm91Z2ggdGhlIHJlc3Qgb2YKKyAqIHRoZSByZXNlbGVjdGlvbiBwcm9jZXNzIHRvIGdldCB0aGUgdGFnIG1lc3NhZ2UgYnl0ZXMuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZXNwX2NtZF9lbnRyeSAqZXNwX3JlY29ubmVjdF93aXRoX3RhZyhzdHJ1Y3QgZXNwICplc3AsCisJCQkJCQkgICAgc3RydWN0IGVzcF9sdW5fZGF0YSAqbHApCit7CisJc3RydWN0IGVzcF9jbWRfZW50cnkgKmVudDsKKwlpbnQgaTsKKworCWlmICghbHAtPm51bV90YWdnZWQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiZXNwJWQ6IFJlY29ubmVjdCB3L251bV90YWdnZWQ9PTBcbiIsCisJCSAgICAgICBlc3AtPmhvc3QtPnVuaXF1ZV9pZCk7CisJCXJldHVybiBOVUxMOworCX0KKworCWVzcF9sb2dfcmVjb25uZWN0KCJFU1A6IHJlY29ubmVjdCB0YWcsICIpOworCisJZm9yIChpID0gMDsgaSA8IEVTUF9RVUlDS0lSUV9MSU1JVDsgaSsrKSB7CisJCWlmIChlc3AtPm9wcy0+aXJxX3BlbmRpbmcoZXNwKSkKKwkJCWJyZWFrOworCX0KKwlpZiAoaSA9PSBFU1BfUVVJQ0tJUlFfTElNSVQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiZXNwJWQ6IFJlY29ubmVjdCBJUlExIHRpbWVvdXRcbiIsCisJCSAgICAgICBlc3AtPmhvc3QtPnVuaXF1ZV9pZCk7CisJCXJldHVybiBOVUxMOworCX0KKworCWVzcC0+c3JlZyA9IGVzcF9yZWFkOChFU1BfU1RBVFVTKTsKKwllc3AtPmlyZWcgPSBlc3BfcmVhZDgoRVNQX0lOVFJQVCk7CisKKwllc3BfbG9nX3JlY29ubmVjdCgiSVJRKCVkOiV4OiV4KSwgIiwKKwkJCSAgaSwgZXNwLT5pcmVnLCBlc3AtPnNyZWcpOworCisJaWYgKGVzcC0+aXJlZyAmIEVTUF9JTlRSX0RDKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImVzcCVkOiBSZWNvbm5lY3QsIGdvdCBkaXNjb25uZWN0LlxuIiwKKwkJICAgICAgIGVzcC0+aG9zdC0+dW5pcXVlX2lkKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKChlc3AtPnNyZWcgJiBFU1BfU1RBVF9QTUFTSykgIT0gRVNQX01JUCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJlc3AlZDogUmVjb25uZWN0LCBub3QgTUlQIHNyZWdbJTAyeF0uXG4iLAorCQkgICAgICAgZXNwLT5ob3N0LT51bmlxdWVfaWQsIGVzcC0+c3JlZyk7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIERNQSBpbiB0aGUgdGFnIGJ5dGVzLi4uICovCisJZXNwLT5jb21tYW5kX2Jsb2NrWzBdID0gMHhmZjsKKwllc3AtPmNvbW1hbmRfYmxvY2tbMV0gPSAweGZmOworCWVzcC0+b3BzLT5zZW5kX2RtYV9jbWQoZXNwLCBlc3AtPmNvbW1hbmRfYmxvY2tfZG1hLAorCQkJICAgICAgIDIsIDIsIDEsIEVTUF9DTURfRE1BIHwgRVNQX0NNRF9USSk7CisKKwkvKiBBQ0sgdGhlIG1zc3NhZ2UuICAqLworCXNjc2lfZXNwX2NtZChlc3AsIEVTUF9DTURfTU9LKTsKKworCWZvciAoaSA9IDA7IGkgPCBFU1BfUkVTRUxFQ1RfVEFHX0xJTUlUOyBpKyspIHsKKwkJaWYgKGVzcC0+b3BzLT5pcnFfcGVuZGluZyhlc3ApKSB7CisJCQllc3AtPnNyZWcgPSBlc3BfcmVhZDgoRVNQX1NUQVRVUyk7CisJCQllc3AtPmlyZWcgPSBlc3BfcmVhZDgoRVNQX0lOVFJQVCk7CisJCQlpZiAoZXNwLT5pcmVnICYgRVNQX0lOVFJfRkRPTkUpCisJCQkJYnJlYWs7CisJCX0KKwkJdWRlbGF5KDEpOworCX0KKwlpZiAoaSA9PSBFU1BfUkVTRUxFQ1RfVEFHX0xJTUlUKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImVzcCVkOiBSZWNvbm5lY3QgSVJRMiB0aW1lb3V0XG4iLAorCQkgICAgICAgZXNwLT5ob3N0LT51bmlxdWVfaWQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJZXNwLT5vcHMtPmRtYV9kcmFpbihlc3ApOworCWVzcC0+b3BzLT5kbWFfaW52YWxpZGF0ZShlc3ApOworCisJZXNwX2xvZ19yZWNvbm5lY3QoIklSUTIoJWQ6JXg6JXgpIHRhZ1sleDoleF1cbiIsCisJCQkgIGksIGVzcC0+aXJlZywgZXNwLT5zcmVnLAorCQkJICBlc3AtPmNvbW1hbmRfYmxvY2tbMF0sCisJCQkgIGVzcC0+Y29tbWFuZF9ibG9ja1sxXSk7CisKKwlpZiAoZXNwLT5jb21tYW5kX2Jsb2NrWzBdIDwgU0lNUExFX1FVRVVFX1RBRyB8fAorCSAgICBlc3AtPmNvbW1hbmRfYmxvY2tbMF0gPiBPUkRFUkVEX1FVRVVFX1RBRykgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJlc3AlZDogUmVjb25uZWN0LCBiYWQgdGFnICIKKwkJICAgICAgICJ0eXBlICUwMnguXG4iLAorCQkgICAgICAgZXNwLT5ob3N0LT51bmlxdWVfaWQsIGVzcC0+Y29tbWFuZF9ibG9ja1swXSk7CisJCXJldHVybiBOVUxMOworCX0KKworCWVudCA9IGxwLT50YWdnZWRfY21kc1tlc3AtPmNvbW1hbmRfYmxvY2tbMV1dOworCWlmICghZW50KSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImVzcCVkOiBSZWNvbm5lY3QsIG5vIGVudHJ5IGZvciAiCisJCSAgICAgICAidGFnICUwMnguXG4iLAorCQkgICAgICAgZXNwLT5ob3N0LT51bmlxdWVfaWQsIGVzcC0+Y29tbWFuZF9ibG9ja1sxXSk7CisJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiBlbnQ7Cit9CisKK3N0YXRpYyBpbnQgZXNwX3JlY29ubmVjdChzdHJ1Y3QgZXNwICplc3ApCit7CisJc3RydWN0IGVzcF9jbWRfZW50cnkgKmVudDsKKwlzdHJ1Y3QgZXNwX3RhcmdldF9kYXRhICp0cDsKKwlzdHJ1Y3QgZXNwX2x1bl9kYXRhICpscDsKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKmRldjsKKwlpbnQgdGFyZ2V0LCBsdW47CisKKwlCVUdfT04oZXNwLT5hY3RpdmVfY21kKTsKKwlpZiAoZXNwLT5yZXYgPT0gRkFTSE1FKSB7CisJCS8qIEZBU0hNRSBwdXRzIHRoZSB0YXJnZXQgYW5kIGx1biBudW1iZXJzIGRpcmVjdGx5CisJCSAqIGludG8gdGhlIGZpZm8uCisJCSAqLworCQl0YXJnZXQgPSBlc3AtPmZpZm9bMF07CisJCWx1biA9IGVzcC0+Zmlmb1sxXSAmIDB4NzsKKwl9IGVsc2UgeworCQl1OCBiaXRzID0gZXNwX3JlYWQ4KEVTUF9GREFUQSk7CisKKwkJLyogT2xkZXIgY2hpcHMgcHV0IHRoZSBsdW4gZGlyZWN0bHkgaW50byB0aGUgZmlmbywgYnV0CisJCSAqIHRoZSB0YXJnZXQgaXMgZ2l2ZW4gYXMgYSBzYW1wbGUgb2YgdGhlIGFyYml0cmF0aW9uCisJCSAqIGxpbmVzIG9uIHRoZSBidXMgYXQgcmVzZWxlY3Rpb24gdGltZS4gIFNvIHdlIHNob3VsZAorCQkgKiBzZWUgdGhlIElEIG9mIHRoZSBFU1AgYW5kIHRoZSBvbmUgcmVjb25uZWN0aW5nIHRhcmdldAorCQkgKiBzZXQgaW4gdGhlIGJpdG1hcC4KKwkJICovCisJCWlmICghKGJpdHMgJiBlc3AtPnNjc2lfaWRfbWFzaykpCisJCQlnb3RvIGRvX3Jlc2V0OworCQliaXRzICY9IH5lc3AtPnNjc2lfaWRfbWFzazsKKwkJaWYgKCFiaXRzIHx8IChiaXRzICYgKGJpdHMgLSAxKSkpCisJCQlnb3RvIGRvX3Jlc2V0OworCisJCXRhcmdldCA9IGZmcyhiaXRzKSAtIDE7CisJCWx1biA9IChlc3BfcmVhZDgoRVNQX0ZEQVRBKSAmIDB4Nyk7CisKKwkJc2NzaV9lc3BfY21kKGVzcCwgRVNQX0NNRF9GTFVTSCk7CisJCWlmIChlc3AtPnJldiA9PSBFU1AxMDApIHsKKwkJCXU4IGlyZWcgPSBlc3BfcmVhZDgoRVNQX0lOVFJQVCk7CisJCQkvKiBUaGlzIGNoaXAgaGFzIGEgYnVnIGR1cmluZyByZXNlbGVjdGlvbiB0aGF0IGNhbgorCQkJICogY2F1c2UgYSBzcHVyaW91cyBpbGxlZ2FsLWNvbW1hbmQgaW50ZXJydXB0LCB3aGljaAorCQkJICogd2Ugc2ltcGx5IEFDSyBoZXJlLiAgQW5vdGhlciBwb3NzaWJpbGl0eSBpcyBhIGJ1cworCQkJICogcmVzZXQgc28gd2UgbXVzdCBjaGVjayBmb3IgdGhhdC4KKwkJCSAqLworCQkJaWYgKGlyZWcgJiBFU1BfSU5UUl9TUikKKwkJCQlnb3RvIGRvX3Jlc2V0OworCQl9CisJCXNjc2lfZXNwX2NtZChlc3AsIEVTUF9DTURfTlVMTCk7CisJfQorCisJZXNwX3dyaXRlX3RndF9zeW5jKGVzcCwgdGFyZ2V0KTsKKwllc3Bfd3JpdGVfdGd0X2NvbmZpZzMoZXNwLCB0YXJnZXQpOworCisJc2NzaV9lc3BfY21kKGVzcCwgRVNQX0NNRF9NT0spOworCisJaWYgKGVzcC0+cmV2ID09IEZBU0hNRSkKKwkJZXNwX3dyaXRlOCh0YXJnZXQgfCBFU1BfQlVTSURfUkVTRUxJRCB8IEVTUF9CVVNJRF9DVFIzMkJJVCwKKwkJCSAgIEVTUF9CVVNJRCk7CisKKwl0cCA9ICZlc3AtPnRhcmdldFt0YXJnZXRdOworCWRldiA9IF9fc2NzaV9kZXZpY2VfbG9va3VwX2J5X3RhcmdldCh0cC0+c3RhcmdldCwgbHVuKTsKKwlpZiAoIWRldikgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJlc3AlZDogUmVjb25uZWN0LCBubyBscCAiCisJCSAgICAgICAidGd0WyV1XSBsdW5bJXVdXG4iLAorCQkgICAgICAgZXNwLT5ob3N0LT51bmlxdWVfaWQsIHRhcmdldCwgbHVuKTsKKwkJZ290byBkb19yZXNldDsKKwl9CisJbHAgPSBkZXYtPmhvc3RkYXRhOworCisJZW50ID0gbHAtPm5vbl90YWdnZWRfY21kOworCWlmICghZW50KSB7CisJCWVudCA9IGVzcF9yZWNvbm5lY3Rfd2l0aF90YWcoZXNwLCBscCk7CisJCWlmICghZW50KQorCQkJZ290byBkb19yZXNldDsKKwl9CisKKwllc3AtPmFjdGl2ZV9jbWQgPSBlbnQ7CisKKwlpZiAoZW50LT5mbGFncyAmIEVTUF9DTURfRkxBR19BQk9SVCkgeworCQllc3AtPm1zZ19vdXRbMF0gPSBBQk9SVF9UQVNLX1NFVDsKKwkJZXNwLT5tc2dfb3V0X2xlbiA9IDE7CisJCXNjc2lfZXNwX2NtZChlc3AsIEVTUF9DTURfU0FUTik7CisJfQorCisJZXNwX2V2ZW50KGVzcCwgRVNQX0VWRU5UX0NIRUNLX1BIQVNFKTsKKwllc3BfcmVzdG9yZV9wb2ludGVycyhlc3AsIGVudCk7CisJZXNwLT5mbGFncyB8PSBFU1BfRkxBR19RVUlDS0lSUV9DSEVDSzsKKwlyZXR1cm4gMTsKKworZG9fcmVzZXQ6CisJZXNwX3NjaGVkdWxlX3Jlc2V0KGVzcCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZXNwX2ZpbmlzaF9zZWxlY3Qoc3RydWN0IGVzcCAqZXNwKQoreworCXN0cnVjdCBlc3BfY21kX2VudHJ5ICplbnQ7CisJc3RydWN0IHNjc2lfY21uZCAqY21kOworCXU4IG9yaWdfc2VsZWN0X3N0YXRlOworCisJb3JpZ19zZWxlY3Rfc3RhdGUgPSBlc3AtPnNlbGVjdF9zdGF0ZTsKKworCS8qIE5vIGxvbmdlciBzZWxlY3RpbmcuICAqLworCWVzcC0+c2VsZWN0X3N0YXRlID0gRVNQX1NFTEVDVF9OT05FOworCisJZXNwLT5zZXFyZWcgPSBlc3BfcmVhZDgoRVNQX1NTVEVQKSAmIEVTUF9TVEVQX1ZCSVRTOworCWVudCA9IGVzcC0+YWN0aXZlX2NtZDsKKwljbWQgPSBlbnQtPmNtZDsKKworCWlmIChlc3AtPm9wcy0+ZG1hX2Vycm9yKGVzcCkpIHsKKwkJLyogSWYgd2Ugc2VlIGEgRE1BIGVycm9yIGR1cmluZyBvciBhcyBhIHJlc3VsdCBvZiBzZWxlY3Rpb24sCisJCSAqIGFsbCBiZXRzIGFyZSBvZmYuCisJCSAqLworCQllc3Bfc2NoZWR1bGVfcmVzZXQoZXNwKTsKKwkJZXNwX2NtZF9pc19kb25lKGVzcCwgZW50LCBjbWQsIChESURfRVJST1IgPDwgMTYpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZXNwLT5vcHMtPmRtYV9pbnZhbGlkYXRlKGVzcCk7CisKKwlpZiAoZXNwLT5pcmVnID09IChFU1BfSU5UUl9SU0VMIHwgRVNQX0lOVFJfRkRPTkUpKSB7CisJCXN0cnVjdCBlc3BfdGFyZ2V0X2RhdGEgKnRwID0gJmVzcC0+dGFyZ2V0W2NtZC0+ZGV2aWNlLT5pZF07CisKKwkJLyogQ2FyZWZ1bGx5IGJhY2sgb3V0IG9mIHRoZSBzZWxlY3Rpb24gYXR0ZW1wdC4gIFJlbGVhc2UKKwkJICogcmVzb3VyY2VzIChzdWNoIGFzIERNQSBtYXBwaW5nICYgVEFHKSBhbmQgcmVzZXQgc3RhdGUgKHN1Y2gKKwkJICogYXMgbWVzc2FnZSBvdXQgYW5kIGNvbW1hbmQgZGVsaXZlcnkgdmFyaWFibGVzKS4KKwkJICovCisJCWlmICghKGVudC0+ZmxhZ3MgJiBFU1BfQ01EX0ZMQUdfQVVUT1NFTlNFKSkgeworCQkJZXNwX3VubWFwX2RtYShlc3AsIGNtZCk7CisJCQllc3BfZnJlZV9sdW5fdGFnKGVudCwgY21kLT5kZXZpY2UtPmhvc3RkYXRhKTsKKwkJCXRwLT5mbGFncyAmPSB+KEVTUF9UR1RfTkVHT19TWU5DIHwgRVNQX1RHVF9ORUdPX1dJREUpOworCQkJZXNwLT5mbGFncyAmPSB+RVNQX0ZMQUdfRE9JTkdfU0xPV0NNRDsKKwkJCWVzcC0+Y21kX2J5dGVzX3B0ciA9IE5VTEw7CisJCQllc3AtPmNtZF9ieXRlc19sZWZ0ID0gMDsKKwkJfSBlbHNlIHsKKwkJCWVzcC0+b3BzLT51bm1hcF9zaW5nbGUoZXNwLCBlbnQtPnNlbnNlX2RtYSwKKwkJCQkJICAgICAgIFNDU0lfU0VOU0VfQlVGRkVSU0laRSwKKwkJCQkJICAgICAgIERNQV9GUk9NX0RFVklDRSk7CisJCQllbnQtPnNlbnNlX3B0ciA9IE5VTEw7CisJCX0KKworCQkvKiBOb3cgdGhhdCB0aGUgc3RhdGUgaXMgdW53b3VuZCBwcm9wZXJseSwgcHV0IGJhY2sgb250bworCQkgKiB0aGUgaXNzdWUgcXVldWUuICBUaGlzIGNvbW1hbmQgaXMgbm8gbG9uZ2VyIGFjdGl2ZS4KKwkJICovCisJCWxpc3RfZGVsKCZlbnQtPmxpc3QpOworCQlsaXN0X2FkZCgmZW50LT5saXN0LCAmZXNwLT5xdWV1ZWRfY21kcyk7CisJCWVzcC0+YWN0aXZlX2NtZCA9IE5VTEw7CisKKwkJLyogUmV0dXJuIHZhbHVlIGlnbm9yZWQgYnkgY2FsbGVyLCBpdCBkaXJlY3RseSBpbnZva2VzCisJCSAqIGVzcF9yZWNvbm5lY3QoKS4KKwkJICovCisJCXJldHVybiAwOworCX0KKworCWlmIChlc3AtPmlyZWcgPT0gRVNQX0lOVFJfREMpIHsKKwkJc3RydWN0IHNjc2lfZGV2aWNlICpkZXYgPSBjbWQtPmRldmljZTsKKworCQkvKiBEaXNjb25uZWN0LiAgTWFrZSBzdXJlIHdlIHJlLW5lZ290aWF0ZSBzeW5jIGFuZAorCQkgKiB3aWRlIHBhcmFtZXRlcnMgaWYgdGhpcyB0YXJnZXQgc3RhcnRzIHJlc3BvbmRpbmcKKwkJICogYWdhaW4gaW4gdGhlIGZ1dHVyZS4KKwkJICovCisJCWVzcC0+dGFyZ2V0W2Rldi0+aWRdLmZsYWdzIHw9IEVTUF9UR1RfQ0hFQ0tfTkVHTzsKKworCQlzY3NpX2VzcF9jbWQoZXNwLCBFU1BfQ01EX0VTRUwpOworCQllc3BfY21kX2lzX2RvbmUoZXNwLCBlbnQsIGNtZCwgKERJRF9CQURfVEFSR0VUIDw8IDE2KSk7CisJCXJldHVybiAxOworCX0KKworCWlmIChlc3AtPmlyZWcgPT0gKEVTUF9JTlRSX0ZET05FIHwgRVNQX0lOVFJfQlNFUlYpKSB7CisJCS8qIFNlbGVjdGlvbiBzdWNjZXNzZnVsLiAgT24gcHJlLUZBU1QgY2hpcHMgd2UgaGF2ZQorCQkgKiB0byBkbyBhIE5PUCBhbmQgcG9zc2libHkgY2xlYW4gb3V0IHRoZSBGSUZPLgorCQkgKi8KKwkJaWYgKGVzcC0+cmV2IDw9IEVTUDIzNikgeworCQkJaW50IGZjbnQgPSBlc3BfcmVhZDgoRVNQX0ZGTEFHUykgJiBFU1BfRkZfRkJZVEVTOworCisJCQlzY3NpX2VzcF9jbWQoZXNwLCBFU1BfQ01EX05VTEwpOworCisJCQlpZiAoIWZjbnQgJiYKKwkJCSAgICAoIWVzcC0+cHJldl9zb2ZmIHx8CisJCQkgICAgICgoZXNwLT5zcmVnICYgRVNQX1NUQVRfUE1BU0spICE9IEVTUF9ESVApKSkKKwkJCQllc3BfZmx1c2hfZmlmbyhlc3ApOworCQl9CisKKwkJLyogSWYgd2UgYXJlIGRvaW5nIGEgc2xvdyBjb21tYW5kLCBuZWdvdGlhdGlvbiwgZXRjLgorCQkgKiB3ZSdsbCBkbyB0aGUgcmlnaHQgdGhpbmcgYXMgd2UgdHJhbnNpdGlvbiB0byB0aGUKKwkJICogbmV4dCBwaGFzZS4KKwkJICovCisJCWVzcF9ldmVudChlc3AsIEVTUF9FVkVOVF9DSEVDS19QSEFTRSk7CisJCXJldHVybiAwOworCX0KKworCXByaW50aygiRVNQOiBVbmV4cGVjdGVkIHNlbGVjdGlvbiBjb21wbGV0aW9uIGlyZWdbJXhdLlxuIiwKKwkgICAgICAgZXNwLT5pcmVnKTsKKwllc3Bfc2NoZWR1bGVfcmVzZXQoZXNwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlc3BfZGF0YV9ieXRlc19zZW50KHN0cnVjdCBlc3AgKmVzcCwgc3RydWN0IGVzcF9jbWRfZW50cnkgKmVudCwKKwkJCSAgICAgICBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCit7CisJaW50IGZpZm9fY250LCBlY291bnQsIGJ5dGVzX3NlbnQsIGZsdXNoX2ZpZm87CisKKwlmaWZvX2NudCA9IGVzcF9yZWFkOChFU1BfRkZMQUdTKSAmIEVTUF9GRl9GQllURVM7CisJaWYgKGVzcC0+cHJldl9jZmczICYgRVNQX0NPTkZJRzNfRVdJREUpCisJCWZpZm9fY250IDw8PSAxOworCisJZWNvdW50ID0gMDsKKwlpZiAoIShlc3AtPnNyZWcgJiBFU1BfU1RBVF9UQ05UKSkgeworCQllY291bnQgPSAoKHVuc2lnbmVkIGludCllc3BfcmVhZDgoRVNQX1RDTE9XKSB8CisJCQkgICgoKHVuc2lnbmVkIGludCllc3BfcmVhZDgoRVNQX1RDTUVEKSkgPDwgOCkpOworCQlpZiAoZXNwLT5yZXYgPT0gRkFTSE1FKQorCQkJZWNvdW50IHw9ICgodW5zaWduZWQgaW50KWVzcF9yZWFkOChGQVNfUkxPKSkgPDwgMTY7CisJfQorCisJYnl0ZXNfc2VudCA9IGVzcC0+ZGF0YV9kbWFfbGVuOworCWJ5dGVzX3NlbnQgLT0gZWNvdW50OworCisJaWYgKCEoZW50LT5mbGFncyAmIEVTUF9DTURfRkxBR19XUklURSkpCisJCWJ5dGVzX3NlbnQgLT0gZmlmb19jbnQ7CisKKwlmbHVzaF9maWZvID0gMDsKKwlpZiAoIWVzcC0+cHJldl9zb2ZmKSB7CisJCS8qIFN5bmNocm9ub3VzIGRhdGEgdHJhbnNmZXIsIGFsd2F5cyBmbHVzaCBmaWZvLiAqLworCQlmbHVzaF9maWZvID0gMTsKKwl9IGVsc2UgeworCQlpZiAoZXNwLT5yZXYgPT0gRVNQMTAwKSB7CisJCQl1MzIgZmZsYWdzLCBwaGFzZTsKKworCQkJLyogRVNQMTAwIGhhcyBhIGNoaXAgYnVnIHdoZXJlIGluIHRoZSBzeW5jaHJvbm91cyBkYXRhCisJCQkgKiBwaGFzZSBpdCBjYW4gbWlzdGFrZSBhIGZpbmFsIGxvbmcgUkVRIHB1bHNlIGZyb20gdGhlCisJCQkgKiB0YXJnZXQgYXMgYW4gZXh0cmEgZGF0YSBieXRlLiAgRnVuLgorCQkJICoKKwkJCSAqIFRvIGRldGVjdCB0aGlzIGNhc2Ugd2UgcmVzYW1wbGUgdGhlIHN0YXR1cyByZWdpc3RlcgorCQkJICogYW5kIGZpZm8gZmxhZ3MuICBJZiB3ZSdyZSBzdGlsbCBpbiBhIGRhdGEgcGhhc2UgYW5kCisJCQkgKiB3ZSBzZWUgc3B1cmlvdXMgY2h1bmtzIGluIHRoZSBmaWZvLCB3ZSByZXR1cm4gZXJyb3IKKwkJCSAqIHRvIHRoZSBjYWxsZXIgd2hpY2ggc2hvdWxkIHJlc2V0IGFuZCBzZXQgdGhpbmdzIHVwCisJCQkgKiBzdWNoIHRoYXQgd2Ugb25seSB0cnkgZnV0dXJlIHRyYW5zZmVycyB0byB0aGlzCisJCQkgKiB0YXJnZXQgaW4gc3luY2hyb25vdXMgbW9kZS4KKwkJCSAqLworCQkJZXNwLT5zcmVnID0gZXNwX3JlYWQ4KEVTUF9TVEFUVVMpOworCQkJcGhhc2UgPSBlc3AtPnNyZWcgJiBFU1BfU1RBVF9QTUFTSzsKKwkJCWZmbGFncyA9IGVzcF9yZWFkOChFU1BfRkZMQUdTKTsKKworCQkJaWYgKChwaGFzZSA9PSBFU1BfRE9QICYmCisJCQkgICAgIChmZmxhZ3MgJiBFU1BfRkZfT05PVFpFUk8pKSB8fAorCQkJICAgIChwaGFzZSA9PSBFU1BfRElQICYmCisJCQkgICAgIChmZmxhZ3MgJiBFU1BfRkZfRkJZVEVTKSkpCisJCQkJcmV0dXJuIC0xOworCQl9CisJCWlmICghKGVudC0+ZmxhZ3MgJiBFU1BfQ01EX0ZMQUdfV1JJVEUpKQorCQkJZmx1c2hfZmlmbyA9IDE7CisJfQorCisJaWYgKGZsdXNoX2ZpZm8pCisJCWVzcF9mbHVzaF9maWZvKGVzcCk7CisKKwlyZXR1cm4gYnl0ZXNfc2VudDsKK30KKworc3RhdGljIHZvaWQgZXNwX3NldHN5bmMoc3RydWN0IGVzcCAqZXNwLCBzdHJ1Y3QgZXNwX3RhcmdldF9kYXRhICp0cCwKKwkJCXU4IHNjc2lfcGVyaW9kLCB1OCBzY3NpX29mZnNldCwKKwkJCXU4IGVzcF9zdHAsIHU4IGVzcF9zb2ZmKQoreworCXNwaV9wZXJpb2QodHAtPnN0YXJnZXQpID0gc2NzaV9wZXJpb2Q7CisJc3BpX29mZnNldCh0cC0+c3RhcmdldCkgPSBzY3NpX29mZnNldDsKKwlzcGlfd2lkdGgodHAtPnN0YXJnZXQpID0gKHRwLT5mbGFncyAmIEVTUF9UR1RfV0lERSkgPyAxIDogMDsKKworCWlmIChlc3Bfc29mZikgeworCQllc3Bfc3RwICY9IDB4MWY7CisJCWVzcF9zb2ZmIHw9IGVzcC0+cmFkZWxheTsKKwkJaWYgKGVzcC0+cmV2ID49IEZBUzIzNikgeworCQkJdTggYml0ID0gRVNQX0NPTkZJRzNfRlNDU0k7CisJCQlpZiAoZXNwLT5yZXYgPj0gRkFTMTAwQSkKKwkJCQliaXQgPSBFU1BfQ09ORklHM19GQVNUOworCisJCQlpZiAoc2NzaV9wZXJpb2QgPCA1MCkgeworCQkJCWlmIChlc3AtPnJldiA9PSBGQVNITUUpCisJCQkJCWVzcF9zb2ZmICY9IH5lc3AtPnJhZGVsYXk7CisJCQkJdHAtPmVzcF9jb25maWczIHw9IGJpdDsKKwkJCX0gZWxzZSB7CisJCQkJdHAtPmVzcF9jb25maWczICY9IH5iaXQ7CisJCQl9CisJCQllc3AtPnByZXZfY2ZnMyA9IHRwLT5lc3BfY29uZmlnMzsKKwkJCWVzcF93cml0ZTgoZXNwLT5wcmV2X2NmZzMsIEVTUF9DRkczKTsKKwkJfQorCX0KKworCXRwLT5lc3BfcGVyaW9kID0gZXNwLT5wcmV2X3N0cCA9IGVzcF9zdHA7CisJdHAtPmVzcF9vZmZzZXQgPSBlc3AtPnByZXZfc29mZiA9IGVzcF9zb2ZmOworCisJZXNwX3dyaXRlOChlc3Bfc29mZiwgRVNQX1NPRkYpOworCWVzcF93cml0ZTgoZXNwX3N0cCwgRVNQX1NUUCk7CisKKwl0cC0+ZmxhZ3MgJj0gfihFU1BfVEdUX05FR09fU1lOQyB8IEVTUF9UR1RfQ0hFQ0tfTkVHTyk7CisKKwlzcGlfZGlzcGxheV94ZmVyX2FncmVlbWVudCh0cC0+c3RhcmdldCk7Cit9CisKK3N0YXRpYyB2b2lkIGVzcF9tc2dpbl9yZWplY3Qoc3RydWN0IGVzcCAqZXNwKQoreworCXN0cnVjdCBlc3BfY21kX2VudHJ5ICplbnQgPSBlc3AtPmFjdGl2ZV9jbWQ7CisJc3RydWN0IHNjc2lfY21uZCAqY21kID0gZW50LT5jbWQ7CisJc3RydWN0IGVzcF90YXJnZXRfZGF0YSAqdHA7CisJaW50IHRndDsKKworCXRndCA9IGNtZC0+ZGV2aWNlLT5pZDsKKwl0cCA9ICZlc3AtPnRhcmdldFt0Z3RdOworCisJaWYgKHRwLT5mbGFncyAmIEVTUF9UR1RfTkVHT19XSURFKSB7CisJCXRwLT5mbGFncyAmPSB+KEVTUF9UR1RfTkVHT19XSURFIHwgRVNQX1RHVF9XSURFKTsKKworCQlpZiAoIWVzcF9uZWVkX3RvX25lZ29fc3luYyh0cCkpIHsKKwkJCXRwLT5mbGFncyAmPSB+RVNQX1RHVF9DSEVDS19ORUdPOworCQkJc2NzaV9lc3BfY21kKGVzcCwgRVNQX0NNRF9SQVROKTsKKwkJfSBlbHNlIHsKKwkJCWVzcC0+bXNnX291dF9sZW4gPQorCQkJCXNwaV9wb3B1bGF0ZV9zeW5jX21zZygmZXNwLT5tc2dfb3V0WzBdLAorCQkJCQkJICAgICAgdHAtPm5lZ29fZ29hbF9wZXJpb2QsCisJCQkJCQkgICAgICB0cC0+bmVnb19nb2FsX29mZnNldCk7CisJCQl0cC0+ZmxhZ3MgfD0gRVNQX1RHVF9ORUdPX1NZTkM7CisJCQlzY3NpX2VzcF9jbWQoZXNwLCBFU1BfQ01EX1NBVE4pOworCQl9CisJCXJldHVybjsKKwl9CisKKwlpZiAodHAtPmZsYWdzICYgRVNQX1RHVF9ORUdPX1NZTkMpIHsKKwkJdHAtPmZsYWdzICY9IH4oRVNQX1RHVF9ORUdPX1NZTkMgfCBFU1BfVEdUX0NIRUNLX05FR08pOworCQl0cC0+ZXNwX3BlcmlvZCA9IDA7CisJCXRwLT5lc3Bfb2Zmc2V0ID0gMDsKKwkJZXNwX3NldHN5bmMoZXNwLCB0cCwgMCwgMCwgMCwgMCk7CisJCXNjc2lfZXNwX2NtZChlc3AsIEVTUF9DTURfUkFUTik7CisJCXJldHVybjsKKwl9CisKKwllc3AtPm1zZ19vdXRbMF0gPSBBQk9SVF9UQVNLX1NFVDsKKwllc3AtPm1zZ19vdXRfbGVuID0gMTsKKwlzY3NpX2VzcF9jbWQoZXNwLCBFU1BfQ01EX1NBVE4pOworfQorCitzdGF0aWMgdm9pZCBlc3BfbXNnaW5fc2R0cihzdHJ1Y3QgZXNwICplc3AsIHN0cnVjdCBlc3BfdGFyZ2V0X2RhdGEgKnRwKQoreworCXU4IHBlcmlvZCA9IGVzcC0+bXNnX2luWzNdOworCXU4IG9mZnNldCA9IGVzcC0+bXNnX2luWzRdOworCXU4IHN0cDsKKworCWlmICghKHRwLT5mbGFncyAmIEVTUF9UR1RfTkVHT19TWU5DKSkKKwkJZ290byBkb19yZWplY3Q7CisKKwlpZiAob2Zmc2V0ID4gMTUpCisJCWdvdG8gZG9fcmVqZWN0OworCisJaWYgKG9mZnNldCkgeworCQlpbnQgcm91bmRlZF91cCwgb25lX2Nsb2NrOworCisJCWlmIChwZXJpb2QgPiBlc3AtPm1heF9wZXJpb2QpIHsKKwkJCXBlcmlvZCA9IG9mZnNldCA9IDA7CisJCQlnb3RvIGRvX3NkdHI7CisJCX0KKwkJaWYgKHBlcmlvZCA8IGVzcC0+bWluX3BlcmlvZCkKKwkJCWdvdG8gZG9fcmVqZWN0OworCisJCW9uZV9jbG9jayA9IGVzcC0+Y2N5Y2xlIC8gMTAwMDsKKwkJcm91bmRlZF91cCA9IChwZXJpb2QgPDwgMik7CisJCXJvdW5kZWRfdXAgPSAocm91bmRlZF91cCArIG9uZV9jbG9jayAtIDEpIC8gb25lX2Nsb2NrOworCQlzdHAgPSByb3VuZGVkX3VwOworCQlpZiAoc3RwICYmIGVzcC0+cmV2ID49IEZBUzIzNikgeworCQkJaWYgKHN0cCA+PSA1MCkKKwkJCQlzdHAtLTsKKwkJfQorCX0gZWxzZSB7CisJCXN0cCA9IDA7CisJfQorCisJZXNwX3NldHN5bmMoZXNwLCB0cCwgcGVyaW9kLCBvZmZzZXQsIHN0cCwgb2Zmc2V0KTsKKwlyZXR1cm47CisKK2RvX3JlamVjdDoKKwllc3AtPm1zZ19vdXRbMF0gPSBNRVNTQUdFX1JFSkVDVDsKKwllc3AtPm1zZ19vdXRfbGVuID0gMTsKKwlzY3NpX2VzcF9jbWQoZXNwLCBFU1BfQ01EX1NBVE4pOworCXJldHVybjsKKworZG9fc2R0cjoKKwl0cC0+bmVnb19nb2FsX3BlcmlvZCA9IHBlcmlvZDsKKwl0cC0+bmVnb19nb2FsX29mZnNldCA9IG9mZnNldDsKKwllc3AtPm1zZ19vdXRfbGVuID0KKwkJc3BpX3BvcHVsYXRlX3N5bmNfbXNnKCZlc3AtPm1zZ19vdXRbMF0sCisJCQkJICAgICAgdHAtPm5lZ29fZ29hbF9wZXJpb2QsCisJCQkJICAgICAgdHAtPm5lZ29fZ29hbF9vZmZzZXQpOworCXNjc2lfZXNwX2NtZChlc3AsIEVTUF9DTURfU0FUTik7Cit9CisKK3N0YXRpYyB2b2lkIGVzcF9tc2dpbl93ZHRyKHN0cnVjdCBlc3AgKmVzcCwgc3RydWN0IGVzcF90YXJnZXRfZGF0YSAqdHApCit7CisJaW50IHNpemUgPSA4IDw8IGVzcC0+bXNnX2luWzNdOworCXU4IGNmZzM7CisKKwlpZiAoZXNwLT5yZXYgIT0gRkFTSE1FKQorCQlnb3RvIGRvX3JlamVjdDsKKworCWlmIChzaXplICE9IDggJiYgc2l6ZSAhPSAxNikKKwkJZ290byBkb19yZWplY3Q7CisKKwlpZiAoISh0cC0+ZmxhZ3MgJiBFU1BfVEdUX05FR09fV0lERSkpCisJCWdvdG8gZG9fcmVqZWN0OworCisJY2ZnMyA9IHRwLT5lc3BfY29uZmlnMzsKKwlpZiAoc2l6ZSA9PSAxNikgeworCQl0cC0+ZmxhZ3MgfD0gRVNQX1RHVF9XSURFOworCQljZmczIHw9IEVTUF9DT05GSUczX0VXSURFOworCX0gZWxzZSB7CisJCXRwLT5mbGFncyAmPSB+RVNQX1RHVF9XSURFOworCQljZmczICY9IH5FU1BfQ09ORklHM19FV0lERTsKKwl9CisJdHAtPmVzcF9jb25maWczID0gY2ZnMzsKKwllc3AtPnByZXZfY2ZnMyA9IGNmZzM7CisJZXNwX3dyaXRlOChjZmczLCBFU1BfQ0ZHMyk7CisKKwl0cC0+ZmxhZ3MgJj0gfkVTUF9UR1RfTkVHT19XSURFOworCisJc3BpX3BlcmlvZCh0cC0+c3RhcmdldCkgPSAwOworCXNwaV9vZmZzZXQodHAtPnN0YXJnZXQpID0gMDsKKwlpZiAoIWVzcF9uZWVkX3RvX25lZ29fc3luYyh0cCkpIHsKKwkJdHAtPmZsYWdzICY9IH5FU1BfVEdUX0NIRUNLX05FR087CisJCXNjc2lfZXNwX2NtZChlc3AsIEVTUF9DTURfUkFUTik7CisJfSBlbHNlIHsKKwkJZXNwLT5tc2dfb3V0X2xlbiA9CisJCQlzcGlfcG9wdWxhdGVfc3luY19tc2coJmVzcC0+bXNnX291dFswXSwKKwkJCQkJICAgICAgdHAtPm5lZ29fZ29hbF9wZXJpb2QsCisJCQkJCSAgICAgIHRwLT5uZWdvX2dvYWxfb2Zmc2V0KTsKKwkJdHAtPmZsYWdzIHw9IEVTUF9UR1RfTkVHT19TWU5DOworCQlzY3NpX2VzcF9jbWQoZXNwLCBFU1BfQ01EX1NBVE4pOworCX0KKwlyZXR1cm47CisKK2RvX3JlamVjdDoKKwllc3AtPm1zZ19vdXRbMF0gPSBNRVNTQUdFX1JFSkVDVDsKKwllc3AtPm1zZ19vdXRfbGVuID0gMTsKKwlzY3NpX2VzcF9jbWQoZXNwLCBFU1BfQ01EX1NBVE4pOworfQorCitzdGF0aWMgdm9pZCBlc3BfbXNnaW5fZXh0ZW5kZWQoc3RydWN0IGVzcCAqZXNwKQoreworCXN0cnVjdCBlc3BfY21kX2VudHJ5ICplbnQgPSBlc3AtPmFjdGl2ZV9jbWQ7CisJc3RydWN0IHNjc2lfY21uZCAqY21kID0gZW50LT5jbWQ7CisJc3RydWN0IGVzcF90YXJnZXRfZGF0YSAqdHA7CisJaW50IHRndCA9IGNtZC0+ZGV2aWNlLT5pZDsKKworCXRwID0gJmVzcC0+dGFyZ2V0W3RndF07CisJaWYgKGVzcC0+bXNnX2luWzJdID09IEVYVEVOREVEX1NEVFIpIHsKKwkJZXNwX21zZ2luX3NkdHIoZXNwLCB0cCk7CisJCXJldHVybjsKKwl9CisJaWYgKGVzcC0+bXNnX2luWzJdID09IEVYVEVOREVEX1dEVFIpIHsKKwkJZXNwX21zZ2luX3dkdHIoZXNwLCB0cCk7CisJCXJldHVybjsKKwl9CisKKwlwcmludGsoIkVTUDogVW5leHBlY3RlZCBleHRlbmRlZCBtc2cgdHlwZSAleFxuIiwKKwkgICAgICAgZXNwLT5tc2dfaW5bMl0pOworCisJZXNwLT5tc2dfb3V0WzBdID0gQUJPUlRfVEFTS19TRVQ7CisJZXNwLT5tc2dfb3V0X2xlbiA9IDE7CisJc2NzaV9lc3BfY21kKGVzcCwgRVNQX0NNRF9TQVROKTsKK30KKworLyogQW5hbHl6ZSBtc2dpbiBieXRlcyByZWNlaXZlZCBmcm9tIHRhcmdldCBzbyBmYXIuICBSZXR1cm4gbm9uLXplcm8KKyAqIGlmIHRoZXJlIGFyZSBtb3JlIGJ5dGVzIG5lZWRlZCB0byBjb21wbGV0ZSB0aGUgbWVzc2FnZS4KKyAqLworc3RhdGljIGludCBlc3BfbXNnaW5fcHJvY2VzcyhzdHJ1Y3QgZXNwICplc3ApCit7CisJdTggbXNnMCA9IGVzcC0+bXNnX2luWzBdOworCWludCBsZW4gPSBlc3AtPm1zZ19pbl9sZW47CisKKwlpZiAobXNnMCAmIDB4ODApIHsKKwkJLyogSWRlbnRpZnkgKi8KKwkJcHJpbnRrKCJFU1A6IFVuZXhwZWN0ZWQgbXNnaW4gaWRlbnRpZnlcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlzd2l0Y2ggKG1zZzApIHsKKwljYXNlIEVYVEVOREVEX01FU1NBR0U6CisJCWlmIChsZW4gPT0gMSkKKwkJCXJldHVybiAxOworCQlpZiAobGVuIDwgZXNwLT5tc2dfaW5bMV0gKyAyKQorCQkJcmV0dXJuIDE7CisJCWVzcF9tc2dpbl9leHRlbmRlZChlc3ApOworCQlyZXR1cm4gMDsKKworCWNhc2UgSUdOT1JFX1dJREVfUkVTSURVRTogeworCQlzdHJ1Y3QgZXNwX2NtZF9lbnRyeSAqZW50OworCQlzdHJ1Y3QgZXNwX2NtZF9wcml2ICpzcHJpdjsKKwkJaWYgKGxlbiA9PSAxKQorCQkJcmV0dXJuIDE7CisKKwkJaWYgKGVzcC0+bXNnX2luWzFdICE9IDEpCisJCQlnb3RvIGRvX3JlamVjdDsKKworCQllbnQgPSBlc3AtPmFjdGl2ZV9jbWQ7CisJCXNwcml2ID0gRVNQX0NNRF9QUklWKGVudC0+Y21kKTsKKworCQlpZiAoc3ByaXYtPmN1cl9yZXNpZHVlID09IHNnX2RtYV9sZW4oc3ByaXYtPmN1cl9zZykpIHsKKwkJCXNwcml2LT5jdXJfc2ctLTsKKwkJCXNwcml2LT5jdXJfcmVzaWR1ZSA9IDE7CisJCX0gZWxzZQorCQkJc3ByaXYtPmN1cl9yZXNpZHVlKys7CisJCXNwcml2LT50b3RfcmVzaWR1ZSsrOworCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBOT1A6CisJCXJldHVybiAwOworCWNhc2UgUkVTVE9SRV9QT0lOVEVSUzoKKwkJZXNwX3Jlc3RvcmVfcG9pbnRlcnMoZXNwLCBlc3AtPmFjdGl2ZV9jbWQpOworCQlyZXR1cm4gMDsKKwljYXNlIFNBVkVfUE9JTlRFUlM6CisJCWVzcF9zYXZlX3BvaW50ZXJzKGVzcCwgZXNwLT5hY3RpdmVfY21kKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIENPTU1BTkRfQ09NUExFVEU6CisJY2FzZSBESVNDT05ORUNUOiB7CisJCXN0cnVjdCBlc3BfY21kX2VudHJ5ICplbnQgPSBlc3AtPmFjdGl2ZV9jbWQ7CisKKwkJZW50LT5tZXNzYWdlID0gbXNnMDsKKwkJZXNwX2V2ZW50KGVzcCwgRVNQX0VWRU5UX0ZSRUVfQlVTKTsKKwkJZXNwLT5mbGFncyB8PSBFU1BfRkxBR19RVUlDS0lSUV9DSEVDSzsKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgTUVTU0FHRV9SRUpFQ1Q6CisJCWVzcF9tc2dpbl9yZWplY3QoZXNwKTsKKwkJcmV0dXJuIDA7CisKKwlkZWZhdWx0OgorCWRvX3JlamVjdDoKKwkJZXNwLT5tc2dfb3V0WzBdID0gTUVTU0FHRV9SRUpFQ1Q7CisJCWVzcC0+bXNnX291dF9sZW4gPSAxOworCQlzY3NpX2VzcF9jbWQoZXNwLCBFU1BfQ01EX1NBVE4pOworCQlyZXR1cm4gMDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZXNwX3Byb2Nlc3NfZXZlbnQoc3RydWN0IGVzcCAqZXNwKQoreworCWludCB3cml0ZTsKKworYWdhaW46CisJd3JpdGUgPSAwOworCXN3aXRjaCAoZXNwLT5ldmVudCkgeworCWNhc2UgRVNQX0VWRU5UX0NIRUNLX1BIQVNFOgorCQlzd2l0Y2ggKGVzcC0+c3JlZyAmIEVTUF9TVEFUX1BNQVNLKSB7CisJCWNhc2UgRVNQX0RPUDoKKwkJCWVzcF9ldmVudChlc3AsIEVTUF9FVkVOVF9EQVRBX09VVCk7CisJCQlicmVhazsKKwkJY2FzZSBFU1BfRElQOgorCQkJZXNwX2V2ZW50KGVzcCwgRVNQX0VWRU5UX0RBVEFfSU4pOworCQkJYnJlYWs7CisJCWNhc2UgRVNQX1NUQVRQOgorCQkJZXNwX2ZsdXNoX2ZpZm8oZXNwKTsKKwkJCXNjc2lfZXNwX2NtZChlc3AsIEVTUF9DTURfSUNDU0VRKTsKKwkJCWVzcF9ldmVudChlc3AsIEVTUF9FVkVOVF9TVEFUVVMpOworCQkJZXNwLT5mbGFncyB8PSBFU1BfRkxBR19RVUlDS0lSUV9DSEVDSzsKKwkJCXJldHVybiAxOworCisJCWNhc2UgRVNQX01PUDoKKwkJCWVzcF9ldmVudChlc3AsIEVTUF9FVkVOVF9NU0dPVVQpOworCQkJYnJlYWs7CisKKwkJY2FzZSBFU1BfTUlQOgorCQkJZXNwX2V2ZW50KGVzcCwgRVNQX0VWRU5UX01TR0lOKTsKKwkJCWJyZWFrOworCisJCWNhc2UgRVNQX0NNRFA6CisJCQllc3BfZXZlbnQoZXNwLCBFU1BfRVZFTlRfQ01EX1NUQVJUKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlwcmludGsoIkVTUDogVW5leHBlY3RlZCBwaGFzZSwgc3JlZz0lMDJ4XG4iLAorCQkJICAgICAgIGVzcC0+c3JlZyk7CisJCQllc3Bfc2NoZWR1bGVfcmVzZXQoZXNwKTsKKwkJCXJldHVybiAwOworCQl9CisJCWdvdG8gYWdhaW47CisJCWJyZWFrOworCisJY2FzZSBFU1BfRVZFTlRfREFUQV9JTjoKKwkJd3JpdGUgPSAxOworCQkvKiBmYWxsdGhydSAqLworCisJY2FzZSBFU1BfRVZFTlRfREFUQV9PVVQ6IHsKKwkJc3RydWN0IGVzcF9jbWRfZW50cnkgKmVudCA9IGVzcC0+YWN0aXZlX2NtZDsKKwkJc3RydWN0IHNjc2lfY21uZCAqY21kID0gZW50LT5jbWQ7CisJCWRtYV9hZGRyX3QgZG1hX2FkZHIgPSBlc3BfY3VyX2RtYV9hZGRyKGVudCwgY21kKTsKKwkJdW5zaWduZWQgaW50IGRtYV9sZW4gPSBlc3BfY3VyX2RtYV9sZW4oZW50LCBjbWQpOworCisJCWlmIChlc3AtPnJldiA9PSBFU1AxMDApCisJCQlzY3NpX2VzcF9jbWQoZXNwLCBFU1BfQ01EX05VTEwpOworCisJCWlmICh3cml0ZSkKKwkJCWVudC0+ZmxhZ3MgfD0gRVNQX0NNRF9GTEFHX1dSSVRFOworCQllbHNlCisJCQllbnQtPmZsYWdzICY9IH5FU1BfQ01EX0ZMQUdfV1JJVEU7CisKKwkJZG1hX2xlbiA9IGVzcF9kbWFfbGVuZ3RoX2xpbWl0KGVzcCwgZG1hX2FkZHIsIGRtYV9sZW4pOworCQllc3AtPmRhdGFfZG1hX2xlbiA9IGRtYV9sZW47CisKKwkJaWYgKCFkbWFfbGVuKSB7CisJCQlwcmludGsoS0VSTl9FUlIgUEZYICJlc3AlZDogRE1BIGxlbmd0aCBpcyB6ZXJvIVxuIiwKKwkJCSAgICAgICBlc3AtPmhvc3QtPnVuaXF1ZV9pZCk7CisJCQlwcmludGsoS0VSTl9FUlIgUEZYICJlc3AlZDogY3VyIGFkclslMDhsbHhdIGxlblslMDh4XVxuIiwKKwkJCSAgICAgICBlc3AtPmhvc3QtPnVuaXF1ZV9pZCwKKwkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWVzcF9jdXJfZG1hX2FkZHIoZW50LCBjbWQpLAorCQkJICAgICAgIGVzcF9jdXJfZG1hX2xlbihlbnQsIGNtZCkpOworCQkJZXNwX3NjaGVkdWxlX3Jlc2V0KGVzcCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWVzcF9sb2dfZGF0YXN0YXJ0KCJFU1A6IHN0YXJ0IGRhdGEgYWRkclslMDhsbHhdIGxlblsldV0gIgorCQkJCSAgIndyaXRlKCVkKVxuIiwKKwkJCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpZG1hX2FkZHIsIGRtYV9sZW4sIHdyaXRlKTsKKworCQllc3AtPm9wcy0+c2VuZF9kbWFfY21kKGVzcCwgZG1hX2FkZHIsIGRtYV9sZW4sIGRtYV9sZW4sCisJCQkJICAgICAgIHdyaXRlLCBFU1BfQ01EX0RNQSB8IEVTUF9DTURfVEkpOworCQllc3BfZXZlbnQoZXNwLCBFU1BfRVZFTlRfREFUQV9ET05FKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgRVNQX0VWRU5UX0RBVEFfRE9ORTogeworCQlzdHJ1Y3QgZXNwX2NtZF9lbnRyeSAqZW50ID0gZXNwLT5hY3RpdmVfY21kOworCQlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQgPSBlbnQtPmNtZDsKKwkJaW50IGJ5dGVzX3NlbnQ7CisKKwkJaWYgKGVzcC0+b3BzLT5kbWFfZXJyb3IoZXNwKSkgeworCQkJcHJpbnRrKCJFU1A6IGRhdGEgZG9uZSwgRE1BIGVycm9yLCByZXNldHRpbmdcbiIpOworCQkJZXNwX3NjaGVkdWxlX3Jlc2V0KGVzcCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWlmIChlbnQtPmZsYWdzICYgRVNQX0NNRF9GTEFHX1dSSVRFKSB7CisJCQkvKiBYWFggcGFyaXR5IGVycm9ycywgZXRjLiBYWFggKi8KKworCQkJZXNwLT5vcHMtPmRtYV9kcmFpbihlc3ApOworCQl9CisJCWVzcC0+b3BzLT5kbWFfaW52YWxpZGF0ZShlc3ApOworCisJCWlmIChlc3AtPmlyZWcgIT0gRVNQX0lOVFJfQlNFUlYpIHsKKwkJCS8qIFdlIHNob3VsZCBhbHdheXMgc2VlIGV4YWN0bHkgYSBidXMtc2VydmljZQorCQkJICogaW50ZXJydXB0IGF0IHRoZSBlbmQgb2YgYSBzdWNjZXNzZnVsIHRyYW5zZmVyLgorCQkJICovCisJCQlwcmludGsoIkVTUDogZGF0YSBkb25lLCBub3QgQlNFUlYsIHJlc2V0dGluZ1xuIik7CisJCQllc3Bfc2NoZWR1bGVfcmVzZXQoZXNwKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJYnl0ZXNfc2VudCA9IGVzcF9kYXRhX2J5dGVzX3NlbnQoZXNwLCBlbnQsIGNtZCk7CisKKwkJZXNwX2xvZ19kYXRhZG9uZSgiRVNQOiBkYXRhIGRvbmUgZmxnc1sleF0gc2VudFslZF1cbiIsCisJCQkJIGVudC0+ZmxhZ3MsIGJ5dGVzX3NlbnQpOworCisJCWlmIChieXRlc19zZW50IDwgMCkgeworCQkJLyogWFhYIGZvcmNlIHN5bmMgbW9kZSBmb3IgdGhpcyB0YXJnZXQgWFhYICovCisJCQllc3Bfc2NoZWR1bGVfcmVzZXQoZXNwKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJZXNwX2FkdmFuY2VfZG1hKGVzcCwgZW50LCBjbWQsIGJ5dGVzX3NlbnQpOworCQllc3BfZXZlbnQoZXNwLCBFU1BfRVZFTlRfQ0hFQ0tfUEhBU0UpOworCQlnb3RvIGFnYWluOworCQlicmVhazsKKwl9CisKKwljYXNlIEVTUF9FVkVOVF9TVEFUVVM6IHsKKwkJc3RydWN0IGVzcF9jbWRfZW50cnkgKmVudCA9IGVzcC0+YWN0aXZlX2NtZDsKKworCQlpZiAoZXNwLT5pcmVnICYgRVNQX0lOVFJfRkRPTkUpIHsKKwkJCWVudC0+c3RhdHVzID0gZXNwX3JlYWQ4KEVTUF9GREFUQSk7CisJCQllbnQtPm1lc3NhZ2UgPSBlc3BfcmVhZDgoRVNQX0ZEQVRBKTsKKwkJCXNjc2lfZXNwX2NtZChlc3AsIEVTUF9DTURfTU9LKTsKKwkJfSBlbHNlIGlmIChlc3AtPmlyZWcgPT0gRVNQX0lOVFJfQlNFUlYpIHsKKwkJCWVudC0+c3RhdHVzID0gZXNwX3JlYWQ4KEVTUF9GREFUQSk7CisJCQllbnQtPm1lc3NhZ2UgPSAweGZmOworCQkJZXNwX2V2ZW50KGVzcCwgRVNQX0VWRU5UX01TR0lOKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYgKGVudC0+bWVzc2FnZSAhPSBDT01NQU5EX0NPTVBMRVRFKSB7CisJCQlwcmludGsoIkVTUDogVW5leHBlY3RlZCBtZXNzYWdlICV4IGluIHN0YXR1c1xuIiwKKwkJCSAgICAgICBlbnQtPm1lc3NhZ2UpOworCQkJZXNwX3NjaGVkdWxlX3Jlc2V0KGVzcCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWVzcF9ldmVudChlc3AsIEVTUF9FVkVOVF9GUkVFX0JVUyk7CisJCWVzcC0+ZmxhZ3MgfD0gRVNQX0ZMQUdfUVVJQ0tJUlFfQ0hFQ0s7CisJCWJyZWFrOworCX0KKwljYXNlIEVTUF9FVkVOVF9GUkVFX0JVUzogeworCQlzdHJ1Y3QgZXNwX2NtZF9lbnRyeSAqZW50ID0gZXNwLT5hY3RpdmVfY21kOworCQlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQgPSBlbnQtPmNtZDsKKworCQlpZiAoZW50LT5tZXNzYWdlID09IENPTU1BTkRfQ09NUExFVEUgfHwKKwkJICAgIGVudC0+bWVzc2FnZSA9PSBESVNDT05ORUNUKQorCQkJc2NzaV9lc3BfY21kKGVzcCwgRVNQX0NNRF9FU0VMKTsKKworCQlpZiAoZW50LT5tZXNzYWdlID09IENPTU1BTkRfQ09NUExFVEUpIHsKKwkJCWVzcF9sb2dfY21kZG9uZSgiRVNQOiBDb21tYW5kIGRvbmUgc3RhdHVzWyV4XSAiCisJCQkJCSJtZXNzYWdlWyV4XVxuIiwKKwkJCQkJZW50LT5zdGF0dXMsIGVudC0+bWVzc2FnZSk7CisJCQlpZiAoZW50LT5zdGF0dXMgPT0gU0FNX1NUQVRfVEFTS19TRVRfRlVMTCkKKwkJCQllc3BfZXZlbnRfcXVldWVfZnVsbChlc3AsIGVudCk7CisKKwkJCWlmIChlbnQtPnN0YXR1cyA9PSBTQU1fU1RBVF9DSEVDS19DT05ESVRJT04gJiYKKwkJCSAgICAhKGVudC0+ZmxhZ3MgJiBFU1BfQ01EX0ZMQUdfQVVUT1NFTlNFKSkgeworCQkJCWVudC0+ZmxhZ3MgfD0gRVNQX0NNRF9GTEFHX0FVVE9TRU5TRTsKKwkJCQllc3BfYXV0b3NlbnNlKGVzcCwgZW50KTsKKwkJCX0gZWxzZSB7CisJCQkJZXNwX2NtZF9pc19kb25lKGVzcCwgZW50LCBjbWQsCisJCQkJCQljb21wb3NlX3Jlc3VsdChlbnQtPnN0YXR1cywKKwkJCQkJCQkgICAgICAgZW50LT5tZXNzYWdlLAorCQkJCQkJCSAgICAgICBESURfT0spKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChlbnQtPm1lc3NhZ2UgPT0gRElTQ09OTkVDVCkgeworCQkJZXNwX2xvZ19kaXNjb25uZWN0KCJFU1A6IERpc2Nvbm5lY3RpbmcgdGd0WyVkXSAiCisJCQkJCSAgICJ0YWdbJXg6JXhdXG4iLAorCQkJCQkgICBjbWQtPmRldmljZS0+aWQsCisJCQkJCSAgIGVudC0+dGFnWzBdLCBlbnQtPnRhZ1sxXSk7CisKKwkJCWVzcC0+YWN0aXZlX2NtZCA9IE5VTEw7CisJCQllc3BfbWF5YmVfZXhlY3V0ZV9jb21tYW5kKGVzcCk7CisJCX0gZWxzZSB7CisJCQlwcmludGsoIkVTUDogVW5leHBlY3RlZCBtZXNzYWdlICV4IGluIGZyZWVidXNcbiIsCisJCQkgICAgICAgZW50LT5tZXNzYWdlKTsKKwkJCWVzcF9zY2hlZHVsZV9yZXNldChlc3ApOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKGVzcC0+YWN0aXZlX2NtZCkKKwkJCWVzcC0+ZmxhZ3MgfD0gRVNQX0ZMQUdfUVVJQ0tJUlFfQ0hFQ0s7CisJCWJyZWFrOworCX0KKwljYXNlIEVTUF9FVkVOVF9NU0dPVVQ6IHsKKwkJc2NzaV9lc3BfY21kKGVzcCwgRVNQX0NNRF9GTFVTSCk7CisKKwkJaWYgKGVzcF9kZWJ1ZyAmIEVTUF9ERUJVR19NU0dPVVQpIHsKKwkJCWludCBpOworCQkJcHJpbnRrKCJFU1A6IFNlbmRpbmcgbWVzc2FnZSBbICIpOworCQkJZm9yIChpID0gMDsgaSA8IGVzcC0+bXNnX291dF9sZW47IGkrKykKKwkJCQlwcmludGsoIiUwMnggIiwgZXNwLT5tc2dfb3V0W2ldKTsKKwkJCXByaW50aygiXVxuIik7CisJCX0KKworCQlpZiAoZXNwLT5yZXYgPT0gRkFTSE1FKSB7CisJCQlpbnQgaTsKKworCQkJLyogQWx3YXlzIHVzZSB0aGUgZmlmby4gICovCisJCQlmb3IgKGkgPSAwOyBpIDwgZXNwLT5tc2dfb3V0X2xlbjsgaSsrKSB7CisJCQkJZXNwX3dyaXRlOChlc3AtPm1zZ19vdXRbaV0sIEVTUF9GREFUQSk7CisJCQkJZXNwX3dyaXRlOCgwLCBFU1BfRkRBVEEpOworCQkJfQorCQkJc2NzaV9lc3BfY21kKGVzcCwgRVNQX0NNRF9USSk7CisJCX0gZWxzZSB7CisJCQlpZiAoZXNwLT5tc2dfb3V0X2xlbiA9PSAxKSB7CisJCQkJZXNwX3dyaXRlOChlc3AtPm1zZ19vdXRbMF0sIEVTUF9GREFUQSk7CisJCQkJc2NzaV9lc3BfY21kKGVzcCwgRVNQX0NNRF9USSk7CisJCQl9IGVsc2UgeworCQkJCS8qIFVzZSBETUEuICovCisJCQkJbWVtY3B5KGVzcC0+Y29tbWFuZF9ibG9jaywKKwkJCQkgICAgICAgZXNwLT5tc2dfb3V0LAorCQkJCSAgICAgICBlc3AtPm1zZ19vdXRfbGVuKTsKKworCQkJCWVzcC0+b3BzLT5zZW5kX2RtYV9jbWQoZXNwLAorCQkJCQkJICAgICAgIGVzcC0+Y29tbWFuZF9ibG9ja19kbWEsCisJCQkJCQkgICAgICAgZXNwLT5tc2dfb3V0X2xlbiwKKwkJCQkJCSAgICAgICBlc3AtPm1zZ19vdXRfbGVuLAorCQkJCQkJICAgICAgIDAsCisJCQkJCQkgICAgICAgRVNQX0NNRF9ETUF8RVNQX0NNRF9USSk7CisJCQl9CisJCX0KKwkJZXNwX2V2ZW50KGVzcCwgRVNQX0VWRU5UX01TR09VVF9ET05FKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgRVNQX0VWRU5UX01TR09VVF9ET05FOgorCQlpZiAoZXNwLT5yZXYgPT0gRkFTSE1FKSB7CisJCQlzY3NpX2VzcF9jbWQoZXNwLCBFU1BfQ01EX0ZMVVNIKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChlc3AtPm1zZ19vdXRfbGVuID4gMSkKKwkJCQllc3AtPm9wcy0+ZG1hX2ludmFsaWRhdGUoZXNwKTsKKwkJfQorCisJCWlmICghKGVzcC0+aXJlZyAmIEVTUF9JTlRSX0RDKSkgeworCQkJaWYgKGVzcC0+cmV2ICE9IEZBU0hNRSkKKwkJCQlzY3NpX2VzcF9jbWQoZXNwLCBFU1BfQ01EX05VTEwpOworCQl9CisJCWVzcF9ldmVudChlc3AsIEVTUF9FVkVOVF9DSEVDS19QSEFTRSk7CisJCWdvdG8gYWdhaW47CisJY2FzZSBFU1BfRVZFTlRfTVNHSU46CisJCWlmIChlc3AtPmlyZWcgJiBFU1BfSU5UUl9CU0VSVikgeworCQkJaWYgKGVzcC0+cmV2ID09IEZBU0hNRSkgeworCQkJCWlmICghKGVzcF9yZWFkOChFU1BfU1RBVFVTMikgJgorCQkJCSAgICAgIEVTUF9TVEFUMl9GRU1QVFkpKQorCQkJCQlzY3NpX2VzcF9jbWQoZXNwLCBFU1BfQ01EX0ZMVVNIKTsKKwkJCX0gZWxzZSB7CisJCQkJc2NzaV9lc3BfY21kKGVzcCwgRVNQX0NNRF9GTFVTSCk7CisJCQkJaWYgKGVzcC0+cmV2ID09IEVTUDEwMCkKKwkJCQkJc2NzaV9lc3BfY21kKGVzcCwgRVNQX0NNRF9OVUxMKTsKKwkJCX0KKwkJCXNjc2lfZXNwX2NtZChlc3AsIEVTUF9DTURfVEkpOworCQkJZXNwLT5mbGFncyB8PSBFU1BfRkxBR19RVUlDS0lSUV9DSEVDSzsKKwkJCXJldHVybiAxOworCQl9CisJCWlmIChlc3AtPmlyZWcgJiBFU1BfSU5UUl9GRE9ORSkgeworCQkJdTggdmFsOworCisJCQlpZiAoZXNwLT5yZXYgPT0gRkFTSE1FKQorCQkJCXZhbCA9IGVzcC0+Zmlmb1swXTsKKwkJCWVsc2UKKwkJCQl2YWwgPSBlc3BfcmVhZDgoRVNQX0ZEQVRBKTsKKwkJCWVzcC0+bXNnX2luW2VzcC0+bXNnX2luX2xlbisrXSA9IHZhbDsKKworCQkJZXNwX2xvZ19tc2dpbigiRVNQOiBHb3QgbXNnaW4gYnl0ZSAleFxuIiwgdmFsKTsKKworCQkJaWYgKCFlc3BfbXNnaW5fcHJvY2Vzcyhlc3ApKQorCQkJCWVzcC0+bXNnX2luX2xlbiA9IDA7CisKKwkJCWlmIChlc3AtPnJldiA9PSBGQVNITUUpCisJCQkJc2NzaV9lc3BfY21kKGVzcCwgRVNQX0NNRF9GTFVTSCk7CisKKwkJCXNjc2lfZXNwX2NtZChlc3AsIEVTUF9DTURfTU9LKTsKKworCQkJaWYgKGVzcC0+ZXZlbnQgIT0gRVNQX0VWRU5UX0ZSRUVfQlVTKQorCQkJCWVzcF9ldmVudChlc3AsIEVTUF9FVkVOVF9DSEVDS19QSEFTRSk7CisJCX0gZWxzZSB7CisJCQlwcmludGsoIkVTUDogTVNHSU4gbmVpdGhlciBCU0VSViBub3QgRkRPTiwgcmVzZXR0aW5nIik7CisJCQllc3Bfc2NoZWR1bGVfcmVzZXQoZXNwKTsKKwkJCXJldHVybiAwOworCQl9CisJCWJyZWFrOworCWNhc2UgRVNQX0VWRU5UX0NNRF9TVEFSVDoKKwkJbWVtY3B5KGVzcC0+Y29tbWFuZF9ibG9jaywgZXNwLT5jbWRfYnl0ZXNfcHRyLAorCQkgICAgICAgZXNwLT5jbWRfYnl0ZXNfbGVmdCk7CisJCWlmIChlc3AtPnJldiA9PSBGQVNITUUpCisJCQlzY3NpX2VzcF9jbWQoZXNwLCBFU1BfQ01EX0ZMVVNIKTsKKwkJZXNwLT5vcHMtPnNlbmRfZG1hX2NtZChlc3AsIGVzcC0+Y29tbWFuZF9ibG9ja19kbWEsCisJCQkJICAgICAgIGVzcC0+Y21kX2J5dGVzX2xlZnQsIDE2LCAwLAorCQkJCSAgICAgICBFU1BfQ01EX0RNQSB8IEVTUF9DTURfVEkpOworCQllc3BfZXZlbnQoZXNwLCBFU1BfRVZFTlRfQ01EX0RPTkUpOworCQllc3AtPmZsYWdzIHw9IEVTUF9GTEFHX1FVSUNLSVJRX0NIRUNLOworCQlicmVhazsKKwljYXNlIEVTUF9FVkVOVF9DTURfRE9ORToKKwkJZXNwLT5vcHMtPmRtYV9pbnZhbGlkYXRlKGVzcCk7CisJCWlmIChlc3AtPmlyZWcgJiBFU1BfSU5UUl9CU0VSVikgeworCQkJZXNwX2V2ZW50KGVzcCwgRVNQX0VWRU5UX0NIRUNLX1BIQVNFKTsKKwkJCWdvdG8gYWdhaW47CisJCX0KKwkJZXNwX3NjaGVkdWxlX3Jlc2V0KGVzcCk7CisJCXJldHVybiAwOworCQlicmVhazsKKworCWNhc2UgRVNQX0VWRU5UX1JFU0VUOgorCQlzY3NpX2VzcF9jbWQoZXNwLCBFU1BfQ01EX1JTKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlwcmludGsoIkVTUDogVW5leHBlY3RlZCBldmVudCAleCwgcmVzZXR0aW5nXG4iLAorCQkgICAgICAgZXNwLT5ldmVudCk7CisJCWVzcF9zY2hlZHVsZV9yZXNldChlc3ApOworCQlyZXR1cm4gMDsKKwkJYnJlYWs7CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBlc3BfcmVzZXRfY2xlYW51cF9vbmUoc3RydWN0IGVzcCAqZXNwLCBzdHJ1Y3QgZXNwX2NtZF9lbnRyeSAqZW50KQoreworCXN0cnVjdCBzY3NpX2NtbmQgKmNtZCA9IGVudC0+Y21kOworCisJZXNwX3VubWFwX2RtYShlc3AsIGNtZCk7CisJZXNwX2ZyZWVfbHVuX3RhZyhlbnQsIGNtZC0+ZGV2aWNlLT5ob3N0ZGF0YSk7CisJY21kLT5yZXN1bHQgPSBESURfUkVTRVQgPDwgMTY7CisKKwlpZiAoZW50LT5mbGFncyAmIEVTUF9DTURfRkxBR19BVVRPU0VOU0UpIHsKKwkJZXNwLT5vcHMtPnVubWFwX3NpbmdsZShlc3AsIGVudC0+c2Vuc2VfZG1hLAorCQkJCSAgICAgICBTQ1NJX1NFTlNFX0JVRkZFUlNJWkUsIERNQV9GUk9NX0RFVklDRSk7CisJCWVudC0+c2Vuc2VfcHRyID0gTlVMTDsKKwl9CisKKwljbWQtPnNjc2lfZG9uZShjbWQpOworCWxpc3RfZGVsKCZlbnQtPmxpc3QpOworCWVzcF9wdXRfZW50KGVzcCwgZW50KTsKK30KKworc3RhdGljIHZvaWQgZXNwX2NsZWFyX2hvbGQoc3RydWN0IHNjc2lfZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGVzcF9sdW5fZGF0YSAqbHAgPSBkZXYtPmhvc3RkYXRhOworCisJQlVHX09OKGxwLT5udW1fdGFnZ2VkKTsKKwlscC0+aG9sZCA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIGVzcF9yZXNldF9jbGVhbnVwKHN0cnVjdCBlc3AgKmVzcCkKK3sKKwlzdHJ1Y3QgZXNwX2NtZF9lbnRyeSAqZW50LCAqdG1wOworCWludCBpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGVudCwgdG1wLCAmZXNwLT5xdWV1ZWRfY21kcywgbGlzdCkgeworCQlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQgPSBlbnQtPmNtZDsKKworCQlsaXN0X2RlbCgmZW50LT5saXN0KTsKKwkJY21kLT5yZXN1bHQgPSBESURfUkVTRVQgPDwgMTY7CisJCWNtZC0+c2NzaV9kb25lKGNtZCk7CisJCWVzcF9wdXRfZW50KGVzcCwgZW50KTsKKwl9CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZW50LCB0bXAsICZlc3AtPmFjdGl2ZV9jbWRzLCBsaXN0KSB7CisJCWlmIChlbnQgPT0gZXNwLT5hY3RpdmVfY21kKQorCQkJZXNwLT5hY3RpdmVfY21kID0gTlVMTDsKKwkJZXNwX3Jlc2V0X2NsZWFudXBfb25lKGVzcCwgZW50KTsKKwl9CisKKwlCVUdfT04oZXNwLT5hY3RpdmVfY21kICE9IE5VTEwpOworCisJLyogRm9yY2UgcmVuZWdvdGlhdGlvbiBvZiBzeW5jL3dpZGUgdHJhbnNmZXJzLiAgKi8KKwlmb3IgKGkgPSAwOyBpIDwgRVNQX01BWF9UQVJHRVQ7IGkrKykgeworCQlzdHJ1Y3QgZXNwX3RhcmdldF9kYXRhICp0cCA9ICZlc3AtPnRhcmdldFtpXTsKKworCQl0cC0+ZXNwX3BlcmlvZCA9IDA7CisJCXRwLT5lc3Bfb2Zmc2V0ID0gMDsKKwkJdHAtPmVzcF9jb25maWczICY9IH4oRVNQX0NPTkZJRzNfRVdJREUgfAorCQkJCSAgICAgRVNQX0NPTkZJRzNfRlNDU0kgfAorCQkJCSAgICAgRVNQX0NPTkZJRzNfRkFTVCk7CisJCXRwLT5mbGFncyAmPSB+RVNQX1RHVF9XSURFOworCQl0cC0+ZmxhZ3MgfD0gRVNQX1RHVF9DSEVDS19ORUdPOworCisJCWlmICh0cC0+c3RhcmdldCkKKwkJCXN0YXJnZXRfZm9yX2VhY2hfZGV2aWNlKHRwLT5zdGFyZ2V0LCBOVUxMLAorCQkJCQkJZXNwX2NsZWFyX2hvbGQpOworCX0KK30KKworLyogUnVucyB1bmRlciBob3N0LT5sb2NrICovCitzdGF0aWMgdm9pZCBfX2VzcF9pbnRlcnJ1cHQoc3RydWN0IGVzcCAqZXNwKQoreworCWludCBmaW5pc2hfcmVzZXQsIGludHJfZG9uZTsKKwl1OCBwaGFzZTsKKworCWVzcC0+c3JlZyA9IGVzcF9yZWFkOChFU1BfU1RBVFVTKTsKKworCWlmIChlc3AtPmZsYWdzICYgRVNQX0ZMQUdfUkVTRVRUSU5HKSB7CisJCWZpbmlzaF9yZXNldCA9IDE7CisJfSBlbHNlIHsKKwkJaWYgKGVzcF9jaGVja19ncm9zc19lcnJvcihlc3ApKQorCQkJcmV0dXJuOworCisJCWZpbmlzaF9yZXNldCA9IGVzcF9jaGVja19zcHVyX2ludHIoZXNwKTsKKwkJaWYgKGZpbmlzaF9yZXNldCA8IDApCisJCQlyZXR1cm47CisJfQorCisJZXNwLT5pcmVnID0gZXNwX3JlYWQ4KEVTUF9JTlRSUFQpOworCisJaWYgKGVzcC0+aXJlZyAmIEVTUF9JTlRSX1NSKQorCQlmaW5pc2hfcmVzZXQgPSAxOworCisJaWYgKGZpbmlzaF9yZXNldCkgeworCQllc3BfcmVzZXRfY2xlYW51cChlc3ApOworCQlpZiAoZXNwLT5laF9yZXNldCkgeworCQkJY29tcGxldGUoZXNwLT5laF9yZXNldCk7CisJCQllc3AtPmVoX3Jlc2V0ID0gTlVMTDsKKwkJfQorCQlyZXR1cm47CisJfQorCisJcGhhc2UgPSAoZXNwLT5zcmVnICYgRVNQX1NUQVRfUE1BU0spOworCWlmIChlc3AtPnJldiA9PSBGQVNITUUpIHsKKwkJaWYgKCgocGhhc2UgIT0gRVNQX0RJUCAmJiBwaGFzZSAhPSBFU1BfRE9QKSAmJgorCQkgICAgIGVzcC0+c2VsZWN0X3N0YXRlID09IEVTUF9TRUxFQ1RfTk9ORSAmJgorCQkgICAgIGVzcC0+ZXZlbnQgIT0gRVNQX0VWRU5UX1NUQVRVUyAmJgorCQkgICAgIGVzcC0+ZXZlbnQgIT0gRVNQX0VWRU5UX0RBVEFfRE9ORSkgfHwKKwkJICAgIChlc3AtPmlyZWcgJiBFU1BfSU5UUl9SU0VMKSkgeworCQkJZXNwLT5zcmVnMiA9IGVzcF9yZWFkOChFU1BfU1RBVFVTMik7CisJCQlpZiAoIShlc3AtPnNyZWcyICYgRVNQX1NUQVQyX0ZFTVBUWSkgfHwKKwkJCSAgICAoZXNwLT5zcmVnMiAmIEVTUF9TVEFUMl9GMUJZVEUpKQorCQkJCWhtZV9yZWFkX2ZpZm8oZXNwKTsKKwkJfQorCX0KKworCWVzcF9sb2dfaW50cigiRVNQOiBpbnRyIHNyZWdbJTAyeF0gc2VxcmVnWyUwMnhdICIKKwkJICAgICAic3JlZzJbJTAyeF0gaXJlZ1slMDJ4XVxuIiwKKwkJICAgICBlc3AtPnNyZWcsIGVzcC0+c2VxcmVnLCBlc3AtPnNyZWcyLCBlc3AtPmlyZWcpOworCisJaW50cl9kb25lID0gMDsKKworCWlmIChlc3AtPmlyZWcgJiAoRVNQX0lOVFJfUyB8IEVTUF9JTlRSX1NBVE4gfCBFU1BfSU5UUl9JQykpIHsKKwkJcHJpbnRrKCJFU1A6IHVuZXhwZWN0ZWQgSVJFRyAlMDJ4XG4iLCBlc3AtPmlyZWcpOworCQlpZiAoZXNwLT5pcmVnICYgRVNQX0lOVFJfSUMpCisJCQllc3BfZHVtcF9jbWRfbG9nKGVzcCk7CisKKwkJZXNwX3NjaGVkdWxlX3Jlc2V0KGVzcCk7CisJfSBlbHNlIHsKKwkJaWYgKCEoZXNwLT5pcmVnICYgRVNQX0lOVFJfUlNFTCkpIHsKKwkJCS8qIFNvbWUgY29tYmluYXRpb24gb2YgRkRPTkUsIEJTRVJWLCBEQy4gICovCisJCQlpZiAoZXNwLT5zZWxlY3Rfc3RhdGUgIT0gRVNQX1NFTEVDVF9OT05FKQorCQkJCWludHJfZG9uZSA9IGVzcF9maW5pc2hfc2VsZWN0KGVzcCk7CisJCX0gZWxzZSBpZiAoZXNwLT5pcmVnICYgRVNQX0lOVFJfUlNFTCkgeworCQkJaWYgKGVzcC0+YWN0aXZlX2NtZCkKKwkJCQkodm9pZCkgZXNwX2ZpbmlzaF9zZWxlY3QoZXNwKTsKKwkJCWludHJfZG9uZSA9IGVzcF9yZWNvbm5lY3QoZXNwKTsKKwkJfQorCX0KKwl3aGlsZSAoIWludHJfZG9uZSkKKwkJaW50cl9kb25lID0gZXNwX3Byb2Nlc3NfZXZlbnQoZXNwKTsKK30KKworaXJxcmV0dXJuX3Qgc2NzaV9lc3BfaW50cihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IGVzcCAqZXNwID0gZGV2X2lkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaXJxcmV0dXJuX3QgcmV0OworCisJc3Bpbl9sb2NrX2lycXNhdmUoZXNwLT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKwlyZXQgPSBJUlFfTk9ORTsKKwlpZiAoZXNwLT5vcHMtPmlycV9wZW5kaW5nKGVzcCkpIHsKKwkJcmV0ID0gSVJRX0hBTkRMRUQ7CisJCWZvciAoOzspIHsKKwkJCWludCBpOworCisJCQlfX2VzcF9pbnRlcnJ1cHQoZXNwKTsKKwkJCWlmICghKGVzcC0+ZmxhZ3MgJiBFU1BfRkxBR19RVUlDS0lSUV9DSEVDSykpCisJCQkJYnJlYWs7CisJCQllc3AtPmZsYWdzICY9IH5FU1BfRkxBR19RVUlDS0lSUV9DSEVDSzsKKworCQkJZm9yIChpID0gMDsgaSA8IEVTUF9RVUlDS0lSUV9MSU1JVDsgaSsrKSB7CisJCQkJaWYgKGVzcC0+b3BzLT5pcnFfcGVuZGluZyhlc3ApKQorCQkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChpID09IEVTUF9RVUlDS0lSUV9MSU1JVCkKKwkJCQlicmVhazsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGVzcC0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChzY3NpX2VzcF9pbnRyKTsKKworc3RhdGljIHZvaWQgX19kZXZpbml0IGVzcF9nZXRfcmV2aXNpb24oc3RydWN0IGVzcCAqZXNwKQoreworCXU4IHZhbDsKKworCWVzcC0+Y29uZmlnMSA9IChFU1BfQ09ORklHMV9QRU5BQkxFIHwgKGVzcC0+c2NzaV9pZCAmIDcpKTsKKwllc3AtPmNvbmZpZzIgPSAoRVNQX0NPTkZJRzJfU0NTSTJFTkFCIHwgRVNQX0NPTkZJRzJfUkVHUEFSSVRZKTsKKwllc3Bfd3JpdGU4KGVzcC0+Y29uZmlnMiwgRVNQX0NGRzIpOworCisJdmFsID0gZXNwX3JlYWQ4KEVTUF9DRkcyKTsKKwl2YWwgJj0gfkVTUF9DT05GSUcyX01BR0lDOworCWlmICh2YWwgIT0gKEVTUF9DT05GSUcyX1NDU0kyRU5BQiB8IEVTUF9DT05GSUcyX1JFR1BBUklUWSkpIHsKKwkJLyogSWYgd2hhdCB3ZSB3cml0ZSB0byBjZmcyIGRvZXMgbm90IGNvbWUgYmFjaywgY2ZnMiBpcyBub3QKKwkJICogaW1wbGVtZW50ZWQsIHRoZXJlZm9yZSB0aGlzIG11c3QgYmUgYSBwbGFpbiBlc3AxMDAuCisJCSAqLworCQllc3AtPnJldiA9IEVTUDEwMDsKKwl9IGVsc2UgeworCQllc3AtPmNvbmZpZzIgPSAwOworCQllc3Bfc2V0X2FsbF9jb25maWczKGVzcCwgNSk7CisJCWVzcC0+cHJldl9jZmczID0gNTsKKwkJZXNwX3dyaXRlOChlc3AtPmNvbmZpZzIsIEVTUF9DRkcyKTsKKwkJZXNwX3dyaXRlOCgwLCBFU1BfQ0ZHMyk7CisJCWVzcF93cml0ZTgoZXNwLT5wcmV2X2NmZzMsIEVTUF9DRkczKTsKKworCQl2YWwgPSBlc3BfcmVhZDgoRVNQX0NGRzMpOworCQlpZiAodmFsICE9IDUpIHsKKwkJCS8qIFRoZSBjZmcyIHJlZ2lzdGVyIGlzIGltcGxlbWVudGVkLCBob3dldmVyCisJCQkgKiBjZmczIGlzIG5vdCwgbXVzdCBiZSBlc3AxMDBhLgorCQkJICovCisJCQllc3AtPnJldiA9IEVTUDEwMEE7CisJCX0gZWxzZSB7CisJCQllc3Bfc2V0X2FsbF9jb25maWczKGVzcCwgMCk7CisJCQllc3AtPnByZXZfY2ZnMyA9IDA7CisJCQllc3Bfd3JpdGU4KGVzcC0+cHJldl9jZmczLCBFU1BfQ0ZHMyk7CisKKwkJCS8qIEFsbCBvZiBjZmd7MSwyLDN9IGltcGxlbWVudGVkLCBtdXN0IGJlIG9uZSBvZgorCQkJICogdGhlIGZhcyB2YXJpYW50cywgZmlndXJlIG91dCB3aGljaCBvbmUuCisJCQkgKi8KKwkJCWlmIChlc3AtPmNmYWN0ID09IDAgfHwgZXNwLT5jZmFjdCA+IEVTUF9DQ0ZfRjUpIHsKKwkJCQllc3AtPnJldiA9IEZBU1Q7CisJCQkJZXNwLT5zeW5jX2RlZnAgPSBTWU5DX0RFRlBfRkFTVDsKKwkJCX0gZWxzZSB7CisJCQkJZXNwLT5yZXYgPSBFU1AyMzY7CisJCQl9CisJCQllc3AtPmNvbmZpZzIgPSAwOworCQkJZXNwX3dyaXRlOChlc3AtPmNvbmZpZzIsIEVTUF9DRkcyKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgX19kZXZpbml0IGVzcF9pbml0X3N3c3RhdGUoc3RydWN0IGVzcCAqZXNwKQoreworCWludCBpOworCisJSU5JVF9MSVNUX0hFQUQoJmVzcC0+cXVldWVkX2NtZHMpOworCUlOSVRfTElTVF9IRUFEKCZlc3AtPmFjdGl2ZV9jbWRzKTsKKwlJTklUX0xJU1RfSEVBRCgmZXNwLT5lc3BfY21kX3Bvb2wpOworCisJLyogU3RhcnQgd2l0aCBhIGNsZWFyIHN0YXRlLCBkb21haW4gdmFsaWRhdGlvbiAodmlhIC0+c2xhdmVfY29uZmlndXJlLAorCSAqIHNwaV9kdl9kZXZpY2UoKSkgd2lsbCBhdHRlbXB0IHRvIGVuYWJsZSBTWU5DLCBXSURFLCBhbmQgdGFnZ2VkCisJICogY29tbWFuZHMuCisJICovCisJZm9yIChpID0gMCA7IGkgPCBFU1BfTUFYX1RBUkdFVDsgaSsrKSB7CisJCWVzcC0+dGFyZ2V0W2ldLmZsYWdzID0gMDsKKwkJZXNwLT50YXJnZXRbaV0ubmVnb19nb2FsX3BlcmlvZCA9IDA7CisJCWVzcC0+dGFyZ2V0W2ldLm5lZ29fZ29hbF9vZmZzZXQgPSAwOworCQllc3AtPnRhcmdldFtpXS5uZWdvX2dvYWxfd2lkdGggPSAwOworCQllc3AtPnRhcmdldFtpXS5uZWdvX2dvYWxfdGFncyA9IDA7CisJfQorfQorCisvKiBUaGlzIHBsYWNlcyB0aGUgRVNQIGludG8gYSBrbm93biBzdGF0ZSBhdCBib290IHRpbWUuICovCitzdGF0aWMgdm9pZCBfX2RldmluaXQgZXNwX2Jvb3R1cF9yZXNldChzdHJ1Y3QgZXNwICplc3ApCit7CisJdTggdmFsOworCisJLyogUmVzZXQgdGhlIERNQSAqLworCWVzcC0+b3BzLT5yZXNldF9kbWEoZXNwKTsKKworCS8qIFJlc2V0IHRoZSBFU1AgKi8KKwllc3BfcmVzZXRfZXNwKGVzcCk7CisKKwkvKiBSZXNldCB0aGUgU0NTSSBidXMsIGJ1dCB0ZWxsIEVTUCBub3QgdG8gZ2VuZXJhdGUgYW4gaXJxICovCisJdmFsID0gZXNwX3JlYWQ4KEVTUF9DRkcxKTsKKwl2YWwgfD0gRVNQX0NPTkZJRzFfU1JSRElTQUI7CisJZXNwX3dyaXRlOCh2YWwsIEVTUF9DRkcxKTsKKworCXNjc2lfZXNwX2NtZChlc3AsIEVTUF9DTURfUlMpOworCXVkZWxheSg0MDApOworCisJZXNwX3dyaXRlOChlc3AtPmNvbmZpZzEsIEVTUF9DRkcxKTsKKworCS8qIEVhdCBhbnkgYml0cm90IGluIHRoZSBjaGlwIGFuZCB3ZSBhcmUgZG9uZS4uLiAqLworCWVzcF9yZWFkOChFU1BfSU5UUlBUKTsKK30KKworc3RhdGljIHZvaWQgX19kZXZpbml0IGVzcF9zZXRfY2xvY2tfcGFyYW1zKHN0cnVjdCBlc3AgKmVzcCkKK3sKKwlpbnQgZm1oejsKKwl1OCBjY2Y7CisKKwkvKiBUaGlzIGlzIGdldHRpbmcgbWVzc3kgYnV0IGl0IGhhcyB0byBiZSBkb25lIGNvcnJlY3RseSBvciBlbHNlCisJICogeW91IGdldCB3ZWlyZCBiZWhhdmlvciBhbGwgb3ZlciB0aGUgcGxhY2UuICBXZSBhcmUgdHJ5aW5nIHRvCisJICogYmFzaWNhbGx5IGZpZ3VyZSBvdXQgdGhyZWUgcGllY2VzIG9mIGluZm9ybWF0aW9uLgorCSAqCisJICogYSkgQ2xvY2sgQ29udmVyc2lvbiBGYWN0b3IKKwkgKgorCSAqICAgIFRoaXMgaXMgYSByZXByZXNlbnRhdGlvbiBvZiB0aGUgaW5wdXQgY3J5c3RhbCBjbG9jayBmcmVxdWVuY3kKKwkgKiAgICBnb2luZyBpbnRvIHRoZSBFU1Agb24gdGhpcyBtYWNoaW5lLiAgQW55IG9wZXJhdGlvbiB3aG9zZSB0aW1pbmcKKwkgKiAgICBpcyBsb25nZXIgdGhhbiA0MDBucyBkZXBlbmRzIG9uIHRoaXMgdmFsdWUgYmVpbmcgY29ycmVjdC4gIEZvcgorCSAqICAgIGV4YW1wbGUsIHlvdSdsbCBnZXQgYmxpcHMgZm9yIGFyYml0cmF0aW9uL3NlbGVjdGlvbiBkdXJpbmcgaGlnaAorCSAqICAgIGxvYWQgb3Igd2l0aCBtdWx0aXBsZSB0YXJnZXRzIGlmIHRoaXMgaXMgbm90IHNldCBjb3JyZWN0bHkuCisJICoKKwkgKiBiKSBTZWxlY3Rpb24gVGltZS1PdXQKKwkgKgorCSAqICAgIFRoZSBFU1AgaXNuJ3QgdmVyeSBicmlnaHQgYW5kIHdpbGwgYXJiaXRyYXRlIGZvciB0aGUgYnVzIGFuZCB0cnkKKwkgKiAgICB0byBzZWxlY3QgYSB0YXJnZXQgZm9yZXZlciBpZiB5b3UgbGV0IGl0LiAgVGhpcyB2YWx1ZSB0ZWxscyB0aGUKKwkgKiAgICBFU1Agd2hlbiBpdCBoYXMgdGFrZW4gdG9vIGxvbmcgdG8gbmVnb3RpYXRlIGFuZCB0aGF0IGl0IHNob3VsZAorCSAqICAgIGludGVycnVwdCB0aGUgQ1BVIHNvIHdlIGNhbiBzZWUgd2hhdCBoYXBwZW5lZC4gIFRoZSB2YWx1ZSBpcworCSAqICAgIGNvbXB1dGVkIGFzIGZvbGxvd3MgKGZyb20gTkNSL1N5bWJpb3MgY2hpcCBkb2NzKS4KKwkgKgorCSAqICAgICAgICAgIChUaW1lIE91dCBQZXJpb2QpICogIChJbnB1dCBDbG9jaykKKwkgKiAgICBTVE8gPSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICogICAgICAgICAgKDgxOTIpICogKENsb2NrIENvbnZlcnNpb24gRmFjdG9yKQorCSAqCisJICogICAgV2UgdXNlIGEgdGltZSBvdXQgcGVyaW9kIG9mIDI1MG1zIChFU1BfQlVTX1RJTUVPVVQpLgorCSAqCisJICogYykgSW1wZXJpY2FsIGNvbnN0YW50cyBmb3Igc3luY2hyb25vdXMgb2Zmc2V0IGFuZCB0cmFuc2ZlciBwZXJpb2QKKyAgICAgICAgICogICAgcmVnaXN0ZXIgdmFsdWVzCisJICoKKwkgKiAgICBUaGlzIGVudGFpbHMgdGhlIHNtYWxsZXN0IGFuZCBsYXJnZXN0IHN5bmMgcGVyaW9kIHdlIGNvdWxkIGV2ZXIKKwkgKiAgICBoYW5kbGUgb24gdGhpcyBFU1AuCisJICovCisJZm1oeiA9IGVzcC0+Y2ZyZXE7CisKKwljY2YgPSAoKGZtaHogLyAxMDAwMDAwKSArIDQpIC8gNTsKKwlpZiAoY2NmID09IDEpCisJCWNjZiA9IDI7CisKKwkvKiBJZiB3ZSBjYW4ndCBmaW5kIGFueXRoaW5nIHJlYXNvbmFibGUsIGp1c3QgYXNzdW1lIDIwTUhaLgorCSAqIFRoaXMgaXMgdGhlIGNsb2NrIGZyZXF1ZW5jeSBvZiB0aGUgb2xkZXIgc3VuNGMncyB3aGVyZSBJJ3ZlCisJICogYmVlbiB1bmFibGUgdG8gZmluZCB0aGUgY2xvY2stZnJlcXVlbmN5IFBST00gcHJvcGVydHkuICBBbGwKKwkgKiBvdGhlciBtYWNoaW5lcyBwcm92aWRlIHVzZWZ1bCB2YWx1ZXMgaXQgc2VlbXMuCisJICovCisJaWYgKGZtaHogPD0gNTAwMDAwMCB8fCBjY2YgPCAxIHx8IGNjZiA+IDgpIHsKKwkJZm1oeiA9IDIwMDAwMDAwOworCQljY2YgPSA0OworCX0KKworCWVzcC0+Y2ZhY3QgPSAoY2NmID09IDggPyAwIDogY2NmKTsKKwllc3AtPmNmcmVxID0gZm1oejsKKwllc3AtPmNjeWNsZSA9IEVTUF9NSFpfVE9fQ1lDTEUoZm1oeik7CisJZXNwLT5jdGljayA9IEVTUF9USUNLKGNjZiwgZXNwLT5jY3ljbGUpOworCWVzcC0+bmVnX2RlZnAgPSBFU1BfTkVHX0RFRlAoZm1oeiwgY2NmKTsKKwllc3AtPnN5bmNfZGVmcCA9IFNZTkNfREVGUF9TTE9XOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqZXNwX2NoaXBfbmFtZXNbXSA9IHsKKwkiRVNQMTAwIiwKKwkiRVNQMTAwQSIsCisJIkVTUDIzNiIsCisJIkZBUzIzNiIsCisJIkZBUzEwMEEiLAorCSJGQVNUIiwKKwkiRkFTSE1FIiwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2NzaV90cmFuc3BvcnRfdGVtcGxhdGUgKmVzcF90cmFuc3BvcnRfdGVtcGxhdGU7CisKK2ludCBfX2RldmluaXQgc2NzaV9lc3BfcmVnaXN0ZXIoc3RydWN0IGVzcCAqZXNwLCBzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RhdGljIGludCBpbnN0YW5jZTsKKwlpbnQgZXJyOworCisJZXNwLT5ob3N0LT50cmFuc3BvcnR0ID0gZXNwX3RyYW5zcG9ydF90ZW1wbGF0ZTsKKwllc3AtPmhvc3QtPm1heF9sdW4gPSBFU1BfTUFYX0xVTjsKKwllc3AtPmhvc3QtPmNtZF9wZXJfbHVuID0gMjsKKworCWVzcF9zZXRfY2xvY2tfcGFyYW1zKGVzcCk7CisKKwllc3BfZ2V0X3JldmlzaW9uKGVzcCk7CisKKwllc3BfaW5pdF9zd3N0YXRlKGVzcCk7CisKKwllc3BfYm9vdHVwX3Jlc2V0KGVzcCk7CisKKwlwcmludGsoS0VSTl9JTkZPIFBGWCAiZXNwJXUsIHJlZ3NbJTFwOiUxcF0gaXJxWyV1XVxuIiwKKwkgICAgICAgZXNwLT5ob3N0LT51bmlxdWVfaWQsIGVzcC0+cmVncywgZXNwLT5kbWFfcmVncywKKwkgICAgICAgZXNwLT5ob3N0LT5pcnEpOworCXByaW50ayhLRVJOX0lORk8gUEZYICJlc3AldSBpcyBhICVzLCAldSBNSHogKGNjZj0ldSksIFNDU0kgSUQgJXVcbiIsCisJICAgICAgIGVzcC0+aG9zdC0+dW5pcXVlX2lkLCBlc3BfY2hpcF9uYW1lc1tlc3AtPnJldl0sCisJICAgICAgIGVzcC0+Y2ZyZXEgLyAxMDAwMDAwLCBlc3AtPmNmYWN0LCBlc3AtPnNjc2lfaWQpOworCisJLyogTGV0IHRoZSBTQ1NJIGJ1cyByZXNldCBzZXR0bGUuICovCisJc3NsZWVwKGVzcF9idXNfcmVzZXRfc2V0dGxlKTsKKworCWVyciA9IHNjc2lfYWRkX2hvc3QoZXNwLT5ob3N0LCBkZXYpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwllc3AtPmhvc3QtPnVuaXF1ZV9pZCA9IGluc3RhbmNlKys7CisKKwlzY3NpX3NjYW5faG9zdChlc3AtPmhvc3QpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHNjc2lfZXNwX3JlZ2lzdGVyKTsKKwordm9pZCBfX2RldmV4aXQgc2NzaV9lc3BfdW5yZWdpc3RlcihzdHJ1Y3QgZXNwICplc3ApCit7CisJc2NzaV9yZW1vdmVfaG9zdChlc3AtPmhvc3QpOworfQorRVhQT1JUX1NZTUJPTChzY3NpX2VzcF91bnJlZ2lzdGVyKTsKKworc3RhdGljIGludCBlc3Bfc2xhdmVfYWxsb2Moc3RydWN0IHNjc2lfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGVzcCAqZXNwID0gaG9zdF90b19lc3AoZGV2LT5ob3N0KTsKKwlzdHJ1Y3QgZXNwX3RhcmdldF9kYXRhICp0cCA9ICZlc3AtPnRhcmdldFtkZXYtPmlkXTsKKwlzdHJ1Y3QgZXNwX2x1bl9kYXRhICpscDsKKworCWxwID0ga3phbGxvYyhzaXplb2YoKmxwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFscCkKKwkJcmV0dXJuIC1FTk9NRU07CisJZGV2LT5ob3N0ZGF0YSA9IGxwOworCisJdHAtPnN0YXJnZXQgPSBkZXYtPnNkZXZfdGFyZ2V0OworCisJc3BpX21pbl9wZXJpb2QodHAtPnN0YXJnZXQpID0gZXNwLT5taW5fcGVyaW9kOworCXNwaV9tYXhfb2Zmc2V0KHRwLT5zdGFyZ2V0KSA9IDE1OworCisJaWYgKGVzcC0+ZmxhZ3MgJiBFU1BfRkxBR19XSURFX0NBUEFCTEUpCisJCXNwaV9tYXhfd2lkdGgodHAtPnN0YXJnZXQpID0gMTsKKwllbHNlCisJCXNwaV9tYXhfd2lkdGgodHAtPnN0YXJnZXQpID0gMDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVzcF9zbGF2ZV9jb25maWd1cmUoc3RydWN0IHNjc2lfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGVzcCAqZXNwID0gaG9zdF90b19lc3AoZGV2LT5ob3N0KTsKKwlzdHJ1Y3QgZXNwX3RhcmdldF9kYXRhICp0cCA9ICZlc3AtPnRhcmdldFtkZXYtPmlkXTsKKwlpbnQgZ29hbF90YWdzLCBxdWV1ZV9kZXB0aDsKKworCWdvYWxfdGFncyA9IDA7CisKKwlpZiAoZGV2LT50YWdnZWRfc3VwcG9ydGVkKSB7CisJCS8qIFhYWCBtYWtlIHRoaXMgY29uZmlndXJhYmxlIHNvbWVob3cgWFhYICovCisJCWdvYWxfdGFncyA9IEVTUF9ERUZBVUxUX1RBR1M7CisKKwkJaWYgKGdvYWxfdGFncyA+IEVTUF9NQVhfVEFHKQorCQkJZ29hbF90YWdzID0gRVNQX01BWF9UQUc7CisJfQorCisJcXVldWVfZGVwdGggPSBnb2FsX3RhZ3M7CisJaWYgKHF1ZXVlX2RlcHRoIDwgZGV2LT5ob3N0LT5jbWRfcGVyX2x1bikKKwkJcXVldWVfZGVwdGggPSBkZXYtPmhvc3QtPmNtZF9wZXJfbHVuOworCisJaWYgKGdvYWxfdGFncykgeworCQlzY3NpX3NldF90YWdfdHlwZShkZXYsIE1TR19PUkRFUkVEX1RBRyk7CisJCXNjc2lfYWN0aXZhdGVfdGNxKGRldiwgcXVldWVfZGVwdGgpOworCX0gZWxzZSB7CisJCXNjc2lfZGVhY3RpdmF0ZV90Y3EoZGV2LCBxdWV1ZV9kZXB0aCk7CisJfQorCXRwLT5mbGFncyB8PSBFU1BfVEdUX0RJU0NPTk5FQ1Q7CisKKwlpZiAoIXNwaV9pbml0aWFsX2R2KGRldi0+c2Rldl90YXJnZXQpKQorCQlzcGlfZHZfZGV2aWNlKGRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZXNwX3NsYXZlX2Rlc3Ryb3koc3RydWN0IHNjc2lfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGVzcF9sdW5fZGF0YSAqbHAgPSBkZXYtPmhvc3RkYXRhOworCisJa2ZyZWUobHApOworCWRldi0+aG9zdGRhdGEgPSBOVUxMOworfQorCitzdGF0aWMgaW50IGVzcF9laF9hYm9ydF9oYW5kbGVyKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwlzdHJ1Y3QgZXNwICplc3AgPSBob3N0X3RvX2VzcChjbWQtPmRldmljZS0+aG9zdCk7CisJc3RydWN0IGVzcF9jbWRfZW50cnkgKmVudCwgKnRtcDsKKwlzdHJ1Y3QgY29tcGxldGlvbiBlaF9kb25lOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBYWFggVGhpcyBoZWxwcyBhIGxvdCB3aXRoIGRlYnVnZ2luZyBidXQgbWlnaHQgYmUgYSBiaXQKKwkgKiBYWFggbXVjaCBmb3IgdGhlIGZpbmFsIGRyaXZlci4KKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZShlc3AtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCXByaW50ayhLRVJOX0VSUiBQRlggImVzcCVkOiBBYm9ydGluZyBjb21tYW5kIFslcDolMDJ4XVxuIiwKKwkgICAgICAgZXNwLT5ob3N0LT51bmlxdWVfaWQsIGNtZCwgY21kLT5jbW5kWzBdKTsKKwllbnQgPSBlc3AtPmFjdGl2ZV9jbWQ7CisJaWYgKGVudCkKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiZXNwJWQ6IEN1cnJlbnQgY29tbWFuZCBbJXA6JTAyeF1cbiIsCisJCSAgICAgICBlc3AtPmhvc3QtPnVuaXF1ZV9pZCwgZW50LT5jbWQsIGVudC0+Y21kLT5jbW5kWzBdKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVudCwgJmVzcC0+cXVldWVkX2NtZHMsIGxpc3QpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiZXNwJWQ6IFF1ZXVlZCBjb21tYW5kIFslcDolMDJ4XVxuIiwKKwkJICAgICAgIGVzcC0+aG9zdC0+dW5pcXVlX2lkLCBlbnQtPmNtZCwgZW50LT5jbWQtPmNtbmRbMF0pOworCX0KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVudCwgJmVzcC0+YWN0aXZlX2NtZHMsIGxpc3QpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiZXNwJWQ6IEFjdGl2ZSBjb21tYW5kIFslcDolMDJ4XVxuIiwKKwkJICAgICAgIGVzcC0+aG9zdC0+dW5pcXVlX2lkLCBlbnQtPmNtZCwgZW50LT5jbWQtPmNtbmRbMF0pOworCX0KKwllc3BfZHVtcF9jbWRfbG9nKGVzcCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShlc3AtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoZXNwLT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKworCWVudCA9IE5VTEw7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0bXAsICZlc3AtPnF1ZXVlZF9jbWRzLCBsaXN0KSB7CisJCWlmICh0bXAtPmNtZCA9PSBjbWQpIHsKKwkJCWVudCA9IHRtcDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGVudCkgeworCQkvKiBFYXNpZXN0IGNhc2UsIHdlIGRpZG4ndCBldmVuIGlzc3VlIHRoZSBjb21tYW5kCisJCSAqIHlldCBzbyBpdCBpcyB0cml2aWFsIHRvIGFib3J0LgorCQkgKi8KKwkJbGlzdF9kZWwoJmVudC0+bGlzdCk7CisKKwkJY21kLT5yZXN1bHQgPSBESURfQUJPUlQgPDwgMTY7CisJCWNtZC0+c2NzaV9kb25lKGNtZCk7CisKKwkJZXNwX3B1dF9lbnQoZXNwLCBlbnQpOworCisJCWdvdG8gb3V0X3N1Y2Nlc3M7CisJfQorCisJaW5pdF9jb21wbGV0aW9uKCZlaF9kb25lKTsKKworCWVudCA9IGVzcC0+YWN0aXZlX2NtZDsKKwlpZiAoZW50ICYmIGVudC0+Y21kID09IGNtZCkgeworCQkvKiBDb21tYW5kIGlzIHRoZSBjdXJyZW50bHkgYWN0aXZlIGNvbW1hbmQgb24KKwkJICogdGhlIGJ1cy4gIElmIHdlIGFscmVhZHkgaGF2ZSBhbiBvdXRwdXQgbWVzc2FnZQorCQkgKiBwZW5kaW5nLCBubyBkaWNlLgorCQkgKi8KKwkJaWYgKGVzcC0+bXNnX291dF9sZW4pCisJCQlnb3RvIG91dF9mYWlsdXJlOworCisJCS8qIFNlbmQgb3V0IGFuIGFib3J0LCBlbmNvdXJhZ2luZyB0aGUgdGFyZ2V0IHRvCisJCSAqIGdvIHRvIE1TR09VVCBwaGFzZSBieSBhc3NlcnRpbmcgQVROLgorCQkgKi8KKwkJZXNwLT5tc2dfb3V0WzBdID0gQUJPUlRfVEFTS19TRVQ7CisJCWVzcC0+bXNnX291dF9sZW4gPSAxOworCQllbnQtPmVoX2RvbmUgPSAmZWhfZG9uZTsKKworCQlzY3NpX2VzcF9jbWQoZXNwLCBFU1BfQ01EX1NBVE4pOworCX0gZWxzZSB7CisJCS8qIFRoZSBjb21tYW5kIGlzIGRpc2Nvbm5lY3RlZC4gIFRoaXMgaXMgbm90IGVhc3kgdG8KKwkJICogYWJvcnQuICBGb3Igbm93IHdlIGZhaWwgYW5kIGxldCB0aGUgc2NzaSBlcnJvcgorCQkgKiBoYW5kbGluZyBsYXllciBnbyB0cnkgYSBzY3NpIGJ1cyByZXNldCBvciBob3N0CisJCSAqIHJlc2V0LgorCQkgKgorCQkgKiBXaGF0IHdlIGNvdWxkIGRvIGlzIHB1dCB0b2dldGhlciBhIHNjc2kgY29tbWFuZAorCQkgKiBzb2xlbHkgZm9yIHRoZSBwdXJwb3NlIG9mIHNlbmRpbmcgYW4gYWJvcnQgbWVzc2FnZQorCQkgKiB0byB0aGUgdGFyZ2V0LiAgQ29taW5nIHVwIHdpdGggYWxsIHRoZSBjb2RlIHRvCisJCSAqIGNvb2sgdXAgc2NzaSBjb21tYW5kcywgc3BlY2lhbCBjYXNlIHRoZW0gZXZlcnl3aGVyZSwKKwkJICogZXRjLiBpcyBmb3IgcXVlc3Rpb25hYmxlIGdhaW4gYW5kIGl0IHdvdWxkIGJlIGJldHRlcgorCQkgKiBpZiB0aGUgZ2VuZXJpYyBzY3NpIGVycm9yIGhhbmRsaW5nIGxheWVyIGNvdWxkIGRvIGF0CisJCSAqIGxlYXN0IHNvbWUgb2YgdGhhdCBmb3IgdXMuCisJCSAqCisJCSAqIEFueXdheXMgdGhpcyBpcyBhbiBhcmVhIGZvciBwb3RlbnRpYWwgZnV0dXJlIGltcHJvdmVtZW50CisJCSAqIGluIHRoaXMgZHJpdmVyLgorCQkgKi8KKwkJZ290byBvdXRfZmFpbHVyZTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGVzcC0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisKKwlpZiAoIXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmZWhfZG9uZSwgNSAqIEhaKSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZShlc3AtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCQllbnQtPmVoX2RvbmUgPSBOVUxMOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGVzcC0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisKKwkJcmV0dXJuIEZBSUxFRDsKKwl9CisKKwlyZXR1cm4gU1VDQ0VTUzsKKworb3V0X3N1Y2Nlc3M6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShlc3AtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCXJldHVybiBTVUNDRVNTOworCitvdXRfZmFpbHVyZToKKwkvKiBYWFggVGhpcyBtaWdodCBiZSBhIGdvb2QgbG9jYXRpb24gdG8gc2V0IEVTUF9UR1RfQlJPS0VOCisJICogWFhYIHNpbmNlIHdlIGtub3cgd2hpY2ggdGFyZ2V0L2x1biBpbiBwYXJ0aWN1bGFyIGlzCisJICogWFhYIGNhdXNpbmcgdHJvdWJsZS4KKwkgKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGVzcC0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJcmV0dXJuIEZBSUxFRDsKK30KKworc3RhdGljIGludCBlc3BfZWhfYnVzX3Jlc2V0X2hhbmRsZXIoc3RydWN0IHNjc2lfY21uZCAqY21kKQoreworCXN0cnVjdCBlc3AgKmVzcCA9IGhvc3RfdG9fZXNwKGNtZC0+ZGV2aWNlLT5ob3N0KTsKKwlzdHJ1Y3QgY29tcGxldGlvbiBlaF9yZXNldDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaW5pdF9jb21wbGV0aW9uKCZlaF9yZXNldCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShlc3AtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCisJZXNwLT5laF9yZXNldCA9ICZlaF9yZXNldDsKKworCS8qIFhYWCBUaGlzIGlzIHRvbyBzaW1wbGUuLi4gV2Ugc2hvdWxkIGFkZCBsb3RzIG9mCisJICogWFhYIGNoZWNrcyBoZXJlIHNvIHRoYXQgaWYgd2UgZmluZCB0aGF0IHRoZSBjaGlwIGlzCisJICogWFhYIHZlcnkgd2VkZ2VkIHdlIHJldHVybiBmYWlsdXJlIGltbWVkaWF0ZWx5IHNvCisJICogWFhYIHRoYXQgd2UgY2FuIHBlcmZvcm0gYSBmdWxsIGNoaXAgcmVzZXQuCisJICovCisJZXNwLT5mbGFncyB8PSBFU1BfRkxBR19SRVNFVFRJTkc7CisJc2NzaV9lc3BfY21kKGVzcCwgRVNQX0NNRF9SUyk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGVzcC0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisKKwlzc2xlZXAoZXNwX2J1c19yZXNldF9zZXR0bGUpOworCisJaWYgKCF3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmVoX3Jlc2V0LCA1ICogSFopKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKGVzcC0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJCWVzcC0+ZWhfcmVzZXQgPSBOVUxMOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGVzcC0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisKKwkJcmV0dXJuIEZBSUxFRDsKKwl9CisKKwlyZXR1cm4gU1VDQ0VTUzsKK30KKworLyogQWxsIGJldHMgYXJlIG9mZiwgcmVzZXQgdGhlIGVudGlyZSBkZXZpY2UuICAqLworc3RhdGljIGludCBlc3BfZWhfaG9zdF9yZXNldF9oYW5kbGVyKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwlzdHJ1Y3QgZXNwICplc3AgPSBob3N0X3RvX2VzcChjbWQtPmRldmljZS0+aG9zdCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKGVzcC0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJZXNwX2Jvb3R1cF9yZXNldChlc3ApOworCWVzcF9yZXNldF9jbGVhbnVwKGVzcCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShlc3AtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCisJc3NsZWVwKGVzcF9idXNfcmVzZXRfc2V0dGxlKTsKKworCXJldHVybiBTVUNDRVNTOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqZXNwX2luZm8oc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkKK3sKKwlyZXR1cm4gImVzcCI7Cit9CisKK3N0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgc2NzaV9lc3BfdGVtcGxhdGUgPSB7CisJLm1vZHVsZQkJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCQk9ICJlc3AiLAorCS5pbmZvCQkJPSBlc3BfaW5mbywKKwkucXVldWVjb21tYW5kCQk9IGVzcF9xdWV1ZWNvbW1hbmQsCisJLnNsYXZlX2FsbG9jCQk9IGVzcF9zbGF2ZV9hbGxvYywKKwkuc2xhdmVfY29uZmlndXJlCT0gZXNwX3NsYXZlX2NvbmZpZ3VyZSwKKwkuc2xhdmVfZGVzdHJveQkJPSBlc3Bfc2xhdmVfZGVzdHJveSwKKwkuZWhfYWJvcnRfaGFuZGxlcgk9IGVzcF9laF9hYm9ydF9oYW5kbGVyLAorCS5laF9idXNfcmVzZXRfaGFuZGxlcgk9IGVzcF9laF9idXNfcmVzZXRfaGFuZGxlciwKKwkuZWhfaG9zdF9yZXNldF9oYW5kbGVyCT0gZXNwX2VoX2hvc3RfcmVzZXRfaGFuZGxlciwKKwkuY2FuX3F1ZXVlCQk9IDcsCisJLnRoaXNfaWQJCT0gNywKKwkuc2dfdGFibGVzaXplCQk9IFNHX0FMTCwKKwkudXNlX2NsdXN0ZXJpbmcJCT0gRU5BQkxFX0NMVVNURVJJTkcsCisJLm1heF9zZWN0b3JzCQk9IDB4ZmZmZiwKKwkuc2tpcF9zZXR0bGVfZGVsYXkJPSAxLAorfTsKK0VYUE9SVF9TWU1CT0woc2NzaV9lc3BfdGVtcGxhdGUpOworCitzdGF0aWMgdm9pZCBlc3BfZ2V0X3NpZ25hbGxpbmcoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkKK3sKKwlzdHJ1Y3QgZXNwICplc3AgPSBob3N0X3RvX2VzcChob3N0KTsKKwllbnVtIHNwaV9zaWduYWxfdHlwZSB0eXBlOworCisJaWYgKGVzcC0+ZmxhZ3MgJiBFU1BfRkxBR19ESUZGRVJFTlRJQUwpCisJCXR5cGUgPSBTUElfU0lHTkFMX0hWRDsKKwllbHNlCisJCXR5cGUgPSBTUElfU0lHTkFMX1NFOworCisJc3BpX3NpZ25hbGxpbmcoaG9zdCkgPSB0eXBlOworfQorCitzdGF0aWMgdm9pZCBlc3Bfc2V0X29mZnNldChzdHJ1Y3Qgc2NzaV90YXJnZXQgKnRhcmdldCwgaW50IG9mZnNldCkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gZGV2X3RvX3Nob3N0KHRhcmdldC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IGVzcCAqZXNwID0gaG9zdF90b19lc3AoaG9zdCk7CisJc3RydWN0IGVzcF90YXJnZXRfZGF0YSAqdHAgPSAmZXNwLT50YXJnZXRbdGFyZ2V0LT5pZF07CisKKwl0cC0+bmVnb19nb2FsX29mZnNldCA9IG9mZnNldDsKKwl0cC0+ZmxhZ3MgfD0gRVNQX1RHVF9DSEVDS19ORUdPOworfQorCitzdGF0aWMgdm9pZCBlc3Bfc2V0X3BlcmlvZChzdHJ1Y3Qgc2NzaV90YXJnZXQgKnRhcmdldCwgaW50IHBlcmlvZCkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gZGV2X3RvX3Nob3N0KHRhcmdldC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IGVzcCAqZXNwID0gaG9zdF90b19lc3AoaG9zdCk7CisJc3RydWN0IGVzcF90YXJnZXRfZGF0YSAqdHAgPSAmZXNwLT50YXJnZXRbdGFyZ2V0LT5pZF07CisKKwl0cC0+bmVnb19nb2FsX3BlcmlvZCA9IHBlcmlvZDsKKwl0cC0+ZmxhZ3MgfD0gRVNQX1RHVF9DSEVDS19ORUdPOworfQorCitzdGF0aWMgdm9pZCBlc3Bfc2V0X3dpZHRoKHN0cnVjdCBzY3NpX3RhcmdldCAqdGFyZ2V0LCBpbnQgd2lkdGgpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdCA9IGRldl90b19zaG9zdCh0YXJnZXQtPmRldi5wYXJlbnQpOworCXN0cnVjdCBlc3AgKmVzcCA9IGhvc3RfdG9fZXNwKGhvc3QpOworCXN0cnVjdCBlc3BfdGFyZ2V0X2RhdGEgKnRwID0gJmVzcC0+dGFyZ2V0W3RhcmdldC0+aWRdOworCisJdHAtPm5lZ29fZ29hbF93aWR0aCA9ICh3aWR0aCA/IDEgOiAwKTsKKwl0cC0+ZmxhZ3MgfD0gRVNQX1RHVF9DSEVDS19ORUdPOworfQorCitzdGF0aWMgc3RydWN0IHNwaV9mdW5jdGlvbl90ZW1wbGF0ZSBlc3BfdHJhbnNwb3J0X29wcyA9IHsKKwkuc2V0X29mZnNldAkJPSBlc3Bfc2V0X29mZnNldCwKKwkuc2hvd19vZmZzZXQJCT0gMSwKKwkuc2V0X3BlcmlvZAkJPSBlc3Bfc2V0X3BlcmlvZCwKKwkuc2hvd19wZXJpb2QJCT0gMSwKKwkuc2V0X3dpZHRoCQk9IGVzcF9zZXRfd2lkdGgsCisJLnNob3dfd2lkdGgJCT0gMSwKKwkuZ2V0X3NpZ25hbGxpbmcJCT0gZXNwX2dldF9zaWduYWxsaW5nLAorfTsKKworc3RhdGljIGludCBfX2luaXQgZXNwX2luaXQodm9pZCkKK3sKKwlCVUlMRF9CVUdfT04oc2l6ZW9mKHN0cnVjdCBzY3NpX3BvaW50ZXIpIDwKKwkJICAgICBzaXplb2Yoc3RydWN0IGVzcF9jbWRfcHJpdikpOworCisJZXNwX3RyYW5zcG9ydF90ZW1wbGF0ZSA9IHNwaV9hdHRhY2hfdHJhbnNwb3J0KCZlc3BfdHJhbnNwb3J0X29wcyk7CisJaWYgKCFlc3BfdHJhbnNwb3J0X3RlbXBsYXRlKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXNwX2V4aXQodm9pZCkKK3sKKwlzcGlfcmVsZWFzZV90cmFuc3BvcnQoZXNwX3RyYW5zcG9ydF90ZW1wbGF0ZSk7Cit9CisKK01PRFVMRV9ERVNDUklQVElPTigiRVNQIFNDU0kgZHJpdmVyIGNvcmUiKTsKK01PRFVMRV9BVVRIT1IoIkRhdmlkIFMuIE1pbGxlciAoZGF2ZW1AZGF2ZW1sb2Z0Lm5ldCkiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKERSVl9WRVJTSU9OKTsKKworbW9kdWxlX3BhcmFtKGVzcF9idXNfcmVzZXRfc2V0dGxlLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhlc3BfYnVzX3Jlc2V0X3NldHRsZSwKKwkJICJFU1Agc2NzaSBidXMgcmVzZXQgZGVsYXkgaW4gc2Vjb25kcyIpOworCittb2R1bGVfcGFyYW0oZXNwX2RlYnVnLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhlc3BfZGVidWcsCisiRVNQIGJpdG1hcHBlZCBkZWJ1Z2dpbmcgbWVzc2FnZSBlbmFibGUgdmFsdWU6XG4iCisiCTB4MDAwMDAwMDEJTG9nIGludGVycnVwdCBldmVudHNcbiIKKyIJMHgwMDAwMDAwMglMb2cgc2NzaSBjb21tYW5kc1xuIgorIgkweDAwMDAwMDA0CUxvZyByZXNldHNcbiIKKyIJMHgwMDAwMDAwOAlMb2cgbWVzc2FnZSBpbiBldmVudHNcbiIKKyIJMHgwMDAwMDAxMAlMb2cgbWVzc2FnZSBvdXQgZXZlbnRzXG4iCisiCTB4MDAwMDAwMjAJTG9nIGNvbW1hbmQgY29tcGxldGlvblxuIgorIgkweDAwMDAwMDQwCUxvZyBkaXNjb25uZWN0c1xuIgorIgkweDAwMDAwMDgwCUxvZyBkYXRhIHN0YXJ0XG4iCisiCTB4MDAwMDAxMDAJTG9nIGRhdGEgZG9uZVxuIgorIgkweDAwMDAwMjAwCUxvZyByZWNvbm5lY3RzXG4iCisiCTB4MDAwMDA0MDAJTG9nIGF1dG8tc2Vuc2UgZGF0YVxuIgorKTsKKworbW9kdWxlX2luaXQoZXNwX2luaXQpOworbW9kdWxlX2V4aXQoZXNwX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2VzcF9zY3NpLmggYi9kcml2ZXJzL3Njc2kvZXNwX3Njc2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDRhNjY5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2VzcF9zY3NpLmgKQEAgLTAsMCArMSw1NjAgQEAKKy8qIGVzcF9zY3NpLmg6IERlZmluZXMgYW5kIHN0cnVjdHVyZXMgZm9yIHRoZSBFU1AgZHJpZXIuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AZGF2ZW1sb2Z0Lm5ldCkKKyAqLworCisjaWZuZGVmIF9FU1BfU0NTSV9ICisjZGVmaW5lIF9FU1BfU0NTSV9ICisKKwkJCQkJLyogQWNjZXNzICAgIERlc2NyaXB0aW9uICAgICAgT2Zmc2V0ICovCisjZGVmaW5lIEVTUF9UQ0xPVwkweDAwVUwJCS8qIHJ3ICBMb3cgYml0cyB0cmFuc2ZlciBjb3VudCAweDAwICAqLworI2RlZmluZSBFU1BfVENNRUQJMHgwMVVMCQkvKiBydyAgTWlkIGJpdHMgdHJhbnNmZXIgY291bnQgMHgwNCAgKi8KKyNkZWZpbmUgRVNQX0ZEQVRBCTB4MDJVTAkJLyogcncgIEZJRk8gZGF0YSBiaXRzICAgICAgICAgIDB4MDggICovCisjZGVmaW5lIEVTUF9DTUQJCTB4MDNVTAkJLyogcncgIFNDU0kgY29tbWFuZCBiaXRzICAgICAgIDB4MGMgICovCisjZGVmaW5lIEVTUF9TVEFUVVMJMHgwNFVMCQkvKiBybyAgRVNQIHN0YXR1cyByZWdpc3RlciAgICAgMHgxMCAgKi8KKyNkZWZpbmUgRVNQX0JVU0lECUVTUF9TVEFUVVMJLyogd28gIEJ1c0lEIGZvciBzZWwvcmVzZWwgICAgIDB4MTAgICovCisjZGVmaW5lIEVTUF9JTlRSUFQJMHgwNVVMCQkvKiBybyAgS2luZCBvZiBpbnRlcnJ1cHQgICAgICAgMHgxNCAgKi8KKyNkZWZpbmUgRVNQX1RJTUVPCUVTUF9JTlRSUFQJLyogd28gIFRpbWVvdXQgZm9yIHNlbC9yZXNlbCAgIDB4MTQgICovCisjZGVmaW5lIEVTUF9TU1RFUAkweDA2VUwJCS8qIHJvICBTZXF1ZW5jZSBzdGVwIHJlZ2lzdGVyICAweDE4ICAqLworI2RlZmluZSBFU1BfU1RQCQlFU1BfU1NURVAJLyogd28gIFRyYW5zZmVyIHBlcmlvZC9zeW5jICAgIDB4MTggICovCisjZGVmaW5lIEVTUF9GRkxBR1MJMHgwN1VMCQkvKiBybyAgQml0cyBjdXJyZW50IEZJRk8gaW5mbyAgMHgxYyAgKi8KKyNkZWZpbmUgRVNQX1NPRkYJRVNQX0ZGTEFHUwkvKiB3byAgU3luYyBvZmZzZXQgICAgICAgICAgICAgMHgxYyAgKi8KKyNkZWZpbmUgRVNQX0NGRzEJMHgwOFVMCQkvKiBydyAgRmlyc3QgY2ZnIHJlZ2lzdGVyICAgICAgMHgyMCAgKi8KKyNkZWZpbmUgRVNQX0NGQUNUCTB4MDlVTAkJLyogd28gIENsb2NrIGNvbnYgZmFjdG9yICAgICAgIDB4MjQgICovCisjZGVmaW5lIEVTUF9TVEFUVVMyCUVTUF9DRkFDVAkvKiBybyAgSE1FIHN0YXR1czIgcmVnaXN0ZXIgICAgMHgyNCAgKi8KKyNkZWZpbmUgRVNQX0NURVNUCTB4MGFVTAkJLyogd28gIENoaXAgdGVzdCByZWdpc3RlciAgICAgIDB4MjggICovCisjZGVmaW5lIEVTUF9DRkcyCTB4MGJVTAkJLyogcncgIFNlY29uZCBjZmcgcmVnaXN0ZXIgICAgIDB4MmMgICovCisjZGVmaW5lIEVTUF9DRkczCTB4MGNVTAkJLyogcncgIFRoaXJkIGNmZyByZWdpc3RlciAgICAgIDB4MzAgICovCisjZGVmaW5lIEVTUF9UQ0hJCTB4MGVVTAkJLyogcncgIEhpZ2ggYml0cyB0cmFuc2YgY291bnQgIDB4MzggICovCisjZGVmaW5lIEVTUF9VSUQJCUVTUF9UQ0hJCS8qIHJvICBVbmlxdWUgSUQgY29kZSAgICAgICAgICAweDM4ICAqLworI2RlZmluZSBGQVNfUkxPCQlFU1BfVENISQkvKiBydyAgSE1FIGV4dGVuZGVkIGNvdW50ZXIgICAgMHgzOCAgKi8KKyNkZWZpbmUgRVNQX0ZHUk5ECTB4MGZVTAkJLyogcncgIERhdGEgYmFzZSBmb3IgZmlmbyAgICAgIDB4M2MgICovCisjZGVmaW5lIEZBU19SSEkJCUVTUF9GR1JORAkvKiBydyAgSE1FIGV4dGVuZGVkIGNvdW50ZXIgICAgMHgzYyAgKi8KKworI2RlZmluZSBTQlVTX0VTUF9SRUdfU0laRQkweDQwVUwKKworLyogQml0ZmllbGQgbWVhbmluZ3MgZm9yIHRoZSBhYm92ZSByZWdpc3RlcnMuICovCisKKy8qIEVTUCBjb25maWcgcmVnIDEsIHJlYWQtd3JpdGUsIGZvdW5kIG9uIGFsbCBFU1AgY2hpcHMgKi8KKyNkZWZpbmUgRVNQX0NPTkZJRzFfSUQgICAgICAgIDB4MDcgICAgICAvKiBNeSBCVVMgSUQgYml0cyAqLworI2RlZmluZSBFU1BfQ09ORklHMV9DSFRFU1QgICAgMHgwOCAgICAgIC8qIEVuYWJsZSBFU1AgY2hpcCB0ZXN0cyAqLworI2RlZmluZSBFU1BfQ09ORklHMV9QRU5BQkxFICAgMHgxMCAgICAgIC8qIEVuYWJsZSBwYXJpdHkgY2hlY2tzICovCisjZGVmaW5lIEVTUF9DT05GSUcxX1BBUlRFU1QgICAweDIwICAgICAgLyogUGFyaXR5IHRlc3QgbW9kZSBlbmFibGVkPyAqLworI2RlZmluZSBFU1BfQ09ORklHMV9TUlJESVNBQiAgMHg0MCAgICAgIC8qIERpc2FibGUgU0NTSSByZXNldCByZXBvcnRzICovCisjZGVmaW5lIEVTUF9DT05GSUcxX1NMQ0FCTEUgICAweDgwICAgICAgLyogRW5hYmxlIHNsb3cgY2FibGUgbW9kZSAqLworCisvKiBFU1AgY29uZmlnIHJlZyAyLCByZWFkLXdyaXRlLCBmb3VuZCBvbmx5IG9uIGVzcDEwMGErZXNwMjAwK2VzcDIzNiBjaGlwcyAqLworI2RlZmluZSBFU1BfQ09ORklHMl9ETUFQQVJJVFkgMHgwMSAgICAgIC8qIGVuYWJsZSBETUEgUGFyaXR5ICgyMDAsMjM2KSAqLworI2RlZmluZSBFU1BfQ09ORklHMl9SRUdQQVJJVFkgMHgwMiAgICAgIC8qIGVuYWJsZSByZWcgUGFyaXR5ICgyMDAsMjM2KSAqLworI2RlZmluZSBFU1BfQ09ORklHMl9CQURQQVJJVFkgMHgwNCAgICAgIC8qIEJhZCBwYXJpdHkgdGFyZ2V0IGFib3J0ICAqLworI2RlZmluZSBFU1BfQ09ORklHMl9TQ1NJMkVOQUIgMHgwOCAgICAgIC8qIEVuYWJsZSBTQ1NJLTIgZmVhdHVyZXMgKHRndG1vZGUpICovCisjZGVmaW5lIEVTUF9DT05GSUcyX0hJICAgICAgICAweDEwICAgICAgLyogSGlnaCBJbXBlZGFuY2UgRFJFUSA/Pz8gICovCisjZGVmaW5lIEVTUF9DT05GSUcyX0hNRUZFTkFCICAweDEwICAgICAgLyogSE1FIGZlYXR1cmVzIGVuYWJsZSAqLworI2RlZmluZSBFU1BfQ09ORklHMl9CQ00gICAgICAgMHgyMCAgICAgIC8qIEVuYWJsZSBieXRlLWN0cmwgKDIzNikgICAqLworI2RlZmluZSBFU1BfQ09ORklHMl9ESVNQSU5UICAgMHgyMCAgICAgIC8qIERpc2FibGUgcGF1c2UgaXJxIChobWUpICovCisjZGVmaW5lIEVTUF9DT05GSUcyX0ZFTkFCICAgICAweDQwICAgICAgLyogRW5hYmxlIGZlYXR1cmVzIChmYXMxMDAsMjE2KSAqLworI2RlZmluZSBFU1BfQ09ORklHMl9TUEwgICAgICAgMHg0MCAgICAgIC8qIEVuYWJsZSBzdGF0dXMtcGhhc2UgbGF0Y2ggKDIzNikgKi8KKyNkZWZpbmUgRVNQX0NPTkZJRzJfTUtET05FICAgIDB4NDAgICAgICAvKiBITUUgbWFnaWMgZmVhdHVyZSAqLworI2RlZmluZSBFU1BfQ09ORklHMl9ITUUzMiAgICAgMHg4MCAgICAgIC8qIEhNRSAzMiBleHRlbmRlZCAqLworI2RlZmluZSBFU1BfQ09ORklHMl9NQUdJQyAgICAgMHhlMCAgICAgIC8qIEludmFsaWQgYml0cy4uLiAqLworCisvKiBFU1AgY29uZmlnIHJlZ2lzdGVyIDMgcmVhZC13cml0ZSwgZm91bmQgb25seSBlc3AyMzYrZmFzMjM2K2ZhczEwMGEraG1lIGNoaXBzICovCisjZGVmaW5lIEVTUF9DT05GSUczX0ZDTE9DSyAgICAweDAxICAgICAvKiBGQVNUIFNDU0kgY2xvY2sgcmF0ZSAoZXNwMTAwYS9obWUpICovCisjZGVmaW5lIEVTUF9DT05GSUczX1RFTSAgICAgICAweDAxICAgICAvKiBFbmFibGUgdGhyZXNoLTggbW9kZSAoZXNwL2ZhczIzNikgICovCisjZGVmaW5lIEVTUF9DT05GSUczX0ZBU1QgICAgICAweDAyICAgICAvKiBFbmFibGUgRkFTVCBTQ1NJICAgICAoZXNwMTAwYS9obWUpICovCisjZGVmaW5lIEVTUF9DT05GSUczX0FETUEgICAgICAweDAyICAgICAvKiBFbmFibGUgYWx0ZXJuYXRlLWRtYSAoZXNwL2ZhczIzNikgICovCisjZGVmaW5lIEVTUF9DT05GSUczX1RFTkIgICAgICAweDA0ICAgICAvKiBncm91cDIgU0NTSTIgc3VwcG9ydCAoZXNwMTAwYS9obWUpICovCisjZGVmaW5lIEVTUF9DT05GSUczX1NSQiAgICAgICAweDA0ICAgICAvKiBTYXZlIHJlc2lkdWFsIGJ5dGUgICAoZXNwL2ZhczIzNikgICovCisjZGVmaW5lIEVTUF9DT05GSUczX1RNUyAgICAgICAweDA4ICAgICAvKiBUaHJlZS1ieXRlIG1zZydzIG9rICAoZXNwMTAwYS9obWUpICovCisjZGVmaW5lIEVTUF9DT05GSUczX0ZDTEsgICAgICAweDA4ICAgICAvKiBGYXN0IFNDU0kgY2xvY2sgcmF0ZSAoZXNwL2ZhczIzNikgICovCisjZGVmaW5lIEVTUF9DT05GSUczX0lETVNHICAgICAweDEwICAgICAvKiBJRCBtZXNzYWdlIGNoZWNraW5nICAoZXNwMTAwYS9obWUpICovCisjZGVmaW5lIEVTUF9DT05GSUczX0ZTQ1NJICAgICAweDEwICAgICAvKiBFbmFibGUgRkFTVCBTQ1NJICAgICAoZXNwL2ZhczIzNikgICovCisjZGVmaW5lIEVTUF9DT05GSUczX0dUTSAgICAgICAweDIwICAgICAvKiBncm91cDIgU0NTSTIgc3VwcG9ydCAoZXNwL2ZhczIzNikgICovCisjZGVmaW5lIEVTUF9DT05GSUczX0lEQklUMyAgICAweDIwICAgICAvKiBCaXQgMyBvZiBITUUgU0NTSS1JRCAoaG1lKSAgICAgICAgICovCisjZGVmaW5lIEVTUF9DT05GSUczX1RCTVMgICAgICAweDQwICAgICAvKiBUaHJlZS1ieXRlIG1zZydzIG9rICAoZXNwL2ZhczIzNikgICovCisjZGVmaW5lIEVTUF9DT05GSUczX0VXSURFICAgICAweDQwICAgICAvKiBFbmFibGUgV2lkZS1TQ1NJICAgICAoaG1lKSAgICAgICAgICovCisjZGVmaW5lIEVTUF9DT05GSUczX0lNUyAgICAgICAweDgwICAgICAvKiBJRCBtc2cgY2hrJ25nICAgICAgICAoZXNwL2ZhczIzNikgICovCisjZGVmaW5lIEVTUF9DT05GSUczX09CUFVTSCAgICAweDgwICAgICAvKiBQdXNoIG9kZC1ieXRlIHRvIGRtYSAoaG1lKSAgICAgICAgICovCisKKy8qIEVTUCBjb21tYW5kIHJlZ2lzdGVyIHJlYWQtd3JpdGUgKi8KKy8qIEdyb3VwIDEgY29tbWFuZHM6ICBUaGVzZSBtYXkgYmUgc2VudCBhdCBhbnkgcG9pbnQgaW4gdGltZSB0byB0aGUgRVNQCisgKiAgICAgICAgICAgICAgICAgICAgY2hpcC4gIE5vbmUgb2YgdGhlbSBjYW4gZ2VuZXJhdGUgaW50ZXJydXB0cyAnY2VwdAorICogICAgICAgICAgICAgICAgICAgIHRoZSAiU0NTSSBidXMgcmVzZXQiIGNvbW1hbmQgaWYgeW91IGhhdmUgbm90IGRpc2FibGVkCisgKiAgICAgICAgICAgICAgICAgICAgU0NTSSByZXNldCBpbnRlcnJ1cHRzIGluIHRoZSBjb25maWcxIEVTUCByZWdpc3Rlci4KKyAqLworI2RlZmluZSBFU1BfQ01EX05VTEwgICAgICAgICAgMHgwMCAgICAgLyogTnVsbCBjb21tYW5kLCBpZS4gYSBub3AgKi8KKyNkZWZpbmUgRVNQX0NNRF9GTFVTSCAgICAgICAgIDB4MDEgICAgIC8qIEZJRk8gRmx1c2ggKi8KKyNkZWZpbmUgRVNQX0NNRF9SQyAgICAgICAgICAgIDB4MDIgICAgIC8qIENoaXAgcmVzZXQgKi8KKyNkZWZpbmUgRVNQX0NNRF9SUyAgICAgICAgICAgIDB4MDMgICAgIC8qIFNDU0kgYnVzIHJlc2V0ICovCisKKy8qIEdyb3VwIDIgY29tbWFuZHM6ICBFU1AgbXVzdCBiZSBhbiBpbml0aWF0b3IgYW5kIGNvbm5lY3RlZCB0byBhIHRhcmdldAorICogICAgICAgICAgICAgICAgICAgIGZvciB0aGVzZSBjb21tYW5kcyB0byB3b3JrLgorICovCisjZGVmaW5lIEVTUF9DTURfVEkgICAgICAgICAgICAweDEwICAgICAvKiBUcmFuc2ZlciBJbmZvcm1hdGlvbiAqLworI2RlZmluZSBFU1BfQ01EX0lDQ1NFUSAgICAgICAgMHgxMSAgICAgLyogSW5pdGlhdG9yIGNtZCBjb21wbGV0ZSBzZXF1ZW5jZSAqLworI2RlZmluZSBFU1BfQ01EX01PSyAgICAgICAgICAgMHgxMiAgICAgLyogTWVzc2FnZSBva2llLWRva2llICovCisjZGVmaW5lIEVTUF9DTURfVFBBRCAgICAgICAgICAweDE4ICAgICAvKiBUcmFuc2ZlciBQYWQgKi8KKyNkZWZpbmUgRVNQX0NNRF9TQVROICAgICAgICAgIDB4MWEgICAgIC8qIFNldCBBVE4gKi8KKyNkZWZpbmUgRVNQX0NNRF9SQVROICAgICAgICAgIDB4MWIgICAgIC8qIERlLWFzc2VydCBBVE4gKi8KKworLyogR3JvdXAgMyBjb21tYW5kczogIEVTUCBtdXN0IGJlIGluIHRoZSBNU0dPVVQgb3IgTVNHSU4gc3RhdGUgYW5kIGJlIGNvbm5lY3RlZAorICogICAgICAgICAgICAgICAgICAgIHRvIGEgdGFyZ2V0IGFzIHRoZSBpbml0aWF0b3IgZm9yIHRoZXNlIGNvbW1hbmRzIHRvIHdvcmsuCisgKi8KKyNkZWZpbmUgRVNQX0NNRF9TTVNHICAgICAgICAgIDB4MjAgICAgIC8qIFNlbmQgbWVzc2FnZSAqLworI2RlZmluZSBFU1BfQ01EX1NTVEFUICAgICAgICAgMHgyMSAgICAgLyogU2VuZCBzdGF0dXMgKi8KKyNkZWZpbmUgRVNQX0NNRF9TREFUQSAgICAgICAgIDB4MjIgICAgIC8qIFNlbmQgZGF0YSAqLworI2RlZmluZSBFU1BfQ01EX0RTRVEgICAgICAgICAgMHgyMyAgICAgLyogRGlzY29udGludWUgU2VxdWVuY2UgKi8KKyNkZWZpbmUgRVNQX0NNRF9UU0VRICAgICAgICAgIDB4MjQgICAgIC8qIFRlcm1pbmF0ZSBTZXF1ZW5jZSAqLworI2RlZmluZSBFU1BfQ01EX1RDQ1NFUSAgICAgICAgMHgyNSAgICAgLyogVGFyZ2V0IGNtZCBjbXBsdCBzZXF1ZW5jZSAqLworI2RlZmluZSBFU1BfQ01EX0RDTkNUICAgICAgICAgMHgyNyAgICAgLyogRGlzY29ubmVjdCAqLworI2RlZmluZSBFU1BfQ01EX1JNU0cgICAgICAgICAgMHgyOCAgICAgLyogUmVjZWl2ZSBNZXNzYWdlICovCisjZGVmaW5lIEVTUF9DTURfUkNNRCAgICAgICAgICAweDI5ICAgICAvKiBSZWNlaXZlIENvbW1hbmQgKi8KKyNkZWZpbmUgRVNQX0NNRF9SREFUQSAgICAgICAgIDB4MmEgICAgIC8qIFJlY2VpdmUgRGF0YSAqLworI2RlZmluZSBFU1BfQ01EX1JDU0VRICAgICAgICAgMHgyYiAgICAgLyogUmVjZWl2ZSBjbWQgc2VxdWVuY2UgKi8KKworLyogR3JvdXAgNCBjb21tYW5kczogIFRoZSBFU1AgbXVzdCBiZSBpbiB0aGUgZGlzY29ubmVjdGVkIHN0YXRlIGFuZCBtdXN0CisgKiAgICAgICAgICAgICAgICAgICAgbm90IGJlIGNvbm5lY3RlZCB0byBhbnkgdGFyZ2V0cyBhcyBpbml0aWF0b3IgZm9yCisgKiAgICAgICAgICAgICAgICAgICAgdGhlc2UgY29tbWFuZHMgdG8gd29yay4KKyAqLworI2RlZmluZSBFU1BfQ01EX1JTRUwgICAgICAgICAgMHg0MCAgICAgLyogUmVzZWxlY3QgKi8KKyNkZWZpbmUgRVNQX0NNRF9TRUwgICAgICAgICAgIDB4NDEgICAgIC8qIFNlbGVjdCB3L28gQVROICovCisjZGVmaW5lIEVTUF9DTURfU0VMQSAgICAgICAgICAweDQyICAgICAvKiBTZWxlY3Qgdy9BVE4gKi8KKyNkZWZpbmUgRVNQX0NNRF9TRUxBUyAgICAgICAgIDB4NDMgICAgIC8qIFNlbGVjdCB3L0FUTiAmIFNUT1AgKi8KKyNkZWZpbmUgRVNQX0NNRF9FU0VMICAgICAgICAgIDB4NDQgICAgIC8qIEVuYWJsZSBzZWxlY3Rpb24gKi8KKyNkZWZpbmUgRVNQX0NNRF9EU0VMICAgICAgICAgIDB4NDUgICAgIC8qIERpc2FibGUgc2VsZWN0aW9ucyAqLworI2RlZmluZSBFU1BfQ01EX1NBMyAgICAgICAgICAgMHg0NiAgICAgLyogU2VsZWN0IHcvQVROMyAqLworI2RlZmluZSBFU1BfQ01EX1JTRUwzICAgICAgICAgMHg0NyAgICAgLyogUmVzZWxlY3QzICovCisKKy8qIFRoaXMgYml0IGVuYWJsZXMgdGhlIEVTUCdzIERNQSBvbiB0aGUgU0J1cyAqLworI2RlZmluZSBFU1BfQ01EX0RNQSAgICAgICAgICAgMHg4MCAgICAgLyogRG8gRE1BPyAqLworCisvKiBFU1Agc3RhdHVzIHJlZ2lzdGVyIHJlYWQtb25seSAqLworI2RlZmluZSBFU1BfU1RBVF9QSU8gICAgICAgICAgMHgwMSAgICAgLyogSU8gcGhhc2UgYml0ICovCisjZGVmaW5lIEVTUF9TVEFUX1BDRCAgICAgICAgICAweDAyICAgICAvKiBDRCBwaGFzZSBiaXQgKi8KKyNkZWZpbmUgRVNQX1NUQVRfUE1TRyAgICAgICAgIDB4MDQgICAgIC8qIE1TRyBwaGFzZSBiaXQgKi8KKyNkZWZpbmUgRVNQX1NUQVRfUE1BU0sgICAgICAgIDB4MDcgICAgIC8qIE1hc2sgb2YgcGhhc2UgYml0cyAqLworI2RlZmluZSBFU1BfU1RBVF9URE9ORSAgICAgICAgMHgwOCAgICAgLyogVHJhbnNmZXIgQ29tcGxldGVkICovCisjZGVmaW5lIEVTUF9TVEFUX1RDTlQgICAgICAgICAweDEwICAgICAvKiBUcmFuc2ZlciBDb3VudGVyIElzIFplcm8gKi8KKyNkZWZpbmUgRVNQX1NUQVRfUEVSUiAgICAgICAgIDB4MjAgICAgIC8qIFBhcml0eSBlcnJvciAqLworI2RlZmluZSBFU1BfU1RBVF9TUEFNICAgICAgICAgMHg0MCAgICAgLyogUmVhbCBiYWQgZXJyb3IgKi8KKy8qIFRoaXMgaW5kaWNhdGVzIHRoZSAnaW50ZXJydXB0IHBlbmRpbmcnIGNvbmRpdGlvbiBvbiBlc3AyMzYsIGl0IGlzIGEgcmVzZXJ2ZWQKKyAqIGJpdCBvbiBvdGhlciByZXZzIG9mIHRoZSBFU1AuCisgKi8KKyNkZWZpbmUgRVNQX1NUQVRfSU5UUiAgICAgICAgIDB4ODAgICAgICAgICAgICAgLyogSW50ZXJydXB0ICovCisKKy8qIFRoZSBzdGF0dXMgcmVnaXN0ZXIgY2FuIGJlIG1hc2tlZCB3aXRoIEVTUF9TVEFUX1BNQVNLIGFuZCBjb21wYXJlZAorICogd2l0aCB0aGUgZm9sbG93aW5nIHZhbHVlcyB0byBkZXRlcm1pbmUgdGhlIGN1cnJlbnQgcGhhc2UgdGhlIEVTUAorICogKGF0IGxlYXN0IHRoaW5rcyBpdCkgaXMgaW4uICBGb3Igb3VyIHB1cnBvc2VzIHdlIGFsc28gYWRkIG91ciBvd24KKyAqIHNvZnR3YXJlICdkb25lJyBiaXQgZm9yIG91ciBwaGFzZSBtYW5hZ2VtZW50IGVuZ2luZS4KKyAqLworI2RlZmluZSBFU1BfRE9QICAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGF0YSBPdXQgICovCisjZGVmaW5lIEVTUF9ESVAgICAoRVNQX1NUQVRfUElPKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEYXRhIEluICAgKi8KKyNkZWZpbmUgRVNQX0NNRFAgIChFU1BfU1RBVF9QQ0QpICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbW1hbmQgICAqLworI2RlZmluZSBFU1BfU1RBVFAgKEVTUF9TVEFUX1BDRHxFU1BfU1RBVF9QSU8pICAgICAgICAgICAgICAgLyogU3RhdHVzICAgICovCisjZGVmaW5lIEVTUF9NT1AgICAoRVNQX1NUQVRfUE1TR3xFU1BfU1RBVF9QQ0QpICAgICAgICAgICAgICAvKiBNZXNzYWdlIE91dCAqLworI2RlZmluZSBFU1BfTUlQICAgKEVTUF9TVEFUX1BNU0d8RVNQX1NUQVRfUENEfEVTUF9TVEFUX1BJTykgLyogTWVzc2FnZSBJbiAqLworCisvKiBITUUgb25seTogc3RhdHVzIDIgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRVNQX1NUQVQyX1NDSEJJVCAgICAgIDB4MDEgLyogVXBwZXIgYml0cyAzLTcgb2Ygc3N0ZXAgZW5hYmxlZCAqLworI2RlZmluZSBFU1BfU1RBVDJfRkZMQUdTICAgICAgMHgwMiAvKiBUaGUgZmlmbyBmbGFncyBhcmUgbm93IGxhdGNoZWQgKi8KKyNkZWZpbmUgRVNQX1NUQVQyX1hDTlQgICAgICAgIDB4MDQgLyogVGhlIHRyYW5zZmVyIGNvdW50ZXIgaXMgbGF0Y2hlZCAqLworI2RlZmluZSBFU1BfU1RBVDJfQ1JFR0EgICAgICAgMHgwOCAvKiBUaGUgY29tbWFuZCByZWcgaXMgYWN0aXZlIG5vdyAqLworI2RlZmluZSBFU1BfU1RBVDJfV0lERSAgICAgICAgMHgxMCAvKiBJbnRlcmZhY2Ugb24gdGhpcyBhZGFwdGVyIGlzIHdpZGUgKi8KKyNkZWZpbmUgRVNQX1NUQVQyX0YxQllURSAgICAgIDB4MjAgLyogVGhlcmUgaXMgb25lIGJ5dGUgYXQgdG9wIG9mIGZpZm8gKi8KKyNkZWZpbmUgRVNQX1NUQVQyX0ZNU0IgICAgICAgIDB4NDAgLyogTmV4dCBieXRlIGluIGZpZm8gaXMgbW9zdCBzaWduaWZpY2FudCAqLworI2RlZmluZSBFU1BfU1RBVDJfRkVNUFRZICAgICAgMHg4MCAvKiBGSUZPIGlzIGVtcHR5ICovCisKKy8qIEVTUCBpbnRlcnJ1cHQgcmVnaXN0ZXIgcmVhZC1vbmx5ICovCisjZGVmaW5lIEVTUF9JTlRSX1MgICAgICAgICAgICAweDAxICAgICAvKiBTZWxlY3Qgdy9vIEFUTiAqLworI2RlZmluZSBFU1BfSU5UUl9TQVROICAgICAgICAgMHgwMiAgICAgLyogU2VsZWN0IHcvQVROICovCisjZGVmaW5lIEVTUF9JTlRSX1JTRUwgICAgICAgICAweDA0ICAgICAvKiBSZXNlbGVjdGVkICovCisjZGVmaW5lIEVTUF9JTlRSX0ZET05FICAgICAgICAweDA4ICAgICAvKiBGdW5jdGlvbiBkb25lICovCisjZGVmaW5lIEVTUF9JTlRSX0JTRVJWICAgICAgICAweDEwICAgICAvKiBCdXMgc2VydmljZSAqLworI2RlZmluZSBFU1BfSU5UUl9EQyAgICAgICAgICAgMHgyMCAgICAgLyogRGlzY29ubmVjdCAqLworI2RlZmluZSBFU1BfSU5UUl9JQyAgICAgICAgICAgMHg0MCAgICAgLyogSWxsZWdhbCBjb21tYW5kIGdpdmVuICovCisjZGVmaW5lIEVTUF9JTlRSX1NSICAgICAgICAgICAweDgwICAgICAvKiBTQ1NJIGJ1cyByZXNldCBkZXRlY3RlZCAqLworCisvKiBFU1Agc2VxdWVuY2Ugc3RlcCByZWdpc3RlciByZWFkLW9ubHkgKi8KKyNkZWZpbmUgRVNQX1NURVBfVkJJVFMgICAgICAgIDB4MDcgICAgIC8qIFZhbGlkIGJpdHMgKi8KKyNkZWZpbmUgRVNQX1NURVBfQVNFTCAgICAgICAgIDB4MDAgICAgIC8qIFNlbGVjdGlvbiZBcmJpdHJhdGUgY21wbHQgKi8KKyNkZWZpbmUgRVNQX1NURVBfU0lEICAgICAgICAgIDB4MDEgICAgIC8qIE9uZSBtc2cgYnl0ZSBzZW50ICovCisjZGVmaW5lIEVTUF9TVEVQX05DTUQgICAgICAgICAweDAyICAgICAvKiBXYXMgbm90IGluIGNvbW1hbmQgcGhhc2UgKi8KKyNkZWZpbmUgRVNQX1NURVBfUFBDICAgICAgICAgIDB4MDMgICAgIC8qIEVhcmx5IHBoYXNlIGNoZyBjYXVzZWQgY21uZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYnl0ZXMgdG8gYmUgbG9zdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVTUF9TVEVQX0ZJTkk0ICAgICAgICAweDA0ICAgICAvKiBDb21tYW5kIHdhcyBzZW50IG9rICovCisKKy8qIEhvIGh1bSwgc29tZSBFU1AncyBzZXQgdGhlIHN0ZXAgcmVnaXN0ZXIgdG8gdGhpcyBhcyB3ZWxsLi4uICovCisjZGVmaW5lIEVTUF9TVEVQX0ZJTkk1ICAgICAgICAweDA1CisjZGVmaW5lIEVTUF9TVEVQX0ZJTkk2ICAgICAgICAweDA2CisjZGVmaW5lIEVTUF9TVEVQX0ZJTkk3ICAgICAgICAweDA3CisKKy8qIEVTUCBjaGlwLXRlc3QgcmVnaXN0ZXIgcmVhZC13cml0ZSAqLworI2RlZmluZSBFU1BfVEVTVF9UQVJHICAgICAgICAgMHgwMSAgICAgLyogVGFyZ2V0IHRlc3QgbW9kZSAqLworI2RlZmluZSBFU1BfVEVTVF9JTkkgICAgICAgICAgMHgwMiAgICAgLyogSW5pdGlhdG9yIHRlc3QgbW9kZSAqLworI2RlZmluZSBFU1BfVEVTVF9UUyAgICAgICAgICAgMHgwNCAgICAgLyogVHJpc3RhdGUgdGVzdCBtb2RlICovCisKKy8qIEVTUCB1bmlxdWUgSUQgcmVnaXN0ZXIgcmVhZC1vbmx5LCBmb3VuZCBvbiBmYXMyMzYrZmFzMTAwYSBvbmx5ICovCisjZGVmaW5lIEVTUF9VSURfRjEwMEEgICAgICAgICAweDAwICAgICAvKiBFU1AgRkFTMTAwQSAgKi8KKyNkZWZpbmUgRVNQX1VJRF9GMjM2ICAgICAgICAgIDB4MDIgICAgIC8qIEVTUCBGQVMyMzYgICAqLworI2RlZmluZSBFU1BfVUlEX1JFViAgICAgICAgICAgMHgwNyAgICAgLyogRVNQIHJldmlzaW9uICovCisjZGVmaW5lIEVTUF9VSURfRkFNICAgICAgICAgICAweGY4ICAgICAvKiBFU1AgZmFtaWx5ICAgKi8KKworLyogRVNQIGZpZm8gZmxhZ3MgcmVnaXN0ZXIgcmVhZC1vbmx5ICovCisvKiBOb3RlIHRoYXQgdGhlIGZvbGxvd2luZyBpbXBsaWVzIGEgMTYgYnl0ZSBGSUZPIG9uIHRoZSBFU1AuICovCisjZGVmaW5lIEVTUF9GRl9GQllURVMgICAgICAgICAweDFmICAgICAvKiBOdW0gYnl0ZXMgaW4gRklGTyAqLworI2RlZmluZSBFU1BfRkZfT05PVFpFUk8gICAgICAgMHgyMCAgICAgLyogb2Zmc2V0IGN0ciBub3QgemVybyAoZXNwMTAwKSAqLworI2RlZmluZSBFU1BfRkZfU1NURVAgICAgICAgICAgMHhlMCAgICAgLyogU2VxdWVuY2Ugc3RlcCAqLworCisvKiBFU1AgY2xvY2sgY29udmVyc2lvbiBmYWN0b3IgcmVnaXN0ZXIgd3JpdGUtb25seSAqLworI2RlZmluZSBFU1BfQ0NGX0YwICAgICAgICAgICAgMHgwMCAgICAgLyogMzUuMDFNSHogLSA0ME1IeiAqLworI2RlZmluZSBFU1BfQ0NGX05FVkVSICAgICAgICAgMHgwMSAgICAgLyogU2V0IGl0IHRvIHRoaXMgYW5kIGRpZSAqLworI2RlZmluZSBFU1BfQ0NGX0YyICAgICAgICAgICAgMHgwMiAgICAgLyogMTBNSHogKi8KKyNkZWZpbmUgRVNQX0NDRl9GMyAgICAgICAgICAgIDB4MDMgICAgIC8qIDEwLjAxTUh6IC0gMTVNSHogKi8KKyNkZWZpbmUgRVNQX0NDRl9GNCAgICAgICAgICAgIDB4MDQgICAgIC8qIDE1LjAxTUh6IC0gMjBNSHogKi8KKyNkZWZpbmUgRVNQX0NDRl9GNSAgICAgICAgICAgIDB4MDUgICAgIC8qIDIwLjAxTUh6IC0gMjVNSHogKi8KKyNkZWZpbmUgRVNQX0NDRl9GNiAgICAgICAgICAgIDB4MDYgICAgIC8qIDI1LjAxTUh6IC0gMzBNSHogKi8KKyNkZWZpbmUgRVNQX0NDRl9GNyAgICAgICAgICAgIDB4MDcgICAgIC8qIDMwLjAxTUh6IC0gMzVNSHogKi8KKworLyogSE1FIG9ubHkuLi4gKi8KKyNkZWZpbmUgRVNQX0JVU0lEX1JFU0VMSUQgICAgIDB4MTAKKyNkZWZpbmUgRVNQX0JVU0lEX0NUUjMyQklUICAgIDB4NDAKKworI2RlZmluZSBFU1BfQlVTX1RJTUVPVVQgICAgICAgIDI1MCAgICAgLyogSW4gbWlsbGktc2Vjb25kcyAqLworI2RlZmluZSBFU1BfVElNRU9fQ09OU1QgICAgICAgODE5MgorI2RlZmluZSBFU1BfTkVHX0RFRlAobWh6LCBjZmFjdCkgXAorICAgICAgICAoKEVTUF9CVVNfVElNRU9VVCAqICgobWh6KSAvIDEwMDApKSAvICg4MTkyICogKGNmYWN0KSkpCisjZGVmaW5lIEVTUF9NSFpfVE9fQ1lDTEUobWhlcnR6KSAgKCgxMDAwMDAwMDAwKSAvICgobWhlcnR6KSAvIDEwMDApKQorI2RlZmluZSBFU1BfVElDSyhjY2YsIGN5Y2xlKSAgKCg3NjgyICogKGNjZikgKiAoY3ljbGUpIC8gMTAwMCkpCisKKy8qIEZvciBzbG93IHRvIG1lZGl1bSBzcGVlZCBpbnB1dCBjbG9jayByYXRlcyB3ZSBzaG9vdCBmb3IgNW1iL3MsIGJ1dCBmb3IgaGlnaAorICogaW5wdXQgY2xvY2sgcmF0ZXMgd2UgdHJ5IHRvIGRvIDEwbWIvcyBhbHRob3VnaCBJIGRvbid0IHRoaW5rIGEgdHJhbnNmZXIgY2FuCisgKiBldmVuIHJ1biB0aGF0IGZhc3Qgd2l0aCBhbiBFU1AgZXZlbiB3aXRoIERNQTIgc2NhdHRlciBnYXRoZXIgcGlwZWxpbmluZy4KKyAqLworI2RlZmluZSBTWU5DX0RFRlBfU0xPVyAgICAgICAgICAgIDB4MzIgICAvKiA1bWIvcyAgKi8KKyNkZWZpbmUgU1lOQ19ERUZQX0ZBU1QgICAgICAgICAgICAweDE5ICAgLyogMTBtYi9zICovCisKK3N0cnVjdCBlc3BfY21kX3ByaXYgeworCXVuaW9uIHsKKwkJZG1hX2FkZHJfdAlkbWFfYWRkcjsKKwkJaW50CQludW1fc2c7CisJfSB1OworCisJdW5zaWduZWQgaW50CQljdXJfcmVzaWR1ZTsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QJKmN1cl9zZzsKKwl1bnNpZ25lZCBpbnQJCXRvdF9yZXNpZHVlOworfTsKKyNkZWZpbmUgRVNQX0NNRF9QUklWKENNRCkJKChzdHJ1Y3QgZXNwX2NtZF9wcml2ICopKCYoQ01EKS0+U0NwKSkKKworZW51bSBlc3BfcmV2IHsKKwlFU1AxMDAgICAgID0gMHgwMCwgIC8qIE5DUjUzQzkwIC0gdmVyeSBicm9rZW4gKi8KKwlFU1AxMDBBICAgID0gMHgwMSwgIC8qIE5DUjUzQzkwQSAqLworCUVTUDIzNiAgICAgPSAweDAyLAorCUZBUzIzNiAgICAgPSAweDAzLAorCUZBUzEwMEEgICAgPSAweDA0LAorCUZBU1QgICAgICAgPSAweDA1LAorCUZBU0hNRSAgICAgPSAweDA2LAorfTsKKworc3RydWN0IGVzcF9jbWRfZW50cnkgeworCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKKworCXN0cnVjdCBzY3NpX2NtbmQJKmNtZDsKKworCXVuc2lnbmVkIGludAkJc2F2ZWRfY3VyX3Jlc2lkdWU7CisJc3RydWN0IHNjYXR0ZXJsaXN0CSpzYXZlZF9jdXJfc2c7CisJdW5zaWduZWQgaW50CQlzYXZlZF90b3RfcmVzaWR1ZTsKKworCXU4CQkJZmxhZ3M7CisjZGVmaW5lIEVTUF9DTURfRkxBR19XUklURQkweDAxIC8qIERNQSBpcyBhIHdyaXRlICovCisjZGVmaW5lIEVTUF9DTURfRkxBR19BQk9SVAkweDAyIC8qIGJlaW5nIGFib3J0ZWQgKi8KKyNkZWZpbmUgRVNQX0NNRF9GTEFHX0FVVE9TRU5TRQkweDA0IC8qIERvaW5nIGF1dG9tYXRpYyBSRVFVRVNUX1NFTlNFICovCisKKwl1OAkJCXRhZ1syXTsKKworCXU4CQkJc3RhdHVzOworCXU4CQkJbWVzc2FnZTsKKworCXVuc2lnbmVkIGNoYXIJCSpzZW5zZV9wdHI7CisJdW5zaWduZWQgY2hhcgkJKnNhdmVkX3NlbnNlX3B0cjsKKwlkbWFfYWRkcl90CQlzZW5zZV9kbWE7CisKKwlzdHJ1Y3QgY29tcGxldGlvbgkqZWhfZG9uZTsKK307CisKKy8qIFhYWCBtYWtlIHRoaXMgY29uZmlndXJhYmxlIHNvbWVob3cgWFhYICovCisjZGVmaW5lIEVTUF9ERUZBVUxUX1RBR1MJMTYKKworI2RlZmluZSBFU1BfTUFYX1RBUkdFVAkJMTYKKyNkZWZpbmUgRVNQX01BWF9MVU4JCTgKKyNkZWZpbmUgRVNQX01BWF9UQUcJCTI1NgorCitzdHJ1Y3QgZXNwX2x1bl9kYXRhIHsKKwlzdHJ1Y3QgZXNwX2NtZF9lbnRyeQkqbm9uX3RhZ2dlZF9jbWQ7CisJaW50CQkJbnVtX3RhZ2dlZDsKKwlpbnQJCQlob2xkOworCXN0cnVjdCBlc3BfY21kX2VudHJ5CSp0YWdnZWRfY21kc1tFU1BfTUFYX1RBR107Cit9OworCitzdHJ1Y3QgZXNwX3RhcmdldF9kYXRhIHsKKwkvKiBUaGVzZSBhcmUgdGhlIEVTUF9TVFAsIEVTUF9TT0ZGLCBhbmQgRVNQX0NGRzMgcmVnaXN0ZXIgdmFsdWVzIHdoaWNoCisJICogbWF0Y2ggdGhlIGN1cnJlbnRseSBuZWdvdGlhdGVkIHNldHRpbmdzIGZvciB0aGlzIHRhcmdldC4gIFRoZSBTQ1NJCisJICogcHJvdG9jb2wgdmFsdWVzIGFyZSBtYWludGFpbmVkIGluIHNwaV97b2Zmc2V0LHBlcmlvZCx3aWRlfShzdGFyZ2V0KS4KKwkgKi8KKwl1OAkJCWVzcF9wZXJpb2Q7CisJdTgJCQllc3Bfb2Zmc2V0OworCXU4CQkJZXNwX2NvbmZpZzM7CisKKwl1OAkJCWZsYWdzOworI2RlZmluZSBFU1BfVEdUX1dJREUJCTB4MDEKKyNkZWZpbmUgRVNQX1RHVF9ESVNDT05ORUNUCTB4MDIKKyNkZWZpbmUgRVNQX1RHVF9ORUdPX1dJREUJMHgwNAorI2RlZmluZSBFU1BfVEdUX05FR09fU1lOQwkweDA4CisjZGVmaW5lIEVTUF9UR1RfQ0hFQ0tfTkVHTwkweDQwCisjZGVmaW5lIEVTUF9UR1RfQlJPS0VOCQkweDgwCisKKwkvKiBXaGVuIEVTUF9UR1RfQ0hFQ0tfTkVHTyBpcyBzZXQsIG9uIHRoZSBuZXh0IHNjc2kgY29tbWFuZCB0byB0aGlzCisJICogZGV2aWNlIHdlIHdpbGwgdHJ5IHRvIG5lZ290aWF0ZSB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnMuCisJICovCisJdTgJCQluZWdvX2dvYWxfcGVyaW9kOworCXU4CQkJbmVnb19nb2FsX29mZnNldDsKKwl1OAkJCW5lZ29fZ29hbF93aWR0aDsKKwl1OAkJCW5lZ29fZ29hbF90YWdzOworCisJc3RydWN0IHNjc2lfdGFyZ2V0CSpzdGFyZ2V0OworfTsKKworc3RydWN0IGVzcF9ldmVudF9lbnQgeworCXU4CQkJdHlwZTsKKyNkZWZpbmUgRVNQX0VWRU5UX1RZUEVfRVZFTlQJMHgwMQorI2RlZmluZSBFU1BfRVZFTlRfVFlQRV9DTUQJMHgwMgorCXU4CQkJdmFsOworCisJdTgJCQlzcmVnOworCXU4CQkJc2VxcmVnOworCXU4CQkJc3JlZzI7CisJdTgJCQlpcmVnOworCXU4CQkJc2VsZWN0X3N0YXRlOworCXU4CQkJZXZlbnQ7CisJdTgJCQlfX3BhZDsKK307CisKK3N0cnVjdCBlc3A7CitzdHJ1Y3QgZXNwX2RyaXZlcl9vcHMgeworCS8qIFJlYWQgYW5kIHdyaXRlIHRoZSBFU1AgOC1iaXQgcmVnaXN0ZXJzLiAgT24gc29tZQorCSAqIGFwcGxpY2F0aW9ucyBvZiB0aGUgRVNQIGNoaXAgdGhlIHJlZ2lzdGVycyBhcmUgYXQgNC1ieXRlCisJICogaW5zdGVhZCBvZiAxLWJ5dGUgaW50ZXJ2YWxzLgorCSAqLworCXZvaWQgKCplc3Bfd3JpdGU4KShzdHJ1Y3QgZXNwICplc3AsIHU4IHZhbCwgdW5zaWduZWQgbG9uZyByZWcpOworCXU4ICgqZXNwX3JlYWQ4KShzdHJ1Y3QgZXNwICplc3AsIHVuc2lnbmVkIGxvbmcgcmVnKTsKKworCS8qIE1hcCBhbmQgdW5tYXAgRE1BIG1lbW9yeS4gIEV2ZW50dWFsbHkgdGhlIGRyaXZlciB3aWxsIGJlCisJICogY29udmVydGVkIHRvIHRoZSBnZW5lcmljIERNQSBBUEkgYXMgc29vbiBhcyBTQlVTIGlzIGFibGUgdG8KKwkgKiBjb3BlIHdpdGggdGhhdC4gIEF0IHN1Y2ggdGltZSB3ZSBjYW4gcmVtb3ZlIHRoaXMuCisJICovCisJZG1hX2FkZHJfdCAoKm1hcF9zaW5nbGUpKHN0cnVjdCBlc3AgKmVzcCwgdm9pZCAqYnVmLAorCQkJCSBzaXplX3Qgc3osIGludCBkaXIpOworCWludCAoKm1hcF9zZykoc3RydWN0IGVzcCAqZXNwLCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAorCQkgICAgICBpbnQgbnVtX3NnLCBpbnQgZGlyKTsKKwl2b2lkICgqdW5tYXBfc2luZ2xlKShzdHJ1Y3QgZXNwICplc3AsIGRtYV9hZGRyX3QgYWRkciwKKwkJCSAgICAgc2l6ZV90IHN6LCBpbnQgZGlyKTsKKwl2b2lkICgqdW5tYXBfc2cpKHN0cnVjdCBlc3AgKmVzcCwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKKwkJCSBpbnQgbnVtX3NnLCBpbnQgZGlyKTsKKworCS8qIFJldHVybiBub24temVybyBpZiB0aGVyZSBpcyBhbiBJUlEgcGVuZGluZy4gIFVzdWFsbHkgdGhpcworCSAqIHN0YXR1cyBiaXQgbGl2ZXMgaW4gdGhlIERNQSBjb250cm9sbGVyIHNpdHRpbmcgaW4gZnJvbnQgb2YKKwkgKiB0aGUgRVNQLiAgVGhpcyBoYXMgdG8gYmUgYWNjdXJhdGUgb3IgZWxzZSB0aGUgRVNQIGludGVycnVwdAorCSAqIGhhbmRsZXIgd2lsbCBub3QgcnVuLgorCSAqLworCWludCAoKmlycV9wZW5kaW5nKShzdHJ1Y3QgZXNwICplc3ApOworCisJLyogUmVzZXQgdGhlIERNQSBlbmdpbmUgZW50aXJlbHkuICBPbiByZXR1cm4sIEVTUCBpbnRlcnJ1cHRzCisJICogc2hvdWxkIGJlIGVuYWJsZWQuICBPZnRlbiB0aGUgaW50ZXJydXB0IGVuYWJsaW5nIGlzCisJICogY29udHJvbGxlZCBpbiB0aGUgRE1BIGVuZ2luZS4KKwkgKi8KKwl2b2lkICgqcmVzZXRfZG1hKShzdHJ1Y3QgZXNwICplc3ApOworCisJLyogRHJhaW4gYW55IHBlbmRpbmcgRE1BIGluIHRoZSBETUEgZW5naW5lIGFmdGVyIGEgdHJhbnNmZXIuCisJICogVGhpcyBpcyBmb3Igd3JpdGVzIHRvIG1lbW9yeS4KKwkgKi8KKwl2b2lkICgqZG1hX2RyYWluKShzdHJ1Y3QgZXNwICplc3ApOworCisJLyogSW52YWxpZGF0ZSB0aGUgRE1BIGVuZ2luZSBhZnRlciBhIERNQSB0cmFuc2Zlci4gICovCisJdm9pZCAoKmRtYV9pbnZhbGlkYXRlKShzdHJ1Y3QgZXNwICplc3ApOworCisJLyogU2V0dXAgYW4gRVNQIGNvbW1hbmQgdGhhdCB3aWxsIHVzZSBhIERNQSB0cmFuc2Zlci4KKwkgKiBUaGUgJ2VzcF9jb3VudCcgc3BlY2lmaWVzIHdoYXQgdHJhbnNmZXIgbGVuZ3RoIHNob3VsZCBiZQorCSAqIHByb2dyYW1tZWQgaW50byB0aGUgRVNQIHRyYW5zZmVyIGNvdW50ZXIgcmVnaXN0ZXJzLCB3aGVyZWFzCisJICogdGhlICdkbWFfY291bnQnIGlzIHRoZSBsZW5ndGggdGhhdCBzaG91bGQgYmUgcHJvZ3JhbW1lZCBpbnRvCisJICogdGhlIERNQSBjb250cm9sbGVyLiAgVXN1YWxseSB0aGV5IGFyZSB0aGUgc2FtZS4gIElmICd3cml0ZScKKwkgKiBpcyBub24temVybywgdGhpcyB0cmFuc2ZlciBpcyBhIHdyaXRlIGludG8gbWVtb3J5LiAgJ2NtZCcKKwkgKiBob2xkcyB0aGUgRVNQIGNvbW1hbmQgdGhhdCBzaG91bGQgYmUgaXNzdWVkIGJ5IGNhbGxpbmcKKwkgKiBzY3NpX2VzcF9jbWQoKSBhdCB0aGUgYXBwcm9wcmlhdGUgdGltZSB3aGlsZSBwcm9ncmFtbWluZworCSAqIHRoZSBETUEgaGFyZHdhcmUuCisJICovCisJdm9pZCAoKnNlbmRfZG1hX2NtZCkoc3RydWN0IGVzcCAqZXNwLCB1MzIgZG1hX2FkZHIsIHUzMiBlc3BfY291bnQsCisJCQkgICAgIHUzMiBkbWFfY291bnQsIGludCB3cml0ZSwgdTggY21kKTsKKworCS8qIFJldHVybiBub24temVybyBpZiB0aGUgRE1BIGVuZ2luZSBpcyByZXBvcnRpbmcgYW4gZXJyb3IKKwkgKiBjdXJyZW50bHkuCisJICovCisJaW50ICgqZG1hX2Vycm9yKShzdHJ1Y3QgZXNwICplc3ApOworfTsKKworI2RlZmluZSBFU1BfTUFYX01TR19TWgkJOAorI2RlZmluZSBFU1BfRVZFTlRfTE9HX1NaCTMyCisKKyNkZWZpbmUgRVNQX1FVSUNLSVJRX0xJTUlUCTEwMAorI2RlZmluZSBFU1BfUkVTRUxFQ1RfVEFHX0xJTUlUCTI1MDAKKworc3RydWN0IGVzcCB7CisJdm9pZCBfX2lvbWVtCQkqcmVnczsKKwl2b2lkIF9faW9tZW0JCSpkbWFfcmVnczsKKworCWNvbnN0IHN0cnVjdCBlc3BfZHJpdmVyX29wcyAqb3BzOworCisJc3RydWN0IFNjc2lfSG9zdAkqaG9zdDsKKwl2b2lkCQkJKmRldjsKKworCXN0cnVjdCBlc3BfY21kX2VudHJ5CSphY3RpdmVfY21kOworCisJc3RydWN0IGxpc3RfaGVhZAlxdWV1ZWRfY21kczsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWFjdGl2ZV9jbWRzOworCisJdTgJCQkqY29tbWFuZF9ibG9jazsKKwlkbWFfYWRkcl90CQljb21tYW5kX2Jsb2NrX2RtYTsKKworCXVuc2lnbmVkIGludAkJZGF0YV9kbWFfbGVuOworCisJLyogVGhlIGZvbGxvd2luZyBhcmUgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGNhdXNlIG9mIGFuIElSUS4gVXBvbiBldmVyeQorCSAqIElSUSBlbnRyeSB3ZSBzeW5jaHJvbml6ZSB0aGVzZSB3aXRoIHRoZSBoYXJkd2FyZSByZWdpc3RlcnMuCisJICovCisJdTgJCQlzcmVnOworCXU4CQkJc2VxcmVnOworCXU4CQkJc3JlZzI7CisJdTgJCQlpcmVnOworCisJdTMyCQkJcHJldl9obWVfZG1hY3NyOworCXU4CQkJcHJldl9zb2ZmOworCXU4CQkJcHJldl9zdHA7CisJdTgJCQlwcmV2X2NmZzM7CisJdTgJCQlfX3BhZDsKKworCXN0cnVjdCBsaXN0X2hlYWQJZXNwX2NtZF9wb29sOworCisJc3RydWN0IGVzcF90YXJnZXRfZGF0YQl0YXJnZXRbRVNQX01BWF9UQVJHRVRdOworCisJaW50CQkJZmlmb19jbnQ7CisJdTgJCQlmaWZvWzE2XTsKKworCXN0cnVjdCBlc3BfZXZlbnRfZW50CWVzcF9ldmVudF9sb2dbRVNQX0VWRU5UX0xPR19TWl07CisJaW50CQkJZXNwX2V2ZW50X2N1cjsKKworCXU4CQkJbXNnX291dFtFU1BfTUFYX01TR19TWl07CisJaW50CQkJbXNnX291dF9sZW47CisKKwl1OAkJCW1zZ19pbltFU1BfTUFYX01TR19TWl07CisJaW50CQkJbXNnX2luX2xlbjsKKworCXU4CQkJYnVyc3RzOworCXU4CQkJY29uZmlnMTsKKwl1OAkJCWNvbmZpZzI7CisKKwl1OAkJCXNjc2lfaWQ7CisJdTMyCQkJc2NzaV9pZF9tYXNrOworCisJZW51bSBlc3BfcmV2CQlyZXY7CisKKwl1MzIJCQlmbGFnczsKKyNkZWZpbmUgRVNQX0ZMQUdfRElGRkVSRU5USUFMCTB4MDAwMDAwMDEKKyNkZWZpbmUgRVNQX0ZMQUdfUkVTRVRUSU5HCTB4MDAwMDAwMDIKKyNkZWZpbmUgRVNQX0ZMQUdfRE9JTkdfU0xPV0NNRAkweDAwMDAwMDA0CisjZGVmaW5lIEVTUF9GTEFHX1dJREVfQ0FQQUJMRQkweDAwMDAwMDA4CisjZGVmaW5lIEVTUF9GTEFHX1FVSUNLSVJRX0NIRUNLCTB4MDAwMDAwMTAKKworCXU4CQkJc2VsZWN0X3N0YXRlOworI2RlZmluZSBFU1BfU0VMRUNUX05PTkUJCTB4MDAgLyogTm90IHNlbGVjdGluZyAqLworI2RlZmluZSBFU1BfU0VMRUNUX0JBU0lDCTB4MDEgLyogU2VsZWN0IHcvbyBNU0dPVVQgcGhhc2UgKi8KKyNkZWZpbmUgRVNQX1NFTEVDVF9NU0dPVVQJMHgwMiAvKiBTZWxlY3Qgd2l0aCBNU0dPVVQgKi8KKworCS8qIFdoZW4gd2UgYXJlIG5vdCBzZWxlY3RpbmcsIHdlIGFyZSBleHBlY3RpbmcgYW4gZXZlbnQuICAqLworCXU4CQkJZXZlbnQ7CisjZGVmaW5lIEVTUF9FVkVOVF9OT05FCQkweDAwCisjZGVmaW5lIEVTUF9FVkVOVF9DTURfU1RBUlQJMHgwMQorI2RlZmluZSBFU1BfRVZFTlRfQ01EX0RPTkUJMHgwMgorI2RlZmluZSBFU1BfRVZFTlRfREFUQV9JTgkweDAzCisjZGVmaW5lIEVTUF9FVkVOVF9EQVRBX09VVAkweDA0CisjZGVmaW5lIEVTUF9FVkVOVF9EQVRBX0RPTkUJMHgwNQorI2RlZmluZSBFU1BfRVZFTlRfTVNHSU4JCTB4MDYKKyNkZWZpbmUgRVNQX0VWRU5UX01TR0lOX01PUkUJMHgwNworI2RlZmluZSBFU1BfRVZFTlRfTVNHSU5fRE9ORQkweDA4CisjZGVmaW5lIEVTUF9FVkVOVF9NU0dPVVQJMHgwOQorI2RlZmluZSBFU1BfRVZFTlRfTVNHT1VUX0RPTkUJMHgwYQorI2RlZmluZSBFU1BfRVZFTlRfU1RBVFVTCTB4MGIKKyNkZWZpbmUgRVNQX0VWRU5UX0ZSRUVfQlVTCTB4MGMKKyNkZWZpbmUgRVNQX0VWRU5UX0NIRUNLX1BIQVNFCTB4MGQKKyNkZWZpbmUgRVNQX0VWRU5UX1JFU0VUCQkweDEwCisKKwkvKiBQcm9iZWQgaW4gZXNwX2dldF9jbG9ja19wYXJhbXMoKSAqLworCXUzMgkJCWNmYWN0OworCXUzMgkJCWNmcmVxOworCXUzMgkJCWNjeWNsZTsKKwl1MzIJCQljdGljazsKKwl1MzIJCQluZWdfZGVmcDsKKwl1MzIJCQlzeW5jX2RlZnA7CisKKwkvKiBDb21wdXRlZCBpbiBlc3BfcmVzZXRfZXNwKCkgKi8KKwl1MzIJCQltYXhfcGVyaW9kOworCXUzMgkJCW1pbl9wZXJpb2Q7CisJdTMyCQkJcmFkZWxheTsKKworCS8qIFNsb3cgY29tbWFuZCBzdGF0ZS4gICovCisJdTgJCQkqY21kX2J5dGVzX3B0cjsKKwlpbnQJCQljbWRfYnl0ZXNfbGVmdDsKKworCXN0cnVjdCBjb21wbGV0aW9uCSplaF9yZXNldDsKKworCXN0cnVjdCBzYnVzX2RtYQkJKmRtYTsKK307CisKKyNkZWZpbmUgaG9zdF90b19lc3AoaG9zdCkJKChzdHJ1Y3QgZXNwICopKGhvc3QpLT5ob3N0ZGF0YSkKKworLyogQSBmcm9udC1lbmQgZHJpdmVyIGZvciB0aGUgRVNQIGNoaXAgc2hvdWxkIGRvIHRoZSBmb2xsb3dpbmcgaW4KKyAqIGl0J3MgZGV2aWNlIHByb2JlIHJvdXRpbmU6CisgKiAxKSBBbGxvY2F0ZSB0aGUgaG9zdCBhbmQgcHJpdmF0ZSBhcmVhIHVzaW5nIHNjc2lfaG9zdF9hbGxvYygpCisgKiAgICB3aXRoIHNpemUgJ3NpemVvZihzdHJ1Y3QgZXNwKScuICBUaGUgZmlyc3QgYXJndW1lbnQgdG8KKyAqICAgIHNjc2lfaG9zdF9hbGxvYygpIHNob3VsZCBiZSAmc2NzaV9lc3BfdGVtcGxhdGUuCisgKiAyKSBTZXQgaG9zdC0+bWF4X2lkIGFzIGFwcHJvcHJpYXRlLgorICogMykgU2V0IGVzcC0+aG9zdCB0byB0aGUgc2NzaV9ob3N0IGl0c2VsZiwgYW5kIGVzcC0+ZGV2CisgKiAgICB0byB0aGUgZGV2aWNlIG9iamVjdCBwb2ludGVyLgorICogNCkgSG9vayB1cCBlc3AtPm9wcyB0byB0aGUgZnJvbnQtZW5kIGltcGxlbWVudGF0aW9uLgorICogNSkgSWYgdGhlIEVTUCBjaGlwIHN1cHBvcnRzIHdpZGUgdHJhbnNmZXJzLCBzZXQgRVNQX0ZMQUdfV0lERV9DQVBBQkxFCisgKiAgICBpbiBlc3AtPmZsYWdzLgorICogNikgTWFwIHRoZSBETUEgYW5kIEVTUCBjaGlwIHJlZ2lzdGVycy4KKyAqIDcpIERNQSBtYXAgdGhlIEVTUCBjb21tYW5kIGJsb2NrLCBzdG9yZSB0aGUgRE1BIGFkZHJlc3MKKyAqICAgIGluIGVzcC0+Y29tbWFuZF9ibG9ja19kbWEuCisgKiA4KSBSZWdpc3RlciB0aGUgc2NzaV9lc3BfaW50cigpIGludGVycnVwdCBoYW5kbGVyLgorICogOSkgUHJvYmUgZm9yIGFuZCBwcm92aWRlIHRoZSBmb2xsb3dpbmcgY2hpcCBwcm9wZXJ0aWVzOgorICogICAgZXNwLT5zY3NpX2lkIChhc3NpZ24gdG8gZXNwLT5ob3N0LT50aGlzX2lkIHRvbykKKyAqICAgIGVzcC0+c2NzaV9pZF9tYXNrCisgKiAgICBJZiBFU1AgYnVzIGlzIGRpZmZlcmVudGlhbCwgc2V0IEVTUF9GTEFHX0RJRkZFUkVOVElBTAorICogICAgZXNwLT5jZnJlcQorICogICAgRE1BIGJ1cnN0IGJpdCBtYXNrIGluIGVzcC0+YnVyc3RzLCBpZiBuZWNlc3NhcnkKKyAqIDEwKSBQZXJmb3JtIGFueSBhY3Rpb25zIG5lY2Vzc2FyeSBiZWZvcmUgdGhlIEVTUCBkZXZpY2UgY2FuCisgKiAgICAgYmUgcHJvZ3JhbW1lZCBmb3IgdGhlIGZpcnN0IHRpbWUuICBPbiBzb21lIGNvbmZpZ3MsIGZvcgorICogICAgIGV4YW1wbGUsIHRoZSBETUEgZW5naW5lIGhhcyB0byBiZSByZXNldCBiZWZvcmUgRVNQIGNhbgorICogICAgIGJlIHByb2dyYW1tZWQuCisgKiAxMSkgSWYgbmVjZXNzYXJ5LCBjYWxsIGRldl9zZXRfZHJ2ZGF0YSgpIGFzIG5lZWRlZC4KKyAqIDEyKSBDYWxsIHNjc2lfZXNwX3JlZ2lzdGVyKCkgd2l0aCBwcmVwYXJlZCAnZXNwJyBzdHJ1Y3R1cmUKKyAqICAgICBhbmQgYSBkZXZpY2UgcG9pbnRlciBpZiBwb3NzaWJsZS4KKyAqIDEzKSBDaGVjayBzY3NpX2VzcF9yZWdpc3RlcigpIHJldHVybiB2YWx1ZSwgcmVsZWFzZSBhbGwgcmVzb3VyY2VzCisgKiAgICAgaWYgYW4gZXJyb3Igd2FzIHJldHVybmVkLgorICovCitleHRlcm4gc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBzY3NpX2VzcF90ZW1wbGF0ZTsKK2V4dGVybiBpbnQgc2NzaV9lc3BfcmVnaXN0ZXIoc3RydWN0IGVzcCAqLCBzdHJ1Y3QgZGV2aWNlICopOworCitleHRlcm4gdm9pZCBzY3NpX2VzcF91bnJlZ2lzdGVyKHN0cnVjdCBlc3AgKik7CitleHRlcm4gaXJxcmV0dXJuX3Qgc2NzaV9lc3BfaW50cihpbnQsIHZvaWQgKik7CitleHRlcm4gdm9pZCBzY3NpX2VzcF9jbWQoc3RydWN0IGVzcCAqLCB1OCk7CisKKyNlbmRpZiAvKiAhKF9FU1BfU0NTSV9IKSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2hvc3RzLmMgYi9kcml2ZXJzL3Njc2kvaG9zdHMuYwppbmRleCAzOGMzYTI5Li5iZDhlN2YzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvaG9zdHMuYworKysgYi9kcml2ZXJzL3Njc2kvaG9zdHMuYwpAQCAtNDM1LDcgKzQzNSw3IEBACiAJc3RydWN0IGNsYXNzX2RldmljZSAqY2RldjsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IEVSUl9QVFIoLUVOWElPKSwgKnA7CiAKLQlkb3duX3JlYWQoJmNsYXNzLT5zdWJzeXMucndzZW0pOworCWRvd24oJmNsYXNzLT5zZW0pOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoY2RldiwgJmNsYXNzLT5jaGlsZHJlbiwgbm9kZSkgewogCQlwID0gY2xhc3NfdG9fc2hvc3QoY2Rldik7CiAJCWlmIChwLT5ob3N0X25vID09IGhvc3RudW0pIHsKQEAgLTQ0Myw3ICs0NDMsNyBAQAogCQkJYnJlYWs7CiAJCX0KIAl9Ci0JdXBfcmVhZCgmY2xhc3MtPnN1YnN5cy5yd3NlbSk7CisJdXAoJmNsYXNzLT5zZW0pOwogCiAJcmV0dXJuIHNob3N0OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2libXZzY3NpL2libXZzdGd0LmMgYi9kcml2ZXJzL3Njc2kvaWJtdnNjc2kvaWJtdnN0Z3QuYwppbmRleCA0MzY4Y2EwLi5hMzlhNDc4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvaWJtdnNjc2kvaWJtdnN0Z3QuYworKysgYi9kcml2ZXJzL3Njc2kvaWJtdnNjc2kvaWJtdnN0Z3QuYwpAQCAtODk3LDkgKzg5Nyw5IEBACiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpyb290ZG47CiAJY29uc3QgY2hhciAqaWQsICptb2RlbCwgKm5hbWU7Ci0JdW5zaWduZWQgaW50ICpudW07CisJY29uc3QgdW5zaWduZWQgaW50ICpudW07CiAKLQlyb290ZG4gPSBmaW5kX3BhdGhfZGV2aWNlKCIvIik7CisJcm9vdGRuID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgoIi8iKTsKIAlpZiAoIXJvb3RkbikKIAkJcmV0dXJuIC1FTk9FTlQ7CiAKQEAgLTkxMiwxMCArOTEyLDExIEBACiAJaWYgKG5hbWUpCiAJCXN0cm5jcHkocGFydGl0aW9uX25hbWUsIG5hbWUsIHNpemVvZihwYXJ0aXRpb25fbmFtZSkpOwogCi0JbnVtID0gKHVuc2lnbmVkIGludCAqKSBnZXRfcHJvcGVydHkocm9vdGRuLCAiaWJtLHBhcnRpdGlvbi1ubyIsIE5VTEwpOworCW51bSA9IGdldF9wcm9wZXJ0eShyb290ZG4sICJpYm0scGFydGl0aW9uLW5vIiwgTlVMTCk7CiAJaWYgKG51bSkKIAkJcGFydGl0aW9uX251bWJlciA9ICpudW07CiAKKwlvZl9ub2RlX3B1dChyb290ZG4pOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaWJtdnNjc2kvcnBhX3ZzY3NpLmMgYi9kcml2ZXJzL3Njc2kvaWJtdnNjc2kvcnBhX3ZzY3NpLmMKaW5kZXggMjI3YzBmMi4uMGE1MzNmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2libXZzY3NpL3JwYV92c2NzaS5jCisrKyBiL2RyaXZlcnMvc2NzaS9pYm12c2NzaS9ycGFfdnNjc2kuYwpAQCAtMTU3LDcgKzE1Nyw3IEBACiAJY29uc3QgdW5zaWduZWQgaW50ICpwX251bWJlcl9wdHI7CiAKIAkvKiBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHBhcnRpdGlvbiAqLwotCXJvb3RkbiA9IGZpbmRfcGF0aF9kZXZpY2UoIi8iKTsKKwlyb290ZG4gPSBvZl9maW5kX25vZGVfYnlfcGF0aCgiLyIpOwogCWlmICghcm9vdGRuKSB7CiAJCXJldHVybjsKIAl9CkBAIC0xNjksNiArMTY5LDcgQEAKIAlwX251bWJlcl9wdHIgPSBnZXRfcHJvcGVydHkocm9vdGRuLCAiaWJtLHBhcnRpdGlvbi1ubyIsIE5VTEwpOwogCWlmIChwX251bWJlcl9wdHIpCiAJCXBhcnRpdGlvbl9udW1iZXIgPSAqcF9udW1iZXJfcHRyOworCW9mX25vZGVfcHV0KHJvb3Rkbik7CiB9CiAKIHN0YXRpYyB2b2lkIHNldF9hZGFwdGVyX2luZm8oc3RydWN0IGlibXZzY3NpX2hvc3RfZGF0YSAqaG9zdGRhdGEpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaXByLmMgYi9kcml2ZXJzL3Njc2kvaXByLmMKaW5kZXggOTUwNDVlMy4uZTliZDI5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2lwci5jCisrKyBiL2RyaXZlcnMvc2NzaS9pcHIuYwpAQCAtMzc3MCw3ICszNzcwLDggQEAKICAqIFJldHVybiB2YWx1ZToKICAqCTAgb24gc3VjY2VzcyAvIG5vbi16ZXJvIG9uIGZhaWx1cmUKICAqKi8KLXN0YXRpYyBpbnQgaXByX3NhdGFfcmVzZXQoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50ICpjbGFzc2VzKQorc3RhdGljIGludCBpcHJfc2F0YV9yZXNldChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgKmNsYXNzZXMsCisJCQkJdW5zaWduZWQgbG9uZyBkZWFkbGluZSkKIHsKIAlzdHJ1Y3QgaXByX3NhdGFfcG9ydCAqc2F0YV9wb3J0ID0gYXAtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcgPSBzYXRhX3BvcnQtPmlvYV9jZmc7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxvZ2ljcHRpLmMgYi9kcml2ZXJzL3Njc2kvcWxvZ2ljcHRpLmMKaW5kZXggOWYxMDY4OS4uYzQxOTVlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Fsb2dpY3B0aS5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbG9naWNwdGkuYwpAQCAtMTQwMyw3ICsxNDAzLDcgQEAKIAlzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlICp0cG50ID0gbWF0Y2gtPmRhdGE7CiAJc3RydWN0IFNjc2lfSG9zdCAqaG9zdDsKIAlzdHJ1Y3QgcWxvZ2ljcHRpICpxcHRpOwotCWNoYXIgKmZjb2RlOworCWNvbnN0IGNoYXIgKmZjb2RlOwogCiAJLyogU29tZXRpbWVzIEFudGFyZXMgY2FyZHMgY29tZSB1cCBub3QgY29tcGxldGVseQogCSAqIHNldHVwLCBhbmQgd2UgZ2V0IGEgcmVwb3J0IG9mIGEgemVybyBJUlEuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV9saWIuYyBiL2RyaXZlcnMvc2NzaS9zY3NpX2xpYi5jCmluZGV4IDlmNzQ4MmQuLjA1ZDc5YWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpX2xpYi5jCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX2xpYi5jCkBAIC0zMSw3ICszMSw3IEBACiAKIAogI2RlZmluZSBTR19NRU1QT09MX05SCQlBUlJBWV9TSVpFKHNjc2lfc2dfcG9vbHMpCi0jZGVmaW5lIFNHX01FTVBPT0xfU0laRQkJMzIKKyNkZWZpbmUgU0dfTUVNUE9PTF9TSVpFCQkyCiAKIHN0cnVjdCBzY3NpX2hvc3Rfc2dfcG9vbCB7CiAJc2l6ZV90CQlzaXplOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfbmV0bGluay5jIGIvZHJpdmVycy9zY3NpL3Njc2lfbmV0bGluay5jCmluZGV4IDFiNTliMjcuLjRiZjlhYTU0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2lfbmV0bGluay5jCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX25ldGxpbmsuYwpAQCAtNTAsNyArNTAsNyBAQAogCXdoaWxlIChza2ItPmxlbiA+PSBOTE1TR19TUEFDRSgwKSkgewogCQllcnIgPSAwOwogCi0JCW5saCA9IChzdHJ1Y3Qgbmxtc2doZHIgKikgc2tiLT5kYXRhOworCQlubGggPSBubG1zZ19oZHIoc2tiKTsKIAkJaWYgKChubGgtPm5sbXNnX2xlbiA8IChzaXplb2YoKm5saCkgKyBzaXplb2YoKmhkcikpKSB8fAogCQkgICAgKHNrYi0+bGVuIDwgbmxoLT5ubG1zZ19sZW4pKSB7CiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogZGlzY2FyZGluZyBwYXJ0aWFsIHNrYlxuIiwKQEAgLTE2OCw3ICsxNjgsOCBAQAogCX0KIAogCXNjc2lfbmxfc29jayA9IG5ldGxpbmtfa2VybmVsX2NyZWF0ZShORVRMSU5LX1NDU0lUUkFOU1BPUlQsCi0JCQkJU0NTSV9OTF9HUlBfQ05ULCBzY3NpX25sX3JjdiwgVEhJU19NT0RVTEUpOworCQkJCVNDU0lfTkxfR1JQX0NOVCwgc2NzaV9ubF9yY3YsIE5VTEwsCisJCQkJVEhJU19NT0RVTEUpOwogCWlmICghc2NzaV9ubF9zb2NrKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IHJlZ2lzdGVyIG9mIHJlY2lldmUgaGFuZGxlciBmYWlsZWRcbiIsCiAJCQkJX19GVU5DVElPTl9fKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX3RyYW5zcG9ydF9pc2NzaS5jIGIvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X2lzY3NpLmMKaW5kZXggY2UwZDE0YS4uYWFiYWEwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X2lzY3NpLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X2lzY3NpLmMKQEAgLTEwODEsNyArMTA4MSw3IEBACiAJCQlzdHJ1Y3Qgbmxtc2doZHIJKm5saDsKIAkJCXN0cnVjdCBpc2NzaV91ZXZlbnQgKmV2OwogCi0JCQlubGggPSAoc3RydWN0IG5sbXNnaGRyICopc2tiLT5kYXRhOworCQkJbmxoID0gbmxtc2dfaGRyKHNrYik7CiAJCQlpZiAobmxoLT5ubG1zZ19sZW4gPCBzaXplb2YoKm5saCkgfHwKIAkJCSAgICBza2ItPmxlbiA8IG5saC0+bmxtc2dfbGVuKSB7CiAJCQkJYnJlYWs7CkBAIC0xNDM1LDcgKzE0MzUsNyBAQAogCWlmIChlcnIpCiAJCWdvdG8gdW5yZWdpc3Rlcl9jb25uX2NsYXNzOwogCi0JbmxzID0gbmV0bGlua19rZXJuZWxfY3JlYXRlKE5FVExJTktfSVNDU0ksIDEsIGlzY3NpX2lmX3J4LAorCW5scyA9IG5ldGxpbmtfa2VybmVsX2NyZWF0ZShORVRMSU5LX0lTQ1NJLCAxLCBpc2NzaV9pZl9yeCwgTlVMTCwKIAkJCVRISVNfTU9EVUxFKTsKIAlpZiAoIW5scykgewogCQllcnIgPSAtRU5PQlVGUzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zdW5fZXNwLmMgYi9kcml2ZXJzL3Njc2kvc3VuX2VzcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjNzY2YmMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvc3VuX2VzcC5jCkBAIC0wLDAgKzEsNjM0IEBACisvKiBzdW5fZXNwLmM6IEVTUCBmcm9udC1lbmQgZm9yIFNwYXJjIFNCVVMgc3lzdGVtcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBkYXZlbWxvZnQubmV0KQorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisKKyNpbmNsdWRlIDxhc20vc2J1cy5oPgorCisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKworI2luY2x1ZGUgImVzcF9zY3NpLmgiCisKKyNkZWZpbmUgRFJWX01PRFVMRV9OQU1FCQkic3VuX2VzcCIKKyNkZWZpbmUgUEZYIERSVl9NT0RVTEVfTkFNRQkiOiAiCisjZGVmaW5lIERSVl9WRVJTSU9OCQkiMS4wMDAiCisjZGVmaW5lIERSVl9NT0RVTEVfUkVMREFURQkiQXByaWwgMTksIDIwMDciCisKKyNkZWZpbmUgZG1hX3JlYWQzMihSRUcpIFwKKwlzYnVzX3JlYWRsKGVzcC0+ZG1hX3JlZ3MgKyAoUkVHKSkKKyNkZWZpbmUgZG1hX3dyaXRlMzIoVkFMLCBSRUcpIFwKKwlzYnVzX3dyaXRlbCgoVkFMKSwgZXNwLT5kbWFfcmVncyArIChSRUcpKQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBlc3Bfc2J1c19maW5kX2RtYShzdHJ1Y3QgZXNwICplc3AsIHN0cnVjdCBzYnVzX2RldiAqZG1hX3NkZXYpCit7CisJc3RydWN0IHNidXNfZGV2ICpzZGV2ID0gZXNwLT5kZXY7CisJc3RydWN0IHNidXNfZG1hICpkbWE7CisKKwlpZiAoZG1hX3NkZXYgIT0gTlVMTCkgeworCQlmb3JfZWFjaF9kdm1hKGRtYSkgeworCQkJaWYgKGRtYS0+c2RldiA9PSBkbWFfc2RldikKKwkJCQlicmVhazsKKwkJfQorCX0gZWxzZSB7CisJCWZvcl9lYWNoX2R2bWEoZG1hKSB7CisJCQlpZiAoZG1hLT5zZGV2ID09IE5VTEwpCisJCQkJYnJlYWs7CisKKwkJCS8qIElmIGJ1cyArIHNsb3QgYXJlIHRoZSBzYW1lIGFuZCBpdCBoYXMgdGhlCisJCQkgKiBjb3JyZWN0IE9CUCBuYW1lLCBpdCdzIG91cnMuCisJCQkgKi8KKwkJCWlmIChzZGV2LT5idXMgPT0gZG1hLT5zZGV2LT5idXMgJiYKKwkJCSAgICBzZGV2LT5zbG90ID09IGRtYS0+c2Rldi0+c2xvdCAmJgorCQkJICAgICghc3RyY21wKGRtYS0+c2Rldi0+cHJvbV9uYW1lLCAiZG1hIikgfHwKKwkJCSAgICAgIXN0cmNtcChkbWEtPnNkZXYtPnByb21fbmFtZSwgImVzcGRtYSIpKSkKKwkJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChkbWEgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJbJXNdIENhbm5vdCBmaW5kIGRtYS5cbiIsCisJCSAgICAgICBzZGV2LT5vZmRldi5ub2RlLT5mdWxsX25hbWUpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJZXNwLT5kbWEgPSBkbWE7CisJZXNwLT5kbWFfcmVncyA9IGRtYS0+cmVnczsKKworCXJldHVybiAwOworCit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGVzcF9zYnVzX21hcF9yZWdzKHN0cnVjdCBlc3AgKmVzcCwgaW50IGhtZSkKK3sKKwlzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYgPSBlc3AtPmRldjsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKworCS8qIE9uIEhNRSwgdHdvIHJlZyBzZXRzIGV4aXN0LCBmaXJzdCBpcyBEVk1BLAorCSAqIHNlY29uZCBpcyBFU1AgcmVnaXN0ZXJzLgorCSAqLworCWlmIChobWUpCisJCXJlcyA9ICZzZGV2LT5yZXNvdXJjZVsxXTsKKwllbHNlCisJCXJlcyA9ICZzZGV2LT5yZXNvdXJjZVswXTsKKworCWVzcC0+cmVncyA9IHNidXNfaW9yZW1hcChyZXMsIDAsIFNCVVNfRVNQX1JFR19TSVpFLCAiRVNQIik7CisJaWYgKCFlc3AtPnJlZ3MpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGVzcF9zYnVzX21hcF9jb21tYW5kX2Jsb2NrKHN0cnVjdCBlc3AgKmVzcCkKK3sKKwlzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYgPSBlc3AtPmRldjsKKworCWVzcC0+Y29tbWFuZF9ibG9jayA9IHNidXNfYWxsb2NfY29uc2lzdGVudChzZGV2LCAxNiwKKwkJCQkJCSAgICZlc3AtPmNvbW1hbmRfYmxvY2tfZG1hKTsKKwlpZiAoIWVzcC0+Y29tbWFuZF9ibG9jaykKKwkJcmV0dXJuIC1FTk9NRU07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGVzcF9zYnVzX3JlZ2lzdGVyX2lycShzdHJ1Y3QgZXNwICplc3ApCit7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdCA9IGVzcC0+aG9zdDsKKwlzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYgPSBlc3AtPmRldjsKKworCWhvc3QtPmlycSA9IHNkZXYtPmlycXNbMF07CisJcmV0dXJuIHJlcXVlc3RfaXJxKGhvc3QtPmlycSwgc2NzaV9lc3BfaW50ciwgSVJRRl9TSEFSRUQsICJFU1AiLCBlc3ApOworfQorCitzdGF0aWMgdm9pZCBfX2RldmluaXQgZXNwX2dldF9zY3NpX2lkKHN0cnVjdCBlc3AgKmVzcCkKK3sKKwlzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYgPSBlc3AtPmRldjsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwID0gc2Rldi0+b2ZkZXYubm9kZTsKKworCWVzcC0+c2NzaV9pZCA9IG9mX2dldGludHByb3BfZGVmYXVsdChkcCwgImluaXRpYXRvci1pZCIsIDB4ZmYpOworCWlmIChlc3AtPnNjc2lfaWQgIT0gMHhmZikKKwkJZ290byBkb25lOworCisJZXNwLT5zY3NpX2lkID0gb2ZfZ2V0aW50cHJvcF9kZWZhdWx0KGRwLCAic2NzaS1pbml0aWF0b3ItaWQiLCAweGZmKTsKKwlpZiAoZXNwLT5zY3NpX2lkICE9IDB4ZmYpCisJCWdvdG8gZG9uZTsKKworCWlmICghc2Rldi0+YnVzKSB7CisJCS8qIFNVTjQgKi8KKwkJZXNwLT5zY3NpX2lkID0gNzsKKwkJZ290byBkb25lOworCX0KKworCWVzcC0+c2NzaV9pZCA9IG9mX2dldGludHByb3BfZGVmYXVsdChzZGV2LT5idXMtPm9mZGV2Lm5vZGUsCisJCQkJCSAgICAgInNjc2ktaW5pdGlhdG9yLWlkIiwgNyk7CisKK2RvbmU6CisJZXNwLT5ob3N0LT50aGlzX2lkID0gZXNwLT5zY3NpX2lkOworCWVzcC0+c2NzaV9pZF9tYXNrID0gKDEgPDwgZXNwLT5zY3NpX2lkKTsKK30KKworc3RhdGljIHZvaWQgX19kZXZpbml0IGVzcF9nZXRfZGlmZmVyZW50aWFsKHN0cnVjdCBlc3AgKmVzcCkKK3sKKwlzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYgPSBlc3AtPmRldjsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwID0gc2Rldi0+b2ZkZXYubm9kZTsKKworCWlmIChvZl9maW5kX3Byb3BlcnR5KGRwLCAiZGlmZmVyZW50aWFsIiwgTlVMTCkpCisJCWVzcC0+ZmxhZ3MgfD0gRVNQX0ZMQUdfRElGRkVSRU5USUFMOworCWVsc2UKKwkJZXNwLT5mbGFncyAmPSB+RVNQX0ZMQUdfRElGRkVSRU5USUFMOworfQorCitzdGF0aWMgdm9pZCBfX2RldmluaXQgZXNwX2dldF9jbG9ja19wYXJhbXMoc3RydWN0IGVzcCAqZXNwKQoreworCXN0cnVjdCBzYnVzX2RldiAqc2RldiA9IGVzcC0+ZGV2OworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAgPSBzZGV2LT5vZmRldi5ub2RlOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqYnVzX2RwOworCWludCBmbWh6OworCisJYnVzX2RwID0gTlVMTDsKKwlpZiAoc2RldiAhPSBOVUxMICYmIHNkZXYtPmJ1cyAhPSBOVUxMKQorCQlidXNfZHAgPSBzZGV2LT5idXMtPm9mZGV2Lm5vZGU7CisKKwlmbWh6ID0gb2ZfZ2V0aW50cHJvcF9kZWZhdWx0KGRwLCAiY2xvY2stZnJlcXVlbmN5IiwgMCk7CisJaWYgKGZtaHogPT0gMCkKKwkJZm1oeiA9ICghYnVzX2RwKSA/IDAgOgorCQkJb2ZfZ2V0aW50cHJvcF9kZWZhdWx0KGJ1c19kcCwgImNsb2NrLWZyZXF1ZW5jeSIsIDApOworCisJZXNwLT5jZnJlcSA9IGZtaHo7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBlc3BfZ2V0X2J1cnN0cyhzdHJ1Y3QgZXNwICplc3AsIHN0cnVjdCBzYnVzX2RldiAqZG1hKQoreworCXN0cnVjdCBzYnVzX2RldiAqc2RldiA9IGVzcC0+ZGV2OworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAgPSBzZGV2LT5vZmRldi5ub2RlOworCXU4IGJ1cnN0czsKKworCWJ1cnN0cyA9IG9mX2dldGludHByb3BfZGVmYXVsdChkcCwgImJ1cnN0LXNpemVzIiwgMHhmZik7CisJaWYgKGRtYSkgeworCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRtYV9kcCA9IGRtYS0+b2ZkZXYubm9kZTsKKwkJdTggdmFsID0gb2ZfZ2V0aW50cHJvcF9kZWZhdWx0KGRtYV9kcCwgImJ1cnN0LXNpemVzIiwgMHhmZik7CisJCWlmICh2YWwgIT0gMHhmZikKKwkJCWJ1cnN0cyAmPSB2YWw7CisJfQorCisJaWYgKHNkZXYtPmJ1cykgeworCQl1OCB2YWwgPSBvZl9nZXRpbnRwcm9wX2RlZmF1bHQoc2Rldi0+YnVzLT5vZmRldi5ub2RlLAorCQkJCQkgICAgICAgImJ1cnN0LXNpemVzIiwgMHhmZik7CisJCWlmICh2YWwgIT0gMHhmZikKKwkJCWJ1cnN0cyAmPSB2YWw7CisJfQorCisJaWYgKGJ1cnN0cyA9PSAweGZmIHx8CisJICAgIChidXJzdHMgJiBETUFfQlVSU1QxNikgPT0gMCB8fAorCSAgICAoYnVyc3RzICYgRE1BX0JVUlNUMzIpID09IDApCisJCWJ1cnN0cyA9IChETUFfQlVSU1QzMiAtIDEpOworCisJZXNwLT5idXJzdHMgPSBidXJzdHM7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBlc3Bfc2J1c19nZXRfcHJvcHMoc3RydWN0IGVzcCAqZXNwLCBzdHJ1Y3Qgc2J1c19kZXYgKmVzcGRtYSkKK3sKKwllc3BfZ2V0X3Njc2lfaWQoZXNwKTsKKwllc3BfZ2V0X2RpZmZlcmVudGlhbChlc3ApOworCWVzcF9nZXRfY2xvY2tfcGFyYW1zKGVzcCk7CisJZXNwX2dldF9idXJzdHMoZXNwLCBlc3BkbWEpOworfQorCitzdGF0aWMgdm9pZCBzYnVzX2VzcF93cml0ZTgoc3RydWN0IGVzcCAqZXNwLCB1OCB2YWwsIHVuc2lnbmVkIGxvbmcgcmVnKQoreworCXNidXNfd3JpdGViKHZhbCwgZXNwLT5yZWdzICsgKHJlZyAqIDRVTCkpOworfQorCitzdGF0aWMgdTggc2J1c19lc3BfcmVhZDgoc3RydWN0IGVzcCAqZXNwLCB1bnNpZ25lZCBsb25nIHJlZykKK3sKKwlyZXR1cm4gc2J1c19yZWFkYihlc3AtPnJlZ3MgKyAocmVnICogNFVMKSk7Cit9CisKK3N0YXRpYyBkbWFfYWRkcl90IHNidXNfZXNwX21hcF9zaW5nbGUoc3RydWN0IGVzcCAqZXNwLCB2b2lkICpidWYsCisJCQkJICAgICAgc2l6ZV90IHN6LCBpbnQgZGlyKQoreworCXJldHVybiBzYnVzX21hcF9zaW5nbGUoZXNwLT5kZXYsIGJ1Ziwgc3osIGRpcik7Cit9CisKK3N0YXRpYyBpbnQgc2J1c19lc3BfbWFwX3NnKHN0cnVjdCBlc3AgKmVzcCwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKKwkJCQkgIGludCBudW1fc2csIGludCBkaXIpCit7CisJcmV0dXJuIHNidXNfbWFwX3NnKGVzcC0+ZGV2LCBzZywgbnVtX3NnLCBkaXIpOworfQorCitzdGF0aWMgdm9pZCBzYnVzX2VzcF91bm1hcF9zaW5nbGUoc3RydWN0IGVzcCAqZXNwLCBkbWFfYWRkcl90IGFkZHIsCisJCQkJICBzaXplX3Qgc3osIGludCBkaXIpCit7CisJc2J1c191bm1hcF9zaW5nbGUoZXNwLT5kZXYsIGFkZHIsIHN6LCBkaXIpOworfQorCitzdGF0aWMgdm9pZCBzYnVzX2VzcF91bm1hcF9zZyhzdHJ1Y3QgZXNwICplc3AsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCisJCQkgICAgICBpbnQgbnVtX3NnLCBpbnQgZGlyKQoreworCXNidXNfdW5tYXBfc2coZXNwLT5kZXYsIHNnLCBudW1fc2csIGRpcik7Cit9CisKK3N0YXRpYyBpbnQgc2J1c19lc3BfaXJxX3BlbmRpbmcoc3RydWN0IGVzcCAqZXNwKQoreworCWlmIChkbWFfcmVhZDMyKERNQV9DU1IpICYgKERNQV9ITkRMX0lOVFIgfCBETUFfSE5ETF9FUlJPUikpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzYnVzX2VzcF9yZXNldF9kbWEoc3RydWN0IGVzcCAqZXNwKQoreworCWludCBjYW5fZG9fYnVyc3QxNiwgY2FuX2RvX2J1cnN0MzIsIGNhbl9kb19idXJzdDY0OworCWludCBjYW5fZG9fc2J1czY0LCBsaW07CisJdTMyIHZhbDsKKworCWNhbl9kb19idXJzdDE2ID0gKGVzcC0+YnVyc3RzICYgRE1BX0JVUlNUMTYpICE9IDA7CisJY2FuX2RvX2J1cnN0MzIgPSAoZXNwLT5idXJzdHMgJiBETUFfQlVSU1QzMikgIT0gMDsKKwljYW5fZG9fYnVyc3Q2NCA9IDA7CisJY2FuX2RvX3NidXM2NCA9IDA7CisJaWYgKHNidXNfY2FuX2RtYV82NGJpdChlc3AtPmRldikpCisJCWNhbl9kb19zYnVzNjQgPSAxOworCWlmIChzYnVzX2Nhbl9idXJzdDY0KGVzcC0+c2RldikpCisJCWNhbl9kb19idXJzdDY0ID0gKGVzcC0+YnVyc3RzICYgRE1BX0JVUlNUNjQpICE9IDA7CisKKwkvKiBQdXQgdGhlIERWTUEgaW50byBhIGtub3duIHN0YXRlLiAqLworCWlmIChlc3AtPmRtYS0+cmV2aXNpb24gIT0gZHZtYWhtZSkgeworCQl2YWwgPSBkbWFfcmVhZDMyKERNQV9DU1IpOworCQlkbWFfd3JpdGUzMih2YWwgfCBETUFfUlNUX1NDU0ksIERNQV9DU1IpOworCQlkbWFfd3JpdGUzMih2YWwgJiB+RE1BX1JTVF9TQ1NJLCBETUFfQ1NSKTsKKwl9CisJc3dpdGNoIChlc3AtPmRtYS0+cmV2aXNpb24pIHsKKwljYXNlIGR2bWFobWU6CisJCWRtYV93cml0ZTMyKERNQV9SRVNFVF9GQVMzNjYsIERNQV9DU1IpOworCQlkbWFfd3JpdGUzMihETUFfUlNUX1NDU0ksIERNQV9DU1IpOworCisJCWVzcC0+cHJldl9obWVfZG1hY3NyID0gKERNQV9QQVJJVFlfT0ZGIHwgRE1BXzJDTEtTIHwKKwkJCQkJRE1BX1NDU0lfRElTQUIgfCBETUFfSU5UX0VOQUIpOworCisJCWVzcC0+cHJldl9obWVfZG1hY3NyICY9IH4oRE1BX0VOQUJMRSB8IERNQV9TVF9XUklURSB8CisJCQkJCSAgRE1BX0JSU1RfU1opOworCisJCWlmIChjYW5fZG9fYnVyc3Q2NCkKKwkJCWVzcC0+cHJldl9obWVfZG1hY3NyIHw9IERNQV9CUlNUNjQ7CisJCWVsc2UgaWYgKGNhbl9kb19idXJzdDMyKQorCQkJZXNwLT5wcmV2X2htZV9kbWFjc3IgfD0gRE1BX0JSU1QzMjsKKworCQlpZiAoY2FuX2RvX3NidXM2NCkgeworCQkJZXNwLT5wcmV2X2htZV9kbWFjc3IgfD0gRE1BX1NDU0lfU0JVUzY0OworCQkJc2J1c19zZXRfc2J1czY0KGVzcC0+ZGV2LCBlc3AtPmJ1cnN0cyk7CisJCX0KKworCQlsaW0gPSAxMDAwOworCQl3aGlsZSAoZG1hX3JlYWQzMihETUFfQ1NSKSAmIERNQV9QRU5EX1JFQUQpIHsKKwkJCWlmICgtLWxpbSA9PSAwKSB7CisJCQkJcHJpbnRrKEtFUk5fQUxFUlQgUEZYICJlc3AlZDogRE1BX1BFTkRfUkVBRCAiCisJCQkJICAgICAgICJ3aWxsIG5vdCBjbGVhciFcbiIsCisJCQkJICAgICAgIGVzcC0+aG9zdC0+dW5pcXVlX2lkKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXVkZWxheSgxKTsKKwkJfQorCisJCWRtYV93cml0ZTMyKDAsIERNQV9DU1IpOworCQlkbWFfd3JpdGUzMihlc3AtPnByZXZfaG1lX2RtYWNzciwgRE1BX0NTUik7CisKKwkJZG1hX3dyaXRlMzIoMCwgRE1BX0FERFIpOworCQlicmVhazsKKworCWNhc2UgZHZtYXJldjI6CisJCWlmIChlc3AtPnJldiAhPSBFU1AxMDApIHsKKwkJCXZhbCA9IGRtYV9yZWFkMzIoRE1BX0NTUik7CisJCQlkbWFfd3JpdGUzMih2YWwgfCBETUFfM0NMS1MsIERNQV9DU1IpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBkdm1hcmV2MzoKKwkJdmFsID0gZG1hX3JlYWQzMihETUFfQ1NSKTsKKwkJdmFsICY9IH5ETUFfM0NMS1M7CisJCXZhbCB8PSBETUFfMkNMS1M7CisJCWlmIChjYW5fZG9fYnVyc3QzMikgeworCQkJdmFsICY9IH5ETUFfQlJTVF9TWjsKKwkJCXZhbCB8PSBETUFfQlJTVDMyOworCQl9CisJCWRtYV93cml0ZTMyKHZhbCwgRE1BX0NTUik7CisJCWJyZWFrOworCisJY2FzZSBkdm1hZXNjMToKKwkJdmFsID0gZG1hX3JlYWQzMihETUFfQ1NSKTsKKwkJdmFsIHw9IERNQV9BRERfRU5BQkxFOworCQl2YWwgJj0gfkRNQV9CQ05UX0VOQUI7CisJCWlmICghY2FuX2RvX2J1cnN0MzIgJiYgY2FuX2RvX2J1cnN0MTYpIHsKKwkJCXZhbCB8PSBETUFfRVNDX0JVUlNUOworCQl9IGVsc2UgeworCQkJdmFsICY9IH4oRE1BX0VTQ19CVVJTVCk7CisJCX0KKwkJZG1hX3dyaXRlMzIodmFsLCBETUFfQ1NSKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwkvKiBFbmFibGUgaW50ZXJydXB0cy4gICovCisJdmFsID0gZG1hX3JlYWQzMihETUFfQ1NSKTsKKwlkbWFfd3JpdGUzMih2YWwgfCBETUFfSU5UX0VOQUIsIERNQV9DU1IpOworfQorCitzdGF0aWMgdm9pZCBzYnVzX2VzcF9kbWFfZHJhaW4oc3RydWN0IGVzcCAqZXNwKQoreworCXUzMiBjc3I7CisJaW50IGxpbTsKKworCWlmIChlc3AtPmRtYS0+cmV2aXNpb24gPT0gZHZtYWhtZSkKKwkJcmV0dXJuOworCisJY3NyID0gZG1hX3JlYWQzMihETUFfQ1NSKTsKKwlpZiAoIShjc3IgJiBETUFfRklGT19JU0RSQUlOKSkKKwkJcmV0dXJuOworCisJaWYgKGVzcC0+ZG1hLT5yZXZpc2lvbiAhPSBkdm1hcmV2MyAmJiBlc3AtPmRtYS0+cmV2aXNpb24gIT0gZHZtYWVzYzEpCisJCWRtYV93cml0ZTMyKGNzciB8IERNQV9GSUZPX1NURFJBSU4sIERNQV9DU1IpOworCisJbGltID0gMTAwMDsKKwl3aGlsZSAoZG1hX3JlYWQzMihETUFfQ1NSKSAmIERNQV9GSUZPX0lTRFJBSU4pIHsKKwkJaWYgKC0tbGltID09IDApIHsKKwkJCXByaW50ayhLRVJOX0FMRVJUIFBGWCAiZXNwJWQ6IERNQSB3aWxsIG5vdCBkcmFpbiFcbiIsCisJCQkgICAgICAgZXNwLT5ob3N0LT51bmlxdWVfaWQpOworCQkJYnJlYWs7CisJCX0KKwkJdWRlbGF5KDEpOworCX0KK30KKworc3RhdGljIHZvaWQgc2J1c19lc3BfZG1hX2ludmFsaWRhdGUoc3RydWN0IGVzcCAqZXNwKQoreworCWlmIChlc3AtPmRtYS0+cmV2aXNpb24gPT0gZHZtYWhtZSkgeworCQlkbWFfd3JpdGUzMihETUFfUlNUX1NDU0ksIERNQV9DU1IpOworCisJCWVzcC0+cHJldl9obWVfZG1hY3NyID0gKChlc3AtPnByZXZfaG1lX2RtYWNzciB8CisJCQkJCSAoRE1BX1BBUklUWV9PRkYgfCBETUFfMkNMS1MgfAorCQkJCQkgIERNQV9TQ1NJX0RJU0FCIHwgRE1BX0lOVF9FTkFCKSkgJgorCQkJCQl+KERNQV9TVF9XUklURSB8IERNQV9FTkFCTEUpKTsKKworCQlkbWFfd3JpdGUzMigwLCBETUFfQ1NSKTsKKwkJZG1hX3dyaXRlMzIoZXNwLT5wcmV2X2htZV9kbWFjc3IsIERNQV9DU1IpOworCisJCS8qIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIGF2b2lkIGhhdmluZyB0aGUgU0NTSSBjaGFubmVsCisJCSAqIGVuZ2luZSBsb2NrIHVwIG9uIHVzLgorCQkgKi8KKwkJZG1hX3dyaXRlMzIoMCwgRE1BX0FERFIpOworCX0gZWxzZSB7CisJCXUzMiB2YWw7CisJCWludCBsaW07CisKKwkJbGltID0gMTAwMDsKKwkJd2hpbGUgKCh2YWwgPSBkbWFfcmVhZDMyKERNQV9DU1IpKSAmIERNQV9QRU5EX1JFQUQpIHsKKwkJCWlmICgtLWxpbSA9PSAwKSB7CisJCQkJcHJpbnRrKEtFUk5fQUxFUlQgUEZYICJlc3AlZDogRE1BIHdpbGwgbm90ICIKKwkJCQkgICAgICAgImludmFsaWRhdGUhXG4iLCBlc3AtPmhvc3QtPnVuaXF1ZV9pZCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQl1ZGVsYXkoMSk7CisJCX0KKworCQl2YWwgJj0gfihETUFfRU5BQkxFIHwgRE1BX1NUX1dSSVRFIHwgRE1BX0JDTlRfRU5BQik7CisJCXZhbCB8PSBETUFfRklGT19JTlY7CisJCWRtYV93cml0ZTMyKHZhbCwgRE1BX0NTUik7CisJCXZhbCAmPSB+RE1BX0ZJRk9fSU5WOworCQlkbWFfd3JpdGUzMih2YWwsIERNQV9DU1IpOworCX0KK30KKworc3RhdGljIHZvaWQgc2J1c19lc3Bfc2VuZF9kbWFfY21kKHN0cnVjdCBlc3AgKmVzcCwgdTMyIGFkZHIsIHUzMiBlc3BfY291bnQsCisJCQkJICB1MzIgZG1hX2NvdW50LCBpbnQgd3JpdGUsIHU4IGNtZCkKK3sKKwl1MzIgY3NyOworCisJQlVHX09OKCEoY21kICYgRVNQX0NNRF9ETUEpKTsKKworCXNidXNfZXNwX3dyaXRlOChlc3AsIChlc3BfY291bnQgPj4gMCkgJiAweGZmLCBFU1BfVENMT1cpOworCXNidXNfZXNwX3dyaXRlOChlc3AsIChlc3BfY291bnQgPj4gOCkgJiAweGZmLCBFU1BfVENNRUQpOworCWlmIChlc3AtPnJldiA9PSBGQVNITUUpIHsKKwkJc2J1c19lc3Bfd3JpdGU4KGVzcCwgKGVzcF9jb3VudCA+PiAxNikgJiAweGZmLCBGQVNfUkxPKTsKKwkJc2J1c19lc3Bfd3JpdGU4KGVzcCwgMCwgRkFTX1JISSk7CisKKwkJc2NzaV9lc3BfY21kKGVzcCwgY21kKTsKKworCQljc3IgPSBlc3AtPnByZXZfaG1lX2RtYWNzcjsKKwkJY3NyIHw9IERNQV9TQ1NJX0RJU0FCIHwgRE1BX0VOQUJMRTsKKwkJaWYgKHdyaXRlKQorCQkJY3NyIHw9IERNQV9TVF9XUklURTsKKwkJZWxzZQorCQkJY3NyICY9IH5ETUFfU1RfV1JJVEU7CisJCWVzcC0+cHJldl9obWVfZG1hY3NyID0gY3NyOworCisJCWRtYV93cml0ZTMyKGRtYV9jb3VudCwgRE1BX0NPVU5UKTsKKwkJZG1hX3dyaXRlMzIoYWRkciwgRE1BX0FERFIpOworCQlkbWFfd3JpdGUzMihjc3IsIERNQV9DU1IpOworCX0gZWxzZSB7CisJCWNzciA9IGRtYV9yZWFkMzIoRE1BX0NTUik7CisJCWNzciB8PSBETUFfRU5BQkxFOworCQlpZiAod3JpdGUpCisJCQljc3IgfD0gRE1BX1NUX1dSSVRFOworCQllbHNlCisJCQljc3IgJj0gfkRNQV9TVF9XUklURTsKKwkJZG1hX3dyaXRlMzIoY3NyLCBETUFfQ1NSKTsKKwkJaWYgKGVzcC0+ZG1hLT5yZXZpc2lvbiA9PSBkdm1hZXNjMSkgeworCQkJdTMyIGVuZCA9IFBBR0VfQUxJR04oYWRkciArIGRtYV9jb3VudCArIDE2VSk7CisJCQlkbWFfd3JpdGUzMihlbmQgLSBhZGRyLCBETUFfQ09VTlQpOworCQl9CisJCWRtYV93cml0ZTMyKGFkZHIsIERNQV9BRERSKTsKKworCQlzY3NpX2VzcF9jbWQoZXNwLCBjbWQpOworCX0KKworfQorCitzdGF0aWMgaW50IHNidXNfZXNwX2RtYV9lcnJvcihzdHJ1Y3QgZXNwICplc3ApCit7CisJdTMyIGNzciA9IGRtYV9yZWFkMzIoRE1BX0NTUik7CisKKwlpZiAoY3NyICYgRE1BX0hORExfRVJST1IpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZXNwX2RyaXZlcl9vcHMgc2J1c19lc3Bfb3BzID0geworCS5lc3Bfd3JpdGU4CT0Jc2J1c19lc3Bfd3JpdGU4LAorCS5lc3BfcmVhZDgJPQlzYnVzX2VzcF9yZWFkOCwKKwkubWFwX3NpbmdsZQk9CXNidXNfZXNwX21hcF9zaW5nbGUsCisJLm1hcF9zZwkJPQlzYnVzX2VzcF9tYXBfc2csCisJLnVubWFwX3NpbmdsZQk9CXNidXNfZXNwX3VubWFwX3NpbmdsZSwKKwkudW5tYXBfc2cJPQlzYnVzX2VzcF91bm1hcF9zZywKKwkuaXJxX3BlbmRpbmcJPQlzYnVzX2VzcF9pcnFfcGVuZGluZywKKwkucmVzZXRfZG1hCT0Jc2J1c19lc3BfcmVzZXRfZG1hLAorCS5kbWFfZHJhaW4JPQlzYnVzX2VzcF9kbWFfZHJhaW4sCisJLmRtYV9pbnZhbGlkYXRlCT0Jc2J1c19lc3BfZG1hX2ludmFsaWRhdGUsCisJLnNlbmRfZG1hX2NtZAk9CXNidXNfZXNwX3NlbmRfZG1hX2NtZCwKKwkuZG1hX2Vycm9yCT0Jc2J1c19lc3BfZG1hX2Vycm9yLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgZXNwX3NidXNfcHJvYmVfb25lKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJc3RydWN0IHNidXNfZGV2ICplc3BfZGV2LAorCQkJCQlzdHJ1Y3Qgc2J1c19kZXYgKmVzcGRtYSwKKwkJCQkJc3RydWN0IHNidXNfYnVzICpzYnVzLAorCQkJCQlpbnQgaG1lKQoreworCXN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgKnRwbnQgPSAmc2NzaV9lc3BfdGVtcGxhdGU7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdDsKKwlzdHJ1Y3QgZXNwICplc3A7CisJaW50IGVycjsKKworCWhvc3QgPSBzY3NpX2hvc3RfYWxsb2ModHBudCwgc2l6ZW9mKHN0cnVjdCBlc3ApKTsKKworCWVyciA9IC1FTk9NRU07CisJaWYgKCFob3N0KQorCQlnb3RvIGZhaWw7CisKKwlob3N0LT5tYXhfaWQgPSAoaG1lID8gMTYgOiA4KTsKKwllc3AgPSBob3N0X3RvX2VzcChob3N0KTsKKworCWVzcC0+aG9zdCA9IGhvc3Q7CisJZXNwLT5kZXYgPSBlc3BfZGV2OworCWVzcC0+b3BzID0gJnNidXNfZXNwX29wczsKKworCWlmIChobWUpCisJCWVzcC0+ZmxhZ3MgfD0gRVNQX0ZMQUdfV0lERV9DQVBBQkxFOworCisJZXJyID0gZXNwX3NidXNfZmluZF9kbWEoZXNwLCBlc3BkbWEpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGZhaWxfdW5saW5rOworCisJZXJyID0gZXNwX3NidXNfbWFwX3JlZ3MoZXNwLCBobWUpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGZhaWxfdW5saW5rOworCisJZXJyID0gZXNwX3NidXNfbWFwX2NvbW1hbmRfYmxvY2soZXNwKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBmYWlsX3VubWFwX3JlZ3M7CisKKwllcnIgPSBlc3Bfc2J1c19yZWdpc3Rlcl9pcnEoZXNwKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBmYWlsX3VubWFwX2NvbW1hbmRfYmxvY2s7CisKKwllc3Bfc2J1c19nZXRfcHJvcHMoZXNwLCBlc3BkbWEpOworCisJLyogQmVmb3JlIHdlIHRyeSB0byB0b3VjaCB0aGUgRVNQIGNoaXAsIEVTQzEgZG1hIGNhbgorCSAqIGNvbWUgdXAgd2l0aCB0aGUgcmVzZXQgYml0IHNldCwgc28gbWFrZSBzdXJlIHRoYXQKKwkgKiBpcyBjbGVhciBmaXJzdC4KKwkgKi8KKwlpZiAoZXNwLT5kbWEtPnJldmlzaW9uID09IGR2bWFlc2MxKSB7CisJCXUzMiB2YWwgPSBkbWFfcmVhZDMyKERNQV9DU1IpOworCisJCWRtYV93cml0ZTMyKHZhbCAmIH5ETUFfUlNUX1NDU0ksIERNQV9DU1IpOworCX0KKworCWRldl9zZXRfZHJ2ZGF0YSgmZXNwX2Rldi0+b2ZkZXYuZGV2LCBlc3ApOworCisJZXJyID0gc2NzaV9lc3BfcmVnaXN0ZXIoZXNwLCBkZXYpOworCWlmIChlcnIpCisJCWdvdG8gZmFpbF9mcmVlX2lycTsKKworCXJldHVybiAwOworCitmYWlsX2ZyZWVfaXJxOgorCWZyZWVfaXJxKGhvc3QtPmlycSwgZXNwKTsKK2ZhaWxfdW5tYXBfY29tbWFuZF9ibG9jazoKKwlzYnVzX2ZyZWVfY29uc2lzdGVudChlc3AtPmRldiwgMTYsCisJCQkgICAgIGVzcC0+Y29tbWFuZF9ibG9jaywKKwkJCSAgICAgZXNwLT5jb21tYW5kX2Jsb2NrX2RtYSk7CitmYWlsX3VubWFwX3JlZ3M6CisJc2J1c19pb3VubWFwKGVzcC0+cmVncywgU0JVU19FU1BfUkVHX1NJWkUpOworZmFpbF91bmxpbms6CisJc2NzaV9ob3N0X3B1dChob3N0KTsKK2ZhaWw6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgZXNwX3NidXNfcHJvYmUoc3RydWN0IG9mX2RldmljZSAqZGV2LCBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKK3sKKwlzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYgPSB0b19zYnVzX2RldmljZSgmZGV2LT5kZXYpOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAgPSBkZXYtPm5vZGU7CisJc3RydWN0IHNidXNfZGV2ICpkbWFfc2RldiA9IE5VTEw7CisJaW50IGhtZSA9IDA7CisKKwlpZiAoZHAtPnBhcmVudCAmJgorCSAgICAoIXN0cmNtcChkcC0+cGFyZW50LT5uYW1lLCAiZXNwZG1hIikgfHwKKwkgICAgICFzdHJjbXAoZHAtPnBhcmVudC0+bmFtZSwgImRtYSIpKSkKKwkJZG1hX3NkZXYgPSBzZGV2LT5wYXJlbnQ7CisJZWxzZSBpZiAoIXN0cmNtcChkcC0+bmFtZSwgIlNVTlcsZmFzIikpIHsKKwkJZG1hX3NkZXYgPSBzZGV2OworCQlobWUgPSAxOworCX0KKworCXJldHVybiBlc3Bfc2J1c19wcm9iZV9vbmUoJmRldi0+ZGV2LCBzZGV2LCBkbWFfc2RldiwKKwkJCQkgIHNkZXYtPmJ1cywgaG1lKTsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgZXNwX3NidXNfcmVtb3ZlKHN0cnVjdCBvZl9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZXNwICplc3AgPSBkZXZfZ2V0X2RydmRhdGEoJmRldi0+ZGV2KTsKKwl1bnNpZ25lZCBpbnQgaXJxID0gZXNwLT5ob3N0LT5pcnE7CisJdTMyIHZhbDsKKworCXNjc2lfZXNwX3VucmVnaXN0ZXIoZXNwKTsKKworCS8qIERpc2FibGUgaW50ZXJydXB0cy4gICovCisJdmFsID0gZG1hX3JlYWQzMihETUFfQ1NSKTsKKwlkbWFfd3JpdGUzMih2YWwgJiB+RE1BX0lOVF9FTkFCLCBETUFfQ1NSKTsKKworCWZyZWVfaXJxKGlycSwgZXNwKTsKKwlzYnVzX2ZyZWVfY29uc2lzdGVudChlc3AtPmRldiwgMTYsCisJCQkgICAgIGVzcC0+Y29tbWFuZF9ibG9jaywKKwkJCSAgICAgZXNwLT5jb21tYW5kX2Jsb2NrX2RtYSk7CisJc2J1c19pb3VubWFwKGVzcC0+cmVncywgU0JVU19FU1BfUkVHX1NJWkUpOworCisJc2NzaV9ob3N0X3B1dChlc3AtPmhvc3QpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGVzcF9tYXRjaFtdID0geworCXsKKwkJLm5hbWUgPSAiU1VOVyxlc3AiLAorCX0sCisJeworCQkubmFtZSA9ICJTVU5XLGZhcyIsCisJfSwKKwl7CisJCS5uYW1lID0gImVzcCIsCisJfSwKKwl7fSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBlc3BfbWF0Y2gpOworCitzdGF0aWMgc3RydWN0IG9mX3BsYXRmb3JtX2RyaXZlciBlc3Bfc2J1c19kcml2ZXIgPSB7CisJLm5hbWUJCT0gImVzcCIsCisJLm1hdGNoX3RhYmxlCT0gZXNwX21hdGNoLAorCS5wcm9iZQkJPSBlc3Bfc2J1c19wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGVzcF9zYnVzX3JlbW92ZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzdW5lc3BfaW5pdCh2b2lkKQoreworCXJldHVybiBvZl9yZWdpc3Rlcl9kcml2ZXIoJmVzcF9zYnVzX2RyaXZlciwgJnNidXNfYnVzX3R5cGUpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc3VuZXNwX2V4aXQodm9pZCkKK3sKKwlvZl91bnJlZ2lzdGVyX2RyaXZlcigmZXNwX3NidXNfZHJpdmVyKTsKK30KKworTU9EVUxFX0RFU0NSSVBUSU9OKCJTdW4gRVNQIFNDU0kgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQGRhdmVtbG9mdC5uZXQpIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihEUlZfVkVSU0lPTik7CisKK21vZHVsZV9pbml0KHN1bmVzcF9pbml0KTsKK21vZHVsZV9leGl0KHN1bmVzcF9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3BtYWNfemlsb2cuYyBiL2RyaXZlcnMvc2VyaWFsL3BtYWNfemlsb2cuYwppbmRleCA3NTJlZjA3Li5iZThkNzU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9wbWFjX3ppbG9nLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvcG1hY196aWxvZy5jCkBAIC0xNDY3LDcgKzE0NjcsOCBAQAogCWlmIChaU19JU19JUkRBKHVhcCkpCiAJCXVhcC0+cG9ydF90eXBlID0gUE1BQ19TQ0NfSVJEQTsKIAlpZiAoWlNfSVNfSU5UTU9ERU0odWFwKSkgewotCQlzdHJ1Y3QgZGV2aWNlX25vZGUqIGkyY19tb2RlbSA9IGZpbmRfZGV2aWNlcygiaTJjLW1vZGVtIik7CisJCXN0cnVjdCBkZXZpY2Vfbm9kZSogaTJjX21vZGVtID0KKwkJCW9mX2ZpbmRfbm9kZV9ieV9uYW1lKE5VTEwsICJpMmMtbW9kZW0iKTsKIAkJaWYgKGkyY19tb2RlbSkgewogCQkJY29uc3QgY2hhciogbWlkID0KIAkJCQlnZXRfcHJvcGVydHkoaTJjX21vZGVtLCAibW9kZW0taWQiLCBOVUxMKTsKQEAgLTE0ODIsNiArMTQ4Myw3IEBACiAJCQl9CiAJCQlwcmludGsoS0VSTl9JTkZPICJwbWFjX3ppbG9nOiBpMmMtbW9kZW0gZGV0ZWN0ZWQsIGlkOiAlZFxuIiwKIAkJCQltaWQgPyAoKm1pZCkgOiAwKTsKKwkJCW9mX25vZGVfcHV0KGkyY19tb2RlbSk7CiAJCX0gZWxzZSB7CiAJCQlwcmludGsoS0VSTl9JTkZPICJwbWFjX3ppbG9nOiBzZXJpYWwgbW9kZW0gZGV0ZWN0ZWRcbiIpOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9zdW5zdS5jIGIvZHJpdmVycy9zZXJpYWwvc3Vuc3UuYwppbmRleCA5NmE4NTJhLi5iZmQ0NDE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9zdW5zdS5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL3N1bnN1LmMKQEAgLTEzODcsOCArMTM4Nyw4IEBACiAJc3RydWN0IGRldmljZV9ub2RlICphcCA9IG9mX2ZpbmRfbm9kZV9ieV9wYXRoKCIvYWxpYXNlcyIpOwogCiAJaWYgKGFwKSB7Ci0JCWNoYXIgKmtleWIgPSBvZl9nZXRfcHJvcGVydHkoYXAsICJrZXlib2FyZCIsIE5VTEwpOwotCQljaGFyICptcyA9IG9mX2dldF9wcm9wZXJ0eShhcCwgIm1vdXNlIiwgTlVMTCk7CisJCWNvbnN0IGNoYXIgKmtleWIgPSBvZl9nZXRfcHJvcGVydHkoYXAsICJrZXlib2FyZCIsIE5VTEwpOworCQljb25zdCBjaGFyICptcyA9IG9mX2dldF9wcm9wZXJ0eShhcCwgIm1vdXNlIiwgTlVMTCk7CiAKIAkJaWYgKGtleWIpIHsKIAkJCWlmIChkcCA9PSBvZl9maW5kX25vZGVfYnlfcGF0aChrZXliKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL01ha2VmaWxlIGIvZHJpdmVycy91c2IvTWFrZWZpbGUKaW5kZXggOGI3ZmY0Ni4uZjVkZTU4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvTWFrZWZpbGUKKysrIGIvZHJpdmVycy91c2IvTWFrZWZpbGUKQEAgLTE1LDcgKzE1LDYgQEAKIG9iai0kKENPTkZJR19VU0JfVUhDSV9IQ0QpCSs9IGhvc3QvCiBvYmotJChDT05GSUdfVVNCX1NMODExX0hDRCkJKz0gaG9zdC8KIG9iai0kKENPTkZJR19VU0JfVTEzMl9IQ0QpCSs9IGhvc3QvCi1vYmotJChDT05GSUdfRVRSQVhfVVNCX0hPU1QpCSs9IGhvc3QvCiBvYmotJChDT05GSUdfVVNCX09IQ0lfQVQ5MSkJKz0gaG9zdC8KIAogb2JqLSQoQ09ORklHX1VTQl9BQ00pCQkrPSBjbGFzcy8KQEAgLTI3LDEwICsyNiw3IEBACiBvYmotJChDT05GSUdfVVNCX0FDRUNBRCkJKz0gaW5wdXQvCiBvYmotJChDT05GSUdfVVNCX0FJUFRFSykJKz0gaW5wdXQvCiBvYmotJChDT05GSUdfVVNCX0FUSV9SRU1PVEUpCSs9IGlucHV0Lwotb2JqLSQoQ09ORklHX1VTQl9ISUQpCQkrPSBpbnB1dC8KLW9iai0kKENPTkZJR19VU0JfS0JEKQkJKz0gaW5wdXQvCiBvYmotJChDT05GSUdfVVNCX0tCVEFCKQkJKz0gaW5wdXQvCi1vYmotJChDT05GSUdfVVNCX01PVVNFKQkJKz0gaW5wdXQvCiBvYmotJChDT05GSUdfVVNCX01UT1VDSCkJKz0gaW5wdXQvCiBvYmotJChDT05GSUdfVVNCX1BPV0VSTUFURSkJKz0gaW5wdXQvCiBvYmotJChDT05GSUdfVVNCX1dBQ09NKQkJKz0gaW5wdXQvCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9hdG0vY3hhY3J1LmMgYi9kcml2ZXJzL3VzYi9hdG0vY3hhY3J1LmMKaW5kZXggM2RmYTNlNC4uMzBiN2JmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvYXRtL2N4YWNydS5jCisrKyBiL2RyaXZlcnMvdXNiL2F0bS9jeGFjcnUuYwpAQCAtNCw2ICs0LDcgQEAKICAqCiAgKiAgQ29weXJpZ2h0IChDKSAyMDA0IERhdmlkIFdvb2Rob3VzZSwgRHVuY2FuIFNhbmRzLCBSb21hbiBLYWdhbgogICogIENvcHlyaWdodCAoQykgMjAwNSBEdW5jYW4gU2FuZHMsIFJvbWFuIEthZ2FuIChya2FnYW4gJSBtYWlsICEgcnUpCisgKiAgQ29weXJpZ2h0IChDKSAyMDA3IFNpbW9uIEFybG90dAogICoKICAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogICogIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCkBAIC0zNCwxNCArMzUsMTQgQEAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CS8qIEZJWE1FOiBsaW51eC9maXJtd2FyZS5oIHNob3VsZCBpbmNsdWRlIGl0IGl0c2VsZiAqLworI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KIAogI2luY2x1ZGUgInVzYmF0bS5oIgogCi0jZGVmaW5lIERSSVZFUl9BVVRIT1IJIlJvbWFuIEthZ2FuLCBEYXZpZCBXb29kaG91c2UsIER1bmNhbiBTYW5kcyIKLSNkZWZpbmUgRFJJVkVSX1ZFUlNJT04JIjAuMiIKKyNkZWZpbmUgRFJJVkVSX0FVVEhPUgkiUm9tYW4gS2FnYW4sIERhdmlkIFdvb2Rob3VzZSwgRHVuY2FuIFNhbmRzLCBTaW1vbiBBcmxvdHQiCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OCSIwLjMiCiAjZGVmaW5lIERSSVZFUl9ERVNDCSJDb25leGFudCBBY2Nlc3NSdW5uZXIgQURTTCBVU0IgbW9kZW0gZHJpdmVyIgogCiBzdGF0aWMgY29uc3QgY2hhciBjeGFjcnVfZHJpdmVyX25hbWVbXSA9ICJjeGFjcnUiOwpAQCAtNjQsNyArNjUsNyBAQAogI2RlZmluZSBTRFJBTV9FTkEJMHgxCiAKICNkZWZpbmUgQ01EX1RJTUVPVVQJMjAwMAkvKiBtc2VjcyAqLwotI2RlZmluZSBQT0xMX0lOVEVSVkFMCTUwMDAJLyogbXNlY3MgKi8KKyNkZWZpbmUgUE9MTF9JTlRFUlZBTAkxCS8qIHNlY3MgKi8KIAogLyogY29tbWFuZHMgZm9yIGludGVyYWN0aW9uIHdpdGggdGhlIG1vZGVtIHRocm91Z2ggdGhlIGNvbnRyb2wgY2hhbm5lbCBiZWZvcmUKICAqIGZpcm13YXJlIGlzIGxvYWRlZCAgKi8KQEAgLTE0Niw2ICsxNDcsMTMgQEAKIAlDWElORl9NQVggPSAweDFjLAogfTsKIAorZW51bSBjeGFjcnVfcG9sbF9zdGF0ZSB7CisJQ1hQT0xMX1NUT1BQSU5HLAorCUNYUE9MTF9TVE9QUEVELAorCUNYUE9MTF9QT0xMSU5HLAorCUNYUE9MTF9TSFVURE9XTgorfTsKKwogc3RydWN0IGN4YWNydV9tb2RlbV90eXBlIHsKIAl1MzIgcGxsX2ZfY2xrOwogCXUzMiBwbGxfYl9jbGs7CkBAIC0xNTgsNyArMTY2LDEyIEBACiAJY29uc3Qgc3RydWN0IGN4YWNydV9tb2RlbV90eXBlICptb2RlbV90eXBlOwogCiAJaW50IGxpbmVfc3RhdHVzOworCXN0cnVjdCBtdXRleCBhZHNsX3N0YXRlX3NlcmlhbGl6ZTsKKwlpbnQgYWRzbF9zdGF0dXM7CiAJc3RydWN0IGRlbGF5ZWRfd29yayBwb2xsX3dvcms7CisJdTMyIGNhcmRfaW5mb1tDWElORl9NQVhdOworCXN0cnVjdCBtdXRleCBwb2xsX3N0YXRlX3NlcmlhbGl6ZTsKKwlpbnQgcG9sbF9zdGF0ZTsKIAogCS8qIGNvbnRvbCBoYW5kbGVzICovCiAJc3RydWN0IG11dGV4IGNtX3NlcmlhbGl6ZTsKQEAgLTE3MCw2ICsxODMsMjc1IEBACiAJc3RydWN0IGNvbXBsZXRpb24gc25kX2RvbmU7CiB9OwogCitzdGF0aWMgaW50IGN4YWNydV9jbShzdHJ1Y3QgY3hhY3J1X2RhdGEgKmluc3RhbmNlLCBlbnVtIGN4YWNydV9jbV9yZXF1ZXN0IGNtLAorCXU4ICp3ZGF0YSwgaW50IHdzaXplLCB1OCAqcmRhdGEsIGludCByc2l6ZSk7CitzdGF0aWMgdm9pZCBjeGFjcnVfcG9sbF9zdGF0dXMoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKKworLyogQ2FyZCBpbmZvIGV4cG9ydGVkIHRocm91Z2ggc3lzZnMgKi8KKyNkZWZpbmUgQ1hBQ1JVX19BVFRSX0lOSVQoX25hbWUpIFwKK3N0YXRpYyBERVZJQ0VfQVRUUihfbmFtZSwgU19JUlVHTywgY3hhY3J1X3N5c2ZzX3Nob3dfIyNfbmFtZSwgTlVMTCkKKworI2RlZmluZSBDWEFDUlVfQ01EX0lOSVQoX25hbWUpIFwKK3N0YXRpYyBERVZJQ0VfQVRUUihfbmFtZSwgU19JV1VTUiB8IFNfSVJVR08sIFwKKwljeGFjcnVfc3lzZnNfc2hvd18jI19uYW1lLCBjeGFjcnVfc3lzZnNfc3RvcmVfIyNfbmFtZSkKKworI2RlZmluZSBDWEFDUlVfQVRUUl9JTklUKF92YWx1ZSwgX3R5cGUsIF9uYW1lKSBcCitzdGF0aWMgc3NpemVfdCBjeGFjcnVfc3lzZnNfc2hvd18jI19uYW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgXAorCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpIFwKK3sgXAorCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmID0gdG9fdXNiX2ludGVyZmFjZShkZXYpOyBcCisJc3RydWN0IHVzYmF0bV9kYXRhICp1c2JhdG1faW5zdGFuY2UgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOyBcCisJc3RydWN0IGN4YWNydV9kYXRhICppbnN0YW5jZSA9IHVzYmF0bV9pbnN0YW5jZS0+ZHJpdmVyX2RhdGE7IFwKKwlyZXR1cm4gY3hhY3J1X3N5c2ZzX3Nob3dhdHRyXyMjX3R5cGUoaW5zdGFuY2UtPmNhcmRfaW5mb1tfdmFsdWVdLCBidWYpOyBcCit9IFwKK0NYQUNSVV9fQVRUUl9JTklUKF9uYW1lKQorCisjZGVmaW5lIENYQUNSVV9BVFRSX0NSRUFURShfdiwgX3QsIF9uYW1lKSBDWEFDUlVfREVWSUNFX0NSRUFURV9GSUxFKF9uYW1lKQorI2RlZmluZSBDWEFDUlVfQ01EX0NSRUFURShfbmFtZSkgICAgICAgICAgQ1hBQ1JVX0RFVklDRV9DUkVBVEVfRklMRShfbmFtZSkKKyNkZWZpbmUgQ1hBQ1JVX19BVFRSX0NSRUFURShfbmFtZSkgICAgICAgIENYQUNSVV9ERVZJQ0VfQ1JFQVRFX0ZJTEUoX25hbWUpCisKKyNkZWZpbmUgQ1hBQ1JVX0FUVFJfUkVNT1ZFKF92LCBfdCwgX25hbWUpIENYQUNSVV9ERVZJQ0VfUkVNT1ZFX0ZJTEUoX25hbWUpCisjZGVmaW5lIENYQUNSVV9DTURfUkVNT1ZFKF9uYW1lKSAgICAgICAgICBDWEFDUlVfREVWSUNFX1JFTU9WRV9GSUxFKF9uYW1lKQorI2RlZmluZSBDWEFDUlVfX0FUVFJfUkVNT1ZFKF9uYW1lKSAgICAgICAgQ1hBQ1JVX0RFVklDRV9SRU1PVkVfRklMRShfbmFtZSkKKworc3RhdGljIHNzaXplX3QgY3hhY3J1X3N5c2ZzX3Nob3dhdHRyX3UzMih1MzIgdmFsdWUsIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIldVxuIiwgdmFsdWUpOworfQorCitzdGF0aWMgc3NpemVfdCBjeGFjcnVfc3lzZnNfc2hvd2F0dHJfczgoczggdmFsdWUsIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgdmFsdWUpOworfQorCitzdGF0aWMgc3NpemVfdCBjeGFjcnVfc3lzZnNfc2hvd2F0dHJfZEIoczE2IHZhbHVlLCBjaGFyICpidWYpCit7CisJaWYgKHVubGlrZWx5KHZhbHVlIDwgMCkpIHsKKwkJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWQuJTAydVxuIiwKKwkJCQkJCXZhbHVlIC8gMTAwLCAtdmFsdWUgJSAxMDApOworCX0gZWxzZSB7CisJCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkLiUwMnVcbiIsCisJCQkJCQl2YWx1ZSAvIDEwMCwgdmFsdWUgJSAxMDApOworCX0KK30KKworc3RhdGljIHNzaXplX3QgY3hhY3J1X3N5c2ZzX3Nob3dhdHRyX2Jvb2wodTMyIHZhbHVlLCBjaGFyICpidWYpCit7CisJc3dpdGNoICh2YWx1ZSkgeworCWNhc2UgMDogcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAibm9cbiIpOworCWNhc2UgMTogcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAieWVzXG4iKTsKKwlkZWZhdWx0OiByZXR1cm4gMDsKKwl9Cit9CisKK3N0YXRpYyBzc2l6ZV90IGN4YWNydV9zeXNmc19zaG93YXR0cl9MSU5LKHUzMiB2YWx1ZSwgY2hhciAqYnVmKQoreworCXN3aXRjaCAodmFsdWUpIHsKKwljYXNlIDE6IHJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIm5vdCBjb25uZWN0ZWRcbiIpOworCWNhc2UgMjogcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiY29ubmVjdGVkXG4iKTsKKwljYXNlIDM6IHJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgImxvc3RcbiIpOworCWRlZmF1bHQ6IHJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgInVua25vd24gKCV1KVxuIiwgdmFsdWUpOworCX0KK30KKworc3RhdGljIHNzaXplX3QgY3hhY3J1X3N5c2ZzX3Nob3dhdHRyX0xJTkUodTMyIHZhbHVlLCBjaGFyICpidWYpCit7CisJc3dpdGNoICh2YWx1ZSkgeworCWNhc2UgMDogcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiZG93blxuIik7CisJY2FzZSAxOiByZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICJhdHRlbXB0aW5nIHRvIGFjdGl2YXRlXG4iKTsKKwljYXNlIDI6IHJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgInRyYWluaW5nXG4iKTsKKwljYXNlIDM6IHJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgImNoYW5uZWwgYW5hbHlzaXNcbiIpOworCWNhc2UgNDogcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiZXhjaGFuZ2VcbiIpOworCWNhc2UgNTogcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAidXBcbiIpOworCWNhc2UgNjogcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAid2FpdGluZ1xuIik7CisJY2FzZSA3OiByZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICJpbml0aWFsaXNpbmdcbiIpOworCWRlZmF1bHQ6IHJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgInVua25vd24gKCV1KVxuIiwgdmFsdWUpOworCX0KK30KKworc3RhdGljIHNzaXplX3QgY3hhY3J1X3N5c2ZzX3Nob3dhdHRyX01PRFUodTMyIHZhbHVlLCBjaGFyICpidWYpCit7CisJc3dpdGNoICh2YWx1ZSkgeworCWNhc2UgMDogcmV0dXJuIDA7CisJY2FzZSAxOiByZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICJBTlNJIFQxLjQxM1xuIik7CisJY2FzZSAyOiByZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICJJVFUtVCBHLjk5Mi4xIChHLkRNVClcbiIpOworCWNhc2UgMzogcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiSVRVLVQgRy45OTIuMiAoRy5MSVRFKVxuIik7CisJZGVmYXVsdDogcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAidW5rbm93biAoJXUpXG4iLCB2YWx1ZSk7CisJfQorfQorCisvKgorICogVGhpcyBjb3VsZCB1c2UgTUFDX0FERFJFU1NfSElHSCBhbmQgTUFDX0FERFJFU1NfTE9XLCBidXQgc2luY2UKKyAqIHRoaXMgZGF0YSBpcyBhbHJlYWR5IGluIGF0bV9kZXYgdGhlcmUncyBubyBwb2ludC4KKyAqCisgKiBNQUNfQUREUkVTU19ISUdIID0gMHg/Pz8/NTU0NAorICogTUFDX0FERFJFU1NfTE9XICA9IDB4MzMyMjExMDAKKyAqIFdoZXJlIDAwLTU1IGFyZSBieXRlcyAwLTUgb2YgdGhlIE1BQy4KKyAqLworc3RhdGljIHNzaXplX3QgY3hhY3J1X3N5c2ZzX3Nob3dfbWFjX2FkZHJlc3Moc3RydWN0IGRldmljZSAqZGV2LAorCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYgPSB0b191c2JfaW50ZXJmYWNlKGRldik7CisJc3RydWN0IHVzYmF0bV9kYXRhICp1c2JhdG1faW5zdGFuY2UgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOworCXN0cnVjdCBhdG1fZGV2ICphdG1fZGV2ID0gdXNiYXRtX2luc3RhbmNlLT5hdG1fZGV2OworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCQlhdG1fZGV2LT5lc2lbMF0sIGF0bV9kZXYtPmVzaVsxXSwgYXRtX2Rldi0+ZXNpWzJdLAorCQkJYXRtX2Rldi0+ZXNpWzNdLCBhdG1fZGV2LT5lc2lbNF0sIGF0bV9kZXYtPmVzaVs1XSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGN4YWNydV9zeXNmc19zaG93X2Fkc2xfc3RhdGUoc3RydWN0IGRldmljZSAqZGV2LAorCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYgPSB0b191c2JfaW50ZXJmYWNlKGRldik7CisJc3RydWN0IHVzYmF0bV9kYXRhICp1c2JhdG1faW5zdGFuY2UgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOworCXN0cnVjdCBjeGFjcnVfZGF0YSAqaW5zdGFuY2UgPSB1c2JhdG1faW5zdGFuY2UtPmRyaXZlcl9kYXRhOworCXUzMiB2YWx1ZSA9IGluc3RhbmNlLT5jYXJkX2luZm9bQ1hJTkZfTElORV9TVEFSVEFCTEVdOworCisJc3dpdGNoICh2YWx1ZSkgeworCWNhc2UgMDogcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAicnVubmluZ1xuIik7CisJY2FzZSAxOiByZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICJzdG9wcGVkXG4iKTsKKwlkZWZhdWx0OiByZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICJ1bmtub3duICgldSlcbiIsIHZhbHVlKTsKKwl9Cit9CisKK3N0YXRpYyBzc2l6ZV90IGN4YWNydV9zeXNmc19zdG9yZV9hZHNsX3N0YXRlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYgPSB0b191c2JfaW50ZXJmYWNlKGRldik7CisJc3RydWN0IHVzYmF0bV9kYXRhICp1c2JhdG1faW5zdGFuY2UgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOworCXN0cnVjdCBjeGFjcnVfZGF0YSAqaW5zdGFuY2UgPSB1c2JhdG1faW5zdGFuY2UtPmRyaXZlcl9kYXRhOworCWludCByZXQ7CisJaW50IHBvbGwgPSAtMTsKKwljaGFyIHN0cl9jbWRbOF07CisJaW50IGxlbiA9IHN0cmxlbihidWYpOworCisJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQlyZXR1cm4gLUVBQ0NFUzsKKworCXJldCA9IHNzY2FuZihidWYsICIlN3MiLCBzdHJfY21kKTsKKwlpZiAocmV0ICE9IDEpCisJCXJldHVybiAtRUlOVkFMOworCXJldCA9IDA7CisKKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZpbnN0YW5jZS0+YWRzbF9zdGF0ZV9zZXJpYWxpemUpKQorCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCisJaWYgKCFzdHJjbXAoc3RyX2NtZCwgInN0b3AiKSB8fCAhc3RyY21wKHN0cl9jbWQsICJyZXN0YXJ0IikpIHsKKwkJcmV0ID0gY3hhY3J1X2NtKGluc3RhbmNlLCBDTV9SRVFVRVNUX0NISVBfQURTTF9MSU5FX1NUT1AsIE5VTEwsIDAsIE5VTEwsIDApOworCQlpZiAocmV0IDwgMCkgeworCQkJYXRtX2Vycih1c2JhdG1faW5zdGFuY2UsICJjaGFuZ2UgYWRzbCBzdGF0ZToiCisJCQkJIiBDSElQX0FEU0xfTElORV9TVE9QIHJldHVybmVkICVkXG4iLCByZXQpOworCisJCQlyZXQgPSAtRUlPOworCQl9IGVsc2UgeworCQkJcmV0ID0gbGVuOworCQkJcG9sbCA9IENYUE9MTF9TVE9QUEVEOworCQl9CisJfQorCisJLyogTGluZSBzdGF0dXMgaXMgb25seSB1cGRhdGVkIGV2ZXJ5IHNlY29uZAorCSAqIGFuZCB0aGUgZGV2aWNlIGFwcGVhcnMgdG8gb25seSByZWFjdCB0bworCSAqIFNUQVJUL1NUT1AgZXZlcnkgc2Vjb25kIHRvby4gV2FpdCAxLjVzIHRvCisJICogYmUgc3VyZSB0aGF0IHJlc3RhcnQgd2lsbCBoYXZlIGFuIGVmZmVjdC4gKi8KKwlpZiAoIXN0cmNtcChzdHJfY21kLCAicmVzdGFydCIpKQorCQltc2xlZXAoMTUwMCk7CisKKwlpZiAoIXN0cmNtcChzdHJfY21kLCAic3RhcnQiKSB8fCAhc3RyY21wKHN0cl9jbWQsICJyZXN0YXJ0IikpIHsKKwkJcmV0ID0gY3hhY3J1X2NtKGluc3RhbmNlLCBDTV9SRVFVRVNUX0NISVBfQURTTF9MSU5FX1NUQVJULCBOVUxMLCAwLCBOVUxMLCAwKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWF0bV9lcnIodXNiYXRtX2luc3RhbmNlLCAiY2hhbmdlIGFkc2wgc3RhdGU6IgorCQkJCSIgQ0hJUF9BRFNMX0xJTkVfU1RBUlQgcmV0dXJuZWQgJWRcbiIsIHJldCk7CisKKwkJCXJldCA9IC1FSU87CisJCX0gZWxzZSB7CisJCQlyZXQgPSBsZW47CisJCQlwb2xsID0gQ1hQT0xMX1BPTExJTkc7CisJCX0KKwl9CisKKwlpZiAoIXN0cmNtcChzdHJfY21kLCAicG9sbCIpKSB7CisJCXJldCA9IGxlbjsKKwkJcG9sbCA9IENYUE9MTF9QT0xMSU5HOworCX0KKworCWlmIChyZXQgPT0gMCkgeworCQlyZXQgPSAtRUlOVkFMOworCQlwb2xsID0gLTE7CisJfQorCisJaWYgKHBvbGwgPT0gQ1hQT0xMX1BPTExJTkcpIHsKKwkJbXV0ZXhfbG9jaygmaW5zdGFuY2UtPnBvbGxfc3RhdGVfc2VyaWFsaXplKTsKKwkJc3dpdGNoIChpbnN0YW5jZS0+cG9sbF9zdGF0ZSkgeworCQljYXNlIENYUE9MTF9TVE9QUEVEOgorCQkJLyogc3RhcnQgcG9sbGluZyAqLworCQkJaW5zdGFuY2UtPnBvbGxfc3RhdGUgPSBDWFBPTExfUE9MTElORzsKKwkJCWJyZWFrOworCisJCWNhc2UgQ1hQT0xMX1NUT1BQSU5HOgorCQkJLyogYWJvcnQgc3RvcCByZXF1ZXN0ICovCisJCQlpbnN0YW5jZS0+cG9sbF9zdGF0ZSA9IENYUE9MTF9QT0xMSU5HOworCQljYXNlIENYUE9MTF9QT0xMSU5HOgorCQljYXNlIENYUE9MTF9TSFVURE9XTjoKKwkJCS8qIGRvbid0IHN0YXJ0IHBvbGxpbmcgKi8KKwkJCXBvbGwgPSAtMTsKKwkJfQorCQltdXRleF91bmxvY2soJmluc3RhbmNlLT5wb2xsX3N0YXRlX3NlcmlhbGl6ZSk7CisJfSBlbHNlIGlmIChwb2xsID09IENYUE9MTF9TVE9QUEVEKSB7CisJCW11dGV4X2xvY2soJmluc3RhbmNlLT5wb2xsX3N0YXRlX3NlcmlhbGl6ZSk7CisJCS8qIHJlcXVlc3Qgc3RvcCAqLworCQlpZiAoaW5zdGFuY2UtPnBvbGxfc3RhdGUgPT0gQ1hQT0xMX1BPTExJTkcpCisJCQlpbnN0YW5jZS0+cG9sbF9zdGF0ZSA9IENYUE9MTF9TVE9QUElORzsKKwkJbXV0ZXhfdW5sb2NrKCZpbnN0YW5jZS0+cG9sbF9zdGF0ZV9zZXJpYWxpemUpOworCX0KKworCW11dGV4X3VubG9jaygmaW5zdGFuY2UtPmFkc2xfc3RhdGVfc2VyaWFsaXplKTsKKworCWlmIChwb2xsID09IENYUE9MTF9QT0xMSU5HKQorCQljeGFjcnVfcG9sbF9zdGF0dXMoJmluc3RhbmNlLT5wb2xsX3dvcmsud29yayk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogQWxsIGRldmljZSBhdHRyaWJ1dGVzIGFyZSBpbmNsdWRlZCBpbiBDWEFDUlVfQUxMX0ZJTEVTCisgKiBzbyB0aGF0IHRoZSBzYW1lIGxpc3QgY2FuIGJlIHVzZWQgbXVsdGlwbGUgdGltZXM6CisgKiAgICAgSU5JVCAgIChkZWZpbmUgdGhlIGRldmljZSBhdHRyaWJ1dGVzKQorICogICAgIENSRUFURSAoY3JlYXRlIGFsbCB0aGUgZGV2aWNlIGZpbGVzKQorICogICAgIFJFTU9WRSAocmVtb3ZlIGFsbCB0aGUgZGV2aWNlIGZpbGVzKQorICoKKyAqIFdpdGggdGhlIGxhc3QgdHdvIGJlaW5nIGRlZmluZWQgYXMgbmVlZGVkIGluIHRoZSBmdW5jdGlvbnMKKyAqIHRoZXkgYXJlIHVzZWQgaW4gYmVmb3JlIGNhbGxpbmcgQ1hBQ1JVX0FMTF9GSUxFUygpCisgKi8KKyNkZWZpbmUgQ1hBQ1JVX0FMTF9GSUxFUyhfYWN0aW9uKSBcCitDWEFDUlVfQVRUUl8jI19hY3Rpb24oQ1hJTkZfRE9XTlNUUkVBTV9SQVRFLCAgICAgICAgICAgdTMyLCAgZG93bnN0cmVhbV9yYXRlKTsgXAorQ1hBQ1JVX0FUVFJfIyNfYWN0aW9uKENYSU5GX1VQU1RSRUFNX1JBVEUsICAgICAgICAgICAgIHUzMiwgIHVwc3RyZWFtX3JhdGUpOyBcCitDWEFDUlVfQVRUUl8jI19hY3Rpb24oQ1hJTkZfTElOS19TVEFUVVMsICAgICAgICAgICAgICAgTElOSywgbGlua19zdGF0dXMpOyBcCitDWEFDUlVfQVRUUl8jI19hY3Rpb24oQ1hJTkZfTElORV9TVEFUVVMsICAgICAgICAgICAgICAgTElORSwgbGluZV9zdGF0dXMpOyBcCitDWEFDUlVfX0FUVFJfIyNfYWN0aW9uKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjX2FkZHJlc3MpOyBcCitDWEFDUlVfQVRUUl8jI19hY3Rpb24oQ1hJTkZfVVBTVFJFQU1fU05SX01BUkdJTiwgICAgICAgZEIsICAgdXBzdHJlYW1fc25yX21hcmdpbik7IFwKK0NYQUNSVV9BVFRSXyMjX2FjdGlvbihDWElORl9ET1dOU1RSRUFNX1NOUl9NQVJHSU4sICAgICBkQiwgICBkb3duc3RyZWFtX3Nucl9tYXJnaW4pOyBcCitDWEFDUlVfQVRUUl8jI19hY3Rpb24oQ1hJTkZfVVBTVFJFQU1fQVRURU5VQVRJT04sICAgICAgZEIsICAgdXBzdHJlYW1fYXR0ZW51YXRpb24pOyBcCitDWEFDUlVfQVRUUl8jI19hY3Rpb24oQ1hJTkZfRE9XTlNUUkVBTV9BVFRFTlVBVElPTiwgICAgZEIsICAgZG93bnN0cmVhbV9hdHRlbnVhdGlvbik7IFwKK0NYQUNSVV9BVFRSXyMjX2FjdGlvbihDWElORl9UUkFOU01JVFRFUl9QT1dFUiwgICAgICAgICBzOCwgICB0cmFuc21pdHRlcl9wb3dlcik7IFwKK0NYQUNSVV9BVFRSXyMjX2FjdGlvbihDWElORl9VUFNUUkVBTV9CSVRTX1BFUl9GUkFNRSwgICB1MzIsICB1cHN0cmVhbV9iaXRzX3Blcl9mcmFtZSk7IFwKK0NYQUNSVV9BVFRSXyMjX2FjdGlvbihDWElORl9ET1dOU1RSRUFNX0JJVFNfUEVSX0ZSQU1FLCB1MzIsICBkb3duc3RyZWFtX2JpdHNfcGVyX2ZyYW1lKTsgXAorQ1hBQ1JVX0FUVFJfIyNfYWN0aW9uKENYSU5GX1NUQVJUVVBfQVRURU1QVFMsICAgICAgICAgIHUzMiwgIHN0YXJ0dXBfYXR0ZW1wdHMpOyBcCitDWEFDUlVfQVRUUl8jI19hY3Rpb24oQ1hJTkZfVVBTVFJFQU1fQ1JDX0VSUk9SUywgICAgICAgdTMyLCAgdXBzdHJlYW1fY3JjX2Vycm9ycyk7IFwKK0NYQUNSVV9BVFRSXyMjX2FjdGlvbihDWElORl9ET1dOU1RSRUFNX0NSQ19FUlJPUlMsICAgICB1MzIsICBkb3duc3RyZWFtX2NyY19lcnJvcnMpOyBcCitDWEFDUlVfQVRUUl8jI19hY3Rpb24oQ1hJTkZfVVBTVFJFQU1fRkVDX0VSUk9SUywgICAgICAgdTMyLCAgdXBzdHJlYW1fZmVjX2Vycm9ycyk7IFwKK0NYQUNSVV9BVFRSXyMjX2FjdGlvbihDWElORl9ET1dOU1RSRUFNX0ZFQ19FUlJPUlMsICAgICB1MzIsICBkb3duc3RyZWFtX2ZlY19lcnJvcnMpOyBcCitDWEFDUlVfQVRUUl8jI19hY3Rpb24oQ1hJTkZfVVBTVFJFQU1fSEVDX0VSUk9SUywgICAgICAgdTMyLCAgdXBzdHJlYW1faGVjX2Vycm9ycyk7IFwKK0NYQUNSVV9BVFRSXyMjX2FjdGlvbihDWElORl9ET1dOU1RSRUFNX0hFQ19FUlJPUlMsICAgICB1MzIsICBkb3duc3RyZWFtX2hlY19lcnJvcnMpOyBcCitDWEFDUlVfQVRUUl8jI19hY3Rpb24oQ1hJTkZfTElORV9TVEFSVEFCTEUsICAgICAgICAgICAgYm9vbCwgbGluZV9zdGFydGFibGUpOyBcCitDWEFDUlVfQVRUUl8jI19hY3Rpb24oQ1hJTkZfTU9EVUxBVElPTiwgICAgICAgICAgICAgICAgTU9EVSwgbW9kdWxhdGlvbik7IFwKK0NYQUNSVV9BVFRSXyMjX2FjdGlvbihDWElORl9BRFNMX0hFQURFTkQsICAgICAgICAgICAgICB1MzIsICBhZHNsX2hlYWRlbmQpOyBcCitDWEFDUlVfQVRUUl8jI19hY3Rpb24oQ1hJTkZfQURTTF9IRUFERU5EX0VOVklST05NRU5ULCAgdTMyLCAgYWRzbF9oZWFkZW5kX2Vudmlyb25tZW50KTsgXAorQ1hBQ1JVX0FUVFJfIyNfYWN0aW9uKENYSU5GX0NPTlRST0xMRVJfVkVSU0lPTiwgICAgICAgIHUzMiwgIGFkc2xfY29udHJvbGxlcl92ZXJzaW9uKTsgXAorQ1hBQ1JVX0NNRF8jI19hY3Rpb24oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkc2xfc3RhdGUpOworCitDWEFDUlVfQUxMX0ZJTEVTKElOSVQpOworCiAvKiB0aGUgZm9sbG93aW5nIHRocmVlIGZ1bmN0aW9ucyBhcmUgc3RvbGVuIGZyb20gZHJpdmVycy91c2IvY29yZS9tZXNzYWdlLmMgKi8KIHN0YXRpYyB2b2lkIGN4YWNydV9ibG9ja2luZ19jb21wbGV0aW9uKHN0cnVjdCB1cmIgKnVyYikKIHsKQEAgLTM0Nyw4ICs2MjksNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBjeGFjcnVfcG9sbF9zdGF0dXMoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKLQogc3RhdGljIGludCBjeGFjcnVfYXRtX3N0YXJ0KHN0cnVjdCB1c2JhdG1fZGF0YSAqdXNiYXRtX2luc3RhbmNlLAogCQlzdHJ1Y3QgYXRtX2RldiAqYXRtX2RldikKIHsKQEAgLTM1Nyw2ICs2MzcsNyBAQAogCXN0cnVjdCBhdG1fZGV2ICphdG1fZGV2ID0gdXNiYXRtX2luc3RhbmNlLT5hdG1fZGV2OwogCSovCiAJaW50IHJldDsKKwlpbnQgc3RhcnRfcG9sbGluZyA9IDE7CiAKIAlkYmcoImN4YWNydV9hdG1fc3RhcnQiKTsKIApAQCAtMzY5LDE0ICs2NTAsMzUgQEAKIAl9CiAKIAkvKiBzdGFydCBBRFNMICovCisJbXV0ZXhfbG9jaygmaW5zdGFuY2UtPmFkc2xfc3RhdGVfc2VyaWFsaXplKTsKIAlyZXQgPSBjeGFjcnVfY20oaW5zdGFuY2UsIENNX1JFUVVFU1RfQ0hJUF9BRFNMX0xJTkVfU1RBUlQsIE5VTEwsIDAsIE5VTEwsIDApOwogCWlmIChyZXQgPCAwKSB7CiAJCWF0bV9lcnIodXNiYXRtX2luc3RhbmNlLCAiY3hhY3J1X2F0bV9zdGFydDogQ0hJUF9BRFNMX0xJTkVfU1RBUlQgcmV0dXJuZWQgJWRcbiIsIHJldCk7CisJCW11dGV4X3VubG9jaygmaW5zdGFuY2UtPmFkc2xfc3RhdGVfc2VyaWFsaXplKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKIAkvKiBTdGFydCBzdGF0dXMgcG9sbGluZyAqLwotCWN4YWNydV9wb2xsX3N0YXR1cygmaW5zdGFuY2UtPnBvbGxfd29yay53b3JrKTsKKwltdXRleF9sb2NrKCZpbnN0YW5jZS0+cG9sbF9zdGF0ZV9zZXJpYWxpemUpOworCXN3aXRjaCAoaW5zdGFuY2UtPnBvbGxfc3RhdGUpIHsKKwljYXNlIENYUE9MTF9TVE9QUEVEOgorCQkvKiBzdGFydCBwb2xsaW5nICovCisJCWluc3RhbmNlLT5wb2xsX3N0YXRlID0gQ1hQT0xMX1BPTExJTkc7CisJCWJyZWFrOworCisJY2FzZSBDWFBPTExfU1RPUFBJTkc6CisJCS8qIGFib3J0IHN0b3AgcmVxdWVzdCAqLworCQlpbnN0YW5jZS0+cG9sbF9zdGF0ZSA9IENYUE9MTF9QT0xMSU5HOworCWNhc2UgQ1hQT0xMX1BPTExJTkc6CisJY2FzZSBDWFBPTExfU0hVVERPV046CisJCS8qIGRvbid0IHN0YXJ0IHBvbGxpbmcgKi8KKwkJc3RhcnRfcG9sbGluZyA9IDA7CisJfQorCW11dGV4X3VubG9jaygmaW5zdGFuY2UtPnBvbGxfc3RhdGVfc2VyaWFsaXplKTsKKwltdXRleF91bmxvY2soJmluc3RhbmNlLT5hZHNsX3N0YXRlX3NlcmlhbGl6ZSk7CisKKwlpZiAoc3RhcnRfcG9sbGluZykKKwkJY3hhY3J1X3BvbGxfc3RhdHVzKCZpbnN0YW5jZS0+cG9sbF93b3JrLndvcmspOwogCXJldHVybiAwOwogfQogCkBAIC0zODcsMTQgKzY4OSw0NiBAQAogCXUzMiBidWZbQ1hJTkZfTUFYXSA9IHt9OwogCXN0cnVjdCB1c2JhdG1fZGF0YSAqdXNiYXRtID0gaW5zdGFuY2UtPnVzYmF0bTsKIAlzdHJ1Y3QgYXRtX2RldiAqYXRtX2RldiA9IHVzYmF0bS0+YXRtX2RldjsKKwlpbnQga2VlcF9wb2xsaW5nID0gMTsKIAlpbnQgcmV0OwogCiAJcmV0ID0gY3hhY3J1X2NtX2dldF9hcnJheShpbnN0YW5jZSwgQ01fUkVRVUVTVF9DQVJEX0lORk9fR0VULCBidWYsIENYSU5GX01BWCk7CiAJaWYgKHJldCA8IDApIHsKLQkJYXRtX3dhcm4odXNiYXRtLCAicG9sbCBzdGF0dXM6IGVycm9yICVkXG4iLCByZXQpOworCQlpZiAocmV0ICE9IC1FU0hVVERPV04pCisJCQlhdG1fd2Fybih1c2JhdG0sICJwb2xsIHN0YXR1czogZXJyb3IgJWRcbiIsIHJldCk7CisKKwkJbXV0ZXhfbG9jaygmaW5zdGFuY2UtPnBvbGxfc3RhdGVfc2VyaWFsaXplKTsKKwkJaWYgKGluc3RhbmNlLT5wb2xsX3N0YXRlICE9IENYUE9MTF9TSFVURE9XTikgeworCQkJaW5zdGFuY2UtPnBvbGxfc3RhdGUgPSBDWFBPTExfU1RPUFBFRDsKKworCQkJaWYgKHJldCAhPSAtRVNIVVRET1dOKQorCQkJCWF0bV93YXJuKHVzYmF0bSwgInBvbGxpbmcgZGlzYWJsZWQsIHNldCBhZHNsX3N0YXRlIgorCQkJCQkJIiB0byAnc3RhcnQnIG9yICdwb2xsJyB0byByZXN1bWVcbiIpOworCQl9CisJCW11dGV4X3VubG9jaygmaW5zdGFuY2UtPnBvbGxfc3RhdGVfc2VyaWFsaXplKTsKIAkJZ290byByZXNjaGVkdWxlOwogCX0KIAorCW1lbWNweShpbnN0YW5jZS0+Y2FyZF9pbmZvLCBidWYsIHNpemVvZihpbnN0YW5jZS0+Y2FyZF9pbmZvKSk7CisKKwlpZiAoaW5zdGFuY2UtPmFkc2xfc3RhdHVzICE9IGJ1ZltDWElORl9MSU5FX1NUQVJUQUJMRV0pIHsKKwkJaW5zdGFuY2UtPmFkc2xfc3RhdHVzID0gYnVmW0NYSU5GX0xJTkVfU1RBUlRBQkxFXTsKKworCQlzd2l0Y2ggKGluc3RhbmNlLT5hZHNsX3N0YXR1cykgeworCQljYXNlIDA6CisJCQlhdG1fcHJpbnRrKEtFUk5fSU5GTywgdXNiYXRtLCAiQURTTCBzdGF0ZTogcnVubmluZ1xuIik7CisJCQlicmVhazsKKworCQljYXNlIDE6CisJCQlhdG1fcHJpbnRrKEtFUk5fSU5GTywgdXNiYXRtLCAiQURTTCBzdGF0ZTogc3RvcHBlZFxuIik7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJYXRtX3ByaW50ayhLRVJOX0lORk8sIHVzYmF0bSwgIlVua25vd24gYWRzbCBzdGF0dXMgJTAyeFxuIiwgaW5zdGFuY2UtPmFkc2xfc3RhdHVzKTsKKwkJCWJyZWFrOworCQl9CisJfQorCiAJaWYgKGluc3RhbmNlLT5saW5lX3N0YXR1cyA9PSBidWZbQ1hJTkZfTElORV9TVEFUVVNdKQogCQlnb3RvIHJlc2NoZWR1bGU7CiAKQEAgLTQ0OSw3ICs3ODMsMjAgQEAKIAkJYnJlYWs7CiAJfQogcmVzY2hlZHVsZToKLQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmluc3RhbmNlLT5wb2xsX3dvcmssIG1zZWNzX3RvX2ppZmZpZXMoUE9MTF9JTlRFUlZBTCkpOworCisJbXV0ZXhfbG9jaygmaW5zdGFuY2UtPnBvbGxfc3RhdGVfc2VyaWFsaXplKTsKKwlpZiAoaW5zdGFuY2UtPnBvbGxfc3RhdGUgPT0gQ1hQT0xMX1NUT1BQSU5HICYmCisJCQkJaW5zdGFuY2UtPmFkc2xfc3RhdHVzID09IDEgJiYgLyogc3RvcHBlZCAqLworCQkJCWluc3RhbmNlLT5saW5lX3N0YXR1cyA9PSAwKSAvKiBkb3duICovCisJCWluc3RhbmNlLT5wb2xsX3N0YXRlID0gQ1hQT0xMX1NUT1BQRUQ7CisKKwlpZiAoaW5zdGFuY2UtPnBvbGxfc3RhdGUgPT0gQ1hQT0xMX1NUT1BQRUQpCisJCWtlZXBfcG9sbGluZyA9IDA7CisJbXV0ZXhfdW5sb2NrKCZpbnN0YW5jZS0+cG9sbF9zdGF0ZV9zZXJpYWxpemUpOworCisJaWYgKGtlZXBfcG9sbGluZykKKwkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZpbnN0YW5jZS0+cG9sbF93b3JrLAorCQkJCXJvdW5kX2ppZmZpZXNfcmVsYXRpdmUoUE9MTF9JTlRFUlZBTCpIWikpOwogfQogCiBzdGF0aWMgaW50IGN4YWNydV9mdyhzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldiwgZW51bSBjeGFjcnVfZndfcmVxdWVzdCBmdywKQEAgLTY4NCw2ICsxMDMxLDE0IEBACiAKIAlpbnN0YW5jZS0+dXNiYXRtID0gdXNiYXRtX2luc3RhbmNlOwogCWluc3RhbmNlLT5tb2RlbV90eXBlID0gKHN0cnVjdCBjeGFjcnVfbW9kZW1fdHlwZSAqKSBpZC0+ZHJpdmVyX2luZm87CisJbWVtc2V0KGluc3RhbmNlLT5jYXJkX2luZm8sIDAsIHNpemVvZihpbnN0YW5jZS0+Y2FyZF9pbmZvKSk7CisKKwltdXRleF9pbml0KCZpbnN0YW5jZS0+cG9sbF9zdGF0ZV9zZXJpYWxpemUpOworCWluc3RhbmNlLT5wb2xsX3N0YXRlID0gQ1hQT0xMX1NUT1BQRUQ7CisJaW5zdGFuY2UtPmxpbmVfc3RhdHVzID0gLTE7CisJaW5zdGFuY2UtPmFkc2xfc3RhdHVzID0gLTE7CisKKwltdXRleF9pbml0KCZpbnN0YW5jZS0+YWRzbF9zdGF0ZV9zZXJpYWxpemUpOwogCiAJaW5zdGFuY2UtPnJjdl9idWYgPSAodTggKikgX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOwogCWlmICghaW5zdGFuY2UtPnJjdl9idWYpIHsKQEAgLTcxMCw2ICsxMDY1LDEzIEBACiAJCWdvdG8gZmFpbDsKIAl9CiAKKwkjZGVmaW5lIENYQUNSVV9ERVZJQ0VfQ1JFQVRFX0ZJTEUoX25hbWUpIFwKKwkJcmV0ID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZpbnRmLT5kZXYsICZkZXZfYXR0cl8jI19uYW1lKTsgXAorCQlpZiAodW5saWtlbHkocmV0KSkgXAorCQkJZ290byBmYWlsX3N5c2ZzOworCUNYQUNSVV9BTExfRklMRVMoQ1JFQVRFKTsKKwkjdW5kZWYgQ1hBQ1JVX0RFVklDRV9DUkVBVEVfRklMRQorCiAJdXNiX2ZpbGxfaW50X3VyYihpbnN0YW5jZS0+cmN2X3VyYiwKIAkJCXVzYl9kZXYsIHVzYl9yY3ZpbnRwaXBlKHVzYl9kZXYsIENYQUNSVV9FUF9DTUQpLAogCQkJaW5zdGFuY2UtPnJjdl9idWYsIFBBR0VfU0laRSwKQEAgLTczMCw2ICsxMDkyLDE0IEBACiAKIAlyZXR1cm4gMDsKIAorIGZhaWxfc3lzZnM6CisJZGJnKCJjeGFjcnVfYmluZDogZGV2aWNlX2NyZWF0ZV9maWxlIGZhaWxlZCAoJWQpXG4iLCByZXQpOworCisJI2RlZmluZSBDWEFDUlVfREVWSUNFX1JFTU9WRV9GSUxFKF9uYW1lKSBcCisJCWRldmljZV9yZW1vdmVfZmlsZSgmaW50Zi0+ZGV2LCAmZGV2X2F0dHJfIyNfbmFtZSk7CisJQ1hBQ1JVX0FMTF9GSUxFUyhSRU1PVkUpOworCSN1bmRlZiBDWEFDUlVfREVWSUNFX1JFVk9WRV9GSUxFCisKICBmYWlsOgogCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgaW5zdGFuY2UtPnNuZF9idWYpOwogCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgaW5zdGFuY2UtPnJjdl9idWYpOwpAQCAtNzQ0LDYgKzExMTQsNyBAQAogCQlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKIHsKIAlzdHJ1Y3QgY3hhY3J1X2RhdGEgKmluc3RhbmNlID0gdXNiYXRtX2luc3RhbmNlLT5kcml2ZXJfZGF0YTsKKwlpbnQgaXNfcG9sbGluZyA9IDE7CiAKIAlkYmcoImN4YWNydV91bmJpbmQgZW50ZXJlZCIpOwogCkBAIC03NTIsOCArMTEyMywyMCBAQAogCQlyZXR1cm47CiAJfQogCi0Jd2hpbGUgKCFjYW5jZWxfZGVsYXllZF93b3JrKCZpbnN0YW5jZS0+cG9sbF93b3JrKSkKLQkgICAgICAgZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKwltdXRleF9sb2NrKCZpbnN0YW5jZS0+cG9sbF9zdGF0ZV9zZXJpYWxpemUpOworCUJVR19PTihpbnN0YW5jZS0+cG9sbF9zdGF0ZSA9PSBDWFBPTExfU0hVVERPV04pOworCisJLyogZW5zdXJlIHRoYXQgc3RhdHVzIHBvbGxpbmcgY29udGludWVzIHVubGVzcworCSAqIGl0IGhhcyBhbHJlYWR5IHN0b3BwZWQgKi8KKwlpZiAoaW5zdGFuY2UtPnBvbGxfc3RhdGUgPT0gQ1hQT0xMX1NUT1BQRUQpCisJCWlzX3BvbGxpbmcgPSAwOworCisJLyogc3RvcCBwb2xsaW5nIGZyb20gYmVpbmcgc3RvcHBlZCBvciBzdGFydGVkICovCisJaW5zdGFuY2UtPnBvbGxfc3RhdGUgPSBDWFBPTExfU0hVVERPV047CisJbXV0ZXhfdW5sb2NrKCZpbnN0YW5jZS0+cG9sbF9zdGF0ZV9zZXJpYWxpemUpOworCisJaWYgKGlzX3BvbGxpbmcpCisJCWNhbmNlbF9yZWFybWluZ19kZWxheWVkX3dvcmsoJmluc3RhbmNlLT5wb2xsX3dvcmspOwogCiAJdXNiX2tpbGxfdXJiKGluc3RhbmNlLT5zbmRfdXJiKTsKIAl1c2Jfa2lsbF91cmIoaW5zdGFuY2UtPnJjdl91cmIpOwpAQCAtNzYyLDYgKzExNDUsMTIgQEAKIAogCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgaW5zdGFuY2UtPnNuZF9idWYpOwogCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgaW5zdGFuY2UtPnJjdl9idWYpOworCisJI2RlZmluZSBDWEFDUlVfREVWSUNFX1JFTU9WRV9GSUxFKF9uYW1lKSBcCisJCWRldmljZV9yZW1vdmVfZmlsZSgmaW50Zi0+ZGV2LCAmZGV2X2F0dHJfIyNfbmFtZSk7CisJQ1hBQ1JVX0FMTF9GSUxFUyhSRU1PVkUpOworCSN1bmRlZiBDWEFDUlVfREVWSUNFX1JFVk9WRV9GSUxFCisKIAlrZnJlZShpbnN0YW5jZSk7CiAKIAl1c2JhdG1faW5zdGFuY2UtPmRyaXZlcl9kYXRhID0gTlVMTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2F0bS91c2JhdG0uYyBiL2RyaXZlcnMvdXNiL2F0bS91c2JhdG0uYwppbmRleCBlYzYzYjBlLi5iM2Y3NzlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9hdG0vdXNiYXRtLmMKKysrIGIvZHJpdmVycy91c2IvYXRtL3VzYmF0bS5jCkBAIC0yNzQsNiArMjc0LDkgQEAKIAkJCSghKGNoYW5uZWwtPnVzYmF0bS0+ZmxhZ3MgJiBVRFNMX0lHTk9SRV9FSUxTRVEpIHx8CiAJCQkgdXJiLT5zdGF0dXMgIT0gLUVJTFNFUSApKQogCXsKKwkJaWYgKHVyYi0+c3RhdHVzID09IC1FU0hVVERPV04pCisJCQlyZXR1cm47CisKIAkJaWYgKHByaW50a19yYXRlbGltaXQoKSkKIAkJCWF0bV93YXJuKGNoYW5uZWwtPnVzYmF0bSwgIiVzOiB1cmIgMHglcCBmYWlsZWQgKCVkKSFcbiIsCiAJCQkJX19mdW5jX18sIHVyYiwgdXJiLT5zdGF0dXMpOwpAQCAtMzQzLDcgKzM0Niw3IEBACiAJCVVEU0xfQVNTRVJUKHNhcmItPnRhaWwgKyBBVE1fQ0VMTF9QQVlMT0FEIDw9IHNhcmItPmVuZCk7CiAJfQogCi0JbWVtY3B5KHNhcmItPnRhaWwsIHNvdXJjZSArIEFUTV9DRUxMX0hFQURFUiwgQVRNX0NFTExfUEFZTE9BRCk7CisJbWVtY3B5KHNrYl90YWlsX3BvaW50ZXIoc2FyYiksIHNvdXJjZSArIEFUTV9DRUxMX0hFQURFUiwgQVRNX0NFTExfUEFZTE9BRCk7CiAJX19za2JfcHV0KHNhcmIsIEFUTV9DRUxMX1BBWUxPQUQpOwogCiAJaWYgKHB0aSAmIDEpIHsKQEAgLTM3MCw3ICszNzMsNyBAQAogCQkJZ290byBvdXQ7CiAJCX0KIAotCQlpZiAoY3JjMzJfYmUofjAsIHNhcmItPnRhaWwgLSBwZHVfbGVuZ3RoLCBwZHVfbGVuZ3RoKSAhPSAweGM3MDRkZDdiKSB7CisJCWlmIChjcmMzMl9iZSh+MCwgc2tiX3RhaWxfcG9pbnRlcihzYXJiKSAtIHBkdV9sZW5ndGgsIHBkdV9sZW5ndGgpICE9IDB4YzcwNGRkN2IpIHsKIAkJCWF0bV9ybGRiZyhpbnN0YW5jZSwgIiVzOiBwYWNrZXQgZmFpbGVkIGNyYyBjaGVjayAodmNjOiAweCVwKSFcbiIsCiAJCQkJICBfX2Z1bmNfXywgdmNjKTsKIAkJCWF0b21pY19pbmMoJnZjYy0+c3RhdHMtPnJ4X2Vycik7CkBAIC0zOTYsNyArMzk5LDkgQEAKIAkJCWdvdG8gb3V0OwkvKiBhdG1fY2hhcmdlIGluY3JlbWVudHMgcnhfZHJvcCAqLwogCQl9CiAKLQkJbWVtY3B5KHNrYi0+ZGF0YSwgc2FyYi0+dGFpbCAtIHBkdV9sZW5ndGgsIGxlbmd0aCk7CisJCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhKHNrYiwKKwkJCQkJc2tiX3RhaWxfcG9pbnRlcihzYXJiKSAtIHBkdV9sZW5ndGgsCisJCQkJCWxlbmd0aCk7CiAJCV9fc2tiX3B1dChza2IsIGxlbmd0aCk7CiAKIAkJdmRiZygiJXM6IHNlbmRpbmcgc2tiIDB4JXAsIHNrYi0+bGVuICV1LCBza2ItPnRydWVzaXplICV1IiwKQEAgLTQ4NCw3ICs0ODksNyBAQAogCQlwdHJbNF0gPSAweGVjOwogCQlwdHIgKz0gQVRNX0NFTExfSEVBREVSOwogCi0JCW1lbWNweShwdHIsIHNrYi0+ZGF0YSwgZGF0YV9sZW4pOworCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgcHRyLCBkYXRhX2xlbik7CiAJCXB0ciArPSBkYXRhX2xlbjsKIAkJX19za2JfcHVsbChza2IsIGRhdGFfbGVuKTsKIApAQCAtOTY2LDYgKzk3MSwxNCBAQAogCS8qIHRlbXAgaW5pdCBBVE0gZGV2aWNlLCBzZXQgdG8gMTI4a2JpdCAqLwogCWF0bV9kZXYtPmxpbmtfcmF0ZSA9IDEyOCAqIDEwMDAgLyA0MjQ7CiAKKwlyZXQgPSBzeXNmc19jcmVhdGVfbGluaygmYXRtX2Rldi0+Y2xhc3NfZGV2LmtvYmosCisJCQkJJmluc3RhbmNlLT51c2JfaW50Zi0+ZGV2LmtvYmosICJkZXZpY2UiKTsKKwlpZiAocmV0KSB7CisJCWF0bV9lcnIoaW5zdGFuY2UsICIlczogc3lzZnNfY3JlYXRlX2xpbmsgZmFpbGVkOiAlZFxuIiwKKwkJCQkJX19mdW5jX18sIHJldCk7CisJCWdvdG8gZmFpbF9zeXNmczsKKwl9CisKIAlpZiAoaW5zdGFuY2UtPmRyaXZlci0+YXRtX3N0YXJ0ICYmICgocmV0ID0gaW5zdGFuY2UtPmRyaXZlci0+YXRtX3N0YXJ0KGluc3RhbmNlLCBhdG1fZGV2KSkgPCAwKSkgewogCQlhdG1fZXJyKGluc3RhbmNlLCAiJXM6IGF0bV9zdGFydCBmYWlsZWQ6ICVkIVxuIiwgX19mdW5jX18sIHJldCk7CiAJCWdvdG8gZmFpbDsKQEAgLTk4NCw2ICs5OTcsOCBAQAogCXJldHVybiAwOwogCiAgZmFpbDoKKwlzeXNmc19yZW1vdmVfbGluaygmYXRtX2Rldi0+Y2xhc3NfZGV2LmtvYmosICJkZXZpY2UiKTsKKyBmYWlsX3N5c2ZzOgogCWluc3RhbmNlLT5hdG1fZGV2ID0gTlVMTDsKIAlhdG1fZGV2X2RlcmVnaXN0ZXIoYXRtX2Rldik7IC8qIHVzYmF0bV9hdG1fZGV2X2Nsb3NlIHdpbGwgZXZlbnR1YWxseSBiZSBjYWxsZWQgKi8KIAlyZXR1cm4gcmV0OwpAQCAtMTMxNiw4ICsxMzMxLDEwIEBACiAJa2ZyZWUoaW5zdGFuY2UtPmNlbGxfYnVmKTsKIAogCS8qIEFUTSBmaW5hbGl6ZSAqLwotCWlmIChpbnN0YW5jZS0+YXRtX2RldikKKwlpZiAoaW5zdGFuY2UtPmF0bV9kZXYpIHsKKwkJc3lzZnNfcmVtb3ZlX2xpbmsoJmluc3RhbmNlLT5hdG1fZGV2LT5jbGFzc19kZXYua29iaiwgImRldmljZSIpOwogCQlhdG1fZGV2X2RlcmVnaXN0ZXIoaW5zdGFuY2UtPmF0bV9kZXYpOworCX0KIAogCXVzYmF0bV9wdXRfaW5zdGFuY2UoaW5zdGFuY2UpOwkvKiB0YWtlbiBpbiB1c2JhdG1fdXNiX3Byb2JlICovCiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jbGFzcy9jZGMtYWNtLmMgYi9kcml2ZXJzL3VzYi9jbGFzcy9jZGMtYWNtLmMKaW5kZXggMzFhZTY2MS4uMTRkZTNiMSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY2xhc3MvY2RjLWFjbS5jCisrKyBiL2RyaXZlcnMvdXNiL2NsYXNzL2NkYy1hY20uYwpAQCAtMjEyLDcgKzIxMiw0MSBAQAogCX0KIAlyZXR1cm4gcmM7CiB9CisvKgorICogYXR0cmlidXRlcyBleHBvcnRlZCB0aHJvdWdoIHN5c2ZzCisgKi8KK3N0YXRpYyBzc2l6ZV90IHNob3dfY2FwcworKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IHRvX3VzYl9pbnRlcmZhY2UoZGV2KTsKKwlzdHJ1Y3QgYWNtICphY20gPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwogCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWQiLCBhY20tPmN0cmxfY2Fwcyk7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIoYm1DYXBhYmlsaXRpZXMsIFNfSVJVR08sIHNob3dfY2FwcywgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfY291bnRyeV9jb2RlcworKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IHRvX3VzYl9pbnRlcmZhY2UoZGV2KTsKKwlzdHJ1Y3QgYWNtICphY20gPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOworCisJbWVtY3B5KGJ1ZiwgYWNtLT5jb3VudHJ5X2NvZGVzLCBhY20tPmNvdW50cnlfY29kZV9zaXplKTsKKwlyZXR1cm4gYWNtLT5jb3VudHJ5X2NvZGVfc2l6ZTsKK30KKworc3RhdGljIERFVklDRV9BVFRSKHdDb3VudHJ5Q29kZXMsIFNfSVJVR08sIHNob3dfY291bnRyeV9jb2RlcywgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfY291bnRyeV9yZWxfZGF0ZQorKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IHRvX3VzYl9pbnRlcmZhY2UoZGV2KTsKKwlzdHJ1Y3QgYWNtICphY20gPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWQiLCBhY20tPmNvdW50cnlfcmVsX2RhdGUpOworfQorCitzdGF0aWMgREVWSUNFX0FUVFIoaUNvdW50cnlDb2RlUmVsRGF0ZSwgU19JUlVHTywgc2hvd19jb3VudHJ5X3JlbF9kYXRlLCBOVUxMKTsKIC8qCiAgKiBJbnRlcnJ1cHQgaGFuZGxlcnMgZm9yIHZhcmlvdXMgQUNNIGRldmljZSByZXNwb25zZXMKICAqLwpAQCAtNTE0LDYgKzU0OCw3IEBACiAJdXNiX2ZyZWVfdXJiKGFjbS0+d3JpdGV1cmIpOwogCWZvciAoaSA9IDA7IGkgPCBucjsgaSsrKQogCQl1c2JfZnJlZV91cmIoYWNtLT5ydVtpXS51cmIpOworCWtmcmVlKGFjbS0+Y291bnRyeV9jb2Rlcyk7CiAJa2ZyZWUoYWNtKTsKIH0KIApAQCAtNzYxLDYgKzc5Niw3IEBACiAJCSAgICAgIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKIHsKIAlzdHJ1Y3QgdXNiX2NkY191bmlvbl9kZXNjICp1bmlvbl9oZWFkZXIgPSBOVUxMOworCXN0cnVjdCB1c2JfY2RjX2NvdW50cnlfZnVuY3Rpb25hbF9kZXNjICpjZmQgPSBOVUxMOwogCWNoYXIgKmJ1ZmZlciA9IGludGYtPmFsdHNldHRpbmctPmV4dHJhOwogCWludCBidWZsZW4gPSBpbnRmLT5hbHRzZXR0aW5nLT5leHRyYWxlbjsKIAlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqY29udHJvbF9pbnRlcmZhY2U7CkBAIC04MjQsOCArODYwLDkgQEAKIAkJCQl1bmlvbl9oZWFkZXIgPSAoc3RydWN0IHVzYl9jZGNfdW5pb25fZGVzYyAqKQogCQkJCQkJCWJ1ZmZlcjsKIAkJCQlicmVhazsKLQkJCWNhc2UgVVNCX0NEQ19DT1VOVFJZX1RZUEU6IC8qIG1heWJlIHNvbWVob3cgZXhwb3J0ICovCi0JCQkJYnJlYWs7IC8qIGZvciBub3cgd2UgaWdub3JlIGl0ICovCisJCQljYXNlIFVTQl9DRENfQ09VTlRSWV9UWVBFOiAvKiBleHBvcnQgdGhyb3VnaCBzeXNmcyovCisJCQkJY2ZkID0gKHN0cnVjdCB1c2JfY2RjX2NvdW50cnlfZnVuY3Rpb25hbF9kZXNjICopYnVmZmVyOworCQkJCWJyZWFrOwogCQkJY2FzZSBVU0JfQ0RDX0hFQURFUl9UWVBFOiAvKiBtYXliZSBjaGVjayB2ZXJzaW9uICovIAogCQkJCWJyZWFrOyAvKiBmb3Igbm93IHdlIGlnbm9yZSBpdCAqLyAKIAkJCWNhc2UgVVNCX0NEQ19BQ01fVFlQRToKQEAgLTk4Myw2ICsxMDIwLDM0IEBACiAJCWdvdG8gYWxsb2NfZmFpbDc7CiAJfQogCisJdXNiX3NldF9pbnRmZGF0YSAoaW50ZiwgYWNtKTsKKworCWkgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmludGYtPmRldiwgJmRldl9hdHRyX2JtQ2FwYWJpbGl0aWVzKTsKKwlpZiAoaSA8IDApCisJCWdvdG8gYWxsb2NfZmFpbDg7CisKKwlpZiAoY2ZkKSB7IC8qIGV4cG9ydCB0aGUgY291bnRyeSBkYXRhICovCisJCWFjbS0+Y291bnRyeV9jb2RlcyA9IGttYWxsb2MoY2ZkLT5iTGVuZ3RoIC0gNCwgR0ZQX0tFUk5FTCk7CisJCWlmICghYWNtLT5jb3VudHJ5X2NvZGVzKQorCQkJZ290byBza2lwX2NvdW50cmllczsKKwkJYWNtLT5jb3VudHJ5X2NvZGVfc2l6ZSA9IGNmZC0+Ykxlbmd0aCAtIDQ7CisJCW1lbWNweShhY20tPmNvdW50cnlfY29kZXMsICh1OCAqKSZjZmQtPndDb3VudHlDb2RlMCwgY2ZkLT5iTGVuZ3RoIC0gNCk7CisJCWFjbS0+Y291bnRyeV9yZWxfZGF0ZSA9IGNmZC0+aUNvdW50cnlDb2RlUmVsRGF0ZTsKKworCQlpID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZpbnRmLT5kZXYsICZkZXZfYXR0cl93Q291bnRyeUNvZGVzKTsKKwkJaWYgKGkgPCAwKSB7CisJCQlrZnJlZShhY20tPmNvdW50cnlfY29kZXMpOworCQkJZ290byBza2lwX2NvdW50cmllczsKKwkJfQorCisJCWkgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmludGYtPmRldiwgJmRldl9hdHRyX2lDb3VudHJ5Q29kZVJlbERhdGUpOworCQlpZiAoaSA8IDApIHsKKwkJCWtmcmVlKGFjbS0+Y291bnRyeV9jb2Rlcyk7CisJCQlnb3RvIHNraXBfY291bnRyaWVzOworCQl9CisJfQorCitza2lwX2NvdW50cmllczoKIAl1c2JfZmlsbF9pbnRfdXJiKGFjbS0+Y3RybHVyYiwgdXNiX2RldiwgdXNiX3JjdmludHBpcGUodXNiX2RldiwgZXBjdHJsLT5iRW5kcG9pbnRBZGRyZXNzKSwKIAkJCSBhY20tPmN0cmxfYnVmZmVyLCBjdHJsc2l6ZSwgYWNtX2N0cmxfaXJxLCBhY20sIGVwY3RybC0+YkludGVydmFsKTsKIAlhY20tPmN0cmx1cmItPnRyYW5zZmVyX2ZsYWdzIHw9IFVSQl9OT19UUkFOU0ZFUl9ETUFfTUFQOwpAQCAtMTAwNiw5ICsxMDcxLDEwIEBACiAJdHR5X3JlZ2lzdGVyX2RldmljZShhY21fdHR5X2RyaXZlciwgbWlub3IsICZjb250cm9sX2ludGVyZmFjZS0+ZGV2KTsKIAogCWFjbV90YWJsZVttaW5vcl0gPSBhY207Ci0JdXNiX3NldF9pbnRmZGF0YSAoaW50ZiwgYWNtKTsKLQlyZXR1cm4gMDsKIAorCXJldHVybiAwOworYWxsb2NfZmFpbDg6CisJdXNiX2ZyZWVfdXJiKGFjbS0+d3JpdGV1cmIpOwogYWxsb2NfZmFpbDc6CiAJZm9yIChpID0gMDsgaSA8IG51bV9yeF9idWY7IGkrKykKIAkJdXNiX2J1ZmZlcl9mcmVlKHVzYl9kZXYsIGFjbS0+cmVhZHNpemUsIGFjbS0+cmJbaV0uYmFzZSwgYWNtLT5yYltpXS5kbWEpOwpAQCAtMTAyNyw3ICsxMDkzLDcgQEAKIAogc3RhdGljIHZvaWQgYWNtX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCiB7Ci0Jc3RydWN0IGFjbSAqYWNtID0gdXNiX2dldF9pbnRmZGF0YSAoaW50Zik7CisJc3RydWN0IGFjbSAqYWNtID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CiAJaW50IGk7CiAKQEAgLTEwNDEsNiArMTEwNywxMSBAQAogCQltdXRleF91bmxvY2soJm9wZW5fbXV0ZXgpOwogCQlyZXR1cm47CiAJfQorCWlmIChhY20tPmNvdW50cnlfY29kZXMpeworCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmludGYtPmRldiwgJmRldl9hdHRyX3dDb3VudHJ5Q29kZXMpOworCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmludGYtPmRldiwgJmRldl9hdHRyX2lDb3VudHJ5Q29kZVJlbERhdGUpOworCX0KKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmludGYtPmRldiwgJmRldl9hdHRyX2JtQ2FwYWJpbGl0aWVzKTsKIAlhY20tPmRldiA9IE5VTEw7CiAJdXNiX3NldF9pbnRmZGF0YShhY20tPmNvbnRyb2wsIE5VTEwpOwogCXVzYl9zZXRfaW50ZmRhdGEoYWNtLT5kYXRhLCBOVUxMKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NsYXNzL2NkYy1hY20uaCBiL2RyaXZlcnMvdXNiL2NsYXNzL2NkYy1hY20uaAppbmRleCAxYmNhZWEzLi4wOWY3NzY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jbGFzcy9jZGMtYWNtLmgKKysrIGIvZHJpdmVycy91c2IvY2xhc3MvY2RjLWFjbS5oCkBAIC05MSw2ICs5MSw5IEBACiAJc3RydWN0IHVyYiAqY3RybHVyYiwgKndyaXRldXJiOwkJCS8qIHVyYnMgKi8KIAl1OCAqY3RybF9idWZmZXI7CQkJCS8qIGJ1ZmZlcnMgb2YgdXJicyAqLwogCWRtYV9hZGRyX3QgY3RybF9kbWE7CQkJCS8qIGRtYSBoYW5kbGVzIG9mIGJ1ZmZlcnMgKi8KKwl1OCAqY291bnRyeV9jb2RlczsJCQkJLyogY291bnRyeSBjb2RlcyBmcm9tIGRldmljZSAqLworCXVuc2lnbmVkIGludCBjb3VudHJ5X2NvZGVfc2l6ZTsJCQkvKiBzaXplIG9mIHRoaXMgYnVmZmVyICovCisJdW5zaWduZWQgaW50IGNvdW50cnlfcmVsX2RhdGU7CQkJLyogcmVsZWFzZSBkYXRlIG9mIHZlcnNpb24gKi8KIAlzdHJ1Y3QgYWNtX3diIHdiW0FDTV9OV107CiAJc3RydWN0IGFjbV9ydSBydVtBQ01fTlJdOwogCXN0cnVjdCBhY21fcmIgcmJbQUNNX05SXTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvS2NvbmZpZyBiL2RyaXZlcnMvdXNiL2NvcmUvS2NvbmZpZwppbmRleCAyZmMwZjg4Li5mNDkzZmIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL0tjb25maWcKKysrIGIvZHJpdmVycy91c2IvY29yZS9LY29uZmlnCkBAIC0zMSw3ICszMSwzMCBAQAogCSAgRm9yIHRoZSBmb3JtYXQgb2YgdGhlIHZhcmlvdXMgL3Byb2MvYnVzL3VzYi8gZmlsZXMsIHBsZWFzZSByZWFkCiAJICA8ZmlsZTpEb2N1bWVudGF0aW9uL3VzYi9wcm9jX3VzYl9pbmZvLnR4dD4uCiAKLQkgIE1vc3QgdXNlcnMgd2FudCB0byBzYXkgWSBoZXJlLgorCSAgVXNiZnMgZmlsZXMgY2FuJ3QgaGFuZGxlIEFjY2VzcyBDb250cm9sIExpc3RzIChBQ0wpLCB3aGljaCBhcmUgdGhlCisJICBkZWZhdWx0IHdheSB0byBncmFudCBhY2Nlc3MgdG8gVVNCIGRldmljZXMgZm9yIHVudHJ1c3RlZCB1c2VycyBvZiBhCisJICBkZXNrdG9wIHN5c3RlbS4gVGhlIHVzYmZzIGZ1bmN0aW9uYWxpdHkgaXMgcmVwbGFjZWQgYnkgcmVhbAorCSAgZGV2aWNlLW5vZGVzIG1hbmFnZWQgYnkgdWRldi4gVGhlc2Ugbm9kZXMgbGl2ZSBpbiAvZGV2L2J1cy91c2IgYW5kCisJICBhcmUgdXNlZCBieSBsaWJ1c2IuCisKK2NvbmZpZyBVU0JfREVWSUNFX0NMQVNTCisJYm9vbCAiVVNCIGRldmljZSBjbGFzcy1kZXZpY2VzIChERVBSRUNBVEVEKSIKKwlkZXBlbmRzIG9uIFVTQgorCWRlZmF1bHQgbgorCS0tLWhlbHAtLS0KKwkgIFVzZXJzcGFjZSBhY2Nlc3MgdG8gVVNCIGRldmljZXMgaXMgZ3JhbnRlZCBieSBkZXZpY2Utbm9kZXMgZXhwb3J0ZWQKKwkgIGRpcmVjdGx5IGZyb20gdGhlIHVzYmRldiBpbiBzeXNmcy4gT2xkIHZlcnNpb25zIG9mIHRoZSBkcml2ZXIKKwkgIGNvcmUgYW5kIHVkZXYgbmVlZGVkIGFkZGl0aW9uYWwgY2xhc3MgZGV2aWNlcyB0byBleHBvcnQgZGV2aWNlIG5vZGVzLgorCisJICBUaGVzZSBhZGRpdGlvbmFsIGRldmljZXMgYXJlIGRpZmZpY3VsdCB0byBoYW5kbGUgaW4gdXNlcnNwYWNlLCBpZgorCSAgaW5mb3JtYXRpb24gYWJvdXQgVVNCIGludGVyZmFjZXMgbXVzdCBiZSBhdmFpbGFibGUuIE9uZSBkZXZpY2UgY29udGFpbnMKKwkgIHRoZSBkZXZpY2Ugbm9kZSwgdGhlIG90aGVyIGRldmljZSBjb250YWlucyB0aGUgaW50ZXJmYWNlIGRhdGEuIEJvdGgKKwkgIGRldmljZXMgYXJlIGF0IHRoZSBzYW1lIGxldmVsIGluIHN5c2ZzIChzaWJsaW5ncykgYW5kIG9uZSBjYW4ndCBhY2Nlc3MKKwkgIHRoZSBvdGhlci4gVGhlIGRldmljZSBub2RlIGNyZWF0ZWQgZGlyZWN0bHkgYnkgdGhlIHVzYmRldiBpcyB0aGUgcGFyZW50CisJICBkZXZpY2Ugb2YgdGhlIGludGVyZmFjZSBhbmQgdGhlcmVmb3JlIGVhc2lseSBhY2Nlc3NpYmxlIGZyb20gdGhlIGludGVyZmFjZQorCSAgZXZlbnQuCisKKwkgIFRoaXMgb3B0aW9uIHByb3ZpZGVzIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgaWYgbmVlZGVkLgogCiBjb25maWcgVVNCX0RZTkFNSUNfTUlOT1JTCiAJYm9vbCAiRHluYW1pYyBVU0IgbWlub3IgYWxsb2NhdGlvbiAoRVhQRVJJTUVOVEFMKSIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvZGV2aWNlcy5jIGIvZHJpdmVycy91c2IvY29yZS9kZXZpY2VzLmMKaW5kZXggYWVmYzc5OC4uNjc1M2NhMCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9kZXZpY2VzLmMKKysrIGIvZHJpdmVycy91c2IvY29yZS9kZXZpY2VzLmMKQEAgLTI0Niw3ICsyNDYsNiBAQAogCiAJaWYgKHN0YXJ0ID4gZW5kKQogCQlyZXR1cm4gc3RhcnQ7Ci0JZG93bl9yZWFkKCZ1c2JfYnVzX3R5cGUuc3Vic3lzLnJ3c2VtKTsKIAlpZiAoaWZhY2UpIHsKIAkJZHJpdmVyX25hbWUgPSAoaWZhY2UtPmRldi5kcml2ZXIKIAkJCQk/IGlmYWNlLT5kZXYuZHJpdmVyLT5uYW1lCkBAIC0yNjMsNyArMjYyLDYgQEAKIAkJCSBkZXNjLT5iSW50ZXJmYWNlU3ViQ2xhc3MsCiAJCQkgZGVzYy0+YkludGVyZmFjZVByb3RvY29sLAogCQkJIGRyaXZlcl9uYW1lKTsKLQl1cF9yZWFkKCZ1c2JfYnVzX3R5cGUuc3Vic3lzLnJ3c2VtKTsKIAlyZXR1cm4gc3RhcnQ7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvZGV2aW8uYyBiL2RyaXZlcnMvdXNiL2NvcmUvZGV2aW8uYwppbmRleCAzNmU3YTg0Li45MjdhMTgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL2RldmlvLmMKKysrIGIvZHJpdmVycy91c2IvY29yZS9kZXZpby5jCkBAIC01Nyw3ICs1Nyw2IEBACiAKICNkZWZpbmUgVVNCX01BWEJVUwkJCTY0CiAjZGVmaW5lIFVTQl9ERVZJQ0VfTUFYCQkJVVNCX01BWEJVUyAqIDEyOAotc3RhdGljIHN0cnVjdCBjbGFzcyAqdXNiX2RldmljZV9jbGFzczsKIAogLyogTXV0dWFsIGV4Y2x1c2lvbiBmb3IgcmVtb3ZhbCwgb3BlbiwgYW5kIHJlbGVhc2UgKi8KIERFRklORV9NVVRFWCh1c2Jmc19tdXRleCk7CkBAIC00MjEsMTQgKzQyMCwxMSBAQAogCWlmICh0ZXN0X2JpdChpZm51bSwgJnBzLT5pZmNsYWltZWQpKQogCQlyZXR1cm4gMDsKIAotCS8qIGxvY2sgYWdhaW5zdCBvdGhlciBjaGFuZ2VzIHRvIGRyaXZlciBiaW5kaW5ncyAqLwotCWRvd25fd3JpdGUoJnVzYl9idXNfdHlwZS5zdWJzeXMucndzZW0pOwogCWludGYgPSB1c2JfaWZudW1fdG9faWYoZGV2LCBpZm51bSk7CiAJaWYgKCFpbnRmKQogCQllcnIgPSAtRU5PRU5UOwogCWVsc2UKIAkJZXJyID0gdXNiX2RyaXZlcl9jbGFpbV9pbnRlcmZhY2UoJnVzYmZzX2RyaXZlciwgaW50ZiwgcHMpOwotCXVwX3dyaXRlKCZ1c2JfYnVzX3R5cGUuc3Vic3lzLnJ3c2VtKTsKIAlpZiAoZXJyID09IDApCiAJCXNldF9iaXQoaWZudW0sICZwcy0+aWZjbGFpbWVkKTsKIAlyZXR1cm4gZXJyOwpAQCAtNDQ0LDggKzQ0MCw2IEBACiAJaWYgKGlmbnVtID49IDgqc2l6ZW9mKHBzLT5pZmNsYWltZWQpKQogCQlyZXR1cm4gZXJyOwogCWRldiA9IHBzLT5kZXY7Ci0JLyogbG9jayBhZ2FpbnN0IG90aGVyIGNoYW5nZXMgdG8gZHJpdmVyIGJpbmRpbmdzICovCi0JZG93bl93cml0ZSgmdXNiX2J1c190eXBlLnN1YnN5cy5yd3NlbSk7CiAJaW50ZiA9IHVzYl9pZm51bV90b19pZihkZXYsIGlmbnVtKTsKIAlpZiAoIWludGYpCiAJCWVyciA9IC1FTk9FTlQ7CkBAIC00NTMsNyArNDQ3LDYgQEAKIAkJdXNiX2RyaXZlcl9yZWxlYXNlX2ludGVyZmFjZSgmdXNiZnNfZHJpdmVyLCBpbnRmKTsKIAkJZXJyID0gMDsKIAl9Ci0JdXBfd3JpdGUoJnVzYl9idXNfdHlwZS5zdWJzeXMucndzZW0pOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTUyMCwyMiArNTEzLDI1IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlICp1c2JkZXZfbG9va3VwX21pbm9yKGludCBtaW5vcikKK3N0YXRpYyBpbnQgX19tYXRjaF9taW5vcihzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCiB7Ci0Jc3RydWN0IGRldmljZSAqZGV2aWNlOwotCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gTlVMTDsKKwlpbnQgbWlub3IgPSAqKChpbnQgKilkYXRhKTsKIAotCWRvd24oJnVzYl9kZXZpY2VfY2xhc3MtPnNlbSk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShkZXZpY2UsICZ1c2JfZGV2aWNlX2NsYXNzLT5kZXZpY2VzLCBub2RlKSB7Ci0JCWlmIChkZXZpY2UtPmRldnQgPT0gTUtERVYoVVNCX0RFVklDRV9NQUpPUiwgbWlub3IpKSB7Ci0JCQl1ZGV2ID0gZGV2aWNlLT5wbGF0Zm9ybV9kYXRhOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JdXAoJnVzYl9kZXZpY2VfY2xhc3MtPnNlbSk7CisJaWYgKGRldi0+ZGV2dCA9PSBNS0RFVihVU0JfREVWSUNFX01BSk9SLCBtaW5vcikpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQogCi0JcmV0dXJuIHVkZXY7Ci19Oworc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlICp1c2JkZXZfbG9va3VwX2J5X21pbm9yKGludCBtaW5vcikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisKKwlkZXYgPSBidXNfZmluZF9kZXZpY2UoJnVzYl9idXNfdHlwZSwgTlVMTCwgJm1pbm9yLCBfX21hdGNoX21pbm9yKTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIE5VTEw7CisJcHV0X2RldmljZShkZXYpOworCXJldHVybiBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgdXNiX2RldmljZSwgZGV2KTsKK30KIAogLyoKICAqIGZpbGUgb3BlcmF0aW9ucwpAQCAtNTU0LDExICs1NTAsMTQgQEAKIAkJZ290byBvdXQ7CiAKIAlyZXQgPSAtRU5PRU5UOwotCS8qIGNoZWNrIGlmIHdlIGFyZSBjYWxsZWQgZnJvbSBhIHJlYWwgbm9kZSBvciB1c2JmcyAqLworCS8qIHVzYmRldiBkZXZpY2Utbm9kZSAqLwogCWlmIChpbWFqb3IoaW5vZGUpID09IFVTQl9ERVZJQ0VfTUFKT1IpCi0JCWRldiA9IHVzYmRldl9sb29rdXBfbWlub3IoaW1pbm9yKGlub2RlKSk7CisJCWRldiA9IHVzYmRldl9sb29rdXBfYnlfbWlub3IoaW1pbm9yKGlub2RlKSk7CisjaWZkZWYgQ09ORklHX1VTQl9ERVZJQ0VGUworCS8qIHByb2NmcyBmaWxlICovCiAJaWYgKCFkZXYpCiAJCWRldiA9IGlub2RlLT5pX3ByaXZhdGU7CisjZW5kaWYKIAlpZiAoIWRldikKIAkJZ290byBvdXQ7CiAJcmV0ID0gdXNiX2F1dG9yZXN1bWVfZGV2aWNlKGRldik7CkBAIC01ODEsNyArNTgwLDcgQEAKIAlwcy0+ZGlzY2NvbnRleHQgPSBOVUxMOwogCXBzLT5pZmNsYWltZWQgPSAwOwogCXNlY3VyaXR5X3Rhc2tfZ2V0c2VjaWQoY3VycmVudCwgJnBzLT5zZWNpZCk7Ci0Jd21iKCk7CisJc21wX3dtYigpOwogCWxpc3RfYWRkX3RhaWwoJnBzLT5saXN0LCAmZGV2LT5maWxlbGlzdCk7CiAJZmlsZS0+cHJpdmF0ZV9kYXRhID0gcHM7CiAgb3V0OgpAQCAtODEzLDcgKzgxMiw2IEBACiAKIAlpZiAoY29weV9mcm9tX3VzZXIoJmdkLCBhcmcsIHNpemVvZihnZCkpKQogCQlyZXR1cm4gLUVGQVVMVDsKLQlkb3duX3JlYWQoJnVzYl9idXNfdHlwZS5zdWJzeXMucndzZW0pOwogCWludGYgPSB1c2JfaWZudW1fdG9faWYocHMtPmRldiwgZ2QuaW50ZXJmYWNlKTsKIAlpZiAoIWludGYgfHwgIWludGYtPmRldi5kcml2ZXIpCiAJCXJldCA9IC1FTk9EQVRBOwpAQCAtODIyLDcgKzgyMCw2IEBACiAJCQkJc2l6ZW9mKGdkLmRyaXZlcikpOwogCQlyZXQgPSAoY29weV90b191c2VyKGFyZywgJmdkLCBzaXplb2YoZ2QpKSA/IC1FRkFVTFQgOiAwKTsKIAl9Ci0JdXBfcmVhZCgmdXNiX2J1c190eXBlLnN1YnN5cy5yd3NlbSk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTM1MSwxNSArMTM0OCwxMiBAQAogCiAJLyogZGlzY29ubmVjdCBrZXJuZWwgZHJpdmVyIGZyb20gaW50ZXJmYWNlICovCiAJY2FzZSBVU0JERVZGU19ESVNDT05ORUNUOgotCi0JCWRvd25fd3JpdGUoJnVzYl9idXNfdHlwZS5zdWJzeXMucndzZW0pOwogCQlpZiAoaW50Zi0+ZGV2LmRyaXZlcikgewogCQkJZHJpdmVyID0gdG9fdXNiX2RyaXZlcihpbnRmLT5kZXYuZHJpdmVyKTsKIAkJCWRldl9kYmcgKCZpbnRmLT5kZXYsICJkaXNjb25uZWN0IGJ5IHVzYmZzXG4iKTsKIAkJCXVzYl9kcml2ZXJfcmVsZWFzZV9pbnRlcmZhY2UoZHJpdmVyLCBpbnRmKTsKIAkJfSBlbHNlCiAJCQlyZXR2YWwgPSAtRU5PREFUQTsKLQkJdXBfd3JpdGUoJnVzYl9idXNfdHlwZS5zdWJzeXMucndzZW0pOwogCQlicmVhazsKIAogCS8qIGxldCBrZXJuZWwgZHJpdmVycyB0cnkgdG8gKHJlKWJpbmQgdG8gdGhlIGludGVyZmFjZSAqLwpAQCAtMTM3MSw3ICsxMzY1LDYgQEAKIAogCS8qIHRhbGsgZGlyZWN0bHkgdG8gdGhlIGludGVyZmFjZSdzIGRyaXZlciAqLwogCWRlZmF1bHQ6Ci0JCWRvd25fcmVhZCgmdXNiX2J1c190eXBlLnN1YnN5cy5yd3NlbSk7CiAJCWlmIChpbnRmLT5kZXYuZHJpdmVyKQogCQkJZHJpdmVyID0gdG9fdXNiX2RyaXZlcihpbnRmLT5kZXYuZHJpdmVyKTsKIAkJaWYgKGRyaXZlciA9PSBOVUxMIHx8IGRyaXZlci0+aW9jdGwgPT0gTlVMTCkgewpAQCAtMTM4MSw3ICsxMzc0LDYgQEAKIAkJCWlmIChyZXR2YWwgPT0gLUVOT0lPQ1RMQ01EKQogCQkJCXJldHZhbCA9IC1FTk9UVFk7CiAJCX0KLQkJdXBfcmVhZCgmdXNiX2J1c190eXBlLnN1YnN5cy5yd3NlbSk7CiAJfQogCiAJLyogY2xlYW51cCBhbmQgcmV0dXJuICovCkBAIC0xNTgzLDcgKzE1NzUsNyBAQAogCXJldHVybiBtYXNrOwogfQogCi1jb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHVzYmZzX2RldmljZV9maWxlX29wZXJhdGlvbnMgPSB7Citjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHVzYmRldl9maWxlX29wZXJhdGlvbnMgPSB7CiAJLmxsc2VlayA9CXVzYmRldl9sc2VlaywKIAkucmVhZCA9CQl1c2JkZXZfcmVhZCwKIAkucG9sbCA9CQl1c2JkZXZfcG9sbCwKQEAgLTE1OTIsNTAgKzE1ODQsNTMgQEAKIAkucmVsZWFzZSA9CXVzYmRldl9yZWxlYXNlLAogfTsKIAotc3RhdGljIGludCB1c2JkZXZfYWRkKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYpCisjaWZkZWYgQ09ORklHX1VTQl9ERVZJQ0VfQ0xBU1MKK3N0YXRpYyBzdHJ1Y3QgY2xhc3MgKnVzYl9jbGFzc2Rldl9jbGFzczsKKworc3RhdGljIGludCB1c2JfY2xhc3NkZXZfYWRkKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYpCiB7CiAJaW50IG1pbm9yID0gKChkZXYtPmJ1cy0+YnVzbnVtLTEpICogMTI4KSArIChkZXYtPmRldm51bS0xKTsKIAotCWRldi0+dXNiZnNfZGV2ID0gZGV2aWNlX2NyZWF0ZSh1c2JfZGV2aWNlX2NsYXNzLCAmZGV2LT5kZXYsCisJZGV2LT51c2JfY2xhc3NkZXYgPSBkZXZpY2VfY3JlYXRlKHVzYl9jbGFzc2Rldl9jbGFzcywgJmRldi0+ZGV2LAogCQkJCU1LREVWKFVTQl9ERVZJQ0VfTUFKT1IsIG1pbm9yKSwKIAkJCQkidXNiZGV2JWQuJWQiLCBkZXYtPmJ1cy0+YnVzbnVtLCBkZXYtPmRldm51bSk7Ci0JaWYgKElTX0VSUihkZXYtPnVzYmZzX2RldikpCi0JCXJldHVybiBQVFJfRVJSKGRldi0+dXNiZnNfZGV2KTsKKwlpZiAoSVNfRVJSKGRldi0+dXNiX2NsYXNzZGV2KSkKKwkJcmV0dXJuIFBUUl9FUlIoZGV2LT51c2JfY2xhc3NkZXYpOwogCi0JZGV2LT51c2Jmc19kZXYtPnBsYXRmb3JtX2RhdGEgPSBkZXY7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHVzYmRldl9yZW1vdmUoc3RydWN0IHVzYl9kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIHVzYl9jbGFzc2Rldl9yZW1vdmUoc3RydWN0IHVzYl9kZXZpY2UgKmRldikKIHsKLQlkZXZpY2VfdW5yZWdpc3RlcihkZXYtPnVzYmZzX2Rldik7CisJZGV2aWNlX3VucmVnaXN0ZXIoZGV2LT51c2JfY2xhc3NkZXYpOwogfQogCi1zdGF0aWMgaW50IHVzYmRldl9ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLCB1bnNpZ25lZCBsb25nIGFjdGlvbiwKLQkJCSB2b2lkICpkZXYpCitzdGF0aWMgaW50IHVzYl9jbGFzc2Rldl9ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpkZXYpCiB7CiAJc3dpdGNoIChhY3Rpb24pIHsKIAljYXNlIFVTQl9ERVZJQ0VfQUREOgotCQlpZiAodXNiZGV2X2FkZChkZXYpKQorCQlpZiAodXNiX2NsYXNzZGV2X2FkZChkZXYpKQogCQkJcmV0dXJuIE5PVElGWV9CQUQ7CiAJCWJyZWFrOwogCWNhc2UgVVNCX0RFVklDRV9SRU1PVkU6Ci0JCXVzYmRldl9yZW1vdmUoZGV2KTsKKwkJdXNiX2NsYXNzZGV2X3JlbW92ZShkZXYpOwogCQlicmVhazsKIAl9CiAJcmV0dXJuIE5PVElGWV9PSzsKIH0KIAogc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayB1c2JkZXZfbmIgPSB7Ci0JLm5vdGlmaWVyX2NhbGwgPSAJdXNiZGV2X25vdGlmeSwKKwkubm90aWZpZXJfY2FsbCA9IAl1c2JfY2xhc3NkZXZfbm90aWZ5LAogfTsKKyNlbmRpZgogCiBzdGF0aWMgc3RydWN0IGNkZXYgdXNiX2RldmljZV9jZGV2ID0gewogCS5rb2JqICAgPSB7Lm5hbWUgPSAidXNiX2RldmljZSIsIH0sCiAJLm93bmVyICA9IFRISVNfTU9EVUxFLAogfTsKIAotaW50IF9faW5pdCB1c2JkZXZfaW5pdCh2b2lkKQoraW50IF9faW5pdCB1c2JfZGV2aW9faW5pdCh2b2lkKQogewogCWludCByZXR2YWw7CiAKQEAgLTE2NDUsMzggKzE2NDAsMzggQEAKIAkJZXJyKCJ1bmFibGUgdG8gcmVnaXN0ZXIgbWlub3JzIGZvciB1c2JfZGV2aWNlIik7CiAJCWdvdG8gb3V0OwogCX0KLQljZGV2X2luaXQoJnVzYl9kZXZpY2VfY2RldiwgJnVzYmZzX2RldmljZV9maWxlX29wZXJhdGlvbnMpOworCWNkZXZfaW5pdCgmdXNiX2RldmljZV9jZGV2LCAmdXNiZGV2X2ZpbGVfb3BlcmF0aW9ucyk7CiAJcmV0dmFsID0gY2Rldl9hZGQoJnVzYl9kZXZpY2VfY2RldiwgVVNCX0RFVklDRV9ERVYsIFVTQl9ERVZJQ0VfTUFYKTsKIAlpZiAocmV0dmFsKSB7CiAJCWVycigidW5hYmxlIHRvIGdldCB1c2JfZGV2aWNlIG1ham9yICVkIiwgVVNCX0RFVklDRV9NQUpPUik7CiAJCWdvdG8gZXJyb3JfY2RldjsKIAl9Ci0JdXNiX2RldmljZV9jbGFzcyA9IGNsYXNzX2NyZWF0ZShUSElTX01PRFVMRSwgInVzYl9kZXZpY2UiKTsKLQlpZiAoSVNfRVJSKHVzYl9kZXZpY2VfY2xhc3MpKSB7CisjaWZkZWYgQ09ORklHX1VTQl9ERVZJQ0VfQ0xBU1MKKwl1c2JfY2xhc3NkZXZfY2xhc3MgPSBjbGFzc19jcmVhdGUoVEhJU19NT0RVTEUsICJ1c2JfZGV2aWNlIik7CisJaWYgKElTX0VSUih1c2JfY2xhc3NkZXZfY2xhc3MpKSB7CiAJCWVycigidW5hYmxlIHRvIHJlZ2lzdGVyIHVzYl9kZXZpY2UgY2xhc3MiKTsKLQkJcmV0dmFsID0gUFRSX0VSUih1c2JfZGV2aWNlX2NsYXNzKTsKLQkJZ290byBlcnJvcl9jbGFzczsKKwkJcmV0dmFsID0gUFRSX0VSUih1c2JfY2xhc3NkZXZfY2xhc3MpOworCQljZGV2X2RlbCgmdXNiX2RldmljZV9jZGV2KTsKKwkJdXNiX2NsYXNzZGV2X2NsYXNzID0gTlVMTDsKKwkJZ290byBvdXQ7CiAJfQogCiAJdXNiX3JlZ2lzdGVyX25vdGlmeSgmdXNiZGV2X25iKTsKLQorI2VuZGlmCiBvdXQ6CiAJcmV0dXJuIHJldHZhbDsKIAotZXJyb3JfY2xhc3M6Ci0JdXNiX2RldmljZV9jbGFzcyA9IE5VTEw7Ci0JY2Rldl9kZWwoJnVzYl9kZXZpY2VfY2Rldik7Ci0KIGVycm9yX2NkZXY6CiAJdW5yZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKFVTQl9ERVZJQ0VfREVWLCBVU0JfREVWSUNFX01BWCk7CiAJZ290byBvdXQ7CiB9CiAKLXZvaWQgdXNiZGV2X2NsZWFudXAodm9pZCkKK3ZvaWQgdXNiX2RldmlvX2NsZWFudXAodm9pZCkKIHsKKyNpZmRlZiBDT05GSUdfVVNCX0RFVklDRV9DTEFTUwogCXVzYl91bnJlZ2lzdGVyX25vdGlmeSgmdXNiZGV2X25iKTsKLQljbGFzc19kZXN0cm95KHVzYl9kZXZpY2VfY2xhc3MpOworCWNsYXNzX2Rlc3Ryb3kodXNiX2NsYXNzZGV2X2NsYXNzKTsKKyNlbmRpZgogCWNkZXZfZGVsKCZ1c2JfZGV2aWNlX2NkZXYpOwogCXVucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihVU0JfREVWSUNFX0RFViwgVVNCX0RFVklDRV9NQVgpOwogfQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL2RyaXZlci5jIGIvZHJpdmVycy91c2IvY29yZS9kcml2ZXIuYwppbmRleCA5ZTNlOTQzLi5iOWY3ZjkwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL2RyaXZlci5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvZHJpdmVyLmMKQEAgLTI4Nyw5ICsyODcsOSBAQAogICogd2F5IHRvIGJpbmQgdG8gYW4gaW50ZXJmYWNlIGlzIHRvIHJldHVybiB0aGUgcHJpdmF0ZSBkYXRhIGZyb20KICAqIHRoZSBkcml2ZXIncyBwcm9iZSgpIG1ldGhvZC4KICAqCi0gKiBDYWxsZXJzIG11c3Qgb3duIHRoZSBkZXZpY2UgbG9jayBhbmQgdGhlIGRyaXZlciBtb2RlbCdzIHVzYl9idXNfdHlwZS5zdWJzeXMKLSAqIHdyaXRlbG9jay4gIFNvIGRyaXZlciBwcm9iZSgpIGVudHJpZXMgZG9uJ3QgbmVlZCBleHRyYSBsb2NraW5nLAotICogYnV0IG90aGVyIGNhbGwgY29udGV4dHMgbWF5IG5lZWQgdG8gZXhwbGljaXRseSBjbGFpbSB0aG9zZSBsb2Nrcy4KKyAqIENhbGxlcnMgbXVzdCBvd24gdGhlIGRldmljZSBsb2NrLCBzbyBkcml2ZXIgcHJvYmUoKSBlbnRyaWVzIGRvbid0IG5lZWQKKyAqIGV4dHJhIGxvY2tpbmcsIGJ1dCBvdGhlciBjYWxsIGNvbnRleHRzIG1heSBuZWVkIHRvIGV4cGxpY2l0bHkgY2xhaW0gdGhhdAorICogbG9jay4KICAqLwogaW50IHVzYl9kcml2ZXJfY2xhaW1faW50ZXJmYWNlKHN0cnVjdCB1c2JfZHJpdmVyICpkcml2ZXIsCiAJCQkJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmlmYWNlLCB2b2lkKiBwcml2KQpAQCAtMzMwLDkgKzMzMCw5IEBACiAgKiBhbHNvIGNhdXNlcyB0aGUgZHJpdmVyIGRpc2Nvbm5lY3QoKSBtZXRob2QgdG8gYmUgY2FsbGVkLgogICoKICAqIFRoaXMgY2FsbCBpcyBzeW5jaHJvbm91cywgYW5kIG1heSBub3QgYmUgdXNlZCBpbiBhbiBpbnRlcnJ1cHQgY29udGV4dC4KLSAqIENhbGxlcnMgbXVzdCBvd24gdGhlIGRldmljZSBsb2NrIGFuZCB0aGUgZHJpdmVyIG1vZGVsJ3MgdXNiX2J1c190eXBlLnN1YnN5cwotICogd3JpdGVsb2NrLiAgU28gZHJpdmVyIGRpc2Nvbm5lY3QoKSBlbnRyaWVzIGRvbid0IG5lZWQgZXh0cmEgbG9ja2luZywKLSAqIGJ1dCBvdGhlciBjYWxsIGNvbnRleHRzIG1heSBuZWVkIHRvIGV4cGxpY2l0bHkgY2xhaW0gdGhvc2UgbG9ja3MuCisgKiBDYWxsZXJzIG11c3Qgb3duIHRoZSBkZXZpY2UgbG9jaywgc28gZHJpdmVyIGRpc2Nvbm5lY3QoKSBlbnRyaWVzIGRvbid0CisgKiBuZWVkIGV4dHJhIGxvY2tpbmcsIGJ1dCBvdGhlciBjYWxsIGNvbnRleHRzIG1heSBuZWVkIHRvIGV4cGxpY2l0bHkgY2xhaW0KKyAqIHRoYXQgbG9jay4KICAqLwogdm9pZCB1c2JfZHJpdmVyX3JlbGVhc2VfaW50ZXJmYWNlKHN0cnVjdCB1c2JfZHJpdmVyICpkcml2ZXIsCiAJCQkJCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppZmFjZSkKQEAgLTU3NCwyMyArNTc0LDEwIEBACiB9CiAKICNpZmRlZglDT05GSUdfSE9UUExVRwotCi0vKgotICogVGhpcyBzZW5kcyBhbiB1ZXZlbnQgdG8gdXNlcnNwYWNlLCB0eXBpY2FsbHkgaGVscGluZyB0byBsb2FkIGRyaXZlcgotICogb3Igb3RoZXIgbW9kdWxlcywgY29uZmlndXJlIHRoZSBkZXZpY2UsIGFuZCBtb3JlLiAgRHJpdmVycyBjYW4gcHJvdmlkZQotICogYSBNT0RVTEVfREVWSUNFX1RBQkxFIHRvIGhlbHAgd2l0aCBtb2R1bGUgbG9hZGluZyBzdWJ0YXNrcy4KLSAqCi0gKiBXZSdyZSBjYWxsZWQgZWl0aGVyIGZyb20ga2h1YmQgKHRoZSB0eXBpY2FsIGNhc2UpIG9yIGZyb20gcm9vdCBodWIKLSAqIChpbml0LCBrYXBtZCwgbW9kcHJvYmUsIHJtbW9kLCBldGMpLCBidXQgdGhlIGFnZW50cyBuZWVkIHRvIGhhbmRsZQotICogZGVsYXlzIGluIGV2ZW50IGRlbGl2ZXJ5LiAgVXNlIHN5c2ZzIChhbmQgREVWUEFUSCkgdG8gbWFrZSBzdXJlIHRoZQotICogZGV2aWNlIChhbmQgdGhpcyBjb25maWd1cmF0aW9uISkgYXJlIHN0aWxsIHByZXNlbnQuCi0gKi8KIHN0YXRpYyBpbnQgdXNiX3VldmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKiplbnZwLCBpbnQgbnVtX2VudnAsCiAJCSAgICAgIGNoYXIgKmJ1ZmZlciwgaW50IGJ1ZmZlcl9zaXplKQogewotCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmOwogCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2OwotCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmFsdDsKIAlpbnQgaSA9IDA7CiAJaW50IGxlbmd0aCA9IDA7CiAKQEAgLTYwMCwxMyArNTg3LDExIEBACiAJLyogZHJpdmVyIGlzIG9mdGVuIG51bGwgaGVyZTsgZGV2X2RiZygpIHdvdWxkIG9vcHMgKi8KIAlwcl9kZWJ1ZyAoInVzYiAlczogdWV2ZW50XG4iLCBkZXYtPmJ1c19pZCk7CiAKLQlpZiAoaXNfdXNiX2RldmljZShkZXYpKSB7CisJaWYgKGlzX3VzYl9kZXZpY2UoZGV2KSkKIAkJdXNiX2RldiA9IHRvX3VzYl9kZXZpY2UoZGV2KTsKLQkJYWx0ID0gTlVMTDsKLQl9IGVsc2UgewotCQlpbnRmID0gdG9fdXNiX2ludGVyZmFjZShkZXYpOworCWVsc2UgeworCQlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IHRvX3VzYl9pbnRlcmZhY2UoZGV2KTsKIAkJdXNiX2RldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7Ci0JCWFsdCA9IGludGYtPmN1cl9hbHRzZXR0aW5nOwogCX0KIAogCWlmICh1c2JfZGV2LT5kZXZudW0gPCAwKSB7CkBAIC02MjEsOSArNjA2LDcgQEAKICNpZmRlZglDT05GSUdfVVNCX0RFVklDRUZTCiAJLyogSWYgdGhpcyBpcyBhdmFpbGFibGUsIHVzZXJzcGFjZSBwcm9ncmFtcyBjYW4gZGlyZWN0bHkgcmVhZAogCSAqIGFsbCB0aGUgZGV2aWNlIGRlc2NyaXB0b3JzIHdlIGRvbid0IHRlbGwgdGhlbSBhYm91dC4gIE9yCi0JICogZXZlbiBhY3QgYXMgdXNlcm1vZGUgZHJpdmVycy4KLQkgKgotCSAqIEZJWE1FIHJlZHVjZSBoYXJkd2lyZWQgaW50ZWxsaWdlbmNlIGhlcmUKKwkgKiBhY3QgYXMgdXNlcm1vZGUgZHJpdmVycy4KIAkgKi8KIAlpZiAoYWRkX3VldmVudF92YXIoZW52cCwgbnVtX2VudnAsICZpLAogCQkJICAgYnVmZmVyLCBidWZmZXJfc2l6ZSwgJmxlbmd0aCwKQEAgLTY1MCw0NCArNjMzLDI5IEBACiAJCQkgICB1c2JfZGV2LT5kZXNjcmlwdG9yLmJEZXZpY2VQcm90b2NvbCkpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JaWYgKCFpc191c2JfZGV2aWNlKGRldikpIHsKLQotCQlpZiAoYWRkX3VldmVudF92YXIoZW52cCwgbnVtX2VudnAsICZpLAorCWlmIChhZGRfdWV2ZW50X3ZhcihlbnZwLCBudW1fZW52cCwgJmksCiAJCQkgICBidWZmZXIsIGJ1ZmZlcl9zaXplLCAmbGVuZ3RoLAotCQkJICAgIklOVEVSRkFDRT0lZC8lZC8lZCIsCi0JCQkgICBhbHQtPmRlc2MuYkludGVyZmFjZUNsYXNzLAotCQkJICAgYWx0LT5kZXNjLmJJbnRlcmZhY2VTdWJDbGFzcywKLQkJCSAgIGFsdC0+ZGVzYy5iSW50ZXJmYWNlUHJvdG9jb2wpKQotCQkJcmV0dXJuIC1FTk9NRU07CisJCQkgICAiQlVTTlVNPSUwM2QiLAorCQkJICAgdXNiX2Rldi0+YnVzLT5idXNudW0pKQorCQlyZXR1cm4gLUVOT01FTTsKIAotCQlpZiAoYWRkX3VldmVudF92YXIoZW52cCwgbnVtX2VudnAsICZpLAorCWlmIChhZGRfdWV2ZW50X3ZhcihlbnZwLCBudW1fZW52cCwgJmksCiAJCQkgICBidWZmZXIsIGJ1ZmZlcl9zaXplLCAmbGVuZ3RoLAotCQkJICAgIk1PREFMSUFTPXVzYjp2JTA0WHAlMDRYZCUwNFhkYyUwMlhkc2MlMDJYZHAlMDJYaWMlMDJYaXNjJTAyWGlwJTAyWCIsCi0JCQkgICBsZTE2X3RvX2NwdSh1c2JfZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKSwKLQkJCSAgIGxlMTZfdG9fY3B1KHVzYl9kZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KSwKLQkJCSAgIGxlMTZfdG9fY3B1KHVzYl9kZXYtPmRlc2NyaXB0b3IuYmNkRGV2aWNlKSwKLQkJCSAgIHVzYl9kZXYtPmRlc2NyaXB0b3IuYkRldmljZUNsYXNzLAotCQkJICAgdXNiX2Rldi0+ZGVzY3JpcHRvci5iRGV2aWNlU3ViQ2xhc3MsCi0JCQkgICB1c2JfZGV2LT5kZXNjcmlwdG9yLmJEZXZpY2VQcm90b2NvbCwKLQkJCSAgIGFsdC0+ZGVzYy5iSW50ZXJmYWNlQ2xhc3MsCi0JCQkgICBhbHQtPmRlc2MuYkludGVyZmFjZVN1YkNsYXNzLAotCQkJICAgYWx0LT5kZXNjLmJJbnRlcmZhY2VQcm90b2NvbCkpCi0JCQlyZXR1cm4gLUVOT01FTTsKLQl9CisJCQkgICAiREVWTlVNPSUwM2QiLAorCQkJICAgdXNiX2Rldi0+ZGV2bnVtKSkKKwkJcmV0dXJuIC1FTk9NRU07CiAKIAllbnZwW2ldID0gTlVMTDsKLQogCXJldHVybiAwOwogfQogCiAjZWxzZQogCiBzdGF0aWMgaW50IHVzYl91ZXZlbnQoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICoqZW52cCwKLQkJCWludCBudW1fZW52cCwgY2hhciAqYnVmZmVyLCBpbnQgYnVmZmVyX3NpemUpCisJCSAgICAgIGludCBudW1fZW52cCwgY2hhciAqYnVmZmVyLCBpbnQgYnVmZmVyX3NpemUpCiB7CiAJcmV0dXJuIC1FTk9ERVY7CiB9Ci0KICNlbmRpZgkvKiBDT05GSUdfSE9UUExVRyAqLwogCiAvKioKQEAgLTg3Miw4ICs4NDAsMTAgQEAKIAogZG9uZToKIAkvLyBkZXZfZGJnKCZ1ZGV2LT5kZXYsICIlczogc3RhdHVzICVkXG4iLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7Ci0JaWYgKHN0YXR1cyA9PSAwKQorCWlmIChzdGF0dXMgPT0gMCkgeworCQl1ZGV2LT5hdXRvcmVzdW1lX2Rpc2FibGVkID0gMDsKIAkJdWRldi0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlLmV2ZW50ID0gUE1fRVZFTlRfT047CisJfQogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTk2Miw2ICs5MzIsNyBAQAogewogCWludAkJCWk7CiAJc3RydWN0IHVzYl9pbnRlcmZhY2UJKmludGY7CisJdW5zaWduZWQgbG9uZwkJc3VzcGVuZF90aW1lOwogCiAJLyogRm9yIGF1dG9zdXNwZW5kLCBmYWlsIGZhc3QgaWYgYW55dGhpbmcgaXMgaW4gdXNlIG9yIGF1dG9zdXNwZW5kCiAJICogaXMgZGlzYWJsZWQuICBBbHNvIGZhaWwgaWYgYW55IGludGVyZmFjZXMgcmVxdWlyZSByZW1vdGUgd2FrZXVwCkBAIC05NzAsOSArOTQxLDEwIEBACiAJdWRldi0+ZG9fcmVtb3RlX3dha2V1cCA9IGRldmljZV9tYXlfd2FrZXVwKCZ1ZGV2LT5kZXYpOwogCWlmICh1ZGV2LT5wbV91c2FnZV9jbnQgPiAwKQogCQlyZXR1cm4gLUVCVVNZOwotCWlmICghdWRldi0+YXV0b3N1c3BlbmRfZGVsYXkpCisJaWYgKHVkZXYtPmF1dG9zdXNwZW5kX2RlbGF5IDwgMCB8fCB1ZGV2LT5hdXRvc3VzcGVuZF9kaXNhYmxlZCkKIAkJcmV0dXJuIC1FUEVSTTsKIAorCXN1c3BlbmRfdGltZSA9IHVkZXYtPmxhc3RfYnVzeSArIHVkZXYtPmF1dG9zdXNwZW5kX2RlbGF5OwogCWlmICh1ZGV2LT5hY3Rjb25maWcpIHsKIAkJZm9yIChpID0gMDsgaSA8IHVkZXYtPmFjdGNvbmZpZy0+ZGVzYy5iTnVtSW50ZXJmYWNlczsgaSsrKSB7CiAJCQlpbnRmID0gdWRldi0+YWN0Y29uZmlnLT5pbnRlcmZhY2VbaV07CkBAIC05ODgsNiArOTYwLDI0IEBACiAJCQl9CiAJCX0KIAl9CisKKwkvKiBJZiBldmVyeXRoaW5nIGlzIG9rYXkgYnV0IHRoZSBkZXZpY2UgaGFzbid0IGJlZW4gaWRsZSBmb3IgbG9uZworCSAqIGVub3VnaCwgcXVldWUgYSBkZWxheWVkIGF1dG9zdXNwZW5kIHJlcXVlc3QuCisJICovCisJaWYgKHRpbWVfYWZ0ZXIoc3VzcGVuZF90aW1lLCBqaWZmaWVzKSkgeworCQlpZiAoIXRpbWVyX3BlbmRpbmcoJnVkZXYtPmF1dG9zdXNwZW5kLnRpbWVyKSkgeworCisJCQkvKiBUaGUgdmFsdWUgb2YgamlmZmllcyBtYXkgY2hhbmdlIGJldHdlZW4gdGhlCisJCQkgKiB0aW1lX2FmdGVyKCkgY29tcGFyaXNvbiBhYm92ZSBhbmQgdGhlIHN1YnRyYWN0aW9uCisJCQkgKiBiZWxvdy4gIFRoYXQncyBva2F5OyB0aGUgc3lzdGVtIGJlaGF2ZXMgc2FuZWx5CisJCQkgKiB3aGVuIGEgdGltZXIgaXMgcmVnaXN0ZXJlZCBmb3IgdGhlIHByZXNlbnQgbW9tZW50CisJCQkgKiBvciBmb3IgdGhlIHBhc3QuCisJCQkgKi8KKwkJCXF1ZXVlX2RlbGF5ZWRfd29yayhrc3VzcGVuZF91c2Jfd3EsICZ1ZGV2LT5hdXRvc3VzcGVuZCwKKwkJCQkJc3VzcGVuZF90aW1lIC0gamlmZmllcyk7CisJCQl9CisJCXJldHVybiAtRUFHQUlOOworCX0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMTAzMywyNiArMTAyMywyNSBAQAogICoKICAqIFRoaXMgcm91dGluZSBjYW4gcnVuIG9ubHkgaW4gcHJvY2VzcyBjb250ZXh0LgogICovCi1pbnQgdXNiX3N1c3BlbmRfYm90aChzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwgcG1fbWVzc2FnZV90IG1zZykKK3N0YXRpYyBpbnQgdXNiX3N1c3BlbmRfYm90aChzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwgcG1fbWVzc2FnZV90IG1zZykKIHsKIAlpbnQJCQlzdGF0dXMgPSAwOwogCWludAkJCWkgPSAwOwogCXN0cnVjdCB1c2JfaW50ZXJmYWNlCSppbnRmOwogCXN0cnVjdCB1c2JfZGV2aWNlCSpwYXJlbnQgPSB1ZGV2LT5wYXJlbnQ7CiAKLQljYW5jZWxfZGVsYXllZF93b3JrKCZ1ZGV2LT5hdXRvc3VzcGVuZCk7Ci0JaWYgKHVkZXYtPnN0YXRlID09IFVTQl9TVEFURV9OT1RBVFRBQ0hFRCkKLQkJcmV0dXJuIDA7Ci0JaWYgKHVkZXYtPnN0YXRlID09IFVTQl9TVEFURV9TVVNQRU5ERUQpCi0JCXJldHVybiAwOworCWlmICh1ZGV2LT5zdGF0ZSA9PSBVU0JfU1RBVEVfTk9UQVRUQUNIRUQgfHwKKwkJCXVkZXYtPnN0YXRlID09IFVTQl9TVEFURV9TVVNQRU5ERUQpCisJCWdvdG8gZG9uZTsKIAogCXVkZXYtPmRvX3JlbW90ZV93YWtldXAgPSBkZXZpY2VfbWF5X3dha2V1cCgmdWRldi0+ZGV2KTsKIAogCWlmICh1ZGV2LT5hdXRvX3BtKSB7CiAJCXN0YXR1cyA9IGF1dG9zdXNwZW5kX2NoZWNrKHVkZXYpOwogCQlpZiAoc3RhdHVzIDwgMCkKLQkJCXJldHVybiBzdGF0dXM7CisJCQlnb3RvIGRvbmU7CiAJfQorCWNhbmNlbF9kZWxheWVkX3dvcmsoJnVkZXYtPmF1dG9zdXNwZW5kKTsKIAogCS8qIFN1c3BlbmQgYWxsIHRoZSBpbnRlcmZhY2VzIGFuZCB0aGVuIHVkZXYgaXRzZWxmICovCiAJaWYgKHVkZXYtPmFjdGNvbmZpZykgewpAQCAtMTA3Nyw2ICsxMDY2LDcgQEAKIAl9IGVsc2UgaWYgKHBhcmVudCkKIAkJdXNiX2F1dG9zdXNwZW5kX2RldmljZShwYXJlbnQpOwogCisgZG9uZToKIAkvLyBkZXZfZGJnKCZ1ZGV2LT5kZXYsICIlczogc3RhdHVzICVkXG4iLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTExMDksNyArMTA5OSw3IEBACiAgKgogICogVGhpcyByb3V0aW5lIGNhbiBydW4gb25seSBpbiBwcm9jZXNzIGNvbnRleHQuCiAgKi8KLWludCB1c2JfcmVzdW1lX2JvdGgoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpCitzdGF0aWMgaW50IHVzYl9yZXN1bWVfYm90aChzdHJ1Y3QgdXNiX2RldmljZSAqdWRldikKIHsKIAlpbnQJCQlzdGF0dXMgPSAwOwogCWludAkJCWk7CkBAIC0xMTE3LDExICsxMTA3LDE3IEBACiAJc3RydWN0IHVzYl9kZXZpY2UJKnBhcmVudCA9IHVkZXYtPnBhcmVudDsKIAogCWNhbmNlbF9kZWxheWVkX3dvcmsoJnVkZXYtPmF1dG9zdXNwZW5kKTsKLQlpZiAodWRldi0+c3RhdGUgPT0gVVNCX1NUQVRFX05PVEFUVEFDSEVEKQotCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAodWRldi0+c3RhdGUgPT0gVVNCX1NUQVRFX05PVEFUVEFDSEVEKSB7CisJCXN0YXR1cyA9IC1FTk9ERVY7CisJCWdvdG8gZG9uZTsKKwl9CiAKIAkvKiBQcm9wYWdhdGUgdGhlIHJlc3VtZSB1cCB0aGUgdHJlZSwgaWYgbmVjZXNzYXJ5ICovCiAJaWYgKHVkZXYtPnN0YXRlID09IFVTQl9TVEFURV9TVVNQRU5ERUQpIHsKKwkJaWYgKHVkZXYtPmF1dG9fcG0gJiYgdWRldi0+YXV0b3Jlc3VtZV9kaXNhYmxlZCkgeworCQkJc3RhdHVzID0gLUVQRVJNOworCQkJZ290byBkb25lOworCQl9CiAJCWlmIChwYXJlbnQpIHsKIAkJCXN0YXR1cyA9IHVzYl9hdXRvcmVzdW1lX2RldmljZShwYXJlbnQpOwogCQkJaWYgKHN0YXR1cyA9PSAwKSB7CkBAIC0xMTY3LDYgKzExNjMsNyBAQAogCQl9CiAJfQogCisgZG9uZToKIAkvLyBkZXZfZGJnKCZ1ZGV2LT5kZXYsICIlczogc3RhdHVzICVkXG4iLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTExODEsMjAgKzExNzgsMzQgQEAKIAlpbnQJc3RhdHVzID0gMDsKIAogCXVzYl9wbV9sb2NrKHVkZXYpOworCXVkZXYtPmF1dG9fcG0gPSAxOwogCXVkZXYtPnBtX3VzYWdlX2NudCArPSBpbmNfdXNhZ2VfY250OwogCVdBUk5fT04odWRldi0+cG1fdXNhZ2VfY250IDwgMCk7CiAJaWYgKGluY191c2FnZV9jbnQgPj0gMCAmJiB1ZGV2LT5wbV91c2FnZV9jbnQgPiAwKSB7Ci0JCXVkZXYtPmF1dG9fcG0gPSAxOwotCQlzdGF0dXMgPSB1c2JfcmVzdW1lX2JvdGgodWRldik7CisJCWlmICh1ZGV2LT5zdGF0ZSA9PSBVU0JfU1RBVEVfU1VTUEVOREVEKQorCQkJc3RhdHVzID0gdXNiX3Jlc3VtZV9ib3RoKHVkZXYpOwogCQlpZiAoc3RhdHVzICE9IDApCiAJCQl1ZGV2LT5wbV91c2FnZV9jbnQgLT0gaW5jX3VzYWdlX2NudDsKLQl9IGVsc2UgaWYgKGluY191c2FnZV9jbnQgPD0gMCAmJiBhdXRvc3VzcGVuZF9jaGVjayh1ZGV2KSA9PSAwKQotCQlxdWV1ZV9kZWxheWVkX3dvcmsoa3N1c3BlbmRfdXNiX3dxLCAmdWRldi0+YXV0b3N1c3BlbmQsCi0JCQkJdWRldi0+YXV0b3N1c3BlbmRfZGVsYXkpOworCQllbHNlIGlmIChpbmNfdXNhZ2VfY250KQorCQkJdWRldi0+bGFzdF9idXN5ID0gamlmZmllczsKKwl9IGVsc2UgaWYgKGluY191c2FnZV9jbnQgPD0gMCAmJiB1ZGV2LT5wbV91c2FnZV9jbnQgPD0gMCkgeworCQlpZiAoaW5jX3VzYWdlX2NudCkKKwkJCXVkZXYtPmxhc3RfYnVzeSA9IGppZmZpZXM7CisJCXN0YXR1cyA9IHVzYl9zdXNwZW5kX2JvdGgodWRldiwgUE1TR19TVVNQRU5EKTsKKwl9CiAJdXNiX3BtX3VubG9jayh1ZGV2KTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCisvKiB1c2JfYXV0b3N1c3BlbmRfd29yayAtIGNhbGxiYWNrIHJvdXRpbmUgdG8gYXV0b3N1c3BlbmQgYSBVU0IgZGV2aWNlICovCit2b2lkIHVzYl9hdXRvc3VzcGVuZF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgdXNiX2RldmljZSwgYXV0b3N1c3BlbmQud29yayk7CisKKwl1c2JfYXV0b3BtX2RvX2RldmljZSh1ZGV2LCAwKTsKK30KKwogLyoqCiAgKiB1c2JfYXV0b3N1c3BlbmRfZGV2aWNlIC0gZGVsYXllZCBhdXRvc3VzcGVuZCBvZiBhIFVTQiBkZXZpY2UgYW5kIGl0cyBpbnRlcmZhY2VzCiAgKiBAdWRldjogdGhlIHVzYl9kZXZpY2UgdG8gYXV0b3N1c3BlbmQKQEAgLTEyODYsMTUgKzEyOTcsMjAgQEAKIAlpZiAoaW50Zi0+Y29uZGl0aW9uID09IFVTQl9JTlRFUkZBQ0VfVU5CT1VORCkKIAkJc3RhdHVzID0gLUVOT0RFVjsKIAllbHNlIHsKKwkJdWRldi0+YXV0b19wbSA9IDE7CiAJCWludGYtPnBtX3VzYWdlX2NudCArPSBpbmNfdXNhZ2VfY250OwogCQlpZiAoaW5jX3VzYWdlX2NudCA+PSAwICYmIGludGYtPnBtX3VzYWdlX2NudCA+IDApIHsKLQkJCXVkZXYtPmF1dG9fcG0gPSAxOwotCQkJc3RhdHVzID0gdXNiX3Jlc3VtZV9ib3RoKHVkZXYpOworCQkJaWYgKHVkZXYtPnN0YXRlID09IFVTQl9TVEFURV9TVVNQRU5ERUQpCisJCQkJc3RhdHVzID0gdXNiX3Jlc3VtZV9ib3RoKHVkZXYpOwogCQkJaWYgKHN0YXR1cyAhPSAwKQogCQkJCWludGYtPnBtX3VzYWdlX2NudCAtPSBpbmNfdXNhZ2VfY250OwotCQl9IGVsc2UgaWYgKGluY191c2FnZV9jbnQgPD0gMCAmJiBhdXRvc3VzcGVuZF9jaGVjayh1ZGV2KSA9PSAwKQotCQkJcXVldWVfZGVsYXllZF93b3JrKGtzdXNwZW5kX3VzYl93cSwgJnVkZXYtPmF1dG9zdXNwZW5kLAotCQkJCQl1ZGV2LT5hdXRvc3VzcGVuZF9kZWxheSk7CisJCQllbHNlIGlmIChpbmNfdXNhZ2VfY250KQorCQkJCXVkZXYtPmxhc3RfYnVzeSA9IGppZmZpZXM7CisJCX0gZWxzZSBpZiAoaW5jX3VzYWdlX2NudCA8PSAwICYmIGludGYtPnBtX3VzYWdlX2NudCA8PSAwKSB7CisJCQlpZiAoaW5jX3VzYWdlX2NudCkKKwkJCQl1ZGV2LT5sYXN0X2J1c3kgPSBqaWZmaWVzOworCQkJc3RhdHVzID0gdXNiX3N1c3BlbmRfYm90aCh1ZGV2LCBQTVNHX1NVU1BFTkQpOworCQl9CiAJfQogCXVzYl9wbV91bmxvY2sodWRldik7CiAJcmV0dXJuIHN0YXR1czsKQEAgLTEzNTMsMTEgKzEzNjksMTQgQEAKICAqIG9yIEBpbnRmIGlzIHVuYm91bmQuICBBIHR5cGljYWwgZXhhbXBsZSB3b3VsZCBiZSBhIGNoYXJhY3Rlci1kZXZpY2UKICAqIGRyaXZlciB3aGVuIGl0cyBkZXZpY2UgZmlsZSBpcyBvcGVuZWQuCiAgKgotICogVGhlIHJvdXRpbmUgaW5jcmVtZW50cyBAaW50ZidzIHVzYWdlIGNvdW50ZXIuICBTbyBsb25nIGFzIHRoZSBjb3VudGVyCi0gKiBpcyBncmVhdGVyIHRoYW4gMCwgYXV0b3N1c3BlbmQgd2lsbCBub3QgYmUgYWxsb3dlZCBmb3IgQGludGYgb3IgaXRzCi0gKiB1c2JfZGV2aWNlLiAgV2hlbiB0aGUgZHJpdmVyIGlzIGZpbmlzaGVkIHVzaW5nIEBpbnRmIGl0IHNob3VsZCBjYWxsCi0gKiB1c2JfYXV0b3BtX3B1dF9pbnRlcmZhY2UoKSB0byBkZWNyZW1lbnQgdGhlIHVzYWdlIGNvdW50ZXIgYW5kIHF1ZXVlCi0gKiBhIGRlbGF5ZWQgYXV0b3N1c3BlbmQgcmVxdWVzdCAoaWYgdGhlIGNvdW50ZXIgaXMgPD0gMCkuCisgKgorICogVGhlIHJvdXRpbmUgaW5jcmVtZW50cyBAaW50ZidzIHVzYWdlIGNvdW50ZXIuICAoSG93ZXZlciBpZiB0aGUKKyAqIGF1dG9yZXN1bWUgZmFpbHMgdGhlbiB0aGUgY291bnRlciBpcyByZS1kZWNyZW1lbnRlZC4pICBTbyBsb25nIGFzIHRoZQorICogY291bnRlciBpcyBncmVhdGVyIHRoYW4gMCwgYXV0b3N1c3BlbmQgd2lsbCBub3QgYmUgYWxsb3dlZCBmb3IgQGludGYKKyAqIG9yIGl0cyB1c2JfZGV2aWNlLiAgV2hlbiB0aGUgZHJpdmVyIGlzIGZpbmlzaGVkIHVzaW5nIEBpbnRmIGl0IHNob3VsZAorICogY2FsbCB1c2JfYXV0b3BtX3B1dF9pbnRlcmZhY2UoKSB0byBkZWNyZW1lbnQgdGhlIHVzYWdlIGNvdW50ZXIgYW5kCisgKiBxdWV1ZSBhIGRlbGF5ZWQgYXV0b3N1c3BlbmQgcmVxdWVzdCAoaWYgdGhlIGNvdW50ZXIgaXMgPD0gMCkuCisgKgogICoKICAqIE5vdGUgdGhhdCBAaW50Zi0+cG1fdXNhZ2VfY250IGlzIG93bmVkIGJ5IHRoZSBpbnRlcmZhY2UgZHJpdmVyLiAgVGhlCiAgKiBjb3JlIHdpbGwgbm90IGNoYW5nZSBpdHMgdmFsdWUgb3RoZXIgdGhhbiB0aGUgaW5jcmVtZW50IGFuZCBkZWNyZW1lbnQKQEAgLTE0MDUsNTAgKzE0MjQsOTYgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHVzYl9hdXRvcG1fc2V0X2ludGVyZmFjZSk7CiAKKyNlbHNlCisKK3ZvaWQgdXNiX2F1dG9zdXNwZW5kX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQore30KKwogI2VuZGlmIC8qIENPTkZJR19VU0JfU1VTUEVORCAqLwogCi1zdGF0aWMgaW50IHVzYl9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IG1lc3NhZ2UpCisvKioKKyAqIHVzYl9leHRlcm5hbF9zdXNwZW5kX2RldmljZSAtIGV4dGVybmFsIHN1c3BlbmQgb2YgYSBVU0IgZGV2aWNlIGFuZCBpdHMgaW50ZXJmYWNlcworICogQHVkZXY6IHRoZSB1c2JfZGV2aWNlIHRvIHN1c3BlbmQKKyAqIEBtc2c6IFBvd2VyIE1hbmFnZW1lbnQgbWVzc2FnZSBkZXNjcmliaW5nIHRoaXMgc3RhdGUgdHJhbnNpdGlvbgorICoKKyAqIFRoaXMgcm91dGluZSBoYW5kbGVzIGV4dGVybmFsIHN1c3BlbmQgcmVxdWVzdHM6IG9uZXMgbm90IGdlbmVyYXRlZAorICogaW50ZXJuYWxseSBieSBhIFVTQiBkcml2ZXIgKGF1dG9zdXNwZW5kKSBidXQgcmF0aGVyIGNvbWluZyBmcm9tIHRoZSB1c2VyCisgKiAodmlhIHN5c2ZzKSBvciB0aGUgUE0gY29yZSAoc3lzdGVtIHNsZWVwKS4gIFRoZSBzdXNwZW5kIHdpbGwgYmUgY2FycmllZAorICogb3V0IHJlZ2FyZGxlc3Mgb2YgQHVkZXYncyB1c2FnZSBjb3VudGVyIG9yIHRob3NlIG9mIGl0cyBpbnRlcmZhY2VzLAorICogYW5kIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBvciBub3QgcmVtb3RlIHdha2V1cCBpcyBlbmFibGVkLiAgT2YgY291cnNlLAorICogaW50ZXJmYWNlIGRyaXZlcnMgc3RpbGwgaGF2ZSB0aGUgb3B0aW9uIG9mIGZhaWxpbmcgdGhlIHN1c3BlbmQgKGlmCisgKiB0aGVyZSBhcmUgdW5zdXNwZW5kZWQgY2hpbGRyZW4sIGZvciBleGFtcGxlKS4KKyAqCisgKiBUaGUgY2FsbGVyIG11c3QgaG9sZCBAdWRldidzIGRldmljZSBsb2NrLgorICovCitpbnQgdXNiX2V4dGVybmFsX3N1c3BlbmRfZGV2aWNlKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LCBwbV9tZXNzYWdlX3QgbXNnKQogewogCWludAlzdGF0dXM7CiAKLQlpZiAoaXNfdXNiX2RldmljZShkZXYpKSB7Ci0JCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gdG9fdXNiX2RldmljZShkZXYpOwotCi0JCXVzYl9wbV9sb2NrKHVkZXYpOwotCQl1ZGV2LT5hdXRvX3BtID0gMDsKLQkJc3RhdHVzID0gdXNiX3N1c3BlbmRfYm90aCh1ZGV2LCBtZXNzYWdlKTsKLQkJdXNiX3BtX3VubG9jayh1ZGV2KTsKLQl9IGVsc2UKLQkJc3RhdHVzID0gMDsKKwl1c2JfcG1fbG9jayh1ZGV2KTsKKwl1ZGV2LT5hdXRvX3BtID0gMDsKKwlzdGF0dXMgPSB1c2Jfc3VzcGVuZF9ib3RoKHVkZXYsIG1zZyk7CisJdXNiX3BtX3VubG9jayh1ZGV2KTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCisvKioKKyAqIHVzYl9leHRlcm5hbF9yZXN1bWVfZGV2aWNlIC0gZXh0ZXJuYWwgcmVzdW1lIG9mIGEgVVNCIGRldmljZSBhbmQgaXRzIGludGVyZmFjZXMKKyAqIEB1ZGV2OiB0aGUgdXNiX2RldmljZSB0byByZXN1bWUKKyAqCisgKiBUaGlzIHJvdXRpbmUgaGFuZGxlcyBleHRlcm5hbCByZXN1bWUgcmVxdWVzdHM6IG9uZXMgbm90IGdlbmVyYXRlZAorICogaW50ZXJuYWxseSBieSBhIFVTQiBkcml2ZXIgKGF1dG9yZXN1bWUpIGJ1dCByYXRoZXIgY29taW5nIGZyb20gdGhlIHVzZXIKKyAqICh2aWEgc3lzZnMpLCB0aGUgUE0gY29yZSAoc3lzdGVtIHJlc3VtZSksIG9yIHRoZSBkZXZpY2UgaXRzZWxmIChyZW1vdGUKKyAqIHdha2V1cCkuICBAdWRldidzIHVzYWdlIGNvdW50ZXIgaXMgdW5hZmZlY3RlZC4KKyAqCisgKiBUaGUgY2FsbGVyIG11c3QgaG9sZCBAdWRldidzIGRldmljZSBsb2NrLgorICovCitpbnQgdXNiX2V4dGVybmFsX3Jlc3VtZV9kZXZpY2Uoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpCit7CisJaW50CXN0YXR1czsKKworCXVzYl9wbV9sb2NrKHVkZXYpOworCXVkZXYtPmF1dG9fcG0gPSAwOworCXN0YXR1cyA9IHVzYl9yZXN1bWVfYm90aCh1ZGV2KTsKKwl1c2JfcG1fdW5sb2NrKHVkZXYpOworCisJLyogTm93IHRoYXQgdGhlIGRldmljZSBpcyBhd2FrZSwgd2UgY2FuIHN0YXJ0IHRyeWluZyB0byBhdXRvc3VzcGVuZAorCSAqIGl0IGFnYWluLiAqLworCWlmIChzdGF0dXMgPT0gMCkKKwkJdXNiX3RyeV9hdXRvc3VzcGVuZF9kZXZpY2UodWRldik7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCB1c2Jfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBtZXNzYWdlKQoreworCWlmICghaXNfdXNiX2RldmljZShkZXYpKQkvKiBJZ25vcmUgUE0gZm9yIGludGVyZmFjZXMgKi8KKwkJcmV0dXJuIDA7CisJcmV0dXJuIHVzYl9leHRlcm5hbF9zdXNwZW5kX2RldmljZSh0b191c2JfZGV2aWNlKGRldiksIG1lc3NhZ2UpOworfQorCiBzdGF0aWMgaW50IHVzYl9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQogewotCWludAlzdGF0dXM7CisJc3RydWN0IHVzYl9kZXZpY2UJKnVkZXY7CiAKLQlpZiAoaXNfdXNiX2RldmljZShkZXYpKSB7Ci0JCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gdG9fdXNiX2RldmljZShkZXYpOwotCi0JCXVzYl9wbV9sb2NrKHVkZXYpOwotCQl1ZGV2LT5hdXRvX3BtID0gMDsKLQkJc3RhdHVzID0gdXNiX3Jlc3VtZV9ib3RoKHVkZXYpOwotCQl1c2JfcG1fdW5sb2NrKHVkZXYpOwotCi0JCS8qIFJlYmluZCBkcml2ZXJzIHRoYXQgaGFkIG5vIHN1c3BlbmQgbWV0aG9kPyAqLwotCX0gZWxzZQotCQlzdGF0dXMgPSAwOwotCXJldHVybiBzdGF0dXM7CisJaWYgKCFpc191c2JfZGV2aWNlKGRldikpCS8qIElnbm9yZSBQTSBmb3IgaW50ZXJmYWNlcyAqLworCQlyZXR1cm4gMDsKKwl1ZGV2ID0gdG9fdXNiX2RldmljZShkZXYpOworCWlmICh1ZGV2LT5hdXRvcmVzdW1lX2Rpc2FibGVkKQorCQlyZXR1cm4gLUVQRVJNOworCXJldHVybiB1c2JfZXh0ZXJuYWxfcmVzdW1lX2RldmljZSh1ZGV2KTsKIH0KIAorI2Vsc2UKKworI2RlZmluZSB1c2Jfc3VzcGVuZAlOVUxMCisjZGVmaW5lIHVzYl9yZXN1bWUJTlVMTAorCiAjZW5kaWYgLyogQ09ORklHX1BNICovCiAKIHN0cnVjdCBidXNfdHlwZSB1c2JfYnVzX3R5cGUgPSB7CiAJLm5hbWUgPQkJInVzYiIsCiAJLm1hdGNoID0JdXNiX2RldmljZV9tYXRjaCwKIAkudWV2ZW50ID0JdXNiX3VldmVudCwKLSNpZmRlZiBDT05GSUdfUE0KIAkuc3VzcGVuZCA9CXVzYl9zdXNwZW5kLAogCS5yZXN1bWUgPQl1c2JfcmVzdW1lLAotI2VuZGlmCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS9oY2QuYyBiL2RyaXZlcnMvdXNiL2NvcmUvaGNkLmMKaW5kZXggYjI2YzE5ZS4uNDBjZjg4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9oY2QuYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL2hjZC5jCkBAIC0zNyw2ICszNyw3IEBACiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KIAogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgogCkBAIC01NDQsNiArNTQ1LDggQEAKIAl1bnNpZ25lZCBsb25nCWZsYWdzOwogCWNoYXIJCWJ1ZmZlcls0XTsJLyogQW55IHJvb3QgaHVicyB3aXRoID4gMzEgcG9ydHM/ICovCiAKKwlpZiAodW5saWtlbHkoIWhjZC0+cmhfcmVnaXN0ZXJlZCkpCisJCXJldHVybjsKIAlpZiAoIWhjZC0+dXNlc19uZXdfcG9sbGluZyAmJiAhaGNkLT5zdGF0dXNfdXJiKQogCQlyZXR1cm47CiAKQEAgLTEyOTYsMTQgKzEyOTksMjYgQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCisvKiBXb3JrcXVldWUgcm91dGluZSBmb3Igcm9vdC1odWIgcmVtb3RlIHdha2V1cCAqLworc3RhdGljIHZvaWQgaGNkX3Jlc3VtZV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgdXNiX2hjZCAqaGNkID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB1c2JfaGNkLCB3YWtldXBfd29yayk7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBoY2QtPnNlbGYucm9vdF9odWI7CisKKwl1c2JfbG9ja19kZXZpY2UodWRldik7CisJdXNiX21hcmtfbGFzdF9idXN5KHVkZXYpOworCXVzYl9leHRlcm5hbF9yZXN1bWVfZGV2aWNlKHVkZXYpOworCXVzYl91bmxvY2tfZGV2aWNlKHVkZXYpOworfQorCiAvKioKICAqIHVzYl9oY2RfcmVzdW1lX3Jvb3RfaHViIC0gY2FsbGVkIGJ5IEhDRCB0byByZXN1bWUgaXRzIHJvb3QgaHViIAogICogQGhjZDogaG9zdCBjb250cm9sbGVyIGZvciB0aGlzIHJvb3QgaHViCiAgKgogICogVGhlIFVTQiBob3N0IGNvbnRyb2xsZXIgY2FsbHMgdGhpcyBmdW5jdGlvbiB3aGVuIGl0cyByb290IGh1YiBpcwogICogc3VzcGVuZGVkICh3aXRoIHRoZSByZW1vdGUgd2FrZXVwIGZlYXR1cmUgZW5hYmxlZCkgYW5kIGEgcmVtb3RlCi0gKiB3YWtldXAgcmVxdWVzdCBpcyByZWNlaXZlZC4gIEl0IHF1ZXVlcyBhIHJlcXVlc3QgZm9yIGtodWJkIHRvCi0gKiByZXN1bWUgdGhlIHJvb3QgaHViICh0aGF0IGlzLCBtYW5hZ2UgaXRzIGRvd25zdHJlYW0gcG9ydHMgYWdhaW4pLgorICogd2FrZXVwIHJlcXVlc3QgaXMgcmVjZWl2ZWQuICBUaGUgcm91dGluZSBzdWJtaXRzIGEgd29ya3F1ZXVlIHJlcXVlc3QKKyAqIHRvIHJlc3VtZSB0aGUgcm9vdCBodWIgKHRoYXQgaXMsIG1hbmFnZSBpdHMgZG93bnN0cmVhbSBwb3J0cyBhZ2FpbikuCiAgKi8KIHZvaWQgdXNiX2hjZF9yZXN1bWVfcm9vdF9odWIgKHN0cnVjdCB1c2JfaGNkICpoY2QpCiB7CkBAIC0xMzExLDcgKzEzMjYsNyBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUgKCZoY2Rfcm9vdF9odWJfbG9jaywgZmxhZ3MpOwogCWlmIChoY2QtPnJoX3JlZ2lzdGVyZWQpCi0JCXVzYl9yZXN1bWVfcm9vdF9odWIgKGhjZC0+c2VsZi5yb290X2h1Yik7CisJCXF1ZXVlX3dvcmsoa3N1c3BlbmRfdXNiX3dxLCAmaGNkLT53YWtldXBfd29yayk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJmhjZF9yb290X2h1Yl9sb2NrLCBmbGFncyk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh1c2JfaGNkX3Jlc3VtZV9yb290X2h1Yik7CkBAIC0xNTAwLDYgKzE1MTUsOSBAQAogCWluaXRfdGltZXIoJmhjZC0+cmhfdGltZXIpOwogCWhjZC0+cmhfdGltZXIuZnVuY3Rpb24gPSByaF90aW1lcl9mdW5jOwogCWhjZC0+cmhfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBoY2Q7CisjaWZkZWYgQ09ORklHX1BNCisJSU5JVF9XT1JLKCZoY2QtPndha2V1cF93b3JrLCBoY2RfcmVzdW1lX3dvcmspOworI2VuZGlmCiAKIAloY2QtPmRyaXZlciA9IGRyaXZlcjsKIAloY2QtPnByb2R1Y3RfZGVzYyA9IChkcml2ZXItPnByb2R1Y3RfZGVzYykgPyBkcml2ZXItPnByb2R1Y3RfZGVzYyA6CkBAIC0xNjY2LDE2ICsxNjg0LDIwIEBACiAJaGNkLT5yaF9yZWdpc3RlcmVkID0gMDsKIAlzcGluX3VubG9ja19pcnEgKCZoY2Rfcm9vdF9odWJfbG9jayk7CiAKKyNpZmRlZiBDT05GSUdfUE0KKwlmbHVzaF93b3JrcXVldWUoa3N1c3BlbmRfdXNiX3dxKTsKKyNlbmRpZgorCiAJbXV0ZXhfbG9jaygmdXNiX2J1c19saXN0X2xvY2spOwogCXVzYl9kaXNjb25uZWN0KCZoY2QtPnNlbGYucm9vdF9odWIpOwogCW11dGV4X3VubG9jaygmdXNiX2J1c19saXN0X2xvY2spOwogCi0JaGNkLT5wb2xsX3JoID0gMDsKLQlkZWxfdGltZXJfc3luYygmaGNkLT5yaF90aW1lcik7Ci0KIAloY2QtPmRyaXZlci0+c3RvcChoY2QpOwogCWhjZC0+c3RhdGUgPSBIQ19TVEFURV9IQUxUOwogCisJaGNkLT5wb2xsX3JoID0gMDsKKwlkZWxfdGltZXJfc3luYygmaGNkLT5yaF90aW1lcik7CisKIAlpZiAoaGNkLT5pcnEgPj0gMCkKIAkJZnJlZV9pcnEoaGNkLT5pcnEsIGhjZCk7CiAJdXNiX2RlcmVnaXN0ZXJfYnVzKCZoY2QtPnNlbGYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS9oY2QuaCBiL2RyaXZlcnMvdXNiL2NvcmUvaGNkLmgKaW5kZXggMmEyNjljYS4uZWY1MGZhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9oY2QuaAorKysgYi9kcml2ZXJzL3VzYi9jb3JlL2hjZC5oCkBAIC02OCw2ICs2OCw5IEBACiAKIAlzdHJ1Y3QgdGltZXJfbGlzdAlyaF90aW1lcjsJLyogZHJpdmVzIHJvb3QtaHViIHBvbGxpbmcgKi8KIAlzdHJ1Y3QgdXJiCQkqc3RhdHVzX3VyYjsJLyogdGhlIGN1cnJlbnQgc3RhdHVzIHVyYiAqLworI2lmZGVmIENPTkZJR19QTQorCXN0cnVjdCB3b3JrX3N0cnVjdAl3YWtldXBfd29yazsJLyogZm9yIHJlbW90ZSB3YWtldXAgKi8KKyNlbmRpZgogCiAJLyoKIAkgKiBoYXJkd2FyZSBpbmZvL3N0YXRlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL2h1Yi5jIGIvZHJpdmVycy91c2IvY29yZS9odWIuYwppbmRleCBiODlhOThlLi5iZGUyOWFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL2h1Yi5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvaHViLmMKQEAgLTExOSw4ICsxMTksNyBAQAogCQkiZmlyc3Qgb25lIGZhaWxzIik7CiAKIAotI2lmZGVmCURFQlVHCi1zdGF0aWMgaW5saW5lIGNoYXIgKnBvcnRzcGVlZCAoaW50IHBvcnRzdGF0dXMpCitzdGF0aWMgaW5saW5lIGNoYXIgKnBvcnRzcGVlZChpbnQgcG9ydHN0YXR1cykKIHsKIAlpZiAocG9ydHN0YXR1cyAmICgxIDw8IFVTQl9QT1JUX0ZFQVRfSElHSFNQRUVEKSkKICAgICAJCXJldHVybiAiNDgwIE1iL3MiOwpAQCAtMTI5LDcgKzEyOCw2IEBACiAJZWxzZQogCQlyZXR1cm4gIjEyIE1iL3MiOwogfQotI2VuZGlmCiAKIC8qIE5vdGUgdGhhdCBoZGV2IG9yIG9uZSBvZiBpdHMgY2hpbGRyZW4gbXVzdCBiZSBsb2NrZWQhICovCiBzdGF0aWMgaW5saW5lIHN0cnVjdCB1c2JfaHViICpoZGV2X3RvX2h1YihzdHJ1Y3QgdXNiX2RldmljZSAqaGRldikKQEAgLTEzNjksMTEgKzEzNjcsMTUgQEAKIAl9CiAjZW5kaWYKIAorCS8qIGV4cG9ydCB0aGUgdXNiZGV2IGRldmljZS1ub2RlIGZvciBsaWJ1c2IgKi8KKwl1ZGV2LT5kZXYuZGV2dCA9IE1LREVWKFVTQl9ERVZJQ0VfTUFKT1IsCisJCQkoKCh1ZGV2LT5idXMtPmJ1c251bS0xKSAqIDEyOCkgKyAodWRldi0+ZGV2bnVtLTEpKSk7CisKIAkvKiBSZWdpc3RlciB0aGUgZGV2aWNlLiAgVGhlIGRldmljZSBkcml2ZXIgaXMgcmVzcG9uc2libGUKLQkgKiBmb3IgYWRkaW5nIHRoZSBkZXZpY2UgZmlsZXMgdG8gdXNiZnMgYW5kIHN5c2ZzIGFuZCBmb3IKLQkgKiBjb25maWd1cmluZyB0aGUgZGV2aWNlLgorCSAqIGZvciBhZGRpbmcgdGhlIGRldmljZSBmaWxlcyB0byBzeXNmcyBhbmQgZm9yIGNvbmZpZ3VyaW5nCisJICogdGhlIGRldmljZS4KIAkgKi8KLQllcnIgPSBkZXZpY2VfYWRkICgmdWRldi0+ZGV2KTsKKwllcnIgPSBkZXZpY2VfYWRkKCZ1ZGV2LT5kZXYpOwogCWlmIChlcnIpIHsKIAkJZGV2X2VycigmdWRldi0+ZGV2LCAiY2FuJ3QgZGV2aWNlX2FkZCwgZXJyb3IgJWRcbiIsIGVycik7CiAJCWdvdG8gZmFpbDsKQEAgLTE4NTcsMTIgKzE4NTksOCBAQAogCXVzYl9sb2NrX2RldmljZSh1ZGV2KTsKIAlpZiAodWRldi0+c3RhdGUgPT0gVVNCX1NUQVRFX1NVU1BFTkRFRCkgewogCQlkZXZfZGJnKCZ1ZGV2LT5kZXYsICJ1c2IgJXNyZXN1bWVcbiIsICJ3YWtldXAtIik7Ci0JCXN0YXR1cyA9IHVzYl9hdXRvcmVzdW1lX2RldmljZSh1ZGV2KTsKLQotCQkvKiBHaXZlIHRoZSBpbnRlcmZhY2UgZHJpdmVycyBhIGNoYW5jZSB0byBkbyBzb21ldGhpbmcsCi0JCSAqIHRoZW4gYXV0b3N1c3BlbmQgdGhlIGRldmljZSBhZ2Fpbi4gKi8KLQkJaWYgKHN0YXR1cyA9PSAwKQotCQkJdXNiX2F1dG9zdXNwZW5kX2RldmljZSh1ZGV2KTsKKwkJdXNiX21hcmtfbGFzdF9idXN5KHVkZXYpOworCQlzdGF0dXMgPSB1c2JfZXh0ZXJuYWxfcmVzdW1lX2RldmljZSh1ZGV2KTsKIAl9CiAJdXNiX3VubG9ja19kZXZpY2UodWRldik7CiAJcmV0dXJuIHN0YXR1czsKQEAgLTE5ODYsMTMgKzE5ODQsNiBAQAogI2RlZmluZSBodWJfcmVzdW1lIE5VTEwKICNlbmRpZgogCi12b2lkIHVzYl9yZXN1bWVfcm9vdF9odWIoc3RydWN0IHVzYl9kZXZpY2UgKmhkZXYpCi17Ci0Jc3RydWN0IHVzYl9odWIgKmh1YiA9IGhkZXZfdG9faHViKGhkZXYpOwotCi0Ja2lja19raHViZChodWIpOwotfQotCiAKIC8qIFVTQiAyLjAgc3BlYywgNy4xLjcuMyAvIGZpZyA3LTI5OgogICoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvaW5vZGUuYyBiL2RyaXZlcnMvdXNiL2NvcmUvaW5vZGUuYwppbmRleCAxMWRhZDIyLi5jZGRmYzYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL2lub2RlLmMKKysrIGIvZHJpdmVycy91c2IvY29yZS9pbm9kZS5jCkBAIC02NjIsNyArNjYyLDcgQEAKIAlzcHJpbnRmIChuYW1lLCAiJTAzZCIsIGRldi0+ZGV2bnVtKTsKIAlkZXYtPnVzYmZzX2RlbnRyeSA9IGZzX2NyZWF0ZV9maWxlIChuYW1lLCBkZXZtb2RlIHwgU19JRlJFRywKIAkJCQkJICAgIGRldi0+YnVzLT51c2Jmc19kZW50cnksIGRldiwKLQkJCQkJICAgICZ1c2Jmc19kZXZpY2VfZmlsZV9vcGVyYXRpb25zLAorCQkJCQkgICAgJnVzYmRldl9maWxlX29wZXJhdGlvbnMsCiAJCQkJCSAgICBkZXZ1aWQsIGRldmdpZCk7CiAJaWYgKGRldi0+dXNiZnNfZGVudHJ5ID09IE5VTEwpIHsKIAkJZXJyICgiZXJyb3IgY3JlYXRpbmcgdXNiZnMgZGV2aWNlIGVudHJ5Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL21lc3NhZ2UuYyBiL2RyaXZlcnMvdXNiL2NvcmUvbWVzc2FnZS5jCmluZGV4IDIxN2EzZDYuLmI3NDM0NzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvbWVzc2FnZS5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvbWVzc2FnZS5jCkBAIC00MTIsMTAgKzQxMiwyNCBAQAogCQlpby0+dXJicyBbaV0tPnN0YXR1cyA9IC1FSU5QUk9HUkVTUzsKIAkJaW8tPnVyYnMgW2ldLT5hY3R1YWxfbGVuZ3RoID0gMDsKIAorCQkvKgorCQkgKiBTb21lIHN5c3RlbXMgbmVlZCB0byByZXZlcnQgdG8gUElPIHdoZW4gRE1BIGlzIHRlbXBvcmFyaWx5CisJCSAqIHVuYXZhaWxhYmxlLiAgRm9yIHRoZWlyIHNha2VzLCBib3RoIHRyYW5zZmVyX2J1ZmZlciBhbmQKKwkJICogdHJhbnNmZXJfZG1hIGFyZSBzZXQgd2hlbiBwb3NzaWJsZS4gIEhvd2V2ZXIgdGhpcyBjYW4gb25seQorCQkgKiB3b3JrIG9uIHN5c3RlbXMgd2l0aG91dCBISUdITUVNLCBzaW5jZSBETUEgYnVmZmVycyBsb2NhdGVkCisJCSAqIGluIGhpZ2ggbWVtb3J5IGFyZSBub3QgZGlyZWN0bHkgYWRkcmVzc2FibGUgYnkgdGhlIENQVSBmb3IKKwkJICogUElPIC4uLiBzbyB3aGVuIEhJR0hNRU0gaXMgaW4gdXNlLCB0cmFuc2Zlcl9idWZmZXIgaXMgTlVMTAorCQkgKiB0byBwcmV2ZW50IHN0YWxlIHBvaW50ZXJzIGFuZCB0byBoZWxwIHNwb3QgYnVncy4KKwkJICovCiAJCWlmIChkbWEpIHsKLQkJCS8qIGhjIG1heSB1c2UgX29ubHlfIHRyYW5zZmVyX2RtYSAqLwogCQkJaW8tPnVyYnMgW2ldLT50cmFuc2Zlcl9kbWEgPSBzZ19kbWFfYWRkcmVzcyAoc2cgKyBpKTsKIAkJCWxlbiA9IHNnX2RtYV9sZW4gKHNnICsgaSk7CisjaWZkZWYgQ09ORklHX0hJR0hNRU0KKwkJCWlvLT51cmJzW2ldLT50cmFuc2Zlcl9idWZmZXIgPSBOVUxMOworI2Vsc2UKKwkJCWlvLT51cmJzW2ldLT50cmFuc2Zlcl9idWZmZXIgPQorCQkJCXBhZ2VfYWRkcmVzcyhzZ1tpXS5wYWdlKSArIHNnW2ldLm9mZnNldDsKKyNlbmRpZgogCQl9IGVsc2UgewogCQkJLyogaGMgbWF5IHVzZSBfb25seV8gdHJhbnNmZXJfYnVmZmVyICovCiAJCQlpby0+dXJicyBbaV0tPnRyYW5zZmVyX2J1ZmZlciA9CkBAIC0xMzA1LDcgKzEzMTksNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCByZWxlYXNlX2ludGVyZmFjZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit2b2lkIHVzYl9yZWxlYXNlX2ludGVyZmFjZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYgPSB0b191c2JfaW50ZXJmYWNlKGRldik7CiAJc3RydWN0IHVzYl9pbnRlcmZhY2VfY2FjaGUgKmludGZjID0KQEAgLTEzMTUsNiArMTMyOSw2NyBAQAogCWtmcmVlKGludGYpOwogfQogCisjaWZkZWYJQ09ORklHX0hPVFBMVUcKK3N0YXRpYyBpbnQgdXNiX2lmX3VldmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKiplbnZwLCBpbnQgbnVtX2VudnAsCisJCSBjaGFyICpidWZmZXIsIGludCBidWZmZXJfc2l6ZSkKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldjsKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZjsKKwlzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICphbHQ7CisJaW50IGkgPSAwOworCWludCBsZW5ndGggPSAwOworCisJaWYgKCFkZXYpCisJCXJldHVybiAtRU5PREVWOworCisJLyogZHJpdmVyIGlzIG9mdGVuIG51bGwgaGVyZTsgZGV2X2RiZygpIHdvdWxkIG9vcHMgKi8KKwlwcl9kZWJ1ZyAoInVzYiAlczogdWV2ZW50XG4iLCBkZXYtPmJ1c19pZCk7CisKKwlpbnRmID0gdG9fdXNiX2ludGVyZmFjZShkZXYpOworCXVzYl9kZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOworCWFsdCA9IGludGYtPmN1cl9hbHRzZXR0aW5nOworCisJaWYgKGFkZF91ZXZlbnRfdmFyKGVudnAsIG51bV9lbnZwLCAmaSwKKwkJICAgYnVmZmVyLCBidWZmZXJfc2l6ZSwgJmxlbmd0aCwKKwkJICAgIklOVEVSRkFDRT0lZC8lZC8lZCIsCisJCSAgIGFsdC0+ZGVzYy5iSW50ZXJmYWNlQ2xhc3MsCisJCSAgIGFsdC0+ZGVzYy5iSW50ZXJmYWNlU3ViQ2xhc3MsCisJCSAgIGFsdC0+ZGVzYy5iSW50ZXJmYWNlUHJvdG9jb2wpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChhZGRfdWV2ZW50X3ZhcihlbnZwLCBudW1fZW52cCwgJmksCisJCSAgIGJ1ZmZlciwgYnVmZmVyX3NpemUsICZsZW5ndGgsCisJCSAgICJNT0RBTElBUz11c2I6diUwNFhwJTA0WGQlMDRYZGMlMDJYZHNjJTAyWGRwJTAyWGljJTAyWGlzYyUwMlhpcCUwMlgiLAorCQkgICBsZTE2X3RvX2NwdSh1c2JfZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKSwKKwkJICAgbGUxNl90b19jcHUodXNiX2Rldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpLAorCQkgICBsZTE2X3RvX2NwdSh1c2JfZGV2LT5kZXNjcmlwdG9yLmJjZERldmljZSksCisJCSAgIHVzYl9kZXYtPmRlc2NyaXB0b3IuYkRldmljZUNsYXNzLAorCQkgICB1c2JfZGV2LT5kZXNjcmlwdG9yLmJEZXZpY2VTdWJDbGFzcywKKwkJICAgdXNiX2Rldi0+ZGVzY3JpcHRvci5iRGV2aWNlUHJvdG9jb2wsCisJCSAgIGFsdC0+ZGVzYy5iSW50ZXJmYWNlQ2xhc3MsCisJCSAgIGFsdC0+ZGVzYy5iSW50ZXJmYWNlU3ViQ2xhc3MsCisJCSAgIGFsdC0+ZGVzYy5iSW50ZXJmYWNlUHJvdG9jb2wpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWVudnBbaV0gPSBOVUxMOworCXJldHVybiAwOworfQorCisjZWxzZQorCitzdGF0aWMgaW50IHVzYl9pZl91ZXZlbnQoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICoqZW52cCwKKwkJCSBpbnQgbnVtX2VudnAsIGNoYXIgKmJ1ZmZlciwgaW50IGJ1ZmZlcl9zaXplKQoreworCXJldHVybiAtRU5PREVWOworfQorI2VuZGlmCS8qIENPTkZJR19IT1RQTFVHICovCisKK3N0cnVjdCBkZXZpY2VfdHlwZSB1c2JfaWZfZGV2aWNlX3R5cGUgPSB7CisJLm5hbWUgPQkJInVzYl9pbnRlcmZhY2UiLAorCS5yZWxlYXNlID0JdXNiX3JlbGVhc2VfaW50ZXJmYWNlLAorCS51ZXZlbnQgPQl1c2JfaWZfdWV2ZW50LAorfTsKKwogLyoKICAqIHVzYl9zZXRfY29uZmlndXJhdGlvbiAtIE1ha2VzIGEgcGFydGljdWxhciBkZXZpY2Ugc2V0dGluZyBiZSBjdXJyZW50CiAgKiBAZGV2OiB0aGUgZGV2aWNlIHdob3NlIGNvbmZpZ3VyYXRpb24gaXMgYmVpbmcgdXBkYXRlZApAQCAtMTM0OSw3ICsxNDI0LDcgQEAKICAqCiAgKiBUaGlzIGNhbGwgaXMgc3luY2hyb25vdXMuIFRoZSBjYWxsaW5nIGNvbnRleHQgbXVzdCBiZSBhYmxlIHRvIHNsZWVwLAogICogbXVzdCBvd24gdGhlIGRldmljZSBsb2NrLCBhbmQgbXVzdCBub3QgaG9sZCB0aGUgZHJpdmVyIG1vZGVsJ3MgVVNCCi0gKiBidXMgcndzZW07IHVzYiBkZXZpY2UgZHJpdmVyIHByb2JlKCkgbWV0aG9kcyBjYW5ub3QgdXNlIHRoaXMgcm91dGluZS4KKyAqIGJ1cyBtdXRleDsgdXNiIGRldmljZSBkcml2ZXIgcHJvYmUoKSBtZXRob2RzIGNhbm5vdCB1c2UgdGhpcyByb3V0aW5lLgogICoKICAqIFJldHVybnMgemVybyBvbiBzdWNjZXNzLCBvciBlbHNlIHRoZSBzdGF0dXMgY29kZSByZXR1cm5lZCBieSB0aGUKICAqIHVuZGVybHlpbmcgY2FsbCB0aGF0IGZhaWxlZC4gIE9uIHN1Y2Nlc3NmdWwgY29tcGxldGlvbiwgZWFjaCBpbnRlcmZhY2UKQEAgLTE0NzgsOCArMTU1Myw4IEBACiAJCWludGYtPmRldi5wYXJlbnQgPSAmZGV2LT5kZXY7CiAJCWludGYtPmRldi5kcml2ZXIgPSBOVUxMOwogCQlpbnRmLT5kZXYuYnVzID0gJnVzYl9idXNfdHlwZTsKKwkJaW50Zi0+ZGV2LnR5cGUgPSAmdXNiX2lmX2RldmljZV90eXBlOwogCQlpbnRmLT5kZXYuZG1hX21hc2sgPSBkZXYtPmRldi5kbWFfbWFzazsKLQkJaW50Zi0+ZGV2LnJlbGVhc2UgPSByZWxlYXNlX2ludGVyZmFjZTsKIAkJZGV2aWNlX2luaXRpYWxpemUgKCZpbnRmLT5kZXYpOwogCQltYXJrX3F1aWVzY2VkKGludGYpOwogCQlzcHJpbnRmICgmaW50Zi0+ZGV2LmJ1c19pZFswXSwgIiVkLSVzOiVkLiVkIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvcXVpcmtzLmMgYi9kcml2ZXJzL3VzYi9jb3JlL3F1aXJrcy5jCmluZGV4IGYwOGVjODUuLjczOWY1MjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvcXVpcmtzLmMKKysrIGIvZHJpdmVycy91c2IvY29yZS9xdWlya3MuYwpAQCAtNDIsNyArNDIsNyBAQAogewogI2lmZGVmCUNPTkZJR19VU0JfU1VTUEVORAogCS8qIGRpc2FibGUgYXV0b3N1c3BlbmQsIGJ1dCBhbGxvdyB0aGUgdXNlciB0byByZS1lbmFibGUgaXQgdmlhIHN5c2ZzICovCi0JdWRldi0+YXV0b3N1c3BlbmRfZGVsYXkgPSAwOworCXVkZXYtPmF1dG9zdXNwZW5kX2Rpc2FibGVkID0gMTsKICNlbmRpZgogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL3N5c2ZzLmMgYi9kcml2ZXJzL3VzYi9jb3JlL3N5c2ZzLmMKaW5kZXggMzExZDVkZi4uZTdjOTgyMyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9zeXNmcy5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvc3lzZnMuYwpAQCAtMTEsNiArMTEsNyBAQAogCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC91c2IuaD4KICNpbmNsdWRlICJ1c2IuaCIKIApAQCAtMTE3LDYgKzExOCwxNiBAQAogc3RhdGljIERFVklDRV9BVFRSKHNwZWVkLCBTX0lSVUdPLCBzaG93X3NwZWVkLCBOVUxMKTsKIAogc3RhdGljIHNzaXplX3QKK3Nob3dfYnVzbnVtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldjsKKworCXVkZXYgPSB0b191c2JfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHVkZXYtPmJ1cy0+YnVzbnVtKTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihidXNudW0sIFNfSVJVR08sIHNob3dfYnVzbnVtLCBOVUxMKTsKKworc3RhdGljIHNzaXplX3QKIHNob3dfZGV2bnVtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldjsKQEAgLTE2NSw3ICsxNzYsNyBAQAogewogCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gdG9fdXNiX2RldmljZShkZXYpOwogCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIHVkZXYtPmF1dG9zdXNwZW5kX2RlbGF5IC8gSFopOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB1ZGV2LT5hdXRvc3VzcGVuZF9kZWxheSAvIEhaKTsKIH0KIAogc3RhdGljIHNzaXplX3QKQEAgLTE3MywzOSArMTg0LDExNSBAQAogCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IHRvX3VzYl9kZXZpY2UoZGV2KTsKLQl1bnNpZ25lZCB2YWx1ZSwgb2xkOworCWludCB2YWx1ZTsKIAotCWlmIChzc2NhbmYoYnVmLCAiJXUiLCAmdmFsdWUpICE9IDEgfHwgdmFsdWUgPj0gSU5UX01BWC9IWikKKwlpZiAoc3NjYW5mKGJ1ZiwgIiVkIiwgJnZhbHVlKSAhPSAxIHx8IHZhbHVlID49IElOVF9NQVgvSFogfHwKKwkJCXZhbHVlIDw9IC0gSU5UX01BWC9IWikKIAkJcmV0dXJuIC1FSU5WQUw7CiAJdmFsdWUgKj0gSFo7CiAKLQlvbGQgPSB1ZGV2LT5hdXRvc3VzcGVuZF9kZWxheTsKIAl1ZGV2LT5hdXRvc3VzcGVuZF9kZWxheSA9IHZhbHVlOwotCWlmICh2YWx1ZSA+IDAgJiYgb2xkID09IDApCisJaWYgKHZhbHVlID49IDApCiAJCXVzYl90cnlfYXV0b3N1c3BlbmRfZGV2aWNlKHVkZXYpOwotCisJZWxzZSB7CisJCWlmICh1c2JfYXV0b3Jlc3VtZV9kZXZpY2UodWRldikgPT0gMCkKKwkJCXVzYl9hdXRvc3VzcGVuZF9kZXZpY2UodWRldik7CisJfQogCXJldHVybiBjb3VudDsKIH0KIAogc3RhdGljIERFVklDRV9BVFRSKGF1dG9zdXNwZW5kLCBTX0lSVUdPIHwgU19JV1VTUiwKIAkJc2hvd19hdXRvc3VzcGVuZCwgc2V0X2F1dG9zdXNwZW5kKTsKIAorc3RhdGljIGNvbnN0IGNoYXIgb25fc3RyaW5nW10gPSAib24iOworc3RhdGljIGNvbnN0IGNoYXIgYXV0b19zdHJpbmdbXSA9ICJhdXRvIjsKK3N0YXRpYyBjb25zdCBjaGFyIHN1c3BlbmRfc3RyaW5nW10gPSAic3VzcGVuZCI7CisKK3N0YXRpYyBzc2l6ZV90CitzaG93X2xldmVsKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IHRvX3VzYl9kZXZpY2UoZGV2KTsKKwljb25zdCBjaGFyICpwID0gYXV0b19zdHJpbmc7CisKKwlpZiAodWRldi0+c3RhdGUgPT0gVVNCX1NUQVRFX1NVU1BFTkRFRCkgeworCQlpZiAodWRldi0+YXV0b3Jlc3VtZV9kaXNhYmxlZCkKKwkJCXAgPSBzdXNwZW5kX3N0cmluZzsKKwl9IGVsc2UgeworCQlpZiAodWRldi0+YXV0b3N1c3BlbmRfZGlzYWJsZWQpCisJCQlwID0gb25fc3RyaW5nOworCX0KKwlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwgcCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitzZXRfbGV2ZWwoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSB0b191c2JfZGV2aWNlKGRldik7CisJaW50IGxlbiA9IGNvdW50OworCWNoYXIgKmNwOworCWludCByYyA9IDA7CisKKwljcCA9IG1lbWNocihidWYsICdcbicsIGNvdW50KTsKKwlpZiAoY3ApCisJCWxlbiA9IGNwIC0gYnVmOworCisJdXNiX2xvY2tfZGV2aWNlKHVkZXYpOworCisJLyogU2V0dGluZyB0aGUgZmxhZ3Mgd2l0aG91dCBjYWxsaW5nIHVzYl9wbV9sb2NrIGlzIGEgc3ViamVjdCB0bworCSAqIHJhY2VzLCBidXQgd2hvIGNhcmVzLi4uCisJICovCisJaWYgKGxlbiA9PSBzaXplb2Ygb25fc3RyaW5nIC0gMSAmJgorCQkJc3RybmNtcChidWYsIG9uX3N0cmluZywgbGVuKSA9PSAwKSB7CisJCXVkZXYtPmF1dG9zdXNwZW5kX2Rpc2FibGVkID0gMTsKKwkJdWRldi0+YXV0b3Jlc3VtZV9kaXNhYmxlZCA9IDA7CisJCXJjID0gdXNiX2V4dGVybmFsX3Jlc3VtZV9kZXZpY2UodWRldik7CisKKwl9IGVsc2UgaWYgKGxlbiA9PSBzaXplb2YgYXV0b19zdHJpbmcgLSAxICYmCisJCQlzdHJuY21wKGJ1ZiwgYXV0b19zdHJpbmcsIGxlbikgPT0gMCkgeworCQl1ZGV2LT5hdXRvc3VzcGVuZF9kaXNhYmxlZCA9IDA7CisJCXVkZXYtPmF1dG9yZXN1bWVfZGlzYWJsZWQgPSAwOworCQlyYyA9IHVzYl9leHRlcm5hbF9yZXN1bWVfZGV2aWNlKHVkZXYpOworCisJfSBlbHNlIGlmIChsZW4gPT0gc2l6ZW9mIHN1c3BlbmRfc3RyaW5nIC0gMSAmJgorCQkJc3RybmNtcChidWYsIHN1c3BlbmRfc3RyaW5nLCBsZW4pID09IDApIHsKKwkJdWRldi0+YXV0b3N1c3BlbmRfZGlzYWJsZWQgPSAwOworCQl1ZGV2LT5hdXRvcmVzdW1lX2Rpc2FibGVkID0gMTsKKwkJcmMgPSB1c2JfZXh0ZXJuYWxfc3VzcGVuZF9kZXZpY2UodWRldiwgUE1TR19TVVNQRU5EKTsKKworCX0gZWxzZQorCQlyYyA9IC1FSU5WQUw7CisKKwl1c2JfdW5sb2NrX2RldmljZSh1ZGV2KTsKKwlyZXR1cm4gKHJjIDwgMCA/IHJjIDogY291bnQpOworfQorCitzdGF0aWMgREVWSUNFX0FUVFIobGV2ZWwsIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X2xldmVsLCBzZXRfbGV2ZWwpOworCiBzdGF0aWMgY2hhciBwb3dlcl9ncm91cFtdID0gInBvd2VyIjsKIAogc3RhdGljIGludCBhZGRfcG93ZXJfYXR0cmlidXRlcyhzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJaW50IHJjID0gMDsKIAotCWlmIChpc191c2JfZGV2aWNlKGRldikpCisJaWYgKGlzX3VzYl9kZXZpY2UoZGV2KSkgewogCQlyYyA9IHN5c2ZzX2FkZF9maWxlX3RvX2dyb3VwKCZkZXYtPmtvYmosCiAJCQkJJmRldl9hdHRyX2F1dG9zdXNwZW5kLmF0dHIsCiAJCQkJcG93ZXJfZ3JvdXApOworCQlpZiAocmMgPT0gMCkKKwkJCXJjID0gc3lzZnNfYWRkX2ZpbGVfdG9fZ3JvdXAoJmRldi0+a29iaiwKKwkJCQkJJmRldl9hdHRyX2xldmVsLmF0dHIsCisJCQkJCXBvd2VyX2dyb3VwKTsKKwl9CiAJcmV0dXJuIHJjOwogfQogCiBzdGF0aWMgdm9pZCByZW1vdmVfcG93ZXJfYXR0cmlidXRlcyhzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3lzZnNfcmVtb3ZlX2ZpbGVfZnJvbV9ncm91cCgmZGV2LT5rb2JqLAorCQkJJmRldl9hdHRyX2xldmVsLmF0dHIsCisJCQlwb3dlcl9ncm91cCk7CisJc3lzZnNfcmVtb3ZlX2ZpbGVfZnJvbV9ncm91cCgmZGV2LT5rb2JqLAogCQkJJmRldl9hdHRyX2F1dG9zdXNwZW5kLmF0dHIsCiAJCQlwb3dlcl9ncm91cCk7CiB9CkBAIC0yNzAsNiArMzU3LDcgQEAKIAkmZGV2X2F0dHJfYk51bUNvbmZpZ3VyYXRpb25zLmF0dHIsCiAJJmRldl9hdHRyX2JNYXhQYWNrZXRTaXplMC5hdHRyLAogCSZkZXZfYXR0cl9zcGVlZC5hdHRyLAorCSZkZXZfYXR0cl9idXNudW0uYXR0ciwKIAkmZGV2X2F0dHJfZGV2bnVtLmF0dHIsCiAJJmRldl9hdHRyX3ZlcnNpb24uYXR0ciwKIAkmZGV2X2F0dHJfbWF4Y2hpbGQuYXR0ciwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvdXNiLmMgYi9kcml2ZXJzL3VzYi9jb3JlL3VzYi5jCmluZGV4IDU0YjQyY2UuLmRmZDFiNWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvdXNiLmMKKysrIGIvZHJpdmVycy91c2IvY29yZS91c2IuYwpAQCAtNDksMTIgKzQ5LDEzIEBACiAKIHN0YXRpYyBpbnQgbm91c2I7CS8qIERpc2FibGUgVVNCIHdoZW4gYnVpbHQgaW50byBrZXJuZWwgaW1hZ2UgKi8KIAotc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmtzdXNwZW5kX3VzYl93cTsJLyogRm9yIGF1dG9zdXNwZW5kICovCisvKiBXb3JrcXVldWUgZm9yIGF1dG9zdXNwZW5kIGFuZCBmb3IgcmVtb3RlIHdha2V1cCBvZiByb290IGh1YnMgKi8KK3N0cnVjdCB3b3JrcXVldWVfc3RydWN0ICprc3VzcGVuZF91c2Jfd3E7CiAKICNpZmRlZglDT05GSUdfVVNCX1NVU1BFTkQKIHN0YXRpYyBpbnQgdXNiX2F1dG9zdXNwZW5kX2RlbGF5ID0gMjsJCS8qIERlZmF1bHQgZGVsYXkgdmFsdWUsCiAJCQkJCQkgKiBpbiBzZWNvbmRzICovCi1tb2R1bGVfcGFyYW1fbmFtZWQoYXV0b3N1c3BlbmQsIHVzYl9hdXRvc3VzcGVuZF9kZWxheSwgdWludCwgMDY0NCk7Cittb2R1bGVfcGFyYW1fbmFtZWQoYXV0b3N1c3BlbmQsIHVzYl9hdXRvc3VzcGVuZF9kZWxheSwgaW50LCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoYXV0b3N1c3BlbmQsICJkZWZhdWx0IGF1dG9zdXNwZW5kIGRlbGF5Iik7CiAKICNlbHNlCkBAIC0xOTYsNiArMTk3LDExIEBACiAJa2ZyZWUodWRldik7CiB9CiAKK3N0cnVjdCBkZXZpY2VfdHlwZSB1c2JfZGV2aWNlX3R5cGUgPSB7CisJLm5hbWUgPQkJInVzYl9kZXZpY2UiLAorCS5yZWxlYXNlID0JdXNiX3JlbGVhc2VfZGV2LAorfTsKKwogI2lmZGVmCUNPTkZJR19QTQogCiBzdGF0aWMgaW50IGtzdXNwZW5kX3VzYl9pbml0KHZvaWQpCkBAIC0yMTEsMjcgKzIxNyw2IEBACiAJZGVzdHJveV93b3JrcXVldWUoa3N1c3BlbmRfdXNiX3dxKTsKIH0KIAotI2lmZGVmCUNPTkZJR19VU0JfU1VTUEVORAotCi0vKiB1c2JfYXV0b3N1c3BlbmRfd29yayAtIGNhbGxiYWNrIHJvdXRpbmUgdG8gYXV0b3N1c3BlbmQgYSBVU0IgZGV2aWNlICovCi1zdGF0aWMgdm9pZCB1c2JfYXV0b3N1c3BlbmRfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPQotCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHVzYl9kZXZpY2UsIGF1dG9zdXNwZW5kLndvcmspOwotCi0JdXNiX3BtX2xvY2sodWRldik7Ci0JdWRldi0+YXV0b19wbSA9IDE7Ci0JdXNiX3N1c3BlbmRfYm90aCh1ZGV2LCBQTVNHX1NVU1BFTkQpOwotCXVzYl9wbV91bmxvY2sodWRldik7Ci19Ci0KLSNlbHNlCi0KLXN0YXRpYyB2b2lkIHVzYl9hdXRvc3VzcGVuZF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXt9Ci0KLSNlbmRpZgkvKiBDT05GSUdfVVNCX1NVU1BFTkQgKi8KLQogI2Vsc2UKIAogI2RlZmluZSBrc3VzcGVuZF91c2JfaW5pdCgpCTAKQEAgLTI2NywxMyArMjUyLDEwIEBACiAKIAlkZXZpY2VfaW5pdGlhbGl6ZSgmZGV2LT5kZXYpOwogCWRldi0+ZGV2LmJ1cyA9ICZ1c2JfYnVzX3R5cGU7CisJZGV2LT5kZXYudHlwZSA9ICZ1c2JfZGV2aWNlX3R5cGU7CiAJZGV2LT5kZXYuZG1hX21hc2sgPSBidXMtPmNvbnRyb2xsZXItPmRtYV9tYXNrOwotCWRldi0+ZGV2LnJlbGVhc2UgPSB1c2JfcmVsZWFzZV9kZXY7CiAJZGV2LT5zdGF0ZSA9IFVTQl9TVEFURV9BVFRBQ0hFRDsKIAotCS8qIFRoaXMgbWFnaWMgYXNzaWdubWVudCBkaXN0aW5ndWlzaGVzIGRldmljZXMgZnJvbSBpbnRlcmZhY2VzICovCi0JZGV2LT5kZXYucGxhdGZvcm1fZGF0YSA9ICZ1c2JfZ2VuZXJpY19kcml2ZXI7Ci0KIAlJTklUX0xJU1RfSEVBRCgmZGV2LT5lcDAudXJiX2xpc3QpOwogCWRldi0+ZXAwLmRlc2MuYkxlbmd0aCA9IFVTQl9EVF9FTkRQT0lOVF9TSVpFOwogCWRldi0+ZXAwLmRlc2MuYkRlc2NyaXB0b3JUeXBlID0gVVNCX0RUX0VORFBPSU5UOwpAQCAtOTAyLDkgKzg4NCw5IEBACiAJcmV0dmFsID0gdXNiX3JlZ2lzdGVyKCZ1c2Jmc19kcml2ZXIpOwogCWlmIChyZXR2YWwpCiAJCWdvdG8gZHJpdmVyX3JlZ2lzdGVyX2ZhaWxlZDsKLQlyZXR2YWwgPSB1c2JkZXZfaW5pdCgpOworCXJldHZhbCA9IHVzYl9kZXZpb19pbml0KCk7CiAJaWYgKHJldHZhbCkKLQkJZ290byB1c2JkZXZpY2VfaW5pdF9mYWlsZWQ7CisJCWdvdG8gdXNiX2RldmlvX2luaXRfZmFpbGVkOwogCXJldHZhbCA9IHVzYmZzX2luaXQoKTsKIAlpZiAocmV0dmFsKQogCQlnb3RvIGZzX2luaXRfZmFpbGVkOwpAQCAtOTE5LDggKzkwMSw4IEBACiBodWJfaW5pdF9mYWlsZWQ6CiAJdXNiZnNfY2xlYW51cCgpOwogZnNfaW5pdF9mYWlsZWQ6Ci0JdXNiZGV2X2NsZWFudXAoKTsKLXVzYmRldmljZV9pbml0X2ZhaWxlZDoKKwl1c2JfZGV2aW9fY2xlYW51cCgpOwordXNiX2RldmlvX2luaXRfZmFpbGVkOgogCXVzYl9kZXJlZ2lzdGVyKCZ1c2Jmc19kcml2ZXIpOwogZHJpdmVyX3JlZ2lzdGVyX2ZhaWxlZDoKIAl1c2JfbWFqb3JfY2xlYW51cCgpOwpAQCAtOTQ3LDcgKzkyOSw3IEBACiAJdXNiX21ham9yX2NsZWFudXAoKTsKIAl1c2Jmc19jbGVhbnVwKCk7CiAJdXNiX2RlcmVnaXN0ZXIoJnVzYmZzX2RyaXZlcik7Ci0JdXNiZGV2X2NsZWFudXAoKTsKKwl1c2JfZGV2aW9fY2xlYW51cCgpOwogCXVzYl9odWJfY2xlYW51cCgpOwogCXVzYl9ob3N0X2NsZWFudXAoKTsKIAlidXNfdW5yZWdpc3RlcigmdXNiX2J1c190eXBlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvdXNiLmggYi9kcml2ZXJzL3VzYi9jb3JlL3VzYi5oCmluZGV4IDA4YjVhMDQuLmJmMmViMGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvdXNiLmgKKysrIGIvZHJpdmVycy91c2IvY29yZS91c2IuaApAQCAtMjEsNyArMjEsNiBAQAogZXh0ZXJuIGludCB1c2Jfc2V0X2NvbmZpZ3VyYXRpb24oc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgaW50IGNvbmZpZ3VyYXRpb24pOwogCiBleHRlcm4gdm9pZCB1c2Jfa2lja19raHViZChzdHJ1Y3QgdXNiX2RldmljZSAqZGV2KTsKLWV4dGVybiB2b2lkIHVzYl9yZXN1bWVfcm9vdF9odWIoc3RydWN0IHVzYl9kZXZpY2UgKmRldik7CiBleHRlcm4gaW50IHVzYl9tYXRjaF9kZXZpY2Uoc3RydWN0IHVzYl9kZXZpY2UgKmRldiwKIAkJCSAgICBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpOwogCkBAIC0zNCwxMCArMzMsMTIgQEAKIAogI2lmZGVmCUNPTkZJR19QTQogCi1leHRlcm4gaW50IHVzYl9zdXNwZW5kX2JvdGgoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsIHBtX21lc3NhZ2VfdCBtc2cpOwotZXh0ZXJuIGludCB1c2JfcmVzdW1lX2JvdGgoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpOworZXh0ZXJuIHZvaWQgdXNiX2F1dG9zdXNwZW5kX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIGV4dGVybiBpbnQgdXNiX3BvcnRfc3VzcGVuZChzdHJ1Y3QgdXNiX2RldmljZSAqZGV2KTsKIGV4dGVybiBpbnQgdXNiX3BvcnRfcmVzdW1lKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYpOworZXh0ZXJuIGludCB1c2JfZXh0ZXJuYWxfc3VzcGVuZF9kZXZpY2Uoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsCisJCXBtX21lc3NhZ2VfdCBtc2cpOworZXh0ZXJuIGludCB1c2JfZXh0ZXJuYWxfcmVzdW1lX2RldmljZShzdHJ1Y3QgdXNiX2RldmljZSAqdWRldik7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCB1c2JfcG1fbG9jayhzdHJ1Y3QgdXNiX2RldmljZSAqdWRldikKIHsKQEAgLTUxLDExICs1Miw2IEBACiAKICNlbHNlCiAKLSNkZWZpbmUgdXNiX3N1c3BlbmRfYm90aCh1ZGV2LCBtc2cpCTAKLXN0YXRpYyBpbmxpbmUgaW50IHVzYl9yZXN1bWVfYm90aChzdHJ1Y3QgdXNiX2RldmljZSAqdWRldikKLXsKLQlyZXR1cm4gMDsKLX0KICNkZWZpbmUgdXNiX3BvcnRfc3VzcGVuZChkZXYpCQkwCiAjZGVmaW5lIHVzYl9wb3J0X3Jlc3VtZShkZXYpCQkwCiBzdGF0aWMgaW5saW5lIHZvaWQgdXNiX3BtX2xvY2soc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpIHt9CkBAIC04MiwxNSArNzgsMTMgQEAKIAogZXh0ZXJuIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICprc3VzcGVuZF91c2Jfd3E7CiBleHRlcm4gc3RydWN0IGJ1c190eXBlIHVzYl9idXNfdHlwZTsKK2V4dGVybiBzdHJ1Y3QgZGV2aWNlX3R5cGUgdXNiX2RldmljZV90eXBlOworZXh0ZXJuIHN0cnVjdCBkZXZpY2VfdHlwZSB1c2JfaWZfZGV2aWNlX3R5cGU7CiBleHRlcm4gc3RydWN0IHVzYl9kZXZpY2VfZHJpdmVyIHVzYl9nZW5lcmljX2RyaXZlcjsKIAotLyogSGVyZSdzIGhvdyB3ZSB0ZWxsIGFwYXJ0IGRldmljZXMgYW5kIGludGVyZmFjZXMuICBMdWNraWx5IHRoZXJlJ3MKLSAqIG5vIHN1Y2ggdGhpbmcgYXMgYSBwbGF0Zm9ybSBVU0IgZGV2aWNlLCBzbyB3ZSBjYW4gc3RlYWwgdGhlIHVzZQotICogb2YgdGhlIHBsYXRmb3JtX2RhdGEgZmllbGQuICovCi0KIHN0YXRpYyBpbmxpbmUgaW50IGlzX3VzYl9kZXZpY2UoY29uc3Qgc3RydWN0IGRldmljZSAqZGV2KQogewotCXJldHVybiBkZXYtPnBsYXRmb3JtX2RhdGEgPT0gJnVzYl9nZW5lcmljX2RyaXZlcjsKKwlyZXR1cm4gZGV2LT50eXBlID09ICZ1c2JfZGV2aWNlX3R5cGU7CiB9CiAKIC8qIERvIHRoZSBzYW1lIGZvciBkZXZpY2UgZHJpdmVycyBhbmQgaW50ZXJmYWNlIGRyaXZlcnMuICovCkBAIC0xMjYsMTEgKzEyMCwxMSBAQAogZXh0ZXJuIHN0cnVjdCBtdXRleCB1c2Jmc19tdXRleDsKIGV4dGVybiBzdHJ1Y3QgdXNiX2RyaXZlciB1c2Jmc19kcml2ZXI7CiBleHRlcm4gY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB1c2Jmc19kZXZpY2VzX2ZvcHM7Ci1leHRlcm4gY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB1c2Jmc19kZXZpY2VfZmlsZV9vcGVyYXRpb25zOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdXNiZGV2X2ZpbGVfb3BlcmF0aW9uczsKIGV4dGVybiB2b2lkIHVzYmZzX2Nvbm5fZGlzY19ldmVudCh2b2lkKTsKIAotZXh0ZXJuIGludCB1c2JkZXZfaW5pdCh2b2lkKTsKLWV4dGVybiB2b2lkIHVzYmRldl9jbGVhbnVwKHZvaWQpOworZXh0ZXJuIGludCB1c2JfZGV2aW9faW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIHVzYl9kZXZpb19jbGVhbnVwKHZvaWQpOwogCiBzdHJ1Y3QgZGV2X3N0YXRlIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7ICAgICAgLyogc3RhdGUgbGlzdCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L0tjb25maWcgYi9kcml2ZXJzL3VzYi9nYWRnZXQvS2NvbmZpZwppbmRleCA0MDk3YTg2Li44MDY1ZjJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvS2NvbmZpZworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvS2NvbmZpZwpAQCAtNjgsNiArNjgsMjcgQEAKIAkgICBNYW55IGNvbnRyb2xsZXIgZHJpdmVycyBhcmUgcGxhdGZvcm0tc3BlY2lmaWM7IHRoZXNlCiAJICAgb2Z0ZW4gbmVlZCBib2FyZC1zcGVjaWZpYyBob29rcy4KIAorY29uZmlnIFVTQl9HQURHRVRfRlNMX1VTQjIKKwlib29sZWFuICJGcmVlc2NhbGUgSGlnaHNwZWVkIFVTQiBEUiBQZXJpcGhlcmFsIENvbnRyb2xsZXIiCisJZGVwZW5kcyBvbiBNUEM4MzR4IHx8IFBQQ19NUEM4MzF4CisJc2VsZWN0IFVTQl9HQURHRVRfRFVBTFNQRUVECisJaGVscAorCSAgIFNvbWUgb2YgRnJlZXNjYWxlIFBvd2VyUEMgcHJvY2Vzc29ycyBoYXZlIGEgSGlnaCBTcGVlZAorCSAgIER1YWwtUm9sZShEUikgVVNCIGNvbnRyb2xsZXIsIHdoaWNoIHN1cHBvcnRzIGRldmljZSBtb2RlLgorCisJICAgVGhlIG51bWJlciBvZiBwcm9ncmFtbWFibGUgZW5kcG9pbnRzIGlzIGRpZmZlcmVudCB0aHJvdWdoCisJICAgU09DIHJldmlzaW9ucy4KKworCSAgIFNheSAieSIgdG8gbGluayB0aGUgZHJpdmVyIHN0YXRpY2FsbHksIG9yICJtIiB0byBidWlsZCBhCisJICAgZHluYW1pY2FsbHkgbGlua2VkIG1vZHVsZSBjYWxsZWQgImZzbF91c2IyX3VkYyIgYW5kIGZvcmNlCisJICAgYWxsIGdhZGdldCBkcml2ZXJzIHRvIGFsc28gYmUgZHluYW1pY2FsbHkgbGlua2VkLgorCitjb25maWcgVVNCX0ZTTF9VU0IyCisJdHJpc3RhdGUKKwlkZXBlbmRzIG9uIFVTQl9HQURHRVRfRlNMX1VTQjIKKwlkZWZhdWx0IFVTQl9HQURHRVQKKwlzZWxlY3QgVVNCX0dBREdFVF9TRUxFQ1RFRAorCiBjb25maWcgVVNCX0dBREdFVF9ORVQyMjgwCiAJYm9vbGVhbiAiTmV0Q2hpcCAyMjh4IgogCWRlcGVuZHMgb24gUENJCkBAIC0zNzAsNiArMzkxLDcgQEAKIAogY29uZmlnIFVTQl9GSUxFX1NUT1JBR0UKIAl0cmlzdGF0ZSAiRmlsZS1iYWNrZWQgU3RvcmFnZSBHYWRnZXQiCisJZGVwZW5kcyBvbiBCTE9DSwogCWhlbHAKIAkgIFRoZSBGaWxlLWJhY2tlZCBTdG9yYWdlIEdhZGdldCBhY3RzIGFzIGEgVVNCIE1hc3MgU3RvcmFnZQogCSAgZGlzayBkcml2ZS4gIEFzIGl0cyBzdG9yYWdlIHJlcG9zaXRvcnkgaXQgY2FuIHVzZSBhIHJlZ3VsYXIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9NYWtlZmlsZSBiL2RyaXZlcnMvdXNiL2dhZGdldC9NYWtlZmlsZQppbmRleCBlNzFlMDg2Li41ZGIxOTM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvTWFrZWZpbGUKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L01ha2VmaWxlCkBAIC04LDYgKzgsNyBAQAogb2JqLSQoQ09ORklHX1VTQl9PTUFQKQkJKz0gb21hcF91ZGMubwogb2JqLSQoQ09ORklHX1VTQl9MSDdBNDBYKQkrPSBsaDdhNDB4X3VkYy5vCiBvYmotJChDT05GSUdfVVNCX0FUOTEpCQkrPSBhdDkxX3VkYy5vCitvYmotJChDT05GSUdfVVNCX0ZTTF9VU0IyKQkrPSBmc2xfdXNiMl91ZGMubwogCiAjCiAjIFVTQiBnYWRnZXQgZHJpdmVycwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2V0aGVyLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZXRoZXIuYwppbmRleCAwNGU2Yjg1Li4xZGQ4YjU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZXRoZXIuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZXRoZXIuYwpAQCAtMjgyLDYgKzI4Miw5IEBACiAjZGVmaW5lIERFVl9DT05GSUdfQ0RDCiAjZW5kaWYKIAorI2lmZGVmIENPTkZJR19VU0JfR0FER0VUX0ZTTF9VU0IyCisjZGVmaW5lIERFVl9DT05GSUdfQ0RDCisjZW5kaWYKIAogLyogRm9yIENEQy1pbmNhcGFibGUgaGFyZHdhcmUsIGNob29zZSB0aGUgc2ltcGxlIGNkYyBzdWJzZXQuCiAgKiBBbnl0aGluZyB0aGF0IHRhbGtzIGJ1bGsgKHdpdGhvdXQgbm90YWJsZSBidWdzKSBjYW4gZG8gdGhpcy4KQEAgLTE3MzUsNyArMTczOCw4IEBACiAJCWRlZmVyX2tldmVudCAoZGV2LCBXT1JLX1JYX01FTU9SWSk7CiAJaWYgKHJldHZhbCkgewogCQlERUJVRyAoZGV2LCAicnggc3VibWl0IC0tPiAlZFxuIiwgcmV0dmFsKTsKLQkJZGV2X2tmcmVlX3NrYl9hbnkgKHNrYik7CisJCWlmIChza2IpCisJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwogCQlzcGluX2xvY2soJmRldi0+cmVxX2xvY2spOwogCQlsaXN0X2FkZCAoJnJlcS0+bGlzdCwgJmRldi0+cnhfcmVxcyk7CiAJCXNwaW5fdW5sb2NrKCZkZXYtPnJlcV9sb2NrKTsKQEAgLTE3NjYsNyArMTc3MCw2IEBACiAJCQlicmVhazsKIAkJfQogCi0JCXNrYi0+ZGV2ID0gZGV2LT5uZXQ7CiAJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyAoc2tiLCBkZXYtPm5ldCk7CiAJCWRldi0+c3RhdHMucnhfcGFja2V0cysrOwogCQlkZXYtPnN0YXRzLnJ4X2J5dGVzICs9IHNrYi0+bGVuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2ZzbF91c2IyX3VkYy5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2ZzbF91c2IyX3VkYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1NzA1NGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZnNsX3VzYjJfdWRjLmMKQEAgLTAsMCArMSwyNTAwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDcgRnJlZXNjYWxlIFNlbWljb25kdXRvciwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIEF1dGhvcjogTGkgWWFuZyA8bGVvbGlAZnJlZXNjYWxlLmNvbT4KKyAqICAgICAgICAgSmlhbmcgQm8gPHRhbnlhLmppYW5nQGZyZWVzY2FsZS5jb20+CisgKgorICogRGVzY3JpcHRpb246CisgKiBGcmVlc2NhbGUgaGlnaC1zcGVlZCBVU0IgU09DIERSIG1vZHVsZSBkZXZpY2UgY29udHJvbGxlciBkcml2ZXIuCisgKiBUaGlzIGNhbiBiZSBmb3VuZCBvbiBNUEM4MzQ5RS9NUEM4MzEzRSBjcHVzLgorICogVGhlIGRyaXZlciBpcyBwcmV2aW91c2x5IG5hbWVkIGFzIG1wY191ZGMuICBCYXNlZCBvbiBiYXJlIGJvYXJkCisgKiBjb2RlIGZyb20gRGF2ZSBMaXUgYW5kIFNobG9taSBHcmlkaXNoLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI3VuZGVmIFZFUkJPU0UKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi9jaDkuaD4KKyNpbmNsdWRlIDxsaW51eC91c2JfZ2FkZ2V0Lmg+CisjaW5jbHVkZSA8bGludXgvdXNiL290Zy5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZnNsX2RldmljZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWFwb29sLmg+CisKKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CisKKyNpbmNsdWRlICJmc2xfdXNiMl91ZGMuaCIKKworI2RlZmluZQlEUklWRVJfREVTQwkiRnJlZXNjYWxlIEhpZ2gtU3BlZWQgVVNCIFNPQyBEZXZpY2UgQ29udHJvbGxlciBkcml2ZXIiCisjZGVmaW5lCURSSVZFUl9BVVRIT1IJIkxpIFlhbmcvSmlhbmcgQm8iCisjZGVmaW5lCURSSVZFUl9WRVJTSU9OCSJBcHIgMjAsIDIwMDciCisKKyNkZWZpbmUJRE1BX0FERFJfSU5WQUxJRAkofihkbWFfYWRkcl90KTApCisKK3N0YXRpYyBjb25zdCBjaGFyIGRyaXZlcl9uYW1lW10gPSAiZnNsLXVzYjItdWRjIjsKK3N0YXRpYyBjb25zdCBjaGFyIGRyaXZlcl9kZXNjW10gPSBEUklWRVJfREVTQzsKKwordm9sYXRpbGUgc3RhdGljIHN0cnVjdCB1c2JfZHJfZGV2aWNlICpkcl9yZWdzID0gTlVMTDsKK3ZvbGF0aWxlIHN0YXRpYyBzdHJ1Y3QgdXNiX3N5c19pbnRlcmZhY2UgKnVzYl9zeXNfcmVncyA9IE5VTEw7CisKKy8qIGl0IGlzIGluaXRpYWxpemVkIGluIHByb2JlKCkgICovCitzdGF0aWMgc3RydWN0IGZzbF91ZGMgKnVkY19jb250cm9sbGVyID0gTlVMTDsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvcgorZnNsX2VwMF9kZXNjID0geworCS5iTGVuZ3RoID0JCVVTQl9EVF9FTkRQT0lOVF9TSVpFLAorCS5iRGVzY3JpcHRvclR5cGUgPQlVU0JfRFRfRU5EUE9JTlQsCisJLmJFbmRwb2ludEFkZHJlc3MgPQkwLAorCS5ibUF0dHJpYnV0ZXMgPQkJVVNCX0VORFBPSU5UX1hGRVJfQ09OVFJPTCwKKwkud01heFBhY2tldFNpemUgPQlVU0JfTUFYX0NUUkxfUEFZTE9BRCwKK307CisKK3N0YXRpYyBpbnQgZnNsX3VkY19zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSk7CitzdGF0aWMgaW50IGZzbF91ZGNfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpOworc3RhdGljIHZvaWQgZnNsX2VwX2ZpZm9fZmx1c2goc3RydWN0IHVzYl9lcCAqX2VwKTsKKworI2lmZGVmIENPTkZJR19QUEMzMgorI2RlZmluZSBmc2xfcmVhZGwoYWRkcikJCWluX2xlMzIoYWRkcikKKyNkZWZpbmUgZnNsX3dyaXRlbChhZGRyLCB2YWwzMikgb3V0X2xlMzIodmFsMzIsIGFkZHIpCisjZWxzZQorI2RlZmluZSBmc2xfcmVhZGwoYWRkcikJCXJlYWRsKGFkZHIpCisjZGVmaW5lIGZzbF93cml0ZWwoYWRkciwgdmFsMzIpIHdyaXRlbChhZGRyLCB2YWwzMikKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCUludGVybmFsIFVzZWQgRnVuY3Rpb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogZG9uZSgpIC0gcmV0aXJlIGEgcmVxdWVzdDsgY2FsbGVyIGJsb2NrZWQgaXJxcworICogQHN0YXR1cyA6IHJlcXVlc3Qgc3RhdHVzIHRvIGJlIHNldCwgb25seSB3b3JrcyB3aGVuCisgKglyZXF1ZXN0IGlzIHN0aWxsIGluIHByb2dyZXNzLgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdm9pZCBkb25lKHN0cnVjdCBmc2xfZXAgKmVwLCBzdHJ1Y3QgZnNsX3JlcSAqcmVxLCBpbnQgc3RhdHVzKQoreworCXN0cnVjdCBmc2xfdWRjICp1ZGMgPSBOVUxMOworCXVuc2lnbmVkIGNoYXIgc3RvcHBlZCA9IGVwLT5zdG9wcGVkOworCXN0cnVjdCBlcF90ZF9zdHJ1Y3QgKmN1cnJfdGQsICpuZXh0X3RkOworCWludCBqOworCisJdWRjID0gKHN0cnVjdCBmc2xfdWRjICopZXAtPnVkYzsKKwkvKiBSZW1vdmVkIHRoZSByZXEgZnJvbSBmc2xfZXAtPnF1ZXVlICovCisJbGlzdF9kZWxfaW5pdCgmcmVxLT5xdWV1ZSk7CisKKwkvKiByZXEuc3RhdHVzIHNob3VsZCBiZSBzZXQgYXMgLUVJTlBST0dSRVNTIGluIGVwX3F1ZXVlKCkgKi8KKwlpZiAocmVxLT5yZXEuc3RhdHVzID09IC1FSU5QUk9HUkVTUykKKwkJcmVxLT5yZXEuc3RhdHVzID0gc3RhdHVzOworCWVsc2UKKwkJc3RhdHVzID0gcmVxLT5yZXEuc3RhdHVzOworCisJLyogRnJlZSBkdGQgZm9yIHRoZSByZXF1ZXN0ICovCisJbmV4dF90ZCA9IHJlcS0+aGVhZDsKKwlmb3IgKGogPSAwOyBqIDwgcmVxLT5kdGRfY291bnQ7IGorKykgeworCQljdXJyX3RkID0gbmV4dF90ZDsKKwkJaWYgKGogIT0gcmVxLT5kdGRfY291bnQgLSAxKSB7CisJCQluZXh0X3RkID0gY3Vycl90ZC0+bmV4dF90ZF92aXJ0OworCQl9CisJCWRtYV9wb29sX2ZyZWUodWRjLT50ZF9wb29sLCBjdXJyX3RkLCBjdXJyX3RkLT50ZF9kbWEpOworCX0KKworCWlmIChyZXEtPm1hcHBlZCkgeworCQlkbWFfdW5tYXBfc2luZ2xlKGVwLT51ZGMtPmdhZGdldC5kZXYucGFyZW50LAorCQkJcmVxLT5yZXEuZG1hLCByZXEtPnJlcS5sZW5ndGgsCisJCQllcF9pc19pbihlcCkKKwkJCQk/IERNQV9UT19ERVZJQ0UKKwkJCQk6IERNQV9GUk9NX0RFVklDRSk7CisJCXJlcS0+cmVxLmRtYSA9IERNQV9BRERSX0lOVkFMSUQ7CisJCXJlcS0+bWFwcGVkID0gMDsKKwl9IGVsc2UKKwkJZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoZXAtPnVkYy0+Z2FkZ2V0LmRldi5wYXJlbnQsCisJCQlyZXEtPnJlcS5kbWEsIHJlcS0+cmVxLmxlbmd0aCwKKwkJCWVwX2lzX2luKGVwKQorCQkJCT8gRE1BX1RPX0RFVklDRQorCQkJCTogRE1BX0ZST01fREVWSUNFKTsKKworCWlmIChzdGF0dXMgJiYgKHN0YXR1cyAhPSAtRVNIVVRET1dOKSkKKwkJVkRCRygiY29tcGxldGUgJXMgcmVxICVwIHN0YXQgJWQgbGVuICV1LyV1IiwKKwkJCWVwLT5lcC5uYW1lLCAmcmVxLT5yZXEsIHN0YXR1cywKKwkJCXJlcS0+cmVxLmFjdHVhbCwgcmVxLT5yZXEubGVuZ3RoKTsKKworCWVwLT5zdG9wcGVkID0gMTsKKworCXNwaW5fdW5sb2NrKCZlcC0+dWRjLT5sb2NrKTsKKwkvKiBjb21wbGV0ZSgpIGlzIGZyb20gZ2FkZ2V0IGxheWVyLAorCSAqIGVnIGZzZy0+YnVsa19pbl9jb21wbGV0ZSgpICovCisJaWYgKHJlcS0+cmVxLmNvbXBsZXRlKQorCQlyZXEtPnJlcS5jb21wbGV0ZSgmZXAtPmVwLCAmcmVxLT5yZXEpOworCisJc3Bpbl9sb2NrKCZlcC0+dWRjLT5sb2NrKTsKKwllcC0+c3RvcHBlZCA9IHN0b3BwZWQ7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIG51a2UoKTogZGVsZXRlIGFsbCByZXF1ZXN0cyByZWxhdGVkIHRvIHRoaXMgZXAKKyAqIGNhbGxlZCB3aXRoIHNwaW5sb2NrIGhlbGQKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIHZvaWQgbnVrZShzdHJ1Y3QgZnNsX2VwICplcCwgaW50IHN0YXR1cykKK3sKKwllcC0+c3RvcHBlZCA9IDE7CisKKwkvKiBGbHVzaCBmaWZvICovCisJZnNsX2VwX2ZpZm9fZmx1c2goJmVwLT5lcCk7CisKKwkvKiBXaGV0aGVyIHRoaXMgZXEgaGFzIHJlcXVlc3QgbGlua2VkICovCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZlcC0+cXVldWUpKSB7CisJCXN0cnVjdCBmc2xfcmVxICpyZXEgPSBOVUxMOworCisJCXJlcSA9IGxpc3RfZW50cnkoZXAtPnF1ZXVlLm5leHQsIHN0cnVjdCBmc2xfcmVxLCBxdWV1ZSk7CisJCWRvbmUoZXAsIHJlcSwgc3RhdHVzKTsKKwl9Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJSW50ZXJuYWwgSGFyZHdhcmUgcmVsYXRlZCBmdW5jdGlvbgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbnQgZHJfY29udHJvbGxlcl9zZXR1cChzdHJ1Y3QgZnNsX3VkYyAqdWRjKQoreworCXVuc2lnbmVkIGludCB0bXAgPSAwLCBwb3J0Y3RybCA9IDAsIGN0cmwgPSAwOworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKyNkZWZpbmUgRlNMX1VEQ19SRVNFVF9USU1FT1VUIDEwMDAKKworCS8qIGJlZm9yZSBoZXJlLCBtYWtlIHN1cmUgZHJfcmVncyBoYXMgYmVlbiBpbml0aWFsaXplZCAqLworCWlmICghdWRjKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIFN0b3AgYW5kIHJlc2V0IHRoZSB1c2IgY29udHJvbGxlciAqLworCXRtcCA9IGZzbF9yZWFkbCgmZHJfcmVncy0+dXNiY21kKTsKKwl0bXAgJj0gflVTQl9DTURfUlVOX1NUT1A7CisJZnNsX3dyaXRlbCh0bXAsICZkcl9yZWdzLT51c2JjbWQpOworCisJdG1wID0gZnNsX3JlYWRsKCZkcl9yZWdzLT51c2JjbWQpOworCXRtcCB8PSBVU0JfQ01EX0NUUkxfUkVTRVQ7CisJZnNsX3dyaXRlbCh0bXAsICZkcl9yZWdzLT51c2JjbWQpOworCisJLyogV2FpdCBmb3IgcmVzZXQgdG8gY29tcGxldGUgKi8KKwl0aW1lb3V0ID0gamlmZmllcyArIEZTTF9VRENfUkVTRVRfVElNRU9VVDsKKwl3aGlsZSAoZnNsX3JlYWRsKCZkcl9yZWdzLT51c2JjbWQpICYgVVNCX0NNRF9DVFJMX1JFU0VUKSB7CisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKSB7CisJCQlFUlIoInVkYyByZXNldCB0aW1lb3V0ISBcbiIpOworCQkJcmV0dXJuIC1FVElNRURPVVQ7CisJCX0KKwkJY3B1X3JlbGF4KCk7CisJfQorCisJLyogU2V0IHRoZSBjb250cm9sbGVyIGFzIGRldmljZSBtb2RlICovCisJdG1wID0gZnNsX3JlYWRsKCZkcl9yZWdzLT51c2Jtb2RlKTsKKwl0bXAgfD0gVVNCX01PREVfQ1RSTF9NT0RFX0RFVklDRTsKKwkvKiBEaXNhYmxlIFNldHVwIExvY2tvdXQgKi8KKwl0bXAgfD0gVVNCX01PREVfU0VUVVBfTE9DS19PRkY7CisJZnNsX3dyaXRlbCh0bXAsICZkcl9yZWdzLT51c2Jtb2RlKTsKKworCS8qIENsZWFyIHRoZSBzZXR1cCBzdGF0dXMgKi8KKwlmc2xfd3JpdGVsKDAsICZkcl9yZWdzLT51c2JzdHMpOworCisJdG1wID0gdWRjLT5lcF9xaF9kbWE7CisJdG1wICY9IFVTQl9FUF9MSVNUX0FERFJFU1NfTUFTSzsKKwlmc2xfd3JpdGVsKHRtcCwgJmRyX3JlZ3MtPmVuZHBvaW50bGlzdGFkZHIpOworCisJVkRCRygidmlyW3FoX2Jhc2VdIGlzICVwIHBoeVtxaF9iYXNlXSBpcyAweCU4eCByZWcgaXMgMHglOHgiLAorCQkoaW50KXVkYy0+ZXBfcWgsIChpbnQpdG1wLAorCQlmc2xfcmVhZGwoJmRyX3JlZ3MtPmVuZHBvaW50bGlzdGFkZHIpKTsKKworCS8qIENvbmZpZyBQSFkgaW50ZXJmYWNlICovCisJcG9ydGN0cmwgPSBmc2xfcmVhZGwoJmRyX3JlZ3MtPnBvcnRzYzEpOworCXBvcnRjdHJsICY9IH5QT1JUU0NYX1BIWV9UWVBFX1NFTDsKKwlzd2l0Y2ggKHVkYy0+cGh5X21vZGUpIHsKKwljYXNlIEZTTF9VU0IyX1BIWV9VTFBJOgorCQlwb3J0Y3RybCB8PSBQT1JUU0NYX1BUU19VTFBJOworCQlicmVhazsKKwljYXNlIEZTTF9VU0IyX1BIWV9VVE1JOgorCWNhc2UgRlNMX1VTQjJfUEhZX1VUTUlfV0lERToKKwkJcG9ydGN0cmwgfD0gUE9SVFNDWF9QVFNfVVRNSTsKKwkJYnJlYWs7CisJY2FzZSBGU0xfVVNCMl9QSFlfU0VSSUFMOgorCQlwb3J0Y3RybCB8PSBQT1JUU0NYX1BUU19GU0xTOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJZnNsX3dyaXRlbChwb3J0Y3RybCwgJmRyX3JlZ3MtPnBvcnRzYzEpOworCisJLyogQ29uZmlnIGNvbnRyb2wgZW5hYmxlIGkvbyBvdXRwdXQsIGNwdSBlbmRpYW4gcmVnaXN0ZXIgKi8KKwljdHJsID0gX19yYXdfcmVhZGwoJnVzYl9zeXNfcmVncy0+Y29udHJvbCk7CisJY3RybCB8PSBVU0JfQ1RSTF9JT0VOQjsKKwlfX3Jhd193cml0ZWwoY3RybCwgJnVzYl9zeXNfcmVncy0+Y29udHJvbCk7CisKKyNpZiBkZWZpbmVkKENPTkZJR19QUEMzMikgJiYgIWRlZmluZWQoQ09ORklHX05PVF9DT0hFUkVOVF9DQUNIRSkKKwkvKiBUdXJuIG9uIGNhY2hlIHNub29waW5nIGhhcmR3YXJlLCBzaW5jZSBzb21lIFBvd2VyUEMgcGxhdGZvcm1zCisJICogd2hvbGx5IHJlbHkgb24gaGFyZHdhcmUgdG8gZGVhbCB3aXRoIGNhY2hlIGNvaGVyZW50LiAqLworCisJLyogU2V0dXAgU25vb3BpbmcgZm9yIGFsbCB0aGUgNEdCIHNwYWNlICovCisJdG1wID0gU05PT1BfU0laRV8yR0I7CS8qIHN0YXJ0cyBmcm9tIDB4MCwgc2l6ZSAyRyAqLworCV9fcmF3X3dyaXRlbCh0bXAsICZ1c2Jfc3lzX3JlZ3MtPnNub29wMSk7CisJdG1wIHw9IDB4ODAwMDAwMDA7CS8qIHN0YXJ0cyBmcm9tIDB4ODAwMDAwMCwgc2l6ZSAyRyAqLworCV9fcmF3X3dyaXRlbCh0bXAsICZ1c2Jfc3lzX3JlZ3MtPnNub29wMik7CisjZW5kaWYKKworCXJldHVybiAwOworfQorCisvKiBFbmFibGUgRFIgaXJxIGFuZCBzZXQgY29udHJvbGxlciB0byBydW4gc3RhdGUgKi8KK3N0YXRpYyB2b2lkIGRyX2NvbnRyb2xsZXJfcnVuKHN0cnVjdCBmc2xfdWRjICp1ZGMpCit7CisJdTMyIHRlbXA7CisKKwkvKiBFbmFibGUgRFIgaXJxIHJlZyAqLworCXRlbXAgPSBVU0JfSU5UUl9JTlRfRU4gfCBVU0JfSU5UUl9FUlJfSU5UX0VOCisJCXwgVVNCX0lOVFJfUFRDX0RFVEVDVF9FTiB8IFVTQl9JTlRSX1JFU0VUX0VOCisJCXwgVVNCX0lOVFJfREVWSUNFX1NVU1BFTkQgfCBVU0JfSU5UUl9TWVNfRVJSX0VOOworCisJZnNsX3dyaXRlbCh0ZW1wLCAmZHJfcmVncy0+dXNiaW50cik7CisKKwkvKiBDbGVhciBzdG9wcGVkIGJpdCAqLworCXVkYy0+c3RvcHBlZCA9IDA7CisKKwkvKiBTZXQgdGhlIGNvbnRyb2xsZXIgYXMgZGV2aWNlIG1vZGUgKi8KKwl0ZW1wID0gZnNsX3JlYWRsKCZkcl9yZWdzLT51c2Jtb2RlKTsKKwl0ZW1wIHw9IFVTQl9NT0RFX0NUUkxfTU9ERV9ERVZJQ0U7CisJZnNsX3dyaXRlbCh0ZW1wLCAmZHJfcmVncy0+dXNibW9kZSk7CisKKwkvKiBTZXQgY29udHJvbGxlciB0byBSdW4gKi8KKwl0ZW1wID0gZnNsX3JlYWRsKCZkcl9yZWdzLT51c2JjbWQpOworCXRlbXAgfD0gVVNCX0NNRF9SVU5fU1RPUDsKKwlmc2xfd3JpdGVsKHRlbXAsICZkcl9yZWdzLT51c2JjbWQpOworCisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBkcl9jb250cm9sbGVyX3N0b3Aoc3RydWN0IGZzbF91ZGMgKnVkYykKK3sKKwl1bnNpZ25lZCBpbnQgdG1wOworCisJLyogZGlzYWJsZSBhbGwgSU5UUiAqLworCWZzbF93cml0ZWwoMCwgJmRyX3JlZ3MtPnVzYmludHIpOworCisJLyogU2V0IHN0b3BwZWQgYml0IGZvciBpc3IgKi8KKwl1ZGMtPnN0b3BwZWQgPSAxOworCisJLyogZGlzYWJsZSBJTyBvdXRwdXQgKi8KKy8qCXVzYl9zeXNfcmVncy0+Y29udHJvbCA9IDA7ICovCisKKwkvKiBzZXQgY29udHJvbGxlciB0byBTdG9wICovCisJdG1wID0gZnNsX3JlYWRsKCZkcl9yZWdzLT51c2JjbWQpOworCXRtcCAmPSB+VVNCX0NNRF9SVU5fU1RPUDsKKwlmc2xfd3JpdGVsKHRtcCwgJmRyX3JlZ3MtPnVzYmNtZCk7CisKKwlyZXR1cm47Cit9CisKK3ZvaWQgZHJfZXBfc2V0dXAodW5zaWduZWQgY2hhciBlcF9udW0sIHVuc2lnbmVkIGNoYXIgZGlyLCB1bnNpZ25lZCBjaGFyIGVwX3R5cGUpCit7CisJdW5zaWduZWQgaW50IHRtcF9lcGN0cmwgPSAwOworCisJdG1wX2VwY3RybCA9IGZzbF9yZWFkbCgmZHJfcmVncy0+ZW5kcHRjdHJsW2VwX251bV0pOworCWlmIChkaXIpIHsKKwkJaWYgKGVwX251bSkKKwkJCXRtcF9lcGN0cmwgfD0gRVBDVFJMX1RYX0RBVEFfVE9HR0xFX1JTVDsKKwkJdG1wX2VwY3RybCB8PSBFUENUUkxfVFhfRU5BQkxFOworCQl0bXBfZXBjdHJsIHw9ICgodW5zaWduZWQgaW50KShlcF90eXBlKQorCQkJCTw8IEVQQ1RSTF9UWF9FUF9UWVBFX1NISUZUKTsKKwl9IGVsc2UgeworCQlpZiAoZXBfbnVtKQorCQkJdG1wX2VwY3RybCB8PSBFUENUUkxfUlhfREFUQV9UT0dHTEVfUlNUOworCQl0bXBfZXBjdHJsIHw9IEVQQ1RSTF9SWF9FTkFCTEU7CisJCXRtcF9lcGN0cmwgfD0gKCh1bnNpZ25lZCBpbnQpKGVwX3R5cGUpCisJCQkJPDwgRVBDVFJMX1JYX0VQX1RZUEVfU0hJRlQpOworCX0KKworCWZzbF93cml0ZWwodG1wX2VwY3RybCwgJmRyX3JlZ3MtPmVuZHB0Y3RybFtlcF9udW1dKTsKK30KKworc3RhdGljIHZvaWQKK2RyX2VwX2NoYW5nZV9zdGFsbCh1bnNpZ25lZCBjaGFyIGVwX251bSwgdW5zaWduZWQgY2hhciBkaXIsIGludCB2YWx1ZSkKK3sKKwl1MzIgdG1wX2VwY3RybCA9IDA7CisKKwl0bXBfZXBjdHJsID0gZnNsX3JlYWRsKCZkcl9yZWdzLT5lbmRwdGN0cmxbZXBfbnVtXSk7CisKKwlpZiAodmFsdWUpIHsKKwkJLyogc2V0IHRoZSBzdGFsbCBiaXQgKi8KKwkJaWYgKGRpcikKKwkJCXRtcF9lcGN0cmwgfD0gRVBDVFJMX1RYX0VQX1NUQUxMOworCQllbHNlCisJCQl0bXBfZXBjdHJsIHw9IEVQQ1RSTF9SWF9FUF9TVEFMTDsKKwl9IGVsc2UgeworCQkvKiBjbGVhciB0aGUgc3RhbGwgYml0IGFuZCByZXNldCBkYXRhIHRvZ2dsZSAqLworCQlpZiAoZGlyKSB7CisJCQl0bXBfZXBjdHJsICY9IH5FUENUUkxfVFhfRVBfU1RBTEw7CisJCQl0bXBfZXBjdHJsIHw9IEVQQ1RSTF9UWF9EQVRBX1RPR0dMRV9SU1Q7CisJCX0gZWxzZSB7CisJCQl0bXBfZXBjdHJsICY9IH5FUENUUkxfUlhfRVBfU1RBTEw7CisJCQl0bXBfZXBjdHJsIHw9IEVQQ1RSTF9SWF9EQVRBX1RPR0dMRV9SU1Q7CisJCX0KKwl9CisJZnNsX3dyaXRlbCh0bXBfZXBjdHJsLCAmZHJfcmVncy0+ZW5kcHRjdHJsW2VwX251bV0pOworfQorCisvKiBHZXQgc3RhbGwgc3RhdHVzIG9mIGEgc3BlY2lmaWMgZXAKKyAgIFJldHVybjogMDogbm90IHN0YWxsZWQ7IDE6c3RhbGxlZCAqLworc3RhdGljIGludCBkcl9lcF9nZXRfc3RhbGwodW5zaWduZWQgY2hhciBlcF9udW0sIHVuc2lnbmVkIGNoYXIgZGlyKQoreworCXUzMiBlcGN0cmw7CisKKwllcGN0cmwgPSBmc2xfcmVhZGwoJmRyX3JlZ3MtPmVuZHB0Y3RybFtlcF9udW1dKTsKKwlpZiAoZGlyKQorCQlyZXR1cm4gKGVwY3RybCAmIEVQQ1RSTF9UWF9FUF9TVEFMTCkgPyAxIDogMDsKKwllbHNlCisJCXJldHVybiAoZXBjdHJsICYgRVBDVFJMX1JYX0VQX1NUQUxMKSA/IDEgOiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwlJbnRlcm5hbCBTdHJ1Y3R1cmUgQnVpbGQgdXAgZnVuY3Rpb25zCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyogc3RydWN0X2VwX3FoX3NldHVwKCk6IHNldCB0aGUgRW5kcG9pbnQgQ2FwYWJpbGl0ZXMgZmllbGQgb2YgUUgKKyAqIEB6bHQ6IFplcm8gTGVuZ3RoIFRlcm1pbmF0aW9uIFNlbGVjdCAoMTogZGlzYWJsZTsgMDogZW5hYmxlKQorICogQG11bHQ6IE11bHQgZmllbGQKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIHZvaWQgc3RydWN0X2VwX3FoX3NldHVwKHN0cnVjdCBmc2xfdWRjICp1ZGMsIHVuc2lnbmVkIGNoYXIgZXBfbnVtLAorCQl1bnNpZ25lZCBjaGFyIGRpciwgdW5zaWduZWQgY2hhciBlcF90eXBlLAorCQl1bnNpZ25lZCBpbnQgbWF4X3BrdF9sZW4sCisJCXVuc2lnbmVkIGludCB6bHQsIHVuc2lnbmVkIGNoYXIgbXVsdCkKK3sKKwlzdHJ1Y3QgZXBfcXVldWVfaGVhZCAqcF9RSCA9ICZ1ZGMtPmVwX3FoWzIgKiBlcF9udW0gKyBkaXJdOworCXVuc2lnbmVkIGludCB0bXAgPSAwOworCisJLyogc2V0IHRoZSBFbmRwb2ludCBDYXBhYmlsaXRlcyBpbiBRSCAqLworCXN3aXRjaCAoZXBfdHlwZSkgeworCWNhc2UgVVNCX0VORFBPSU5UX1hGRVJfQ09OVFJPTDoKKwkJLyogSW50ZXJydXB0IE9uIFNldHVwIChJT1MpLiBmb3IgY29udHJvbCBlcCAgKi8KKwkJdG1wID0gKG1heF9wa3RfbGVuIDw8IEVQX1FVRVVFX0hFQURfTUFYX1BLVF9MRU5fUE9TKQorCQkJfCBFUF9RVUVVRV9IRUFEX0lPUzsKKwkJYnJlYWs7CisJY2FzZSBVU0JfRU5EUE9JTlRfWEZFUl9JU09DOgorCQl0bXAgPSAobWF4X3BrdF9sZW4gPDwgRVBfUVVFVUVfSEVBRF9NQVhfUEtUX0xFTl9QT1MpCisJCQl8IChtdWx0IDw8IEVQX1FVRVVFX0hFQURfTVVMVF9QT1MpOworCQlicmVhazsKKwljYXNlIFVTQl9FTkRQT0lOVF9YRkVSX0JVTEs6CisJY2FzZSBVU0JfRU5EUE9JTlRfWEZFUl9JTlQ6CisJCXRtcCA9IG1heF9wa3RfbGVuIDw8IEVQX1FVRVVFX0hFQURfTUFYX1BLVF9MRU5fUE9TOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlWREJHKCJlcnJvciBlcCB0eXBlIGlzICVkIiwgZXBfdHlwZSk7CisJCXJldHVybjsKKwl9CisJaWYgKHpsdCkKKwkJdG1wIHw9IEVQX1FVRVVFX0hFQURfWkxUX1NFTDsKKwlwX1FILT5tYXhfcGt0X2xlbmd0aCA9IGNwdV90b19sZTMyKHRtcCk7CisKKwlyZXR1cm47Cit9CisKKy8qIFNldHVwIHFoIHN0cnVjdHVyZSBhbmQgZXAgcmVnaXN0ZXIgZm9yIGVwMC4gKi8KK3N0YXRpYyB2b2lkIGVwMF9zZXR1cChzdHJ1Y3QgZnNsX3VkYyAqdWRjKQoreworCS8qIHRoZSBpbnRpYWxpemF0aW9uIG9mIGFuIGVwIGluY2x1ZGVzOiBmaWVsZHMgaW4gUUgsIFJlZ3MsCisJICogZnNsX2VwIHN0cnVjdCAqLworCXN0cnVjdF9lcF9xaF9zZXR1cCh1ZGMsIDAsIFVTQl9SRUNWLCBVU0JfRU5EUE9JTlRfWEZFUl9DT05UUk9MLAorCQkJVVNCX01BWF9DVFJMX1BBWUxPQUQsIDAsIDApOworCXN0cnVjdF9lcF9xaF9zZXR1cCh1ZGMsIDAsIFVTQl9TRU5ELCBVU0JfRU5EUE9JTlRfWEZFUl9DT05UUk9MLAorCQkJVVNCX01BWF9DVFJMX1BBWUxPQUQsIDAsIDApOworCWRyX2VwX3NldHVwKDAsIFVTQl9SRUNWLCBVU0JfRU5EUE9JTlRfWEZFUl9DT05UUk9MKTsKKwlkcl9lcF9zZXR1cCgwLCBVU0JfU0VORCwgVVNCX0VORFBPSU5UX1hGRVJfQ09OVFJPTCk7CisKKwlyZXR1cm47CisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCUVuZHBvaW50IE1hbmFnZW1lbnQgRnVuY3Rpb25zCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB3aGVuIGNvbmZpZ3VyYXRpb25zIGFyZSBzZXQsIG9yIHdoZW4gaW50ZXJmYWNlIHNldHRpbmdzIGNoYW5nZQorICogZm9yIGV4YW1wbGUgdGhlIGRvX3NldF9pbnRlcmZhY2UoKSBpbiBnYWRnZXQgbGF5ZXIsCisgKiB0aGUgZHJpdmVyIHdpbGwgZW5hYmxlIG9yIGRpc2FibGUgdGhlIHJlbGV2YW50IGVuZHBvaW50cworICogZXAwIGRvZXNuJ3QgdXNlIHRoaXMgcm91dGluZS4gSXQgaXMgYWx3YXlzIGVuYWJsZWQuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBpbnQgZnNsX2VwX2VuYWJsZShzdHJ1Y3QgdXNiX2VwICpfZXAsCisJCWNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZGVzYykKK3sKKwlzdHJ1Y3QgZnNsX3VkYyAqdWRjID0gTlVMTDsKKwlzdHJ1Y3QgZnNsX2VwICplcCA9IE5VTEw7CisJdW5zaWduZWQgc2hvcnQgbWF4ID0gMDsKKwl1bnNpZ25lZCBjaGFyIG11bHQgPSAwLCB6bHQ7CisJaW50IHJldHZhbCA9IC1FSU5WQUw7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CisKKwllcCA9IGNvbnRhaW5lcl9vZihfZXAsIHN0cnVjdCBmc2xfZXAsIGVwKTsKKworCS8qIGNhdGNoIHZhcmlvdXMgYm9ndXMgcGFyYW1ldGVycyAqLworCWlmICghX2VwIHx8ICFkZXNjIHx8IGVwLT5kZXNjCisJCQl8fCAoZGVzYy0+YkRlc2NyaXB0b3JUeXBlICE9IFVTQl9EVF9FTkRQT0lOVCkpCisJCXJldHVybiAtRUlOVkFMOworCisJdWRjID0gZXAtPnVkYzsKKworCWlmICghdWRjLT5kcml2ZXIgfHwgKHVkYy0+Z2FkZ2V0LnNwZWVkID09IFVTQl9TUEVFRF9VTktOT1dOKSkKKwkJcmV0dXJuIC1FU0hVVERPV047CisKKwltYXggPSBsZTE2X3RvX2NwdShkZXNjLT53TWF4UGFja2V0U2l6ZSk7CisKKwkvKiBEaXNhYmxlIGF1dG9tYXRpYyB6bHAgZ2VuZXJhdGlvbi4gIERyaXZlciBpcyByZXBvbnNpYmxlIHRvIGluZGljYXRlCisJICogZXhwbGljaXRseSB0aHJvdWdoIHJlcS0+cmVxLnplcm8uICBUaGlzIGlzIG5lZWRlZCB0byBlbmFibGUgbXVsdGktdGQKKwkgKiByZXF1ZXN0LiAqLworCXpsdCA9IDE7CisKKwkvKiBBc3N1bWUgdGhlIG1heCBwYWNrZXQgc2l6ZSBmcm9tIGdhZGdldCBpcyBhbHdheXMgY29ycmVjdCAqLworCXN3aXRjaCAoZGVzYy0+Ym1BdHRyaWJ1dGVzICYgMHgwMykgeworCWNhc2UgVVNCX0VORFBPSU5UX1hGRVJfQ09OVFJPTDoKKwljYXNlIFVTQl9FTkRQT0lOVF9YRkVSX0JVTEs6CisJY2FzZSBVU0JfRU5EUE9JTlRfWEZFUl9JTlQ6CisJCS8qIG11bHQgPSAwLiAgRXhlY3V0ZSBOIFRyYW5zYWN0aW9ucyBhcyBkZW1vbnN0cmF0ZWQgYnkKKwkJICogdGhlIFVTQiB2YXJpYWJsZSBsZW5ndGggcGFja2V0IHByb3RvY29sIHdoZXJlIE4gaXMKKwkJICogY29tcHV0ZWQgdXNpbmcgdGhlIE1heGltdW0gUGFja2V0IExlbmd0aCAoZFFIKSBhbmQKKwkJICogdGhlIFRvdGFsIEJ5dGVzIGZpZWxkIChkVEQpICovCisJCW11bHQgPSAwOworCQlicmVhazsKKwljYXNlIFVTQl9FTkRQT0lOVF9YRkVSX0lTT0M6CisJCS8qIENhbGN1bGF0ZSB0cmFuc2FjdGlvbnMgbmVlZGVkIGZvciBoaWdoIGJhbmR3aWR0aCBpc28gKi8KKwkJbXVsdCA9ICh1bnNpZ25lZCBjaGFyKSgxICsgKChtYXggPj4gMTEpICYgMHgwMykpOworCQltYXggPSBtYXggJiAweDhmZjsJLyogYml0IDB+MTAgKi8KKwkJLyogMyB0cmFuc2FjdGlvbnMgYXQgbW9zdCAqLworCQlpZiAobXVsdCA+IDMpCisJCQlnb3RvIGVuX2RvbmU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWdvdG8gZW5fZG9uZTsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdWRjLT5sb2NrLCBmbGFncyk7CisJZXAtPmVwLm1heHBhY2tldCA9IG1heDsKKwllcC0+ZGVzYyA9IGRlc2M7CisJZXAtPnN0b3BwZWQgPSAwOworCisJLyogQ29udHJvbGxlciByZWxhdGVkIHNldHVwICovCisJLyogSW5pdCBFUHggUXVldWUgSGVhZCAoRXAgQ2FwYWJpbGl0ZXMgZmllbGQgaW4gUUgKKwkgKiBhY2NvcmRpbmcgdG8gbWF4LCB6bHQsIG11bHQpICovCisJc3RydWN0X2VwX3FoX3NldHVwKHVkYywgKHVuc2lnbmVkIGNoYXIpIGVwX2luZGV4KGVwKSwKKwkJCSh1bnNpZ25lZCBjaGFyKSAoKGRlc2MtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRElSX0lOKQorCQkJCQk/ICBVU0JfU0VORCA6IFVTQl9SRUNWKSwKKwkJCSh1bnNpZ25lZCBjaGFyKSAoZGVzYy0+Ym1BdHRyaWJ1dGVzCisJCQkJCSYgVVNCX0VORFBPSU5UX1hGRVJUWVBFX01BU0spLAorCQkJbWF4LCB6bHQsIG11bHQpOworCisJLyogSW5pdCBlbmRwb2ludCBjdHJsIHJlZ2lzdGVyICovCisJZHJfZXBfc2V0dXAoKHVuc2lnbmVkIGNoYXIpIGVwX2luZGV4KGVwKSwKKwkJCSh1bnNpZ25lZCBjaGFyKSAoKGRlc2MtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRElSX0lOKQorCQkJCQk/IFVTQl9TRU5EIDogVVNCX1JFQ1YpLAorCQkJKHVuc2lnbmVkIGNoYXIpIChkZXNjLT5ibUF0dHJpYnV0ZXMKKwkJCQkJJiBVU0JfRU5EUE9JTlRfWEZFUlRZUEVfTUFTSykpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdWRjLT5sb2NrLCBmbGFncyk7CisJcmV0dmFsID0gMDsKKworCVZEQkcoImVuYWJsZWQgJXMgKGVwJWQlcykgbWF4cGFja2V0ICVkIixlcC0+ZXAubmFtZSwKKwkJCWVwLT5kZXNjLT5iRW5kcG9pbnRBZGRyZXNzICYgMHgwZiwKKwkJCShkZXNjLT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0RJUl9JTikKKwkJCQk/ICJpbiIgOiAib3V0IiwgbWF4KTsKK2VuX2RvbmU6CisJcmV0dXJuIHJldHZhbDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEBlcCA6IHRoZSBlcCBiZWluZyB1bmNvbmZpZ3VyZWQuIE1heSBub3QgYmUgZXAwCisgKiBBbnkgcGVuZGluZyBhbmQgdW5jb21wbGV0ZSByZXEgd2lsbCBjb21wbGV0ZSB3aXRoIHN0YXR1cyAoLUVTSFVURE9XTikKKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGludCBmc2xfZXBfZGlzYWJsZShzdHJ1Y3QgdXNiX2VwICpfZXApCit7CisJc3RydWN0IGZzbF91ZGMgKnVkYyA9IE5VTEw7CisJc3RydWN0IGZzbF9lcCAqZXAgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCXUzMiBlcGN0cmw7CisJaW50IGVwX251bTsKKworCWVwID0gY29udGFpbmVyX29mKF9lcCwgc3RydWN0IGZzbF9lcCwgZXApOworCWlmICghX2VwIHx8ICFlcC0+ZGVzYykgeworCQlWREJHKCIlcyBub3QgZW5hYmxlZCIsIF9lcCA/IGVwLT5lcC5uYW1lIDogTlVMTCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIGRpc2FibGUgZXAgb24gY29udHJvbGxlciAqLworCWVwX251bSA9IGVwX2luZGV4KGVwKTsKKwllcGN0cmwgPSBmc2xfcmVhZGwoJmRyX3JlZ3MtPmVuZHB0Y3RybFtlcF9udW1dKTsKKwlpZiAoZXBfaXNfaW4oZXApKQorCQllcGN0cmwgJj0gfkVQQ1RSTF9UWF9FTkFCTEU7CisJZWxzZQorCQllcGN0cmwgJj0gfkVQQ1RSTF9SWF9FTkFCTEU7CisJZnNsX3dyaXRlbChlcGN0cmwsICZkcl9yZWdzLT5lbmRwdGN0cmxbZXBfbnVtXSk7CisKKwl1ZGMgPSAoc3RydWN0IGZzbF91ZGMgKillcC0+dWRjOworCXNwaW5fbG9ja19pcnFzYXZlKCZ1ZGMtPmxvY2ssIGZsYWdzKTsKKworCS8qIG51a2UgYWxsIHBlbmRpbmcgcmVxdWVzdHMgKGRvZXMgZmx1c2gpICovCisJbnVrZShlcCwgLUVTSFVURE9XTik7CisKKwllcC0+ZGVzYyA9IDA7CisJZXAtPnN0b3BwZWQgPSAxOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVkYy0+bG9jaywgZmxhZ3MpOworCisJVkRCRygiZGlzYWJsZWQgJXMgT0siLCBfZXAtPm5hbWUpOworCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogYWxsb2NhdGUgYSByZXF1ZXN0IG9iamVjdCB1c2VkIGJ5IHRoaXMgZW5kcG9pbnQKKyAqIHRoZSBtYWluIG9wZXJhdGlvbiBpcyB0byBpbnNlcnQgdGhlIHJlcS0+cXVldWUgdG8gdGhlIGVxLT5xdWV1ZQorICogUmV0dXJucyB0aGUgcmVxdWVzdCwgb3IgbnVsbCBpZiBvbmUgY291bGQgbm90IGJlIGFsbG9jYXRlZAorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgc3RydWN0IHVzYl9yZXF1ZXN0ICoKK2ZzbF9hbGxvY19yZXF1ZXN0KHN0cnVjdCB1c2JfZXAgKl9lcCwgZ2ZwX3QgZ2ZwX2ZsYWdzKQoreworCXN0cnVjdCBmc2xfcmVxICpyZXEgPSBOVUxMOworCisJcmVxID0ga3phbGxvYyhzaXplb2YgKnJlcSwgZ2ZwX2ZsYWdzKTsKKwlpZiAoIXJlcSkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXEtPnJlcS5kbWEgPSBETUFfQUREUl9JTlZBTElEOworCUlOSVRfTElTVF9IRUFEKCZyZXEtPnF1ZXVlKTsKKworCXJldHVybiAmcmVxLT5yZXE7Cit9CisKK3N0YXRpYyB2b2lkIGZzbF9mcmVlX3JlcXVlc3Qoc3RydWN0IHVzYl9lcCAqX2VwLCBzdHJ1Y3QgdXNiX3JlcXVlc3QgKl9yZXEpCit7CisJc3RydWN0IGZzbF9yZXEgKnJlcSA9IE5VTEw7CisKKwlyZXEgPSBjb250YWluZXJfb2YoX3JlcSwgc3RydWN0IGZzbF9yZXEsIHJlcSk7CisKKwlpZiAoX3JlcSkKKwkJa2ZyZWUocmVxKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEFsbG9jYXRlIGFuIEkvTyBidWZmZXIKKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIHZvaWQgKmZzbF9hbGxvY19idWZmZXIoc3RydWN0IHVzYl9lcCAqX2VwLCB1bnNpZ25lZCBieXRlcywKKwkJZG1hX2FkZHJfdCAqZG1hLCBnZnBfdCBnZnBfZmxhZ3MpCit7CisJc3RydWN0IGZzbF9lcCAqZXA7CisKKwlpZiAoIV9lcCkKKwkJcmV0dXJuIE5VTEw7CisKKwllcCA9IGNvbnRhaW5lcl9vZihfZXAsIHN0cnVjdCBmc2xfZXAsIGVwKTsKKworCXJldHVybiBkbWFfYWxsb2NfY29oZXJlbnQoZXAtPnVkYy0+Z2FkZ2V0LmRldi5wYXJlbnQsCisJCQlieXRlcywgZG1hLCBnZnBfZmxhZ3MpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogZnJlZXMgYW4gaS9vIGJ1ZmZlcgorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdm9pZCBmc2xfZnJlZV9idWZmZXIoc3RydWN0IHVzYl9lcCAqX2VwLCB2b2lkICpidWYsCisJCWRtYV9hZGRyX3QgZG1hLCB1bnNpZ25lZCBieXRlcykKK3sKKwlzdHJ1Y3QgZnNsX2VwICplcDsKKworCWlmICghX2VwKQorCQlyZXR1cm4gTlVMTDsKKworCWVwID0gY29udGFpbmVyX29mKF9lcCwgc3RydWN0IGZzbF9lcCwgZXApOworCisJZG1hX2ZyZWVfY29oZXJlbnQoZXAtPnVkYy0+Z2FkZ2V0LmRldi5wYXJlbnQsIGJ5dGVzLCBidWYsIGRtYSk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgaW50IGZzbF9xdWV1ZV90ZChzdHJ1Y3QgZnNsX2VwICplcCwgc3RydWN0IGZzbF9yZXEgKnJlcSkKK3sKKwlpbnQgaSA9IGVwX2luZGV4KGVwKSAqIDIgKyBlcF9pc19pbihlcCk7CisJdTMyIHRlbXAsIGJpdG1hc2ssIHRtcF9zdGF0OworCXN0cnVjdCBlcF9xdWV1ZV9oZWFkICpkUUggPSAmZXAtPnVkYy0+ZXBfcWhbaV07CisKKwkvKiBWREJHKCJRSCBhZGRyIFJlZ2lzdGVyIDB4JTh4IiwgZHJfcmVncy0+ZW5kcG9pbnRsaXN0YWRkcik7CisJVkRCRygiZXBfcWhbJWRdIGFkZHIgaXMgMHglOHgiLCBpLCAodTMyKSYoZXAtPnVkYy0+ZXBfcWhbaV0pKTsgKi8KKworCWJpdG1hc2sgPSBlcF9pc19pbihlcCkKKwkJPyAoMSA8PCAoZXBfaW5kZXgoZXApICsgMTYpKQorCQk6ICgxIDw8IChlcF9pbmRleChlcCkpKTsKKworCS8qIGNoZWNrIGlmIHRoZSBwaXBlIGlzIGVtcHR5ICovCisJaWYgKCEobGlzdF9lbXB0eSgmZXAtPnF1ZXVlKSkpIHsKKwkJLyogQWRkIHRkIHRvIHRoZSBlbmQgKi8KKwkJc3RydWN0IGZzbF9yZXEgKmxhc3RyZXE7CisJCWxhc3RyZXEgPSBsaXN0X2VudHJ5KGVwLT5xdWV1ZS5wcmV2LCBzdHJ1Y3QgZnNsX3JlcSwgcXVldWUpOworCQlsYXN0cmVxLT50YWlsLT5uZXh0X3RkX3B0ciA9CisJCQljcHVfdG9fbGUzMihyZXEtPmhlYWQtPnRkX2RtYSAmIERURF9BRERSX01BU0spOworCQkvKiBSZWFkIHByaW1lIGJpdCwgaWYgMSBnb3RvIGRvbmUgKi8KKwkJaWYgKGZzbF9yZWFkbCgmZHJfcmVncy0+ZW5kcG9pbnRwcmltZSkgJiBiaXRtYXNrKQorCQkJZ290byBvdXQ7CisKKwkJZG8geworCQkJLyogU2V0IEFURFRXIGJpdCBpbiBVU0JDTUQgKi8KKwkJCXRlbXAgPSBmc2xfcmVhZGwoJmRyX3JlZ3MtPnVzYmNtZCk7CisJCQlmc2xfd3JpdGVsKHRlbXAgfCBVU0JfQ01EX0FURFRXLCAmZHJfcmVncy0+dXNiY21kKTsKKworCQkJLyogUmVhZCBjb3JyZWN0IHN0YXR1cyBiaXQgKi8KKwkJCXRtcF9zdGF0ID0gZnNsX3JlYWRsKCZkcl9yZWdzLT5lbmRwdHN0YXR1cykgJiBiaXRtYXNrOworCisJCX0gd2hpbGUgKCEoZnNsX3JlYWRsKCZkcl9yZWdzLT51c2JjbWQpICYgVVNCX0NNRF9BVERUVykpOworCisJCS8qIFdyaXRlIEFURFRXIGJpdCB0byAwICovCisJCXRlbXAgPSBmc2xfcmVhZGwoJmRyX3JlZ3MtPnVzYmNtZCk7CisJCWZzbF93cml0ZWwodGVtcCAmIH5VU0JfQ01EX0FURFRXLCAmZHJfcmVncy0+dXNiY21kKTsKKworCQlpZiAodG1wX3N0YXQpCisJCQlnb3RvIG91dDsKKwl9CisKKwkvKiBXcml0ZSBkUUggbmV4dCBwb2ludGVyIGFuZCB0ZXJtaW5hdGUgYml0IHRvIDAgKi8KKwl0ZW1wID0gcmVxLT5oZWFkLT50ZF9kbWEgJiBFUF9RVUVVRV9IRUFEX05FWFRfUE9JTlRFUl9NQVNLOworCWRRSC0+bmV4dF9kdGRfcHRyID0gY3B1X3RvX2xlMzIodGVtcCk7CisKKwkvKiBDbGVhciBhY3RpdmUgYW5kIGhhbHQgYml0ICovCisJdGVtcCA9IGNwdV90b19sZTMyKH4oRVBfUVVFVUVfSEVBRF9TVEFUVVNfQUNUSVZFCisJCQl8IEVQX1FVRVVFX0hFQURfU1RBVFVTX0hBTFQpKTsKKwlkUUgtPnNpemVfaW9jX2ludF9zdHMgJj0gdGVtcDsKKworCS8qIFByaW1lIGVuZHBvaW50IGJ5IHdyaXRpbmcgMSB0byBFTkRQVFBSSU1FICovCisJdGVtcCA9IGVwX2lzX2luKGVwKQorCQk/ICgxIDw8IChlcF9pbmRleChlcCkgKyAxNikpCisJCTogKDEgPDwgKGVwX2luZGV4KGVwKSkpOworCWZzbF93cml0ZWwodGVtcCwgJmRyX3JlZ3MtPmVuZHBvaW50cHJpbWUpOworb3V0OgorCXJldHVybiAwOworfQorCisvKiBGaWxsIGluIHRoZSBkVEQgc3RydWN0dXJlCisgKiBAcmVxOiByZXF1ZXN0IHRoYXQgdGhlIHRyYW5zZmVyIGJlbG9uZ3MgdG8KKyAqIEBsZW5ndGg6IHJldHVybiBhY3R1YWxseSBkYXRhIGxlbmd0aCBvZiB0aGUgZFRECisgKiBAZG1hOiByZXR1cm4gZG1hIGFkZHJlc3Mgb2YgdGhlIGRURAorICogQGlzX2xhc3Q6IHJldHVybiBmbGFnIGlmIGl0IGlzIHRoZSBsYXN0IGRURCBvZiB0aGUgcmVxdWVzdAorICogcmV0dXJuOiBwb2ludGVyIHRvIHRoZSBidWlsdCBkVEQgKi8KK3N0YXRpYyBzdHJ1Y3QgZXBfdGRfc3RydWN0ICpmc2xfYnVpbGRfZHRkKHN0cnVjdCBmc2xfcmVxICpyZXEsIHVuc2lnbmVkICpsZW5ndGgsCisJCWRtYV9hZGRyX3QgKmRtYSwgaW50ICppc19sYXN0KQoreworCXUzMiBzd2FwX3RlbXA7CisJc3RydWN0IGVwX3RkX3N0cnVjdCAqZHRkOworCisJLyogaG93IGJpZyB3aWxsIHRoaXMgdHJhbnNmZXIgYmU/ICovCisJKmxlbmd0aCA9IG1pbihyZXEtPnJlcS5sZW5ndGggLSByZXEtPnJlcS5hY3R1YWwsCisJCQkodW5zaWduZWQpRVBfTUFYX0xFTkdUSF9UUkFOU0ZFUik7CisKKwlkdGQgPSBkbWFfcG9vbF9hbGxvYyh1ZGNfY29udHJvbGxlci0+dGRfcG9vbCwgR0ZQX0tFUk5FTCwgZG1hKTsKKwlpZiAoZHRkID09IE5VTEwpCisJCXJldHVybiBkdGQ7CisKKwlkdGQtPnRkX2RtYSA9ICpkbWE7CisJLyogQ2xlYXIgcmVzZXJ2ZWQgZmllbGQgKi8KKwlzd2FwX3RlbXAgPSBjcHVfdG9fbGUzMihkdGQtPnNpemVfaW9jX3N0cyk7CisJc3dhcF90ZW1wICY9IH5EVERfUkVTRVJWRURfRklFTERTOworCWR0ZC0+c2l6ZV9pb2Nfc3RzID0gY3B1X3RvX2xlMzIoc3dhcF90ZW1wKTsKKworCS8qIEluaXQgYWxsIG9mIGJ1ZmZlciBwYWdlIHBvaW50ZXJzICovCisJc3dhcF90ZW1wID0gKHUzMikgKHJlcS0+cmVxLmRtYSArIHJlcS0+cmVxLmFjdHVhbCk7CisJZHRkLT5idWZmX3B0cjAgPSBjcHVfdG9fbGUzMihzd2FwX3RlbXApOworCWR0ZC0+YnVmZl9wdHIxID0gY3B1X3RvX2xlMzIoc3dhcF90ZW1wICsgMHgxMDAwKTsKKwlkdGQtPmJ1ZmZfcHRyMiA9IGNwdV90b19sZTMyKHN3YXBfdGVtcCArIDB4MjAwMCk7CisJZHRkLT5idWZmX3B0cjMgPSBjcHVfdG9fbGUzMihzd2FwX3RlbXAgKyAweDMwMDApOworCWR0ZC0+YnVmZl9wdHI0ID0gY3B1X3RvX2xlMzIoc3dhcF90ZW1wICsgMHg0MDAwKTsKKworCXJlcS0+cmVxLmFjdHVhbCArPSAqbGVuZ3RoOworCisJLyogemxwIGlzIG5lZWRlZCBpZiByZXEtPnJlcS56ZXJvIGlzIHNldCAqLworCWlmIChyZXEtPnJlcS56ZXJvKSB7CisJCWlmICgqbGVuZ3RoID09IDAgfHwgKCpsZW5ndGggJSByZXEtPmVwLT5lcC5tYXhwYWNrZXQpICE9IDApCisJCQkqaXNfbGFzdCA9IDE7CisJCWVsc2UKKwkJCSppc19sYXN0ID0gMDsKKwl9IGVsc2UgaWYgKHJlcS0+cmVxLmxlbmd0aCA9PSByZXEtPnJlcS5hY3R1YWwpCisJCSppc19sYXN0ID0gMTsKKwllbHNlCisJCSppc19sYXN0ID0gMDsKKworCWlmICgoKmlzX2xhc3QpID09IDApCisJCVZEQkcoIm11bHRpLWR0ZCByZXF1ZXN0IVxuIik7CisJLyogRmlsbCBpbiB0aGUgdHJhbnNmZXIgc2l6ZTsgc2V0IGFjdGl2ZSBiaXQgKi8KKwlzd2FwX3RlbXAgPSAoKCpsZW5ndGggPDwgRFREX0xFTkdUSF9CSVRfUE9TKSB8IERURF9TVEFUVVNfQUNUSVZFKTsKKworCS8qIEVuYWJsZSBpbnRlcnJ1cHQgZm9yIHRoZSBsYXN0IGR0ZCBvZiBhIHJlcXVlc3QgKi8KKwlpZiAoKmlzX2xhc3QgJiYgIXJlcS0+cmVxLm5vX2ludGVycnVwdCkKKwkJc3dhcF90ZW1wIHw9IERURF9JT0M7CisKKwlkdGQtPnNpemVfaW9jX3N0cyA9IGNwdV90b19sZTMyKHN3YXBfdGVtcCk7CisKKwltYigpOworCisJVkRCRygibGVuZ3RoID0gJWQgYWRkcmVzcz0gMHgleCIsICpsZW5ndGgsIChpbnQpKmRtYSk7CisKKwlyZXR1cm4gZHRkOworfQorCisvKiBHZW5lcmF0ZSBkdGQgY2hhaW4gZm9yIGEgcmVxdWVzdCAqLworc3RhdGljIGludCBmc2xfcmVxX3RvX2R0ZChzdHJ1Y3QgZnNsX3JlcSAqcmVxKQoreworCXVuc2lnbmVkCWNvdW50OworCWludAkJaXNfbGFzdDsKKwlpbnQJCWlzX2ZpcnN0ID0xOworCXN0cnVjdCBlcF90ZF9zdHJ1Y3QJKmxhc3RfZHRkID0gTlVMTCwgKmR0ZDsKKwlkbWFfYWRkcl90IGRtYTsKKworCWRvIHsKKwkJZHRkID0gZnNsX2J1aWxkX2R0ZChyZXEsICZjb3VudCwgJmRtYSwgJmlzX2xhc3QpOworCQlpZiAoZHRkID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQlpZiAoaXNfZmlyc3QpIHsKKwkJCWlzX2ZpcnN0ID0gMDsKKwkJCXJlcS0+aGVhZCA9IGR0ZDsKKwkJfSBlbHNlIHsKKwkJCWxhc3RfZHRkLT5uZXh0X3RkX3B0ciA9IGNwdV90b19sZTMyKGRtYSk7CisJCQlsYXN0X2R0ZC0+bmV4dF90ZF92aXJ0ID0gZHRkOworCQl9CisJCWxhc3RfZHRkID0gZHRkOworCisJCXJlcS0+ZHRkX2NvdW50Kys7CisJfSB3aGlsZSAoIWlzX2xhc3QpOworCisJZHRkLT5uZXh0X3RkX3B0ciA9IGNwdV90b19sZTMyKERURF9ORVhUX1RFUk1JTkFURSk7CisKKwlyZXEtPnRhaWwgPSBkdGQ7CisKKwlyZXR1cm4gMDsKK30KKworLyogcXVldWVzIChzdWJtaXRzKSBhbiBJL08gcmVxdWVzdCB0byBhbiBlbmRwb2ludCAqLworc3RhdGljIGludAorZnNsX2VwX3F1ZXVlKHN0cnVjdCB1c2JfZXAgKl9lcCwgc3RydWN0IHVzYl9yZXF1ZXN0ICpfcmVxLCBnZnBfdCBnZnBfZmxhZ3MpCit7CisJc3RydWN0IGZzbF9lcCAqZXAgPSBjb250YWluZXJfb2YoX2VwLCBzdHJ1Y3QgZnNsX2VwLCBlcCk7CisJc3RydWN0IGZzbF9yZXEgKnJlcSA9IGNvbnRhaW5lcl9vZihfcmVxLCBzdHJ1Y3QgZnNsX3JlcSwgcmVxKTsKKwlzdHJ1Y3QgZnNsX3VkYyAqdWRjOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGlzX2lzbyA9IDA7CisKKwkvKiBjYXRjaCB2YXJpb3VzIGJvZ3VzIHBhcmFtZXRlcnMgKi8KKwlpZiAoIV9yZXEgfHwgIXJlcS0+cmVxLmNvbXBsZXRlIHx8ICFyZXEtPnJlcS5idWYKKwkJCXx8ICFsaXN0X2VtcHR5KCZyZXEtPnF1ZXVlKSkgeworCQlWREJHKCIlcywgYmFkIHBhcmFtc1xuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmICghX2VwIHx8ICghZXAtPmRlc2MgJiYgZXBfaW5kZXgoZXApKSkgeworCQlWREJHKCIlcywgYmFkIGVwXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKGVwLT5kZXNjLT5ibUF0dHJpYnV0ZXMgPT0gVVNCX0VORFBPSU5UX1hGRVJfSVNPQykgeworCQlpZiAocmVxLT5yZXEubGVuZ3RoID4gZXAtPmVwLm1heHBhY2tldCkKKwkJCXJldHVybiAtRU1TR1NJWkU7CisJCWlzX2lzbyA9IDE7CisJfQorCisJdWRjID0gZXAtPnVkYzsKKwlpZiAoIXVkYy0+ZHJpdmVyIHx8IHVkYy0+Z2FkZ2V0LnNwZWVkID09IFVTQl9TUEVFRF9VTktOT1dOKQorCQlyZXR1cm4gLUVTSFVURE9XTjsKKworCXJlcS0+ZXAgPSBlcDsKKworCS8qIG1hcCB2aXJ0dWFsIGFkZHJlc3MgdG8gaGFyZHdhcmUgKi8KKwlpZiAocmVxLT5yZXEuZG1hID09IERNQV9BRERSX0lOVkFMSUQpIHsKKwkJcmVxLT5yZXEuZG1hID0gZG1hX21hcF9zaW5nbGUoZXAtPnVkYy0+Z2FkZ2V0LmRldi5wYXJlbnQsCisJCQkJCXJlcS0+cmVxLmJ1ZiwKKwkJCQkJcmVxLT5yZXEubGVuZ3RoLCBlcF9pc19pbihlcCkKKwkJCQkJCT8gRE1BX1RPX0RFVklDRQorCQkJCQkJOiBETUFfRlJPTV9ERVZJQ0UpOworCQlyZXEtPm1hcHBlZCA9IDE7CisJfSBlbHNlIHsKKwkJZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UoZXAtPnVkYy0+Z2FkZ2V0LmRldi5wYXJlbnQsCisJCQkJCXJlcS0+cmVxLmRtYSwgcmVxLT5yZXEubGVuZ3RoLAorCQkJCQllcF9pc19pbihlcCkKKwkJCQkJCT8gRE1BX1RPX0RFVklDRQorCQkJCQkJOiBETUFfRlJPTV9ERVZJQ0UpOworCQlyZXEtPm1hcHBlZCA9IDA7CisJfQorCisJcmVxLT5yZXEuc3RhdHVzID0gLUVJTlBST0dSRVNTOworCXJlcS0+cmVxLmFjdHVhbCA9IDA7CisJcmVxLT5kdGRfY291bnQgPSAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnVkYy0+bG9jaywgZmxhZ3MpOworCisJLyogYnVpbGQgZHRkcyBhbmQgcHVzaCB0aGVtIHRvIGRldmljZSBxdWV1ZSAqLworCWlmICghZnNsX3JlcV90b19kdGQocmVxKSkgeworCQlmc2xfcXVldWVfdGQoZXAsIHJlcSk7CisJfSBlbHNlIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdWRjLT5sb2NrLCBmbGFncyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIFVwZGF0ZSBlcDAgc3RhdGUgKi8KKwlpZiAoKGVwX2luZGV4KGVwKSA9PSAwKSkKKwkJdWRjLT5lcDBfc3RhdGUgPSBEQVRBX1NUQVRFX1hNSVQ7CisKKwkvKiBpcnEgaGFuZGxlciBhZHZhbmNlcyB0aGUgcXVldWUgKi8KKwlpZiAocmVxICE9IE5VTEwpCisJCWxpc3RfYWRkX3RhaWwoJnJlcS0+cXVldWUsICZlcC0+cXVldWUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVkYy0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIGRlcXVldWVzIChjYW5jZWxzLCB1bmxpbmtzKSBhbiBJL08gcmVxdWVzdCBmcm9tIGFuIGVuZHBvaW50ICovCitzdGF0aWMgaW50IGZzbF9lcF9kZXF1ZXVlKHN0cnVjdCB1c2JfZXAgKl9lcCwgc3RydWN0IHVzYl9yZXF1ZXN0ICpfcmVxKQoreworCXN0cnVjdCBmc2xfZXAgKmVwID0gY29udGFpbmVyX29mKF9lcCwgc3RydWN0IGZzbF9lcCwgZXApOworCXN0cnVjdCBmc2xfcmVxICpyZXE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZXBfbnVtLCBzdG9wcGVkLCByZXQgPSAwOworCXUzMiBlcGN0cmw7CisKKwlpZiAoIV9lcCB8fCAhX3JlcSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZXAtPnVkYy0+bG9jaywgZmxhZ3MpOworCXN0b3BwZWQgPSBlcC0+c3RvcHBlZDsKKworCS8qIFN0b3AgdGhlIGVwIGJlZm9yZSB3ZSBkZWFsIHdpdGggdGhlIHF1ZXVlICovCisJZXAtPnN0b3BwZWQgPSAxOworCWVwX251bSA9IGVwX2luZGV4KGVwKTsKKwllcGN0cmwgPSBmc2xfcmVhZGwoJmRyX3JlZ3MtPmVuZHB0Y3RybFtlcF9udW1dKTsKKwlpZiAoZXBfaXNfaW4oZXApKQorCQllcGN0cmwgJj0gfkVQQ1RSTF9UWF9FTkFCTEU7CisJZWxzZQorCQllcGN0cmwgJj0gfkVQQ1RSTF9SWF9FTkFCTEU7CisJZnNsX3dyaXRlbChlcGN0cmwsICZkcl9yZWdzLT5lbmRwdGN0cmxbZXBfbnVtXSk7CisKKwkvKiBtYWtlIHN1cmUgaXQncyBhY3R1YWxseSBxdWV1ZWQgb24gdGhpcyBlbmRwb2ludCAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkocmVxLCAmZXAtPnF1ZXVlLCBxdWV1ZSkgeworCQlpZiAoJnJlcS0+cmVxID09IF9yZXEpCisJCQlicmVhazsKKwl9CisJaWYgKCZyZXEtPnJlcSAhPSBfcmVxKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCS8qIFRoZSByZXF1ZXN0IGlzIGluIHByb2dyZXNzLCBvciBjb21wbGV0ZWQgYnV0IG5vdCBkZXF1ZXVlZCAqLworCWlmIChlcC0+cXVldWUubmV4dCA9PSAmcmVxLT5xdWV1ZSkgeworCQlfcmVxLT5zdGF0dXMgPSAtRUNPTk5SRVNFVDsKKwkJZnNsX2VwX2ZpZm9fZmx1c2goX2VwKTsJLyogZmx1c2ggY3VycmVudCB0cmFuc2ZlciAqLworCisJCS8qIFRoZSByZXF1ZXN0IGlzbid0IHRoZSBsYXN0IHJlcXVlc3QgaW4gdGhpcyBlcCBxdWV1ZSAqLworCQlpZiAocmVxLT5xdWV1ZS5uZXh0ICE9ICZlcC0+cXVldWUpIHsKKwkJCXN0cnVjdCBlcF9xdWV1ZV9oZWFkICpxaDsKKwkJCXN0cnVjdCBmc2xfcmVxICpuZXh0X3JlcTsKKworCQkJcWggPSBlcC0+cWg7CisJCQluZXh0X3JlcSA9IGxpc3RfZW50cnkocmVxLT5xdWV1ZS5uZXh0LCBzdHJ1Y3QgZnNsX3JlcSwKKwkJCQkJcXVldWUpOworCisJCQkvKiBQb2ludCB0aGUgUUggdG8gdGhlIGZpcnN0IFREIG9mIG5leHQgcmVxdWVzdCAqLworCQkJZnNsX3dyaXRlbCgodTMyKSBuZXh0X3JlcS0+aGVhZCwgJnFoLT5jdXJyX2R0ZF9wdHIpOworCQl9CisKKwkJLyogVGhlIHJlcXVlc3QgaGFzbid0IGJlZW4gcHJvY2Vzc2VkLCBwYXRjaCB1cCB0aGUgVEQgY2hhaW4gKi8KKwl9IGVsc2UgeworCQlzdHJ1Y3QgZnNsX3JlcSAqcHJldl9yZXE7CisKKwkJcHJldl9yZXEgPSBsaXN0X2VudHJ5KHJlcS0+cXVldWUucHJldiwgc3RydWN0IGZzbF9yZXEsIHF1ZXVlKTsKKwkJZnNsX3dyaXRlbChmc2xfcmVhZGwoJnJlcS0+dGFpbC0+bmV4dF90ZF9wdHIpLAorCQkJCSZwcmV2X3JlcS0+dGFpbC0+bmV4dF90ZF9wdHIpOworCisJfQorCisJZG9uZShlcCwgcmVxLCAtRUNPTk5SRVNFVCk7CisKKwkvKiBFbmFibGUgRVAgKi8KK291dDoJZXBjdHJsID0gZnNsX3JlYWRsKCZkcl9yZWdzLT5lbmRwdGN0cmxbZXBfbnVtXSk7CisJaWYgKGVwX2lzX2luKGVwKSkKKwkJZXBjdHJsIHw9IEVQQ1RSTF9UWF9FTkFCTEU7CisJZWxzZQorCQllcGN0cmwgfD0gRVBDVFJMX1JYX0VOQUJMRTsKKwlmc2xfd3JpdGVsKGVwY3RybCwgJmRyX3JlZ3MtPmVuZHB0Y3RybFtlcF9udW1dKTsKKwllcC0+c3RvcHBlZCA9IHN0b3BwZWQ7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlcC0+dWRjLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJldDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogbW9kaWZ5IHRoZSBlbmRwb2ludCBoYWx0IGZlYXR1cmUKKyAqIEBlcDogdGhlIG5vbi1pc29jaHJvbm91cyBlbmRwb2ludCBiZWluZyBzdGFsbGVkCisgKiBAdmFsdWU6IDEtLXNldCBoYWx0ICAwLS1jbGVhciBoYWx0CisgKiBSZXR1cm5zIHplcm8sIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBpbnQgZnNsX2VwX3NldF9oYWx0KHN0cnVjdCB1c2JfZXAgKl9lcCwgaW50IHZhbHVlKQoreworCXN0cnVjdCBmc2xfZXAgKmVwID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKKwlpbnQgc3RhdHVzID0gLUVPUE5PVFNVUFA7CS8qIG9wZXJhdGlvbiBub3Qgc3VwcG9ydGVkICovCisJdW5zaWduZWQgY2hhciBlcF9kaXIgPSAwLCBlcF9udW0gPSAwOworCXN0cnVjdCBmc2xfdWRjICp1ZGMgPSBOVUxMOworCisJZXAgPSBjb250YWluZXJfb2YoX2VwLCBzdHJ1Y3QgZnNsX2VwLCBlcCk7CisJdWRjID0gZXAtPnVkYzsKKwlpZiAoIV9lcCB8fCAhZXAtPmRlc2MpIHsKKwkJc3RhdHVzID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGVwLT5kZXNjLT5ibUF0dHJpYnV0ZXMgPT0gVVNCX0VORFBPSU5UX1hGRVJfSVNPQykgeworCQlzdGF0dXMgPSAtRU9QTk9UU1VQUDsKKwkJZ290byBvdXQ7CisJfQorCisJLyogQXR0ZW1wdCB0byBoYWx0IElOIGVwIHdpbGwgZmFpbCBpZiBhbnkgdHJhbnNmZXIgcmVxdWVzdHMKKwkgKiBhcmUgc3RpbGwgcXVldWUgKi8KKwlpZiAodmFsdWUgJiYgZXBfaXNfaW4oZXApICYmICFsaXN0X2VtcHR5KCZlcC0+cXVldWUpKSB7CisJCXN0YXR1cyA9IC1FQUdBSU47CisJCWdvdG8gb3V0OworCX0KKworCXN0YXR1cyA9IDA7CisJZXBfZGlyID0gZXBfaXNfaW4oZXApID8gVVNCX1NFTkQgOiBVU0JfUkVDVjsKKwllcF9udW0gPSAodW5zaWduZWQgY2hhcikoZXBfaW5kZXgoZXApKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZXAtPnVkYy0+bG9jaywgZmxhZ3MpOworCWRyX2VwX2NoYW5nZV9zdGFsbChlcF9udW0sIGVwX2RpciwgdmFsdWUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVwLT51ZGMtPmxvY2ssIGZsYWdzKTsKKworCWlmIChlcF9pbmRleChlcCkgPT0gMCkgeworCQl1ZGMtPmVwMF9zdGF0ZSA9IFdBSVRfRk9SX1NFVFVQOworCQl1ZGMtPmVwMF9kaXIgPSAwOworCX0KK291dDoKKwlWREJHKCIgJXMgJXMgaGFsdCBzdGF0ICVkIiwgZXAtPmVwLm5hbWUsCisJCQl2YWx1ZSA/ICAic2V0IiA6ICJjbGVhciIsIHN0YXR1cyk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgdm9pZCBmc2xfZXBfZmlmb19mbHVzaChzdHJ1Y3QgdXNiX2VwICpfZXApCit7CisJc3RydWN0IGZzbF9lcCAqZXA7CisJaW50IGVwX251bSwgZXBfZGlyOworCXUzMiBiaXRzOworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKyNkZWZpbmUgRlNMX1VEQ19GTFVTSF9USU1FT1VUIDEwMDAKKworCWlmICghX2VwKSB7CisJCXJldHVybjsKKwl9IGVsc2UgeworCQllcCA9IGNvbnRhaW5lcl9vZihfZXAsIHN0cnVjdCBmc2xfZXAsIGVwKTsKKwkJaWYgKCFlcC0+ZGVzYykKKwkJCXJldHVybjsKKwl9CisJZXBfbnVtID0gZXBfaW5kZXgoZXApOworCWVwX2RpciA9IGVwX2lzX2luKGVwKSA/IFVTQl9TRU5EIDogVVNCX1JFQ1Y7CisKKwlpZiAoZXBfbnVtID09IDApCisJCWJpdHMgPSAoMSA8PCAxNikgfCAxOworCWVsc2UgaWYgKGVwX2RpciA9PSBVU0JfU0VORCkKKwkJYml0cyA9IDEgPDwgKDE2ICsgZXBfbnVtKTsKKwllbHNlCisJCWJpdHMgPSAxIDw8IGVwX251bTsKKworCXRpbWVvdXQgPSBqaWZmaWVzICsgRlNMX1VEQ19GTFVTSF9USU1FT1VUOworCWRvIHsKKwkJZnNsX3dyaXRlbChiaXRzLCAmZHJfcmVncy0+ZW5kcHRmbHVzaCk7CisKKwkJLyogV2FpdCB1bnRpbCBmbHVzaCBjb21wbGV0ZSAqLworCQl3aGlsZSAoZnNsX3JlYWRsKCZkcl9yZWdzLT5lbmRwdGZsdXNoKSkgeworCQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpIHsKKwkJCQlFUlIoImVwIGZsdXNoIHRpbWVvdXRcbiIpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWNwdV9yZWxheCgpOworCQl9CisJCS8qIFNlZSBpZiB3ZSBuZWVkIHRvIGZsdXNoIGFnYWluICovCisJfSB3aGlsZSAoZnNsX3JlYWRsKCZkcl9yZWdzLT5lbmRwdHN0YXR1cykgJiBiaXRzKTsKK30KKworc3RhdGljIHN0cnVjdCB1c2JfZXBfb3BzIGZzbF9lcF9vcHMgPSB7CisJLmVuYWJsZSA9IGZzbF9lcF9lbmFibGUsCisJLmRpc2FibGUgPSBmc2xfZXBfZGlzYWJsZSwKKworCS5hbGxvY19yZXF1ZXN0ID0gZnNsX2FsbG9jX3JlcXVlc3QsCisJLmZyZWVfcmVxdWVzdCA9IGZzbF9mcmVlX3JlcXVlc3QsCisKKwkuYWxsb2NfYnVmZmVyID0gZnNsX2FsbG9jX2J1ZmZlciwKKwkuZnJlZV9idWZmZXIgPSBmc2xfZnJlZV9idWZmZXIsCisKKwkucXVldWUgPSBmc2xfZXBfcXVldWUsCisJLmRlcXVldWUgPSBmc2xfZXBfZGVxdWV1ZSwKKworCS5zZXRfaGFsdCA9IGZzbF9lcF9zZXRfaGFsdCwKKwkuZmlmb19mbHVzaCA9IGZzbF9lcF9maWZvX2ZsdXNoLAkvKiBmbHVzaCBmaWZvICovCit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJR2FkZ2V0IERyaXZlciBMYXllciBPcGVyYXRpb25zCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBHZXQgdGhlIGN1cnJlbnQgZnJhbWUgbnVtYmVyIChmcm9tIERSIGZyYW1lX2luZGV4IFJlZyApCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGludCBmc2xfZ2V0X2ZyYW1lKHN0cnVjdCB1c2JfZ2FkZ2V0ICpnYWRnZXQpCit7CisJcmV0dXJuIChpbnQpKGZzbF9yZWFkbCgmZHJfcmVncy0+ZnJpbmRleCkgJiBVU0JfRlJJTkRFWF9NQVNLUyk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFRyaWVzIHRvIHdha2UgdXAgdGhlIGhvc3QgY29ubmVjdGVkIHRvIHRoaXMgZ2FkZ2V0CisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGludCBmc2xfd2FrZXVwKHN0cnVjdCB1c2JfZ2FkZ2V0ICpnYWRnZXQpCit7CisJc3RydWN0IGZzbF91ZGMgKnVkYyA9IGNvbnRhaW5lcl9vZihnYWRnZXQsIHN0cnVjdCBmc2xfdWRjLCBnYWRnZXQpOworCXUzMiBwb3J0c2M7CisKKwkvKiBSZW1vdGUgd2FrZXVwIGZlYXR1cmUgbm90IGVuYWJsZWQgYnkgaG9zdCAqLworCWlmICghdWRjLT5yZW1vdGVfd2FrZXVwKQorCQlyZXR1cm4gLUVOT1RTVVBQOworCisJcG9ydHNjID0gZnNsX3JlYWRsKCZkcl9yZWdzLT5wb3J0c2MxKTsKKwkvKiBub3Qgc3VzcGVuZGVkPyAqLworCWlmICghKHBvcnRzYyAmIFBPUlRTQ1hfUE9SVF9TVVNQRU5EKSkKKwkJcmV0dXJuIDA7CisJLyogdHJpZ2dlciBmb3JjZSByZXN1bWUgKi8KKwlwb3J0c2MgfD0gUE9SVFNDWF9QT1JUX0ZPUkNFX1JFU1VNRTsKKwlmc2xfd3JpdGVsKHBvcnRzYywgJmRyX3JlZ3MtPnBvcnRzYzEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNhbl9wdWxsdXAoc3RydWN0IGZzbF91ZGMgKnVkYykKK3sKKwlyZXR1cm4gdWRjLT5kcml2ZXIgJiYgdWRjLT5zb2Z0Y29ubmVjdCAmJiB1ZGMtPnZidXNfYWN0aXZlOworfQorCisvKiBOb3RpZnkgY29udHJvbGxlciB0aGF0IFZCVVMgaXMgcG93ZXJlZCwgQ2FsbGVkIGJ5IHdoYXRldmVyCisgICBkZXRlY3RzIFZCVVMgc2Vzc2lvbnMgKi8KK3N0YXRpYyBpbnQgZnNsX3ZidXNfc2Vzc2lvbihzdHJ1Y3QgdXNiX2dhZGdldCAqZ2FkZ2V0LCBpbnQgaXNfYWN0aXZlKQoreworCXN0cnVjdCBmc2xfdWRjCSp1ZGM7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworCXVkYyA9IGNvbnRhaW5lcl9vZihnYWRnZXQsIHN0cnVjdCBmc2xfdWRjLCBnYWRnZXQpOworCXNwaW5fbG9ja19pcnFzYXZlKCZ1ZGMtPmxvY2ssIGZsYWdzKTsKKwlWREJHKCJWQlVTICVzXG4iLCBpc19hY3RpdmUgPyAib24iIDogIm9mZiIpOworCXVkYy0+dmJ1c19hY3RpdmUgPSAoaXNfYWN0aXZlICE9IDApOworCWlmIChjYW5fcHVsbHVwKHVkYykpCisJCWZzbF93cml0ZWwoKGZzbF9yZWFkbCgmZHJfcmVncy0+dXNiY21kKSB8IFVTQl9DTURfUlVOX1NUT1ApLAorCQkJCSZkcl9yZWdzLT51c2JjbWQpOworCWVsc2UKKwkJZnNsX3dyaXRlbCgoZnNsX3JlYWRsKCZkcl9yZWdzLT51c2JjbWQpICYgflVTQl9DTURfUlVOX1NUT1ApLAorCQkJCSZkcl9yZWdzLT51c2JjbWQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVkYy0+bG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCisvKiBjb25zdHJhaW4gY29udHJvbGxlcidzIFZCVVMgcG93ZXIgdXNhZ2UKKyAqIFRoaXMgY2FsbCBpcyB1c2VkIGJ5IGdhZGdldCBkcml2ZXJzIGR1cmluZyBTRVRfQ09ORklHVVJBVElPTiBjYWxscywKKyAqIHJlcG9ydGluZyBob3cgbXVjaCBwb3dlciB0aGUgZGV2aWNlIG1heSBjb25zdW1lLiAgRm9yIGV4YW1wbGUsIHRoaXMKKyAqIGNvdWxkIGFmZmVjdCBob3cgcXVpY2tseSBiYXR0ZXJpZXMgYXJlIHJlY2hhcmdlZC4KKyAqCisgKiBSZXR1cm5zIHplcm8gb24gc3VjY2VzcywgZWxzZSBuZWdhdGl2ZSBlcnJuby4KKyAqLworc3RhdGljIGludCBmc2xfdmJ1c19kcmF3KHN0cnVjdCB1c2JfZ2FkZ2V0ICpnYWRnZXQsIHVuc2lnbmVkIG1BKQoreworI2lmZGVmIENPTkZJR19VU0JfT1RHCisJc3RydWN0IGZzbF91ZGMgKnVkYzsKKworCXVkYyA9IGNvbnRhaW5lcl9vZihnYWRnZXQsIHN0cnVjdCBmc2xfdWRjLCBnYWRnZXQpOworCisJaWYgKHVkYy0+dHJhbnNjZWl2ZXIpCisJCXJldHVybiBvdGdfc2V0X3Bvd2VyKHVkYy0+dHJhbnNjZWl2ZXIsIG1BKTsKKyNlbmRpZgorCXJldHVybiAtRU5PVFNVUFA7Cit9CisKKy8qIENoYW5nZSBEYXRhKyBwdWxsdXAgc3RhdHVzCisgKiB0aGlzIGZ1bmMgaXMgdXNlZCBieSB1c2JfZ2FkZ2V0X2Nvbm5lY3QvZGlzY29ubmV0CisgKi8KK3N0YXRpYyBpbnQgZnNsX3B1bGx1cChzdHJ1Y3QgdXNiX2dhZGdldCAqZ2FkZ2V0LCBpbnQgaXNfb24pCit7CisJc3RydWN0IGZzbF91ZGMgKnVkYzsKKworCXVkYyA9IGNvbnRhaW5lcl9vZihnYWRnZXQsIHN0cnVjdCBmc2xfdWRjLCBnYWRnZXQpOworCXVkYy0+c29mdGNvbm5lY3QgPSAoaXNfb24gIT0gMCk7CisJaWYgKGNhbl9wdWxsdXAodWRjKSkKKwkJZnNsX3dyaXRlbCgoZnNsX3JlYWRsKCZkcl9yZWdzLT51c2JjbWQpIHwgVVNCX0NNRF9SVU5fU1RPUCksCisJCQkJJmRyX3JlZ3MtPnVzYmNtZCk7CisJZWxzZQorCQlmc2xfd3JpdGVsKChmc2xfcmVhZGwoJmRyX3JlZ3MtPnVzYmNtZCkgJiB+VVNCX0NNRF9SVU5fU1RPUCksCisJCQkJJmRyX3JlZ3MtPnVzYmNtZCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogZGVmaW5lZCBpbiB1c2JfZ2FkZ2V0LmggKi8KK3N0YXRpYyBzdHJ1Y3QgdXNiX2dhZGdldF9vcHMgZnNsX2dhZGdldF9vcHMgPSB7CisJLmdldF9mcmFtZSA9IGZzbF9nZXRfZnJhbWUsCisJLndha2V1cCA9IGZzbF93YWtldXAsCisvKgkuc2V0X3NlbGZwb3dlcmVkID0gZnNsX3NldF9zZWxmcG93ZXJlZCwJKi8gLyogQWx3YXlzIHNlbGZwb3dlcmVkICovCisJLnZidXNfc2Vzc2lvbiA9IGZzbF92YnVzX3Nlc3Npb24sCisJLnZidXNfZHJhdyA9IGZzbF92YnVzX2RyYXcsCisJLnB1bGx1cCA9IGZzbF9wdWxsdXAsCit9OworCisvKiBTZXQgcHJvdG9jb2wgc3RhbGwgb24gZXAwLCBwcm90b2NvbCBzdGFsbCB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgY2xlYXJlZAorICAgb24gbmV3IHRyYW5zYWN0aW9uICovCitzdGF0aWMgdm9pZCBlcDBzdGFsbChzdHJ1Y3QgZnNsX3VkYyAqdWRjKQoreworCXUzMiB0bXA7CisKKwkvKiBtdXN0IHNldCB0eCBhbmQgcnggdG8gc3RhbGwgYXQgdGhlIHNhbWUgdGltZSAqLworCXRtcCA9IGZzbF9yZWFkbCgmZHJfcmVncy0+ZW5kcHRjdHJsWzBdKTsKKwl0bXAgfD0gRVBDVFJMX1RYX0VQX1NUQUxMIHwgRVBDVFJMX1JYX0VQX1NUQUxMOworCWZzbF93cml0ZWwodG1wLCAmZHJfcmVncy0+ZW5kcHRjdHJsWzBdKTsKKwl1ZGMtPmVwMF9zdGF0ZSA9IFdBSVRfRk9SX1NFVFVQOworCXVkYy0+ZXAwX2RpciA9IDA7Cit9CisKKy8qIFByaW1lIGEgc3RhdHVzIHBoYXNlIGZvciBlcDAgKi8KK3N0YXRpYyBpbnQgZXAwX3ByaW1lX3N0YXR1cyhzdHJ1Y3QgZnNsX3VkYyAqdWRjLCBpbnQgZGlyZWN0aW9uKQoreworCXN0cnVjdCBmc2xfcmVxICpyZXEgPSB1ZGMtPnN0YXR1c19yZXE7CisJc3RydWN0IGZzbF9lcCAqZXA7CisJaW50IHN0YXR1cyA9IDA7CisKKwlpZiAoZGlyZWN0aW9uID09IEVQX0RJUl9JTikKKwkJdWRjLT5lcDBfZGlyID0gVVNCX0RJUl9JTjsKKwllbHNlCisJCXVkYy0+ZXAwX2RpciA9IFVTQl9ESVJfT1VUOworCisJZXAgPSAmdWRjLT5lcHNbMF07CisJdWRjLT5lcDBfc3RhdGUgPSBXQUlUX0ZPUl9PVVRfU1RBVFVTOworCisJcmVxLT5lcCA9IGVwOworCXJlcS0+cmVxLmxlbmd0aCA9IDA7CisJcmVxLT5yZXEuc3RhdHVzID0gLUVJTlBST0dSRVNTOworCXJlcS0+cmVxLmFjdHVhbCA9IDA7CisJcmVxLT5yZXEuY29tcGxldGUgPSBOVUxMOworCXJlcS0+ZHRkX2NvdW50ID0gMDsKKworCWlmIChmc2xfcmVxX3RvX2R0ZChyZXEpID09IDApCisJCXN0YXR1cyA9IGZzbF9xdWV1ZV90ZChlcCwgcmVxKTsKKwllbHNlCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKHN0YXR1cykKKwkJRVJSKCJDYW4ndCBxdWV1ZSBlcDAgc3RhdHVzIHJlcXVlc3QgXG4iKTsKKwlsaXN0X2FkZF90YWlsKCZyZXEtPnF1ZXVlLCAmZXAtPnF1ZXVlKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHVkY19yZXNldF9lcF9xdWV1ZShzdHJ1Y3QgZnNsX3VkYyAqdWRjLCB1OCBwaXBlKQoreworCXN0cnVjdCBmc2xfZXAgKmVwID0gZ2V0X2VwX2J5X3BpcGUodWRjLCBwaXBlKTsKKworCWlmICghZXAtPm5hbWUpCisJCXJldHVybiAwOworCisJbnVrZShlcCwgLUVTSFVURE9XTik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGNoOSBTZXQgYWRkcmVzcworICovCitzdGF0aWMgdm9pZCBjaDlzZXRhZGRyZXNzKHN0cnVjdCBmc2xfdWRjICp1ZGMsIHUxNiB2YWx1ZSwgdTE2IGluZGV4LCB1MTYgbGVuZ3RoKQoreworCS8qIFNhdmUgdGhlIG5ldyBhZGRyZXNzIHRvIGRldmljZSBzdHJ1Y3QgKi8KKwl1ZGMtPmRldmljZV9hZGRyZXNzID0gKHU4KSB2YWx1ZTsKKwkvKiBVcGRhdGUgdXNiIHN0YXRlICovCisJdWRjLT51c2Jfc3RhdGUgPSBVU0JfU1RBVEVfQUREUkVTUzsKKwkvKiBTdGF0dXMgcGhhc2UgKi8KKwlpZiAoZXAwX3ByaW1lX3N0YXR1cyh1ZGMsIEVQX0RJUl9JTikpCisJCWVwMHN0YWxsKHVkYyk7Cit9CisKKy8qCisgKiBjaDkgR2V0IHN0YXR1cworICovCitzdGF0aWMgdm9pZCBjaDlnZXRzdGF0dXMoc3RydWN0IGZzbF91ZGMgKnVkYywgdTggcmVxdWVzdF90eXBlLCB1MTYgdmFsdWUsCisJCXUxNiBpbmRleCwgdTE2IGxlbmd0aCkKK3sKKwl1MTYgdG1wID0gMDsJCS8qIFN0YXR1cywgY3B1IGVuZGlhbiAqLworCisJc3RydWN0IGZzbF9yZXEgKnJlcTsKKwlzdHJ1Y3QgZnNsX2VwICplcDsKKwlpbnQgc3RhdHVzID0gMDsKKworCWVwID0gJnVkYy0+ZXBzWzBdOworCisJaWYgKChyZXF1ZXN0X3R5cGUgJiBVU0JfUkVDSVBfTUFTSykgPT0gVVNCX1JFQ0lQX0RFVklDRSkgeworCQkvKiBHZXQgZGV2aWNlIHN0YXR1cyAqLworCQl0bXAgPSAxIDw8IFVTQl9ERVZJQ0VfU0VMRl9QT1dFUkVEOworCQl0bXAgfD0gdWRjLT5yZW1vdGVfd2FrZXVwIDw8IFVTQl9ERVZJQ0VfUkVNT1RFX1dBS0VVUDsKKwl9IGVsc2UgaWYgKChyZXF1ZXN0X3R5cGUgJiBVU0JfUkVDSVBfTUFTSykgPT0gVVNCX1JFQ0lQX0lOVEVSRkFDRSkgeworCQkvKiBHZXQgaW50ZXJmYWNlIHN0YXR1cyAqLworCQkvKiBXZSBkb24ndCBoYXZlIGludGVyZmFjZSBpbmZvcm1hdGlvbiBpbiB1ZGMgZHJpdmVyICovCisJCXRtcCA9IDA7CisJfSBlbHNlIGlmICgocmVxdWVzdF90eXBlICYgVVNCX1JFQ0lQX01BU0spID09IFVTQl9SRUNJUF9FTkRQT0lOVCkgeworCQkvKiBHZXQgZW5kcG9pbnQgc3RhdHVzICovCisJCXN0cnVjdCBmc2xfZXAgKnRhcmdldF9lcDsKKworCQl0YXJnZXRfZXAgPSBnZXRfZXBfYnlfcGlwZSh1ZGMsIGdldF9waXBlX2J5X3dpbmRleChpbmRleCkpOworCisJCS8qIHN0YWxsIGlmIGVuZHBvaW50IGRvZXNuJ3QgZXhpc3QgKi8KKwkJaWYgKCF0YXJnZXRfZXAtPmRlc2MpCisJCQlnb3RvIHN0YWxsOworCQl0bXAgPSBkcl9lcF9nZXRfc3RhbGwoZXBfaW5kZXgodGFyZ2V0X2VwKSwgZXBfaXNfaW4odGFyZ2V0X2VwKSkKKwkJCQk8PCBVU0JfRU5EUE9JTlRfSEFMVDsKKwl9CisKKwl1ZGMtPmVwMF9kaXIgPSBVU0JfRElSX0lOOworCS8qIEJvcnJvdyB0aGUgcGVyIGRldmljZSBzdGF0dXNfcmVxICovCisJcmVxID0gdWRjLT5zdGF0dXNfcmVxOworCS8qIEZpbGwgaW4gdGhlIHJlcWVzdCBzdHJ1Y3R1cmUgKi8KKwkqKCh1MTYgKikgcmVxLT5yZXEuYnVmKSA9IGNwdV90b19sZTE2KHRtcCk7CisJcmVxLT5lcCA9IGVwOworCXJlcS0+cmVxLmxlbmd0aCA9IDI7CisJcmVxLT5yZXEuc3RhdHVzID0gLUVJTlBST0dSRVNTOworCXJlcS0+cmVxLmFjdHVhbCA9IDA7CisJcmVxLT5yZXEuY29tcGxldGUgPSBOVUxMOworCXJlcS0+ZHRkX2NvdW50ID0gMDsKKworCS8qIHByaW1lIHRoZSBkYXRhIHBoYXNlICovCisJaWYgKChmc2xfcmVxX3RvX2R0ZChyZXEpID09IDApKQorCQlzdGF0dXMgPSBmc2xfcXVldWVfdGQoZXAsIHJlcSk7CisJZWxzZQkJCS8qIG5vIG1lbSAqLworCQlnb3RvIHN0YWxsOworCisJaWYgKHN0YXR1cykgeworCQlFUlIoIkNhbid0IHJlc3BvbmQgdG8gZ2V0c3RhdHVzIHJlcXVlc3QgXG4iKTsKKwkJZ290byBzdGFsbDsKKwl9CisJbGlzdF9hZGRfdGFpbCgmcmVxLT5xdWV1ZSwgJmVwLT5xdWV1ZSk7CisJdWRjLT5lcDBfc3RhdGUgPSBEQVRBX1NUQVRFX1hNSVQ7CisJcmV0dXJuOworc3RhbGw6CisJZXAwc3RhbGwodWRjKTsKK30KKworc3RhdGljIHZvaWQgc2V0dXBfcmVjZWl2ZWRfaXJxKHN0cnVjdCBmc2xfdWRjICp1ZGMsCisJCXN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKnNldHVwKQoreworCXUxNiB3VmFsdWUgPSBsZTE2X3RvX2NwdShzZXR1cC0+d1ZhbHVlKTsKKwl1MTYgd0luZGV4ID0gbGUxNl90b19jcHUoc2V0dXAtPndJbmRleCk7CisJdTE2IHdMZW5ndGggPSBsZTE2X3RvX2NwdShzZXR1cC0+d0xlbmd0aCk7CisKKwl1ZGNfcmVzZXRfZXBfcXVldWUodWRjLCAwKTsKKworCXN3aXRjaCAoc2V0dXAtPmJSZXF1ZXN0KSB7CisJCS8qIFJlcXVlc3QgdGhhdCBuZWVkIERhdGErU3RhdHVzIHBoYXNlIGZyb20gdWRjICovCisJY2FzZSBVU0JfUkVRX0dFVF9TVEFUVVM6CisJCWlmICgoc2V0dXAtPmJSZXF1ZXN0VHlwZSAmIChVU0JfRElSX0lOIHwgVVNCX1RZUEVfU1RBTkRBUkQpKQorCQkJCQkhPSAoVVNCX0RJUl9JTiB8IFVTQl9UWVBFX1NUQU5EQVJEKSkKKwkJCWJyZWFrOworCQljaDlnZXRzdGF0dXModWRjLCBzZXR1cC0+YlJlcXVlc3RUeXBlLCB3VmFsdWUsIHdJbmRleCwgd0xlbmd0aCk7CisJCWJyZWFrOworCisJCS8qIFJlcXVlc3RzIHRoYXQgbmVlZCBTdGF0dXMgcGhhc2UgZnJvbSB1ZGMgKi8KKwljYXNlIFVTQl9SRVFfU0VUX0FERFJFU1M6CisJCWlmIChzZXR1cC0+YlJlcXVlc3RUeXBlICE9IChVU0JfRElSX09VVCB8IFVTQl9UWVBFX1NUQU5EQVJECisJCQkJCQl8IFVTQl9SRUNJUF9ERVZJQ0UpKQorCQkJYnJlYWs7CisJCWNoOXNldGFkZHJlc3ModWRjLCB3VmFsdWUsIHdJbmRleCwgd0xlbmd0aCk7CisJCWJyZWFrOworCisJCS8qIEhhbmRsZWQgYnkgdWRjLCBubyBkYXRhLCBzdGF0dXMgYnkgdWRjICovCisJY2FzZSBVU0JfUkVRX0NMRUFSX0ZFQVRVUkU6CisJY2FzZSBVU0JfUkVRX1NFVF9GRUFUVVJFOgorCXsJLyogc3RhdHVzIHRyYW5zYWN0aW9uICovCisJCWludCByYyA9IC1FT1BOT1RTVVBQOworCisJCWlmICgoc2V0dXAtPmJSZXF1ZXN0VHlwZSAmIFVTQl9SRUNJUF9NQVNLKQorCQkJCT09IFVTQl9SRUNJUF9FTkRQT0lOVCkgeworCQkJaW50IHBpcGUgPSBnZXRfcGlwZV9ieV93aW5kZXgod0luZGV4KTsKKwkJCXN0cnVjdCBmc2xfZXAgKmVwOworCisJCQlpZiAod1ZhbHVlICE9IDAgfHwgd0xlbmd0aCAhPSAwIHx8IHBpcGUgPiB1ZGMtPm1heF9lcCkKKwkJCQlicmVhazsKKwkJCWVwID0gZ2V0X2VwX2J5X3BpcGUodWRjLCBwaXBlKTsKKworCQkJc3Bpbl91bmxvY2soJnVkYy0+bG9jayk7CisJCQlyYyA9IGZzbF9lcF9zZXRfaGFsdCgmZXAtPmVwLAorCQkJCQkoc2V0dXAtPmJSZXF1ZXN0ID09IFVTQl9SRVFfU0VUX0ZFQVRVUkUpCisJCQkJCQk/IDEgOiAwKTsKKwkJCXNwaW5fbG9jaygmdWRjLT5sb2NrKTsKKworCQl9IGVsc2UgaWYgKChzZXR1cC0+YlJlcXVlc3RUeXBlICYgVVNCX1JFQ0lQX01BU0spCisJCQkJPT0gVVNCX1JFQ0lQX0RFVklDRSkgeworCQkJLyogTm90ZTogVGhlIGRyaXZlciBoYXMgbm90IGluY2x1ZGUgT1RHIHN1cHBvcnQgeWV0LgorCQkJICogVGhpcyB3aWxsIGJlIHNldCB3aGVuIE9URyBzdXBwb3J0IGlzIGFkZGVkICovCisJCQlpZiAoIXVkYy0+Z2FkZ2V0LmlzX290ZykKKwkJCQlicmVhazsKKwkJCWVsc2UgaWYgKHNldHVwLT5iUmVxdWVzdCA9PSBVU0JfREVWSUNFX0JfSE5QX0VOQUJMRSkKKwkJCQl1ZGMtPmdhZGdldC5iX2hucF9lbmFibGUgPSAxOworCQkJZWxzZSBpZiAoc2V0dXAtPmJSZXF1ZXN0ID09IFVTQl9ERVZJQ0VfQV9ITlBfU1VQUE9SVCkKKwkJCQl1ZGMtPmdhZGdldC5hX2hucF9zdXBwb3J0ID0gMTsKKwkJCWVsc2UgaWYgKHNldHVwLT5iUmVxdWVzdCA9PQorCQkJCQlVU0JfREVWSUNFX0FfQUxUX0hOUF9TVVBQT1JUKQorCQkJCXVkYy0+Z2FkZ2V0LmFfYWx0X2hucF9zdXBwb3J0ID0gMTsKKwkJCXJjID0gMDsKKwkJfQorCQlpZiAocmMgPT0gMCkgeworCQkJaWYgKGVwMF9wcmltZV9zdGF0dXModWRjLCBFUF9ESVJfSU4pKQorCQkJCWVwMHN0YWxsKHVkYyk7CisJCX0KKwkJYnJlYWs7CisJfQorCQkvKiBSZXF1ZXN0cyBoYW5kbGVkIGJ5IGdhZGdldCAqLworCWRlZmF1bHQ6CisJCWlmICh3TGVuZ3RoKSB7CisJCQkvKiBEYXRhIHBoYXNlIGZyb20gZ2FkZ2V0LCBzdGF0dXMgcGhhc2UgZnJvbSB1ZGMgKi8KKwkJCXVkYy0+ZXAwX2RpciA9IChzZXR1cC0+YlJlcXVlc3RUeXBlICYgVVNCX0RJUl9JTikKKwkJCQkJPyAgVVNCX0RJUl9JTiA6IFVTQl9ESVJfT1VUOworCQkJc3Bpbl91bmxvY2soJnVkYy0+bG9jayk7CisJCQlpZiAodWRjLT5kcml2ZXItPnNldHVwKCZ1ZGMtPmdhZGdldCwKKwkJCQkJJnVkYy0+bG9jYWxfc2V0dXBfYnVmZikgPCAwKQorCQkJCWVwMHN0YWxsKHVkYyk7CisJCQlzcGluX2xvY2soJnVkYy0+bG9jayk7CisJCQl1ZGMtPmVwMF9zdGF0ZSA9IChzZXR1cC0+YlJlcXVlc3RUeXBlICYgVVNCX0RJUl9JTikKKwkJCQkJPyAgREFUQV9TVEFURV9YTUlUIDogREFUQV9TVEFURV9SRUNWOworCisJCX0gZWxzZSB7CisJCQkvKiBObyBkYXRhIHBoYXNlLCBJTiBzdGF0dXMgZnJvbSBnYWRnZXQgKi8KKwkJCXVkYy0+ZXAwX2RpciA9IFVTQl9ESVJfSU47CisJCQlzcGluX3VubG9jaygmdWRjLT5sb2NrKTsKKwkJCWlmICh1ZGMtPmRyaXZlci0+c2V0dXAoJnVkYy0+Z2FkZ2V0LAorCQkJCQkmdWRjLT5sb2NhbF9zZXR1cF9idWZmKSA8IDApCisJCQkJZXAwc3RhbGwodWRjKTsKKwkJCXNwaW5fbG9jaygmdWRjLT5sb2NrKTsKKwkJCXVkYy0+ZXAwX3N0YXRlID0gV0FJVF9GT1JfT1VUX1NUQVRVUzsKKwkJfQorCQlicmVhazsKKwl9Cit9CisKKy8qIFByb2Nlc3MgcmVxdWVzdCBmb3IgRGF0YSBvciBTdGF0dXMgcGhhc2Ugb2YgZXAwCisgKiBwcmltZSBzdGF0dXMgcGhhc2UgaWYgbmVlZGVkICovCitzdGF0aWMgdm9pZCBlcDBfcmVxX2NvbXBsZXRlKHN0cnVjdCBmc2xfdWRjICp1ZGMsIHN0cnVjdCBmc2xfZXAgKmVwMCwKKwkJc3RydWN0IGZzbF9yZXEgKnJlcSkKK3sKKwlpZiAodWRjLT51c2Jfc3RhdGUgPT0gVVNCX1NUQVRFX0FERFJFU1MpIHsKKwkJLyogU2V0IHRoZSBuZXcgYWRkcmVzcyAqLworCQl1MzIgbmV3X2FkZHJlc3MgPSAodTMyKSB1ZGMtPmRldmljZV9hZGRyZXNzOworCQlmc2xfd3JpdGVsKG5ld19hZGRyZXNzIDw8IFVTQl9ERVZJQ0VfQUREUkVTU19CSVRfUE9TLAorCQkJCSZkcl9yZWdzLT5kZXZpY2VhZGRyKTsKKwl9CisKKwlkb25lKGVwMCwgcmVxLCAwKTsKKworCXN3aXRjaCAodWRjLT5lcDBfc3RhdGUpIHsKKwljYXNlIERBVEFfU1RBVEVfWE1JVDoKKwkJLyogcmVjZWl2ZSBzdGF0dXMgcGhhc2UgKi8KKwkJaWYgKGVwMF9wcmltZV9zdGF0dXModWRjLCBFUF9ESVJfT1VUKSkKKwkJCWVwMHN0YWxsKHVkYyk7CisJCWJyZWFrOworCWNhc2UgREFUQV9TVEFURV9SRUNWOgorCQkvKiBzZW5kIHN0YXR1cyBwaGFzZSAqLworCQlpZiAoZXAwX3ByaW1lX3N0YXR1cyh1ZGMsIEVQX0RJUl9JTikpCisJCQllcDBzdGFsbCh1ZGMpOworCQlicmVhazsKKwljYXNlIFdBSVRfRk9SX09VVF9TVEFUVVM6CisJCXVkYy0+ZXAwX3N0YXRlID0gV0FJVF9GT1JfU0VUVVA7CisJCWJyZWFrOworCWNhc2UgV0FJVF9GT1JfU0VUVVA6CisJCUVSUigiVW5leHBlY3QgZXAwIHBhY2tldHMgXG4iKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZXAwc3RhbGwodWRjKTsKKwkJYnJlYWs7CisJfQorfQorCisvKiBUcmlwd2lyZSBtZWNoYW5pc20gdG8gZW5zdXJlIGEgc2V0dXAgcGFja2V0IHBheWxvYWQgaXMgZXh0cmFjdGVkIHdpdGhvdXQKKyAqIGJlaW5nIGNvcnJ1cHRlZCBieSBhbm90aGVyIGluY29taW5nIHNldHVwIHBhY2tldCAqLworc3RhdGljIHZvaWQgdHJpcHdpcmVfaGFuZGxlcihzdHJ1Y3QgZnNsX3VkYyAqdWRjLCB1OCBlcF9udW0sIHU4ICpidWZmZXJfcHRyKQoreworCXUzMiB0ZW1wOworCXN0cnVjdCBlcF9xdWV1ZV9oZWFkICpxaDsKKworCXFoID0gJnVkYy0+ZXBfcWhbZXBfbnVtICogMiArIEVQX0RJUl9PVVRdOworCisJLyogQ2xlYXIgYml0IGluIEVORFBUU0VUVVBTVEFUICovCisJdGVtcCA9IGZzbF9yZWFkbCgmZHJfcmVncy0+ZW5kcHRzZXR1cHN0YXQpOworCWZzbF93cml0ZWwodGVtcCB8ICgxIDw8IGVwX251bSksICZkcl9yZWdzLT5lbmRwdHNldHVwc3RhdCk7CisKKwkvKiB3aGlsZSBhIGhhemFyZCBleGlzdHMgd2hlbiBzZXR1cCBwYWNrYWdlIGFycml2ZXMgKi8KKwlkbyB7CisJCS8qIFNldCBTZXR1cCBUcmlwd2lyZSAqLworCQl0ZW1wID0gZnNsX3JlYWRsKCZkcl9yZWdzLT51c2JjbWQpOworCQlmc2xfd3JpdGVsKHRlbXAgfCBVU0JfQ01EX1NVVFcsICZkcl9yZWdzLT51c2JjbWQpOworCisJCS8qIENvcHkgdGhlIHNldHVwIHBhY2tldCB0byBsb2NhbCBidWZmZXIgKi8KKwkJbWVtY3B5KGJ1ZmZlcl9wdHIsICh1OCAqKSBxaC0+c2V0dXBfYnVmZmVyLCA4KTsKKwl9IHdoaWxlICghKGZzbF9yZWFkbCgmZHJfcmVncy0+dXNiY21kKSAmIFVTQl9DTURfU1VUVykpOworCisJLyogQ2xlYXIgU2V0dXAgVHJpcHdpcmUgKi8KKwl0ZW1wID0gZnNsX3JlYWRsKCZkcl9yZWdzLT51c2JjbWQpOworCWZzbF93cml0ZWwodGVtcCAmIH5VU0JfQ01EX1NVVFcsICZkcl9yZWdzLT51c2JjbWQpOworfQorCisvKiBwcm9jZXNzLWVwX3JlcSgpOiBmcmVlIHRoZSBjb21wbGV0ZWQgVGRzIGZvciB0aGlzIHJlcSAqLworc3RhdGljIGludCBwcm9jZXNzX2VwX3JlcShzdHJ1Y3QgZnNsX3VkYyAqdWRjLCBpbnQgcGlwZSwKKwkJc3RydWN0IGZzbF9yZXEgKmN1cnJfcmVxKQoreworCXN0cnVjdCBlcF90ZF9zdHJ1Y3QgKmN1cnJfdGQ7CisJaW50CXRkX2NvbXBsZXRlLCBhY3R1YWwsIHJlbWFpbmluZ19sZW5ndGgsIGosIHRtcDsKKwlpbnQJc3RhdHVzID0gMDsKKwlpbnQJZXJyb3JzID0gMDsKKwlzdHJ1Y3QgIGVwX3F1ZXVlX2hlYWQgKmN1cnJfcWggPSAmdWRjLT5lcF9xaFtwaXBlXTsKKwlpbnQgZGlyZWN0aW9uID0gcGlwZSAlIDI7CisKKwljdXJyX3RkID0gY3Vycl9yZXEtPmhlYWQ7CisJdGRfY29tcGxldGUgPSAwOworCWFjdHVhbCA9IGN1cnJfcmVxLT5yZXEubGVuZ3RoOworCisJZm9yIChqID0gMDsgaiA8IGN1cnJfcmVxLT5kdGRfY291bnQ7IGorKykgeworCQlyZW1haW5pbmdfbGVuZ3RoID0gKGxlMzJfdG9fY3B1KGN1cnJfdGQtPnNpemVfaW9jX3N0cykKKwkJCQkJJiBEVERfUEFDS0VUX1NJWkUpCisJCQkJPj4gRFREX0xFTkdUSF9CSVRfUE9TOworCQlhY3R1YWwgLT0gcmVtYWluaW5nX2xlbmd0aDsKKworCQlpZiAoKGVycm9ycyA9IGxlMzJfdG9fY3B1KGN1cnJfdGQtPnNpemVfaW9jX3N0cykgJgorCQkJCQkJRFREX0VSUk9SX01BU0spKSB7CisJCQlpZiAoZXJyb3JzICYgRFREX1NUQVRVU19IQUxURUQpIHsKKwkJCQlFUlIoImRURCBlcnJvciAlMDh4IFFIPSVkXG4iLCBlcnJvcnMsIHBpcGUpOworCQkJCS8qIENsZWFyIHRoZSBlcnJvcnMgYW5kIEhhbHQgY29uZGl0aW9uICovCisJCQkJdG1wID0gbGUzMl90b19jcHUoY3Vycl9xaC0+c2l6ZV9pb2NfaW50X3N0cyk7CisJCQkJdG1wICY9IH5lcnJvcnM7CisJCQkJY3Vycl9xaC0+c2l6ZV9pb2NfaW50X3N0cyA9IGNwdV90b19sZTMyKHRtcCk7CisJCQkJc3RhdHVzID0gLUVQSVBFOworCQkJCS8qIEZJWE1FOiBjb250aW51ZSB3aXRoIG5leHQgcXVldWVkIFREPyAqLworCisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoZXJyb3JzICYgRFREX1NUQVRVU19EQVRBX0JVRkZfRVJSKSB7CisJCQkJVkRCRygiVHJhbnNmZXIgb3ZlcmZsb3ciKTsKKwkJCQlzdGF0dXMgPSAtRVBST1RPOworCQkJCWJyZWFrOworCQkJfSBlbHNlIGlmIChlcnJvcnMgJiBEVERfU1RBVFVTX1RSQU5TQUNUSU9OX0VSUikgeworCQkJCVZEQkcoIklTTyBlcnJvciIpOworCQkJCXN0YXR1cyA9IC1FSUxTRVE7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UKKwkJCQlFUlIoIlVua25vd24gZXJyb3IgaGFzIG9jY3VyZWQgKDB4JXgpIVxyXG4iLAorCQkJCQllcnJvcnMpOworCisJCX0gZWxzZSBpZiAobGUzMl90b19jcHUoY3Vycl90ZC0+c2l6ZV9pb2Nfc3RzKQorCQkJCSYgRFREX1NUQVRVU19BQ1RJVkUpIHsKKwkJCVZEQkcoIlJlcXVlc3Qgbm90IGNvbXBsZXRlIik7CisJCQlzdGF0dXMgPSBSRVFfVU5DT01QTEVURTsKKwkJCXJldHVybiBzdGF0dXM7CisJCX0gZWxzZSBpZiAocmVtYWluaW5nX2xlbmd0aCkgeworCQkJaWYgKGRpcmVjdGlvbikgeworCQkJCVZEQkcoIlRyYW5zbWl0IGRURCByZW1haW5pbmcgbGVuZ3RoIG5vdCB6ZXJvIik7CisJCQkJc3RhdHVzID0gLUVQUk9UTzsKKwkJCQlicmVhazsKKwkJCX0gZWxzZSB7CisJCQkJdGRfY29tcGxldGUrKzsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXRkX2NvbXBsZXRlKys7CisJCQlWREJHKCJkVEQgdHJhbnNtaXR0ZWQgc3VjY2Vzc2Z1bCAiKTsKKwkJfQorCisJCWlmIChqICE9IGN1cnJfcmVxLT5kdGRfY291bnQgLSAxKQorCQkJY3Vycl90ZCA9IChzdHJ1Y3QgZXBfdGRfc3RydWN0ICopY3Vycl90ZC0+bmV4dF90ZF92aXJ0OworCX0KKworCWlmIChzdGF0dXMpCisJCXJldHVybiBzdGF0dXM7CisKKwljdXJyX3JlcS0+cmVxLmFjdHVhbCA9IGFjdHVhbDsKKworCXJldHVybiAwOworfQorCisvKiBQcm9jZXNzIGEgRFREIGNvbXBsZXRpb24gaW50ZXJydXB0ICovCitzdGF0aWMgdm9pZCBkdGRfY29tcGxldGVfaXJxKHN0cnVjdCBmc2xfdWRjICp1ZGMpCit7CisJdTMyIGJpdF9wb3M7CisJaW50IGksIGVwX251bSwgZGlyZWN0aW9uLCBiaXRfbWFzaywgc3RhdHVzOworCXN0cnVjdCBmc2xfZXAgKmN1cnJfZXA7CisJc3RydWN0IGZzbF9yZXEgKmN1cnJfcmVxLCAqdGVtcF9yZXE7CisKKwkvKiBDbGVhciB0aGUgYml0cyBpbiB0aGUgcmVnaXN0ZXIgKi8KKwliaXRfcG9zID0gZnNsX3JlYWRsKCZkcl9yZWdzLT5lbmRwdGNvbXBsZXRlKTsKKwlmc2xfd3JpdGVsKGJpdF9wb3MsICZkcl9yZWdzLT5lbmRwdGNvbXBsZXRlKTsKKworCWlmICghYml0X3BvcykKKwkJcmV0dXJuOworCisJZm9yIChpID0gMDsgaSA8IHVkYy0+bWF4X2VwICogMjsgaSsrKSB7CisJCWVwX251bSA9IGkgPj4gMTsKKwkJZGlyZWN0aW9uID0gaSAlIDI7CisKKwkJYml0X21hc2sgPSAxIDw8IChlcF9udW0gKyAxNiAqIGRpcmVjdGlvbik7CisKKwkJaWYgKCEoYml0X3BvcyAmIGJpdF9tYXNrKSkKKwkJCWNvbnRpbnVlOworCisJCWN1cnJfZXAgPSBnZXRfZXBfYnlfcGlwZSh1ZGMsIGkpOworCisJCS8qIElmIHRoZSBlcCBpcyBjb25maWd1cmVkICovCisJCWlmIChjdXJyX2VwLT5uYW1lID09IE5VTEwpIHsKKwkJCVdBUk4oIkludmFsaWQgRVA/Iik7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIHByb2Nlc3MgdGhlIHJlcSBxdWV1ZSB1bnRpbCBhbiB1bmNvbXBsZXRlIHJlcXVlc3QgKi8KKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGN1cnJfcmVxLCB0ZW1wX3JlcSwgJmN1cnJfZXAtPnF1ZXVlLAorCQkJCXF1ZXVlKSB7CisJCQlzdGF0dXMgPSBwcm9jZXNzX2VwX3JlcSh1ZGMsIGksIGN1cnJfcmVxKTsKKworCQkJVkRCRygic3RhdHVzIG9mIHByb2Nlc3NfZXBfcmVxPSAlZCwgZXAgPSAlZCIsCisJCQkJCXN0YXR1cywgZXBfbnVtKTsKKwkJCWlmIChzdGF0dXMgPT0gUkVRX1VOQ09NUExFVEUpCisJCQkJYnJlYWs7CisJCQkvKiB3cml0ZSBiYWNrIHN0YXR1cyB0byByZXEgKi8KKwkJCWN1cnJfcmVxLT5yZXEuc3RhdHVzID0gc3RhdHVzOworCisJCQlpZiAoZXBfbnVtID09IDApIHsKKwkJCQllcDBfcmVxX2NvbXBsZXRlKHVkYywgY3Vycl9lcCwgY3Vycl9yZXEpOworCQkJCWJyZWFrOworCQkJfSBlbHNlCisJCQkJZG9uZShjdXJyX2VwLCBjdXJyX3JlcSwgc3RhdHVzKTsKKwkJfQorCX0KK30KKworLyogUHJvY2VzcyBhIHBvcnQgY2hhbmdlIGludGVycnVwdCAqLworc3RhdGljIHZvaWQgcG9ydF9jaGFuZ2VfaXJxKHN0cnVjdCBmc2xfdWRjICp1ZGMpCit7CisJdTMyIHNwZWVkOworCisJaWYgKHVkYy0+YnVzX3Jlc2V0KQorCQl1ZGMtPmJ1c19yZXNldCA9IDA7CisKKwkvKiBCdXMgcmVzZXR0aW5nIGlzIGZpbmlzaGVkICovCisJaWYgKCEoZnNsX3JlYWRsKCZkcl9yZWdzLT5wb3J0c2MxKSAmIFBPUlRTQ1hfUE9SVF9SRVNFVCkpIHsKKwkJLyogR2V0IHRoZSBzcGVlZCAqLworCQlzcGVlZCA9IChmc2xfcmVhZGwoJmRyX3JlZ3MtPnBvcnRzYzEpCisJCQkJJiBQT1JUU0NYX1BPUlRfU1BFRURfTUFTSyk7CisJCXN3aXRjaCAoc3BlZWQpIHsKKwkJY2FzZSBQT1JUU0NYX1BPUlRfU1BFRURfSElHSDoKKwkJCXVkYy0+Z2FkZ2V0LnNwZWVkID0gVVNCX1NQRUVEX0hJR0g7CisJCQlicmVhazsKKwkJY2FzZSBQT1JUU0NYX1BPUlRfU1BFRURfRlVMTDoKKwkJCXVkYy0+Z2FkZ2V0LnNwZWVkID0gVVNCX1NQRUVEX0ZVTEw7CisJCQlicmVhazsKKwkJY2FzZSBQT1JUU0NYX1BPUlRfU1BFRURfTE9XOgorCQkJdWRjLT5nYWRnZXQuc3BlZWQgPSBVU0JfU1BFRURfTE9XOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl1ZGMtPmdhZGdldC5zcGVlZCA9IFVTQl9TUEVFRF9VTktOT1dOOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBVcGRhdGUgVVNCIHN0YXRlICovCisJaWYgKCF1ZGMtPnJlc3VtZV9zdGF0ZSkKKwkJdWRjLT51c2Jfc3RhdGUgPSBVU0JfU1RBVEVfREVGQVVMVDsKK30KKworLyogUHJvY2VzcyBzdXNwZW5kIGludGVycnVwdCAqLworc3RhdGljIHZvaWQgc3VzcGVuZF9pcnEoc3RydWN0IGZzbF91ZGMgKnVkYykKK3sKKwl1ZGMtPnJlc3VtZV9zdGF0ZSA9IHVkYy0+dXNiX3N0YXRlOworCXVkYy0+dXNiX3N0YXRlID0gVVNCX1NUQVRFX1NVU1BFTkRFRDsKKworCS8qIHJlcG9ydCBzdXNwZW5kIHRvIHRoZSBkcml2ZXIsIHNlcmlhbC5jIGRvZXMgbm90IHN1cHBvcnQgdGhpcyAqLworCWlmICh1ZGMtPmRyaXZlci0+c3VzcGVuZCkKKwkJdWRjLT5kcml2ZXItPnN1c3BlbmQoJnVkYy0+Z2FkZ2V0KTsKK30KKworc3RhdGljIHZvaWQgYnVzX3Jlc3VtZShzdHJ1Y3QgZnNsX3VkYyAqdWRjKQoreworCXVkYy0+dXNiX3N0YXRlID0gdWRjLT5yZXN1bWVfc3RhdGU7CisJdWRjLT5yZXN1bWVfc3RhdGUgPSAwOworCisJLyogcmVwb3J0IHJlc3VtZSB0byB0aGUgZHJpdmVyLCBzZXJpYWwuYyBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgKi8KKwlpZiAodWRjLT5kcml2ZXItPnJlc3VtZSkKKwkJdWRjLT5kcml2ZXItPnJlc3VtZSgmdWRjLT5nYWRnZXQpOworfQorCisvKiBDbGVhciB1cCBhbGwgZXAgcXVldWVzICovCitzdGF0aWMgaW50IHJlc2V0X3F1ZXVlcyhzdHJ1Y3QgZnNsX3VkYyAqdWRjKQoreworCXU4IHBpcGU7CisKKwlmb3IgKHBpcGUgPSAwOyBwaXBlIDwgdWRjLT5tYXhfcGlwZXM7IHBpcGUrKykKKwkJdWRjX3Jlc2V0X2VwX3F1ZXVlKHVkYywgcGlwZSk7CisKKwkvKiByZXBvcnQgZGlzY29ubmVjdDsgdGhlIGRyaXZlciBpcyBhbHJlYWR5IHF1aWVzY2VkICovCisJdWRjLT5kcml2ZXItPmRpc2Nvbm5lY3QoJnVkYy0+Z2FkZ2V0KTsKKworCXJldHVybiAwOworfQorCisvKiBQcm9jZXNzIHJlc2V0IGludGVycnVwdCAqLworc3RhdGljIHZvaWQgcmVzZXRfaXJxKHN0cnVjdCBmc2xfdWRjICp1ZGMpCit7CisJdTMyIHRlbXA7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCisJLyogQ2xlYXIgdGhlIGRldmljZSBhZGRyZXNzICovCisJdGVtcCA9IGZzbF9yZWFkbCgmZHJfcmVncy0+ZGV2aWNlYWRkcik7CisJZnNsX3dyaXRlbCh0ZW1wICYgflVTQl9ERVZJQ0VfQUREUkVTU19NQVNLLCAmZHJfcmVncy0+ZGV2aWNlYWRkcik7CisKKwl1ZGMtPmRldmljZV9hZGRyZXNzID0gMDsKKworCS8qIENsZWFyIHVzYiBzdGF0ZSAqLworCXVkYy0+cmVzdW1lX3N0YXRlID0gMDsKKwl1ZGMtPmVwMF9kaXIgPSAwOworCXVkYy0+ZXAwX3N0YXRlID0gV0FJVF9GT1JfU0VUVVA7CisJdWRjLT5yZW1vdGVfd2FrZXVwID0gMDsJLyogZGVmYXVsdCB0byAwIG9uIHJlc2V0ICovCisJdWRjLT5nYWRnZXQuYl9obnBfZW5hYmxlID0gMDsKKwl1ZGMtPmdhZGdldC5hX2hucF9zdXBwb3J0ID0gMDsKKwl1ZGMtPmdhZGdldC5hX2FsdF9obnBfc3VwcG9ydCA9IDA7CisKKwkvKiBDbGVhciBhbGwgdGhlIHNldHVwIHRva2VuIHNlbWFwaG9yZXMgKi8KKwl0ZW1wID0gZnNsX3JlYWRsKCZkcl9yZWdzLT5lbmRwdHNldHVwc3RhdCk7CisJZnNsX3dyaXRlbCh0ZW1wLCAmZHJfcmVncy0+ZW5kcHRzZXR1cHN0YXQpOworCisJLyogQ2xlYXIgYWxsIHRoZSBlbmRwb2ludCBjb21wbGV0ZSBzdGF0dXMgYml0cyAqLworCXRlbXAgPSBmc2xfcmVhZGwoJmRyX3JlZ3MtPmVuZHB0Y29tcGxldGUpOworCWZzbF93cml0ZWwodGVtcCwgJmRyX3JlZ3MtPmVuZHB0Y29tcGxldGUpOworCisJdGltZW91dCA9IGppZmZpZXMgKyAxMDA7CisJd2hpbGUgKGZzbF9yZWFkbCgmZHJfcmVncy0+ZW5kcG9pbnRwcmltZSkpIHsKKwkJLyogV2FpdCB1bnRpbCBhbGwgZW5kcHRwcmltZSBiaXRzIGNsZWFyZWQgKi8KKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpIHsKKwkJCUVSUigiVGltZW91dCBmb3IgcmVzZXRcbiIpOworCQkJYnJlYWs7CisJCX0KKwkJY3B1X3JlbGF4KCk7CisJfQorCisJLyogV3JpdGUgMXMgdG8gdGhlIGZsdXNoIHJlZ2lzdGVyICovCisJZnNsX3dyaXRlbCgweGZmZmZmZmZmLCAmZHJfcmVncy0+ZW5kcHRmbHVzaCk7CisKKwlpZiAoZnNsX3JlYWRsKCZkcl9yZWdzLT5wb3J0c2MxKSAmIFBPUlRTQ1hfUE9SVF9SRVNFVCkgeworCQlWREJHKCJCdXMgcmVzZXQiKTsKKwkJLyogQnVzIGlzIHJlc2V0aW5nICovCisJCXVkYy0+YnVzX3Jlc2V0ID0gMTsKKwkJLyogUmVzZXQgYWxsIHRoZSBxdWV1ZXMsIGluY2x1ZGUgWEQsIGRURCwgRVAgcXVldWUKKwkJICogaGVhZCBhbmQgVFIgUXVldWUgKi8KKwkJcmVzZXRfcXVldWVzKHVkYyk7CisJCXVkYy0+dXNiX3N0YXRlID0gVVNCX1NUQVRFX0RFRkFVTFQ7CisJfSBlbHNlIHsKKwkJVkRCRygiQ29udHJvbGxlciByZXNldCIpOworCQkvKiBpbml0aWFsaXplIHVzYiBodyByZWcgZXhjZXB0IGZvciByZWdzIGZvciBFUCwgbm90CisJCSAqIHRvdWNoIHVzYmludHIgcmVnICovCisJCWRyX2NvbnRyb2xsZXJfc2V0dXAodWRjKTsKKworCQkvKiBSZXNldCBhbGwgaW50ZXJuYWwgdXNlZCBRdWV1ZXMgKi8KKwkJcmVzZXRfcXVldWVzKHVkYyk7CisKKwkJZXAwX3NldHVwKHVkYyk7CisKKwkJLyogRW5hYmxlIERSIElSUSByZWcsIFNldCBSdW4gYml0LCBjaGFuZ2UgdWRjIHN0YXRlICovCisJCWRyX2NvbnRyb2xsZXJfcnVuKHVkYyk7CisJCXVkYy0+dXNiX3N0YXRlID0gVVNCX1NUQVRFX0FUVEFDSEVEOworCX0KK30KKworLyoKKyAqIFVTQiBkZXZpY2UgY29udHJvbGxlciBpbnRlcnJ1cHQgaGFuZGxlcgorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgZnNsX3VkY19pcnEoaW50IGlycSwgdm9pZCAqX3VkYykKK3sKKwlzdHJ1Y3QgZnNsX3VkYyAqdWRjID0gX3VkYzsKKwl1MzIgaXJxX3NyYzsKKwlpcnFyZXR1cm5fdCBzdGF0dXMgPSBJUlFfTk9ORTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogRGlzYWJsZSBJU1IgZm9yIE9URyBob3N0IG1vZGUgKi8KKwlpZiAodWRjLT5zdG9wcGVkKQorCQlyZXR1cm4gSVJRX05PTkU7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnVkYy0+bG9jaywgZmxhZ3MpOworCWlycV9zcmMgPSBmc2xfcmVhZGwoJmRyX3JlZ3MtPnVzYnN0cykgJiBmc2xfcmVhZGwoJmRyX3JlZ3MtPnVzYmludHIpOworCS8qIENsZWFyIG5vdGlmaWNhdGlvbiBiaXRzICovCisJZnNsX3dyaXRlbChpcnFfc3JjLCAmZHJfcmVncy0+dXNic3RzKTsKKworCS8qIFZEQkcoImlycV9zcmMgWzB4JTh4XSIsIGlycV9zcmMpOyAqLworCisJLyogTmVlZCB0byByZXN1bWU/ICovCisJaWYgKHVkYy0+dXNiX3N0YXRlID09IFVTQl9TVEFURV9TVVNQRU5ERUQpCisJCWlmICgoZnNsX3JlYWRsKCZkcl9yZWdzLT5wb3J0c2MxKSAmIFBPUlRTQ1hfUE9SVF9TVVNQRU5EKSA9PSAwKQorCQkJYnVzX3Jlc3VtZSh1ZGMpOworCisJLyogVVNCIEludGVycnVwdCAqLworCWlmIChpcnFfc3JjICYgVVNCX1NUU19JTlQpIHsKKwkJVkRCRygiUGFja2V0IGludCIpOworCQkvKiBTZXR1cCBwYWNrYWdlLCB3ZSBvbmx5IHN1cHBvcnQgZXAwIGFzIGNvbnRyb2wgZXAgKi8KKwkJaWYgKGZzbF9yZWFkbCgmZHJfcmVncy0+ZW5kcHRzZXR1cHN0YXQpICYgRVBfU0VUVVBfU1RBVFVTX0VQMCkgeworCQkJdHJpcHdpcmVfaGFuZGxlcih1ZGMsIDAsCisJCQkJCSh1OCAqKSAoJnVkYy0+bG9jYWxfc2V0dXBfYnVmZikpOworCQkJc2V0dXBfcmVjZWl2ZWRfaXJxKHVkYywgJnVkYy0+bG9jYWxfc2V0dXBfYnVmZik7CisJCQlzdGF0dXMgPSBJUlFfSEFORExFRDsKKwkJfQorCisJCS8qIGNvbXBsZXRpb24gb2YgZHRkICovCisJCWlmIChmc2xfcmVhZGwoJmRyX3JlZ3MtPmVuZHB0Y29tcGxldGUpKSB7CisJCQlkdGRfY29tcGxldGVfaXJxKHVkYyk7CisJCQlzdGF0dXMgPSBJUlFfSEFORExFRDsKKwkJfQorCX0KKworCS8qIFNPRiAoZm9yIElTTyB0cmFuc2ZlcikgKi8KKwlpZiAoaXJxX3NyYyAmIFVTQl9TVFNfU09GKSB7CisJCXN0YXR1cyA9IElSUV9IQU5ETEVEOworCX0KKworCS8qIFBvcnQgQ2hhbmdlICovCisJaWYgKGlycV9zcmMgJiBVU0JfU1RTX1BPUlRfQ0hBTkdFKSB7CisJCXBvcnRfY2hhbmdlX2lycSh1ZGMpOworCQlzdGF0dXMgPSBJUlFfSEFORExFRDsKKwl9CisKKwkvKiBSZXNldCBSZWNlaXZlZCAqLworCWlmIChpcnFfc3JjICYgVVNCX1NUU19SRVNFVCkgeworCQlyZXNldF9pcnEodWRjKTsKKwkJc3RhdHVzID0gSVJRX0hBTkRMRUQ7CisJfQorCisJLyogU2xlZXAgRW5hYmxlIChTdXNwZW5kKSAqLworCWlmIChpcnFfc3JjICYgVVNCX1NUU19TVVNQRU5EKSB7CisJCXN1c3BlbmRfaXJxKHVkYyk7CisJCXN0YXR1cyA9IElSUV9IQU5ETEVEOworCX0KKworCWlmIChpcnFfc3JjICYgKFVTQl9TVFNfRVJSIHwgVVNCX1NUU19TWVNfRVJSKSkgeworCQlWREJHKCJFcnJvciBJUlEgJXggIiwgaXJxX3NyYyk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdWRjLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorICogSG9vayB0byBnYWRnZXQgZHJpdmVycworICogQ2FsbGVkIGJ5IGluaXRpYWxpemF0aW9uIGNvZGUgb2YgZ2FkZ2V0IGRyaXZlcnMKKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2ludCB1c2JfZ2FkZ2V0X3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgdXNiX2dhZGdldF9kcml2ZXIgKmRyaXZlcikKK3sKKwlpbnQgcmV0dmFsID0gLUVOT0RFVjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKKworCWlmICghdWRjX2NvbnRyb2xsZXIpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKCFkcml2ZXIgfHwgKGRyaXZlci0+c3BlZWQgIT0gVVNCX1NQRUVEX0ZVTEwKKwkJCQkmJiBkcml2ZXItPnNwZWVkICE9IFVTQl9TUEVFRF9ISUdIKQorCQkJfHwgIWRyaXZlci0+YmluZCB8fCAhZHJpdmVyLT5kaXNjb25uZWN0CisJCQl8fCAhZHJpdmVyLT5zZXR1cCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAodWRjX2NvbnRyb2xsZXItPmRyaXZlcikKKwkJcmV0dXJuIC1FQlVTWTsKKworCS8qIGxvY2sgaXMgbmVlZGVkIGJ1dCB3aGV0aGVyIHNob3VsZCB1c2UgdGhpcyBsb2NrIG9yIGFub3RoZXIgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmdWRjX2NvbnRyb2xsZXItPmxvY2ssIGZsYWdzKTsKKworCWRyaXZlci0+ZHJpdmVyLmJ1cyA9IDA7CisJLyogaG9vayB1cCB0aGUgZHJpdmVyICovCisJdWRjX2NvbnRyb2xsZXItPmRyaXZlciA9IGRyaXZlcjsKKwl1ZGNfY29udHJvbGxlci0+Z2FkZ2V0LmRldi5kcml2ZXIgPSAmZHJpdmVyLT5kcml2ZXI7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdWRjX2NvbnRyb2xsZXItPmxvY2ssIGZsYWdzKTsKKworCS8qIGJpbmQgdWRjIGRyaXZlciB0byBnYWRnZXQgZHJpdmVyICovCisJcmV0dmFsID0gZHJpdmVyLT5iaW5kKCZ1ZGNfY29udHJvbGxlci0+Z2FkZ2V0KTsKKwlpZiAocmV0dmFsKSB7CisJCVZEQkcoImJpbmQgdG8gJXMgLS0+ICVkIiwgZHJpdmVyLT5kcml2ZXIubmFtZSwgcmV0dmFsKTsKKwkJdWRjX2NvbnRyb2xsZXItPmdhZGdldC5kZXYuZHJpdmVyID0gMDsKKwkJdWRjX2NvbnRyb2xsZXItPmRyaXZlciA9IDA7CisJCWdvdG8gb3V0OworCX0KKworCS8qIEVuYWJsZSBEUiBJUlEgcmVnIGFuZCBTZXQgdXNiY21kIHJlZyAgUnVuIGJpdCAqLworCWRyX2NvbnRyb2xsZXJfcnVuKHVkY19jb250cm9sbGVyKTsKKwl1ZGNfY29udHJvbGxlci0+dXNiX3N0YXRlID0gVVNCX1NUQVRFX0FUVEFDSEVEOworCXVkY19jb250cm9sbGVyLT5lcDBfc3RhdGUgPSBXQUlUX0ZPUl9TRVRVUDsKKwl1ZGNfY29udHJvbGxlci0+ZXAwX2RpciA9IDA7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGJpbmQgdG8gZHJpdmVyICVzIFxuIiwKKwkJCXVkY19jb250cm9sbGVyLT5nYWRnZXQubmFtZSwgZHJpdmVyLT5kcml2ZXIubmFtZSk7CisKK291dDoKKwlpZiAocmV0dmFsKQorCQlwcmludGsoInJldHZhbCAlZCBcbiIsIHJldHZhbCk7CisJcmV0dXJuIHJldHZhbDsKK30KK0VYUE9SVF9TWU1CT0wodXNiX2dhZGdldF9yZWdpc3Rlcl9kcml2ZXIpOworCisvKiBEaXNjb25uZWN0IGZyb20gZ2FkZ2V0IGRyaXZlciAqLworaW50IHVzYl9nYWRnZXRfdW5yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyICpkcml2ZXIpCit7CisJc3RydWN0IGZzbF9lcCAqbG9vcF9lcDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCF1ZGNfY29udHJvbGxlcikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoIWRyaXZlciB8fCBkcml2ZXIgIT0gdWRjX2NvbnRyb2xsZXItPmRyaXZlciB8fCAhZHJpdmVyLT51bmJpbmQpCisJCXJldHVybiAtRUlOVkFMOworCisjaWZkZWYgQ09ORklHX1VTQl9PVEcKKwlpZiAodWRjX2NvbnRyb2xsZXItPnRyYW5zY2VpdmVyKQorCQkodm9pZClvdGdfc2V0X3BlcmlwaGVyYWwodWRjX2NvbnRyb2xsZXItPnRyYW5zY2VpdmVyLCAwKTsKKyNlbmRpZgorCisJLyogc3RvcCBEUiwgZGlzYWJsZSBpbnRyICovCisJZHJfY29udHJvbGxlcl9zdG9wKHVkY19jb250cm9sbGVyKTsKKworCS8qIGluIGZhY3QsIG5vIG5lZWRlZCAqLworCXVkY19jb250cm9sbGVyLT51c2Jfc3RhdGUgPSBVU0JfU1RBVEVfQVRUQUNIRUQ7CisJdWRjX2NvbnRyb2xsZXItPmVwMF9zdGF0ZSA9IFdBSVRfRk9SX1NFVFVQOworCXVkY19jb250cm9sbGVyLT5lcDBfZGlyID0gMDsKKworCS8qIHN0YW5kIG9wZXJhdGlvbiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZ1ZGNfY29udHJvbGxlci0+bG9jaywgZmxhZ3MpOworCXVkY19jb250cm9sbGVyLT5nYWRnZXQuc3BlZWQgPSBVU0JfU1BFRURfVU5LTk9XTjsKKwludWtlKCZ1ZGNfY29udHJvbGxlci0+ZXBzWzBdLCAtRVNIVVRET1dOKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxvb3BfZXAsICZ1ZGNfY29udHJvbGxlci0+Z2FkZ2V0LmVwX2xpc3QsCisJCQllcC5lcF9saXN0KQorCQludWtlKGxvb3BfZXAsIC1FU0hVVERPV04pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVkY19jb250cm9sbGVyLT5sb2NrLCBmbGFncyk7CisKKwkvKiB1bmJpbmQgZ2FkZ2V0IGFuZCB1bmhvb2sgZHJpdmVyLiAqLworCWRyaXZlci0+dW5iaW5kKCZ1ZGNfY29udHJvbGxlci0+Z2FkZ2V0KTsKKwl1ZGNfY29udHJvbGxlci0+Z2FkZ2V0LmRldi5kcml2ZXIgPSAwOworCXVkY19jb250cm9sbGVyLT5kcml2ZXIgPSAwOworCisJcHJpbnRrKCJ1bnJlZ2lzdGVyZWQgZ2FkZ2V0IGRyaXZlciAnJXMnXHJcbiIsIGRyaXZlci0+ZHJpdmVyLm5hbWUpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTCh1c2JfZ2FkZ2V0X3VucmVnaXN0ZXJfZHJpdmVyKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCVBST0MgRmlsZSBTeXN0ZW0gU3VwcG9ydAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZkZWYgQ09ORklHX1VTQl9HQURHRVRfREVCVUdfRklMRVMKKworI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisKK3N0YXRpYyBjb25zdCBjaGFyIHByb2NfZmlsZW5hbWVbXSA9ICJkcml2ZXIvZnNsX3VzYjJfdWRjIjsKKworc3RhdGljIGludCBmc2xfcHJvY19yZWFkKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLCBpbnQgY291bnQsCisJCWludCAqZW9mLCB2b2lkICpfZGV2KQoreworCWNoYXIgKmJ1ZiA9IHBhZ2U7CisJY2hhciAqbmV4dCA9IGJ1ZjsKKwl1bnNpZ25lZCBzaXplID0gY291bnQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgdCwgaTsKKwl1MzIgdG1wX3JlZzsKKwlzdHJ1Y3QgZnNsX2VwICplcCA9IE5VTEw7CisJc3RydWN0IGZzbF9yZXEgKnJlcTsKKworCXN0cnVjdCBmc2xfdWRjICp1ZGMgPSB1ZGNfY29udHJvbGxlcjsKKwlpZiAob2ZmICE9IDApCisJCXJldHVybiAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnVkYy0+bG9jaywgZmxhZ3MpOworCisJLyogLS0tLS0tYmFzaWMgZHJpdmVyIGluZm9tYXRpb24gLS0tLSAqLworCXQgPSBzY25wcmludGYobmV4dCwgc2l6ZSwKKwkJCURSSVZFUl9ERVNDICJcbiIKKwkJCSIlcyB2ZXJzaW9uOiAlc1xuIgorCQkJIkdhZGdldCBkcml2ZXI6ICVzXG5cbiIsCisJCQlkcml2ZXJfbmFtZSwgRFJJVkVSX1ZFUlNJT04sCisJCQl1ZGMtPmRyaXZlciA/IHVkYy0+ZHJpdmVyLT5kcml2ZXIubmFtZSA6ICIobm9uZSkiKTsKKwlzaXplIC09IHQ7CisJbmV4dCArPSB0OworCisJLyogLS0tLS0tIERSIFJlZ2lzdGVycyAtLS0tLSAqLworCXRtcF9yZWcgPSBmc2xfcmVhZGwoJmRyX3JlZ3MtPnVzYmNtZCk7CisJdCA9IHNjbnByaW50ZihuZXh0LCBzaXplLAorCQkJIlVTQkNNRCByZWc6XG4iCisJCQkiU2V0dXBUVzogJWRcbiIKKwkJCSJSdW4vU3RvcDogJXNcblxuIiwKKwkJCSh0bXBfcmVnICYgVVNCX0NNRF9TVVRXKSA/IDEgOiAwLAorCQkJKHRtcF9yZWcgJiBVU0JfQ01EX1JVTl9TVE9QKSA/ICJSdW4iIDogIlN0b3AiKTsKKwlzaXplIC09IHQ7CisJbmV4dCArPSB0OworCisJdG1wX3JlZyA9IGZzbF9yZWFkbCgmZHJfcmVncy0+dXNic3RzKTsKKwl0ID0gc2NucHJpbnRmKG5leHQsIHNpemUsCisJCQkiVVNCIFN0YXR1cyBSZWc6XG4iCisJCQkiRHIgU3VzcGVuZDogJWQiICJSZXNldCBSZWNlaXZlZDogJWQiICJTeXN0ZW0gRXJyb3I6ICVzIgorCQkJIlVTQiBFcnJvciBJbnRlcnJ1cHQ6ICVzXG5cbiIsCisJCQkodG1wX3JlZyAmIFVTQl9TVFNfU1VTUEVORCkgPyAxIDogMCwKKwkJCSh0bXBfcmVnICYgVVNCX1NUU19SRVNFVCkgPyAxIDogMCwKKwkJCSh0bXBfcmVnICYgVVNCX1NUU19TWVNfRVJSKSA/ICJFcnIiIDogIk5vcm1hbCIsCisJCQkodG1wX3JlZyAmIFVTQl9TVFNfRVJSKSA/ICJFcnIgZGV0ZWN0ZWQiIDogIk5vIGVyciIpOworCXNpemUgLT0gdDsKKwluZXh0ICs9IHQ7CisKKwl0bXBfcmVnID0gZnNsX3JlYWRsKCZkcl9yZWdzLT51c2JpbnRyKTsKKwl0ID0gc2NucHJpbnRmKG5leHQsIHNpemUsCisJCQkiVVNCIEludHJydXB0IEVuYWJsZSBSZWc6XG4iCisJCQkiU2xlZXAgRW5hYmxlOiAlZCIgIlNPRiBSZWNlaXZlZCBFbmFibGU6ICVkIgorCQkJIlJlc2V0IEVuYWJsZTogJWRcbiIKKwkJCSJTeXN0ZW0gRXJyb3IgRW5hYmxlOiAlZCIKKwkJCSJQb3J0IENoYW5nZSBEZWN0ZWN0ZWQgRW5hYmxlOiAlZFxuIgorCQkJIlVTQiBFcnJvciBJbnRyIEVuYWJsZTogJWQiICJVU0IgSW50ciBFbmFibGU6ICVkXG5cbiIsCisJCQkodG1wX3JlZyAmIFVTQl9JTlRSX0RFVklDRV9TVVNQRU5EKSA/IDEgOiAwLAorCQkJKHRtcF9yZWcgJiBVU0JfSU5UUl9TT0ZfRU4pID8gMSA6IDAsCisJCQkodG1wX3JlZyAmIFVTQl9JTlRSX1JFU0VUX0VOKSA/IDEgOiAwLAorCQkJKHRtcF9yZWcgJiBVU0JfSU5UUl9TWVNfRVJSX0VOKSA/IDEgOiAwLAorCQkJKHRtcF9yZWcgJiBVU0JfSU5UUl9QVENfREVURUNUX0VOKSA/IDEgOiAwLAorCQkJKHRtcF9yZWcgJiBVU0JfSU5UUl9FUlJfSU5UX0VOKSA/IDEgOiAwLAorCQkJKHRtcF9yZWcgJiBVU0JfSU5UUl9JTlRfRU4pID8gMSA6IDApOworCXNpemUgLT0gdDsKKwluZXh0ICs9IHQ7CisKKwl0bXBfcmVnID0gZnNsX3JlYWRsKCZkcl9yZWdzLT5mcmluZGV4KTsKKwl0ID0gc2NucHJpbnRmKG5leHQsIHNpemUsCisJCQkiVVNCIEZyYW1lIEluZGV4IFJlZzoiICJGcmFtZSBOdW1iZXIgaXMgMHgleFxuXG4iLAorCQkJKHRtcF9yZWcgJiBVU0JfRlJJTkRFWF9NQVNLUykpOworCXNpemUgLT0gdDsKKwluZXh0ICs9IHQ7CisKKwl0bXBfcmVnID0gZnNsX3JlYWRsKCZkcl9yZWdzLT5kZXZpY2VhZGRyKTsKKwl0ID0gc2NucHJpbnRmKG5leHQsIHNpemUsCisJCQkiVVNCIERldmljZSBBZGRyZXNzIFJlZzoiICJEZXZpY2UgQWRkciBpcyAweCV4XG5cbiIsCisJCQkodG1wX3JlZyAmIFVTQl9ERVZJQ0VfQUREUkVTU19NQVNLKSk7CisJc2l6ZSAtPSB0OworCW5leHQgKz0gdDsKKworCXRtcF9yZWcgPSBmc2xfcmVhZGwoJmRyX3JlZ3MtPmVuZHBvaW50bGlzdGFkZHIpOworCXQgPSBzY25wcmludGYobmV4dCwgc2l6ZSwKKwkJCSJVU0IgRW5kcG9pbnQgTGlzdCBBZGRyZXNzIFJlZzoiCisJCQkiRGV2aWNlIEFkZHIgaXMgMHgleFxuXG4iLAorCQkJKHRtcF9yZWcgJiBVU0JfRVBfTElTVF9BRERSRVNTX01BU0spKTsKKwlzaXplIC09IHQ7CisJbmV4dCArPSB0OworCisJdG1wX3JlZyA9IGZzbF9yZWFkbCgmZHJfcmVncy0+cG9ydHNjMSk7CisJdCA9IHNjbnByaW50ZihuZXh0LCBzaXplLAorCQkiVVNCIFBvcnQgU3RhdHVzJkNvbnRyb2wgUmVnOlxuIgorCQkiUG9ydCBUcmFuc2NlaXZlciBUeXBlIDogJXMiICJQb3J0IFNwZWVkOiAlcyBcbiIKKwkJIlBIWSBMb3cgUG93ZXIgU3VzcGVuZDogJXMiICJQb3J0IFJlc2V0OiAlcyIKKwkJIlBvcnQgU3VzcGVuZCBNb2RlOiAlcyBcbiIgIk92ZXItY3VycmVudCBDaGFuZ2U6ICVzIgorCQkiUG9ydCBFbmFibGUvRGlzYWJsZSBDaGFuZ2U6ICVzXG4iCisJCSJQb3J0IEVuYWJsZWQvRGlzYWJsZWQ6ICVzIgorCQkiQ3VycmVudCBDb25uZWN0IFN0YXR1czogJXNcblxuIiwgKCB7CisJCQljaGFyICpzOworCQkJc3dpdGNoICh0bXBfcmVnICYgUE9SVFNDWF9QVFNfRlNMUykgeworCQkJY2FzZSBQT1JUU0NYX1BUU19VVE1JOgorCQkJCXMgPSAiVVRNSSI7IGJyZWFrOworCQkJY2FzZSBQT1JUU0NYX1BUU19VTFBJOgorCQkJCXMgPSAiVUxQSSAiOyBicmVhazsKKwkJCWNhc2UgUE9SVFNDWF9QVFNfRlNMUzoKKwkJCQlzID0gIkZTL0xTIFNlcmlhbCI7IGJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlzID0gIk5vbmUiOyBicmVhazsKKwkJCX0KKwkJCXM7fSApLCAoIHsKKwkJCWNoYXIgKnM7CisJCQlzd2l0Y2ggKHRtcF9yZWcgJiBQT1JUU0NYX1BPUlRfU1BFRURfVU5ERUYpIHsKKwkJCWNhc2UgUE9SVFNDWF9QT1JUX1NQRUVEX0ZVTEw6CisJCQkJcyA9ICJGdWxsIFNwZWVkIjsgYnJlYWs7CisJCQljYXNlIFBPUlRTQ1hfUE9SVF9TUEVFRF9MT1c6CisJCQkJcyA9ICJMb3cgU3BlZWQiOyBicmVhazsKKwkJCWNhc2UgUE9SVFNDWF9QT1JUX1NQRUVEX0hJR0g6CisJCQkJcyA9ICJIaWdoIFNwZWVkIjsgYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXMgPSAiVW5kZWZpbmVkIjsgYnJlYWs7CisJCQl9CisJCQlzOworCQl9ICksCisJCSh0bXBfcmVnICYgUE9SVFNDWF9QSFlfTE9XX1BPV0VSX1NQRCkgPworCQkiTm9ybWFsIFBIWSBtb2RlIiA6ICJMb3cgcG93ZXIgbW9kZSIsCisJCSh0bXBfcmVnICYgUE9SVFNDWF9QT1JUX1JFU0VUKSA/ICJJbiBSZXNldCIgOgorCQkiTm90IGluIFJlc2V0IiwKKwkJKHRtcF9yZWcgJiBQT1JUU0NYX1BPUlRfU1VTUEVORCkgPyAiSW4gIiA6ICJOb3QgaW4iLAorCQkodG1wX3JlZyAmIFBPUlRTQ1hfT1ZFUl9DVVJSRU5UX0NIRykgPyAiRGVjdGVkIiA6CisJCSJObyIsCisJCSh0bXBfcmVnICYgUE9SVFNDWF9QT1JUX0VOX0RJU19DSEFOR0UpID8gIkRpc2FibGUiIDoKKwkJIk5vdCBjaGFuZ2UiLAorCQkodG1wX3JlZyAmIFBPUlRTQ1hfUE9SVF9FTkFCTEUpID8gIkVuYWJsZSIgOgorCQkiTm90IGNvcnJlY3QiLAorCQkodG1wX3JlZyAmIFBPUlRTQ1hfQ1VSUkVOVF9DT05ORUNUX1NUQVRVUykgPworCQkiQXR0YWNoZWQiIDogIk5vdC1BdHQiKTsKKwlzaXplIC09IHQ7CisJbmV4dCArPSB0OworCisJdG1wX3JlZyA9IGZzbF9yZWFkbCgmZHJfcmVncy0+dXNibW9kZSk7CisJdCA9IHNjbnByaW50ZihuZXh0LCBzaXplLAorCQkJIlVTQiBNb2RlIFJlZzoiICJDb250cm9sbGVyIE1vZGUgaXMgOiAlc1xuXG4iLCAoIHsKKwkJCQljaGFyICpzOworCQkJCXN3aXRjaCAodG1wX3JlZyAmIFVTQl9NT0RFX0NUUkxfTU9ERV9IT1NUKSB7CisJCQkJY2FzZSBVU0JfTU9ERV9DVFJMX01PREVfSURMRToKKwkJCQkJcyA9ICJJZGxlIjsgYnJlYWs7CisJCQkJY2FzZSBVU0JfTU9ERV9DVFJMX01PREVfREVWSUNFOgorCQkJCQlzID0gIkRldmljZSBDb250cm9sbGVyIjsgYnJlYWs7CisJCQkJY2FzZSBVU0JfTU9ERV9DVFJMX01PREVfSE9TVDoKKwkJCQkJcyA9ICJIb3N0IENvbnRyb2xsZXIiOyBicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlzID0gIk5vbmUiOyBicmVhazsKKwkJCQl9CisJCQkJczsKKwkJCX0gKSk7CisJc2l6ZSAtPSB0OworCW5leHQgKz0gdDsKKworCXRtcF9yZWcgPSBmc2xfcmVhZGwoJmRyX3JlZ3MtPmVuZHB0c2V0dXBzdGF0KTsKKwl0ID0gc2NucHJpbnRmKG5leHQsIHNpemUsCisJCQkiRW5kcG9pbnQgU2V0dXAgU3RhdHVzIFJlZzoiICJTRVRVUCBvbiBlcCAweCV4XG5cbiIsCisJCQkodG1wX3JlZyAmIEVQX1NFVFVQX1NUQVRVU19NQVNLKSk7CisJc2l6ZSAtPSB0OworCW5leHQgKz0gdDsKKworCWZvciAoaSA9IDA7IGkgPCB1ZGMtPm1heF9lcCAvIDI7IGkrKykgeworCQl0bXBfcmVnID0gZnNsX3JlYWRsKCZkcl9yZWdzLT5lbmRwdGN0cmxbaV0pOworCQl0ID0gc2NucHJpbnRmKG5leHQsIHNpemUsICJFUCBDdHJsIFJlZyBbMHgleF06ID0gWzB4JXhdXG4iLAorCQkJCWksIHRtcF9yZWcpOworCQlzaXplIC09IHQ7CisJCW5leHQgKz0gdDsKKwl9CisJdG1wX3JlZyA9IGZzbF9yZWFkbCgmZHJfcmVncy0+ZW5kcG9pbnRwcmltZSk7CisJdCA9IHNjbnByaW50ZihuZXh0LCBzaXplLCAiRVAgUHJpbWUgUmVnID0gWzB4JXhdXG4iLCB0bXBfcmVnKTsKKwlzaXplIC09IHQ7CisJbmV4dCArPSB0OworCisJdG1wX3JlZyA9IHVzYl9zeXNfcmVncy0+c25vb3AxOworCXQgPSBzY25wcmludGYobmV4dCwgc2l6ZSwgIlxuU25vb3AxIFJlZyA6ID0gWzB4JXhdXG5cbiIsIHRtcF9yZWcpOworCXNpemUgLT0gdDsKKwluZXh0ICs9IHQ7CisKKwl0bXBfcmVnID0gdXNiX3N5c19yZWdzLT5jb250cm9sOworCXQgPSBzY25wcmludGYobmV4dCwgc2l6ZSwgIkdlbmVyYWwgQ29udHJvbCBSZWcgOiA9IFsweCV4XVxuXG4iLAorCQkJdG1wX3JlZyk7CisJc2l6ZSAtPSB0OworCW5leHQgKz0gdDsKKworCS8qIC0tLS0tLWZzbF91ZGMsIGZzbF9lcCwgZnNsX3JlcXVlc3Qgc3RydWN0dXJlIGluZm9ybWF0aW9uIC0tLS0tICovCisJZXAgPSAmdWRjLT5lcHNbMF07CisJdCA9IHNjbnByaW50ZihuZXh0LCBzaXplLCAiRm9yICVzIE1heHBrdCBpcyAweCV4IGluZGV4IGlzIDB4JXhcbiIsCisJCQllcC0+ZXAubmFtZSwgZXBfbWF4cGFja2V0KGVwKSwgZXBfaW5kZXgoZXApKTsKKwlzaXplIC09IHQ7CisJbmV4dCArPSB0OworCisJaWYgKGxpc3RfZW1wdHkoJmVwLT5xdWV1ZSkpIHsKKwkJdCA9IHNjbnByaW50ZihuZXh0LCBzaXplLCAiaXRzIHJlcSBxdWV1ZSBpcyBlbXB0eVxuXG4iKTsKKwkJc2l6ZSAtPSB0OworCQluZXh0ICs9IHQ7CisJfSBlbHNlIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShyZXEsICZlcC0+cXVldWUsIHF1ZXVlKSB7CisJCQl0ID0gc2NucHJpbnRmKG5leHQsIHNpemUsCisJCQkJInJlcSAlcCBhY3R1YWwgMHgleCBsZW5ndGggMHgleCAgYnVmICVwXG4iLAorCQkJCSZyZXEtPnJlcSwgcmVxLT5yZXEuYWN0dWFsLAorCQkJCXJlcS0+cmVxLmxlbmd0aCwgcmVxLT5yZXEuYnVmKTsKKwkJCXNpemUgLT0gdDsKKwkJCW5leHQgKz0gdDsKKwkJfQorCX0KKwkvKiBvdGhlciBnYWRnZXQtPmVwbGlzdCBlcCAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoZXAsICZ1ZGMtPmdhZGdldC5lcF9saXN0LCBlcC5lcF9saXN0KSB7CisJCWlmIChlcC0+ZGVzYykgeworCQkJdCA9IHNjbnByaW50ZihuZXh0LCBzaXplLAorCQkJCQkiXG5Gb3IgJXMgTWF4cGt0IGlzIDB4JXggIgorCQkJCQkiaW5kZXggaXMgMHgleFxuIiwKKwkJCQkJZXAtPmVwLm5hbWUsIGVwX21heHBhY2tldChlcCksCisJCQkJCWVwX2luZGV4KGVwKSk7CisJCQlzaXplIC09IHQ7CisJCQluZXh0ICs9IHQ7CisKKwkJCWlmIChsaXN0X2VtcHR5KCZlcC0+cXVldWUpKSB7CisJCQkJdCA9IHNjbnByaW50ZihuZXh0LCBzaXplLAorCQkJCQkJIml0cyByZXEgcXVldWUgaXMgZW1wdHlcblxuIik7CisJCQkJc2l6ZSAtPSB0OworCQkJCW5leHQgKz0gdDsKKwkJCX0gZWxzZSB7CisJCQkJbGlzdF9mb3JfZWFjaF9lbnRyeShyZXEsICZlcC0+cXVldWUsIHF1ZXVlKSB7CisJCQkJCXQgPSBzY25wcmludGYobmV4dCwgc2l6ZSwKKwkJCQkJCSJyZXEgJXAgYWN0dWFsIDB4JXggbGVuZ3RoIgorCQkJCQkJIjB4JXggIGJ1ZiAlcFxuIiwKKwkJCQkJCSZyZXEtPnJlcSwgcmVxLT5yZXEuYWN0dWFsLAorCQkJCQkJcmVxLT5yZXEubGVuZ3RoLCByZXEtPnJlcS5idWYpOworCQkJCQlzaXplIC09IHQ7CisJCQkJCW5leHQgKz0gdDsKKwkJCQkJfQkvKiBlbmQgZm9yIGVhY2hfZW50cnkgb2YgZXAgcmVxICovCisJCQkJfQkvKiBlbmQgZm9yIGVsc2UgKi8KKwkJCX0JLyogZW5kIGZvciBpZihlcC0+cXVldWUpICovCisJCX0JCS8qIGVuZCAoZXAtPmRlc2MpICovCisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1ZGMtPmxvY2ssIGZsYWdzKTsKKworCSplb2YgPSAxOworCXJldHVybiBjb3VudCAtIHNpemU7Cit9CisKKyNkZWZpbmUgY3JlYXRlX3Byb2NfZmlsZSgpCWNyZWF0ZV9wcm9jX3JlYWRfZW50cnkocHJvY19maWxlbmFtZSwgXAorCQkJCTAsIE5VTEwsIGZzbF9wcm9jX3JlYWQsIE5VTEwpCisKKyNkZWZpbmUgcmVtb3ZlX3Byb2NfZmlsZSgpCXJlbW92ZV9wcm9jX2VudHJ5KHByb2NfZmlsZW5hbWUsIE5VTEwpCisKKyNlbHNlCQkJCS8qICFDT05GSUdfVVNCX0dBREdFVF9ERUJVR19GSUxFUyAqLworCisjZGVmaW5lIGNyZWF0ZV9wcm9jX2ZpbGUoKQlkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgcmVtb3ZlX3Byb2NfZmlsZSgpCWRvIHt9IHdoaWxlICgwKQorCisjZW5kaWYJCQkJLyogQ09ORklHX1VTQl9HQURHRVRfREVCVUdfRklMRVMgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogUmVsZWFzZSB1ZGMgc3RydWN0dXJlcyAqLworc3RhdGljIHZvaWQgZnNsX3VkY19yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwljb21wbGV0ZSh1ZGNfY29udHJvbGxlci0+ZG9uZSk7CisJZG1hX2ZyZWVfY29oZXJlbnQoZGV2LCB1ZGNfY29udHJvbGxlci0+ZXBfcWhfc2l6ZSwKKwkJCXVkY19jb250cm9sbGVyLT5lcF9xaCwgdWRjX2NvbnRyb2xsZXItPmVwX3FoX2RtYSk7CisJa2ZyZWUodWRjX2NvbnRyb2xsZXIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJSW50ZXJuYWwgc3RydWN0dXJlIHNldHVwIGZ1bmN0aW9ucworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBpbml0IHJlc291cmNlIGZvciBnbG9ibGUgY29udHJvbGxlcgorICogUmV0dXJuIHRoZSB1ZGMgaGFuZGxlIG9uIHN1Y2Nlc3Mgb3IgTlVMTCBvbiBmYWlsdXJlCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBzdHJ1Y3QgZnNsX3VkYyAqX19pbml0IHN0cnVjdF91ZGNfc2V0dXAoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZnNsX3VkYyAqdWRjOworCXN0cnVjdCBmc2xfdXNiMl9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKKwlzaXplX3Qgc2l6ZTsKKworCXVkYyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBmc2xfdWRjKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHVkYyA9PSBOVUxMKSB7CisJCUVSUigibWFsbG9jIHVkYyBmYWlsZWRcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXVkYy0+cGh5X21vZGUgPSBwZGF0YS0+cGh5X21vZGU7CisJLyogbWF4X2VwX25yIGlzIGJpZGlyZWN0aW9uYWwgZXAgbnVtYmVyLCBtYXhfZXAgZG91YmxlcyB0aGUgbnVtYmVyICovCisJdWRjLT5tYXhfZXAgPSBwZGF0YS0+bWF4X2VwX25yICogMjsKKworCXVkYy0+ZXBzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGZzbF9lcCkgKiB1ZGMtPm1heF9lcCwgR0ZQX0tFUk5FTCk7CisJaWYgKCF1ZGMtPmVwcykgeworCQlFUlIoIm1hbGxvYyBmc2xfZXAgZmFpbGVkXG4iKTsKKwkJZ290byBjbGVhbnVwOworCX0KKworCS8qIGluaXRpYWxpemVkIFFIcywgdGFrZSBjYXJlIG9mIGFsaWdubWVudCAqLworCXNpemUgPSB1ZGMtPm1heF9lcCAqIHNpemVvZihzdHJ1Y3QgZXBfcXVldWVfaGVhZCk7CisJaWYgKHNpemUgPCBRSF9BTElHTk1FTlQpCisJCXNpemUgPSBRSF9BTElHTk1FTlQ7CisJZWxzZSBpZiAoKHNpemUgJSBRSF9BTElHTk1FTlQpICE9IDApIHsKKwkJc2l6ZSArPSBRSF9BTElHTk1FTlQgKyAxOworCQlzaXplICY9IH4oUUhfQUxJR05NRU5UIC0gMSk7CisJfQorCXVkYy0+ZXBfcWggPSBkbWFfYWxsb2NfY29oZXJlbnQoJnBkZXYtPmRldiwgc2l6ZSwKKwkJCQkJJnVkYy0+ZXBfcWhfZG1hLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXVkYy0+ZXBfcWgpIHsKKwkJRVJSKCJtYWxsb2MgUUhzIGZvciB1ZGMgZmFpbGVkXG4iKTsKKwkJa2ZyZWUodWRjLT5lcHMpOworCQlnb3RvIGNsZWFudXA7CisJfQorCisJdWRjLT5lcF9xaF9zaXplID0gc2l6ZTsKKworCS8qIEluaXRpYWxpemUgZXAwIHN0YXR1cyByZXF1ZXN0IHN0cnVjdHVyZSAqLworCS8qIEZJWE1FOiBmc2xfYWxsb2NfcmVxdWVzdCgpIGlnbm9yZXMgZXAgYXJndW1lbnQgKi8KKwl1ZGMtPnN0YXR1c19yZXEgPSBjb250YWluZXJfb2YoZnNsX2FsbG9jX3JlcXVlc3QoTlVMTCwgR0ZQX0tFUk5FTCksCisJCQlzdHJ1Y3QgZnNsX3JlcSwgcmVxKTsKKwkvKiBhbGxvY2F0ZSBhIHNtYWxsIGFtb3VudCBvZiBtZW1vcnkgdG8gZ2V0IHZhbGlkIGFkZHJlc3MgKi8KKwl1ZGMtPnN0YXR1c19yZXEtPnJlcS5idWYgPSBrbWFsbG9jKDgsIEdGUF9LRVJORUwpOworCXVkYy0+c3RhdHVzX3JlcS0+cmVxLmRtYSA9IHZpcnRfdG9fcGh5cyh1ZGMtPnN0YXR1c19yZXEtPnJlcS5idWYpOworCisJdWRjLT5yZXN1bWVfc3RhdGUgPSBVU0JfU1RBVEVfTk9UQVRUQUNIRUQ7CisJdWRjLT51c2Jfc3RhdGUgPSBVU0JfU1RBVEVfUE9XRVJFRDsKKwl1ZGMtPmVwMF9kaXIgPSAwOworCXVkYy0+cmVtb3RlX3dha2V1cCA9IDA7CS8qIGRlZmF1bHQgdG8gMCBvbiByZXNldCAqLworCXNwaW5fbG9ja19pbml0KCZ1ZGMtPmxvY2spOworCisJcmV0dXJuIHVkYzsKKworY2xlYW51cDoKKwlrZnJlZSh1ZGMpOworCXJldHVybiBOVUxMOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFNldHVwIHRoZSBmc2xfZXAgc3RydWN0IGZvciBlcHMKKyAqIExpbmsgZnNsX2VwLT5lcCB0byBnYWRnZXQtPmVwX2xpc3QKKyAqIGVwMG91dCBpcyBub3QgdXNlZCBzbyBkbyBub3RoaW5nIGhlcmUKKyAqIGVwMGluIHNob3VsZCBiZSB0YWtlbiBjYXJlCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBpbnQgX19pbml0IHN0cnVjdF9lcF9zZXR1cChzdHJ1Y3QgZnNsX3VkYyAqdWRjLCB1bnNpZ25lZCBjaGFyIGluZGV4LAorCQljaGFyICpuYW1lLCBpbnQgbGluaykKK3sKKwlzdHJ1Y3QgZnNsX2VwICplcCA9ICZ1ZGMtPmVwc1tpbmRleF07CisKKwllcC0+dWRjID0gdWRjOworCXN0cmNweShlcC0+bmFtZSwgbmFtZSk7CisJZXAtPmVwLm5hbWUgPSBlcC0+bmFtZTsKKworCWVwLT5lcC5vcHMgPSAmZnNsX2VwX29wczsKKwllcC0+c3RvcHBlZCA9IDA7CisKKwkvKiBmb3IgZXAwOiBtYXhQIGRlZmluZWQgaW4gZGVzYworCSAqIGZvciBvdGhlciBlcHMsIG1heFAgaXMgc2V0IGJ5IGVwYXV0b2NvbmZpZygpIGNhbGxlZCBieSBnYWRnZXQgbGF5ZXIKKwkgKi8KKwllcC0+ZXAubWF4cGFja2V0ID0gKHVuc2lnbmVkIHNob3J0KSB+MDsKKworCS8qIHRoZSBxdWV1ZSBsaXN0cyBhbnkgcmVxIGZvciB0aGlzIGVwICovCisJSU5JVF9MSVNUX0hFQUQoJmVwLT5xdWV1ZSk7CisKKwkvKiBnYWdkZXQuZXBfbGlzdCB1c2VkIGZvciBlcF9hdXRvY29uZmlnIHNvIG5vIGVwMCAqLworCWlmIChsaW5rKQorCQlsaXN0X2FkZF90YWlsKCZlcC0+ZXAuZXBfbGlzdCwgJnVkYy0+Z2FkZ2V0LmVwX2xpc3QpOworCWVwLT5nYWRnZXQgPSAmdWRjLT5nYWRnZXQ7CisJZXAtPnFoID0gJnVkYy0+ZXBfcWhbaW5kZXhdOworCisJcmV0dXJuIDA7Cit9CisKKy8qIERyaXZlciBwcm9iZSBmdW5jdGlvbgorICogYWxsIGludGlhbGl6ZSBvcGVyYXRpb25zIGltcGxlbWVudGVkIGhlcmUgZXhjZXB0IGVuYWJsaW5nIHVzYl9pbnRyIHJlZworICovCitzdGF0aWMgaW50IF9faW5pdCBmc2xfdWRjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJaW50IHJldCA9IC1FTk9ERVY7CisJdW5zaWduZWQgaW50IGk7CisKKwlpZiAoc3RyY21wKHBkZXYtPm5hbWUsIGRyaXZlcl9uYW1lKSkgeworCQlWREJHKCJXcm9uZyBkZXZpY2VcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBib2FyZCBzZXR1cCBzaG91bGQgaGF2ZSBiZWVuIGRvbmUgaW4gdGhlIHBsYXRmb3JtIGNvZGUgKi8KKworCS8qIEluaXRpYWxpemUgdGhlIHVkYyBzdHJ1Y3R1cmUgaW5jbHVkaW5nIFFIIG1lbWJlciBhbmQgb3RoZXIgbWVtYmVyICovCisJdWRjX2NvbnRyb2xsZXIgPSBzdHJ1Y3RfdWRjX3NldHVwKHBkZXYpOworCWlmICghdWRjX2NvbnRyb2xsZXIpIHsKKwkJVkRCRygidWRjX2NvbnRyb2xsZXIgaXMgTlVMTCBcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghcmVzKQorCQlyZXR1cm4gLUVOWElPOworCisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24ocmVzLT5zdGFydCwgcmVzLT5lbmQgLSByZXMtPnN0YXJ0ICsgMSwKKwkJCQlkcml2ZXJfbmFtZSkpIHsKKwkJRVJSKCJyZXF1ZXN0IG1lbSByZWdpb24gZm9yICVzIGZhaWxlZCBcbiIsIHBkZXYtPm5hbWUpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWRyX3JlZ3MgPSBpb3JlbWFwKHJlcy0+c3RhcnQsIHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDEpOworCWlmICghZHJfcmVncykgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycjE7CisJfQorCisJdXNiX3N5c19yZWdzID0gKHN0cnVjdCB1c2Jfc3lzX2ludGVyZmFjZSAqKQorCQkJKCh1MzIpZHJfcmVncyArIFVTQl9EUl9TWVNfT0ZGU0VUKTsKKworCXVkY19jb250cm9sbGVyLT5pcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCWlmICghdWRjX2NvbnRyb2xsZXItPmlycSkgeworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGVycjI7CisJfQorCisJcmV0ID0gcmVxdWVzdF9pcnEodWRjX2NvbnRyb2xsZXItPmlycSwgZnNsX3VkY19pcnEsIFNBX1NISVJRLAorCQkJZHJpdmVyX25hbWUsIHVkY19jb250cm9sbGVyKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJRVJSKCJjYW5ub3QgcmVxdWVzdCBpcnEgJWQgZXJyICVkIFxuIiwKKwkJCQl1ZGNfY29udHJvbGxlci0+aXJxLCByZXQpOworCQlnb3RvIGVycjI7CisJfQorCisJLyogaW5pdGlhbGl6ZSB1c2IgaHcgcmVnIGV4Y2VwdCBmb3IgcmVncyBmb3IgRVAsCisJICogbGVhdmUgdXNiaW50ciByZWcgdW50b3VjaGVkICovCisJZHJfY29udHJvbGxlcl9zZXR1cCh1ZGNfY29udHJvbGxlcik7CisKKwkvKiBTZXR1cCBnYWRnZXQgc3RydWN0dXJlICovCisJdWRjX2NvbnRyb2xsZXItPmdhZGdldC5vcHMgPSAmZnNsX2dhZGdldF9vcHM7CisJdWRjX2NvbnRyb2xsZXItPmdhZGdldC5pc19kdWFsc3BlZWQgPSAxOworCXVkY19jb250cm9sbGVyLT5nYWRnZXQuZXAwID0gJnVkY19jb250cm9sbGVyLT5lcHNbMF0uZXA7CisJSU5JVF9MSVNUX0hFQUQoJnVkY19jb250cm9sbGVyLT5nYWRnZXQuZXBfbGlzdCk7CisJdWRjX2NvbnRyb2xsZXItPmdhZGdldC5zcGVlZCA9IFVTQl9TUEVFRF9VTktOT1dOOworCXVkY19jb250cm9sbGVyLT5nYWRnZXQubmFtZSA9IGRyaXZlcl9uYW1lOworCisJLyogU2V0dXAgZ2FkZ2V0LmRldiBhbmQgcmVnaXN0ZXIgd2l0aCBrZXJuZWwgKi8KKwlzdHJjcHkodWRjX2NvbnRyb2xsZXItPmdhZGdldC5kZXYuYnVzX2lkLCAiZ2FkZ2V0Iik7CisJdWRjX2NvbnRyb2xsZXItPmdhZGdldC5kZXYucmVsZWFzZSA9IGZzbF91ZGNfcmVsZWFzZTsKKwl1ZGNfY29udHJvbGxlci0+Z2FkZ2V0LmRldi5wYXJlbnQgPSAmcGRldi0+ZGV2OworCXJldCA9IGRldmljZV9yZWdpc3RlcigmdWRjX2NvbnRyb2xsZXItPmdhZGdldC5kZXYpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycjM7CisKKwkvKiBzZXR1cCBRSCBhbmQgZXBjdHJsIGZvciBlcDAgKi8KKwllcDBfc2V0dXAodWRjX2NvbnRyb2xsZXIpOworCisJLyogc2V0dXAgdWRjLT5lcHNbXSBmb3IgZXAwICovCisJc3RydWN0X2VwX3NldHVwKHVkY19jb250cm9sbGVyLCAwLCAiZXAwIiwgMCk7CisJLyogZm9yIGVwMDogdGhlIGRlc2MgZGVmaW5lZCBoZXJlOworCSAqIGZvciBvdGhlciBlcHMsIGdhZGdldCBsYXllciBjYWxsZWQgZXBfZW5hYmxlIHdpdGggZGVmaW5lZCBkZXNjCisJICovCisJdWRjX2NvbnRyb2xsZXItPmVwc1swXS5kZXNjID0gJmZzbF9lcDBfZGVzYzsKKwl1ZGNfY29udHJvbGxlci0+ZXBzWzBdLmVwLm1heHBhY2tldCA9IFVTQl9NQVhfQ1RSTF9QQVlMT0FEOworCisJLyogc2V0dXAgdGhlIHVkYy0+ZXBzW10gZm9yIG5vbi1jb250cm9sIGVuZHBvaW50cyBhbmQgbGluaworCSAqIHRvIGdhZGdldC5lcF9saXN0ICovCisJZm9yIChpID0gMTsgaSA8IChpbnQpKHVkY19jb250cm9sbGVyLT5tYXhfZXAgLyAyKTsgaSsrKSB7CisJCWNoYXIgbmFtZVsxNF07CisKKwkJc3ByaW50ZihuYW1lLCAiZXAlZG91dCIsIGkpOworCQlzdHJ1Y3RfZXBfc2V0dXAodWRjX2NvbnRyb2xsZXIsIGkgKiAyLCBuYW1lLCAxKTsKKwkJc3ByaW50ZihuYW1lLCAiZXAlZGluIiwgaSk7CisJCXN0cnVjdF9lcF9zZXR1cCh1ZGNfY29udHJvbGxlciwgaSAqIDIgKyAxLCBuYW1lLCAxKTsKKwl9CisKKwkvKiB1c2UgZG1hX3Bvb2wgZm9yIFREIG1hbmFnZW1lbnQgKi8KKwl1ZGNfY29udHJvbGxlci0+dGRfcG9vbCA9IGRtYV9wb29sX2NyZWF0ZSgidWRjX3RkIiwgJnBkZXYtPmRldiwKKwkJCXNpemVvZihzdHJ1Y3QgZXBfdGRfc3RydWN0KSwKKwkJCURURF9BTElHTk1FTlQsIFVEQ19ETUFfQk9VTkRBUlkpOworCWlmICh1ZGNfY29udHJvbGxlci0+dGRfcG9vbCA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyNDsKKwl9CisJY3JlYXRlX3Byb2NfZmlsZSgpOworCXJldHVybiAwOworCitlcnI0OgorCWRldmljZV91bnJlZ2lzdGVyKCZ1ZGNfY29udHJvbGxlci0+Z2FkZ2V0LmRldik7CitlcnIzOgorCWZyZWVfaXJxKHVkY19jb250cm9sbGVyLT5pcnEsIHVkY19jb250cm9sbGVyKTsKK2VycjI6CisJaW91bm1hcChkcl9yZWdzKTsKK2VycjE6CisJcmVsZWFzZV9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDEpOworCXJldHVybiByZXQ7Cit9CisKKy8qIERyaXZlciByZW1vdmFsIGZ1bmN0aW9uCisgKiBGcmVlIHJlc291cmNlcyBhbmQgZmluaXNoIHBlbmRpbmcgdHJhbnNhY3Rpb25zCisgKi8KK3N0YXRpYyBpbnQgX19leGl0IGZzbF91ZGNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHJlc291cmNlICpyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCisJREVDTEFSRV9DT01QTEVUSU9OKGRvbmUpOworCisJaWYgKCF1ZGNfY29udHJvbGxlcikKKwkJcmV0dXJuIC1FTk9ERVY7CisJdWRjX2NvbnRyb2xsZXItPmRvbmUgPSAmZG9uZTsKKworCS8qIERSIGhhcyBiZWVuIHN0b3BwZWQgaW4gdXNiX2dhZGdldF91bnJlZ2lzdGVyX2RyaXZlcigpICovCisJcmVtb3ZlX3Byb2NfZmlsZSgpOworCisJLyogRnJlZSBhbGxvY2F0ZWQgbWVtb3J5ICovCisJa2ZyZWUodWRjX2NvbnRyb2xsZXItPnN0YXR1c19yZXEtPnJlcS5idWYpOworCWtmcmVlKHVkY19jb250cm9sbGVyLT5zdGF0dXNfcmVxKTsKKwlrZnJlZSh1ZGNfY29udHJvbGxlci0+ZXBzKTsKKworCWRtYV9wb29sX2Rlc3Ryb3kodWRjX2NvbnRyb2xsZXItPnRkX3Bvb2wpOworCWZyZWVfaXJxKHVkY19jb250cm9sbGVyLT5pcnEsIHVkY19jb250cm9sbGVyKTsKKwlpb3VubWFwKGRyX3JlZ3MpOworCXJlbGVhc2VfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXMtPmVuZCAtIHJlcy0+c3RhcnQgKyAxKTsKKworCWRldmljZV91bnJlZ2lzdGVyKCZ1ZGNfY29udHJvbGxlci0+Z2FkZ2V0LmRldik7CisJLyogZnJlZSB1ZGMgLS13YWl0IGZvciB0aGUgcmVsZWFzZSgpIGZpbmlzaGVkICovCisJd2FpdF9mb3JfY29tcGxldGlvbigmZG9uZSk7CisKKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogTW9kaWZ5IFBvd2VyIG1hbmFnZW1lbnQgYXR0cmlidXRlcworICogVXNlZCBieSBPVEcgc3RhdGVtYWNoaW5lIHRvIGRpc2FibGUgZ2FkZ2V0IHRlbXBvcmFyaWx5CisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGludCBmc2xfdWRjX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCWRyX2NvbnRyb2xsZXJfc3RvcCh1ZGNfY29udHJvbGxlcik7CisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEludm9rZWQgb24gVVNCIHJlc3VtZS4gTWF5IGJlIGNhbGxlZCBpbl9pbnRlcnJ1cHQuCisgKiBIZXJlIHdlIHN0YXJ0IHRoZSBEUiBjb250cm9sbGVyIGFuZCBlbmFibGUgdGhlIGlycQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgaW50IGZzbF91ZGNfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJLyogRW5hYmxlIERSIGlycSByZWcgYW5kIHNldCBjb250cm9sbGVyIFJ1biAqLworCWlmICh1ZGNfY29udHJvbGxlci0+c3RvcHBlZCkgeworCQlkcl9jb250cm9sbGVyX3NldHVwKHVkY19jb250cm9sbGVyKTsKKwkJZHJfY29udHJvbGxlcl9ydW4odWRjX2NvbnRyb2xsZXIpOworCX0KKwl1ZGNfY29udHJvbGxlci0+dXNiX3N0YXRlID0gVVNCX1NUQVRFX0FUVEFDSEVEOworCXVkY19jb250cm9sbGVyLT5lcDBfc3RhdGUgPSBXQUlUX0ZPUl9TRVRVUDsKKwl1ZGNfY29udHJvbGxlci0+ZXAwX2RpciA9IDA7CisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCVJlZ2lzdGVyIGVudHJ5IHBvaW50IGZvciB0aGUgcGVyaXBoZXJhbCBjb250cm9sbGVyIGRyaXZlcgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB1ZGNfZHJpdmVyID0geworCS5yZW1vdmUgID0gX19leGl0X3AoZnNsX3VkY19yZW1vdmUpLAorCS8qIHRoZXNlIHN1c3BlbmQgYW5kIHJlc3VtZSBhcmUgbm90IHVzYiBzdXNwZW5kIGFuZCByZXN1bWUgKi8KKwkuc3VzcGVuZCA9IGZzbF91ZGNfc3VzcGVuZCwKKwkucmVzdW1lICA9IGZzbF91ZGNfcmVzdW1lLAorCS5kcml2ZXIgID0geworCQkubmFtZSA9IChjaGFyICopZHJpdmVyX25hbWUsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCB1ZGNfaW5pdCh2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gIiVzICglcylcbiIsIGRyaXZlcl9kZXNjLCBEUklWRVJfVkVSU0lPTik7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9wcm9iZSgmdWRjX2RyaXZlciwgZnNsX3VkY19wcm9iZSk7Cit9CisKK21vZHVsZV9pbml0KHVkY19pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IHVkY19leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnVkY19kcml2ZXIpOworCXByaW50aygiJXMgdW5yZWdpc3RlcmVkIFxuIiwgZHJpdmVyX2Rlc2MpOworfQorCittb2R1bGVfZXhpdCh1ZGNfZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTihEUklWRVJfREVTQyk7CitNT0RVTEVfQVVUSE9SKERSSVZFUl9BVVRIT1IpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2ZzbF91c2IyX3VkYy5oIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2ZzbF91c2IyX3VkYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2MjkxZTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZnNsX3VzYjJfdWRjLmgKQEAgLTAsMCArMSw1NzkgQEAKKy8qCisgKiBGcmVlc2NhbGUgVVNCIGRldmljZS9lbmRwb2ludCBtYW5hZ2VtZW50IHJlZ2lzdGVycworICovCisjaWZuZGVmIF9fRlNMX1VTQjJfVURDX0gKKyNkZWZpbmUgX19GU0xfVVNCMl9VRENfSAorCisvKiAjIyMgZGVmaW5lIFVTQiByZWdpc3RlcnMgaGVyZQorICovCisjZGVmaW5lIFVTQl9NQVhfQ1RSTF9QQVlMT0FECQk2NAorI2RlZmluZSBVU0JfRFJfU1lTX09GRlNFVAkJMHg0MDAKKworIC8qIFVTQiBEUiBkZXZpY2UgbW9kZSByZWdpc3RlcnMgKExpdHRsZSBFbmRpYW4pICovCitzdHJ1Y3QgdXNiX2RyX2RldmljZSB7CisJLyogQ2FwYWJpbGl0eSByZWdpc3RlciAqLworCXU4IHJlczFbMjU2XTsKKwl1MTYgY2FwbGVuZ3RoOwkJLyogQ2FwYWJpbGl0eSBSZWdpc3RlciBMZW5ndGggKi8KKwl1MTYgaGNpdmVyc2lvbjsJCS8qIEhvc3QgQ29udHJvbGxlciBJbnRlcmZhY2UgVmVyc2lvbiAqLworCXUzMiBoY3NwYXJhbXM7CQkvKiBIb3N0IENvbnRyb2xsZXIgU3RydWN0dWFsIFBhcmFtZXRlcnMgKi8KKwl1MzIgaGNjcGFyYW1zOwkJLyogSG9zdCBDb250cm9sbGVyIENhcGFiaWxpdHkgUGFyYW1ldGVycyAqLworCXU4IHJlczJbMjBdOworCXUzMiBkY2l2ZXJzaW9uOwkJLyogRGV2aWNlIENvbnRyb2xsZXIgSW50ZXJmYWNlIFZlcnNpb24gKi8KKwl1MzIgZGNjcGFyYW1zOwkJLyogRGV2aWNlIENvbnRyb2xsZXIgQ2FwYWJpbGl0eSBQYXJhbWV0ZXJzICovCisJdTggcmVzM1syNF07CisJLyogT3BlcmF0aW9uIHJlZ2lzdGVyICovCisJdTMyIHVzYmNtZDsJCS8qIFVTQiBDb21tYW5kIFJlZ2lzdGVyICovCisJdTMyIHVzYnN0czsJCS8qIFVTQiBTdGF0dXMgUmVnaXN0ZXIgKi8KKwl1MzIgdXNiaW50cjsJCS8qIFVTQiBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyICovCisJdTMyIGZyaW5kZXg7CQkvKiBGcmFtZSBJbmRleCBSZWdpc3RlciAqLworCXU4IHJlczRbNF07CisJdTMyIGRldmljZWFkZHI7CQkvKiBEZXZpY2UgQWRkcmVzcyAqLworCXUzMiBlbmRwb2ludGxpc3RhZGRyOwkvKiBFbmRwb2ludCBMaXN0IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKwl1OCByZXM1WzRdOworCXUzMiBidXJzdHNpemU7CQkvKiBNYXN0ZXIgSW50ZXJmYWNlIERhdGEgQnVyc3QgU2l6ZSBSZWdpc3RlciAqLworCXUzMiB0eHR0ZmlsbHR1bmluZzsJLyogVHJhbnNtaXQgRklGTyBUdW5pbmcgQ29udHJvbHMgUmVnaXN0ZXIgKi8KKwl1OCByZXM2WzI0XTsKKwl1MzIgY29uZmlnZmxhZzsJCS8qIENvbmZpZ3VyZSBGbGFnIFJlZ2lzdGVyICovCisJdTMyIHBvcnRzYzE7CQkvKiBQb3J0IDEgU3RhdHVzIGFuZCBDb250cm9sIFJlZ2lzdGVyICovCisJdTggcmVzN1syOF07CisJdTMyIG90Z3NjOwkJLyogT24tVGhlLUdvIFN0YXR1cyBhbmQgQ29udHJvbCAqLworCXUzMiB1c2Jtb2RlOwkJLyogVVNCIE1vZGUgUmVnaXN0ZXIgKi8KKwl1MzIgZW5kcHRzZXR1cHN0YXQ7CS8qIEVuZHBvaW50IFNldHVwIFN0YXR1cyBSZWdpc3RlciAqLworCXUzMiBlbmRwb2ludHByaW1lOwkvKiBFbmRwb2ludCBJbml0aWFsaXphdGlvbiBSZWdpc3RlciAqLworCXUzMiBlbmRwdGZsdXNoOwkJLyogRW5kcG9pbnQgRmx1c2ggUmVnaXN0ZXIgKi8KKwl1MzIgZW5kcHRzdGF0dXM7CS8qIEVuZHBvaW50IFN0YXR1cyBSZWdpc3RlciAqLworCXUzMiBlbmRwdGNvbXBsZXRlOwkvKiBFbmRwb2ludCBDb21wbGV0ZSBSZWdpc3RlciAqLworCXUzMiBlbmRwdGN0cmxbNl07CS8qIEVuZHBvaW50IENvbnRyb2wgUmVnaXN0ZXJzICovCit9OworCisgLyogVVNCIERSIGhvc3QgbW9kZSByZWdpc3RlcnMgKExpdHRsZSBFbmRpYW4pICovCitzdHJ1Y3QgdXNiX2RyX2hvc3QgeworCS8qIENhcGFiaWxpdHkgcmVnaXN0ZXIgKi8KKwl1OCByZXMxWzI1Nl07CisJdTE2IGNhcGxlbmd0aDsJCS8qIENhcGFiaWxpdHkgUmVnaXN0ZXIgTGVuZ3RoICovCisJdTE2IGhjaXZlcnNpb247CQkvKiBIb3N0IENvbnRyb2xsZXIgSW50ZXJmYWNlIFZlcnNpb24gKi8KKwl1MzIgaGNzcGFyYW1zOwkJLyogSG9zdCBDb250cm9sbGVyIFN0cnVjdHVhbCBQYXJhbWV0ZXJzICovCisJdTMyIGhjY3BhcmFtczsJCS8qIEhvc3QgQ29udHJvbGxlciBDYXBhYmlsaXR5IFBhcmFtZXRlcnMgKi8KKwl1OCByZXMyWzIwXTsKKwl1MzIgZGNpdmVyc2lvbjsJCS8qIERldmljZSBDb250cm9sbGVyIEludGVyZmFjZSBWZXJzaW9uICovCisJdTMyIGRjY3BhcmFtczsJCS8qIERldmljZSBDb250cm9sbGVyIENhcGFiaWxpdHkgUGFyYW1ldGVycyAqLworCXU4IHJlczNbMjRdOworCS8qIE9wZXJhdGlvbiByZWdpc3RlciAqLworCXUzMiB1c2JjbWQ7CQkvKiBVU0IgQ29tbWFuZCBSZWdpc3RlciAqLworCXUzMiB1c2JzdHM7CQkvKiBVU0IgU3RhdHVzIFJlZ2lzdGVyICovCisJdTMyIHVzYmludHI7CQkvKiBVU0IgSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAqLworCXUzMiBmcmluZGV4OwkJLyogRnJhbWUgSW5kZXggUmVnaXN0ZXIgKi8KKwl1OCByZXM0WzRdOworCXUzMiBwZXJpb2RpY2xpc3RiYXNlOwkvKiBQZXJpb2RpYyBGcmFtZSBMaXN0IEJhc2UgQWRkcmVzcyBSZWdpc3RlciAqLworCXUzMiBhc3luY2xpc3RhZGRyOwkvKiBDdXJyZW50IEFzeW5jaHJvbm91cyBMaXN0IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKwl1OCByZXM1WzRdOworCXUzMiBidXJzdHNpemU7CQkvKiBNYXN0ZXIgSW50ZXJmYWNlIERhdGEgQnVyc3QgU2l6ZSBSZWdpc3RlciAqLworCXUzMiB0eHR0ZmlsbHR1bmluZzsJLyogVHJhbnNtaXQgRklGTyBUdW5pbmcgQ29udHJvbHMgUmVnaXN0ZXIgKi8KKwl1OCByZXM2WzI0XTsKKwl1MzIgY29uZmlnZmxhZzsJCS8qIENvbmZpZ3VyZSBGbGFnIFJlZ2lzdGVyICovCisJdTMyIHBvcnRzYzE7CQkvKiBQb3J0IDEgU3RhdHVzIGFuZCBDb250cm9sIFJlZ2lzdGVyICovCisJdTggcmVzN1syOF07CisJdTMyIG90Z3NjOwkJLyogT24tVGhlLUdvIFN0YXR1cyBhbmQgQ29udHJvbCAqLworCXUzMiB1c2Jtb2RlOwkJLyogVVNCIE1vZGUgUmVnaXN0ZXIgKi8KKwl1MzIgZW5kcHRzZXR1cHN0YXQ7CS8qIEVuZHBvaW50IFNldHVwIFN0YXR1cyBSZWdpc3RlciAqLworCXUzMiBlbmRwb2ludHByaW1lOwkvKiBFbmRwb2ludCBJbml0aWFsaXphdGlvbiBSZWdpc3RlciAqLworCXUzMiBlbmRwdGZsdXNoOwkJLyogRW5kcG9pbnQgRmx1c2ggUmVnaXN0ZXIgKi8KKwl1MzIgZW5kcHRzdGF0dXM7CS8qIEVuZHBvaW50IFN0YXR1cyBSZWdpc3RlciAqLworCXUzMiBlbmRwdGNvbXBsZXRlOwkvKiBFbmRwb2ludCBDb21wbGV0ZSBSZWdpc3RlciAqLworCXUzMiBlbmRwdGN0cmxbNl07CS8qIEVuZHBvaW50IENvbnRyb2wgUmVnaXN0ZXJzICovCit9OworCisgLyogbm9uLUVIQ0kgVVNCIHN5c3RlbSBpbnRlcmZhY2UgcmVnaXN0ZXJzIChCaWcgRW5kaWFuKSAqLworc3RydWN0IHVzYl9zeXNfaW50ZXJmYWNlIHsKKwl1MzIgc25vb3AxOworCXUzMiBzbm9vcDI7CisJdTMyIGFnZV9jbnRfdGhyZXNoOwkvKiBBZ2UgQ291bnQgVGhyZXNob2xkIFJlZ2lzdGVyICovCisJdTMyIHByaV9jdHJsOwkJLyogUHJpb3JpdHkgQ29udHJvbCBSZWdpc3RlciAqLworCXUzMiBzaV9jdHJsOwkJLyogU3lzdGVtIEludGVyZmFjZSBDb250cm9sIFJlZ2lzdGVyICovCisJdTggcmVzWzIzNl07CisJdTMyIGNvbnRyb2w7CQkvKiBHZW5lcmFsIFB1cnBvc2UgQ29udHJvbCBSZWdpc3RlciAqLworfTsKKworLyogZXAwIHRyYW5zZmVyIHN0YXRlICovCisjZGVmaW5lIFdBSVRfRk9SX1NFVFVQICAgICAgICAgIDAKKyNkZWZpbmUgREFUQV9TVEFURV9YTUlUICAgICAgICAgMQorI2RlZmluZSBEQVRBX1NUQVRFX05FRURfWkxQICAgICAyCisjZGVmaW5lIFdBSVRfRk9SX09VVF9TVEFUVVMgICAgIDMKKyNkZWZpbmUgREFUQV9TVEFURV9SRUNWICAgICAgICAgNAorCisvKiBGcmFtZSBJbmRleCBSZWdpc3RlciBCaXQgTWFza3MgKi8KKyNkZWZpbmUJVVNCX0ZSSU5ERVhfTUFTS1MJCQkweDNmZmYKKy8qIFVTQiBDTUQgIFJlZ2lzdGVyIEJpdCBNYXNrcyAqLworI2RlZmluZSAgVVNCX0NNRF9SVU5fU1RPUCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgIFVTQl9DTURfQ1RSTF9SRVNFVCAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lICBVU0JfQ01EX1BFUklPRElDX1NDSEVEVUxFX0VOICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSAgVVNCX0NNRF9BU1lOQ19TQ0hFRFVMRV9FTiAgICAgICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgIFVTQl9DTURfSU5UX0FBX0RPT1JCRUxMICAgICAgICAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lICBVU0JfQ01EX0FTUCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMwMAorI2RlZmluZSAgVVNCX0NNRF9BU1lOQ19TQ0hfUEFSS19FTiAgICAgICAgICAgIDB4MDAwMDA4MDAKKyNkZWZpbmUgIFVTQl9DTURfU1VUVyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAyMDAwCisjZGVmaW5lICBVU0JfQ01EX0FURFRXICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwNDAwMAorI2RlZmluZSAgVVNCX0NNRF9JVEMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBGRjAwMDAKKworLyogYml0IDE1LDMsMiBhcmUgZnJhbWUgbGlzdCBzaXplICovCisjZGVmaW5lICBVU0JfQ01EX0ZSQU1FX1NJWkVfMTAyNCAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSAgVVNCX0NNRF9GUkFNRV9TSVpFXzUxMiAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgIFVTQl9DTURfRlJBTUVfU0laRV8yNTYgICAgICAgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lICBVU0JfQ01EX0ZSQU1FX1NJWkVfMTI4ICAgICAgICAgICAgICAgMHgwMDAwMDAwQworI2RlZmluZSAgVVNCX0NNRF9GUkFNRV9TSVpFXzY0ICAgICAgICAgICAgICAgIDB4MDAwMDgwMDAKKyNkZWZpbmUgIFVTQl9DTURfRlJBTUVfU0laRV8zMiAgICAgICAgICAgICAgICAweDAwMDA4MDA0CisjZGVmaW5lICBVU0JfQ01EX0ZSQU1FX1NJWkVfMTYgICAgICAgICAgICAgICAgMHgwMDAwODAwOAorI2RlZmluZSAgVVNCX0NNRF9GUkFNRV9TSVpFXzggICAgICAgICAgICAgICAgIDB4MDAwMDgwMEMKKworLyogYml0IDktOCBhcmUgYXN5bmMgc2NoZWR1bGUgcGFyayBtb2RlIGNvdW50ICovCisjZGVmaW5lICBVU0JfQ01EX0FTUF8wMCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSAgVVNCX0NNRF9BU1BfMDEgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgIFVTQl9DTURfQVNQXzEwICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjAwCisjZGVmaW5lICBVU0JfQ01EX0FTUF8xMSAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMwMAorI2RlZmluZSAgVVNCX0NNRF9BU1BfQklUX1BPUyAgICAgICAgICAgICAgICAgIDgKKworLyogYml0IDIzLTE2IGFyZSBpbnRlcnJ1cHQgdGhyZXNob2xkIGNvbnRyb2wgKi8KKyNkZWZpbmUgIFVTQl9DTURfSVRDX05PX1RIUkVTSE9MRCAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lICBVU0JfQ01EX0lUQ18xX01JQ1JPX0ZSTSAgICAgICAgICAgICAgMHgwMDAxMDAwMAorI2RlZmluZSAgVVNCX0NNRF9JVENfMl9NSUNST19GUk0gICAgICAgICAgICAgIDB4MDAwMjAwMDAKKyNkZWZpbmUgIFVTQl9DTURfSVRDXzRfTUlDUk9fRlJNICAgICAgICAgICAgICAweDAwMDQwMDAwCisjZGVmaW5lICBVU0JfQ01EX0lUQ184X01JQ1JPX0ZSTSAgICAgICAgICAgICAgMHgwMDA4MDAwMAorI2RlZmluZSAgVVNCX0NNRF9JVENfMTZfTUlDUk9fRlJNICAgICAgICAgICAgIDB4MDAxMDAwMDAKKyNkZWZpbmUgIFVTQl9DTURfSVRDXzMyX01JQ1JPX0ZSTSAgICAgICAgICAgICAweDAwMjAwMDAwCisjZGVmaW5lICBVU0JfQ01EX0lUQ182NF9NSUNST19GUk0gICAgICAgICAgICAgMHgwMDQwMDAwMAorI2RlZmluZSAgVVNCX0NNRF9JVENfQklUX1BPUyAgICAgICAgICAgICAgICAgIDE2CisKKy8qIFVTQiBTVFMgUmVnaXN0ZXIgQml0IE1hc2tzICovCisjZGVmaW5lICBVU0JfU1RTX0lOVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSAgVVNCX1NUU19FUlIgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgIFVTQl9TVFNfUE9SVF9DSEFOR0UgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lICBVU0JfU1RTX0ZSTV9MU1RfUk9MTCAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSAgVVNCX1NUU19TWVNfRVJSICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgIFVTQl9TVFNfSUFBICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lICBVU0JfU1RTX1JFU0VUICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSAgVVNCX1NUU19TT0YgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgIFVTQl9TVFNfU1VTUEVORCAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAwCisjZGVmaW5lICBVU0JfU1RTX0hDX0hBTFRFRCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTAwMAorI2RlZmluZSAgVVNCX1NUU19SQ0wgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDIwMDAKKyNkZWZpbmUgIFVTQl9TVFNfUEVSSU9ESUNfU0NIRURVTEUgICAgICAgICAgICAweDAwMDA0MDAwCisjZGVmaW5lICBVU0JfU1RTX0FTWU5DX1NDSEVEVUxFICAgICAgICAgICAgICAgMHgwMDAwODAwMAorCisvKiBVU0IgSU5UUiBSZWdpc3RlciBCaXQgTWFza3MgKi8KKyNkZWZpbmUgIFVTQl9JTlRSX0lOVF9FTiAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lICBVU0JfSU5UUl9FUlJfSU5UX0VOICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSAgVVNCX0lOVFJfUFRDX0RFVEVDVF9FTiAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgIFVTQl9JTlRSX0ZSTV9MU1RfUk9MTF9FTiAgICAgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lICBVU0JfSU5UUl9TWVNfRVJSX0VOICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSAgVVNCX0lOVFJfQVNZTl9BRFZfRU4gICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgIFVTQl9JTlRSX1JFU0VUX0VOICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lICBVU0JfSU5UUl9TT0ZfRU4gICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSAgVVNCX0lOVFJfREVWSUNFX1NVU1BFTkQgICAgICAgICAgICAgIDB4MDAwMDAxMDAKKworLyogRGV2aWNlIEFkZHJlc3MgYml0IG1hc2tzICovCisjZGVmaW5lICBVU0JfREVWSUNFX0FERFJFU1NfTUFTSyAgICAgICAgICAgICAgMHhGRTAwMDAwMAorI2RlZmluZSAgVVNCX0RFVklDRV9BRERSRVNTX0JJVF9QT1MgICAgICAgICAgIDI1CisKKy8qIGVuZHBvaW50IGxpc3QgYWRkcmVzcyBiaXQgbWFza3MgKi8KKyNkZWZpbmUgVVNCX0VQX0xJU1RfQUREUkVTU19NQVNLICAgICAgICAgICAgICAweGZmZmZmODAwCisKKy8qIFBPUlRTQ1ggIFJlZ2lzdGVyIEJpdCBNYXNrcyAqLworI2RlZmluZSAgUE9SVFNDWF9DVVJSRU5UX0NPTk5FQ1RfU1RBVFVTICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgIFBPUlRTQ1hfQ09OTkVDVF9TVEFUVVNfQ0hBTkdFICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lICBQT1JUU0NYX1BPUlRfRU5BQkxFICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSAgUE9SVFNDWF9QT1JUX0VOX0RJU19DSEFOR0UgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgIFBPUlRTQ1hfT1ZFUl9DVVJSRU5UX0FDVCAgICAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lICBQT1JUU0NYX09WRVJfQ1VSUkVOVF9DSEcgICAgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSAgUE9SVFNDWF9QT1JUX0ZPUkNFX1JFU1VNRSAgICAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgIFBPUlRTQ1hfUE9SVF9TVVNQRU5EICAgICAgICAgICAgICAgICAweDAwMDAwMDgwCisjZGVmaW5lICBQT1JUU0NYX1BPUlRfUkVTRVQgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSAgUE9SVFNDWF9MSU5FX1NUQVRVU19CSVRTICAgICAgICAgICAgIDB4MDAwMDBDMDAKKyNkZWZpbmUgIFBPUlRTQ1hfUE9SVF9QT1dFUiAgICAgICAgICAgICAgICAgICAweDAwMDAxMDAwCisjZGVmaW5lICBQT1JUU0NYX1BPUlRfSU5ESUNUT1JfQ1RSTCAgICAgICAgICAgMHgwMDAwQzAwMAorI2RlZmluZSAgUE9SVFNDWF9QT1JUX1RFU1RfQ1RSTCAgICAgICAgICAgICAgIDB4MDAwRjAwMDAKKyNkZWZpbmUgIFBPUlRTQ1hfV0FLRV9PTl9DT05ORUNUX0VOICAgICAgICAgICAweDAwMTAwMDAwCisjZGVmaW5lICBQT1JUU0NYX1dBS0VfT05fQ09OTkVDVF9ESVMgICAgICAgICAgMHgwMDIwMDAwMAorI2RlZmluZSAgUE9SVFNDWF9XQUtFX09OX09WRVJfQ1VSUkVOVCAgICAgICAgIDB4MDA0MDAwMDAKKyNkZWZpbmUgIFBPUlRTQ1hfUEhZX0xPV19QT1dFUl9TUEQgICAgICAgICAgICAweDAwODAwMDAwCisjZGVmaW5lICBQT1JUU0NYX1BPUlRfRk9SQ0VfRlVMTF9TUEVFRCAgICAgICAgMHgwMTAwMDAwMAorI2RlZmluZSAgUE9SVFNDWF9QT1JUX1NQRUVEX01BU0sgICAgICAgICAgICAgIDB4MEMwMDAwMDAKKyNkZWZpbmUgIFBPUlRTQ1hfUE9SVF9XSURUSCAgICAgICAgICAgICAgICAgICAweDEwMDAwMDAwCisjZGVmaW5lICBQT1JUU0NYX1BIWV9UWVBFX1NFTCAgICAgICAgICAgICAgICAgMHhDMDAwMDAwMAorCisvKiBiaXQgMTEtMTAgYXJlIGxpbmUgc3RhdHVzICovCisjZGVmaW5lICBQT1JUU0NYX0xJTkVfU1RBVFVTX1NFMCAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSAgUE9SVFNDWF9MSU5FX1NUQVRVU19KU1RBVEUgICAgICAgICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgIFBPUlRTQ1hfTElORV9TVEFUVVNfS1NUQVRFICAgICAgICAgICAweDAwMDAwODAwCisjZGVmaW5lICBQT1JUU0NYX0xJTkVfU1RBVFVTX1VOREVGICAgICAgICAgICAgMHgwMDAwMEMwMAorI2RlZmluZSAgUE9SVFNDWF9MSU5FX1NUQVRVU19CSVRfUE9TICAgICAgICAgIDEwCisKKy8qIGJpdCAxNS0xNCBhcmUgcG9ydCBpbmRpY2F0b3IgY29udHJvbCAqLworI2RlZmluZSAgUE9SVFNDWF9QSUNfT0ZGICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgIFBPUlRTQ1hfUElDX0FNQkVSICAgICAgICAgICAgICAgICAgICAweDAwMDA0MDAwCisjZGVmaW5lICBQT1JUU0NYX1BJQ19HUkVFTiAgICAgICAgICAgICAgICAgICAgMHgwMDAwODAwMAorI2RlZmluZSAgUE9SVFNDWF9QSUNfVU5ERUYgICAgICAgICAgICAgICAgICAgIDB4MDAwMEMwMDAKKyNkZWZpbmUgIFBPUlRTQ1hfUElDX0JJVF9QT1MgICAgICAgICAgICAgICAgICAxNAorCisvKiBiaXQgMTktMTYgYXJlIHBvcnQgdGVzdCBjb250cm9sICovCisjZGVmaW5lICBQT1JUU0NYX1BUQ19ESVNBQkxFICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSAgUE9SVFNDWF9QVENfSlNUQVRFICAgICAgICAgICAgICAgICAgIDB4MDAwMTAwMDAKKyNkZWZpbmUgIFBPUlRTQ1hfUFRDX0tTVEFURSAgICAgICAgICAgICAgICAgICAweDAwMDIwMDAwCisjZGVmaW5lICBQT1JUU0NYX1BUQ19TRVFOQUsgICAgICAgICAgICAgICAgICAgMHgwMDAzMDAwMAorI2RlZmluZSAgUE9SVFNDWF9QVENfUEFDS0VUICAgICAgICAgICAgICAgICAgIDB4MDAwNDAwMDAKKyNkZWZpbmUgIFBPUlRTQ1hfUFRDX0ZPUkNFX0VOICAgICAgICAgICAgICAgICAweDAwMDUwMDAwCisjZGVmaW5lICBQT1JUU0NYX1BUQ19CSVRfUE9TICAgICAgICAgICAgICAgICAgMTYKKworLyogYml0IDI3LTI2IGFyZSBwb3J0IHNwZWVkICovCisjZGVmaW5lICBQT1JUU0NYX1BPUlRfU1BFRURfRlVMTCAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSAgUE9SVFNDWF9QT1JUX1NQRUVEX0xPVyAgICAgICAgICAgICAgIDB4MDQwMDAwMDAKKyNkZWZpbmUgIFBPUlRTQ1hfUE9SVF9TUEVFRF9ISUdIICAgICAgICAgICAgICAweDA4MDAwMDAwCisjZGVmaW5lICBQT1JUU0NYX1BPUlRfU1BFRURfVU5ERUYgICAgICAgICAgICAgMHgwQzAwMDAwMAorI2RlZmluZSAgUE9SVFNDWF9TUEVFRF9CSVRfUE9TICAgICAgICAgICAgICAgIDI2CisKKy8qIGJpdCAyOCBpcyBwYXJhbGxlbCB0cmFuc2NlaXZlciB3aWR0aCBmb3IgVVRNSSBpbnRlcmZhY2UgKi8KKyNkZWZpbmUgIFBPUlRTQ1hfUFRXICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAwMDAwCisjZGVmaW5lICBQT1JUU0NYX1BUV184QklUICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSAgUE9SVFNDWF9QVFdfMTZCSVQgICAgICAgICAgICAgICAgICAgIDB4MTAwMDAwMDAKKworLyogYml0IDMxLTMwIGFyZSBwb3J0IHRyYW5zY2VpdmVyIHNlbGVjdCAqLworI2RlZmluZSAgUE9SVFNDWF9QVFNfVVRNSSAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgIFBPUlRTQ1hfUFRTX1VMUEkgICAgICAgICAgICAgICAgICAgICAweDgwMDAwMDAwCisjZGVmaW5lICBQT1JUU0NYX1BUU19GU0xTICAgICAgICAgICAgICAgICAgICAgMHhDMDAwMDAwMAorI2RlZmluZSAgUE9SVFNDWF9QVFNfQklUX1BPUyAgICAgICAgICAgICAgICAgIDMwCisKKy8qIG90Z3NjIFJlZ2lzdGVyIEJpdCBNYXNrcyAqLworI2RlZmluZSAgT1RHU0NfQ1RSTF9WVVNCX0RJU0NIQVJHRSAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgIE9UR1NDX0NUUkxfVlVTQl9DSEFSR0UgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lICBPVEdTQ19DVFJMX09UR19URVJNICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSAgT1RHU0NfQ1RSTF9EQVRBX1BVTFNJTkcgICAgICAgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgIE9UR1NDX1NUU19VU0JfSUQgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAwCisjZGVmaW5lICBPVEdTQ19TVFNfQV9WQlVTX1ZBTElEICAgICAgICAgICAgICAgMHgwMDAwMDIwMAorI2RlZmluZSAgT1RHU0NfU1RTX0FfU0VTU0lPTl9WQUxJRCAgICAgICAgICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgIE9UR1NDX1NUU19CX1NFU1NJT05fVkFMSUQgICAgICAgICAgICAweDAwMDAwODAwCisjZGVmaW5lICBPVEdTQ19TVFNfQl9TRVNTSU9OX0VORCAgICAgICAgICAgICAgMHgwMDAwMTAwMAorI2RlZmluZSAgT1RHU0NfU1RTXzFNU19UT0dHTEUgICAgICAgICAgICAgICAgIDB4MDAwMDIwMDAKKyNkZWZpbmUgIE9UR1NDX1NUU19EQVRBX1BVTFNJTkcgICAgICAgICAgICAgICAweDAwMDA0MDAwCisjZGVmaW5lICBPVEdTQ19JTlRTVFNfVVNCX0lEICAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMAorI2RlZmluZSAgT1RHU0NfSU5UU1RTX0FfVkJVU19WQUxJRCAgICAgICAgICAgIDB4MDAwMjAwMDAKKyNkZWZpbmUgIE9UR1NDX0lOVFNUU19BX1NFU1NJT05fVkFMSUQgICAgICAgICAweDAwMDQwMDAwCisjZGVmaW5lICBPVEdTQ19JTlRTVFNfQl9TRVNTSU9OX1ZBTElEICAgICAgICAgMHgwMDA4MDAwMAorI2RlZmluZSAgT1RHU0NfSU5UU1RTX0JfU0VTU0lPTl9FTkQgICAgICAgICAgIDB4MDAxMDAwMDAKKyNkZWZpbmUgIE9UR1NDX0lOVFNUU18xTVMgICAgICAgICAgICAgICAgICAgICAweDAwMjAwMDAwCisjZGVmaW5lICBPVEdTQ19JTlRTVFNfREFUQV9QVUxTSU5HICAgICAgICAgICAgMHgwMDQwMDAwMAorI2RlZmluZSAgT1RHU0NfSU5UUl9VU0JfSUQgICAgICAgICAgICAgICAgICAgIDB4MDEwMDAwMDAKKyNkZWZpbmUgIE9UR1NDX0lOVFJfQV9WQlVTX1ZBTElEICAgICAgICAgICAgICAweDAyMDAwMDAwCisjZGVmaW5lICBPVEdTQ19JTlRSX0FfU0VTU0lPTl9WQUxJRCAgICAgICAgICAgMHgwNDAwMDAwMAorI2RlZmluZSAgT1RHU0NfSU5UUl9CX1NFU1NJT05fVkFMSUQgICAgICAgICAgIDB4MDgwMDAwMDAKKyNkZWZpbmUgIE9UR1NDX0lOVFJfQl9TRVNTSU9OX0VORCAgICAgICAgICAgICAweDEwMDAwMDAwCisjZGVmaW5lICBPVEdTQ19JTlRSXzFNU19USU1FUiAgICAgICAgICAgICAgICAgMHgyMDAwMDAwMAorI2RlZmluZSAgT1RHU0NfSU5UUl9EQVRBX1BVTFNJTkcgICAgICAgICAgICAgIDB4NDAwMDAwMDAKKworLyogVVNCIE1PREUgUmVnaXN0ZXIgQml0IE1hc2tzICovCisjZGVmaW5lICBVU0JfTU9ERV9DVFJMX01PREVfSURMRSAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSAgVVNCX01PREVfQ1RSTF9NT0RFX0RFVklDRSAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgIFVTQl9NT0RFX0NUUkxfTU9ERV9IT1NUICAgICAgICAgICAgICAweDAwMDAwMDAzCisjZGVmaW5lICBVU0JfTU9ERV9DVFJMX01PREVfUlNWICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSAgVVNCX01PREVfU0VUVVBfTE9DS19PRkYgICAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgIFVTQl9NT0RFX1NUUkVBTV9ESVNBQkxFICAgICAgICAgICAgICAweDAwMDAwMDEwCisvKiBFbmRwb2ludCBGbHVzaCBSZWdpc3RlciAqLworI2RlZmluZSBFUEZMVVNIX1RYX09GRlNFVAkJICAgICAgMHgwMDAxMDAwMAorI2RlZmluZSBFUEZMVVNIX1JYX09GRlNFVAkJICAgICAgMHgwMDAwMDAwMAorCisvKiBFbmRwb2ludCBTZXR1cCBTdGF0dXMgYml0IG1hc2tzICovCisjZGVmaW5lICBFUF9TRVRVUF9TVEFUVVNfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDAwMDAzRgorI2RlZmluZSAgRVBfU0VUVVBfU1RBVFVTX0VQMAkJICAgICAgMHgwMDAwMDAwMQorCisvKiBFTkRQT0lOVENUUkx4ICBSZWdpc3RlciBCaXQgTWFza3MgKi8KKyNkZWZpbmUgIEVQQ1RSTF9UWF9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAweDAwODAwMDAwCisjZGVmaW5lICBFUENUUkxfVFhfREFUQV9UT0dHTEVfUlNUICAgICAgICAgICAgMHgwMDQwMDAwMAkvKiBOb3QgRVAwICovCisjZGVmaW5lICBFUENUUkxfVFhfREFUQV9UT0dHTEVfSU5IICAgICAgICAgICAgMHgwMDIwMDAwMAkvKiBOb3QgRVAwICovCisjZGVmaW5lICBFUENUUkxfVFhfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgMHgwMDBDMDAwMAorI2RlZmluZSAgRVBDVFJMX1RYX0RBVEFfU09VUkNFICAgICAgICAgICAgICAgIDB4MDAwMjAwMDAJLyogTm90IEVQMCAqLworI2RlZmluZSAgRVBDVFJMX1RYX0VQX1NUQUxMICAgICAgICAgICAgICAgICAgIDB4MDAwMTAwMDAKKyNkZWZpbmUgIEVQQ1RSTF9SWF9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDgwCisjZGVmaW5lICBFUENUUkxfUlhfREFUQV9UT0dHTEVfUlNUICAgICAgICAgICAgMHgwMDAwMDA0MAkvKiBOb3QgRVAwICovCisjZGVmaW5lICBFUENUUkxfUlhfREFUQV9UT0dHTEVfSU5IICAgICAgICAgICAgMHgwMDAwMDAyMAkvKiBOb3QgRVAwICovCisjZGVmaW5lICBFUENUUkxfUlhfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwQworI2RlZmluZSAgRVBDVFJMX1JYX0RBVEFfU0lOSyAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIJLyogTm90IEVQMCAqLworI2RlZmluZSAgRVBDVFJMX1JYX0VQX1NUQUxMICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKworLyogYml0IDE5LTE4IGFuZCAzLTIgYXJlIGVuZHBvaW50IHR5cGUgKi8KKyNkZWZpbmUgIEVQQ1RSTF9FUF9UWVBFX0NPTlRST0wgICAgICAgICAgICAgICAwCisjZGVmaW5lICBFUENUUkxfRVBfVFlQRV9JU08gICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSAgRVBDVFJMX0VQX1RZUEVfQlVMSyAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgIEVQQ1RSTF9FUF9UWVBFX0lOVEVSUlVQVCAgICAgICAgICAgICAzCisjZGVmaW5lICBFUENUUkxfVFhfRVBfVFlQRV9TSElGVCAgICAgICAgICAgICAgMTgKKyNkZWZpbmUgIEVQQ1RSTF9SWF9FUF9UWVBFX1NISUZUICAgICAgICAgICAgICAyCisKKy8qIFNOT09QbiBSZWdpc3RlciBCaXQgTWFza3MgKi8KKyNkZWZpbmUgIFNOT09QX0FERFJFU1NfTUFTSyAgICAgICAgICAgICAgICAgICAweEZGRkZGMDAwCisjZGVmaW5lICBTTk9PUF9TSVpFX1pFUk8gICAgICAgICAgICAgICAgICAgICAgMHgwMAkvKiBzbm9vcGluZyBkaXNhYmxlICovCisjZGVmaW5lICBTTk9PUF9TSVpFXzRLQiAgICAgICAgICAgICAgICAgICAgICAgMHgwQgkvKiA0S0Igc25vb3Agc2l6ZSAqLworI2RlZmluZSAgU05PT1BfU0laRV84S0IgICAgICAgICAgICAgICAgICAgICAgIDB4MEMKKyNkZWZpbmUgIFNOT09QX1NJWkVfMTZLQiAgICAgICAgICAgICAgICAgICAgICAweDBECisjZGVmaW5lICBTTk9PUF9TSVpFXzMyS0IgICAgICAgICAgICAgICAgICAgICAgMHgwRQorI2RlZmluZSAgU05PT1BfU0laRV82NEtCICAgICAgICAgICAgICAgICAgICAgIDB4MEYKKyNkZWZpbmUgIFNOT09QX1NJWkVfMTI4S0IgICAgICAgICAgICAgICAgICAgICAweDEwCisjZGVmaW5lICBTTk9PUF9TSVpFXzI1NktCICAgICAgICAgICAgICAgICAgICAgMHgxMQorI2RlZmluZSAgU05PT1BfU0laRV81MTJLQiAgICAgICAgICAgICAgICAgICAgIDB4MTIKKyNkZWZpbmUgIFNOT09QX1NJWkVfMU1CICAgICAgICAgICAgICAgICAgICAgICAweDEzCisjZGVmaW5lICBTTk9PUF9TSVpFXzJNQiAgICAgICAgICAgICAgICAgICAgICAgMHgxNAorI2RlZmluZSAgU05PT1BfU0laRV80TUIgICAgICAgICAgICAgICAgICAgICAgIDB4MTUKKyNkZWZpbmUgIFNOT09QX1NJWkVfOE1CICAgICAgICAgICAgICAgICAgICAgICAweDE2CisjZGVmaW5lICBTTk9PUF9TSVpFXzE2TUIgICAgICAgICAgICAgICAgICAgICAgMHgxNworI2RlZmluZSAgU05PT1BfU0laRV8zMk1CICAgICAgICAgICAgICAgICAgICAgIDB4MTgKKyNkZWZpbmUgIFNOT09QX1NJWkVfNjRNQiAgICAgICAgICAgICAgICAgICAgICAweDE5CisjZGVmaW5lICBTTk9PUF9TSVpFXzEyOE1CICAgICAgICAgICAgICAgICAgICAgMHgxQQorI2RlZmluZSAgU05PT1BfU0laRV8yNTZNQiAgICAgICAgICAgICAgICAgICAgIDB4MUIKKyNkZWZpbmUgIFNOT09QX1NJWkVfNTEyTUIgICAgICAgICAgICAgICAgICAgICAweDFDCisjZGVmaW5lICBTTk9PUF9TSVpFXzFHQiAgICAgICAgICAgICAgICAgICAgICAgMHgxRAorI2RlZmluZSAgU05PT1BfU0laRV8yR0IgICAgICAgICAgICAgICAgICAgICAgIDB4MUUJLyogMkdCIHNub29wIHNpemUgKi8KKworLyogcHJpX2N0cmwgUmVnaXN0ZXIgQml0IE1hc2tzICovCisjZGVmaW5lICBQUklfQ1RSTF9QUklfTFZMMSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwQworI2RlZmluZSAgUFJJX0NUUkxfUFJJX0xWTDAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDMKKworLyogc2lfY3RybCBSZWdpc3RlciBCaXQgTWFza3MgKi8KKyNkZWZpbmUgIFNJX0NUUkxfRVJSX0RJU0FCTEUgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lICBTSV9DVFJMX0lEUkNfRElTQUJMRSAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSAgU0lfQ1RSTF9SRF9TQUZFX0VOICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgIFNJX0NUUkxfUkRfUFJFRkVUQ0hfRElTQUJMRSAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lICBTSV9DVFJMX1JEX1BSRUZFRkVUQ0hfVkFMICAgICAgICAgICAgMHgwMDAwMDAwMQorCisvKiBjb250cm9sIFJlZ2lzdGVyIEJpdCBNYXNrcyAqLworI2RlZmluZSAgVVNCX0NUUkxfSU9FTkIgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgIFVTQl9DVFJMX1VMUElfSU5UMEVOICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisKKy8qIEVuZHBvaW50IFF1ZXVlIEhlYWQgZGF0YSBzdHJ1Y3QKKyAqIFJlbTogYWxsIHRoZSB2YXJpYWJsZXMgb2YgcWggYXJlIExpdHRsZUVuZGlhbiBNb2RlCisgKiBhbmQgTkVYVF9QT0lOVEVSX01BU0sgc2hvdWxkIG9wZXJhdGUgb24gYSBMaXR0bGVFbmRpYW4sIFBoeSBBZGRyCisgKi8KK3N0cnVjdCBlcF9xdWV1ZV9oZWFkIHsKKwl1MzIgbWF4X3BrdF9sZW5ndGg7CS8qIE11bHQoMzEtMzApICwgWmx0KDI5KSAsIE1heCBQa3QgbGVuCisJCQkJICAgYW5kIElPUygxNSkgKi8KKwl1MzIgY3Vycl9kdGRfcHRyOwkvKiBDdXJyZW50IGRURCBQb2ludGVyKDMxLTUpICovCisJdTMyIG5leHRfZHRkX3B0cjsJLyogTmV4dCBkVEQgUG9pbnRlcigzMS01KSwgVCgwKSAqLworCXUzMiBzaXplX2lvY19pbnRfc3RzOwkvKiBUb3RhbCBieXRlcyAoMzAtMTYpLCBJT0MgKDE1KSwKKwkJCQkgICBNdWx0TygxMS0xMCksIFNUUyAoNy0wKSAgKi8KKwl1MzIgYnVmZl9wdHIwOwkJLyogQnVmZmVyIHBvaW50ZXIgUGFnZSAwICgzMS0xMikgKi8KKwl1MzIgYnVmZl9wdHIxOwkJLyogQnVmZmVyIHBvaW50ZXIgUGFnZSAxICgzMS0xMikgKi8KKwl1MzIgYnVmZl9wdHIyOwkJLyogQnVmZmVyIHBvaW50ZXIgUGFnZSAyICgzMS0xMikgKi8KKwl1MzIgYnVmZl9wdHIzOwkJLyogQnVmZmVyIHBvaW50ZXIgUGFnZSAzICgzMS0xMikgKi8KKwl1MzIgYnVmZl9wdHI0OwkJLyogQnVmZmVyIHBvaW50ZXIgUGFnZSA0ICgzMS0xMikgKi8KKwl1MzIgcmVzMTsKKwl1OCBzZXR1cF9idWZmZXJbOF07CS8qIFNldHVwIGRhdGEgOCBieXRlcyAqLworCXUzMiByZXMyWzRdOworfTsKKworLyogRW5kcG9pbnQgUXVldWUgSGVhZCBCaXQgTWFza3MgKi8KKyNkZWZpbmUgIEVQX1FVRVVFX0hFQURfTVVMVF9QT1MgICAgICAgICAgICAgICAzMAorI2RlZmluZSAgRVBfUVVFVUVfSEVBRF9aTFRfU0VMICAgICAgICAgICAgICAgIDB4MjAwMDAwMDAKKyNkZWZpbmUgIEVQX1FVRVVFX0hFQURfTUFYX1BLVF9MRU5fUE9TICAgICAgICAxNgorI2RlZmluZSAgRVBfUVVFVUVfSEVBRF9NQVhfUEtUX0xFTihlcF9pbmZvKSAgICgoKGVwX2luZm8pPj4xNikmMHgwN2ZmKQorI2RlZmluZSAgRVBfUVVFVUVfSEVBRF9JT1MgICAgICAgICAgICAgICAgICAgIDB4MDAwMDgwMDAKKyNkZWZpbmUgIEVQX1FVRVVFX0hFQURfTkVYVF9URVJNSU5BVEUgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lICBFUF9RVUVVRV9IRUFEX0lPQyAgICAgICAgICAgICAgICAgICAgMHgwMDAwODAwMAorI2RlZmluZSAgRVBfUVVFVUVfSEVBRF9NVUxUTyAgICAgICAgICAgICAgICAgIDB4MDAwMDBDMDAKKyNkZWZpbmUgIEVQX1FVRVVFX0hFQURfU1RBVFVTX0hBTFQJICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSAgRVBfUVVFVUVfSEVBRF9TVEFUVVNfQUNUSVZFICAgICAgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgIEVQX1FVRVVFX0NVUlJFTlRfT0ZGU0VUX01BU0sgICAgICAgICAweDAwMDAwRkZGCisjZGVmaW5lICBFUF9RVUVVRV9IRUFEX05FWFRfUE9JTlRFUl9NQVNLICAgICAgMHhGRkZGRkZFMAorI2RlZmluZSAgRVBfUVVFVUVfRlJJTkRFWF9NQVNLICAgICAgICAgICAgICAgIDB4MDAwMDA3RkYKKyNkZWZpbmUgIEVQX01BWF9MRU5HVEhfVFJBTlNGRVIgICAgICAgICAgICAgICAweDQwMDAKKworLyogRW5kcG9pbnQgVHJhbnNmZXIgRGVzY3JpcHRvciBkYXRhIHN0cnVjdCAqLworLyogUmVtOiBhbGwgdGhlIHZhcmlhYmxlcyBvZiB0ZCBhcmUgTGl0dGxlRW5kaWFuIE1vZGUgKi8KK3N0cnVjdCBlcF90ZF9zdHJ1Y3QgeworCXUzMiBuZXh0X3RkX3B0cjsJLyogTmV4dCBURCBwb2ludGVyKDMxLTUpLCBUKDApIHNldAorCQkJCSAgIGluZGljYXRlIGludmFsaWQgKi8KKwl1MzIgc2l6ZV9pb2Nfc3RzOwkvKiBUb3RhbCBieXRlcyAoMzAtMTYpLCBJT0MgKDE1KSwKKwkJCQkgICBNdWx0TygxMS0xMCksIFNUUyAoNy0wKSAgKi8KKwl1MzIgYnVmZl9wdHIwOwkJLyogQnVmZmVyIHBvaW50ZXIgUGFnZSAwICovCisJdTMyIGJ1ZmZfcHRyMTsJCS8qIEJ1ZmZlciBwb2ludGVyIFBhZ2UgMSAqLworCXUzMiBidWZmX3B0cjI7CQkvKiBCdWZmZXIgcG9pbnRlciBQYWdlIDIgKi8KKwl1MzIgYnVmZl9wdHIzOwkJLyogQnVmZmVyIHBvaW50ZXIgUGFnZSAzICovCisJdTMyIGJ1ZmZfcHRyNDsJCS8qIEJ1ZmZlciBwb2ludGVyIFBhZ2UgNCAqLworCXUzMiByZXM7CisJLyogMzIgYnl0ZXMgKi8KKwlkbWFfYWRkcl90IHRkX2RtYTsJLyogZG1hIGFkZHJlc3MgZm9yIHRoaXMgdGQgKi8KKwkvKiB2aXJ0dWFsIGFkZHJlc3Mgb2YgbmV4dCB0ZCBzcGVjaWZpZWQgaW4gbmV4dF90ZF9wdHIgKi8KKwlzdHJ1Y3QgZXBfdGRfc3RydWN0ICpuZXh0X3RkX3ZpcnQ7Cit9OworCisvKiBFbmRwb2ludCBUcmFuc2ZlciBEZXNjcmlwdG9yIGJpdCBNYXNrcyAqLworI2RlZmluZSAgRFREX05FWFRfVEVSTUlOQVRFICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgIERURF9JT0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA4MDAwCisjZGVmaW5lICBEVERfU1RBVFVTX0FDVElWRSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSAgRFREX1NUQVRVU19IQUxURUQgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgIERURF9TVEFUVVNfREFUQV9CVUZGX0VSUiAgICAgICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lICBEVERfU1RBVFVTX1RSQU5TQUNUSU9OX0VSUiAgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSAgRFREX1JFU0VSVkVEX0ZJRUxEUyAgICAgICAgICAgICAgICAgIDB4ODAwMDczMDAKKyNkZWZpbmUgIERURF9BRERSX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkZGRkUwCisjZGVmaW5lICBEVERfUEFDS0VUX1NJWkUgICAgICAgICAgICAgICAgICAgICAgMHg3RkZGMDAwMAorI2RlZmluZSAgRFREX0xFTkdUSF9CSVRfUE9TICAgICAgICAgICAgICAgICAgIDE2CisjZGVmaW5lICBEVERfRVJST1JfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgKERURF9TVEFUVVNfSEFMVEVEIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEVERfU1RBVFVTX0RBVEFfQlVGRl9FUlIgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERURF9TVEFUVVNfVFJBTlNBQ1RJT05fRVJSKQorLyogQWxpZ25tZW50IHJlcXVpcmVtZW50czsgbXVzdCBiZSBhIHBvd2VyIG9mIHR3byAqLworI2RlZmluZSBEVERfQUxJR05NRU5UCQkJCTB4MjAKKyNkZWZpbmUgUUhfQUxJR05NRU5UCQkJCTIwNDgKKworLyogQ29udHJvbGxlciBkbWEgYm91bmRhcnkgKi8KKyNkZWZpbmUgVURDX0RNQV9CT1VOREFSWQkJCTB4MTAwMAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiAjIyMjIyBlbnVtIGRhdGEKKyovCit0eXBlZGVmIGVudW0geworCWVfVUxQSSwKKwllX1VUTUlfOEJJVCwKKwllX1VUTUlfMTZCSVQsCisJZV9TRVJJQUwKK30gZV9QaHlJbnRlcmZhY2U7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qICMjIyBkcml2ZXIgcHJpdmF0ZSBkYXRhCisgKi8KK3N0cnVjdCBmc2xfcmVxIHsKKwlzdHJ1Y3QgdXNiX3JlcXVlc3QgcmVxOworCXN0cnVjdCBsaXN0X2hlYWQgcXVldWU7CisJLyogZXBfcXVldWUoKSBmdW5jIHdpbGwgYWRkCisJICAgYSByZXF1ZXN0LT5xdWV1ZSBpbnRvIGEgdWRjX2VwLT5xdWV1ZSAnZCB0YWlsICovCisJc3RydWN0IGZzbF9lcCAqZXA7CisJdW5zaWduZWQgbWFwcGVkOjE7CisKKwlzdHJ1Y3QgZXBfdGRfc3RydWN0ICpoZWFkLCAqdGFpbDsJLyogRm9yIGRURCBMaXN0CisJCQkJCQkgICBjcHUgZW5kaWFuIFZpcnR1YWwgYWRkciAqLworCXVuc2lnbmVkIGludCBkdGRfY291bnQ7Cit9OworCisjZGVmaW5lIFJFUV9VTkNPTVBMRVRFCQkJMQorCitzdHJ1Y3QgZnNsX2VwIHsKKwlzdHJ1Y3QgdXNiX2VwIGVwOworCXN0cnVjdCBsaXN0X2hlYWQgcXVldWU7CisJc3RydWN0IGZzbF91ZGMgKnVkYzsKKwlzdHJ1Y3QgZXBfcXVldWVfaGVhZCAqcWg7CisJY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICpkZXNjOworCXN0cnVjdCB1c2JfZ2FkZ2V0ICpnYWRnZXQ7CisKKwljaGFyIG5hbWVbMTRdOworCXVuc2lnbmVkIHN0b3BwZWQ6MTsKK307CisKKyNkZWZpbmUgRVBfRElSX0lOCTEKKyNkZWZpbmUgRVBfRElSX09VVAkwCisKK3N0cnVjdCBmc2xfdWRjIHsKKworCXN0cnVjdCB1c2JfZ2FkZ2V0IGdhZGdldDsKKwlzdHJ1Y3QgdXNiX2dhZGdldF9kcml2ZXIgKmRyaXZlcjsKKwlzdHJ1Y3QgZnNsX2VwICplcHM7CisJdW5zaWduZWQgaW50IG1heF9lcDsKKwl1bnNpZ25lZCBpbnQgaXJxOworCisJc3RydWN0IHVzYl9jdHJscmVxdWVzdCBsb2NhbF9zZXR1cF9idWZmOworCXNwaW5sb2NrX3QgbG9jazsKKwlzdHJ1Y3Qgb3RnX3RyYW5zY2VpdmVyICp0cmFuc2NlaXZlcjsKKwl1bnNpZ25lZCBzb2Z0Y29ubmVjdDoxOworCXVuc2lnbmVkIHZidXNfYWN0aXZlOjE7CisJdW5zaWduZWQgc3RvcHBlZDoxOworCXVuc2lnbmVkIHJlbW90ZV93YWtldXA6MTsKKworCXN0cnVjdCBlcF9xdWV1ZV9oZWFkICplcF9xaDsJLyogRW5kcG9pbnRzIFF1ZXVlLUhlYWQgKi8KKwlzdHJ1Y3QgZnNsX3JlcSAqc3RhdHVzX3JlcTsJLyogZXAwIHN0YXR1cyByZXF1ZXN0ICovCisJc3RydWN0IGRtYV9wb29sICp0ZF9wb29sOwkvKiBkbWEgcG9vbCBmb3IgRFREICovCisJZW51bSBmc2xfdXNiMl9waHlfbW9kZXMgcGh5X21vZGU7CisKKwlzaXplX3QgZXBfcWhfc2l6ZTsJCS8qIHNpemUgYWZ0ZXIgYWxpZ25tZW50IGFkanVzdG1lbnQqLworCWRtYV9hZGRyX3QgZXBfcWhfZG1hOwkJLyogZG1hIGFkZHJlc3Mgb2YgUUggKi8KKworCXUzMiBtYXhfcGlwZXM7CQkvKiBEZXZpY2UgbWF4IHBpcGVzICovCisJdTMyIG1heF91c2VfZW5kcHRzOwkvKiBNYXggZW5kcG9pbnRlcyB0byBiZSB1c2VkICovCisJdTMyIGJ1c19yZXNldDsJCS8qIERldmljZSBpcyBidXMgcmVzZXRpbmcgKi8KKwl1MzIgcmVzdW1lX3N0YXRlOwkvKiBVU0Igc3RhdGUgdG8gcmVzdW1lICovCisJdTMyIHVzYl9zdGF0ZTsJCS8qIFVTQiBjdXJyZW50IHN0YXRlICovCisJdTMyIHVzYl9uZXh0X3N0YXRlOwkvKiBVU0IgbmV4dCBzdGF0ZSAqLworCXUzMiBlcDBfc3RhdGU7CQkvKiBFbmRwb2ludCB6ZXJvIHN0YXRlICovCisJdTMyIGVwMF9kaXI7CQkvKiBFbmRwb2ludCB6ZXJvIGRpcmVjdGlvbjogY2FuIGJlCisJCQkJICAgVVNCX0RJUl9JTiBvciBVU0JfRElSX09VVCAqLworCXUzMiB1c2Jfc29mX2NvdW50OwkvKiBTT0YgY291bnQgKi8KKwl1MzIgZXJyb3JzOwkJLyogVVNCIEVSUk9ScyBjb3VudCAqLworCXU4IGRldmljZV9hZGRyZXNzOwkvKiBEZXZpY2UgVVNCIGFkZHJlc3MgKi8KKworCXN0cnVjdCBjb21wbGV0aW9uICpkb25lOwkvKiB0byBtYWtlIHN1cmUgcmVsZWFzZSgpIGlzIGRvbmUgKi8KK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZmRlZiBERUJVRworI2RlZmluZSBEQkcoZm10LCBhcmdzLi4uKSAJcHJpbnRrKEtFUk5fREVCVUcgIlslc10gICIgZm10ICJcbiIsIFwKKwkJCQlfX0ZVTkNUSU9OX18sICMjIGFyZ3MpCisjZWxzZQorI2RlZmluZSBEQkcoZm10LCBhcmdzLi4uKQlkb3t9d2hpbGUoMCkKKyNlbmRpZgorCisjaWYgMAorc3RhdGljIHZvaWQgZHVtcF9tc2coY29uc3QgY2hhciAqbGFiZWwsIGNvbnN0IHU4ICogYnVmLCB1bnNpZ25lZCBpbnQgbGVuZ3RoKQoreworCXVuc2lnbmVkIGludCBzdGFydCwgbnVtLCBpOworCWNoYXIgbGluZVs1Ml0sICpwOworCisJaWYgKGxlbmd0aCA+PSA1MTIpCisJCXJldHVybjsKKwlEQkcoIiVzLCBsZW5ndGggJXU6XG4iLCBsYWJlbCwgbGVuZ3RoKTsKKwlzdGFydCA9IDA7CisJd2hpbGUgKGxlbmd0aCA+IDApIHsKKwkJbnVtID0gbWluKGxlbmd0aCwgMTZ1KTsKKwkJcCA9IGxpbmU7CisJCWZvciAoaSA9IDA7IGkgPCBudW07ICsraSkgeworCQkJaWYgKGkgPT0gOCkKKwkJCQkqcCsrID0gJyAnOworCQkJc3ByaW50ZihwLCAiICUwMngiLCBidWZbaV0pOworCQkJcCArPSAzOworCQl9CisJCSpwID0gMDsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiU2eDogJXNcbiIsIHN0YXJ0LCBsaW5lKTsKKwkJYnVmICs9IG51bTsKKwkJc3RhcnQgKz0gbnVtOworCQlsZW5ndGggLT0gbnVtOworCX0KK30KKyNlbmRpZgorCisjaWZkZWYgVkVSQk9TRQorI2RlZmluZSBWREJHCQlEQkcKKyNlbHNlCisjZGVmaW5lIFZEQkcoc3R1ZmYuLi4pCWRve313aGlsZSgwKQorI2VuZGlmCisKKyNkZWZpbmUgRVJSKHN0dWZmLi4uKQkJcHJpbnRrKEtFUk5fRVJSICJ1ZGM6ICIgc3R1ZmYpCisjZGVmaW5lIFdBUk4oc3R1ZmYuLi4pCQlwcmludGsoS0VSTl9XQVJOSU5HICJ1ZGM6ICIgc3R1ZmYpCisjZGVmaW5lIElORk8oc3R1ZmYuLi4pCQlwcmludGsoS0VSTl9JTkZPICJ1ZGM6ICIgc3R1ZmYpCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qICMjIyBBZGQgYm9hcmQgc3BlY2lmaWMgZGVmaW5lcyBoZXJlCisgKi8KKworLyoKKyAqICMjIyBwaXBlIGRpcmVjdGlvbiBtYWNybyBmcm9tIGRldmljZSB2aWV3CisgKi8KKyNkZWZpbmUgVVNCX1JFQ1YJMAkvKiBPVVQgRVAgKi8KKyNkZWZpbmUgVVNCX1NFTkQJMQkvKiBJTiBFUCAqLworCisvKgorICogIyMjIGludGVybmFsIHVzZWQgaGVscCByb3V0aW5lcy4KKyAqLworI2RlZmluZSBlcF9pbmRleChFUCkJCSgoRVApLT5kZXNjLT5iRW5kcG9pbnRBZGRyZXNzJjB4RikKKyNkZWZpbmUgZXBfbWF4cGFja2V0KEVQKQkoKEVQKS0+ZXAubWF4cGFja2V0KQorI2RlZmluZSBlcF9pc19pbihFUCkJKCAoZXBfaW5kZXgoRVApID09IDApID8gKEVQLT51ZGMtPmVwMF9kaXIgPT0gXAorCQkJVVNCX0RJUl9JTiApOigoRVApLT5kZXNjLT5iRW5kcG9pbnRBZGRyZXNzIFwKKwkJCSYgVVNCX0RJUl9JTik9PVVTQl9ESVJfSU4pCisjZGVmaW5lIGdldF9lcF9ieV9waXBlKHVkYywgcGlwZSkJKChwaXBlID09IDEpPyAmdWRjLT5lcHNbMF06IFwKKwkJCQkJJnVkYy0+ZXBzW3BpcGVdKQorI2RlZmluZSBnZXRfcGlwZV9ieV93aW5kZXgod2luZGV4KQkoKHdpbmRleCAmIFVTQl9FTkRQT0lOVF9OVU1CRVJfTUFTSykgXAorCQkJCQkqIDIgKyAoKHdpbmRleCAmIFVTQl9ESVJfSU4pID8gMSA6IDApKQorI2RlZmluZSBnZXRfcGlwZV9ieV9lcChFUCkJKGVwX2luZGV4KEVQKSAqIDIgKyBlcF9pc19pbihFUCkpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2dhZGdldF9jaGlwcy5oIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2dhZGdldF9jaGlwcy5oCmluZGV4IDJlM2Q2NjIuLmQwNDFiOTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9nYWRnZXRfY2hpcHMuaAorKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZ2FkZ2V0X2NoaXBzLmgKQEAgLTk5LDYgKzk5LDEyIEBACiAjZGVmaW5lIGdhZGdldF9pc19pbXgoZykJMAogI2VuZGlmCiAKKyNpZmRlZiBDT05GSUdfVVNCX0dBREdFVF9GU0xfVVNCMgorI2RlZmluZSBnYWRnZXRfaXNfZnNsX3VzYjIoZykJIXN0cmNtcCgiZnNsLXVzYjItdWRjIiwgKGcpLT5uYW1lKQorI2Vsc2UKKyNkZWZpbmUgZ2FkZ2V0X2lzX2ZzbF91c2IyKGcpCTAKKyNlbmRpZgorCiAvKiBNZW50b3IgaGlnaCBzcGVlZCBmdW5jdGlvbiBjb250cm9sbGVyICovCiAjaWZkZWYgQ09ORklHX1VTQl9HQURHRVRfTVVTQkhTRkMKICNkZWZpbmUgZ2FkZ2V0X2lzX211c2Joc2ZjKGcpCSFzdHJjbXAoIm11c2Joc2ZjX3VkYyIsIChnKS0+bmFtZSkKQEAgLTE3Nyw1ICsxODMsNyBAQAogCQlyZXR1cm4gMHgxNzsKIAllbHNlIGlmIChnYWRnZXRfaXNfaHVzYjJkZXYoZ2FkZ2V0KSkKIAkJcmV0dXJuIDB4MTg7CisJZWxzZSBpZiAoZ2FkZ2V0X2lzX2ZzbF91c2IyKGdhZGdldCkpCisJCXJldHVybiAweDE5OwogCXJldHVybiAtRU5PRU5UOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3B4YTJ4eF91ZGMuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9weGEyeHhfdWRjLmMKaW5kZXggZjAxODkwZC4uMmMwNDNhMSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L3B4YTJ4eF91ZGMuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvcHhhMnh4X3VkYy5jCkBAIC03MSw3ICs3MSw3IEBACiAgKiBieSB0aGUgaG9zdCB0byBpbnRlcmFjdCB3aXRoIHRoaXMgZGV2aWNlLCBhbmQgYWxsb2NhdGVzIGVuZHBvaW50cyB0bwogICogdGhlIGRpZmZlcmVudCBwcm90b2NvbCBpbnRlcmZhY2VzLiAgVGhlIGNvbnRyb2xsZXIgZHJpdmVyIHZpcnR1YWxpemVzCiAgKiB1c2IgaGFyZHdhcmUgc28gdGhhdCB0aGUgZ2FkZ2V0IGRyaXZlcnMgd2lsbCBiZSBtb3JlIHBvcnRhYmxlLgotICogCisgKgogICogVGhpcyBVREMgaGFyZHdhcmUgd2FudHMgdG8gaW1wbGVtZW50IGEgYml0IHRvbyBtdWNoIFVTQiBwcm90b2NvbCwgc28KICAqIGl0IGNvbnN0cmFpbnMgdGhlIHNvcnRzIG9mIFVTQiBjb25maWd1cmF0aW9uIGNoYW5nZSBldmVudHMgdGhhdCB3b3JrLgogICogVGhlIGVycmF0YSBmb3IgdGhlc2UgY2hpcHMgYXJlIG1pc2xlYWRpbmc7IHNvbWUgImZpeGVkIiBidWdzIGZyb20KQEAgLTE0MSw3ICsxNDEsNyBAQAogI2VuZGlmCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogCWVuZHBvaW50IHJlbGF0ZWQgcGFydHMgb2YgdGhlIGFwaSB0byB0aGUgdXNiIGNvbnRyb2xsZXIgaGFyZHdhcmUsCisgKgllbmRwb2ludCByZWxhdGVkIHBhcnRzIG9mIHRoZSBhcGkgdG8gdGhlIHVzYiBjb250cm9sbGVyIGhhcmR3YXJlLAogICoJdXNlZCBieSBnYWRnZXQgZHJpdmVyOyBhbmQgdGhlIGlubmVyIHRhbGtlci10by1oYXJkd2FyZSBjb3JlLgogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKi8KQEAgLTI5Myw3ICsyOTMsNyBAQAogCiAjaWZkZWYJVVNFX0RNQQogCS8qIGZvciAoc29tZSkgYnVsayBhbmQgSVNPIGVuZHBvaW50cywgdHJ5IHRvIGdldCBhIERNQSBjaGFubmVsIGFuZAotCSAqIGJpbmQgaXQgdG8gdGhlIGVuZHBvaW50LiAgb3RoZXJ3aXNlIHVzZSBQSU8uIAorCSAqIGJpbmQgaXQgdG8gdGhlIGVuZHBvaW50LiAgb3RoZXJ3aXNlIHVzZSBQSU8uCiAJICovCiAJc3dpdGNoIChlcC0+Ym1BdHRyaWJ1dGVzKSB7CiAJY2FzZSBVU0JfRU5EUE9JTlRfWEZFUl9JU09DOgpAQCAtMzA0LDcgKzMwNCw3IEBACiAJCWlmICghdXNlX2RtYSB8fCAhZXAtPnJlZ19kcmNtcikKIAkJCWJyZWFrOwogCQllcC0+ZG1hID0gcHhhX3JlcXVlc3RfZG1hICgoY2hhciAqKV9lcC0+bmFtZSwKLSAJCQkJKGxlMTZfdG9fY3B1IChkZXNjLT53TWF4UGFja2V0U2l6ZSkgPiA2NCkKKwkJCQkobGUxNl90b19jcHUgKGRlc2MtPndNYXhQYWNrZXRTaXplKSA+IDY0KQogCQkJCQk/IERNQV9QUklPX01FRElVTSAvKiBzb21lIGlzbyAqLwogCQkJCQk6IERNQV9QUklPX0xPVywKIAkJCQlkbWFfbm9kZXNjX2hhbmRsZXIsIGVwKTsKQEAgLTM2MSw3ICszNjEsNyBAQAogICovCiAKIC8qCi0gKiAJcHhhMnh4X2VwX2FsbG9jX3JlcXVlc3QgLSBhbGxvY2F0ZSBhIHJlcXVlc3QgZGF0YSBzdHJ1Y3R1cmUKKyAqCXB4YTJ4eF9lcF9hbGxvY19yZXF1ZXN0IC0gYWxsb2NhdGUgYSByZXF1ZXN0IGRhdGEgc3RydWN0dXJlCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgdXNiX3JlcXVlc3QgKgogcHhhMnh4X2VwX2FsbG9jX3JlcXVlc3QgKHN0cnVjdCB1c2JfZXAgKl9lcCwgZ2ZwX3QgZ2ZwX2ZsYWdzKQpAQCAtMzc4LDcgKzM3OCw3IEBACiAKIAogLyoKLSAqIAlweGEyeHhfZXBfZnJlZV9yZXF1ZXN0IC0gZGVhbGxvY2F0ZSBhIHJlcXVlc3QgZGF0YSBzdHJ1Y3R1cmUKKyAqCXB4YTJ4eF9lcF9mcmVlX3JlcXVlc3QgLSBkZWFsbG9jYXRlIGEgcmVxdWVzdCBkYXRhIHN0cnVjdHVyZQogICovCiBzdGF0aWMgdm9pZAogcHhhMnh4X2VwX2ZyZWVfcmVxdWVzdCAoc3RydWN0IHVzYl9lcCAqX2VwLCBzdHJ1Y3QgdXNiX3JlcXVlc3QgKl9yZXEpCkBAIC0xMDMxLDcgKzEwMzEsNyBAQAogCiAKIC8qCi0gKiAJbnVrZSAtIGRlcXVldWUgQUxMIHJlcXVlc3RzCisgKgludWtlIC0gZGVxdWV1ZSBBTEwgcmVxdWVzdHMKICAqLwogc3RhdGljIHZvaWQgbnVrZShzdHJ1Y3QgcHhhMnh4X2VwICplcCwgaW50IHN0YXR1cykKIHsKQEAgLTExMzYsMTYgKzExMzYsMTYgQEAKIAkJZXAtPmRldi0+cmVxX3BlbmRpbmcgPSAwOwogCQllcC0+ZGV2LT5lcDBzdGF0ZSA9IEVQMF9TVEFMTDsKIAotIAkvKiBhbmQgYnVsay9pbnRyIGVuZHBvaW50cyBsaWtlIGRyb3BwaW5nIHN0YWxscyB0b28gKi8KLSAJfSBlbHNlIHsKLSAJCXVuc2lnbmVkIGk7Ci0gCQlmb3IgKGkgPSAwOyBpIDwgMTAwMDsgaSArPSAyMCkgewotIAkJCWlmICgqZXAtPnJlZ191ZGNjcyAmIFVEQ0NTX0JJX1NTVCkKLSAJCQkJYnJlYWs7Ci0gCQkJdWRlbGF5KDIwKTsKLSAJCX0KLSAgCX0KLSAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCS8qIGFuZCBidWxrL2ludHIgZW5kcG9pbnRzIGxpa2UgZHJvcHBpbmcgc3RhbGxzIHRvbyAqLworCX0gZWxzZSB7CisJCXVuc2lnbmVkIGk7CisJCWZvciAoaSA9IDA7IGkgPCAxMDAwOyBpICs9IDIwKSB7CisJCQlpZiAoKmVwLT5yZWdfdWRjY3MgJiBVRENDU19CSV9TU1QpCisJCQkJYnJlYWs7CisJCQl1ZGVsYXkoMjApOworCQl9CisJfQorCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAogCURCRyhEQkdfVkVSQk9TRSwgIiVzIGhhbHRcbiIsIF9lcC0+bmFtZSk7CiAJcmV0dXJuIDA7CkBAIC0xMjE2LDcgKzEyMTYsNyBAQAogCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogCWRldmljZS1zY29wZWQgcGFydHMgb2YgdGhlIGFwaSB0byB0aGUgdXNiIGNvbnRyb2xsZXIgaGFyZHdhcmUKKyAqCWRldmljZS1zY29wZWQgcGFydHMgb2YgdGhlIGFwaSB0byB0aGUgdXNiIGNvbnRyb2xsZXIgaGFyZHdhcmUKICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICovCiAKQEAgLTEyMzksNyArMTIzOSw3IEBACiBzdGF0aWMgdm9pZCB1ZGNfZGlzYWJsZShzdHJ1Y3QgcHhhMnh4X3VkYyAqKTsKIAogLyogV2UgZGlzYWJsZSB0aGUgVURDIC0tIGFuZCBpdHMgNDggTUh6IGNsb2NrIC0tIHdoZW5ldmVyIGl0J3Mgbm90Ci0gKiBpbiBhY3RpdmUgdXNlLiAgCisgKiBpbiBhY3RpdmUgdXNlLgogICovCiBzdGF0aWMgaW50IHB1bGx1cChzdHJ1Y3QgcHhhMnh4X3VkYyAqdWRjLCBpbnQgaXNfYWN0aXZlKQogewpAQCAtMTQ2NCwyNCArMTQ2NCwxMCBAQAogCiAjZW5kaWYJLyogQ09ORklHX1VTQl9HQURHRVRfREVCVUdfRklMRVMgKi8KIAotLyogImZ1bmN0aW9uIiBzeXNmcyBhdHRyaWJ1dGUgKi8KLXN0YXRpYyBzc2l6ZV90Ci1zaG93X2Z1bmN0aW9uIChzdHJ1Y3QgZGV2aWNlICpfZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCXN0cnVjdCBweGEyeHhfdWRjCSpkZXYgPSBkZXZfZ2V0X2RydmRhdGEgKF9kZXYpOwotCi0JaWYgKCFkZXYtPmRyaXZlcgotCQkJfHwgIWRldi0+ZHJpdmVyLT5mdW5jdGlvbgotCQkJfHwgc3RybGVuIChkZXYtPmRyaXZlci0+ZnVuY3Rpb24pID4gUEFHRV9TSVpFKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gc2NucHJpbnRmIChidWYsIFBBR0VfU0laRSwgIiVzXG4iLCBkZXYtPmRyaXZlci0+ZnVuY3Rpb24pOwotfQotc3RhdGljIERFVklDRV9BVFRSIChmdW5jdGlvbiwgU19JUlVHTywgc2hvd19mdW5jdGlvbiwgTlVMTCk7Ci0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIC8qCi0gKiAJdWRjX2Rpc2FibGUgLSBkaXNhYmxlIFVTQiBkZXZpY2UgY29udHJvbGxlcgorICoJdWRjX2Rpc2FibGUgLSBkaXNhYmxlIFVTQiBkZXZpY2UgY29udHJvbGxlcgogICovCiBzdGF0aWMgdm9pZCB1ZGNfZGlzYWJsZShzdHJ1Y3QgcHhhMnh4X3VkYyAqZGV2KQogewpAQCAtMTUwNyw3ICsxNDkzLDcgQEAKIAogCiAvKgotICogCXVkY19yZWluaXQgLSBpbml0aWFsaXplIHNvZnR3YXJlIHN0YXRlCisgKgl1ZGNfcmVpbml0IC0gaW5pdGlhbGl6ZSBzb2Z0d2FyZSBzdGF0ZQogICovCiBzdGF0aWMgdm9pZCB1ZGNfcmVpbml0KHN0cnVjdCBweGEyeHhfdWRjICpkZXYpCiB7CkBAIC0xNjM1LDE4ICsxNjIxLDIwIEBACiAJZGV2LT5nYWRnZXQuZGV2LmRyaXZlciA9ICZkcml2ZXItPmRyaXZlcjsKIAlkZXYtPnB1bGx1cCA9IDE7CiAKLQlkZXZpY2VfYWRkICgmZGV2LT5nYWRnZXQuZGV2KTsKKwlyZXR2YWwgPSBkZXZpY2VfYWRkICgmZGV2LT5nYWRnZXQuZGV2KTsKKwlpZiAocmV0dmFsKSB7CitmYWlsOgorCQlkZXYtPmRyaXZlciA9IE5VTEw7CisJCWRldi0+Z2FkZ2V0LmRldi5kcml2ZXIgPSBOVUxMOworCQlyZXR1cm4gcmV0dmFsOworCX0KIAlyZXR2YWwgPSBkcml2ZXItPmJpbmQoJmRldi0+Z2FkZ2V0KTsKIAlpZiAocmV0dmFsKSB7CiAJCURNU0coImJpbmQgdG8gZHJpdmVyICVzIC0tPiBlcnJvciAlZFxuIiwKIAkJCQlkcml2ZXItPmRyaXZlci5uYW1lLCByZXR2YWwpOwogCQlkZXZpY2VfZGVsICgmZGV2LT5nYWRnZXQuZGV2KTsKLQotCQlkZXYtPmRyaXZlciA9IE5VTEw7Ci0JCWRldi0+Z2FkZ2V0LmRldi5kcml2ZXIgPSBOVUxMOwotCQlyZXR1cm4gcmV0dmFsOworCQlnb3RvIGZhaWw7CiAJfQotCWRldmljZV9jcmVhdGVfZmlsZShkZXYtPmRldiwgJmRldl9hdHRyX2Z1bmN0aW9uKTsKIAogCS8qIC4uLiB0aGVuIGVuYWJsZSBob3N0IGRldGVjdGlvbiBhbmQgZXAwOyBhbmQgd2UncmUgcmVhZHkKIAkgKiBmb3Igc2V0X2NvbmZpZ3VyYXRpb24gYXMgd2VsbCBhcyBldmVudHVhbCBkaXNjb25uZWN0LgpAQCAtMTcwNCw3ICsxNjkyLDYgQEAKIAlkZXYtPmRyaXZlciA9IE5VTEw7CiAKIAlkZXZpY2VfZGVsICgmZGV2LT5nYWRnZXQuZGV2KTsKLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LT5kZXYsICZkZXZfYXR0cl9mdW5jdGlvbik7CiAKIAlETVNHKCJ1bnJlZ2lzdGVyZWQgZ2FkZ2V0IGRyaXZlciAnJXMnXG4iLCBkcml2ZXItPmRyaXZlci5uYW1lKTsKIAlkdW1wX3N0YXRlKGRldik7CkBAIC0yNDc0LDEyICsyNDYxLDEyIEBACiAjZGVmaW5lIElYUDQ2NV9BRAkJMHgwMDAwMDIwMAogCiAvKgotICogCXByb2JlIC0gYmluZHMgdG8gdGhlIHBsYXRmb3JtIGRldmljZQorICoJcHJvYmUgLSBiaW5kcyB0byB0aGUgcGxhdGZvcm0gZGV2aWNlCiAgKi8KIHN0YXRpYyBpbnQgX19pbml0IHB4YTJ4eF91ZGNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgcHhhMnh4X3VkYyAqZGV2ID0gJm1lbW9yeTsKLQlpbnQgcmV0dmFsLCBvdXRfZG1hID0gMSwgdmJ1c19pcnE7CisJaW50IHJldHZhbCwgb3V0X2RtYSA9IDEsIHZidXNfaXJxLCBpcnE7CiAJdTMyIGNoaXByZXY7CiAKIAkvKiBpbnNpc3Qgb24gSW50ZWwvQVJNL1hTY2FsZSAqLwpAQCAtMjUyMiw3ICsyNTA5LDExIEBACiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCXByX2RlYnVnKCIlczogSVJRICVkJXMlcyVzXG4iLCBkcml2ZXJfbmFtZSwgSVJRX1VTQiwKKwlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCWlmIChpcnEgPCAwKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXByX2RlYnVnKCIlczogSVJRICVkJXMlcyVzXG4iLCBkcml2ZXJfbmFtZSwgaXJxLAogCQlkZXYtPmhhc19jZnIgPyAiIiA6ICIgKCFjZnIpIiwKIAkJb3V0X2RtYSA/ICIiIDogIiAoYnJva2VuIGRtYS1vdXQpIiwKIAkJU0laRV9TVFIgRE1BU1RSCkBAIC0yNTcwLDExICsyNTYxLDExIEBACiAJZGV2LT52YnVzID0gaXNfdmJ1c19wcmVzZW50KCk7CiAKIAkvKiBpcnEgc2V0dXAgYWZ0ZXIgb2xkIGhhcmR3YXJlIHN0YXRlIGlzIGNsZWFuZWQgdXAgKi8KLQlyZXR2YWwgPSByZXF1ZXN0X2lycShJUlFfVVNCLCBweGEyeHhfdWRjX2lycSwKKwlyZXR2YWwgPSByZXF1ZXN0X2lycShpcnEsIHB4YTJ4eF91ZGNfaXJxLAogCQkJSVJRRl9ESVNBQkxFRCwgZHJpdmVyX25hbWUsIGRldik7CiAJaWYgKHJldHZhbCAhPSAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IGNhbid0IGdldCBpcnEgJWksIGVyciAlZFxuIiwKLQkJCWRyaXZlcl9uYW1lLCBJUlFfVVNCLCByZXR2YWwpOworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjYW4ndCBnZXQgaXJxICVkLCBlcnIgJWRcbiIsCisJCQlkcml2ZXJfbmFtZSwgaXJxLCByZXR2YWwpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAlkZXYtPmdvdF9pcnEgPSAxOwpAQCAtMjU4OSw3ICsyNTgwLDcgQEAKIAkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNhbid0IGdldCBpcnEgJWksIGVyciAlZFxuIiwKIAkJCQlkcml2ZXJfbmFtZSwgTFVCQk9DS19VU0JfRElTQ19JUlEsIHJldHZhbCk7CiBsdWJib2NrX2ZhaWwwOgotCQkJZnJlZV9pcnEoSVJRX1VTQiwgZGV2KTsKKwkJCWZyZWVfaXJxKGlycSwgZGV2KTsKIAkJCXJldHVybiAtRUJVU1k7CiAJCX0KIAkJcmV0dmFsID0gcmVxdWVzdF9pcnEoTFVCQk9DS19VU0JfSVJRLApAQCAtMjYxNiw3ICsyNjA3LDcgQEAKIAkJaWYgKHJldHZhbCAhPSAwKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjYW4ndCBnZXQgaXJxICVpLCBlcnIgJWRcbiIsCiAJCQkJZHJpdmVyX25hbWUsIHZidXNfaXJxLCByZXR2YWwpOwotCQkJZnJlZV9pcnEoSVJRX1VTQiwgZGV2KTsKKwkJCWZyZWVfaXJxKGlycSwgZGV2KTsKIAkJCXJldHVybiAtRUJVU1k7CiAJCX0KIAl9CkBAIC0yNjQxLDcgKzI2MzIsNyBAQAogCXJlbW92ZV9wcm9jX2ZpbGVzKCk7CiAKIAlpZiAoZGV2LT5nb3RfaXJxKSB7Ci0JCWZyZWVfaXJxKElSUV9VU0IsIGRldik7CisJCWZyZWVfaXJxKHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCksIGRldik7CiAJCWRldi0+Z290X2lycSA9IDA7CiAJfQogI2lmZGVmIENPTkZJR19BUkNIX0xVQkJPQ0sKQEAgLTI2NjgsNyArMjY1OSw3IEBACiAgKgogICogRm9yIG5vdywgd2UgcHVudCBhbmQgZm9yY2libHkgZGlzY29ubmVjdCBmcm9tIHRoZSBVU0IgaG9zdCB3aGVuIFBYQQogICogZW50ZXJzIGFueSBzdXNwZW5kIHN0YXRlLiAgV2hpbGUgd2UncmUgZGlzY29ubmVjdGVkLCB3ZSBhbHdheXMgZGlzYWJsZQotICogdGhlIDQ4TUh6IFVTQiBjbG9jayAuLi4gYWxsb3dpbmcgUFhBIHNsZWVwIGFuZC9vciAzMyBNSHogaWRsZSBzdGF0ZXMuIAorICogdGhlIDQ4TUh6IFVTQiBjbG9jayAuLi4gYWxsb3dpbmcgUFhBIHNsZWVwIGFuZC9vciAzMyBNSHogaWRsZSBzdGF0ZXMuCiAgKiBCb2FyZHMgd2l0aG91dCBzb2Z0d2FyZSBwdWxsdXAgY29udHJvbCBzaG91bGRuJ3QgdXNlIHRob3NlIHN0YXRlcy4KICAqIFZCVVMgSVJRcyBzaG91bGQgcHJvYmFibHkgYmUgaWdub3JlZCBzbyB0aGF0IHRoZSBQWEEgZGV2aWNlIGp1c3QgYWN0cwogICogImRlYWQiIHRvIFVTQiBob3N0cyB1bnRpbCBzeXN0ZW0gcmVzdW1lLgpAQCAtMjcwMSw3ICsyNjkyLDYgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHVkY19kcml2ZXIgPSB7Ci0JLnByb2JlCQk9IHB4YTJ4eF91ZGNfcHJvYmUsCiAJLnNodXRkb3duCT0gcHhhMnh4X3VkY19zaHV0ZG93biwKIAkucmVtb3ZlCQk9IF9fZXhpdF9wKHB4YTJ4eF91ZGNfcmVtb3ZlKSwKIAkuc3VzcGVuZAk9IHB4YTJ4eF91ZGNfc3VzcGVuZCwKQEAgLTI3MTUsNyArMjcwNSw3IEBACiBzdGF0aWMgaW50IF9faW5pdCB1ZGNfaW5pdCh2b2lkKQogewogCXByaW50ayhLRVJOX0lORk8gIiVzOiB2ZXJzaW9uICVzXG4iLCBkcml2ZXJfbmFtZSwgRFJJVkVSX1ZFUlNJT04pOwotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnVkY19kcml2ZXIpOworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJnVkY19kcml2ZXIsIHB4YTJ4eF91ZGNfcHJvYmUpOwogfQogbW9kdWxlX2luaXQodWRjX2luaXQpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvcm5kaXMuaCBiL2RyaXZlcnMvdXNiL2dhZGdldC9ybmRpcy5oCmluZGV4IDRjM2M3MjUuLjM5N2IxNDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9ybmRpcy5oCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9ybmRpcy5oCkBAIC0xOTUsNyArMTk1LDcgQEAKIAlfX2xlMzIJUGVyUGFja2V0SW5mb0xlbmd0aDsKIAlfX2xlMzIJVmNIYW5kbGU7CiAJX19sZTMyCVJlc2VydmVkOwotfTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCiBzdHJ1Y3Qgcm5kaXNfY29uZmlnX3BhcmFtZXRlcgogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9NYWtlZmlsZSBiL2RyaXZlcnMvdXNiL2hvc3QvTWFrZWZpbGUKaW5kZXggYTJlNThjOC4uMmZmMzk2YmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvTWFrZWZpbGUKKysrIGIvZHJpdmVycy91c2IvaG9zdC9NYWtlZmlsZQpAQCAtMTUsNCArMTUsMyBAQAogb2JqLSQoQ09ORklHX1VTQl9TTDgxMV9IQ0QpCSs9IHNsODExLWhjZC5vCiBvYmotJChDT05GSUdfVVNCX1NMODExX0NTKQkrPSBzbDgxMV9jcy5vCiBvYmotJChDT05GSUdfVVNCX1UxMzJfSENEKQkrPSB1MTMyLWhjZC5vCi1vYmotJChDT05GSUdfRVRSQVhfQVJDSF9WMTApCSs9IGhjX2NyaXN2MTAubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9laGNpLWZzbC5oIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLWZzbC5oCmluZGV4IGNhYWMwZDEuLmYyODczNmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1mc2wuaAorKysgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktZnNsLmgKQEAgLTMxLDcgKzMxLDcgQEAKICNkZWZpbmUgRlNMX1NPQ19VU0JfU05PT1AxCTB4NDAwCS8qIE5PVEU6IGJpZy1lbmRpYW4gKi8KICNkZWZpbmUgRlNMX1NPQ19VU0JfU05PT1AyCTB4NDA0CS8qIE5PVEU6IGJpZy1lbmRpYW4gKi8KICNkZWZpbmUgRlNMX1NPQ19VU0JfQUdFQ05UVEhSU0gJMHg0MDgJLyogTk9URTogYmlnLWVuZGlhbiAqLwotI2RlZmluZSBGU0xfU09DX1VTQl9TSUNUUkwJMHg0MGMJLyogTk9URTogYmlnLWVuZGlhbiAqLwotI2RlZmluZSBGU0xfU09DX1VTQl9QUklDVFJMCTB4NDEwCS8qIE5PVEU6IGJpZy1lbmRpYW4gKi8KKyNkZWZpbmUgRlNMX1NPQ19VU0JfUFJJQ1RSTAkweDQwYwkvKiBOT1RFOiBiaWctZW5kaWFuICovCisjZGVmaW5lIEZTTF9TT0NfVVNCX1NJQ1RSTAkweDQxMAkvKiBOT1RFOiBiaWctZW5kaWFuICovCiAjZGVmaW5lIEZTTF9TT0NfVVNCX0NUUkwJMHg1MDAJLyogTk9URTogYmlnLWVuZGlhbiAqLwogI2VuZGlmCQkJCS8qIF9FSENJX0ZTTF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktaHViLmMgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktaHViLmMKaW5kZXggMTgxM2I3Y2EuLmY0ZDMwMWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1odWIuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktaHViLmMKQEAgLTEzNiw2ICsxMzYsMTAgQEAKIAkvKiByZXN0b3JlIENNRF9SVU4sIGZyYW1lbGlzdCBzaXplLCBhbmQgaXJxIHRocmVzaG9sZCAqLwogCWVoY2lfd3JpdGVsKGVoY2ksIGVoY2ktPmNvbW1hbmQsICZlaGNpLT5yZWdzLT5jb21tYW5kKTsKIAorCS8qIFNvbWUgY29udHJvbGxlci9maXJtd2FyZSBjb21iaW5hdGlvbnMgbmVlZCBhIGRlbGF5IGR1cmluZyB3aGljaAorCSAqIHRoZXkgc2V0IHVwIHRoZSBwb3J0IHN0YXR1c2VzLiAgU2VlIEJ1Z3ppbGxhICM4MTkwLiAqLworCW1kZWxheSg4KTsKKwogCS8qIG1hbnVhbGx5IHJlc3VtZSB0aGUgcG9ydHMgd2Ugc3VzcGVuZGVkIGR1cmluZyBidXNfc3VzcGVuZCgpICovCiAJaSA9IEhDU19OX1BPUlRTIChlaGNpLT5oY3NfcGFyYW1zKTsKIAl3aGlsZSAoaS0tKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L2hjX2NyaXN2MTAuYyBiL2RyaXZlcnMvdXNiL2hvc3QvaGNfY3Jpc3YxMC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmY3Y2FmLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvaGNfY3Jpc3YxMC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDU1MCArMCwwIEBACi0vKgotICogdXNiLWhvc3QuYzogRVRSQVggMTAwTFggVVNCIEhvc3QgQ29udHJvbGxlciBEcml2ZXIgKEhDRCkKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDMgQXhpcyBDb21tdW5pY2F0aW9ucyBBQi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbGlzdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9pcnEuaD4KLSNpbmNsdWRlIDxhc20vZG1hLmg+Ci0jaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotI2luY2x1ZGUgPGFzbS9hcmNoL3N2aW50by5oPgotCi0jaW5jbHVkZSA8bGludXgvdXNiLmg+Ci0vKiBVZ2x5IGluY2x1ZGUgYmVjYXVzZSB3ZSBkb24ndCBsaXZlIHdpdGggdGhlIG90aGVyIGhvc3QgZHJpdmVycy4gKi8KLSNpbmNsdWRlIDwuLi9kcml2ZXJzL3VzYi9jb3JlL2hjZC5oPgotI2luY2x1ZGUgPC4uL2RyaXZlcnMvdXNiL2NvcmUvdXNiLmg+Ci0KLSNpbmNsdWRlICJoY19jcmlzdjEwLmgiCi0KLSNkZWZpbmUgRVRSQVhfVVNCX0hDX0lSUSBVU0JfSENfSVJRX05CUgotI2RlZmluZSBFVFJBWF9VU0JfUlhfSVJRIFVTQl9ETUFfUlhfSVJRX05CUgotI2RlZmluZSBFVFJBWF9VU0JfVFhfSVJRIFVTQl9ETUFfVFhfSVJRX05CUgotCi1zdGF0aWMgY29uc3QgY2hhciAqdXNiX2hjZF92ZXJzaW9uID0gIiRSZXZpc2lvbjogMS4yICQiOwotCi0jdW5kZWYgS0VSTl9ERUJVRwotI2RlZmluZSBLRVJOX0RFQlVHICIiCi0KLQotI3VuZGVmIFVTQl9ERUJVR19SSAotI3VuZGVmIFVTQl9ERUJVR19FUElECi0jdW5kZWYgVVNCX0RFQlVHX1NCCi0jdW5kZWYgVVNCX0RFQlVHX0RFU0MKLSN1bmRlZiBVU0JfREVCVUdfVVJCCi0jdW5kZWYgVVNCX0RFQlVHX1RSQUNFCi0jdW5kZWYgVVNCX0RFQlVHX0JVTEsKLSN1bmRlZiBVU0JfREVCVUdfQ1RSTAotI3VuZGVmIFVTQl9ERUJVR19JTlRSCi0jdW5kZWYgVVNCX0RFQlVHX0lTT0MKLQotI2lmZGVmIFVTQl9ERUJVR19SSAotI2RlZmluZSBkYmdfcmgoZm9ybWF0LCBhcmcuLi4pIHByaW50ayhLRVJOX0RFQlVHIF9fRklMRV9fICI6IChSSCkgIiBmb3JtYXQgIlxuIiAsICMjIGFyZykKLSNlbHNlCi0jZGVmaW5lIGRiZ19yaChmb3JtYXQsIGFyZy4uLikgZG8ge30gd2hpbGUgKDApCi0jZW5kaWYKLQotI2lmZGVmIFVTQl9ERUJVR19FUElECi0jZGVmaW5lIGRiZ19lcGlkKGZvcm1hdCwgYXJnLi4uKSBwcmludGsoS0VSTl9ERUJVRyBfX0ZJTEVfXyAiOiAoRVBJRCkgIiBmb3JtYXQgIlxuIiAsICMjIGFyZykKLSNlbHNlCi0jZGVmaW5lIGRiZ19lcGlkKGZvcm1hdCwgYXJnLi4uKSBkbyB7fSB3aGlsZSAoMCkKLSNlbmRpZgotCi0jaWZkZWYgVVNCX0RFQlVHX1NCCi0jZGVmaW5lIGRiZ19zYihmb3JtYXQsIGFyZy4uLikgcHJpbnRrKEtFUk5fREVCVUcgX19GSUxFX18gIjogKFNCKSAiIGZvcm1hdCAiXG4iICwgIyMgYXJnKQotI2Vsc2UKLSNkZWZpbmUgZGJnX3NiKGZvcm1hdCwgYXJnLi4uKSBkbyB7fSB3aGlsZSAoMCkKLSNlbmRpZgotCi0jaWZkZWYgVVNCX0RFQlVHX0NUUkwKLSNkZWZpbmUgZGJnX2N0cmwoZm9ybWF0LCBhcmcuLi4pIHByaW50ayhLRVJOX0RFQlVHIF9fRklMRV9fICI6IChDVFJMKSAiIGZvcm1hdCAiXG4iICwgIyMgYXJnKQotI2Vsc2UKLSNkZWZpbmUgZGJnX2N0cmwoZm9ybWF0LCBhcmcuLi4pIGRvIHt9IHdoaWxlICgwKQotI2VuZGlmCi0KLSNpZmRlZiBVU0JfREVCVUdfQlVMSwotI2RlZmluZSBkYmdfYnVsayhmb3JtYXQsIGFyZy4uLikgcHJpbnRrKEtFUk5fREVCVUcgX19GSUxFX18gIjogKEJVTEspICIgZm9ybWF0ICJcbiIgLCAjIyBhcmcpCi0jZWxzZQotI2RlZmluZSBkYmdfYnVsayhmb3JtYXQsIGFyZy4uLikgZG8ge30gd2hpbGUgKDApCi0jZW5kaWYKLQotI2lmZGVmIFVTQl9ERUJVR19JTlRSCi0jZGVmaW5lIGRiZ19pbnRyKGZvcm1hdCwgYXJnLi4uKSBwcmludGsoS0VSTl9ERUJVRyBfX0ZJTEVfXyAiOiAoSU5UUikgIiBmb3JtYXQgIlxuIiAsICMjIGFyZykKLSNlbHNlCi0jZGVmaW5lIGRiZ19pbnRyKGZvcm1hdCwgYXJnLi4uKSBkbyB7fSB3aGlsZSAoMCkKLSNlbmRpZgotCi0jaWZkZWYgVVNCX0RFQlVHX0lTT0MKLSNkZWZpbmUgZGJnX2lzb2MoZm9ybWF0LCBhcmcuLi4pIHByaW50ayhLRVJOX0RFQlVHIF9fRklMRV9fICI6IChJU09DKSAiIGZvcm1hdCAiXG4iICwgIyMgYXJnKQotI2Vsc2UKLSNkZWZpbmUgZGJnX2lzb2MoZm9ybWF0LCBhcmcuLi4pIGRvIHt9IHdoaWxlICgwKQotI2VuZGlmCi0KLSNpZmRlZiBVU0JfREVCVUdfVFJBQ0UKLSNkZWZpbmUgREJGRU5URVIgKHByaW50aygiOiBFbnRlcmluZzogJXNcbiIsIF9fRlVOQ1RJT05fXykpCi0jZGVmaW5lIERCRkVYSVQgIChwcmludGsoIjogRXhpdGluZzogICVzXG4iLCBfX0ZVTkNUSU9OX18pKQotI2Vsc2UKLSNkZWZpbmUgREJGRU5URVIgZG8ge30gd2hpbGUgKDApCi0jZGVmaW5lIERCRkVYSVQgIGRvIHt9IHdoaWxlICgwKQotI2VuZGlmCi0KLSNkZWZpbmUgdXNiX3BpcGVzbG93KHBpcGUpCSgoKHBpcGUpID4+IDI2KSAmIDEpCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIFZpcnR1YWwgUm9vdCBIdWIKLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIF9fdTggcm9vdF9odWJfZGV2X2Rlc1tdID0KLXsKLQkweDEyLCAgLyogIF9fdTggIGJMZW5ndGg7ICovCi0JMHgwMSwgIC8qICBfX3U4ICBiRGVzY3JpcHRvclR5cGU7IERldmljZSAqLwotCTB4MDAsICAvKiAgX19sZTE2IGJjZFVTQjsgdjEuMCAqLwotCTB4MDEsCi0JMHgwOSwgIC8qICBfX3U4ICBiRGV2aWNlQ2xhc3M7IEhVQl9DTEFTU0NPREUgKi8KLQkweDAwLCAgLyogIF9fdTggIGJEZXZpY2VTdWJDbGFzczsgKi8KLQkweDAwLCAgLyogIF9fdTggIGJEZXZpY2VQcm90b2NvbDsgKi8KLQkweDA4LCAgLyogIF9fdTggIGJNYXhQYWNrZXRTaXplMDsgOCBCeXRlcyAqLwotCTB4MDAsICAvKiAgX19sZTE2IGlkVmVuZG9yOyAqLwotCTB4MDAsCi0JMHgwMCwgIC8qICBfX2xlMTYgaWRQcm9kdWN0OyAqLwotCTB4MDAsCi0JMHgwMCwgIC8qICBfX2xlMTYgYmNkRGV2aWNlOyAqLwotCTB4MDAsCi0JMHgwMCwgIC8qICBfX3U4ICBpTWFudWZhY3R1cmVyOyAqLwotCTB4MDIsICAvKiAgX191OCAgaVByb2R1Y3Q7ICovCi0JMHgwMSwgIC8qICBfX3U4ICBpU2VyaWFsTnVtYmVyOyAqLwotCTB4MDEgICAvKiAgX191OCAgYk51bUNvbmZpZ3VyYXRpb25zOyAqLwotfTsKLQotLyogQ29uZmlndXJhdGlvbiBkZXNjcmlwdG9yICovCi1zdGF0aWMgX191OCByb290X2h1Yl9jb25maWdfZGVzW10gPQotewotCTB4MDksICAvKiAgX191OCAgYkxlbmd0aDsgKi8KLQkweDAyLCAgLyogIF9fdTggIGJEZXNjcmlwdG9yVHlwZTsgQ29uZmlndXJhdGlvbiAqLwotCTB4MTksICAvKiAgX19sZTE2IHdUb3RhbExlbmd0aDsgKi8KLQkweDAwLAotCTB4MDEsICAvKiAgX191OCAgYk51bUludGVyZmFjZXM7ICovCi0JMHgwMSwgIC8qICBfX3U4ICBiQ29uZmlndXJhdGlvblZhbHVlOyAqLwotCTB4MDAsICAvKiAgX191OCAgaUNvbmZpZ3VyYXRpb247ICovCi0JMHg0MCwgIC8qICBfX3U4ICBibUF0dHJpYnV0ZXM7IEJpdCA3OiBCdXMtcG93ZXJlZCAqLwotCTB4MDAsICAvKiAgX191OCAgTWF4UG93ZXI7ICovCi0KLSAgICAgLyogaW50ZXJmYWNlICovCi0JMHgwOSwgIC8qICBfX3U4ICBpZl9iTGVuZ3RoOyAqLwotCTB4MDQsICAvKiAgX191OCAgaWZfYkRlc2NyaXB0b3JUeXBlOyBJbnRlcmZhY2UgKi8KLQkweDAwLCAgLyogIF9fdTggIGlmX2JJbnRlcmZhY2VOdW1iZXI7ICovCi0JMHgwMCwgIC8qICBfX3U4ICBpZl9iQWx0ZXJuYXRlU2V0dGluZzsgKi8KLQkweDAxLCAgLyogIF9fdTggIGlmX2JOdW1FbmRwb2ludHM7ICovCi0JMHgwOSwgIC8qICBfX3U4ICBpZl9iSW50ZXJmYWNlQ2xhc3M7IEhVQl9DTEFTU0NPREUgKi8KLQkweDAwLCAgLyogIF9fdTggIGlmX2JJbnRlcmZhY2VTdWJDbGFzczsgKi8KLQkweDAwLCAgLyogIF9fdTggIGlmX2JJbnRlcmZhY2VQcm90b2NvbDsgKi8KLQkweDAwLCAgLyogIF9fdTggIGlmX2lJbnRlcmZhY2U7ICovCi0KLSAgICAgLyogZW5kcG9pbnQgKi8KLQkweDA3LCAgLyogIF9fdTggIGVwX2JMZW5ndGg7ICovCi0JMHgwNSwgIC8qICBfX3U4ICBlcF9iRGVzY3JpcHRvclR5cGU7IEVuZHBvaW50ICovCi0JMHg4MSwgIC8qICBfX3U4ICBlcF9iRW5kcG9pbnRBZGRyZXNzOyBJTiBFbmRwb2ludCAxICovCi0JMHgwMywgIC8qICBfX3U4ICBlcF9ibUF0dHJpYnV0ZXM7IEludGVycnVwdCAqLwotCTB4MDgsICAvKiAgX19sZTE2IGVwX3dNYXhQYWNrZXRTaXplOyA4IEJ5dGVzICovCi0JMHgwMCwKLQkweGZmICAgLyogIF9fdTggIGVwX2JJbnRlcnZhbDsgMjU1IG1zICovCi19OwotCi1zdGF0aWMgX191OCByb290X2h1Yl9odWJfZGVzW10gPQotewotCTB4MDksICAvKiAgX191OCAgYkxlbmd0aDsgKi8KLQkweDI5LCAgLyogIF9fdTggIGJEZXNjcmlwdG9yVHlwZTsgSHViLWRlc2NyaXB0b3IgKi8KLQkweDAyLCAgLyogIF9fdTggIGJOYnJQb3J0czsgKi8KLQkweDAwLCAgLyogX191MTYgIHdIdWJDaGFyYWN0ZXJpc3RpY3M7ICovCi0JMHgwMCwKLQkweDAxLCAgLyogIF9fdTggIGJQd3JPbjJwd3JHb29kOyAybXMgKi8KLQkweDAwLCAgLyogIF9fdTggIGJIdWJDb250ckN1cnJlbnQ7IDAgbUEgKi8KLQkweDAwLCAgLyogIF9fdTggIERldmljZVJlbW92YWJsZTsgKioqIDcgUG9ydHMgbWF4ICoqKiAqLwotCTB4ZmYgICAvKiAgX191OCAgUG9ydFB3ckN0cmxNYXNrOyAqKiogNyBwb3J0cyBtYXggKioqICovCi19OwotCi1zdGF0aWMgREVGSU5FX1RJTUVSKGJ1bGtfc3RhcnRfdGltZXIsIE5VTEwsIDAsIDApOwotc3RhdGljIERFRklORV9USU1FUihidWxrX2VvdF90aW1lciwgTlVMTCwgMCwgMCk7Ci0KLS8qIFdlIHdhbnQgdGhlIHN0YXJ0IHRpbWVyIHRvIGV4cGlyZSBiZWZvcmUgdGhlIGVvdCB0aW1lciwgYmVjYXVzZSB0aGUgZm9ybWVyIG1pZ2h0IHN0YXJ0Ci0gICB0cmFmZmljLCB0aHVzIG1ha2luZyBpdCB1bm5lY2Vzc2FyeSBmb3IgdGhlIGxhdHRlciB0byB0aW1lIG91dC4gKi8KLSNkZWZpbmUgQlVMS19TVEFSVF9USU1FUl9JTlRFUlZBTCAoSFovMTApIC8qIDEwMCBtcyAqLwotI2RlZmluZSBCVUxLX0VPVF9USU1FUl9JTlRFUlZBTCAoSFovMTArMikgLyogMTIwIG1zICovCi0KLSNkZWZpbmUgT0soeCkgbGVuID0gKHgpOyBkYmdfcmgoIk9LKCVkKTogbGluZTogJWQiLCB4LCBfX0xJTkVfXyk7IGJyZWFrCi0jZGVmaW5lIENIRUNLX0FMSUdOKHgpIGlmICgoKF9fdTMyKSh4KSkgJiAweDAwMDAwMDAzKSBcCi17cGFuaWMoIkFsaWdubWVudCBjaGVjayAoRFdPUkQpIGZhaWxlZCBhdCAlczolczolZFxuIiwgX19GSUxFX18sIF9fRlVOQ1RJT05fXywgX19MSU5FX18pO30KLQotI2RlZmluZSBTTEFCX0ZMQUcgICAgIChpbl9pbnRlcnJ1cHQoKSA/IEdGUF9BVE9NSUMgOiBHRlBfS0VSTkVMKQotI2RlZmluZSBLTUFMTE9DX0ZMQUcgIChpbl9pbnRlcnJ1cHQoKSA/IEdGUF9BVE9NSUMgOiBHRlBfS0VSTkVMKQotCi0vKiBNb3N0IGhlbHBmdWwgZGVidWdnaW5nIGFpZCAqLwotI2RlZmluZSBhc3NlcnQoZXhwcikgKCh2b2lkKSAoKGV4cHIpID8gMCA6IChlcnIoImFzc2VydCBmYWlsZWQgYXQgbGluZSAlZCIsX19MSU5FX18pKSkpCi0KLS8qIEFsdGVybmF0aXZlIGFzc2VydCBkZWZpbmUgd2hpY2ggc3RvcHMgYWZ0ZXIgYSBmYWlsZWQgYXNzZXJ0LiAqLwotLyoKLSNkZWZpbmUgYXNzZXJ0KGV4cHIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBpZiAoIShleHByKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICBlcnIoImFzc2VydCBmYWlsZWQgYXQgbGluZSAlZCIsX19MSU5FX18pOyBcCi0gICAgICAgICAgICAgICAgd2hpbGUgKDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLSovCi0KLQotLyogRklYTUU6IFNob3VsZCBSWF9CVUZfU0laRSBiZSBhIGNvbmZpZyBvcHRpb24sIG9yIG1heWJlIHdlIHNob3VsZCBhZGp1c3QgaXQgZHluYW1pY2FsbHk/Ci0gICBUbyBhZGp1c3QgaXQgZHluYW1pY2FsbHkgd2Ugd291bGQgaGF2ZSB0byBnZXQgYW4gaW50ZXJydXB0IHdoZW4gd2UgcmVhY2ggdGhlIGVuZAotICAgb2YgdGhlIHJ4IGRlc2NyaXB0b3IgbGlzdCwgb3Igd2hlbiB3ZSBnZXQgY2xvc2UgdG8gdGhlIGVuZCwgYW5kIHRoZW4gYWxsb2NhdGUgbW9yZQotICAgZGVzY3JpcHRvcnMuICovCi0KLSNkZWZpbmUgTkJSX09GX1JYX0RFU0MgICAgIDUxMgotI2RlZmluZSBSWF9ERVNDX0JVRl9TSVpFICAgMTAyNAotI2RlZmluZSBSWF9CVUZfU0laRSAgICAgICAgKE5CUl9PRl9SWF9ERVNDICogUlhfREVTQ19CVUZfU0laRSkKLQotLyogVGhlIG51bWJlciBvZiBlcGlkcyBpcywgYW1vbmcgb3RoZXIgdGhpbmdzLCB1c2VkIGZvciBwcmUtYWxsb2NhdGluZwotICAgY3RybCwgYnVsayBhbmQgaXNvYyBFUCBkZXNjcmlwdG9ycyAob25lIGZvciBlYWNoIGVwaWQpLgotICAgQXNzdW1lZCB0byBiZSA+IDEgd2hlbiBpbml0aWF0aW5nIHRoZSBETUEgbGlzdHMuICovCi0jZGVmaW5lIE5CUl9PRl9FUElEUyAgICAgICAzMgotCi0vKiBTdXBwb3J0IGludGVycnVwdCB0cmFmZmljIGludGVydmFscyB1cCB0byAxMjggbXMuICovCi0jZGVmaW5lIE1BWF9JTlRSX0lOVEVSVkFMIDEyOAotCi0vKiBJZiBwZXJpb2RpYyB0cmFmZmljIChpbnRyIG9yIGlzb2MpIGlzIHRvIGJlIHVzZWQsIHRoZW4gb25lIGVudHJ5IGluIHRoZSBFUCB0YWJsZQotICAgbXVzdCBiZSAiaW52YWxpZCIuIEJ5IHRoaXMgd2UgbWVhbiB0aGF0IHdlIHNob3VsZG4ndCBjYXJlIGFib3V0IGVwaWQgYXR0ZW50aW9ucwotICAgZm9yIHRoaXMgZXBpZCwgb3IgYXQgbGVhc3QgaGFuZGxlIHRoZW0gZGlmZmVyZW50bHkgZnJvbSBlcGlkIGF0dGVudGlvbnMgZm9yICJ2YWxpZCIKLSAgIGVwaWRzLiBUaGlzIGRlZmluZSBkZXRlcm1pbmVzIHdoaWNoIG9uZSB0byB1c2UgKGRvbid0IGNoYW5nZSBpdCkuICovCi0jZGVmaW5lIElOVkFMSURfRVBJRCAgICAgMzEKLS8qIEEgc3BlY2lhbCBlcGlkIGZvciB0aGUgYnVsayBkdW1teXMuICovCi0jZGVmaW5lIERVTU1ZX0VQSUQgICAgICAgMzAKLQotLyogVGhpcyBpcyBqdXN0IGEgc29mdHdhcmUgY2FjaGUgZm9yIHRoZSB2YWxpZCBlbnRyaWVzIGluIFJfVVNCX0VQVF9EQVRBLiAqLwotc3RhdGljIF9fdTMyIGVwaWRfdXNhZ2VfYml0bWFzazsKLQotLyogQSBiaXRmaWVsZCB0byBrZWVwIGluZm9ybWF0aW9uIG9uIGluL291dCB0cmFmZmljIGlzIG5lZWRlZCB0byB1bmlxdWVseSBpZGVudGlmeQotICAgYW4gZW5kcG9pbnQgb24gYSBkZXZpY2UsIHNpbmNlIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCB3aGljaCBpbmRpY2F0ZXMgdHJhZmZpYwotICAgZGlyZWN0aW9uIGlzIGxhY2tpbmcgaW4gdGhlIGVwX2lkIGZpZWxkIChFVFJBWCBlcGlkcyBjYW4gaGFuZGxlIGJvdGggaW4gYW5kCi0gICBvdXQgdHJhZmZpYyBvbiBlbmRwb2ludHMgdGhhdCBhcmUgb3RoZXJ3aXNlIGlkZW50aWNhbCkuIFRoZSBVU0IgZnJhbWV3b3JrLCBob3dldmVyLAotICAgcmVsaWVzIG9uIHRoZW0gdG8gYmUgaGFuZGxlZCBzZXBhcmF0ZWx5LiAgRm9yIGV4YW1wbGUsIGJ1bGsgSU4gYW5kIE9VVCB1cmJzIGNhbm5vdAotICAgYmUgcXVldWVkIGluIHRoZSBzYW1lIGxpc3QsIHNpbmNlIHRoZXkgd291bGQgYmxvY2sgZWFjaCBvdGhlci4gKi8KLXN0YXRpYyBfX3UzMiBlcGlkX291dF90cmFmZmljOwotCi0vKiBETUEgSU4gY2FjaGUgYnVnLiBBbGlnbiB0aGUgRE1BIElOIGJ1ZmZlcnMgdG8gMzIgYnl0ZXMsIGkuZS4gYSBjYWNoZSBsaW5lLgotICAgU2luY2UgUlhfREVTQ19CVUZfU0laRSBpcyAxMDI0IGlzIGEgbXVsdGlwbGUgb2YgMzIsIGFsbCByeCBidWZmZXJzIHdpbGwgYmUgY2FjaGUgYWxpZ25lZC4gKi8KLXN0YXRpYyB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIFJ4QnVmW1JYX0JVRl9TSVpFXSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoMzIpKSk7Ci1zdGF0aWMgdm9sYXRpbGUgVVNCX0lOX0Rlc2NfdCBSeERlc2NMaXN0W05CUl9PRl9SWF9ERVNDXSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoNCkpKTsKLQotLyogUG9pbnRlcnMgaW50byBSeERlc2NMaXN0LiAqLwotc3RhdGljIHZvbGF0aWxlIFVTQl9JTl9EZXNjX3QgKm15TmV4dFJ4RGVzYzsKLXN0YXRpYyB2b2xhdGlsZSBVU0JfSU5fRGVzY190ICpteUxhc3RSeERlc2M7Ci1zdGF0aWMgdm9sYXRpbGUgVVNCX0lOX0Rlc2NfdCAqbXlQcmV2UnhEZXNjOwotCi0vKiBFUCBkZXNjcmlwdG9ycyBtdXN0IGJlIDMyLWJpdCBhbGlnbmVkLiAqLwotc3RhdGljIHZvbGF0aWxlIFVTQl9FUF9EZXNjX3QgVHhDdHJsRVBMaXN0W05CUl9PRl9FUElEU10gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKDQpKSk7Ci1zdGF0aWMgdm9sYXRpbGUgVVNCX0VQX0Rlc2NfdCBUeEJ1bGtFUExpc3RbTkJSX09GX0VQSURTXSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoNCkpKTsKLS8qIEFmdGVyIGVhY2ggZW5hYmxlZCBidWxrIEVQIChJTiBvciBPVVQpIHdlIHB1dCB0d28gZGlzYWJsZWQgRVAgZGVzY3JpcHRvcnMgd2l0aCB0aGUgZW9sIGZsYWcgc2V0LAotICAgY2F1c2luZyB0aGUgRE1BIHRvIHN0b3AgdGhlIERNQSBjaGFubmVsLiBUaGUgZmlyc3Qgb2YgdGhlc2UgdHdvIGhhcyB0aGUgaW50ciBmbGFnIHNldCwgd2hpY2gKLSAgIGdpdmVzIHVzIGEgZG1hOF9zdWIwX2Rlc2NyIGludGVycnVwdC4gV2hlbiB3ZSByZWNlaXZlIHRoaXMsIHdlIGFkdmFuY2UgdGhlIERNQSBvbmUgc3RlcCBpbiB0aGUKLSAgIEVQIGxpc3QgYW5kIHRoZW4gcmVzdGFydCB0aGUgYnVsayBjaGFubmVsLCB0aHVzIGZvcmNpbmcgYSBzd2l0Y2ggYmV0d2VlbiBidWxrIEVQIGRlc2NyaXB0b3JzCi0gICBpbiBlYWNoIGZyYW1lLiAqLwotc3RhdGljIHZvbGF0aWxlIFVTQl9FUF9EZXNjX3QgVHhCdWxrRHVtbXlFUExpc3RbTkJSX09GX0VQSURTXVsyXSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoNCkpKTsKLQotc3RhdGljIHZvbGF0aWxlIFVTQl9FUF9EZXNjX3QgVHhJc29jRVBMaXN0W05CUl9PRl9FUElEU10gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKDQpKSk7Ci1zdGF0aWMgdm9sYXRpbGUgVVNCX1NCX0Rlc2NfdCBUeElzb2NTQl96b3V0IF9fYXR0cmlidXRlX18gKChhbGlnbmVkICg0KSkpOwotCi1zdGF0aWMgdm9sYXRpbGUgVVNCX0VQX0Rlc2NfdCBUeEludHJFUExpc3RbTUFYX0lOVFJfSU5URVJWQUxdIF9fYXR0cmlidXRlX18gKChhbGlnbmVkICg0KSkpOwotc3RhdGljIHZvbGF0aWxlIFVTQl9TQl9EZXNjX3QgVHhJbnRyU0Jfem91dCBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoNCkpKTsKLQotLyogQSB6b3V0IHRyYW5zZmVyIG1ha2VzIGEgbWVtb3J5IGFjY2VzcyBhdCB0aGUgYWRkcmVzcyBvZiBpdHMgYnVmIHBvaW50ZXIsIHdoaWNoIG1lYW5zIHRoYXQgc2V0dGluZwotICAgdGhpcyBidWYgcG9pbnRlciB0byAwIHdpbGwgY2F1c2UgYW4gYWNjZXNzIHRvIHRoZSBmbGFzaC4gSW4gYWRkaXRpb24gdG8gdGhpcywgc2V0dGluZyBzd19sZW4gdG8gMAotICAgcmVzdWx0cyBpbiBhIDE2LzMyIGJ5dGVzIChkZXBlbmRpbmcgb24gRE1BIGJ1cnN0IHNpemUpIHRyYW5zZmVyLiBJbnN0ZWFkLCB3ZSBzZXQgaXQgdG8gMSwgYW5kIHBvaW50Ci0gICBpdCB0byB0aGlzIGJ1ZmZlci4gKi8KLXN0YXRpYyBpbnQgem91dF9idWZmZXJbNF0gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKDQpKSk7Ci0KLS8qIENhY2hlIGZvciBhbGxvY2F0aW5nIG5ldyBFUCBhbmQgU0IgZGVzY3JpcHRvcnMuICovCi1zdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKnVzYl9kZXNjX2NhY2hlOwotCi0vKiBDYWNoZSBmb3IgdGhlIHJlZ2lzdGVycyBhbGxvY2F0ZWQgaW4gdGhlIHRvcCBoYWxmLiAqLwotc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICp0b3BfaGFsZl9yZWdfY2FjaGU7Ci0KLS8qIENhY2hlIGZvciB0aGUgZGF0YSBhbGxvY2F0ZWQgaW4gdGhlIGlzb2MgZGVzY3IgdG9wIGhhbGYuICovCi1zdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKmlzb2NfY29tcGxfY2FjaGU7Ci0KLXN0YXRpYyBzdHJ1Y3QgdXNiX2J1cyAqZXRyYXhfdXNiX2J1czsKLQotLyogVGhpcyBpcyBhIGNpcmN1bGFyIChkb3VibGUtbGlua2VkKSBsaXN0IG9mIHRoZSBhY3RpdmUgdXJicyBmb3IgZWFjaCBlcGlkLgotICAgVGhlIGhlYWQgaXMgbmV2ZXIgcmVtb3ZlZCwgYW5kIG5ldyB1cmJzIGFyZSBsaW5rZWQgb250byB0aGUgbGlzdCBhcwotICAgdXJiX2VudHJ5X3QgZWxlbWVudHMuIERvbid0IHJlZmVyZW5jZSB1cmJfbGlzdCBkaXJlY3RseTsgdXNlIHRoZSB3cmFwcGVyCi0gICBmdW5jdGlvbnMgaW5zdGVhZC4gTm90ZSB0aGF0IHdvcmtpbmcgd2l0aCB0aGVzZSBsaXN0cyBtaWdodCByZXF1aXJlIHNwaW5sb2NrCi0gICBwcm90ZWN0aW9uLiAqLwotc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgdXJiX2xpc3RbTkJSX09GX0VQSURTXTsKLQotLyogUmVhZCBhYm91dCB0aGUgbmVlZCBhbmQgdXNhZ2Ugb2YgdGhpcyBsb2NrIGluIHN1Ym1pdF9jdHJsX3VyYi4gKi8KLXN0YXRpYyBzcGlubG9ja190IHVyYl9saXN0X2xvY2s7Ci0KLS8qIFVzZWQgd2hlbiB1bmxpbmtpbmcgYXN5bmNocm9ub3VzbHkuICovCi1zdGF0aWMgc3RydWN0IGxpc3RfaGVhZCB1cmJfdW5saW5rX2xpc3Q7Ci0KLS8qIGZvciByZXR1cm5pbmcgc3RyaW5nIGRlc2NyaXB0b3JzIGluIFVURi0xNkxFICovCi1zdGF0aWMgaW50IGFzY2lpMnV0ZiAoY2hhciAqYXNjaWksIF9fdTggKnV0ZiwgaW50IHV0Zm1heCkKLXsKLQlpbnQgcmV0dmFsOwotCi0JZm9yIChyZXR2YWwgPSAwOyAqYXNjaWkgJiYgdXRmbWF4ID4gMTsgdXRmbWF4IC09IDIsIHJldHZhbCArPSAyKSB7Ci0JCSp1dGYrKyA9ICphc2NpaSsrICYgMHg3ZjsKLQkJKnV0ZisrID0gMDsKLQl9Ci0JcmV0dXJuIHJldHZhbDsKLX0KLQotc3RhdGljIGludCB1c2Jfcm9vdF9odWJfc3RyaW5nIChpbnQgaWQsIGludCBzZXJpYWwsIGNoYXIgKnR5cGUsIF9fdTggKmRhdGEsIGludCBsZW4pCi17Ci0JY2hhciBidWYgWzMwXTsKLQotCS8vIGFzc2VydCAobGVuID4gKDIgKiAoc2l6ZW9mIChidWYpICsgMSkpKTsKLQkvLyBhc3NlcnQgKHN0cmxlbiAodHlwZSkgPD0gOCk7Ci0KLQkvLyBsYW5ndWFnZSBpZHMKLQlpZiAoaWQgPT0gMCkgewotCQkqZGF0YSsrID0gNDsgKmRhdGErKyA9IDM7CS8qIDQgYnl0ZXMgZGF0YSAqLwotCQkqZGF0YSsrID0gMDsgKmRhdGErKyA9IDA7CS8qIHNvbWUgbGFuZ3VhZ2UgaWQgKi8KLQkJcmV0dXJuIDQ7Ci0KLQkvLyBzZXJpYWwgbnVtYmVyCi0JfSBlbHNlIGlmIChpZCA9PSAxKSB7Ci0JCXNwcmludGYgKGJ1ZiwgIiV4Iiwgc2VyaWFsKTsKLQotCS8vIHByb2R1Y3QgZGVzY3JpcHRpb24KLQl9IGVsc2UgaWYgKGlkID09IDIpIHsKLQkJc3ByaW50ZiAoYnVmLCAiVVNCICVzIFJvb3QgSHViIiwgdHlwZSk7Ci0KLQkvLyBpZCAzID09IHZlbmRvciBkZXNjcmlwdGlvbgotCi0JLy8gdW5zdXBwb3J0ZWQgSURzIC0tPiAic3RhbGwiCi0JfSBlbHNlCi0JICAgIHJldHVybiAwOwotCi0JZGF0YSBbMF0gPSAyICsgYXNjaWkydXRmIChidWYsIGRhdGEgKyAyLCBsZW4gLSAyKTsKLQlkYXRhIFsxXSA9IDM7Ci0JcmV0dXJuIGRhdGEgWzBdOwotfQotCi0vKiBXcmFwcGVycyBhcm91bmQgdGhlIGxpc3QgZnVuY3Rpb25zIChpbmNsdWRlL2xpbnV4L2xpc3QuaCkuICovCi0KLXN0YXRpYyBpbmxpbmUgaW50IHVyYl9saXN0X2VtcHR5KGludCBlcGlkKQotewotCXJldHVybiBsaXN0X2VtcHR5KCZ1cmJfbGlzdFtlcGlkXSk7Ci19Ci0KLS8qIFJldHVybnMgZmlyc3QgdXJiIGZvciB0aGlzIGVwaWQsIG9yIE5VTEwgaWYgbGlzdCBpcyBlbXB0eS4gKi8KLXN0YXRpYyBpbmxpbmUgc3RydWN0IHVyYiAqdXJiX2xpc3RfZmlyc3QoaW50IGVwaWQpCi17Ci0Jc3RydWN0IHVyYiAqZmlyc3RfdXJiID0gMDsKLQotCWlmICghdXJiX2xpc3RfZW1wdHkoZXBpZCkpIHsKLQkJLyogR2V0IHRoZSBmaXJzdCB1cmIgKGkuZS4gaGVhZC0+bmV4dCkuICovCi0JCXVyYl9lbnRyeV90ICp1cmJfZW50cnkgPSBsaXN0X2VudHJ5KCgmdXJiX2xpc3RbZXBpZF0pLT5uZXh0LCB1cmJfZW50cnlfdCwgbGlzdCk7Ci0JCWZpcnN0X3VyYiA9IHVyYl9lbnRyeS0+dXJiOwotCX0KLQlyZXR1cm4gZmlyc3RfdXJiOwotfQotCi0vKiBBZGRzIGFuIHVyYl9lbnRyeSBsYXN0IGluIHRoZSBsaXN0IGZvciB0aGlzIGVwaWQuICovCi1zdGF0aWMgaW5saW5lIHZvaWQgdXJiX2xpc3RfYWRkKHN0cnVjdCB1cmIgKnVyYiwgaW50IGVwaWQpCi17Ci0JdXJiX2VudHJ5X3QgKnVyYl9lbnRyeSA9IGttYWxsb2Moc2l6ZW9mKHVyYl9lbnRyeV90KSwgS01BTExPQ19GTEFHKTsKLQlhc3NlcnQodXJiX2VudHJ5KTsKLQotCXVyYl9lbnRyeS0+dXJiID0gdXJiOwotCWxpc3RfYWRkX3RhaWwoJnVyYl9lbnRyeS0+bGlzdCwgJnVyYl9saXN0W2VwaWRdKTsKLX0KLQotLyogU2VhcmNoIHRocm91Z2ggdGhlIGxpc3QgZm9yIGFuIGVsZW1lbnQgdGhhdCBjb250YWlucyB0aGlzIHVyYi4gKFRoZSBsaXN0Ci0gICBpcyBleHBlY3RlZCB0byBiZSBzaG9ydCBhbmQgdGhlIG9uZSB3ZSBhcmUgYWJvdXQgdG8gZGVsZXRlIHdpbGwgb2Z0ZW4gYmUKLSAgIHRoZSBmaXJzdCBpbiB0aGUgbGlzdC4pICovCi1zdGF0aWMgaW5saW5lIHVyYl9lbnRyeV90ICpfX3VyYl9saXN0X2VudHJ5KHN0cnVjdCB1cmIgKnVyYiwgaW50IGVwaWQpCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCAqZW50cnk7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqdG1wOwotCXVyYl9lbnRyeV90ICp1cmJfZW50cnk7Ci0KLQlsaXN0X2Zvcl9lYWNoX3NhZmUoZW50cnksIHRtcCwgJnVyYl9saXN0W2VwaWRdKSB7Ci0JCXVyYl9lbnRyeSA9IGxpc3RfZW50cnkoZW50cnksIHVyYl9lbnRyeV90LCBsaXN0KTsKLQkJYXNzZXJ0KHVyYl9lbnRyeSk7Ci0JCWFzc2VydCh1cmJfZW50cnktPnVyYik7Ci0KLQkJaWYgKHVyYl9lbnRyeS0+dXJiID09IHVyYikgewotCQkJcmV0dXJuIHVyYl9lbnRyeTsKLQkJfQotCX0KLQlyZXR1cm4gMDsKLX0KLQotLyogRGVsZXRlIGFuIHVyYiBmcm9tIHRoZSBsaXN0LiAqLwotc3RhdGljIGlubGluZSB2b2lkIHVyYl9saXN0X2RlbChzdHJ1Y3QgdXJiICp1cmIsIGludCBlcGlkKQotewotCXVyYl9lbnRyeV90ICp1cmJfZW50cnkgPSBfX3VyYl9saXN0X2VudHJ5KHVyYiwgZXBpZCk7Ci0JYXNzZXJ0KHVyYl9lbnRyeSk7Ci0KLQkvKiBEZWxldGUgZW50cnkgYW5kIGZyZWUuICovCi0JbGlzdF9kZWwoJnVyYl9lbnRyeS0+bGlzdCk7Ci0Ja2ZyZWUodXJiX2VudHJ5KTsKLX0KLQotLyogTW92ZSBhbiB1cmIgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdC4gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCB1cmJfbGlzdF9tb3ZlX2xhc3Qoc3RydWN0IHVyYiAqdXJiLCBpbnQgZXBpZCkKLXsKLQl1cmJfZW50cnlfdCAqdXJiX2VudHJ5ID0gX191cmJfbGlzdF9lbnRyeSh1cmIsIGVwaWQpOwotCWFzc2VydCh1cmJfZW50cnkpOwotCi0JbGlzdF9tb3ZlX3RhaWwoJnVyYl9lbnRyeS0+bGlzdCwgJnVyYl9saXN0W2VwaWRdKTsKLX0KLQotLyogR2V0IHRoZSBuZXh0IHVyYiBpbiB0aGUgbGlzdC4gKi8KLXN0YXRpYyBpbmxpbmUgc3RydWN0IHVyYiAqdXJiX2xpc3RfbmV4dChzdHJ1Y3QgdXJiICp1cmIsIGludCBlcGlkKQotewotCXVyYl9lbnRyeV90ICp1cmJfZW50cnkgPSBfX3VyYl9saXN0X2VudHJ5KHVyYiwgZXBpZCk7Ci0KLQlhc3NlcnQodXJiX2VudHJ5KTsKLQotCWlmICh1cmJfZW50cnktPmxpc3QubmV4dCAhPSAmdXJiX2xpc3RbZXBpZF0pIHsKLQkJc3RydWN0IGxpc3RfaGVhZCAqZWxlbSA9IHVyYl9lbnRyeS0+bGlzdC5uZXh0OwotCQl1cmJfZW50cnkgPSBsaXN0X2VudHJ5KGVsZW0sIHVyYl9lbnRyeV90LCBsaXN0KTsKLQkJcmV0dXJuIHVyYl9lbnRyeS0+dXJiOwotCX0gZWxzZSB7Ci0JCXJldHVybiBOVUxMOwotCX0KLX0KLQotCi0KLS8qIEZvciBkZWJ1ZyBwdXJwb3NlcyBvbmx5LiAqLwotc3RhdGljIGlubGluZSB2b2lkIHVyYl9saXN0X2R1bXAoaW50IGVwaWQpCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCAqZW50cnk7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqdG1wOwotCXVyYl9lbnRyeV90ICp1cmJfZW50cnk7Ci0JaW50IGkgPSAwOwotCi0JaW5mbygiRHVtcGluZyB1cmIgbGlzdCBmb3IgZXBpZCAlZCIsIGVwaWQpOwotCi0JbGlzdF9mb3JfZWFjaF9zYWZlKGVudHJ5LCB0bXAsICZ1cmJfbGlzdFtlcGlkXSkgewotCQl1cmJfZW50cnkgPSBsaXN0X2VudHJ5KGVudHJ5LCB1cmJfZW50cnlfdCwgbGlzdCk7Ci0JCWluZm8oIiAgIGVudHJ5ICVkLCB1cmIgPSAweCVseCIsIGksICh1bnNpZ25lZCBsb25nKXVyYl9lbnRyeS0+dXJiKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGluaXRfcnhfYnVmZmVycyh2b2lkKTsKLXN0YXRpYyBpbnQgZXRyYXhfcmhfdW5saW5rX3VyYihzdHJ1Y3QgdXJiICp1cmIpOwotc3RhdGljIHZvaWQgZXRyYXhfcmhfc2VuZF9pcnEoc3RydWN0IHVyYiAqdXJiKTsKLXN0YXRpYyB2b2lkIGV0cmF4X3JoX2luaXRfaW50X3RpbWVyKHN0cnVjdCB1cmIgKnVyYik7Ci1zdGF0aWMgdm9pZCBldHJheF9yaF9pbnRfdGltZXJfZG8odW5zaWduZWQgbG9uZyBwdHIpOwotCi1zdGF0aWMgaW50IGV0cmF4X3VzYl9zZXR1cF9lcGlkKHN0cnVjdCB1cmIgKnVyYik7Ci1zdGF0aWMgaW50IGV0cmF4X3VzYl9sb29rdXBfZXBpZChzdHJ1Y3QgdXJiICp1cmIpOwotc3RhdGljIGludCBldHJheF91c2JfYWxsb2NhdGVfZXBpZCh2b2lkKTsKLXN0YXRpYyB2b2lkIGV0cmF4X3VzYl9mcmVlX2VwaWQoaW50IGVwaWQpOwotCi1zdGF0aWMgaW50IGV0cmF4X3JlbW92ZV9mcm9tX3NiX2xpc3Qoc3RydWN0IHVyYiAqdXJiKTsKLQotc3RhdGljIHZvaWQqIGV0cmF4X3VzYl9idWZmZXJfYWxsb2Moc3RydWN0IHVzYl9idXMqIGJ1cywgc2l6ZV90IHNpemUsCi0JdW5zaWduZWQgbWVtX2ZsYWdzLCBkbWFfYWRkcl90ICpkbWEpOwotc3RhdGljIHZvaWQgZXRyYXhfdXNiX2J1ZmZlcl9mcmVlKHN0cnVjdCB1c2JfYnVzICpidXMsIHNpemVfdCBzaXplLCB2b2lkICphZGRyLCBkbWFfYWRkcl90IGRtYSk7Ci0KLXN0YXRpYyB2b2lkIGV0cmF4X3VzYl9hZGRfdG9fYnVsa19zYl9saXN0KHN0cnVjdCB1cmIgKnVyYiwgaW50IGVwaWQpOwotc3RhdGljIHZvaWQgZXRyYXhfdXNiX2FkZF90b19jdHJsX3NiX2xpc3Qoc3RydWN0IHVyYiAqdXJiLCBpbnQgZXBpZCk7Ci1zdGF0aWMgdm9pZCBldHJheF91c2JfYWRkX3RvX2ludHJfc2JfbGlzdChzdHJ1Y3QgdXJiICp1cmIsIGludCBlcGlkKTsKLXN0YXRpYyB2b2lkIGV0cmF4X3VzYl9hZGRfdG9faXNvY19zYl9saXN0KHN0cnVjdCB1cmIgKnVyYiwgaW50IGVwaWQpOwotCi1zdGF0aWMgaW50IGV0cmF4X3VzYl9zdWJtaXRfYnVsa191cmIoc3RydWN0IHVyYiAqdXJiKTsKLXN0YXRpYyBpbnQgZXRyYXhfdXNiX3N1Ym1pdF9jdHJsX3VyYihzdHJ1Y3QgdXJiICp1cmIpOwotc3RhdGljIGludCBldHJheF91c2Jfc3VibWl0X2ludHJfdXJiKHN0cnVjdCB1cmIgKnVyYik7Ci1zdGF0aWMgaW50IGV0cmF4X3VzYl9zdWJtaXRfaXNvY191cmIoc3RydWN0IHVyYiAqdXJiKTsKLQotc3RhdGljIGludCBldHJheF91c2Jfc3VibWl0X3VyYihzdHJ1Y3QgdXJiICp1cmIsIHVuc2lnbmVkIG1lbV9mbGFncyk7Ci1zdGF0aWMgaW50IGV0cmF4X3VzYl91bmxpbmtfdXJiKHN0cnVjdCB1cmIgKnVyYiwgaW50IHN0YXR1cyk7Ci1zdGF0aWMgaW50IGV0cmF4X3VzYl9nZXRfZnJhbWVfbnVtYmVyKHN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2KTsKLQotc3RhdGljIGlycXJldHVybl90IGV0cmF4X3VzYl90eF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqdmhjKTsKLXN0YXRpYyBpcnFyZXR1cm5fdCBldHJheF91c2JfcnhfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKnZoYyk7Ci1zdGF0aWMgaXJxcmV0dXJuX3QgZXRyYXhfdXNiX2hjX2ludGVycnVwdF90b3BfaGFsZihpbnQgaXJxLCB2b2lkICp2aGMpOwotc3RhdGljIHZvaWQgZXRyYXhfdXNiX2hjX2ludGVycnVwdF9ib3R0b21faGFsZih2b2lkICpkYXRhKTsKLQotc3RhdGljIHZvaWQgZXRyYXhfdXNiX2lzb2NfZGVzY3JfaW50ZXJydXB0X2JvdHRvbV9oYWxmKHZvaWQgKmRhdGEpOwotCi0KLS8qIFRoZSBmb2xsb3dpbmcgaXMgYSBsaXN0IG9mIGludGVycnVwdCBoYW5kbGVycyBmb3IgdGhlIGhvc3QgY29udHJvbGxlciBpbnRlcnJ1cHRzIHdlIHVzZS4KLSAgIFRoZXkgYXJlIGNhbGxlZCBmcm9tIGV0cmF4X3VzYl9oY19pbnRlcnJ1cHRfYm90dG9tX2hhbGYuICovCi1zdGF0aWMgdm9pZCBldHJheF91c2JfaGNfaXNvY19lb2ZfaW50ZXJydXB0KHZvaWQpOwotc3RhdGljIHZvaWQgZXRyYXhfdXNiX2hjX2J1bGtfZW90X2ludGVycnVwdChpbnQgdGltZXJfaW5kdWNlZCk7Ci1zdGF0aWMgdm9pZCBldHJheF91c2JfaGNfZXBpZF9hdHRuX2ludGVycnVwdCh1c2JfaW50ZXJydXB0X3JlZ2lzdGVyc190ICpyZWcpOwotc3RhdGljIHZvaWQgZXRyYXhfdXNiX2hjX3BvcnRfc3RhdHVzX2ludGVycnVwdCh1c2JfaW50ZXJydXB0X3JlZ2lzdGVyc190ICpyZWcpOwotc3RhdGljIHZvaWQgZXRyYXhfdXNiX2hjX2N0bF9zdGF0dXNfaW50ZXJydXB0KHVzYl9pbnRlcnJ1cHRfcmVnaXN0ZXJzX3QgKnJlZyk7Ci0KLXN0YXRpYyBpbnQgZXRyYXhfcmhfc3VibWl0X3VyYiAoc3RydWN0IHVyYiAqdXJiKTsKLQotLyogRm9yd2FyZCBkZWNsYXJhdGlvbiBuZWVkZWQgYmVjYXVzZSB0aGV5IGFyZSB1c2VkIGluIHRoZSByeCBpbnRlcnJ1cHQgcm91dGluZS4gKi8KLXN0YXRpYyB2b2lkIGV0cmF4X3VzYl9jb21wbGV0ZV91cmIoc3RydWN0IHVyYiAqdXJiLCBpbnQgc3RhdHVzKTsKLXN0YXRpYyB2b2lkIGV0cmF4X3VzYl9jb21wbGV0ZV9idWxrX3VyYihzdHJ1Y3QgdXJiICp1cmIsIGludCBzdGF0dXMpOwotc3RhdGljIHZvaWQgZXRyYXhfdXNiX2NvbXBsZXRlX2N0cmxfdXJiKHN0cnVjdCB1cmIgKnVyYiwgaW50IHN0YXR1cyk7Ci1zdGF0aWMgdm9pZCBldHJheF91c2JfY29tcGxldGVfaW50cl91cmIoc3RydWN0IHVyYiAqdXJiLCBpbnQgc3RhdHVzKTsKLXN0YXRpYyB2b2lkIGV0cmF4X3VzYl9jb21wbGV0ZV9pc29jX3VyYihzdHJ1Y3QgdXJiICp1cmIsIGludCBzdGF0dXMpOwotCi1zdGF0aWMgaW50IGV0cmF4X3VzYl9oY19pbml0KHZvaWQpOwotc3RhdGljIHZvaWQgZXRyYXhfdXNiX2hjX2NsZWFudXAodm9pZCk7Ci0KLXN0YXRpYyBzdHJ1Y3QgdXNiX29wZXJhdGlvbnMgZXRyYXhfdXNiX2RldmljZV9vcGVyYXRpb25zID0KLXsKLQkuZ2V0X2ZyYW1lX251bWJlciA9IGV0cmF4X3VzYl9nZXRfZnJhbWVfbnVtYmVyLAotCS5zdWJtaXRfdXJiID0gZXRyYXhfdXNiX3N1Ym1pdF91cmIsCi0JLnVubGlua191cmIgPSBldHJheF91c2JfdW5saW5rX3VyYiwKLSAgICAgICAgLmJ1ZmZlcl9hbGxvYyA9IGV0cmF4X3VzYl9idWZmZXJfYWxsb2MsCi0gICAgICAgIC5idWZmZXJfZnJlZSA9IGV0cmF4X3VzYl9idWZmZXJfZnJlZQotfTsKLQotLyogTm90ZSB0aGF0IHRoZXNlIGZ1bmN0aW9ucyBhcmUgYWx3YXlzIGF2YWlsYWJsZSBpbiB0aGVpciAiX18iIHZhcmlhbnRzLCBmb3IgdXNlIGluCi0gICBlcnJvciBzaXR1YXRpb25zLiBUaGUgIl9fIiBtaXNzaW5nIHZhcmlhbnRzIGFyZSBjb250cm9sbGVkIGJ5IHRoZSBVU0JfREVCVUdfREVTQy8KLSAgIFVTQl9ERUJVR19VUkIgbWFjcm9zLiAqLwotc3RhdGljIHZvaWQgX19kdW1wX3VyYihzdHJ1Y3QgdXJiKiBwdXJiKQotewotCXByaW50aygiXG51cmIgICAgICAgICAgICAgICAgICA6MHglMDhseFxuIiwgKHVuc2lnbmVkIGxvbmcpcHVyYik7Ci0JcHJpbnRrKCJkZXYgICAgICAgICAgICAgICAgICAgOjB4JTA4bHhcbiIsICh1bnNpZ25lZCBsb25nKXB1cmItPmRldik7Ci0JcHJpbnRrKCJwaXBlICAgICAgICAgICAgICAgICAgOjB4JTA4eFxuIiwgcHVyYi0+cGlwZSk7Ci0JcHJpbnRrKCJzdGF0dXMgICAgICAgICAgICAgICAgOiVkXG4iLCBwdXJiLT5zdGF0dXMpOwotCXByaW50aygidHJhbnNmZXJfZmxhZ3MgICAgICAgIDoweCUwOHhcbiIsIHB1cmItPnRyYW5zZmVyX2ZsYWdzKTsKLQlwcmludGsoInRyYW5zZmVyX2J1ZmZlciAgICAgICA6MHglMDhseFxuIiwgKHVuc2lnbmVkIGxvbmcpcHVyYi0+dHJhbnNmZXJfYnVmZmVyKTsKLQlwcmludGsoInRyYW5zZmVyX2J1ZmZlcl9sZW5ndGg6JWRcbiIsIHB1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgpOwotCXByaW50aygiYWN0dWFsX2xlbmd0aCAgICAgICAgIDolZFxuIiwgcHVyYi0+YWN0dWFsX2xlbmd0aCk7Ci0JcHJpbnRrKCJzZXR1cF9wYWNrZXQgICAgICAgICAgOjB4JTA4bHhcbiIsICh1bnNpZ25lZCBsb25nKXB1cmItPnNldHVwX3BhY2tldCk7Ci0JcHJpbnRrKCJzdGFydF9mcmFtZSAgICAgICAgICAgOiVkXG4iLCBwdXJiLT5zdGFydF9mcmFtZSk7Ci0JcHJpbnRrKCJudW1iZXJfb2ZfcGFja2V0cyAgICAgOiVkXG4iLCBwdXJiLT5udW1iZXJfb2ZfcGFja2V0cyk7Ci0JcHJpbnRrKCJpbnRlcnZhbCAgICAgICAgICAgICAgOiVkXG4iLCBwdXJiLT5pbnRlcnZhbCk7Ci0JcHJpbnRrKCJlcnJvcl9jb3VudCAgICAgICAgICAgOiVkXG4iLCBwdXJiLT5lcnJvcl9jb3VudCk7Ci0JcHJpbnRrKCJjb250ZXh0ICAgICAgICAgICAgICAgOjB4JTA4bHhcbiIsICh1bnNpZ25lZCBsb25nKXB1cmItPmNvbnRleHQpOwotCXByaW50aygiY29tcGxldGUgICAgICAgICAgICAgIDoweCUwOGx4XG5cbiIsICh1bnNpZ25lZCBsb25nKXB1cmItPmNvbXBsZXRlKTsKLX0KLQotc3RhdGljIHZvaWQgX19kdW1wX2luX2Rlc2Modm9sYXRpbGUgVVNCX0lOX0Rlc2NfdCAqaW4pCi17Ci0JcHJpbnRrKCJcblVTQl9JTl9EZXNjIGF0IDB4JTA4bHhcbiIsICh1bnNpZ25lZCBsb25nKWluKTsKLQlwcmludGsoIiAgc3dfbGVuICA6IDB4JTA0eCAoJWQpXG4iLCBpbi0+c3dfbGVuLCBpbi0+c3dfbGVuKTsKLQlwcmludGsoIiAgY29tbWFuZCA6IDB4JTA0eFxuIiwgaW4tPmNvbW1hbmQpOwotCXByaW50aygiICBuZXh0ICAgIDogMHglMDhseFxuIiwgaW4tPm5leHQpOwotCXByaW50aygiICBidWYgICAgIDogMHglMDhseFxuIiwgaW4tPmJ1Zik7Ci0JcHJpbnRrKCIgIGh3X2xlbiAgOiAweCUwNHggKCVkKVxuIiwgaW4tPmh3X2xlbiwgaW4tPmh3X2xlbik7Ci0JcHJpbnRrKCIgIHN0YXR1cyAgOiAweCUwNHhcblxuIiwgaW4tPnN0YXR1cyk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZHVtcF9zYl9kZXNjKHZvbGF0aWxlIFVTQl9TQl9EZXNjX3QgKnNiKQotewotCWNoYXIgdHQgPSAoc2ItPmNvbW1hbmQgJiAweDMwKSA+PiA0OwotCWNoYXIgKnR0X3N0cmluZzsKLQotCXN3aXRjaCAodHQpIHsKLQljYXNlIDA6Ci0JCXR0X3N0cmluZyA9ICJ6b3V0IjsKLQkJYnJlYWs7Ci0JY2FzZSAxOgotCQl0dF9zdHJpbmcgPSAiaW4iOwotCQlicmVhazsKLQljYXNlIDI6Ci0JCXR0X3N0cmluZyA9ICJvdXQiOwotCQlicmVhazsKLQljYXNlIDM6Ci0JCXR0X3N0cmluZyA9ICJzZXR1cCI7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXR0X3N0cmluZyA9ICJ1bmtub3duICh3ZWlyZCkiOwotCX0KLQotCXByaW50aygiXG4gICBVU0JfU0JfRGVzYyBhdCAweCUwOGx4XG4iLCAodW5zaWduZWQgbG9uZylzYik7Ci0JcHJpbnRrKCIgICAgIGNvbW1hbmQgOiAweCUwNHhcbiIsIHNiLT5jb21tYW5kKTsKLQlwcmludGsoIiAgICAgICAgcmVtICAgICA6ICVkXG4iLCAoc2ItPmNvbW1hbmQgJiAweDNmMDApID4+IDgpOwotCXByaW50aygiICAgICAgICBmdWxsICAgIDogJWRcbiIsIChzYi0+Y29tbWFuZCAmIDB4NDApID4+IDYpOwotCXByaW50aygiICAgICAgICB0dCAgICAgIDogJWQgKCVzKVxuIiwgdHQsIHR0X3N0cmluZyk7Ci0JcHJpbnRrKCIgICAgICAgIGludHIgICAgOiAlZFxuIiwgKHNiLT5jb21tYW5kICYgMHg4KSA+PiAzKTsKLQlwcmludGsoIiAgICAgICAgZW90ICAgICA6ICVkXG4iLCAoc2ItPmNvbW1hbmQgJiAweDIpID4+IDEpOwotCXByaW50aygiICAgICAgICBlb2wgICAgIDogJWRcbiIsIHNiLT5jb21tYW5kICYgMHgxKTsKLQlwcmludGsoIiAgICAgc3dfbGVuICA6IDB4JTA0eCAoJWQpXG4iLCBzYi0+c3dfbGVuLCBzYi0+c3dfbGVuKTsKLQlwcmludGsoIiAgICAgbmV4dCAgICA6IDB4JTA4bHhcbiIsIHNiLT5uZXh0KTsKLQlwcmludGsoIiAgICAgYnVmICAgICA6IDB4JTA4bHhcblxuIiwgc2ItPmJ1Zik7Ci19Ci0KLQotc3RhdGljIHZvaWQgX19kdW1wX2VwX2Rlc2Modm9sYXRpbGUgVVNCX0VQX0Rlc2NfdCAqZXApCi17Ci0JcHJpbnRrKCJcblVTQl9FUF9EZXNjIGF0IDB4JTA4bHhcbiIsICh1bnNpZ25lZCBsb25nKWVwKTsKLQlwcmludGsoIiAgY29tbWFuZCA6IDB4JTA0eFxuIiwgZXAtPmNvbW1hbmQpOwotCXByaW50aygiICAgICBlcF9pZCAgIDogJWRcbiIsIChlcC0+Y29tbWFuZCAmIDB4MWYwMCkgPj4gOCk7Ci0JcHJpbnRrKCIgICAgIGVuYWJsZSAgOiAlZFxuIiwgKGVwLT5jb21tYW5kICYgMHgxMCkgPj4gNCk7Ci0JcHJpbnRrKCIgICAgIGludHIgICAgOiAlZFxuIiwgKGVwLT5jb21tYW5kICYgMHg4KSA+PiAzKTsKLQlwcmludGsoIiAgICAgZW9mICAgICA6ICVkXG4iLCAoZXAtPmNvbW1hbmQgJiAweDIpID4+IDEpOwotCXByaW50aygiICAgICBlb2wgICAgIDogJWRcbiIsIGVwLT5jb21tYW5kICYgMHgxKTsKLQlwcmludGsoIiAgaHdfbGVuICA6IDB4JTA0eCAoJWQpXG4iLCBlcC0+aHdfbGVuLCBlcC0+aHdfbGVuKTsKLQlwcmludGsoIiAgbmV4dCAgICA6IDB4JTA4bHhcbiIsIGVwLT5uZXh0KTsKLQlwcmludGsoIiAgc3ViICAgICA6IDB4JTA4bHhcblxuIiwgZXAtPnN1Yik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2R1bXBfZXBfbGlzdChpbnQgcGlwZV90eXBlKQotewotCXZvbGF0aWxlIFVTQl9FUF9EZXNjX3QgKmVwOwotCXZvbGF0aWxlIFVTQl9FUF9EZXNjX3QgKmZpcnN0X2VwOwotCXZvbGF0aWxlIFVTQl9TQl9EZXNjX3QgKnNiOwotCi0Jc3dpdGNoIChwaXBlX3R5cGUpCi0JewotCWNhc2UgUElQRV9CVUxLOgotCQlmaXJzdF9lcCA9ICZUeEJ1bGtFUExpc3RbMF07Ci0JCWJyZWFrOwotCWNhc2UgUElQRV9DT05UUk9MOgotCQlmaXJzdF9lcCA9ICZUeEN0cmxFUExpc3RbMF07Ci0JCWJyZWFrOwotCWNhc2UgUElQRV9JTlRFUlJVUFQ6Ci0JCWZpcnN0X2VwID0gJlR4SW50ckVQTGlzdFswXTsKLQkJYnJlYWs7Ci0JY2FzZSBQSVBFX0lTT0NIUk9OT1VTOgotCQlmaXJzdF9lcCA9ICZUeElzb2NFUExpc3RbMF07Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXdhcm4oIkNhbm5vdCBkdW1wIHVua25vd24gdHJhZmZpYyB0eXBlIik7Ci0JCXJldHVybjsKLQl9Ci0JZXAgPSBmaXJzdF9lcDsKLQotCXByaW50aygiXG5cbkR1bXBpbmcgRVAgbGlzdC4uLlxuXG4iKTsKLQotCWRvIHsKLQkJX19kdW1wX2VwX2Rlc2MoZXApOwotCQkvKiBDYW5ub3QgcGh5c190b192aXJ0IG9uIDAgYXMgaXQgdHVybnMgaW50byA4MDAwMDAwMCwgd2hpY2ggaXMgIT0gMC4gKi8KLQkJc2IgPSBlcC0+c3ViID8gcGh5c190b192aXJ0KGVwLT5zdWIpIDogMDsKLQkJd2hpbGUgKHNiKSB7Ci0JCQlfX2R1bXBfc2JfZGVzYyhzYik7Ci0JCQlzYiA9IHNiLT5uZXh0ID8gcGh5c190b192aXJ0KHNiLT5uZXh0KSA6IDA7Ci0JCX0KLQkJZXAgPSAodm9sYXRpbGUgVVNCX0VQX0Rlc2NfdCAqKShwaHlzX3RvX3ZpcnQoZXAtPm5leHQpKTsKLQotCX0gd2hpbGUgKGVwICE9IGZpcnN0X2VwKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIF9fZHVtcF9lcHRfZGF0YShpbnQgZXBpZCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCV9fdTMyIHJfdXNiX2VwdF9kYXRhOwotCi0JaWYgKGVwaWQgPCAwIHx8IGVwaWQgPiAzMSkgewotCQlwcmludGsoIkNhbm5vdCBkdW1wIGVwdCBkYXRhIGZvciBpbnZhbGlkIGVwaWQgJWRcbiIsIGVwaWQpOwotCQlyZXR1cm47Ci0JfQotCi0Jc2F2ZV9mbGFncyhmbGFncyk7Ci0JY2xpKCk7Ci0JKlJfVVNCX0VQVF9JTkRFWCA9IElPX0ZJRUxEKFJfVVNCX0VQVF9JTkRFWCwgdmFsdWUsIGVwaWQpOwotCW5vcCgpOwotCXJfdXNiX2VwdF9kYXRhID0gKlJfVVNCX0VQVF9EQVRBOwotCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOwotCi0JcHJpbnRrKCJcblJfVVNCX0VQVF9EQVRBID0gMHgleCBmb3IgZXBpZCAlZCA6XG4iLCByX3VzYl9lcHRfZGF0YSwgZXBpZCk7Ci0JaWYgKHJfdXNiX2VwdF9kYXRhID09IDApIHsKLQkJLyogTm8gbmVlZCBmb3IgbW9yZSBkZXRhaWxlZCBwcmludGluZy4gKi8KLQkJcmV0dXJuOwotCX0KLQlwcmludGsoIiAgdmFsaWQgICAgICAgICAgIDogJWRcbiIsIChyX3VzYl9lcHRfZGF0YSAmIDB4ODAwMDAwMDApID4+IDMxKTsKLQlwcmludGsoIiAgaG9sZCAgICAgICAgICAgIDogJWRcbiIsIChyX3VzYl9lcHRfZGF0YSAmIDB4NDAwMDAwMDApID4+IDMwKTsKLQlwcmludGsoIiAgZXJyb3JfY291bnRfaW4gIDogJWRcbiIsIChyX3VzYl9lcHRfZGF0YSAmIDB4MzAwMDAwMDApID4+IDI4KTsKLQlwcmludGsoIiAgdF9pbiAgICAgICAgICAgIDogJWRcbiIsIChyX3VzYl9lcHRfZGF0YSAmIDB4MDgwMDAwMDApID4+IDI3KTsKLQlwcmludGsoIiAgbG93X3NwZWVkICAgICAgIDogJWRcbiIsIChyX3VzYl9lcHRfZGF0YSAmIDB4MDQwMDAwMDApID4+IDI2KTsKLQlwcmludGsoIiAgcG9ydCAgICAgICAgICAgIDogJWRcbiIsIChyX3VzYl9lcHRfZGF0YSAmIDB4MDMwMDAwMDApID4+IDI0KTsKLQlwcmludGsoIiAgZXJyb3JfY29kZSAgICAgIDogJWRcbiIsIChyX3VzYl9lcHRfZGF0YSAmIDB4MDBjMDAwMDApID4+IDIyKTsKLQlwcmludGsoIiAgdF9vdXQgICAgICAgICAgIDogJWRcbiIsIChyX3VzYl9lcHRfZGF0YSAmIDB4MDAyMDAwMDApID4+IDIxKTsKLQlwcmludGsoIiAgZXJyb3JfY291bnRfb3V0IDogJWRcbiIsIChyX3VzYl9lcHRfZGF0YSAmIDB4MDAxODAwMDApID4+IDE5KTsKLQlwcmludGsoIiAgbWF4X2xlbiAgICAgICAgIDogJWRcbiIsIChyX3VzYl9lcHRfZGF0YSAmIDB4MDAwM2Y4MDApID4+IDExKTsKLQlwcmludGsoIiAgZXAgICAgICAgICAgICAgIDogJWRcbiIsIChyX3VzYl9lcHRfZGF0YSAmIDB4MDAwMDA3ODApID4+IDcpOwotCXByaW50aygiICBkZXYgICAgICAgICAgICAgOiAlZFxuIiwgKHJfdXNiX2VwdF9kYXRhICYgMHgwMDAwMDAzZikpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX19kdW1wX2VwdF9kYXRhX2xpc3Qodm9pZCkKLXsKLQlpbnQgaTsKLQotCXByaW50aygiRHVtcGluZyB0aGUgd2hvbGUgUl9VU0JfRVBUX0RBVEEgbGlzdFxuIik7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgewotCQlfX2R1bXBfZXB0X2RhdGEoaSk7Ci0JfQotfQotI2lmZGVmIFVTQl9ERUJVR19ERVNDCi0jZGVmaW5lIGR1bXBfaW5fZGVzYyguLi4pIF9fZHVtcF9pbl9kZXNjKC4uLikKLSNkZWZpbmUgZHVtcF9zYl9kZXNjKC4uLikgX19kdW1wX3NiX2Rlc2MoLi4uKQotI2RlZmluZSBkdW1wX2VwX2Rlc2MoLi4uKSBfX2R1bXBfZXBfZGVzYyguLi4pCi0jZWxzZQotI2RlZmluZSBkdW1wX2luX2Rlc2MoLi4uKSBkbyB7fSB3aGlsZSAoMCkKLSNkZWZpbmUgZHVtcF9zYl9kZXNjKC4uLikgZG8ge30gd2hpbGUgKDApCi0jZGVmaW5lIGR1bXBfZXBfZGVzYyguLi4pIGRvIHt9IHdoaWxlICgwKQotI2VuZGlmCi0KLSNpZmRlZiBVU0JfREVCVUdfVVJCCi0jZGVmaW5lIGR1bXBfdXJiKHgpICAgICBfX2R1bXBfdXJiKHgpCi0jZWxzZQotI2RlZmluZSBkdW1wX3VyYih4KSAgICAgZG8ge30gd2hpbGUgKDApCi0jZW5kaWYKLQotc3RhdGljIHZvaWQgaW5pdF9yeF9idWZmZXJzKHZvaWQpCi17Ci0JaW50IGk7Ci0KLQlEQkZFTlRFUjsKLQotCWZvciAoaSA9IDA7IGkgPCAoTkJSX09GX1JYX0RFU0MgLSAxKTsgaSsrKSB7Ci0JCVJ4RGVzY0xpc3RbaV0uc3dfbGVuID0gUlhfREVTQ19CVUZfU0laRTsKLQkJUnhEZXNjTGlzdFtpXS5jb21tYW5kID0gMDsKLQkJUnhEZXNjTGlzdFtpXS5uZXh0ID0gdmlydF90b19waHlzKCZSeERlc2NMaXN0W2kgKyAxXSk7Ci0JCVJ4RGVzY0xpc3RbaV0uYnVmID0gdmlydF90b19waHlzKFJ4QnVmICsgKGkgKiBSWF9ERVNDX0JVRl9TSVpFKSk7Ci0JCVJ4RGVzY0xpc3RbaV0uaHdfbGVuID0gMDsKLQkJUnhEZXNjTGlzdFtpXS5zdGF0dXMgPSAwOwotCi0JCS8qIERNQSBJTiBjYWNoZSBidWcuIChzdHJ1Y3QgZXRyYXhfZG1hX2Rlc2NyIGhhcyB0aGUgc2FtZSBsYXlvdXQgYXMgVVNCX0lOX0Rlc2MKLQkJICAgZm9yIHRoZSByZWxldmFudCBmaWVsZHMuKSAqLwotCQlwcmVwYXJlX3J4X2Rlc2NyaXB0b3IoKHN0cnVjdCBldHJheF9kbWFfZGVzY3IqKSZSeERlc2NMaXN0W2ldKTsKLQotCX0KLQotCVJ4RGVzY0xpc3RbaV0uc3dfbGVuID0gUlhfREVTQ19CVUZfU0laRTsKLQlSeERlc2NMaXN0W2ldLmNvbW1hbmQgPSBJT19TVEFURShVU0JfSU5fY29tbWFuZCwgZW9sLCB5ZXMpOwotCVJ4RGVzY0xpc3RbaV0ubmV4dCA9IHZpcnRfdG9fcGh5cygmUnhEZXNjTGlzdFswXSk7Ci0JUnhEZXNjTGlzdFtpXS5idWYgPSB2aXJ0X3RvX3BoeXMoUnhCdWYgKyAoaSAqIFJYX0RFU0NfQlVGX1NJWkUpKTsKLQlSeERlc2NMaXN0W2ldLmh3X2xlbiA9IDA7Ci0JUnhEZXNjTGlzdFtpXS5zdGF0dXMgPSAwOwotCi0JbXlOZXh0UnhEZXNjID0gJlJ4RGVzY0xpc3RbMF07Ci0JbXlMYXN0UnhEZXNjID0gJlJ4RGVzY0xpc3RbTkJSX09GX1JYX0RFU0MgLSAxXTsKLQlteVByZXZSeERlc2MgPSAmUnhEZXNjTGlzdFtOQlJfT0ZfUlhfREVTQyAtIDFdOwotCi0JKlJfRE1BX0NIOV9GSVJTVCA9IHZpcnRfdG9fcGh5cyhteU5leHRSeERlc2MpOwotCSpSX0RNQV9DSDlfQ01EID0gSU9fU1RBVEUoUl9ETUFfQ0g5X0NNRCwgY21kLCBzdGFydCk7Ci0KLQlEQkZFWElUOwotfQotCi1zdGF0aWMgdm9pZCBpbml0X3R4X2J1bGtfZXAodm9pZCkKLXsKLQlpbnQgaTsKLQotCURCRkVOVEVSOwotCi0JZm9yIChpID0gMDsgaSA8IChOQlJfT0ZfRVBJRFMgLSAxKTsgaSsrKSB7Ci0JCUNIRUNLX0FMSUdOKCZUeEJ1bGtFUExpc3RbaV0pOwotCQlUeEJ1bGtFUExpc3RbaV0uaHdfbGVuID0gMDsKLQkJVHhCdWxrRVBMaXN0W2ldLmNvbW1hbmQgPSBJT19GSUVMRChVU0JfRVBfY29tbWFuZCwgZXBpZCwgaSk7Ci0JCVR4QnVsa0VQTGlzdFtpXS5zdWIgPSAwOwotCQlUeEJ1bGtFUExpc3RbaV0ubmV4dCA9IHZpcnRfdG9fcGh5cygmVHhCdWxrRVBMaXN0W2kgKyAxXSk7Ci0KLQkJLyogSW5pdGlhdGUgdHdvIEVQcywgZGlzYWJsZWQgYW5kIHdpdGggdGhlIGVvbCBmbGFnIHNldC4gTm8gbmVlZCBmb3IgYW55Ci0JCSAgIHByZXNlcnZlZCBlcGlkLiAqLwotCi0JCS8qIFRoZSBmaXJzdCBvbmUgaGFzIHRoZSBpbnRyIGZsYWcgc2V0IHNvIHdlIGdldCBhbiBpbnRlcnJ1cHQgd2hlbiB0aGUgRE1BCi0JCSAgIGNoYW5uZWwgaXMgYWJvdXQgdG8gYmVjb21lIGRpc2FibGVkLiAqLwotCQlDSEVDS19BTElHTigmVHhCdWxrRHVtbXlFUExpc3RbaV1bMF0pOwotCQlUeEJ1bGtEdW1teUVQTGlzdFtpXVswXS5od19sZW4gPSAwOwotCQlUeEJ1bGtEdW1teUVQTGlzdFtpXVswXS5jb21tYW5kID0gKElPX0ZJRUxEKFVTQl9FUF9jb21tYW5kLCBlcGlkLCBEVU1NWV9FUElEKSB8Ci0JCQkJCQkgICBJT19TVEFURShVU0JfRVBfY29tbWFuZCwgZW9sLCB5ZXMpIHwKLQkJCQkJCSAgIElPX1NUQVRFKFVTQl9FUF9jb21tYW5kLCBpbnRyLCB5ZXMpKTsKLQkJVHhCdWxrRHVtbXlFUExpc3RbaV1bMF0uc3ViID0gMDsKLQkJVHhCdWxrRHVtbXlFUExpc3RbaV1bMF0ubmV4dCA9IHZpcnRfdG9fcGh5cygmVHhCdWxrRHVtbXlFUExpc3RbaV1bMV0pOwotCi0JCS8qIFRoZSBzZWNvbmQgb25lLiAqLwotCQlDSEVDS19BTElHTigmVHhCdWxrRHVtbXlFUExpc3RbaV1bMV0pOwotCQlUeEJ1bGtEdW1teUVQTGlzdFtpXVsxXS5od19sZW4gPSAwOwotCQlUeEJ1bGtEdW1teUVQTGlzdFtpXVsxXS5jb21tYW5kID0gKElPX0ZJRUxEKFVTQl9FUF9jb21tYW5kLCBlcGlkLCBEVU1NWV9FUElEKSB8Ci0JCQkJCQkgICBJT19TVEFURShVU0JfRVBfY29tbWFuZCwgZW9sLCB5ZXMpKTsKLQkJVHhCdWxrRHVtbXlFUExpc3RbaV1bMV0uc3ViID0gMDsKLQkJLyogVGhlIGxhc3QgZHVtbXkncyBuZXh0IHBvaW50ZXIgaXMgdGhlIHNhbWUgYXMgdGhlIGN1cnJlbnQgRVAncyBuZXh0IHBvaW50ZXIuICovCi0JCVR4QnVsa0R1bW15RVBMaXN0W2ldWzFdLm5leHQgPSB2aXJ0X3RvX3BoeXMoJlR4QnVsa0VQTGlzdFtpICsgMV0pOwotCX0KLQotCS8qIENvbmZpZ3VyZSB0aGUgbGFzdCBvbmUuICovCi0JQ0hFQ0tfQUxJR04oJlR4QnVsa0VQTGlzdFtpXSk7Ci0JVHhCdWxrRVBMaXN0W2ldLmh3X2xlbiA9IDA7Ci0JVHhCdWxrRVBMaXN0W2ldLmNvbW1hbmQgPSAoSU9fU1RBVEUoVVNCX0VQX2NvbW1hbmQsIGVvbCwgeWVzKSB8Ci0JCQkJICAgSU9fRklFTEQoVVNCX0VQX2NvbW1hbmQsIGVwaWQsIGkpKTsKLQlUeEJ1bGtFUExpc3RbaV0uc3ViID0gMDsKLQlUeEJ1bGtFUExpc3RbaV0ubmV4dCA9IHZpcnRfdG9fcGh5cygmVHhCdWxrRVBMaXN0WzBdKTsKLQotCS8qIE5vIG5lZWQgY29uZmlndXJpbmcgZHVtbXkgRVBzIGZvciB0aGUgbGFzdCBvbmUgYXMgaXQgd2lsbCBuZXZlciBiZSB1c2VkIGZvcgotCSAgIGJ1bGsgdHJhZmZpYyAoaSA9PSBJTlZBTERfRVBJRCBhdCB0aGlzIHBvaW50KS4gKi8KLQotCS8qIFNldCB1cCB0byBzdGFydCBvbiB0aGUgbGFzdCBFUCBzbyB3ZSB3aWxsIGVuYWJsZSBpdCB3aGVuIGluc2VydGluZyB0cmFmZmljCi0JICAgZm9yIHRoZSBmaXJzdCB0aW1lIChpbWl0YXRpbmcgdGhlIHNpdHVhdGlvbiB3aGVyZSB0aGUgRE1BIGhhcyBzdG9wcGVkCi0JICAgYmVjYXVzZSB0aGVyZSB3YXMgbm8gbW9yZSB0cmFmZmljKS4gKi8KLQkqUl9ETUFfQ0g4X1NVQjBfRVAgPSB2aXJ0X3RvX3BoeXMoJlR4QnVsa0VQTGlzdFtpXSk7Ci0JLyogTm8gcG9pbnQgaW4gc3RhcnRpbmcgdGhlIGJ1bGsgY2hhbm5lbCB5ZXQuCi0JICpSX0RNQV9DSDhfU1VCMF9DTUQgPSBJT19TVEFURShSX0RNQV9DSDhfU1VCMF9DTUQsIGNtZCwgc3RhcnQpOyAqLwotCURCRkVYSVQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGluaXRfdHhfY3RybF9lcCh2b2lkKQotewotCWludCBpOwotCi0JREJGRU5URVI7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgKE5CUl9PRl9FUElEUyAtIDEpOyBpKyspIHsKLQkJQ0hFQ0tfQUxJR04oJlR4Q3RybEVQTGlzdFtpXSk7Ci0JCVR4Q3RybEVQTGlzdFtpXS5od19sZW4gPSAwOwotCQlUeEN0cmxFUExpc3RbaV0uY29tbWFuZCA9IElPX0ZJRUxEKFVTQl9FUF9jb21tYW5kLCBlcGlkLCBpKTsKLQkJVHhDdHJsRVBMaXN0W2ldLnN1YiA9IDA7Ci0JCVR4Q3RybEVQTGlzdFtpXS5uZXh0ID0gdmlydF90b19waHlzKCZUeEN0cmxFUExpc3RbaSArIDFdKTsKLQl9Ci0KLQlDSEVDS19BTElHTigmVHhDdHJsRVBMaXN0W2ldKTsKLQlUeEN0cmxFUExpc3RbaV0uaHdfbGVuID0gMDsKLQlUeEN0cmxFUExpc3RbaV0uY29tbWFuZCA9IChJT19TVEFURShVU0JfRVBfY29tbWFuZCwgZW9sLCB5ZXMpIHwKLQkJCQkgICBJT19GSUVMRChVU0JfRVBfY29tbWFuZCwgZXBpZCwgaSkpOwotCi0JVHhDdHJsRVBMaXN0W2ldLnN1YiA9IDA7Ci0JVHhDdHJsRVBMaXN0W2ldLm5leHQgPSB2aXJ0X3RvX3BoeXMoJlR4Q3RybEVQTGlzdFswXSk7Ci0KLQkqUl9ETUFfQ0g4X1NVQjFfRVAgPSB2aXJ0X3RvX3BoeXMoJlR4Q3RybEVQTGlzdFswXSk7Ci0JKlJfRE1BX0NIOF9TVUIxX0NNRCA9IElPX1NUQVRFKFJfRE1BX0NIOF9TVUIxX0NNRCwgY21kLCBzdGFydCk7Ci0KLQlEQkZFWElUOwotfQotCi0KLXN0YXRpYyB2b2lkIGluaXRfdHhfaW50cl9lcCh2b2lkKQotewotCWludCBpOwotCi0JREJGRU5URVI7Ci0KLQkvKiBSZWFkIGNvbW1lbnQgYXQgem91dF9idWZmZXIgZGVjbGFyYXRpb24gZm9yIGFuIGV4cGxhbmF0aW9uIHRvIHRoaXMuICovCi0JVHhJbnRyU0Jfem91dC5zd19sZW4gPSAxOwotCVR4SW50clNCX3pvdXQubmV4dCA9IDA7Ci0JVHhJbnRyU0Jfem91dC5idWYgPSB2aXJ0X3RvX3BoeXMoJnpvdXRfYnVmZmVyWzBdKTsKLQlUeEludHJTQl96b3V0LmNvbW1hbmQgPSAoSU9fRklFTEQoVVNCX1NCX2NvbW1hbmQsIHJlbSwgMCkgfAotCQkJCSBJT19TVEFURShVU0JfU0JfY29tbWFuZCwgdHQsIHpvdXQpIHwKLQkJCQkgSU9fU1RBVEUoVVNCX1NCX2NvbW1hbmQsIGZ1bGwsIHllcykgfAotCQkJCSBJT19TVEFURShVU0JfU0JfY29tbWFuZCwgZW90LCB5ZXMpIHwKLQkJCQkgSU9fU1RBVEUoVVNCX1NCX2NvbW1hbmQsIGVvbCwgeWVzKSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgKE1BWF9JTlRSX0lOVEVSVkFMIC0gMSk7IGkrKykgewotCQlDSEVDS19BTElHTigmVHhJbnRyRVBMaXN0W2ldKTsKLQkJVHhJbnRyRVBMaXN0W2ldLmh3X2xlbiA9IDA7Ci0JCVR4SW50ckVQTGlzdFtpXS5jb21tYW5kID0KLQkJCShJT19TVEFURShVU0JfRVBfY29tbWFuZCwgZW9mLCB5ZXMpIHwKLQkJCSBJT19TVEFURShVU0JfRVBfY29tbWFuZCwgZW5hYmxlLCB5ZXMpIHwKLQkJCSBJT19GSUVMRChVU0JfRVBfY29tbWFuZCwgZXBpZCwgSU5WQUxJRF9FUElEKSk7Ci0JCVR4SW50ckVQTGlzdFtpXS5zdWIgPSB2aXJ0X3RvX3BoeXMoJlR4SW50clNCX3pvdXQpOwotCQlUeEludHJFUExpc3RbaV0ubmV4dCA9IHZpcnRfdG9fcGh5cygmVHhJbnRyRVBMaXN0W2kgKyAxXSk7Ci0JfQotCi0JQ0hFQ0tfQUxJR04oJlR4SW50ckVQTGlzdFtpXSk7Ci0JVHhJbnRyRVBMaXN0W2ldLmh3X2xlbiA9IDA7Ci0JVHhJbnRyRVBMaXN0W2ldLmNvbW1hbmQgPQotCQkoSU9fU1RBVEUoVVNCX0VQX2NvbW1hbmQsIGVvZiwgeWVzKSB8Ci0JCSBJT19TVEFURShVU0JfRVBfY29tbWFuZCwgZW9sLCB5ZXMpIHwKLQkJIElPX1NUQVRFKFVTQl9FUF9jb21tYW5kLCBlbmFibGUsIHllcykgfAotCQkgSU9fRklFTEQoVVNCX0VQX2NvbW1hbmQsIGVwaWQsIElOVkFMSURfRVBJRCkpOwotCVR4SW50ckVQTGlzdFtpXS5zdWIgPSB2aXJ0X3RvX3BoeXMoJlR4SW50clNCX3pvdXQpOwotCVR4SW50ckVQTGlzdFtpXS5uZXh0ID0gdmlydF90b19waHlzKCZUeEludHJFUExpc3RbMF0pOwotCi0JKlJfRE1BX0NIOF9TVUIyX0VQID0gdmlydF90b19waHlzKCZUeEludHJFUExpc3RbMF0pOwotCSpSX0RNQV9DSDhfU1VCMl9DTUQgPSBJT19TVEFURShSX0RNQV9DSDhfU1VCMl9DTUQsIGNtZCwgc3RhcnQpOwotCURCRkVYSVQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGluaXRfdHhfaXNvY19lcCh2b2lkKQotewotCWludCBpOwotCi0JREJGRU5URVI7Ci0KLQkvKiBSZWFkIGNvbW1lbnQgYXQgem91dF9idWZmZXIgZGVjbGFyYXRpb24gZm9yIGFuIGV4cGxhbmF0aW9uIHRvIHRoaXMuICovCi0JVHhJc29jU0Jfem91dC5zd19sZW4gPSAxOwotCVR4SXNvY1NCX3pvdXQubmV4dCA9IDA7Ci0JVHhJc29jU0Jfem91dC5idWYgPSB2aXJ0X3RvX3BoeXMoJnpvdXRfYnVmZmVyWzBdKTsKLQlUeElzb2NTQl96b3V0LmNvbW1hbmQgPSAoSU9fRklFTEQoVVNCX1NCX2NvbW1hbmQsIHJlbSwgMCkgfAotCQkJCSBJT19TVEFURShVU0JfU0JfY29tbWFuZCwgdHQsIHpvdXQpIHwKLQkJCQkgSU9fU1RBVEUoVVNCX1NCX2NvbW1hbmQsIGZ1bGwsIHllcykgfAotCQkJCSBJT19TVEFURShVU0JfU0JfY29tbWFuZCwgZW90LCB5ZXMpIHwKLQkJCQkgSU9fU1RBVEUoVVNCX1NCX2NvbW1hbmQsIGVvbCwgeWVzKSk7Ci0KLQkvKiBUaGUgbGFzdCBpc29jaHJvbm91cyBFUCBkZXNjcmlwdG9yIGlzIGEgZHVtbXkuICovCi0KLQlmb3IgKGkgPSAwOyBpIDwgKE5CUl9PRl9FUElEUyAtIDEpOyBpKyspIHsKLQkJQ0hFQ0tfQUxJR04oJlR4SXNvY0VQTGlzdFtpXSk7Ci0JCVR4SXNvY0VQTGlzdFtpXS5od19sZW4gPSAwOwotCQlUeElzb2NFUExpc3RbaV0uY29tbWFuZCA9IElPX0ZJRUxEKFVTQl9FUF9jb21tYW5kLCBlcGlkLCBpKTsKLQkJVHhJc29jRVBMaXN0W2ldLnN1YiA9IDA7Ci0JCVR4SXNvY0VQTGlzdFtpXS5uZXh0ID0gdmlydF90b19waHlzKCZUeElzb2NFUExpc3RbaSArIDFdKTsKLQl9Ci0KLQlDSEVDS19BTElHTigmVHhJc29jRVBMaXN0W2ldKTsKLQlUeElzb2NFUExpc3RbaV0uaHdfbGVuID0gMDsKLQotCS8qIE11c3QgZW5hYmxlIHRoZSBsYXN0IEVQIGRlc2NyIHRvIGdldCBlb2YgaW50ZXJydXB0LiAqLwotCVR4SXNvY0VQTGlzdFtpXS5jb21tYW5kID0gKElPX1NUQVRFKFVTQl9FUF9jb21tYW5kLCBlbmFibGUsIHllcykgfAotCQkJCSAgIElPX1NUQVRFKFVTQl9FUF9jb21tYW5kLCBlb2YsIHllcykgfAotCQkJCSAgIElPX1NUQVRFKFVTQl9FUF9jb21tYW5kLCBlb2wsIHllcykgfAotCQkJCSAgIElPX0ZJRUxEKFVTQl9FUF9jb21tYW5kLCBlcGlkLCBJTlZBTElEX0VQSUQpKTsKLQlUeElzb2NFUExpc3RbaV0uc3ViID0gdmlydF90b19waHlzKCZUeElzb2NTQl96b3V0KTsKLQlUeElzb2NFUExpc3RbaV0ubmV4dCA9IHZpcnRfdG9fcGh5cygmVHhJc29jRVBMaXN0WzBdKTsKLQotCSpSX0RNQV9DSDhfU1VCM19FUCA9IHZpcnRfdG9fcGh5cygmVHhJc29jRVBMaXN0WzBdKTsKLQkqUl9ETUFfQ0g4X1NVQjNfQ01EID0gSU9fU1RBVEUoUl9ETUFfQ0g4X1NVQjNfQ01ELCBjbWQsIHN0YXJ0KTsKLQotCURCRkVYSVQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGV0cmF4X3VzYl91bmxpbmtfaW50cl91cmIoc3RydWN0IHVyYiAqdXJiKQotewotCXZvbGF0aWxlIFVTQl9FUF9EZXNjX3QgKmZpcnN0X2VwOyAgLyogRmlyc3QgRVAgaW4gdGhlIGxpc3QuICovCi0Jdm9sYXRpbGUgVVNCX0VQX0Rlc2NfdCAqY3Vycl9lcDsgICAvKiBDdXJyZW50IEVQLCB0aGUgaXRlcmF0b3IuICovCi0Jdm9sYXRpbGUgVVNCX0VQX0Rlc2NfdCAqbmV4dF9lcDsgICAvKiBUaGUgRVAgYWZ0ZXIgY3VycmVudC4gKi8KLQl2b2xhdGlsZSBVU0JfRVBfRGVzY190ICp1bmxpbmtfZXA7IC8qIFRoZSBvbmUgd2Ugc2hvdWxkIHJlbW92ZSBmcm9tIHRoZSBsaXN0LiAqLwotCi0JaW50IGVwaWQ7Ci0KLQkvKiBSZWFkIDguOC40IGluIERlc2lnbmVyJ3MgUmVmZXJlbmNlLCAiUmVtb3ZpbmcgYW4gRVAgRGVzY3JpcHRvciBmcm9tIHRoZSBMaXN0Ii4gKi8KLQotCURCRkVOVEVSOwotCi0JZXBpZCA9ICgoZXRyYXhfdXJiX3ByaXZfdCAqKXVyYi0+aGNwcml2KS0+ZXBpZDsKLQotCWZpcnN0X2VwID0gJlR4SW50ckVQTGlzdFswXTsKLQljdXJyX2VwID0gZmlyc3RfZXA7Ci0KLQotCS8qIE5vdGUgdGhhdCB0aGlzIGxvb3AgcmVtb3ZlcyBhbGwgRVAgZGVzY3JpcHRvcnMgd2l0aCB0aGlzIGVwaWQuIFRoaXMgYXNzdW1lcwotCSAgIHRoYXQgYWxsIEVQIGRlc2NyaXB0b3JzIGJlbG9uZyB0byB0aGUgb25lIGFuZCBvbmx5IHVyYiBmb3IgdGhpcyBlcGlkLiAqLwotCi0JZG8gewotCQluZXh0X2VwID0gKFVTQl9FUF9EZXNjX3QgKilwaHlzX3RvX3ZpcnQoY3Vycl9lcC0+bmV4dCk7Ci0KLQkJaWYgKElPX0VYVFJBQ1QoVVNCX0VQX2NvbW1hbmQsIGVwaWQsIG5leHRfZXAtPmNvbW1hbmQpID09IGVwaWQpIHsKLQotCQkJZGJnX2ludHIoIkZvdW5kIEVQIHRvIHVubGluayBmb3IgZXBpZCAlZCIsIGVwaWQpOwotCi0JCQkvKiBUaGlzIGlzIHRoZSBvbmUgd2Ugc2hvdWxkIHVubGluay4gKi8KLQkJCXVubGlua19lcCA9IG5leHRfZXA7Ci0KLQkJCS8qIEFjdHVhbGx5IHVubGluayB0aGUgRVAgZnJvbSB0aGUgRE1BIGxpc3QuICovCi0JCQljdXJyX2VwLT5uZXh0ID0gdW5saW5rX2VwLT5uZXh0OwotCi0JCQkvKiBXYWl0IHVudGlsIHRoZSBETUEgaXMgbm8gbG9uZ2VyIGF0IHRoaXMgZGVzY3JpcHRvci4gKi8KLQkJCXdoaWxlICgqUl9ETUFfQ0g4X1NVQjJfRVAgPT0gdmlydF90b19waHlzKHVubGlua19lcCkpOwotCi0JCQkvKiBOb3cgd2UgYXJlIGZyZWUgdG8gcmVtb3ZlIGl0IGFuZCBpdHMgU0IgZGVzY3JpcHRvci4KLQkJCSAgIE5vdGUgdGhhdCBpdCBpcyBhc3N1bWVkIGhlcmUgdGhhdCB0aGVyZSBpcyBvbmx5IG9uZSBzYiBpbiB0aGUKLQkJCSAgIHNiIGxpc3QgZm9yIHRoaXMgZXAuICovCi0JCQlrbWVtX2NhY2hlX2ZyZWUodXNiX2Rlc2NfY2FjaGUsIHBoeXNfdG9fdmlydCh1bmxpbmtfZXAtPnN1YikpOwotCQkJa21lbV9jYWNoZV9mcmVlKHVzYl9kZXNjX2NhY2hlLCAoVVNCX0VQX0Rlc2NfdCAqKXVubGlua19lcCk7Ci0JCX0KLQotCQljdXJyX2VwID0gcGh5c190b192aXJ0KGN1cnJfZXAtPm5leHQpOwotCi0JfSB3aGlsZSAoY3Vycl9lcCAhPSBmaXJzdF9lcCk7Ci0gICAgICAgIHVyYi0+aGNwcml2ID0gTlVMTDsKLX0KLQotdm9pZCBldHJheF91c2JfZG9faW50cl9yZWNvdmVyKGludCBlcGlkKQotewotCVVTQl9FUF9EZXNjX3QgKmZpcnN0X2VwLCAqdG1wX2VwOwotCi0JREJGRU5URVI7Ci0KLQlmaXJzdF9lcCA9IChVU0JfRVBfRGVzY190ICopcGh5c190b192aXJ0KCpSX0RNQV9DSDhfU1VCMl9FUCk7Ci0JdG1wX2VwID0gZmlyc3RfZXA7Ci0KLQkvKiBXaGF0IHRoaXMgZG9lcyBpcyBzaW1wbHkgdG8gd2FsayB0aGUgbGlzdCBvZiBpbnRlcnJ1cHQKLQkgICBlcCBkZXNjcmlwdG9ycyBhbmQgZW5hYmxlIHRob3NlIHRoYXQgYXJlIGRpc2FibGVkLiAqLwotCi0JZG8gewotCQlpZiAoSU9fRVhUUkFDVChVU0JfRVBfY29tbWFuZCwgZXBpZCwgdG1wX2VwLT5jb21tYW5kKSA9PSBlcGlkICYmCi0JCSAgICAhKHRtcF9lcC0+Y29tbWFuZCAmIElPX01BU0soVVNCX0VQX2NvbW1hbmQsIGVuYWJsZSkpKSB7Ci0JCQl0bXBfZXAtPmNvbW1hbmQgfD0gSU9fU1RBVEUoVVNCX0VQX2NvbW1hbmQsIGVuYWJsZSwgeWVzKTsKLQkJfQotCi0JCXRtcF9lcCA9IChVU0JfRVBfRGVzY190ICopcGh5c190b192aXJ0KHRtcF9lcC0+bmV4dCk7Ci0KLQl9IHdoaWxlICh0bXBfZXAgIT0gZmlyc3RfZXApOwotCi0KLQlEQkZFWElUOwotfQotCi1zdGF0aWMgaW50IGV0cmF4X3JoX3VubGlua191cmIgKHN0cnVjdCB1cmIgKnVyYikKLXsKLQlldHJheF9oY190ICpoYzsKLQotCURCRkVOVEVSOwotCi0JaGMgPSB1cmItPmRldi0+YnVzLT5oY3ByaXY7Ci0KLQlpZiAoaGMtPnJoLnVyYiA9PSB1cmIpIHsKLQkJaGMtPnJoLnNlbmQgPSAwOwotCQlkZWxfdGltZXIoJmhjLT5yaC5yaF9pbnRfdGltZXIpOwotCX0KLQotCURCRkVYSVQ7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGV0cmF4X3JoX3NlbmRfaXJxKHN0cnVjdCB1cmIgKnVyYikKLXsKLQlfX3UxNiBkYXRhID0gMDsKLQlldHJheF9oY190ICpoYyA9IHVyYi0+ZGV2LT5idXMtPmhjcHJpdjsKLQlEQkZFTlRFUjsKLQotLyoKLSAgZGJnX3JoKCJSX1VTQl9GTV9OVU1CRVIgICA6IDB4JTA4WCIsICpSX1VTQl9GTV9OVU1CRVIpOwotICBkYmdfcmgoIlJfVVNCX0ZNX1JFTUFJTklORzogMHglMDhYIiwgKlJfVVNCX0ZNX1JFTUFJTklORyk7Ci0qLwotCi0JZGF0YSB8PSAoaGMtPnJoLndQb3J0Q2hhbmdlXzEpID8gKDEgPDwgMSkgOiAwOwotCWRhdGEgfD0gKGhjLT5yaC53UG9ydENoYW5nZV8yKSA/ICgxIDw8IDIpIDogMDsKLQotCSooKF9fdTE2ICopdXJiLT50cmFuc2Zlcl9idWZmZXIpID0gY3B1X3RvX2xlMTYoZGF0YSk7Ci0JLyogRklYTUU6IFdoeSBpcyBhY3R1YWxfbGVuZ3RoIHNldCB0byAxIHdoZW4gZGF0YSBpcyAyIGJ5dGVzPwotCSAgIFNpbmNlIG9ubHkgMSBieXRlIGlzIHVzZWQsIHdoeSBub3QgZGVjbGFyZSBkYXRhIGFzIF9fdTg/ICovCi0JdXJiLT5hY3R1YWxfbGVuZ3RoID0gMTsKLQl1cmItPnN0YXR1cyA9IDA7Ci0KLQlpZiAoaGMtPnJoLnNlbmQgJiYgdXJiLT5jb21wbGV0ZSkgewotCQlkYmdfcmgoIndQb3J0Q2hhbmdlXzE6IDB4JTA0WCIsIGhjLT5yaC53UG9ydENoYW5nZV8xKTsKLQkJZGJnX3JoKCJ3UG9ydENoYW5nZV8yOiAweCUwNFgiLCBoYy0+cmgud1BvcnRDaGFuZ2VfMik7Ci0KLQkJdXJiLT5jb21wbGV0ZSh1cmIsIE5VTEwpOwotCX0KLQotCURCRkVYSVQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGV0cmF4X3JoX2luaXRfaW50X3RpbWVyKHN0cnVjdCB1cmIgKnVyYikKLXsKLQlldHJheF9oY190ICpoYzsKLQotCURCRkVOVEVSOwotCi0JaGMgPSB1cmItPmRldi0+YnVzLT5oY3ByaXY7Ci0JaGMtPnJoLmludGVydmFsID0gdXJiLT5pbnRlcnZhbDsKLQlpbml0X3RpbWVyKCZoYy0+cmgucmhfaW50X3RpbWVyKTsKLQloYy0+cmgucmhfaW50X3RpbWVyLmZ1bmN0aW9uID0gZXRyYXhfcmhfaW50X3RpbWVyX2RvOwotCWhjLT5yaC5yaF9pbnRfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKXVyYjsKLQkvKiBGSVhNRTogSXMgdGhlIGppZmZpZXMgcmVzb2x1dGlvbiBlbm91Z2g/IEFsbCBpbnRlcnZhbHMgPCAxMCBtcyB3aWxsIGJlIG1hcHBlZAotCSAgIHRvIDAsIGFuZCB0aGUgcmVzdCB0byB0aGUgbmVhcmVzdCBsb3dlciAxMCBtcy4gKi8KLQloYy0+cmgucmhfaW50X3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgKChIWiAqIGhjLT5yaC5pbnRlcnZhbCkgLyAxMDAwKTsKLQlhZGRfdGltZXIoJmhjLT5yaC5yaF9pbnRfdGltZXIpOwotCi0JREJGRVhJVDsKLX0KLQotc3RhdGljIHZvaWQgZXRyYXhfcmhfaW50X3RpbWVyX2RvKHVuc2lnbmVkIGxvbmcgcHRyKQotewotCXN0cnVjdCB1cmIgKnVyYjsKLQlldHJheF9oY190ICpoYzsKLQotCURCRkVOVEVSOwotCi0JdXJiID0gKHN0cnVjdCB1cmIqKXB0cjsKLQloYyA9IHVyYi0+ZGV2LT5idXMtPmhjcHJpdjsKLQotCWlmIChoYy0+cmguc2VuZCkgewotCQlldHJheF9yaF9zZW5kX2lycSh1cmIpOwotCX0KLQotCURCRkVYSVQ7Ci19Ci0KLXN0YXRpYyBpbnQgZXRyYXhfdXNiX3NldHVwX2VwaWQoc3RydWN0IHVyYiAqdXJiKQotewotCWludCBlcGlkOwotCWNoYXIgZGV2bnVtLCBlbmRwb2ludCwgb3V0X3RyYWZmaWMsIHNsb3c7Ci0JaW50IG1heGxlbjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JREJGRU5URVI7Ci0KLQllcGlkID0gZXRyYXhfdXNiX2xvb2t1cF9lcGlkKHVyYik7Ci0JaWYgKChlcGlkICE9IC0xKSl7Ci0JCS8qIEFuIGVwaWQgdGhhdCBmaXRzIHRoaXMgdXJiIGhhcyBiZWVuIGZvdW5kLiAqLwotCQlEQkZFWElUOwotCQlyZXR1cm4gZXBpZDsKLQl9Ci0KLQkvKiBXZSBtdXN0IGZpbmQgYW5kIGluaXRpYXRlIGEgbmV3IGVwaWQgZm9yIHRoaXMgdXJiLiAqLwotCWVwaWQgPSBldHJheF91c2JfYWxsb2NhdGVfZXBpZCgpOwotCi0JaWYgKGVwaWQgPT0gLTEpIHsKLQkJLyogRmFpbGVkIHRvIGFsbG9jYXRlIGEgbmV3IGVwaWQuICovCi0JCURCRkVYSVQ7Ci0JCXJldHVybiBlcGlkOwotCX0KLQotCS8qIFdlIG5vdyBoYXZlIGEgbmV3IGVwaWQgdG8gdXNlLiBJbml0aWF0ZSBpdC4gKi8KLQlzZXRfYml0KGVwaWQsICh2b2lkICopJmVwaWRfdXNhZ2VfYml0bWFzayk7Ci0KLQlkZXZudW0gPSB1c2JfcGlwZWRldmljZSh1cmItPnBpcGUpOwotCWVuZHBvaW50ID0gdXNiX3BpcGVlbmRwb2ludCh1cmItPnBpcGUpOwotCXNsb3cgPSB1c2JfcGlwZXNsb3codXJiLT5waXBlKTsKLQltYXhsZW4gPSB1c2JfbWF4cGFja2V0KHVyYi0+ZGV2LCB1cmItPnBpcGUsIHVzYl9waXBlb3V0KHVyYi0+cGlwZSkpOwotCWlmICh1c2JfcGlwZXR5cGUodXJiLT5waXBlKSA9PSBQSVBFX0NPTlRST0wpIHsKLQkJLyogV2Ugd2FudCBib3RoIElOIGFuZCBPVVQgY29udHJvbCB0cmFmZmljIHRvIGJlIHB1dCBvbiB0aGUgc2FtZSBFUC9TQiBsaXN0LiAqLwotCQlvdXRfdHJhZmZpYyA9IDE7Ci0JfSBlbHNlIHsKLQkJb3V0X3RyYWZmaWMgPSB1c2JfcGlwZW91dCh1cmItPnBpcGUpOwotCX0KLQotCXNhdmVfZmxhZ3MoZmxhZ3MpOwotCWNsaSgpOwotCi0JKlJfVVNCX0VQVF9JTkRFWCA9IElPX0ZJRUxEKFJfVVNCX0VQVF9JTkRFWCwgdmFsdWUsIGVwaWQpOwotCW5vcCgpOwotCi0JaWYgKHVzYl9waXBldHlwZSh1cmItPnBpcGUpID09IFBJUEVfSVNPQ0hST05PVVMpIHsKLQkJKlJfVVNCX0VQVF9EQVRBX0lTTyA9IElPX1NUQVRFKFJfVVNCX0VQVF9EQVRBX0lTTywgdmFsaWQsIHllcykgfAotCQkJLyogRklYTUU6IENoYW5nZSBhbnkgdG8gdGhlIGFjdHVhbCBwb3J0PyAqLwotCQkJSU9fU1RBVEUoUl9VU0JfRVBUX0RBVEFfSVNPLCBwb3J0LCBhbnkpIHwKLQkJCUlPX0ZJRUxEKFJfVVNCX0VQVF9EQVRBX0lTTywgbWF4X2xlbiwgbWF4bGVuKSB8Ci0JCQlJT19GSUVMRChSX1VTQl9FUFRfREFUQV9JU08sIGVwLCBlbmRwb2ludCkgfAotCQkJSU9fRklFTEQoUl9VU0JfRVBUX0RBVEFfSVNPLCBkZXYsIGRldm51bSk7Ci0JfSBlbHNlIHsKLQkJKlJfVVNCX0VQVF9EQVRBID0gSU9fU1RBVEUoUl9VU0JfRVBUX0RBVEEsIHZhbGlkLCB5ZXMpIHwKLQkJCUlPX0ZJRUxEKFJfVVNCX0VQVF9EQVRBLCBsb3dfc3BlZWQsIHNsb3cpIHwKLQkJCS8qIEZJWE1FOiBDaGFuZ2UgYW55IHRvIHRoZSBhY3R1YWwgcG9ydD8gKi8KLQkJCUlPX1NUQVRFKFJfVVNCX0VQVF9EQVRBLCBwb3J0LCBhbnkpIHwKLQkJCUlPX0ZJRUxEKFJfVVNCX0VQVF9EQVRBLCBtYXhfbGVuLCBtYXhsZW4pIHwKLQkJCUlPX0ZJRUxEKFJfVVNCX0VQVF9EQVRBLCBlcCwgZW5kcG9pbnQpIHwKLQkJCUlPX0ZJRUxEKFJfVVNCX0VQVF9EQVRBLCBkZXYsIGRldm51bSk7Ci0JfQotCi0JcmVzdG9yZV9mbGFncyhmbGFncyk7Ci0KLQlpZiAob3V0X3RyYWZmaWMpIHsKLQkJc2V0X2JpdChlcGlkLCAodm9pZCAqKSZlcGlkX291dF90cmFmZmljKTsKLQl9IGVsc2UgewotCQljbGVhcl9iaXQoZXBpZCwgKHZvaWQgKikmZXBpZF9vdXRfdHJhZmZpYyk7Ci0JfQotCi0JZGJnX2VwaWQoIlNldHRpbmcgdXAgZXBpZCAlZCB3aXRoIGRldm51bSAlZCwgZW5kcG9pbnQgJWQgYW5kIG1heF9sZW4gJWQgKCVzKSIsCi0JCSBlcGlkLCBkZXZudW0sIGVuZHBvaW50LCBtYXhsZW4sIG91dF90cmFmZmljID8gIk9VVCIgOiAiSU4iKTsKLQotCURCRkVYSVQ7Ci0JcmV0dXJuIGVwaWQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGV0cmF4X3VzYl9mcmVlX2VwaWQoaW50IGVwaWQpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCURCRkVOVEVSOwotCi0JaWYgKCF0ZXN0X2JpdChlcGlkLCAodm9pZCAqKSZlcGlkX3VzYWdlX2JpdG1hc2spKSB7Ci0JCXdhcm4oIlRyeWluZyB0byBmcmVlIHVudXNlZCBlcGlkICVkIiwgZXBpZCk7Ci0JCURCRkVYSVQ7Ci0JCXJldHVybjsKLQl9Ci0KLQlzYXZlX2ZsYWdzKGZsYWdzKTsKLQljbGkoKTsKLQotCSpSX1VTQl9FUFRfSU5ERVggPSBJT19GSUVMRChSX1VTQl9FUFRfSU5ERVgsIHZhbHVlLCBlcGlkKTsKLQlub3AoKTsKLQl3aGlsZSAoKlJfVVNCX0VQVF9EQVRBICYgSU9fTUFTSyhSX1VTQl9FUFRfREFUQSwgaG9sZCkpOwotCS8qIFRoaXMgd2lsbCwgYW1vbmcgb3RoZXIgdGhpbmdzLCBzZXQgdGhlIHZhbGlkIGZpZWxkIHRvIDAuICovCi0JKlJfVVNCX0VQVF9EQVRBID0gMDsKLQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKLQotCWNsZWFyX2JpdChlcGlkLCAodm9pZCAqKSZlcGlkX3VzYWdlX2JpdG1hc2spOwotCi0KLQlkYmdfZXBpZCgiRnJlZWQgZXBpZCAlZCIsIGVwaWQpOwotCi0JREJGRVhJVDsKLX0KLQotc3RhdGljIGludCBldHJheF91c2JfbG9va3VwX2VwaWQoc3RydWN0IHVyYiAqdXJiKQotewotCWludCBpOwotCV9fdTMyIGRhdGE7Ci0JY2hhciBkZXZudW0sIGVuZHBvaW50LCBzbG93LCBvdXRfdHJhZmZpYzsKLQlpbnQgbWF4bGVuOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlEQkZFTlRFUjsKLQotCWRldm51bSA9IHVzYl9waXBlZGV2aWNlKHVyYi0+cGlwZSk7Ci0JZW5kcG9pbnQgPSB1c2JfcGlwZWVuZHBvaW50KHVyYi0+cGlwZSk7Ci0Jc2xvdyA9IHVzYl9waXBlc2xvdyh1cmItPnBpcGUpOwotCW1heGxlbiA9IHVzYl9tYXhwYWNrZXQodXJiLT5kZXYsIHVyYi0+cGlwZSwgdXNiX3BpcGVvdXQodXJiLT5waXBlKSk7Ci0JaWYgKHVzYl9waXBldHlwZSh1cmItPnBpcGUpID09IFBJUEVfQ09OVFJPTCkgewotCQkvKiBXZSB3YW50IGJvdGggSU4gYW5kIE9VVCBjb250cm9sIHRyYWZmaWMgdG8gYmUgcHV0IG9uIHRoZSBzYW1lIEVQL1NCIGxpc3QuICovCi0JCW91dF90cmFmZmljID0gMTsKLQl9IGVsc2UgewotCQlvdXRfdHJhZmZpYyA9IHVzYl9waXBlb3V0KHVyYi0+cGlwZSk7Ci0JfQotCi0JLyogU3RlcCB0aHJvdWdoIGF0dCBlcGlkcy4gKi8KLQlmb3IgKGkgPSAwOyBpIDwgTkJSX09GX0VQSURTOyBpKyspIHsKLQkJaWYgKHRlc3RfYml0KGksICh2b2lkICopJmVwaWRfdXNhZ2VfYml0bWFzaykgJiYKLQkJICAgIHRlc3RfYml0KGksICh2b2lkICopJmVwaWRfb3V0X3RyYWZmaWMpID09IG91dF90cmFmZmljKSB7Ci0KLQkJCXNhdmVfZmxhZ3MoZmxhZ3MpOwotCQkJY2xpKCk7Ci0JCQkqUl9VU0JfRVBUX0lOREVYID0gSU9fRklFTEQoUl9VU0JfRVBUX0lOREVYLCB2YWx1ZSwgaSk7Ci0JCQlub3AoKTsKLQotCQkJaWYgKHVzYl9waXBldHlwZSh1cmItPnBpcGUpID09IFBJUEVfSVNPQ0hST05PVVMpIHsKLQkJCQlkYXRhID0gKlJfVVNCX0VQVF9EQVRBX0lTTzsKLQkJCQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKLQotCQkJCWlmICgoSU9fTUFTSyhSX1VTQl9FUFRfREFUQV9JU08sIHZhbGlkKSAmIGRhdGEpICYmCi0JCQkJICAgIChJT19FWFRSQUNUKFJfVVNCX0VQVF9EQVRBX0lTTywgZGV2LCBkYXRhKSA9PSBkZXZudW0pICYmCi0JCQkJICAgIChJT19FWFRSQUNUKFJfVVNCX0VQVF9EQVRBX0lTTywgZXAsIGRhdGEpID09IGVuZHBvaW50KSAmJgotCQkJCSAgICAoSU9fRVhUUkFDVChSX1VTQl9FUFRfREFUQV9JU08sIG1heF9sZW4sIGRhdGEpID09IG1heGxlbikpIHsKLQkJCQkJZGJnX2VwaWQoIkZvdW5kIGVwaWQgJWQgZm9yIGRldm51bSAlZCwgZW5kcG9pbnQgJWQgKCVzKSIsCi0JCQkJCQkgaSwgZGV2bnVtLCBlbmRwb2ludCwgb3V0X3RyYWZmaWMgPyAiT1VUIiA6ICJJTiIpOwotCQkJCQlEQkZFWElUOwotCQkJCQlyZXR1cm4gaTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWRhdGEgPSAqUl9VU0JfRVBUX0RBVEE7Ci0JCQkJcmVzdG9yZV9mbGFncyhmbGFncyk7Ci0KLQkJCQlpZiAoKElPX01BU0soUl9VU0JfRVBUX0RBVEEsIHZhbGlkKSAmIGRhdGEpICYmCi0JCQkJICAgIChJT19FWFRSQUNUKFJfVVNCX0VQVF9EQVRBLCBkZXYsIGRhdGEpID09IGRldm51bSkgJiYKLQkJCQkgICAgKElPX0VYVFJBQ1QoUl9VU0JfRVBUX0RBVEEsIGVwLCBkYXRhKSA9PSBlbmRwb2ludCkgJiYKLQkJCQkgICAgKElPX0VYVFJBQ1QoUl9VU0JfRVBUX0RBVEEsIGxvd19zcGVlZCwgZGF0YSkgPT0gc2xvdykgJiYKLQkJCQkgICAgKElPX0VYVFJBQ1QoUl9VU0JfRVBUX0RBVEEsIG1heF9sZW4sIGRhdGEpID09IG1heGxlbikpIHsKLQkJCQkJZGJnX2VwaWQoIkZvdW5kIGVwaWQgJWQgZm9yIGRldm51bSAlZCwgZW5kcG9pbnQgJWQgKCVzKSIsCi0JCQkJCQkgaSwgZGV2bnVtLCBlbmRwb2ludCwgb3V0X3RyYWZmaWMgPyAiT1VUIiA6ICJJTiIpOwotCQkJCQlEQkZFWElUOwotCQkJCQlyZXR1cm4gaTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlEQkZFWElUOwotCXJldHVybiAtMTsKLX0KLQotc3RhdGljIGludCBldHJheF91c2JfYWxsb2NhdGVfZXBpZCh2b2lkKQotewotCWludCBpOwotCi0JREJGRU5URVI7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTkJSX09GX0VQSURTOyBpKyspIHsKLQkJaWYgKCF0ZXN0X2JpdChpLCAodm9pZCAqKSZlcGlkX3VzYWdlX2JpdG1hc2spKSB7Ci0JCQlkYmdfZXBpZCgiRm91bmQgZnJlZSBlcGlkICVkIiwgaSk7Ci0JCQlEQkZFWElUOwotCQkJcmV0dXJuIGk7Ci0JCX0KLQl9Ci0KLQlkYmdfZXBpZCgiRm91bmQgbm8gZnJlZSBlcGlkcyIpOwotCURCRkVYSVQ7Ci0JcmV0dXJuIC0xOwotfQotCi1zdGF0aWMgaW50IGV0cmF4X3VzYl9zdWJtaXRfdXJiKHN0cnVjdCB1cmIgKnVyYiwgdW5zaWduZWQgbWVtX2ZsYWdzKQotewotCWV0cmF4X2hjX3QgKmhjOwotCWludCByZXQgPSAtRUlOVkFMOwotCi0JREJGRU5URVI7Ci0KLQlpZiAoIXVyYi0+ZGV2IHx8ICF1cmItPmRldi0+YnVzKSB7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQlpZiAodXNiX21heHBhY2tldCh1cmItPmRldiwgdXJiLT5waXBlLCB1c2JfcGlwZW91dCh1cmItPnBpcGUpKSA8PSAwKSB7Ci0JCWluZm8oIlN1Ym1pdCB1cmIgdG8gcGlwZSB3aXRoIG1heHBhY2tldGxlbiAwLCBwaXBlIDB4JVhcbiIsIHVyYi0+cGlwZSk7Ci0JCXJldHVybiAtRU1TR1NJWkU7Ci0JfQotCi0JaWYgKHVyYi0+dGltZW91dCkgewotCQkvKiBGSVhNRS4gKi8KLQkJd2FybigidXJiLT50aW1lb3V0IHNwZWNpZmllZCwgaWdub3JpbmcuIik7Ci0JfQotCi0JaGMgPSAoZXRyYXhfaGNfdCopdXJiLT5kZXYtPmJ1cy0+aGNwcml2OwotCi0JaWYgKHVzYl9waXBlZGV2aWNlKHVyYi0+cGlwZSkgPT0gaGMtPnJoLmRldm51bSkgewotCQkvKiBUaGlzIHJlcXVlc3QgaXMgZm9yIHRoZSBWaXJ0dWFsIFJvb3QgSHViLiAqLwotCQlyZXQgPSBldHJheF9yaF9zdWJtaXRfdXJiKHVyYik7Ci0KLQl9IGVsc2UgaWYgKHVzYl9waXBldHlwZSh1cmItPnBpcGUpID09IFBJUEVfQlVMSykgewotCi0JCXJldCA9IGV0cmF4X3VzYl9zdWJtaXRfYnVsa191cmIodXJiKTsKLQotCX0gZWxzZSBpZiAodXNiX3BpcGV0eXBlKHVyYi0+cGlwZSkgPT0gUElQRV9DT05UUk9MKSB7Ci0KLQkJcmV0ID0gZXRyYXhfdXNiX3N1Ym1pdF9jdHJsX3VyYih1cmIpOwotCi0JfSBlbHNlIGlmICh1c2JfcGlwZXR5cGUodXJiLT5waXBlKSA9PSBQSVBFX0lOVEVSUlVQVCkgewotCQlpbnQgYnVzdGltZTsKLQotCQlpZiAodXJiLT5iYW5kd2lkdGggPT0gMCkgewotCQkJYnVzdGltZSA9IHVzYl9jaGVja19iYW5kd2lkdGgodXJiLT5kZXYsIHVyYik7Ci0JCQlpZiAoYnVzdGltZSA8IDApIHsKLQkJCQlyZXQgPSBidXN0aW1lOwotCQkJfSBlbHNlIHsKLQkJCQlyZXQgPSBldHJheF91c2Jfc3VibWl0X2ludHJfdXJiKHVyYik7Ci0JCQkJaWYgKHJldCA9PSAwKQotCQkJCQl1c2JfY2xhaW1fYmFuZHdpZHRoKHVyYi0+ZGV2LCB1cmIsIGJ1c3RpbWUsIDApOwotCQkJfQotCQl9IGVsc2UgewotCQkJLyogQmFuZHdpZHRoIGFscmVhZHkgc2V0LiAqLwotCQkJcmV0ID0gZXRyYXhfdXNiX3N1Ym1pdF9pbnRyX3VyYih1cmIpOwotCQl9Ci0KLQl9IGVsc2UgaWYgKHVzYl9waXBldHlwZSh1cmItPnBpcGUpID09IFBJUEVfSVNPQ0hST05PVVMpIHsKLQkJaW50IGJ1c3RpbWU7Ci0KLQkJaWYgKHVyYi0+YmFuZHdpZHRoID09IDApIHsKLQkJCWJ1c3RpbWUgPSB1c2JfY2hlY2tfYmFuZHdpZHRoKHVyYi0+ZGV2LCB1cmIpOwotCQkJaWYgKGJ1c3RpbWUgPCAwKSB7Ci0JCQkJcmV0ID0gYnVzdGltZTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0ID0gZXRyYXhfdXNiX3N1Ym1pdF9pc29jX3VyYih1cmIpOwotCQkJCWlmIChyZXQgPT0gMCkKLQkJCQkJdXNiX2NsYWltX2JhbmR3aWR0aCh1cmItPmRldiwgdXJiLCBidXN0aW1lLCAwKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCS8qIEJhbmR3aWR0aCBhbHJlYWR5IHNldC4gKi8KLQkJCXJldCA9IGV0cmF4X3VzYl9zdWJtaXRfaXNvY191cmIodXJiKTsKLQkJfQotCX0KLQotCURCRkVYSVQ7Ci0KLSAgICAgICAgaWYgKHJldCAhPSAwKQotICAgICAgICAgIHByaW50aygiU3VibWl0IFVSQiBlcnJvciAlZFxuIiwgcmV0KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgZXRyYXhfdXNiX3VubGlua191cmIoc3RydWN0IHVyYiAqdXJiLCBpbnQgc3RhdHVzKQotewotCWV0cmF4X2hjX3QgKmhjOwotCWV0cmF4X3VyYl9wcml2X3QgKnVyYl9wcml2OwotCWludCBlcGlkOwotCXVuc2lnbmVkIGludCBmbGFnczsKLQotCURCRkVOVEVSOwotCi0JaWYgKCF1cmIpIHsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGhlcmUgc2luY2UgYSBkZXNjcmlwdG9yIGludGVycnVwdCBmb3IgdGhlIGlzb2MgZXBpZAotCSAgIHdpbGwgbW9kaWZ5IHRoZSBzYiBsaXN0LiAgVGhpcyBjb3VsZCBwb3NzaWJseSBiZSBkb25lIG1vcmUgZ3JhbnVsYXIsIGJ1dAotCSAgIHVubGlua191cmIgc2hvdWxkIG5vdCBiZSB1c2VkIGZyZXF1ZW50bHkgYW55d2F5LgotCSovCi0KLQlzYXZlX2ZsYWdzKGZsYWdzKTsKLQljbGkoKTsKLQotCWlmICghdXJiLT5kZXYgfHwgIXVyYi0+ZGV2LT5idXMpIHsKLQkJcmVzdG9yZV9mbGFncyhmbGFncyk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQlpZiAoIXVyYi0+aGNwcml2KSB7Ci0JCS8qIFRoaXMgaGFwcGVucyBpZiBhIGRldmljZSBkcml2ZXIgY2FsbHMgdW5saW5rIG9uIGFuIHVyYiB0aGF0Ci0JCSAgIHdhcyBuZXZlciBzdWJtaXR0ZWQgKGxhenkgZHJpdmVyKSBvciBpZiB0aGUgdXJiIHdhcyBjb21wbGV0ZWQKLQkJICAgd2hpbGUgdW5saW5rIHdhcyBiZWluZyBjYWxsZWQuICovCi0JCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKHVyYi0+dHJhbnNmZXJfZmxhZ3MgJiBVUkJfQVNZTkNfVU5MSU5LKSB7Ci0JCS8qIEZJWE1FLiAqLwotCQkvKiBJZiBVUkJfQVNZTkNfVU5MSU5LIGlzIHNldDoKLQkJICAgdW5saW5rCi0JCSAgIG1vdmUgdG8gYSBzZXBhcmF0ZSB1cmIgbGlzdAotCQkgICBjYWxsIGNvbXBsZXRlIGF0IG5leHQgc29mIHdpdGggRUNPTk5SRVNFVAotCi0JCSAgIElmIG5vdDoKLQkJICAgd2FpdCAxIG1zCi0JCSAgIHVubGluawotCQkgICBjYWxsIGNvbXBsZXRlIHdpdGggRU5PRU5UCi0JCSovCi0JCXdhcm4oIlVSQl9BU1lOQ19VTkxJTksgc2V0LCBpZ25vcmluZy4iKTsKLQl9Ci0KLQkvKiBPbmUgbWlnaHQgdGhpbmsgdGhhdCB1cmItPnN0YXR1cyA9IC1FSU5QUk9HUkVTUyB3b3VsZCBiZSBhIHJlcXVpcmVtZW50IGZvciB1bmxpbmtpbmcsCi0JICAgYnV0IHRoYXQgZG9lc24ndCB3b3JrIGZvciBpbnRlcnJ1cHQgYW5kIGlzb2Nocm9ub3VzIHRyYWZmaWMgc2luY2UgdGhleSBhcmUgY29tcGxldGVkCi0JICAgcmVwZWF0ZWRseSwgYW5kIHVyYi0+c3RhdHVzIGlzIHNldCB0aGVuLiBUaGF0IG1heSBpbiBpdHNlbGYgYmUgYSBidWcgdGhvdWdoLiAqLwotCi0JaGMgPSB1cmItPmRldi0+YnVzLT5oY3ByaXY7Ci0JdXJiX3ByaXYgPSAoZXRyYXhfdXJiX3ByaXZfdCAqKXVyYi0+aGNwcml2OwotCWVwaWQgPSB1cmJfcHJpdi0+ZXBpZDsKLQotCS8qIFNldCB0aGUgdXJiIHN0YXR1cyAoc3luY2hyb25vdXMgdW5saW5rKS4gKi8KLQl1cmItPnN0YXR1cyA9IC1FTk9FTlQ7Ci0JdXJiX3ByaXYtPnVyYl9zdGF0ZSA9IFVOTElOSzsKLQotCWlmICh1c2JfcGlwZWRldmljZSh1cmItPnBpcGUpID09IGhjLT5yaC5kZXZudW0pIHsKLQkJaW50IHJldDsKLQkJcmV0ID0gZXRyYXhfcmhfdW5saW5rX3VyYih1cmIpOwotCQlEQkZFWElUOwotCQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKLQkJcmV0dXJuIHJldDsKLQotCX0gZWxzZSBpZiAodXNiX3BpcGV0eXBlKHVyYi0+cGlwZSkgPT0gUElQRV9CVUxLKSB7Ci0KLQkJZGJnX2J1bGsoIlVubGluayBvZiBidWxrIHVyYiAoMHglbHgpIiwgKHVuc2lnbmVkIGxvbmcpdXJiKTsKLQotCQlpZiAoVHhCdWxrRVBMaXN0W2VwaWRdLmNvbW1hbmQgJiBJT19NQVNLKFVTQl9FUF9jb21tYW5kLCBlbmFibGUpKSB7Ci0JCQkvKiBUaGUgRVAgd2FzIGVuYWJsZWQsIGRpc2FibGUgaXQgYW5kIHdhaXQuICovCi0JCQlUeEJ1bGtFUExpc3RbZXBpZF0uY29tbWFuZCAmPSB+SU9fTUFTSyhVU0JfRVBfY29tbWFuZCwgZW5hYmxlKTsKLQotCQkJLyogQWgsIHRoZSBsdXh1cnkgb2YgYnVzeS13YWl0LiAqLwotCQkJd2hpbGUgKCpSX0RNQV9DSDhfU1VCMF9FUCA9PSB2aXJ0X3RvX3BoeXMoJlR4QnVsa0VQTGlzdFtlcGlkXSkpOwotCQl9Ci0JCS8qIEtpY2tpbmcgZHVtbXkgbGlzdCBvdXQgb2YgdGhlIHBhcnR5LiAqLwotCQlUeEJ1bGtFUExpc3RbZXBpZF0ubmV4dCA9IHZpcnRfdG9fcGh5cygmVHhCdWxrRVBMaXN0WyhlcGlkICsgMSkgJSBOQlJfT0ZfRVBJRFNdKTsKLQotCX0gZWxzZSBpZiAodXNiX3BpcGV0eXBlKHVyYi0+cGlwZSkgPT0gUElQRV9DT05UUk9MKSB7Ci0KLQkJZGJnX2N0cmwoIlVubGluayBvZiBjdHJsIHVyYiAoMHglbHgpIiwgKHVuc2lnbmVkIGxvbmcpdXJiKTsKLQotCQlpZiAoVHhDdHJsRVBMaXN0W2VwaWRdLmNvbW1hbmQgJiBJT19NQVNLKFVTQl9FUF9jb21tYW5kLCBlbmFibGUpKSB7Ci0JCQkvKiBUaGUgRVAgd2FzIGVuYWJsZWQsIGRpc2FibGUgaXQgYW5kIHdhaXQuICovCi0JCQlUeEN0cmxFUExpc3RbZXBpZF0uY29tbWFuZCAmPSB+SU9fTUFTSyhVU0JfRVBfY29tbWFuZCwgZW5hYmxlKTsKLQotCQkJLyogQWgsIHRoZSBsdXh1cnkgb2YgYnVzeS13YWl0LiAqLwotCQkJd2hpbGUgKCpSX0RNQV9DSDhfU1VCMV9FUCA9PSB2aXJ0X3RvX3BoeXMoJlR4Q3RybEVQTGlzdFtlcGlkXSkpOwotCQl9Ci0KLQl9IGVsc2UgaWYgKHVzYl9waXBldHlwZSh1cmItPnBpcGUpID09IFBJUEVfSU5URVJSVVBUKSB7Ci0KLQkJZGJnX2ludHIoIlVubGluayBvZiBpbnRyIHVyYiAoMHglbHgpIiwgKHVuc2lnbmVkIGxvbmcpdXJiKTsKLQotCQkvKiBTZXBhcmF0ZSBmdW5jdGlvbiBiZWNhdXNlIGl0J3MgYSB0YWQgbW9yZSBjb21wbGljYXRlZC4gKi8KLQkJZXRyYXhfdXNiX3VubGlua19pbnRyX3VyYih1cmIpOwotCi0JfSBlbHNlIGlmICh1c2JfcGlwZXR5cGUodXJiLT5waXBlKSA9PSBQSVBFX0lTT0NIUk9OT1VTKSB7Ci0KLQkJZGJnX2lzb2MoIlVubGluayBvZiBpc29jIHVyYiAoMHglbHgpIiwgKHVuc2lnbmVkIGxvbmcpdXJiKTsKLQotCQlpZiAoVHhJc29jRVBMaXN0W2VwaWRdLmNvbW1hbmQgJiBJT19NQVNLKFVTQl9FUF9jb21tYW5kLCBlbmFibGUpKSB7Ci0JCQkvKiBUaGUgRVAgd2FzIGVuYWJsZWQsIGRpc2FibGUgaXQgYW5kIHdhaXQuICovCi0JCQlUeElzb2NFUExpc3RbZXBpZF0uY29tbWFuZCAmPSB+SU9fTUFTSyhVU0JfRVBfY29tbWFuZCwgZW5hYmxlKTsKLQotCQkJLyogQWgsIHRoZSBsdXh1cnkgb2YgYnVzeS13YWl0LiAqLwotCQkJd2hpbGUgKCpSX0RNQV9DSDhfU1VCM19FUCA9PSB2aXJ0X3RvX3BoeXMoJlR4SXNvY0VQTGlzdFtlcGlkXSkpOwotCQl9Ci0JfQotCi0JLyogTm90ZSB0aGF0IHdlIG5lZWQgdG8gcmVtb3ZlIHRoZSB1cmIgZnJvbSB0aGUgdXJiIGxpc3QgKmJlZm9yZSogcmVtb3ZpbmcgaXRzIFNCCi0JICAgZGVzY3JpcHRvcnMuIChUaGlzIG1lYW5zIHRoYXQgdGhlIGlzb2MgZW9mIGhhbmRsZXIgbWlnaHQgZ2V0IGEgbnVsbCB1cmIgd2hlbiB3ZQotCSAgIGFyZSB1bmxpbmtpbmcgdGhlIGxhc3QgdXJiLikgKi8KLQotCWlmICh1c2JfcGlwZXR5cGUodXJiLT5waXBlKSA9PSBQSVBFX0JVTEspIHsKLQotCQl1cmJfbGlzdF9kZWwodXJiLCBlcGlkKTsKLQkJVHhCdWxrRVBMaXN0W2VwaWRdLnN1YiA9IDA7Ci0JCWV0cmF4X3JlbW92ZV9mcm9tX3NiX2xpc3QodXJiKTsKLQotCX0gZWxzZSBpZiAodXNiX3BpcGV0eXBlKHVyYi0+cGlwZSkgPT0gUElQRV9DT05UUk9MKSB7Ci0KLQkJdXJiX2xpc3RfZGVsKHVyYiwgZXBpZCk7Ci0JCVR4Q3RybEVQTGlzdFtlcGlkXS5zdWIgPSAwOwotCQlldHJheF9yZW1vdmVfZnJvbV9zYl9saXN0KHVyYik7Ci0KLQl9IGVsc2UgaWYgKHVzYl9waXBldHlwZSh1cmItPnBpcGUpID09IFBJUEVfSU5URVJSVVBUKSB7Ci0KLQkJdXJiX2xpc3RfZGVsKHVyYiwgZXBpZCk7Ci0JCS8qIFNhbml0eSBjaGVjayAoc2hvdWxkIG5ldmVyIGhhcHBlbikuICovCi0JCWFzc2VydCh1cmJfbGlzdF9lbXB0eShlcGlkKSk7Ci0KLQkJLyogUmVsZWFzZSBhbGxvY2F0ZWQgYmFuZHdpZHRoLiAqLwotCQl1c2JfcmVsZWFzZV9iYW5kd2lkdGgodXJiLT5kZXYsIHVyYiwgMCk7Ci0KLQl9IGVsc2UgaWYgKHVzYl9waXBldHlwZSh1cmItPnBpcGUpID09IFBJUEVfSVNPQ0hST05PVVMpIHsKLQotCQlpZiAodXNiX3BpcGVvdXQodXJiLT5waXBlKSkgewotCi0JCQlVU0JfU0JfRGVzY190ICppdGVyX3NiLCAqcHJldl9zYiwgKm5leHRfc2I7Ci0KLQkJCWlmIChfX3VyYl9saXN0X2VudHJ5KHVyYiwgZXBpZCkpIHsKLQotCQkJCXVyYl9saXN0X2RlbCh1cmIsIGVwaWQpOwotCQkJCWl0ZXJfc2IgPSBUeElzb2NFUExpc3RbZXBpZF0uc3ViID8gcGh5c190b192aXJ0KFR4SXNvY0VQTGlzdFtlcGlkXS5zdWIpIDogMDsKLQkJCQlwcmV2X3NiID0gMDsKLQkJCQl3aGlsZSAoaXRlcl9zYiAmJiAoaXRlcl9zYiAhPSB1cmJfcHJpdi0+Zmlyc3Rfc2IpKSB7Ci0JCQkJCXByZXZfc2IgPSBpdGVyX3NiOwotCQkJCQlpdGVyX3NiID0gaXRlcl9zYi0+bmV4dCA/IHBoeXNfdG9fdmlydChpdGVyX3NiLT5uZXh0KSA6IDA7Ci0JCQkJfQotCi0JCQkJaWYgKGl0ZXJfc2IgPT0gMCkgewotCQkJCQkvKiBVbmxpbmsgb2YgdGhlIFVSQiBjdXJyZW50bHkgYmVpbmcgdHJhbnNtaXR0ZWQuICovCi0JCQkJCXByZXZfc2IgPSAwOwotCQkJCQlpdGVyX3NiID0gVHhJc29jRVBMaXN0W2VwaWRdLnN1YiA/IHBoeXNfdG9fdmlydChUeElzb2NFUExpc3RbZXBpZF0uc3ViKSA6IDA7Ci0JCQkJfQotCi0JCQkJd2hpbGUgKGl0ZXJfc2IgJiYgKGl0ZXJfc2IgIT0gdXJiX3ByaXYtPmxhc3Rfc2IpKSB7Ci0JCQkJCWl0ZXJfc2IgPSBpdGVyX3NiLT5uZXh0ID8gcGh5c190b192aXJ0KGl0ZXJfc2ItPm5leHQpIDogMDsKLQkJCQl9Ci0JCQkJaWYgKGl0ZXJfc2IpIHsKLQkJCQkJbmV4dF9zYiA9IGl0ZXJfc2ItPm5leHQgPyBwaHlzX3RvX3ZpcnQoaXRlcl9zYi0+bmV4dCkgOiAwOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8qIFRoaXMgc2hvdWxkIG9ubHkgaGFwcGVuIGlmIHRoZSBETUEgaGFzIGNvbXBsZXRlZAotCQkJCQkgICBwcm9jZXNzaW5nIHRoZSBTQiBsaXN0IGZvciB0aGlzIEVQIHdoaWxlIGludGVycnVwdHMKLQkJCQkJICAgYXJlIGRpc2FibGVkLiAqLwotCQkJCQlkYmdfaXNvYygiSXNvYyB1cmIgbm90IGZvdW5kLCBhbHJlYWR5IHNlbnQ/Iik7Ci0JCQkJCW5leHRfc2IgPSAwOwotCQkJCX0KLQkJCQlpZiAocHJldl9zYikgewotCQkJCQlwcmV2X3NiLT5uZXh0ID0gbmV4dF9zYiA/IHZpcnRfdG9fcGh5cyhuZXh0X3NiKSA6IDA7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJVHhJc29jRVBMaXN0W2VwaWRdLnN1YiA9IG5leHRfc2IgPyB2aXJ0X3RvX3BoeXMobmV4dF9zYikgOiAwOwotCQkJCX0KLQotCQkJCWV0cmF4X3JlbW92ZV9mcm9tX3NiX2xpc3QodXJiKTsKLQkJCQlpZiAodXJiX2xpc3RfZW1wdHkoZXBpZCkpIHsKLQkJCQkJVHhJc29jRVBMaXN0W2VwaWRdLnN1YiA9IDA7Ci0JCQkJCWRiZ19pc29jKCJMYXN0IGlzb2Mgb3V0IHVyYiBlcGlkICVkIiwgZXBpZCk7Ci0JCQkJfSBlbHNlIGlmIChuZXh0X3NiIHx8IHByZXZfc2IpIHsKLQkJCQkJZGJnX2lzb2MoIlJlLWVuYWJsZSBpc29jIG91dCBlcGlkICVkIiwgZXBpZCk7Ci0KLQkJCQkJVHhJc29jRVBMaXN0W2VwaWRdLmh3X2xlbiA9IDA7Ci0JCQkJCVR4SXNvY0VQTGlzdFtlcGlkXS5jb21tYW5kIHw9IElPX1NUQVRFKFVTQl9FUF9jb21tYW5kLCBlbmFibGUsIHllcyk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJVHhJc29jRVBMaXN0W2VwaWRdLnN1YiA9IDA7Ci0JCQkJCWRiZ19pc29jKCJVUkIgbGlzdCBub24tZW1wdHkgYW5kIG5vIFNCIGxpc3QsIEVQIGRpc2FibGVkIik7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlkYmdfaXNvYygiVXJiIDB4JXAgbm90IGZvdW5kLCBjb21wbGV0ZWQgYWxyZWFkeT8iLCB1cmIpOwotCQkJfQotCQl9IGVsc2UgewotCi0JCQl1cmJfbGlzdF9kZWwodXJiLCBlcGlkKTsKLQotCQkJLyogRm9yIGluIHRyYWZmaWMgdGhlcmUgaXMgb25seSBvbmUgU0IgZGVzY3JpcHRvciBmb3IgZWFjaCBFUCBldmVuCi0JCQkgICB0aG91Z2ggdGhlcmUgbWF5IGJlIHNldmVyYWwgdXJicyAoYWxsIHVyYnMgcG9pbnQgYXQgdGhlIHNhbWUgU0IpLiAqLwotCQkJaWYgKHVyYl9saXN0X2VtcHR5KGVwaWQpKSB7Ci0JCQkJLyogTm8gbW9yZSB1cmJzLCByZW1vdmUgdGhlIFNCLiAqLwotCQkJCVR4SXNvY0VQTGlzdFtlcGlkXS5zdWIgPSAwOwotCQkJCWV0cmF4X3JlbW92ZV9mcm9tX3NiX2xpc3QodXJiKTsKLQkJCX0gZWxzZSB7Ci0JCQkJVHhJc29jRVBMaXN0W2VwaWRdLmh3X2xlbiA9IDA7Ci0JCQkJVHhJc29jRVBMaXN0W2VwaWRdLmNvbW1hbmQgfD0gSU9fU1RBVEUoVVNCX0VQX2NvbW1hbmQsIGVuYWJsZSwgeWVzKTsKLQkJCX0KLQkJfQotCQkvKiBSZWxlYXNlIGFsbG9jYXRlZCBiYW5kd2lkdGguICovCi0JCXVzYl9yZWxlYXNlX2JhbmR3aWR0aCh1cmItPmRldiwgdXJiLCAxKTsKLQl9Ci0JLyogRnJlZSB0aGUgZXBpZCBpZiB1cmIgbGlzdCBpcyBlbXB0eS4gKi8KLQlpZiAodXJiX2xpc3RfZW1wdHkoZXBpZCkpIHsKLQkJZXRyYXhfdXNiX2ZyZWVfZXBpZChlcGlkKTsKLQl9Ci0JcmVzdG9yZV9mbGFncyhmbGFncyk7Ci0KLQkvKiBNdXN0IGJlIGRvbmUgYmVmb3JlIGNhbGxpbmcgY29tcGxldGlvbiBoYW5kbGVyLiAqLwotCWtmcmVlKHVyYl9wcml2KTsKLQl1cmItPmhjcHJpdiA9IDA7Ci0KLQlpZiAodXJiLT5jb21wbGV0ZSkgewotCQl1cmItPmNvbXBsZXRlKHVyYiwgTlVMTCk7Ci0JfQotCi0JREJGRVhJVDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBldHJheF91c2JfZ2V0X2ZyYW1lX251bWJlcihzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldikKLXsKLQlEQkZFTlRFUjsKLQlEQkZFWElUOwotCXJldHVybiAoKlJfVVNCX0ZNX05VTUJFUiAmIDB4N2ZmKTsKLX0KLQotc3RhdGljIGlycXJldHVybl90IGV0cmF4X3VzYl90eF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqdmhjKQotewotCURCRkVOVEVSOwotCi0JLyogVGhpcyBpbnRlcnJ1cHQgaGFuZGxlciBjb3VsZCBiZSB1c2VkIHdoZW4gdW5saW5raW5nIEVQIGRlc2NyaXB0b3JzLiAqLwotCi0JaWYgKCpSX0lSUV9SRUFEMiAmIElPX01BU0soUl9JUlFfUkVBRDIsIGRtYThfc3ViMF9kZXNjcikpIHsKLQkJVVNCX0VQX0Rlc2NfdCAqZXA7Ci0KLQkJLy9kYmdfYnVsaygiZG1hOF9zdWIwX2Rlc2NyIChCVUxLKSBpbnRyLiIpOwotCi0JCS8qIEl0IHNob3VsZCBiZSBzYWZlIGNsZWFyaW5nIHRoZSBpbnRlcnJ1cHQgaGVyZSwgc2luY2Ugd2UgZG9uJ3QgZXhwZWN0IHRvIGdldCBhIG5ldwotCQkgICBvbmUgdW50aWwgd2UgcmVzdGFydCB0aGUgYnVsayBjaGFubmVsLiAqLwotCQkqUl9ETUFfQ0g4X1NVQjBfQ0xSX0lOVFIgPSBJT19TVEFURShSX0RNQV9DSDhfU1VCMF9DTFJfSU5UUiwgY2xyX2Rlc2NyLCBkbyk7Ci0KLQkJLyogV2FpdCB3aGlsZSB0aGUgRE1BIGlzIHJ1bm5pbmcgKHRob3VnaCB3ZSBkb24ndCBleHBlY3QgaXQgdG8gYmUpLiAqLwotCQl3aGlsZSAoKlJfRE1BX0NIOF9TVUIwX0NNRCAmIElPX01BU0soUl9ETUFfQ0g4X1NVQjBfQ01ELCBjbWQpKTsKLQotCQkvKiBBZHZhbmNlIHRoZSBETUEgdG8gdGhlIG5leHQgRVAgZGVzY3JpcHRvci4gKi8KLQkJZXAgPSAoVVNCX0VQX0Rlc2NfdCAqKXBoeXNfdG9fdmlydCgqUl9ETUFfQ0g4X1NVQjBfRVApOwotCi0JCS8vZGJnX2J1bGsoImRlc2NyIGludHI6IERNQSBpcyBhdCAweCVseCIsICh1bnNpZ25lZCBsb25nKWVwKTsKLQotCQkvKiBlcC0+bmV4dCBpcyBhbHJlYWR5IGEgcGh5c2ljYWwgYWRkcmVzczsgbm8gbmVlZCBmb3IgYSB2aXJ0X3RvX3BoeXMuICovCi0JCSpSX0RNQV9DSDhfU1VCMF9FUCA9IGVwLT5uZXh0OwotCi0JCS8qIFN0YXJ0IHRoZSBETUEgYnVsayBjaGFubmVsIGFnYWluLiAqLwotCQkqUl9ETUFfQ0g4X1NVQjBfQ01EID0gSU9fU1RBVEUoUl9ETUFfQ0g4X1NVQjBfQ01ELCBjbWQsIHN0YXJ0KTsKLQl9Ci0JaWYgKCpSX0lSUV9SRUFEMiAmIElPX01BU0soUl9JUlFfUkVBRDIsIGRtYThfc3ViMV9kZXNjcikpIHsKLQkJc3RydWN0IHVyYiAqdXJiOwotCQlpbnQgZXBpZDsKLQkJZXRyYXhfdXJiX3ByaXZfdCAqdXJiX3ByaXY7Ci0JCXVuc2lnbmVkIGxvbmcgaW50IGZsYWdzOwotCi0JCWRiZ19jdHJsKCJkbWE4X3N1YjFfZGVzY3IgKENUUkwpIGludHIuIik7Ci0JCSpSX0RNQV9DSDhfU1VCMV9DTFJfSU5UUiA9IElPX1NUQVRFKFJfRE1BX0NIOF9TVUIxX0NMUl9JTlRSLCBjbHJfZGVzY3IsIGRvKTsKLQotCQkvKiBUaGUgY29tcGxldGUgY2FsbGJhY2sgZ2V0cyBjYWxsZWQgc28gd2UgY2xpLiAqLwotCQlzYXZlX2ZsYWdzKGZsYWdzKTsKLQkJY2xpKCk7Ci0KLQkJZm9yIChlcGlkID0gMDsgZXBpZCA8IE5CUl9PRl9FUElEUyAtIDE7IGVwaWQrKykgewotCQkJaWYgKChUeEN0cmxFUExpc3RbZXBpZF0uc3ViID09IDApIHx8Ci0JCQkgICAgKGVwaWQgPT0gRFVNTVlfRVBJRCkgfHwKLQkJCSAgICAoZXBpZCA9PSBJTlZBTElEX0VQSUQpKSB7Ci0JCQkJLyogTm90aGluZyBoZXJlIHRvIHNlZS4gKi8KLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJLyogR2V0IHRoZSBmaXJzdCB1cmIgKGlmIGFueSkuICovCi0JCQl1cmIgPSB1cmJfbGlzdF9maXJzdChlcGlkKTsKLQotCQkJaWYgKHVyYikgewotCi0JCQkJLyogU2FuaXR5IGNoZWNrLiAqLwotCQkJCWFzc2VydCh1c2JfcGlwZXR5cGUodXJiLT5waXBlKSA9PSBQSVBFX0NPTlRST0wpOwotCi0JCQkJdXJiX3ByaXYgPSAoZXRyYXhfdXJiX3ByaXZfdCAqKXVyYi0+aGNwcml2OwotCQkJCWFzc2VydCh1cmJfcHJpdik7Ci0KLQkJCQlpZiAodXJiX3ByaXYtPnVyYl9zdGF0ZSA9PSBXQUlUSU5HX0ZPUl9ERVNDUl9JTlRSKSB7Ci0JCQkJCWFzc2VydCghKFR4Q3RybEVQTGlzdFt1cmJfcHJpdi0+ZXBpZF0uY29tbWFuZCAmIElPX01BU0soVVNCX0VQX2NvbW1hbmQsIGVuYWJsZSkpKTsKLQotCQkJCQlldHJheF91c2JfY29tcGxldGVfdXJiKHVyYiwgMCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOwotCX0KLQlpZiAoKlJfSVJRX1JFQUQyICYgSU9fTUFTSyhSX0lSUV9SRUFEMiwgZG1hOF9zdWIyX2Rlc2NyKSkgewotCQlkYmdfaW50cigiZG1hOF9zdWIyX2Rlc2NyIChJTlRSKSBpbnRyLiIpOwotCQkqUl9ETUFfQ0g4X1NVQjJfQ0xSX0lOVFIgPSBJT19TVEFURShSX0RNQV9DSDhfU1VCMl9DTFJfSU5UUiwgY2xyX2Rlc2NyLCBkbyk7Ci0JfQotCWlmICgqUl9JUlFfUkVBRDIgJiBJT19NQVNLKFJfSVJRX1JFQUQyLCBkbWE4X3N1YjNfZGVzY3IpKSB7Ci0JCXN0cnVjdCB1cmIgKnVyYjsKLQkJaW50IGVwaWQ7Ci0JCWludCBlcGlkX2RvbmU7Ci0JCWV0cmF4X3VyYl9wcml2X3QgKnVyYl9wcml2OwotCQlVU0JfU0JfRGVzY190ICpzYl9kZXNjOwotCi0JCXVzYl9pc29jX2NvbXBsZXRlX2RhdGFfdCAqY29tcF9kYXRhID0gTlVMTDsKLQotCQkvKiBPbmUgb3IgbW9yZSBpc29jIG91dCB0cmFuc2ZlcnMgYXJlIGRvbmUuICovCi0JCWRiZ19pc29jKCJkbWE4X3N1YjNfZGVzY3IgKElTT0MpIGludHIuIik7Ci0KLQkJLyogRm9yIGVhY2ggaXNvYyBvdXQgRVAgc2VhcmNoIGZvciB0aGUgZmlyc3Qgc2JfZGVzYyB3aXRoIHRoZSBpbnRyIGZsYWcKLQkJICAgc2V0LiAgVGhpcyBkZXNjcmlwdG9yIG11c3QgYmUgdGhlIGxhc3QgcGFja2V0IGZyb20gYW4gVVJCLiAgVGhlbgotCQkgICB0cmF2ZXJzZSB0aGUgVVJCIGxpc3QgZm9yIHRoZSBFUCB1bnRpbCB0aGUgVVJCIHdpdGggdXJiX3ByaXYtPmxhc3Rfc2IKLQkJICAgbWF0Y2hpbmcgdGhlIGludHItbWFya2VkIHNiX2Rlc2MgaXMgZm91bmQuICBBbGwgVVJCcyBiZWZvcmUgdGhpcyBoYXZlCi0JCSAgIGJlZW4gc2VudC4KLQkJKi8KLQotCQlmb3IgKGVwaWQgPSAwOyBlcGlkIDwgTkJSX09GX0VQSURTIC0gMTsgZXBpZCsrKSB7Ci0JCQkvKiBTa2lwIHBhc3QgZXBpZHMgd2l0aCBubyBTQiBsaXN0cywgZXBpZHMgdXNlZCBmb3IgaW4gdHJhZmZpYywKLQkJCSAgIGFuZCBzcGVjaWFsIChkdW1teSwgaW52YWxpZCkgZXBpZHMuICovCi0JCQlpZiAoKFR4SXNvY0VQTGlzdFtlcGlkXS5zdWIgPT0gMCkgfHwKLQkJCSAgICAodGVzdF9iaXQoZXBpZCwgKHZvaWQgKikmZXBpZF9vdXRfdHJhZmZpYykgPT0gMCkgfHwKLQkJCSAgICAoZXBpZCA9PSBEVU1NWV9FUElEKSB8fAotCQkJICAgIChlcGlkID09IElOVkFMSURfRVBJRCkpIHsKLQkJCQkvKiBOb3RoaW5nIGhlcmUgdG8gc2VlLiAqLwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJc2JfZGVzYyA9IHBoeXNfdG9fdmlydChUeElzb2NFUExpc3RbZXBpZF0uc3ViKTsKLQotCQkJLyogRmluZCB0aGUgbGFzdCBkZXNjcmlwdG9yIG9mIHRoZSBjdXJyZW50bHkgYWN0aXZlIFVSQiBmb3IgdGhpcyBlcC4KLQkJCSAgIFRoaXMgaXMgdGhlIGZpcnN0IGRlc2NyaXB0b3IgaW4gdGhlIHN1YiBsaXN0IG1hcmtlZCBmb3IgYSBkZXNjcmlwdG9yCi0JCQkgICBpbnRlcnJ1cHQuICovCi0JCQl3aGlsZSAoc2JfZGVzYyAmJiAhSU9fRVhUUkFDVChVU0JfU0JfY29tbWFuZCwgaW50ciwgc2JfZGVzYy0+Y29tbWFuZCkpIHsKLQkJCQlzYl9kZXNjID0gc2JfZGVzYy0+bmV4dCA/IHBoeXNfdG9fdmlydChzYl9kZXNjLT5uZXh0KSA6IDA7Ci0JCQl9Ci0JCQlhc3NlcnQoc2JfZGVzYyk7Ci0KLQkJCWRiZ19pc29jKCJDaGVjayBlcGlkICVkLCBzdWIgMHglcCwgU0IgMHglcCIsCi0JCQkJIGVwaWQsCi0JCQkJIHBoeXNfdG9fdmlydChUeElzb2NFUExpc3RbZXBpZF0uc3ViKSwKLQkJCQkgc2JfZGVzYyk7Ci0KLQkJCWVwaWRfZG9uZSA9IDA7Ci0KLQkJCS8qIEdldCB0aGUgZmlyc3QgdXJiIChpZiBhbnkpLiAqLwotCQkJdXJiID0gdXJiX2xpc3RfZmlyc3QoZXBpZCk7Ci0JCQlhc3NlcnQodXJiKTsKLQotCQkJd2hpbGUgKHVyYiAmJiAhZXBpZF9kb25lKSB7Ci0KLQkJCQkvKiBTYW5pdHkgY2hlY2suICovCi0JCQkJYXNzZXJ0KHVzYl9waXBldHlwZSh1cmItPnBpcGUpID09IFBJUEVfSVNPQ0hST05PVVMpOwotCi0JCQkJaWYgKCF1c2JfcGlwZW91dCh1cmItPnBpcGUpKSB7Ci0JCQkJCS8qIGRlc2NyIGludGVycnVwdHMgYXJlIGdlbmVyYXRlZCBvbmx5IGZvciBvdXQgcGlwZXMuICovCi0JCQkJCWVwaWRfZG9uZSA9IDE7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCXVyYl9wcml2ID0gKGV0cmF4X3VyYl9wcml2X3QgKil1cmItPmhjcHJpdjsKLQkJCQlhc3NlcnQodXJiX3ByaXYpOwotCi0JCQkJaWYgKHNiX2Rlc2MgIT0gdXJiX3ByaXYtPmxhc3Rfc2IpIHsKLQotCQkJCQkvKiBUaGlzIHVyYiBoYXMgYmVlbiBzZW50LiAqLwotCQkJCQlkYmdfaXNvYygib3V0IFVSQiAweCVwIHNlbnQiLCB1cmIpOwotCi0JCQkJCXVyYl9wcml2LT51cmJfc3RhdGUgPSBUUkFOU0ZFUl9ET05FOwotCi0JCQkJfSBlbHNlIGlmICgoc2JfZGVzYyA9PSB1cmJfcHJpdi0+bGFzdF9zYikgJiYKLQkJCQkJICAgIShUeElzb2NFUExpc3RbZXBpZF0uY29tbWFuZCAmIElPX01BU0soVVNCX0VQX2NvbW1hbmQsIGVuYWJsZSkpKSB7Ci0KLQkJCQkJYXNzZXJ0KChzYl9kZXNjLT5jb21tYW5kICYgSU9fTUFTSyhVU0JfU0JfY29tbWFuZCwgZW9sKSkgPT0gSU9fU1RBVEUoVVNCX1NCX2NvbW1hbmQsIGVvbCwgeWVzKSk7Ci0JCQkJCWFzc2VydChzYl9kZXNjLT5uZXh0ID09IDApOwotCi0JCQkJCWRiZ19pc29jKCJvdXQgVVJCIDB4JXAgbGFzdCBpbiBsaXN0LCBlcGlkIGRpc2FibGVkIiwgdXJiKTsKLQkJCQkJVHhJc29jRVBMaXN0W2VwaWRdLnN1YiA9IDA7Ci0JCQkJCVR4SXNvY0VQTGlzdFtlcGlkXS5od19sZW4gPSAwOwotCQkJCQl1cmJfcHJpdi0+dXJiX3N0YXRlID0gVFJBTlNGRVJfRE9ORTsKLQotCQkJCQllcGlkX2RvbmUgPSAxOwotCi0JCQkJfSBlbHNlIHsKLQkJCQkJZXBpZF9kb25lID0gMTsKLQkJCQl9Ci0JCQkJaWYgKCFlcGlkX2RvbmUpIHsKLQkJCQkJdXJiID0gdXJiX2xpc3RfbmV4dCh1cmIsIGVwaWQpOwotCQkJCX0KLQkJCX0KLQotCQl9Ci0KLQkJKlJfRE1BX0NIOF9TVUIzX0NMUl9JTlRSID0gSU9fU1RBVEUoUl9ETUFfQ0g4X1NVQjNfQ0xSX0lOVFIsIGNscl9kZXNjciwgZG8pOwotCi0JCWNvbXBfZGF0YSA9ICh1c2JfaXNvY19jb21wbGV0ZV9kYXRhX3QqKWttZW1fY2FjaGVfYWxsb2MoaXNvY19jb21wbF9jYWNoZSwgR0ZQX0FUT01JQyk7Ci0JCWFzc2VydChjb21wX2RhdGEgIT0gTlVMTCk7Ci0KLSAgICAgICAgICAgICAgICBJTklUX1dPUksoJmNvbXBfZGF0YS0+dXNiX2JoLCBldHJheF91c2JfaXNvY19kZXNjcl9pbnRlcnJ1cHRfYm90dG9tX2hhbGYsIGNvbXBfZGF0YSk7Ci0gICAgICAgICAgICAgICAgc2NoZWR1bGVfd29yaygmY29tcF9kYXRhLT51c2JfYmgpOwotCX0KLQotCURCRkVYSVQ7Ci0gICAgICAgIHJldHVybiBJUlFfSEFORExFRDsKLX0KLQotc3RhdGljIHZvaWQgZXRyYXhfdXNiX2lzb2NfZGVzY3JfaW50ZXJydXB0X2JvdHRvbV9oYWxmKHZvaWQgKmRhdGEpCi17Ci0JdXNiX2lzb2NfY29tcGxldGVfZGF0YV90ICpjb21wX2RhdGEgPSAodXNiX2lzb2NfY29tcGxldGVfZGF0YV90KilkYXRhOwotCi0Jc3RydWN0IHVyYiAqdXJiOwotCWludCBlcGlkOwotCWludCBlcGlkX2RvbmU7Ci0JZXRyYXhfdXJiX3ByaXZfdCAqdXJiX3ByaXY7Ci0KLQlEQkZFTlRFUjsKLQotCWRiZ19pc29jKCJkbWE4X3N1YjNfZGVzY3IgKElTT0MpIGJvdHRvbSBoYWxmLiIpOwotCi0JZm9yIChlcGlkID0gMDsgZXBpZCA8IE5CUl9PRl9FUElEUyAtIDE7IGVwaWQrKykgewotCQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JCXNhdmVfZmxhZ3MoZmxhZ3MpOwotCQljbGkoKTsKLQotCQllcGlkX2RvbmUgPSAwOwotCi0JCS8qIFRoZSBkZXNjcmlwdG9yIGludGVycnVwdCBoYW5kbGVyIGhhcyBtYXJrZWQgYWxsIHRyYW5zbWl0dGVkIGlzb2NoLiBvdXQKLQkJICAgVVJCcyB3aXRoIFRSQU5TRkVSX0RPTkUuICBOb3cgd2UgdHJhdmVyc2UgYWxsIGVwaWRzIGFuZCBmb3IgYWxsIHRoYXQKLSAJCSAgIGhhdmUgaXNvY2guIG91dCB0cmFmZmljIHRyYXZlcnNlIGl0cyBVUkIgbGlzdCBhbmQgY29tcGxldGUgdGhlCi0JCSAgIHRyYW5zbWl0dGVkIFVSQi4KLQkJKi8KLQotCQl3aGlsZSAoIWVwaWRfZG9uZSkgewotCi0JCQkvKiBHZXQgdGhlIGZpcnN0IHVyYiAoaWYgYW55KS4gKi8KLQkJCXVyYiA9IHVyYl9saXN0X2ZpcnN0KGVwaWQpOwotCQkJaWYgKHVyYiA9PSAwKSB7Ci0JCQkJZXBpZF9kb25lID0gMTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJaWYgKHVzYl9waXBldHlwZSh1cmItPnBpcGUpICE9IFBJUEVfSVNPQ0hST05PVVMpIHsKLQkJCQkJZXBpZF9kb25lID0gMTsKLQkJCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWlmICghdXNiX3BpcGVvdXQodXJiLT5waXBlKSkgewotCQkJCS8qIGRlc2NyIGludGVycnVwdHMgYXJlIGdlbmVyYXRlZCBvbmx5IGZvciBvdXQgcGlwZXMuICovCi0JCQkJZXBpZF9kb25lID0gMTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJZGJnX2lzb2MoIkNoZWNrIGVwaWQgJWQsIFNCIDB4JXAiLCBlcGlkLCAoY2hhciopVHhJc29jRVBMaXN0W2VwaWRdLnN1Yik7Ci0KLQkJCXVyYl9wcml2ID0gKGV0cmF4X3VyYl9wcml2X3QgKil1cmItPmhjcHJpdjsKLQkJCWFzc2VydCh1cmJfcHJpdik7Ci0KLQkJCWlmICh1cmJfcHJpdi0+dXJiX3N0YXRlID09IFRSQU5TRkVSX0RPTkUpIHsKLQkJCQlpbnQgaTsKLQkJCQlzdHJ1Y3QgdXNiX2lzb19wYWNrZXRfZGVzY3JpcHRvciAqcGFja2V0OwotCi0JCQkJLyogVGhpcyB1cmIgaGFzIGJlZW4gc2VudC4gKi8KLQkJCQlkYmdfaXNvYygiQ29tcGxldGluZyBpc29jIG91dCBVUkIgMHglcCIsIHVyYik7Ci0KLQkJCQlmb3IgKGkgPSAwOyBpIDwgdXJiLT5udW1iZXJfb2ZfcGFja2V0czsgaSsrKSB7Ci0JCQkJCXBhY2tldCA9ICZ1cmItPmlzb19mcmFtZV9kZXNjW2ldOwotCQkJCQlwYWNrZXQtPnN0YXR1cyA9IDA7Ci0JCQkJCXBhY2tldC0+YWN0dWFsX2xlbmd0aCA9IHBhY2tldC0+bGVuZ3RoOwotCQkJCX0KLQotCQkJCWV0cmF4X3VzYl9jb21wbGV0ZV9pc29jX3VyYih1cmIsIDApOwotCi0JCQkJaWYgKHVyYl9saXN0X2VtcHR5KGVwaWQpKSB7Ci0JCQkJCWV0cmF4X3VzYl9mcmVlX2VwaWQoZXBpZCk7Ci0JCQkJCWVwaWRfZG9uZSA9IDE7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQllcGlkX2RvbmUgPSAxOwotCQkJfQotCQl9Ci0JCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOwotCi0JfQotCWttZW1fY2FjaGVfZnJlZShpc29jX2NvbXBsX2NhY2hlLCBjb21wX2RhdGEpOwotCi0JREJGRVhJVDsKLX0KLQotCi0KLXN0YXRpYyBpcnFyZXR1cm5fdCBldHJheF91c2JfcnhfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKnZoYykKLXsKLQlzdHJ1Y3QgdXJiICp1cmI7Ci0JZXRyYXhfdXJiX3ByaXZfdCAqdXJiX3ByaXY7Ci0JaW50IGVwaWQgPSAwOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkvKiBJc29jIGRpYWdub3N0aWNzLiAqLwotCXN0YXRpYyBpbnQgY3Vycl9mbSA9IDA7Ci0Jc3RhdGljIGludCBwcmV2X2ZtID0gMDsKLQotCURCRkVOVEVSOwotCi0JLyogQ2xlYXIgdGhpcyBpbnRlcnJ1cHQuICovCi0JKlJfRE1BX0NIOV9DTFJfSU5UUiA9IElPX1NUQVRFKFJfRE1BX0NIOV9DTFJfSU5UUiwgY2xyX2VvcCwgZG8pOwotCi0JLyogTm90ZSB0aGF0IHRoaXMgd2hpbGUgbG9vcCBhc3N1bWVzIHRoYXQgYWxsIHBhY2tldHMgc3BhbiBvbmx5Ci0JICAgb25lIHJ4IGRlc2NyaXB0b3IuICovCi0KLQkvKiBUaGUgcmVhc29uIHdlIGNsaSBoZXJlIGlzIHRoYXQgd2UgY2FsbCB0aGUgZHJpdmVyJ3MgY2FsbGJhY2sgZnVuY3Rpb25zLiAqLwotCXNhdmVfZmxhZ3MoZmxhZ3MpOwotCWNsaSgpOwotCi0Jd2hpbGUgKG15TmV4dFJ4RGVzYy0+c3RhdHVzICYgSU9fTUFTSyhVU0JfSU5fc3RhdHVzLCBlb3ApKSB7Ci0KLQkJZXBpZCA9IElPX0VYVFJBQ1QoVVNCX0lOX3N0YXR1cywgZXBpZCwgbXlOZXh0UnhEZXNjLT5zdGF0dXMpOwotCQl1cmIgPSB1cmJfbGlzdF9maXJzdChlcGlkKTsKLQotCQkvL3ByaW50aygiZW9wIGZvciBlcGlkICVkLCBmaXJzdCB1cmIgMHglbHhcbiIsIGVwaWQsICh1bnNpZ25lZCBsb25nKXVyYik7Ci0KLQkJaWYgKCF1cmIpIHsKLQkJCWVycigiTm8gdXJiIGZvciBlcGlkICVkIGluIHJ4IGludGVycnVwdCIsIGVwaWQpOwotCQkJX19kdW1wX2VwdF9kYXRhKGVwaWQpOwotCQkJZ290byBza2lwX291dDsKLQkJfQotCi0JCS8qIE5vdGUgdGhhdCB3ZSBjYW5ub3QgaW5kZXNjcmltaW5hdGVseSBhc3NlcnQodXNiX3BpcGVpbih1cmItPnBpcGUpKSBzaW5jZQotCQkgICBjdHJsIHBpcGVzIGFyZSBub3QuICovCi0KLQkJaWYgKG15TmV4dFJ4RGVzYy0+c3RhdHVzICYgSU9fTUFTSyhVU0JfSU5fc3RhdHVzLCBlcnJvcikpIHsKLQkJCV9fdTMyIHJfdXNiX2VwdF9kYXRhOwotCQkJaW50IG5vX2Vycm9yID0gMDsKLQotCQkJYXNzZXJ0KHRlc3RfYml0KGVwaWQsICh2b2lkICopJmVwaWRfdXNhZ2VfYml0bWFzaykpOwotCi0JCQkqUl9VU0JfRVBUX0lOREVYID0gSU9fRklFTEQoUl9VU0JfRVBUX0lOREVYLCB2YWx1ZSwgZXBpZCk7Ci0JCQlub3AoKTsKLQkJCWlmICh1c2JfcGlwZXR5cGUodXJiLT5waXBlKSA9PSBQSVBFX0lTT0NIUk9OT1VTKSB7Ci0JCQkJcl91c2JfZXB0X2RhdGEgPSAqUl9VU0JfRVBUX0RBVEFfSVNPOwotCi0JCQkJaWYgKChyX3VzYl9lcHRfZGF0YSAmIElPX01BU0soUl9VU0JfRVBUX0RBVEFfSVNPLCB2YWxpZCkpICYmCi0JCQkJICAgIChJT19FWFRSQUNUKFJfVVNCX0VQVF9EQVRBX0lTTywgZXJyb3JfY29kZSwgcl91c2JfZXB0X2RhdGEpID09IDApICYmCi0JCQkJICAgIChteU5leHRSeERlc2MtPnN0YXR1cyAmIElPX01BU0soVVNCX0lOX3N0YXR1cywgbm9kYXRhKSkpIHsKLQkJCQkJLyogTm90IGFuIGVycm9yLCBqdXN0IGEgZmFpbHVyZSB0byByZWNlaXZlIGFuIGV4cGVjdGVkIGlzbwotCQkJCQkgICBpbiBwYWNrZXQgaW4gdGhpcyBmcmFtZS4gIFRoaXMgaXMgbm90IGRvY3VtZW50ZWQKLQkJCQkJICAgaW4gdGhlIGRlc2lnbmVycyByZWZlcmVuY2UuCi0JCQkJCSovCi0JCQkJCW5vX2Vycm9yKys7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJd2FybigiUl9VU0JfRVBUX0RBVEFfSVNPIGZvciBlcGlkICVkID0gMHgleCIsIGVwaWQsIHJfdXNiX2VwdF9kYXRhKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXJfdXNiX2VwdF9kYXRhID0gKlJfVVNCX0VQVF9EQVRBOwotCQkJCXdhcm4oIlJfVVNCX0VQVF9EQVRBIGZvciBlcGlkICVkID0gMHgleCIsIGVwaWQsIHJfdXNiX2VwdF9kYXRhKTsKLQkJCX0KLQotCQkJaWYgKCFub19lcnJvcil7Ci0JCQkJd2FybigiZXJyb3IgaW4gcnggZGVzYy0+c3RhdHVzLCBlcGlkICVkLCBmaXJzdCB1cmIgPSAweCVseCIsCi0JCQkJICAgICBlcGlkLCAodW5zaWduZWQgbG9uZyl1cmIpOwotCQkJCV9fZHVtcF9pbl9kZXNjKG15TmV4dFJ4RGVzYyk7Ci0KLQkJCQl3YXJuKCJSX1VTQl9TVEFUVVMgPSAweCV4IiwgKlJfVVNCX1NUQVRVUyk7Ci0KLQkJCQkvKiBDaGVjayB0aGF0IGVwdCB3YXMgZGlzYWJsZWQgd2hlbiBlcnJvciBvY2N1cnJlZC4gKi8KLQkJCQlzd2l0Y2ggKHVzYl9waXBldHlwZSh1cmItPnBpcGUpKSB7Ci0JCQkJY2FzZSBQSVBFX0JVTEs6Ci0JCQkJCWFzc2VydCghKFR4QnVsa0VQTGlzdFtlcGlkXS5jb21tYW5kICYgSU9fTUFTSyhVU0JfRVBfY29tbWFuZCwgZW5hYmxlKSkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFBJUEVfQ09OVFJPTDoKLQkJCQkJYXNzZXJ0KCEoVHhDdHJsRVBMaXN0W2VwaWRdLmNvbW1hbmQgJiBJT19NQVNLKFVTQl9FUF9jb21tYW5kLCBlbmFibGUpKSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgUElQRV9JTlRFUlJVUFQ6Ci0JCQkJCWFzc2VydCghKFR4SW50ckVQTGlzdFtlcGlkXS5jb21tYW5kICYgSU9fTUFTSyhVU0JfRVBfY29tbWFuZCwgZW5hYmxlKSkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFBJUEVfSVNPQ0hST05PVVM6Ci0JCQkJCWFzc2VydCghKFR4SXNvY0VQTGlzdFtlcGlkXS5jb21tYW5kICYgSU9fTUFTSyhVU0JfRVBfY29tbWFuZCwgZW5hYmxlKSkpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQl3YXJuKCJldHJheF91c2JfcnhfaW50ZXJydXB0OiBiYWQgcGlwZXR5cGUgJWQgaW4gdXJiIDB4JXAiLAotCQkJCQkgICAgIHVzYl9waXBldHlwZSh1cmItPnBpcGUpLAotCQkJCQkgICAgIHVyYik7Ci0JCQkJfQotCQkJCWV0cmF4X3VzYl9jb21wbGV0ZV91cmIodXJiLCAtRVBST1RPKTsKLQkJCQlnb3RvIHNraXBfb3V0OwotCQkJfQotCQl9Ci0KLQkJdXJiX3ByaXYgPSAoZXRyYXhfdXJiX3ByaXZfdCAqKXVyYi0+aGNwcml2OwotCQlhc3NlcnQodXJiX3ByaXYpOwotCi0JCWlmICgodXNiX3BpcGV0eXBlKHVyYi0+cGlwZSkgPT0gUElQRV9CVUxLKSB8fAotCQkgICAgKHVzYl9waXBldHlwZSh1cmItPnBpcGUpID09IFBJUEVfQ09OVFJPTCkgfHwKLQkJICAgICh1c2JfcGlwZXR5cGUodXJiLT5waXBlKSA9PSBQSVBFX0lOVEVSUlVQVCkpIHsKLQotCQkJaWYgKG15TmV4dFJ4RGVzYy0+c3RhdHVzICYgSU9fTUFTSyhVU0JfSU5fc3RhdHVzLCBub2RhdGEpKSB7Ci0JCQkJLyogV2UgZ2V0IG5vZGF0YSBmb3IgZW1wdHkgZGF0YSB0cmFuc2FjdGlvbnMsIGFuZCB0aGUgcnggZGVzY3JpcHRvcidzCi0JCQkJICAgaHdfbGVuIGZpZWxkIGlzIG5vdCB2YWxpZCBpbiB0aGF0IGNhc2UuIE5vIGRhdGEgdG8gY29weSBpbiBvdGhlcgotCQkJCSAgIHdvcmRzLiAqLwotCQkJfSBlbHNlIHsKLQkJCQkvKiBNYWtlIHN1cmUgdGhlIGRhdGEgZml0cyBpbiB0aGUgYnVmZmVyLiAqLwotCQkJCWFzc2VydCh1cmJfcHJpdi0+cnhfb2Zmc2V0ICsgbXlOZXh0UnhEZXNjLT5od19sZW4KLQkJCQkgICAgICAgPD0gdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoKTsKLQotCQkJCW1lbWNweSh1cmItPnRyYW5zZmVyX2J1ZmZlciArIHVyYl9wcml2LT5yeF9vZmZzZXQsCi0JCQkJICAgICAgIHBoeXNfdG9fdmlydChteU5leHRSeERlc2MtPmJ1ZiksIG15TmV4dFJ4RGVzYy0+aHdfbGVuKTsKLQkJCQl1cmJfcHJpdi0+cnhfb2Zmc2V0ICs9IG15TmV4dFJ4RGVzYy0+aHdfbGVuOwotCQkJfQotCi0JCQlpZiAobXlOZXh0UnhEZXNjLT5zdGF0dXMgJiBJT19NQVNLKFVTQl9JTl9zdGF0dXMsIGVvdCkpIHsKLQkJCQlpZiAoKHVzYl9waXBldHlwZSh1cmItPnBpcGUpID09IFBJUEVfQ09OVFJPTCkgJiYKLQkJCQkgICAgKChUeEN0cmxFUExpc3RbdXJiX3ByaXYtPmVwaWRdLmNvbW1hbmQgJiBJT19NQVNLKFVTQl9FUF9jb21tYW5kLCBlbmFibGUpKSA9PQotCQkJCSAgICAgSU9fU1RBVEUoVVNCX0VQX2NvbW1hbmQsIGVuYWJsZSwgeWVzKSkpIHsKLQkJCQkJLyogVGhlIEVQIGlzIHN0aWxsIGVuYWJsZWQsIHNvIHRoZSBPVVQgcGFja2V0IHVzZWQgdG8gYWNrCi0JCQkJCSAgIHRoZSBpbiBkYXRhIGlzIHByb2JhYmx5IG5vdCBwcm9jZXNzZWQgeWV0LiAgSWYgdGhlIEVQCi0JCQkJCSAgIHN1YiBwb2ludGVyIGhhcyBub3QgbW92ZWQgYmV5b25kIHVyYl9wcml2LT5sYXN0X3NiIG1hcmsKLQkJCQkJICAgaXQgZm9yIGEgZGVzY3JpcHRvciBpbnRlcnJ1cHQgYW5kIGNvbXBsZXRlIHRoZSB1cmIgaW4KLQkJCQkJICAgdGhlIGRlc2NyaXB0b3IgaW50ZXJydXB0IGhhbmRsZXIuCi0JCQkJCSovCi0JCQkJCVVTQl9TQl9EZXNjX3QgKnN1YiA9IFR4Q3RybEVQTGlzdFt1cmJfcHJpdi0+ZXBpZF0uc3ViID8gcGh5c190b192aXJ0KFR4Q3RybEVQTGlzdFt1cmJfcHJpdi0+ZXBpZF0uc3ViKSA6IDA7Ci0KLQkJCQkJd2hpbGUgKChzdWIgIT0gTlVMTCkgJiYgKHN1YiAhPSB1cmJfcHJpdi0+bGFzdF9zYikpIHsKLQkJCQkJCXN1YiA9IHN1Yi0+bmV4dCA/IHBoeXNfdG9fdmlydChzdWItPm5leHQpIDogMDsKLQkJCQkJfQotCQkJCQlpZiAoc3ViICE9IE5VTEwpIHsKLQkJCQkJCS8qIFRoZSB1cmIgaGFzIG5vdCBiZWVuIGZ1bGx5IHByb2Nlc3NlZC4gKi8KLQkJCQkJCXVyYl9wcml2LT51cmJfc3RhdGUgPSBXQUlUSU5HX0ZPUl9ERVNDUl9JTlRSOwotCQkJCQl9IGVsc2UgewotCQkJCQkJd2FybigiKENUUkwpIGVwaWQgZW5hYmxlZCBhbmQgdXJiICgweCVwKSBwcm9jZXNzZWQsIGVwLT5zdWI9MHglcCIsIHVyYiwgKGNoYXIqKVR4Q3RybEVQTGlzdFt1cmJfcHJpdi0+ZXBpZF0uc3ViKTsKLQkJCQkJCWV0cmF4X3VzYl9jb21wbGV0ZV91cmIodXJiLCAwKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWV0cmF4X3VzYl9jb21wbGV0ZV91cmIodXJiLCAwKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfSBlbHNlIGlmICh1c2JfcGlwZXR5cGUodXJiLT5waXBlKSA9PSBQSVBFX0lTT0NIUk9OT1VTKSB7Ci0KLQkJCXN0cnVjdCB1c2JfaXNvX3BhY2tldF9kZXNjcmlwdG9yICpwYWNrZXQ7Ci0KLQkJCWlmICh1cmJfcHJpdi0+dXJiX3N0YXRlID09IFVOTElOSykgewotCQkJCWluZm8oIklnbm9yaW5nIHJ4IGRhdGEgZm9yIHVyYiBiZWluZyB1bmxpbmtlZC4iKTsKLQkJCQlnb3RvIHNraXBfb3V0OwotCQkJfSBlbHNlIGlmICh1cmJfcHJpdi0+dXJiX3N0YXRlID09IE5PVF9TVEFSVEVEKSB7Ci0JCQkJaW5mbygiV2hhdD8gR290IHJ4IGRhdGEgZm9yIHVyYiB0aGF0IGlzbid0IHN0YXJ0ZWQ/Iik7Ci0JCQkJZ290byBza2lwX291dDsKLQkJCX0KLQotCQkJcGFja2V0ID0gJnVyYi0+aXNvX2ZyYW1lX2Rlc2NbdXJiX3ByaXYtPmlzb2NfcGFja2V0X2NvdW50ZXJdOwotCQkJcGFja2V0LT5zdGF0dXMgPSAwOwotCi0JCQlpZiAobXlOZXh0UnhEZXNjLT5zdGF0dXMgJiBJT19NQVNLKFVTQl9JTl9zdGF0dXMsIG5vZGF0YSkpIHsKLQkJCQkvKiBXZSBnZXQgbm9kYXRhIGZvciBlbXB0eSBkYXRhIHRyYW5zYWN0aW9ucywgYW5kIHRoZSByeCBkZXNjcmlwdG9yJ3MKLQkJCQkgICBod19sZW4gZmllbGQgaXMgbm90IHZhbGlkIGluIHRoYXQgY2FzZS4gV2UgY29weSAwIGJ5dGVzIGhvd2V2ZXIgdG8KLQkJCQkgICBzdGF5IGluIHN5bmNoLiAqLwotCQkJCXBhY2tldC0+YWN0dWFsX2xlbmd0aCA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCXBhY2tldC0+YWN0dWFsX2xlbmd0aCA9IG15TmV4dFJ4RGVzYy0+aHdfbGVuOwotCQkJCS8qIE1ha2Ugc3VyZSB0aGUgZGF0YSBmaXRzIGluIHRoZSBidWZmZXIuICovCi0JCQkJYXNzZXJ0KHBhY2tldC0+YWN0dWFsX2xlbmd0aCA8PSBwYWNrZXQtPmxlbmd0aCk7Ci0JCQkJbWVtY3B5KHVyYi0+dHJhbnNmZXJfYnVmZmVyICsgcGFja2V0LT5vZmZzZXQsCi0JCQkJICAgICAgIHBoeXNfdG9fdmlydChteU5leHRSeERlc2MtPmJ1ZiksIHBhY2tldC0+YWN0dWFsX2xlbmd0aCk7Ci0JCQl9Ci0KLQkJCS8qIEluY3JlbWVudCB0aGUgcGFja2V0IGNvdW50ZXIuICovCi0JCQl1cmJfcHJpdi0+aXNvY19wYWNrZXRfY291bnRlcisrOwotCi0JCQkvKiBOb3RlIHRoYXQgd2UgZG9uJ3QgY2FyZSBhYm91dCB0aGUgZW90IGZpZWxkIGluIHRoZSByeCBkZXNjcmlwdG9yJ3Mgc3RhdHVzLgotCQkJICAgSXQgd2lsbCBhbHdheXMgYmUgc2V0IGZvciBpc29jIHRyYWZmaWMuICovCi0JCQlpZiAodXJiLT5udW1iZXJfb2ZfcGFja2V0cyA9PSB1cmJfcHJpdi0+aXNvY19wYWNrZXRfY291bnRlcikgewotCi0JCQkJLyogT3V0LW9mLXN5bmNoIGRpYWdub3N0aWNzLiAqLwotCQkJCWN1cnJfZm0gPSAoKlJfVVNCX0ZNX05VTUJFUiAmIDB4N2ZmKTsKLQkJCQlpZiAoKChwcmV2X2ZtICsgdXJiX3ByaXYtPmlzb2NfcGFja2V0X2NvdW50ZXIpICUgKDB4N2ZmICsgMSkpICE9IGN1cnJfZm0pIHsKLQkJCQkJLyogVGhpcyB0ZXN0IGlzIHdyb25nLCBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIGlzb2MKLQkJCQkJICAgaW4gZW5kcG9pbnQgYWN0aXZlIGl0IHdpbGwgYWx3YXlzIGNhbGN1bGF0ZSB3cm9uZwotCQkJCQkgICBzaW5jZSBwcmV2X2ZtIGlzIHNoYXJlZCBieSBhbGwgZW5kcG9pbnRzLgotCi0JCQkJCSAgIEZJWE1FIE1ha2UgdGhpcyBjaGVjayBwZXIgVVJCIHVzaW5nIHVyYi0+c3RhcnRfZnJhbWUuCi0JCQkJCSovCi0JCQkJCWRiZ19pc29jKCJPdXQgb2Ygc3luY2g/IFByZXZpb3VzIGZyYW1lID0gJWQsIGN1cnJlbnQgZnJhbWUgPSAlZCIsCi0JCQkJCQkgcHJldl9mbSwgY3Vycl9mbSk7Ci0KLQkJCQl9Ci0JCQkJcHJldl9mbSA9IGN1cnJfZm07Ci0KLQkJCQkvKiBDb21wbGV0ZSB0aGUgdXJiIHdpdGggc3RhdHVzIE9LLiAqLwotCQkJCWV0cmF4X3VzYl9jb21wbGV0ZV9pc29jX3VyYih1cmIsIDApOwotCQkJfQotCQl9Ci0KLQlza2lwX291dDoKLQotCQkvKiBETUEgSU4gY2FjaGUgYnVnLiBGbHVzaCB0aGUgRE1BIElOIGJ1ZmZlciBmcm9tIHRoZSBjYWNoZS4gKHN0cnVjdCBldHJheF9kbWFfZGVzY3IKLQkJICAgaGFzIHRoZSBzYW1lIGxheW91dCBhcyBVU0JfSU5fRGVzYyBmb3IgdGhlIHJlbGV2YW50IGZpZWxkcy4pICovCi0JCXByZXBhcmVfcnhfZGVzY3JpcHRvcigoc3RydWN0IGV0cmF4X2RtYV9kZXNjciopbXlOZXh0UnhEZXNjKTsKLQotCQlteVByZXZSeERlc2MgPSBteU5leHRSeERlc2M7Ci0JCW15UHJldlJ4RGVzYy0+Y29tbWFuZCB8PSBJT19NQVNLKFVTQl9JTl9jb21tYW5kLCBlb2wpOwotCQlteUxhc3RSeERlc2MtPmNvbW1hbmQgJj0gfklPX01BU0soVVNCX0lOX2NvbW1hbmQsIGVvbCk7Ci0JCW15TGFzdFJ4RGVzYyA9IG15UHJldlJ4RGVzYzsKLQotCQlteU5leHRSeERlc2MtPnN0YXR1cyA9IDA7Ci0JCW15TmV4dFJ4RGVzYyA9IHBoeXNfdG9fdmlydChteU5leHRSeERlc2MtPm5leHQpOwotCX0KLQotCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOwotCi0JREJGRVhJVDsKLQotICAgICAgICByZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLQotLyogVGhpcyBmdW5jdGlvbiB3aWxsIHVubGluayB0aGUgU0IgZGVzY3JpcHRvcnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdXJiLiAqLwotc3RhdGljIGludCBldHJheF9yZW1vdmVfZnJvbV9zYl9saXN0KHN0cnVjdCB1cmIgKnVyYikKLXsKLQlVU0JfU0JfRGVzY190ICpuZXh0X3NiLCAqZmlyc3Rfc2IsICpsYXN0X3NiOwotCWV0cmF4X3VyYl9wcml2X3QgKnVyYl9wcml2OwotCWludCBpID0gMDsKLQotCURCRkVOVEVSOwotCi0JdXJiX3ByaXYgPSAoZXRyYXhfdXJiX3ByaXZfdCAqKXVyYi0+aGNwcml2OwotCWFzc2VydCh1cmJfcHJpdik7Ci0KLQkvKiBKdXN0IGEgc2FuaXR5IGNoZWNrLiBTaW5jZSB3ZSBkb24ndCBmaWRkbGUgd2l0aCB0aGUgRE1BIGxpc3QgdGhlIEVQIGRlc2NyaXB0b3IKLQkgICBkb2Vzbid0IHJlYWxseSBuZWVkIHRvIGJlIGRpc2FibGVkLCBpdCdzIGp1c3QgdGhhdCB3ZSBleHBlY3QgaXQgdG8gYmUuICovCi0JaWYgKHVzYl9waXBldHlwZSh1cmItPnBpcGUpID09IFBJUEVfQlVMSykgewotCQlhc3NlcnQoIShUeEJ1bGtFUExpc3RbdXJiX3ByaXYtPmVwaWRdLmNvbW1hbmQgJiBJT19NQVNLKFVTQl9FUF9jb21tYW5kLCBlbmFibGUpKSk7Ci0JfSBlbHNlIGlmICh1c2JfcGlwZXR5cGUodXJiLT5waXBlKSA9PSBQSVBFX0NPTlRST0wpIHsKLQkJYXNzZXJ0KCEoVHhDdHJsRVBMaXN0W3VyYl9wcml2LT5lcGlkXS5jb21tYW5kICYgSU9fTUFTSyhVU0JfRVBfY29tbWFuZCwgZW5hYmxlKSkpOwotCX0KLQotCWZpcnN0X3NiID0gdXJiX3ByaXYtPmZpcnN0X3NiOwotCWxhc3Rfc2IgPSB1cmJfcHJpdi0+bGFzdF9zYjsKLQotCWFzc2VydChmaXJzdF9zYik7Ci0JYXNzZXJ0KGxhc3Rfc2IpOwotCi0Jd2hpbGUgKGZpcnN0X3NiICE9IGxhc3Rfc2IpIHsKLQkJbmV4dF9zYiA9IChVU0JfU0JfRGVzY190ICopcGh5c190b192aXJ0KGZpcnN0X3NiLT5uZXh0KTsKLQkJa21lbV9jYWNoZV9mcmVlKHVzYl9kZXNjX2NhY2hlLCBmaXJzdF9zYik7Ci0JCWZpcnN0X3NiID0gbmV4dF9zYjsKLQkJaSsrOwotCX0KLQlrbWVtX2NhY2hlX2ZyZWUodXNiX2Rlc2NfY2FjaGUsIGxhc3Rfc2IpOwotCWkrKzsKLQlkYmdfc2IoIiVkIFNCIGRlc2NyaXB0b3JzIGZyZWVkIiwgaSk7Ci0JLyogQ29tcGFyZSBpIHdpdGggdXJiLT5udW1iZXJfb2ZfcGFja2V0cyBmb3IgSXNvYyB0cmFmZmljLgotCSAgIFNob3VsZCBiZSBzYW1lIHdoZW4gY2FsbGluZyB1bmxpbmtfdXJiICovCi0KLQlEQkZFWElUOwotCi0JcmV0dXJuIGk7Ci19Ci0KLXN0YXRpYyBpbnQgZXRyYXhfdXNiX3N1Ym1pdF9idWxrX3VyYihzdHJ1Y3QgdXJiICp1cmIpCi17Ci0JaW50IGVwaWQ7Ci0JaW50IGVtcHR5OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JZXRyYXhfdXJiX3ByaXZfdCAqdXJiX3ByaXY7Ci0KLQlEQkZFTlRFUjsKLQotCS8qIEVwaWQgYWxsb2NhdGlvbiwgZW1wdHkgY2hlY2sgYW5kIGxpc3QgYWRkIG11c3QgYmUgcHJvdGVjdGVkLgotCSAgIFJlYWQgYWJvdXQgdGhpcyBpbiBldHJheF91c2Jfc3VibWl0X2N0cmxfdXJiLiAqLwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnVyYl9saXN0X2xvY2ssIGZsYWdzKTsKLQllcGlkID0gZXRyYXhfdXNiX3NldHVwX2VwaWQodXJiKTsKLQlpZiAoZXBpZCA9PSAtMSkgewotCQlEQkZFWElUOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1cmJfbGlzdF9sb2NrLCBmbGFncyk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQllbXB0eSA9IHVyYl9saXN0X2VtcHR5KGVwaWQpOwotCXVyYl9saXN0X2FkZCh1cmIsIGVwaWQpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVyYl9saXN0X2xvY2ssIGZsYWdzKTsKLQotCWRiZ19idWxrKCJBZGRpbmcgYnVsayAlcyB1cmIgMHglbHggdG8gJXMgbGlzdCwgZXBpZCAlZCIsCi0JCSB1c2JfcGlwZWluKHVyYi0+cGlwZSkgPyAiSU4iIDogIk9VVCIsICh1bnNpZ25lZCBsb25nKXVyYiwgZW1wdHkgPyAiZW1wdHkiIDogIiIsIGVwaWQpOwotCi0JLyogTWFyayB0aGUgdXJiIGFzIGJlaW5nIGluIHByb2dyZXNzLiAqLwotCXVyYi0+c3RhdHVzID0gLUVJTlBST0dSRVNTOwotCi0JLyogU2V0dXAgdGhlIGhjcHJpdiBkYXRhLiAqLwotCXVyYl9wcml2ID0ga3phbGxvYyhzaXplb2YoZXRyYXhfdXJiX3ByaXZfdCksIEtNQUxMT0NfRkxBRyk7Ci0JYXNzZXJ0KHVyYl9wcml2ICE9IE5VTEwpOwotCS8qIFRoaXMgc2V0cyByeF9vZmZzZXQgdG8gMC4gKi8KLQl1cmJfcHJpdi0+dXJiX3N0YXRlID0gTk9UX1NUQVJURUQ7Ci0JdXJiLT5oY3ByaXYgPSB1cmJfcHJpdjsKLQotCWlmIChlbXB0eSkgewotCQlldHJheF91c2JfYWRkX3RvX2J1bGtfc2JfbGlzdCh1cmIsIGVwaWQpOwotCX0KLQotCURCRkVYSVQ7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgZXRyYXhfdXNiX2FkZF90b19idWxrX3NiX2xpc3Qoc3RydWN0IHVyYiAqdXJiLCBpbnQgZXBpZCkKLXsKLQlVU0JfU0JfRGVzY190ICpzYl9kZXNjOwotCWV0cmF4X3VyYl9wcml2X3QgKnVyYl9wcml2ID0gKGV0cmF4X3VyYl9wcml2X3QgKil1cmItPmhjcHJpdjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWNoYXIgbWF4bGVuOwotCi0JREJGRU5URVI7Ci0KLQlkYmdfYnVsaygiZXRyYXhfdXNiX2FkZF90b19idWxrX3NiX2xpc3QsIHVyYiAweCVseCIsICh1bnNpZ25lZCBsb25nKXVyYik7Ci0KLQltYXhsZW4gPSB1c2JfbWF4cGFja2V0KHVyYi0+ZGV2LCB1cmItPnBpcGUsIHVzYl9waXBlb3V0KHVyYi0+cGlwZSkpOwotCi0Jc2JfZGVzYyA9IGttZW1fY2FjaGVfemFsbG9jKHVzYl9kZXNjX2NhY2hlLCBTTEFCX0ZMQUcpOwotCWFzc2VydChzYl9kZXNjICE9IE5VTEwpOwotCi0KLQlpZiAodXNiX3BpcGVvdXQodXJiLT5waXBlKSkgewotCi0JCWRiZ19idWxrKCJHcmFiYmluZyBidWxrIE9VVCwgdXJiIDB4JWx4LCBlcGlkICVkIiwgKHVuc2lnbmVkIGxvbmcpdXJiLCBlcGlkKTsKLQotCQkvKiBUaGlzIGlzIHByb2JhYmx5IGEgc2FuaXR5IGNoZWNrIG9mIHRoZSBidWxrIHRyYW5zYWN0aW9uIGxlbmd0aAotCQkgICBub3QgYmVpbmcgbGFyZ2VyIHRoYW4gNjQga0IuICovCi0JCWlmICh1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPiAweGZmZmYpIHsKLQkJCXBhbmljKCJ1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPiAweGZmZmYiKTsKLQkJfQotCi0JCXNiX2Rlc2MtPnN3X2xlbiA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aDsKLQotCQkvKiBUaGUgcmVtIGZpZWxkIGlzIGRvbid0IGNhcmUgaWYgaXQncyBub3QgYSBmdWxsLWxlbmd0aCB0cmFuc2Zlciwgc28gc2V0dGluZwotCQkgICBpdCBzaG91bGRuJ3QgaHVydC4gQWxzbywgcmVtIGlzbid0IHVzZWQgZm9yIE9VVCB0cmFmZmljLiAqLwotCQlzYl9kZXNjLT5jb21tYW5kID0gKElPX0ZJRUxEKFVTQl9TQl9jb21tYW5kLCByZW0sIDApIHwKLQkJCQkgICAgSU9fU1RBVEUoVVNCX1NCX2NvbW1hbmQsIHR0LCBvdXQpIHwKLQkJCQkgICAgSU9fU1RBVEUoVVNCX1NCX2NvbW1hbmQsIGVvdCwgeWVzKSB8Ci0JCQkJICAgIElPX1NUQVRFKFVTQl9TQl9jb21tYW5kLCBlb2wsIHllcykpOwotCi0JCS8qIFRoZSBmdWxsIGZpZWxkIGlzIHNldCB0byB5ZXMsIGV2ZW4gaWYgd2UgZG9uJ3QgYWN0dWFsbHkgY2hlY2sgdGhhdCB0aGlzIGlzCi0JCSAgIGEgZnVsbC1sZW5ndGggdHJhbnNmZXIgKGkuZS4sIHRoYXQgdHJhbnNmZXJfYnVmZmVyX2xlbmd0aCAlIG1heGxlbiA9IDApLgotCQkgICBTZXR0aW5nIGZ1bGwgcHJldmVudHMgdGhlIFVTQiBjb250cm9sbGVyIGZyb20gc2VuZGluZyBhbiBlbXB0eSBwYWNrZXQgaW4KLQkJICAgdGhhdCBjYXNlLiAgSG93ZXZlciwgaWYgVVJCX1pFUk9fUEFDS0VUIHdhcyBzZXQgd2Ugd2FudCB0aGF0LiAqLwotCQlpZiAoISh1cmItPnRyYW5zZmVyX2ZsYWdzICYgVVJCX1pFUk9fUEFDS0VUKSkgewotCQkJc2JfZGVzYy0+Y29tbWFuZCB8PSBJT19TVEFURShVU0JfU0JfY29tbWFuZCwgZnVsbCwgeWVzKTsKLQkJfQotCi0JCXNiX2Rlc2MtPmJ1ZiA9IHZpcnRfdG9fcGh5cyh1cmItPnRyYW5zZmVyX2J1ZmZlcik7Ci0JCXNiX2Rlc2MtPm5leHQgPSAwOwotCi0JfSBlbHNlIGlmICh1c2JfcGlwZWluKHVyYi0+cGlwZSkpIHsKLQotCQlkYmdfYnVsaygiR3JhYmJpbmcgYnVsayBJTiwgdXJiIDB4JWx4LCBlcGlkICVkIiwgKHVuc2lnbmVkIGxvbmcpdXJiLCBlcGlkKTsKLQotCQlzYl9kZXNjLT5zd19sZW4gPSB1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPwotCQkJKHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCAtIDEpIC8gbWF4bGVuICsgMSA6IDA7Ci0KLQkJLyogVGhlIHJlbSBmaWVsZCBpcyBkb24ndCBjYXJlIGlmIGl0J3Mgbm90IGEgZnVsbC1sZW5ndGggdHJhbnNmZXIsIHNvIHNldHRpbmcKLQkJICAgaXQgc2hvdWxkbid0IGh1cnQuICovCi0JCXNiX2Rlc2MtPmNvbW1hbmQgPQotCQkJKElPX0ZJRUxEKFVTQl9TQl9jb21tYW5kLCByZW0sCi0JCQkJICB1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggJSBtYXhsZW4pIHwKLQkJCSBJT19TVEFURShVU0JfU0JfY29tbWFuZCwgdHQsIGluKSB8Ci0JCQkgSU9fU1RBVEUoVVNCX1NCX2NvbW1hbmQsIGVvdCwgeWVzKSB8Ci0JCQkgSU9fU1RBVEUoVVNCX1NCX2NvbW1hbmQsIGVvbCwgeWVzKSk7Ci0KLQkJc2JfZGVzYy0+YnVmID0gMDsKLQkJc2JfZGVzYy0+bmV4dCA9IDA7Ci0JfQotCi0JdXJiX3ByaXYtPmZpcnN0X3NiID0gc2JfZGVzYzsKLQl1cmJfcHJpdi0+bGFzdF9zYiA9IHNiX2Rlc2M7Ci0JdXJiX3ByaXYtPmVwaWQgPSBlcGlkOwotCi0JdXJiLT5oY3ByaXYgPSB1cmJfcHJpdjsKLQotCS8qIFJlc2V0IHRvZ2dsZSBiaXRzIGFuZCByZXNldCBlcnJvciBjb3VudC4gKi8KLQlzYXZlX2ZsYWdzKGZsYWdzKTsKLQljbGkoKTsKLQotCSpSX1VTQl9FUFRfSU5ERVggPSBJT19GSUVMRChSX1VTQl9FUFRfSU5ERVgsIHZhbHVlLCBlcGlkKTsKLQlub3AoKTsKLQotCS8qIEZJWE1FOiBJcyB0aGlzIGEgc3BlY2lhbCBjYXNlIHNpbmNlIHRoZSBob2xkIGZpZWxkIGlzIGNoZWNrZWQsCi0JICAgb3Igc2hvdWxkIHdlIGNoZWNrIGhvbGQgaW4gYSBsb3Qgb2Ygb3RoZXIgY2FzZXMgYXMgd2VsbD8gKi8KLQlpZiAoKlJfVVNCX0VQVF9EQVRBICYgSU9fTUFTSyhSX1VTQl9FUFRfREFUQSwgaG9sZCkpIHsKLQkJcGFuaWMoIkhvbGQgd2FzIHNldCBpbiAlcyIsIF9fRlVOQ1RJT05fXyk7Ci0JfQotCi0JLyogUmVzZXQgZXJyb3IgY291bnRlcnMgKHJlZ2FyZGxlc3Mgb2Ygd2hpY2ggZGlyZWN0aW9uIHRoaXMgdHJhZmZpYyBpcykuICovCi0JKlJfVVNCX0VQVF9EQVRBICY9Ci0JCX4oSU9fTUFTSyhSX1VTQl9FUFRfREFUQSwgZXJyb3JfY291bnRfaW4pIHwKLQkJICBJT19NQVNLKFJfVVNCX0VQVF9EQVRBLCBlcnJvcl9jb3VudF9vdXQpKTsKLQotCS8qIFNvZnR3YXJlIG11c3QgcHJlc2V0IHRoZSB0b2dnbGUgYml0cy4gKi8KLQlpZiAodXNiX3BpcGVvdXQodXJiLT5waXBlKSkgewotCQljaGFyIHRvZ2dsZSA9Ci0JCQl1c2JfZ2V0dG9nZ2xlKHVyYi0+ZGV2LCB1c2JfcGlwZWVuZHBvaW50KHVyYi0+cGlwZSksIHVzYl9waXBlb3V0KHVyYi0+cGlwZSkpOwotCQkqUl9VU0JfRVBUX0RBVEEgJj0gfklPX01BU0soUl9VU0JfRVBUX0RBVEEsIHRfb3V0KTsKLQkJKlJfVVNCX0VQVF9EQVRBIHw9IElPX0ZJRUxEKFJfVVNCX0VQVF9EQVRBLCB0X291dCwgdG9nZ2xlKTsKLQl9IGVsc2UgewotCQljaGFyIHRvZ2dsZSA9Ci0JCQl1c2JfZ2V0dG9nZ2xlKHVyYi0+ZGV2LCB1c2JfcGlwZWVuZHBvaW50KHVyYi0+cGlwZSksIHVzYl9waXBlb3V0KHVyYi0+cGlwZSkpOwotCQkqUl9VU0JfRVBUX0RBVEEgJj0gfklPX01BU0soUl9VU0JfRVBUX0RBVEEsIHRfaW4pOwotCQkqUl9VU0JfRVBUX0RBVEEgfD0gSU9fRklFTEQoUl9VU0JfRVBUX0RBVEEsIHRfaW4sIHRvZ2dsZSk7Ci0JfQotCi0JLyogQXNzZXJ0IHRoYXQgdGhlIEVQIGRlc2NyaXB0b3IgaXMgZGlzYWJsZWQuICovCi0JYXNzZXJ0KCEoVHhCdWxrRVBMaXN0W2VwaWRdLmNvbW1hbmQgJiBJT19NQVNLKFVTQl9FUF9jb21tYW5kLCBlbmFibGUpKSk7Ci0KLQkvKiBUaGUgcmVhc29uIHdlIHNldCB0aGUgRVAncyBzdWIgcG9pbnRlciBkaXJlY3RseSBpbnN0ZWFkIG9mCi0JICAgd2Fsa2luZyB0aGUgU0IgbGlzdCBhbmQgbGlua2luZyBpdCBsYXN0IGluIHRoZSBsaXN0IGlzIHRoYXQgd2Ugb25seQotCSAgIGhhdmUgb25lIGFjdGl2ZSB1cmIgYXQgYSB0aW1lICh0aGUgcmVzdCBhcmUgcXVldWVkKS4gKi8KLQotCS8qIE5vdGUgdGhhdCB3ZSBjYW5ub3QgaGF2ZSBpbnRlcnJ1cHRzIHJ1bm5pbmcgd2hlbiB3ZSBoYXZlIHNldCB0aGUgU0IgZGVzY3JpcHRvcgotCSAgIGJ1dCB0aGUgRVAgaXMgbm90IHlldCBlbmFibGVkLiAgSWYgYSBidWxrIGVvdCBoYXBwZW5zIGZvciBhbm90aGVyIEVQLCB3ZSB3aWxsCi0JICAgZmluZCB0aGlzIEVQIGRpc2FibGVkIGFuZCB3aXRoIGEgU0IgIT0gMCwgd2hpY2ggd2lsbCBtYWtlIHVzIHRoaW5rIHRoYXQgaXQncyBkb25lLiAqLwotCVR4QnVsa0VQTGlzdFtlcGlkXS5zdWIgPSB2aXJ0X3RvX3BoeXMoc2JfZGVzYyk7Ci0JVHhCdWxrRVBMaXN0W2VwaWRdLmh3X2xlbiA9IDA7Ci0JLyogTm90ZSB0aGF0IHdlIGRvbid0IGhhdmUgdG8gZmlsbCBpbiB0aGUgZXBfaWQgZmllbGQgc2luY2UgdGhpcwotCSAgIHdhcyBkb25lIHdoZW4gd2UgYWxsb2NhdGVkIHRoZSBFUCBkZXNjcmlwdG9ycyBpbiBpbml0X3R4X2J1bGtfZXAuICovCi0KLQkvKiBDaGVjayBpZiB0aGUgZHVtbXkgbGlzdCBpcyBhbHJlYWR5IHdpdGggdXMgKGlmIHNldmVyYWwgdXJicyB3ZXJlIHF1ZXVlZCkuICovCi0JaWYgKFR4QnVsa0VQTGlzdFtlcGlkXS5uZXh0ICE9IHZpcnRfdG9fcGh5cygmVHhCdWxrRHVtbXlFUExpc3RbZXBpZF1bMF0pKSB7Ci0KLQkJZGJnX2J1bGsoIkludml0aW5nIGR1bW15IGxpc3QgdG8gdGhlIHBhcnR5IGZvciB1cmIgMHglbHgsIGVwaWQgJWQiLAotCQkJICh1bnNpZ25lZCBsb25nKXVyYiwgZXBpZCk7Ci0KLQkJLyogVGhlIGxhc3QgRVAgaW4gdGhlIGR1bW15IGxpc3QgYWxyZWFkeSBoYXMgaXRzIG5leHQgcG9pbnRlciBzZXQgdG8KLQkJICAgVHhCdWxrRVBMaXN0W2VwaWRdLm5leHQuICovCi0KLQkJLyogV2UgZG9uJ3QgbmVlZCB0byBjaGVjayBpZiB0aGUgRE1BIGlzIGF0IHRoaXMgRVAgb3Igbm90IGJlZm9yZSBjaGFuZ2luZyB0aGUKLQkJICAgbmV4dCBwb2ludGVyLCBzaW5jZSB3ZSB3aWxsIGRvIGl0IGluIG9uZSAzMi1iaXQgd3JpdGUgKEVQIGRlc2NyaXB0b3JzIGFyZQotCQkgICAzMi1iaXQgYWxpZ25lZCkuICovCi0JCVR4QnVsa0VQTGlzdFtlcGlkXS5uZXh0ID0gdmlydF90b19waHlzKCZUeEJ1bGtEdW1teUVQTGlzdFtlcGlkXVswXSk7Ci0JfQotCS8qIEVuYWJsZSB0aGUgRVAgZGVzY3IuICovCi0JZGJnX2J1bGsoIkVuYWJsaW5nIGJ1bGsgRVAgZm9yIHVyYiAweCVseCwgZXBpZCAlZCIsICh1bnNpZ25lZCBsb25nKXVyYiwgZXBpZCk7Ci0JVHhCdWxrRVBMaXN0W2VwaWRdLmNvbW1hbmQgfD0gSU9fU1RBVEUoVVNCX0VQX2NvbW1hbmQsIGVuYWJsZSwgeWVzKTsKLQotCS8qIEV2ZXJ5dGhpbmcgaXMgc2V0IHVwLCBzYWZlIHRvIGVuYWJsZSBpbnRlcnJ1cHRzIGFnYWluLiAqLwotCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOwotCi0JLyogSWYgdGhlIERNQSBidWxrIGNoYW5uZWwgaXNuJ3QgcnVubmluZywgd2UgbmVlZCB0byByZXN0YXJ0IGl0IGlmIGl0Ci0JICAgaGFzIHN0b3BwZWQgYXQgdGhlIGxhc3QgRVAgZGVzY3JpcHRvciAoRE1BIHN0b3BwZWQgYmVjYXVzZSB0aGVyZSB3YXMKLQkgICBubyBtb3JlIHRyYWZmaWMpIG9yIGlmIGl0IGhhcyBzdG9wcGVkIGF0IGEgZHVtbXkgRVAgd2l0aCB0aGUgaW50ciBmbGFnCi0JICAgc2V0IChETUEgc3RvcHBlZCBiZWNhdXNlIHdlIHdlcmUgdG9vIHNsb3cgaW4gaW5zZXJ0aW5nIG5ldyB0cmFmZmljKS4gKi8KLQlpZiAoISgqUl9ETUFfQ0g4X1NVQjBfQ01EICYgSU9fTUFTSyhSX0RNQV9DSDhfU1VCMF9DTUQsIGNtZCkpKSB7Ci0KLQkJVVNCX0VQX0Rlc2NfdCAqZXA7Ci0JCWVwID0gKFVTQl9FUF9EZXNjX3QgKilwaHlzX3RvX3ZpcnQoKlJfRE1BX0NIOF9TVUIwX0VQKTsKLQkJZGJnX2J1bGsoIkRNQSBjaGFubmVsIG5vdCBydW5uaW5nIGluIGFkZCIpOwotCQlkYmdfYnVsaygiRE1BIGlzIGF0IDB4JWx4IiwgKHVuc2lnbmVkIGxvbmcpZXApOwotCi0JCWlmICgqUl9ETUFfQ0g4X1NVQjBfRVAgPT0gdmlydF90b19waHlzKCZUeEJ1bGtFUExpc3RbTkJSX09GX0VQSURTIC0gMV0pIHx8Ci0JCSAgICAoZXAtPmNvbW1hbmQgJiAweDgpID4+IDMpIHsKLQkJCSpSX0RNQV9DSDhfU1VCMF9DTUQgPSBJT19TVEFURShSX0RNQV9DSDhfU1VCMF9DTUQsIGNtZCwgc3RhcnQpOwotCQkJLyogVXBkYXRlL3Jlc3RhcnQgdGhlIGJ1bGsgc3RhcnQgdGltZXIgc2luY2Ugd2UganVzdCBzdGFydGVkIHRoZSBjaGFubmVsLiAqLwotCQkJbW9kX3RpbWVyKCZidWxrX3N0YXJ0X3RpbWVyLCBqaWZmaWVzICsgQlVMS19TVEFSVF9USU1FUl9JTlRFUlZBTCk7Ci0JCQkvKiBVcGRhdGUvcmVzdGFydCB0aGUgYnVsayBlb3QgdGltZXIgc2luY2Ugd2UganVzdCBpbnNlcnRlZCB0cmFmZmljLiAqLwotCQkJbW9kX3RpbWVyKCZidWxrX2VvdF90aW1lciwgamlmZmllcyArIEJVTEtfRU9UX1RJTUVSX0lOVEVSVkFMKTsKLQkJfQotCX0KLQotCURCRkVYSVQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGV0cmF4X3VzYl9jb21wbGV0ZV9idWxrX3VyYihzdHJ1Y3QgdXJiICp1cmIsIGludCBzdGF0dXMpCi17Ci0JZXRyYXhfdXJiX3ByaXZfdCAqdXJiX3ByaXYgPSAoZXRyYXhfdXJiX3ByaXZfdCAqKXVyYi0+aGNwcml2OwotCWludCBlcGlkID0gdXJiX3ByaXYtPmVwaWQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCURCRkVOVEVSOwotCi0JaWYgKHN0YXR1cykKLQkJd2FybigiQ29tcGxldGluZyBidWxrIHVyYiB3aXRoIHN0YXR1cyAlZC4iLCBzdGF0dXMpOwotCi0JZGJnX2J1bGsoIkNvbXBsZXRpbmcgYnVsayB1cmIgMHglbHggZm9yIGVwaWQgJWQiLCAodW5zaWduZWQgbG9uZyl1cmIsIGVwaWQpOwotCi0JLyogVXBkYXRlIHRoZSB1cmIgbGlzdC4gKi8KLQl1cmJfbGlzdF9kZWwodXJiLCBlcGlkKTsKLQotCS8qIEZvciBhbiBJTiBwaXBlLCB3ZSBhbHdheXMgc2V0IHRoZSBhY3R1YWwgbGVuZ3RoLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlcmUgd2FzCi0JICAgYW4gZXJyb3Igb3Igbm90ICh3aGljaCBtZWFucyB0aGUgZGV2aWNlIGRyaXZlciBjYW4gdXNlIHRoZSBkYXRhIGlmIGl0IHdhbnRzIHRvKS4gKi8KLQlpZiAodXNiX3BpcGVpbih1cmItPnBpcGUpKSB7Ci0JCXVyYi0+YWN0dWFsX2xlbmd0aCA9IHVyYl9wcml2LT5yeF9vZmZzZXQ7Ci0JfSBlbHNlIHsKLQkJLyogU2V0IGFjdHVhbF9sZW5ndGggZm9yIE9VVCB1cmJzIGFsc287IHRoZSBVU0IgbWFzcyBzdG9yYWdlIGRyaXZlciBzZWVtcwotCQkgICB0byB3YW50IHRoYXQuIFdlIHdvdWxkbid0IGtub3cgb2YgYW55IHBhcnRpYWwgd3JpdGVzIGlmIHRoZXJlIHdhcyBhbiBlcnJvci4gKi8KLQkJaWYgKHN0YXR1cyA9PSAwKSB7Ci0JCQl1cmItPmFjdHVhbF9sZW5ndGggPSB1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGg7Ci0JCX0gZWxzZSB7Ci0JCQl1cmItPmFjdHVhbF9sZW5ndGggPSAwOwotCQl9Ci0JfQotCi0JLyogRklYTUU6IElzIHRoZXJlIHNvbWV0aGluZyBvZiB0aGUgdGhpbmdzIGJlbG93IHdlIHNob3VsZG4ndCBkbyBpZiB0aGVyZSB3YXMgYW4gZXJyb3I/Ci0JICAgTGlrZSwgbWF5YmUgd2Ugc2hvdWxkbid0IHRvZ2dsZSB0aGUgdG9nZ2xlIGJpdHMsIG9yIG1heWJlIHdlIHNob3VsZG4ndCBpbnNlcnQgbW9yZSB0cmFmZmljLiAqLwotCi0Jc2F2ZV9mbGFncyhmbGFncyk7Ci0JY2xpKCk7Ci0KLQkqUl9VU0JfRVBUX0lOREVYID0gSU9fRklFTEQoUl9VU0JfRVBUX0lOREVYLCB2YWx1ZSwgZXBpZCk7Ci0Jbm9wKCk7Ci0KLQkvKiBXZSBuZWVkIHRvIGZpZGRsZSB3aXRoIHRoZSB0b2dnbGUgYml0cyBiZWNhdXNlIHRoZSBoYXJkd2FyZSBkb2Vzbid0IGRvIGl0IGZvciB1cy4gKi8KLQlpZiAodXNiX3BpcGVvdXQodXJiLT5waXBlKSkgewotCQljaGFyIHRvZ2dsZSA9Ci0JCQlJT19FWFRSQUNUKFJfVVNCX0VQVF9EQVRBLCB0X291dCwgKlJfVVNCX0VQVF9EQVRBKTsKLQkJdXNiX3NldHRvZ2dsZSh1cmItPmRldiwgdXNiX3BpcGVlbmRwb2ludCh1cmItPnBpcGUpLAotCQkJICAgICAgdXNiX3BpcGVvdXQodXJiLT5waXBlKSwgdG9nZ2xlKTsKLQl9IGVsc2UgewotCQljaGFyIHRvZ2dsZSA9Ci0JCQlJT19FWFRSQUNUKFJfVVNCX0VQVF9EQVRBLCB0X2luLCAqUl9VU0JfRVBUX0RBVEEpOwotCQl1c2Jfc2V0dG9nZ2xlKHVyYi0+ZGV2LCB1c2JfcGlwZWVuZHBvaW50KHVyYi0+cGlwZSksCi0JCQkgICAgICB1c2JfcGlwZW91dCh1cmItPnBpcGUpLCB0b2dnbGUpOwotCX0KLQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKLQotCS8qIFJlbWVtYmVyIHRvIGZyZWUgdGhlIFNCcy4gKi8KLQlldHJheF9yZW1vdmVfZnJvbV9zYl9saXN0KHVyYik7Ci0Ja2ZyZWUodXJiX3ByaXYpOwotCXVyYi0+aGNwcml2ID0gMDsKLQotCS8qIElmIHRoZXJlIGFyZSBhbnkgbW9yZSB1cmIncyBpbiB0aGUgbGlzdCB3ZSdkIGJldHRlciBzdGFydCBzZW5kaW5nICovCi0JaWYgKCF1cmJfbGlzdF9lbXB0eShlcGlkKSkgewotCi0JCXN0cnVjdCB1cmIgKm5ld191cmI7Ci0KLQkJLyogR2V0IHRoZSBmaXJzdCB1cmIuICovCi0JCW5ld191cmIgPSB1cmJfbGlzdF9maXJzdChlcGlkKTsKLQkJYXNzZXJ0KG5ld191cmIpOwotCi0JCWRiZ19idWxrKCJNb3JlIGJ1bGsgZm9yIGVwaWQgJWQiLCBlcGlkKTsKLQotCQlldHJheF91c2JfYWRkX3RvX2J1bGtfc2JfbGlzdChuZXdfdXJiLCBlcGlkKTsKLQl9Ci0KLQl1cmItPnN0YXR1cyA9IHN0YXR1czsKLQotCS8qIFdlIGxldCBhbnkgbm9uLXplcm8gc3RhdHVzIGZyb20gdGhlIGxheWVyIGFib3ZlIGhhdmUgcHJlY2VkZW5jZS4gKi8KLQlpZiAoc3RhdHVzID09IDApIHsKLQkJLyogVVJCX1NIT1JUX05PVF9PSyBtZWFucyB0aGF0IHNob3J0IHJlYWRzIChzaG9ydGVyIHRoYW4gdGhlIGVuZHBvaW50J3MgbWF4IGxlbmd0aCkKLQkJICAgaXMgdG8gYmUgdHJlYXRlZCBhcyBhbiBlcnJvci4gKi8KLQkJaWYgKHVyYi0+dHJhbnNmZXJfZmxhZ3MgJiBVUkJfU0hPUlRfTk9UX09LKSB7Ci0JCQlpZiAodXNiX3BpcGVpbih1cmItPnBpcGUpICYmCi0JCQkgICAgKHVyYi0+YWN0dWFsX2xlbmd0aCAhPQotCQkJICAgICB1c2JfbWF4cGFja2V0KHVyYi0+ZGV2LCB1cmItPnBpcGUsIHVzYl9waXBlb3V0KHVyYi0+cGlwZSkpKSkgewotCQkJCXVyYi0+c3RhdHVzID0gLUVSRU1PVEVJTzsKLQkJCX0KLQkJfQotCX0KLQotCWlmICh1cmItPmNvbXBsZXRlKSB7Ci0JCXVyYi0+Y29tcGxldGUodXJiLCBOVUxMKTsKLQl9Ci0KLQlpZiAodXJiX2xpc3RfZW1wdHkoZXBpZCkpIHsKLQkJLyogVGhpcyBtZWFucyB0aGF0IHRoaXMgRVAgaXMgbm93IGZyZWUsIGRlY29uZmlndXJlIGl0LiAqLwotCQlldHJheF91c2JfZnJlZV9lcGlkKGVwaWQpOwotCi0JCS8qIE5vIG1vcmUgdHJhZmZpYzsgdGltZSB0byBjbGVhbiB1cC4KLQkJICAgTXVzdCBzZXQgc3ViIHBvaW50ZXIgdG8gMCwgc2luY2Ugd2UgbG9vayBhdCB0aGUgc3ViIHBvaW50ZXIgd2hlbiBoYW5kbGluZwotCQkgICB0aGUgYnVsayBlb3QgaW50ZXJydXB0LiAqLwotCi0JCWRiZ19idWxrKCJObyBidWxrIGZvciBlcGlkICVkIiwgZXBpZCk7Ci0KLQkJVHhCdWxrRVBMaXN0W2VwaWRdLnN1YiA9IDA7Ci0KLQkJLyogVW5saW5rIHRoZSBkdW1teSBsaXN0LiAqLwotCi0JCWRiZ19idWxrKCJLaWNraW5nIGR1bW15IGxpc3Qgb3V0IG9mIHBhcnR5IGZvciB1cmIgMHglbHgsIGVwaWQgJWQiLAotCQkJICh1bnNpZ25lZCBsb25nKXVyYiwgZXBpZCk7Ci0KLQkJLyogTm8gbmVlZCB0byB3YWl0IGZvciB0aGUgRE1BIGJlZm9yZSBjaGFuZ2luZyB0aGUgbmV4dCBwb2ludGVyLgotCQkgICBUaGUgbW9kdWxvIE5CUl9PRl9FUElEUyBpc24ndCBhY3R1YWxseSBuZWNlc3NhcnksIHNpbmNlIHdlIHdpbGwgbmV2ZXIgdXNlCi0JCSAgIHRoZSBsYXN0IG9uZSAoSU5WQUxJRF9FUElEKSBmb3IgYWN0dWFsIHRyYWZmaWMuICovCi0JCVR4QnVsa0VQTGlzdFtlcGlkXS5uZXh0ID0KLQkJCXZpcnRfdG9fcGh5cygmVHhCdWxrRVBMaXN0WyhlcGlkICsgMSkgJSBOQlJfT0ZfRVBJRFNdKTsKLQl9Ci0KLQlEQkZFWElUOwotfQotCi1zdGF0aWMgaW50IGV0cmF4X3VzYl9zdWJtaXRfY3RybF91cmIoc3RydWN0IHVyYiAqdXJiKQotewotCWludCBlcGlkOwotCWludCBlbXB0eTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWV0cmF4X3VyYl9wcml2X3QgKnVyYl9wcml2OwotCi0JREJGRU5URVI7Ci0KLQkvKiBGSVhNRTogUmV0dXJuIC1FTlhJTyBpZiB0aGVyZSBpcyBhbHJlYWR5IGEgcXVldWVkIHVyYiBmb3IgdGhpcyBlbmRwb2ludD8gKi8KLQotCS8qIEVwaWQgYWxsb2NhdGlvbiwgZW1wdHkgY2hlY2sgYW5kIGxpc3QgYWRkIG11c3QgYmUgcHJvdGVjdGVkLgotCi0JICAgRXBpZCBhbGxvY2F0aW9uIGJlY2F1c2UgaWYgd2UgZmluZCBhbiBleGlzdGluZyBlcGlkIGZvciB0aGlzIGVuZHBvaW50IGFuIHVyYiBtaWdodCBiZQotCSAgIGNvbXBsZXRlZCAoZW1wdHlpbmcgdGhlIGxpc3QpIGJlZm9yZSB3ZSBhZGQgdGhlIG5ldyB1cmIgdG8gdGhlIGxpc3QsIGNhdXNpbmcgdGhlIGVwaWQKLQkgICB0byBiZSBkZS1hbGxvY2F0ZWQuIFdlIHdvdWxkIHRoZW4gc3RhcnQgdGhlIHRyYW5zZmVyIHdpdGggYW4gaW52YWxpZCBlcGlkIC0+IGVwaWQgYXR0bi4KLQotCSAgIEVtcHR5IGNoZWNrIGFuZCBhZGQgYmVjYXVzZSBvdGhlcndpc2Ugd2UgbWlnaHQgY29uY2x1ZGUgdGhhdCB0aGUgbGlzdCBpcyBub3QgZW1wdHksCi0JICAgYWZ0ZXIgd2hpY2ggaXQgYmVjb21lcyBlbXB0eSBiZWZvcmUgd2UgYWRkIHRoZSBuZXcgdXJiIHRvIHRoZSBsaXN0LCBjYXVzaW5nIHVzIG5vdCB0bwotCSAgIGluc2VydCB0aGUgbmV3IHRyYWZmaWMgaW50byB0aGUgU0IgbGlzdC4gKi8KLQotCXNwaW5fbG9ja19pcnFzYXZlKCZ1cmJfbGlzdF9sb2NrLCBmbGFncyk7Ci0JZXBpZCA9IGV0cmF4X3VzYl9zZXR1cF9lcGlkKHVyYik7Ci0JaWYgKGVwaWQgPT0gLTEpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdXJiX2xpc3RfbG9jaywgZmxhZ3MpOwotCQlEQkZFWElUOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JZW1wdHkgPSB1cmJfbGlzdF9lbXB0eShlcGlkKTsKLQl1cmJfbGlzdF9hZGQodXJiLCBlcGlkKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1cmJfbGlzdF9sb2NrLCBmbGFncyk7Ci0KLQlkYmdfY3RybCgiQWRkaW5nIGN0cmwgdXJiIDB4JWx4IHRvICVzIGxpc3QsIGVwaWQgJWQiLAotCQkgKHVuc2lnbmVkIGxvbmcpdXJiLCBlbXB0eSA/ICJlbXB0eSIgOiAiIiwgZXBpZCk7Ci0KLQkvKiBNYXJrIHRoZSB1cmIgYXMgYmVpbmcgaW4gcHJvZ3Jlc3MuICovCi0JdXJiLT5zdGF0dXMgPSAtRUlOUFJPR1JFU1M7Ci0KLQkvKiBTZXR1cCB0aGUgaGNwcml2IGRhdGEuICovCi0JdXJiX3ByaXYgPSBremFsbG9jKHNpemVvZihldHJheF91cmJfcHJpdl90KSwgS01BTExPQ19GTEFHKTsKLQlhc3NlcnQodXJiX3ByaXYgIT0gTlVMTCk7Ci0JLyogVGhpcyBzZXRzIHJ4X29mZnNldCB0byAwLiAqLwotCXVyYl9wcml2LT51cmJfc3RhdGUgPSBOT1RfU1RBUlRFRDsKLQl1cmItPmhjcHJpdiA9IHVyYl9wcml2OwotCi0JaWYgKGVtcHR5KSB7Ci0JCWV0cmF4X3VzYl9hZGRfdG9fY3RybF9zYl9saXN0KHVyYiwgZXBpZCk7Ci0JfQotCi0JREJGRVhJVDsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBldHJheF91c2JfYWRkX3RvX2N0cmxfc2JfbGlzdChzdHJ1Y3QgdXJiICp1cmIsIGludCBlcGlkKQotewotCVVTQl9TQl9EZXNjX3QgKnNiX2Rlc2Nfc2V0dXA7Ci0JVVNCX1NCX0Rlc2NfdCAqc2JfZGVzY19kYXRhOwotCVVTQl9TQl9EZXNjX3QgKnNiX2Rlc2Nfc3RhdHVzOwotCi0JZXRyYXhfdXJiX3ByaXZfdCAqdXJiX3ByaXYgPSAoZXRyYXhfdXJiX3ByaXZfdCAqKXVyYi0+aGNwcml2OwotCi0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQljaGFyIG1heGxlbjsKLQotCURCRkVOVEVSOwotCi0JbWF4bGVuID0gdXNiX21heHBhY2tldCh1cmItPmRldiwgdXJiLT5waXBlLCB1c2JfcGlwZW91dCh1cmItPnBpcGUpKTsKLQotCXNiX2Rlc2Nfc2V0dXAgPSAoVVNCX1NCX0Rlc2NfdCopa21lbV9jYWNoZV9hbGxvYyh1c2JfZGVzY19jYWNoZSwgU0xBQl9GTEFHKTsKLQlhc3NlcnQoc2JfZGVzY19zZXR1cCAhPSBOVUxMKTsKLQlzYl9kZXNjX3N0YXR1cyA9IChVU0JfU0JfRGVzY190KilrbWVtX2NhY2hlX2FsbG9jKHVzYl9kZXNjX2NhY2hlLCBTTEFCX0ZMQUcpOwotCWFzc2VydChzYl9kZXNjX3N0YXR1cyAhPSBOVUxMKTsKLQotCS8qIEluaXRpYWxpemUgdGhlIG1hbmRhdG9yeSBzZXR1cCBTQiBkZXNjcmlwdG9yICh1c2VkIG9ubHkgaW4gY29udHJvbCB0cmFuc2ZlcnMpICovCi0Jc2JfZGVzY19zZXR1cC0+c3dfbGVuID0gODsKLQlzYl9kZXNjX3NldHVwLT5jb21tYW5kID0gKElPX0ZJRUxEKFVTQl9TQl9jb21tYW5kLCByZW0sIDApIHwKLQkJCQkgIElPX1NUQVRFKFVTQl9TQl9jb21tYW5kLCB0dCwgc2V0dXApIHwKLQkJCQkgIElPX1NUQVRFKFVTQl9TQl9jb21tYW5kLCBmdWxsLCB5ZXMpIHwKLQkJCQkgIElPX1NUQVRFKFVTQl9TQl9jb21tYW5kLCBlb3QsIHllcykpOwotCi0Jc2JfZGVzY19zZXR1cC0+YnVmID0gdmlydF90b19waHlzKHVyYi0+c2V0dXBfcGFja2V0KTsKLQotCWlmICh1c2JfcGlwZW91dCh1cmItPnBpcGUpKSB7Ci0JCWRiZ19jdHJsKCJUcmFuc2ZlciBmb3IgZXBpZCAlZCBpcyBPVVQiLCBlcGlkKTsKLQotCQkvKiBJZiB0aGlzIENvbnRyb2wgT1VUIHRyYW5zZmVyIGhhcyBhbiBvcHRpb25hbCBkYXRhIHN0YWdlIHdlIGFkZCBhbiBPVVQgdG9rZW4KLQkJICAgYmVmb3JlIHRoZSBtYW5kYXRvcnkgSU4gKHN0YXR1cykgdG9rZW4sIGhlbmNlIHRoZSByZW9yZGVyZWQgU0IgbGlzdCAqLwotCi0JCXNiX2Rlc2Nfc2V0dXAtPm5leHQgPSB2aXJ0X3RvX3BoeXMoc2JfZGVzY19zdGF0dXMpOwotCQlpZiAodXJiLT50cmFuc2Zlcl9idWZmZXIpIHsKLQotCQkJZGJnX2N0cmwoIlRoaXMgT1VUIHRyYW5zZmVyIGhhcyBhbiBleHRyYSBkYXRhIHN0YWdlIik7Ci0KLQkJCXNiX2Rlc2NfZGF0YSA9IChVU0JfU0JfRGVzY190KilrbWVtX2NhY2hlX2FsbG9jKHVzYl9kZXNjX2NhY2hlLCBTTEFCX0ZMQUcpOwotCQkJYXNzZXJ0KHNiX2Rlc2NfZGF0YSAhPSBOVUxMKTsKLQotCQkJc2JfZGVzY19zZXR1cC0+bmV4dCA9IHZpcnRfdG9fcGh5cyhzYl9kZXNjX2RhdGEpOwotCi0JCQlzYl9kZXNjX2RhdGEtPnN3X2xlbiA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aDsKLQkJCXNiX2Rlc2NfZGF0YS0+Y29tbWFuZCA9IChJT19TVEFURShVU0JfU0JfY29tbWFuZCwgdHQsIG91dCkgfAotCQkJCQkJIElPX1NUQVRFKFVTQl9TQl9jb21tYW5kLCBmdWxsLCB5ZXMpIHwKLQkJCQkJCSBJT19TVEFURShVU0JfU0JfY29tbWFuZCwgZW90LCB5ZXMpKTsKLQkJCXNiX2Rlc2NfZGF0YS0+YnVmID0gdmlydF90b19waHlzKHVyYi0+dHJhbnNmZXJfYnVmZmVyKTsKLQkJCXNiX2Rlc2NfZGF0YS0+bmV4dCA9IHZpcnRfdG9fcGh5cyhzYl9kZXNjX3N0YXR1cyk7Ci0JCX0KLQotCQlzYl9kZXNjX3N0YXR1cy0+c3dfbGVuID0gMTsKLQkJc2JfZGVzY19zdGF0dXMtPmNvbW1hbmQgPSAoSU9fRklFTEQoVVNCX1NCX2NvbW1hbmQsIHJlbSwgMCkgfAotCQkJCQkgICBJT19TVEFURShVU0JfU0JfY29tbWFuZCwgdHQsIGluKSB8Ci0JCQkJCSAgIElPX1NUQVRFKFVTQl9TQl9jb21tYW5kLCBlb3QsIHllcykgfAotCQkJCQkgICBJT19TVEFURShVU0JfU0JfY29tbWFuZCwgaW50ciwgeWVzKSB8Ci0JCQkJCSAgIElPX1NUQVRFKFVTQl9TQl9jb21tYW5kLCBlb2wsIHllcykpOwotCi0JCXNiX2Rlc2Nfc3RhdHVzLT5idWYgPSAwOwotCQlzYl9kZXNjX3N0YXR1cy0+bmV4dCA9IDA7Ci0KLQl9IGVsc2UgaWYgKHVzYl9waXBlaW4odXJiLT5waXBlKSkgewotCi0JCWRiZ19jdHJsKCJUcmFuc2ZlciBmb3IgZXBpZCAlZCBpcyBJTiIsIGVwaWQpOwotCQlkYmdfY3RybCgidHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9ICVkIiwgdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoKTsKLQkJZGJnX2N0cmwoInJlbSBpcyBjYWxjdWxhdGVkIHRvICVkIiwgdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoICUgbWF4bGVuKTsKLQotCQlzYl9kZXNjX2RhdGEgPSAoVVNCX1NCX0Rlc2NfdCopa21lbV9jYWNoZV9hbGxvYyh1c2JfZGVzY19jYWNoZSwgU0xBQl9GTEFHKTsKLQkJYXNzZXJ0KHNiX2Rlc2NfZGF0YSAhPSBOVUxMKTsKLQotCQlzYl9kZXNjX3NldHVwLT5uZXh0ID0gdmlydF90b19waHlzKHNiX2Rlc2NfZGF0YSk7Ci0KLQkJc2JfZGVzY19kYXRhLT5zd19sZW4gPSB1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPwotCQkJKHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCAtIDEpIC8gbWF4bGVuICsgMSA6IDA7Ci0JCWRiZ19jdHJsKCJzd19sZW4gZ290ICVkIiwgc2JfZGVzY19kYXRhLT5zd19sZW4pOwotCi0JCXNiX2Rlc2NfZGF0YS0+Y29tbWFuZCA9Ci0JCQkoSU9fRklFTEQoVVNCX1NCX2NvbW1hbmQsIHJlbSwKLQkJCQkgIHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCAlIG1heGxlbikgfAotCQkJIElPX1NUQVRFKFVTQl9TQl9jb21tYW5kLCB0dCwgaW4pIHwKLQkJCSBJT19TVEFURShVU0JfU0JfY29tbWFuZCwgZW90LCB5ZXMpKTsKLQotCQlzYl9kZXNjX2RhdGEtPmJ1ZiA9IDA7Ci0JCXNiX2Rlc2NfZGF0YS0+bmV4dCA9IHZpcnRfdG9fcGh5cyhzYl9kZXNjX3N0YXR1cyk7Ci0KLQkJLyogUmVhZCBjb21tZW50IGF0IHpvdXRfYnVmZmVyIGRlY2xhcmF0aW9uIGZvciBhbiBleHBsYW5hdGlvbiB0byB0aGlzLiAqLwotCQlzYl9kZXNjX3N0YXR1cy0+c3dfbGVuID0gMTsKLQkJc2JfZGVzY19zdGF0dXMtPmNvbW1hbmQgPSAoSU9fRklFTEQoVVNCX1NCX2NvbW1hbmQsIHJlbSwgMCkgfAotCQkJCQkgICBJT19TVEFURShVU0JfU0JfY29tbWFuZCwgdHQsIHpvdXQpIHwKLQkJCQkJICAgSU9fU1RBVEUoVVNCX1NCX2NvbW1hbmQsIGZ1bGwsIHllcykgfAotCQkJCQkgICBJT19TVEFURShVU0JfU0JfY29tbWFuZCwgZW90LCB5ZXMpIHwKLQkJCQkJICAgSU9fU1RBVEUoVVNCX1NCX2NvbW1hbmQsIGludHIsIHllcykgfAotCQkJCQkgICBJT19TVEFURShVU0JfU0JfY29tbWFuZCwgZW9sLCB5ZXMpKTsKLQotCQlzYl9kZXNjX3N0YXR1cy0+YnVmID0gdmlydF90b19waHlzKCZ6b3V0X2J1ZmZlclswXSk7Ci0JCXNiX2Rlc2Nfc3RhdHVzLT5uZXh0ID0gMDsKLQl9Ci0KLQl1cmJfcHJpdi0+Zmlyc3Rfc2IgPSBzYl9kZXNjX3NldHVwOwotCXVyYl9wcml2LT5sYXN0X3NiID0gc2JfZGVzY19zdGF0dXM7Ci0JdXJiX3ByaXYtPmVwaWQgPSBlcGlkOwotCi0JdXJiX3ByaXYtPnVyYl9zdGF0ZSA9IFNUQVJURUQ7Ci0KLQkvKiBSZXNldCB0b2dnbGUgYml0cyBhbmQgcmVzZXQgZXJyb3IgY291bnQsIHJlbWVtYmVyIHRvIGRpIGFuZCBlaSAqLwotCS8qIFdhcm5pbmc6IGl0IGlzIHBvc3NpYmxlIHRoYXQgdGhpcyBsb2NraW5nIGRvZXNuJ3Qgd29yayB3aXRoIGJvdHRvbS1oYWx2ZXMgKi8KLQotCXNhdmVfZmxhZ3MoZmxhZ3MpOwotCWNsaSgpOwotCi0JKlJfVVNCX0VQVF9JTkRFWCA9IElPX0ZJRUxEKFJfVVNCX0VQVF9JTkRFWCwgdmFsdWUsIGVwaWQpOwotCW5vcCgpOwotCWlmICgqUl9VU0JfRVBUX0RBVEEgJiBJT19NQVNLKFJfVVNCX0VQVF9EQVRBLCBob2xkKSkgewotCQlwYW5pYygiSG9sZCB3YXMgc2V0IGluICVzIiwgX19GVU5DVElPTl9fKTsKLQl9Ci0KLQotCS8qIEZJWE1FOiBDb21wYXJlIHdpdGggZXRyYXhfdXNiX2FkZF90b19idWxrX3NiX2xpc3Qgd2hlcmUgdGhlIHRvZ2dsZSBiaXRzCi0JICAgYXJlIHNldCB0byBhIHNwZWNpZmljIHZhbHVlLiBXaHkgdGhlIGRpZmZlcmVuY2U/IFJlYWQgIlRyYW5zZmVyIGFuZCBUb2dnbGUgQml0cwotCSAgIGluIERlc2lnbmVyJ3MgUmVmZXJlbmNlLCBwLiA4IC0gMTEuICovCi0JKlJfVVNCX0VQVF9EQVRBICY9Ci0JCX4oSU9fTUFTSyhSX1VTQl9FUFRfREFUQSwgZXJyb3JfY291bnRfaW4pIHwKLQkJICBJT19NQVNLKFJfVVNCX0VQVF9EQVRBLCBlcnJvcl9jb3VudF9vdXQpIHwKLQkJICBJT19NQVNLKFJfVVNCX0VQVF9EQVRBLCB0X2luKSB8Ci0JCSAgSU9fTUFTSyhSX1VTQl9FUFRfREFUQSwgdF9vdXQpKTsKLQotCS8qIFNpbmNlIHdlIHVzZSB0aGUgcnggaW50ZXJydXB0IHRvIGNvbXBsZXRlIGN0cmwgdXJicywgd2UgY2FuIGVuYWJsZSBpbnRlcnJ1cHRzIG5vdwotCSAgIChpLmUuIHdlIGRvbid0IGNoZWNrIHRoZSBzdWIgcG9pbnRlciBvbiBhbiBlb3QgaW50ZXJydXB0IGxpa2Ugd2UgZG8gZm9yIGJ1bGsgdHJhZmZpYykuICovCi0JcmVzdG9yZV9mbGFncyhmbGFncyk7Ci0KLQkvKiBBc3NlcnQgdGhhdCB0aGUgRVAgZGVzY3JpcHRvciBpcyBkaXNhYmxlZC4gKi8KLQlhc3NlcnQoIShUeEN0cmxFUExpc3RbZXBpZF0uY29tbWFuZCAmIElPX01BU0soVVNCX0VQX2NvbW1hbmQsIGVuYWJsZSkpKTsKLQotCS8qIFNldCB1cCBhbmQgZW5hYmxlIHRoZSBFUCBkZXNjcmlwdG9yLiAqLwotCVR4Q3RybEVQTGlzdFtlcGlkXS5zdWIgPSB2aXJ0X3RvX3BoeXMoc2JfZGVzY19zZXR1cCk7Ci0JVHhDdHJsRVBMaXN0W2VwaWRdLmh3X2xlbiA9IDA7Ci0JVHhDdHJsRVBMaXN0W2VwaWRdLmNvbW1hbmQgfD0gSU9fU1RBVEUoVVNCX0VQX2NvbW1hbmQsIGVuYWJsZSwgeWVzKTsKLQotCS8qIFdlIHN0YXJ0IHRoZSBETUEgc3ViIGNoYW5uZWwgd2l0aG91dCBjaGVja2luZyBpZiBpdCdzIHJ1bm5pbmcgb3Igbm90LCBiZWNhdXNlOgotCSAgIDEpIElmIGl0J3MgYWxyZWFkeSBydW5uaW5nLCBpc3N1aW5nIHRoZSBzdGFydCBjb21tYW5kIGlzIGEgbm9wLgotCSAgIDIpIFdlIGF2b2lkIGEgdGVzdC1hbmQtc2V0IHJhY2UgY29uZGl0aW9uLiAqLwotCSpSX0RNQV9DSDhfU1VCMV9DTUQgPSBJT19TVEFURShSX0RNQV9DSDhfU1VCMV9DTUQsIGNtZCwgc3RhcnQpOwotCi0JREJGRVhJVDsKLX0KLQotc3RhdGljIHZvaWQgZXRyYXhfdXNiX2NvbXBsZXRlX2N0cmxfdXJiKHN0cnVjdCB1cmIgKnVyYiwgaW50IHN0YXR1cykKLXsKLQlldHJheF91cmJfcHJpdl90ICp1cmJfcHJpdiA9IChldHJheF91cmJfcHJpdl90ICopdXJiLT5oY3ByaXY7Ci0JaW50IGVwaWQgPSB1cmJfcHJpdi0+ZXBpZDsKLQotCURCRkVOVEVSOwotCi0JaWYgKHN0YXR1cykKLQkJd2FybigiQ29tcGxldGluZyBjdHJsIHVyYiB3aXRoIHN0YXR1cyAlZC4iLCBzdGF0dXMpOwotCi0JZGJnX2N0cmwoIkNvbXBsZXRpbmcgY3RybCBlcGlkICVkLCB1cmIgMHglbHgiLCBlcGlkLCAodW5zaWduZWQgbG9uZyl1cmIpOwotCi0JLyogUmVtb3ZlIHRoaXMgdXJiIGZyb20gdGhlIGxpc3QuICovCi0JdXJiX2xpc3RfZGVsKHVyYiwgZXBpZCk7Ci0KLQkvKiBGb3IgYW4gSU4gcGlwZSwgd2UgYWx3YXlzIHNldCB0aGUgYWN0dWFsIGxlbmd0aCwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZXJlIHdhcwotCSAgIGFuIGVycm9yIG9yIG5vdCAod2hpY2ggbWVhbnMgdGhlIGRldmljZSBkcml2ZXIgY2FuIHVzZSB0aGUgZGF0YSBpZiBpdCB3YW50cyB0bykuICovCi0JaWYgKHVzYl9waXBlaW4odXJiLT5waXBlKSkgewotCQl1cmItPmFjdHVhbF9sZW5ndGggPSB1cmJfcHJpdi0+cnhfb2Zmc2V0OwotCX0KLQotCS8qIEZJWE1FOiBJcyB0aGVyZSBzb21ldGhpbmcgb2YgdGhlIHRoaW5ncyBiZWxvdyB3ZSBzaG91bGRuJ3QgZG8gaWYgdGhlcmUgd2FzIGFuIGVycm9yPwotCSAgIExpa2UsIG1heWJlIHdlIHNob3VsZG4ndCBpbnNlcnQgbW9yZSB0cmFmZmljLiAqLwotCi0JLyogUmVtZW1iZXIgdG8gZnJlZSB0aGUgU0JzLiAqLwotCWV0cmF4X3JlbW92ZV9mcm9tX3NiX2xpc3QodXJiKTsKLQlrZnJlZSh1cmJfcHJpdik7Ci0JdXJiLT5oY3ByaXYgPSAwOwotCi0JLyogSWYgdGhlcmUgYXJlIGFueSBtb3JlIHVyYnMgaW4gdGhlIGxpc3Qgd2UnZCBiZXR0ZXIgc3RhcnQgc2VuZGluZy4gKi8KLQlpZiAoIXVyYl9saXN0X2VtcHR5KGVwaWQpKSB7Ci0JCXN0cnVjdCB1cmIgKm5ld191cmI7Ci0KLQkJLyogR2V0IHRoZSBmaXJzdCB1cmIuICovCi0JCW5ld191cmIgPSB1cmJfbGlzdF9maXJzdChlcGlkKTsKLQkJYXNzZXJ0KG5ld191cmIpOwotCi0JCWRiZ19jdHJsKCJNb3JlIGN0cmwgZm9yIGVwaWQgJWQsIGZpcnN0IHVyYiA9IDB4JWx4IiwgZXBpZCwgKHVuc2lnbmVkIGxvbmcpbmV3X3VyYik7Ci0KLQkJZXRyYXhfdXNiX2FkZF90b19jdHJsX3NiX2xpc3QobmV3X3VyYiwgZXBpZCk7Ci0JfQotCi0JdXJiLT5zdGF0dXMgPSBzdGF0dXM7Ci0KLQkvKiBXZSBsZXQgYW55IG5vbi16ZXJvIHN0YXR1cyBmcm9tIHRoZSBsYXllciBhYm92ZSBoYXZlIHByZWNlZGVuY2UuICovCi0JaWYgKHN0YXR1cyA9PSAwKSB7Ci0JCS8qIFVSQl9TSE9SVF9OT1RfT0sgbWVhbnMgdGhhdCBzaG9ydCByZWFkcyAoc2hvcnRlciB0aGFuIHRoZSBlbmRwb2ludCdzIG1heCBsZW5ndGgpCi0JCSAgIGlzIHRvIGJlIHRyZWF0ZWQgYXMgYW4gZXJyb3IuICovCi0JCWlmICh1cmItPnRyYW5zZmVyX2ZsYWdzICYgVVJCX1NIT1JUX05PVF9PSykgewotCQkJaWYgKHVzYl9waXBlaW4odXJiLT5waXBlKSAmJgotCQkJICAgICh1cmItPmFjdHVhbF9sZW5ndGggIT0KLQkJCSAgICAgdXNiX21heHBhY2tldCh1cmItPmRldiwgdXJiLT5waXBlLCB1c2JfcGlwZW91dCh1cmItPnBpcGUpKSkpIHsKLQkJCQl1cmItPnN0YXR1cyA9IC1FUkVNT1RFSU87Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlpZiAodXJiLT5jb21wbGV0ZSkgewotCQl1cmItPmNvbXBsZXRlKHVyYiwgTlVMTCk7Ci0JfQotCi0JaWYgKHVyYl9saXN0X2VtcHR5KGVwaWQpKSB7Ci0JCS8qIE5vIG1vcmUgdHJhZmZpYy4gVGltZSB0byBjbGVhbiB1cC4gKi8KLQkJZXRyYXhfdXNiX2ZyZWVfZXBpZChlcGlkKTsKLQkJLyogTXVzdCBzZXQgc3ViIHBvaW50ZXIgdG8gMC4gKi8KLQkJZGJnX2N0cmwoIk5vIGN0cmwgZm9yIGVwaWQgJWQiLCBlcGlkKTsKLQkJVHhDdHJsRVBMaXN0W2VwaWRdLnN1YiA9IDA7Ci0JfQotCi0JREJGRVhJVDsKLX0KLQotc3RhdGljIGludCBldHJheF91c2Jfc3VibWl0X2ludHJfdXJiKHN0cnVjdCB1cmIgKnVyYikKLXsKLQotCWludCBlcGlkOwotCi0JREJGRU5URVI7Ci0KLQlpZiAodXNiX3BpcGVvdXQodXJiLT5waXBlKSkgewotCQkvKiBVbnN1cHBvcnRlZCB0cmFuc2ZlciB0eXBlLgotCQkgICBXZSBkb24ndCBzdXBwb3J0IGludGVycnVwdCBvdXQgdHJhZmZpYy4gKElmIHdlIGRvLCB3ZSBjYW4ndCBzdXBwb3J0Ci0JCSAgIGludGVydmFscyBmb3IgbmVpdGhlciBpbiBvciBvdXQgdHJhZmZpYywgYnV0IGFyZSBmb3JjZWQgdG8gc2NoZWR1bGUgYWxsCi0JCSAgIGludGVycnVwdCB0cmFmZmljIGluIG9uZSBmcmFtZS4pICovCi0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWVwaWQgPSBldHJheF91c2Jfc2V0dXBfZXBpZCh1cmIpOwotCWlmIChlcGlkID09IC0xKSB7Ci0JCURCRkVYSVQ7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCWlmICghdXJiX2xpc3RfZW1wdHkoZXBpZCkpIHsKLQkJLyogVGhlcmUgaXMgYWxyZWFkeSBhIHF1ZXVlZCB1cmIgZm9yIHRoaXMgZW5kcG9pbnQuICovCi0JCWV0cmF4X3VzYl9mcmVlX2VwaWQoZXBpZCk7Ci0JCXJldHVybiAtRU5YSU87Ci0JfQotCi0JdXJiLT5zdGF0dXMgPSAtRUlOUFJPR1JFU1M7Ci0KLQlkYmdfaW50cigiQWRkIGludHIgdXJiIDB4JWx4LCB0byBsaXN0LCBlcGlkICVkIiwgKHVuc2lnbmVkIGxvbmcpdXJiLCBlcGlkKTsKLQotCXVyYl9saXN0X2FkZCh1cmIsIGVwaWQpOwotCWV0cmF4X3VzYl9hZGRfdG9faW50cl9zYl9saXN0KHVyYiwgZXBpZCk7Ci0KLQlyZXR1cm4gMDsKLQotCURCRkVYSVQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGV0cmF4X3VzYl9hZGRfdG9faW50cl9zYl9saXN0KHN0cnVjdCB1cmIgKnVyYiwgaW50IGVwaWQpCi17Ci0KLQl2b2xhdGlsZSBVU0JfRVBfRGVzY190ICp0bXBfZXA7Ci0Jdm9sYXRpbGUgVVNCX0VQX0Rlc2NfdCAqZmlyc3RfZXA7Ci0KLQljaGFyIG1heGxlbjsKLQlpbnQgaW50ZXJ2YWw7Ci0JaW50IGk7Ci0KLQlldHJheF91cmJfcHJpdl90ICp1cmJfcHJpdjsKLQotCURCRkVOVEVSOwotCi0JbWF4bGVuID0gdXNiX21heHBhY2tldCh1cmItPmRldiwgdXJiLT5waXBlLCB1c2JfcGlwZW91dCh1cmItPnBpcGUpKTsKLQlpbnRlcnZhbCA9IHVyYi0+aW50ZXJ2YWw7Ci0KLQl1cmJfcHJpdiA9IGt6YWxsb2Moc2l6ZW9mKGV0cmF4X3VyYl9wcml2X3QpLCBLTUFMTE9DX0ZMQUcpOwotCWFzc2VydCh1cmJfcHJpdiAhPSBOVUxMKTsKLQl1cmItPmhjcHJpdiA9IHVyYl9wcml2OwotCi0JZmlyc3RfZXAgPSAmVHhJbnRyRVBMaXN0WzBdOwotCi0JLyogUm91bmQgb2YgdGhlIGludGVydmFsIHRvIDJebiwgaXQgaXMgb2J2aW91cyB0aGF0IHRoaXMgY29kZSBmYXZvdXJzCi0JICAgc21hbGxlciBudW1iZXJzLCBidXQgdGhhdCBpcyBhY3R1YWxseSBhIGdvb2QgdGhpbmcgKi8KLQkvKiBGSVhNRTogVGhlICJyb3VuZGluZyBlcnJvciIgZm9yIGxhcmdlciBpbnRlcnZhbHMgd2lsbCBiZSBxdWl0ZQotCSAgIGxhcmdlLiBGb3IgaW4gdHJhZmZpYyB0aGlzIHNob3VsZG4ndCBiZSBhIHByb2JsZW0gc2luY2UgaXQgd2lsbCBvbmx5Ci0JICAgbWVhbiB0aGF0IHdlICJwb2xsIiBtb3JlIG9mdGVuLiAqLwotCWZvciAoaSA9IDA7IGludGVydmFsOyBpKyspIHsKLQkJaW50ZXJ2YWwgPSBpbnRlcnZhbCA+PiAxOwotCX0KLQlpbnRlcnZhbCA9IDEgPDwgKGkgLSAxKTsKLQotCWRiZ19pbnRyKCJJbnRlcnZhbCByb3VuZGVkIHRvICVkIiwgaW50ZXJ2YWwpOwotCi0JdG1wX2VwID0gZmlyc3RfZXA7Ci0JaSA9IDA7Ci0JZG8gewotCQlpZiAodG1wX2VwLT5jb21tYW5kICYgSU9fTUFTSyhVU0JfRVBfY29tbWFuZCwgZW9mKSkgewotCQkJaWYgKChpICUgaW50ZXJ2YWwpID09IDApIHsKLQkJCQkvKiBJbnNlcnQgdGhlIHRyYWZmaWMgZXAgYWZ0ZXIgdG1wX2VwICovCi0JCQkJVVNCX0VQX0Rlc2NfdCAqZXBfZGVzYzsKLQkJCQlVU0JfU0JfRGVzY190ICpzYl9kZXNjOwotCi0JCQkJZGJnX2ludHIoIkluc2VydGluZyBFUCBmb3IgZXBpZCAlZCIsIGVwaWQpOwotCi0JCQkJZXBfZGVzYyA9IChVU0JfRVBfRGVzY190ICopCi0JCQkJCWttZW1fY2FjaGVfYWxsb2ModXNiX2Rlc2NfY2FjaGUsIFNMQUJfRkxBRyk7Ci0JCQkJc2JfZGVzYyA9IChVU0JfU0JfRGVzY190ICopCi0JCQkJCWttZW1fY2FjaGVfYWxsb2ModXNiX2Rlc2NfY2FjaGUsIFNMQUJfRkxBRyk7Ci0JCQkJYXNzZXJ0KGVwX2Rlc2MgIT0gTlVMTCk7Ci0JCQkJQ0hFQ0tfQUxJR04oZXBfZGVzYyk7Ci0JCQkJYXNzZXJ0KHNiX2Rlc2MgIT0gTlVMTCk7Ci0KLQkJCQllcF9kZXNjLT5zdWIgPSB2aXJ0X3RvX3BoeXMoc2JfZGVzYyk7Ci0JCQkJZXBfZGVzYy0+aHdfbGVuID0gMDsKLQkJCQllcF9kZXNjLT5jb21tYW5kID0gKElPX0ZJRUxEKFVTQl9FUF9jb21tYW5kLCBlcGlkLCBlcGlkKSB8Ci0JCQkJCQkgICAgSU9fU1RBVEUoVVNCX0VQX2NvbW1hbmQsIGVuYWJsZSwgeWVzKSk7Ci0KLQotCQkJCS8qIFJvdW5kIHVwd2FyZHMgdGhlIG51bWJlciBvZiBwYWNrZXRzIG9mIHNpemUgbWF4bGVuCi0JCQkJICAgdGhhdCB0aGlzIFNCIGRlc2NyaXB0b3Igc2hvdWxkIHJlY2VpdmUuICovCi0JCQkJc2JfZGVzYy0+c3dfbGVuID0gdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID8KLQkJCQkJKHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCAtIDEpIC8gbWF4bGVuICsgMSA6IDA7Ci0JCQkJc2JfZGVzYy0+bmV4dCA9IDA7Ci0JCQkJc2JfZGVzYy0+YnVmID0gMDsKLQkJCQlzYl9kZXNjLT5jb21tYW5kID0KLQkJCQkJKElPX0ZJRUxEKFVTQl9TQl9jb21tYW5kLCByZW0sIHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCAlIG1heGxlbikgfAotCQkJCQkgSU9fU1RBVEUoVVNCX1NCX2NvbW1hbmQsIHR0LCBpbikgfAotCQkJCQkgSU9fU1RBVEUoVVNCX1NCX2NvbW1hbmQsIGVvdCwgeWVzKSB8Ci0JCQkJCSBJT19TVEFURShVU0JfU0JfY29tbWFuZCwgZW9sLCB5ZXMpKTsKLQotCQkJCWVwX2Rlc2MtPm5leHQgPSB0bXBfZXAtPm5leHQ7Ci0JCQkJdG1wX2VwLT5uZXh0ID0gdmlydF90b19waHlzKGVwX2Rlc2MpOwotCQkJfQotCQkJaSsrOwotCQl9Ci0JCXRtcF9lcCA9IChVU0JfRVBfRGVzY190ICopcGh5c190b192aXJ0KHRtcF9lcC0+bmV4dCk7Ci0JfSB3aGlsZSAodG1wX2VwICE9IGZpcnN0X2VwKTsKLQotCi0JLyogTm90ZSB0aGF0IGZpcnN0X3NiL2xhc3Rfc2IgZG9lc24ndCBhcHBseSB0byBpbnRlcnJ1cHQgdHJhZmZpYy4gKi8KLQl1cmJfcHJpdi0+ZXBpZCA9IGVwaWQ7Ci0KLQkvKiBXZSBzdGFydCB0aGUgRE1BIHN1YiBjaGFubmVsIHdpdGhvdXQgY2hlY2tpbmcgaWYgaXQncyBydW5uaW5nIG9yIG5vdCwgYmVjYXVzZToKLQkgICAxKSBJZiBpdCdzIGFscmVhZHkgcnVubmluZywgaXNzdWluZyB0aGUgc3RhcnQgY29tbWFuZCBpcyBhIG5vcC4KLQkgICAyKSBXZSBhdm9pZCBhIHRlc3QtYW5kLXNldCByYWNlIGNvbmRpdGlvbi4gKi8KLQkqUl9ETUFfQ0g4X1NVQjJfQ01EID0gSU9fU1RBVEUoUl9ETUFfQ0g4X1NVQjJfQ01ELCBjbWQsIHN0YXJ0KTsKLQotCURCRkVYSVQ7Ci19Ci0KLQotCi1zdGF0aWMgdm9pZCBldHJheF91c2JfY29tcGxldGVfaW50cl91cmIoc3RydWN0IHVyYiAqdXJiLCBpbnQgc3RhdHVzKQotewotCWV0cmF4X3VyYl9wcml2X3QgKnVyYl9wcml2ID0gKGV0cmF4X3VyYl9wcml2X3QgKil1cmItPmhjcHJpdjsKLQlpbnQgZXBpZCA9IHVyYl9wcml2LT5lcGlkOwotCi0JREJGRU5URVI7Ci0KLQlpZiAoc3RhdHVzKQotCQl3YXJuKCJDb21wbGV0aW5nIGludHIgdXJiIHdpdGggc3RhdHVzICVkLiIsIHN0YXR1cyk7Ci0KLQlkYmdfaW50cigiQ29tcGxldGluZyBpbnRyIGVwaWQgJWQsIHVyYiAweCVseCIsIGVwaWQsICh1bnNpZ25lZCBsb25nKXVyYik7Ci0KLQl1cmItPnN0YXR1cyA9IHN0YXR1czsKLQl1cmItPmFjdHVhbF9sZW5ndGggPSB1cmJfcHJpdi0+cnhfb2Zmc2V0OwotCi0JZGJnX2ludHIoImludGVycnVwdCB1cmItPmFjdHVhbF9sZW5ndGggPSAlZCIsIHVyYi0+YWN0dWFsX2xlbmd0aCk7Ci0KLQkvKiBXZSBsZXQgYW55IG5vbi16ZXJvIHN0YXR1cyBmcm9tIHRoZSBsYXllciBhYm92ZSBoYXZlIHByZWNlZGVuY2UuICovCi0JaWYgKHN0YXR1cyA9PSAwKSB7Ci0JCS8qIFVSQl9TSE9SVF9OT1RfT0sgbWVhbnMgdGhhdCBzaG9ydCByZWFkcyAoc2hvcnRlciB0aGFuIHRoZSBlbmRwb2ludCdzIG1heCBsZW5ndGgpCi0JCSAgIGlzIHRvIGJlIHRyZWF0ZWQgYXMgYW4gZXJyb3IuICovCi0JCWlmICh1cmItPnRyYW5zZmVyX2ZsYWdzICYgVVJCX1NIT1JUX05PVF9PSykgewotCQkJaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCAhPQotCQkJICAgIHVzYl9tYXhwYWNrZXQodXJiLT5kZXYsIHVyYi0+cGlwZSwgdXNiX3BpcGVvdXQodXJiLT5waXBlKSkpIHsKLQkJCQl1cmItPnN0YXR1cyA9IC1FUkVNT1RFSU87Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiBUaGUgZHJpdmVyIHdpbGwgcmVzdWJtaXQgdGhlIFVSQiBzbyB3ZSBuZWVkIHRvIHJlbW92ZSBpdCBmaXJzdCAqLwotICAgICAgICBldHJheF91c2JfdW5saW5rX3VyYih1cmIsIDApOwotCWlmICh1cmItPmNvbXBsZXRlKSB7Ci0JCXVyYi0+Y29tcGxldGUodXJiLCBOVUxMKTsKLQl9Ci0KLQlEQkZFWElUOwotfQotCi0KLXN0YXRpYyBpbnQgZXRyYXhfdXNiX3N1Ym1pdF9pc29jX3VyYihzdHJ1Y3QgdXJiICp1cmIpCi17Ci0JaW50IGVwaWQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCURCRkVOVEVSOwotCi0JZGJnX2lzb2MoIlN1Ym1pdHRpbmcgaXNvYyB1cmIgPSAweCVseCIsICh1bnNpZ25lZCBsb25nKXVyYik7Ci0KLQkvKiBFcGlkIGFsbG9jYXRpb24sIGVtcHR5IGNoZWNrIGFuZCBsaXN0IGFkZCBtdXN0IGJlIHByb3RlY3RlZC4KLQkgICBSZWFkIGFib3V0IHRoaXMgaW4gZXRyYXhfdXNiX3N1Ym1pdF9jdHJsX3VyYi4gKi8KLQotCXNwaW5fbG9ja19pcnFzYXZlKCZ1cmJfbGlzdF9sb2NrLCBmbGFncyk7Ci0JLyogSXMgdGhlcmUgYW4gYWN0aXZlIGVwaWQgZm9yIHRoaXMgdXJiID8gKi8KLQllcGlkID0gZXRyYXhfdXNiX3NldHVwX2VwaWQodXJiKTsKLQlpZiAoZXBpZCA9PSAtMSkgewotCQlEQkZFWElUOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1cmJfbGlzdF9sb2NrLCBmbGFncyk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCS8qIE9rLCBub3cgd2UgZ290IHZhbGlkIGVuZHBvaW50LCBsZXRzIGluc2VydCBzb21lIHRyYWZmaWMgKi8KLQotCXVyYi0+c3RhdHVzID0gLUVJTlBST0dSRVNTOwotCi0JLyogRmluZCB0aGUgbGFzdCB1cmIgaW4gdGhlIFVSQl9MaXN0IGFuZCBhZGQgdGhpcyB1cmIgYWZ0ZXIgdGhhdCBvbmUuCi0JICAgQWxzbyBhZGQgdGhlIHRyYWZmaWMsIHRoYXQgaXMgZG8gYW4gZXRyYXhfdXNiX2FkZF90b19pc29jX3NiX2xpc3QuICBUaGlzCi0JICAgaXMgaW1wb3J0YW50IHRvIG1ha2UgdGhpcyBpbiAicmVhbCB0aW1lIiBzaW5jZSBpc29jaHJvbm91cyB0cmFmZmljIGlzCi0JICAgdGltZSBzZW5zaXRpdmUuICovCi0KLQlkYmdfaXNvYygiQWRkaW5nIGlzb2MgdXJiIHRvIChwb3NzaWJseSBlbXB0eSkgbGlzdCIpOwotCXVyYl9saXN0X2FkZCh1cmIsIGVwaWQpOwotCWV0cmF4X3VzYl9hZGRfdG9faXNvY19zYl9saXN0KHVyYiwgZXBpZCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdXJiX2xpc3RfbG9jaywgZmxhZ3MpOwotCi0JREJGRVhJVDsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBldHJheF91c2JfY2hlY2tfZXJyb3JfaXNvY19lcChjb25zdCBpbnQgZXBpZCkKLXsKLQl1bnNpZ25lZCBsb25nIGludCBmbGFnczsKLQlpbnQgZXJyb3JfY29kZTsKLQlfX3UzMiByX3VzYl9lcHRfZGF0YTsKLQotCS8qIFdlIGNhbid0IHJlYWQgUl9VU0JfRVBJRF9BVFROIGhlcmUgc2luY2UgaXQgd291bGQgY2xlYXIgdGhlIGlzb19lb2YsCi0JICAgYnVsa19lb3QgYW5kIGVwaWRfYXR0biBpbnRlcnJ1cHRzLiAgU28gd2UganVzdCBjaGVjayB0aGUgc3RhdHVzIG9mCi0JICAgdGhlIGVwaWQgd2l0aG91dCB0ZXN0aW5nIGlmIGZvciBpdCBpbiBSX1VTQl9FUElEX0FUVE4uICovCi0KLQotCXNhdmVfZmxhZ3MoZmxhZ3MpOwotCWNsaSgpOwotCSpSX1VTQl9FUFRfSU5ERVggPSBJT19GSUVMRChSX1VTQl9FUFRfSU5ERVgsIHZhbHVlLCBlcGlkKTsKLQlub3AoKTsKLQkvKiBOb3RlIHRoYXQgYWx0aG91Z2ggdGhlcmUgYXJlIHNlcGFyYXRlIFJfVVNCX0VQVF9EQVRBIGFuZCBSX1VTQl9FUFRfREFUQV9JU08KLQkgICByZWdpc3RlcnMsIHRoZXkgYXJlIGxvY2F0ZWQgYXQgdGhlIHNhbWUgYWRkcmVzcyBhbmQgYXJlIG9mIHRoZSBzYW1lIHNpemUuCi0JICAgSW4gb3RoZXIgd29yZHMsIHRoaXMgcmVhZCBzaG91bGQgYmUgb2sgZm9yIGlzb2MgYWxzby4gKi8KLQlyX3VzYl9lcHRfZGF0YSA9ICpSX1VTQl9FUFRfREFUQTsKLQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKLQotCWVycm9yX2NvZGUgPSBJT19FWFRSQUNUKFJfVVNCX0VQVF9EQVRBX0lTTywgZXJyb3JfY29kZSwgcl91c2JfZXB0X2RhdGEpOwotCi0JaWYgKHJfdXNiX2VwdF9kYXRhICYgSU9fTUFTSyhSX1VTQl9FUFRfREFUQSwgaG9sZCkpIHsKLQkJd2FybigiSG9sZCB3YXMgc2V0IGZvciBlcGlkICVkLiIsIGVwaWQpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKGVycm9yX2NvZGUgPT0gSU9fU1RBVEVfVkFMVUUoUl9VU0JfRVBUX0RBVEFfSVNPLCBlcnJvcl9jb2RlLCBub19lcnJvcikpIHsKLQotCQkvKiBUaGlzIGluZGljYXRlcyB0aGF0IHRoZSBTQiBsaXN0IG9mIHRoZSBlcHQgd2FzIGNvbXBsZXRlZCBiZWZvcmUKLQkJICAgbmV3IGRhdGEgd2FzIGFwcGVuZGVkIHRvIGl0LiAgVGhpcyBpcyBub3QgYW4gZXJyb3IsIGJ1dCBpbmRpY2F0ZXMKLQkJICAgbGFyZ2Ugc3lzdGVtIG9yIFVTQiBsb2FkIGFuZCBjb3VsZCBwb3NzaWJseSBjYXVzZSB0cm91YmxlIGZvcgotCQkgICB2ZXJ5IHRpbWluZyBzZW5zaXRpdmUgVVNCIGRldmljZSBkcml2ZXJzIHNvIHdlIGxvZyBpdC4KLQkJKi8KLQkJaW5mbygiSXNvYy4gZXBpZCAlZCBkaXNhYmxlZCB3aXRoIG5vIGVycm9yIiwgZXBpZCk7Ci0JCXJldHVybjsKLQotCX0gZWxzZSBpZiAoZXJyb3JfY29kZSA9PSBJT19TVEFURV9WQUxVRShSX1VTQl9FUFRfREFUQV9JU08sIGVycm9yX2NvZGUsIHN0YWxsKSkgewotCQkvKiBOb3QgcmVhbGx5IGEgcHJvdG9jb2wgZXJyb3IsIGp1c3Qgc2F5cyB0aGF0IHRoZSBlbmRwb2ludCBnYXZlCi0JCSAgIGEgc3RhbGwgcmVzcG9uc2UuIE5vdGUgdGhhdCBlcnJvcl9jb2RlIGNhbm5vdCBiZSBzdGFsbCBmb3IgaXNvYy4gKi8KLQkJcGFuaWMoIklzb2MgdHJhZmZpYyBjYW5ub3Qgc3RhbGwiKTsKLQotCX0gZWxzZSBpZiAoZXJyb3JfY29kZSA9PSBJT19TVEFURV9WQUxVRShSX1VTQl9FUFRfREFUQV9JU08sIGVycm9yX2NvZGUsIGJ1c19lcnJvcikpIHsKLQkJLyogVHdvIGRldmljZXMgcmVzcG9uZGVkIHRvIGEgdHJhbnNhY3Rpb24gcmVxdWVzdC4gTXVzdCBiZSByZXNvbHZlZAotCQkgICBieSBzb2Z0d2FyZS4gRklYTUU6IFJlc2V0IHBvcnRzPyAqLwotCQlwYW5pYygiQnVzIGVycm9yIGZvciBlcGlkICVkLiIKLQkJICAgICAgIiBUd28gZGV2aWNlcyByZXNwb25kZWQgdG8gdHJhbnNhY3Rpb24gcmVxdWVzdCIsCi0JCSAgICAgIGVwaWQpOwotCi0JfSBlbHNlIGlmIChlcnJvcl9jb2RlID09IElPX1NUQVRFX1ZBTFVFKFJfVVNCX0VQVF9EQVRBLCBlcnJvcl9jb2RlLCBidWZmZXJfZXJyb3IpKSB7Ci0JCS8qIERNQSBvdmVycnVuIG9yIHVuZGVycnVuLiAqLwotCQl3YXJuKCJCdWZmZXIgb3ZlcnJ1bi91bmRlcnJ1biBmb3IgZXBpZCAlZC4gRE1BIHRvbyBidXN5PyIsIGVwaWQpOwotCi0JCS8qIEl0IHNlZW1zIHRoYXQgZXJyb3JfY29kZSA9IGJ1ZmZlcl9lcnJvciBpbgotCQkgICBSX1VTQl9FUFRfREFUQS9SX1VTQl9FUFRfREFUQV9JU08gYW5kIG91cnVuID0geWVzIGluIFJfVVNCX1NUQVRVUwotCQkgICBhcmUgdGhlIHNhbWUgZXJyb3IuICovCi0JfQotfQotCi0KLXN0YXRpYyB2b2lkIGV0cmF4X3VzYl9hZGRfdG9faXNvY19zYl9saXN0KHN0cnVjdCB1cmIgKnVyYiwgaW50IGVwaWQpCi17Ci0KLQlpbnQgaSA9IDA7Ci0KLQlldHJheF91cmJfcHJpdl90ICp1cmJfcHJpdjsKLQlVU0JfU0JfRGVzY190ICpwcmV2X3NiX2Rlc2MsICAqbmV4dF9zYl9kZXNjLCAqdGVtcF9zYl9kZXNjOwotCi0JREJGRU5URVI7Ci0KLQlwcmV2X3NiX2Rlc2MgPSBuZXh0X3NiX2Rlc2MgPSB0ZW1wX3NiX2Rlc2MgPSBOVUxMOwotCi0JdXJiX3ByaXYgPSBremFsbG9jKHNpemVvZihldHJheF91cmJfcHJpdl90KSwgR0ZQX0FUT01JQyk7Ci0JYXNzZXJ0KHVyYl9wcml2ICE9IE5VTEwpOwotCi0JdXJiLT5oY3ByaXYgPSB1cmJfcHJpdjsKLQl1cmJfcHJpdi0+ZXBpZCA9IGVwaWQ7Ci0KLQlpZiAodXNiX3BpcGVvdXQodXJiLT5waXBlKSkgewotCi0JCWlmICh1cmItPm51bWJlcl9vZl9wYWNrZXRzID09IDApIHBhbmljKCJldHJheF91c2JfYWRkX3RvX2lzb2Nfc2JfbGlzdCAwIHBhY2tldHNcbiIpOwotCi0JCWRiZ19pc29jKCJUcmFuc2ZlciBmb3IgZXBpZCAlZCBpcyBPVVQiLCBlcGlkKTsKLQkJZGJnX2lzb2MoIiVkIHBhY2tldHMgaW4gVVJCIiwgdXJiLT5udW1iZXJfb2ZfcGFja2V0cyk7Ci0KLQkJLyogQ3JlYXRlIG9uZSBTQiBkZXNjcmlwdG9yIGZvciBlYWNoIHBhY2tldCBhbmQgbGluayB0aGVtIHRvZ2V0aGVyLiAqLwotCQlmb3IgKGkgPSAwOyBpIDwgdXJiLT5udW1iZXJfb2ZfcGFja2V0czsgaSsrKSB7Ci0JCQlpZiAoIXVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0ubGVuZ3RoKQotCQkJCWNvbnRpbnVlOwotCi0JCQluZXh0X3NiX2Rlc2MgPSAoVVNCX1NCX0Rlc2NfdCopa21lbV9jYWNoZV9hbGxvYyh1c2JfZGVzY19jYWNoZSwgR0ZQX0FUT01JQyk7Ci0JCQlhc3NlcnQobmV4dF9zYl9kZXNjICE9IE5VTEwpOwotCi0JCQlpZiAodXJiLT5pc29fZnJhbWVfZGVzY1tpXS5sZW5ndGggPiAwKSB7Ci0KLQkJCQluZXh0X3NiX2Rlc2MtPmNvbW1hbmQgPSAoSU9fU1RBVEUoVVNCX1NCX2NvbW1hbmQsIHR0LCBvdXQpIHwKLQkJCQkJCQkgSU9fU1RBVEUoVVNCX1NCX2NvbW1hbmQsIGVvdCwgeWVzKSk7Ci0KLQkJCQluZXh0X3NiX2Rlc2MtPnN3X2xlbiA9IHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0ubGVuZ3RoOwotCQkJCW5leHRfc2JfZGVzYy0+YnVmID0gdmlydF90b19waHlzKChjaGFyKil1cmItPnRyYW5zZmVyX2J1ZmZlciArIHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0ub2Zmc2V0KTsKLQotCQkJCS8qIENoZWNrIGlmIGZ1bGwgbGVuZ3RoIHRyYW5zZmVyLiAqLwotCQkJCWlmICh1cmItPmlzb19mcmFtZV9kZXNjW2ldLmxlbmd0aCA9PQotCQkJCSAgICB1c2JfbWF4cGFja2V0KHVyYi0+ZGV2LCB1cmItPnBpcGUsIHVzYl9waXBlb3V0KHVyYi0+cGlwZSkpKSB7Ci0JCQkJCW5leHRfc2JfZGVzYy0+Y29tbWFuZCB8PSBJT19TVEFURShVU0JfU0JfY29tbWFuZCwgZnVsbCwgeWVzKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWRiZ19pc29jKCJ6ZXJvIGxlbiBwYWNrZXQiKTsKLQkJCQluZXh0X3NiX2Rlc2MtPmNvbW1hbmQgPSAoSU9fRklFTEQoVVNCX1NCX2NvbW1hbmQsIHJlbSwgMCkgfAotCQkJCQkJCSBJT19TVEFURShVU0JfU0JfY29tbWFuZCwgdHQsIHpvdXQpIHwKLQkJCQkJCQkgSU9fU1RBVEUoVVNCX1NCX2NvbW1hbmQsIGVvdCwgeWVzKSB8Ci0JCQkJCQkJIElPX1NUQVRFKFVTQl9TQl9jb21tYW5kLCBmdWxsLCB5ZXMpKTsKLQotCQkJCW5leHRfc2JfZGVzYy0+c3dfbGVuID0gMTsKLQkJCQluZXh0X3NiX2Rlc2MtPmJ1ZiA9IHZpcnRfdG9fcGh5cygmem91dF9idWZmZXJbMF0pOwotCQkJfQotCi0JCQkvKiBGaXJzdCBTQiBkZXNjcmlwdG9yIHRoYXQgYmVsb25ncyB0byB0aGlzIHVyYiAqLwotCQkJaWYgKGkgPT0gMCkKLQkJCQl1cmJfcHJpdi0+Zmlyc3Rfc2IgPSBuZXh0X3NiX2Rlc2M7Ci0JCQllbHNlCi0JCQkJcHJldl9zYl9kZXNjLT5uZXh0ID0gdmlydF90b19waHlzKG5leHRfc2JfZGVzYyk7Ci0KLQkJCXByZXZfc2JfZGVzYyA9IG5leHRfc2JfZGVzYzsKLQkJfQotCi0JCW5leHRfc2JfZGVzYy0+Y29tbWFuZCB8PSAoSU9fU1RBVEUoVVNCX1NCX2NvbW1hbmQsIGludHIsIHllcykgfAotCQkJCQkgIElPX1NUQVRFKFVTQl9TQl9jb21tYW5kLCBlb2wsIHllcykpOwotCQluZXh0X3NiX2Rlc2MtPm5leHQgPSAwOwotCQl1cmJfcHJpdi0+bGFzdF9zYiA9IG5leHRfc2JfZGVzYzsKLQotCX0gZWxzZSBpZiAodXNiX3BpcGVpbih1cmItPnBpcGUpKSB7Ci0KLQkJZGJnX2lzb2MoIlRyYW5zZmVyIGZvciBlcGlkICVkIGlzIElOIiwgZXBpZCk7Ci0JCWRiZ19pc29jKCJ0cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gJWQiLCB1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgpOwotCQlkYmdfaXNvYygicmVtIGlzIGNhbGN1bGF0ZWQgdG8gJWQiLCB1cmItPmlzb19mcmFtZV9kZXNjW3VyYi0+bnVtYmVyX29mX3BhY2tldHMgLSAxXS5sZW5ndGgpOwotCi0JCS8qIE5vdGUgdGhhdCBpbiBkZXNjcmlwdG9ycyBmb3IgcGVyaW9kaWMgdHJhZmZpYyBhcmUgbm90IGNvbnN1bWVkLiBUaGlzIG1lYW5zIHRoYXQKLQkJICAgdGhlIFVTQiBjb250cm9sbGVyIG5ldmVyIHByb3BhZ2F0ZXMgaW4gdGhlIFNCIGxpc3QuIEluIG90aGVyIHdvcmRzLCBpZiB0aGVyZSBhbHJlYWR5Ci0JCSAgIGlzIGFuIFNCIGRlc2NyaXB0b3IgaW4gdGhlIGxpc3QgZm9yIHRoaXMgRVAgd2UgZG9uJ3QgaGF2ZSB0byBkbyBhbnl0aGluZy4gKi8KLQkJaWYgKFR4SXNvY0VQTGlzdFtlcGlkXS5zdWIgPT0gMCkgewotCQkJZGJnX2lzb2MoIklzb2MgdHJhZmZpYyBub3QgYWxyZWFkeSBydW5uaW5nLCBhbGxvY2F0aW5nIFNCIik7Ci0KLQkJCW5leHRfc2JfZGVzYyA9IChVU0JfU0JfRGVzY190KilrbWVtX2NhY2hlX2FsbG9jKHVzYl9kZXNjX2NhY2hlLCBHRlBfQVRPTUlDKTsKLQkJCWFzc2VydChuZXh0X3NiX2Rlc2MgIT0gTlVMTCk7Ci0KLQkJCW5leHRfc2JfZGVzYy0+Y29tbWFuZCA9IChJT19TVEFURShVU0JfU0JfY29tbWFuZCwgdHQsIGluKSB8Ci0JCQkJCQkgSU9fU1RBVEUoVVNCX1NCX2NvbW1hbmQsIGVvdCwgeWVzKSB8Ci0JCQkJCQkgSU9fU1RBVEUoVVNCX1NCX2NvbW1hbmQsIGVvbCwgeWVzKSk7Ci0KLQkJCW5leHRfc2JfZGVzYy0+bmV4dCA9IDA7Ci0JCQluZXh0X3NiX2Rlc2MtPnN3X2xlbiA9IDE7IC8qIEFjdHVhbCBudW1iZXIgb2YgcGFja2V0cyBpcyBub3QgcmVsZXZhbnQKLQkJCQkJCSAgICAgZm9yIHBlcmlvZGljIGluIHRyYWZmaWMgYXMgbG9uZyBhcyBpdCBpcyBtb3JlCi0JCQkJCQkgICAgIHRoYW4gemVyby4gIFNldCB0byAxIGFsd2F5cy4gKi8KLQkJCW5leHRfc2JfZGVzYy0+YnVmID0gMDsKLQotCQkJLyogVGhlIHJlbSBmaWVsZCBpcyBkb24ndCBjYXJlIGZvciBpc29jIHRyYWZmaWMsIHNvIHdlIGRvbid0IHNldCBpdC4gKi8KLQotCQkJLyogT25seSBvbmUgU0IgZGVzY3JpcHRvciB0aGF0IGJlbG9uZ3MgdG8gdGhpcyB1cmIuICovCi0JCQl1cmJfcHJpdi0+Zmlyc3Rfc2IgPSBuZXh0X3NiX2Rlc2M7Ci0JCQl1cmJfcHJpdi0+bGFzdF9zYiA9IG5leHRfc2JfZGVzYzsKLQotCQl9IGVsc2UgewotCi0JCQlkYmdfaXNvYygiSXNvYyB0cmFmZmljIGFscmVhZHkgcnVubmluZywganVzdCBzZXR0aW5nIGZpcnN0L2xhc3Rfc2IiKTsKLQotCQkJLyogRWFjaCBFUCBmb3IgaXNvYyBpbiB3aWxsIGhhdmUgb25seSBvbmUgU0IgZGVzY3JpcHRvciwgc2V0dXAgd2hlbiBzdWJtaXR0aW5nIHRoZQotCQkJICAgYWxyZWFkeSBhY3RpdmUgdXJiLiBOb3RlIHRoYXQgZXZlbiB0aG91Z2ggd2UgbWF5IGhhdmUgc2V2ZXJhbCBmaXJzdF9zYi9sYXN0X3NiCi0JCQkgICBwb2ludGluZyBhdCB0aGUgc2FtZSBTQiBkZXNjcmlwdG9yLCB0aGV5IGFyZSBmcmVlZCBvbmx5IG9uY2UgKHdoZW4gdGhlIGxpc3QgaGFzCi0JCQkgICBiZWNvbWUgZW1wdHkpLiAqLwotCQkJdXJiX3ByaXYtPmZpcnN0X3NiID0gcGh5c190b192aXJ0KFR4SXNvY0VQTGlzdFtlcGlkXS5zdWIpOwotCQkJdXJiX3ByaXYtPmxhc3Rfc2IgPSBwaHlzX3RvX3ZpcnQoVHhJc29jRVBMaXN0W2VwaWRdLnN1Yik7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCX0KLQotCS8qIEZpbmQgdGhlIHNwb3QgdG8gaW5zZXJ0IHRoaXMgdXJiIGFuZCBhZGQgaXQuICovCi0JaWYgKFR4SXNvY0VQTGlzdFtlcGlkXS5zdWIgPT0gMCkgewotCQkvKiBGaXJzdCBTQiBkZXNjcmlwdG9yIGluc2VydGVkIGluIHRoaXMgbGlzdCAoaW4gb3Igb3V0KS4gKi8KLQkJZGJnX2lzb2MoIkluc2VydGluZyBTQiBkZXNjIGZpcnN0IGluIGxpc3QiKTsKLQkJVHhJc29jRVBMaXN0W2VwaWRdLmh3X2xlbiA9IDA7Ci0JCVR4SXNvY0VQTGlzdFtlcGlkXS5zdWIgPSB2aXJ0X3RvX3BoeXModXJiX3ByaXYtPmZpcnN0X3NiKTsKLQotCX0gZWxzZSB7Ci0JCS8qIElzb2Nocm9ub3VzIHRyYWZmaWMgaXMgYWxyZWFkeSBydW5uaW5nLCBpbnNlcnQgbmV3IHRyYWZmaWMgbGFzdCAob25seSBvdXQpLiAqLwotCQlkYmdfaXNvYygiSW5zZXJ0aW5nIFNCIGRlc2MgbGFzdCBpbiBsaXN0Iik7Ci0JCXRlbXBfc2JfZGVzYyA9IHBoeXNfdG9fdmlydChUeElzb2NFUExpc3RbZXBpZF0uc3ViKTsKLQkJd2hpbGUgKCh0ZW1wX3NiX2Rlc2MtPmNvbW1hbmQgJiBJT19NQVNLKFVTQl9TQl9jb21tYW5kLCBlb2wpKSAhPQotCQkgICAgICAgSU9fU1RBVEUoVVNCX1NCX2NvbW1hbmQsIGVvbCwgeWVzKSkgewotCQkJYXNzZXJ0KHRlbXBfc2JfZGVzYy0+bmV4dCk7Ci0JCQl0ZW1wX3NiX2Rlc2MgPSBwaHlzX3RvX3ZpcnQodGVtcF9zYl9kZXNjLT5uZXh0KTsKLQkJfQotCQlkYmdfaXNvYygiQXBwZW5kaW5nIGxpc3Qgb24gZGVzYyAweCVwIiwgdGVtcF9zYl9kZXNjKTsKLQotCQkvKiBOZXh0IHBvaW50ZXIgbXVzdCBiZSBzZXQgYmVmb3JlIGVvbCBpcyByZW1vdmVkLiAqLwotCQl0ZW1wX3NiX2Rlc2MtPm5leHQgPSB2aXJ0X3RvX3BoeXModXJiX3ByaXYtPmZpcnN0X3NiKTsKLQkJLyogQ2xlYXIgdGhlIHByZXZpb3VzIGVuZCBvZiBsaXN0IGZsYWcgc2luY2UgdGhlcmUgaXMgYSBuZXcgaW4gdGhlCi0JCSAgIGFkZGVkIFNCIGRlc2NyaXB0b3IgbGlzdC4gKi8KLQkJdGVtcF9zYl9kZXNjLT5jb21tYW5kICY9IH5JT19NQVNLKFVTQl9TQl9jb21tYW5kLCBlb2wpOwotCi0JCWlmICghKFR4SXNvY0VQTGlzdFtlcGlkXS5jb21tYW5kICYgSU9fTUFTSyhVU0JfRVBfY29tbWFuZCwgZW5hYmxlKSkpIHsKLQkJCS8qIDguOC41IGluIERlc2lnbmVyJ3MgUmVmZXJlbmNlIHNheXMgd2Ugc2hvdWxkIGNoZWNrIGZvciBhbmQgY29ycmVjdAotCQkJICAgYW55IGVycm9ycyBpbiB0aGUgRVAgaGVyZS4gIFRoYXQgc2hvdWxkIG5vdCBiZSBuZWNlc3NhcnkgaWYgZXBpZF9hdHRuCi0JCQkgICBpcyBoYW5kbGVkIGNvcnJlY3RseSwgc28gd2UgYXNzdW1lIGFsbCBpcyBvay4gKi8KLQkJCWRiZ19pc29jKCJFUCBkaXNhYmxlZCIpOwotCQkJZXRyYXhfdXNiX2NoZWNrX2Vycm9yX2lzb2NfZXAoZXBpZCk7Ci0KLQkJCS8qIFRoZSBTQiBsaXN0IHdhcyBleGhhdXN0ZWQuICovCi0JCQlpZiAodmlydF90b19waHlzKHVyYl9wcml2LT5sYXN0X3NiKSAhPSBUeElzb2NFUExpc3RbZXBpZF0uc3ViKSB7Ci0JCQkJLyogVGhlIG5ldyBzdWJsaXN0IGRpZCBub3QgZ2V0IHByb2Nlc3NlZCBiZWZvcmUgdGhlIEVQIHdhcwotCQkJCSAgIGRpc2FibGVkLiAgU2V0dXAgdGhlIEVQIGFnYWluLiAqLwotCQkJCWRiZ19pc29jKCJTZXQgRVAgc3ViIHRvIG5ldyBsaXN0Iik7Ci0JCQkJVHhJc29jRVBMaXN0W2VwaWRdLmh3X2xlbiA9IDA7Ci0JCQkJVHhJc29jRVBMaXN0W2VwaWRdLnN1YiA9IHZpcnRfdG9fcGh5cyh1cmJfcHJpdi0+Zmlyc3Rfc2IpOwotCQkJfQotCQl9Ci0JfQotCi0JaWYgKHVyYi0+dHJhbnNmZXJfZmxhZ3MgJiBVUkJfSVNPX0FTQVApIHsKLQkJLyogVGhlIGlzb2MgdHJhbnNmZXIgc2hvdWxkIGJlIHN0YXJ0ZWQgYXMgc29vbiBhcyBwb3NzaWJsZS4gVGhlIHN0YXJ0X2ZyYW1lCi0JCSAgIGZpZWxkIGlzIGEgcmV0dXJuIHZhbHVlIGlmIFVSQl9JU09fQVNBUCB3YXMgc2V0LiBDb21wYXJpbmcgUl9VU0JfRk1fTlVNQkVSCi0JCSAgIHdpdGggYSBVU0IgQ2hpZWYgdHJhY2Ugc2hvd3MgdGhhdCB0aGUgZmlyc3QgaXNvYyBJTiB0b2tlbiBpcyBzZW50IDIgZnJhbWVzCi0JCSAgIGxhdGVyLiBJJ20gbm90IHN1cmUgaG93IHRoaXMgYWZmZWN0cyB1c2FnZSBvZiB0aGUgc3RhcnRfZnJhbWUgZmllbGQgYnkgdGhlCi0JCSAgIGRldmljZSBkcml2ZXIsIG9yIGhvdyBpdCBhZmZlY3RzIHRoaW5ncyB3aGVuIFVTQl9JU09fQVNBUCBpcyBub3Qgc2V0LCBzbwotCQkgICB0aGVyZWZvcmUgdGhlcmUncyBubyBjb21wZW5zYXRpb24gZm9yIHRoZSAyIGZyYW1lICJsYWciIGhlcmUuICovCi0JCXVyYi0+c3RhcnRfZnJhbWUgPSAoKlJfVVNCX0ZNX05VTUJFUiAmIDB4N2ZmKTsKLQkJVHhJc29jRVBMaXN0W2VwaWRdLmNvbW1hbmQgfD0gSU9fU1RBVEUoVVNCX0VQX2NvbW1hbmQsIGVuYWJsZSwgeWVzKTsKLQkJdXJiX3ByaXYtPnVyYl9zdGF0ZSA9IFNUQVJURUQ7Ci0JCWRiZ19pc29jKCJVUkJfSVNPX0FTQVAgc2V0LCB1cmItPnN0YXJ0X2ZyYW1lIHNldCB0byAlZCIsIHVyYi0+c3RhcnRfZnJhbWUpOwotCX0gZWxzZSB7Ci0JCS8qIE5vdCBzdGFydGVkIHlldC4gKi8KLQkJdXJiX3ByaXYtPnVyYl9zdGF0ZSA9IE5PVF9TVEFSVEVEOwotCQlkYmdfaXNvYygidXJiX3ByaXYtPnVyYl9zdGF0ZSBzZXQgdG8gTk9UX1NUQVJURUQiKTsKLQl9Ci0KLSAgICAgICAvKiBXZSBzdGFydCB0aGUgRE1BIHN1YiBjaGFubmVsIHdpdGhvdXQgY2hlY2tpbmcgaWYgaXQncyBydW5uaW5nIG9yIG5vdCwgYmVjYXVzZToKLQkgIDEpIElmIGl0J3MgYWxyZWFkeSBydW5uaW5nLCBpc3N1aW5nIHRoZSBzdGFydCBjb21tYW5kIGlzIGEgbm9wLgotCSAgMikgV2UgYXZvaWQgYSB0ZXN0LWFuZC1zZXQgcmFjZSBjb25kaXRpb24uICovCi0JKlJfRE1BX0NIOF9TVUIzX0NNRCA9IElPX1NUQVRFKFJfRE1BX0NIOF9TVUIzX0NNRCwgY21kLCBzdGFydCk7Ci0KLQlEQkZFWElUOwotfQotCi1zdGF0aWMgdm9pZCBldHJheF91c2JfY29tcGxldGVfaXNvY191cmIoc3RydWN0IHVyYiAqdXJiLCBpbnQgc3RhdHVzKQotewotCWV0cmF4X3VyYl9wcml2X3QgKnVyYl9wcml2ID0gKGV0cmF4X3VyYl9wcml2X3QgKil1cmItPmhjcHJpdjsKLQlpbnQgZXBpZCA9IHVyYl9wcml2LT5lcGlkOwotCWludCBhdXRvX3Jlc3VibWl0ID0gMDsKLQotCURCRkVOVEVSOwotCWRiZ19pc29jKCJjb21wbGV0ZSB1cmIgMHglcCwgc3RhdHVzICVkIiwgdXJiLCBzdGF0dXMpOwotCi0JaWYgKHN0YXR1cykKLQkJd2FybigiQ29tcGxldGluZyBpc29jIHVyYiB3aXRoIHN0YXR1cyAlZC4iLCBzdGF0dXMpOwotCi0JaWYgKHVzYl9waXBlaW4odXJiLT5waXBlKSkgewotCQlpbnQgaTsKLQotCQkvKiBNYWtlIHRoYXQgYWxsIGlzb2MgcGFja2V0cyBoYXZlIHN0YXR1cyBhbmQgbGVuZ3RoIHNldCBiZWZvcmUKLQkJICAgY29tcGxldGluZyB0aGUgdXJiLiAqLwotCQlmb3IgKGkgPSB1cmJfcHJpdi0+aXNvY19wYWNrZXRfY291bnRlcjsgaSA8IHVyYi0+bnVtYmVyX29mX3BhY2tldHM7IGkrKykgewotCQkJdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5hY3R1YWxfbGVuZ3RoID0gMDsKLQkJCXVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0uc3RhdHVzID0gLUVQUk9UTzsKLQkJfQotCi0JCXVyYl9saXN0X2RlbCh1cmIsIGVwaWQpOwotCi0JCWlmICghbGlzdF9lbXB0eSgmdXJiX2xpc3RbZXBpZF0pKSB7Ci0JCQkoKGV0cmF4X3VyYl9wcml2X3QgKikodXJiX2xpc3RfZmlyc3QoZXBpZCktPmhjcHJpdikpLT51cmJfc3RhdGUgPSBTVEFSVEVEOwotCQl9IGVsc2UgewotCQkJdW5zaWduZWQgbG9uZyBpbnQgZmxhZ3M7Ci0JCQlpZiAoVHhJc29jRVBMaXN0W2VwaWRdLmNvbW1hbmQgJiBJT19NQVNLKFVTQl9FUF9jb21tYW5kLCBlbmFibGUpKSB7Ci0JCQkJLyogVGhlIEVQIHdhcyBlbmFibGVkLCBkaXNhYmxlIGl0IGFuZCB3YWl0LiAqLwotCQkJCVR4SXNvY0VQTGlzdFtlcGlkXS5jb21tYW5kICY9IH5JT19NQVNLKFVTQl9FUF9jb21tYW5kLCBlbmFibGUpOwotCi0JCQkJLyogQWgsIHRoZSBsdXh1cnkgb2YgYnVzeS13YWl0LiAqLwotCQkJCXdoaWxlICgqUl9ETUFfQ0g4X1NVQjNfRVAgPT0gdmlydF90b19waHlzKCZUeElzb2NFUExpc3RbZXBpZF0pKTsKLQkJCX0KLQotCQkJZXRyYXhfcmVtb3ZlX2Zyb21fc2JfbGlzdCh1cmIpOwotCQkJVHhJc29jRVBMaXN0W2VwaWRdLnN1YiA9IDA7Ci0JCQlUeElzb2NFUExpc3RbZXBpZF0uaHdfbGVuID0gMDsKLQotCQkJc2F2ZV9mbGFncyhmbGFncyk7Ci0JCQljbGkoKTsKLQkJCWV0cmF4X3VzYl9mcmVlX2VwaWQoZXBpZCk7Ci0JCQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKLQkJfQotCi0JCXVyYi0+aGNwcml2ID0gMDsKLQkJa2ZyZWUodXJiX3ByaXYpOwotCi0JCS8qIFJlbGVhc2UgYWxsb2NhdGVkIGJhbmR3aWR0aC4gKi8KLQkJdXNiX3JlbGVhc2VfYmFuZHdpZHRoKHVyYi0+ZGV2LCB1cmIsIDApOwotCX0gZWxzZSBpZiAodXNiX3BpcGVvdXQodXJiLT5waXBlKSkgewotCQlpbnQgZnJlZWRfZGVzY3I7Ci0KLQkJZGJnX2lzb2MoIklzb2Mgb3V0IHVyYiBjb21wbGV0ZSAweCVwIiwgdXJiKTsKLQotCQkvKiBVcGRhdGUgdGhlIHVyYiBsaXN0LiAqLwotCQl1cmJfbGlzdF9kZWwodXJiLCBlcGlkKTsKLQotCQlmcmVlZF9kZXNjciA9IGV0cmF4X3JlbW92ZV9mcm9tX3NiX2xpc3QodXJiKTsKLQkJZGJnX2lzb2MoImZyZWVkICVkIGRlc2NyaXB0b3JzIG9mICVkIHBhY2tldHMiLCBmcmVlZF9kZXNjciwgdXJiLT5udW1iZXJfb2ZfcGFja2V0cyk7Ci0JCWFzc2VydChmcmVlZF9kZXNjciA9PSB1cmItPm51bWJlcl9vZl9wYWNrZXRzKTsKLQkJdXJiLT5oY3ByaXYgPSAwOwotCQlrZnJlZSh1cmJfcHJpdik7Ci0KLQkJLyogUmVsZWFzZSBhbGxvY2F0ZWQgYmFuZHdpZHRoLiAqLwotCQl1c2JfcmVsZWFzZV9iYW5kd2lkdGgodXJiLT5kZXYsIHVyYiwgMCk7Ci0JfQotCi0JdXJiLT5zdGF0dXMgPSBzdGF0dXM7Ci0JaWYgKHVyYi0+Y29tcGxldGUpIHsKLQkJdXJiLT5jb21wbGV0ZSh1cmIsIE5VTEwpOwotCX0KLQotCWlmIChhdXRvX3Jlc3VibWl0KSB7Ci0JCS8qIENoZWNrIHRoYXQgdXJiIHdhcyBub3QgdW5saW5rZWQgYnkgdGhlIGNvbXBsZXRlIGNhbGxiYWNrLiAqLwotCQlpZiAoX191cmJfbGlzdF9lbnRyeSh1cmIsIGVwaWQpKSB7Ci0JCQkvKiBNb3ZlIHRoaXMgb25lIGRvd24gdGhlIGxpc3QuICovCi0JCQl1cmJfbGlzdF9tb3ZlX2xhc3QodXJiLCBlcGlkKTsKLQotCQkJLyogTWFyayB0aGUgbm93IGZpcnN0IHVyYiBhcyBzdGFydGVkIChtYXkgYWxyZWFkeSBiZSkuICovCi0JCQkoKGV0cmF4X3VyYl9wcml2X3QgKikodXJiX2xpc3RfZmlyc3QoZXBpZCktPmhjcHJpdikpLT51cmJfc3RhdGUgPSBTVEFSVEVEOwotCi0JCQkvKiBNdXN0IHNldCB0aGlzIHRvIDAgc2luY2UgdGhpcyB1cmIgaXMgc3RpbGwgYWN0aXZlIGFmdGVyCi0JCQkgICBjb21wbGV0aW9uLiAqLwotCQkJdXJiX3ByaXYtPmlzb2NfcGFja2V0X2NvdW50ZXIgPSAwOwotCQl9IGVsc2UgewotCQkJd2FybigiKElTT0MpIGF1dG9tYXRpYyByZXN1Ym1pdCB1cmIgMHglcCByZW1vdmVkIGJ5IGNvbXBsZXRlLiIsIHVyYik7Ci0JCX0KLQl9Ci0KLQlEQkZFWElUOwotfQotCi1zdGF0aWMgdm9pZCBldHJheF91c2JfY29tcGxldGVfdXJiKHN0cnVjdCB1cmIgKnVyYiwgaW50IHN0YXR1cykKLXsKLQlzd2l0Y2ggKHVzYl9waXBldHlwZSh1cmItPnBpcGUpKSB7Ci0JY2FzZSBQSVBFX0JVTEs6Ci0JCWV0cmF4X3VzYl9jb21wbGV0ZV9idWxrX3VyYih1cmIsIHN0YXR1cyk7Ci0JCWJyZWFrOwotCWNhc2UgUElQRV9DT05UUk9MOgotCQlldHJheF91c2JfY29tcGxldGVfY3RybF91cmIodXJiLCBzdGF0dXMpOwotCQlicmVhazsKLQljYXNlIFBJUEVfSU5URVJSVVBUOgotCQlldHJheF91c2JfY29tcGxldGVfaW50cl91cmIodXJiLCBzdGF0dXMpOwotCQlicmVhazsKLQljYXNlIFBJUEVfSVNPQ0hST05PVVM6Ci0JCWV0cmF4X3VzYl9jb21wbGV0ZV9pc29jX3VyYih1cmIsIHN0YXR1cyk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWVycigiVW5rbm93biBwaXBldHlwZSIpOwotCX0KLX0KLQotCi0KLXN0YXRpYyBpcnFyZXR1cm5fdCBldHJheF91c2JfaGNfaW50ZXJydXB0X3RvcF9oYWxmKGludCBpcnEsIHZvaWQgKnZoYykKLXsKLQl1c2JfaW50ZXJydXB0X3JlZ2lzdGVyc190ICpyZWc7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlfX3UzMiBpcnFfbWFzazsKLQlfX3U4IHN0YXR1czsKLQlfX3UzMiBlcGlkX2F0dG47Ci0JX191MTYgcG9ydF9zdGF0dXNfMTsKLQlfX3UxNiBwb3J0X3N0YXR1c18yOwotCV9fdTMyIGZtX251bWJlcjsKLQotCURCRkVOVEVSOwotCi0JLyogUmVhZCBjcml0aWNhbCByZWdpc3RlcnMgaW50byBsb2NhbCB2YXJpYWJsZXMsIGRvIGttYWxsb2MgYWZ0ZXJ3YXJkcy4gKi8KLQlzYXZlX2ZsYWdzKGZsYWdzKTsKLQljbGkoKTsKLQotCWlycV9tYXNrID0gKlJfVVNCX0lSUV9NQVNLX1JFQUQ7Ci0JLyogUmVhZGluZyBSX1VTQl9TVEFUVVMgY2xlYXJzIHRoZSBjdGxfc3RhdHVzIGludGVycnVwdC4gTm90ZSB0aGF0IFJfVVNCX1NUQVRVUwotCSAgIG11c3QgYmUgcmVhZCBiZWZvcmUgUl9VU0JfRVBJRF9BVFROIHNpbmNlIHJlYWRpbmcgdGhlIGxhdHRlciBjbGVhcnMgdGhlCi0JICAgb3VydW4gYW5kIHBlcnJvciBmaWVsZHMgb2YgUl9VU0JfU1RBVFVTLiAqLwotCXN0YXR1cyA9ICpSX1VTQl9TVEFUVVM7Ci0KLQkvKiBSZWFkaW5nIFJfVVNCX0VQSURfQVRUTiBjbGVhcnMgdGhlIGlzb19lb2YsIGJ1bGtfZW90IGFuZCBlcGlkX2F0dG4gaW50ZXJydXB0cy4gKi8KLQllcGlkX2F0dG4gPSAqUl9VU0JfRVBJRF9BVFROOwotCi0JLyogUmVhZGluZyBSX1VTQl9SSF9QT1JUX1NUQVRVU18xIGFuZCBSX1VTQl9SSF9QT1JUX1NUQVRVU18yIGNsZWFycyB0aGUKLQkgICBwb3J0X3N0YXR1cyBpbnRlcnJ1cHQuICovCi0JcG9ydF9zdGF0dXNfMSA9ICpSX1VTQl9SSF9QT1JUX1NUQVRVU18xOwotCXBvcnRfc3RhdHVzXzIgPSAqUl9VU0JfUkhfUE9SVF9TVEFUVVNfMjsKLQotCS8qIFJlYWRpbmcgUl9VU0JfRk1fTlVNQkVSIGNsZWFycyB0aGUgc29mIGludGVycnVwdC4gKi8KLQkvKiBOb3RlOiB0aGUgbG93ZXIgMTEgYml0cyBjb250YWluIHRoZSBhY3R1YWwgZnJhbWUgbnVtYmVyLCBzZW50IHdpdGggZWFjaCBzb2YuICovCi0JZm1fbnVtYmVyID0gKlJfVVNCX0ZNX05VTUJFUjsKLQotCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOwotCi0JcmVnID0gKHVzYl9pbnRlcnJ1cHRfcmVnaXN0ZXJzX3QgKilrbWVtX2NhY2hlX2FsbG9jKHRvcF9oYWxmX3JlZ19jYWNoZSwgR0ZQX0FUT01JQyk7Ci0KLQlhc3NlcnQocmVnICE9IE5VTEwpOwotCi0JcmVnLT5oYyA9IChldHJheF9oY190ICopdmhjOwotCi0JLyogTm93IHB1dCByZWdpc3RlciB2YWx1ZXMgaW50byBrbWFsbG9jJ2QgYXJlYS4gKi8KLQlyZWctPnJfdXNiX2lycV9tYXNrX3JlYWQgPSBpcnFfbWFzazsKLQlyZWctPnJfdXNiX3N0YXR1cyA9IHN0YXR1czsKLQlyZWctPnJfdXNiX2VwaWRfYXR0biA9IGVwaWRfYXR0bjsKLQlyZWctPnJfdXNiX3JoX3BvcnRfc3RhdHVzXzEgPSBwb3J0X3N0YXR1c18xOwotCXJlZy0+cl91c2JfcmhfcG9ydF9zdGF0dXNfMiA9IHBvcnRfc3RhdHVzXzI7Ci0JcmVnLT5yX3VzYl9mbV9udW1iZXIgPSBmbV9udW1iZXI7Ci0KLSAgICAgICAgSU5JVF9XT1JLKCZyZWctPnVzYl9iaCwgZXRyYXhfdXNiX2hjX2ludGVycnVwdF9ib3R0b21faGFsZiwgcmVnKTsKLSAgICAgICAgc2NoZWR1bGVfd29yaygmcmVnLT51c2JfYmgpOwotCi0JREJGRVhJVDsKLQotICAgICAgICByZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGV0cmF4X3VzYl9oY19pbnRlcnJ1cHRfYm90dG9tX2hhbGYodm9pZCAqZGF0YSkKLXsKLQl1c2JfaW50ZXJydXB0X3JlZ2lzdGVyc190ICpyZWcgPSAodXNiX2ludGVycnVwdF9yZWdpc3RlcnNfdCAqKWRhdGE7Ci0JX191MzIgaXJxX21hc2sgPSByZWctPnJfdXNiX2lycV9tYXNrX3JlYWQ7Ci0KLQlEQkZFTlRFUjsKLQotCS8qIEludGVycnVwdHMgYXJlIGhhbmRsZWQgaW4gb3JkZXIgb2YgcHJpb3JpdHkuICovCi0JaWYgKGlycV9tYXNrICYgSU9fTUFTSyhSX1VTQl9JUlFfTUFTS19SRUFELCBlcGlkX2F0dG4pKSB7Ci0JCWV0cmF4X3VzYl9oY19lcGlkX2F0dG5faW50ZXJydXB0KHJlZyk7Ci0JfQotCWlmIChpcnFfbWFzayAmIElPX01BU0soUl9VU0JfSVJRX01BU0tfUkVBRCwgcG9ydF9zdGF0dXMpKSB7Ci0JCWV0cmF4X3VzYl9oY19wb3J0X3N0YXR1c19pbnRlcnJ1cHQocmVnKTsKLQl9Ci0JaWYgKGlycV9tYXNrICYgSU9fTUFTSyhSX1VTQl9JUlFfTUFTS19SRUFELCBjdGxfc3RhdHVzKSkgewotCQlldHJheF91c2JfaGNfY3RsX3N0YXR1c19pbnRlcnJ1cHQocmVnKTsKLQl9Ci0JaWYgKGlycV9tYXNrICYgSU9fTUFTSyhSX1VTQl9JUlFfTUFTS19SRUFELCBpc29fZW9mKSkgewotCQlldHJheF91c2JfaGNfaXNvY19lb2ZfaW50ZXJydXB0KCk7Ci0JfQotCWlmIChpcnFfbWFzayAmIElPX01BU0soUl9VU0JfSVJRX01BU0tfUkVBRCwgYnVsa19lb3QpKSB7Ci0JCS8qIFVwZGF0ZS9yZXN0YXJ0IHRoZSBidWxrIHN0YXJ0IHRpbWVyIHNpbmNlIG9idmlvdXNseSB0aGUgY2hhbm5lbCBpcyBydW5uaW5nLiAqLwotCQltb2RfdGltZXIoJmJ1bGtfc3RhcnRfdGltZXIsIGppZmZpZXMgKyBCVUxLX1NUQVJUX1RJTUVSX0lOVEVSVkFMKTsKLQkJLyogVXBkYXRlL3Jlc3RhcnQgdGhlIGJ1bGsgZW90IHRpbWVyIHNpbmNlIHdlIGp1c3QgcmVjZWl2ZWQgYW4gYnVsayBlb3QgaW50ZXJydXB0LiAqLwotCQltb2RfdGltZXIoJmJ1bGtfZW90X3RpbWVyLCBqaWZmaWVzICsgQlVMS19FT1RfVElNRVJfSU5URVJWQUwpOwotCi0JCWV0cmF4X3VzYl9oY19idWxrX2VvdF9pbnRlcnJ1cHQoMCk7Ci0JfQotCi0Ja21lbV9jYWNoZV9mcmVlKHRvcF9oYWxmX3JlZ19jYWNoZSwgcmVnKTsKLQotCURCRkVYSVQ7Ci19Ci0KLQotdm9pZCBldHJheF91c2JfaGNfaXNvY19lb2ZfaW50ZXJydXB0KHZvaWQpCi17Ci0Jc3RydWN0IHVyYiAqdXJiOwotCWV0cmF4X3VyYl9wcml2X3QgKnVyYl9wcml2OwotCWludCBlcGlkOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlEQkZFTlRFUjsKLQotCS8qIERvIG5vdCBjaGVjayB0aGUgaW52YWxpZCBlcGlkIChpdCBoYXMgYSB2YWxpZCBzdWIgcG9pbnRlcikuICovCi0JZm9yIChlcGlkID0gMDsgZXBpZCA8IE5CUl9PRl9FUElEUyAtIDE7IGVwaWQrKykgewotCi0JCS8qIERvIG5vdCBjaGVjayB0aGUgaW52YWxpZCBlcGlkIChpdCBoYXMgYSB2YWxpZCBzdWIgcG9pbnRlcikuICovCi0JCWlmICgoZXBpZCA9PSBEVU1NWV9FUElEKSB8fCAoZXBpZCA9PSBJTlZBTElEX0VQSUQpKQotCQkJY29udGludWU7Ci0KLQkJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIHRvIGJsb2NrIHRoZSBpc29jIG91dCBkZXNjcmlwdG9yIGludGVycnVwdCBoYW5kbGVyCi0JCSAgIGZyb20gYmVpbmcgY2FsbGVkIHdoaWxlIHRoZSBpc29jIEVQSUQgbGlzdCBpcyBiZWluZyBjaGVja2VkLgotCQkqLwotCQlzYXZlX2ZsYWdzKGZsYWdzKTsKLQkJY2xpKCk7Ci0KLQkJaWYgKFR4SXNvY0VQTGlzdFtlcGlkXS5zdWIgPT0gMCkgewotCQkJLyogTm90aGluZyBoZXJlIHRvIHNlZS4gKi8KLQkJCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOwotCQkJY29udGludWU7Ci0JCX0KLQotCQkvKiBHZXQgdGhlIGZpcnN0IHVyYiAoaWYgYW55KS4gKi8KLQkJdXJiID0gdXJiX2xpc3RfZmlyc3QoZXBpZCk7Ci0JCWlmICh1cmIgPT0gMCkgewotCQkJd2FybigiSWdub3JpbmcgTlVMTCB1cmIiKTsKLQkJCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKHVzYl9waXBlaW4odXJiLT5waXBlKSkgewotCi0JCQkvKiBTYW5pdHkgY2hlY2suICovCi0JCQlhc3NlcnQodXNiX3BpcGV0eXBlKHVyYi0+cGlwZSkgPT0gUElQRV9JU09DSFJPTk9VUyk7Ci0KLQkJCXVyYl9wcml2ID0gKGV0cmF4X3VyYl9wcml2X3QgKil1cmItPmhjcHJpdjsKLQkJCWFzc2VydCh1cmJfcHJpdik7Ci0KLQkJCWlmICh1cmJfcHJpdi0+dXJiX3N0YXRlID09IE5PVF9TVEFSVEVEKSB7Ci0KLQkJCQkvKiBJZiBBU0FQIGlzIG5vdCBzZXQgYW5kIHVyYi0+c3RhcnRfZnJhbWUgaXMgdGhlIGN1cnJlbnQgZnJhbWUsCi0JCQkJICAgc3RhcnQgdGhlIHRyYW5zZmVyLiAqLwotCQkJCWlmICghKHVyYi0+dHJhbnNmZXJfZmxhZ3MgJiBVUkJfSVNPX0FTQVApICYmCi0JCQkJICAgICh1cmItPnN0YXJ0X2ZyYW1lID09ICgqUl9VU0JfRk1fTlVNQkVSICYgMHg3ZmYpKSkgewotCi0JCQkJCWRiZ19pc29jKCJFbmFibGluZyBpc29jIElOIEVQIGRlc2NyIGZvciBlcGlkICVkIiwgZXBpZCk7Ci0JCQkJCVR4SXNvY0VQTGlzdFtlcGlkXS5jb21tYW5kIHw9IElPX1NUQVRFKFVTQl9FUF9jb21tYW5kLCBlbmFibGUsIHllcyk7Ci0KLQkJCQkJLyogVGhpcyB1cmIgaXMgbm93IGFjdGl2ZS4gKi8KLQkJCQkJdXJiX3ByaXYtPnVyYl9zdGF0ZSA9IFNUQVJURUQ7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKLQl9Ci0KLQlEQkZFWElUOwotCi19Ci0KLXZvaWQgZXRyYXhfdXNiX2hjX2J1bGtfZW90X2ludGVycnVwdChpbnQgdGltZXJfaW5kdWNlZCkKLXsKLSAJaW50IGVwaWQ7Ci0KLQkvKiBUaGUgdGVjaG5pcXVlIGlzIHRvIHJ1biBvbmUgdXJiIGF0IGEgdGltZSwgd2FpdCBmb3IgdGhlIGVvdCBpbnRlcnJ1cHQgYXQgd2hpY2gKLQkgICBwb2ludCB0aGUgRVAgZGVzY3JpcHRvciBoYXMgYmVlbiBkaXNhYmxlZC4gKi8KLQotCURCRkVOVEVSOwotCWRiZ19idWxrKCJidWxrIGVvdCVzIiwgdGltZXJfaW5kdWNlZCA/ICIsIGNhbGxlZCBieSB0aW1lciIgOiAiIik7Ci0KLQlmb3IgKGVwaWQgPSAwOyBlcGlkIDwgTkJSX09GX0VQSURTOyBlcGlkKyspIHsKLQotCQlpZiAoIShUeEJ1bGtFUExpc3RbZXBpZF0uY29tbWFuZCAmIElPX01BU0soVVNCX0VQX2NvbW1hbmQsIGVuYWJsZSkpICYmCi0JCSAgICAoVHhCdWxrRVBMaXN0W2VwaWRdLnN1YiAhPSAwKSkgewotCi0JCQlzdHJ1Y3QgdXJiICp1cmI7Ci0JCQlldHJheF91cmJfcHJpdl90ICp1cmJfcHJpdjsKLQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JCQlfX3UzMiByX3VzYl9lcHRfZGF0YTsKLQotCQkJLyogRm91bmQgYSBkaXNhYmxlZCBFUCBkZXNjcmlwdG9yIHdoaWNoIGhhcyBhIG5vbi1udWxsIHN1YiBwb2ludGVyLgotCQkJICAgVmVyaWZ5IHRoYXQgdGhpcyBjdHJsIEVQIGRlc2NyaXB0b3IgZ290IGRpc2FibGVkIG5vIGVycm9ycy4KLQkJCSAgIEZJWE1FOiBOZWNlc3NhcnkgdG8gY2hlY2sgZXJyb3JfY29kZT8gKi8KLQkJCWRiZ19idWxrKCJmb3IgZXBpZCAlZD8iLCBlcGlkKTsKLQotCQkJLyogR2V0IHRoZSBmaXJzdCB1cmIuICovCi0JCQl1cmIgPSB1cmJfbGlzdF9maXJzdChlcGlkKTsKLQotCQkJLyogRklYTUU6IENvdWxkIHRoaXMgaGFwcGVuIGZvciB2YWxpZCByZWFzb25zPyBXaHkgZGlkIGl0IGRpc2FwcGVhcj8gQmVjYXVzZSBvZgotCQkJICAgd3JvbmcgdW5saW5raW5nPyAqLwotCQkJaWYgKCF1cmIpIHsKLQkJCQl3YXJuKCJOVUxMIHVyYiBmb3IgZXBpZCAlZCIsIGVwaWQpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlhc3NlcnQodXJiKTsKLQkJCXVyYl9wcml2ID0gKGV0cmF4X3VyYl9wcml2X3QgKil1cmItPmhjcHJpdjsKLQkJCWFzc2VydCh1cmJfcHJpdik7Ci0KLQkJCS8qIFNhbml0eSBjaGVja3MuICovCi0JCQlhc3NlcnQodXNiX3BpcGV0eXBlKHVyYi0+cGlwZSkgPT0gUElQRV9CVUxLKTsKLQkJCWlmIChwaHlzX3RvX3ZpcnQoVHhCdWxrRVBMaXN0W2VwaWRdLnN1YikgIT0gdXJiX3ByaXYtPmxhc3Rfc2IpIHsKLQkJCQllcnIoImJ1bGsgZW5kcG9pbnQgZ290IGRpc2FibGVkIGJlZm9yZSByZWFjaGluZyBsYXN0IHNiIik7Ci0JCQl9Ci0KLQkJCS8qIEZvciBidWxrIElOIHRyYWZmaWMsIHRoZXJlIHNlZW1zIHRvIGJlIGEgcmFjZSBjb25kaXRpb24gYmV0d2VlbgotCQkJICAgYmV0d2VlbiB0aGUgYnVsayBlb3QgYW5kIGVvcCBpbnRlcnJ1cHRzLCBvciByYXRoZXIgYW4gdW5jZXJ0YWludHkgcmVnYXJkaW5nCi0JCQkgICB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBoYXBwZW4uIE5vcm1hbGx5IHdlIGV4cGVjdCB0aGUgZW9wIGludGVycnVwdCBmcm9tCi0JCQkgICBETUEgY2hhbm5lbCA5IHRvIGhhcHBlbiBiZWZvcmUgdGhlIGVvdCBpbnRlcnJ1cHQuCi0KLQkJCSAgIFRoZXJlZm9yZSwgd2UgY29tcGxldGUgdGhlIGJ1bGsgSU4gdXJiIGluIHRoZSByeCBpbnRlcnJ1cHQgaGFuZGxlciBpbnN0ZWFkLiAqLwotCi0JCQlpZiAodXNiX3BpcGVpbih1cmItPnBpcGUpKSB7Ci0JCQkJZGJnX2J1bGsoImluIHVyYiwgY29udGludWluZyIpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlzYXZlX2ZsYWdzKGZsYWdzKTsKLQkJCWNsaSgpOwotCQkJKlJfVVNCX0VQVF9JTkRFWCA9IElPX0ZJRUxEKFJfVVNCX0VQVF9JTkRFWCwgdmFsdWUsIGVwaWQpOwotCQkJbm9wKCk7Ci0JCQlyX3VzYl9lcHRfZGF0YSA9ICpSX1VTQl9FUFRfREFUQTsKLQkJCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOwotCi0JCQlpZiAoSU9fRVhUUkFDVChSX1VTQl9FUFRfREFUQSwgZXJyb3JfY29kZSwgcl91c2JfZXB0X2RhdGEpID09Ci0JCQkgICAgSU9fU1RBVEVfVkFMVUUoUl9VU0JfRVBUX0RBVEEsIGVycm9yX2NvZGUsIG5vX2Vycm9yKSkgewotCQkJCS8qIFRoaXMgbWVhbnMgdGhhdCB0aGUgZW5kcG9pbnQgaGFzIG5vIGVycm9yLCBpcyBkaXNhYmxlZAotCQkJCSAgIGFuZCBoYWQgaW5zZXJ0ZWQgdHJhZmZpYywgaS5lLiB0cmFuc2ZlciBzdWNjZXNzZnVsbHkgY29tcGxldGVkLiAqLwotCQkJCWV0cmF4X3VzYl9jb21wbGV0ZV9idWxrX3VyYih1cmIsIDApOwotCQkJfSBlbHNlIHsKLQkJCQkvKiBTaG91bGRuJ3QgaGFwcGVuLiBXZSBleHBlY3QgZXJyb3JzIHRvIGJlIGNhdWdodCBieSBlcGlkIGF0dGVudGlvbi4gKi8KLQkJCQllcnIoIkZvdW5kIGRpc2FibGVkIGJ1bGsgRVAgZGVzYywgZXJyb3JfY29kZSAhPSBub19lcnJvciIpOwotCQkJfQotCQl9Ci0JfQotCi0JLyogTm9ybWFsbHksIHdlIHNob3VsZCBmaW5kIChhdCBsZWFzdCkgb25lIGRpc2FibGVkIEVQIGRlc2NyaXB0b3Igd2l0aCBhIHZhbGlkIHN1YiBwb2ludGVyLgotCSAgIEhvd2V2ZXIsIGJlY2F1c2Ugb2YgdGhlIHVuY2VydGFpbnR5IGluIHRoZSBkZWxpdmVyYW5jZSBvZiB0aGUgZW9wL2VvdCBpbnRlcnJ1cHRzLCB3ZSBtYXkKLQkgICBub3QuICBBbHNvLCB3ZSBtaWdodCBmaW5kIHR3byBkaXNhYmxlZCBFUHMgd2hlbiBoYW5kbGluZyBhbiBlb3QgaW50ZXJydXB0LCBhbmQgdGhlbiBmaW5kCi0JICAgbm9uZSB0aGUgbmV4dCB0aW1lLiAqLwotCi0JREJGRVhJVDsKLQotfQotCi12b2lkIGV0cmF4X3VzYl9oY19lcGlkX2F0dG5faW50ZXJydXB0KHVzYl9pbnRlcnJ1cHRfcmVnaXN0ZXJzX3QgKnJlZykKLXsKLQkvKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhlIGVwaWQgYXR0ZW50aW9uIGludGVycnVwdC4gIFRoZXJlIGFyZSBhIHZhcmlldHkgb2YgcmVhc29ucwotCSAgIGZvciB0aGlzIGludGVycnVwdCB0byBoYXBwZW4gKERlc2lnbmVyJ3MgUmVmZXJlbmNlLCBwLiA4IC0gMjIgZm9yIHRoZSBkZXRhaWxzKToKLQotCSAgIGludmFsaWQgZXBfaWQgIC0gSW52YWxpZCBlcGlkIGluIGFuIEVQIChFUCBkaXNhYmxlZCkuCi0JICAgc3RhbGwJICAtIE5vdCBzdHJpY3RseSBhbiBlcnJvciBjb25kaXRpb24gKEVQIGRpc2FibGVkKS4KLQkgICAzcmQgZXJyb3IgICAgICAtIFRocmVlIHN1Y2Nlc3NpdmUgdHJhbnNhY3Rpb24gZXJyb3JzICAoRVAgZGlzYWJsZWQpLgotCSAgIGJ1ZmZlciBvdXJ1biAgIC0gQnVmZmVyIG92ZXJydW4gb3IgdW5kZXJydW4gKEVQIGRpc2FibGVkKS4KLQkgICBwYXN0IGVvZjEgICAgICAtIEludHIgb3IgaXNvYyB0cmFuc2FjdGlvbiBwcm9jZWVkcyBwYXN0IEVPRjEuCi0JICAgbmVhciBlb2YgICAgICAgLSBJbnRyIG9yIGlzb2MgdHJhbnNhY3Rpb24gd291bGQgbm90IGZpdCBpbnNpZGUgdGhlIGZyYW1lLgotCSAgIHpvdXQgdHJhbnNmZXIgIC0gSWYgem91dCB0cmFuc2ZlciBmb3IgYSBidWxrIGVuZHBvaW50IChFUCBkaXNhYmxlZCkuCi0JICAgc2V0dXAgdHJhbnNmZXIgLSBJZiBzZXR1cCB0cmFuc2ZlciBmb3IgYSBub24tY3RybCBlbmRwb2ludCAoRVAgZGlzYWJsZWQpLiAqLwotCi0JaW50IGVwaWQ7Ci0KLQotCURCRkVOVEVSOwotCi0JYXNzZXJ0KHJlZyAhPSBOVUxMKTsKLQotCS8qIE5vdGUgdGhhdCB3ZSBsb29wIHRocm91Z2ggYWxsIGVwaWRzLiBXZSBzdGlsbCB3YW50IHRvIGNhdGNoIGVycm9ycyBmb3IKLQkgICB0aGUgaW52YWxpZCBvbmUsIGV2ZW4gdGhvdWdoIHdlIG1pZ2h0IGhhbmRsZSB0aGVtIGRpZmZlcmVudGx5LiAqLwotCWZvciAoZXBpZCA9IDA7IGVwaWQgPCBOQlJfT0ZfRVBJRFM7IGVwaWQrKykgewotCi0JCWlmICh0ZXN0X2JpdChlcGlkLCAodm9pZCAqKSZyZWctPnJfdXNiX2VwaWRfYXR0bikpIHsKLQotCQkJc3RydWN0IHVyYiAqdXJiOwotCQkJX191MzIgcl91c2JfZXB0X2RhdGE7Ci0JCQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCQkJaW50IGVycm9yX2NvZGU7Ci0KLQkJCXNhdmVfZmxhZ3MoZmxhZ3MpOwotCQkJY2xpKCk7Ci0JCQkqUl9VU0JfRVBUX0lOREVYID0gSU9fRklFTEQoUl9VU0JfRVBUX0lOREVYLCB2YWx1ZSwgZXBpZCk7Ci0JCQlub3AoKTsKLQkJCS8qIE5vdGUgdGhhdCBhbHRob3VnaCB0aGVyZSBhcmUgc2VwYXJhdGUgUl9VU0JfRVBUX0RBVEEgYW5kIFJfVVNCX0VQVF9EQVRBX0lTTwotCQkJICAgcmVnaXN0ZXJzLCB0aGV5IGFyZSBsb2NhdGVkIGF0IHRoZSBzYW1lIGFkZHJlc3MgYW5kIGFyZSBvZiB0aGUgc2FtZSBzaXplLgotCQkJICAgSW4gb3RoZXIgd29yZHMsIHRoaXMgcmVhZCBzaG91bGQgYmUgb2sgZm9yIGlzb2MgYWxzby4gKi8KLQkJCXJfdXNiX2VwdF9kYXRhID0gKlJfVVNCX0VQVF9EQVRBOwotCQkJcmVzdG9yZV9mbGFncyhmbGFncyk7Ci0KLQkJCS8qIEZpcnN0IHNvbWUgc2FuaXR5IGNoZWNrcy4gKi8KLQkJCWlmIChlcGlkID09IElOVkFMSURfRVBJRCkgewotCQkJCS8qIEZJWE1FOiBXaGF0IGlmIGl0IGJlY2FtZSBkaXNhYmxlZD8gQ291bGQgc2VyaW91c2x5IGh1cnQgaW50ZXJydXB0Ci0JCQkJICAgdHJhZmZpYy4gKFVzZSBkb19pbnRyX3JlY292ZXIuKSAqLwotCQkJCXdhcm4oIkdvdCBlcGlkX2F0dG4gZm9yIElOVkFMSURfRVBJRCAoJWQpLiIsIGVwaWQpOwotCQkJCWVycigiUl9VU0JfRVBUX0RBVEEgPSAweCV4Iiwgcl91c2JfZXB0X2RhdGEpOwotCQkJCWVycigiUl9VU0JfU1RBVFVTID0gMHgleCIsIHJlZy0+cl91c2Jfc3RhdHVzKTsKLQkJCQljb250aW51ZTsKLQkJCX0gZWxzZSAJaWYgKGVwaWQgPT0gRFVNTVlfRVBJRCkgewotCQkJCS8qIFdlIGRlZmluaXRlbHkgZG9uJ3QgY2FyZSBhYm91dCB0aGVzZSBvbmVzLiBCZXNpZGVzLCB0aGV5IGFyZQotCQkJCSAgIGFsd2F5cyBkaXNhYmxlZCwgc28gYW55IHBvc3NpYmxlIGRpc2FibGluZyBjYXVzZWQgYnkgdGhlCi0JCQkJICAgZXBpZCBhdHRlbnRpb24gaW50ZXJydXB0IGlzIGlycmVsZXZhbnQuICovCi0JCQkJd2FybigiR290IGVwaWRfYXR0biBmb3IgRFVNTVlfRVBJRCAoJWQpLiIsIGVwaWQpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQkvKiBHZXQgdGhlIGZpcnN0IHVyYiBpbiB0aGUgdXJiIGxpc3QgZm9yIHRoaXMgZXBpZC4gV2UgYmxhdGFudGx5IGFzc3VtZQotCQkJICAgdGhhdCBvbmx5IHRoZSBmaXJzdCB1cmIgY291bGQgaGF2ZSBjYXVzZWQgdGhlIGVwaWQgYXR0ZW50aW9uLgotCQkJICAgKEZvciBidWxrIGFuZCBjdHJsLCBvbmx5IG9uZSB1cmIgaXMgYWN0aXZlIGF0IGFueSBvbmUgdGltZS4gRm9yIGludHIKLQkJCSAgIGFuZCBpc29jIHdlIHJlbW92ZSB0aGVtIG9uY2UgdGhleSBhcmUgY29tcGxldGVkLikgKi8KLQkJCXVyYiA9IHVyYl9saXN0X2ZpcnN0KGVwaWQpOwotCi0JCQlpZiAodXJiID09IE5VTEwpIHsKLQkJCQllcnIoIkdvdCBlcGlkX2F0dG4gZm9yIGVwaWQgJWkgd2l0aCBubyB1cmIuIiwgZXBpZCk7Ci0JCQkJZXJyKCJSX1VTQl9FUFRfREFUQSA9IDB4JXgiLCByX3VzYl9lcHRfZGF0YSk7Ci0JCQkJZXJyKCJSX1VTQl9TVEFUVVMgPSAweCV4IiwgcmVnLT5yX3VzYl9zdGF0dXMpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlzd2l0Y2ggKHVzYl9waXBldHlwZSh1cmItPnBpcGUpKSB7Ci0JCQljYXNlIFBJUEVfQlVMSzoKLQkJCQl3YXJuKCJHb3QgZXBpZCBhdHRuIGZvciBidWxrIGVuZHBvaW50LCBlcGlkICVkIiwgZXBpZCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFBJUEVfQ09OVFJPTDoKLQkJCQl3YXJuKCJHb3QgZXBpZCBhdHRuIGZvciBjb250cm9sIGVuZHBvaW50LCBlcGlkICVkIiwgZXBpZCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFBJUEVfSU5URVJSVVBUOgotCQkJCXdhcm4oIkdvdCBlcGlkIGF0dG4gZm9yIGludGVycnVwdCBlbmRwb2ludCwgZXBpZCAlZCIsIGVwaWQpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBQSVBFX0lTT0NIUk9OT1VTOgotCQkJCXdhcm4oIkdvdCBlcGlkIGF0dG4gZm9yIGlzb2Nocm9ub3VzIGVuZHBvaW50LCBlcGlkICVkIiwgZXBpZCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWlmICh1c2JfcGlwZXR5cGUodXJiLT5waXBlKSAhPSBQSVBFX0lTT0NIUk9OT1VTKSB7Ci0JCQkJaWYgKHJfdXNiX2VwdF9kYXRhICYgSU9fTUFTSyhSX1VTQl9FUFRfREFUQSwgaG9sZCkpIHsKLQkJCQkJd2FybigiSG9sZCB3YXMgc2V0IGZvciBlcGlkICVkLiIsIGVwaWQpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8qIEV2ZW4gdGhvdWdoIGVycm9yX2NvZGUgb2NjdXBpZXMgYml0cyAyMiAtIDIzIGluIGJvdGggUl9VU0JfRVBUX0RBVEEgYW5kCi0JCQkgICBSX1VTQl9FUFRfREFUQV9JU09DLCB3ZSBzZXBhcmF0ZSB0aGVtIGhlcmUgc28gd2UgZG9uJ3QgZm9yZ2V0IGluIG90aGVyIHBsYWNlcy4gKi8KLQkJCWlmICh1c2JfcGlwZXR5cGUodXJiLT5waXBlKSA9PSBQSVBFX0lTT0NIUk9OT1VTKSB7Ci0JCQkJZXJyb3JfY29kZSA9IElPX0VYVFJBQ1QoUl9VU0JfRVBUX0RBVEFfSVNPLCBlcnJvcl9jb2RlLCByX3VzYl9lcHRfZGF0YSk7Ci0JCQl9IGVsc2UgewotCQkJCWVycm9yX2NvZGUgPSBJT19FWFRSQUNUKFJfVVNCX0VQVF9EQVRBLCBlcnJvcl9jb2RlLCByX3VzYl9lcHRfZGF0YSk7Ci0JCQl9Ci0KLQkJCS8qIFVzaW5nIElPX1NUQVRFX1ZBTFVFIG9uIFJfVVNCX0VQVF9EQVRBIHNob3VsZCBiZSBvayBmb3IgaXNvYyBhbHNvLiAqLwotCQkJaWYgKGVycm9yX2NvZGUgPT0gSU9fU1RBVEVfVkFMVUUoUl9VU0JfRVBUX0RBVEEsIGVycm9yX2NvZGUsIG5vX2Vycm9yKSkgewotCi0JCQkJLyogSXNvYyB0cmFmZmljIGRvZXNuJ3QgaGF2ZSBlcnJvcl9jb3VudF9pbi9lcnJvcl9jb3VudF9vdXQuICovCi0JCQkJaWYgKCh1c2JfcGlwZXR5cGUodXJiLT5waXBlKSAhPSBQSVBFX0lTT0NIUk9OT1VTKSAmJgotCQkJCSAgICAoSU9fRVhUUkFDVChSX1VTQl9FUFRfREFUQSwgZXJyb3JfY291bnRfaW4sIHJfdXNiX2VwdF9kYXRhKSA9PSAzIHx8Ci0JCQkJICAgICBJT19FWFRSQUNUKFJfVVNCX0VQVF9EQVRBLCBlcnJvcl9jb3VudF9vdXQsIHJfdXNiX2VwdF9kYXRhKSA9PSAzKSkgewotCQkJCQkvKiAzcmQgZXJyb3IuICovCi0JCQkJCXdhcm4oIjNyZCBlcnJvciBmb3IgZXBpZCAlaSIsIGVwaWQpOwotCQkJCQlldHJheF91c2JfY29tcGxldGVfdXJiKHVyYiwgLUVQUk9UTyk7Ci0KLQkJCQl9IGVsc2UgaWYgKHJlZy0+cl91c2Jfc3RhdHVzICYgSU9fTUFTSyhSX1VTQl9TVEFUVVMsIHBlcnJvcikpIHsKLQotCQkJCQl3YXJuKCJQZXJyb3IgZm9yIGVwaWQgJWQiLCBlcGlkKTsKLQotCQkJCQlpZiAoIShyX3VzYl9lcHRfZGF0YSAmIElPX01BU0soUl9VU0JfRVBUX0RBVEEsIHZhbGlkKSkpIHsKLQkJCQkJCS8qIGludmFsaWQgZXBfaWQgKi8KLQkJCQkJCXBhbmljKCJQZXJyb3IgYmVjYXVzZSBvZiBpbnZhbGlkIGVwaWQuIgotCQkJCQkJICAgICAgIiBEZWNvbmZpZ3VyZWQgdG9vIGVhcmx5PyIpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJLyogcGFzdCBlb2YxLCBuZWFyIGVvZiwgem91dCB0cmFuc2Zlciwgc2V0dXAgdHJhbnNmZXIgKi8KLQotCQkJCQkJLyogRHVtcCB0aGUgdXJiIGFuZCB0aGUgcmVsZXZhbnQgRVAgZGVzY3JpcHRvciBsaXN0LiAqLwotCi0JCQkJCQlfX2R1bXBfdXJiKHVyYik7Ci0JCQkJCQlfX2R1bXBfZXB0X2RhdGEoZXBpZCk7Ci0JCQkJCQlfX2R1bXBfZXBfbGlzdCh1c2JfcGlwZXR5cGUodXJiLT5waXBlKSk7Ci0KLQkJCQkJCXBhbmljKCJTb21ldGhpbmcgd3Jvbmcgd2l0aCBETUEgZGVzY3JpcHRvciBjb250ZW50cy4iCi0JCQkJCQkgICAgICAiIFRvbyBtdWNoIHRyYWZmaWMgaW5zZXJ0ZWQ/Iik7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKHJlZy0+cl91c2Jfc3RhdHVzICYgSU9fTUFTSyhSX1VTQl9TVEFUVVMsIG91cnVuKSkgewotCQkJCQkvKiBidWZmZXIgb3VydW4gKi8KLQkJCQkJcGFuaWMoIkJ1ZmZlciBvdmVycnVuL3VuZGVycnVuIGZvciBlcGlkICVkLiBETUEgdG9vIGJ1c3k/IiwgZXBpZCk7Ci0JCQkJfQotCi0JCQl9IGVsc2UgaWYgKGVycm9yX2NvZGUgPT0gSU9fU1RBVEVfVkFMVUUoUl9VU0JfRVBUX0RBVEEsIGVycm9yX2NvZGUsIHN0YWxsKSkgewotCQkJCS8qIE5vdCByZWFsbHkgYSBwcm90b2NvbCBlcnJvciwganVzdCBzYXlzIHRoYXQgdGhlIGVuZHBvaW50IGdhdmUKLQkJCQkgICBhIHN0YWxsIHJlc3BvbnNlLiBOb3RlIHRoYXQgZXJyb3JfY29kZSBjYW5ub3QgYmUgc3RhbGwgZm9yIGlzb2MuICovCi0JCQkJaWYgKHVzYl9waXBldHlwZSh1cmItPnBpcGUpID09IFBJUEVfSVNPQ0hST05PVVMpIHsKLQkJCQkJcGFuaWMoIklzb2MgdHJhZmZpYyBjYW5ub3Qgc3RhbGwiKTsKLQkJCQl9Ci0KLQkJCQl3YXJuKCJTdGFsbCBmb3IgZXBpZCAlZCIsIGVwaWQpOwotCQkJCWV0cmF4X3VzYl9jb21wbGV0ZV91cmIodXJiLCAtRVBJUEUpOwotCi0JCQl9IGVsc2UgaWYgKGVycm9yX2NvZGUgPT0gSU9fU1RBVEVfVkFMVUUoUl9VU0JfRVBUX0RBVEEsIGVycm9yX2NvZGUsIGJ1c19lcnJvcikpIHsKLQkJCQkvKiBUd28gZGV2aWNlcyByZXNwb25kZWQgdG8gYSB0cmFuc2FjdGlvbiByZXF1ZXN0LiBNdXN0IGJlIHJlc29sdmVkCi0JCQkJICAgYnkgc29mdHdhcmUuIEZJWE1FOiBSZXNldCBwb3J0cz8gKi8KLQkJCQlwYW5pYygiQnVzIGVycm9yIGZvciBlcGlkICVkLiIKLQkJCQkgICAgICAiIFR3byBkZXZpY2VzIHJlc3BvbmRlZCB0byB0cmFuc2FjdGlvbiByZXF1ZXN0IiwKLQkJCQkgICAgICBlcGlkKTsKLQotCQkJfSBlbHNlIGlmIChlcnJvcl9jb2RlID09IElPX1NUQVRFX1ZBTFVFKFJfVVNCX0VQVF9EQVRBLCBlcnJvcl9jb2RlLCBidWZmZXJfZXJyb3IpKSB7Ci0JCQkJLyogRE1BIG92ZXJydW4gb3IgdW5kZXJydW4uICovCi0JCQkJd2FybigiQnVmZmVyIG92ZXJydW4vdW5kZXJydW4gZm9yIGVwaWQgJWQuIERNQSB0b28gYnVzeT8iLCBlcGlkKTsKLQotCQkJCS8qIEl0IHNlZW1zIHRoYXQgZXJyb3JfY29kZSA9IGJ1ZmZlcl9lcnJvciBpbgotCQkJCSAgIFJfVVNCX0VQVF9EQVRBL1JfVVNCX0VQVF9EQVRBX0lTTyBhbmQgb3VydW4gPSB5ZXMgaW4gUl9VU0JfU1RBVFVTCi0JCQkJICAgYXJlIHRoZSBzYW1lIGVycm9yLiAqLwotCQkJCWV0cmF4X3VzYl9jb21wbGV0ZV91cmIodXJiLCAtRVBST1RPKTsKLQkJCX0KLQkJfQotCX0KLQotCURCRkVYSVQ7Ci0KLX0KLQotdm9pZCBldHJheF91c2JfYnVsa19zdGFydF90aW1lcl9mdW5jKHVuc2lnbmVkIGxvbmcgZHVtbXkpCi17Ci0KLQkvKiBXZSBtaWdodCBlbmFibGUgYW4gRVAgZGVzY3JpcHRvciBiZWhpbmQgdGhlIGN1cnJlbnQgRE1BIHBvc2l0aW9uIHdoZW4gaXQncyBhYm91dAotCSAgIHRvIGRlY2lkZSB0aGF0IHRoZXJlIGFyZSBubyBtb3JlIGJ1bGsgdHJhZmZpYyBhbmQgaXQgc2hvdWxkIHN0b3AgdGhlIGJ1bGsgY2hhbm5lbC4KLQkgICBUaGVyZWZvcmUgd2UgcGVyaW9kaWNhbGx5IGNoZWNrIGlmIHRoZSBidWxrIGNoYW5uZWwgaXMgc3RvcHBlZCBhbmQgdGhlcmUgaXMgYW4KLQkgICBlbmFibGVkIGJ1bGsgRVAgZGVzY3JpcHRvciwgaW4gd2hpY2ggY2FzZSB3ZSBzdGFydCB0aGUgYnVsayBjaGFubmVsLiAqLwotCWRiZ19idWxrKCJidWxrX3N0YXJ0X3RpbWVyIHRpbWVkIG91dC4iKTsKLQotCWlmICghKCpSX0RNQV9DSDhfU1VCMF9DTUQgJiBJT19NQVNLKFJfRE1BX0NIOF9TVUIwX0NNRCwgY21kKSkpIHsKLQkJaW50IGVwaWQ7Ci0KLQkJZGJnX2J1bGsoIkJ1bGsgRE1BIGNoYW5uZWwgbm90IHJ1bm5pbmcuIik7Ci0KLQkJZm9yIChlcGlkID0gMDsgZXBpZCA8IE5CUl9PRl9FUElEUzsgZXBpZCsrKSB7Ci0JCQlpZiAoVHhCdWxrRVBMaXN0W2VwaWRdLmNvbW1hbmQgJiBJT19NQVNLKFVTQl9FUF9jb21tYW5kLCBlbmFibGUpKSB7Ci0JCQkJZGJnX2J1bGsoIkZvdW5kIGVuYWJsZWQgRVAgZm9yIGVwaWQgJWQsIHN0YXJ0aW5nIGJ1bGsgY2hhbm5lbC5cbiIsCi0JCQkJCSBlcGlkKTsKLQkJCQkqUl9ETUFfQ0g4X1NVQjBfQ01EID0gSU9fU1RBVEUoUl9ETUFfQ0g4X1NVQjBfQ01ELCBjbWQsIHN0YXJ0KTsKLQotCQkJCS8qIFJlc3RhcnQgdGhlIGJ1bGsgZW90IHRpbWVyIHNpbmNlIHdlIGp1c3Qgc3RhcnRlZCB0aGUgYnVsayBjaGFubmVsLiAqLwotCQkJCW1vZF90aW1lcigmYnVsa19lb3RfdGltZXIsIGppZmZpZXMgKyBCVUxLX0VPVF9USU1FUl9JTlRFUlZBTCk7Ci0KLQkJCQkvKiBObyBuZWVkIHRvIHNlYXJjaCBhbnkgZnVydGhlci4gKi8KLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0gZWxzZSB7Ci0JCWRiZ19idWxrKCJCdWxrIERNQSBjaGFubmVsIHJ1bm5pbmcuIik7Ci0JfQotfQotCi12b2lkIGV0cmF4X3VzYl9oY19wb3J0X3N0YXR1c19pbnRlcnJ1cHQodXNiX2ludGVycnVwdF9yZWdpc3RlcnNfdCAqcmVnKQotewotCWV0cmF4X2hjX3QgKmhjID0gcmVnLT5oYzsKLQlfX3UxNiByX3VzYl9yaF9wb3J0X3N0YXR1c18xID0gcmVnLT5yX3VzYl9yaF9wb3J0X3N0YXR1c18xOwotCV9fdTE2IHJfdXNiX3JoX3BvcnRfc3RhdHVzXzIgPSByZWctPnJfdXNiX3JoX3BvcnRfc3RhdHVzXzI7Ci0KLQlEQkZFTlRFUjsKLQotCS8qIFRoZSBFdHJheCBSSCBkb2VzIG5vdCBpbmNsdWRlIGEgd1BvcnRDaGFuZ2UgcmVnaXN0ZXIsIHNvIHRoaXMgaGFzIHRvIGJlIGhhbmRsZWQgaW4gc29mdHdhcmUKLQkgICAoYnkgc2F2aW5nIHRoZSBvbGQgcG9ydCBzdGF0dXMgdmFsdWUgZm9yIGNvbXBhcmlzb24gd2hlbiB0aGUgcG9ydCBzdGF0dXMgaW50ZXJydXB0IGhhcHBlbnMpLgotCSAgIFNlZSBzZWN0aW9uIDExLjE2LjIuNi4yIGluIHRoZSBVU0IgMS4xIHNwZWMgZm9yIGRldGFpbHMuICovCi0KLQlkYmdfcmgoImhjLT5yaC5wcmV2X3dQb3J0U3RhdHVzXzEgPSAweCV4IiwgaGMtPnJoLnByZXZfd1BvcnRTdGF0dXNfMSk7Ci0JZGJnX3JoKCJoYy0+cmgucHJldl93UG9ydFN0YXR1c18yID0gMHgleCIsIGhjLT5yaC5wcmV2X3dQb3J0U3RhdHVzXzIpOwotCWRiZ19yaCgicl91c2JfcmhfcG9ydF9zdGF0dXNfMSA9IDB4JXgiLCByX3VzYl9yaF9wb3J0X3N0YXR1c18xKTsKLQlkYmdfcmgoInJfdXNiX3JoX3BvcnRfc3RhdHVzXzIgPSAweCV4Iiwgcl91c2JfcmhfcG9ydF9zdGF0dXNfMik7Ci0KLQkvKiBDX1BPUlRfQ09OTkVDVElPTiBpcyBzZXQgb24gYW55IHRyYW5zaXRpb24uICovCi0JaGMtPnJoLndQb3J0Q2hhbmdlXzEgfD0KLQkJKChyX3VzYl9yaF9wb3J0X3N0YXR1c18xICYgKDEgPDwgUkhfUE9SVF9DT05ORUNUSU9OKSkgIT0KLQkJIChoYy0+cmgucHJldl93UG9ydFN0YXR1c18xICYgKDEgPDwgUkhfUE9SVF9DT05ORUNUSU9OKSkpID8KLQkJKDEgPDwgUkhfUE9SVF9DT05ORUNUSU9OKSA6IDA7Ci0KLQloYy0+cmgud1BvcnRDaGFuZ2VfMiB8PQotCQkoKHJfdXNiX3JoX3BvcnRfc3RhdHVzXzIgJiAoMSA8PCBSSF9QT1JUX0NPTk5FQ1RJT04pKSAhPQotCQkgKGhjLT5yaC5wcmV2X3dQb3J0U3RhdHVzXzIgJiAoMSA8PCBSSF9QT1JUX0NPTk5FQ1RJT04pKSkgPwotCQkoMSA8PCBSSF9QT1JUX0NPTk5FQ1RJT04pIDogMDsKLQotCS8qIENfUE9SVF9FTkFCTEUgaXMgX29ubHlfIHNldCBvbiBhIG9uZSB0byB6ZXJvIHRyYW5zaXRpb24sIGkuZS4gd2hlbgotCSAgIHRoZSBwb3J0IGlzIGRpc2FibGVkLCBub3Qgd2hlbiBpdCdzIGVuYWJsZWQuICovCi0JaGMtPnJoLndQb3J0Q2hhbmdlXzEgfD0KLQkJKChoYy0+cmgucHJldl93UG9ydFN0YXR1c18xICYgKDEgPDwgUkhfUE9SVF9FTkFCTEUpKQotCQkgJiYgIShyX3VzYl9yaF9wb3J0X3N0YXR1c18xICYgKDEgPDwgUkhfUE9SVF9FTkFCTEUpKSkgPwotCQkoMSA8PCBSSF9QT1JUX0VOQUJMRSkgOiAwOwotCi0JaGMtPnJoLndQb3J0Q2hhbmdlXzIgfD0KLQkJKChoYy0+cmgucHJldl93UG9ydFN0YXR1c18yICYgKDEgPDwgUkhfUE9SVF9FTkFCTEUpKQotCQkgJiYgIShyX3VzYl9yaF9wb3J0X3N0YXR1c18yICYgKDEgPDwgUkhfUE9SVF9FTkFCTEUpKSkgPwotCQkoMSA8PCBSSF9QT1JUX0VOQUJMRSkgOiAwOwotCi0JLyogQ19QT1JUX1NVU1BFTkQgaXMgc2V0IHRvIG9uZSB3aGVuIHRoZSBkZXZpY2UgaGFzIHRyYW5zaXRpb25lZCBvdXQKLQkgICBvZiB0aGUgc3VzcGVuZGVkIHN0YXRlLCBpLmUuIHdoZW4gc3VzcGVuZCBnb2VzIGZyb20gb25lIHRvIHplcm8uICovCi0JaGMtPnJoLndQb3J0Q2hhbmdlXzEgfD0KLQkJKChoYy0+cmgucHJldl93UG9ydFN0YXR1c18xICYgKDEgPDwgUkhfUE9SVF9TVVNQRU5EKSkKLQkJICYmICEocl91c2JfcmhfcG9ydF9zdGF0dXNfMSAmICgxIDw8IFJIX1BPUlRfU1VTUEVORCkpKSA/Ci0JCSgxIDw8IFJIX1BPUlRfU1VTUEVORCkgOiAwOwotCi0JaGMtPnJoLndQb3J0Q2hhbmdlXzIgfD0KLQkJKChoYy0+cmgucHJldl93UG9ydFN0YXR1c18yICYgKDEgPDwgUkhfUE9SVF9TVVNQRU5EKSkKLQkJICYmICEocl91c2JfcmhfcG9ydF9zdGF0dXNfMiAmICgxIDw8IFJIX1BPUlRfU1VTUEVORCkpKSA/Ci0JCSgxIDw8IFJIX1BPUlRfU1VTUEVORCkgOiAwOwotCi0KLQkvKiBDX1BPUlRfUkVTRVQgaXMgc2V0IHdoZW4gcmVzZXQgcHJvY2Vzc2luZyBvbiB0aGlzIHBvcnQgaXMgY29tcGxldGUuICovCi0JaGMtPnJoLndQb3J0Q2hhbmdlXzEgfD0KLQkJKChoYy0+cmgucHJldl93UG9ydFN0YXR1c18xICYgKDEgPDwgUkhfUE9SVF9SRVNFVCkpCi0JCSAmJiAhKHJfdXNiX3JoX3BvcnRfc3RhdHVzXzEgJiAoMSA8PCBSSF9QT1JUX1JFU0VUKSkpID8KLQkJKDEgPDwgUkhfUE9SVF9SRVNFVCkgOiAwOwotCi0JaGMtPnJoLndQb3J0Q2hhbmdlXzIgfD0KLQkJKChoYy0+cmgucHJldl93UG9ydFN0YXR1c18yICYgKDEgPDwgUkhfUE9SVF9SRVNFVCkpCi0JCSAmJiAhKHJfdXNiX3JoX3BvcnRfc3RhdHVzXzIgJiAoMSA8PCBSSF9QT1JUX1JFU0VUKSkpID8KLQkJKDEgPDwgUkhfUE9SVF9SRVNFVCkgOiAwOwotCi0JLyogU2F2ZSB0aGUgbmV3IHZhbHVlcyBmb3IgbmV4dCBwb3J0IHN0YXR1cyBjaGFuZ2UuICovCi0JaGMtPnJoLnByZXZfd1BvcnRTdGF0dXNfMSA9IHJfdXNiX3JoX3BvcnRfc3RhdHVzXzE7Ci0JaGMtPnJoLnByZXZfd1BvcnRTdGF0dXNfMiA9IHJfdXNiX3JoX3BvcnRfc3RhdHVzXzI7Ci0KLQlkYmdfcmgoImhjLT5yaC53UG9ydENoYW5nZV8xIHNldCB0byAweCV4IiwgaGMtPnJoLndQb3J0Q2hhbmdlXzEpOwotCWRiZ19yaCgiaGMtPnJoLndQb3J0Q2hhbmdlXzIgc2V0IHRvIDB4JXgiLCBoYy0+cmgud1BvcnRDaGFuZ2VfMik7Ci0KLQlEQkZFWElUOwotCi19Ci0KLXZvaWQgZXRyYXhfdXNiX2hjX2N0bF9zdGF0dXNfaW50ZXJydXB0KHVzYl9pbnRlcnJ1cHRfcmVnaXN0ZXJzX3QgKnJlZykKLXsKLQlEQkZFTlRFUjsKLQotCS8qIEZJWE1FOiBXaGF0IHNob3VsZCB3ZSBkbyBpZiB3ZSBnZXQgb3VydW4gb3IgcGVycm9yPyBEdW1wIHRoZSBFUCBhbmQgU0IKLQkgICBsaXN0IGZvciB0aGUgY29ycmVzcG9uZGluZyBlcGlkPyAqLwotCWlmIChyZWctPnJfdXNiX3N0YXR1cyAmIElPX01BU0soUl9VU0JfU1RBVFVTLCBvdXJ1bikpIHsKLQkJcGFuaWMoIlVTQiBjb250cm9sbGVyIGdvdCBvdXJ1bi4iKTsKLQl9Ci0JaWYgKHJlZy0+cl91c2Jfc3RhdHVzICYgSU9fTUFTSyhSX1VTQl9TVEFUVVMsIHBlcnJvcikpIHsKLQotCQkvKiBCZWZvcmUsIGV0cmF4X3VzYl9kb19pbnRyX3JlY292ZXIgd2FzIGNhbGxlZCBvbiB0aGlzIGVwaWQgaWYgaXQgd2FzCi0JCSAgIGFuIGludGVycnVwdCBwaXBlLiBJIGRvbid0IHNlZSBob3cgcmUtZW5hYmxpbmcgYWxsIEVQIGRlc2NyaXB0b3JzCi0JCSAgIHdpbGwgaGVscCBpZiB0aGVyZSB3YXMgYSBwcm9ncmFtbWluZyBlcnJvci4gKi8KLQkJcGFuaWMoIlVTQiBjb250cm9sbGVyIGdvdCBwZXJyb3IuIik7Ci0JfQotCi0JaWYgKHJlZy0+cl91c2Jfc3RhdHVzICYgSU9fTUFTSyhSX1VTQl9TVEFUVVMsIGRldmljZV9tb2RlKSkgewotCQkvKiBXZSBzaG91bGQgbmV2ZXIgb3BlcmF0ZSBpbiBkZXZpY2UgbW9kZS4gKi8KLQkJcGFuaWMoIlVTQiBjb250cm9sbGVyIGluIGRldmljZSBtb2RlLiIpOwotCX0KLQotCS8qIFRoZXNlIGlmLXN0YXRlbWVudHMgY291bGQgcHJvYmFibHkgYmUgbmVzdGVkLiAqLwotCWlmIChyZWctPnJfdXNiX3N0YXR1cyAmIElPX01BU0soUl9VU0JfU1RBVFVTLCBob3N0X21vZGUpKSB7Ci0JCWluZm8oIlVTQiBjb250cm9sbGVyIGluIGhvc3QgbW9kZS4iKTsKLQl9Ci0JaWYgKHJlZy0+cl91c2Jfc3RhdHVzICYgSU9fTUFTSyhSX1VTQl9TVEFUVVMsIHN0YXJ0ZWQpKSB7Ci0JCWluZm8oIlVTQiBjb250cm9sbGVyIHN0YXJ0ZWQuIik7Ci0JfQotCWlmIChyZWctPnJfdXNiX3N0YXR1cyAmIElPX01BU0soUl9VU0JfU1RBVFVTLCBydW5uaW5nKSkgewotCQlpbmZvKCJVU0IgY29udHJvbGxlciBydW5uaW5nLiIpOwotCX0KLQotCURCRkVYSVQ7Ci0KLX0KLQotCi1zdGF0aWMgaW50IGV0cmF4X3JoX3N1Ym1pdF91cmIoc3RydWN0IHVyYiAqdXJiKQotewotCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2ID0gdXJiLT5kZXY7Ci0JZXRyYXhfaGNfdCAqaGMgPSB1c2JfZGV2LT5idXMtPmhjcHJpdjsKLQl1bnNpZ25lZCBpbnQgcGlwZSA9IHVyYi0+cGlwZTsKLQlzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICpjbWQgPSAoc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqKSB1cmItPnNldHVwX3BhY2tldDsKLQl2b2lkICpkYXRhID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7Ci0JaW50IGxlbmkgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGg7Ci0JaW50IGxlbiA9IDA7Ci0JaW50IHN0YXQgPSAwOwotCi0JX191MTYgYm1SVHlwZV9iUmVxOwotCV9fdTE2IHdWYWx1ZTsKLQlfX3UxNiB3SW5kZXg7Ci0JX191MTYgd0xlbmd0aDsKLQotCURCRkVOVEVSOwotCi0JLyogRklYTUU6IFdoYXQgaXMgdGhpcyBpbnRlcnJ1cHQgdXJiIHRoYXQgaXMgc2VudCB0byB0aGUgcm9vdCBodWI/ICovCi0JaWYgKHVzYl9waXBldHlwZSAocGlwZSkgPT0gUElQRV9JTlRFUlJVUFQpIHsKLQkJZGJnX3JoKCJSb290LUh1YiBzdWJtaXQgSVJROiBldmVyeSAlZCBtcyIsIHVyYi0+aW50ZXJ2YWwpOwotCQloYy0+cmgudXJiID0gdXJiOwotCQloYy0+cmguc2VuZCA9IDE7Ci0JCS8qIEZJWE1FOiBXZSBjb3VsZCBwcm9iYWJseSByZW1vdmUgdGhpcyBsaW5lIHNpbmNlIGl0J3MgZG9uZQotCQkgICBpbiBldHJheF9yaF9pbml0X2ludF90aW1lci4gKERvbid0IHJlbW92ZSBpdCBmcm9tCi0JCSAgIGV0cmF4X3JoX2luaXRfaW50X3RpbWVyIHRob3VnaC4pICovCi0JCWhjLT5yaC5pbnRlcnZhbCA9IHVyYi0+aW50ZXJ2YWw7Ci0JCWV0cmF4X3JoX2luaXRfaW50X3RpbWVyKHVyYik7Ci0JCURCRkVYSVQ7Ci0KLQkJcmV0dXJuIDA7Ci0JfQotCi0JYm1SVHlwZV9iUmVxID0gY21kLT5iUmVxdWVzdFR5cGUgfCAoY21kLT5iUmVxdWVzdCA8PCA4KTsKLQl3VmFsdWUgPSBsZTE2X3RvX2NwdShjbWQtPndWYWx1ZSk7Ci0Jd0luZGV4ID0gbGUxNl90b19jcHUoY21kLT53SW5kZXgpOwotCXdMZW5ndGggPSBsZTE2X3RvX2NwdShjbWQtPndMZW5ndGgpOwotCi0JZGJnX3JoKCJibVJUeXBlX2JSZXEgOiAweCUwNHggKCVkKSIsIGJtUlR5cGVfYlJlcSwgYm1SVHlwZV9iUmVxKTsKLQlkYmdfcmgoIndWYWx1ZSAgICAgICA6IDB4JTA0eCAoJWQpIiwgd1ZhbHVlLCB3VmFsdWUpOwotCWRiZ19yaCgid0luZGV4ICAgICAgIDogMHglMDR4ICglZCkiLCB3SW5kZXgsIHdJbmRleCk7Ci0JZGJnX3JoKCJ3TGVuZ3RoICAgICAgOiAweCUwNHggKCVkKSIsIHdMZW5ndGgsIHdMZW5ndGgpOwotCi0Jc3dpdGNoIChibVJUeXBlX2JSZXEpIHsKLQotCQkvKiBSZXF1ZXN0IERlc3RpbmF0aW9uOgotCQkgICB3aXRob3V0IGZsYWdzOiBEZXZpY2UsCi0JCSAgIFJIX0lOVEVSRkFDRTogaW50ZXJmYWNlLAotCQkgICBSSF9FTkRQT0lOVDogZW5kcG9pbnQsCi0JCSAgIFJIX0NMQVNTIG1lYW5zIEhVQiBoZXJlLAotCQkgICBSSF9PVEhFUiB8IFJIX0NMQVNTICBhbG1vc3QgZXZlciBtZWFucyBIVUJfUE9SVCBoZXJlCi0JCSAqLwotCi0JY2FzZSBSSF9HRVRfU1RBVFVTOgotCQkqKF9fdTE2ICopIGRhdGEgPSBjcHVfdG9fbGUxNiAoMSk7Ci0JCU9LICgyKTsKLQotCWNhc2UgUkhfR0VUX1NUQVRVUyB8IFJIX0lOVEVSRkFDRToKLQkJKihfX3UxNiAqKSBkYXRhID0gY3B1X3RvX2xlMTYgKDApOwotCQlPSyAoMik7Ci0KLQljYXNlIFJIX0dFVF9TVEFUVVMgfCBSSF9FTkRQT0lOVDoKLQkJKihfX3UxNiAqKSBkYXRhID0gY3B1X3RvX2xlMTYgKDApOwotCQlPSyAoMik7Ci0KLQljYXNlIFJIX0dFVF9TVEFUVVMgfCBSSF9DTEFTUzoKLQkJKihfX3UzMiAqKSBkYXRhID0gY3B1X3RvX2xlMzIgKDApOwotCQlPSyAoNCk7CQkvKiBodWIgcG93ZXIgKiogKi8KLQotCWNhc2UgUkhfR0VUX1NUQVRVUyB8IFJIX09USEVSIHwgUkhfQ0xBU1M6Ci0JCWlmICh3SW5kZXggPT0gMSkgewotCQkJKigoX191MTYqKWRhdGEpID0gY3B1X3RvX2xlMTYoaGMtPnJoLnByZXZfd1BvcnRTdGF0dXNfMSk7Ci0JCQkqKChfX3UxNiopZGF0YSArIDEpID0gY3B1X3RvX2xlMTYoaGMtPnJoLndQb3J0Q2hhbmdlXzEpOwotCQl9IGVsc2UgaWYgKHdJbmRleCA9PSAyKSB7Ci0JCQkqKChfX3UxNiopZGF0YSkgPSBjcHVfdG9fbGUxNihoYy0+cmgucHJldl93UG9ydFN0YXR1c18yKTsKLQkJCSooKF9fdTE2KilkYXRhICsgMSkgPSBjcHVfdG9fbGUxNihoYy0+cmgud1BvcnRDaGFuZ2VfMik7Ci0JCX0gZWxzZSB7Ci0JCQlkYmdfcmgoIlJIX0dFVF9TVEFUVVMgd2hpdGggaW52YWxpZCB3SW5kZXghIik7Ci0JCQlPSygwKTsKLQkJfQotCi0JCU9LKDQpOwotCi0JY2FzZSBSSF9DTEVBUl9GRUFUVVJFIHwgUkhfRU5EUE9JTlQ6Ci0JCXN3aXRjaCAod1ZhbHVlKSB7Ci0JCWNhc2UgKFJIX0VORFBPSU5UX1NUQUxMKToKLQkJCU9LICgwKTsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgUkhfQ0xFQVJfRkVBVFVSRSB8IFJIX0NMQVNTOgotCQlzd2l0Y2ggKHdWYWx1ZSkgewotCQljYXNlIChSSF9DX0hVQl9PVkVSX0NVUlJFTlQpOgotCQkJT0sgKDApOwkvKiBodWIgcG93ZXIgb3ZlciBjdXJyZW50ICoqICovCi0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFJIX0NMRUFSX0ZFQVRVUkUgfCBSSF9PVEhFUiB8IFJIX0NMQVNTOgotCQlzd2l0Y2ggKHdWYWx1ZSkgewotCQljYXNlIChSSF9QT1JUX0VOQUJMRSk6Ci0JCQlpZiAod0luZGV4ID09IDEpIHsKLQotCQkJCWRiZ19yaCgidHJ5aW5nIHRvIGRvIGRpc2FibGUgcG9ydCAxIik7Ci0KLQkJCQkqUl9VU0JfUE9SVDFfRElTQUJMRSA9IElPX1NUQVRFKFJfVVNCX1BPUlQxX0RJU0FCTEUsIGRpc2FibGUsIHllcyk7Ci0KLQkJCQl3aGlsZSAoaGMtPnJoLnByZXZfd1BvcnRTdGF0dXNfMSAmCi0JCQkJICAgICAgIElPX1NUQVRFKFJfVVNCX1JIX1BPUlRfU1RBVFVTXzEsIGVuYWJsZWQsIHllcykpOwotCQkJCSpSX1VTQl9QT1JUMV9ESVNBQkxFID0gSU9fU1RBVEUoUl9VU0JfUE9SVDFfRElTQUJMRSwgZGlzYWJsZSwgbm8pOwotCQkJCWRiZ19yaCgiUG9ydCAxIGlzIGRpc2FibGVkIik7Ci0KLQkJCX0gZWxzZSBpZiAod0luZGV4ID09IDIpIHsKLQotCQkJCWRiZ19yaCgidHJ5aW5nIHRvIGRvIGRpc2FibGUgcG9ydCAyIik7Ci0KLQkJCQkqUl9VU0JfUE9SVDJfRElTQUJMRSA9IElPX1NUQVRFKFJfVVNCX1BPUlQyX0RJU0FCTEUsIGRpc2FibGUsIHllcyk7Ci0KLQkJCQl3aGlsZSAoaGMtPnJoLnByZXZfd1BvcnRTdGF0dXNfMiAmCi0JCQkJICAgICAgIElPX1NUQVRFKFJfVVNCX1JIX1BPUlRfU1RBVFVTXzIsIGVuYWJsZWQsIHllcykpOwotCQkJCSpSX1VTQl9QT1JUMl9ESVNBQkxFID0gSU9fU1RBVEUoUl9VU0JfUE9SVDJfRElTQUJMRSwgZGlzYWJsZSwgbm8pOwotCQkJCWRiZ19yaCgiUG9ydCAyIGlzIGRpc2FibGVkIik7Ci0KLQkJCX0gZWxzZSB7Ci0JCQkJZGJnX3JoKCJSSF9DTEVBUl9GRUFUVVJFLT5SSF9QT1JUX0VOQUJMRSAiCi0JCQkJICAgICAgICJ3aXRoIGludmFsaWQgd0luZGV4ID09ICVkISIsIHdJbmRleCk7Ci0JCQl9Ci0KLQkJCU9LICgwKTsKLQkJY2FzZSAoUkhfUE9SVF9TVVNQRU5EKToKLQkJCS8qIE9wcG9zaXRlIHRvIHN1c3BlbmQgc2hvdWxkIGJlIHJlc3VtZSwgc28gd2UnbGwgZG8gYSByZXN1bWUuICovCi0JCQkvKiBGSVhNRTogVVNCIDEuMSwgMTEuMTYuMi4yIHNheXM6Ci0JCQkgICAiQ2xlYXJpbmcgdGhlIFBPUlRfU1VTUEVORCBmZWF0dXJlIGNhdXNlcyBhIGhvc3QtaW5pdGlhdGVkIHJlc3VtZQotCQkJICAgb24gdGhlIHNwZWNpZmllZCBwb3J0LiBJZiB0aGUgcG9ydCBpcyBub3QgaW4gdGhlIFN1c3BlbmRlZCBzdGF0ZSwKLQkJCSAgIHRoZSBodWIgc2hvdWxkIHRyZWF0IHRoaXMgcmVxdWVzdCBhcyBhIGZ1bmN0aW9uYWwgbm8tb3BlcmF0aW9uLiIKLQkJCSAgIFNob3VsZG4ndCB3ZSBjaGVjayBpZiB0aGUgcG9ydCBpcyBpbiBhIHN1c3BlbmRlZCBzdGF0ZSBiZWZvcmUKLQkJCSAgIHJlc3VtaW5nPyAqLwotCi0JCQkvKiBNYWtlIHN1cmUgdGhlIGNvbnRyb2xsZXIgaXNuJ3QgYnVzeS4gKi8KLQkJCXdoaWxlICgqUl9VU0JfQ09NTUFORCAmIElPX01BU0soUl9VU0JfQ09NTUFORCwgYnVzeSkpOwotCi0JCQlpZiAod0luZGV4ID09IDEpIHsKLQkJCQkqUl9VU0JfQ09NTUFORCA9Ci0JCQkJCUlPX1NUQVRFKFJfVVNCX0NPTU1BTkQsIHBvcnRfc2VsLCBwb3J0MSkgfAotCQkJCQlJT19TVEFURShSX1VTQl9DT01NQU5ELCBwb3J0X2NtZCwgcmVzdW1lKSB8Ci0JCQkJCUlPX1NUQVRFKFJfVVNCX0NPTU1BTkQsIGN0cmxfY21kLCBub3ApOwotCQkJfSBlbHNlIGlmICh3SW5kZXggPT0gMikgewotCQkJCSpSX1VTQl9DT01NQU5EID0KLQkJCQkJSU9fU1RBVEUoUl9VU0JfQ09NTUFORCwgcG9ydF9zZWwsIHBvcnQyKSB8Ci0JCQkJCUlPX1NUQVRFKFJfVVNCX0NPTU1BTkQsIHBvcnRfY21kLCByZXN1bWUpIHwKLQkJCQkJSU9fU1RBVEUoUl9VU0JfQ09NTUFORCwgY3RybF9jbWQsIG5vcCk7Ci0JCQl9IGVsc2UgewotCQkJCWRiZ19yaCgiUkhfQ0xFQVJfRkVBVFVSRS0+UkhfUE9SVF9TVVNQRU5EICIKLQkJCQkgICAgICAgIndpdGggaW52YWxpZCB3SW5kZXggPT0gJWQhIiwgd0luZGV4KTsKLQkJCX0KLQotCQkJT0sgKDApOwotCQljYXNlIChSSF9QT1JUX1BPV0VSKToKLQkJCU9LICgwKTsJLyogcG9ydCBwb3dlciAqKiAqLwotCQljYXNlIChSSF9DX1BPUlRfQ09OTkVDVElPTik6Ci0JCQlpZiAod0luZGV4ID09IDEpIHsKLQkJCQloYy0+cmgud1BvcnRDaGFuZ2VfMSAmPSB+KDEgPDwgUkhfUE9SVF9DT05ORUNUSU9OKTsKLQkJCX0gZWxzZSBpZiAod0luZGV4ID09IDIpIHsKLQkJCQloYy0+cmgud1BvcnRDaGFuZ2VfMiAmPSB+KDEgPDwgUkhfUE9SVF9DT05ORUNUSU9OKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZGJnX3JoKCJSSF9DTEVBUl9GRUFUVVJFLT5SSF9DX1BPUlRfQ09OTkVDVElPTiAiCi0JCQkJICAgICAgICJ3aXRoIGludmFsaWQgd0luZGV4ID09ICVkISIsIHdJbmRleCk7Ci0JCQl9Ci0KLQkJCU9LICgwKTsKLQkJY2FzZSAoUkhfQ19QT1JUX0VOQUJMRSk6Ci0JCQlpZiAod0luZGV4ID09IDEpIHsKLQkJCQloYy0+cmgud1BvcnRDaGFuZ2VfMSAmPSB+KDEgPDwgUkhfUE9SVF9FTkFCTEUpOwotCQkJfSBlbHNlIGlmICh3SW5kZXggPT0gMikgewotCQkJCWhjLT5yaC53UG9ydENoYW5nZV8yICY9IH4oMSA8PCBSSF9QT1JUX0VOQUJMRSk7Ci0JCQl9IGVsc2UgewotCQkJCWRiZ19yaCgiUkhfQ0xFQVJfRkVBVFVSRS0+UkhfQ19QT1JUX0VOQUJMRSAiCi0JCQkJICAgICAgICJ3aXRoIGludmFsaWQgd0luZGV4ID09ICVkISIsIHdJbmRleCk7Ci0JCQl9Ci0JCQlPSyAoMCk7Ci0JCWNhc2UgKFJIX0NfUE9SVF9TVVNQRU5EKToKLS8qKiogV1JfUkhfUE9SVFNUQVQoUkhfUFNfUFNTQyk7ICovCi0JCQlPSyAoMCk7Ci0JCWNhc2UgKFJIX0NfUE9SVF9PVkVSX0NVUlJFTlQpOgotCQkJT0sgKDApOwkvKiBwb3J0IHBvd2VyIG92ZXIgY3VycmVudCAqKiAqLwotCQljYXNlIChSSF9DX1BPUlRfUkVTRVQpOgotCQkJaWYgKHdJbmRleCA9PSAxKSB7Ci0JCQkJaGMtPnJoLndQb3J0Q2hhbmdlXzEgJj0gfigxIDw8IFJIX1BPUlRfUkVTRVQpOwotCQkJfSBlbHNlIGlmICh3SW5kZXggPT0gMikgewotCQkJCWhjLT5yaC53UG9ydENoYW5nZV8yICY9IH4oMSA8PCBSSF9QT1JUX1JFU0VUKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZGJnX3JoKCJSSF9DTEVBUl9GRUFUVVJFLT5SSF9DX1BPUlRfUkVTRVQgIgotCQkJCSAgICAgICAid2l0aCBpbnZhbGlkIGluZGV4ID09ICVkISIsIHdJbmRleCk7Ci0JCQl9Ci0KLQkJCU9LICgwKTsKLQotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBSSF9TRVRfRkVBVFVSRSB8IFJIX09USEVSIHwgUkhfQ0xBU1M6Ci0JCXN3aXRjaCAod1ZhbHVlKSB7Ci0JCWNhc2UgKFJIX1BPUlRfU1VTUEVORCk6Ci0KLQkJCS8qIE1ha2Ugc3VyZSB0aGUgY29udHJvbGxlciBpc24ndCBidXN5LiAqLwotCQkJd2hpbGUgKCpSX1VTQl9DT01NQU5EICYgSU9fTUFTSyhSX1VTQl9DT01NQU5ELCBidXN5KSk7Ci0KLQkJCWlmICh3SW5kZXggPT0gMSkgewotCQkJCSpSX1VTQl9DT01NQU5EID0KLQkJCQkJSU9fU1RBVEUoUl9VU0JfQ09NTUFORCwgcG9ydF9zZWwsIHBvcnQxKSB8Ci0JCQkJCUlPX1NUQVRFKFJfVVNCX0NPTU1BTkQsIHBvcnRfY21kLCBzdXNwZW5kKSB8Ci0JCQkJCUlPX1NUQVRFKFJfVVNCX0NPTU1BTkQsIGN0cmxfY21kLCBub3ApOwotCQkJfSBlbHNlIGlmICh3SW5kZXggPT0gMikgewotCQkJCSpSX1VTQl9DT01NQU5EID0KLQkJCQkJSU9fU1RBVEUoUl9VU0JfQ09NTUFORCwgcG9ydF9zZWwsIHBvcnQyKSB8Ci0JCQkJCUlPX1NUQVRFKFJfVVNCX0NPTU1BTkQsIHBvcnRfY21kLCBzdXNwZW5kKSB8Ci0JCQkJCUlPX1NUQVRFKFJfVVNCX0NPTU1BTkQsIGN0cmxfY21kLCBub3ApOwotCQkJfSBlbHNlIHsKLQkJCQlkYmdfcmgoIlJIX1NFVF9GRUFUVVJFLT5SSF9QT1JUX1NVU1BFTkQgIgotCQkJCSAgICAgICAid2l0aCBpbnZhbGlkIHdJbmRleCA9PSAlZCEiLCB3SW5kZXgpOwotCQkJfQotCi0JCQlPSyAoMCk7Ci0JCWNhc2UgKFJIX1BPUlRfUkVTRVQpOgotCQkJaWYgKHdJbmRleCA9PSAxKSB7Ci0KLQkJCXBvcnRfMV9yZXNldDoKLQkJCQlkYmdfcmgoIkRvaW5nIHJlc2V0IG9mIHBvcnQgMSIpOwotCi0JCQkJLyogTWFrZSBzdXJlIHRoZSBjb250cm9sbGVyIGlzbid0IGJ1c3kuICovCi0JCQkJd2hpbGUgKCpSX1VTQl9DT01NQU5EICYgSU9fTUFTSyhSX1VTQl9DT01NQU5ELCBidXN5KSk7Ci0KLQkJCQkqUl9VU0JfQ09NTUFORCA9Ci0JCQkJCUlPX1NUQVRFKFJfVVNCX0NPTU1BTkQsIHBvcnRfc2VsLCBwb3J0MSkgfAotCQkJCQlJT19TVEFURShSX1VTQl9DT01NQU5ELCBwb3J0X2NtZCwgcmVzZXQpIHwKLQkJCQkJSU9fU1RBVEUoUl9VU0JfQ09NTUFORCwgY3RybF9jbWQsIG5vcCk7Ci0KLQkJCQkvKiBXZSBtdXN0IHdhaXQgYXQgbGVhc3QgMTAgbXMgZm9yIHRoZSBkZXZpY2UgdG8gcmVjb3Zlci4KLQkJCQkgICAxNSBtcyBzaG91bGQgYmUgZW5vdWdoLiAqLwotCQkJCXVkZWxheSgxNTAwMCk7Ci0KLQkJCQkvKiBXYWl0IGZvciByZXNldCBiaXQgdG8gZ28gbG93IChzaG91bGQgYmUgZG9uZSBieSBub3cpLiAqLwotCQkJCXdoaWxlIChoYy0+cmgucHJldl93UG9ydFN0YXR1c18xICYKLQkJCQkgICAgICAgSU9fU1RBVEUoUl9VU0JfUkhfUE9SVF9TVEFUVVNfMSwgcmVzZXQsIHllcykpOwotCi0JCQkJLyogSWYgdGhlIHBvcnQgc3RhdHVzIGlzCi0JCQkJICAgMSkgY29ubmVjdGVkIGFuZCBlbmFibGVkIHRoZW4gdGhlcmUgaXMgYSBkZXZpY2UgYW5kIGV2ZXJ5dGhpbmcgaXMgZmluZQotCQkJCSAgIDIpIG5laXRoZXIgY29ubmVjdGVkIG5vciBlbmFibGVkIHRoZW4gdGhlcmUgaXMgbm8gZGV2aWNlLCBhbHNvIGZpbmUKLQkJCQkgICAzKSBjb25uZWN0ZWQgYW5kIG5vdCBlbmFibGVkIHRoZW4gd2UgdHJ5IGFnYWluCi0JCQkJICAgKFllcywgdGhlcmUgYXJlIG90aGVyIHBvcnQgc3RhdHVzIGNvbWJpbmF0aW9ucyBiZXNpZGVzIHRoZXNlLikgKi8KLQotCQkJCWlmICgoaGMtPnJoLnByZXZfd1BvcnRTdGF0dXNfMSAmCi0JCQkJICAgICBJT19TVEFURShSX1VTQl9SSF9QT1JUX1NUQVRVU18xLCBjb25uZWN0ZWQsIHllcykpICYmCi0JCQkJICAgIChoYy0+cmgucHJldl93UG9ydFN0YXR1c18xICYKLQkJCQkgICAgIElPX1NUQVRFKFJfVVNCX1JIX1BPUlRfU1RBVFVTXzEsIGVuYWJsZWQsIG5vKSkpIHsKLQkJCQkJZGJnX3JoKCJDb25uZWN0ZWQgZGV2aWNlIG9uIHBvcnQgMSwgYnV0IHBvcnQgbm90IGVuYWJsZWQ/IgotCQkJCQkgICAgICAgIiBUcnlpbmcgcmVzZXQgYWdhaW4uIik7Ci0JCQkJCWdvdG8gcG9ydF8yX3Jlc2V0OwotCQkJCX0KLQotCQkJCS8qIERpYWdub3N0aWMgcHJpbnRvdXRzLiAqLwotCQkJCWlmICgoaGMtPnJoLnByZXZfd1BvcnRTdGF0dXNfMSAmCi0JCQkJICAgICBJT19TVEFURShSX1VTQl9SSF9QT1JUX1NUQVRVU18xLCBjb25uZWN0ZWQsIG5vKSkgJiYKLQkJCQkgICAgKGhjLT5yaC5wcmV2X3dQb3J0U3RhdHVzXzEgJgotCQkJCSAgICAgSU9fU1RBVEUoUl9VU0JfUkhfUE9SVF9TVEFUVVNfMSwgZW5hYmxlZCwgbm8pKSkgewotCQkJCQlkYmdfcmgoIk5vIGNvbm5lY3RlZCBkZXZpY2Ugb24gcG9ydCAxIik7Ci0JCQkJfSBlbHNlIGlmICgoaGMtPnJoLnByZXZfd1BvcnRTdGF0dXNfMSAmCi0JCQkJCSAgICBJT19TVEFURShSX1VTQl9SSF9QT1JUX1NUQVRVU18xLCBjb25uZWN0ZWQsIHllcykpICYmCi0JCQkJCSAgIChoYy0+cmgucHJldl93UG9ydFN0YXR1c18xICYKLQkJCQkJICAgIElPX1NUQVRFKFJfVVNCX1JIX1BPUlRfU1RBVFVTXzEsIGVuYWJsZWQsIHllcykpKSB7Ci0JCQkJCWRiZ19yaCgiQ29ubmVjdGVkIGRldmljZSBvbiBwb3J0IDEsIHBvcnQgMSBlbmFibGVkIik7Ci0JCQkJfQotCi0JCQl9IGVsc2UgaWYgKHdJbmRleCA9PSAyKSB7Ci0KLQkJCXBvcnRfMl9yZXNldDoKLQkJCQlkYmdfcmgoIkRvaW5nIHJlc2V0IG9mIHBvcnQgMiIpOwotCi0JCQkJLyogTWFrZSBzdXJlIHRoZSBjb250cm9sbGVyIGlzbid0IGJ1c3kuICovCi0JCQkJd2hpbGUgKCpSX1VTQl9DT01NQU5EICYgSU9fTUFTSyhSX1VTQl9DT01NQU5ELCBidXN5KSk7Ci0KLQkJCQkvKiBJc3N1ZSB0aGUgcmVzZXQgY29tbWFuZC4gKi8KLQkJCQkqUl9VU0JfQ09NTUFORCA9Ci0JCQkJCUlPX1NUQVRFKFJfVVNCX0NPTU1BTkQsIHBvcnRfc2VsLCBwb3J0MikgfAotCQkJCQlJT19TVEFURShSX1VTQl9DT01NQU5ELCBwb3J0X2NtZCwgcmVzZXQpIHwKLQkJCQkJSU9fU1RBVEUoUl9VU0JfQ09NTUFORCwgY3RybF9jbWQsIG5vcCk7Ci0KLQkJCQkvKiBXZSBtdXN0IHdhaXQgYXQgbGVhc3QgMTAgbXMgZm9yIHRoZSBkZXZpY2UgdG8gcmVjb3Zlci4KLQkJCQkgICAxNSBtcyBzaG91bGQgYmUgZW5vdWdoLiAqLwotCQkJCXVkZWxheSgxNTAwMCk7Ci0KLQkJCQkvKiBXYWl0IGZvciByZXNldCBiaXQgdG8gZ28gbG93IChzaG91bGQgYmUgZG9uZSBieSBub3cpLiAqLwotCQkJCXdoaWxlIChoYy0+cmgucHJldl93UG9ydFN0YXR1c18yICYKLQkJCQkgICAgICAgSU9fU1RBVEUoUl9VU0JfUkhfUE9SVF9TVEFUVVNfMiwgcmVzZXQsIHllcykpOwotCi0JCQkJLyogSWYgdGhlIHBvcnQgc3RhdHVzIGlzCi0JCQkJICAgMSkgY29ubmVjdGVkIGFuZCBlbmFibGVkIHRoZW4gdGhlcmUgaXMgYSBkZXZpY2UgYW5kIGV2ZXJ5dGhpbmcgaXMgZmluZQotCQkJCSAgIDIpIG5laXRoZXIgY29ubmVjdGVkIG5vciBlbmFibGVkIHRoZW4gdGhlcmUgaXMgbm8gZGV2aWNlLCBhbHNvIGZpbmUKLQkJCQkgICAzKSBjb25uZWN0ZWQgYW5kIG5vdCBlbmFibGVkIHRoZW4gd2UgdHJ5IGFnYWluCi0JCQkJICAgKFllcywgdGhlcmUgYXJlIG90aGVyIHBvcnQgc3RhdHVzIGNvbWJpbmF0aW9ucyBiZXNpZGVzIHRoZXNlLikgKi8KLQotCQkJCWlmICgoaGMtPnJoLnByZXZfd1BvcnRTdGF0dXNfMiAmCi0JCQkJICAgICBJT19TVEFURShSX1VTQl9SSF9QT1JUX1NUQVRVU18yLCBjb25uZWN0ZWQsIHllcykpICYmCi0JCQkJICAgIChoYy0+cmgucHJldl93UG9ydFN0YXR1c18yICYKLQkJCQkgICAgIElPX1NUQVRFKFJfVVNCX1JIX1BPUlRfU1RBVFVTXzIsIGVuYWJsZWQsIG5vKSkpIHsKLQkJCQkJZGJnX3JoKCJDb25uZWN0ZWQgZGV2aWNlIG9uIHBvcnQgMiwgYnV0IHBvcnQgbm90IGVuYWJsZWQ/IgotCQkJCQkgICAgICAgIiBUcnlpbmcgcmVzZXQgYWdhaW4uIik7Ci0JCQkJCWdvdG8gcG9ydF8yX3Jlc2V0OwotCQkJCX0KLQotCQkJCS8qIERpYWdub3N0aWMgcHJpbnRvdXRzLiAqLwotCQkJCWlmICgoaGMtPnJoLnByZXZfd1BvcnRTdGF0dXNfMiAmCi0JCQkJICAgICBJT19TVEFURShSX1VTQl9SSF9QT1JUX1NUQVRVU18yLCBjb25uZWN0ZWQsIG5vKSkgJiYKLQkJCQkgICAgKGhjLT5yaC5wcmV2X3dQb3J0U3RhdHVzXzIgJgotCQkJCSAgICAgSU9fU1RBVEUoUl9VU0JfUkhfUE9SVF9TVEFUVVNfMiwgZW5hYmxlZCwgbm8pKSkgewotCQkJCQlkYmdfcmgoIk5vIGNvbm5lY3RlZCBkZXZpY2Ugb24gcG9ydCAyIik7Ci0JCQkJfSBlbHNlIGlmICgoaGMtPnJoLnByZXZfd1BvcnRTdGF0dXNfMiAmCi0JCQkJCSAgICBJT19TVEFURShSX1VTQl9SSF9QT1JUX1NUQVRVU18yLCBjb25uZWN0ZWQsIHllcykpICYmCi0JCQkJCSAgIChoYy0+cmgucHJldl93UG9ydFN0YXR1c18yICYKLQkJCQkJICAgIElPX1NUQVRFKFJfVVNCX1JIX1BPUlRfU1RBVFVTXzIsIGVuYWJsZWQsIHllcykpKSB7Ci0JCQkJCWRiZ19yaCgiQ29ubmVjdGVkIGRldmljZSBvbiBwb3J0IDIsIHBvcnQgMiBlbmFibGVkIik7Ci0JCQkJfQotCi0JCQl9IGVsc2UgewotCQkJCWRiZ19yaCgiUkhfU0VUX0ZFQVRVUkUtPlJIX1BPUlRfUkVTRVQgd2l0aCBpbnZhbGlkIHdJbmRleCA9ICVkIiwgd0luZGV4KTsKLQkJCX0KLQotCQkJLyogTWFrZSBzdXJlIHRoZSBjb250cm9sbGVyIGlzbid0IGJ1c3kuICovCi0JCQl3aGlsZSAoKlJfVVNCX0NPTU1BTkQgJiBJT19NQVNLKFJfVVNCX0NPTU1BTkQsIGJ1c3kpKTsKLQotCQkJLyogSWYgYWxsIGVuYWJsZWQgcG9ydHMgd2VyZSBkaXNhYmxlZCB0aGUgaG9zdCBjb250cm9sbGVyIGdvZXMgZG93biBpbnRvCi0JCQkgICBzdGFydGVkIG1vZGUsIHNvIHdlIG5lZWQgdG8gYnJpbmcgaXQgYmFjayBpbnRvIHRoZSBydW5uaW5nIHN0YXRlLgotCQkJICAgKFRoaXMgaXMgc2FmZSBldmVuIGlmIGl0J3MgYWxyZWFkeSBpbiB0aGUgcnVubmluZyBzdGF0ZS4pICovCi0JCQkqUl9VU0JfQ09NTUFORCA9Ci0JCQkJSU9fU1RBVEUoUl9VU0JfQ09NTUFORCwgcG9ydF9zZWwsIG5vcCkgfAotCQkJCUlPX1NUQVRFKFJfVVNCX0NPTU1BTkQsIHBvcnRfY21kLCByZXNldCkgfAotCQkJCUlPX1NUQVRFKFJfVVNCX0NPTU1BTkQsIGN0cmxfY21kLCBob3N0X3J1bik7Ci0KLQkJCWRiZ19yaCgiLi4uRG9uZSIpOwotCQkJT0soMCk7Ci0KLQkJY2FzZSAoUkhfUE9SVF9QT1dFUik6Ci0JCQlPSyAoMCk7CS8qIHBvcnQgcG93ZXIgKiogKi8KLQkJY2FzZSAoUkhfUE9SVF9FTkFCTEUpOgotCQkJLyogVGhlcmUgaXMgbm8gcG9ydCBlbmFibGUgY29tbWFuZCBpbiB0aGUgaG9zdCBjb250cm9sbGVyLCBzbyBpZiB0aGUKLQkJCSAgIHBvcnQgaXMgYWxyZWFkeSBlbmFibGVkLCB3ZSBkbyBub3RoaW5nLiBJZiBub3QsIHdlIHJlc2V0IHRoZSBwb3J0Ci0JCQkgICAod2l0aCBhbiB1Z2x5IGdvdG8pLiAqLwotCi0JCQlpZiAod0luZGV4ID09IDEpIHsKLQkJCQlpZiAoaGMtPnJoLnByZXZfd1BvcnRTdGF0dXNfMSAmCi0JCQkJICAgIElPX1NUQVRFKFJfVVNCX1JIX1BPUlRfU1RBVFVTXzEsIGVuYWJsZWQsIG5vKSkgewotCQkJCQlnb3RvIHBvcnRfMV9yZXNldDsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKHdJbmRleCA9PSAyKSB7Ci0JCQkJaWYgKGhjLT5yaC5wcmV2X3dQb3J0U3RhdHVzXzIgJgotCQkJCSAgICBJT19TVEFURShSX1VTQl9SSF9QT1JUX1NUQVRVU18yLCBlbmFibGVkLCBubykpIHsKLQkJCQkJZ290byBwb3J0XzJfcmVzZXQ7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlkYmdfcmgoIlJIX1NFVF9GRUFUVVJFLT5SSF9HRVRfU1RBVFVTIHdpdGggaW52YWxpZCB3SW5kZXggPSAlZCIsIHdJbmRleCk7Ci0JCQl9Ci0JCQlPSyAoMCk7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFJIX1NFVF9BRERSRVNTOgotCQloYy0+cmguZGV2bnVtID0gd1ZhbHVlOwotCQlkYmdfcmgoIlJIIGFkZHJlc3Mgc2V0IHRvOiAlZCIsIGhjLT5yaC5kZXZudW0pOwotCQlPSyAoMCk7Ci0KLQljYXNlIFJIX0dFVF9ERVNDUklQVE9SOgotCQlzd2l0Y2ggKCh3VmFsdWUgJiAweGZmMDApID4+IDgpIHsKLQkJY2FzZSAoMHgwMSk6CS8qIGRldmljZSBkZXNjcmlwdG9yICovCi0JCQlsZW4gPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGxlbmksIG1pbl90KHVuc2lnbmVkIGludCwgc2l6ZW9mIChyb290X2h1Yl9kZXZfZGVzKSwgd0xlbmd0aCkpOwotCQkJbWVtY3B5IChkYXRhLCByb290X2h1Yl9kZXZfZGVzLCBsZW4pOwotCQkJT0sgKGxlbik7Ci0JCWNhc2UgKDB4MDIpOgkvKiBjb25maWd1cmF0aW9uIGRlc2NyaXB0b3IgKi8KLQkJCWxlbiA9IG1pbl90KHVuc2lnbmVkIGludCwgbGVuaSwgbWluX3QodW5zaWduZWQgaW50LCBzaXplb2YgKHJvb3RfaHViX2NvbmZpZ19kZXMpLCB3TGVuZ3RoKSk7Ci0JCQltZW1jcHkgKGRhdGEsIHJvb3RfaHViX2NvbmZpZ19kZXMsIGxlbik7Ci0JCQlPSyAobGVuKTsKLQkJY2FzZSAoMHgwMyk6CS8qIHN0cmluZyBkZXNjcmlwdG9ycyAqLwotCQkJbGVuID0gdXNiX3Jvb3RfaHViX3N0cmluZyAod1ZhbHVlICYgMHhmZiwKLQkJCQkJCSAgIDB4ZmYsICJFVFJBWCAxMDBMWCIsCi0JCQkJCQkgICBkYXRhLCB3TGVuZ3RoKTsKLQkJCWlmIChsZW4gPiAwKSB7Ci0JCQkJT0sobWluKGxlbmksIGxlbikpOwotCQkJfSBlbHNlIHsKLQkJCQlzdGF0ID0gLUVQSVBFOwotCQkJfQotCi0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFJIX0dFVF9ERVNDUklQVE9SIHwgUkhfQ0xBU1M6Ci0JCXJvb3RfaHViX2h1Yl9kZXNbMl0gPSBoYy0+cmgubnVtcG9ydHM7Ci0JCWxlbiA9IG1pbl90KHVuc2lnbmVkIGludCwgbGVuaSwgbWluX3QodW5zaWduZWQgaW50LCBzaXplb2YgKHJvb3RfaHViX2h1Yl9kZXMpLCB3TGVuZ3RoKSk7Ci0JCW1lbWNweSAoZGF0YSwgcm9vdF9odWJfaHViX2RlcywgbGVuKTsKLQkJT0sgKGxlbik7Ci0KLQljYXNlIFJIX0dFVF9DT05GSUdVUkFUSU9OOgotCQkqKF9fdTggKikgZGF0YSA9IDB4MDE7Ci0JCU9LICgxKTsKLQotCWNhc2UgUkhfU0VUX0NPTkZJR1VSQVRJT046Ci0JCU9LICgwKTsKLQotCWRlZmF1bHQ6Ci0JCXN0YXQgPSAtRVBJUEU7Ci0JfQotCi0JdXJiLT5hY3R1YWxfbGVuZ3RoID0gbGVuOwotCXVyYi0+c3RhdHVzID0gc3RhdDsKLQl1cmItPmRldiA9IE5VTEw7Ci0JaWYgKHVyYi0+Y29tcGxldGUpIHsKLQkJdXJiLT5jb21wbGV0ZSh1cmIsIE5VTEwpOwotCX0KLQlEQkZFWElUOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkCi1ldHJheF91c2JfYnVsa19lb3RfdGltZXJfZnVuYyh1bnNpZ25lZCBsb25nIGR1bW15KQotewotCS8qIEJlY2F1c2Ugb2YgYSByYWNlIGNvbmRpdGlvbiBpbiB0aGUgdG9wIGhhbGYsIHdlIG1pZ2h0IG1pc3MgYSBidWxrIGVvdC4KLQkgICBUaGlzIHRpbWVyICJzaW11bGF0ZXMiIGEgYnVsayBlb3QgaWYgd2UgZG9uJ3QgZ2V0IG9uZSBmb3IgYSB3aGlsZSwgaG9wZWZ1bGx5Ci0JICAgY29ycmVjdGluZyB0aGUgc2l0dWF0aW9uLiAqLwotCWRiZ19idWxrKCJidWxrX2VvdF90aW1lciB0aW1lZCBvdXQuIik7Ci0JZXRyYXhfdXNiX2hjX2J1bGtfZW90X2ludGVycnVwdCgxKTsKLX0KLQotc3RhdGljIHZvaWQqCi1ldHJheF91c2JfYnVmZmVyX2FsbG9jKHN0cnVjdCB1c2JfYnVzKiBidXMsIHNpemVfdCBzaXplLAotCXVuc2lnbmVkIG1lbV9mbGFncywgZG1hX2FkZHJfdCAqZG1hKQotewotICByZXR1cm4ga21hbGxvYyhzaXplLCBtZW1fZmxhZ3MpOwotfQotCi1zdGF0aWMgdm9pZAotZXRyYXhfdXNiX2J1ZmZlcl9mcmVlKHN0cnVjdCB1c2JfYnVzICpidXMsIHNpemVfdCBzaXplLCB2b2lkICphZGRyLCBkbWFfYWRkcl90IGRtYSkKLXsKLSAga2ZyZWUoYWRkcik7Ci19Ci0KLQotc3RhdGljIHN0cnVjdCBkZXZpY2UgZmFrZV9kZXZpY2U7Ci0KLXN0YXRpYyBpbnQgX19pbml0IGV0cmF4X3VzYl9oY19pbml0KHZvaWQpCi17Ci0Jc3RhdGljIGV0cmF4X2hjX3QgKmhjOwotCXN0cnVjdCB1c2JfYnVzICpidXM7Ci0Jc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9yaDsKLQlpbnQgaTsKLQotCURCRkVOVEVSOwotCi0JaW5mbygiRVRSQVggMTAwTFggVVNCLUhDRCAlcyAoYykgMjAwMS0yMDAzIEF4aXMgQ29tbXVuaWNhdGlvbnMgQUJcbiIsIHVzYl9oY2RfdmVyc2lvbik7Ci0KLSAJaGMgPSBrbWFsbG9jKHNpemVvZihldHJheF9oY190KSwgR0ZQX0tFUk5FTCk7Ci0JYXNzZXJ0KGhjICE9IE5VTEwpOwotCi0JLyogV2UgdXNlIGttZW1fY2FjaGVfKiB0byBtYWtlIHN1cmUgdGhhdCBhbGwgRE1BIGRlc2MuIGFyZSBkd29yZCBhbGlnbmVkICovCi0JLyogTm90ZSB0aGF0IHdlIHNwZWNpZnkgc2l6ZW9mKFVTQl9FUF9EZXNjX3QpIGFzIHRoZSBzaXplLCBidXQgYWxzbyBhbGxvY2F0ZQotCSAgIFNCIGRlc2NyaXB0b3JzIGZyb20gdGhpcyBjYWNoZS4gVGhpcyBpcyBvayBzaW5jZSBzaXplb2YoVVNCX0VQX0Rlc2NfdCkgPT0KLQkgICBzaXplb2YoVVNCX1NCX0Rlc2NfdCkuICovCi0KLQl1c2JfZGVzY19jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKCJ1c2JfZGVzY19jYWNoZSIsIHNpemVvZihVU0JfRVBfRGVzY190KSwgMCwKLQkJCQkJICAgU0xBQl9IV0NBQ0hFX0FMSUdOLCAwLCAwKTsKLQlhc3NlcnQodXNiX2Rlc2NfY2FjaGUgIT0gTlVMTCk7Ci0KLQl0b3BfaGFsZl9yZWdfY2FjaGUgPSBrbWVtX2NhY2hlX2NyZWF0ZSgidG9wX2hhbGZfcmVnX2NhY2hlIiwKLQkJCQkJICAgICAgIHNpemVvZih1c2JfaW50ZXJydXB0X3JlZ2lzdGVyc190KSwKLQkJCQkJICAgICAgIDAsIFNMQUJfSFdDQUNIRV9BTElHTiwgMCwgMCk7Ci0JYXNzZXJ0KHRvcF9oYWxmX3JlZ19jYWNoZSAhPSBOVUxMKTsKLQotCWlzb2NfY29tcGxfY2FjaGUgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiaXNvY19jb21wbF9jYWNoZSIsCi0JCQkJCQlzaXplb2YodXNiX2lzb2NfY29tcGxldGVfZGF0YV90KSwKLQkJCQkJCTAsIFNMQUJfSFdDQUNIRV9BTElHTiwgMCwgMCk7Ci0JYXNzZXJ0KGlzb2NfY29tcGxfY2FjaGUgIT0gTlVMTCk7Ci0KLQlldHJheF91c2JfYnVzID0gYnVzID0gdXNiX2FsbG9jX2J1cygmZXRyYXhfdXNiX2RldmljZV9vcGVyYXRpb25zKTsKLQloYy0+YnVzID0gYnVzOwotCWJ1cy0+YnVzX25hbWU9IkVUUkFYIDEwMExYIjsKLQlidXMtPmhjcHJpdiA9IGhjOwotCi0JLyogSW5pdGlhbGl6ZSBSSCB0byB0aGUgZGVmYXVsdCBhZGRyZXNzLgotCSAgIEFuZCBtYWtlIHN1cmUgdGhhdCB3ZSBoYXZlIG5vIHN0YXR1cyBjaGFuZ2UgaW5kaWNhdGlvbiAqLwotCWhjLT5yaC5udW1wb3J0cyA9IDI7ICAvKiBUaGUgUkggaGFzIHR3byBwb3J0cyAqLwotCWhjLT5yaC5kZXZudW0gPSAxOwotCWhjLT5yaC53UG9ydENoYW5nZV8xID0gMDsKLQloYy0+cmgud1BvcnRDaGFuZ2VfMiA9IDA7Ci0KLQkvKiBBbHNvIGluaXRhdGUgdGhlIHByZXZpb3VzIHZhbHVlcyB0byB6ZXJvICovCi0JaGMtPnJoLnByZXZfd1BvcnRTdGF0dXNfMSA9IDA7Ci0JaGMtPnJoLnByZXZfd1BvcnRTdGF0dXNfMiA9IDA7Ci0KLQkvKiBJbml0aWFsaXplIHRoZSBpbnRyLXRyYWZmaWMgZmxhZ3MgKi8KLQkvKiBGSVhNRTogVGhpcyBpc24ndCB1c2VkLiAoQmVzaWRlcywgdGhlIGVycm9yIGZpZWxkIGlzbid0IGluaXRpYWxpemVkLikgKi8KLQloYy0+aW50ci5zbGVlcGluZyA9IDA7Ci0JaGMtPmludHIud3EgPSBOVUxMOwotCi0JZXBpZF91c2FnZV9iaXRtYXNrID0gMDsKLQllcGlkX291dF90cmFmZmljID0gMDsKLQotCS8qIE1hcmsgdGhlIGludmFsaWQgZXBpZCBhcyBiZWluZyB1c2VkLiAqLwotCXNldF9iaXQoSU5WQUxJRF9FUElELCAodm9pZCAqKSZlcGlkX3VzYWdlX2JpdG1hc2spOwotCSpSX1VTQl9FUFRfSU5ERVggPSBJT19GSUVMRChSX1VTQl9FUFRfSU5ERVgsIHZhbHVlLCBJTlZBTElEX0VQSUQpOwotCW5vcCgpOwotCS8qIFRoZSB2YWxpZCBiaXQgc2hvdWxkIHN0aWxsIGJlIHNldCAoJ2ludmFsaWQnIGlzIGluIG91ciB3b3JsZDsgbm90IHRoZSBoYXJkd2FyZSdzKS4gKi8KLQkqUl9VU0JfRVBUX0RBVEEgPSAoSU9fU1RBVEUoUl9VU0JfRVBUX0RBVEEsIHZhbGlkLCB5ZXMpIHwKLQkJCSAgIElPX0ZJRUxEKFJfVVNCX0VQVF9EQVRBLCBtYXhfbGVuLCAxKSk7Ci0KLQkvKiBNYXJrIHRoZSBkdW1teSBlcGlkIGFzIGJlaW5nIHVzZWQuICovCi0Jc2V0X2JpdChEVU1NWV9FUElELCAodm9pZCAqKSZlcGlkX3VzYWdlX2JpdG1hc2spOwotCSpSX1VTQl9FUFRfSU5ERVggPSBJT19GSUVMRChSX1VTQl9FUFRfSU5ERVgsIHZhbHVlLCBEVU1NWV9FUElEKTsKLQlub3AoKTsKLQkqUl9VU0JfRVBUX0RBVEEgPSAoSU9fU1RBVEUoUl9VU0JfRVBUX0RBVEEsIHZhbGlkLCBubykgfAotCQkJICAgSU9fRklFTEQoUl9VU0JfRVBUX0RBVEEsIG1heF9sZW4sIDEpKTsKLQotCS8qIEluaXRpYWxpemUgdGhlIHVyYiBsaXN0IGJ5IGluaXRpYXRpbmcgYSBoZWFkIGZvciBlYWNoIGxpc3QuICovCi0JZm9yIChpID0gMDsgaSA8IE5CUl9PRl9FUElEUzsgaSsrKSB7Ci0JCUlOSVRfTElTVF9IRUFEKCZ1cmJfbGlzdFtpXSk7Ci0JfQotCXNwaW5fbG9ja19pbml0KCZ1cmJfbGlzdF9sb2NrKTsKLQotCUlOSVRfTElTVF9IRUFEKCZ1cmJfdW5saW5rX2xpc3QpOwotCi0KLQkvKiBJbml0aWF0ZSB0aGUgYnVsayBzdGFydCB0aW1lci4gKi8KLQlpbml0X3RpbWVyKCZidWxrX3N0YXJ0X3RpbWVyKTsKLQlidWxrX3N0YXJ0X3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgQlVMS19TVEFSVF9USU1FUl9JTlRFUlZBTDsKLQlidWxrX3N0YXJ0X3RpbWVyLmZ1bmN0aW9uID0gZXRyYXhfdXNiX2J1bGtfc3RhcnRfdGltZXJfZnVuYzsKLQlhZGRfdGltZXIoJmJ1bGtfc3RhcnRfdGltZXIpOwotCi0KLQkvKiBJbml0aWF0ZSB0aGUgYnVsayBlb3QgdGltZXIuICovCi0JaW5pdF90aW1lcigmYnVsa19lb3RfdGltZXIpOwotCWJ1bGtfZW90X3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgQlVMS19FT1RfVElNRVJfSU5URVJWQUw7Ci0JYnVsa19lb3RfdGltZXIuZnVuY3Rpb24gPSBldHJheF91c2JfYnVsa19lb3RfdGltZXJfZnVuYzsKLQlhZGRfdGltZXIoJmJ1bGtfZW90X3RpbWVyKTsKLQotCS8qIFNldCB1cCB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGZvciBVU0IgdHJhZmZpYy4gTm90ZSB0aGF0IHRoaXMgbXVzdCBiZSBkb25lIGJlZm9yZQotCSAgIGFueSBpbnRlcnJ1cHQgdGhhdCByZWxpZXMgb24gc2FuZSBETUEgbGlzdCBvY2N1cnJzLiAqLwotCWluaXRfcnhfYnVmZmVycygpOwotCWluaXRfdHhfYnVsa19lcCgpOwotCWluaXRfdHhfY3RybF9lcCgpOwotCWluaXRfdHhfaW50cl9lcCgpOwotCWluaXRfdHhfaXNvY19lcCgpOwotCi0gICAgICAgIGRldmljZV9pbml0aWFsaXplKCZmYWtlX2RldmljZSk7Ci0gICAgICAgIGtvYmplY3Rfc2V0X25hbWUoJmZha2VfZGV2aWNlLmtvYmosICJldHJheF91c2IiKTsKLSAgICAgICAga29iamVjdF9hZGQoJmZha2VfZGV2aWNlLmtvYmopOwotCWtvYmplY3RfdWV2ZW50KCZmYWtlX2RldmljZS5rb2JqLCBLT0JKX0FERCk7Ci0gICAgICAgIGhjLT5idXMtPmNvbnRyb2xsZXIgPSAmZmFrZV9kZXZpY2U7Ci0JdXNiX3JlZ2lzdGVyX2J1cyhoYy0+YnVzKTsKLQotCSpSX0lSUV9NQVNLMl9TRVQgPQotCQkvKiBOb3RlIHRoYXQgdGhlc2UgaW50ZXJydXB0cyBhcmUgbm90IHVzZWQuICovCi0JCUlPX1NUQVRFKFJfSVJRX01BU0syX1NFVCwgZG1hOF9zdWIwX2Rlc2NyLCBzZXQpIHwKLQkJLyogU3ViIGNoYW5uZWwgMSAoY3RybCkgZGVzY3IuIGludGVycnVwdHMgYXJlIHVzZWQuICovCi0JCUlPX1NUQVRFKFJfSVJRX01BU0syX1NFVCwgZG1hOF9zdWIxX2Rlc2NyLCBzZXQpIHwKLQkJSU9fU1RBVEUoUl9JUlFfTUFTSzJfU0VULCBkbWE4X3N1YjJfZGVzY3IsIHNldCkgfAotCQkvKiBTdWIgY2hhbm5lbCAzIChpc29jKSBkZXNjci4gaW50ZXJydXB0cyBhcmUgdXNlZC4gKi8KLQkJSU9fU1RBVEUoUl9JUlFfTUFTSzJfU0VULCBkbWE4X3N1YjNfZGVzY3IsIHNldCk7Ci0KLQkvKiBOb3RlIHRoYXQgdGhlIGRtYTlfZGVzY3IgaW50ZXJydXB0IGlzIG5vdCB1c2VkLiAqLwotCSpSX0lSUV9NQVNLMl9TRVQgPQotCQlJT19TVEFURShSX0lSUV9NQVNLMl9TRVQsIGRtYTlfZW9wLCBzZXQpIHwKLQkJSU9fU1RBVEUoUl9JUlFfTUFTSzJfU0VULCBkbWE5X2Rlc2NyLCBzZXQpOwotCi0JLyogRklYTUU6IEVuYWJsZSBpc29fZW9mIG9ubHkgd2hlbiBpc29jIHRyYWZmaWMgaXMgcnVubmluZy4gKi8KLQkqUl9VU0JfSVJRX01BU0tfU0VUID0KLQkJSU9fU1RBVEUoUl9VU0JfSVJRX01BU0tfU0VULCBpc29fZW9mLCBzZXQpIHwKLQkJSU9fU1RBVEUoUl9VU0JfSVJRX01BU0tfU0VULCBidWxrX2VvdCwgc2V0KSB8Ci0JCUlPX1NUQVRFKFJfVVNCX0lSUV9NQVNLX1NFVCwgZXBpZF9hdHRuLCBzZXQpIHwKLQkJSU9fU1RBVEUoUl9VU0JfSVJRX01BU0tfU0VULCBwb3J0X3N0YXR1cywgc2V0KSB8Ci0JCUlPX1NUQVRFKFJfVVNCX0lSUV9NQVNLX1NFVCwgY3RsX3N0YXR1cywgc2V0KTsKLQotCi0JaWYgKHJlcXVlc3RfaXJxKEVUUkFYX1VTQl9IQ19JUlEsIGV0cmF4X3VzYl9oY19pbnRlcnJ1cHRfdG9wX2hhbGYsIDAsCi0JCQkiRVRSQVggMTAwTFggYnVpbHQtaW4gVVNCIChIQykiLCBoYykpIHsKLQkJZXJyKCJDb3VsZCBub3QgYWxsb2NhdGUgSVJRICVkIGZvciBVU0IiLCBFVFJBWF9VU0JfSENfSVJRKTsKLQkJZXRyYXhfdXNiX2hjX2NsZWFudXAoKTsKLQkJREJGRVhJVDsKLQkJcmV0dXJuIC0xOwotCX0KLQotCWlmIChyZXF1ZXN0X2lycShFVFJBWF9VU0JfUlhfSVJRLCBldHJheF91c2JfcnhfaW50ZXJydXB0LCAwLAotCQkJIkVUUkFYIDEwMExYIGJ1aWx0LWluIFVTQiAoUngpIiwgaGMpKSB7Ci0JCWVycigiQ291bGQgbm90IGFsbG9jYXRlIElSUSAlZCBmb3IgVVNCIiwgRVRSQVhfVVNCX1JYX0lSUSk7Ci0JCWV0cmF4X3VzYl9oY19jbGVhbnVwKCk7Ci0JCURCRkVYSVQ7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlpZiAocmVxdWVzdF9pcnEoRVRSQVhfVVNCX1RYX0lSUSwgZXRyYXhfdXNiX3R4X2ludGVycnVwdCwgMCwKLQkJCSJFVFJBWCAxMDBMWCBidWlsdC1pbiBVU0IgKFR4KSIsIGhjKSkgewotCQllcnIoIkNvdWxkIG5vdCBhbGxvY2F0ZSBJUlEgJWQgZm9yIFVTQiIsIEVUUkFYX1VTQl9UWF9JUlEpOwotCQlldHJheF91c2JfaGNfY2xlYW51cCgpOwotCQlEQkZFWElUOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyogUl9VU0JfQ09NTUFORDoKLQkgICBVU0IgY29tbWFuZHMgaW4gaG9zdCBtb2RlLiBUaGUgZmllbGRzIGluIHRoaXMgcmVnaXN0ZXIgc2hvdWxkIGFsbCBiZQotCSAgIHdyaXR0ZW4gdG8gaW4gb25lIHdyaXRlLiBEbyBub3QgcmVhZC1tb2RpZnktd3JpdGUgb25lIGZpZWxkIGF0IGEgdGltZS4gQQotCSAgIHdyaXRlIHRvIHRoaXMgcmVnaXN0ZXIgd2lsbCB0cmlnZ2VyIGV2ZW50cyBpbiB0aGUgVVNCIGNvbnRyb2xsZXIgYW5kIGFuCi0JICAgaW5jb21wbGV0ZSBjb21tYW5kIG1heSBsZWFkIHRvIHVucHJlZGljdGFibGUgcmVzdWx0cywgYW5kIGluIHdvcnN0IGNhc2UKLQkgICBldmVuIHRvIGEgZGVhZGxvY2sgaW4gdGhlIGNvbnRyb2xsZXIuCi0JICAgKE5vdGUgaG93ZXZlciB0aGF0IHRoZSBidXN5IGZpZWxkIGlzIHJlYWQtb25seSwgc28gbm8gbmVlZCB0byB3cml0ZSB0byBpdC4pICovCi0KLQkvKiBDaGVjayB0aGUgYnVzeSBiaXQgYmVmb3JlIHdyaXRpbmcgdG8gUl9VU0JfQ09NTUFORC4gKi8KLQotCXdoaWxlICgqUl9VU0JfQ09NTUFORCAmIElPX01BU0soUl9VU0JfQ09NTUFORCwgYnVzeSkpOwotCi0JLyogUmVzZXQgdGhlIFVTQiBpbnRlcmZhY2UuICovCi0JKlJfVVNCX0NPTU1BTkQgPQotCQlJT19TVEFURShSX1VTQl9DT01NQU5ELCBwb3J0X3NlbCwgbm9wKSB8Ci0JCUlPX1NUQVRFKFJfVVNCX0NPTU1BTkQsIHBvcnRfY21kLCByZXNldCkgfAotCQlJT19TVEFURShSX1VTQl9DT01NQU5ELCBjdHJsX2NtZCwgcmVzZXQpOwotCi0JLyogRGVzaWduZXIncyBSZWZlcmVuY2UsIHAuIDggLSAxMCBzYXlzIHdlIHNob3VsZCBJbml0YXRlIFJfVVNCX0ZNX1BTVEFSVCB0byAweDJBMzAgKDEwODAwKSwKLQkgICB0byBndWFyYW50ZWUgdGhhdCBjb250cm9sIHRyYWZmaWMgZ2V0cyAxMCUgb2YgdGhlIGJhbmR3aWR0aCwgYW5kIHBlcmlvZGljIHRyYW5zZmVyIG1heQotCSAgIGFsbG9jYXRlIHRoZSByZXN0ICg5MCUpLiBUaGlzIGRvZXNuJ3Qgd29yayB0aG91Z2guIFJlYWQgb24gZm9yIGEgbGVuZ2h0eSBleHBsYW5hdGlvbi4KLQotCSAgIFdoaWxlIHRoZXJlIGlzIGEgZGlmZmVyZW5jZSBiZXR3ZWVuIHJldi4gMiBhbmQgcmV2LiAzIG9mIHRoZSBFVFJBWCAxMDBMWCByZWdhcmRpbmcgdGhlIE5BSwotCSAgIGJlaGF2aW91ciwgaXQgZG9lc24ndCBzb2x2ZSB0aGlzIHByb2JsZW0uIFdoYXQgaGFwcGVucyBpcyB0aGF0IGEgY29udHJvbCB0cmFuc2ZlciB3aWxsIG5vdAotCSAgIGJlIGludGVycnVwdGVkIGluIGl0cyBkYXRhIHN0YWdlIHdoZW4gUFNUQVJUIGhhcHBlbnMgKHRoZSBwb2ludCBhdCB3aGljaCBwZXJpb2RpYyB0cmFmZmljCi0JICAgaXMgc3RhcnRlZCkuIFRodXMsIGlmIFBTVEFSVCBpcyBzZXQgdG8gMTA4MDAgYW5kIGl0cyBJTiBvciBPVVQgdG9rZW4gaXMgTkFLZWQgdW50aWwganVzdCBiZWZvcmUKLQkgICBQU1RBUlQgaGFwcGVucywgaXQgd2lsbCBjb250aW51ZSB0aGUgSU4vT1VUIHRyYW5zZmVyIGFzIGxvbmcgYXMgaXQncyBBQ0tlZC4gQWZ0ZXIgaXQncyBkb25lLAotCSAgIHRoZXJlIG1heSBiZSB0b28gbGl0dGxlIHRpbWUgbGVmdCBmb3IgYW4gaXNvY2hyb25vdXMgdHJhbnNmZXIsIGNhdXNpbmcgYW4gZXBpZCBhdHRlbnRpb24KLQkgICBpbnRlcnJ1cHQgZHVlIHRvIHBlcnJvci4gVGhlIHdvcmstYXJvdW5kIGZvciB0aGlzIGlzIHRvIGxldCB0aGUgY29udHJvbCB0cmFuc2ZlcnMgcnVuIGF0IHRoZQotCSAgIGVuZCBvZiB0aGUgZnJhbWUgaW5zdGVhZCBvZiBhdCB0aGUgYmVnaW5uaW5nLCBhbmQgd2lsbCBiZSBpbnRlcnJ1cHRlZCBqdXN0IGZpbmUgaWYgaXQgZG9lc24ndAotCSAgIGZpdCBpbnRvIHRoZSBmcmFtZS4gSG93ZXZlciwgc2luY2UgdGhlcmUgd2lsbCAqYWx3YXlzKiBiZSBhIGNvbnRyb2wgdHJhbnNmZXIgYXQgdGhlIGJlZ2lubmluZwotCSAgIG9mIHRoZSBmcmFtZSwgcmVnYXJkbGVzcyBvZiB3aGF0IHdlIHNldCBQU1RBUlQgdG8sIHRoYXQgdHJhbnNmZXIgbWlnaHQgYmUgYSA2NC1ieXRlIHRyYW5zZmVyCi0JICAgd2hpY2ggY29uc3VtZXMgdXAgdG8gMTUlIG9mIHRoZSBmcmFtZSwgbGVhdmluZyBvbmx5IDg1JSBmb3IgcGVyaW9kaWMgdHJhZmZpYy4gVGhlIHNvbHV0aW9uIHRvCi0JICAgdGhpcyB3b3VsZCBiZSB0byAnZHVtbXkgYWxsb2NhdGUnIDUlIG9mIHRoZSBmcmFtZSB3aXRoIHRoZSB1c2JfY2xhaW1fYmFuZHdpZHRoIGZ1bmN0aW9uIHRvIG1ha2UKLQkgICBzdXJlIHRoYXQgdGhlIHBlcmlvZGljIHRyYW5zZmVycyB0aGF0IGFyZSBpbnNlcnRlZCB3aWxsIGFsd2F5cyBmaXQgaW4gdGhlIGZyYW1lLgotCi0JICAgVGhlIGlkZWEgd2FzIHN1Z2dlc3RlZCB0aGF0IGEgY29udHJvbCB0cmFuc2ZlciBjb3VsZCBiZSBzcGxpdCB1cCBpbnRvIHNldmVyYWwgOCBieXRlIHRyYW5zZmVycywKLQkgICBzbyB0aGF0IGl0IHdvdWxkIGJlIGludGVycnVwdGVkIGJ5IFBTVEFSVCwgYnV0IHNpbmNlIHRoaXMgY2FuJ3QgYmUgZG9uZSBmb3IgYW4gSU4gdHJhbnNmZXIgdGhpcwotCSAgIGhhc24ndCBiZWVuIGltcGxlbWVudGVkLgotCi0JICAgVGhlIHZhbHVlIDExOTYwIGlzIGNob3NlbiB0byBiZSBqdXN0IGFmdGVyIHRoZSBTT0YgdG9rZW4sIHdpdGggYSBjb3VwbGUgb2YgYml0IHRpbWVzIGV4dHJhCi0JICAgZm9yIHBvc3NpYmxlIGJpdCBzdHVmZmluZy4gKi8KLQotCSpSX1VTQl9GTV9QU1RBUlQgPSBJT19GSUVMRChSX1VTQl9GTV9QU1RBUlQsIHZhbHVlLCAxMTk2MCk7Ci0KLSNpZmRlZiBDT05GSUdfRVRSQVhfVVNCX0hPU1RfUE9SVDEKLQkqUl9VU0JfUE9SVDFfRElTQUJMRSA9IElPX1NUQVRFKFJfVVNCX1BPUlQxX0RJU0FCTEUsIGRpc2FibGUsIG5vKTsKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX0VUUkFYX1VTQl9IT1NUX1BPUlQyCi0JKlJfVVNCX1BPUlQyX0RJU0FCTEUgPSBJT19TVEFURShSX1VTQl9QT1JUMl9ESVNBQkxFLCBkaXNhYmxlLCBubyk7Ci0jZW5kaWYKLQotCXdoaWxlICgqUl9VU0JfQ09NTUFORCAmIElPX01BU0soUl9VU0JfQ09NTUFORCwgYnVzeSkpOwotCi0JLyogQ29uZmlndXJlIHRoZSBVU0IgaW50ZXJmYWNlIGFzIGEgaG9zdCBjb250cm9sbGVyLiAqLwotCSpSX1VTQl9DT01NQU5EID0KLQkJSU9fU1RBVEUoUl9VU0JfQ09NTUFORCwgcG9ydF9zZWwsIG5vcCkgfAotCQlJT19TVEFURShSX1VTQl9DT01NQU5ELCBwb3J0X2NtZCwgcmVzZXQpIHwKLQkJSU9fU1RBVEUoUl9VU0JfQ09NTUFORCwgY3RybF9jbWQsIGhvc3RfY29uZmlnKTsKLQotCS8qIE5vdGU6IERvIG5vdCByZXNldCBhbnkgcG9ydHMgaGVyZS4gQXdhaXQgdGhlIHBvcnQgc3RhdHVzIGludGVycnVwdHMsIHRvIGhhdmUgYSBjb250cm9sbGVkCi0JICAgc2VxdWVuY2Ugb2YgcmVzZXR0aW5nIHRoZSBwb3J0cy4gSWYgd2UgcmVzZXQgYm90aCBwb3J0cyBub3csIGFuZCB0aGVyZSBhcmUgZGV2aWNlcwotCSAgIG9uIGJvdGggcG9ydHMsIHdlIHdpbGwgZ2V0IGEgYnVzIGVycm9yIGJlY2F1c2UgYm90aCBkZXZpY2VzIHdpbGwgYW5zd2VyIHRoZSBzZXQgYWRkcmVzcwotCSAgIHJlcXVlc3QuICovCi0KLQl3aGlsZSAoKlJfVVNCX0NPTU1BTkQgJiBJT19NQVNLKFJfVVNCX0NPTU1BTkQsIGJ1c3kpKTsKLQotCS8qIFN0YXJ0IHByb2Nlc3Npbmcgb2YgVVNCIHRyYWZmaWMuICovCi0JKlJfVVNCX0NPTU1BTkQgPQotCQlJT19TVEFURShSX1VTQl9DT01NQU5ELCBwb3J0X3NlbCwgbm9wKSB8Ci0JCUlPX1NUQVRFKFJfVVNCX0NPTU1BTkQsIHBvcnRfY21kLCByZXNldCkgfAotCQlJT19TVEFURShSX1VTQl9DT01NQU5ELCBjdHJsX2NtZCwgaG9zdF9ydW4pOwotCi0Jd2hpbGUgKCpSX1VTQl9DT01NQU5EICYgSU9fTUFTSyhSX1VTQl9DT01NQU5ELCBidXN5KSk7Ci0KLQl1c2JfcmggPSB1c2JfYWxsb2NfZGV2KE5VTEwsIGhjLT5idXMsIDApOwotCWhjLT5idXMtPnJvb3RfaHViID0gdXNiX3JoOwotICAgICAgICB1c2JfcmgtPnN0YXRlID0gVVNCX1NUQVRFX0FERFJFU1M7Ci0gICAgICAgIHVzYl9yaC0+c3BlZWQgPSBVU0JfU1BFRURfRlVMTDsKLSAgICAgICAgdXNiX3JoLT5kZXZudW0gPSAxOwotICAgICAgICBoYy0+YnVzLT5kZXZudW1fbmV4dCA9IDI7Ci0gICAgICAgIHVzYl9yaC0+ZXAwLmRlc2Mud01heFBhY2tldFNpemUgPSBfX2NvbnN0X2NwdV90b19sZTE2KDY0KTsKLSAgICAgICAgdXNiX2dldF9kZXZpY2VfZGVzY3JpcHRvcih1c2JfcmgsIFVTQl9EVF9ERVZJQ0VfU0laRSk7Ci0JdXNiX25ld19kZXZpY2UodXNiX3JoKTsKLQotCURCRkVYSVQ7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgZXRyYXhfdXNiX2hjX2NsZWFudXAodm9pZCkKLXsKLQlEQkZFTlRFUjsKLQotCWZyZWVfaXJxKEVUUkFYX1VTQl9IQ19JUlEsIE5VTEwpOwotCWZyZWVfaXJxKEVUUkFYX1VTQl9SWF9JUlEsIE5VTEwpOwotCWZyZWVfaXJxKEVUUkFYX1VTQl9UWF9JUlEsIE5VTEwpOwotCi0JdXNiX2RlcmVnaXN0ZXJfYnVzKGV0cmF4X3VzYl9idXMpOwotCi0JLyogRklYTUU6IGNhbGwga21lbV9jYWNoZV9kZXN0cm95IGhlcmU/ICovCi0KLQlEQkZFWElUOwotfQotCi1tb2R1bGVfaW5pdChldHJheF91c2JfaGNfaW5pdCk7Ci1tb2R1bGVfZXhpdChldHJheF91c2JfaGNfY2xlYW51cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L2hjX2NyaXN2MTAuaCBiL2RyaXZlcnMvdXNiL2hvc3QvaGNfY3Jpc3YxMC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmY3NzExLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvaGNfY3Jpc3YxMC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjg5ICswLDAgQEAKLSNpZm5kZWYgX19MSU5VWF9FVFJBWF9VU0JfSAotI2RlZmluZSBfX0xJTlVYX0VUUkFYX1VTQl9ICi0KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLQotdHlwZWRlZiBzdHJ1Y3QgVVNCX0lOX0Rlc2MgewotCXZvbGF0aWxlIF9fdTE2IHN3X2xlbjsKLQl2b2xhdGlsZSBfX3UxNiBjb21tYW5kOwotCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgbmV4dDsKLQl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIGJ1ZjsKLQl2b2xhdGlsZSBfX3UxNiBod19sZW47Ci0Jdm9sYXRpbGUgX191MTYgc3RhdHVzOwotfSBVU0JfSU5fRGVzY190OwotCi10eXBlZGVmIHN0cnVjdCBVU0JfU0JfRGVzYyB7Ci0Jdm9sYXRpbGUgX191MTYgc3dfbGVuOwotCXZvbGF0aWxlIF9fdTE2IGNvbW1hbmQ7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBuZXh0OwotCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgYnVmOwotCV9fdTMyIGR1bW15OwotfSBVU0JfU0JfRGVzY190OwotCi10eXBlZGVmIHN0cnVjdCBVU0JfRVBfRGVzYyB7Ci0Jdm9sYXRpbGUgX191MTYgaHdfbGVuOwotCXZvbGF0aWxlIF9fdTE2IGNvbW1hbmQ7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBzdWI7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBuZXh0OwotCV9fdTMyIGR1bW15OwotfSBVU0JfRVBfRGVzY190OwotCi1zdHJ1Y3QgdmlydF9yb290X2h1YiB7Ci0JaW50IGRldm51bTsKLQl2b2lkICp1cmI7Ci0Jdm9pZCAqaW50X2FkZHI7Ci0JaW50IHNlbmQ7Ci0JaW50IGludGVydmFsOwotCWludCBudW1wb3J0czsKLQlzdHJ1Y3QgdGltZXJfbGlzdCByaF9pbnRfdGltZXI7Ci0Jdm9sYXRpbGUgX191MTYgd1BvcnRDaGFuZ2VfMTsKLQl2b2xhdGlsZSBfX3UxNiB3UG9ydENoYW5nZV8yOwotCXZvbGF0aWxlIF9fdTE2IHByZXZfd1BvcnRTdGF0dXNfMTsKLQl2b2xhdGlsZSBfX3UxNiBwcmV2X3dQb3J0U3RhdHVzXzI7Ci19OwotCi1zdHJ1Y3QgZXRyYXhfdXNiX2ludHJfdHJhZmZpYyB7Ci0JaW50IHNsZWVwaW5nOwotCWludCBlcnJvcjsKLQlzdHJ1Y3Qgd2FpdF9xdWV1ZSAqd3E7Ci19OwotCi10eXBlZGVmIHN0cnVjdCBldHJheF91c2JfaGMgewotCXN0cnVjdCB1c2JfYnVzICpidXM7Ci0Jc3RydWN0IHZpcnRfcm9vdF9odWIgcmg7Ci0Jc3RydWN0IGV0cmF4X3VzYl9pbnRyX3RyYWZmaWMgaW50cjsKLX0gZXRyYXhfaGNfdDsKLQotdHlwZWRlZiBlbnVtIHsKLQlTVEFSVEVELAotCU5PVF9TVEFSVEVELAotCVVOTElOSywKLQlUUkFOU0ZFUl9ET05FLAotCVdBSVRJTkdfRk9SX0RFU0NSX0lOVFIKLX0gZXRyYXhfdXNiX3VyYl9zdGF0ZV90OwotCi0KLQotdHlwZWRlZiBzdHJ1Y3QgZXRyYXhfdXNiX3VyYl9wcml2IHsKLQkvKiBUaGUgZmlyc3Rfc2IgZmllbGQgaXMgdXNlZCBmb3IgZnJlZWluZyBhbGwgU0IgZGVzY3JpcHRvcnMgYmVsb25naW5nCi0JICAgdG8gYW4gdXJiLiBUaGUgY29ycmVzcG9uZGluZyBlcCBkZXNjcmlwdG9yJ3Mgc3ViIHBvaW50ZXIgY2Fubm90IGJlCi0JICAgdXNlZCBmb3IgdGhpcyBzaW5jZSB0aGUgRE1BIGFkdmFuY2VzIHRoZSBzdWIgcG9pbnRlciBhcyBpdCBwcm9jZXNzZXMKLQkgICB0aGUgc2IgbGlzdC4gKi8KLQlVU0JfU0JfRGVzY190ICpmaXJzdF9zYjsKLQkvKiBUaGUgbGFzdF9zYiBmaWVsZCByZWZlcmVzIHRvIHRoZSBsYXN0IFNCIGRlc2NyaXB0b3IgdGhhdCBiZWxvbmdzIHRvCi0JICAgdGhpcyB1cmIuIFRoaXMgaXMgaW1wb3J0YW50IHRvIGtub3cgc28gd2UgY2FuIGZyZWUgdGhlIFNCIGRlc2NyaXB0b3JzCi0JICAgdGhhdCByYW5nZXMgYmV0d2VlbiBmaXJzdF9zYiBhbmQgbGFzdF9zYi4gKi8KLQlVU0JfU0JfRGVzY190ICpsYXN0X3NiOwotCi0JLyogVGhlIHJ4X29mZnNldCBmaWVsZCBpcyB1c2VkIGluIGN0cmwgYW5kIGJ1bGsgdHJhZmZpYyB0byBrZWVwIHRyYWNrCi0JICAgb2YgdGhlIG9mZnNldCBpbiB0aGUgdXJiJ3MgdHJhbnNmZXJfYnVmZmVyIHdoZXJlIGluY29taW5nIGRhdGEgc2hvdWxkIGJlCi0JICAgY29waWVkIHRvLiAqLwotCV9fdTMyIHJ4X29mZnNldDsKLQotCS8qIENvdW50ZXIgdXNlZCBpbiBpc29jaHJvbm91cyB0cmFuc2ZlcnMgdG8ga2VlcCB0cmFjayBvZiB0aGUKLQkgICBudW1iZXIgb2YgcGFja2V0cyByZWNlaXZlZC90cmFuc21pdHRlZC4gICovCi0JX191MzIgaXNvY19wYWNrZXRfY291bnRlcjsKLQotCS8qIFRoaXMgZmllbGQgaXMgdXNlZCB0byBwYXNzIGluZm9ybWF0aW9uIGFib3V0IHRoZSB1cmIncyBjdXJyZW50IHN0YXRlIGJldHdlZW4KLQkgICB0aGUgdmFyaW91cyBpbnRlcnJ1cHQgaGFuZGxlcnMgKHRodXMgbWFya2VkIHZvbGF0aWxlKS4gKi8KLQl2b2xhdGlsZSBldHJheF91c2JfdXJiX3N0YXRlX3QgdXJiX3N0YXRlOwotCi0JLyogQ29ubmVjdGlvbiBiZXR3ZWVuIHRoZSBzdWJtaXR0ZWQgdXJiIGFuZCBFVFJBWCBlcGlkIG51bWJlciAqLwotCV9fdTggZXBpZDsKLQotCS8qIFRoZSByeF9kYXRhX2xpc3QgZmllbGQgaXMgdXNlZCBmb3IgcGVyaW9kaWMgdHJhZmZpYywgdG8gaG9sZAotCSAgIHJlY2VpdmVkIGRhdGEgZm9yIGxhdGVyIHByb2Nlc3NpbmcgaW4gdGhlIHRoZSBjb21wbGV0ZV91cmIgZnVuY3Rpb25zLAotCSAgIHdoZXJlIHRoZSBkYXRhIHVzIGNvcGllZCB0byB0aGUgdXJiJ3MgdHJhbnNmZXJfYnVmZmVyLiBCYXNpY2FsbHksIHdlCi0JICAgdXNlIHRoaXMgaW50ZXJtZWRpYXRlIHN0b3JhZ2UgYmVjYXVzZSB3ZSBkb24ndCBrbm93IHdoZW4gaXQncyBzYWZlIHRvCi0JICAgcmV1c2UgdGhlIHRyYW5zZmVyX2J1ZmZlciAoRklYTUU/KS4gKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkIHJ4X2RhdGFfbGlzdDsKLX0gZXRyYXhfdXJiX3ByaXZfdDsKLQotLyogVGhpcyBzdHJ1Y3QgaXMgZm9yIHBhc3NpbmcgZGF0YSBmcm9tIHRoZSB0b3AgaGFsZiB0byB0aGUgYm90dG9tIGhhbGYuICovCi10eXBlZGVmIHN0cnVjdCB1c2JfaW50ZXJydXB0X3JlZ2lzdGVycwotewotCWV0cmF4X2hjX3QgKmhjOwotCV9fdTMyIHJfdXNiX2VwaWRfYXR0bjsKLQlfX3U4IHJfdXNiX3N0YXR1czsKLQlfX3UxNiByX3VzYl9yaF9wb3J0X3N0YXR1c18xOwotCV9fdTE2IHJfdXNiX3JoX3BvcnRfc3RhdHVzXzI7Ci0JX191MzIgcl91c2JfaXJxX21hc2tfcmVhZDsKLQlfX3UzMiByX3VzYl9mbV9udW1iZXI7Ci0Jc3RydWN0IHdvcmtfc3RydWN0IHVzYl9iaDsKLX0gdXNiX2ludGVycnVwdF9yZWdpc3RlcnNfdDsKLQotLyogVGhpcyBzdHJ1Y3QgaXMgZm9yIHBhc3NpbmcgZGF0YSBmcm9tIHRoZSBpc29jIHRvcCBoYWxmIHRvIHRoZSBpc29jIGJvdHRvbSBoYWxmLiAqLwotdHlwZWRlZiBzdHJ1Y3QgdXNiX2lzb2NfY29tcGxldGVfZGF0YQotewotCXN0cnVjdCB1cmIgKnVyYjsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgdXNiX2JoOwotfSB1c2JfaXNvY19jb21wbGV0ZV9kYXRhX3Q7Ci0KLS8qIFRoaXMgc3RydWN0IGhvbGRzIGRhdGEgd2UgZ2V0IGZyb20gdGhlIHJ4IGRlc2NyaXB0b3JzIGZvciBETUEgY2hhbm5lbCA5Ci0gICBmb3IgcGVyaW9kaWMgdHJhZmZpYyAoaW50ciBhbmQgaXNvYykuICovCi10eXBlZGVmIHN0cnVjdCByeF9kYXRhCi17Ci0Jdm9pZCAqZGF0YTsKLQlpbnQgbGVuZ3RoOwotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLX0gcnhfZGF0YV90OwotCi10eXBlZGVmIHN0cnVjdCB1cmJfZW50cnkKLXsKLQlzdHJ1Y3QgdXJiICp1cmI7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotfSB1cmJfZW50cnlfdDsKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICBWaXJ0dWFsIFJvb3QgSFVCCi0gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKiBkZXN0aW5hdGlvbiBvZiByZXF1ZXN0ICovCi0jZGVmaW5lIFJIX0lOVEVSRkFDRSAgICAgICAgICAgICAgIDB4MDEKLSNkZWZpbmUgUkhfRU5EUE9JTlQgICAgICAgICAgICAgICAgMHgwMgotI2RlZmluZSBSSF9PVEhFUiAgICAgICAgICAgICAgICAgICAweDAzCi0KLSNkZWZpbmUgUkhfQ0xBU1MgICAgICAgICAgICAgICAgICAgMHgyMAotI2RlZmluZSBSSF9WRU5ET1IgICAgICAgICAgICAgICAgICAweDQwCi0KLS8qIFJlcXVlc3RzOiBiUmVxdWVzdCA8PCA4IHwgYm1SZXF1ZXN0VHlwZSAqLwotI2RlZmluZSBSSF9HRVRfU1RBVFVTICAgICAgICAgICAweDAwODAKLSNkZWZpbmUgUkhfQ0xFQVJfRkVBVFVSRSAgICAgICAgMHgwMTAwCi0jZGVmaW5lIFJIX1NFVF9GRUFUVVJFICAgICAgICAgIDB4MDMwMAotI2RlZmluZSBSSF9TRVRfQUREUkVTUwkJMHgwNTAwCi0jZGVmaW5lIFJIX0dFVF9ERVNDUklQVE9SCTB4MDY4MAotI2RlZmluZSBSSF9TRVRfREVTQ1JJUFRPUiAgICAgICAweDA3MDAKLSNkZWZpbmUgUkhfR0VUX0NPTkZJR1VSQVRJT04JMHgwODgwCi0jZGVmaW5lIFJIX1NFVF9DT05GSUdVUkFUSU9OCTB4MDkwMAotI2RlZmluZSBSSF9HRVRfU1RBVEUgICAgICAgICAgICAweDAyODAKLSNkZWZpbmUgUkhfR0VUX0lOVEVSRkFDRSAgICAgICAgMHgwQTgwCi0jZGVmaW5lIFJIX1NFVF9JTlRFUkZBQ0UgICAgICAgIDB4MEIwMAotI2RlZmluZSBSSF9TWU5DX0ZSQU1FICAgICAgICAgICAweDBDODAKLS8qIE91ciBWZW5kb3IgU3BlY2lmaWMgUmVxdWVzdCAqLwotI2RlZmluZSBSSF9TRVRfRVAgICAgICAgICAgICAgICAweDIwMDAKLQotCi0vKiBIdWIgcG9ydCBmZWF0dXJlcyAqLwotI2RlZmluZSBSSF9QT1JUX0NPTk5FQ1RJT04gICAgICAgICAweDAwCi0jZGVmaW5lIFJIX1BPUlRfRU5BQkxFICAgICAgICAgICAgIDB4MDEKLSNkZWZpbmUgUkhfUE9SVF9TVVNQRU5EICAgICAgICAgICAgMHgwMgotI2RlZmluZSBSSF9QT1JUX09WRVJfQ1VSUkVOVCAgICAgICAweDAzCi0jZGVmaW5lIFJIX1BPUlRfUkVTRVQgICAgICAgICAgICAgIDB4MDQKLSNkZWZpbmUgUkhfUE9SVF9QT1dFUiAgICAgICAgICAgICAgMHgwOAotI2RlZmluZSBSSF9QT1JUX0xPV19TUEVFRCAgICAgICAgICAweDA5Ci0jZGVmaW5lIFJIX0NfUE9SVF9DT05ORUNUSU9OICAgICAgIDB4MTAKLSNkZWZpbmUgUkhfQ19QT1JUX0VOQUJMRSAgICAgICAgICAgMHgxMQotI2RlZmluZSBSSF9DX1BPUlRfU1VTUEVORCAgICAgICAgICAweDEyCi0jZGVmaW5lIFJIX0NfUE9SVF9PVkVSX0NVUlJFTlQgICAgIDB4MTMKLSNkZWZpbmUgUkhfQ19QT1JUX1JFU0VUICAgICAgICAgICAgMHgxNAotCi0vKiBIdWIgZmVhdHVyZXMgKi8KLSNkZWZpbmUgUkhfQ19IVUJfTE9DQUxfUE9XRVIgICAgICAgMHgwMAotI2RlZmluZSBSSF9DX0hVQl9PVkVSX0NVUlJFTlQgICAgICAweDAxCi0KLSNkZWZpbmUgUkhfREVWSUNFX1JFTU9URV9XQUtFVVAgICAgMHgwMAotI2RlZmluZSBSSF9FTkRQT0lOVF9TVEFMTCAgICAgICAgICAweDAxCi0KLS8qIE91ciBWZW5kb3IgU3BlY2lmaWMgZmVhdHVyZSAqLwotI2RlZmluZSBSSF9SRU1PVkVfRVAgICAgICAgICAgICAgICAweDAwCi0KLQotI2RlZmluZSBSSF9BQ0sgICAgICAgICAgICAgICAgICAgICAweDAxCi0jZGVmaW5lIFJIX1JFUV9FUlIgICAgICAgICAgICAgICAgIC0xCi0jZGVmaW5lIFJIX05BQ0sgICAgICAgICAgICAgICAgICAgIDB4MDAKLQotLyogRmllbGQgZGVmaW5pdGlvbnMgZm9yICovCi0KLSNkZWZpbmUgVVNCX0lOX2NvbW1hbmRfX2VvbF9fQklUTlIgICAgICAwIC8qIGNvbW1hbmQgbWFjcm9zICovCi0jZGVmaW5lIFVTQl9JTl9jb21tYW5kX19lb2xfX1dJRFRIICAgICAgMQotI2RlZmluZSBVU0JfSU5fY29tbWFuZF9fZW9sX19ubyAgICAgICAgIDAKLSNkZWZpbmUgVVNCX0lOX2NvbW1hbmRfX2VvbF9feWVzICAgICAgICAxCi0KLSNkZWZpbmUgVVNCX0lOX2NvbW1hbmRfX2ludHJfX0JJVE5SICAgICAzCi0jZGVmaW5lIFVTQl9JTl9jb21tYW5kX19pbnRyX19XSURUSCAgICAgMQotI2RlZmluZSBVU0JfSU5fY29tbWFuZF9faW50cl9fbm8gICAgICAgIDAKLSNkZWZpbmUgVVNCX0lOX2NvbW1hbmRfX2ludHJfX3llcyAgICAgICAxCi0KLSNkZWZpbmUgVVNCX0lOX3N0YXR1c19fZW9wX19CSVROUiAgICAgICAxIC8qIHN0YXR1cyBtYWNyb3MuICovCi0jZGVmaW5lIFVTQl9JTl9zdGF0dXNfX2VvcF9fV0lEVEggICAgICAgMQotI2RlZmluZSBVU0JfSU5fc3RhdHVzX19lb3BfX25vICAgICAgICAgIDAKLSNkZWZpbmUgVVNCX0lOX3N0YXR1c19fZW9wX195ZXMgICAgICAgICAxCi0KLSNkZWZpbmUgVVNCX0lOX3N0YXR1c19fZW90X19CSVROUiAgICAgICA1Ci0jZGVmaW5lIFVTQl9JTl9zdGF0dXNfX2VvdF9fV0lEVEggICAgICAgMQotI2RlZmluZSBVU0JfSU5fc3RhdHVzX19lb3RfX25vICAgICAgICAgIDAKLSNkZWZpbmUgVVNCX0lOX3N0YXR1c19fZW90X195ZXMgICAgICAgICAxCi0KLSNkZWZpbmUgVVNCX0lOX3N0YXR1c19fZXJyb3JfX0JJVE5SICAgICA2Ci0jZGVmaW5lIFVTQl9JTl9zdGF0dXNfX2Vycm9yX19XSURUSCAgICAgMQotI2RlZmluZSBVU0JfSU5fc3RhdHVzX19lcnJvcl9fbm8gICAgICAgIDAKLSNkZWZpbmUgVVNCX0lOX3N0YXR1c19fZXJyb3JfX3llcyAgICAgICAxCi0KLSNkZWZpbmUgVVNCX0lOX3N0YXR1c19fbm9kYXRhX19CSVROUiAgICA3Ci0jZGVmaW5lIFVTQl9JTl9zdGF0dXNfX25vZGF0YV9fV0lEVEggICAgMQotI2RlZmluZSBVU0JfSU5fc3RhdHVzX19ub2RhdGFfX25vICAgICAgIDAKLSNkZWZpbmUgVVNCX0lOX3N0YXR1c19fbm9kYXRhX195ZXMgICAgICAxCi0KLSNkZWZpbmUgVVNCX0lOX3N0YXR1c19fZXBpZF9fQklUTlIgICAgICA4Ci0jZGVmaW5lIFVTQl9JTl9zdGF0dXNfX2VwaWRfX1dJRFRIICAgICAgNQotCi0jZGVmaW5lIFVTQl9FUF9jb21tYW5kX19lb2xfX0JJVE5SICAgICAgMAotI2RlZmluZSBVU0JfRVBfY29tbWFuZF9fZW9sX19XSURUSCAgICAgIDEKLSNkZWZpbmUgVVNCX0VQX2NvbW1hbmRfX2VvbF9fbm8gICAgICAgICAwCi0jZGVmaW5lIFVTQl9FUF9jb21tYW5kX19lb2xfX3llcyAgICAgICAgMQotCi0jZGVmaW5lIFVTQl9FUF9jb21tYW5kX19lb2ZfX0JJVE5SICAgICAgMQotI2RlZmluZSBVU0JfRVBfY29tbWFuZF9fZW9mX19XSURUSCAgICAgIDEKLSNkZWZpbmUgVVNCX0VQX2NvbW1hbmRfX2VvZl9fbm8gICAgICAgICAwCi0jZGVmaW5lIFVTQl9FUF9jb21tYW5kX19lb2ZfX3llcyAgICAgICAgMQotCi0jZGVmaW5lIFVTQl9FUF9jb21tYW5kX19pbnRyX19CSVROUiAgICAgMwotI2RlZmluZSBVU0JfRVBfY29tbWFuZF9faW50cl9fV0lEVEggICAgIDEKLSNkZWZpbmUgVVNCX0VQX2NvbW1hbmRfX2ludHJfX25vICAgICAgICAwCi0jZGVmaW5lIFVTQl9FUF9jb21tYW5kX19pbnRyX195ZXMgICAgICAgMQotCi0jZGVmaW5lIFVTQl9FUF9jb21tYW5kX19lbmFibGVfX0JJVE5SICAgNAotI2RlZmluZSBVU0JfRVBfY29tbWFuZF9fZW5hYmxlX19XSURUSCAgIDEKLSNkZWZpbmUgVVNCX0VQX2NvbW1hbmRfX2VuYWJsZV9fbm8gICAgICAwCi0jZGVmaW5lIFVTQl9FUF9jb21tYW5kX19lbmFibGVfX3llcyAgICAgMQotCi0jZGVmaW5lIFVTQl9FUF9jb21tYW5kX19od192YWxpZF9fQklUTlIgNQotI2RlZmluZSBVU0JfRVBfY29tbWFuZF9faHdfdmFsaWRfX1dJRFRIIDEKLSNkZWZpbmUgVVNCX0VQX2NvbW1hbmRfX2h3X3ZhbGlkX19ubyAgICAwCi0jZGVmaW5lIFVTQl9FUF9jb21tYW5kX19od192YWxpZF9feWVzICAgMQotCi0jZGVmaW5lIFVTQl9FUF9jb21tYW5kX19lcGlkX19CSVROUiAgICAgOAotI2RlZmluZSBVU0JfRVBfY29tbWFuZF9fZXBpZF9fV0lEVEggICAgIDUKLQotI2RlZmluZSBVU0JfU0JfY29tbWFuZF9fZW9sX19CSVROUiAgICAgIDAgLyogY29tbWFuZCBtYWNyb3MuICovCi0jZGVmaW5lIFVTQl9TQl9jb21tYW5kX19lb2xfX1dJRFRIICAgICAgMQotI2RlZmluZSBVU0JfU0JfY29tbWFuZF9fZW9sX19ubyAgICAgICAgIDAKLSNkZWZpbmUgVVNCX1NCX2NvbW1hbmRfX2VvbF9feWVzICAgICAgICAxCi0KLSNkZWZpbmUgVVNCX1NCX2NvbW1hbmRfX2VvdF9fQklUTlIgICAgICAxCi0jZGVmaW5lIFVTQl9TQl9jb21tYW5kX19lb3RfX1dJRFRIICAgICAgMQotI2RlZmluZSBVU0JfU0JfY29tbWFuZF9fZW90X19ubyAgICAgICAgIDAKLSNkZWZpbmUgVVNCX1NCX2NvbW1hbmRfX2VvdF9feWVzICAgICAgICAxCi0KLSNkZWZpbmUgVVNCX1NCX2NvbW1hbmRfX2ludHJfX0JJVE5SICAgICAzCi0jZGVmaW5lIFVTQl9TQl9jb21tYW5kX19pbnRyX19XSURUSCAgICAgMQotI2RlZmluZSBVU0JfU0JfY29tbWFuZF9faW50cl9fbm8gICAgICAgIDAKLSNkZWZpbmUgVVNCX1NCX2NvbW1hbmRfX2ludHJfX3llcyAgICAgICAxCi0KLSNkZWZpbmUgVVNCX1NCX2NvbW1hbmRfX3R0X19CSVROUiAgICAgICA0Ci0jZGVmaW5lIFVTQl9TQl9jb21tYW5kX190dF9fV0lEVEggICAgICAgMgotI2RlZmluZSBVU0JfU0JfY29tbWFuZF9fdHRfX3pvdXQgICAgICAgIDAKLSNkZWZpbmUgVVNCX1NCX2NvbW1hbmRfX3R0X19pbiAgICAgICAgICAxCi0jZGVmaW5lIFVTQl9TQl9jb21tYW5kX190dF9fb3V0ICAgICAgICAgMgotI2RlZmluZSBVU0JfU0JfY29tbWFuZF9fdHRfX3NldHVwICAgICAgIDMKLQotCi0jZGVmaW5lIFVTQl9TQl9jb21tYW5kX19yZW1fX0JJVE5SICAgICAgOAotI2RlZmluZSBVU0JfU0JfY29tbWFuZF9fcmVtX19XSURUSCAgICAgIDYKLQotI2RlZmluZSBVU0JfU0JfY29tbWFuZF9fZnVsbF9fQklUTlIgICAgIDYKLSNkZWZpbmUgVVNCX1NCX2NvbW1hbmRfX2Z1bGxfX1dJRFRIICAgICAxCi0jZGVmaW5lIFVTQl9TQl9jb21tYW5kX19mdWxsX19ubyAgICAgICAgMAotI2RlZmluZSBVU0JfU0JfY29tbWFuZF9fZnVsbF9feWVzICAgICAgIDEKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktaGNkLmMgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktaGNkLmMKaW5kZXggZjBkMjllZC4uZThiYmU4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLWhjZC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1oY2QuYwpAQCAtNDg2LDkgKzQ4Niw2IEBACiAJICogb3IgaWYgYnVzIGdsdWUgZGlkIHRoZSBzYW1lIChlLmcuIGZvciBQQ0kgYWRkLWluIGNhcmRzIHdpdGgKIAkgKiBQQ0kgUE0gc3VwcG9ydCkuCiAJICovCi0Jb2hjaV9kYmcgKG9oY2ksICJyZXNldHRpbmcgZnJvbSBzdGF0ZSAnJXMnLCBjb250cm9sID0gMHgleFxuIiwKLQkJCWhjZnMyc3RyaW5nIChvaGNpLT5oY19jb250cm9sICYgT0hDSV9DVFJMX0hDRlMpLAotCQkJb2hjaV9yZWFkbCAob2hjaSwgJm9oY2ktPnJlZ3MtPmNvbnRyb2wpKTsKIAlpZiAoKG9oY2ktPmhjX2NvbnRyb2wgJiBPSENJX0NUUkxfUldDKSAhPSAwCiAJCQkmJiAhZGV2aWNlX21heV93YWtldXAoaGNkLT5zZWxmLmNvbnRyb2xsZXIpKQogCQlkZXZpY2VfaW5pdF93YWtldXAoaGNkLT5zZWxmLmNvbnRyb2xsZXIsIDEpOwpAQCAtNzQ0LDkgKzc0MSw2IEBACiB7CiAJc3RydWN0IG9oY2lfaGNkCQkqb2hjaSA9IGhjZF90b19vaGNpIChoY2QpOwogCi0Jb2hjaV9kYmcgKG9oY2ksICJzdG9wICVzIGNvbnRyb2xsZXIgKHN0YXRlIDB4JTAyeClcbiIsCi0JCWhjZnMyc3RyaW5nIChvaGNpLT5oY19jb250cm9sICYgT0hDSV9DVFJMX0hDRlMpLAotCQloY2QtPnN0YXRlKTsKIAlvaGNpX2R1bXAgKG9oY2ksIDEpOwogCiAJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1wY2kuYyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1wY2kuYwppbmRleCBiMzMxYWM0Li43OTcwNTYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktcGNpLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLXBjaS5jCkBAIC0yMCwxMCArMjAsMTYgQEAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAorc3RhdGljIGludCBicm9rZW5fc3VzcGVuZChzdHJ1Y3QgdXNiX2hjZCAqaGNkKQoreworCWRldmljZV9pbml0X3dha2V1cCgmaGNkLT5zZWxmLnJvb3RfaHViLT5kZXYsIDApOworCXJldHVybiAwOworfQorCiAvKiBBTUQgNzU2LCBmb3IgbW9zdCBjaGlwcyAoZWFybHkgcmV2cyksIGNvcnJ1cHRzIHJlZ2lzdGVyCiAgKiB2YWx1ZXMgb24gcmVhZCAuLi4gc28gZW5hYmxlIHRoZSB2ZW5kb3Igd29ya2Fyb3VuZC4KICAqLwotc3RhdGljIGludCBfX2RldmluaXQgb2hjaV9xdWlya19hbWQ3NTYoc3RydWN0IHVzYl9oY2QgKmhjZCkKK3N0YXRpYyBpbnQgb2hjaV9xdWlya19hbWQ3NTYoc3RydWN0IHVzYl9oY2QgKmhjZCkKIHsKIAlzdHJ1Y3Qgb2hjaV9oY2QJKm9oY2kgPSBoY2RfdG9fb2hjaSAoaGNkKTsKIApAQCAtMzEsMTYgKzM3LDE0IEBACiAJb2hjaV9kYmcgKG9oY2ksICJBTUQ3NTYgZXJyYXR1bSA0IHdvcmthcm91bmRcbiIpOwogCiAJLyogYWxzbyBlcnJhdHVtIDEwIChzdXNwZW5kL3Jlc3VtZSBpc3N1ZXMpICovCi0JZGV2aWNlX2luaXRfd2FrZXVwKCZoY2QtPnNlbGYucm9vdF9odWItPmRldiwgMCk7Ci0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gYnJva2VuX3N1c3BlbmQoaGNkKTsKIH0KIAogLyogQXBwbGUncyBPSENJIGRyaXZlciBoYXMgYSBsb3Qgb2YgYml6YXJyZSB3b3JrYXJvdW5kcwogICogZm9yIHRoaXMgY2hpcC4gIEV2aWRlbnRseSBjb250cm9sIGFuZCBidWxrIGxpc3RzCiAgKiBjYW4gZ2V0IGNvbmZ1c2VkLiAgKEImVyBHMyBtb2RlbHMsIGFuZCAuLi4pCiAgKi8KLXN0YXRpYyBpbnQgX19kZXZpbml0IG9oY2lfcXVpcmtfb3B0aShzdHJ1Y3QgdXNiX2hjZCAqaGNkKQorc3RhdGljIGludCBvaGNpX3F1aXJrX29wdGkoc3RydWN0IHVzYl9oY2QgKmhjZCkKIHsKIAlzdHJ1Y3Qgb2hjaV9oY2QJKm9oY2kgPSBoY2RfdG9fb2hjaSAoaGNkKTsKIApAQCAtNTMsNyArNTcsNyBAQAogICogaWRlbnRpZnkgdGhlIFVTQiAoZm4yKS4gVGhpcyBxdWlyayBtaWdodCBhcHBseSB0byBtb3JlIG9yCiAgKiBldmVuIGFsbCBOU0Mgc3R1ZmYuCiAgKi8KLXN0YXRpYyBpbnQgX19kZXZpbml0IG9oY2lfcXVpcmtfbnMoc3RydWN0IHVzYl9oY2QgKmhjZCkKK3N0YXRpYyBpbnQgb2hjaV9xdWlya19ucyhzdHJ1Y3QgdXNiX2hjZCAqaGNkKQogewogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihoY2QtPnNlbGYuY29udHJvbGxlcik7CiAJc3RydWN0IHBjaV9kZXYJKmI7CkBAIC03NSw3ICs3OSw3IEBACiAgKiBkZWxheXMgYmVmb3JlIGNvbnRyb2wgb3IgYnVsayBxdWV1ZXMgZ2V0IHJlLWFjdGl2YXRlZAogICogaW4gZmluaXNoX3VubGlua3MoKQogICovCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBvaGNpX3F1aXJrX3pmbWljcm8oc3RydWN0IHVzYl9oY2QgKmhjZCkKK3N0YXRpYyBpbnQgb2hjaV9xdWlya196Zm1pY3JvKHN0cnVjdCB1c2JfaGNkICpoY2QpCiB7CiAJc3RydWN0IG9oY2lfaGNkCSpvaGNpID0gaGNkX3RvX29oY2kgKGhjZCk7CiAKQEAgLTg4LDcgKzkyLDcgQEAKIC8qIENoZWNrIGZvciBUb3NoaWJhIFNDQyBPSENJIHdoaWNoIGhhcyBiaWcgZW5kaWFuIHJlZ2lzdGVycwogICogYW5kIGxpdHRsZSBlbmRpYW4gaW4gbWVtb3J5IGRhdGEgc3RydWN0dXJlcwogICovCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBvaGNpX3F1aXJrX3Rvc2hpYmFfc2NjKHN0cnVjdCB1c2JfaGNkICpoY2QpCitzdGF0aWMgaW50IG9oY2lfcXVpcmtfdG9zaGliYV9zY2Moc3RydWN0IHVzYl9oY2QgKmhjZCkKIHsKIAlzdHJ1Y3Qgb2hjaV9oY2QJKm9oY2kgPSBoY2RfdG9fb2hjaSAoaGNkKTsKIApAQCAtMTI5LDYgKzEzMywxOCBAQAogCQlQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfVE9TSElCQV8yLCAweDAxYjYpLAogCQkuZHJpdmVyX2RhdGEgPSAodW5zaWduZWQgbG9uZylvaGNpX3F1aXJrX3Rvc2hpYmFfc2NjLAogCX0sCisJeworCQkvKiBUb3NoaWJhIHBvcnRlZ2UgNDAwMCAqLworCQkudmVuZG9yCQk9IFBDSV9WRU5ET1JfSURfQUwsCisJCS5kZXZpY2UJCT0gMHg1MjM3LAorCQkuc3VidmVuZG9yCT0gUENJX1ZFTkRPUl9JRF9UT1NISUJBXzIsCisJCS5zdWJkZXZpY2UJPSAweDAwMDQsCisJCS5kcml2ZXJfZGF0YQk9ICh1bnNpZ25lZCBsb25nKSBicm9rZW5fc3VzcGVuZCwKKwl9LAorCXsKKwkJUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lURSwgMHg4MTUyKSwKKwkJLmRyaXZlcl9kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGJyb2tlbl9zdXNwZW5kLAorCX0sCiAJLyogRklYTUUgZm9yIHNvbWUgb2YgdGhlIGVhcmx5IEFNRCA3NjAgc291dGhicmlkZ2VzLCBPSENJCiAJICogd29uJ3Qgd29yayBhdCBhbGwuICBibGFja2xpc3QgdGhlbS4KIAkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvdWhjaS1xLmMgYi9kcml2ZXJzL3VzYi9ob3N0L3VoY2ktcS5jCmluZGV4IDE5YTBjYzAuLjRhZWQzMDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvdWhjaS1xLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC91aGNpLXEuYwpAQCAtMTIzLDEwICsxMjMsMTQgQEAKIAogc3RhdGljIHZvaWQgdWhjaV9mcmVlX3RkKHN0cnVjdCB1aGNpX2hjZCAqdWhjaSwgc3RydWN0IHVoY2lfdGQgKnRkKQogewotCWlmICghbGlzdF9lbXB0eSgmdGQtPmxpc3QpKQorCWlmICghbGlzdF9lbXB0eSgmdGQtPmxpc3QpKSB7CiAJCWRldl93YXJuKHVoY2lfZGV2KHVoY2kpLCAidGQgJXAgc3RpbGwgaW4gbGlzdCFcbiIsIHRkKTsKLQlpZiAoIWxpc3RfZW1wdHkoJnRkLT5mbF9saXN0KSkKKwkJV0FSTl9PTigxKTsKKwl9CisJaWYgKCFsaXN0X2VtcHR5KCZ0ZC0+ZmxfbGlzdCkpIHsKIAkJZGV2X3dhcm4odWhjaV9kZXYodWhjaSksICJ0ZCAlcCBzdGlsbCBpbiBmbF9saXN0IVxuIiwgdGQpOworCQlXQVJOX09OKDEpOworCX0KIAogCWRtYV9wb29sX2ZyZWUodWhjaS0+dGRfcG9vbCwgdGQsIHRkLT5kbWFfaGFuZGxlKTsKIH0KQEAgLTI5MSw4ICsyOTUsMTAgQEAKIHN0YXRpYyB2b2lkIHVoY2lfZnJlZV9xaChzdHJ1Y3QgdWhjaV9oY2QgKnVoY2ksIHN0cnVjdCB1aGNpX3FoICpxaCkKIHsKIAlXQVJOX09OKHFoLT5zdGF0ZSAhPSBRSF9TVEFURV9JRExFICYmIHFoLT51ZGV2KTsKLQlpZiAoIWxpc3RfZW1wdHkoJnFoLT5xdWV1ZSkpCisJaWYgKCFsaXN0X2VtcHR5KCZxaC0+cXVldWUpKSB7CiAJCWRldl93YXJuKHVoY2lfZGV2KHVoY2kpLCAicWggJXAgbGlzdCBub3QgZW1wdHkhXG4iLCBxaCk7CisJCVdBUk5fT04oMSk7CisJfQogCiAJbGlzdF9kZWwoJnFoLT5ub2RlKTsKIAlpZiAocWgtPnVkZXYpIHsKQEAgLTc0MCw5ICs3NDYsMTEgQEAKIHsKIAlzdHJ1Y3QgdWhjaV90ZCAqdGQsICp0bXA7CiAKLQlpZiAoIWxpc3RfZW1wdHkoJnVyYnAtPm5vZGUpKQorCWlmICghbGlzdF9lbXB0eSgmdXJicC0+bm9kZSkpIHsKIAkJZGV2X3dhcm4odWhjaV9kZXYodWhjaSksICJ1cmIgJXAgc3RpbGwgb24gUUgncyBsaXN0IVxuIiwKIAkJCQl1cmJwLT51cmIpOworCQlXQVJOX09OKDEpOworCX0KIAogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh0ZCwgdG1wLCAmdXJicC0+dGRfbGlzdCwgbGlzdCkgewogCQl1aGNpX3JlbW92ZV90ZF9mcm9tX3VyYnAodGQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaW5wdXQvS2NvbmZpZyBiL2RyaXZlcnMvdXNiL2lucHV0L0tjb25maWcKaW5kZXggNjlhOWYzYi4uYTc5MmU0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaW5wdXQvS2NvbmZpZworKysgYi9kcml2ZXJzL3VzYi9pbnB1dC9LY29uZmlnCkBAIC00LDE1MSArNCw2IEBACiBjb21tZW50ICJVU0IgSW5wdXQgRGV2aWNlcyIKIAlkZXBlbmRzIG9uIFVTQgogCi1jb25maWcgVVNCX0hJRAotCXRyaXN0YXRlICJVU0IgSHVtYW4gSW50ZXJmYWNlIERldmljZSAoZnVsbCBISUQpIHN1cHBvcnQiCi0JZGVmYXVsdCB5Ci0JZGVwZW5kcyBvbiBVU0IgJiYgSU5QVVQKLQlzZWxlY3QgSElECi0JLS0taGVscC0tLQotCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCBmdWxsIEhJRCBzdXBwb3J0IHRvIGNvbm5lY3QgVVNCIGtleWJvYXJkcywKLQkgIG1pY2UsIGpveXN0aWNrcywgZ3JhcGhpYyB0YWJsZXRzLCBvciBhbnkgb3RoZXIgSElEIGJhc2VkIGRldmljZXMKLQkgIHRvIHlvdXIgY29tcHV0ZXIgdmlhIFVTQiwgYXMgd2VsbCBhcyBVbmludGVycnVwdGlibGUgUG93ZXIgU3VwcGx5Ci0JICAoVVBTKSBhbmQgbW9uaXRvciBjb250cm9sIGRldmljZXMuCi0KLQkgIFlvdSBjYW4ndCB1c2UgdGhpcyBkcml2ZXIgYW5kIHRoZSBISURCUCAoQm9vdCBQcm90b2NvbCkga2V5Ym9hcmQKLQkgIGFuZCBtb3VzZSBkcml2ZXJzIGF0IHRoZSBzYW1lIHRpbWUuIE1vcmUgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlOgotCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9pbnB1dC9pbnB1dC50eHQ+LgotCi0JICBJZiB1bnN1cmUsIHNheSBZLgotCi0JICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKLQkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB1c2JoaWQuCi0KLWNvbW1lbnQgIklucHV0IGNvcmUgc3VwcG9ydCBpcyBuZWVkZWQgZm9yIFVTQiBISUQgaW5wdXQgbGF5ZXIgb3IgSElEQlAgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIFVTQl9ISUQgJiYgSU5QVVQ9bgotCi1jb25maWcgVVNCX0hJRElOUFVUX1BPV0VSQk9PSwotCWJvb2wgIkVuYWJsZSBzdXBwb3J0IGZvciBpQm9vay9Qb3dlckJvb2sgc3BlY2lhbCBrZXlzIgotCWRlZmF1bHQgbgotCWRlcGVuZHMgb24gVVNCX0hJRAotCWhlbHAKLQkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgc3VwcG9ydCBmb3IgdGhlIHNwZWNpYWwga2V5cyAoRm4sIE51bWxvY2spIG9uCi0JICBBcHBsZSBpQm9va3MgYW5kIFBvd2VyQm9va3MuCi0KLQkgIElmIHVuc3VyZSwgc2F5IE4uCi0KLWNvbmZpZyBISURfRkYKLQlib29sICJGb3JjZSBmZWVkYmFjayBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gVVNCX0hJRCAmJiBFWFBFUklNRU5UQUwKLQloZWxwCi0JICBTYXkgWSBoZXJlIGlzIHlvdSB3YW50IGZvcmNlIGZlZWRiYWNrIHN1cHBvcnQgZm9yIGEgZmV3IEhJRCBkZXZpY2VzLgotCSAgU2VlIGJlbG93IGZvciBhIGxpc3Qgb2Ygc3VwcG9ydGVkIGRldmljZXMuCi0KLQkgIFNlZSA8ZmlsZTpEb2N1bWVudGF0aW9uL2lucHV0L2ZmLnR4dD4gZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIGZvcmNlCi0JICBmZWVkYmFjayBBUEkuCi0KLQkgIElmIHVuc3VyZSwgc2F5IE4uCi0KLWNvbmZpZyBISURfUElECi0JYm9vbCAiUElEIGRldmljZSBzdXBwb3J0IgotCWRlcGVuZHMgb24gSElEX0ZGCi0JaGVscAotCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhIFBJRC1jb21wbGlhbnQgZGV2aWNlIGFuZCB3aXNoIHRvIGVuYWJsZSBmb3JjZQotCSAgZmVlZGJhY2sgZm9yIGl0LiBNaWNyb3NvZnQgU2lkZXdpbmRlciBGb3JjZSBGZWVkYmFjayAyIGlzIG9uZSBvZiBzdWNoCi0JICBkZXZpY2VzLgotCi1jb25maWcgTE9HSVRFQ0hfRkYKLQlib29sICJMb2dpdGVjaCBkZXZpY2VzIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBISURfRkYKLQlzZWxlY3QgSU5QVVRfRkZfTUVNTEVTUyBpZiBVU0JfSElECi0JaGVscAotCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBvbmUgb2YgdGhlc2UgZGV2aWNlczoKLQkgIC0gTG9naXRlY2ggV2luZ01hbiBDb3JkbGVzcyBSdW1ibGVQYWQKLQkgIC0gTG9naXRlY2ggV2luZ01hbiBDb3JkbGVzcyBSdW1ibGVQYWQgMgotCSAgLSBMb2dpdGVjaCBXaW5nTWFuIEZvcmNlIDNECi0JICAtIExvZ2l0ZWNoIEZvcm11bGEgRm9yY2UgRVgKLQkgIC0gTG9naXRlY2ggTU9NTyBGb3JjZSB3aGVlbAotCi0JICBhbmQgaWYgeW91IHdhbnQgdG8gZW5hYmxlIGZvcmNlIGZlZWRiYWNrIGZvciB0aGVtLgotCSAgTm90ZTogaWYgeW91IHNheSBOIGhlcmUsIHRoaXMgZGV2aWNlIHdpbGwgc3RpbGwgYmUgc3VwcG9ydGVkLCBidXQgd2l0aG91dAotCSAgZm9yY2UgZmVlZGJhY2suCi0KLWNvbmZpZyBQQU5USEVSTE9SRF9GRgotCWJvb2wgIlBhbnRoZXJMb3JkIFVTQi9QUzIgMmluMSBBZGFwdGVyIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBISURfRkYKLQlzZWxlY3QgSU5QVVRfRkZfTUVNTEVTUyBpZiBVU0JfSElECi0JaGVscAotCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhIFBhbnRoZXJMb3JkIFVTQi9QUzIgMmluMSBBZGFwdGVyIGFuZCB3YW50Ci0JICB0byBlbmFibGUgZm9yY2UgZmVlZGJhY2sgc3VwcG9ydCBmb3IgaXQuCi0KLWNvbmZpZyBUSFJVU1RNQVNURVJfRkYKLQlib29sICJUaHJ1c3RNYXN0ZXIgRmlyZVN0b3JtIER1YWwgUG93ZXIgMiBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gSElEX0ZGICYmIEVYUEVSSU1FTlRBTAotCXNlbGVjdCBJTlBVVF9GRl9NRU1MRVNTIGlmIFVTQl9ISUQKLQloZWxwCi0JICBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIGEgVEhSVVNUTUFTVEVSIEZpcmVTdG9yZSBEdWFsIFBvd2VyIDIsCi0JICBhbmQgd2FudCB0byBlbmFibGUgZm9yY2UgZmVlZGJhY2sgc3VwcG9ydCBmb3IgaXQuCi0JICBOb3RlOiBpZiB5b3Ugc2F5IE4gaGVyZSwgdGhpcyBkZXZpY2Ugd2lsbCBzdGlsbCBiZSBzdXBwb3J0ZWQsIGJ1dCB3aXRob3V0Ci0JICBmb3JjZSBmZWVkYmFjay4KLQotY29uZmlnIFpFUk9QTFVTX0ZGCi0JYm9vbCAiWmVyb3BsdXMgYmFzZWQgZ2FtZSBjb250cm9sbGVyIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBISURfRkYKLQlzZWxlY3QgSU5QVVRfRkZfTUVNTEVTUyBpZiBVU0JfSElECi0JaGVscAotCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhIFplcm9wbHVzIGJhc2VkIGdhbWUgY29udHJvbGxlciBhbmQgd2FudCB0bwotCSAgZW5hYmxlIGZvcmNlIGZlZWRiYWNrIGZvciBpdC4KLQotY29uZmlnIFVTQl9ISURERVYKLQlib29sICIvZGV2L2hpZGRldiByYXcgSElEIGRldmljZSBzdXBwb3J0IgotCWRlcGVuZHMgb24gVVNCX0hJRAotCWhlbHAKLQkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gc3VwcG9ydCBISUQgZGV2aWNlcyAoZnJvbSB0aGUgVVNCCi0JICBzcGVjaWZpY2F0aW9uIHN0YW5kcG9pbnQpIHRoYXQgYXJlbid0IHN0cmljdGx5IHVzZXIgaW50ZXJmYWNlCi0JICBkZXZpY2VzLCBsaWtlIG1vbml0b3IgY29udHJvbHMgYW5kIFVuaW50ZXJydXB0YWJsZSBQb3dlciBTdXBwbGllcy4KLQotCSAgVGhpcyBtb2R1bGUgc3VwcG9ydHMgdGhlc2UgZGV2aWNlcyBzZXBhcmF0ZWx5IHVzaW5nIGEgc2VwYXJhdGUKLQkgIGV2ZW50IGludGVyZmFjZSBvbiAvZGV2L3VzYi9oaWRkZXZYIChjaGFyIDE4MDo5NiB0byAxODA6MTExKS4KLQotCSAgSWYgdW5zdXJlLCBzYXkgWS4KLQotbWVudSAiVVNCIEhJRCBCb290IFByb3RvY29sIGRyaXZlcnMiCi0JZGVwZW5kcyBvbiBVU0IhPW4gJiYgVVNCX0hJRCE9eQotCi1jb25maWcgVVNCX0tCRAotCXRyaXN0YXRlICJVU0IgSElEQlAgS2V5Ym9hcmQgKHNpbXBsZSBCb290KSBzdXBwb3J0IgotCWRlcGVuZHMgb24gVVNCICYmIElOUFVUCi0JLS0taGVscC0tLQotCSAgU2F5IFkgaGVyZSBvbmx5IGlmIHlvdSBhcmUgYWJzb2x1dGVseSBzdXJlIHRoYXQgeW91IGRvbid0IHdhbnQKLQkgIHRvIHVzZSB0aGUgZ2VuZXJpYyBISUQgZHJpdmVyIGZvciB5b3VyIFVTQiBrZXlib2FyZCBhbmQgcHJlZmVyCi0JICB0byB1c2UgdGhlIGtleWJvYXJkIGluIGl0cyBsaW1pdGVkIEJvb3QgUHJvdG9jb2wgbW9kZSBpbnN0ZWFkLgotCi0JICBUaGlzIGlzIGFsbW9zdCBjZXJ0YWlubHkgbm90IHdoYXQgeW91IHdhbnQuICBUaGlzIGlzIG1vc3RseQotCSAgdXNlZnVsIGZvciBlbWJlZGRlZCBhcHBsaWNhdGlvbnMgb3Igc2ltcGxlIGtleWJvYXJkcy4KLQotCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCi0JICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgdXNia2JkLgotCi0JICBJZiBldmVuIHJlbW90ZWx5IHVuc3VyZSwgc2F5IE4uCi0KLWNvbmZpZyBVU0JfTU9VU0UKLQl0cmlzdGF0ZSAiVVNCIEhJREJQIE1vdXNlIChzaW1wbGUgQm9vdCkgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIFVTQiAmJiBJTlBVVAotCS0tLWhlbHAtLS0KLQkgIFNheSBZIGhlcmUgb25seSBpZiB5b3UgYXJlIGFic29sdXRlbHkgc3VyZSB0aGF0IHlvdSBkb24ndCB3YW50Ci0JICB0byB1c2UgdGhlIGdlbmVyaWMgSElEIGRyaXZlciBmb3IgeW91ciBVU0IgbW91c2UgYW5kIHByZWZlcgotCSAgdG8gdXNlIHRoZSBtb3VzZSBpbiBpdHMgbGltaXRlZCBCb290IFByb3RvY29sIG1vZGUgaW5zdGVhZC4KLQotCSAgVGhpcyBpcyBhbG1vc3QgY2VydGFpbmx5IG5vdCB3aGF0IHlvdSB3YW50LiAgVGhpcyBpcyBtb3N0bHkKLQkgIHVzZWZ1bCBmb3IgZW1iZWRkZWQgYXBwbGljYXRpb25zIG9yIHNpbXBsZSBtaWNlLgotCi0JICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKLQkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB1c2Jtb3VzZS4KLQotCSAgSWYgZXZlbiByZW1vdGVseSB1bnN1cmUsIHNheSBOLgotCi1lbmRtZW51Ci0KIGNvbmZpZyBVU0JfQUlQVEVLCiAJdHJpc3RhdGUgIkFpcHRlayA2MDAwVS84MDAwVSB0YWJsZXQgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFVTQiAmJiBJTlBVVApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaW5wdXQvTWFrZWZpbGUgYi9kcml2ZXJzL3VzYi9pbnB1dC9NYWtlZmlsZQppbmRleCBhOWQyMDZjLi45YmY0MjBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9pbnB1dC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3VzYi9pbnB1dC9NYWtlZmlsZQpAQCAtNCw0MCArNCwxMiBAQAogCiAjIE11bHRpcGFydCBvYmplY3RzLgogd2Fjb20tb2Jqcwk6PSB3YWNvbV93YWMubyB3YWNvbV9zeXMubwotdXNiaGlkLW9ianMJOj0gaGlkLWNvcmUubwotCi0jIE9wdGlvbmFsIHBhcnRzIG9mIG11bHRpcGFydCBvYmplY3RzLgotCi1pZmVxICgkKENPTkZJR19VU0JfSElEREVWKSx5KQotCXVzYmhpZC1vYmpzCSs9IGhpZGRldi5vCi1lbmRpZgotaWZlcSAoJChDT05GSUdfSElEX1BJRCkseSkKLQl1c2JoaWQtb2JqcwkrPSBoaWQtcGlkZmYubwotZW5kaWYKLWlmZXEgKCQoQ09ORklHX0xPR0lURUNIX0ZGKSx5KQotCXVzYmhpZC1vYmpzCSs9IGhpZC1sZ2ZmLm8KLWVuZGlmCi1pZmVxICgkKENPTkZJR19QQU5USEVSTE9SRF9GRikseSkKLQl1c2JoaWQtb2JqcwkrPSBoaWQtcGxmZi5vCi1lbmRpZgotaWZlcSAoJChDT05GSUdfVEhSVVNUTUFTVEVSX0ZGKSx5KQotCXVzYmhpZC1vYmpzCSs9IGhpZC10bWZmLm8KLWVuZGlmCi1pZmVxICgkKENPTkZJR19aRVJPUExVU19GRikseSkKLQl1c2JoaWQtb2JqcwkrPSBoaWQtenBmZi5vCi1lbmRpZgotaWZlcSAoJChDT05GSUdfSElEX0ZGKSx5KQotCXVzYmhpZC1vYmpzCSs9IGhpZC1mZi5vCi1lbmRpZgogCiBvYmotJChDT05GSUdfVVNCX0FJUFRFSykJKz0gYWlwdGVrLm8KIG9iai0kKENPTkZJR19VU0JfQVRJX1JFTU9URSkJKz0gYXRpX3JlbW90ZS5vCiBvYmotJChDT05GSUdfVVNCX0FUSV9SRU1PVEUyKQkrPSBhdGlfcmVtb3RlMi5vCi1vYmotJChDT05GSUdfVVNCX0hJRCkJCSs9IHVzYmhpZC5vCi1vYmotJChDT05GSUdfVVNCX0tCRCkJCSs9IHVzYmtiZC5vCiBvYmotJChDT05GSUdfVVNCX0tCVEFCKQkJKz0ga2J0YWIubwogb2JqLSQoQ09ORklHX1VTQl9LRVlTUEFOX1JFTU9URSkJKz0ga2V5c3Bhbl9yZW1vdGUubwotb2JqLSQoQ09ORklHX1VTQl9NT1VTRSkJCSs9IHVzYm1vdXNlLm8KIG9iai0kKENPTkZJR19VU0JfTVRPVUNIKQkrPSBtdG91Y2h1c2Iubwogb2JqLSQoQ09ORklHX1VTQl9JVE1UT1VDSCkJKz0gaXRtdG91Y2gubwogb2JqLSQoQ09ORklHX1VTQl9FR0FMQVgpCSs9IHRvdWNoa2l0dXNiLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2lucHV0L2F0aV9yZW1vdGUyLmMgYi9kcml2ZXJzL3VzYi9pbnB1dC9hdGlfcmVtb3RlMi5jCmluZGV4IDgzZjFmNzkuLjY0NTliZTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2lucHV0L2F0aV9yZW1vdGUyLmMKKysrIGIvZHJpdmVycy91c2IvaW5wdXQvYXRpX3JlbW90ZTIuYwpAQCAtMiw2ICsyLDcgQEAKICAqIGF0aV9yZW1vdGUyIC0gQVRJL1BoaWxpcHMgVVNCIFJGIHJlbW90ZSBkcml2ZXIKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDUgVmlsbGUgU3lyamFsYSA8c3lyamFsYUBzY2kuZmk+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUGV0ZXIgU3Rva2VzIDxsaW51eEBkYWRlb3MuZnJlZXNlcnZlLmNvLnVrPgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgpAQCAtMTEsMTMgKzEyLDI5IEBACiAjaW5jbHVkZSA8bGludXgvdXNiL2lucHV0Lmg+CiAKICNkZWZpbmUgRFJJVkVSX0RFU0MgICAgIkFUSS9QaGlsaXBzIFVTQiBSRiByZW1vdGUgZHJpdmVyIgotI2RlZmluZSBEUklWRVJfVkVSU0lPTiAiMC4xIgorI2RlZmluZSBEUklWRVJfVkVSU0lPTiAiMC4yIgogCiBNT0RVTEVfREVTQ1JJUFRJT04oRFJJVkVSX0RFU0MpOwogTU9EVUxFX1ZFUlNJT04oRFJJVkVSX1ZFUlNJT04pOwogTU9EVUxFX0FVVEhPUigiVmlsbGUgU3lyamFsYSA8c3lyamFsYUBzY2kuZmk+Iik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKKy8qCisgKiBBVEkgUmVtb3RlIFdvbmRlciBJSSBDaGFubmVsIENvbmZpZ3VyYXRpb24KKyAqCisgKiBUaGUgcmVtb3RlIGNvbnRyb2wgY2FuIGJ5IGFzc2lnbmVkIG9uZSBvZiBzaXh0ZWVuICJjaGFubmVscyIgaW4gb3JkZXIgdG8gZmFjaWxpdGF0ZQorICogdGhlIHVzZSBvZiBtdWx0aXBsZSByZW1vdGUgY29udHJvbHMgd2l0aGluIHJhbmdlIG9mIGVhY2ggb3RoZXIuCisgKiBBIHJlbW90ZSdzICJjaGFubmVsIiBtYXkgYmUgYWx0ZXJlZCBieSBwcmVzc2luZyBhbmQgaG9sZGluZyB0aGUgIlBDIiBidXR0b24gZm9yCisgKiBhcHByb3hpbWF0ZWx5IDMgc2Vjb25kcywgYWZ0ZXIgd2hpY2ggdGhlIGJ1dHRvbiB3aWxsIHNsb3dseSBmbGFzaCB0aGUgY291bnQgb2YgdGhlCisgKiBjdXJyZW50bHkgY29uZmlndXJlZCAiY2hhbm5lbCIsIHVzaW5nIHRoZSBudW1lcmljIGtleXBhZCBlbnRlciBhIG51bWJlciBiZXR3ZWVuIDEgYW5kCisgKiAxNiBhbmQgdGhlbiB0aGUgIlBDIiBidXR0b24gYWdhaW4sIHRoZSBidXR0b24gd2lsbCBzbG93bHkgZmxhc2ggdGhlIGNvdW50IG9mIHRoZQorICogbmV3bHkgY29uZmlndXJlZCAiY2hhbm5lbCIuCisgKi8KKworc3RhdGljIHVuc2lnbmVkIGludCBjaGFubmVsX21hc2sgPSAweEZGRkY7Cittb2R1bGVfcGFyYW0oY2hhbm5lbF9tYXNrLCB1aW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoY2hhbm5lbF9tYXNrLCAiQml0bWFzayBvZiBjaGFubmVscyB0byBhY2NlcHQgPDE1OkNoYW5uZWwxNj4uLi48MTpDaGFubmVsMj48MDpDaGFubmVsMT4iKTsKKwogc3RhdGljIHVuc2lnbmVkIGludCBtb2RlX21hc2sgPSAweDFGOwogbW9kdWxlX3BhcmFtKG1vZGVfbWFzaywgdWludCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKG1vZGVfbWFzaywgIkJpdG1hc2sgb2YgbW9kZXMgdG8gYWNjZXB0IDw0OlBDPjwzOkFVWDQ+PDI6QVVYMz48MTpBVVgyPjwwOkFVWDE+Iik7CkBAIC0xNDYsMTUgKzE2MywyMyBAQAogewogCXN0cnVjdCBpbnB1dF9kZXYgKmlkZXYgPSBhcjItPmlkZXY7CiAJdTggKmRhdGEgPSBhcjItPmJ1ZlswXTsKKwlpbnQgY2hhbm5lbCwgbW9kZTsKIAotCWlmIChkYXRhWzBdID4gNCkgeworCWNoYW5uZWwgPSBkYXRhWzBdID4+IDQ7CisKKwlpZiAoISgoMSA8PCBjaGFubmVsKSAmIGNoYW5uZWxfbWFzaykpCisJCXJldHVybjsKKworCW1vZGUgPSBkYXRhWzBdICYgMHgwRjsKKworCWlmIChtb2RlID4gNCkgewogCQlkZXZfZXJyKCZhcjItPmludGZbMF0tPmRldiwKIAkJCSJVbmtub3duIG1vZGUgYnl0ZSAoJTAyeCAlMDJ4ICUwMnggJTAyeClcbiIsCiAJCQlkYXRhWzNdLCBkYXRhWzJdLCBkYXRhWzFdLCBkYXRhWzBdKTsKIAkJcmV0dXJuOwogCX0KIAotCWlmICghKCgxIDw8IGRhdGFbMF0pICYgbW9kZV9tYXNrKSkKKwlpZiAoISgoMSA8PCBtb2RlKSAmIG1vZGVfbWFzaykpCiAJCXJldHVybjsKIAogCWlucHV0X2V2ZW50KGlkZXYsIEVWX1JFTCwgUkVMX1gsIChzOCkgZGF0YVsxXSk7CkBAIC0xNzcsOSArMjAyLDE2IEBACiB7CiAJc3RydWN0IGlucHV0X2RldiAqaWRldiA9IGFyMi0+aWRldjsKIAl1OCAqZGF0YSA9IGFyMi0+YnVmWzFdOwotCWludCBod19jb2RlLCBpbmRleDsKKwlpbnQgY2hhbm5lbCwgbW9kZSwgaHdfY29kZSwgaW5kZXg7CiAKLQlpZiAoZGF0YVswXSA+IDQpIHsKKwljaGFubmVsID0gZGF0YVswXSA+PiA0OworCisJaWYgKCEoKDEgPDwgY2hhbm5lbCkgJiBjaGFubmVsX21hc2spKQorCQlyZXR1cm47CisKKwltb2RlID0gZGF0YVswXSAmIDB4MEY7CisKKwlpZiAobW9kZSA+IDQpIHsKIAkJZGV2X2VycigmYXIyLT5pbnRmWzFdLT5kZXYsCiAJCQkiVW5rbm93biBtb2RlIGJ5dGUgKCUwMnggJTAyeCAlMDJ4ICUwMngpXG4iLAogCQkJZGF0YVszXSwgZGF0YVsyXSwgZGF0YVsxXSwgZGF0YVswXSk7CkBAIC0xOTksMTYgKzIzMSwxNiBAQAogCQkgKiBldmVudHMgZm9yIHRoZSBtb3VzZSBwYWQgc28gd2UgZmlsdGVyIG91dCBhbnkgc3Vic2VxdWVudAogCQkgKiBldmVudHMgZnJvbSB0aGUgc2FtZSBtb2RlIGtleS4KIAkJICovCi0JCWlmIChhcjItPm1vZGUgPT0gZGF0YVswXSkKKwkJaWYgKGFyMi0+bW9kZSA9PSBtb2RlKQogCQkJcmV0dXJuOwogCiAJCWlmIChkYXRhWzFdID09IDApCi0JCQlhcjItPm1vZGUgPSBkYXRhWzBdOworCQkJYXIyLT5tb2RlID0gbW9kZTsKIAotCQlod19jb2RlIHw9IGRhdGFbMF0gPDwgODsKKwkJaHdfY29kZSB8PSBtb2RlIDw8IDg7CiAJfQogCi0JaWYgKCEoKDEgPDwgZGF0YVswXSkgJiBtb2RlX21hc2spKQorCWlmICghKCgxIDw8IG1vZGUpICYgbW9kZV9tYXNrKSkKIAkJcmV0dXJuOwogCiAJaW5kZXggPSBhdGlfcmVtb3RlMl9sb29rdXAoaHdfY29kZSk7CkBAIC0zNzksNiArNDExLDQxIEBACiAJfQogfQogCitzdGF0aWMgaW50IGF0aV9yZW1vdGUyX3NldHVwKHN0cnVjdCBhdGlfcmVtb3RlMiAqYXIyKQoreworCWludCByLCBpLCBjaGFubmVsOworCisJLyoKKwkgKiBDb25maWd1cmUgcmVjZWl2ZXIgdG8gb25seSBhY2NlcHQgaW5wdXQgZnJvbSByZW1vdGUgImNoYW5uZWwiCisJICogIGNoYW5uZWwgPT0gMCAgLT4gQWNjZXB0IGlucHV0IGZyb20gYW55IHJlbW90ZSBjaGFubmVsCisJICogIGNoYW5uZWwgPT0gMSAgLT4gT25seSBhY2NlcHQgaW5wdXQgZnJvbSByZW1vdGUgY2hhbm5lbCAxCisJICogIGNoYW5uZWwgPT0gMiAgLT4gT25seSBhY2NlcHQgaW5wdXQgZnJvbSByZW1vdGUgY2hhbm5lbCAyCisJICogIC4uLgorCSAqICBjaGFubmVsID09IDE2IC0+IE9ubHkgYWNjZXB0IGlucHV0IGZyb20gcmVtb3RlIGNoYW5uZWwgMTYKKwkgKi8KKworCWNoYW5uZWwgPSAwOworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJCWlmICgoMSA8PCBpKSAmIGNoYW5uZWxfbWFzaykgeworCQkJaWYgKCEofigxIDw8IGkpICYgMHhGRkZGICYgY2hhbm5lbF9tYXNrKSkKKwkJCQljaGFubmVsID0gaSArIDE7CisJCQlicmVhazsKKwkJfQorCX0KKworCXIgPSB1c2JfY29udHJvbF9tc2coYXIyLT51ZGV2LCB1c2Jfc25kY3RybHBpcGUoYXIyLT51ZGV2LCAwKSwKKwkJCSAgICAweDIwLAorCQkJICAgIFVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0lOVEVSRkFDRSwKKwkJCSAgICBjaGFubmVsLCAweDAsIE5VTEwsIDAsIFVTQl9DVFJMX1NFVF9USU1FT1VUKTsKKwlpZiAocikgeworCQlkZXZfZXJyKCZhcjItPnVkZXYtPmRldiwgIiVzIC0gZmFpbGVkIHRvIHNldCBjaGFubmVsIGR1ZSB0byBlcnJvcjogJWRcbiIsCisJCQlfX0ZVTkNUSU9OX18sIHIpOworCQlyZXR1cm4gcjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBhdGlfcmVtb3RlMl9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlLCBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCiB7CiAJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGVyZmFjZSk7CkBAIC00MDksNiArNDc2LDEwIEBACiAJaWYgKHIpCiAJCWdvdG8gZmFpbDI7CiAKKwlyID0gYXRpX3JlbW90ZTJfc2V0dXAoYXIyKTsKKwlpZiAocikKKwkJZ290byBmYWlsMjsKKwogCXVzYl9tYWtlX3BhdGgodWRldiwgYXIyLT5waHlzLCBzaXplb2YoYXIyLT5waHlzKSk7CiAJc3RybGNhdChhcjItPnBoeXMsICIvaW5wdXQwIiwgc2l6ZW9mKGFyMi0+cGh5cykpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9pbnB1dC9ndGNvLmMgYi9kcml2ZXJzL3VzYi9pbnB1dC9ndGNvLmMKaW5kZXggMjAzY2RjMWJiLi5hZTc1NmUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9pbnB1dC9ndGNvLmMKKysrIGIvZHJpdmVycy91c2IvaW5wdXQvZ3Rjby5jCkBAIC0xMDQ3LDEzICsxMDQ3LDEwIEBACiAKIAkvKiBHcmFiIHByaXZhdGUgZGV2aWNlIHB0ciAqLwogCXN0cnVjdCBndGNvICAgICpkZXZpY2UgPSB1c2JfZ2V0X2ludGZkYXRhIChpbnRlcmZhY2UpOwotCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0ZGV2OwotCi0JaW5wdXRkZXYgPSBkZXZpY2UtPmlucHV0ZGV2aWNlOwogCiAJLyogTm93IHJldmVyc2UgYWxsIHRoZSByZWdpc3RyYXRpb24gc3R1ZmYgKi8KIAlpZiAoZGV2aWNlKSB7Ci0JCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKGlucHV0ZGV2KTsKKwkJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UoZGV2aWNlLT5pbnB1dGRldmljZSk7CiAJCXVzYl9raWxsX3VyYihkZXZpY2UtPnVyYmluZm8pOwogCQl1c2JfZnJlZV91cmIoZGV2aWNlLT51cmJpbmZvKTsKIAkJdXNiX2J1ZmZlcl9mcmVlKGRldmljZS0+dXNiZGV2LCBSRVBPUlRfTUFYX1NJWkUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9pbnB1dC9oaWQtY29yZS5jIGIvZHJpdmVycy91c2IvaW5wdXQvaGlkLWNvcmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI3YTc1YS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3VzYi9pbnB1dC9oaWQtY29yZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3NyArMCwwIEBACi0vKgotICogIFVTQiBISUQgc3VwcG9ydCBmb3IgTGludXgKLSAqCi0gKiAgQ29weXJpZ2h0IChjKSAxOTk5IEFuZHJlYXMgR2FsCi0gKiAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgVm9qdGVjaCBQYXZsaWsgPHZvanRlY2hAc3VzZS5jej4KLSAqICBDb3B5cmlnaHQgKGMpIDIwMDUgTWljaGFlbCBIYWJvdXN0YWsgPG1pa2UtQGNpbmNpLnJyLmNvbT4gZm9yIENvbmNlcHQyLCBJbmMKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBKaXJpIEtvc2luYQotICovCi0KLS8qCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAqIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+Ci0jaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgotI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+Ci0jaW5jbHVkZSA8bGludXgvd2FpdC5oPgotCi0jaW5jbHVkZSA8bGludXgvdXNiLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9oaWQuaD4KLSNpbmNsdWRlIDxsaW51eC9oaWRkZXYuaD4KLSNpbmNsdWRlIDxsaW51eC9oaWQtZGVidWcuaD4KLSNpbmNsdWRlICJ1c2JoaWQuaCIKLQotLyoKLSAqIFZlcnNpb24gSW5mb3JtYXRpb24KLSAqLwotCi0jZGVmaW5lIERSSVZFUl9WRVJTSU9OICJ2Mi42IgotI2RlZmluZSBEUklWRVJfQVVUSE9SICJBbmRyZWFzIEdhbCwgVm9qdGVjaCBQYXZsaWsiCi0jZGVmaW5lIERSSVZFUl9ERVNDICJVU0IgSElEIGNvcmUgZHJpdmVyIgotI2RlZmluZSBEUklWRVJfTElDRU5TRSAiR1BMIgotCi1zdGF0aWMgY2hhciAqaGlkX3R5cGVzW10gPSB7IkRldmljZSIsICJQb2ludGVyIiwgIk1vdXNlIiwgIkRldmljZSIsICJKb3lzdGljayIsCi0JCQkJIkdhbWVwYWQiLCAiS2V5Ym9hcmQiLCAiS2V5cGFkIiwgIk11bHRpLUF4aXMgQ29udHJvbGxlciJ9OwotLyoKLSAqIE1vZHVsZSBwYXJhbWV0ZXJzLgotICovCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgaGlkX21vdXNlcG9sbF9pbnRlcnZhbDsKLW1vZHVsZV9wYXJhbV9uYW1lZChtb3VzZXBvbGwsIGhpZF9tb3VzZXBvbGxfaW50ZXJ2YWwsIHVpbnQsIDA2NDQpOwotTU9EVUxFX1BBUk1fREVTQyhtb3VzZXBvbGwsICJQb2xsaW5nIGludGVydmFsIG9mIG1pY2UiKTsKLQotLyoKLSAqIElucHV0IHN1Ym1pc3Npb24gYW5kIEkvTyBlcnJvciBoYW5kbGVyLgotICovCi0KLXN0YXRpYyB2b2lkIGhpZF9pb19lcnJvcihzdHJ1Y3QgaGlkX2RldmljZSAqaGlkKTsKLQotLyogU3RhcnQgdXAgdGhlIGlucHV0IFVSQiAqLwotc3RhdGljIGludCBoaWRfc3RhcnRfaW4oc3RydWN0IGhpZF9kZXZpY2UgKmhpZCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCByYyA9IDA7Ci0Jc3RydWN0IHVzYmhpZF9kZXZpY2UgKnVzYmhpZCA9IGhpZC0+ZHJpdmVyX2RhdGE7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmdXNiaGlkLT5pbmxvY2ssIGZsYWdzKTsKLQlpZiAoaGlkLT5vcGVuID4gMCAmJiAhdGVzdF9iaXQoSElEX1NVU1BFTkRFRCwgJnVzYmhpZC0+aW9mbCkgJiYKLQkJCSF0ZXN0X2FuZF9zZXRfYml0KEhJRF9JTl9SVU5OSU5HLCAmdXNiaGlkLT5pb2ZsKSkgewotCQlyYyA9IHVzYl9zdWJtaXRfdXJiKHVzYmhpZC0+dXJiaW4sIEdGUF9BVE9NSUMpOwotCQlpZiAocmMgIT0gMCkKLQkJCWNsZWFyX2JpdChISURfSU5fUlVOTklORywgJnVzYmhpZC0+aW9mbCk7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVzYmhpZC0+aW5sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIHJjOwotfQotCi0vKiBJL08gcmV0cnkgdGltZXIgcm91dGluZSAqLwotc3RhdGljIHZvaWQgaGlkX3JldHJ5X3RpbWVvdXQodW5zaWduZWQgbG9uZyBfaGlkKQotewotCXN0cnVjdCBoaWRfZGV2aWNlICpoaWQgPSAoc3RydWN0IGhpZF9kZXZpY2UgKikgX2hpZDsKLQlzdHJ1Y3QgdXNiaGlkX2RldmljZSAqdXNiaGlkID0gaGlkLT5kcml2ZXJfZGF0YTsKLQotCWRldl9kYmcoJnVzYmhpZC0+aW50Zi0+ZGV2LCAicmV0cnlpbmcgaW50ciB1cmJcbiIpOwotCWlmIChoaWRfc3RhcnRfaW4oaGlkKSkKLQkJaGlkX2lvX2Vycm9yKGhpZCk7Ci19Ci0KLS8qIFdvcmtxdWV1ZSByb3V0aW5lIHRvIHJlc2V0IHRoZSBkZXZpY2Ugb3IgY2xlYXIgYSBoYWx0ICovCi1zdGF0aWMgdm9pZCBoaWRfcmVzZXQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCB1c2JoaWRfZGV2aWNlICp1c2JoaWQgPQotCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHVzYmhpZF9kZXZpY2UsIHJlc2V0X3dvcmspOwotCXN0cnVjdCBoaWRfZGV2aWNlICpoaWQgPSB1c2JoaWQtPmhpZDsKLQlpbnQgcmNfbG9jaywgcmMgPSAwOwotCi0JaWYgKHRlc3RfYml0KEhJRF9DTEVBUl9IQUxULCAmdXNiaGlkLT5pb2ZsKSkgewotCQlkZXZfZGJnKCZ1c2JoaWQtPmludGYtPmRldiwgImNsZWFyIGhhbHRcbiIpOwotCQlyYyA9IHVzYl9jbGVhcl9oYWx0KGhpZF90b191c2JfZGV2KGhpZCksIHVzYmhpZC0+dXJiaW4tPnBpcGUpOwotCQljbGVhcl9iaXQoSElEX0NMRUFSX0hBTFQsICZ1c2JoaWQtPmlvZmwpOwotCQloaWRfc3RhcnRfaW4oaGlkKTsKLQl9Ci0KLQllbHNlIGlmICh0ZXN0X2JpdChISURfUkVTRVRfUEVORElORywgJnVzYmhpZC0+aW9mbCkpIHsKLQkJZGV2X2RiZygmdXNiaGlkLT5pbnRmLT5kZXYsICJyZXNldHRpbmcgZGV2aWNlXG4iKTsKLQkJcmMgPSByY19sb2NrID0gdXNiX2xvY2tfZGV2aWNlX2Zvcl9yZXNldChoaWRfdG9fdXNiX2RldihoaWQpLCB1c2JoaWQtPmludGYpOwotCQlpZiAocmNfbG9jayA+PSAwKSB7Ci0JCQlyYyA9IHVzYl9yZXNldF9jb21wb3NpdGVfZGV2aWNlKGhpZF90b191c2JfZGV2KGhpZCksIHVzYmhpZC0+aW50Zik7Ci0JCQlpZiAocmNfbG9jaykKLQkJCQl1c2JfdW5sb2NrX2RldmljZShoaWRfdG9fdXNiX2RldihoaWQpKTsKLQkJfQotCQljbGVhcl9iaXQoSElEX1JFU0VUX1BFTkRJTkcsICZ1c2JoaWQtPmlvZmwpOwotCX0KLQotCXN3aXRjaCAocmMpIHsKLQljYXNlIDA6Ci0JCWlmICghdGVzdF9iaXQoSElEX0lOX1JVTk5JTkcsICZ1c2JoaWQtPmlvZmwpKQotCQkJaGlkX2lvX2Vycm9yKGhpZCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWVycigiY2FuJ3QgcmVzZXQgZGV2aWNlLCAlcy0lcy9pbnB1dCVkLCBzdGF0dXMgJWQiLAotCQkJCWhpZF90b191c2JfZGV2KGhpZCktPmJ1cy0+YnVzX25hbWUsCi0JCQkJaGlkX3RvX3VzYl9kZXYoaGlkKS0+ZGV2cGF0aCwKLQkJCQl1c2JoaWQtPmlmbnVtLCByYyk7Ci0JCS8qIEZBTExUSFJPVUdIICovCi0JY2FzZSAtRUhPU1RVTlJFQUNIOgotCWNhc2UgLUVOT0RFVjoKLQljYXNlIC1FSU5UUjoKLQkJYnJlYWs7Ci0JfQotfQotCi0vKiBNYWluIEkvTyBlcnJvciBoYW5kbGVyICovCi1zdGF0aWMgdm9pZCBoaWRfaW9fZXJyb3Ioc3RydWN0IGhpZF9kZXZpY2UgKmhpZCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCB1c2JoaWRfZGV2aWNlICp1c2JoaWQgPSBoaWQtPmRyaXZlcl9kYXRhOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnVzYmhpZC0+aW5sb2NrLCBmbGFncyk7Ci0KLQkvKiBTdG9wIHdoZW4gZGlzY29ubmVjdGVkICovCi0JaWYgKHVzYl9nZXRfaW50ZmRhdGEodXNiaGlkLT5pbnRmKSA9PSBOVUxMKQotCQlnb3RvIGRvbmU7Ci0KLQkvKiBXaGVuIGFuIGVycm9yIG9jY3VycywgcmV0cnkgYXQgaW5jcmVhc2luZyBpbnRlcnZhbHMgKi8KLQlpZiAodXNiaGlkLT5yZXRyeV9kZWxheSA9PSAwKSB7Ci0JCXVzYmhpZC0+cmV0cnlfZGVsYXkgPSAxMzsJLyogVGhlbiAyNiwgNTIsIDEwNCwgMTA0LCAuLi4gKi8KLQkJdXNiaGlkLT5zdG9wX3JldHJ5ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMTAwMCk7Ci0JfSBlbHNlIGlmICh1c2JoaWQtPnJldHJ5X2RlbGF5IDwgMTAwKQotCQl1c2JoaWQtPnJldHJ5X2RlbGF5ICo9IDI7Ci0KLQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB1c2JoaWQtPnN0b3BfcmV0cnkpKSB7Ci0KLQkJLyogUmV0cmllcyBmYWlsZWQsIHNvIGRvIGEgcG9ydCByZXNldCAqLwotCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoSElEX1JFU0VUX1BFTkRJTkcsICZ1c2JoaWQtPmlvZmwpKSB7Ci0JCQlzY2hlZHVsZV93b3JrKCZ1c2JoaWQtPnJlc2V0X3dvcmspOwotCQkJZ290byBkb25lOwotCQl9Ci0JfQotCi0JbW9kX3RpbWVyKCZ1c2JoaWQtPmlvX3JldHJ5LAotCQkJamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXModXNiaGlkLT5yZXRyeV9kZWxheSkpOwotZG9uZToKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1c2JoaWQtPmlubG9jaywgZmxhZ3MpOwotfQotCi0vKgotICogSW5wdXQgaW50ZXJydXB0IGNvbXBsZXRpb24gaGFuZGxlci4KLSAqLwotCi1zdGF0aWMgdm9pZCBoaWRfaXJxX2luKHN0cnVjdCB1cmIgKnVyYikKLXsKLQlzdHJ1Y3QgaGlkX2RldmljZQkqaGlkID0gdXJiLT5jb250ZXh0OwotCXN0cnVjdCB1c2JoaWRfZGV2aWNlIAkqdXNiaGlkID0gaGlkLT5kcml2ZXJfZGF0YTsKLQlpbnQJCQlzdGF0dXM7Ci0KLQlzd2l0Y2ggKHVyYi0+c3RhdHVzKSB7Ci0JCWNhc2UgMDoJCQkvKiBzdWNjZXNzICovCi0JCQl1c2JoaWQtPnJldHJ5X2RlbGF5ID0gMDsKLQkJCWhpZF9pbnB1dF9yZXBvcnQodXJiLT5jb250ZXh0LCBISURfSU5QVVRfUkVQT1JULAotCQkJCQkgdXJiLT50cmFuc2Zlcl9idWZmZXIsCi0JCQkJCSB1cmItPmFjdHVhbF9sZW5ndGgsIDEpOwotCQkJYnJlYWs7Ci0JCWNhc2UgLUVQSVBFOgkJLyogc3RhbGwgKi8KLQkJCWNsZWFyX2JpdChISURfSU5fUlVOTklORywgJnVzYmhpZC0+aW9mbCk7Ci0JCQlzZXRfYml0KEhJRF9DTEVBUl9IQUxULCAmdXNiaGlkLT5pb2ZsKTsKLQkJCXNjaGVkdWxlX3dvcmsoJnVzYmhpZC0+cmVzZXRfd29yayk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgLUVDT05OUkVTRVQ6CS8qIHVubGluayAqLwotCQljYXNlIC1FTk9FTlQ6Ci0JCWNhc2UgLUVTSFVURE9XTjoJLyogdW5wbHVnICovCi0JCQljbGVhcl9iaXQoSElEX0lOX1JVTk5JTkcsICZ1c2JoaWQtPmlvZmwpOwotCQkJcmV0dXJuOwotCQljYXNlIC1FSUxTRVE6CQkvKiBwcm90b2NvbCBlcnJvciBvciB1bnBsdWcgKi8KLQkJY2FzZSAtRVBST1RPOgkJLyogcHJvdG9jb2wgZXJyb3Igb3IgdW5wbHVnICovCi0JCWNhc2UgLUVUSU1FOgkJLyogcHJvdG9jb2wgZXJyb3Igb3IgdW5wbHVnICovCi0JCWNhc2UgLUVUSU1FRE9VVDoJLyogU2hvdWxkIG5ldmVyIGhhcHBlbiwgYnV0Li4uICovCi0JCQljbGVhcl9iaXQoSElEX0lOX1JVTk5JTkcsICZ1c2JoaWQtPmlvZmwpOwotCQkJaGlkX2lvX2Vycm9yKGhpZCk7Ci0JCQlyZXR1cm47Ci0JCWRlZmF1bHQ6CQkvKiBlcnJvciAqLwotCQkJd2FybigiaW5wdXQgaXJxIHN0YXR1cyAlZCByZWNlaXZlZCIsIHVyYi0+c3RhdHVzKTsKLQl9Ci0KLQlzdGF0dXMgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOwotCWlmIChzdGF0dXMpIHsKLQkJY2xlYXJfYml0KEhJRF9JTl9SVU5OSU5HLCAmdXNiaGlkLT5pb2ZsKTsKLQkJaWYgKHN0YXR1cyAhPSAtRVBFUk0pIHsKLQkJCWVycigiY2FuJ3QgcmVzdWJtaXQgaW50ciwgJXMtJXMvaW5wdXQlZCwgc3RhdHVzICVkIiwKLQkJCQkJaGlkX3RvX3VzYl9kZXYoaGlkKS0+YnVzLT5idXNfbmFtZSwKLQkJCQkJaGlkX3RvX3VzYl9kZXYoaGlkKS0+ZGV2cGF0aCwKLQkJCQkJdXNiaGlkLT5pZm51bSwgc3RhdHVzKTsKLQkJCWhpZF9pb19lcnJvcihoaWQpOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgaW50IGhpZF9zdWJtaXRfb3V0KHN0cnVjdCBoaWRfZGV2aWNlICpoaWQpCi17Ci0Jc3RydWN0IGhpZF9yZXBvcnQgKnJlcG9ydDsKLQlzdHJ1Y3QgdXNiaGlkX2RldmljZSAqdXNiaGlkID0gaGlkLT5kcml2ZXJfZGF0YTsKLQotCXJlcG9ydCA9IHVzYmhpZC0+b3V0W3VzYmhpZC0+b3V0dGFpbF07Ci0KLQloaWRfb3V0cHV0X3JlcG9ydChyZXBvcnQsIHVzYmhpZC0+b3V0YnVmKTsKLQl1c2JoaWQtPnVyYm91dC0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9ICgocmVwb3J0LT5zaXplIC0gMSkgPj4gMykgKyAxICsgKHJlcG9ydC0+aWQgPiAwKTsKLQl1c2JoaWQtPnVyYm91dC0+ZGV2ID0gaGlkX3RvX3VzYl9kZXYoaGlkKTsKLQotCWRiZygic3VibWl0dGluZyBvdXQgdXJiIik7Ci0KLQlpZiAodXNiX3N1Ym1pdF91cmIodXNiaGlkLT51cmJvdXQsIEdGUF9BVE9NSUMpKSB7Ci0JCWVycigidXNiX3N1Ym1pdF91cmIob3V0KSBmYWlsZWQiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGhpZF9zdWJtaXRfY3RybChzdHJ1Y3QgaGlkX2RldmljZSAqaGlkKQotewotCXN0cnVjdCBoaWRfcmVwb3J0ICpyZXBvcnQ7Ci0JdW5zaWduZWQgY2hhciBkaXI7Ci0JaW50IGxlbjsKLQlzdHJ1Y3QgdXNiaGlkX2RldmljZSAqdXNiaGlkID0gaGlkLT5kcml2ZXJfZGF0YTsKLQotCXJlcG9ydCA9IHVzYmhpZC0+Y3RybFt1c2JoaWQtPmN0cmx0YWlsXS5yZXBvcnQ7Ci0JZGlyID0gdXNiaGlkLT5jdHJsW3VzYmhpZC0+Y3RybHRhaWxdLmRpcjsKLQotCWxlbiA9ICgocmVwb3J0LT5zaXplIC0gMSkgPj4gMykgKyAxICsgKHJlcG9ydC0+aWQgPiAwKTsKLQlpZiAoZGlyID09IFVTQl9ESVJfT1VUKSB7Ci0JCWhpZF9vdXRwdXRfcmVwb3J0KHJlcG9ydCwgdXNiaGlkLT5jdHJsYnVmKTsKLQkJdXNiaGlkLT51cmJjdHJsLT5waXBlID0gdXNiX3NuZGN0cmxwaXBlKGhpZF90b191c2JfZGV2KGhpZCksIDApOwotCQl1c2JoaWQtPnVyYmN0cmwtPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBsZW47Ci0JfSBlbHNlIHsKLQkJaW50IG1heHBhY2tldCwgcGFkbGVuOwotCi0JCXVzYmhpZC0+dXJiY3RybC0+cGlwZSA9IHVzYl9yY3ZjdHJscGlwZShoaWRfdG9fdXNiX2RldihoaWQpLCAwKTsKLQkJbWF4cGFja2V0ID0gdXNiX21heHBhY2tldChoaWRfdG9fdXNiX2RldihoaWQpLCB1c2JoaWQtPnVyYmN0cmwtPnBpcGUsIDApOwotCQlpZiAobWF4cGFja2V0ID4gMCkgewotCQkJcGFkbGVuID0gKGxlbiArIG1heHBhY2tldCAtIDEpIC8gbWF4cGFja2V0OwotCQkJcGFkbGVuICo9IG1heHBhY2tldDsKLQkJCWlmIChwYWRsZW4gPiB1c2JoaWQtPmJ1ZnNpemUpCi0JCQkJcGFkbGVuID0gdXNiaGlkLT5idWZzaXplOwotCQl9IGVsc2UKLQkJCXBhZGxlbiA9IDA7Ci0JCXVzYmhpZC0+dXJiY3RybC0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IHBhZGxlbjsKLQl9Ci0JdXNiaGlkLT51cmJjdHJsLT5kZXYgPSBoaWRfdG9fdXNiX2RldihoaWQpOwotCi0JdXNiaGlkLT5jci0+YlJlcXVlc3RUeXBlID0gVVNCX1RZUEVfQ0xBU1MgfCBVU0JfUkVDSVBfSU5URVJGQUNFIHwgZGlyOwotCXVzYmhpZC0+Y3ItPmJSZXF1ZXN0ID0gKGRpciA9PSBVU0JfRElSX09VVCkgPyBISURfUkVRX1NFVF9SRVBPUlQgOiBISURfUkVRX0dFVF9SRVBPUlQ7Ci0JdXNiaGlkLT5jci0+d1ZhbHVlID0gY3B1X3RvX2xlMTYoKChyZXBvcnQtPnR5cGUgKyAxKSA8PCA4KSB8IHJlcG9ydC0+aWQpOwotCXVzYmhpZC0+Y3ItPndJbmRleCA9IGNwdV90b19sZTE2KHVzYmhpZC0+aWZudW0pOwotCXVzYmhpZC0+Y3ItPndMZW5ndGggPSBjcHVfdG9fbGUxNihsZW4pOwotCi0JZGJnKCJzdWJtaXR0aW5nIGN0cmwgdXJiOiAlcyB3VmFsdWU9MHglMDR4IHdJbmRleD0weCUwNHggd0xlbmd0aD0ldSIsCi0JCXVzYmhpZC0+Y3ItPmJSZXF1ZXN0ID09IEhJRF9SRVFfU0VUX1JFUE9SVCA/ICJTZXRfUmVwb3J0IiA6ICJHZXRfUmVwb3J0IiwKLQkJdXNiaGlkLT5jci0+d1ZhbHVlLCB1c2JoaWQtPmNyLT53SW5kZXgsIHVzYmhpZC0+Y3ItPndMZW5ndGgpOwotCi0JaWYgKHVzYl9zdWJtaXRfdXJiKHVzYmhpZC0+dXJiY3RybCwgR0ZQX0FUT01JQykpIHsKLQkJZXJyKCJ1c2Jfc3VibWl0X3VyYihjdHJsKSBmYWlsZWQiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXJldHVybiAwOwotfQotCi0vKgotICogT3V0cHV0IGludGVycnVwdCBjb21wbGV0aW9uIGhhbmRsZXIuCi0gKi8KLQotc3RhdGljIHZvaWQgaGlkX2lycV9vdXQoc3RydWN0IHVyYiAqdXJiKQotewotCXN0cnVjdCBoaWRfZGV2aWNlICpoaWQgPSB1cmItPmNvbnRleHQ7Ci0Jc3RydWN0IHVzYmhpZF9kZXZpY2UgKnVzYmhpZCA9IGhpZC0+ZHJpdmVyX2RhdGE7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgdW5wbHVnID0gMDsKLQotCXN3aXRjaCAodXJiLT5zdGF0dXMpIHsKLQkJY2FzZSAwOgkJCS8qIHN1Y2Nlc3MgKi8KLQkJCWJyZWFrOwotCQljYXNlIC1FU0hVVERPV046CS8qIHVucGx1ZyAqLwotCQkJdW5wbHVnID0gMTsKLQkJY2FzZSAtRUlMU0VROgkJLyogcHJvdG9jb2wgZXJyb3Igb3IgdW5wbHVnICovCi0JCWNhc2UgLUVQUk9UTzoJCS8qIHByb3RvY29sIGVycm9yIG9yIHVucGx1ZyAqLwotCQljYXNlIC1FQ09OTlJFU0VUOgkvKiB1bmxpbmsgKi8KLQkJY2FzZSAtRU5PRU5UOgotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6CQkvKiBlcnJvciAqLwotCQkJd2Fybigib3V0cHV0IGlycSBzdGF0dXMgJWQgcmVjZWl2ZWQiLCB1cmItPnN0YXR1cyk7Ci0JfQotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnVzYmhpZC0+b3V0bG9jaywgZmxhZ3MpOwotCi0JaWYgKHVucGx1ZykKLQkJdXNiaGlkLT5vdXR0YWlsID0gdXNiaGlkLT5vdXRoZWFkOwotCWVsc2UKLQkJdXNiaGlkLT5vdXR0YWlsID0gKHVzYmhpZC0+b3V0dGFpbCArIDEpICYgKEhJRF9PVVRQVVRfRklGT19TSVpFIC0gMSk7Ci0KLQlpZiAodXNiaGlkLT5vdXRoZWFkICE9IHVzYmhpZC0+b3V0dGFpbCkgewotCQlpZiAoaGlkX3N1Ym1pdF9vdXQoaGlkKSkgewotCQkJY2xlYXJfYml0KEhJRF9PVVRfUlVOTklORywgJnVzYmhpZC0+aW9mbCk7Ci0JCQl3YWtlX3VwKCZoaWQtPndhaXQpOwotCQl9Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVzYmhpZC0+b3V0bG9jaywgZmxhZ3MpOwotCQlyZXR1cm47Ci0JfQotCi0JY2xlYXJfYml0KEhJRF9PVVRfUlVOTklORywgJnVzYmhpZC0+aW9mbCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdXNiaGlkLT5vdXRsb2NrLCBmbGFncyk7Ci0Jd2FrZV91cCgmaGlkLT53YWl0KTsKLX0KLQotLyoKLSAqIENvbnRyb2wgcGlwZSBjb21wbGV0aW9uIGhhbmRsZXIuCi0gKi8KLQotc3RhdGljIHZvaWQgaGlkX2N0cmwoc3RydWN0IHVyYiAqdXJiKQotewotCXN0cnVjdCBoaWRfZGV2aWNlICpoaWQgPSB1cmItPmNvbnRleHQ7Ci0Jc3RydWN0IHVzYmhpZF9kZXZpY2UgKnVzYmhpZCA9IGhpZC0+ZHJpdmVyX2RhdGE7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgdW5wbHVnID0gMDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZ1c2JoaWQtPmN0cmxsb2NrLCBmbGFncyk7Ci0KLQlzd2l0Y2ggKHVyYi0+c3RhdHVzKSB7Ci0JCWNhc2UgMDoJCQkvKiBzdWNjZXNzICovCi0JCQlpZiAodXNiaGlkLT5jdHJsW3VzYmhpZC0+Y3RybHRhaWxdLmRpciA9PSBVU0JfRElSX0lOKQotCQkJCWhpZF9pbnB1dF9yZXBvcnQodXJiLT5jb250ZXh0LCB1c2JoaWQtPmN0cmxbdXNiaGlkLT5jdHJsdGFpbF0ucmVwb3J0LT50eXBlLAotCQkJCQkJdXJiLT50cmFuc2Zlcl9idWZmZXIsIHVyYi0+YWN0dWFsX2xlbmd0aCwgMCk7Ci0JCQlicmVhazsKLQkJY2FzZSAtRVNIVVRET1dOOgkvKiB1bnBsdWcgKi8KLQkJCXVucGx1ZyA9IDE7Ci0JCWNhc2UgLUVJTFNFUToJCS8qIHByb3RvY29sIGVycm9yIG9yIHVucGx1ZyAqLwotCQljYXNlIC1FUFJPVE86CQkvKiBwcm90b2NvbCBlcnJvciBvciB1bnBsdWcgKi8KLQkJY2FzZSAtRUNPTk5SRVNFVDoJLyogdW5saW5rICovCi0JCWNhc2UgLUVOT0VOVDoKLQkJY2FzZSAtRVBJUEU6CQkvKiByZXBvcnQgbm90IGF2YWlsYWJsZSAqLwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6CQkvKiBlcnJvciAqLwotCQkJd2FybigiY3RybCB1cmIgc3RhdHVzICVkIHJlY2VpdmVkIiwgdXJiLT5zdGF0dXMpOwotCX0KLQotCWlmICh1bnBsdWcpCi0JCXVzYmhpZC0+Y3RybHRhaWwgPSB1c2JoaWQtPmN0cmxoZWFkOwotCWVsc2UKLQkJdXNiaGlkLT5jdHJsdGFpbCA9ICh1c2JoaWQtPmN0cmx0YWlsICsgMSkgJiAoSElEX0NPTlRST0xfRklGT19TSVpFIC0gMSk7Ci0KLQlpZiAodXNiaGlkLT5jdHJsaGVhZCAhPSB1c2JoaWQtPmN0cmx0YWlsKSB7Ci0JCWlmIChoaWRfc3VibWl0X2N0cmwoaGlkKSkgewotCQkJY2xlYXJfYml0KEhJRF9DVFJMX1JVTk5JTkcsICZ1c2JoaWQtPmlvZmwpOwotCQkJd2FrZV91cCgmaGlkLT53YWl0KTsKLQkJfQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1c2JoaWQtPmN0cmxsb2NrLCBmbGFncyk7Ci0JCXJldHVybjsKLQl9Ci0KLQljbGVhcl9iaXQoSElEX0NUUkxfUlVOTklORywgJnVzYmhpZC0+aW9mbCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdXNiaGlkLT5jdHJsbG9jaywgZmxhZ3MpOwotCXdha2VfdXAoJmhpZC0+d2FpdCk7Ci19Ci0KLXZvaWQgdXNiaGlkX3N1Ym1pdF9yZXBvcnQoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCwgc3RydWN0IGhpZF9yZXBvcnQgKnJlcG9ydCwgdW5zaWduZWQgY2hhciBkaXIpCi17Ci0JaW50IGhlYWQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgdXNiaGlkX2RldmljZSAqdXNiaGlkID0gaGlkLT5kcml2ZXJfZGF0YTsKLQotCWlmICgoaGlkLT5xdWlya3MgJiBISURfUVVJUktfTk9HRVQpICYmIGRpciA9PSBVU0JfRElSX0lOKQotCQlyZXR1cm47Ci0KLQlpZiAodXNiaGlkLT51cmJvdXQgJiYgZGlyID09IFVTQl9ESVJfT1VUICYmIHJlcG9ydC0+dHlwZSA9PSBISURfT1VUUFVUX1JFUE9SVCkgewotCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZ1c2JoaWQtPm91dGxvY2ssIGZsYWdzKTsKLQotCQlpZiAoKGhlYWQgPSAodXNiaGlkLT5vdXRoZWFkICsgMSkgJiAoSElEX09VVFBVVF9GSUZPX1NJWkUgLSAxKSkgPT0gdXNiaGlkLT5vdXR0YWlsKSB7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1c2JoaWQtPm91dGxvY2ssIGZsYWdzKTsKLQkJCXdhcm4oIm91dHB1dCBxdWV1ZSBmdWxsIik7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQl1c2JoaWQtPm91dFt1c2JoaWQtPm91dGhlYWRdID0gcmVwb3J0OwotCQl1c2JoaWQtPm91dGhlYWQgPSBoZWFkOwotCi0JCWlmICghdGVzdF9hbmRfc2V0X2JpdChISURfT1VUX1JVTk5JTkcsICZ1c2JoaWQtPmlvZmwpKQotCQkJaWYgKGhpZF9zdWJtaXRfb3V0KGhpZCkpCi0JCQkJY2xlYXJfYml0KEhJRF9PVVRfUlVOTklORywgJnVzYmhpZC0+aW9mbCk7Ci0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdXNiaGlkLT5vdXRsb2NrLCBmbGFncyk7Ci0JCXJldHVybjsKLQl9Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmdXNiaGlkLT5jdHJsbG9jaywgZmxhZ3MpOwotCi0JaWYgKChoZWFkID0gKHVzYmhpZC0+Y3RybGhlYWQgKyAxKSAmIChISURfQ09OVFJPTF9GSUZPX1NJWkUgLSAxKSkgPT0gdXNiaGlkLT5jdHJsdGFpbCkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1c2JoaWQtPmN0cmxsb2NrLCBmbGFncyk7Ci0JCXdhcm4oImNvbnRyb2wgcXVldWUgZnVsbCIpOwotCQlyZXR1cm47Ci0JfQotCi0JdXNiaGlkLT5jdHJsW3VzYmhpZC0+Y3RybGhlYWRdLnJlcG9ydCA9IHJlcG9ydDsKLQl1c2JoaWQtPmN0cmxbdXNiaGlkLT5jdHJsaGVhZF0uZGlyID0gZGlyOwotCXVzYmhpZC0+Y3RybGhlYWQgPSBoZWFkOwotCi0JaWYgKCF0ZXN0X2FuZF9zZXRfYml0KEhJRF9DVFJMX1JVTk5JTkcsICZ1c2JoaWQtPmlvZmwpKQotCQlpZiAoaGlkX3N1Ym1pdF9jdHJsKGhpZCkpCi0JCQljbGVhcl9iaXQoSElEX0NUUkxfUlVOTklORywgJnVzYmhpZC0+aW9mbCk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1c2JoaWQtPmN0cmxsb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyBpbnQgdXNiX2hpZGlucHV0X2lucHV0X2V2ZW50KHN0cnVjdCBpbnB1dF9kZXYgKmRldiwgdW5zaWduZWQgaW50IHR5cGUsIHVuc2lnbmVkIGludCBjb2RlLCBpbnQgdmFsdWUpCi17Ci0Jc3RydWN0IGhpZF9kZXZpY2UgKmhpZCA9IGRldi0+cHJpdmF0ZTsKLQlzdHJ1Y3QgaGlkX2ZpZWxkICpmaWVsZDsKLQlpbnQgb2Zmc2V0OwotCi0JaWYgKHR5cGUgPT0gRVZfRkYpCi0JCXJldHVybiBpbnB1dF9mZl9ldmVudChkZXYsIHR5cGUsIGNvZGUsIHZhbHVlKTsKLQotCWlmICh0eXBlICE9IEVWX0xFRCkKLQkJcmV0dXJuIC0xOwotCi0JaWYgKChvZmZzZXQgPSBoaWRpbnB1dF9maW5kX2ZpZWxkKGhpZCwgdHlwZSwgY29kZSwgJmZpZWxkKSkgPT0gLTEpIHsKLQkJd2FybigiZXZlbnQgZmllbGQgbm90IGZvdW5kIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQloaWRfc2V0X2ZpZWxkKGZpZWxkLCBvZmZzZXQsIHZhbHVlKTsKLQl1c2JoaWRfc3VibWl0X3JlcG9ydChoaWQsIGZpZWxkLT5yZXBvcnQsIFVTQl9ESVJfT1VUKTsKLQotCXJldHVybiAwOwotfQotCi1pbnQgdXNiaGlkX3dhaXRfaW8oc3RydWN0IGhpZF9kZXZpY2UgKmhpZCkKLXsKLQlzdHJ1Y3QgdXNiaGlkX2RldmljZSAqdXNiaGlkID0gaGlkLT5kcml2ZXJfZGF0YTsKLQotCWlmICghd2FpdF9ldmVudF90aW1lb3V0KGhpZC0+d2FpdCwgKCF0ZXN0X2JpdChISURfQ1RSTF9SVU5OSU5HLCAmdXNiaGlkLT5pb2ZsKSAmJgotCQkJCQkhdGVzdF9iaXQoSElEX09VVF9SVU5OSU5HLCAmdXNiaGlkLT5pb2ZsKSksCi0JCQkJCTEwKkhaKSkgewotCQlkYmcoInRpbWVvdXQgd2FpdGluZyBmb3IgY3RybCBvciBvdXQgcXVldWUgdG8gY2xlYXIiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGhpZF9zZXRfaWRsZShzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCBpbnQgaWZudW0sIGludCByZXBvcnQsIGludCBpZGxlKQotewotCXJldHVybiB1c2JfY29udHJvbF9tc2coZGV2LCB1c2Jfc25kY3RybHBpcGUoZGV2LCAwKSwKLQkJSElEX1JFUV9TRVRfSURMRSwgVVNCX1RZUEVfQ0xBU1MgfCBVU0JfUkVDSVBfSU5URVJGQUNFLCAoaWRsZSA8PCA4KSB8IHJlcG9ydCwKLQkJaWZudW0sIE5VTEwsIDAsIFVTQl9DVFJMX1NFVF9USU1FT1VUKTsKLX0KLQotc3RhdGljIGludCBoaWRfZ2V0X2NsYXNzX2Rlc2NyaXB0b3Ioc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgaW50IGlmbnVtLAotCQl1bnNpZ25lZCBjaGFyIHR5cGUsIHZvaWQgKmJ1ZiwgaW50IHNpemUpCi17Ci0JaW50IHJlc3VsdCwgcmV0cmllcyA9IDQ7Ci0KLQltZW1zZXQoYnVmLCAwLCBzaXplKTsKLQotCWRvIHsKLQkJcmVzdWx0ID0gdXNiX2NvbnRyb2xfbXNnKGRldiwgdXNiX3JjdmN0cmxwaXBlKGRldiwgMCksCi0JCQkJVVNCX1JFUV9HRVRfREVTQ1JJUFRPUiwgVVNCX1JFQ0lQX0lOVEVSRkFDRSB8IFVTQl9ESVJfSU4sCi0JCQkJKHR5cGUgPDwgOCksIGlmbnVtLCBidWYsIHNpemUsIFVTQl9DVFJMX0dFVF9USU1FT1VUKTsKLQkJcmV0cmllcy0tOwotCX0gd2hpbGUgKHJlc3VsdCA8IHNpemUgJiYgcmV0cmllcyk7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotaW50IHVzYmhpZF9vcGVuKHN0cnVjdCBoaWRfZGV2aWNlICpoaWQpCi17Ci0JKytoaWQtPm9wZW47Ci0JaWYgKGhpZF9zdGFydF9pbihoaWQpKQotCQloaWRfaW9fZXJyb3IoaGlkKTsKLQlyZXR1cm4gMDsKLX0KLQotdm9pZCB1c2JoaWRfY2xvc2Uoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCkKLXsKLQlzdHJ1Y3QgdXNiaGlkX2RldmljZSAqdXNiaGlkID0gaGlkLT5kcml2ZXJfZGF0YTsKLQotCWlmICghLS1oaWQtPm9wZW4pCi0JCXVzYl9raWxsX3VyYih1c2JoaWQtPnVyYmluKTsKLX0KLQotI2RlZmluZSBVU0JfVkVORE9SX0lEX1BBTkpJVAkJMHgxMzRjCi0KLSNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9UVVJCT1gJCTB4MDYyYQotI2RlZmluZSBVU0JfREVWSUNFX0lEX1RVUkJPWF9LRVlCT0FSRAkweDAyMDEKLSNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9DSURDCQkweDE2NzcKLQotLyoKLSAqIEluaXRpYWxpemUgYWxsIHJlcG9ydHMKLSAqLwotCi12b2lkIHVzYmhpZF9pbml0X3JlcG9ydHMoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCkKLXsKLQlzdHJ1Y3QgaGlkX3JlcG9ydCAqcmVwb3J0OwotCXN0cnVjdCB1c2JoaWRfZGV2aWNlICp1c2JoaWQgPSBoaWQtPmRyaXZlcl9kYXRhOwotCWludCBlcnIsIHJldDsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkocmVwb3J0LCAmaGlkLT5yZXBvcnRfZW51bVtISURfSU5QVVRfUkVQT1JUXS5yZXBvcnRfbGlzdCwgbGlzdCkKLQkJdXNiaGlkX3N1Ym1pdF9yZXBvcnQoaGlkLCByZXBvcnQsIFVTQl9ESVJfSU4pOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShyZXBvcnQsICZoaWQtPnJlcG9ydF9lbnVtW0hJRF9GRUFUVVJFX1JFUE9SVF0ucmVwb3J0X2xpc3QsIGxpc3QpCi0JCXVzYmhpZF9zdWJtaXRfcmVwb3J0KGhpZCwgcmVwb3J0LCBVU0JfRElSX0lOKTsKLQotCWVyciA9IDA7Ci0JcmV0ID0gdXNiaGlkX3dhaXRfaW8oaGlkKTsKLQl3aGlsZSAocmV0KSB7Ci0JCWVyciB8PSByZXQ7Ci0JCWlmICh0ZXN0X2JpdChISURfQ1RSTF9SVU5OSU5HLCAmdXNiaGlkLT5pb2ZsKSkKLQkJCXVzYl9raWxsX3VyYih1c2JoaWQtPnVyYmN0cmwpOwotCQlpZiAodGVzdF9iaXQoSElEX09VVF9SVU5OSU5HLCAmdXNiaGlkLT5pb2ZsKSkKLQkJCXVzYl9raWxsX3VyYih1c2JoaWQtPnVyYm91dCk7Ci0JCXJldCA9IHVzYmhpZF93YWl0X2lvKGhpZCk7Ci0JfQotCi0JaWYgKGVycikKLQkJd2FybigidGltZW91dCBpbml0aWFsaXppbmcgcmVwb3J0cyIpOwotfQotCi0jZGVmaW5lIFVTQl9WRU5ET1JfSURfR1RDTwkJMHgwNzhjCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT185MAkJMHgwMDkwCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT18xMDAJCTB4MDEwMAotI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fMTAxCQkweDAxMDEKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzEwMwkJMHgwMTAzCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT18xMDQJCTB4MDEwNAotI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fMTA1CQkweDAxMDUKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzEwNgkJMHgwMTA2Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT18xMDcJCTB4MDEwNwotI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fMTA4CQkweDAxMDgKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzIwMAkJMHgwMjAwCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT18yMDEJCTB4MDIwMQotI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fMjAyCQkweDAyMDIKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzIwMwkJMHgwMjAzCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT18yMDQJCTB4MDIwNAotI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fMjA1CQkweDAyMDUKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzIwNgkJMHgwMjA2Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT18yMDcJCTB4MDIwNwotI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fMzAwCQkweDAzMDAKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzMwMQkJMHgwMzAxCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT18zMDIJCTB4MDMwMgotI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fMzAzCQkweDAzMDMKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzMwNAkJMHgwMzA0Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT18zMDUJCTB4MDMwNQotI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fMzA2CQkweDAzMDYKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzMwNwkJMHgwMzA3Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT18zMDgJCTB4MDMwOAotI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fMzA5CQkweDAzMDkKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzQwMAkJMHgwNDAwCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT180MDEJCTB4MDQwMQotI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fNDAyCQkweDA0MDIKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzQwMwkJMHgwNDAzCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT180MDQJCTB4MDQwNAotI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fNDA1CQkweDA0MDUKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzUwMAkJMHgwNTAwCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT181MDEJCTB4MDUwMQotI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fNTAyCQkweDA1MDIKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzUwMwkJMHgwNTAzCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT181MDQJCTB4MDUwNAotI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fMTAwMAkJMHgxMDAwCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT18xMDAxCQkweDEwMDEKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzEwMDIJCTB4MTAwMgotI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fMTAwMwkJMHgxMDAzCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfR1RDT18xMDA0CQkweDEwMDQKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9HVENPXzEwMDUJCTB4MTAwNQotI2RlZmluZSBVU0JfREVWSUNFX0lEX0dUQ09fMTAwNgkJMHgxMDA2Ci0KLSNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9XQUNPTQkJMHgwNTZhCi0KLSNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9BQ0VDQUQJCTB4MDQ2MAotI2RlZmluZSBVU0JfREVWSUNFX0lEX0FDRUNBRF9GTEFJUgkweDAwMDQKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9BQ0VDQURfMzAyCTB4MDAwOAotCi0jZGVmaW5lIFVTQl9WRU5ET1JfSURfS0JHRUFSCQkweDA4NGUKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9LQkdFQVJfSkFNU1RVRElPCTB4MTAwMQotCi0jZGVmaW5lIFVTQl9WRU5ET1JfSURfQUlQVEVLCQkweDA4Y2EKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9BSVBURUtfMDEJCTB4MDAwMQotI2RlZmluZSBVU0JfREVWSUNFX0lEX0FJUFRFS18xMAkJMHgwMDEwCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfQUlQVEVLXzIwCQkweDAwMjAKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9BSVBURUtfMjEJCTB4MDAyMQotI2RlZmluZSBVU0JfREVWSUNFX0lEX0FJUFRFS18yMgkJMHgwMDIyCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfQUlQVEVLXzIzCQkweDAwMjMKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9BSVBURUtfMjQJCTB4MDAyNAotCi0jZGVmaW5lIFVTQl9WRU5ET1JfSURfR1JJRkZJTgkJMHgwNzdkCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfUE9XRVJNQVRFCQkweDA0MTAKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9TT1VOREtOT0IJCTB4MDRBQQotCi0jZGVmaW5lIFVTQl9WRU5ET1JfSURfQVRFTgkJMHgwNTU3Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVRFTl9VQzEwMEtNCTB4MjAwNAotI2RlZmluZSBVU0JfREVWSUNFX0lEX0FURU5fQ1MxMjRVCTB4MjIwMgotI2RlZmluZSBVU0JfREVWSUNFX0lEX0FURU5fMlBPUlRLVk0JMHgyMjA0Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVRFTl80UE9SVEtWTQkweDIyMDUKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9BVEVOXzRQT1JUS1ZNQwkweDIyMDgKLQotI2RlZmluZSBVU0JfVkVORE9SX0lEX1RPUE1BWAkJMHgwNjYzCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfVE9QTUFYX0NPQlJBUEFECTB4MDEwMwotCi0jZGVmaW5lIFVTQl9WRU5ET1JfSURfSEFQUAkJMHgwNzhiCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfVUdDSV9EUklWSU5HCTB4MDAxMAotI2RlZmluZSBVU0JfREVWSUNFX0lEX1VHQ0lfRkxZSU5HCTB4MDAyMAotI2RlZmluZSBVU0JfREVWSUNFX0lEX1VHQ0lfRklHSFRJTkcJMHgwMDMwCi0KLSNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9NR0UJCTB4MDQ2MwotI2RlZmluZSBVU0JfREVWSUNFX0lEX01HRV9VUFMJCTB4ZmZmZgotI2RlZmluZSBVU0JfREVWSUNFX0lEX01HRV9VUFMxCQkweDAwMDEKLQotI2RlZmluZSBVU0JfVkVORE9SX0lEX09OVFJBSwkJMHgwYTA3Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfT05UUkFLX0FEVTEwMAkweDAwNjQKLQotI2RlZmluZSBVU0JfVkVORE9SX0lEX0VTU0VOVElBTF9SRUFMSVRZCTB4MGQ3ZgotI2RlZmluZSBVU0JfREVWSUNFX0lEX0VTU0VOVElBTF9SRUFMSVRZX1A1IDB4MDEwMAotCi0jZGVmaW5lIFVTQl9WRU5ET1JfSURfQTRURUNICQkweDA5ZGEKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9BNFRFQ0hfV0NQMzJQVQkweDAwMDYKLQotI2RlZmluZSBVU0JfVkVORE9SX0lEX0FBU0hJTUEJCTB4MDZkNgotI2RlZmluZSBVU0JfREVWSUNFX0lEX0FBU0hJTUFfR0FNRVBBRAkweDAwMjUKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9BQVNISU1BX1BSRURBVE9SCTB4MDAyNgotCi0jZGVmaW5lIFVTQl9WRU5ET1JfSURfQ1lQUkVTUwkJMHgwNGI0Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfQ1lQUkVTU19NT1VTRQkweDAwMDEKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9DWVBSRVNTX0hJRENPTQkweDU1MDAKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9DWVBSRVNTX1VMVFJBTU9VU0UJMHg3NDE3Ci0KLSNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9CRVJLU0hJUkUJCTB4MGM5OAotI2RlZmluZSBVU0JfREVWSUNFX0lEX0JFUktTSElSRV9QQ1dECTB4MTE0MAotCi0jZGVmaW5lIFVTQl9WRU5ET1JfSURfQUxQUwkJMHgwNDMzCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfSUJNX0dBTUVQQUQJMHgxMTAxCi0KLSNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9TQUlURUsJCTB4MDZhMwotI2RlZmluZSBVU0JfREVWSUNFX0lEX1NBSVRFS19SVU1CTEVQQUQJMHhmZjE3Ci0KLSNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9ORUMJCTB4MDczZQotI2RlZmluZSBVU0JfREVWSUNFX0lEX05FQ19VU0JfR0FNRV9QQUQJMHgwMzAxCi0KLSNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9DSElDCQkweDA1ZmUKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9DSElDX0dBTUVQQUQJMHgwMDE0Ci0KLSNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9HTEFCCQkweDA2YzIKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF80X1BISURHRVRTRVJWT18zMAkweDAwMzgKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF8xX1BISURHRVRTRVJWT18zMAkweDAwMzkKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF8wXzBfNF9JRl9LSVQJMHgwMDQwCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfMF8xNl8xNl9JRl9LSVQJMHgwMDQ0Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfOF84XzhfSUZfS0lUCTB4MDA0NQotI2RlZmluZSBVU0JfREVWSUNFX0lEXzBfOF83X0lGX0tJVAkweDAwNTEKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF8wXzhfOF9JRl9LSVQJMHgwMDUzCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfUEhJREdFVF9NT1RPUkNPTlRST0wJMHgwMDU4Ci0KLSNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9XSVNFR1JPVVAJCTB4MDkyNQotI2RlZmluZSBVU0JfREVWSUNFX0lEXzFfUEhJREdFVFNFUlZPXzIwCTB4ODEwMQotI2RlZmluZSBVU0JfREVWSUNFX0lEXzRfUEhJREdFVFNFUlZPXzIwCTB4ODEwNAotI2RlZmluZSBVU0JfREVWSUNFX0lEXzhfOF80X0lGX0tJVAkweDgyMDEKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9EVUFMX1VTQl9KT1lQQUQgICAweDg4NjYKLQotI2RlZmluZSBVU0JfVkVORE9SX0lEX1dJU0VHUk9VUF9MVEQJMHg2Njc3Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfU01BUlRKT1lfRFVBTF9QTFVTIDB4ODgwMgotCi0jZGVmaW5lIFVTQl9WRU5ET1JfSURfQ09ERU1FUkNTCQkweDA3YzAKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9DT0RFTUVSQ1NfSU9XX0ZJUlNUCTB4MTUwMAotI2RlZmluZSBVU0JfREVWSUNFX0lEX0NPREVNRVJDU19JT1dfTEFTVAkweDE1ZmYKLQotI2RlZmluZSBVU0JfVkVORE9SX0lEX0RFTE9STUUJCTB4MTE2MwotI2RlZmluZSBVU0JfREVWSUNFX0lEX0RFTE9STUVfRUFSVEhNQVRFIDB4MDEwMAotI2RlZmluZSBVU0JfREVWSUNFX0lEX0RFTE9STUVfRU1fTFQyMAkweDAyMDAKLQotI2RlZmluZSBVU0JfVkVORE9SX0lEX01DQwkJMHgwOWRiCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfTUNDX1BNRDEwMjRMUwkweDAwNzYKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9NQ0NfUE1EMTIwOExTCTB4MDA3YQotCi0jZGVmaW5lIFVTQl9WRU5ET1JfSURfVkVSTklFUgkJMHgwOGY3Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfVkVSTklFUl9MQUJQUk8JMHgwMDAxCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfVkVSTklFUl9HT1RFTVAJMHgwMDAyCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfVkVSTklFUl9TS0lQCTB4MDAwMwotI2RlZmluZSBVU0JfREVWSUNFX0lEX1ZFUk5JRVJfQ1lDTE9QUwkweDAwMDQKLQotI2RlZmluZSBVU0JfVkVORE9SX0lEX0xECQkweDBmMTEKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9MRF9DQVNTWQkJMHgxMDAwCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfTERfUE9DS0VUQ0FTU1kJMHgxMDEwCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfTERfTU9CSUxFQ0FTU1kJMHgxMDIwCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfTERfSldNCQkweDEwODAKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9MRF9ETU1QCQkweDEwODEKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9MRF9VTUlQCQkweDEwOTAKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9MRF9YUkFZMQkJMHgxMTAwCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfTERfWFJBWTIJCTB4MTEwMQotI2RlZmluZSBVU0JfREVWSUNFX0lEX0xEX1ZJREVPQ09NCTB4MTIwMAotI2RlZmluZSBVU0JfREVWSUNFX0lEX0xEX0NPTTNMQUIJMHgyMDAwCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfTERfVEVMRVBPUlQJMHgyMDEwCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfTERfTkVUV09SS0FOQUxZU0VSIDB4MjAyMAotI2RlZmluZSBVU0JfREVWSUNFX0lEX0xEX1BPV0VSQ09OVFJPTAkweDIwMzAKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9MRF9NQUNISU5FVEVTVAkweDIwNDAKLQotI2RlZmluZSBVU0JfVkVORE9SX0lEX0FQUExFCQkweDA1YWMKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9NSUdIVFlNT1VTRQkweDAzMDQKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9GT1VOVEFJTl9BTlNJCTB4MDIwZQotI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX0ZPVU5UQUlOX0lTTwkweDAyMGYKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9HRVlTRVJfQU5TSQkweDAyMTQKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9HRVlTRVJfSVNPCTB4MDIxNQotI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUl9KSVMJMHgwMjE2Ci0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfR0VZU0VSM19BTlNJCTB4MDIxNwotI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUjNfSVNPCTB4MDIxOAotI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUjNfSklTCTB4MDIxOQotI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUjRfQU5TSQkweDAyMWEKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9HRVlTRVI0X0lTTwkweDAyMWIKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9HRVlTRVI0X0pJUwkweDAyMWMKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9GT1VOVEFJTl9UUF9PTkxZCTB4MDMwYQotI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUjFfVFBfT05MWQkweDAzMGIKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9JUgkJMHg4MjQwCi0KLSNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9DSEVSUlkJCTB4MDQ2YQotI2RlZmluZSBVU0JfREVWSUNFX0lEX0NIRVJSWV9DWU1PVElPTgkweDAwMjMKLQotI2RlZmluZSBVU0JfVkVORE9SX0lEX1lFQUxJTksJCTB4Njk5MwotI2RlZmluZSBVU0JfREVWSUNFX0lEX1lFQUxJTktfUDFLX1A0S19CMksJMHhiMDAxCi0KLSNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9BTENPUgkJMHgwNThmCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfQUxDT1JfVVNCUlMyMzIJMHg5NzIwCi0KLSNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9TVU4JCTB4MDQzMAotI2RlZmluZSBVU0JfREVWSUNFX0lEX1JBUklUQU5fS1ZNX0RPTkdMRQkweGNkYWIKLQotI2RlZmluZSBVU0JfVkVORE9SX0lEX0FJUkNBQkxFCQkweDE2Q0EKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9BSVJDQUJMRTEJCTB4MTUwMgotCi0jZGVmaW5lIFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gJCTB4MDQ2ZAotI2RlZmluZSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX1VTQl9SRUNFSVZFUgkweGMxMDEKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9VU0JfUkVDRUlWRVJfMgkweGM1MTcKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9ESU5PVk9fRURHRQkweGM3MTQKLQotI2RlZmluZSBVU0JfVkVORE9SX0lEX0lNQVRJT04JCTB4MDcxOAotI2RlZmluZSBVU0JfREVWSUNFX0lEX0RJU0NfU1RBS0tBCTB4ZDAwMAotCi0jZGVmaW5lIFVTQl9WRU5ET1JfSURfUEFOVEhFUkxPUkQJMHgwODEwCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfUEFOVEhFUkxPUkRfVFdJTl9VU0JfSk9ZU1RJQ0sJMHgwMDAxCi0KLSNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9TT05ZCQkJMHgwNTRjCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfU09OWV9QUzNfQ09OVFJPTExFUgkweDAyNjgKLQotLyoKLSAqIEFscGhhYmV0aWNhbGx5IHNvcnRlZCBibGFja2xpc3QgYnkgcXVpcmsgdHlwZS4KLSAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhpZF9ibGFja2xpc3QgewotCV9fdTE2IGlkVmVuZG9yOwotCV9fdTE2IGlkUHJvZHVjdDsKLQl1bnNpZ25lZCBxdWlya3M7Ci19IGhpZF9ibGFja2xpc3RbXSA9IHsKLQotCXsgVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9ESU5PVk9fRURHRSwgSElEX1FVSVJLX0RVUExJQ0FURV9VU0FHRVMgfSwKLQotCXsgVVNCX1ZFTkRPUl9JRF9BSVBURUssIFVTQl9ERVZJQ0VfSURfQUlQVEVLXzAxLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0FJUFRFSywgVVNCX0RFVklDRV9JRF9BSVBURUtfMTAsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfQUlQVEVLLCBVU0JfREVWSUNFX0lEX0FJUFRFS18yMCwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9BSVBURUssIFVTQl9ERVZJQ0VfSURfQUlQVEVLXzIxLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0FJUFRFSywgVVNCX0RFVklDRV9JRF9BSVBURUtfMjIsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfQUlQVEVLLCBVU0JfREVWSUNFX0lEX0FJUFRFS18yMywgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9BSVBURUssIFVTQl9ERVZJQ0VfSURfQUlQVEVLXzI0LCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0FJUkNBQkxFLCBVU0JfREVWSUNFX0lEX0FJUkNBQkxFMSwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9BTENPUiwgVVNCX0RFVklDRV9JRF9BTENPUl9VU0JSUzIzMiwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9CRVJLU0hJUkUsIFVTQl9ERVZJQ0VfSURfQkVSS1NISVJFX1BDV0QsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfQ1lQUkVTUywgVVNCX0RFVklDRV9JRF9DWVBSRVNTX0hJRENPTSwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9DWVBSRVNTLCBVU0JfREVWSUNFX0lEX0NZUFJFU1NfVUxUUkFNT1VTRSwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9ERUxPUk1FLCBVU0JfREVWSUNFX0lEX0RFTE9STUVfRUFSVEhNQVRFLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0RFTE9STUUsIFVTQl9ERVZJQ0VfSURfREVMT1JNRV9FTV9MVDIwLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0VTU0VOVElBTF9SRUFMSVRZLCBVU0JfREVWSUNFX0lEX0VTU0VOVElBTF9SRUFMSVRZX1A1LCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0dMQUIsIFVTQl9ERVZJQ0VfSURfNF9QSElER0VUU0VSVk9fMzAsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR0xBQiwgVVNCX0RFVklDRV9JRF8xX1BISURHRVRTRVJWT18zMCwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9HTEFCLCBVU0JfREVWSUNFX0lEXzBfMF80X0lGX0tJVCwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9HTEFCLCBVU0JfREVWSUNFX0lEXzBfMTZfMTZfSUZfS0lULCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0dMQUIsIFVTQl9ERVZJQ0VfSURfOF84XzhfSUZfS0lULCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0dMQUIsIFVTQl9ERVZJQ0VfSURfMF84XzdfSUZfS0lULCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0dMQUIsIFVTQl9ERVZJQ0VfSURfMF84XzhfSUZfS0lULCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0dMQUIsIFVTQl9ERVZJQ0VfSURfUEhJREdFVF9NT1RPUkNPTlRST0wsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR1JJRkZJTiwgVVNCX0RFVklDRV9JRF9QT1dFUk1BVEUsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR1JJRkZJTiwgVVNCX0RFVklDRV9JRF9TT1VOREtOT0IsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzkwLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT18xMDAsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzEwMSwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fMTAzLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT18xMDQsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzEwNSwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fMTA2LCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT18xMDcsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzEwOCwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fMjAwLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT18yMDEsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzIwMiwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fMjAzLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT18yMDQsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzIwNSwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fMjA2LCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT18yMDcsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzMwMCwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fMzAxLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT18zMDIsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzMwMywgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fMzA0LCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT18zMDUsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzMwNiwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fMzA3LCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT18zMDgsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzMwOSwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fNDAwLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT180MDEsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzQwMiwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fNDAzLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT180MDQsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzQwNSwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fNTAwLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT181MDEsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzUwMiwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fNTAzLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0dUQ08sIFVTQl9ERVZJQ0VfSURfR1RDT181MDQsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzEwMDAsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzEwMDEsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzEwMDIsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzEwMDMsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzEwMDQsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzEwMDUsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfR1RDTywgVVNCX0RFVklDRV9JRF9HVENPXzEwMDYsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfSU1BVElPTiwgVVNCX0RFVklDRV9JRF9ESVNDX1NUQUtLQSwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9LQkdFQVIsIFVTQl9ERVZJQ0VfSURfS0JHRUFSX0pBTVNUVURJTywgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9MRCwgVVNCX0RFVklDRV9JRF9MRF9DQVNTWSwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9MRCwgVVNCX0RFVklDRV9JRF9MRF9QT0NLRVRDQVNTWSwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9MRCwgVVNCX0RFVklDRV9JRF9MRF9NT0JJTEVDQVNTWSwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9MRCwgVVNCX0RFVklDRV9JRF9MRF9KV00sIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfTEQsIFVTQl9ERVZJQ0VfSURfTERfRE1NUCwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9MRCwgVVNCX0RFVklDRV9JRF9MRF9VTUlQLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0xELCBVU0JfREVWSUNFX0lEX0xEX1hSQVkxLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0xELCBVU0JfREVWSUNFX0lEX0xEX1hSQVkyLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0xELCBVU0JfREVWSUNFX0lEX0xEX1ZJREVPQ09NLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0xELCBVU0JfREVWSUNFX0lEX0xEX0NPTTNMQUIsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfTEQsIFVTQl9ERVZJQ0VfSURfTERfVEVMRVBPUlQsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfTEQsIFVTQl9ERVZJQ0VfSURfTERfTkVUV09SS0FOQUxZU0VSLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0xELCBVU0JfREVWSUNFX0lEX0xEX1BPV0VSQ09OVFJPTCwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9MRCwgVVNCX0RFVklDRV9JRF9MRF9NQUNISU5FVEVTVCwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9NQ0MsIFVTQl9ERVZJQ0VfSURfTUNDX1BNRDEwMjRMUywgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9NQ0MsIFVTQl9ERVZJQ0VfSURfTUNDX1BNRDEyMDhMUywgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9NR0UsIFVTQl9ERVZJQ0VfSURfTUdFX1VQUywgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9NR0UsIFVTQl9ERVZJQ0VfSURfTUdFX1VQUzEsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfT05UUkFLLCBVU0JfREVWSUNFX0lEX09OVFJBS19BRFUxMDAsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfT05UUkFLLCBVU0JfREVWSUNFX0lEX09OVFJBS19BRFUxMDAgKyAyMCwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9PTlRSQUssIFVTQl9ERVZJQ0VfSURfT05UUkFLX0FEVTEwMCArIDMwLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX09OVFJBSywgVVNCX0RFVklDRV9JRF9PTlRSQUtfQURVMTAwICsgMTAwLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX09OVFJBSywgVVNCX0RFVklDRV9JRF9PTlRSQUtfQURVMTAwICsgMTA4LCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX09OVFJBSywgVVNCX0RFVklDRV9JRF9PTlRSQUtfQURVMTAwICsgMTE4LCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX09OVFJBSywgVVNCX0RFVklDRV9JRF9PTlRSQUtfQURVMTAwICsgMjAwLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX09OVFJBSywgVVNCX0RFVklDRV9JRF9PTlRSQUtfQURVMTAwICsgMzAwLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX09OVFJBSywgVVNCX0RFVklDRV9JRF9PTlRSQUtfQURVMTAwICsgNDAwLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX09OVFJBSywgVVNCX0RFVklDRV9JRF9PTlRSQUtfQURVMTAwICsgNTAwLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX1ZFUk5JRVIsIFVTQl9ERVZJQ0VfSURfVkVSTklFUl9MQUJQUk8sIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfVkVSTklFUiwgVVNCX0RFVklDRV9JRF9WRVJOSUVSX0dPVEVNUCwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9WRVJOSUVSLCBVU0JfREVWSUNFX0lEX1ZFUk5JRVJfU0tJUCwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9WRVJOSUVSLCBVU0JfREVWSUNFX0lEX1ZFUk5JRVJfQ1lDTE9QUywgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9XSVNFR1JPVVAsIFVTQl9ERVZJQ0VfSURfNF9QSElER0VUU0VSVk9fMjAsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfV0lTRUdST1VQLCBVU0JfREVWSUNFX0lEXzFfUEhJREdFVFNFUlZPXzIwLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX1dJU0VHUk9VUCwgVVNCX0RFVklDRV9JRF84XzhfNF9JRl9LSVQsIEhJRF9RVUlSS19JR05PUkUgfSwKLQl7IFVTQl9WRU5ET1JfSURfWUVBTElOSywgVVNCX0RFVklDRV9JRF9ZRUFMSU5LX1AxS19QNEtfQjJLLCBISURfUVVJUktfSUdOT1JFIH0sCi0KLQl7IFVTQl9WRU5ET1JfSURfQUNFQ0FELCBVU0JfREVWSUNFX0lEX0FDRUNBRF9GTEFJUiwgSElEX1FVSVJLX0lHTk9SRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9BQ0VDQUQsIFVTQl9ERVZJQ0VfSURfQUNFQ0FEXzMwMiwgSElEX1FVSVJLX0lHTk9SRSB9LAotCi0JeyBVU0JfVkVORE9SX0lEX0FURU4sIFVTQl9ERVZJQ0VfSURfQVRFTl9VQzEwMEtNLCBISURfUVVJUktfTk9HRVQgfSwKLQl7IFVTQl9WRU5ET1JfSURfQVRFTiwgVVNCX0RFVklDRV9JRF9BVEVOX0NTMTI0VSwgSElEX1FVSVJLX05PR0VUIH0sCi0JeyBVU0JfVkVORE9SX0lEX0FURU4sIFVTQl9ERVZJQ0VfSURfQVRFTl8yUE9SVEtWTSwgSElEX1FVSVJLX05PR0VUIH0sCi0JeyBVU0JfVkVORE9SX0lEX0FURU4sIFVTQl9ERVZJQ0VfSURfQVRFTl80UE9SVEtWTSwgSElEX1FVSVJLX05PR0VUIH0sCi0JeyBVU0JfVkVORE9SX0lEX0FURU4sIFVTQl9ERVZJQ0VfSURfQVRFTl80UE9SVEtWTUMsIEhJRF9RVUlSS19OT0dFVCB9LAotCXsgVVNCX1ZFTkRPUl9JRF9TVU4sIFVTQl9ERVZJQ0VfSURfUkFSSVRBTl9LVk1fRE9OR0xFLCBISURfUVVJUktfTk9HRVQgfSwKLQl7IFVTQl9WRU5ET1JfSURfV0lTRUdST1VQLCBVU0JfREVWSUNFX0lEX0RVQUxfVVNCX0pPWVBBRCwgSElEX1FVSVJLX05PR0VUIHwgSElEX1FVSVJLX01VTFRJX0lOUFVUIH0sCi0JeyBVU0JfVkVORE9SX0lEX1dJU0VHUk9VUF9MVEQsIFVTQl9ERVZJQ0VfSURfU01BUlRKT1lfRFVBTF9QTFVTLCBISURfUVVJUktfTk9HRVQgfCBISURfUVVJUktfTVVMVElfSU5QVVQgfSwKLQotCXsgVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9NSUdIVFlNT1VTRSwgSElEX1FVSVJLX01JR0hUWU1PVVNFIHwgSElEX1FVSVJLX0lOVkVSVF9IV0hFRUwgfSwKLQl7IFVTQl9WRU5ET1JfSURfQTRURUNILCBVU0JfREVWSUNFX0lEX0E0VEVDSF9XQ1AzMlBVLCBISURfUVVJUktfMldIRUVMX01PVVNFX0hBQ0tfNyB9LAotCXsgVVNCX1ZFTkRPUl9JRF9DWVBSRVNTLCBVU0JfREVWSUNFX0lEX0NZUFJFU1NfTU9VU0UsIEhJRF9RVUlSS18yV0hFRUxfTU9VU0VfSEFDS181IH0sCi0KLQl7IFVTQl9WRU5ET1JfSURfQUFTSElNQSwgVVNCX0RFVklDRV9JRF9BQVNISU1BX0dBTUVQQUQsIEhJRF9RVUlSS19CQURQQUQgfSwKLQl7IFVTQl9WRU5ET1JfSURfQUFTSElNQSwgVVNCX0RFVklDRV9JRF9BQVNISU1BX1BSRURBVE9SLCBISURfUVVJUktfQkFEUEFEIH0sCi0JeyBVU0JfVkVORE9SX0lEX0FMUFMsIFVTQl9ERVZJQ0VfSURfSUJNX0dBTUVQQUQsIEhJRF9RVUlSS19CQURQQUQgfSwKLQl7IFVTQl9WRU5ET1JfSURfQ0hJQywgVVNCX0RFVklDRV9JRF9DSElDX0dBTUVQQUQsIEhJRF9RVUlSS19CQURQQUQgfSwKLQl7IFVTQl9WRU5ET1JfSURfSEFQUCwgVVNCX0RFVklDRV9JRF9VR0NJX0RSSVZJTkcsIEhJRF9RVUlSS19CQURQQUQgfCBISURfUVVJUktfTVVMVElfSU5QVVQgfSwKLQl7IFVTQl9WRU5ET1JfSURfSEFQUCwgVVNCX0RFVklDRV9JRF9VR0NJX0ZMWUlORywgSElEX1FVSVJLX0JBRFBBRCB8IEhJRF9RVUlSS19NVUxUSV9JTlBVVCB9LAotCXsgVVNCX1ZFTkRPUl9JRF9IQVBQLCBVU0JfREVWSUNFX0lEX1VHQ0lfRklHSFRJTkcsIEhJRF9RVUlSS19CQURQQUQgfCBISURfUVVJUktfTVVMVElfSU5QVVQgfSwKLQl7IFVTQl9WRU5ET1JfSURfTkVDLCBVU0JfREVWSUNFX0lEX05FQ19VU0JfR0FNRV9QQUQsIEhJRF9RVUlSS19CQURQQUQgfSwKLQl7IFVTQl9WRU5ET1JfSURfU0FJVEVLLCBVU0JfREVWSUNFX0lEX1NBSVRFS19SVU1CTEVQQUQsIEhJRF9RVUlSS19CQURQQUQgfSwKLQl7IFVTQl9WRU5ET1JfSURfVE9QTUFYLCBVU0JfREVWSUNFX0lEX1RPUE1BWF9DT0JSQVBBRCwgSElEX1FVSVJLX0JBRFBBRCB9LAotCi0JeyBVU0JfVkVORE9SX0lEX0NIRVJSWSwgVVNCX0RFVklDRV9JRF9DSEVSUllfQ1lNT1RJT04sIEhJRF9RVUlSS19DWU1PVElPTiB9LAotCi0JeyBVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0ZPVU5UQUlOX0FOU0ksIEhJRF9RVUlSS19QT1dFUkJPT0tfSEFTX0ZOIHwgSElEX1FVSVJLX0lHTk9SRV9NT1VTRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9GT1VOVEFJTl9JU08sIEhJRF9RVUlSS19QT1dFUkJPT0tfSEFTX0ZOIHwgSElEX1FVSVJLX0lHTk9SRV9NT1VTRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9HRVlTRVJfQU5TSSwgSElEX1FVSVJLX1BPV0VSQk9PS19IQVNfRk4gfCBISURfUVVJUktfSUdOT1JFX01PVVNFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUl9JU08sIEhJRF9RVUlSS19QT1dFUkJPT0tfSEFTX0ZOIHwgSElEX1FVSVJLX0lHTk9SRV9NT1VTRSB8IEhJRF9RVUlSS19QT1dFUkJPT0tfSVNPX0tFWUJPQVJEfSwKLQl7IFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfR0VZU0VSX0pJUywgSElEX1FVSVJLX1BPV0VSQk9PS19IQVNfRk4gfCBISURfUVVJUktfSUdOT1JFX01PVVNFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUjNfQU5TSSwgSElEX1FVSVJLX1BPV0VSQk9PS19IQVNfRk4gfCBISURfUVVJUktfSUdOT1JFX01PVVNFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUjNfSVNPLCBISURfUVVJUktfUE9XRVJCT09LX0hBU19GTiB8IEhJRF9RVUlSS19JR05PUkVfTU9VU0UgfCBISURfUVVJUktfUE9XRVJCT09LX0lTT19LRVlCT0FSRH0sCi0JeyBVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUjNfSklTLCBISURfUVVJUktfUE9XRVJCT09LX0hBU19GTiB8IEhJRF9RVUlSS19JR05PUkVfTU9VU0UgfSwKLQl7IFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfR0VZU0VSNF9BTlNJLCBISURfUVVJUktfUE9XRVJCT09LX0hBU19GTiB8IEhJRF9RVUlSS19JR05PUkVfTU9VU0UgfSwKLQl7IFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfR0VZU0VSNF9JU08sIEhJRF9RVUlSS19QT1dFUkJPT0tfSEFTX0ZOIHwgSElEX1FVSVJLX0lHTk9SRV9NT1VTRSB8IEhJRF9RVUlSS19QT1dFUkJPT0tfSVNPX0tFWUJPQVJEfSwKLQl7IFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfR0VZU0VSNF9KSVMsIEhJRF9RVUlSS19QT1dFUkJPT0tfSEFTX0ZOIHwgSElEX1FVSVJLX0lHTk9SRV9NT1VTRSB9LAotCXsgVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9GT1VOVEFJTl9UUF9PTkxZLCBISURfUVVJUktfUE9XRVJCT09LX0hBU19GTiB8IEhJRF9RVUlSS19JR05PUkVfTU9VU0UgfSwKLQl7IFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfR0VZU0VSMV9UUF9PTkxZLCBISURfUVVJUktfUE9XRVJCT09LX0hBU19GTiB8IEhJRF9RVUlSS19JR05PUkVfTU9VU0UgfSwKLQotCXsgVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9JUiwgSElEX1FVSVJLX0lHTk9SRSB9LAotCi0JeyBVU0JfVkVORE9SX0lEX1BBTkpJVCwgMHgwMDAxLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX1BBTkpJVCwgMHgwMDAyLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX1BBTkpJVCwgMHgwMDAzLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX1BBTkpJVCwgMHgwMDA0LCBISURfUVVJUktfSUdOT1JFIH0sCi0KLQl7IFVTQl9WRU5ET1JfSURfVFVSQk9YLCBVU0JfREVWSUNFX0lEX1RVUkJPWF9LRVlCT0FSRCwgSElEX1FVSVJLX05PR0VUIH0sCi0KLQl7IFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfVVNCX1JFQ0VJVkVSLCBISURfUVVJUktfQkFEX1JFTEFUSVZFX0tFWVMgfSwKLQl7IFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfVVNCX1JFQ0VJVkVSXzIsIEhJRF9RVUlSS19MT0dJVEVDSF9TNTEwX0RFU0NSSVBUT1IgfSwKLQotCXsgVVNCX1ZFTkRPUl9JRF9QQU5USEVSTE9SRCwgVVNCX0RFVklDRV9JRF9QQU5USEVSTE9SRF9UV0lOX1VTQl9KT1lTVElDSywgSElEX1FVSVJLX01VTFRJX0lOUFVUIHwgSElEX1FVSVJLX1NLSVBfT1VUUFVUX1JFUE9SVFMgfSwKLQotCXsgVVNCX1ZFTkRPUl9JRF9TT05ZLCBVU0JfREVWSUNFX0lEX1NPTllfUFMzX0NPTlRST0xMRVIsIEhJRF9RVUlSS19TT05ZX1BTM19DT05UUk9MTEVSIH0sCi0KLQl7IFVTQl9WRU5ET1JfSURfQ0lEQywgMHgwMTAzLCBISURfUVVJUktfSUdOT1JFIH0sCi0KLQl7IDAsIDAgfQotfTsKLQotLyoKLSAqIFRyYXZlcnNlIHRoZSBzdXBwbGllZCBsaXN0IG9mIHJlcG9ydHMgYW5kIGZpbmQgdGhlIGxvbmdlc3QKLSAqLwotc3RhdGljIHZvaWQgaGlkX2ZpbmRfbWF4X3JlcG9ydChzdHJ1Y3QgaGlkX2RldmljZSAqaGlkLCB1bnNpZ25lZCBpbnQgdHlwZSwgaW50ICptYXgpCi17Ci0Jc3RydWN0IGhpZF9yZXBvcnQgKnJlcG9ydDsKLQlpbnQgc2l6ZTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkocmVwb3J0LCAmaGlkLT5yZXBvcnRfZW51bVt0eXBlXS5yZXBvcnRfbGlzdCwgbGlzdCkgewotCQlzaXplID0gKChyZXBvcnQtPnNpemUgLSAxKSA+PiAzKSArIDE7Ci0JCWlmICh0eXBlID09IEhJRF9JTlBVVF9SRVBPUlQgJiYgaGlkLT5yZXBvcnRfZW51bVt0eXBlXS5udW1iZXJlZCkKLQkJCXNpemUrKzsKLQkJaWYgKCptYXggPCBzaXplKQotCQkJKm1heCA9IHNpemU7Ci0JfQotfQotCi1zdGF0aWMgaW50IGhpZF9hbGxvY19idWZmZXJzKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIHN0cnVjdCBoaWRfZGV2aWNlICpoaWQpCi17Ci0Jc3RydWN0IHVzYmhpZF9kZXZpY2UgKnVzYmhpZCA9IGhpZC0+ZHJpdmVyX2RhdGE7Ci0KLQlpZiAoISh1c2JoaWQtPmluYnVmID0gdXNiX2J1ZmZlcl9hbGxvYyhkZXYsIHVzYmhpZC0+YnVmc2l6ZSwgR0ZQX0FUT01JQywgJnVzYmhpZC0+aW5idWZfZG1hKSkpCi0JCXJldHVybiAtMTsKLQlpZiAoISh1c2JoaWQtPm91dGJ1ZiA9IHVzYl9idWZmZXJfYWxsb2MoZGV2LCB1c2JoaWQtPmJ1ZnNpemUsIEdGUF9BVE9NSUMsICZ1c2JoaWQtPm91dGJ1Zl9kbWEpKSkKLQkJcmV0dXJuIC0xOwotCWlmICghKHVzYmhpZC0+Y3IgPSB1c2JfYnVmZmVyX2FsbG9jKGRldiwgc2l6ZW9mKCoodXNiaGlkLT5jcikpLCBHRlBfQVRPTUlDLCAmdXNiaGlkLT5jcl9kbWEpKSkKLQkJcmV0dXJuIC0xOwotCWlmICghKHVzYmhpZC0+Y3RybGJ1ZiA9IHVzYl9idWZmZXJfYWxsb2MoZGV2LCB1c2JoaWQtPmJ1ZnNpemUsIEdGUF9BVE9NSUMsICZ1c2JoaWQtPmN0cmxidWZfZG1hKSkpCi0JCXJldHVybiAtMTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBoaWRfZnJlZV9idWZmZXJzKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIHN0cnVjdCBoaWRfZGV2aWNlICpoaWQpCi17Ci0Jc3RydWN0IHVzYmhpZF9kZXZpY2UgKnVzYmhpZCA9IGhpZC0+ZHJpdmVyX2RhdGE7Ci0KLQlpZiAodXNiaGlkLT5pbmJ1ZikKLQkJdXNiX2J1ZmZlcl9mcmVlKGRldiwgdXNiaGlkLT5idWZzaXplLCB1c2JoaWQtPmluYnVmLCB1c2JoaWQtPmluYnVmX2RtYSk7Ci0JaWYgKHVzYmhpZC0+b3V0YnVmKQotCQl1c2JfYnVmZmVyX2ZyZWUoZGV2LCB1c2JoaWQtPmJ1ZnNpemUsIHVzYmhpZC0+b3V0YnVmLCB1c2JoaWQtPm91dGJ1Zl9kbWEpOwotCWlmICh1c2JoaWQtPmNyKQotCQl1c2JfYnVmZmVyX2ZyZWUoZGV2LCBzaXplb2YoKih1c2JoaWQtPmNyKSksIHVzYmhpZC0+Y3IsIHVzYmhpZC0+Y3JfZG1hKTsKLQlpZiAodXNiaGlkLT5jdHJsYnVmKQotCQl1c2JfYnVmZmVyX2ZyZWUoZGV2LCB1c2JoaWQtPmJ1ZnNpemUsIHVzYmhpZC0+Y3RybGJ1ZiwgdXNiaGlkLT5jdHJsYnVmX2RtYSk7Ci19Ci0KLS8qCi0gKiBDaGVycnkgQ3ltb3Rpb24ga2V5Ym9hcmQgaGF2ZSBhbiBpbnZhbGlkIEhJRCByZXBvcnQgZGVzY3JpcHRvciwKLSAqIHRoYXQgbmVlZHMgZml4aW5nIGJlZm9yZSB3ZSBjYW4gcGFyc2UgaXQuCi0gKi8KLQotc3RhdGljIHZvaWQgaGlkX2ZpeHVwX2N5bW90aW9uX2Rlc2NyaXB0b3IoY2hhciAqcmRlc2MsIGludCByc2l6ZSkKLXsKLQlpZiAocnNpemUgPj0gMTcgJiYgcmRlc2NbMTFdID09IDB4M2MgJiYgcmRlc2NbMTJdID09IDB4MDIpIHsKLQkJaW5mbygiRml4aW5nIHVwIENoZXJyeSBDeW1vdGlvbiByZXBvcnQgZGVzY3JpcHRvciIpOwotCQlyZGVzY1sxMV0gPSByZGVzY1sxNl0gPSAweGZmOwotCQlyZGVzY1sxMl0gPSByZGVzY1sxN10gPSAweDAzOwotCX0KLX0KLQotLyoKLSAqIFNlbmRpbmcgSElEX1JFUV9HRVRfUkVQT1JUIGNoYW5nZXMgdGhlIG9wZXJhdGlvbiBtb2RlIG9mIHRoZSBwczMgY29udHJvbGxlcgotICogdG8gIm9wZXJhdGlvbmFsIi4gIFdpdGhvdXQgdGhpcywgdGhlIHBzMyBjb250cm9sbGVyIHdpbGwgbm90IHJlcG9ydCBhbnkKLSAqIGV2ZW50cy4KLSAqLwotc3RhdGljIHZvaWQgaGlkX2ZpeHVwX3NvbnlfcHMzX2NvbnRyb2xsZXIoc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgaW50IGlmbnVtKQotewotCWludCByZXN1bHQ7Ci0JY2hhciAqYnVmID0ga21hbGxvYygxOCwgR0ZQX0tFUk5FTCk7Ci0KLQlpZiAoIWJ1ZikKLQkJcmV0dXJuOwotCi0JcmVzdWx0ID0gdXNiX2NvbnRyb2xfbXNnKGRldiwgdXNiX3JjdmN0cmxwaXBlKGRldiwgMCksCi0JCQkJIEhJRF9SRVFfR0VUX1JFUE9SVCwKLQkJCQkgVVNCX0RJUl9JTiB8IFVTQl9UWVBFX0NMQVNTIHwKLQkJCQkgVVNCX1JFQ0lQX0lOVEVSRkFDRSwKLQkJCQkgKDMgPDwgOCkgfCAweGYyLCBpZm51bSwgYnVmLCAxNywKLQkJCQkgVVNCX0NUUkxfR0VUX1RJTUVPVVQpOwotCi0JaWYgKHJlc3VsdCA8IDApCi0JCWVycigiJXMgZmFpbGVkOiAlZFxuIiwgX19mdW5jX18sIHJlc3VsdCk7Ci0KLQlrZnJlZShidWYpOwotfQotCi0vKgotICogTG9naXRlY2ggUzUxMCBrZXlib2FyZCBzZW5kcyBpbiByZXBvcnQgIzMga2V5cyB3aGljaCBhcmUgZmFyCi0gKiBhYm92ZSB0aGUgbG9naWNhbCBtYXhpbXVtIGRlc2NyaWJlZCBpbiBkZXNjcmlwdG9yLiBUaGlzIGV4dGVuZHMKLSAqIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiAweDI4YyBvZiBsb2dpY2FsIG1heGltdW0gdG8gMHgxMDRkCi0gKi8KLXN0YXRpYyB2b2lkIGhpZF9maXh1cF9zNTEwX2Rlc2NyaXB0b3IodW5zaWduZWQgY2hhciAqcmRlc2MsIGludCByc2l6ZSkKLXsKLQlpZiAocnNpemUgPj0gOTAgJiYgcmRlc2NbODNdID09IDB4MjYKLQkJCSYmIHJkZXNjWzg0XSA9PSAweDhjCi0JCQkmJiByZGVzY1s4NV0gPT0gMHgwMikgewotCQlpbmZvKCJGaXhpbmcgdXAgTG9naXRlY2ggUzUxMCByZXBvcnQgZGVzY3JpcHRvciIpOwotCQlyZGVzY1s4NF0gPSByZGVzY1s4OV0gPSAweDRkOwotCQlyZGVzY1s4NV0gPSByZGVzY1s5MF0gPSAweDEwOwotCX0KLX0KLQotc3RhdGljIHN0cnVjdCBoaWRfZGV2aWNlICp1c2JfaGlkX2NvbmZpZ3VyZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKLXsKLQlzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICppbnRlcmZhY2UgPSBpbnRmLT5jdXJfYWx0c2V0dGluZzsKLQlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldiAoaW50Zik7Ci0Jc3RydWN0IGhpZF9kZXNjcmlwdG9yICpoZGVzYzsKLQlzdHJ1Y3QgaGlkX2RldmljZSAqaGlkOwotCXVuc2lnbmVkIHF1aXJrcyA9IDAsIHJzaXplID0gMDsKLQljaGFyICpyZGVzYzsKLQlpbnQgbiwgbGVuLCBpbnNpemUgPSAwOwotCXN0cnVjdCB1c2JoaWRfZGV2aWNlICp1c2JoaWQ7Ci0KLQkvKiBJZ25vcmUgYWxsIFdhY29tIGRldmljZXMgKi8KLQlpZiAobGUxNl90b19jcHUoZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKSA9PSBVU0JfVkVORE9SX0lEX1dBQ09NKQotCQlyZXR1cm4gTlVMTDsKLQkvKiBpZ25vcmUgYWxsIENvZGUgTWVyY2VuYXJpZXMgSU9XYXJyaW9yIGRldmljZXMgKi8KLQlpZiAobGUxNl90b19jcHUoZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKSA9PSBVU0JfVkVORE9SX0lEX0NPREVNRVJDUykKLQkJaWYgKGxlMTZfdG9fY3B1KGRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpID49IFVTQl9ERVZJQ0VfSURfQ09ERU1FUkNTX0lPV19GSVJTVCAmJgotCQkgICAgbGUxNl90b19jcHUoZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCkgPD0gVVNCX0RFVklDRV9JRF9DT0RFTUVSQ1NfSU9XX0xBU1QpCi0JCQlyZXR1cm4gTlVMTDsKLQotCWZvciAobiA9IDA7IGhpZF9ibGFja2xpc3Rbbl0uaWRWZW5kb3I7IG4rKykKLQkJaWYgKChoaWRfYmxhY2tsaXN0W25dLmlkVmVuZG9yID09IGxlMTZfdG9fY3B1KGRldi0+ZGVzY3JpcHRvci5pZFZlbmRvcikpICYmCi0JCQkoaGlkX2JsYWNrbGlzdFtuXS5pZFByb2R1Y3QgPT0gbGUxNl90b19jcHUoZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCkpKQotCQkJCXF1aXJrcyA9IGhpZF9ibGFja2xpc3Rbbl0ucXVpcmtzOwotCi0JLyogTWFueSBrZXlib2FyZHMgYW5kIG1pY2UgZG9uJ3QgbGlrZSB0byBiZSBwb2xsZWQgZm9yIHJlcG9ydHMsCi0JICogc28gd2Ugd2lsbCBhbHdheXMgc2V0IHRoZSBISURfUVVJUktfTk9HRVQgZmxhZyBmb3IgdGhlbS4gKi8KLQlpZiAoaW50ZXJmYWNlLT5kZXNjLmJJbnRlcmZhY2VTdWJDbGFzcyA9PSBVU0JfSU5URVJGQUNFX1NVQkNMQVNTX0JPT1QpIHsKLQkJaWYgKGludGVyZmFjZS0+ZGVzYy5iSW50ZXJmYWNlUHJvdG9jb2wgPT0gVVNCX0lOVEVSRkFDRV9QUk9UT0NPTF9LRVlCT0FSRCB8fAotCQkJaW50ZXJmYWNlLT5kZXNjLmJJbnRlcmZhY2VQcm90b2NvbCA9PSBVU0JfSU5URVJGQUNFX1BST1RPQ09MX01PVVNFKQotCQkJCXF1aXJrcyB8PSBISURfUVVJUktfTk9HRVQ7Ci0JfQotCi0JaWYgKHF1aXJrcyAmIEhJRF9RVUlSS19JR05PUkUpCi0JCXJldHVybiBOVUxMOwotCi0JaWYgKChxdWlya3MgJiBISURfUVVJUktfSUdOT1JFX01PVVNFKSAmJgotCQkoaW50ZXJmYWNlLT5kZXNjLmJJbnRlcmZhY2VQcm90b2NvbCA9PSBVU0JfSU5URVJGQUNFX1BST1RPQ09MX01PVVNFKSkKLQkJCXJldHVybiBOVUxMOwotCi0KLQlpZiAodXNiX2dldF9leHRyYV9kZXNjcmlwdG9yKGludGVyZmFjZSwgSElEX0RUX0hJRCwgJmhkZXNjKSAmJgotCSAgICAoIWludGVyZmFjZS0+ZGVzYy5iTnVtRW5kcG9pbnRzIHx8Ci0JICAgICB1c2JfZ2V0X2V4dHJhX2Rlc2NyaXB0b3IoJmludGVyZmFjZS0+ZW5kcG9pbnRbMF0sIEhJRF9EVF9ISUQsICZoZGVzYykpKSB7Ci0JCWRiZygiY2xhc3MgZGVzY3JpcHRvciBub3QgcHJlc2VudFxuIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCWZvciAobiA9IDA7IG4gPCBoZGVzYy0+Yk51bURlc2NyaXB0b3JzOyBuKyspCi0JCWlmIChoZGVzYy0+ZGVzY1tuXS5iRGVzY3JpcHRvclR5cGUgPT0gSElEX0RUX1JFUE9SVCkKLQkJCXJzaXplID0gbGUxNl90b19jcHUoaGRlc2MtPmRlc2Nbbl0ud0Rlc2NyaXB0b3JMZW5ndGgpOwotCi0JaWYgKCFyc2l6ZSB8fCByc2l6ZSA+IEhJRF9NQVhfREVTQ1JJUFRPUl9TSVpFKSB7Ci0JCWRiZygid2VpcmQgc2l6ZSBvZiByZXBvcnQgZGVzY3JpcHRvciAoJXUpIiwgcnNpemUpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlpZiAoIShyZGVzYyA9IGttYWxsb2MocnNpemUsIEdGUF9LRVJORUwpKSkgewotCQlkYmcoImNvdWxkbid0IGFsbG9jYXRlIHJkZXNjIG1lbW9yeSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQloaWRfc2V0X2lkbGUoZGV2LCBpbnRlcmZhY2UtPmRlc2MuYkludGVyZmFjZU51bWJlciwgMCwgMCk7Ci0KLQlpZiAoKG4gPSBoaWRfZ2V0X2NsYXNzX2Rlc2NyaXB0b3IoZGV2LCBpbnRlcmZhY2UtPmRlc2MuYkludGVyZmFjZU51bWJlciwgSElEX0RUX1JFUE9SVCwgcmRlc2MsIHJzaXplKSkgPCAwKSB7Ci0JCWRiZygicmVhZGluZyByZXBvcnQgZGVzY3JpcHRvciBmYWlsZWQiKTsKLQkJa2ZyZWUocmRlc2MpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlpZiAoKHF1aXJrcyAmIEhJRF9RVUlSS19DWU1PVElPTikpCi0JCWhpZF9maXh1cF9jeW1vdGlvbl9kZXNjcmlwdG9yKHJkZXNjLCByc2l6ZSk7Ci0KLQlpZiAocXVpcmtzICYgSElEX1FVSVJLX0xPR0lURUNIX1M1MTBfREVTQ1JJUFRPUikKLQkJaGlkX2ZpeHVwX3M1MTBfZGVzY3JpcHRvcihyZGVzYywgcnNpemUpOwotCi0jaWZkZWYgQ09ORklHX0hJRF9ERUJVRwotCXByaW50ayhLRVJOX0RFQlVHIF9fRklMRV9fICI6IHJlcG9ydCBkZXNjcmlwdG9yIChzaXplICV1LCByZWFkICVkKSA9ICIsIHJzaXplLCBuKTsKLQlmb3IgKG4gPSAwOyBuIDwgcnNpemU7IG4rKykKLQkJcHJpbnRrKCIgJTAyeCIsICh1bnNpZ25lZCBjaGFyKSByZGVzY1tuXSk7Ci0JcHJpbnRrKCJcbiIpOwotI2VuZGlmCi0KLQlpZiAoIShoaWQgPSBoaWRfcGFyc2VfcmVwb3J0KHJkZXNjLCBuKSkpIHsKLQkJZGJnKCJwYXJzaW5nIHJlcG9ydCBkZXNjcmlwdG9yIGZhaWxlZCIpOwotCQlrZnJlZShyZGVzYyk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCWtmcmVlKHJkZXNjKTsKLQloaWQtPnF1aXJrcyA9IHF1aXJrczsKLQotCWlmICghKHVzYmhpZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB1c2JoaWRfZGV2aWNlKSwgR0ZQX0tFUk5FTCkpKQotCQlnb3RvIGZhaWw7Ci0KLQloaWQtPmRyaXZlcl9kYXRhID0gdXNiaGlkOwotCXVzYmhpZC0+aGlkID0gaGlkOwotCi0JdXNiaGlkLT5idWZzaXplID0gSElEX01JTl9CVUZGRVJfU0laRTsKLQloaWRfZmluZF9tYXhfcmVwb3J0KGhpZCwgSElEX0lOUFVUX1JFUE9SVCwgJnVzYmhpZC0+YnVmc2l6ZSk7Ci0JaGlkX2ZpbmRfbWF4X3JlcG9ydChoaWQsIEhJRF9PVVRQVVRfUkVQT1JULCAmdXNiaGlkLT5idWZzaXplKTsKLQloaWRfZmluZF9tYXhfcmVwb3J0KGhpZCwgSElEX0ZFQVRVUkVfUkVQT1JULCAmdXNiaGlkLT5idWZzaXplKTsKLQotCWlmICh1c2JoaWQtPmJ1ZnNpemUgPiBISURfTUFYX0JVRkZFUl9TSVpFKQotCQl1c2JoaWQtPmJ1ZnNpemUgPSBISURfTUFYX0JVRkZFUl9TSVpFOwotCi0JaGlkX2ZpbmRfbWF4X3JlcG9ydChoaWQsIEhJRF9JTlBVVF9SRVBPUlQsICZpbnNpemUpOwotCi0JaWYgKGluc2l6ZSA+IEhJRF9NQVhfQlVGRkVSX1NJWkUpCi0JCWluc2l6ZSA9IEhJRF9NQVhfQlVGRkVSX1NJWkU7Ci0KLQlpZiAoaGlkX2FsbG9jX2J1ZmZlcnMoZGV2LCBoaWQpKSB7Ci0JCWhpZF9mcmVlX2J1ZmZlcnMoZGV2LCBoaWQpOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0JZm9yIChuID0gMDsgbiA8IGludGVyZmFjZS0+ZGVzYy5iTnVtRW5kcG9pbnRzOyBuKyspIHsKLQotCQlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVuZHBvaW50OwotCQlpbnQgcGlwZTsKLQkJaW50IGludGVydmFsOwotCi0JCWVuZHBvaW50ID0gJmludGVyZmFjZS0+ZW5kcG9pbnRbbl0uZGVzYzsKLQkJaWYgKChlbmRwb2ludC0+Ym1BdHRyaWJ1dGVzICYgMykgIT0gMykJCS8qIE5vdCBhbiBpbnRlcnJ1cHQgZW5kcG9pbnQgKi8KLQkJCWNvbnRpbnVlOwotCi0JCWludGVydmFsID0gZW5kcG9pbnQtPmJJbnRlcnZhbDsKLQotCQkvKiBDaGFuZ2UgdGhlIHBvbGxpbmcgaW50ZXJ2YWwgb2YgbWljZS4gKi8KLQkJaWYgKGhpZC0+Y29sbGVjdGlvbi0+dXNhZ2UgPT0gSElEX0dEX01PVVNFICYmIGhpZF9tb3VzZXBvbGxfaW50ZXJ2YWwgPiAwKQotCQkJaW50ZXJ2YWwgPSBoaWRfbW91c2Vwb2xsX2ludGVydmFsOwotCi0JCWlmICh1c2JfZW5kcG9pbnRfZGlyX2luKGVuZHBvaW50KSkgewotCQkJaWYgKHVzYmhpZC0+dXJiaW4pCi0JCQkJY29udGludWU7Ci0JCQlpZiAoISh1c2JoaWQtPnVyYmluID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKSkpCi0JCQkJZ290byBmYWlsOwotCQkJcGlwZSA9IHVzYl9yY3ZpbnRwaXBlKGRldiwgZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MpOwotCQkJdXNiX2ZpbGxfaW50X3VyYih1c2JoaWQtPnVyYmluLCBkZXYsIHBpcGUsIHVzYmhpZC0+aW5idWYsIGluc2l6ZSwKLQkJCQkJIGhpZF9pcnFfaW4sIGhpZCwgaW50ZXJ2YWwpOwotCQkJdXNiaGlkLT51cmJpbi0+dHJhbnNmZXJfZG1hID0gdXNiaGlkLT5pbmJ1Zl9kbWE7Ci0JCQl1c2JoaWQtPnVyYmluLT50cmFuc2Zlcl9mbGFncyB8PSBVUkJfTk9fVFJBTlNGRVJfRE1BX01BUDsKLQkJfSBlbHNlIHsKLQkJCWlmICh1c2JoaWQtPnVyYm91dCkKLQkJCQljb250aW51ZTsKLQkJCWlmICghKHVzYmhpZC0+dXJib3V0ID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKSkpCi0JCQkJZ290byBmYWlsOwotCQkJcGlwZSA9IHVzYl9zbmRpbnRwaXBlKGRldiwgZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MpOwotCQkJdXNiX2ZpbGxfaW50X3VyYih1c2JoaWQtPnVyYm91dCwgZGV2LCBwaXBlLCB1c2JoaWQtPm91dGJ1ZiwgMCwKLQkJCQkJIGhpZF9pcnFfb3V0LCBoaWQsIGludGVydmFsKTsKLQkJCXVzYmhpZC0+dXJib3V0LT50cmFuc2Zlcl9kbWEgPSB1c2JoaWQtPm91dGJ1Zl9kbWE7Ci0JCQl1c2JoaWQtPnVyYm91dC0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX05PX1RSQU5TRkVSX0RNQV9NQVA7Ci0JCX0KLQl9Ci0KLQlpZiAoIXVzYmhpZC0+dXJiaW4pIHsKLQkJZXJyKCJjb3VsZG4ndCBmaW5kIGFuIGlucHV0IGludGVycnVwdCBlbmRwb2ludCIpOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0JaW5pdF93YWl0cXVldWVfaGVhZCgmaGlkLT53YWl0KTsKLQotCUlOSVRfV09SSygmdXNiaGlkLT5yZXNldF93b3JrLCBoaWRfcmVzZXQpOwotCXNldHVwX3RpbWVyKCZ1c2JoaWQtPmlvX3JldHJ5LCBoaWRfcmV0cnlfdGltZW91dCwgKHVuc2lnbmVkIGxvbmcpIGhpZCk7Ci0KLQlzcGluX2xvY2tfaW5pdCgmdXNiaGlkLT5pbmxvY2spOwotCXNwaW5fbG9ja19pbml0KCZ1c2JoaWQtPm91dGxvY2spOwotCXNwaW5fbG9ja19pbml0KCZ1c2JoaWQtPmN0cmxsb2NrKTsKLQotCWhpZC0+dmVyc2lvbiA9IGxlMTZfdG9fY3B1KGhkZXNjLT5iY2RISUQpOwotCWhpZC0+Y291bnRyeSA9IGhkZXNjLT5iQ291bnRyeUNvZGU7Ci0JaGlkLT5kZXYgPSAmaW50Zi0+ZGV2OwotCXVzYmhpZC0+aW50ZiA9IGludGY7Ci0JdXNiaGlkLT5pZm51bSA9IGludGVyZmFjZS0+ZGVzYy5iSW50ZXJmYWNlTnVtYmVyOwotCi0JaGlkLT5uYW1lWzBdID0gMDsKLQotCWlmIChkZXYtPm1hbnVmYWN0dXJlcikKLQkJc3RybGNweShoaWQtPm5hbWUsIGRldi0+bWFudWZhY3R1cmVyLCBzaXplb2YoaGlkLT5uYW1lKSk7Ci0KLQlpZiAoZGV2LT5wcm9kdWN0KSB7Ci0JCWlmIChkZXYtPm1hbnVmYWN0dXJlcikKLQkJCXN0cmxjYXQoaGlkLT5uYW1lLCAiICIsIHNpemVvZihoaWQtPm5hbWUpKTsKLQkJc3RybGNhdChoaWQtPm5hbWUsIGRldi0+cHJvZHVjdCwgc2l6ZW9mKGhpZC0+bmFtZSkpOwotCX0KLQotCWlmICghc3RybGVuKGhpZC0+bmFtZSkpCi0JCXNucHJpbnRmKGhpZC0+bmFtZSwgc2l6ZW9mKGhpZC0+bmFtZSksICJISUQgJTA0eDolMDR4IiwKLQkJCSBsZTE2X3RvX2NwdShkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IpLAotCQkJIGxlMTZfdG9fY3B1KGRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpKTsKLQotCWhpZC0+YnVzID0gQlVTX1VTQjsKLQloaWQtPnZlbmRvciA9IGxlMTZfdG9fY3B1KGRldi0+ZGVzY3JpcHRvci5pZFZlbmRvcik7Ci0JaGlkLT5wcm9kdWN0ID0gbGUxNl90b19jcHUoZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCk7Ci0KLQl1c2JfbWFrZV9wYXRoKGRldiwgaGlkLT5waHlzLCBzaXplb2YoaGlkLT5waHlzKSk7Ci0Jc3RybGNhdChoaWQtPnBoeXMsICIvaW5wdXQiLCBzaXplb2YoaGlkLT5waHlzKSk7Ci0JbGVuID0gc3RybGVuKGhpZC0+cGh5cyk7Ci0JaWYgKGxlbiA8IHNpemVvZihoaWQtPnBoeXMpIC0gMSkKLQkJc25wcmludGYoaGlkLT5waHlzICsgbGVuLCBzaXplb2YoaGlkLT5waHlzKSAtIGxlbiwKLQkJCSAiJWQiLCBpbnRmLT5hbHRzZXR0aW5nWzBdLmRlc2MuYkludGVyZmFjZU51bWJlcik7Ci0KLQlpZiAodXNiX3N0cmluZyhkZXYsIGRldi0+ZGVzY3JpcHRvci5pU2VyaWFsTnVtYmVyLCBoaWQtPnVuaXEsIDY0KSA8PSAwKQotCQloaWQtPnVuaXFbMF0gPSAwOwotCi0JdXNiaGlkLT51cmJjdHJsID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXVzYmhpZC0+dXJiY3RybCkKLQkJZ290byBmYWlsOwotCi0JdXNiX2ZpbGxfY29udHJvbF91cmIodXNiaGlkLT51cmJjdHJsLCBkZXYsIDAsICh2b2lkICopIHVzYmhpZC0+Y3IsCi0JCQkgICAgIHVzYmhpZC0+Y3RybGJ1ZiwgMSwgaGlkX2N0cmwsIGhpZCk7Ci0JdXNiaGlkLT51cmJjdHJsLT5zZXR1cF9kbWEgPSB1c2JoaWQtPmNyX2RtYTsKLQl1c2JoaWQtPnVyYmN0cmwtPnRyYW5zZmVyX2RtYSA9IHVzYmhpZC0+Y3RybGJ1Zl9kbWE7Ci0JdXNiaGlkLT51cmJjdHJsLT50cmFuc2Zlcl9mbGFncyB8PSAoVVJCX05PX1RSQU5TRkVSX0RNQV9NQVAgfCBVUkJfTk9fU0VUVVBfRE1BX01BUCk7Ci0JaGlkLT5oaWRpbnB1dF9pbnB1dF9ldmVudCA9IHVzYl9oaWRpbnB1dF9pbnB1dF9ldmVudDsKLQloaWQtPmhpZF9vcGVuID0gdXNiaGlkX29wZW47Ci0JaGlkLT5oaWRfY2xvc2UgPSB1c2JoaWRfY2xvc2U7Ci0jaWZkZWYgQ09ORklHX1VTQl9ISURERVYKLQloaWQtPmhpZGRldl9oaWRfZXZlbnQgPSBoaWRkZXZfaGlkX2V2ZW50OwotCWhpZC0+aGlkZGV2X3JlcG9ydF9ldmVudCA9IGhpZGRldl9yZXBvcnRfZXZlbnQ7Ci0jZW5kaWYKLQlyZXR1cm4gaGlkOwotCi1mYWlsOgotCXVzYl9mcmVlX3VyYih1c2JoaWQtPnVyYmluKTsKLQl1c2JfZnJlZV91cmIodXNiaGlkLT51cmJvdXQpOwotCXVzYl9mcmVlX3VyYih1c2JoaWQtPnVyYmN0cmwpOwotCWhpZF9mcmVlX2J1ZmZlcnMoZGV2LCBoaWQpOwotCWhpZF9mcmVlX2RldmljZShoaWQpOwotCi0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkIGhpZF9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQotewotCXN0cnVjdCBoaWRfZGV2aWNlICpoaWQgPSB1c2JfZ2V0X2ludGZkYXRhIChpbnRmKTsKLQlzdHJ1Y3QgdXNiaGlkX2RldmljZSAqdXNiaGlkOwotCi0JaWYgKCFoaWQpCi0JCXJldHVybjsKLQotCXVzYmhpZCA9IGhpZC0+ZHJpdmVyX2RhdGE7Ci0KLQlzcGluX2xvY2tfaXJxKCZ1c2JoaWQtPmlubG9jayk7CS8qIFN5bmMgd2l0aCBlcnJvciBoYW5kbGVyICovCi0JdXNiX3NldF9pbnRmZGF0YShpbnRmLCBOVUxMKTsKLQlzcGluX3VubG9ja19pcnEoJnVzYmhpZC0+aW5sb2NrKTsKLQl1c2Jfa2lsbF91cmIodXNiaGlkLT51cmJpbik7Ci0JdXNiX2tpbGxfdXJiKHVzYmhpZC0+dXJib3V0KTsKLQl1c2Jfa2lsbF91cmIodXNiaGlkLT51cmJjdHJsKTsKLQotCWRlbF90aW1lcl9zeW5jKCZ1c2JoaWQtPmlvX3JldHJ5KTsKLQlmbHVzaF9zY2hlZHVsZWRfd29yaygpOwotCi0JaWYgKGhpZC0+Y2xhaW1lZCAmIEhJRF9DTEFJTUVEX0lOUFVUKQotCQloaWRpbnB1dF9kaXNjb25uZWN0KGhpZCk7Ci0JaWYgKGhpZC0+Y2xhaW1lZCAmIEhJRF9DTEFJTUVEX0hJRERFVikKLQkJaGlkZGV2X2Rpc2Nvbm5lY3QoaGlkKTsKLQotCXVzYl9mcmVlX3VyYih1c2JoaWQtPnVyYmluKTsKLQl1c2JfZnJlZV91cmIodXNiaGlkLT51cmJjdHJsKTsKLQl1c2JfZnJlZV91cmIodXNiaGlkLT51cmJvdXQpOwotCi0JaGlkX2ZyZWVfYnVmZmVycyhoaWRfdG9fdXNiX2RldihoaWQpLCBoaWQpOwotCWhpZF9mcmVlX2RldmljZShoaWQpOwotfQotCi1zdGF0aWMgaW50IGhpZF9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQotewotCXN0cnVjdCBoaWRfZGV2aWNlICpoaWQ7Ci0JY2hhciBwYXRoWzY0XTsKLQlpbnQgaTsKLQljaGFyICpjOwotCi0JZGJnKCJISUQgcHJvYmUgY2FsbGVkIGZvciBpZm51bSAlZCIsCi0JCQlpbnRmLT5hbHRzZXR0aW5nLT5kZXNjLmJJbnRlcmZhY2VOdW1iZXIpOwotCi0JaWYgKCEoaGlkID0gdXNiX2hpZF9jb25maWd1cmUoaW50ZikpKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCXVzYmhpZF9pbml0X3JlcG9ydHMoaGlkKTsKLQloaWRfZHVtcF9kZXZpY2UoaGlkKTsKLQotCWlmICghaGlkaW5wdXRfY29ubmVjdChoaWQpKQotCQloaWQtPmNsYWltZWQgfD0gSElEX0NMQUlNRURfSU5QVVQ7Ci0JaWYgKCFoaWRkZXZfY29ubmVjdChoaWQpKQotCQloaWQtPmNsYWltZWQgfD0gSElEX0NMQUlNRURfSElEREVWOwotCi0JdXNiX3NldF9pbnRmZGF0YShpbnRmLCBoaWQpOwotCi0JaWYgKCFoaWQtPmNsYWltZWQpIHsKLQkJcHJpbnRrICgiSElEIGRldmljZSBub3QgY2xhaW1lZCBieSBpbnB1dCBvciBoaWRkZXZcbiIpOwotCQloaWRfZGlzY29ubmVjdChpbnRmKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JaWYgKChoaWQtPmNsYWltZWQgJiBISURfQ0xBSU1FRF9JTlBVVCkpCi0JCWhpZF9mZl9pbml0KGhpZCk7Ci0KLQlpZiAoaGlkLT5xdWlya3MgJiBISURfUVVJUktfU09OWV9QUzNfQ09OVFJPTExFUikKLQkJaGlkX2ZpeHVwX3NvbnlfcHMzX2NvbnRyb2xsZXIoaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKSwKLQkJCWludGYtPmN1cl9hbHRzZXR0aW5nLT5kZXNjLmJJbnRlcmZhY2VOdW1iZXIpOwotCi0JcHJpbnRrKEtFUk5fSU5GTyk7Ci0KLQlpZiAoaGlkLT5jbGFpbWVkICYgSElEX0NMQUlNRURfSU5QVVQpCi0JCXByaW50aygiaW5wdXQiKTsKLQlpZiAoaGlkLT5jbGFpbWVkID09IChISURfQ0xBSU1FRF9JTlBVVCB8IEhJRF9DTEFJTUVEX0hJRERFVikpCi0JCXByaW50aygiLCIpOwotCWlmIChoaWQtPmNsYWltZWQgJiBISURfQ0xBSU1FRF9ISURERVYpCi0JCXByaW50aygiaGlkZGV2JWQiLCBoaWQtPm1pbm9yKTsKLQotCWMgPSAiRGV2aWNlIjsKLQlmb3IgKGkgPSAwOyBpIDwgaGlkLT5tYXhjb2xsZWN0aW9uOyBpKyspIHsKLQkJaWYgKGhpZC0+Y29sbGVjdGlvbltpXS50eXBlID09IEhJRF9DT0xMRUNUSU9OX0FQUExJQ0FUSU9OICYmCi0JCSAgICAoaGlkLT5jb2xsZWN0aW9uW2ldLnVzYWdlICYgSElEX1VTQUdFX1BBR0UpID09IEhJRF9VUF9HRU5ERVNLICYmCi0JCSAgICAoaGlkLT5jb2xsZWN0aW9uW2ldLnVzYWdlICYgMHhmZmZmKSA8IEFSUkFZX1NJWkUoaGlkX3R5cGVzKSkgewotCQkJYyA9IGhpZF90eXBlc1toaWQtPmNvbGxlY3Rpb25baV0udXNhZ2UgJiAweGZmZmZdOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQl1c2JfbWFrZV9wYXRoKGludGVyZmFjZV90b191c2JkZXYoaW50ZiksIHBhdGgsIDYzKTsKLQotCXByaW50aygiOiBVU0IgSElEIHYleC4lMDJ4ICVzIFslc10gb24gJXNcbiIsCi0JCWhpZC0+dmVyc2lvbiA+PiA4LCBoaWQtPnZlcnNpb24gJiAweGZmLCBjLCBoaWQtPm5hbWUsIHBhdGgpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgaGlkX3N1c3BlbmQoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIHBtX21lc3NhZ2VfdCBtZXNzYWdlKQotewotCXN0cnVjdCBoaWRfZGV2aWNlICpoaWQgPSB1c2JfZ2V0X2ludGZkYXRhIChpbnRmKTsKLQlzdHJ1Y3QgdXNiaGlkX2RldmljZSAqdXNiaGlkID0gaGlkLT5kcml2ZXJfZGF0YTsKLQotCXNwaW5fbG9ja19pcnEoJnVzYmhpZC0+aW5sb2NrKTsJLyogU3luYyB3aXRoIGVycm9yIGhhbmRsZXIgKi8KLQlzZXRfYml0KEhJRF9TVVNQRU5ERUQsICZ1c2JoaWQtPmlvZmwpOwotCXNwaW5fdW5sb2NrX2lycSgmdXNiaGlkLT5pbmxvY2spOwotCWRlbF90aW1lcigmdXNiaGlkLT5pb19yZXRyeSk7Ci0JdXNiX2tpbGxfdXJiKHVzYmhpZC0+dXJiaW4pOwotCWRldl9kYmcoJmludGYtPmRldiwgInN1c3BlbmRcbiIpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGhpZF9yZXN1bWUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCi17Ci0Jc3RydWN0IGhpZF9kZXZpY2UgKmhpZCA9IHVzYl9nZXRfaW50ZmRhdGEgKGludGYpOwotCXN0cnVjdCB1c2JoaWRfZGV2aWNlICp1c2JoaWQgPSBoaWQtPmRyaXZlcl9kYXRhOwotCWludCBzdGF0dXM7Ci0KLQljbGVhcl9iaXQoSElEX1NVU1BFTkRFRCwgJnVzYmhpZC0+aW9mbCk7Ci0JdXNiaGlkLT5yZXRyeV9kZWxheSA9IDA7Ci0Jc3RhdHVzID0gaGlkX3N0YXJ0X2luKGhpZCk7Ci0JZGV2X2RiZygmaW50Zi0+ZGV2LCAicmVzdW1lIHN0YXR1cyAlZFxuIiwgc3RhdHVzKTsKLQlyZXR1cm4gc3RhdHVzOwotfQotCi0vKiBUcmVhdCBVU0IgcmVzZXQgcHJldHR5IG11Y2ggdGhlIHNhbWUgYXMgc3VzcGVuZC9yZXN1bWUgKi8KLXN0YXRpYyB2b2lkIGhpZF9wcmVfcmVzZXQoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCi17Ci0JLyogRklYTUU6IFdoYXQgaWYgdGhlIGludGVyZmFjZSBpcyBhbHJlYWR5IHN1c3BlbmRlZD8gKi8KLQloaWRfc3VzcGVuZChpbnRmLCBQTVNHX09OKTsKLX0KLQotc3RhdGljIHZvaWQgaGlkX3Bvc3RfcmVzZXQoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCi17Ci0Jc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IGludGVyZmFjZV90b191c2JkZXYgKGludGYpOwotCi0JaGlkX3NldF9pZGxlKGRldiwgaW50Zi0+Y3VyX2FsdHNldHRpbmctPmRlc2MuYkludGVyZmFjZU51bWJlciwgMCwgMCk7Ci0JLyogRklYTUU6IEFueSBtb3JlIHJlaW5pdGlhbGl6YXRpb24gbmVlZGVkPyAqLwotCi0JaGlkX3Jlc3VtZShpbnRmKTsKLX0KLQotc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIGhpZF91c2JfaWRzIFtdID0gewotCXsgLm1hdGNoX2ZsYWdzID0gVVNCX0RFVklDRV9JRF9NQVRDSF9JTlRfQ0xBU1MsCi0JCS5iSW50ZXJmYWNlQ2xhc3MgPSBVU0JfSU5URVJGQUNFX0NMQVNTX0hJRCB9LAotCXsgfQkJCQkJCS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCi19OwotCi1NT0RVTEVfREVWSUNFX1RBQkxFICh1c2IsIGhpZF91c2JfaWRzKTsKLQotc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIGhpZF9kcml2ZXIgPSB7Ci0JLm5hbWUgPQkJInVzYmhpZCIsCi0JLnByb2JlID0JaGlkX3Byb2JlLAotCS5kaXNjb25uZWN0ID0JaGlkX2Rpc2Nvbm5lY3QsCi0JLnN1c3BlbmQgPQloaWRfc3VzcGVuZCwKLQkucmVzdW1lID0JaGlkX3Jlc3VtZSwKLQkucHJlX3Jlc2V0ID0JaGlkX3ByZV9yZXNldCwKLQkucG9zdF9yZXNldCA9CWhpZF9wb3N0X3Jlc2V0LAotCS5pZF90YWJsZSA9CWhpZF91c2JfaWRzLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgaGlkX2luaXQodm9pZCkKLXsKLQlpbnQgcmV0dmFsOwotCXJldHZhbCA9IGhpZGRldl9pbml0KCk7Ci0JaWYgKHJldHZhbCkKLQkJZ290byBoaWRkZXZfaW5pdF9mYWlsOwotCXJldHZhbCA9IHVzYl9yZWdpc3RlcigmaGlkX2RyaXZlcik7Ci0JaWYgKHJldHZhbCkKLQkJZ290byB1c2JfcmVnaXN0ZXJfZmFpbDsKLQlpbmZvKERSSVZFUl9WRVJTSU9OICI6IiBEUklWRVJfREVTQyk7Ci0KLQlyZXR1cm4gMDsKLXVzYl9yZWdpc3Rlcl9mYWlsOgotCWhpZGRldl9leGl0KCk7Ci1oaWRkZXZfaW5pdF9mYWlsOgotCXJldHVybiByZXR2YWw7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBoaWRfZXhpdCh2b2lkKQotewotCXVzYl9kZXJlZ2lzdGVyKCZoaWRfZHJpdmVyKTsKLQloaWRkZXZfZXhpdCgpOwotfQotCi1tb2R1bGVfaW5pdChoaWRfaW5pdCk7Ci1tb2R1bGVfZXhpdChoaWRfZXhpdCk7Ci0KLU1PRFVMRV9BVVRIT1IoRFJJVkVSX0FVVEhPUik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oRFJJVkVSX0RFU0MpOwotTU9EVUxFX0xJQ0VOU0UoRFJJVkVSX0xJQ0VOU0UpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWlzYy9hZHV0dXguYyBiL2RyaXZlcnMvdXNiL21pc2MvYWR1dHV4LmMKaW5kZXggNzViZmFiOS4uNzcxNDVmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWlzYy9hZHV0dXguYworKysgYi9kcml2ZXJzL3VzYi9taXNjL2FkdXR1eC5jCkBAIC0yODUsMjMgKzI4NSwyNCBAQAogCS8qIHNhdmUgZGV2aWNlIGluIHRoZSBmaWxlJ3MgcHJpdmF0ZSBzdHJ1Y3R1cmUgKi8KIAlmaWxlLT5wcml2YXRlX2RhdGEgPSBkZXY7CiAKLQkvKiBpbml0aWFsaXplIGluIGRpcmVjdGlvbiAqLwotCWRldi0+cmVhZF9idWZmZXJfbGVuZ3RoID0gMDsKKwlpZiAoZGV2LT5vcGVuX2NvdW50ID09IDEpIHsKKwkJLyogaW5pdGlhbGl6ZSBpbiBkaXJlY3Rpb24gKi8KKwkJZGV2LT5yZWFkX2J1ZmZlcl9sZW5ndGggPSAwOwogCi0JLyogZml4dXAgZmlyc3QgcmVhZCBieSBoYXZpbmcgdXJiIHdhaXRpbmcgZm9yIGl0ICovCi0JdXNiX2ZpbGxfaW50X3VyYihkZXYtPmludGVycnVwdF9pbl91cmIsZGV2LT51ZGV2LAotCQkJIHVzYl9yY3ZpbnRwaXBlKGRldi0+dWRldiwKLQkJCSAJCWRldi0+aW50ZXJydXB0X2luX2VuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzKSwKLQkJCSBkZXYtPmludGVycnVwdF9pbl9idWZmZXIsCi0JCQkgbGUxNl90b19jcHUoZGV2LT5pbnRlcnJ1cHRfaW5fZW5kcG9pbnQtPndNYXhQYWNrZXRTaXplKSwKLQkJCSBhZHVfaW50ZXJydXB0X2luX2NhbGxiYWNrLCBkZXYsCi0JCQkgZGV2LT5pbnRlcnJ1cHRfaW5fZW5kcG9pbnQtPmJJbnRlcnZhbCk7Ci0JLyogZGV2LT5pbnRlcnJ1cHRfaW5fdXJiLT50cmFuc2Zlcl9mbGFncyB8PSBVUkJfQVNZTkNfVU5MSU5LOyAqLwotCWRldi0+cmVhZF91cmJfZmluaXNoZWQgPSAwOwotCXVzYl9zdWJtaXRfdXJiKGRldi0+aW50ZXJydXB0X2luX3VyYiwgR0ZQX0tFUk5FTCk7Ci0JLyogd2UgaWdub3JlIGZhaWx1cmUgKi8KLQkvKiBlbmQgb2YgZml4dXAgZm9yIGZpcnN0IHJlYWQgKi8KLQorCQkvKiBmaXh1cCBmaXJzdCByZWFkIGJ5IGhhdmluZyB1cmIgd2FpdGluZyBmb3IgaXQgKi8KKwkJdXNiX2ZpbGxfaW50X3VyYihkZXYtPmludGVycnVwdF9pbl91cmIsZGV2LT51ZGV2LAorCQkJCSB1c2JfcmN2aW50cGlwZShkZXYtPnVkZXYsCisJCQkJIAkJZGV2LT5pbnRlcnJ1cHRfaW5fZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MpLAorCQkJCSBkZXYtPmludGVycnVwdF9pbl9idWZmZXIsCisJCQkJIGxlMTZfdG9fY3B1KGRldi0+aW50ZXJydXB0X2luX2VuZHBvaW50LT53TWF4UGFja2V0U2l6ZSksCisJCQkJIGFkdV9pbnRlcnJ1cHRfaW5fY2FsbGJhY2ssIGRldiwKKwkJCQkgZGV2LT5pbnRlcnJ1cHRfaW5fZW5kcG9pbnQtPmJJbnRlcnZhbCk7CisJCS8qIGRldi0+aW50ZXJydXB0X2luX3VyYi0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX0FTWU5DX1VOTElOSzsgKi8KKwkJZGV2LT5yZWFkX3VyYl9maW5pc2hlZCA9IDA7CisJCXJldHZhbCA9IHVzYl9zdWJtaXRfdXJiKGRldi0+aW50ZXJydXB0X2luX3VyYiwgR0ZQX0tFUk5FTCk7CisJCWlmIChyZXR2YWwpCisJCQktLWRldi0+b3Blbl9jb3VudDsKKwl9CiAJdXAoJmRldi0+c2VtKTsKIAogZXhpdF9ub19kZXZpY2U6CkBAIC00NjksNyArNDcwLDcgQEAKIAkJCQkJCQkgYWR1X2ludGVycnVwdF9pbl9jYWxsYmFjaywKIAkJCQkJCQkgZGV2LAogCQkJCQkJCSBkZXYtPmludGVycnVwdF9pbl9lbmRwb2ludC0+YkludGVydmFsKTsKLQkJCQkJcmV0dmFsID0gdXNiX3N1Ym1pdF91cmIoZGV2LT5pbnRlcnJ1cHRfaW5fdXJiLCBHRlBfS0VSTkVMKTsKKwkJCQkJcmV0dmFsID0gdXNiX3N1Ym1pdF91cmIoZGV2LT5pbnRlcnJ1cHRfaW5fdXJiLCBHRlBfQVRPTUlDKTsKIAkJCQkJaWYgKCFyZXR2YWwpIHsKIAkJCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+YnVmbG9jaywgZmxhZ3MpOwogCQkJCQkJZGJnKDIsIiAlcyA6IHN1Ym1pdHRlZCBPSyIsIF9fRlVOQ1RJT05fXyk7CkBAIC01MzksNyArNTQwLDcgQEAKIAlzaXplX3QgYnl0ZXNfd3JpdHRlbiA9IDA7CiAJc2l6ZV90IGJ5dGVzX3RvX3dyaXRlOwogCXNpemVfdCBidWZmZXJfc2l6ZTsKLQlpbnQgcmV0dmFsID0gMDsKKwlpbnQgcmV0dmFsOwogCWludCB0aW1lb3V0ID0gMDsKIAogCWRiZygyLCIgJXMgOiBlbnRlciwgY291bnQgPSAlWmQiLCBfX0ZVTkNUSU9OX18sIGNvdW50KTsKQEAgLTU0Nyw3ICs1NDgsOSBAQAogCWRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAogCS8qIGxvY2sgdGhpcyBvYmplY3QgKi8KLQlkb3duX2ludGVycnVwdGlibGUoJmRldi0+c2VtKTsKKwlyZXR2YWwgPSBkb3duX2ludGVycnVwdGlibGUoJmRldi0+c2VtKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGV4aXRfbm9sb2NrOwogCiAJLyogdmVyaWZ5IHRoYXQgdGhlIGRldmljZSB3YXNuJ3QgdW5wbHVnZ2VkICovCiAJaWYgKGRldi0+dWRldiA9PSBOVUxMIHx8IGRldi0+bWlub3IgPT0gMCkgewpAQCAtNTc1LDcgKzU3OCwxMSBAQAogCQkJfQogCQkJdXAoJmRldi0+c2VtKTsKIAkJCXRpbWVvdXQgPSBpbnRlcnJ1cHRpYmxlX3NsZWVwX29uX3RpbWVvdXQoJmRldi0+d3JpdGVfd2FpdCwgdGltZW91dCk7Ci0JCQlkb3duX2ludGVycnVwdGlibGUoJmRldi0+c2VtKTsKKwkJCXJldHZhbCA9IGRvd25faW50ZXJydXB0aWJsZSgmZGV2LT5zZW0pOworCQkJaWYgKHJldHZhbCkgeworCQkJCXJldHZhbCA9IGJ5dGVzX3dyaXR0ZW4gPyBieXRlc193cml0dGVuIDogcmV0dmFsOworCQkJCWdvdG8gZXhpdF9ub2xvY2s7CisJCQl9CiAJCQlpZiAodGltZW91dCA+IDApIHsKIAkJCQlicmVhazsKIAkJCX0KQEAgLTYzNyw2ICs2NDQsNyBAQAogZXhpdDoKIAkvKiB1bmxvY2sgdGhlIGRldmljZSAqLwogCXVwKCZkZXYtPnNlbSk7CitleGl0X25vbG9jazoKIAogCWRiZygyLCIgJXMgOiBsZWF2ZSwgcmV0dXJuIHZhbHVlICVkIiwgX19GVU5DVElPTl9fLCByZXR2YWwpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9taXNjL2N5cHJlc3NfY3k3YzYzLmMgYi9kcml2ZXJzL3VzYi9taXNjL2N5cHJlc3NfY3k3YzYzLmMKaW5kZXggYjYzYjVmMy4uZDcyMTM4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWlzYy9jeXByZXNzX2N5N2M2My5jCisrKyBiL2RyaXZlcnMvdXNiL21pc2MvY3lwcmVzc19jeTdjNjMuYwpAQCAtMjQ2LDExICsyNDYsMTMgQEAKIAlzdHJ1Y3QgY3lwcmVzcyAqZGV2OwogCiAJZGV2ID0gdXNiX2dldF9pbnRmZGF0YShpbnRlcmZhY2UpOwotCXVzYl9zZXRfaW50ZmRhdGEoaW50ZXJmYWNlLCBOVUxMKTsKIAogCS8qIHJlbW92ZSBkZXZpY2UgYXR0cmlidXRlIGZpbGVzICovCiAJZGV2aWNlX3JlbW92ZV9maWxlKCZpbnRlcmZhY2UtPmRldiwgJmRldl9hdHRyX3BvcnQwKTsKIAlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmludGVyZmFjZS0+ZGV2LCAmZGV2X2F0dHJfcG9ydDEpOworCS8qIHRoZSBpbnRmZGF0YSBjYW4gYmUgc2V0IHRvIE5VTEwgb25seSBhZnRlciB0aGUKKwkgKiBkZXZpY2UgZmlsZXMgaGF2ZSBiZWVuIHJlbW92ZWQgKi8KKwl1c2Jfc2V0X2ludGZkYXRhKGludGVyZmFjZSwgTlVMTCk7CiAKIAl1c2JfcHV0X2RldihkZXYtPnVkZXYpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9taXNjL2Z0ZGktZWxhbi5jIGIvZHJpdmVycy91c2IvbWlzYy9mdGRpLWVsYW4uYwppbmRleCBiYzMzMjdlLi5lMjE3MmU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9taXNjL2Z0ZGktZWxhbi5jCisrKyBiL2RyaXZlcnMvdXNiL21pc2MvZnRkaS1lbGFuLmMKQEAgLTIzMDQsNyArMjMwNCw2IEBACiAjZGVmaW5lIE9IQ0lfUVVJUktfU1VQRVJJTyAweDAyCiAjZGVmaW5lIE9IQ0lfUVVJUktfSU5JVFJFU0VUIDB4MDQKICNkZWZpbmUgT0hDSV9CSUdfRU5ESUFOIDB4MDgKLSNkZWZpbmUgT0hDSV9RVUlSS19aRk1JQ1JPIDB4MTAKICNkZWZpbmUgT0hDSV9DT05UUk9MX0lOSVQgT0hDSV9DVFJMX0NCU1IKICNkZWZpbmUgT0hDSV9JTlRSX0lOSVQgKE9IQ0lfSU5UUl9NSUUgfCBPSENJX0lOVFJfVUUgfCBPSENJX0lOVFJfUkQgfCBcCiAgICAgICAgIE9IQ0lfSU5UUl9XREgpCkBAIC0yOTEwLDI0ICsyOTA5LDI4IEBACiAgICAgICAgIElOSVRfTElTVF9IRUFEKCZmdGRpX3N0YXRpY19saXN0KTsKICAgICAgICAgc3RhdHVzX3F1ZXVlID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoImZ0ZGktc3RhdHVzLWNvbnRyb2wiKTsKIAlpZiAoIXN0YXR1c19xdWV1ZSkKLQkJZ290byBlcnIxOworCQlnb3RvIGVycl9zdGF0dXNfcXVldWU7CiAgICAgICAgIGNvbW1hbmRfcXVldWUgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgiZnRkaS1jb21tYW5kLWVuZ2luZSIpOwogCWlmICghY29tbWFuZF9xdWV1ZSkKLQkJZ290byBlcnIyOworCQlnb3RvIGVycl9jb21tYW5kX3F1ZXVlOwogICAgICAgICByZXNwb25kX3F1ZXVlID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoImZ0ZGktcmVzcG9uZC1lbmdpbmUiKTsKIAlpZiAoIXJlc3BvbmRfcXVldWUpCi0JCWdvdG8gZXJyMzsKKwkJZ290byBlcnJfcmVzcG9uZF9xdWV1ZTsKICAgICAgICAgcmVzdWx0ID0gdXNiX3JlZ2lzdGVyKCZmdGRpX2VsYW5fZHJpdmVyKTsKLSAgICAgICAgaWYgKHJlc3VsdCkKKyAgICAgICAgaWYgKHJlc3VsdCkgeworCQlkZXN0cm95X3dvcmtxdWV1ZShzdGF0dXNfcXVldWUpOworCQlkZXN0cm95X3dvcmtxdWV1ZShjb21tYW5kX3F1ZXVlKTsKKwkJZGVzdHJveV93b3JrcXVldWUocmVzcG9uZF9xdWV1ZSk7CiAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJ1c2JfcmVnaXN0ZXIgZmFpbGVkLiBFcnJvciBudW1iZXIgJWRcbiIsCiAJCSAgICAgICByZXN1bHQpOworCX0KICAgICAgICAgcmV0dXJuIHJlc3VsdDsKIAotIGVycjM6CisgZXJyX3Jlc3BvbmRfcXVldWU6CiAJZGVzdHJveV93b3JrcXVldWUoY29tbWFuZF9xdWV1ZSk7Ci0gZXJyMjoKKyBlcnJfY29tbWFuZF9xdWV1ZToKIAlkZXN0cm95X3dvcmtxdWV1ZShzdGF0dXNfcXVldWUpOwotIGVycjE6CisgZXJyX3N0YXR1c19xdWV1ZToKIAlwcmludGsoS0VSTl9FUlIgIiVzIGNvdWxkbid0IGNyZWF0ZSB3b3JrcXVldWVcbiIsIGZ0ZGlfZWxhbl9kcml2ZXIubmFtZSk7CiAJcmV0dXJuIC1FTk9NRU07CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9taXNjL2lvd2Fycmlvci5jIGIvZHJpdmVycy91c2IvbWlzYy9pb3dhcnJpb3IuYwppbmRleCBkNjk2NjVjLi5mYzUxMjA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9taXNjL2lvd2Fycmlvci5jCisrKyBiL2RyaXZlcnMvdXNiL21pc2MvaW93YXJyaW9yLmMKQEAgLTExOCw3ICsxMTgsNyBAQAogCQkJICAgICAgIFVTQl9ESVJfSU4gfCBVU0JfVFlQRV9DTEFTUyB8CiAJCQkgICAgICAgVVNCX1JFQ0lQX0lOVEVSRkFDRSwgKHR5cGUgPDwgOCkgKyBpZCwKIAkJCSAgICAgICBpbnRlci0+ZGVzYy5iSW50ZXJmYWNlTnVtYmVyLCBidWYsIHNpemUsCi0JCQkgICAgICAgR0VUX1RJTUVPVVQpOworCQkJICAgICAgIEdFVF9USU1FT1VUKkhaKTsKIH0KIC8vI2VuZGlmCiAKQEAgLTEzMyw3ICsxMzMsNyBAQAogCQkJICAgICAgIFVTQl9UWVBFX0NMQVNTIHwgVVNCX1JFQ0lQX0lOVEVSRkFDRSwKIAkJCSAgICAgICAodHlwZSA8PCA4KSArIGlkLAogCQkJICAgICAgIGludGYtPmN1cl9hbHRzZXR0aW5nLT5kZXNjLmJJbnRlcmZhY2VOdW1iZXIsIGJ1ZiwKLQkJCSAgICAgICBzaXplLCAxKTsKKwkJCSAgICAgICBzaXplLCBIWik7CiB9CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTQxNywxNCArNDE3LDE0IEBACiAJCWlmICghaW50X291dF91cmIpIHsKIAkJCXJldHZhbCA9IC1FTk9NRU07CiAJCQlkYmcoIiVzIFVuYWJsZSB0byBhbGxvY2F0ZSB1cmIgIiwgX19mdW5jX18pOwotCQkJZ290byBlcnJvcjsKKwkJCWdvdG8gZXJyb3Jfbm9fdXJiOwogCQl9CiAJCWJ1ZiA9IHVzYl9idWZmZXJfYWxsb2MoZGV2LT51ZGV2LCBkZXYtPnJlcG9ydF9zaXplLAogCQkJCSAgICAgICBHRlBfS0VSTkVMLCAmaW50X291dF91cmItPnRyYW5zZmVyX2RtYSk7CiAJCWlmICghYnVmKSB7CiAJCQlyZXR2YWwgPSAtRU5PTUVNOwogCQkJZGJnKCIlcyBVbmFibGUgdG8gYWxsb2NhdGUgYnVmZmVyICIsIF9fZnVuY19fKTsKLQkJCWdvdG8gZXJyb3I7CisJCQlnb3RvIGVycm9yX25vX2J1ZmZlcjsKIAkJfQogCQl1c2JfZmlsbF9pbnRfdXJiKGludF9vdXRfdXJiLCBkZXYtPnVkZXYsCiAJCQkJIHVzYl9zbmRpbnRwaXBlKGRldi0+dWRldiwKQEAgLTQ1OSw3ICs0NTksOSBAQAogZXJyb3I6CiAJdXNiX2J1ZmZlcl9mcmVlKGRldi0+dWRldiwgZGV2LT5yZXBvcnRfc2l6ZSwgYnVmLAogCQkJaW50X291dF91cmItPnRyYW5zZmVyX2RtYSk7CitlcnJvcl9ub19idWZmZXI6CiAJdXNiX2ZyZWVfdXJiKGludF9vdXRfdXJiKTsKK2Vycm9yX25vX3VyYjoKIAlhdG9taWNfZGVjKCZkZXYtPndyaXRlX2J1c3kpOwogCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZGV2LT53cml0ZV93YWl0KTsKIGV4aXQ6CkBAIC03NDgsNyArNzUwLDYgQEAKIAlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVuZHBvaW50OwogCWludCBpOwogCWludCByZXR2YWwgPSAtRU5PTUVNOwotCWludCBpZGVsZSA9IDA7CiAKIAkvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIG91ciBkZXZpY2Ugc3RhdGUgYW5kIGludGlhbGl6ZSBpdCAqLwogCWRldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpb3dhcnJpb3IpLCBHRlBfS0VSTkVMKTsKQEAgLTgyNCwxMSArODI1LDEwIEBACiAKIAkvKiBTZXQgdGhlIGlkbGUgdGltZW91dCB0byAwLCBpZiB0aGlzIGlzIGludGVyZmFjZSAwICovCiAJaWYgKGRldi0+aW50ZXJmYWNlLT5jdXJfYWx0c2V0dGluZy0+ZGVzYy5iSW50ZXJmYWNlTnVtYmVyID09IDApIHsKLQkJaWRlbGUgPSB1c2JfY29udHJvbF9tc2codWRldiwgdXNiX3NuZGN0cmxwaXBlKHVkZXYsIDApLAotCQkJCQkweDBBLAotCQkJCQlVU0JfVFlQRV9DTEFTUyB8IFVTQl9SRUNJUF9JTlRFUkZBQ0UsIDAsCi0JCQkJCTAsIE5VTEwsIDAsIFVTQl9DVFJMX1NFVF9USU1FT1VUKTsKLQkJZGJnKCJpZGVsZSA9ICVkIiwgaWRlbGUpOworCSAgICB1c2JfY29udHJvbF9tc2codWRldiwgdXNiX3NuZGN0cmxwaXBlKHVkZXYsIDApLAorCQkJICAgIDB4MEEsCisJCQkgICAgVVNCX1RZUEVfQ0xBU1MgfCBVU0JfUkVDSVBfSU5URVJGQUNFLCAwLAorCQkJICAgIDAsIE5VTEwsIDAsIFVTQl9DVFJMX1NFVF9USU1FT1VUKTsKIAl9CiAJLyogYWxsb3cgZGV2aWNlIHJlYWQgYW5kIGlvY3RsICovCiAJZGV2LT5wcmVzZW50ID0gMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2MvbGR1c2IuYyBiL2RyaXZlcnMvdXNiL21pc2MvbGR1c2IuYwppbmRleCA3ODhhMTFlLi4xMTU1NWJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9taXNjL2xkdXNiLmMKKysrIGIvZHJpdmVycy91c2IvbWlzYy9sZHVzYi5jCkBAIC02Miw2ICs2Miw4IEBACiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfVkVSTklFUl9TS0lQCTB4MDAwMwogI2RlZmluZSBVU0JfREVWSUNFX0lEX1ZFUk5JRVJfQ1lDTE9QUwkweDAwMDQKIAorI2RlZmluZSBVU0JfVkVORE9SX0lEX01JQ1JPQ0hJUAkJMHgwNGQ4CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfUElDREVNCQkweDAwMGMKIAogI2lmZGVmIENPTkZJR19VU0JfRFlOQU1JQ19NSU5PUlMKICNkZWZpbmUgVVNCX0xEX01JTk9SX0JBU0UJMApAQCAtODksNiArOTEsNyBAQAogCXsgVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1ZFUk5JRVIsIFVTQl9ERVZJQ0VfSURfVkVSTklFUl9HT1RFTVApIH0sCiAJeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfVkVSTklFUiwgVVNCX0RFVklDRV9JRF9WRVJOSUVSX1NLSVApIH0sCiAJeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfVkVSTklFUiwgVVNCX0RFVklDRV9JRF9WRVJOSUVSX0NZQ0xPUFMpIH0sCisJeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTUlDUk9DSElQLCBVU0JfREVWSUNFX0lEX1BJQ0RFTSkgfSwKIAl7IH0JCQkJCS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIGxkX3VzYl90YWJsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9taXNjL3VzYmxjZC5jIGIvZHJpdmVycy91c2IvbWlzYy91c2JsY2QuYwppbmRleCBhZGEyZWJjLi44ODdlZjk1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9taXNjL3VzYmxjZC5jCisrKyBiL2RyaXZlcnMvdXNiL21pc2MvdXNibGNkLmMKQEAgLTQ3LDYgKzQ3LDcgQEAKICNkZWZpbmUgdG9fbGNkX2RldihkKSBjb250YWluZXJfb2YoZCwgc3RydWN0IHVzYl9sY2QsIGtyZWYpCiAKIHN0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBsY2RfZHJpdmVyOworc3RhdGljIERFRklORV9NVVRFWCh1c2JfbGNkX29wZW5fbXV0ZXgpOwogCiAKIHN0YXRpYyB2b2lkIGxjZF9kZWxldGUoc3RydWN0IGtyZWYgKmtyZWYpCkBAIC02OCw2ICs2OSw3IEBACiAKIAlzdWJtaW5vciA9IGltaW5vcihpbm9kZSk7CiAKKwltdXRleF9sb2NrKCZ1c2JfbGNkX29wZW5fbXV0ZXgpOwogCWludGVyZmFjZSA9IHVzYl9maW5kX2ludGVyZmFjZSgmbGNkX2RyaXZlciwgc3VibWlub3IpOwogCWlmICghaW50ZXJmYWNlKSB7CiAJCWVyciAoIlVTQkxDRDogJXMgLSBlcnJvciwgY2FuJ3QgZmluZCBkZXZpY2UgZm9yIG1pbm9yICVkIiwKQEAgLTg5LDYgKzkxLDcgQEAKIAlmaWxlLT5wcml2YXRlX2RhdGEgPSBkZXY7CiAKIGV4aXQ6CisJbXV0ZXhfdW5sb2NrKCZ1c2JfbGNkX29wZW5fbXV0ZXgpOwogCXJldHVybiByZXR2YWw7CiB9CiAKQEAgLTM0Nyw3ICszNTAsNyBAQAogICAgICAgICBpbnQgbWlub3IgPSBpbnRlcmZhY2UtPm1pbm9yOwogCiAgICAgICAgIC8qIHByZXZlbnQgc2tlbF9vcGVuKCkgZnJvbSByYWNpbmcgc2tlbF9kaXNjb25uZWN0KCkgKi8KLSAgICAgICAgbG9ja19rZXJuZWwoKTsKKyAgICAgICAgbXV0ZXhfbG9jaygmdXNiX2xjZF9vcGVuX211dGV4KTsKIAogICAgICAgICBkZXYgPSB1c2JfZ2V0X2ludGZkYXRhKGludGVyZmFjZSk7CiAgICAgICAgIHVzYl9zZXRfaW50ZmRhdGEoaW50ZXJmYWNlLCBOVUxMKTsKQEAgLTM1NSw3ICszNTgsNyBAQAogICAgICAgICAvKiBnaXZlIGJhY2sgb3VyIG1pbm9yICovCiAgICAgICAgIHVzYl9kZXJlZ2lzdGVyX2RldihpbnRlcmZhY2UsICZsY2RfY2xhc3MpOwogIAotCXVubG9ja19rZXJuZWwoKTsKKwltdXRleF91bmxvY2soJnVzYl9sY2Rfb3Blbl9tdXRleCk7CiAKIAkvKiBkZWNyZW1lbnQgb3VyIHVzYWdlIGNvdW50ICovCiAJa3JlZl9wdXQoJmRldi0+a3JlZiwgbGNkX2RlbGV0ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tb24vbW9uX2Jpbi5jIGIvZHJpdmVycy91c2IvbW9uL21vbl9iaW4uYwppbmRleCBiMmJlZGQ5Li4wYWYxMWE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tb24vbW9uX2Jpbi5jCisrKyBiL2RyaXZlcnMvdXNiL21vbi9tb25fYmluLmMKQEAgLTM1Niw4ICszNTYsMTAgQEAKIAlpZiAoIXVzYl9waXBlY29udHJvbCh1cmItPnBpcGUpIHx8IGV2X3R5cGUgIT0gJ1MnKQogCQlyZXR1cm4gJy0nOwogCi0JaWYgKHVyYi0+dHJhbnNmZXJfZmxhZ3MgJiBVUkJfTk9fU0VUVVBfRE1BX01BUCkKKwlpZiAodXJiLT5kZXYtPmJ1cy0+dXNlc19kbWEgJiYKKwkgICAgKHVyYi0+dHJhbnNmZXJfZmxhZ3MgJiBVUkJfTk9fU0VUVVBfRE1BX01BUCkpIHsKIAkJcmV0dXJuIG1vbl9kbWFwZWVrKHNldHVwYiwgdXJiLT5zZXR1cF9kbWEsIFNFVFVQX0xFTik7CisJfQogCWlmICh1cmItPnNldHVwX3BhY2tldCA9PSBOVUxMKQogCQlyZXR1cm4gJ1onOwogCkBAIC0zNjksNyArMzcxLDggQEAKICAgICB1bnNpZ25lZCBpbnQgb2Zmc2V0LCBzdHJ1Y3QgdXJiICp1cmIsIHVuc2lnbmVkIGludCBsZW5ndGgpCiB7CiAKLQlpZiAodXJiLT50cmFuc2Zlcl9mbGFncyAmIFVSQl9OT19UUkFOU0ZFUl9ETUFfTUFQKSB7CisJaWYgKHVyYi0+ZGV2LT5idXMtPnVzZXNfZG1hICYmCisJICAgICh1cmItPnRyYW5zZmVyX2ZsYWdzICYgVVJCX05PX1RSQU5TRkVSX0RNQV9NQVApKSB7CiAJCW1vbl9kbWFwZWVrX3ZlYyhycCwgb2Zmc2V0LCB1cmItPnRyYW5zZmVyX2RtYSwgbGVuZ3RoKTsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtNDQwLDcgKzQ0Myw3IEBACiAJLyogV2UgdXNlIHRoZSBmYWN0IHRoYXQgdXNiX3BpcGVpbigpIHJldHVybnMgMHg4MCAqLwogCWVwLT5lcG51bSA9IHVzYl9waXBlZW5kcG9pbnQodXJiLT5waXBlKSB8IHVzYl9waXBlaW4odXJiLT5waXBlKTsKIAllcC0+ZGV2bnVtID0gdXNiX3BpcGVkZXZpY2UodXJiLT5waXBlKTsKLQllcC0+YnVzbnVtID0gcnAtPnIubV9idXMtPnVfYnVzLT5idXNudW07CisJZXAtPmJ1c251bSA9IHVyYi0+ZGV2LT5idXMtPmJ1c251bTsKIAllcC0+aWQgPSAodW5zaWduZWQgbG9uZykgdXJiOwogCWVwLT50c19zZWMgPSB0cy50dl9zZWM7CiAJZXAtPnRzX3VzZWMgPSB0cy50dl91c2VjOwpAQCAtNTAwLDcgKzUwMyw3IEBACiAJLyogV2UgdXNlIHRoZSBmYWN0IHRoYXQgdXNiX3BpcGVpbigpIHJldHVybnMgMHg4MCAqLwogCWVwLT5lcG51bSA9IHVzYl9waXBlZW5kcG9pbnQodXJiLT5waXBlKSB8IHVzYl9waXBlaW4odXJiLT5waXBlKTsKIAllcC0+ZGV2bnVtID0gdXNiX3BpcGVkZXZpY2UodXJiLT5waXBlKTsKLQllcC0+YnVzbnVtID0gcnAtPnIubV9idXMtPnVfYnVzLT5idXNudW07CisJZXAtPmJ1c251bSA9IHVyYi0+ZGV2LT5idXMtPmJ1c251bTsKIAllcC0+aWQgPSAodW5zaWduZWQgbG9uZykgdXJiOwogCWVwLT5zdGF0dXMgPSBlcnJvcjsKIApAQCAtNTE1LDcgKzUxOCw2IEBACiBzdGF0aWMgaW50IG1vbl9iaW5fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKIAlzdHJ1Y3QgbW9uX2J1cyAqbWJ1czsKLQlzdHJ1Y3QgdXNiX2J1cyAqdWJ1czsKIAlzdHJ1Y3QgbW9uX3JlYWRlcl9iaW4gKnJwOwogCXNpemVfdCBzaXplOwogCWludCByYzsKQEAgLTUyNSw3ICs1MjcsNyBAQAogCQltdXRleF91bmxvY2soJm1vbl9sb2NrKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQotCWlmICgodWJ1cyA9IG1idXMtPnVfYnVzKSA9PSBOVUxMKSB7CisJaWYgKG1idXMgIT0gJm1vbl9idXMwICYmIG1idXMtPnVfYnVzID09IE5VTEwpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIFRBRyAiOiBjb25zaXN0ZW5jeSBlcnJvciBvbiBvcGVuXG4iKTsKIAkJbXV0ZXhfdW5sb2NrKCZtb25fbG9jayk7CiAJCXJldHVybiAtRU5PREVWOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbW9uL21vbl9tYWluLmMgYi9kcml2ZXJzL3VzYi9tb24vbW9uX21haW4uYwppbmRleCBjOTczOWU3Li44YTFkZjJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tb24vbW9uX21haW4uYworKysgYi9kcml2ZXJzL3VzYi9tb24vbW9uX21haW4uYwpAQCAtMTYsOCArMTYsNiBAQAogI2luY2x1ZGUgInVzYl9tb24uaCIKICNpbmNsdWRlICIuLi9jb3JlL2hjZC5oIgogCi1zdGF0aWMgdm9pZCBtb25fc3VibWl0KHN0cnVjdCB1c2JfYnVzICp1YnVzLCBzdHJ1Y3QgdXJiICp1cmIpOwotc3RhdGljIHZvaWQgbW9uX2NvbXBsZXRlKHN0cnVjdCB1c2JfYnVzICp1YnVzLCBzdHJ1Y3QgdXJiICp1cmIpOwogc3RhdGljIHZvaWQgbW9uX3N0b3Aoc3RydWN0IG1vbl9idXMgKm1idXMpOwogc3RhdGljIHZvaWQgbW9uX2Rpc3NvbHZlKHN0cnVjdCBtb25fYnVzICptYnVzLCBzdHJ1Y3QgdXNiX2J1cyAqdWJ1cyk7CiBzdGF0aWMgdm9pZCBtb25fYnVzX2Ryb3Aoc3RydWN0IGtyZWYgKnIpOwpAQCAtMjUsNiArMjMsNyBAQAogCiBERUZJTkVfTVVURVgobW9uX2xvY2spOwogCitzdHJ1Y3QgbW9uX2J1cyBtb25fYnVzMDsJCS8qIFBzZXVkbyBidXMgbWVhbmluZyAiYWxsIGJ1c2VzIiAqLwogc3RhdGljIExJU1RfSEVBRChtb25fYnVzZXMpOwkJLyogQWxsIGJ1c2VzIHdlIGtub3c6IHN0cnVjdCBtb25fYnVzICovCiAKIC8qCkBAIC0zNSwyMiArMzQsMTkgQEAKIHZvaWQgbW9uX3JlYWRlcl9hZGQoc3RydWN0IG1vbl9idXMgKm1idXMsIHN0cnVjdCBtb25fcmVhZGVyICpyKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IHVzYl9idXMgKnVidXM7CisJc3RydWN0IGxpc3RfaGVhZCAqcDsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZtYnVzLT5sb2NrLCBmbGFncyk7CiAJaWYgKG1idXMtPm5yZWFkZXJzID09IDApIHsKLQkJdWJ1cyA9IG1idXMtPnVfYnVzOwotCQlpZiAodWJ1cy0+bW9uaXRvcmVkKSB7Ci0JCQkvKgotCQkJICogU29tZXRoaW5nIGlzIHJlYWxseSBicm9rZW4sIHJlZnVzZSB0byBnbyBvbiBhbmQKLQkJCSAqIHBvc3NpYmx5IGNvcnJ1cHQgb3BzIHBvaW50ZXJzIG9yIHdvcnNlLgotCQkJICovCi0JCQlwcmludGsoS0VSTl9FUlIgVEFHICI6IGJ1cyAlZCBpcyBhbHJlYWR5IG1vbml0b3JlZFxuIiwKLQkJCSAgICB1YnVzLT5idXNudW0pOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWJ1cy0+bG9jaywgZmxhZ3MpOwotCQkJcmV0dXJuOworCQlpZiAobWJ1cyA9PSAmbW9uX2J1czApIHsKKwkJCWxpc3RfZm9yX2VhY2ggKHAsICZtb25fYnVzZXMpIHsKKwkJCQlzdHJ1Y3QgbW9uX2J1cyAqbTE7CisJCQkJbTEgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBtb25fYnVzLCBidXNfbGluayk7CisJCQkJbTEtPnVfYnVzLT5tb25pdG9yZWQgPSAxOworCQkJfQorCQl9IGVsc2UgeworCQkJbWJ1cy0+dV9idXMtPm1vbml0b3JlZCA9IDE7CiAJCX0KLQkJdWJ1cy0+bW9uaXRvcmVkID0gMTsKIAl9CiAJbWJ1cy0+bnJlYWRlcnMrKzsKIAlsaXN0X2FkZF90YWlsKCZyLT5yX2xpbmssICZtYnVzLT5yX2xpc3QpOwpAQCAtODAsNzcgKzc2LDc5IEBACiAKIC8qCiAgKi8KLXN0YXRpYyB2b2lkIG1vbl9zdWJtaXQoc3RydWN0IHVzYl9idXMgKnVidXMsIHN0cnVjdCB1cmIgKnVyYikKK3N0YXRpYyB2b2lkIG1vbl9idXNfc3VibWl0KHN0cnVjdCBtb25fYnVzICptYnVzLCBzdHJ1Y3QgdXJiICp1cmIpCiB7Ci0Jc3RydWN0IG1vbl9idXMgKm1idXM7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CiAJc3RydWN0IG1vbl9yZWFkZXIgKnI7CiAKLQltYnVzID0gdWJ1cy0+bW9uX2J1czsKLQlpZiAobWJ1cyA9PSBOVUxMKQotCQlnb3RvIG91dF91bmxvY2tlZDsKLQogCXNwaW5fbG9ja19pcnFzYXZlKCZtYnVzLT5sb2NrLCBmbGFncyk7Ci0JaWYgKG1idXMtPm5yZWFkZXJzID09IDApCi0JCWdvdG8gb3V0X2xvY2tlZDsKLQogCW1idXMtPmNudF9ldmVudHMrKzsKIAlsaXN0X2Zvcl9lYWNoIChwb3MsICZtYnVzLT5yX2xpc3QpIHsKIAkJciA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3QgbW9uX3JlYWRlciwgcl9saW5rKTsKIAkJci0+cm5mX3N1Ym1pdChyLT5yX2RhdGEsIHVyYik7CiAJfQotCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWJ1cy0+bG9jaywgZmxhZ3MpOwogCXJldHVybjsKK30KIAotb3V0X2xvY2tlZDoKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtYnVzLT5sb2NrLCBmbGFncyk7Ci1vdXRfdW5sb2NrZWQ6Ci0JcmV0dXJuOworc3RhdGljIHZvaWQgbW9uX3N1Ym1pdChzdHJ1Y3QgdXNiX2J1cyAqdWJ1cywgc3RydWN0IHVyYiAqdXJiKQoreworCXN0cnVjdCBtb25fYnVzICptYnVzOworCisJaWYgKChtYnVzID0gdWJ1cy0+bW9uX2J1cykgIT0gTlVMTCkKKwkJbW9uX2J1c19zdWJtaXQobWJ1cywgdXJiKTsKKwltb25fYnVzX3N1Ym1pdCgmbW9uX2J1czAsIHVyYik7CiB9CiAKIC8qCiAgKi8KLXN0YXRpYyB2b2lkIG1vbl9zdWJtaXRfZXJyb3Ioc3RydWN0IHVzYl9idXMgKnVidXMsIHN0cnVjdCB1cmIgKnVyYiwgaW50IGVycm9yKQorc3RhdGljIHZvaWQgbW9uX2J1c19zdWJtaXRfZXJyb3Ioc3RydWN0IG1vbl9idXMgKm1idXMsIHN0cnVjdCB1cmIgKnVyYiwgaW50IGVycm9yKQogewotCXN0cnVjdCBtb25fYnVzICptYnVzOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IGxpc3RfaGVhZCAqcG9zOwogCXN0cnVjdCBtb25fcmVhZGVyICpyOwogCi0JbWJ1cyA9IHVidXMtPm1vbl9idXM7Ci0JaWYgKG1idXMgPT0gTlVMTCkKLQkJZ290byBvdXRfdW5sb2NrZWQ7Ci0KIAlzcGluX2xvY2tfaXJxc2F2ZSgmbWJ1cy0+bG9jaywgZmxhZ3MpOwotCWlmIChtYnVzLT5ucmVhZGVycyA9PSAwKQotCQlnb3RvIG91dF9sb2NrZWQ7Ci0KIAltYnVzLT5jbnRfZXZlbnRzKys7CiAJbGlzdF9mb3JfZWFjaCAocG9zLCAmbWJ1cy0+cl9saXN0KSB7CiAJCXIgPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IG1vbl9yZWFkZXIsIHJfbGluayk7CiAJCXItPnJuZl9lcnJvcihyLT5yX2RhdGEsIHVyYiwgZXJyb3IpOwogCX0KLQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1idXMtPmxvY2ssIGZsYWdzKTsKIAlyZXR1cm47Cit9CiAKLW91dF9sb2NrZWQ6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWJ1cy0+bG9jaywgZmxhZ3MpOwotb3V0X3VubG9ja2VkOgotCXJldHVybjsKK3N0YXRpYyB2b2lkIG1vbl9zdWJtaXRfZXJyb3Ioc3RydWN0IHVzYl9idXMgKnVidXMsIHN0cnVjdCB1cmIgKnVyYiwgaW50IGVycm9yKQoreworCXN0cnVjdCBtb25fYnVzICptYnVzOworCisJaWYgKChtYnVzID0gdWJ1cy0+bW9uX2J1cykgIT0gTlVMTCkKKwkJbW9uX2J1c19zdWJtaXRfZXJyb3IobWJ1cywgdXJiLCBlcnJvcik7CisJbW9uX2J1c19zdWJtaXRfZXJyb3IoJm1vbl9idXMwLCB1cmIsIGVycm9yKTsKIH0KIAogLyoKICAqLwotc3RhdGljIHZvaWQgbW9uX2NvbXBsZXRlKHN0cnVjdCB1c2JfYnVzICp1YnVzLCBzdHJ1Y3QgdXJiICp1cmIpCitzdGF0aWMgdm9pZCBtb25fYnVzX2NvbXBsZXRlKHN0cnVjdCBtb25fYnVzICptYnVzLCBzdHJ1Y3QgdXJiICp1cmIpCiB7Ci0Jc3RydWN0IG1vbl9idXMgKm1idXM7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CiAJc3RydWN0IG1vbl9yZWFkZXIgKnI7CiAKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbWJ1cy0+bG9jaywgZmxhZ3MpOworCW1idXMtPmNudF9ldmVudHMrKzsKKwlsaXN0X2Zvcl9lYWNoIChwb3MsICZtYnVzLT5yX2xpc3QpIHsKKwkJciA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3QgbW9uX3JlYWRlciwgcl9saW5rKTsKKwkJci0+cm5mX2NvbXBsZXRlKHItPnJfZGF0YSwgdXJiKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWJ1cy0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBtb25fY29tcGxldGUoc3RydWN0IHVzYl9idXMgKnVidXMsIHN0cnVjdCB1cmIgKnVyYikKK3sKKwlzdHJ1Y3QgbW9uX2J1cyAqbWJ1czsKKwogCW1idXMgPSB1YnVzLT5tb25fYnVzOwogCWlmIChtYnVzID09IE5VTEwpIHsKIAkJLyoKQEAgLTE2MiwxMyArMTYwLDggQEAKIAkJcmV0dXJuOwogCX0KIAotCXNwaW5fbG9ja19pcnFzYXZlKCZtYnVzLT5sb2NrLCBmbGFncyk7Ci0JbWJ1cy0+Y250X2V2ZW50cysrOwotCWxpc3RfZm9yX2VhY2ggKHBvcywgJm1idXMtPnJfbGlzdCkgewotCQlyID0gbGlzdF9lbnRyeShwb3MsIHN0cnVjdCBtb25fcmVhZGVyLCByX2xpbmspOwotCQlyLT5ybmZfY29tcGxldGUoci0+cl9kYXRhLCB1cmIpOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtYnVzLT5sb2NrLCBmbGFncyk7CisJbW9uX2J1c19jb21wbGV0ZShtYnVzLCB1cmIpOworCW1vbl9idXNfY29tcGxldGUoJm1vbl9idXMwLCB1cmIpOwogfQogCiAvKiBpbnQgKCp1bmxpbmtfdXJiKSAoc3RydWN0IHVyYiAqdXJiLCBpbnQgc3RhdHVzKTsgKi8KQEAgLTE3OSwxNCArMTcyLDI2IEBACiBzdGF0aWMgdm9pZCBtb25fc3RvcChzdHJ1Y3QgbW9uX2J1cyAqbWJ1cykKIHsKIAlzdHJ1Y3QgdXNiX2J1cyAqdWJ1cyA9IG1idXMtPnVfYnVzOworCXN0cnVjdCBsaXN0X2hlYWQgKnA7CiAKLQkvKgotCSAqIEEgc3RvcCBjYW4gYmUgY2FsbGVkIGZvciBhIGRpc3NvbHZlZCBtb25fYnVzIGluIGNhc2Ugb2YKLQkgKiBhIHJlYWRlciBzdGF5aW5nIGFjcm9zcyBhbiBybW1vZCBmb29faGNkLgotCSAqLwotCWlmICh1YnVzICE9IE5VTEwpIHsKLQkJdWJ1cy0+bW9uaXRvcmVkID0gMDsKLQkJbWIoKTsKKwlpZiAobWJ1cyA9PSAmbW9uX2J1czApIHsKKwkJbGlzdF9mb3JfZWFjaCAocCwgJm1vbl9idXNlcykgeworCQkJbWJ1cyA9IGxpc3RfZW50cnkocCwgc3RydWN0IG1vbl9idXMsIGJ1c19saW5rKTsKKwkJCS8qCisJCQkgKiBXZSBkbyBub3QgY2hhbmdlIG5yZWFkZXJzIGhlcmUsIHNvIHJlbHkgb24gbW9uX2xvY2suCisJCQkgKi8KKwkJCWlmIChtYnVzLT5ucmVhZGVycyA9PSAwICYmICh1YnVzID0gbWJ1cy0+dV9idXMpICE9IE5VTEwpCisJCQkJdWJ1cy0+bW9uaXRvcmVkID0gMDsKKwkJfQorCX0gZWxzZSB7CisJCS8qCisJCSAqIEEgc3RvcCBjYW4gYmUgY2FsbGVkIGZvciBhIGRpc3NvbHZlZCBtb25fYnVzIGluIGNhc2Ugb2YKKwkJICogYSByZWFkZXIgc3RheWluZyBhY3Jvc3MgYW4gcm1tb2QgZm9vX2hjZCwgc28gdGVzdCAtPnVfYnVzLgorCQkgKi8KKwkJaWYgKG1vbl9idXMwLm5yZWFkZXJzID09IDAgJiYgKHVidXMgPSBtYnVzLT51X2J1cykgIT0gTlVMTCkgeworCQkJdWJ1cy0+bW9uaXRvcmVkID0gMDsKKwkJCW1iKCk7CisJCX0KIAl9CiB9CiAKQEAgLTE5OSw2ICsyMDQsMTAgQEAKIHN0YXRpYyB2b2lkIG1vbl9idXNfYWRkKHN0cnVjdCB1c2JfYnVzICp1YnVzKQogewogCW1vbl9idXNfaW5pdCh1YnVzKTsKKwltdXRleF9sb2NrKCZtb25fbG9jayk7CisJaWYgKG1vbl9idXMwLm5yZWFkZXJzICE9IDApCisJCXVidXMtPm1vbml0b3JlZCA9IDE7CisJbXV0ZXhfdW5sb2NrKCZtb25fbG9jayk7CiB9CiAKIC8qCkBAIC0yNTAsMTIgKzI1OSw3IEBACiBzdGF0aWMgdm9pZCBtb25fZGlzc29sdmUoc3RydWN0IG1vbl9idXMgKm1idXMsIHN0cnVjdCB1c2JfYnVzICp1YnVzKQogewogCi0JLyoKLQkgKiBOZXZlciBoYXBwZW5zLCBidXQuLi4KLQkgKi8KIAlpZiAodWJ1cy0+bW9uaXRvcmVkKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBUQUcgIjogYnVzICVkIGlzIGRpc3NvbHZlZCB3aGlsZSBtb25pdG9yZWRcbiIsCi0JCSAgICB1YnVzLT5idXNudW0pOwogCQl1YnVzLT5tb25pdG9yZWQgPSAwOwogCQltYigpOwogCX0KQEAgLTI2Myw2ICsyNjcsOCBAQAogCXVidXMtPm1vbl9idXMgPSBOVUxMOwogCW1idXMtPnVfYnVzID0gTlVMTDsKIAltYigpOworCisJLyogV2Ugd2FudCBzeW5jaHJvbml6ZV9pcnEoKSBoZXJlLCBidXQgdGhhdCBuZWVkcyBhbiBhcmd1bWVudC4gKi8KIH0KIAogLyoKQEAgLTI5NSw5ICszMDEsOCBAQAogCSAqLwogCW1idXMtPnVfYnVzID0gdWJ1czsKIAl1YnVzLT5tb25fYnVzID0gbWJ1czsKLQltYnVzLT51c2VzX2RtYSA9IHVidXMtPnVzZXNfZG1hOwogCi0JbWJ1cy0+dGV4dF9pbml0ZWQgPSBtb25fdGV4dF9hZGQobWJ1cywgdWJ1cyk7CisJbWJ1cy0+dGV4dF9pbml0ZWQgPSBtb25fdGV4dF9hZGQobWJ1cywgdWJ1cy0+YnVzbnVtKTsKIAkvLyBtb25fYmluX2FkZCguLi4pCiAKIAltdXRleF9sb2NrKCZtb25fbG9jayk7CkBAIC0zMDksNiArMzE0LDE4IEBACiAJcmV0dXJuOwogfQogCitzdGF0aWMgdm9pZCBtb25fYnVzMF9pbml0KHZvaWQpCit7CisJc3RydWN0IG1vbl9idXMgKm1idXMgPSAmbW9uX2J1czA7CisKKwlrcmVmX2luaXQoJm1idXMtPnJlZik7CisJc3Bpbl9sb2NrX2luaXQoJm1idXMtPmxvY2spOworCUlOSVRfTElTVF9IRUFEKCZtYnVzLT5yX2xpc3QpOworCisJbWJ1cy0+dGV4dF9pbml0ZWQgPSBtb25fdGV4dF9hZGQobWJ1cywgMCk7CisJLy8gbWJ1cy0+YmluX2luaXRlZCA9IG1vbl9iaW5fYWRkKG1idXMsIDApOworfQorCiAvKgogICogU2VhcmNoIGEgVVNCIGJ1cyBieSBudW1iZXIuIE5vdGljZSB0aGF0IFVTQiBidXMgbnVtYmVycyBzdGFydCBmcm9tIG9uZSwKICAqIHdoaWNoIHdlIG1heSBsYXRlciB1c2UgdG8gaWRlbnRpZnkgImFsbCIgd2l0aCB6ZXJvLgpAQCAtMzIyLDYgKzMzOSw5IEBACiAJc3RydWN0IGxpc3RfaGVhZCAqcDsKIAlzdHJ1Y3QgbW9uX2J1cyAqbWJ1czsKIAorCWlmIChudW0gPT0gMCkgeworCQlyZXR1cm4gJm1vbl9idXMwOworCX0KIAlsaXN0X2Zvcl9lYWNoIChwLCAmbW9uX2J1c2VzKSB7CiAJCW1idXMgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBtb25fYnVzLCBidXNfbGluayk7CiAJCWlmIChtYnVzLT51X2J1cy0+YnVzbnVtID09IG51bSkgewpAQCAtMzQxLDYgKzM2MSw4IEBACiAJaWYgKChyYyA9IG1vbl9iaW5faW5pdCgpKSAhPSAwKQogCQlnb3RvIGVycl9iaW47CiAKKwltb25fYnVzMF9pbml0KCk7CisKIAlpZiAodXNiX21vbl9yZWdpc3RlcigmbW9uX29wc18wKSAhPSAwKSB7CiAJCXByaW50ayhLRVJOX05PVElDRSBUQUcgIjogdW5hYmxlIHRvIHJlZ2lzdGVyIHdpdGggdGhlIGNvcmVcbiIpOwogCQlyYyA9IC1FTk9ERVY7CkBAIC0zNzQsNiArMzk2LDcgQEAKIAl1c2JfbW9uX2RlcmVnaXN0ZXIoKTsKIAogCW11dGV4X2xvY2soJm1vbl9sb2NrKTsKKwogCXdoaWxlICghbGlzdF9lbXB0eSgmbW9uX2J1c2VzKSkgewogCQlwID0gbW9uX2J1c2VzLm5leHQ7CiAJCW1idXMgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBtb25fYnVzLCBidXNfbGluayk7CkBAIC0zOTcsNiArNDIwLDExIEBACiAJCW1vbl9kaXNzb2x2ZShtYnVzLCBtYnVzLT51X2J1cyk7CiAJCWtyZWZfcHV0KCZtYnVzLT5yZWYsIG1vbl9idXNfZHJvcCk7CiAJfQorCisJbWJ1cyA9ICZtb25fYnVzMDsKKwlpZiAobWJ1cy0+dGV4dF9pbml0ZWQpCisJCW1vbl90ZXh0X2RlbChtYnVzKTsKKwogCW11dGV4X3VubG9jaygmbW9uX2xvY2spOwogCiAJbW9uX3RleHRfZXhpdCgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbW9uL21vbl90ZXh0LmMgYi9kcml2ZXJzL3VzYi9tb24vbW9uX3RleHQuYwppbmRleCA0OTRlZTNiLi5lYzBjYzUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tb24vbW9uX3RleHQuYworKysgYi9kcml2ZXJzL3VzYi9tb24vbW9uX3RleHQuYwpAQCAtMzEsOSArMzEsMjEgQEAKICAqIHRvIGEgbG9jYWwgRG9TLiBCdXQgd2UgaGF2ZSB0byBrZWVwIHRvIHJvb3QgaW4gb3JkZXIgdG8gcHJldmVudAogICogcGFzc3dvcmQgc25pZmZpbmcgZnJvbSBISUQgZGV2aWNlcy4KICAqLwotI2RlZmluZSBFVkVOVF9NQVggICgyKlBBR0VfU0laRSAvIHNpemVvZihzdHJ1Y3QgbW9uX2V2ZW50X3RleHQpKQorI2RlZmluZSBFVkVOVF9NQVggICg0KlBBR0VfU0laRSAvIHNpemVvZihzdHJ1Y3QgbW9uX2V2ZW50X3RleHQpKQogCi0jZGVmaW5lIFBSSU5URl9ERkwgIDE2MAorLyoKKyAqIFBvdGVudGlhbGx5IHVubGltaXRlZCBudW1iZXI7IHdlIGxpbWl0IGl0IGZvciBzaW1pbGFyIGFsbG9jYXRpb25zLgorICogVGhlIHVzYmZzIGxpbWl0cyB0aGlzIHRvIDEyOCwgYnV0IHdlJ3JlIG5vdCBxdWl0ZSBhcyBnZW5lcm91cy4KKyAqLworI2RlZmluZSBJU09ERVNDX01BWCAgIDUKKworI2RlZmluZSBQUklOVEZfREZMICAyNTAgICAvKiB3aXRoIDUgSVNPcyBzZWdzICovCisKK3N0cnVjdCBtb25faXNvX2Rlc2MgeworCWludCBzdGF0dXM7CisJdW5zaWduZWQgaW50IG9mZnNldDsKKwl1bnNpZ25lZCBpbnQgbGVuZ3RoOwkvKiBVbnNpZ25lZCBoZXJlLCBzaWduZWQgaW4gVVJCLiBIaXN0b3JpYy4gKi8KK307CiAKIHN0cnVjdCBtb25fZXZlbnRfdGV4dCB7CiAJc3RydWN0IGxpc3RfaGVhZCBlX2xpbms7CkBAIC00MSwxMCArNTMsMTYgQEAKIAl1bnNpZ25lZCBpbnQgcGlwZTsJLyogUGlwZSAqLwogCXVuc2lnbmVkIGxvbmcgaWQ7CS8qIEZyb20gcG9pbnRlciwgbW9zdCBvZiB0aGUgdGltZSAqLwogCXVuc2lnbmVkIGludCB0c3RhbXA7CisJaW50IGJ1c251bTsKIAlpbnQgbGVuZ3RoOwkJLyogRGVwZW5kcyBvbiB0eXBlOiB4ZmVyIGxlbmd0aCBvciBhY3QgbGVuZ3RoICovCiAJaW50IHN0YXR1czsKKwlpbnQgaW50ZXJ2YWw7CisJaW50IHN0YXJ0X2ZyYW1lOworCWludCBlcnJvcl9jb3VudDsKIAljaGFyIHNldHVwX2ZsYWc7CiAJY2hhciBkYXRhX2ZsYWc7CisJaW50IG51bWRlc2M7CQkvKiBGdWxsIG51bWJlciAqLworCXN0cnVjdCBtb25faXNvX2Rlc2MgaXNvZGVzY1tJU09ERVNDX01BWF07CiAJdW5zaWduZWQgY2hhciBzZXR1cFtTRVRVUF9NQVhdOwogCXVuc2lnbmVkIGNoYXIgZGF0YVtEQVRBX01BWF07CiB9OwpAQCAtNjgsNiArODYsMjggQEAKIAogc3RhdGljIHZvaWQgbW9uX3RleHRfY3Rvcih2b2lkICosIHN0cnVjdCBrbWVtX2NhY2hlICosIHVuc2lnbmVkIGxvbmcpOwogCitzdHJ1Y3QgbW9uX3RleHRfcHRyIHsKKwlpbnQgY250LCBsaW1pdDsKKwljaGFyICpwYnVmOworfTsKKworc3RhdGljIHN0cnVjdCBtb25fZXZlbnRfdGV4dCAqCisgICAgbW9uX3RleHRfcmVhZF93YWl0KHN0cnVjdCBtb25fcmVhZGVyX3RleHQgKnJwLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CitzdGF0aWMgdm9pZCBtb25fdGV4dF9yZWFkX2hlYWRfdChzdHJ1Y3QgbW9uX3JlYWRlcl90ZXh0ICpycCwKKwlzdHJ1Y3QgbW9uX3RleHRfcHRyICpwLCBjb25zdCBzdHJ1Y3QgbW9uX2V2ZW50X3RleHQgKmVwKTsKK3N0YXRpYyB2b2lkIG1vbl90ZXh0X3JlYWRfaGVhZF91KHN0cnVjdCBtb25fcmVhZGVyX3RleHQgKnJwLAorCXN0cnVjdCBtb25fdGV4dF9wdHIgKnAsIGNvbnN0IHN0cnVjdCBtb25fZXZlbnRfdGV4dCAqZXApOworc3RhdGljIHZvaWQgbW9uX3RleHRfcmVhZF9zdGF0c2V0KHN0cnVjdCBtb25fcmVhZGVyX3RleHQgKnJwLAorCXN0cnVjdCBtb25fdGV4dF9wdHIgKnAsIGNvbnN0IHN0cnVjdCBtb25fZXZlbnRfdGV4dCAqZXApOworc3RhdGljIHZvaWQgbW9uX3RleHRfcmVhZF9pbnRzdGF0KHN0cnVjdCBtb25fcmVhZGVyX3RleHQgKnJwLAorCXN0cnVjdCBtb25fdGV4dF9wdHIgKnAsIGNvbnN0IHN0cnVjdCBtb25fZXZlbnRfdGV4dCAqZXApOworc3RhdGljIHZvaWQgbW9uX3RleHRfcmVhZF9pc29zdGF0KHN0cnVjdCBtb25fcmVhZGVyX3RleHQgKnJwLAorCXN0cnVjdCBtb25fdGV4dF9wdHIgKnAsIGNvbnN0IHN0cnVjdCBtb25fZXZlbnRfdGV4dCAqZXApOworc3RhdGljIHZvaWQgbW9uX3RleHRfcmVhZF9pc29kZXNjKHN0cnVjdCBtb25fcmVhZGVyX3RleHQgKnJwLAorCXN0cnVjdCBtb25fdGV4dF9wdHIgKnAsIGNvbnN0IHN0cnVjdCBtb25fZXZlbnRfdGV4dCAqZXApOworc3RhdGljIHZvaWQgbW9uX3RleHRfcmVhZF9kYXRhKHN0cnVjdCBtb25fcmVhZGVyX3RleHQgKnJwLAorICAgIHN0cnVjdCBtb25fdGV4dF9wdHIgKnAsIGNvbnN0IHN0cnVjdCBtb25fZXZlbnRfdGV4dCAqZXApOworCiAvKgogICogbW9uX3RleHRfc3VibWl0CiAgKiBtb25fdGV4dF9jb21wbGV0ZQpAQCAtODQsOCArMTI0LDEwIEBACiAJaWYgKCF1c2JfcGlwZWNvbnRyb2wodXJiLT5waXBlKSB8fCBldl90eXBlICE9ICdTJykKIAkJcmV0dXJuICctJzsKIAotCWlmIChtYnVzLT51c2VzX2RtYSAmJiAodXJiLT50cmFuc2Zlcl9mbGFncyAmIFVSQl9OT19TRVRVUF9ETUFfTUFQKSkKKwlpZiAodXJiLT5kZXYtPmJ1cy0+dXNlc19kbWEgJiYKKwkgICAgKHVyYi0+dHJhbnNmZXJfZmxhZ3MgJiBVUkJfTk9fU0VUVVBfRE1BX01BUCkpIHsKIAkJcmV0dXJuIG1vbl9kbWFwZWVrKGVwLT5zZXR1cCwgdXJiLT5zZXR1cF9kbWEsIFNFVFVQX01BWCk7CisJfQogCWlmICh1cmItPnNldHVwX3BhY2tldCA9PSBOVUxMKQogCQlyZXR1cm4gJ1onOwkvKiAnMCcgd291bGQgYmUgbm90IGFzIHByZXR0eS4gKi8KIApAQCAtMTA0LDEwICsxNDYsMTAgQEAKIAkJbGVuID0gREFUQV9NQVg7CiAKIAlpZiAodXNiX3BpcGVpbihwaXBlKSkgewotCQlpZiAoZXZfdHlwZSA9PSAnUycpCisJCWlmIChldl90eXBlICE9ICdDJykKIAkJCXJldHVybiAnPCc7CiAJfSBlbHNlIHsKLQkJaWYgKGV2X3R5cGUgPT0gJ0MnKQorCQlpZiAoZXZfdHlwZSAhPSAnUycpCiAJCQlyZXR1cm4gJz4nOwogCX0KIApAQCAtMTIwLDggKzE2MiwxMCBAQAogCSAqIGNvbnRhaW4gbm9uLU5VTEwgZ2FyYmFnZSBpbiBjYXNlIHRoZSB1cHBlciBsZXZlbCBwcm9taXNlZCB0bwogCSAqIHNldCBETUEgZm9yIHRoZSBIQ0QuCiAJICovCi0JaWYgKG1idXMtPnVzZXNfZG1hICYmICh1cmItPnRyYW5zZmVyX2ZsYWdzICYgVVJCX05PX1RSQU5TRkVSX0RNQV9NQVApKQorCWlmICh1cmItPmRldi0+YnVzLT51c2VzX2RtYSAmJgorCSAgICAodXJiLT50cmFuc2Zlcl9mbGFncyAmIFVSQl9OT19UUkFOU0ZFUl9ETUFfTUFQKSkgewogCQlyZXR1cm4gbW9uX2RtYXBlZWsoZXAtPmRhdGEsIHVyYi0+dHJhbnNmZXJfZG1hLCBsZW4pOworCX0KIAogCWlmICh1cmItPnRyYW5zZmVyX2J1ZmZlciA9PSBOVUxMKQogCQlyZXR1cm4gJ1onOwkvKiAnMCcgd291bGQgYmUgbm90IGFzIHByZXR0eS4gKi8KQEAgLTE0Niw2ICsxOTAsOSBAQAogewogCXN0cnVjdCBtb25fZXZlbnRfdGV4dCAqZXA7CiAJdW5zaWduZWQgaW50IHN0YW1wOworCXN0cnVjdCB1c2JfaXNvX3BhY2tldF9kZXNjcmlwdG9yICpmcDsKKwlzdHJ1Y3QgbW9uX2lzb19kZXNjICpkcDsKKwlpbnQgaSwgbmRlc2M7CiAKIAlzdGFtcCA9IG1vbl9nZXRfdGltZXN0YW1wKCk7CiAKQEAgLTE1OCwxMiArMjA1LDM2IEBACiAJZXAtPnR5cGUgPSBldl90eXBlOwogCWVwLT5waXBlID0gdXJiLT5waXBlOwogCWVwLT5pZCA9ICh1bnNpZ25lZCBsb25nKSB1cmI7CisJZXAtPmJ1c251bSA9IHVyYi0+ZGV2LT5idXMtPmJ1c251bTsKIAllcC0+dHN0YW1wID0gc3RhbXA7CiAJZXAtPmxlbmd0aCA9IChldl90eXBlID09ICdTJykgPwogCSAgICB1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggOiB1cmItPmFjdHVhbF9sZW5ndGg7CiAJLyogQ29sbGVjdGluZyBzdGF0dXMgbWFrZXMgZGVidWdnaW5nIHNlbnNlIGZvciBzdWJtaXRzLCB0b28gKi8KIAllcC0+c3RhdHVzID0gdXJiLT5zdGF0dXM7CiAKKwlpZiAodXNiX3BpcGVpbnQodXJiLT5waXBlKSkgeworCQllcC0+aW50ZXJ2YWwgPSB1cmItPmludGVydmFsOworCX0gZWxzZSBpZiAodXNiX3BpcGVpc29jKHVyYi0+cGlwZSkpIHsKKwkJZXAtPmludGVydmFsID0gdXJiLT5pbnRlcnZhbDsKKwkJZXAtPnN0YXJ0X2ZyYW1lID0gdXJiLT5zdGFydF9mcmFtZTsKKwkJZXAtPmVycm9yX2NvdW50ID0gdXJiLT5lcnJvcl9jb3VudDsKKwl9CisJZXAtPm51bWRlc2MgPSB1cmItPm51bWJlcl9vZl9wYWNrZXRzOworCWlmICh1c2JfcGlwZWlzb2ModXJiLT5waXBlKSAmJiB1cmItPm51bWJlcl9vZl9wYWNrZXRzID4gMCkgeworCQlpZiAoKG5kZXNjID0gdXJiLT5udW1iZXJfb2ZfcGFja2V0cykgPiBJU09ERVNDX01BWCkKKwkJCW5kZXNjID0gSVNPREVTQ19NQVg7CisJCWZwID0gdXJiLT5pc29fZnJhbWVfZGVzYzsKKwkJZHAgPSBlcC0+aXNvZGVzYzsKKwkJZm9yIChpID0gMDsgaSA8IG5kZXNjOyBpKyspIHsKKwkJCWRwLT5zdGF0dXMgPSBmcC0+c3RhdHVzOworCQkJZHAtPm9mZnNldCA9IGZwLT5vZmZzZXQ7CisJCQlkcC0+bGVuZ3RoID0gKGV2X3R5cGUgPT0gJ1MnKSA/CisJCQkgICAgZnAtPmxlbmd0aCA6IGZwLT5hY3R1YWxfbGVuZ3RoOworCQkJZnArKzsKKwkJCWRwKys7CisJCX0KKwl9CisKIAllcC0+c2V0dXBfZmxhZyA9IG1vbl90ZXh0X2dldF9zZXR1cChlcCwgdXJiLCBldl90eXBlLCBycC0+ci5tX2J1cyk7CiAJZXAtPmRhdGFfZmxhZyA9IG1vbl90ZXh0X2dldF9kYXRhKGVwLCB1cmIsIGVwLT5sZW5ndGgsIGV2X3R5cGUsCiAJCQlycC0+ci5tX2J1cyk7CkBAIC0xOTksNiArMjcwLDcgQEAKIAllcC0+dHlwZSA9ICdFJzsKIAllcC0+cGlwZSA9IHVyYi0+cGlwZTsKIAllcC0+aWQgPSAodW5zaWduZWQgbG9uZykgdXJiOworCWVwLT5idXNudW0gPSAwOwogCWVwLT50c3RhbXAgPSAwOwogCWVwLT5sZW5ndGggPSAwOwogCWVwLT5zdGF0dXMgPSBlcnJvcjsKQEAgLTIzNywxMyArMzA5LDExIEBACiBzdGF0aWMgaW50IG1vbl90ZXh0X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7CiAJc3RydWN0IG1vbl9idXMgKm1idXM7Ci0Jc3RydWN0IHVzYl9idXMgKnVidXM7CiAJc3RydWN0IG1vbl9yZWFkZXJfdGV4dCAqcnA7CiAJaW50IHJjOwogCiAJbXV0ZXhfbG9jaygmbW9uX2xvY2spOwogCW1idXMgPSBpbm9kZS0+aV9wcml2YXRlOwotCXVidXMgPSBtYnVzLT51X2J1czsKIAogCXJwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1vbl9yZWFkZXJfdGV4dCksIEdGUF9LRVJORUwpOwogCWlmIChycCA9PSBOVUxMKSB7CkBAIC0yNjcsOCArMzM3LDcgQEAKIAlycC0+ci5ybmZfZXJyb3IgPSBtb25fdGV4dF9lcnJvcjsKIAlycC0+ci5ybmZfY29tcGxldGUgPSBtb25fdGV4dF9jb21wbGV0ZTsKIAotCXNucHJpbnRmKHJwLT5zbGFiX25hbWUsIFNMQUJfTkFNRV9TWiwgIm1vbiVkdF8lbHgiLCB1YnVzLT5idXNudW0sCi0JICAgIChsb25nKXJwKTsKKwlzbnByaW50ZihycC0+c2xhYl9uYW1lLCBTTEFCX05BTUVfU1osICJtb25fdGV4dF8lcCIsIHJwKTsKIAlycC0+ZV9zbGFiID0ga21lbV9jYWNoZV9jcmVhdGUocnAtPnNsYWJfbmFtZSwKIAkgICAgc2l6ZW9mKHN0cnVjdCBtb25fZXZlbnRfdGV4dCksIHNpemVvZihsb25nKSwgMCwKIAkgICAgbW9uX3RleHRfY3RvciwgTlVMTCk7CkBAIC0zMDAsMTcgKzM2OSw3NSBAQAogICogICBkZCBpZj0vZGJnL3VzYm1vbi8wdCBicz0xMAogICogQWxzbywgd2UgZG8gbm90IGFsbG93IHNlZWtzIGFuZCBkbyBub3QgYm90aGVyIGFkdmFuY2luZyB0aGUgb2Zmc2V0LgogICovCi1zdGF0aWMgc3NpemVfdCBtb25fdGV4dF9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAorc3RhdGljIHNzaXplX3QgbW9uX3RleHRfcmVhZF90KHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAogCQkJCXNpemVfdCBuYnl0ZXMsIGxvZmZfdCAqcHBvcykKIHsKIAlzdHJ1Y3QgbW9uX3JlYWRlcl90ZXh0ICpycCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgbW9uX2V2ZW50X3RleHQgKmVwOworCXN0cnVjdCBtb25fdGV4dF9wdHIgcHRyOworCisJaWYgKElTX0VSUihlcCA9IG1vbl90ZXh0X3JlYWRfd2FpdChycCwgZmlsZSkpKQorCQlyZXR1cm4gUFRSX0VSUihlcCk7CisJbXV0ZXhfbG9jaygmcnAtPnByaW50Zl9sb2NrKTsKKwlwdHIuY250ID0gMDsKKwlwdHIucGJ1ZiA9IHJwLT5wcmludGZfYnVmOworCXB0ci5saW1pdCA9IHJwLT5wcmludGZfc2l6ZTsKKworCW1vbl90ZXh0X3JlYWRfaGVhZF90KHJwLCAmcHRyLCBlcCk7CisJbW9uX3RleHRfcmVhZF9zdGF0c2V0KHJwLCAmcHRyLCBlcCk7CisJcHRyLmNudCArPSBzbnByaW50ZihwdHIucGJ1ZiArIHB0ci5jbnQsIHB0ci5saW1pdCAtIHB0ci5jbnQsCisJICAgICIgJWQiLCBlcC0+bGVuZ3RoKTsKKwltb25fdGV4dF9yZWFkX2RhdGEocnAsICZwdHIsIGVwKTsKKworCWlmIChjb3B5X3RvX3VzZXIoYnVmLCBycC0+cHJpbnRmX2J1ZiwgcHRyLmNudCkpCisJCXB0ci5jbnQgPSAtRUZBVUxUOworCW11dGV4X3VubG9jaygmcnAtPnByaW50Zl9sb2NrKTsKKwlrbWVtX2NhY2hlX2ZyZWUocnAtPmVfc2xhYiwgZXApOworCXJldHVybiBwdHIuY250OworfQorCitzdGF0aWMgc3NpemVfdCBtb25fdGV4dF9yZWFkX3Uoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCisJCQkJc2l6ZV90IG5ieXRlcywgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBtb25fcmVhZGVyX3RleHQgKnJwID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBtb25fZXZlbnRfdGV4dCAqZXA7CisJc3RydWN0IG1vbl90ZXh0X3B0ciBwdHI7CisKKwlpZiAoSVNfRVJSKGVwID0gbW9uX3RleHRfcmVhZF93YWl0KHJwLCBmaWxlKSkpCisJCXJldHVybiBQVFJfRVJSKGVwKTsKKwltdXRleF9sb2NrKCZycC0+cHJpbnRmX2xvY2spOworCXB0ci5jbnQgPSAwOworCXB0ci5wYnVmID0gcnAtPnByaW50Zl9idWY7CisJcHRyLmxpbWl0ID0gcnAtPnByaW50Zl9zaXplOworCisJbW9uX3RleHRfcmVhZF9oZWFkX3UocnAsICZwdHIsIGVwKTsKKwlpZiAoZXAtPnR5cGUgPT0gJ0UnKSB7CisJCW1vbl90ZXh0X3JlYWRfc3RhdHNldChycCwgJnB0ciwgZXApOworCX0gZWxzZSBpZiAodXNiX3BpcGVpc29jKGVwLT5waXBlKSkgeworCQltb25fdGV4dF9yZWFkX2lzb3N0YXQocnAsICZwdHIsIGVwKTsKKwkJbW9uX3RleHRfcmVhZF9pc29kZXNjKHJwLCAmcHRyLCBlcCk7CisJfSBlbHNlIGlmICh1c2JfcGlwZWludChlcC0+cGlwZSkpIHsKKwkJbW9uX3RleHRfcmVhZF9pbnRzdGF0KHJwLCAmcHRyLCBlcCk7CisJfSBlbHNlIHsKKwkJbW9uX3RleHRfcmVhZF9zdGF0c2V0KHJwLCAmcHRyLCBlcCk7CisJfQorCXB0ci5jbnQgKz0gc25wcmludGYocHRyLnBidWYgKyBwdHIuY250LCBwdHIubGltaXQgLSBwdHIuY250LAorCSAgICAiICVkIiwgZXAtPmxlbmd0aCk7CisJbW9uX3RleHRfcmVhZF9kYXRhKHJwLCAmcHRyLCBlcCk7CisKKwlpZiAoY29weV90b191c2VyKGJ1ZiwgcnAtPnByaW50Zl9idWYsIHB0ci5jbnQpKQorCQlwdHIuY250ID0gLUVGQVVMVDsKKwltdXRleF91bmxvY2soJnJwLT5wcmludGZfbG9jayk7CisJa21lbV9jYWNoZV9mcmVlKHJwLT5lX3NsYWIsIGVwKTsKKwlyZXR1cm4gcHRyLmNudDsKK30KKworc3RhdGljIHN0cnVjdCBtb25fZXZlbnRfdGV4dCAqbW9uX3RleHRfcmVhZF93YWl0KHN0cnVjdCBtb25fcmVhZGVyX3RleHQgKnJwLAorICAgIHN0cnVjdCBmaWxlICpmaWxlKQorewogCXN0cnVjdCBtb25fYnVzICptYnVzID0gcnAtPnIubV9idXM7CiAJREVDTEFSRV9XQUlUUVVFVUUod2FpdGEsIGN1cnJlbnQpOwogCXN0cnVjdCBtb25fZXZlbnRfdGV4dCAqZXA7Ci0JaW50IGNudCwgbGltaXQ7Ci0JY2hhciAqcGJ1ZjsKLQljaGFyIHVkaXIsIHV0eXBlOwotCWludCBkYXRhX2xlbiwgaTsKIAogCWFkZF93YWl0X3F1ZXVlKCZycC0+d2FpdCwgJndhaXRhKTsKIAlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwpAQCAtMzE4LDcgKzQ0NSw3IEBACiAJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgewogCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKIAkJCXJlbW92ZV93YWl0X3F1ZXVlKCZycC0+d2FpdCwgJndhaXRhKTsKLQkJCXJldHVybiAtRVdPVUxEQkxPQ0s7CS8qIFNhbWUgYXMgRUFHQUlOIGluIExpbnV4ICovCisJCQlyZXR1cm4gRVJSX1BUUigtRVdPVUxEQkxPQ0spOwogCQl9CiAJCS8qCiAJCSAqIFdlIGRvIG5vdCBjb3VudCBud2FpdGVycywgYmVjYXVzZSAtPnJlbGVhc2UgaXMgc3VwcG9zZWQKQEAgLTMyNywxNyArNDU0LDE5IEBACiAJCXNjaGVkdWxlKCk7CiAJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgewogCQkJcmVtb3ZlX3dhaXRfcXVldWUoJnJwLT53YWl0LCAmd2FpdGEpOwotCQkJcmV0dXJuIC1FSU5UUjsKKwkJCXJldHVybiBFUlJfUFRSKC1FSU5UUik7CiAJCX0KIAkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKIAl9CiAJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKIAlyZW1vdmVfd2FpdF9xdWV1ZSgmcnAtPndhaXQsICZ3YWl0YSk7CisJcmV0dXJuIGVwOworfQogCi0JbXV0ZXhfbG9jaygmcnAtPnByaW50Zl9sb2NrKTsKLQljbnQgPSAwOwotCXBidWYgPSBycC0+cHJpbnRmX2J1ZjsKLQlsaW1pdCA9IHJwLT5wcmludGZfc2l6ZTsKK3N0YXRpYyB2b2lkIG1vbl90ZXh0X3JlYWRfaGVhZF90KHN0cnVjdCBtb25fcmVhZGVyX3RleHQgKnJwLAorCXN0cnVjdCBtb25fdGV4dF9wdHIgKnAsIGNvbnN0IHN0cnVjdCBtb25fZXZlbnRfdGV4dCAqZXApCit7CisJY2hhciB1ZGlyLCB1dHlwZTsKIAogCXVkaXIgPSB1c2JfcGlwZWluKGVwLT5waXBlKSA/ICdpJyA6ICdvJzsKIAlzd2l0Y2ggKHVzYl9waXBldHlwZShlcC0+cGlwZSkpIHsKQEAgLTM0NiwxMyArNDc1LDM4IEBACiAJY2FzZSBQSVBFX0NPTlRST0w6CXV0eXBlID0gJ0MnOyBicmVhazsKIAlkZWZhdWx0OiAvKiBQSVBFX0JVTEsgKi8gIHV0eXBlID0gJ0InOwogCX0KLQljbnQgKz0gc25wcmludGYocGJ1ZiArIGNudCwgbGltaXQgLSBjbnQsCisJcC0+Y250ICs9IHNucHJpbnRmKHAtPnBidWYgKyBwLT5jbnQsIHAtPmxpbWl0IC0gcC0+Y250LAogCSAgICAiJWx4ICV1ICVjICVjJWM6JTAzdTolMDJ1IiwKIAkgICAgZXAtPmlkLCBlcC0+dHN0YW1wLCBlcC0+dHlwZSwKLQkgICAgdXR5cGUsIHVkaXIsIHVzYl9waXBlZGV2aWNlKGVwLT5waXBlKSwgdXNiX3BpcGVlbmRwb2ludChlcC0+cGlwZSkpOworCSAgICB1dHlwZSwgdWRpciwKKwkgICAgdXNiX3BpcGVkZXZpY2UoZXAtPnBpcGUpLCB1c2JfcGlwZWVuZHBvaW50KGVwLT5waXBlKSk7Cit9CisKK3N0YXRpYyB2b2lkIG1vbl90ZXh0X3JlYWRfaGVhZF91KHN0cnVjdCBtb25fcmVhZGVyX3RleHQgKnJwLAorCXN0cnVjdCBtb25fdGV4dF9wdHIgKnAsIGNvbnN0IHN0cnVjdCBtb25fZXZlbnRfdGV4dCAqZXApCit7CisJY2hhciB1ZGlyLCB1dHlwZTsKKworCXVkaXIgPSB1c2JfcGlwZWluKGVwLT5waXBlKSA/ICdpJyA6ICdvJzsKKwlzd2l0Y2ggKHVzYl9waXBldHlwZShlcC0+cGlwZSkpIHsKKwljYXNlIFBJUEVfSVNPQ0hST05PVVM6CXV0eXBlID0gJ1onOyBicmVhazsKKwljYXNlIFBJUEVfSU5URVJSVVBUOgl1dHlwZSA9ICdJJzsgYnJlYWs7CisJY2FzZSBQSVBFX0NPTlRST0w6CXV0eXBlID0gJ0MnOyBicmVhazsKKwlkZWZhdWx0OiAvKiBQSVBFX0JVTEsgKi8gIHV0eXBlID0gJ0InOworCX0KKwlwLT5jbnQgKz0gc25wcmludGYocC0+cGJ1ZiArIHAtPmNudCwgcC0+bGltaXQgLSBwLT5jbnQsCisJICAgICIlbHggJXUgJWMgJWMlYzolZDolMDN1OiV1IiwKKwkgICAgZXAtPmlkLCBlcC0+dHN0YW1wLCBlcC0+dHlwZSwKKwkgICAgdXR5cGUsIHVkaXIsCisJICAgIGVwLT5idXNudW0sIHVzYl9waXBlZGV2aWNlKGVwLT5waXBlKSwgdXNiX3BpcGVlbmRwb2ludChlcC0+cGlwZSkpOworfQorCitzdGF0aWMgdm9pZCBtb25fdGV4dF9yZWFkX3N0YXRzZXQoc3RydWN0IG1vbl9yZWFkZXJfdGV4dCAqcnAsCisJc3RydWN0IG1vbl90ZXh0X3B0ciAqcCwgY29uc3Qgc3RydWN0IG1vbl9ldmVudF90ZXh0ICplcCkKK3sKIAogCWlmIChlcC0+c2V0dXBfZmxhZyA9PSAwKSB7ICAgLyogU2V0dXAgcGFja2V0IGlzIHByZXNlbnQgYW5kIGNhcHR1cmVkICovCi0JCWNudCArPSBzbnByaW50ZihwYnVmICsgY250LCBsaW1pdCAtIGNudCwKKwkJcC0+Y250ICs9IHNucHJpbnRmKHAtPnBidWYgKyBwLT5jbnQsIHAtPmxpbWl0IC0gcC0+Y250LAogCQkgICAgIiBzICUwMnggJTAyeCAlMDR4ICUwNHggJTA0eCIsCiAJCSAgICBlcC0+c2V0dXBbMF0sCiAJCSAgICBlcC0+c2V0dXBbMV0sCkBAIC0zNjAsNDAgKzUxNCw4NiBAQAogCQkgICAgKGVwLT5zZXR1cFs1XSA8PCA4KSB8IGVwLT5zZXR1cFs0XSwKIAkJICAgIChlcC0+c2V0dXBbN10gPDwgOCkgfCBlcC0+c2V0dXBbNl0pOwogCX0gZWxzZSBpZiAoZXAtPnNldHVwX2ZsYWcgIT0gJy0nKSB7IC8qIFVuYWJsZSB0byBjYXB0dXJlIHNldHVwIHBhY2tldCAqLwotCQljbnQgKz0gc25wcmludGYocGJ1ZiArIGNudCwgbGltaXQgLSBjbnQsCisJCXAtPmNudCArPSBzbnByaW50ZihwLT5wYnVmICsgcC0+Y250LCBwLT5saW1pdCAtIHAtPmNudCwKIAkJICAgICIgJWMgX18gX18gX19fXyBfX19fIF9fX18iLCBlcC0+c2V0dXBfZmxhZyk7CiAJfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAvKiBObyBzZXR1cCBmb3IgdGhpcyBraW5kIG9mIFVSQiAqLwotCQljbnQgKz0gc25wcmludGYocGJ1ZiArIGNudCwgbGltaXQgLSBjbnQsICIgJWQiLCBlcC0+c3RhdHVzKTsKKwkJcC0+Y250ICs9IHNucHJpbnRmKHAtPnBidWYgKyBwLT5jbnQsIHAtPmxpbWl0IC0gcC0+Y250LAorCQkgICAgIiAlZCIsIGVwLT5zdGF0dXMpOwogCX0KLQljbnQgKz0gc25wcmludGYocGJ1ZiArIGNudCwgbGltaXQgLSBjbnQsICIgJWQiLCBlcC0+bGVuZ3RoKTsKK30KKworc3RhdGljIHZvaWQgbW9uX3RleHRfcmVhZF9pbnRzdGF0KHN0cnVjdCBtb25fcmVhZGVyX3RleHQgKnJwLAorCXN0cnVjdCBtb25fdGV4dF9wdHIgKnAsIGNvbnN0IHN0cnVjdCBtb25fZXZlbnRfdGV4dCAqZXApCit7CisJcC0+Y250ICs9IHNucHJpbnRmKHAtPnBidWYgKyBwLT5jbnQsIHAtPmxpbWl0IC0gcC0+Y250LAorCSAgICAiICVkOiVkIiwgZXAtPnN0YXR1cywgZXAtPmludGVydmFsKTsKK30KKworc3RhdGljIHZvaWQgbW9uX3RleHRfcmVhZF9pc29zdGF0KHN0cnVjdCBtb25fcmVhZGVyX3RleHQgKnJwLAorCXN0cnVjdCBtb25fdGV4dF9wdHIgKnAsIGNvbnN0IHN0cnVjdCBtb25fZXZlbnRfdGV4dCAqZXApCit7CisJaWYgKGVwLT50eXBlID09ICdTJykgeworCQlwLT5jbnQgKz0gc25wcmludGYocC0+cGJ1ZiArIHAtPmNudCwgcC0+bGltaXQgLSBwLT5jbnQsCisJCSAgICAiICVkOiVkOiVkIiwgZXAtPnN0YXR1cywgZXAtPmludGVydmFsLCBlcC0+c3RhcnRfZnJhbWUpOworCX0gZWxzZSB7CisJCXAtPmNudCArPSBzbnByaW50ZihwLT5wYnVmICsgcC0+Y250LCBwLT5saW1pdCAtIHAtPmNudCwKKwkJICAgICIgJWQ6JWQ6JWQ6JWQiLAorCQkgICAgZXAtPnN0YXR1cywgZXAtPmludGVydmFsLCBlcC0+c3RhcnRfZnJhbWUsIGVwLT5lcnJvcl9jb3VudCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBtb25fdGV4dF9yZWFkX2lzb2Rlc2Moc3RydWN0IG1vbl9yZWFkZXJfdGV4dCAqcnAsCisJc3RydWN0IG1vbl90ZXh0X3B0ciAqcCwgY29uc3Qgc3RydWN0IG1vbl9ldmVudF90ZXh0ICplcCkKK3sKKwlpbnQgbmRlc2M7CS8qIERpc3BsYXkgdGhpcyBtYW55ICovCisJaW50IGk7CisJY29uc3Qgc3RydWN0IG1vbl9pc29fZGVzYyAqZHA7CisKKwlwLT5jbnQgKz0gc25wcmludGYocC0+cGJ1ZiArIHAtPmNudCwgcC0+bGltaXQgLSBwLT5jbnQsCisJICAgICIgJWQiLCBlcC0+bnVtZGVzYyk7CisJbmRlc2MgPSBlcC0+bnVtZGVzYzsKKwlpZiAobmRlc2MgPiBJU09ERVNDX01BWCkKKwkJbmRlc2MgPSBJU09ERVNDX01BWDsKKwlpZiAobmRlc2MgPCAwKQorCQluZGVzYyA9IDA7CisJZHAgPSBlcC0+aXNvZGVzYzsKKwlmb3IgKGkgPSAwOyBpIDwgbmRlc2M7IGkrKykgeworCQlwLT5jbnQgKz0gc25wcmludGYocC0+cGJ1ZiArIHAtPmNudCwgcC0+bGltaXQgLSBwLT5jbnQsCisJCSAgICAiICVkOiV1OiV1IiwgZHAtPnN0YXR1cywgZHAtPm9mZnNldCwgZHAtPmxlbmd0aCk7CisJCWRwKys7CisJfQorfQorCitzdGF0aWMgdm9pZCBtb25fdGV4dF9yZWFkX2RhdGEoc3RydWN0IG1vbl9yZWFkZXJfdGV4dCAqcnAsCisgICAgc3RydWN0IG1vbl90ZXh0X3B0ciAqcCwgY29uc3Qgc3RydWN0IG1vbl9ldmVudF90ZXh0ICplcCkKK3sKKwlpbnQgZGF0YV9sZW4sIGk7CiAKIAlpZiAoKGRhdGFfbGVuID0gZXAtPmxlbmd0aCkgPiAwKSB7CiAJCWlmIChlcC0+ZGF0YV9mbGFnID09IDApIHsKLQkJCWNudCArPSBzbnByaW50ZihwYnVmICsgY250LCBsaW1pdCAtIGNudCwgIiA9Iik7CisJCQlwLT5jbnQgKz0gc25wcmludGYocC0+cGJ1ZiArIHAtPmNudCwgcC0+bGltaXQgLSBwLT5jbnQsCisJCQkgICAgIiA9Iik7CiAJCQlpZiAoZGF0YV9sZW4gPj0gREFUQV9NQVgpCiAJCQkJZGF0YV9sZW4gPSBEQVRBX01BWDsKIAkJCWZvciAoaSA9IDA7IGkgPCBkYXRhX2xlbjsgaSsrKSB7CiAJCQkJaWYgKGkgJSA0ID09IDApIHsKLQkJCQkJY250ICs9IHNucHJpbnRmKHBidWYgKyBjbnQsIGxpbWl0IC0gY250LAorCQkJCQlwLT5jbnQgKz0gc25wcmludGYocC0+cGJ1ZiArIHAtPmNudCwKKwkJCQkJICAgIHAtPmxpbWl0IC0gcC0+Y250LAogCQkJCQkgICAgIiAiKTsKIAkJCQl9Ci0JCQkJY250ICs9IHNucHJpbnRmKHBidWYgKyBjbnQsIGxpbWl0IC0gY250LAorCQkJCXAtPmNudCArPSBzbnByaW50ZihwLT5wYnVmICsgcC0+Y250LAorCQkJCSAgICBwLT5saW1pdCAtIHAtPmNudCwKIAkJCQkgICAgIiUwMngiLCBlcC0+ZGF0YVtpXSk7CiAJCQl9Ci0JCQljbnQgKz0gc25wcmludGYocGJ1ZiArIGNudCwgbGltaXQgLSBjbnQsICJcbiIpOworCQkJcC0+Y250ICs9IHNucHJpbnRmKHAtPnBidWYgKyBwLT5jbnQsIHAtPmxpbWl0IC0gcC0+Y250LAorCQkJICAgICJcbiIpOwogCQl9IGVsc2UgewotCQkJY250ICs9IHNucHJpbnRmKHBidWYgKyBjbnQsIGxpbWl0IC0gY250LAorCQkJcC0+Y250ICs9IHNucHJpbnRmKHAtPnBidWYgKyBwLT5jbnQsIHAtPmxpbWl0IC0gcC0+Y250LAogCQkJICAgICIgJWNcbiIsIGVwLT5kYXRhX2ZsYWcpOwogCQl9CiAJfSBlbHNlIHsKLQkJY250ICs9IHNucHJpbnRmKHBidWYgKyBjbnQsIGxpbWl0IC0gY250LCAiXG4iKTsKKwkJcC0+Y250ICs9IHNucHJpbnRmKHAtPnBidWYgKyBwLT5jbnQsIHAtPmxpbWl0IC0gcC0+Y250LCAiXG4iKTsKIAl9Ci0KLQlpZiAoY29weV90b191c2VyKGJ1ZiwgcnAtPnByaW50Zl9idWYsIGNudCkpCi0JCWNudCA9IC1FRkFVTFQ7Ci0JbXV0ZXhfdW5sb2NrKCZycC0+cHJpbnRmX2xvY2spOwotCWttZW1fY2FjaGVfZnJlZShycC0+ZV9zbGFiLCBlcCk7Ci0JcmV0dXJuIGNudDsKIH0KIAogc3RhdGljIGludCBtb25fdGV4dF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQpAQCAtNDM5LDM0ICs2MzksNDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbW9uX2ZvcHNfdGV4dCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG1vbl9mb3BzX3RleHRfdCA9IHsKIAkub3duZXIgPQlUSElTX01PRFVMRSwKIAkub3BlbiA9CQltb25fdGV4dF9vcGVuLAogCS5sbHNlZWsgPQlub19sbHNlZWssCi0JLnJlYWQgPQkJbW9uX3RleHRfcmVhZCwKLQkvKiAud3JpdGUgPQltb25fdGV4dF93cml0ZSwgKi8KLQkvKiAucG9sbCA9CQltb25fdGV4dF9wb2xsLCAqLwotCS8qIC5pb2N0bCA9CW1vbl90ZXh0X2lvY3RsLCAqLworCS5yZWFkID0JCW1vbl90ZXh0X3JlYWRfdCwKIAkucmVsZWFzZSA9CW1vbl90ZXh0X3JlbGVhc2UsCiB9OwogCi1pbnQgbW9uX3RleHRfYWRkKHN0cnVjdCBtb25fYnVzICptYnVzLCBjb25zdCBzdHJ1Y3QgdXNiX2J1cyAqdWJ1cykKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG1vbl9mb3BzX3RleHRfdSA9IHsKKwkub3duZXIgPQlUSElTX01PRFVMRSwKKwkub3BlbiA9CQltb25fdGV4dF9vcGVuLAorCS5sbHNlZWsgPQlub19sbHNlZWssCisJLnJlYWQgPQkJbW9uX3RleHRfcmVhZF91LAorCS5yZWxlYXNlID0JbW9uX3RleHRfcmVsZWFzZSwKK307CisKK2ludCBtb25fdGV4dF9hZGQoc3RydWN0IG1vbl9idXMgKm1idXMsIGludCBidXNudW0pCiB7CiAJc3RydWN0IGRlbnRyeSAqZDsKIAllbnVtIHsgTkFNRVNaID0gMTAgfTsKIAljaGFyIG5hbWVbTkFNRVNaXTsKIAlpbnQgcmM7CiAKLQlyYyA9IHNucHJpbnRmKG5hbWUsIE5BTUVTWiwgIiVkdCIsIHVidXMtPmJ1c251bSk7CisJcmMgPSBzbnByaW50ZihuYW1lLCBOQU1FU1osICIlZHQiLCBidXNudW0pOwogCWlmIChyYyA8PSAwIHx8IHJjID49IE5BTUVTWikKIAkJZ290byBlcnJfcHJpbnRfdDsKLQlkID0gZGVidWdmc19jcmVhdGVfZmlsZShuYW1lLCAwNjAwLCBtb25fZGlyLCBtYnVzLCAmbW9uX2ZvcHNfdGV4dCk7CisJZCA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUobmFtZSwgMDYwMCwgbW9uX2RpciwgbWJ1cywgJm1vbl9mb3BzX3RleHRfdCk7CiAJaWYgKGQgPT0gTlVMTCkKIAkJZ290byBlcnJfY3JlYXRlX3Q7CiAJbWJ1cy0+ZGVudF90ID0gZDsKIAotCS8qIFhYWCBUaGUgc3RhdHMgZG8gbm90IGJlbG9uZyB0byBoZXJlICh0ZXh0IEFQSSksIGJ1dCBvaCB3ZWxsLi4uICovCi0JcmMgPSBzbnByaW50ZihuYW1lLCBOQU1FU1osICIlZHMiLCB1YnVzLT5idXNudW0pOworCXJjID0gc25wcmludGYobmFtZSwgTkFNRVNaLCAiJWR1IiwgYnVzbnVtKTsKKwlpZiAocmMgPD0gMCB8fCByYyA+PSBOQU1FU1opCisJCWdvdG8gZXJyX3ByaW50X3U7CisJZCA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUobmFtZSwgMDYwMCwgbW9uX2RpciwgbWJ1cywgJm1vbl9mb3BzX3RleHRfdSk7CisJaWYgKGQgPT0gTlVMTCkKKwkJZ290byBlcnJfY3JlYXRlX3U7CisJbWJ1cy0+ZGVudF91ID0gZDsKKworCXJjID0gc25wcmludGYobmFtZSwgTkFNRVNaLCAiJWRzIiwgYnVzbnVtKTsKIAlpZiAocmMgPD0gMCB8fCByYyA+PSBOQU1FU1opCiAJCWdvdG8gZXJyX3ByaW50X3M7CiAJZCA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUobmFtZSwgMDYwMCwgbW9uX2RpciwgbWJ1cywgJm1vbl9mb3BzX3N0YXQpOwpAQCAtNDc4LDYgKzY5MCwxMCBAQAogCiBlcnJfY3JlYXRlX3M6CiBlcnJfcHJpbnRfczoKKwlkZWJ1Z2ZzX3JlbW92ZShtYnVzLT5kZW50X3UpOworCW1idXMtPmRlbnRfdSA9IE5VTEw7CitlcnJfY3JlYXRlX3U6CitlcnJfcHJpbnRfdToKIAlkZWJ1Z2ZzX3JlbW92ZShtYnVzLT5kZW50X3QpOwogCW1idXMtPmRlbnRfdCA9IE5VTEw7CiBlcnJfY3JlYXRlX3Q6CkBAIC00ODcsNiArNzAzLDcgQEAKIAogdm9pZCBtb25fdGV4dF9kZWwoc3RydWN0IG1vbl9idXMgKm1idXMpCiB7CisJZGVidWdmc19yZW1vdmUobWJ1cy0+ZGVudF91KTsKIAlkZWJ1Z2ZzX3JlbW92ZShtYnVzLT5kZW50X3QpOwogCWRlYnVnZnNfcmVtb3ZlKG1idXMtPmRlbnRfcyk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tb24vdXNiX21vbi5oIGIvZHJpdmVycy91c2IvbW9uL3VzYl9tb24uaAppbmRleCBlZmRmZDg5Li4xM2Q2MzI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tb24vdXNiX21vbi5oCisrKyBiL2RyaXZlcnMvdXNiL21vbi91c2JfbW9uLmgKQEAgLTIyLDcgKzIyLDcgQEAKIAlpbnQgdGV4dF9pbml0ZWQ7CiAJc3RydWN0IGRlbnRyeSAqZGVudF9zOwkJLyogRGVidWdnaW5nIGZpbGUgKi8KIAlzdHJ1Y3QgZGVudHJ5ICpkZW50X3Q7CQkvKiBUZXh0IGludGVyZmFjZSBmaWxlICovCi0JaW50IHVzZXNfZG1hOworCXN0cnVjdCBkZW50cnkgKmRlbnRfdTsJCS8qIFNlY29uZCB0ZXh0IGludGVyZmFjZSBmaWxlICovCiAKIAkvKiBSZWYgKi8KIAlpbnQgbnJlYWRlcnM7CQkJLyogVW5kZXIgbW9uX2xvY2sgQU5EIG1idXMtPmxvY2sgKi8KQEAgLTUyLDcgKzUyLDcgQEAKIAogc3RydWN0IG1vbl9idXMgKm1vbl9idXNfbG9va3VwKHVuc2lnbmVkIGludCBudW0pOwogCi1pbnQgLypib29sKi8gbW9uX3RleHRfYWRkKHN0cnVjdCBtb25fYnVzICptYnVzLCBjb25zdCBzdHJ1Y3QgdXNiX2J1cyAqdWJ1cyk7CitpbnQgLypib29sKi8gbW9uX3RleHRfYWRkKHN0cnVjdCBtb25fYnVzICptYnVzLCBpbnQgYnVzbnVtKTsKIHZvaWQgbW9uX3RleHRfZGVsKHN0cnVjdCBtb25fYnVzICptYnVzKTsKIC8vIHZvaWQgbW9uX2Jpbl9hZGQoc3RydWN0IG1vbl9idXMgKik7CiAKQEAgLTgxLDQgKzgxLDYgQEAKIAogZXh0ZXJuIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbW9uX2ZvcHNfc3RhdDsKIAorZXh0ZXJuIHN0cnVjdCBtb25fYnVzIG1vbl9idXMwOwkJLyogT25seSBmb3IgcmVkdW5kYW50IGNoZWNrcyAqLworCiAjZW5kaWYgLyogX19VU0JfTU9OX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL25ldC9hc2l4LmMgYi9kcml2ZXJzL3VzYi9uZXQvYXNpeC5jCmluZGV4IDU4MDhlYTAuLmQ1ZWY5N2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL25ldC9hc2l4LmMKKysrIGIvZHJpdmVycy91c2IvbmV0L2FzaXguYwpAQCAtMjk4LDcgKzI5OCw3IEBACiAJCWlmIChheF9za2IpIHsKIAkJCWF4X3NrYi0+bGVuID0gc2l6ZTsKIAkJCWF4X3NrYi0+ZGF0YSA9IHBhY2tldDsKLQkJCWF4X3NrYi0+dGFpbCA9IHBhY2tldCArIHNpemU7CisJCQlza2Jfc2V0X3RhaWxfcG9pbnRlcihheF9za2IsIHNpemUpOwogCQkJdXNibmV0X3NrYl9yZXR1cm4oZGV2LCBheF9za2IpOwogCQl9IGVsc2UgewogCQkJcmV0dXJuIDA7CkBAIC0zMzgsNyArMzM4LDcgQEAKIAkgICAgJiYgKChoZWFkcm9vbSArIHRhaWxyb29tKSA+PSAoNCArIHBhZGxlbikpKSB7CiAJCWlmICgoaGVhZHJvb20gPCA0KSB8fCAodGFpbHJvb20gPCBwYWRsZW4pKSB7CiAJCQlza2ItPmRhdGEgPSBtZW1tb3ZlKHNrYi0+aGVhZCArIDQsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOwotCQkJc2tiLT50YWlsID0gc2tiLT5kYXRhICsgc2tiLT5sZW47CisJCQlza2Jfc2V0X3RhaWxfcG9pbnRlcihza2IsIHNrYi0+bGVuKTsKIAkJfQogCX0gZWxzZSB7CiAJCXN0cnVjdCBza19idWZmICpza2IyOwpAQCAtMzUyLDExICszNTIsMTEgQEAKIAlza2JfcHVzaChza2IsIDQpOwogCXBhY2tldF9sZW4gPSAoKChza2ItPmxlbiAtIDQpIF4gMHgwMDAwZmZmZikgPDwgMTYpICsgKHNrYi0+bGVuIC0gNCk7CiAJY3B1X3RvX2xlMzJzKCZwYWNrZXRfbGVuKTsKLQltZW1jcHkoc2tiLT5kYXRhLCAmcGFja2V0X2xlbiwgc2l6ZW9mKHBhY2tldF9sZW4pKTsKKwlza2JfY29weV90b19saW5lYXJfZGF0YShza2IsICZwYWNrZXRfbGVuLCBzaXplb2YocGFja2V0X2xlbikpOwogCiAJaWYgKChza2ItPmxlbiAlIDUxMikgPT0gMCkgewogCQljcHVfdG9fbGUzMnMoJnBhZGJ5dGVzKTsKLQkJbWVtY3B5KCBza2ItPnRhaWwsICZwYWRieXRlcywgc2l6ZW9mKHBhZGJ5dGVzKSk7CisJCW1lbWNweShza2JfdGFpbF9wb2ludGVyKHNrYiksICZwYWRieXRlcywgc2l6ZW9mKHBhZGJ5dGVzKSk7CiAJCXNrYl9wdXQoc2tiLCBzaXplb2YocGFkYnl0ZXMpKTsKIAl9CiAJcmV0dXJuIHNrYjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL25ldC9jYXRjLmMgYi9kcml2ZXJzL3VzYi9uZXQvY2F0Yy5jCmluZGV4IDQ4NTIwMTIuLjg2ZTkwYzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL25ldC9jYXRjLmMKKysrIGIvZHJpdmVycy91c2IvbmV0L2NhdGMuYwpAQCAtMjU1LDcgKzI1NSw2IEBACiAJCWlmICghKHNrYiA9IGRldl9hbGxvY19za2IocGt0X2xlbikpKQogCQkJcmV0dXJuOwogCi0JCXNrYi0+ZGV2ID0gY2F0Yy0+bmV0ZGV2OwogCQlldGhfY29weV9hbmRfc3VtKHNrYiwgcGt0X3N0YXJ0ICsgcGt0X29mZnNldCwgcGt0X2xlbiwgMCk7CiAJCXNrYl9wdXQoc2tiLCBwa3RfbGVuKTsKIApAQCAtMzU2LDcgKzM1NSw3IEBACiAgKiBUcmFuc21pdCByb3V0aW5lcy4KICAqLwogCi1zdGF0aWMgdm9pZCBjYXRjX3R4X3J1bihzdHJ1Y3QgY2F0YyAqY2F0YykKK3N0YXRpYyBpbnQgY2F0Y190eF9ydW4oc3RydWN0IGNhdGMgKmNhdGMpCiB7CiAJaW50IHN0YXR1czsKIApAQCAtMzc0LDEyICszNzMsMTQgQEAKIAljYXRjLT50eF9wdHIgPSAwOwogCiAJY2F0Yy0+bmV0ZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJcmV0dXJuIHN0YXR1czsKIH0KIAogc3RhdGljIHZvaWQgY2F0Y190eF9kb25lKHN0cnVjdCB1cmIgKnVyYikKIHsKIAlzdHJ1Y3QgY2F0YyAqY2F0YyA9IHVyYi0+Y29udGV4dDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByOwogCiAJaWYgKHVyYi0+c3RhdHVzID09IC1FQ09OTlJFU0VUKSB7CiAJCWRiZygiVHggUmVzZXQuIik7CkBAIC0zOTgsMTAgKzM5OSwxMyBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNhdGMtPnR4X2xvY2ssIGZsYWdzKTsKIAotCWlmIChjYXRjLT50eF9wdHIpCi0JCWNhdGNfdHhfcnVuKGNhdGMpOwotCWVsc2UKKwlpZiAoY2F0Yy0+dHhfcHRyKSB7CisJCXIgPSBjYXRjX3R4X3J1bihjYXRjKTsKKwkJaWYgKHVubGlrZWx5KHIgPCAwKSkKKwkJCWNsZWFyX2JpdChUWF9SVU5OSU5HLCAmY2F0Yy0+ZmxhZ3MpOworCX0gZWxzZSB7CiAJCWNsZWFyX2JpdChUWF9SVU5OSU5HLCAmY2F0Yy0+ZmxhZ3MpOworCX0KIAogCW5ldGlmX3dha2VfcXVldWUoY2F0Yy0+bmV0ZGV2KTsKIApAQCAtNDEyLDYgKzQxNiw3IEBACiB7CiAJc3RydWN0IGNhdGMgKmNhdGMgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHIgPSAwOwogCWNoYXIgKnR4X2J1ZjsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZjYXRjLT50eF9sb2NrLCBmbGFncyk7CkBAIC00MTksMTEgKzQyNCwxNCBAQAogCWNhdGMtPnR4X3B0ciA9ICgoKGNhdGMtPnR4X3B0ciAtIDEpID4+IDYpICsgMSkgPDwgNjsKIAl0eF9idWYgPSBjYXRjLT50eF9idWZbY2F0Yy0+dHhfaWR4XSArIGNhdGMtPnR4X3B0cjsKIAkqKCh1MTYqKXR4X2J1ZikgPSAoY2F0Yy0+aXNfZjV1MDExKSA/IGNwdV90b19iZTE2KCh1MTYpc2tiLT5sZW4pIDogY3B1X3RvX2xlMTYoKHUxNilza2ItPmxlbik7Ci0JbWVtY3B5KHR4X2J1ZiArIDIsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCB0eF9idWYgKyAyLCBza2ItPmxlbik7CiAJY2F0Yy0+dHhfcHRyICs9IHNrYi0+bGVuICsgMjsKIAotCWlmICghdGVzdF9hbmRfc2V0X2JpdChUWF9SVU5OSU5HLCAmY2F0Yy0+ZmxhZ3MpKQotCQljYXRjX3R4X3J1bihjYXRjKTsKKwlpZiAoIXRlc3RfYW5kX3NldF9iaXQoVFhfUlVOTklORywgJmNhdGMtPmZsYWdzKSkgeworCQlyID0gY2F0Y190eF9ydW4oY2F0Yyk7CisJCWlmIChyIDwgMCkKKwkJCWNsZWFyX2JpdChUWF9SVU5OSU5HLCAmY2F0Yy0+ZmxhZ3MpOworCX0KIAogCWlmICgoY2F0Yy0+aXNfZjV1MDExICYmIGNhdGMtPnR4X3B0cikKIAkgICAgIHx8IChjYXRjLT50eF9wdHIgPj0gKChUWF9NQVhfQlVSU1QgLSAxKSAqIChQS1RfU1ogKyAyKSkpKQpAQCAtNDMxLDggKzQzOSwxMCBAQAogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2F0Yy0+dHhfbG9jaywgZmxhZ3MpOwogCi0JY2F0Yy0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47Ci0JY2F0Yy0+c3RhdHMudHhfcGFja2V0cysrOworCWlmIChyID49IDApIHsKKwkJY2F0Yy0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJCWNhdGMtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwl9CiAKIAlkZXZfa2ZyZWVfc2tiKHNrYik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL25ldC9kbTk2MDEuYyBiL2RyaXZlcnMvdXNiL25ldC9kbTk2MDEuYwppbmRleCA1MTMwY2M3Li5hNjc2Mzg2MCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbmV0L2RtOTYwMS5jCisrKyBiL2RyaXZlcnMvdXNiL25ldC9kbTk2MDEuYwpAQCAtMTIsNiArMTIsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KQEAgLTg1LDcgKzg2LDcgQEAKIAkJCSAgICAgICB1c2Jfc25kY3RybHBpcGUoZGV2LT51ZGV2LCAwKSwKIAkJCSAgICAgICBETV9XUklURV9SRUcsCiAJCQkgICAgICAgVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9WRU5ET1IgfFVTQl9SRUNJUF9ERVZJQ0UsCi0JCQkgICAgICAgdmFsdWUsIHJlZywgMCwgMCwgVVNCX0NUUkxfU0VUX1RJTUVPVVQpOworCQkJICAgICAgIHZhbHVlLCByZWcsIE5VTEwsIDAsIFVTQl9DVFJMX1NFVF9USU1FT1VUKTsKIH0KIAogc3RhdGljIHZvaWQgZG1fd3JpdGVfYXN5bmNfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKQpAQCAtMTcxLDcgKzE3Miw3IEBACiAKIAl1c2JfZmlsbF9jb250cm9sX3VyYih1cmIsIGRldi0+dWRldiwKIAkJCSAgICAgdXNiX3NuZGN0cmxwaXBlKGRldi0+dWRldiwgMCksCi0JCQkgICAgICh2b2lkICopcmVxLCAwLCAwLCBkbV93cml0ZV9hc3luY19jYWxsYmFjaywgcmVxKTsKKwkJCSAgICAgKHZvaWQgKilyZXEsIE5VTEwsIDAsIGRtX3dyaXRlX2FzeW5jX2NhbGxiYWNrLCByZXEpOwogCiAJc3RhdHVzID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKIAlpZiAoc3RhdHVzIDwgMCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbmV0L2dsNjIwYS5jIGIvZHJpdmVycy91c2IvbmV0L2dsNjIwYS5jCmluZGV4IGQyNTdhOGUuLjAzMWNmNWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL25ldC9nbDYyMGEuYworKysgYi9kcml2ZXJzL3VzYi9uZXQvZ2w2MjBhLmMKQEAgLTE1Nyw3ICsxNTcsNyBAQAogCQlpZiAoKGhlYWRyb29tIDwgKDQgKyA0KjEpKSB8fCAodGFpbHJvb20gPCBwYWRsZW4pKSB7CiAJCQlza2ItPmRhdGEgPSBtZW1tb3ZlKHNrYi0+aGVhZCArICg0ICsgNCoxKSwKIAkJCQkJICAgICBza2ItPmRhdGEsIHNrYi0+bGVuKTsKLQkJCXNrYi0+dGFpbCA9IHNrYi0+ZGF0YSArIHNrYi0+bGVuOworCQkJc2tiX3NldF90YWlsX3BvaW50ZXIoc2tiLCBza2ItPmxlbik7CiAJCX0KIAl9IGVsc2UgewogCQlzdHJ1Y3Qgc2tfYnVmZgkqc2tiMjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL25ldC9rYXdldGguYyBiL2RyaXZlcnMvdXNiL25ldC9rYXdldGguYwppbmRleCBkZTk1MjY4Li5hMGNjMDVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9uZXQva2F3ZXRoLmMKKysrIGIvZHJpdmVycy91c2IvbmV0L2thd2V0aC5jCkBAIC02MzYsOCArNjM2LDYgQEAKIAogCQlza2JfcmVzZXJ2ZShza2IsIDIpOyAgICAvKiBBbGlnbiBJUCBvbiAxNiBieXRlIGJvdW5kYXJpZXMgKi8KIAotCQlza2ItPmRldiA9IG5ldDsKLQogCQlldGhfY29weV9hbmRfc3VtKHNrYiwga2F3ZXRoLT5yeF9idWYgKyAyLCBwa3RfbGVuLCAwKTsKIAogCQlza2JfcHV0KHNrYiwgcGt0X2xlbik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9uZXQvbmV0MTA4MC5jIGIvZHJpdmVycy91c2IvbmV0L25ldDEwODAuYwppbmRleCBjY2ViZmRlLi4xOWJmOGRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9uZXQvbmV0MTA4MC5jCisrKyBiL2RyaXZlcnMvdXNiL25ldC9uZXQxMDgwLmMKQEAgLTUyMCw3ICs1MjAsNyBAQAogCQkJc2tiLT5kYXRhID0gbWVtbW92ZShza2ItPmhlYWQKIAkJCQkJCSsgc2l6ZW9mIChzdHJ1Y3QgbmNfaGVhZGVyKSwKIAkJCQkJICAgIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOwotCQkJc2tiLT50YWlsID0gc2tiLT5kYXRhICsgbGVuOworCQkJc2tiX3NldF90YWlsX3BvaW50ZXIoc2tiLCBsZW4pOwogCQkJZ290byBlbmNhcHN1bGF0ZTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL25ldC9wZWdhc3VzLmMgYi9kcml2ZXJzL3VzYi9uZXQvcGVnYXN1cy5jCmluZGV4IDZkMTI5NjEuLmEwNWZkOTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL25ldC9wZWdhc3VzLmMKKysrIGIvZHJpdmVycy91c2IvbmV0L3BlZ2FzdXMuYwpAQCAtNTc1LDcgKzU3NSw2IEBACiAJCSAqLwogCQlpZiAocGVnYXN1cy0+cnhfcG9vbFtpXSA9PSBOVUxMKQogCQkJcmV0dXJuOwotCQlwZWdhc3VzLT5yeF9wb29sW2ldLT5kZXYgPSBwZWdhc3VzLT5uZXQ7CiAJCXNrYl9yZXNlcnZlKHBlZ2FzdXMtPnJ4X3Bvb2xbaV0sIDIpOwogCX0KIH0KQEAgLTg0OCwxNiArODQ3LDYgQEAKIAkJICogZFswXS5OT19DQVJSSUVSIGtpY2tzIGluIG9ubHkgd2l0aCBmYWlsZWQgVFguCiAJCSAqIC4uLiBzbyBtb25pdG9yaW5nIHdpdGggTUlJIG1heSBiZSBzYWZlc3QuCiAJCSAqLwotCQlpZiAocGVnYXN1cy0+ZmVhdHVyZXMgJiBUUlVTVF9MSU5LX1NUQVRVUykgewotCQkJaWYgKGRbNV0gJiBMSU5LX1NUQVRVUykKLQkJCQluZXRpZl9jYXJyaWVyX29uKG5ldCk7Ci0JCQllbHNlCi0JCQkJbmV0aWZfY2Fycmllcl9vZmYobmV0KTsKLQkJfSBlbHNlIHsKLQkJCS8qIE5ldmVyIHNldCBjYXJyaWVyIF9vbl8gYmFzZWQgb24gISBOT19DQVJSSUVSICovCi0JCQlpZiAoZFswXSAmIE5PX0NBUlJJRVIpCi0JCQkJbmV0aWZfY2Fycmllcl9vZmYobmV0KTsJCi0JCX0KIAogCQkvKiBieXRlcyAzLTQgPT0gcnhfbG9zdHBrdCwgcmVnIDJFLzJGICovCiAJCXBlZ2FzdXMtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMgKz0gKChkWzNdICYgMHg3ZikgPDwgOCkgfCBkWzRdOwpAQCAtODkwLDcgKzg3OSw3IEBACiAJbmV0aWZfc3RvcF9xdWV1ZShuZXQpOwogCiAJKChfX2xlMTYgKikgcGVnYXN1cy0+dHhfYnVmZilbMF0gPSBjcHVfdG9fbGUxNihsMTYpOwotCW1lbWNweShwZWdhc3VzLT50eF9idWZmICsgMiwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIHBlZ2FzdXMtPnR4X2J1ZmYgKyAyLCBza2ItPmxlbik7CiAJdXNiX2ZpbGxfYnVsa191cmIocGVnYXN1cy0+dHhfdXJiLCBwZWdhc3VzLT51c2IsCiAJCQkgIHVzYl9zbmRidWxrcGlwZShwZWdhc3VzLT51c2IsIDIpLAogCQkJICBwZWdhc3VzLT50eF9idWZmLCBjb3VudCwKQEAgLTE0MTUsOCArMTQwNCwxMCBAQAogCXVubGlua19hbGxfdXJicyhwZWdhc3VzKTsKIAlmcmVlX2FsbF91cmJzKHBlZ2FzdXMpOwogCWZyZWVfc2tiX3Bvb2wocGVnYXN1cyk7Ci0JaWYgKHBlZ2FzdXMtPnJ4X3NrYikKKwlpZiAocGVnYXN1cy0+cnhfc2tiICE9IE5VTEwpIHsKIAkJZGV2X2tmcmVlX3NrYihwZWdhc3VzLT5yeF9za2IpOworCQlwZWdhc3VzLT5yeF9za2IgPSBOVUxMOworCX0KIAlmcmVlX25ldGRldihwZWdhc3VzLT5uZXQpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9uZXQvcGVnYXN1cy5oIGIvZHJpdmVycy91c2IvbmV0L3BlZ2FzdXMuaAppbmRleCBjN2FhZGI0Li5jNzQ2NzgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9uZXQvcGVnYXN1cy5oCisrKyBiL2RyaXZlcnMvdXNiL25ldC9wZWdhc3VzLmgKQEAgLTExLDcgKzExLDYgQEAKIAogI2RlZmluZQlQRUdBU1VTX0lJCQkweDgwMDAwMDAwCiAjZGVmaW5lCUhBU19IT01FX1BOQQkJMHg0MDAwMDAwMAotI2RlZmluZQlUUlVTVF9MSU5LX1NUQVRVUwkweDIwMDAwMDAwCiAKICNkZWZpbmUJUEVHQVNVU19NVFUJCTE1MzYKICNkZWZpbmUJUlhfU0tCUwkJCTQKQEAgLTIwNCw3ICsyMDMsNyBAQAogUEVHQVNVU19ERVYoICJBbGxpZWQgVGVsZXN5biBJbnQuIEFULVVTQjEwMCIsIFZFTkRPUl9BTExJRURURUwsIDB4YjEwMCwKIAkJREVGQVVMVF9HUElPX1JFU0VUIHwgUEVHQVNVU19JSSApCiBQRUdBU1VTX0RFViggIkJlbGtpbiBGNUQ1MDUwIFVTQiBFdGhlcm5ldCIsIFZFTkRPUl9CRUxLSU4sIDB4MDEyMSwKLQkJREVGQVVMVF9HUElPX1JFU0VUIHwgUEVHQVNVU19JSSB8IFRSVVNUX0xJTktfU1RBVFVTICkKKwkJREVGQVVMVF9HUElPX1JFU0VUIHwgUEVHQVNVU19JSSApCiBQRUdBU1VTX0RFViggIkJpbGxpb250b24gVVNCLTEwMCIsIFZFTkRPUl9CSUxMSU9OVE9OLCAweDA5ODYsCiAJCURFRkFVTFRfR1BJT19SRVNFVCApCiBQRUdBU1VTX0RFViggIkJpbGxpb250b24gVVNCTFAtMTAwIiwgVkVORE9SX0JJTExJT05UT04sIDB4MDk4NywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL25ldC9ybmRpc19ob3N0LmMgYi9kcml2ZXJzL3VzYi9uZXQvcm5kaXNfaG9zdC5jCmluZGV4IDM5YTIxYzcuLjk4MGU0YWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL25ldC9ybmRpc19ob3N0LmMKKysrIGIvZHJpdmVycy91c2IvbmV0L3JuZGlzX2hvc3QuYwpAQCAtMjUzLDYgKzI1Myw3IEBACiAgKiBvZiB0aGF0IG1lc3MgYXMgcG9zc2libGUuCiAgKi8KICNkZWZpbmUgT0lEXzgwMl8zX1BFUk1BTkVOVF9BRERSRVNTCWNjcHUyKDB4MDEwMTAxMDEpCisjZGVmaW5lIE9JRF9HRU5fTUFYSU1VTV9GUkFNRV9TSVpFCWNjcHUyKDB4MDAwMTAxMDYpCiAjZGVmaW5lIE9JRF9HRU5fQ1VSUkVOVF9QQUNLRVRfRklMVEVSCWNjcHUyKDB4MDAwMTAxMGUpCiAKIC8qCkBAIC0zNDksNyArMzUwLDcgQEAKIAkJCWNhc2UgUk5ESVNfTVNHX0lORElDQVRFOiB7CS8qIGZhdWx0ICovCiAJCQkJLy8gc3RydWN0IHJuZGlzX2luZGljYXRlICptc2cgPSAodm9pZCAqKWJ1ZjsKIAkJCQlkZXZfaW5mbygmaW5mby0+Y29udHJvbC0+ZGV2LAotCQkJCQkgInJuZGlzIGZhdWx0IGluZGljYXRpb25cbiIpOworCQkJCQkicm5kaXMgZmF1bHQgaW5kaWNhdGlvblxuIik7CiAJCQkJfQogCQkJCWJyZWFrOwogCQkJY2FzZSBSTkRJU19NU0dfS0VFUEFMSVZFOiB7CS8qIHBpbmcgKi8KQEAgLTM4Nyw2ICszODgsNzEgQEAKIAlyZXR1cm4gLUVUSU1FRE9VVDsKIH0KIAorLyoKKyAqIHJuZGlzX3F1ZXJ5OgorICoKKyAqIFBlcmZvcm1zIGEgcXVlcnkgZm9yIEBvaWQgYWxvbmcgd2l0aCAwIG9yIG1vcmUgYnl0ZXMgb2YgcGF5bG9hZCBhcworICogc3BlY2lmaWVkIGJ5IEBpbl9sZW4uIElmIEByZXBseV9sZW4gaXMgbm90IHNldCB0byAtMSB0aGVuIHRoZSByZXBseQorICogbGVuZ3RoIGlzIGNoZWNrZWQgYWdhaW5zdCB0aGlzIHZhbHVlLCByZXN1bHRpbmcgaW4gYW4gZXJyb3IgaWYgaXQKKyAqIGRvZXNuJ3QgbWF0Y2guCisgKgorICogTk9URTogQWRkaW5nIGEgcGF5bG9hZCBleGFjdGx5IG9yIGdyZWF0ZXIgdGhhbiB0aGUgc2l6ZSBvZiB0aGUgZXhwZWN0ZWQKKyAqIHJlc3BvbnNlIHBheWxvYWQgaXMgYW4gZXZpZGVudCByZXF1aXJlbWVudCBNU0ZUIGFkZGVkIGZvciBBY3RpdmVTeW5jLgorICoKKyAqIFRoZSBvbmx5IGV4Y2VwdGlvbiBpcyBmb3IgT0lEcyB0aGF0IHJldHVybiBhIHZhcmlhYmx5IHNpemVkIHJlc3BvbnNlLAorICogaW4gd2hpY2ggY2FzZSBubyBwYXlsb2FkIHNob3VsZCBiZSBhZGRlZC4gIFRoaXMgdW5kb2N1bWVudGVkIChhbmQKKyAqIG5vbnNlbnNpY2FsISkgaXNzdWUgd2FzIGZvdW5kIGJ5IHNuaWZmaW5nIHByb3RvY29sIHJlcXVlc3RzIGZyb20gdGhlCisgKiBBY3RpdmVTeW5jIDQuMSBXaW5kb3dzIGRyaXZlci4KKyAqLworc3RhdGljIGludCBybmRpc19xdWVyeShzdHJ1Y3QgdXNibmV0ICpkZXYsIHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLAorCQl2b2lkICpidWYsIHUzMiBvaWQsIHUzMiBpbl9sZW4sCisJCXZvaWQgKipyZXBseSwgaW50ICpyZXBseV9sZW4pCit7CisJaW50IHJldHZhbDsKKwl1bmlvbiB7CisJCXZvaWQJCQkqYnVmOworCQlzdHJ1Y3Qgcm5kaXNfbXNnX2hkcgkqaGVhZGVyOworCQlzdHJ1Y3Qgcm5kaXNfcXVlcnkJKmdldDsKKwkJc3RydWN0IHJuZGlzX3F1ZXJ5X2MJKmdldF9jOworCX0gdTsKKwl1MzIgb2ZmLCBsZW47CisKKwl1LmJ1ZiA9IGJ1ZjsKKworCW1lbXNldCh1LmdldCwgMCwgc2l6ZW9mICp1LmdldCArIGluX2xlbik7CisJdS5nZXQtPm1zZ190eXBlID0gUk5ESVNfTVNHX1FVRVJZOworCXUuZ2V0LT5tc2dfbGVuID0gY3B1X3RvX2xlMzIoc2l6ZW9mICp1LmdldCArIGluX2xlbik7CisJdS5nZXQtPm9pZCA9IG9pZDsKKwl1LmdldC0+bGVuID0gY3B1X3RvX2xlMzIoaW5fbGVuKTsKKwl1LmdldC0+b2Zmc2V0ID0gY2NwdTIoMjApOworCisJcmV0dmFsID0gcm5kaXNfY29tbWFuZChkZXYsIHUuaGVhZGVyKTsKKwlpZiAodW5saWtlbHkocmV0dmFsIDwgMCkpIHsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LCAiUk5ESVNfTVNHX1FVRVJZKDB4JTA4eCkgZmFpbGVkLCAlZFxuIiwKKwkJCQlvaWQsIHJldHZhbCk7CisJCXJldHVybiByZXR2YWw7CisJfQorCisJb2ZmID0gbGUzMl90b19jcHUodS5nZXRfYy0+b2Zmc2V0KTsKKwlsZW4gPSBsZTMyX3RvX2NwdSh1LmdldF9jLT5sZW4pOworCWlmICh1bmxpa2VseSgoOCArIG9mZiArIGxlbikgPiBDT05UUk9MX0JVRkZFUl9TSVpFKSkKKwkJZ290byByZXNwb25zZV9lcnJvcjsKKworCWlmICgqcmVwbHlfbGVuICE9IC0xICYmIGxlbiAhPSAqcmVwbHlfbGVuKQorCQlnb3RvIHJlc3BvbnNlX2Vycm9yOworCisJKnJlcGx5ID0gKHVuc2lnbmVkIGNoYXIgKikgJnUuZ2V0X2MtPnJlcXVlc3RfaWQgKyBvZmY7CisJKnJlcGx5X2xlbiA9IGxlbjsKKworCXJldHVybiByZXR2YWw7CisKK3Jlc3BvbnNlX2Vycm9yOgorCWRldl9lcnIoJmludGYtPmRldiwgIlJORElTX01TR19RVUVSWSgweCUwOHgpICIKKwkJCSJpbnZhbGlkIHJlc3BvbnNlIC0gb2ZmICVkIGxlbiAlZFxuIiwKKwkJb2lkLCBvZmYsIGxlbik7CisJcmV0dXJuIC1FRE9NOworfQorCiBzdGF0aWMgaW50IHJuZGlzX2JpbmQoc3RydWN0IHVzYm5ldCAqZGV2LCBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKIHsKIAlpbnQJCQlyZXR2YWw7CkBAIC00MDMsNiArNDY5LDggQEAKIAkJc3RydWN0IHJuZGlzX3NldF9jCSpzZXRfYzsKIAl9IHU7CiAJdTMyCQkJdG1wOworCWludAkJCXJlcGx5X2xlbjsKKwl1bnNpZ25lZCBjaGFyCQkqYnA7CiAKIAkvKiB3ZSBjYW4ndCByZWx5IG9uIGkvbyBmcm9tIHN0YWNrIHdvcmtpbmcsIG9yIHN0YWNrIGFsbG9jYXRpb24gKi8KIAl1LmJ1ZiA9IGttYWxsb2MoQ09OVFJPTF9CVUZGRVJfU0laRSwgR0ZQX0tFUk5FTCk7CkBAIC00MjEsNiArNDg5LDEyIEBACiAJICogVFggd2UnbGwgc3RpY2sgdG8gb25lIEV0aGVybmV0IHBhY2tldCBwbHVzIFJORElTIGZyYW1pbmcuCiAJICogRm9yIFJYIHdlIGhhbmRsZSBkcml2ZXJzIHRoYXQgemVyby1wYWQgdG8gZW5kLW9mLXBhY2tldC4KIAkgKiBEb24ndCBsZXQgdXNlcnNwYWNlIGNoYW5nZSB0aGVzZSBzZXR0aW5ncy4KKwkgKgorCSAqIE5PVEU6IHRoZXJlIHN0aWxsIHNlZW1zIHRvIGJlIHdpZXJkbmVzcyBoZXJlLCBhcyBpZiB3ZSBuZWVkCisJICogdG8gZG8gc29tZSBtb3JlIHRoaW5ncyB0byBtYWtlIHN1cmUgV2luQ0UgdGFyZ2V0cyBhY2NlcHQgdGhpcy4KKwkgKiBUaGV5IGRlZmF1bHQgdG8ganVtYm9ncmFtcyBvZiA4S0Igb3IgMTZLQiwgd2hpY2ggaXMgYWJzdXJkCisJICogZm9yIHN1Y2ggbG93IGRhdGEgcmF0ZXMgYW5kIHdoaWNoIGlzIGFsc28gbW9yZSB0aGFuIExpbnV4CisJICogY2FuIHVzdWFsbHkgZXhwZWN0IHRvIGFsbG9jYXRlIGZvciBTS0IgZGF0YS4uLgogCSAqLwogCW5ldC0+aGFyZF9oZWFkZXJfbGVuICs9IHNpemVvZiAoc3RydWN0IHJuZGlzX2RhdGFfaGRyKTsKIAlkZXYtPmhhcmRfbXR1ID0gbmV0LT5tdHUgKyBuZXQtPmhhcmRfaGVhZGVyX2xlbjsKQEAgLTQzNCw3ICs1MDgsNyBAQAogCWlmICh1bmxpa2VseShyZXR2YWwgPCAwKSkgewogCQkvKiBpdCBtaWdodCBub3QgZXZlbiBiZSBhbiBSTkRJUyBkZXZpY2UhISAqLwogCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJSTkRJUyBpbml0IGZhaWxlZCwgJWRcbiIsIHJldHZhbCk7Ci0gCQlnb3RvIGZhaWxfYW5kX3JlbGVhc2U7CisJCWdvdG8gZmFpbF9hbmRfcmVsZWFzZTsKIAl9CiAJdG1wID0gbGUzMl90b19jcHUodS5pbml0X2MtPm1heF90cmFuc2Zlcl9zaXplKTsKIAlpZiAodG1wIDwgZGV2LT5oYXJkX210dSkgewpAQCAtNDUwLDM0ICs1MjQsMTUgQEAKIAkJZGV2LT5oYXJkX210dSwgdG1wLCBkZXYtPnJ4X3VyYl9zaXplLAogCQkxIDw8IGxlMzJfdG9fY3B1KHUuaW5pdF9jLT5wYWNrZXRfYWxpZ25tZW50KSk7CiAKLQkvKiBHZXQgZGVzaWduYXRlZCBob3N0IGV0aGVybmV0IGFkZHJlc3MuCi0JICoKLQkgKiBBZGRpbmcgYSBwYXlsb2FkIGV4YWN0bHkgdGhlIHNhbWUgc2l6ZSBhcyB0aGUgZXhwZWN0ZWQgcmVzcG9uc2UKLQkgKiBwYXlsb2FkIGlzIGFuIGV2aWRlbnQgcmVxdWlyZW1lbnQgTVNGVCBhZGRlZCBmb3IgQWN0aXZlU3luYy4KLQkgKiBUaGlzIHVuZG9jdW1lbnRlZCAoYW5kIG5vbnNlbnNpY2FsKSBpc3N1ZSB3YXMgZm91bmQgYnkgc25pZmZpbmcKLQkgKiBwcm90b2NvbCByZXF1ZXN0cyBmcm9tIHRoZSBBY3RpdmVTeW5jIDQuMSBXaW5kb3dzIGRyaXZlci4KLQkgKi8KLQltZW1zZXQodS5nZXQsIDAsIHNpemVvZiAqdS5nZXQgKyA0OCk7Ci0JdS5nZXQtPm1zZ190eXBlID0gUk5ESVNfTVNHX1FVRVJZOwotCXUuZ2V0LT5tc2dfbGVuID0gY2NwdTIoc2l6ZW9mICp1LmdldCArIDQ4KTsKLQl1LmdldC0+b2lkID0gT0lEXzgwMl8zX1BFUk1BTkVOVF9BRERSRVNTOwotCXUuZ2V0LT5sZW4gPSBjY3B1Mig0OCk7Ci0JdS5nZXQtPm9mZnNldCA9IGNjcHUyKDIwKTsKLQotCXJldHZhbCA9IHJuZGlzX2NvbW1hbmQoZGV2LCB1LmhlYWRlcik7Ci0JaWYgKHVubGlrZWx5KHJldHZhbCA8IDApKSB7CisJLyogR2V0IGRlc2lnbmF0ZWQgaG9zdCBldGhlcm5ldCBhZGRyZXNzICovCisJcmVwbHlfbGVuID0gRVRIX0FMRU47CisJcmV0dmFsID0gcm5kaXNfcXVlcnkoZGV2LCBpbnRmLCB1LmJ1ZiwgT0lEXzgwMl8zX1BFUk1BTkVOVF9BRERSRVNTLAorCQkJNDgsICh2b2lkICoqKSAmYnAsICZyZXBseV9sZW4pOworCWlmICh1bmxpa2VseShyZXR2YWw8IDApKSB7CiAJCWRldl9lcnIoJmludGYtPmRldiwgInJuZGlzIGdldCBldGhhZGRyLCAlZFxuIiwgcmV0dmFsKTsKIAkJZ290byBmYWlsX2FuZF9yZWxlYXNlOwogCX0KLQl0bXAgPSBsZTMyX3RvX2NwdSh1LmdldF9jLT5vZmZzZXQpOwotCWlmICh1bmxpa2VseSgodG1wICsgOCkgPiAoQ09OVFJPTF9CVUZGRVJfU0laRSAtIEVUSF9BTEVOKQotCQkJfHwgdS5nZXRfYy0+bGVuICE9IGNjcHUyKEVUSF9BTEVOKSkpIHsKLQkJZGV2X2VycigmaW50Zi0+ZGV2LCAicm5kaXMgZXRoYWRkciBvZmYgJWQgbGVuICVkID9cbiIsCi0JCQl0bXAsIGxlMzJfdG9fY3B1KHUuZ2V0X2MtPmxlbikpOwotCQlyZXR2YWwgPSAtRURPTTsKLQkJZ290byBmYWlsX2FuZF9yZWxlYXNlOwotCX0KLQltZW1jcHkobmV0LT5kZXZfYWRkciwgdG1wICsgKGNoYXIgKikmdS5nZXRfYy0+cmVxdWVzdF9pZCwgRVRIX0FMRU4pOworCW1lbWNweShuZXQtPmRldl9hZGRyLCBicCwgRVRIX0FMRU4pOwogCiAJLyogc2V0IGEgbm9uemVybyBmaWx0ZXIgdG8gZW5hYmxlIGRhdGEgdHJhbnNmZXJzICovCiAJbWVtc2V0KHUuc2V0LCAwLCBzaXplb2YgKnUuc2V0KTsKQEAgLTUwMiw2ICs1NTcsNyBAQAogZmFpbF9hbmRfcmVsZWFzZToKIAl1c2Jfc2V0X2ludGZkYXRhKGluZm8tPmRhdGEsIE5VTEwpOwogCXVzYl9kcml2ZXJfcmVsZWFzZV9pbnRlcmZhY2UoZHJpdmVyX29mKGludGYpLCBpbmZvLT5kYXRhKTsKKwlpbmZvLT5kYXRhID0gTlVMTDsKIGZhaWw6CiAJa2ZyZWUodS5idWYpOwogCXJldHVybiByZXR2YWw7CkBAIC01ODgsNyArNjQ0LDcgQEAKIAkJaWYgKGxpa2VseSgoc2l6ZW9mICpoZHIpIDw9IHJvb20pKSB7CiAJCQlza2ItPmRhdGEgPSBtZW1tb3ZlKHNrYi0+aGVhZCArIHNpemVvZiAqaGRyLAogCQkJCQkgICAgc2tiLT5kYXRhLCBsZW4pOwotCQkJc2tiLT50YWlsID0gc2tiLT5kYXRhICsgbGVuOworCQkJc2tiX3NldF90YWlsX3BvaW50ZXIoc2tiLCBsZW4pOwogCQkJZ290byBmaWxsOwogCQl9CiAJfQpAQCAtNjE4LDcgKzY3NCw3IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZHJpdmVyX2luZm8Jcm5kaXNfaW5mbyA9IHsKIAkuZGVzY3JpcHRpb24gPQkiUk5ESVMgZGV2aWNlIiwKLQkuZmxhZ3MgPQlGTEFHX0VUSEVSIHwgRkxBR19GUkFNSU5HX1JOLAorCS5mbGFncyA9CUZMQUdfRVRIRVIgfCBGTEFHX0ZSQU1JTkdfUk4gfCBGTEFHX05PX1NFVElOVCwKIAkuYmluZCA9CQlybmRpc19iaW5kLAogCS51bmJpbmQgPQlybmRpc191bmJpbmQsCiAJLnN0YXR1cyA9CXJuZGlzX3N0YXR1cywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL25ldC9ydGw4MTUwLmMgYi9kcml2ZXJzL3VzYi9uZXQvcnRsODE1MC5jCmluZGV4IGVhMTUzZGMuLmZhNTk4ZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL25ldC9ydGw4MTUwLmMKKysrIGIvZHJpdmVycy91c2IvbmV0L3J0bDgxNTAuYwpAQCAtNjQ2LDcgKzY0Niw2IEBACiAJCWlmICghc2tiKSB7CiAJCQlyZXR1cm47CiAJCX0KLQkJc2tiLT5kZXYgPSBkZXYtPm5ldGRldjsKIAkJc2tiX3Jlc2VydmUoc2tiLCAyKTsKIAkJZGV2LT5yeF9za2JfcG9vbFtpXSA9IHNrYjsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9uZXQvdXNibmV0LmMgYi9kcml2ZXJzL3VzYi9uZXQvdXNibmV0LmMKaW5kZXggZGU2OWIxOC4uZjljZDQyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbmV0L3VzYm5ldC5jCisrKyBiL2RyaXZlcnMvdXNiL25ldC91c2JuZXQuYwpAQCAtMjAzLDcgKzIwMyw2IEBACiB7CiAJaW50CXN0YXR1czsKIAotCXNrYi0+ZGV2ID0gZGV2LT5uZXQ7CiAJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zIChza2IsIGRldi0+bmV0KTsKIAlkZXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKIAlkZXYtPnN0YXRzLnJ4X2J5dGVzICs9IHNrYi0+bGVuOwpAQCAtNzM1LDggKzczNCw3IEBACiB7CiAJc3RydWN0IHVzYm5ldCAqZGV2ID0gbmV0ZGV2X3ByaXYobmV0KTsKIAotCS8qIFJFVklTSVQgZG9uJ3QgYWx3YXlzIHJldHVybiAidXNibmV0IiAqLwotCXN0cm5jcHkgKGluZm8tPmRyaXZlciwgZHJpdmVyX25hbWUsIHNpemVvZiBpbmZvLT5kcml2ZXIpOworCXN0cm5jcHkgKGluZm8tPmRyaXZlciwgZGV2LT5kcml2ZXJfbmFtZSwgc2l6ZW9mIGluZm8tPmRyaXZlcik7CiAJc3RybmNweSAoaW5mby0+dmVyc2lvbiwgRFJJVkVSX1ZFUlNJT04sIHNpemVvZiBpbmZvLT52ZXJzaW9uKTsKIAlzdHJuY3B5IChpbmZvLT5md192ZXJzaW9uLCBkZXYtPmRyaXZlcl9pbmZvLT5kZXNjcmlwdGlvbiwKIAkJc2l6ZW9mIGluZm8tPmZ3X3ZlcnNpb24pOwpAQCAtMTExNiwxMCArMTExNCwxMiBAQAogCXN0cnVjdCBkcml2ZXJfaW5mbwkJKmluZm87CiAJc3RydWN0IHVzYl9kZXZpY2UJCSp4ZGV2OwogCWludAkJCQlzdGF0dXM7CisJY29uc3QgY2hhcgkJCSpuYW1lOwogCisJbmFtZSA9IHVkZXYtPmRldi5kcml2ZXItPm5hbWU7CiAJaW5mbyA9IChzdHJ1Y3QgZHJpdmVyX2luZm8gKikgcHJvZC0+ZHJpdmVyX2luZm87CiAJaWYgKCFpbmZvKSB7Ci0JCWRldl9kYmcgKCZ1ZGV2LT5kZXYsICJibGFja2xpc3RlZCBieSAlc1xuIiwgZHJpdmVyX25hbWUpOworCQlkZXZfZGJnICgmdWRldi0+ZGV2LCAiYmxhY2tsaXN0ZWQgYnkgJXNcbiIsIG5hbWUpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAJeGRldiA9IGludGVyZmFjZV90b191c2JkZXYgKHVkZXYpOwpAQCAtMTEzOSw2ICsxMTM5LDcgQEAKIAlkZXYgPSBuZXRkZXZfcHJpdihuZXQpOwogCWRldi0+dWRldiA9IHhkZXY7CiAJZGV2LT5kcml2ZXJfaW5mbyA9IGluZm87CisJZGV2LT5kcml2ZXJfbmFtZSA9IG5hbWU7CiAJZGV2LT5tc2dfZW5hYmxlID0gbmV0aWZfbXNnX2luaXQgKG1zZ19sZXZlbCwgTkVUSUZfTVNHX0RSVgogCQkJCXwgTkVUSUZfTVNHX1BST0JFIHwgTkVUSUZfTVNHX0xJTkspOwogCXNrYl9xdWV1ZV9oZWFkX2luaXQgKCZkZXYtPnJ4cSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9uZXQvdXNibmV0LmggYi9kcml2ZXJzL3VzYi9uZXQvdXNibmV0LmgKaW5kZXggMDdjNzBhYi4uY2JiNTNlMCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbmV0L3VzYm5ldC5oCisrKyBiL2RyaXZlcnMvdXNiL25ldC91c2JuZXQuaApAQCAtMjksNiArMjksNyBAQAogCS8qIGhvdXNla2VlcGluZyAqLwogCXN0cnVjdCB1c2JfZGV2aWNlCSp1ZGV2OwogCXN0cnVjdCBkcml2ZXJfaW5mbwkqZHJpdmVyX2luZm87CisJY29uc3QgY2hhcgkJKmRyaXZlcl9uYW1lOwogCXdhaXRfcXVldWVfaGVhZF90CSp3YWl0OwogCXN0cnVjdCBtdXRleAkJcGh5X211dGV4OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvS2NvbmZpZyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9LY29uZmlnCmluZGV4IDJmNGQzMDMuLmJhNWQxZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9LY29uZmlnCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9LY29uZmlnCkBAIC00MjMsMTEgKzQyMywxMSBAQAogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIG1jdF91MjMyLgogCiBjb25maWcgVVNCX1NFUklBTF9NT1M3NzIwCi0JdHJpc3RhdGUgIlVTQiBNb3NjaGlwIDc3MjAgU2luZ2xlIFBvcnQgU2VyaWFsIERyaXZlciIKKwl0cmlzdGF0ZSAiVVNCIE1vc2NoaXAgNzcyMCBTZXJpYWwgRHJpdmVyIgogCWRlcGVuZHMgb24gVVNCX1NFUklBTAogCS0tLWhlbHAtLS0KLQkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gdXNlIGEgVVNCIFNlcmlhbCBzaW5nbGUgcG9ydCBhZGFwdGVyIGZyb20KLQkgIE1vc2NoaXAgU2VtaWNvbmR1Y3RvciBUZWNoLgorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byB1c2UgVVNCIFNlcmlhbCBzaW5nbGUgYW5kIGRvdWJsZQorCSAgcG9ydCBhZGFwdGVycyBmcm9tIE1vc2NoaXAgU2VtaWNvbmR1Y3RvciBUZWNoLgogCiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBtb3M3NzIwLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2FpcmNhYmxlLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvYWlyY2FibGUuYwppbmRleCAxMWRhZDQyLi5iNjc1NzM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvYWlyY2FibGUuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvYWlyY2FibGUuYwpAQCAtMjA5LDYgKzIwOSw3IEBACiAJaW50IGNvdW50LCByZXN1bHQ7CiAJc3RydWN0IGFpcmNhYmxlX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAJdW5zaWduZWQgY2hhciogYnVmOworCXUxNiAqZGJ1ZjsKIAlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKIAlpZiAocG9ydC0+d3JpdGVfdXJiX2J1c3kpCiAJCXJldHVybjsKQEAgLTIyNiw4ICsyMjcsOCBAQAogCiAJYnVmWzBdID0gVFhfSEVBREVSXzA7CiAJYnVmWzFdID0gVFhfSEVBREVSXzE7Ci0JYnVmWzJdID0gKHVuc2lnbmVkIGNoYXIpY291bnQ7Ci0JYnVmWzNdID0gKHVuc2lnbmVkIGNoYXIpKGNvdW50ID4+IDgpOworCWRidWYgPSAodTE2ICopJmJ1ZlsyXTsKKwkqZGJ1ZiA9IGNwdV90b19sZTE2KCh1MTYpY291bnQpOwogCXNlcmlhbF9idWZfZ2V0KHByaXYtPnR4X2J1ZixidWYgKyBIQ0lfSEVBREVSX0xFTkdUSCwgTUFYX0hDSV9GUkFNRVNJWkUpOwogCiAJbWVtY3B5KHBvcnQtPndyaXRlX3VyYi0+dHJhbnNmZXJfYnVmZmVyLCBidWYsCkBAIC00MzQsNyArNDM1LDcgQEAKIAkJCSAgICBfX0ZVTkNUSU9OX18sIHVyYi0+c3RhdHVzKTsKIAkJCXBvcnQtPndyaXRlX3VyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IDE7CiAJCQlwb3J0LT53cml0ZV91cmItPmRldiA9IHBvcnQtPnNlcmlhbC0+ZGV2OwotCQkJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIocG9ydC0+d3JpdGVfdXJiLCBHRlBfS0VSTkVMKTsKKwkJCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHBvcnQtPndyaXRlX3VyYiwgR0ZQX0FUT01JQyk7CiAJCQlpZiAocmVzdWx0KQogCQkJCWRldl9lcnIoJnVyYi0+ZGV2LT5kZXYsCiAJCQkJCSIlcyAtIGZhaWxlZCByZXN1Ym1pdHRpbmcgd3JpdGUgdXJiLCBlcnJvciAlZFxuIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9hcmszMTE2LmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvYXJrMzExNi5jCmluZGV4IGVkZDY4NTcuLmVhMjE3NWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9hcmszMTE2LmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2FyazMxMTYuYwpAQCAtMzQxLDcgKzM0MSw3IEBACiAKIAlyZXN1bHQgPSB1c2Jfc2VyaWFsX2dlbmVyaWNfb3Blbihwb3J0LCBmaWxwKTsKIAlpZiAocmVzdWx0KQotCQlyZXR1cm4gcmVzdWx0OworCQlnb3RvIGVycl9vdXQ7CiAKIAkvKiBvcGVuICovCiAJQVJLMzExNl9SQ1Yoc2VyaWFsLCAxMTEsIDB4RkUsIDB4QzAsIDB4MDAwMCwgMHgwMDAzLCAweDAyLCBidWYpOwpAQCAtMzcyLDYgKzM3Miw3IEBACiAJaWYgKHBvcnQtPnR0eSkKIAkJYXJrMzExNl9zZXRfdGVybWlvcyhwb3J0LCAmdG1wX3Rlcm1pb3MpOwogCitlcnJfb3V0OgogCWtmcmVlKGJ1Zik7CiAKIAlyZXR1cm4gcmVzdWx0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2NwMjEwMS5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2NwMjEwMS5jCmluZGV4IGQ3ZDBiYTkuLmU4MzFjYjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9jcDIxMDEuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvY3AyMTAxLmMKQEAgLTU4LDkgKzU4LDExIEBACiAJeyBVU0JfREVWSUNFKDB4MTBBQiwgMHgxMEM1KSB9LCAvKiBTaWVtZW5zIE1DNjAgQ2FibGUgKi8KIAl7IFVTQl9ERVZJQ0UoMHgxMEI1LCAweEFDNzApIH0sIC8qIE5va2lhIENBLTQyIFVTQiAqLwogCXsgVVNCX0RFVklDRSgweDEwQzQsIDB4ODAzQikgfSwgLyogUG9sb2x1IFVTQi1zZXJpYWwgY29udmVydGVyICovCisJeyBVU0JfREVWSUNFKDB4MTBDNCwgMHg4MDUzKSB9LCAvKiBFbmZvcmEgRURHMTIyOCAqLwogCXsgVVNCX0RFVklDRSgweDEwQzQsIDB4ODA2NikgfSwgLyogQXJndXNzb2Z0IEluLVN5c3RlbSBQcm9ncmFtbWVyICovCiAJeyBVU0JfREVWSUNFKDB4MTBDNCwgMHg4MDdBKSB9LCAvKiBDcnVtYjEyOCBib2FyZCAqLwogCXsgVVNCX0RFVklDRSgweDEwQzQsIDB4ODBDQSkgfSwgLyogRGVncmVlIENvbnRyb2xzIEluYyAqLworCXsgVVNCX0RFVklDRSgweDEwQzQsIDB4ODBERCkgfSwgLyogVHJhY2llbnQgUkZJRCAqLwogCXsgVVNCX0RFVklDRSgweDEwQzQsIDB4ODBGNikgfSwgLyogU3V1bnRvIHNwb3J0cyBpbnN0cnVtZW50ICovCiAJeyBVU0JfREVWSUNFKDB4MTBDNCwgMHg4MTNEKSB9LCAvKiBCdXJuc2lkZSBUZWxlY29tIERlc2ttb2JpbGUgKi8KIAl7IFVTQl9ERVZJQ0UoMHgxMEM0LCAweDgxNEEpIH0sIC8qIFdlc3QgTW91bnRhaW4gUmFkaW8gUklHYmxhc3RlciBQJlAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9mdGRpX3Npby5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2Z0ZGlfc2lvLmMKaW5kZXggOGZmOWQ1NC4uOTVhMTgwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2Z0ZGlfc2lvLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2Z0ZGlfc2lvLmMKQEAgLTM0Miw2ICszNDIsNyBAQAogCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9QRVJMRV9VTFRSQVBPUlRfUElEKSB9LAogCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9QSUVHUk9VUF9QSUQpIH0sCiAJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX1ROQ19YX1BJRCkgfSwKKwl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfVVNCWF83MDdfUElEKSB9LAogCXsgVVNCX0RFVklDRShTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzIxMDFfUElEKSB9LAogCXsgVVNCX0RFVklDRShTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzIxMDJfUElEKSB9LAogCXsgVVNCX0RFVklDRShTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzIxMDNfUElEKSB9LApAQCAtMTQzMyw2ICsxNDM0LDcgQEAKIAkJZGJnKCIlcyAtIHdyaXRlIGxpbWl0IGhpdFxuIiwgX19GVU5DVElPTl9fKTsKIAkJcmV0dXJuIDA7CiAJfQorCXByaXYtPnR4X291dHN0YW5kaW5nX3VyYnMrKzsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT50eF9sb2NrLCBmbGFncyk7CiAKIAlkYXRhX29mZnNldCA9IHByaXYtPndyaXRlX29mZnNldDsKQEAgLTE0NTAsMTQgKzE0NTIsMTUgQEAKIAlidWZmZXIgPSBrbWFsbG9jICh0cmFuc2Zlcl9zaXplLCBHRlBfQVRPTUlDKTsKIAlpZiAoIWJ1ZmZlcikgewogCQllcnIoIiVzIHJhbiBvdXQgb2Yga2VybmVsIG1lbW9yeSBmb3IgdXJiIC4uLiIsIF9fRlVOQ1RJT05fXyk7Ci0JCXJldHVybiAtRU5PTUVNOworCQljb3VudCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3Jfbm9fYnVmZmVyOwogCX0KIAogCXVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0FUT01JQyk7CiAJaWYgKCF1cmIpIHsKIAkJZXJyKCIlcyAtIG5vIG1vcmUgZnJlZSB1cmJzIiwgX19GVU5DVElPTl9fKTsKLQkJa2ZyZWUgKGJ1ZmZlcik7Ci0JCXJldHVybiAtRU5PTUVNOworCQljb3VudCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3Jfbm9fdXJiOwogCX0KIAogCS8qIENvcHkgZGF0YSAqLwpAQCAtMTQ5OSwxMCArMTUwMiw5IEBACiAJaWYgKHN0YXR1cykgewogCQllcnIoIiVzIC0gZmFpbGVkIHN1Ym1pdHRpbmcgd3JpdGUgdXJiLCBlcnJvciAlZCIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKIAkJY291bnQgPSBzdGF0dXM7Ci0JCWtmcmVlIChidWZmZXIpOworCQlnb3RvIGVycm9yOwogCX0gZWxzZSB7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT50eF9sb2NrLCBmbGFncyk7Ci0JCSsrcHJpdi0+dHhfb3V0c3RhbmRpbmdfdXJiczsKIAkJcHJpdi0+dHhfb3V0c3RhbmRpbmdfYnl0ZXMgKz0gY291bnQ7CiAJCXByaXYtPnR4X2J5dGVzICs9IGNvdW50OwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT50eF9sb2NrLCBmbGFncyk7CkBAIC0xNTEwLDEwICsxNTEyLDE5IEBACiAKIAkvKiB3ZSBhcmUgZG9uZSB3aXRoIHRoaXMgdXJiLCBzbyBsZXQgdGhlIGhvc3QgZHJpdmVyCiAJICogcmVhbGx5IGZyZWUgaXQgd2hlbiBpdCBpcyBmaW5pc2hlZCB3aXRoIGl0ICovCi0JdXNiX2ZyZWVfdXJiICh1cmIpOworCXVzYl9mcmVlX3VyYih1cmIpOwogCiAJZGJnKCIlcyB3cml0ZSByZXR1cm5pbmc6ICVkIiwgX19GVU5DVElPTl9fLCBjb3VudCk7CiAJcmV0dXJuIGNvdW50OworZXJyb3I6CisJdXNiX2ZyZWVfdXJiKHVyYik7CitlcnJvcl9ub191cmI6CisJa2ZyZWUgKGJ1ZmZlcik7CitlcnJvcl9ub19idWZmZXI6CisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnR4X2xvY2ssIGZsYWdzKTsKKwlwcml2LT50eF9vdXRzdGFuZGluZ191cmJzLS07CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+dHhfbG9jaywgZmxhZ3MpOworCXJldHVybiBjb3VudDsKIH0gLyogZnRkaV93cml0ZSAqLwogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9mdGRpX3Npby5oIGIvZHJpdmVycy91c2Ivc2VyaWFsL2Z0ZGlfc2lvLmgKaW5kZXggNTEzY2ZlMS4uNzdhZDBhMCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2Z0ZGlfc2lvLmgKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2Z0ZGlfc2lvLmgKQEAgLTMxLDYgKzMxLDcgQEAKICNkZWZpbmUgRlRESV9SRUxBSVNfUElECTB4RkExMCAgLyogUmVsYWlzIGRldmljZSBmcm9tIFJ1ZG9sZiBHdWdsZXIgKi8KICNkZWZpbmUgRlRESV9ORl9SSUNfVklECTB4MERDRAkvKiBWZW5kb3IgSWQgKi8KICNkZWZpbmUgRlRESV9ORl9SSUNfUElECTB4MDAwMQkvKiBQcm9kdWN0IElkICovCisjZGVmaW5lIEZURElfVVNCWF83MDdfUElEIDB4Rjg1NwkvKiBBRFNUZWNoIElSIEJsYXN0ZXIgVVNCWC03MDcgKi8KIAogCiAvKiB3d3cuY2FudXNiLmNvbSBMYXdpY2VsIENBTlVTQiBkZXZpY2UgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9pb19lZGdlcG9ydC5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2lvX2VkZ2Vwb3J0LmMKaW5kZXggNmEyNmEyZS4uMThmNzRhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2lvX2VkZ2Vwb3J0LmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2lvX2VkZ2Vwb3J0LmMKQEAgLTExMSw3ICsxMTEsNyBAQAogCiAJc3RydWN0IFR4RmlmbwkJdHhmaWZvOwkJCS8qIHRyYW5zbWl0IGZpZm8gLS0gc2l6ZSB3aWxsIGJlIG1heFR4Q3JlZGl0cyAqLwogCXN0cnVjdCB1cmIJCSp3cml0ZV91cmI7CQkvKiB3cml0ZSBVUkIgZm9yIHRoaXMgcG9ydCAqLwotCWNoYXIJCQl3cml0ZV9pbl9wcm9ncmVzczsJLyogVFJVRSB3aGlsZSBhIHdyaXRlIFVSQiBpcyBvdXRzdGFuZGluZyAqLworCWJvb2wJCQl3cml0ZV9pbl9wcm9ncmVzczsJLyogJ3RydWUnIHdoaWxlIGEgd3JpdGUgVVJCIGlzIG91dHN0YW5kaW5nICovCiAJc3BpbmxvY2tfdAkJZXBfbG9jazsKIAogCV9fdTgJCQlzaGFkb3dMQ1I7CQkvKiBsYXN0IExDUiB2YWx1ZSByZWNlaXZlZCAqLwpAQCAtMTIzLDExICsxMjMsMTEgQEAKIAlfX3U4CQkJdmFsaWREYXRhTWFzazsKIAlfX3UzMgkJCWJhdWRSYXRlOwogCi0JY2hhcgkJCW9wZW47Ci0JY2hhcgkJCW9wZW5QZW5kaW5nOwotCWNoYXIJCQljb21tYW5kUGVuZGluZzsKLQljaGFyCQkJY2xvc2VQZW5kaW5nOwotCWNoYXIJCQljaGFzZVJlc3BvbnNlUGVuZGluZzsKKwlib29sCQkJb3BlbjsKKwlib29sCQkJb3BlblBlbmRpbmc7CisJYm9vbAkJCWNvbW1hbmRQZW5kaW5nOworCWJvb2wJCQljbG9zZVBlbmRpbmc7CisJYm9vbAkJCWNoYXNlUmVzcG9uc2VQZW5kaW5nOwogCiAJd2FpdF9xdWV1ZV9oZWFkX3QJd2FpdF9jaGFzZTsJCS8qIGZvciBoYW5kbGluZyBzbGVlcGluZyB3aGlsZSB3YWl0aW5nIGZvciBjaGFzZSB0byBmaW5pc2ggKi8KIAl3YWl0X3F1ZXVlX2hlYWRfdAl3YWl0X29wZW47CQkvKiBmb3IgaGFuZGxpbmcgc2xlZXBpbmcgd2hpbGUgd2FpdGluZyBmb3Igb3BlbiB0byBmaW5pc2ggKi8KQEAgLTE1Niw3ICsxNTYsNyBAQAogCV9fdTgJCQlidWxrX2luX2VuZHBvaW50OwkJLyogdGhlIGJ1bGsgaW4gZW5kcG9pbnQgaGFuZGxlICovCiAJdW5zaWduZWQgY2hhciAqCQlidWxrX2luX2J1ZmZlcjsJCQkvKiB0aGUgYnVmZmVyIHdlIHVzZSBmb3IgdGhlIGJ1bGsgaW4gZW5kcG9pbnQgKi8KIAlzdHJ1Y3QgdXJiICoJCXJlYWRfdXJiOwkJCS8qIG91ciBidWxrIHJlYWQgdXJiICovCi0JaW50CQkJcmVhZF9pbl9wcm9ncmVzczsKKwlib29sCQkJcmVhZF9pbl9wcm9ncmVzczsKIAlzcGlubG9ja190CQllc19sb2NrOwogCiAJX191OAkJCWJ1bGtfb3V0X2VuZHBvaW50OwkJLyogdGhlIGJ1bGsgb3V0IGVuZHBvaW50IGhhbmRsZSAqLwpAQCAtMjEyLDcgKzIxMiw3IEBACiAKIHN0YXRpYyBpbnQgbG93X2xhdGVuY3kgPSAxOwkvKiB0dHkgbG93IGxhdGVuY3kgZmxhZywgb24gYnkgZGVmYXVsdCAqLwogCi1zdGF0aWMgaW50IENtZFVyYnMgPSAwOwkJLyogTnVtYmVyIG9mIG91dHN0YW5kaW5nIENvbW1hbmQgV3JpdGUgVXJicyAqLworc3RhdGljIGF0b21pY190IENtZFVyYnM7CQkvKiBOdW1iZXIgb2Ygb3V0c3RhbmRpbmcgQ29tbWFuZCBXcml0ZSBVcmJzICovCiAKIAogLyogbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcyAqLwpAQCAtNjMxLDE0ICs2MzEsMTQgQEAKIAkJCQlpZiAoZWRnZV9zZXJpYWwtPnJ4Qnl0ZXNBdmFpbCA+IDAgJiYKIAkJCQkgICAgIWVkZ2Vfc2VyaWFsLT5yZWFkX2luX3Byb2dyZXNzKSB7CiAJCQkJCWRiZygiJXMgLSBwb3N0aW5nIGEgcmVhZCIsIF9fRlVOQ1RJT05fXyk7Ci0JCQkJCWVkZ2Vfc2VyaWFsLT5yZWFkX2luX3Byb2dyZXNzID0gVFJVRTsKKwkJCQkJZWRnZV9zZXJpYWwtPnJlYWRfaW5fcHJvZ3Jlc3MgPSB0cnVlOwogCiAJCQkJCS8qIHdlIGhhdmUgcGVuZGluZyBieXRlcyBvbiB0aGUgYnVsayBpbiBwaXBlLCBzZW5kIGEgcmVxdWVzdCAqLwogCQkJCQllZGdlX3NlcmlhbC0+cmVhZF91cmItPmRldiA9IGVkZ2Vfc2VyaWFsLT5zZXJpYWwtPmRldjsKIAkJCQkJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIoZWRnZV9zZXJpYWwtPnJlYWRfdXJiLCBHRlBfQVRPTUlDKTsKIAkJCQkJaWYgKHJlc3VsdCkgewogCQkJCQkJZGV2X2VycigmZWRnZV9zZXJpYWwtPnNlcmlhbC0+ZGV2LT5kZXYsICIlcyAtIHVzYl9zdWJtaXRfdXJiKHJlYWQgYnVsaykgZmFpbGVkIHdpdGggcmVzdWx0ID0gJWRcbiIsIF9fRlVOQ1RJT05fXywgcmVzdWx0KTsKLQkJCQkJCWVkZ2Vfc2VyaWFsLT5yZWFkX2luX3Byb2dyZXNzID0gRkFMU0U7CisJCQkJCQllZGdlX3NlcmlhbC0+cmVhZF9pbl9wcm9ncmVzcyA9IGZhbHNlOwogCQkJCQl9CiAJCQkJfQogCQkJCXNwaW5fdW5sb2NrKCZlZGdlX3NlcmlhbC0+ZXNfbG9jayk7CkBAIC02OTUsMTMgKzY5NSwxMyBAQAogCiAJaWYgKHVyYi0+c3RhdHVzKSB7CiAJCWRiZygiJXMgLSBub256ZXJvIHJlYWQgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwgX19GVU5DVElPTl9fLCB1cmItPnN0YXR1cyk7Ci0JCWVkZ2Vfc2VyaWFsLT5yZWFkX2luX3Byb2dyZXNzID0gRkFMU0U7CisJCWVkZ2Vfc2VyaWFsLT5yZWFkX2luX3Byb2dyZXNzID0gZmFsc2U7CiAJCXJldHVybjsKIAl9CiAKIAlpZiAodXJiLT5hY3R1YWxfbGVuZ3RoID09IDApIHsKIAkJZGJnKCIlcyAtIHJlYWQgYnVsayBjYWxsYmFjayB3aXRoIG5vIGRhdGEiLCBfX0ZVTkNUSU9OX18pOwotCQllZGdlX3NlcmlhbC0+cmVhZF9pbl9wcm9ncmVzcyA9IEZBTFNFOworCQllZGdlX3NlcmlhbC0+cmVhZF9pbl9wcm9ncmVzcyA9IGZhbHNlOwogCQlyZXR1cm47CiAJfQogCkBAIC03MjUsMTAgKzcyNSwxMCBAQAogCQlzdGF0dXMgPSB1c2Jfc3VibWl0X3VyYihlZGdlX3NlcmlhbC0+cmVhZF91cmIsIEdGUF9BVE9NSUMpOwogCQlpZiAoc3RhdHVzKSB7CiAJCQlkZXZfZXJyKCZ1cmItPmRldi0+ZGV2LCAiJXMgLSB1c2Jfc3VibWl0X3VyYihyZWFkIGJ1bGspIGZhaWxlZCwgc3RhdHVzID0gJWRcbiIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKLQkJCWVkZ2Vfc2VyaWFsLT5yZWFkX2luX3Byb2dyZXNzID0gRkFMU0U7CisJCQllZGdlX3NlcmlhbC0+cmVhZF9pbl9wcm9ncmVzcyA9IGZhbHNlOwogCQl9CiAJfSBlbHNlIHsKLQkJZWRnZV9zZXJpYWwtPnJlYWRfaW5fcHJvZ3Jlc3MgPSBGQUxTRTsKKwkJZWRnZV9zZXJpYWwtPnJlYWRfaW5fcHJvZ3Jlc3MgPSBmYWxzZTsKIAl9CiAKIAlzcGluX3VubG9jaygmZWRnZV9zZXJpYWwtPmVzX2xvY2spOwpAQCAtNzU5LDcgKzc1OSw3IEBACiAJfQogCiAJLy8gUmVsZWFzZSB0aGUgV3JpdGUgVVJCCi0JZWRnZV9wb3J0LT53cml0ZV9pbl9wcm9ncmVzcyA9IEZBTFNFOworCWVkZ2VfcG9ydC0+d3JpdGVfaW5fcHJvZ3Jlc3MgPSBmYWxzZTsKIAogCS8vIENoZWNrIGlmIG1vcmUgZGF0YSBuZWVkcyB0byBiZSBzZW50CiAJc2VuZF9tb3JlX3BvcnRfZGF0YSgoc3RydWN0IGVkZ2Vwb3J0X3NlcmlhbCAqKSh1c2JfZ2V0X3NlcmlhbF9kYXRhKGVkZ2VfcG9ydC0+cG9ydC0+c2VyaWFsKSksIGVkZ2VfcG9ydCk7CkBAIC03NzksOCArNzc5LDggQEAKIAogCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOwogCi0JQ21kVXJicy0tOwotCWRiZygiJXMgLSBGUkVFIFVSQiAlcCAob3V0c3RhbmRpbmcgJWQpIiwgX19GVU5DVElPTl9fLCB1cmIsIENtZFVyYnMpOworCWF0b21pY19kZWMoJkNtZFVyYnMpOworCWRiZygiJXMgLSBGUkVFIFVSQiAlcCAob3V0c3RhbmRpbmcgJWQpIiwgX19GVU5DVElPTl9fLCB1cmIsIGF0b21pY19yZWFkKCZDbWRVcmJzKSk7CiAKIAogCS8qIGNsZWFuIHVwIHRoZSB0cmFuc2ZlciBidWZmZXIgKi8KQEAgLTgwMiw3ICs4MDIsNyBAQAogCQl0dHlfd2FrZXVwKHR0eSk7CiAKIAkvKiB3ZSBoYXZlIGNvbXBsZXRlZCB0aGUgY29tbWFuZCAqLwotCWVkZ2VfcG9ydC0+Y29tbWFuZFBlbmRpbmcgPSBGQUxTRTsKKwllZGdlX3BvcnQtPmNvbW1hbmRQZW5kaW5nID0gZmFsc2U7CiAJd2FrZV91cCgmZWRnZV9wb3J0LT53YWl0X2NvbW1hbmQpOwogfQogCkBAIC04NjgsNyArODY4LDcgQEAKIAkJCQkgIHBvcnQwLT5idWxrX2luX2J1ZmZlciwKIAkJCQkgIGVkZ2Vfc2VyaWFsLT5yZWFkX3VyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCwKIAkJCQkgIGVkZ2VfYnVsa19pbl9jYWxsYmFjaywgZWRnZV9zZXJpYWwpOwotCQllZGdlX3NlcmlhbC0+cmVhZF9pbl9wcm9ncmVzcyA9IEZBTFNFOworCQllZGdlX3NlcmlhbC0+cmVhZF9pbl9wcm9ncmVzcyA9IGZhbHNlOwogCiAJCS8qIHN0YXJ0IGludGVycnVwdCByZWFkIGZvciB0aGlzIGVkZ2Vwb3J0CiAJCSAqIHRoaXMgaW50ZXJydXB0IHdpbGwgY29udGludWUgYXMgbG9uZyBhcyB0aGUgZWRnZXBvcnQgaXMgY29ubmVjdGVkICovCkBAIC04OTAsMjYgKzg5MCwyNiBAQAogCS8qIGluaXRpYWxpemUgb3VyIHBvcnQgc2V0dGluZ3MgKi8KIAllZGdlX3BvcnQtPnR4Q3JlZGl0cyAgICAgICAgICAgID0gMDsJCQkvKiBDYW4ndCBzZW5kIGFueSBkYXRhIHlldCAqLwogCWVkZ2VfcG9ydC0+c2hhZG93TUNSICAgICAgICAgICAgPSBNQ1JfTUFTVEVSX0lFOwkvKiBNdXN0IGFsd2F5cyBzZXQgdGhpcyBiaXQgdG8gZW5hYmxlIGludHMhICovCi0JZWRnZV9wb3J0LT5jaGFzZVJlc3BvbnNlUGVuZGluZyA9IEZBTFNFOworCWVkZ2VfcG9ydC0+Y2hhc2VSZXNwb25zZVBlbmRpbmcgPSBmYWxzZTsKIAogCS8qIHNlbmQgYSBvcGVuIHBvcnQgY29tbWFuZCAqLwotCWVkZ2VfcG9ydC0+b3BlblBlbmRpbmcgPSBUUlVFOwotCWVkZ2VfcG9ydC0+b3BlbiAgICAgICAgPSBGQUxTRTsKKwllZGdlX3BvcnQtPm9wZW5QZW5kaW5nID0gdHJ1ZTsKKwllZGdlX3BvcnQtPm9wZW4gICAgICAgID0gZmFsc2U7CiAJcmVzcG9uc2UgPSBzZW5kX2lvc3BfZXh0X2NtZCAoZWRnZV9wb3J0LCBJT1NQX0NNRF9PUEVOX1BPUlQsIDApOwogCiAJaWYgKHJlc3BvbnNlIDwgMCkgewogCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyAtIGVycm9yIHNlbmRpbmcgb3BlbiBwb3J0IGNvbW1hbmRcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCWVkZ2VfcG9ydC0+b3BlblBlbmRpbmcgPSBGQUxTRTsKKwkJZWRnZV9wb3J0LT5vcGVuUGVuZGluZyA9IGZhbHNlOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKIAkvKiBub3cgd2FpdCBmb3IgdGhlIHBvcnQgdG8gYmUgY29tcGxldGVseSBvcGVuZWQgKi8KLQl3YWl0X2V2ZW50X3RpbWVvdXQoZWRnZV9wb3J0LT53YWl0X29wZW4sIChlZGdlX3BvcnQtPm9wZW5QZW5kaW5nICE9IFRSVUUpLCBPUEVOX1RJTUVPVVQpOworCXdhaXRfZXZlbnRfdGltZW91dChlZGdlX3BvcnQtPndhaXRfb3BlbiwgIWVkZ2VfcG9ydC0+b3BlblBlbmRpbmcsIE9QRU5fVElNRU9VVCk7CiAKLQlpZiAoZWRnZV9wb3J0LT5vcGVuID09IEZBTFNFKSB7CisJaWYgKCFlZGdlX3BvcnQtPm9wZW4pIHsKIAkJLyogb3BlbiB0aW1lZCBvdXQgKi8KIAkJZGJnKCIlcyAtIG9wZW4gdGltZWRvdXQiLCBfX0ZVTkNUSU9OX18pOwotCQllZGdlX3BvcnQtPm9wZW5QZW5kaW5nID0gRkFMU0U7CisJCWVkZ2VfcG9ydC0+b3BlblBlbmRpbmcgPSBmYWxzZTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCkBAIC05MjgsNyArOTI4LDcgQEAKIAogCS8qIEFsbG9jYXRlIGEgVVJCIGZvciB0aGUgd3JpdGUgKi8KIAllZGdlX3BvcnQtPndyaXRlX3VyYiA9IHVzYl9hbGxvY191cmIgKDAsIEdGUF9LRVJORUwpOwotCWVkZ2VfcG9ydC0+d3JpdGVfaW5fcHJvZ3Jlc3MgPSBGQUxTRTsKKwllZGdlX3BvcnQtPndyaXRlX2luX3Byb2dyZXNzID0gZmFsc2U7CiAKIAlpZiAoIWVkZ2VfcG9ydC0+d3JpdGVfdXJiKSB7CiAJCWRiZygiJXMgLSBubyBtZW1vcnkiLCBfX0ZVTkNUSU9OX18pOwpAQCAtOTY2LDcgKzk2Niw3IEBACiAJCWxhc3RDcmVkaXRzID0gZWRnZV9wb3J0LT50eENyZWRpdHM7CiAKIAkJLy8gRGlkIHdlIGdldCBvdXIgQ2hhc2UgcmVzcG9uc2UKLQkJaWYgKGVkZ2VfcG9ydC0+Y2hhc2VSZXNwb25zZVBlbmRpbmcgPT0gRkFMU0UpIHsKKwkJaWYgKCFlZGdlX3BvcnQtPmNoYXNlUmVzcG9uc2VQZW5kaW5nKSB7CiAJCQlkYmcoIiVzIC0gR290IENoYXNlIFJlc3BvbnNlIiwgX19GVU5DVElPTl9fKTsKIAogCQkJLy8gZGlkIHdlIGdldCBhbGwgb2Ygb3VyIGNyZWRpdCBiYWNrPwpAQCAtOTg1LDcgKzk4NSw3IEBACiAJCQkvLyBObyBhY3Rpdml0eS4uIGNvdW50IGRvd24uCiAJCQlsb29wLS07CiAJCQlpZiAobG9vcCA9PSAwKSB7Ci0JCQkJZWRnZV9wb3J0LT5jaGFzZVJlc3BvbnNlUGVuZGluZyA9IEZBTFNFOworCQkJCWVkZ2VfcG9ydC0+Y2hhc2VSZXNwb25zZVBlbmRpbmcgPSBmYWxzZTsKIAkJCQlkYmcoIiVzIC0gQ2hhc2UgVElNRU9VVCIsIF9fRlVOQ1RJT05fXyk7CiAJCQkJcmV0dXJuOwogCQkJfQpAQCAtMTA2OCwxMyArMTA2OCwxMyBAQAogCS8vIGJsb2NrIHVudGlsIHR4IGlzIGVtcHR5CiAJYmxvY2tfdW50aWxfdHhfZW1wdHkoZWRnZV9wb3J0KTsKIAotCWVkZ2VfcG9ydC0+Y2xvc2VQZW5kaW5nID0gVFJVRTsKKwllZGdlX3BvcnQtPmNsb3NlUGVuZGluZyA9IHRydWU7CiAKIAlpZiAoKCFlZGdlX3NlcmlhbC0+aXNfZXBpYykgfHwKIAkgICAgKChlZGdlX3NlcmlhbC0+aXNfZXBpYykgJiYKIAkgICAgIChlZGdlX3NlcmlhbC0+ZXBpY19kZXNjcmlwdG9yLlN1cHBvcnRzLklPU1BDaGFzZSkpKSB7CiAJCS8qIGZsdXNoIGFuZCBjaGFzZSAqLwotCQllZGdlX3BvcnQtPmNoYXNlUmVzcG9uc2VQZW5kaW5nID0gVFJVRTsKKwkJZWRnZV9wb3J0LT5jaGFzZVJlc3BvbnNlUGVuZGluZyA9IHRydWU7CiAKIAkJZGJnKCIlcyAtIFNlbmRpbmcgSU9TUF9DTURfQ0hBU0VfUE9SVCIsIF9fRlVOQ1RJT05fXyk7CiAJCXN0YXR1cyA9IHNlbmRfaW9zcF9leHRfY21kIChlZGdlX3BvcnQsIElPU1BfQ01EX0NIQVNFX1BPUlQsIDApOwpAQCAtMTA4Miw3ICsxMDgyLDcgQEAKIAkJCS8vIGJsb2NrIHVudGlsIGNoYXNlIGZpbmlzaGVkCiAJCQlibG9ja191bnRpbF9jaGFzZV9yZXNwb25zZShlZGdlX3BvcnQpOwogCQl9IGVsc2UgewotCQkJZWRnZV9wb3J0LT5jaGFzZVJlc3BvbnNlUGVuZGluZyA9IEZBTFNFOworCQkJZWRnZV9wb3J0LT5jaGFzZVJlc3BvbnNlUGVuZGluZyA9IGZhbHNlOwogCQl9CiAJfQogCkBAIC0xMDk0LDEwICsxMDk0LDEwIEBACiAJCXNlbmRfaW9zcF9leHRfY21kIChlZGdlX3BvcnQsIElPU1BfQ01EX0NMT1NFX1BPUlQsIDApOwogCX0KIAotCS8vcG9ydC0+Y2xvc2UgPSBUUlVFOwotCWVkZ2VfcG9ydC0+Y2xvc2VQZW5kaW5nID0gRkFMU0U7Ci0JZWRnZV9wb3J0LT5vcGVuID0gRkFMU0U7Ci0JZWRnZV9wb3J0LT5vcGVuUGVuZGluZyA9IEZBTFNFOworCS8vcG9ydC0+Y2xvc2UgPSB0cnVlOworCWVkZ2VfcG9ydC0+Y2xvc2VQZW5kaW5nID0gZmFsc2U7CisJZWRnZV9wb3J0LT5vcGVuID0gZmFsc2U7CisJZWRnZV9wb3J0LT5vcGVuUGVuZGluZyA9IGZhbHNlOwogCiAJdXNiX2tpbGxfdXJiKGVkZ2VfcG9ydC0+d3JpdGVfdXJiKTsKIApAQCAtMTI0Nyw3ICsxMjQ3LDcgQEAKIAl9CiAKIAkvLyBsb2NrIHRoaXMgd3JpdGUKLQllZGdlX3BvcnQtPndyaXRlX2luX3Byb2dyZXNzID0gVFJVRTsKKwllZGdlX3BvcnQtPndyaXRlX2luX3Byb2dyZXNzID0gdHJ1ZTsKIAogCS8vIGdldCBhIHBvaW50ZXIgdG8gdGhlIHdyaXRlX3VyYgogCXVyYiA9IGVkZ2VfcG9ydC0+d3JpdGVfdXJiOwpAQCAtMTI2MSw3ICsxMjYxLDcgQEAKIAlidWZmZXIgPSBrbWFsbG9jIChjb3VudCsyLCBHRlBfQVRPTUlDKTsKIAlpZiAoYnVmZmVyID09IE5VTEwpIHsKIAkJZGV2X2VycigmZWRnZV9wb3J0LT5wb3J0LT5kZXYsICIlcyAtIG5vIG1vcmUga2VybmVsIG1lbW9yeS4uLlxuIiwgX19GVU5DVElPTl9fKTsKLQkJZWRnZV9wb3J0LT53cml0ZV9pbl9wcm9ncmVzcyA9IEZBTFNFOworCQllZGdlX3BvcnQtPndyaXRlX2luX3Byb2dyZXNzID0gZmFsc2U7CiAJCWdvdG8gZXhpdF9zZW5kOwogCX0KIAlidWZmZXJbMF0gPSBJT1NQX0JVSUxEX0RBVEFfSERSMSAoZWRnZV9wb3J0LT5wb3J0LT5udW1iZXIgLSBlZGdlX3BvcnQtPnBvcnQtPnNlcmlhbC0+bWlub3IsIGNvdW50KTsKQEAgLTEzMDEsNyArMTMwMSw3IEBACiAJaWYgKHN0YXR1cykgewogCQkvKiBzb21ldGhpbmcgd2VudCB3cm9uZyAqLwogCQlkZXZfZXJyKCZlZGdlX3BvcnQtPnBvcnQtPmRldiwgIiVzIC0gdXNiX3N1Ym1pdF91cmIod3JpdGUgYnVsaykgZmFpbGVkLCBzdGF0dXMgPSAlZCwgZGF0YSBsb3N0XG4iLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7Ci0JCWVkZ2VfcG9ydC0+d3JpdGVfaW5fcHJvZ3Jlc3MgPSBGQUxTRTsKKwkJZWRnZV9wb3J0LT53cml0ZV9pbl9wcm9ncmVzcyA9IGZhbHNlOwogCiAJCS8qIHJldmVydCB0aGUgY3JlZGl0cyBhcyBzb21ldGhpbmcgYmFkIGhhcHBlbmVkLiAqLwogCQllZGdlX3BvcnQtPnR4Q3JlZGl0cyArPSBjb3VudDsKQEAgLTEzMzIsNyArMTMzMiw3IEBACiAKIAlpZiAoZWRnZV9wb3J0ID09IE5VTEwpCiAJCXJldHVybiAtRU5PREVWOwotCWlmIChlZGdlX3BvcnQtPmNsb3NlUGVuZGluZyA9PSBUUlVFKQorCWlmIChlZGdlX3BvcnQtPmNsb3NlUGVuZGluZykKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKQEAgLTEzNzEsNyArMTM3MSw3IEBACiAKIAlpZiAoZWRnZV9wb3J0ID09IE5VTEwpCiAJCXJldHVybiAtRU5PREVWOwotCWlmIChlZGdlX3BvcnQtPmNsb3NlUGVuZGluZyA9PSBUUlVFKQorCWlmIChlZGdlX3BvcnQtPmNsb3NlUGVuZGluZykKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAlpZiAoIWVkZ2VfcG9ydC0+b3BlbikgewpAQCAtMTc2Miw3ICsxNzYyLDcgQEAKIAkgICAgKChlZGdlX3NlcmlhbC0+aXNfZXBpYykgJiYKIAkgICAgIChlZGdlX3NlcmlhbC0+ZXBpY19kZXNjcmlwdG9yLlN1cHBvcnRzLklPU1BDaGFzZSkpKSB7CiAJCS8qIGZsdXNoIGFuZCBjaGFzZSAqLwotCQllZGdlX3BvcnQtPmNoYXNlUmVzcG9uc2VQZW5kaW5nID0gVFJVRTsKKwkJZWRnZV9wb3J0LT5jaGFzZVJlc3BvbnNlUGVuZGluZyA9IHRydWU7CiAKIAkJZGJnKCIlcyAtIFNlbmRpbmcgSU9TUF9DTURfQ0hBU0VfUE9SVCIsIF9fRlVOQ1RJT05fXyk7CiAJCXN0YXR1cyA9IHNlbmRfaW9zcF9leHRfY21kIChlZGdlX3BvcnQsIElPU1BfQ01EX0NIQVNFX1BPUlQsIDApOwpAQCAtMTc3MCw3ICsxNzcwLDcgQEAKIAkJCS8vIGJsb2NrIHVudGlsIGNoYXNlIGZpbmlzaGVkCiAJCQlibG9ja191bnRpbF9jaGFzZV9yZXNwb25zZShlZGdlX3BvcnQpOwogCQl9IGVsc2UgewotCQkJZWRnZV9wb3J0LT5jaGFzZVJlc3BvbnNlUGVuZGluZyA9IEZBTFNFOworCQkJZWRnZV9wb3J0LT5jaGFzZVJlc3BvbnNlUGVuZGluZyA9IGZhbHNlOwogCQl9CiAJfQogCkBAIC0xOTUyLDEzICsxOTUyLDEzIEBACiAJCQkJLy8gQWxzbywgd2UgY3VycmVudGx5IGNsZWFyIGZsYWcgYW5kIGNsb3NlIHRoZSBwb3J0IHJlZ2FyZGxlc3Mgb2YgY29udGVudCBvZiBhYm92ZSdzIEJ5dGUzLgogCQkJCS8vIFdlIGNvdWxkIGNob29zZSB0byBkbyBzb21ldGhpbmcgZWxzZSB3aGVuIEJ5dGUzIHNheXMgVGltZW91dCBvbiBDaGFzZSBmcm9tIEVkZ2Vwb3J0LAogCQkJCS8vIGxpa2Ugd2FpdCBsb25nZXIgaW4gYmxvY2tfdW50aWxfY2hhc2VfcmVzcG9uc2UsIGJ1dCBmb3Igbm93IHdlIGRvbid0LiAKLQkJCQllZGdlX3BvcnQtPmNoYXNlUmVzcG9uc2VQZW5kaW5nID0gRkFMU0U7CisJCQkJZWRnZV9wb3J0LT5jaGFzZVJlc3BvbnNlUGVuZGluZyA9IGZhbHNlOwogCQkJCXdha2VfdXAgKCZlZGdlX3BvcnQtPndhaXRfY2hhc2UpOwogCQkJCXJldHVybjsKIAogCQkJY2FzZSBJT1NQX0VYVF9TVEFUVVNfUlhfQ0hFQ0tfUlNQOgogCQkJCWRiZygiJXMgPT09PT09PT09PSBQb3J0ICV1IENIRUNLX1JTUCBTZXF1ZW5jZSA9ICUwMnggPT09PT09PT09PT09PVxuIiwgX19GVU5DVElPTl9fLCBlZGdlX3NlcmlhbC0+cnhQb3J0LCBieXRlMyApOwotCQkJCS8vUG9ydC0+UnhDaGVja1JzcCA9IFRSVUU7CisJCQkJLy9Qb3J0LT5SeENoZWNrUnNwID0gdHJ1ZTsKIAkJCQlyZXR1cm47CiAJCX0KIAl9CkBAIC0xOTc0LDggKzE5NzQsOCBAQAogCQkJY2hhbmdlX3BvcnRfc2V0dGluZ3MgKGVkZ2VfcG9ydCwgZWRnZV9wb3J0LT5wb3J0LT50dHktPnRlcm1pb3MpOwogCiAJCS8qIHdlIGhhdmUgY29tcGxldGVkIHRoZSBvcGVuICovCi0JCWVkZ2VfcG9ydC0+b3BlblBlbmRpbmcgPSBGQUxTRTsKLQkJZWRnZV9wb3J0LT5vcGVuID0gVFJVRTsKKwkJZWRnZV9wb3J0LT5vcGVuUGVuZGluZyA9IGZhbHNlOworCQllZGdlX3BvcnQtPm9wZW4gPSB0cnVlOwogCQl3YWtlX3VwKCZlZGdlX3BvcnQtPndhaXRfb3Blbik7CiAJCXJldHVybjsKIAl9CkBAIC0xOTgzLDcgKzE5ODMsNyBAQAogCS8vIElmIHBvcnQgaXMgY2xvc2VkLCBzaWxlbnRseSBkaXNjYXJkIGFsbCByY3ZkIHN0YXR1cy4gV2UgY2FuCiAJLy8gaGF2ZSBjYXNlcyB3aGVyZSBidWZmZXJlZCBzdGF0dXMgaXMgcmVjZWl2ZWQgQUZURVIgdGhlIGNsb3NlCiAJLy8gcG9ydCBjb21tYW5kIGlzIHNlbnQgdG8gdGhlIEVkZ2Vwb3J0LgotCWlmICgoIWVkZ2VfcG9ydC0+b3BlbiApIHx8IChlZGdlX3BvcnQtPmNsb3NlUGVuZGluZykpIHsKKwlpZiAoIWVkZ2VfcG9ydC0+b3BlbiB8fCBlZGdlX3BvcnQtPmNsb3NlUGVuZGluZykgewogCQlyZXR1cm47CiAJfQogCkBAIC0xOTkxLDE0ICsxOTkxLDE0IEBACiAJCS8vIE5vdCBjdXJyZW50bHkgc2VudCBieSBFZGdlcG9ydAogCQljYXNlIElPU1BfU1RBVFVTX0xTUjoKIAkJCWRiZygiJXMgLSBQb3J0ICV1IExTUiBTdGF0dXMgPSAlMDJ4IiwgX19GVU5DVElPTl9fLCBlZGdlX3NlcmlhbC0+cnhQb3J0LCBieXRlMik7Ci0JCQloYW5kbGVfbmV3X2xzciAoZWRnZV9wb3J0LCBGQUxTRSwgYnl0ZTIsIDApOworCQkJaGFuZGxlX25ld19sc3IoZWRnZV9wb3J0LCBmYWxzZSwgYnl0ZTIsIDApOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBJT1NQX1NUQVRVU19MU1JfREFUQToKIAkJCWRiZygiJXMgLSBQb3J0ICV1IExTUiBTdGF0dXMgPSAlMDJ4LCBEYXRhID0gJTAyeCIsIF9fRlVOQ1RJT05fXywgZWRnZV9zZXJpYWwtPnJ4UG9ydCwgYnl0ZTIsIGJ5dGUzKTsKIAkJCS8vIGJ5dGUyIGlzIExTUiBSZWdpc3RlcgogCQkJLy8gYnl0ZTMgaXMgYnJva2VuIGRhdGEgYnl0ZQotCQkJaGFuZGxlX25ld19sc3IgKGVkZ2VfcG9ydCwgVFJVRSwgYnl0ZTIsIGJ5dGUzKTsKKwkJCWhhbmRsZV9uZXdfbHNyKGVkZ2VfcG9ydCwgdHJ1ZSwgYnl0ZTIsIGJ5dGUzKTsKIAkJCWJyZWFrOwogCQkJLy8KIAkJCS8vCWNhc2UgSU9TUF9FWFRfNF9TVEFUVVM6CkBAIC0yMzE3LDE0ICsyMzE3LDE0IEBACiAJaWYgKCF1cmIpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JQ21kVXJicysrOwotCWRiZygiJXMgLSBBTExPQ0FURSBVUkIgJXAgKG91dHN0YW5kaW5nICVkKSIsIF9fRlVOQ1RJT05fXywgdXJiLCBDbWRVcmJzKTsKKwlhdG9taWNfaW5jKCZDbWRVcmJzKTsKKwlkYmcoIiVzIC0gQUxMT0NBVEUgVVJCICVwIChvdXRzdGFuZGluZyAlZCkiLCBfX0ZVTkNUSU9OX18sIHVyYiwgYXRvbWljX3JlYWQoJkNtZFVyYnMpKTsKIAogCXVzYl9maWxsX2J1bGtfdXJiICh1cmIsIGVkZ2Vfc2VyaWFsLT5zZXJpYWwtPmRldiwgCiAJCSAgICAgICB1c2Jfc25kYnVsa3BpcGUoZWRnZV9zZXJpYWwtPnNlcmlhbC0+ZGV2LCBlZGdlX3NlcmlhbC0+YnVsa19vdXRfZW5kcG9pbnQpLAogCQkgICAgICAgYnVmZmVyLCBsZW5ndGgsIGVkZ2VfYnVsa19vdXRfY21kX2NhbGxiYWNrLCBlZGdlX3BvcnQpOwogCi0JZWRnZV9wb3J0LT5jb21tYW5kUGVuZGluZyA9IFRSVUU7CisJZWRnZV9wb3J0LT5jb21tYW5kUGVuZGluZyA9IHRydWU7CiAJc3RhdHVzID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKIAogCWlmIChzdGF0dXMpIHsKQEAgLTIzMzIsMTYgKzIzMzIsMTYgQEAKIAkJZGV2X2VycigmZWRnZV9wb3J0LT5wb3J0LT5kZXYsICIlcyAtIHVzYl9zdWJtaXRfdXJiKHdyaXRlIGNvbW1hbmQpIGZhaWxlZCwgc3RhdHVzID0gJWRcbiIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKIAkJdXNiX2tpbGxfdXJiKHVyYik7CiAJCXVzYl9mcmVlX3VyYih1cmIpOwotCQlDbWRVcmJzLS07CisJCWF0b21pY19kZWMoJkNtZFVyYnMpOwogCQlyZXR1cm4gc3RhdHVzOwogCX0KIAogCS8vIHdhaXQgZm9yIGNvbW1hbmQgdG8gZmluaXNoCiAJdGltZW91dCA9IENPTU1BTkRfVElNRU9VVDsKICNpZiAwCi0Jd2FpdF9ldmVudCAoJmVkZ2VfcG9ydC0+d2FpdF9jb21tYW5kLCAoZWRnZV9wb3J0LT5jb21tYW5kUGVuZGluZyA9PSBGQUxTRSkpOworCXdhaXRfZXZlbnQgKCZlZGdlX3BvcnQtPndhaXRfY29tbWFuZCwgIWVkZ2VfcG9ydC0+Y29tbWFuZFBlbmRpbmcpOwogCi0JaWYgKGVkZ2VfcG9ydC0+Y29tbWFuZFBlbmRpbmcgPT0gVFJVRSkgeworCWlmIChlZGdlX3BvcnQtPmNvbW1hbmRQZW5kaW5nKSB7CiAJCS8qIGNvbW1hbmQgdGltZWQgb3V0ICovCiAJCWRiZygiJXMgLSBjb21tYW5kIHRpbWVkIG91dCIsIF9fRlVOQ1RJT05fXyk7CiAJCXN0YXR1cyA9IC1FSU5WQUw7CkBAIC0yNTI0LDggKzI1MjQsOCBAQAogCiAJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIGVkZ2VfcG9ydC0+cG9ydC0+bnVtYmVyKTsKIAotCWlmICgoIWVkZ2VfcG9ydC0+b3BlbikgJiYKLQkgICAgKCFlZGdlX3BvcnQtPm9wZW5QZW5kaW5nKSkgeworCWlmICghZWRnZV9wb3J0LT5vcGVuICYmCisJICAgICFlZGdlX3BvcnQtPm9wZW5QZW5kaW5nKSB7CiAJCWRiZygiJXMgLSBwb3J0IG5vdCBvcGVuZWQiLCBfX0ZVTkNUSU9OX18pOwogCQlyZXR1cm47CiAJfQpAQCAtMjgzNiw5ICsyODM2LDkgQEAKIAlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2OwogCWludCBpLCBqOwogCWludCByZXNwb25zZTsKLQlpbnQgaW50ZXJydXB0X2luX2ZvdW5kOwotCWludCBidWxrX2luX2ZvdW5kOwotCWludCBidWxrX291dF9mb3VuZDsKKwlib29sIGludGVycnVwdF9pbl9mb3VuZDsKKwlib29sIGJ1bGtfaW5fZm91bmQ7CisJYm9vbCBidWxrX291dF9mb3VuZDsKIAlzdGF0aWMgX191MzIgZGVzY3JpcHRvclszXSA9IHsJRURHRV9DT01QQVRJQklMSVRZX01BU0swLAogCQkJCQlFREdFX0NPTVBBVElCSUxJVFlfTUFTSzEsCiAJCQkJCUVER0VfQ09NUEFUSUJJTElUWV9NQVNLMiB9OwpAQCAtMjkzNiwxNCArMjkzNiwxNCBAQAogCWlmIChlZGdlX3NlcmlhbC0+aXNfZXBpYykgewogCQkvKiBFUElDIHRoaW5nLCBzZXQgdXAgb3VyIGludGVycnVwdCBwb2xsaW5nIG5vdyBhbmQgb3VyIHJlYWQgdXJiLCBzbwogCQkgKiB0aGF0IHRoZSBkZXZpY2Uga25vd3MgaXQgcmVhbGx5IGlzIGNvbm5lY3RlZC4gKi8KLQkJaW50ZXJydXB0X2luX2ZvdW5kID0gYnVsa19pbl9mb3VuZCA9IGJ1bGtfb3V0X2ZvdW5kID0gRkFMU0U7CisJCWludGVycnVwdF9pbl9mb3VuZCA9IGJ1bGtfaW5fZm91bmQgPSBidWxrX291dF9mb3VuZCA9IGZhbHNlOwogCQlmb3IgKGkgPSAwOyBpIDwgc2VyaWFsLT5pbnRlcmZhY2UtPmFsdHNldHRpbmdbMF0uZGVzYy5iTnVtRW5kcG9pbnRzOyArK2kpIHsKIAkJCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZW5kcG9pbnQ7CiAJCQlpbnQgYnVmZmVyX3NpemU7CiAKIAkJCWVuZHBvaW50ID0gJnNlcmlhbC0+aW50ZXJmYWNlLT5hbHRzZXR0aW5nWzBdLmVuZHBvaW50W2ldLmRlc2M7CiAJCQlidWZmZXJfc2l6ZSA9IGxlMTZfdG9fY3B1KGVuZHBvaW50LT53TWF4UGFja2V0U2l6ZSk7Ci0JCQlpZiAoKCFpbnRlcnJ1cHRfaW5fZm91bmQpICYmCisJCQlpZiAoIWludGVycnVwdF9pbl9mb3VuZCAmJgogCQkJICAgICh1c2JfZW5kcG9pbnRfaXNfaW50X2luKGVuZHBvaW50KSkpIHsKIAkJCQkvKiB3ZSBmb3VuZCBhIGludGVycnVwdCBpbiBlbmRwb2ludCAqLwogCQkJCWRiZygiZm91bmQgaW50ZXJydXB0IGluIik7CkBAIC0yOTcyLDEwICsyOTcyLDEwIEBACiAJCQkJCQkgZWRnZV9zZXJpYWwsCiAJCQkJCQkgZW5kcG9pbnQtPmJJbnRlcnZhbCk7CiAKLQkJCQlpbnRlcnJ1cHRfaW5fZm91bmQgPSBUUlVFOworCQkJCWludGVycnVwdF9pbl9mb3VuZCA9IHRydWU7CiAJCQl9CiAKLQkJCWlmICgoIWJ1bGtfaW5fZm91bmQpICYmCisJCQlpZiAoIWJ1bGtfaW5fZm91bmQgJiYKIAkJCSAgICAodXNiX2VuZHBvaW50X2lzX2J1bGtfaW4oZW5kcG9pbnQpKSkgewogCQkJCS8qIHdlIGZvdW5kIGEgYnVsayBpbiBlbmRwb2ludCAqLwogCQkJCWRiZygiZm91bmQgYnVsayBpbiIpOwpAQCAtMzAwMSwxOSArMzAwMSwxOSBAQAogCQkJCQkJICBlbmRwb2ludC0+d01heFBhY2tldFNpemUsCiAJCQkJCQkgIGVkZ2VfYnVsa19pbl9jYWxsYmFjaywKIAkJCQkJCSAgZWRnZV9zZXJpYWwpOwotCQkJCWJ1bGtfaW5fZm91bmQgPSBUUlVFOworCQkJCWJ1bGtfaW5fZm91bmQgPSB0cnVlOwogCQkJfQogCi0JCQlpZiAoKCFidWxrX291dF9mb3VuZCkgJiYKKwkJCWlmICghYnVsa19vdXRfZm91bmQgJiYKIAkJCSAgICAodXNiX2VuZHBvaW50X2lzX2J1bGtfb3V0KGVuZHBvaW50KSkpIHsKIAkJCQkvKiB3ZSBmb3VuZCBhIGJ1bGsgb3V0IGVuZHBvaW50ICovCiAJCQkJZGJnKCJmb3VuZCBidWxrIG91dCIpOwogCQkJCWVkZ2Vfc2VyaWFsLT5idWxrX291dF9lbmRwb2ludCA9IGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzOwotCQkJCWJ1bGtfb3V0X2ZvdW5kID0gVFJVRTsKKwkJCQlidWxrX291dF9mb3VuZCA9IHRydWU7CiAJCQl9CiAJCX0KIAotCQlpZiAoKCFpbnRlcnJ1cHRfaW5fZm91bmQpIHx8ICghYnVsa19pbl9mb3VuZCkgfHwgKCFidWxrX291dF9mb3VuZCkpIHsKKwkJaWYgKCFpbnRlcnJ1cHRfaW5fZm91bmQgfHwgIWJ1bGtfaW5fZm91bmQgfHwgIWJ1bGtfb3V0X2ZvdW5kKSB7CiAJCQllcnIgKCJFcnJvciAtIHRoZSBwcm9wZXIgZW5kcG9pbnRzIHdlcmUgbm90IGZvdW5kISIpOwogCQkJcmV0dXJuIC1FTk9ERVY7CiAJCX0KQEAgLTMwODMsNiArMzA4Myw3IEBACiAJcmV0dmFsID0gdXNiX3JlZ2lzdGVyKCZpb19kcml2ZXIpOwogCWlmIChyZXR2YWwpIAogCQlnb3RvIGZhaWxlZF91c2JfcmVnaXN0ZXI7CisJYXRvbWljX3NldCgmQ21kVXJicywgMCk7CiAJaW5mbyhEUklWRVJfREVTQyAiICIgRFJJVkVSX1ZFUlNJT04pOwogCXJldHVybiAwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvaW9fZWRnZXBvcnQuaCBiL2RyaXZlcnMvdXNiL3NlcmlhbC9pb19lZGdlcG9ydC5oCmluZGV4IDI5YTkxM2EuLmNiMjAxYzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9pb19lZGdlcG9ydC5oCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9pb19lZGdlcG9ydC5oCkBAIC0xOSwxMiArMTksNiBAQAogI2RlZmluZSBNQVhfUlMyMzJfUE9SVFMJCTgJLyogTWF4ICMgb2YgUlMtMjMyIHBvcnRzIHBlciBkZXZpY2UgKi8KIAogLyogdHlwZWRlZnMgdGhhdCB0aGUgaW5zaWRlb3V0IGhlYWRlcnMgbmVlZCAqLwotI2lmbmRlZiBUUlVFCi0JI2RlZmluZSBUUlVFCQkoMSkKLSNlbmRpZgotI2lmbmRlZiBGQUxTRQotCSNkZWZpbmUgRkFMU0UJCSgwKQotI2VuZGlmCiAjaWZuZGVmIExPVzgKIAkjZGVmaW5lIExPVzgoYSkJCSgodW5zaWduZWQgY2hhcikoYSAmIDB4ZmYpKQogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvaXBhcS5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2lwYXEuYwppbmRleCBkMTZlMmUxLi40ZGYwZWM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvaXBhcS5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9pcGFxLmMKQEAgLTI1NSw2ICsyNTUsNyBAQAogCXsgVVNCX0RFVklDRSgweDA0REQsIDB4OTEwMikgfSwgLyogU0hBUlAgV1MwMDNTSCBVU0IgTW9kZW0gKi8KIAl7IFVTQl9ERVZJQ0UoMHgwNERELCAweDkxMjEpIH0sIC8qIFNIQVJQIFdTMDA0U0ggVVNCIE1vZGVtICovCiAJeyBVU0JfREVWSUNFKDB4MDRERCwgMHg5MTIzKSB9LCAvKiBTSEFSUCBXUzAwN1NIIFVTQiBNb2RlbSAqLworCXsgVVNCX0RFVklDRSgweDA0REQsIDB4OTE1MSkgfSwgLyogU0hBUlAgUzAxU0ggVVNCIE1vZGVtICovCiAJeyBVU0JfREVWSUNFKDB4MDRFOCwgMHg1RjAwKSB9LCAvKiBTYW1zdW5nIE5FWGlPIFVTQiBTeW5jICovCiAJeyBVU0JfREVWSUNFKDB4MDRFOCwgMHg1RjAxKSB9LCAvKiBTYW1zdW5nIE5FWGlPIFVTQiBTeW5jICovCiAJeyBVU0JfREVWSUNFKDB4MDRFOCwgMHg1RjAyKSB9LCAvKiBTYW1zdW5nIE5FWGlPIFVTQiBTeW5jICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwva2w1a3VzYjEwNS5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2tsNWt1c2IxMDUuYwppbmRleCBiMjA5N2M0Li43YjA4NWYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwva2w1a3VzYjEwNS5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9rbDVrdXNiMTA1LmMKQEAgLTIzOCw3ICsyMzgsNyBAQAogCWlmIChyYyA8IDApCiAJCWVycigiUmVhZGluZyBsaW5lIHN0YXR1cyBmYWlsZWQgKGVycm9yID0gJWQpIiwgcmMpOwogCWVsc2UgewotCQlzdGF0dXMgPSBzdGF0dXNfYnVmWzBdICsgKHN0YXR1c19idWZbMV08PDgpOworCQlzdGF0dXMgPSBsZTE2X3RvX2NwdSgqKHUxNiAqKXN0YXR1c19idWYpOwogCiAJCWluZm8oIiVzIC0gcmVhZCBzdGF0dXMgJXggJXgiLCBfX0ZVTkNUSU9OX18sCiAJCSAgICAgc3RhdHVzX2J1ZlswXSwgc3RhdHVzX2J1ZlsxXSk7CkBAIC0yNTcsNyArMjU3LDcgQEAKIHN0YXRpYyBpbnQga2xzaV8xMDVfc3RhcnR1cCAoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCkKIHsKIAlzdHJ1Y3Qga2xzaV8xMDVfcHJpdmF0ZSAqcHJpdjsKLQlpbnQgaTsKKwlpbnQgaSwgajsKIAogCS8qIGNoZWNrIGlmIHdlIHN1cHBvcnQgdGhlIHByb2R1Y3QgaWQgKHNlZSBrZXlzcGFuLmMpCiAJICogRklYTUUKQEAgLTI2NSwxMiArMjY1LDEyIEBACiAKIAkvKiBhbGxvY2F0ZSB0aGUgcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZSAqLwogCWZvciAoaT0wOyBpPHNlcmlhbC0+bnVtX3BvcnRzOyBpKyspIHsKLQkJaW50IGo7CiAJCXByaXYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qga2xzaV8xMDVfcHJpdmF0ZSksCiAJCQkJCQkgICBHRlBfS0VSTkVMKTsKIAkJaWYgKCFwcml2KSB7CiAJCQlkYmcoIiVza21hbGxvYyBmb3Iga2xzaV8xMDVfcHJpdmF0ZSBmYWlsZWQuIiwgX19GVU5DVElPTl9fKTsKLQkJCXJldHVybiAtRU5PTUVNOworCQkJaS0tOworCQkJZ290byBlcnJfY2xlYW51cDsKIAkJfQogCQkvKiBzZXQgaW5pdGlhbCB2YWx1ZXMgZm9yIGNvbnRyb2wgc3RydWN0dXJlcyAqLwogCQlwcml2LT5jZmcucGt0bGVuICAgID0gNTsKQEAgLTI5MiwxNSArMjkyLDE0IEBACiAJCQlwcml2LT53cml0ZV91cmJfcG9vbFtqXSA9IHVyYjsKIAkJCWlmICh1cmIgPT0gTlVMTCkgewogCQkJCWVycigiTm8gbW9yZSB1cmJzPz8/Iik7Ci0JCQkJY29udGludWU7CisJCQkJZ290byBlcnJfY2xlYW51cDsKIAkJCX0KIAotCQkJdXJiLT50cmFuc2Zlcl9idWZmZXIgPSBOVUxMOwogCQkJdXJiLT50cmFuc2Zlcl9idWZmZXIgPSBrbWFsbG9jIChVUkJfVFJBTlNGRVJfQlVGRkVSX1NJWkUsCiAJCQkJCQkJR0ZQX0tFUk5FTCk7CiAJCQlpZiAoIXVyYi0+dHJhbnNmZXJfYnVmZmVyKSB7CiAJCQkJZXJyKCIlcyAtIG91dCBvZiBtZW1vcnkgZm9yIHVyYiBidWZmZXJzLiIsIF9fRlVOQ1RJT05fXyk7Ci0JCQkJY29udGludWU7CisJCQkJZ290byBlcnJfY2xlYW51cDsKIAkJCX0KIAkJfQogCkBAIC0zMDgsNyArMzA3LDIwIEBACiAJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnNlcmlhbC0+cG9ydFtpXS0+d3JpdGVfd2FpdCk7CiAJfQogCQotCXJldHVybiAoMCk7CisJcmV0dXJuIDA7CisKK2Vycl9jbGVhbnVwOgorCWZvciAoOyBpID49IDA7IGktLSkgeworCQlwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHNlcmlhbC0+cG9ydFtpXSk7CisJCWZvciAoaj0wOyBqIDwgTlVNX1VSQlM7IGorKykgeworCQkJaWYgKHByaXYtPndyaXRlX3VyYl9wb29sW2pdKSB7CisJCQkJa2ZyZWUocHJpdi0+d3JpdGVfdXJiX3Bvb2xbal0tPnRyYW5zZmVyX2J1ZmZlcik7CisJCQkJdXNiX2ZyZWVfdXJiKHByaXYtPndyaXRlX3VyYl9wb29sW2pdKTsKKwkJCX0KKwkJfQorCQl1c2Jfc2V0X3NlcmlhbF9wb3J0X2RhdGEoc2VyaWFsLT5wb3J0W2ldLCBOVUxMKTsKKwl9CisJcmV0dXJuIC1FTk9NRU07CiB9IC8qIGtsc2lfMTA1X3N0YXJ0dXAgKi8KIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvbWN0X3UyMzIuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9tY3RfdTIzMi5jCmluZGV4IDRjZDgzOWIuLjNkYjFhZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9tY3RfdTIzMi5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9tY3RfdTIzMi5jCkBAIC00MzgsMTcgKzQzOCwyMSBAQAogCWlmIChyZXR2YWwpIHsKIAkJZXJyKCJ1c2Jfc3VibWl0X3VyYihyZWFkIGJ1bGspIGZhaWxlZCBwaXBlIDB4JXggZXJyICVkIiwKIAkJICAgIHBvcnQtPnJlYWRfdXJiLT5waXBlLCByZXR2YWwpOwotCQlnb3RvIGV4aXQ7CisJCWdvdG8gZXJyb3I7CiAJfQogCiAJcG9ydC0+aW50ZXJydXB0X2luX3VyYi0+ZGV2ID0gcG9ydC0+c2VyaWFsLT5kZXY7CiAJcmV0dmFsID0gdXNiX3N1Ym1pdF91cmIocG9ydC0+aW50ZXJydXB0X2luX3VyYiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHJldHZhbCkKKwlpZiAocmV0dmFsKSB7CisJCXVzYl9raWxsX3VyYihwb3J0LT5yZWFkX3VyYik7CiAJCWVycigiIHVzYl9zdWJtaXRfdXJiKHJlYWQgaW50KSBmYWlsZWQgcGlwZSAweCV4IGVyciAlZCIsCiAJCSAgICBwb3J0LT5pbnRlcnJ1cHRfaW5fdXJiLT5waXBlLCByZXR2YWwpOwotCi1leGl0OgorCQlnb3RvIGVycm9yOworCX0KIAlyZXR1cm4gMDsKKworZXJyb3I6CisJcmV0dXJuIHJldHZhbDsKIH0gLyogbWN0X3UyMzJfb3BlbiAqLwogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9tb3M3NzIwLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvbW9zNzcyMC5jCmluZGV4IDE5YmY0MDMuLmI1NjNlMmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9tb3M3NzIwLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL21vczc3MjAuYwpAQCAtMTAzLDExICsxMDMsOSBAQAogewogCWludCByZXN1bHQ7CiAJaW50IGxlbmd0aDsKLQlfX3UzMiAqZGF0YTsKLQl1bnNpZ25lZCBpbnQgc3RhdHVzOworCV9fdTggKmRhdGE7CiAJX191OCBzcDE7CiAJX191OCBzcDI7Ci0JX191OCBzdDsKIAogCWRiZygiJXMiLCIgOiBFbnRlcmluZ1xuIik7CiAKQEAgLTE0MSwxOCArMTM5LDE5IEBACiAJICogQnl0ZSAyIElJUiBQb3J0IDIgKHBvcnQubnVtYmVyIGlzIDEpCiAJICogQnl0ZSAzIC0tLS0tLS0tLS0tLS0tCiAJICogQnl0ZSA0IEZJRk8gc3RhdHVzIGZvciBib3RoICovCi0JaWYgKGxlbmd0aCAmJiBsZW5ndGggPiA0KSB7CisKKwkvKiB0aGUgYWJvdmUgZGVzY3JpcHRpb24gaXMgaW52ZXJ0ZWQKKwkgKiAJb25ldWt1bSAyMDA3LTAzLTE0ICovCisKKwlpZiAodW5saWtlbHkobGVuZ3RoICE9IDQpKSB7CiAJCWRiZygiV3JvbmcgZGF0YSAhISEiKTsKIAkJcmV0dXJuOwogCX0KIAotCXN0YXR1cyA9ICpkYXRhOworCXNwMSA9IGRhdGFbM107CisJc3AyID0gZGF0YVsyXTsKIAotCXNwMSA9IChzdGF0dXMgJiAweGZmMDAwMDAwKT4+MjQ7Ci0Jc3AyID0gKHN0YXR1cyAmIDB4MDBmZjAwMDApPj4xNjsKLQlzdCA9IHN0YXR1cyAmIDB4MDAwMDAwZmY7Ci0KLQlpZiAoKHNwMSAmIDB4MDEpIHx8IChzcDIgJiAweDAxKSkgeworCWlmICgoc3AxIHwgc3AyKSAmIDB4MDEpIHsKIAkJLyogTm8gSW50ZXJydXB0IFBlbmRpbmcgaW4gYm90aCB0aGUgcG9ydHMgKi8KIAkJZGJnKCJObyBJbnRlcnJ1cHQgISEhIik7CiAJfSBlbHNlIHsKQEAgLTMzMyw2ICszMzIsNyBAQAogCWludCByZXNwb25zZTsKIAlpbnQgcG9ydF9udW1iZXI7CiAJY2hhciBkYXRhOworCWludCBhbGxvY2F0ZWRfdXJicyA9IDA7CiAJaW50IGo7CiAKIAlzZXJpYWwgPSBwb3J0LT5zZXJpYWw7CkBAIC0zNTMsNyArMzUzLDcgQEAKIAogCS8qIEluaXRpYWxpc2luZyB0aGUgd3JpdGUgdXJiIHBvb2wgKi8KIAlmb3IgKGogPSAwOyBqIDwgTlVNX1VSQlM7ICsraikgewotCQl1cmIgPSB1c2JfYWxsb2NfdXJiKDAsR0ZQX0FUT01JQyk7CisJCXVyYiA9IHVzYl9hbGxvY191cmIoMCxHRlBfS0VSTkVMKTsKIAkJbW9zNzcyMF9wb3J0LT53cml0ZV91cmJfcG9vbFtqXSA9IHVyYjsKIAogCQlpZiAodXJiID09IE5VTEwpIHsKQEAgLTM2NSwxMCArMzY1LDE2IEBACiAJCQkJCSAgICAgICBHRlBfS0VSTkVMKTsKIAkJaWYgKCF1cmItPnRyYW5zZmVyX2J1ZmZlcikgewogCQkJZXJyKCIlcy1vdXQgb2YgbWVtb3J5IGZvciB1cmIgYnVmZmVycy4iLCBfX0ZVTkNUSU9OX18pOworCQkJdXNiX2ZyZWVfdXJiKG1vczc3MjBfcG9ydC0+d3JpdGVfdXJiX3Bvb2xbal0pOworCQkJbW9zNzcyMF9wb3J0LT53cml0ZV91cmJfcG9vbFtqXSA9IE5VTEw7CiAJCQljb250aW51ZTsKIAkJfQorCQlhbGxvY2F0ZWRfdXJicysrOwogCX0KIAorCWlmICghYWxsb2NhdGVkX3VyYnMpCisJCXJldHVybiAtRU5PTUVNOworCiAJIC8qIEluaXRpYWxpemUgTUNTNzcyMCAtLSBXcml0ZSBJbml0IHZhbHVlcyB0byBjb3JyZXNwb25kaW5nIFJlZ2lzdGVycwogCSAgKgogCSAgKiBSZWdpc3RlciBJbmRleApAQCAtNTI2LDcgKzUzMiw3IEBACiAJfQogCiAJZm9yIChpID0gMDsgaSA8IE5VTV9VUkJTOyArK2kpIHsKLQkJaWYgKG1vczc3MjBfcG9ydC0+d3JpdGVfdXJiX3Bvb2xbaV0tPnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpCisJCWlmIChtb3M3NzIwX3BvcnQtPndyaXRlX3VyYl9wb29sW2ldICYmIG1vczc3MjBfcG9ydC0+d3JpdGVfdXJiX3Bvb2xbaV0tPnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpCiAJCQljaGFycyArPSBVUkJfVFJBTlNGRVJfQlVGRkVSX1NJWkU7CiAJfQogCWRiZygiJXMgLSByZXR1cm5zICVkIiwgX19GVU5DVElPTl9fLCBjaGFycyk7CkBAIC02MjksNyArNjM1LDcgQEAKIAl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgTlVNX1VSQlM7ICsraSkgewotCQlpZiAobW9zNzcyMF9wb3J0LT53cml0ZV91cmJfcG9vbFtpXS0+c3RhdHVzICE9IC1FSU5QUk9HUkVTUykKKwkJaWYgKG1vczc3MjBfcG9ydC0+d3JpdGVfdXJiX3Bvb2xbaV0gJiYgbW9zNzcyMF9wb3J0LT53cml0ZV91cmJfcG9vbFtpXS0+c3RhdHVzICE9IC1FSU5QUk9HUkVTUykKIAkJCXJvb20gKz0gVVJCX1RSQU5TRkVSX0JVRkZFUl9TSVpFOwogCX0KIApAQCAtNjY0LDcgKzY3MCw3IEBACiAJdXJiID0gTlVMTDsKIAogCWZvciAoaSA9IDA7IGkgPCBOVU1fVVJCUzsgKytpKSB7Ci0JCWlmIChtb3M3NzIwX3BvcnQtPndyaXRlX3VyYl9wb29sW2ldLT5zdGF0dXMgIT0gLUVJTlBST0dSRVNTKSB7CisJCWlmIChtb3M3NzIwX3BvcnQtPndyaXRlX3VyYl9wb29sW2ldICYmIG1vczc3MjBfcG9ydC0+d3JpdGVfdXJiX3Bvb2xbaV0tPnN0YXR1cyAhPSAtRUlOUFJPR1JFU1MpIHsKIAkJCXVyYiA9IG1vczc3MjBfcG9ydC0+d3JpdGVfdXJiX3Bvb2xbaV07CiAJCQlkYmcoIlVSQjolZCIsaSk7CiAJCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9tb3M3ODQwLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvbW9zNzg0MC5jCmluZGV4IGM2Y2NhODUuLjIzNjZlN2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9tb3M3ODQwLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL21vczc4NDAuYwpAQCAtMTc2LDkgKzE3NiwxMiBAQAogCWludCBwb3J0X251bTsJCS8qQWN0dWFsIHBvcnQgbnVtYmVyIGluIHRoZSBkZXZpY2UoMSwyLGV0YykgKi8KIAlzdHJ1Y3QgdXJiICp3cml0ZV91cmI7CS8qIHdyaXRlIFVSQiBmb3IgdGhpcyBwb3J0ICovCiAJc3RydWN0IHVyYiAqcmVhZF91cmI7CS8qIHJlYWQgVVJCIGZvciB0aGlzIHBvcnQgKi8KKwlzdHJ1Y3QgdXJiICppbnRfdXJiOwogCV9fdTggc2hhZG93TENSOwkJLyogbGFzdCBMQ1IgdmFsdWUgcmVjZWl2ZWQgKi8KIAlfX3U4IHNoYWRvd01DUjsJCS8qIGxhc3QgTUNSIHZhbHVlIHJlY2VpdmVkICovCiAJY2hhciBvcGVuOworCWNoYXIgb3Blbl9wb3J0czsKKwljaGFyIHpvbWJpZTsKIAl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0X2NoYXNlOwkvKiBmb3IgaGFuZGxpbmcgc2xlZXBpbmcgd2hpbGUgd2FpdGluZyBmb3IgY2hhc2UgdG8gZmluaXNoICovCiAJd2FpdF9xdWV1ZV9oZWFkX3QgZGVsdGFfbXNyX3dhaXQ7CS8qIGZvciBoYW5kbGluZyBzbGVlcGluZyB3aGlsZSB3YWl0aW5nIGZvciBtc3IgY2hhbmdlIHRvIGhhcHBlbiAqLwogCWludCBkZWx0YV9tc3JfY29uZDsKQEAgLTE5MSwxNyArMTk0LDE3IEBACiAJX191OCBEY3JSZWdPZmZzZXQ7CiAJLy9mb3IgcHJvY2Vzc2luZyBjb250cm9sIFVSQlMgaW4gaW50ZXJydXB0IGNvbnRleHQKIAlzdHJ1Y3QgdXJiICpjb250cm9sX3VyYjsKKwlzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICpkcjsKIAljaGFyICpjdHJsX2J1ZjsKIAlpbnQgTXNyTHNyOwogCisJc3BpbmxvY2tfdCBwb29sX2xvY2s7CiAJc3RydWN0IHVyYiAqd3JpdGVfdXJiX3Bvb2xbTlVNX1VSQlNdOworCWNoYXIgYnVzeVtOVU1fVVJCU107CiB9OwogCiAKIHN0YXRpYyBpbnQgZGVidWc7Ci1zdGF0aWMgaW50IG1vczc4NDBfbnVtX3BvcnRzOwkvL3RoaXMgc2F5cyB0aGUgbnVtYmVyIG9mIHBvcnRzIGluIHRoZSBkZXZpY2UKLXN0YXRpYyBpbnQgbW9zNzg0MF9udW1fb3Blbl9wb3J0czsKLQogCiAvKgogICogbW9zNzg0MF9zZXRfcmVnX3N5bmMKQEAgLTI1NCw3ICsyNTcsNyBAQAogCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYgPSBwb3J0LT5zZXJpYWwtPmRldjsKIAl2YWwgPSB2YWwgJiAweDAwZmY7CiAJLy8gRm9yIHRoZSBVQVJUIGNvbnRyb2wgcmVnaXN0ZXJzLCB0aGUgYXBwbGljYXRpb24gbnVtYmVyIG5lZWQgdG8gYmUgT3InZWQKLQlpZiAobW9zNzg0MF9udW1fcG9ydHMgPT0gNCkgeworCWlmIChwb3J0LT5zZXJpYWwtPm51bV9wb3J0cyA9PSA0KSB7CiAJCXZhbCB8PQogCQkgICAgKCgoX191MTYpIHBvcnQtPm51bWJlciAtIChfX3UxNikgKHBvcnQtPnNlcmlhbC0+bWlub3IpKSArCiAJCSAgICAgMSkgPDwgODsKQEAgLTI5NCw3ICsyOTcsNyBAQAogCiAJLy9kYmcoImFwcGxpY2F0aW9uIG51bWJlciBpcyAlNHggXG4iLCgoKF9fdTE2KXBvcnQtPm51bWJlciAtIChfX3UxNikocG9ydC0+c2VyaWFsLT5taW5vcikpKzEpPDw4KTsKIAkvKld2YWwgIGlzIHNhbWUgYXMgYXBwbGljYXRpb24gbnVtYmVyICovCi0JaWYgKG1vczc4NDBfbnVtX3BvcnRzID09IDQpIHsKKwlpZiAocG9ydC0+c2VyaWFsLT5udW1fcG9ydHMgPT0gNCkgewogCQlXdmFsID0KIAkJICAgICgoKF9fdTE2KSBwb3J0LT5udW1iZXIgLSAoX191MTYpIChwb3J0LT5zZXJpYWwtPm1pbm9yKSkgKwogCQkgICAgIDEpIDw8IDg7CkBAIC0zNTIsNyArMzU1LDcgQEAKIAlyZXR1cm4gKHN0cnVjdCBtb3NjaGlwX3BvcnQgKil1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiB9CiAKLXN0YXRpYyBpbnQgbW9zNzg0MF9oYW5kbGVfbmV3X21zcihzdHJ1Y3QgbW9zY2hpcF9wb3J0ICpwb3J0LCBfX3U4IG5ld19tc3IpCitzdGF0aWMgdm9pZCBtb3M3ODQwX2hhbmRsZV9uZXdfbXNyKHN0cnVjdCBtb3NjaGlwX3BvcnQgKnBvcnQsIF9fdTggbmV3X21zcikKIHsKIAlzdHJ1Y3QgbW9zY2hpcF9wb3J0ICptb3M3ODQwX3BvcnQ7CiAJc3RydWN0IGFzeW5jX2ljb3VudCAqaWNvdW50OwpAQCAtMzY2LDIyICszNjksMjQgQEAKIAkJLyogdXBkYXRlIGlucHV0IGxpbmUgY291bnRlcnMgKi8KIAkJaWYgKG5ld19tc3IgJiBNT1NfTVNSX0RFTFRBX0NUUykgewogCQkJaWNvdW50LT5jdHMrKzsKKwkJCXNtcF93bWIoKTsKIAkJfQogCQlpZiAobmV3X21zciAmIE1PU19NU1JfREVMVEFfRFNSKSB7CiAJCQlpY291bnQtPmRzcisrOworCQkJc21wX3dtYigpOwogCQl9CiAJCWlmIChuZXdfbXNyICYgTU9TX01TUl9ERUxUQV9DRCkgewogCQkJaWNvdW50LT5kY2QrKzsKKwkJCXNtcF93bWIoKTsKIAkJfQogCQlpZiAobmV3X21zciAmIE1PU19NU1JfREVMVEFfUkkpIHsKIAkJCWljb3VudC0+cm5nKys7CisJCQlzbXBfd21iKCk7CiAJCX0KIAl9Ci0KLQlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBtb3M3ODQwX2hhbmRsZV9uZXdfbHNyKHN0cnVjdCBtb3NjaGlwX3BvcnQgKnBvcnQsIF9fdTggbmV3X2xzcikKK3N0YXRpYyB2b2lkIG1vczc4NDBfaGFuZGxlX25ld19sc3Ioc3RydWN0IG1vc2NoaXBfcG9ydCAqcG9ydCwgX191OCBuZXdfbHNyKQogewogCXN0cnVjdCBhc3luY19pY291bnQgKmljb3VudDsKIApAQCAtNDAwLDE4ICs0MDUsMjAgQEAKIAlpY291bnQgPSAmcG9ydC0+aWNvdW50OwogCWlmIChuZXdfbHNyICYgU0VSSUFMX0xTUl9CSSkgewogCQlpY291bnQtPmJyaysrOworCQlzbXBfd21iKCk7CiAJfQogCWlmIChuZXdfbHNyICYgU0VSSUFMX0xTUl9PRSkgewogCQlpY291bnQtPm92ZXJydW4rKzsKKwkJc21wX3dtYigpOwogCX0KIAlpZiAobmV3X2xzciAmIFNFUklBTF9MU1JfUEUpIHsKIAkJaWNvdW50LT5wYXJpdHkrKzsKKwkJc21wX3dtYigpOwogCX0KIAlpZiAobmV3X2xzciAmIFNFUklBTF9MU1JfRkUpIHsKIAkJaWNvdW50LT5mcmFtZSsrOworCQlzbXBfd21iKCk7CiAJfQotCi0JcmV0dXJuIDA7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC00MjYsMTIgKzQzMywxNSBAQAogCXVuc2lnbmVkIGNoYXIgKmRhdGE7CiAJc3RydWN0IG1vc2NoaXBfcG9ydCAqbW9zNzg0MF9wb3J0OwogCV9fdTggcmVndmFsID0gMHgwOworCWludCByZXN1bHQgPSAwOwogCiAJaWYgKCF1cmIpIHsKIAkJZGJnKCIlcyIsICJJbnZhbGlkIFBvaW50ZXIgISEhITpcbiIpOwogCQlyZXR1cm47CiAJfQogCisJbW9zNzg0MF9wb3J0ID0gKHN0cnVjdCBtb3NjaGlwX3BvcnQgKil1cmItPmNvbnRleHQ7CisKIAlzd2l0Y2ggKHVyYi0+c3RhdHVzKSB7CiAJY2FzZSAwOgogCQkvKiBzdWNjZXNzICovCkBAIC00NDksOCArNDU5LDYgQEAKIAkJZ290byBleGl0OwogCX0KIAotCW1vczc4NDBfcG9ydCA9IChzdHJ1Y3QgbW9zY2hpcF9wb3J0ICopdXJiLT5jb250ZXh0OwotCiAJZGJnKCIlcyB1cmIgYnVmZmVyIHNpemUgaXMgJWRcbiIsIF9fRlVOQ1RJT05fXywgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKIAlkYmcoIiVzIG1vczc4NDBfcG9ydC0+TXNyTHNyIGlzICVkIHBvcnQgJWRcbiIsIF9fRlVOQ1RJT05fXywKIAkgICAgbW9zNzg0MF9wb3J0LT5Nc3JMc3IsIG1vczc4NDBfcG9ydC0+cG9ydF9udW0pOwpAQCAtNDYyLDIxICs0NzAsMjYgQEAKIAllbHNlIGlmIChtb3M3ODQwX3BvcnQtPk1zckxzciA9PSAxKQogCQltb3M3ODQwX2hhbmRsZV9uZXdfbHNyKG1vczc4NDBfcG9ydCwgcmVndmFsKTsKIAotICAgICAgZXhpdDoKLQlyZXR1cm47CitleGl0OgorCXNwaW5fbG9jaygmbW9zNzg0MF9wb3J0LT5wb29sX2xvY2spOworCWlmICghbW9zNzg0MF9wb3J0LT56b21iaWUpCisJCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKG1vczc4NDBfcG9ydC0+aW50X3VyYiwgR0ZQX0FUT01JQyk7CisJc3Bpbl91bmxvY2soJm1vczc4NDBfcG9ydC0+cG9vbF9sb2NrKTsKKwlpZiAocmVzdWx0KSB7CisJCWRldl9lcnIoJnVyYi0+ZGV2LT5kZXYsCisJCQkiJXMgLSBFcnJvciAlZCBzdWJtaXR0aW5nIGludGVycnVwdCB1cmJcbiIsCisJCQlfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJfQogfQogCiBzdGF0aWMgaW50IG1vczc4NDBfZ2V0X3JlZyhzdHJ1Y3QgbW9zY2hpcF9wb3J0ICptY3MsIF9fdTE2IFd2YWwsIF9fdTE2IHJlZywKIAkJCSAgIF9fdTE2ICogdmFsKQogewogCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYgPSBtY3MtPnBvcnQtPnNlcmlhbC0+ZGV2OwotCXN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKmRyID0gTlVMTDsKLQl1bnNpZ25lZCBjaGFyICpidWZmZXIgPSBOVUxMOwotCWludCByZXQgPSAwOwotCWJ1ZmZlciA9IChfX3U4ICopIG1jcy0+Y3RybF9idWY7CisJc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqZHIgPSBtY3MtPmRyOworCXVuc2lnbmVkIGNoYXIgKmJ1ZmZlciA9IG1jcy0+Y3RybF9idWY7CisJaW50IHJldDsKIAotLy8gICAgICBkcj0oc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqKShidWZmZXIpOwotCWRyID0gKHZvaWQgKikoYnVmZmVyICsgMik7CiAJZHItPmJSZXF1ZXN0VHlwZSA9IE1DU19SRF9SVFlQRTsKIAlkci0+YlJlcXVlc3QgPSBNQ1NfUkRSRVE7CiAJZHItPndWYWx1ZSA9IGNwdV90b19sZTE2KFd2YWwpOwkvLzA7CkBAIC01MDYsOCArNTE5LDggQEAKIAlfX3UxNiBEYXRhOwogCXVuc2lnbmVkIGNoYXIgKmRhdGE7CiAJX191OCBzcFs1XSwgc3Q7Ci0JaW50IGk7Ci0JX191MTYgd3ZhbDsKKwlpbnQgaSwgcnYgPSAwOworCV9fdTE2IHd2YWwsIHdyZWcgPSAwOwogCiAJZGJnKCIlcyIsICIgOiBFbnRlcmluZ1xuIik7CiAJaWYgKCF1cmIpIHsKQEAgLTU2OSwzMSArNTgyLDM0IEBACiAJCQkJCWRiZygiU2VyaWFsIFBvcnQgJWQ6IFJlY2VpdmVyIHN0YXR1cyBlcnJvciBvciAiLCBpKTsKIAkJCQkJZGJnKCJhZGRyZXNzIGJpdCBkZXRlY3RlZCBpbiA5LWJpdCBtb2RlXG4iKTsKIAkJCQkJbW9zNzg0MF9wb3J0LT5Nc3JMc3IgPSAxOwotCQkJCQltb3M3ODQwX2dldF9yZWcobW9zNzg0MF9wb3J0LCB3dmFsLAotCQkJCQkJCUxJTkVfU1RBVFVTX1JFR0lTVEVSLAotCQkJCQkJCSZEYXRhKTsKKwkJCQkJd3JlZyA9IExJTkVfU1RBVFVTX1JFR0lTVEVSOwogCQkJCQlicmVhazsKIAkJCQljYXNlIFNFUklBTF9JSVJfTVM6CiAJCQkJCWRiZygiU2VyaWFsIFBvcnQgJWQ6IE1vZGVtIHN0YXR1cyBjaGFuZ2VcbiIsIGkpOwogCQkJCQltb3M3ODQwX3BvcnQtPk1zckxzciA9IDA7Ci0JCQkJCW1vczc4NDBfZ2V0X3JlZyhtb3M3ODQwX3BvcnQsIHd2YWwsCi0JCQkJCQkJTU9ERU1fU1RBVFVTX1JFR0lTVEVSLAotCQkJCQkJCSZEYXRhKTsKKwkJCQkJd3JlZyA9IE1PREVNX1NUQVRVU19SRUdJU1RFUjsKIAkJCQkJYnJlYWs7CiAJCQkJfQorCQkJCXNwaW5fbG9jaygmbW9zNzg0MF9wb3J0LT5wb29sX2xvY2spOworCQkJCWlmICghbW9zNzg0MF9wb3J0LT56b21iaWUpIHsKKwkJCQkJcnYgPSBtb3M3ODQwX2dldF9yZWcobW9zNzg0MF9wb3J0LCB3dmFsLCB3cmVnLCAmRGF0YSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJc3Bpbl91bmxvY2soJm1vczc4NDBfcG9ydC0+cG9vbF9sb2NrKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCQlzcGluX3VubG9jaygmbW9zNzg0MF9wb3J0LT5wb29sX2xvY2spOwogCQkJfQogCQl9CiAJfQotICAgICAgZXhpdDoKKwlpZiAoIShydiA8IDApKSAvKiB0aGUgY29tcGxldGlvbiBoYW5kbGVyIGZvciB0aGUgY29udHJvbCB1cmIgd2lsbCByZXN1Ym1pdCAqLworCQlyZXR1cm47CitleGl0OgogCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CiAJaWYgKHJlc3VsdCkgewogCQlkZXZfZXJyKCZ1cmItPmRldi0+ZGV2LAogCQkJIiVzIC0gRXJyb3IgJWQgc3VibWl0dGluZyBpbnRlcnJ1cHQgdXJiXG4iLAogCQkJX19GVU5DVElPTl9fLCByZXN1bHQpOwogCX0KLQotCXJldHVybjsKLQogfQogCiBzdGF0aWMgaW50IG1vczc4NDBfcG9ydF9wYXJhbm9pYV9jaGVjayhzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LApAQCAtNjM0LDcgKzY1MCw4IEBACiAJaWYgKCFwb3J0IHx8CiAJICAgIG1vczc4NDBfcG9ydF9wYXJhbm9pYV9jaGVjayhwb3J0LCBmdW5jdGlvbikgfHwKIAkgICAgbW9zNzg0MF9zZXJpYWxfcGFyYW5vaWFfY2hlY2socG9ydC0+c2VyaWFsLCBmdW5jdGlvbikpIHsKLQkJLyogdGhlbiBzYXkgdGhhdCB3ZSBkb24ndCBoYXZlIGEgdmFsaWQgdXNiX3NlcmlhbCB0aGluZywgd2hpY2ggd2lsbCAgICAgICAgICAgICAgICAgICogZW5kIHVwIGdlbnJhdGluZyAtRU5PREVWIHJldHVybiB2YWx1ZXMgKi8KKwkJLyogdGhlbiBzYXkgdGhhdCB3ZSBkb24ndCBoYXZlIGEgdmFsaWQgdXNiX3NlcmlhbCB0aGluZywgd2hpY2ggd2lsbAorCQkgKiBlbmQgdXAgZ2VucmF0aW5nIC1FTk9ERVYgcmV0dXJuIHZhbHVlcyAqLwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKQEAgLTY5OSw2ICs3MTYsNyBAQAogCQkJdHR5X2ZsaXBfYnVmZmVyX3B1c2godHR5KTsKIAkJfQogCQltb3M3ODQwX3BvcnQtPmljb3VudC5yeCArPSB1cmItPmFjdHVhbF9sZW5ndGg7CisJCXNtcF93bWIoKTsKIAkJZGJnKCJtb3M3ODQwX3BvcnQtPmljb3VudC5yeCBpcyAlZDpcbiIsCiAJCSAgICBtb3M3ODQwX3BvcnQtPmljb3VudC5yeCk7CiAJfQpAQCAtNzA4LDE1ICs3MjYsMTQgQEAKIAkJcmV0dXJuOwogCX0KIAotCWlmIChtb3M3ODQwX3BvcnQtPnJlYWRfdXJiLT5zdGF0dXMgIT0gLUVJTlBST0dSRVNTKSB7Ci0JCW1vczc4NDBfcG9ydC0+cmVhZF91cmItPmRldiA9IHNlcmlhbC0+ZGV2OwogCi0JCXN0YXR1cyA9IHVzYl9zdWJtaXRfdXJiKG1vczc4NDBfcG9ydC0+cmVhZF91cmIsIEdGUF9BVE9NSUMpOworCW1vczc4NDBfcG9ydC0+cmVhZF91cmItPmRldiA9IHNlcmlhbC0+ZGV2OwogCi0JCWlmIChzdGF0dXMpIHsKLQkJCWRiZygiIHVzYl9zdWJtaXRfdXJiKHJlYWQgYnVsaykgZmFpbGVkLCBzdGF0dXMgPSAlZCIsCi0JCQkgICAgc3RhdHVzKTsKLQkJfQorCXN0YXR1cyA9IHVzYl9zdWJtaXRfdXJiKG1vczc4NDBfcG9ydC0+cmVhZF91cmIsIEdGUF9BVE9NSUMpOworCisJaWYgKHN0YXR1cykgeworCQlkYmcoIiB1c2Jfc3VibWl0X3VyYihyZWFkIGJ1bGspIGZhaWxlZCwgc3RhdHVzID0gJWQiLAorCQkgc3RhdHVzKTsKIAl9CiB9CiAKQEAgLTczMCwxNyArNzQ3LDI4IEBACiB7CiAJc3RydWN0IG1vc2NoaXBfcG9ydCAqbW9zNzg0MF9wb3J0OwogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisJaW50IGk7CisKIAlpZiAoIXVyYikgewogCQlkYmcoIiVzIiwgIkludmFsaWQgUG9pbnRlciAhISEhOlxuIik7CiAJCXJldHVybjsKIAl9CiAKKwltb3M3ODQwX3BvcnQgPSAoc3RydWN0IG1vc2NoaXBfcG9ydCAqKXVyYi0+Y29udGV4dDsKKwlzcGluX2xvY2soJm1vczc4NDBfcG9ydC0+cG9vbF9sb2NrKTsKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX1VSQlM7IGkrKykgeworCQlpZiAodXJiID09IG1vczc4NDBfcG9ydC0+d3JpdGVfdXJiX3Bvb2xbaV0pIHsKKwkJCW1vczc4NDBfcG9ydC0+YnVzeVtpXSA9IDA7CisJCQlicmVhazsKKwkJfQorCX0KKwlzcGluX3VubG9jaygmbW9zNzg0MF9wb3J0LT5wb29sX2xvY2spOworCiAJaWYgKHVyYi0+c3RhdHVzKSB7CiAJCWRiZygibm9uemVybyB3cml0ZSBidWxrIHN0YXR1cyByZWNlaXZlZDolZFxuIiwgdXJiLT5zdGF0dXMpOwogCQlyZXR1cm47CiAJfQogCi0JbW9zNzg0MF9wb3J0ID0gKHN0cnVjdCBtb3NjaGlwX3BvcnQgKil1cmItPmNvbnRleHQ7CiAJaWYgKCFtb3M3ODQwX3BvcnQpIHsKIAkJZGJnKCIlcyIsICJOVUxMIG1vczc4NDBfcG9ydCBwb2ludGVyIFxuIik7CiAJCXJldHVybjsKQEAgLTc5MiwxMyArODIwLDEzIEBACiAJX191MTYgRGF0YTsKIAlpbnQgc3RhdHVzOwogCXN0cnVjdCBtb3NjaGlwX3BvcnQgKm1vczc4NDBfcG9ydDsKKwlzdHJ1Y3QgbW9zY2hpcF9wb3J0ICpwb3J0MDsKIAogCWlmIChtb3M3ODQwX3BvcnRfcGFyYW5vaWFfY2hlY2socG9ydCwgX19GVU5DVElPTl9fKSkgewogCQlkYmcoIiVzIiwgIlBvcnQgUGFyYW5vaWEgZmFpbGVkIFxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCW1vczc4NDBfbnVtX29wZW5fcG9ydHMrKzsKIAlzZXJpYWwgPSBwb3J0LT5zZXJpYWw7CiAKIAlpZiAobW9zNzg0MF9zZXJpYWxfcGFyYW5vaWFfY2hlY2soc2VyaWFsLCBfX0ZVTkNUSU9OX18pKSB7CkBAIC04MDcsMTYgKzgzNSwxOCBAQAogCX0KIAogCW1vczc4NDBfcG9ydCA9IG1vczc4NDBfZ2V0X3BvcnRfcHJpdmF0ZShwb3J0KTsKKwlwb3J0MCA9IG1vczc4NDBfZ2V0X3BvcnRfcHJpdmF0ZShzZXJpYWwtPnBvcnRbMF0pOwogCi0JaWYgKG1vczc4NDBfcG9ydCA9PSBOVUxMKQorCWlmIChtb3M3ODQwX3BvcnQgPT0gTlVMTCB8fCBwb3J0MCA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCXVzYl9jbGVhcl9oYWx0KHNlcmlhbC0+ZGV2LCBwb3J0LT53cml0ZV91cmItPnBpcGUpOwogCXVzYl9jbGVhcl9oYWx0KHNlcmlhbC0+ZGV2LCBwb3J0LT5yZWFkX3VyYi0+cGlwZSk7CisJcG9ydDAtPm9wZW5fcG9ydHMrKzsKIAogCS8qIEluaXRpYWxpc2luZyB0aGUgd3JpdGUgdXJiIHBvb2wgKi8KIAlmb3IgKGogPSAwOyBqIDwgTlVNX1VSQlM7ICsraikgewotCQl1cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9BVE9NSUMpOworCQl1cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwogCQltb3M3ODQwX3BvcnQtPndyaXRlX3VyYl9wb29sW2pdID0gdXJiOwogCiAJCWlmICh1cmIgPT0gTlVMTCkgewpAQCAtODI0LDEwICs4NTQsMTAgQEAKIAkJCWNvbnRpbnVlOwogCQl9CiAKLQkJdXJiLT50cmFuc2Zlcl9idWZmZXIgPSBOVUxMOwotCQl1cmItPnRyYW5zZmVyX2J1ZmZlciA9Ci0JCSAgICBrbWFsbG9jKFVSQl9UUkFOU0ZFUl9CVUZGRVJfU0laRSwgR0ZQX0tFUk5FTCk7CisJCXVyYi0+dHJhbnNmZXJfYnVmZmVyID0ga21hbGxvYyhVUkJfVFJBTlNGRVJfQlVGRkVSX1NJWkUsIEdGUF9LRVJORUwpOwogCQlpZiAoIXVyYi0+dHJhbnNmZXJfYnVmZmVyKSB7CisJCQl1c2JfZnJlZV91cmIodXJiKTsKKwkJCW1vczc4NDBfcG9ydC0+d3JpdGVfdXJiX3Bvb2xbal0gPSBOVUxMOwogCQkJZXJyKCIlcy1vdXQgb2YgbWVtb3J5IGZvciB1cmIgYnVmZmVycy4iLCBfX0ZVTkNUSU9OX18pOwogCQkJY29udGludWU7CiAJCX0KQEAgLTg3OSw5ICs5MDksNyBAQAogCX0KIAlEYXRhIHw9IDB4MDg7CQkvL0RyaXZlciBkb25lIGJpdAogCURhdGEgfD0gMHgyMDsJCS8vcnhfZGlzYWJsZQotCXN0YXR1cyA9IDA7Ci0Jc3RhdHVzID0KLQkgICAgbW9zNzg0MF9zZXRfcmVnX3N5bmMocG9ydCwgbW9zNzg0MF9wb3J0LT5Db250cm9sUmVnT2Zmc2V0LCBEYXRhKTsKKwlzdGF0dXMgPSBtb3M3ODQwX3NldF9yZWdfc3luYyhwb3J0LCBtb3M3ODQwX3BvcnQtPkNvbnRyb2xSZWdPZmZzZXQsIERhdGEpOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCWRiZygid3JpdGluZyBDb250cm9scmVnIGZhaWxlZFxuIik7CiAJCXJldHVybiAtMTsKQEAgLTg5Myw3ICs5MjEsNiBAQAogCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCiAJRGF0YSA9IDB4MDA7Ci0Jc3RhdHVzID0gMDsKIAlzdGF0dXMgPSBtb3M3ODQwX3NldF91YXJ0X3JlZyhwb3J0LCBJTlRFUlJVUFRfRU5BQkxFX1JFR0lTVEVSLCBEYXRhKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQlkYmcoImRpc2FibGVpbmcgaW50ZXJydXB0cyBmYWlsZWRcbiIpOwpAQCAtOTAxLDcgKzkyOCw2IEBACiAJfQogCS8vIFNldCBGSUZPX0NPTlRST0xfUkVHSVNURVIgdG8gdGhlIGRlZmF1bHQgdmFsdWUKIAlEYXRhID0gMHgwMDsKLQlzdGF0dXMgPSAwOwogCXN0YXR1cyA9IG1vczc4NDBfc2V0X3VhcnRfcmVnKHBvcnQsIEZJRk9fQ09OVFJPTF9SRUdJU1RFUiwgRGF0YSk7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJZGJnKCJXcml0aW5nIEZJRk9fQ09OVFJPTF9SRUdJU1RFUiAgZmFpbGVkXG4iKTsKQEAgLTkwOSw3ICs5MzUsNiBAQAogCX0KIAogCURhdGEgPSAweGNmOwotCXN0YXR1cyA9IDA7CiAJc3RhdHVzID0gbW9zNzg0MF9zZXRfdWFydF9yZWcocG9ydCwgRklGT19DT05UUk9MX1JFR0lTVEVSLCBEYXRhKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQlkYmcoIldyaXRpbmcgRklGT19DT05UUk9MX1JFR0lTVEVSICBmYWlsZWRcbiIpOwpAQCAtOTE3LDIyICs5NDIsMTggQEAKIAl9CiAKIAlEYXRhID0gMHgwMzsKLQlzdGF0dXMgPSAwOwogCXN0YXR1cyA9IG1vczc4NDBfc2V0X3VhcnRfcmVnKHBvcnQsIExJTkVfQ09OVFJPTF9SRUdJU1RFUiwgRGF0YSk7CiAJbW9zNzg0MF9wb3J0LT5zaGFkb3dMQ1IgPSBEYXRhOwogCiAJRGF0YSA9IDB4MGI7Ci0Jc3RhdHVzID0gMDsKIAlzdGF0dXMgPSBtb3M3ODQwX3NldF91YXJ0X3JlZyhwb3J0LCBNT0RFTV9DT05UUk9MX1JFR0lTVEVSLCBEYXRhKTsKIAltb3M3ODQwX3BvcnQtPnNoYWRvd01DUiA9IERhdGE7CiAKIAlEYXRhID0gMHgwMDsKLQlzdGF0dXMgPSAwOwogCXN0YXR1cyA9IG1vczc4NDBfZ2V0X3VhcnRfcmVnKHBvcnQsIExJTkVfQ09OVFJPTF9SRUdJU1RFUiwgJkRhdGEpOwogCW1vczc4NDBfcG9ydC0+c2hhZG93TENSID0gRGF0YTsKIAogCURhdGEgfD0gU0VSSUFMX0xDUl9ETEFCOwkvL2RhdGEgbGF0Y2ggZW5hYmxlIGluIExDUiAweDgwCi0Jc3RhdHVzID0gMDsKIAlzdGF0dXMgPSBtb3M3ODQwX3NldF91YXJ0X3JlZyhwb3J0LCBMSU5FX0NPTlRST0xfUkVHSVNURVIsIERhdGEpOwogCiAJRGF0YSA9IDB4MGM7CkBAIC05OTksNyArMTAyMCw3IEBACiAvKiBDaGVjayB0byBzZWUgaWYgd2UndmUgc2V0IHVwIG91ciBlbmRwb2ludCBpbmZvIHlldCAgICAqCiAgICAgICogKGNhbid0IHNldCBpdCB1cCBpbiBtb3M3ODQwX3N0YXJ0dXAgYXMgdGhlIHN0cnVjdHVyZXMgKgogICAgICAqIHdlcmUgbm90IHNldCB1cCBhdCB0aGF0IHRpbWUuKSAgICAgICAgICAgICAgICAgICAgICAgICovCi0JaWYgKG1vczc4NDBfbnVtX29wZW5fcG9ydHMgPT0gMSkgeworCWlmIChwb3J0MC0+b3Blbl9wb3J0cyA9PSAxKSB7CiAJCWlmIChzZXJpYWwtPnBvcnRbMF0tPmludGVycnVwdF9pbl9idWZmZXIgPT0gTlVMTCkgewogCiAJCQkvKiBzZXQgdXAgaW50ZXJydXB0IHVyYiAqLwpAQCAtMTA5Nyw2ICsxMTE4LDcgQEAKIHsKIAlpbnQgaTsKIAlpbnQgY2hhcnMgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IG1vc2NoaXBfcG9ydCAqbW9zNzg0MF9wb3J0OwogCiAJZGJnKCIlcyBcbiIsICIgbW9zNzg0MF9jaGFyc19pbl9idWZmZXI6ZW50ZXJpbmcgLi4uLi4uLi4uLi4iKTsKQEAgLTExMTIsMTMgKzExMzQsMTUgQEAKIAkJcmV0dXJuIC0xOwogCX0KIAorCXNwaW5fbG9ja19pcnFzYXZlKCZtb3M3ODQwX3BvcnQtPnBvb2xfbG9jayxmbGFncyk7CiAJZm9yIChpID0gMDsgaSA8IE5VTV9VUkJTOyArK2kpIHsKLQkJaWYgKG1vczc4NDBfcG9ydC0+d3JpdGVfdXJiX3Bvb2xbaV0tPnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpIHsKKwkJaWYgKG1vczc4NDBfcG9ydC0+YnVzeVtpXSkgewogCQkJY2hhcnMgKz0gVVJCX1RSQU5TRkVSX0JVRkZFUl9TSVpFOwogCQl9CiAJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1vczc4NDBfcG9ydC0+cG9vbF9sb2NrLGZsYWdzKTsKIAlkYmcoIiVzIC0gcmV0dXJucyAlZCIsIF9fRlVOQ1RJT05fXywgY2hhcnMpOwotCXJldHVybiAoY2hhcnMpOworCXJldHVybiBjaGFyczsKIAogfQogCkBAIC0xMTcyLDYgKzExOTYsNyBAQAogewogCXN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWw7CiAJc3RydWN0IG1vc2NoaXBfcG9ydCAqbW9zNzg0MF9wb3J0OworCXN0cnVjdCBtb3NjaGlwX3BvcnQgKnBvcnQwOwogCWludCBqOwogCV9fdTE2IERhdGE7CiAKQEAgLTExODksMTAgKzEyMTQsMTAgQEAKIAl9CiAKIAltb3M3ODQwX3BvcnQgPSBtb3M3ODQwX2dldF9wb3J0X3ByaXZhdGUocG9ydCk7CisJcG9ydDAgPSBtb3M3ODQwX2dldF9wb3J0X3ByaXZhdGUoc2VyaWFsLT5wb3J0WzBdKTsKIAotCWlmIChtb3M3ODQwX3BvcnQgPT0gTlVMTCkgeworCWlmIChtb3M3ODQwX3BvcnQgPT0gTlVMTCB8fCBwb3J0MCA9PSBOVUxMKQogCQlyZXR1cm47Ci0JfQogCiAJZm9yIChqID0gMDsgaiA8IE5VTV9VUkJTOyArK2opCiAJCXVzYl9raWxsX3VyYihtb3M3ODQwX3BvcnQtPndyaXRlX3VyYl9wb29sW2pdKTsKQEAgLTEyMzQsMTIgKzEyNTksMTMgQEAKIAl9CiAvLyAgICAgICAgICAgICAgaWYobW9zNzg0MF9wb3J0LT5jdHJsX2J1ZiAhPSBOVUxMKQogLy8gICAgICAgICAgICAgICAgICAgICAga2ZyZWUobW9zNzg0MF9wb3J0LT5jdHJsX2J1Zik7Ci0JbW9zNzg0MF9udW1fb3Blbl9wb3J0cy0tOworCXBvcnQwLT5vcGVuX3BvcnRzLS07CiAJZGJnKCJtb3M3ODQwX251bV9vcGVuX3BvcnRzIGluIGNsb3NlJWQ6aW4gcG9ydCVkXG4iLAotCSAgICBtb3M3ODQwX251bV9vcGVuX3BvcnRzLCBwb3J0LT5udW1iZXIpOwotCWlmIChtb3M3ODQwX251bV9vcGVuX3BvcnRzID09IDApIHsKKwkgICAgcG9ydDAtPm9wZW5fcG9ydHMsIHBvcnQtPm51bWJlcik7CisJaWYgKHBvcnQwLT5vcGVuX3BvcnRzID09IDApIHsKIAkJaWYgKHNlcmlhbC0+cG9ydFswXS0+aW50ZXJydXB0X2luX3VyYikgewogCQkJZGJnKCIlcyIsICJTaHV0ZG93biBpbnRlcnJ1cHRfaW5fdXJiXG4iKTsKKwkJCXVzYl9raWxsX3VyYihzZXJpYWwtPnBvcnRbMF0tPmludGVycnVwdF9pbl91cmIpOwogCQl9CiAJfQogCkBAIC0xMzY4LDYgKzEzOTQsNyBAQAogewogCWludCBpOwogCWludCByb29tID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBtb3NjaGlwX3BvcnQgKm1vczc4NDBfcG9ydDsKIAogCWRiZygiJXMgXG4iLCAiIG1vczc4NDBfd3JpdGVfcm9vbTplbnRlcmluZyAuLi4uLi4uLi4uLiIpOwpAQCAtMTM4NCwxNCArMTQxMSwxNyBAQAogCQlyZXR1cm4gLTE7CiAJfQogCisJc3Bpbl9sb2NrX2lycXNhdmUoJm1vczc4NDBfcG9ydC0+cG9vbF9sb2NrLCBmbGFncyk7CiAJZm9yIChpID0gMDsgaSA8IE5VTV9VUkJTOyArK2kpIHsKLQkJaWYgKG1vczc4NDBfcG9ydC0+d3JpdGVfdXJiX3Bvb2xbaV0tPnN0YXR1cyAhPSAtRUlOUFJPR1JFU1MpIHsKKwkJaWYgKCFtb3M3ODQwX3BvcnQtPmJ1c3lbaV0pIHsKIAkJCXJvb20gKz0gVVJCX1RSQU5TRkVSX0JVRkZFUl9TSVpFOwogCQl9CiAJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1vczc4NDBfcG9ydC0+cG9vbF9sb2NrLCBmbGFncyk7CiAKKwlyb29tID0gKHJvb20gPT0gMCkgPyAwIDogcm9vbSAtIFVSQl9UUkFOU0ZFUl9CVUZGRVJfU0laRSArIDE7CiAJZGJnKCIlcyAtIHJldHVybnMgJWQiLCBfX0ZVTkNUSU9OX18sIHJvb20pOwotCXJldHVybiAocm9vbSk7CisJcmV0dXJuIHJvb207CiAKIH0KIApAQCAtMTQxMCw2ICsxNDQwLDcgQEAKIAlpbnQgaTsKIAlpbnQgYnl0ZXNfc2VudCA9IDA7CiAJaW50IHRyYW5zZmVyX3NpemU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXN0cnVjdCBtb3NjaGlwX3BvcnQgKm1vczc4NDBfcG9ydDsKIAlzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsOwpAQCAtMTQ3NiwxMyArMTUwNywxNiBAQAogCS8qIHRyeSB0byBmaW5kIGEgZnJlZSB1cmIgaW4gdGhlIGxpc3QgKi8KIAl1cmIgPSBOVUxMOwogCisJc3Bpbl9sb2NrX2lycXNhdmUoJm1vczc4NDBfcG9ydC0+cG9vbF9sb2NrLCBmbGFncyk7CiAJZm9yIChpID0gMDsgaSA8IE5VTV9VUkJTOyArK2kpIHsKLQkJaWYgKG1vczc4NDBfcG9ydC0+d3JpdGVfdXJiX3Bvb2xbaV0tPnN0YXR1cyAhPSAtRUlOUFJPR1JFU1MpIHsKKwkJaWYgKCFtb3M3ODQwX3BvcnQtPmJ1c3lbaV0pIHsKKwkJCW1vczc4NDBfcG9ydC0+YnVzeVtpXSA9IDE7CiAJCQl1cmIgPSBtb3M3ODQwX3BvcnQtPndyaXRlX3VyYl9wb29sW2ldOwogCQkJZGJnKCJcblVSQjolZCIsIGkpOwogCQkJYnJlYWs7CiAJCX0KIAl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbW9zNzg0MF9wb3J0LT5wb29sX2xvY2ssIGZsYWdzKTsKIAogCWlmICh1cmIgPT0gTlVMTCkgewogCQlkYmcoIiVzIC0gbm8gbW9yZSBmcmVlIHVyYnMiLCBfX0ZVTkNUSU9OX18pOwpAQCAtMTUxOCw2ICsxNTUyLDcgQEAKIAlzdGF0dXMgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOwogCiAJaWYgKHN0YXR1cykgeworCQltb3M3ODQwX3BvcnQtPmJ1c3lbaV0gPSAwOwogCQllcnIoIiVzIC0gdXNiX3N1Ym1pdF91cmIod3JpdGUgYnVsaykgZmFpbGVkIHdpdGggc3RhdHVzID0gJWQiLAogCQkgICAgX19GVU5DVElPTl9fLCBzdGF0dXMpOwogCQlieXRlc19zZW50ID0gc3RhdHVzOwpAQCAtMTUyNSw2ICsxNTYwLDcgQEAKIAl9CiAJYnl0ZXNfc2VudCA9IHRyYW5zZmVyX3NpemU7CiAJbW9zNzg0MF9wb3J0LT5pY291bnQudHggKz0gdHJhbnNmZXJfc2l6ZTsKKwlzbXBfd21iKCk7CiAJZGJnKCJtb3M3ODQwX3BvcnQtPmljb3VudC50eCBpcyAlZDpcbiIsIG1vczc4NDBfcG9ydC0+aWNvdW50LnR4KTsKICAgICAgIGV4aXQ6CiAKQEAgLTI0OTAsNiArMjUyNiw3IEBACiAJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCiAJCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKIAkJCWNub3cgPSBtb3M3ODQwX3BvcnQtPmljb3VudDsKKwkJCXNtcF9ybWIoKTsKIAkJCWlmIChjbm93LnJuZyA9PSBjcHJldi5ybmcgJiYgY25vdy5kc3IgPT0gY3ByZXYuZHNyICYmCiAJCQkgICAgY25vdy5kY2QgPT0gY3ByZXYuZGNkICYmIGNub3cuY3RzID09IGNwcmV2LmN0cykKIAkJCQlyZXR1cm4gLUVJTzsJLyogbm8gY2hhbmdlID0+IGVycm9yICovCkBAIC0yNTA2LDYgKzI1NDMsNyBAQAogCiAJY2FzZSBUSU9DR0lDT1VOVDoKIAkJY25vdyA9IG1vczc4NDBfcG9ydC0+aWNvdW50OworCQlzbXBfcm1iKCk7CiAJCWljb3VudC5jdHMgPSBjbm93LmN0czsKIAkJaWNvdW50LmRzciA9IGNub3cuZHNyOwogCQlpY291bnQucm5nID0gY25vdy5ybmc7CkBAIC0yNTM1LDE5ICsyNTczLDE4IEBACiAKIHN0YXRpYyBpbnQgbW9zNzg0MF9jYWxjX251bV9wb3J0cyhzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsKQogeworCWludCBtb3M3ODQwX251bV9wb3J0cyA9IDA7CiAKIAlkYmcoIm51bWJlcm9mZW5kcG9pbnRzOiAlZCBcbiIsCiAJICAgIChpbnQpc2VyaWFsLT5pbnRlcmZhY2UtPmN1cl9hbHRzZXR0aW5nLT5kZXNjLmJOdW1FbmRwb2ludHMpOwogCWRiZygibnVtYmVyb2ZlbmRwb2ludHM6ICVkIFxuIiwKIAkgICAgKGludClzZXJpYWwtPmludGVyZmFjZS0+YWx0c2V0dGluZy0+ZGVzYy5iTnVtRW5kcG9pbnRzKTsKIAlpZiAoc2VyaWFsLT5pbnRlcmZhY2UtPmN1cl9hbHRzZXR0aW5nLT5kZXNjLmJOdW1FbmRwb2ludHMgPT0gNSkgewotCQltb3M3ODQwX251bV9wb3J0cyA9IDI7Ci0JCXNlcmlhbC0+dHlwZS0+bnVtX3BvcnRzID0gMjsKKwkJbW9zNzg0MF9udW1fcG9ydHMgPSBzZXJpYWwtPm51bV9wb3J0cyA9IDI7CiAJfSBlbHNlIGlmIChzZXJpYWwtPmludGVyZmFjZS0+Y3VyX2FsdHNldHRpbmctPmRlc2MuYk51bUVuZHBvaW50cyA9PSA5KSB7Ci0JCW1vczc4NDBfbnVtX3BvcnRzID0gNDsKLQkJc2VyaWFsLT50eXBlLT5udW1fYnVsa19pbiA9IDQ7Ci0JCXNlcmlhbC0+dHlwZS0+bnVtX2J1bGtfb3V0ID0gNDsKLQkJc2VyaWFsLT50eXBlLT5udW1fcG9ydHMgPSA0OworCQlzZXJpYWwtPm51bV9idWxrX2luID0gNDsKKwkJc2VyaWFsLT5udW1fYnVsa19vdXQgPSA0OworCQltb3M3ODQwX251bV9wb3J0cyA9IHNlcmlhbC0+bnVtX3BvcnRzID0gNDsKIAl9CiAKIAlyZXR1cm4gbW9zNzg0MF9udW1fcG9ydHM7CkBAIC0yNTgzLDcgKzI2MjAsOSBAQAogCQltb3M3ODQwX3BvcnQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbW9zY2hpcF9wb3J0KSwgR0ZQX0tFUk5FTCk7CiAJCWlmIChtb3M3ODQwX3BvcnQgPT0gTlVMTCkgewogCQkJZXJyKCIlcyAtIE91dCBvZiBtZW1vcnkiLCBfX0ZVTkNUSU9OX18pOwotCQkJcmV0dXJuIC1FTk9NRU07CisJCQlzdGF0dXMgPSAtRU5PTUVNOworCQkJaS0tOyAvKiBkb24ndCBmb2xsb3cgTlVMTCBwb2ludGVyIGNsZWFuaW5nIHVwICovCisJCQlnb3RvIGVycm9yOwogCQl9CiAKIAkJLyogSW5pdGlhbGl6ZSBhbGwgcG9ydCBpbnRlcnJ1cHQgZW5kIHBvaW50IHRvIHBvcnQgMCBpbnQgZW5kcG9pbnQgKgpAQCAtMjU5MSw2ICsyNjMwLDcgQEAKIAogCQltb3M3ODQwX3BvcnQtPnBvcnQgPSBzZXJpYWwtPnBvcnRbaV07CiAJCW1vczc4NDBfc2V0X3BvcnRfcHJpdmF0ZShzZXJpYWwtPnBvcnRbaV0sIG1vczc4NDBfcG9ydCk7CisJCXNwaW5fbG9ja19pbml0KCZtb3M3ODQwX3BvcnQtPnBvb2xfbG9jayk7CiAKIAkJbW9zNzg0MF9wb3J0LT5wb3J0X251bSA9ICgoc2VyaWFsLT5wb3J0W2ldLT5udW1iZXIgLQogCQkJCQkgICAoc2VyaWFsLT5wb3J0W2ldLT5zZXJpYWwtPm1pbm9yKSkgKwpAQCAtMjYwMSwyMiArMjY0MSwyMiBAQAogCQkJbW9zNzg0MF9wb3J0LT5Db250cm9sUmVnT2Zmc2V0ID0gMHgxOwogCQkJbW9zNzg0MF9wb3J0LT5EY3JSZWdPZmZzZXQgPSAweDQ7CiAJCX0gZWxzZSBpZiAoKG1vczc4NDBfcG9ydC0+cG9ydF9udW0gPT0gMikKLQkJCSAgICYmIChtb3M3ODQwX251bV9wb3J0cyA9PSA0KSkgeworCQkJICAgJiYgKHNlcmlhbC0+bnVtX3BvcnRzID09IDQpKSB7CiAJCQltb3M3ODQwX3BvcnQtPlNwUmVnT2Zmc2V0ID0gMHg4OwogCQkJbW9zNzg0MF9wb3J0LT5Db250cm9sUmVnT2Zmc2V0ID0gMHg5OwogCQkJbW9zNzg0MF9wb3J0LT5EY3JSZWdPZmZzZXQgPSAweDE2OwogCQl9IGVsc2UgaWYgKChtb3M3ODQwX3BvcnQtPnBvcnRfbnVtID09IDIpCi0JCQkgICAmJiAobW9zNzg0MF9udW1fcG9ydHMgPT0gMikpIHsKKwkJCSAgICYmIChzZXJpYWwtPm51bV9wb3J0cyA9PSAyKSkgewogCQkJbW9zNzg0MF9wb3J0LT5TcFJlZ09mZnNldCA9IDB4YTsKIAkJCW1vczc4NDBfcG9ydC0+Q29udHJvbFJlZ09mZnNldCA9IDB4YjsKIAkJCW1vczc4NDBfcG9ydC0+RGNyUmVnT2Zmc2V0ID0gMHgxOTsKIAkJfSBlbHNlIGlmICgobW9zNzg0MF9wb3J0LT5wb3J0X251bSA9PSAzKQotCQkJICAgJiYgKG1vczc4NDBfbnVtX3BvcnRzID09IDQpKSB7CisJCQkgICAmJiAoc2VyaWFsLT5udW1fcG9ydHMgPT0gNCkpIHsKIAkJCW1vczc4NDBfcG9ydC0+U3BSZWdPZmZzZXQgPSAweGE7CiAJCQltb3M3ODQwX3BvcnQtPkNvbnRyb2xSZWdPZmZzZXQgPSAweGI7CiAJCQltb3M3ODQwX3BvcnQtPkRjclJlZ09mZnNldCA9IDB4MTk7CiAJCX0gZWxzZSBpZiAoKG1vczc4NDBfcG9ydC0+cG9ydF9udW0gPT0gNCkKLQkJCSAgICYmIChtb3M3ODQwX251bV9wb3J0cyA9PSA0KSkgeworCQkJICAgJiYgKHNlcmlhbC0+bnVtX3BvcnRzID09IDQpKSB7CiAJCQltb3M3ODQwX3BvcnQtPlNwUmVnT2Zmc2V0ID0gMHhjOwogCQkJbW9zNzg0MF9wb3J0LT5Db250cm9sUmVnT2Zmc2V0ID0gMHhkOwogCQkJbW9zNzg0MF9wb3J0LT5EY3JSZWdPZmZzZXQgPSAweDFjOwpAQCAtMjcwMSwyMSArMjc0MSwxOSBAQAogCQkJZGJnKCJDTEtfU1RBUlRfVkFMVUVfUkVHSVNURVIgV3JpdGluZyBzdWNjZXNzIHN0YXR1cyVkXG4iLCBzdGF0dXMpOwogCiAJCURhdGEgPSAweDIwOwotCQlzdGF0dXMgPSAwOwogCQlzdGF0dXMgPQogCQkgICAgbW9zNzg0MF9zZXRfcmVnX3N5bmMoc2VyaWFsLT5wb3J0W2ldLCBDTEtfTVVMVElfUkVHSVNURVIsCiAJCQkJCSBEYXRhKTsKIAkJaWYgKHN0YXR1cyA8IDApIHsKIAkJCWRiZygiV3JpdGluZyBDTEtfTVVMVElfUkVHSVNURVIgZmFpbGVkIHN0YXR1cy0weCV4XG4iLAogCQkJICAgIHN0YXR1cyk7Ci0JCQlicmVhazsKKwkJCWdvdG8gZXJyb3I7CiAJCX0gZWxzZQogCQkJZGJnKCJDTEtfTVVMVElfUkVHSVNURVIgV3JpdGluZyBzdWNjZXNzIHN0YXR1cyVkXG4iLAogCQkJICAgIHN0YXR1cyk7CiAKIAkJLy93cml0ZSB2YWx1ZSAweDAgdG8gc2NyYXRjaHBhZCByZWdpc3RlcgogCQlEYXRhID0gMHgwMDsKLQkJc3RhdHVzID0gMDsKIAkJc3RhdHVzID0KIAkJICAgIG1vczc4NDBfc2V0X3VhcnRfcmVnKHNlcmlhbC0+cG9ydFtpXSwgU0NSQVRDSF9QQURfUkVHSVNURVIsCiAJCQkJCSBEYXRhKTsKQEAgLTI3MjksNyArMjc2Nyw3IEBACiAKIAkJLy9aZXJvIExlbmd0aCBmbGFnIHJlZ2lzdGVyCiAJCWlmICgobW9zNzg0MF9wb3J0LT5wb3J0X251bSAhPSAxKQotCQkgICAgJiYgKG1vczc4NDBfbnVtX3BvcnRzID09IDIpKSB7CisJCSAgICAmJiAoc2VyaWFsLT5udW1fcG9ydHMgPT0gMikpIHsKIAogCQkJRGF0YSA9IDB4ZmY7CiAJCQlzdGF0dXMgPSAwOwpAQCAtMjc3MCwxNCArMjgwOCwxNyBAQAogCQkJCSAgICBpICsgMSwgc3RhdHVzKTsKIAogCQl9Ci0JCW1vczc4NDBfcG9ydC0+Y29udHJvbF91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9BVE9NSUMpOworCQltb3M3ODQwX3BvcnQtPmNvbnRyb2xfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKIAkJbW9zNzg0MF9wb3J0LT5jdHJsX2J1ZiA9IGttYWxsb2MoMTYsIEdGUF9LRVJORUwpOwotCisJCW1vczc4NDBfcG9ydC0+ZHIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0KSwgR0ZQX0tFUk5FTCk7CisJCWlmICghbW9zNzg0MF9wb3J0LT5jb250cm9sX3VyYiB8fCAhbW9zNzg0MF9wb3J0LT5jdHJsX2J1ZiB8fCAhbW9zNzg0MF9wb3J0LT5kcikgeworCQkJc3RhdHVzID0gLUVOT01FTTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KIAl9CiAKIAkvL1plcm8gTGVuZ3RoIGZsYWcgZW5hYmxlCiAJRGF0YSA9IDB4MGY7Ci0Jc3RhdHVzID0gMDsKIAlzdGF0dXMgPSBtb3M3ODQwX3NldF9yZWdfc3luYyhzZXJpYWwtPnBvcnRbMF0sIFpMUF9SRUc1LCBEYXRhKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQlkYmcoIldyaXRpbmcgWkxQX1JFRzUgZmFpbGVkIHN0YXR1cy0weCV4XG4iLCBzdGF0dXMpOwpAQCAtMjc4OSw2ICsyODMwLDE3IEBACiAJdXNiX2NvbnRyb2xfbXNnKHNlcmlhbC0+ZGV2LCB1c2Jfc25kY3RybHBpcGUoc2VyaWFsLT5kZXYsIDApLAogCQkJKF9fdTgpIDB4MDMsIDB4MDAsIDB4MDEsIDB4MDAsIE5VTEwsIDB4MDAsIDUgKiBIWik7CiAJcmV0dXJuIDA7CitlcnJvcjoKKwlmb3IgKC8qIG5vdGhpbmcgKi87IGkgPj0gMDsgaS0tKSB7CisJCW1vczc4NDBfcG9ydCA9IG1vczc4NDBfZ2V0X3BvcnRfcHJpdmF0ZShzZXJpYWwtPnBvcnRbaV0pOworCisJCWtmcmVlKG1vczc4NDBfcG9ydC0+ZHIpOworCQlrZnJlZShtb3M3ODQwX3BvcnQtPmN0cmxfYnVmKTsKKwkJdXNiX2ZyZWVfdXJiKG1vczc4NDBfcG9ydC0+Y29udHJvbF91cmIpOworCQlrZnJlZShtb3M3ODQwX3BvcnQpOworCQlzZXJpYWwtPnBvcnRbaV0gPSBOVUxMOworCX0KKwlyZXR1cm4gc3RhdHVzOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMjc5OSw2ICsyODUxLDcgQEAKIHN0YXRpYyB2b2lkIG1vczc4NDBfc2h1dGRvd24oc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCkKIHsKIAlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBtb3NjaGlwX3BvcnQgKm1vczc4NDBfcG9ydDsKIAlkYmcoIiVzIFxuIiwgIiBzaHV0ZG93biA6ZW50ZXJpbmcuLi4uLi4uLi4uIik7CiAKQEAgLTI4MTQsOCArMjg2NywxMiBAQAogCiAJZm9yIChpID0gMDsgaSA8IHNlcmlhbC0+bnVtX3BvcnRzOyArK2kpIHsKIAkJbW9zNzg0MF9wb3J0ID0gbW9zNzg0MF9nZXRfcG9ydF9wcml2YXRlKHNlcmlhbC0+cG9ydFtpXSk7Ci0JCWtmcmVlKG1vczc4NDBfcG9ydC0+Y3RybF9idWYpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmbW9zNzg0MF9wb3J0LT5wb29sX2xvY2ssIGZsYWdzKTsKKwkJbW9zNzg0MF9wb3J0LT56b21iaWUgPSAxOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtb3M3ODQwX3BvcnQtPnBvb2xfbG9jaywgZmxhZ3MpOwogCQl1c2Jfa2lsbF91cmIobW9zNzg0MF9wb3J0LT5jb250cm9sX3VyYik7CisJCWtmcmVlKG1vczc4NDBfcG9ydC0+Y3RybF9idWYpOworCQlrZnJlZShtb3M3ODQwX3BvcnQtPmRyKTsKIAkJa2ZyZWUobW9zNzg0MF9wb3J0KTsKIAkJbW9zNzg0MF9zZXRfcG9ydF9wcml2YXRlKHNlcmlhbC0+cG9ydFtpXSwgTlVMTCk7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL29tbmluZXQuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9vbW5pbmV0LmMKaW5kZXggMDIxNmFjMS4uNGFkZmFiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL29tbmluZXQuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvb21uaW5ldC5jCkBAIC02OSw2ICs2OSw3IEBACiBzdGF0aWMgaW50ICBvbW5pbmV0X3dyaXRlCQkoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgY291bnQpOwogc3RhdGljIGludCAgb21uaW5ldF93cml0ZV9yb29tCQkoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCk7CiBzdGF0aWMgdm9pZCBvbW5pbmV0X3NodXRkb3duCQkoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCk7CitzdGF0aWMgaW50IG9tbmluZXRfYXR0YWNoCQkoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCk7CiAKIHN0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBpZF90YWJsZSBbXSA9IHsKIAl7IFVTQl9ERVZJQ0UoWllYRUxfVkVORE9SX0lELCBaWVhFTF9PTU5JTkVUX0lEKSB9LApAQCAtOTksNiArMTAwLDcgQEAKIAkubnVtX2J1bGtfaW4gPQkJMSwKIAkubnVtX2J1bGtfb3V0ID0JCTIsCiAJLm51bV9wb3J0cyA9CQkxLAorCS5hdHRhY2ggPQkJb21uaW5ldF9hdHRhY2gsCiAJLm9wZW4gPQkJCW9tbmluZXRfb3BlbiwKIAkuY2xvc2UgPQkJb21uaW5ldF9jbG9zZSwKIAkud3JpdGUgPQkJb21uaW5ldF93cml0ZSwKQEAgLTE0NSwyMiArMTQ3LDMwIEBACiAJX191OAlvZF9vdXRzZXE7CS8vIFNlcXVlbmNlIG51bWJlciBmb3IgYnVsa19vdXQgVVJCcwogfTsKIAotc3RhdGljIGludCBvbW5pbmV0X29wZW4gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICpmaWxwKQorc3RhdGljIGludCBvbW5pbmV0X2F0dGFjaCAoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCkKIHsKLQlzdHJ1Y3QgdXNiX3NlcmlhbAkqc2VyaWFsID0gcG9ydC0+c2VyaWFsOwotCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQJKndwb3J0OwotCXN0cnVjdCBvbW5pbmV0X2RhdGEJKm9kOwotCWludAkJCXJlc3VsdCA9IDA7Ci0KLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlzdHJ1Y3Qgb21uaW5ldF9kYXRhICpvZDsKKwlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gc2VyaWFsLT5wb3J0WzBdOwogCiAJb2QgPSBrbWFsbG9jKCBzaXplb2Yoc3RydWN0IG9tbmluZXRfZGF0YSksIEdGUF9LRVJORUwgKTsKIAlpZiggIW9kICkgewogCQllcnIoIiVzLSBrbWFsbG9jKCVaZCkgZmFpbGVkLiIsIF9fRlVOQ1RJT05fXywgc2l6ZW9mKHN0cnVjdCBvbW5pbmV0X2RhdGEpKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQotCiAJdXNiX3NldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQsIG9kKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvbW5pbmV0X29wZW4gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCXN0cnVjdCB1c2Jfc2VyaWFsCSpzZXJpYWwgPSBwb3J0LT5zZXJpYWw7CisJc3RydWN0IHVzYl9zZXJpYWxfcG9ydAkqd3BvcnQ7CisJc3RydWN0IG9tbmluZXRfZGF0YQkqb2QgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CisJaW50CQkJcmVzdWx0ID0gMDsKKworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCisJb2QgPSBrbWFsbG9jKCBzaXplb2Yoc3RydWN0IG9tbmluZXRfZGF0YSksIEdGUF9LRVJORUwgKTsKIAl3cG9ydCA9IHNlcmlhbC0+cG9ydFsxXTsKIAl3cG9ydC0+dHR5ID0gcG9ydC0+dHR5OwogCkBAIC0xNzAsMjQgKzE4MCwxNyBAQAogCQkgICAgICBwb3J0LT5yZWFkX3VyYi0+dHJhbnNmZXJfYnVmZmVyLCBwb3J0LT5yZWFkX3VyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCwKIAkJICAgICAgb21uaW5ldF9yZWFkX2J1bGtfY2FsbGJhY2ssIHBvcnQpOwogCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHBvcnQtPnJlYWRfdXJiLCBHRlBfS0VSTkVMKTsKLQlpZiAocmVzdWx0KQorCWlmIChyZXN1bHQpIHsKIAkJZXJyKCIlcyAtIGZhaWxlZCBzdWJtaXR0aW5nIHJlYWQgdXJiLCBlcnJvciAlZCIsIF9fRlVOQ1RJT05fXywgcmVzdWx0KTsKKwl9CiAKIAlyZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgdm9pZCBvbW5pbmV0X2Nsb3NlIChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqIGZpbHApCiB7Ci0Jc3RydWN0IHVzYl9zZXJpYWwgCSpzZXJpYWwgPSBwb3J0LT5zZXJpYWw7Ci0Jc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAJKndwb3J0OwotCiAJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7Ci0KLQl3cG9ydCA9IHNlcmlhbC0+cG9ydFsxXTsKLQl1c2Jfa2lsbF91cmIod3BvcnQtPndyaXRlX3VyYik7CiAJdXNiX2tpbGxfdXJiKHBvcnQtPnJlYWRfdXJiKTsKLQotCWtmcmVlKHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KSk7CiB9CiAKIApAQCAtMzI2LDcgKzMyOSwxMiBAQAogCiBzdGF0aWMgdm9pZCBvbW5pbmV0X3NodXRkb3duIChzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsKQogeworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKndwb3J0ID0gc2VyaWFsLT5wb3J0WzFdOworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSBzZXJpYWwtPnBvcnRbMF07CiAJZGJnICgiJXMiLCBfX0ZVTkNUSU9OX18pOworCisJdXNiX2tpbGxfdXJiKHdwb3J0LT53cml0ZV91cmIpOworCWtmcmVlKHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KSk7CiB9CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL29wdGlvbi5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL29wdGlvbi5jCmluZGV4IGUxNzhlNmYuLjhjM2Y1NWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9vcHRpb24uYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvb3B0aW9uLmMKQEAgLTExMyw2ICsxMTMsMTIgQEAKICNkZWZpbmUgQU5ZREFUQV9WRU5ET1JfSUQJCQkweDE2ZDUKICNkZWZpbmUgQU5ZREFUQV9QUk9EVUNUX0lECQkJMHg2NTAxCiAKKyNkZWZpbmUgQkFORFJJQ0hfVkVORE9SX0lECQkJMHgxQThECisjZGVmaW5lIEJBTkRSSUNIX1BST0RVQ1RfQzEwMF8xCQkJMHgxMDAyCisjZGVmaW5lIEJBTkRSSUNIX1BST0RVQ1RfQzEwMF8yCQkJMHgxMDAzCisKKyNkZWZpbmUgREVMTF9WRU5ET1JfSUQJCQkJMHg0MTNDCisKIHN0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBvcHRpb25faWRzW10gPSB7CiAJeyBVU0JfREVWSUNFKE9QVElPTl9WRU5ET1JfSUQsIE9QVElPTl9QUk9EVUNUX0NPTFQpIH0sCiAJeyBVU0JfREVWSUNFKE9QVElPTl9WRU5ET1JfSUQsIE9QVElPTl9QUk9EVUNUX1JJQ09MQSkgfSwKQEAgLTE2NSw2ICsxNzEsOSBAQAogCXsgVVNCX0RFVklDRShOT1ZBVEVMV0lSRUxFU1NfVkVORE9SX0lELCAweDIxMzApIH0sIC8qIE5vdmF0ZWwgTWVybGluIEVTNjIwIFNNIEJ1cyAqLwogCXsgVVNCX0RFVklDRShOT1ZBVEVMV0lSRUxFU1NfVkVORE9SX0lELCAweDI0MTApIH0sIC8qIE5vdmF0ZWwgRVU3NDAgKi8KIAl7IFVTQl9ERVZJQ0UoQU5ZREFUQV9WRU5ET1JfSUQsIEFOWURBVEFfUFJPRFVDVF9JRCkgfSwKKwl7IFVTQl9ERVZJQ0UoQkFORFJJQ0hfVkVORE9SX0lELCBCQU5EUklDSF9QUk9EVUNUX0MxMDBfMSkgfSwKKwl7IFVTQl9ERVZJQ0UoQkFORFJJQ0hfVkVORE9SX0lELCBCQU5EUklDSF9QUk9EVUNUX0MxMDBfMikgfSwKKwl7IFVTQl9ERVZJQ0UoREVMTF9WRU5ET1JfSUQsIDB4ODExOCkgfSwJCS8qIERlbGwgV2lyZWxlc3MgNTUxMCBNb2JpbGUgQnJvYWRiYW5kIEhTRFBBIEV4cHJlc3NDYXJkICovCiAJeyB9IC8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIG9wdGlvbl9pZHMpOwpAQCAtNTkxLDEyICs2MDAsNiBAQAogCXJldHVybiAoMCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBzdG9wX3VyYihzdHJ1Y3QgdXJiICp1cmIpCi17Ci0JaWYgKHVyYiAmJiB1cmItPnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpCi0JCXVzYl9raWxsX3VyYih1cmIpOwotfQotCiBzdGF0aWMgdm9pZCBvcHRpb25fY2xvc2Uoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbHApCiB7CiAJaW50IGk7CkBAIC02MTQsOSArNjE3LDkgQEAKIAogCQkvKiBTdG9wIHJlYWRpbmcvd3JpdGluZyB1cmJzICovCiAJCWZvciAoaSA9IDA7IGkgPCBOX0lOX1VSQjsgaSsrKQotCQkJc3RvcF91cmIocG9ydGRhdGEtPmluX3VyYnNbaV0pOworCQkJdXNiX2tpbGxfdXJiKHBvcnRkYXRhLT5pbl91cmJzW2ldKTsKIAkJZm9yIChpID0gMDsgaSA8IE5fT1VUX1VSQjsgaSsrKQotCQkJc3RvcF91cmIocG9ydGRhdGEtPm91dF91cmJzW2ldKTsKKwkJCXVzYl9raWxsX3VyYihwb3J0ZGF0YS0+b3V0X3VyYnNbaV0pOwogCX0KIAlwb3J0LT50dHkgPSBOVUxMOwogfQpAQCAtNzQ3LDkgKzc1MCw5IEBACiAJCXBvcnQgPSBzZXJpYWwtPnBvcnRbaV07CiAJCXBvcnRkYXRhID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCQlmb3IgKGogPSAwOyBqIDwgTl9JTl9VUkI7IGorKykKLQkJCXN0b3BfdXJiKHBvcnRkYXRhLT5pbl91cmJzW2pdKTsKKwkJCXVzYl9raWxsX3VyYihwb3J0ZGF0YS0+aW5fdXJic1tqXSk7CiAJCWZvciAoaiA9IDA7IGogPCBOX09VVF9VUkI7IGorKykKLQkJCXN0b3BfdXJiKHBvcnRkYXRhLT5vdXRfdXJic1tqXSk7CisJCQl1c2Jfa2lsbF91cmIocG9ydGRhdGEtPm91dF91cmJzW2pdKTsKIAl9CiAKIAkvKiBOb3cgZnJlZSB0aGVtICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvc2llcnJhLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvc2llcnJhLmMKaW5kZXggZWNlZGQ4My4uNjQ0NjA3ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL3NpZXJyYS5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9zaWVycmEuYwpAQCAtNDU2LDEyICs0NTYsNiBAQAogCXJldHVybiAoMCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBzdG9wX3VyYihzdHJ1Y3QgdXJiICp1cmIpCi17Ci0JaWYgKHVyYiAmJiB1cmItPnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpCi0JCXVzYl9raWxsX3VyYih1cmIpOwotfQotCiBzdGF0aWMgdm9pZCBzaWVycmFfY2xvc2Uoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbHApCiB7CiAJaW50IGk7CkBAIC00NzksOSArNDczLDkgQEAKIAogCQkvKiBTdG9wIHJlYWRpbmcvd3JpdGluZyB1cmJzICovCiAJCWZvciAoaSA9IDA7IGkgPCBOX0lOX1VSQjsgaSsrKQotCQkJc3RvcF91cmIocG9ydGRhdGEtPmluX3VyYnNbaV0pOworCQkJdXNiX3VubGlua191cmIocG9ydGRhdGEtPmluX3VyYnNbaV0pOwogCQlmb3IgKGkgPSAwOyBpIDwgTl9PVVRfVVJCOyBpKyspCi0JCQlzdG9wX3VyYihwb3J0ZGF0YS0+b3V0X3VyYnNbaV0pOworCQkJdXNiX3VubGlua191cmIocG9ydGRhdGEtPm91dF91cmJzW2ldKTsKIAl9CiAJcG9ydC0+dHR5ID0gTlVMTDsKIH0KQEAgLTU4MywxNyArNTc3LDI2IEBACiAJLyogU3RvcCByZWFkaW5nL3dyaXRpbmcgdXJicyAqLwogCWZvciAoaSA9IDA7IGkgPCBzZXJpYWwtPm51bV9wb3J0czsgKytpKSB7CiAJCXBvcnQgPSBzZXJpYWwtPnBvcnRbaV07CisJCWlmICghcG9ydCkKKwkJCWNvbnRpbnVlOwogCQlwb3J0ZGF0YSA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKKwkJaWYgKCFwb3J0ZGF0YSkKKwkJCWNvbnRpbnVlOworCiAJCWZvciAoaiA9IDA7IGogPCBOX0lOX1VSQjsgaisrKQotCQkJc3RvcF91cmIocG9ydGRhdGEtPmluX3VyYnNbal0pOworCQkJdXNiX3VubGlua191cmIocG9ydGRhdGEtPmluX3VyYnNbal0pOwogCQlmb3IgKGogPSAwOyBqIDwgTl9PVVRfVVJCOyBqKyspCi0JCQlzdG9wX3VyYihwb3J0ZGF0YS0+b3V0X3VyYnNbal0pOworCQkJdXNiX3VubGlua191cmIocG9ydGRhdGEtPm91dF91cmJzW2pdKTsKIAl9CiAKIAkvKiBOb3cgZnJlZSB0aGVtICovCiAJZm9yIChpID0gMDsgaSA8IHNlcmlhbC0+bnVtX3BvcnRzOyArK2kpIHsKIAkJcG9ydCA9IHNlcmlhbC0+cG9ydFtpXTsKKwkJaWYgKCFwb3J0KQorCQkJY29udGludWU7CiAJCXBvcnRkYXRhID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOworCQlpZiAoIXBvcnRkYXRhKQorCQkJY29udGludWU7CiAKIAkJZm9yIChqID0gMDsgaiA8IE5fSU5fVVJCOyBqKyspIHsKIAkJCWlmIChwb3J0ZGF0YS0+aW5fdXJic1tqXSkgewpAQCAtNjEyLDYgKzYxNSw4IEBACiAJLyogTm93IGZyZWUgcGVyIHBvcnQgcHJpdmF0ZSBkYXRhICovCiAJZm9yIChpID0gMDsgaSA8IHNlcmlhbC0+bnVtX3BvcnRzOyBpKyspIHsKIAkJcG9ydCA9IHNlcmlhbC0+cG9ydFtpXTsKKwkJaWYgKCFwb3J0KQorCQkJY29udGludWU7CiAJCWtmcmVlKHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KSk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL3Zpc29yLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvdmlzb3IuYwppbmRleCAyZjU5ZmYyLi5mZmJlNjAxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvdmlzb3IuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvdmlzb3IuYwpAQCAtMzg0LDE5ICszODQsMjEgQEAKIAkJZGJnKCIlcyAtIHdyaXRlIGxpbWl0IGhpdFxuIiwgX19GVU5DVElPTl9fKTsKIAkJcmV0dXJuIDA7CiAJfQorCXByaXYtPm91dHN0YW5kaW5nX3VyYnMrKzsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAKIAlidWZmZXIgPSBrbWFsbG9jIChjb3VudCwgR0ZQX0FUT01JQyk7CiAJaWYgKCFidWZmZXIpIHsKIAkJZGV2X2VycigmcG9ydC0+ZGV2LCAib3V0IG9mIG1lbW9yeVxuIik7Ci0JCXJldHVybiAtRU5PTUVNOworCQljb3VudCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3Jfbm9fYnVmZmVyOwogCX0KIAogCXVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0FUT01JQyk7CiAJaWYgKCF1cmIpIHsKIAkJZGV2X2VycigmcG9ydC0+ZGV2LCAibm8gbW9yZSBmcmVlIHVyYnNcbiIpOwotCQlrZnJlZSAoYnVmZmVyKTsKLQkJcmV0dXJuIC1FTk9NRU07CisJCWNvdW50ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9ub191cmI7CiAJfQogCiAJbWVtY3B5IChidWZmZXIsIGJ1ZiwgY291bnQpOwpAQCAtNDE1LDE5ICs0MTcsMjcgQEAKIAkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSB1c2Jfc3VibWl0X3VyYih3cml0ZSBidWxrKSBmYWlsZWQgd2l0aCBzdGF0dXMgPSAlZFxuIiwKIAkJCV9fRlVOQ1RJT05fXywgc3RhdHVzKTsKIAkJY291bnQgPSBzdGF0dXM7Ci0JCWtmcmVlIChidWZmZXIpOworCQlnb3RvIGVycm9yOwogCX0gZWxzZSB7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0JCSsrcHJpdi0+b3V0c3RhbmRpbmdfdXJiczsKIAkJcHJpdi0+Ynl0ZXNfb3V0ICs9IGNvdW50OwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAJfQogCiAJLyogd2UgYXJlIGRvbmUgd2l0aCB0aGlzIHVyYiwgc28gbGV0IHRoZSBob3N0IGRyaXZlcgogCSAqIHJlYWxseSBmcmVlIGl0IHdoZW4gaXQgaXMgZmluaXNoZWQgd2l0aCBpdCAqLwotCXVzYl9mcmVlX3VyYiAodXJiKTsKKwl1c2JfZnJlZV91cmIodXJiKTsKIAogCXJldHVybiBjb3VudDsKK2Vycm9yOgorCXVzYl9mcmVlX3VyYih1cmIpOworZXJyb3Jfbm9fdXJiOgorCWtmcmVlKGJ1ZmZlcik7CitlcnJvcl9ub19idWZmZXI6CisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwktLXByaXYtPm91dHN0YW5kaW5nX3VyYnM7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCXJldHVybiBjb3VudDsKIH0KIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvd2hpdGVoZWF0LmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvd2hpdGVoZWF0LmMKaW5kZXggYmYxNmU5ZS4uMjdjNWY4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL3doaXRlaGVhdC5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC93aGl0ZWhlYXQuYwpAQCAtMTEwOSw3ICsxMTA5LDcgQEAKIAljb21tYW5kX3BvcnQgPSBwb3J0LT5zZXJpYWwtPnBvcnRbQ09NTUFORF9QT1JUXTsKIAljb21tYW5kX2luZm8gPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEoY29tbWFuZF9wb3J0KTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY29tbWFuZF9pbmZvLT5sb2NrLCBmbGFncyk7Ci0JY29tbWFuZF9pbmZvLT5jb21tYW5kX2ZpbmlzaGVkID0gRkFMU0U7CisJY29tbWFuZF9pbmZvLT5jb21tYW5kX2ZpbmlzaGVkID0gZmFsc2U7CiAJCiAJdHJhbnNmZXJfYnVmZmVyID0gKF9fdTggKiljb21tYW5kX3BvcnQtPndyaXRlX3VyYi0+dHJhbnNmZXJfYnVmZmVyOwogCXRyYW5zZmVyX2J1ZmZlclswXSA9IGNvbW1hbmQ7CkBAIC0xMTI0LDEyICsxMTI0LDEyIEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29tbWFuZF9pbmZvLT5sb2NrLCBmbGFncyk7CiAKIAkvKiB3YWl0IGZvciB0aGUgY29tbWFuZCB0byBjb21wbGV0ZSAqLwotCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGNvbW1hbmRfaW5mby0+d2FpdF9jb21tYW5kLCAKLQkJKGNvbW1hbmRfaW5mby0+Y29tbWFuZF9maW5pc2hlZCAhPSBGQUxTRSksIENPTU1BTkRfVElNRU9VVCk7CisJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoY29tbWFuZF9pbmZvLT53YWl0X2NvbW1hbmQsCisJCShib29sKWNvbW1hbmRfaW5mby0+Y29tbWFuZF9maW5pc2hlZCwgQ09NTUFORF9USU1FT1VUKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZjb21tYW5kX2luZm8tPmxvY2ssIGZsYWdzKTsKIAotCWlmIChjb21tYW5kX2luZm8tPmNvbW1hbmRfZmluaXNoZWQgPT0gRkFMU0UpIHsKKwlpZiAoY29tbWFuZF9pbmZvLT5jb21tYW5kX2ZpbmlzaGVkID09IGZhbHNlKSB7CiAJCWRiZygiJXMgLSBjb21tYW5kIHRpbWVkIG91dC4iLCBfX0ZVTkNUSU9OX18pOwogCQlyZXR2YWwgPSAtRVRJTUVET1VUOwogCQlnb3RvIGV4aXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvd2hpdGVoZWF0LmggYi9kcml2ZXJzL3VzYi9zZXJpYWwvd2hpdGVoZWF0LmgKaW5kZXggZDcxNGVmZi4uZjE2MDc5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL3doaXRlaGVhdC5oCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC93aGl0ZWhlYXQuaApAQCAtMjAsMTAgKzIwLDYgQEAKICNkZWZpbmUgX19MSU5VWF9VU0JfU0VSSUFMX1dISVRFSEVBVF9ICiAKIAotI2RlZmluZSBGQUxTRQkwCi0jZGVmaW5lIFRSVUUJMQotCi0KIC8qIFdoaXRlSEVBVCBjb21tYW5kcyAqLwogI2RlZmluZSBXSElURUhFQVRfT1BFTgkJCTEJLyogb3BlbiB0aGUgcG9ydCAqLwogI2RlZmluZSBXSElURUhFQVRfQ0xPU0UJCQkyCS8qIGNsb3NlIHRoZSBwb3J0ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zdG9yYWdlL2xpYnVzdWFsLmMgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL2xpYnVzdWFsLmMKaW5kZXggNTk5YWQxMC4uMDZkMTEwNyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc3RvcmFnZS9saWJ1c3VhbC5jCisrKyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvbGlidXN1YWwuYwpAQCAtMTE3LDYgKzExNyw3IEBACiBzdGF0aWMgaW50IHVzdV9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKIAkJCSBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCiB7CisJaW50IHJjOwogCXVuc2lnbmVkIGxvbmcgdHlwZTsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QqIHRhc2s7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTEzNSw3ICsxMzYsNyBAQAogCiAJdGFzayA9IGt0aHJlYWRfcnVuKHVzdV9wcm9iZV90aHJlYWQsICh2b2lkKil0eXBlLCAibGlidXN1YWxfJWQiLCB0eXBlKTsKIAlpZiAoSVNfRVJSKHRhc2spKSB7Ci0JCWludCByYyA9IFBUUl9FUlIodGFzayk7CisJCXJjID0gUFRSX0VSUih0YXNrKTsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAibGlidXN1YWw6ICIKIAkJICAgICJVbmFibGUgdG8gc3RhcnQgdGhlIHRocmVhZCBmb3IgJXM6ICVkXG4iLAogCQkgICAgYmlhc19uYW1lc1t0eXBlXSwgcmMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc3RvcmFnZS91bnVzdWFsX2RldnMuaCBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdW51c3VhbF9kZXZzLmgKaW5kZXggNGE5ZDBkNS4uOGIzMTQ1YWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdW51c3VhbF9kZXZzLmgKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS91bnVzdWFsX2RldnMuaApAQCAtMTM3MSwxNSArMTM3MSw2IEBACiAJCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLCBOVUxMLAogCQlVU19GTF9JR05PUkVfUkVTSURVRSApLAogCi0vKiBUaGlzIHByZXZlbnRzIHRoZSBrZXJuZWwgZnJvbSBkZXRlY3RpbmcgdGhlIHZpcnR1YWwgY2QtZHJpdmUgd2l0aCB0aGUKLSAqIFdpbmRvd3MgZHJpdmVycy4gIDxqb2hhbm4ud2lsaGVsbUBzdHVkZW50LnR1Z3Jhei5hdD4KLSovCi1VTlVTVUFMX0RFViggMHgxMmQxLCAweDEwMDMsIDB4MDAwMCwgMHhmZmZmLAotCQkiSFVBV0VJIiwKLQkJIkUyMjAgVVNCLVVNVFMgSW5zdGFsbCIsCi0JCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLCBOVUxMLAotCQlVU19GTF9JR05PUkVfREVWSUNFKSwKLQogLyogUmVwb3J0ZWQgYnkgVmlsaXVzIEJpbGlua2V2aWNpdXMgPHZpbGlzYXMgQVQgeHh4IERPVCBsdCkgKi8KIFVOVVNVQUxfREVWKCAgMHgxMzJiLCAweDAwMGIsIDB4MDAwMSwgMHgwMDAxLAogCQkiTWlub2x0YSIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi91c2Itc2tlbGV0b24uYyBiL2RyaXZlcnMvdXNiL3VzYi1za2VsZXRvbi5jCmluZGV4IDQ2OTI5YTEuLjg0MzJiZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3VzYi1za2VsZXRvbi5jCisrKyBiL2RyaXZlcnMvdXNiL3VzYi1za2VsZXRvbi5jCkBAIC0zNCwxOCArMzQsMjUgQEAKIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgc2tlbF90YWJsZSk7CiAKKy8qIHRvIHByZXZlbnQgYSByYWNlIGJldHdlZW4gb3BlbiBhbmQgZGlzY29ubmVjdCAqLworc3RhdGljIERFRklORV9NVVRFWChza2VsX29wZW5fbG9jayk7CisKIAogLyogR2V0IGEgbWlub3IgcmFuZ2UgZm9yIHlvdXIgZGV2aWNlcyBmcm9tIHRoZSB1c2IgbWFpbnRhaW5lciAqLwogI2RlZmluZSBVU0JfU0tFTF9NSU5PUl9CQVNFCTE5MgogCiAvKiBvdXIgcHJpdmF0ZSBkZWZpbmVzLiBpZiB0aGlzIGdyb3dzIGFueSBsYXJnZXIsIHVzZSB5b3VyIG93biAuaCBmaWxlICovCiAjZGVmaW5lIE1BWF9UUkFOU0ZFUgkJKFBBR0VfU0laRSAtIDUxMikKKy8qIE1BWF9UUkFOU0ZFUiBpcyBjaG9zZW4gc28gdGhhdCB0aGUgVk0gaXMgbm90IHN0cmVzc2VkIGJ5CisgICBhbGxvY2F0aW9ucyA+IFBBR0VfU0laRSBhbmQgdGhlIG51bWJlciBvZiBwYWNrZXRzIGluIGEgcGFnZQorICAgaXMgYW4gaW50ZWdlciA1MTIgaXMgdGhlIGxhcmdlc3QgcG9zc2libGUgcGFja2V0IG9uIEVIQ0kgKi8KICNkZWZpbmUgV1JJVEVTX0lOX0ZMSUdIVAk4CisvKiBhcmJpdHJhcmlseSBjaG9zZW4gKi8KIAogLyogU3RydWN0dXJlIHRvIGhvbGQgYWxsIG9mIG91ciBkZXZpY2Ugc3BlY2lmaWMgc3R1ZmYgKi8KIHN0cnVjdCB1c2Jfc2tlbCB7Ci0Jc3RydWN0IHVzYl9kZXZpY2UgICAgICAgKmRldjsJCQkvKiB0aGUgdXNiIGRldmljZSBmb3IgdGhpcyBkZXZpY2UgKi8KLQlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAgICAqaW50ZXJmYWNlOwkJLyogdGhlIGludGVyZmFjZSBmb3IgdGhpcyBkZXZpY2UgKi8KKwlzdHJ1Y3QgdXNiX2RldmljZQkqdWRldjsJCQkvKiB0aGUgdXNiIGRldmljZSBmb3IgdGhpcyBkZXZpY2UgKi8KKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZQkqaW50ZXJmYWNlOwkJLyogdGhlIGludGVyZmFjZSBmb3IgdGhpcyBkZXZpY2UgKi8KIAlzdHJ1Y3Qgc2VtYXBob3JlCWxpbWl0X3NlbTsJCS8qIGxpbWl0aW5nIHRoZSBudW1iZXIgb2Ygd3JpdGVzIGluIHByb2dyZXNzICovCiAJdW5zaWduZWQgY2hhciAgICAgICAgICAgKmJ1bGtfaW5fYnVmZmVyOwkvKiB0aGUgYnVmZmVyIHRvIHJlY2VpdmUgZGF0YSAqLwogCXNpemVfdAkJCWJ1bGtfaW5fc2l6ZTsJCS8qIHRoZSBzaXplIG9mIHRoZSByZWNlaXZlIGJ1ZmZlciAqLwpAQCAtNzYsOCArODMsMTAgQEAKIAogCXN1Ym1pbm9yID0gaW1pbm9yKGlub2RlKTsKIAorCW11dGV4X2xvY2soJnNrZWxfb3Blbl9sb2NrKTsKIAlpbnRlcmZhY2UgPSB1c2JfZmluZF9pbnRlcmZhY2UoJnNrZWxfZHJpdmVyLCBzdWJtaW5vcik7CiAJaWYgKCFpbnRlcmZhY2UpIHsKKwkJbXV0ZXhfdW5sb2NrKCZza2VsX29wZW5fbG9jayk7CiAJCWVyciAoIiVzIC0gZXJyb3IsIGNhbid0IGZpbmQgZGV2aWNlIGZvciBtaW5vciAlZCIsCiAJCSAgICAgX19GVU5DVElPTl9fLCBzdWJtaW5vcik7CiAJCXJldHZhbCA9IC1FTk9ERVY7CkBAIC04NiwxMiArOTUsMTUgQEAKIAogCWRldiA9IHVzYl9nZXRfaW50ZmRhdGEoaW50ZXJmYWNlKTsKIAlpZiAoIWRldikgeworCQltdXRleF91bmxvY2soJnNrZWxfb3Blbl9sb2NrKTsKIAkJcmV0dmFsID0gLUVOT0RFVjsKIAkJZ290byBleGl0OwogCX0KIAogCS8qIGluY3JlbWVudCBvdXIgdXNhZ2UgY291bnQgZm9yIHRoZSBkZXZpY2UgKi8KIAlrcmVmX2dldCgmZGV2LT5rcmVmKTsKKwkvKiBub3cgd2UgY2FuIGRyb3AgdGhlIGxvY2sgKi8KKwltdXRleF91bmxvY2soJnNrZWxfb3Blbl9sb2NrKTsKIAogCS8qIHByZXZlbnQgdGhlIGRldmljZSBmcm9tIGJlaW5nIGF1dG9zdXNwZW5kZWQgKi8KIAlyZXR2YWwgPSB1c2JfYXV0b3BtX2dldF9pbnRlcmZhY2UoaW50ZXJmYWNlKTsKQEAgLTIwMSwxMiArMjEzLDYgQEAKIAkJZ290byBleGl0OwogCX0KIAotCW11dGV4X2xvY2soJmRldi0+aW9fbXV0ZXgpOwotCWlmICghZGV2LT5pbnRlcmZhY2UpIHsJCS8qIGRpc2Nvbm5lY3QoKSB3YXMgY2FsbGVkICovCi0JCXJldHZhbCA9IC1FTk9ERVY7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCiAJLyogY3JlYXRlIGEgdXJiLCBhbmQgYSBidWZmZXIgZm9yIGl0LCBhbmQgY29weSB0aGUgZGF0YSB0byB0aGUgdXJiICovCiAJdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXVyYikgewpAQCAtMjI1LDYgKzIzMSwxNCBAQAogCQlnb3RvIGVycm9yOwogCX0KIAorCS8qIHRoaXMgbG9jayBtYWtlcyBzdXJlIHdlIGRvbid0IHN1Ym1pdCBVUkJzIHRvIGdvbmUgZGV2aWNlcyAqLworCW11dGV4X2xvY2soJmRldi0+aW9fbXV0ZXgpOworCWlmICghZGV2LT5pbnRlcmZhY2UpIHsJCS8qIGRpc2Nvbm5lY3QoKSB3YXMgY2FsbGVkICovCisJCW11dGV4X3VubG9jaygmZGV2LT5pb19tdXRleCk7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gZXJyb3I7CisJfQorCiAJLyogaW5pdGlhbGl6ZSB0aGUgdXJiIHByb3Blcmx5ICovCiAJdXNiX2ZpbGxfYnVsa191cmIodXJiLCBkZXYtPnVkZXYsCiAJCQkgIHVzYl9zbmRidWxrcGlwZShkZXYtPnVkZXYsIGRldi0+YnVsa19vdXRfZW5kcG9pbnRBZGRyKSwKQEAgLTIzMyw2ICsyNDcsNyBAQAogCiAJLyogc2VuZCB0aGUgZGF0YSBvdXQgdGhlIGJ1bGsgcG9ydCAqLwogCXJldHZhbCA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0tFUk5FTCk7CisJbXV0ZXhfdW5sb2NrKCZkZXYtPmlvX211dGV4KTsKIAlpZiAocmV0dmFsKSB7CiAJCWVycigiJXMgLSBmYWlsZWQgc3VibWl0dGluZyB3cml0ZSB1cmIsIGVycm9yICVkIiwgX19GVU5DVElPTl9fLCByZXR2YWwpOwogCQlnb3RvIGVycm9yOwpAQCAtMjQxLDcgKzI1Niw3IEBACiAJLyogcmVsZWFzZSBvdXIgcmVmZXJlbmNlIHRvIHRoaXMgdXJiLCB0aGUgVVNCIGNvcmUgd2lsbCBldmVudHVhbGx5IGZyZWUgaXQgZW50aXJlbHkgKi8KIAl1c2JfZnJlZV91cmIodXJiKTsKIAotCW11dGV4X3VubG9jaygmZGV2LT5pb19tdXRleCk7CisKIAlyZXR1cm4gd3JpdGVzaXplOwogCiBlcnJvcjoKQEAgLTI0OSw3ICsyNjQsNiBAQAogCQl1c2JfYnVmZmVyX2ZyZWUoZGV2LT51ZGV2LCB3cml0ZXNpemUsIGJ1ZiwgdXJiLT50cmFuc2Zlcl9kbWEpOwogCQl1c2JfZnJlZV91cmIodXJiKTsKIAl9Ci0JbXV0ZXhfdW5sb2NrKCZkZXYtPmlvX211dGV4KTsKIAl1cCgmZGV2LT5saW1pdF9zZW0pOwogCiBleGl0OgpAQCAtMzQ0LDYgKzM1OCw3IEBACiAKIGVycm9yOgogCWlmIChkZXYpCisJCS8qIHRoaXMgZnJlZXMgYWxsb2NhdGVkIG1lbW9yeSAqLwogCQlrcmVmX3B1dCgmZGV2LT5rcmVmLCBza2VsX2RlbGV0ZSk7CiAJcmV0dXJuIHJldHZhbDsKIH0KQEAgLTM1NCwyMCArMzY5LDIxIEBACiAJaW50IG1pbm9yID0gaW50ZXJmYWNlLT5taW5vcjsKIAogCS8qIHByZXZlbnQgc2tlbF9vcGVuKCkgZnJvbSByYWNpbmcgc2tlbF9kaXNjb25uZWN0KCkgKi8KLQlsb2NrX2tlcm5lbCgpOworCW11dGV4X2xvY2soJnNrZWxfb3Blbl9sb2NrKTsKIAogCWRldiA9IHVzYl9nZXRfaW50ZmRhdGEoaW50ZXJmYWNlKTsKIAl1c2Jfc2V0X2ludGZkYXRhKGludGVyZmFjZSwgTlVMTCk7CiAKIAkvKiBnaXZlIGJhY2sgb3VyIG1pbm9yICovCiAJdXNiX2RlcmVnaXN0ZXJfZGV2KGludGVyZmFjZSwgJnNrZWxfY2xhc3MpOworCW11dGV4X3VubG9jaygmc2tlbF9vcGVuX2xvY2spOwogCiAJLyogcHJldmVudCBtb3JlIEkvTyBmcm9tIHN0YXJ0aW5nICovCiAJbXV0ZXhfbG9jaygmZGV2LT5pb19tdXRleCk7CiAJZGV2LT5pbnRlcmZhY2UgPSBOVUxMOwogCW11dGV4X3VubG9jaygmZGV2LT5pb19tdXRleCk7CiAKLQl1bmxvY2tfa2VybmVsKCk7CisKIAogCS8qIGRlY3JlbWVudCBvdXIgdXNhZ2UgY291bnQgKi8KIAlrcmVmX3B1dCgmZGV2LT5rcmVmLCBza2VsX2RlbGV0ZSk7CkBAIC0zODAsNiArMzk2LDcgQEAKIAkucHJvYmUgPQlza2VsX3Byb2JlLAogCS5kaXNjb25uZWN0ID0Jc2tlbF9kaXNjb25uZWN0LAogCS5pZF90YWJsZSA9CXNrZWxfdGFibGUsCisJLnN1cHBvcnRzX2F1dG9zdXNwZW5kID0gMSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IHVzYl9za2VsX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vS2NvbmZpZyBiL2RyaXZlcnMvdmlkZW8vS2NvbmZpZwppbmRleCA4MzcyYWNlLi5iMWNiNzJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL0tjb25maWcKKysrIGIvZHJpdmVycy92aWRlby9LY29uZmlnCkBAIC0zOTYsNyArMzk2LDcgQEAKIAogY29uZmlnIEZCX09GCiAJYm9vbCAiT3BlbiBGaXJtd2FyZSBmcmFtZSBidWZmZXIgZGV2aWNlIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiAoRkIgPSB5KSAmJiAoUFBDNjQgfHwgUFBDX09GKQorCWRlcGVuZHMgb24gKEZCID0geSkgJiYgKFBQQzY0IHx8IFBQQ19PRikgJiYgKCFQUENfUFNFUklFUyB8fCBQQ0kpCiAJc2VsZWN0IEZCX0NGQl9GSUxMUkVDVAogCXNlbGVjdCBGQl9DRkJfQ09QWUFSRUEKIAlzZWxlY3QgRkJfQ0ZCX0lNQUdFQkxJVApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9hdHkvYXR5ZmJfYmFzZS5jIGIvZHJpdmVycy92aWRlby9hdHkvYXR5ZmJfYmFzZS5jCmluZGV4IGQ3NjI3ZmMuLjg1MTRmMmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYXR5L2F0eWZiX2Jhc2UuYworKysgYi9kcml2ZXJzL3ZpZGVvL2F0eS9hdHlmYl9iYXNlLmMKQEAgLTI4OTksNyArMjg5OSw3IEBACiAJCQlzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgdW5zaWduZWQgbG9uZyBhZGRyKQogewogCXN0cnVjdCBhdHlmYl9wYXIgKnBhciA9IGluZm8tPnBhcjsKLQlzdHJ1Y3QgcGNpZGV2X2Nvb2tpZSAqcGNwOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHA7CiAJY2hhciBwcm9wWzEyOF07CiAJaW50IG5vZGUsIGxlbiwgaSwgaiwgcmV0OwogCXUzMiBtZW0sIGNoaXBfaWQ7CkBAIC0zMDM3LDggKzMwMzcsOCBAQAogCQkJbm9kZSA9IDA7CiAJfQogCi0JcGNwID0gcGRldi0+c3lzZGF0YTsKLQlpZiAobm9kZSA9PSBwY3AtPnByb21fbm9kZS0+bm9kZSkgeworCWRwID0gcGNpX2RldmljZV90b19PRl9ub2RlKHBkZXYpOworCWlmIChub2RlID09IGRwLT5ub2RlKSB7CiAJCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyID0gJmRlZmF1bHRfdmFyOwogCQl1bnNpZ25lZCBpbnQgTiwgUCwgUSwgTSwgVCwgUjsKIAkJdTMyIHZfdG90YWwsIGhfdG90YWw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2F0eS9yYWRlb25fYmFzZS5jIGIvZHJpdmVycy92aWRlby9hdHkvcmFkZW9uX2Jhc2UuYwppbmRleCAxYmY2ZjQyLi5hNGIzZmQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2F0eS9yYWRlb25fYmFzZS5jCisrKyBiL2RyaXZlcnMvdmlkZW8vYXR5L3JhZGVvbl9iYXNlLmMKQEAgLTQxMCw3ICs0MTAsNyBAQAogfQogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfUFBDX09GCisjaWYgZGVmaW5lZChDT05GSUdfUFBDX09GKSB8fCBkZWZpbmVkKENPTkZJR19TUEFSQykKIC8qCiAgKiBSZWFkIFhUQUwgKHJlZiBjbG9jayksIFNDTEsgYW5kIE1DTEsgZnJvbSBPcGVuIEZpcm13YXJlIGRldmljZQogICogdHJlZS4gSG9wZWZ1bGx5LCBBVEkgT0YgZHJpdmVyIGlzIGtpbmQgZW5vdWdoIHRvIGZpbGwgdGhlc2UKQEAgLTQ0MCw3ICs0NDAsNyBAQAogCiAgICAgICAgCXJldHVybiAwOwogfQotI2VuZGlmIC8qIENPTkZJR19QUENfT0YgKi8KKyNlbmRpZiAvKiBDT05GSUdfUFBDX09GIHx8IENPTkZJR19TUEFSQyAqLwogCiAvKgogICogUmVhZCBQTEwgaW5mb3MgZnJvbSBjaGlwIHJlZ2lzdGVycwpAQCAtNjQ1LDcgKzY0NSw3IEBACiAJcmluZm8tPnBsbC5yZWZfZGl2ID0gSU5QTEwoUFBMTF9SRUZfRElWKSAmIFBQTExfUkVGX0RJVl9NQVNLOwogCiAKLSNpZmRlZiBDT05GSUdfUFBDX09GCisjaWYgZGVmaW5lZChDT05GSUdfUFBDX09GKSB8fCBkZWZpbmVkKENPTkZJR19TUEFSQykKIAkvKgogCSAqIFJldHJpZXZlIFBMTCBpbmZvcyBmcm9tIE9wZW4gRmlybXdhcmUgZmlyc3QKIAkgKi8KQEAgLTY1Myw3ICs2NTMsNyBAQAogICAgICAgIAkJcHJpbnRrKEtFUk5fSU5GTyAicmFkZW9uZmI6IFJldHJpZXZlZCBQTEwgaW5mb3MgZnJvbSBPcGVuIEZpcm13YXJlXG4iKTsKIAkJZ290byBmb3VuZDsKIAl9Ci0jZW5kaWYgLyogQ09ORklHX1BQQ19PRiAqLworI2VuZGlmIC8qIENPTkZJR19QUENfT0YgfHwgQ09ORklHX1NQQVJDICovCiAKIAkvKgogCSAqIENoZWNrIG91dCBpZiB3ZSBoYXZlIGFuIFg4NiB3aGljaCBnYXZlIHVzIHNvbWUgUExMIGluZm9ybWF0aW9ucwpAQCAtMjIzMSw3ICsyMjMxLDcgQEAKIAkgICAgcmluZm8tPmZhbWlseSA9PSBDSElQX0ZBTUlMWV9SUzIwMCkKIAkJcmluZm8tPmVycmF0YSB8PSBDSElQX0VSUkFUQV9QTExfREVMQVk7CiAKLSNpZmRlZiBDT05GSUdfUFBDX09GCisjaWYgZGVmaW5lZChDT05GSUdfUFBDX09GKSB8fCBkZWZpbmVkKENPTkZJR19TUEFSQykKIAkvKiBPbiBQUEMsIHdlIG9idGFpbiB0aGUgT0YgZGV2aWNlLW5vZGUgcG9pbnRlciB0byB0aGUgZmlybXdhcmUKIAkgKiBkYXRhIGZvciB0aGlzIGNoaXAKIAkgKi8KQEAgLTIyNDAsNiArMjI0MCw4IEBACiAJCXByaW50ayhLRVJOX1dBUk5JTkcgInJhZGVvbmZiICglcyk6IENhbm5vdCBtYXRjaCBjYXJkIHRvIE9GIG5vZGUgIVxuIiwKIAkJICAgICAgIHBjaV9uYW1lKHJpbmZvLT5wZGV2KSk7CiAKKyNlbmRpZiAvKiBDT05GSUdfUFBDX09GIHx8IENPTkZJR19TUEFSQyAqLworI2lmZGVmIENPTkZJR19QUENfT0YKIAkvKiBPbiBQUEMsIHRoZSBmaXJtd2FyZSBzZXRzIHVwIGEgbWVtb3J5IG1hcHBpbmcgdGhhdCB0ZW5kcwogCSAqIHRvIGNhdXNlIGxvY2t1cHMgd2hlbiBlbmFibGluZyB0aGUgZW5naW5lLiBXZSByZWNvbmZpZ3VyZQogCSAqIHRoZSBjYXJkIGludGVybmFsIG1lbW9yeSBtYXBwaW5ncyBwcm9wZXJseQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9hdHkvcmFkZW9uX21vbml0b3IuYyBiL2RyaXZlcnMvdmlkZW8vYXR5L3JhZGVvbl9tb25pdG9yLmMKaW5kZXggMzhjN2RiZi4uNzM3YjVjMCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9hdHkvcmFkZW9uX21vbml0b3IuYworKysgYi9kcml2ZXJzL3ZpZGVvL2F0eS9yYWRlb25fbW9uaXRvci5jCkBAIC01Miw3ICs1Miw3IEBACiB9CiAKIAotI2lmZGVmIENPTkZJR19QUENfT0YKKyNpZiBkZWZpbmVkKENPTkZJR19QUENfT0YpIHx8IGRlZmluZWQoQ09ORklHX1NQQVJDKQogLyoKICAqIFRyeSB0byBmaW5kIG1vbml0b3IgaW5mb3JtYXRpb25zICYgRURJRCBkYXRhIG91dCBvZiB0aGUgT3BlbiBGaXJtd2FyZQogICogZGV2aWNlLXRyZWUuIFRoaXMgYWxzbyBjb250YWlucyBzb21lICJoYWNrcyIgdG8gd29yayBhcm91bmQgYSBmZXcgbWFjaGluZQpAQCAtMTU2LDcgKzE1Niw3IEBACiAJfQogICAgICAgICByZXR1cm4gTVRfTk9ORTsKIH0KLSNlbmRpZiAvKiBDT05GSUdfUFBDX09GICovCisjZW5kaWYgLyogQ09ORklHX1BQQ19PRiB8fCBDT05GSUdfU1BBUkMgKi8KIAogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCByYWRlb25fZ2V0X3BhbmVsX2luZm9fQklPUyhzdHJ1Y3QgcmFkZW9uZmJfaW5mbyAqcmluZm8pCkBAIC00OTUsMTEgKzQ5NSwxMSBAQAogCQkgKiBPbGQgc2luZ2xlIGhlYWQgY2FyZHMKIAkJICovCiAJCWlmICghcmluZm8tPmhhc19DUlRDMikgewotI2lmZGVmIENPTkZJR19QUENfT0YKKyNpZiBkZWZpbmVkKENPTkZJR19QUENfT0YpIHx8IGRlZmluZWQoQ09ORklHX1NQQVJDKQogCQkJaWYgKHJpbmZvLT5tb24xX3R5cGUgPT0gTVRfTk9ORSkKIAkJCQlyaW5mby0+bW9uMV90eXBlID0gcmFkZW9uX3Byb2JlX09GX2hlYWQocmluZm8sIDAsCiAJCQkJCQkJCQkmcmluZm8tPm1vbjFfRURJRCk7Ci0jZW5kaWYgLyogQ09ORklHX1BQQ19PRiAqLworI2VuZGlmIC8qIENPTkZJR19QUENfT0YgfHwgQ09ORklHX1NQQVJDICovCiAjaWZkZWYgQ09ORklHX0ZCX1JBREVPTl9JMkMKIAkJCWlmIChyaW5mby0+bW9uMV90eXBlID09IE1UX05PTkUpCiAJCQkJcmluZm8tPm1vbjFfdHlwZSA9CkBAIC01NDQsMTEgKzU0NCwxMSBAQAogCQkvKgogCQkgKiBQcm9iZSBwcmltYXJ5IGhlYWQgKERWSSBvciBsYXB0b3AgaW50ZXJuYWwgcGFuZWwpCiAJCSAqLwotI2lmZGVmIENPTkZJR19QUENfT0YKKyNpZiBkZWZpbmVkKENPTkZJR19QUENfT0YpIHx8IGRlZmluZWQoQ09ORklHX1NQQVJDKQogCQlpZiAocmluZm8tPm1vbjFfdHlwZSA9PSBNVF9OT05FKQogCQkJcmluZm8tPm1vbjFfdHlwZSA9IHJhZGVvbl9wcm9iZV9PRl9oZWFkKHJpbmZvLCAwLAogCQkJCQkJCQkmcmluZm8tPm1vbjFfRURJRCk7Ci0jZW5kaWYgLyogQ09ORklHX1BQQ19PRiAqLworI2VuZGlmIC8qIENPTkZJR19QUENfT0YgfHwgQ09ORklHX1NQQVJDICovCiAjaWZkZWYgQ09ORklHX0ZCX1JBREVPTl9JMkMKIAkJaWYgKHJpbmZvLT5tb24xX3R5cGUgPT0gTVRfTk9ORSkKIAkJCXJpbmZvLT5tb24xX3R5cGUgPSByYWRlb25fcHJvYmVfaTJjX2Nvbm5lY3RvcihyaW5mbywgZGRjX2R2aSwKQEAgLTU3MiwxMSArNTcyLDExIEBACiAJCS8qCiAJCSAqIFByb2JlIHNlY29uZGFyeSBoZWFkIChtb3N0bHkgVkdBLCBjYW4gYmUgRFZJKQogCQkgKi8KLSNpZmRlZiBDT05GSUdfUFBDX09GCisjaWYgZGVmaW5lZChDT05GSUdfUFBDX09GKSB8fCBkZWZpbmVkKENPTkZJR19TUEFSQykKIAkJaWYgKHJpbmZvLT5tb24yX3R5cGUgPT0gTVRfTk9ORSkKIAkJCXJpbmZvLT5tb24yX3R5cGUgPSByYWRlb25fcHJvYmVfT0ZfaGVhZChyaW5mbywgMSwKIAkJCQkJCQkJJnJpbmZvLT5tb24yX0VESUQpOwotI2VuZGlmIC8qIENPTkZJR19QUENfT0YgKi8KKyNlbmRpZiAvKiBDT05GSUdfUFBDX09GIHx8IGRlZmluZWQoQ09ORklHX1NQQVJDKSAqLwogI2lmZGVmIENPTkZJR19GQl9SQURFT05fSTJDCiAJCWlmIChyaW5mby0+bW9uMl90eXBlID09IE1UX05PTkUpCiAJCQlyaW5mby0+bW9uMl90eXBlID0gcmFkZW9uX3Byb2JlX2kyY19jb25uZWN0b3IocmluZm8sIGRkY192Z2EsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2F0eS9yYWRlb25fcG0uYyBiL2RyaXZlcnMvdmlkZW8vYXR5L3JhZGVvbl9wbS5jCmluZGV4IDlhMmIwZDYuLmM0MTEyOTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYXR5L3JhZGVvbl9wbS5jCisrKyBiL2RyaXZlcnMvdmlkZW8vYXR5L3JhZGVvbl9wbS5jCkBAIC0xMjYyLDcgKzEyNjIsNyBAQAogCS8qIFRoaXMgaXMgdGhlIGNvZGUgZm9yIHRoZSBBbHVtaW5pdW0gUG93ZXJCb29rcyBNMTAgLyBpQm9va3MgTTExICovCiAJaWYgKHJpbmZvLT5mYW1pbHkgPT0gQ0hJUF9GQU1JTFlfUlYzNTApIHsKIAkJdTMyIHNkcmFtX21vZGVfcmVnID0gcmluZm8tPnNhdmVfcmVnc1szNV07Ci0JCXN0YXRpYyB1MzIgZGVmYXVsdF9tcnRhYmxlW10gPQorCQlzdGF0aWMgY29uc3QgdTMyIGRlZmF1bHRfbXJ0YWJsZVtdID0KIAkJCXsgMHgyMTMyMDAzMiwKIAkJCSAgMHgyMTMyMTAwMCwgMHhhMTMyMTAwMCwgMHgyMTMyMTAwMCwgMHhmZmZmZmZmZiwKIAkJCSAgMHgyMTMyMDAzMiwgMHhhMTMyMDAzMiwgMHgyMTMyMDAzMiwgMHhmZmZmZmZmZiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYXR5L3JhZGVvbmZiLmggYi9kcml2ZXJzL3ZpZGVvL2F0eS9yYWRlb25mYi5oCmluZGV4IGQ1ZmYyMjQuLjMxOTAwMDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYXR5L3JhZGVvbmZiLmgKKysrIGIvZHJpdmVycy92aWRlby9hdHkvcmFkZW9uZmIuaApAQCAtMTYsNyArMTYsNyBAQAogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKLSNpZmRlZiBDT05GSUdfUFBDX09GCisjaWYgZGVmaW5lZChDT05GSUdfUFBDX09GKSB8fCBkZWZpbmVkKENPTkZJR19TUEFSQykKICNpbmNsdWRlIDxhc20vcHJvbS5oPgogI2VuZGlmCiAKQEAgLTI5Miw3ICsyOTIsNyBAQAogCXVuc2lnbmVkIGxvbmcJCWZiX2xvY2FsX2Jhc2U7CiAKIAlzdHJ1Y3QgcGNpX2RldgkJKnBkZXY7Ci0jaWZkZWYgQ09ORklHX1BQQ19PRgorI2lmIGRlZmluZWQoQ09ORklHX1BQQ19PRikgfHwgZGVmaW5lZChDT05GSUdfU1BBUkMpCiAJc3RydWN0IGRldmljZV9ub2RlCSpvZl9ub2RlOwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vY2czLmMgYi9kcml2ZXJzL3ZpZGVvL2NnMy5jCmluZGV4IDc2N2M4NTAuLmYwNDI0MjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vY2czLmMKKysrIGIvZHJpdmVycy92aWRlby9jZzMuYwpAQCAtMjY2LDcgKzI2Niw3IEBACiBzdGF0aWMgdm9pZCBfX2RldmluaXQgY2czX3JkaV9tYXliZV9maXh1cF92YXIoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCiAJCQkJCSAgICAgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHApCiB7Ci0JY2hhciAqcGFyYW1zOworCWNvbnN0IGNoYXIgKnBhcmFtczsKIAljaGFyICpwOwogCWludCB3dywgaGg7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vY29udHJvbGZiLmMgYi9kcml2ZXJzL3ZpZGVvL2NvbnRyb2xmYi5jCmluZGV4IGZkNjBkYmEuLjhiNzYyNzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vY29udHJvbGZiLmMKKysrIGIvZHJpdmVycy92aWRlby9jb250cm9sZmIuYwpAQCAtMTc5LDEyICsxNzksMTQgQEAKIGludCBpbml0X21vZHVsZSh2b2lkKQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHA7CisJaW50IHJldCA9IC1FTlhJTzsKIAotCWRwID0gZmluZF9kZXZpY2VzKCJjb250cm9sIik7CisJZHAgPSBvZl9maW5kX25vZGVfYnlfbmFtZShOVUxMLCAiY29udHJvbCIpOwogCWlmIChkcCAhPSAwICYmICFjb250cm9sX29mX2luaXQoZHApKQotCQlyZXR1cm4gMDsKKwkJcmV0ID0gMDsKKwlvZl9ub2RlX3B1dChkcCk7CiAKLQlyZXR1cm4gLUVOWElPOworCXJldHVybiByZXQ7CiB9CiAKIHZvaWQgY2xlYW51cF9tb2R1bGUodm9pZCkKQEAgLTU4OSwxNiArNTkxLDE4IEBACiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpkcDsKIAljaGFyICpvcHRpb24gPSBOVUxMOworCWludCByZXQgPSAtRU5YSU87CiAKIAlpZiAoZmJfZ2V0X29wdGlvbnMoImNvbnRyb2xmYiIsICZvcHRpb24pKQogCQlyZXR1cm4gLUVOT0RFVjsKIAljb250cm9sX3NldHVwKG9wdGlvbik7CiAKLQlkcCA9IGZpbmRfZGV2aWNlcygiY29udHJvbCIpOworCWRwID0gb2ZfZmluZF9ub2RlX2J5X25hbWUoTlVMTCwgImNvbnRyb2wiKTsKIAlpZiAoZHAgIT0gMCAmJiAhY29udHJvbF9vZl9pbml0KGRwKSkKLQkJcmV0dXJuIDA7CisJCXJldCA9IDA7CisJb2Zfbm9kZV9wdXQoZHApOwogCi0JcmV0dXJuIC1FTlhJTzsKKwlyZXR1cm4gcmV0OwogfQogCiBtb2R1bGVfaW5pdChjb250cm9sX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9pZ2FmYi5jIGIvZHJpdmVycy92aWRlby9pZ2FmYi5jCmluZGV4IDkwNTkyZmIuLmViMWE0ODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vaWdhZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL2lnYWZiLmMKQEAgLTQ0LDggKzQ0LDggQEAKIAogI2luY2x1ZGUgPGFzbS9pby5oPgogCi0jaWZkZWYgX19zcGFyY19fCi0jaW5jbHVkZSA8YXNtL3BibS5oPgorI2lmZGVmIENPTkZJR19TUEFSQworI2luY2x1ZGUgPGFzbS9wcm9tLmg+CiAjaW5jbHVkZSA8YXNtL3BjaWMuaD4KICNlbmRpZgogCkBAIC05Niw3ICs5Niw3IEBACiAJLnZtb2RlCQk9IEZCX1ZNT0RFX05PTklOVEVSTEFDRUQKIH07CiAKLSNpZmRlZiBfX3NwYXJjX18KKyNpZmRlZiBDT05GSUdfU1BBUkMKIHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyBkZWZhdWx0X3Zhcl8xMDI0eDc2OCBfX2luaXRkYXRhID0gewogCS8qIDEwMjR4NzY4LCA3NSBIeiwgTm9uLUludGVybGFjZWQgKDc4Ljc1IE1IeiBkb3RjbG9jaykgKi8KIAkueHJlcwkJPSAxMDI0LApAQCAtMTg4LDcgKzE4OCw3IEBACiAgICAgICAgIHBjaV9vdXRiKHBhciwgdmFsLCByZWcrMSk7CiB9CiAKLSNlbmRpZiAvKiBfX3NwYXJjX18gKi8KKyNlbmRpZiAvKiBDT05GSUdfU1BBUkMgKi8KIAogLyoKICAqICBWZXJ5IGltcG9ydGFudCBmdW5jdGlvbmFsaXR5IGZvciB0aGUgSmF2YUVuZ2luZTEgY29tcHV0ZXI6CkBAIC0yMTcsNyArMjE3LDcgQEAKIAkJaWdhX291dGIocGFyLCAwLCBJR0FfRVhUX0NOVFJMLCBJR0FfSURYX09WRVJTQ0FOX0NPTE9SICsgaSk7CiB9CiAKLSNpZmRlZiBfX3NwYXJjX18KKyNpZmRlZiBDT05GSUdfU1BBUkMKIHN0YXRpYyBpbnQgaWdhZmJfbW1hcChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywKIAkJICAgICAgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiB7CkBAIC0yNzEsNyArMjcxLDcgQEAKIAl2bWEtPnZtX2ZsYWdzIHw9IFZNX0lPOwogCXJldHVybiAwOwogfQotI2VuZGlmIC8qIF9fc3BhcmNfXyAqLworI2VuZGlmIC8qIENPTkZJR19TUEFSQyAqLwogCiBzdGF0aWMgaW50IGlnYWZiX3NldGNvbHJlZyh1bnNpZ25lZCByZWdubywgdW5zaWduZWQgcmVkLCB1bnNpZ25lZCBncmVlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGJsdWUsIHVuc2lnbmVkIHRyYW5zcCwKQEAgLTMyMyw3ICszMjMsNyBAQAogCS5mYl9maWxscmVjdAk9IGNmYl9maWxscmVjdCwKIAkuZmJfY29weWFyZWEJPSBjZmJfY29weWFyZWEsCiAJLmZiX2ltYWdlYmxpdAk9IGNmYl9pbWFnZWJsaXQsCi0jaWZkZWYgX19zcGFyY19fCisjaWZkZWYgQ09ORklHX1NQQVJDCiAJLmZiX21tYXAgCT0gaWdhZmJfbW1hcCwKICNlbmRpZgogfTsKQEAgLTQyNCw3ICs0MjQsNyBAQAogCiAJcGFyLT5mcmFtZV9idWZmZXJfcGh5cyA9IGFkZHIgJiBQQ0lfQkFTRV9BRERSRVNTX01FTV9NQVNLOwogCi0jaWZkZWYgX19zcGFyY19fCisjaWZkZWYgQ09ORklHX1NQQVJDCiAJLyoKIAkgKiBUaGUgZm9sbG93aW5nIGlzIHNwYXJjIHNwZWNpZmljIGFuZCB0aGlzIGlzIHdoeToKIAkgKgpAQCAtNDc3LDggKzQ3Nyw4IEBACiAJICogU2V0IGRlZmF1bHQgdm1vZGUgYW5kIGNtb2RlIGZyb20gUFJPTSBwcm9wZXJ0aWVzLgogCSAqLwogCXsKLSAgICAgICAgICAgICAgICBzdHJ1Y3QgcGNpZGV2X2Nvb2tpZSAqY29va2llID0gcGRldi0+c3lzZGF0YTsKLSAgICAgICAgICAgICAgICBpbnQgbm9kZSA9IGNvb2tpZS0+cHJvbV9ub2RlOworCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwID0gcGNpX2RldmljZV90b19PRl9ub2RlKHBkZXYpOworICAgICAgICAgICAgICAgIGludCBub2RlID0gZHAtPm5vZGU7CiAgICAgICAgICAgICAgICAgaW50IHdpZHRoID0gcHJvbV9nZXRpbnRkZWZhdWx0KG5vZGUsICJ3aWR0aCIsIDEwMjQpOwogICAgICAgICAgICAgICAgIGludCBoZWlnaHQgPSBwcm9tX2dldGludGRlZmF1bHQobm9kZSwgImhlaWdodCIsIDc2OCk7CiAgICAgICAgICAgICAgICAgaW50IGRlcHRoID0gcHJvbV9nZXRpbnRkZWZhdWx0KG5vZGUsICJkZXB0aCIsIDgpOwpAQCAtNTM0LDcgKzUzNCw3IEBACiAJCWtmcmVlKGluZm8pOwogICAgICAgICB9CiAKLSNpZmRlZiBfX3NwYXJjX18KKyNpZmRlZiBDT05GSUdfU1BBUkMKIAkgICAgLyoKIAkgICAgICogQWRkIC9kZXYvZmIgbW1hcCB2YWx1ZXMuCiAJICAgICAqLwpAQCAtNTUyLDcgKzU1Miw3IEBACiAJICAgIHBhci0+bW1hcF9tYXBbMV0uc2l6ZSA9IFBBR0VfU0laRSAqIDI7IC8qIFggd2FudHMgMiBwYWdlcyAqLwogCSAgICBwYXItPm1tYXBfbWFwWzFdLnByb3RfbWFzayA9IFNSTU1VX0NBQ0hFOwogCSAgICBwYXItPm1tYXBfbWFwWzFdLnByb3RfZmxhZyA9IFNSTU1VX1dSSVRFOwotI2VuZGlmIC8qIF9fc3BhcmNfXyAqLworI2VuZGlmIC8qIENPTkZJR19TUEFSQyAqLwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9mcy9LY29uZmlnIGIvZnMvS2NvbmZpZwppbmRleCAzYzQ4ODZiLi5hNDJmNzY3IDEwMDY0NAotLS0gYS9mcy9LY29uZmlnCisrKyBiL2ZzL0tjb25maWcKQEAgLTIwMTksNyArMjAxOSw4IEBACiBjb25maWcgQUZTX0ZTCiAJdHJpc3RhdGUgIkFuZHJldyBGaWxlIFN5c3RlbSBzdXBwb3J0IChBRlMpIChFWFBFUklNRU5UQUwpIgogCWRlcGVuZHMgb24gSU5FVCAmJiBFWFBFUklNRU5UQUwKLQlzZWxlY3QgUlhSUEMKKwlzZWxlY3QgQUZfUlhSUEMKKwlzZWxlY3QgS0VZUwogCWhlbHAKIAkgIElmIHlvdSBzYXkgWSBoZXJlLCB5b3Ugd2lsbCBnZXQgYW4gZXhwZXJpbWVudGFsIEFuZHJldyBGaWxlIFN5c3RlbQogCSAgZHJpdmVyLiBJdCBjdXJyZW50bHkgb25seSBzdXBwb3J0cyB1bnNlY3VyZWQgcmVhZC1vbmx5IEFGUyBhY2Nlc3MuCkBAIC0yMDI4LDggKzIwMjksMTUgQEAKIAogCSAgSWYgdW5zdXJlLCBzYXkgTi4KIAotY29uZmlnIFJYUlBDCi0JdHJpc3RhdGUKK2NvbmZpZyBBRlNfREVCVUcKKwlib29sICJBRlMgZHluYW1pYyBkZWJ1Z2dpbmciCisJZGVwZW5kcyBvbiBBRlNfRlMKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIG1ha2UgcnVudGltZSBjb250cm9sbGFibGUgZGVidWdnaW5nIG1lc3NhZ2VzIGFwcGVhci4KKworCSAgU2VlIDxmaWxlOkRvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvYWZzLnR4dD4gZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCiAKIGNvbmZpZyA5UF9GUwogCXRyaXN0YXRlICJQbGFuIDkgUmVzb3VyY2UgU2hhcmluZyBTdXBwb3J0ICg5UDIwMDApIChFeHBlcmltZW50YWwpIgpkaWZmIC0tZ2l0IGEvZnMvYWZzL01ha2VmaWxlIGIvZnMvYWZzL01ha2VmaWxlCmluZGV4IDQwMjljOWQuLjAxNTQ1ZWIgMTAwNjQ0Ci0tLSBhL2ZzL2Fmcy9NYWtlZmlsZQorKysgYi9mcy9hZnMvTWFrZWZpbGUKQEAgLTIsOCArMiw2IEBACiAjIE1ha2VmaWxlIGZvciBSZWQgSGF0IExpbnV4IEFGUyBjbGllbnQuCiAjCiAKLSNDRkxBR1MgKz0gLWZpbnN0cnVtZW50LWZ1bmN0aW9ucwotCiBrYWZzLW9ianMgOj0gXAogCWNhbGxiYWNrLm8gXAogCWNlbGwubyBcCkBAIC0xMiwxNCArMTAsMTUgQEAKIAlmaWxlLm8gXAogCWZzY2xpZW50Lm8gXAogCWlub2RlLm8gXAotCWthZnNhc3luY2QubyBcCi0Ja2Fmc3RpbW9kLm8gXAogCW1haW4ubyBcCiAJbWlzYy5vIFwKIAltbnRwdC5vIFwKIAlwcm9jLm8gXAorCXJ4cnBjLm8gXAorCXNlY3VyaXR5Lm8gXAogCXNlcnZlci5vIFwKIAlzdXBlci5vIFwKKwl1c2UtcnRuZXRsaW5rLm8gXAogCXZsY2xpZW50Lm8gXAogCXZsb2NhdGlvbi5vIFwKIAl2bm9kZS5vIFwKZGlmZiAtLWdpdCBhL2ZzL2Fmcy9hZnMuaCBiL2ZzL2Fmcy9hZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmQwNzUyCi0tLSAvZGV2L251bGwKKysrIGIvZnMvYWZzL2Fmcy5oCkBAIC0wLDAgKzEsMTQ2IEBACisvKiBBRlMgY29tbW9uIHR5cGVzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgQUZTX0gKKyNkZWZpbmUgQUZTX0gKKworI2luY2x1ZGUgPGxpbnV4L2luLmg+CisKKyNkZWZpbmUgQUZTX01BWENFTExOQU1FCTY0CQkvKiBtYXhpbXVtIGxlbmd0aCBvZiBhIGNlbGwgbmFtZSAqLworI2RlZmluZSBBRlNfTUFYVk9MTkFNRQk2NAkJLyogbWF4aW11bSBsZW5ndGggb2YgYSB2b2x1bWUgbmFtZSAqLworCit0eXBlZGVmIHVuc2lnbmVkCQkJYWZzX3ZvbGlkX3Q7Cit0eXBlZGVmIHVuc2lnbmVkCQkJYWZzX3Zub2RlaWRfdDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nCQlhZnNfZGF0YXZlcnNpb25fdDsKKwordHlwZWRlZiBlbnVtIHsKKwlBRlNWTF9SV1ZPTCwJCQkvKiByZWFkL3dyaXRlIHZvbHVtZSAqLworCUFGU1ZMX1JPVk9MLAkJCS8qIHJlYWQtb25seSB2b2x1bWUgKi8KKwlBRlNWTF9CQUNLVk9MLAkJCS8qIGJhY2t1cCB2b2x1bWUgKi8KK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgYWZzX3ZvbHR5cGVfdDsKKwordHlwZWRlZiBlbnVtIHsKKwlBRlNfRlRZUEVfSU5WQUxJRAk9IDAsCisJQUZTX0ZUWVBFX0ZJTEUJCT0gMSwKKwlBRlNfRlRZUEVfRElSCQk9IDIsCisJQUZTX0ZUWVBFX1NZTUxJTksJPSAzLAorfSBhZnNfZmlsZV90eXBlX3Q7CisKKy8qCisgKiBBRlMgZmlsZSBpZGVudGlmaWVyCisgKi8KK3N0cnVjdCBhZnNfZmlkIHsKKwlhZnNfdm9saWRfdAl2aWQ7CQkvKiB2b2x1bWUgSUQgKi8KKwlhZnNfdm5vZGVpZF90CXZub2RlOwkJLyogZmlsZSBpbmRleCB3aXRoaW4gdm9sdW1lICovCisJdW5zaWduZWQJdW5pcXVlOwkJLyogdW5pcXVlIElEIG51bWJlciAoZmlsZSBpbmRleCB2ZXJzaW9uKSAqLworfTsKKworLyoKKyAqIEFGUyBjYWxsYmFjayBub3RpZmljYXRpb24KKyAqLwordHlwZWRlZiBlbnVtIHsKKwlBRlNDTV9DQl9VTlRZUEVECT0gMCwJLyogbm8gdHlwZSBzZXQgb24gQ0IgYnJlYWsgKi8KKwlBRlNDTV9DQl9FWENMVVNJVkUJPSAxLAkvKiBDQiBleGNsdXNpdmUgdG8gQ00gW25vdCBpbXBsZW1lbnRlZF0gKi8KKwlBRlNDTV9DQl9TSEFSRUQJCT0gMiwJLyogQ0Igc2hhcmVkIGJ5IG90aGVyIENNJ3MgKi8KKwlBRlNDTV9DQl9EUk9QUEVECT0gMywJLyogQ0IgcHJvbWlzZSBjYW5jZWxsZWQgYnkgZmlsZSBzZXJ2ZXIgKi8KK30gYWZzX2NhbGxiYWNrX3R5cGVfdDsKKworc3RydWN0IGFmc19jYWxsYmFjayB7CisJc3RydWN0IGFmc19maWQJCWZpZDsJCS8qIGZpbGUgaWRlbnRpZmllciAqLworCXVuc2lnbmVkCQl2ZXJzaW9uOwkvKiBjYWxsYmFjayB2ZXJzaW9uICovCisJdW5zaWduZWQJCWV4cGlyeTsJCS8qIHRpbWUgYXQgd2hpY2ggZXhwaXJlcyAqLworCWFmc19jYWxsYmFja190eXBlX3QJdHlwZTsJCS8qIHR5cGUgb2YgY2FsbGJhY2sgKi8KK307CisKKyNkZWZpbmUgQUZTQ0JNQVggNTAJLyogbWF4aW11bSBjYWxsYmFja3MgdHJhbnNmZXJyZWQgcGVyIGJ1bGsgb3AgKi8KKworLyoKKyAqIEFGUyB2b2x1bWUgaW5mb3JtYXRpb24KKyAqLworc3RydWN0IGFmc192b2x1bWVfaW5mbyB7CisJYWZzX3ZvbGlkX3QJCXZpZDsJCS8qIHZvbHVtZSBJRCAqLworCWFmc192b2x0eXBlX3QJCXR5cGU7CQkvKiB0eXBlIG9mIHRoaXMgdm9sdW1lICovCisJYWZzX3ZvbGlkX3QJCXR5cGVfdmlkc1s1XTsJLyogdm9sdW1lIElEJ3MgZm9yIHBvc3NpYmxlIHR5cGVzIGZvciB0aGlzIHZvbCAqLworCisJLyogbGlzdCBvZiBmaWxlc2VydmVycyBzZXJ2aW5nIHRoaXMgdm9sdW1lICovCisJc2l6ZV90CQkJbnNlcnZlcnM7CS8qIG51bWJlciBvZiBlbnRyaWVzIHVzZWQgaW4gc2VydmVyc1tdICovCisJc3RydWN0IHsKKwkJc3RydWN0IGluX2FkZHIJYWRkcjsJCS8qIGZpbGVzZXJ2ZXIgYWRkcmVzcyAqLworCX0gc2VydmVyc1s4XTsKK307CisKKy8qCisgKiBBRlMgc2VjdXJpdHkgQUNFIGFjY2VzcyBtYXNrCisgKi8KK3R5cGVkZWYgdTMyIGFmc19hY2Nlc3NfdDsKKyNkZWZpbmUgQUZTX0FDRV9SRUFECQkweDAwMDAwMDAxVQkvKiAtIHBlcm1pc3Npb24gdG8gcmVhZCBhIGZpbGUvZGlyICovCisjZGVmaW5lIEFGU19BQ0VfV1JJVEUJCTB4MDAwMDAwMDJVCS8qIC0gcGVybWlzc2lvbiB0byB3cml0ZS9jaG1vZCBhIGZpbGUgKi8KKyNkZWZpbmUgQUZTX0FDRV9JTlNFUlQJCTB4MDAwMDAwMDRVCS8qIC0gcGVybWlzc2lvbiB0byBjcmVhdGUgZGlyZW50IGluIGEgZGlyICovCisjZGVmaW5lIEFGU19BQ0VfTE9PS1VQCQkweDAwMDAwMDA4VQkvKiAtIHBlcm1pc3Npb24gdG8gbG9va3VwIGEgZmlsZS9kaXIgaW4gYSBkaXIgKi8KKyNkZWZpbmUgQUZTX0FDRV9ERUxFVEUJCTB4MDAwMDAwMTBVCS8qIC0gcGVybWlzc2lvbiB0byBkZWxldGUgYSBkaXJlbnQgZnJvbSBhIGRpciAqLworI2RlZmluZSBBRlNfQUNFX0xPQ0sJCTB4MDAwMDAwMjBVCS8qIC0gcGVybWlzc2lvbiB0byBsb2NrIGEgZmlsZSAqLworI2RlZmluZSBBRlNfQUNFX0FETUlOSVNURVIJMHgwMDAwMDA0MFUJLyogLSBwZXJtaXNzaW9uIHRvIGNoYW5nZSBBQ0wgKi8KKyNkZWZpbmUgQUZTX0FDRV9VU0VSX0EJCTB4MDEwMDAwMDBVCS8qIC0gJ0EnIHVzZXItZGVmaW5lZCBwZXJtaXNzaW9uICovCisjZGVmaW5lIEFGU19BQ0VfVVNFUl9CCQkweDAyMDAwMDAwVQkvKiAtICdCJyB1c2VyLWRlZmluZWQgcGVybWlzc2lvbiAqLworI2RlZmluZSBBRlNfQUNFX1VTRVJfQwkJMHgwNDAwMDAwMFUJLyogLSAnQycgdXNlci1kZWZpbmVkIHBlcm1pc3Npb24gKi8KKyNkZWZpbmUgQUZTX0FDRV9VU0VSX0QJCTB4MDgwMDAwMDBVCS8qIC0gJ0QnIHVzZXItZGVmaW5lZCBwZXJtaXNzaW9uICovCisjZGVmaW5lIEFGU19BQ0VfVVNFUl9FCQkweDEwMDAwMDAwVQkvKiAtICdFJyB1c2VyLWRlZmluZWQgcGVybWlzc2lvbiAqLworI2RlZmluZSBBRlNfQUNFX1VTRVJfRgkJMHgyMDAwMDAwMFUJLyogLSAnRicgdXNlci1kZWZpbmVkIHBlcm1pc3Npb24gKi8KKyNkZWZpbmUgQUZTX0FDRV9VU0VSX0cJCTB4NDAwMDAwMDBVCS8qIC0gJ0cnIHVzZXItZGVmaW5lZCBwZXJtaXNzaW9uICovCisjZGVmaW5lIEFGU19BQ0VfVVNFUl9ICQkweDgwMDAwMDAwVQkvKiAtICdIJyB1c2VyLWRlZmluZWQgcGVybWlzc2lvbiAqLworCisvKgorICogQUZTIGZpbGUgc3RhdHVzIGluZm9ybWF0aW9uCisgKi8KK3N0cnVjdCBhZnNfZmlsZV9zdGF0dXMgeworCXVuc2lnbmVkCQlpZl92ZXJzaW9uOwkvKiBpbnRlcmZhY2UgdmVyc2lvbiAqLworI2RlZmluZSBBRlNfRlNUQVRVU19WRVJTSU9OCTEKKworCWFmc19maWxlX3R5cGVfdAkJdHlwZTsJCS8qIGZpbGUgdHlwZSAqLworCXVuc2lnbmVkCQlubGluazsJCS8qIGxpbmsgY291bnQgKi8KKwl1NjQJCQlzaXplOwkJLyogZmlsZSBzaXplICovCisJYWZzX2RhdGF2ZXJzaW9uX3QJZGF0YV92ZXJzaW9uOwkvKiBjdXJyZW50IGRhdGEgdmVyc2lvbiAqLworCXUzMgkJCWF1dGhvcjsJCS8qIGF1dGhvciBJRCAqLworCXUzMgkJCW93bmVyOwkJLyogb3duZXIgSUQgKi8KKwl1MzIJCQlncm91cDsJCS8qIGdyb3VwIElEICovCisJYWZzX2FjY2Vzc190CQljYWxsZXJfYWNjZXNzOwkvKiBhY2Nlc3MgcmlnaHRzIGZvciBhdXRoZW50aWNhdGVkIGNhbGxlciAqLworCWFmc19hY2Nlc3NfdAkJYW5vbl9hY2Nlc3M7CS8qIGFjY2VzcyByaWdodHMgZm9yIHVuYXV0aGVudGljYXRlZCBjYWxsZXIgKi8KKwl1bW9kZV90CQkJbW9kZTsJCS8qIFVOSVggbW9kZSAqLworCXN0cnVjdCBhZnNfZmlkCQlwYXJlbnQ7CQkvKiBwYXJlbnQgZGlyIElEIGZvciBub24tZGlycyBvbmx5ICovCisJdGltZV90CQkJbXRpbWVfY2xpZW50OwkvKiBsYXN0IHRpbWUgY2xpZW50IGNoYW5nZWQgZGF0YSAqLworCXRpbWVfdAkJCW10aW1lX3NlcnZlcjsJLyogbGFzdCB0aW1lIHNlcnZlciBjaGFuZ2VkIGRhdGEgKi8KK307CisKKy8qCisgKiBBRlMgZmlsZSBzdGF0dXMgY2hhbmdlIHJlcXVlc3QKKyAqLworc3RydWN0IGFmc19zdG9yZV9zdGF0dXMgeworCXUzMgkJCW1hc2s7CQkvKiB3aGljaCBiaXRzIG9mIHRoZSBzdHJ1Y3QgYXJlIHNldCAqLworCXUzMgkJCW10aW1lX2NsaWVudDsJLyogbGFzdCB0aW1lIGNsaWVudCBjaGFuZ2VkIGRhdGEgKi8KKwl1MzIJCQlvd25lcjsJCS8qIG93bmVyIElEICovCisJdTMyCQkJZ3JvdXA7CQkvKiBncm91cCBJRCAqLworCXVtb2RlX3QJCQltb2RlOwkJLyogVU5JWCBtb2RlICovCit9OworCisjZGVmaW5lIEFGU19TRVRfTVRJTUUJCTB4MDEJCS8qIHNldCB0aGUgbXRpbWUgKi8KKyNkZWZpbmUgQUZTX1NFVF9PV05FUgkJMHgwMgkJLyogc2V0IHRoZSBvd25lciBJRCAqLworI2RlZmluZSBBRlNfU0VUX0dST1VQCQkweDA0CQkvKiBzZXQgdGhlIGdyb3VwIElEICh1bnN1cHBvcnRlZD8pICovCisjZGVmaW5lIEFGU19TRVRfTU9ERQkJMHgwOAkJLyogc2V0IHRoZSBVTklYIG1vZGUgKi8KKyNkZWZpbmUgQUZTX1NFVF9TRUdfU0laRQkweDEwCQkvKiBzZXQgdGhlIHNlZ21lbnQgc2l6ZSAodW5zdXBwb3J0ZWQpICovCisKKy8qCisgKiBBRlMgdm9sdW1lIHN5bmNocm9uaXNhdGlvbiBpbmZvcm1hdGlvbgorICovCitzdHJ1Y3QgYWZzX3ZvbHN5bmMgeworCXRpbWVfdAkJCWNyZWF0aW9uOwkvKiB2b2x1bWUgY3JlYXRpb24gdGltZSAqLworfTsKKworI2VuZGlmIC8qIEFGU19IICovCmRpZmYgLS1naXQgYS9mcy9hZnMvYWZzX2NtLmggYi9mcy9hZnMvYWZzX2NtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I0ZDRmYQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2Fmcy9hZnNfY20uaApAQCAtMCwwICsxLDMyIEBACisvKiBBRlMgQ2FjaGUgTWFuYWdlciBkZWZpbml0aW9ucworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIEFGU19DTV9ICisjZGVmaW5lIEFGU19DTV9ICisKKyNkZWZpbmUgQUZTX0NNX1BPUlQJCTcwMDEJLyogQUZTIGZpbGUgc2VydmVyIHBvcnQgKi8KKyNkZWZpbmUgQ01fU0VSVklDRQkJMQkvKiBBRlMgRmlsZSBTZXJ2aWNlIElEICovCisKK2VudW0gQUZTX0NNX09wZXJhdGlvbnMgeworCUNCQ2FsbEJhY2sJCT0gMjA0LAkvKiBicmVhayBjYWxsYmFjayBwcm9taXNlcyAqLworCUNCSW5pdENhbGxCYWNrU3RhdGUJPSAyMDUsCS8qIGluaXRpYWxpc2UgY2FsbGJhY2sgc3RhdGUgKi8KKwlDQlByb2JlCQkJPSAyMDYsCS8qIHByb2JlIGNsaWVudCAqLworCUNCR2V0TG9jawkJPSAyMDcsCS8qIGdldCBjb250ZW50cyBvZiBDTSBsb2NrIHRhYmxlICovCisJQ0JHZXRDRQkJCT0gMjA4LAkvKiBnZXQgY2FjaGUgZmlsZSBkZXNjcmlwdGlvbiAqLworCUNCR2V0WFN0YXRzVmVyc2lvbgk9IDIwOSwJLyogZ2V0IHZlcnNpb24gb2YgZXh0ZW5kZWQgc3RhdGlzdGljcyAqLworCUNCR2V0WFN0YXRzCQk9IDIxMCwJLyogZ2V0IGNvbnRlbnRzIG9mIGV4dGVuZGVkIHN0YXRpc3RpY3MgZGF0YSAqLworCUNCSW5pdENhbGxCYWNrU3RhdGUzCT0gMjEzLAkvKiBpbml0aWFsaXNlIGNhbGxiYWNrIHN0YXRlLCB2ZXJzaW9uIDMgKi8KKwlDQkdldENhcGFiaWxpdGllcwk9IDY1NTM4LCAvKiBnZXQgY2xpZW50IGNhcGFiaWxpdGllcyAqLworfTsKKworI2RlZmluZSBBRlNfQ0FQX0VSUk9SX1RSQU5TTEFUSU9OCTB4MQorCisjZW5kaWYgLyogQUZTX0ZTX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL2Fmcy9hZnNfZnMuaCBiL2ZzL2Fmcy9hZnNfZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWUwZDE2Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvYWZzL2Fmc19mcy5oCkBAIC0wLDAgKzEsNDggQEAKKy8qIEFGUyBGaWxlIFNlcnZpY2UgZGVmaW5pdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBBRlNfRlNfSAorI2RlZmluZSBBRlNfRlNfSAorCisjZGVmaW5lIEFGU19GU19QT1JUCQk3MDAwCS8qIEFGUyBmaWxlIHNlcnZlciBwb3J0ICovCisjZGVmaW5lIEZTX1NFUlZJQ0UJCTEJLyogQUZTIEZpbGUgU2VydmljZSBJRCAqLworCitlbnVtIEFGU19GU19PcGVyYXRpb25zIHsKKwlGU0ZFVENIREFUQQkJPSAxMzAsCS8qIEFGUyBGZXRjaCBmaWxlIGRhdGEgKi8KKwlGU0ZFVENIU1RBVFVTCQk9IDEzMiwJLyogQUZTIEZldGNoIGZpbGUgc3RhdHVzICovCisJRlNSRU1PVkVGSUxFCQk9IDEzNiwJLyogQUZTIFJlbW92ZSBhIGZpbGUgKi8KKwlGU0NSRUFURUZJTEUJCT0gMTM3LAkvKiBBRlMgQ3JlYXRlIGEgZmlsZSAqLworCUZTUkVOQU1FCQk9IDEzOCwJLyogQUZTIFJlbmFtZSBvciBtb3ZlIGEgZmlsZSBvciBkaXJlY3RvcnkgKi8KKwlGU1NZTUxJTksJCT0gMTM5LAkvKiBBRlMgQ3JlYXRlIGEgc3ltYm9saWMgbGluayAqLworCUZTTElOSwkJCT0gMTQwLAkvKiBBRlMgQ3JlYXRlIGEgaGFyZCBsaW5rICovCisJRlNNQUtFRElSCQk9IDE0MSwJLyogQUZTIENyZWF0ZSBhIGRpcmVjdG9yeSAqLworCUZTUkVNT1ZFRElSCQk9IDE0MiwJLyogQUZTIFJlbW92ZSBhIGRpcmVjdG9yeSAqLworCUZTR0lWRVVQQ0FMTEJBQ0tTCT0gMTQ3LAkvKiBBRlMgRGlzY2FyZCBjYWxsYmFjayBwcm9taXNlcyAqLworCUZTR0VUVk9MVU1FSU5GTwkJPSAxNDgsCS8qIEFGUyBHZXQgcm9vdCB2b2x1bWUgaW5mb3JtYXRpb24gKi8KKwlGU0dFVFJPT1RWT0xVTUUJCT0gMTUxLAkvKiBBRlMgR2V0IHJvb3Qgdm9sdW1lIG5hbWUgKi8KKwlGU0xPT0tVUAkJPSAxNjEsCS8qIEFGUyBsb29rdXAgZmlsZSBpbiBkaXJlY3RvcnkgKi8KK307CisKK2VudW0gQUZTX0ZTX0Vycm9ycyB7CisJVlNBTFZBR0UJPSAxMDEsCS8qIHZvbHVtZSBuZWVkcyBzYWx2YWdpbmcgKi8KKwlWTk9WTk9ERQk9IDEwMiwJLyogbm8gc3VjaCBmaWxlL2RpciAodm5vZGUpICovCisJVk5PVk9MCQk9IDEwMywJLyogbm8gc3VjaCB2b2x1bWUgb3Igdm9sdW1lIHVuYXZhaWxhYmxlICovCisJVlZPTEVYSVNUUwk9IDEwNCwJLyogdm9sdW1lIG5hbWUgYWxyZWFkeSBleGlzdHMgKi8KKwlWTk9TRVJWSUNFCT0gMTA1LAkvKiB2b2x1bWUgbm90IGN1cnJlbnRseSBpbiBzZXJ2aWNlICovCisJVk9GRkxJTkUJPSAxMDYsCS8qIHZvbHVtZSBpcyBjdXJyZW50bHkgb2ZmbGluZSAobW9yZSBpbmZvIGF2YWlsYWJsZSBbVlZMLXNwZWNdKSAqLworCVZPTkxJTkUJCT0gMTA3LAkvKiB2b2x1bWUgaXMgYWxyZWFkeSBvbmxpbmUgKi8KKwlWRElTS0ZVTEwJPSAxMDgsCS8qIGRpc2sgcGFydGl0aW9uIGlzIGZ1bGwgKi8KKwlWT1ZFUlFVT1RBCT0gMTA5LAkvKiB2b2x1bWUncyBtYXhpbXVtIHF1b3RhIGV4Y2VlZGVkICovCisJVkJVU1kJCT0gMTEwLAkvKiB2b2x1bWUgaXMgdGVtcG9yYXJpbHkgdW5hdmFpbGFibGUgKi8KKwlWTU9WRUQJCT0gMTExLAkvKiB2b2x1bWUgbW92ZWQgdG8gbmV3IHNlcnZlciAtIGFzayB0aGlzIEZTIHdoZXJlICovCit9OworCisjZW5kaWYgLyogQUZTX0ZTX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL2Fmcy92bGNsaWVudC5oIGIvZnMvYWZzL2Fmc192bC5oCnNpbWlsYXJpdHkgaW5kZXggNzQlCnJlbmFtZSBmcm9tIGZzL2Fmcy92bGNsaWVudC5oCnJlbmFtZSB0byBmcy9hZnMvYWZzX3ZsLmgKaW5kZXggZTNkNjAxMS4uOGJiZWZlMCAxMDA2NDQKLS0tIGEvZnMvYWZzL3ZsY2xpZW50LmgKKysrIGIvZnMvYWZzL2Fmc192bC5oCkBAIC0xLDYgKzEsNiBAQAotLyogdmxjbGllbnQuaDogVm9sdW1lIExvY2F0aW9uIFNlcnZpY2UgY2xpZW50IGludGVyZmFjZQorLyogQUZTIFZvbHVtZSBMb2NhdGlvbiBTZXJ2aWNlIGNsaWVudCBpbnRlcmZhY2UKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCkBAIC05LDEwICs5LDE5IEBACiAgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICovCiAKLSNpZm5kZWYgX0xJTlVYX0FGU19WTENMSUVOVF9ICi0jZGVmaW5lIF9MSU5VWF9BRlNfVkxDTElFTlRfSAorI2lmbmRlZiBBRlNfVkxfSAorI2RlZmluZSBBRlNfVkxfSAogCi0jaW5jbHVkZSAidHlwZXMuaCIKKyNpbmNsdWRlICJhZnMuaCIKKworI2RlZmluZSBBRlNfVkxfUE9SVAkJNzAwMwkvKiB2b2x1bWUgbG9jYXRpb24gc2VydmljZSBwb3J0ICovCisjZGVmaW5lIFZMX1NFUlZJQ0UJCTUyCS8qIFJ4UlBDIHNlcnZpY2UgSUQgZm9yIHRoZSBWb2x1bWUgTG9jYXRpb24gc2VydmljZSAqLworCitlbnVtIEFGU1ZMX09wZXJhdGlvbnMgeworCVZMR0VURU5UUllCWUlECQk9IDUwMywJLyogQUZTIEdldCBDYWNoZSBFbnRyeSBCeSBJRCBvcGVyYXRpb24gSUQgKi8KKwlWTEdFVEVOVFJZQllOQU1FCT0gNTA0LAkvKiBBRlMgR2V0IENhY2hlIEVudHJ5IEJ5IE5hbWUgb3BlcmF0aW9uIElEICovCisJVkxQUk9CRQkJCT0gNTE0LAkvKiBBRlMgUHJvYmUgVm9sdW1lIExvY2F0aW9uIFNlcnZpY2Ugb3BlcmF0aW9uIElEICovCit9OwogCiBlbnVtIEFGU1ZMX0Vycm9ycyB7CiAJQUZTVkxfSURFWElTVCAJCT0gMzYzNTIwLAkvKiBWb2x1bWUgSWQgZW50cnkgZXhpc3RzIGluIHZsIGRhdGFiYXNlICovCkBAIC00MCwxNCArNDksMTYgQEAKIAlBRlNWTF9CQURWT0xPUEVSIAk9IDM2MzU0MiwJLyogQmFkIHZvbHVtZSBvcGVyYXRpb24gY29kZSAqLwogCUFGU1ZMX0JBRFJFTExPQ0tUWVBFIAk9IDM2MzU0MywJLyogQmFkIHJlbGVhc2UgbG9jayB0eXBlICovCiAJQUZTVkxfUkVSRUxFQVNFIAk9IDM2MzU0NCwJLyogU3RhdHVzIHJlcG9ydDogbGFzdCByZWxlYXNlIHdhcyBhYm9ydGVkICovCi0JQUZTVkxfQkFEU0VSVkVSRkxBRyAJPSAzNjM1NDUsCS8qIEludmFsaWQgcmVwbGljYXRpb24gc2l0ZSBzZXJ2ZXIgsGFnICovCisJQUZTVkxfQkFEU0VSVkVSRkxBRyAJPSAzNjM1NDUsCS8qIEludmFsaWQgcmVwbGljYXRpb24gc2l0ZSBzZXJ2ZXIgwrBhZyAqLwogCUFGU1ZMX1BFUk0gCQk9IDM2MzU0NiwJLyogTm8gcGVybWlzc2lvbiBhY2Nlc3MgKi8KIAlBRlNWTF9OT01FTSAJCT0gMzYzNTQ3LAkvKiBtYWxsb2MvcmVhbGxvYyBmYWlsZWQgdG8gYWxsb2MgZW5vdWdoIG1lbW9yeSAqLwogfTsKIAotLyogbWFwcyB0byAic3RydWN0IHZsZGJlbnRyeSIgaW4gdnZsLXNwZWMucGRmICovCisvKgorICogbWFwcyB0byAic3RydWN0IHZsZGJlbnRyeSIgaW4gdnZsLXNwZWMucGRmCisgKi8KIHN0cnVjdCBhZnNfdmxkYmVudHJ5IHsKLQljaGFyCQluYW1lWzY1XTsJCS8qIG5hbWUgb2Ygdm9sdW1lIChpbmNsdWRpbmcgTlVMIGNoYXIpICovCisJY2hhcgkJbmFtZVs2NV07CQkvKiBuYW1lIG9mIHZvbHVtZSAod2l0aCBOVUwgY2hhcikgKi8KIAlhZnNfdm9sdHlwZV90CXR5cGU7CQkJLyogdm9sdW1lIHR5cGUgKi8KIAl1bnNpZ25lZAludW1fc2VydmVyczsJCS8qIG51bSBzZXJ2ZXJzIHRoYXQgaG9sZCBpbnN0YW5jZXMgb2YgdGhpcyB2b2wgKi8KIAl1bnNpZ25lZAljbG9uZV9pZDsJCS8qIGNsb25pbmcgSUQgKi8KQEAgLTY4LDI2ICs3OSw2IEBACiAjZGVmaW5lIEFGU19WTFNGX1JXVk9MCQkweDAwMDQJLyogdGhpcyBzZXJ2ZXIgaG9sZHMgYSBSL1cgaW5zdGFuY2Ugb2YgdGhlIHZvbHVtZSAqLwogI2RlZmluZSBBRlNfVkxTRl9CQUNLVk9MCTB4MDAwOAkvKiB0aGlzIHNlcnZlciBob2xkcyBhIGJhY2t1cCBpbnN0YW5jZSBvZiB0aGUgdm9sdW1lICovCiAJfSBzZXJ2ZXJzWzhdOwotCiB9OwogCi0vKiBsb29rIHVwIGEgdm9sdW1lIGxvY2F0aW9uIGRhdGFiYXNlIGVudHJ5IGJ5IG5hbWUgKi8KLWV4dGVybiBpbnQgYWZzX3J4dmxfZ2V0X2VudHJ5X2J5X25hbWUoc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlciwKLQkJCQkgICAgICBjb25zdCBjaGFyICp2b2xuYW1lLAotCQkJCSAgICAgIHVuc2lnbmVkIHZvbG5hbWVzeiwKLQkJCQkgICAgICBzdHJ1Y3QgYWZzX2NhY2hlX3Zsb2NhdGlvbiAqZW50cnkpOwotCi0vKiBsb29rIHVwIGEgdm9sdW1lIGxvY2F0aW9uIGRhdGFiYXNlIGVudHJ5IGJ5IElEICovCi1leHRlcm4gaW50IGFmc19yeHZsX2dldF9lbnRyeV9ieV9pZChzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyLAotCQkJCSAgICBhZnNfdm9saWRfdAl2b2xpZCwKLQkJCQkgICAgYWZzX3ZvbHR5cGVfdCB2b2x0eXBlLAotCQkJCSAgICBzdHJ1Y3QgYWZzX2NhY2hlX3Zsb2NhdGlvbiAqZW50cnkpOwotCi1leHRlcm4gaW50IGFmc19yeHZsX2dldF9lbnRyeV9ieV9pZF9hc3luYyhzdHJ1Y3QgYWZzX2FzeW5jX29wICpvcCwKLQkJCQkJICBhZnNfdm9saWRfdCB2b2xpZCwKLQkJCQkJICBhZnNfdm9sdHlwZV90IHZvbHR5cGUpOwotCi1leHRlcm4gaW50IGFmc19yeHZsX2dldF9lbnRyeV9ieV9pZF9hc3luYzIoc3RydWN0IGFmc19hc3luY19vcCAqb3AsCi0JCQkJCSAgIHN0cnVjdCBhZnNfY2FjaGVfdmxvY2F0aW9uICplbnRyeSk7Ci0KLSNlbmRpZiAvKiBfTElOVVhfQUZTX1ZMQ0xJRU5UX0ggKi8KKyNlbmRpZiAvKiBBRlNfVkxfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvYWZzL2NhY2hlLmMgYi9mcy9hZnMvY2FjaGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTBkN2RlCi0tLSAvZGV2L251bGwKKysrIGIvZnMvYWZzL2NhY2hlLmMKQEAgLTAsMCArMSwyNTYgQEAKKy8qIEFGUyBjYWNoaW5nIHN0dWZmCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZmRlZiBBRlNfQ0FDSElOR19TVVBQT1JUCitzdGF0aWMgY2FjaGVmc19tYXRjaF92YWxfdCBhZnNfY2VsbF9jYWNoZV9tYXRjaCh2b2lkICp0YXJnZXQsCisJCQkJCQljb25zdCB2b2lkICplbnRyeSk7CitzdGF0aWMgdm9pZCBhZnNfY2VsbF9jYWNoZV91cGRhdGUodm9pZCAqc291cmNlLCB2b2lkICplbnRyeSk7CisKK3N0cnVjdCBjYWNoZWZzX2luZGV4X2RlZiBhZnNfY2FjaGVfY2VsbF9pbmRleF9kZWYgPSB7CisJLm5hbWUJCQk9ICJjZWxsX2l4IiwKKwkuZGF0YV9zaXplCQk9IHNpemVvZihzdHJ1Y3QgYWZzX2NhY2hlX2NlbGwpLAorCS5rZXlzWzBdCQk9IHsgQ0FDSEVGU19JTkRFWF9LRVlTX0FTQ0lJWiwgNjQgfSwKKwkubWF0Y2gJCQk9IGFmc19jZWxsX2NhY2hlX21hdGNoLAorCS51cGRhdGUJCQk9IGFmc19jZWxsX2NhY2hlX3VwZGF0ZSwKK307CisjZW5kaWYKKworLyoKKyAqIG1hdGNoIGEgY2VsbCByZWNvcmQgb2J0YWluZWQgZnJvbSB0aGUgY2FjaGUKKyAqLworI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKK3N0YXRpYyBjYWNoZWZzX21hdGNoX3ZhbF90IGFmc19jZWxsX2NhY2hlX21hdGNoKHZvaWQgKnRhcmdldCwKKwkJCQkJCWNvbnN0IHZvaWQgKmVudHJ5KQoreworCWNvbnN0IHN0cnVjdCBhZnNfY2FjaGVfY2VsbCAqY2NlbGwgPSBlbnRyeTsKKwlzdHJ1Y3QgYWZzX2NlbGwgKmNlbGwgPSB0YXJnZXQ7CisKKwlfZW50ZXIoInslc30seyVzfSIsIGNjZWxsLT5uYW1lLCBjZWxsLT5uYW1lKTsKKworCWlmIChzdHJuY21wKGNjZWxsLT5uYW1lLCBjZWxsLT5uYW1lLCBzaXplb2YoY2NlbGwtPm5hbWUpKSA9PSAwKSB7CisJCV9sZWF2ZSgiID0gU1VDQ0VTUyIpOworCQlyZXR1cm4gQ0FDSEVGU19NQVRDSF9TVUNDRVNTOworCX0KKworCV9sZWF2ZSgiID0gRkFJTEVEIik7CisJcmV0dXJuIENBQ0hFRlNfTUFUQ0hfRkFJTEVEOworfQorI2VuZGlmCisKKy8qCisgKiB1cGRhdGUgYSBjZWxsIHJlY29yZCBpbiB0aGUgY2FjaGUKKyAqLworI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKK3N0YXRpYyB2b2lkIGFmc19jZWxsX2NhY2hlX3VwZGF0ZSh2b2lkICpzb3VyY2UsIHZvaWQgKmVudHJ5KQoreworCXN0cnVjdCBhZnNfY2FjaGVfY2VsbCAqY2NlbGwgPSBlbnRyeTsKKwlzdHJ1Y3QgYWZzX2NlbGwgKmNlbGwgPSBzb3VyY2U7CisKKwlfZW50ZXIoIiVwLCVwIiwgc291cmNlLCBlbnRyeSk7CisKKwlzdHJuY3B5KGNjZWxsLT5uYW1lLCBjZWxsLT5uYW1lLCBzaXplb2YoY2NlbGwtPm5hbWUpKTsKKworCW1lbWNweShjY2VsbC0+dmxfc2VydmVycywKKwkgICAgICAgY2VsbC0+dmxfYWRkcnMsCisJICAgICAgIG1pbihzaXplb2YoY2NlbGwtPnZsX3NlcnZlcnMpLCBzaXplb2YoY2VsbC0+dmxfYWRkcnMpKSk7CisKK30KKyNlbmRpZgorCisjaWZkZWYgQUZTX0NBQ0hJTkdfU1VQUE9SVAorc3RhdGljIGNhY2hlZnNfbWF0Y2hfdmFsX3QgYWZzX3Zsb2NhdGlvbl9jYWNoZV9tYXRjaCh2b2lkICp0YXJnZXQsCisJCQkJCQkgICAgIGNvbnN0IHZvaWQgKmVudHJ5KTsKK3N0YXRpYyB2b2lkIGFmc192bG9jYXRpb25fY2FjaGVfdXBkYXRlKHZvaWQgKnNvdXJjZSwgdm9pZCAqZW50cnkpOworCitzdHJ1Y3QgY2FjaGVmc19pbmRleF9kZWYgYWZzX3Zsb2NhdGlvbl9jYWNoZV9pbmRleF9kZWYgPSB7CisJLm5hbWUJCT0gInZsZGIiLAorCS5kYXRhX3NpemUJPSBzaXplb2Yoc3RydWN0IGFmc19jYWNoZV92bG9jYXRpb24pLAorCS5rZXlzWzBdCT0geyBDQUNIRUZTX0lOREVYX0tFWVNfQVNDSUlaLCA2NCB9LAorCS5tYXRjaAkJPSBhZnNfdmxvY2F0aW9uX2NhY2hlX21hdGNoLAorCS51cGRhdGUJCT0gYWZzX3Zsb2NhdGlvbl9jYWNoZV91cGRhdGUsCit9OworI2VuZGlmCisKKy8qCisgKiBtYXRjaCBhIFZMREIgcmVjb3JkIHN0b3JlZCBpbiB0aGUgY2FjaGUKKyAqIC0gbWF5IGFsc28gbG9hZCB0YXJnZXQgZnJvbSBlbnRyeQorICovCisjaWZkZWYgQUZTX0NBQ0hJTkdfU1VQUE9SVAorc3RhdGljIGNhY2hlZnNfbWF0Y2hfdmFsX3QgYWZzX3Zsb2NhdGlvbl9jYWNoZV9tYXRjaCh2b2lkICp0YXJnZXQsCisJCQkJCQkgICAgIGNvbnN0IHZvaWQgKmVudHJ5KQoreworCWNvbnN0IHN0cnVjdCBhZnNfY2FjaGVfdmxvY2F0aW9uICp2bGRiID0gZW50cnk7CisJc3RydWN0IGFmc192bG9jYXRpb24gKnZsb2NhdGlvbiA9IHRhcmdldDsKKworCV9lbnRlcigieyVzfSx7JXN9IiwgdmxvY2F0aW9uLT52bGRiLm5hbWUsIHZsZGItPm5hbWUpOworCisJaWYgKHN0cm5jbXAodmxvY2F0aW9uLT52bGRiLm5hbWUsIHZsZGItPm5hbWUsIHNpemVvZih2bGRiLT5uYW1lKSkgPT0gMAorCSAgICApIHsKKwkJaWYgKCF2bG9jYXRpb24tPnZhbGlkIHx8CisJCSAgICB2bG9jYXRpb24tPnZsZGIucnRpbWUgPT0gdmxkYi0+cnRpbWUKKwkJICAgICkgeworCQkJdmxvY2F0aW9uLT52bGRiID0gKnZsZGI7CisJCQl2bG9jYXRpb24tPnZhbGlkID0gMTsKKwkJCV9sZWF2ZSgiID0gU1VDQ0VTUyBbYy0+bV0iKTsKKwkJCXJldHVybiBDQUNIRUZTX01BVENIX1NVQ0NFU1M7CisJCX0gZWxzZSBpZiAobWVtY21wKCZ2bG9jYXRpb24tPnZsZGIsIHZsZGIsIHNpemVvZigqdmxkYikpICE9IDApIHsKKwkJCS8qIGRlbGV0ZSBpZiBWSURzIGZvciB0aGlzIG5hbWUgZGlmZmVyICovCisJCQlpZiAobWVtY21wKCZ2bG9jYXRpb24tPnZsZGIudmlkLAorCQkJCSAgICZ2bGRiLT52aWQsCisJCQkJICAgc2l6ZW9mKHZsZGItPnZpZCkpICE9IDApIHsKKwkJCQlfbGVhdmUoIiA9IERFTEVURSIpOworCQkJCXJldHVybiBDQUNIRUZTX01BVENIX1NVQ0NFU1NfREVMRVRFOworCQkJfQorCisJCQlfbGVhdmUoIiA9IFVQREFURSIpOworCQkJcmV0dXJuIENBQ0hFRlNfTUFUQ0hfU1VDQ0VTU19VUERBVEU7CisJCX0gZWxzZSB7CisJCQlfbGVhdmUoIiA9IFNVQ0NFU1MiKTsKKwkJCXJldHVybiBDQUNIRUZTX01BVENIX1NVQ0NFU1M7CisJCX0KKwl9CisKKwlfbGVhdmUoIiA9IEZBSUxFRCIpOworCXJldHVybiBDQUNIRUZTX01BVENIX0ZBSUxFRDsKK30KKyNlbmRpZgorCisvKgorICogdXBkYXRlIGEgVkxEQiByZWNvcmQgc3RvcmVkIGluIHRoZSBjYWNoZQorICovCisjaWZkZWYgQUZTX0NBQ0hJTkdfU1VQUE9SVAorc3RhdGljIHZvaWQgYWZzX3Zsb2NhdGlvbl9jYWNoZV91cGRhdGUodm9pZCAqc291cmNlLCB2b2lkICplbnRyeSkKK3sKKwlzdHJ1Y3QgYWZzX2NhY2hlX3Zsb2NhdGlvbiAqdmxkYiA9IGVudHJ5OworCXN0cnVjdCBhZnNfdmxvY2F0aW9uICp2bG9jYXRpb24gPSBzb3VyY2U7CisKKwlfZW50ZXIoIiIpOworCisJKnZsZGIgPSB2bG9jYXRpb24tPnZsZGI7Cit9CisjZW5kaWYKKworI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKK3N0YXRpYyBjYWNoZWZzX21hdGNoX3ZhbF90IGFmc192b2x1bWVfY2FjaGVfbWF0Y2godm9pZCAqdGFyZ2V0LAorCQkJCQkJICBjb25zdCB2b2lkICplbnRyeSk7CitzdGF0aWMgdm9pZCBhZnNfdm9sdW1lX2NhY2hlX3VwZGF0ZSh2b2lkICpzb3VyY2UsIHZvaWQgKmVudHJ5KTsKKworc3RydWN0IGNhY2hlZnNfaW5kZXhfZGVmIGFmc192b2x1bWVfY2FjaGVfaW5kZXhfZGVmID0geworCS5uYW1lCQk9ICJ2b2x1bWUiLAorCS5kYXRhX3NpemUJPSBzaXplb2Yoc3RydWN0IGFmc19jYWNoZV92aGFzaCksCisJLmtleXNbMF0JPSB7IENBQ0hFRlNfSU5ERVhfS0VZU19CSU4sIDEgfSwKKwkua2V5c1sxXQk9IHsgQ0FDSEVGU19JTkRFWF9LRVlTX0JJTiwgMSB9LAorCS5tYXRjaAkJPSBhZnNfdm9sdW1lX2NhY2hlX21hdGNoLAorCS51cGRhdGUJCT0gYWZzX3ZvbHVtZV9jYWNoZV91cGRhdGUsCit9OworI2VuZGlmCisKKy8qCisgKiBtYXRjaCBhIHZvbHVtZSBoYXNoIHJlY29yZCBzdG9yZWQgaW4gdGhlIGNhY2hlCisgKi8KKyNpZmRlZiBBRlNfQ0FDSElOR19TVVBQT1JUCitzdGF0aWMgY2FjaGVmc19tYXRjaF92YWxfdCBhZnNfdm9sdW1lX2NhY2hlX21hdGNoKHZvaWQgKnRhcmdldCwKKwkJCQkJCSAgY29uc3Qgdm9pZCAqZW50cnkpCit7CisJY29uc3Qgc3RydWN0IGFmc19jYWNoZV92aGFzaCAqdmhhc2ggPSBlbnRyeTsKKwlzdHJ1Y3QgYWZzX3ZvbHVtZSAqdm9sdW1lID0gdGFyZ2V0OworCisJX2VudGVyKCJ7JXV9LHsldX0iLCB2b2x1bWUtPnR5cGUsIHZoYXNoLT52dHlwZSk7CisKKwlpZiAodm9sdW1lLT50eXBlID09IHZoYXNoLT52dHlwZSkgeworCQlfbGVhdmUoIiA9IFNVQ0NFU1MiKTsKKwkJcmV0dXJuIENBQ0hFRlNfTUFUQ0hfU1VDQ0VTUzsKKwl9CisKKwlfbGVhdmUoIiA9IEZBSUxFRCIpOworCXJldHVybiBDQUNIRUZTX01BVENIX0ZBSUxFRDsKK30KKyNlbmRpZgorCisvKgorICogdXBkYXRlIGEgdm9sdW1lIGhhc2ggcmVjb3JkIHN0b3JlZCBpbiB0aGUgY2FjaGUKKyAqLworI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKK3N0YXRpYyB2b2lkIGFmc192b2x1bWVfY2FjaGVfdXBkYXRlKHZvaWQgKnNvdXJjZSwgdm9pZCAqZW50cnkpCit7CisJc3RydWN0IGFmc19jYWNoZV92aGFzaCAqdmhhc2ggPSBlbnRyeTsKKwlzdHJ1Y3QgYWZzX3ZvbHVtZSAqdm9sdW1lID0gc291cmNlOworCisJX2VudGVyKCIiKTsKKworCXZoYXNoLT52dHlwZSA9IHZvbHVtZS0+dHlwZTsKK30KKyNlbmRpZgorCisjaWZkZWYgQUZTX0NBQ0hJTkdfU1VQUE9SVAorc3RhdGljIGNhY2hlZnNfbWF0Y2hfdmFsX3QgYWZzX3Zub2RlX2NhY2hlX21hdGNoKHZvaWQgKnRhcmdldCwKKwkJCQkJCSBjb25zdCB2b2lkICplbnRyeSk7CitzdGF0aWMgdm9pZCBhZnNfdm5vZGVfY2FjaGVfdXBkYXRlKHZvaWQgKnNvdXJjZSwgdm9pZCAqZW50cnkpOworCitzdHJ1Y3QgY2FjaGVmc19pbmRleF9kZWYgYWZzX3Zub2RlX2NhY2hlX2luZGV4X2RlZiA9IHsKKwkubmFtZQkJPSAidm5vZGUiLAorCS5kYXRhX3NpemUJPSBzaXplb2Yoc3RydWN0IGFmc19jYWNoZV92bm9kZSksCisJLmtleXNbMF0JPSB7IENBQ0hFRlNfSU5ERVhfS0VZU19CSU4sIDQgfSwKKwkubWF0Y2gJCT0gYWZzX3Zub2RlX2NhY2hlX21hdGNoLAorCS51cGRhdGUJCT0gYWZzX3Zub2RlX2NhY2hlX3VwZGF0ZSwKK307CisjZW5kaWYKKworLyoKKyAqIG1hdGNoIGEgdm5vZGUgcmVjb3JkIHN0b3JlZCBpbiB0aGUgY2FjaGUKKyAqLworI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKK3N0YXRpYyBjYWNoZWZzX21hdGNoX3ZhbF90IGFmc192bm9kZV9jYWNoZV9tYXRjaCh2b2lkICp0YXJnZXQsCisJCQkJCQkgY29uc3Qgdm9pZCAqZW50cnkpCit7CisJY29uc3Qgc3RydWN0IGFmc19jYWNoZV92bm9kZSAqY3Zub2RlID0gZW50cnk7CisJc3RydWN0IGFmc192bm9kZSAqdm5vZGUgPSB0YXJnZXQ7CisKKwlfZW50ZXIoInsleCwleCwlTHh9LHsleCwleCwlTHh9IiwKKwkgICAgICAgdm5vZGUtPmZpZC52bm9kZSwKKwkgICAgICAgdm5vZGUtPmZpZC51bmlxdWUsCisJICAgICAgIHZub2RlLT5zdGF0dXMudmVyc2lvbiwKKwkgICAgICAgY3Zub2RlLT52bm9kZV9pZCwKKwkgICAgICAgY3Zub2RlLT52bm9kZV91bmlxdWUsCisJICAgICAgIGN2bm9kZS0+ZGF0YV92ZXJzaW9uKTsKKworCWlmICh2bm9kZS0+ZmlkLnZub2RlICE9IGN2bm9kZS0+dm5vZGVfaWQpIHsKKwkJX2xlYXZlKCIgPSBGQUlMRUQiKTsKKwkJcmV0dXJuIENBQ0hFRlNfTUFUQ0hfRkFJTEVEOworCX0KKworCWlmICh2bm9kZS0+ZmlkLnVuaXF1ZSAhPSBjdm5vZGUtPnZub2RlX3VuaXF1ZSB8fAorCSAgICB2bm9kZS0+c3RhdHVzLnZlcnNpb24gIT0gY3Zub2RlLT5kYXRhX3ZlcnNpb24pIHsKKwkJX2xlYXZlKCIgPSBERUxFVEUiKTsKKwkJcmV0dXJuIENBQ0hFRlNfTUFUQ0hfU1VDQ0VTU19ERUxFVEU7CisJfQorCisJX2xlYXZlKCIgPSBTVUNDRVNTIik7CisJcmV0dXJuIENBQ0hFRlNfTUFUQ0hfU1VDQ0VTUzsKK30KKyNlbmRpZgorCisvKgorICogdXBkYXRlIGEgdm5vZGUgcmVjb3JkIHN0b3JlZCBpbiB0aGUgY2FjaGUKKyAqLworI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKK3N0YXRpYyB2b2lkIGFmc192bm9kZV9jYWNoZV91cGRhdGUodm9pZCAqc291cmNlLCB2b2lkICplbnRyeSkKK3sKKwlzdHJ1Y3QgYWZzX2NhY2hlX3Zub2RlICpjdm5vZGUgPSBlbnRyeTsKKwlzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSA9IHNvdXJjZTsKKworCV9lbnRlcigiIik7CisKKwljdm5vZGUtPnZub2RlX2lkCT0gdm5vZGUtPmZpZC52bm9kZTsKKwljdm5vZGUtPnZub2RlX3VuaXF1ZQk9IHZub2RlLT5maWQudW5pcXVlOworCWN2bm9kZS0+ZGF0YV92ZXJzaW9uCT0gdm5vZGUtPnN0YXR1cy52ZXJzaW9uOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9hZnMvY2FjaGUuaCBiL2ZzL2Fmcy9jYWNoZS5oCmluZGV4IDllYjc3MjIuLjM2YTM2NDIgMTAwNjQ0Ci0tLSBhL2ZzL2Fmcy9jYWNoZS5oCisrKyBiL2ZzL2Fmcy9jYWNoZS5oCkBAIC0xLDQgKzEsNCBAQAotLyogY2FjaGUuaDogQUZTIGxvY2FsIGNhY2hlIG1hbmFnZW1lbnQgaW50ZXJmYWNlCisvKiBBRlMgbG9jYWwgY2FjaGUgbWFuYWdlbWVudCBpbnRlcmZhY2UKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQpAQCAtOSw4ICs5LDggQEAKICAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KIAotI2lmbmRlZiBfTElOVVhfQUZTX0NBQ0hFX0gKLSNkZWZpbmUgX0xJTlVYX0FGU19DQUNIRV9ICisjaWZuZGVmIEFGU19DQUNIRV9ICisjZGVmaW5lIEFGU19DQUNIRV9ICiAKICN1bmRlZiBBRlNfQ0FDSElOR19TVVBQT1JUCiAKQEAgLTIwLDggKzIwLDQgQEAKICNlbmRpZgogI2luY2x1ZGUgInR5cGVzLmgiCiAKLSNpZmRlZiBfX0tFUk5FTF9fCi0KLSNlbmRpZiAvKiBfX0tFUk5FTF9fICovCi0KLSNlbmRpZiAvKiBfTElOVVhfQUZTX0NBQ0hFX0ggKi8KKyNlbmRpZiAvKiBBRlNfQ0FDSEVfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvYWZzL2NhbGxiYWNrLmMgYi9mcy9hZnMvY2FsbGJhY2suYwppbmRleCA5Y2IyMDZlLi42MzkzOTlmIDEwMDY0NAotLS0gYS9mcy9hZnMvY2FsbGJhY2suYworKysgYi9mcy9hZnMvY2FsbGJhY2suYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSBmcmVlbHkgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCiAgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KQEAgLTE2LDg1ICsxNiwxODcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSAic2VydmVyLmgiCi0jaW5jbHVkZSAidm5vZGUuaCIKKyNpbmNsdWRlIDxsaW51eC9jaXJjX2J1Zi5oPgogI2luY2x1ZGUgImludGVybmFsLmgiCi0jaW5jbHVkZSAiY21zZXJ2aWNlLmgiCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3Vuc2lnbmVkIGFmc192bm9kZV91cGRhdGVfdGltZW91dCA9IDEwOworCisjZGVmaW5lIGFmc19icmVha3Jpbmdfc3BhY2Uoc2VydmVyKSBcCisJQ0lSQ19TUEFDRSgoc2VydmVyKS0+Y2JfYnJlYWtfaGVhZCwgKHNlcnZlciktPmNiX2JyZWFrX3RhaWwsCVwKKwkJICAgQVJSQVlfU0laRSgoc2VydmVyKS0+Y2JfYnJlYWspKQorCisvL3N0YXRpYyB2b2lkIGFmc19jYWxsYmFja191cGRhdGVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqKTsKKworc3RhdGljIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICphZnNfY2FsbGJhY2tfdXBkYXRlX3dvcmtlcjsKKwogLyoKICAqIGFsbG93IHRoZSBmaWxlc2VydmVyIHRvIHJlcXVlc3QgY2FsbGJhY2sgc3RhdGUgKHJlLSlpbml0aWFsaXNhdGlvbgogICovCi1pbnQgU1JYQUZTQ01fSW5pdENhbGxCYWNrU3RhdGUoc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlcikKK3ZvaWQgYWZzX2luaXRfY2FsbGJhY2tfc3RhdGUoc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlcikKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGNhbGxiYWNrczsKKwlzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZTsKIAotCV9lbnRlcigiJXAiLCBzZXJ2ZXIpOworCV9lbnRlcigieyVwfSIsIHNlcnZlcik7CiAKLQlJTklUX0xJU1RfSEVBRCgmY2FsbGJhY2tzKTsKLQotCS8qIHRyYW5zZmVyIHRoZSBjYWxsYmFjayBsaXN0IGZyb20gdGhlIHNlcnZlciB0byBhIHRlbXAgaG9sZGluZyBhcmVhICovCiAJc3Bpbl9sb2NrKCZzZXJ2ZXItPmNiX2xvY2spOwogCi0JbGlzdF9hZGQoJmNhbGxiYWNrcywgJnNlcnZlci0+Y2JfcHJvbWlzZXMpOwotCWxpc3RfZGVsX2luaXQoJnNlcnZlci0+Y2JfcHJvbWlzZXMpOwotCi0JLyogbXVuY2ggb3VyIHdheSB0aHJvdWdoIHRoZSBsaXN0LCBncmFiYmluZyB0aGUgaW5vZGUsIGRyb3BwaW5nIGFsbCB0aGUKLQkgKiBsb2NrcyBhbmQgcmVnZXR0aW5nIHRoZW0gaW4gdGhlIHJpZ2h0IG9yZGVyCi0JICovCi0Jd2hpbGUgKCFsaXN0X2VtcHR5KCZjYWxsYmFja3MpKSB7Ci0JCXN0cnVjdCBhZnNfdm5vZGUgKnZub2RlOwotCQlzdHJ1Y3QgaW5vZGUgKmlub2RlOwotCi0JCXZub2RlID0gbGlzdF9lbnRyeShjYWxsYmFja3MubmV4dCwgc3RydWN0IGFmc192bm9kZSwgY2JfbGluayk7Ci0JCWxpc3RfZGVsX2luaXQoJnZub2RlLT5jYl9saW5rKTsKLQotCQkvKiB0cnkgYW5kIGdyYWIgdGhlIGlub2RlIC0gbWF5IGZhaWwgKi8KLQkJaW5vZGUgPSBpZ3JhYihBRlNfVk5PREVfVE9fSSh2bm9kZSkpOwotCQlpZiAoaW5vZGUpIHsKLQkJCWludCByZWxlYXNlID0gMDsKLQotCQkJc3Bpbl91bmxvY2soJnNlcnZlci0+Y2JfbG9jayk7Ci0JCQlzcGluX2xvY2soJnZub2RlLT5sb2NrKTsKLQotCQkJaWYgKHZub2RlLT5jYl9zZXJ2ZXIgPT0gc2VydmVyKSB7Ci0JCQkJdm5vZGUtPmNiX3NlcnZlciA9IE5VTEw7Ci0JCQkJYWZzX2thZnN0aW1vZF9kZWxfdGltZXIoJnZub2RlLT5jYl90aW1lb3V0KTsKLQkJCQlzcGluX2xvY2soJmFmc19jYl9oYXNoX2xvY2spOwotCQkJCWxpc3RfZGVsX2luaXQoJnZub2RlLT5jYl9oYXNoX2xpbmspOwotCQkJCXNwaW5fdW5sb2NrKCZhZnNfY2JfaGFzaF9sb2NrKTsKLQkJCQlyZWxlYXNlID0gMTsKLQkJCX0KLQotCQkJc3Bpbl91bmxvY2soJnZub2RlLT5sb2NrKTsKLQotCQkJaXB1dChpbm9kZSk7Ci0JCQlhZnNfcHV0X3NlcnZlcihzZXJ2ZXIpOwotCi0JCQlzcGluX2xvY2soJnNlcnZlci0+Y2JfbG9jayk7Ci0JCX0KKwkvKiBraWxsIGFsbCB0aGUgcHJvbWlzZXMgb24gcmVjb3JkIGZyb20gdGhpcyBzZXJ2ZXIgKi8KKwl3aGlsZSAoIVJCX0VNUFRZX1JPT1QoJnNlcnZlci0+Y2JfcHJvbWlzZXMpKSB7CisJCXZub2RlID0gcmJfZW50cnkoc2VydmVyLT5jYl9wcm9taXNlcy5yYl9ub2RlLAorCQkJCSBzdHJ1Y3QgYWZzX3Zub2RlLCBjYl9wcm9taXNlKTsKKwkJX2RlYnVnKCJVTlBST01JU0UgeyB2aWQ9JXggdm49JXUgdXE9JXV9IiwKKwkJICAgICAgIHZub2RlLT5maWQudmlkLCB2bm9kZS0+ZmlkLnZub2RlLCB2bm9kZS0+ZmlkLnVuaXF1ZSk7CisJCXJiX2VyYXNlKCZ2bm9kZS0+Y2JfcHJvbWlzZSwgJnNlcnZlci0+Y2JfcHJvbWlzZXMpOworCQl2bm9kZS0+Y2JfcHJvbWlzZWQgPSBmYWxzZTsKIAl9CiAKIAlzcGluX3VubG9jaygmc2VydmVyLT5jYl9sb2NrKTsKKwlfbGVhdmUoIiIpOworfQogCi0JX2xlYXZlKCIgPSAwIik7Ci0JcmV0dXJuIDA7Ci19IC8qIGVuZCBTUlhBRlNDTV9Jbml0Q2FsbEJhY2tTdGF0ZSgpICovCisvKgorICogaGFuZGxlIHRoZSBkYXRhIGludmFsaWRhdGlvbiBzaWRlIG9mIGEgY2FsbGJhY2sgYmVpbmcgYnJva2VuCisgKi8KK3ZvaWQgYWZzX2Jyb2tlbl9jYWxsYmFja193b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYWZzX3Zub2RlLCBjYl9icm9rZW5fd29yayk7CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwlfZW50ZXIoIiIpOworCisJaWYgKHRlc3RfYml0KEFGU19WTk9ERV9ERUxFVEVELCAmdm5vZGUtPmZsYWdzKSkKKwkJcmV0dXJuOworCisJLyogd2UncmUgb25seSBpbnRlcmVzdGVkIGluIGRlYWxpbmcgd2l0aCBhIGJyb2tlbiBjYWxsYmFjayBvbiAqdGhpcyoKKwkgKiB2bm9kZSBhbmQgb25seSBpZiBuby1vbmUgZWxzZSBoYXMgZGVhbHQgd2l0aCBpdCB5ZXQgKi8KKwlpZiAoIW11dGV4X3RyeWxvY2soJnZub2RlLT52YWxpZGF0ZV9sb2NrKSkKKwkJcmV0dXJuOyAvKiBzb21lb25lIGVsc2UgaXMgZGVhbGluZyB3aXRoIGl0ICovCisKKwlpZiAodGVzdF9iaXQoQUZTX1ZOT0RFX0NCX0JST0tFTiwgJnZub2RlLT5mbGFncykpIHsKKwkJaWYgKFNfSVNESVIodm5vZGUtPnZmc19pbm9kZS5pX21vZGUpKQorCQkJYWZzX2NsZWFyX3Blcm1pdHModm5vZGUpOworCisJCWlmIChhZnNfdm5vZGVfZmV0Y2hfc3RhdHVzKHZub2RlLCBOVUxMLCBOVUxMKSA8IDApCisJCQlnb3RvIG91dDsKKworCQlpZiAodGVzdF9iaXQoQUZTX1ZOT0RFX0RFTEVURUQsICZ2bm9kZS0+ZmxhZ3MpKQorCQkJZ290byBvdXQ7CisKKwkJLyogaWYgdGhlIHZub2RlJ3MgZGF0YSB2ZXJzaW9uIG51bWJlciBjaGFuZ2VkIHRoZW4gaXRzIGNvbnRlbnRzCisJCSAqIGFyZSBkaWZmZXJlbnQgKi8KKwkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChBRlNfVk5PREVfWkFQX0RBVEEsICZ2bm9kZS0+ZmxhZ3MpKSB7CisJCQlfZGVidWcoInphcCBkYXRhIHsleDoldX0iLAorCQkJICAgICAgIHZub2RlLT5maWQudmlkLCB2bm9kZS0+ZmlkLnZub2RlKTsKKwkJCWludmFsaWRhdGVfcmVtb3RlX2lub2RlKCZ2bm9kZS0+dmZzX2lub2RlKTsKKwkJfQorCX0KKworb3V0OgorCW11dGV4X3VubG9jaygmdm5vZGUtPnZhbGlkYXRlX2xvY2spOworCisJLyogYXZvaWQgdGhlIHBvdGVudGlhbCByYWNlIHdoZXJlYnkgdGhlIG11dGV4X3RyeWxvY2soKSBpbiB0aGlzCisJICogZnVuY3Rpb24gaGFwcGVucyBhZ2FpbiBiZXR3ZWVuIHRoZSBjbGVhcl9iaXQoKSBhbmQgdGhlCisJICogbXV0ZXhfdW5sb2NrKCkgKi8KKwlpZiAodGVzdF9iaXQoQUZTX1ZOT0RFX0NCX0JST0tFTiwgJnZub2RlLT5mbGFncykpIHsKKwkJX2RlYnVnKCJyZXF1ZXVlIik7CisJCXF1ZXVlX3dvcmsoYWZzX2NhbGxiYWNrX3VwZGF0ZV93b3JrZXIsICZ2bm9kZS0+Y2JfYnJva2VuX3dvcmspOworCX0KKwlfbGVhdmUoIiIpOworfQorCisvKgorICogYWN0dWFsbHkgYnJlYWsgYSBjYWxsYmFjaworICovCitzdGF0aWMgdm9pZCBhZnNfYnJlYWtfY2FsbGJhY2soc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlciwKKwkJCSAgICAgICBzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSkKK3sKKwlfZW50ZXIoIiIpOworCisJc2V0X2JpdChBRlNfVk5PREVfQ0JfQlJPS0VOLCAmdm5vZGUtPmZsYWdzKTsKKworCWlmICh2bm9kZS0+Y2JfcHJvbWlzZWQpIHsKKwkJc3Bpbl9sb2NrKCZ2bm9kZS0+bG9jayk7CisKKwkJX2RlYnVnKCJicmVhayBjYWxsYmFjayIpOworCisJCXNwaW5fbG9jaygmc2VydmVyLT5jYl9sb2NrKTsKKwkJaWYgKHZub2RlLT5jYl9wcm9taXNlZCkgeworCQkJcmJfZXJhc2UoJnZub2RlLT5jYl9wcm9taXNlLCAmc2VydmVyLT5jYl9wcm9taXNlcyk7CisJCQl2bm9kZS0+Y2JfcHJvbWlzZWQgPSBmYWxzZTsKKwkJfQorCQlzcGluX3VubG9jaygmc2VydmVyLT5jYl9sb2NrKTsKKworCQlxdWV1ZV93b3JrKGFmc19jYWxsYmFja191cGRhdGVfd29ya2VyLCAmdm5vZGUtPmNiX2Jyb2tlbl93b3JrKTsKKwkJc3Bpbl91bmxvY2soJnZub2RlLT5sb2NrKTsKKwl9Cit9CisKKy8qCisgKiBhbGxvdyB0aGUgZmlsZXNlcnZlciB0byBleHBsaWNpdGx5IGJyZWFrIG9uZSBjYWxsYmFjaworICogLSBoYXBwZW5zIHdoZW4KKyAqICAgLSB0aGUgYmFja2luZyBmaWxlIGlzIGNoYW5nZWQKKyAqICAgLSBhIGxvY2sgaXMgcmVsZWFzZWQKKyAqLworc3RhdGljIHZvaWQgYWZzX2JyZWFrX29uZV9jYWxsYmFjayhzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyLAorCQkJCSAgIHN0cnVjdCBhZnNfZmlkICpmaWQpCit7CisJc3RydWN0IGFmc192bm9kZSAqdm5vZGU7CisJc3RydWN0IHJiX25vZGUgKnA7CisKKwlfZGVidWcoImZpbmQiKTsKKwlzcGluX2xvY2soJnNlcnZlci0+ZnNfbG9jayk7CisJcCA9IHNlcnZlci0+ZnNfdm5vZGVzLnJiX25vZGU7CisJd2hpbGUgKHApIHsKKwkJdm5vZGUgPSByYl9lbnRyeShwLCBzdHJ1Y3QgYWZzX3Zub2RlLCBzZXJ2ZXJfcmIpOworCQlpZiAoZmlkLT52aWQgPCB2bm9kZS0+ZmlkLnZpZCkKKwkJCXAgPSBwLT5yYl9sZWZ0OworCQllbHNlIGlmIChmaWQtPnZpZCA+IHZub2RlLT5maWQudmlkKQorCQkJcCA9IHAtPnJiX3JpZ2h0OworCQllbHNlIGlmIChmaWQtPnZub2RlIDwgdm5vZGUtPmZpZC52bm9kZSkKKwkJCXAgPSBwLT5yYl9sZWZ0OworCQllbHNlIGlmIChmaWQtPnZub2RlID4gdm5vZGUtPmZpZC52bm9kZSkKKwkJCXAgPSBwLT5yYl9yaWdodDsKKwkJZWxzZSBpZiAoZmlkLT51bmlxdWUgPCB2bm9kZS0+ZmlkLnVuaXF1ZSkKKwkJCXAgPSBwLT5yYl9sZWZ0OworCQllbHNlIGlmIChmaWQtPnVuaXF1ZSA+IHZub2RlLT5maWQudW5pcXVlKQorCQkJcCA9IHAtPnJiX3JpZ2h0OworCQllbHNlCisJCQlnb3RvIGZvdW5kOworCX0KKworCS8qIG5vdCBmb3VuZCBzbyB3ZSBqdXN0IGlnbm9yZSBpdCAoaXQgbWF5IGhhdmUgbW92ZWQgdG8gYW5vdGhlcgorCSAqIHNlcnZlcikgKi8KK25vdF9hdmFpbGFibGU6CisJX2RlYnVnKCJub3QgYXZhaWwiKTsKKwlzcGluX3VubG9jaygmc2VydmVyLT5mc19sb2NrKTsKKwlfbGVhdmUoIiIpOworCXJldHVybjsKKworZm91bmQ6CisJX2RlYnVnKCJmb3VuZCIpOworCUFTU0VSVENNUChzZXJ2ZXIsID09LCB2bm9kZS0+c2VydmVyKTsKKworCWlmICghaWdyYWIoQUZTX1ZOT0RFX1RPX0kodm5vZGUpKSkKKwkJZ290byBub3RfYXZhaWxhYmxlOworCXNwaW5fdW5sb2NrKCZzZXJ2ZXItPmZzX2xvY2spOworCisJYWZzX2JyZWFrX2NhbGxiYWNrKHNlcnZlciwgdm5vZGUpOworCWlwdXQoJnZub2RlLT52ZnNfaW5vZGUpOworCV9sZWF2ZSgiIik7Cit9CisKIC8qCiAgKiBhbGxvdyB0aGUgZmlsZXNlcnZlciB0byBicmVhayBjYWxsYmFjayBwcm9taXNlcwogICovCi1pbnQgU1JYQUZTQ01fQ2FsbEJhY2soc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlciwgc2l6ZV90IGNvdW50LAotCQkgICAgICBzdHJ1Y3QgYWZzX2NhbGxiYWNrIGNhbGxiYWNrc1tdKQordm9pZCBhZnNfYnJlYWtfY2FsbGJhY2tzKHN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIsIHNpemVfdCBjb3VudCwKKwkJCSBzdHJ1Y3QgYWZzX2NhbGxiYWNrIGNhbGxiYWNrc1tdKQogewotCV9lbnRlcigiJXAsJXUsIiwgc2VydmVyLCBjb3VudCk7CisJX2VudGVyKCIlcCwlenUsIiwgc2VydmVyLCBjb3VudCk7CisKKwlBU1NFUlQoc2VydmVyICE9IE5VTEwpOworCUFTU0VSVENNUChjb3VudCwgPD0sIEFGU0NCTUFYKTsKIAogCWZvciAoOyBjb3VudCA+IDA7IGNhbGxiYWNrcysrLCBjb3VudC0tKSB7Ci0JCXN0cnVjdCBhZnNfdm5vZGUgKnZub2RlID0gTlVMTDsKLQkJc3RydWN0IGlub2RlICppbm9kZSA9IE5VTEw7Ci0JCWludCB2YWxpZCA9IDA7Ci0KIAkJX2RlYnVnKCItIEZpZCB7IHZsPSUwOHggbj0ldSB1PSV1IH0gIENCIHsgdj0ldSB4PSV1IHQ9JXUgfSIsCiAJCSAgICAgICBjYWxsYmFja3MtPmZpZC52aWQsCiAJCSAgICAgICBjYWxsYmFja3MtPmZpZC52bm9kZSwKQEAgLTEwMyw2NyArMjA1LDI3MCBAQAogCQkgICAgICAgY2FsbGJhY2tzLT5leHBpcnksCiAJCSAgICAgICBjYWxsYmFja3MtPnR5cGUKIAkJICAgICAgICk7Ci0KLQkJLyogZmluZCB0aGUgaW5vZGUgZm9yIHRoaXMgZmlkICovCi0JCXNwaW5fbG9jaygmYWZzX2NiX2hhc2hfbG9jayk7Ci0KLQkJbGlzdF9mb3JfZWFjaF9lbnRyeSh2bm9kZSwKLQkJCQkgICAgJmFmc19jYl9oYXNoKHNlcnZlciwgJmNhbGxiYWNrcy0+ZmlkKSwKLQkJCQkgICAgY2JfaGFzaF9saW5rKSB7Ci0JCQlpZiAobWVtY21wKCZ2bm9kZS0+ZmlkLCAmY2FsbGJhY2tzLT5maWQsCi0JCQkJICAgc2l6ZW9mKHN0cnVjdCBhZnNfZmlkKSkgIT0gMCkKLQkJCQljb250aW51ZTsKLQotCQkJLyogcmlnaHQgdm5vZGUsIGJ1dCBpcyBpdCBzYW1lIHNlcnZlcj8gKi8KLQkJCWlmICh2bm9kZS0+Y2Jfc2VydmVyICE9IHNlcnZlcikKLQkJCQlicmVhazsgLyogbm8gKi8KLQotCQkJLyogdHJ5IGFuZCBuYWlsIHRoZSBpbm9kZSBkb3duICovCi0JCQlpbm9kZSA9IGlncmFiKEFGU19WTk9ERV9UT19JKHZub2RlKSk7Ci0JCQlicmVhazsKLQkJfQotCi0JCXNwaW5fdW5sb2NrKCZhZnNfY2JfaGFzaF9sb2NrKTsKLQotCQlpZiAoaW5vZGUpIHsKLQkJCS8qIHdlJ3ZlIGZvdW5kIHRoZSByZWNvcmQgZm9yIHRoaXMgdm5vZGUgKi8KLQkJCXNwaW5fbG9jaygmdm5vZGUtPmxvY2spOwotCQkJaWYgKHZub2RlLT5jYl9zZXJ2ZXIgPT0gc2VydmVyKSB7Ci0JCQkJLyogdGhlIGNhbGxiYWNrIF9pc18gb24gdGhlIGNhbGxpbmcgc2VydmVyICovCi0JCQkJdm5vZGUtPmNiX3NlcnZlciA9IE5VTEw7Ci0JCQkJdmFsaWQgPSAxOwotCi0JCQkJYWZzX2thZnN0aW1vZF9kZWxfdGltZXIoJnZub2RlLT5jYl90aW1lb3V0KTsKLQkJCQl2bm9kZS0+ZmxhZ3MgfD0gQUZTX1ZOT0RFX0NIQU5HRUQ7Ci0KLQkJCQlzcGluX2xvY2soJnNlcnZlci0+Y2JfbG9jayk7Ci0JCQkJbGlzdF9kZWxfaW5pdCgmdm5vZGUtPmNiX2xpbmspOwotCQkJCXNwaW5fdW5sb2NrKCZzZXJ2ZXItPmNiX2xvY2spOwotCi0JCQkJc3Bpbl9sb2NrKCZhZnNfY2JfaGFzaF9sb2NrKTsKLQkJCQlsaXN0X2RlbF9pbml0KCZ2bm9kZS0+Y2JfaGFzaF9saW5rKTsKLQkJCQlzcGluX3VubG9jaygmYWZzX2NiX2hhc2hfbG9jayk7Ci0JCQl9Ci0JCQlzcGluX3VubG9jaygmdm5vZGUtPmxvY2spOwotCi0JCQlpZiAodmFsaWQpIHsKLQkJCQlpbnZhbGlkYXRlX3JlbW90ZV9pbm9kZShpbm9kZSk7Ci0JCQkJYWZzX3B1dF9zZXJ2ZXIoc2VydmVyKTsKLQkJCX0KLQkJCWlwdXQoaW5vZGUpOwotCQl9CisJCWFmc19icmVha19vbmVfY2FsbGJhY2soc2VydmVyLCAmY2FsbGJhY2tzLT5maWQpOwogCX0KIAotCV9sZWF2ZSgiID0gMCIpOwotCXJldHVybiAwOwotfSAvKiBlbmQgU1JYQUZTQ01fQ2FsbEJhY2soKSAqLworCV9sZWF2ZSgiIik7CisJcmV0dXJuOworfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgotICogYWxsb3cgdGhlIGZpbGVzZXJ2ZXIgdG8gc2VlIGlmIHRoZSBjYWNoZSBtYW5hZ2VyIGlzIHN0aWxsIGFsaXZlCisgKiByZWNvcmQgdGhlIGNhbGxiYWNrIGZvciBicmVha2luZworICogLSB0aGUgY2FsbGVyIG11c3QgaG9sZCBzZXJ2ZXItPmNiX2xvY2sKICAqLwotaW50IFNSWEFGU0NNX1Byb2JlKHN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIpCitzdGF0aWMgdm9pZCBhZnNfZG9fZ2l2ZV91cF9jYWxsYmFjayhzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyLAorCQkJCSAgICBzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSkKIHsKLQlfZGVidWcoIlNSWEFGU0NNX1Byb2JlKCVwKVxuIiwgc2VydmVyKTsKLQlyZXR1cm4gMDsKLX0gLyogZW5kIFNSWEFGU0NNX1Byb2JlKCkgKi8KKwlzdHJ1Y3QgYWZzX2NhbGxiYWNrICpjYjsKKworCV9lbnRlcigiJXAsJXAiLCBzZXJ2ZXIsIHZub2RlKTsKKworCWNiID0gJnNlcnZlci0+Y2JfYnJlYWtbc2VydmVyLT5jYl9icmVha19oZWFkXTsKKwljYi0+ZmlkCQk9IHZub2RlLT5maWQ7CisJY2ItPnZlcnNpb24JPSB2bm9kZS0+Y2JfdmVyc2lvbjsKKwljYi0+ZXhwaXJ5CT0gdm5vZGUtPmNiX2V4cGlyeTsKKwljYi0+dHlwZQk9IHZub2RlLT5jYl90eXBlOworCXNtcF93bWIoKTsKKwlzZXJ2ZXItPmNiX2JyZWFrX2hlYWQgPQorCQkoc2VydmVyLT5jYl9icmVha19oZWFkICsgMSkgJgorCQkoQVJSQVlfU0laRShzZXJ2ZXItPmNiX2JyZWFrKSAtIDEpOworCisJLyogZGVmZXIgdGhlIGJyZWFraW5nIG9mIGNhbGxiYWNrcyB0byB0cnkgYW5kIGNvbGxlY3QgYXMgbWFueSBhcworCSAqIHBvc3NpYmxlIHRvIHNoaXAgaW4gb25lIG9wZXJhdGlvbiAqLworCXN3aXRjaCAoYXRvbWljX2luY19yZXR1cm4oJnNlcnZlci0+Y2JfYnJlYWtfbikpIHsKKwljYXNlIDEgLi4uIEFGU0NCTUFYIC0gMToKKwkJcXVldWVfZGVsYXllZF93b3JrKGFmc19jYWxsYmFja191cGRhdGVfd29ya2VyLAorCQkJCSAgICZzZXJ2ZXItPmNiX2JyZWFrX3dvcmssIEhaICogMik7CisJCWJyZWFrOworCWNhc2UgQUZTQ0JNQVg6CisJCWFmc19mbHVzaF9jYWxsYmFja19icmVha3Moc2VydmVyKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJQVNTRVJUKHNlcnZlci0+Y2JfcHJvbWlzZXMucmJfbm9kZSAhPSBOVUxMKTsKKwlyYl9lcmFzZSgmdm5vZGUtPmNiX3Byb21pc2UsICZzZXJ2ZXItPmNiX3Byb21pc2VzKTsKKwl2bm9kZS0+Y2JfcHJvbWlzZWQgPSBmYWxzZTsKKwlfbGVhdmUoIiIpOworfQorCisvKgorICogZGlzY2FyZCB0aGUgY2FsbGJhY2sgb24gYSBkZWxldGVkIGl0ZW0KKyAqLwordm9pZCBhZnNfZGlzY2FyZF9jYWxsYmFja19vbl9kZWxldGUoc3RydWN0IGFmc192bm9kZSAqdm5vZGUpCit7CisJc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlciA9IHZub2RlLT5zZXJ2ZXI7CisKKwlfZW50ZXIoIiVkIiwgdm5vZGUtPmNiX3Byb21pc2VkKTsKKworCWlmICghdm5vZGUtPmNiX3Byb21pc2VkKSB7CisJCV9sZWF2ZSgiIFtub3QgcHJvbWlzZWRdIik7CisJCXJldHVybjsKKwl9CisKKwlBU1NFUlQoc2VydmVyICE9IE5VTEwpOworCisJc3Bpbl9sb2NrKCZzZXJ2ZXItPmNiX2xvY2spOworCWlmICh2bm9kZS0+Y2JfcHJvbWlzZWQpIHsKKwkJQVNTRVJUKHNlcnZlci0+Y2JfcHJvbWlzZXMucmJfbm9kZSAhPSBOVUxMKTsKKwkJcmJfZXJhc2UoJnZub2RlLT5jYl9wcm9taXNlLCAmc2VydmVyLT5jYl9wcm9taXNlcyk7CisJCXZub2RlLT5jYl9wcm9taXNlZCA9IGZhbHNlOworCX0KKwlzcGluX3VubG9jaygmc2VydmVyLT5jYl9sb2NrKTsKKwlfbGVhdmUoIiIpOworfQorCisvKgorICogZ2l2ZSB1cCB0aGUgY2FsbGJhY2sgcmVnaXN0ZXJlZCBmb3IgYSB2bm9kZSBvbiB0aGUgZmlsZSBzZXJ2ZXIgd2hlbiB0aGUKKyAqIGlub2RlIGlzIGJlaW5nIGNsZWFyZWQKKyAqLwordm9pZCBhZnNfZ2l2ZV91cF9jYWxsYmFjayhzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSkKK3sKKwlzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyID0gdm5vZGUtPnNlcnZlcjsKKworCURFQ0xBUkVfV0FJVFFVRVVFKG15c2VsZiwgY3VycmVudCk7CisKKwlfZW50ZXIoIiVkIiwgdm5vZGUtPmNiX3Byb21pc2VkKTsKKworCV9kZWJ1ZygiR0lWRSBVUCBJTk9ERSAlcCIsICZ2bm9kZS0+dmZzX2lub2RlKTsKKworCWlmICghdm5vZGUtPmNiX3Byb21pc2VkKSB7CisJCV9sZWF2ZSgiIFtub3QgcHJvbWlzZWRdIik7CisJCXJldHVybjsKKwl9CisKKwlBU1NFUlQoc2VydmVyICE9IE5VTEwpOworCisJc3Bpbl9sb2NrKCZzZXJ2ZXItPmNiX2xvY2spOworCWlmICh2bm9kZS0+Y2JfcHJvbWlzZWQgJiYgYWZzX2JyZWFrcmluZ19zcGFjZShzZXJ2ZXIpID09IDApIHsKKwkJYWRkX3dhaXRfcXVldWUoJnNlcnZlci0+Y2JfYnJlYWtfd2FpdHEsICZteXNlbGYpOworCQlmb3IgKDs7KSB7CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCQlpZiAoIXZub2RlLT5jYl9wcm9taXNlZCB8fAorCQkJICAgIGFmc19icmVha3Jpbmdfc3BhY2Uoc2VydmVyKSAhPSAwKQorCQkJCWJyZWFrOworCQkJc3Bpbl91bmxvY2soJnNlcnZlci0+Y2JfbG9jayk7CisJCQlzY2hlZHVsZSgpOworCQkJc3Bpbl9sb2NrKCZzZXJ2ZXItPmNiX2xvY2spOworCQl9CisJCXJlbW92ZV93YWl0X3F1ZXVlKCZzZXJ2ZXItPmNiX2JyZWFrX3dhaXRxLCAmbXlzZWxmKTsKKwkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCX0KKworCS8qIG9mIGNvdXJzZSwgaXQncyBhbHdheXMgcG9zc2libGUgZm9yIHRoZSBzZXJ2ZXIgdG8gYnJlYWsgdGhpcyB2bm9kZSdzCisJICogY2FsbGJhY2sgZmlyc3QuLi4gKi8KKwlpZiAodm5vZGUtPmNiX3Byb21pc2VkKQorCQlhZnNfZG9fZ2l2ZV91cF9jYWxsYmFjayhzZXJ2ZXIsIHZub2RlKTsKKworCXNwaW5fdW5sb2NrKCZzZXJ2ZXItPmNiX2xvY2spOworCV9sZWF2ZSgiIik7Cit9CisKKy8qCisgKiBkaXNwYXRjaCBhIGRlZmVycmVkIGdpdmUgdXAgY2FsbGJhY2tzIG9wZXJhdGlvbgorICovCit2b2lkIGFmc19kaXNwYXRjaF9naXZlX3VwX2NhbGxiYWNrcyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlciA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYWZzX3NlcnZlciwgY2JfYnJlYWtfd29yay53b3JrKTsKKworCV9lbnRlcigiIik7CisKKwkvKiB0ZWxsIHRoZSBmaWxlc2VydmVyIHRvIGRpc2NhcmQgdGhlIGNhbGxiYWNrIHByb21pc2VzIGl0IGhhcworCSAqIC0gaW4gdGhlIGV2ZW50IG9mIEVOT01FTSBvciBzb21lIG90aGVyIGVycm9yLCB3ZSBqdXN0IGZvcmdldCB0aGF0IHdlCisJICogICBoYWQgY2FsbGJhY2tzIGVudGlyZWx5LCBhbmQgdGhlIHNlcnZlciB3aWxsIGNhbGwgdXMgbGF0ZXIgdG8gYnJlYWsKKwkgKiAgIHRoZW0KKwkgKi8KKwlhZnNfZnNfZ2l2ZV91cF9jYWxsYmFja3Moc2VydmVyLCAmYWZzX2FzeW5jX2NhbGwpOworfQorCisvKgorICogZmx1c2ggdGhlIG91dHN0YW5kaW5nIGNhbGxiYWNrIGJyZWFrcyBvbiBhIHNlcnZlcgorICovCit2b2lkIGFmc19mbHVzaF9jYWxsYmFja19icmVha3Moc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlcikKK3sKKwljYW5jZWxfZGVsYXllZF93b3JrKCZzZXJ2ZXItPmNiX2JyZWFrX3dvcmspOworCXF1ZXVlX2RlbGF5ZWRfd29yayhhZnNfY2FsbGJhY2tfdXBkYXRlX3dvcmtlciwKKwkJCSAgICZzZXJ2ZXItPmNiX2JyZWFrX3dvcmssIDApOworfQorCisjaWYgMAorLyoKKyAqIHVwZGF0ZSBhIGJ1bmNoIG9mIGNhbGxiYWNrcworICovCitzdGF0aWMgdm9pZCBhZnNfY2FsbGJhY2tfdXBkYXRlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlcjsKKwlzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSwgKnh2bm9kZTsKKwl0aW1lX3Qgbm93OworCWxvbmcgdGltZW91dDsKKwlpbnQgcmV0OworCisJc2VydmVyID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBhZnNfc2VydmVyLCB1cGRhdGVyKTsKKworCV9lbnRlcigiIik7CisKKwlub3cgPSBnZXRfc2Vjb25kcygpOworCisJLyogZmluZCB0aGUgZmlyc3Qgdm5vZGUgdG8gdXBkYXRlICovCisJc3Bpbl9sb2NrKCZzZXJ2ZXItPmNiX2xvY2spOworCWZvciAoOzspIHsKKwkJaWYgKFJCX0VNUFRZX1JPT1QoJnNlcnZlci0+Y2JfcHJvbWlzZXMpKSB7CisJCQlzcGluX3VubG9jaygmc2VydmVyLT5jYl9sb2NrKTsKKwkJCV9sZWF2ZSgiIFtub3RoaW5nXSIpOworCQkJcmV0dXJuOworCQl9CisKKwkJdm5vZGUgPSByYl9lbnRyeShyYl9maXJzdCgmc2VydmVyLT5jYl9wcm9taXNlcyksCisJCQkJIHN0cnVjdCBhZnNfdm5vZGUsIGNiX3Byb21pc2UpOworCQlpZiAoYXRvbWljX3JlYWQoJnZub2RlLT51c2FnZSkgPiAwKQorCQkJYnJlYWs7CisJCXJiX2VyYXNlKCZ2bm9kZS0+Y2JfcHJvbWlzZSwgJnNlcnZlci0+Y2JfcHJvbWlzZXMpOworCQl2bm9kZS0+Y2JfcHJvbWlzZWQgPSBmYWxzZTsKKwl9CisKKwl0aW1lb3V0ID0gdm5vZGUtPnVwZGF0ZV9hdCAtIG5vdzsKKwlpZiAodGltZW91dCA+IDApIHsKKwkJcXVldWVfZGVsYXllZF93b3JrKGFmc192bm9kZV91cGRhdGVfd29ya2VyLAorCQkJCSAgICZhZnNfdm5vZGVfdXBkYXRlLCB0aW1lb3V0ICogSFopOworCQlzcGluX3VubG9jaygmc2VydmVyLT5jYl9sb2NrKTsKKwkJX2xlYXZlKCIgW25vdGhpbmddIik7CisJCXJldHVybjsKKwl9CisKKwlsaXN0X2RlbF9pbml0KCZ2bm9kZS0+dXBkYXRlKTsKKwlhdG9taWNfaW5jKCZ2bm9kZS0+dXNhZ2UpOworCXNwaW5fdW5sb2NrKCZzZXJ2ZXItPmNiX2xvY2spOworCisJLyogd2UgY2FuIG5vdyBwZXJmb3JtIHRoZSB1cGRhdGUgKi8KKwlfZGVidWcoInVwZGF0ZSAlcyIsIHZub2RlLT52bGRiLm5hbWUpOworCXZub2RlLT5zdGF0ZSA9IEFGU19WTF9VUERBVElORzsKKwl2bm9kZS0+dXBkX3Jlal9jbnQgPSAwOworCXZub2RlLT51cGRfYnVzeV9jbnQgPSAwOworCisJcmV0ID0gYWZzX3Zub2RlX3VwZGF0ZV9yZWNvcmQodmwsICZ2bGRiKTsKKwlzd2l0Y2ggKHJldCkgeworCWNhc2UgMDoKKwkJYWZzX3Zub2RlX2FwcGx5X3VwZGF0ZSh2bCwgJnZsZGIpOworCQl2bm9kZS0+c3RhdGUgPSBBRlNfVkxfVVBEQVRJTkc7CisJCWJyZWFrOworCWNhc2UgLUVOT01FRElVTToKKwkJdm5vZGUtPnN0YXRlID0gQUZTX1ZMX1ZPTFVNRV9ERUxFVEVEOworCQlicmVhazsKKwlkZWZhdWx0OgorCQl2bm9kZS0+c3RhdGUgPSBBRlNfVkxfVU5DRVJUQUlOOworCQlicmVhazsKKwl9CisKKwkvKiBhbmQgdGhlbiByZXNjaGVkdWxlICovCisJX2RlYnVnKCJyZXNjaGVkdWxlIik7CisJdm5vZGUtPnVwZGF0ZV9hdCA9IGdldF9zZWNvbmRzKCkgKyBhZnNfdm5vZGVfdXBkYXRlX3RpbWVvdXQ7CisKKwlzcGluX2xvY2soJnNlcnZlci0+Y2JfbG9jayk7CisKKwlpZiAoIWxpc3RfZW1wdHkoJnNlcnZlci0+Y2JfcHJvbWlzZXMpKSB7CisJCS8qIG5leHQgdXBkYXRlIGluIDEwIG1pbnV0ZXMsIGJ1dCB3YWl0IGF0IGxlYXN0IDEgc2Vjb25kIG1vcmUKKwkJICogdGhhbiB0aGUgbmV3ZXN0IHJlY29yZCBhbHJlYWR5IHF1ZXVlZCBzbyB0aGF0IHdlIGRvbid0IHNwYW0KKwkJICogdGhlIFZMIHNlcnZlciBzdWRkZW5seSB3aXRoIGxvdHMgb2YgcmVxdWVzdHMKKwkJICovCisJCXh2bm9kZSA9IGxpc3RfZW50cnkoc2VydmVyLT5jYl9wcm9taXNlcy5wcmV2LAorCQkJCSAgICBzdHJ1Y3QgYWZzX3Zub2RlLCB1cGRhdGUpOworCQlpZiAodm5vZGUtPnVwZGF0ZV9hdCA8PSB4dm5vZGUtPnVwZGF0ZV9hdCkKKwkJCXZub2RlLT51cGRhdGVfYXQgPSB4dm5vZGUtPnVwZGF0ZV9hdCArIDE7CisJCXh2bm9kZSA9IGxpc3RfZW50cnkoc2VydmVyLT5jYl9wcm9taXNlcy5uZXh0LAorCQkJCSAgICBzdHJ1Y3QgYWZzX3Zub2RlLCB1cGRhdGUpOworCQl0aW1lb3V0ID0geHZub2RlLT51cGRhdGVfYXQgLSBub3c7CisJCWlmICh0aW1lb3V0IDwgMCkKKwkJCXRpbWVvdXQgPSAwOworCX0gZWxzZSB7CisJCXRpbWVvdXQgPSBhZnNfdm5vZGVfdXBkYXRlX3RpbWVvdXQ7CisJfQorCisJbGlzdF9hZGRfdGFpbCgmdm5vZGUtPnVwZGF0ZSwgJnNlcnZlci0+Y2JfcHJvbWlzZXMpOworCisJX2RlYnVnKCJ0aW1lb3V0ICVsZCIsIHRpbWVvdXQpOworCXF1ZXVlX2RlbGF5ZWRfd29yayhhZnNfdm5vZGVfdXBkYXRlX3dvcmtlciwKKwkJCSAgICZhZnNfdm5vZGVfdXBkYXRlLCB0aW1lb3V0ICogSFopOworCXNwaW5fdW5sb2NrKCZzZXJ2ZXItPmNiX2xvY2spOworCWFmc19wdXRfdm5vZGUodmwpOworfQorI2VuZGlmCisKKy8qCisgKiBpbml0aWFsaXNlIHRoZSBjYWxsYmFjayB1cGRhdGUgcHJvY2VzcworICovCitpbnQgX19pbml0IGFmc19jYWxsYmFja191cGRhdGVfaW5pdCh2b2lkKQoreworCWFmc19jYWxsYmFja191cGRhdGVfd29ya2VyID0KKwkJY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoImthZnNfY2FsbGJhY2tkIik7CisJcmV0dXJuIGFmc19jYWxsYmFja191cGRhdGVfd29ya2VyID8gMCA6IC1FTk9NRU07Cit9CisKKy8qCisgKiBzaHV0IGRvd24gdGhlIGNhbGxiYWNrIHVwZGF0ZSBwcm9jZXNzCisgKi8KK3ZvaWQgX19leGl0IGFmc19jYWxsYmFja191cGRhdGVfa2lsbCh2b2lkKQoreworCWRlc3Ryb3lfd29ya3F1ZXVlKGFmc19jYWxsYmFja191cGRhdGVfd29ya2VyKTsKK30KZGlmZiAtLWdpdCBhL2ZzL2Fmcy9jZWxsLmMgYi9mcy9hZnMvY2VsbC5jCmluZGV4IDFmYzU3ODMuLjliMTMxMWEgMTAwNjQ0Ci0tLSBhL2ZzL2Fmcy9jZWxsLmMKKysrIGIvZnMvYWZzL2NlbGwuYwpAQCAtMSw0ICsxLDQgQEAKLS8qIGNlbGwuYzogQUZTIGNlbGwgYW5kIHNlcnZlciByZWNvcmQgbWFuYWdlbWVudAorLyogQUZTIGNlbGwgYW5kIHNlcnZlciByZWNvcmQgbWFuYWdlbWVudAogICoKICAqIENvcHlyaWdodCAoQykgMjAwMiBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCkBAIC0xMSwxNSArMTEsOSBAQAogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPHJ4cnBjL3BlZXIuaD4KLSNpbmNsdWRlIDxyeHJwYy9jb25uZWN0aW9uLmg+Ci0jaW5jbHVkZSAidm9sdW1lLmgiCi0jaW5jbHVkZSAiY2VsbC5oIgotI2luY2x1ZGUgInNlcnZlci5oIgotI2luY2x1ZGUgInRyYW5zcG9ydC5oIgotI2luY2x1ZGUgInZsY2xpZW50LmgiCi0jaW5jbHVkZSAia2Fmc3RpbW9kLmgiCi0jaW5jbHVkZSAic3VwZXIuaCIKKyNpbmNsdWRlIDxsaW51eC9rZXkuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGtleXMvcnhycGMtdHlwZS5oPgogI2luY2x1ZGUgImludGVybmFsLmgiCiAKIERFQ0xBUkVfUldTRU0oYWZzX3Byb2NfY2VsbHNfc2VtKTsKQEAgLTI4LDY2ICsyMiw0NyBAQAogc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgYWZzX2NlbGxzID0gTElTVF9IRUFEX0lOSVQoYWZzX2NlbGxzKTsKIHN0YXRpYyBERUZJTkVfUldMT0NLKGFmc19jZWxsc19sb2NrKTsKIHN0YXRpYyBERUNMQVJFX1JXU0VNKGFmc19jZWxsc19zZW0pOyAvKiBhZGQvcmVtb3ZlIHNlcmlhbGlzYXRpb24gKi8KK3N0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChhZnNfY2VsbHNfZnJlZWFibGVfd3EpOwogc3RhdGljIHN0cnVjdCBhZnNfY2VsbCAqYWZzX2NlbGxfcm9vdDsKIAotI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKLXN0YXRpYyBjYWNoZWZzX21hdGNoX3ZhbF90IGFmc19jZWxsX2NhY2hlX21hdGNoKHZvaWQgKnRhcmdldCwKLQkJCQkJCWNvbnN0IHZvaWQgKmVudHJ5KTsKLXN0YXRpYyB2b2lkIGFmc19jZWxsX2NhY2hlX3VwZGF0ZSh2b2lkICpzb3VyY2UsIHZvaWQgKmVudHJ5KTsKLQotc3RydWN0IGNhY2hlZnNfaW5kZXhfZGVmIGFmc19jYWNoZV9jZWxsX2luZGV4X2RlZiA9IHsKLQkubmFtZQkJCT0gImNlbGxfaXgiLAotCS5kYXRhX3NpemUJCT0gc2l6ZW9mKHN0cnVjdCBhZnNfY2FjaGVfY2VsbCksCi0JLmtleXNbMF0JCT0geyBDQUNIRUZTX0lOREVYX0tFWVNfQVNDSUlaLCA2NCB9LAotCS5tYXRjaAkJCT0gYWZzX2NlbGxfY2FjaGVfbWF0Y2gsCi0JLnVwZGF0ZQkJCT0gYWZzX2NlbGxfY2FjaGVfdXBkYXRlLAotfTsKLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgotICogY3JlYXRlIGEgY2VsbCByZWNvcmQKLSAqIC0gIm5hbWUiIGlzIHRoZSBuYW1lIG9mIHRoZSBjZWxsCi0gKiAtICJ2bGxpc3QiIGlzIGEgY29sb24gc2VwYXJhdGVkIGxpc3Qgb2YgSVAgYWRkcmVzc2VzIGluICJhLmIuYy5kIiBmb3JtYXQKKyAqIGFsbG9jYXRlIGEgY2VsbCByZWNvcmQgYW5kIGZpbGwgaW4gaXRzIG5hbWUsIFZMIHNlcnZlciBhZGRyZXNzIGxpc3QgYW5kCisgKiBhbGxvY2F0ZSBhbiBhbm9ueW1vdXMga2V5CiAgKi8KLWludCBhZnNfY2VsbF9jcmVhdGUoY29uc3QgY2hhciAqbmFtZSwgY2hhciAqdmxsaXN0LCBzdHJ1Y3QgYWZzX2NlbGwgKipfY2VsbCkKK3N0YXRpYyBzdHJ1Y3QgYWZzX2NlbGwgKmFmc19jZWxsX2FsbG9jKGNvbnN0IGNoYXIgKm5hbWUsIGNoYXIgKnZsbGlzdCkKIHsKIAlzdHJ1Y3QgYWZzX2NlbGwgKmNlbGw7Ci0JY2hhciAqbmV4dDsKKwlzaXplX3QgbmFtZWxlbjsKKwljaGFyIGtleW5hbWVbNCArIEFGU19NQVhDRUxMTkFNRSArIDFdLCAqY3AsICpkcCwgKm5leHQ7CiAJaW50IHJldDsKIAotCV9lbnRlcigiJXMiLCBuYW1lKTsKKwlfZW50ZXIoIiVzLCVzIiwgbmFtZSwgdmxsaXN0KTsKIAogCUJVR19PTighbmFtZSk7IC8qIFRPRE86IHdhbnQgdG8gbG9vayB1cCAidGhpcyBjZWxsIiBpbiB0aGUgY2FjaGUgKi8KIAorCW5hbWVsZW4gPSBzdHJsZW4obmFtZSk7CisJaWYgKG5hbWVsZW4gPiBBRlNfTUFYQ0VMTE5BTUUpCisJCXJldHVybiBFUlJfUFRSKC1FTkFNRVRPT0xPTkcpOworCiAJLyogYWxsb2NhdGUgYW5kIGluaXRpYWxpc2UgYSBjZWxsIHJlY29yZCAqLwotCWNlbGwgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYWZzX2NlbGwpICsgc3RybGVuKG5hbWUpICsgMSwgR0ZQX0tFUk5FTCk7CisJY2VsbCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhZnNfY2VsbCkgKyBuYW1lbGVuICsgMSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFjZWxsKSB7CiAJCV9sZWF2ZSgiID0gLUVOT01FTSIpOwotCQlyZXR1cm4gLUVOT01FTTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAJfQogCi0JZG93bl93cml0ZSgmYWZzX2NlbGxzX3NlbSk7CisJbWVtY3B5KGNlbGwtPm5hbWUsIG5hbWUsIG5hbWVsZW4pOworCWNlbGwtPm5hbWVbbmFtZWxlbl0gPSAwOwogCi0JbWVtc2V0KGNlbGwsIDAsIHNpemVvZihzdHJ1Y3QgYWZzX2NlbGwpKTsKLQlhdG9taWNfc2V0KCZjZWxsLT51c2FnZSwgMCk7Ci0KKwlhdG9taWNfc2V0KCZjZWxsLT51c2FnZSwgMSk7CiAJSU5JVF9MSVNUX0hFQUQoJmNlbGwtPmxpbmspOwotCi0Jcndsb2NrX2luaXQoJmNlbGwtPnN2X2xvY2spOwotCUlOSVRfTElTVF9IRUFEKCZjZWxsLT5zdl9saXN0KTsKLQlJTklUX0xJU1RfSEVBRCgmY2VsbC0+c3ZfZ3JhdmV5YXJkKTsKLQlzcGluX2xvY2tfaW5pdCgmY2VsbC0+c3ZfZ3lsb2NrKTsKLQorCXJ3bG9ja19pbml0KCZjZWxsLT5zZXJ2ZXJzX2xvY2spOworCUlOSVRfTElTVF9IRUFEKCZjZWxsLT5zZXJ2ZXJzKTsKIAlpbml0X3J3c2VtKCZjZWxsLT52bF9zZW0pOwogCUlOSVRfTElTVF9IRUFEKCZjZWxsLT52bF9saXN0KTsKLQlJTklUX0xJU1RfSEVBRCgmY2VsbC0+dmxfZ3JhdmV5YXJkKTsKLQlzcGluX2xvY2tfaW5pdCgmY2VsbC0+dmxfZ3lsb2NrKTsKLQotCXN0cmNweShjZWxsLT5uYW1lLG5hbWUpOworCXNwaW5fbG9ja19pbml0KCZjZWxsLT52bF9sb2NrKTsKIAogCS8qIGZpbGwgaW4gdGhlIFZMIHNlcnZlciBsaXN0IGZyb20gdGhlIHJlc3Qgb2YgdGhlIHN0cmluZyAqLwotCXJldCA9IC1FSU5WQUw7CiAJZG8gewogCQl1bnNpZ25lZCBhLCBiLCBjLCBkOwogCkBAIC05NiwyMCArNzEsNzUgQEAKIAkJCSpuZXh0KysgPSAwOwogCiAJCWlmIChzc2NhbmYodmxsaXN0LCAiJXUuJXUuJXUuJXUiLCAmYSwgJmIsICZjLCAmZCkgIT0gNCkKLQkJCWdvdG8gYmFkYWRkcjsKKwkJCWdvdG8gYmFkX2FkZHJlc3M7CiAKIAkJaWYgKGEgPiAyNTUgfHwgYiA+IDI1NSB8fCBjID4gMjU1IHx8IGQgPiAyNTUpCi0JCQlnb3RvIGJhZGFkZHI7CisJCQlnb3RvIGJhZF9hZGRyZXNzOwogCiAJCWNlbGwtPnZsX2FkZHJzW2NlbGwtPnZsX25hZGRycysrXS5zX2FkZHIgPQogCQkJaHRvbmwoKGEgPDwgMjQpIHwgKGIgPDwgMTYpIHwgKGMgPDwgOCkgfCBkKTsKIAotCQlpZiAoY2VsbC0+dmxfbmFkZHJzID49IEFGU19DRUxMX01BWF9BRERSUykKLQkJCWJyZWFrOworCX0gd2hpbGUgKGNlbGwtPnZsX25hZGRycyA8IEFGU19DRUxMX01BWF9BRERSUyAmJiAodmxsaXN0ID0gbmV4dCkpOwogCi0JfSB3aGlsZSh2bGxpc3QgPSBuZXh0LCB2bGxpc3QpOworCS8qIGNyZWF0ZSBhIGtleSB0byByZXByZXNlbnQgYW4gYW5vbnltb3VzIHVzZXIgKi8KKwltZW1jcHkoa2V5bmFtZSwgImFmc0AiLCA0KTsKKwlkcCA9IGtleW5hbWUgKyA0OworCWNwID0gY2VsbC0+bmFtZTsKKwlkbyB7CisJCSpkcCsrID0gdG91cHBlcigqY3ApOworCX0gd2hpbGUgKCpjcCsrKTsKKwljZWxsLT5hbm9ueW1vdXNfa2V5ID0ga2V5X2FsbG9jKCZrZXlfdHlwZV9yeHJwYywga2V5bmFtZSwgMCwgMCwgY3VycmVudCwKKwkJCQkJS0VZX1BPU19TRUFSQ0gsIEtFWV9BTExPQ19OT1RfSU5fUVVPVEEpOworCWlmIChJU19FUlIoY2VsbC0+YW5vbnltb3VzX2tleSkpIHsKKwkJX2RlYnVnKCJubyBrZXkiKTsKKwkJcmV0ID0gUFRSX0VSUihjZWxsLT5hbm9ueW1vdXNfa2V5KTsKKwkJZ290byBlcnJvcjsKKwl9CiAKLQkvKiBhZGQgYSBwcm9jIGRpciBmb3IgdGhpcyBjZWxsICovCisJcmV0ID0ga2V5X2luc3RhbnRpYXRlX2FuZF9saW5rKGNlbGwtPmFub255bW91c19rZXksIE5VTEwsIDAsCisJCQkJICAgICAgIE5VTEwsIE5VTEwpOworCWlmIChyZXQgPCAwKSB7CisJCV9kZWJ1ZygiaW5zdGFudGlhdGUgZmFpbGVkIik7CisJCWdvdG8gZXJyb3I7CisJfQorCisJX2RlYnVnKCJhbm9uIGtleSAlcHsleH0iLAorCSAgICAgICBjZWxsLT5hbm9ueW1vdXNfa2V5LCBrZXlfc2VyaWFsKGNlbGwtPmFub255bW91c19rZXkpKTsKKworCV9sZWF2ZSgiID0gJXAiLCBjZWxsKTsKKwlyZXR1cm4gY2VsbDsKKworYmFkX2FkZHJlc3M6CisJcHJpbnRrKEtFUk5fRVJSICJrQUZTOiBiYWQgVkwgc2VydmVyIElQIGFkZHJlc3NcbiIpOworCXJldCA9IC1FSU5WQUw7CitlcnJvcjoKKwlrZXlfcHV0KGNlbGwtPmFub255bW91c19rZXkpOworCWtmcmVlKGNlbGwpOworCV9sZWF2ZSgiID0gJWQiLCByZXQpOworCXJldHVybiBFUlJfUFRSKHJldCk7Cit9CisKKy8qCisgKiBjcmVhdGUgYSBjZWxsIHJlY29yZAorICogLSAibmFtZSIgaXMgdGhlIG5hbWUgb2YgdGhlIGNlbGwKKyAqIC0gInZsbGlzdCIgaXMgYSBjb2xvbiBzZXBhcmF0ZWQgbGlzdCBvZiBJUCBhZGRyZXNzZXMgaW4gImEuYi5jLmQiIGZvcm1hdAorICovCitzdHJ1Y3QgYWZzX2NlbGwgKmFmc19jZWxsX2NyZWF0ZShjb25zdCBjaGFyICpuYW1lLCBjaGFyICp2bGxpc3QpCit7CisJc3RydWN0IGFmc19jZWxsICpjZWxsOworCWludCByZXQ7CisKKwlfZW50ZXIoIiVzLCVzIiwgbmFtZSwgdmxsaXN0KTsKKworCWNlbGwgPSBhZnNfY2VsbF9hbGxvYyhuYW1lLCB2bGxpc3QpOworCWlmIChJU19FUlIoY2VsbCkpIHsKKwkJX2xlYXZlKCIgPSAlbGQiLCBQVFJfRVJSKGNlbGwpKTsKKwkJcmV0dXJuIGNlbGw7CisJfQorCisJZG93bl93cml0ZSgmYWZzX2NlbGxzX3NlbSk7CisKKwkvKiBhZGQgYSBwcm9jIGRpcmVjdG9yeSBmb3IgdGhpcyBjZWxsICovCiAJcmV0ID0gYWZzX3Byb2NfY2VsbF9zZXR1cChjZWxsKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBlcnJvcjsKQEAgLTEzMCwzMSArMTYwLDI4IEBACiAJZG93bl93cml0ZSgmYWZzX3Byb2NfY2VsbHNfc2VtKTsKIAlsaXN0X2FkZF90YWlsKCZjZWxsLT5wcm9jX2xpbmssICZhZnNfcHJvY19jZWxscyk7CiAJdXBfd3JpdGUoJmFmc19wcm9jX2NlbGxzX3NlbSk7Ci0KLQkqX2NlbGwgPSBjZWxsOwogCXVwX3dyaXRlKCZhZnNfY2VsbHNfc2VtKTsKIAotCV9sZWF2ZSgiID0gMCAoJXApIiwgY2VsbCk7Ci0JcmV0dXJuIDA7CisJX2xlYXZlKCIgPSAlcCIsIGNlbGwpOworCXJldHVybiBjZWxsOwogCi0gYmFkYWRkcjoKLQlwcmludGsoS0VSTl9FUlIgImtBRlM6IGJhZCBWTCBzZXJ2ZXIgSVAgYWRkcmVzczogJyVzJ1xuIiwgdmxsaXN0KTsKLSBlcnJvcjoKK2Vycm9yOgogCXVwX3dyaXRlKCZhZnNfY2VsbHNfc2VtKTsKKwlrZXlfcHV0KGNlbGwtPmFub255bW91c19rZXkpOwogCWtmcmVlKGNlbGwpOwogCV9sZWF2ZSgiID0gJWQiLCByZXQpOwotCXJldHVybiByZXQ7Ci19IC8qIGVuZCBhZnNfY2VsbF9jcmVhdGUoKSAqLworCXJldHVybiBFUlJfUFRSKHJldCk7Cit9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCi0gKiBpbml0aWFsaXNlIHRoZSBjZWxsIGRhdGFiYXNlIGZyb20gbW9kdWxlIHBhcmFtZXRlcnMKKyAqIHNldCB0aGUgcm9vdCBjZWxsIGluZm9ybWF0aW9uCisgKiAtIGNhbiBiZSBjYWxsZWQgd2l0aCBhIG1vZHVsZSBwYXJhbWV0ZXIgc3RyaW5nCisgKiAtIGNhbiBiZSBjYWxsZWQgZnJvbSBhIHdyaXRlIHRvIC9wcm9jL2ZzL2Fmcy9yb290Y2VsbAogICovCiBpbnQgYWZzX2NlbGxfaW5pdChjaGFyICpyb290Y2VsbCkKIHsKIAlzdHJ1Y3QgYWZzX2NlbGwgKm9sZF9yb290LCAqbmV3X3Jvb3Q7CiAJY2hhciAqY3A7Ci0JaW50IHJldDsKIAogCV9lbnRlcigiIik7CiAKQEAgLTE2Miw4MiArMTg5LDYwIEBACiAJCS8qIG1vZHVsZSBpcyBsb2FkZWQgd2l0aCBubyBwYXJhbWV0ZXJzLCBvciBidWlsdCBzdGF0aWNhbGx5LgogCQkgKiAtIGluIHRoZSBmdXR1cmUgd2UgbWlnaHQgaW5pdGlhbGl6ZSBjZWxsIERCIGhlcmUuCiAJCSAqLwotCQlfbGVhdmUoIiA9IDAgKGJ1dCBubyByb290KSIpOworCQlfbGVhdmUoIiA9IDAgW25vIHJvb3RdIik7CiAJCXJldHVybiAwOwogCX0KIAogCWNwID0gc3RyY2hyKHJvb3RjZWxsLCAnOicpOwogCWlmICghY3ApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJrQUZTOiBubyBWTCBzZXJ2ZXIgSVAgYWRkcmVzc2VzIHNwZWNpZmllZFxuIik7Ci0JCV9sZWF2ZSgiID0gJWQgKG5vIGNvbG9uKSIsIC1FSU5WQUwpOworCQlfbGVhdmUoIiA9IC1FSU5WQUwiKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJLyogYWxsb2NhdGUgYSBjZWxsIHJlY29yZCBmb3IgdGhlIHJvb3QgY2VsbCAqLwogCSpjcCsrID0gMDsKLQlyZXQgPSBhZnNfY2VsbF9jcmVhdGUocm9vdGNlbGwsIGNwLCAmbmV3X3Jvb3QpOwotCWlmIChyZXQgPCAwKSB7Ci0JCV9sZWF2ZSgiID0gJWQiLCByZXQpOwotCQlyZXR1cm4gcmV0OworCW5ld19yb290ID0gYWZzX2NlbGxfY3JlYXRlKHJvb3RjZWxsLCBjcCk7CisJaWYgKElTX0VSUihuZXdfcm9vdCkpIHsKKwkJX2xlYXZlKCIgPSAlbGQiLCBQVFJfRVJSKG5ld19yb290KSk7CisJCXJldHVybiBQVFJfRVJSKG5ld19yb290KTsKIAl9CiAKLQkvKiBhcyBhZnNfcHV0X2NlbGwoKSB0YWtlcyBsb2NrcyBieSBpdHNlbGYsIHdlIGhhdmUgdG8gZG8KLQkgKiBhIGxpdHRsZSBneW1uYXN0aWNzIHRvIGJlIHJhY2UtZnJlZS4KLQkgKi8KLQlhZnNfZ2V0X2NlbGwobmV3X3Jvb3QpOwotCisJLyogaW5zdGFsbCB0aGUgbmV3IGNlbGwgKi8KIAl3cml0ZV9sb2NrKCZhZnNfY2VsbHNfbG9jayk7Ci0Jd2hpbGUgKGFmc19jZWxsX3Jvb3QpIHsKLQkJb2xkX3Jvb3QgPSBhZnNfY2VsbF9yb290OwotCQlhZnNfY2VsbF9yb290ID0gTlVMTDsKLQkJd3JpdGVfdW5sb2NrKCZhZnNfY2VsbHNfbG9jayk7Ci0JCWFmc19wdXRfY2VsbChvbGRfcm9vdCk7Ci0JCXdyaXRlX2xvY2soJmFmc19jZWxsc19sb2NrKTsKLQl9CisJb2xkX3Jvb3QgPSBhZnNfY2VsbF9yb290OwogCWFmc19jZWxsX3Jvb3QgPSBuZXdfcm9vdDsKIAl3cml0ZV91bmxvY2soJmFmc19jZWxsc19sb2NrKTsKKwlhZnNfcHV0X2NlbGwob2xkX3Jvb3QpOwogCi0JX2xlYXZlKCIgPSAlZCIsIHJldCk7Ci0JcmV0dXJuIHJldDsKKwlfbGVhdmUoIiA9IDAiKTsKKwlyZXR1cm4gMDsKK30KIAotfSAvKiBlbmQgYWZzX2NlbGxfaW5pdCgpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCiAgKiBsb29rdXAgYSBjZWxsIHJlY29yZAogICovCi1pbnQgYWZzX2NlbGxfbG9va3VwKGNvbnN0IGNoYXIgKm5hbWUsIHVuc2lnbmVkIG5hbWVzeiwgc3RydWN0IGFmc19jZWxsICoqX2NlbGwpCitzdHJ1Y3QgYWZzX2NlbGwgKmFmc19jZWxsX2xvb2t1cChjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBuYW1lc3opCiB7CiAJc3RydWN0IGFmc19jZWxsICpjZWxsOwotCWludCByZXQ7CiAKIAlfZW50ZXIoIlwiJSouKnNcIiwiLCBuYW1lc3osIG5hbWVzeiwgbmFtZSA/IG5hbWUgOiAiIik7CiAKLQkqX2NlbGwgPSBOVUxMOworCWRvd25fcmVhZCgmYWZzX2NlbGxzX3NlbSk7CisJcmVhZF9sb2NrKCZhZnNfY2VsbHNfbG9jayk7CiAKIAlpZiAobmFtZSkgewogCQkvKiBpZiB0aGUgY2VsbCB3YXMgbmFtZWQsIGxvb2sgZm9yIGl0IGluIHRoZSBjZWxsIHJlY29yZCBsaXN0ICovCi0JCXJldCA9IC1FTk9FTlQ7Ci0JCWNlbGwgPSBOVUxMOwotCQlyZWFkX2xvY2soJmFmc19jZWxsc19sb2NrKTsKLQogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNlbGwsICZhZnNfY2VsbHMsIGxpbmspIHsKIAkJCWlmIChzdHJuY21wKGNlbGwtPm5hbWUsIG5hbWUsIG5hbWVzeikgPT0gMCkgewogCQkJCWFmc19nZXRfY2VsbChjZWxsKTsKIAkJCQlnb3RvIGZvdW5kOwogCQkJfQogCQl9Ci0JCWNlbGwgPSBOVUxMOworCQljZWxsID0gRVJSX1BUUigtRU5PRU5UKTsKIAlmb3VuZDoKLQotCQlyZWFkX3VubG9jaygmYWZzX2NlbGxzX2xvY2spOwotCi0JCWlmIChjZWxsKQotCQkJcmV0ID0gMDsKLQl9Ci0JZWxzZSB7Ci0JCXJlYWRfbG9jaygmYWZzX2NlbGxzX2xvY2spOwotCisJCTsKKwl9IGVsc2UgewogCQljZWxsID0gYWZzX2NlbGxfcm9vdDsKIAkJaWYgKCFjZWxsKSB7CiAJCQkvKiB0aGlzIHNob3VsZCBub3QgaGFwcGVuIHVubGVzcyB1c2VyIHRyaWVzIHRvIG1vdW50CkBAIC0yNDYsNDQgKzI1MSwzNSBAQAogCQkJICogRU5PRU5UIG1pZ2h0IGJlICJtb3JlIGFwcHJvcHJpYXRlIiBidXQgdGhleSBoYXBwZW4KIAkJCSAqIGZvciBvdGhlciByZWFzb25zLgogCQkJICovCi0JCQlyZXQgPSAtRURFU1RBRERSUkVROwotCQl9Ci0JCWVsc2UgeworCQkJY2VsbCA9IEVSUl9QVFIoLUVERVNUQUREUlJFUSk7CisJCX0gZWxzZSB7CiAJCQlhZnNfZ2V0X2NlbGwoY2VsbCk7Ci0JCQlyZXQgPSAwOwogCQl9CiAKLQkJcmVhZF91bmxvY2soJmFmc19jZWxsc19sb2NrKTsKIAl9CiAKLQkqX2NlbGwgPSBjZWxsOwotCV9sZWF2ZSgiID0gJWQgKCVwKSIsIHJldCwgY2VsbCk7Ci0JcmV0dXJuIHJldDsKKwlyZWFkX3VubG9jaygmYWZzX2NlbGxzX2xvY2spOworCXVwX3JlYWQoJmFmc19jZWxsc19zZW0pOworCV9sZWF2ZSgiID0gJXAiLCBjZWxsKTsKKwlyZXR1cm4gY2VsbDsKK30KIAotfSAvKiBlbmQgYWZzX2NlbGxfbG9va3VwKCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAqIHRyeSBhbmQgZ2V0IGEgY2VsbCByZWNvcmQKICAqLwotc3RydWN0IGFmc19jZWxsICphZnNfZ2V0X2NlbGxfbWF5YmUoc3RydWN0IGFmc19jZWxsICoqX2NlbGwpCitzdHJ1Y3QgYWZzX2NlbGwgKmFmc19nZXRfY2VsbF9tYXliZShzdHJ1Y3QgYWZzX2NlbGwgKmNlbGwpCiB7Ci0Jc3RydWN0IGFmc19jZWxsICpjZWxsOwotCiAJd3JpdGVfbG9jaygmYWZzX2NlbGxzX2xvY2spOwogCi0JY2VsbCA9ICpfY2VsbDsKIAlpZiAoY2VsbCAmJiAhbGlzdF9lbXB0eSgmY2VsbC0+bGluaykpCiAJCWFmc19nZXRfY2VsbChjZWxsKTsKIAllbHNlCiAJCWNlbGwgPSBOVUxMOwogCiAJd3JpdGVfdW5sb2NrKCZhZnNfY2VsbHNfbG9jayk7Ci0KIAlyZXR1cm4gY2VsbDsKLX0gLyogZW5kIGFmc19nZXRfY2VsbF9tYXliZSgpICovCit9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCiAgKiBkZXN0cm95IGEgY2VsbCByZWNvcmQKICAqLwpAQCAtMjk0LDggKzI5MCw3IEBACiAKIAlfZW50ZXIoIiVweyVkLCVzfSIsIGNlbGwsIGF0b21pY19yZWFkKCZjZWxsLT51c2FnZSksIGNlbGwtPm5hbWUpOwogCi0JLyogc2FuaXR5IGNoZWNrICovCi0JQlVHX09OKGF0b21pY19yZWFkKCZjZWxsLT51c2FnZSkgPD0gMCk7CisJQVNTRVJUQ01QKGF0b21pY19yZWFkKCZjZWxsLT51c2FnZSksID4sIDApOwogCiAJLyogdG8gcHJldmVudCBhIHJhY2UsIHRoZSBkZWNyZW1lbnQgYW5kIHRoZSBkZXF1ZXVlIG11c3QgYmUgZWZmZWN0aXZlbHkKIAkgKiBhdG9taWMgKi8KQEAgLTMwNywzNiArMzAyLDQ5IEBACiAJCXJldHVybjsKIAl9CiAKKwlBU1NFUlQobGlzdF9lbXB0eSgmY2VsbC0+c2VydmVycykpOworCUFTU0VSVChsaXN0X2VtcHR5KCZjZWxsLT52bF9saXN0KSk7CisKIAl3cml0ZV91bmxvY2soJmFmc19jZWxsc19sb2NrKTsKIAotCUJVR19PTighbGlzdF9lbXB0eSgmY2VsbC0+c3ZfbGlzdCkpOwotCUJVR19PTighbGlzdF9lbXB0eSgmY2VsbC0+c3ZfZ3JhdmV5YXJkKSk7Ci0JQlVHX09OKCFsaXN0X2VtcHR5KCZjZWxsLT52bF9saXN0KSk7Ci0JQlVHX09OKCFsaXN0X2VtcHR5KCZjZWxsLT52bF9ncmF2ZXlhcmQpKTsKKwl3YWtlX3VwKCZhZnNfY2VsbHNfZnJlZWFibGVfd3EpOwogCiAJX2xlYXZlKCIgW3VudXNlZF0iKTsKLX0gLyogZW5kIGFmc19wdXRfY2VsbCgpICovCit9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCiAgKiBkZXN0cm95IGEgY2VsbCByZWNvcmQKKyAqIC0gbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgYWZzX2NlbGxzX3NlbSB3cml0ZS1sb2NrZWQKKyAqIC0gY2VsbC0+bGluayBzaG91bGQgaGF2ZSBiZWVuIGJyb2tlbiBieSB0aGUgY2FsbGVyCiAgKi8KIHN0YXRpYyB2b2lkIGFmc19jZWxsX2Rlc3Ryb3koc3RydWN0IGFmc19jZWxsICpjZWxsKQogewogCV9lbnRlcigiJXB7JWQsJXN9IiwgY2VsbCwgYXRvbWljX3JlYWQoJmNlbGwtPnVzYWdlKSwgY2VsbC0+bmFtZSk7CiAKLQkvKiB0byBwcmV2ZW50IGEgcmFjZSwgdGhlIGRlY3JlbWVudCBhbmQgdGhlIGRlcXVldWUgbXVzdCBiZSBlZmZlY3RpdmVseQotCSAqIGF0b21pYyAqLwotCXdyaXRlX2xvY2soJmFmc19jZWxsc19sb2NrKTsKKwlBU1NFUlRDTVAoYXRvbWljX3JlYWQoJmNlbGwtPnVzYWdlKSwgPj0sIDApOworCUFTU0VSVChsaXN0X2VtcHR5KCZjZWxsLT5saW5rKSk7CiAKLQkvKiBzYW5pdHkgY2hlY2sgKi8KLQlCVUdfT04oYXRvbWljX3JlYWQoJmNlbGwtPnVzYWdlKSAhPSAwKTsKKwkvKiB3YWl0IGZvciBldmVyeW9uZSB0byBzdG9wIHVzaW5nIHRoZSBjZWxsICovCisJaWYgKGF0b21pY19yZWFkKCZjZWxsLT51c2FnZSkgPiAwKSB7CisJCURFQ0xBUkVfV0FJVFFVRVVFKG15c2VsZiwgY3VycmVudCk7CiAKLQlsaXN0X2RlbF9pbml0KCZjZWxsLT5saW5rKTsKKwkJX2RlYnVnKCJ3YWl0IGZvciBjZWxsICVzIiwgY2VsbC0+bmFtZSk7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJYWRkX3dhaXRfcXVldWUoJmFmc19jZWxsc19mcmVlYWJsZV93cSwgJm15c2VsZik7CiAKLQl3cml0ZV91bmxvY2soJmFmc19jZWxsc19sb2NrKTsKKwkJd2hpbGUgKGF0b21pY19yZWFkKCZjZWxsLT51c2FnZSkgPiAwKSB7CisJCQlzY2hlZHVsZSgpOworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQl9CiAKLQlkb3duX3dyaXRlKCZhZnNfY2VsbHNfc2VtKTsKKwkJcmVtb3ZlX3dhaXRfcXVldWUoJmFmc19jZWxsc19mcmVlYWJsZV93cSwgJm15c2VsZik7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJfQorCisJX2RlYnVnKCJjZWxsIGRlYWQiKTsKKwlBU1NFUlRDTVAoYXRvbWljX3JlYWQoJmNlbGwtPnVzYWdlKSwgPT0sIDApOworCUFTU0VSVChsaXN0X2VtcHR5KCZjZWxsLT5zZXJ2ZXJzKSk7CisJQVNTRVJUKGxpc3RfZW1wdHkoJmNlbGwtPnZsX2xpc3QpKTsKIAogCWFmc19wcm9jX2NlbGxfcmVtb3ZlKGNlbGwpOwogCkBAIC0zNDgsMTA0ICszNTYsMjYgQEAKIAljYWNoZWZzX3JlbGlucXVpc2hfY29va2llKGNlbGwtPmNhY2hlLCAwKTsKICNlbmRpZgogCi0JdXBfd3JpdGUoJmFmc19jZWxsc19zZW0pOwotCi0JQlVHX09OKCFsaXN0X2VtcHR5KCZjZWxsLT5zdl9saXN0KSk7Ci0JQlVHX09OKCFsaXN0X2VtcHR5KCZjZWxsLT5zdl9ncmF2ZXlhcmQpKTsKLQlCVUdfT04oIWxpc3RfZW1wdHkoJmNlbGwtPnZsX2xpc3QpKTsKLQlCVUdfT04oIWxpc3RfZW1wdHkoJmNlbGwtPnZsX2dyYXZleWFyZCkpOwotCi0JLyogZmluaXNoIGNsZWFuaW5nIHVwIHRoZSBjZWxsICovCisJa2V5X3B1dChjZWxsLT5hbm9ueW1vdXNfa2V5KTsKIAlrZnJlZShjZWxsKTsKIAogCV9sZWF2ZSgiIFtkZXN0cm95ZWRdIik7Ci19IC8qIGVuZCBhZnNfY2VsbF9kZXN0cm95KCkgKi8KK30KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIGxvb2t1cCB0aGUgc2VydmVyIHJlY29yZCBjb3JyZXNwb25kaW5nIHRvIGFuIFJ4IFJQQyBwZWVyCi0gKi8KLWludCBhZnNfc2VydmVyX2ZpbmRfYnlfcGVlcihjb25zdCBzdHJ1Y3QgcnhycGNfcGVlciAqcGVlciwKLQkJCSAgICBzdHJ1Y3QgYWZzX3NlcnZlciAqKl9zZXJ2ZXIpCi17Ci0Jc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlcjsKLQlzdHJ1Y3QgYWZzX2NlbGwgKmNlbGw7Ci0KLQlfZW50ZXIoIiVwe2E9JTA4eH0sIiwgcGVlciwgbnRvaGwocGVlci0+YWRkci5zX2FkZHIpKTsKLQotCS8qIHNlYXJjaCB0aGUgY2VsbCBsaXN0ICovCi0JcmVhZF9sb2NrKCZhZnNfY2VsbHNfbG9jayk7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNlbGwsICZhZnNfY2VsbHMsIGxpbmspIHsKLQotCQlfZGVidWcoIj8gY2VsbCAlcyIsY2VsbC0+bmFtZSk7Ci0KLQkJd3JpdGVfbG9jaygmY2VsbC0+c3ZfbG9jayk7Ci0KLQkJLyogY2hlY2sgdGhlIGFjdGl2ZSBsaXN0ICovCi0JCWxpc3RfZm9yX2VhY2hfZW50cnkoc2VydmVyLCAmY2VsbC0+c3ZfbGlzdCwgbGluaykgewotCQkJX2RlYnVnKCI/PyBzZXJ2ZXIgJTA4eCIsIG50b2hsKHNlcnZlci0+YWRkci5zX2FkZHIpKTsKLQotCQkJaWYgKG1lbWNtcCgmc2VydmVyLT5hZGRyLCAmcGVlci0+YWRkciwKLQkJCQkgICBzaXplb2Yoc3RydWN0IGluX2FkZHIpKSA9PSAwKQotCQkJCWdvdG8gZm91bmRfc2VydmVyOwotCQl9Ci0KLQkJLyogY2hlY2sgdGhlIGluYWN0aXZlIGxpc3QgKi8KLQkJc3Bpbl9sb2NrKCZjZWxsLT5zdl9neWxvY2spOwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNlcnZlciwgJmNlbGwtPnN2X2dyYXZleWFyZCwgbGluaykgewotCQkJX2RlYnVnKCI/PyBkZWFkIHNlcnZlciAlMDh4IiwKLQkJCSAgICAgICBudG9obChzZXJ2ZXItPmFkZHIuc19hZGRyKSk7Ci0KLQkJCWlmIChtZW1jbXAoJnNlcnZlci0+YWRkciwgJnBlZXItPmFkZHIsCi0JCQkJICAgc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSkgPT0gMCkKLQkJCQlnb3RvIGZvdW5kX2RlYWRfc2VydmVyOwotCQl9Ci0JCXNwaW5fdW5sb2NrKCZjZWxsLT5zdl9neWxvY2spOwotCi0JCXdyaXRlX3VubG9jaygmY2VsbC0+c3ZfbG9jayk7Ci0JfQotCXJlYWRfdW5sb2NrKCZhZnNfY2VsbHNfbG9jayk7Ci0KLQlfbGVhdmUoIiA9IC1FTk9FTlQiKTsKLQlyZXR1cm4gLUVOT0VOVDsKLQotCS8qIHdlIGZvdW5kIGl0IGluIHRoZSBncmF2ZXlhcmQgLSByZXN1cnJlY3QgaXQgKi8KLSBmb3VuZF9kZWFkX3NlcnZlcjoKLQlsaXN0X21vdmVfdGFpbCgmc2VydmVyLT5saW5rLCAmY2VsbC0+c3ZfbGlzdCk7Ci0JYWZzX2dldF9zZXJ2ZXIoc2VydmVyKTsKLQlhZnNfa2Fmc3RpbW9kX2RlbF90aW1lcigmc2VydmVyLT50aW1lb3V0KTsKLQlzcGluX3VubG9jaygmY2VsbC0+c3ZfZ3lsb2NrKTsKLQlnb3RvIHN1Y2Nlc3M7Ci0KLQkvKiB3ZSBmb3VuZCBpdCAtIGluY3JlbWVudCBpdHMgcmVmIGNvdW50IGFuZCByZXR1cm4gaXQgKi8KLSBmb3VuZF9zZXJ2ZXI6Ci0JYWZzX2dldF9zZXJ2ZXIoc2VydmVyKTsKLQotIHN1Y2Nlc3M6Ci0Jd3JpdGVfdW5sb2NrKCZjZWxsLT5zdl9sb2NrKTsKLQlyZWFkX3VubG9jaygmYWZzX2NlbGxzX2xvY2spOwotCi0JKl9zZXJ2ZXIgPSBzZXJ2ZXI7Ci0JX2xlYXZlKCIgPSAwIChzPSVwIGM9JXApIiwgc2VydmVyLCBjZWxsKTsKLQlyZXR1cm4gMDsKLQotfSAvKiBlbmQgYWZzX3NlcnZlcl9maW5kX2J5X3BlZXIoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICogcHVyZ2UgaW4tbWVtb3J5IGNlbGwgZGF0YWJhc2Ugb24gbW9kdWxlIHVubG9hZCBvciBhZnNfaW5pdCgpIGZhaWx1cmUKICAqIC0gdGhlIHRpbWVvdXQgZGFlbW9uIGlzIHN0b3BwZWQgYmVmb3JlIGNhbGxpbmcgdGhpcwogICovCiB2b2lkIGFmc19jZWxsX3B1cmdlKHZvaWQpCiB7Ci0Jc3RydWN0IGFmc192bG9jYXRpb24gKnZsb2NhdGlvbjsKIAlzdHJ1Y3QgYWZzX2NlbGwgKmNlbGw7CiAKIAlfZW50ZXIoIiIpOwogCiAJYWZzX3B1dF9jZWxsKGFmc19jZWxsX3Jvb3QpOwogCisJZG93bl93cml0ZSgmYWZzX2NlbGxzX3NlbSk7CisKIAl3aGlsZSAoIWxpc3RfZW1wdHkoJmFmc19jZWxscykpIHsKIAkJY2VsbCA9IE5VTEw7CiAKQEAgLTQ2NCwxMDQgKzM5NCwxMSBAQAogCQkJX2RlYnVnKCJQVVJHSU5HIENFTEwgJXMgKCVkKSIsCiAJCQkgICAgICAgY2VsbC0+bmFtZSwgYXRvbWljX3JlYWQoJmNlbGwtPnVzYWdlKSk7CiAKLQkJCUJVR19PTighbGlzdF9lbXB0eSgmY2VsbC0+c3ZfbGlzdCkpOwotCQkJQlVHX09OKCFsaXN0X2VtcHR5KCZjZWxsLT52bF9saXN0KSk7Ci0KLQkJCS8qIHB1cmdlIHRoZSBjZWxsJ3MgVkwgZ3JhdmV5YXJkIGxpc3QgKi8KLQkJCV9kZWJ1ZygiIC0gY2xlYXJpbmcgVkwgZ3JhdmV5YXJkIik7Ci0KLQkJCXNwaW5fbG9jaygmY2VsbC0+dmxfZ3lsb2NrKTsKLQotCQkJd2hpbGUgKCFsaXN0X2VtcHR5KCZjZWxsLT52bF9ncmF2ZXlhcmQpKSB7Ci0JCQkJdmxvY2F0aW9uID0gbGlzdF9lbnRyeShjZWxsLT52bF9ncmF2ZXlhcmQubmV4dCwKLQkJCQkJCSAgICAgICBzdHJ1Y3QgYWZzX3Zsb2NhdGlvbiwKLQkJCQkJCSAgICAgICBsaW5rKTsKLQkJCQlsaXN0X2RlbF9pbml0KCZ2bG9jYXRpb24tPmxpbmspOwotCi0JCQkJYWZzX2thZnN0aW1vZF9kZWxfdGltZXIoJnZsb2NhdGlvbi0+dGltZW91dCk7Ci0KLQkJCQlzcGluX3VubG9jaygmY2VsbC0+dmxfZ3lsb2NrKTsKLQotCQkJCWFmc192bG9jYXRpb25fZG9fdGltZW91dCh2bG9jYXRpb24pOwotCQkJCS8qIFRPRE86IHJhY2UgaWYgbW92ZSB0byB1c2Uga3J4dGltb2QgaW5zdGVhZAotCQkJCSAqIG9mIGthZnN0aW1vZCAqLwotCi0JCQkJc3Bpbl9sb2NrKCZjZWxsLT52bF9neWxvY2spOwotCQkJfQotCi0JCQlzcGluX3VubG9jaygmY2VsbC0+dmxfZ3lsb2NrKTsKLQotCQkJLyogcHVyZ2UgdGhlIGNlbGwncyBzZXJ2ZXIgZ3JhdmV5YXJkIGxpc3QgKi8KLQkJCV9kZWJ1ZygiIC0gY2xlYXJpbmcgc2VydmVyIGdyYXZleWFyZCIpOwotCi0JCQlzcGluX2xvY2soJmNlbGwtPnN2X2d5bG9jayk7Ci0KLQkJCXdoaWxlICghbGlzdF9lbXB0eSgmY2VsbC0+c3ZfZ3JhdmV5YXJkKSkgewotCQkJCXN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXI7Ci0KLQkJCQlzZXJ2ZXIgPSBsaXN0X2VudHJ5KGNlbGwtPnN2X2dyYXZleWFyZC5uZXh0LAotCQkJCQkJICAgIHN0cnVjdCBhZnNfc2VydmVyLCBsaW5rKTsKLQkJCQlsaXN0X2RlbF9pbml0KCZzZXJ2ZXItPmxpbmspOwotCi0JCQkJYWZzX2thZnN0aW1vZF9kZWxfdGltZXIoJnNlcnZlci0+dGltZW91dCk7Ci0KLQkJCQlzcGluX3VubG9jaygmY2VsbC0+c3ZfZ3lsb2NrKTsKLQotCQkJCWFmc19zZXJ2ZXJfZG9fdGltZW91dChzZXJ2ZXIpOwotCi0JCQkJc3Bpbl9sb2NrKCZjZWxsLT5zdl9neWxvY2spOwotCQkJfQotCi0JCQlzcGluX3VubG9jaygmY2VsbC0+c3ZfZ3lsb2NrKTsKLQogCQkJLyogbm93IHRoZSBjZWxsIHNob3VsZCBiZSBsZWZ0IHdpdGggbm8gcmVmZXJlbmNlcyAqLwogCQkJYWZzX2NlbGxfZGVzdHJveShjZWxsKTsKIAkJfQogCX0KIAorCXVwX3dyaXRlKCZhZnNfY2VsbHNfc2VtKTsKIAlfbGVhdmUoIiIpOwotfSAvKiBlbmQgYWZzX2NlbGxfcHVyZ2UoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogbWF0Y2ggYSBjZWxsIHJlY29yZCBvYnRhaW5lZCBmcm9tIHRoZSBjYWNoZQotICovCi0jaWZkZWYgQUZTX0NBQ0hJTkdfU1VQUE9SVAotc3RhdGljIGNhY2hlZnNfbWF0Y2hfdmFsX3QgYWZzX2NlbGxfY2FjaGVfbWF0Y2godm9pZCAqdGFyZ2V0LAotCQkJCQkJY29uc3Qgdm9pZCAqZW50cnkpCi17Ci0JY29uc3Qgc3RydWN0IGFmc19jYWNoZV9jZWxsICpjY2VsbCA9IGVudHJ5OwotCXN0cnVjdCBhZnNfY2VsbCAqY2VsbCA9IHRhcmdldDsKLQotCV9lbnRlcigieyVzfSx7JXN9IiwgY2NlbGwtPm5hbWUsIGNlbGwtPm5hbWUpOwotCi0JaWYgKHN0cm5jbXAoY2NlbGwtPm5hbWUsIGNlbGwtPm5hbWUsIHNpemVvZihjY2VsbC0+bmFtZSkpID09IDApIHsKLQkJX2xlYXZlKCIgPSBTVUNDRVNTIik7Ci0JCXJldHVybiBDQUNIRUZTX01BVENIX1NVQ0NFU1M7Ci0JfQotCi0JX2xlYXZlKCIgPSBGQUlMRUQiKTsKLQlyZXR1cm4gQ0FDSEVGU19NQVRDSF9GQUlMRUQ7Ci19IC8qIGVuZCBhZnNfY2VsbF9jYWNoZV9tYXRjaCgpICovCi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIHVwZGF0ZSBhIGNlbGwgcmVjb3JkIGluIHRoZSBjYWNoZQotICovCi0jaWZkZWYgQUZTX0NBQ0hJTkdfU1VQUE9SVAotc3RhdGljIHZvaWQgYWZzX2NlbGxfY2FjaGVfdXBkYXRlKHZvaWQgKnNvdXJjZSwgdm9pZCAqZW50cnkpCi17Ci0Jc3RydWN0IGFmc19jYWNoZV9jZWxsICpjY2VsbCA9IGVudHJ5OwotCXN0cnVjdCBhZnNfY2VsbCAqY2VsbCA9IHNvdXJjZTsKLQotCV9lbnRlcigiJXAsJXAiLCBzb3VyY2UsIGVudHJ5KTsKLQotCXN0cm5jcHkoY2NlbGwtPm5hbWUsIGNlbGwtPm5hbWUsIHNpemVvZihjY2VsbC0+bmFtZSkpOwotCi0JbWVtY3B5KGNjZWxsLT52bF9zZXJ2ZXJzLAotCSAgICAgICBjZWxsLT52bF9hZGRycywKLQkgICAgICAgbWluKHNpemVvZihjY2VsbC0+dmxfc2VydmVycyksIHNpemVvZihjZWxsLT52bF9hZGRycykpKTsKLQotfSAvKiBlbmQgYWZzX2NlbGxfY2FjaGVfdXBkYXRlKCkgKi8KLSNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvZnMvYWZzL2NlbGwuaCBiL2ZzL2Fmcy9jZWxsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4MzQ5MTAuLjAwMDAwMDAKLS0tIGEvZnMvYWZzL2NlbGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qIGNlbGwuaDogQUZTIGNlbGwgcmVjb3JkCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi0KLSNpZm5kZWYgX0xJTlVYX0FGU19DRUxMX0gKLSNkZWZpbmUgX0xJTlVYX0FGU19DRUxMX0gKLQotI2luY2x1ZGUgInR5cGVzLmgiCi0jaW5jbHVkZSAiY2FjaGUuaCIKLQotI2RlZmluZSBBRlNfQ0VMTF9NQVhfQUREUlMgMTUKLQotZXh0ZXJuIHZvbGF0aWxlIGludCBhZnNfY2VsbHNfYmVpbmdfcHVyZ2VkOyAvKiBUIHdoZW4gY2VsbHMgYXJlIGJlaW5nIHB1cmdlZCBieSBybW1vZCAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogZW50cnkgaW4gdGhlIGNhY2hlZCBjZWxsIGNhdGFsb2d1ZQotICovCi1zdHJ1Y3QgYWZzX2NhY2hlX2NlbGwKLXsKLQljaGFyCQkJbmFtZVs2NF07CS8qIGNlbGwgbmFtZSAocGFkZGVkIHdpdGggTlVMcykgKi8KLQlzdHJ1Y3QgaW5fYWRkcgkJdmxfc2VydmVyc1sxNV07CS8qIGNhY2hlZCBjZWxsIFZMIHNlcnZlcnMgKi8KLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBBRlMgY2VsbCByZWNvcmQKLSAqLwotc3RydWN0IGFmc19jZWxsCi17Ci0JYXRvbWljX3QJCXVzYWdlOwotCXN0cnVjdCBsaXN0X2hlYWQJbGluazsJCS8qIG1haW4gY2VsbCBsaXN0IGxpbmsgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkCXByb2NfbGluazsJLyogL3Byb2MgY2VsbCBsaXN0IGxpbmsgKi8KLQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkJKnByb2NfZGlyOwkvKiAvcHJvYyBkaXIgZm9yIHRoaXMgY2VsbCAqLwotI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKLQlzdHJ1Y3QgY2FjaGVmc19jb29raWUJKmNhY2hlOwkJLyogY2FjaGluZyBjb29raWUgKi8KLSNlbmRpZgotCi0JLyogc2VydmVyIHJlY29yZCBtYW5hZ2VtZW50ICovCi0Jcndsb2NrX3QJCXN2X2xvY2s7CS8qIGFjdGl2ZSBzZXJ2ZXIgbGlzdCBsb2NrICovCi0Jc3RydWN0IGxpc3RfaGVhZAlzdl9saXN0OwkvKiBhY3RpdmUgc2VydmVyIGxpc3QgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkCXN2X2dyYXZleWFyZDsJLyogaW5hY3RpdmUgc2VydmVyIGxpc3QgKi8KLQlzcGlubG9ja190CQlzdl9neWxvY2s7CS8qIGluYWN0aXZlIHNlcnZlciBsaXN0IGxvY2sgKi8KLQotCS8qIHZvbHVtZSBsb2NhdGlvbiByZWNvcmQgbWFuYWdlbWVudCAqLwotCXN0cnVjdCByd19zZW1hcGhvcmUJdmxfc2VtOwkJLyogdm9sdW1lIG1hbmFnZW1lbnQgc2VyaWFsaXNhdGlvbiBzZW1hcGhvcmUgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkCXZsX2xpc3Q7CS8qIGNlbGwncyBhY3RpdmUgVkwgcmVjb3JkIGxpc3QgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkCXZsX2dyYXZleWFyZDsJLyogY2VsbCdzIGluYWN0aXZlIFZMIHJlY29yZCBsaXN0ICovCi0Jc3BpbmxvY2tfdAkJdmxfZ3lsb2NrOwkvKiBncmF2ZXlhcmQgbG9jayAqLwotCXVuc2lnbmVkIHNob3J0CQl2bF9uYWRkcnM7CS8qIG51bWJlciBvZiBWTCBzZXJ2ZXJzIGluIGFkZHIgbGlzdCAqLwotCXVuc2lnbmVkIHNob3J0CQl2bF9jdXJyX3N2aXg7CS8qIGN1cnJlbnQgc2VydmVyIGluZGV4ICovCi0Jc3RydWN0IGluX2FkZHIJCXZsX2FkZHJzW0FGU19DRUxMX01BWF9BRERSU107CS8qIGNlbGwgVkwgc2VydmVyIGFkZHJlc3NlcyAqLwotCi0JY2hhcgkJCW5hbWVbMF07CS8qIGNlbGwgbmFtZSAtIG11c3QgZ28gbGFzdCAqLwotfTsKLQotZXh0ZXJuIGludCBhZnNfY2VsbF9pbml0KGNoYXIgKnJvb3RjZWxsKTsKLQotZXh0ZXJuIGludCBhZnNfY2VsbF9jcmVhdGUoY29uc3QgY2hhciAqbmFtZSwgY2hhciAqdmxsaXN0LCBzdHJ1Y3QgYWZzX2NlbGwgKipfY2VsbCk7Ci0KLWV4dGVybiBpbnQgYWZzX2NlbGxfbG9va3VwKGNvbnN0IGNoYXIgKm5hbWUsIHVuc2lnbmVkIG5tc2l6ZSwgc3RydWN0IGFmc19jZWxsICoqX2NlbGwpOwotCi0jZGVmaW5lIGFmc19nZXRfY2VsbChDKSBkbyB7IGF0b21pY19pbmMoJihDKS0+dXNhZ2UpOyB9IHdoaWxlKDApCi0KLWV4dGVybiBzdHJ1Y3QgYWZzX2NlbGwgKmFmc19nZXRfY2VsbF9tYXliZShzdHJ1Y3QgYWZzX2NlbGwgKipfY2VsbCk7Ci0KLWV4dGVybiB2b2lkIGFmc19wdXRfY2VsbChzdHJ1Y3QgYWZzX2NlbGwgKmNlbGwpOwotCi1leHRlcm4gdm9pZCBhZnNfY2VsbF9wdXJnZSh2b2lkKTsKLQotI2VuZGlmIC8qIF9MSU5VWF9BRlNfQ0VMTF9IICovCmRpZmYgLS1naXQgYS9mcy9hZnMvY21zZXJ2aWNlLmMgYi9mcy9hZnMvY21zZXJ2aWNlLmMKaW5kZXggM2QwOTdmZC4uNjY4NWY0YyAxMDA2NDQKLS0tIGEvZnMvYWZzL2Ntc2VydmljZS5jCisrKyBiL2ZzL2Fmcy9jbXNlcnZpY2UuYwpAQCAtMSw0ICsxLDQgQEAKLS8qIGNtc2VydmljZS5jOiBBRlMgQ2FjaGUgTWFuYWdlciBTZXJ2aWNlCisvKiBBRlMgQ2FjaGUgTWFuYWdlciBTZXJ2aWNlCiAgKgogICogQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKQEAgLTEyLDY0MSArMTIsNDYzIEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgotI2luY2x1ZGUgInNlcnZlci5oIgotI2luY2x1ZGUgImNlbGwuaCIKLSNpbmNsdWRlICJ0cmFuc3BvcnQuaCIKLSNpbmNsdWRlIDxyeHJwYy9yeHJwYy5oPgotI2luY2x1ZGUgPHJ4cnBjL3RyYW5zcG9ydC5oPgotI2luY2x1ZGUgPHJ4cnBjL2Nvbm5lY3Rpb24uaD4KLSNpbmNsdWRlIDxyeHJwYy9jYWxsLmg+Ci0jaW5jbHVkZSAiY21zZXJ2aWNlLmgiCisjaW5jbHVkZSA8bGludXgvaXAuaD4KICNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImFmc19jbS5oIgogCi1zdGF0aWMgdW5zaWduZWQgYWZzY21fdXNhZ2U7CQkvKiBBRlMgY2FjaGUgbWFuYWdlciB1c2FnZSBjb3VudCAqLwotc3RhdGljIHN0cnVjdCByd19zZW1hcGhvcmUgYWZzY21fc2VtOwkvKiBBRlMgY2FjaGUgbWFuYWdlciBzdGFydC9zdG9wIHNlbWFwaG9yZSAqLworc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmFmc19jbV93b3JrcXVldWU7CiAKLXN0YXRpYyBpbnQgYWZzY21fbmV3X2NhbGwoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpOwotc3RhdGljIHZvaWQgYWZzY21fYXR0ZW50aW9uKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKTsKLXN0YXRpYyB2b2lkIGFmc2NtX2Vycm9yKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKTsKLXN0YXRpYyB2b2lkIGFmc2NtX2FlbWFwKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKTsKK3N0YXRpYyBpbnQgYWZzX2RlbGl2ZXJfY2JfaW5pdF9jYWxsX2JhY2tfc3RhdGUoc3RydWN0IGFmc19jYWxsICosCisJCQkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqLCBib29sKTsKK3N0YXRpYyBpbnQgYWZzX2RlbGl2ZXJfY2JfaW5pdF9jYWxsX2JhY2tfc3RhdGUzKHN0cnVjdCBhZnNfY2FsbCAqLAorCQkJCQkJc3RydWN0IHNrX2J1ZmYgKiwgYm9vbCk7CitzdGF0aWMgaW50IGFmc19kZWxpdmVyX2NiX3Byb2JlKHN0cnVjdCBhZnNfY2FsbCAqLCBzdHJ1Y3Qgc2tfYnVmZiAqLCBib29sKTsKK3N0YXRpYyBpbnQgYWZzX2RlbGl2ZXJfY2JfY2FsbGJhY2soc3RydWN0IGFmc19jYWxsICosIHN0cnVjdCBza19idWZmICosIGJvb2wpOworc3RhdGljIGludCBhZnNfZGVsaXZlcl9jYl9nZXRfY2FwYWJpbGl0aWVzKHN0cnVjdCBhZnNfY2FsbCAqLCBzdHJ1Y3Qgc2tfYnVmZiAqLAorCQkJCQkgICBib29sKTsKK3N0YXRpYyB2b2lkIGFmc19jbV9kZXN0cnVjdG9yKHN0cnVjdCBhZnNfY2FsbCAqKTsKIAotc3RhdGljIHZvaWQgX1NSWEFGU0NNX0NhbGxCYWNrKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKTsKLXN0YXRpYyB2b2lkIF9TUlhBRlNDTV9Jbml0Q2FsbEJhY2tTdGF0ZShzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCk7Ci1zdGF0aWMgdm9pZCBfU1JYQUZTQ01fUHJvYmUoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpOworLyoKKyAqIENCLkNhbGxCYWNrIG9wZXJhdGlvbiB0eXBlCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWZzX2NhbGxfdHlwZSBhZnNfU1JYQ0JDYWxsQmFjayA9IHsKKwkubmFtZQkJPSAiQ0IuQ2FsbEJhY2siLAorCS5kZWxpdmVyCT0gYWZzX2RlbGl2ZXJfY2JfY2FsbGJhY2ssCisJLmFib3J0X3RvX2Vycm9yCT0gYWZzX2Fib3J0X3RvX2Vycm9yLAorCS5kZXN0cnVjdG9yCT0gYWZzX2NtX2Rlc3RydWN0b3IsCit9OwogCi10eXBlZGVmIHZvaWQgKCpfU1JYQUZTQ01feHh4eF90KShzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCk7CisvKgorICogQ0IuSW5pdENhbGxCYWNrU3RhdGUgb3BlcmF0aW9uIHR5cGUKKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBhZnNfY2FsbF90eXBlIGFmc19TUlhDQkluaXRDYWxsQmFja1N0YXRlID0geworCS5uYW1lCQk9ICJDQi5Jbml0Q2FsbEJhY2tTdGF0ZSIsCisJLmRlbGl2ZXIJPSBhZnNfZGVsaXZlcl9jYl9pbml0X2NhbGxfYmFja19zdGF0ZSwKKwkuYWJvcnRfdG9fZXJyb3IJPSBhZnNfYWJvcnRfdG9fZXJyb3IsCisJLmRlc3RydWN0b3IJPSBhZnNfY21fZGVzdHJ1Y3RvciwKK307CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcnhycGNfb3BlcmF0aW9uIEFGU0NNX29wc1tdID0gewotCXsKLQkJLmlkCT0gMjA0LAotCQkuYXNpemUJPSBSWFJQQ19BUFBfTUFSS19FT0YsCi0JCS5uYW1lCT0gIkNhbGxCYWNrIiwKLQkJLnVzZXIJPSBfU1JYQUZTQ01fQ2FsbEJhY2ssCi0JfSwKLQl7Ci0JCS5pZAk9IDIwNSwKLQkJLmFzaXplCT0gUlhSUENfQVBQX01BUktfRU9GLAotCQkubmFtZQk9ICJJbml0Q2FsbEJhY2tTdGF0ZSIsCi0JCS51c2VyCT0gX1NSWEFGU0NNX0luaXRDYWxsQmFja1N0YXRlLAotCX0sCi0JewotCQkuaWQJPSAyMDYsCi0JCS5hc2l6ZQk9IFJYUlBDX0FQUF9NQVJLX0VPRiwKLQkJLm5hbWUJPSAiUHJvYmUiLAotCQkudXNlcgk9IF9TUlhBRlNDTV9Qcm9iZSwKLQl9LAotI2lmIDAKLQl7Ci0JCS5pZAk9IDIwNywKLQkJLmFzaXplCT0gUlhSUENfQVBQX01BUktfRU9GLAotCQkubmFtZQk9ICJHZXRMb2NrIiwKLQkJLnVzZXIJPSBfU1JYQUZTQ01fR2V0TG9jaywKLQl9LAotCXsKLQkJLmlkCT0gMjA4LAotCQkuYXNpemUJPSBSWFJQQ19BUFBfTUFSS19FT0YsCi0JCS5uYW1lCT0gIkdldENFIiwKLQkJLnVzZXIJPSBfU1JYQUZTQ01fR2V0Q0UsCi0JfSwKLQl7Ci0JCS5pZAk9IDIwOSwKLQkJLmFzaXplCT0gUlhSUENfQVBQX01BUktfRU9GLAotCQkubmFtZQk9ICJHZXRYU3RhdHNWZXJzaW9uIiwKLQkJLnVzZXIJPSBfU1JYQUZTQ01fR2V0WFN0YXRzVmVyc2lvbiwKLQl9LAotCXsKLQkJLmlkCT0gMjEwLAotCQkuYXNpemUJPSBSWFJQQ19BUFBfTUFSS19FT0YsCi0JCS5uYW1lCT0gIkdldFhTdGF0cyIsCi0JCS51c2VyCT0gX1NSWEFGU0NNX0dldFhTdGF0cywKKy8qCisgKiBDQi5Jbml0Q2FsbEJhY2tTdGF0ZTMgb3BlcmF0aW9uIHR5cGUKKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBhZnNfY2FsbF90eXBlIGFmc19TUlhDQkluaXRDYWxsQmFja1N0YXRlMyA9IHsKKwkubmFtZQkJPSAiQ0IuSW5pdENhbGxCYWNrU3RhdGUzIiwKKwkuZGVsaXZlcgk9IGFmc19kZWxpdmVyX2NiX2luaXRfY2FsbF9iYWNrX3N0YXRlMywKKwkuYWJvcnRfdG9fZXJyb3IJPSBhZnNfYWJvcnRfdG9fZXJyb3IsCisJLmRlc3RydWN0b3IJPSBhZnNfY21fZGVzdHJ1Y3RvciwKK307CisKKy8qCisgKiBDQi5Qcm9iZSBvcGVyYXRpb24gdHlwZQorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGFmc19jYWxsX3R5cGUgYWZzX1NSWENCUHJvYmUgPSB7CisJLm5hbWUJCT0gIkNCLlByb2JlIiwKKwkuZGVsaXZlcgk9IGFmc19kZWxpdmVyX2NiX3Byb2JlLAorCS5hYm9ydF90b19lcnJvcgk9IGFmc19hYm9ydF90b19lcnJvciwKKwkuZGVzdHJ1Y3Rvcgk9IGFmc19jbV9kZXN0cnVjdG9yLAorfTsKKworLyoKKyAqIENCLkdldENhcGFiaWxpdGllcyBvcGVyYXRpb24gdHlwZQorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGFmc19jYWxsX3R5cGUgYWZzX1NSWENCR2V0Q2FwYWJpbGl0ZXMgPSB7CisJLm5hbWUJCT0gIkNCLkdldENhcGFiaWxpdGllcyIsCisJLmRlbGl2ZXIJPSBhZnNfZGVsaXZlcl9jYl9nZXRfY2FwYWJpbGl0aWVzLAorCS5hYm9ydF90b19lcnJvcgk9IGFmc19hYm9ydF90b19lcnJvciwKKwkuZGVzdHJ1Y3Rvcgk9IGFmc19jbV9kZXN0cnVjdG9yLAorfTsKKworLyoKKyAqIHJvdXRlIGFuIGluY29taW5nIGNhY2hlIG1hbmFnZXIgY2FsbAorICogLSByZXR1cm4gVCBpZiBzdXBwb3J0ZWQsIEYgaWYgbm90CisgKi8KK2Jvb2wgYWZzX2NtX2luY29taW5nX2NhbGwoc3RydWN0IGFmc19jYWxsICpjYWxsKQoreworCXUzMiBvcGVyYXRpb25faWQgPSBudG9obChjYWxsLT5vcGVyYXRpb25fSUQpOworCisJX2VudGVyKCJ7Q0IuT1AgJXV9Iiwgb3BlcmF0aW9uX2lkKTsKKworCXN3aXRjaCAob3BlcmF0aW9uX2lkKSB7CisJY2FzZSBDQkNhbGxCYWNrOgorCQljYWxsLT50eXBlID0gJmFmc19TUlhDQkNhbGxCYWNrOworCQlyZXR1cm4gdHJ1ZTsKKwljYXNlIENCSW5pdENhbGxCYWNrU3RhdGU6CisJCWNhbGwtPnR5cGUgPSAmYWZzX1NSWENCSW5pdENhbGxCYWNrU3RhdGU7CisJCXJldHVybiB0cnVlOworCWNhc2UgQ0JJbml0Q2FsbEJhY2tTdGF0ZTM6CisJCWNhbGwtPnR5cGUgPSAmYWZzX1NSWENCSW5pdENhbGxCYWNrU3RhdGUzOworCQlyZXR1cm4gdHJ1ZTsKKwljYXNlIENCUHJvYmU6CisJCWNhbGwtPnR5cGUgPSAmYWZzX1NSWENCUHJvYmU7CisJCXJldHVybiB0cnVlOworCWNhc2UgQ0JHZXRDYXBhYmlsaXRpZXM6CisJCWNhbGwtPnR5cGUgPSAmYWZzX1NSWENCR2V0Q2FwYWJpbGl0ZXM7CisJCXJldHVybiB0cnVlOworCWRlZmF1bHQ6CisJCXJldHVybiBmYWxzZTsKIAl9Ci0jZW5kaWYKLX07Cit9CiAKLXN0YXRpYyBzdHJ1Y3QgcnhycGNfc2VydmljZSBBRlNDTV9zZXJ2aWNlID0gewotCS5uYW1lCQk9ICJBRlMvQ00iLAotCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkubGluawkJPSBMSVNUX0hFQURfSU5JVChBRlNDTV9zZXJ2aWNlLmxpbmspLAotCS5uZXdfY2FsbAk9IGFmc2NtX25ld19jYWxsLAotCS5zZXJ2aWNlX2lkCT0gMSwKLQkuYXR0bl9mdW5jCT0gYWZzY21fYXR0ZW50aW9uLAotCS5lcnJvcl9mdW5jCT0gYWZzY21fZXJyb3IsCi0JLmFlbWFwX2Z1bmMJPSBhZnNjbV9hZW1hcCwKLQkub3BzX2JlZ2luCT0gJkFGU0NNX29wc1swXSwKLQkub3BzX2VuZAk9ICZBRlNDTV9vcHNbQVJSQVlfU0laRShBRlNDTV9vcHMpXSwKLX07Ci0KLXN0YXRpYyBERUNMQVJFX0NPTVBMRVRJT04oa2Fmc2NtZF9hbGl2ZSk7Ci1zdGF0aWMgREVDTEFSRV9DT01QTEVUSU9OKGthZnNjbWRfZGVhZCk7Ci1zdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQoa2Fmc2NtZF9zbGVlcHEpOwotc3RhdGljIExJU1RfSEVBRChrYWZzY21kX2F0dGVudGlvbl9saXN0KTsKLXN0YXRpYyBMSVNUX0hFQUQoYWZzY21fY2FsbHMpOwotc3RhdGljIERFRklORV9TUElOTE9DSyhhZnNjbV9jYWxsc19sb2NrKTsKLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soa2Fmc2NtZF9hdHRlbnRpb25fbG9jayk7Ci1zdGF0aWMgaW50IGthZnNjbWRfZGllOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgotICogQUZTIENhY2hlIE1hbmFnZXIga2VybmVsIHRocmVhZAorICogY2xlYW4gdXAgYSBjYWNoZSBtYW5hZ2VyIGNhbGwKICAqLwotc3RhdGljIGludCBrYWZzY21kKHZvaWQgKmFyZykKK3N0YXRpYyB2b2lkIGFmc19jbV9kZXN0cnVjdG9yKHN0cnVjdCBhZnNfY2FsbCAqY2FsbCkKIHsKLQlERUNMQVJFX1dBSVRRVUVVRShteXNlbGYsIGN1cnJlbnQpOworCV9lbnRlcigiIik7CiAKLQlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbDsKLQlfU1JYQUZTQ01feHh4eF90IGZ1bmM7Ci0JaW50IGRpZTsKKwlhZnNfcHV0X3NlcnZlcihjYWxsLT5zZXJ2ZXIpOworCWNhbGwtPnNlcnZlciA9IE5VTEw7CisJa2ZyZWUoY2FsbC0+YnVmZmVyKTsKKwljYWxsLT5idWZmZXIgPSBOVUxMOworfQogCi0JcHJpbnRrKEtFUk5fSU5GTyAia0FGUzogU3RhcnRlZCBrYWZzY21kICVkXG4iLCBjdXJyZW50LT5waWQpOwotCi0JZGFlbW9uaXplKCJrYWZzY21kIik7Ci0KLQljb21wbGV0ZSgma2Fmc2NtZF9hbGl2ZSk7Ci0KLQkvKiBsb29wIGFyb3VuZCBsb29raW5nIGZvciB0aGluZ3MgdG8gYXR0ZW5kIHRvICovCi0JZG8gewotCQlpZiAobGlzdF9lbXB0eSgma2Fmc2NtZF9hdHRlbnRpb25fbGlzdCkpIHsKLQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JCQlhZGRfd2FpdF9xdWV1ZSgma2Fmc2NtZF9zbGVlcHEsICZteXNlbGYpOwotCi0JCQlmb3IgKDs7KSB7Ci0JCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJCQlpZiAoIWxpc3RfZW1wdHkoJmthZnNjbWRfYXR0ZW50aW9uX2xpc3QpIHx8Ci0JCQkJICAgIHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpIHx8Ci0JCQkJICAgIGthZnNjbWRfZGllKQotCQkJCQlicmVhazsKLQotCQkJCXNjaGVkdWxlKCk7Ci0JCQl9Ci0KLQkJCXJlbW92ZV93YWl0X3F1ZXVlKCZrYWZzY21kX3NsZWVwcSwgJm15c2VsZik7Ci0JCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwotCQl9Ci0KLQkJZGllID0ga2Fmc2NtZF9kaWU7Ci0KLQkJLyogZGVxdWV1ZSB0aGUgbmV4dCBjYWxsIHJlcXVpcmluZyBhdHRlbnRpb24gKi8KLQkJY2FsbCA9IE5VTEw7Ci0JCXNwaW5fbG9jaygma2Fmc2NtZF9hdHRlbnRpb25fbG9jayk7Ci0KLQkJaWYgKCFsaXN0X2VtcHR5KCZrYWZzY21kX2F0dGVudGlvbl9saXN0KSkgewotCQkJY2FsbCA9IGxpc3RfZW50cnkoa2Fmc2NtZF9hdHRlbnRpb25fbGlzdC5uZXh0LAotCQkJCQkgIHN0cnVjdCByeHJwY19jYWxsLAotCQkJCQkgIGFwcF9hdHRuX2xpbmspOwotCQkJbGlzdF9kZWxfaW5pdCgmY2FsbC0+YXBwX2F0dG5fbGluayk7Ci0JCQlkaWUgPSAwOwotCQl9Ci0KLQkJc3Bpbl91bmxvY2soJmthZnNjbWRfYXR0ZW50aW9uX2xvY2spOwotCi0JCWlmIChjYWxsKSB7Ci0JCQkvKiBhY3QgdXBvbiBpdCAqLwotCQkJX2RlYnVnKCJAQEAgQmVnaW4gQXR0ZW5kIENhbGwgJXAiLCBjYWxsKTsKLQotCQkJZnVuYyA9IGNhbGwtPmFwcF91c2VyOwotCQkJaWYgKGZ1bmMpCi0JCQkJZnVuYyhjYWxsKTsKLQotCQkJcnhycGNfcHV0X2NhbGwoY2FsbCk7Ci0KLQkJCV9kZWJ1ZygiQEBAIEVuZCBBdHRlbmQgQ2FsbCAlcCIsIGNhbGwpOwotCQl9Ci0KLQl9IHdoaWxlKCFkaWUpOwotCi0JLyogYW5kIHRoYXQncyBhbGwgKi8KLQljb21wbGV0ZV9hbmRfZXhpdCgma2Fmc2NtZF9kZWFkLCAwKTsKLQotfSAvKiBlbmQga2Fmc2NtZCgpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCi0gKiBoYW5kbGUgYSBjYWxsIGNvbWluZyBpbiB0byB0aGUgY2FjaGUgbWFuYWdlcgotICogLSBpZiBJIHdhbnQgdG8ga2VlcCB0aGUgY2FsbCwgSSBtdXN0IGluY3JlbWVudCBpdHMgdXNhZ2UgY291bnQKLSAqIC0gdGhlIHJldHVybiB2YWx1ZSB3aWxsIGJlIG5lZ2F0ZWQgYW5kIHBhc3NlZCBiYWNrIGluIGFuIGFib3J0IHBhY2tldCBpZgotICogICBub24temVybwotICogLSBzZXJpYWxpc2VkIGJ5IHZpcnR1ZSBvZiB0aGVyZSBvbmx5IGJlaW5nIG9uZSBrcnhpb2QKKyAqIGFsbG93IHRoZSBmaWxlc2VydmVyIHRvIHNlZSBpZiB0aGUgY2FjaGUgbWFuYWdlciBpcyBzdGlsbCBhbGl2ZQogICovCi1zdGF0aWMgaW50IGFmc2NtX25ld19jYWxsKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKQorc3RhdGljIHZvaWQgU1JYQUZTQ0JfQ2FsbEJhY2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCV9lbnRlcigiJXB7Y2lkPSV1IHU9JWR9IiwKLQkgICAgICAgY2FsbCwgbnRvaGwoY2FsbC0+Y2FsbF9pZCksIGF0b21pY19yZWFkKCZjYWxsLT51c2FnZSkpOworCXN0cnVjdCBhZnNfY2FsbCAqY2FsbCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYWZzX2NhbGwsIHdvcmspOwogCi0JcnhycGNfZ2V0X2NhbGwoY2FsbCk7CisJX2VudGVyKCIiKTsKIAotCS8qIGFkZCB0byBteSBjdXJyZW50IGNhbGwgbGlzdCAqLwotCXNwaW5fbG9jaygmYWZzY21fY2FsbHNfbG9jayk7Ci0JbGlzdF9hZGQoJmNhbGwtPmFwcF9saW5rLCZhZnNjbV9jYWxscyk7Ci0Jc3Bpbl91bmxvY2soJmFmc2NtX2NhbGxzX2xvY2spOworCS8qIGJlIHN1cmUgdG8gc2VuZCB0aGUgcmVwbHkgKmJlZm9yZSogYXR0ZW1wdGluZyB0byBzcGFtIHRoZSBBRlMgc2VydmVyCisJICogd2l0aCBGU0ZldGNoU3RhdHVzIHJlcXVlc3RzIG9uIHRoZSB2bm9kZXMgd2l0aCBicm9rZW4gY2FsbGJhY2tzIGxlc3QKKwkgKiB0aGUgQUZTIHNlcnZlciBnZXQgaW50byBhIHZpY2lvdXMgY3ljbGUgb2YgdHJ5aW5nIHRvIGJyZWFrIGZ1cnRoZXIKKwkgKiBjYWxsYmFja3MgYmVjYXVzZSBpdCBoYWRuJ3QgcmVjZWl2ZWQgY29tcGxldGlvbiBvZiB0aGUgQ0JDYWxsQmFjayBvcAorCSAqIHlldCAqLworCWFmc19zZW5kX2VtcHR5X3JlcGx5KGNhbGwpOwogCi0JX2xlYXZlKCIgPSAwIik7CisJYWZzX2JyZWFrX2NhbGxiYWNrcyhjYWxsLT5zZXJ2ZXIsIGNhbGwtPmNvdW50LCBjYWxsLT5yZXF1ZXN0KTsKKwlfbGVhdmUoIiIpOworfQorCisvKgorICogZGVsaXZlciByZXF1ZXN0IGRhdGEgdG8gYSBDQi5DYWxsQmFjayBjYWxsCisgKi8KK3N0YXRpYyBpbnQgYWZzX2RlbGl2ZXJfY2JfY2FsbGJhY2soc3RydWN0IGFmc19jYWxsICpjYWxsLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSAgIGJvb2wgbGFzdCkKK3sKKwlzdHJ1Y3QgYWZzX2NhbGxiYWNrICpjYjsKKwlzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyOworCXN0cnVjdCBpbl9hZGRyIGFkZHI7CisJX19iZTMyICpicDsKKwl1MzIgdG1wOworCWludCByZXQsIGxvb3A7CisKKwlfZW50ZXIoInsldX0seyV1fSwlZCIsIGNhbGwtPnVubWFyc2hhbGwsIHNrYi0+bGVuLCBsYXN0KTsKKworCXN3aXRjaCAoY2FsbC0+dW5tYXJzaGFsbCkgeworCWNhc2UgMDoKKwkJY2FsbC0+b2Zmc2V0ID0gMDsKKwkJY2FsbC0+dW5tYXJzaGFsbCsrOworCisJCS8qIGV4dHJhY3QgdGhlIEZJRCBhcnJheSBhbmQgaXRzIGNvdW50IGluIHR3byBzdGVwcyAqLworCWNhc2UgMToKKwkJX2RlYnVnKCJleHRyYWN0IEZJRCBjb3VudCIpOworCQlyZXQgPSBhZnNfZXh0cmFjdF9kYXRhKGNhbGwsIHNrYiwgbGFzdCwgJmNhbGwtPnRtcCwgNCk7CisJCXN3aXRjaCAocmV0KSB7CisJCWNhc2UgMDoJCWJyZWFrOworCQljYXNlIC1FQUdBSU46CXJldHVybiAwOworCQlkZWZhdWx0OglyZXR1cm4gcmV0OworCQl9CisKKwkJY2FsbC0+Y291bnQgPSBudG9obChjYWxsLT50bXApOworCQlfZGVidWcoIkZJRCBjb3VudDogJXUiLCBjYWxsLT5jb3VudCk7CisJCWlmIChjYWxsLT5jb3VudCA+IEFGU0NCTUFYKQorCQkJcmV0dXJuIC1FQkFETVNHOworCisJCWNhbGwtPmJ1ZmZlciA9IGttYWxsb2MoY2FsbC0+Y291bnQgKiAzICogNCwgR0ZQX0tFUk5FTCk7CisJCWlmICghY2FsbC0+YnVmZmVyKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCWNhbGwtPm9mZnNldCA9IDA7CisJCWNhbGwtPnVubWFyc2hhbGwrKzsKKworCWNhc2UgMjoKKwkJX2RlYnVnKCJleHRyYWN0IEZJRCBhcnJheSIpOworCQlyZXQgPSBhZnNfZXh0cmFjdF9kYXRhKGNhbGwsIHNrYiwgbGFzdCwgY2FsbC0+YnVmZmVyLAorCQkJCSAgICAgICBjYWxsLT5jb3VudCAqIDMgKiA0KTsKKwkJc3dpdGNoIChyZXQpIHsKKwkJY2FzZSAwOgkJYnJlYWs7CisJCWNhc2UgLUVBR0FJTjoJcmV0dXJuIDA7CisJCWRlZmF1bHQ6CXJldHVybiByZXQ7CisJCX0KKworCQlfZGVidWcoInVubWFyc2hhbGwgRklEIGFycmF5Iik7CisJCWNhbGwtPnJlcXVlc3QgPSBrY2FsbG9jKGNhbGwtPmNvdW50LAorCQkJCQlzaXplb2Yoc3RydWN0IGFmc19jYWxsYmFjayksCisJCQkJCUdGUF9LRVJORUwpOworCQlpZiAoIWNhbGwtPnJlcXVlc3QpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQljYiA9IGNhbGwtPnJlcXVlc3Q7CisJCWJwID0gY2FsbC0+YnVmZmVyOworCQlmb3IgKGxvb3AgPSBjYWxsLT5jb3VudDsgbG9vcCA+IDA7IGxvb3AtLSwgY2IrKykgeworCQkJY2ItPmZpZC52aWQJPSBudG9obCgqYnArKyk7CisJCQljYi0+ZmlkLnZub2RlCT0gbnRvaGwoKmJwKyspOworCQkJY2ItPmZpZC51bmlxdWUJPSBudG9obCgqYnArKyk7CisJCQljYi0+dHlwZQk9IEFGU0NNX0NCX1VOVFlQRUQ7CisJCX0KKworCQljYWxsLT5vZmZzZXQgPSAwOworCQljYWxsLT51bm1hcnNoYWxsKys7CisKKwkJLyogZXh0cmFjdCB0aGUgY2FsbGJhY2sgYXJyYXkgYW5kIGl0cyBjb3VudCBpbiB0d28gc3RlcHMgKi8KKwljYXNlIDM6CisJCV9kZWJ1ZygiZXh0cmFjdCBDQiBjb3VudCIpOworCQlyZXQgPSBhZnNfZXh0cmFjdF9kYXRhKGNhbGwsIHNrYiwgbGFzdCwgJmNhbGwtPnRtcCwgNCk7CisJCXN3aXRjaCAocmV0KSB7CisJCWNhc2UgMDoJCWJyZWFrOworCQljYXNlIC1FQUdBSU46CXJldHVybiAwOworCQlkZWZhdWx0OglyZXR1cm4gcmV0OworCQl9CisKKwkJdG1wID0gbnRvaGwoY2FsbC0+dG1wKTsKKwkJX2RlYnVnKCJDQiBjb3VudDogJXUiLCB0bXApOworCQlpZiAodG1wICE9IGNhbGwtPmNvdW50ICYmIHRtcCAhPSAwKQorCQkJcmV0dXJuIC1FQkFETVNHOworCQljYWxsLT5vZmZzZXQgPSAwOworCQljYWxsLT51bm1hcnNoYWxsKys7CisJCWlmICh0bXAgPT0gMCkKKwkJCWdvdG8gZW1wdHlfY2JfYXJyYXk7CisKKwljYXNlIDQ6CisJCV9kZWJ1ZygiZXh0cmFjdCBDQiBhcnJheSIpOworCQlyZXQgPSBhZnNfZXh0cmFjdF9kYXRhKGNhbGwsIHNrYiwgbGFzdCwgY2FsbC0+cmVxdWVzdCwKKwkJCQkgICAgICAgY2FsbC0+Y291bnQgKiAzICogNCk7CisJCXN3aXRjaCAocmV0KSB7CisJCWNhc2UgMDoJCWJyZWFrOworCQljYXNlIC1FQUdBSU46CXJldHVybiAwOworCQlkZWZhdWx0OglyZXR1cm4gcmV0OworCQl9CisKKwkJX2RlYnVnKCJ1bm1hcnNoYWxsIENCIGFycmF5Iik7CisJCWNiID0gY2FsbC0+cmVxdWVzdDsKKwkJYnAgPSBjYWxsLT5idWZmZXI7CisJCWZvciAobG9vcCA9IGNhbGwtPmNvdW50OyBsb29wID4gMDsgbG9vcC0tLCBjYisrKSB7CisJCQljYi0+dmVyc2lvbgk9IG50b2hsKCpicCsrKTsKKwkJCWNiLT5leHBpcnkJPSBudG9obCgqYnArKyk7CisJCQljYi0+dHlwZQk9IG50b2hsKCpicCsrKTsKKwkJfQorCisJZW1wdHlfY2JfYXJyYXk6CisJCWNhbGwtPm9mZnNldCA9IDA7CisJCWNhbGwtPnVubWFyc2hhbGwrKzsKKworCWNhc2UgNToKKwkJX2RlYnVnKCJ0cmFpbGVyIik7CisJCWlmIChza2ItPmxlbiAhPSAwKQorCQkJcmV0dXJuIC1FQkFETVNHOworCQlicmVhazsKKwl9CisKKwlpZiAoIWxhc3QpCisJCXJldHVybiAwOworCisJY2FsbC0+c3RhdGUgPSBBRlNfQ0FMTF9SRVBMWUlORzsKKworCS8qIHdlJ2xsIG5lZWQgdGhlIGZpbGUgc2VydmVyIHJlY29yZCBhcyB0aGF0IHRlbGxzIHVzIHdoaWNoIHNldCBvZgorCSAqIHZub2RlcyB0byBvcGVyYXRlIHVwb24gKi8KKwltZW1jcHkoJmFkZHIsICZpcF9oZHIoc2tiKS0+c2FkZHIsIDQpOworCXNlcnZlciA9IGFmc19maW5kX3NlcnZlcigmYWRkcik7CisJaWYgKCFzZXJ2ZXIpCisJCXJldHVybiAtRU5PVENPTk47CisJY2FsbC0+c2VydmVyID0gc2VydmVyOworCisJSU5JVF9XT1JLKCZjYWxsLT53b3JrLCBTUlhBRlNDQl9DYWxsQmFjayk7CisJc2NoZWR1bGVfd29yaygmY2FsbC0+d29yayk7CiAJcmV0dXJuIDA7Cit9CiAKLX0gLyogZW5kIGFmc2NtX25ld19jYWxsKCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKLSAqIHF1ZXVlIG9uIHRoZSBrYWZzY21kIHF1ZXVlIGZvciBhdHRlbnRpb24KKyAqIGFsbG93IHRoZSBmaWxlc2VydmVyIHRvIHJlcXVlc3QgY2FsbGJhY2sgc3RhdGUgKHJlLSlpbml0aWFsaXNhdGlvbgogICovCi1zdGF0aWMgdm9pZCBhZnNjbV9hdHRlbnRpb24oc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpCitzdGF0aWMgdm9pZCBTUlhBRlNDQl9Jbml0Q2FsbEJhY2tTdGF0ZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0JX2VudGVyKCIlcHtjaWQ9JXUgdT0lZH0iLAotCSAgICAgICBjYWxsLCBudG9obChjYWxsLT5jYWxsX2lkKSwgYXRvbWljX3JlYWQoJmNhbGwtPnVzYWdlKSk7CisJc3RydWN0IGFmc19jYWxsICpjYWxsID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBhZnNfY2FsbCwgd29yayk7CiAKLQlzcGluX2xvY2soJmthZnNjbWRfYXR0ZW50aW9uX2xvY2spOworCV9lbnRlcigieyVwfSIsIGNhbGwtPnNlcnZlcik7CiAKLQlpZiAobGlzdF9lbXB0eSgmY2FsbC0+YXBwX2F0dG5fbGluaykpIHsKLQkJbGlzdF9hZGRfdGFpbCgmY2FsbC0+YXBwX2F0dG5fbGluaywgJmthZnNjbWRfYXR0ZW50aW9uX2xpc3QpOwotCQlyeHJwY19nZXRfY2FsbChjYWxsKTsKLQl9CisJYWZzX2luaXRfY2FsbGJhY2tfc3RhdGUoY2FsbC0+c2VydmVyKTsKKwlhZnNfc2VuZF9lbXB0eV9yZXBseShjYWxsKTsKKwlfbGVhdmUoIiIpOworfQogCi0Jc3Bpbl91bmxvY2soJmthZnNjbWRfYXR0ZW50aW9uX2xvY2spOwotCi0Jd2FrZV91cCgma2Fmc2NtZF9zbGVlcHEpOwotCi0JX2xlYXZlKCIge3U9JWR9IiwgYXRvbWljX3JlYWQoJmNhbGwtPnVzYWdlKSk7Ci19IC8qIGVuZCBhZnNjbV9hdHRlbnRpb24oKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgotICogaGFuZGxlIG15IGNhbGwgYmVpbmcgYWJvcnRlZAotICogLSBjbGVhbiB1cCwgZGVxdWV1ZSBhbmQgcHV0IG15IHJlZiB0byB0aGUgY2FsbAorICogZGVsaXZlciByZXF1ZXN0IGRhdGEgdG8gYSBDQi5Jbml0Q2FsbEJhY2tTdGF0ZSBjYWxsCiAgKi8KLXN0YXRpYyB2b2lkIGFmc2NtX2Vycm9yKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKQorc3RhdGljIGludCBhZnNfZGVsaXZlcl9jYl9pbml0X2NhbGxfYmFja19zdGF0ZShzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwsCisJCQkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCQkgICAgICAgYm9vbCBsYXN0KQogewotCWludCByZW1vdmVkOworCXN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXI7CisJc3RydWN0IGluX2FkZHIgYWRkcjsKIAotCV9lbnRlcigiJXB7ZXN0PSVzIGFjPSV1IGVyPSVkfSIsCi0JICAgICAgIGNhbGwsCi0JICAgICAgIHJ4cnBjX2NhbGxfZXJyb3Jfc3RhdGVzW2NhbGwtPmFwcF9lcnJfc3RhdGVdLAotCSAgICAgICBjYWxsLT5hcHBfYWJvcnRfY29kZSwKLQkgICAgICAgY2FsbC0+YXBwX2Vycm5vKTsKKwlfZW50ZXIoIix7JXV9LCVkIiwgc2tiLT5sZW4sIGxhc3QpOwogCi0Jc3Bpbl9sb2NrKCZrYWZzY21kX2F0dGVudGlvbl9sb2NrKTsKKwlpZiAoc2tiLT5sZW4gPiAwKQorCQlyZXR1cm4gLUVCQURNU0c7CisJaWYgKCFsYXN0KQorCQlyZXR1cm4gMDsKIAotCWlmIChsaXN0X2VtcHR5KCZjYWxsLT5hcHBfYXR0bl9saW5rKSkgewotCQlsaXN0X2FkZF90YWlsKCZjYWxsLT5hcHBfYXR0bl9saW5rLCAma2Fmc2NtZF9hdHRlbnRpb25fbGlzdCk7Ci0JCXJ4cnBjX2dldF9jYWxsKGNhbGwpOworCS8qIG5vIHVubWFyc2hhbGxpbmcgcmVxdWlyZWQgKi8KKwljYWxsLT5zdGF0ZSA9IEFGU19DQUxMX1JFUExZSU5HOworCisJLyogd2UnbGwgbmVlZCB0aGUgZmlsZSBzZXJ2ZXIgcmVjb3JkIGFzIHRoYXQgdGVsbHMgdXMgd2hpY2ggc2V0IG9mCisJICogdm5vZGVzIHRvIG9wZXJhdGUgdXBvbiAqLworCW1lbWNweSgmYWRkciwgJmlwX2hkcihza2IpLT5zYWRkciwgNCk7CisJc2VydmVyID0gYWZzX2ZpbmRfc2VydmVyKCZhZGRyKTsKKwlpZiAoIXNlcnZlcikKKwkJcmV0dXJuIC1FTk9UQ09OTjsKKwljYWxsLT5zZXJ2ZXIgPSBzZXJ2ZXI7CisKKwlJTklUX1dPUksoJmNhbGwtPndvcmssIFNSWEFGU0NCX0luaXRDYWxsQmFja1N0YXRlKTsKKwlzY2hlZHVsZV93b3JrKCZjYWxsLT53b3JrKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGRlbGl2ZXIgcmVxdWVzdCBkYXRhIHRvIGEgQ0IuSW5pdENhbGxCYWNrU3RhdGUzIGNhbGwKKyAqLworc3RhdGljIGludCBhZnNfZGVsaXZlcl9jYl9pbml0X2NhbGxfYmFja19zdGF0ZTMoc3RydWN0IGFmc19jYWxsICpjYWxsLAorCQkJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkJCWJvb2wgbGFzdCkKK3sKKwlzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyOworCXN0cnVjdCBpbl9hZGRyIGFkZHI7CisKKwlfZW50ZXIoIix7JXV9LCVkIiwgc2tiLT5sZW4sIGxhc3QpOworCisJaWYgKCFsYXN0KQorCQlyZXR1cm4gMDsKKworCS8qIG5vIHVubWFyc2hhbGxpbmcgcmVxdWlyZWQgKi8KKwljYWxsLT5zdGF0ZSA9IEFGU19DQUxMX1JFUExZSU5HOworCisJLyogd2UnbGwgbmVlZCB0aGUgZmlsZSBzZXJ2ZXIgcmVjb3JkIGFzIHRoYXQgdGVsbHMgdXMgd2hpY2ggc2V0IG9mCisJICogdm5vZGVzIHRvIG9wZXJhdGUgdXBvbiAqLworCW1lbWNweSgmYWRkciwgJmlwX2hkcihza2IpLT5zYWRkciwgNCk7CisJc2VydmVyID0gYWZzX2ZpbmRfc2VydmVyKCZhZGRyKTsKKwlpZiAoIXNlcnZlcikKKwkJcmV0dXJuIC1FTk9UQ09OTjsKKwljYWxsLT5zZXJ2ZXIgPSBzZXJ2ZXI7CisKKwlJTklUX1dPUksoJmNhbGwtPndvcmssIFNSWEFGU0NCX0luaXRDYWxsQmFja1N0YXRlKTsKKwlzY2hlZHVsZV93b3JrKCZjYWxsLT53b3JrKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGFsbG93IHRoZSBmaWxlc2VydmVyIHRvIHNlZSBpZiB0aGUgY2FjaGUgbWFuYWdlciBpcyBzdGlsbCBhbGl2ZQorICovCitzdGF0aWMgdm9pZCBTUlhBRlNDQl9Qcm9iZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGFmc19jYWxsICpjYWxsID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBhZnNfY2FsbCwgd29yayk7CisKKwlfZW50ZXIoIiIpOworCWFmc19zZW5kX2VtcHR5X3JlcGx5KGNhbGwpOworCV9sZWF2ZSgiIik7Cit9CisKKy8qCisgKiBkZWxpdmVyIHJlcXVlc3QgZGF0YSB0byBhIENCLlByb2JlIGNhbGwKKyAqLworc3RhdGljIGludCBhZnNfZGVsaXZlcl9jYl9wcm9iZShzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkJYm9vbCBsYXN0KQoreworCV9lbnRlcigiLHsldX0sJWQiLCBza2ItPmxlbiwgbGFzdCk7CisKKwlpZiAoc2tiLT5sZW4gPiAwKQorCQlyZXR1cm4gLUVCQURNU0c7CisJaWYgKCFsYXN0KQorCQlyZXR1cm4gMDsKKworCS8qIG5vIHVubWFyc2hhbGxpbmcgcmVxdWlyZWQgKi8KKwljYWxsLT5zdGF0ZSA9IEFGU19DQUxMX1JFUExZSU5HOworCisJSU5JVF9XT1JLKCZjYWxsLT53b3JrLCBTUlhBRlNDQl9Qcm9iZSk7CisJc2NoZWR1bGVfd29yaygmY2FsbC0+d29yayk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBhbGxvdyB0aGUgZmlsZXNlcnZlciB0byBhc2sgYWJvdXQgdGhlIGNhY2hlIG1hbmFnZXIncyBjYXBhYmlsaXRpZXMKKyAqLworc3RhdGljIHZvaWQgU1JYQUZTQ0JfR2V0Q2FwYWJpbGl0aWVzKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgYWZzX2ludGVyZmFjZSAqaWZzOworCXN0cnVjdCBhZnNfY2FsbCAqY2FsbCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYWZzX2NhbGwsIHdvcmspOworCWludCBsb29wLCBuaWZzOworCisJc3RydWN0IHsKKwkJc3RydWN0IC8qIEludGVyZmFjZUFkZHIgKi8geworCQkJX19iZTMyIG5pZnM7CisJCQlfX2JlMzIgdXVpZFsxMV07CisJCQlfX2JlMzIgaWZhZGRyWzMyXTsKKwkJCV9fYmUzMiBuZXRtYXNrWzMyXTsKKwkJCV9fYmUzMiBtdHVbMzJdOworCQl9IGlhOworCQlzdHJ1Y3QgLyogQ2FwYWJpbGl0aWVzICovIHsKKwkJCV9fYmUzMiBjYXBjb3VudDsKKwkJCV9fYmUzMiBjYXBzWzFdOworCQl9IGNhcDsKKwl9IHJlcGx5OworCisJX2VudGVyKCIiKTsKKworCW5pZnMgPSAwOworCWlmcyA9IGtjYWxsb2MoMzIsIHNpemVvZigqaWZzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGlmcykgeworCQluaWZzID0gYWZzX2dldF9pcHY0X2ludGVyZmFjZXMoaWZzLCAzMiwgZmFsc2UpOworCQlpZiAobmlmcyA8IDApIHsKKwkJCWtmcmVlKGlmcyk7CisJCQlpZnMgPSBOVUxMOworCQkJbmlmcyA9IDA7CisJCX0KIAl9CiAKLQlzcGluX3VubG9jaygma2Fmc2NtZF9hdHRlbnRpb25fbG9jayk7CisJbWVtc2V0KCZyZXBseSwgMCwgc2l6ZW9mKHJlcGx5KSk7CisJcmVwbHkuaWEubmlmcyA9IGh0b25sKG5pZnMpOwogCi0JcmVtb3ZlZCA9IDA7Ci0Jc3Bpbl9sb2NrKCZhZnNjbV9jYWxsc19sb2NrKTsKLQlpZiAoIWxpc3RfZW1wdHkoJmNhbGwtPmFwcF9saW5rKSkgewotCQlsaXN0X2RlbF9pbml0KCZjYWxsLT5hcHBfbGluayk7Ci0JCXJlbW92ZWQgPSAxOworCXJlcGx5LmlhLnV1aWRbMF0gPSBodG9ubChhZnNfdXVpZC50aW1lX2xvdyk7CisJcmVwbHkuaWEudXVpZFsxXSA9IGh0b25sKGFmc191dWlkLnRpbWVfbWlkKTsKKwlyZXBseS5pYS51dWlkWzJdID0gaHRvbmwoYWZzX3V1aWQudGltZV9oaV9hbmRfdmVyc2lvbik7CisJcmVwbHkuaWEudXVpZFszXSA9IGh0b25sKChzOCkgYWZzX3V1aWQuY2xvY2tfc2VxX2hpX2FuZF9yZXNlcnZlZCk7CisJcmVwbHkuaWEudXVpZFs0XSA9IGh0b25sKChzOCkgYWZzX3V1aWQuY2xvY2tfc2VxX2xvdyk7CisJZm9yIChsb29wID0gMDsgbG9vcCA8IDY7IGxvb3ArKykKKwkJcmVwbHkuaWEudXVpZFtsb29wICsgNV0gPSBodG9ubCgoczgpIGFmc191dWlkLm5vZGVbbG9vcF0pOworCisJaWYgKGlmcykgeworCQlmb3IgKGxvb3AgPSAwOyBsb29wIDwgbmlmczsgbG9vcCsrKSB7CisJCQlyZXBseS5pYS5pZmFkZHJbbG9vcF0gPSBpZnNbbG9vcF0uYWRkcmVzcy5zX2FkZHI7CisJCQlyZXBseS5pYS5uZXRtYXNrW2xvb3BdID0gaWZzW2xvb3BdLm5ldG1hc2suc19hZGRyOworCQkJcmVwbHkuaWEubXR1W2xvb3BdID0gaHRvbmwoaWZzW2xvb3BdLm10dSk7CisJCX0KIAl9Ci0Jc3Bpbl91bmxvY2soJmFmc2NtX2NhbGxzX2xvY2spOwogCi0JaWYgKHJlbW92ZWQpCi0JCXJ4cnBjX3B1dF9jYWxsKGNhbGwpOwotCi0Jd2FrZV91cCgma2Fmc2NtZF9zbGVlcHEpOworCXJlcGx5LmNhcC5jYXBjb3VudCA9IGh0b25sKDEpOworCXJlcGx5LmNhcC5jYXBzWzBdID0gaHRvbmwoQUZTX0NBUF9FUlJPUl9UUkFOU0xBVElPTik7CisJYWZzX3NlbmRfc2ltcGxlX3JlcGx5KGNhbGwsICZyZXBseSwgc2l6ZW9mKHJlcGx5KSk7CiAKIAlfbGVhdmUoIiIpOwotfSAvKiBlbmQgYWZzY21fZXJyb3IoKSAqLworfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgotICogbWFwIGFmcyBhYm9ydCBjb2RlcyB0by9mcm9tIExpbnV4IGVycm9yIGNvZGVzCi0gKiAtIGNhbGxlZCB3aXRoIGNhbGwtPmxvY2sgaGVsZAorICogZGVsaXZlciByZXF1ZXN0IGRhdGEgdG8gYSBDQi5HZXRDYXBhYmlsaXRpZXMgY2FsbAogICovCi1zdGF0aWMgdm9pZCBhZnNjbV9hZW1hcChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCkKK3N0YXRpYyBpbnQgYWZzX2RlbGl2ZXJfY2JfZ2V0X2NhcGFiaWxpdGllcyhzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwsCisJCQkJCSAgIHN0cnVjdCBza19idWZmICpza2IsIGJvb2wgbGFzdCkKIHsKLQlzd2l0Y2ggKGNhbGwtPmFwcF9lcnJfc3RhdGUpIHsKLQljYXNlIFJYUlBDX0VTVEFURV9MT0NBTF9BQk9SVDoKLQkJY2FsbC0+YXBwX2Fib3J0X2NvZGUgPSAtY2FsbC0+YXBwX2Vycm5vOwotCQlicmVhazsKLQljYXNlIFJYUlBDX0VTVEFURV9QRUVSX0FCT1JUOgotCQljYWxsLT5hcHBfZXJybm8gPSAtRUNPTk5BQk9SVEVEOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci19IC8qIGVuZCBhZnNjbV9hZW1hcCgpICovCisJX2VudGVyKCIseyV1fSwlZCIsIHNrYi0+bGVuLCBsYXN0KTsKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIHN0YXJ0IHRoZSBjYWNoZSBtYW5hZ2VyIHNlcnZpY2UgaWYgbm90IGFscmVhZHkgc3RhcnRlZAotICovCi1pbnQgYWZzY21fc3RhcnQodm9pZCkKLXsKLQlpbnQgcmV0OworCWlmIChza2ItPmxlbiA+IDApCisJCXJldHVybiAtRUJBRE1TRzsKKwlpZiAoIWxhc3QpCisJCXJldHVybiAwOwogCi0JZG93bl93cml0ZSgmYWZzY21fc2VtKTsKLQlpZiAoIWFmc2NtX3VzYWdlKSB7Ci0JCXJldCA9IGtlcm5lbF90aHJlYWQoa2Fmc2NtZCwgTlVMTCwgMCk7Ci0JCWlmIChyZXQgPCAwKQotCQkJZ290byBvdXQ7CisJLyogbm8gdW5tYXJzaGFsbGluZyByZXF1aXJlZCAqLworCWNhbGwtPnN0YXRlID0gQUZTX0NBTExfUkVQTFlJTkc7CiAKLQkJd2FpdF9mb3JfY29tcGxldGlvbigma2Fmc2NtZF9hbGl2ZSk7Ci0KLQkJcmV0ID0gcnhycGNfYWRkX3NlcnZpY2UoYWZzX3RyYW5zcG9ydCwgJkFGU0NNX3NlcnZpY2UpOwotCQlpZiAocmV0IDwgMCkKLQkJCWdvdG8ga2lsbDsKLQotCQlhZnNfa2Fmc3RpbW9kX2FkZF90aW1lcigmYWZzX21udHB0X2V4cGlyeV90aW1lciwKLQkJCQkJYWZzX21udHB0X2V4cGlyeV90aW1lb3V0ICogSFopOwotCX0KLQotCWFmc2NtX3VzYWdlKys7Ci0JdXBfd3JpdGUoJmFmc2NtX3NlbSk7Ci0KKwlJTklUX1dPUksoJmNhbGwtPndvcmssIFNSWEFGU0NCX0dldENhcGFiaWxpdGllcyk7CisJc2NoZWR1bGVfd29yaygmY2FsbC0+d29yayk7CiAJcmV0dXJuIDA7Ci0KLSBraWxsOgotCWthZnNjbWRfZGllID0gMTsKLQl3YWtlX3VwKCZrYWZzY21kX3NsZWVwcSk7Ci0Jd2FpdF9mb3JfY29tcGxldGlvbigma2Fmc2NtZF9kZWFkKTsKLQotIG91dDoKLQl1cF93cml0ZSgmYWZzY21fc2VtKTsKLQlyZXR1cm4gcmV0OwotCi19IC8qIGVuZCBhZnNjbV9zdGFydCgpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBzdG9wIHRoZSBjYWNoZSBtYW5hZ2VyIHNlcnZpY2UKLSAqLwotdm9pZCBhZnNjbV9zdG9wKHZvaWQpCi17Ci0Jc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGw7Ci0KLQlkb3duX3dyaXRlKCZhZnNjbV9zZW0pOwotCi0JQlVHX09OKGFmc2NtX3VzYWdlID09IDApOwotCWFmc2NtX3VzYWdlLS07Ci0KLQlpZiAoYWZzY21fdXNhZ2UgPT0gMCkgewotCQkvKiBkb24ndCB3YW50IG1vcmUgaW5jb21pbmcgY2FsbHMgKi8KLQkJcnhycGNfZGVsX3NlcnZpY2UoYWZzX3RyYW5zcG9ydCwgJkFGU0NNX3NlcnZpY2UpOwotCi0JCS8qIGFib3J0IGFueSBjYWxscyBJJ3ZlIHN0aWxsIGdvdCBvcGVuICh0aGUgYWZzY21fZXJyb3IoKSB3aWxsCi0JCSAqIGRlcXVldWUgdGhlbSkgKi8KLQkJc3Bpbl9sb2NrKCZhZnNjbV9jYWxsc19sb2NrKTsKLQkJd2hpbGUgKCFsaXN0X2VtcHR5KCZhZnNjbV9jYWxscykpIHsKLQkJCWNhbGwgPSBsaXN0X2VudHJ5KGFmc2NtX2NhbGxzLm5leHQsCi0JCQkJCSAgc3RydWN0IHJ4cnBjX2NhbGwsCi0JCQkJCSAgYXBwX2xpbmspOwotCi0JCQlsaXN0X2RlbF9pbml0KCZjYWxsLT5hcHBfbGluayk7Ci0JCQlyeHJwY19nZXRfY2FsbChjYWxsKTsKLQkJCXNwaW5fdW5sb2NrKCZhZnNjbV9jYWxsc19sb2NrKTsKLQotCQkJcnhycGNfY2FsbF9hYm9ydChjYWxsLCAtRVNSQ0gpOyAvKiBhYm9ydCwgZGVxdWV1ZSBhbmQKLQkJCQkJCQkgKiBwdXQgKi8KLQotCQkJX2RlYnVnKCJudWtpbmcgYWN0aXZlIGNhbGwgJTA4eC4lZCIsCi0JCQkgICAgICAgbnRvaGwoY2FsbC0+Y29ubi0+Y29ubl9pZCksCi0JCQkgICAgICAgbnRvaGwoY2FsbC0+Y2FsbF9pZCkpOwotCQkJcnhycGNfcHV0X2NhbGwoY2FsbCk7Ci0JCQlyeHJwY19wdXRfY2FsbChjYWxsKTsKLQotCQkJc3Bpbl9sb2NrKCZhZnNjbV9jYWxsc19sb2NrKTsKLQkJfQotCQlzcGluX3VubG9jaygmYWZzY21fY2FsbHNfbG9jayk7Ci0KLQkJLyogZ2V0IHJpZCBvZiBteSBkYWVtb24gKi8KLQkJa2Fmc2NtZF9kaWUgPSAxOwotCQl3YWtlX3VwKCZrYWZzY21kX3NsZWVwcSk7Ci0JCXdhaXRfZm9yX2NvbXBsZXRpb24oJmthZnNjbWRfZGVhZCk7Ci0KLQkJLyogZGlzcG9zZSBvZiBhbnkgY2FsbHMgd2FpdGluZyBmb3IgYXR0ZW50aW9uICovCi0JCXNwaW5fbG9jaygma2Fmc2NtZF9hdHRlbnRpb25fbG9jayk7Ci0JCXdoaWxlICghbGlzdF9lbXB0eSgma2Fmc2NtZF9hdHRlbnRpb25fbGlzdCkpIHsKLQkJCWNhbGwgPSBsaXN0X2VudHJ5KGthZnNjbWRfYXR0ZW50aW9uX2xpc3QubmV4dCwKLQkJCQkJICBzdHJ1Y3QgcnhycGNfY2FsbCwKLQkJCQkJICBhcHBfYXR0bl9saW5rKTsKLQotCQkJbGlzdF9kZWxfaW5pdCgmY2FsbC0+YXBwX2F0dG5fbGluayk7Ci0JCQlzcGluX3VubG9jaygma2Fmc2NtZF9hdHRlbnRpb25fbG9jayk7Ci0KLQkJCXJ4cnBjX3B1dF9jYWxsKGNhbGwpOwotCi0JCQlzcGluX2xvY2soJmthZnNjbWRfYXR0ZW50aW9uX2xvY2spOwotCQl9Ci0JCXNwaW5fdW5sb2NrKCZrYWZzY21kX2F0dGVudGlvbl9sb2NrKTsKLQotCQlhZnNfa2Fmc3RpbW9kX2RlbF90aW1lcigmYWZzX21udHB0X2V4cGlyeV90aW1lcik7Ci0JfQotCi0JdXBfd3JpdGUoJmFmc2NtX3NlbSk7Ci0KLX0gLyogZW5kIGFmc2NtX3N0b3AoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogaGFuZGxlIHRoZSBmaWxlc2VydmVyIGJyZWFraW5nIGEgc2V0IG9mIGNhbGxiYWNrcwotICovCi1zdGF0aWMgdm9pZCBfU1JYQUZTQ01fQ2FsbEJhY2soc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpCi17Ci0Jc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlcjsKLQlzaXplX3QgY291bnQsIHF0eSwgdG1wOwotCWludCByZXQgPSAwLCByZW1vdmVkOwotCi0JX2VudGVyKCIlcHthY3M9JXN9IiwgY2FsbCwgcnhycGNfY2FsbF9zdGF0ZXNbY2FsbC0+YXBwX2NhbGxfc3RhdGVdKTsKLQotCXNlcnZlciA9IGFmc19zZXJ2ZXJfZ2V0X2Zyb21fcGVlcihjYWxsLT5jb25uLT5wZWVyKTsKLQotCXN3aXRjaCAoY2FsbC0+YXBwX2NhbGxfc3RhdGUpIHsKLQkJLyogd2UndmUgcmVjZWl2ZWQgdGhlIGxhc3QgcGFja2V0Ci0JCSAqIC0gZHJhaW4gYWxsIHRoZSBkYXRhIGZyb20gdGhlIGNhbGwgYW5kIHNlbmQgdGhlIHJlcGx5Ci0JCSAqLwotCWNhc2UgUlhSUENfQ1NUQVRFX1NSVlJfR09UX0FSR1M6Ci0JCXJldCA9IC1FQkFETVNHOwotCQlxdHkgPSBjYWxsLT5hcHBfcmVhZHlfcXR5OwotCQlpZiAocXR5IDwgOCB8fCBxdHkgPiA1MCAqICg2ICogNCkgKyA4KQotCQkJYnJlYWs7Ci0KLQkJewotCQkJc3RydWN0IGFmc19jYWxsYmFjayAqY2IsICpwY2I7Ci0JCQlpbnQgbG9vcDsKLQkJCV9fYmUzMiAqZnAsICpicDsKLQotCQkJZnAgPSByeHJwY19jYWxsX2FsbG9jX3NjcmF0Y2goY2FsbCwgcXR5KTsKLQotCQkJLyogZHJhZyB0aGUgZW50aXJlIGFyZ3VtZW50IGJsb2NrIG91dCB0byB0aGUgc2NyYXRjaAotCQkJICogc3BhY2UgKi8KLQkJCXJldCA9IHJ4cnBjX2NhbGxfcmVhZF9kYXRhKGNhbGwsIGZwLCBxdHksIDApOwotCQkJaWYgKHJldCA8IDApCi0JCQkJYnJlYWs7Ci0KLQkJCS8qIGFuZCB1bm1hcnNoYWxsIHRoZSBwYXJhbWV0ZXIgYmxvY2sgKi8KLQkJCXJldCA9IC1FQkFETVNHOwotCQkJY291bnQgPSBudG9obCgqZnArKyk7Ci0JCQlpZiAoY291bnQ+QUZTQ0JNQVggfHwKLQkJCSAgICAoY291bnQgKiAoMyAqIDQpICsgOCAhPSBxdHkgJiYKLQkJCSAgICAgY291bnQgKiAoNiAqIDQpICsgOCAhPSBxdHkpKQotCQkJCWJyZWFrOwotCi0JCQlicCA9IGZwICsgY291bnQqMzsKLQkJCXRtcCA9IG50b2hsKCpicCsrKTsKLQkJCWlmICh0bXAgPiAwICYmIHRtcCAhPSBjb3VudCkKLQkJCQlicmVhazsKLQkJCWlmICh0bXAgPT0gMCkKLQkJCQlicCA9IE5VTEw7Ci0KLQkJCXBjYiA9IGNiID0gcnhycGNfY2FsbF9hbGxvY19zY3JhdGNoX3MoCi0JCQkJY2FsbCwgc3RydWN0IGFmc19jYWxsYmFjayk7Ci0KLQkJCWZvciAobG9vcCA9IGNvdW50IC0gMTsgbG9vcCA+PSAwOyBsb29wLS0pIHsKLQkJCQlwY2ItPmZpZC52aWQJPSBudG9obCgqZnArKyk7Ci0JCQkJcGNiLT5maWQudm5vZGUJPSBudG9obCgqZnArKyk7Ci0JCQkJcGNiLT5maWQudW5pcXVlCT0gbnRvaGwoKmZwKyspOwotCQkJCWlmIChicCkgewotCQkJCQlwY2ItPnZlcnNpb24JPSBudG9obCgqYnArKyk7Ci0JCQkJCXBjYi0+ZXhwaXJ5CT0gbnRvaGwoKmJwKyspOwotCQkJCQlwY2ItPnR5cGUJPSBudG9obCgqYnArKyk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlwY2ItPnZlcnNpb24JPSAwOwotCQkJCQlwY2ItPmV4cGlyeQk9IDA7Ci0JCQkJCXBjYi0+dHlwZQk9IEFGU0NNX0NCX1VOVFlQRUQ7Ci0JCQkJfQotCQkJCXBjYisrOwotCQkJfQotCi0JCQkvKiBpbnZva2UgdGhlIGFjdHVhbCBzZXJ2aWNlIHJvdXRpbmUgKi8KLQkJCXJldCA9IFNSWEFGU0NNX0NhbGxCYWNrKHNlcnZlciwgY291bnQsIGNiKTsKLQkJCWlmIChyZXQgPCAwKQotCQkJCWJyZWFrOwotCQl9Ci0KLQkJLyogc2VuZCB0aGUgcmVwbHkgKi8KLQkJcmV0ID0gcnhycGNfY2FsbF93cml0ZV9kYXRhKGNhbGwsIDAsIE5VTEwsIFJYUlBDX0xBU1RfUEFDS0VULAotCQkJCQkgICAgR0ZQX0tFUk5FTCwgMCwgJmNvdW50KTsKLQkJaWYgKHJldCA8IDApCi0JCQlicmVhazsKLQkJYnJlYWs7Ci0KLQkJLyogb3BlcmF0aW9uIGNvbXBsZXRlICovCi0JY2FzZSBSWFJQQ19DU1RBVEVfQ09NUExFVEU6Ci0JCWNhbGwtPmFwcF91c2VyID0gTlVMTDsKLQkJcmVtb3ZlZCA9IDA7Ci0JCXNwaW5fbG9jaygmYWZzY21fY2FsbHNfbG9jayk7Ci0JCWlmICghbGlzdF9lbXB0eSgmY2FsbC0+YXBwX2xpbmspKSB7Ci0JCQlsaXN0X2RlbF9pbml0KCZjYWxsLT5hcHBfbGluayk7Ci0JCQlyZW1vdmVkID0gMTsKLQkJfQotCQlzcGluX3VubG9jaygmYWZzY21fY2FsbHNfbG9jayk7Ci0KLQkJaWYgKHJlbW92ZWQpCi0JCQlyeHJwY19wdXRfY2FsbChjYWxsKTsKLQkJYnJlYWs7Ci0KLQkJLyogb3BlcmF0aW9uIHRlcm1pbmF0ZWQgb24gZXJyb3IgKi8KLQljYXNlIFJYUlBDX0NTVEFURV9FUlJPUjoKLQkJY2FsbC0+YXBwX3VzZXIgPSBOVUxMOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQotCWlmIChyZXQgPCAwKQotCQlyeHJwY19jYWxsX2Fib3J0KGNhbGwsIHJldCk7Ci0KLQlhZnNfcHV0X3NlcnZlcihzZXJ2ZXIpOwotCi0JX2xlYXZlKCIgPSAlZCIsIHJldCk7Ci0KLX0gLyogZW5kIF9TUlhBRlNDTV9DYWxsQmFjaygpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBoYW5kbGUgdGhlIGZpbGVzZXJ2ZXIgYXNraW5nIHVzIHRvIGluaXRpYWxpc2Ugb3VyIGNhbGxiYWNrIHN0YXRlCi0gKi8KLXN0YXRpYyB2b2lkIF9TUlhBRlNDTV9Jbml0Q2FsbEJhY2tTdGF0ZShzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCkKLXsKLQlzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyOwotCXNpemVfdCBjb3VudDsKLQlpbnQgcmV0ID0gMCwgcmVtb3ZlZDsKLQotCV9lbnRlcigiJXB7YWNzPSVzfSIsIGNhbGwsIHJ4cnBjX2NhbGxfc3RhdGVzW2NhbGwtPmFwcF9jYWxsX3N0YXRlXSk7Ci0KLQlzZXJ2ZXIgPSBhZnNfc2VydmVyX2dldF9mcm9tX3BlZXIoY2FsbC0+Y29ubi0+cGVlcik7Ci0KLQlzd2l0Y2ggKGNhbGwtPmFwcF9jYWxsX3N0YXRlKSB7Ci0JCS8qIHdlJ3ZlIHJlY2VpdmVkIHRoZSBsYXN0IHBhY2tldCAtIGRyYWluIGFsbCB0aGUgZGF0YSBmcm9tIHRoZQotCQkgKiBjYWxsICovCi0JY2FzZSBSWFJQQ19DU1RBVEVfU1JWUl9HT1RfQVJHUzoKLQkJLyogc2hvdWxkbid0IGJlIGFueSBhcmdzICovCi0JCXJldCA9IC1FQkFETVNHOwotCQlicmVhazsKLQotCQkvKiBzZW5kIHRoZSByZXBseSB3aGVuIGFza2VkIGZvciBpdCAqLwotCWNhc2UgUlhSUENfQ1NUQVRFX1NSVlJfU05EX1JFUExZOgotCQkvKiBpbnZva2UgdGhlIGFjdHVhbCBzZXJ2aWNlIHJvdXRpbmUgKi8KLQkJcmV0ID0gU1JYQUZTQ01fSW5pdENhbGxCYWNrU3RhdGUoc2VydmVyKTsKLQkJaWYgKHJldCA8IDApCi0JCQlicmVhazsKLQotCQlyZXQgPSByeHJwY19jYWxsX3dyaXRlX2RhdGEoY2FsbCwgMCwgTlVMTCwgUlhSUENfTEFTVF9QQUNLRVQsCi0JCQkJCSAgICBHRlBfS0VSTkVMLCAwLCAmY291bnQpOwotCQlpZiAocmV0IDwgMCkKLQkJCWJyZWFrOwotCQlicmVhazsKLQotCQkvKiBvcGVyYXRpb24gY29tcGxldGUgKi8KLQljYXNlIFJYUlBDX0NTVEFURV9DT01QTEVURToKLQkJY2FsbC0+YXBwX3VzZXIgPSBOVUxMOwotCQlyZW1vdmVkID0gMDsKLQkJc3Bpbl9sb2NrKCZhZnNjbV9jYWxsc19sb2NrKTsKLQkJaWYgKCFsaXN0X2VtcHR5KCZjYWxsLT5hcHBfbGluaykpIHsKLQkJCWxpc3RfZGVsX2luaXQoJmNhbGwtPmFwcF9saW5rKTsKLQkJCXJlbW92ZWQgPSAxOwotCQl9Ci0JCXNwaW5fdW5sb2NrKCZhZnNjbV9jYWxsc19sb2NrKTsKLQotCQlpZiAocmVtb3ZlZCkKLQkJCXJ4cnBjX3B1dF9jYWxsKGNhbGwpOwotCQlicmVhazsKLQotCQkvKiBvcGVyYXRpb24gdGVybWluYXRlZCBvbiBlcnJvciAqLwotCWNhc2UgUlhSUENfQ1NUQVRFX0VSUk9SOgotCQljYWxsLT5hcHBfdXNlciA9IE5VTEw7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCi0JaWYgKHJldCA8IDApCi0JCXJ4cnBjX2NhbGxfYWJvcnQoY2FsbCwgcmV0KTsKLQotCWFmc19wdXRfc2VydmVyKHNlcnZlcik7Ci0KLQlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKLQotfSAvKiBlbmQgX1NSWEFGU0NNX0luaXRDYWxsQmFja1N0YXRlKCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIGhhbmRsZSBhIHByb2JlIGZyb20gYSBmaWxlc2VydmVyCi0gKi8KLXN0YXRpYyB2b2lkIF9TUlhBRlNDTV9Qcm9iZShzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCkKLXsKLQlzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyOwotCXNpemVfdCBjb3VudDsKLQlpbnQgcmV0ID0gMCwgcmVtb3ZlZDsKLQotCV9lbnRlcigiJXB7YWNzPSVzfSIsIGNhbGwsIHJ4cnBjX2NhbGxfc3RhdGVzW2NhbGwtPmFwcF9jYWxsX3N0YXRlXSk7Ci0KLQlzZXJ2ZXIgPSBhZnNfc2VydmVyX2dldF9mcm9tX3BlZXIoY2FsbC0+Y29ubi0+cGVlcik7Ci0KLQlzd2l0Y2ggKGNhbGwtPmFwcF9jYWxsX3N0YXRlKSB7Ci0JCS8qIHdlJ3ZlIHJlY2VpdmVkIHRoZSBsYXN0IHBhY2tldCAtIGRyYWluIGFsbCB0aGUgZGF0YSBmcm9tIHRoZQotCQkgKiBjYWxsICovCi0JY2FzZSBSWFJQQ19DU1RBVEVfU1JWUl9HT1RfQVJHUzoKLQkJLyogc2hvdWxkbid0IGJlIGFueSBhcmdzICovCi0JCXJldCA9IC1FQkFETVNHOwotCQlicmVhazsKLQotCQkvKiBzZW5kIHRoZSByZXBseSB3aGVuIGFza2VkIGZvciBpdCAqLwotCWNhc2UgUlhSUENfQ1NUQVRFX1NSVlJfU05EX1JFUExZOgotCQkvKiBpbnZva2UgdGhlIGFjdHVhbCBzZXJ2aWNlIHJvdXRpbmUgKi8KLQkJcmV0ID0gU1JYQUZTQ01fUHJvYmUoc2VydmVyKTsKLQkJaWYgKHJldCA8IDApCi0JCQlicmVhazsKLQotCQlyZXQgPSByeHJwY19jYWxsX3dyaXRlX2RhdGEoY2FsbCwgMCwgTlVMTCwgUlhSUENfTEFTVF9QQUNLRVQsCi0JCQkJCSAgICBHRlBfS0VSTkVMLCAwLCAmY291bnQpOwotCQlpZiAocmV0IDwgMCkKLQkJCWJyZWFrOwotCQlicmVhazsKLQotCQkvKiBvcGVyYXRpb24gY29tcGxldGUgKi8KLQljYXNlIFJYUlBDX0NTVEFURV9DT01QTEVURToKLQkJY2FsbC0+YXBwX3VzZXIgPSBOVUxMOwotCQlyZW1vdmVkID0gMDsKLQkJc3Bpbl9sb2NrKCZhZnNjbV9jYWxsc19sb2NrKTsKLQkJaWYgKCFsaXN0X2VtcHR5KCZjYWxsLT5hcHBfbGluaykpIHsKLQkJCWxpc3RfZGVsX2luaXQoJmNhbGwtPmFwcF9saW5rKTsKLQkJCXJlbW92ZWQgPSAxOwotCQl9Ci0JCXNwaW5fdW5sb2NrKCZhZnNjbV9jYWxsc19sb2NrKTsKLQotCQlpZiAocmVtb3ZlZCkKLQkJCXJ4cnBjX3B1dF9jYWxsKGNhbGwpOwotCQlicmVhazsKLQotCQkvKiBvcGVyYXRpb24gdGVybWluYXRlZCBvbiBlcnJvciAqLwotCWNhc2UgUlhSUENfQ1NUQVRFX0VSUk9SOgotCQljYWxsLT5hcHBfdXNlciA9IE5VTEw7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCi0JaWYgKHJldCA8IDApCi0JCXJ4cnBjX2NhbGxfYWJvcnQoY2FsbCwgcmV0KTsKLQotCWFmc19wdXRfc2VydmVyKHNlcnZlcik7Ci0KLQlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKLQotfSAvKiBlbmQgX1NSWEFGU0NNX1Byb2JlKCkgKi8KK30KZGlmZiAtLWdpdCBhL2ZzL2Fmcy9jbXNlcnZpY2UuaCBiL2ZzL2Fmcy9jbXNlcnZpY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY4ZDRkNi4uMDAwMDAwMAotLS0gYS9mcy9hZnMvY21zZXJ2aWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKiBjbXNlcnZpY2UuaDogQUZTIENhY2hlIE1hbmFnZXIgU2VydmljZSBkZWNsYXJhdGlvbnMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLQotI2lmbmRlZiBfTElOVVhfQUZTX0NNU0VSVklDRV9ICi0jZGVmaW5lIF9MSU5VWF9BRlNfQ01TRVJWSUNFX0gKLQotI2luY2x1ZGUgPHJ4cnBjL3RyYW5zcG9ydC5oPgotI2luY2x1ZGUgInR5cGVzLmgiCi0KLS8qIGNhY2hlIG1hbmFnZXIgc3RhcnQvc3RvcCAqLwotZXh0ZXJuIGludCBhZnNjbV9zdGFydCh2b2lkKTsKLWV4dGVybiB2b2lkIGFmc2NtX3N0b3Aodm9pZCk7Ci0KLS8qIGNhY2hlIG1hbmFnZXIgc2VydmVyIGZ1bmN0aW9ucyAqLwotZXh0ZXJuIGludCBTUlhBRlNDTV9Jbml0Q2FsbEJhY2tTdGF0ZShzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyKTsKLWV4dGVybiBpbnQgU1JYQUZTQ01fQ2FsbEJhY2soc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlciwKLQkJCSAgICAgc2l6ZV90IGNvdW50LAotCQkJICAgICBzdHJ1Y3QgYWZzX2NhbGxiYWNrIGNhbGxiYWNrc1tdKTsKLWV4dGVybiBpbnQgU1JYQUZTQ01fUHJvYmUoc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlcik7Ci0KLSNlbmRpZiAvKiBfTElOVVhfQUZTX0NNU0VSVklDRV9IICovCmRpZmYgLS1naXQgYS9mcy9hZnMvZGlyLmMgYi9mcy9hZnMvZGlyLmMKaW5kZXggYjZkYzJlYi4uZGFjNWI5OSAxMDA2NDQKLS0tIGEvZnMvYWZzL2Rpci5jCisrKyBiL2ZzL2Fmcy9kaXIuYwpAQCAtMTUsNDUgKzE1LDUzIEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgotI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+Ci0jaW5jbHVkZSAidm5vZGUuaCIKLSNpbmNsdWRlICJ2b2x1bWUuaCIKLSNpbmNsdWRlIDxyeHJwYy9jYWxsLmg+Ci0jaW5jbHVkZSAic3VwZXIuaCIKKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgogI2luY2x1ZGUgImludGVybmFsLmgiCiAKLXN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICphZnNfZGlyX2xvb2t1cChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAotCQkJCSAgICAgc3RydWN0IG5hbWVpZGF0YSAqbmQpOworc3RhdGljIHN0cnVjdCBkZW50cnkgKmFmc19sb29rdXAoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkJCQkgc3RydWN0IG5hbWVpZGF0YSAqbmQpOwogc3RhdGljIGludCBhZnNfZGlyX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOwotc3RhdGljIGludCBhZnNfZGlyX3JlYWRkaXIoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIpOworc3RhdGljIGludCBhZnNfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpcik7CiBzdGF0aWMgaW50IGFmc19kX3JldmFsaWRhdGUoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCk7CiBzdGF0aWMgaW50IGFmc19kX2RlbGV0ZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpOwotc3RhdGljIGludCBhZnNfZGlyX2xvb2t1cF9maWxsZGlyKHZvaWQgKl9jb29raWUsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBubGVuLAorc3RhdGljIHZvaWQgYWZzX2RfcmVsZWFzZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpOworc3RhdGljIGludCBhZnNfbG9va3VwX2ZpbGxkaXIodm9pZCAqX2Nvb2tpZSwgY29uc3QgY2hhciAqbmFtZSwgaW50IG5sZW4sCiAJCQkJICBsb2ZmX3QgZnBvcywgdTY0IGlubywgdW5zaWduZWQgZHR5cGUpOworc3RhdGljIGludCBhZnNfY3JlYXRlKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBtb2RlLAorCQkgICAgICBzdHJ1Y3QgbmFtZWlkYXRhICpuZCk7CitzdGF0aWMgaW50IGFmc19ta2RpcihzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbW9kZSk7CitzdGF0aWMgaW50IGFmc19ybWRpcihzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KTsKK3N0YXRpYyBpbnQgYWZzX3VubGluayhzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KTsKK3N0YXRpYyBpbnQgYWZzX2xpbmsoc3RydWN0IGRlbnRyeSAqZnJvbSwgc3RydWN0IGlub2RlICpkaXIsCisJCSAgICBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpOworc3RhdGljIGludCBhZnNfc3ltbGluayhzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQkgICAgICAgY29uc3QgY2hhciAqY29udGVudCk7CitzdGF0aWMgaW50IGFmc19yZW5hbWUoc3RydWN0IGlub2RlICpvbGRfZGlyLCBzdHJ1Y3QgZGVudHJ5ICpvbGRfZGVudHJ5LAorCQkgICAgICBzdHJ1Y3QgaW5vZGUgKm5ld19kaXIsIHN0cnVjdCBkZW50cnkgKm5ld19kZW50cnkpOwogCiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFmc19kaXJfZmlsZV9vcGVyYXRpb25zID0gewogCS5vcGVuCQk9IGFmc19kaXJfb3BlbiwKLQkucmVhZGRpcgk9IGFmc19kaXJfcmVhZGRpciwKKwkucmVsZWFzZQk9IGFmc19yZWxlYXNlLAorCS5yZWFkZGlyCT0gYWZzX3JlYWRkaXIsCiB9OwogCiBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBhZnNfZGlyX2lub2RlX29wZXJhdGlvbnMgPSB7Ci0JLmxvb2t1cAkJPSBhZnNfZGlyX2xvb2t1cCwKKwkuY3JlYXRlCQk9IGFmc19jcmVhdGUsCisJLmxvb2t1cAkJPSBhZnNfbG9va3VwLAorCS5saW5rCQk9IGFmc19saW5rLAorCS51bmxpbmsJCT0gYWZzX3VubGluaywKKwkuc3ltbGluawk9IGFmc19zeW1saW5rLAorCS5ta2RpcgkJPSBhZnNfbWtkaXIsCisJLnJtZGlyCQk9IGFmc19ybWRpciwKKwkucmVuYW1lCQk9IGFmc19yZW5hbWUsCisJLnBlcm1pc3Npb24JPSBhZnNfcGVybWlzc2lvbiwKIAkuZ2V0YXR0cgk9IGFmc19pbm9kZV9nZXRhdHRyLAotI2lmIDAgLyogVE9ETyAqLwotCS5jcmVhdGUJCT0gYWZzX2Rpcl9jcmVhdGUsCi0JLmxpbmsJCT0gYWZzX2Rpcl9saW5rLAotCS51bmxpbmsJCT0gYWZzX2Rpcl91bmxpbmssCi0JLnN5bWxpbmsJPSBhZnNfZGlyX3N5bWxpbmssCi0JLm1rZGlyCQk9IGFmc19kaXJfbWtkaXIsCi0JLnJtZGlyCQk9IGFmc19kaXJfcm1kaXIsCi0JLm1rbm9kCQk9IGFmc19kaXJfbWtub2QsCi0JLnJlbmFtZQkJPSBhZnNfZGlyX3JlbmFtZSwKLSNlbmRpZgogfTsKIAogc3RhdGljIHN0cnVjdCBkZW50cnlfb3BlcmF0aW9ucyBhZnNfZnNfZGVudHJ5X29wZXJhdGlvbnMgPSB7CiAJLmRfcmV2YWxpZGF0ZQk9IGFmc19kX3JldmFsaWRhdGUsCiAJLmRfZGVsZXRlCT0gYWZzX2RfZGVsZXRlLAorCS5kX3JlbGVhc2UJPSBhZnNfZF9yZWxlYXNlLAogfTsKIAogI2RlZmluZSBBRlNfRElSX0hBU0hUQkxfU0laRQkxMjgKQEAgLTEwNSwxNCArMTEzLDEzIEBACiAJdW5pb24gYWZzX2Rpcl9ibG9jayBibG9ja3NbUEFHRV9TSVpFIC8gc2l6ZW9mKHVuaW9uIGFmc19kaXJfYmxvY2spXTsKIH07CiAKLXN0cnVjdCBhZnNfZGlyX2xvb2t1cF9jb29raWUgeworc3RydWN0IGFmc19sb29rdXBfY29va2llIHsKIAlzdHJ1Y3QgYWZzX2ZpZAlmaWQ7CiAJY29uc3QgY2hhcgkqbmFtZTsKIAlzaXplX3QJCW5sZW47CiAJaW50CQlmb3VuZDsKIH07CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCiAgKiBjaGVjayB0aGF0IGEgZGlyZWN0b3J5IHBhZ2UgaXMgdmFsaWQKICAqLwpAQCAtMTI4LDkgKzEzNSwxMCBAQAogCWlmIChxdHkgPT0gMCkKIAkJZ290byBlcnJvcjsKIAotCWlmIChwYWdlLT5pbmRleD09MCAmJiBxdHkhPW50b2hzKGRidWYtPmJsb2Nrc1swXS5wYWdlaGRyLm5wYWdlcykpIHsKKwlpZiAocGFnZS0+aW5kZXggPT0gMCAmJiBxdHkgIT0gbnRvaHMoZGJ1Zi0+YmxvY2tzWzBdLnBhZ2VoZHIubnBhZ2VzKSkgewogCQlwcmludGsoImtBRlM6ICVzKCVsdSk6IHdyb25nIG51bWJlciBvZiBkaXIgYmxvY2tzICVkIT0laHVcbiIsCi0JCSAgICAgICBfX0ZVTkNUSU9OX18sZGlyLT5pX2lubyxxdHksbnRvaHMoZGJ1Zi0+YmxvY2tzWzBdLnBhZ2VoZHIubnBhZ2VzKSk7CisJCSAgICAgICBfX0ZVTkNUSU9OX18sIGRpci0+aV9pbm8sIHF0eSwKKwkJICAgICAgIG50b2hzKGRidWYtPmJsb2Nrc1swXS5wYWdlaGRyLm5wYWdlcykpOwogCQlnb3RvIGVycm9yOwogCX0KICNlbmRpZgpAQCAtMTU3LDEzICsxNjUsMTEgQEAKIAlTZXRQYWdlQ2hlY2tlZChwYWdlKTsKIAlyZXR1cm47CiAKLSBlcnJvcjoKK2Vycm9yOgogCVNldFBhZ2VDaGVja2VkKHBhZ2UpOwogCVNldFBhZ2VFcnJvcihwYWdlKTsKK30KIAotfSAvKiBlbmQgYWZzX2Rpcl9jaGVja19wYWdlKCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAqIGRpc2NhcmQgYSBwYWdlIGNhY2hlZCBpbiB0aGUgcGFnZWNhY2hlCiAgKi8KQEAgLTE3MSwyMCArMTc3LDIyIEBACiB7CiAJa3VubWFwKHBhZ2UpOwogCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKK30KIAotfSAvKiBlbmQgYWZzX2Rpcl9wdXRfcGFnZSgpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCiAgKiBnZXQgYSBwYWdlIGludG8gdGhlIHBhZ2VjYWNoZQogICovCi1zdGF0aWMgc3RydWN0IHBhZ2UgKmFmc19kaXJfZ2V0X3BhZ2Uoc3RydWN0IGlub2RlICpkaXIsIHVuc2lnbmVkIGxvbmcgaW5kZXgpCitzdGF0aWMgc3RydWN0IHBhZ2UgKmFmc19kaXJfZ2V0X3BhZ2Uoc3RydWN0IGlub2RlICpkaXIsIHVuc2lnbmVkIGxvbmcgaW5kZXgsCisJCQkJICAgICBzdHJ1Y3Qga2V5ICprZXkpCiB7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CisJc3RydWN0IGZpbGUgZmlsZSA9IHsKKwkJLnByaXZhdGVfZGF0YSA9IGtleSwKKwl9OwogCiAJX2VudGVyKCJ7JWx1fSwlbHUiLCBkaXItPmlfaW5vLCBpbmRleCk7CiAKLQlwYWdlID0gcmVhZF9tYXBwaW5nX3BhZ2UoZGlyLT5pX21hcHBpbmcsIGluZGV4LCBOVUxMKTsKKwlwYWdlID0gcmVhZF9tYXBwaW5nX3BhZ2UoZGlyLT5pX21hcHBpbmcsIGluZGV4LCAmZmlsZSk7CiAJaWYgKCFJU19FUlIocGFnZSkpIHsKIAkJd2FpdF9vbl9wYWdlX2xvY2tlZChwYWdlKTsKIAkJa21hcChwYWdlKTsKQEAgLTE5NywxMiArMjA1LDEyIEBACiAJfQogCXJldHVybiBwYWdlOwogCi0gZmFpbDoKK2ZhaWw6CiAJYWZzX2Rpcl9wdXRfcGFnZShwYWdlKTsKKwlfbGVhdmUoIiA9IC1FSU8iKTsKIAlyZXR1cm4gRVJSX1BUUigtRUlPKTsKLX0gLyogZW5kIGFmc19kaXJfZ2V0X3BhZ2UoKSAqLworfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICogb3BlbiBhbiBBRlMgZGlyZWN0b3J5IGZpbGUKICAqLwpAQCAtMjEzLDE1ICsyMjEsMTIgQEAKIAlCVUlMRF9CVUdfT04oc2l6ZW9mKHVuaW9uIGFmc19kaXJfYmxvY2spICE9IDIwNDgpOwogCUJVSUxEX0JVR19PTihzaXplb2YodW5pb24gYWZzX2RpcmVudCkgIT0gMzIpOwogCi0JaWYgKEFGU19GU19JKGlub2RlKS0+ZmxhZ3MgJiBBRlNfVk5PREVfREVMRVRFRCkKKwlpZiAodGVzdF9iaXQoQUZTX1ZOT0RFX0RFTEVURUQsICZBRlNfRlNfSShpbm9kZSktPmZsYWdzKSkKIAkJcmV0dXJuIC1FTk9FTlQ7CiAKLQlfbGVhdmUoIiA9IDAiKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gYWZzX29wZW4oaW5vZGUsIGZpbGUpOworfQogCi19IC8qIGVuZCBhZnNfZGlyX29wZW4oKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICogZGVhbCB3aXRoIG9uZSBibG9jayBpbiBhbiBBRlMgZGlyZWN0b3J5CiAgKi8KQEAgLTI1MCw3ICsyNTUsNyBAQAogCQkvKiBza2lwIGVudHJpZXMgbWFya2VkIHVudXNlZCBpbiB0aGUgYml0bWFwICovCiAJCWlmICghKGJsb2NrLT5wYWdlaGRyLmJpdG1hcFtvZmZzZXQgLyA4XSAmCiAJCSAgICAgICgxIDw8IChvZmZzZXQgJSA4KSkpKSB7Ci0JCQlfZGVidWcoIkVOVFslWnUuJXVdOiB1bnVzZWRcbiIsCisJCQlfZGVidWcoIkVOVFslWnUuJXVdOiB1bnVzZWQiLAogCQkJICAgICAgIGJsa29mZiAvIHNpemVvZih1bmlvbiBhZnNfZGlyX2Jsb2NrKSwgb2Zmc2V0KTsKIAkJCWlmIChvZmZzZXQgPj0gY3VycikKIAkJCQkqZnBvcyA9IGJsa29mZiArCkBAIC0yNjQsNyArMjY5LDcgQEAKIAkJCSAgICAgICBzaXplb2YoKmJsb2NrKSAtCiAJCQkgICAgICAgb2Zmc2V0ICogc2l6ZW9mKHVuaW9uIGFmc19kaXJlbnQpKTsKIAotCQlfZGVidWcoIkVOVFslWnUuJXVdOiAlcyAlWnUgXCIlc1wiXG4iLAorCQlfZGVidWcoIkVOVFslWnUuJXVdOiAlcyAlWnUgXCIlc1wiIiwKIAkJICAgICAgIGJsa29mZiAvIHNpemVvZih1bmlvbiBhZnNfZGlyX2Jsb2NrKSwgb2Zmc2V0LAogCQkgICAgICAgKG9mZnNldCA8IGN1cnIgPyAic2tpcCIgOiAiZmlsbCIpLAogCQkgICAgICAgbmxlbiwgZGlyZS0+dS5uYW1lKTsKQEAgLTI3NCw3ICsyNzksNyBAQAogCQkJaWYgKG5leHQgPj0gQUZTX0RJUkVOVF9QRVJfQkxPQ0spIHsKIAkJCQlfZGVidWcoIkVOVFslWnUuJXVdOiIKIAkJCQkgICAgICAgIiAldSB0cmF2ZWxsZWQgYmV5b25kIGVuZCBkaXIgYmxvY2siCi0JCQkJICAgICAgICIgKGxlbiAldS8lWnUpXG4iLAorCQkJCSAgICAgICAiIChsZW4gJXUvJVp1KSIsCiAJCQkJICAgICAgIGJsa29mZiAvIHNpemVvZih1bmlvbiBhZnNfZGlyX2Jsb2NrKSwKIAkJCQkgICAgICAgb2Zmc2V0LCBuZXh0LCB0bXAsIG5sZW4pOwogCQkJCXJldHVybiAtRUlPOwpAQCAtMjgyLDEzICsyODcsMTMgQEAKIAkJCWlmICghKGJsb2NrLT5wYWdlaGRyLmJpdG1hcFtuZXh0IC8gOF0gJgogCQkJICAgICAgKDEgPDwgKG5leHQgJSA4KSkpKSB7CiAJCQkJX2RlYnVnKCJFTlRbJVp1LiV1XToiCi0JCQkJICAgICAgICIgJXUgdW5tYXJrZWQgZXh0ZW5zaW9uIChsZW4gJXUvJVp1KVxuIiwKKwkJCQkgICAgICAgIiAldSB1bm1hcmtlZCBleHRlbnNpb24gKGxlbiAldS8lWnUpIiwKIAkJCQkgICAgICAgYmxrb2ZmIC8gc2l6ZW9mKHVuaW9uIGFmc19kaXJfYmxvY2spLAogCQkJCSAgICAgICBvZmZzZXQsIG5leHQsIHRtcCwgbmxlbik7CiAJCQkJcmV0dXJuIC1FSU87CiAJCQl9CiAKLQkJCV9kZWJ1ZygiRU5UWyVadS4ldV06IGV4dCAldS8lWnVcbiIsCisJCQlfZGVidWcoIkVOVFslWnUuJXVdOiBleHQgJXUvJVp1IiwKIAkJCSAgICAgICBibGtvZmYgLyBzaXplb2YodW5pb24gYWZzX2Rpcl9ibG9jayksCiAJCQkgICAgICAgbmV4dCwgdG1wLCBubGVuKTsKIAkJCW5leHQrKzsKQEAgLTMwNCw3ICszMDksNyBAQAogCQkJICAgICAgbmxlbiwKIAkJCSAgICAgIGJsa29mZiArIG9mZnNldCAqIHNpemVvZih1bmlvbiBhZnNfZGlyZW50KSwKIAkJCSAgICAgIG50b2hsKGRpcmUtPnUudm5vZGUpLAotCQkJICAgICAgZmlsbGRpciA9PSBhZnNfZGlyX2xvb2t1cF9maWxsZGlyID8KKwkJCSAgICAgIGZpbGxkaXIgPT0gYWZzX2xvb2t1cF9maWxsZGlyID8KIAkJCSAgICAgIG50b2hsKGRpcmUtPnUudW5pcXVlKSA6IERUX1VOS05PV04pOwogCQlpZiAocmV0IDwgMCkgewogCQkJX2xlYXZlKCIgPSAwIFtmdWxsXSIpOwpAQCAtMzE2LDE2ICszMjEsMTUgQEAKIAogCV9sZWF2ZSgiID0gMSBbbW9yZV0iKTsKIAlyZXR1cm4gMTsKLX0gLyogZW5kIGFmc19kaXJfaXRlcmF0ZV9ibG9jaygpICovCit9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCi0gKiByZWFkIGFuIEFGUyBkaXJlY3RvcnkKKyAqIGl0ZXJhdGUgdGhyb3VnaCB0aGUgZGF0YSBibG9iIHRoYXQgbGlzdHMgdGhlIGNvbnRlbnRzIG9mIGFuIEFGUyBkaXJlY3RvcnkKICAqLwogc3RhdGljIGludCBhZnNfZGlyX2l0ZXJhdGUoc3RydWN0IGlub2RlICpkaXIsIHVuc2lnbmVkICpmcG9zLCB2b2lkICpjb29raWUsCi0JCQkgICBmaWxsZGlyX3QgZmlsbGRpcikKKwkJCSAgIGZpbGxkaXJfdCBmaWxsZGlyLCBzdHJ1Y3Qga2V5ICprZXkpCiB7Ci0JdW5pb24gYWZzX2Rpcl9ibG9jawkqZGJsb2NrOworCXVuaW9uIGFmc19kaXJfYmxvY2sgKmRibG9jazsKIAlzdHJ1Y3QgYWZzX2Rpcl9wYWdlICpkYnVmOwogCXN0cnVjdCBwYWdlICpwYWdlOwogCXVuc2lnbmVkIGJsa29mZiwgbGltaXQ7CkBAIC0zMzMsNyArMzM3LDcgQEAKIAogCV9lbnRlcigieyVsdX0sJXUsLCIsIGRpci0+aV9pbm8sICpmcG9zKTsKIAotCWlmIChBRlNfRlNfSShkaXIpLT5mbGFncyAmIEFGU19WTk9ERV9ERUxFVEVEKSB7CisJaWYgKHRlc3RfYml0KEFGU19WTk9ERV9ERUxFVEVELCAmQUZTX0ZTX0koZGlyKS0+ZmxhZ3MpKSB7CiAJCV9sZWF2ZSgiID0gLUVTVEFMRSIpOwogCQlyZXR1cm4gLUVTVEFMRTsKIAl9CkBAIC0zNDgsNyArMzUyLDcgQEAKIAkJYmxrb2ZmID0gKmZwb3MgJiB+KHNpemVvZih1bmlvbiBhZnNfZGlyX2Jsb2NrKSAtIDEpOwogCiAJCS8qIGZldGNoIHRoZSBhcHByb3ByaWF0ZSBwYWdlIGZyb20gdGhlIGRpcmVjdG9yeSAqLwotCQlwYWdlID0gYWZzX2Rpcl9nZXRfcGFnZShkaXIsIGJsa29mZiAvIFBBR0VfU0laRSk7CisJCXBhZ2UgPSBhZnNfZGlyX2dldF9wYWdlKGRpciwgYmxrb2ZmIC8gUEFHRV9TSVpFLCBrZXkpOwogCQlpZiAoSVNfRVJSKHBhZ2UpKSB7CiAJCQlyZXQgPSBQVFJfRVJSKHBhZ2UpOwogCQkJYnJlYWs7CkBAIC0zNzcsNDMgKzM4MSw1MCBAQAogCQlyZXQgPSAwOwogCX0KIAotIG91dDoKK291dDoKIAlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKIAlyZXR1cm4gcmV0OwotfSAvKiBlbmQgYWZzX2Rpcl9pdGVyYXRlKCkgKi8KK30KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAqIHJlYWQgYW4gQUZTIGRpcmVjdG9yeQogICovCi1zdGF0aWMgaW50IGFmc19kaXJfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqY29va2llLCBmaWxsZGlyX3QgZmlsbGRpcikKK3N0YXRpYyBpbnQgYWZzX3JlYWRkaXIoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmNvb2tpZSwgZmlsbGRpcl90IGZpbGxkaXIpCiB7CiAJdW5zaWduZWQgZnBvczsKIAlpbnQgcmV0OwogCi0JX2VudGVyKCJ7JUxkLHslbHV9fSIsIGZpbGUtPmZfcG9zLCBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX2lubyk7CisJX2VudGVyKCJ7JUxkLHslbHV9fSIsCisJICAgICAgIGZpbGUtPmZfcG9zLCBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX2lubyk7CisKKwlBU1NFUlQoZmlsZS0+cHJpdmF0ZV9kYXRhICE9IE5VTEwpOwogCiAJZnBvcyA9IGZpbGUtPmZfcG9zOwotCXJldCA9IGFmc19kaXJfaXRlcmF0ZShmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLCAmZnBvcywgY29va2llLCBmaWxsZGlyKTsKKwlyZXQgPSBhZnNfZGlyX2l0ZXJhdGUoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSwgJmZwb3MsCisJCQkgICAgICBjb29raWUsIGZpbGxkaXIsIGZpbGUtPnByaXZhdGVfZGF0YSk7CiAJZmlsZS0+Zl9wb3MgPSBmcG9zOwogCiAJX2xlYXZlKCIgPSAlZCIsIHJldCk7CiAJcmV0dXJuIHJldDsKLX0gLyogZW5kIGFmc19kaXJfcmVhZGRpcigpICovCit9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCiAgKiBzZWFyY2ggdGhlIGRpcmVjdG9yeSBmb3IgYSBuYW1lCiAgKiAtIGlmIGFmc19kaXJfaXRlcmF0ZV9ibG9jaygpIHNwb3RzIHRoaXMgZnVuY3Rpb24sIGl0J2xsIHBhc3MgdGhlIEZJRAogICogICB1bmlxdWlmaWVyIHRocm91Z2ggZHR5cGUKICAqLwotc3RhdGljIGludCBhZnNfZGlyX2xvb2t1cF9maWxsZGlyKHZvaWQgKl9jb29raWUsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBubGVuLAotCQkJCSAgbG9mZl90IGZwb3MsIHU2NCBpbm8sIHVuc2lnbmVkIGR0eXBlKQorc3RhdGljIGludCBhZnNfbG9va3VwX2ZpbGxkaXIodm9pZCAqX2Nvb2tpZSwgY29uc3QgY2hhciAqbmFtZSwgaW50IG5sZW4sCisJCQkgICAgICBsb2ZmX3QgZnBvcywgdTY0IGlubywgdW5zaWduZWQgZHR5cGUpCiB7Ci0Jc3RydWN0IGFmc19kaXJfbG9va3VwX2Nvb2tpZSAqY29va2llID0gX2Nvb2tpZTsKKwlzdHJ1Y3QgYWZzX2xvb2t1cF9jb29raWUgKmNvb2tpZSA9IF9jb29raWU7CiAKLQlfZW50ZXIoInslcywlWnV9LCVzLCV1LCwlbHUsJXUiLAotCSAgICAgICBjb29raWUtPm5hbWUsIGNvb2tpZS0+bmxlbiwgbmFtZSwgbmxlbiwgaW5vLCBkdHlwZSk7CisJX2VudGVyKCJ7JXMsJVp1fSwlcywldSwsJWxsdSwldSIsCisJICAgICAgIGNvb2tpZS0+bmFtZSwgY29va2llLT5ubGVuLCBuYW1lLCBubGVuLAorCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBpbm8sIGR0eXBlKTsKKworCS8qIGluc2FuaXR5IGNoZWNrcyBmaXJzdCAqLworCUJVSUxEX0JVR19PTihzaXplb2YodW5pb24gYWZzX2Rpcl9ibG9jaykgIT0gMjA0OCk7CisJQlVJTERfQlVHX09OKHNpemVvZih1bmlvbiBhZnNfZGlyZW50KSAhPSAzMik7CiAKIAlpZiAoY29va2llLT5ubGVuICE9IG5sZW4gfHwgbWVtY21wKGNvb2tpZS0+bmFtZSwgbmFtZSwgbmxlbikgIT0gMCkgewogCQlfbGVhdmUoIiA9IDAgW25vXSIpOwpAQCAtNDI2LDM4ICs0MzcsMjEgQEAKIAogCV9sZWF2ZSgiID0gLTEgW2ZvdW5kXSIpOwogCXJldHVybiAtMTsKLX0gLyogZW5kIGFmc19kaXJfbG9va3VwX2ZpbGxkaXIoKSAqLworfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgotICogbG9vayB1cCBhbiBlbnRyeSBpbiBhIGRpcmVjdG9yeQorICogZG8gYSBsb29rdXAgaW4gYSBkaXJlY3RvcnkKKyAqIC0ganVzdCByZXR1cm5zIHRoZSBGSUQgdGhlIGRlbnRyeSBuYW1lIG1hcHMgdG8gaWYgZm91bmQKICAqLwotc3RhdGljIHN0cnVjdCBkZW50cnkgKmFmc19kaXJfbG9va3VwKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCi0JCQkJICAgICBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3N0YXRpYyBpbnQgYWZzX2RvX2xvb2t1cChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQkJIHN0cnVjdCBhZnNfZmlkICpmaWQsIHN0cnVjdCBrZXkgKmtleSkKIHsKLQlzdHJ1Y3QgYWZzX2Rpcl9sb29rdXBfY29va2llIGNvb2tpZTsKKwlzdHJ1Y3QgYWZzX2xvb2t1cF9jb29raWUgY29va2llOwogCXN0cnVjdCBhZnNfc3VwZXJfaW5mbyAqYXM7Ci0Jc3RydWN0IGFmc192bm9kZSAqdm5vZGU7Ci0Jc3RydWN0IGlub2RlICppbm9kZTsKIAl1bnNpZ25lZCBmcG9zOwogCWludCByZXQ7CiAKLQlfZW50ZXIoInslbHV9LCVweyVzfSIsIGRpci0+aV9pbm8sIGRlbnRyeSwgZGVudHJ5LT5kX25hbWUubmFtZSk7Ci0KLQkvKiBpbnNhbml0eSBjaGVja3MgZmlyc3QgKi8KLQlCVUlMRF9CVUdfT04oc2l6ZW9mKHVuaW9uIGFmc19kaXJfYmxvY2spICE9IDIwNDgpOwotCUJVSUxEX0JVR19PTihzaXplb2YodW5pb24gYWZzX2RpcmVudCkgIT0gMzIpOwotCi0JaWYgKGRlbnRyeS0+ZF9uYW1lLmxlbiA+IDI1NSkgewotCQlfbGVhdmUoIiA9IC1FTkFNRVRPT0xPTkciKTsKLQkJcmV0dXJuIEVSUl9QVFIoLUVOQU1FVE9PTE9ORyk7Ci0JfQotCi0Jdm5vZGUgPSBBRlNfRlNfSShkaXIpOwotCWlmICh2bm9kZS0+ZmxhZ3MgJiBBRlNfVk5PREVfREVMRVRFRCkgewotCQlfbGVhdmUoIiA9IC1FU1RBTEUiKTsKLQkJcmV0dXJuIEVSUl9QVFIoLUVTVEFMRSk7Ci0JfQorCV9lbnRlcigieyVsdX0sJXB7JXN9LCIsIGRpci0+aV9pbm8sIGRlbnRyeSwgZGVudHJ5LT5kX25hbWUubmFtZSk7CiAKIAlhcyA9IGRpci0+aV9zYi0+c19mc19pbmZvOwogCkBAIC00NjgsMTc0ICs0NjIsMjI5IEBACiAJY29va2llLmZvdW5kCT0gMDsKIAogCWZwb3MgPSAwOwotCXJldCA9IGFmc19kaXJfaXRlcmF0ZShkaXIsICZmcG9zLCAmY29va2llLCBhZnNfZGlyX2xvb2t1cF9maWxsZGlyKTsKKwlyZXQgPSBhZnNfZGlyX2l0ZXJhdGUoZGlyLCAmZnBvcywgJmNvb2tpZSwgYWZzX2xvb2t1cF9maWxsZGlyLAorCQkJICAgICAga2V5KTsKIAlpZiAocmV0IDwgMCkgewotCQlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKLQkJcmV0dXJuIEVSUl9QVFIocmV0KTsKKwkJX2xlYXZlKCIgPSAlZCBbaXRlcl0iLCByZXQpOworCQlyZXR1cm4gcmV0OwogCX0KIAogCXJldCA9IC1FTk9FTlQ7CiAJaWYgKCFjb29raWUuZm91bmQpIHsKLQkJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJCV9sZWF2ZSgiID0gLUVOT0VOVCBbbm90IGZvdW5kXSIpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwkqZmlkID0gY29va2llLmZpZDsKKwlfbGVhdmUoIiA9IDAgeyB2bj0ldSB1PSV1IH0iLCBmaWQtPnZub2RlLCBmaWQtPnVuaXF1ZSk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBsb29rIHVwIGFuIGVudHJ5IGluIGEgZGlyZWN0b3J5CisgKi8KK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICphZnNfbG9va3VwKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCQkJIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXN0cnVjdCBhZnNfdm5vZGUgKnZub2RlOworCXN0cnVjdCBhZnNfZmlkIGZpZDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXN0cnVjdCBrZXkgKmtleTsKKwlpbnQgcmV0OworCisJdm5vZGUgPSBBRlNfRlNfSShkaXIpOworCisJX2VudGVyKCJ7JXg6JWR9LCVweyVzfSwiLAorCSAgICAgICB2bm9kZS0+ZmlkLnZpZCwgdm5vZGUtPmZpZC52bm9kZSwgZGVudHJ5LCBkZW50cnktPmRfbmFtZS5uYW1lKTsKKworCUFTU0VSVENNUChkZW50cnktPmRfaW5vZGUsID09LCBOVUxMKTsKKworCWlmIChkZW50cnktPmRfbmFtZS5sZW4gPiAyNTUpIHsKKwkJX2xlYXZlKCIgPSAtRU5BTUVUT09MT05HIik7CisJCXJldHVybiBFUlJfUFRSKC1FTkFNRVRPT0xPTkcpOworCX0KKworCWlmICh0ZXN0X2JpdChBRlNfVk5PREVfREVMRVRFRCwgJnZub2RlLT5mbGFncykpIHsKKwkJX2xlYXZlKCIgPSAtRVNUQUxFIik7CisJCXJldHVybiBFUlJfUFRSKC1FU1RBTEUpOworCX0KKworCWtleSA9IGFmc19yZXF1ZXN0X2tleSh2bm9kZS0+dm9sdW1lLT5jZWxsKTsKKwlpZiAoSVNfRVJSKGtleSkpIHsKKwkJX2xlYXZlKCIgPSAlbGQgW2tleV0iLCBQVFJfRVJSKGtleSkpOworCQlyZXR1cm4gRVJSX1BUUihQVFJfRVJSKGtleSkpOworCX0KKworCXJldCA9IGFmc192YWxpZGF0ZSh2bm9kZSwga2V5KTsKKwlpZiAocmV0IDwgMCkgeworCQlrZXlfcHV0KGtleSk7CisJCV9sZWF2ZSgiID0gJWQgW3ZhbF0iLCByZXQpOwogCQlyZXR1cm4gRVJSX1BUUihyZXQpOwogCX0KIAotCS8qIGluc3RhbnRpYXRlIHRoZSBkZW50cnkgKi8KLQlyZXQgPSBhZnNfaWdldChkaXItPmlfc2IsICZjb29raWUuZmlkLCAmaW5vZGUpOworCXJldCA9IGFmc19kb19sb29rdXAoZGlyLCBkZW50cnksICZmaWQsIGtleSk7CiAJaWYgKHJldCA8IDApIHsKLQkJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJCWtleV9wdXQoa2V5KTsKKwkJaWYgKHJldCA9PSAtRU5PRU5UKSB7CisJCQlkX2FkZChkZW50cnksIE5VTEwpOworCQkJX2xlYXZlKCIgPSBOVUxMIFtuZWdhdGl2ZV0iKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCV9sZWF2ZSgiID0gJWQgW2RvXSIsIHJldCk7CiAJCXJldHVybiBFUlJfUFRSKHJldCk7CiAJfQorCWRlbnRyeS0+ZF9mc2RhdGEgPSAodm9pZCAqKSh1bnNpZ25lZCBsb25nKSB2bm9kZS0+c3RhdHVzLmRhdGFfdmVyc2lvbjsKKworCS8qIGluc3RhbnRpYXRlIHRoZSBkZW50cnkgKi8KKwlpbm9kZSA9IGFmc19pZ2V0KGRpci0+aV9zYiwga2V5LCAmZmlkLCBOVUxMLCBOVUxMKTsKKwlrZXlfcHV0KGtleSk7CisJaWYgKElTX0VSUihpbm9kZSkpIHsKKwkJX2xlYXZlKCIgPSAlbGQiLCBQVFJfRVJSKGlub2RlKSk7CisJCXJldHVybiBFUlJfUFRSKFBUUl9FUlIoaW5vZGUpKTsKKwl9CiAKIAlkZW50cnktPmRfb3AgPSAmYWZzX2ZzX2RlbnRyeV9vcGVyYXRpb25zOwotCWRlbnRyeS0+ZF9mc2RhdGEgPSAodm9pZCAqKSAodW5zaWduZWQgbG9uZykgdm5vZGUtPnN0YXR1cy52ZXJzaW9uOwogCiAJZF9hZGQoZGVudHJ5LCBpbm9kZSk7CiAJX2xlYXZlKCIgPSAwIHsgdm49JXUgdT0ldSB9IC0+IHsgaW5vPSVsdSB2PSVsdSB9IiwKLQkgICAgICAgY29va2llLmZpZC52bm9kZSwKLQkgICAgICAgY29va2llLmZpZC51bmlxdWUsCisJICAgICAgIGZpZC52bm9kZSwKKwkgICAgICAgZmlkLnVuaXF1ZSwKIAkgICAgICAgZGVudHJ5LT5kX2lub2RlLT5pX2lubywKIAkgICAgICAgZGVudHJ5LT5kX2lub2RlLT5pX3ZlcnNpb24pOwogCiAJcmV0dXJuIE5VTEw7Ci19IC8qIGVuZCBhZnNfZGlyX2xvb2t1cCgpICovCit9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCiAgKiBjaGVjayB0aGF0IGEgZGVudHJ5IGxvb2t1cCBoaXQgaGFzIGZvdW5kIGEgdmFsaWQgZW50cnkKICAqIC0gTk9URSEgdGhlIGhpdCBjYW4gYmUgYSBuZWdhdGl2ZSBoaXQgdG9vLCBzbyB3ZSBjYW4ndCBhc3N1bWUgd2UgaGF2ZSBhbgogICogICBpbm9kZQotICogKGRlcml2ZWQgZnJvbSBuZnNfbG9va3VwX3JldmFsaWRhdGUpCiAgKi8KIHN0YXRpYyBpbnQgYWZzX2RfcmV2YWxpZGF0ZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQogewotCXN0cnVjdCBhZnNfZGlyX2xvb2t1cF9jb29raWUgY29va2llOworCXN0cnVjdCBhZnNfdm5vZGUgKnZub2RlLCAqZGlyOworCXN0cnVjdCBhZnNfZmlkIGZpZDsKIAlzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQ7Ci0Jc3RydWN0IGlub2RlICppbm9kZSwgKmRpcjsKLQl1bnNpZ25lZCBmcG9zOworCXN0cnVjdCBrZXkgKmtleTsKKwl2b2lkICpkaXJfdmVyc2lvbjsKIAlpbnQgcmV0OwogCi0JX2VudGVyKCJ7c2I9JXAgbj0lc30sIiwgZGVudHJ5LT5kX3NiLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKKwl2bm9kZSA9IEFGU19GU19JKGRlbnRyeS0+ZF9pbm9kZSk7CisKKwlpZiAoZGVudHJ5LT5kX2lub2RlKQorCQlfZW50ZXIoInt2PXsleDoldX0gbj0lcyBmbD0lbHh9LCIsCisJCSAgICAgICB2bm9kZS0+ZmlkLnZpZCwgdm5vZGUtPmZpZC52bm9kZSwgZGVudHJ5LT5kX25hbWUubmFtZSwKKwkJICAgICAgIHZub2RlLT5mbGFncyk7CisJZWxzZQorCQlfZW50ZXIoIntuZWcgbj0lc30iLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKKworCWtleSA9IGFmc19yZXF1ZXN0X2tleShBRlNfRlNfUyhkZW50cnktPmRfc2IpLT52b2x1bWUtPmNlbGwpOworCWlmIChJU19FUlIoa2V5KSkKKwkJa2V5ID0gTlVMTDsKIAogCS8qIGxvY2sgZG93biB0aGUgcGFyZW50IGRlbnRyeSBzbyB3ZSBjYW4gcGVlciBhdCBpdCAqLwotCXBhcmVudCA9IGRnZXRfcGFyZW50KGRlbnRyeS0+ZF9wYXJlbnQpOwotCi0JZGlyID0gcGFyZW50LT5kX2lub2RlOwotCWlub2RlID0gZGVudHJ5LT5kX2lub2RlOwotCi0JLyogaGFuZGxlIGEgbmVnYXRpdmUgZGVudHJ5ICovCi0JaWYgKCFpbm9kZSkKKwlwYXJlbnQgPSBkZ2V0X3BhcmVudChkZW50cnkpOworCWlmICghcGFyZW50LT5kX2lub2RlKQogCQlnb3RvIG91dF9iYWQ7CiAKLQkvKiBoYW5kbGUgYSBiYWQgaW5vZGUgKi8KLQlpZiAoaXNfYmFkX2lub2RlKGlub2RlKSkgewotCQlwcmludGsoImtBRlM6IGFmc19kX3JldmFsaWRhdGU6ICVzLyVzIGhhcyBiYWQgaW5vZGVcbiIsCi0JCSAgICAgICBkZW50cnktPmRfcGFyZW50LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubmFtZSk7Ci0JCWdvdG8gb3V0X2JhZDsKLQl9CisJZGlyID0gQUZTX0ZTX0kocGFyZW50LT5kX2lub2RlKTsKIAotCS8qIGZvcmNlIGEgZnVsbCBsb29rIHVwIGlmIHRoZSBwYXJlbnQgZGlyZWN0b3J5IGNoYW5nZWQgc2luY2UgbGFzdCB0aGUKLQkgKiBzZXJ2ZXIgd2FzIGNvbnN1bHRlZAotCSAqIC0gb3RoZXJ3aXNlIHRoaXMgaW5vZGUgbXVzdCBzdGlsbCBleGlzdCwgZXZlbiBpZiB0aGUgaW5vZGUgZGV0YWlscwotCSAqICAgdGhlbXNlbHZlcyBoYXZlIGNoYW5nZWQKLQkgKi8KLQlpZiAoQUZTX0ZTX0koZGlyKS0+ZmxhZ3MgJiBBRlNfVk5PREVfQ0hBTkdFRCkKLQkJYWZzX3Zub2RlX2ZldGNoX3N0YXR1cyhBRlNfRlNfSShkaXIpKTsKKwkvKiB2YWxpZGF0ZSB0aGUgcGFyZW50IGRpcmVjdG9yeSAqLworCWlmICh0ZXN0X2JpdChBRlNfVk5PREVfTU9ESUZJRUQsICZkaXItPmZsYWdzKSkKKwkJYWZzX3ZhbGlkYXRlKGRpciwga2V5KTsKIAotCWlmIChBRlNfRlNfSShkaXIpLT5mbGFncyAmIEFGU19WTk9ERV9ERUxFVEVEKSB7CisJaWYgKHRlc3RfYml0KEFGU19WTk9ERV9ERUxFVEVELCAmZGlyLT5mbGFncykpIHsKIAkJX2RlYnVnKCIlczogcGFyZW50IGRpciBkZWxldGVkIiwgZGVudHJ5LT5kX25hbWUubmFtZSk7CiAJCWdvdG8gb3V0X2JhZDsKIAl9CiAKLQlpZiAoQUZTX0ZTX0koaW5vZGUpLT5mbGFncyAmIEFGU19WTk9ERV9ERUxFVEVEKSB7Ci0JCV9kZWJ1ZygiJXM6IGZpbGUgYWxyZWFkeSBkZWxldGVkIiwgZGVudHJ5LT5kX25hbWUubmFtZSk7Ci0JCWdvdG8gb3V0X2JhZDsKLQl9CisJZGlyX3ZlcnNpb24gPSAodm9pZCAqKSAodW5zaWduZWQgbG9uZykgZGlyLT5zdGF0dXMuZGF0YV92ZXJzaW9uOworCWlmIChkZW50cnktPmRfZnNkYXRhID09IGRpcl92ZXJzaW9uKQorCQlnb3RvIG91dF92YWxpZDsgLyogdGhlIGRpciBjb250ZW50cyBhcmUgdW5jaGFuZ2VkICovCiAKLQlpZiAoKHVuc2lnbmVkIGxvbmcpIGRlbnRyeS0+ZF9mc2RhdGEgIT0KLQkgICAgKHVuc2lnbmVkIGxvbmcpIEFGU19GU19JKGRpciktPnN0YXR1cy52ZXJzaW9uKSB7Ci0JCV9kZWJ1ZygiJXM6IHBhcmVudCBjaGFuZ2VkICVsdSAtPiAldSIsCi0JCSAgICAgICBkZW50cnktPmRfbmFtZS5uYW1lLAotCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIGRlbnRyeS0+ZF9mc2RhdGEsCi0JCSAgICAgICAodW5zaWduZWQpIEFGU19GU19JKGRpciktPnN0YXR1cy52ZXJzaW9uKTsKKwlfZGVidWcoImRpciBtb2RpZmllZCIpOwogCi0JCS8qIHNlYXJjaCB0aGUgZGlyZWN0b3J5IGZvciB0aGlzIHZub2RlICovCi0JCWNvb2tpZS5uYW1lCT0gZGVudHJ5LT5kX25hbWUubmFtZTsKLQkJY29va2llLm5sZW4JPSBkZW50cnktPmRfbmFtZS5sZW47Ci0JCWNvb2tpZS5maWQudmlkCT0gQUZTX0ZTX0koaW5vZGUpLT52b2x1bWUtPnZpZDsKLQkJY29va2llLmZvdW5kCT0gMDsKLQotCQlmcG9zID0gMDsKLQkJcmV0ID0gYWZzX2Rpcl9pdGVyYXRlKGRpciwgJmZwb3MsICZjb29raWUsCi0JCQkJICAgICAgYWZzX2Rpcl9sb29rdXBfZmlsbGRpcik7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlfZGVidWcoImZhaWxlZCB0byBpdGVyYXRlIGRpciAlczogJWQiLAotCQkJICAgICAgIHBhcmVudC0+ZF9uYW1lLm5hbWUsIHJldCk7CisJLyogc2VhcmNoIHRoZSBkaXJlY3RvcnkgZm9yIHRoaXMgdm5vZGUgKi8KKwlyZXQgPSBhZnNfZG9fbG9va3VwKCZkaXItPnZmc19pbm9kZSwgZGVudHJ5LCAmZmlkLCBrZXkpOworCXN3aXRjaCAocmV0KSB7CisJY2FzZSAwOgorCQkvKiB0aGUgZmlsZW5hbWUgbWFwcyB0byBzb21ldGhpbmcgKi8KKwkJaWYgKCFkZW50cnktPmRfaW5vZGUpCiAJCQlnb3RvIG91dF9iYWQ7Ci0JCX0KLQotCQlpZiAoIWNvb2tpZS5mb3VuZCkgewotCQkJX2RlYnVnKCIlczogZGlyZW50IG5vdCBmb3VuZCIsIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOwotCQkJZ290byBub3RfZm91bmQ7CisJCWlmIChpc19iYWRfaW5vZGUoZGVudHJ5LT5kX2lub2RlKSkgeworCQkJcHJpbnRrKCJrQUZTOiBhZnNfZF9yZXZhbGlkYXRlOiAlcy8lcyBoYXMgYmFkIGlub2RlXG4iLAorCQkJICAgICAgIHBhcmVudC0+ZF9uYW1lLm5hbWUsIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCQkJZ290byBvdXRfYmFkOwogCQl9CiAKIAkJLyogaWYgdGhlIHZub2RlIElEIGhhcyBjaGFuZ2VkLCB0aGVuIHRoZSBkaXJlbnQgcG9pbnRzIHRvIGEKIAkJICogZGlmZmVyZW50IGZpbGUgKi8KLQkJaWYgKGNvb2tpZS5maWQudm5vZGUgIT0gQUZTX0ZTX0koaW5vZGUpLT5maWQudm5vZGUpIHsKLQkJCV9kZWJ1ZygiJXM6IGRpcmVudCBjaGFuZ2VkIiwgZGVudHJ5LT5kX25hbWUubmFtZSk7CisJCWlmIChmaWQudm5vZGUgIT0gdm5vZGUtPmZpZC52bm9kZSkgeworCQkJX2RlYnVnKCIlczogZGlyZW50IGNoYW5nZWQgWyV1ICE9ICV1XSIsCisJCQkgICAgICAgZGVudHJ5LT5kX25hbWUubmFtZSwgZmlkLnZub2RlLAorCQkJICAgICAgIHZub2RlLT5maWQudm5vZGUpOwogCQkJZ290byBub3RfZm91bmQ7CiAJCX0KIAogCQkvKiBpZiB0aGUgdm5vZGUgSUQgdW5pcWlmaWVyIGhhcyBjaGFuZ2VkLCB0aGVuIHRoZSBmaWxlIGhhcwotCQkgKiBiZWVuIGRlbGV0ZWQgKi8KLQkJaWYgKGNvb2tpZS5maWQudW5pcXVlICE9IEFGU19GU19JKGlub2RlKS0+ZmlkLnVuaXF1ZSkgeworCQkgKiBiZWVuIGRlbGV0ZWQgYW5kIHJlcGxhY2VkLCBhbmQgdGhlIG9yaWdpbmFsIHZub2RlIElEIGhhcworCQkgKiBiZWVuIHJldXNlZCAqLworCQlpZiAoZmlkLnVuaXF1ZSAhPSB2bm9kZS0+ZmlkLnVuaXF1ZSkgewogCQkJX2RlYnVnKCIlczogZmlsZSBkZWxldGVkICh1cSAldSAtPiAldSBJOiVsdSkiLAotCQkJICAgICAgIGRlbnRyeS0+ZF9uYW1lLm5hbWUsCi0JCQkgICAgICAgY29va2llLmZpZC51bmlxdWUsCi0JCQkgICAgICAgQUZTX0ZTX0koaW5vZGUpLT5maWQudW5pcXVlLAotCQkJICAgICAgIGlub2RlLT5pX3ZlcnNpb24pOwotCQkJc3Bpbl9sb2NrKCZBRlNfRlNfSShpbm9kZSktPmxvY2spOwotCQkJQUZTX0ZTX0koaW5vZGUpLT5mbGFncyB8PSBBRlNfVk5PREVfREVMRVRFRDsKLQkJCXNwaW5fdW5sb2NrKCZBRlNfRlNfSShpbm9kZSktPmxvY2spOwotCQkJaW52YWxpZGF0ZV9yZW1vdGVfaW5vZGUoaW5vZGUpOwotCQkJZ290byBvdXRfYmFkOworCQkJICAgICAgIGRlbnRyeS0+ZF9uYW1lLm5hbWUsIGZpZC51bmlxdWUsCisJCQkgICAgICAgdm5vZGUtPmZpZC51bmlxdWUsIGRlbnRyeS0+ZF9pbm9kZS0+aV92ZXJzaW9uKTsKKwkJCXNwaW5fbG9jaygmdm5vZGUtPmxvY2spOworCQkJc2V0X2JpdChBRlNfVk5PREVfREVMRVRFRCwgJnZub2RlLT5mbGFncyk7CisJCQlzcGluX3VubG9jaygmdm5vZGUtPmxvY2spOworCQkJZ290byBub3RfZm91bmQ7CiAJCX0KKwkJZ290byBvdXRfdmFsaWQ7CiAKLQkJZGVudHJ5LT5kX2ZzZGF0YSA9Ci0JCQkodm9pZCAqKSAodW5zaWduZWQgbG9uZykgQUZTX0ZTX0koZGlyKS0+c3RhdHVzLnZlcnNpb247CisJY2FzZSAtRU5PRU5UOgorCQkvKiB0aGUgZmlsZW5hbWUgaXMgdW5rbm93biAqLworCQlfZGVidWcoIiVzOiBkaXJlbnQgbm90IGZvdW5kIiwgZGVudHJ5LT5kX25hbWUubmFtZSk7CisJCWlmIChkZW50cnktPmRfaW5vZGUpCisJCQlnb3RvIG5vdF9mb3VuZDsKKwkJZ290byBvdXRfdmFsaWQ7CisKKwlkZWZhdWx0OgorCQlfZGVidWcoImZhaWxlZCB0byBpdGVyYXRlIGRpciAlczogJWQiLAorCQkgICAgICAgcGFyZW50LT5kX25hbWUubmFtZSwgcmV0KTsKKwkJZ290byBvdXRfYmFkOwogCX0KIAotIG91dF92YWxpZDoKK291dF92YWxpZDoKKwlkZW50cnktPmRfZnNkYXRhID0gZGlyX3ZlcnNpb247CitvdXRfc2tpcDoKIAlkcHV0KHBhcmVudCk7CisJa2V5X3B1dChrZXkpOwogCV9sZWF2ZSgiID0gMSBbdmFsaWRdIik7CiAJcmV0dXJuIDE7CiAKIAkvKiB0aGUgZGlyZW50LCBpZiBpdCBleGlzdHMsIG5vdyBwb2ludHMgdG8gYSBkaWZmZXJlbnQgdm5vZGUgKi8KLSBub3RfZm91bmQ6Citub3RfZm91bmQ6CiAJc3Bpbl9sb2NrKCZkZW50cnktPmRfbG9jayk7CiAJZGVudHJ5LT5kX2ZsYWdzIHw9IERDQUNIRV9ORlNGU19SRU5BTUVEOwogCXNwaW5fdW5sb2NrKCZkZW50cnktPmRfbG9jayk7CiAKLSBvdXRfYmFkOgotCWlmIChpbm9kZSkgeworb3V0X2JhZDoKKwlpZiAoZGVudHJ5LT5kX2lub2RlKSB7CiAJCS8qIGRvbid0IHVuaGFzaCBpZiB3ZSBoYXZlIHN1Ym1vdW50cyAqLwogCQlpZiAoaGF2ZV9zdWJtb3VudHMoZGVudHJ5KSkKLQkJCWdvdG8gb3V0X3ZhbGlkOworCQkJZ290byBvdXRfc2tpcDsKIAl9CiAKLQlzaHJpbmtfZGNhY2hlX3BhcmVudChkZW50cnkpOwotCiAJX2RlYnVnKCJkcm9wcGluZyBkZW50cnkgJXMvJXMiLAotCSAgICAgICBkZW50cnktPmRfcGFyZW50LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubmFtZSk7CisJICAgICAgIHBhcmVudC0+ZF9uYW1lLm5hbWUsIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCXNocmlua19kY2FjaGVfcGFyZW50KGRlbnRyeSk7CiAJZF9kcm9wKGRlbnRyeSk7Ci0KIAlkcHV0KHBhcmVudCk7CisJa2V5X3B1dChrZXkpOwogCiAJX2xlYXZlKCIgPSAwIFtiYWRdIik7CiAJcmV0dXJuIDA7Ci19IC8qIGVuZCBhZnNfZF9yZXZhbGlkYXRlKCkgKi8KK30KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAqIGFsbG93IHRoZSBWRlMgdG8gZW5xdWlyZSBhcyB0byB3aGV0aGVyIGEgZGVudHJ5IHNob3VsZCBiZSB1bmhhc2hlZCAobXVzdG4ndAogICogc2xlZXApCkBAIC02NDksMTUgKzY5OCw0NDQgQEAKIAlpZiAoZGVudHJ5LT5kX2ZsYWdzICYgRENBQ0hFX05GU0ZTX1JFTkFNRUQpCiAJCWdvdG8gemFwOwogCi0JaWYgKGRlbnRyeS0+ZF9pbm9kZSkgewotCQlpZiAoQUZTX0ZTX0koZGVudHJ5LT5kX2lub2RlKS0+ZmxhZ3MgJiBBRlNfVk5PREVfREVMRVRFRCkKKwlpZiAoZGVudHJ5LT5kX2lub2RlICYmCisJICAgIHRlc3RfYml0KEFGU19WTk9ERV9ERUxFVEVELCAmQUZTX0ZTX0koZGVudHJ5LT5kX2lub2RlKS0+ZmxhZ3MpKQogCQkJZ290byB6YXA7Ci0JfQogCiAJX2xlYXZlKCIgPSAwIFtrZWVwXSIpOwogCXJldHVybiAwOwogCi0gemFwOgoremFwOgogCV9sZWF2ZSgiID0gMSBbemFwXSIpOwogCXJldHVybiAxOwotfSAvKiBlbmQgYWZzX2RfZGVsZXRlKCkgKi8KK30KKworLyoKKyAqIGhhbmRsZSBkZW50cnkgcmVsZWFzZQorICovCitzdGF0aWMgdm9pZCBhZnNfZF9yZWxlYXNlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlfZW50ZXIoIiVzIiwgZGVudHJ5LT5kX25hbWUubmFtZSk7Cit9CisKKy8qCisgKiBjcmVhdGUgYSBkaXJlY3Rvcnkgb24gYW4gQUZTIGZpbGVzeXN0ZW0KKyAqLworc3RhdGljIGludCBhZnNfbWtkaXIoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUpCit7CisJc3RydWN0IGFmc19maWxlX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IGFmc19jYWxsYmFjayBjYjsKKwlzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyOworCXN0cnVjdCBhZnNfdm5vZGUgKmR2bm9kZSwgKnZub2RlOworCXN0cnVjdCBhZnNfZmlkIGZpZDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXN0cnVjdCBrZXkgKmtleTsKKwlpbnQgcmV0OworCisJZHZub2RlID0gQUZTX0ZTX0koZGlyKTsKKworCV9lbnRlcigieyV4OiVkfSx7JXN9LCVvIiwKKwkgICAgICAgZHZub2RlLT5maWQudmlkLCBkdm5vZGUtPmZpZC52bm9kZSwgZGVudHJ5LT5kX25hbWUubmFtZSwgbW9kZSk7CisKKwlyZXQgPSAtRU5BTUVUT09MT05HOworCWlmIChkZW50cnktPmRfbmFtZS5sZW4gPiAyNTUpCisJCWdvdG8gZXJyb3I7CisKKwlrZXkgPSBhZnNfcmVxdWVzdF9rZXkoZHZub2RlLT52b2x1bWUtPmNlbGwpOworCWlmIChJU19FUlIoa2V5KSkgeworCQlyZXQgPSBQVFJfRVJSKGtleSk7CisJCWdvdG8gZXJyb3I7CisJfQorCisJbW9kZSB8PSBTX0lGRElSOworCXJldCA9IGFmc192bm9kZV9jcmVhdGUoZHZub2RlLCBrZXksIGRlbnRyeS0+ZF9uYW1lLm5hbWUsCisJCQkgICAgICAgbW9kZSwgJmZpZCwgJnN0YXR1cywgJmNiLCAmc2VydmVyKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBta2Rpcl9lcnJvcjsKKworCWlub2RlID0gYWZzX2lnZXQoZGlyLT5pX3NiLCBrZXksICZmaWQsICZzdGF0dXMsICZjYik7CisJaWYgKElTX0VSUihpbm9kZSkpIHsKKwkJLyogRU5PTUVNIGF0IGEgcmVhbGx5IGluY29udmVuaWVudCB0aW1lIC0ganVzdCBhYmFuZG9uIHRoZSBuZXcKKwkJICogZGlyZWN0b3J5IG9uIHRoZSBzZXJ2ZXIgKi8KKwkJcmV0ID0gUFRSX0VSUihpbm9kZSk7CisJCWdvdG8gaWdldF9lcnJvcjsKKwl9CisKKwkvKiBhcHBseSB0aGUgc3RhdHVzIHJlcG9ydCB3ZSd2ZSBnb3QgZm9yIHRoZSBuZXcgdm5vZGUgKi8KKwl2bm9kZSA9IEFGU19GU19JKGlub2RlKTsKKwlzcGluX2xvY2soJnZub2RlLT5sb2NrKTsKKwl2bm9kZS0+dXBkYXRlX2NudCsrOworCXNwaW5fdW5sb2NrKCZ2bm9kZS0+bG9jayk7CisJYWZzX3Zub2RlX2ZpbmFsaXNlX3N0YXR1c191cGRhdGUodm5vZGUsIHNlcnZlcik7CisJYWZzX3B1dF9zZXJ2ZXIoc2VydmVyKTsKKworCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CisJaWYgKGRfdW5oYXNoZWQoZGVudHJ5KSkgeworCQlfZGVidWcoIm5vdCBoYXNoZWQiKTsKKwkJZF9yZWhhc2goZGVudHJ5KTsKKwl9CisJa2V5X3B1dChrZXkpOworCV9sZWF2ZSgiID0gMCIpOworCXJldHVybiAwOworCitpZ2V0X2Vycm9yOgorCWFmc19wdXRfc2VydmVyKHNlcnZlcik7Citta2Rpcl9lcnJvcjoKKwlrZXlfcHV0KGtleSk7CitlcnJvcjoKKwlkX2Ryb3AoZGVudHJ5KTsKKwlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogcmVtb3ZlIGEgZGlyZWN0b3J5IGZyb20gYW4gQUZTIGZpbGVzeXN0ZW0KKyAqLworc3RhdGljIGludCBhZnNfcm1kaXIoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlzdHJ1Y3QgYWZzX3Zub2RlICpkdm5vZGUsICp2bm9kZTsKKwlzdHJ1Y3Qga2V5ICprZXk7CisJaW50IHJldDsKKworCWR2bm9kZSA9IEFGU19GU19JKGRpcik7CisKKwlfZW50ZXIoInsleDolZH0seyVzfSIsCisJICAgICAgIGR2bm9kZS0+ZmlkLnZpZCwgZHZub2RlLT5maWQudm5vZGUsIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCisJcmV0ID0gLUVOQU1FVE9PTE9ORzsKKwlpZiAoZGVudHJ5LT5kX25hbWUubGVuID4gMjU1KQorCQlnb3RvIGVycm9yOworCisJa2V5ID0gYWZzX3JlcXVlc3Rfa2V5KGR2bm9kZS0+dm9sdW1lLT5jZWxsKTsKKwlpZiAoSVNfRVJSKGtleSkpIHsKKwkJcmV0ID0gUFRSX0VSUihrZXkpOworCQlnb3RvIGVycm9yOworCX0KKworCXJldCA9IGFmc192bm9kZV9yZW1vdmUoZHZub2RlLCBrZXksIGRlbnRyeS0+ZF9uYW1lLm5hbWUsIHRydWUpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIHJtZGlyX2Vycm9yOworCisJaWYgKGRlbnRyeS0+ZF9pbm9kZSkgeworCQl2bm9kZSA9IEFGU19GU19JKGRlbnRyeS0+ZF9pbm9kZSk7CisJCWNsZWFyX25saW5rKCZ2bm9kZS0+dmZzX2lub2RlKTsKKwkJc2V0X2JpdChBRlNfVk5PREVfREVMRVRFRCwgJnZub2RlLT5mbGFncyk7CisJCWFmc19kaXNjYXJkX2NhbGxiYWNrX29uX2RlbGV0ZSh2bm9kZSk7CisJfQorCisJa2V5X3B1dChrZXkpOworCV9sZWF2ZSgiID0gMCIpOworCXJldHVybiAwOworCitybWRpcl9lcnJvcjoKKwlrZXlfcHV0KGtleSk7CitlcnJvcjoKKwlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogcmVtb3ZlIGEgZmlsZSBmcm9tIGFuIEFGUyBmaWxlc3lzdGVtCisgKi8KK3N0YXRpYyBpbnQgYWZzX3VubGluayhzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXN0cnVjdCBhZnNfdm5vZGUgKmR2bm9kZSwgKnZub2RlOworCXN0cnVjdCBrZXkgKmtleTsKKwlpbnQgcmV0OworCisJZHZub2RlID0gQUZTX0ZTX0koZGlyKTsKKworCV9lbnRlcigieyV4OiVkfSx7JXN9IiwKKwkgICAgICAgZHZub2RlLT5maWQudmlkLCBkdm5vZGUtPmZpZC52bm9kZSwgZGVudHJ5LT5kX25hbWUubmFtZSk7CisKKwlyZXQgPSAtRU5BTUVUT09MT05HOworCWlmIChkZW50cnktPmRfbmFtZS5sZW4gPiAyNTUpCisJCWdvdG8gZXJyb3I7CisKKwlrZXkgPSBhZnNfcmVxdWVzdF9rZXkoZHZub2RlLT52b2x1bWUtPmNlbGwpOworCWlmIChJU19FUlIoa2V5KSkgeworCQlyZXQgPSBQVFJfRVJSKGtleSk7CisJCWdvdG8gZXJyb3I7CisJfQorCisJaWYgKGRlbnRyeS0+ZF9pbm9kZSkgeworCQl2bm9kZSA9IEFGU19GU19JKGRlbnRyeS0+ZF9pbm9kZSk7CisKKwkJLyogbWFrZSBzdXJlIHdlIGhhdmUgYSBjYWxsYmFjayBwcm9taXNlIG9uIHRoZSB2aWN0aW0gKi8KKwkJcmV0ID0gYWZzX3ZhbGlkYXRlKHZub2RlLCBrZXkpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJfQorCisJcmV0ID0gYWZzX3Zub2RlX3JlbW92ZShkdm5vZGUsIGtleSwgZGVudHJ5LT5kX25hbWUubmFtZSwgZmFsc2UpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIHJlbW92ZV9lcnJvcjsKKworCWlmIChkZW50cnktPmRfaW5vZGUpIHsKKwkJLyogaWYgdGhlIGZpbGUgd2Fzbid0IGRlbGV0ZWQgZHVlIHRvIGV4Y2VzcyBoYXJkIGxpbmtzLCB0aGUKKwkJICogZmlsZXNlcnZlciB3aWxsIGJyZWFrIHRoZSBjYWxsYmFjayBwcm9taXNlIG9uIHRoZSBmaWxlIC0gaWYKKwkJICogaXQgaGFkIG9uZSAtIGJlZm9yZSBpdCByZXR1cm5zIHRvIHVzLCBhbmQgaWYgaXQgd2FzIGRlbGV0ZWQsCisJCSAqIGl0IHdvbid0CisJCSAqCisJCSAqIGhvd2V2ZXIsIGlmIHdlIGRpZG4ndCBoYXZlIGEgY2FsbGJhY2sgcHJvbWlzZSBvdXRzdGFuZGluZywKKwkJICogb3IgaXQgd2FzIG91dHN0YW5kaW5nIG9uIGEgZGlmZmVyZW50IHNlcnZlciwgdGhlbiBpdCB3b24ndAorCQkgKiBicmVhayBpdCBlaXRoZXIuLi4KKwkJICovCisJCXZub2RlID0gQUZTX0ZTX0koZGVudHJ5LT5kX2lub2RlKTsKKwkJaWYgKHRlc3RfYml0KEFGU19WTk9ERV9ERUxFVEVELCAmdm5vZGUtPmZsYWdzKSkKKwkJCV9kZWJ1ZygiQUZTX1ZOT0RFX0RFTEVURUQiKTsKKwkJaWYgKHRlc3RfYml0KEFGU19WTk9ERV9DQl9CUk9LRU4sICZ2bm9kZS0+ZmxhZ3MpKQorCQkJX2RlYnVnKCJBRlNfVk5PREVfQ0JfQlJPS0VOIik7CisJCXNldF9iaXQoQUZTX1ZOT0RFX0NCX0JST0tFTiwgJnZub2RlLT5mbGFncyk7CisJCXJldCA9IGFmc192YWxpZGF0ZSh2bm9kZSwga2V5KTsKKwkJX2RlYnVnKCJubGluayAlZCBbdmFsICVkXSIsIHZub2RlLT52ZnNfaW5vZGUuaV9ubGluaywgcmV0KTsKKwl9CisKKwlrZXlfcHV0KGtleSk7CisJX2xlYXZlKCIgPSAwIik7CisJcmV0dXJuIDA7CisKK3JlbW92ZV9lcnJvcjoKKwlrZXlfcHV0KGtleSk7CitlcnJvcjoKKwlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogY3JlYXRlIGEgcmVndWxhciBmaWxlIG9uIGFuIEFGUyBmaWxlc3lzdGVtCisgKi8KK3N0YXRpYyBpbnQgYWZzX2NyZWF0ZShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbW9kZSwKKwkJICAgICAgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJc3RydWN0IGFmc19maWxlX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IGFmc19jYWxsYmFjayBjYjsKKwlzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyOworCXN0cnVjdCBhZnNfdm5vZGUgKmR2bm9kZSwgKnZub2RlOworCXN0cnVjdCBhZnNfZmlkIGZpZDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXN0cnVjdCBrZXkgKmtleTsKKwlpbnQgcmV0OworCisJZHZub2RlID0gQUZTX0ZTX0koZGlyKTsKKworCV9lbnRlcigieyV4OiVkfSx7JXN9LCVvLCIsCisJICAgICAgIGR2bm9kZS0+ZmlkLnZpZCwgZHZub2RlLT5maWQudm5vZGUsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsIG1vZGUpOworCisJcmV0ID0gLUVOQU1FVE9PTE9ORzsKKwlpZiAoZGVudHJ5LT5kX25hbWUubGVuID4gMjU1KQorCQlnb3RvIGVycm9yOworCisJa2V5ID0gYWZzX3JlcXVlc3Rfa2V5KGR2bm9kZS0+dm9sdW1lLT5jZWxsKTsKKwlpZiAoSVNfRVJSKGtleSkpIHsKKwkJcmV0ID0gUFRSX0VSUihrZXkpOworCQlnb3RvIGVycm9yOworCX0KKworCW1vZGUgfD0gU19JRlJFRzsKKwlyZXQgPSBhZnNfdm5vZGVfY3JlYXRlKGR2bm9kZSwga2V5LCBkZW50cnktPmRfbmFtZS5uYW1lLAorCQkJICAgICAgIG1vZGUsICZmaWQsICZzdGF0dXMsICZjYiwgJnNlcnZlcik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gY3JlYXRlX2Vycm9yOworCisJaW5vZGUgPSBhZnNfaWdldChkaXItPmlfc2IsIGtleSwgJmZpZCwgJnN0YXR1cywgJmNiKTsKKwlpZiAoSVNfRVJSKGlub2RlKSkgeworCQkvKiBFTk9NRU0gYXQgYSByZWFsbHkgaW5jb252ZW5pZW50IHRpbWUgLSBqdXN0IGFiYW5kb24gdGhlIG5ldworCQkgKiBkaXJlY3Rvcnkgb24gdGhlIHNlcnZlciAqLworCQlyZXQgPSBQVFJfRVJSKGlub2RlKTsKKwkJZ290byBpZ2V0X2Vycm9yOworCX0KKworCS8qIGFwcGx5IHRoZSBzdGF0dXMgcmVwb3J0IHdlJ3ZlIGdvdCBmb3IgdGhlIG5ldyB2bm9kZSAqLworCXZub2RlID0gQUZTX0ZTX0koaW5vZGUpOworCXNwaW5fbG9jaygmdm5vZGUtPmxvY2spOworCXZub2RlLT51cGRhdGVfY250Kys7CisJc3Bpbl91bmxvY2soJnZub2RlLT5sb2NrKTsKKwlhZnNfdm5vZGVfZmluYWxpc2Vfc3RhdHVzX3VwZGF0ZSh2bm9kZSwgc2VydmVyKTsKKwlhZnNfcHV0X3NlcnZlcihzZXJ2ZXIpOworCisJZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKKwlpZiAoZF91bmhhc2hlZChkZW50cnkpKSB7CisJCV9kZWJ1Zygibm90IGhhc2hlZCIpOworCQlkX3JlaGFzaChkZW50cnkpOworCX0KKwlrZXlfcHV0KGtleSk7CisJX2xlYXZlKCIgPSAwIik7CisJcmV0dXJuIDA7CisKK2lnZXRfZXJyb3I6CisJYWZzX3B1dF9zZXJ2ZXIoc2VydmVyKTsKK2NyZWF0ZV9lcnJvcjoKKwlrZXlfcHV0KGtleSk7CitlcnJvcjoKKwlkX2Ryb3AoZGVudHJ5KTsKKwlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogY3JlYXRlIGEgaGFyZCBsaW5rIGJldHdlZW4gZmlsZXMgaW4gYW4gQUZTIGZpbGVzeXN0ZW0KKyAqLworc3RhdGljIGludCBhZnNfbGluayhzdHJ1Y3QgZGVudHJ5ICpmcm9tLCBzdHJ1Y3QgaW5vZGUgKmRpciwKKwkJICAgIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlzdHJ1Y3QgYWZzX3Zub2RlICpkdm5vZGUsICp2bm9kZTsKKwlzdHJ1Y3Qga2V5ICprZXk7CisJaW50IHJldDsKKworCXZub2RlID0gQUZTX0ZTX0koZnJvbS0+ZF9pbm9kZSk7CisJZHZub2RlID0gQUZTX0ZTX0koZGlyKTsKKworCV9lbnRlcigieyV4OiVkfSx7JXg6JWR9LHslc30iLAorCSAgICAgICB2bm9kZS0+ZmlkLnZpZCwgdm5vZGUtPmZpZC52bm9kZSwKKwkgICAgICAgZHZub2RlLT5maWQudmlkLCBkdm5vZGUtPmZpZC52bm9kZSwKKwkgICAgICAgZGVudHJ5LT5kX25hbWUubmFtZSk7CisKKwlyZXQgPSAtRU5BTUVUT09MT05HOworCWlmIChkZW50cnktPmRfbmFtZS5sZW4gPiAyNTUpCisJCWdvdG8gZXJyb3I7CisKKwlrZXkgPSBhZnNfcmVxdWVzdF9rZXkoZHZub2RlLT52b2x1bWUtPmNlbGwpOworCWlmIChJU19FUlIoa2V5KSkgeworCQlyZXQgPSBQVFJfRVJSKGtleSk7CisJCWdvdG8gZXJyb3I7CisJfQorCisJcmV0ID0gYWZzX3Zub2RlX2xpbmsoZHZub2RlLCB2bm9kZSwga2V5LCBkZW50cnktPmRfbmFtZS5uYW1lKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBsaW5rX2Vycm9yOworCisJYXRvbWljX2luYygmdm5vZGUtPnZmc19pbm9kZS5pX2NvdW50KTsKKwlkX2luc3RhbnRpYXRlKGRlbnRyeSwgJnZub2RlLT52ZnNfaW5vZGUpOworCWtleV9wdXQoa2V5KTsKKwlfbGVhdmUoIiA9IDAiKTsKKwlyZXR1cm4gMDsKKworbGlua19lcnJvcjoKKwlrZXlfcHV0KGtleSk7CitlcnJvcjoKKwlkX2Ryb3AoZGVudHJ5KTsKKwlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogY3JlYXRlIGEgc3ltbGluayBpbiBhbiBBRlMgZmlsZXN5c3RlbQorICovCitzdGF0aWMgaW50IGFmc19zeW1saW5rKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCSAgICAgICBjb25zdCBjaGFyICpjb250ZW50KQoreworCXN0cnVjdCBhZnNfZmlsZV9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXI7CisJc3RydWN0IGFmc192bm9kZSAqZHZub2RlLCAqdm5vZGU7CisJc3RydWN0IGFmc19maWQgZmlkOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3RydWN0IGtleSAqa2V5OworCWludCByZXQ7CisKKwlkdm5vZGUgPSBBRlNfRlNfSShkaXIpOworCisJX2VudGVyKCJ7JXg6JWR9LHslc30sJXMiLAorCSAgICAgICBkdm5vZGUtPmZpZC52aWQsIGR2bm9kZS0+ZmlkLnZub2RlLCBkZW50cnktPmRfbmFtZS5uYW1lLAorCSAgICAgICBjb250ZW50KTsKKworCXJldCA9IC1FTkFNRVRPT0xPTkc7CisJaWYgKGRlbnRyeS0+ZF9uYW1lLmxlbiA+IDI1NSkKKwkJZ290byBlcnJvcjsKKworCXJldCA9IC1FSU5WQUw7CisJaWYgKHN0cmxlbihjb250ZW50KSA+IDEwMjMpCisJCWdvdG8gZXJyb3I7CisKKwlrZXkgPSBhZnNfcmVxdWVzdF9rZXkoZHZub2RlLT52b2x1bWUtPmNlbGwpOworCWlmIChJU19FUlIoa2V5KSkgeworCQlyZXQgPSBQVFJfRVJSKGtleSk7CisJCWdvdG8gZXJyb3I7CisJfQorCisJcmV0ID0gYWZzX3Zub2RlX3N5bWxpbmsoZHZub2RlLCBrZXksIGRlbnRyeS0+ZF9uYW1lLm5hbWUsIGNvbnRlbnQsCisJCQkJJmZpZCwgJnN0YXR1cywgJnNlcnZlcik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gY3JlYXRlX2Vycm9yOworCisJaW5vZGUgPSBhZnNfaWdldChkaXItPmlfc2IsIGtleSwgJmZpZCwgJnN0YXR1cywgTlVMTCk7CisJaWYgKElTX0VSUihpbm9kZSkpIHsKKwkJLyogRU5PTUVNIGF0IGEgcmVhbGx5IGluY29udmVuaWVudCB0aW1lIC0ganVzdCBhYmFuZG9uIHRoZSBuZXcKKwkJICogZGlyZWN0b3J5IG9uIHRoZSBzZXJ2ZXIgKi8KKwkJcmV0ID0gUFRSX0VSUihpbm9kZSk7CisJCWdvdG8gaWdldF9lcnJvcjsKKwl9CisKKwkvKiBhcHBseSB0aGUgc3RhdHVzIHJlcG9ydCB3ZSd2ZSBnb3QgZm9yIHRoZSBuZXcgdm5vZGUgKi8KKwl2bm9kZSA9IEFGU19GU19JKGlub2RlKTsKKwlzcGluX2xvY2soJnZub2RlLT5sb2NrKTsKKwl2bm9kZS0+dXBkYXRlX2NudCsrOworCXNwaW5fdW5sb2NrKCZ2bm9kZS0+bG9jayk7CisJYWZzX3Zub2RlX2ZpbmFsaXNlX3N0YXR1c191cGRhdGUodm5vZGUsIHNlcnZlcik7CisJYWZzX3B1dF9zZXJ2ZXIoc2VydmVyKTsKKworCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CisJaWYgKGRfdW5oYXNoZWQoZGVudHJ5KSkgeworCQlfZGVidWcoIm5vdCBoYXNoZWQiKTsKKwkJZF9yZWhhc2goZGVudHJ5KTsKKwl9CisJa2V5X3B1dChrZXkpOworCV9sZWF2ZSgiID0gMCIpOworCXJldHVybiAwOworCitpZ2V0X2Vycm9yOgorCWFmc19wdXRfc2VydmVyKHNlcnZlcik7CitjcmVhdGVfZXJyb3I6CisJa2V5X3B1dChrZXkpOworZXJyb3I6CisJZF9kcm9wKGRlbnRyeSk7CisJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIHJlbmFtZSBhIGZpbGUgaW4gYW4gQUZTIGZpbGVzeXN0ZW0gYW5kL29yIG1vdmUgaXQgYmV0d2VlbiBkaXJlY3RvcmllcworICovCitzdGF0aWMgaW50IGFmc19yZW5hbWUoc3RydWN0IGlub2RlICpvbGRfZGlyLCBzdHJ1Y3QgZGVudHJ5ICpvbGRfZGVudHJ5LAorCQkgICAgICBzdHJ1Y3QgaW5vZGUgKm5ld19kaXIsIHN0cnVjdCBkZW50cnkgKm5ld19kZW50cnkpCit7CisJc3RydWN0IGFmc192bm9kZSAqb3JpZ19kdm5vZGUsICpuZXdfZHZub2RlLCAqdm5vZGU7CisJc3RydWN0IGtleSAqa2V5OworCWludCByZXQ7CisKKwl2bm9kZSA9IEFGU19GU19JKG9sZF9kZW50cnktPmRfaW5vZGUpOworCW9yaWdfZHZub2RlID0gQUZTX0ZTX0kob2xkX2Rpcik7CisJbmV3X2R2bm9kZSA9IEFGU19GU19JKG5ld19kaXIpOworCisJX2VudGVyKCJ7JXg6JWR9LHsleDolZH0seyV4OiVkfSx7JXN9IiwKKwkgICAgICAgb3JpZ19kdm5vZGUtPmZpZC52aWQsIG9yaWdfZHZub2RlLT5maWQudm5vZGUsCisJICAgICAgIHZub2RlLT5maWQudmlkLCB2bm9kZS0+ZmlkLnZub2RlLAorCSAgICAgICBuZXdfZHZub2RlLT5maWQudmlkLCBuZXdfZHZub2RlLT5maWQudm5vZGUsCisJICAgICAgIG5ld19kZW50cnktPmRfbmFtZS5uYW1lKTsKKworCXJldCA9IC1FTkFNRVRPT0xPTkc7CisJaWYgKG5ld19kZW50cnktPmRfbmFtZS5sZW4gPiAyNTUpCisJCWdvdG8gZXJyb3I7CisKKwlrZXkgPSBhZnNfcmVxdWVzdF9rZXkob3JpZ19kdm5vZGUtPnZvbHVtZS0+Y2VsbCk7CisJaWYgKElTX0VSUihrZXkpKSB7CisJCXJldCA9IFBUUl9FUlIoa2V5KTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlyZXQgPSBhZnNfdm5vZGVfcmVuYW1lKG9yaWdfZHZub2RlLCBuZXdfZHZub2RlLCBrZXksCisJCQkgICAgICAgb2xkX2RlbnRyeS0+ZF9uYW1lLm5hbWUsCisJCQkgICAgICAgbmV3X2RlbnRyeS0+ZF9uYW1lLm5hbWUpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIHJlbmFtZV9lcnJvcjsKKwlrZXlfcHV0KGtleSk7CisJX2xlYXZlKCIgPSAwIik7CisJcmV0dXJuIDA7CisKK3JlbmFtZV9lcnJvcjoKKwlrZXlfcHV0KGtleSk7CitlcnJvcjoKKwlkX2Ryb3AobmV3X2RlbnRyeSk7CisJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2ZzL2Fmcy9lcnJvcnMuaCBiL2ZzL2Fmcy9lcnJvcnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc0ZDk0YS4uMDAwMDAwMAotLS0gYS9mcy9hZnMvZXJyb3JzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKiBlcnJvcnMuaDogQUZTIGFib3J0L2Vycm9yIGNvZGVzCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi0KLSNpZm5kZWYgX0xJTlVYX0FGU19FUlJPUlNfSAotI2RlZmluZSBfTElOVVhfQUZTX0VSUk9SU19ICi0KLSNpbmNsdWRlICJ0eXBlcy5oIgotCi0vKiBmaWxlIHNlcnZlciBhYm9ydCBjb2RlcyAqLwotdHlwZWRlZiBlbnVtIHsKLQlWU0FMVkFHRQk9IDEwMSwJLyogdm9sdW1lIG5lZWRzIHNhbHZhZ2luZyAqLwotCVZOT1ZOT0RFCT0gMTAyLAkvKiBubyBzdWNoIGZpbGUvZGlyICh2bm9kZSkgKi8KLQlWTk9WT0wJCT0gMTAzLAkvKiBubyBzdWNoIHZvbHVtZSBvciB2b2x1bWUgdW5hdmFpbGFibGUgKi8KLQlWVk9MRVhJU1RTCT0gMTA0LAkvKiB2b2x1bWUgbmFtZSBhbHJlYWR5IGV4aXN0cyAqLwotCVZOT1NFUlZJQ0UJPSAxMDUsCS8qIHZvbHVtZSBub3QgY3VycmVudGx5IGluIHNlcnZpY2UgKi8KLQlWT0ZGTElORQk9IDEwNiwJLyogdm9sdW1lIGlzIGN1cnJlbnRseSBvZmZsaW5lIChtb3JlIGluZm8gYXZhaWxhYmxlIFtWVkwtc3BlY10pICovCi0JVk9OTElORQkJPSAxMDcsCS8qIHZvbHVtZSBpcyBhbHJlYWR5IG9ubGluZSAqLwotCVZESVNLRlVMTAk9IDEwOCwJLyogZGlzayBwYXJ0aXRpb24gaXMgZnVsbCAqLwotCVZPVkVSUVVPVEEJPSAxMDksCS8qIHZvbHVtZSdzIG1heGltdW0gcXVvdGEgZXhjZWVkZWQgKi8KLQlWQlVTWQkJPSAxMTAsCS8qIHZvbHVtZSBpcyB0ZW1wb3JhcmlseSB1bmF2YWlsYWJsZSAqLwotCVZNT1ZFRAkJPSAxMTEsCS8qIHZvbHVtZSBtb3ZlZCB0byBuZXcgc2VydmVyIC0gYXNrIHRoaXMgRlMgd2hlcmUgKi8KLX0gYWZzX3J4ZnNfYWJvcnRfdDsKLQotZXh0ZXJuIGludCBhZnNfYWJvcnRfdG9fZXJyb3IoaW50IGFib3J0Y29kZSk7Ci0KLSNlbmRpZiAvKiBfTElOVVhfQUZTX0VSUk9SU19IICovCmRpZmYgLS1naXQgYS9mcy9hZnMvZmlsZS5jIGIvZnMvYWZzL2ZpbGUuYwppbmRleCBiMTc2MzQ1Li5hZTI1NjQ5IDEwMDY0NAotLS0gYS9mcy9hZnMvZmlsZS5jCisrKyBiL2ZzL2Fmcy9maWxlLmMKQEAgLTEsNiArMSw2IEBACi0vKiBmaWxlLmM6IEFGUyBmaWxlc3lzdGVtIGZpbGUgaGFuZGxpbmcKKy8qIEFGUyBmaWxlc3lzdGVtIGZpbGUgaGFuZGxpbmcKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCkBAIC0xNSwyMiArMTUsMjUgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+Ci0jaW5jbHVkZSAidm9sdW1lLmgiCi0jaW5jbHVkZSAidm5vZGUuaCIKLSNpbmNsdWRlIDxyeHJwYy9jYWxsLmg+CiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAotI2lmIDAKLXN0YXRpYyBpbnQgYWZzX2ZpbGVfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7Ci1zdGF0aWMgaW50IGFmc19maWxlX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOwotI2VuZGlmCi0KIHN0YXRpYyBpbnQgYWZzX2ZpbGVfcmVhZHBhZ2Uoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlKTsKIHN0YXRpYyB2b2lkIGFmc19maWxlX2ludmFsaWRhdGVwYWdlKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIG9mZnNldCk7CiBzdGF0aWMgaW50IGFmc19maWxlX3JlbGVhc2VwYWdlKHN0cnVjdCBwYWdlICpwYWdlLCBnZnBfdCBnZnBfZmxhZ3MpOwogCitjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFmc19maWxlX29wZXJhdGlvbnMgPSB7CisJLm9wZW4JCT0gYWZzX29wZW4sCisJLnJlbGVhc2UJPSBhZnNfcmVsZWFzZSwKKwkubGxzZWVrCQk9IGdlbmVyaWNfZmlsZV9sbHNlZWssCisJLnJlYWQJCT0gZG9fc3luY19yZWFkLAorCS5haW9fcmVhZAk9IGdlbmVyaWNfZmlsZV9haW9fcmVhZCwKKwkubW1hcAkJPSBnZW5lcmljX2ZpbGVfcmVhZG9ubHlfbW1hcCwKKwkuc2VuZGZpbGUJPSBnZW5lcmljX2ZpbGVfc2VuZGZpbGUsCit9OworCiBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBhZnNfZmlsZV9pbm9kZV9vcGVyYXRpb25zID0gewogCS5nZXRhdHRyCT0gYWZzX2lub2RlX2dldGF0dHIsCisJLnBlcm1pc3Npb24JPSBhZnNfcGVybWlzc2lvbiwKIH07CiAKIGNvbnN0IHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgYWZzX2ZzX2FvcHMgPSB7CkBAIC00MCw3ICs0Myw0OCBAQAogCS5pbnZhbGlkYXRlcGFnZQk9IGFmc19maWxlX2ludmFsaWRhdGVwYWdlLAogfTsKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIG9wZW4gYW4gQUZTIGZpbGUgb3IgZGlyZWN0b3J5IGFuZCBhdHRhY2ggYSBrZXkgdG8gaXQKKyAqLworaW50IGFmc19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBhZnNfdm5vZGUgKnZub2RlID0gQUZTX0ZTX0koaW5vZGUpOworCXN0cnVjdCBrZXkgKmtleTsKKwlpbnQgcmV0OworCisJX2VudGVyKCJ7JXg6JXh9LCIsIHZub2RlLT5maWQudmlkLCB2bm9kZS0+ZmlkLnZub2RlKTsKKworCWtleSA9IGFmc19yZXF1ZXN0X2tleSh2bm9kZS0+dm9sdW1lLT5jZWxsKTsKKwlpZiAoSVNfRVJSKGtleSkpIHsKKwkJX2xlYXZlKCIgPSAlbGQgW2tleV0iLCBQVFJfRVJSKGtleSkpOworCQlyZXR1cm4gUFRSX0VSUihrZXkpOworCX0KKworCXJldCA9IGFmc192YWxpZGF0ZSh2bm9kZSwga2V5KTsKKwlpZiAocmV0IDwgMCkgeworCQlfbGVhdmUoIiA9ICVkIFt2YWxdIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBrZXk7CisJX2xlYXZlKCIgPSAwIik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiByZWxlYXNlIGFuIEFGUyBmaWxlIG9yIGRpcmVjdG9yeSBhbmQgZGlzY2FyZCBpdHMga2V5CisgKi8KK2ludCBhZnNfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSA9IEFGU19GU19JKGlub2RlKTsKKworCV9lbnRlcigieyV4OiV4fSwiLCB2bm9kZS0+ZmlkLnZpZCwgdm5vZGUtPmZpZC52bm9kZSk7CisKKwlrZXlfcHV0KGZpbGUtPnByaXZhdGVfZGF0YSk7CisJX2xlYXZlKCIgPSAwIik7CisJcmV0dXJuIDA7Cit9CisKIC8qCiAgKiBkZWFsIHdpdGggbm90aWZpY2F0aW9uIHRoYXQgYSBwYWdlIHdhcyByZWFkIGZyb20gdGhlIGNhY2hlCiAgKi8KQEAgLTU4LDEwICsxMDIsOSBAQAogCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CiAJdW5sb2NrX3BhZ2UocGFnZSk7CiAKLX0gLyogZW5kIGFmc19maWxlX3JlYWRwYWdlX3JlYWRfY29tcGxldGUoKSAqLworfQogI2VuZGlmCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCiAgKiBkZWFsIHdpdGggbm90aWZpY2F0aW9uIHRoYXQgYSBwYWdlIHdhcyB3cml0dGVuIHRvIHRoZSBjYWNoZQogICovCkBAIC03NCw0MSArMTE3LDM4IEBACiAJX2VudGVyKCIlcCwlcCwlcCwlZCIsIGNvb2tpZV9kYXRhLCBwYWdlLCBkYXRhLCBlcnJvcik7CiAKIAl1bmxvY2tfcGFnZShwYWdlKTsKLQotfSAvKiBlbmQgYWZzX2ZpbGVfcmVhZHBhZ2Vfd3JpdGVfY29tcGxldGUoKSAqLworfQogI2VuZGlmCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCiAgKiBBRlMgcmVhZCBwYWdlIGZyb20gZmlsZSAob3Igc3ltbGluaykKICAqLwogc3RhdGljIGludCBhZnNfZmlsZV9yZWFkcGFnZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UpCiB7Ci0Jc3RydWN0IGFmc19yeGZzX2ZldGNoX2Rlc2NyaXB0b3IgZGVzYzsKLSNpZmRlZiBBRlNfQ0FDSElOR19TVVBQT1JUCi0Jc3RydWN0IGNhY2hlZnNfcGFnZSAqcGFnZWlvOwotI2VuZGlmCiAJc3RydWN0IGFmc192bm9kZSAqdm5vZGU7CiAJc3RydWN0IGlub2RlICppbm9kZTsKKwlzdHJ1Y3Qga2V5ICprZXk7CisJc2l6ZV90IGxlbjsKKwlvZmZfdCBvZmZzZXQ7CiAJaW50IHJldDsKIAogCWlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKIAotCV9lbnRlcigieyVsdX0seyVsdX0iLCBpbm9kZS0+aV9pbm8sIHBhZ2UtPmluZGV4KTsKKwlBU1NFUlQoZmlsZSAhPSBOVUxMKTsKKwlrZXkgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJQVNTRVJUKGtleSAhPSBOVUxMKTsKKworCV9lbnRlcigieyV4fSx7JWx1fSx7JWx1fSIsIGtleV9zZXJpYWwoa2V5KSwgaW5vZGUtPmlfaW5vLCBwYWdlLT5pbmRleCk7CiAKIAl2bm9kZSA9IEFGU19GU19JKGlub2RlKTsKIAogCUJVR19PTighUGFnZUxvY2tlZChwYWdlKSk7CiAKIAlyZXQgPSAtRVNUQUxFOwotCWlmICh2bm9kZS0+ZmxhZ3MgJiBBRlNfVk5PREVfREVMRVRFRCkKKwlpZiAodGVzdF9iaXQoQUZTX1ZOT0RFX0RFTEVURUQsICZ2bm9kZS0+ZmxhZ3MpKQogCQlnb3RvIGVycm9yOwogCiAjaWZkZWYgQUZTX0NBQ0hJTkdfU1VQUE9SVAotCXJldCA9IGNhY2hlZnNfcGFnZV9nZXRfcHJpdmF0ZShwYWdlLCAmcGFnZWlvLCBHRlBfTk9JTyk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gZXJyb3I7Ci0KIAkvKiBpcyBpdCBjYWNoZWQ/ICovCiAJcmV0ID0gY2FjaGVmc19yZWFkX29yX2FsbG9jX3BhZ2Uodm5vZGUtPmNhY2hlLAogCQkJCQkgcGFnZSwKQEAgLTEzMiwyNiArMTcyLDE5IEBACiAJY2FzZSAtRU5PQlVGUzoKIAljYXNlIC1FTk9EQVRBOgogCWRlZmF1bHQ6Ci0JCWRlc2MuZmlkCT0gdm5vZGUtPmZpZDsKLQkJZGVzYy5vZmZzZXQJPSBwYWdlLT5pbmRleCA8PCBQQUdFX0NBQ0hFX1NISUZUOwotCQlkZXNjLnNpemUJPSBtaW4oKHNpemVfdCkgKGlub2RlLT5pX3NpemUgLSBkZXNjLm9mZnNldCksCi0JCQkJICAgICAgKHNpemVfdCkgUEFHRV9TSVpFKTsKLQkJZGVzYy5idWZmZXIJPSBrbWFwKHBhZ2UpOwotCi0JCWNsZWFyX3BhZ2UoZGVzYy5idWZmZXIpOworCQlvZmZzZXQgPSBwYWdlLT5pbmRleCA8PCBQQUdFX0NBQ0hFX1NISUZUOworCQlsZW4gPSBtaW5fdChzaXplX3QsIGlfc2l6ZV9yZWFkKGlub2RlKSAtIG9mZnNldCwgUEFHRV9TSVpFKTsKIAogCQkvKiByZWFkIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZSBmcm9tIHRoZSBzZXJ2ZXIgaW50byB0aGUKIAkJICogcGFnZSAqLwotCQlyZXQgPSBhZnNfdm5vZGVfZmV0Y2hfZGF0YSh2bm9kZSwgJmRlc2MpOwotCQlrdW5tYXAocGFnZSk7CisJCXJldCA9IGFmc192bm9kZV9mZXRjaF9kYXRhKHZub2RlLCBrZXksIG9mZnNldCwgbGVuLCBwYWdlKTsKIAkJaWYgKHJldCA8IDApIHsKLQkJCWlmIChyZXQ9PS1FTk9FTlQpIHsKKwkJCWlmIChyZXQgPT0gLUVOT0VOVCkgewogCQkJCV9kZWJ1ZygiZ290IE5PRU5UIGZyb20gc2VydmVyIgogCQkJCSAgICAgICAiIC0gbWFya2luZyBmaWxlIGRlbGV0ZWQgYW5kIHN0YWxlIik7Ci0JCQkJdm5vZGUtPmZsYWdzIHw9IEFGU19WTk9ERV9ERUxFVEVEOworCQkJCXNldF9iaXQoQUZTX1ZOT0RFX0RFTEVURUQsICZ2bm9kZS0+ZmxhZ3MpOwogCQkJCXJldCA9IC1FU1RBTEU7CiAJCQl9Ci0KICNpZmRlZiBBRlNfQ0FDSElOR19TVVBQT1JUCiAJCQljYWNoZWZzX3VuY2FjaGVfcGFnZSh2bm9kZS0+Y2FjaGUsIHBhZ2UpOwogI2VuZGlmCkBAIC0xNzgsMTYgKzIxMSwxMyBAQAogCV9sZWF2ZSgiID0gMCIpOwogCXJldHVybiAwOwogCi0gZXJyb3I6CitlcnJvcjoKIAlTZXRQYWdlRXJyb3IocGFnZSk7CiAJdW5sb2NrX3BhZ2UocGFnZSk7Ci0KIAlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKIAlyZXR1cm4gcmV0OworfQogCi19IC8qIGVuZCBhZnNfZmlsZV9yZWFkcGFnZSgpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCiAgKiBnZXQgYSBwYWdlIGNvb2tpZSBmb3IgdGhlIHNwZWNpZmllZCBwYWdlCiAgKi8KQEAgLTIwMiwxMCArMjMyLDkgQEAKIAogCV9sZWF2ZSgiID0gJWQiLCByZXQpOwogCXJldHVybiByZXQ7Ci19IC8qIGVuZCBhZnNfY2FjaGVfZ2V0X3BhZ2VfY29va2llKCkgKi8KK30KICNlbmRpZgogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICogaW52YWxpZGF0ZSBwYXJ0IG9yIGFsbCBvZiBhIHBhZ2UKICAqLwpAQCAtMjQwLDkgKzI2OSw4IEBACiAJfQogCiAJX2xlYXZlKCIgPSAlZCIsIHJldCk7Ci19IC8qIGVuZCBhZnNfZmlsZV9pbnZhbGlkYXRlcGFnZSgpICovCit9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCiAgKiByZWxlYXNlIGEgcGFnZSBhbmQgY2xlYW51cCBpdHMgcHJpdmF0ZSBkYXRhCiAgKi8KQEAgLTI2Nyw0ICsyOTUsNCBAQAogCiAJX2xlYXZlKCIgPSAwIik7CiAJcmV0dXJuIDA7Ci19IC8qIGVuZCBhZnNfZmlsZV9yZWxlYXNlcGFnZSgpICovCit9CmRpZmYgLS1naXQgYS9mcy9hZnMvZnNjbGllbnQuYyBiL2ZzL2Fmcy9mc2NsaWVudC5jCmluZGV4IDYxYmMzNzEuLjIzOTNkMmEgMTAwNjQ0Ci0tLSBhL2ZzL2Fmcy9mc2NsaWVudC5jCisrKyBiL2ZzL2Fmcy9mc2NsaWVudC5jCkBAIC0xLDYgKzEsNiBAQAotLyogZnNjbGllbnQuYzogQUZTIEZpbGUgU2VydmVyIGNsaWVudCBzdHVicworLyogQUZTIEZpbGUgU2VydmVyIGNsaWVudCBzdHVicwogICoKLSAqIENvcHlyaWdodCAoQykgMjAwMiBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKQEAgLTExLDgyNyArMTEsOTI3IEBACiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxyeHJwYy9yeHJwYy5oPgotI2luY2x1ZGUgPHJ4cnBjL3RyYW5zcG9ydC5oPgotI2luY2x1ZGUgPHJ4cnBjL2Nvbm5lY3Rpb24uaD4KLSNpbmNsdWRlIDxyeHJwYy9jYWxsLmg+Ci0jaW5jbHVkZSAiZnNjbGllbnQuaCIKLSNpbmNsdWRlICJjbXNlcnZpY2UuaCIKLSNpbmNsdWRlICJ2bm9kZS5oIgotI2luY2x1ZGUgInNlcnZlci5oIgotI2luY2x1ZGUgImVycm9ycy5oIgorI2luY2x1ZGUgPGxpbnV4L2NpcmNfYnVmLmg+CiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJhZnNfZnMuaCIKIAotI2RlZmluZSBGU0ZFVENIU1RBVFVTCQkxMzIJLyogQUZTIEZldGNoIGZpbGUgc3RhdHVzICovCi0jZGVmaW5lIEZTRkVUQ0hEQVRBCQkxMzAJLyogQUZTIEZldGNoIGZpbGUgZGF0YSAqLwotI2RlZmluZSBGU0dJVkVVUENBTExCQUNLUwkxNDcJLyogQUZTIERpc2NhcmQgY2FsbGJhY2sgcHJvbWlzZXMgKi8KLSNkZWZpbmUgRlNHRVRWT0xVTUVJTkZPCQkxNDgJLyogQUZTIEdldCByb290IHZvbHVtZSBpbmZvcm1hdGlvbiAqLwotI2RlZmluZSBGU0dFVFJPT1RWT0xVTUUJCTE1MQkvKiBBRlMgR2V0IHJvb3Qgdm9sdW1lIG5hbWUgKi8KLSNkZWZpbmUgRlNMT09LVVAJCTE2MQkvKiBBRlMgbG9va3VwIGZpbGUgaW4gZGlyZWN0b3J5ICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCi0gKiBtYXAgYWZzIGFib3J0IGNvZGVzIHRvL2Zyb20gTGludXggZXJyb3IgY29kZXMKLSAqIC0gY2FsbGVkIHdpdGggY2FsbC0+bG9jayBoZWxkCisgKiBkZWNvZGUgYW4gQUZTRmlkIGJsb2NrCiAgKi8KLXN0YXRpYyB2b2lkIGFmc19yeGZzX2FlbWFwKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKQorc3RhdGljIHZvaWQgeGRyX2RlY29kZV9BRlNGaWQoY29uc3QgX19iZTMyICoqX2JwLCBzdHJ1Y3QgYWZzX2ZpZCAqZmlkKQogewotCXN3aXRjaCAoY2FsbC0+YXBwX2Vycl9zdGF0ZSkgewotCWNhc2UgUlhSUENfRVNUQVRFX0xPQ0FMX0FCT1JUOgotCQljYWxsLT5hcHBfYWJvcnRfY29kZSA9IC1jYWxsLT5hcHBfZXJybm87Ci0JCWJyZWFrOwotCWNhc2UgUlhSUENfRVNUQVRFX1BFRVJfQUJPUlQ6Ci0JCWNhbGwtPmFwcF9lcnJubyA9IGFmc19hYm9ydF90b19lcnJvcihjYWxsLT5hcHBfYWJvcnRfY29kZSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLX0gLyogZW5kIGFmc19yeGZzX2FlbWFwKCkgKi8KKwljb25zdCBfX2JlMzIgKmJwID0gKl9icDsKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCWZpZC0+dmlkCQk9IG50b2hsKCpicCsrKTsKKwlmaWQtPnZub2RlCQk9IG50b2hsKCpicCsrKTsKKwlmaWQtPnVuaXF1ZQkJPSBudG9obCgqYnArKyk7CisJKl9icCA9IGJwOworfQorCiAvKgotICogZ2V0IHRoZSByb290IHZvbHVtZSBuYW1lIGZyb20gYSBmaWxlc2VydmVyCi0gKiAtIHRoaXMgb3BlcmF0aW9uIGRvZXNuJ3Qgc2VlbSB0byB3b3JrIGNvcnJlY3RseSBpbiBPcGVuQUZTIHNlcnZlciAxLjIuMgorICogZGVjb2RlIGFuIEFGU0ZldGNoU3RhdHVzIGJsb2NrCiAgKi8KLSNpZiAwCi1pbnQgYWZzX3J4ZnNfZ2V0X3Jvb3Rfdm9sdW1lKHN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIsCi0JCQkgICAgIGNoYXIgKmJ1Ziwgc2l6ZV90ICpidWZsZW4pCitzdGF0aWMgdm9pZCB4ZHJfZGVjb2RlX0FGU0ZldGNoU3RhdHVzKGNvbnN0IF9fYmUzMiAqKl9icCwKKwkJCQkgICAgICBzdHJ1Y3QgYWZzX2ZpbGVfc3RhdHVzICpzdGF0dXMsCisJCQkJICAgICAgc3RydWN0IGFmc192bm9kZSAqdm5vZGUpCiB7Ci0Jc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm47Ci0Jc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGw7Ci0Jc3RydWN0IGt2ZWMgcGlvdlsyXTsKLQlzaXplX3Qgc2VudDsKLQlpbnQgcmV0OwotCXUzMiBwYXJhbVsxXTsKKwljb25zdCBfX2JlMzIgKmJwID0gKl9icDsKKwl1bW9kZV90IG1vZGU7CisJdTY0IGRhdGFfdmVyc2lvbiwgc2l6ZTsKKwl1MzIgY2hhbmdlZCA9IDA7IC8qIGJlY29tZXMgbm9uLXplcm8gaWYgY3RpbWUtdHlwZSBjaGFuZ2VzIHNlZW4gKi8KIAotCURFQ0xBUkVfV0FJVFFVRVVFKG15c2VsZiwgY3VycmVudCk7CisjZGVmaW5lIEVYVFJBQ1QoRFNUKQkJCQlcCisJZG8gewkJCQkJXAorCQl1MzIgeCA9IG50b2hsKCpicCsrKTsJCVwKKwkJY2hhbmdlZCB8PSBEU1QgLSB4OwkJXAorCQlEU1QgPSB4OwkJCVwKKwl9IHdoaWxlICgwKQogCi0Ja2VudGVyKCIlcCwlcCwldSIsc2VydmVyLCBidWYsICpidWZsZW4pOworCXN0YXR1cy0+aWZfdmVyc2lvbiA9IG50b2hsKCpicCsrKTsKKwlFWFRSQUNUKHN0YXR1cy0+dHlwZSk7CisJRVhUUkFDVChzdGF0dXMtPm5saW5rKTsKKwlzaXplID0gbnRvaGwoKmJwKyspOworCWRhdGFfdmVyc2lvbiA9IG50b2hsKCpicCsrKTsKKwlFWFRSQUNUKHN0YXR1cy0+YXV0aG9yKTsKKwlFWFRSQUNUKHN0YXR1cy0+b3duZXIpOworCUVYVFJBQ1Qoc3RhdHVzLT5jYWxsZXJfYWNjZXNzKTsgLyogY2FsbCB0aWNrZXQgZGVwZW5kZW50ICovCisJRVhUUkFDVChzdGF0dXMtPmFub25fYWNjZXNzKTsKKwlFWFRSQUNUKHN0YXR1cy0+bW9kZSk7CisJRVhUUkFDVChzdGF0dXMtPnBhcmVudC52bm9kZSk7CisJRVhUUkFDVChzdGF0dXMtPnBhcmVudC51bmlxdWUpOworCWJwKys7IC8qIHNlZyBzaXplICovCisJc3RhdHVzLT5tdGltZV9jbGllbnQgPSBudG9obCgqYnArKyk7CisJc3RhdHVzLT5tdGltZV9zZXJ2ZXIgPSBudG9obCgqYnArKyk7CisJRVhUUkFDVChzdGF0dXMtPmdyb3VwKTsKKwlicCsrOyAvKiBzeW5jIGNvdW50ZXIgKi8KKwlkYXRhX3ZlcnNpb24gfD0gKHU2NCkgbnRvaGwoKmJwKyspIDw8IDMyOworCWJwKys7IC8qIGxvY2sgY291bnQgKi8KKwlzaXplIHw9ICh1NjQpIG50b2hsKCpicCsrKSA8PCAzMjsKKwlicCsrOyAvKiBzcGFyZSA0ICovCisJKl9icCA9IGJwOwogCi0JLyogZ2V0IGhvbGQgb2YgdGhlIGZpbGVzZXJ2ZXIgY29ubmVjdGlvbiAqLwotCXJldCA9IGFmc19zZXJ2ZXJfZ2V0X2ZzY29ubihzZXJ2ZXIsICZjb25uKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBvdXQ7Ci0KLQkvKiBjcmVhdGUgYSBjYWxsIHRocm91Z2ggdGhhdCBjb25uZWN0aW9uICovCi0JcmV0ID0gcnhycGNfY3JlYXRlX2NhbGwoY29ubiwgTlVMTCwgTlVMTCwgYWZzX3J4ZnNfYWVtYXAsICZjYWxsKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcmludGsoImtBRlM6IFVuYWJsZSB0byBjcmVhdGUgY2FsbDogJWRcbiIsIHJldCk7Ci0JCWdvdG8gb3V0X3B1dF9jb25uOworCWlmIChzaXplICE9IHN0YXR1cy0+c2l6ZSkgeworCQlzdGF0dXMtPnNpemUgPSBzaXplOworCQljaGFuZ2VkIHw9IHRydWU7CiAJfQotCWNhbGwtPmFwcF9vcGNvZGUgPSBGU0dFVFJPT1RWT0xVTUU7CisJc3RhdHVzLT5tb2RlICY9IFNfSUFMTFVHTzsKIAotCS8qIHdlIHdhbnQgdG8gZ2V0IGV2ZW50IG5vdGlmaWNhdGlvbnMgZnJvbSB0aGUgY2FsbCAqLwotCWFkZF93YWl0X3F1ZXVlKCZjYWxsLT53YWl0cSwgJm15c2VsZik7CisJX2RlYnVnKCJ2bm9kZSB0aW1lICVseCwgJWx4IiwKKwkgICAgICAgc3RhdHVzLT5tdGltZV9jbGllbnQsIHN0YXR1cy0+bXRpbWVfc2VydmVyKTsKIAotCS8qIG1hcnNoYWxsIHRoZSBwYXJhbWV0ZXJzICovCi0JcGFyYW1bMF0gPSBodG9ubChGU0dFVFJPT1RWT0xVTUUpOworCWlmICh2bm9kZSkgeworCQlzdGF0dXMtPnBhcmVudC52aWQgPSB2bm9kZS0+ZmlkLnZpZDsKKwkJaWYgKGNoYW5nZWQgJiYgIXRlc3RfYml0KEFGU19WTk9ERV9VTlNFVCwgJnZub2RlLT5mbGFncykpIHsKKwkJCV9kZWJ1Zygidm5vZGUgY2hhbmdlZCIpOworCQkJaV9zaXplX3dyaXRlKCZ2bm9kZS0+dmZzX2lub2RlLCBzaXplKTsKKwkJCXZub2RlLT52ZnNfaW5vZGUuaV91aWQgPSBzdGF0dXMtPm93bmVyOworCQkJdm5vZGUtPnZmc19pbm9kZS5pX2dpZCA9IHN0YXR1cy0+Z3JvdXA7CisJCQl2bm9kZS0+dmZzX2lub2RlLmlfdmVyc2lvbiA9IHZub2RlLT5maWQudW5pcXVlOworCQkJdm5vZGUtPnZmc19pbm9kZS5pX25saW5rID0gc3RhdHVzLT5ubGluazsKIAotCXBpb3ZbMF0uaW92X2xlbiA9IHNpemVvZihwYXJhbSk7Ci0JcGlvdlswXS5pb3ZfYmFzZSA9IHBhcmFtOwotCi0JLyogc2VuZCB0aGUgcGFyYW1ldGVycyB0byB0aGUgc2VydmVyICovCi0JcmV0ID0gcnhycGNfY2FsbF93cml0ZV9kYXRhKGNhbGwsIDEsIHBpb3YsIFJYUlBDX0xBU1RfUEFDS0VULCBHRlBfTk9GUywKLQkJCQkgICAgMCwgJnNlbnQpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIGFib3J0OwotCi0JLyogd2FpdCBmb3IgdGhlIHJlcGx5IHRvIGNvbXBsZXRlbHkgYXJyaXZlICovCi0JZm9yICg7OykgewotCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCQlpZiAoY2FsbC0+YXBwX2NhbGxfc3RhdGUgIT0gUlhSUENfQ1NUQVRFX0NMTlRfUkNWX1JFUExZIHx8Ci0JCSAgICBzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKLQkJCWJyZWFrOwotCQlzY2hlZHVsZSgpOwotCX0KLQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwotCi0JcmV0ID0gLUVJTlRSOwotCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKLQkJZ290byBhYm9ydDsKLQotCXN3aXRjaCAoY2FsbC0+YXBwX2NhbGxfc3RhdGUpIHsKLQljYXNlIFJYUlBDX0NTVEFURV9FUlJPUjoKLQkJcmV0ID0gY2FsbC0+YXBwX2Vycm5vOwotCQlrZGVidWcoIkdvdCBFcnJvcjogJWQiLCByZXQpOwotCQlnb3RvIG91dF91bndhaXQ7Ci0KLQljYXNlIFJYUlBDX0NTVEFURV9DTE5UX0dPVF9SRVBMWToKLQkJLyogcmVhZCB0aGUgcmVwbHkgKi8KLQkJa2RlYnVnKCJHb3QgUmVwbHk6IHF0eT0lZCIsIGNhbGwtPmFwcF9yZWFkeV9xdHkpOwotCi0JCXJldCA9IC1FQkFETVNHOwotCQlpZiAoY2FsbC0+YXBwX3JlYWR5X3F0eSA8PSA0KQotCQkJZ290byBhYm9ydDsKLQotCQlyZXQgPSByeHJwY19jYWxsX3JlYWRfZGF0YShjYWxsLCBOVUxMLCBjYWxsLT5hcHBfcmVhZHlfcXR5LCAwKTsKLQkJaWYgKHJldCA8IDApCi0JCQlnb3RvIGFib3J0OwotCi0jaWYgMAotCQkvKiB1bm1hcnNoYWxsIHRoZSByZXBseSAqLwotCQlicCA9IGJ1ZmZlcjsKLQkJZm9yIChsb29wID0gMDsgbG9vcCA8IDY1OyBsb29wKyspCi0JCQllbnRyeS0+bmFtZVtsb29wXSA9IG50b2hsKCpicCsrKTsKLQkJZW50cnktPm5hbWVbNjRdID0gMDsKLQotCQllbnRyeS0+dHlwZSA9IG50b2hsKCpicCsrKTsKLQkJZW50cnktPm51bV9zZXJ2ZXJzID0gbnRvaGwoKmJwKyspOwotCi0JCWZvciAobG9vcCA9IDA7IGxvb3AgPCA4OyBsb29wKyspCi0JCQllbnRyeS0+c2VydmVyc1tsb29wXS5hZGRyLnNfYWRkciA9ICpicCsrOwotCi0JCWZvciAobG9vcCA9IDA7IGxvb3AgPCA4OyBsb29wKyspCi0JCQllbnRyeS0+c2VydmVyc1tsb29wXS5wYXJ0aXRpb24gPSBudG9obCgqYnArKyk7Ci0KLQkJZm9yIChsb29wID0gMDsgbG9vcCA8IDg7IGxvb3ArKykKLQkJCWVudHJ5LT5zZXJ2ZXJzW2xvb3BdLmZsYWdzID0gbnRvaGwoKmJwKyspOwotCi0JCWZvciAobG9vcCA9IDA7IGxvb3AgPCAzOyBsb29wKyspCi0JCQllbnRyeS0+dm9sdW1lX2lkc1tsb29wXSA9IG50b2hsKCpicCsrKTsKLQotCQllbnRyeS0+Y2xvbmVfaWQgPSBudG9obCgqYnArKyk7Ci0JCWVudHJ5LT5mbGFncyA9IG50b2hsKCpicCk7Ci0jZW5kaWYKLQotCQkvKiBzdWNjZXNzICovCi0JCXJldCA9IDA7Ci0JCWdvdG8gb3V0X3Vud2FpdDsKLQotCWRlZmF1bHQ6Ci0JCUJVRygpOwotCX0KLQotIGFib3J0OgotCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKLQlyeHJwY19jYWxsX2Fib3J0KGNhbGwsIHJldCk7Ci0Jc2NoZWR1bGUoKTsKLSBvdXRfdW53YWl0OgotCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7Ci0JcmVtb3ZlX3dhaXRfcXVldWUoJmNhbGwtPndhaXRxLCAmbXlzZWxmKTsKLQlyeHJwY19wdXRfY2FsbChjYWxsKTsKLSBvdXRfcHV0X2Nvbm46Ci0JYWZzX3NlcnZlcl9yZWxlYXNlX2ZzY29ubihzZXJ2ZXIsIGNvbm4pOwotIG91dDoKLQlrbGVhdmUoIiIpOwotCXJldHVybiByZXQ7Ci19IC8qIGVuZCBhZnNfcnhmc19nZXRfcm9vdF92b2x1bWUoKSAqLwotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBnZXQgaW5mb3JtYXRpb24gYWJvdXQgYSB2b2x1bWUKLSAqLwotI2lmIDAKLWludCBhZnNfcnhmc19nZXRfdm9sdW1lX2luZm8oc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlciwKLQkJCSAgICAgY29uc3QgY2hhciAqbmFtZSwKLQkJCSAgICAgc3RydWN0IGFmc192b2x1bWVfaW5mbyAqdmluZm8pCi17Ci0Jc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm47Ci0Jc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGw7Ci0Jc3RydWN0IGt2ZWMgcGlvdlszXTsKLQlzaXplX3Qgc2VudDsKLQlpbnQgcmV0OwotCXUzMiBwYXJhbVsyXSwgKmJwLCB6ZXJvOwotCi0JREVDTEFSRV9XQUlUUVVFVUUobXlzZWxmLCBjdXJyZW50KTsKLQotCV9lbnRlcigiJXAsJXMsJXAiLCBzZXJ2ZXIsIG5hbWUsIHZpbmZvKTsKLQotCS8qIGdldCBob2xkIG9mIHRoZSBmaWxlc2VydmVyIGNvbm5lY3Rpb24gKi8KLQlyZXQgPSBhZnNfc2VydmVyX2dldF9mc2Nvbm4oc2VydmVyLCAmY29ubik7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gb3V0OwotCi0JLyogY3JlYXRlIGEgY2FsbCB0aHJvdWdoIHRoYXQgY29ubmVjdGlvbiAqLwotCXJldCA9IHJ4cnBjX2NyZWF0ZV9jYWxsKGNvbm4sIE5VTEwsIE5VTEwsIGFmc19yeGZzX2FlbWFwLCAmY2FsbCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJpbnRrKCJrQUZTOiBVbmFibGUgdG8gY3JlYXRlIGNhbGw6ICVkXG4iLCByZXQpOwotCQlnb3RvIG91dF9wdXRfY29ubjsKLQl9Ci0JY2FsbC0+YXBwX29wY29kZSA9IEZTR0VUVk9MVU1FSU5GTzsKLQotCS8qIHdlIHdhbnQgdG8gZ2V0IGV2ZW50IG5vdGlmaWNhdGlvbnMgZnJvbSB0aGUgY2FsbCAqLwotCWFkZF93YWl0X3F1ZXVlKCZjYWxsLT53YWl0cSwgJm15c2VsZik7Ci0KLQkvKiBtYXJzaGFsbCB0aGUgcGFyYW1ldGVycyAqLwotCXBpb3ZbMV0uaW92X2xlbiA9IHN0cmxlbihuYW1lKTsKLQlwaW92WzFdLmlvdl9iYXNlID0gKGNoYXIgKikgbmFtZTsKLQotCXplcm8gPSAwOwotCXBpb3ZbMl0uaW92X2xlbiA9ICg0IC0gKHBpb3ZbMV0uaW92X2xlbiAmIDMpKSAmIDM7Ci0JcGlvdlsyXS5pb3ZfYmFzZSA9ICZ6ZXJvOwotCi0JcGFyYW1bMF0gPSBodG9ubChGU0dFVFZPTFVNRUlORk8pOwotCXBhcmFtWzFdID0gaHRvbmwocGlvdlsxXS5pb3ZfbGVuKTsKLQotCXBpb3ZbMF0uaW92X2xlbiA9IHNpemVvZihwYXJhbSk7Ci0JcGlvdlswXS5pb3ZfYmFzZSA9IHBhcmFtOwotCi0JLyogc2VuZCB0aGUgcGFyYW1ldGVycyB0byB0aGUgc2VydmVyICovCi0JcmV0ID0gcnhycGNfY2FsbF93cml0ZV9kYXRhKGNhbGwsIDMsIHBpb3YsIFJYUlBDX0xBU1RfUEFDS0VULCBHRlBfTk9GUywKLQkJCQkgICAgMCwgJnNlbnQpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIGFib3J0OwotCi0JLyogd2FpdCBmb3IgdGhlIHJlcGx5IHRvIGNvbXBsZXRlbHkgYXJyaXZlICovCi0JYnAgPSByeHJwY19jYWxsX2FsbG9jX3NjcmF0Y2goY2FsbCwgNjQpOwotCi0JcmV0ID0gcnhycGNfY2FsbF9yZWFkX2RhdGEoY2FsbCwgYnAsIDY0LAotCQkJCSAgIFJYUlBDX0NBTExfUkVBRF9CTE9DSyB8Ci0JCQkJICAgUlhSUENfQ0FMTF9SRUFEX0FMTCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJaWYgKHJldCA9PSAtRUNPTk5BQk9SVEVEKSB7Ci0JCQlyZXQgPSBjYWxsLT5hcHBfZXJybm87Ci0JCQlnb3RvIG91dF91bndhaXQ7CisJCQltb2RlID0gdm5vZGUtPnZmc19pbm9kZS5pX21vZGU7CisJCQltb2RlICY9IH5TX0lBTExVR087CisJCQltb2RlIHw9IHN0YXR1cy0+bW9kZTsKKwkJCWJhcnJpZXIoKTsKKwkJCXZub2RlLT52ZnNfaW5vZGUuaV9tb2RlID0gbW9kZTsKIAkJfQotCQlnb3RvIGFib3J0OworCisJCXZub2RlLT52ZnNfaW5vZGUuaV9jdGltZS50dl9zZWMJPSBzdGF0dXMtPm10aW1lX3NlcnZlcjsKKwkJdm5vZGUtPnZmc19pbm9kZS5pX210aW1lCT0gdm5vZGUtPnZmc19pbm9kZS5pX2N0aW1lOworCQl2bm9kZS0+dmZzX2lub2RlLmlfYXRpbWUJPSB2bm9kZS0+dmZzX2lub2RlLmlfY3RpbWU7CiAJfQogCi0JLyogdW5tYXJzaGFsbCB0aGUgcmVwbHkgKi8KLQl2aW5mby0+dmlkID0gbnRvaGwoKmJwKyspOwotCXZpbmZvLT50eXBlID0gbnRvaGwoKmJwKyspOworCWlmIChzdGF0dXMtPmRhdGFfdmVyc2lvbiAhPSBkYXRhX3ZlcnNpb24pIHsKKwkJc3RhdHVzLT5kYXRhX3ZlcnNpb24gPSBkYXRhX3ZlcnNpb247CisJCWlmICh2bm9kZSAmJiAhdGVzdF9iaXQoQUZTX1ZOT0RFX1VOU0VULCAmdm5vZGUtPmZsYWdzKSkgeworCQkJX2RlYnVnKCJ2bm9kZSBtb2RpZmllZCAlbGx4IG9uIHsleDoldX0iLAorCQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIGRhdGFfdmVyc2lvbiwKKwkJCSAgICAgICB2bm9kZS0+ZmlkLnZpZCwgdm5vZGUtPmZpZC52bm9kZSk7CisJCQlzZXRfYml0KEFGU19WTk9ERV9NT0RJRklFRCwgJnZub2RlLT5mbGFncyk7CisJCQlzZXRfYml0KEFGU19WTk9ERV9aQVBfREFUQSwgJnZub2RlLT5mbGFncyk7CisJCX0KKwl9Cit9CiAKLQl2aW5mby0+dHlwZV92aWRzWzBdID0gbnRvaGwoKmJwKyspOwotCXZpbmZvLT50eXBlX3ZpZHNbMV0gPSBudG9obCgqYnArKyk7Ci0JdmluZm8tPnR5cGVfdmlkc1syXSA9IG50b2hsKCpicCsrKTsKLQl2aW5mby0+dHlwZV92aWRzWzNdID0gbnRvaGwoKmJwKyspOwotCXZpbmZvLT50eXBlX3ZpZHNbNF0gPSBudG9obCgqYnArKyk7CisvKgorICogZGVjb2RlIGFuIEFGU0NhbGxCYWNrIGJsb2NrCisgKi8KK3N0YXRpYyB2b2lkIHhkcl9kZWNvZGVfQUZTQ2FsbEJhY2soY29uc3QgX19iZTMyICoqX2JwLCBzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSkKK3sKKwljb25zdCBfX2JlMzIgKmJwID0gKl9icDsKIAotCXZpbmZvLT5uc2VydmVycyA9IG50b2hsKCpicCsrKTsKLQl2aW5mby0+c2VydmVyc1swXS5hZGRyLnNfYWRkciA9ICpicCsrOwotCXZpbmZvLT5zZXJ2ZXJzWzFdLmFkZHIuc19hZGRyID0gKmJwKys7Ci0JdmluZm8tPnNlcnZlcnNbMl0uYWRkci5zX2FkZHIgPSAqYnArKzsKLQl2aW5mby0+c2VydmVyc1szXS5hZGRyLnNfYWRkciA9ICpicCsrOwotCXZpbmZvLT5zZXJ2ZXJzWzRdLmFkZHIuc19hZGRyID0gKmJwKys7Ci0JdmluZm8tPnNlcnZlcnNbNV0uYWRkci5zX2FkZHIgPSAqYnArKzsKLQl2aW5mby0+c2VydmVyc1s2XS5hZGRyLnNfYWRkciA9ICpicCsrOwotCXZpbmZvLT5zZXJ2ZXJzWzddLmFkZHIuc19hZGRyID0gKmJwKys7CisJdm5vZGUtPmNiX3ZlcnNpb24JPSBudG9obCgqYnArKyk7CisJdm5vZGUtPmNiX2V4cGlyeQk9IG50b2hsKCpicCsrKTsKKwl2bm9kZS0+Y2JfdHlwZQkJPSBudG9obCgqYnArKyk7CisJdm5vZGUtPmNiX2V4cGlyZXMJPSB2bm9kZS0+Y2JfZXhwaXJ5ICsgZ2V0X3NlY29uZHMoKTsKKwkqX2JwID0gYnA7Cit9CiAKLQlyZXQgPSAtRUJBRE1TRzsKLQlpZiAodmluZm8tPm5zZXJ2ZXJzID4gOCkKLQkJZ290byBhYm9ydDsKK3N0YXRpYyB2b2lkIHhkcl9kZWNvZGVfQUZTQ2FsbEJhY2tfcmF3KGNvbnN0IF9fYmUzMiAqKl9icCwKKwkJCQkgICAgICAgc3RydWN0IGFmc19jYWxsYmFjayAqY2IpCit7CisJY29uc3QgX19iZTMyICpicCA9ICpfYnA7CiAKLQkvKiBzdWNjZXNzICovCi0JcmV0ID0gMDsKKwljYi0+dmVyc2lvbgk9IG50b2hsKCpicCsrKTsKKwljYi0+ZXhwaXJ5CT0gbnRvaGwoKmJwKyspOworCWNiLT50eXBlCT0gbnRvaGwoKmJwKyspOworCSpfYnAgPSBicDsKK30KIAotIG91dF91bndhaXQ6Ci0Jc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKLQlyZW1vdmVfd2FpdF9xdWV1ZSgmY2FsbC0+d2FpdHEsICZteXNlbGYpOwotCXJ4cnBjX3B1dF9jYWxsKGNhbGwpOwotIG91dF9wdXRfY29ubjoKLQlhZnNfc2VydmVyX3JlbGVhc2VfZnNjb25uKHNlcnZlciwgY29ubik7Ci0gb3V0OgotCV9sZWF2ZSgiIik7Ci0JcmV0dXJuIHJldDsKKy8qCisgKiBkZWNvZGUgYW4gQUZTVm9sU3luYyBibG9jaworICovCitzdGF0aWMgdm9pZCB4ZHJfZGVjb2RlX0FGU1ZvbFN5bmMoY29uc3QgX19iZTMyICoqX2JwLAorCQkJCSAgc3RydWN0IGFmc192b2xzeW5jICp2b2xzeW5jKQoreworCWNvbnN0IF9fYmUzMiAqYnAgPSAqX2JwOwogCi0gYWJvcnQ6Ci0Jc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOwotCXJ4cnBjX2NhbGxfYWJvcnQoY2FsbCwgcmV0KTsKLQlzY2hlZHVsZSgpOwotCWdvdG8gb3V0X3Vud2FpdDsKKwl2b2xzeW5jLT5jcmVhdGlvbiA9IG50b2hsKCpicCsrKTsKKwlicCsrOyAvKiBzcGFyZTIgKi8KKwlicCsrOyAvKiBzcGFyZTMgKi8KKwlicCsrOyAvKiBzcGFyZTQgKi8KKwlicCsrOyAvKiBzcGFyZTUgKi8KKwlicCsrOyAvKiBzcGFyZTYgKi8KKwkqX2JwID0gYnA7Cit9CiAKLX0gLyogZW5kIGFmc19yeGZzX2dldF92b2x1bWVfaW5mbygpICovCi0jZW5kaWYKKy8qCisgKiBkZWxpdmVyIHJlcGx5IGRhdGEgdG8gYW4gRlMuRmV0Y2hTdGF0dXMKKyAqLworc3RhdGljIGludCBhZnNfZGVsaXZlcl9mc19mZXRjaF9zdGF0dXMoc3RydWN0IGFmc19jYWxsICpjYWxsLAorCQkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBib29sIGxhc3QpCit7CisJc3RydWN0IGFmc192bm9kZSAqdm5vZGUgPSBjYWxsLT5yZXBseTsKKwljb25zdCBfX2JlMzIgKmJwOwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJX2VudGVyKCIsLCV1IiwgbGFzdCk7CisKKwlhZnNfdHJhbnNmZXJfcmVwbHkoY2FsbCwgc2tiKTsKKwlpZiAoIWxhc3QpCisJCXJldHVybiAwOworCisJaWYgKGNhbGwtPnJlcGx5X3NpemUgIT0gY2FsbC0+cmVwbHlfbWF4KQorCQlyZXR1cm4gLUVCQURNU0c7CisKKwkvKiB1bm1hcnNoYWxsIHRoZSByZXBseSBvbmNlIHdlJ3ZlIHJlY2VpdmVkIGFsbCBvZiBpdCAqLworCWJwID0gY2FsbC0+YnVmZmVyOworCXhkcl9kZWNvZGVfQUZTRmV0Y2hTdGF0dXMoJmJwLCAmdm5vZGUtPnN0YXR1cywgdm5vZGUpOworCXhkcl9kZWNvZGVfQUZTQ2FsbEJhY2soJmJwLCB2bm9kZSk7CisJaWYgKGNhbGwtPnJlcGx5MikKKwkJeGRyX2RlY29kZV9BRlNWb2xTeW5jKCZicCwgY2FsbC0+cmVwbHkyKTsKKworCV9sZWF2ZSgiID0gMCBbZG9uZV0iKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZTLkZldGNoU3RhdHVzIG9wZXJhdGlvbiB0eXBlCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWZzX2NhbGxfdHlwZSBhZnNfUlhGU0ZldGNoU3RhdHVzID0geworCS5uYW1lCQk9ICJGUy5GZXRjaFN0YXR1cyIsCisJLmRlbGl2ZXIJPSBhZnNfZGVsaXZlcl9mc19mZXRjaF9zdGF0dXMsCisJLmFib3J0X3RvX2Vycm9yCT0gYWZzX2Fib3J0X3RvX2Vycm9yLAorCS5kZXN0cnVjdG9yCT0gYWZzX2ZsYXRfY2FsbF9kZXN0cnVjdG9yLAorfTsKKwogLyoKICAqIGZldGNoIHRoZSBzdGF0dXMgaW5mb3JtYXRpb24gZm9yIGEgZmlsZQogICovCi1pbnQgYWZzX3J4ZnNfZmV0Y2hfZmlsZV9zdGF0dXMoc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlciwKLQkJCSAgICAgICBzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSwKLQkJCSAgICAgICBzdHJ1Y3QgYWZzX3ZvbHN5bmMgKnZvbHN5bmMpCitpbnQgYWZzX2ZzX2ZldGNoX2ZpbGVfc3RhdHVzKHN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIsCisJCQkgICAgIHN0cnVjdCBrZXkgKmtleSwKKwkJCSAgICAgc3RydWN0IGFmc192bm9kZSAqdm5vZGUsCisJCQkgICAgIHN0cnVjdCBhZnNfdm9sc3luYyAqdm9sc3luYywKKwkJCSAgICAgY29uc3Qgc3RydWN0IGFmc193YWl0X21vZGUgKndhaXRfbW9kZSkKIHsKLQlzdHJ1Y3QgYWZzX3NlcnZlcl9jYWxsc2xvdCBjYWxsc2xvdDsKLQlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbDsKLQlzdHJ1Y3Qga3ZlYyBwaW92WzFdOwotCXNpemVfdCBzZW50OwotCWludCByZXQ7CisJc3RydWN0IGFmc19jYWxsICpjYWxsOwogCV9fYmUzMiAqYnA7CiAKLQlERUNMQVJFX1dBSVRRVUVVRShteXNlbGYsIGN1cnJlbnQpOworCV9lbnRlcigiLCV4LHsleDolZH0sLCIsCisJICAgICAgIGtleV9zZXJpYWwoa2V5KSwgdm5vZGUtPmZpZC52aWQsIHZub2RlLT5maWQudm5vZGUpOwogCi0JX2VudGVyKCIlcCx7JXUsJXUsJXV9IiwKLQkgICAgICAgc2VydmVyLCB2bm9kZS0+ZmlkLnZpZCwgdm5vZGUtPmZpZC52bm9kZSwgdm5vZGUtPmZpZC51bmlxdWUpOworCWNhbGwgPSBhZnNfYWxsb2NfZmxhdF9jYWxsKCZhZnNfUlhGU0ZldGNoU3RhdHVzLCAxNiwgKDIxICsgMyArIDYpICogNCk7CisJaWYgKCFjYWxsKQorCQlyZXR1cm4gLUVOT01FTTsKIAotCS8qIGdldCBob2xkIG9mIHRoZSBmaWxlc2VydmVyIGNvbm5lY3Rpb24gKi8KLQlyZXQgPSBhZnNfc2VydmVyX3JlcXVlc3RfY2FsbHNsb3Qoc2VydmVyLCAmY2FsbHNsb3QpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIG91dDsKLQotCS8qIGNyZWF0ZSBhIGNhbGwgdGhyb3VnaCB0aGF0IGNvbm5lY3Rpb24gKi8KLQlyZXQgPSByeHJwY19jcmVhdGVfY2FsbChjYWxsc2xvdC5jb25uLCBOVUxMLCBOVUxMLCBhZnNfcnhmc19hZW1hcCwKLQkJCQkmY2FsbCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJpbnRrKCJrQUZTOiBVbmFibGUgdG8gY3JlYXRlIGNhbGw6ICVkXG4iLCByZXQpOwotCQlnb3RvIG91dF9wdXRfY29ubjsKLQl9Ci0JY2FsbC0+YXBwX29wY29kZSA9IEZTRkVUQ0hTVEFUVVM7Ci0KLQkvKiB3ZSB3YW50IHRvIGdldCBldmVudCBub3RpZmljYXRpb25zIGZyb20gdGhlIGNhbGwgKi8KLQlhZGRfd2FpdF9xdWV1ZSgmY2FsbC0+d2FpdHEsICZteXNlbGYpOworCWNhbGwtPmtleSA9IGtleTsKKwljYWxsLT5yZXBseSA9IHZub2RlOworCWNhbGwtPnJlcGx5MiA9IHZvbHN5bmM7CisJY2FsbC0+c2VydmljZV9pZCA9IEZTX1NFUlZJQ0U7CisJY2FsbC0+cG9ydCA9IGh0b25zKEFGU19GU19QT1JUKTsKIAogCS8qIG1hcnNoYWxsIHRoZSBwYXJhbWV0ZXJzICovCi0JYnAgPSByeHJwY19jYWxsX2FsbG9jX3NjcmF0Y2goY2FsbCwgMTYpOworCWJwID0gY2FsbC0+cmVxdWVzdDsKIAlicFswXSA9IGh0b25sKEZTRkVUQ0hTVEFUVVMpOwogCWJwWzFdID0gaHRvbmwodm5vZGUtPmZpZC52aWQpOwogCWJwWzJdID0gaHRvbmwodm5vZGUtPmZpZC52bm9kZSk7CiAJYnBbM10gPSBodG9ubCh2bm9kZS0+ZmlkLnVuaXF1ZSk7CiAKLQlwaW92WzBdLmlvdl9sZW4gPSAxNjsKLQlwaW92WzBdLmlvdl9iYXNlID0gYnA7CisJcmV0dXJuIGFmc19tYWtlX2NhbGwoJnNlcnZlci0+YWRkciwgY2FsbCwgR0ZQX05PRlMsIHdhaXRfbW9kZSk7Cit9CiAKLQkvKiBzZW5kIHRoZSBwYXJhbWV0ZXJzIHRvIHRoZSBzZXJ2ZXIgKi8KLQlyZXQgPSByeHJwY19jYWxsX3dyaXRlX2RhdGEoY2FsbCwgMSwgcGlvdiwgUlhSUENfTEFTVF9QQUNLRVQsIEdGUF9OT0ZTLAotCQkJCSAgICAwLCAmc2VudCk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gYWJvcnQ7CisvKgorICogZGVsaXZlciByZXBseSBkYXRhIHRvIGFuIEZTLkZldGNoRGF0YQorICovCitzdGF0aWMgaW50IGFmc19kZWxpdmVyX2ZzX2ZldGNoX2RhdGEoc3RydWN0IGFmc19jYWxsICpjYWxsLAorCQkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgYm9vbCBsYXN0KQoreworCXN0cnVjdCBhZnNfdm5vZGUgKnZub2RlID0gY2FsbC0+cmVwbHk7CisJY29uc3QgX19iZTMyICpicDsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwl2b2lkICpidWZmZXI7CisJaW50IHJldDsKIAotCS8qIHdhaXQgZm9yIHRoZSByZXBseSB0byBjb21wbGV0ZWx5IGFycml2ZSAqLwotCWJwID0gcnhycGNfY2FsbF9hbGxvY19zY3JhdGNoKGNhbGwsIDEyMCk7CisJX2VudGVyKCJ7JXV9LHsldX0sJWQiLCBjYWxsLT51bm1hcnNoYWxsLCBza2ItPmxlbiwgbGFzdCk7CiAKLQlyZXQgPSByeHJwY19jYWxsX3JlYWRfZGF0YShjYWxsLCBicCwgMTIwLAotCQkJCSAgIFJYUlBDX0NBTExfUkVBRF9CTE9DSyB8Ci0JCQkJICAgUlhSUENfQ0FMTF9SRUFEX0FMTCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJaWYgKHJldCA9PSAtRUNPTk5BQk9SVEVEKSB7Ci0JCQlyZXQgPSBjYWxsLT5hcHBfZXJybm87Ci0JCQlnb3RvIG91dF91bndhaXQ7CisJc3dpdGNoIChjYWxsLT51bm1hcnNoYWxsKSB7CisJY2FzZSAwOgorCQljYWxsLT5vZmZzZXQgPSAwOworCQljYWxsLT51bm1hcnNoYWxsKys7CisKKwkJLyogZXh0cmFjdCB0aGUgcmV0dXJuZWQgZGF0YSBsZW5ndGggKi8KKwljYXNlIDE6CisJCV9kZWJ1ZygiZXh0cmFjdCBkYXRhIGxlbmd0aCIpOworCQlyZXQgPSBhZnNfZXh0cmFjdF9kYXRhKGNhbGwsIHNrYiwgbGFzdCwgJmNhbGwtPnRtcCwgNCk7CisJCXN3aXRjaCAocmV0KSB7CisJCWNhc2UgMDoJCWJyZWFrOworCQljYXNlIC1FQUdBSU46CXJldHVybiAwOworCQlkZWZhdWx0OglyZXR1cm4gcmV0OwogCQl9Ci0JCWdvdG8gYWJvcnQ7CisKKwkJY2FsbC0+Y291bnQgPSBudG9obChjYWxsLT50bXApOworCQlfZGVidWcoIkRBVEEgbGVuZ3RoOiAldSIsIGNhbGwtPmNvdW50KTsKKwkJaWYgKGNhbGwtPmNvdW50ID4gUEFHRV9TSVpFKQorCQkJcmV0dXJuIC1FQkFETVNHOworCQljYWxsLT5vZmZzZXQgPSAwOworCQljYWxsLT51bm1hcnNoYWxsKys7CisKKwkJaWYgKGNhbGwtPmNvdW50IDwgUEFHRV9TSVpFKSB7CisJCQlidWZmZXIgPSBrbWFwX2F0b21pYyhjYWxsLT5yZXBseTMsIEtNX1VTRVIwKTsKKwkJCW1lbXNldChidWZmZXIgKyBQQUdFX1NJWkUgLSBjYWxsLT5jb3VudCwgMCwKKwkJCSAgICAgICBjYWxsLT5jb3VudCk7CisJCQlrdW5tYXBfYXRvbWljKGJ1ZmZlciwgS01fVVNFUjApOworCQl9CisKKwkJLyogZXh0cmFjdCB0aGUgcmV0dXJuZWQgZGF0YSAqLworCWNhc2UgMjoKKwkJX2RlYnVnKCJleHRyYWN0IGRhdGEiKTsKKwkJcGFnZSA9IGNhbGwtPnJlcGx5MzsKKwkJYnVmZmVyID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOworCQlyZXQgPSBhZnNfZXh0cmFjdF9kYXRhKGNhbGwsIHNrYiwgbGFzdCwgYnVmZmVyLCBjYWxsLT5jb3VudCk7CisJCWt1bm1hcF9hdG9taWMoYnVmZmVyLCBLTV9VU0VSMCk7CisJCXN3aXRjaCAocmV0KSB7CisJCWNhc2UgMDoJCWJyZWFrOworCQljYXNlIC1FQUdBSU46CXJldHVybiAwOworCQlkZWZhdWx0OglyZXR1cm4gcmV0OworCQl9CisKKwkJY2FsbC0+b2Zmc2V0ID0gMDsKKwkJY2FsbC0+dW5tYXJzaGFsbCsrOworCisJCS8qIGV4dHJhY3QgdGhlIG1ldGFkYXRhICovCisJY2FzZSAzOgorCQlyZXQgPSBhZnNfZXh0cmFjdF9kYXRhKGNhbGwsIHNrYiwgbGFzdCwgY2FsbC0+YnVmZmVyLAorCQkJCSAgICAgICAoMjEgKyAzICsgNikgKiA0KTsKKwkJc3dpdGNoIChyZXQpIHsKKwkJY2FzZSAwOgkJYnJlYWs7CisJCWNhc2UgLUVBR0FJTjoJcmV0dXJuIDA7CisJCWRlZmF1bHQ6CXJldHVybiByZXQ7CisJCX0KKworCQlicCA9IGNhbGwtPmJ1ZmZlcjsKKwkJeGRyX2RlY29kZV9BRlNGZXRjaFN0YXR1cygmYnAsICZ2bm9kZS0+c3RhdHVzLCB2bm9kZSk7CisJCXhkcl9kZWNvZGVfQUZTQ2FsbEJhY2soJmJwLCB2bm9kZSk7CisJCWlmIChjYWxsLT5yZXBseTIpCisJCQl4ZHJfZGVjb2RlX0FGU1ZvbFN5bmMoJmJwLCBjYWxsLT5yZXBseTIpOworCisJCWNhbGwtPm9mZnNldCA9IDA7CisJCWNhbGwtPnVubWFyc2hhbGwrKzsKKworCWNhc2UgNDoKKwkJX2RlYnVnKCJ0cmFpbGVyIik7CisJCWlmIChza2ItPmxlbiAhPSAwKQorCQkJcmV0dXJuIC1FQkFETVNHOworCQlicmVhazsKIAl9CiAKLQkvKiB1bm1hcnNoYWxsIHRoZSByZXBseSAqLwotCXZub2RlLT5zdGF0dXMuaWZfdmVyc2lvbgk9IG50b2hsKCpicCsrKTsKLQl2bm9kZS0+c3RhdHVzLnR5cGUJCT0gbnRvaGwoKmJwKyspOwotCXZub2RlLT5zdGF0dXMubmxpbmsJCT0gbnRvaGwoKmJwKyspOwotCXZub2RlLT5zdGF0dXMuc2l6ZQkJPSBudG9obCgqYnArKyk7Ci0Jdm5vZGUtPnN0YXR1cy52ZXJzaW9uCQk9IG50b2hsKCpicCsrKTsKLQl2bm9kZS0+c3RhdHVzLmF1dGhvcgkJPSBudG9obCgqYnArKyk7Ci0Jdm5vZGUtPnN0YXR1cy5vd25lcgkJPSBudG9obCgqYnArKyk7Ci0Jdm5vZGUtPnN0YXR1cy5jYWxsZXJfYWNjZXNzCT0gbnRvaGwoKmJwKyspOwotCXZub2RlLT5zdGF0dXMuYW5vbl9hY2Nlc3MJPSBudG9obCgqYnArKyk7Ci0Jdm5vZGUtPnN0YXR1cy5tb2RlCQk9IG50b2hsKCpicCsrKTsKLQl2bm9kZS0+c3RhdHVzLnBhcmVudC52aWQJPSB2bm9kZS0+ZmlkLnZpZDsKLQl2bm9kZS0+c3RhdHVzLnBhcmVudC52bm9kZQk9IG50b2hsKCpicCsrKTsKLQl2bm9kZS0+c3RhdHVzLnBhcmVudC51bmlxdWUJPSBudG9obCgqYnArKyk7Ci0JYnArKzsgLyogc2VnIHNpemUgKi8KLQl2bm9kZS0+c3RhdHVzLm10aW1lX2NsaWVudAk9IG50b2hsKCpicCsrKTsKLQl2bm9kZS0+c3RhdHVzLm10aW1lX3NlcnZlcgk9IG50b2hsKCpicCsrKTsKLQlicCsrOyAvKiBncm91cCAqLwotCWJwKys7IC8qIHN5bmMgY291bnRlciAqLwotCXZub2RlLT5zdGF0dXMudmVyc2lvbiB8PSAoKHVuc2lnbmVkIGxvbmcgbG9uZykgbnRvaGwoKmJwKyspKSA8PCAzMjsKLQlicCsrOyAvKiBzcGFyZTIgKi8KLQlicCsrOyAvKiBzcGFyZTMgKi8KLQlicCsrOyAvKiBzcGFyZTQgKi8KKwlpZiAoIWxhc3QpCisJCXJldHVybiAwOwogCi0Jdm5vZGUtPmNiX3ZlcnNpb24JCT0gbnRvaGwoKmJwKyspOwotCXZub2RlLT5jYl9leHBpcnkJCT0gbnRvaGwoKmJwKyspOwotCXZub2RlLT5jYl90eXBlCQkJPSBudG9obCgqYnArKyk7CisJX2xlYXZlKCIgPSAwIFtkb25lXSIpOworCXJldHVybiAwOworfQogCi0JaWYgKHZvbHN5bmMpIHsKLQkJdm9sc3luYy0+Y3JlYXRpb24JPSBudG9obCgqYnArKyk7Ci0JCWJwKys7IC8qIHNwYXJlMiAqLwotCQlicCsrOyAvKiBzcGFyZTMgKi8KLQkJYnArKzsgLyogc3BhcmU0ICovCi0JCWJwKys7IC8qIHNwYXJlNSAqLwotCQlicCsrOyAvKiBzcGFyZTYgKi8KLQl9Ci0KLQkvKiBzdWNjZXNzICovCi0JcmV0ID0gMDsKLQotIG91dF91bndhaXQ6Ci0Jc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKLQlyZW1vdmVfd2FpdF9xdWV1ZSgmY2FsbC0+d2FpdHEsICZteXNlbGYpOwotCXJ4cnBjX3B1dF9jYWxsKGNhbGwpOwotIG91dF9wdXRfY29ubjoKLQlhZnNfc2VydmVyX3JlbGVhc2VfY2FsbHNsb3Qoc2VydmVyLCAmY2FsbHNsb3QpOwotIG91dDoKLQlfbGVhdmUoIiIpOwotCXJldHVybiByZXQ7Ci0KLSBhYm9ydDoKLQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7Ci0JcnhycGNfY2FsbF9hYm9ydChjYWxsLCByZXQpOwotCXNjaGVkdWxlKCk7Ci0JZ290byBvdXRfdW53YWl0OwotfSAvKiBlbmQgYWZzX3J4ZnNfZmV0Y2hfZmlsZV9zdGF0dXMoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgotICogZmV0Y2ggdGhlIGNvbnRlbnRzIG9mIGEgZmlsZSBvciBkaXJlY3RvcnkKKyAqIEZTLkZldGNoRGF0YSBvcGVyYXRpb24gdHlwZQogICovCi1pbnQgYWZzX3J4ZnNfZmV0Y2hfZmlsZV9kYXRhKHN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIsCi0JCQkgICAgIHN0cnVjdCBhZnNfdm5vZGUgKnZub2RlLAotCQkJICAgICBzdHJ1Y3QgYWZzX3J4ZnNfZmV0Y2hfZGVzY3JpcHRvciAqZGVzYywKLQkJCSAgICAgc3RydWN0IGFmc192b2xzeW5jICp2b2xzeW5jKQorc3RhdGljIGNvbnN0IHN0cnVjdCBhZnNfY2FsbF90eXBlIGFmc19SWEZTRmV0Y2hEYXRhID0geworCS5uYW1lCQk9ICJGUy5GZXRjaERhdGEiLAorCS5kZWxpdmVyCT0gYWZzX2RlbGl2ZXJfZnNfZmV0Y2hfZGF0YSwKKwkuYWJvcnRfdG9fZXJyb3IJPSBhZnNfYWJvcnRfdG9fZXJyb3IsCisJLmRlc3RydWN0b3IJPSBhZnNfZmxhdF9jYWxsX2Rlc3RydWN0b3IsCit9OworCisvKgorICogZmV0Y2ggZGF0YSBmcm9tIGEgZmlsZQorICovCitpbnQgYWZzX2ZzX2ZldGNoX2RhdGEoc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlciwKKwkJICAgICAgc3RydWN0IGtleSAqa2V5LAorCQkgICAgICBzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSwKKwkJICAgICAgb2ZmX3Qgb2Zmc2V0LCBzaXplX3QgbGVuZ3RoLAorCQkgICAgICBzdHJ1Y3QgcGFnZSAqYnVmZmVyLAorCQkgICAgICBjb25zdCBzdHJ1Y3QgYWZzX3dhaXRfbW9kZSAqd2FpdF9tb2RlKQogewotCXN0cnVjdCBhZnNfc2VydmVyX2NhbGxzbG90IGNhbGxzbG90OwotCXN0cnVjdCByeHJwY19jYWxsICpjYWxsOwotCXN0cnVjdCBrdmVjIHBpb3ZbMV07Ci0Jc2l6ZV90IHNlbnQ7Ci0JaW50IHJldDsKKwlzdHJ1Y3QgYWZzX2NhbGwgKmNhbGw7CiAJX19iZTMyICpicDsKIAotCURFQ0xBUkVfV0FJVFFVRVVFKG15c2VsZiwgY3VycmVudCk7CisJX2VudGVyKCIiKTsKIAotCV9lbnRlcigiJXAse2ZpZD17JXUsJXUsJXV9LHN6PSVadSxvZj0lbHV9IiwKLQkgICAgICAgc2VydmVyLAotCSAgICAgICBkZXNjLT5maWQudmlkLAotCSAgICAgICBkZXNjLT5maWQudm5vZGUsCi0JICAgICAgIGRlc2MtPmZpZC51bmlxdWUsCi0JICAgICAgIGRlc2MtPnNpemUsCi0JICAgICAgIGRlc2MtPm9mZnNldCk7CisJY2FsbCA9IGFmc19hbGxvY19mbGF0X2NhbGwoJmFmc19SWEZTRmV0Y2hEYXRhLCAyNCwgKDIxICsgMyArIDYpICogNCk7CisJaWYgKCFjYWxsKQorCQlyZXR1cm4gLUVOT01FTTsKIAotCS8qIGdldCBob2xkIG9mIHRoZSBmaWxlc2VydmVyIGNvbm5lY3Rpb24gKi8KLQlyZXQgPSBhZnNfc2VydmVyX3JlcXVlc3RfY2FsbHNsb3Qoc2VydmVyLCAmY2FsbHNsb3QpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIG91dDsKLQotCS8qIGNyZWF0ZSBhIGNhbGwgdGhyb3VnaCB0aGF0IGNvbm5lY3Rpb24gKi8KLQlyZXQgPSByeHJwY19jcmVhdGVfY2FsbChjYWxsc2xvdC5jb25uLCBOVUxMLCBOVUxMLCBhZnNfcnhmc19hZW1hcCwgJmNhbGwpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50aygia0FGUzogVW5hYmxlIHRvIGNyZWF0ZSBjYWxsOiAlZFxuIiwgcmV0KTsKLQkJZ290byBvdXRfcHV0X2Nvbm47Ci0JfQotCWNhbGwtPmFwcF9vcGNvZGUgPSBGU0ZFVENIREFUQTsKLQotCS8qIHdlIHdhbnQgdG8gZ2V0IGV2ZW50IG5vdGlmaWNhdGlvbnMgZnJvbSB0aGUgY2FsbCAqLwotCWFkZF93YWl0X3F1ZXVlKCZjYWxsLT53YWl0cSwgJm15c2VsZik7CisJY2FsbC0+a2V5ID0ga2V5OworCWNhbGwtPnJlcGx5ID0gdm5vZGU7CisJY2FsbC0+cmVwbHkyID0gTlVMTDsgLyogdm9sc3luYyAqLworCWNhbGwtPnJlcGx5MyA9IGJ1ZmZlcjsKKwljYWxsLT5zZXJ2aWNlX2lkID0gRlNfU0VSVklDRTsKKwljYWxsLT5wb3J0ID0gaHRvbnMoQUZTX0ZTX1BPUlQpOwogCiAJLyogbWFyc2hhbGwgdGhlIHBhcmFtZXRlcnMgKi8KLQlicCA9IHJ4cnBjX2NhbGxfYWxsb2Nfc2NyYXRjaChjYWxsLCAyNCk7CisJYnAgPSBjYWxsLT5yZXF1ZXN0OwogCWJwWzBdID0gaHRvbmwoRlNGRVRDSERBVEEpOwotCWJwWzFdID0gaHRvbmwoZGVzYy0+ZmlkLnZpZCk7Ci0JYnBbMl0gPSBodG9ubChkZXNjLT5maWQudm5vZGUpOwotCWJwWzNdID0gaHRvbmwoZGVzYy0+ZmlkLnVuaXF1ZSk7Ci0JYnBbNF0gPSBodG9ubChkZXNjLT5vZmZzZXQpOwotCWJwWzVdID0gaHRvbmwoZGVzYy0+c2l6ZSk7CisJYnBbMV0gPSBodG9ubCh2bm9kZS0+ZmlkLnZpZCk7CisJYnBbMl0gPSBodG9ubCh2bm9kZS0+ZmlkLnZub2RlKTsKKwlicFszXSA9IGh0b25sKHZub2RlLT5maWQudW5pcXVlKTsKKwlicFs0XSA9IGh0b25sKG9mZnNldCk7CisJYnBbNV0gPSBodG9ubChsZW5ndGgpOwogCi0JcGlvdlswXS5pb3ZfbGVuID0gMjQ7Ci0JcGlvdlswXS5pb3ZfYmFzZSA9IGJwOworCXJldHVybiBhZnNfbWFrZV9jYWxsKCZzZXJ2ZXItPmFkZHIsIGNhbGwsIEdGUF9OT0ZTLCB3YWl0X21vZGUpOworfQogCi0JLyogc2VuZCB0aGUgcGFyYW1ldGVycyB0byB0aGUgc2VydmVyICovCi0JcmV0ID0gcnhycGNfY2FsbF93cml0ZV9kYXRhKGNhbGwsIDEsIHBpb3YsIFJYUlBDX0xBU1RfUEFDS0VULCBHRlBfTk9GUywKLQkJCQkgICAgMCwgJnNlbnQpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIGFib3J0OwotCi0JLyogd2FpdCBmb3IgdGhlIGRhdGEgY291bnQgdG8gYXJyaXZlICovCi0JcmV0ID0gcnhycGNfY2FsbF9yZWFkX2RhdGEoY2FsbCwgYnAsIDQsIFJYUlBDX0NBTExfUkVBRF9CTE9DSyk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gcmVhZF9mYWlsZWQ7Ci0KLQlkZXNjLT5hY3R1YWwgPSBudG9obChicFswXSk7Ci0JaWYgKGRlc2MtPmFjdHVhbCAhPSBkZXNjLT5zaXplKSB7Ci0JCXJldCA9IC1FQkFETVNHOwotCQlnb3RvIGFib3J0OwotCX0KLQotCS8qIGNhbGwgdGhlIGFwcCB0byByZWFkIHRoZSBhY3R1YWwgZGF0YSAqLwotCXJ4cnBjX2NhbGxfcmVzZXRfc2NyYXRjaChjYWxsKTsKLQotCXJldCA9IHJ4cnBjX2NhbGxfcmVhZF9kYXRhKGNhbGwsIGRlc2MtPmJ1ZmZlciwgZGVzYy0+YWN0dWFsLAotCQkJCSAgIFJYUlBDX0NBTExfUkVBRF9CTE9DSyk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gcmVhZF9mYWlsZWQ7Ci0KLQkvKiB3YWl0IGZvciB0aGUgcmVzdCBvZiB0aGUgcmVwbHkgdG8gY29tcGxldGVseSBhcnJpdmUgKi8KLQlyeHJwY19jYWxsX3Jlc2V0X3NjcmF0Y2goY2FsbCk7Ci0JYnAgPSByeHJwY19jYWxsX2FsbG9jX3NjcmF0Y2goY2FsbCwgMTIwKTsKLQotCXJldCA9IHJ4cnBjX2NhbGxfcmVhZF9kYXRhKGNhbGwsIGJwLCAxMjAsCi0JCQkJICAgUlhSUENfQ0FMTF9SRUFEX0JMT0NLIHwKLQkJCQkgICBSWFJQQ19DQUxMX1JFQURfQUxMKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byByZWFkX2ZhaWxlZDsKLQotCS8qIHVubWFyc2hhbGwgdGhlIHJlcGx5ICovCi0Jdm5vZGUtPnN0YXR1cy5pZl92ZXJzaW9uCT0gbnRvaGwoKmJwKyspOwotCXZub2RlLT5zdGF0dXMudHlwZQkJPSBudG9obCgqYnArKyk7Ci0Jdm5vZGUtPnN0YXR1cy5ubGluawkJPSBudG9obCgqYnArKyk7Ci0Jdm5vZGUtPnN0YXR1cy5zaXplCQk9IG50b2hsKCpicCsrKTsKLQl2bm9kZS0+c3RhdHVzLnZlcnNpb24JCT0gbnRvaGwoKmJwKyspOwotCXZub2RlLT5zdGF0dXMuYXV0aG9yCQk9IG50b2hsKCpicCsrKTsKLQl2bm9kZS0+c3RhdHVzLm93bmVyCQk9IG50b2hsKCpicCsrKTsKLQl2bm9kZS0+c3RhdHVzLmNhbGxlcl9hY2Nlc3MJPSBudG9obCgqYnArKyk7Ci0Jdm5vZGUtPnN0YXR1cy5hbm9uX2FjY2Vzcwk9IG50b2hsKCpicCsrKTsKLQl2bm9kZS0+c3RhdHVzLm1vZGUJCT0gbnRvaGwoKmJwKyspOwotCXZub2RlLT5zdGF0dXMucGFyZW50LnZpZAk9IGRlc2MtPmZpZC52aWQ7Ci0Jdm5vZGUtPnN0YXR1cy5wYXJlbnQudm5vZGUJPSBudG9obCgqYnArKyk7Ci0Jdm5vZGUtPnN0YXR1cy5wYXJlbnQudW5pcXVlCT0gbnRvaGwoKmJwKyspOwotCWJwKys7IC8qIHNlZyBzaXplICovCi0Jdm5vZGUtPnN0YXR1cy5tdGltZV9jbGllbnQJPSBudG9obCgqYnArKyk7Ci0Jdm5vZGUtPnN0YXR1cy5tdGltZV9zZXJ2ZXIJPSBudG9obCgqYnArKyk7Ci0JYnArKzsgLyogZ3JvdXAgKi8KLQlicCsrOyAvKiBzeW5jIGNvdW50ZXIgKi8KLQl2bm9kZS0+c3RhdHVzLnZlcnNpb24gfD0gKCh1bnNpZ25lZCBsb25nIGxvbmcpIG50b2hsKCpicCsrKSkgPDwgMzI7Ci0JYnArKzsgLyogc3BhcmUyICovCi0JYnArKzsgLyogc3BhcmUzICovCi0JYnArKzsgLyogc3BhcmU0ICovCi0KLQl2bm9kZS0+Y2JfdmVyc2lvbgkJPSBudG9obCgqYnArKyk7Ci0Jdm5vZGUtPmNiX2V4cGlyeQkJPSBudG9obCgqYnArKyk7Ci0Jdm5vZGUtPmNiX3R5cGUJCQk9IG50b2hsKCpicCsrKTsKLQotCWlmICh2b2xzeW5jKSB7Ci0JCXZvbHN5bmMtPmNyZWF0aW9uCT0gbnRvaGwoKmJwKyspOwotCQlicCsrOyAvKiBzcGFyZTIgKi8KLQkJYnArKzsgLyogc3BhcmUzICovCi0JCWJwKys7IC8qIHNwYXJlNCAqLwotCQlicCsrOyAvKiBzcGFyZTUgKi8KLQkJYnArKzsgLyogc3BhcmU2ICovCi0JfQotCi0JLyogc3VjY2VzcyAqLwotCXJldCA9IDA7Ci0KLSBvdXRfdW53YWl0OgotCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7Ci0JcmVtb3ZlX3dhaXRfcXVldWUoJmNhbGwtPndhaXRxLCZteXNlbGYpOwotCXJ4cnBjX3B1dF9jYWxsKGNhbGwpOwotIG91dF9wdXRfY29ubjoKLQlhZnNfc2VydmVyX3JlbGVhc2VfY2FsbHNsb3Qoc2VydmVyLCAmY2FsbHNsb3QpOwotIG91dDoKLQlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKLQlyZXR1cm4gcmV0OwotCi0gcmVhZF9mYWlsZWQ6Ci0JaWYgKHJldCA9PSAtRUNPTk5BQk9SVEVEKSB7Ci0JCXJldCA9IGNhbGwtPmFwcF9lcnJubzsKLQkJZ290byBvdXRfdW53YWl0OwotCX0KLQotIGFib3J0OgotCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKLQlyeHJwY19jYWxsX2Fib3J0KGNhbGwsIHJldCk7Ci0Jc2NoZWR1bGUoKTsKLQlnb3RvIG91dF91bndhaXQ7Ci0KLX0gLyogZW5kIGFmc19yeGZzX2ZldGNoX2ZpbGVfZGF0YSgpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCi0gKiBhc2sgdGhlIEFGUyBmaWxlc2VydmVyIHRvIGRpc2NhcmQgYSBjYWxsYmFjayByZXF1ZXN0IG9uIGEgZmlsZQorICogZGVsaXZlciByZXBseSBkYXRhIHRvIGFuIEZTLkdpdmVVcENhbGxCYWNrcwogICovCi1pbnQgYWZzX3J4ZnNfZ2l2ZV91cF9jYWxsYmFjayhzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyLAotCQkJICAgICAgc3RydWN0IGFmc192bm9kZSAqdm5vZGUpCitzdGF0aWMgaW50IGFmc19kZWxpdmVyX2ZzX2dpdmVfdXBfY2FsbGJhY2tzKHN0cnVjdCBhZnNfY2FsbCAqY2FsbCwKKwkJCQkJICAgIHN0cnVjdCBza19idWZmICpza2IsIGJvb2wgbGFzdCkKIHsKLQlzdHJ1Y3QgYWZzX3NlcnZlcl9jYWxsc2xvdCBjYWxsc2xvdDsKLQlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbDsKLQlzdHJ1Y3Qga3ZlYyBwaW92WzFdOwotCXNpemVfdCBzZW50OwotCWludCByZXQ7Ci0JX19iZTMyICpicDsKKwlfZW50ZXIoIix7JXV9LCVkIiwgc2tiLT5sZW4sIGxhc3QpOwogCi0JREVDTEFSRV9XQUlUUVVFVUUobXlzZWxmLCBjdXJyZW50KTsKKwlpZiAoc2tiLT5sZW4gPiAwKQorCQlyZXR1cm4gLUVCQURNU0c7IC8qIHNob3VsZG4ndCBiZSBhbnkgcmVwbHkgZGF0YSAqLworCXJldHVybiAwOworfQogCi0JX2VudGVyKCIlcCx7JXUsJXUsJXV9IiwKLQkgICAgICAgc2VydmVyLCB2bm9kZS0+ZmlkLnZpZCwgdm5vZGUtPmZpZC52bm9kZSwgdm5vZGUtPmZpZC51bmlxdWUpOworLyoKKyAqIEZTLkdpdmVVcENhbGxCYWNrcyBvcGVyYXRpb24gdHlwZQorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGFmc19jYWxsX3R5cGUgYWZzX1JYRlNHaXZlVXBDYWxsQmFja3MgPSB7CisJLm5hbWUJCT0gIkZTLkdpdmVVcENhbGxCYWNrcyIsCisJLmRlbGl2ZXIJPSBhZnNfZGVsaXZlcl9mc19naXZlX3VwX2NhbGxiYWNrcywKKwkuYWJvcnRfdG9fZXJyb3IJPSBhZnNfYWJvcnRfdG9fZXJyb3IsCisJLmRlc3RydWN0b3IJPSBhZnNfZmxhdF9jYWxsX2Rlc3RydWN0b3IsCit9OwogCi0JLyogZ2V0IGhvbGQgb2YgdGhlIGZpbGVzZXJ2ZXIgY29ubmVjdGlvbiAqLwotCXJldCA9IGFmc19zZXJ2ZXJfcmVxdWVzdF9jYWxsc2xvdChzZXJ2ZXIsICZjYWxsc2xvdCk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gb3V0OworLyoKKyAqIGdpdmUgdXAgYSBzZXQgb2YgY2FsbGJhY2tzCisgKiAtIHRoZSBjYWxsYmFja3MgYXJlIGhlbGQgaW4gdGhlIHNlcnZlci0+Y2JfYnJlYWsgcmluZworICovCitpbnQgYWZzX2ZzX2dpdmVfdXBfY2FsbGJhY2tzKHN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIsCisJCQkgICAgIGNvbnN0IHN0cnVjdCBhZnNfd2FpdF9tb2RlICp3YWl0X21vZGUpCit7CisJc3RydWN0IGFmc19jYWxsICpjYWxsOworCXNpemVfdCBuY2FsbGJhY2tzOworCV9fYmUzMiAqYnAsICp0cDsKKwlpbnQgbG9vcDsKIAotCS8qIGNyZWF0ZSBhIGNhbGwgdGhyb3VnaCB0aGF0IGNvbm5lY3Rpb24gKi8KLQlyZXQgPSByeHJwY19jcmVhdGVfY2FsbChjYWxsc2xvdC5jb25uLCBOVUxMLCBOVUxMLCBhZnNfcnhmc19hZW1hcCwgJmNhbGwpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50aygia0FGUzogVW5hYmxlIHRvIGNyZWF0ZSBjYWxsOiAlZFxuIiwgcmV0KTsKLQkJZ290byBvdXRfcHV0X2Nvbm47Ci0JfQotCWNhbGwtPmFwcF9vcGNvZGUgPSBGU0dJVkVVUENBTExCQUNLUzsKKwluY2FsbGJhY2tzID0gQ0lSQ19DTlQoc2VydmVyLT5jYl9icmVha19oZWFkLCBzZXJ2ZXItPmNiX2JyZWFrX3RhaWwsCisJCQkgICAgICBBUlJBWV9TSVpFKHNlcnZlci0+Y2JfYnJlYWspKTsKIAotCS8qIHdlIHdhbnQgdG8gZ2V0IGV2ZW50IG5vdGlmaWNhdGlvbnMgZnJvbSB0aGUgY2FsbCAqLwotCWFkZF93YWl0X3F1ZXVlKCZjYWxsLT53YWl0cSwgJm15c2VsZik7CisJX2VudGVyKCJ7JXp1fSwiLCBuY2FsbGJhY2tzKTsKKworCWlmIChuY2FsbGJhY2tzID09IDApCisJCXJldHVybiAwOworCWlmIChuY2FsbGJhY2tzID4gQUZTQ0JNQVgpCisJCW5jYWxsYmFja3MgPSBBRlNDQk1BWDsKKworCV9kZWJ1ZygiYnJlYWsgJXp1IGNhbGxiYWNrcyIsIG5jYWxsYmFja3MpOworCisJY2FsbCA9IGFmc19hbGxvY19mbGF0X2NhbGwoJmFmc19SWEZTR2l2ZVVwQ2FsbEJhY2tzLAorCQkJCSAgIDEyICsgbmNhbGxiYWNrcyAqIDYgKiA0LCAwKTsKKwlpZiAoIWNhbGwpCisJCXJldHVybiAtRU5PTUVNOworCisJY2FsbC0+c2VydmljZV9pZCA9IEZTX1NFUlZJQ0U7CisJY2FsbC0+cG9ydCA9IGh0b25zKEFGU19GU19QT1JUKTsKIAogCS8qIG1hcnNoYWxsIHRoZSBwYXJhbWV0ZXJzICovCi0JYnAgPSByeHJwY19jYWxsX2FsbG9jX3NjcmF0Y2goY2FsbCwgKDEgKyA0ICsgNCkgKiA0KTsKLQotCXBpb3ZbMF0uaW92X2xlbiA9ICgxICsgNCArIDQpICogNDsKLQlwaW92WzBdLmlvdl9iYXNlID0gYnA7Ci0KKwlicCA9IGNhbGwtPnJlcXVlc3Q7CisJdHAgPSBicCArIDIgKyBuY2FsbGJhY2tzICogMzsKIAkqYnArKyA9IGh0b25sKEZTR0lWRVVQQ0FMTEJBQ0tTKTsKLQkqYnArKyA9IGh0b25sKDEpOworCSpicCsrID0gaHRvbmwobmNhbGxiYWNrcyk7CisJKnRwKysgPSBodG9ubChuY2FsbGJhY2tzKTsKKworCWF0b21pY19zdWIobmNhbGxiYWNrcywgJnNlcnZlci0+Y2JfYnJlYWtfbik7CisJZm9yIChsb29wID0gbmNhbGxiYWNrczsgbG9vcCA+IDA7IGxvb3AtLSkgeworCQlzdHJ1Y3QgYWZzX2NhbGxiYWNrICpjYiA9CisJCQkmc2VydmVyLT5jYl9icmVha1tzZXJ2ZXItPmNiX2JyZWFrX3RhaWxdOworCisJCSpicCsrID0gaHRvbmwoY2ItPmZpZC52aWQpOworCQkqYnArKyA9IGh0b25sKGNiLT5maWQudm5vZGUpOworCQkqYnArKyA9IGh0b25sKGNiLT5maWQudW5pcXVlKTsKKwkJKnRwKysgPSBodG9ubChjYi0+dmVyc2lvbik7CisJCSp0cCsrID0gaHRvbmwoY2ItPmV4cGlyeSk7CisJCSp0cCsrID0gaHRvbmwoY2ItPnR5cGUpOworCQlzbXBfbWIoKTsKKwkJc2VydmVyLT5jYl9icmVha190YWlsID0KKwkJCShzZXJ2ZXItPmNiX2JyZWFrX3RhaWwgKyAxKSAmCisJCQkoQVJSQVlfU0laRShzZXJ2ZXItPmNiX2JyZWFrKSAtIDEpOworCX0KKworCUFTU0VSVChuY2FsbGJhY2tzID4gMCk7CisJd2FrZV91cF9ucigmc2VydmVyLT5jYl9icmVha193YWl0cSwgbmNhbGxiYWNrcyk7CisKKwlyZXR1cm4gYWZzX21ha2VfY2FsbCgmc2VydmVyLT5hZGRyLCBjYWxsLCBHRlBfTk9GUywgd2FpdF9tb2RlKTsKK30KKworLyoKKyAqIGRlbGl2ZXIgcmVwbHkgZGF0YSB0byBhbiBGUy5DcmVhdGVGaWxlIG9yIGFuIEZTLk1ha2VEaXIKKyAqLworc3RhdGljIGludCBhZnNfZGVsaXZlcl9mc19jcmVhdGVfdm5vZGUoc3RydWN0IGFmc19jYWxsICpjYWxsLAorCQkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBib29sIGxhc3QpCit7CisJc3RydWN0IGFmc192bm9kZSAqdm5vZGUgPSBjYWxsLT5yZXBseTsKKwljb25zdCBfX2JlMzIgKmJwOworCisJX2VudGVyKCJ7JXV9LHsldX0sJWQiLCBjYWxsLT51bm1hcnNoYWxsLCBza2ItPmxlbiwgbGFzdCk7CisKKwlhZnNfdHJhbnNmZXJfcmVwbHkoY2FsbCwgc2tiKTsKKwlpZiAoIWxhc3QpCisJCXJldHVybiAwOworCisJaWYgKGNhbGwtPnJlcGx5X3NpemUgIT0gY2FsbC0+cmVwbHlfbWF4KQorCQlyZXR1cm4gLUVCQURNU0c7CisKKwkvKiB1bm1hcnNoYWxsIHRoZSByZXBseSBvbmNlIHdlJ3ZlIHJlY2VpdmVkIGFsbCBvZiBpdCAqLworCWJwID0gY2FsbC0+YnVmZmVyOworCXhkcl9kZWNvZGVfQUZTRmlkKCZicCwgY2FsbC0+cmVwbHkyKTsKKwl4ZHJfZGVjb2RlX0FGU0ZldGNoU3RhdHVzKCZicCwgY2FsbC0+cmVwbHkzLCBOVUxMKTsKKwl4ZHJfZGVjb2RlX0FGU0ZldGNoU3RhdHVzKCZicCwgJnZub2RlLT5zdGF0dXMsIHZub2RlKTsKKwl4ZHJfZGVjb2RlX0FGU0NhbGxCYWNrX3JhdygmYnAsIGNhbGwtPnJlcGx5NCk7CisJLyogeGRyX2RlY29kZV9BRlNWb2xTeW5jKCZicCwgY2FsbC0+cmVwbHlYKTsgKi8KKworCV9sZWF2ZSgiID0gMCBbZG9uZV0iKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZTLkNyZWF0ZUZpbGUgYW5kIEZTLk1ha2VEaXIgb3BlcmF0aW9uIHR5cGUKKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBhZnNfY2FsbF90eXBlIGFmc19SWEZTQ3JlYXRlWFhYWCA9IHsKKwkubmFtZQkJPSAiRlMuQ3JlYXRlWFhYWCIsCisJLmRlbGl2ZXIJPSBhZnNfZGVsaXZlcl9mc19jcmVhdGVfdm5vZGUsCisJLmFib3J0X3RvX2Vycm9yCT0gYWZzX2Fib3J0X3RvX2Vycm9yLAorCS5kZXN0cnVjdG9yCT0gYWZzX2ZsYXRfY2FsbF9kZXN0cnVjdG9yLAorfTsKKworLyoKKyAqIGNyZWF0ZSBhIGZpbGUgb3IgbWFrZSBhIGRpcmVjdG9yeQorICovCitpbnQgYWZzX2ZzX2NyZWF0ZShzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyLAorCQkgIHN0cnVjdCBrZXkgKmtleSwKKwkJICBzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSwKKwkJICBjb25zdCBjaGFyICpuYW1lLAorCQkgIHVtb2RlX3QgbW9kZSwKKwkJICBzdHJ1Y3QgYWZzX2ZpZCAqbmV3ZmlkLAorCQkgIHN0cnVjdCBhZnNfZmlsZV9zdGF0dXMgKm5ld3N0YXR1cywKKwkJICBzdHJ1Y3QgYWZzX2NhbGxiYWNrICpuZXdjYiwKKwkJICBjb25zdCBzdHJ1Y3QgYWZzX3dhaXRfbW9kZSAqd2FpdF9tb2RlKQoreworCXN0cnVjdCBhZnNfY2FsbCAqY2FsbDsKKwlzaXplX3QgbmFtZXN6LCByZXFzeiwgcGFkc3o7CisJX19iZTMyICpicDsKKworCV9lbnRlcigiIik7CisKKwluYW1lc3ogPSBzdHJsZW4obmFtZSk7CisJcGFkc3ogPSAoNCAtIChuYW1lc3ogJiAzKSkgJiAzOworCXJlcXN6ID0gKDUgKiA0KSArIG5hbWVzeiArIHBhZHN6ICsgKDYgKiA0KTsKKworCWNhbGwgPSBhZnNfYWxsb2NfZmxhdF9jYWxsKCZhZnNfUlhGU0NyZWF0ZVhYWFgsIHJlcXN6LAorCQkJCSAgICgzICsgMjEgKyAyMSArIDMgKyA2KSAqIDQpOworCWlmICghY2FsbCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljYWxsLT5rZXkgPSBrZXk7CisJY2FsbC0+cmVwbHkgPSB2bm9kZTsKKwljYWxsLT5yZXBseTIgPSBuZXdmaWQ7CisJY2FsbC0+cmVwbHkzID0gbmV3c3RhdHVzOworCWNhbGwtPnJlcGx5NCA9IG5ld2NiOworCWNhbGwtPnNlcnZpY2VfaWQgPSBGU19TRVJWSUNFOworCWNhbGwtPnBvcnQgPSBodG9ucyhBRlNfRlNfUE9SVCk7CisKKwkvKiBtYXJzaGFsbCB0aGUgcGFyYW1ldGVycyAqLworCWJwID0gY2FsbC0+cmVxdWVzdDsKKwkqYnArKyA9IGh0b25sKFNfSVNESVIobW9kZSkgPyBGU01BS0VESVIgOiBGU0NSRUFURUZJTEUpOwogCSpicCsrID0gaHRvbmwodm5vZGUtPmZpZC52aWQpOwogCSpicCsrID0gaHRvbmwodm5vZGUtPmZpZC52bm9kZSk7CiAJKmJwKysgPSBodG9ubCh2bm9kZS0+ZmlkLnVuaXF1ZSk7Ci0JKmJwKysgPSBodG9ubCgxKTsKLQkqYnArKyA9IGh0b25sKHZub2RlLT5jYl92ZXJzaW9uKTsKLQkqYnArKyA9IGh0b25sKHZub2RlLT5jYl9leHBpcnkpOwotCSpicCsrID0gaHRvbmwodm5vZGUtPmNiX3R5cGUpOwotCi0JLyogc2VuZCB0aGUgcGFyYW1ldGVycyB0byB0aGUgc2VydmVyICovCi0JcmV0ID0gcnhycGNfY2FsbF93cml0ZV9kYXRhKGNhbGwsIDEsIHBpb3YsIFJYUlBDX0xBU1RfUEFDS0VULCBHRlBfTk9GUywKLQkJCQkgICAgMCwgJnNlbnQpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIGFib3J0OwotCi0JLyogd2FpdCBmb3IgdGhlIHJlcGx5IHRvIGNvbXBsZXRlbHkgYXJyaXZlICovCi0JZm9yICg7OykgewotCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCQlpZiAoY2FsbC0+YXBwX2NhbGxfc3RhdGUgIT0gUlhSUENfQ1NUQVRFX0NMTlRfUkNWX1JFUExZIHx8Ci0JCSAgICBzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKLQkJCWJyZWFrOwotCQlzY2hlZHVsZSgpOworCSpicCsrID0gaHRvbmwobmFtZXN6KTsKKwltZW1jcHkoYnAsIG5hbWUsIG5hbWVzeik7CisJYnAgPSAodm9pZCAqKSBicCArIG5hbWVzejsKKwlpZiAocGFkc3ogPiAwKSB7CisJCW1lbXNldChicCwgMCwgcGFkc3opOworCQlicCA9ICh2b2lkICopIGJwICsgcGFkc3o7CiAJfQotCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJKmJwKysgPSBodG9ubChBRlNfU0VUX01PREUpOworCSpicCsrID0gMDsgLyogbXRpbWUgKi8KKwkqYnArKyA9IDA7IC8qIG93bmVyICovCisJKmJwKysgPSAwOyAvKiBncm91cCAqLworCSpicCsrID0gaHRvbmwobW9kZSAmIFNfSUFMTFVHTyk7IC8qIHVuaXggbW9kZSAqLworCSpicCsrID0gMDsgLyogc2VnbWVudCBzaXplICovCiAKLQlyZXQgPSAtRUlOVFI7Ci0JaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQotCQlnb3RvIGFib3J0OworCXJldHVybiBhZnNfbWFrZV9jYWxsKCZzZXJ2ZXItPmFkZHIsIGNhbGwsIEdGUF9OT0ZTLCB3YWl0X21vZGUpOworfQogCi0Jc3dpdGNoIChjYWxsLT5hcHBfY2FsbF9zdGF0ZSkgewotCWNhc2UgUlhSUENfQ1NUQVRFX0VSUk9SOgotCQlyZXQgPSBjYWxsLT5hcHBfZXJybm87Ci0JCWdvdG8gb3V0X3Vud2FpdDsKLQotCWNhc2UgUlhSUENfQ1NUQVRFX0NMTlRfR09UX1JFUExZOgotCQlyZXQgPSAwOwotCQlnb3RvIG91dF91bndhaXQ7Ci0KLQlkZWZhdWx0OgotCQlCVUcoKTsKLQl9Ci0KLSBvdXRfdW53YWl0OgotCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7Ci0JcmVtb3ZlX3dhaXRfcXVldWUoJmNhbGwtPndhaXRxLCAmbXlzZWxmKTsKLQlyeHJwY19wdXRfY2FsbChjYWxsKTsKLSBvdXRfcHV0X2Nvbm46Ci0JYWZzX3NlcnZlcl9yZWxlYXNlX2NhbGxzbG90KHNlcnZlciwgJmNhbGxzbG90KTsKLSBvdXQ6Ci0JX2xlYXZlKCIiKTsKLQlyZXR1cm4gcmV0OwotCi0gYWJvcnQ6Ci0Jc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOwotCXJ4cnBjX2NhbGxfYWJvcnQoY2FsbCwgcmV0KTsKLQlzY2hlZHVsZSgpOwotCWdvdG8gb3V0X3Vud2FpdDsKLX0gLyogZW5kIGFmc19yeGZzX2dpdmVfdXBfY2FsbGJhY2soKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgotICogbG9vayBhIGZpbGVuYW1lIHVwIGluIGEgZGlyZWN0b3J5Ci0gKiAtIHRoaXMgb3BlcmF0aW9uIGRvZXNuJ3Qgc2VlbSB0byB3b3JrIGNvcnJlY3RseSBpbiBPcGVuQUZTIHNlcnZlciAxLjIuMgorICogZGVsaXZlciByZXBseSBkYXRhIHRvIGFuIEZTLlJlbW92ZUZpbGUgb3IgRlMuUmVtb3ZlRGlyCiAgKi8KLSNpZiAwCi1pbnQgYWZzX3J4ZnNfbG9va3VwKHN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIsCi0JCSAgICBzdHJ1Y3QgYWZzX3Zub2RlICpkaXIsCi0JCSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwKLQkJICAgIHN0cnVjdCBhZnNfdm5vZGUgKnZub2RlLAotCQkgICAgc3RydWN0IGFmc192b2xzeW5jICp2b2xzeW5jKQorc3RhdGljIGludCBhZnNfZGVsaXZlcl9mc19yZW1vdmUoc3RydWN0IGFmc19jYWxsICpjYWxsLAorCQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBib29sIGxhc3QpCiB7Ci0Jc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm47Ci0Jc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGw7Ci0Jc3RydWN0IGt2ZWMgcGlvdlszXTsKLQlzaXplX3Qgc2VudDsKLQlpbnQgcmV0OwotCXUzMiAqYnAsIHplcm87CisJc3RydWN0IGFmc192bm9kZSAqdm5vZGUgPSBjYWxsLT5yZXBseTsKKwljb25zdCBfX2JlMzIgKmJwOwogCi0JREVDTEFSRV9XQUlUUVVFVUUobXlzZWxmLCBjdXJyZW50KTsKKwlfZW50ZXIoInsldX0seyV1fSwlZCIsIGNhbGwtPnVubWFyc2hhbGwsIHNrYi0+bGVuLCBsYXN0KTsKIAotCWtlbnRlcigiJXAseyV1LCV1LCV1fSwlcyIsCi0JICAgICAgIHNlcnZlciwgZmlkLT52aWQsIGZpZC0+dm5vZGUsIGZpZC0+dW5pcXVlLCBmaWxlbmFtZSk7CisJYWZzX3RyYW5zZmVyX3JlcGx5KGNhbGwsIHNrYik7CisJaWYgKCFsYXN0KQorCQlyZXR1cm4gMDsKIAotCS8qIGdldCBob2xkIG9mIHRoZSBmaWxlc2VydmVyIGNvbm5lY3Rpb24gKi8KLQlyZXQgPSBhZnNfc2VydmVyX2dldF9mc2Nvbm4oc2VydmVyLCAmY29ubik7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gb3V0OworCWlmIChjYWxsLT5yZXBseV9zaXplICE9IGNhbGwtPnJlcGx5X21heCkKKwkJcmV0dXJuIC1FQkFETVNHOwogCi0JLyogY3JlYXRlIGEgY2FsbCB0aHJvdWdoIHRoYXQgY29ubmVjdGlvbiAqLwotCXJldCA9IHJ4cnBjX2NyZWF0ZV9jYWxsKGNvbm4sIE5VTEwsIE5VTEwsIGFmc19yeGZzX2FlbWFwLCAmY2FsbCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJpbnRrKCJrQUZTOiBVbmFibGUgdG8gY3JlYXRlIGNhbGw6ICVkXG4iLCByZXQpOwotCQlnb3RvIG91dF9wdXRfY29ubjsKLQl9Ci0JY2FsbC0+YXBwX29wY29kZSA9IEZTTE9PS1VQOworCS8qIHVubWFyc2hhbGwgdGhlIHJlcGx5IG9uY2Ugd2UndmUgcmVjZWl2ZWQgYWxsIG9mIGl0ICovCisJYnAgPSBjYWxsLT5idWZmZXI7CisJeGRyX2RlY29kZV9BRlNGZXRjaFN0YXR1cygmYnAsICZ2bm9kZS0+c3RhdHVzLCB2bm9kZSk7CisJLyogeGRyX2RlY29kZV9BRlNWb2xTeW5jKCZicCwgY2FsbC0+cmVwbHlYKTsgKi8KIAotCS8qIHdlIHdhbnQgdG8gZ2V0IGV2ZW50IG5vdGlmaWNhdGlvbnMgZnJvbSB0aGUgY2FsbCAqLwotCWFkZF93YWl0X3F1ZXVlKCZjYWxsLT53YWl0cSwmbXlzZWxmKTsKKwlfbGVhdmUoIiA9IDAgW2RvbmVdIik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGUy5SZW1vdmVEaXIvRlMuUmVtb3ZlRmlsZSBvcGVyYXRpb24gdHlwZQorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGFmc19jYWxsX3R5cGUgYWZzX1JYRlNSZW1vdmVYWFhYID0geworCS5uYW1lCQk9ICJGUy5SZW1vdmVYWFhYIiwKKwkuZGVsaXZlcgk9IGFmc19kZWxpdmVyX2ZzX3JlbW92ZSwKKwkuYWJvcnRfdG9fZXJyb3IJPSBhZnNfYWJvcnRfdG9fZXJyb3IsCisJLmRlc3RydWN0b3IJPSBhZnNfZmxhdF9jYWxsX2Rlc3RydWN0b3IsCit9OworCisvKgorICogcmVtb3ZlIGEgZmlsZSBvciBkaXJlY3RvcnkKKyAqLworaW50IGFmc19mc19yZW1vdmUoc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlciwKKwkJICBzdHJ1Y3Qga2V5ICprZXksCisJCSAgc3RydWN0IGFmc192bm9kZSAqdm5vZGUsCisJCSAgY29uc3QgY2hhciAqbmFtZSwKKwkJICBib29sIGlzZGlyLAorCQkgIGNvbnN0IHN0cnVjdCBhZnNfd2FpdF9tb2RlICp3YWl0X21vZGUpCit7CisJc3RydWN0IGFmc19jYWxsICpjYWxsOworCXNpemVfdCBuYW1lc3osIHJlcXN6LCBwYWRzejsKKwlfX2JlMzIgKmJwOworCisJX2VudGVyKCIiKTsKKworCW5hbWVzeiA9IHN0cmxlbihuYW1lKTsKKwlwYWRzeiA9ICg0IC0gKG5hbWVzeiAmIDMpKSAmIDM7CisJcmVxc3ogPSAoNSAqIDQpICsgbmFtZXN6ICsgcGFkc3o7CisKKwljYWxsID0gYWZzX2FsbG9jX2ZsYXRfY2FsbCgmYWZzX1JYRlNSZW1vdmVYWFhYLCByZXFzeiwgKDIxICsgNikgKiA0KTsKKwlpZiAoIWNhbGwpCisJCXJldHVybiAtRU5PTUVNOworCisJY2FsbC0+a2V5ID0ga2V5OworCWNhbGwtPnJlcGx5ID0gdm5vZGU7CisJY2FsbC0+c2VydmljZV9pZCA9IEZTX1NFUlZJQ0U7CisJY2FsbC0+cG9ydCA9IGh0b25zKEFGU19GU19QT1JUKTsKIAogCS8qIG1hcnNoYWxsIHRoZSBwYXJhbWV0ZXJzICovCi0JYnAgPSByeHJwY19jYWxsX2FsbG9jX3NjcmF0Y2goY2FsbCwgMjApOwotCi0JemVybyA9IDA7Ci0KLQlwaW92WzBdLmlvdl9sZW4gPSAyMDsKLQlwaW92WzBdLmlvdl9iYXNlID0gYnA7Ci0JcGlvdlsxXS5pb3ZfbGVuID0gc3RybGVuKGZpbGVuYW1lKTsKLQlwaW92WzFdLmlvdl9iYXNlID0gKGNoYXIgKikgZmlsZW5hbWU7Ci0JcGlvdlsyXS5pb3ZfbGVuID0gKDQgLSAocGlvdlsxXS5pb3ZfbGVuICYgMykpICYgMzsKLQlwaW92WzJdLmlvdl9iYXNlID0gJnplcm87Ci0KLQkqYnArKyA9IGh0b25sKEZTTE9PS1VQKTsKLQkqYnArKyA9IGh0b25sKGRpcmZpZC0+dmlkKTsKLQkqYnArKyA9IGh0b25sKGRpcmZpZC0+dm5vZGUpOwotCSpicCsrID0gaHRvbmwoZGlyZmlkLT51bmlxdWUpOwotCSpicCsrID0gaHRvbmwocGlvdlsxXS5pb3ZfbGVuKTsKLQotCS8qIHNlbmQgdGhlIHBhcmFtZXRlcnMgdG8gdGhlIHNlcnZlciAqLwotCXJldCA9IHJ4cnBjX2NhbGxfd3JpdGVfZGF0YShjYWxsLCAzLCBwaW92LCBSWFJQQ19MQVNUX1BBQ0tFVCwgR0ZQX05PRlMsCi0JCQkJICAgIDAsICZzZW50KTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBhYm9ydDsKLQotCS8qIHdhaXQgZm9yIHRoZSByZXBseSB0byBjb21wbGV0ZWx5IGFycml2ZSAqLwotCWJwID0gcnhycGNfY2FsbF9hbGxvY19zY3JhdGNoKGNhbGwsIDIyMCk7Ci0KLQlyZXQgPSByeHJwY19jYWxsX3JlYWRfZGF0YShjYWxsLCBicCwgMjIwLAotCQkJCSAgIFJYUlBDX0NBTExfUkVBRF9CTE9DSyB8Ci0JCQkJICAgUlhSUENfQ0FMTF9SRUFEX0FMTCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJaWYgKHJldCA9PSAtRUNPTk5BQk9SVEVEKSB7Ci0JCQlyZXQgPSBjYWxsLT5hcHBfZXJybm87Ci0JCQlnb3RvIG91dF91bndhaXQ7Ci0JCX0KLQkJZ290byBhYm9ydDsKKwlicCA9IGNhbGwtPnJlcXVlc3Q7CisJKmJwKysgPSBodG9ubChpc2RpciA/IEZTUkVNT1ZFRElSIDogRlNSRU1PVkVGSUxFKTsKKwkqYnArKyA9IGh0b25sKHZub2RlLT5maWQudmlkKTsKKwkqYnArKyA9IGh0b25sKHZub2RlLT5maWQudm5vZGUpOworCSpicCsrID0gaHRvbmwodm5vZGUtPmZpZC51bmlxdWUpOworCSpicCsrID0gaHRvbmwobmFtZXN6KTsKKwltZW1jcHkoYnAsIG5hbWUsIG5hbWVzeik7CisJYnAgPSAodm9pZCAqKSBicCArIG5hbWVzejsKKwlpZiAocGFkc3ogPiAwKSB7CisJCW1lbXNldChicCwgMCwgcGFkc3opOworCQlicCA9ICh2b2lkICopIGJwICsgcGFkc3o7CiAJfQogCi0JLyogdW5tYXJzaGFsbCB0aGUgcmVwbHkgKi8KLQlmaWQtPnZpZAkJPSBudG9obCgqYnArKyk7Ci0JZmlkLT52bm9kZQkJPSBudG9obCgqYnArKyk7Ci0JZmlkLT51bmlxdWUJCT0gbnRvaGwoKmJwKyspOworCXJldHVybiBhZnNfbWFrZV9jYWxsKCZzZXJ2ZXItPmFkZHIsIGNhbGwsIEdGUF9OT0ZTLCB3YWl0X21vZGUpOworfQogCi0Jdm5vZGUtPnN0YXR1cy5pZl92ZXJzaW9uCT0gbnRvaGwoKmJwKyspOwotCXZub2RlLT5zdGF0dXMudHlwZQkJPSBudG9obCgqYnArKyk7Ci0Jdm5vZGUtPnN0YXR1cy5ubGluawkJPSBudG9obCgqYnArKyk7Ci0Jdm5vZGUtPnN0YXR1cy5zaXplCQk9IG50b2hsKCpicCsrKTsKLQl2bm9kZS0+c3RhdHVzLnZlcnNpb24JCT0gbnRvaGwoKmJwKyspOwotCXZub2RlLT5zdGF0dXMuYXV0aG9yCQk9IG50b2hsKCpicCsrKTsKLQl2bm9kZS0+c3RhdHVzLm93bmVyCQk9IG50b2hsKCpicCsrKTsKLQl2bm9kZS0+c3RhdHVzLmNhbGxlcl9hY2Nlc3MJPSBudG9obCgqYnArKyk7Ci0Jdm5vZGUtPnN0YXR1cy5hbm9uX2FjY2Vzcwk9IG50b2hsKCpicCsrKTsKLQl2bm9kZS0+c3RhdHVzLm1vZGUJCT0gbnRvaGwoKmJwKyspOwotCXZub2RlLT5zdGF0dXMucGFyZW50LnZpZAk9IGRpcmZpZC0+dmlkOwotCXZub2RlLT5zdGF0dXMucGFyZW50LnZub2RlCT0gbnRvaGwoKmJwKyspOwotCXZub2RlLT5zdGF0dXMucGFyZW50LnVuaXF1ZQk9IG50b2hsKCpicCsrKTsKLQlicCsrOyAvKiBzZWcgc2l6ZSAqLwotCXZub2RlLT5zdGF0dXMubXRpbWVfY2xpZW50CT0gbnRvaGwoKmJwKyspOwotCXZub2RlLT5zdGF0dXMubXRpbWVfc2VydmVyCT0gbnRvaGwoKmJwKyspOwotCWJwKys7IC8qIGdyb3VwICovCi0JYnArKzsgLyogc3luYyBjb3VudGVyICovCi0Jdm5vZGUtPnN0YXR1cy52ZXJzaW9uIHw9ICgodW5zaWduZWQgbG9uZyBsb25nKSBudG9obCgqYnArKykpIDw8IDMyOwotCWJwKys7IC8qIHNwYXJlMiAqLwotCWJwKys7IC8qIHNwYXJlMyAqLwotCWJwKys7IC8qIHNwYXJlNCAqLworLyoKKyAqIGRlbGl2ZXIgcmVwbHkgZGF0YSB0byBhbiBGUy5MaW5rCisgKi8KK3N0YXRpYyBpbnQgYWZzX2RlbGl2ZXJfZnNfbGluayhzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwsCisJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgYm9vbCBsYXN0KQoreworCXN0cnVjdCBhZnNfdm5vZGUgKmR2bm9kZSA9IGNhbGwtPnJlcGx5LCAqdm5vZGUgPSBjYWxsLT5yZXBseTI7CisJY29uc3QgX19iZTMyICpicDsKIAotCWRpci0+c3RhdHVzLmlmX3ZlcnNpb24JCT0gbnRvaGwoKmJwKyspOwotCWRpci0+c3RhdHVzLnR5cGUJCT0gbnRvaGwoKmJwKyspOwotCWRpci0+c3RhdHVzLm5saW5rCQk9IG50b2hsKCpicCsrKTsKLQlkaXItPnN0YXR1cy5zaXplCQk9IG50b2hsKCpicCsrKTsKLQlkaXItPnN0YXR1cy52ZXJzaW9uCQk9IG50b2hsKCpicCsrKTsKLQlkaXItPnN0YXR1cy5hdXRob3IJCT0gbnRvaGwoKmJwKyspOwotCWRpci0+c3RhdHVzLm93bmVyCQk9IG50b2hsKCpicCsrKTsKLQlkaXItPnN0YXR1cy5jYWxsZXJfYWNjZXNzCT0gbnRvaGwoKmJwKyspOwotCWRpci0+c3RhdHVzLmFub25fYWNjZXNzCQk9IG50b2hsKCpicCsrKTsKLQlkaXItPnN0YXR1cy5tb2RlCQk9IG50b2hsKCpicCsrKTsKLQlkaXItPnN0YXR1cy5wYXJlbnQudmlkCQk9IGRpcmZpZC0+dmlkOwotCWRpci0+c3RhdHVzLnBhcmVudC52bm9kZQk9IG50b2hsKCpicCsrKTsKLQlkaXItPnN0YXR1cy5wYXJlbnQudW5pcXVlCT0gbnRvaGwoKmJwKyspOwotCWJwKys7IC8qIHNlZyBzaXplICovCi0JZGlyLT5zdGF0dXMubXRpbWVfY2xpZW50CT0gbnRvaGwoKmJwKyspOwotCWRpci0+c3RhdHVzLm10aW1lX3NlcnZlcgk9IG50b2hsKCpicCsrKTsKLQlicCsrOyAvKiBncm91cCAqLwotCWJwKys7IC8qIHN5bmMgY291bnRlciAqLwotCWRpci0+c3RhdHVzLnZlcnNpb24gfD0gKCh1bnNpZ25lZCBsb25nIGxvbmcpIG50b2hsKCpicCsrKSkgPDwgMzI7Ci0JYnArKzsgLyogc3BhcmUyICovCi0JYnArKzsgLyogc3BhcmUzICovCi0JYnArKzsgLyogc3BhcmU0ICovCisJX2VudGVyKCJ7JXV9LHsldX0sJWQiLCBjYWxsLT51bm1hcnNoYWxsLCBza2ItPmxlbiwgbGFzdCk7CiAKLQljYWxsYmFjay0+ZmlkCQk9ICpmaWQ7Ci0JY2FsbGJhY2stPnZlcnNpb24JPSBudG9obCgqYnArKyk7Ci0JY2FsbGJhY2stPmV4cGlyeQk9IG50b2hsKCpicCsrKTsKLQljYWxsYmFjay0+dHlwZQkJPSBudG9obCgqYnArKyk7CisJYWZzX3RyYW5zZmVyX3JlcGx5KGNhbGwsIHNrYik7CisJaWYgKCFsYXN0KQorCQlyZXR1cm4gMDsKIAotCWlmICh2b2xzeW5jKSB7Ci0JCXZvbHN5bmMtPmNyZWF0aW9uCT0gbnRvaGwoKmJwKyspOwotCQlicCsrOyAvKiBzcGFyZTIgKi8KLQkJYnArKzsgLyogc3BhcmUzICovCi0JCWJwKys7IC8qIHNwYXJlNCAqLwotCQlicCsrOyAvKiBzcGFyZTUgKi8KLQkJYnArKzsgLyogc3BhcmU2ICovCisJaWYgKGNhbGwtPnJlcGx5X3NpemUgIT0gY2FsbC0+cmVwbHlfbWF4KQorCQlyZXR1cm4gLUVCQURNU0c7CisKKwkvKiB1bm1hcnNoYWxsIHRoZSByZXBseSBvbmNlIHdlJ3ZlIHJlY2VpdmVkIGFsbCBvZiBpdCAqLworCWJwID0gY2FsbC0+YnVmZmVyOworCXhkcl9kZWNvZGVfQUZTRmV0Y2hTdGF0dXMoJmJwLCAmdm5vZGUtPnN0YXR1cywgdm5vZGUpOworCXhkcl9kZWNvZGVfQUZTRmV0Y2hTdGF0dXMoJmJwLCAmZHZub2RlLT5zdGF0dXMsIGR2bm9kZSk7CisJLyogeGRyX2RlY29kZV9BRlNWb2xTeW5jKCZicCwgY2FsbC0+cmVwbHlYKTsgKi8KKworCV9sZWF2ZSgiID0gMCBbZG9uZV0iKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZTLkxpbmsgb3BlcmF0aW9uIHR5cGUKKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBhZnNfY2FsbF90eXBlIGFmc19SWEZTTGluayA9IHsKKwkubmFtZQkJPSAiRlMuTGluayIsCisJLmRlbGl2ZXIJPSBhZnNfZGVsaXZlcl9mc19saW5rLAorCS5hYm9ydF90b19lcnJvcgk9IGFmc19hYm9ydF90b19lcnJvciwKKwkuZGVzdHJ1Y3Rvcgk9IGFmc19mbGF0X2NhbGxfZGVzdHJ1Y3RvciwKK307CisKKy8qCisgKiBtYWtlIGEgaGFyZCBsaW5rCisgKi8KK2ludCBhZnNfZnNfbGluayhzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyLAorCQlzdHJ1Y3Qga2V5ICprZXksCisJCXN0cnVjdCBhZnNfdm5vZGUgKmR2bm9kZSwKKwkJc3RydWN0IGFmc192bm9kZSAqdm5vZGUsCisJCWNvbnN0IGNoYXIgKm5hbWUsCisJCWNvbnN0IHN0cnVjdCBhZnNfd2FpdF9tb2RlICp3YWl0X21vZGUpCit7CisJc3RydWN0IGFmc19jYWxsICpjYWxsOworCXNpemVfdCBuYW1lc3osIHJlcXN6LCBwYWRzejsKKwlfX2JlMzIgKmJwOworCisJX2VudGVyKCIiKTsKKworCW5hbWVzeiA9IHN0cmxlbihuYW1lKTsKKwlwYWRzeiA9ICg0IC0gKG5hbWVzeiAmIDMpKSAmIDM7CisJcmVxc3ogPSAoNSAqIDQpICsgbmFtZXN6ICsgcGFkc3ogKyAoMyAqIDQpOworCisJY2FsbCA9IGFmc19hbGxvY19mbGF0X2NhbGwoJmFmc19SWEZTTGluaywgcmVxc3osICgyMSArIDIxICsgNikgKiA0KTsKKwlpZiAoIWNhbGwpCisJCXJldHVybiAtRU5PTUVNOworCisJY2FsbC0+a2V5ID0ga2V5OworCWNhbGwtPnJlcGx5ID0gZHZub2RlOworCWNhbGwtPnJlcGx5MiA9IHZub2RlOworCWNhbGwtPnNlcnZpY2VfaWQgPSBGU19TRVJWSUNFOworCWNhbGwtPnBvcnQgPSBodG9ucyhBRlNfRlNfUE9SVCk7CisKKwkvKiBtYXJzaGFsbCB0aGUgcGFyYW1ldGVycyAqLworCWJwID0gY2FsbC0+cmVxdWVzdDsKKwkqYnArKyA9IGh0b25sKEZTTElOSyk7CisJKmJwKysgPSBodG9ubChkdm5vZGUtPmZpZC52aWQpOworCSpicCsrID0gaHRvbmwoZHZub2RlLT5maWQudm5vZGUpOworCSpicCsrID0gaHRvbmwoZHZub2RlLT5maWQudW5pcXVlKTsKKwkqYnArKyA9IGh0b25sKG5hbWVzeik7CisJbWVtY3B5KGJwLCBuYW1lLCBuYW1lc3opOworCWJwID0gKHZvaWQgKikgYnAgKyBuYW1lc3o7CisJaWYgKHBhZHN6ID4gMCkgeworCQltZW1zZXQoYnAsIDAsIHBhZHN6KTsKKwkJYnAgPSAodm9pZCAqKSBicCArIHBhZHN6OworCX0KKwkqYnArKyA9IGh0b25sKHZub2RlLT5maWQudmlkKTsKKwkqYnArKyA9IGh0b25sKHZub2RlLT5maWQudm5vZGUpOworCSpicCsrID0gaHRvbmwodm5vZGUtPmZpZC51bmlxdWUpOworCisJcmV0dXJuIGFmc19tYWtlX2NhbGwoJnNlcnZlci0+YWRkciwgY2FsbCwgR0ZQX05PRlMsIHdhaXRfbW9kZSk7Cit9CisKKy8qCisgKiBkZWxpdmVyIHJlcGx5IGRhdGEgdG8gYW4gRlMuU3ltbGluaworICovCitzdGF0aWMgaW50IGFmc19kZWxpdmVyX2ZzX3N5bWxpbmsoc3RydWN0IGFmc19jYWxsICpjYWxsLAorCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgYm9vbCBsYXN0KQoreworCXN0cnVjdCBhZnNfdm5vZGUgKnZub2RlID0gY2FsbC0+cmVwbHk7CisJY29uc3QgX19iZTMyICpicDsKKworCV9lbnRlcigieyV1fSx7JXV9LCVkIiwgY2FsbC0+dW5tYXJzaGFsbCwgc2tiLT5sZW4sIGxhc3QpOworCisJYWZzX3RyYW5zZmVyX3JlcGx5KGNhbGwsIHNrYik7CisJaWYgKCFsYXN0KQorCQlyZXR1cm4gMDsKKworCWlmIChjYWxsLT5yZXBseV9zaXplICE9IGNhbGwtPnJlcGx5X21heCkKKwkJcmV0dXJuIC1FQkFETVNHOworCisJLyogdW5tYXJzaGFsbCB0aGUgcmVwbHkgb25jZSB3ZSd2ZSByZWNlaXZlZCBhbGwgb2YgaXQgKi8KKwlicCA9IGNhbGwtPmJ1ZmZlcjsKKwl4ZHJfZGVjb2RlX0FGU0ZpZCgmYnAsIGNhbGwtPnJlcGx5Mik7CisJeGRyX2RlY29kZV9BRlNGZXRjaFN0YXR1cygmYnAsIGNhbGwtPnJlcGx5MywgTlVMTCk7CisJeGRyX2RlY29kZV9BRlNGZXRjaFN0YXR1cygmYnAsICZ2bm9kZS0+c3RhdHVzLCB2bm9kZSk7CisJLyogeGRyX2RlY29kZV9BRlNWb2xTeW5jKCZicCwgY2FsbC0+cmVwbHlYKTsgKi8KKworCV9sZWF2ZSgiID0gMCBbZG9uZV0iKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZTLlN5bWxpbmsgb3BlcmF0aW9uIHR5cGUKKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBhZnNfY2FsbF90eXBlIGFmc19SWEZTU3ltbGluayA9IHsKKwkubmFtZQkJPSAiRlMuU3ltbGluayIsCisJLmRlbGl2ZXIJPSBhZnNfZGVsaXZlcl9mc19zeW1saW5rLAorCS5hYm9ydF90b19lcnJvcgk9IGFmc19hYm9ydF90b19lcnJvciwKKwkuZGVzdHJ1Y3Rvcgk9IGFmc19mbGF0X2NhbGxfZGVzdHJ1Y3RvciwKK307CisKKy8qCisgKiBjcmVhdGUgYSBzeW1ib2xpYyBsaW5rCisgKi8KK2ludCBhZnNfZnNfc3ltbGluayhzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyLAorCQkgICBzdHJ1Y3Qga2V5ICprZXksCisJCSAgIHN0cnVjdCBhZnNfdm5vZGUgKnZub2RlLAorCQkgICBjb25zdCBjaGFyICpuYW1lLAorCQkgICBjb25zdCBjaGFyICpjb250ZW50cywKKwkJICAgc3RydWN0IGFmc19maWQgKm5ld2ZpZCwKKwkJICAgc3RydWN0IGFmc19maWxlX3N0YXR1cyAqbmV3c3RhdHVzLAorCQkgICBjb25zdCBzdHJ1Y3QgYWZzX3dhaXRfbW9kZSAqd2FpdF9tb2RlKQoreworCXN0cnVjdCBhZnNfY2FsbCAqY2FsbDsKKwlzaXplX3QgbmFtZXN6LCByZXFzeiwgcGFkc3osIGNfbmFtZXN6LCBjX3BhZHN6OworCV9fYmUzMiAqYnA7CisKKwlfZW50ZXIoIiIpOworCisJbmFtZXN6ID0gc3RybGVuKG5hbWUpOworCXBhZHN6ID0gKDQgLSAobmFtZXN6ICYgMykpICYgMzsKKworCWNfbmFtZXN6ID0gc3RybGVuKGNvbnRlbnRzKTsKKwljX3BhZHN6ID0gKDQgLSAoY19uYW1lc3ogJiAzKSkgJiAzOworCisJcmVxc3ogPSAoNiAqIDQpICsgbmFtZXN6ICsgcGFkc3ogKyBjX25hbWVzeiArIGNfcGFkc3ogKyAoNiAqIDQpOworCisJY2FsbCA9IGFmc19hbGxvY19mbGF0X2NhbGwoJmFmc19SWEZTU3ltbGluaywgcmVxc3osCisJCQkJICAgKDMgKyAyMSArIDIxICsgNikgKiA0KTsKKwlpZiAoIWNhbGwpCisJCXJldHVybiAtRU5PTUVNOworCisJY2FsbC0+a2V5ID0ga2V5OworCWNhbGwtPnJlcGx5ID0gdm5vZGU7CisJY2FsbC0+cmVwbHkyID0gbmV3ZmlkOworCWNhbGwtPnJlcGx5MyA9IG5ld3N0YXR1czsKKwljYWxsLT5zZXJ2aWNlX2lkID0gRlNfU0VSVklDRTsKKwljYWxsLT5wb3J0ID0gaHRvbnMoQUZTX0ZTX1BPUlQpOworCisJLyogbWFyc2hhbGwgdGhlIHBhcmFtZXRlcnMgKi8KKwlicCA9IGNhbGwtPnJlcXVlc3Q7CisJKmJwKysgPSBodG9ubChGU1NZTUxJTkspOworCSpicCsrID0gaHRvbmwodm5vZGUtPmZpZC52aWQpOworCSpicCsrID0gaHRvbmwodm5vZGUtPmZpZC52bm9kZSk7CisJKmJwKysgPSBodG9ubCh2bm9kZS0+ZmlkLnVuaXF1ZSk7CisJKmJwKysgPSBodG9ubChuYW1lc3opOworCW1lbWNweShicCwgbmFtZSwgbmFtZXN6KTsKKwlicCA9ICh2b2lkICopIGJwICsgbmFtZXN6OworCWlmIChwYWRzeiA+IDApIHsKKwkJbWVtc2V0KGJwLCAwLCBwYWRzeik7CisJCWJwID0gKHZvaWQgKikgYnAgKyBwYWRzejsKKwl9CisJKmJwKysgPSBodG9ubChjX25hbWVzeik7CisJbWVtY3B5KGJwLCBjb250ZW50cywgY19uYW1lc3opOworCWJwID0gKHZvaWQgKikgYnAgKyBjX25hbWVzejsKKwlpZiAoY19wYWRzeiA+IDApIHsKKwkJbWVtc2V0KGJwLCAwLCBjX3BhZHN6KTsKKwkJYnAgPSAodm9pZCAqKSBicCArIGNfcGFkc3o7CisJfQorCSpicCsrID0gaHRvbmwoQUZTX1NFVF9NT0RFKTsKKwkqYnArKyA9IDA7IC8qIG10aW1lICovCisJKmJwKysgPSAwOyAvKiBvd25lciAqLworCSpicCsrID0gMDsgLyogZ3JvdXAgKi8KKwkqYnArKyA9IGh0b25sKFNfSVJXWFVHTyk7IC8qIHVuaXggbW9kZSAqLworCSpicCsrID0gMDsgLyogc2VnbWVudCBzaXplICovCisKKwlyZXR1cm4gYWZzX21ha2VfY2FsbCgmc2VydmVyLT5hZGRyLCBjYWxsLCBHRlBfTk9GUywgd2FpdF9tb2RlKTsKK30KKworLyoKKyAqIGRlbGl2ZXIgcmVwbHkgZGF0YSB0byBhbiBGUy5SZW5hbWUKKyAqLworc3RhdGljIGludCBhZnNfZGVsaXZlcl9mc19yZW5hbWUoc3RydWN0IGFmc19jYWxsICpjYWxsLAorCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgYm9vbCBsYXN0KQoreworCXN0cnVjdCBhZnNfdm5vZGUgKm9yaWdfZHZub2RlID0gY2FsbC0+cmVwbHksICpuZXdfZHZub2RlID0gY2FsbC0+cmVwbHkyOworCWNvbnN0IF9fYmUzMiAqYnA7CisKKwlfZW50ZXIoInsldX0seyV1fSwlZCIsIGNhbGwtPnVubWFyc2hhbGwsIHNrYi0+bGVuLCBsYXN0KTsKKworCWFmc190cmFuc2Zlcl9yZXBseShjYWxsLCBza2IpOworCWlmICghbGFzdCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoY2FsbC0+cmVwbHlfc2l6ZSAhPSBjYWxsLT5yZXBseV9tYXgpCisJCXJldHVybiAtRUJBRE1TRzsKKworCS8qIHVubWFyc2hhbGwgdGhlIHJlcGx5IG9uY2Ugd2UndmUgcmVjZWl2ZWQgYWxsIG9mIGl0ICovCisJYnAgPSBjYWxsLT5idWZmZXI7CisJeGRyX2RlY29kZV9BRlNGZXRjaFN0YXR1cygmYnAsICZvcmlnX2R2bm9kZS0+c3RhdHVzLCBvcmlnX2R2bm9kZSk7CisJaWYgKG5ld19kdm5vZGUgIT0gb3JpZ19kdm5vZGUpCisJCXhkcl9kZWNvZGVfQUZTRmV0Y2hTdGF0dXMoJmJwLCAmbmV3X2R2bm9kZS0+c3RhdHVzLCBuZXdfZHZub2RlKTsKKwkvKiB4ZHJfZGVjb2RlX0FGU1ZvbFN5bmMoJmJwLCBjYWxsLT5yZXBseVgpOyAqLworCisJX2xlYXZlKCIgPSAwIFtkb25lXSIpOworCXJldHVybiAwOworfQorCisvKgorICogRlMuUmVuYW1lIG9wZXJhdGlvbiB0eXBlCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWZzX2NhbGxfdHlwZSBhZnNfUlhGU1JlbmFtZSA9IHsKKwkubmFtZQkJPSAiRlMuUmVuYW1lIiwKKwkuZGVsaXZlcgk9IGFmc19kZWxpdmVyX2ZzX3JlbmFtZSwKKwkuYWJvcnRfdG9fZXJyb3IJPSBhZnNfYWJvcnRfdG9fZXJyb3IsCisJLmRlc3RydWN0b3IJPSBhZnNfZmxhdF9jYWxsX2Rlc3RydWN0b3IsCit9OworCisvKgorICogY3JlYXRlIGEgc3ltYm9saWMgbGluaworICovCitpbnQgYWZzX2ZzX3JlbmFtZShzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyLAorCQkgIHN0cnVjdCBrZXkgKmtleSwKKwkJICBzdHJ1Y3QgYWZzX3Zub2RlICpvcmlnX2R2bm9kZSwKKwkJICBjb25zdCBjaGFyICpvcmlnX25hbWUsCisJCSAgc3RydWN0IGFmc192bm9kZSAqbmV3X2R2bm9kZSwKKwkJICBjb25zdCBjaGFyICpuZXdfbmFtZSwKKwkJICBjb25zdCBzdHJ1Y3QgYWZzX3dhaXRfbW9kZSAqd2FpdF9tb2RlKQoreworCXN0cnVjdCBhZnNfY2FsbCAqY2FsbDsKKwlzaXplX3QgcmVxc3osIG9fbmFtZXN6LCBvX3BhZHN6LCBuX25hbWVzeiwgbl9wYWRzejsKKwlfX2JlMzIgKmJwOworCisJX2VudGVyKCIiKTsKKworCW9fbmFtZXN6ID0gc3RybGVuKG9yaWdfbmFtZSk7CisJb19wYWRzeiA9ICg0IC0gKG9fbmFtZXN6ICYgMykpICYgMzsKKworCW5fbmFtZXN6ID0gc3RybGVuKG5ld19uYW1lKTsKKwluX3BhZHN6ID0gKDQgLSAobl9uYW1lc3ogJiAzKSkgJiAzOworCisJcmVxc3ogPSAoNCAqIDQpICsKKwkJNCArIG9fbmFtZXN6ICsgb19wYWRzeiArCisJCSgzICogNCkgKworCQk0ICsgbl9uYW1lc3ogKyBuX3BhZHN6OworCisJY2FsbCA9IGFmc19hbGxvY19mbGF0X2NhbGwoJmFmc19SWEZTUmVuYW1lLCByZXFzeiwgKDIxICsgMjEgKyA2KSAqIDQpOworCWlmICghY2FsbCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljYWxsLT5rZXkgPSBrZXk7CisJY2FsbC0+cmVwbHkgPSBvcmlnX2R2bm9kZTsKKwljYWxsLT5yZXBseTIgPSBuZXdfZHZub2RlOworCWNhbGwtPnNlcnZpY2VfaWQgPSBGU19TRVJWSUNFOworCWNhbGwtPnBvcnQgPSBodG9ucyhBRlNfRlNfUE9SVCk7CisKKwkvKiBtYXJzaGFsbCB0aGUgcGFyYW1ldGVycyAqLworCWJwID0gY2FsbC0+cmVxdWVzdDsKKwkqYnArKyA9IGh0b25sKEZTUkVOQU1FKTsKKwkqYnArKyA9IGh0b25sKG9yaWdfZHZub2RlLT5maWQudmlkKTsKKwkqYnArKyA9IGh0b25sKG9yaWdfZHZub2RlLT5maWQudm5vZGUpOworCSpicCsrID0gaHRvbmwob3JpZ19kdm5vZGUtPmZpZC51bmlxdWUpOworCSpicCsrID0gaHRvbmwob19uYW1lc3opOworCW1lbWNweShicCwgb3JpZ19uYW1lLCBvX25hbWVzeik7CisJYnAgPSAodm9pZCAqKSBicCArIG9fbmFtZXN6OworCWlmIChvX3BhZHN6ID4gMCkgeworCQltZW1zZXQoYnAsIDAsIG9fcGFkc3opOworCQlicCA9ICh2b2lkICopIGJwICsgb19wYWRzejsKIAl9CiAKLQkvKiBzdWNjZXNzICovCi0JcmV0ID0gMDsKKwkqYnArKyA9IGh0b25sKG5ld19kdm5vZGUtPmZpZC52aWQpOworCSpicCsrID0gaHRvbmwobmV3X2R2bm9kZS0+ZmlkLnZub2RlKTsKKwkqYnArKyA9IGh0b25sKG5ld19kdm5vZGUtPmZpZC51bmlxdWUpOworCSpicCsrID0gaHRvbmwobl9uYW1lc3opOworCW1lbWNweShicCwgbmV3X25hbWUsIG5fbmFtZXN6KTsKKwlicCA9ICh2b2lkICopIGJwICsgbl9uYW1lc3o7CisJaWYgKG5fcGFkc3ogPiAwKSB7CisJCW1lbXNldChicCwgMCwgbl9wYWRzeik7CisJCWJwID0gKHZvaWQgKikgYnAgKyBuX3BhZHN6OworCX0KIAotIG91dF91bndhaXQ6Ci0Jc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKLQlyZW1vdmVfd2FpdF9xdWV1ZSgmY2FsbC0+d2FpdHEsICZteXNlbGYpOwotCXJ4cnBjX3B1dF9jYWxsKGNhbGwpOwotIG91dF9wdXRfY29ubjoKLQlhZnNfc2VydmVyX3JlbGVhc2VfZnNjb25uKHNlcnZlciwgY29ubik7Ci0gb3V0OgotCWtsZWF2ZSgiIik7Ci0JcmV0dXJuIHJldDsKLQotIGFib3J0OgotCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKLQlyeHJwY19jYWxsX2Fib3J0KGNhbGwsIHJldCk7Ci0Jc2NoZWR1bGUoKTsKLQlnb3RvIG91dF91bndhaXQ7Ci19IC8qIGVuZCBhZnNfcnhmc19sb29rdXAoKSAqLwotI2VuZGlmCisJcmV0dXJuIGFmc19tYWtlX2NhbGwoJnNlcnZlci0+YWRkciwgY2FsbCwgR0ZQX05PRlMsIHdhaXRfbW9kZSk7Cit9CmRpZmYgLS1naXQgYS9mcy9hZnMvZnNjbGllbnQuaCBiL2ZzL2Fmcy9mc2NsaWVudC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmEzZTc0Li4wMDAwMDAwCi0tLSBhL2ZzL2Fmcy9mc2NsaWVudC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyogZnNjbGllbnQuaDogQUZTIEZpbGUgU2VydmVyIGNsaWVudCBzdHViIGRlY2xhcmF0aW9ucwotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMiBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotCi0jaWZuZGVmIF9MSU5VWF9BRlNfRlNDTElFTlRfSAotI2RlZmluZSBfTElOVVhfQUZTX0ZTQ0xJRU5UX0gKLQotI2luY2x1ZGUgInNlcnZlci5oIgotCi1leHRlcm4gaW50IGFmc19yeGZzX2dldF92b2x1bWVfaW5mbyhzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyLAotCQkJCSAgICBjb25zdCBjaGFyICpuYW1lLAotCQkJCSAgICBzdHJ1Y3QgYWZzX3ZvbHVtZV9pbmZvICp2aW5mbyk7Ci0KLWV4dGVybiBpbnQgYWZzX3J4ZnNfZmV0Y2hfZmlsZV9zdGF0dXMoc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlciwKLQkJCQkgICAgICBzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSwKLQkJCQkgICAgICBzdHJ1Y3QgYWZzX3ZvbHN5bmMgKnZvbHN5bmMpOwotCi1zdHJ1Y3QgYWZzX3J4ZnNfZmV0Y2hfZGVzY3JpcHRvciB7Ci0Jc3RydWN0IGFmc19maWQJZmlkOwkJLyogZmlsZSBJRCB0byBmZXRjaCAqLwotCXNpemVfdAkJc2l6ZTsJCS8qIHRvdGFsIG51bWJlciBvZiBieXRlcyB0byBmZXRjaCAqLwotCW9mZl90CQlvZmZzZXQ7CQkvKiBvZmZzZXQgaW4gZmlsZSB0byBzdGFydCBmcm9tICovCi0Jdm9pZAkJKmJ1ZmZlcjsJLyogcmVhZCBidWZmZXIgKi8KLQlzaXplX3QJCWFjdHVhbDsJCS8qIGFjdHVhbCBzaXplIHNlbnQgYmFjayBieSBzZXJ2ZXIgKi8KLX07Ci0KLWV4dGVybiBpbnQgYWZzX3J4ZnNfZmV0Y2hfZmlsZV9kYXRhKHN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIsCi0JCQkJICAgIHN0cnVjdCBhZnNfdm5vZGUgKnZub2RlLAotCQkJCSAgICBzdHJ1Y3QgYWZzX3J4ZnNfZmV0Y2hfZGVzY3JpcHRvciAqZGVzYywKLQkJCQkgICAgc3RydWN0IGFmc192b2xzeW5jICp2b2xzeW5jKTsKLQotZXh0ZXJuIGludCBhZnNfcnhmc19naXZlX3VwX2NhbGxiYWNrKHN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIsCi0JCQkJICAgICBzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSk7Ci0KLS8qIHRoaXMgZG9lc24ndCBhcHBlYXIgdG8gd29yayBpbiBPcGVuQUZTIHNlcnZlciAqLwotZXh0ZXJuIGludCBhZnNfcnhmc19sb29rdXAoc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlciwKLQkJCSAgIHN0cnVjdCBhZnNfdm5vZGUgKmRpciwKLQkJCSAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAotCQkJICAgc3RydWN0IGFmc192bm9kZSAqdm5vZGUsCi0JCQkgICBzdHJ1Y3QgYWZzX3ZvbHN5bmMgKnZvbHN5bmMpOwotCi0vKiB0aGlzIGlzIGFwcGFyZW50bHkgbWlzLWltcGxlbWVudGVkIGluIE9wZW5BRlMgc2VydmVyICovCi1leHRlcm4gaW50IGFmc19yeGZzX2dldF9yb290X3ZvbHVtZShzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyLAotCQkJCSAgICBjaGFyICpidWYsCi0JCQkJICAgIHNpemVfdCAqYnVmbGVuKTsKLQotCi0jZW5kaWYgLyogX0xJTlVYX0FGU19GU0NMSUVOVF9IICovCmRpZmYgLS1naXQgYS9mcy9hZnMvaW5vZGUuYyBiL2ZzL2Fmcy9pbm9kZS5jCmluZGV4IDlkOWJjYTYuLmMxODRhNGUgMTAwNjQ0Ci0tLSBhL2ZzL2Fmcy9pbm9kZS5jCisrKyBiL2ZzL2Fmcy9pbm9kZS5jCkBAIC0xOSw5ICsxOSw2IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgotI2luY2x1ZGUgInZvbHVtZS5oIgotI2luY2x1ZGUgInZub2RlLmgiCi0jaW5jbHVkZSAic3VwZXIuaCIKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogCiBzdHJ1Y3QgYWZzX2lnZXRfZGF0YSB7CkBAIC0yOSwyNiArMjYsMjUgQEAKIAlzdHJ1Y3QgYWZzX3ZvbHVtZQkqdm9sdW1lOwkvKiB2b2x1bWUgb24gd2hpY2ggcmVzaWRlcyAqLwogfTsKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAqIG1hcCB0aGUgQUZTIGZpbGUgc3RhdHVzIHRvIHRoZSBpbm9kZSBtZW1iZXIgdmFyaWFibGVzCiAgKi8KLXN0YXRpYyBpbnQgYWZzX2lub2RlX21hcF9zdGF0dXMoc3RydWN0IGFmc192bm9kZSAqdm5vZGUpCitzdGF0aWMgaW50IGFmc19pbm9kZV9tYXBfc3RhdHVzKHN0cnVjdCBhZnNfdm5vZGUgKnZub2RlLCBzdHJ1Y3Qga2V5ICprZXkpCiB7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IEFGU19WTk9ERV9UT19JKHZub2RlKTsKIAotCV9kZWJ1ZygiRlM6IGZ0PSVkIGxrPSVkIHN6PSVadSB2ZXI9JUx1IG1vZD0laHUiLAorCV9kZWJ1ZygiRlM6IGZ0PSVkIGxrPSVkIHN6PSVsbHUgdmVyPSVMdSBtb2Q9JWh1IiwKIAkgICAgICAgdm5vZGUtPnN0YXR1cy50eXBlLAogCSAgICAgICB2bm9kZS0+c3RhdHVzLm5saW5rLAotCSAgICAgICB2bm9kZS0+c3RhdHVzLnNpemUsCi0JICAgICAgIHZub2RlLT5zdGF0dXMudmVyc2lvbiwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgdm5vZGUtPnN0YXR1cy5zaXplLAorCSAgICAgICB2bm9kZS0+c3RhdHVzLmRhdGFfdmVyc2lvbiwKIAkgICAgICAgdm5vZGUtPnN0YXR1cy5tb2RlKTsKIAogCXN3aXRjaCAodm5vZGUtPnN0YXR1cy50eXBlKSB7CiAJY2FzZSBBRlNfRlRZUEVfRklMRToKIAkJaW5vZGUtPmlfbW9kZQk9IFNfSUZSRUcgfCB2bm9kZS0+c3RhdHVzLm1vZGU7CiAJCWlub2RlLT5pX29wCT0gJmFmc19maWxlX2lub2RlX29wZXJhdGlvbnM7Ci0JCWlub2RlLT5pX2ZvcAk9ICZnZW5lcmljX3JvX2ZvcHM7CisJCWlub2RlLT5pX2ZvcAk9ICZhZnNfZmlsZV9vcGVyYXRpb25zOwogCQlicmVhazsKIAljYXNlIEFGU19GVFlQRV9ESVI6CiAJCWlub2RlLT5pX21vZGUJPSBTX0lGRElSIHwgdm5vZGUtPnN0YXR1cy5tb2RlOwpAQCAtNzcsOSArNzMsOSBAQAogCiAJLyogY2hlY2sgdG8gc2VlIHdoZXRoZXIgYSBzeW1ib2xpYyBsaW5rIGlzIHJlYWxseSBhIG1vdW50cG9pbnQgKi8KIAlpZiAodm5vZGUtPnN0YXR1cy50eXBlID09IEFGU19GVFlQRV9TWU1MSU5LKSB7Ci0JCWFmc19tbnRwdF9jaGVja19zeW1saW5rKHZub2RlKTsKKwkJYWZzX21udHB0X2NoZWNrX3N5bWxpbmsodm5vZGUsIGtleSk7CiAKLQkJaWYgKHZub2RlLT5mbGFncyAmIEFGU19WTk9ERV9NT1VOVFBPSU5UKSB7CisJCWlmICh0ZXN0X2JpdChBRlNfVk5PREVfTU9VTlRQT0lOVCwgJnZub2RlLT5mbGFncykpIHsKIAkJCWlub2RlLT5pX21vZGUJPSBTX0lGRElSIHwgdm5vZGUtPnN0YXR1cy5tb2RlOwogCQkJaW5vZGUtPmlfb3AJPSAmYWZzX21udHB0X2lub2RlX29wZXJhdGlvbnM7CiAJCQlpbm9kZS0+aV9mb3AJPSAmYWZzX21udHB0X2ZpbGVfb3BlcmF0aW9uczsKQEAgLTg3LDMwICs4Myw4IEBACiAJfQogCiAJcmV0dXJuIDA7Ci19IC8qIGVuZCBhZnNfaW5vZGVfbWFwX3N0YXR1cygpICovCit9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBhdHRlbXB0IHRvIGZldGNoIHRoZSBzdGF0dXMgb2YgYW4gaW5vZGUsIGNvZWxlc2NpbmcgbXVsdGlwbGUgc2ltdWx0YW5lb3VzCi0gKiBmZXRjaGVzCi0gKi8KLXN0YXRpYyBpbnQgYWZzX2lub2RlX2ZldGNoX3N0YXR1cyhzdHJ1Y3QgaW5vZGUgKmlub2RlKQotewotCXN0cnVjdCBhZnNfdm5vZGUgKnZub2RlOwotCWludCByZXQ7Ci0KLQl2bm9kZSA9IEFGU19GU19JKGlub2RlKTsKLQotCXJldCA9IGFmc192bm9kZV9mZXRjaF9zdGF0dXModm5vZGUpOwotCi0JaWYgKHJldCA9PSAwKQotCQlyZXQgPSBhZnNfaW5vZGVfbWFwX3N0YXR1cyh2bm9kZSk7Ci0KLQlyZXR1cm4gcmV0OwotCi19IC8qIGVuZCBhZnNfaW5vZGVfZmV0Y2hfc3RhdHVzKCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAqIGlnZXQ1KCkgY29tcGFyYXRvcgogICovCkBAIC0xMjAsOSArOTQsOCBAQAogCiAJcmV0dXJuIGlub2RlLT5pX2lubyA9PSBkYXRhLT5maWQudm5vZGUgJiYKIAkJaW5vZGUtPmlfdmVyc2lvbiA9PSBkYXRhLT5maWQudW5pcXVlOwotfSAvKiBlbmQgYWZzX2lnZXQ1X3Rlc3QoKSAqLworfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICogaWdldDUoKSBpbm9kZSBpbml0aWFsaXNlcgogICovCkBAIC0xMzcsMTQgKzExMCwxNCBAQAogCXZub2RlLT52b2x1bWUgPSBkYXRhLT52b2x1bWU7CiAKIAlyZXR1cm4gMDsKLX0gLyogZW5kIGFmc19pZ2V0NV9zZXQoKSAqLworfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICogaW5vZGUgcmV0cmlldmFsCiAgKi8KLWlubGluZSBpbnQgYWZzX2lnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGFmc19maWQgKmZpZCwKLQkJICAgIHN0cnVjdCBpbm9kZSAqKl9pbm9kZSkKK3N0cnVjdCBpbm9kZSAqYWZzX2lnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGtleSAqa2V5LAorCQkgICAgICAgc3RydWN0IGFmc19maWQgKmZpZCwgc3RydWN0IGFmc19maWxlX3N0YXR1cyAqc3RhdHVzLAorCQkgICAgICAgc3RydWN0IGFmc19jYWxsYmFjayAqY2IpCiB7CiAJc3RydWN0IGFmc19pZ2V0X2RhdGEgZGF0YSA9IHsgLmZpZCA9ICpmaWQgfTsKIAlzdHJ1Y3QgYWZzX3N1cGVyX2luZm8gKmFzOwpAQCAtMTYxLDIwICsxMzQsMTggQEAKIAkJCSAgICAgJmRhdGEpOwogCWlmICghaW5vZGUpIHsKIAkJX2xlYXZlKCIgPSAtRU5PTUVNIik7Ci0JCXJldHVybiAtRU5PTUVNOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAl9CiAKKwlfZGVidWcoIkdPVCBJTk9ERSAlcCB7IHZsPSV4IHZuPSV4LCB1PSV4IH0iLAorCSAgICAgICBpbm9kZSwgZmlkLT52aWQsIGZpZC0+dm5vZGUsIGZpZC0+dW5pcXVlKTsKKwogCXZub2RlID0gQUZTX0ZTX0koaW5vZGUpOwogCiAJLyogZGVhbCB3aXRoIGFuIGV4aXN0aW5nIGlub2RlICovCiAJaWYgKCEoaW5vZGUtPmlfc3RhdGUgJiBJX05FVykpIHsKLQkJcmV0ID0gYWZzX3Zub2RlX2ZldGNoX3N0YXR1cyh2bm9kZSk7Ci0JCWlmIChyZXQ9PTApCi0JCQkqX2lub2RlID0gaW5vZGU7Ci0JCWVsc2UKLQkJCWlwdXQoaW5vZGUpOwotCQlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKKwkJX2xlYXZlKCIgPSAlcCIsIGlub2RlKTsKKwkJcmV0dXJuIGlub2RlOwogCX0KIAogI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKQEAgLTE4NiwxMDAgKzE1NywxODUgQEAKIAkJCSAgICAgICAmdm5vZGUtPmNhY2hlKTsKICNlbmRpZgogCi0JLyogb2theS4uLiBpdCdzIGEgbmV3IGlub2RlICovCi0JaW5vZGUtPmlfZmxhZ3MgfD0gU19OT0FUSU1FOwotCXZub2RlLT5mbGFncyB8PSBBRlNfVk5PREVfQ0hBTkdFRDsKLQlyZXQgPSBhZnNfaW5vZGVfZmV0Y2hfc3RhdHVzKGlub2RlKTsKLQlpZiAocmV0PDApCisJaWYgKCFzdGF0dXMpIHsKKwkJLyogaXQncyBhIHJlbW90ZWx5IGV4dGFudCBpbm9kZSAqLworCQlzZXRfYml0KEFGU19WTk9ERV9DQl9CUk9LRU4sICZ2bm9kZS0+ZmxhZ3MpOworCQlyZXQgPSBhZnNfdm5vZGVfZmV0Y2hfc3RhdHVzKHZub2RlLCBOVUxMLCBrZXkpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gYmFkX2lub2RlOworCX0gZWxzZSB7CisJCS8qIGl0J3MgYW4gaW5vZGUgd2UganVzdCBjcmVhdGVkICovCisJCW1lbWNweSgmdm5vZGUtPnN0YXR1cywgc3RhdHVzLCBzaXplb2Yodm5vZGUtPnN0YXR1cykpOworCisJCWlmICghY2IpIHsKKwkJCS8qIGl0J3MgYSBzeW1saW5rIHdlIGp1c3QgY3JlYXRlZCAodGhlIGZpbGVzZXJ2ZXIKKwkJCSAqIGRpZG4ndCBnaXZlIHVzIGEgY2FsbGJhY2spICovCisJCQl2bm9kZS0+Y2JfdmVyc2lvbiA9IDA7CisJCQl2bm9kZS0+Y2JfZXhwaXJ5ID0gMDsKKwkJCXZub2RlLT5jYl90eXBlID0gMDsKKwkJCXZub2RlLT5jYl9leHBpcmVzID0gZ2V0X3NlY29uZHMoKTsKKwkJfSBlbHNlIHsKKwkJCXZub2RlLT5jYl92ZXJzaW9uID0gY2ItPnZlcnNpb247CisJCQl2bm9kZS0+Y2JfZXhwaXJ5ID0gY2ItPmV4cGlyeTsKKwkJCXZub2RlLT5jYl90eXBlID0gY2ItPnR5cGU7CisJCQl2bm9kZS0+Y2JfZXhwaXJlcyA9IHZub2RlLT5jYl9leHBpcnkgKyBnZXRfc2Vjb25kcygpOworCQl9CisJfQorCisJcmV0ID0gYWZzX2lub2RlX21hcF9zdGF0dXModm5vZGUsIGtleSk7CisJaWYgKHJldCA8IDApCiAJCWdvdG8gYmFkX2lub2RlOwogCiAJLyogc3VjY2VzcyAqLworCWNsZWFyX2JpdChBRlNfVk5PREVfVU5TRVQsICZ2bm9kZS0+ZmxhZ3MpOworCWlub2RlLT5pX2ZsYWdzIHw9IFNfTk9BVElNRTsKIAl1bmxvY2tfbmV3X2lub2RlKGlub2RlKTsKLQotCSpfaW5vZGUgPSBpbm9kZTsKLQlfbGVhdmUoIiA9IDAgW0NCIHsgdj0ldSB4PSVsdSB0PSV1IH1dIiwKLQkgICAgICAgdm5vZGUtPmNiX3ZlcnNpb24sCi0JICAgICAgIHZub2RlLT5jYl90aW1lb3V0LnRpbW9famlmLAotCSAgICAgICB2bm9kZS0+Y2JfdHlwZSk7Ci0JcmV0dXJuIDA7CisJX2xlYXZlKCIgPSAlcCBbQ0IgeyB2PSV1IHQ9JXUgfV0iLCBpbm9kZSwgdm5vZGUtPmNiX3ZlcnNpb24sIHZub2RlLT5jYl90eXBlKTsKKwlyZXR1cm4gaW5vZGU7CiAKIAkvKiBmYWlsdXJlICovCi0gYmFkX2lub2RlOgorYmFkX2lub2RlOgogCW1ha2VfYmFkX2lub2RlKGlub2RlKTsKIAl1bmxvY2tfbmV3X2lub2RlKGlub2RlKTsKIAlpcHV0KGlub2RlKTsKIAogCV9sZWF2ZSgiID0gJWQgW2JhZF0iLCByZXQpOwotCXJldHVybiByZXQ7Ci19IC8qIGVuZCBhZnNfaWdldCgpICovCisJcmV0dXJuIEVSUl9QVFIocmV0KTsKK30KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIHZhbGlkYXRlIGEgdm5vZGUvaW5vZGUKKyAqIC0gdGhlcmUgYXJlIHNldmVyYWwgdGhpbmdzIHdlIG5lZWQgdG8gY2hlY2sKKyAqICAgLSBwYXJlbnQgZGlyIGRhdGEgY2hhbmdlcyAocm0sIHJtZGlyLCByZW5hbWUsIG1rZGlyLCBjcmVhdGUsIGxpbmssCisgKiAgICAgc3ltbGluaykKKyAqICAgLSBwYXJlbnQgZGlyIG1ldGFkYXRhIGNoYW5nZWQgKHNlY3VyaXR5IGNoYW5nZXMpCisgKiAgIC0gZGVudHJ5IGRhdGEgY2hhbmdlZCAod3JpdGUsIHRydW5jYXRlKQorICogICAtIGRlbnRyeSBtZXRhZGF0YSBjaGFuZ2VkIChzZWN1cml0eSBjaGFuZ2VzKQorICovCitpbnQgYWZzX3ZhbGlkYXRlKHN0cnVjdCBhZnNfdm5vZGUgKnZub2RlLCBzdHJ1Y3Qga2V5ICprZXkpCit7CisJaW50IHJldDsKKworCV9lbnRlcigie3Y9eyV4OiV1fSBmbD0lbHh9LCV4IiwKKwkgICAgICAgdm5vZGUtPmZpZC52aWQsIHZub2RlLT5maWQudm5vZGUsIHZub2RlLT5mbGFncywKKwkgICAgICAga2V5X3NlcmlhbChrZXkpKTsKKworCWlmICh2bm9kZS0+Y2JfcHJvbWlzZWQgJiYKKwkgICAgIXRlc3RfYml0KEFGU19WTk9ERV9DQl9CUk9LRU4sICZ2bm9kZS0+ZmxhZ3MpICYmCisJICAgICF0ZXN0X2JpdChBRlNfVk5PREVfTU9ESUZJRUQsICZ2bm9kZS0+ZmxhZ3MpICYmCisJICAgICF0ZXN0X2JpdChBRlNfVk5PREVfWkFQX0RBVEEsICZ2bm9kZS0+ZmxhZ3MpKSB7CisJCWlmICh2bm9kZS0+Y2JfZXhwaXJlcyA8IGdldF9zZWNvbmRzKCkgKyAxMCkgeworCQkJX2RlYnVnKCJjYWxsYmFjayBleHBpcmVkIik7CisJCQlzZXRfYml0KEFGU19WTk9ERV9DQl9CUk9LRU4sICZ2bm9kZS0+ZmxhZ3MpOworCQl9IGVsc2UgeworCQkJZ290byB2YWxpZDsKKwkJfQorCX0KKworCWlmICh0ZXN0X2JpdChBRlNfVk5PREVfREVMRVRFRCwgJnZub2RlLT5mbGFncykpCisJCWdvdG8gdmFsaWQ7CisKKwltdXRleF9sb2NrKCZ2bm9kZS0+dmFsaWRhdGVfbG9jayk7CisKKwkvKiBpZiB0aGUgcHJvbWlzZSBoYXMgZXhwaXJlZCwgd2UgbmVlZCB0byBjaGVjayB0aGUgc2VydmVyIGFnYWluIHRvIGdldAorCSAqIGEgbmV3IHByb21pc2UgLSBub3RlIHRoYXQgaWYgdGhlIChwYXJlbnQpIGRpcmVjdG9yeSdzIG1ldGFkYXRhIHdhcworCSAqIGNoYW5nZWQgdGhlbiB0aGUgc2VjdXJpdHkgbWF5IGJlIGRpZmZlcmVudCBhbmQgd2UgbWF5IG5vIGxvbmdlciBoYXZlCisJICogYWNjZXNzICovCisJaWYgKCF2bm9kZS0+Y2JfcHJvbWlzZWQgfHwKKwkgICAgdGVzdF9iaXQoQUZTX1ZOT0RFX0NCX0JST0tFTiwgJnZub2RlLT5mbGFncykpIHsKKwkJX2RlYnVnKCJub3QgcHJvbWlzZWQiKTsKKwkJcmV0ID0gYWZzX3Zub2RlX2ZldGNoX3N0YXR1cyh2bm9kZSwgTlVMTCwga2V5KTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIGVycm9yX3VubG9jazsKKwkJX2RlYnVnKCJuZXcgcHJvbWlzZSBbZmw9JWx4XSIsIHZub2RlLT5mbGFncyk7CisJfQorCisJaWYgKHRlc3RfYml0KEFGU19WTk9ERV9ERUxFVEVELCAmdm5vZGUtPmZsYWdzKSkgeworCQlfZGVidWcoImZpbGUgYWxyZWFkeSBkZWxldGVkIik7CisJCXJldCA9IC1FU1RBTEU7CisJCWdvdG8gZXJyb3JfdW5sb2NrOworCX0KKworCS8qIGlmIHRoZSB2bm9kZSdzIGRhdGEgdmVyc2lvbiBudW1iZXIgY2hhbmdlZCB0aGVuIGl0cyBjb250ZW50cyBhcmUKKwkgKiBkaWZmZXJlbnQgKi8KKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEFGU19WTk9ERV9aQVBfREFUQSwgJnZub2RlLT5mbGFncykpIHsKKwkJX2RlYnVnKCJ6YXAgZGF0YSB7JXg6JWR9Iiwgdm5vZGUtPmZpZC52aWQsIHZub2RlLT5maWQudm5vZGUpOworCQlpbnZhbGlkYXRlX3JlbW90ZV9pbm9kZSgmdm5vZGUtPnZmc19pbm9kZSk7CisJfQorCisJY2xlYXJfYml0KEFGU19WTk9ERV9NT0RJRklFRCwgJnZub2RlLT5mbGFncyk7CisJbXV0ZXhfdW5sb2NrKCZ2bm9kZS0+dmFsaWRhdGVfbG9jayk7Cit2YWxpZDoKKwlfbGVhdmUoIiA9IDAiKTsKKwlyZXR1cm4gMDsKKworZXJyb3JfdW5sb2NrOgorCW11dGV4X3VubG9jaygmdm5vZGUtPnZhbGlkYXRlX2xvY2spOworCV9sZWF2ZSgiID0gJWQiLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKIC8qCiAgKiByZWFkIHRoZSBhdHRyaWJ1dGVzIG9mIGFuIGlub2RlCiAgKi8KIGludCBhZnNfaW5vZGVfZ2V0YXR0cihzdHJ1Y3QgdmZzbW91bnQgKm1udCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAogCQkgICAgICBzdHJ1Y3Qga3N0YXQgKnN0YXQpCiB7Ci0Jc3RydWN0IGFmc192bm9kZSAqdm5vZGU7CiAJc3RydWN0IGlub2RlICppbm9kZTsKLQlpbnQgcmV0OwogCiAJaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CiAKIAlfZW50ZXIoInsgaW5vPSVsdSB2PSVsdSB9IiwgaW5vZGUtPmlfaW5vLCBpbm9kZS0+aV92ZXJzaW9uKTsKIAotCXZub2RlID0gQUZTX0ZTX0koaW5vZGUpOwotCi0JcmV0ID0gYWZzX2lub2RlX2ZldGNoX3N0YXR1cyhpbm9kZSk7Ci0JaWYgKHJldCA9PSAtRU5PRU5UKSB7Ci0JCV9sZWF2ZSgiID0gJWQgWyVkICVwXSIsCi0JCSAgICAgICByZXQsIGF0b21pY19yZWFkKCZkZW50cnktPmRfY291bnQpLCBkZW50cnktPmRfaW5vZGUpOwotCQlyZXR1cm4gcmV0OwotCX0KLQllbHNlIGlmIChyZXQgPCAwKSB7Ci0JCW1ha2VfYmFkX2lub2RlKGlub2RlKTsKLQkJX2xlYXZlKCIgPSAlZCIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyogdHJhbnNmZXIgYXR0cmlidXRlcyBmcm9tIHRoZSBpbm9kZSBzdHJ1Y3R1cmUgdG8gdGhlIHN0YXQKLQkgKiBzdHJ1Y3R1cmUgKi8KIAlnZW5lcmljX2ZpbGxhdHRyKGlub2RlLCBzdGF0KTsKLQotCV9sZWF2ZSgiID0gMCBDQiB7IHY9JXUgeD0ldSB0PSV1IH0iLAotCSAgICAgICB2bm9kZS0+Y2JfdmVyc2lvbiwKLQkgICAgICAgdm5vZGUtPmNiX2V4cGlyeSwKLQkgICAgICAgdm5vZGUtPmNiX3R5cGUpOwotCiAJcmV0dXJuIDA7Ci19IC8qIGVuZCBhZnNfaW5vZGVfZ2V0YXR0cigpICovCit9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCiAgKiBjbGVhciBhbiBBRlMgaW5vZGUKICAqLwogdm9pZCBhZnNfY2xlYXJfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKIHsKKwlzdHJ1Y3QgYWZzX3Blcm1pdHMgKnBlcm1pdHM7CiAJc3RydWN0IGFmc192bm9kZSAqdm5vZGU7CiAKIAl2bm9kZSA9IEFGU19GU19JKGlub2RlKTsKIAotCV9lbnRlcigiaW5vPSVsdSB7IHZuPSUwOHggdj0ldSB4PSV1IHQ9JXUgfSIsCi0JICAgICAgIGlub2RlLT5pX2lubywKKwlfZW50ZXIoInsleDolZC4lZH0gdj0ldSB4PSV1IHQ9JXUgfSIsCisJICAgICAgIHZub2RlLT5maWQudmlkLAogCSAgICAgICB2bm9kZS0+ZmlkLnZub2RlLAorCSAgICAgICB2bm9kZS0+ZmlkLnVuaXF1ZSwKIAkgICAgICAgdm5vZGUtPmNiX3ZlcnNpb24sCiAJICAgICAgIHZub2RlLT5jYl9leHBpcnksCi0JICAgICAgIHZub2RlLT5jYl90eXBlCi0JICAgICAgICk7CisJICAgICAgIHZub2RlLT5jYl90eXBlKTsKIAotCUJVR19PTihpbm9kZS0+aV9pbm8gIT0gdm5vZGUtPmZpZC52bm9kZSk7CisJX2RlYnVnKCJDTEVBUiBJTk9ERSAlcCIsIGlub2RlKTsKIAotCWFmc192bm9kZV9naXZlX3VwX2NhbGxiYWNrKHZub2RlKTsKKwlBU1NFUlRDTVAoaW5vZGUtPmlfaW5vLCA9PSwgdm5vZGUtPmZpZC52bm9kZSk7CisKKwlhZnNfZ2l2ZV91cF9jYWxsYmFjayh2bm9kZSk7CisKKwlpZiAodm5vZGUtPnNlcnZlcikgeworCQlzcGluX2xvY2soJnZub2RlLT5zZXJ2ZXItPmZzX2xvY2spOworCQlyYl9lcmFzZSgmdm5vZGUtPnNlcnZlcl9yYiwgJnZub2RlLT5zZXJ2ZXItPmZzX3Zub2Rlcyk7CisJCXNwaW5fdW5sb2NrKCZ2bm9kZS0+c2VydmVyLT5mc19sb2NrKTsKKwkJYWZzX3B1dF9zZXJ2ZXIodm5vZGUtPnNlcnZlcik7CisJCXZub2RlLT5zZXJ2ZXIgPSBOVUxMOworCX0KKworCUFTU0VSVCghdm5vZGUtPmNiX3Byb21pc2VkKTsKIAogI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKIAljYWNoZWZzX3JlbGlucXVpc2hfY29va2llKHZub2RlLT5jYWNoZSwgMCk7CiAJdm5vZGUtPmNhY2hlID0gTlVMTDsKICNlbmRpZgogCisJbXV0ZXhfbG9jaygmdm5vZGUtPnBlcm1pdHNfbG9jayk7CisJcGVybWl0cyA9IHZub2RlLT5wZXJtaXRzOworCXJjdV9hc3NpZ25fcG9pbnRlcih2bm9kZS0+cGVybWl0cywgTlVMTCk7CisJbXV0ZXhfdW5sb2NrKCZ2bm9kZS0+cGVybWl0c19sb2NrKTsKKwlpZiAocGVybWl0cykKKwkJY2FsbF9yY3UoJnBlcm1pdHMtPnJjdSwgYWZzX3phcF9wZXJtaXRzKTsKKwogCV9sZWF2ZSgiIik7Ci19IC8qIGVuZCBhZnNfY2xlYXJfaW5vZGUoKSAqLworfQpkaWZmIC0tZ2l0IGEvZnMvYWZzL2ludGVybmFsLmggYi9mcy9hZnMvaW50ZXJuYWwuaAppbmRleCA1MTUxZDVkLi4zNDY2NWY3IDEwMDY0NAotLS0gYS9mcy9hZnMvaW50ZXJuYWwuaAorKysgYi9mcy9hZnMvaW50ZXJuYWwuaApAQCAtMSw2ICsxLDYgQEAKLS8qIGludGVybmFsLmg6IGludGVybmFsIEFGUyBzdHVmZgorLyogaW50ZXJuYWwgQUZTIHN0dWZmCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgpAQCAtOSw0NyArOSwzOTAgQEAKICAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KIAotI2lmbmRlZiBBRlNfSU5URVJOQUxfSAotI2RlZmluZSBBRlNfSU5URVJOQUxfSAotCiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9yeHJwYy5oPgorI2luY2x1ZGUgPGxpbnV4L2tleS5oPgorI2luY2x1ZGUgImFmcy5oIgorI2luY2x1ZGUgImFmc192bC5oIgorCisjZGVmaW5lIEFGU19DRUxMX01BWF9BRERSUyAxNQorCitzdHJ1Y3QgYWZzX2NhbGw7CisKK3R5cGVkZWYgZW51bSB7CisJQUZTX1ZMX05FVywJCQkvKiBuZXcsIHVuaW5pdGlhbGlzZWQgcmVjb3JkICovCisJQUZTX1ZMX0NSRUFUSU5HLAkJLyogY3JlYXRpbmcgcmVjb3JkICovCisJQUZTX1ZMX1ZBTElELAkJCS8qIHJlY29yZCBpcyBwZW5kaW5nICovCisJQUZTX1ZMX05PX1ZPTFVNRSwJCS8qIG5vIHN1Y2ggdm9sdW1lIGF2YWlsYWJsZSAqLworCUFGU19WTF9VUERBVElORywJCS8qIHVwZGF0ZSBpbiBwcm9ncmVzcyAqLworCUFGU19WTF9WT0xVTUVfREVMRVRFRCwJCS8qIHZvbHVtZSB3YXMgZGVsZXRlZCAqLworCUFGU19WTF9VTkNFUlRBSU4sCQkvKiB1bmNlcnRhaW4gc3RhdGUgKHVwZGF0ZSBmYWlsZWQpICovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIGFmc192bG9jYXRpb25fc3RhdGVfdDsKKworc3RydWN0IGFmc19tb3VudF9wYXJhbXMgeworCWJvb2wJCQlyd3BhdGg7CQkvKiBUIGlmIHRoZSBwYXJlbnQgc2hvdWxkIGJlIGNvbnNpZGVyZWQgUi9XICovCisJYm9vbAkJCWZvcmNlOwkJLyogVCB0byBmb3JjZSBjZWxsIHR5cGUgKi8KKwlhZnNfdm9sdHlwZV90CQl0eXBlOwkJLyogdHlwZSBvZiB2b2x1bWUgcmVxdWVzdGVkICovCisJaW50CQkJdm9sbmFtZXN6OwkvKiBzaXplIG9mIHZvbHVtZSBuYW1lICovCisJY29uc3QgY2hhcgkJKnZvbG5hbWU7CS8qIG5hbWUgb2Ygdm9sdW1lIHRvIG1vdW50ICovCisJc3RydWN0IGFmc19jZWxsCQkqY2VsbDsJCS8qIGNlbGwgaW4gd2hpY2ggdG8gZmluZCB2b2x1bWUgKi8KKwlzdHJ1Y3QgYWZzX3ZvbHVtZQkqdm9sdW1lOwkvKiB2b2x1bWUgcmVjb3JkICovCisJc3RydWN0IGtleQkJKmtleTsJCS8qIGtleSB0byB1c2UgZm9yIHNlY3VyZSBtb3VudGluZyAqLworfTsKIAogLyoKLSAqIGRlYnVnIHRyYWNpbmcKKyAqIGRlZmluaXRpb24gb2YgaG93IHRvIHdhaXQgZm9yIHRoZSBjb21wbGV0aW9uIG9mIGFuIG9wZXJhdGlvbgogICovCi0jZGVmaW5lIGtlbnRlcihGTVQsIGEuLi4pCXByaW50aygiPT0+ICVzKCJGTVQiKVxuIixfX0ZVTkNUSU9OX18gLCAjIyBhKQotI2RlZmluZSBrbGVhdmUoRk1ULCBhLi4uKQlwcmludGsoIjw9PSAlcygpIkZNVCJcbiIsX19GVU5DVElPTl9fICwgIyMgYSkKLSNkZWZpbmUga2RlYnVnKEZNVCwgYS4uLikJcHJpbnRrKEZNVCJcbiIgLCAjIyBhKQotI2RlZmluZSBrcHJvdG8oRk1ULCBhLi4uKQlwcmludGsoIiMjIyAiRk1UIlxuIiAsICMjIGEpCi0jZGVmaW5lIGtuZXQoRk1ULCBhLi4uKQkJcHJpbnRrKEZNVCJcbiIgLCAjIyBhKQorc3RydWN0IGFmc193YWl0X21vZGUgeworCS8qIFJ4UlBDIHJlY2VpdmVkIG1lc3NhZ2Ugbm90aWZpY2F0aW9uICovCisJdm9pZCAoKnJ4X3dha2V1cCkoc3RydWN0IGFmc19jYWxsICpjYWxsKTsKIAotI2lmZGVmIF9fS0RFQlVHCi0jZGVmaW5lIF9lbnRlcihGTVQsIGEuLi4pCWtlbnRlcihGTVQgLCAjIyBhKQotI2RlZmluZSBfbGVhdmUoRk1ULCBhLi4uKQlrbGVhdmUoRk1UICwgIyMgYSkKLSNkZWZpbmUgX2RlYnVnKEZNVCwgYS4uLikJa2RlYnVnKEZNVCAsICMjIGEpCi0jZGVmaW5lIF9wcm90byhGTVQsIGEuLi4pCWtwcm90byhGTVQgLCAjIyBhKQotI2RlZmluZSBfbmV0KEZNVCwgYS4uLikJCWtuZXQoRk1UICwgIyMgYSkKLSNlbHNlCi0jZGVmaW5lIF9lbnRlcihGTVQsIGEuLi4pCWRvIHsgfSB3aGlsZSgwKQotI2RlZmluZSBfbGVhdmUoRk1ULCBhLi4uKQlkbyB7IH0gd2hpbGUoMCkKLSNkZWZpbmUgX2RlYnVnKEZNVCwgYS4uLikJZG8geyB9IHdoaWxlKDApCi0jZGVmaW5lIF9wcm90byhGTVQsIGEuLi4pCWRvIHsgfSB3aGlsZSgwKQotI2RlZmluZSBfbmV0KEZNVCwgYS4uLikJCWRvIHsgfSB3aGlsZSgwKQorCS8qIHN5bmNocm9ub3VzIGNhbGwgd2FpdGVyIGFuZCBjYWxsIGRpc3BhdGNoZWQgbm90aWZpY2F0aW9uICovCisJaW50ICgqd2FpdCkoc3RydWN0IGFmc19jYWxsICpjYWxsKTsKKworCS8qIGFzeW5jaHJvbm91cyBjYWxsIGNvbXBsZXRpb24gKi8KKwl2b2lkICgqYXN5bmNfY29tcGxldGUpKHZvaWQgKnJlcGx5LCBpbnQgZXJyb3IpOworfTsKKworZXh0ZXJuIGNvbnN0IHN0cnVjdCBhZnNfd2FpdF9tb2RlIGFmc19zeW5jX2NhbGw7CitleHRlcm4gY29uc3Qgc3RydWN0IGFmc193YWl0X21vZGUgYWZzX2FzeW5jX2NhbGw7CisKKy8qCisgKiBhIHJlY29yZCBvZiBhbiBpbi1wcm9ncmVzcyBSeFJQQyBjYWxsCisgKi8KK3N0cnVjdCBhZnNfY2FsbCB7CisJY29uc3Qgc3RydWN0IGFmc19jYWxsX3R5cGUgKnR5cGU7CS8qIHR5cGUgb2YgY2FsbCAqLworCWNvbnN0IHN0cnVjdCBhZnNfd2FpdF9tb2RlICp3YWl0X21vZGU7CS8qIGNvbXBsZXRpb24gd2FpdCBtb2RlICovCisJd2FpdF9xdWV1ZV9oZWFkX3QJd2FpdHE7CQkvKiBwcm9jZXNzZXMgYXdhaXRpbmcgY29tcGxldGlvbiAqLworCXN0cnVjdCB3b3JrX3N0cnVjdAlhc3luY193b3JrOwkvKiBhc3luY2hyb25vdXMgd29yayBwcm9jZXNzb3IgKi8KKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJd29yazsJCS8qIGFjdHVhbCB3b3JrIHByb2Nlc3NvciAqLworCXN0cnVjdCBza19idWZmX2hlYWQJcnhfcXVldWU7CS8qIHJlY2VpdmVkIHBhY2tldHMgKi8KKwlzdHJ1Y3QgcnhycGNfY2FsbAkqcnhjYWxsOwkvKiBSeFJQQyBjYWxsIGhhbmRsZSAqLworCXN0cnVjdCBrZXkJCSprZXk7CQkvKiBzZWN1cml0eSBmb3IgdGhpcyBjYWxsICovCisJc3RydWN0IGFmc19zZXJ2ZXIJKnNlcnZlcjsJLyogc2VydmVyIGFmZmVjdGVkIGJ5IGluY29taW5nIENNIGNhbGwgKi8KKwl2b2lkCQkJKnJlcXVlc3Q7CS8qIHJlcXVlc3QgZGF0YSAoZmlyc3QgcGFydCkgKi8KKwl2b2lkCQkJKnJlcXVlc3QyOwkvKiByZXF1ZXN0IGRhdGEgKHNlY29uZCBwYXJ0KSAqLworCXZvaWQJCQkqYnVmZmVyOwkvKiByZXBseSByZWNlaXZlIGJ1ZmZlciAqLworCXZvaWQJCQkqcmVwbHk7CQkvKiByZXBseSBidWZmZXIgKGZpcnN0IHBhcnQpICovCisJdm9pZAkJCSpyZXBseTI7CS8qIHJlcGx5IGJ1ZmZlciAoc2Vjb25kIHBhcnQpICovCisJdm9pZAkJCSpyZXBseTM7CS8qIHJlcGx5IGJ1ZmZlciAodGhpcmQgcGFydCkgKi8KKwl2b2lkCQkJKnJlcGx5NDsJLyogcmVwbHkgYnVmZmVyIChmb3VydGggcGFydCkgKi8KKwllbnVtIHsJCQkJCS8qIGNhbGwgc3RhdGUgKi8KKwkJQUZTX0NBTExfUkVRVUVTVElORywJLyogcmVxdWVzdCBpcyBiZWluZyBzZW50IGZvciBvdXRnb2luZyBjYWxsICovCisJCUFGU19DQUxMX0FXQUlUX1JFUExZLAkvKiBhd2FpdGluZyByZXBseSB0byBvdXRnb2luZyBjYWxsICovCisJCUFGU19DQUxMX0FXQUlUX09QX0lELAkvKiBhd2FpdGluZyBvcCBJRCBvbiBpbmNvbWluZyBjYWxsICovCisJCUFGU19DQUxMX0FXQUlUX1JFUVVFU1QsCS8qIGF3YWl0aW5nIHJlcXVlc3QgZGF0YSBvbiBpbmNvbWluZyBjYWxsICovCisJCUFGU19DQUxMX1JFUExZSU5HLAkvKiByZXBseWluZyB0byBpbmNvbWluZyBjYWxsICovCisJCUFGU19DQUxMX0FXQUlUX0FDSywJLyogYXdhaXRpbmcgZmluYWwgQUNLIG9mIGluY29taW5nIGNhbGwgKi8KKwkJQUZTX0NBTExfQ09NUExFVEUsCS8qIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQgKi8KKwkJQUZTX0NBTExfQlVTWSwJCS8qIHNlcnZlciB3YXMgYnVzeSAqLworCQlBRlNfQ0FMTF9BQk9SVEVELAkvKiBjYWxsIHdhcyBhYm9ydGVkICovCisJCUFGU19DQUxMX0VSUk9SLAkJLyogY2FsbCBmYWlsZWQgZHVlIHRvIGVycm9yICovCisJfQkJCXN0YXRlOworCWludAkJCWVycm9yOwkJLyogZXJyb3IgY29kZSAqLworCXVuc2lnbmVkCQlyZXF1ZXN0X3NpemU7CS8qIHNpemUgb2YgcmVxdWVzdCBkYXRhICovCisJdW5zaWduZWQJCXJlcGx5X21heDsJLyogbWF4aW11bSBzaXplIG9mIHJlcGx5ICovCisJdW5zaWduZWQJCXJlcGx5X3NpemU7CS8qIGN1cnJlbnQgc2l6ZSBvZiByZXBseSAqLworCXVuc2lnbmVkIHNob3J0CQlvZmZzZXQ7CQkvKiBvZmZzZXQgaW50byByZWNlaXZlZCBkYXRhIHN0b3JlICovCisJdW5zaWduZWQgY2hhcgkJdW5tYXJzaGFsbDsJLyogdW5tYXJzaGFsbGluZyBwaGFzZSAqLworCWJvb2wJCQlpbmNvbWluZzsJLyogVCBpZiBpbmNvbWluZyBjYWxsICovCisJdTE2CQkJc2VydmljZV9pZDsJLyogUnhSUEMgc2VydmljZSBJRCB0byBjYWxsICovCisJX19iZTE2CQkJcG9ydDsJCS8qIHRhcmdldCBVRFAgcG9ydCAqLworCV9fYmUzMgkJCW9wZXJhdGlvbl9JRDsJLyogb3BlcmF0aW9uIElEIGZvciBhbiBpbmNvbWluZyBjYWxsICovCisJdTMyCQkJY291bnQ7CQkvKiBjb3VudCBmb3IgdXNlIGluIHVubWFyc2hhbGxpbmcgKi8KKwlfX2JlMzIJCQl0bXA7CQkvKiBwbGFjZSB0byBleHRyYWN0IHRlbXBvcmFyeSBkYXRhICovCit9OworCitzdHJ1Y3QgYWZzX2NhbGxfdHlwZSB7CisJY29uc3QgY2hhciAqbmFtZTsKKworCS8qIGRlbGl2ZXIgcmVxdWVzdCBvciByZXBseSBkYXRhIHRvIGFuIGNhbGwKKwkgKiAtIHJldHVybmluZyBhbiBlcnJvciB3aWxsIGNhdXNlIHRoZSBjYWxsIHRvIGJlIGFib3J0ZWQKKwkgKi8KKwlpbnQgKCpkZWxpdmVyKShzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwsIHN0cnVjdCBza19idWZmICpza2IsCisJCSAgICAgICBib29sIGxhc3QpOworCisJLyogbWFwIGFuIGFib3J0IGNvZGUgdG8gYW4gZXJyb3IgbnVtYmVyICovCisJaW50ICgqYWJvcnRfdG9fZXJyb3IpKHUzMiBhYm9ydF9jb2RlKTsKKworCS8qIGNsZWFuIHVwIGEgY2FsbCAqLworCXZvaWQgKCpkZXN0cnVjdG9yKShzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwpOworfTsKKworLyoKKyAqIEFGUyBzdXBlcmJsb2NrIHByaXZhdGUgZGF0YQorICogLSB0aGVyZSdzIG9uZSBzdXBlcmJsb2NrIHBlciB2b2x1bWUKKyAqLworc3RydWN0IGFmc19zdXBlcl9pbmZvIHsKKwlzdHJ1Y3QgYWZzX3ZvbHVtZQkqdm9sdW1lOwkvKiB2b2x1bWUgcmVjb3JkICovCisJY2hhcgkJCXJ3cGFyZW50OwkvKiBUIGlmIHBhcmVudCBpcyBSL1cgQUZTIHZvbHVtZSAqLworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgYWZzX3N1cGVyX2luZm8gKkFGU19GU19TKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJcmV0dXJuIHNiLT5zX2ZzX2luZm87Cit9CisKK2V4dGVybiBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBhZnNfZnNfdHlwZTsKKworLyoKKyAqIGVudHJ5IGluIHRoZSBjYWNoZWQgY2VsbCBjYXRhbG9ndWUKKyAqLworc3RydWN0IGFmc19jYWNoZV9jZWxsIHsKKwljaGFyCQluYW1lW0FGU19NQVhDRUxMTkFNRV07CS8qIGNlbGwgbmFtZSAocGFkZGVkIHdpdGggTlVMcykgKi8KKwlzdHJ1Y3QgaW5fYWRkcgl2bF9zZXJ2ZXJzWzE1XTsJCS8qIGNhY2hlZCBjZWxsIFZMIHNlcnZlcnMgKi8KK307CisKKy8qCisgKiBBRlMgY2VsbCByZWNvcmQKKyAqLworc3RydWN0IGFmc19jZWxsIHsKKwlhdG9taWNfdAkJdXNhZ2U7CisJc3RydWN0IGxpc3RfaGVhZAlsaW5rOwkJLyogbWFpbiBjZWxsIGxpc3QgbGluayAqLworCXN0cnVjdCBrZXkJCSphbm9ueW1vdXNfa2V5OwkvKiBhbm9ueW1vdXMgdXNlciBrZXkgZm9yIHRoaXMgY2VsbCAqLworCXN0cnVjdCBsaXN0X2hlYWQJcHJvY19saW5rOwkvKiAvcHJvYyBjZWxsIGxpc3QgbGluayAqLworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeQkqcHJvY19kaXI7CS8qIC9wcm9jIGRpciBmb3IgdGhpcyBjZWxsICovCisjaWZkZWYgQUZTX0NBQ0hJTkdfU1VQUE9SVAorCXN0cnVjdCBjYWNoZWZzX2Nvb2tpZQkqY2FjaGU7CQkvKiBjYWNoaW5nIGNvb2tpZSAqLwogI2VuZGlmCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBhZnNfZGlzY2FyZF9teV9zaWduYWxzKHZvaWQpCi17Ci0Jd2hpbGUgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7Ci0JCXNpZ2luZm9fdCBzaW5mbzsKKwkvKiBzZXJ2ZXIgcmVjb3JkIG1hbmFnZW1lbnQgKi8KKwlyd2xvY2tfdAkJc2VydmVyc19sb2NrOwkvKiBhY3RpdmUgc2VydmVyIGxpc3QgbG9jayAqLworCXN0cnVjdCBsaXN0X2hlYWQJc2VydmVyczsJLyogYWN0aXZlIHNlcnZlciBsaXN0ICovCiAKLQkJc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7Ci0JCWRlcXVldWVfc2lnbmFsKGN1cnJlbnQsJmN1cnJlbnQtPmJsb2NrZWQsICZzaW5mbyk7Ci0JCXNwaW5fdW5sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7Ci0JfQotfQorCS8qIHZvbHVtZSBsb2NhdGlvbiByZWNvcmQgbWFuYWdlbWVudCAqLworCXN0cnVjdCByd19zZW1hcGhvcmUJdmxfc2VtOwkJLyogdm9sdW1lIG1hbmFnZW1lbnQgc2VyaWFsaXNhdGlvbiBzZW1hcGhvcmUgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCXZsX2xpc3Q7CS8qIGNlbGwncyBhY3RpdmUgVkwgcmVjb3JkIGxpc3QgKi8KKwlzcGlubG9ja190CQl2bF9sb2NrOwkvKiB2bF9saXN0IGxvY2sgKi8KKwl1bnNpZ25lZCBzaG9ydAkJdmxfbmFkZHJzOwkvKiBudW1iZXIgb2YgVkwgc2VydmVycyBpbiBhZGRyIGxpc3QgKi8KKwl1bnNpZ25lZCBzaG9ydAkJdmxfY3Vycl9zdml4OwkvKiBjdXJyZW50IHNlcnZlciBpbmRleCAqLworCXN0cnVjdCBpbl9hZGRyCQl2bF9hZGRyc1tBRlNfQ0VMTF9NQVhfQUREUlNdOwkvKiBjZWxsIFZMIHNlcnZlciBhZGRyZXNzZXMgKi8KKworCWNoYXIJCQluYW1lWzBdOwkvKiBjZWxsIG5hbWUgLSBtdXN0IGdvIGxhc3QgKi8KK307CisKKy8qCisgKiBlbnRyeSBpbiB0aGUgY2FjaGVkIHZvbHVtZSBsb2NhdGlvbiBjYXRhbG9ndWUKKyAqLworc3RydWN0IGFmc19jYWNoZV92bG9jYXRpb24geworCS8qIHZvbHVtZSBuYW1lIChsb3dlcmNhc2UsIHBhZGRlZCB3aXRoIE5VTHMpICovCisJdWludDhfdAkJCW5hbWVbQUZTX01BWFZPTE5BTUUgKyAxXTsKKworCXVpbnQ4X3QJCQluc2VydmVyczsJLyogbnVtYmVyIG9mIGVudHJpZXMgdXNlZCBpbiBzZXJ2ZXJzW10gKi8KKwl1aW50OF90CQkJdmlkbWFzazsJLyogdm9sdHlwZSBtYXNrIGZvciB2aWRbXSAqLworCXVpbnQ4X3QJCQlzcnZ0bWFza1s4XTsJLyogdm9sdHlwZSBtYXNrcyBmb3Igc2VydmVyc1tdICovCisjZGVmaW5lIEFGU19WT0xfVlRNX1JXCTB4MDEgLyogUi9XIHZlcnNpb24gb2YgdGhlIHZvbHVtZSBpcyBhdmFpbGFibGUgKG9uIHRoaXMgc2VydmVyKSAqLworI2RlZmluZSBBRlNfVk9MX1ZUTV9STwkweDAyIC8qIFIvTyB2ZXJzaW9uIG9mIHRoZSB2b2x1bWUgaXMgYXZhaWxhYmxlIChvbiB0aGlzIHNlcnZlcikgKi8KKyNkZWZpbmUgQUZTX1ZPTF9WVE1fQkFLCTB4MDQgLyogYmFja3VwIHZlcnNpb24gb2YgdGhlIHZvbHVtZSBpcyBhdmFpbGFibGUgKG9uIHRoaXMgc2VydmVyKSAqLworCisJYWZzX3ZvbGlkX3QJCXZpZFszXTsJCS8qIHZvbHVtZSBJRHMgZm9yIFIvVywgUi9PIGFuZCBCYWsgdm9sdW1lcyAqLworCXN0cnVjdCBpbl9hZGRyCQlzZXJ2ZXJzWzhdOwkvKiBmaWxlc2VydmVyIGFkZHJlc3NlcyAqLworCXRpbWVfdAkJCXJ0aW1lOwkJLyogbGFzdCByZXRyaWV2YWwgdGltZSAqLworfTsKKworLyoKKyAqIHZvbHVtZSAtPiB2bm9kZSBoYXNoIHRhYmxlIGVudHJ5CisgKi8KK3N0cnVjdCBhZnNfY2FjaGVfdmhhc2ggeworCWFmc192b2x0eXBlX3QJCXZ0eXBlOwkJLyogd2hpY2ggdm9sdW1lIHZhcmlhdGlvbiAqLworCXVpbnQ4X3QJCQloYXNoX2J1Y2tldDsJLyogd2hpY2ggaGFzaCBidWNrZXQgdGhpcyByZXByZXNlbnRzICovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKgorICogQUZTIHZvbHVtZSBsb2NhdGlvbiByZWNvcmQKKyAqLworc3RydWN0IGFmc192bG9jYXRpb24geworCWF0b21pY190CQl1c2FnZTsKKwl0aW1lX3QJCQl0aW1lX29mX2RlYXRoOwkvKiB0aW1lIGF0IHdoaWNoIHB1dCByZWR1Y2VkIHVzYWdlIHRvIDAgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpbms7CQkvKiBsaW5rIGluIGNlbGwgdm9sdW1lIGxvY2F0aW9uIGxpc3QgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCWdyYXZlOwkJLyogbGluayBpbiBtYXN0ZXIgZ3JhdmV5YXJkIGxpc3QgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCXVwZGF0ZTsJCS8qIGxpbmsgaW4gbWFzdGVyIHVwZGF0ZSBsaXN0ICovCisJc3RydWN0IGFmc19jZWxsCQkqY2VsbDsJCS8qIGNlbGwgdG8gd2hpY2ggdm9sdW1lIGJlbG9uZ3MgKi8KKyNpZmRlZiBBRlNfQ0FDSElOR19TVVBQT1JUCisJc3RydWN0IGNhY2hlZnNfY29va2llCSpjYWNoZTsJCS8qIGNhY2hpbmcgY29va2llICovCisjZW5kaWYKKwlzdHJ1Y3QgYWZzX2NhY2hlX3Zsb2NhdGlvbiB2bGRiOwkvKiB2b2x1bWUgaW5mb3JtYXRpb24gREIgcmVjb3JkICovCisJc3RydWN0IGFmc192b2x1bWUJKnZvbHNbM107CS8qIHZvbHVtZSBhY2Nlc3MgcmVjb3JkIHBvaW50ZXIgKGluZGV4IGJ5IHR5cGUpICovCisJd2FpdF9xdWV1ZV9oZWFkX3QJd2FpdHE7CQkvKiBzdGF0dXMgY2hhbmdlIHdhaXRxdWV1ZSAqLworCXRpbWVfdAkJCXVwZGF0ZV9hdDsJLyogdGltZSBhdCB3aGljaCByZWNvcmQgc2hvdWxkIGJlIHVwZGF0ZWQgKi8KKwlzcGlubG9ja190CQlsb2NrOwkJLyogYWNjZXNzIGxvY2sgKi8KKwlhZnNfdmxvY2F0aW9uX3N0YXRlX3QJc3RhdGU7CQkvKiB2b2x1bWUgbG9jYXRpb24gc3RhdGUgKi8KKwl1bnNpZ25lZCBzaG9ydAkJdXBkX3Jlal9jbnQ7CS8qIEVOT01FRElVTSBjb3VudCBkdXJpbmcgdXBkYXRlICovCisJdW5zaWduZWQgc2hvcnQJCXVwZF9idXN5X2NudDsJLyogRUJVU1kgY291bnQgZHVyaW5nIHVwZGF0ZSAqLworCWJvb2wJCQl2YWxpZDsJCS8qIFQgaWYgdmFsaWQgKi8KK307CisKKy8qCisgKiBBRlMgZmlsZXNlcnZlciByZWNvcmQKKyAqLworc3RydWN0IGFmc19zZXJ2ZXIgeworCWF0b21pY190CQl1c2FnZTsKKwl0aW1lX3QJCQl0aW1lX29mX2RlYXRoOwkvKiB0aW1lIGF0IHdoaWNoIHB1dCByZWR1Y2VkIHVzYWdlIHRvIDAgKi8KKwlzdHJ1Y3QgaW5fYWRkcgkJYWRkcjsJCS8qIHNlcnZlciBhZGRyZXNzICovCisJc3RydWN0IGFmc19jZWxsCQkqY2VsbDsJCS8qIGNlbGwgaW4gd2hpY2ggc2VydmVyIHJlc2lkZXMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpbms7CQkvKiBsaW5rIGluIGNlbGwncyBzZXJ2ZXIgbGlzdCAqLworCXN0cnVjdCBsaXN0X2hlYWQJZ3JhdmU7CQkvKiBsaW5rIGluIG1hc3RlciBncmF2ZXlhcmQgbGlzdCAqLworCXN0cnVjdCByYl9ub2RlCQltYXN0ZXJfcmI7CS8qIGxpbmsgaW4gbWFzdGVyIGJ5LWFkZHIgdHJlZSAqLworCXN0cnVjdCByd19zZW1hcGhvcmUJc2VtOwkJLyogYWNjZXNzIGxvY2sgKi8KKworCS8qIGZpbGUgc2VydmljZSBhY2Nlc3MgKi8KKwlzdHJ1Y3QgcmJfcm9vdAkJZnNfdm5vZGVzOwkvKiB2bm9kZXMgYmFja2VkIGJ5IHRoaXMgc2VydmVyIChvcmRlcmVkIGJ5IEZJRCkgKi8KKwl1bnNpZ25lZCBsb25nCQlmc19hY3RfamlmOwkvKiB0aW1lIGF0IHdoaWNoIGxhc3QgYWN0aXZpdHkgb2NjdXJyZWQgKi8KKwl1bnNpZ25lZCBsb25nCQlmc19kZWFkX2ppZjsJLyogdGltZSBhdCB3aGljaCBubyBsb25nZXIgdG8gYmUgY29uc2lkZXJlZCBkZWFkICovCisJc3BpbmxvY2tfdAkJZnNfbG9jazsJLyogYWNjZXNzIGxvY2sgKi8KKwlpbnQJCQlmc19zdGF0ZTsgICAgICAJLyogMCBvciByZWFzb24gRlMgY3VycmVudGx5IG1hcmtlZCBkZWFkICgtZXJybm8pICovCisKKwkvKiBjYWxsYmFjayBwcm9taXNlIG1hbmFnZW1lbnQgKi8KKwlzdHJ1Y3QgcmJfcm9vdAkJY2JfcHJvbWlzZXM7CS8qIHZub2RlIGV4cGlyYXRpb24gbGlzdCAob3JkZXJlZCBlYXJsaWVzdCBmaXJzdCkgKi8KKwlzdHJ1Y3QgZGVsYXllZF93b3JrCWNiX3VwZGF0ZXI7CS8qIGNhbGxiYWNrIHVwZGF0ZXIgKi8KKwlzdHJ1Y3QgZGVsYXllZF93b3JrCWNiX2JyZWFrX3dvcms7CS8qIGNvbGxlY3RlZCBicmVhayBkaXNwYXRjaGVyICovCisJd2FpdF9xdWV1ZV9oZWFkX3QJY2JfYnJlYWtfd2FpdHE7CS8qIHNwYWNlIGF2YWlsYWJsZSBpbiBjYl9icmVhayB3YWl0cXVldWUgKi8KKwlzcGlubG9ja190CQljYl9sb2NrOwkvKiBhY2Nlc3MgbG9jayAqLworCXN0cnVjdCBhZnNfY2FsbGJhY2sJY2JfYnJlYWtbNjRdOwkvKiByaW5nIG9mIGNhbGxiYWNrcyBhd2FpdGluZyBicmVha2luZyAqLworCWF0b21pY190CQljYl9icmVha19uOwkvKiBudW1iZXIgb2YgcGVuZGluZyBicmVha3MgKi8KKwl1OAkJCWNiX2JyZWFrX2hlYWQ7CS8qIGhlYWQgb2YgY2FsbGJhY2sgYnJlYWtpbmcgcmluZyAqLworCXU4CQkJY2JfYnJlYWtfdGFpbDsJLyogdGFpbCBvZiBjYWxsYmFjayBicmVha2luZyByaW5nICovCit9OworCisvKgorICogQUZTIHZvbHVtZSBhY2Nlc3MgcmVjb3JkCisgKi8KK3N0cnVjdCBhZnNfdm9sdW1lIHsKKwlhdG9taWNfdAkJdXNhZ2U7CisJc3RydWN0IGFmc19jZWxsCQkqY2VsbDsJCS8qIGNlbGwgdG8gd2hpY2ggYmVsb25ncyAodW5yZWZkIHB0cikgKi8KKwlzdHJ1Y3QgYWZzX3Zsb2NhdGlvbgkqdmxvY2F0aW9uOwkvKiB2b2x1bWUgbG9jYXRpb24gKi8KKyNpZmRlZiBBRlNfQ0FDSElOR19TVVBQT1JUCisJc3RydWN0IGNhY2hlZnNfY29va2llCSpjYWNoZTsJCS8qIGNhY2hpbmcgY29va2llICovCisjZW5kaWYKKwlhZnNfdm9saWRfdAkJdmlkOwkJLyogdm9sdW1lIElEICovCisJYWZzX3ZvbHR5cGVfdAkJdHlwZTsJCS8qIHR5cGUgb2Ygdm9sdW1lICovCisJY2hhcgkJCXR5cGVfZm9yY2U7CS8qIGZvcmNlIHZvbHVtZSB0eXBlIChzdXBwcmVzcyBSL08gLT4gUi9XKSAqLworCXVuc2lnbmVkIHNob3J0CQluc2VydmVyczsJLyogbnVtYmVyIG9mIHNlcnZlciBzbG90cyBmaWxsZWQgKi8KKwl1bnNpZ25lZCBzaG9ydAkJcmpzZXJ2ZXJzOwkvKiBudW1iZXIgb2Ygc2VydmVycyBkaXNjYXJkZWQgZHVlIHRvIC1FTk9NRURJVU0gKi8KKwlzdHJ1Y3QgYWZzX3NlcnZlcgkqc2VydmVyc1s4XTsJLyogc2VydmVycyBvbiB3aGljaCB2b2x1bWUgcmVzaWRlcyAob3JkZXJlZCkgKi8KKwlzdHJ1Y3Qgcndfc2VtYXBob3JlCXNlcnZlcl9zZW07CS8qIGxvY2sgZm9yIGFjY2Vzc2luZyBjdXJyZW50IHNlcnZlciAqLworfTsKKworLyoKKyAqIHZub2RlIGNhdGFsb2d1ZSBlbnRyeQorICovCitzdHJ1Y3QgYWZzX2NhY2hlX3Zub2RlIHsKKwlhZnNfdm5vZGVpZF90CQl2bm9kZV9pZDsJLyogdm5vZGUgSUQgKi8KKwl1bnNpZ25lZAkJdm5vZGVfdW5pcXVlOwkvKiB2bm9kZSBJRCB1bmlxdWlmaWVyICovCisJYWZzX2RhdGF2ZXJzaW9uX3QJZGF0YV92ZXJzaW9uOwkvKiBkYXRhIHZlcnNpb24gKi8KK307CisKKy8qCisgKiBBRlMgaW5vZGUgcHJpdmF0ZSBkYXRhCisgKi8KK3N0cnVjdCBhZnNfdm5vZGUgeworCXN0cnVjdCBpbm9kZQkJdmZzX2lub2RlOwkvKiB0aGUgVkZTJ3MgaW5vZGUgcmVjb3JkICovCisKKwlzdHJ1Y3QgYWZzX3ZvbHVtZQkqdm9sdW1lOwkvKiB2b2x1bWUgb24gd2hpY2ggdm5vZGUgcmVzaWRlcyAqLworCXN0cnVjdCBhZnNfc2VydmVyCSpzZXJ2ZXI7CS8qIHNlcnZlciBjdXJyZW50bHkgc3VwcGx5aW5nIHRoaXMgZmlsZSAqLworCXN0cnVjdCBhZnNfZmlkCQlmaWQ7CQkvKiB0aGUgZmlsZSBpZGVudGlmaWVyIGZvciB0aGlzIGlub2RlICovCisJc3RydWN0IGFmc19maWxlX3N0YXR1cwlzdGF0dXM7CQkvKiBBRlMgc3RhdHVzIGluZm8gZm9yIHRoaXMgZmlsZSAqLworI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKKwlzdHJ1Y3QgY2FjaGVmc19jb29raWUJKmNhY2hlOwkJLyogY2FjaGluZyBjb29raWUgKi8KKyNlbmRpZgorCXN0cnVjdCBhZnNfcGVybWl0cwkqcGVybWl0czsJLyogY2FjaGUgb2YgcGVybWl0cyBzbyBmYXIgb2J0YWluZWQgKi8KKwlzdHJ1Y3QgbXV0ZXgJCXBlcm1pdHNfbG9jazsJLyogbG9jayBmb3IgYWx0ZXJpbmcgcGVybWl0cyBsaXN0ICovCisJc3RydWN0IG11dGV4CQl2YWxpZGF0ZV9sb2NrOwkvKiBsb2NrIGZvciB2YWxpZGF0aW5nIHRoaXMgdm5vZGUgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdAl1cGRhdGVfd2FpdHE7CS8qIHN0YXR1cyBmZXRjaCB3YWl0cXVldWUgKi8KKwlpbnQJCQl1cGRhdGVfY250OwkvKiBudW1iZXIgb2Ygb3V0c3RhbmRpbmcgb3BzIHRoYXQgd2lsbCB1cGRhdGUgdGhlCisJCQkJCQkgKiBzdGF0dXMgKi8KKwlzcGlubG9ja190CQlsb2NrOwkJLyogd2FpdHF1ZXVlL2ZsYWdzIGxvY2sgKi8KKwl1bnNpZ25lZCBsb25nCQlmbGFnczsKKyNkZWZpbmUgQUZTX1ZOT0RFX0NCX0JST0tFTgkwCQkvKiBzZXQgaWYgdm5vZGUncyBjYWxsYmFjayB3YXMgYnJva2VuICovCisjZGVmaW5lIEFGU19WTk9ERV9VTlNFVAkJMQkJLyogc2V0IGlmIHZub2RlIGF0dHJpYnV0ZXMgbm90IHlldCBzZXQgKi8KKyNkZWZpbmUgQUZTX1ZOT0RFX01PRElGSUVECTIJCS8qIHNldCBpZiB2bm9kZSdzIGRhdGEgbW9kaWZpZWQgKi8KKyNkZWZpbmUgQUZTX1ZOT0RFX1pBUF9EQVRBCTMJCS8qIHNldCBpZiB2bm9kZSdzIGRhdGEgc2hvdWxkIGJlIGludmFsaWRhdGVkICovCisjZGVmaW5lIEFGU19WTk9ERV9ERUxFVEVECTQJCS8qIHNldCBpZiB2bm9kZSBkZWxldGVkIG9uIHNlcnZlciAqLworI2RlZmluZSBBRlNfVk5PREVfTU9VTlRQT0lOVAk1CQkvKiBzZXQgaWYgdm5vZGUgaXMgYSBtb3VudHBvaW50IHN5bWxpbmsgKi8KKworCWxvbmcJCQlhY2xfb3JkZXI7CS8qIEFDTCBjaGVjayBjb3VudCAoY2FsbGJhY2sgYnJlYWsgY291bnQpICovCisKKwkvKiBvdXRzdGFuZGluZyBjYWxsYmFjayBub3RpZmljYXRpb24gb24gdGhpcyBmaWxlICovCisJc3RydWN0IHJiX25vZGUJCXNlcnZlcl9yYjsJLyogbGluayBpbiBzZXJ2ZXItPmZzX3Zub2RlcyAqLworCXN0cnVjdCByYl9ub2RlCQljYl9wcm9taXNlOwkvKiBsaW5rIGluIHNlcnZlci0+Y2JfcHJvbWlzZXMgKi8KKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJY2JfYnJva2VuX3dvcms7CS8qIHdvcmsgdG8gYmUgZG9uZSBvbiBjYWxsYmFjayBicmVhayAqLworCXRpbWVfdAkJCWNiX2V4cGlyZXM7CS8qIHRpbWUgYXQgd2hpY2ggY2FsbGJhY2sgZXhwaXJlcyAqLworCXRpbWVfdAkJCWNiX2V4cGlyZXNfYXQ7CS8qIHRpbWUgdXNlZCB0byBvcmRlciBjYl9wcm9taXNlICovCisJdW5zaWduZWQJCWNiX3ZlcnNpb247CS8qIGNhbGxiYWNrIHZlcnNpb24gKi8KKwl1bnNpZ25lZAkJY2JfZXhwaXJ5OwkvKiBjYWxsYmFjayBleHBpcnkgdGltZSAqLworCWFmc19jYWxsYmFja190eXBlX3QJY2JfdHlwZTsJLyogdHlwZSBvZiBjYWxsYmFjayAqLworCWJvb2wJCQljYl9wcm9taXNlZDsJLyogdHJ1ZSBpZiBwcm9taXNlIHN0aWxsIGhvbGRzICovCit9OworCisvKgorICogY2FjaGVkIHNlY3VyaXR5IHJlY29yZCBmb3Igb25lIHVzZXIncyBhdHRlbXB0IHRvIGFjY2VzcyBhIHZub2RlCisgKi8KK3N0cnVjdCBhZnNfcGVybWl0IHsKKwlzdHJ1Y3Qga2V5CQkqa2V5OwkJLyogUnhSUEMgdGlja2V0IGhvbGRpbmcgYSBzZWN1cml0eSBjb250ZXh0ICovCisJYWZzX2FjY2Vzc190CQlhY2Nlc3NfbWFzazsJLyogYWNjZXNzIG1hc2sgZm9yIHRoaXMga2V5ICovCit9OworCisvKgorICogY2FjaGUgb2Ygc2VjdXJpdHkgcmVjb3JkcyBmcm9tIGF0dGVtcHRzIHRvIGFjY2VzcyBhIHZub2RlCisgKi8KK3N0cnVjdCBhZnNfcGVybWl0cyB7CisJc3RydWN0IHJjdV9oZWFkCQlyY3U7CQkvKiBkaXNwb3NhbCBwcm9jZWR1cmUgKi8KKwlpbnQJCQljb3VudDsJCS8qIG51bWJlciBvZiByZWNvcmRzICovCisJc3RydWN0IGFmc19wZXJtaXQJcGVybWl0c1swXTsJLyogdGhlIHBlcm1pdHMgc28gZmFyIGV4YW1pbmVkICovCit9OworCisvKgorICogcmVjb3JkIG9mIG9uZSBvZiBhIHN5c3RlbSdzIHNldCBvZiBuZXR3b3JrIGludGVyZmFjZXMKKyAqLworc3RydWN0IGFmc19pbnRlcmZhY2UgeworCXVuc2lnbmVkCWluZGV4OwkJLyogaW50ZXJmYWNlIGluZGV4ICovCisJc3RydWN0IGluX2FkZHIJYWRkcmVzczsJLyogSVB2NCBhZGRyZXNzIGJvdW5kIHRvIGludGVyZmFjZSAqLworCXN0cnVjdCBpbl9hZGRyCW5ldG1hc2s7CS8qIG5ldG1hc2sgYXBwbGllZCB0byBhZGRyZXNzICovCisJdW5zaWduZWQJbXR1OwkJLyogTVRVIG9mIGludGVyZmFjZSAqLworfTsKKworLyoKKyAqIFVVSUQgZGVmaW5pdGlvbiBbaW50ZXJuZXQgZHJhZnRdCisgKiAtIHRoZSB0aW1lc3RhbXAgaXMgYSA2MC1iaXQgdmFsdWUsIHNwbGl0IDMyLzE2LzEyLCBhbmQgZ29lcyBpbiAxMDBucworICogICBpbmNyZW1lbnRzIHNpbmNlIG1pZG5pZ2h0IDE1dGggT2N0b2JlciAxNTgyCisgKiAgIC0gYWRkIEFGU19VVUlEX1RPX1VOSVhfVElNRSB0byBjb252ZXJ0IHVuaXggdGltZSBpbiAxMDBucyB1bml0cyB0byBVVUlECisgKiAgICAgdGltZQorICogLSB0aGUgY2xvY2sgc2VxdWVuY2UgaXMgYSAxNC1iaXQgY291bnRlciB0byBhdm9pZCBkdXBsaWNhdGUgdGltZXMKKyAqLworc3RydWN0IGFmc191dWlkIHsKKwl1MzIJCXRpbWVfbG93OwkJCS8qIGxvdyBwYXJ0IG9mIHRpbWVzdGFtcCAqLworCXUxNgkJdGltZV9taWQ7CQkJLyogbWlkIHBhcnQgb2YgdGltZXN0YW1wICovCisJdTE2CQl0aW1lX2hpX2FuZF92ZXJzaW9uOwkJLyogaGlnaCBwYXJ0IG9mIHRpbWVzdGFtcCBhbmQgdmVyc2lvbiAgKi8KKyNkZWZpbmUgQUZTX1VVSURfVE9fVU5JWF9USU1FCTB4MDFiMjFkZDIxMzgxNDAwMFVMTAorI2RlZmluZSBBRlNfVVVJRF9USU1FSElfTUFTSwkweDBmZmYKKyNkZWZpbmUgQUZTX1VVSURfVkVSU0lPTl9USU1FCTB4MTAwMAkvKiB0aW1lLWJhc2VkIFVVSUQgKi8KKyNkZWZpbmUgQUZTX1VVSURfVkVSU0lPTl9OQU1FCTB4MzAwMAkvKiBuYW1lLWJhc2VkIFVVSUQgKi8KKyNkZWZpbmUgQUZTX1VVSURfVkVSU0lPTl9SQU5ET00JMHg0MDAwCS8qIChwc2V1ZG8tKXJhbmRvbSBnZW5lcmF0ZWQgVVVJRCAqLworCXU4CQljbG9ja19zZXFfaGlfYW5kX3Jlc2VydmVkOwkvKiBjbG9jayBzZXEgaGkgYW5kIHZhcmlhbnQgKi8KKyNkZWZpbmUgQUZTX1VVSURfQ0xPQ0tISV9NQVNLCTB4M2YKKyNkZWZpbmUgQUZTX1VVSURfVkFSSUFOVF9TVEQJMHg4MAorCXU4CQljbG9ja19zZXFfbG93OwkJCS8qIGNsb2NrIHNlcSBsb3cgKi8KKwl1OAkJbm9kZVs2XTsJCQkvKiBzcGF0aWFsbHkgdW5pcXVlIG5vZGUgSUQgKE1BQyBhZGRyKSAqLworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGNhbGxiYWNrLmMKKyAqLworZXh0ZXJuIHZvaWQgYWZzX2luaXRfY2FsbGJhY2tfc3RhdGUoc3RydWN0IGFmc19zZXJ2ZXIgKik7CitleHRlcm4gdm9pZCBhZnNfYnJva2VuX2NhbGxiYWNrX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICopOworZXh0ZXJuIHZvaWQgYWZzX2JyZWFrX2NhbGxiYWNrcyhzdHJ1Y3QgYWZzX3NlcnZlciAqLCBzaXplX3QsCisJCQkJc3RydWN0IGFmc19jYWxsYmFja1tdKTsKK2V4dGVybiB2b2lkIGFmc19kaXNjYXJkX2NhbGxiYWNrX29uX2RlbGV0ZShzdHJ1Y3QgYWZzX3Zub2RlICopOworZXh0ZXJuIHZvaWQgYWZzX2dpdmVfdXBfY2FsbGJhY2soc3RydWN0IGFmc192bm9kZSAqKTsKK2V4dGVybiB2b2lkIGFmc19kaXNwYXRjaF9naXZlX3VwX2NhbGxiYWNrcyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKik7CitleHRlcm4gdm9pZCBhZnNfZmx1c2hfY2FsbGJhY2tfYnJlYWtzKHN0cnVjdCBhZnNfc2VydmVyICopOworZXh0ZXJuIGludCBfX2luaXQgYWZzX2NhbGxiYWNrX3VwZGF0ZV9pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgX19leGl0IGFmc19jYWxsYmFja191cGRhdGVfa2lsbCh2b2lkKTsKIAogLyoKICAqIGNlbGwuYwpAQCAtNjAsNTcgKzQwMywxNTYgQEAKIGV4dGVybiBzdHJ1Y3QgY2FjaGVmc19pbmRleF9kZWYgYWZzX2NhY2hlX2NlbGxfaW5kZXhfZGVmOwogI2VuZGlmCiAKKyNkZWZpbmUgYWZzX2dldF9jZWxsKEMpIGRvIHsgYXRvbWljX2luYygmKEMpLT51c2FnZSk7IH0gd2hpbGUoMCkKK2V4dGVybiBpbnQgYWZzX2NlbGxfaW5pdChjaGFyICopOworZXh0ZXJuIHN0cnVjdCBhZnNfY2VsbCAqYWZzX2NlbGxfY3JlYXRlKGNvbnN0IGNoYXIgKiwgY2hhciAqKTsKK2V4dGVybiBzdHJ1Y3QgYWZzX2NlbGwgKmFmc19jZWxsX2xvb2t1cChjb25zdCBjaGFyICosIHVuc2lnbmVkKTsKK2V4dGVybiBzdHJ1Y3QgYWZzX2NlbGwgKmFmc19ncmFiX2NlbGwoc3RydWN0IGFmc19jZWxsICopOworZXh0ZXJuIHZvaWQgYWZzX3B1dF9jZWxsKHN0cnVjdCBhZnNfY2VsbCAqKTsKK2V4dGVybiB2b2lkIGFmc19jZWxsX3B1cmdlKHZvaWQpOworCisvKgorICogY21zZXJ2aWNlLmMKKyAqLworZXh0ZXJuIGJvb2wgYWZzX2NtX2luY29taW5nX2NhbGwoc3RydWN0IGFmc19jYWxsICopOworCiAvKgogICogZGlyLmMKICAqLwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGFmc19kaXJfaW5vZGVfb3BlcmF0aW9uczsKIGV4dGVybiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFmc19kaXJfZmlsZV9vcGVyYXRpb25zOwogCitleHRlcm4gaW50IGFmc19wZXJtaXNzaW9uKHN0cnVjdCBpbm9kZSAqLCBpbnQsIHN0cnVjdCBuYW1laWRhdGEgKik7CisKIC8qCiAgKiBmaWxlLmMKICAqLwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgYWZzX2ZzX2FvcHM7CiBleHRlcm4gY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgYWZzX2ZpbGVfaW5vZGVfb3BlcmF0aW9uczsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFmc19maWxlX29wZXJhdGlvbnM7CisKK2V4dGVybiBpbnQgYWZzX29wZW4oc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICopOworZXh0ZXJuIGludCBhZnNfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKik7CiAKICNpZmRlZiBBRlNfQ0FDSElOR19TVVBQT1JUCi1leHRlcm4gaW50IGFmc19jYWNoZV9nZXRfcGFnZV9jb29raWUoc3RydWN0IHBhZ2UgKnBhZ2UsCi0JCQkJICAgICBzdHJ1Y3QgY2FjaGVmc19wYWdlICoqX3BhZ2VfY29va2llKTsKK2V4dGVybiBpbnQgYWZzX2NhY2hlX2dldF9wYWdlX2Nvb2tpZShzdHJ1Y3QgcGFnZSAqLCBzdHJ1Y3QgY2FjaGVmc19wYWdlICoqKTsKICNlbmRpZgogCiAvKgorICogZnNjbGllbnQuYworICovCitleHRlcm4gaW50IGFmc19mc19mZXRjaF9maWxlX3N0YXR1cyhzdHJ1Y3QgYWZzX3NlcnZlciAqLCBzdHJ1Y3Qga2V5ICosCisJCQkJICAgIHN0cnVjdCBhZnNfdm5vZGUgKiwgc3RydWN0IGFmc192b2xzeW5jICosCisJCQkJICAgIGNvbnN0IHN0cnVjdCBhZnNfd2FpdF9tb2RlICopOworZXh0ZXJuIGludCBhZnNfZnNfZ2l2ZV91cF9jYWxsYmFja3Moc3RydWN0IGFmc19zZXJ2ZXIgKiwKKwkJCQkgICAgY29uc3Qgc3RydWN0IGFmc193YWl0X21vZGUgKik7CitleHRlcm4gaW50IGFmc19mc19mZXRjaF9kYXRhKHN0cnVjdCBhZnNfc2VydmVyICosIHN0cnVjdCBrZXkgKiwKKwkJCSAgICAgc3RydWN0IGFmc192bm9kZSAqLCBvZmZfdCwgc2l6ZV90LCBzdHJ1Y3QgcGFnZSAqLAorCQkJICAgICBjb25zdCBzdHJ1Y3QgYWZzX3dhaXRfbW9kZSAqKTsKK2V4dGVybiBpbnQgYWZzX2ZzX2NyZWF0ZShzdHJ1Y3QgYWZzX3NlcnZlciAqLCBzdHJ1Y3Qga2V5ICosCisJCQkgc3RydWN0IGFmc192bm9kZSAqLCBjb25zdCBjaGFyICosIHVtb2RlX3QsCisJCQkgc3RydWN0IGFmc19maWQgKiwgc3RydWN0IGFmc19maWxlX3N0YXR1cyAqLAorCQkJIHN0cnVjdCBhZnNfY2FsbGJhY2sgKiwKKwkJCSBjb25zdCBzdHJ1Y3QgYWZzX3dhaXRfbW9kZSAqKTsKK2V4dGVybiBpbnQgYWZzX2ZzX3JlbW92ZShzdHJ1Y3QgYWZzX3NlcnZlciAqLCBzdHJ1Y3Qga2V5ICosCisJCQkgc3RydWN0IGFmc192bm9kZSAqLCBjb25zdCBjaGFyICosIGJvb2wsCisJCQkgY29uc3Qgc3RydWN0IGFmc193YWl0X21vZGUgKik7CitleHRlcm4gaW50IGFmc19mc19saW5rKHN0cnVjdCBhZnNfc2VydmVyICosIHN0cnVjdCBrZXkgKiwgc3RydWN0IGFmc192bm9kZSAqLAorCQkgICAgICAgc3RydWN0IGFmc192bm9kZSAqLCBjb25zdCBjaGFyICosCisJCSAgICAgICBjb25zdCBzdHJ1Y3QgYWZzX3dhaXRfbW9kZSAqKTsKK2V4dGVybiBpbnQgYWZzX2ZzX3N5bWxpbmsoc3RydWN0IGFmc19zZXJ2ZXIgKiwgc3RydWN0IGtleSAqLAorCQkJICBzdHJ1Y3QgYWZzX3Zub2RlICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLAorCQkJICBzdHJ1Y3QgYWZzX2ZpZCAqLCBzdHJ1Y3QgYWZzX2ZpbGVfc3RhdHVzICosCisJCQkgIGNvbnN0IHN0cnVjdCBhZnNfd2FpdF9tb2RlICopOworZXh0ZXJuIGludCBhZnNfZnNfcmVuYW1lKHN0cnVjdCBhZnNfc2VydmVyICosIHN0cnVjdCBrZXkgKiwKKwkJCSBzdHJ1Y3QgYWZzX3Zub2RlICosIGNvbnN0IGNoYXIgKiwKKwkJCSBzdHJ1Y3QgYWZzX3Zub2RlICosIGNvbnN0IGNoYXIgKiwKKwkJCSBjb25zdCBzdHJ1Y3QgYWZzX3dhaXRfbW9kZSAqKTsKKworLyoKICAqIGlub2RlLmMKICAqLwotZXh0ZXJuIGludCBhZnNfaWdldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgYWZzX2ZpZCAqZmlkLAotCQkgICAgc3RydWN0IGlub2RlICoqX2lub2RlKTsKLWV4dGVybiBpbnQgYWZzX2lub2RlX2dldGF0dHIoc3RydWN0IHZmc21vdW50ICptbnQsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKLQkJCSAgICAgc3RydWN0IGtzdGF0ICpzdGF0KTsKLWV4dGVybiB2b2lkIGFmc19jbGVhcl9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKLQotLyoKLSAqIGtleV9hZnMuYwotICovCi0jaWZkZWYgQ09ORklHX0tFWVMKLWV4dGVybiBpbnQgYWZzX2tleV9yZWdpc3Rlcih2b2lkKTsKLWV4dGVybiB2b2lkIGFmc19rZXlfdW5yZWdpc3Rlcih2b2lkKTsKLSNlbmRpZgorZXh0ZXJuIHN0cnVjdCBpbm9kZSAqYWZzX2lnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICosIHN0cnVjdCBrZXkgKiwKKwkJCSAgICAgIHN0cnVjdCBhZnNfZmlkICosIHN0cnVjdCBhZnNfZmlsZV9zdGF0dXMgKiwKKwkJCSAgICAgIHN0cnVjdCBhZnNfY2FsbGJhY2sgKik7CitleHRlcm4gaW50IGFmc192YWxpZGF0ZShzdHJ1Y3QgYWZzX3Zub2RlICosIHN0cnVjdCBrZXkgKik7CitleHRlcm4gaW50IGFmc19pbm9kZV9nZXRhdHRyKHN0cnVjdCB2ZnNtb3VudCAqLCBzdHJ1Y3QgZGVudHJ5ICosCisJCQkgICAgIHN0cnVjdCBrc3RhdCAqKTsKK2V4dGVybiB2b2lkIGFmc196YXBfcGVybWl0cyhzdHJ1Y3QgcmN1X2hlYWQgKik7CitleHRlcm4gdm9pZCBhZnNfY2xlYXJfaW5vZGUoc3RydWN0IGlub2RlICopOwogCiAvKgogICogbWFpbi5jCiAgKi8KK2V4dGVybiBzdHJ1Y3QgYWZzX3V1aWQgYWZzX3V1aWQ7CiAjaWZkZWYgQUZTX0NBQ0hJTkdfU1VQUE9SVAogZXh0ZXJuIHN0cnVjdCBjYWNoZWZzX25ldGZzIGFmc19jYWNoZV9uZXRmczsKICNlbmRpZgogCiAvKgorICogbWlzYy5jCisgKi8KK2V4dGVybiBpbnQgYWZzX2Fib3J0X3RvX2Vycm9yKHUzMik7CisKKy8qCiAgKiBtbnRwdC5jCiAgKi8KIGV4dGVybiBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBhZnNfbW50cHRfaW5vZGVfb3BlcmF0aW9uczsKIGV4dGVybiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFmc19tbnRwdF9maWxlX29wZXJhdGlvbnM7Ci1leHRlcm4gc3RydWN0IGFmc190aW1lciBhZnNfbW50cHRfZXhwaXJ5X3RpbWVyOwotZXh0ZXJuIHN0cnVjdCBhZnNfdGltZXJfb3BzIGFmc19tbnRwdF9leHBpcnlfdGltZXJfb3BzOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgYWZzX21udHB0X2V4cGlyeV90aW1lb3V0OwogCi1leHRlcm4gaW50IGFmc19tbnRwdF9jaGVja19zeW1saW5rKHN0cnVjdCBhZnNfdm5vZGUgKnZub2RlKTsKK2V4dGVybiBpbnQgYWZzX21udHB0X2NoZWNrX3N5bWxpbmsoc3RydWN0IGFmc192bm9kZSAqLCBzdHJ1Y3Qga2V5ICopOworZXh0ZXJuIHZvaWQgYWZzX21udHB0X2tpbGxfdGltZXIodm9pZCk7CitleHRlcm4gdm9pZCBhZnNfdW1vdW50X2JlZ2luKHN0cnVjdCB2ZnNtb3VudCAqLCBpbnQpOworCisvKgorICogcHJvYy5jCisgKi8KK2V4dGVybiBpbnQgYWZzX3Byb2NfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIGFmc19wcm9jX2NsZWFudXAodm9pZCk7CitleHRlcm4gaW50IGFmc19wcm9jX2NlbGxfc2V0dXAoc3RydWN0IGFmc19jZWxsICopOworZXh0ZXJuIHZvaWQgYWZzX3Byb2NfY2VsbF9yZW1vdmUoc3RydWN0IGFmc19jZWxsICopOworCisvKgorICogcnhycGMuYworICovCitleHRlcm4gaW50IGFmc19vcGVuX3NvY2tldCh2b2lkKTsKK2V4dGVybiB2b2lkIGFmc19jbG9zZV9zb2NrZXQodm9pZCk7CitleHRlcm4gaW50IGFmc19tYWtlX2NhbGwoc3RydWN0IGluX2FkZHIgKiwgc3RydWN0IGFmc19jYWxsICosIGdmcF90LAorCQkJIGNvbnN0IHN0cnVjdCBhZnNfd2FpdF9tb2RlICopOworZXh0ZXJuIHN0cnVjdCBhZnNfY2FsbCAqYWZzX2FsbG9jX2ZsYXRfY2FsbChjb25zdCBzdHJ1Y3QgYWZzX2NhbGxfdHlwZSAqLAorCQkJCQkgICAgc2l6ZV90LCBzaXplX3QpOworZXh0ZXJuIHZvaWQgYWZzX2ZsYXRfY2FsbF9kZXN0cnVjdG9yKHN0cnVjdCBhZnNfY2FsbCAqKTsKK2V4dGVybiB2b2lkIGFmc190cmFuc2Zlcl9yZXBseShzdHJ1Y3QgYWZzX2NhbGwgKiwgc3RydWN0IHNrX2J1ZmYgKik7CitleHRlcm4gdm9pZCBhZnNfc2VuZF9lbXB0eV9yZXBseShzdHJ1Y3QgYWZzX2NhbGwgKik7CitleHRlcm4gdm9pZCBhZnNfc2VuZF9zaW1wbGVfcmVwbHkoc3RydWN0IGFmc19jYWxsICosIGNvbnN0IHZvaWQgKiwgc2l6ZV90KTsKK2V4dGVybiBpbnQgYWZzX2V4dHJhY3RfZGF0YShzdHJ1Y3QgYWZzX2NhbGwgKiwgc3RydWN0IHNrX2J1ZmYgKiwgYm9vbCwgdm9pZCAqLAorCQkJICAgIHNpemVfdCk7CisKKy8qCisgKiBzZWN1cml0eS5jCisgKi8KK2V4dGVybiB2b2lkIGFmc19jbGVhcl9wZXJtaXRzKHN0cnVjdCBhZnNfdm5vZGUgKik7CitleHRlcm4gdm9pZCBhZnNfY2FjaGVfcGVybWl0KHN0cnVjdCBhZnNfdm5vZGUgKiwgc3RydWN0IGtleSAqLCBsb25nKTsKK2V4dGVybiBzdHJ1Y3Qga2V5ICphZnNfcmVxdWVzdF9rZXkoc3RydWN0IGFmc19jZWxsICopOworZXh0ZXJuIGludCBhZnNfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKiwgaW50LCBzdHJ1Y3QgbmFtZWlkYXRhICopOworCisvKgorICogc2VydmVyLmMKKyAqLworZXh0ZXJuIHNwaW5sb2NrX3QgYWZzX3NlcnZlcl9wZWVyX2xvY2s7CisKKyNkZWZpbmUgYWZzX2dldF9zZXJ2ZXIoUykJCQkJCVwKK2RvIHsJCQkJCQkJCVwKKwlfZGVidWcoIkdFVCBTRVJWRVIgJWQiLCBhdG9taWNfcmVhZCgmKFMpLT51c2FnZSkpOwlcCisJYXRvbWljX2luYygmKFMpLT51c2FnZSk7CQkJCVwKK30gd2hpbGUoMCkKKworZXh0ZXJuIHN0cnVjdCBhZnNfc2VydmVyICphZnNfbG9va3VwX3NlcnZlcihzdHJ1Y3QgYWZzX2NlbGwgKiwKKwkJCQkJICAgIGNvbnN0IHN0cnVjdCBpbl9hZGRyICopOworZXh0ZXJuIHN0cnVjdCBhZnNfc2VydmVyICphZnNfZmluZF9zZXJ2ZXIoY29uc3Qgc3RydWN0IGluX2FkZHIgKik7CitleHRlcm4gdm9pZCBhZnNfcHV0X3NlcnZlcihzdHJ1Y3QgYWZzX3NlcnZlciAqKTsKK2V4dGVybiB2b2lkIF9fZXhpdCBhZnNfcHVyZ2Vfc2VydmVycyh2b2lkKTsKIAogLyoKICAqIHN1cGVyLmMKQEAgLTExOCwyMiArNTYwLDIxMSBAQAogZXh0ZXJuIGludCBhZnNfZnNfaW5pdCh2b2lkKTsKIGV4dGVybiB2b2lkIGFmc19mc19leGl0KHZvaWQpOwogCi0jZGVmaW5lIEFGU19DQl9IQVNIX0NPVU5UIChQQUdFX1NJWkUgLyBzaXplb2Yoc3RydWN0IGxpc3RfaGVhZCkpCi0KLWV4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIGFmc19jYl9oYXNoX3RibFtdOwotZXh0ZXJuIHNwaW5sb2NrX3QgYWZzX2NiX2hhc2hfbG9jazsKLQotI2RlZmluZSBhZnNfY2JfaGFzaChTUlYsRklEKSBcCi0JYWZzX2NiX2hhc2hfdGJsWygodW5zaWduZWQgbG9uZykoU1JWKSArIFwKLQkJCShGSUQpLT52aWQgKyAoRklEKS0+dm5vZGUgKyAoRklEKS0+dW5pcXVlKSAlIFwKLQkJCUFGU19DQl9IQVNIX0NPVU5UXQorLyoKKyAqIHVzZS1ydG5ldGxpbmsuYworICovCitleHRlcm4gaW50IGFmc19nZXRfaXB2NF9pbnRlcmZhY2VzKHN0cnVjdCBhZnNfaW50ZXJmYWNlICosIHNpemVfdCwgYm9vbCk7CitleHRlcm4gaW50IGFmc19nZXRfTUFDX2FkZHJlc3ModTggWzZdKTsKIAogLyoKLSAqIHByb2MuYworICogdmxjbGllbnQuYwogICovCi1leHRlcm4gaW50IGFmc19wcm9jX2luaXQodm9pZCk7Ci1leHRlcm4gdm9pZCBhZnNfcHJvY19jbGVhbnVwKHZvaWQpOwotZXh0ZXJuIGludCBhZnNfcHJvY19jZWxsX3NldHVwKHN0cnVjdCBhZnNfY2VsbCAqY2VsbCk7Ci1leHRlcm4gdm9pZCBhZnNfcHJvY19jZWxsX3JlbW92ZShzdHJ1Y3QgYWZzX2NlbGwgKmNlbGwpOworI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKK2V4dGVybiBzdHJ1Y3QgY2FjaGVmc19pbmRleF9kZWYgYWZzX3Zsb2NhdGlvbl9jYWNoZV9pbmRleF9kZWY7CisjZW5kaWYKIAotI2VuZGlmIC8qIEFGU19JTlRFUk5BTF9IICovCitleHRlcm4gaW50IGFmc192bF9nZXRfZW50cnlfYnlfbmFtZShzdHJ1Y3QgaW5fYWRkciAqLCBzdHJ1Y3Qga2V5ICosCisJCQkJICAgIGNvbnN0IGNoYXIgKiwgc3RydWN0IGFmc19jYWNoZV92bG9jYXRpb24gKiwKKwkJCQkgICAgY29uc3Qgc3RydWN0IGFmc193YWl0X21vZGUgKik7CitleHRlcm4gaW50IGFmc192bF9nZXRfZW50cnlfYnlfaWQoc3RydWN0IGluX2FkZHIgKiwgc3RydWN0IGtleSAqLAorCQkJCSAgYWZzX3ZvbGlkX3QsIGFmc192b2x0eXBlX3QsCisJCQkJICBzdHJ1Y3QgYWZzX2NhY2hlX3Zsb2NhdGlvbiAqLAorCQkJCSAgY29uc3Qgc3RydWN0IGFmc193YWl0X21vZGUgKik7CisKKy8qCisgKiB2bG9jYXRpb24uYworICovCisjZGVmaW5lIGFmc19nZXRfdmxvY2F0aW9uKFYpIGRvIHsgYXRvbWljX2luYygmKFYpLT51c2FnZSk7IH0gd2hpbGUoMCkKKworZXh0ZXJuIGludCBfX2luaXQgYWZzX3Zsb2NhdGlvbl91cGRhdGVfaW5pdCh2b2lkKTsKK2V4dGVybiBzdHJ1Y3QgYWZzX3Zsb2NhdGlvbiAqYWZzX3Zsb2NhdGlvbl9sb29rdXAoc3RydWN0IGFmc19jZWxsICosCisJCQkJCQkgIHN0cnVjdCBrZXkgKiwKKwkJCQkJCSAgY29uc3QgY2hhciAqLCBzaXplX3QpOworZXh0ZXJuIHZvaWQgYWZzX3B1dF92bG9jYXRpb24oc3RydWN0IGFmc192bG9jYXRpb24gKik7CitleHRlcm4gdm9pZCBfX2V4aXQgYWZzX3Zsb2NhdGlvbl9wdXJnZSh2b2lkKTsKKworLyoKKyAqIHZub2RlLmMKKyAqLworI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKK2V4dGVybiBzdHJ1Y3QgY2FjaGVmc19pbmRleF9kZWYgYWZzX3Zub2RlX2NhY2hlX2luZGV4X2RlZjsKKyNlbmRpZgorCitleHRlcm4gc3RydWN0IGFmc190aW1lcl9vcHMgYWZzX3Zub2RlX2NiX3RpbWVkX291dF9vcHM7CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGFmc192bm9kZSAqQUZTX0ZTX0koc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKGlub2RlLCBzdHJ1Y3QgYWZzX3Zub2RlLCB2ZnNfaW5vZGUpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpbm9kZSAqQUZTX1ZOT0RFX1RPX0koc3RydWN0IGFmc192bm9kZSAqdm5vZGUpCit7CisJcmV0dXJuICZ2bm9kZS0+dmZzX2lub2RlOworfQorCitleHRlcm4gdm9pZCBhZnNfdm5vZGVfZmluYWxpc2Vfc3RhdHVzX3VwZGF0ZShzdHJ1Y3QgYWZzX3Zub2RlICosCisJCQkJCSAgICAgc3RydWN0IGFmc19zZXJ2ZXIgKik7CitleHRlcm4gaW50IGFmc192bm9kZV9mZXRjaF9zdGF0dXMoc3RydWN0IGFmc192bm9kZSAqLCBzdHJ1Y3QgYWZzX3Zub2RlICosCisJCQkJICBzdHJ1Y3Qga2V5ICopOworZXh0ZXJuIGludCBhZnNfdm5vZGVfZmV0Y2hfZGF0YShzdHJ1Y3QgYWZzX3Zub2RlICosIHN0cnVjdCBrZXkgKiwKKwkJCQlvZmZfdCwgc2l6ZV90LCBzdHJ1Y3QgcGFnZSAqKTsKK2V4dGVybiBpbnQgYWZzX3Zub2RlX2NyZWF0ZShzdHJ1Y3QgYWZzX3Zub2RlICosIHN0cnVjdCBrZXkgKiwgY29uc3QgY2hhciAqLAorCQkJICAgIHVtb2RlX3QsIHN0cnVjdCBhZnNfZmlkICosIHN0cnVjdCBhZnNfZmlsZV9zdGF0dXMgKiwKKwkJCSAgICBzdHJ1Y3QgYWZzX2NhbGxiYWNrICosIHN0cnVjdCBhZnNfc2VydmVyICoqKTsKK2V4dGVybiBpbnQgYWZzX3Zub2RlX3JlbW92ZShzdHJ1Y3QgYWZzX3Zub2RlICosIHN0cnVjdCBrZXkgKiwgY29uc3QgY2hhciAqLAorCQkJICAgIGJvb2wpOworZXh0ZXJuIGludCBhZnNfdm5vZGVfbGluayhzdHJ1Y3QgYWZzX3Zub2RlICosIHN0cnVjdCBhZnNfdm5vZGUgKiwgc3RydWN0IGtleSAqLAorCQkJICBjb25zdCBjaGFyICopOworZXh0ZXJuIGludCBhZnNfdm5vZGVfc3ltbGluayhzdHJ1Y3QgYWZzX3Zub2RlICosIHN0cnVjdCBrZXkgKiwgY29uc3QgY2hhciAqLAorCQkJICAgICBjb25zdCBjaGFyICosIHN0cnVjdCBhZnNfZmlkICosCisJCQkgICAgIHN0cnVjdCBhZnNfZmlsZV9zdGF0dXMgKiwgc3RydWN0IGFmc19zZXJ2ZXIgKiopOworZXh0ZXJuIGludCBhZnNfdm5vZGVfcmVuYW1lKHN0cnVjdCBhZnNfdm5vZGUgKiwgc3RydWN0IGFmc192bm9kZSAqLAorCQkJICAgIHN0cnVjdCBrZXkgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOworCisvKgorICogdm9sdW1lLmMKKyAqLworI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKK2V4dGVybiBzdHJ1Y3QgY2FjaGVmc19pbmRleF9kZWYgYWZzX3ZvbHVtZV9jYWNoZV9pbmRleF9kZWY7CisjZW5kaWYKKworI2RlZmluZSBhZnNfZ2V0X3ZvbHVtZShWKSBkbyB7IGF0b21pY19pbmMoJihWKS0+dXNhZ2UpOyB9IHdoaWxlKDApCisKK2V4dGVybiB2b2lkIGFmc19wdXRfdm9sdW1lKHN0cnVjdCBhZnNfdm9sdW1lICopOworZXh0ZXJuIHN0cnVjdCBhZnNfdm9sdW1lICphZnNfdm9sdW1lX2xvb2t1cChzdHJ1Y3QgYWZzX21vdW50X3BhcmFtcyAqKTsKK2V4dGVybiBzdHJ1Y3QgYWZzX3NlcnZlciAqYWZzX3ZvbHVtZV9waWNrX2ZpbGVzZXJ2ZXIoc3RydWN0IGFmc192bm9kZSAqKTsKK2V4dGVybiBpbnQgYWZzX3ZvbHVtZV9yZWxlYXNlX2ZpbGVzZXJ2ZXIoc3RydWN0IGFmc192bm9kZSAqLAorCQkJCQkgc3RydWN0IGFmc19zZXJ2ZXIgKiwgaW50KTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGRlYnVnIHRyYWNpbmcKKyAqLworZXh0ZXJuIHVuc2lnbmVkIGFmc19kZWJ1ZzsKKworI2RlZmluZSBkYmdwcmludGsoRk1ULC4uLikgXAorCXByaW50aygiWyV4JS02LjZzXSAiRk1UIlxuIiwgc21wX3Byb2Nlc3Nvcl9pZCgpLCBjdXJyZW50LT5jb21tICwjI19fVkFfQVJHU19fKQorCisvKiBtYWtlIHN1cmUgd2UgbWFpbnRhaW4gdGhlIGZvcm1hdCBzdHJpbmdzLCBldmVuIHdoZW4gZGVidWdnaW5nIGlzIGRpc2FibGVkICovCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsMSwyKSkpCit2b2lkIF9kYnByaW50ayhjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKK30KKworI2RlZmluZSBrZW50ZXIoRk1ULC4uLikJZGJncHJpbnRrKCI9PT4gJXMoIkZNVCIpIixfX0ZVTkNUSU9OX18gLCMjX19WQV9BUkdTX18pCisjZGVmaW5lIGtsZWF2ZShGTVQsLi4uKQlkYmdwcmludGsoIjw9PSAlcygpIkZNVCIiLF9fRlVOQ1RJT05fXyAsIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUga2RlYnVnKEZNVCwuLi4pCWRiZ3ByaW50aygiICAgICJGTVQgLCMjX19WQV9BUkdTX18pCisKKworI2lmIGRlZmluZWQoX19LREVCVUcpCisjZGVmaW5lIF9lbnRlcihGTVQsLi4uKQlrZW50ZXIoRk1ULCMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9sZWF2ZShGTVQsLi4uKQlrbGVhdmUoRk1ULCMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9kZWJ1ZyhGTVQsLi4uKQlrZGVidWcoRk1ULCMjX19WQV9BUkdTX18pCisKKyNlbGlmIGRlZmluZWQoQ09ORklHX0FGU19ERUJVRykKKyNkZWZpbmUgQUZTX0RFQlVHX0tFTlRFUgkweDAxCisjZGVmaW5lIEFGU19ERUJVR19LTEVBVkUJMHgwMgorI2RlZmluZSBBRlNfREVCVUdfS0RFQlVHCTB4MDQKKworI2RlZmluZSBfZW50ZXIoRk1ULC4uLikJCQkJCVwKK2RvIHsJCQkJCQkJXAorCWlmICh1bmxpa2VseShhZnNfZGVidWcgJiBBRlNfREVCVUdfS0VOVEVSKSkJXAorCQlrZW50ZXIoRk1ULCMjX19WQV9BUkdTX18pOwkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBfbGVhdmUoRk1ULC4uLikJCQkJCVwKK2RvIHsJCQkJCQkJXAorCWlmICh1bmxpa2VseShhZnNfZGVidWcgJiBBRlNfREVCVUdfS0xFQVZFKSkJXAorCQlrbGVhdmUoRk1ULCMjX19WQV9BUkdTX18pOwkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBfZGVidWcoRk1ULC4uLikJCQkJCVwKK2RvIHsJCQkJCQkJXAorCWlmICh1bmxpa2VseShhZnNfZGVidWcgJiBBRlNfREVCVUdfS0RFQlVHKSkJXAorCQlrZGVidWcoRk1ULCMjX19WQV9BUkdTX18pOwkJXAorfSB3aGlsZSAoMCkKKworI2Vsc2UKKyNkZWZpbmUgX2VudGVyKEZNVCwuLi4pCV9kYnByaW50aygiPT0+ICVzKCJGTVQiKSIsX19GVU5DVElPTl9fICwjI19fVkFfQVJHU19fKQorI2RlZmluZSBfbGVhdmUoRk1ULC4uLikJX2RicHJpbnRrKCI8PT0gJXMoKSJGTVQiIixfX0ZVTkNUSU9OX18gLCMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9kZWJ1ZyhGTVQsLi4uKQlfZGJwcmludGsoIiAgICAiRk1UICwjI19fVkFfQVJHU19fKQorI2VuZGlmCisKKy8qCisgKiBkZWJ1ZyBhc3NlcnRpb24gY2hlY2tpbmcKKyAqLworI2lmIDEgLy8gZGVmaW5lZChfX0tERUJVR0FMTCkKKworI2RlZmluZSBBU1NFUlQoWCkJCQkJCQlcCitkbyB7CQkJCQkJCQlcCisJaWYgKHVubGlrZWx5KCEoWCkpKSB7CQkJCQlcCisJCXByaW50ayhLRVJOX0VSUiAiXG4iKTsJCQkJXAorCQlwcmludGsoS0VSTl9FUlIgIkFGUzogQXNzZXJ0aW9uIGZhaWxlZFxuIik7CVwKKwkJQlVHKCk7CQkJCQkJXAorCX0JCQkJCQkJXAorfSB3aGlsZSgwKQorCisjZGVmaW5lIEFTU0VSVENNUChYLCBPUCwgWSkJCQkJCQlcCitkbyB7CQkJCQkJCQkJXAorCWlmICh1bmxpa2VseSghKChYKSBPUCAoWSkpKSkgewkJCQkJXAorCQlwcmludGsoS0VSTl9FUlIgIlxuIik7CQkJCQlcCisJCXByaW50ayhLRVJOX0VSUiAiQUZTOiBBc3NlcnRpb24gZmFpbGVkXG4iKTsJCVwKKwkJcHJpbnRrKEtFUk5fRVJSICIlbHUgIiAjT1AgIiAlbHUgaXMgZmFsc2VcbiIsCQlcCisJCSAgICAgICAodW5zaWduZWQgbG9uZykoWCksICh1bnNpZ25lZCBsb25nKShZKSk7CQlcCisJCXByaW50ayhLRVJOX0VSUiAiMHglbHggIiAjT1AgIiAweCVseCBpcyBmYWxzZVxuIiwJXAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpKFgpLCAodW5zaWduZWQgbG9uZykoWSkpOwkJXAorCQlCVUcoKTsJCQkJCQkJXAorCX0JCQkJCQkJCVwKK30gd2hpbGUoMCkKKworI2RlZmluZSBBU1NFUlRJRihDLCBYKQkJCQkJCVwKK2RvIHsJCQkJCQkJCVwKKwlpZiAodW5saWtlbHkoKEMpICYmICEoWCkpKSB7CQkJCVwKKwkJcHJpbnRrKEtFUk5fRVJSICJcbiIpOwkJCQlcCisJCXByaW50ayhLRVJOX0VSUiAiQUZTOiBBc3NlcnRpb24gZmFpbGVkXG4iKTsJXAorCQlCVUcoKTsJCQkJCQlcCisJfQkJCQkJCQlcCit9IHdoaWxlKDApCisKKyNkZWZpbmUgQVNTRVJUSUZDTVAoQywgWCwgT1AsIFkpCQkJCQlcCitkbyB7CQkJCQkJCQkJXAorCWlmICh1bmxpa2VseSgoQykgJiYgISgoWCkgT1AgKFkpKSkpIHsJCQkJXAorCQlwcmludGsoS0VSTl9FUlIgIlxuIik7CQkJCQlcCisJCXByaW50ayhLRVJOX0VSUiAiQUZTOiBBc3NlcnRpb24gZmFpbGVkXG4iKTsJCVwKKwkJcHJpbnRrKEtFUk5fRVJSICIlbHUgIiAjT1AgIiAlbHUgaXMgZmFsc2VcbiIsCQlcCisJCSAgICAgICAodW5zaWduZWQgbG9uZykoWCksICh1bnNpZ25lZCBsb25nKShZKSk7CQlcCisJCXByaW50ayhLRVJOX0VSUiAiMHglbHggIiAjT1AgIiAweCVseCBpcyBmYWxzZVxuIiwJXAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpKFgpLCAodW5zaWduZWQgbG9uZykoWSkpOwkJXAorCQlCVUcoKTsJCQkJCQkJXAorCX0JCQkJCQkJCVwKK30gd2hpbGUoMCkKKworI2Vsc2UKKworI2RlZmluZSBBU1NFUlQoWCkJCQkJXAorZG8gewkJCQkJCVwKK30gd2hpbGUoMCkKKworI2RlZmluZSBBU1NFUlRDTVAoWCwgT1AsIFkpCQkJXAorZG8gewkJCQkJCVwKK30gd2hpbGUoMCkKKworI2RlZmluZSBBU1NFUlRJRihDLCBYKQkJCQlcCitkbyB7CQkJCQkJXAorfSB3aGlsZSgwKQorCisjZGVmaW5lIEFTU0VSVElGQ01QKEMsIFgsIE9QLCBZKQkJXAorZG8gewkJCQkJCVwKK30gd2hpbGUoMCkKKworI2VuZGlmIC8qIF9fS0RFQlVHQUxMICovCmRpZmYgLS1naXQgYS9mcy9hZnMva2Fmc2FzeW5jZC5jIGIvZnMvYWZzL2thZnNhc3luY2QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE1ZGYyNC4uMDAwMDAwMAotLS0gYS9mcy9hZnMva2Fmc2FzeW5jZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjU1ICswLDAgQEAKLS8qIGthZnNhc3luY2QuYzogQUZTIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gZGFlbW9uCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqCi0gKiBUaGUgQUZTIGFzeW5jIGRhZW1vbiBpcyB1c2VkIHRvIHRoZSBmb2xsb3dpbmc6Ci0gKiAtIHByb2JlICJkZWFkIiBzZXJ2ZXJzIHRvIHNlZSB3aGV0aGVyIHRoZXkndmUgY29tZSBiYWNrIHRvIGxpZmUgeWV0LgotICogLSBwcm9iZSAibGl2ZSIgc2VydmVycyB0aGF0IHdlIGhhdmVuJ3QgdGFsa2VkIHRvIGZvciBhIHdoaWxlIHRvIHNlZSBpZiB0aGV5IGFyZSBiZXR0ZXIKLSAqICAgY2FuZGlkYXRlcyBmb3Igc2VydmluZyB0aGFuIHdoYXQgd2UncmUgY3VycmVudGx5IHVzaW5nCi0gKiAtIHBvbGwgdm9sdW1lIGxvY2F0aW9uIHNlcnZlcnMgdG8ga2VlcCB1cCB0byBkYXRlIHZvbHVtZSBsb2NhdGlvbiBsaXN0cwotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+Ci0jaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgotI2luY2x1ZGUgImNlbGwuaCIKLSNpbmNsdWRlICJzZXJ2ZXIuaCIKLSNpbmNsdWRlICJ2b2x1bWUuaCIKLSNpbmNsdWRlICJrYWZzYXN5bmNkLmgiCi0jaW5jbHVkZSAia2Fmc3RpbW9kLmgiCi0jaW5jbHVkZSA8cnhycGMvY2FsbC5oPgotI2luY2x1ZGUgPGFzbS9lcnJuby5oPgotI2luY2x1ZGUgImludGVybmFsLmgiCi0KLXN0YXRpYyBERUNMQVJFX0NPTVBMRVRJT04oa2Fmc2FzeW5jZF9hbGl2ZSk7Ci1zdGF0aWMgREVDTEFSRV9DT01QTEVUSU9OKGthZnNhc3luY2RfZGVhZCk7Ci1zdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQoa2Fmc2FzeW5jZF9zbGVlcHEpOwotc3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCAqa2Fmc2FzeW5jZF90YXNrOwotc3RhdGljIGludCBrYWZzYXN5bmNkX2RpZTsKLQotc3RhdGljIGludCBrYWZzYXN5bmNkKHZvaWQgKmFyZyk7Ci0KLXN0YXRpYyBMSVNUX0hFQUQoa2Fmc2FzeW5jZF9hc3luY19hdHRucSk7Ci1zdGF0aWMgTElTVF9IRUFEKGthZnNhc3luY2RfYXN5bmNfYnVzeXEpOwotc3RhdGljIERFRklORV9TUElOTE9DSyhrYWZzYXN5bmNkX2FzeW5jX2xvY2spOwotCi1zdGF0aWMgdm9pZCBrYWZzYXN5bmNkX251bGxfY2FsbF9hdHRuX2Z1bmMoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpCi17Ci19Ci0KLXN0YXRpYyB2b2lkIGthZnNhc3luY2RfbnVsbF9jYWxsX2Vycm9yX2Z1bmMoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpCi17Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBzdGFydCB0aGUgYXN5bmMgZGFlbW9uCi0gKi8KLWludCBhZnNfa2Fmc2FzeW5jZF9zdGFydCh2b2lkKQotewotCWludCByZXQ7Ci0KLQlyZXQgPSBrZXJuZWxfdGhyZWFkKGthZnNhc3luY2QsIE5VTEwsIDApOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0Jd2FpdF9mb3JfY29tcGxldGlvbigma2Fmc2FzeW5jZF9hbGl2ZSk7Ci0KLQlyZXR1cm4gcmV0OwotfSAvKiBlbmQgYWZzX2thZnNhc3luY2Rfc3RhcnQoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogc3RvcCB0aGUgYXN5bmMgZGFlbW9uCi0gKi8KLXZvaWQgYWZzX2thZnNhc3luY2Rfc3RvcCh2b2lkKQotewotCS8qIGdldCByaWQgb2YgbXkgZGFlbW9uICovCi0Ja2Fmc2FzeW5jZF9kaWUgPSAxOwotCXdha2VfdXAoJmthZnNhc3luY2Rfc2xlZXBxKTsKLQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZrYWZzYXN5bmNkX2RlYWQpOwotCi19IC8qIGVuZCBhZnNfa2Fmc2FzeW5jZF9zdG9wKCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIHByb2JpbmcgZGFlbW9uCi0gKi8KLXN0YXRpYyBpbnQga2Fmc2FzeW5jZCh2b2lkICphcmcpCi17Ci0Jc3RydWN0IGFmc19hc3luY19vcCAqb3A7Ci0JaW50IGRpZTsKLQotCURFQ0xBUkVfV0FJVFFVRVVFKG15c2VsZiwgY3VycmVudCk7Ci0KLQlrYWZzYXN5bmNkX3Rhc2sgPSBjdXJyZW50OwotCi0JcHJpbnRrKCJrQUZTOiBTdGFydGVkIGthZnNhc3luY2QgJWRcbiIsIGN1cnJlbnQtPnBpZCk7Ci0KLQlkYWVtb25pemUoImthZnNhc3luY2QiKTsKLQotCWNvbXBsZXRlKCZrYWZzYXN5bmNkX2FsaXZlKTsKLQotCS8qIGxvb3AgYXJvdW5kIGxvb2tpbmcgZm9yIHRoaW5ncyB0byBhdHRlbmQgdG8gKi8KLQlkbyB7Ci0JCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JCWFkZF93YWl0X3F1ZXVlKCZrYWZzYXN5bmNkX3NsZWVwcSwgJm15c2VsZik7Ci0KLQkJZm9yICg7OykgewotCQkJaWYgKCFsaXN0X2VtcHR5KCZrYWZzYXN5bmNkX2FzeW5jX2F0dG5xKSB8fAotCQkJICAgIHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpIHx8Ci0JCQkgICAga2Fmc2FzeW5jZF9kaWUpCi0JCQkJYnJlYWs7Ci0KLQkJCXNjaGVkdWxlKCk7Ci0JCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCQl9Ci0KLQkJcmVtb3ZlX3dhaXRfcXVldWUoJmthZnNhc3luY2Rfc2xlZXBxLCAmbXlzZWxmKTsKLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKLQotCQl0cnlfdG9fZnJlZXplKCk7Ci0KLQkJLyogZGlzY2FyZCBwZW5kaW5nIHNpZ25hbHMgKi8KLQkJYWZzX2Rpc2NhcmRfbXlfc2lnbmFscygpOwotCi0JCWRpZSA9IGthZnNhc3luY2RfZGllOwotCi0JCS8qIGRlYWwgd2l0aCB0aGUgbmV4dCBhc3luY2hyb25vdXMgb3BlcmF0aW9uIHJlcXVpcmluZwotCQkgKiBhdHRlbnRpb24gKi8KLQkJaWYgKCFsaXN0X2VtcHR5KCZrYWZzYXN5bmNkX2FzeW5jX2F0dG5xKSkgewotCQkJc3RydWN0IGFmc19hc3luY19vcCAqb3A7Ci0KLQkJCV9kZWJ1ZygiQEBAIEJlZ2luIEFzeW5jaHJvbm91cyBPcGVyYXRpb24iKTsKLQotCQkJb3AgPSBOVUxMOwotCQkJc3Bpbl9sb2NrKCZrYWZzYXN5bmNkX2FzeW5jX2xvY2spOwotCi0JCQlpZiAoIWxpc3RfZW1wdHkoJmthZnNhc3luY2RfYXN5bmNfYXR0bnEpKSB7Ci0JCQkJb3AgPSBsaXN0X2VudHJ5KGthZnNhc3luY2RfYXN5bmNfYXR0bnEubmV4dCwKLQkJCQkJCXN0cnVjdCBhZnNfYXN5bmNfb3AsIGxpbmspOwotCQkJCWxpc3RfbW92ZV90YWlsKCZvcC0+bGluaywKLQkJCQkJICAgICAgJmthZnNhc3luY2RfYXN5bmNfYnVzeXEpOwotCQkJfQotCi0JCQlzcGluX3VubG9jaygma2Fmc2FzeW5jZF9hc3luY19sb2NrKTsKLQotCQkJX2RlYnVnKCJAQEAgT3BlcmF0aW9uICVwIHslcH1cbiIsCi0JCQkgICAgICAgb3AsIG9wID8gb3AtPm9wcyA6IE5VTEwpOwotCi0JCQlpZiAob3ApCi0JCQkJb3AtPm9wcy0+YXR0ZW5kKG9wKTsKLQotCQkJX2RlYnVnKCJAQEAgRW5kIEFzeW5jaHJvbm91cyBPcGVyYXRpb24iKTsKLQkJfQotCi0JfSB3aGlsZSghZGllKTsKLQotCS8qIG5lZWQgdG8ga2lsbCBhbGwgb3V0c3RhbmRpbmcgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMgYmVmb3JlCi0JICogZXhpdGluZyAqLwotCWthZnNhc3luY2RfdGFzayA9IE5VTEw7Ci0Jc3Bpbl9sb2NrKCZrYWZzYXN5bmNkX2FzeW5jX2xvY2spOwotCi0JLyogZm9sZCB0aGUgYnVzeSBhbmQgYXR0ZW50aW9uIHF1ZXVlcyB0b2dldGhlciAqLwotCWxpc3Rfc3BsaWNlX2luaXQoJmthZnNhc3luY2RfYXN5bmNfYnVzeXEsCi0JCQkgJmthZnNhc3luY2RfYXN5bmNfYXR0bnEpOwotCi0JLyogZGVxdWV1ZSBrYWZzYXN5bmNkIGZyb20gYWxsIHRoZWlyIHdhaXQgcXVldWVzICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShvcCwgJmthZnNhc3luY2RfYXN5bmNfYXR0bnEsIGxpbmspIHsKLQkJb3AtPmNhbGwtPmFwcF9hdHRuX2Z1bmMgPSBrYWZzYXN5bmNkX251bGxfY2FsbF9hdHRuX2Z1bmM7Ci0JCW9wLT5jYWxsLT5hcHBfZXJyb3JfZnVuYyA9IGthZnNhc3luY2RfbnVsbF9jYWxsX2Vycm9yX2Z1bmM7Ci0JCXJlbW92ZV93YWl0X3F1ZXVlKCZvcC0+Y2FsbC0+d2FpdHEsICZvcC0+d2FpdGVyKTsKLQl9Ci0KLQlzcGluX3VubG9jaygma2Fmc2FzeW5jZF9hc3luY19sb2NrKTsKLQotCS8qIGFib3J0IGFsbCB0aGUgb3BlcmF0aW9ucyAqLwotCXdoaWxlICghbGlzdF9lbXB0eSgma2Fmc2FzeW5jZF9hc3luY19hdHRucSkpIHsKLQkJb3AgPSBsaXN0X2VudHJ5KGthZnNhc3luY2RfYXN5bmNfYXR0bnEubmV4dCwgc3RydWN0IGFmc19hc3luY19vcCwgbGluayk7Ci0JCWxpc3RfZGVsX2luaXQoJm9wLT5saW5rKTsKLQotCQlyeHJwY19jYWxsX2Fib3J0KG9wLT5jYWxsLCAtRUlPKTsKLQkJcnhycGNfcHV0X2NhbGwob3AtPmNhbGwpOwotCQlvcC0+Y2FsbCA9IE5VTEw7Ci0KLQkJb3AtPm9wcy0+ZGlzY2FyZChvcCk7Ci0JfQotCi0JLyogYW5kIHRoYXQncyBhbGwgKi8KLQlfbGVhdmUoIiIpOwotCWNvbXBsZXRlX2FuZF9leGl0KCZrYWZzYXN5bmNkX2RlYWQsIDApOwotCi19IC8qIGVuZCBrYWZzYXN5bmNkKCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIGJlZ2luIGFuIG9wZXJhdGlvbgotICogLSBwbGFjZSBvcGVyYXRpb24gb24gYnVzeSBxdWV1ZQotICovCi12b2lkIGFmc19rYWZzYXN5bmNkX2JlZ2luX29wKHN0cnVjdCBhZnNfYXN5bmNfb3AgKm9wKQotewotCV9lbnRlcigiIik7Ci0KLQlzcGluX2xvY2soJmthZnNhc3luY2RfYXN5bmNfbG9jayk7Ci0KLQlpbml0X3dhaXRxdWV1ZV9lbnRyeSgmb3AtPndhaXRlciwga2Fmc2FzeW5jZF90YXNrKTsKLQlhZGRfd2FpdF9xdWV1ZSgmb3AtPmNhbGwtPndhaXRxLCAmb3AtPndhaXRlcik7Ci0KLQlsaXN0X21vdmVfdGFpbCgmb3AtPmxpbmssICZrYWZzYXN5bmNkX2FzeW5jX2J1c3lxKTsKLQotCXNwaW5fdW5sb2NrKCZrYWZzYXN5bmNkX2FzeW5jX2xvY2spOwotCi0JX2xlYXZlKCIiKTsKLX0gLyogZW5kIGFmc19rYWZzYXN5bmNkX2JlZ2luX29wKCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIHJlcXVlc3QgYXR0ZW50aW9uIGZvciBhbiBvcGVyYXRpb24KLSAqIC0gbW92ZSB0byBhdHRlbnRpb24gcXVldWUKLSAqLwotdm9pZCBhZnNfa2Fmc2FzeW5jZF9hdHRlbmRfb3Aoc3RydWN0IGFmc19hc3luY19vcCAqb3ApCi17Ci0JX2VudGVyKCIiKTsKLQotCXNwaW5fbG9jaygma2Fmc2FzeW5jZF9hc3luY19sb2NrKTsKLQotCWxpc3RfbW92ZV90YWlsKCZvcC0+bGluaywgJmthZnNhc3luY2RfYXN5bmNfYXR0bnEpOwotCi0Jc3Bpbl91bmxvY2soJmthZnNhc3luY2RfYXN5bmNfbG9jayk7Ci0KLQl3YWtlX3VwKCZrYWZzYXN5bmNkX3NsZWVwcSk7Ci0KLQlfbGVhdmUoIiIpOwotfSAvKiBlbmQgYWZzX2thZnNhc3luY2RfYXR0ZW5kX29wKCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIHRlcm1pbmF0ZSBhbiBvcGVyYXRpb24KLSAqIC0gcmVtb3ZlIGZyb20gZWl0aGVyIHF1ZXVlCi0gKi8KLXZvaWQgYWZzX2thZnNhc3luY2RfdGVybWluYXRlX29wKHN0cnVjdCBhZnNfYXN5bmNfb3AgKm9wKQotewotCV9lbnRlcigiIik7Ci0KLQlzcGluX2xvY2soJmthZnNhc3luY2RfYXN5bmNfbG9jayk7Ci0KLQlpZiAoIWxpc3RfZW1wdHkoJm9wLT5saW5rKSkgewotCQlsaXN0X2RlbF9pbml0KCZvcC0+bGluayk7Ci0JCXJlbW92ZV93YWl0X3F1ZXVlKCZvcC0+Y2FsbC0+d2FpdHEsICZvcC0+d2FpdGVyKTsKLQl9Ci0KLQlzcGluX3VubG9jaygma2Fmc2FzeW5jZF9hc3luY19sb2NrKTsKLQotCXdha2VfdXAoJmthZnNhc3luY2Rfc2xlZXBxKTsKLQotCV9sZWF2ZSgiIik7Ci19IC8qIGVuZCBhZnNfa2Fmc2FzeW5jZF90ZXJtaW5hdGVfb3AoKSAqLwpkaWZmIC0tZ2l0IGEvZnMvYWZzL2thZnNhc3luY2QuaCBiL2ZzL2Fmcy9rYWZzYXN5bmNkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5MTgwM2YuLjAwMDAwMDAKLS0tIGEvZnMvYWZzL2thZnNhc3luY2QuaAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qIGthZnNhc3luY2QuaDogQUZTIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gZGFlbW9uCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi0KLSNpZm5kZWYgX0xJTlVYX0FGU19LQUZTQVNZTkNEX0gKLSNkZWZpbmUgX0xJTlVYX0FGU19LQUZTQVNZTkNEX0gKLQotI2luY2x1ZGUgInR5cGVzLmgiCi0KLXN0cnVjdCBhZnNfYXN5bmNfb3A7Ci0KLXN0cnVjdCBhZnNfYXN5bmNfb3Bfb3BzIHsKLQl2b2lkICgqYXR0ZW5kKShzdHJ1Y3QgYWZzX2FzeW5jX29wICpvcCk7Ci0Jdm9pZCAoKmRpc2NhcmQpKHN0cnVjdCBhZnNfYXN5bmNfb3AgKm9wKTsKLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBhc3luY2hyb25vdXMgb3BlcmF0aW9uIHJlY29yZAotICovCi1zdHJ1Y3QgYWZzX2FzeW5jX29wCi17Ci0Jc3RydWN0IGxpc3RfaGVhZAkJbGluazsKLQlzdHJ1Y3QgYWZzX3NlcnZlcgkJKnNlcnZlcjsJLyogc2VydmVyIGJlaW5nIGNvbnRhY3RlZCAqLwotCXN0cnVjdCByeHJwY19jYWxsCQkqY2FsbDsJCS8qIFJ4UlBDIGNhbGwgcGVyZm9ybWluZyBvcCAqLwotCXdhaXRfcXVldWVfdAkJCXdhaXRlcjsJCS8qIHdhaXQgcXVldWUgZm9yIGthZnNhc3luY2QgKi8KLQljb25zdCBzdHJ1Y3QgYWZzX2FzeW5jX29wX29wcwkqb3BzOwkJLyogb3BlcmF0aW9ucyAqLwotfTsKLQotc3RhdGljIGlubGluZSB2b2lkIGFmc19hc3luY19vcF9pbml0KHN0cnVjdCBhZnNfYXN5bmNfb3AgKm9wLAotCQkJCSAgICAgY29uc3Qgc3RydWN0IGFmc19hc3luY19vcF9vcHMgKm9wcykKLXsKLQlJTklUX0xJU1RfSEVBRCgmb3AtPmxpbmspOwotCW9wLT5jYWxsID0gTlVMTDsKLQlvcC0+b3BzID0gb3BzOwotfQotCi1leHRlcm4gaW50IGFmc19rYWZzYXN5bmNkX3N0YXJ0KHZvaWQpOwotZXh0ZXJuIHZvaWQgYWZzX2thZnNhc3luY2Rfc3RvcCh2b2lkKTsKLQotZXh0ZXJuIHZvaWQgYWZzX2thZnNhc3luY2RfYmVnaW5fb3Aoc3RydWN0IGFmc19hc3luY19vcCAqb3ApOwotZXh0ZXJuIHZvaWQgYWZzX2thZnNhc3luY2RfYXR0ZW5kX29wKHN0cnVjdCBhZnNfYXN5bmNfb3AgKm9wKTsKLWV4dGVybiB2b2lkIGFmc19rYWZzYXN5bmNkX3Rlcm1pbmF0ZV9vcChzdHJ1Y3QgYWZzX2FzeW5jX29wICpvcCk7Ci0KLSNlbmRpZiAvKiBfTElOVVhfQUZTX0tBRlNBU1lOQ0RfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvYWZzL2thZnN0aW1vZC5jIGIvZnMvYWZzL2thZnN0aW1vZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTQzNDRlLi4wMDAwMDAwCi0tLSBhL2ZzL2Fmcy9rYWZzdGltb2QuYworKysgL2Rldi9udWxsCkBAIC0xLDIwNSArMCwwIEBACi0vKiBrYWZzdGltb2QuYzogQUZTIHRpbWVvdXQgZGFlbW9uCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+Ci0jaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgotI2luY2x1ZGUgImNlbGwuaCIKLSNpbmNsdWRlICJ2b2x1bWUuaCIKLSNpbmNsdWRlICJrYWZzdGltb2QuaCIKLSNpbmNsdWRlIDxhc20vZXJybm8uaD4KLSNpbmNsdWRlICJpbnRlcm5hbC5oIgotCi1zdGF0aWMgREVDTEFSRV9DT01QTEVUSU9OKGthZnN0aW1vZF9hbGl2ZSk7Ci1zdGF0aWMgREVDTEFSRV9DT01QTEVUSU9OKGthZnN0aW1vZF9kZWFkKTsKLXN0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChrYWZzdGltb2Rfc2xlZXBxKTsKLXN0YXRpYyBpbnQga2Fmc3RpbW9kX2RpZTsKLQotc3RhdGljIExJU1RfSEVBRChrYWZzdGltb2RfbGlzdCk7Ci1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKGthZnN0aW1vZF9sb2NrKTsKLQotc3RhdGljIGludCBrYWZzdGltb2Qodm9pZCAqYXJnKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIHN0YXJ0IHRoZSB0aW1lb3V0IGRhZW1vbgotICovCi1pbnQgYWZzX2thZnN0aW1vZF9zdGFydCh2b2lkKQotewotCWludCByZXQ7Ci0KLQlyZXQgPSBrZXJuZWxfdGhyZWFkKGthZnN0aW1vZCwgTlVMTCwgMCk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZrYWZzdGltb2RfYWxpdmUpOwotCi0JcmV0dXJuIHJldDsKLX0gLyogZW5kIGFmc19rYWZzdGltb2Rfc3RhcnQoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogc3RvcCB0aGUgdGltZW91dCBkYWVtb24KLSAqLwotdm9pZCBhZnNfa2Fmc3RpbW9kX3N0b3Aodm9pZCkKLXsKLQkvKiBnZXQgcmlkIG9mIG15IGRhZW1vbiAqLwotCWthZnN0aW1vZF9kaWUgPSAxOwotCXdha2VfdXAoJmthZnN0aW1vZF9zbGVlcHEpOwotCXdhaXRfZm9yX2NvbXBsZXRpb24oJmthZnN0aW1vZF9kZWFkKTsKLQotfSAvKiBlbmQgYWZzX2thZnN0aW1vZF9zdG9wKCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIHRpbWVvdXQgcHJvY2Vzc2luZyBkYWVtb24KLSAqLwotc3RhdGljIGludCBrYWZzdGltb2Qodm9pZCAqYXJnKQotewotCXN0cnVjdCBhZnNfdGltZXIgKnRpbWVyOwotCi0JREVDTEFSRV9XQUlUUVVFVUUobXlzZWxmLCBjdXJyZW50KTsKLQotCXByaW50aygia0FGUzogU3RhcnRlZCBrYWZzdGltb2QgJWRcbiIsIGN1cnJlbnQtPnBpZCk7Ci0KLQlkYWVtb25pemUoImthZnN0aW1vZCIpOwotCi0JY29tcGxldGUoJmthZnN0aW1vZF9hbGl2ZSk7Ci0KLQkvKiBsb29wIGFyb3VuZCBsb29raW5nIGZvciB0aGluZ3MgdG8gYXR0ZW5kIHRvICovCi0gbG9vcDoKLQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCWFkZF93YWl0X3F1ZXVlKCZrYWZzdGltb2Rfc2xlZXBxLCAmbXlzZWxmKTsKLQotCWZvciAoOzspIHsKLQkJdW5zaWduZWQgbG9uZyBqaWY7Ci0JCXNpZ25lZCBsb25nIHRpbWVvdXQ7Ci0KLQkJLyogZGVhbCB3aXRoIHRoZSBzZXJ2ZXIgYmVpbmcgYXNrZWQgdG8gZGllICovCi0JCWlmIChrYWZzdGltb2RfZGllKSB7Ci0JCQlyZW1vdmVfd2FpdF9xdWV1ZSgma2Fmc3RpbW9kX3NsZWVwcSwgJm15c2VsZik7Ci0JCQlfbGVhdmUoIiIpOwotCQkJY29tcGxldGVfYW5kX2V4aXQoJmthZnN0aW1vZF9kZWFkLCAwKTsKLQkJfQotCi0JCXRyeV90b19mcmVlemUoKTsKLQotCQkvKiBkaXNjYXJkIHBlbmRpbmcgc2lnbmFscyAqLwotCQlhZnNfZGlzY2FyZF9teV9zaWduYWxzKCk7Ci0KLQkJLyogd29yayBvdXQgdGhlIHRpbWUgdG8gZWxhcHNlIGJlZm9yZSB0aGUgbmV4dCBldmVudCAqLwotCQlzcGluX2xvY2soJmthZnN0aW1vZF9sb2NrKTsKLQkJaWYgKGxpc3RfZW1wdHkoJmthZnN0aW1vZF9saXN0KSkgewotCQkJdGltZW91dCA9IE1BWF9TQ0hFRFVMRV9USU1FT1VUOwotCQl9Ci0JCWVsc2UgewotCQkJdGltZXIgPSBsaXN0X2VudHJ5KGthZnN0aW1vZF9saXN0Lm5leHQsCi0JCQkJCSAgIHN0cnVjdCBhZnNfdGltZXIsIGxpbmspOwotCQkJdGltZW91dCA9IHRpbWVyLT50aW1vX2ppZjsKLQkJCWppZiA9IGppZmZpZXM7Ci0KLQkJCWlmICh0aW1lX2JlZm9yZV9lcSgodW5zaWduZWQgbG9uZykgdGltZW91dCwgamlmKSkKLQkJCQlnb3RvIGltbWVkaWF0ZTsKLQotCQkJZWxzZSB7Ci0JCQkJdGltZW91dCA9IChsb25nKSB0aW1lb3V0IC0gKGxvbmcpIGppZmZpZXM7Ci0JCQl9Ci0JCX0KLQkJc3Bpbl91bmxvY2soJmthZnN0aW1vZF9sb2NrKTsKLQotCQlzY2hlZHVsZV90aW1lb3V0KHRpbWVvdXQpOwotCi0JCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JfQotCi0JLyogdGhlIHRoaW5nIG9uIHRoZSBmcm9udCBvZiB0aGUgcXVldWUgbmVlZHMgcHJvY2Vzc2luZwotCSAqIC0gd2UgY29tZSBoZXJlIHdpdGggdGhlIGxvY2sgaGVsZCBhbmQgdGltZXIgcG9pbnRpbmcgdG8gdGhlIGV4cGlyZWQKLQkgKiAgIGVudHJ5Ci0JICovCi0gaW1tZWRpYXRlOgotCXJlbW92ZV93YWl0X3F1ZXVlKCZrYWZzdGltb2Rfc2xlZXBxLCAmbXlzZWxmKTsKLQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwotCi0JX2RlYnVnKCJAQEAgQmVnaW4gVGltZW91dCBvZiAlcCIsIHRpbWVyKTsKLQotCS8qIGRlcXVldWUgdGhlIHRpbWVyICovCi0JbGlzdF9kZWxfaW5pdCgmdGltZXItPmxpbmspOwotCXNwaW5fdW5sb2NrKCZrYWZzdGltb2RfbG9jayk7Ci0KLQkvKiBjYWxsIHRoZSB0aW1lb3V0IGZ1bmN0aW9uICovCi0JdGltZXItPm9wcy0+dGltZWRfb3V0KHRpbWVyKTsKLQotCV9kZWJ1ZygiQEBAIEVuZCBUaW1lb3V0Iik7Ci0JZ290byBsb29wOwotCi19IC8qIGVuZCBrYWZzdGltb2QoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogKHJlLSlxdWV1ZSBhIHRpbWVyCi0gKi8KLXZvaWQgYWZzX2thZnN0aW1vZF9hZGRfdGltZXIoc3RydWN0IGFmc190aW1lciAqdGltZXIsIHVuc2lnbmVkIGxvbmcgdGltZW91dCkKLXsKLQlzdHJ1Y3QgYWZzX3RpbWVyICpwdGltZXI7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqX3A7Ci0KLQlfZW50ZXIoIiVwLCVsdSIsIHRpbWVyLCB0aW1lb3V0KTsKLQotCXNwaW5fbG9jaygma2Fmc3RpbW9kX2xvY2spOwotCi0JbGlzdF9kZWwoJnRpbWVyLT5saW5rKTsKLQotCS8qIHRoZSB0aW1lciB3YXMgZGVmZXJyZWQgb3IgcmVzZXQgLSBwdXQgaXQgYmFjayBpbiB0aGUgcXVldWUgYXQgdGhlCi0JICogcmlnaHQgcGxhY2UgKi8KLQl0aW1lci0+dGltb19qaWYgPSBqaWZmaWVzICsgdGltZW91dDsKLQotCWxpc3RfZm9yX2VhY2goX3AsICZrYWZzdGltb2RfbGlzdCkgewotCQlwdGltZXIgPSBsaXN0X2VudHJ5KF9wLCBzdHJ1Y3QgYWZzX3RpbWVyLCBsaW5rKTsKLQkJaWYgKHRpbWVfYmVmb3JlKHRpbWVyLT50aW1vX2ppZiwgcHRpbWVyLT50aW1vX2ppZikpCi0JCQlicmVhazsKLQl9Ci0KLQlsaXN0X2FkZF90YWlsKCZ0aW1lci0+bGluaywgX3ApOyAvKiBpbnNlcnQgYmVmb3JlIHN0b3BwaW5nIHBvaW50ICovCi0KLQlzcGluX3VubG9jaygma2Fmc3RpbW9kX2xvY2spOwotCi0Jd2FrZV91cCgma2Fmc3RpbW9kX3NsZWVwcSk7Ci0KLQlfbGVhdmUoIiIpOwotfSAvKiBlbmQgYWZzX2thZnN0aW1vZF9hZGRfdGltZXIoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogZGVxdWV1ZSBhIHRpbWVyCi0gKiAtIHJldHVybnMgMCBpZiB0aGUgdGltZXIgd2FzIGRlbGV0ZWQgb3IgLUVOT0VOVCBpZiBpdCB3YXNuJ3QgcXVldWVkCi0gKi8KLWludCBhZnNfa2Fmc3RpbW9kX2RlbF90aW1lcihzdHJ1Y3QgYWZzX3RpbWVyICp0aW1lcikKLXsKLQlpbnQgcmV0ID0gMDsKLQotCV9lbnRlcigiJXAiLCB0aW1lcik7Ci0KLQlzcGluX2xvY2soJmthZnN0aW1vZF9sb2NrKTsKLQotCWlmIChsaXN0X2VtcHR5KCZ0aW1lci0+bGluaykpCi0JCXJldCA9IC1FTk9FTlQ7Ci0JZWxzZQotCQlsaXN0X2RlbF9pbml0KCZ0aW1lci0+bGluayk7Ci0KLQlzcGluX3VubG9jaygma2Fmc3RpbW9kX2xvY2spOwotCi0Jd2FrZV91cCgma2Fmc3RpbW9kX3NsZWVwcSk7Ci0KLQlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKLQlyZXR1cm4gcmV0OwotfSAvKiBlbmQgYWZzX2thZnN0aW1vZF9kZWxfdGltZXIoKSAqLwpkaWZmIC0tZ2l0IGEvZnMvYWZzL2thZnN0aW1vZC5oIGIvZnMvYWZzL2thZnN0aW1vZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzEyZjFhLi4wMDAwMDAwCi0tLSBhL2ZzL2Fmcy9rYWZzdGltb2QuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qIGthZnN0aW1vZC5oOiBBRlMgdGltZW91dCBkYWVtb24KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLQotI2lmbmRlZiBfTElOVVhfQUZTX0tBRlNUSU1PRF9ICi0jZGVmaW5lIF9MSU5VWF9BRlNfS0FGU1RJTU9EX0gKLQotI2luY2x1ZGUgInR5cGVzLmgiCi0KLXN0cnVjdCBhZnNfdGltZXI7Ci0KLXN0cnVjdCBhZnNfdGltZXJfb3BzIHsKLQkvKiBjYWxsZWQgd2hlbiB0aGUgZnJvbnQgb2YgdGhlIHRpbWVyIHF1ZXVlIGhhcyB0aW1lZCBvdXQgKi8KLQl2b2lkICgqdGltZWRfb3V0KShzdHJ1Y3QgYWZzX3RpbWVyICp0aW1lcik7Ci19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQUZTIHRpbWVyL3RpbWVvdXQgcmVjb3JkCi0gKi8KLXN0cnVjdCBhZnNfdGltZXIKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkCQlsaW5rOwkJLyogbGluayBpbiB0aW1lciBxdWV1ZSAqLwotCXVuc2lnbmVkIGxvbmcJCQl0aW1vX2ppZjsJLyogdGltZW91dCB0aW1lICovCi0JY29uc3Qgc3RydWN0IGFmc190aW1lcl9vcHMJKm9wczsJCS8qIHRpbWVvdXQgZXhwaXJ5IGZ1bmN0aW9uICovCi19OwotCi1zdGF0aWMgaW5saW5lIHZvaWQgYWZzX3RpbWVyX2luaXQoc3RydWN0IGFmc190aW1lciAqdGltZXIsCi0JCQkJICBjb25zdCBzdHJ1Y3QgYWZzX3RpbWVyX29wcyAqb3BzKQotewotCUlOSVRfTElTVF9IRUFEKCZ0aW1lci0+bGluayk7Ci0JdGltZXItPm9wcyA9IG9wczsKLX0KLQotZXh0ZXJuIGludCBhZnNfa2Fmc3RpbW9kX3N0YXJ0KHZvaWQpOwotZXh0ZXJuIHZvaWQgYWZzX2thZnN0aW1vZF9zdG9wKHZvaWQpOwotCi1leHRlcm4gdm9pZCBhZnNfa2Fmc3RpbW9kX2FkZF90aW1lcihzdHJ1Y3QgYWZzX3RpbWVyICp0aW1lciwKLQkJCQkgICAgdW5zaWduZWQgbG9uZyB0aW1lb3V0KTsKLWV4dGVybiBpbnQgYWZzX2thZnN0aW1vZF9kZWxfdGltZXIoc3RydWN0IGFmc190aW1lciAqdGltZXIpOwotCi0jZW5kaWYgLyogX0xJTlVYX0FGU19LQUZTVElNT0RfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvYWZzL21haW4uYyBiL2ZzL2Fmcy9tYWluLmMKaW5kZXggZjI3MDRiYS4uNDBjMjcwNCAxMDA2NDQKLS0tIGEvZnMvYWZzL21haW4uYworKysgYi9mcy9hZnMvbWFpbi5jCkBAIC0xLDQgKzEsNCBAQAotLyogbWFpbi5jOiBBRlMgY2xpZW50IGZpbGUgc3lzdGVtCisvKiBBRlMgY2xpZW50IGZpbGUgc3lzdGVtCiAgKgogICogQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKQEAgLTEzLDQzICsxMywyMSBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KLSNpbmNsdWRlIDxyeHJwYy9yeHJwYy5oPgotI2luY2x1ZGUgPHJ4cnBjL3RyYW5zcG9ydC5oPgotI2luY2x1ZGUgPHJ4cnBjL2NhbGwuaD4KLSNpbmNsdWRlIDxyeHJwYy9wZWVyLmg+Ci0jaW5jbHVkZSAiY2FjaGUuaCIKLSNpbmNsdWRlICJjZWxsLmgiCi0jaW5jbHVkZSAic2VydmVyLmgiCi0jaW5jbHVkZSAiZnNjbGllbnQuaCIKLSNpbmNsdWRlICJjbXNlcnZpY2UuaCIKLSNpbmNsdWRlICJrYWZzdGltb2QuaCIKLSNpbmNsdWRlICJrYWZzYXN5bmNkLmgiCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAotc3RydWN0IHJ4cnBjX3RyYW5zcG9ydCAqYWZzX3RyYW5zcG9ydDsKLQotc3RhdGljIGludCBhZnNfYWRkaW5nX3BlZXIoc3RydWN0IHJ4cnBjX3BlZXIgKnBlZXIpOwotc3RhdGljIHZvaWQgYWZzX2Rpc2NhcmRpbmdfcGVlcihzdHJ1Y3QgcnhycGNfcGVlciAqcGVlcik7Ci0KLQogTU9EVUxFX0RFU0NSSVBUSU9OKCJBRlMgQ2xpZW50IEZpbGUgU3lzdGVtIik7CiBNT0RVTEVfQVVUSE9SKCJSZWQgSGF0LCBJbmMuIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKK3Vuc2lnbmVkIGFmc19kZWJ1ZzsKK21vZHVsZV9wYXJhbV9uYW1lZChkZWJ1ZywgYWZzX2RlYnVnLCB1aW50LCBTX0lXVVNSIHwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKGFmc19kZWJ1ZywgIkFGUyBkZWJ1Z2dpbmcgbWFzayIpOworCiBzdGF0aWMgY2hhciAqcm9vdGNlbGw7CiAKIG1vZHVsZV9wYXJhbShyb290Y2VsbCwgY2hhcnAsIDApOwogTU9EVUxFX1BBUk1fREVTQyhyb290Y2VsbCwgInJvb3QgQUZTIGNlbGwgbmFtZSBhbmQgVkwgc2VydmVyIElQIGFkZHIgbGlzdCIpOwogCi0KLXN0YXRpYyBzdHJ1Y3QgcnhycGNfcGVlcl9vcHMgYWZzX3BlZXJfb3BzID0gewotCS5hZGRpbmcJCT0gYWZzX2FkZGluZ19wZWVyLAotCS5kaXNjYXJkaW5nCT0gYWZzX2Rpc2NhcmRpbmdfcGVlciwKLX07Ci0KLXN0cnVjdCBsaXN0X2hlYWQgYWZzX2NiX2hhc2hfdGJsW0FGU19DQl9IQVNIX0NPVU5UXTsKLURFRklORV9TUElOTE9DSyhhZnNfY2JfaGFzaF9sb2NrKTsKLQogI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKIHN0YXRpYyBzdHJ1Y3QgY2FjaGVmc19uZXRmc19vcGVyYXRpb25zIGFmc19jYWNoZV9vcHMgPSB7CiAJLmdldF9wYWdlX2Nvb2tpZQk9IGFmc19jYWNoZV9nZXRfcGFnZV9jb29raWUsCkBAIC02MiwyMCArNDAsNjMgQEAKIH07CiAjZW5kaWYKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IGFmc191dWlkIGFmc191dWlkOworCisvKgorICogZ2V0IGEgY2xpZW50IFVVSUQKKyAqLworc3RhdGljIGludCBfX2luaXQgYWZzX2dldF9jbGllbnRfVVVJRCh2b2lkKQoreworCXN0cnVjdCB0aW1lc3BlYyB0czsKKwl1NjQgdXVpZHRpbWU7CisJdTE2IGNsb2Nrc2VxOworCWludCByZXQ7CisKKwkvKiByZWFkIHRoZSBNQUMgYWRkcmVzcyBvZiBvbmUgb2YgdGhlIGV4dGVybmFsIGludGVyZmFjZXMgYW5kIGNvbnN0cnVjdAorCSAqIGEgVVVJRCBmcm9tIGl0ICovCisJcmV0ID0gYWZzX2dldF9NQUNfYWRkcmVzcyhhZnNfdXVpZC5ub2RlKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWdldG5zdGltZW9mZGF5KCZ0cyk7CisJdXVpZHRpbWUgPSAodTY0KSB0cy50dl9zZWMgKiAxMDAwICogMTAwMCAqIDEwOworCXV1aWR0aW1lICs9IHRzLnR2X25zZWMgLyAxMDA7CisJdXVpZHRpbWUgKz0gQUZTX1VVSURfVE9fVU5JWF9USU1FOworCWFmc191dWlkLnRpbWVfbG93ID0gdXVpZHRpbWU7CisJYWZzX3V1aWQudGltZV9taWQgPSB1dWlkdGltZSA+PiAzMjsKKwlhZnNfdXVpZC50aW1lX2hpX2FuZF92ZXJzaW9uID0gKHV1aWR0aW1lID4+IDQ4KSAmIEFGU19VVUlEX1RJTUVISV9NQVNLOworCWFmc191dWlkLnRpbWVfaGlfYW5kX3ZlcnNpb24gPSBBRlNfVVVJRF9WRVJTSU9OX1RJTUU7CisKKwlnZXRfcmFuZG9tX2J5dGVzKCZjbG9ja3NlcSwgMik7CisJYWZzX3V1aWQuY2xvY2tfc2VxX2xvdyA9IGNsb2Nrc2VxOworCWFmc191dWlkLmNsb2NrX3NlcV9oaV9hbmRfcmVzZXJ2ZWQgPQorCQkoY2xvY2tzZXEgPj4gOCkgJiBBRlNfVVVJRF9DTE9DS0hJX01BU0s7CisJYWZzX3V1aWQuY2xvY2tfc2VxX2hpX2FuZF9yZXNlcnZlZCA9IEFGU19VVUlEX1ZBUklBTlRfU1REOworCisJX2RlYnVnKCJBRlMgVVVJRDogJTA4eC0lMDR4LSUwNHgtJTAyeCUwMngtJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4IiwKKwkgICAgICAgYWZzX3V1aWQudGltZV9sb3csCisJICAgICAgIGFmc191dWlkLnRpbWVfbWlkLAorCSAgICAgICBhZnNfdXVpZC50aW1lX2hpX2FuZF92ZXJzaW9uLAorCSAgICAgICBhZnNfdXVpZC5jbG9ja19zZXFfaGlfYW5kX3Jlc2VydmVkLAorCSAgICAgICBhZnNfdXVpZC5jbG9ja19zZXFfbG93LAorCSAgICAgICBhZnNfdXVpZC5ub2RlWzBdLCBhZnNfdXVpZC5ub2RlWzFdLCBhZnNfdXVpZC5ub2RlWzJdLAorCSAgICAgICBhZnNfdXVpZC5ub2RlWzNdLCBhZnNfdXVpZC5ub2RlWzRdLCBhZnNfdXVpZC5ub2RlWzVdKTsKKworCXJldHVybiAwOworfQorCiAvKgogICogaW5pdGlhbGlzZSB0aGUgQUZTIGNsaWVudCBGUyBtb2R1bGUKICAqLwogc3RhdGljIGludCBfX2luaXQgYWZzX2luaXQodm9pZCkKIHsKLQlpbnQgbG9vcCwgcmV0OworCWludCByZXQ7CiAKIAlwcmludGsoS0VSTl9JTkZPICJrQUZTOiBSZWQgSGF0IEFGUyBjbGllbnQgdjAuMSByZWdpc3RlcmluZy5cbiIpOwogCi0JLyogaW5pdGlhbGlzZSB0aGUgY2FsbGJhY2sgaGFzaCB0YWJsZSAqLwotCXNwaW5fbG9ja19pbml0KCZhZnNfY2JfaGFzaF9sb2NrKTsKLQlmb3IgKGxvb3AgPSBBRlNfQ0JfSEFTSF9DT1VOVCAtIDE7IGxvb3AgPj0gMDsgbG9vcC0tKQotCQlJTklUX0xJU1RfSEVBRCgmYWZzX2NiX2hhc2hfdGJsW2xvb3BdKTsKKwlyZXQgPSBhZnNfZ2V0X2NsaWVudF9VVUlEKCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CiAKIAkvKiByZWdpc3RlciB0aGUgL3Byb2Mgc3R1ZmYgKi8KIAlyZXQgPSBhZnNfcHJvY19pbml0KCk7CkBAIC04Nyw3MCArMTA4LDU2IEBACiAJcmV0ID0gY2FjaGVmc19yZWdpc3Rlcl9uZXRmcygmYWZzX2NhY2hlX25ldGZzLAogCQkJCSAgICAgJmFmc19jYWNoZV9jZWxsX2luZGV4X2RlZik7CiAJaWYgKHJldCA8IDApCi0JCWdvdG8gZXJyb3I7Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19LRVlTX1RVUk5FRF9PRkYKLQlyZXQgPSBhZnNfa2V5X3JlZ2lzdGVyKCk7Ci0JaWYgKHJldCA8IDApCiAJCWdvdG8gZXJyb3JfY2FjaGU7CiAjZW5kaWYKIAogCS8qIGluaXRpYWxpc2UgdGhlIGNlbGwgREIgKi8KIAlyZXQgPSBhZnNfY2VsbF9pbml0KHJvb3RjZWxsKTsKIAlpZiAocmV0IDwgMCkKLQkJZ290byBlcnJvcl9rZXlzOworCQlnb3RvIGVycm9yX2NlbGxfaW5pdDsKIAotCS8qIHN0YXJ0IHRoZSB0aW1lb3V0IGRhZW1vbiAqLwotCXJldCA9IGFmc19rYWZzdGltb2Rfc3RhcnQoKTsKKwkvKiBpbml0aWFsaXNlIHRoZSBWTCB1cGRhdGUgcHJvY2VzcyAqLworCXJldCA9IGFmc192bG9jYXRpb25fdXBkYXRlX2luaXQoKTsKIAlpZiAocmV0IDwgMCkKLQkJZ290byBlcnJvcl9rZXlzOworCQlnb3RvIGVycm9yX3ZsX3VwZGF0ZV9pbml0OwogCi0JLyogc3RhcnQgdGhlIGFzeW5jIG9wZXJhdGlvbiBkYWVtb24gKi8KLQlyZXQgPSBhZnNfa2Fmc2FzeW5jZF9zdGFydCgpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIGVycm9yX2thZnN0aW1vZDsKKwkvKiBpbml0aWFsaXNlIHRoZSBjYWxsYmFjayB1cGRhdGUgcHJvY2VzcyAqLworCXJldCA9IGFmc19jYWxsYmFja191cGRhdGVfaW5pdCgpOwogCiAJLyogY3JlYXRlIHRoZSBSeFJQQyB0cmFuc3BvcnQgKi8KLQlyZXQgPSByeHJwY19jcmVhdGVfdHJhbnNwb3J0KDcwMDEsICZhZnNfdHJhbnNwb3J0KTsKKwlyZXQgPSBhZnNfb3Blbl9zb2NrZXQoKTsKIAlpZiAocmV0IDwgMCkKLQkJZ290byBlcnJvcl9rYWZzYXN5bmNkOwotCi0JYWZzX3RyYW5zcG9ydC0+cGVlcl9vcHMgPSAmYWZzX3BlZXJfb3BzOworCQlnb3RvIGVycm9yX29wZW5fc29ja2V0OwogCiAJLyogcmVnaXN0ZXIgdGhlIGZpbGVzeXN0ZW1zICovCiAJcmV0ID0gYWZzX2ZzX2luaXQoKTsKIAlpZiAocmV0IDwgMCkKLQkJZ290byBlcnJvcl90cmFuc3BvcnQ7CisJCWdvdG8gZXJyb3JfZnM7CiAKIAlyZXR1cm4gcmV0OwogCi0gZXJyb3JfdHJhbnNwb3J0OgotCXJ4cnBjX3B1dF90cmFuc3BvcnQoYWZzX3RyYW5zcG9ydCk7Ci0gZXJyb3Jfa2Fmc2FzeW5jZDoKLQlhZnNfa2Fmc2FzeW5jZF9zdG9wKCk7Ci0gZXJyb3Jfa2Fmc3RpbW9kOgotCWFmc19rYWZzdGltb2Rfc3RvcCgpOwotIGVycm9yX2tleXM6Ci0jaWZkZWYgQ09ORklHX0tFWVNfVFVSTkVEX09GRgotCWFmc19rZXlfdW5yZWdpc3RlcigpOwotIGVycm9yX2NhY2hlOgotI2VuZGlmCitlcnJvcl9mczoKKwlhZnNfY2xvc2Vfc29ja2V0KCk7CitlcnJvcl9vcGVuX3NvY2tldDoKK2Vycm9yX3ZsX3VwZGF0ZV9pbml0OgorZXJyb3JfY2VsbF9pbml0OgogI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKIAljYWNoZWZzX3VucmVnaXN0ZXJfbmV0ZnMoJmFmc19jYWNoZV9uZXRmcyk7Ci0gZXJyb3I6CitlcnJvcl9jYWNoZToKICNlbmRpZgorCWFmc19jYWxsYmFja191cGRhdGVfa2lsbCgpOworCWFmc192bG9jYXRpb25fcHVyZ2UoKTsKIAlhZnNfY2VsbF9wdXJnZSgpOwogCWFmc19wcm9jX2NsZWFudXAoKTsKIAlwcmludGsoS0VSTl9FUlIgImtBRlM6IGZhaWxlZCB0byByZWdpc3RlcjogJWRcbiIsIHJldCk7CiAJcmV0dXJuIHJldDsKLX0gLyogZW5kIGFmc19pbml0KCkgKi8KK30KIAogLyogWFhYIGxhdGVfaW5pdGNhbGwgaXMga2x1ZGd5LCBidXQgdGhlIG9ubHkgYWx0ZXJuYXRpdmUgc2VlbXMgdG8gY3JlYXRlCiAgKiBhIHRyYW5zcG9ydCB1cG9uIHRoZSBmaXJzdCBtb3VudCwgd2hpY2ggaXMgd29yc2UuIE9yIGlzIGl0PwogICovCiBsYXRlX2luaXRjYWxsKGFmc19pbml0KTsJLyogbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgbmV0LyB0byBjcmVhdGUgc29ja2V0ICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIC8qCiAgKiBjbGVhbiB1cCBvbiBtb2R1bGUgcmVtb3ZhbAogICovCkBAIC0xNTksMTI3ICsxNjYsMTYgQEAKIAlwcmludGsoS0VSTl9JTkZPICJrQUZTOiBSZWQgSGF0IEFGUyBjbGllbnQgdjAuMSB1bnJlZ2lzdGVyaW5nLlxuIik7CiAKIAlhZnNfZnNfZXhpdCgpOwotCXJ4cnBjX3B1dF90cmFuc3BvcnQoYWZzX3RyYW5zcG9ydCk7Ci0JYWZzX2thZnN0aW1vZF9zdG9wKCk7Ci0JYWZzX2thZnNhc3luY2Rfc3RvcCgpOworCWFmc19jbG9zZV9zb2NrZXQoKTsKKwlhZnNfcHVyZ2Vfc2VydmVycygpOworCWFmc19jYWxsYmFja191cGRhdGVfa2lsbCgpOworCWFmc192bG9jYXRpb25fcHVyZ2UoKTsKKwlmbHVzaF9zY2hlZHVsZWRfd29yaygpOwogCWFmc19jZWxsX3B1cmdlKCk7Ci0jaWZkZWYgQ09ORklHX0tFWVNfVFVSTkVEX09GRgotCWFmc19rZXlfdW5yZWdpc3RlcigpOwotI2VuZGlmCiAjaWZkZWYgQUZTX0NBQ0hJTkdfU1VQUE9SVAogCWNhY2hlZnNfdW5yZWdpc3Rlcl9uZXRmcygmYWZzX2NhY2hlX25ldGZzKTsKICNlbmRpZgogCWFmc19wcm9jX2NsZWFudXAoKTsKLQotfSAvKiBlbmQgYWZzX2V4aXQoKSAqLworfQogCiBtb2R1bGVfZXhpdChhZnNfZXhpdCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBub3RpZmljYXRpb24gdGhhdCBuZXcgcGVlciByZWNvcmQgaXMgYmVpbmcgYWRkZWQKLSAqIC0gY2FsbGVkIGZyb20ga3J4c2VjZAotICogLSByZXR1cm4gYW4gZXJyb3IgdG8gaW5kdWNlIGFuIGFib3J0Ci0gKiAtIG11c3RuJ3Qgc2xlZXAgKGNhbGxlciBob2xkcyBhbiByd2xvY2spCi0gKi8KLXN0YXRpYyBpbnQgYWZzX2FkZGluZ19wZWVyKHN0cnVjdCByeHJwY19wZWVyICpwZWVyKQotewotCXN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXI7Ci0JaW50IHJldDsKLQotCV9kZWJ1Zygia0FGUzogQWRkaW5nIG5ldyBwZWVyICUwOHhcbiIsIG50b2hsKHBlZXItPmFkZHIuc19hZGRyKSk7Ci0KLQkvKiBkZXRlcm1pbmUgd2hpY2ggc2VydmVyIHRoZSBwZWVyIHJlc2lkZXMgaW4gKGlmIGFueSkgKi8KLQlyZXQgPSBhZnNfc2VydmVyX2ZpbmRfYnlfcGVlcihwZWVyLCAmc2VydmVyKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsgLyogbm9uZSB0aGF0IHdlIHJlY29nbmlzZSwgc28gYWJvcnQgKi8KLQotCV9kZWJ1ZygiU2VydmVyICVwe3U9JWR9XG4iLCBzZXJ2ZXIsIGF0b21pY19yZWFkKCZzZXJ2ZXItPnVzYWdlKSk7Ci0KLQlfZGVidWcoIkNlbGwgJXB7dT0lZH1cbiIsCi0JICAgICAgIHNlcnZlci0+Y2VsbCwgYXRvbWljX3JlYWQoJnNlcnZlci0+Y2VsbC0+dXNhZ2UpKTsKLQotCS8qIGNyb3NzLXBvaW50IHRoZSBzdHJ1Y3RzIHVuZGVyIGEgZ2xvYmFsIGxvY2sgKi8KLQlzcGluX2xvY2soJmFmc19zZXJ2ZXJfcGVlcl9sb2NrKTsKLQlwZWVyLT51c2VyID0gc2VydmVyOwotCXNlcnZlci0+cGVlciA9IHBlZXI7Ci0Jc3Bpbl91bmxvY2soJmFmc19zZXJ2ZXJfcGVlcl9sb2NrKTsKLQotCWFmc19wdXRfc2VydmVyKHNlcnZlcik7Ci0KLQlyZXR1cm4gMDsKLX0gLyogZW5kIGFmc19hZGRpbmdfcGVlcigpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBub3RpZmljYXRpb24gdGhhdCBhIHBlZXIgcmVjb3JkIGlzIGJlaW5nIGRpc2NhcmRlZAotICogLSBjYWxsZWQgZnJvbSBrcnhpb2Qgb3Iga3J4c2VjZAotICovCi1zdGF0aWMgdm9pZCBhZnNfZGlzY2FyZGluZ19wZWVyKHN0cnVjdCByeHJwY19wZWVyICpwZWVyKQotewotCXN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXI7Ci0KLQlfZW50ZXIoIiVwIixwZWVyKTsKLQotCV9kZWJ1ZygiRGlzY2FyZGluZyBwZWVyICUwOHggKHJ0dD0lbHUuJWx1bVMpXG4iLAotCSAgICAgICBudG9obChwZWVyLT5hZGRyLnNfYWRkciksCi0JICAgICAgIChsb25nKSAocGVlci0+cnR0IC8gMTAwMCksCi0JICAgICAgIChsb25nKSAocGVlci0+cnR0ICUgMTAwMCkpOwotCi0JLyogdW5jcm9zcy1wb2ludCB0aGUgc3RydWN0cyB1bmRlciBhIGdsb2JhbCBsb2NrICovCi0Jc3Bpbl9sb2NrKCZhZnNfc2VydmVyX3BlZXJfbG9jayk7Ci0Jc2VydmVyID0gcGVlci0+dXNlcjsKLQlpZiAoc2VydmVyKSB7Ci0JCXBlZXItPnVzZXIgPSBOVUxMOwotCQlzZXJ2ZXItPnBlZXIgPSBOVUxMOwotCX0KLQlzcGluX3VubG9jaygmYWZzX3NlcnZlcl9wZWVyX2xvY2spOwotCi0JX2xlYXZlKCIiKTsKLQotfSAvKiBlbmQgYWZzX2Rpc2NhcmRpbmdfcGVlcigpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBjbGVhciB0aGUgZGVhZCBzcGFjZSBiZXR3ZWVuIHRhc2tfc3RydWN0IGFuZCBrZXJuZWwgc3RhY2sKLSAqIC0gY2FsbGVkIGJ5IHN1cHBseWluZyAtZmluc3RydW1lbnQtZnVuY3Rpb25zIHRvIGdjYwotICovCi0jaWYgMAotdm9pZCBfX2N5Z19wcm9maWxlX2Z1bmNfZW50ZXIgKHZvaWQgKnRoaXNfZm4sIHZvaWQgKmNhbGxfc2l0ZSkKLV9fYXR0cmlidXRlX18oKG5vX2luc3RydW1lbnRfZnVuY3Rpb24pKTsKLQotdm9pZCBfX2N5Z19wcm9maWxlX2Z1bmNfZW50ZXIgKHZvaWQgKnRoaXNfZm4sIHZvaWQgKmNhbGxfc2l0ZSkKLXsKLSAgICAgICBhc20gdm9sYXRpbGUoIiAgbW92bCAgICAlJWVzcCwlJWVkaSAgICAgXG4iCi0gICAgICAgICAgICAgICAgICAgICIgIGFuZGwgICAgJTAsJSVlZGkgICAgICAgIFxuIgotICAgICAgICAgICAgICAgICAgICAiICBhZGRsICAgICUxLCUlZWRpICAgICAgICBcbiIKLSAgICAgICAgICAgICAgICAgICAgIiAgbW92bCAgICAlJWVzcCwlJWVjeCAgICAgXG4iCi0gICAgICAgICAgICAgICAgICAgICIgIHN1YmwgICAgJSVlZGksJSVlY3ggICAgIFxuIgotICAgICAgICAgICAgICAgICAgICAiICBzaHJsICAgICQyLCUlZWN4ICAgICAgICBcbiIKLSAgICAgICAgICAgICAgICAgICAgIiAgbW92bCAgICAkMHhlZGVkZWRlZCwlJWVheCAgICAgXG4iCi0gICAgICAgICAgICAgICAgICAgICIgIHJlcCBzdG9zbCAgICAgICAgICAgICAgIFxuIgotICAgICAgICAgICAgICAgICAgICA6Ci0gICAgICAgICAgICAgICAgICAgIDogImkiKH4oVEhSRUFEX1NJWkUgLSAxKSksICJpIihzaXplb2Yoc3RydWN0IHRocmVhZF9pbmZvKSkKLSAgICAgICAgICAgICAgICAgICAgOiAiZWF4IiwgImVjeCIsICJlZGkiLCAibWVtb3J5IiwgImNjIgotICAgICAgICAgICAgICAgICAgICApOwotfQotCi12b2lkIF9fY3lnX3Byb2ZpbGVfZnVuY19leGl0KHZvaWQgKnRoaXNfZm4sIHZvaWQgKmNhbGxfc2l0ZSkKLV9fYXR0cmlidXRlX18oKG5vX2luc3RydW1lbnRfZnVuY3Rpb24pKTsKLQotdm9pZCBfX2N5Z19wcm9maWxlX2Z1bmNfZXhpdCh2b2lkICp0aGlzX2ZuLCB2b2lkICpjYWxsX3NpdGUpCi17Ci0gICAgICAgYXNtIHZvbGF0aWxlKCIgIG1vdmwgICAgJSVlc3AsJSVlZGkgICAgIFxuIgotICAgICAgICAgICAgICAgICAgICAiICBhbmRsICAgICUwLCUlZWRpICAgICAgICBcbiIKLSAgICAgICAgICAgICAgICAgICAgIiAgYWRkbCAgICAlMSwlJWVkaSAgICAgICAgXG4iCi0gICAgICAgICAgICAgICAgICAgICIgIG1vdmwgICAgJSVlc3AsJSVlY3ggICAgIFxuIgotICAgICAgICAgICAgICAgICAgICAiICBzdWJsICAgICUlZWRpLCUlZWN4ICAgICBcbiIKLSAgICAgICAgICAgICAgICAgICAgIiAgc2hybCAgICAkMiwlJWVjeCAgICAgICAgXG4iCi0gICAgICAgICAgICAgICAgICAgICIgIG1vdmwgICAgJDB4ZGFkYWRhZGEsJSVlYXggICAgIFxuIgotICAgICAgICAgICAgICAgICAgICAiICByZXAgc3Rvc2wgICAgICAgICAgICAgICBcbiIKLSAgICAgICAgICAgICAgICAgICAgOgotICAgICAgICAgICAgICAgICAgICA6ICJpIih+KFRIUkVBRF9TSVpFIC0gMSkpLCAiaSIoc2l6ZW9mKHN0cnVjdCB0aHJlYWRfaW5mbykpCi0gICAgICAgICAgICAgICAgICAgIDogImVheCIsICJlY3giLCAiZWRpIiwgIm1lbW9yeSIsICJjYyIKLSAgICAgICAgICAgICAgICAgICAgKTsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZnMvYWZzL21pc2MuYyBiL2ZzL2Fmcy9taXNjLmMKaW5kZXggZTRmY2U2Ni4uY2RiOTc5MiAxMDA2NDQKLS0tIGEvZnMvYWZzL21pc2MuYworKysgYi9mcy9hZnMvbWlzYy5jCkBAIC0xLDYgKzEsNiBAQAotLyogbWlzYy5jOiBtaXNjZWxsYW5lb3VzIGJpdHMKKy8qIG1pc2NlbGxhbmVvdXMgYml0cwogICoKLSAqIENvcHlyaWdodCAoQykgMjAwMiBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKQEAgLTEyLDE5ICsxMiwyMCBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSAiZXJyb3JzLmgiCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJhZnNfZnMuaCIKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAqIGNvbnZlcnQgYW4gQUZTIGFib3J0IGNvZGUgdG8gYSBMaW51eCBlcnJvciBudW1iZXIKICAqLwotaW50IGFmc19hYm9ydF90b19lcnJvcihpbnQgYWJvcnRjb2RlKQoraW50IGFmc19hYm9ydF90b19lcnJvcih1MzIgYWJvcnRfY29kZSkKIHsKLQlzd2l0Y2ggKGFib3J0Y29kZSkgeworCXN3aXRjaCAoYWJvcnRfY29kZSkgeworCWNhc2UgMTM6CQlyZXR1cm4gLUVBQ0NFUzsKKwljYXNlIDMwOgkJcmV0dXJuIC1FUk9GUzsKIAljYXNlIFZTQUxWQUdFOgkJcmV0dXJuIC1FSU87CiAJY2FzZSBWTk9WTk9ERToJCXJldHVybiAtRU5PRU5UOwotCWNhc2UgVk5PVk9MOgkJcmV0dXJuIC1FTlhJTzsKKwljYXNlIFZOT1ZPTDoJCXJldHVybiAtRU5PTUVESVVNOwogCWNhc2UgVlZPTEVYSVNUUzoJcmV0dXJuIC1FRVhJU1Q7CiAJY2FzZSBWTk9TRVJWSUNFOglyZXR1cm4gLUVJTzsKIAljYXNlIFZPRkZMSU5FOgkJcmV0dXJuIC1FTk9FTlQ7CkBAIC0zMyw3ICszNCwyNCBAQAogCWNhc2UgVk9WRVJRVU9UQToJcmV0dXJuIC1FRFFVT1Q7CiAJY2FzZSBWQlVTWToJCXJldHVybiAtRUJVU1k7CiAJY2FzZSBWTU9WRUQ6CQlyZXR1cm4gLUVOWElPOwotCWRlZmF1bHQ6CQlyZXR1cm4gLUVJTzsKKwljYXNlIDB4MmY2ZGYwYzoJCXJldHVybiAtRUFDQ0VTOworCWNhc2UgMHgyZjZkZjBmOgkJcmV0dXJuIC1FQlVTWTsKKwljYXNlIDB4MmY2ZGYxMDoJCXJldHVybiAtRUVYSVNUOworCWNhc2UgMHgyZjZkZjExOgkJcmV0dXJuIC1FWERFVjsKKwljYXNlIDB4MmY2ZGYxMzoJCXJldHVybiAtRU5PVERJUjsKKwljYXNlIDB4MmY2ZGYxNDoJCXJldHVybiAtRUlTRElSOworCWNhc2UgMHgyZjZkZjE1OgkJcmV0dXJuIC1FSU5WQUw7CisJY2FzZSAweDJmNmRmMWE6CQlyZXR1cm4gLUVGQklHOworCWNhc2UgMHgyZjZkZjFiOgkJcmV0dXJuIC1FTk9TUEM7CisJY2FzZSAweDJmNmRmMWQ6CQlyZXR1cm4gLUVST0ZTOworCWNhc2UgMHgyZjZkZjFlOgkJcmV0dXJuIC1FTUxJTks7CisJY2FzZSAweDJmNmRmMjA6CQlyZXR1cm4gLUVET007CisJY2FzZSAweDJmNmRmMjE6CQlyZXR1cm4gLUVSQU5HRTsKKwljYXNlIDB4MmY2ZGYyMjoJCXJldHVybiAtRURFQURMSzsKKwljYXNlIDB4MmY2ZGYyMzoJCXJldHVybiAtRU5BTUVUT09MT05HOworCWNhc2UgMHgyZjZkZjI0OgkJcmV0dXJuIC1FTk9MQ0s7CisJY2FzZSAweDJmNmRmMjY6CQlyZXR1cm4gLUVOT1RFTVBUWTsKKwljYXNlIDB4MmY2ZGY3ODoJCXJldHVybiAtRURRVU9UOworCWRlZmF1bHQ6CQlyZXR1cm4gLUVSRU1PVEVJTzsKIAl9Ci0KLX0gLyogZW5kIGFmc19hYm9ydF90b19lcnJvcigpICovCit9CmRpZmYgLS1naXQgYS9mcy9hZnMvbW50cHQuYyBiL2ZzL2Fmcy9tbnRwdC5jCmluZGV4IDY4NDk1ZjAuLmI5MDVhZTMgMTAwNjQ0Ci0tLSBhL2ZzL2Fmcy9tbnRwdC5jCisrKyBiL2ZzL2Fmcy9tbnRwdC5jCkBAIC0xLDQgKzEsNCBAQAotLyogbW50cHQuYzogbW91bnRwb2ludCBtYW5hZ2VtZW50CisvKiBtb3VudHBvaW50IG1hbmFnZW1lbnQKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQpAQCAtMTgsMTAgKzE4LDYgQEAKICNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgogI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CiAjaW5jbHVkZSA8bGludXgvbW50X25hbWVzcGFjZS5oPgotI2luY2x1ZGUgInN1cGVyLmgiCi0jaW5jbHVkZSAiY2VsbC5oIgotI2luY2x1ZGUgInZvbHVtZS5oIgotI2luY2x1ZGUgInZub2RlLmgiCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAogCkBAIC0zMCw2ICsyNiw3IEBACiAJCQkJICAgICAgIHN0cnVjdCBuYW1laWRhdGEgKm5kKTsKIHN0YXRpYyBpbnQgYWZzX21udHB0X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOwogc3RhdGljIHZvaWQgKmFmc19tbnRwdF9mb2xsb3dfbGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKTsKK3N0YXRpYyB2b2lkIGFmc19tbnRwdF9leHBpcnlfdGltZWRfb3V0KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CiAKIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWZzX21udHB0X2ZpbGVfb3BlcmF0aW9ucyA9IHsKIAkub3BlbgkJPSBhZnNfbW50cHRfb3BlbiwKQEAgLTQzLDI0ICs0MCwxOSBAQAogfTsKIAogc3RhdGljIExJU1RfSEVBRChhZnNfdmZzbW91bnRzKTsKK3N0YXRpYyBERUNMQVJFX0RFTEFZRURfV09SSyhhZnNfbW50cHRfZXhwaXJ5X3RpbWVyLCBhZnNfbW50cHRfZXhwaXJ5X3RpbWVkX291dCk7CiAKLXN0YXRpYyB2b2lkIGFmc19tbnRwdF9leHBpcnlfdGltZWRfb3V0KHN0cnVjdCBhZnNfdGltZXIgKnRpbWVyKTsKK3Vuc2lnbmVkIGxvbmcgYWZzX21udHB0X2V4cGlyeV90aW1lb3V0ID0gMTAgKiA2MDsKIAotc3RydWN0IGFmc190aW1lcl9vcHMgYWZzX21udHB0X2V4cGlyeV90aW1lcl9vcHMgPSB7Ci0JLnRpbWVkX291dAk9IGFmc19tbnRwdF9leHBpcnlfdGltZWRfb3V0LAotfTsKLQotc3RydWN0IGFmc190aW1lciBhZnNfbW50cHRfZXhwaXJ5X3RpbWVyOwotCi11bnNpZ25lZCBsb25nIGFmc19tbnRwdF9leHBpcnlfdGltZW91dCA9IDIwOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICogY2hlY2sgYSBzeW1ib2xpYyBsaW5rIHRvIHNlZSB3aGV0aGVyIGl0IGFjdHVhbGx5IGVuY29kZXMgYSBtb3VudHBvaW50CiAgKiAtIHNldHMgdGhlIEFGU19WTk9ERV9NT1VOVFBPSU5UIGZsYWcgb24gdGhlIHZub2RlIGFwcHJvcHJpYXRlbHkKICAqLwotaW50IGFmc19tbnRwdF9jaGVja19zeW1saW5rKHN0cnVjdCBhZnNfdm5vZGUgKnZub2RlKQoraW50IGFmc19tbnRwdF9jaGVja19zeW1saW5rKHN0cnVjdCBhZnNfdm5vZGUgKnZub2RlLCBzdHJ1Y3Qga2V5ICprZXkpCiB7CisJc3RydWN0IGZpbGUgZmlsZSA9IHsKKwkJLnByaXZhdGVfZGF0YSA9IGtleSwKKwl9OwogCXN0cnVjdCBwYWdlICpwYWdlOwogCXNpemVfdCBzaXplOwogCWNoYXIgKmJ1ZjsKQEAgLTY5LDcgKzYxLDcgQEAKIAlfZW50ZXIoInsldSwldX0iLCB2bm9kZS0+ZmlkLnZub2RlLCB2bm9kZS0+ZmlkLnVuaXF1ZSk7CiAKIAkvKiByZWFkIHRoZSBjb250ZW50cyBvZiB0aGUgc3ltbGluayBpbnRvIHRoZSBwYWdlY2FjaGUgKi8KLQlwYWdlID0gcmVhZF9tYXBwaW5nX3BhZ2UoQUZTX1ZOT0RFX1RPX0kodm5vZGUpLT5pX21hcHBpbmcsIDAsIE5VTEwpOworCXBhZ2UgPSByZWFkX21hcHBpbmdfcGFnZShBRlNfVk5PREVfVE9fSSh2bm9kZSktPmlfbWFwcGluZywgMCwgJmZpbGUpOwogCWlmIChJU19FUlIocGFnZSkpIHsKIAkJcmV0ID0gUFRSX0VSUihwYWdlKTsKIAkJZ290byBvdXQ7CkBAIC04NSw3ICs3Nyw3IEBACiAKIAkvKiBleGFtaW5lIHRoZSBzeW1saW5rJ3MgY29udGVudHMgKi8KIAlzaXplID0gdm5vZGUtPnN0YXR1cy5zaXplOwotCV9kZWJ1Zygic3ltbGluayB0byAlKi4qcyIsIHNpemUsIChpbnQpIHNpemUsIGJ1Zik7CisJX2RlYnVnKCJzeW1saW5rIHRvICUqLipzIiwgKGludCkgc2l6ZSwgKGludCkgc2l6ZSwgYnVmKTsKIAogCWlmIChzaXplID4gMiAmJgogCSAgICAoYnVmWzBdID09ICclJyB8fCBidWZbMF0gPT0gJyMnKSAmJgpAQCAtOTMsMjIgKzg1LDIwIEBACiAJICAgICkgewogCQlfZGVidWcoInN5bWxpbmsgaXMgYSBtb3VudHBvaW50Iik7CiAJCXNwaW5fbG9jaygmdm5vZGUtPmxvY2spOwotCQl2bm9kZS0+ZmxhZ3MgfD0gQUZTX1ZOT0RFX01PVU5UUE9JTlQ7CisJCXNldF9iaXQoQUZTX1ZOT0RFX01PVU5UUE9JTlQsICZ2bm9kZS0+ZmxhZ3MpOwogCQlzcGluX3VubG9jaygmdm5vZGUtPmxvY2spOwogCX0KIAogCXJldCA9IDA7CiAKLSBvdXRfZnJlZToKK291dF9mcmVlOgogCWt1bm1hcChwYWdlKTsKIAlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7Ci0gb3V0Ogorb3V0OgogCV9sZWF2ZSgiID0gJWQiLCByZXQpOwogCXJldHVybiByZXQ7Cit9CiAKLX0gLyogZW5kIGFmc19tbnRwdF9jaGVja19zeW1saW5rKCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAqIG5vIHZhbGlkIGxvb2t1cCBwcm9jZWR1cmUgb24gdGhpcyBzb3J0IG9mIGRpcgogICovCkBAIC0xMTYsNyArMTA2LDcgQEAKIAkJCQkgICAgICAgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAogCQkJCSAgICAgICBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKIHsKLQlrZW50ZXIoIiVwLCVweyVweyVzfSwlc30iLAorCV9lbnRlcigiJXAsJXB7JXB7JXN9LCVzfSIsCiAJICAgICAgIGRpciwKIAkgICAgICAgZGVudHJ5LAogCSAgICAgICBkZW50cnktPmRfcGFyZW50LApAQCAtMTI1LDE1ICsxMTUsMTQgQEAKIAkgICAgICAgZGVudHJ5LT5kX25hbWUubmFtZSk7CiAKIAlyZXR1cm4gRVJSX1BUUigtRVJFTU9URSk7Ci19IC8qIGVuZCBhZnNfbW50cHRfbG9va3VwKCkgKi8KK30KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAqIG5vIHZhbGlkIG9wZW4gcHJvY2VkdXJlIG9uIHRoaXMgc29ydCBvZiBkaXIKICAqLwogc3RhdGljIGludCBhZnNfbW50cHRfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlrZW50ZXIoIiVwLCVweyVweyVzfSwlc30iLAorCV9lbnRlcigiJXAsJXB7JXB7JXN9LCVzfSIsCiAJICAgICAgIGlub2RlLCBmaWxlLAogCSAgICAgICBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX3BhcmVudCwKIAkgICAgICAgZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9wYXJlbnQgPwpAQCAtMTQyLDkgKzEzMSw4IEBACiAJICAgICAgIGZpbGUtPmZfcGF0aC5kZW50cnktPmRfbmFtZS5uYW1lKTsKIAogCXJldHVybiAtRVJFTU9URTsKLX0gLyogZW5kIGFmc19tbnRwdF9vcGVuKCkgKi8KK30KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAqIGNyZWF0ZSBhIHZmc21vdW50IHRvIGJlIGF1dG9tb3VudGVkCiAgKi8KQEAgLTE1Nyw3ICsxNDUsNyBAQAogCWNoYXIgKmJ1ZiwgKmRldm5hbWUgPSBOVUxMLCAqb3B0aW9ucyA9IE5VTEw7CiAJaW50IHJldDsKIAotCWtlbnRlcigieyVzfSIsIG1udHB0LT5kX25hbWUubmFtZSk7CisJX2VudGVyKCJ7JXN9IiwgbW50cHQtPmRfbmFtZS5uYW1lKTsKIAogCUJVR19PTighbW50cHQtPmRfaW5vZGUpOwogCkBAIC0yMDEsNzkgKzE4OSwxMDggQEAKIAkJc3RyY2F0KG9wdGlvbnMsICIscndwYXRoIik7CiAKIAkvKiB0cnkgYW5kIGRvIHRoZSBtb3VudCAqLwotCWtkZWJ1ZygiLS0tIGF0dGVtcHRpbmcgbW91bnQgJXMgLW8gJXMgLS0tIiwgZGV2bmFtZSwgb3B0aW9ucyk7CisJX2RlYnVnKCItLS0gYXR0ZW1wdGluZyBtb3VudCAlcyAtbyAlcyAtLS0iLCBkZXZuYW1lLCBvcHRpb25zKTsKIAltbnQgPSB2ZnNfa2Vybl9tb3VudCgmYWZzX2ZzX3R5cGUsIDAsIGRldm5hbWUsIG9wdGlvbnMpOwotCWtkZWJ1ZygiLS0tIG1vdW50IHJlc3VsdCAlcCAtLS0iLCBtbnQpOworCV9kZWJ1ZygiLS0tIG1vdW50IHJlc3VsdCAlcCAtLS0iLCBtbnQpOwogCiAJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBkZXZuYW1lKTsKIAlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIG9wdGlvbnMpOwotCWtsZWF2ZSgiID0gJXAiLCBtbnQpOworCV9sZWF2ZSgiID0gJXAiLCBtbnQpOwogCXJldHVybiBtbnQ7CiAKLSBlcnJvcjoKK2Vycm9yOgogCWlmIChwYWdlKQogCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CiAJaWYgKGRldm5hbWUpCiAJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgZGV2bmFtZSk7CiAJaWYgKG9wdGlvbnMpCiAJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgb3B0aW9ucyk7Ci0Ja2xlYXZlKCIgPSAlZCIsIHJldCk7CisJX2xlYXZlKCIgPSAlZCIsIHJldCk7CiAJcmV0dXJuIEVSUl9QVFIocmV0KTsKLX0gLyogZW5kIGFmc19tbnRwdF9kb19hdXRvbW91bnQoKSAqLworfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICogZm9sbG93IGEgbGluayBmcm9tIGEgbW91bnRwb2ludCBkaXJlY3RvcnksIHRodXMgY2F1c2luZyBpdCB0byBiZSBtb3VudGVkCiAgKi8KIHN0YXRpYyB2b2lkICphZnNfbW50cHRfZm9sbG93X2xpbmsoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKIHsKIAlzdHJ1Y3QgdmZzbW91bnQgKm5ld21udDsKLQlzdHJ1Y3QgZGVudHJ5ICpvbGRfZGVudHJ5OwogCWludCBlcnI7CiAKLQlrZW50ZXIoIiVweyVzfSx7JXM6JXB7JXN9fSIsCisJX2VudGVyKCIlcHslc30seyVzOiVweyVzfSx9IiwKIAkgICAgICAgZGVudHJ5LAogCSAgICAgICBkZW50cnktPmRfbmFtZS5uYW1lLAogCSAgICAgICBuZC0+bW50LT5tbnRfZGV2bmFtZSwKIAkgICAgICAgZGVudHJ5LAogCSAgICAgICBuZC0+ZGVudHJ5LT5kX25hbWUubmFtZSk7CiAKLQluZXdtbnQgPSBhZnNfbW50cHRfZG9fYXV0b21vdW50KGRlbnRyeSk7CisJZHB1dChuZC0+ZGVudHJ5KTsKKwluZC0+ZGVudHJ5ID0gZGdldChkZW50cnkpOworCisJbmV3bW50ID0gYWZzX21udHB0X2RvX2F1dG9tb3VudChuZC0+ZGVudHJ5KTsKIAlpZiAoSVNfRVJSKG5ld21udCkpIHsKIAkJcGF0aF9yZWxlYXNlKG5kKTsKIAkJcmV0dXJuICh2b2lkICopbmV3bW50OwogCX0KIAotCW9sZF9kZW50cnkgPSBuZC0+ZGVudHJ5OwotCW5kLT5kZW50cnkgPSBkZW50cnk7Ci0JZXJyID0gZG9fYWRkX21vdW50KG5ld21udCwgbmQsIDAsICZhZnNfdmZzbW91bnRzKTsKLQluZC0+ZGVudHJ5ID0gb2xkX2RlbnRyeTsKLQotCXBhdGhfcmVsZWFzZShuZCk7Ci0KLQlpZiAoIWVycikgewotCQltbnRnZXQobmV3bW50KTsKKwltbnRnZXQobmV3bW50KTsKKwllcnIgPSBkb19hZGRfbW91bnQobmV3bW50LCBuZCwgTU5UX1NIUklOS0FCTEUsICZhZnNfdmZzbW91bnRzKTsKKwlzd2l0Y2ggKGVycikgeworCWNhc2UgMDoKKwkJbW50cHV0KG5kLT5tbnQpOworCQlkcHV0KG5kLT5kZW50cnkpOwogCQluZC0+bW50ID0gbmV3bW50OwotCQlkZ2V0KG5ld21udC0+bW50X3Jvb3QpOwotCQluZC0+ZGVudHJ5ID0gbmV3bW50LT5tbnRfcm9vdDsKKwkJbmQtPmRlbnRyeSA9IGRnZXQobmV3bW50LT5tbnRfcm9vdCk7CisJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmYWZzX21udHB0X2V4cGlyeV90aW1lciwKKwkJCQkgICAgICBhZnNfbW50cHRfZXhwaXJ5X3RpbWVvdXQgKiBIWik7CisJCWJyZWFrOworCWNhc2UgLUVCVVNZOgorCQkvKiBzb21lb25lIGVsc2UgbWFkZSBhIG1vdW50IGhlcmUgd2hpbHN0IHdlIHdlcmUgYnVzeSAqLworCQl3aGlsZSAoZF9tb3VudHBvaW50KG5kLT5kZW50cnkpICYmCisJCSAgICAgICBmb2xsb3dfZG93bigmbmQtPm1udCwgJm5kLT5kZW50cnkpKQorCQkJOworCQllcnIgPSAwOworCWRlZmF1bHQ6CisJCW1udHB1dChuZXdtbnQpOworCQlicmVhazsKIAl9CiAKLQlrbGVhdmUoIiA9ICVkIiwgZXJyKTsKKwlfbGVhdmUoIiA9ICVkIiwgZXJyKTsKIAlyZXR1cm4gRVJSX1BUUihlcnIpOwotfSAvKiBlbmQgYWZzX21udHB0X2ZvbGxvd19saW5rKCkgKi8KK30KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAqIGhhbmRsZSBtb3VudHBvaW50IGV4cGlyeSB0aW1lciBnb2luZyBvZmYKICAqLwotc3RhdGljIHZvaWQgYWZzX21udHB0X2V4cGlyeV90aW1lZF9vdXQoc3RydWN0IGFmc190aW1lciAqdGltZXIpCitzdGF0aWMgdm9pZCBhZnNfbW50cHRfZXhwaXJ5X3RpbWVkX291dChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Ja2VudGVyKCIiKTsKKwlfZW50ZXIoIiIpOwogCi0JbWFya19tb3VudHNfZm9yX2V4cGlyeSgmYWZzX3Zmc21vdW50cyk7CisJaWYgKCFsaXN0X2VtcHR5KCZhZnNfdmZzbW91bnRzKSkgeworCQltYXJrX21vdW50c19mb3JfZXhwaXJ5KCZhZnNfdmZzbW91bnRzKTsKKwkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZhZnNfbW50cHRfZXhwaXJ5X3RpbWVyLAorCQkJCSAgICAgIGFmc19tbnRwdF9leHBpcnlfdGltZW91dCAqIEhaKTsKKwl9CiAKLQlhZnNfa2Fmc3RpbW9kX2FkZF90aW1lcigmYWZzX21udHB0X2V4cGlyeV90aW1lciwKLQkJCQlhZnNfbW50cHRfZXhwaXJ5X3RpbWVvdXQgKiBIWik7CisJX2xlYXZlKCIiKTsKK30KIAotCWtsZWF2ZSgiIik7Ci19IC8qIGVuZCBhZnNfbW50cHRfZXhwaXJ5X3RpbWVkX291dCgpICovCisvKgorICoga2lsbCB0aGUgQUZTIG1vdW50cG9pbnQgdGltZXIgaWYgaXQncyBzdGlsbCBydW5uaW5nCisgKi8KK3ZvaWQgYWZzX21udHB0X2tpbGxfdGltZXIodm9pZCkKK3sKKwlfZW50ZXIoIiIpOworCisJQVNTRVJUKGxpc3RfZW1wdHkoJmFmc192ZnNtb3VudHMpKTsKKwljYW5jZWxfZGVsYXllZF93b3JrKCZhZnNfbW50cHRfZXhwaXJ5X3RpbWVyKTsKKwlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworfQorCisvKgorICogYmVnaW4gdW5tb3VudCBieSBhdHRlbXB0aW5nIHRvIHJlbW92ZSBhbGwgYXV0b21vdW50ZWQgbW91bnRwb2ludHMgd2UgYWRkZWQKKyAqLwordm9pZCBhZnNfdW1vdW50X2JlZ2luKHN0cnVjdCB2ZnNtb3VudCAqdmZzbW50LCBpbnQgZmxhZ3MpCit7CisJc2hyaW5rX3N1Ym1vdW50cyh2ZnNtbnQsICZhZnNfdmZzbW91bnRzKTsKK30KZGlmZiAtLWdpdCBhL2ZzL2Fmcy9tb3VudC5oIGIvZnMvYWZzL21vdW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkMmY0NmUuLjAwMDAwMDAKLS0tIGEvZnMvYWZzL21vdW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKiBtb3VudC5oOiBtb3VudCBwYXJhbWV0ZXJzCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi0KLSNpZm5kZWYgX0xJTlVYX0FGU19NT1VOVF9ICi0jZGVmaW5lIF9MSU5VWF9BRlNfTU9VTlRfSAotCi1zdHJ1Y3QgYWZzX21vdW50ZGF0YSB7Ci0JY29uc3QgY2hhcgkJKnZvbHVtZTsJLyogbmFtZSBvZiB2b2x1bWUgKi8KLQljb25zdCBjaGFyCQkqY2VsbDsJCS8qIG5hbWUgb2YgY2VsbCBjb250YWluaW5nIHZvbHVtZSAqLwotCWNvbnN0IGNoYXIJCSpjYWNoZTsJCS8qIG5hbWUgb2YgY2FjaGUgYmxvY2sgZGV2aWNlICovCi0Jc2l6ZV90CQkJbnNlcnZlcnM7CS8qIG51bWJlciBvZiBzZXJ2ZXIgYWRkcmVzc2VzIGxpc3RlZCAqLwotCXVpbnQzMl90CQlzZXJ2ZXJzWzEwXTsJLyogSVAgYWRkcmVzc2VzIG9mIHNlcnZlcnMgaW4gdGhpcyBjZWxsICovCi19OwotCi0jZW5kaWYgLyogX0xJTlVYX0FGU19NT1VOVF9IICovCmRpZmYgLS1naXQgYS9mcy9hZnMvcHJvYy5jIGIvZnMvYWZzL3Byb2MuYwppbmRleCBhZTZiODViLi5kNTYwMWY2IDEwMDY0NAotLS0gYS9mcy9hZnMvcHJvYy5jCisrKyBiL2ZzL2Fmcy9wcm9jLmMKQEAgLTEsNCArMSw0IEBACi0vKiBwcm9jLmM6IC9wcm9jIGludGVyZmFjZSBmb3IgQUZTCisvKiAvcHJvYyBpbnRlcmZhY2UgZm9yIEFGUwogICoKICAqIENvcHlyaWdodCAoQykgMjAwMiBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCkBAIC0xMyw4ICsxMyw2IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+Ci0jaW5jbHVkZSAiY2VsbC5oIgotI2luY2x1ZGUgInZvbHVtZS5oIgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIApAQCAtMTMwLDcgKzEyOCw2IEBACiAJLnJlbGVhc2UJPSBhZnNfcHJvY19jZWxsX3NlcnZlcnNfcmVsZWFzZSwKIH07CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCiAgKiBpbml0aWFsaXNlIHRoZSAvcHJvYy9mcy9hZnMvIGRpcmVjdG9yeQogICovCkBAIC0xNDIsNDcgKzEzOSw0MyBAQAogCiAJcHJvY19hZnMgPSBwcm9jX21rZGlyKCJmcy9hZnMiLCBOVUxMKTsKIAlpZiAoIXByb2NfYWZzKQotCQlnb3RvIGVycm9yOworCQlnb3RvIGVycm9yX2RpcjsKIAlwcm9jX2Fmcy0+b3duZXIgPSBUSElTX01PRFVMRTsKIAogCXAgPSBjcmVhdGVfcHJvY19lbnRyeSgiY2VsbHMiLCAwLCBwcm9jX2Fmcyk7CiAJaWYgKCFwKQotCQlnb3RvIGVycm9yX3Byb2M7CisJCWdvdG8gZXJyb3JfY2VsbHM7CiAJcC0+cHJvY19mb3BzID0gJmFmc19wcm9jX2NlbGxzX2ZvcHM7CiAJcC0+b3duZXIgPSBUSElTX01PRFVMRTsKIAogCXAgPSBjcmVhdGVfcHJvY19lbnRyeSgicm9vdGNlbGwiLCAwLCBwcm9jX2Fmcyk7CiAJaWYgKCFwKQotCQlnb3RvIGVycm9yX2NlbGxzOworCQlnb3RvIGVycm9yX3Jvb3RjZWxsOwogCXAtPnByb2NfZm9wcyA9ICZhZnNfcHJvY19yb290Y2VsbF9mb3BzOwogCXAtPm93bmVyID0gVEhJU19NT0RVTEU7CiAKIAlfbGVhdmUoIiA9IDAiKTsKIAlyZXR1cm4gMDsKIAotIGVycm9yX2NlbGxzOgorZXJyb3Jfcm9vdGNlbGw6CiAgCXJlbW92ZV9wcm9jX2VudHJ5KCJjZWxscyIsIHByb2NfYWZzKTsKLSBlcnJvcl9wcm9jOgorZXJyb3JfY2VsbHM6CiAJcmVtb3ZlX3Byb2NfZW50cnkoImZzL2FmcyIsIE5VTEwpOwotIGVycm9yOgorZXJyb3JfZGlyOgogCV9sZWF2ZSgiID0gLUVOT01FTSIpOwogCXJldHVybiAtRU5PTUVNOworfQogCi19IC8qIGVuZCBhZnNfcHJvY19pbml0KCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAqIGNsZWFuIHVwIHRoZSAvcHJvYy9mcy9hZnMvIGRpcmVjdG9yeQogICovCiB2b2lkIGFmc19wcm9jX2NsZWFudXAodm9pZCkKIHsKKwlyZW1vdmVfcHJvY19lbnRyeSgicm9vdGNlbGwiLCBwcm9jX2Fmcyk7CiAJcmVtb3ZlX3Byb2NfZW50cnkoImNlbGxzIiwgcHJvY19hZnMpOwotCiAJcmVtb3ZlX3Byb2NfZW50cnkoImZzL2FmcyIsIE5VTEwpOworfQogCi19IC8qIGVuZCBhZnNfcHJvY19jbGVhbnVwKCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAqIG9wZW4gIi9wcm9jL2ZzL2Fmcy9jZWxscyIgd2hpY2ggcHJvdmlkZXMgYSBzdW1tYXJ5IG9mIGV4dGFudCBjZWxscwogICovCkBAIC0xOTksOSArMTkyLDggQEAKIAltLT5wcml2YXRlID0gUERFKGlub2RlKS0+ZGF0YTsKIAogCXJldHVybiAwOwotfSAvKiBlbmQgYWZzX3Byb2NfY2VsbHNfb3BlbigpICovCit9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCiAgKiBzZXQgdXAgdGhlIGl0ZXJhdG9yIHRvIHN0YXJ0IHJlYWRpbmcgZnJvbSB0aGUgY2VsbHMgbGlzdCBhbmQgcmV0dXJuIHRoZQogICogZmlyc3QgaXRlbQpAQCAtMjI1LDkgKzIxNyw4IEBACiAJCQlicmVhazsKIAogCXJldHVybiBfcCAhPSAmYWZzX3Byb2NfY2VsbHMgPyBfcCA6IE5VTEw7Ci19IC8qIGVuZCBhZnNfcHJvY19jZWxsc19zdGFydCgpICovCit9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCiAgKiBtb3ZlIHRvIG5leHQgY2VsbCBpbiBjZWxscyBsaXN0CiAgKi8KQEAgLTI0MSwxOSArMjMyLDE2IEBACiAJX3AgPSB2ID09ICh2b2lkICopIDEgPyBhZnNfcHJvY19jZWxscy5uZXh0IDogX3AtPm5leHQ7CiAKIAlyZXR1cm4gX3AgIT0gJmFmc19wcm9jX2NlbGxzID8gX3AgOiBOVUxMOwotfSAvKiBlbmQgYWZzX3Byb2NfY2VsbHNfbmV4dCgpICovCit9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCiAgKiBjbGVhbiB1cCBhZnRlciByZWFkaW5nIGZyb20gdGhlIGNlbGxzIGxpc3QKICAqLwogc3RhdGljIHZvaWQgYWZzX3Byb2NfY2VsbHNfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnAsIHZvaWQgKnYpCiB7CiAJdXBfcmVhZCgmYWZzX3Byb2NfY2VsbHNfc2VtKTsKK30KIAotfSAvKiBlbmQgYWZzX3Byb2NfY2VsbHNfc3RvcCgpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCiAgKiBkaXNwbGF5IGEgaGVhZGVyIGxpbmUgZm9sbG93ZWQgYnkgYSBsb2FkIG9mIGNlbGwgbGluZXMKICAqLwpAQCAtMjYxLDE5ICsyNDksMTggQEAKIHsKIAlzdHJ1Y3QgYWZzX2NlbGwgKmNlbGwgPSBsaXN0X2VudHJ5KHYsIHN0cnVjdCBhZnNfY2VsbCwgcHJvY19saW5rKTsKIAotCS8qIGRpc3BsYXkgaGVhZGVyIG9uIGxpbmUgMSAqLwogCWlmICh2ID09ICh2b2lkICopIDEpIHsKKwkJLyogZGlzcGxheSBoZWFkZXIgb24gbGluZSAxICovCiAJCXNlcV9wdXRzKG0sICJVU0UgTkFNRVxuIik7CiAJCXJldHVybiAwOwogCX0KIAogCS8qIGRpc3BsYXkgb25lIGNlbGwgcGVyIGxpbmUgb24gc3Vic2VxdWVudCBsaW5lcyAqLwotCXNlcV9wcmludGYobSwgIiUzZCAlc1xuIiwgYXRvbWljX3JlYWQoJmNlbGwtPnVzYWdlKSwgY2VsbC0+bmFtZSk7Ci0KKwlzZXFfcHJpbnRmKG0sICIlM2QgJXNcbiIsCisJCSAgIGF0b21pY19yZWFkKCZjZWxsLT51c2FnZSksIGNlbGwtPm5hbWUpOwogCXJldHVybiAwOwotfSAvKiBlbmQgYWZzX3Byb2NfY2VsbHNfc2hvdygpICovCit9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCiAgKiBoYW5kbGUgd3JpdGVzIHRvIC9wcm9jL2ZzL2Fmcy9jZWxscwogICogLSB0byBhZGQgY2VsbHM6IGVjaG8gImFkZCA8Y2VsbG5hbWU+IDxJUD5bOjxJUD5dWzo8SVA+XSIKQEAgLTMyNiwzMCArMzEzLDMyIEBACiAKIAlpZiAoc3RyY21wKGtidWYsICJhZGQiKSA9PSAwKSB7CiAJCXN0cnVjdCBhZnNfY2VsbCAqY2VsbDsKLQkJcmV0ID0gYWZzX2NlbGxfY3JlYXRlKG5hbWUsIGFyZ3MsICZjZWxsKTsKLQkJaWYgKHJldCA8IDApCi0JCQlnb3RvIGRvbmU7CiAKKwkJY2VsbCA9IGFmc19jZWxsX2NyZWF0ZShuYW1lLCBhcmdzKTsKKwkJaWYgKElTX0VSUihjZWxsKSkgeworCQkJcmV0ID0gUFRSX0VSUihjZWxsKTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCisJCWFmc19wdXRfY2VsbChjZWxsKTsKIAkJcHJpbnRrKCJrQUZTOiBBZGRlZCBuZXcgY2VsbCAnJXMnXG4iLCBuYW1lKTsKLQl9Ci0JZWxzZSB7CisJfSBlbHNlIHsKIAkJZ290byBpbnZhbDsKIAl9CiAKIAlyZXQgPSBzaXplOwogCi0gZG9uZToKK2RvbmU6CiAJa2ZyZWUoa2J1Zik7CiAJX2xlYXZlKCIgPSAlZCIsIHJldCk7CiAJcmV0dXJuIHJldDsKIAotIGludmFsOgoraW52YWw6CiAJcmV0ID0gLUVJTlZBTDsKIAlwcmludGsoImtBRlM6IEludmFsaWQgQ29tbWFuZCBvbiAvcHJvYy9mcy9hZnMvY2VsbHMgZmlsZVxuIik7CiAJZ290byBkb25lOwotfSAvKiBlbmQgYWZzX3Byb2NfY2VsbHNfd3JpdGUoKSAqLworfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICogU3R1YnMgZm9yIC9wcm9jL2ZzL2Fmcy9yb290Y2VsbAogICovCkBAIC0zNjksNyArMzU4LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAqIGhhbmRsZSB3cml0ZXMgdG8gL3Byb2MvZnMvYWZzL3Jvb3RjZWxsCiAgKiAtIHRvIGluaXRpYWxpemUgcm9vdGNlbGw6IGVjaG8gImNlbGwubmFtZToxOTIuMTY4LjIzMS4xNCIKQEAgLTQwNywxNCArMzk1LDEzIEBACiAJaWYgKHJldCA+PSAwKQogCQlyZXQgPSBzaXplOwkvKiBjb25zdW1lIGV2ZXJ5dGhpbmcsIGFsd2F5cyAqLwogCi0gaW5mYXVsdDoKK2luZmF1bHQ6CiAJa2ZyZWUoa2J1Zik7Ci0gbm9tZW06Citub21lbToKIAlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKIAlyZXR1cm4gcmV0OwotfSAvKiBlbmQgYWZzX3Byb2Nfcm9vdGNlbGxfd3JpdGUoKSAqLworfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICogaW5pdGlhbGlzZSAvcHJvYy9mcy9hZnMvPGNlbGw+LwogICovCkBAIC00MjYsMjUgKzQxMywyNSBAQAogCiAJY2VsbC0+cHJvY19kaXIgPSBwcm9jX21rZGlyKGNlbGwtPm5hbWUsIHByb2NfYWZzKTsKIAlpZiAoIWNlbGwtPnByb2NfZGlyKQotCQlyZXR1cm4gLUVOT01FTTsKKwkJZ290byBlcnJvcl9kaXI7CiAKIAlwID0gY3JlYXRlX3Byb2NfZW50cnkoInNlcnZlcnMiLCAwLCBjZWxsLT5wcm9jX2Rpcik7CiAJaWYgKCFwKQotCQlnb3RvIGVycm9yX3Byb2M7CisJCWdvdG8gZXJyb3Jfc2VydmVyczsKIAlwLT5wcm9jX2ZvcHMgPSAmYWZzX3Byb2NfY2VsbF9zZXJ2ZXJzX2ZvcHM7CiAJcC0+b3duZXIgPSBUSElTX01PRFVMRTsKIAlwLT5kYXRhID0gY2VsbDsKIAogCXAgPSBjcmVhdGVfcHJvY19lbnRyeSgidmxzZXJ2ZXJzIiwgMCwgY2VsbC0+cHJvY19kaXIpOwogCWlmICghcCkKLQkJZ290byBlcnJvcl9zZXJ2ZXJzOworCQlnb3RvIGVycm9yX3Zsc2VydmVyczsKIAlwLT5wcm9jX2ZvcHMgPSAmYWZzX3Byb2NfY2VsbF92bHNlcnZlcnNfZm9wczsKIAlwLT5vd25lciA9IFRISVNfTU9EVUxFOwogCXAtPmRhdGEgPSBjZWxsOwogCiAJcCA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJ2b2x1bWVzIiwgMCwgY2VsbC0+cHJvY19kaXIpOwogCWlmICghcCkKLQkJZ290byBlcnJvcl92bHNlcnZlcnM7CisJCWdvdG8gZXJyb3Jfdm9sdW1lczsKIAlwLT5wcm9jX2ZvcHMgPSAmYWZzX3Byb2NfY2VsbF92b2x1bWVzX2ZvcHM7CiAJcC0+b3duZXIgPSBUSElTX01PRFVMRTsKIAlwLT5kYXRhID0gY2VsbDsKQEAgLTQ1MiwxNyArNDM5LDE3IEBACiAJX2xlYXZlKCIgPSAwIik7CiAJcmV0dXJuIDA7CiAKLSBlcnJvcl92bHNlcnZlcnM6CitlcnJvcl92b2x1bWVzOgogCXJlbW92ZV9wcm9jX2VudHJ5KCJ2bHNlcnZlcnMiLCBjZWxsLT5wcm9jX2Rpcik7Ci0gZXJyb3Jfc2VydmVyczoKK2Vycm9yX3Zsc2VydmVyczoKIAlyZW1vdmVfcHJvY19lbnRyeSgic2VydmVycyIsIGNlbGwtPnByb2NfZGlyKTsKLSBlcnJvcl9wcm9jOgorZXJyb3Jfc2VydmVyczoKIAlyZW1vdmVfcHJvY19lbnRyeShjZWxsLT5uYW1lLCBwcm9jX2Fmcyk7CitlcnJvcl9kaXI6CiAJX2xlYXZlKCIgPSAtRU5PTUVNIik7CiAJcmV0dXJuIC1FTk9NRU07Ci19IC8qIGVuZCBhZnNfcHJvY19jZWxsX3NldHVwKCkgKi8KK30KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAqIHJlbW92ZSAvcHJvYy9mcy9hZnMvPGNlbGw+LwogICovCkBAIC00NzYsOSArNDYzLDggQEAKIAlyZW1vdmVfcHJvY19lbnRyeShjZWxsLT5uYW1lLCBwcm9jX2Fmcyk7CiAKIAlfbGVhdmUoIiIpOwotfSAvKiBlbmQgYWZzX3Byb2NfY2VsbF9yZW1vdmUoKSAqLworfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICogb3BlbiAiL3Byb2MvZnMvYWZzLzxjZWxsPi92b2x1bWVzIiB3aGljaCBwcm92aWRlcyBhIHN1bW1hcnkgb2YgZXh0YW50IGNlbGxzCiAgKi8KQEAgLTQ4OCw3ICs0NzQsNyBAQAogCXN0cnVjdCBzZXFfZmlsZSAqbTsKIAlpbnQgcmV0OwogCi0JY2VsbCA9IGFmc19nZXRfY2VsbF9tYXliZSgoc3RydWN0IGFmc19jZWxsICoqKSAmUERFKGlub2RlKS0+ZGF0YSk7CisJY2VsbCA9IFBERShpbm9kZSktPmRhdGE7CiAJaWYgKCFjZWxsKQogCQlyZXR1cm4gLUVOT0VOVDsKIApAQCAtNTAwLDI1ICs0ODYsMTYgQEAKIAltLT5wcml2YXRlID0gY2VsbDsKIAogCXJldHVybiAwOwotfSAvKiBlbmQgYWZzX3Byb2NfY2VsbF92b2x1bWVzX29wZW4oKSAqLworfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICogY2xvc2UgdGhlIGZpbGUgYW5kIHJlbGVhc2UgdGhlIHJlZiB0byB0aGUgY2VsbAogICovCiBzdGF0aWMgaW50IGFmc19wcm9jX2NlbGxfdm9sdW1lc19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewotCXN0cnVjdCBhZnNfY2VsbCAqY2VsbCA9IFBERShpbm9kZSktPmRhdGE7Ci0JaW50IHJldDsKKwlyZXR1cm4gc2VxX3JlbGVhc2UoaW5vZGUsIGZpbGUpOworfQogCi0JcmV0ID0gc2VxX3JlbGVhc2UoaW5vZGUsZmlsZSk7Ci0KLQlhZnNfcHV0X2NlbGwoY2VsbCk7Ci0KLQlyZXR1cm4gcmV0OwotfSAvKiBlbmQgYWZzX3Byb2NfY2VsbF92b2x1bWVzX3JlbGVhc2UoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICogc2V0IHVwIHRoZSBpdGVyYXRvciB0byBzdGFydCByZWFkaW5nIGZyb20gdGhlIGNlbGxzIGxpc3QgYW5kIHJldHVybiB0aGUKICAqIGZpcnN0IGl0ZW0KQEAgLTU0NSw5ICs1MjIsOCBAQAogCQkJYnJlYWs7CiAKIAlyZXR1cm4gX3AgIT0gJmNlbGwtPnZsX2xpc3QgPyBfcCA6IE5VTEw7Ci19IC8qIGVuZCBhZnNfcHJvY19jZWxsX3ZvbHVtZXNfc3RhcnQoKSAqLworfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICogbW92ZSB0byBuZXh0IGNlbGwgaW4gY2VsbHMgbGlzdAogICovCkBAIC01NjIsMTIgKzUzOCwxMSBAQAogCSgqX3BvcykrKzsKIAogCV9wID0gdjsKLQlfcCA9IHYgPT0gKHZvaWQgKikgMSA/IGNlbGwtPnZsX2xpc3QubmV4dCA6IF9wLT5uZXh0OworCV9wID0gKHYgPT0gKHZvaWQgKikgMSkgPyBjZWxsLT52bF9saXN0Lm5leHQgOiBfcC0+bmV4dDsKIAotCXJldHVybiBfcCAhPSAmY2VsbC0+dmxfbGlzdCA/IF9wIDogTlVMTDsKLX0gLyogZW5kIGFmc19wcm9jX2NlbGxfdm9sdW1lc19uZXh0KCkgKi8KKwlyZXR1cm4gKF9wICE9ICZjZWxsLT52bF9saXN0KSA/IF9wIDogTlVMTDsKK30KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAqIGNsZWFuIHVwIGFmdGVyIHJlYWRpbmcgZnJvbSB0aGUgY2VsbHMgbGlzdAogICovCkBAIC01NzYsMTAgKzU1MSwxOCBAQAogCXN0cnVjdCBhZnNfY2VsbCAqY2VsbCA9IHAtPnByaXZhdGU7CiAKIAl1cF9yZWFkKCZjZWxsLT52bF9zZW0pOworfQogCi19IC8qIGVuZCBhZnNfcHJvY19jZWxsX3ZvbHVtZXNfc3RvcCgpICovCitjb25zdCBjaGFyIGFmc192bG9jYXRpb25fc3RhdGVzW11bNF0gPSB7CisJW0FGU19WTF9ORVddCQkJPSAiTmV3IiwKKwlbQUZTX1ZMX0NSRUFUSU5HXQkJPSAiQ3J0IiwKKwlbQUZTX1ZMX1ZBTElEXQkJCT0gIlZhbCIsCisJW0FGU19WTF9OT19WT0xVTUVdCQk9ICJOb1YiLAorCVtBRlNfVkxfVVBEQVRJTkddCQk9ICJVcGQiLAorCVtBRlNfVkxfVk9MVU1FX0RFTEVURURdCQk9ICJEZWwiLAorCVtBRlNfVkxfVU5DRVJUQUlOXQkJPSAiVW5jIiwKK307CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCiAgKiBkaXNwbGF5IGEgaGVhZGVyIGxpbmUgZm9sbG93ZWQgYnkgYSBsb2FkIG9mIHZvbHVtZSBsaW5lcwogICovCkBAIC01OTAsMjMgKzU3MywyMiBAQAogCiAJLyogZGlzcGxheSBoZWFkZXIgb24gbGluZSAxICovCiAJaWYgKHYgPT0gKHZvaWQgKikgMSkgewotCQlzZXFfcHV0cyhtLCAiVVNFIFZMSURbMF0gIFZMSURbMV0gIFZMSURbMl0gIE5BTUVcbiIpOworCQlzZXFfcHV0cyhtLCAiVVNFIFNUVCBWTElEWzBdICBWTElEWzFdICBWTElEWzJdICBOQU1FXG4iKTsKIAkJcmV0dXJuIDA7CiAJfQogCiAJLyogZGlzcGxheSBvbmUgY2VsbCBwZXIgbGluZSBvbiBzdWJzZXF1ZW50IGxpbmVzICovCi0Jc2VxX3ByaW50ZihtLCAiJTNkICUwOHggJTA4eCAlMDh4ICVzXG4iLAorCXNlcV9wcmludGYobSwgIiUzZCAlcyAlMDh4ICUwOHggJTA4eCAlc1xuIiwKIAkJICAgYXRvbWljX3JlYWQoJnZsb2NhdGlvbi0+dXNhZ2UpLAorCQkgICBhZnNfdmxvY2F0aW9uX3N0YXRlc1t2bG9jYXRpb24tPnN0YXRlXSwKIAkJICAgdmxvY2F0aW9uLT52bGRiLnZpZFswXSwKIAkJICAgdmxvY2F0aW9uLT52bGRiLnZpZFsxXSwKIAkJICAgdmxvY2F0aW9uLT52bGRiLnZpZFsyXSwKLQkJICAgdmxvY2F0aW9uLT52bGRiLm5hbWUKLQkJICAgKTsKKwkJICAgdmxvY2F0aW9uLT52bGRiLm5hbWUpOwogCiAJcmV0dXJuIDA7Ci19IC8qIGVuZCBhZnNfcHJvY19jZWxsX3ZvbHVtZXNfc2hvdygpICovCit9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCiAgKiBvcGVuICIvcHJvYy9mcy9hZnMvPGNlbGw+L3Zsc2VydmVycyIgd2hpY2ggcHJvdmlkZXMgYSBsaXN0IG9mIHZvbHVtZQogICogbG9jYXRpb24gc2VydmVyCkBAIC02MTcsMTEgKzU5OSwxMSBAQAogCXN0cnVjdCBzZXFfZmlsZSAqbTsKIAlpbnQgcmV0OwogCi0JY2VsbCA9IGFmc19nZXRfY2VsbF9tYXliZSgoc3RydWN0IGFmc19jZWxsKiopJlBERShpbm9kZSktPmRhdGEpOworCWNlbGwgPSBQREUoaW5vZGUpLT5kYXRhOwogCWlmICghY2VsbCkKIAkJcmV0dXJuIC1FTk9FTlQ7CiAKLQlyZXQgPSBzZXFfb3BlbihmaWxlLCZhZnNfcHJvY19jZWxsX3Zsc2VydmVyc19vcHMpOworCXJldCA9IHNlcV9vcGVuKGZpbGUsICZhZnNfcHJvY19jZWxsX3Zsc2VydmVyc19vcHMpOwogCWlmIChyZXQ8MCkKIAkJcmV0dXJuIHJldDsKIApAQCAtNjI5LDI2ICs2MTEsMTcgQEAKIAltLT5wcml2YXRlID0gY2VsbDsKIAogCXJldHVybiAwOwotfSAvKiBlbmQgYWZzX3Byb2NfY2VsbF92bHNlcnZlcnNfb3BlbigpICovCit9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCiAgKiBjbG9zZSB0aGUgZmlsZSBhbmQgcmVsZWFzZSB0aGUgcmVmIHRvIHRoZSBjZWxsCiAgKi8KIHN0YXRpYyBpbnQgYWZzX3Byb2NfY2VsbF92bHNlcnZlcnNfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJCQkgICBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlzdHJ1Y3QgYWZzX2NlbGwgKmNlbGwgPSBQREUoaW5vZGUpLT5kYXRhOwotCWludCByZXQ7CisJcmV0dXJuIHNlcV9yZWxlYXNlKGlub2RlLCBmaWxlKTsKK30KIAotCXJldCA9IHNlcV9yZWxlYXNlKGlub2RlLGZpbGUpOwotCi0JYWZzX3B1dF9jZWxsKGNlbGwpOwotCi0JcmV0dXJuIHJldDsKLX0gLyogZW5kIGFmc19wcm9jX2NlbGxfdmxzZXJ2ZXJzX3JlbGVhc2UoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICogc2V0IHVwIHRoZSBpdGVyYXRvciB0byBzdGFydCByZWFkaW5nIGZyb20gdGhlIGNlbGxzIGxpc3QgYW5kIHJldHVybiB0aGUKICAqIGZpcnN0IGl0ZW0KQEAgLTY3Miw5ICs2NDUsOCBAQAogCQlyZXR1cm4gTlVMTDsKIAogCXJldHVybiAmY2VsbC0+dmxfYWRkcnNbcG9zXTsKLX0gLyogZW5kIGFmc19wcm9jX2NlbGxfdmxzZXJ2ZXJzX3N0YXJ0KCkgKi8KK30KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAqIG1vdmUgdG8gbmV4dCBjZWxsIGluIGNlbGxzIGxpc3QKICAqLwpAQCAtNjkyLDkgKzY2NCw4IEBACiAJCXJldHVybiBOVUxMOwogCiAJcmV0dXJuICZjZWxsLT52bF9hZGRyc1twb3NdOwotfSAvKiBlbmQgYWZzX3Byb2NfY2VsbF92bHNlcnZlcnNfbmV4dCgpICovCit9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCiAgKiBjbGVhbiB1cCBhZnRlciByZWFkaW5nIGZyb20gdGhlIGNlbGxzIGxpc3QKICAqLwpAQCAtNzAzLDEwICs2NzQsOCBAQAogCXN0cnVjdCBhZnNfY2VsbCAqY2VsbCA9IHAtPnByaXZhdGU7CiAKIAl1cF9yZWFkKCZjZWxsLT52bF9zZW0pOworfQogCi19IC8qIGVuZCBhZnNfcHJvY19jZWxsX3Zsc2VydmVyc19zdG9wKCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAqIGRpc3BsYXkgYSBoZWFkZXIgbGluZSBmb2xsb3dlZCBieSBhIGxvYWQgb2Ygdm9sdW1lIGxpbmVzCiAgKi8KQEAgLTcyMiwxMSArNjkxLDkgQEAKIAogCS8qIGRpc3BsYXkgb25lIGNlbGwgcGVyIGxpbmUgb24gc3Vic2VxdWVudCBsaW5lcyAqLwogCXNlcV9wcmludGYobSwgIiV1LiV1LiV1LiV1XG4iLCBOSVBRVUFEKGFkZHItPnNfYWRkcikpOwotCiAJcmV0dXJuIDA7Ci19IC8qIGVuZCBhZnNfcHJvY19jZWxsX3Zsc2VydmVyc19zaG93KCkgKi8KK30KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAqIG9wZW4gIi9wcm9jL2ZzL2Fmcy88Y2VsbD4vc2VydmVycyIgd2hpY2ggcHJvdmlkZXMgYSBzdW1tYXJ5IG9mIGFjdGl2ZQogICogc2VydmVycwpAQCAtNzM3LDcgKzcwNCw3IEBACiAJc3RydWN0IHNlcV9maWxlICptOwogCWludCByZXQ7CiAKLQljZWxsID0gYWZzX2dldF9jZWxsX21heWJlKChzdHJ1Y3QgYWZzX2NlbGwgKiopICZQREUoaW5vZGUpLT5kYXRhKTsKKwljZWxsID0gUERFKGlub2RlKS0+ZGF0YTsKIAlpZiAoIWNlbGwpCiAJCXJldHVybiAtRU5PRU5UOwogCkBAIC03NDcsMzQgKzcxNCwyNCBAQAogCiAJbSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAltLT5wcml2YXRlID0gY2VsbDsKLQogCXJldHVybiAwOwotfSAvKiBlbmQgYWZzX3Byb2NfY2VsbF9zZXJ2ZXJzX29wZW4oKSAqLworfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICogY2xvc2UgdGhlIGZpbGUgYW5kIHJlbGVhc2UgdGhlIHJlZiB0byB0aGUgY2VsbAogICovCiBzdGF0aWMgaW50IGFmc19wcm9jX2NlbGxfc2VydmVyc19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkJCSBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlzdHJ1Y3QgYWZzX2NlbGwgKmNlbGwgPSBQREUoaW5vZGUpLT5kYXRhOwotCWludCByZXQ7CisJcmV0dXJuIHNlcV9yZWxlYXNlKGlub2RlLCBmaWxlKTsKK30KIAotCXJldCA9IHNlcV9yZWxlYXNlKGlub2RlLCBmaWxlKTsKLQotCWFmc19wdXRfY2VsbChjZWxsKTsKLQotCXJldHVybiByZXQ7Ci19IC8qIGVuZCBhZnNfcHJvY19jZWxsX3NlcnZlcnNfcmVsZWFzZSgpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCiAgKiBzZXQgdXAgdGhlIGl0ZXJhdG9yIHRvIHN0YXJ0IHJlYWRpbmcgZnJvbSB0aGUgY2VsbHMgbGlzdCBhbmQgcmV0dXJuIHRoZQogICogZmlyc3QgaXRlbQogICovCiBzdGF0aWMgdm9pZCAqYWZzX3Byb2NfY2VsbF9zZXJ2ZXJzX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqbSwgbG9mZl90ICpfcG9zKQotCV9fYWNxdWlyZXMobS0+cHJpdmF0ZS0+c3ZfbG9jaykKKwlfX2FjcXVpcmVzKG0tPnByaXZhdGUtPnNlcnZlcnNfbG9jaykKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpfcDsKIAlzdHJ1Y3QgYWZzX2NlbGwgKmNlbGwgPSBtLT5wcml2YXRlOwpAQCAtNzgzLDcgKzc0MCw3IEBACiAJX2VudGVyKCJjZWxsPSVwIHBvcz0lTGQiLCBjZWxsLCAqX3Bvcyk7CiAKIAkvKiBsb2NrIHRoZSBsaXN0IGFnYWluc3QgbW9kaWZpY2F0aW9uICovCi0JcmVhZF9sb2NrKCZjZWxsLT5zdl9sb2NrKTsKKwlyZWFkX2xvY2soJmNlbGwtPnNlcnZlcnNfbG9jayk7CiAKIAkvKiBhbGxvdyBmb3IgdGhlIGhlYWRlciBsaW5lICovCiAJaWYgKCFwb3MpCkBAIC03OTEsMTQgKzc0OCwxMyBAQAogCXBvcy0tOwogCiAJLyogZmluZCB0aGUgbid0aCBlbGVtZW50IGluIHRoZSBsaXN0ICovCi0JbGlzdF9mb3JfZWFjaChfcCwgJmNlbGwtPnN2X2xpc3QpCisJbGlzdF9mb3JfZWFjaChfcCwgJmNlbGwtPnNlcnZlcnMpCiAJCWlmICghcG9zLS0pCiAJCQlicmVhazsKIAotCXJldHVybiBfcCAhPSAmY2VsbC0+c3ZfbGlzdCA/IF9wIDogTlVMTDsKLX0gLyogZW5kIGFmc19wcm9jX2NlbGxfc2VydmVyc19zdGFydCgpICovCisJcmV0dXJuIF9wICE9ICZjZWxsLT5zZXJ2ZXJzID8gX3AgOiBOVUxMOworfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICogbW92ZSB0byBuZXh0IGNlbGwgaW4gY2VsbHMgbGlzdAogICovCkBAIC04MTMsMjUgKzc2OSwyMiBAQAogCSgqX3BvcykrKzsKIAogCV9wID0gdjsKLQlfcCA9IHYgPT0gKHZvaWQgKikgMSA/IGNlbGwtPnN2X2xpc3QubmV4dCA6IF9wLT5uZXh0OworCV9wID0gdiA9PSAodm9pZCAqKSAxID8gY2VsbC0+c2VydmVycy5uZXh0IDogX3AtPm5leHQ7CiAKLQlyZXR1cm4gX3AgIT0gJmNlbGwtPnN2X2xpc3QgPyBfcCA6IE5VTEw7Ci19IC8qIGVuZCBhZnNfcHJvY19jZWxsX3NlcnZlcnNfbmV4dCgpICovCisJcmV0dXJuIF9wICE9ICZjZWxsLT5zZXJ2ZXJzID8gX3AgOiBOVUxMOworfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICogY2xlYW4gdXAgYWZ0ZXIgcmVhZGluZyBmcm9tIHRoZSBjZWxscyBsaXN0CiAgKi8KIHN0YXRpYyB2b2lkIGFmc19wcm9jX2NlbGxfc2VydmVyc19zdG9wKHN0cnVjdCBzZXFfZmlsZSAqcCwgdm9pZCAqdikKLQlfX3JlbGVhc2VzKHAtPnByaXZhdGUtPnN2X2xvY2spCisJX19yZWxlYXNlcyhwLT5wcml2YXRlLT5zZXJ2ZXJzX2xvY2spCiB7CiAJc3RydWN0IGFmc19jZWxsICpjZWxsID0gcC0+cHJpdmF0ZTsKIAotCXJlYWRfdW5sb2NrKCZjZWxsLT5zdl9sb2NrKTsKKwlyZWFkX3VubG9jaygmY2VsbC0+c2VydmVyc19sb2NrKTsKK30KIAotfSAvKiBlbmQgYWZzX3Byb2NfY2VsbF9zZXJ2ZXJzX3N0b3AoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICogZGlzcGxheSBhIGhlYWRlciBsaW5lIGZvbGxvd2VkIGJ5IGEgbG9hZCBvZiB2b2x1bWUgbGluZXMKICAqLwpAQCAtODQ5LDEwICs4MDIsNyBAQAogCS8qIGRpc3BsYXkgb25lIGNlbGwgcGVyIGxpbmUgb24gc3Vic2VxdWVudCBsaW5lcyAqLwogCXNwcmludGYoaXBhZGRyLCAiJXUuJXUuJXUuJXUiLCBOSVBRVUFEKHNlcnZlci0+YWRkcikpOwogCXNlcV9wcmludGYobSwgIiUzZCAlLTE1LjE1cyAlNWRcbiIsCi0JCSAgIGF0b21pY19yZWFkKCZzZXJ2ZXItPnVzYWdlKSwKLQkJICAgaXBhZGRyLAotCQkgICBzZXJ2ZXItPmZzX3N0YXRlCi0JCSAgICk7CisJCSAgIGF0b21pY19yZWFkKCZzZXJ2ZXItPnVzYWdlKSwgaXBhZGRyLCBzZXJ2ZXItPmZzX3N0YXRlKTsKIAogCXJldHVybiAwOwotfSAvKiBlbmQgYWZzX3Byb2NfY2VsbF9zZXJ2ZXJzX3Nob3coKSAqLworfQpkaWZmIC0tZ2l0IGEvZnMvYWZzL3J4cnBjLmMgYi9mcy9hZnMvcnhycGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjJjMWEzCi0tLSAvZGV2L251bGwKKysrIGIvZnMvYWZzL3J4cnBjLmMKQEAgLTAsMCArMSw3ODIgQEAKKy8qIE1haW50YWluIGFuIFJ4UlBDIHNlcnZlciBzb2NrZXQgdG8gZG8gQUZTIGNvbW11bmljYXRpb25zIHRocm91Z2gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bmV0L2FmX3J4cnBjLmg+CisjaW5jbHVkZSA8cnhycGMvcGFja2V0Lmg+CisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJhZnNfY20uaCIKKworc3RhdGljIHN0cnVjdCBzb2NrZXQgKmFmc19zb2NrZXQ7IC8qIG15IFJ4UlBDIHNvY2tldCAqLworc3RhdGljIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICphZnNfYXN5bmNfY2FsbHM7CitzdGF0aWMgYXRvbWljX3QgYWZzX291dHN0YW5kaW5nX2NhbGxzOworc3RhdGljIGF0b21pY190IGFmc19vdXRzdGFuZGluZ19za2JzOworCitzdGF0aWMgdm9pZCBhZnNfd2FrZV91cF9jYWxsX3dhaXRlcihzdHJ1Y3QgYWZzX2NhbGwgKik7CitzdGF0aWMgaW50IGFmc193YWl0X2Zvcl9jYWxsX3RvX2NvbXBsZXRlKHN0cnVjdCBhZnNfY2FsbCAqKTsKK3N0YXRpYyB2b2lkIGFmc193YWtlX3VwX2FzeW5jX2NhbGwoc3RydWN0IGFmc19jYWxsICopOworc3RhdGljIGludCBhZnNfZG9udF93YWl0X2Zvcl9jYWxsX3RvX2NvbXBsZXRlKHN0cnVjdCBhZnNfY2FsbCAqKTsKK3N0YXRpYyB2b2lkIGFmc19wcm9jZXNzX2FzeW5jX2NhbGwoc3RydWN0IHdvcmtfc3RydWN0ICopOworc3RhdGljIHZvaWQgYWZzX3J4X2ludGVyY2VwdG9yKHN0cnVjdCBzb2NrICosIHVuc2lnbmVkIGxvbmcsIHN0cnVjdCBza19idWZmICopOworc3RhdGljIGludCBhZnNfZGVsaXZlcl9jbV9vcF9pZChzdHJ1Y3QgYWZzX2NhbGwgKiwgc3RydWN0IHNrX2J1ZmYgKiwgYm9vbCk7CisKKy8qIHN5bmNocm9ub3VzIGNhbGwgbWFuYWdlbWVudCAqLworY29uc3Qgc3RydWN0IGFmc193YWl0X21vZGUgYWZzX3N5bmNfY2FsbCA9IHsKKwkucnhfd2FrZXVwCT0gYWZzX3dha2VfdXBfY2FsbF93YWl0ZXIsCisJLndhaXQJCT0gYWZzX3dhaXRfZm9yX2NhbGxfdG9fY29tcGxldGUsCit9OworCisvKiBhc3luY2hyb25vdXMgY2FsbCBtYW5hZ2VtZW50ICovCitjb25zdCBzdHJ1Y3QgYWZzX3dhaXRfbW9kZSBhZnNfYXN5bmNfY2FsbCA9IHsKKwkucnhfd2FrZXVwCT0gYWZzX3dha2VfdXBfYXN5bmNfY2FsbCwKKwkud2FpdAkJPSBhZnNfZG9udF93YWl0X2Zvcl9jYWxsX3RvX2NvbXBsZXRlLAorfTsKKworLyogYXN5bmNocm9ub3VzIGluY29taW5nIGNhbGwgbWFuYWdlbWVudCAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBhZnNfd2FpdF9tb2RlIGFmc19hc3luY19pbmNvbWluZ19jYWxsID0geworCS5yeF93YWtldXAJPSBhZnNfd2FrZV91cF9hc3luY19jYWxsLAorfTsKKworLyogYXN5bmNocm9ub3VzIGluY29taW5nIGNhbGwgaW5pdGlhbCBwcm9jZXNzaW5nICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGFmc19jYWxsX3R5cGUgYWZzX1JYQ014eHh4ID0geworCS5uYW1lCQk9ICJDQi54eHh4IiwKKwkuZGVsaXZlcgk9IGFmc19kZWxpdmVyX2NtX29wX2lkLAorCS5hYm9ydF90b19lcnJvcgk9IGFmc19hYm9ydF90b19lcnJvciwKK307CisKK3N0YXRpYyB2b2lkIGFmc19jb2xsZWN0X2luY29taW5nX2NhbGwoc3RydWN0IHdvcmtfc3RydWN0ICopOworCitzdGF0aWMgc3RydWN0IHNrX2J1ZmZfaGVhZCBhZnNfaW5jb21pbmdfY2FsbHM7CitzdGF0aWMgREVDTEFSRV9XT1JLKGFmc19jb2xsZWN0X2luY29taW5nX2NhbGxfd29yaywgYWZzX2NvbGxlY3RfaW5jb21pbmdfY2FsbCk7CisKKy8qCisgKiBvcGVuIGFuIFJ4UlBDIHNvY2tldCBhbmQgYmluZCBpdCB0byBiZSBhIHNlcnZlciBmb3IgY2FsbGJhY2sgbm90aWZpY2F0aW9ucworICogLSB0aGUgc29ja2V0IGlzIGxlZnQgaW4gYmxvY2tpbmcgbW9kZSBhbmQgbm9uLWJsb2NraW5nIG9wcyB1c2UgTVNHX0RPTlRXQUlUCisgKi8KK2ludCBhZnNfb3Blbl9zb2NrZXQodm9pZCkKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfcnhycGMgc3J4OworCXN0cnVjdCBzb2NrZXQgKnNvY2tldDsKKwlpbnQgcmV0OworCisJX2VudGVyKCIiKTsKKworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmFmc19pbmNvbWluZ19jYWxscyk7CisKKwlhZnNfYXN5bmNfY2FsbHMgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgia2Fmc2QiKTsKKwlpZiAoIWFmc19hc3luY19jYWxscykgeworCQlfbGVhdmUoIiA9IC1FTk9NRU0gW3dxXSIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZXQgPSBzb2NrX2NyZWF0ZV9rZXJuKEFGX1JYUlBDLCBTT0NLX0RHUkFNLCBQRl9JTkVULCAmc29ja2V0KTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXN0cm95X3dvcmtxdWV1ZShhZnNfYXN5bmNfY2FsbHMpOworCQlfbGVhdmUoIiA9ICVkIFtzb2NrZXRdIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlzb2NrZXQtPnNrLT5za19hbGxvY2F0aW9uID0gR0ZQX05PRlM7CisKKwkvKiBiaW5kIHRoZSBjYWxsYmFjayBtYW5hZ2VyJ3MgYWRkcmVzcyB0byBtYWtlIHRoaXMgYSBzZXJ2ZXIgc29ja2V0ICovCisJc3J4LnNyeF9mYW1pbHkJCQk9IEFGX1JYUlBDOworCXNyeC5zcnhfc2VydmljZQkJCT0gQ01fU0VSVklDRTsKKwlzcngudHJhbnNwb3J0X3R5cGUJCT0gU09DS19ER1JBTTsKKwlzcngudHJhbnNwb3J0X2xlbgkJPSBzaXplb2Yoc3J4LnRyYW5zcG9ydC5zaW4pOworCXNyeC50cmFuc3BvcnQuc2luLnNpbl9mYW1pbHkJPSBBRl9JTkVUOworCXNyeC50cmFuc3BvcnQuc2luLnNpbl9wb3J0CT0gaHRvbnMoQUZTX0NNX1BPUlQpOworCW1lbXNldCgmc3J4LnRyYW5zcG9ydC5zaW4uc2luX2FkZHIsIDAsCisJICAgICAgIHNpemVvZihzcngudHJhbnNwb3J0LnNpbi5zaW5fYWRkcikpOworCisJcmV0ID0ga2VybmVsX2JpbmQoc29ja2V0LCAoc3RydWN0IHNvY2thZGRyICopICZzcngsIHNpemVvZihzcngpKTsKKwlpZiAocmV0IDwgMCkgeworCQlzb2NrX3JlbGVhc2Uoc29ja2V0KTsKKwkJX2xlYXZlKCIgPSAlZCBbYmluZF0iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJ4cnBjX2tlcm5lbF9pbnRlcmNlcHRfcnhfbWVzc2FnZXMoc29ja2V0LCBhZnNfcnhfaW50ZXJjZXB0b3IpOworCisJYWZzX3NvY2tldCA9IHNvY2tldDsKKwlfbGVhdmUoIiA9IDAiKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGNsb3NlIHRoZSBSeFJQQyBzb2NrZXQgQUZTIHdhcyB1c2luZworICovCit2b2lkIGFmc19jbG9zZV9zb2NrZXQodm9pZCkKK3sKKwlfZW50ZXIoIiIpOworCisJc29ja19yZWxlYXNlKGFmc19zb2NrZXQpOworCisJX2RlYnVnKCJkZXdvcmsiKTsKKwlkZXN0cm95X3dvcmtxdWV1ZShhZnNfYXN5bmNfY2FsbHMpOworCisJQVNTRVJUQ01QKGF0b21pY19yZWFkKCZhZnNfb3V0c3RhbmRpbmdfc2ticyksID09LCAwKTsKKwlBU1NFUlRDTVAoYXRvbWljX3JlYWQoJmFmc19vdXRzdGFuZGluZ19jYWxscyksID09LCAwKTsKKwlfbGVhdmUoIiIpOworfQorCisvKgorICogbm90ZSB0aGF0IHRoZSBkYXRhIGluIGEgc29ja2V0IGJ1ZmZlciBpcyBub3cgZGVsaXZlcmVkIGFuZCB0aGF0IHRoZSBidWZmZXIKKyAqIHNob3VsZCBiZSBmcmVlZAorICovCitzdGF0aWMgdm9pZCBhZnNfZGF0YV9kZWxpdmVyZWQoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpZiAoIXNrYikgeworCQlfZGVidWcoIkRMVlIgTlVMTCBbJWRdIiwgYXRvbWljX3JlYWQoJmFmc19vdXRzdGFuZGluZ19za2JzKSk7CisJCWR1bXBfc3RhY2soKTsKKwl9IGVsc2UgeworCQlfZGVidWcoIkRMVlIgJXB7JXV9IFslZF0iLAorCQkgICAgICAgc2tiLCBza2ItPm1hcmssIGF0b21pY19yZWFkKCZhZnNfb3V0c3RhbmRpbmdfc2ticykpOworCQlpZiAoYXRvbWljX2RlY19yZXR1cm4oJmFmc19vdXRzdGFuZGluZ19za2JzKSA9PSAtMSkKKwkJCUJVRygpOworCQlyeHJwY19rZXJuZWxfZGF0YV9kZWxpdmVyZWQoc2tiKTsKKwl9Cit9CisKKy8qCisgKiBmcmVlIGEgc29ja2V0IGJ1ZmZlcgorICovCitzdGF0aWMgdm9pZCBhZnNfZnJlZV9za2Ioc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpZiAoIXNrYikgeworCQlfZGVidWcoIkZSRUUgTlVMTCBbJWRdIiwgYXRvbWljX3JlYWQoJmFmc19vdXRzdGFuZGluZ19za2JzKSk7CisJCWR1bXBfc3RhY2soKTsKKwl9IGVsc2UgeworCQlfZGVidWcoIkZSRUUgJXB7JXV9IFslZF0iLAorCQkgICAgICAgc2tiLCBza2ItPm1hcmssIGF0b21pY19yZWFkKCZhZnNfb3V0c3RhbmRpbmdfc2ticykpOworCQlpZiAoYXRvbWljX2RlY19yZXR1cm4oJmFmc19vdXRzdGFuZGluZ19za2JzKSA9PSAtMSkKKwkJCUJVRygpOworCQlyeHJwY19rZXJuZWxfZnJlZV9za2Ioc2tiKTsKKwl9Cit9CisKKy8qCisgKiBmcmVlIGEgY2FsbAorICovCitzdGF0aWMgdm9pZCBhZnNfZnJlZV9jYWxsKHN0cnVjdCBhZnNfY2FsbCAqY2FsbCkKK3sKKwlfZGVidWcoIkRPTkUgJXB7JXN9IFslZF0iLAorCSAgICAgICBjYWxsLCBjYWxsLT50eXBlLT5uYW1lLCBhdG9taWNfcmVhZCgmYWZzX291dHN0YW5kaW5nX2NhbGxzKSk7CisJaWYgKGF0b21pY19kZWNfcmV0dXJuKCZhZnNfb3V0c3RhbmRpbmdfY2FsbHMpID09IC0xKQorCQlCVUcoKTsKKworCUFTU0VSVENNUChjYWxsLT5yeGNhbGwsID09LCBOVUxMKTsKKwlBU1NFUlQoIXdvcmtfcGVuZGluZygmY2FsbC0+YXN5bmNfd29yaykpOworCUFTU0VSVChza2JfcXVldWVfZW1wdHkoJmNhbGwtPnJ4X3F1ZXVlKSk7CisJQVNTRVJUKGNhbGwtPnR5cGUtPm5hbWUgIT0gTlVMTCk7CisKKwlrZnJlZShjYWxsLT5yZXF1ZXN0KTsKKwlrZnJlZShjYWxsKTsKK30KKworLyoKKyAqIGFsbG9jYXRlIGEgY2FsbCB3aXRoIGZsYXQgcmVxdWVzdCBhbmQgcmVwbHkgYnVmZmVycworICovCitzdHJ1Y3QgYWZzX2NhbGwgKmFmc19hbGxvY19mbGF0X2NhbGwoY29uc3Qgc3RydWN0IGFmc19jYWxsX3R5cGUgKnR5cGUsCisJCQkJICAgICBzaXplX3QgcmVxdWVzdF9zaXplLCBzaXplX3QgcmVwbHlfc2l6ZSkKK3sKKwlzdHJ1Y3QgYWZzX2NhbGwgKmNhbGw7CisKKwljYWxsID0ga3phbGxvYyhzaXplb2YoKmNhbGwpLCBHRlBfTk9GUyk7CisJaWYgKCFjYWxsKQorCQlnb3RvIG5vbWVtX2NhbGw7CisKKwlfZGVidWcoIkNBTEwgJXB7JXN9IFslZF0iLAorCSAgICAgICBjYWxsLCB0eXBlLT5uYW1lLCBhdG9taWNfcmVhZCgmYWZzX291dHN0YW5kaW5nX2NhbGxzKSk7CisJYXRvbWljX2luYygmYWZzX291dHN0YW5kaW5nX2NhbGxzKTsKKworCWNhbGwtPnR5cGUgPSB0eXBlOworCWNhbGwtPnJlcXVlc3Rfc2l6ZSA9IHJlcXVlc3Rfc2l6ZTsKKwljYWxsLT5yZXBseV9tYXggPSByZXBseV9zaXplOworCisJaWYgKHJlcXVlc3Rfc2l6ZSkgeworCQljYWxsLT5yZXF1ZXN0ID0ga21hbGxvYyhyZXF1ZXN0X3NpemUsIEdGUF9OT0ZTKTsKKwkJaWYgKCFjYWxsLT5yZXF1ZXN0KQorCQkJZ290byBub21lbV9mcmVlOworCX0KKworCWlmIChyZXBseV9zaXplKSB7CisJCWNhbGwtPmJ1ZmZlciA9IGttYWxsb2MocmVwbHlfc2l6ZSwgR0ZQX05PRlMpOworCQlpZiAoIWNhbGwtPmJ1ZmZlcikKKwkJCWdvdG8gbm9tZW1fZnJlZTsKKwl9CisKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjYWxsLT53YWl0cSk7CisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmY2FsbC0+cnhfcXVldWUpOworCXJldHVybiBjYWxsOworCitub21lbV9mcmVlOgorCWFmc19mcmVlX2NhbGwoY2FsbCk7Citub21lbV9jYWxsOgorCXJldHVybiBOVUxMOworfQorCisvKgorICogY2xlYW4gdXAgYSBjYWxsIHdpdGggZmxhdCBidWZmZXIKKyAqLwordm9pZCBhZnNfZmxhdF9jYWxsX2Rlc3RydWN0b3Ioc3RydWN0IGFmc19jYWxsICpjYWxsKQoreworCV9lbnRlcigiIik7CisKKwlrZnJlZShjYWxsLT5yZXF1ZXN0KTsKKwljYWxsLT5yZXF1ZXN0ID0gTlVMTDsKKwlrZnJlZShjYWxsLT5idWZmZXIpOworCWNhbGwtPmJ1ZmZlciA9IE5VTEw7Cit9CisKKy8qCisgKiBpbml0aWF0ZSBhIGNhbGwKKyAqLworaW50IGFmc19tYWtlX2NhbGwoc3RydWN0IGluX2FkZHIgKmFkZHIsIHN0cnVjdCBhZnNfY2FsbCAqY2FsbCwgZ2ZwX3QgZ2ZwLAorCQkgIGNvbnN0IHN0cnVjdCBhZnNfd2FpdF9tb2RlICp3YWl0X21vZGUpCit7CisJc3RydWN0IHNvY2thZGRyX3J4cnBjIHNyeDsKKwlzdHJ1Y3QgcnhycGNfY2FsbCAqcnhjYWxsOworCXN0cnVjdCBtc2doZHIgbXNnOworCXN0cnVjdCBrdmVjIGlvdlsxXTsKKwlpbnQgcmV0OworCisJX2VudGVyKCIleCx7JWR9LCIsIGFkZHItPnNfYWRkciwgbnRvaHMoY2FsbC0+cG9ydCkpOworCisJQVNTRVJUKGNhbGwtPnR5cGUgIT0gTlVMTCk7CisJQVNTRVJUKGNhbGwtPnR5cGUtPm5hbWUgIT0gTlVMTCk7CisKKwlfZGVidWcoIk1BS0UgJXB7JXN9IFslZF0iLAorCSAgICAgICBjYWxsLCBjYWxsLT50eXBlLT5uYW1lLCBhdG9taWNfcmVhZCgmYWZzX291dHN0YW5kaW5nX2NhbGxzKSk7CisKKwljYWxsLT53YWl0X21vZGUgPSB3YWl0X21vZGU7CisJSU5JVF9XT1JLKCZjYWxsLT5hc3luY193b3JrLCBhZnNfcHJvY2Vzc19hc3luY19jYWxsKTsKKworCW1lbXNldCgmc3J4LCAwLCBzaXplb2Yoc3J4KSk7CisJc3J4LnNyeF9mYW1pbHkgPSBBRl9SWFJQQzsKKwlzcnguc3J4X3NlcnZpY2UgPSBjYWxsLT5zZXJ2aWNlX2lkOworCXNyeC50cmFuc3BvcnRfdHlwZSA9IFNPQ0tfREdSQU07CisJc3J4LnRyYW5zcG9ydF9sZW4gPSBzaXplb2Yoc3J4LnRyYW5zcG9ydC5zaW4pOworCXNyeC50cmFuc3BvcnQuc2luLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCXNyeC50cmFuc3BvcnQuc2luLnNpbl9wb3J0ID0gY2FsbC0+cG9ydDsKKwltZW1jcHkoJnNyeC50cmFuc3BvcnQuc2luLnNpbl9hZGRyLCBhZGRyLCA0KTsKKworCS8qIGNyZWF0ZSBhIGNhbGwgKi8KKwlyeGNhbGwgPSByeHJwY19rZXJuZWxfYmVnaW5fY2FsbChhZnNfc29ja2V0LCAmc3J4LCBjYWxsLT5rZXksCisJCQkJCSAodW5zaWduZWQgbG9uZykgY2FsbCwgZ2ZwKTsKKwljYWxsLT5rZXkgPSBOVUxMOworCWlmIChJU19FUlIocnhjYWxsKSkgeworCQlyZXQgPSBQVFJfRVJSKHJ4Y2FsbCk7CisJCWdvdG8gZXJyb3Jfa2lsbF9jYWxsOworCX0KKworCWNhbGwtPnJ4Y2FsbCA9IHJ4Y2FsbDsKKworCS8qIHNlbmQgdGhlIHJlcXVlc3QgKi8KKwlpb3ZbMF0uaW92X2Jhc2UJPSBjYWxsLT5yZXF1ZXN0OworCWlvdlswXS5pb3ZfbGVuCT0gY2FsbC0+cmVxdWVzdF9zaXplOworCisJbXNnLm1zZ19uYW1lCQk9IE5VTEw7CisJbXNnLm1zZ19uYW1lbGVuCQk9IDA7CisJbXNnLm1zZ19pb3YJCT0gKHN0cnVjdCBpb3ZlYyAqKSBpb3Y7CisJbXNnLm1zZ19pb3ZsZW4JCT0gMTsKKwltc2cubXNnX2NvbnRyb2wJCT0gTlVMTDsKKwltc2cubXNnX2NvbnRyb2xsZW4JPSAwOworCW1zZy5tc2dfZmxhZ3MJCT0gMDsKKworCS8qIGhhdmUgdG8gY2hhbmdlIHRoZSBzdGF0ZSAqYmVmb3JlKiBzZW5kaW5nIHRoZSBsYXN0IHBhY2tldCBhcyBSeFJQQworCSAqIG1pZ2h0IGdpdmUgdXMgdGhlIHJlcGx5IGJlZm9yZSBpdCByZXR1cm5zIGZyb20gc2VuZGluZyB0aGUKKwkgKiByZXF1ZXN0ICovCisJY2FsbC0+c3RhdGUgPSBBRlNfQ0FMTF9BV0FJVF9SRVBMWTsKKwlyZXQgPSByeHJwY19rZXJuZWxfc2VuZF9kYXRhKHJ4Y2FsbCwgJm1zZywgY2FsbC0+cmVxdWVzdF9zaXplKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJvcl9kb19hYm9ydDsKKworCS8qIGF0IHRoaXMgcG9pbnQsIGFuIGFzeW5jIGNhbGwgbWF5IG5vIGxvbmdlciBleGlzdCBhcyBpdCBtYXkgaGF2ZQorCSAqIGFscmVhZHkgY29tcGxldGVkICovCisJcmV0dXJuIHdhaXRfbW9kZS0+d2FpdChjYWxsKTsKKworZXJyb3JfZG9fYWJvcnQ6CisJcnhycGNfa2VybmVsX2Fib3J0X2NhbGwocnhjYWxsLCBSWF9VU0VSX0FCT1JUKTsKKwlyeHJwY19rZXJuZWxfZW5kX2NhbGwocnhjYWxsKTsKKwljYWxsLT5yeGNhbGwgPSBOVUxMOworZXJyb3Jfa2lsbF9jYWxsOgorCWNhbGwtPnR5cGUtPmRlc3RydWN0b3IoY2FsbCk7CisJYWZzX2ZyZWVfY2FsbChjYWxsKTsKKwlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogaGFuZGxlcyBpbnRlcmNlcHRlZCBtZXNzYWdlcyB0aGF0IHdlcmUgYXJyaXZpbmcgaW4gdGhlIHNvY2tldCdzIFJ4IHF1ZXVlCisgKiAtIGNhbGxlZCB3aXRoIHRoZSBzb2NrZXQgcmVjZWl2ZSBxdWV1ZSBsb2NrIGhlbGQgdG8gZW5zdXJlIG1lc3NhZ2Ugb3JkZXJpbmcKKyAqIC0gY2FsbGVkIHdpdGggc29mdGlycXMgZGlzYWJsZWQKKyAqLworc3RhdGljIHZvaWQgYWZzX3J4X2ludGVyY2VwdG9yKHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgbG9uZyB1c2VyX2NhbGxfSUQsCisJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwgPSAoc3RydWN0IGFmc19jYWxsICopIHVzZXJfY2FsbF9JRDsKKworCV9lbnRlcigiJXAsLCV1IiwgY2FsbCwgc2tiLT5tYXJrKTsKKworCV9kZWJ1ZygiSUNQVCAlcHsldX0gWyVkXSIsCisJICAgICAgIHNrYiwgc2tiLT5tYXJrLCBhdG9taWNfcmVhZCgmYWZzX291dHN0YW5kaW5nX3NrYnMpKTsKKworCUFTU0VSVENNUChzaywgPT0sIGFmc19zb2NrZXQtPnNrKTsKKwlhdG9taWNfaW5jKCZhZnNfb3V0c3RhbmRpbmdfc2ticyk7CisKKwlpZiAoIWNhbGwpIHsKKwkJLyogaXRzIGFuIGluY29taW5nIGNhbGwgZm9yIG91ciBjYWxsYmFjayBzZXJ2aWNlICovCisJCXNrYl9xdWV1ZV90YWlsKCZhZnNfaW5jb21pbmdfY2FsbHMsIHNrYik7CisJCXNjaGVkdWxlX3dvcmsoJmFmc19jb2xsZWN0X2luY29taW5nX2NhbGxfd29yayk7CisJfSBlbHNlIHsKKwkJLyogcm91dGUgdGhlIG1lc3NhZ2VzIGRpcmVjdGx5IHRvIHRoZSBhcHByb3ByaWF0ZSBjYWxsICovCisJCXNrYl9xdWV1ZV90YWlsKCZjYWxsLT5yeF9xdWV1ZSwgc2tiKTsKKwkJY2FsbC0+d2FpdF9tb2RlLT5yeF93YWtldXAoY2FsbCk7CisJfQorCisJX2xlYXZlKCIiKTsKK30KKworLyoKKyAqIGRlbGl2ZXIgbWVzc2FnZXMgdG8gYSBjYWxsCisgKi8KK3N0YXRpYyB2b2lkIGFmc19kZWxpdmVyX3RvX2NhbGwoc3RydWN0IGFmc19jYWxsICpjYWxsKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJYm9vbCBsYXN0OworCXUzMiBhYm9ydF9jb2RlOworCWludCByZXQ7CisKKwlfZW50ZXIoIiIpOworCisJd2hpbGUgKChjYWxsLT5zdGF0ZSA9PSBBRlNfQ0FMTF9BV0FJVF9SRVBMWSB8fAorCQljYWxsLT5zdGF0ZSA9PSBBRlNfQ0FMTF9BV0FJVF9PUF9JRCB8fAorCQljYWxsLT5zdGF0ZSA9PSBBRlNfQ0FMTF9BV0FJVF9SRVFVRVNUIHx8CisJCWNhbGwtPnN0YXRlID09IEFGU19DQUxMX0FXQUlUX0FDSykgJiYKKwkgICAgICAgKHNrYiA9IHNrYl9kZXF1ZXVlKCZjYWxsLT5yeF9xdWV1ZSkpKSB7CisJCXN3aXRjaCAoc2tiLT5tYXJrKSB7CisJCWNhc2UgUlhSUENfU0tCX01BUktfREFUQToKKwkJCV9kZWJ1ZygiUmN2IERBVEEiKTsKKwkJCWxhc3QgPSByeHJwY19rZXJuZWxfaXNfZGF0YV9sYXN0KHNrYik7CisJCQlyZXQgPSBjYWxsLT50eXBlLT5kZWxpdmVyKGNhbGwsIHNrYiwgbGFzdCk7CisJCQlzd2l0Y2ggKHJldCkgeworCQkJY2FzZSAwOgorCQkJCWlmIChsYXN0ICYmCisJCQkJICAgIGNhbGwtPnN0YXRlID09IEFGU19DQUxMX0FXQUlUX1JFUExZKQorCQkJCQljYWxsLT5zdGF0ZSA9IEFGU19DQUxMX0NPTVBMRVRFOworCQkJCWJyZWFrOworCQkJY2FzZSAtRU5PVENPTk46CisJCQkJYWJvcnRfY29kZSA9IFJYX0NBTExfREVBRDsKKwkJCQlnb3RvIGRvX2Fib3J0OworCQkJY2FzZSAtRU5PVFNVUFA6CisJCQkJYWJvcnRfY29kZSA9IFJYX0lOVkFMSURfT1BFUkFUSU9OOworCQkJCWdvdG8gZG9fYWJvcnQ7CisJCQlkZWZhdWx0OgorCQkJCWFib3J0X2NvZGUgPSBSWEdFTl9DQ19VTk1BUlNIQUw7CisJCQkJaWYgKGNhbGwtPnN0YXRlICE9IEFGU19DQUxMX0FXQUlUX1JFUExZKQorCQkJCQlhYm9ydF9jb2RlID0gUlhHRU5fU1NfVU5NQVJTSEFMOworCQkJZG9fYWJvcnQ6CisJCQkJcnhycGNfa2VybmVsX2Fib3J0X2NhbGwoY2FsbC0+cnhjYWxsLAorCQkJCQkJCWFib3J0X2NvZGUpOworCQkJCWNhbGwtPmVycm9yID0gcmV0OworCQkJCWNhbGwtPnN0YXRlID0gQUZTX0NBTExfRVJST1I7CisJCQkJYnJlYWs7CisJCQl9CisJCQlhZnNfZGF0YV9kZWxpdmVyZWQoc2tiKTsKKwkJCXNrYiA9IE5VTEw7CisJCQljb250aW51ZTsKKwkJY2FzZSBSWFJQQ19TS0JfTUFSS19GSU5BTF9BQ0s6CisJCQlfZGVidWcoIlJjdiBBQ0siKTsKKwkJCWNhbGwtPnN0YXRlID0gQUZTX0NBTExfQ09NUExFVEU7CisJCQlicmVhazsKKwkJY2FzZSBSWFJQQ19TS0JfTUFSS19CVVNZOgorCQkJX2RlYnVnKCJSY3YgQlVTWSIpOworCQkJY2FsbC0+ZXJyb3IgPSAtRUJVU1k7CisJCQljYWxsLT5zdGF0ZSA9IEFGU19DQUxMX0JVU1k7CisJCQlicmVhazsKKwkJY2FzZSBSWFJQQ19TS0JfTUFSS19SRU1PVEVfQUJPUlQ6CisJCQlhYm9ydF9jb2RlID0gcnhycGNfa2VybmVsX2dldF9hYm9ydF9jb2RlKHNrYik7CisJCQljYWxsLT5lcnJvciA9IGNhbGwtPnR5cGUtPmFib3J0X3RvX2Vycm9yKGFib3J0X2NvZGUpOworCQkJY2FsbC0+c3RhdGUgPSBBRlNfQ0FMTF9BQk9SVEVEOworCQkJX2RlYnVnKCJSY3YgQUJPUlQgJXUgLT4gJWQiLCBhYm9ydF9jb2RlLCBjYWxsLT5lcnJvcik7CisJCQlicmVhazsKKwkJY2FzZSBSWFJQQ19TS0JfTUFSS19ORVRfRVJST1I6CisJCQljYWxsLT5lcnJvciA9IC1yeHJwY19rZXJuZWxfZ2V0X2Vycm9yX251bWJlcihza2IpOworCQkJY2FsbC0+c3RhdGUgPSBBRlNfQ0FMTF9FUlJPUjsKKwkJCV9kZWJ1ZygiUmN2IE5FVCBFUlJPUiAlZCIsIGNhbGwtPmVycm9yKTsKKwkJCWJyZWFrOworCQljYXNlIFJYUlBDX1NLQl9NQVJLX0xPQ0FMX0VSUk9SOgorCQkJY2FsbC0+ZXJyb3IgPSAtcnhycGNfa2VybmVsX2dldF9lcnJvcl9udW1iZXIoc2tiKTsKKwkJCWNhbGwtPnN0YXRlID0gQUZTX0NBTExfRVJST1I7CisJCQlfZGVidWcoIlJjdiBMT0NBTCBFUlJPUiAlZCIsIGNhbGwtPmVycm9yKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJQlVHKCk7CisJCQlicmVhazsKKwkJfQorCisJCWFmc19mcmVlX3NrYihza2IpOworCX0KKworCS8qIG1ha2Ugc3VyZSB0aGUgcXVldWUgaXMgZW1wdHkgaWYgdGhlIGNhbGwgaXMgZG9uZSB3aXRoICh3ZSBtaWdodCBoYXZlCisJICogYWJvcnRlZCB0aGUgY2FsbCBlYXJseSBiZWNhdXNlIG9mIGFuIHVubWFyc2hhbGxpbmcgZXJyb3IpICovCisJaWYgKGNhbGwtPnN0YXRlID49IEFGU19DQUxMX0NPTVBMRVRFKSB7CisJCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJmNhbGwtPnJ4X3F1ZXVlKSkpCisJCQlhZnNfZnJlZV9za2Ioc2tiKTsKKwkJaWYgKGNhbGwtPmluY29taW5nKSB7CisJCQlyeHJwY19rZXJuZWxfZW5kX2NhbGwoY2FsbC0+cnhjYWxsKTsKKwkJCWNhbGwtPnJ4Y2FsbCA9IE5VTEw7CisJCQljYWxsLT50eXBlLT5kZXN0cnVjdG9yKGNhbGwpOworCQkJYWZzX2ZyZWVfY2FsbChjYWxsKTsKKwkJfQorCX0KKworCV9sZWF2ZSgiIik7Cit9CisKKy8qCisgKiB3YWl0IHN5bmNocm9ub3VzbHkgZm9yIGEgY2FsbCB0byBjb21wbGV0ZQorICovCitzdGF0aWMgaW50IGFmc193YWl0X2Zvcl9jYWxsX3RvX2NvbXBsZXRlKHN0cnVjdCBhZnNfY2FsbCAqY2FsbCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCByZXQ7CisKKwlERUNMQVJFX1dBSVRRVUVVRShteXNlbGYsIGN1cnJlbnQpOworCisJX2VudGVyKCIiKTsKKworCWFkZF93YWl0X3F1ZXVlKCZjYWxsLT53YWl0cSwgJm15c2VsZik7CisJZm9yICg7OykgeworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCisJCS8qIGRlbGl2ZXIgYW55IG1lc3NhZ2VzIHRoYXQgYXJlIGluIHRoZSBxdWV1ZSAqLworCQlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmY2FsbC0+cnhfcXVldWUpKSB7CisJCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJCQlhZnNfZGVsaXZlcl90b19jYWxsKGNhbGwpOworCQkJY29udGludWU7CisJCX0KKworCQlyZXQgPSBjYWxsLT5lcnJvcjsKKwkJaWYgKGNhbGwtPnN0YXRlID49IEFGU19DQUxMX0NPTVBMRVRFKQorCQkJYnJlYWs7CisJCXJldCA9IC1FSU5UUjsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJYnJlYWs7CisJCXNjaGVkdWxlKCk7CisJfQorCisJcmVtb3ZlX3dhaXRfcXVldWUoJmNhbGwtPndhaXRxLCAmbXlzZWxmKTsKKwlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisKKwkvKiBraWxsIHRoZSBjYWxsICovCisJaWYgKGNhbGwtPnN0YXRlIDwgQUZTX0NBTExfQ09NUExFVEUpIHsKKwkJX2RlYnVnKCJjYWxsIGluY29tcGxldGUiKTsKKwkJcnhycGNfa2VybmVsX2Fib3J0X2NhbGwoY2FsbC0+cnhjYWxsLCBSWF9DQUxMX0RFQUQpOworCQl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZjYWxsLT5yeF9xdWV1ZSkpKQorCQkJYWZzX2ZyZWVfc2tiKHNrYik7CisJfQorCisJX2RlYnVnKCJjYWxsIGNvbXBsZXRlIik7CisJcnhycGNfa2VybmVsX2VuZF9jYWxsKGNhbGwtPnJ4Y2FsbCk7CisJY2FsbC0+cnhjYWxsID0gTlVMTDsKKwljYWxsLT50eXBlLT5kZXN0cnVjdG9yKGNhbGwpOworCWFmc19mcmVlX2NhbGwoY2FsbCk7CisJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIHdha2UgdXAgYSB3YWl0aW5nIGNhbGwKKyAqLworc3RhdGljIHZvaWQgYWZzX3dha2VfdXBfY2FsbF93YWl0ZXIoc3RydWN0IGFmc19jYWxsICpjYWxsKQoreworCXdha2VfdXAoJmNhbGwtPndhaXRxKTsKK30KKworLyoKKyAqIHdha2UgdXAgYW4gYXN5bmNocm9ub3VzIGNhbGwKKyAqLworc3RhdGljIHZvaWQgYWZzX3dha2VfdXBfYXN5bmNfY2FsbChzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwpCit7CisJX2VudGVyKCIiKTsKKwlxdWV1ZV93b3JrKGFmc19hc3luY19jYWxscywgJmNhbGwtPmFzeW5jX3dvcmspOworfQorCisvKgorICogcHV0IGEgY2FsbCBpbnRvIGFzeW5jaHJvbm91cyBtb2RlCisgKiAtIG11c3RuJ3QgdG91Y2ggdGhlIGNhbGwgZGVzY3JpcHRvciBhcyB0aGUgY2FsbCBteSBoYXZlIGNvbXBsZXRlZCBieSB0aGUKKyAqICAgdGltZSB3ZSBnZXQgaGVyZQorICovCitzdGF0aWMgaW50IGFmc19kb250X3dhaXRfZm9yX2NhbGxfdG9fY29tcGxldGUoc3RydWN0IGFmc19jYWxsICpjYWxsKQoreworCV9lbnRlcigiIik7CisJcmV0dXJuIC1FSU5QUk9HUkVTUzsKK30KKworLyoKKyAqIGRlbGV0ZSBhbiBhc3luY2hyb25vdXMgY2FsbAorICovCitzdGF0aWMgdm9pZCBhZnNfZGVsZXRlX2FzeW5jX2NhbGwoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBhZnNfY2FsbCAqY2FsbCA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYWZzX2NhbGwsIGFzeW5jX3dvcmspOworCisJX2VudGVyKCIiKTsKKworCWFmc19mcmVlX2NhbGwoY2FsbCk7CisKKwlfbGVhdmUoIiIpOworfQorCisvKgorICogcGVyZm9ybSBwcm9jZXNzaW5nIG9uIGFuIGFzeW5jaHJvbm91cyBjYWxsCisgKiAtIG9uIGEgbXVsdGlwbGUtdGhyZWFkIHdvcmtxdWV1ZSB0aGlzIHdvcmsgaXRlbSBtYXkgdHJ5IHRvIHJ1biBvbiBzZXZlcmFsCisgKiAgIENQVXMgYXQgdGhlIHNhbWUgdGltZQorICovCitzdGF0aWMgdm9pZCBhZnNfcHJvY2Vzc19hc3luY19jYWxsKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGFmc19jYWxsLCBhc3luY193b3JrKTsKKworCV9lbnRlcigiIik7CisKKwlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmY2FsbC0+cnhfcXVldWUpKQorCQlhZnNfZGVsaXZlcl90b19jYWxsKGNhbGwpOworCisJaWYgKGNhbGwtPnN0YXRlID49IEFGU19DQUxMX0NPTVBMRVRFICYmIGNhbGwtPndhaXRfbW9kZSkgeworCQlpZiAoY2FsbC0+d2FpdF9tb2RlLT5hc3luY19jb21wbGV0ZSkKKwkJCWNhbGwtPndhaXRfbW9kZS0+YXN5bmNfY29tcGxldGUoY2FsbC0+cmVwbHksCisJCQkJCQkJY2FsbC0+ZXJyb3IpOworCQljYWxsLT5yZXBseSA9IE5VTEw7CisKKwkJLyoga2lsbCB0aGUgY2FsbCAqLworCQlyeHJwY19rZXJuZWxfZW5kX2NhbGwoY2FsbC0+cnhjYWxsKTsKKwkJY2FsbC0+cnhjYWxsID0gTlVMTDsKKwkJaWYgKGNhbGwtPnR5cGUtPmRlc3RydWN0b3IpCisJCQljYWxsLT50eXBlLT5kZXN0cnVjdG9yKGNhbGwpOworCisJCS8qIHdlIGNhbid0IGp1c3QgZGVsZXRlIHRoZSBjYWxsIGJlY2F1c2UgdGhlIHdvcmsgaXRlbSBtYXkgYmUKKwkJICogcXVldWVkICovCisJCVBSRVBBUkVfV09SSygmY2FsbC0+YXN5bmNfd29yaywgYWZzX2RlbGV0ZV9hc3luY19jYWxsKTsKKwkJcXVldWVfd29yayhhZnNfYXN5bmNfY2FsbHMsICZjYWxsLT5hc3luY193b3JrKTsKKwl9CisKKwlfbGVhdmUoIiIpOworfQorCisvKgorICogZW1wdHkgYSBzb2NrZXQgYnVmZmVyIGludG8gYSBmbGF0IHJlcGx5IGJ1ZmZlcgorICovCit2b2lkIGFmc190cmFuc2Zlcl9yZXBseShzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc2l6ZV90IGxlbiA9IHNrYi0+bGVuOworCisJaWYgKHNrYl9jb3B5X2JpdHMoc2tiLCAwLCBjYWxsLT5idWZmZXIgKyBjYWxsLT5yZXBseV9zaXplLCBsZW4pIDwgMCkKKwkJQlVHKCk7CisJY2FsbC0+cmVwbHlfc2l6ZSArPSBsZW47Cit9CisKKy8qCisgKiBhY2NlcHQgdGhlIGJhY2tsb2cgb2YgaW5jb21pbmcgY2FsbHMKKyAqLworc3RhdGljIHZvaWQgYWZzX2NvbGxlY3RfaW5jb21pbmdfY2FsbChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHJ4cnBjX2NhbGwgKnJ4Y2FsbDsKKwlzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwgPSBOVUxMOworCXN0cnVjdCBza19idWZmICpza2I7CisKKwl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZhZnNfaW5jb21pbmdfY2FsbHMpKSkgeworCQlfZGVidWcoIm5ldyBjYWxsIik7CisKKwkJLyogZG9uJ3QgbmVlZCB0aGUgbm90aWZpY2F0aW9uICovCisJCWFmc19mcmVlX3NrYihza2IpOworCisJCWlmICghY2FsbCkgeworCQkJY2FsbCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhZnNfY2FsbCksIEdGUF9LRVJORUwpOworCQkJaWYgKCFjYWxsKSB7CisJCQkJcnhycGNfa2VybmVsX3JlamVjdF9jYWxsKGFmc19zb2NrZXQpOworCQkJCXJldHVybjsKKwkJCX0KKworCQkJSU5JVF9XT1JLKCZjYWxsLT5hc3luY193b3JrLCBhZnNfcHJvY2Vzc19hc3luY19jYWxsKTsKKwkJCWNhbGwtPndhaXRfbW9kZSA9ICZhZnNfYXN5bmNfaW5jb21pbmdfY2FsbDsKKwkJCWNhbGwtPnR5cGUgPSAmYWZzX1JYQ014eHh4OworCQkJaW5pdF93YWl0cXVldWVfaGVhZCgmY2FsbC0+d2FpdHEpOworCQkJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmY2FsbC0+cnhfcXVldWUpOworCQkJY2FsbC0+c3RhdGUgPSBBRlNfQ0FMTF9BV0FJVF9PUF9JRDsKKworCQkJX2RlYnVnKCJDQUxMICVweyVzfSBbJWRdIiwKKwkJCSAgICAgICBjYWxsLCBjYWxsLT50eXBlLT5uYW1lLAorCQkJICAgICAgIGF0b21pY19yZWFkKCZhZnNfb3V0c3RhbmRpbmdfY2FsbHMpKTsKKwkJCWF0b21pY19pbmMoJmFmc19vdXRzdGFuZGluZ19jYWxscyk7CisJCX0KKworCQlyeGNhbGwgPSByeHJwY19rZXJuZWxfYWNjZXB0X2NhbGwoYWZzX3NvY2tldCwKKwkJCQkJCSAgKHVuc2lnbmVkIGxvbmcpIGNhbGwpOworCQlpZiAoIUlTX0VSUihyeGNhbGwpKSB7CisJCQljYWxsLT5yeGNhbGwgPSByeGNhbGw7CisJCQljYWxsID0gTlVMTDsKKwkJfQorCX0KKworCWlmIChjYWxsKQorCQlhZnNfZnJlZV9jYWxsKGNhbGwpOworfQorCisvKgorICogZ3JhYiB0aGUgb3BlcmF0aW9uIElEIGZyb20gYW4gaW5jb21pbmcgY2FjaGUgbWFuYWdlciBjYWxsCisgKi8KK3N0YXRpYyBpbnQgYWZzX2RlbGl2ZXJfY21fb3BfaWQoc3RydWN0IGFmc19jYWxsICpjYWxsLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCWJvb2wgbGFzdCkKK3sKKwlzaXplX3QgbGVuID0gc2tiLT5sZW47CisJdm9pZCAqb2lidWYgPSAodm9pZCAqKSAmY2FsbC0+b3BlcmF0aW9uX0lEOworCisJX2VudGVyKCJ7JXV9LHslenV9LCVkIiwgY2FsbC0+b2Zmc2V0LCBsZW4sIGxhc3QpOworCisJQVNTRVJUQ01QKGNhbGwtPm9mZnNldCwgPCwgNCk7CisKKwkvKiB0aGUgb3BlcmF0aW9uIElEIGZvcm1zIHRoZSBmaXJzdCBmb3VyIGJ5dGVzIG9mIHRoZSByZXF1ZXN0IGRhdGEgKi8KKwlsZW4gPSBtaW5fdChzaXplX3QsIGxlbiwgNCAtIGNhbGwtPm9mZnNldCk7CisJaWYgKHNrYl9jb3B5X2JpdHMoc2tiLCAwLCBvaWJ1ZiArIGNhbGwtPm9mZnNldCwgbGVuKSA8IDApCisJCUJVRygpOworCWlmICghcHNrYl9wdWxsKHNrYiwgbGVuKSkKKwkJQlVHKCk7CisJY2FsbC0+b2Zmc2V0ICs9IGxlbjsKKworCWlmIChjYWxsLT5vZmZzZXQgPCA0KSB7CisJCWlmIChsYXN0KSB7CisJCQlfbGVhdmUoIiA9IC1FQkFETVNHIFtvcCBJRCBzaG9ydF0iKTsKKwkJCXJldHVybiAtRUJBRE1TRzsKKwkJfQorCQlfbGVhdmUoIiA9IDAgW2luY29tcGxldGVdIik7CisJCXJldHVybiAwOworCX0KKworCWNhbGwtPnN0YXRlID0gQUZTX0NBTExfQVdBSVRfUkVRVUVTVDsKKworCS8qIGFzayB0aGUgY2FjaGUgbWFuYWdlciB0byByb3V0ZSB0aGUgY2FsbCAoaXQnbGwgY2hhbmdlIHRoZSBjYWxsIHR5cGUKKwkgKiBpZiBzdWNjZXNzZnVsKSAqLworCWlmICghYWZzX2NtX2luY29taW5nX2NhbGwoY2FsbCkpCisJCXJldHVybiAtRU5PVFNVUFA7CisKKwkvKiBwYXNzIHJlc3BvbnNpYmlsaXR5IGZvciB0aGUgcmVtYWluZXIgb2YgdGhpcyBtZXNzYWdlIG9mZiB0byB0aGUKKwkgKiBjYWNoZSBtYW5hZ2VyIG9wICovCisJcmV0dXJuIGNhbGwtPnR5cGUtPmRlbGl2ZXIoY2FsbCwgc2tiLCBsYXN0KTsKK30KKworLyoKKyAqIHNlbmQgYW4gZW1wdHkgcmVwbHkKKyAqLwordm9pZCBhZnNfc2VuZF9lbXB0eV9yZXBseShzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwpCit7CisJc3RydWN0IG1zZ2hkciBtc2c7CisJc3RydWN0IGlvdmVjIGlvdlsxXTsKKworCV9lbnRlcigiIik7CisKKwlpb3ZbMF0uaW92X2Jhc2UJCT0gTlVMTDsKKwlpb3ZbMF0uaW92X2xlbgkJPSAwOworCW1zZy5tc2dfbmFtZQkJPSBOVUxMOworCW1zZy5tc2dfbmFtZWxlbgkJPSAwOworCW1zZy5tc2dfaW92CQk9IGlvdjsKKwltc2cubXNnX2lvdmxlbgkJPSAwOworCW1zZy5tc2dfY29udHJvbAkJPSBOVUxMOworCW1zZy5tc2dfY29udHJvbGxlbgk9IDA7CisJbXNnLm1zZ19mbGFncwkJPSAwOworCisJY2FsbC0+c3RhdGUgPSBBRlNfQ0FMTF9BV0FJVF9BQ0s7CisJc3dpdGNoIChyeHJwY19rZXJuZWxfc2VuZF9kYXRhKGNhbGwtPnJ4Y2FsbCwgJm1zZywgMCkpIHsKKwljYXNlIDA6CisJCV9sZWF2ZSgiIFtyZXBsaWVkXSIpOworCQlyZXR1cm47CisKKwljYXNlIC1FTk9NRU06CisJCV9kZWJ1Zygib29tIik7CisJCXJ4cnBjX2tlcm5lbF9hYm9ydF9jYWxsKGNhbGwtPnJ4Y2FsbCwgUlhfVVNFUl9BQk9SVCk7CisJZGVmYXVsdDoKKwkJcnhycGNfa2VybmVsX2VuZF9jYWxsKGNhbGwtPnJ4Y2FsbCk7CisJCWNhbGwtPnJ4Y2FsbCA9IE5VTEw7CisJCWNhbGwtPnR5cGUtPmRlc3RydWN0b3IoY2FsbCk7CisJCWFmc19mcmVlX2NhbGwoY2FsbCk7CisJCV9sZWF2ZSgiIFtlcnJvcl0iKTsKKwkJcmV0dXJuOworCX0KK30KKworLyoKKyAqIHNlbmQgYSBzaW1wbGUgcmVwbHkKKyAqLwordm9pZCBhZnNfc2VuZF9zaW1wbGVfcmVwbHkoc3RydWN0IGFmc19jYWxsICpjYWxsLCBjb25zdCB2b2lkICpidWYsIHNpemVfdCBsZW4pCit7CisJc3RydWN0IG1zZ2hkciBtc2c7CisJc3RydWN0IGlvdmVjIGlvdlsxXTsKKworCV9lbnRlcigiIik7CisKKwlpb3ZbMF0uaW92X2Jhc2UJCT0gKHZvaWQgKikgYnVmOworCWlvdlswXS5pb3ZfbGVuCQk9IGxlbjsKKwltc2cubXNnX25hbWUJCT0gTlVMTDsKKwltc2cubXNnX25hbWVsZW4JCT0gMDsKKwltc2cubXNnX2lvdgkJPSBpb3Y7CisJbXNnLm1zZ19pb3ZsZW4JCT0gMTsKKwltc2cubXNnX2NvbnRyb2wJCT0gTlVMTDsKKwltc2cubXNnX2NvbnRyb2xsZW4JPSAwOworCW1zZy5tc2dfZmxhZ3MJCT0gMDsKKworCWNhbGwtPnN0YXRlID0gQUZTX0NBTExfQVdBSVRfQUNLOworCXN3aXRjaCAocnhycGNfa2VybmVsX3NlbmRfZGF0YShjYWxsLT5yeGNhbGwsICZtc2csIGxlbikpIHsKKwljYXNlIDA6CisJCV9sZWF2ZSgiIFtyZXBsaWVkXSIpOworCQlyZXR1cm47CisKKwljYXNlIC1FTk9NRU06CisJCV9kZWJ1Zygib29tIik7CisJCXJ4cnBjX2tlcm5lbF9hYm9ydF9jYWxsKGNhbGwtPnJ4Y2FsbCwgUlhfVVNFUl9BQk9SVCk7CisJZGVmYXVsdDoKKwkJcnhycGNfa2VybmVsX2VuZF9jYWxsKGNhbGwtPnJ4Y2FsbCk7CisJCWNhbGwtPnJ4Y2FsbCA9IE5VTEw7CisJCWNhbGwtPnR5cGUtPmRlc3RydWN0b3IoY2FsbCk7CisJCWFmc19mcmVlX2NhbGwoY2FsbCk7CisJCV9sZWF2ZSgiIFtlcnJvcl0iKTsKKwkJcmV0dXJuOworCX0KK30KKworLyoKKyAqIGV4dHJhY3QgYSBwaWVjZSBvZiBkYXRhIGZyb20gdGhlIHJlY2VpdmVkIGRhdGEgc29ja2V0IGJ1ZmZlcnMKKyAqLworaW50IGFmc19leHRyYWN0X2RhdGEoc3RydWN0IGFmc19jYWxsICpjYWxsLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkgICAgIGJvb2wgbGFzdCwgdm9pZCAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc2l6ZV90IGxlbiA9IHNrYi0+bGVuOworCisJX2VudGVyKCJ7JXV9LHslenV9LCVkLCwlenUiLCBjYWxsLT5vZmZzZXQsIGxlbiwgbGFzdCwgY291bnQpOworCisJQVNTRVJUQ01QKGNhbGwtPm9mZnNldCwgPCwgY291bnQpOworCisJbGVuID0gbWluX3Qoc2l6ZV90LCBsZW4sIGNvdW50IC0gY2FsbC0+b2Zmc2V0KTsKKwlpZiAoc2tiX2NvcHlfYml0cyhza2IsIDAsIGJ1ZiArIGNhbGwtPm9mZnNldCwgbGVuKSA8IDAgfHwKKwkgICAgIXBza2JfcHVsbChza2IsIGxlbikpCisJCUJVRygpOworCWNhbGwtPm9mZnNldCArPSBsZW47CisKKwlpZiAoY2FsbC0+b2Zmc2V0IDwgY291bnQpIHsKKwkJaWYgKGxhc3QpIHsKKwkJCV9sZWF2ZSgiID0gLUVCQURNU0cgWyVkIDwgJXp1XSIsIGNhbGwtPm9mZnNldCwgY291bnQpOworCQkJcmV0dXJuIC1FQkFETVNHOworCQl9CisJCV9sZWF2ZSgiID0gLUVBR0FJTiIpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9mcy9hZnMvc2VjdXJpdHkuYyBiL2ZzL2Fmcy9zZWN1cml0eS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5ZjQyNGQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9hZnMvc2VjdXJpdHkuYwpAQCAtMCwwICsxLDM1NiBAQAorLyogQUZTIHNlY3VyaXR5IGhhbmRsaW5nCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxrZXlzL3J4cnBjLXR5cGUuaD4KKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisvKgorICogZ2V0IGEga2V5CisgKi8KK3N0cnVjdCBrZXkgKmFmc19yZXF1ZXN0X2tleShzdHJ1Y3QgYWZzX2NlbGwgKmNlbGwpCit7CisJc3RydWN0IGtleSAqa2V5OworCisJX2VudGVyKCJ7JXh9Iiwga2V5X3NlcmlhbChjZWxsLT5hbm9ueW1vdXNfa2V5KSk7CisKKwlfZGVidWcoImtleSAlcyIsIGNlbGwtPmFub255bW91c19rZXktPmRlc2NyaXB0aW9uKTsKKwlrZXkgPSByZXF1ZXN0X2tleSgma2V5X3R5cGVfcnhycGMsIGNlbGwtPmFub255bW91c19rZXktPmRlc2NyaXB0aW9uLAorCQkJICBOVUxMKTsKKwlpZiAoSVNfRVJSKGtleSkpIHsKKwkJaWYgKFBUUl9FUlIoa2V5KSAhPSAtRU5PS0VZKSB7CisJCQlfbGVhdmUoIiA9ICVsZCIsIFBUUl9FUlIoa2V5KSk7CisJCQlyZXR1cm4ga2V5OworCQl9CisKKwkJLyogYWN0IGFzIGFub255bW91cyB1c2VyICovCisJCV9sZWF2ZSgiID0geyV4fSBbYW5vbl0iLCBrZXlfc2VyaWFsKGNlbGwtPmFub255bW91c19rZXkpKTsKKwkJcmV0dXJuIGtleV9nZXQoY2VsbC0+YW5vbnltb3VzX2tleSk7CisJfSBlbHNlIHsKKwkJLyogYWN0IGFzIGF1dGhvcmlzZWQgdXNlciAqLworCQlfbGVhdmUoIiA9IHsleH0gW2F1dGhdIiwga2V5X3NlcmlhbChrZXkpKTsKKwkJcmV0dXJuIGtleTsKKwl9Cit9CisKKy8qCisgKiBkaXNwb3NlIG9mIGEgcGVybWl0cyBsaXN0CisgKi8KK3ZvaWQgYWZzX3phcF9wZXJtaXRzKHN0cnVjdCByY3VfaGVhZCAqcmN1KQoreworCXN0cnVjdCBhZnNfcGVybWl0cyAqcGVybWl0cyA9CisJCWNvbnRhaW5lcl9vZihyY3UsIHN0cnVjdCBhZnNfcGVybWl0cywgcmN1KTsKKwlpbnQgbG9vcDsKKworCV9lbnRlcigieyVkfSIsIHBlcm1pdHMtPmNvdW50KTsKKworCWZvciAobG9vcCA9IHBlcm1pdHMtPmNvdW50IC0gMTsgbG9vcCA+PSAwOyBsb29wLS0pCisJCWtleV9wdXQocGVybWl0cy0+cGVybWl0c1tsb29wXS5rZXkpOworCWtmcmVlKHBlcm1pdHMpOworfQorCisvKgorICogZGlzcG9zZSBvZiBhIHBlcm1pdHMgbGlzdCBpbiB3aGljaCBhbGwgdGhlIGtleSBwb2ludGVycyBoYXZlIGJlZW4gY29waWVkCisgKi8KK3N0YXRpYyB2b2lkIGFmc19kaXNwb3NlX29mX3Blcm1pdHMoc3RydWN0IHJjdV9oZWFkICpyY3UpCit7CisJc3RydWN0IGFmc19wZXJtaXRzICpwZXJtaXRzID0KKwkJY29udGFpbmVyX29mKHJjdSwgc3RydWN0IGFmc19wZXJtaXRzLCByY3UpOworCisJX2VudGVyKCJ7JWR9IiwgcGVybWl0cy0+Y291bnQpOworCisJa2ZyZWUocGVybWl0cyk7Cit9CisKKy8qCisgKiBnZXQgdGhlIGF1dGhvcmlzaW5nIHZub2RlIC0gdGhpcyBpcyB0aGUgc3BlY2lmaWVkIGlub2RlIGl0c2VsZiBpZiBpdCdzIGEKKyAqIGRpcmVjdG9yeSBvciBpdCdzIHRoZSBwYXJlbnQgZGlyZWN0b3J5IGlmIHRoZSBzcGVjaWZpZWQgaW5vZGUgaXMgYSBmaWxlIG9yCisgKiBzeW1saW5rCisgKiAtIHRoZSBjYWxsZXIgbXVzdCByZWxlYXNlIHRoZSByZWYgb24gdGhlIGlub2RlCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYWZzX3Zub2RlICphZnNfZ2V0X2F1dGhfaW5vZGUoc3RydWN0IGFmc192bm9kZSAqdm5vZGUsCisJCQkJCSAgICBzdHJ1Y3Qga2V5ICprZXkpCit7CisJc3RydWN0IGFmc192bm9kZSAqYXV0aF92bm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKmF1dGhfaW5vZGU7CisKKwlfZW50ZXIoIiIpOworCisJaWYgKFNfSVNESVIodm5vZGUtPnZmc19pbm9kZS5pX21vZGUpKSB7CisJCWF1dGhfaW5vZGUgPSBpZ3JhYigmdm5vZGUtPnZmc19pbm9kZSk7CisJCUFTU0VSVChhdXRoX2lub2RlICE9IE5VTEwpOworCX0gZWxzZSB7CisJCWF1dGhfaW5vZGUgPSBhZnNfaWdldCh2bm9kZS0+dmZzX2lub2RlLmlfc2IsIGtleSwKKwkJCQkgICAgICAmdm5vZGUtPnN0YXR1cy5wYXJlbnQsIE5VTEwsIE5VTEwpOworCQlpZiAoSVNfRVJSKGF1dGhfaW5vZGUpKQorCQkJcmV0dXJuIEVSUl9QVFIoUFRSX0VSUihhdXRoX2lub2RlKSk7CisJfQorCisJYXV0aF92bm9kZSA9IEFGU19GU19JKGF1dGhfaW5vZGUpOworCV9sZWF2ZSgiID0geyV4fSIsIGF1dGhfdm5vZGUtPmZpZC52bm9kZSk7CisJcmV0dXJuIGF1dGhfdm5vZGU7Cit9CisKKy8qCisgKiBjbGVhciB0aGUgcGVybWl0IGNhY2hlIG9uIGEgZGlyZWN0b3J5IHZub2RlCisgKi8KK3ZvaWQgYWZzX2NsZWFyX3Blcm1pdHMoc3RydWN0IGFmc192bm9kZSAqdm5vZGUpCit7CisJc3RydWN0IGFmc19wZXJtaXRzICpwZXJtaXRzOworCisJX2VudGVyKCJ7JXh9Iiwgdm5vZGUtPmZpZC52bm9kZSk7CisKKwltdXRleF9sb2NrKCZ2bm9kZS0+cGVybWl0c19sb2NrKTsKKwlwZXJtaXRzID0gdm5vZGUtPnBlcm1pdHM7CisJcmN1X2Fzc2lnbl9wb2ludGVyKHZub2RlLT5wZXJtaXRzLCBOVUxMKTsKKwltdXRleF91bmxvY2soJnZub2RlLT5wZXJtaXRzX2xvY2spOworCisJaWYgKHBlcm1pdHMpCisJCWNhbGxfcmN1KCZwZXJtaXRzLT5yY3UsIGFmc196YXBfcGVybWl0cyk7CisJX2xlYXZlKCIiKTsKK30KKworLyoKKyAqIGFkZCB0aGUgcmVzdWx0IG9idGFpbmVkIGZvciBhIHZub2RlIHRvIGl0cyBvciBpdHMgcGFyZW50IGRpcmVjdG9yeSdzIGNhY2hlCisgKiBmb3IgdGhlIGtleSB1c2VkIHRvIGFjY2VzcyBpdAorICovCit2b2lkIGFmc19jYWNoZV9wZXJtaXQoc3RydWN0IGFmc192bm9kZSAqdm5vZGUsIHN0cnVjdCBrZXkgKmtleSwgbG9uZyBhY2xfb3JkZXIpCit7CisJc3RydWN0IGFmc19wZXJtaXRzICpwZXJtaXRzLCAqeHBlcm1pdHM7CisJc3RydWN0IGFmc19wZXJtaXQgKnBlcm1pdDsKKwlzdHJ1Y3QgYWZzX3Zub2RlICphdXRoX3Zub2RlOworCWludCBjb3VudCwgbG9vcDsKKworCV9lbnRlcigieyV4fSwleCwlbHgiLCB2bm9kZS0+ZmlkLnZub2RlLCBrZXlfc2VyaWFsKGtleSksIGFjbF9vcmRlcik7CisKKwlhdXRoX3Zub2RlID0gYWZzX2dldF9hdXRoX2lub2RlKHZub2RlLCBrZXkpOworCWlmIChJU19FUlIoYXV0aF92bm9kZSkpIHsKKwkJX2xlYXZlKCIgW2dldCBlcnJvciAlbGRdIiwgUFRSX0VSUihhdXRoX3Zub2RlKSk7CisJCXJldHVybjsKKwl9CisKKwltdXRleF9sb2NrKCZhdXRoX3Zub2RlLT5wZXJtaXRzX2xvY2spOworCisJLyogZ3VhcmQgYWdhaW5zdCBhIHJlbmFtZSBiZWluZyBkZXRlY3RlZCB3aGlsc3Qgd2Ugd2FpdGVkIGZvciB0aGUKKwkgKiBsb2NrICovCisJaWYgKG1lbWNtcCgmYXV0aF92bm9kZS0+ZmlkLCAmdm5vZGUtPnN0YXR1cy5wYXJlbnQsCisJCSAgIHNpemVvZihzdHJ1Y3QgYWZzX2ZpZCkpICE9IDApIHsKKwkJX2RlYnVnKCJyZW5hbWVkIik7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwkvKiBoYXZlIHRvIGJlIGNhcmVmdWwgYXMgdGhlIGRpcmVjdG9yeSdzIGNhbGxiYWNrIG1heSBiZSBicm9rZW4gYmV0d2VlbgorCSAqIHVzIHJlY2VpdmluZyB0aGUgc3RhdHVzIHdlJ3JlIHRyeWluZyB0byBjYWNoZSBhbmQgdXMgZ2V0dGluZyB0aGUKKwkgKiBsb2NrIHRvIHVwZGF0ZSB0aGUgY2FjaGUgZm9yIHRoZSBzdGF0dXMgKi8KKwlpZiAoYXV0aF92bm9kZS0+YWNsX29yZGVyIC0gYWNsX29yZGVyID4gMCkgeworCQlfZGVidWcoIkFDTCBjaGFuZ2VkPyIpOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJLyogYWx3YXlzIHVwZGF0ZSB0aGUgYW5vbnltb3VzIG1hc2sgKi8KKwlfZGVidWcoImFub24gYWNjZXNzICV4Iiwgdm5vZGUtPnN0YXR1cy5hbm9uX2FjY2Vzcyk7CisJYXV0aF92bm9kZS0+c3RhdHVzLmFub25fYWNjZXNzID0gdm5vZGUtPnN0YXR1cy5hbm9uX2FjY2VzczsKKwlpZiAoa2V5ID09IHZub2RlLT52b2x1bWUtPmNlbGwtPmFub255bW91c19rZXkpCisJCWdvdG8gb3V0X3VubG9jazsKKworCXhwZXJtaXRzID0gYXV0aF92bm9kZS0+cGVybWl0czsKKwljb3VudCA9IDA7CisJaWYgKHhwZXJtaXRzKSB7CisJCS8qIHNlZSBpZiB0aGUgcGVybWl0IGlzIGFscmVhZHkgaW4gdGhlIGxpc3QKKwkJICogLSBpZiBpdCBpcyB0aGVuIHdlIGp1c3QgYW1lbmQgdGhlIGxpc3QKKwkJICovCisJCWNvdW50ID0geHBlcm1pdHMtPmNvdW50OworCQlwZXJtaXQgPSB4cGVybWl0cy0+cGVybWl0czsKKwkJZm9yIChsb29wID0gY291bnQ7IGxvb3AgPiAwOyBsb29wLS0pIHsKKwkJCWlmIChwZXJtaXQtPmtleSA9PSBrZXkpIHsKKwkJCQlwZXJtaXQtPmFjY2Vzc19tYXNrID0KKwkJCQkJdm5vZGUtPnN0YXR1cy5jYWxsZXJfYWNjZXNzOworCQkJCWdvdG8gb3V0X3VubG9jazsKKwkJCX0KKwkJCXBlcm1pdCsrOworCQl9CisJfQorCisJcGVybWl0cyA9IGttYWxsb2Moc2l6ZW9mKCpwZXJtaXRzKSArIHNpemVvZigqcGVybWl0KSAqIChjb3VudCArIDEpLAorCQkJICBHRlBfTk9GUyk7CisJaWYgKCFwZXJtaXRzKQorCQlnb3RvIG91dF91bmxvY2s7CisKKwltZW1jcHkocGVybWl0cy0+cGVybWl0cywgeHBlcm1pdHMtPnBlcm1pdHMsCisJICAgICAgIGNvdW50ICogc2l6ZW9mKHN0cnVjdCBhZnNfcGVybWl0KSk7CisKKwlfZGVidWcoImtleSAleCBhY2Nlc3MgJXgiLAorCSAgICAgICBrZXlfc2VyaWFsKGtleSksIHZub2RlLT5zdGF0dXMuY2FsbGVyX2FjY2Vzcyk7CisJcGVybWl0cy0+cGVybWl0c1tjb3VudF0uYWNjZXNzX21hc2sgPSB2bm9kZS0+c3RhdHVzLmNhbGxlcl9hY2Nlc3M7CisJcGVybWl0cy0+cGVybWl0c1tjb3VudF0ua2V5ID0ga2V5X2dldChrZXkpOworCXBlcm1pdHMtPmNvdW50ID0gY291bnQgKyAxOworCisJcmN1X2Fzc2lnbl9wb2ludGVyKGF1dGhfdm5vZGUtPnBlcm1pdHMsIHBlcm1pdHMpOworCWlmICh4cGVybWl0cykKKwkJY2FsbF9yY3UoJnhwZXJtaXRzLT5yY3UsIGFmc19kaXNwb3NlX29mX3Blcm1pdHMpOworCitvdXRfdW5sb2NrOgorCW11dGV4X3VubG9jaygmYXV0aF92bm9kZS0+cGVybWl0c19sb2NrKTsKKwlpcHV0KCZhdXRoX3Zub2RlLT52ZnNfaW5vZGUpOworCV9sZWF2ZSgiIik7Cit9CisKKy8qCisgKiBjaGVjayB3aXRoIHRoZSBmaWxlc2VydmVyIHRvIHNlZSBpZiB0aGUgZGlyZWN0b3J5IG9yIHBhcmVudCBkaXJlY3RvcnkgaXMKKyAqIHBlcm1pdHRlZCB0byBiZSBhY2Nlc3NlZCB3aXRoIHRoaXMgYXV0aG9yaXNhdGlvbiwgYW5kIGlmIHNvLCB3aGF0IGFjY2VzcyBpdAorICogaXMgZ3JhbnRlZAorICovCitzdGF0aWMgaW50IGFmc19jaGVja19wZXJtaXQoc3RydWN0IGFmc192bm9kZSAqdm5vZGUsIHN0cnVjdCBrZXkgKmtleSwKKwkJCSAgICBhZnNfYWNjZXNzX3QgKl9hY2Nlc3MpCit7CisJc3RydWN0IGFmc19wZXJtaXRzICpwZXJtaXRzOworCXN0cnVjdCBhZnNfcGVybWl0ICpwZXJtaXQ7CisJc3RydWN0IGFmc192bm9kZSAqYXV0aF92bm9kZTsKKwlib29sIHZhbGlkOworCWludCBsb29wLCByZXQ7CisKKwlfZW50ZXIoIiIpOworCisJYXV0aF92bm9kZSA9IGFmc19nZXRfYXV0aF9pbm9kZSh2bm9kZSwga2V5KTsKKwlpZiAoSVNfRVJSKGF1dGhfdm5vZGUpKSB7CisJCSpfYWNjZXNzID0gMDsKKwkJX2xlYXZlKCIgPSAlbGQiLCBQVFJfRVJSKGF1dGhfdm5vZGUpKTsKKwkJcmV0dXJuIFBUUl9FUlIoYXV0aF92bm9kZSk7CisJfQorCisJQVNTRVJUKFNfSVNESVIoYXV0aF92bm9kZS0+dmZzX2lub2RlLmlfbW9kZSkpOworCisJLyogY2hlY2sgdGhlIHBlcm1pdHMgdG8gc2VlIGlmIHdlJ3ZlIGdvdCBvbmUgeWV0ICovCisJaWYgKGtleSA9PSBhdXRoX3Zub2RlLT52b2x1bWUtPmNlbGwtPmFub255bW91c19rZXkpIHsKKwkJX2RlYnVnKCJhbm9uIik7CisJCSpfYWNjZXNzID0gYXV0aF92bm9kZS0+c3RhdHVzLmFub25fYWNjZXNzOworCQl2YWxpZCA9IHRydWU7CisJfSBlbHNlIHsKKwkJdmFsaWQgPSBmYWxzZTsKKwkJcmN1X3JlYWRfbG9jaygpOworCQlwZXJtaXRzID0gcmN1X2RlcmVmZXJlbmNlKGF1dGhfdm5vZGUtPnBlcm1pdHMpOworCQlpZiAocGVybWl0cykgeworCQkJcGVybWl0ID0gcGVybWl0cy0+cGVybWl0czsKKwkJCWZvciAobG9vcCA9IHBlcm1pdHMtPmNvdW50OyBsb29wID4gMDsgbG9vcC0tKSB7CisJCQkJaWYgKHBlcm1pdC0+a2V5ID09IGtleSkgeworCQkJCQlfZGVidWcoImZvdW5kIGluIGNhY2hlIik7CisJCQkJCSpfYWNjZXNzID0gcGVybWl0LT5hY2Nlc3NfbWFzazsKKwkJCQkJdmFsaWQgPSB0cnVlOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJcGVybWl0Kys7CisJCQl9CisJCX0KKwkJcmN1X3JlYWRfdW5sb2NrKCk7CisJfQorCisJaWYgKCF2YWxpZCkgeworCQkvKiBjaGVjayB0aGUgc3RhdHVzIG9uIHRoZSBmaWxlIHdlJ3JlIGFjdHVhbGx5IGludGVyZXN0ZWQgaW4KKwkJICogKHRoZSBwb3N0LXByb2Nlc3Npbmcgd2lsbCBjYWNoZSB0aGUgcmVzdWx0IG9uIGF1dGhfdm5vZGUpICovCisJCV9kZWJ1Zygibm8gdmFsaWQgcGVybWl0Iik7CisKKwkJc2V0X2JpdChBRlNfVk5PREVfQ0JfQlJPS0VOLCAmdm5vZGUtPmZsYWdzKTsKKwkJcmV0ID0gYWZzX3Zub2RlX2ZldGNoX3N0YXR1cyh2bm9kZSwgYXV0aF92bm9kZSwga2V5KTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWlwdXQoJmF1dGhfdm5vZGUtPnZmc19pbm9kZSk7CisJCQkqX2FjY2VzcyA9IDA7CisJCQlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwkqX2FjY2VzcyA9IHZub2RlLT5zdGF0dXMuY2FsbGVyX2FjY2VzczsKKwlpcHV0KCZhdXRoX3Zub2RlLT52ZnNfaW5vZGUpOworCV9sZWF2ZSgiID0gMCBbYWNjZXNzICV4XSIsICpfYWNjZXNzKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGNoZWNrIHRoZSBwZXJtaXNzaW9ucyBvbiBhbiBBRlMgZmlsZQorICogLSBBRlMgQUNMcyBhcmUgYXR0YWNoZWQgdG8gZGlyZWN0b3JpZXMgb25seSwgYW5kIGEgZmlsZSBpcyBjb250cm9sbGVkIGJ5IGl0cworICogICBwYXJlbnQgZGlyZWN0b3J5J3MgQUNMCisgKi8KK2ludCBhZnNfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzaywgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJc3RydWN0IGFmc192bm9kZSAqdm5vZGUgPSBBRlNfRlNfSShpbm9kZSk7CisJYWZzX2FjY2Vzc190IGFjY2VzczsKKwlzdHJ1Y3Qga2V5ICprZXk7CisJaW50IHJldDsKKworCV9lbnRlcigie3sleDoleH0sJWx4fSwleCwiLAorCSAgICAgICB2bm9kZS0+ZmlkLnZpZCwgdm5vZGUtPmZpZC52bm9kZSwgdm5vZGUtPmZsYWdzLCBtYXNrKTsKKworCWtleSA9IGFmc19yZXF1ZXN0X2tleSh2bm9kZS0+dm9sdW1lLT5jZWxsKTsKKwlpZiAoSVNfRVJSKGtleSkpIHsKKwkJX2xlYXZlKCIgPSAlbGQgW2tleV0iLCBQVFJfRVJSKGtleSkpOworCQlyZXR1cm4gUFRSX0VSUihrZXkpOworCX0KKworCS8qIGlmIHRoZSBwcm9taXNlIGhhcyBleHBpcmVkLCB3ZSBuZWVkIHRvIGNoZWNrIHRoZSBzZXJ2ZXIgYWdhaW4gKi8KKwlpZiAoIXZub2RlLT5jYl9wcm9taXNlZCkgeworCQlfZGVidWcoIm5vdCBwcm9taXNlZCIpOworCQlyZXQgPSBhZnNfdm5vZGVfZmV0Y2hfc3RhdHVzKHZub2RlLCBOVUxMLCBrZXkpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCV9kZWJ1ZygibmV3IHByb21pc2UgW2ZsPSVseF0iLCB2bm9kZS0+ZmxhZ3MpOworCX0KKworCS8qIGNoZWNrIHRoZSBwZXJtaXRzIHRvIHNlZSBpZiB3ZSd2ZSBnb3Qgb25lIHlldCAqLworCXJldCA9IGFmc19jaGVja19wZXJtaXQodm5vZGUsIGtleSwgJmFjY2Vzcyk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBpbnRlcnByZXQgdGhlIGFjY2VzcyBtYXNrICovCisJX2RlYnVnKCJSRVEgJXggQUNDICV4IG9uICVzIiwKKwkgICAgICAgbWFzaywgYWNjZXNzLCBTX0lTRElSKGlub2RlLT5pX21vZGUpID8gImRpciIgOiAiZmlsZSIpOworCisJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpIHsKKwkJaWYgKG1hc2sgJiBNQVlfRVhFQykgeworCQkJaWYgKCEoYWNjZXNzICYgQUZTX0FDRV9MT09LVVApKQorCQkJCWdvdG8gcGVybWlzc2lvbl9kZW5pZWQ7CisJCX0gZWxzZSBpZiAobWFzayAmIE1BWV9SRUFEKSB7CisJCQlpZiAoIShhY2Nlc3MgJiBBRlNfQUNFX1JFQUQpKQorCQkJCWdvdG8gcGVybWlzc2lvbl9kZW5pZWQ7CisJCX0gZWxzZSBpZiAobWFzayAmIE1BWV9XUklURSkgeworCQkJaWYgKCEoYWNjZXNzICYgKEFGU19BQ0VfREVMRVRFIHwgLyogcm1kaXIsIHVubGluaywgcmVuYW1lIGZyb20gKi8KKwkJCQkJQUZTX0FDRV9JTlNFUlQgfCAvKiBjcmVhdGUsIG1rZGlyLCBzeW1saW5rLCByZW5hbWUgdG8gKi8KKwkJCQkJQUZTX0FDRV9XUklURSkpKSAvKiBjaG1vZCAqLworCQkJCWdvdG8gcGVybWlzc2lvbl9kZW5pZWQ7CisJCX0gZWxzZSB7CisJCQlCVUcoKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmICghKGFjY2VzcyAmIEFGU19BQ0VfTE9PS1VQKSkKKwkJCWdvdG8gcGVybWlzc2lvbl9kZW5pZWQ7CisJCWlmIChtYXNrICYgKE1BWV9FWEVDIHwgTUFZX1JFQUQpKSB7CisJCQlpZiAoIShhY2Nlc3MgJiBBRlNfQUNFX1JFQUQpKQorCQkJCWdvdG8gcGVybWlzc2lvbl9kZW5pZWQ7CisJCX0gZWxzZSBpZiAobWFzayAmIE1BWV9XUklURSkgeworCQkJaWYgKCEoYWNjZXNzICYgQUZTX0FDRV9XUklURSkpCisJCQkJZ290byBwZXJtaXNzaW9uX2RlbmllZDsKKwkJfQorCX0KKworCWtleV9wdXQoa2V5KTsKKwlyZXQgPSBnZW5lcmljX3Blcm1pc3Npb24oaW5vZGUsIG1hc2ssIE5VTEwpOworCV9sZWF2ZSgiID0gJWQiLCByZXQpOworCXJldHVybiByZXQ7CisKK3Blcm1pc3Npb25fZGVuaWVkOgorCXJldCA9IC1FQUNDRVM7CitlcnJvcjoKKwlrZXlfcHV0KGtleSk7CisJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2ZzL2Fmcy9zZXJ2ZXIuYyBiL2ZzL2Fmcy9zZXJ2ZXIuYwppbmRleCA0NGFmZjgxLi45NmJiMjNiIDEwMDY0NAotLS0gYS9mcy9hZnMvc2VydmVyLmMKKysrIGIvZnMvYWZzL3NlcnZlci5jCkBAIC0xLDYgKzEsNiBAQAotLyogc2VydmVyLmM6IEFGUyBzZXJ2ZXIgcmVjb3JkIG1hbmFnZW1lbnQKKy8qIEFGUyBzZXJ2ZXIgcmVjb3JkIG1hbmFnZW1lbnQKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCkBAIC0xMSw0ODkgKzExLDMxNCBAQAogCiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8cnhycGMvcGVlci5oPgotI2luY2x1ZGUgPHJ4cnBjL2Nvbm5lY3Rpb24uaD4KLSNpbmNsdWRlICJ2b2x1bWUuaCIKLSNpbmNsdWRlICJjZWxsLmgiCi0jaW5jbHVkZSAic2VydmVyLmgiCi0jaW5jbHVkZSAidHJhbnNwb3J0LmgiCi0jaW5jbHVkZSAidmxjbGllbnQuaCIKLSNpbmNsdWRlICJrYWZzdGltb2QuaCIKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogCi1ERUZJTkVfU1BJTkxPQ0soYWZzX3NlcnZlcl9wZWVyX2xvY2spOwordW5zaWduZWQgYWZzX3NlcnZlcl90aW1lb3V0ID0gMTA7CS8qIHNlcnZlciB0aW1lb3V0IGluIHNlY29uZHMgKi8KIAotI2RlZmluZSBGU19TRVJWSUNFX0lECQkxCS8qIEFGUyBWb2x1bWUgTG9jYXRpb24gU2VydmljZSBJRCAqLwotI2RlZmluZSBWTF9TRVJWSUNFX0lECQk1MgkvKiBBRlMgVm9sdW1lIExvY2F0aW9uIFNlcnZpY2UgSUQgKi8KK3N0YXRpYyB2b2lkIGFmc19yZWFwX3NlcnZlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKik7CiAKLXN0YXRpYyB2b2lkIF9fYWZzX3NlcnZlcl90aW1lb3V0KHN0cnVjdCBhZnNfdGltZXIgKnRpbWVyKQorLyogdHJlZSBvZiBhbGwgdGhlIHNlcnZlcnMsIGluZGV4ZWQgYnkgSVAgYWRkcmVzcyAqLworc3RhdGljIHN0cnVjdCByYl9yb290IGFmc19zZXJ2ZXJzID0gUkJfUk9PVDsKK3N0YXRpYyBERUZJTkVfUldMT0NLKGFmc19zZXJ2ZXJzX2xvY2spOworCisvKiBMUlUgbGlzdCBvZiBhbGwgdGhlIHNlcnZlcnMgbm90IGN1cnJlbnRseSBpbiB1c2UgKi8KK3N0YXRpYyBMSVNUX0hFQUQoYWZzX3NlcnZlcl9ncmF2ZXlhcmQpOworc3RhdGljIERFRklORV9TUElOTE9DSyhhZnNfc2VydmVyX2dyYXZleWFyZF9sb2NrKTsKK3N0YXRpYyBERUNMQVJFX0RFTEFZRURfV09SSyhhZnNfc2VydmVyX3JlYXBlciwgYWZzX3JlYXBfc2VydmVyKTsKKworLyoKKyAqIGluc3RhbGwgYSBzZXJ2ZXIgcmVjb3JkIGluIHRoZSBtYXN0ZXIgdHJlZQorICovCitzdGF0aWMgaW50IGFmc19pbnN0YWxsX3NlcnZlcihzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyKQogewotCXN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIgPQotCQlsaXN0X2VudHJ5KHRpbWVyLCBzdHJ1Y3QgYWZzX3NlcnZlciwgdGltZW91dCk7CisJc3RydWN0IGFmc19zZXJ2ZXIgKnhzZXJ2ZXI7CisJc3RydWN0IHJiX25vZGUgKipwcCwgKnA7CisJaW50IHJldDsKIAotCV9kZWJ1ZygiU0VSVkVSIFRJTUVPVVQgWyVwe3U9JWR9XSIsCi0JICAgICAgIHNlcnZlciwgYXRvbWljX3JlYWQoJnNlcnZlci0+dXNhZ2UpKTsKKwlfZW50ZXIoIiVwIiwgc2VydmVyKTsKIAotCWFmc19zZXJ2ZXJfZG9fdGltZW91dChzZXJ2ZXIpOworCXdyaXRlX2xvY2soJmFmc19zZXJ2ZXJzX2xvY2spOworCisJcmV0ID0gLUVFWElTVDsKKwlwcCA9ICZhZnNfc2VydmVycy5yYl9ub2RlOworCXAgPSBOVUxMOworCXdoaWxlICgqcHApIHsKKwkJcCA9ICpwcDsKKwkJX2RlYnVnKCItIGNvbnNpZGVyICVwIiwgcCk7CisJCXhzZXJ2ZXIgPSByYl9lbnRyeShwLCBzdHJ1Y3QgYWZzX3NlcnZlciwgbWFzdGVyX3JiKTsKKwkJaWYgKHNlcnZlci0+YWRkci5zX2FkZHIgPCB4c2VydmVyLT5hZGRyLnNfYWRkcikKKwkJCXBwID0gJigqcHApLT5yYl9sZWZ0OworCQllbHNlIGlmIChzZXJ2ZXItPmFkZHIuc19hZGRyID4geHNlcnZlci0+YWRkci5zX2FkZHIpCisJCQlwcCA9ICYoKnBwKS0+cmJfcmlnaHQ7CisJCWVsc2UKKwkJCWdvdG8gZXJyb3I7CisJfQorCisJcmJfbGlua19ub2RlKCZzZXJ2ZXItPm1hc3Rlcl9yYiwgcCwgcHApOworCXJiX2luc2VydF9jb2xvcigmc2VydmVyLT5tYXN0ZXJfcmIsICZhZnNfc2VydmVycyk7CisJcmV0ID0gMDsKKworZXJyb3I6CisJd3JpdGVfdW5sb2NrKCZhZnNfc2VydmVyc19sb2NrKTsKKwlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGFmc190aW1lcl9vcHMgYWZzX3NlcnZlcl90aW1lcl9vcHMgPSB7Ci0JLnRpbWVkX291dAk9IF9fYWZzX3NlcnZlcl90aW1lb3V0LAotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKLSAqIGxvb2t1cCBhIHNlcnZlciByZWNvcmQgaW4gYSBjZWxsCi0gKiAtIFRPRE86IHNlYXJjaCB0aGUgY2VsbCdzIHNlcnZlciBsaXN0CisgKiBhbGxvY2F0ZSBhIG5ldyBzZXJ2ZXIgcmVjb3JkCiAgKi8KLWludCBhZnNfc2VydmVyX2xvb2t1cChzdHJ1Y3QgYWZzX2NlbGwgKmNlbGwsIGNvbnN0IHN0cnVjdCBpbl9hZGRyICphZGRyLAotCQkgICAgICBzdHJ1Y3QgYWZzX3NlcnZlciAqKl9zZXJ2ZXIpCitzdGF0aWMgc3RydWN0IGFmc19zZXJ2ZXIgKmFmc19hbGxvY19zZXJ2ZXIoc3RydWN0IGFmc19jZWxsICpjZWxsLAorCQkJCQkgICBjb25zdCBzdHJ1Y3QgaW5fYWRkciAqYWRkcikKIHsKLQlzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyLCAqYWN0aXZlLCAqem9tYmllOwotCWludCBsb29wOworCXN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXI7CiAKLQlfZW50ZXIoIiVwLCUwOHgsIiwgY2VsbCwgbnRvaGwoYWRkci0+c19hZGRyKSk7CisJX2VudGVyKCIiKTsKIAotCS8qIGFsbG9jYXRlIGFuZCBpbml0aWFsaXNlIGEgc2VydmVyIHJlY29yZCAqLwogCXNlcnZlciA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhZnNfc2VydmVyKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFzZXJ2ZXIpIHsKKwlpZiAoc2VydmVyKSB7CisJCWF0b21pY19zZXQoJnNlcnZlci0+dXNhZ2UsIDEpOworCQlzZXJ2ZXItPmNlbGwgPSBjZWxsOworCisJCUlOSVRfTElTVF9IRUFEKCZzZXJ2ZXItPmxpbmspOworCQlJTklUX0xJU1RfSEVBRCgmc2VydmVyLT5ncmF2ZSk7CisJCWluaXRfcndzZW0oJnNlcnZlci0+c2VtKTsKKwkJc3Bpbl9sb2NrX2luaXQoJnNlcnZlci0+ZnNfbG9jayk7CisJCXNlcnZlci0+ZnNfdm5vZGVzID0gUkJfUk9PVDsKKwkJc2VydmVyLT5jYl9wcm9taXNlcyA9IFJCX1JPT1Q7CisJCXNwaW5fbG9ja19pbml0KCZzZXJ2ZXItPmNiX2xvY2spOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzZXJ2ZXItPmNiX2JyZWFrX3dhaXRxKTsKKwkJSU5JVF9ERUxBWUVEX1dPUksoJnNlcnZlci0+Y2JfYnJlYWtfd29yaywKKwkJCQkgIGFmc19kaXNwYXRjaF9naXZlX3VwX2NhbGxiYWNrcyk7CisKKwkJbWVtY3B5KCZzZXJ2ZXItPmFkZHIsIGFkZHIsIHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpOworCQlzZXJ2ZXItPmFkZHIuc19hZGRyID0gYWRkci0+c19hZGRyOworCX0KKworCV9sZWF2ZSgiID0gJXB7JWR9Iiwgc2VydmVyLCBhdG9taWNfcmVhZCgmc2VydmVyLT51c2FnZSkpOworCXJldHVybiBzZXJ2ZXI7Cit9CisKKy8qCisgKiBnZXQgYW4gRlMtc2VydmVyIHJlY29yZCBmb3IgYSBjZWxsCisgKi8KK3N0cnVjdCBhZnNfc2VydmVyICphZnNfbG9va3VwX3NlcnZlcihzdHJ1Y3QgYWZzX2NlbGwgKmNlbGwsCisJCQkJICAgICBjb25zdCBzdHJ1Y3QgaW5fYWRkciAqYWRkcikKK3sKKwlzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyLCAqY2FuZGlkYXRlOworCisJX2VudGVyKCIlcCwiTklQUVVBRF9GTVQsIGNlbGwsIE5JUFFVQUQoYWRkci0+c19hZGRyKSk7CisKKwkvKiBxdWljayBzY2FuIG9mIHRoZSBsaXN0IHRvIHNlZSBpZiB3ZSBhbHJlYWR5IGhhdmUgdGhlIHNlcnZlciAqLworCXJlYWRfbG9jaygmY2VsbC0+c2VydmVyc19sb2NrKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoc2VydmVyLCAmY2VsbC0+c2VydmVycywgbGluaykgeworCQlpZiAoc2VydmVyLT5hZGRyLnNfYWRkciA9PSBhZGRyLT5zX2FkZHIpCisJCQlnb3RvIGZvdW5kX3NlcnZlcl9xdWlja2x5OworCX0KKwlyZWFkX3VubG9jaygmY2VsbC0+c2VydmVyc19sb2NrKTsKKworCWNhbmRpZGF0ZSA9IGFmc19hbGxvY19zZXJ2ZXIoY2VsbCwgYWRkcik7CisJaWYgKCFjYW5kaWRhdGUpIHsKIAkJX2xlYXZlKCIgPSAtRU5PTUVNIik7Ci0JCXJldHVybiAtRU5PTUVNOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAl9CiAKLQlhdG9taWNfc2V0KCZzZXJ2ZXItPnVzYWdlLCAxKTsKKwl3cml0ZV9sb2NrKCZjZWxsLT5zZXJ2ZXJzX2xvY2spOwogCi0JSU5JVF9MSVNUX0hFQUQoJnNlcnZlci0+bGluayk7Ci0JaW5pdF9yd3NlbSgmc2VydmVyLT5zZW0pOwotCUlOSVRfTElTVF9IRUFEKCZzZXJ2ZXItPmZzX2NhbGxxKTsKLQlzcGluX2xvY2tfaW5pdCgmc2VydmVyLT5mc19sb2NrKTsKLQlJTklUX0xJU1RfSEVBRCgmc2VydmVyLT5jYl9wcm9taXNlcyk7Ci0Jc3Bpbl9sb2NrX2luaXQoJnNlcnZlci0+Y2JfbG9jayk7Ci0KLQlmb3IgKGxvb3AgPSAwOyBsb29wIDwgQUZTX1NFUlZFUl9DT05OX0xJU1RfU0laRTsgbG9vcCsrKQotCQlzZXJ2ZXItPmZzX2Nvbm5fY250W2xvb3BdID0gNDsKLQotCW1lbWNweSgmc2VydmVyLT5hZGRyLCBhZGRyLCBzaXplb2Yoc3RydWN0IGluX2FkZHIpKTsKLQlzZXJ2ZXItPmFkZHIuc19hZGRyID0gYWRkci0+c19hZGRyOwotCi0JYWZzX3RpbWVyX2luaXQoJnNlcnZlci0+dGltZW91dCwgJmFmc19zZXJ2ZXJfdGltZXJfb3BzKTsKLQotCS8qIGFkZCB0byB0aGUgY2VsbCAqLwotCXdyaXRlX2xvY2soJmNlbGwtPnN2X2xvY2spOwotCi0JLyogY2hlY2sgdGhlIGFjdGl2ZSBsaXN0ICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShhY3RpdmUsICZjZWxsLT5zdl9saXN0LCBsaW5rKSB7Ci0JCWlmIChhY3RpdmUtPmFkZHIuc19hZGRyID09IGFkZHItPnNfYWRkcikKLQkJCWdvdG8gdXNlX2FjdGl2ZV9zZXJ2ZXI7CisJLyogY2hlY2sgdGhlIGNlbGwncyBzZXJ2ZXIgbGlzdCBhZ2FpbiAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoc2VydmVyLCAmY2VsbC0+c2VydmVycywgbGluaykgeworCQlpZiAoc2VydmVyLT5hZGRyLnNfYWRkciA9PSBhZGRyLT5zX2FkZHIpCisJCQlnb3RvIGZvdW5kX3NlcnZlcjsKIAl9CiAKLQkvKiBjaGVjayB0aGUgaW5hY3RpdmUgbGlzdCAqLwotCXNwaW5fbG9jaygmY2VsbC0+c3ZfZ3lsb2NrKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHpvbWJpZSwgJmNlbGwtPnN2X2dyYXZleWFyZCwgbGluaykgewotCQlpZiAoem9tYmllLT5hZGRyLnNfYWRkciA9PSBhZGRyLT5zX2FkZHIpCi0JCQlnb3RvIHJlc3VycmVjdF9zZXJ2ZXI7Ci0JfQotCXNwaW5fdW5sb2NrKCZjZWxsLT5zdl9neWxvY2spOworCV9kZWJ1ZygibmV3Iik7CisJc2VydmVyID0gY2FuZGlkYXRlOworCWlmIChhZnNfaW5zdGFsbF9zZXJ2ZXIoc2VydmVyKSA8IDApCisJCWdvdG8gc2VydmVyX2luX3R3b19jZWxsczsKIAogCWFmc19nZXRfY2VsbChjZWxsKTsKLQlzZXJ2ZXItPmNlbGwgPSBjZWxsOwotCWxpc3RfYWRkX3RhaWwoJnNlcnZlci0+bGluaywgJmNlbGwtPnN2X2xpc3QpOworCWxpc3RfYWRkX3RhaWwoJnNlcnZlci0+bGluaywgJmNlbGwtPnNlcnZlcnMpOwogCi0Jd3JpdGVfdW5sb2NrKCZjZWxsLT5zdl9sb2NrKTsKKwl3cml0ZV91bmxvY2soJmNlbGwtPnNlcnZlcnNfbG9jayk7CisJX2xlYXZlKCIgPSAlcHslZH0iLCBzZXJ2ZXIsIGF0b21pY19yZWFkKCZzZXJ2ZXItPnVzYWdlKSk7CisJcmV0dXJuIHNlcnZlcjsKIAotCSpfc2VydmVyID0gc2VydmVyOwotCV9sZWF2ZSgiID0gMCAoJXApIiwgc2VydmVyKTsKLQlyZXR1cm4gMDsKKwkvKiBmb3VuZCBhIG1hdGNoaW5nIHNlcnZlciBxdWlja2x5ICovCitmb3VuZF9zZXJ2ZXJfcXVpY2tseToKKwlfZGVidWcoImZvdW5kIHF1aWNrbHkiKTsKKwlhZnNfZ2V0X3NlcnZlcihzZXJ2ZXIpOworCXJlYWRfdW5sb2NrKCZjZWxsLT5zZXJ2ZXJzX2xvY2spOworbm9fbG9uZ2VyX3VudXNlZDoKKwlpZiAoIWxpc3RfZW1wdHkoJnNlcnZlci0+Z3JhdmUpKSB7CisJCXNwaW5fbG9jaygmYWZzX3NlcnZlcl9ncmF2ZXlhcmRfbG9jayk7CisJCWxpc3RfZGVsX2luaXQoJnNlcnZlci0+Z3JhdmUpOworCQlzcGluX3VubG9jaygmYWZzX3NlcnZlcl9ncmF2ZXlhcmRfbG9jayk7CisJfQorCV9sZWF2ZSgiID0gJXB7JWR9Iiwgc2VydmVyLCBhdG9taWNfcmVhZCgmc2VydmVyLT51c2FnZSkpOworCXJldHVybiBzZXJ2ZXI7CiAKLQkvKiBmb3VuZCBhIG1hdGNoaW5nIGFjdGl2ZSBzZXJ2ZXIgKi8KLSB1c2VfYWN0aXZlX3NlcnZlcjoKLQlfZGVidWcoImFjdGl2ZSBzZXJ2ZXIiKTsKLQlhZnNfZ2V0X3NlcnZlcihhY3RpdmUpOwotCXdyaXRlX3VubG9jaygmY2VsbC0+c3ZfbG9jayk7CisJLyogZm91bmQgYSBtYXRjaGluZyBzZXJ2ZXIgb24gdGhlIHNlY29uZCBwYXNzICovCitmb3VuZF9zZXJ2ZXI6CisJX2RlYnVnKCJmb3VuZCIpOworCWFmc19nZXRfc2VydmVyKHNlcnZlcik7CisJd3JpdGVfdW5sb2NrKCZjZWxsLT5zZXJ2ZXJzX2xvY2spOworCWtmcmVlKGNhbmRpZGF0ZSk7CisJZ290byBub19sb25nZXJfdW51c2VkOwogCi0Ja2ZyZWUoc2VydmVyKTsKKwkvKiBmb3VuZCBhIHNlcnZlciB0aGF0IHNlZW1zIHRvIGJlIGluIHR3byBjZWxscyAqLworc2VydmVyX2luX3R3b19jZWxsczoKKwl3cml0ZV91bmxvY2soJmNlbGwtPnNlcnZlcnNfbG9jayk7CisJa2ZyZWUoY2FuZGlkYXRlKTsKKwlwcmludGsoS0VSTl9OT1RJQ0UgImtBRlM6IgorCSAgICAgICAiIFNlcnZlciAiTklQUVVBRF9GTVQiIGFwcGVhcnMgdG8gYmUgaW4gdHdvIGNlbGxzXG4iLAorCSAgICAgICBOSVBRVUFEKCphZGRyKSk7CisJX2xlYXZlKCIgPSAtRUVYSVNUIik7CisJcmV0dXJuIEVSUl9QVFIoLUVFWElTVCk7Cit9CiAKLQkqX3NlcnZlciA9IGFjdGl2ZTsKLQlfbGVhdmUoIiA9IDAgKCVwKSIsIGFjdGl2ZSk7Ci0JcmV0dXJuIDA7CisvKgorICogbG9vayB1cCBhIHNlcnZlciBieSBpdHMgSVAgYWRkcmVzcworICovCitzdHJ1Y3QgYWZzX3NlcnZlciAqYWZzX2ZpbmRfc2VydmVyKGNvbnN0IHN0cnVjdCBpbl9hZGRyICpfYWRkcikKK3sKKwlzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyID0gTlVMTDsKKwlzdHJ1Y3QgcmJfbm9kZSAqcDsKKwlzdHJ1Y3QgaW5fYWRkciBhZGRyID0gKl9hZGRyOwogCi0JLyogZm91bmQgYSBtYXRjaGluZyBzZXJ2ZXIgaW4gdGhlIGdyYXZleWFyZCwgc28gcmVzdXJyZWN0IGl0IGFuZAotCSAqIGRpc3Bvc2Ugb2YgdGhlIG5ldyByZWNvcmQgKi8KLSByZXN1cnJlY3Rfc2VydmVyOgotCV9kZWJ1ZygicmVzdXJyZWN0aW5nIHNlcnZlciIpOworCV9lbnRlcihOSVBRVUFEX0ZNVCwgTklQUVVBRChhZGRyLnNfYWRkcikpOwogCi0JbGlzdF9tb3ZlX3RhaWwoJnpvbWJpZS0+bGluaywgJmNlbGwtPnN2X2xpc3QpOwotCWFmc19nZXRfc2VydmVyKHpvbWJpZSk7Ci0JYWZzX2thZnN0aW1vZF9kZWxfdGltZXIoJnpvbWJpZS0+dGltZW91dCk7Ci0Jc3Bpbl91bmxvY2soJmNlbGwtPnN2X2d5bG9jayk7Ci0Jd3JpdGVfdW5sb2NrKCZjZWxsLT5zdl9sb2NrKTsKKwlyZWFkX2xvY2soJmFmc19zZXJ2ZXJzX2xvY2spOwogCi0Ja2ZyZWUoc2VydmVyKTsKKwlwID0gYWZzX3NlcnZlcnMucmJfbm9kZTsKKwl3aGlsZSAocCkgeworCQlzZXJ2ZXIgPSByYl9lbnRyeShwLCBzdHJ1Y3QgYWZzX3NlcnZlciwgbWFzdGVyX3JiKTsKIAotCSpfc2VydmVyID0gem9tYmllOwotCV9sZWF2ZSgiID0gMCAoJXApIiwgem9tYmllKTsKLQlyZXR1cm4gMDsKKwkJX2RlYnVnKCItIGNvbnNpZGVyICVwIiwgcCk7CiAKLX0gLyogZW5kIGFmc19zZXJ2ZXJfbG9va3VwKCkgKi8KKwkJaWYgKGFkZHIuc19hZGRyIDwgc2VydmVyLT5hZGRyLnNfYWRkcikgeworCQkJcCA9IHAtPnJiX2xlZnQ7CisJCX0gZWxzZSBpZiAoYWRkci5zX2FkZHIgPiBzZXJ2ZXItPmFkZHIuc19hZGRyKSB7CisJCQlwID0gcC0+cmJfcmlnaHQ7CisJCX0gZWxzZSB7CisJCQlhZnNfZ2V0X3NlcnZlcihzZXJ2ZXIpOworCQkJZ290byBmb3VuZDsKKwkJfQorCX0KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCXNlcnZlciA9IE5VTEw7Citmb3VuZDoKKwlyZWFkX3VubG9jaygmYWZzX3NlcnZlcnNfbG9jayk7CisJQVNTRVJUSUZDTVAoc2VydmVyLCBzZXJ2ZXItPmFkZHIuc19hZGRyLCA9PSwgYWRkci5zX2FkZHIpOworCV9sZWF2ZSgiID0gJXAiLCBzZXJ2ZXIpOworCXJldHVybiBzZXJ2ZXI7Cit9CisKIC8qCiAgKiBkZXN0cm95IGEgc2VydmVyIHJlY29yZAogICogLSByZW1vdmVzIGZyb20gdGhlIGNlbGwgbGlzdAogICovCiB2b2lkIGFmc19wdXRfc2VydmVyKHN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIpCiB7Ci0Jc3RydWN0IGFmc19jZWxsICpjZWxsOwotCiAJaWYgKCFzZXJ2ZXIpCiAJCXJldHVybjsKIAotCV9lbnRlcigiJXAiLCBzZXJ2ZXIpOworCV9lbnRlcigiJXB7JWR9Iiwgc2VydmVyLCBhdG9taWNfcmVhZCgmc2VydmVyLT51c2FnZSkpOwogCi0JY2VsbCA9IHNlcnZlci0+Y2VsbDsKKwlfZGVidWcoIlBVVCBTRVJWRVIgJWQiLCBhdG9taWNfcmVhZCgmc2VydmVyLT51c2FnZSkpOwogCi0JLyogc2FuaXR5IGNoZWNrICovCi0JQlVHX09OKGF0b21pY19yZWFkKCZzZXJ2ZXItPnVzYWdlKSA8PSAwKTsKLQotCS8qIHRvIHByZXZlbnQgYSByYWNlLCB0aGUgZGVjcmVtZW50IGFuZCB0aGUgZGVxdWV1ZSBtdXN0IGJlIGVmZmVjdGl2ZWx5Ci0JICogYXRvbWljICovCi0Jd3JpdGVfbG9jaygmY2VsbC0+c3ZfbG9jayk7CisJQVNTRVJUQ01QKGF0b21pY19yZWFkKCZzZXJ2ZXItPnVzYWdlKSwgPiwgMCk7CiAKIAlpZiAobGlrZWx5KCFhdG9taWNfZGVjX2FuZF90ZXN0KCZzZXJ2ZXItPnVzYWdlKSkpIHsKLQkJd3JpdGVfdW5sb2NrKCZjZWxsLT5zdl9sb2NrKTsKIAkJX2xlYXZlKCIiKTsKIAkJcmV0dXJuOwogCX0KIAotCXNwaW5fbG9jaygmY2VsbC0+c3ZfZ3lsb2NrKTsKLQlsaXN0X21vdmVfdGFpbCgmc2VydmVyLT5saW5rLCAmY2VsbC0+c3ZfZ3JhdmV5YXJkKTsKKwlhZnNfZmx1c2hfY2FsbGJhY2tfYnJlYWtzKHNlcnZlcik7CiAKLQkvKiB0aW1lIG91dCBpbiAxMCBzZWNzICovCi0JYWZzX2thZnN0aW1vZF9hZGRfdGltZXIoJnNlcnZlci0+dGltZW91dCwgMTAgKiBIWik7CisJc3Bpbl9sb2NrKCZhZnNfc2VydmVyX2dyYXZleWFyZF9sb2NrKTsKKwlpZiAoYXRvbWljX3JlYWQoJnNlcnZlci0+dXNhZ2UpID09IDApIHsKKwkJbGlzdF9tb3ZlX3RhaWwoJnNlcnZlci0+Z3JhdmUsICZhZnNfc2VydmVyX2dyYXZleWFyZCk7CisJCXNlcnZlci0+dGltZV9vZl9kZWF0aCA9IGdldF9zZWNvbmRzKCk7CisJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmYWZzX3NlcnZlcl9yZWFwZXIsCisJCQkJICAgICAgYWZzX3NlcnZlcl90aW1lb3V0ICogSFopOworCX0KKwlzcGluX3VubG9jaygmYWZzX3NlcnZlcl9ncmF2ZXlhcmRfbG9jayk7CisJX2xlYXZlKCIgW2RlYWRdIik7Cit9CiAKLQlzcGluX3VubG9jaygmY2VsbC0+c3ZfZ3lsb2NrKTsKLQl3cml0ZV91bmxvY2soJmNlbGwtPnN2X2xvY2spOwotCi0JX2xlYXZlKCIgW2tpbGxlZF0iKTsKLX0gLyogZW5kIGFmc19wdXRfc2VydmVyKCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKLSAqIHRpbWVvdXQgc2VydmVyIHJlY29yZAotICogLSByZW1vdmVzIGZyb20gdGhlIGNlbGwncyBncmF2ZXlhcmQgaWYgdGhlIHVzYWdlIGNvdW50IGlzIHplcm8KKyAqIGRlc3Ryb3kgYSBkZWFkIHNlcnZlcgogICovCi12b2lkIGFmc19zZXJ2ZXJfZG9fdGltZW91dChzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyKQorc3RhdGljIHZvaWQgYWZzX2Rlc3Ryb3lfc2VydmVyKHN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIpCiB7Ci0Jc3RydWN0IHJ4cnBjX3BlZXIgKnBlZXI7Ci0Jc3RydWN0IGFmc19jZWxsICpjZWxsOwotCWludCBsb29wOwotCiAJX2VudGVyKCIlcCIsIHNlcnZlcik7CiAKLQljZWxsID0gc2VydmVyLT5jZWxsOworCUFTU0VSVENNUChzZXJ2ZXItPmZzX3Zub2Rlcy5yYl9ub2RlLCA9PSwgTlVMTCk7CisJQVNTRVJUQ01QKHNlcnZlci0+Y2JfcHJvbWlzZXMucmJfbm9kZSwgPT0sIE5VTEwpOworCUFTU0VSVENNUChzZXJ2ZXItPmNiX2JyZWFrX2hlYWQsID09LCBzZXJ2ZXItPmNiX2JyZWFrX3RhaWwpOworCUFTU0VSVENNUChhdG9taWNfcmVhZCgmc2VydmVyLT5jYl9icmVha19uKSwgPT0sIDApOwogCi0JQlVHX09OKGF0b21pY19yZWFkKCZzZXJ2ZXItPnVzYWdlKSA8IDApOwotCi0JLyogcmVtb3ZlIGZyb20gZ3JhdmV5YXJkIGlmIHN0aWxsIGRlYWQgKi8KLQlzcGluX2xvY2soJmNlbGwtPnZsX2d5bG9jayk7Ci0JaWYgKGF0b21pY19yZWFkKCZzZXJ2ZXItPnVzYWdlKSA9PSAwKQotCQlsaXN0X2RlbF9pbml0KCZzZXJ2ZXItPmxpbmspOwotCWVsc2UKLQkJc2VydmVyID0gTlVMTDsKLQlzcGluX3VubG9jaygmY2VsbC0+dmxfZ3lsb2NrKTsKLQotCWlmICghc2VydmVyKSB7Ci0JCV9sZWF2ZSgiIik7Ci0JCXJldHVybjsgLyogcmVzdXJyZWN0ZWQgKi8KLQl9Ci0KLQkvKiB3ZSBjYW4gbm93IGRlc3Ryb3kgaXQgcHJvcGVybHkgKi8KLQlhZnNfcHV0X2NlbGwoY2VsbCk7Ci0KLQkvKiB1bmNyb3NzLXBvaW50IHRoZSBzdHJ1Y3RzIHVuZGVyIGEgZ2xvYmFsIGxvY2sgKi8KLQlzcGluX2xvY2soJmFmc19zZXJ2ZXJfcGVlcl9sb2NrKTsKLQlwZWVyID0gc2VydmVyLT5wZWVyOwotCWlmIChwZWVyKSB7Ci0JCXNlcnZlci0+cGVlciA9IE5VTEw7Ci0JCXBlZXItPnVzZXIgPSBOVUxMOwotCX0KLQlzcGluX3VubG9jaygmYWZzX3NlcnZlcl9wZWVyX2xvY2spOwotCi0JLyogZmluaXNoIGNsZWFuaW5nIHVwIHRoZSBzZXJ2ZXIgKi8KLQlmb3IgKGxvb3AgPSBBRlNfU0VSVkVSX0NPTk5fTElTVF9TSVpFIC0gMTsgbG9vcCA+PSAwOyBsb29wLS0pCi0JCWlmIChzZXJ2ZXItPmZzX2Nvbm5bbG9vcF0pCi0JCQlyeHJwY19wdXRfY29ubmVjdGlvbihzZXJ2ZXItPmZzX2Nvbm5bbG9vcF0pOwotCi0JaWYgKHNlcnZlci0+dmxzZXJ2ZXIpCi0JCXJ4cnBjX3B1dF9jb25uZWN0aW9uKHNlcnZlci0+dmxzZXJ2ZXIpOwotCisJYWZzX3B1dF9jZWxsKHNlcnZlci0+Y2VsbCk7CiAJa2ZyZWUoc2VydmVyKTsKK30KIAotCV9sZWF2ZSgiIFtkZXN0cm95ZWRdIik7Ci19IC8qIGVuZCBhZnNfc2VydmVyX2RvX3RpbWVvdXQoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgotICogZ2V0IGEgY2FsbHNsb3Qgb24gYSBjb25uZWN0aW9uIHRvIHRoZSBmaWxlc2VydmVyIG9uIHRoZSBzcGVjaWZpZWQgc2VydmVyCisgKiByZWFwIGRlYWQgc2VydmVyIHJlY29yZHMKICAqLwotaW50IGFmc19zZXJ2ZXJfcmVxdWVzdF9jYWxsc2xvdChzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyLAotCQkJCXN0cnVjdCBhZnNfc2VydmVyX2NhbGxzbG90ICpjYWxsc2xvdCkKK3N0YXRpYyB2b2lkIGFmc19yZWFwX3NlcnZlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IGFmc19zZXJ2ZXJfY2FsbHNsb3QgKnBjYWxsc2xvdDsKLQlzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubjsKLQlpbnQgbmNvbm4sIHJldDsKKwlMSVNUX0hFQUQoY29ycHNlcyk7CisJc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlcjsKKwl1bnNpZ25lZCBsb25nIGRlbGF5LCBleHBpcnk7CisJdGltZV90IG5vdzsKIAotCV9lbnRlcigiJXAsIixzZXJ2ZXIpOworCW5vdyA9IGdldF9zZWNvbmRzKCk7CisJc3Bpbl9sb2NrKCZhZnNfc2VydmVyX2dyYXZleWFyZF9sb2NrKTsKIAotCUlOSVRfTElTVF9IRUFEKCZjYWxsc2xvdC0+bGluayk7Ci0JY2FsbHNsb3QtPnRhc2sgPSBjdXJyZW50OwotCWNhbGxzbG90LT5jb25uID0gTlVMTDsKLQljYWxsc2xvdC0+bmNvbm4gPSAtMTsKLQljYWxsc2xvdC0+cmVhZHkgPSAwOworCXdoaWxlICghbGlzdF9lbXB0eSgmYWZzX3NlcnZlcl9ncmF2ZXlhcmQpKSB7CisJCXNlcnZlciA9IGxpc3RfZW50cnkoYWZzX3NlcnZlcl9ncmF2ZXlhcmQubmV4dCwKKwkJCQkgICAgc3RydWN0IGFmc19zZXJ2ZXIsIGdyYXZlKTsKIAotCXJldCA9IDA7Ci0JY29ubiA9IE5VTEw7Ci0KLQkvKiBnZXQgaG9sZCBvZiBhIGNhbGxzbG90IGZpcnN0ICovCi0Jc3Bpbl9sb2NrKCZzZXJ2ZXItPmZzX2xvY2spOwotCi0JLyogcmVzdXJyZWN0IHRoZSBzZXJ2ZXIgaWYgaXQncyBkZWF0aCB0aW1lb3V0IGhhcyBleHBpcmVkICovCi0JaWYgKHNlcnZlci0+ZnNfc3RhdGUpIHsKLQkJaWYgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHNlcnZlci0+ZnNfZGVhZF9qaWYpKSB7Ci0JCQlyZXQgPSBzZXJ2ZXItPmZzX3N0YXRlOwotCQkJc3Bpbl91bmxvY2soJnNlcnZlci0+ZnNfbG9jayk7Ci0JCQlfbGVhdmUoIiA9ICVkIFtzdGlsbCBkZWFkXSIsIHJldCk7Ci0JCQlyZXR1cm4gcmV0OworCQkvKiB0aGUgcXVldWUgaXMgb3JkZXJlZCBtb3N0IGRlYWQgZmlyc3QgKi8KKwkJZXhwaXJ5ID0gc2VydmVyLT50aW1lX29mX2RlYXRoICsgYWZzX3NlcnZlcl90aW1lb3V0OworCQlpZiAoZXhwaXJ5ID4gbm93KSB7CisJCQlkZWxheSA9IChleHBpcnkgLSBub3cpICogSFo7CisJCQlpZiAoIXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmYWZzX3NlcnZlcl9yZWFwZXIsIGRlbGF5KSkgeworCQkJCWNhbmNlbF9kZWxheWVkX3dvcmsoJmFmc19zZXJ2ZXJfcmVhcGVyKTsKKwkJCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmFmc19zZXJ2ZXJfcmVhcGVyLAorCQkJCQkJICAgICAgZGVsYXkpOworCQkJfQorCQkJYnJlYWs7CiAJCX0KIAotCQlzZXJ2ZXItPmZzX3N0YXRlID0gMDsKLQl9Ci0KLQkvKiB0cnkgYW5kIGZpbmQgYSBjb25uZWN0aW9uIHRoYXQgaGFzIHNwYXJlIGNhbGxzbG90cyAqLwotCWZvciAobmNvbm4gPSAwOyBuY29ubiA8IEFGU19TRVJWRVJfQ09OTl9MSVNUX1NJWkU7IG5jb25uKyspIHsKLQkJaWYgKHNlcnZlci0+ZnNfY29ubl9jbnRbbmNvbm5dID4gMCkgewotCQkJc2VydmVyLT5mc19jb25uX2NudFtuY29ubl0tLTsKLQkJCXNwaW5fdW5sb2NrKCZzZXJ2ZXItPmZzX2xvY2spOwotCQkJY2FsbHNsb3QtPm5jb25uID0gbmNvbm47Ci0JCQlnb3RvIG9idGFpbmVkX3Nsb3Q7CisJCXdyaXRlX2xvY2soJnNlcnZlci0+Y2VsbC0+c2VydmVyc19sb2NrKTsKKwkJd3JpdGVfbG9jaygmYWZzX3NlcnZlcnNfbG9jayk7CisJCWlmIChhdG9taWNfcmVhZCgmc2VydmVyLT51c2FnZSkgPiAwKSB7CisJCQlsaXN0X2RlbF9pbml0KCZzZXJ2ZXItPmdyYXZlKTsKKwkJfSBlbHNlIHsKKwkJCWxpc3RfbW92ZV90YWlsKCZzZXJ2ZXItPmdyYXZlLCAmY29ycHNlcyk7CisJCQlsaXN0X2RlbF9pbml0KCZzZXJ2ZXItPmxpbmspOworCQkJcmJfZXJhc2UoJnNlcnZlci0+bWFzdGVyX3JiLCAmYWZzX3NlcnZlcnMpOwogCQl9CisJCXdyaXRlX3VubG9jaygmYWZzX3NlcnZlcnNfbG9jayk7CisJCXdyaXRlX3VubG9jaygmc2VydmVyLT5jZWxsLT5zZXJ2ZXJzX2xvY2spOwogCX0KIAotCS8qIG5vbmUgd2VyZSBhdmFpbGFibGUgLSB3YWl0IGludGVycnVwdGlibHkgZm9yIG9uZSB0byBiZWNvbWUKLQkgKiBhdmFpbGFibGUgKi8KLQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCWxpc3RfYWRkX3RhaWwoJmNhbGxzbG90LT5saW5rLCAmc2VydmVyLT5mc19jYWxscSk7Ci0Jc3Bpbl91bmxvY2soJnNlcnZlci0+ZnNfbG9jayk7CisJc3Bpbl91bmxvY2soJmFmc19zZXJ2ZXJfZ3JhdmV5YXJkX2xvY2spOwogCi0Jd2hpbGUgKCFjYWxsc2xvdC0+cmVhZHkgJiYgIXNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7Ci0JCXNjaGVkdWxlKCk7Ci0JCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJLyogbm93IHJlYXAgdGhlIGNvcnBzZXMgd2UndmUgZXh0cmFjdGVkICovCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZjb3Jwc2VzKSkgeworCQlzZXJ2ZXIgPSBsaXN0X2VudHJ5KGNvcnBzZXMubmV4dCwgc3RydWN0IGFmc19zZXJ2ZXIsIGdyYXZlKTsKKwkJbGlzdF9kZWwoJnNlcnZlci0+Z3JhdmUpOworCQlhZnNfZGVzdHJveV9zZXJ2ZXIoc2VydmVyKTsKIAl9Cit9CiAKLQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwotCi0JLyogZXZlbiBpZiB3ZSB3ZXJlIGludGVycnVwdGVkIHdlIG1heSBzdGlsbCBiZSBxdWV1ZWQgKi8KLQlpZiAoIWNhbGxzbG90LT5yZWFkeSkgewotCQlzcGluX2xvY2soJnNlcnZlci0+ZnNfbG9jayk7Ci0JCWxpc3RfZGVsX2luaXQoJmNhbGxzbG90LT5saW5rKTsKLQkJc3Bpbl91bmxvY2soJnNlcnZlci0+ZnNfbG9jayk7Ci0JfQotCi0JbmNvbm4gPSBjYWxsc2xvdC0+bmNvbm47Ci0KLQkvKiBpZiBpbnRlcnJ1cHRlZCwgd2UgbXVzdCByZWxlYXNlIGFueSBzbG90IHdlIGFsc28gZ290IGJlZm9yZQotCSAqIHJldHVybmluZyBhbiBlcnJvciAqLwotCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgewotCQlyZXQgPSAtRUlOVFI7Ci0JCWdvdG8gZXJyb3JfcmVsZWFzZTsKLQl9Ci0KLQkvKiBpZiB3ZSB3ZXJlIHdva2VuIHVwIHdpdGggYW4gZXJyb3IsIHRoZW4gcGFzcyB0aGF0IGVycm9yIGJhY2sgdG8gdGhlCi0JICogY2FsbGVkICovCi0JaWYgKG5jb25uIDwgMCkgewotCQlfbGVhdmUoIiA9ICVkIiwgY2FsbHNsb3QtPmVycm5vKTsKLQkJcmV0dXJuIGNhbGxzbG90LT5lcnJubzsKLQl9Ci0KLQkvKiB3ZXJlIHdlIGdpdmVuIGEgY29ubmVjdGlvbiBkaXJlY3RseT8gKi8KLQlpZiAoY2FsbHNsb3QtPmNvbm4pIHsKLQkJLyogeWVzIC0gdXNlIGl0ICovCi0JCV9sZWF2ZSgiID0gMCAobmM9JWQpIiwgbmNvbm4pOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKiBnb3QgYSBjYWxsc2xvdCwgYnV0IG5vIGNvbm5lY3Rpb24gKi8KLSBvYnRhaW5lZF9zbG90OgotCi0JLyogbmVlZCB0byBnZXQgaG9sZCBvZiB0aGUgUnhSUEMgY29ubmVjdGlvbiAqLwotCWRvd25fd3JpdGUoJnNlcnZlci0+c2VtKTsKLQotCS8qIHF1aWNrIGNoZWNrIHRvIHNlZSBpZiB0aGVyZSdzIGFuIG91dHN0YW5kaW5nIGVycm9yICovCi0JcmV0ID0gc2VydmVyLT5mc19zdGF0ZTsKLQlpZiAocmV0KQotCQlnb3RvIGVycm9yX3JlbGVhc2VfdXB3OwotCi0JaWYgKHNlcnZlci0+ZnNfY29ubltuY29ubl0pIHsKLQkJLyogcmV1c2UgYW4gZXhpc3RpbmcgY29ubmVjdGlvbiAqLwotCQlyeHJwY19nZXRfY29ubmVjdGlvbihzZXJ2ZXItPmZzX2Nvbm5bbmNvbm5dKTsKLQkJY2FsbHNsb3QtPmNvbm4gPSBzZXJ2ZXItPmZzX2Nvbm5bbmNvbm5dOwotCX0KLQllbHNlIHsKLQkJLyogY3JlYXRlIGEgbmV3IGNvbm5lY3Rpb24gKi8KLQkJcmV0ID0gcnhycGNfY3JlYXRlX2Nvbm5lY3Rpb24oYWZzX3RyYW5zcG9ydCwKLQkJCQkJICAgICAgaHRvbnMoNzAwMCksCi0JCQkJCSAgICAgIHNlcnZlci0+YWRkci5zX2FkZHIsCi0JCQkJCSAgICAgIEZTX1NFUlZJQ0VfSUQsCi0JCQkJCSAgICAgIE5VTEwsCi0JCQkJCSAgICAgICZzZXJ2ZXItPmZzX2Nvbm5bbmNvbm5dKTsKLQotCQlpZiAocmV0IDwgMCkKLQkJCWdvdG8gZXJyb3JfcmVsZWFzZV91cHc7Ci0KLQkJY2FsbHNsb3QtPmNvbm4gPSBzZXJ2ZXItPmZzX2Nvbm5bMF07Ci0JCXJ4cnBjX2dldF9jb25uZWN0aW9uKGNhbGxzbG90LT5jb25uKTsKLQl9Ci0KLQl1cF93cml0ZSgmc2VydmVyLT5zZW0pOwotCi0gCV9sZWF2ZSgiID0gMCIpOwotCXJldHVybiAwOwotCi0JLyogaGFuZGxlIGFuIGVycm9yIG9jY3VycmluZyAqLwotIGVycm9yX3JlbGVhc2VfdXB3OgotCXVwX3dyaXRlKCZzZXJ2ZXItPnNlbSk7Ci0KLSBlcnJvcl9yZWxlYXNlOgotCS8qIGVpdGhlciByZWxlYXNlIHRoZSBjYWxsc2xvdCBvciBwYXNzIGl0IGFsb25nIHRvIGFub3RoZXIgZGVzZXJ2aW5nCi0JICogdGFzayAqLwotCXNwaW5fbG9jaygmc2VydmVyLT5mc19sb2NrKTsKLQotCWlmIChuY29ubiA8IDApIHsKLQkJLyogbm8gY2FsbHNsb3QgYWxsb2NhdGVkICovCi0JfQotCWVsc2UgaWYgKGxpc3RfZW1wdHkoJnNlcnZlci0+ZnNfY2FsbHEpKSB7Ci0JCS8qIG5vIG9uZSB3YWl0aW5nICovCi0JCXNlcnZlci0+ZnNfY29ubl9jbnRbbmNvbm5dKys7Ci0JCXNwaW5fdW5sb2NrKCZzZXJ2ZXItPmZzX2xvY2spOwotCX0KLQllbHNlIHsKLQkJLyogc29tZW9uZSdzIHdhaXRpbmcgLSBkZXF1ZXVlIHRoZW0gYW5kIHdha2UgdGhlbSB1cCAqLwotCQlwY2FsbHNsb3QgPSBsaXN0X2VudHJ5KHNlcnZlci0+ZnNfY2FsbHEubmV4dCwKLQkJCQkgICAgICAgc3RydWN0IGFmc19zZXJ2ZXJfY2FsbHNsb3QsIGxpbmspOwotCQlsaXN0X2RlbF9pbml0KCZwY2FsbHNsb3QtPmxpbmspOwotCi0JCXBjYWxsc2xvdC0+ZXJybm8gPSBzZXJ2ZXItPmZzX3N0YXRlOwotCQlpZiAoIXBjYWxsc2xvdC0+ZXJybm8pIHsKLQkJCS8qIHBhc3MgdGhlbSBvdXQgY2FsbHNsb3QgZGV0YWlscyAqLwotCQkJY2FsbHNsb3QtPmNvbm4gPSB4Y2hnKCZwY2FsbHNsb3QtPmNvbm4sCi0JCQkJCSAgICAgIGNhbGxzbG90LT5jb25uKTsKLQkJCXBjYWxsc2xvdC0+bmNvbm4gPSBuY29ubjsKLQkJCWNhbGxzbG90LT5uY29ubiA9IG5jb25uID0gLTE7Ci0JCX0KLQkJcGNhbGxzbG90LT5yZWFkeSA9IDE7Ci0JCXdha2VfdXBfcHJvY2VzcyhwY2FsbHNsb3QtPnRhc2spOwotCQlzcGluX3VubG9jaygmc2VydmVyLT5mc19sb2NrKTsKLQl9Ci0KLQlyeHJwY19wdXRfY29ubmVjdGlvbihjYWxsc2xvdC0+Y29ubik7Ci0JY2FsbHNsb3QtPmNvbm4gPSBOVUxMOwotCi0JX2xlYXZlKCIgPSAlZCIsIHJldCk7Ci0JcmV0dXJuIHJldDsKLQotfSAvKiBlbmQgYWZzX3NlcnZlcl9yZXF1ZXN0X2NhbGxzbG90KCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKLSAqIHJlbGVhc2UgYSBjYWxsc2xvdCBiYWNrIHRvIHRoZSBzZXJ2ZXIKLSAqIC0gdHJhbnNmZXJzIHRoZSBSeFJQQyBjb25uZWN0aW9uIHRvIHRoZSBuZXh0IHBlbmRpbmcgY2FsbHNsb3QgaWYgcG9zc2libGUKKyAqIGRpc2NhcmQgYWxsIHRoZSBzZXJ2ZXIgcmVjb3JkcyBmb3Igcm1tb2QKICAqLwotdm9pZCBhZnNfc2VydmVyX3JlbGVhc2VfY2FsbHNsb3Qoc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlciwKLQkJCQkgc3RydWN0IGFmc19zZXJ2ZXJfY2FsbHNsb3QgKmNhbGxzbG90KQordm9pZCBfX2V4aXQgYWZzX3B1cmdlX3NlcnZlcnModm9pZCkKIHsKLQlzdHJ1Y3QgYWZzX3NlcnZlcl9jYWxsc2xvdCAqcGNhbGxzbG90OwotCi0JX2VudGVyKCJ7YWQ9JTA4eCxjbnQ9JXV9LHslZH0iLAotCSAgICAgICBudG9obChzZXJ2ZXItPmFkZHIuc19hZGRyKSwKLQkgICAgICAgc2VydmVyLT5mc19jb25uX2NudFtjYWxsc2xvdC0+bmNvbm5dLAotCSAgICAgICBjYWxsc2xvdC0+bmNvbm4pOwotCi0JQlVHX09OKGNhbGxzbG90LT5uY29ubiA8IDApOwotCi0Jc3Bpbl9sb2NrKCZzZXJ2ZXItPmZzX2xvY2spOwotCi0JaWYgKGxpc3RfZW1wdHkoJnNlcnZlci0+ZnNfY2FsbHEpKSB7Ci0JCS8qIG5vIG9uZSB3YWl0aW5nICovCi0JCXNlcnZlci0+ZnNfY29ubl9jbnRbY2FsbHNsb3QtPm5jb25uXSsrOwotCQlzcGluX3VubG9jaygmc2VydmVyLT5mc19sb2NrKTsKLQl9Ci0JZWxzZSB7Ci0JCS8qIHNvbWVvbmUncyB3YWl0aW5nIC0gZGVxdWV1ZSB0aGVtIGFuZCB3YWtlIHRoZW0gdXAgKi8KLQkJcGNhbGxzbG90ID0gbGlzdF9lbnRyeShzZXJ2ZXItPmZzX2NhbGxxLm5leHQsCi0JCQkJICAgICAgIHN0cnVjdCBhZnNfc2VydmVyX2NhbGxzbG90LCBsaW5rKTsKLQkJbGlzdF9kZWxfaW5pdCgmcGNhbGxzbG90LT5saW5rKTsKLQotCQlwY2FsbHNsb3QtPmVycm5vID0gc2VydmVyLT5mc19zdGF0ZTsKLQkJaWYgKCFwY2FsbHNsb3QtPmVycm5vKSB7Ci0JCQkvKiBwYXNzIHRoZW0gb3V0IGNhbGxzbG90IGRldGFpbHMgKi8KLQkJCWNhbGxzbG90LT5jb25uID0geGNoZygmcGNhbGxzbG90LT5jb25uLCBjYWxsc2xvdC0+Y29ubik7Ci0JCQlwY2FsbHNsb3QtPm5jb25uID0gY2FsbHNsb3QtPm5jb25uOwotCQkJY2FsbHNsb3QtPm5jb25uID0gLTE7Ci0JCX0KLQotCQlwY2FsbHNsb3QtPnJlYWR5ID0gMTsKLQkJd2FrZV91cF9wcm9jZXNzKHBjYWxsc2xvdC0+dGFzayk7Ci0JCXNwaW5fdW5sb2NrKCZzZXJ2ZXItPmZzX2xvY2spOwotCX0KLQotCXJ4cnBjX3B1dF9jb25uZWN0aW9uKGNhbGxzbG90LT5jb25uKTsKLQotCV9sZWF2ZSgiIik7Ci19IC8qIGVuZCBhZnNfc2VydmVyX3JlbGVhc2VfY2FsbHNsb3QoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogZ2V0IGEgaGFuZGxlIHRvIGEgY29ubmVjdGlvbiB0byB0aGUgdmxzZXJ2ZXIgKHZvbHVtZSBsb2NhdGlvbikgb24gdGhlCi0gKiBzcGVjaWZpZWQgc2VydmVyCi0gKi8KLWludCBhZnNfc2VydmVyX2dldF92bGNvbm4oc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlciwKLQkJCSAgc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKipfY29ubikKLXsKLQlzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubjsKLQlpbnQgcmV0OwotCi0JX2VudGVyKCIlcCwiLCBzZXJ2ZXIpOwotCi0JcmV0ID0gMDsKLQljb25uID0gTlVMTDsKLQlkb3duX3JlYWQoJnNlcnZlci0+c2VtKTsKLQotCWlmIChzZXJ2ZXItPnZsc2VydmVyKSB7Ci0JCS8qIHJldXNlIGFuIGV4aXN0aW5nIGNvbm5lY3Rpb24gKi8KLQkJcnhycGNfZ2V0X2Nvbm5lY3Rpb24oc2VydmVyLT52bHNlcnZlcik7Ci0JCWNvbm4gPSBzZXJ2ZXItPnZsc2VydmVyOwotCQl1cF9yZWFkKCZzZXJ2ZXItPnNlbSk7Ci0JfQotCWVsc2UgewotCQkvKiBjcmVhdGUgYSBuZXcgY29ubmVjdGlvbiAqLwotCQl1cF9yZWFkKCZzZXJ2ZXItPnNlbSk7Ci0JCWRvd25fd3JpdGUoJnNlcnZlci0+c2VtKTsKLQkJaWYgKCFzZXJ2ZXItPnZsc2VydmVyKSB7Ci0JCQlyZXQgPSByeHJwY19jcmVhdGVfY29ubmVjdGlvbihhZnNfdHJhbnNwb3J0LAotCQkJCQkJICAgICAgaHRvbnMoNzAwMyksCi0JCQkJCQkgICAgICBzZXJ2ZXItPmFkZHIuc19hZGRyLAotCQkJCQkJICAgICAgVkxfU0VSVklDRV9JRCwKLQkJCQkJCSAgICAgIE5VTEwsCi0JCQkJCQkgICAgICAmc2VydmVyLT52bHNlcnZlcik7Ci0JCX0KLQkJaWYgKHJldCA9PSAwKSB7Ci0JCQlyeHJwY19nZXRfY29ubmVjdGlvbihzZXJ2ZXItPnZsc2VydmVyKTsKLQkJCWNvbm4gPSBzZXJ2ZXItPnZsc2VydmVyOwotCQl9Ci0JCXVwX3dyaXRlKCZzZXJ2ZXItPnNlbSk7Ci0JfQotCi0JKl9jb25uID0gY29ubjsKLQlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKLQlyZXR1cm4gcmV0OwotfSAvKiBlbmQgYWZzX3NlcnZlcl9nZXRfdmxjb25uKCkgKi8KKwlhZnNfc2VydmVyX3RpbWVvdXQgPSAwOworCWNhbmNlbF9kZWxheWVkX3dvcmsoJmFmc19zZXJ2ZXJfcmVhcGVyKTsKKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmFmc19zZXJ2ZXJfcmVhcGVyLCAwKTsKK30KZGlmZiAtLWdpdCBhL2ZzL2Fmcy9zZXJ2ZXIuaCBiL2ZzL2Fmcy9zZXJ2ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNkMjQxMS4uMDAwMDAwMAotLS0gYS9mcy9hZnMvc2VydmVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyogc2VydmVyLmg6IEFGUyBzZXJ2ZXIgcmVjb3JkCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi0KLSNpZm5kZWYgX0xJTlVYX0FGU19TRVJWRVJfSAotI2RlZmluZSBfTElOVVhfQUZTX1NFUlZFUl9ICi0KLSNpbmNsdWRlICJ0eXBlcy5oIgotI2luY2x1ZGUgImthZnN0aW1vZC5oIgotI2luY2x1ZGUgPHJ4cnBjL3BlZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9yd3NlbS5oPgotCi1leHRlcm4gc3BpbmxvY2tfdCBhZnNfc2VydmVyX3BlZXJfbG9jazsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIEFGUyBzZXJ2ZXIgcmVjb3JkCi0gKi8KLXN0cnVjdCBhZnNfc2VydmVyCi17Ci0JYXRvbWljX3QJCXVzYWdlOwotCXN0cnVjdCBhZnNfY2VsbAkJKmNlbGw7CQkvKiBjZWxsIGluIHdoaWNoIHNlcnZlciByZXNpZGVzICovCi0Jc3RydWN0IGxpc3RfaGVhZAlsaW5rOwkJLyogbGluayBpbiBjZWxsJ3Mgc2VydmVyIGxpc3QgKi8KLQlzdHJ1Y3Qgcndfc2VtYXBob3JlCXNlbTsJCS8qIGFjY2VzcyBsb2NrICovCi0Jc3RydWN0IGFmc190aW1lcgl0aW1lb3V0OwkvKiBncmF2ZXlhcmQgdGltZW91dCAqLwotCXN0cnVjdCBpbl9hZGRyCQlhZGRyOwkJLyogc2VydmVyIGFkZHJlc3MgKi8KLQlzdHJ1Y3QgcnhycGNfcGVlcgkqcGVlcjsJCS8qIHBlZXIgcmVjb3JkIGZvciB0aGlzIHNlcnZlciAqLwotCXN0cnVjdCByeHJwY19jb25uZWN0aW9uCSp2bHNlcnZlcjsJLyogY29ubmVjdGlvbiB0byB0aGUgdm9sdW1lIGxvY2F0aW9uIHNlcnZpY2UgKi8KLQotCS8qIGZpbGUgc2VydmljZSBhY2Nlc3MgKi8KLSNkZWZpbmUgQUZTX1NFUlZFUl9DT05OX0xJU1RfU0laRSAyCi0Jc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24JKmZzX2Nvbm5bQUZTX1NFUlZFUl9DT05OX0xJU1RfU0laRV07IC8qIEZTIGNvbm5lY3Rpb25zICovCi0JdW5zaWduZWQJCWZzX2Nvbm5fY250W0FGU19TRVJWRVJfQ09OTl9MSVNUX1NJWkVdOwkvKiBwZXIgY29ubiBjYWxsIGNvdW50ICovCi0Jc3RydWN0IGxpc3RfaGVhZAlmc19jYWxscTsJLyogcXVldWUgb2YgcHJvY2Vzc2VzIHdhaXRpbmcgdG8gbWFrZSBhIGNhbGwgKi8KLQlzcGlubG9ja190CQlmc19sb2NrOwkvKiBhY2Nlc3MgbG9jayAqLwotCWludAkJCWZzX3N0YXRlOyAgICAgIAkvKiAwIG9yIHJlYXNvbiBGUyBjdXJyZW50bHkgbWFya2VkIGRlYWQgKC1lcnJubykgKi8KLQl1bnNpZ25lZAkJZnNfcnR0OwkJLyogRlMgcm91bmQgdHJpcCB0aW1lICovCi0JdW5zaWduZWQgbG9uZwkJZnNfYWN0X2ppZjsJLyogdGltZSBhdCB3aGljaCBsYXN0IGFjdGl2aXR5IG9jY3VycmVkICovCi0JdW5zaWduZWQgbG9uZwkJZnNfZGVhZF9qaWY7CS8qIHRpbWUgYXQgd2hpY2ggbm8gbG9uZ2VyIHRvIGJlIGNvbnNpZGVyZWQgZGVhZCAqLwotCi0JLyogY2FsbGJhY2sgcHJvbWlzZSBtYW5hZ2VtZW50ICovCi0Jc3RydWN0IGxpc3RfaGVhZAljYl9wcm9taXNlczsJLyogYXMgeWV0IHVuYnJva2VuIHByb21pc2VzIGZyb20gdGhpcyBzZXJ2ZXIgKi8KLQlzcGlubG9ja190CQljYl9sb2NrOwkvKiBhY2Nlc3MgbG9jayAqLwotfTsKLQotZXh0ZXJuIGludCBhZnNfc2VydmVyX2xvb2t1cChzdHJ1Y3QgYWZzX2NlbGwgKmNlbGwsCi0JCQkgICAgIGNvbnN0IHN0cnVjdCBpbl9hZGRyICphZGRyLAotCQkJICAgICBzdHJ1Y3QgYWZzX3NlcnZlciAqKl9zZXJ2ZXIpOwotCi0jZGVmaW5lIGFmc19nZXRfc2VydmVyKFMpIGRvIHsgYXRvbWljX2luYygmKFMpLT51c2FnZSk7IH0gd2hpbGUoMCkKLQotZXh0ZXJuIHZvaWQgYWZzX3B1dF9zZXJ2ZXIoc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlcik7Ci1leHRlcm4gdm9pZCBhZnNfc2VydmVyX2RvX3RpbWVvdXQoc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlcik7Ci0KLWV4dGVybiBpbnQgYWZzX3NlcnZlcl9maW5kX2J5X3BlZXIoY29uc3Qgc3RydWN0IHJ4cnBjX3BlZXIgKnBlZXIsCi0JCQkJICAgc3RydWN0IGFmc19zZXJ2ZXIgKipfc2VydmVyKTsKLQotZXh0ZXJuIGludCBhZnNfc2VydmVyX2dldF92bGNvbm4oc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlciwKLQkJCQkgc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKipfY29ubik7Ci0KLXN0YXRpYyBpbmxpbmUKLXN0cnVjdCBhZnNfc2VydmVyICphZnNfc2VydmVyX2dldF9mcm9tX3BlZXIoc3RydWN0IHJ4cnBjX3BlZXIgKnBlZXIpCi17Ci0Jc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlcjsKLQotCXNwaW5fbG9jaygmYWZzX3NlcnZlcl9wZWVyX2xvY2spOwotCXNlcnZlciA9IHBlZXItPnVzZXI7Ci0JaWYgKHNlcnZlcikKLQkJYWZzX2dldF9zZXJ2ZXIoc2VydmVyKTsKLQlzcGluX3VubG9jaygmYWZzX3NlcnZlcl9wZWVyX2xvY2spOwotCi0JcmV0dXJuIHNlcnZlcjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIEFGUyBzZXJ2ZXIgY2FsbHNsb3QgZ3JhbnQgcmVjb3JkCi0gKi8KLXN0cnVjdCBhZnNfc2VydmVyX2NhbGxzbG90Ci17Ci0Jc3RydWN0IGxpc3RfaGVhZAlsaW5rOwkJLyogbGluayBpbiBzZXJ2ZXIncyBsaXN0ICovCi0Jc3RydWN0IHRhc2tfc3RydWN0CSp0YXNrOwkJLyogcHJvY2VzcyB3YWl0aW5nIHRvIG1ha2UgY2FsbCAqLwotCXN0cnVjdCByeHJwY19jb25uZWN0aW9uCSpjb25uOwkJLyogY29ubmVjdGlvbiB0byB1c2UgKG9yIE5VTEwgb24gZXJyb3IpICovCi0Jc2hvcnQJCQluY29ubjsJCS8qIGNvbm5lY3Rpb24gc2xvdCBudW1iZXIgKC0xIG9uIGVycm9yKSAqLwotCWNoYXIJCQlyZWFkeTsJCS8qIFQgd2hlbiByZWFkeSAqLwotCWludAkJCWVycm5vOwkJLyogZXJyb3IgbnVtYmVyIGlmIG5jb25uPT0tMSAqLwotfTsKLQotZXh0ZXJuIGludCBhZnNfc2VydmVyX3JlcXVlc3RfY2FsbHNsb3Qoc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlciwKLQkJCQkgICAgICAgc3RydWN0IGFmc19zZXJ2ZXJfY2FsbHNsb3QgKmNhbGxzbG90KTsKLQotZXh0ZXJuIHZvaWQgYWZzX3NlcnZlcl9yZWxlYXNlX2NhbGxzbG90KHN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIsCi0JCQkJCXN0cnVjdCBhZnNfc2VydmVyX2NhbGxzbG90ICpjYWxsc2xvdCk7Ci0KLSNlbmRpZiAvKiBfTElOVVhfQUZTX1NFUlZFUl9IICovCmRpZmYgLS1naXQgYS9mcy9hZnMvc3VwZXIuYyBiL2ZzL2Fmcy9zdXBlci5jCmluZGV4IGViN2UzMjMuLmNlYmQwM2MgMTAwNjQ0Ci0tLSBhL2ZzL2Fmcy9zdXBlci5jCisrKyBiL2ZzL2Fmcy9zdXBlci5jCkBAIC0xLDUgKzEsNiBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMiBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvKiBBRlMgc3VwZXJibG9jayBoYW5kbGluZworICoKKyAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgZnJlZWx5IHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQogICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCkBAIC05LDcgKzEwLDcgQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogICoKICAqIEF1dGhvcnM6IERhdmlkIEhvd2VsbHMgPGRob3dlbGxzQHJlZGhhdC5jb20+Ci0gKiAgICAgICAgICBEYXZpZCBXb29kaG91c2UgPGR3bXcyQGNhbWJyaWRnZS5yZWRoYXQuY29tPgorICogICAgICAgICAgRGF2aWQgV29vZGhvdXNlIDxkd213MkByZWRoYXQuY29tPgogICoKICAqLwogCkBAIC0xOSwyMiArMjAsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+Ci0jaW5jbHVkZSAidm5vZGUuaCIKLSNpbmNsdWRlICJ2b2x1bWUuaCIKLSNpbmNsdWRlICJjZWxsLmgiCi0jaW5jbHVkZSAiY21zZXJ2aWNlLmgiCi0jaW5jbHVkZSAiZnNjbGllbnQuaCIKLSNpbmNsdWRlICJzdXBlci5oIgogI2luY2x1ZGUgImludGVybmFsLmgiCiAKICNkZWZpbmUgQUZTX0ZTX01BR0lDIDB4NkI0MTQ2NTMgLyogJ2tBRlMnICovCiAKLXN0cnVjdCBhZnNfbW91bnRfcGFyYW1zIHsKLQlpbnQJCQlyd3BhdGg7Ci0Jc3RydWN0IGFmc19jZWxsCQkqZGVmYXVsdF9jZWxsOwotCXN0cnVjdCBhZnNfdm9sdW1lCSp2b2x1bWU7Ci19OwotCiBzdGF0aWMgdm9pZCBhZnNfaV9pbml0X29uY2Uodm9pZCAqZm9vLCBzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwLAogCQkJICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOwogCkBAIC02MiwxMyArNTEsMTMgQEAKIAkuZHJvcF9pbm9kZQk9IGdlbmVyaWNfZGVsZXRlX2lub2RlLAogCS5kZXN0cm95X2lub2RlCT0gYWZzX2Rlc3Ryb3lfaW5vZGUsCiAJLmNsZWFyX2lub2RlCT0gYWZzX2NsZWFyX2lub2RlLAorCS51bW91bnRfYmVnaW4JPSBhZnNfdW1vdW50X2JlZ2luLAogCS5wdXRfc3VwZXIJPSBhZnNfcHV0X3N1cGVyLAogfTsKIAogc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICphZnNfaW5vZGVfY2FjaGVwOwogc3RhdGljIGF0b21pY190IGFmc19jb3VudF9hY3RpdmVfaW5vZGVzOwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICogaW5pdGlhbGlzZSB0aGUgZmlsZXN5c3RlbQogICovCkBAIC03OCw4ICs2Nyw2IEBACiAKIAlfZW50ZXIoIiIpOwogCi0JYWZzX3RpbWVyX2luaXQoJmFmc19tbnRwdF9leHBpcnlfdGltZXIsICZhZnNfbW50cHRfZXhwaXJ5X3RpbWVyX29wcyk7Ci0KIAkvKiBjcmVhdGUgb3Vyc2VsdmVzIGFuIGlub2RlIGNhY2hlICovCiAJYXRvbWljX3NldCgmYWZzX2NvdW50X2FjdGl2ZV9pbm9kZXMsIDApOwogCkBAIC05OSwyMCArODYsMjIgQEAKIAlyZXQgPSByZWdpc3Rlcl9maWxlc3lzdGVtKCZhZnNfZnNfdHlwZSk7CiAJaWYgKHJldCA8IDApIHsKIAkJa21lbV9jYWNoZV9kZXN0cm95KGFmc19pbm9kZV9jYWNoZXApOwotCQlrbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwkJX2xlYXZlKCIgPSAlZCIsIHJldCk7CiAJCXJldHVybiByZXQ7CiAJfQogCi0Ja2xlYXZlKCIgPSAwIik7CisJX2xlYXZlKCIgPSAwIik7CiAJcmV0dXJuIDA7Ci19IC8qIGVuZCBhZnNfZnNfaW5pdCgpICovCit9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCiAgKiBjbGVhbiB1cCB0aGUgZmlsZXN5c3RlbQogICovCiB2b2lkIF9fZXhpdCBhZnNfZnNfZXhpdCh2b2lkKQogeworCV9lbnRlcigiIik7CisKKwlhZnNfbW50cHRfa2lsbF90aW1lcigpOwogCXVucmVnaXN0ZXJfZmlsZXN5c3RlbSgmYWZzX2ZzX3R5cGUpOwogCiAJaWYgKGF0b21pY19yZWFkKCZhZnNfY291bnRfYWN0aXZlX2lub2RlcykgIT0gMCkgewpAQCAtMTIyLDEwICsxMTEsOSBAQAogCX0KIAogCWttZW1fY2FjaGVfZGVzdHJveShhZnNfaW5vZGVfY2FjaGVwKTsKKwlfbGVhdmUoIiIpOworfQogCi19IC8qIGVuZCBhZnNfZnNfZXhpdCgpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCiAgKiBjaGVjayB0aGF0IGFuIGFyZ3VtZW50IGhhcyBhIHZhbHVlCiAgKi8KQEAgLTEzNiw5ICsxMjQsOCBAQAogCQlyZXR1cm4gMDsKIAl9CiAJcmV0dXJuIDE7Ci19IC8qIGVuZCB3YW50X2FyZygpICovCit9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCiAgKiBjaGVjayB0aGF0IHRoZXJlJ3Mgbm8gc3Vic2VxdWVudCB2YWx1ZQogICovCkBAIC0xNTAsMTggKzEzNywxNyBAQAogCQlyZXR1cm4gMDsKIAl9CiAJcmV0dXJuIDE7Ci19IC8qIGVuZCB3YW50X25vX3ZhbHVlKCkgKi8KK30KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAqIHBhcnNlIHRoZSBtb3VudCBvcHRpb25zCiAgKiAtIHRoaXMgZnVuY3Rpb24gaGFzIGJlZW4gc2hhbWVsZXNzbHkgYWRhcHRlZCBmcm9tIHRoZSBleHQzIGZzIHdoaWNoCiAgKiAgIHNoYW1lbGVzc2x5IGFkYXB0ZWQgaXQgZnJvbSB0aGUgbXNkb3MgZnMKICAqLwotc3RhdGljIGludCBhZnNfc3VwZXJfcGFyc2Vfb3B0aW9ucyhzdHJ1Y3QgYWZzX21vdW50X3BhcmFtcyAqcGFyYW1zLAotCQkJCSAgIGNoYXIgKm9wdGlvbnMsCi0JCQkJICAgY29uc3QgY2hhciAqKmRldm5hbWUpCitzdGF0aWMgaW50IGFmc19wYXJzZV9vcHRpb25zKHN0cnVjdCBhZnNfbW91bnRfcGFyYW1zICpwYXJhbXMsCisJCQkgICAgIGNoYXIgKm9wdGlvbnMsIGNvbnN0IGNoYXIgKipkZXZuYW1lKQogeworCXN0cnVjdCBhZnNfY2VsbCAqY2VsbDsKIAljaGFyICprZXksICp2YWx1ZTsKIAlpbnQgcmV0OwogCkBAIC0xNzAsNTEgKzE1NiwxMzUgQEAKIAlvcHRpb25zW1BBR0VfU0laRSAtIDFdID0gMDsKIAogCXJldCA9IDA7Ci0Jd2hpbGUgKChrZXkgPSBzdHJzZXAoJm9wdGlvbnMsICIsIikpICE9IDApCi0JeworCXdoaWxlICgoa2V5ID0gc3Ryc2VwKCZvcHRpb25zLCAiLCIpKSkgewogCQl2YWx1ZSA9IHN0cmNocihrZXksICc9Jyk7CiAJCWlmICh2YWx1ZSkKIAkJCSp2YWx1ZSsrID0gMDsKIAotCQlwcmludGsoImtBRlM6IEtFWTogJXMsIFZBTDolc1xuIiwga2V5LCB2YWx1ZSA/OiAiLSIpOworCQlfZGVidWcoImtBRlM6IEtFWTogJXMsIFZBTDolcyIsIGtleSwgdmFsdWUgPzogIi0iKTsKIAogCQlpZiAoc3RyY21wKGtleSwgInJ3cGF0aCIpID09IDApIHsKIAkJCWlmICghd2FudF9ub192YWx1ZSgmdmFsdWUsICJyd3BhdGgiKSkKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCXBhcmFtcy0+cndwYXRoID0gMTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWVsc2UgaWYgKHN0cmNtcChrZXksICJ2b2wiKSA9PSAwKSB7CisJCX0gZWxzZSBpZiAoc3RyY21wKGtleSwgInZvbCIpID09IDApIHsKIAkJCWlmICghd2FudF9hcmcoJnZhbHVlLCAidm9sIikpCiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQkqZGV2bmFtZSA9IHZhbHVlOwotCQkJY29udGludWU7Ci0JCX0KLQkJZWxzZSBpZiAoc3RyY21wKGtleSwgImNlbGwiKSA9PSAwKSB7CisJCX0gZWxzZSBpZiAoc3RyY21wKGtleSwgImNlbGwiKSA9PSAwKSB7CiAJCQlpZiAoIXdhbnRfYXJnKCZ2YWx1ZSwgImNlbGwiKSkKIAkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCWFmc19wdXRfY2VsbChwYXJhbXMtPmRlZmF1bHRfY2VsbCk7Ci0JCQlyZXQgPSBhZnNfY2VsbF9sb29rdXAodmFsdWUsCi0JCQkJCSAgICAgIHN0cmxlbih2YWx1ZSksCi0JCQkJCSAgICAgICZwYXJhbXMtPmRlZmF1bHRfY2VsbCk7Ci0JCQlpZiAocmV0IDwgMCkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCWNvbnRpbnVlOworCQkJY2VsbCA9IGFmc19jZWxsX2xvb2t1cCh2YWx1ZSwgc3RybGVuKHZhbHVlKSk7CisJCQlpZiAoSVNfRVJSKGNlbGwpKQorCQkJCXJldHVybiBQVFJfRVJSKGNlbGwpOworCQkJYWZzX3B1dF9jZWxsKHBhcmFtcy0+Y2VsbCk7CisJCQlwYXJhbXMtPmNlbGwgPSBjZWxsOworCQl9IGVsc2UgeworCQkJcHJpbnRrKCJrQUZTOiBVbmtub3duIG1vdW50IG9wdGlvbjogJyVzJ1xuIiwgIGtleSk7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBlcnJvcjsKIAkJfQotCi0JCXByaW50aygia0FGUzogVW5rbm93biBtb3VudCBvcHRpb246ICclcydcbiIsICBrZXkpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGVycm9yOwogCX0KIAogCXJldCA9IDA7Ci0KLSBlcnJvcjoKK2Vycm9yOgogCV9sZWF2ZSgiID0gJWQiLCByZXQpOwogCXJldHVybiByZXQ7Ci19IC8qIGVuZCBhZnNfc3VwZXJfcGFyc2Vfb3B0aW9ucygpICovCit9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBwYXJzZSBhIGRldmljZSBuYW1lIHRvIGdldCBjZWxsIG5hbWUsIHZvbHVtZSBuYW1lLCB2b2x1bWUgdHlwZSBhbmQgUi9XCisgKiBzZWxlY3RvcgorICogLSB0aGlzIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKyAqCSIlW2NlbGw6XXZvbHVtZVsuXSIJCVIvVyB2b2x1bWUKKyAqCSIjW2NlbGw6XXZvbHVtZVsuXSIJCVIvTyBvciBSL1cgdm9sdW1lIChyd3BhdGg9MCksCisgKgkJCQkJIG9yIFIvVyAocndwYXRoPTEpIHZvbHVtZQorICoJIiVbY2VsbDpddm9sdW1lLnJlYWRvbmx5IglSL08gdm9sdW1lCisgKgkiI1tjZWxsOl12b2x1bWUucmVhZG9ubHkiCVIvTyB2b2x1bWUKKyAqCSIlW2NlbGw6XXZvbHVtZS5iYWNrdXAiCQlCYWNrdXAgdm9sdW1lCisgKgkiI1tjZWxsOl12b2x1bWUuYmFja3VwIgkJQmFja3VwIHZvbHVtZQorICovCitzdGF0aWMgaW50IGFmc19wYXJzZV9kZXZpY2VfbmFtZShzdHJ1Y3QgYWZzX21vdW50X3BhcmFtcyAqcGFyYW1zLAorCQkJCSBjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBhZnNfY2VsbCAqY2VsbDsKKwljb25zdCBjaGFyICpjZWxsbmFtZSwgKnN1ZmZpeDsKKwlpbnQgY2VsbG5hbWVzejsKKworCV9lbnRlcigiLCVzIiwgbmFtZSk7CisKKwlpZiAoIW5hbWUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJrQUZTOiBubyB2b2x1bWUgbmFtZSBzcGVjaWZpZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoKG5hbWVbMF0gIT0gJyUnICYmIG5hbWVbMF0gIT0gJyMnKSB8fCAhbmFtZVsxXSkgeworCQlwcmludGsoS0VSTl9FUlIgImtBRlM6IHVucGFyc2FibGUgdm9sdW1lIG5hbWVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBkZXRlcm1pbmUgdGhlIHR5cGUgb2Ygdm9sdW1lIHdlJ3JlIGxvb2tpbmcgZm9yICovCisJcGFyYW1zLT50eXBlID0gQUZTVkxfUk9WT0w7CisJcGFyYW1zLT5mb3JjZSA9IGZhbHNlOworCWlmIChwYXJhbXMtPnJ3cGF0aCB8fCBuYW1lWzBdID09ICclJykgeworCQlwYXJhbXMtPnR5cGUgPSBBRlNWTF9SV1ZPTDsKKwkJcGFyYW1zLT5mb3JjZSA9IHRydWU7CisJfQorCW5hbWUrKzsKKworCS8qIHNwbGl0IHRoZSBjZWxsIG5hbWUgb3V0IGlmIHRoZXJlIGlzIG9uZSAqLworCXBhcmFtcy0+dm9sbmFtZSA9IHN0cmNocihuYW1lLCAnOicpOworCWlmIChwYXJhbXMtPnZvbG5hbWUpIHsKKwkJY2VsbG5hbWUgPSBuYW1lOworCQljZWxsbmFtZXN6ID0gcGFyYW1zLT52b2xuYW1lIC0gbmFtZTsKKwkJcGFyYW1zLT52b2xuYW1lKys7CisJfSBlbHNlIHsKKwkJcGFyYW1zLT52b2xuYW1lID0gbmFtZTsKKwkJY2VsbG5hbWUgPSBOVUxMOworCQljZWxsbmFtZXN6ID0gMDsKKwl9CisKKwkvKiB0aGUgdm9sdW1lIHR5cGUgaXMgZnVydGhlciBhZmZlY3RlZCBieSBhIHBvc3NpYmxlIHN1ZmZpeCAqLworCXN1ZmZpeCA9IHN0cnJjaHIocGFyYW1zLT52b2xuYW1lLCAnLicpOworCWlmIChzdWZmaXgpIHsKKwkJaWYgKHN0cmNtcChzdWZmaXgsICIucmVhZG9ubHkiKSA9PSAwKSB7CisJCQlwYXJhbXMtPnR5cGUgPSBBRlNWTF9ST1ZPTDsKKwkJCXBhcmFtcy0+Zm9yY2UgPSB0cnVlOworCQl9IGVsc2UgaWYgKHN0cmNtcChzdWZmaXgsICIuYmFja3VwIikgPT0gMCkgeworCQkJcGFyYW1zLT50eXBlID0gQUZTVkxfQkFDS1ZPTDsKKwkJCXBhcmFtcy0+Zm9yY2UgPSB0cnVlOworCQl9IGVsc2UgaWYgKHN1ZmZpeFsxXSA9PSAwKSB7CisJCX0gZWxzZSB7CisJCQlzdWZmaXggPSBOVUxMOworCQl9CisJfQorCisJcGFyYW1zLT52b2xuYW1lc3ogPSBzdWZmaXggPworCQlzdWZmaXggLSBwYXJhbXMtPnZvbG5hbWUgOiBzdHJsZW4ocGFyYW1zLT52b2xuYW1lKTsKKworCV9kZWJ1ZygiY2VsbCAlKi4qcyBbJXBdIiwKKwkgICAgICAgY2VsbG5hbWVzeiwgY2VsbG5hbWVzeiwgY2VsbG5hbWUgPzogIiIsIHBhcmFtcy0+Y2VsbCk7CisKKwkvKiBsb29rdXAgdGhlIGNlbGwgcmVjb3JkICovCisJaWYgKGNlbGxuYW1lIHx8ICFwYXJhbXMtPmNlbGwpIHsKKwkJY2VsbCA9IGFmc19jZWxsX2xvb2t1cChjZWxsbmFtZSwgY2VsbG5hbWVzeik7CisJCWlmIChJU19FUlIoY2VsbCkpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAia0FGUzogdW5hYmxlIHRvIGxvb2t1cCBjZWxsICclcydcbiIsCisJCQkgICAgICAgY2VsbG5hbWUgPzogIiIpOworCQkJcmV0dXJuIFBUUl9FUlIoY2VsbCk7CisJCX0KKwkJYWZzX3B1dF9jZWxsKHBhcmFtcy0+Y2VsbCk7CisJCXBhcmFtcy0+Y2VsbCA9IGNlbGw7CisJfQorCisJX2RlYnVnKCJDRUxMOiVzIFslcF0gVk9MVU1FOiUqLipzIFNVRkZJWDolcyBUWVBFOiVkJXMiLAorCSAgICAgICBwYXJhbXMtPmNlbGwtPm5hbWUsIHBhcmFtcy0+Y2VsbCwKKwkgICAgICAgcGFyYW1zLT52b2xuYW1lc3osIHBhcmFtcy0+dm9sbmFtZXN6LCBwYXJhbXMtPnZvbG5hbWUsCisJICAgICAgIHN1ZmZpeCA/OiAiLSIsIHBhcmFtcy0+dHlwZSwgcGFyYW1zLT5mb3JjZSA/ICIgRk9SQ0UiIDogIiIpOworCisJcmV0dXJuIDA7Cit9CisKIC8qCiAgKiBjaGVjayBhIHN1cGVyYmxvY2sgdG8gc2VlIGlmIGl0J3MgdGhlIG9uZSB3ZSdyZSBsb29raW5nIGZvcgogICovCkBAIC0yMjQsMTMgKzI5NCwxMiBAQAogCXN0cnVjdCBhZnNfc3VwZXJfaW5mbyAqYXMgPSBzYi0+c19mc19pbmZvOwogCiAJcmV0dXJuIGFzLT52b2x1bWUgPT0gcGFyYW1zLT52b2x1bWU7Ci19IC8qIGVuZCBhZnNfdGVzdF9zdXBlcigpICovCit9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCiAgKiBmaWxsIGluIHRoZSBzdXBlcmJsb2NrCiAgKi8KLXN0YXRpYyBpbnQgYWZzX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqZGF0YSwgaW50IHNpbGVudCkKK3N0YXRpYyBpbnQgYWZzX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3QgYWZzX21vdW50X3BhcmFtcyAqcGFyYW1zID0gZGF0YTsKIAlzdHJ1Y3QgYWZzX3N1cGVyX2luZm8gKmFzID0gTlVMTDsKQEAgLTIzOSw3ICszMDgsNyBAQAogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBOVUxMOwogCWludCByZXQ7CiAKLQlrZW50ZXIoIiIpOworCV9lbnRlcigiIik7CiAKIAkvKiBhbGxvY2F0ZSBhIHN1cGVyYmxvY2sgaW5mbyByZWNvcmQgKi8KIAlhcyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhZnNfc3VwZXJfaW5mbyksIEdGUF9LRVJORUwpOwpAQCAtMjYyLDkgKzMzMSw5IEBACiAJZmlkLnZpZAkJPSBhcy0+dm9sdW1lLT52aWQ7CiAJZmlkLnZub2RlCT0gMTsKIAlmaWQudW5pcXVlCT0gMTsKLQlyZXQgPSBhZnNfaWdldChzYiwgJmZpZCwgJmlub2RlKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBlcnJvcjsKKwlpbm9kZSA9IGFmc19pZ2V0KHNiLCBwYXJhbXMtPmtleSwgJmZpZCwgTlVMTCwgTlVMTCk7CisJaWYgKElTX0VSUihpbm9kZSkpCisJCWdvdG8gZXJyb3JfaW5vZGU7CiAKIAlyZXQgPSAtRU5PTUVNOwogCXJvb3QgPSBkX2FsbG9jX3Jvb3QoaW5vZGUpOwpAQCAtMjczLDIxICszNDIsMjMgQEAKIAogCXNiLT5zX3Jvb3QgPSByb290OwogCi0Ja2xlYXZlKCIgPSAwIik7CisJX2xlYXZlKCIgPSAwIik7CiAJcmV0dXJuIDA7CiAKLSBlcnJvcjoKK2Vycm9yX2lub2RlOgorCXJldCA9IFBUUl9FUlIoaW5vZGUpOworCWlub2RlID0gTlVMTDsKK2Vycm9yOgogCWlwdXQoaW5vZGUpOwogCWFmc19wdXRfdm9sdW1lKGFzLT52b2x1bWUpOwogCWtmcmVlKGFzKTsKIAogCXNiLT5zX2ZzX2luZm8gPSBOVUxMOwogCi0Ja2xlYXZlKCIgPSAlZCIsIHJldCk7CisJX2xlYXZlKCIgPSAlZCIsIHJldCk7CiAJcmV0dXJuIHJldDsKLX0gLyogZW5kIGFmc19maWxsX3N1cGVyKCkgKi8KK30KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAqIGdldCBhbiBBRlMgc3VwZXJibG9jawogICogLSBUT0RPOiBkb24ndCB1c2UgZ2V0X3NiX25vZGV2KCksIGJ1dCByYXRoZXIgY2FsbCBzZ2V0KCkgZGlyZWN0bHkKQEAgLTMwMCw2OSArMzcxLDgwIEBACiB7CiAJc3RydWN0IGFmc19tb3VudF9wYXJhbXMgcGFyYW1zOwogCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7CisJc3RydWN0IGFmc192b2x1bWUgKnZvbDsKKwlzdHJ1Y3Qga2V5ICprZXk7CiAJaW50IHJldDsKIAogCV9lbnRlcigiLCwlcywlcCIsIGRldl9uYW1lLCBvcHRpb25zKTsKIAogCW1lbXNldCgmcGFyYW1zLCAwLCBzaXplb2YocGFyYW1zKSk7CiAKLQkvKiBzdGFydCB0aGUgY2FjaGUgbWFuYWdlciAqLwotCXJldCA9IGFmc2NtX3N0YXJ0KCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJX2xlYXZlKCIgPSAlZCIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyogcGFyc2UgdGhlIG9wdGlvbnMgKi8KKwkvKiBwYXJzZSB0aGUgb3B0aW9ucyBhbmQgZGV2aWNlIG5hbWUgKi8KIAlpZiAob3B0aW9ucykgewotCQlyZXQgPSBhZnNfc3VwZXJfcGFyc2Vfb3B0aW9ucygmcGFyYW1zLCBvcHRpb25zLCAmZGV2X25hbWUpOworCQlyZXQgPSBhZnNfcGFyc2Vfb3B0aW9ucygmcGFyYW1zLCBvcHRpb25zLCAmZGV2X25hbWUpOwogCQlpZiAocmV0IDwgMCkKIAkJCWdvdG8gZXJyb3I7Ci0JCWlmICghZGV2X25hbWUpIHsKLQkJCXByaW50aygia0FGUzogbm8gdm9sdW1lIG5hbWUgc3BlY2lmaWVkXG4iKTsKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCQlnb3RvIGVycm9yOwotCQl9CiAJfQogCi0JLyogcGFyc2UgdGhlIGRldmljZSBuYW1lICovCi0JcmV0ID0gYWZzX3ZvbHVtZV9sb29rdXAoZGV2X25hbWUsCi0JCQkJcGFyYW1zLmRlZmF1bHRfY2VsbCwKLQkJCQlwYXJhbXMucndwYXRoLAotCQkJCSZwYXJhbXMudm9sdW1lKTsKKworCXJldCA9IGFmc19wYXJzZV9kZXZpY2VfbmFtZSgmcGFyYW1zLCBkZXZfbmFtZSk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gZXJyb3I7CiAKLQkvKiBhbGxvY2F0ZSBhIGRldmljZWxlc3Mgc3VwZXJibG9jayAqLwotCXNiID0gc2dldChmc190eXBlLCBhZnNfdGVzdF9zdXBlciwgc2V0X2Fub25fc3VwZXIsICZwYXJhbXMpOwotCWlmIChJU19FUlIoc2IpKQotCQlnb3RvIGVycm9yOwotCi0Jc2ItPnNfZmxhZ3MgPSBmbGFnczsKLQotCXJldCA9IGFmc19maWxsX3N1cGVyKHNiLCAmcGFyYW1zLCBmbGFncyAmIE1TX1NJTEVOVCA/IDEgOiAwKTsKLQlpZiAocmV0IDwgMCkgewotCQl1cF93cml0ZSgmc2ItPnNfdW1vdW50KTsKLQkJZGVhY3RpdmF0ZV9zdXBlcihzYik7CisJLyogdHJ5IGFuZCBkbyB0aGUgbW91bnQgc2VjdXJlbHkgKi8KKwlrZXkgPSBhZnNfcmVxdWVzdF9rZXkocGFyYW1zLmNlbGwpOworCWlmIChJU19FUlIoa2V5KSkgeworCQlfbGVhdmUoIiA9ICVsZCBba2V5XSIsIFBUUl9FUlIoa2V5KSk7CisJCXJldCA9IFBUUl9FUlIoa2V5KTsKIAkJZ290byBlcnJvcjsKIAl9Ci0Jc2ItPnNfZmxhZ3MgfD0gTVNfQUNUSVZFOwotCXNpbXBsZV9zZXRfbW50KG1udCwgc2IpOworCXBhcmFtcy5rZXkgPSBrZXk7CiAKKwkvKiBwYXJzZSB0aGUgZGV2aWNlIG5hbWUgKi8KKwl2b2wgPSBhZnNfdm9sdW1lX2xvb2t1cCgmcGFyYW1zKTsKKwlpZiAoSVNfRVJSKHZvbCkpIHsKKwkJcmV0ID0gUFRSX0VSUih2b2wpOworCQlnb3RvIGVycm9yOworCX0KKwlwYXJhbXMudm9sdW1lID0gdm9sOworCisJLyogYWxsb2NhdGUgYSBkZXZpY2VsZXNzIHN1cGVyYmxvY2sgKi8KKwlzYiA9IHNnZXQoZnNfdHlwZSwgYWZzX3Rlc3Rfc3VwZXIsIHNldF9hbm9uX3N1cGVyLCAmcGFyYW1zKTsKKwlpZiAoSVNfRVJSKHNiKSkgeworCQlyZXQgPSBQVFJfRVJSKHNiKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlpZiAoIXNiLT5zX3Jvb3QpIHsKKwkJLyogaW5pdGlhbCBzdXBlcmJsb2NrL3Jvb3QgY3JlYXRpb24gKi8KKwkJX2RlYnVnKCJjcmVhdGUiKTsKKwkJc2ItPnNfZmxhZ3MgPSBmbGFnczsKKwkJcmV0ID0gYWZzX2ZpbGxfc3VwZXIoc2IsICZwYXJhbXMpOworCQlpZiAocmV0IDwgMCkgeworCQkJdXBfd3JpdGUoJnNiLT5zX3Vtb3VudCk7CisJCQlkZWFjdGl2YXRlX3N1cGVyKHNiKTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwkJc2ItPnNfZmxhZ3MgfD0gTVNfQUNUSVZFOworCX0gZWxzZSB7CisJCV9kZWJ1ZygicmV1c2UiKTsKKwkJQVNTRVJUQ01QKHNiLT5zX2ZsYWdzLCAmLCBNU19BQ1RJVkUpOworCX0KKworCXNpbXBsZV9zZXRfbW50KG1udCwgc2IpOwogCWFmc19wdXRfdm9sdW1lKHBhcmFtcy52b2x1bWUpOwotCWFmc19wdXRfY2VsbChwYXJhbXMuZGVmYXVsdF9jZWxsKTsKLQlfbGVhdmUoIiA9IDAgWyVwXSIsIDAsIHNiKTsKKwlhZnNfcHV0X2NlbGwocGFyYW1zLmNlbGwpOworCV9sZWF2ZSgiID0gMCBbJXBdIiwgc2IpOwogCXJldHVybiAwOwogCi0gZXJyb3I6CitlcnJvcjoKIAlhZnNfcHV0X3ZvbHVtZShwYXJhbXMudm9sdW1lKTsKLQlhZnNfcHV0X2NlbGwocGFyYW1zLmRlZmF1bHRfY2VsbCk7Ci0JYWZzY21fc3RvcCgpOworCWFmc19wdXRfY2VsbChwYXJhbXMuY2VsbCk7CisJa2V5X3B1dChwYXJhbXMua2V5KTsKIAlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKIAlyZXR1cm4gcmV0OwotfSAvKiBlbmQgYWZzX2dldF9zYigpICovCit9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCiAgKiBmaW5pc2ggdGhlIHVubW91bnRpbmcgcHJvY2VzcyBvbiB0aGUgc3VwZXJibG9jawogICovCkBAIC0zNzMsMzUgKzQ1NSwzMCBAQAogCV9lbnRlcigiIik7CiAKIAlhZnNfcHV0X3ZvbHVtZShhcy0+dm9sdW1lKTsKLQlhZnNjbV9zdG9wKCk7CiAKIAlfbGVhdmUoIiIpOwotfSAvKiBlbmQgYWZzX3B1dF9zdXBlcigpICovCit9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCiAgKiBpbml0aWFsaXNlIGFuIGlub2RlIGNhY2hlIHNsYWIgZWxlbWVudCBwcmlvciB0byBhbnkgdXNlCiAgKi8KIHN0YXRpYyB2b2lkIGFmc19pX2luaXRfb25jZSh2b2lkICpfdm5vZGUsIHN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZXAsCiAJCQkgICAgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKLQlzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSA9IChzdHJ1Y3QgYWZzX3Zub2RlICopIF92bm9kZTsKKwlzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSA9IF92bm9kZTsKIAogCWlmICgoZmxhZ3MgJiAoU0xBQl9DVE9SX1ZFUklGWXxTTEFCX0NUT1JfQ09OU1RSVUNUT1IpKSA9PQogCSAgICBTTEFCX0NUT1JfQ09OU1RSVUNUT1IpIHsKIAkJbWVtc2V0KHZub2RlLCAwLCBzaXplb2YoKnZub2RlKSk7CiAJCWlub2RlX2luaXRfb25jZSgmdm5vZGUtPnZmc19pbm9kZSk7CiAJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnZub2RlLT51cGRhdGVfd2FpdHEpOworCQltdXRleF9pbml0KCZ2bm9kZS0+cGVybWl0c19sb2NrKTsKKwkJbXV0ZXhfaW5pdCgmdm5vZGUtPnZhbGlkYXRlX2xvY2spOwogCQlzcGluX2xvY2tfaW5pdCgmdm5vZGUtPmxvY2spOwotCQlJTklUX0xJU1RfSEVBRCgmdm5vZGUtPmNiX2xpbmspOwotCQlJTklUX0xJU1RfSEVBRCgmdm5vZGUtPmNiX2hhc2hfbGluayk7Ci0JCWFmc190aW1lcl9pbml0KCZ2bm9kZS0+Y2JfdGltZW91dCwKLQkJCSAgICAgICAmYWZzX3Zub2RlX2NiX3RpbWVkX291dF9vcHMpOworCQlJTklUX1dPUksoJnZub2RlLT5jYl9icm9rZW5fd29yaywgYWZzX2Jyb2tlbl9jYWxsYmFja193b3JrKTsKIAl9Cit9CiAKLX0gLyogZW5kIGFmc19pX2luaXRfb25jZSgpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCiAgKiBhbGxvY2F0ZSBhbiBBRlMgaW5vZGUgc3RydWN0IGZyb20gb3VyIHNsYWIgY2FjaGUKICAqLwpAQCAtNDA5LDggKzQ4Niw3IEBACiB7CiAJc3RydWN0IGFmc192bm9kZSAqdm5vZGU7CiAKLQl2bm9kZSA9IChzdHJ1Y3QgYWZzX3Zub2RlICopCi0JCWttZW1fY2FjaGVfYWxsb2MoYWZzX2lub2RlX2NhY2hlcCwgR0ZQX0tFUk5FTCk7CisJdm5vZGUgPSBrbWVtX2NhY2hlX2FsbG9jKGFmc19pbm9kZV9jYWNoZXAsIEdGUF9LRVJORUwpOwogCWlmICghdm5vZGUpCiAJCXJldHVybiBOVUxMOwogCkBAIC00MjEsMjEgKzQ5NywyNSBAQAogCiAJdm5vZGUtPnZvbHVtZQkJPSBOVUxMOwogCXZub2RlLT51cGRhdGVfY250CT0gMDsKLQl2bm9kZS0+ZmxhZ3MJCT0gMDsKKwl2bm9kZS0+ZmxhZ3MJCT0gMSA8PCBBRlNfVk5PREVfVU5TRVQ7CisJdm5vZGUtPmNiX3Byb21pc2VkCT0gZmFsc2U7CiAKIAlyZXR1cm4gJnZub2RlLT52ZnNfaW5vZGU7Ci19IC8qIGVuZCBhZnNfYWxsb2NfaW5vZGUoKSAqLworfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICogZGVzdHJveSBhbiBBRlMgaW5vZGUgc3RydWN0CiAgKi8KIHN0YXRpYyB2b2lkIGFmc19kZXN0cm95X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CisJc3RydWN0IGFmc192bm9kZSAqdm5vZGUgPSBBRlNfRlNfSShpbm9kZSk7CisKIAlfZW50ZXIoInslbHV9IiwgaW5vZGUtPmlfaW5vKTsKIAotCWttZW1fY2FjaGVfZnJlZShhZnNfaW5vZGVfY2FjaGVwLCBBRlNfRlNfSShpbm9kZSkpOworCV9kZWJ1ZygiREVTVFJPWSBJTk9ERSAlcCIsIGlub2RlKTsKIAorCUFTU0VSVENNUCh2bm9kZS0+c2VydmVyLCA9PSwgTlVMTCk7CisKKwlrbWVtX2NhY2hlX2ZyZWUoYWZzX2lub2RlX2NhY2hlcCwgdm5vZGUpOwogCWF0b21pY19kZWMoJmFmc19jb3VudF9hY3RpdmVfaW5vZGVzKTsKLQotfSAvKiBlbmQgYWZzX2Rlc3Ryb3lfaW5vZGUoKSAqLworfQpkaWZmIC0tZ2l0IGEvZnMvYWZzL3N1cGVyLmggYi9mcy9hZnMvc3VwZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJkZThjYy4uMDAwMDAwMAotLS0gYS9mcy9hZnMvc3VwZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qIHN1cGVyLmg6IEFGUyBmaWxlc3lzdGVtIGludGVybmFsIHByaXZhdGUgZGF0YQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMiBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgZnJlZWx5IHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqCi0gKiBBdXRob3JzOiBEYXZpZCBXb29kaG91c2UgPGR3bXcyQGNhbWJyaWRnZS5yZWRoYXQuY29tPgotICogICAgICAgICAgRGF2aWQgSG93ZWxscyA8ZGhvd2VsbHNAcmVkaGF0LmNvbT4KLSAqCi0gKi8KLQotI2lmbmRlZiBfTElOVVhfQUZTX1NVUEVSX0gKLSNkZWZpbmUgX0xJTlVYX0FGU19TVVBFUl9ICi0KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgInNlcnZlci5oIgotCi0jaWZkZWYgX19LRVJORUxfXwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQUZTIHN1cGVyYmxvY2sgcHJpdmF0ZSBkYXRhCi0gKiAtIHRoZXJlJ3Mgb25lIHN1cGVyYmxvY2sgcGVyIHZvbHVtZQotICovCi1zdHJ1Y3QgYWZzX3N1cGVyX2luZm8KLXsKLQlzdHJ1Y3QgYWZzX3ZvbHVtZQkqdm9sdW1lOwkvKiB2b2x1bWUgcmVjb3JkICovCi0JY2hhcgkJCXJ3cGFyZW50OwkvKiBUIGlmIHBhcmVudCBpcyBSL1cgQUZTIHZvbHVtZSAqLwotfTsKLQotc3RhdGljIGlubGluZSBzdHJ1Y3QgYWZzX3N1cGVyX2luZm8gKkFGU19GU19TKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCi17Ci0JcmV0dXJuIHNiLT5zX2ZzX2luZm87Ci19Ci0KLWV4dGVybiBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBhZnNfZnNfdHlwZTsKLQotI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KLQotI2VuZGlmIC8qIF9MSU5VWF9BRlNfU1VQRVJfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvYWZzL3RyYW5zcG9ydC5oIGIvZnMvYWZzL3RyYW5zcG9ydC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDEzYWU2Li4wMDAwMDAwCi0tLSBhL2ZzL2Fmcy90cmFuc3BvcnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qIHRyYW5zcG9ydC5oOiBBRlMgdHJhbnNwb3J0IG1hbmFnZW1lbnQKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLQotI2lmbmRlZiBfTElOVVhfQUZTX1RSQU5TUE9SVF9ICi0jZGVmaW5lIF9MSU5VWF9BRlNfVFJBTlNQT1JUX0gKLQotI2luY2x1ZGUgInR5cGVzLmgiCi0jaW5jbHVkZSA8cnhycGMvdHJhbnNwb3J0Lmg+Ci0KLS8qIHRoZSBjYWNoZSBtYW5hZ2VyIHRyYW5zcG9ydCBlbmRwb2ludCAqLwotZXh0ZXJuIHN0cnVjdCByeHJwY190cmFuc3BvcnQgKmFmc190cmFuc3BvcnQ7Ci0KLSNlbmRpZiAvKiBfTElOVVhfQUZTX1RSQU5TUE9SVF9IICovCmRpZmYgLS1naXQgYS9mcy9hZnMvdHlwZXMuaCBiL2ZzL2Fmcy90eXBlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWEyMzY3Li4wMDAwMDAwCi0tLSBhL2ZzL2Fmcy90eXBlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qIHR5cGVzLmg6IEFGUyB0eXBlcwotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMiBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotCi0jaWZuZGVmIF9MSU5VWF9BRlNfVFlQRVNfSAotI2RlZmluZSBfTElOVVhfQUZTX1RZUEVTX0gKLQotI2lmZGVmIF9fS0VSTkVMX18KLSNpbmNsdWRlIDxyeHJwYy90eXBlcy5oPgotI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KLQotdHlwZWRlZiB1bnNpZ25lZAkJCWFmc192b2xpZF90OwotdHlwZWRlZiB1bnNpZ25lZAkJCWFmc192bm9kZWlkX3Q7Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZwkJYWZzX2RhdGF2ZXJzaW9uX3Q7Ci0KLXR5cGVkZWYgZW51bSB7Ci0JQUZTVkxfUldWT0wsCQkJLyogcmVhZC93cml0ZSB2b2x1bWUgKi8KLQlBRlNWTF9ST1ZPTCwJCQkvKiByZWFkLW9ubHkgdm9sdW1lICovCi0JQUZTVkxfQkFDS1ZPTCwJCQkvKiBiYWNrdXAgdm9sdW1lICovCi19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIGFmc192b2x0eXBlX3Q7Ci0KLXR5cGVkZWYgZW51bSB7Ci0JQUZTX0ZUWVBFX0lOVkFMSUQJPSAwLAotCUFGU19GVFlQRV9GSUxFCQk9IDEsCi0JQUZTX0ZUWVBFX0RJUgkJPSAyLAotCUFGU19GVFlQRV9TWU1MSU5LCT0gMywKLX0gYWZzX2ZpbGVfdHlwZV90OwotCi0jaWZkZWYgX19LRVJORUxfXwotCi1zdHJ1Y3QgYWZzX2NlbGw7Ci1zdHJ1Y3QgYWZzX3Zub2RlOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQUZTIGZpbGUgaWRlbnRpZmllcgotICovCi1zdHJ1Y3QgYWZzX2ZpZAotewotCWFmc192b2xpZF90CXZpZDsJCS8qIHZvbHVtZSBJRCAqLwotCWFmc192bm9kZWlkX3QJdm5vZGU7CQkvKiBmaWxlIGluZGV4IHdpdGhpbiB2b2x1bWUgKi8KLQl1bnNpZ25lZAl1bmlxdWU7CQkvKiB1bmlxdWUgSUQgbnVtYmVyIChmaWxlIGluZGV4IHZlcnNpb24pICovCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQUZTIGNhbGxiYWNrIG5vdGlmaWNhdGlvbgotICovCi10eXBlZGVmIGVudW0gewotCUFGU0NNX0NCX1VOVFlQRUQJPSAwLAkvKiBubyB0eXBlIHNldCBvbiBDQiBicmVhayAqLwotCUFGU0NNX0NCX0VYQ0xVU0lWRQk9IDEsCS8qIENCIGV4Y2x1c2l2ZSB0byBDTSBbbm90IGltcGxlbWVudGVkXSAqLwotCUFGU0NNX0NCX1NIQVJFRAkJPSAyLAkvKiBDQiBzaGFyZWQgYnkgb3RoZXIgQ00ncyAqLwotCUFGU0NNX0NCX0RST1BQRUQJPSAzLAkvKiBDQiBwcm9taXNlIGNhbmNlbGxlZCBieSBmaWxlIHNlcnZlciAqLwotfSBhZnNfY2FsbGJhY2tfdHlwZV90OwotCi1zdHJ1Y3QgYWZzX2NhbGxiYWNrCi17Ci0Jc3RydWN0IGFmc19zZXJ2ZXIJKnNlcnZlcjsJLyogc2VydmVyIHRoYXQgbWFkZSB0aGUgcHJvbWlzZSAqLwotCXN0cnVjdCBhZnNfZmlkCQlmaWQ7CQkvKiBmaWxlIGlkZW50aWZpZXIgKi8KLQl1bnNpZ25lZAkJdmVyc2lvbjsJLyogY2FsbGJhY2sgdmVyc2lvbiAqLwotCXVuc2lnbmVkCQlleHBpcnk7CQkvKiB0aW1lIGF0IHdoaWNoIGV4cGlyZXMgKi8KLQlhZnNfY2FsbGJhY2tfdHlwZV90CXR5cGU7CQkvKiB0eXBlIG9mIGNhbGxiYWNrICovCi19OwotCi0jZGVmaW5lIEFGU0NCTUFYIDUwCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBBRlMgdm9sdW1lIGluZm9ybWF0aW9uCi0gKi8KLXN0cnVjdCBhZnNfdm9sdW1lX2luZm8KLXsKLQlhZnNfdm9saWRfdAkJdmlkOwkJLyogdm9sdW1lIElEICovCi0JYWZzX3ZvbHR5cGVfdAkJdHlwZTsJCS8qIHR5cGUgb2YgdGhpcyB2b2x1bWUgKi8KLQlhZnNfdm9saWRfdAkJdHlwZV92aWRzWzVdOwkvKiB2b2x1bWUgSUQncyBmb3IgcG9zc2libGUgdHlwZXMgZm9yIHRoaXMgdm9sICovCi0JCi0JLyogbGlzdCBvZiBmaWxlc2VydmVycyBzZXJ2aW5nIHRoaXMgdm9sdW1lICovCi0Jc2l6ZV90CQkJbnNlcnZlcnM7CS8qIG51bWJlciBvZiBlbnRyaWVzIHVzZWQgaW4gc2VydmVyc1tdICovCi0Jc3RydWN0IHsKLQkJc3RydWN0IGluX2FkZHIJYWRkcjsJCS8qIGZpbGVzZXJ2ZXIgYWRkcmVzcyAqLwotCX0gc2VydmVyc1s4XTsKLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBBRlMgZmlsZSBzdGF0dXMgaW5mb3JtYXRpb24KLSAqLwotc3RydWN0IGFmc19maWxlX3N0YXR1cwotewotCXVuc2lnbmVkCQlpZl92ZXJzaW9uOwkvKiBpbnRlcmZhY2UgdmVyc2lvbiAqLwotI2RlZmluZSBBRlNfRlNUQVRVU19WRVJTSU9OCTEKLQotCWFmc19maWxlX3R5cGVfdAkJdHlwZTsJCS8qIGZpbGUgdHlwZSAqLwotCXVuc2lnbmVkCQlubGluazsJCS8qIGxpbmsgY291bnQgKi8KLQlzaXplX3QJCQlzaXplOwkJLyogZmlsZSBzaXplICovCi0JYWZzX2RhdGF2ZXJzaW9uX3QJdmVyc2lvbjsJLyogY3VycmVudCBkYXRhIHZlcnNpb24gKi8KLQl1bnNpZ25lZAkJYXV0aG9yOwkJLyogYXV0aG9yIElEICovCi0JdW5zaWduZWQJCW93bmVyOwkJLyogb3duZXIgSUQgKi8KLQl1bnNpZ25lZAkJY2FsbGVyX2FjY2VzczsJLyogYWNjZXNzIHJpZ2h0cyBmb3IgYXV0aGVudGljYXRlZCBjYWxsZXIgKi8KLQl1bnNpZ25lZAkJYW5vbl9hY2Nlc3M7CS8qIGFjY2VzcyByaWdodHMgZm9yIHVuYXV0aGVudGljYXRlZCBjYWxsZXIgKi8KLQl1bW9kZV90CQkJbW9kZTsJCS8qIFVOSVggbW9kZSAqLwotCXN0cnVjdCBhZnNfZmlkCQlwYXJlbnQ7CQkvKiBwYXJlbnQgZmlsZSBJRCAqLwotCXRpbWVfdAkJCW10aW1lX2NsaWVudDsJLyogbGFzdCB0aW1lIGNsaWVudCBjaGFuZ2VkIGRhdGEgKi8KLQl0aW1lX3QJCQltdGltZV9zZXJ2ZXI7CS8qIGxhc3QgdGltZSBzZXJ2ZXIgY2hhbmdlZCBkYXRhICovCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQUZTIHZvbHVtZSBzeW5jaHJvbmlzYXRpb24gaW5mb3JtYXRpb24KLSAqLwotc3RydWN0IGFmc192b2xzeW5jCi17Ci0JdGltZV90CQkJY3JlYXRpb247CS8qIHZvbHVtZSBjcmVhdGlvbiB0aW1lICovCi19OwotCi0jZW5kaWYgLyogX19LRVJORUxfXyAqLwotCi0jZW5kaWYgLyogX0xJTlVYX0FGU19UWVBFU19IICovCmRpZmYgLS1naXQgYS9mcy9hZnMvdXNlLXJ0bmV0bGluay5jIGIvZnMvYWZzL3VzZS1ydG5ldGxpbmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODk5MWM3Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvYWZzL3VzZS1ydG5ldGxpbmsuYwpAQCAtMCwwICsxLDQ3MyBAQAorLyogUlRORVRMSU5LIGNsaWVudAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hZGRyLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvaW5ldGRldmljZS5oPgorI2luY2x1ZGUgPG5ldC9uZXRsaW5rLmg+CisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworc3RydWN0IGFmc19ydG1fZGVzYyB7CisJc3RydWN0IHNvY2tldAkJKm5sc29jazsKKwlzdHJ1Y3QgYWZzX2ludGVyZmFjZQkqYnVmczsKKwl1OAkJCSptYWM7CisJc2l6ZV90CQkJbmJ1ZnM7CisJc2l6ZV90CQkJbWF4YnVmczsKKwl2b2lkCQkJKmRhdGE7CisJc3NpemVfdAkJCWRhdGFsZW47CisJc2l6ZV90CQkJZGF0YW1heDsKKwlpbnQJCQltc2dfc2VxOworCXVuc2lnbmVkCQltYWNfaW5kZXg7CisJYm9vbAkJCXdhbnRsb29wYmFjazsKKwlpbnQgKCpwYXJzZSkoc3RydWN0IGFmc19ydG1fZGVzYyAqLCBzdHJ1Y3Qgbmxtc2doZHIgKik7Cit9OworCisvKgorICogcGFyc2UgYW4gUlRNX0dFVEFERFIgcmVzcG9uc2UKKyAqLworc3RhdGljIGludCBhZnNfcnRtX2dldGFkZHJfcGFyc2Uoc3RydWN0IGFmc19ydG1fZGVzYyAqZGVzYywKKwkJCQkgc3RydWN0IG5sbXNnaGRyICpubGhkcikKK3sKKwlzdHJ1Y3QgYWZzX2ludGVyZmFjZSAqdGhpczsKKwlzdHJ1Y3QgaWZhZGRybXNnICppZmE7CisJc3RydWN0IHJ0YXR0ciAqcnRhdHRyOworCWNvbnN0IGNoYXIgKm5hbWU7CisJc2l6ZV90IGxlbjsKKworCWlmYSA9IChzdHJ1Y3QgaWZhZGRybXNnICopIE5MTVNHX0RBVEEobmxoZHIpOworCisJX2VudGVyKCJ7aXg9JWQsYWY9JWR9IiwgaWZhLT5pZmFfaW5kZXgsIGlmYS0+aWZhX2ZhbWlseSk7CisKKwlpZiAoaWZhLT5pZmFfZmFtaWx5ICE9IEFGX0lORVQpIHsKKwkJX2xlYXZlKCIgPSAwIFtmYW1pbHkgJWRdIiwgaWZhLT5pZmFfZmFtaWx5KTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChkZXNjLT5uYnVmcyA+PSBkZXNjLT5tYXhidWZzKSB7CisJCV9sZWF2ZSgiID0gMCBbbWF4ICV6dS8lenVdIiwgZGVzYy0+bmJ1ZnMsIGRlc2MtPm1heGJ1ZnMpOworCQlyZXR1cm4gMDsKKwl9CisKKwl0aGlzID0gJmRlc2MtPmJ1ZnNbZGVzYy0+bmJ1ZnNdOworCisJdGhpcy0+aW5kZXggPSBpZmEtPmlmYV9pbmRleDsKKwl0aGlzLT5uZXRtYXNrLnNfYWRkciA9IGluZXRfbWFrZV9tYXNrKGlmYS0+aWZhX3ByZWZpeGxlbik7CisJdGhpcy0+bXR1ID0gMDsKKworCXJ0YXR0ciA9IE5MTVNHX0RBVEEobmxoZHIpICsgTkxNU0dfQUxJR04oc2l6ZW9mKHN0cnVjdCBpZmFkZHJtc2cpKTsKKwlsZW4gPSBOTE1TR19QQVlMT0FEKG5saGRyLCBzaXplb2Yoc3RydWN0IGlmYWRkcm1zZykpOworCisJbmFtZSA9ICJ1bmtub3duIjsKKwlmb3IgKDsgUlRBX09LKHJ0YXR0ciwgbGVuKTsgcnRhdHRyID0gUlRBX05FWFQocnRhdHRyLCBsZW4pKSB7CisJCXN3aXRjaCAocnRhdHRyLT5ydGFfdHlwZSkgeworCQljYXNlIElGQV9BRERSRVNTOgorCQkJbWVtY3B5KCZ0aGlzLT5hZGRyZXNzLCBSVEFfREFUQShydGF0dHIpLCA0KTsKKwkJCWJyZWFrOworCQljYXNlIElGQV9MQUJFTDoKKwkJCW5hbWUgPSBSVEFfREFUQShydGF0dHIpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlfZGVidWcoIiVzOiAiTklQUVVBRF9GTVQiLyJOSVBRVUFEX0ZNVCwKKwkgICAgICAgbmFtZSwgTklQUVVBRCh0aGlzLT5hZGRyZXNzKSwgTklQUVVBRCh0aGlzLT5uZXRtYXNrKSk7CisKKwlkZXNjLT5uYnVmcysrOworCV9sZWF2ZSgiID0gMCIpOworCXJldHVybiAwOworfQorCisvKgorICogcGFyc2UgYW4gUlRNX0dFVExJTksgcmVzcG9uc2UgZm9yIE1UVXMKKyAqLworc3RhdGljIGludCBhZnNfcnRtX2dldGxpbmtfaWZfcGFyc2Uoc3RydWN0IGFmc19ydG1fZGVzYyAqZGVzYywKKwkJCQkgICAgc3RydWN0IG5sbXNnaGRyICpubGhkcikKK3sKKwlzdHJ1Y3QgYWZzX2ludGVyZmFjZSAqdGhpczsKKwlzdHJ1Y3QgaWZpbmZvbXNnICppZmk7CisJc3RydWN0IHJ0YXR0ciAqcnRhdHRyOworCWNvbnN0IGNoYXIgKm5hbWU7CisJc2l6ZV90IGxlbiwgbG9vcDsKKworCWlmaSA9IChzdHJ1Y3QgaWZpbmZvbXNnICopIE5MTVNHX0RBVEEobmxoZHIpOworCisJX2VudGVyKCJ7aXg9JWR9IiwgaWZpLT5pZmlfaW5kZXgpOworCisJZm9yIChsb29wID0gMDsgbG9vcCA8IGRlc2MtPm5idWZzOyBsb29wKyspIHsKKwkJdGhpcyA9ICZkZXNjLT5idWZzW2xvb3BdOworCQlpZiAodGhpcy0+aW5kZXggPT0gaWZpLT5pZmlfaW5kZXgpCisJCQlnb3RvIGZvdW5kOworCX0KKworCV9sZWF2ZSgiID0gMCBbbm8gbWF0Y2hdIik7CisJcmV0dXJuIDA7CisKK2ZvdW5kOgorCWlmIChpZmktPmlmaV90eXBlID09IEFSUEhSRF9MT09QQkFDSyAmJiAhZGVzYy0+d2FudGxvb3BiYWNrKSB7CisJCV9sZWF2ZSgiID0gMCBbbG9vcGJhY2tdIik7CisJCXJldHVybiAwOworCX0KKworCXJ0YXR0ciA9IE5MTVNHX0RBVEEobmxoZHIpICsgTkxNU0dfQUxJR04oc2l6ZW9mKHN0cnVjdCBpZmluZm9tc2cpKTsKKwlsZW4gPSBOTE1TR19QQVlMT0FEKG5saGRyLCBzaXplb2Yoc3RydWN0IGlmaW5mb21zZykpOworCisJbmFtZSA9ICJ1bmtub3duIjsKKwlmb3IgKDsgUlRBX09LKHJ0YXR0ciwgbGVuKTsgcnRhdHRyID0gUlRBX05FWFQocnRhdHRyLCBsZW4pKSB7CisJCXN3aXRjaCAocnRhdHRyLT5ydGFfdHlwZSkgeworCQljYXNlIElGTEFfTVRVOgorCQkJbWVtY3B5KCZ0aGlzLT5tdHUsIFJUQV9EQVRBKHJ0YXR0ciksIDQpOworCQkJYnJlYWs7CisJCWNhc2UgSUZMQV9JRk5BTUU6CisJCQluYW1lID0gUlRBX0RBVEEocnRhdHRyKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJX2RlYnVnKCIlczogIk5JUFFVQURfRk1UIi8iTklQUVVBRF9GTVQiIG10dSAldSIsCisJICAgICAgIG5hbWUsIE5JUFFVQUQodGhpcy0+YWRkcmVzcyksIE5JUFFVQUQodGhpcy0+bmV0bWFzayksCisJICAgICAgIHRoaXMtPm10dSk7CisKKwlfbGVhdmUoIiA9IDAiKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHBhcnNlIGFuIFJUTV9HRVRMSU5LIHJlc3BvbnNlIGZvciB0aGUgTUFDIGFkZHJlc3MgYmVsb25naW5nIHRvIHRoZSBsb3dlc3QKKyAqIG5vbi1pbnRlcm5hbCBpbnRlcmZhY2UKKyAqLworc3RhdGljIGludCBhZnNfcnRtX2dldGxpbmtfbWFjX3BhcnNlKHN0cnVjdCBhZnNfcnRtX2Rlc2MgKmRlc2MsCisJCQkJICAgICBzdHJ1Y3Qgbmxtc2doZHIgKm5saGRyKQoreworCXN0cnVjdCBpZmluZm9tc2cgKmlmaTsKKwlzdHJ1Y3QgcnRhdHRyICpydGF0dHI7CisJY29uc3QgY2hhciAqbmFtZTsKKwlzaXplX3QgcmVtYWluLCBsZW47CisJYm9vbCBzZXQ7CisKKwlpZmkgPSAoc3RydWN0IGlmaW5mb21zZyAqKSBOTE1TR19EQVRBKG5saGRyKTsKKworCV9lbnRlcigie2l4PSVkfSIsIGlmaS0+aWZpX2luZGV4KTsKKworCWlmIChpZmktPmlmaV9pbmRleCA+PSBkZXNjLT5tYWNfaW5kZXgpIHsKKwkJX2xlYXZlKCIgPSAwIFtoaWdoXSIpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKGlmaS0+aWZpX3R5cGUgPT0gQVJQSFJEX0xPT1BCQUNLKSB7CisJCV9sZWF2ZSgiID0gMCBbbG9vcGJhY2tdIik7CisJCXJldHVybiAwOworCX0KKworCXJ0YXR0ciA9IE5MTVNHX0RBVEEobmxoZHIpICsgTkxNU0dfQUxJR04oc2l6ZW9mKHN0cnVjdCBpZmluZm9tc2cpKTsKKwlyZW1haW4gPSBOTE1TR19QQVlMT0FEKG5saGRyLCBzaXplb2Yoc3RydWN0IGlmaW5mb21zZykpOworCisJbmFtZSA9ICJ1bmtub3duIjsKKwlzZXQgPSBmYWxzZTsKKwlmb3IgKDsgUlRBX09LKHJ0YXR0ciwgcmVtYWluKTsgcnRhdHRyID0gUlRBX05FWFQocnRhdHRyLCByZW1haW4pKSB7CisJCXN3aXRjaCAocnRhdHRyLT5ydGFfdHlwZSkgeworCQljYXNlIElGTEFfQUREUkVTUzoKKwkJCWxlbiA9IFJUQV9QQVlMT0FEKHJ0YXR0cik7CisJCQltZW1jcHkoZGVzYy0+bWFjLCBSVEFfREFUQShydGF0dHIpLAorCQkJICAgICAgIG1pbl90KHNpemVfdCwgbGVuLCA2KSk7CisJCQlkZXNjLT5tYWNfaW5kZXggPSBpZmktPmlmaV9pbmRleDsKKwkJCXNldCA9IHRydWU7CisJCQlicmVhazsKKwkJY2FzZSBJRkxBX0lGTkFNRToKKwkJCW5hbWUgPSBSVEFfREFUQShydGF0dHIpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoc2V0KQorCQlfZGVidWcoIiVzOiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCIsCisJCSAgICAgICBuYW1lLAorCQkgICAgICAgZGVzYy0+bWFjWzBdLCBkZXNjLT5tYWNbMV0sIGRlc2MtPm1hY1syXSwKKwkJICAgICAgIGRlc2MtPm1hY1szXSwgZGVzYy0+bWFjWzRdLCBkZXNjLT5tYWNbNV0pOworCisJX2xlYXZlKCIgPSAwIik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiByZWFkIHRoZSBydG5ldGxpbmsgcmVzcG9uc2UgYW5kIHBhc3MgdG8gcGFyc2luZyByb3V0aW5lCisgKi8KK3N0YXRpYyBpbnQgYWZzX3JlYWRfcnRtKHN0cnVjdCBhZnNfcnRtX2Rlc2MgKmRlc2MpCit7CisJc3RydWN0IG5sbXNnaGRyICpubGhkciwgdG1waGRyOworCXN0cnVjdCBtc2doZHIgbXNnOworCXN0cnVjdCBrdmVjIGlvdlsxXTsKKwl2b2lkICpkYXRhOworCWJvb2wgbGFzdCA9IGZhbHNlOworCWludCBsZW4sIHJldCwgcmVtYWluOworCisJX2VudGVyKCIiKTsKKworCWRvIHsKKwkJLyogZmlyc3Qgb2YgYWxsIHBlZWsgdG8gc2VlIGhvdyBiaWcgdGhlIHBhY2tldCBpcyAqLworCQltZW1zZXQoJm1zZywgMCwgc2l6ZW9mKG1zZykpOworCQlpb3ZbMF0uaW92X2Jhc2UgPSAmdG1waGRyOworCQlpb3ZbMF0uaW92X2xlbiA9IHNpemVvZih0bXBoZHIpOworCQlsZW4gPSBrZXJuZWxfcmVjdm1zZyhkZXNjLT5ubHNvY2ssICZtc2csIGlvdiwgMSwKKwkJCQkgICAgIHNpemVvZih0bXBoZHIpLCBNU0dfUEVFSyB8IE1TR19UUlVOQyk7CisJCWlmIChsZW4gPCAwKSB7CisJCQlfbGVhdmUoIiA9ICVkIFtwZWVrXSIsIGxlbik7CisJCQlyZXR1cm4gbGVuOworCQl9CisJCWlmIChsZW4gPT0gMCkKKwkJCWNvbnRpbnVlOworCQlpZiAobGVuIDwgc2l6ZW9mKHRtcGhkcikgfHwgbGVuIDwgTkxNU0dfUEFZTE9BRCgmdG1waGRyLCAwKSkgeworCQkJX2xlYXZlKCIgPSAtRU1TR1NJWkUiKTsKKwkJCXJldHVybiAtRU1TR1NJWkU7CisJCX0KKworCQlpZiAoZGVzYy0+ZGF0YW1heCA8IGxlbikgeworCQkJa2ZyZWUoZGVzYy0+ZGF0YSk7CisJCQlkZXNjLT5kYXRhID0gTlVMTDsKKwkJCWRhdGEgPSBrbWFsbG9jKGxlbiwgR0ZQX0tFUk5FTCk7CisJCQlpZiAoIWRhdGEpCisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQlkZXNjLT5kYXRhID0gZGF0YTsKKwkJfQorCQlkZXNjLT5kYXRhbWF4ID0gbGVuOworCisJCS8qIHJlYWQgYWxsIHRoZSBkYXRhIGZyb20gdGhpcyBwYWNrZXQgKi8KKwkJaW92WzBdLmlvdl9iYXNlID0gZGVzYy0+ZGF0YTsKKwkJaW92WzBdLmlvdl9sZW4gPSBkZXNjLT5kYXRhbWF4OworCQlkZXNjLT5kYXRhbGVuID0ga2VybmVsX3JlY3Ztc2coZGVzYy0+bmxzb2NrLCAmbXNnLCBpb3YsIDEsCisJCQkJCSAgICAgICBkZXNjLT5kYXRhbWF4LCAwKTsKKwkJaWYgKGRlc2MtPmRhdGFsZW4gPCAwKSB7CisJCQlfbGVhdmUoIiA9ICV6ZCBbcmVjdl0iLCBkZXNjLT5kYXRhbGVuKTsKKwkJCXJldHVybiBkZXNjLT5kYXRhbGVuOworCQl9CisKKwkJbmxoZHIgPSBkZXNjLT5kYXRhOworCisJCS8qIGNoZWNrIGlmIHRoZSBoZWFkZXIgaXMgdmFsaWQgKi8KKwkJaWYgKCFOTE1TR19PSyhubGhkciwgZGVzYy0+ZGF0YWxlbikgfHwKKwkJICAgIG5saGRyLT5ubG1zZ190eXBlID09IE5MTVNHX0VSUk9SKSB7CisJCQlfbGVhdmUoIiA9IC1FSU8iKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisKKwkJLyogc2VlIGlmIHRoaXMgaXMgdGhlIGxhc3QgbWVzc2FnZSAqLworCQlpZiAobmxoZHItPm5sbXNnX3R5cGUgPT0gTkxNU0dfRE9ORSB8fAorCQkgICAgIShubGhkci0+bmxtc2dfZmxhZ3MgJiBOTE1fRl9NVUxUSSkpCisJCQlsYXN0ID0gdHJ1ZTsKKworCQkvKiBwYXJzZSB0aGUgYml0cyB3ZSBnb3QgdGhpcyB0aW1lICovCisJCW5sbXNnX2Zvcl9lYWNoX21zZyhubGhkciwgZGVzYy0+ZGF0YSwgZGVzYy0+ZGF0YWxlbiwgcmVtYWluKSB7CisJCQlyZXQgPSBkZXNjLT5wYXJzZShkZXNjLCBubGhkcik7CisJCQlpZiAocmV0IDwgMCkgeworCQkJCV9sZWF2ZSgiID0gJWQgW3BhcnNlXSIsIHJldCk7CisJCQkJcmV0dXJuIHJldDsKKwkJCX0KKwkJfQorCisJfSB3aGlsZSAoIWxhc3QpOworCisJX2xlYXZlKCIgPSAwIik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBsaXN0IHRoZSBpbnRlcmZhY2UgYm91bmQgYWRkcmVzc2VzIHRvIGdldCB0aGUgYWRkcmVzcyBhbmQgbmV0bWFzaworICovCitzdGF0aWMgaW50IGFmc19ydG1fZ2V0YWRkcihzdHJ1Y3QgYWZzX3J0bV9kZXNjICpkZXNjKQoreworCXN0cnVjdCBtc2doZHIgbXNnOworCXN0cnVjdCBrdmVjIGlvdlsxXTsKKwlpbnQgcmV0OworCisJc3RydWN0IHsKKwkJc3RydWN0IG5sbXNnaGRyIG5sX21zZyBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKE5MTVNHX0FMSUdOVE8pKSk7CisJCXN0cnVjdCBpZmFkZHJtc2cgYWRkcl9tc2cgX19hdHRyaWJ1dGVfXygoYWxpZ25lZChOTE1TR19BTElHTlRPKSkpOworCX0gcmVxdWVzdDsKKworCV9lbnRlcigiIik7CisKKwltZW1zZXQoJnJlcXVlc3QsIDAsIHNpemVvZihyZXF1ZXN0KSk7CisKKwlyZXF1ZXN0Lm5sX21zZy5ubG1zZ19sZW4gPSBOTE1TR19MRU5HVEgoc2l6ZW9mKHN0cnVjdCBpZmFkZHJtc2cpKTsKKwlyZXF1ZXN0Lm5sX21zZy5ubG1zZ190eXBlID0gUlRNX0dFVEFERFI7CisJcmVxdWVzdC5ubF9tc2cubmxtc2dfZmxhZ3MgPSBOTE1fRl9SRVFVRVNUIHwgTkxNX0ZfRFVNUDsKKwlyZXF1ZXN0Lm5sX21zZy5ubG1zZ19zZXEgPSBkZXNjLT5tc2dfc2VxKys7CisJcmVxdWVzdC5ubF9tc2cubmxtc2dfcGlkID0gMDsKKworCW1lbXNldCgmbXNnLCAwLCBzaXplb2YobXNnKSk7CisJaW92WzBdLmlvdl9iYXNlID0gJnJlcXVlc3Q7CisJaW92WzBdLmlvdl9sZW4gPSBzaXplb2YocmVxdWVzdCk7CisKKwlyZXQgPSBrZXJuZWxfc2VuZG1zZyhkZXNjLT5ubHNvY2ssICZtc2csIGlvdiwgMSwgaW92WzBdLmlvdl9sZW4pOworCV9sZWF2ZSgiID0gJWQiLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBsaXN0IHRoZSBpbnRlcmZhY2UgbGluayBzdGF0dXNlcyB0byBnZXQgdGhlIE1UVXMKKyAqLworc3RhdGljIGludCBhZnNfcnRtX2dldGxpbmsoc3RydWN0IGFmc19ydG1fZGVzYyAqZGVzYykKK3sKKwlzdHJ1Y3QgbXNnaGRyIG1zZzsKKwlzdHJ1Y3Qga3ZlYyBpb3ZbMV07CisJaW50IHJldDsKKworCXN0cnVjdCB7CisJCXN0cnVjdCBubG1zZ2hkciBubF9tc2cgX19hdHRyaWJ1dGVfXygoYWxpZ25lZChOTE1TR19BTElHTlRPKSkpOworCQlzdHJ1Y3QgaWZpbmZvbXNnIGxpbmtfbXNnIF9fYXR0cmlidXRlX18oKGFsaWduZWQoTkxNU0dfQUxJR05UTykpKTsKKwl9IHJlcXVlc3Q7CisKKwlfZW50ZXIoIiIpOworCisJbWVtc2V0KCZyZXF1ZXN0LCAwLCBzaXplb2YocmVxdWVzdCkpOworCisJcmVxdWVzdC5ubF9tc2cubmxtc2dfbGVuID0gTkxNU0dfTEVOR1RIKHNpemVvZihzdHJ1Y3QgaWZpbmZvbXNnKSk7CisJcmVxdWVzdC5ubF9tc2cubmxtc2dfdHlwZSA9IFJUTV9HRVRMSU5LOworCXJlcXVlc3QubmxfbXNnLm5sbXNnX2ZsYWdzID0gTkxNX0ZfUkVRVUVTVCB8IE5MTV9GX1JPT1Q7CisJcmVxdWVzdC5ubF9tc2cubmxtc2dfc2VxID0gZGVzYy0+bXNnX3NlcSsrOworCXJlcXVlc3QubmxfbXNnLm5sbXNnX3BpZCA9IDA7CisKKwltZW1zZXQoJm1zZywgMCwgc2l6ZW9mKG1zZykpOworCWlvdlswXS5pb3ZfYmFzZSA9ICZyZXF1ZXN0OworCWlvdlswXS5pb3ZfbGVuID0gc2l6ZW9mKHJlcXVlc3QpOworCisJcmV0ID0ga2VybmVsX3NlbmRtc2coZGVzYy0+bmxzb2NrLCAmbXNnLCBpb3YsIDEsIGlvdlswXS5pb3ZfbGVuKTsKKwlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogY3VsbCBhbnkgaW50ZXJmYWNlIHJlY29yZHMgZm9yIHdoaWNoIHRoZXJlIGlzbid0IGFuIE1UVSB2YWx1ZQorICovCitzdGF0aWMgdm9pZCBhZnNfY3VsbF9pbnRlcmZhY2VzKHN0cnVjdCBhZnNfcnRtX2Rlc2MgKmRlc2MpCit7CisJc3RydWN0IGFmc19pbnRlcmZhY2UgKmJ1ZnMgPSBkZXNjLT5idWZzOworCXNpemVfdCBuYnVmcyA9IGRlc2MtPm5idWZzOworCWludCBsb29wLCBwb2ludCA9IDA7CisKKwlfZW50ZXIoInslenV9IiwgbmJ1ZnMpOworCisJZm9yIChsb29wID0gMDsgbG9vcCA8IG5idWZzOyBsb29wKyspIHsKKwkJaWYgKGRlc2MtPmJ1ZnNbbG9vcF0ubXR1ICE9IDApIHsKKwkJCWlmIChsb29wICE9IHBvaW50KSB7CisJCQkJQVNTRVJUQ01QKGxvb3AsID4sIHBvaW50KTsKKwkJCQlidWZzW3BvaW50XSA9IGJ1ZnNbbG9vcF07CisJCQl9CisJCQlwb2ludCsrOworCQl9CisJfQorCisJZGVzYy0+bmJ1ZnMgPSBwb2ludDsKKwlfbGVhdmUoIiBbJXp1LyV6dV0iLCBkZXNjLT5uYnVmcywgbmJ1ZnMpOworfQorCisvKgorICogZ2V0IGEgbGlzdCBvZiB0aGlzIHN5c3RlbSdzIGludGVyZmFjZSBJUHY0IGFkZHJlc3NlcywgbmV0bWFza3MgYW5kIE1UVXMKKyAqIC0gcmV0dXJucyB0aGUgbnVtYmVyIG9mIGludGVyZmFjZSByZWNvcmRzIGluIHRoZSBidWZmZXIKKyAqLworaW50IGFmc19nZXRfaXB2NF9pbnRlcmZhY2VzKHN0cnVjdCBhZnNfaW50ZXJmYWNlICpidWZzLCBzaXplX3QgbWF4YnVmcywKKwkJCSAgICBib29sIHdhbnRsb29wYmFjaykKK3sKKwlzdHJ1Y3QgYWZzX3J0bV9kZXNjIGRlc2M7CisJaW50IHJldCwgbG9vcDsKKworCV9lbnRlcigiIik7CisKKwltZW1zZXQoJmRlc2MsIDAsIHNpemVvZihkZXNjKSk7CisJZGVzYy5idWZzID0gYnVmczsKKwlkZXNjLm1heGJ1ZnMgPSBtYXhidWZzOworCWRlc2Mud2FudGxvb3BiYWNrID0gd2FudGxvb3BiYWNrOworCisJcmV0ID0gc29ja19jcmVhdGVfa2VybihBRl9ORVRMSU5LLCBTT0NLX0RHUkFNLCBORVRMSU5LX1JPVVRFLAorCQkJICAgICAgICZkZXNjLm5sc29jayk7CisJaWYgKHJldCA8IDApIHsKKwkJX2xlYXZlKCIgPSAlZCBbc29ja10iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIGlzc3VlIFJUTV9HRVRBRERSICovCisJZGVzYy5wYXJzZSA9IGFmc19ydG1fZ2V0YWRkcl9wYXJzZTsKKwlyZXQgPSBhZnNfcnRtX2dldGFkZHIoJmRlc2MpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yOworCXJldCA9IGFmc19yZWFkX3J0bSgmZGVzYyk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBpc3N1ZSBSVE1fR0VUTElOSyAqLworCWRlc2MucGFyc2UgPSBhZnNfcnRtX2dldGxpbmtfaWZfcGFyc2U7CisJcmV0ID0gYWZzX3J0bV9nZXRsaW5rKCZkZXNjKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJvcjsKKwlyZXQgPSBhZnNfcmVhZF9ydG0oJmRlc2MpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yOworCisJYWZzX2N1bGxfaW50ZXJmYWNlcygmZGVzYyk7CisJcmV0ID0gZGVzYy5uYnVmczsKKworCWZvciAobG9vcCA9IDA7IGxvb3AgPCByZXQ7IGxvb3ArKykKKwkJX2RlYnVnKCJbJWRdICJOSVBRVUFEX0ZNVCIvIk5JUFFVQURfRk1UIiBtdHUgJXUiLAorCQkgICAgICAgYnVmc1tsb29wXS5pbmRleCwKKwkJICAgICAgIE5JUFFVQUQoYnVmc1tsb29wXS5hZGRyZXNzKSwKKwkJICAgICAgIE5JUFFVQUQoYnVmc1tsb29wXS5uZXRtYXNrKSwKKwkJICAgICAgIGJ1ZnNbbG9vcF0ubXR1KTsKKworZXJyb3I6CisJa2ZyZWUoZGVzYy5kYXRhKTsKKwlzb2NrX3JlbGVhc2UoZGVzYy5ubHNvY2spOworCV9sZWF2ZSgiID0gJWQiLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBnZXQgYSBNQUMgYWRkcmVzcyBmcm9tIGEgcmFuZG9tIGV0aGVybmV0IGludGVyZmFjZSB0aGF0IGhhcyBhIHJlYWwgb25lCisgKiAtIHRoZSBidWZmZXIgc2hvdWxkIGJlIDYgYnl0ZXMgaW4gc2l6ZQorICovCitpbnQgYWZzX2dldF9NQUNfYWRkcmVzcyh1OCBtYWNbNl0pCit7CisJc3RydWN0IGFmc19ydG1fZGVzYyBkZXNjOworCWludCByZXQ7CisKKwlfZW50ZXIoIiIpOworCisJbWVtc2V0KCZkZXNjLCAwLCBzaXplb2YoZGVzYykpOworCWRlc2MubWFjID0gbWFjOworCWRlc2MubWFjX2luZGV4ID0gVUlOVF9NQVg7CisKKwlyZXQgPSBzb2NrX2NyZWF0ZV9rZXJuKEFGX05FVExJTkssIFNPQ0tfREdSQU0sIE5FVExJTktfUk9VVEUsCisJCQkgICAgICAgJmRlc2Mubmxzb2NrKTsKKwlpZiAocmV0IDwgMCkgeworCQlfbGVhdmUoIiA9ICVkIFtzb2NrXSIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogaXNzdWUgUlRNX0dFVExJTksgKi8KKwlkZXNjLnBhcnNlID0gYWZzX3J0bV9nZXRsaW5rX21hY19wYXJzZTsKKwlyZXQgPSBhZnNfcnRtX2dldGxpbmsoJmRlc2MpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yOworCXJldCA9IGFmc19yZWFkX3J0bSgmZGVzYyk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlpZiAoZGVzYy5tYWNfaW5kZXggPCBVSU5UX01BWCkgeworCQkvKiBnb3QgYSBNQUMgYWRkcmVzcyAqLworCQlfZGVidWcoIlslZF0gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngiLAorCQkgICAgICAgZGVzYy5tYWNfaW5kZXgsCisJCSAgICAgICBtYWNbMF0sIG1hY1sxXSwgbWFjWzJdLCBtYWNbM10sIG1hY1s0XSwgbWFjWzVdKTsKKwl9IGVsc2UgeworCQlyZXQgPSAtRU5PTkVUOworCX0KKworZXJyb3I6CisJc29ja19yZWxlYXNlKGRlc2Mubmxzb2NrKTsKKwlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZnMvYWZzL3ZsY2xpZW50LmMgYi9mcy9hZnMvdmxjbGllbnQuYwppbmRleCA3YjBlMzE5Li4zNmMxMzA2IDEwMDY0NAotLS0gYS9mcy9hZnMvdmxjbGllbnQuYworKysgYi9mcy9hZnMvdmxjbGllbnQuYwpAQCAtMSw0ICsxLDQgQEAKLS8qIHZsY2xpZW50LmM6IEFGUyBWb2x1bWUgTG9jYXRpb24gU2VydmljZSBjbGllbnQKKy8qIEFGUyBWb2x1bWUgTG9jYXRpb24gU2VydmljZSBjbGllbnQKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQpAQCAtMTEsNjg1ICsxMSwyMDggQEAKIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPHJ4cnBjL3J4cnBjLmg+Ci0jaW5jbHVkZSA8cnhycGMvdHJhbnNwb3J0Lmg+Ci0jaW5jbHVkZSA8cnhycGMvY29ubmVjdGlvbi5oPgotI2luY2x1ZGUgPHJ4cnBjL2NhbGwuaD4KLSNpbmNsdWRlICJzZXJ2ZXIuaCIKLSNpbmNsdWRlICJ2b2x1bWUuaCIKLSNpbmNsdWRlICJ2bGNsaWVudC5oIgotI2luY2x1ZGUgImthZnNhc3luY2QuaCIKLSNpbmNsdWRlICJrYWZzdGltb2QuaCIKLSNpbmNsdWRlICJlcnJvcnMuaCIKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogCi0jZGVmaW5lIFZMR0VURU5UUllCWUlECQk1MDMJLyogQUZTIEdldCBDYWNoZSBFbnRyeSBCeSBJRCBvcGVyYXRpb24gSUQgKi8KLSNkZWZpbmUgVkxHRVRFTlRSWUJZTkFNRQk1MDQJLyogQUZTIEdldCBDYWNoZSBFbnRyeSBCeSBOYW1lIG9wZXJhdGlvbiBJRCAqLwotI2RlZmluZSBWTFBST0JFCQkJNTE0CS8qIEFGUyBQcm9iZSBWb2x1bWUgTG9jYXRpb24gU2VydmljZSBvcGVyYXRpb24gSUQgKi8KLQotc3RhdGljIHZvaWQgYWZzX3J4dmxfZ2V0X2VudHJ5X2J5X2lkX2F0dG4oc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpOwotc3RhdGljIHZvaWQgYWZzX3J4dmxfZ2V0X2VudHJ5X2J5X2lkX2Vycm9yKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKLSAqIG1hcCBhZnMgVkwgYWJvcnQgY29kZXMgdG8vZnJvbSBMaW51eCBlcnJvciBjb2RlcwotICogLSBjYWxsZWQgd2l0aCBjYWxsLT5sb2NrIGhlbGQKKyAqIG1hcCB2b2x1bWUgbG9jYXRvciBhYm9ydCBjb2RlcyB0byBlcnJvciBjb2RlcwogICovCi1zdGF0aWMgdm9pZCBhZnNfcnh2bF9hZW1hcChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCkKK3N0YXRpYyBpbnQgYWZzX3ZsX2Fib3J0X3RvX2Vycm9yKHUzMiBhYm9ydF9jb2RlKQogewotCWludCBlcnI7CisJX2VudGVyKCIldSIsIGFib3J0X2NvZGUpOwogCi0JX2VudGVyKCJ7JXUsJXUsJWR9IiwKLQkgICAgICAgY2FsbC0+YXBwX2Vycl9zdGF0ZSwgY2FsbC0+YXBwX2Fib3J0X2NvZGUsIGNhbGwtPmFwcF9lcnJubyk7Ci0KLQlzd2l0Y2ggKGNhbGwtPmFwcF9lcnJfc3RhdGUpIHsKLQljYXNlIFJYUlBDX0VTVEFURV9MT0NBTF9BQk9SVDoKLQkJY2FsbC0+YXBwX2Fib3J0X2NvZGUgPSAtY2FsbC0+YXBwX2Vycm5vOwotCQlyZXR1cm47Ci0KLQljYXNlIFJYUlBDX0VTVEFURV9QRUVSX0FCT1JUOgotCQlzd2l0Y2ggKGNhbGwtPmFwcF9hYm9ydF9jb2RlKSB7Ci0JCWNhc2UgQUZTVkxfSURFWElTVDoJCWVyciA9IC1FRVhJU1Q7CQlicmVhazsKLQkJY2FzZSBBRlNWTF9JTzoJCQllcnIgPSAtRVJFTU9URUlPOwlicmVhazsKLQkJY2FzZSBBRlNWTF9OQU1FRVhJU1Q6CQllcnIgPSAtRUVYSVNUOwkJYnJlYWs7Ci0JCWNhc2UgQUZTVkxfQ1JFQVRFRkFJTDoJCWVyciA9IC1FUkVNT1RFSU87CWJyZWFrOwotCQljYXNlIEFGU1ZMX05PRU5UOgkJZXJyID0gLUVOT01FRElVTTsJYnJlYWs7Ci0JCWNhc2UgQUZTVkxfRU1QVFk6CQllcnIgPSAtRU5PTUVESVVNOwlicmVhazsKLQkJY2FzZSBBRlNWTF9FTlRERUxFVEVEOgkJZXJyID0gLUVOT01FRElVTTsJYnJlYWs7Ci0JCWNhc2UgQUZTVkxfQkFETkFNRToJCWVyciA9IC1FSU5WQUw7CQlicmVhazsKLQkJY2FzZSBBRlNWTF9CQURJTkRFWDoJCWVyciA9IC1FSU5WQUw7CQlicmVhazsKLQkJY2FzZSBBRlNWTF9CQURWT0xUWVBFOgkJZXJyID0gLUVJTlZBTDsJCWJyZWFrOwotCQljYXNlIEFGU1ZMX0JBRFNFUlZFUjoJCWVyciA9IC1FSU5WQUw7CQlicmVhazsKLQkJY2FzZSBBRlNWTF9CQURQQVJUSVRJT046CWVyciA9IC1FSU5WQUw7CQlicmVhazsKLQkJY2FzZSBBRlNWTF9SRVBTRlVMTDoJCWVyciA9IC1FRkJJRzsJCWJyZWFrOwotCQljYXNlIEFGU1ZMX05PUkVQU0VSVkVSOgkJZXJyID0gLUVOT0VOVDsJCWJyZWFrOwotCQljYXNlIEFGU1ZMX0RVUFJFUFNFUlZFUjoJZXJyID0gLUVFWElTVDsJCWJyZWFrOwotCQljYXNlIEFGU1ZMX1JXTk9URk9VTkQ6CQllcnIgPSAtRU5PRU5UOwkJYnJlYWs7Ci0JCWNhc2UgQUZTVkxfQkFEUkVGQ09VTlQ6CQllcnIgPSAtRUlOVkFMOwkJYnJlYWs7Ci0JCWNhc2UgQUZTVkxfU0laRUVYQ0VFREVEOgllcnIgPSAtRUlOVkFMOwkJYnJlYWs7Ci0JCWNhc2UgQUZTVkxfQkFERU5UUlk6CQllcnIgPSAtRUlOVkFMOwkJYnJlYWs7Ci0JCWNhc2UgQUZTVkxfQkFEVk9MSURCVU1QOgllcnIgPSAtRUlOVkFMOwkJYnJlYWs7Ci0JCWNhc2UgQUZTVkxfSURBTFJFQURZSEFTSEVEOgllcnIgPSAtRUlOVkFMOwkJYnJlYWs7Ci0JCWNhc2UgQUZTVkxfRU5UUllMT0NLRUQ6CQllcnIgPSAtRUJVU1k7CQlicmVhazsKLQkJY2FzZSBBRlNWTF9CQURWT0xPUEVSOgkJZXJyID0gLUVCQURSUUM7CQlicmVhazsKLQkJY2FzZSBBRlNWTF9CQURSRUxMT0NLVFlQRToJZXJyID0gLUVJTlZBTDsJCWJyZWFrOwotCQljYXNlIEFGU1ZMX1JFUkVMRUFTRToJCWVyciA9IC1FUkVNT1RFSU87CWJyZWFrOwotCQljYXNlIEFGU1ZMX0JBRFNFUlZFUkZMQUc6CWVyciA9IC1FSU5WQUw7CQlicmVhazsKLQkJY2FzZSBBRlNWTF9QRVJNOgkJZXJyID0gLUVBQ0NFUzsJCWJyZWFrOwotCQljYXNlIEFGU1ZMX05PTUVNOgkJZXJyID0gLUVSRU1PVEVJTzsJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQllcnIgPSBhZnNfYWJvcnRfdG9fZXJyb3IoY2FsbC0+YXBwX2Fib3J0X2NvZGUpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FsbC0+YXBwX2Vycm5vID0gZXJyOwotCQlyZXR1cm47Ci0KKwlzd2l0Y2ggKGFib3J0X2NvZGUpIHsKKwljYXNlIEFGU1ZMX0lERVhJU1Q6CQlyZXR1cm4gLUVFWElTVDsKKwljYXNlIEFGU1ZMX0lPOgkJCXJldHVybiAtRVJFTU9URUlPOworCWNhc2UgQUZTVkxfTkFNRUVYSVNUOgkJcmV0dXJuIC1FRVhJU1Q7CisJY2FzZSBBRlNWTF9DUkVBVEVGQUlMOgkJcmV0dXJuIC1FUkVNT1RFSU87CisJY2FzZSBBRlNWTF9OT0VOVDoJCXJldHVybiAtRU5PTUVESVVNOworCWNhc2UgQUZTVkxfRU1QVFk6CQlyZXR1cm4gLUVOT01FRElVTTsKKwljYXNlIEFGU1ZMX0VOVERFTEVURUQ6CQlyZXR1cm4gLUVOT01FRElVTTsKKwljYXNlIEFGU1ZMX0JBRE5BTUU6CQlyZXR1cm4gLUVJTlZBTDsKKwljYXNlIEFGU1ZMX0JBRElOREVYOgkJcmV0dXJuIC1FSU5WQUw7CisJY2FzZSBBRlNWTF9CQURWT0xUWVBFOgkJcmV0dXJuIC1FSU5WQUw7CisJY2FzZSBBRlNWTF9CQURTRVJWRVI6CQlyZXR1cm4gLUVJTlZBTDsKKwljYXNlIEFGU1ZMX0JBRFBBUlRJVElPTjoJcmV0dXJuIC1FSU5WQUw7CisJY2FzZSBBRlNWTF9SRVBTRlVMTDoJCXJldHVybiAtRUZCSUc7CisJY2FzZSBBRlNWTF9OT1JFUFNFUlZFUjoJCXJldHVybiAtRU5PRU5UOworCWNhc2UgQUZTVkxfRFVQUkVQU0VSVkVSOglyZXR1cm4gLUVFWElTVDsKKwljYXNlIEFGU1ZMX1JXTk9URk9VTkQ6CQlyZXR1cm4gLUVOT0VOVDsKKwljYXNlIEFGU1ZMX0JBRFJFRkNPVU5UOgkJcmV0dXJuIC1FSU5WQUw7CisJY2FzZSBBRlNWTF9TSVpFRVhDRUVERUQ6CXJldHVybiAtRUlOVkFMOworCWNhc2UgQUZTVkxfQkFERU5UUlk6CQlyZXR1cm4gLUVJTlZBTDsKKwljYXNlIEFGU1ZMX0JBRFZPTElEQlVNUDoJcmV0dXJuIC1FSU5WQUw7CisJY2FzZSBBRlNWTF9JREFMUkVBRFlIQVNIRUQ6CXJldHVybiAtRUlOVkFMOworCWNhc2UgQUZTVkxfRU5UUllMT0NLRUQ6CQlyZXR1cm4gLUVCVVNZOworCWNhc2UgQUZTVkxfQkFEVk9MT1BFUjoJCXJldHVybiAtRUJBRFJRQzsKKwljYXNlIEFGU1ZMX0JBRFJFTExPQ0tUWVBFOglyZXR1cm4gLUVJTlZBTDsKKwljYXNlIEFGU1ZMX1JFUkVMRUFTRToJCXJldHVybiAtRVJFTU9URUlPOworCWNhc2UgQUZTVkxfQkFEU0VSVkVSRkxBRzoJcmV0dXJuIC1FSU5WQUw7CisJY2FzZSBBRlNWTF9QRVJNOgkJcmV0dXJuIC1FQUNDRVM7CisJY2FzZSBBRlNWTF9OT01FTToJCXJldHVybiAtRVJFTU9URUlPOwogCWRlZmF1bHQ6Ci0JCXJldHVybjsKKwkJcmV0dXJuIGFmc19hYm9ydF90b19lcnJvcihhYm9ydF9jb2RlKTsKIAl9Ci19IC8qIGVuZCBhZnNfcnh2bF9hZW1hcCgpICovCit9CiAKLSNpZiAwCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgotICogcHJvYmUgYSB2b2x1bWUgbG9jYXRpb24gc2VydmVyIHRvIHNlZSBpZiBpdCBpcyBzdGlsbCBhbGl2ZSAtLSB1bnVzZWQKKyAqIGRlbGl2ZXIgcmVwbHkgZGF0YSB0byBhIFZMLkdldEVudHJ5QnlYWFggY2FsbAogICovCi1zdGF0aWMgaW50IGFmc19yeHZsX3Byb2JlKHN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIsIGludCBhbGxvY19mbGFncykKK3N0YXRpYyBpbnQgYWZzX2RlbGl2ZXJfdmxfZ2V0X2VudHJ5X2J5X3h4eChzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwsCisJCQkJCSAgIHN0cnVjdCBza19idWZmICpza2IsIGJvb2wgbGFzdCkKIHsKLQlzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubjsKLQlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbDsKLQlzdHJ1Y3Qga3ZlYyBwaW92WzFdOwotCXNpemVfdCBzZW50OwotCWludCByZXQ7Ci0JX19iZTMyIHBhcmFtWzFdOwotCi0JREVDTEFSRV9XQUlUUVVFVUUobXlzZWxmLCBjdXJyZW50KTsKLQotCS8qIGdldCBob2xkIG9mIHRoZSB2bHNlcnZlciBjb25uZWN0aW9uICovCi0JcmV0ID0gYWZzX3NlcnZlcl9nZXRfdmxjb25uKHNlcnZlciwgJmNvbm4pOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIG91dDsKLQotCS8qIGNyZWF0ZSBhIGNhbGwgdGhyb3VnaCB0aGF0IGNvbm5lY3Rpb24gKi8KLQlyZXQgPSByeHJwY19jcmVhdGVfY2FsbChjb25uLCBOVUxMLCBOVUxMLCBhZnNfcnh2bF9hZW1hcCwgJmNhbGwpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50aygia0FGUzogVW5hYmxlIHRvIGNyZWF0ZSBjYWxsOiAlZFxuIiwgcmV0KTsKLQkJZ290byBvdXRfcHV0X2Nvbm47Ci0JfQotCWNhbGwtPmFwcF9vcGNvZGUgPSBWTFBST0JFOwotCi0JLyogd2Ugd2FudCB0byBnZXQgZXZlbnQgbm90aWZpY2F0aW9ucyBmcm9tIHRoZSBjYWxsICovCi0JYWRkX3dhaXRfcXVldWUoJmNhbGwtPndhaXRxLCAmbXlzZWxmKTsKLQotCS8qIG1hcnNoYWxsIHRoZSBwYXJhbWV0ZXJzICovCi0JcGFyYW1bMF0gPSBodG9ubChWTFBST0JFKTsKLQlwaW92WzBdLmlvdl9sZW4gPSBzaXplb2YocGFyYW0pOwotCXBpb3ZbMF0uaW92X2Jhc2UgPSBwYXJhbTsKLQotCS8qIHNlbmQgdGhlIHBhcmFtZXRlcnMgdG8gdGhlIHNlcnZlciAqLwotCXJldCA9IHJ4cnBjX2NhbGxfd3JpdGVfZGF0YShjYWxsLCAxLCBwaW92LCBSWFJQQ19MQVNUX1BBQ0tFVCwKLQkJCQkgICAgYWxsb2NfZmxhZ3MsIDAsICZzZW50KTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBhYm9ydDsKLQotCS8qIHdhaXQgZm9yIHRoZSByZXBseSB0byBjb21wbGV0ZWx5IGFycml2ZSAqLwotCWZvciAoOzspIHsKLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJaWYgKGNhbGwtPmFwcF9jYWxsX3N0YXRlICE9IFJYUlBDX0NTVEFURV9DTE5UX1JDVl9SRVBMWSB8fAotCQkgICAgc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCi0JCQlicmVhazsKLQkJc2NoZWR1bGUoKTsKLQl9Ci0Jc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKLQotCXJldCA9IC1FSU5UUjsKLQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCi0JCWdvdG8gYWJvcnQ7Ci0KLQlzd2l0Y2ggKGNhbGwtPmFwcF9jYWxsX3N0YXRlKSB7Ci0JY2FzZSBSWFJQQ19DU1RBVEVfRVJST1I6Ci0JCXJldCA9IGNhbGwtPmFwcF9lcnJubzsKLQkJZ290byBvdXRfdW53YWl0OwotCi0JY2FzZSBSWFJQQ19DU1RBVEVfQ0xOVF9HT1RfUkVQTFk6Ci0JCXJldCA9IDA7Ci0JCWdvdG8gb3V0X3Vud2FpdDsKLQotCWRlZmF1bHQ6Ci0JCUJVRygpOwotCX0KLQotIGFib3J0OgotCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKLQlyeHJwY19jYWxsX2Fib3J0KGNhbGwsIHJldCk7Ci0Jc2NoZWR1bGUoKTsKLQotIG91dF91bndhaXQ6Ci0Jc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKLQlyZW1vdmVfd2FpdF9xdWV1ZSgmY2FsbC0+d2FpdHEsICZteXNlbGYpOwotCXJ4cnBjX3B1dF9jYWxsKGNhbGwpOwotIG91dF9wdXRfY29ubjoKLQlyeHJwY19wdXRfY29ubmVjdGlvbihjb25uKTsKLSBvdXQ6Ci0JcmV0dXJuIHJldDsKLQotfSAvKiBlbmQgYWZzX3J4dmxfcHJvYmUoKSAqLwotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBsb29rIHVwIGEgdm9sdW1lIGxvY2F0aW9uIGRhdGFiYXNlIGVudHJ5IGJ5IG5hbWUKLSAqLwotaW50IGFmc19yeHZsX2dldF9lbnRyeV9ieV9uYW1lKHN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIsCi0JCQkgICAgICAgY29uc3QgY2hhciAqdm9sbmFtZSwKLQkJCSAgICAgICB1bnNpZ25lZCB2b2xuYW1lc3osCi0JCQkgICAgICAgc3RydWN0IGFmc19jYWNoZV92bG9jYXRpb24gKmVudHJ5KQotewotCURFQ0xBUkVfV0FJVFFVRVVFKG15c2VsZiwgY3VycmVudCk7Ci0KLQlzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubjsKLQlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbDsKLQlzdHJ1Y3Qga3ZlYyBwaW92WzNdOwotCXVuc2lnbmVkIHRtcDsKLQlzaXplX3Qgc2VudDsKLQlpbnQgcmV0LCBsb29wOwotCV9fYmUzMiAqYnAsIHBhcmFtWzJdLCB6ZXJvOwotCi0JX2VudGVyKCIsJSouKnMsJXUsIiwgdm9sbmFtZXN6LCB2b2xuYW1lc3osIHZvbG5hbWUsIHZvbG5hbWVzeik7Ci0KLQltZW1zZXQoZW50cnksIDAsIHNpemVvZigqZW50cnkpKTsKLQotCS8qIGdldCBob2xkIG9mIHRoZSB2bHNlcnZlciBjb25uZWN0aW9uICovCi0JcmV0ID0gYWZzX3NlcnZlcl9nZXRfdmxjb25uKHNlcnZlciwgJmNvbm4pOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIG91dDsKLQotCS8qIGNyZWF0ZSBhIGNhbGwgdGhyb3VnaCB0aGF0IGNvbm5lY3Rpb24gKi8KLQlyZXQgPSByeHJwY19jcmVhdGVfY2FsbChjb25uLCBOVUxMLCBOVUxMLCBhZnNfcnh2bF9hZW1hcCwgJmNhbGwpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50aygia0FGUzogVW5hYmxlIHRvIGNyZWF0ZSBjYWxsOiAlZFxuIiwgcmV0KTsKLQkJZ290byBvdXRfcHV0X2Nvbm47Ci0JfQotCWNhbGwtPmFwcF9vcGNvZGUgPSBWTEdFVEVOVFJZQllOQU1FOwotCi0JLyogd2Ugd2FudCB0byBnZXQgZXZlbnQgbm90aWZpY2F0aW9ucyBmcm9tIHRoZSBjYWxsICovCi0JYWRkX3dhaXRfcXVldWUoJmNhbGwtPndhaXRxLCAmbXlzZWxmKTsKLQotCS8qIG1hcnNoYWxsIHRoZSBwYXJhbWV0ZXJzICovCi0JcGlvdlsxXS5pb3ZfbGVuID0gdm9sbmFtZXN6OwotCXBpb3ZbMV0uaW92X2Jhc2UgPSAoY2hhciAqKSB2b2xuYW1lOwotCi0JemVybyA9IDA7Ci0JcGlvdlsyXS5pb3ZfbGVuID0gKDQgLSAocGlvdlsxXS5pb3ZfbGVuICYgMykpICYgMzsKLQlwaW92WzJdLmlvdl9iYXNlID0gJnplcm87Ci0KLQlwYXJhbVswXSA9IGh0b25sKFZMR0VURU5UUllCWU5BTUUpOwotCXBhcmFtWzFdID0gaHRvbmwocGlvdlsxXS5pb3ZfbGVuKTsKLQotCXBpb3ZbMF0uaW92X2xlbiA9IHNpemVvZihwYXJhbSk7Ci0JcGlvdlswXS5pb3ZfYmFzZSA9IHBhcmFtOwotCi0JLyogc2VuZCB0aGUgcGFyYW1ldGVycyB0byB0aGUgc2VydmVyICovCi0JcmV0ID0gcnhycGNfY2FsbF93cml0ZV9kYXRhKGNhbGwsIDMsIHBpb3YsIFJYUlBDX0xBU1RfUEFDS0VULCBHRlBfTk9GUywKLQkJCQkgICAgMCwgJnNlbnQpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIGFib3J0OwotCi0JLyogd2FpdCBmb3IgdGhlIHJlcGx5IHRvIGNvbXBsZXRlbHkgYXJyaXZlICovCi0JYnAgPSByeHJwY19jYWxsX2FsbG9jX3NjcmF0Y2goY2FsbCwgMzg0KTsKLQotCXJldCA9IHJ4cnBjX2NhbGxfcmVhZF9kYXRhKGNhbGwsIGJwLCAzODQsCi0JCQkJICAgUlhSUENfQ0FMTF9SRUFEX0JMT0NLIHwKLQkJCQkgICBSWFJQQ19DQUxMX1JFQURfQUxMKTsKLQlpZiAocmV0IDwgMCkgewotCQlpZiAocmV0ID09IC1FQ09OTkFCT1JURUQpIHsKLQkJCXJldCA9IGNhbGwtPmFwcF9lcnJubzsKLQkJCWdvdG8gb3V0X3Vud2FpdDsKLQkJfQotCQlnb3RvIGFib3J0OwotCX0KLQotCS8qIHVubWFyc2hhbGwgdGhlIHJlcGx5ICovCi0JZm9yIChsb29wID0gMDsgbG9vcCA8IDY0OyBsb29wKyspCi0JCWVudHJ5LT5uYW1lW2xvb3BdID0gbnRvaGwoKmJwKyspOwotCWJwKys7IC8qIGZpbmFsIE5VTCAqLwotCi0JYnArKzsgLyogdHlwZSAqLwotCWVudHJ5LT5uc2VydmVycyA9IG50b2hsKCpicCsrKTsKLQotCWZvciAobG9vcCA9IDA7IGxvb3AgPCA4OyBsb29wKyspCi0JCWVudHJ5LT5zZXJ2ZXJzW2xvb3BdLnNfYWRkciA9ICpicCsrOwotCi0JYnAgKz0gODsgLyogcGFydGl0aW9uIElEcyAqLwotCi0JZm9yIChsb29wID0gMDsgbG9vcCA8IDg7IGxvb3ArKykgewotCQl0bXAgPSBudG9obCgqYnArKyk7Ci0JCWlmICh0bXAgJiBBRlNfVkxTRl9SV1ZPTCkKLQkJCWVudHJ5LT5zcnZ0bWFza1tsb29wXSB8PSBBRlNfVk9MX1ZUTV9SVzsKLQkJaWYgKHRtcCAmIEFGU19WTFNGX1JPVk9MKQotCQkJZW50cnktPnNydnRtYXNrW2xvb3BdIHw9IEFGU19WT0xfVlRNX1JPOwotCQlpZiAodG1wICYgQUZTX1ZMU0ZfQkFDS1ZPTCkKLQkJCWVudHJ5LT5zcnZ0bWFza1tsb29wXSB8PSBBRlNfVk9MX1ZUTV9CQUs7Ci0JfQotCi0JZW50cnktPnZpZFswXSA9IG50b2hsKCpicCsrKTsKLQllbnRyeS0+dmlkWzFdID0gbnRvaGwoKmJwKyspOwotCWVudHJ5LT52aWRbMl0gPSBudG9obCgqYnArKyk7Ci0KLQlicCsrOyAvKiBjbG9uZSBJRCAqLwotCi0JdG1wID0gbnRvaGwoKmJwKyspOyAvKiBmbGFncyAqLwotCWlmICh0bXAgJiBBRlNfVkxGX1JXRVhJU1RTKQotCQllbnRyeS0+dmlkbWFzayB8PSBBRlNfVk9MX1ZUTV9SVzsKLQlpZiAodG1wICYgQUZTX1ZMRl9ST0VYSVNUUykKLQkJZW50cnktPnZpZG1hc2sgfD0gQUZTX1ZPTF9WVE1fUk87Ci0JaWYgKHRtcCAmIEFGU19WTEZfQkFDS0VYSVNUUykKLQkJZW50cnktPnZpZG1hc2sgfD0gQUZTX1ZPTF9WVE1fQkFLOwotCi0JcmV0ID0gLUVOT01FRElVTTsKLQlpZiAoIWVudHJ5LT52aWRtYXNrKQotCQlnb3RvIGFib3J0OwotCi0JLyogc3VjY2VzcyAqLwotCWVudHJ5LT5ydGltZSA9IGdldF9zZWNvbmRzKCk7Ci0JcmV0ID0gMDsKLQotIG91dF91bndhaXQ6Ci0Jc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKLQlyZW1vdmVfd2FpdF9xdWV1ZSgmY2FsbC0+d2FpdHEsICZteXNlbGYpOwotCXJ4cnBjX3B1dF9jYWxsKGNhbGwpOwotIG91dF9wdXRfY29ubjoKLQlyeHJwY19wdXRfY29ubmVjdGlvbihjb25uKTsKLSBvdXQ6Ci0JX2xlYXZlKCIgPSAlZCIsIHJldCk7Ci0JcmV0dXJuIHJldDsKLQotIGFib3J0OgotCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKLQlyeHJwY19jYWxsX2Fib3J0KGNhbGwsIHJldCk7Ci0Jc2NoZWR1bGUoKTsKLQlnb3RvIG91dF91bndhaXQ7Ci19IC8qIGVuZCBhZnNfcnh2bF9nZXRfZW50cnlfYnlfbmFtZSgpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBsb29rIHVwIGEgdm9sdW1lIGxvY2F0aW9uIGRhdGFiYXNlIGVudHJ5IGJ5IElECi0gKi8KLWludCBhZnNfcnh2bF9nZXRfZW50cnlfYnlfaWQoc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlciwKLQkJCSAgICAgYWZzX3ZvbGlkX3Qgdm9saWQsCi0JCQkgICAgIGFmc192b2x0eXBlX3Qgdm9sdHlwZSwKLQkJCSAgICAgc3RydWN0IGFmc19jYWNoZV92bG9jYXRpb24gKmVudHJ5KQotewotCURFQ0xBUkVfV0FJVFFVRVVFKG15c2VsZiwgY3VycmVudCk7Ci0KLQlzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubjsKLQlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbDsKLQlzdHJ1Y3Qga3ZlYyBwaW92WzFdOwotCXVuc2lnbmVkIHRtcDsKLQlzaXplX3Qgc2VudDsKLQlpbnQgcmV0LCBsb29wOwotCV9fYmUzMiAqYnAsIHBhcmFtWzNdOwotCi0JX2VudGVyKCIsJXgsJWQsIiwgdm9saWQsIHZvbHR5cGUpOwotCi0JbWVtc2V0KGVudHJ5LCAwLCBzaXplb2YoKmVudHJ5KSk7Ci0KLQkvKiBnZXQgaG9sZCBvZiB0aGUgdmxzZXJ2ZXIgY29ubmVjdGlvbiAqLwotCXJldCA9IGFmc19zZXJ2ZXJfZ2V0X3ZsY29ubihzZXJ2ZXIsICZjb25uKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBvdXQ7Ci0KLQkvKiBjcmVhdGUgYSBjYWxsIHRocm91Z2ggdGhhdCBjb25uZWN0aW9uICovCi0JcmV0ID0gcnhycGNfY3JlYXRlX2NhbGwoY29ubiwgTlVMTCwgTlVMTCwgYWZzX3J4dmxfYWVtYXAsICZjYWxsKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcmludGsoImtBRlM6IFVuYWJsZSB0byBjcmVhdGUgY2FsbDogJWRcbiIsIHJldCk7Ci0JCWdvdG8gb3V0X3B1dF9jb25uOwotCX0KLQljYWxsLT5hcHBfb3Bjb2RlID0gVkxHRVRFTlRSWUJZSUQ7Ci0KLQkvKiB3ZSB3YW50IHRvIGdldCBldmVudCBub3RpZmljYXRpb25zIGZyb20gdGhlIGNhbGwgKi8KLQlhZGRfd2FpdF9xdWV1ZSgmY2FsbC0+d2FpdHEsICZteXNlbGYpOwotCi0JLyogbWFyc2hhbGwgdGhlIHBhcmFtZXRlcnMgKi8KLQlwYXJhbVswXSA9IGh0b25sKFZMR0VURU5UUllCWUlEKTsKLQlwYXJhbVsxXSA9IGh0b25sKHZvbGlkKTsKLQlwYXJhbVsyXSA9IGh0b25sKHZvbHR5cGUpOwotCi0JcGlvdlswXS5pb3ZfbGVuID0gc2l6ZW9mKHBhcmFtKTsKLQlwaW92WzBdLmlvdl9iYXNlID0gcGFyYW07Ci0KLQkvKiBzZW5kIHRoZSBwYXJhbWV0ZXJzIHRvIHRoZSBzZXJ2ZXIgKi8KLQlyZXQgPSByeHJwY19jYWxsX3dyaXRlX2RhdGEoY2FsbCwgMSwgcGlvdiwgUlhSUENfTEFTVF9QQUNLRVQsIEdGUF9OT0ZTLAotCQkJCSAgICAwLCAmc2VudCk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gYWJvcnQ7Ci0KLQkvKiB3YWl0IGZvciB0aGUgcmVwbHkgdG8gY29tcGxldGVseSBhcnJpdmUgKi8KLQlicCA9IHJ4cnBjX2NhbGxfYWxsb2Nfc2NyYXRjaChjYWxsLCAzODQpOwotCi0JcmV0ID0gcnhycGNfY2FsbF9yZWFkX2RhdGEoY2FsbCwgYnAsIDM4NCwKLQkJCQkgICBSWFJQQ19DQUxMX1JFQURfQkxPQ0sgfAotCQkJCSAgIFJYUlBDX0NBTExfUkVBRF9BTEwpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWlmIChyZXQgPT0gLUVDT05OQUJPUlRFRCkgewotCQkJcmV0ID0gY2FsbC0+YXBwX2Vycm5vOwotCQkJZ290byBvdXRfdW53YWl0OwotCQl9Ci0JCWdvdG8gYWJvcnQ7Ci0JfQotCi0JLyogdW5tYXJzaGFsbCB0aGUgcmVwbHkgKi8KLQlmb3IgKGxvb3AgPSAwOyBsb29wIDwgNjQ7IGxvb3ArKykKLQkJZW50cnktPm5hbWVbbG9vcF0gPSBudG9obCgqYnArKyk7Ci0JYnArKzsgLyogZmluYWwgTlVMICovCi0KLQlicCsrOyAvKiB0eXBlICovCi0JZW50cnktPm5zZXJ2ZXJzID0gbnRvaGwoKmJwKyspOwotCi0JZm9yIChsb29wID0gMDsgbG9vcCA8IDg7IGxvb3ArKykKLQkJZW50cnktPnNlcnZlcnNbbG9vcF0uc19hZGRyID0gKmJwKys7Ci0KLQlicCArPSA4OyAvKiBwYXJ0aXRpb24gSURzICovCi0KLQlmb3IgKGxvb3AgPSAwOyBsb29wIDwgODsgbG9vcCsrKSB7Ci0JCXRtcCA9IG50b2hsKCpicCsrKTsKLQkJaWYgKHRtcCAmIEFGU19WTFNGX1JXVk9MKQotCQkJZW50cnktPnNydnRtYXNrW2xvb3BdIHw9IEFGU19WT0xfVlRNX1JXOwotCQlpZiAodG1wICYgQUZTX1ZMU0ZfUk9WT0wpCi0JCQllbnRyeS0+c3J2dG1hc2tbbG9vcF0gfD0gQUZTX1ZPTF9WVE1fUk87Ci0JCWlmICh0bXAgJiBBRlNfVkxTRl9CQUNLVk9MKQotCQkJZW50cnktPnNydnRtYXNrW2xvb3BdIHw9IEFGU19WT0xfVlRNX0JBSzsKLQl9Ci0KLQllbnRyeS0+dmlkWzBdID0gbnRvaGwoKmJwKyspOwotCWVudHJ5LT52aWRbMV0gPSBudG9obCgqYnArKyk7Ci0JZW50cnktPnZpZFsyXSA9IG50b2hsKCpicCsrKTsKLQotCWJwKys7IC8qIGNsb25lIElEICovCi0KLQl0bXAgPSBudG9obCgqYnArKyk7IC8qIGZsYWdzICovCi0JaWYgKHRtcCAmIEFGU19WTEZfUldFWElTVFMpCi0JCWVudHJ5LT52aWRtYXNrIHw9IEFGU19WT0xfVlRNX1JXOwotCWlmICh0bXAgJiBBRlNfVkxGX1JPRVhJU1RTKQotCQllbnRyeS0+dmlkbWFzayB8PSBBRlNfVk9MX1ZUTV9STzsKLQlpZiAodG1wICYgQUZTX1ZMRl9CQUNLRVhJU1RTKQotCQllbnRyeS0+dmlkbWFzayB8PSBBRlNfVk9MX1ZUTV9CQUs7Ci0KLQlyZXQgPSAtRU5PTUVESVVNOwotCWlmICghZW50cnktPnZpZG1hc2spCi0JCWdvdG8gYWJvcnQ7Ci0KLSNpZiAwIC8qIFRPRE86IHJlbW92ZSAqLwotCWVudHJ5LT5uc2VydmVycyA9IDM7Ci0JZW50cnktPnNlcnZlcnNbMF0uc19hZGRyID0gaHRvbmwoMHhhYzEwMTI0OSk7Ci0JZW50cnktPnNlcnZlcnNbMV0uc19hZGRyID0gaHRvbmwoMHhhYzEwMTI0Myk7Ci0JZW50cnktPnNlcnZlcnNbMl0uc19hZGRyID0gaHRvbmwoMHhhYzEwMTI1YiAvKjB4YWMxMDEyNWIqLyk7Ci0KLQllbnRyeS0+c3J2dG1hc2tbMF0gPSBBRlNfVk9MX1ZUTV9STzsKLQllbnRyeS0+c3J2dG1hc2tbMV0gPSBBRlNfVk9MX1ZUTV9STzsKLQllbnRyeS0+c3J2dG1hc2tbMl0gPSBBRlNfVk9MX1ZUTV9STyB8IEFGU19WT0xfVlRNX1JXOwotI2VuZGlmCi0KLQkvKiBzdWNjZXNzICovCi0JZW50cnktPnJ0aW1lID0gZ2V0X3NlY29uZHMoKTsKLQlyZXQgPSAwOwotCi0gb3V0X3Vud2FpdDoKLQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwotCXJlbW92ZV93YWl0X3F1ZXVlKCZjYWxsLT53YWl0cSwgJm15c2VsZik7Ci0JcnhycGNfcHV0X2NhbGwoY2FsbCk7Ci0gb3V0X3B1dF9jb25uOgotCXJ4cnBjX3B1dF9jb25uZWN0aW9uKGNvbm4pOwotIG91dDoKLQlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKLQlyZXR1cm4gcmV0OwotCi0gYWJvcnQ6Ci0Jc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOwotCXJ4cnBjX2NhbGxfYWJvcnQoY2FsbCwgcmV0KTsKLQlzY2hlZHVsZSgpOwotCWdvdG8gb3V0X3Vud2FpdDsKLX0gLyogZW5kIGFmc19yeHZsX2dldF9lbnRyeV9ieV9pZCgpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBsb29rIHVwIGEgdm9sdW1lIGxvY2F0aW9uIGRhdGFiYXNlIGVudHJ5IGJ5IElEIGFzeW5jaHJvbm91c2x5Ci0gKi8KLWludCBhZnNfcnh2bF9nZXRfZW50cnlfYnlfaWRfYXN5bmMoc3RydWN0IGFmc19hc3luY19vcCAqb3AsCi0JCQkJICAgYWZzX3ZvbGlkX3Qgdm9saWQsCi0JCQkJICAgYWZzX3ZvbHR5cGVfdCB2b2x0eXBlKQotewotCXN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uOwotCXN0cnVjdCByeHJwY19jYWxsICpjYWxsOwotCXN0cnVjdCBrdmVjIHBpb3ZbMV07Ci0Jc2l6ZV90IHNlbnQ7Ci0JaW50IHJldDsKLQlfX2JlMzIgcGFyYW1bM107Ci0KLQlfZW50ZXIoIiwleCwlZCwiLCB2b2xpZCwgdm9sdHlwZSk7Ci0KLQkvKiBnZXQgaG9sZCBvZiB0aGUgdmxzZXJ2ZXIgY29ubmVjdGlvbiAqLwotCXJldCA9IGFmc19zZXJ2ZXJfZ2V0X3ZsY29ubihvcC0+c2VydmVyLCAmY29ubik7Ci0JaWYgKHJldCA8IDApIHsKLQkJX2xlYXZlKCIgPSAlZCIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyogY3JlYXRlIGEgY2FsbCB0aHJvdWdoIHRoYXQgY29ubmVjdGlvbiAqLwotCXJldCA9IHJ4cnBjX2NyZWF0ZV9jYWxsKGNvbm4sCi0JCQkJYWZzX3J4dmxfZ2V0X2VudHJ5X2J5X2lkX2F0dG4sCi0JCQkJYWZzX3J4dmxfZ2V0X2VudHJ5X2J5X2lkX2Vycm9yLAotCQkJCWFmc19yeHZsX2FlbWFwLAotCQkJCSZvcC0+Y2FsbCk7Ci0JcnhycGNfcHV0X2Nvbm5lY3Rpb24oY29ubik7Ci0KLQlpZiAocmV0IDwgMCkgewotCQlwcmludGsoImtBRlM6IFVuYWJsZSB0byBjcmVhdGUgY2FsbDogJWRcbiIsIHJldCk7Ci0JCV9sZWF2ZSgiID0gJWQiLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCW9wLT5jYWxsLT5hcHBfb3Bjb2RlID0gVkxHRVRFTlRSWUJZSUQ7Ci0Jb3AtPmNhbGwtPmFwcF91c2VyID0gb3A7Ci0KLQljYWxsID0gb3AtPmNhbGw7Ci0JcnhycGNfZ2V0X2NhbGwoY2FsbCk7Ci0KLQkvKiBzZW5kIGV2ZW50IG5vdGlmaWNhdGlvbnMgZnJvbSB0aGUgY2FsbCB0byBrYWZzYXN5bmNkICovCi0JYWZzX2thZnNhc3luY2RfYmVnaW5fb3Aob3ApOwotCi0JLyogbWFyc2hhbGwgdGhlIHBhcmFtZXRlcnMgKi8KLQlwYXJhbVswXSA9IGh0b25sKFZMR0VURU5UUllCWUlEKTsKLQlwYXJhbVsxXSA9IGh0b25sKHZvbGlkKTsKLQlwYXJhbVsyXSA9IGh0b25sKHZvbHR5cGUpOwotCi0JcGlvdlswXS5pb3ZfbGVuID0gc2l6ZW9mKHBhcmFtKTsKLQlwaW92WzBdLmlvdl9iYXNlID0gcGFyYW07Ci0KLQkvKiBhbGxvY2F0ZSByZXN1bHQgcmVhZCBidWZmZXIgaW4gc2NyYXRjaCBzcGFjZSAqLwotCWNhbGwtPmFwcF9zY3JfcHRyID0gcnhycGNfY2FsbF9hbGxvY19zY3JhdGNoKG9wLT5jYWxsLCAzODQpOwotCi0JLyogc2VuZCB0aGUgcGFyYW1ldGVycyB0byB0aGUgc2VydmVyICovCi0JcmV0ID0gcnhycGNfY2FsbF93cml0ZV9kYXRhKGNhbGwsIDEsIHBpb3YsIFJYUlBDX0xBU1RfUEFDS0VULCBHRlBfTk9GUywKLQkJCQkgICAgMCwgJnNlbnQpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXJ4cnBjX2NhbGxfYWJvcnQoY2FsbCwgcmV0KTsgLyogaGFuZGxlIGZyb20ga2Fmc2FzeW5jZCAqLwotCQlyZXQgPSAwOwotCQlnb3RvIG91dDsKLQl9Ci0KLQkvKiB3YWl0IGZvciB0aGUgcmVwbHkgdG8gY29tcGxldGVseSBhcnJpdmUgKi8KLQlyZXQgPSByeHJwY19jYWxsX3JlYWRfZGF0YShjYWxsLCBjYWxsLT5hcHBfc2NyX3B0ciwgMzg0LCAwKTsKLQlzd2l0Y2ggKHJldCkgewotCWNhc2UgMDoKLQljYXNlIC1FQUdBSU46Ci0JY2FzZSAtRUNPTk5BQk9SVEVEOgotCQlyZXQgPSAwOwotCQlicmVhazsJLyogYWxsIGhhbmRsZWQgYnkga2Fmc2FzeW5jZCAqLwotCi0JZGVmYXVsdDoKLQkJcnhycGNfY2FsbF9hYm9ydChjYWxsLCByZXQpOyAvKiBtYWtlIGthZnNhc3luY2QgaGFuZGxlIGl0ICovCi0JCXJldCA9IDA7Ci0JCWJyZWFrOwotCX0KLQotIG91dDoKLQlyeHJwY19wdXRfY2FsbChjYWxsKTsKLQlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKLQlyZXR1cm4gcmV0OwotCi19IC8qIGVuZCBhZnNfcnh2bF9nZXRfZW50cnlfYnlfaWRfYXN5bmMoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogYXR0ZW5kIHRvIHRoZSBhc3luY2hyb25vdXMgZ2V0IFZMREIgZW50cnkgYnkgSUQKLSAqLwotaW50IGFmc19yeHZsX2dldF9lbnRyeV9ieV9pZF9hc3luYzIoc3RydWN0IGFmc19hc3luY19vcCAqb3AsCi0JCQkJICAgIHN0cnVjdCBhZnNfY2FjaGVfdmxvY2F0aW9uICplbnRyeSkKLXsKKwlzdHJ1Y3QgYWZzX2NhY2hlX3Zsb2NhdGlvbiAqZW50cnk7CiAJX19iZTMyICpicDsKLQlfX3UzMiB0bXA7Ci0JaW50IGxvb3AsIHJldDsKKwl1MzIgdG1wOworCWludCBsb29wOwogCi0JX2VudGVyKCJ7b3A9JXAgY3N0PSV1fSIsIG9wLCBvcC0+Y2FsbC0+YXBwX2NhbGxfc3RhdGUpOworCV9lbnRlcigiLCwldSIsIGxhc3QpOwogCi0JbWVtc2V0KGVudHJ5LCAwLCBzaXplb2YoKmVudHJ5KSk7CisJYWZzX3RyYW5zZmVyX3JlcGx5KGNhbGwsIHNrYik7CisJaWYgKCFsYXN0KQorCQlyZXR1cm4gMDsKIAotCWlmIChvcC0+Y2FsbC0+YXBwX2NhbGxfc3RhdGUgPT0gUlhSUENfQ1NUQVRFX0NPTVBMRVRFKSB7Ci0JCS8qIG9wZXJhdGlvbiBmaW5pc2hlZCAqLwotCQlhZnNfa2Fmc2FzeW5jZF90ZXJtaW5hdGVfb3Aob3ApOworCWlmIChjYWxsLT5yZXBseV9zaXplICE9IGNhbGwtPnJlcGx5X21heCkKKwkJcmV0dXJuIC1FQkFETVNHOwogCi0JCWJwID0gb3AtPmNhbGwtPmFwcF9zY3JfcHRyOworCS8qIHVubWFyc2hhbGwgdGhlIHJlcGx5IG9uY2Ugd2UndmUgcmVjZWl2ZWQgYWxsIG9mIGl0ICovCisJZW50cnkgPSBjYWxsLT5yZXBseTsKKwlicCA9IGNhbGwtPmJ1ZmZlcjsKIAotCQkvKiB1bm1hcnNoYWxsIHRoZSByZXBseSAqLwotCQlmb3IgKGxvb3AgPSAwOyBsb29wIDwgNjQ7IGxvb3ArKykKLQkJCWVudHJ5LT5uYW1lW2xvb3BdID0gbnRvaGwoKmJwKyspOwotCQlicCsrOyAvKiBmaW5hbCBOVUwgKi8KKwlmb3IgKGxvb3AgPSAwOyBsb29wIDwgNjQ7IGxvb3ArKykKKwkJZW50cnktPm5hbWVbbG9vcF0gPSBudG9obCgqYnArKyk7CisJZW50cnktPm5hbWVbbG9vcF0gPSAwOworCWJwKys7IC8qIGZpbmFsIE5VTCAqLwogCi0JCWJwKys7IC8qIHR5cGUgKi8KLQkJZW50cnktPm5zZXJ2ZXJzID0gbnRvaGwoKmJwKyspOworCWJwKys7IC8qIHR5cGUgKi8KKwllbnRyeS0+bnNlcnZlcnMgPSBudG9obCgqYnArKyk7CiAKLQkJZm9yIChsb29wID0gMDsgbG9vcCA8IDg7IGxvb3ArKykKLQkJCWVudHJ5LT5zZXJ2ZXJzW2xvb3BdLnNfYWRkciA9ICpicCsrOworCWZvciAobG9vcCA9IDA7IGxvb3AgPCA4OyBsb29wKyspCisJCWVudHJ5LT5zZXJ2ZXJzW2xvb3BdLnNfYWRkciA9ICpicCsrOwogCi0JCWJwICs9IDg7IC8qIHBhcnRpdGlvbiBJRHMgKi8KKwlicCArPSA4OyAvKiBwYXJ0aXRpb24gSURzICovCiAKLQkJZm9yIChsb29wID0gMDsgbG9vcCA8IDg7IGxvb3ArKykgewotCQkJdG1wID0gbnRvaGwoKmJwKyspOwotCQkJaWYgKHRtcCAmIEFGU19WTFNGX1JXVk9MKQotCQkJCWVudHJ5LT5zcnZ0bWFza1tsb29wXSB8PSBBRlNfVk9MX1ZUTV9SVzsKLQkJCWlmICh0bXAgJiBBRlNfVkxTRl9ST1ZPTCkKLQkJCQllbnRyeS0+c3J2dG1hc2tbbG9vcF0gfD0gQUZTX1ZPTF9WVE1fUk87Ci0JCQlpZiAodG1wICYgQUZTX1ZMU0ZfQkFDS1ZPTCkKLQkJCQllbnRyeS0+c3J2dG1hc2tbbG9vcF0gfD0gQUZTX1ZPTF9WVE1fQkFLOwotCQl9Ci0KLQkJZW50cnktPnZpZFswXSA9IG50b2hsKCpicCsrKTsKLQkJZW50cnktPnZpZFsxXSA9IG50b2hsKCpicCsrKTsKLQkJZW50cnktPnZpZFsyXSA9IG50b2hsKCpicCsrKTsKLQotCQlicCsrOyAvKiBjbG9uZSBJRCAqLwotCi0JCXRtcCA9IG50b2hsKCpicCsrKTsgLyogZmxhZ3MgKi8KLQkJaWYgKHRtcCAmIEFGU19WTEZfUldFWElTVFMpCi0JCQllbnRyeS0+dmlkbWFzayB8PSBBRlNfVk9MX1ZUTV9SVzsKLQkJaWYgKHRtcCAmIEFGU19WTEZfUk9FWElTVFMpCi0JCQllbnRyeS0+dmlkbWFzayB8PSBBRlNfVk9MX1ZUTV9STzsKLQkJaWYgKHRtcCAmIEFGU19WTEZfQkFDS0VYSVNUUykKLQkJCWVudHJ5LT52aWRtYXNrIHw9IEFGU19WT0xfVlRNX0JBSzsKLQotCQlyZXQgPSAtRU5PTUVESVVNOwotCQlpZiAoIWVudHJ5LT52aWRtYXNrKSB7Ci0JCQlyeHJwY19jYWxsX2Fib3J0KG9wLT5jYWxsLCByZXQpOwotCQkJZ290byBkb25lOwotCQl9Ci0KLSNpZiAwIC8qIFRPRE86IHJlbW92ZSAqLwotCQllbnRyeS0+bnNlcnZlcnMgPSAzOwotCQllbnRyeS0+c2VydmVyc1swXS5zX2FkZHIgPSBodG9ubCgweGFjMTAxMjQ5KTsKLQkJZW50cnktPnNlcnZlcnNbMV0uc19hZGRyID0gaHRvbmwoMHhhYzEwMTI0Myk7Ci0JCWVudHJ5LT5zZXJ2ZXJzWzJdLnNfYWRkciA9IGh0b25sKDB4YWMxMDEyNWIgLyoweGFjMTAxMjViKi8pOwotCi0JCWVudHJ5LT5zcnZ0bWFza1swXSA9IEFGU19WT0xfVlRNX1JPOwotCQllbnRyeS0+c3J2dG1hc2tbMV0gPSBBRlNfVk9MX1ZUTV9STzsKLQkJZW50cnktPnNydnRtYXNrWzJdID0gQUZTX1ZPTF9WVE1fUk8gfCBBRlNfVk9MX1ZUTV9SVzsKLSNlbmRpZgotCi0JCS8qIHN1Y2Nlc3MgKi8KLQkJZW50cnktPnJ0aW1lID0gZ2V0X3NlY29uZHMoKTsKLQkJcmV0ID0gMDsKLQkJZ290byBkb25lOworCWZvciAobG9vcCA9IDA7IGxvb3AgPCA4OyBsb29wKyspIHsKKwkJdG1wID0gbnRvaGwoKmJwKyspOworCQllbnRyeS0+c3J2dG1hc2tbbG9vcF0gPSAwOworCQlpZiAodG1wICYgQUZTX1ZMU0ZfUldWT0wpCisJCQllbnRyeS0+c3J2dG1hc2tbbG9vcF0gfD0gQUZTX1ZPTF9WVE1fUlc7CisJCWlmICh0bXAgJiBBRlNfVkxTRl9ST1ZPTCkKKwkJCWVudHJ5LT5zcnZ0bWFza1tsb29wXSB8PSBBRlNfVk9MX1ZUTV9STzsKKwkJaWYgKHRtcCAmIEFGU19WTFNGX0JBQ0tWT0wpCisJCQllbnRyeS0+c3J2dG1hc2tbbG9vcF0gfD0gQUZTX1ZPTF9WVE1fQkFLOwogCX0KIAotCWlmIChvcC0+Y2FsbC0+YXBwX2NhbGxfc3RhdGUgPT0gUlhSUENfQ1NUQVRFX0VSUk9SKSB7Ci0JCS8qIG9wZXJhdGlvbiBlcnJvciAqLwotCQlyZXQgPSBvcC0+Y2FsbC0+YXBwX2Vycm5vOwotCQlnb3RvIGRvbmU7Ci0JfQorCWVudHJ5LT52aWRbMF0gPSBudG9obCgqYnArKyk7CisJZW50cnktPnZpZFsxXSA9IG50b2hsKCpicCsrKTsKKwllbnRyeS0+dmlkWzJdID0gbnRvaGwoKmJwKyspOwogCi0JX2xlYXZlKCIgPSAtRUFHQUlOIik7Ci0JcmV0dXJuIC1FQUdBSU47CisJYnArKzsgLyogY2xvbmUgSUQgKi8KIAotIGRvbmU6Ci0JcnhycGNfcHV0X2NhbGwob3AtPmNhbGwpOwotCW9wLT5jYWxsID0gTlVMTDsKLQlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKLQlyZXR1cm4gcmV0OwotfSAvKiBlbmQgYWZzX3J4dmxfZ2V0X2VudHJ5X2J5X2lkX2FzeW5jMigpICovCisJdG1wID0gbnRvaGwoKmJwKyspOyAvKiBmbGFncyAqLworCWVudHJ5LT52aWRtYXNrID0gMDsKKwlpZiAodG1wICYgQUZTX1ZMRl9SV0VYSVNUUykKKwkJZW50cnktPnZpZG1hc2sgfD0gQUZTX1ZPTF9WVE1fUlc7CisJaWYgKHRtcCAmIEFGU19WTEZfUk9FWElTVFMpCisJCWVudHJ5LT52aWRtYXNrIHw9IEFGU19WT0xfVlRNX1JPOworCWlmICh0bXAgJiBBRlNfVkxGX0JBQ0tFWElTVFMpCisJCWVudHJ5LT52aWRtYXNrIHw9IEFGU19WT0xfVlRNX0JBSzsKKwlpZiAoIWVudHJ5LT52aWRtYXNrKQorCQlyZXR1cm4gLUVCQURNU0c7CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwlfbGVhdmUoIiA9IDAgW2RvbmVdIik7CisJcmV0dXJuIDA7Cit9CisKIC8qCi0gKiBoYW5kbGUgYXR0ZW50aW9uIGV2ZW50cyBvbiBhbiBhc3luYyBnZXQtZW50cnktYnktSUQgb3AKLSAqIC0gY2FsbGVkIGZyb20ga3J4aW9kCisgKiBWTC5HZXRFbnRyeUJ5TmFtZSBvcGVyYXRpb24gdHlwZQogICovCi1zdGF0aWMgdm9pZCBhZnNfcnh2bF9nZXRfZW50cnlfYnlfaWRfYXR0bihzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCkKLXsKLQlzdHJ1Y3QgYWZzX2FzeW5jX29wICpvcCA9IGNhbGwtPmFwcF91c2VyOworc3RhdGljIGNvbnN0IHN0cnVjdCBhZnNfY2FsbF90eXBlIGFmc19SWFZMR2V0RW50cnlCeU5hbWUgPSB7CisJLm5hbWUJCT0gIlZMLkdldEVudHJ5QnlOYW1lIiwKKwkuZGVsaXZlcgk9IGFmc19kZWxpdmVyX3ZsX2dldF9lbnRyeV9ieV94eHgsCisJLmFib3J0X3RvX2Vycm9yCT0gYWZzX3ZsX2Fib3J0X3RvX2Vycm9yLAorCS5kZXN0cnVjdG9yCT0gYWZzX2ZsYXRfY2FsbF9kZXN0cnVjdG9yLAorfTsKIAotCV9lbnRlcigie29wPSVwIGNzdD0ldX0iLCBvcCwgY2FsbC0+YXBwX2NhbGxfc3RhdGUpOwotCi0Jc3dpdGNoIChjYWxsLT5hcHBfY2FsbF9zdGF0ZSkgewotCWNhc2UgUlhSUENfQ1NUQVRFX0NPTVBMRVRFOgotCQlhZnNfa2Fmc2FzeW5jZF9hdHRlbmRfb3Aob3ApOwotCQlicmVhazsKLQljYXNlIFJYUlBDX0NTVEFURV9DTE5UX1JDVl9SRVBMWToKLQkJaWYgKGNhbGwtPmFwcF9hc3luY19yZWFkKQotCQkJYnJlYWs7Ci0JY2FzZSBSWFJQQ19DU1RBVEVfQ0xOVF9HT1RfUkVQTFk6Ci0JCWlmIChjYWxsLT5hcHBfcmVhZF9jb3VudCA9PSAwKQotCQkJYnJlYWs7Ci0JCXByaW50aygia0FGUzogUmVwbHkgYmlnZ2VyIHRoYW4gZXhwZWN0ZWQiCi0JCSAgICAgICAiIHtjc3Q9JXUgYXN5bj0lZCBtYXJrPSVadSByZHk9JVp1IHByPSV1JXN9IiwKLQkJICAgICAgIGNhbGwtPmFwcF9jYWxsX3N0YXRlLAotCQkgICAgICAgY2FsbC0+YXBwX2FzeW5jX3JlYWQsCi0JCSAgICAgICBjYWxsLT5hcHBfbWFyaywKLQkJICAgICAgIGNhbGwtPmFwcF9yZWFkeV9xdHksCi0JCSAgICAgICBjYWxsLT5wa3RfcmN2X2NvdW50LAotCQkgICAgICAgY2FsbC0+YXBwX2xhc3RfcmN2ID8gIiBsYXN0IiA6ICIiKTsKLQotCQlyeHJwY19jYWxsX2Fib3J0KGNhbGwsIC1FQkFETVNHKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJQlVHKCk7Ci0JfQotCi0JX2xlYXZlKCIiKTsKLQotfSAvKiBlbmQgYWZzX3J4dmxfZ2V0X2VudHJ5X2J5X2lkX2F0dG4oKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgotICogaGFuZGxlIGVycm9yIGV2ZW50cyBvbiBhbiBhc3luYyBnZXQtZW50cnktYnktSUQgb3AKLSAqIC0gY2FsbGVkIGZyb20ga3J4aW9kCisgKiBWTC5HZXRFbnRyeUJ5SWQgb3BlcmF0aW9uIHR5cGUKICAqLwotc3RhdGljIHZvaWQgYWZzX3J4dmxfZ2V0X2VudHJ5X2J5X2lkX2Vycm9yKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKQorc3RhdGljIGNvbnN0IHN0cnVjdCBhZnNfY2FsbF90eXBlIGFmc19SWFZMR2V0RW50cnlCeUlkID0geworCS5uYW1lCQk9ICJWTC5HZXRFbnRyeUJ5SWQiLAorCS5kZWxpdmVyCT0gYWZzX2RlbGl2ZXJfdmxfZ2V0X2VudHJ5X2J5X3h4eCwKKwkuYWJvcnRfdG9fZXJyb3IJPSBhZnNfdmxfYWJvcnRfdG9fZXJyb3IsCisJLmRlc3RydWN0b3IJPSBhZnNfZmxhdF9jYWxsX2Rlc3RydWN0b3IsCit9OworCisvKgorICogZGlzcGF0Y2ggYSBnZXQgdm9sdW1lIGVudHJ5IGJ5IG5hbWUgb3BlcmF0aW9uCisgKi8KK2ludCBhZnNfdmxfZ2V0X2VudHJ5X2J5X25hbWUoc3RydWN0IGluX2FkZHIgKmFkZHIsCisJCQkgICAgIHN0cnVjdCBrZXkgKmtleSwKKwkJCSAgICAgY29uc3QgY2hhciAqdm9sbmFtZSwKKwkJCSAgICAgc3RydWN0IGFmc19jYWNoZV92bG9jYXRpb24gKmVudHJ5LAorCQkJICAgICBjb25zdCBzdHJ1Y3QgYWZzX3dhaXRfbW9kZSAqd2FpdF9tb2RlKQogewotCXN0cnVjdCBhZnNfYXN5bmNfb3AgKm9wID0gY2FsbC0+YXBwX3VzZXI7CisJc3RydWN0IGFmc19jYWxsICpjYWxsOworCXNpemVfdCB2b2xuYW1lc3osIHJlcXN6LCBwYWRzejsKKwlfX2JlMzIgKmJwOwogCi0JX2VudGVyKCJ7b3A9JXAgY3N0PSV1fSIsIG9wLCBjYWxsLT5hcHBfY2FsbF9zdGF0ZSk7CisJX2VudGVyKCIiKTsKIAotCWFmc19rYWZzYXN5bmNkX2F0dGVuZF9vcChvcCk7CisJdm9sbmFtZXN6ID0gc3RybGVuKHZvbG5hbWUpOworCXBhZHN6ID0gKDQgLSAodm9sbmFtZXN6ICYgMykpICYgMzsKKwlyZXFzeiA9IDggKyB2b2xuYW1lc3ogKyBwYWRzejsKIAotCV9sZWF2ZSgiIik7CisJY2FsbCA9IGFmc19hbGxvY19mbGF0X2NhbGwoJmFmc19SWFZMR2V0RW50cnlCeU5hbWUsIHJlcXN6LCAzODQpOworCWlmICghY2FsbCkKKwkJcmV0dXJuIC1FTk9NRU07CiAKLX0gLyogZW5kIGFmc19yeHZsX2dldF9lbnRyeV9ieV9pZF9lcnJvcigpICovCisJY2FsbC0+a2V5ID0ga2V5OworCWNhbGwtPnJlcGx5ID0gZW50cnk7CisJY2FsbC0+c2VydmljZV9pZCA9IFZMX1NFUlZJQ0U7CisJY2FsbC0+cG9ydCA9IGh0b25zKEFGU19WTF9QT1JUKTsKKworCS8qIG1hcnNoYWxsIHRoZSBwYXJhbWV0ZXJzICovCisJYnAgPSBjYWxsLT5yZXF1ZXN0OworCSpicCsrID0gaHRvbmwoVkxHRVRFTlRSWUJZTkFNRSk7CisJKmJwKysgPSBodG9ubCh2b2xuYW1lc3opOworCW1lbWNweShicCwgdm9sbmFtZSwgdm9sbmFtZXN6KTsKKwlpZiAocGFkc3ogPiAwKQorCQltZW1zZXQoKHZvaWQgKikgYnAgKyB2b2xuYW1lc3osIDAsIHBhZHN6KTsKKworCS8qIGluaXRpYXRlIHRoZSBjYWxsICovCisJcmV0dXJuIGFmc19tYWtlX2NhbGwoYWRkciwgY2FsbCwgR0ZQX0tFUk5FTCwgd2FpdF9tb2RlKTsKK30KKworLyoKKyAqIGRpc3BhdGNoIGEgZ2V0IHZvbHVtZSBlbnRyeSBieSBJRCBvcGVyYXRpb24KKyAqLworaW50IGFmc192bF9nZXRfZW50cnlfYnlfaWQoc3RydWN0IGluX2FkZHIgKmFkZHIsCisJCQkgICBzdHJ1Y3Qga2V5ICprZXksCisJCQkgICBhZnNfdm9saWRfdCB2b2xpZCwKKwkJCSAgIGFmc192b2x0eXBlX3Qgdm9sdHlwZSwKKwkJCSAgIHN0cnVjdCBhZnNfY2FjaGVfdmxvY2F0aW9uICplbnRyeSwKKwkJCSAgIGNvbnN0IHN0cnVjdCBhZnNfd2FpdF9tb2RlICp3YWl0X21vZGUpCit7CisJc3RydWN0IGFmc19jYWxsICpjYWxsOworCV9fYmUzMiAqYnA7CisKKwlfZW50ZXIoIiIpOworCisJY2FsbCA9IGFmc19hbGxvY19mbGF0X2NhbGwoJmFmc19SWFZMR2V0RW50cnlCeUlkLCAxMiwgMzg0KTsKKwlpZiAoIWNhbGwpCisJCXJldHVybiAtRU5PTUVNOworCisJY2FsbC0+a2V5ID0ga2V5OworCWNhbGwtPnJlcGx5ID0gZW50cnk7CisJY2FsbC0+c2VydmljZV9pZCA9IFZMX1NFUlZJQ0U7CisJY2FsbC0+cG9ydCA9IGh0b25zKEFGU19WTF9QT1JUKTsKKworCS8qIG1hcnNoYWxsIHRoZSBwYXJhbWV0ZXJzICovCisJYnAgPSBjYWxsLT5yZXF1ZXN0OworCSpicCsrID0gaHRvbmwoVkxHRVRFTlRSWUJZSUQpOworCSpicCsrID0gaHRvbmwodm9saWQpOworCSpicCAgID0gaHRvbmwodm9sdHlwZSk7CisKKwkvKiBpbml0aWF0ZSB0aGUgY2FsbCAqLworCXJldHVybiBhZnNfbWFrZV9jYWxsKGFkZHIsIGNhbGwsIEdGUF9LRVJORUwsIHdhaXRfbW9kZSk7Cit9CmRpZmYgLS1naXQgYS9mcy9hZnMvdmxvY2F0aW9uLmMgYi9mcy9hZnMvdmxvY2F0aW9uLmMKaW5kZXggNzgyZWU3Yy4uNmM4ZTk1YSAxMDA2NDQKLS0tIGEvZnMvYWZzL3Zsb2NhdGlvbi5jCisrKyBiL2ZzL2Fmcy92bG9jYXRpb24uYwpAQCAtMSw2ICsxLDYgQEAKLS8qIHZsb2NhdGlvbi5jOiB2b2x1bWUgbG9jYXRpb24gbWFuYWdlbWVudAorLyogQUZTIHZvbHVtZSBsb2NhdGlvbiBtYW5hZ2VtZW50CiAgKgotICogQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgpAQCAtMTIsMTMxICsxMiw2MSBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+Ci0jaW5jbHVkZSAidm9sdW1lLmgiCi0jaW5jbHVkZSAiY2VsbC5oIgotI2luY2x1ZGUgImNtc2VydmljZS5oIgotI2luY2x1ZGUgImZzY2xpZW50LmgiCi0jaW5jbHVkZSAidmxjbGllbnQuaCIKLSNpbmNsdWRlICJrYWZzdGltb2QuaCIKLSNpbmNsdWRlIDxyeHJwYy9jb25uZWN0aW9uLmg+CiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAotI2RlZmluZSBBRlNfVkxEQl9USU1FT1VUIEhaKjEwMDAKK3Vuc2lnbmVkIGFmc192bG9jYXRpb25fdGltZW91dCA9IDEwOwkvKiB2b2x1bWUgbG9jYXRpb24gdGltZW91dCBpbiBzZWNvbmRzICovCit1bnNpZ25lZCBhZnNfdmxvY2F0aW9uX3VwZGF0ZV90aW1lb3V0ID0gMTAgKiA2MDsKIAotc3RhdGljIHZvaWQgYWZzX3Zsb2NhdGlvbl91cGRhdGVfdGltZXIoc3RydWN0IGFmc190aW1lciAqdGltZXIpOwotc3RhdGljIHZvaWQgYWZzX3Zsb2NhdGlvbl91cGRhdGVfYXR0ZW5kKHN0cnVjdCBhZnNfYXN5bmNfb3AgKm9wKTsKLXN0YXRpYyB2b2lkIGFmc192bG9jYXRpb25fdXBkYXRlX2Rpc2NhcmQoc3RydWN0IGFmc19hc3luY19vcCAqb3ApOwotc3RhdGljIHZvaWQgX19hZnNfcHV0X3Zsb2NhdGlvbihzdHJ1Y3QgYWZzX3Zsb2NhdGlvbiAqdmxvY2F0aW9uKTsKK3N0YXRpYyB2b2lkIGFmc192bG9jYXRpb25fcmVhcGVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqKTsKK3N0YXRpYyB2b2lkIGFmc192bG9jYXRpb25fdXBkYXRlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKik7CiAKLXN0YXRpYyB2b2lkIF9fYWZzX3Zsb2NhdGlvbl90aW1lb3V0KHN0cnVjdCBhZnNfdGltZXIgKnRpbWVyKQotewotCXN0cnVjdCBhZnNfdmxvY2F0aW9uICp2bG9jYXRpb24gPQotCQlsaXN0X2VudHJ5KHRpbWVyLCBzdHJ1Y3QgYWZzX3Zsb2NhdGlvbiwgdGltZW91dCk7CitzdGF0aWMgTElTVF9IRUFEKGFmc192bG9jYXRpb25fdXBkYXRlcyk7CitzdGF0aWMgTElTVF9IRUFEKGFmc192bG9jYXRpb25fZ3JhdmV5YXJkKTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soYWZzX3Zsb2NhdGlvbl91cGRhdGVzX2xvY2spOworc3RhdGljIERFRklORV9TUElOTE9DSyhhZnNfdmxvY2F0aW9uX2dyYXZleWFyZF9sb2NrKTsKK3N0YXRpYyBERUNMQVJFX0RFTEFZRURfV09SSyhhZnNfdmxvY2F0aW9uX3JlYXAsIGFmc192bG9jYXRpb25fcmVhcGVyKTsKK3N0YXRpYyBERUNMQVJFX0RFTEFZRURfV09SSyhhZnNfdmxvY2F0aW9uX3VwZGF0ZSwgYWZzX3Zsb2NhdGlvbl91cGRhdGVyKTsKK3N0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqYWZzX3Zsb2NhdGlvbl91cGRhdGVfd29ya2VyOwogCi0JX2RlYnVnKCJWTCBUSU1FT1VUIFslc3t1PSVkfV0iLAotCSAgICAgICB2bG9jYXRpb24tPnZsZGIubmFtZSwgYXRvbWljX3JlYWQoJnZsb2NhdGlvbi0+dXNhZ2UpKTsKLQotCWFmc192bG9jYXRpb25fZG9fdGltZW91dCh2bG9jYXRpb24pOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGFmc190aW1lcl9vcHMgYWZzX3Zsb2NhdGlvbl90aW1lcl9vcHMgPSB7Ci0JLnRpbWVkX291dAk9IF9fYWZzX3Zsb2NhdGlvbl90aW1lb3V0LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBhZnNfdGltZXJfb3BzIGFmc192bG9jYXRpb25fdXBkYXRlX3RpbWVyX29wcyA9IHsKLQkudGltZWRfb3V0CT0gYWZzX3Zsb2NhdGlvbl91cGRhdGVfdGltZXIsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGFmc19hc3luY19vcF9vcHMgYWZzX3Zsb2NhdGlvbl91cGRhdGVfb3Bfb3BzID0gewotCS5hdHRlbmQJCT0gYWZzX3Zsb2NhdGlvbl91cGRhdGVfYXR0ZW5kLAotCS5kaXNjYXJkCT0gYWZzX3Zsb2NhdGlvbl91cGRhdGVfZGlzY2FyZCwKLX07Ci0KLXN0YXRpYyBMSVNUX0hFQUQoYWZzX3Zsb2NhdGlvbl91cGRhdGVfcGVuZHEpOwkvKiBxdWV1ZSBvZiBWTHMgYXdhaXRpbmcgdXBkYXRlICovCi1zdGF0aWMgc3RydWN0IGFmc192bG9jYXRpb24gKmFmc192bG9jYXRpb25fdXBkYXRlOwkvKiBWTCBjdXJyZW50bHkgYmVpbmcgdXBkYXRlZCAqLwotc3RhdGljIERFRklORV9TUElOTE9DSyhhZnNfdmxvY2F0aW9uX3VwZGF0ZV9sb2NrKTsgLyogbG9jayBndWFyZGluZyB1cGRhdGUgcXVldWUgKi8KLQotI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKLXN0YXRpYyBjYWNoZWZzX21hdGNoX3ZhbF90IGFmc192bG9jYXRpb25fY2FjaGVfbWF0Y2godm9pZCAqdGFyZ2V0LAotCQkJCQkJICAgICBjb25zdCB2b2lkICplbnRyeSk7Ci1zdGF0aWMgdm9pZCBhZnNfdmxvY2F0aW9uX2NhY2hlX3VwZGF0ZSh2b2lkICpzb3VyY2UsIHZvaWQgKmVudHJ5KTsKLQotc3RydWN0IGNhY2hlZnNfaW5kZXhfZGVmIGFmc192bG9jYXRpb25fY2FjaGVfaW5kZXhfZGVmID0gewotCS5uYW1lCQk9ICJ2bGRiIiwKLQkuZGF0YV9zaXplCT0gc2l6ZW9mKHN0cnVjdCBhZnNfY2FjaGVfdmxvY2F0aW9uKSwKLQkua2V5c1swXQk9IHsgQ0FDSEVGU19JTkRFWF9LRVlTX0FTQ0lJWiwgNjQgfSwKLQkubWF0Y2gJCT0gYWZzX3Zsb2NhdGlvbl9jYWNoZV9tYXRjaCwKLQkudXBkYXRlCQk9IGFmc192bG9jYXRpb25fY2FjaGVfdXBkYXRlLAotfTsKLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICogaXRlcmF0ZSB0aHJvdWdoIHRoZSBWTCBzZXJ2ZXJzIGluIGEgY2VsbCB1bnRpbCBvbmUgb2YgdGhlbSBhZG1pdHMga25vd2luZwogICogYWJvdXQgdGhlIHZvbHVtZSBpbiBxdWVzdGlvbgotICogLSBjYWxsZXIgbXVzdCBoYXZlIGNlbGwtPnZsX3NlbSB3cml0ZS1sb2NrZWQKICAqLwotc3RhdGljIGludCBhZnNfdmxvY2F0aW9uX2FjY2Vzc192bF9ieV9uYW1lKHN0cnVjdCBhZnNfdmxvY2F0aW9uICp2bG9jYXRpb24sCi0JCQkJCSAgIGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkJCSAgIHVuc2lnbmVkIG5hbWVzeiwKK3N0YXRpYyBpbnQgYWZzX3Zsb2NhdGlvbl9hY2Nlc3NfdmxfYnlfbmFtZShzdHJ1Y3QgYWZzX3Zsb2NhdGlvbiAqdmwsCisJCQkJCSAgIHN0cnVjdCBrZXkgKmtleSwKIAkJCQkJICAgc3RydWN0IGFmc19jYWNoZV92bG9jYXRpb24gKnZsZGIpCiB7Ci0Jc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlciA9IE5VTEw7Ci0Jc3RydWN0IGFmc19jZWxsICpjZWxsID0gdmxvY2F0aW9uLT5jZWxsOworCXN0cnVjdCBhZnNfY2VsbCAqY2VsbCA9IHZsLT5jZWxsOworCXN0cnVjdCBpbl9hZGRyIGFkZHI7CiAJaW50IGNvdW50LCByZXQ7CiAKLQlfZW50ZXIoIiVzLCUqLipzLCV1IiwgY2VsbC0+bmFtZSwgbmFtZXN6LCBuYW1lc3osIG5hbWUsIG5hbWVzeik7CisJX2VudGVyKCIlcywlcyIsIGNlbGwtPm5hbWUsIHZsLT52bGRiLm5hbWUpOwogCisJZG93bl93cml0ZSgmdmwtPmNlbGwtPnZsX3NlbSk7CiAJcmV0ID0gLUVOT01FRElVTTsKIAlmb3IgKGNvdW50ID0gY2VsbC0+dmxfbmFkZHJzOyBjb3VudCA+IDA7IGNvdW50LS0pIHsKLQkJX2RlYnVnKCJDZWxsU2VydlslaHVdOiAlMDh4IiwKLQkJICAgICAgIGNlbGwtPnZsX2N1cnJfc3ZpeCwKLQkJICAgICAgIGNlbGwtPnZsX2FkZHJzW2NlbGwtPnZsX2N1cnJfc3ZpeF0uc19hZGRyKTsKKwkJYWRkciA9IGNlbGwtPnZsX2FkZHJzW2NlbGwtPnZsX2N1cnJfc3ZpeF07CiAKLQkJLyogdHJ5IGFuZCBjcmVhdGUgYSBzZXJ2ZXIgKi8KLQkJcmV0ID0gYWZzX3NlcnZlcl9sb29rdXAoY2VsbCwKLQkJCQkJJmNlbGwtPnZsX2FkZHJzW2NlbGwtPnZsX2N1cnJfc3ZpeF0sCi0JCQkJCSZzZXJ2ZXIpOwotCQlzd2l0Y2ggKHJldCkgewotCQljYXNlIDA6Ci0JCQlicmVhazsKLQkJY2FzZSAtRU5PTUVNOgotCQljYXNlIC1FTk9ORVQ6Ci0JCQlnb3RvIG91dDsKLQkJZGVmYXVsdDoKLQkJCWdvdG8gcm90YXRlOwotCQl9CisJCV9kZWJ1ZygiQ2VsbFNlcnZbJWh1XTogJTA4eCIsIGNlbGwtPnZsX2N1cnJfc3ZpeCwgYWRkci5zX2FkZHIpOwogCiAJCS8qIGF0dGVtcHQgdG8gYWNjZXNzIHRoZSBWTCBzZXJ2ZXIgKi8KLQkJcmV0ID0gYWZzX3J4dmxfZ2V0X2VudHJ5X2J5X25hbWUoc2VydmVyLCBuYW1lLCBuYW1lc3osIHZsZGIpOworCQlyZXQgPSBhZnNfdmxfZ2V0X2VudHJ5X2J5X25hbWUoJmFkZHIsIGtleSwgdmwtPnZsZGIubmFtZSwgdmxkYiwKKwkJCQkJICAgICAgICZhZnNfc3luY19jYWxsKTsKIAkJc3dpdGNoIChyZXQpIHsKIAkJY2FzZSAwOgotCQkJYWZzX3B1dF9zZXJ2ZXIoc2VydmVyKTsKIAkJCWdvdG8gb3V0OwogCQljYXNlIC1FTk9NRU06CiAJCWNhc2UgLUVOT05FVDoKIAkJY2FzZSAtRU5FVFVOUkVBQ0g6CiAJCWNhc2UgLUVIT1NUVU5SRUFDSDoKIAkJY2FzZSAtRUNPTk5SRUZVU0VEOgotCQkJZG93bl93cml0ZSgmc2VydmVyLT5zZW0pOwotCQkJaWYgKHNlcnZlci0+dmxzZXJ2ZXIpIHsKLQkJCQlyeHJwY19wdXRfY29ubmVjdGlvbihzZXJ2ZXItPnZsc2VydmVyKTsKLQkJCQlzZXJ2ZXItPnZsc2VydmVyID0gTlVMTDsKLQkJCX0KLQkJCXVwX3dyaXRlKCZzZXJ2ZXItPnNlbSk7Ci0JCQlhZnNfcHV0X3NlcnZlcihzZXJ2ZXIpOwogCQkJaWYgKHJldCA9PSAtRU5PTUVNIHx8IHJldCA9PSAtRU5PTkVUKQogCQkJCWdvdG8gb3V0OwogCQkJZ290byByb3RhdGU7CiAJCWNhc2UgLUVOT01FRElVTToKLQkJCWFmc19wdXRfc2VydmVyKHNlcnZlcik7CiAJCQlnb3RvIG91dDsKIAkJZGVmYXVsdDoKLQkJCWFmc19wdXRfc2VydmVyKHNlcnZlcik7Ci0JCQlyZXQgPSAtRU5PTUVESVVNOworCQkJcmV0ID0gLUVJTzsKIAkJCWdvdG8gcm90YXRlOwogCQl9CiAKQEAgLTE0Niw3NiArNzYsNjYgQEAKIAkJY2VsbC0+dmxfY3Vycl9zdml4ICU9IGNlbGwtPnZsX25hZGRyczsKIAl9CiAKLSBvdXQ6CitvdXQ6CisJdXBfd3JpdGUoJnZsLT5jZWxsLT52bF9zZW0pOwogCV9sZWF2ZSgiID0gJWQiLCByZXQpOwogCXJldHVybiByZXQ7Cit9CiAKLX0gLyogZW5kIGFmc192bG9jYXRpb25fYWNjZXNzX3ZsX2J5X25hbWUoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICogaXRlcmF0ZSB0aHJvdWdoIHRoZSBWTCBzZXJ2ZXJzIGluIGEgY2VsbCB1bnRpbCBvbmUgb2YgdGhlbSBhZG1pdHMga25vd2luZwogICogYWJvdXQgdGhlIHZvbHVtZSBpbiBxdWVzdGlvbgotICogLSBjYWxsZXIgbXVzdCBoYXZlIGNlbGwtPnZsX3NlbSB3cml0ZS1sb2NrZWQKICAqLwotc3RhdGljIGludCBhZnNfdmxvY2F0aW9uX2FjY2Vzc192bF9ieV9pZChzdHJ1Y3QgYWZzX3Zsb2NhdGlvbiAqdmxvY2F0aW9uLAorc3RhdGljIGludCBhZnNfdmxvY2F0aW9uX2FjY2Vzc192bF9ieV9pZChzdHJ1Y3QgYWZzX3Zsb2NhdGlvbiAqdmwsCisJCQkJCSBzdHJ1Y3Qga2V5ICprZXksCiAJCQkJCSBhZnNfdm9saWRfdCB2b2xpZCwKIAkJCQkJIGFmc192b2x0eXBlX3Qgdm9sdHlwZSwKIAkJCQkJIHN0cnVjdCBhZnNfY2FjaGVfdmxvY2F0aW9uICp2bGRiKQogewotCXN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIgPSBOVUxMOwotCXN0cnVjdCBhZnNfY2VsbCAqY2VsbCA9IHZsb2NhdGlvbi0+Y2VsbDsKKwlzdHJ1Y3QgYWZzX2NlbGwgKmNlbGwgPSB2bC0+Y2VsbDsKKwlzdHJ1Y3QgaW5fYWRkciBhZGRyOwogCWludCBjb3VudCwgcmV0OwogCiAJX2VudGVyKCIlcywleCwlZCwiLCBjZWxsLT5uYW1lLCB2b2xpZCwgdm9sdHlwZSk7CiAKKwlkb3duX3dyaXRlKCZ2bC0+Y2VsbC0+dmxfc2VtKTsKIAlyZXQgPSAtRU5PTUVESVVNOwogCWZvciAoY291bnQgPSBjZWxsLT52bF9uYWRkcnM7IGNvdW50ID4gMDsgY291bnQtLSkgewotCQlfZGVidWcoIkNlbGxTZXJ2WyVodV06ICUwOHgiLAotCQkgICAgICAgY2VsbC0+dmxfY3Vycl9zdml4LAotCQkgICAgICAgY2VsbC0+dmxfYWRkcnNbY2VsbC0+dmxfY3Vycl9zdml4XS5zX2FkZHIpOworCQlhZGRyID0gY2VsbC0+dmxfYWRkcnNbY2VsbC0+dmxfY3Vycl9zdml4XTsKIAotCQkvKiB0cnkgYW5kIGNyZWF0ZSBhIHNlcnZlciAqLwotCQlyZXQgPSBhZnNfc2VydmVyX2xvb2t1cChjZWxsLAotCQkJCQkmY2VsbC0+dmxfYWRkcnNbY2VsbC0+dmxfY3Vycl9zdml4XSwKLQkJCQkJJnNlcnZlcik7Ci0JCXN3aXRjaCAocmV0KSB7Ci0JCWNhc2UgMDoKLQkJCWJyZWFrOwotCQljYXNlIC1FTk9NRU06Ci0JCWNhc2UgLUVOT05FVDoKLQkJCWdvdG8gb3V0OwotCQlkZWZhdWx0OgotCQkJZ290byByb3RhdGU7Ci0JCX0KKwkJX2RlYnVnKCJDZWxsU2VydlslaHVdOiAlMDh4IiwgY2VsbC0+dmxfY3Vycl9zdml4LCBhZGRyLnNfYWRkcik7CiAKIAkJLyogYXR0ZW1wdCB0byBhY2Nlc3MgdGhlIFZMIHNlcnZlciAqLwotCQlyZXQgPSBhZnNfcnh2bF9nZXRfZW50cnlfYnlfaWQoc2VydmVyLCB2b2xpZCwgdm9sdHlwZSwgdmxkYik7CisJCXJldCA9IGFmc192bF9nZXRfZW50cnlfYnlfaWQoJmFkZHIsIGtleSwgdm9saWQsIHZvbHR5cGUsIHZsZGIsCisJCQkJCSAgICAgJmFmc19zeW5jX2NhbGwpOwogCQlzd2l0Y2ggKHJldCkgewogCQljYXNlIDA6Ci0JCQlhZnNfcHV0X3NlcnZlcihzZXJ2ZXIpOwogCQkJZ290byBvdXQ7CiAJCWNhc2UgLUVOT01FTToKIAkJY2FzZSAtRU5PTkVUOgogCQljYXNlIC1FTkVUVU5SRUFDSDoKIAkJY2FzZSAtRUhPU1RVTlJFQUNIOgogCQljYXNlIC1FQ09OTlJFRlVTRUQ6Ci0JCQlkb3duX3dyaXRlKCZzZXJ2ZXItPnNlbSk7Ci0JCQlpZiAoc2VydmVyLT52bHNlcnZlcikgewotCQkJCXJ4cnBjX3B1dF9jb25uZWN0aW9uKHNlcnZlci0+dmxzZXJ2ZXIpOwotCQkJCXNlcnZlci0+dmxzZXJ2ZXIgPSBOVUxMOwotCQkJfQotCQkJdXBfd3JpdGUoJnNlcnZlci0+c2VtKTsKLQkJCWFmc19wdXRfc2VydmVyKHNlcnZlcik7CiAJCQlpZiAocmV0ID09IC1FTk9NRU0gfHwgcmV0ID09IC1FTk9ORVQpCiAJCQkJZ290byBvdXQ7CiAJCQlnb3RvIHJvdGF0ZTsKKwkJY2FzZSAtRUJVU1k6CisJCQl2bC0+dXBkX2J1c3lfY250Kys7CisJCQlpZiAodmwtPnVwZF9idXN5X2NudCA8PSAzKSB7CisJCQkJaWYgKHZsLT51cGRfYnVzeV9jbnQgPiAxKSB7CisJCQkJCS8qIHNlY29uZCsgQlVTWSAtIHNsZWVwIGEgbGl0dGxlIGJpdCAqLworCQkJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCQkJCXNjaGVkdWxlX3RpbWVvdXQoMSk7CisJCQkJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwkJCQl9CisJCQkJY29udGludWU7CisJCQl9CisJCQlicmVhazsKIAkJY2FzZSAtRU5PTUVESVVNOgotCQkJYWZzX3B1dF9zZXJ2ZXIoc2VydmVyKTsKLQkJCWdvdG8gb3V0OworCQkJdmwtPnVwZF9yZWpfY250Kys7CisJCQlnb3RvIHJvdGF0ZTsKIAkJZGVmYXVsdDoKLQkJCWFmc19wdXRfc2VydmVyKHNlcnZlcik7Ci0JCQlyZXQgPSAtRU5PTUVESVVNOworCQkJcmV0ID0gLUVJTzsKIAkJCWdvdG8gcm90YXRlOwogCQl9CiAKQEAgLTIyMyw3MjkgKzE0Myw1NzkgQEAKIAlyb3RhdGU6CiAJCWNlbGwtPnZsX2N1cnJfc3ZpeCsrOwogCQljZWxsLT52bF9jdXJyX3N2aXggJT0gY2VsbC0+dmxfbmFkZHJzOworCQl2bC0+dXBkX2J1c3lfY250ID0gMDsKIAl9CiAKLSBvdXQ6CitvdXQ6CisJaWYgKHJldCA8IDAgJiYgdmwtPnVwZF9yZWpfY250ID4gMCkgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgImtBRlM6IgorCQkgICAgICAgIiBBY3RpdmUgdm9sdW1lIG5vIGxvbmdlciB2YWxpZCAnJXMnXG4iLAorCQkgICAgICAgdmwtPnZsZGIubmFtZSk7CisJCXZsLT52YWxpZCA9IDA7CisJCXJldCA9IC1FTk9NRURJVU07CisJfQorCisJdXBfd3JpdGUoJnZsLT5jZWxsLT52bF9zZW0pOwogCV9sZWF2ZSgiID0gJWQiLCByZXQpOwogCXJldHVybiByZXQ7Cit9CiAKLX0gLyogZW5kIGFmc192bG9jYXRpb25fYWNjZXNzX3ZsX2J5X2lkKCkgKi8KKy8qCisgKiBhbGxvY2F0ZSBhIHZvbHVtZSBsb2NhdGlvbiByZWNvcmQKKyAqLworc3RhdGljIHN0cnVjdCBhZnNfdmxvY2F0aW9uICphZnNfdmxvY2F0aW9uX2FsbG9jKHN0cnVjdCBhZnNfY2VsbCAqY2VsbCwKKwkJCQkJCSBjb25zdCBjaGFyICpuYW1lLAorCQkJCQkJIHNpemVfdCBuYW1lc3opCit7CisJc3RydWN0IGFmc192bG9jYXRpb24gKnZsOwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJdmwgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYWZzX3Zsb2NhdGlvbiksIEdGUF9LRVJORUwpOworCWlmICh2bCkgeworCQl2bC0+Y2VsbCA9IGNlbGw7CisJCXZsLT5zdGF0ZSA9IEFGU19WTF9ORVc7CisJCWF0b21pY19zZXQoJnZsLT51c2FnZSwgMSk7CisJCUlOSVRfTElTVF9IRUFEKCZ2bC0+bGluayk7CisJCUlOSVRfTElTVF9IRUFEKCZ2bC0+Z3JhdmUpOworCQlJTklUX0xJU1RfSEVBRCgmdmwtPnVwZGF0ZSk7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnZsLT53YWl0cSk7CisJCXNwaW5fbG9ja19pbml0KCZ2bC0+bG9jayk7CisJCW1lbWNweSh2bC0+dmxkYi5uYW1lLCBuYW1lLCBuYW1lc3opOworCX0KKworCV9sZWF2ZSgiID0gJXAiLCB2bCk7CisJcmV0dXJuIHZsOworfQorCisvKgorICogdXBkYXRlIHJlY29yZCBpZiB3ZSBmb3VuZCBpdCBpbiB0aGUgY2FjaGUKKyAqLworc3RhdGljIGludCBhZnNfdmxvY2F0aW9uX3VwZGF0ZV9yZWNvcmQoc3RydWN0IGFmc192bG9jYXRpb24gKnZsLAorCQkJCSAgICAgICBzdHJ1Y3Qga2V5ICprZXksCisJCQkJICAgICAgIHN0cnVjdCBhZnNfY2FjaGVfdmxvY2F0aW9uICp2bGRiKQoreworCWFmc192b2x0eXBlX3Qgdm9sdHlwZTsKKwlhZnNfdm9saWRfdCB2aWQ7CisJaW50IHJldDsKKworCS8qIHRyeSB0byBsb29rIHVwIGEgY2FjaGVkIHZvbHVtZSBpbiB0aGUgY2VsbCBWTCBkYXRhYmFzZXMgYnkgSUQgKi8KKwlfZGVidWcoIkxvY2FsbHkgQ2FjaGVkOiAlcyAlMDJ4IHsgJTA4eCgleCkgJTA4eCgleCkgJTA4eCgleCkgfSIsCisJICAgICAgIHZsLT52bGRiLm5hbWUsCisJICAgICAgIHZsLT52bGRiLnZpZG1hc2ssCisJICAgICAgIG50b2hsKHZsLT52bGRiLnNlcnZlcnNbMF0uc19hZGRyKSwKKwkgICAgICAgdmwtPnZsZGIuc3J2dG1hc2tbMF0sCisJICAgICAgIG50b2hsKHZsLT52bGRiLnNlcnZlcnNbMV0uc19hZGRyKSwKKwkgICAgICAgdmwtPnZsZGIuc3J2dG1hc2tbMV0sCisJICAgICAgIG50b2hsKHZsLT52bGRiLnNlcnZlcnNbMl0uc19hZGRyKSwKKwkgICAgICAgdmwtPnZsZGIuc3J2dG1hc2tbMl0pOworCisJX2RlYnVnKCJWaWRzOiAlMDh4ICUwOHggJTA4eCIsCisJICAgICAgIHZsLT52bGRiLnZpZFswXSwKKwkgICAgICAgdmwtPnZsZGIudmlkWzFdLAorCSAgICAgICB2bC0+dmxkYi52aWRbMl0pOworCisJaWYgKHZsLT52bGRiLnZpZG1hc2sgJiBBRlNfVk9MX1ZUTV9SVykgeworCQl2aWQgPSB2bC0+dmxkYi52aWRbMF07CisJCXZvbHR5cGUgPSBBRlNWTF9SV1ZPTDsKKwl9IGVsc2UgaWYgKHZsLT52bGRiLnZpZG1hc2sgJiBBRlNfVk9MX1ZUTV9STykgeworCQl2aWQgPSB2bC0+dmxkYi52aWRbMV07CisJCXZvbHR5cGUgPSBBRlNWTF9ST1ZPTDsKKwl9IGVsc2UgaWYgKHZsLT52bGRiLnZpZG1hc2sgJiBBRlNfVk9MX1ZUTV9CQUspIHsKKwkJdmlkID0gdmwtPnZsZGIudmlkWzJdOworCQl2b2x0eXBlID0gQUZTVkxfQkFDS1ZPTDsKKwl9IGVsc2UgeworCQlCVUcoKTsKKwkJdmlkID0gMDsKKwkJdm9sdHlwZSA9IDA7CisJfQorCisJLyogY29udGFjdCB0aGUgc2VydmVyIHRvIG1ha2Ugc3VyZSB0aGUgdm9sdW1lIGlzIHN0aWxsIGF2YWlsYWJsZQorCSAqIC0gVE9ETzogbmVlZCB0byBoYW5kbGUgZGlzY29ubmVjdGVkIG9wZXJhdGlvbiBoZXJlCisJICovCisJcmV0ID0gYWZzX3Zsb2NhdGlvbl9hY2Nlc3NfdmxfYnlfaWQodmwsIGtleSwgdmlkLCB2b2x0eXBlLCB2bGRiKTsKKwlzd2l0Y2ggKHJldCkgeworCQkvKiBuZXQgZXJyb3IgKi8KKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9XQVJOSU5HICJrQUZTOiIKKwkJICAgICAgICIgZmFpbGVkIHRvIHVwZGF0ZSB2b2x1bWUgJyVzJyAoJXgpIHVwIGluICclcyc6ICVkXG4iLAorCQkgICAgICAgdmwtPnZsZGIubmFtZSwgdmlkLCB2bC0+Y2VsbC0+bmFtZSwgcmV0KTsKKwkJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJCXJldHVybiByZXQ7CisKKwkJLyogcHVsbGVkIGZyb20gbG9jYWwgY2FjaGUgaW50byBtZW1vcnkgKi8KKwljYXNlIDA6CisJCV9sZWF2ZSgiID0gMCIpOworCQlyZXR1cm4gMDsKKworCQkvKiB1aCBvaC4uLiBsb29rcyBsaWtlIHRoZSB2b2x1bWUgZ290IGRlbGV0ZWQgKi8KKwljYXNlIC1FTk9NRURJVU06CisJCXByaW50ayhLRVJOX0VSUiAia0FGUzoiCisJCSAgICAgICAiIHZvbHVtZSAnJXMnICgleCkgZG9lcyBub3QgZXhpc3QgJyVzJ1xuIiwKKwkJICAgICAgIHZsLT52bGRiLm5hbWUsIHZpZCwgdmwtPmNlbGwtPm5hbWUpOworCisJCS8qIFRPRE86IG1ha2UgZXhpc3RpbmcgcmVjb3JkIHVuYXZhaWxhYmxlICovCisJCV9sZWF2ZSgiID0gJWQiLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KK30KKworLyoKKyAqIGFwcGx5IHRoZSB1cGRhdGUgdG8gYSBWTCByZWNvcmQKKyAqLworc3RhdGljIHZvaWQgYWZzX3Zsb2NhdGlvbl9hcHBseV91cGRhdGUoc3RydWN0IGFmc192bG9jYXRpb24gKnZsLAorCQkJCSAgICAgICBzdHJ1Y3QgYWZzX2NhY2hlX3Zsb2NhdGlvbiAqdmxkYikKK3sKKwlfZGVidWcoIkRvbmUgVkwgTG9va3VwOiAlcyAlMDJ4IHsgJTA4eCgleCkgJTA4eCgleCkgJTA4eCgleCkgfSIsCisJICAgICAgIHZsZGItPm5hbWUsIHZsZGItPnZpZG1hc2ssCisJICAgICAgIG50b2hsKHZsZGItPnNlcnZlcnNbMF0uc19hZGRyKSwgdmxkYi0+c3J2dG1hc2tbMF0sCisJICAgICAgIG50b2hsKHZsZGItPnNlcnZlcnNbMV0uc19hZGRyKSwgdmxkYi0+c3J2dG1hc2tbMV0sCisJICAgICAgIG50b2hsKHZsZGItPnNlcnZlcnNbMl0uc19hZGRyKSwgdmxkYi0+c3J2dG1hc2tbMl0pOworCisJX2RlYnVnKCJWaWRzOiAlMDh4ICUwOHggJTA4eCIsCisJICAgICAgIHZsZGItPnZpZFswXSwgdmxkYi0+dmlkWzFdLCB2bGRiLT52aWRbMl0pOworCisJaWYgKHN0cmNtcCh2bGRiLT5uYW1lLCB2bC0+dmxkYi5uYW1lKSAhPSAwKQorCQlwcmludGsoS0VSTl9OT1RJQ0UgImtBRlM6IgorCQkgICAgICAgIiBuYW1lIG9mIHZvbHVtZSAnJXMnIGNoYW5nZWQgdG8gJyVzJyBvbiBzZXJ2ZXJcbiIsCisJCSAgICAgICB2bC0+dmxkYi5uYW1lLCB2bGRiLT5uYW1lKTsKKworCXZsLT52bGRiID0gKnZsZGI7CisKKyNpZmRlZiBBRlNfQ0FDSElOR19TVVBQT1JUCisJLyogdXBkYXRlIHZvbHVtZSBlbnRyeSBpbiBsb2NhbCBjYWNoZSAqLworCWNhY2hlZnNfdXBkYXRlX2Nvb2tpZSh2bC0+Y2FjaGUpOworI2VuZGlmCit9CisKKy8qCisgKiBmaWxsIGluIGEgdm9sdW1lIGxvY2F0aW9uIHJlY29yZCwgY29uc3VsdGluZyB0aGUgY2FjaGUgYW5kIHRoZSBWTCBzZXJ2ZXIKKyAqIGJvdGgKKyAqLworc3RhdGljIGludCBhZnNfdmxvY2F0aW9uX2ZpbGxfaW5fcmVjb3JkKHN0cnVjdCBhZnNfdmxvY2F0aW9uICp2bCwKKwkJCQkJc3RydWN0IGtleSAqa2V5KQoreworCXN0cnVjdCBhZnNfY2FjaGVfdmxvY2F0aW9uIHZsZGI7CisJaW50IHJldDsKKworCV9lbnRlcigiIik7CisKKwlBU1NFUlRDTVAodmwtPnZhbGlkLCA9PSwgMCk7CisKKwltZW1zZXQoJnZsZGIsIDAsIHNpemVvZih2bGRiKSk7CisKKwkvKiBzZWUgaWYgd2UgaGF2ZSBhbiBpbi1jYWNoZSBjb3B5ICh3aWxsIHNldCB2bC0+dmFsaWQgaWYgdGhlcmUgaXMpICovCisjaWZkZWYgQUZTX0NBQ0hJTkdfU1VQUE9SVAorCWNhY2hlZnNfYWNxdWlyZV9jb29raWUoY2VsbC0+Y2FjaGUsCisJCQkgICAgICAgJmFmc192b2x1bWVfY2FjaGVfaW5kZXhfZGVmLAorCQkJICAgICAgIHZsb2NhdGlvbiwKKwkJCSAgICAgICAmdmwtPmNhY2hlKTsKKyNlbmRpZgorCisJaWYgKHZsLT52YWxpZCkgeworCQkvKiB0cnkgdG8gdXBkYXRlIGEga25vd24gdm9sdW1lIGluIHRoZSBjZWxsIFZMIGRhdGFiYXNlcyBieQorCQkgKiBJRCBhcyB0aGUgbmFtZSBtYXkgaGF2ZSBjaGFuZ2VkICovCisJCV9kZWJ1ZygiZm91bmQgaW4gY2FjaGUiKTsKKwkJcmV0ID0gYWZzX3Zsb2NhdGlvbl91cGRhdGVfcmVjb3JkKHZsLCBrZXksICZ2bGRiKTsKKwl9IGVsc2UgeworCQkvKiB0cnkgdG8gbG9vayB1cCBhbiB1bmtub3duIHZvbHVtZSBpbiB0aGUgY2VsbCBWTCBkYXRhYmFzZXMgYnkKKwkJICogbmFtZSAqLworCQlyZXQgPSBhZnNfdmxvY2F0aW9uX2FjY2Vzc192bF9ieV9uYW1lKHZsLCBrZXksICZ2bGRiKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXByaW50aygia0FGUzogZmFpbGVkIHRvIGxvY2F0ZSAnJXMnIGluIGNlbGwgJyVzJ1xuIiwKKwkJCSAgICAgICB2bC0+dmxkYi5uYW1lLCB2bC0+Y2VsbC0+bmFtZSk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJYWZzX3Zsb2NhdGlvbl9hcHBseV91cGRhdGUodmwsICZ2bGRiKTsKKwlfbGVhdmUoIiA9IDAiKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHF1ZXVlIGEgdmxvY2F0aW9uIHJlY29yZCBmb3IgdXBkYXRlcworICovCit2b2lkIGFmc192bG9jYXRpb25fcXVldWVfZm9yX3VwZGF0ZXMoc3RydWN0IGFmc192bG9jYXRpb24gKnZsKQoreworCXN0cnVjdCBhZnNfdmxvY2F0aW9uICp4dmw7CisKKwkvKiB3YWl0IGF0IGxlYXN0IDEwIG1pbnV0ZXMgYmVmb3JlIHVwZGF0aW5nLi4uICovCisJdmwtPnVwZGF0ZV9hdCA9IGdldF9zZWNvbmRzKCkgKyBhZnNfdmxvY2F0aW9uX3VwZGF0ZV90aW1lb3V0OworCisJc3Bpbl9sb2NrKCZhZnNfdmxvY2F0aW9uX3VwZGF0ZXNfbG9jayk7CisKKwlpZiAoIWxpc3RfZW1wdHkoJmFmc192bG9jYXRpb25fdXBkYXRlcykpIHsKKwkJLyogLi4uIGJ1dCB3YWl0IGF0IGxlYXN0IDEgc2Vjb25kIG1vcmUgdGhhbiB0aGUgbmV3ZXN0IHJlY29yZAorCQkgKiBhbHJlYWR5IHF1ZXVlZCBzbyB0aGF0IHdlIGRvbid0IHNwYW0gdGhlIFZMIHNlcnZlciBzdWRkZW5seQorCQkgKiB3aXRoIGxvdHMgb2YgcmVxdWVzdHMKKwkJICovCisJCXh2bCA9IGxpc3RfZW50cnkoYWZzX3Zsb2NhdGlvbl91cGRhdGVzLnByZXYsCisJCQkJIHN0cnVjdCBhZnNfdmxvY2F0aW9uLCB1cGRhdGUpOworCQlpZiAodmwtPnVwZGF0ZV9hdCA8PSB4dmwtPnVwZGF0ZV9hdCkKKwkJCXZsLT51cGRhdGVfYXQgPSB4dmwtPnVwZGF0ZV9hdCArIDE7CisJfSBlbHNlIHsKKwkJcXVldWVfZGVsYXllZF93b3JrKGFmc192bG9jYXRpb25fdXBkYXRlX3dvcmtlciwKKwkJCQkgICAmYWZzX3Zsb2NhdGlvbl91cGRhdGUsCisJCQkJICAgYWZzX3Zsb2NhdGlvbl91cGRhdGVfdGltZW91dCAqIEhaKTsKKwl9CisKKwlsaXN0X2FkZF90YWlsKCZ2bC0+dXBkYXRlLCAmYWZzX3Zsb2NhdGlvbl91cGRhdGVzKTsKKwlzcGluX3VubG9jaygmYWZzX3Zsb2NhdGlvbl91cGRhdGVzX2xvY2spOworfQorCiAvKgogICogbG9va3VwIHZvbHVtZSBsb2NhdGlvbgotICogLSBjYWxsZXIgbXVzdCBoYXZlIGNlbGwtPnZvbF9zZW0gd3JpdGUtbG9ja2VkCiAgKiAtIGl0ZXJhdGUgdGhyb3VnaCB0aGUgVkwgc2VydmVycyBpbiBhIGNlbGwgdW50aWwgb25lIG9mIHRoZW0gYWRtaXRzIGtub3dpbmcKICAqICAgYWJvdXQgdGhlIHZvbHVtZSBpbiBxdWVzdGlvbgogICogLSBsb29rdXAgaW4gdGhlIGxvY2FsIGNhY2hlIGlmIG5vdCBhYmxlIHRvIGZpbmQgb24gdGhlIFZMIHNlcnZlcgogICogLSBpbnNlcnQvdXBkYXRlIGluIHRoZSBsb2NhbCBjYWNoZSBpZiBkaWQgZ2V0IGEgVkwgcmVzcG9uc2UKICAqLwotaW50IGFmc192bG9jYXRpb25fbG9va3VwKHN0cnVjdCBhZnNfY2VsbCAqY2VsbCwKLQkJCSBjb25zdCBjaGFyICpuYW1lLAotCQkJIHVuc2lnbmVkIG5hbWVzeiwKLQkJCSBzdHJ1Y3QgYWZzX3Zsb2NhdGlvbiAqKl92bG9jYXRpb24pCitzdHJ1Y3QgYWZzX3Zsb2NhdGlvbiAqYWZzX3Zsb2NhdGlvbl9sb29rdXAoc3RydWN0IGFmc19jZWxsICpjZWxsLAorCQkJCQkgICBzdHJ1Y3Qga2V5ICprZXksCisJCQkJCSAgIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJCSAgIHNpemVfdCBuYW1lc3opCiB7Ci0Jc3RydWN0IGFmc19jYWNoZV92bG9jYXRpb24gdmxkYjsKLQlzdHJ1Y3QgYWZzX3Zsb2NhdGlvbiAqdmxvY2F0aW9uOwotCWFmc192b2x0eXBlX3Qgdm9sdHlwZTsKLQlhZnNfdm9saWRfdCB2aWQ7Ci0JaW50IGFjdGl2ZSA9IDAsIHJldDsKKwlzdHJ1Y3QgYWZzX3Zsb2NhdGlvbiAqdmw7CisJaW50IHJldDsKIAotCV9lbnRlcigieyVzfSwlKi4qcywldSwiLCBjZWxsLT5uYW1lLCBuYW1lc3osIG5hbWVzeiwgbmFtZSwgbmFtZXN6KTsKKwlfZW50ZXIoInslc30seyV4fSwlKi4qcywlenUiLAorCSAgICAgICBjZWxsLT5uYW1lLCBrZXlfc2VyaWFsKGtleSksCisJICAgICAgIChpbnQpIG5hbWVzeiwgKGludCkgbmFtZXN6LCBuYW1lLCBuYW1lc3opOwogCi0JaWYgKG5hbWVzeiA+IHNpemVvZih2bG9jYXRpb24tPnZsZGIubmFtZSkpIHsKKwlpZiAobmFtZXN6ID4gc2l6ZW9mKHZsLT52bGRiLm5hbWUpKSB7CiAJCV9sZWF2ZSgiID0gLUVOQU1FVE9PTE9ORyIpOwotCQlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOQU1FVE9PTE9ORyk7CiAJfQogCi0JLyogc2VhcmNoIHRoZSBjZWxsJ3MgYWN0aXZlIGxpc3QgZmlyc3QgKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHZsb2NhdGlvbiwgJmNlbGwtPnZsX2xpc3QsIGxpbmspIHsKLQkJaWYgKG5hbWVzeiA8IHNpemVvZih2bG9jYXRpb24tPnZsZGIubmFtZSkgJiYKLQkJICAgIHZsb2NhdGlvbi0+dmxkYi5uYW1lW25hbWVzel0gIT0gJ1wwJykKKwkvKiBzZWUgaWYgd2UgaGF2ZSBhbiBpbi1tZW1vcnkgY29weSBmaXJzdCAqLworCWRvd25fd3JpdGUoJmNlbGwtPnZsX3NlbSk7CisJc3Bpbl9sb2NrKCZjZWxsLT52bF9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHZsLCAmY2VsbC0+dmxfbGlzdCwgbGluaykgeworCQlpZiAodmwtPnZsZGIubmFtZVtuYW1lc3pdICE9ICdcMCcpCiAJCQljb250aW51ZTsKLQotCQlpZiAobWVtY21wKHZsb2NhdGlvbi0+dmxkYi5uYW1lLCBuYW1lLCBuYW1lc3opID09IDApCisJCWlmIChtZW1jbXAodmwtPnZsZGIubmFtZSwgbmFtZSwgbmFtZXN6KSA9PSAwKQogCQkJZ290byBmb3VuZF9pbl9tZW1vcnk7CiAJfQotCi0JLyogc2VhcmNoIHRoZSBjZWxsJ3MgZ3JhdmV5YXJkIGxpc3Qgc2Vjb25kICovCi0Jc3Bpbl9sb2NrKCZjZWxsLT52bF9neWxvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnkodmxvY2F0aW9uLCAmY2VsbC0+dmxfZ3JhdmV5YXJkLCBsaW5rKSB7Ci0JCWlmIChuYW1lc3ogPCBzaXplb2YodmxvY2F0aW9uLT52bGRiLm5hbWUpICYmCi0JCSAgICB2bG9jYXRpb24tPnZsZGIubmFtZVtuYW1lc3pdICE9ICdcMCcpCi0JCQljb250aW51ZTsKLQotCQlpZiAobWVtY21wKHZsb2NhdGlvbi0+dmxkYi5uYW1lLCBuYW1lLCBuYW1lc3opID09IDApCi0JCQlnb3RvIGZvdW5kX2luX2dyYXZleWFyZDsKLQl9Ci0Jc3Bpbl91bmxvY2soJmNlbGwtPnZsX2d5bG9jayk7CisJc3Bpbl91bmxvY2soJmNlbGwtPnZsX2xvY2spOwogCiAJLyogbm90IGluIHRoZSBjZWxsJ3MgaW4tbWVtb3J5IGxpc3RzIC0gY3JlYXRlIGEgbmV3IHJlY29yZCAqLwotCXZsb2NhdGlvbiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhZnNfdmxvY2F0aW9uKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCF2bG9jYXRpb24pCi0JCXJldHVybiAtRU5PTUVNOwotCi0JYXRvbWljX3NldCgmdmxvY2F0aW9uLT51c2FnZSwgMSk7Ci0JSU5JVF9MSVNUX0hFQUQoJnZsb2NhdGlvbi0+bGluayk7Ci0Jcndsb2NrX2luaXQoJnZsb2NhdGlvbi0+bG9jayk7Ci0JbWVtY3B5KHZsb2NhdGlvbi0+dmxkYi5uYW1lLCBuYW1lLCBuYW1lc3opOwotCi0JYWZzX3RpbWVyX2luaXQoJnZsb2NhdGlvbi0+dGltZW91dCwgJmFmc192bG9jYXRpb25fdGltZXJfb3BzKTsKLQlhZnNfdGltZXJfaW5pdCgmdmxvY2F0aW9uLT51cGRfdGltZXIsICZhZnNfdmxvY2F0aW9uX3VwZGF0ZV90aW1lcl9vcHMpOwotCWFmc19hc3luY19vcF9pbml0KCZ2bG9jYXRpb24tPnVwZF9vcCwgJmFmc192bG9jYXRpb25fdXBkYXRlX29wX29wcyk7CisJdmwgPSBhZnNfdmxvY2F0aW9uX2FsbG9jKGNlbGwsIG5hbWUsIG5hbWVzeik7CisJaWYgKCF2bCkgeworCQl1cF93cml0ZSgmY2VsbC0+dmxfc2VtKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJfQogCiAJYWZzX2dldF9jZWxsKGNlbGwpOwotCXZsb2NhdGlvbi0+Y2VsbCA9IGNlbGw7CiAKLQlsaXN0X2FkZF90YWlsKCZ2bG9jYXRpb24tPmxpbmssICZjZWxsLT52bF9saXN0KTsKKwlsaXN0X2FkZF90YWlsKCZ2bC0+bGluaywgJmNlbGwtPnZsX2xpc3QpOworCXZsLT5zdGF0ZSA9IEFGU19WTF9DUkVBVElORzsKKwl1cF93cml0ZSgmY2VsbC0+dmxfc2VtKTsKIAotI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKLQkvKiB3ZSB3YW50IHRvIHN0b3JlIGl0IGluIHRoZSBjYWNoZSwgcGx1cyBpdCBtaWdodCBhbHJlYWR5IGJlCi0JICogZW5jYWNoZWQgKi8KLQljYWNoZWZzX2FjcXVpcmVfY29va2llKGNlbGwtPmNhY2hlLAotCQkJICAgICAgICZhZnNfdm9sdW1lX2NhY2hlX2luZGV4X2RlZiwKLQkJCSAgICAgICB2bG9jYXRpb24sCi0JCQkgICAgICAgJnZsb2NhdGlvbi0+Y2FjaGUpOwotCi0JaWYgKHZsb2NhdGlvbi0+dmFsaWQpCi0JCWdvdG8gZm91bmRfaW5fY2FjaGU7Ci0jZW5kaWYKLQotCS8qIHRyeSB0byBsb29rIHVwIGFuIHVua25vd24gdm9sdW1lIGluIHRoZSBjZWxsIFZMIGRhdGFiYXNlcyBieSBuYW1lICovCi0JcmV0ID0gYWZzX3Zsb2NhdGlvbl9hY2Nlc3NfdmxfYnlfbmFtZSh2bG9jYXRpb24sIG5hbWUsIG5hbWVzeiwgJnZsZGIpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50aygia0FGUzogZmFpbGVkIHRvIGxvY2F0ZSAnJSouKnMnIGluIGNlbGwgJyVzJ1xuIiwKLQkJICAgICAgIG5hbWVzeiwgbmFtZXN6LCBuYW1lLCBjZWxsLT5uYW1lKTsKLQkJZ290byBlcnJvcjsKLQl9Ci0KLQlnb3RvIGZvdW5kX29uX3Zsc2VydmVyOwotCi0gZm91bmRfaW5fZ3JhdmV5YXJkOgotCS8qIGZvdW5kIGluIHRoZSBncmF2ZXlhcmQgLSByZXN1cnJlY3QgKi8KLQlfZGVidWcoImZvdW5kIGluIGdyYXZleWFyZCIpOwotCWF0b21pY19pbmMoJnZsb2NhdGlvbi0+dXNhZ2UpOwotCWxpc3RfbW92ZV90YWlsKCZ2bG9jYXRpb24tPmxpbmssICZjZWxsLT52bF9saXN0KTsKLQlzcGluX3VubG9jaygmY2VsbC0+dmxfZ3lsb2NrKTsKLQotCWFmc19rYWZzdGltb2RfZGVsX3RpbWVyKCZ2bG9jYXRpb24tPnRpbWVvdXQpOwotCWdvdG8gYWN0aXZlOwotCi0gZm91bmRfaW5fbWVtb3J5OgotCS8qIGZvdW5kIGluIG1lbW9yeSAtIGNoZWNrIHRvIHNlZSBpZiBpdCdzIGFjdGl2ZSAqLwotCV9kZWJ1ZygiZm91bmQgaW4gbWVtb3J5Iik7Ci0JYXRvbWljX2luYygmdmxvY2F0aW9uLT51c2FnZSk7Ci0KLSBhY3RpdmU6Ci0JYWN0aXZlID0gMTsKLQotI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKLSBmb3VuZF9pbl9jYWNoZToKLSNlbmRpZgotCS8qIHRyeSB0byBsb29rIHVwIGEgY2FjaGVkIHZvbHVtZSBpbiB0aGUgY2VsbCBWTCBkYXRhYmFzZXMgYnkgSUQgKi8KLQlfZGVidWcoImZvdW5kIGluIGNhY2hlIik7Ci0KLQlfZGVidWcoIkxvY2FsbHkgQ2FjaGVkOiAlcyAlMDJ4IHsgJTA4eCgleCkgJTA4eCgleCkgJTA4eCgleCkgfSIsCi0JICAgICAgIHZsb2NhdGlvbi0+dmxkYi5uYW1lLAotCSAgICAgICB2bG9jYXRpb24tPnZsZGIudmlkbWFzaywKLQkgICAgICAgbnRvaGwodmxvY2F0aW9uLT52bGRiLnNlcnZlcnNbMF0uc19hZGRyKSwKLQkgICAgICAgdmxvY2F0aW9uLT52bGRiLnNydnRtYXNrWzBdLAotCSAgICAgICBudG9obCh2bG9jYXRpb24tPnZsZGIuc2VydmVyc1sxXS5zX2FkZHIpLAotCSAgICAgICB2bG9jYXRpb24tPnZsZGIuc3J2dG1hc2tbMV0sCi0JICAgICAgIG50b2hsKHZsb2NhdGlvbi0+dmxkYi5zZXJ2ZXJzWzJdLnNfYWRkciksCi0JICAgICAgIHZsb2NhdGlvbi0+dmxkYi5zcnZ0bWFza1syXQotCSAgICAgICApOwotCi0JX2RlYnVnKCJWaWRzOiAlMDh4ICUwOHggJTA4eCIsCi0JICAgICAgIHZsb2NhdGlvbi0+dmxkYi52aWRbMF0sCi0JICAgICAgIHZsb2NhdGlvbi0+dmxkYi52aWRbMV0sCi0JICAgICAgIHZsb2NhdGlvbi0+dmxkYi52aWRbMl0pOwotCi0JaWYgKHZsb2NhdGlvbi0+dmxkYi52aWRtYXNrICYgQUZTX1ZPTF9WVE1fUlcpIHsKLQkJdmlkID0gdmxvY2F0aW9uLT52bGRiLnZpZFswXTsKLQkJdm9sdHlwZSA9IEFGU1ZMX1JXVk9MOwotCX0KLQllbHNlIGlmICh2bG9jYXRpb24tPnZsZGIudmlkbWFzayAmIEFGU19WT0xfVlRNX1JPKSB7Ci0JCXZpZCA9IHZsb2NhdGlvbi0+dmxkYi52aWRbMV07Ci0JCXZvbHR5cGUgPSBBRlNWTF9ST1ZPTDsKLQl9Ci0JZWxzZSBpZiAodmxvY2F0aW9uLT52bGRiLnZpZG1hc2sgJiBBRlNfVk9MX1ZUTV9CQUspIHsKLQkJdmlkID0gdmxvY2F0aW9uLT52bGRiLnZpZFsyXTsKLQkJdm9sdHlwZSA9IEFGU1ZMX0JBQ0tWT0w7Ci0JfQotCWVsc2UgewotCQlCVUcoKTsKLQkJdmlkID0gMDsKLQkJdm9sdHlwZSA9IDA7Ci0JfQotCi0JcmV0ID0gYWZzX3Zsb2NhdGlvbl9hY2Nlc3NfdmxfYnlfaWQodmxvY2F0aW9uLCB2aWQsIHZvbHR5cGUsICZ2bGRiKTsKLQlzd2l0Y2ggKHJldCkgewotCQkvKiBuZXQgZXJyb3IgKi8KLQlkZWZhdWx0OgotCQlwcmludGsoImtBRlM6IGZhaWxlZCB0byB2b2x1bWUgJyUqLipzJyAoJXgpIHVwIGluICclcyc6ICVkXG4iLAotCQkgICAgICAgbmFtZXN6LCBuYW1lc3osIG5hbWUsIHZpZCwgY2VsbC0+bmFtZSwgcmV0KTsKLQkJZ290byBlcnJvcjsKLQotCQkvKiBwdWxsZWQgZnJvbSBsb2NhbCBjYWNoZSBpbnRvIG1lbW9yeSAqLwotCWNhc2UgMDoKLQkJZ290byBmb3VuZF9vbl92bHNlcnZlcjsKLQotCQkvKiB1aCBvaC4uLiBsb29rcyBsaWtlIHRoZSB2b2x1bWUgZ290IGRlbGV0ZWQgKi8KLQljYXNlIC1FTk9NRURJVU06Ci0JCXByaW50aygia0FGUzogdm9sdW1lICclKi4qcycgKCV4KSBkb2VzIG5vdCBleGlzdCAnJXMnXG4iLAotCQkgICAgICAgbmFtZXN6LCBuYW1lc3osIG5hbWUsIHZpZCwgY2VsbC0+bmFtZSk7Ci0KLQkJLyogVE9ETzogbWFrZSBleGlzdGluZyByZWNvcmQgdW5hdmFpbGFibGUgKi8KLQkJZ290byBlcnJvcjsKLQl9Ci0KLSBmb3VuZF9vbl92bHNlcnZlcjoKLQlfZGVidWcoIkRvbmUgVkwgTG9va3VwOiAlKi4qcyAlMDJ4IHsgJTA4eCgleCkgJTA4eCgleCkgJTA4eCgleCkgfSIsCi0JICAgICAgIG5hbWVzeiwgbmFtZXN6LCBuYW1lLAotCSAgICAgICB2bGRiLnZpZG1hc2ssCi0JICAgICAgIG50b2hsKHZsZGIuc2VydmVyc1swXS5zX2FkZHIpLCB2bGRiLnNydnRtYXNrWzBdLAotCSAgICAgICBudG9obCh2bGRiLnNlcnZlcnNbMV0uc19hZGRyKSwgdmxkYi5zcnZ0bWFza1sxXSwKLQkgICAgICAgbnRvaGwodmxkYi5zZXJ2ZXJzWzJdLnNfYWRkciksIHZsZGIuc3J2dG1hc2tbMl0KLQkgICAgICAgKTsKLQotCV9kZWJ1ZygiVmlkczogJTA4eCAlMDh4ICUwOHgiLCB2bGRiLnZpZFswXSwgdmxkYi52aWRbMV0sIHZsZGIudmlkWzJdKTsKLQotCWlmICgobmFtZXN6IDwgc2l6ZW9mKHZsb2NhdGlvbi0+dmxkYi5uYW1lKSAmJgotCSAgICAgdmxvY2F0aW9uLT52bGRiLm5hbWVbbmFtZXN6XSAhPSAnXDAnKSB8fAotCSAgICBtZW1jbXAodmxkYi5uYW1lLCBuYW1lLCBuYW1lc3opICE9IDApCi0JCXByaW50aygia0FGUzogbmFtZSBvZiB2b2x1bWUgJyUqLipzJyBjaGFuZ2VkIHRvICclcycgb24gc2VydmVyXG4iLAotCQkgICAgICAgbmFtZXN6LCBuYW1lc3osIG5hbWUsIHZsZGIubmFtZSk7Ci0KLQltZW1jcHkoJnZsb2NhdGlvbi0+dmxkYiwgJnZsZGIsIHNpemVvZih2bG9jYXRpb24tPnZsZGIpKTsKLQotCWFmc19rYWZzdGltb2RfYWRkX3RpbWVyKCZ2bG9jYXRpb24tPnVwZF90aW1lciwgMTAgKiBIWik7Ci0KLSNpZmRlZiBBRlNfQ0FDSElOR19TVVBQT1JUCi0JLyogdXBkYXRlIHZvbHVtZSBlbnRyeSBpbiBsb2NhbCBjYWNoZSAqLwotCWNhY2hlZnNfdXBkYXRlX2Nvb2tpZSh2bG9jYXRpb24tPmNhY2hlKTsKLSNlbmRpZgotCi0JKl92bG9jYXRpb24gPSB2bG9jYXRpb247Ci0JX2xlYXZlKCIgPSAwICglcCkiLHZsb2NhdGlvbik7Ci0JcmV0dXJuIDA7Ci0KLSBlcnJvcjoKLQlpZiAodmxvY2F0aW9uKSB7Ci0JCWlmIChhY3RpdmUpIHsKLQkJCV9fYWZzX3B1dF92bG9jYXRpb24odmxvY2F0aW9uKTsKLQkJfQotCQllbHNlIHsKLQkJCWxpc3RfZGVsKCZ2bG9jYXRpb24tPmxpbmspOwotI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKLQkJCWNhY2hlZnNfcmVsaW5xdWlzaF9jb29raWUodmxvY2F0aW9uLT5jYWNoZSwgMCk7Ci0jZW5kaWYKLQkJCWFmc19wdXRfY2VsbCh2bG9jYXRpb24tPmNlbGwpOwotCQkJa2ZyZWUodmxvY2F0aW9uKTsKLQkJfQotCX0KLQotCV9sZWF2ZSgiID0gJWQiLCByZXQpOwotCXJldHVybiByZXQ7Ci19IC8qIGVuZCBhZnNfdmxvY2F0aW9uX2xvb2t1cCgpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBmaW5pc2ggdXNpbmcgYSB2b2x1bWUgbG9jYXRpb24gcmVjb3JkCi0gKiAtIGNhbGxlciBtdXN0IGhhdmUgY2VsbC0+dm9sX3NlbSB3cml0ZS1sb2NrZWQKLSAqLwotc3RhdGljIHZvaWQgX19hZnNfcHV0X3Zsb2NhdGlvbihzdHJ1Y3QgYWZzX3Zsb2NhdGlvbiAqdmxvY2F0aW9uKQotewotCXN0cnVjdCBhZnNfY2VsbCAqY2VsbDsKLQotCWlmICghdmxvY2F0aW9uKQotCQlyZXR1cm47Ci0KLQlfZW50ZXIoIiVzIiwgdmxvY2F0aW9uLT52bGRiLm5hbWUpOwotCi0JY2VsbCA9IHZsb2NhdGlvbi0+Y2VsbDsKLQotCS8qIHNhbml0eSBjaGVjayAqLwotCUJVR19PTihhdG9taWNfcmVhZCgmdmxvY2F0aW9uLT51c2FnZSkgPD0gMCk7Ci0KLQlzcGluX2xvY2soJmNlbGwtPnZsX2d5bG9jayk7Ci0JaWYgKGxpa2VseSghYXRvbWljX2RlY19hbmRfdGVzdCgmdmxvY2F0aW9uLT51c2FnZSkpKSB7Ci0JCXNwaW5fdW5sb2NrKCZjZWxsLT52bF9neWxvY2spOwotCQlfbGVhdmUoIiIpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogbW92ZSB0byBncmF2ZXlhcmQgcXVldWUgKi8KLQlsaXN0X21vdmVfdGFpbCgmdmxvY2F0aW9uLT5saW5rLCZjZWxsLT52bF9ncmF2ZXlhcmQpOwotCi0JLyogcmVtb3ZlIGZyb20gcGVuZGluZyB0aW1lb3V0IHF1ZXVlIChyZWZjb3VudGVkIGlmIGFjdHVhbGx5IGJlaW5nCi0JICogdXBkYXRlZCkgKi8KLQlsaXN0X2RlbF9pbml0KCZ2bG9jYXRpb24tPnVwZF9vcC5saW5rKTsKLQotCS8qIHRpbWUgb3V0IGluIDEwIHNlY3MgKi8KLQlhZnNfa2Fmc3RpbW9kX2RlbF90aW1lcigmdmxvY2F0aW9uLT51cGRfdGltZXIpOwotCWFmc19rYWZzdGltb2RfYWRkX3RpbWVyKCZ2bG9jYXRpb24tPnRpbWVvdXQsIDEwICogSFopOwotCi0Jc3Bpbl91bmxvY2soJmNlbGwtPnZsX2d5bG9jayk7Ci0KLQlfbGVhdmUoIiBba2lsbGVkXSIpOwotfSAvKiBlbmQgX19hZnNfcHV0X3Zsb2NhdGlvbigpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBmaW5pc2ggdXNpbmcgYSB2b2x1bWUgbG9jYXRpb24gcmVjb3JkCi0gKi8KLXZvaWQgYWZzX3B1dF92bG9jYXRpb24oc3RydWN0IGFmc192bG9jYXRpb24gKnZsb2NhdGlvbikKLXsKLQlpZiAodmxvY2F0aW9uKSB7Ci0JCXN0cnVjdCBhZnNfY2VsbCAqY2VsbCA9IHZsb2NhdGlvbi0+Y2VsbDsKLQotCQlkb3duX3dyaXRlKCZjZWxsLT52bF9zZW0pOwotCQlfX2Fmc19wdXRfdmxvY2F0aW9uKHZsb2NhdGlvbik7Ci0JCXVwX3dyaXRlKCZjZWxsLT52bF9zZW0pOwotCX0KLX0gLyogZW5kIGFmc19wdXRfdmxvY2F0aW9uKCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIHRpbWVvdXQgdmxvY2F0aW9uIHJlY29yZAotICogLSByZW1vdmVzIGZyb20gdGhlIGNlbGwncyBncmF2ZXlhcmQgaWYgdGhlIHVzYWdlIGNvdW50IGlzIHplcm8KLSAqLwotdm9pZCBhZnNfdmxvY2F0aW9uX2RvX3RpbWVvdXQoc3RydWN0IGFmc192bG9jYXRpb24gKnZsb2NhdGlvbikKLXsKLQlzdHJ1Y3QgYWZzX2NlbGwgKmNlbGw7Ci0KLQlfZW50ZXIoIiVzIiwgdmxvY2F0aW9uLT52bGRiLm5hbWUpOwotCi0JY2VsbCA9IHZsb2NhdGlvbi0+Y2VsbDsKLQotCUJVR19PTihhdG9taWNfcmVhZCgmdmxvY2F0aW9uLT51c2FnZSkgPCAwKTsKLQotCS8qIHJlbW92ZSBmcm9tIGdyYXZleWFyZCBpZiBzdGlsbCBkZWFkICovCi0Jc3Bpbl9sb2NrKCZjZWxsLT52bF9neWxvY2spOwotCWlmIChhdG9taWNfcmVhZCgmdmxvY2F0aW9uLT51c2FnZSkgPT0gMCkKLQkJbGlzdF9kZWxfaW5pdCgmdmxvY2F0aW9uLT5saW5rKTsKLQllbHNlCi0JCXZsb2NhdGlvbiA9IE5VTEw7Ci0Jc3Bpbl91bmxvY2soJmNlbGwtPnZsX2d5bG9jayk7Ci0KLQlpZiAoIXZsb2NhdGlvbikgewotCQlfbGVhdmUoIiIpOwotCQlyZXR1cm47IC8qIHJlc3VycmVjdGVkICovCi0JfQotCi0JLyogd2UgY2FuIG5vdyBkZXN0cm95IGl0IHByb3Blcmx5ICovCi0jaWZkZWYgQUZTX0NBQ0hJTkdfU1VQUE9SVAotCWNhY2hlZnNfcmVsaW5xdWlzaF9jb29raWUodmxvY2F0aW9uLT5jYWNoZSwgMCk7Ci0jZW5kaWYKLQlhZnNfcHV0X2NlbGwoY2VsbCk7Ci0KLQlrZnJlZSh2bG9jYXRpb24pOwotCi0JX2xlYXZlKCIgW2Rlc3Ryb3llZF0iKTsKLX0gLyogZW5kIGFmc192bG9jYXRpb25fZG9fdGltZW91dCgpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBzZW5kIGFuIHVwZGF0ZSBvcGVyYXRpb24gdG8gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBzZXJ2ZXIKLSAqLwotc3RhdGljIGludCBhZnNfdmxvY2F0aW9uX3VwZGF0ZV9iZWdpbihzdHJ1Y3QgYWZzX3Zsb2NhdGlvbiAqdmxvY2F0aW9uKQotewotCWFmc192b2x0eXBlX3Qgdm9sdHlwZTsKLQlhZnNfdm9saWRfdCB2aWQ7Ci0JaW50IHJldDsKLQotCV9lbnRlcigiJXN7dWZzPSV1IHVjcz0ldX0iLAotCSAgICAgICB2bG9jYXRpb24tPnZsZGIubmFtZSwKLQkgICAgICAgdmxvY2F0aW9uLT51cGRfZmlyc3Rfc3ZpeCwKLQkgICAgICAgdmxvY2F0aW9uLT51cGRfY3Vycl9zdml4KTsKLQotCS8qIHRyeSB0byBsb29rIHVwIGEgY2FjaGVkIHZvbHVtZSBpbiB0aGUgY2VsbCBWTCBkYXRhYmFzZXMgYnkgSUQgKi8KLQlpZiAodmxvY2F0aW9uLT52bGRiLnZpZG1hc2sgJiBBRlNfVk9MX1ZUTV9SVykgewotCQl2aWQgPSB2bG9jYXRpb24tPnZsZGIudmlkWzBdOwotCQl2b2x0eXBlID0gQUZTVkxfUldWT0w7Ci0JfQotCWVsc2UgaWYgKHZsb2NhdGlvbi0+dmxkYi52aWRtYXNrICYgQUZTX1ZPTF9WVE1fUk8pIHsKLQkJdmlkID0gdmxvY2F0aW9uLT52bGRiLnZpZFsxXTsKLQkJdm9sdHlwZSA9IEFGU1ZMX1JPVk9MOwotCX0KLQllbHNlIGlmICh2bG9jYXRpb24tPnZsZGIudmlkbWFzayAmIEFGU19WT0xfVlRNX0JBSykgewotCQl2aWQgPSB2bG9jYXRpb24tPnZsZGIudmlkWzJdOwotCQl2b2x0eXBlID0gQUZTVkxfQkFDS1ZPTDsKLQl9Ci0JZWxzZSB7Ci0JCUJVRygpOwotCQl2aWQgPSAwOwotCQl2b2x0eXBlID0gMDsKLQl9Ci0KLQkvKiBjb250YWN0IHRoZSBjaG9zZW4gc2VydmVyICovCi0JcmV0ID0gYWZzX3NlcnZlcl9sb29rdXAoCi0JCXZsb2NhdGlvbi0+Y2VsbCwKLQkJJnZsb2NhdGlvbi0+Y2VsbC0+dmxfYWRkcnNbdmxvY2F0aW9uLT51cGRfY3Vycl9zdml4XSwKLQkJJnZsb2NhdGlvbi0+dXBkX29wLnNlcnZlcik7Ci0KLQlzd2l0Y2ggKHJldCkgewotCWNhc2UgMDoKLQkJYnJlYWs7Ci0JY2FzZSAtRU5PTUVNOgotCWNhc2UgLUVOT05FVDoKLQlkZWZhdWx0OgotCQlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKiBpbml0aWF0ZSB0aGUgdXBkYXRlIG9wZXJhdGlvbiAqLwotCXJldCA9IGFmc19yeHZsX2dldF9lbnRyeV9ieV9pZF9hc3luYygmdmxvY2F0aW9uLT51cGRfb3AsIHZpZCwgdm9sdHlwZSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJX2xlYXZlKCIgPSAlZCIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JX2xlYXZlKCIgPSAlZCIsIHJldCk7Ci0JcmV0dXJuIHJldDsKLX0gLyogZW5kIGFmc192bG9jYXRpb25fdXBkYXRlX2JlZ2luKCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIGFiYW5kb24gdXBkYXRpbmcgYSBWTCByZWNvcmQKLSAqIC0gZG9lcyBub3QgcmVzdGFydCB0aGUgdXBkYXRlIHRpbWVyCi0gKi8KLXN0YXRpYyB2b2lkIGFmc192bG9jYXRpb25fdXBkYXRlX2FiYW5kb24oc3RydWN0IGFmc192bG9jYXRpb24gKnZsb2NhdGlvbiwKLQkJCQkJIGFmc192bG9jYXRpb25fdXBkX3Qgc3RhdGUsCi0JCQkJCSBpbnQgcmV0KQotewotCV9lbnRlcigiJXMsJXUiLCB2bG9jYXRpb24tPnZsZGIubmFtZSwgc3RhdGUpOwotCitmaWxsX2luX3JlY29yZDoKKwlyZXQgPSBhZnNfdmxvY2F0aW9uX2ZpbGxfaW5fcmVjb3JkKHZsLCBrZXkpOwogCWlmIChyZXQgPCAwKQotCQlwcmludGsoImtBRlM6IEFiYW5kb25pbmcgVkwgdXBkYXRlICclcyc6ICVkXG4iLAotCQkgICAgICAgdmxvY2F0aW9uLT52bGRiLm5hbWUsIHJldCk7CisJCWdvdG8gZXJyb3JfYWJhbmRvbjsKKwlzcGluX2xvY2soJnZsLT5sb2NrKTsKKwl2bC0+c3RhdGUgPSBBRlNfVkxfVkFMSUQ7CisJc3Bpbl91bmxvY2soJnZsLT5sb2NrKTsKKwl3YWtlX3VwKCZ2bC0+d2FpdHEpOwogCi0JLyogZGlzY2FyZCB0aGUgc2VydmVyIHJlY29yZCAqLwotCWFmc19wdXRfc2VydmVyKHZsb2NhdGlvbi0+dXBkX29wLnNlcnZlcik7Ci0JdmxvY2F0aW9uLT51cGRfb3Auc2VydmVyID0gTlVMTDsKKwkvKiBzY2hlZHVsZSBmb3IgcmVndWxhciB1cGRhdGVzICovCisJYWZzX3Zsb2NhdGlvbl9xdWV1ZV9mb3JfdXBkYXRlcyh2bCk7CisJZ290byBzdWNjZXNzOwogCi0Jc3Bpbl9sb2NrKCZhZnNfdmxvY2F0aW9uX3VwZGF0ZV9sb2NrKTsKLQlhZnNfdmxvY2F0aW9uX3VwZGF0ZSA9IE5VTEw7Ci0JdmxvY2F0aW9uLT51cGRfc3RhdGUgPSBzdGF0ZTsKK2ZvdW5kX2luX21lbW9yeToKKwkvKiBmb3VuZCBpbiBtZW1vcnkgKi8KKwlfZGVidWcoImZvdW5kIGluIG1lbW9yeSIpOworCWF0b21pY19pbmMoJnZsLT51c2FnZSk7CisJc3Bpbl91bmxvY2soJmNlbGwtPnZsX2xvY2spOworCWlmICghbGlzdF9lbXB0eSgmdmwtPmdyYXZlKSkgeworCQlzcGluX2xvY2soJmFmc192bG9jYXRpb25fZ3JhdmV5YXJkX2xvY2spOworCQlsaXN0X2RlbF9pbml0KCZ2bC0+Z3JhdmUpOworCQlzcGluX3VubG9jaygmYWZzX3Zsb2NhdGlvbl9ncmF2ZXlhcmRfbG9jayk7CisJfQorCXVwX3dyaXRlKCZjZWxsLT52bF9zZW0pOwogCi0JLyogVE9ETzogc3RhcnQgdXBkYXRpbmcgbmV4dCBWTCByZWNvcmQgb24gcGVuZGluZyBsaXN0ICovCisJLyogc2VlIGlmIGl0IHdhcyBhbiBhYmFuZG9uZWQgcmVjb3JkIHRoYXQgd2UgbWlnaHQgdHJ5IGZpbGxpbmcgaW4gKi8KKwlzcGluX2xvY2soJnZsLT5sb2NrKTsKKwl3aGlsZSAodmwtPnN0YXRlICE9IEFGU19WTF9WQUxJRCkgeworCQlhZnNfdmxvY2F0aW9uX3N0YXRlX3Qgc3RhdGUgPSB2bC0+c3RhdGU7CiAKLQlzcGluX3VubG9jaygmYWZzX3Zsb2NhdGlvbl91cGRhdGVfbG9jayk7CisJCV9kZWJ1ZygiaW52YWxpZCBbc3RhdGUgJWRdIiwgc3RhdGUpOwogCi0JX2xlYXZlKCIiKTsKLX0gLyogZW5kIGFmc192bG9jYXRpb25fdXBkYXRlX2FiYW5kb24oKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogaGFuZGxlIHBlcmlvZGljIHVwZGF0ZSB0aW1lb3V0cyBhbmQgYnVzeSByZXRyeSB0aW1lb3V0cwotICogLSBjYWxsZWQgZnJvbSBrYWZzdGltb2QKLSAqLwotc3RhdGljIHZvaWQgYWZzX3Zsb2NhdGlvbl91cGRhdGVfdGltZXIoc3RydWN0IGFmc190aW1lciAqdGltZXIpCi17Ci0Jc3RydWN0IGFmc192bG9jYXRpb24gKnZsb2NhdGlvbiA9Ci0JCWxpc3RfZW50cnkodGltZXIsIHN0cnVjdCBhZnNfdmxvY2F0aW9uLCB1cGRfdGltZXIpOwotCWludCByZXQ7Ci0KLQlfZW50ZXIoIiVzIiwgdmxvY2F0aW9uLT52bGRiLm5hbWUpOwotCi0JLyogb25seSB1cGRhdGUgaWYgbm90IGluIHRoZSBncmF2ZXlhcmQgKGRlZmVuZCBhZ2FpbnN0IHB1dHRpbmcgdG9vKSAqLwotCXNwaW5fbG9jaygmdmxvY2F0aW9uLT5jZWxsLT52bF9neWxvY2spOwotCi0JaWYgKCFhdG9taWNfcmVhZCgmdmxvY2F0aW9uLT51c2FnZSkpCi0JCWdvdG8gb3V0X3VubG9jazE7Ci0KLQlzcGluX2xvY2soJmFmc192bG9jYXRpb25fdXBkYXRlX2xvY2spOwotCi0JLyogaWYgd2Ugd2VyZSB3b2tlbiB1cCBkdWUgdG8gRUJVU1kgc2xlZXAgdGhlbiByZXN0YXJ0IGltbWVkaWF0ZWx5IGlmCi0JICogcG9zc2libGUgb3IgZWxzZSBqdW1wIHRvIGZyb250IG9mIHBlbmRpbmcgcXVldWUgKi8KLQlpZiAodmxvY2F0aW9uLT51cGRfc3RhdGUgPT0gQUZTX1ZMVVBEX0JVU1lTTEVFUCkgewotCQlpZiAoYWZzX3Zsb2NhdGlvbl91cGRhdGUpIHsKLQkJCWxpc3RfYWRkKCZ2bG9jYXRpb24tPnVwZF9vcC5saW5rLAotCQkJCSAmYWZzX3Zsb2NhdGlvbl91cGRhdGVfcGVuZHEpOworCQlpZiAoc3RhdGUgPT0gQUZTX1ZMX05FVyB8fCBzdGF0ZSA9PSBBRlNfVkxfTk9fVk9MVU1FKSB7CisJCQl2bC0+c3RhdGUgPSBBRlNfVkxfQ1JFQVRJTkc7CisJCQlzcGluX3VubG9jaygmdmwtPmxvY2spOworCQkJZ290byBmaWxsX2luX3JlY29yZDsKIAkJfQotCQllbHNlIHsKLQkJCWFmc19nZXRfdmxvY2F0aW9uKHZsb2NhdGlvbik7Ci0JCQlhZnNfdmxvY2F0aW9uX3VwZGF0ZSA9IHZsb2NhdGlvbjsKLQkJCXZsb2NhdGlvbi0+dXBkX3N0YXRlID0gQUZTX1ZMVVBEX0lOUFJPR1JFU1M7Ci0JCX0KLQkJZ290byBvdXRfdW5sb2NrMjsKLQl9CiAKLQkvKiBwdXQgb24gcGVuZGluZyBxdWV1ZSBpZiB0aGVyZSdzIGFscmVhZHkgYW5vdGhlciB1cGRhdGUgaW4gcHJvZ3Jlc3MgKi8KLQlpZiAoYWZzX3Zsb2NhdGlvbl91cGRhdGUpIHsKLQkJdmxvY2F0aW9uLT51cGRfc3RhdGUgPSBBRlNfVkxVUERfUEVORElORzsKLQkJbGlzdF9hZGRfdGFpbCgmdmxvY2F0aW9uLT51cGRfb3AubGluaywKLQkJCSAgICAgICZhZnNfdmxvY2F0aW9uX3VwZGF0ZV9wZW5kcSk7Ci0JCWdvdG8gb3V0X3VubG9jazI7Ci0JfQorCQkvKiBtdXN0IG5vdyB3YWl0IGZvciBjcmVhdGlvbiBvciB1cGRhdGUgYnkgc29tZW9uZSBlbHNlIHRvCisJCSAqIGNvbXBsZXRlICovCisJCV9kZWJ1Zygid2FpdCIpOwogCi0JLyogaG9sZCBhIHJlZiBvbiBpdCB3aGlsZSBhY3R1YWxseSB1cGRhdGluZyAqLwotCWFmc19nZXRfdmxvY2F0aW9uKHZsb2NhdGlvbik7Ci0JYWZzX3Zsb2NhdGlvbl91cGRhdGUgPSB2bG9jYXRpb247Ci0JdmxvY2F0aW9uLT51cGRfc3RhdGUgPSBBRlNfVkxVUERfSU5QUk9HUkVTUzsKLQotCXNwaW5fdW5sb2NrKCZhZnNfdmxvY2F0aW9uX3VwZGF0ZV9sb2NrKTsKLQlzcGluX3VubG9jaygmdmxvY2F0aW9uLT5jZWxsLT52bF9neWxvY2spOwotCi0JLyogb2theS4uLiB3ZSBjYW4gc3RhcnQgdGhlIHVwZGF0ZSAqLwotCV9kZWJ1ZygiQkVHSU4gVkwgVVBEQVRFIFslc10iLCB2bG9jYXRpb24tPnZsZGIubmFtZSk7Ci0JdmxvY2F0aW9uLT51cGRfZmlyc3Rfc3ZpeCA9IHZsb2NhdGlvbi0+Y2VsbC0+dmxfY3Vycl9zdml4OwotCXZsb2NhdGlvbi0+dXBkX2N1cnJfc3ZpeCA9IHZsb2NhdGlvbi0+dXBkX2ZpcnN0X3N2aXg7Ci0JdmxvY2F0aW9uLT51cGRfcmVqX2NudCA9IDA7Ci0JdmxvY2F0aW9uLT51cGRfYnVzeV9jbnQgPSAwOwotCi0JcmV0ID0gYWZzX3Zsb2NhdGlvbl91cGRhdGVfYmVnaW4odmxvY2F0aW9uKTsKLQlpZiAocmV0IDwgMCkgewotCQlhZnNfdmxvY2F0aW9uX3VwZGF0ZV9hYmFuZG9uKHZsb2NhdGlvbiwgQUZTX1ZMVVBEX1NMRUVQLCByZXQpOwotCQlhZnNfa2Fmc3RpbW9kX2FkZF90aW1lcigmdmxvY2F0aW9uLT51cGRfdGltZXIsCi0JCQkJCUFGU19WTERCX1RJTUVPVVQpOwotCQlhZnNfcHV0X3Zsb2NhdGlvbih2bG9jYXRpb24pOwotCX0KLQotCV9sZWF2ZSgiIik7Ci0JcmV0dXJuOwotCi0gb3V0X3VubG9jazI6Ci0Jc3Bpbl91bmxvY2soJmFmc192bG9jYXRpb25fdXBkYXRlX2xvY2spOwotIG91dF91bmxvY2sxOgotCXNwaW5fdW5sb2NrKCZ2bG9jYXRpb24tPmNlbGwtPnZsX2d5bG9jayk7Ci0JX2xlYXZlKCIiKTsKLQlyZXR1cm47Ci0KLX0gLyogZW5kIGFmc192bG9jYXRpb25fdXBkYXRlX3RpbWVyKCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIGF0dGVuZCB0byBhbiB1cGRhdGUgb3BlcmF0aW9uIHVwb24gd2hpY2ggYW4gZXZlbnQgaGFwcGVuZWQKLSAqIC0gY2FsbGVkIGluIGthZnNhc3luY2QgY29udGV4dAotICovCi1zdGF0aWMgdm9pZCBhZnNfdmxvY2F0aW9uX3VwZGF0ZV9hdHRlbmQoc3RydWN0IGFmc19hc3luY19vcCAqb3ApCi17Ci0Jc3RydWN0IGFmc19jYWNoZV92bG9jYXRpb24gdmxkYjsKLQlzdHJ1Y3QgYWZzX3Zsb2NhdGlvbiAqdmxvY2F0aW9uID0KLQkJbGlzdF9lbnRyeShvcCwgc3RydWN0IGFmc192bG9jYXRpb24sIHVwZF9vcCk7Ci0JdW5zaWduZWQgdG1wOwotCWludCByZXQ7Ci0KLQlfZW50ZXIoIiVzIiwgdmxvY2F0aW9uLT52bGRiLm5hbWUpOwotCi0JcmV0ID0gYWZzX3J4dmxfZ2V0X2VudHJ5X2J5X2lkX2FzeW5jMihvcCwgJnZsZGIpOwotCXN3aXRjaCAocmV0KSB7Ci0JY2FzZSAtRUFHQUlOOgotCQlfbGVhdmUoIiBbdW5maW5pc2hlZF0iKTsKLQkJcmV0dXJuOwotCi0JY2FzZSAwOgotCQlfZGVidWcoIkVORCBWTCBVUERBVEU6ICVkXG4iLCByZXQpOwotCQl2bG9jYXRpb24tPnZhbGlkID0gMTsKLQotCQlfZGVidWcoIkRvbmUgVkwgTG9va3VwOiAlMDJ4IHsgJTA4eCgleCkgJTA4eCgleCkgJTA4eCgleCkgfSIsCi0JCSAgICAgICB2bGRiLnZpZG1hc2ssCi0JCSAgICAgICBudG9obCh2bGRiLnNlcnZlcnNbMF0uc19hZGRyKSwgdmxkYi5zcnZ0bWFza1swXSwKLQkJICAgICAgIG50b2hsKHZsZGIuc2VydmVyc1sxXS5zX2FkZHIpLCB2bGRiLnNydnRtYXNrWzFdLAotCQkgICAgICAgbnRvaGwodmxkYi5zZXJ2ZXJzWzJdLnNfYWRkciksIHZsZGIuc3J2dG1hc2tbMl0KLQkJICAgICAgICk7Ci0KLQkJX2RlYnVnKCJWaWRzOiAlMDh4ICUwOHggJTA4eCIsCi0JCSAgICAgICB2bGRiLnZpZFswXSwgdmxkYi52aWRbMV0sIHZsZGIudmlkWzJdKTsKLQotCQlhZnNfdmxvY2F0aW9uX3VwZGF0ZV9hYmFuZG9uKHZsb2NhdGlvbiwgQUZTX1ZMVVBEX1NMRUVQLCAwKTsKLQotCQlkb3duX3dyaXRlKCZ2bG9jYXRpb24tPmNlbGwtPnZsX3NlbSk7Ci0KLQkJLyogYWN0dWFsbHkgdXBkYXRlIHRoZSBjYWNoZSAqLwotCQlpZiAoc3RybmNtcCh2bGRiLm5hbWUsIHZsb2NhdGlvbi0+dmxkYi5uYW1lLAotCQkJICAgIHNpemVvZih2bG9jYXRpb24tPnZsZGIubmFtZSkpICE9IDApCi0JCQlwcmludGsoImtBRlM6IG5hbWUgb2Ygdm9sdW1lICclcyciCi0JCQkgICAgICAgIiBjaGFuZ2VkIHRvICclcycgb24gc2VydmVyXG4iLAotCQkJICAgICAgIHZsb2NhdGlvbi0+dmxkYi5uYW1lLCB2bGRiLm5hbWUpOwotCi0JCW1lbWNweSgmdmxvY2F0aW9uLT52bGRiLCAmdmxkYiwgc2l6ZW9mKHZsb2NhdGlvbi0+dmxkYikpOwotCi0jaWYgMAotCQkvKiBUT0RPIHVwZGF0ZSB2b2x1bWUgZW50cnkgaW4gbG9jYWwgY2FjaGUgKi8KLSNlbmRpZgotCi0JCXVwX3dyaXRlKCZ2bG9jYXRpb24tPmNlbGwtPnZsX3NlbSk7Ci0KKwkJc3Bpbl91bmxvY2soJnZsLT5sb2NrKTsKKwkJcmV0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHZsLT53YWl0cSwKKwkJCQkJICAgICAgIHZsLT5zdGF0ZSA9PSBBRlNfVkxfTkVXIHx8CisJCQkJCSAgICAgICB2bC0+c3RhdGUgPT0gQUZTX1ZMX1ZBTElEIHx8CisJCQkJCSAgICAgICB2bC0+c3RhdGUgPT0gQUZTX1ZMX05PX1ZPTFVNRSk7CiAJCWlmIChyZXQgPCAwKQotCQkJcHJpbnRrKCJrQUZTOiBmYWlsZWQgdG8gdXBkYXRlIGxvY2FsIGNhY2hlOiAlZFxuIiwgcmV0KTsKLQotCQlhZnNfa2Fmc3RpbW9kX2FkZF90aW1lcigmdmxvY2F0aW9uLT51cGRfdGltZXIsCi0JCQkJCUFGU19WTERCX1RJTUVPVVQpOwotCQlhZnNfcHV0X3Zsb2NhdGlvbih2bG9jYXRpb24pOwotCQlfbGVhdmUoIiBbZm91bmRdIik7Ci0JCXJldHVybjsKLQotCWNhc2UgLUVOT01FRElVTToKLQkJdmxvY2F0aW9uLT51cGRfcmVqX2NudCsrOwotCQlnb3RvIHRyeV9uZXh0OwotCi0JCS8qIHRoZSBzZXJ2ZXIgaXMgbG9ja2VkIC0gcmV0cnkgaW4gYSB2ZXJ5IHNob3J0IHdoaWxlICovCi0JY2FzZSAtRUJVU1k6Ci0JCXZsb2NhdGlvbi0+dXBkX2J1c3lfY250Kys7Ci0JCWlmICh2bG9jYXRpb24tPnVwZF9idXN5X2NudCA+IDMpCi0JCQlnb3RvIHRyeV9uZXh0OyAvKiB0b28gbWFueSByZXRyaWVzICovCi0KLQkJYWZzX3Zsb2NhdGlvbl91cGRhdGVfYWJhbmRvbih2bG9jYXRpb24sCi0JCQkJCSAgICAgQUZTX1ZMVVBEX0JVU1lTTEVFUCwgMCk7Ci0JCWFmc19rYWZzdGltb2RfYWRkX3RpbWVyKCZ2bG9jYXRpb24tPnVwZF90aW1lciwgSFogLyAyKTsKLQkJYWZzX3B1dF92bG9jYXRpb24odmxvY2F0aW9uKTsKLQkJX2xlYXZlKCIgW2J1c3ldIik7Ci0JCXJldHVybjsKLQotCWNhc2UgLUVORVRVTlJFQUNIOgotCWNhc2UgLUVIT1NUVU5SRUFDSDoKLQljYXNlIC1FQ09OTlJFRlVTRUQ6Ci0JY2FzZSAtRVJFTU9URUlPOgotCQkvKiByZWNvcmQgYmFkIHZsc2VydmVyIGluZm8gaW4gdGhlIGNlbGwgdG9vCi0JCSAqIC0gVE9ETzogdXNlIGRvd25fd3JpdGVfdHJ5bG9jaygpIGlmIGF2YWlsYWJsZQotCQkgKi8KLQkJaWYgKHZsb2NhdGlvbi0+dXBkX2N1cnJfc3ZpeCA9PSB2bG9jYXRpb24tPmNlbGwtPnZsX2N1cnJfc3ZpeCkKLQkJCXZsb2NhdGlvbi0+Y2VsbC0+dmxfY3Vycl9zdml4ID0KLQkJCQl2bG9jYXRpb24tPmNlbGwtPnZsX2N1cnJfc3ZpeCAlCi0JCQkJdmxvY2F0aW9uLT5jZWxsLT52bF9uYWRkcnM7Ci0KLQljYXNlIC1FQkFEUlFDOgotCWNhc2UgLUVJTlZBTDoKLQljYXNlIC1FQUNDRVM6Ci0JY2FzZSAtRUJBRE1TRzoKLQkJZ290byB0cnlfbmV4dDsKLQotCWRlZmF1bHQ6Ci0JCWdvdG8gYWJhbmRvbjsKKwkJCWdvdG8gZXJyb3I7CisJCXNwaW5fbG9jaygmdmwtPmxvY2spOwogCX0KKwlzcGluX3VubG9jaygmdmwtPmxvY2spOwogCi0JLyogdHJ5IGNvbnRhY3RpbmcgdGhlIG5leHQgc2VydmVyICovCi0gdHJ5X25leHQ6Ci0JdmxvY2F0aW9uLT51cGRfYnVzeV9jbnQgPSAwOworc3VjY2VzczoKKwlfbGVhdmUoIiA9ICVwIix2bCk7CisJcmV0dXJuIHZsOwogCi0JLyogZGlzY2FyZCB0aGUgc2VydmVyIHJlY29yZCAqLwotCWFmc19wdXRfc2VydmVyKHZsb2NhdGlvbi0+dXBkX29wLnNlcnZlcik7Ci0JdmxvY2F0aW9uLT51cGRfb3Auc2VydmVyID0gTlVMTDsKK2Vycm9yX2FiYW5kb246CisJc3Bpbl9sb2NrKCZ2bC0+bG9jayk7CisJdmwtPnN0YXRlID0gQUZTX1ZMX05FVzsKKwlzcGluX3VubG9jaygmdmwtPmxvY2spOworCXdha2VfdXAoJnZsLT53YWl0cSk7CitlcnJvcjoKKwlBU1NFUlQodmwgIT0gTlVMTCk7CisJYWZzX3B1dF92bG9jYXRpb24odmwpOworCV9sZWF2ZSgiID0gJWQiLCByZXQpOworCXJldHVybiBFUlJfUFRSKHJldCk7Cit9CiAKLQl0bXAgPSB2bG9jYXRpb24tPmNlbGwtPnZsX25hZGRyczsKLQlpZiAodG1wID09IDApCi0JCWdvdG8gYWJhbmRvbjsKLQotCXZsb2NhdGlvbi0+dXBkX2N1cnJfc3ZpeCsrOwotCWlmICh2bG9jYXRpb24tPnVwZF9jdXJyX3N2aXggPj0gdG1wKQotCQl2bG9jYXRpb24tPnVwZF9jdXJyX3N2aXggPSAwOwotCWlmICh2bG9jYXRpb24tPnVwZF9maXJzdF9zdml4ID49IHRtcCkKLQkJdmxvY2F0aW9uLT51cGRfZmlyc3Rfc3ZpeCA9IHRtcCAtIDE7Ci0KLQkvKiBtb3ZlIHRvIHRoZSBuZXh0IHNlcnZlciAqLwotCWlmICh2bG9jYXRpb24tPnVwZF9jdXJyX3N2aXggIT0gdmxvY2F0aW9uLT51cGRfZmlyc3Rfc3ZpeCkgewotCQlhZnNfdmxvY2F0aW9uX3VwZGF0ZV9iZWdpbih2bG9jYXRpb24pOwotCQlfbGVhdmUoIiBbbmV4dF0iKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIHJ1biBvdXQgb2Ygc2VydmVycyB0byB0cnkgLSB3YXMgdGhlIHZvbHVtZSByZWplY3RlZD8gKi8KLQlpZiAodmxvY2F0aW9uLT51cGRfcmVqX2NudCA+IDApIHsKLQkJcHJpbnRrKCJrQUZTOiBBY3RpdmUgdm9sdW1lIG5vIGxvbmdlciB2YWxpZCAnJXMnXG4iLAotCQkgICAgICAgdmxvY2F0aW9uLT52bGRiLm5hbWUpOwotCQl2bG9jYXRpb24tPnZhbGlkID0gMDsKLQkJYWZzX3Zsb2NhdGlvbl91cGRhdGVfYWJhbmRvbih2bG9jYXRpb24sIEFGU19WTFVQRF9TTEVFUCwgMCk7Ci0JCWFmc19rYWZzdGltb2RfYWRkX3RpbWVyKCZ2bG9jYXRpb24tPnVwZF90aW1lciwKLQkJCQkJQUZTX1ZMREJfVElNRU9VVCk7Ci0JCWFmc19wdXRfdmxvY2F0aW9uKHZsb2NhdGlvbik7Ci0JCV9sZWF2ZSgiIFtpbnZhbGlkYXRlZF0iKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIGFiYW5kb24gdGhlIHVwZGF0ZSAqLwotIGFiYW5kb246Ci0JYWZzX3Zsb2NhdGlvbl91cGRhdGVfYWJhbmRvbih2bG9jYXRpb24sIEFGU19WTFVQRF9TTEVFUCwgcmV0KTsKLQlhZnNfa2Fmc3RpbW9kX2FkZF90aW1lcigmdmxvY2F0aW9uLT51cGRfdGltZXIsIEhaICogMTApOwotCWFmc19wdXRfdmxvY2F0aW9uKHZsb2NhdGlvbik7Ci0JX2xlYXZlKCIgW2FiYW5kb25lZF0iKTsKLQotfSAvKiBlbmQgYWZzX3Zsb2NhdGlvbl91cGRhdGVfYXR0ZW5kKCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKLSAqIGRlYWwgd2l0aCBhbiB1cGRhdGUgb3BlcmF0aW9uIGJlaW5nIGRpc2NhcmRlZAotICogLSBjYWxsZWQgaW4ga2Fmc2FzeW5jZCBjb250ZXh0IHdoZW4gaXQncyBkeWluZyBkdWUgdG8gcm1tb2QKLSAqIC0gdGhlIGNhbGwgaGFzIGFscmVhZHkgYmVlbiBhYm9ydGVkIGFuZCBwdXQoKSdkCisgKiBmaW5pc2ggdXNpbmcgYSB2b2x1bWUgbG9jYXRpb24gcmVjb3JkCiAgKi8KLXN0YXRpYyB2b2lkIGFmc192bG9jYXRpb25fdXBkYXRlX2Rpc2NhcmQoc3RydWN0IGFmc19hc3luY19vcCAqb3ApCit2b2lkIGFmc19wdXRfdmxvY2F0aW9uKHN0cnVjdCBhZnNfdmxvY2F0aW9uICp2bCkKIHsKLQlzdHJ1Y3QgYWZzX3Zsb2NhdGlvbiAqdmxvY2F0aW9uID0KLQkJbGlzdF9lbnRyeShvcCwgc3RydWN0IGFmc192bG9jYXRpb24sIHVwZF9vcCk7CisJaWYgKCF2bCkKKwkJcmV0dXJuOwogCi0JX2VudGVyKCIlcyIsIHZsb2NhdGlvbi0+dmxkYi5uYW1lKTsKKwlfZW50ZXIoIiVzIiwgdmwtPnZsZGIubmFtZSk7CiAKLQlhZnNfcHV0X3NlcnZlcihvcC0+c2VydmVyKTsKLQlvcC0+c2VydmVyID0gTlVMTDsKKwlBU1NFUlRDTVAoYXRvbWljX3JlYWQoJnZsLT51c2FnZSksID4sIDApOwogCi0JYWZzX3B1dF92bG9jYXRpb24odmxvY2F0aW9uKTsKKwlpZiAobGlrZWx5KCFhdG9taWNfZGVjX2FuZF90ZXN0KCZ2bC0+dXNhZ2UpKSkgeworCQlfbGVhdmUoIiIpOworCQlyZXR1cm47CisJfQogCi0JX2xlYXZlKCIiKTsKLX0gLyogZW5kIGFmc192bG9jYXRpb25fdXBkYXRlX2Rpc2NhcmQoKSAqLworCXNwaW5fbG9jaygmYWZzX3Zsb2NhdGlvbl9ncmF2ZXlhcmRfbG9jayk7CisJaWYgKGF0b21pY19yZWFkKCZ2bC0+dXNhZ2UpID09IDApIHsKKwkJX2RlYnVnKCJidXJpZWQiKTsKKwkJbGlzdF9tb3ZlX3RhaWwoJnZsLT5ncmF2ZSwgJmFmc192bG9jYXRpb25fZ3JhdmV5YXJkKTsKKwkJdmwtPnRpbWVfb2ZfZGVhdGggPSBnZXRfc2Vjb25kcygpOworCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmFmc192bG9jYXRpb25fcmVhcCwKKwkJCQkgICAgICBhZnNfdmxvY2F0aW9uX3RpbWVvdXQgKiBIWik7CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwkJLyogc3VzcGVuZCB1cGRhdGVzIG9uIHRoaXMgcmVjb3JkICovCisJCWlmICghbGlzdF9lbXB0eSgmdmwtPnVwZGF0ZSkpIHsKKwkJCXNwaW5fbG9jaygmYWZzX3Zsb2NhdGlvbl91cGRhdGVzX2xvY2spOworCQkJbGlzdF9kZWxfaW5pdCgmdmwtPnVwZGF0ZSk7CisJCQlzcGluX3VubG9jaygmYWZzX3Zsb2NhdGlvbl91cGRhdGVzX2xvY2spOworCQl9CisJfQorCXNwaW5fdW5sb2NrKCZhZnNfdmxvY2F0aW9uX2dyYXZleWFyZF9sb2NrKTsKKwlfbGVhdmUoIiBba2lsbGVkP10iKTsKK30KKwogLyoKLSAqIG1hdGNoIGEgVkxEQiByZWNvcmQgc3RvcmVkIGluIHRoZSBjYWNoZQotICogLSBtYXkgYWxzbyBsb2FkIHRhcmdldCBmcm9tIGVudHJ5CisgKiBkZXN0cm95IGEgZGVhZCB2b2x1bWUgbG9jYXRpb24gcmVjb3JkCiAgKi8KK3N0YXRpYyB2b2lkIGFmc192bG9jYXRpb25fZGVzdHJveShzdHJ1Y3QgYWZzX3Zsb2NhdGlvbiAqdmwpCit7CisJX2VudGVyKCIlcCIsIHZsKTsKKwogI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKLXN0YXRpYyBjYWNoZWZzX21hdGNoX3ZhbF90IGFmc192bG9jYXRpb25fY2FjaGVfbWF0Y2godm9pZCAqdGFyZ2V0LAotCQkJCQkJICAgICBjb25zdCB2b2lkICplbnRyeSkKLXsKLQljb25zdCBzdHJ1Y3QgYWZzX2NhY2hlX3Zsb2NhdGlvbiAqdmxkYiA9IGVudHJ5OwotCXN0cnVjdCBhZnNfdmxvY2F0aW9uICp2bG9jYXRpb24gPSB0YXJnZXQ7Ci0KLQlfZW50ZXIoInslc30seyVzfSIsIHZsb2NhdGlvbi0+dmxkYi5uYW1lLCB2bGRiLT5uYW1lKTsKLQotCWlmIChzdHJuY21wKHZsb2NhdGlvbi0+dmxkYi5uYW1lLCB2bGRiLT5uYW1lLCBzaXplb2YodmxkYi0+bmFtZSkpID09IDAKLQkgICAgKSB7Ci0JCWlmICghdmxvY2F0aW9uLT52YWxpZCB8fAotCQkgICAgdmxvY2F0aW9uLT52bGRiLnJ0aW1lID09IHZsZGItPnJ0aW1lCi0JCSAgICApIHsKLQkJCXZsb2NhdGlvbi0+dmxkYiA9ICp2bGRiOwotCQkJdmxvY2F0aW9uLT52YWxpZCA9IDE7Ci0JCQlfbGVhdmUoIiA9IFNVQ0NFU1MgW2MtPm1dIik7Ci0JCQlyZXR1cm4gQ0FDSEVGU19NQVRDSF9TVUNDRVNTOwotCQl9Ci0JCS8qIG5lZWQgdG8gdXBkYXRlIGNhY2hlIGlmIGNhY2hlZCBpbmZvIGRpZmZlcnMgKi8KLQkJZWxzZSBpZiAobWVtY21wKCZ2bG9jYXRpb24tPnZsZGIsIHZsZGIsIHNpemVvZigqdmxkYikpICE9IDApIHsKLQkJCS8qIGRlbGV0ZSBpZiBWSURzIGZvciB0aGlzIG5hbWUgZGlmZmVyICovCi0JCQlpZiAobWVtY21wKCZ2bG9jYXRpb24tPnZsZGIudmlkLAotCQkJCSAgICZ2bGRiLT52aWQsCi0JCQkJICAgc2l6ZW9mKHZsZGItPnZpZCkpICE9IDApIHsKLQkJCQlfbGVhdmUoIiA9IERFTEVURSIpOwotCQkJCXJldHVybiBDQUNIRUZTX01BVENIX1NVQ0NFU1NfREVMRVRFOwotCQkJfQotCi0JCQlfbGVhdmUoIiA9IFVQREFURSIpOwotCQkJcmV0dXJuIENBQ0hFRlNfTUFUQ0hfU1VDQ0VTU19VUERBVEU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlfbGVhdmUoIiA9IFNVQ0NFU1MiKTsKLQkJCXJldHVybiBDQUNIRUZTX01BVENIX1NVQ0NFU1M7Ci0JCX0KLQl9Ci0KLQlfbGVhdmUoIiA9IEZBSUxFRCIpOwotCXJldHVybiBDQUNIRUZTX01BVENIX0ZBSUxFRDsKLX0gLyogZW5kIGFmc192bG9jYXRpb25fY2FjaGVfbWF0Y2goKSAqLworCWNhY2hlZnNfcmVsaW5xdWlzaF9jb29raWUodmwtPmNhY2hlLCAwKTsKICNlbmRpZgogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJYWZzX3B1dF9jZWxsKHZsLT5jZWxsKTsKKwlrZnJlZSh2bCk7Cit9CisKIC8qCi0gKiB1cGRhdGUgYSBWTERCIHJlY29yZCBzdG9yZWQgaW4gdGhlIGNhY2hlCisgKiByZWFwIGRlYWQgdm9sdW1lIGxvY2F0aW9uIHJlY29yZHMKICAqLwotI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKLXN0YXRpYyB2b2lkIGFmc192bG9jYXRpb25fY2FjaGVfdXBkYXRlKHZvaWQgKnNvdXJjZSwgdm9pZCAqZW50cnkpCitzdGF0aWMgdm9pZCBhZnNfdmxvY2F0aW9uX3JlYXBlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IGFmc19jYWNoZV92bG9jYXRpb24gKnZsZGIgPSBlbnRyeTsKLQlzdHJ1Y3QgYWZzX3Zsb2NhdGlvbiAqdmxvY2F0aW9uID0gc291cmNlOworCUxJU1RfSEVBRChjb3Jwc2VzKTsKKwlzdHJ1Y3QgYWZzX3Zsb2NhdGlvbiAqdmw7CisJdW5zaWduZWQgbG9uZyBkZWxheSwgZXhwaXJ5OworCXRpbWVfdCBub3c7CiAKIAlfZW50ZXIoIiIpOwogCi0JKnZsZGIgPSB2bG9jYXRpb24tPnZsZGI7CisJbm93ID0gZ2V0X3NlY29uZHMoKTsKKwlzcGluX2xvY2soJmFmc192bG9jYXRpb25fZ3JhdmV5YXJkX2xvY2spOwogCi19IC8qIGVuZCBhZnNfdmxvY2F0aW9uX2NhY2hlX3VwZGF0ZSgpICovCi0jZW5kaWYKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmFmc192bG9jYXRpb25fZ3JhdmV5YXJkKSkgeworCQl2bCA9IGxpc3RfZW50cnkoYWZzX3Zsb2NhdGlvbl9ncmF2ZXlhcmQubmV4dCwKKwkJCQlzdHJ1Y3QgYWZzX3Zsb2NhdGlvbiwgZ3JhdmUpOworCisJCV9kZWJ1ZygiY2hlY2sgJXAiLCB2bCk7CisKKwkJLyogdGhlIHF1ZXVlIGlzIG9yZGVyZWQgbW9zdCBkZWFkIGZpcnN0ICovCisJCWV4cGlyeSA9IHZsLT50aW1lX29mX2RlYXRoICsgYWZzX3Zsb2NhdGlvbl90aW1lb3V0OworCQlpZiAoZXhwaXJ5ID4gbm93KSB7CisJCQlkZWxheSA9IChleHBpcnkgLSBub3cpICogSFo7CisJCQlfZGVidWcoImRlbGF5ICVsdSIsIGRlbGF5KTsKKwkJCWlmICghc2NoZWR1bGVfZGVsYXllZF93b3JrKCZhZnNfdmxvY2F0aW9uX3JlYXAsCisJCQkJCQkgICBkZWxheSkpIHsKKwkJCQljYW5jZWxfZGVsYXllZF93b3JrKCZhZnNfdmxvY2F0aW9uX3JlYXApOworCQkJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmYWZzX3Zsb2NhdGlvbl9yZWFwLAorCQkJCQkJICAgICAgZGVsYXkpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCQlzcGluX2xvY2soJnZsLT5jZWxsLT52bF9sb2NrKTsKKwkJaWYgKGF0b21pY19yZWFkKCZ2bC0+dXNhZ2UpID4gMCkgeworCQkJX2RlYnVnKCJubyByZWFwIik7CisJCQlsaXN0X2RlbF9pbml0KCZ2bC0+Z3JhdmUpOworCQl9IGVsc2UgeworCQkJX2RlYnVnKCJyZWFwIik7CisJCQlsaXN0X21vdmVfdGFpbCgmdmwtPmdyYXZlLCAmY29ycHNlcyk7CisJCQlsaXN0X2RlbF9pbml0KCZ2bC0+bGluayk7CisJCX0KKwkJc3Bpbl91bmxvY2soJnZsLT5jZWxsLT52bF9sb2NrKTsKKwl9CisKKwlzcGluX3VubG9jaygmYWZzX3Zsb2NhdGlvbl9ncmF2ZXlhcmRfbG9jayk7CisKKwkvKiBub3cgcmVhcCB0aGUgY29ycHNlcyB3ZSd2ZSBleHRyYWN0ZWQgKi8KKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmNvcnBzZXMpKSB7CisJCXZsID0gbGlzdF9lbnRyeShjb3Jwc2VzLm5leHQsIHN0cnVjdCBhZnNfdmxvY2F0aW9uLCBncmF2ZSk7CisJCWxpc3RfZGVsKCZ2bC0+Z3JhdmUpOworCQlhZnNfdmxvY2F0aW9uX2Rlc3Ryb3kodmwpOworCX0KKworCV9sZWF2ZSgiIik7Cit9CisKKy8qCisgKiBpbml0aWFsaXNlIHRoZSBWTCB1cGRhdGUgcHJvY2VzcworICovCitpbnQgX19pbml0IGFmc192bG9jYXRpb25fdXBkYXRlX2luaXQodm9pZCkKK3sKKwlhZnNfdmxvY2F0aW9uX3VwZGF0ZV93b3JrZXIgPQorCQljcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgia2Fmc192bHVwZGF0ZWQiKTsKKwlyZXR1cm4gYWZzX3Zsb2NhdGlvbl91cGRhdGVfd29ya2VyID8gMCA6IC1FTk9NRU07Cit9CisKKy8qCisgKiBkaXNjYXJkIGFsbCB0aGUgdm9sdW1lIGxvY2F0aW9uIHJlY29yZHMgZm9yIHJtbW9kCisgKi8KK3ZvaWQgX19leGl0IGFmc192bG9jYXRpb25fcHVyZ2Uodm9pZCkKK3sKKwlhZnNfdmxvY2F0aW9uX3RpbWVvdXQgPSAwOworCisJc3Bpbl9sb2NrKCZhZnNfdmxvY2F0aW9uX3VwZGF0ZXNfbG9jayk7CisJbGlzdF9kZWxfaW5pdCgmYWZzX3Zsb2NhdGlvbl91cGRhdGVzKTsKKwlzcGluX3VubG9jaygmYWZzX3Zsb2NhdGlvbl91cGRhdGVzX2xvY2spOworCWNhbmNlbF9kZWxheWVkX3dvcmsoJmFmc192bG9jYXRpb25fdXBkYXRlKTsKKwlxdWV1ZV9kZWxheWVkX3dvcmsoYWZzX3Zsb2NhdGlvbl91cGRhdGVfd29ya2VyLAorCQkJICAgJmFmc192bG9jYXRpb25fdXBkYXRlLCAwKTsKKwlkZXN0cm95X3dvcmtxdWV1ZShhZnNfdmxvY2F0aW9uX3VwZGF0ZV93b3JrZXIpOworCisJY2FuY2VsX2RlbGF5ZWRfd29yaygmYWZzX3Zsb2NhdGlvbl9yZWFwKTsKKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmFmc192bG9jYXRpb25fcmVhcCwgMCk7Cit9CisKKy8qCisgKiB1cGRhdGUgYSB2b2x1bWUgbG9jYXRpb24KKyAqLworc3RhdGljIHZvaWQgYWZzX3Zsb2NhdGlvbl91cGRhdGVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgYWZzX2NhY2hlX3Zsb2NhdGlvbiB2bGRiOworCXN0cnVjdCBhZnNfdmxvY2F0aW9uICp2bCwgKnh2bDsKKwl0aW1lX3Qgbm93OworCWxvbmcgdGltZW91dDsKKwlpbnQgcmV0OworCisJX2VudGVyKCIiKTsKKworCW5vdyA9IGdldF9zZWNvbmRzKCk7CisKKwkvKiBmaW5kIGEgcmVjb3JkIHRvIHVwZGF0ZSAqLworCXNwaW5fbG9jaygmYWZzX3Zsb2NhdGlvbl91cGRhdGVzX2xvY2spOworCWZvciAoOzspIHsKKwkJaWYgKGxpc3RfZW1wdHkoJmFmc192bG9jYXRpb25fdXBkYXRlcykpIHsKKwkJCXNwaW5fdW5sb2NrKCZhZnNfdmxvY2F0aW9uX3VwZGF0ZXNfbG9jayk7CisJCQlfbGVhdmUoIiBbbm90aGluZ10iKTsKKwkJCXJldHVybjsKKwkJfQorCisJCXZsID0gbGlzdF9lbnRyeShhZnNfdmxvY2F0aW9uX3VwZGF0ZXMubmV4dCwKKwkJCQlzdHJ1Y3QgYWZzX3Zsb2NhdGlvbiwgdXBkYXRlKTsKKwkJaWYgKGF0b21pY19yZWFkKCZ2bC0+dXNhZ2UpID4gMCkKKwkJCWJyZWFrOworCQlsaXN0X2RlbF9pbml0KCZ2bC0+dXBkYXRlKTsKKwl9CisKKwl0aW1lb3V0ID0gdmwtPnVwZGF0ZV9hdCAtIG5vdzsKKwlpZiAodGltZW91dCA+IDApIHsKKwkJcXVldWVfZGVsYXllZF93b3JrKGFmc192bG9jYXRpb25fdXBkYXRlX3dvcmtlciwKKwkJCQkgICAmYWZzX3Zsb2NhdGlvbl91cGRhdGUsIHRpbWVvdXQgKiBIWik7CisJCXNwaW5fdW5sb2NrKCZhZnNfdmxvY2F0aW9uX3VwZGF0ZXNfbG9jayk7CisJCV9sZWF2ZSgiIFtub3RoaW5nXSIpOworCQlyZXR1cm47CisJfQorCisJbGlzdF9kZWxfaW5pdCgmdmwtPnVwZGF0ZSk7CisJYXRvbWljX2luYygmdmwtPnVzYWdlKTsKKwlzcGluX3VubG9jaygmYWZzX3Zsb2NhdGlvbl91cGRhdGVzX2xvY2spOworCisJLyogd2UgY2FuIG5vdyBwZXJmb3JtIHRoZSB1cGRhdGUgKi8KKwlfZGVidWcoInVwZGF0ZSAlcyIsIHZsLT52bGRiLm5hbWUpOworCXZsLT5zdGF0ZSA9IEFGU19WTF9VUERBVElORzsKKwl2bC0+dXBkX3Jlal9jbnQgPSAwOworCXZsLT51cGRfYnVzeV9jbnQgPSAwOworCisJcmV0ID0gYWZzX3Zsb2NhdGlvbl91cGRhdGVfcmVjb3JkKHZsLCBOVUxMLCAmdmxkYik7CisJc3Bpbl9sb2NrKCZ2bC0+bG9jayk7CisJc3dpdGNoIChyZXQpIHsKKwljYXNlIDA6CisJCWFmc192bG9jYXRpb25fYXBwbHlfdXBkYXRlKHZsLCAmdmxkYik7CisJCXZsLT5zdGF0ZSA9IEFGU19WTF9WQUxJRDsKKwkJYnJlYWs7CisJY2FzZSAtRU5PTUVESVVNOgorCQl2bC0+c3RhdGUgPSBBRlNfVkxfVk9MVU1FX0RFTEVURUQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXZsLT5zdGF0ZSA9IEFGU19WTF9VTkNFUlRBSU47CisJCWJyZWFrOworCX0KKwlzcGluX3VubG9jaygmdmwtPmxvY2spOworCXdha2VfdXAoJnZsLT53YWl0cSk7CisKKwkvKiBhbmQgdGhlbiByZXNjaGVkdWxlICovCisJX2RlYnVnKCJyZXNjaGVkdWxlIik7CisJdmwtPnVwZGF0ZV9hdCA9IGdldF9zZWNvbmRzKCkgKyBhZnNfdmxvY2F0aW9uX3VwZGF0ZV90aW1lb3V0OworCisJc3Bpbl9sb2NrKCZhZnNfdmxvY2F0aW9uX3VwZGF0ZXNfbG9jayk7CisKKwlpZiAoIWxpc3RfZW1wdHkoJmFmc192bG9jYXRpb25fdXBkYXRlcykpIHsKKwkJLyogbmV4dCB1cGRhdGUgaW4gMTAgbWludXRlcywgYnV0IHdhaXQgYXQgbGVhc3QgMSBzZWNvbmQgbW9yZQorCQkgKiB0aGFuIHRoZSBuZXdlc3QgcmVjb3JkIGFscmVhZHkgcXVldWVkIHNvIHRoYXQgd2UgZG9uJ3Qgc3BhbQorCQkgKiB0aGUgVkwgc2VydmVyIHN1ZGRlbmx5IHdpdGggbG90cyBvZiByZXF1ZXN0cworCQkgKi8KKwkJeHZsID0gbGlzdF9lbnRyeShhZnNfdmxvY2F0aW9uX3VwZGF0ZXMucHJldiwKKwkJCQkgc3RydWN0IGFmc192bG9jYXRpb24sIHVwZGF0ZSk7CisJCWlmICh2bC0+dXBkYXRlX2F0IDw9IHh2bC0+dXBkYXRlX2F0KQorCQkJdmwtPnVwZGF0ZV9hdCA9IHh2bC0+dXBkYXRlX2F0ICsgMTsKKwkJeHZsID0gbGlzdF9lbnRyeShhZnNfdmxvY2F0aW9uX3VwZGF0ZXMubmV4dCwKKwkJCQkgc3RydWN0IGFmc192bG9jYXRpb24sIHVwZGF0ZSk7CisJCXRpbWVvdXQgPSB4dmwtPnVwZGF0ZV9hdCAtIG5vdzsKKwkJaWYgKHRpbWVvdXQgPCAwKQorCQkJdGltZW91dCA9IDA7CisJfSBlbHNlIHsKKwkJdGltZW91dCA9IGFmc192bG9jYXRpb25fdXBkYXRlX3RpbWVvdXQ7CisJfQorCisJQVNTRVJUKGxpc3RfZW1wdHkoJnZsLT51cGRhdGUpKTsKKworCWxpc3RfYWRkX3RhaWwoJnZsLT51cGRhdGUsICZhZnNfdmxvY2F0aW9uX3VwZGF0ZXMpOworCisJX2RlYnVnKCJ0aW1lb3V0ICVsZCIsIHRpbWVvdXQpOworCXF1ZXVlX2RlbGF5ZWRfd29yayhhZnNfdmxvY2F0aW9uX3VwZGF0ZV93b3JrZXIsCisJCQkgICAmYWZzX3Zsb2NhdGlvbl91cGRhdGUsIHRpbWVvdXQgKiBIWik7CisJc3Bpbl91bmxvY2soJmFmc192bG9jYXRpb25fdXBkYXRlc19sb2NrKTsKKwlhZnNfcHV0X3Zsb2NhdGlvbih2bCk7Cit9CmRpZmYgLS1naXQgYS9mcy9hZnMvdm5vZGUuYyBiL2ZzL2Fmcy92bm9kZS5jCmluZGV4IGNmNjJkYTUuLmExOTA0YWIgMTAwNjQ0Ci0tLSBhL2ZzL2Fmcy92bm9kZS5jCisrKyBiL2ZzL2Fmcy92bm9kZS5jCkBAIC0xLDYgKzEsNiBAQAotLyogdm5vZGUuYzogQUZTIHZub2RlIG1hbmFnZW1lbnQKKy8qIEFGUyB2bm9kZSBtYW5hZ2VtZW50CiAgKgotICogQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgpAQCAtMTQsMTQyICsxNCwyMzcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgotI2luY2x1ZGUgInZvbHVtZS5oIgotI2luY2x1ZGUgImNlbGwuaCIKLSNpbmNsdWRlICJjbXNlcnZpY2UuaCIKLSNpbmNsdWRlICJmc2NsaWVudC5oIgotI2luY2x1ZGUgInZsY2xpZW50LmgiCi0jaW5jbHVkZSAidm5vZGUuaCIKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogCi1zdGF0aWMgdm9pZCBhZnNfdm5vZGVfY2JfdGltZWRfb3V0KHN0cnVjdCBhZnNfdGltZXIgKnRpbWVyKTsKLQotc3RydWN0IGFmc190aW1lcl9vcHMgYWZzX3Zub2RlX2NiX3RpbWVkX291dF9vcHMgPSB7Ci0JLnRpbWVkX291dAk9IGFmc192bm9kZV9jYl90aW1lZF9vdXQsCi19OwotCi0jaWZkZWYgQUZTX0NBQ0hJTkdfU1VQUE9SVAotc3RhdGljIGNhY2hlZnNfbWF0Y2hfdmFsX3QgYWZzX3Zub2RlX2NhY2hlX21hdGNoKHZvaWQgKnRhcmdldCwKLQkJCQkJCSBjb25zdCB2b2lkICplbnRyeSk7Ci1zdGF0aWMgdm9pZCBhZnNfdm5vZGVfY2FjaGVfdXBkYXRlKHZvaWQgKnNvdXJjZSwgdm9pZCAqZW50cnkpOwotCi1zdHJ1Y3QgY2FjaGVmc19pbmRleF9kZWYgYWZzX3Zub2RlX2NhY2hlX2luZGV4X2RlZiA9IHsKLQkubmFtZQkJPSAidm5vZGUiLAotCS5kYXRhX3NpemUJPSBzaXplb2Yoc3RydWN0IGFmc19jYWNoZV92bm9kZSksCi0JLmtleXNbMF0JPSB7IENBQ0hFRlNfSU5ERVhfS0VZU19CSU4sIDQgfSwKLQkubWF0Y2gJCT0gYWZzX3Zub2RlX2NhY2hlX21hdGNoLAotCS51cGRhdGUJCT0gYWZzX3Zub2RlX2NhY2hlX3VwZGF0ZSwKLX07Ci0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIGhhbmRsZSBhIGNhbGxiYWNrIHRpbWluZyBvdXQKLSAqIFRPRE86IHJldGFpbiBhIHJlZiB0byB2bm9kZSBzdHJ1Y3QgZm9yIGFuIG91dHN0YW5kaW5nIGNhbGxiYWNrIHRpbWVvdXQKLSAqLwotc3RhdGljIHZvaWQgYWZzX3Zub2RlX2NiX3RpbWVkX291dChzdHJ1Y3QgYWZzX3RpbWVyICp0aW1lcikKKyNpZiAwCitzdGF0aWMgbm9pbmxpbmUgYm9vbCBkdW1wX3RyZWVfYXV4KHN0cnVjdCByYl9ub2RlICpub2RlLCBzdHJ1Y3QgcmJfbm9kZSAqcGFyZW50LAorCQkJCSAgIGludCBkZXB0aCwgY2hhciBscikKIHsKLQlzdHJ1Y3QgYWZzX3NlcnZlciAqb2xkc2VydmVyOwogCXN0cnVjdCBhZnNfdm5vZGUgKnZub2RlOworCWJvb2wgYmFkID0gZmFsc2U7CiAKLQl2bm9kZSA9IGxpc3RfZW50cnkodGltZXIsIHN0cnVjdCBhZnNfdm5vZGUsIGNiX3RpbWVvdXQpOworCWlmICghbm9kZSkKKwkJcmV0dXJuIGZhbHNlOwogCi0JX2VudGVyKCIlcCIsIHZub2RlKTsKKwlpZiAobm9kZS0+cmJfbGVmdCkKKwkJYmFkID0gZHVtcF90cmVlX2F1eChub2RlLT5yYl9sZWZ0LCBub2RlLCBkZXB0aCArIDIsICcvJyk7CiAKLQkvKiBzZXQgdGhlIGNoYW5nZWQgZmxhZyBpbiB0aGUgdm5vZGUgYW5kIHJlbGVhc2UgdGhlIHNlcnZlciAqLwotCXNwaW5fbG9jaygmdm5vZGUtPmxvY2spOwotCi0Jb2xkc2VydmVyID0geGNoZygmdm5vZGUtPmNiX3NlcnZlciwgTlVMTCk7Ci0JaWYgKG9sZHNlcnZlcikgewotCQl2bm9kZS0+ZmxhZ3MgfD0gQUZTX1ZOT0RFX0NIQU5HRUQ7Ci0KLQkJc3Bpbl9sb2NrKCZhZnNfY2JfaGFzaF9sb2NrKTsKLQkJbGlzdF9kZWxfaW5pdCgmdm5vZGUtPmNiX2hhc2hfbGluayk7Ci0JCXNwaW5fdW5sb2NrKCZhZnNfY2JfaGFzaF9sb2NrKTsKLQotCQlzcGluX2xvY2soJm9sZHNlcnZlci0+Y2JfbG9jayk7Ci0JCWxpc3RfZGVsX2luaXQoJnZub2RlLT5jYl9saW5rKTsKLQkJc3Bpbl91bmxvY2soJm9sZHNlcnZlci0+Y2JfbG9jayk7CisJdm5vZGUgPSByYl9lbnRyeShub2RlLCBzdHJ1Y3QgYWZzX3Zub2RlLCBjYl9wcm9taXNlKTsKKwlfZGVidWcoIiVjICUqLipzJWMlcCB7JWR9IiwKKwkgICAgICAgcmJfaXNfcmVkKG5vZGUpID8gJ1InIDogJ0InLAorCSAgICAgICBkZXB0aCwgZGVwdGgsICIiLCBsciwKKwkgICAgICAgdm5vZGUsIHZub2RlLT5jYl9leHBpcmVzX2F0KTsKKwlpZiAocmJfcGFyZW50KG5vZGUpICE9IHBhcmVudCkgeworCQlwcmludGsoIkJBRDogJXAgIT0gJXBcbiIsIHJiX3BhcmVudChub2RlKSwgcGFyZW50KTsKKwkJYmFkID0gdHJ1ZTsKIAl9CiAKLQlzcGluX3VubG9jaygmdm5vZGUtPmxvY2spOworCWlmIChub2RlLT5yYl9yaWdodCkKKwkJYmFkIHw9IGR1bXBfdHJlZV9hdXgobm9kZS0+cmJfcmlnaHQsIG5vZGUsIGRlcHRoICsgMiwgJ1xcJyk7CiAKLQlhZnNfcHV0X3NlcnZlcihvbGRzZXJ2ZXIpOworCXJldHVybiBiYWQ7Cit9CiAKLQlfbGVhdmUoIiIpOwotfSAvKiBlbmQgYWZzX3Zub2RlX2NiX3RpbWVkX291dCgpICovCitzdGF0aWMgbm9pbmxpbmUgdm9pZCBkdW1wX3RyZWUoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlcikKK3sKKwlfZW50ZXIoIiVzIiwgbmFtZSk7CisJaWYgKGR1bXBfdHJlZV9hdXgoc2VydmVyLT5jYl9wcm9taXNlcy5yYl9ub2RlLCBOVUxMLCAwLCAnLScpKQorCQlCVUcoKTsKK30KKyNlbmRpZgogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgotICogZmluaXNoIG9mZiB1cGRhdGluZyB0aGUgcmVjb3JkZWQgc3RhdHVzIG9mIGEgZmlsZQorICogaW5zZXJ0IGEgdm5vZGUgaW50byB0aGUgYmFja2luZyBzZXJ2ZXIncyB2bm9kZSB0cmVlCisgKi8KK3N0YXRpYyB2b2lkIGFmc19pbnN0YWxsX3Zub2RlKHN0cnVjdCBhZnNfdm5vZGUgKnZub2RlLAorCQkJICAgICAgc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlcikKK3sKKwlzdHJ1Y3QgYWZzX3NlcnZlciAqb2xkX3NlcnZlciA9IHZub2RlLT5zZXJ2ZXI7CisJc3RydWN0IGFmc192bm9kZSAqeHZub2RlOworCXN0cnVjdCByYl9ub2RlICpwYXJlbnQsICoqcDsKKworCV9lbnRlcigiJXAsJXAiLCB2bm9kZSwgc2VydmVyKTsKKworCWlmIChvbGRfc2VydmVyKSB7CisJCXNwaW5fbG9jaygmb2xkX3NlcnZlci0+ZnNfbG9jayk7CisJCXJiX2VyYXNlKCZ2bm9kZS0+c2VydmVyX3JiLCAmb2xkX3NlcnZlci0+ZnNfdm5vZGVzKTsKKwkJc3Bpbl91bmxvY2soJm9sZF9zZXJ2ZXItPmZzX2xvY2spOworCX0KKworCWFmc19nZXRfc2VydmVyKHNlcnZlcik7CisJdm5vZGUtPnNlcnZlciA9IHNlcnZlcjsKKwlhZnNfcHV0X3NlcnZlcihvbGRfc2VydmVyKTsKKworCS8qIGluc2VydCBpbnRvIHRoZSBzZXJ2ZXIncyB2bm9kZSB0cmVlIGluIEZJRCBvcmRlciAqLworCXNwaW5fbG9jaygmc2VydmVyLT5mc19sb2NrKTsKKworCXBhcmVudCA9IE5VTEw7CisJcCA9ICZzZXJ2ZXItPmZzX3Zub2Rlcy5yYl9ub2RlOworCXdoaWxlICgqcCkgeworCQlwYXJlbnQgPSAqcDsKKwkJeHZub2RlID0gcmJfZW50cnkocGFyZW50LCBzdHJ1Y3QgYWZzX3Zub2RlLCBzZXJ2ZXJfcmIpOworCQlpZiAodm5vZGUtPmZpZC52aWQgPCB4dm5vZGUtPmZpZC52aWQpCisJCQlwID0gJigqcCktPnJiX2xlZnQ7CisJCWVsc2UgaWYgKHZub2RlLT5maWQudmlkID4geHZub2RlLT5maWQudmlkKQorCQkJcCA9ICYoKnApLT5yYl9yaWdodDsKKwkJZWxzZSBpZiAodm5vZGUtPmZpZC52bm9kZSA8IHh2bm9kZS0+ZmlkLnZub2RlKQorCQkJcCA9ICYoKnApLT5yYl9sZWZ0OworCQllbHNlIGlmICh2bm9kZS0+ZmlkLnZub2RlID4geHZub2RlLT5maWQudm5vZGUpCisJCQlwID0gJigqcCktPnJiX3JpZ2h0OworCQllbHNlIGlmICh2bm9kZS0+ZmlkLnVuaXF1ZSA8IHh2bm9kZS0+ZmlkLnVuaXF1ZSkKKwkJCXAgPSAmKCpwKS0+cmJfbGVmdDsKKwkJZWxzZSBpZiAodm5vZGUtPmZpZC51bmlxdWUgPiB4dm5vZGUtPmZpZC51bmlxdWUpCisJCQlwID0gJigqcCktPnJiX3JpZ2h0OworCQllbHNlCisJCQlCVUcoKTsgLyogY2FuJ3QgaGFwcGVuIHVubGVzcyBhZnNfaWdldCgpIG1hbGZ1bmN0aW9ucyAqLworCX0KKworCXJiX2xpbmtfbm9kZSgmdm5vZGUtPnNlcnZlcl9yYiwgcGFyZW50LCBwKTsKKwlyYl9pbnNlcnRfY29sb3IoJnZub2RlLT5zZXJ2ZXJfcmIsICZzZXJ2ZXItPmZzX3Zub2Rlcyk7CisKKwlzcGluX3VubG9jaygmc2VydmVyLT5mc19sb2NrKTsKKwlfbGVhdmUoIiIpOworfQorCisvKgorICogaW5zZXJ0IGEgdm5vZGUgaW50byB0aGUgcHJvbWlzaW5nIHNlcnZlcidzIHVwZGF0ZS9leHBpcmF0aW9uIHRyZWUKKyAqIC0gY2FsbGVyIG11c3QgaG9sZCB2bm9kZS0+bG9jaworICovCitzdGF0aWMgdm9pZCBhZnNfdm5vZGVfbm90ZV9wcm9taXNlKHN0cnVjdCBhZnNfdm5vZGUgKnZub2RlLAorCQkJCSAgIHN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIpCit7CisJc3RydWN0IGFmc19zZXJ2ZXIgKm9sZF9zZXJ2ZXI7CisJc3RydWN0IGFmc192bm9kZSAqeHZub2RlOworCXN0cnVjdCByYl9ub2RlICpwYXJlbnQsICoqcDsKKworCV9lbnRlcigiJXAsJXAiLCB2bm9kZSwgc2VydmVyKTsKKworCUFTU0VSVChzZXJ2ZXIgIT0gTlVMTCk7CisKKwlvbGRfc2VydmVyID0gdm5vZGUtPnNlcnZlcjsKKwlpZiAodm5vZGUtPmNiX3Byb21pc2VkKSB7CisJCWlmIChzZXJ2ZXIgPT0gb2xkX3NlcnZlciAmJgorCQkgICAgdm5vZGUtPmNiX2V4cGlyZXMgPT0gdm5vZGUtPmNiX2V4cGlyZXNfYXQpIHsKKwkJCV9sZWF2ZSgiIFtubyBjaGFuZ2VdIik7CisJCQlyZXR1cm47CisJCX0KKworCQlzcGluX2xvY2soJm9sZF9zZXJ2ZXItPmNiX2xvY2spOworCQlpZiAodm5vZGUtPmNiX3Byb21pc2VkKSB7CisJCQlfZGVidWcoImRlbGV0ZSIpOworCQkJcmJfZXJhc2UoJnZub2RlLT5jYl9wcm9taXNlLCAmb2xkX3NlcnZlci0+Y2JfcHJvbWlzZXMpOworCQkJdm5vZGUtPmNiX3Byb21pc2VkID0gZmFsc2U7CisJCX0KKwkJc3Bpbl91bmxvY2soJm9sZF9zZXJ2ZXItPmNiX2xvY2spOworCX0KKworCWlmICh2bm9kZS0+c2VydmVyICE9IHNlcnZlcikKKwkJYWZzX2luc3RhbGxfdm5vZGUodm5vZGUsIHNlcnZlcik7CisKKwl2bm9kZS0+Y2JfZXhwaXJlc19hdCA9IHZub2RlLT5jYl9leHBpcmVzOworCV9kZWJ1ZygiUFJPTUlTRSBvbiAlcCB7JWx1fSIsCisJICAgICAgIHZub2RlLCAodW5zaWduZWQgbG9uZykgdm5vZGUtPmNiX2V4cGlyZXNfYXQpOworCisJLyogYWJ1c2UgYW4gUkItdHJlZSB0byBob2xkIHRoZSBleHBpcmF0aW9uIG9yZGVyICh3ZSBtYXkgaGF2ZSBtdWx0aXBsZQorCSAqIGl0ZW1zIHdpdGggdGhlIHNhbWUgZXhwaXJhdGlvbiB0aW1lKSAqLworCXNwaW5fbG9jaygmc2VydmVyLT5jYl9sb2NrKTsKKworCXBhcmVudCA9IE5VTEw7CisJcCA9ICZzZXJ2ZXItPmNiX3Byb21pc2VzLnJiX25vZGU7CisJd2hpbGUgKCpwKSB7CisJCXBhcmVudCA9ICpwOworCQl4dm5vZGUgPSByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCBhZnNfdm5vZGUsIGNiX3Byb21pc2UpOworCQlpZiAodm5vZGUtPmNiX2V4cGlyZXNfYXQgPCB4dm5vZGUtPmNiX2V4cGlyZXNfYXQpCisJCQlwID0gJigqcCktPnJiX2xlZnQ7CisJCWVsc2UKKwkJCXAgPSAmKCpwKS0+cmJfcmlnaHQ7CisJfQorCisJcmJfbGlua19ub2RlKCZ2bm9kZS0+Y2JfcHJvbWlzZSwgcGFyZW50LCBwKTsKKwlyYl9pbnNlcnRfY29sb3IoJnZub2RlLT5jYl9wcm9taXNlLCAmc2VydmVyLT5jYl9wcm9taXNlcyk7CisJdm5vZGUtPmNiX3Byb21pc2VkID0gdHJ1ZTsKKworCXNwaW5fdW5sb2NrKCZzZXJ2ZXItPmNiX2xvY2spOworCV9sZWF2ZSgiIik7Cit9CisKKy8qCisgKiBoYW5kbGUgcmVtb3RlIGZpbGUgZGVsZXRpb24gYnkgZGlzY2FyZGluZyB0aGUgY2FsbGJhY2sgcHJvbWlzZQorICovCitzdGF0aWMgdm9pZCBhZnNfdm5vZGVfZGVsZXRlZF9yZW1vdGVseShzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSkKK3sKKwlzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyOworCisJc2V0X2JpdChBRlNfVk5PREVfREVMRVRFRCwgJnZub2RlLT5mbGFncyk7CisKKwlzZXJ2ZXIgPSB2bm9kZS0+c2VydmVyOworCWlmICh2bm9kZS0+Y2JfcHJvbWlzZWQpIHsKKwkJc3Bpbl9sb2NrKCZzZXJ2ZXItPmNiX2xvY2spOworCQlpZiAodm5vZGUtPmNiX3Byb21pc2VkKSB7CisJCQlyYl9lcmFzZSgmdm5vZGUtPmNiX3Byb21pc2UsICZzZXJ2ZXItPmNiX3Byb21pc2VzKTsKKwkJCXZub2RlLT5jYl9wcm9taXNlZCA9IGZhbHNlOworCQl9CisJCXNwaW5fdW5sb2NrKCZzZXJ2ZXItPmNiX2xvY2spOworCX0KKworCXNwaW5fbG9jaygmdm5vZGUtPnNlcnZlci0+ZnNfbG9jayk7CisJcmJfZXJhc2UoJnZub2RlLT5zZXJ2ZXJfcmIsICZ2bm9kZS0+c2VydmVyLT5mc192bm9kZXMpOworCXNwaW5fdW5sb2NrKCZ2bm9kZS0+c2VydmVyLT5mc19sb2NrKTsKKworCXZub2RlLT5zZXJ2ZXIgPSBOVUxMOworCWFmc19wdXRfc2VydmVyKHNlcnZlcik7Cit9CisKKy8qCisgKiBmaW5pc2ggb2ZmIHVwZGF0aW5nIHRoZSByZWNvcmRlZCBzdGF0dXMgb2YgYSBmaWxlIGFmdGVyIGEgc3VjY2Vzc2Z1bAorICogb3BlcmF0aW9uIGNvbXBsZXRpb24KICAqIC0gc3RhcnRzIGNhbGxiYWNrIGV4cGlyeSB0aW1lcgogICogLSBhZGRzIHRvIHNlcnZlcidzIGNhbGxiYWNrIGxpc3QKICAqLwotc3RhdGljIHZvaWQgYWZzX3Zub2RlX2ZpbmFsaXNlX3N0YXR1c191cGRhdGUoc3RydWN0IGFmc192bm9kZSAqdm5vZGUsCi0JCQkJCSAgICAgc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlciwKLQkJCQkJICAgICBpbnQgcmV0KQordm9pZCBhZnNfdm5vZGVfZmluYWxpc2Vfc3RhdHVzX3VwZGF0ZShzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSwKKwkJCQkgICAgICBzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyKQogewogCXN0cnVjdCBhZnNfc2VydmVyICpvbGRzZXJ2ZXIgPSBOVUxMOwogCi0JX2VudGVyKCIlcCwlcCwlZCIsIHZub2RlLCBzZXJ2ZXIsIHJldCk7CisJX2VudGVyKCIlcCwlcCIsIHZub2RlLCBzZXJ2ZXIpOwogCiAJc3Bpbl9sb2NrKCZ2bm9kZS0+bG9jayk7Ci0KLQl2bm9kZS0+ZmxhZ3MgJj0gfkFGU19WTk9ERV9DSEFOR0VEOwotCi0JaWYgKHJldCA9PSAwKSB7Ci0JCS8qIGFkanVzdCB0aGUgY2FsbGJhY2sgdGltZW91dCBhcHByb3ByaWF0ZWx5ICovCi0JCWFmc19rYWZzdGltb2RfYWRkX3RpbWVyKCZ2bm9kZS0+Y2JfdGltZW91dCwKLQkJCQkJdm5vZGUtPmNiX2V4cGlyeSAqIEhaKTsKLQotCQlzcGluX2xvY2soJmFmc19jYl9oYXNoX2xvY2spOwotCQlsaXN0X21vdmVfdGFpbCgmdm5vZGUtPmNiX2hhc2hfbGluaywKLQkJCSAgICAgICZhZnNfY2JfaGFzaChzZXJ2ZXIsICZ2bm9kZS0+ZmlkKSk7Ci0JCXNwaW5fdW5sb2NrKCZhZnNfY2JfaGFzaF9sb2NrKTsKLQotCQkvKiBzd2FwIHJlZiB0byBvbGQgY2FsbGJhY2sgc2VydmVyIHdpdGggdGhhdCBmb3IgbmV3IGNhbGxiYWNrCi0JCSAqIHNlcnZlciAqLwotCQlvbGRzZXJ2ZXIgPSB4Y2hnKCZ2bm9kZS0+Y2Jfc2VydmVyLCBzZXJ2ZXIpOwotCQlpZiAob2xkc2VydmVyICE9IHNlcnZlcikgewotCQkJaWYgKG9sZHNlcnZlcikgewotCQkJCXNwaW5fbG9jaygmb2xkc2VydmVyLT5jYl9sb2NrKTsKLQkJCQlsaXN0X2RlbF9pbml0KCZ2bm9kZS0+Y2JfbGluayk7Ci0JCQkJc3Bpbl91bmxvY2soJm9sZHNlcnZlci0+Y2JfbG9jayk7Ci0JCQl9Ci0KLQkJCWFmc19nZXRfc2VydmVyKHNlcnZlcik7Ci0JCQlzcGluX2xvY2soJnNlcnZlci0+Y2JfbG9jayk7Ci0JCQlsaXN0X2FkZF90YWlsKCZ2bm9kZS0+Y2JfbGluaywgJnNlcnZlci0+Y2JfcHJvbWlzZXMpOwotCQkJc3Bpbl91bmxvY2soJnNlcnZlci0+Y2JfbG9jayk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvKiBzYW1lIHNlcnZlciAqLwotCQkJb2xkc2VydmVyID0gTlVMTDsKLQkJfQotCX0KLQllbHNlIGlmIChyZXQgPT0gLUVOT0VOVCkgewotCQkvKiB0aGUgZmlsZSB3YXMgZGVsZXRlZCAtIGNsZWFyIHRoZSBjYWxsYmFjayB0aW1lb3V0ICovCi0JCW9sZHNlcnZlciA9IHhjaGcoJnZub2RlLT5jYl9zZXJ2ZXIsIE5VTEwpOwotCQlhZnNfa2Fmc3RpbW9kX2RlbF90aW1lcigmdm5vZGUtPmNiX3RpbWVvdXQpOwotCi0JCV9kZWJ1ZygiZ290IE5PRU5UIGZyb20gc2VydmVyIC0gbWFya2luZyBmaWxlIGRlbGV0ZWQiKTsKLQkJdm5vZGUtPmZsYWdzIHw9IEFGU19WTk9ERV9ERUxFVEVEOwotCX0KLQorCWNsZWFyX2JpdChBRlNfVk5PREVfQ0JfQlJPS0VOLCAmdm5vZGUtPmZsYWdzKTsKKwlhZnNfdm5vZGVfbm90ZV9wcm9taXNlKHZub2RlLCBzZXJ2ZXIpOwogCXZub2RlLT51cGRhdGVfY250LS07Ci0KKwlBU1NFUlRDTVAodm5vZGUtPnVwZGF0ZV9jbnQsID49LCAwKTsKIAlzcGluX3VubG9jaygmdm5vZGUtPmxvY2spOwogCiAJd2FrZV91cF9hbGwoJnZub2RlLT51cGRhdGVfd2FpdHEpOwotCiAJYWZzX3B1dF9zZXJ2ZXIob2xkc2VydmVyKTsKLQogCV9sZWF2ZSgiIik7Cit9CiAKLX0gLyogZW5kIGFmc192bm9kZV9maW5hbGlzZV9zdGF0dXNfdXBkYXRlKCkgKi8KKy8qCisgKiBmaW5pc2ggb2ZmIHVwZGF0aW5nIHRoZSByZWNvcmRlZCBzdGF0dXMgb2YgYSBmaWxlIGFmdGVyIGFuIG9wZXJhdGlvbiBmYWlsZWQKKyAqLworc3RhdGljIHZvaWQgYWZzX3Zub2RlX3N0YXR1c191cGRhdGVfZmFpbGVkKHN0cnVjdCBhZnNfdm5vZGUgKnZub2RlLCBpbnQgcmV0KQoreworCV9lbnRlcigiJXAsJWQiLCB2bm9kZSwgcmV0KTsKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCXNwaW5fbG9jaygmdm5vZGUtPmxvY2spOworCisJY2xlYXJfYml0KEFGU19WTk9ERV9DQl9CUk9LRU4sICZ2bm9kZS0+ZmxhZ3MpOworCisJaWYgKHJldCA9PSAtRU5PRU5UKSB7CisJCS8qIHRoZSBmaWxlIHdhcyBkZWxldGVkIG9uIHRoZSBzZXJ2ZXIgKi8KKwkJX2RlYnVnKCJnb3QgTk9FTlQgZnJvbSBzZXJ2ZXIgLSBtYXJraW5nIGZpbGUgZGVsZXRlZCIpOworCQlhZnNfdm5vZGVfZGVsZXRlZF9yZW1vdGVseSh2bm9kZSk7CisJfQorCisJdm5vZGUtPnVwZGF0ZV9jbnQtLTsKKwlBU1NFUlRDTVAodm5vZGUtPnVwZGF0ZV9jbnQsID49LCAwKTsKKwlzcGluX3VubG9jaygmdm5vZGUtPmxvY2spOworCisJd2FrZV91cF9hbGwoJnZub2RlLT51cGRhdGVfd2FpdHEpOworCV9sZWF2ZSgiIik7Cit9CisKIC8qCiAgKiBmZXRjaCBmaWxlIHN0YXR1cyBmcm9tIHRoZSB2b2x1bWUKICAqIC0gZG9uJ3QgaXNzdWUgYSBmZXRjaCBpZjoKQEAgLTE1Nyw5ICsyNTIsMTEgQEAKICAqICAgLSB0aGVyZSBhcmUgYW55IG91dHN0YW5kaW5nIG9wcyB0aGF0IHdpbGwgZmV0Y2ggdGhlIHN0YXR1cwogICogLSBUT0RPIGltcGxlbWVudCBsb2NhbCBjYWNoaW5nCiAgKi8KLWludCBhZnNfdm5vZGVfZmV0Y2hfc3RhdHVzKHN0cnVjdCBhZnNfdm5vZGUgKnZub2RlKQoraW50IGFmc192bm9kZV9mZXRjaF9zdGF0dXMoc3RydWN0IGFmc192bm9kZSAqdm5vZGUsCisJCQkgICBzdHJ1Y3QgYWZzX3Zub2RlICphdXRoX3Zub2RlLCBzdHJ1Y3Qga2V5ICprZXkpCiB7CiAJc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlcjsKKwl1bnNpZ25lZCBsb25nIGFjbF9vcmRlcjsKIAlpbnQgcmV0OwogCiAJREVDTEFSRV9XQUlUUVVFVUUobXlzZWxmLCBjdXJyZW50KTsKQEAgLTE2OCwzOCArMjY1LDQ5IEBACiAJICAgICAgIHZub2RlLT52b2x1bWUtPnZsb2NhdGlvbi0+dmxkYi5uYW1lLAogCSAgICAgICB2bm9kZS0+ZmlkLnZpZCwgdm5vZGUtPmZpZC52bm9kZSwgdm5vZGUtPmZpZC51bmlxdWUpOwogCi0JaWYgKCEodm5vZGUtPmZsYWdzICYgQUZTX1ZOT0RFX0NIQU5HRUQpICYmIHZub2RlLT5jYl9zZXJ2ZXIpIHsKKwlpZiAoIXRlc3RfYml0KEFGU19WTk9ERV9DQl9CUk9LRU4sICZ2bm9kZS0+ZmxhZ3MpICYmCisJICAgIHZub2RlLT5jYl9wcm9taXNlZCkgewogCQlfbGVhdmUoIiBbdW5jaGFuZ2VkXSIpOwogCQlyZXR1cm4gMDsKIAl9CiAKLQlpZiAodm5vZGUtPmZsYWdzICYgQUZTX1ZOT0RFX0RFTEVURUQpIHsKKwlpZiAodGVzdF9iaXQoQUZTX1ZOT0RFX0RFTEVURUQsICZ2bm9kZS0+ZmxhZ3MpKSB7CiAJCV9sZWF2ZSgiIFtkZWxldGVkXSIpOwogCQlyZXR1cm4gLUVOT0VOVDsKIAl9CiAKKwlhY2xfb3JkZXIgPSAwOworCWlmIChhdXRoX3Zub2RlKQorCQlhY2xfb3JkZXIgPSBhdXRoX3Zub2RlLT5hY2xfb3JkZXI7CisKIAlzcGluX2xvY2soJnZub2RlLT5sb2NrKTsKIAotCWlmICghKHZub2RlLT5mbGFncyAmIEFGU19WTk9ERV9DSEFOR0VEKSkgeworCWlmICghdGVzdF9iaXQoQUZTX1ZOT0RFX0NCX0JST0tFTiwgJnZub2RlLT5mbGFncykgJiYKKwkgICAgdm5vZGUtPmNiX3Byb21pc2VkKSB7CiAJCXNwaW5fdW5sb2NrKCZ2bm9kZS0+bG9jayk7CiAJCV9sZWF2ZSgiIFt1bmNoYW5nZWRdIik7CiAJCXJldHVybiAwOwogCX0KIAorCUFTU0VSVENNUCh2bm9kZS0+dXBkYXRlX2NudCwgPj0sIDApOworCiAJaWYgKHZub2RlLT51cGRhdGVfY250ID4gMCkgewogCQkvKiBzb21lb25lIGVsc2Ugc3RhcnRlZCBhIGZldGNoICovCisJCV9kZWJ1Zygid2FpdCBvbiBmZXRjaCAlZCIsIHZub2RlLT51cGRhdGVfY250KTsKKwogCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCUFTU0VSVChteXNlbGYuZnVuYyAhPSBOVUxMKTsKIAkJYWRkX3dhaXRfcXVldWUoJnZub2RlLT51cGRhdGVfd2FpdHEsICZteXNlbGYpOwogCiAJCS8qIHdhaXQgZm9yIHRoZSBzdGF0dXMgdG8gYmUgdXBkYXRlZCAqLwogCQlmb3IgKDs7KSB7Ci0JCQlpZiAoISh2bm9kZS0+ZmxhZ3MgJiBBRlNfVk5PREVfQ0hBTkdFRCkpCisJCQlpZiAoIXRlc3RfYml0KEFGU19WTk9ERV9DQl9CUk9LRU4sICZ2bm9kZS0+ZmxhZ3MpKQogCQkJCWJyZWFrOwotCQkJaWYgKHZub2RlLT5mbGFncyAmIEFGU19WTk9ERV9ERUxFVEVEKQorCQkJaWYgKHRlc3RfYml0KEFGU19WTk9ERV9ERUxFVEVELCAmdm5vZGUtPmZsYWdzKSkKIAkJCQlicmVhazsKIAotCQkJLyogaXQgZ290IHVwZGF0ZWQgYW5kIGludmFsaWRhdGVkIGFsbCBiZWZvcmUgd2Ugc2F3Ci0JCQkgKiBpdCAqLworCQkJLyogY2hlY2sgdG8gc2VlIGlmIGl0IGdvdCB1cGRhdGVkIGFuZCBpbnZhbGlkYXRlZCBhbGwKKwkJCSAqIGJlZm9yZSB3ZSBzYXcgaXQgKi8KIAkJCWlmICh2bm9kZS0+dXBkYXRlX2NudCA9PSAwKSB7CiAJCQkJcmVtb3ZlX3dhaXRfcXVldWUoJnZub2RlLT51cGRhdGVfd2FpdHEsCiAJCQkJCQkgICZteXNlbGYpOwpAQCAtMjE5LDEwICszMjcsMTEgQEAKIAkJc3Bpbl91bmxvY2soJnZub2RlLT5sb2NrKTsKIAkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKIAotCQlyZXR1cm4gdm5vZGUtPmZsYWdzICYgQUZTX1ZOT0RFX0RFTEVURUQgPyAtRU5PRU5UIDogMDsKKwkJcmV0dXJuIHRlc3RfYml0KEFGU19WTk9ERV9ERUxFVEVELCAmdm5vZGUtPmZsYWdzKSA/CisJCQktRU5PRU5UIDogMDsKIAl9CiAKLSBnZXRfYW55d2F5OgorZ2V0X2FueXdheToKIAkvKiBva2F5Li4uIHdlJ3JlIGdvaW5nIHRvIGhhdmUgdG8gaW5pdGlhdGUgdGhlIG9wICovCiAJdm5vZGUtPnVwZGF0ZV9jbnQrKzsKIApAQCAtMjMyLDM5ICszNDEsNjAgQEAKIAkgKiB2bm9kZSAqLwogCWRvIHsKIAkJLyogcGljayBhIHNlcnZlciB0byBxdWVyeSAqLwotCQlyZXQgPSBhZnNfdm9sdW1lX3BpY2tfZmlsZXNlcnZlcih2bm9kZS0+dm9sdW1lLCAmc2VydmVyKTsKLQkJaWYgKHJldDwwKQotCQkJcmV0dXJuIHJldDsKKwkJc2VydmVyID0gYWZzX3ZvbHVtZV9waWNrX2ZpbGVzZXJ2ZXIodm5vZGUpOworCQlpZiAoSVNfRVJSKHNlcnZlcikpCisJCQlnb3RvIG5vX3NlcnZlcjsKIAotCQlfZGVidWcoIlVTSU5HIFNFUlZFUjogJTA4eFxuIiwgbnRvaGwoc2VydmVyLT5hZGRyLnNfYWRkcikpOworCQlfZGVidWcoIlVTSU5HIFNFUlZFUjogJXB7JTA4eH0iLAorCQkgICAgICAgc2VydmVyLCBudG9obChzZXJ2ZXItPmFkZHIuc19hZGRyKSk7CiAKLQkJcmV0ID0gYWZzX3J4ZnNfZmV0Y2hfZmlsZV9zdGF0dXMoc2VydmVyLCB2bm9kZSwgTlVMTCk7CisJCXJldCA9IGFmc19mc19mZXRjaF9maWxlX3N0YXR1cyhzZXJ2ZXIsIGtleSwgdm5vZGUsIE5VTEwsCisJCQkJCSAgICAgICAmYWZzX3N5bmNfY2FsbCk7CiAKLQl9IHdoaWxlICghYWZzX3ZvbHVtZV9yZWxlYXNlX2ZpbGVzZXJ2ZXIodm5vZGUtPnZvbHVtZSwgc2VydmVyLCByZXQpKTsKKwl9IHdoaWxlICghYWZzX3ZvbHVtZV9yZWxlYXNlX2ZpbGVzZXJ2ZXIodm5vZGUsIHNlcnZlciwgcmV0KSk7CiAKIAkvKiBhZGp1c3QgdGhlIGZsYWdzICovCi0JYWZzX3Zub2RlX2ZpbmFsaXNlX3N0YXR1c191cGRhdGUodm5vZGUsIHNlcnZlciwgcmV0KTsKKwlpZiAocmV0ID09IDApIHsKKwkJX2RlYnVnKCJhZGp1c3QiKTsKKwkJaWYgKGF1dGhfdm5vZGUpCisJCQlhZnNfY2FjaGVfcGVybWl0KHZub2RlLCBrZXksIGFjbF9vcmRlcik7CisJCWFmc192bm9kZV9maW5hbGlzZV9zdGF0dXNfdXBkYXRlKHZub2RlLCBzZXJ2ZXIpOworCQlhZnNfcHV0X3NlcnZlcihzZXJ2ZXIpOworCX0gZWxzZSB7CisJCV9kZWJ1ZygiZmFpbGVkIFslZF0iLCByZXQpOworCQlhZnNfdm5vZGVfc3RhdHVzX3VwZGF0ZV9mYWlsZWQodm5vZGUsIHJldCk7CisJfQogCi0JX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJQVNTRVJUQ01QKHZub2RlLT51cGRhdGVfY250LCA+PSwgMCk7CisKKwlfbGVhdmUoIiA9ICVkIFtjbnQgJWRdIiwgcmV0LCB2bm9kZS0+dXBkYXRlX2NudCk7CiAJcmV0dXJuIHJldDsKLX0gLyogZW5kIGFmc192bm9kZV9mZXRjaF9zdGF0dXMoKSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitub19zZXJ2ZXI6CisJc3Bpbl9sb2NrKCZ2bm9kZS0+bG9jayk7CisJdm5vZGUtPnVwZGF0ZV9jbnQtLTsKKwlBU1NFUlRDTVAodm5vZGUtPnVwZGF0ZV9jbnQsID49LCAwKTsKKwlzcGluX3VubG9jaygmdm5vZGUtPmxvY2spOworCV9sZWF2ZSgiID0gJWxkIFtjbnQgJWRdIiwgUFRSX0VSUihzZXJ2ZXIpLCB2bm9kZS0+dXBkYXRlX2NudCk7CisJcmV0dXJuIFBUUl9FUlIoc2VydmVyKTsKK30KKwogLyoKICAqIGZldGNoIGZpbGUgZGF0YSBmcm9tIHRoZSB2b2x1bWUKLSAqIC0gVE9ETyBpbXBsZW1lbnQgY2FjaGluZyBhbmQgc2VydmVyIGZhaWxvdmVyCisgKiAtIFRPRE8gaW1wbGVtZW50IGNhY2hpbmcKICAqLwotaW50IGFmc192bm9kZV9mZXRjaF9kYXRhKHN0cnVjdCBhZnNfdm5vZGUgKnZub2RlLAotCQkJIHN0cnVjdCBhZnNfcnhmc19mZXRjaF9kZXNjcmlwdG9yICpkZXNjKQoraW50IGFmc192bm9kZV9mZXRjaF9kYXRhKHN0cnVjdCBhZnNfdm5vZGUgKnZub2RlLCBzdHJ1Y3Qga2V5ICprZXksCisJCQkgb2ZmX3Qgb2Zmc2V0LCBzaXplX3QgbGVuZ3RoLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKIAlzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyOwogCWludCByZXQ7CiAKLQlfZW50ZXIoIiVzLHsldSwldSwldX0iLAorCV9lbnRlcigiJXN7JXUsJXUsJXV9LCV4LCwsIiwKIAkgICAgICAgdm5vZGUtPnZvbHVtZS0+dmxvY2F0aW9uLT52bGRiLm5hbWUsCiAJICAgICAgIHZub2RlLT5maWQudmlkLAogCSAgICAgICB2bm9kZS0+ZmlkLnZub2RlLAotCSAgICAgICB2bm9kZS0+ZmlkLnVuaXF1ZSk7CisJICAgICAgIHZub2RlLT5maWQudW5pcXVlLAorCSAgICAgICBrZXlfc2VyaWFsKGtleSkpOwogCiAJLyogdGhpcyBvcCB3aWxsIGZldGNoIHRoZSBzdGF0dXMgKi8KIAlzcGluX2xvY2soJnZub2RlLT5sb2NrKTsKQEAgLTI3NSwxMjAgKzQwNSwzNTEgQEAKIAkgKiB2bm9kZSAqLwogCWRvIHsKIAkJLyogcGljayBhIHNlcnZlciB0byBxdWVyeSAqLwotCQlyZXQgPSBhZnNfdm9sdW1lX3BpY2tfZmlsZXNlcnZlcih2bm9kZS0+dm9sdW1lLCAmc2VydmVyKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OworCQlzZXJ2ZXIgPSBhZnNfdm9sdW1lX3BpY2tfZmlsZXNlcnZlcih2bm9kZSk7CisJCWlmIChJU19FUlIoc2VydmVyKSkKKwkJCWdvdG8gbm9fc2VydmVyOwogCiAJCV9kZWJ1ZygiVVNJTkcgU0VSVkVSOiAlMDh4XG4iLCBudG9obChzZXJ2ZXItPmFkZHIuc19hZGRyKSk7CiAKLQkJcmV0ID0gYWZzX3J4ZnNfZmV0Y2hfZmlsZV9kYXRhKHNlcnZlciwgdm5vZGUsIGRlc2MsIE5VTEwpOworCQlyZXQgPSBhZnNfZnNfZmV0Y2hfZGF0YShzZXJ2ZXIsIGtleSwgdm5vZGUsIG9mZnNldCwgbGVuZ3RoLAorCQkJCQlwYWdlLCAmYWZzX3N5bmNfY2FsbCk7CiAKLQl9IHdoaWxlICghYWZzX3ZvbHVtZV9yZWxlYXNlX2ZpbGVzZXJ2ZXIodm5vZGUtPnZvbHVtZSwgc2VydmVyLCByZXQpKTsKKwl9IHdoaWxlICghYWZzX3ZvbHVtZV9yZWxlYXNlX2ZpbGVzZXJ2ZXIodm5vZGUsIHNlcnZlciwgcmV0KSk7CiAKIAkvKiBhZGp1c3QgdGhlIGZsYWdzICovCi0JYWZzX3Zub2RlX2ZpbmFsaXNlX3N0YXR1c191cGRhdGUodm5vZGUsIHNlcnZlciwgcmV0KTsKKwlpZiAocmV0ID09IDApIHsKKwkJYWZzX3Zub2RlX2ZpbmFsaXNlX3N0YXR1c191cGRhdGUodm5vZGUsIHNlcnZlcik7CisJCWFmc19wdXRfc2VydmVyKHNlcnZlcik7CisJfSBlbHNlIHsKKwkJYWZzX3Zub2RlX3N0YXR1c191cGRhdGVfZmFpbGVkKHZub2RlLCByZXQpOworCX0KIAogCV9sZWF2ZSgiID0gJWQiLCByZXQpOwogCXJldHVybiByZXQ7CiAKLX0gLyogZW5kIGFmc192bm9kZV9mZXRjaF9kYXRhKCkgKi8KK25vX3NlcnZlcjoKKwlzcGluX2xvY2soJnZub2RlLT5sb2NrKTsKKwl2bm9kZS0+dXBkYXRlX2NudC0tOworCUFTU0VSVENNUCh2bm9kZS0+dXBkYXRlX2NudCwgPj0sIDApOworCXNwaW5fdW5sb2NrKCZ2bm9kZS0+bG9jayk7CisJcmV0dXJuIFBUUl9FUlIoc2VydmVyKTsKK30KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKLSAqIGJyZWFrIGFueSBvdXRzdGFuZGluZyBjYWxsYmFjayBvbiBhIHZub2RlCi0gKiAtIG9ubHkgcmVsZXZlbnQgdG8gc2VydmVyIHRoYXQgaXNzdWVkIGl0CisgKiBtYWtlIGEgZmlsZSBvciBhIGRpcmVjdG9yeQogICovCi1pbnQgYWZzX3Zub2RlX2dpdmVfdXBfY2FsbGJhY2soc3RydWN0IGFmc192bm9kZSAqdm5vZGUpCitpbnQgYWZzX3Zub2RlX2NyZWF0ZShzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSwgc3RydWN0IGtleSAqa2V5LAorCQkgICAgIGNvbnN0IGNoYXIgKm5hbWUsIHVtb2RlX3QgbW9kZSwgc3RydWN0IGFmc19maWQgKm5ld2ZpZCwKKwkJICAgICBzdHJ1Y3QgYWZzX2ZpbGVfc3RhdHVzICpuZXdzdGF0dXMsCisJCSAgICAgc3RydWN0IGFmc19jYWxsYmFjayAqbmV3Y2IsIHN0cnVjdCBhZnNfc2VydmVyICoqX3NlcnZlcikKIHsKIAlzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyOwogCWludCByZXQ7CiAKLQlfZW50ZXIoIiVzLHsldSwldSwldX0iLAorCV9lbnRlcigiJXN7JXUsJXUsJXV9LCV4LCVzLCwiLAogCSAgICAgICB2bm9kZS0+dm9sdW1lLT52bG9jYXRpb24tPnZsZGIubmFtZSwKIAkgICAgICAgdm5vZGUtPmZpZC52aWQsCiAJICAgICAgIHZub2RlLT5maWQudm5vZGUsCi0JICAgICAgIHZub2RlLT5maWQudW5pcXVlKTsKKwkgICAgICAgdm5vZGUtPmZpZC51bmlxdWUsCisJICAgICAgIGtleV9zZXJpYWwoa2V5KSwKKwkgICAgICAgbmFtZSk7CiAKLQlzcGluX2xvY2soJmFmc19jYl9oYXNoX2xvY2spOwotCWxpc3RfZGVsX2luaXQoJnZub2RlLT5jYl9oYXNoX2xpbmspOwotCXNwaW5fdW5sb2NrKCZhZnNfY2JfaGFzaF9sb2NrKTsKLQotCS8qIHNldCB0aGUgY2hhbmdlZCBmbGFnIGluIHRoZSB2bm9kZSBhbmQgcmVsZWFzZSB0aGUgc2VydmVyICovCisJLyogdGhpcyBvcCB3aWxsIGZldGNoIHRoZSBzdGF0dXMgb24gdGhlIGRpcmVjdG9yeSB3ZSdyZSBjcmVhdGluZyBpbiAqLwogCXNwaW5fbG9jaygmdm5vZGUtPmxvY2spOwotCi0JYWZzX2thZnN0aW1vZF9kZWxfdGltZXIoJnZub2RlLT5jYl90aW1lb3V0KTsKLQotCXNlcnZlciA9IHhjaGcoJnZub2RlLT5jYl9zZXJ2ZXIsIE5VTEwpOwotCWlmIChzZXJ2ZXIpIHsKLQkJdm5vZGUtPmZsYWdzIHw9IEFGU19WTk9ERV9DSEFOR0VEOwotCi0JCXNwaW5fbG9jaygmc2VydmVyLT5jYl9sb2NrKTsKLQkJbGlzdF9kZWxfaW5pdCgmdm5vZGUtPmNiX2xpbmspOwotCQlzcGluX3VubG9jaygmc2VydmVyLT5jYl9sb2NrKTsKLQl9Ci0KKwl2bm9kZS0+dXBkYXRlX2NudCsrOwogCXNwaW5fdW5sb2NrKCZ2bm9kZS0+bG9jayk7CiAKLQlyZXQgPSAwOwotCWlmIChzZXJ2ZXIpIHsKLQkJcmV0ID0gYWZzX3J4ZnNfZ2l2ZV91cF9jYWxsYmFjayhzZXJ2ZXIsIHZub2RlKTsKLQkJYWZzX3B1dF9zZXJ2ZXIoc2VydmVyKTsKKwlkbyB7CisJCS8qIHBpY2sgYSBzZXJ2ZXIgdG8gcXVlcnkgKi8KKwkJc2VydmVyID0gYWZzX3ZvbHVtZV9waWNrX2ZpbGVzZXJ2ZXIodm5vZGUpOworCQlpZiAoSVNfRVJSKHNlcnZlcikpCisJCQlnb3RvIG5vX3NlcnZlcjsKKworCQlfZGVidWcoIlVTSU5HIFNFUlZFUjogJTA4eFxuIiwgbnRvaGwoc2VydmVyLT5hZGRyLnNfYWRkcikpOworCisJCXJldCA9IGFmc19mc19jcmVhdGUoc2VydmVyLCBrZXksIHZub2RlLCBuYW1lLCBtb2RlLCBuZXdmaWQsCisJCQkJICAgIG5ld3N0YXR1cywgbmV3Y2IsICZhZnNfc3luY19jYWxsKTsKKworCX0gd2hpbGUgKCFhZnNfdm9sdW1lX3JlbGVhc2VfZmlsZXNlcnZlcih2bm9kZSwgc2VydmVyLCByZXQpKTsKKworCS8qIGFkanVzdCB0aGUgZmxhZ3MgKi8KKwlpZiAocmV0ID09IDApIHsKKwkJYWZzX3Zub2RlX2ZpbmFsaXNlX3N0YXR1c191cGRhdGUodm5vZGUsIHNlcnZlcik7CisJCSpfc2VydmVyID0gc2VydmVyOworCX0gZWxzZSB7CisJCWFmc192bm9kZV9zdGF0dXNfdXBkYXRlX2ZhaWxlZCh2bm9kZSwgcmV0KTsKKwkJKl9zZXJ2ZXIgPSBOVUxMOwogCX0KIAotCV9sZWF2ZSgiID0gJWQiLCByZXQpOworCV9sZWF2ZSgiID0gJWQgW2NudCAlZF0iLCByZXQsIHZub2RlLT51cGRhdGVfY250KTsKIAlyZXR1cm4gcmV0OwotfSAvKiBlbmQgYWZzX3Zub2RlX2dpdmVfdXBfY2FsbGJhY2soKSAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitub19zZXJ2ZXI6CisJc3Bpbl9sb2NrKCZ2bm9kZS0+bG9jayk7CisJdm5vZGUtPnVwZGF0ZV9jbnQtLTsKKwlBU1NFUlRDTVAodm5vZGUtPnVwZGF0ZV9jbnQsID49LCAwKTsKKwlzcGluX3VubG9jaygmdm5vZGUtPmxvY2spOworCV9sZWF2ZSgiID0gJWxkIFtjbnQgJWRdIiwgUFRSX0VSUihzZXJ2ZXIpLCB2bm9kZS0+dXBkYXRlX2NudCk7CisJcmV0dXJuIFBUUl9FUlIoc2VydmVyKTsKK30KKwogLyoKLSAqIG1hdGNoIGEgdm5vZGUgcmVjb3JkIHN0b3JlZCBpbiB0aGUgY2FjaGUKKyAqIHJlbW92ZSBhIGZpbGUgb3IgZGlyZWN0b3J5CiAgKi8KLSNpZmRlZiBBRlNfQ0FDSElOR19TVVBQT1JUCi1zdGF0aWMgY2FjaGVmc19tYXRjaF92YWxfdCBhZnNfdm5vZGVfY2FjaGVfbWF0Y2godm9pZCAqdGFyZ2V0LAotCQkJCQkJIGNvbnN0IHZvaWQgKmVudHJ5KQoraW50IGFmc192bm9kZV9yZW1vdmUoc3RydWN0IGFmc192bm9kZSAqdm5vZGUsIHN0cnVjdCBrZXkgKmtleSwgY29uc3QgY2hhciAqbmFtZSwKKwkJICAgICBib29sIGlzZGlyKQogewotCWNvbnN0IHN0cnVjdCBhZnNfY2FjaGVfdm5vZGUgKmN2bm9kZSA9IGVudHJ5OwotCXN0cnVjdCBhZnNfdm5vZGUgKnZub2RlID0gdGFyZ2V0OworCXN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXI7CisJaW50IHJldDsKIAotCV9lbnRlcigieyV4LCV4LCVMeH0seyV4LCV4LCVMeH0iLAorCV9lbnRlcigiJXN7JXUsJXUsJXV9LCV4LCVzIiwKKwkgICAgICAgdm5vZGUtPnZvbHVtZS0+dmxvY2F0aW9uLT52bGRiLm5hbWUsCisJICAgICAgIHZub2RlLT5maWQudmlkLAogCSAgICAgICB2bm9kZS0+ZmlkLnZub2RlLAogCSAgICAgICB2bm9kZS0+ZmlkLnVuaXF1ZSwKLQkgICAgICAgdm5vZGUtPnN0YXR1cy52ZXJzaW9uLAotCSAgICAgICBjdm5vZGUtPnZub2RlX2lkLAotCSAgICAgICBjdm5vZGUtPnZub2RlX3VuaXF1ZSwKLQkgICAgICAgY3Zub2RlLT5kYXRhX3ZlcnNpb24pOworCSAgICAgICBrZXlfc2VyaWFsKGtleSksCisJICAgICAgIG5hbWUpOwogCi0JaWYgKHZub2RlLT5maWQudm5vZGUgIT0gY3Zub2RlLT52bm9kZV9pZCkgewotCQlfbGVhdmUoIiA9IEZBSUxFRCIpOwotCQlyZXR1cm4gQ0FDSEVGU19NQVRDSF9GQUlMRUQ7CisJLyogdGhpcyBvcCB3aWxsIGZldGNoIHRoZSBzdGF0dXMgb24gdGhlIGRpcmVjdG9yeSB3ZSdyZSByZW1vdmluZyBmcm9tICovCisJc3Bpbl9sb2NrKCZ2bm9kZS0+bG9jayk7CisJdm5vZGUtPnVwZGF0ZV9jbnQrKzsKKwlzcGluX3VubG9jaygmdm5vZGUtPmxvY2spOworCisJZG8geworCQkvKiBwaWNrIGEgc2VydmVyIHRvIHF1ZXJ5ICovCisJCXNlcnZlciA9IGFmc192b2x1bWVfcGlja19maWxlc2VydmVyKHZub2RlKTsKKwkJaWYgKElTX0VSUihzZXJ2ZXIpKQorCQkJZ290byBub19zZXJ2ZXI7CisKKwkJX2RlYnVnKCJVU0lORyBTRVJWRVI6ICUwOHhcbiIsIG50b2hsKHNlcnZlci0+YWRkci5zX2FkZHIpKTsKKworCQlyZXQgPSBhZnNfZnNfcmVtb3ZlKHNlcnZlciwga2V5LCB2bm9kZSwgbmFtZSwgaXNkaXIsCisJCQkJICAgICZhZnNfc3luY19jYWxsKTsKKworCX0gd2hpbGUgKCFhZnNfdm9sdW1lX3JlbGVhc2VfZmlsZXNlcnZlcih2bm9kZSwgc2VydmVyLCByZXQpKTsKKworCS8qIGFkanVzdCB0aGUgZmxhZ3MgKi8KKwlpZiAocmV0ID09IDApIHsKKwkJYWZzX3Zub2RlX2ZpbmFsaXNlX3N0YXR1c191cGRhdGUodm5vZGUsIHNlcnZlcik7CisJCWFmc19wdXRfc2VydmVyKHNlcnZlcik7CisJfSBlbHNlIHsKKwkJYWZzX3Zub2RlX3N0YXR1c191cGRhdGVfZmFpbGVkKHZub2RlLCByZXQpOwogCX0KIAotCWlmICh2bm9kZS0+ZmlkLnVuaXF1ZSAhPSBjdm5vZGUtPnZub2RlX3VuaXF1ZSB8fAotCSAgICB2bm9kZS0+c3RhdHVzLnZlcnNpb24gIT0gY3Zub2RlLT5kYXRhX3ZlcnNpb24pIHsKLQkJX2xlYXZlKCIgPSBERUxFVEUiKTsKLQkJcmV0dXJuIENBQ0hFRlNfTUFUQ0hfU1VDQ0VTU19ERUxFVEU7Ci0JfQorCV9sZWF2ZSgiID0gJWQgW2NudCAlZF0iLCByZXQsIHZub2RlLT51cGRhdGVfY250KTsKKwlyZXR1cm4gcmV0OwogCi0JX2xlYXZlKCIgPSBTVUNDRVNTIik7Ci0JcmV0dXJuIENBQ0hFRlNfTUFUQ0hfU1VDQ0VTUzsKLX0gLyogZW5kIGFmc192bm9kZV9jYWNoZV9tYXRjaCgpICovCi0jZW5kaWYKK25vX3NlcnZlcjoKKwlzcGluX2xvY2soJnZub2RlLT5sb2NrKTsKKwl2bm9kZS0+dXBkYXRlX2NudC0tOworCUFTU0VSVENNUCh2bm9kZS0+dXBkYXRlX2NudCwgPj0sIDApOworCXNwaW5fdW5sb2NrKCZ2bm9kZS0+bG9jayk7CisJX2xlYXZlKCIgPSAlbGQgW2NudCAlZF0iLCBQVFJfRVJSKHNlcnZlciksIHZub2RlLT51cGRhdGVfY250KTsKKwlyZXR1cm4gUFRSX0VSUihzZXJ2ZXIpOworfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgotICogdXBkYXRlIGEgdm5vZGUgcmVjb3JkIHN0b3JlZCBpbiB0aGUgY2FjaGUKKyAqIGNyZWF0ZSBhIGhhcmQgbGluawogICovCi0jaWZkZWYgQUZTX0NBQ0hJTkdfU1VQUE9SVAotc3RhdGljIHZvaWQgYWZzX3Zub2RlX2NhY2hlX3VwZGF0ZSh2b2lkICpzb3VyY2UsIHZvaWQgKmVudHJ5KQorZXh0ZXJuIGludCBhZnNfdm5vZGVfbGluayhzdHJ1Y3QgYWZzX3Zub2RlICpkdm5vZGUsIHN0cnVjdCBhZnNfdm5vZGUgKnZub2RlLAorCQkJICBzdHJ1Y3Qga2V5ICprZXksIGNvbnN0IGNoYXIgKm5hbWUpCiB7Ci0Jc3RydWN0IGFmc19jYWNoZV92bm9kZSAqY3Zub2RlID0gZW50cnk7Ci0Jc3RydWN0IGFmc192bm9kZSAqdm5vZGUgPSBzb3VyY2U7CisJc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlcjsKKwlpbnQgcmV0OwogCi0JX2VudGVyKCIiKTsKKwlfZW50ZXIoIiVzeyV1LCV1LCV1fSwlc3sldSwldSwldX0sJXgsJXMiLAorCSAgICAgICBkdm5vZGUtPnZvbHVtZS0+dmxvY2F0aW9uLT52bGRiLm5hbWUsCisJICAgICAgIGR2bm9kZS0+ZmlkLnZpZCwKKwkgICAgICAgZHZub2RlLT5maWQudm5vZGUsCisJICAgICAgIGR2bm9kZS0+ZmlkLnVuaXF1ZSwKKwkgICAgICAgdm5vZGUtPnZvbHVtZS0+dmxvY2F0aW9uLT52bGRiLm5hbWUsCisJICAgICAgIHZub2RlLT5maWQudmlkLAorCSAgICAgICB2bm9kZS0+ZmlkLnZub2RlLAorCSAgICAgICB2bm9kZS0+ZmlkLnVuaXF1ZSwKKwkgICAgICAga2V5X3NlcmlhbChrZXkpLAorCSAgICAgICBuYW1lKTsKIAotCWN2bm9kZS0+dm5vZGVfaWQJPSB2bm9kZS0+ZmlkLnZub2RlOwotCWN2bm9kZS0+dm5vZGVfdW5pcXVlCT0gdm5vZGUtPmZpZC51bmlxdWU7Ci0JY3Zub2RlLT5kYXRhX3ZlcnNpb24JPSB2bm9kZS0+c3RhdHVzLnZlcnNpb247CisJLyogdGhpcyBvcCB3aWxsIGZldGNoIHRoZSBzdGF0dXMgb24gdGhlIGRpcmVjdG9yeSB3ZSdyZSByZW1vdmluZyBmcm9tICovCisJc3Bpbl9sb2NrKCZ2bm9kZS0+bG9jayk7CisJdm5vZGUtPnVwZGF0ZV9jbnQrKzsKKwlzcGluX3VubG9jaygmdm5vZGUtPmxvY2spOworCXNwaW5fbG9jaygmZHZub2RlLT5sb2NrKTsKKwlkdm5vZGUtPnVwZGF0ZV9jbnQrKzsKKwlzcGluX3VubG9jaygmZHZub2RlLT5sb2NrKTsKIAotfSAvKiBlbmQgYWZzX3Zub2RlX2NhY2hlX3VwZGF0ZSgpICovCi0jZW5kaWYKKwlkbyB7CisJCS8qIHBpY2sgYSBzZXJ2ZXIgdG8gcXVlcnkgKi8KKwkJc2VydmVyID0gYWZzX3ZvbHVtZV9waWNrX2ZpbGVzZXJ2ZXIoZHZub2RlKTsKKwkJaWYgKElTX0VSUihzZXJ2ZXIpKQorCQkJZ290byBub19zZXJ2ZXI7CisKKwkJX2RlYnVnKCJVU0lORyBTRVJWRVI6ICUwOHhcbiIsIG50b2hsKHNlcnZlci0+YWRkci5zX2FkZHIpKTsKKworCQlyZXQgPSBhZnNfZnNfbGluayhzZXJ2ZXIsIGtleSwgZHZub2RlLCB2bm9kZSwgbmFtZSwKKwkJCQkgICZhZnNfc3luY19jYWxsKTsKKworCX0gd2hpbGUgKCFhZnNfdm9sdW1lX3JlbGVhc2VfZmlsZXNlcnZlcihkdm5vZGUsIHNlcnZlciwgcmV0KSk7CisKKwkvKiBhZGp1c3QgdGhlIGZsYWdzICovCisJaWYgKHJldCA9PSAwKSB7CisJCWFmc192bm9kZV9maW5hbGlzZV9zdGF0dXNfdXBkYXRlKHZub2RlLCBzZXJ2ZXIpOworCQlhZnNfdm5vZGVfZmluYWxpc2Vfc3RhdHVzX3VwZGF0ZShkdm5vZGUsIHNlcnZlcik7CisJCWFmc19wdXRfc2VydmVyKHNlcnZlcik7CisJfSBlbHNlIHsKKwkJYWZzX3Zub2RlX3N0YXR1c191cGRhdGVfZmFpbGVkKHZub2RlLCByZXQpOworCQlhZnNfdm5vZGVfc3RhdHVzX3VwZGF0ZV9mYWlsZWQoZHZub2RlLCByZXQpOworCX0KKworCV9sZWF2ZSgiID0gJWQgW2NudCAlZF0iLCByZXQsIHZub2RlLT51cGRhdGVfY250KTsKKwlyZXR1cm4gcmV0OworCitub19zZXJ2ZXI6CisJc3Bpbl9sb2NrKCZ2bm9kZS0+bG9jayk7CisJdm5vZGUtPnVwZGF0ZV9jbnQtLTsKKwlBU1NFUlRDTVAodm5vZGUtPnVwZGF0ZV9jbnQsID49LCAwKTsKKwlzcGluX3VubG9jaygmdm5vZGUtPmxvY2spOworCXNwaW5fbG9jaygmZHZub2RlLT5sb2NrKTsKKwlkdm5vZGUtPnVwZGF0ZV9jbnQtLTsKKwlBU1NFUlRDTVAoZHZub2RlLT51cGRhdGVfY250LCA+PSwgMCk7CisJc3Bpbl91bmxvY2soJmR2bm9kZS0+bG9jayk7CisJX2xlYXZlKCIgPSAlbGQgW2NudCAlZF0iLCBQVFJfRVJSKHNlcnZlciksIHZub2RlLT51cGRhdGVfY250KTsKKwlyZXR1cm4gUFRSX0VSUihzZXJ2ZXIpOworfQorCisvKgorICogY3JlYXRlIGEgc3ltYm9saWMgbGluaworICovCitpbnQgYWZzX3Zub2RlX3N5bWxpbmsoc3RydWN0IGFmc192bm9kZSAqdm5vZGUsIHN0cnVjdCBrZXkgKmtleSwKKwkJICAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqY29udGVudCwKKwkJICAgICAgc3RydWN0IGFmc19maWQgKm5ld2ZpZCwKKwkJICAgICAgc3RydWN0IGFmc19maWxlX3N0YXR1cyAqbmV3c3RhdHVzLAorCQkgICAgICBzdHJ1Y3QgYWZzX3NlcnZlciAqKl9zZXJ2ZXIpCit7CisJc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlcjsKKwlpbnQgcmV0OworCisJX2VudGVyKCIlc3sldSwldSwldX0sJXgsJXMsJXMsLCwiLAorCSAgICAgICB2bm9kZS0+dm9sdW1lLT52bG9jYXRpb24tPnZsZGIubmFtZSwKKwkgICAgICAgdm5vZGUtPmZpZC52aWQsCisJICAgICAgIHZub2RlLT5maWQudm5vZGUsCisJICAgICAgIHZub2RlLT5maWQudW5pcXVlLAorCSAgICAgICBrZXlfc2VyaWFsKGtleSksCisJICAgICAgIG5hbWUsIGNvbnRlbnQpOworCisJLyogdGhpcyBvcCB3aWxsIGZldGNoIHRoZSBzdGF0dXMgb24gdGhlIGRpcmVjdG9yeSB3ZSdyZSBjcmVhdGluZyBpbiAqLworCXNwaW5fbG9jaygmdm5vZGUtPmxvY2spOworCXZub2RlLT51cGRhdGVfY250Kys7CisJc3Bpbl91bmxvY2soJnZub2RlLT5sb2NrKTsKKworCWRvIHsKKwkJLyogcGljayBhIHNlcnZlciB0byBxdWVyeSAqLworCQlzZXJ2ZXIgPSBhZnNfdm9sdW1lX3BpY2tfZmlsZXNlcnZlcih2bm9kZSk7CisJCWlmIChJU19FUlIoc2VydmVyKSkKKwkJCWdvdG8gbm9fc2VydmVyOworCisJCV9kZWJ1ZygiVVNJTkcgU0VSVkVSOiAlMDh4XG4iLCBudG9obChzZXJ2ZXItPmFkZHIuc19hZGRyKSk7CisKKwkJcmV0ID0gYWZzX2ZzX3N5bWxpbmsoc2VydmVyLCBrZXksIHZub2RlLCBuYW1lLCBjb250ZW50LAorCQkJCSAgICAgbmV3ZmlkLCBuZXdzdGF0dXMsICZhZnNfc3luY19jYWxsKTsKKworCX0gd2hpbGUgKCFhZnNfdm9sdW1lX3JlbGVhc2VfZmlsZXNlcnZlcih2bm9kZSwgc2VydmVyLCByZXQpKTsKKworCS8qIGFkanVzdCB0aGUgZmxhZ3MgKi8KKwlpZiAocmV0ID09IDApIHsKKwkJYWZzX3Zub2RlX2ZpbmFsaXNlX3N0YXR1c191cGRhdGUodm5vZGUsIHNlcnZlcik7CisJCSpfc2VydmVyID0gc2VydmVyOworCX0gZWxzZSB7CisJCWFmc192bm9kZV9zdGF0dXNfdXBkYXRlX2ZhaWxlZCh2bm9kZSwgcmV0KTsKKwkJKl9zZXJ2ZXIgPSBOVUxMOworCX0KKworCV9sZWF2ZSgiID0gJWQgW2NudCAlZF0iLCByZXQsIHZub2RlLT51cGRhdGVfY250KTsKKwlyZXR1cm4gcmV0OworCitub19zZXJ2ZXI6CisJc3Bpbl9sb2NrKCZ2bm9kZS0+bG9jayk7CisJdm5vZGUtPnVwZGF0ZV9jbnQtLTsKKwlBU1NFUlRDTVAodm5vZGUtPnVwZGF0ZV9jbnQsID49LCAwKTsKKwlzcGluX3VubG9jaygmdm5vZGUtPmxvY2spOworCV9sZWF2ZSgiID0gJWxkIFtjbnQgJWRdIiwgUFRSX0VSUihzZXJ2ZXIpLCB2bm9kZS0+dXBkYXRlX2NudCk7CisJcmV0dXJuIFBUUl9FUlIoc2VydmVyKTsKK30KKworLyoKKyAqIHJlbmFtZSBhIGZpbGUKKyAqLworaW50IGFmc192bm9kZV9yZW5hbWUoc3RydWN0IGFmc192bm9kZSAqb3JpZ19kdm5vZGUsCisJCSAgICAgc3RydWN0IGFmc192bm9kZSAqbmV3X2R2bm9kZSwKKwkJICAgICBzdHJ1Y3Qga2V5ICprZXksCisJCSAgICAgY29uc3QgY2hhciAqb3JpZ19uYW1lLAorCQkgICAgIGNvbnN0IGNoYXIgKm5ld19uYW1lKQoreworCXN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXI7CisJaW50IHJldDsKKworCV9lbnRlcigiJXN7JXUsJXUsJXV9LCVzeyV1LCV1LCV1fSwleCwlcywlcyIsCisJICAgICAgIG9yaWdfZHZub2RlLT52b2x1bWUtPnZsb2NhdGlvbi0+dmxkYi5uYW1lLAorCSAgICAgICBvcmlnX2R2bm9kZS0+ZmlkLnZpZCwKKwkgICAgICAgb3JpZ19kdm5vZGUtPmZpZC52bm9kZSwKKwkgICAgICAgb3JpZ19kdm5vZGUtPmZpZC51bmlxdWUsCisJICAgICAgIG5ld19kdm5vZGUtPnZvbHVtZS0+dmxvY2F0aW9uLT52bGRiLm5hbWUsCisJICAgICAgIG5ld19kdm5vZGUtPmZpZC52aWQsCisJICAgICAgIG5ld19kdm5vZGUtPmZpZC52bm9kZSwKKwkgICAgICAgbmV3X2R2bm9kZS0+ZmlkLnVuaXF1ZSwKKwkgICAgICAga2V5X3NlcmlhbChrZXkpLAorCSAgICAgICBvcmlnX25hbWUsCisJICAgICAgIG5ld19uYW1lKTsKKworCS8qIHRoaXMgb3Agd2lsbCBmZXRjaCB0aGUgc3RhdHVzIG9uIGJvdGggdGhlIGRpcmVjdG9yaWVzIHdlJ3JlIGRlYWxpbmcKKwkgKiB3aXRoICovCisJc3Bpbl9sb2NrKCZvcmlnX2R2bm9kZS0+bG9jayk7CisJb3JpZ19kdm5vZGUtPnVwZGF0ZV9jbnQrKzsKKwlzcGluX3VubG9jaygmb3JpZ19kdm5vZGUtPmxvY2spOworCWlmIChuZXdfZHZub2RlICE9IG9yaWdfZHZub2RlKSB7CisJCXNwaW5fbG9jaygmbmV3X2R2bm9kZS0+bG9jayk7CisJCW5ld19kdm5vZGUtPnVwZGF0ZV9jbnQrKzsKKwkJc3Bpbl91bmxvY2soJm5ld19kdm5vZGUtPmxvY2spOworCX0KKworCWRvIHsKKwkJLyogcGljayBhIHNlcnZlciB0byBxdWVyeSAqLworCQlzZXJ2ZXIgPSBhZnNfdm9sdW1lX3BpY2tfZmlsZXNlcnZlcihvcmlnX2R2bm9kZSk7CisJCWlmIChJU19FUlIoc2VydmVyKSkKKwkJCWdvdG8gbm9fc2VydmVyOworCisJCV9kZWJ1ZygiVVNJTkcgU0VSVkVSOiAlMDh4XG4iLCBudG9obChzZXJ2ZXItPmFkZHIuc19hZGRyKSk7CisKKwkJcmV0ID0gYWZzX2ZzX3JlbmFtZShzZXJ2ZXIsIGtleSwgb3JpZ19kdm5vZGUsIG9yaWdfbmFtZSwKKwkJCQkgICAgbmV3X2R2bm9kZSwgbmV3X25hbWUsICZhZnNfc3luY19jYWxsKTsKKworCX0gd2hpbGUgKCFhZnNfdm9sdW1lX3JlbGVhc2VfZmlsZXNlcnZlcihvcmlnX2R2bm9kZSwgc2VydmVyLCByZXQpKTsKKworCS8qIGFkanVzdCB0aGUgZmxhZ3MgKi8KKwlpZiAocmV0ID09IDApIHsKKwkJYWZzX3Zub2RlX2ZpbmFsaXNlX3N0YXR1c191cGRhdGUob3JpZ19kdm5vZGUsIHNlcnZlcik7CisJCWlmIChuZXdfZHZub2RlICE9IG9yaWdfZHZub2RlKQorCQkJYWZzX3Zub2RlX2ZpbmFsaXNlX3N0YXR1c191cGRhdGUobmV3X2R2bm9kZSwgc2VydmVyKTsKKwkJYWZzX3B1dF9zZXJ2ZXIoc2VydmVyKTsKKwl9IGVsc2UgeworCQlhZnNfdm5vZGVfc3RhdHVzX3VwZGF0ZV9mYWlsZWQob3JpZ19kdm5vZGUsIHJldCk7CisJCWlmIChuZXdfZHZub2RlICE9IG9yaWdfZHZub2RlKQorCQkJYWZzX3Zub2RlX3N0YXR1c191cGRhdGVfZmFpbGVkKG5ld19kdm5vZGUsIHJldCk7CisJfQorCisJX2xlYXZlKCIgPSAlZCBbY250ICVkXSIsIHJldCwgb3JpZ19kdm5vZGUtPnVwZGF0ZV9jbnQpOworCXJldHVybiByZXQ7CisKK25vX3NlcnZlcjoKKwlzcGluX2xvY2soJm9yaWdfZHZub2RlLT5sb2NrKTsKKwlvcmlnX2R2bm9kZS0+dXBkYXRlX2NudC0tOworCUFTU0VSVENNUChvcmlnX2R2bm9kZS0+dXBkYXRlX2NudCwgPj0sIDApOworCXNwaW5fdW5sb2NrKCZvcmlnX2R2bm9kZS0+bG9jayk7CisJaWYgKG5ld19kdm5vZGUgIT0gb3JpZ19kdm5vZGUpIHsKKwkJc3Bpbl9sb2NrKCZuZXdfZHZub2RlLT5sb2NrKTsKKwkJbmV3X2R2bm9kZS0+dXBkYXRlX2NudC0tOworCQlBU1NFUlRDTVAobmV3X2R2bm9kZS0+dXBkYXRlX2NudCwgPj0sIDApOworCQlzcGluX3VubG9jaygmbmV3X2R2bm9kZS0+bG9jayk7CisJfQorCV9sZWF2ZSgiID0gJWxkIFtjbnQgJWRdIiwgUFRSX0VSUihzZXJ2ZXIpLCBvcmlnX2R2bm9kZS0+dXBkYXRlX2NudCk7CisJcmV0dXJuIFBUUl9FUlIoc2VydmVyKTsKK30KZGlmZiAtLWdpdCBhL2ZzL2Fmcy92bm9kZS5oIGIvZnMvYWZzL3Zub2RlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4NmE5NzEuLjAwMDAwMDAKLS0tIGEvZnMvYWZzL3Zub2RlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKiB2bm9kZS5oOiBBRlMgdm5vZGUgcmVjb3JkCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi0KLSNpZm5kZWYgX0xJTlVYX0FGU19WTk9ERV9ICi0jZGVmaW5lIF9MSU5VWF9BRlNfVk5PREVfSAotCi0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlICJzZXJ2ZXIuaCIKLSNpbmNsdWRlICJrYWZzdGltb2QuaCIKLSNpbmNsdWRlICJjYWNoZS5oIgotCi0jaWZkZWYgX19LRVJORUxfXwotCi1zdHJ1Y3QgYWZzX3J4ZnNfZmV0Y2hfZGVzY3JpcHRvcjsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIHZub2RlIGNhdGFsb2d1ZSBlbnRyeQotICovCi1zdHJ1Y3QgYWZzX2NhY2hlX3Zub2RlCi17Ci0JYWZzX3Zub2RlaWRfdAkJdm5vZGVfaWQ7CS8qIHZub2RlIElEICovCi0JdW5zaWduZWQJCXZub2RlX3VuaXF1ZTsJLyogdm5vZGUgSUQgdW5pcXVpZmllciAqLwotCWFmc19kYXRhdmVyc2lvbl90CWRhdGFfdmVyc2lvbjsJLyogZGF0YSB2ZXJzaW9uICovCi19OwotCi0jaWZkZWYgQUZTX0NBQ0hJTkdfU1VQUE9SVAotZXh0ZXJuIHN0cnVjdCBjYWNoZWZzX2luZGV4X2RlZiBhZnNfdm5vZGVfY2FjaGVfaW5kZXhfZGVmOwotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBBRlMgaW5vZGUgcHJpdmF0ZSBkYXRhCi0gKi8KLXN0cnVjdCBhZnNfdm5vZGUKLXsKLQlzdHJ1Y3QgaW5vZGUJCXZmc19pbm9kZTsJLyogdGhlIFZGUydzIGlub2RlIHJlY29yZCAqLwotCi0Jc3RydWN0IGFmc192b2x1bWUJKnZvbHVtZTsJLyogdm9sdW1lIG9uIHdoaWNoIHZub2RlIHJlc2lkZXMgKi8KLQlzdHJ1Y3QgYWZzX2ZpZAkJZmlkOwkJLyogdGhlIGZpbGUgaWRlbnRpZmllciBmb3IgdGhpcyBpbm9kZSAqLwotCXN0cnVjdCBhZnNfZmlsZV9zdGF0dXMJc3RhdHVzOwkJLyogQUZTIHN0YXR1cyBpbmZvIGZvciB0aGlzIGZpbGUgKi8KLSNpZmRlZiBBRlNfQ0FDSElOR19TVVBQT1JUCi0Jc3RydWN0IGNhY2hlZnNfY29va2llCSpjYWNoZTsJCS8qIGNhY2hpbmcgY29va2llICovCi0jZW5kaWYKLQotCXdhaXRfcXVldWVfaGVhZF90CXVwZGF0ZV93YWl0cTsJLyogc3RhdHVzIGZldGNoIHdhaXRxdWV1ZSAqLwotCXVuc2lnbmVkCQl1cGRhdGVfY250OwkvKiBudW1iZXIgb2Ygb3V0c3RhbmRpbmcgb3BzIHRoYXQgd2lsbCB1cGRhdGUgdGhlCi0JCQkJCQkgKiBzdGF0dXMgKi8KLQlzcGlubG9ja190CQlsb2NrOwkJLyogd2FpdHF1ZXVlL2ZsYWdzIGxvY2sgKi8KLQl1bnNpZ25lZAkJZmxhZ3M7Ci0jZGVmaW5lIEFGU19WTk9ERV9DSEFOR0VECTB4MDAwMDAwMDEJLyogc2V0IGlmIHZub2RlIHJlcG9ydGVkIGNoYW5nZWQgYnkgY2FsbGJhY2sgKi8KLSNkZWZpbmUgQUZTX1ZOT0RFX0RFTEVURUQJMHgwMDAwMDAwMgkvKiBzZXQgaWYgdm5vZGUgZGVsZXRlZCBvbiBzZXJ2ZXIgKi8KLSNkZWZpbmUgQUZTX1ZOT0RFX01PVU5UUE9JTlQJMHgwMDAwMDAwNAkvKiBzZXQgaWYgdm5vZGUgaXMgYSBtb3VudHBvaW50IHN5bWxpbmsgKi8KLQotCS8qIG91dHN0YW5kaW5nIGNhbGxiYWNrIG5vdGlmaWNhdGlvbiBvbiB0aGlzIGZpbGUgKi8KLQlzdHJ1Y3QgYWZzX3NlcnZlcgkqY2Jfc2VydmVyOwkvKiBzZXJ2ZXIgdGhhdCBtYWRlIHRoZSBjdXJyZW50IHByb21pc2UgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkCWNiX2xpbms7CS8qIGxpbmsgaW4gc2VydmVyJ3MgcHJvbWlzZXMgbGlzdCAqLwotCXN0cnVjdCBsaXN0X2hlYWQJY2JfaGFzaF9saW5rOwkvKiBsaW5rIGluIG1hc3RlciBjYWxsYmFjayBoYXNoICovCi0Jc3RydWN0IGFmc190aW1lcgljYl90aW1lb3V0OwkvKiB0aW1lb3V0IG9uIHByb21pc2UgKi8KLQl1bnNpZ25lZAkJY2JfdmVyc2lvbjsJLyogY2FsbGJhY2sgdmVyc2lvbiAqLwotCXVuc2lnbmVkCQljYl9leHBpcnk7CS8qIGNhbGxiYWNrIGV4cGlyeSB0aW1lICovCi0JYWZzX2NhbGxiYWNrX3R5cGVfdAljYl90eXBlOwkvKiB0eXBlIG9mIGNhbGxiYWNrICovCi19OwotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBhZnNfdm5vZGUgKkFGU19GU19JKHN0cnVjdCBpbm9kZSAqaW5vZGUpCi17Ci0JcmV0dXJuIGNvbnRhaW5lcl9vZihpbm9kZSxzdHJ1Y3QgYWZzX3Zub2RlLHZmc19pbm9kZSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGlub2RlICpBRlNfVk5PREVfVE9fSShzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSkKLXsKLQlyZXR1cm4gJnZub2RlLT52ZnNfaW5vZGU7Ci19Ci0KLWV4dGVybiBpbnQgYWZzX3Zub2RlX2ZldGNoX3N0YXR1cyhzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSk7Ci0KLWV4dGVybiBpbnQgYWZzX3Zub2RlX2ZldGNoX2RhdGEoc3RydWN0IGFmc192bm9kZSAqdm5vZGUsCi0JCQkJc3RydWN0IGFmc19yeGZzX2ZldGNoX2Rlc2NyaXB0b3IgKmRlc2MpOwotCi1leHRlcm4gaW50IGFmc192bm9kZV9naXZlX3VwX2NhbGxiYWNrKHN0cnVjdCBhZnNfdm5vZGUgKnZub2RlKTsKLQotZXh0ZXJuIHN0cnVjdCBhZnNfdGltZXJfb3BzIGFmc192bm9kZV9jYl90aW1lZF9vdXRfb3BzOwotCi0jZW5kaWYgLyogX19LRVJORUxfXyAqLwotCi0jZW5kaWYgLyogX0xJTlVYX0FGU19WTk9ERV9IICovCmRpZmYgLS1naXQgYS9mcy9hZnMvdm9sdW1lLmMgYi9mcy9hZnMvdm9sdW1lLmMKaW5kZXggNzY4YzZkYi4uZGQxNjBjYSAxMDA2NDQKLS0tIGEvZnMvYWZzL3ZvbHVtZS5jCisrKyBiL2ZzL2Fmcy92b2x1bWUuYwpAQCAtMSw2ICsxLDYgQEAKLS8qIHZvbHVtZS5jOiBBRlMgdm9sdW1lIG1hbmFnZW1lbnQKKy8qIEFGUyB2b2x1bWUgbWFuYWdlbWVudAogICoKLSAqIENvcHlyaWdodCAoQykgMjAwMiBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKQEAgLTE1LDM1ICsxNSwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KLSNpbmNsdWRlICJ2b2x1bWUuaCIKLSNpbmNsdWRlICJ2bm9kZS5oIgotI2luY2x1ZGUgImNlbGwuaCIKLSNpbmNsdWRlICJjYWNoZS5oIgotI2luY2x1ZGUgImNtc2VydmljZS5oIgotI2luY2x1ZGUgImZzY2xpZW50LmgiCi0jaW5jbHVkZSAidmxjbGllbnQuaCIKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogCi0jaWZkZWYgX19LREVCVUcKIHN0YXRpYyBjb25zdCBjaGFyICphZnNfdm9sdHlwZXNbXSA9IHsgIlIvVyIsICJSL08iLCAiQkFLIiB9OwotI2VuZGlmCiAKLSNpZmRlZiBBRlNfQ0FDSElOR19TVVBQT1JUCi1zdGF0aWMgY2FjaGVmc19tYXRjaF92YWxfdCBhZnNfdm9sdW1lX2NhY2hlX21hdGNoKHZvaWQgKnRhcmdldCwKLQkJCQkJCSAgY29uc3Qgdm9pZCAqZW50cnkpOwotc3RhdGljIHZvaWQgYWZzX3ZvbHVtZV9jYWNoZV91cGRhdGUodm9pZCAqc291cmNlLCB2b2lkICplbnRyeSk7Ci0KLXN0cnVjdCBjYWNoZWZzX2luZGV4X2RlZiBhZnNfdm9sdW1lX2NhY2hlX2luZGV4X2RlZiA9IHsKLQkubmFtZQkJPSAidm9sdW1lIiwKLQkuZGF0YV9zaXplCT0gc2l6ZW9mKHN0cnVjdCBhZnNfY2FjaGVfdmhhc2gpLAotCS5rZXlzWzBdCT0geyBDQUNIRUZTX0lOREVYX0tFWVNfQklOLCAxIH0sCi0JLmtleXNbMV0JPSB7IENBQ0hFRlNfSU5ERVhfS0VZU19CSU4sIDEgfSwKLQkubWF0Y2gJCT0gYWZzX3ZvbHVtZV9jYWNoZV9tYXRjaCwKLQkudXBkYXRlCQk9IGFmc192b2x1bWVfY2FjaGVfdXBkYXRlLAotfTsKLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICogbG9va3VwIGEgdm9sdW1lIGJ5IG5hbWUKICAqIC0gdGhpcyBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6CkBAIC02NiwxMTggKzQxLDUyIEBACiAgKiAtIFJ1bGUgMzogSWYgcGFyZW50IHZvbHVtZSBpcyBSL1csIHRoZW4gb25seSBtb3VudCBSL1cgdm9sdW1lIHVubGVzcwogICogICAgICAgICAgIGV4cGxpY2l0bHkgdG9sZCBvdGhlcndpc2UKICAqLwotaW50IGFmc192b2x1bWVfbG9va3VwKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBhZnNfY2VsbCAqY2VsbCwgaW50IHJ3cGF0aCwKLQkJICAgICAgc3RydWN0IGFmc192b2x1bWUgKipfdm9sdW1lKQorc3RydWN0IGFmc192b2x1bWUgKmFmc192b2x1bWVfbG9va3VwKHN0cnVjdCBhZnNfbW91bnRfcGFyYW1zICpwYXJhbXMpCiB7CiAJc3RydWN0IGFmc192bG9jYXRpb24gKnZsb2NhdGlvbiA9IE5VTEw7CiAJc3RydWN0IGFmc192b2x1bWUgKnZvbHVtZSA9IE5VTEw7Ci0JYWZzX3ZvbHR5cGVfdCB0eXBlOwotCWNvbnN0IGNoYXIgKmNlbGxuYW1lLCAqdm9sbmFtZSwgKnN1ZmZpeDsKKwlzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyID0gTlVMTDsKIAljaGFyIHNydnRtYXNrOwotCWludCBmb3JjZSwgcmV0LCBsb29wLCBjZWxsbmFtZXN6LCB2b2xuYW1lc3o7CisJaW50IHJldCwgbG9vcDsKIAotCV9lbnRlcigiJXMsLCVkLCIsIG5hbWUsIHJ3cGF0aCk7Ci0KLQlpZiAoIW5hbWUgfHwgKG5hbWVbMF0gIT0gJyUnICYmIG5hbWVbMF0gIT0gJyMnKSB8fCAhbmFtZVsxXSkgewotCQlwcmludGsoImtBRlM6IHVucGFyc2FibGUgdm9sdW1lIG5hbWVcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQkvKiBkZXRlcm1pbmUgdGhlIHR5cGUgb2Ygdm9sdW1lIHdlJ3JlIGxvb2tpbmcgZm9yICovCi0JZm9yY2UgPSAwOwotCXR5cGUgPSBBRlNWTF9ST1ZPTDsKLQotCWlmIChyd3BhdGggfHwgbmFtZVswXSA9PSAnJScpIHsKLQkJdHlwZSA9IEFGU1ZMX1JXVk9MOwotCQlmb3JjZSA9IDE7Ci0JfQotCi0Jc3VmZml4ID0gc3RycmNocihuYW1lLCAnLicpOwotCWlmIChzdWZmaXgpIHsKLQkJaWYgKHN0cmNtcChzdWZmaXgsICIucmVhZG9ubHkiKSA9PSAwKSB7Ci0JCQl0eXBlID0gQUZTVkxfUk9WT0w7Ci0JCQlmb3JjZSA9IDE7Ci0JCX0KLQkJZWxzZSBpZiAoc3RyY21wKHN1ZmZpeCwgIi5iYWNrdXAiKSA9PSAwKSB7Ci0JCQl0eXBlID0gQUZTVkxfQkFDS1ZPTDsKLQkJCWZvcmNlID0gMTsKLQkJfQotCQllbHNlIGlmIChzdWZmaXhbMV0gPT0gMCkgewotCQl9Ci0JCWVsc2UgewotCQkJc3VmZml4ID0gTlVMTDsKLQkJfQotCX0KLQotCS8qIHNwbGl0IHRoZSBjZWxsIGFuZCB2b2x1bWUgbmFtZXMgKi8KLQluYW1lKys7Ci0Jdm9sbmFtZSA9IHN0cmNocihuYW1lLCAnOicpOwotCWlmICh2b2xuYW1lKSB7Ci0JCWNlbGxuYW1lID0gbmFtZTsKLQkJY2VsbG5hbWVzeiA9IHZvbG5hbWUgLSBuYW1lOwotCQl2b2xuYW1lKys7Ci0JfQotCWVsc2UgewotCQl2b2xuYW1lID0gbmFtZTsKLQkJY2VsbG5hbWUgPSBOVUxMOwotCQljZWxsbmFtZXN6ID0gMDsKLQl9Ci0KLQl2b2xuYW1lc3ogPSBzdWZmaXggPyBzdWZmaXggLSB2b2xuYW1lIDogc3RybGVuKHZvbG5hbWUpOwotCi0JX2RlYnVnKCJDRUxMOiUqLipzIFslcF0gVk9MVU1FOiUqLipzIFNVRkZJWDolcyBUWVBFOiVkJXMiLAotCSAgICAgICBjZWxsbmFtZXN6LCBjZWxsbmFtZXN6LCBjZWxsbmFtZSA/OiAiIiwgY2VsbCwKLQkgICAgICAgdm9sbmFtZXN6LCB2b2xuYW1lc3osIHZvbG5hbWUsIHN1ZmZpeCA/OiAiLSIsCi0JICAgICAgIHR5cGUsCi0JICAgICAgIGZvcmNlID8gIiBGT1JDRSIgOiAiIik7Ci0KLQkvKiBsb29rdXAgdGhlIGNlbGwgcmVjb3JkICovCi0JaWYgKGNlbGxuYW1lIHx8ICFjZWxsKSB7Ci0JCXJldCA9IGFmc19jZWxsX2xvb2t1cChjZWxsbmFtZSwgY2VsbG5hbWVzeiwgJmNlbGwpOwotCQlpZiAocmV0PDApIHsKLQkJCXByaW50aygia0FGUzogdW5hYmxlIHRvIGxvb2t1cCBjZWxsICclcydcbiIsCi0JCQkgICAgICAgY2VsbG5hbWUgPzogIiIpOwotCQkJZ290byBlcnJvcjsKLQkJfQotCX0KLQllbHNlIHsKLQkJYWZzX2dldF9jZWxsKGNlbGwpOwotCX0KKwlfZW50ZXIoInslKi4qcywlZH0iLAorCSAgICAgICBwYXJhbXMtPnZvbG5hbWVzeiwgcGFyYW1zLT52b2xuYW1lc3osIHBhcmFtcy0+dm9sbmFtZSwgcGFyYW1zLT5yd3BhdGgpOwogCiAJLyogbG9va3VwIHRoZSB2b2x1bWUgbG9jYXRpb24gcmVjb3JkICovCi0JcmV0ID0gYWZzX3Zsb2NhdGlvbl9sb29rdXAoY2VsbCwgdm9sbmFtZSwgdm9sbmFtZXN6LCAmdmxvY2F0aW9uKTsKLQlpZiAocmV0IDwgMCkKKwl2bG9jYXRpb24gPSBhZnNfdmxvY2F0aW9uX2xvb2t1cChwYXJhbXMtPmNlbGwsIHBhcmFtcy0+a2V5LAorCQkJCQkgcGFyYW1zLT52b2xuYW1lLCBwYXJhbXMtPnZvbG5hbWVzeik7CisJaWYgKElTX0VSUih2bG9jYXRpb24pKSB7CisJCXJldCA9IFBUUl9FUlIodmxvY2F0aW9uKTsKKwkJdmxvY2F0aW9uID0gTlVMTDsKIAkJZ290byBlcnJvcjsKKwl9CiAKIAkvKiBtYWtlIHRoZSBmaW5hbCBkZWNpc2lvbiBvbiB0aGUgdHlwZSB3ZSB3YW50ICovCiAJcmV0ID0gLUVOT01FRElVTTsKLQlpZiAoZm9yY2UgJiYgISh2bG9jYXRpb24tPnZsZGIudmlkbWFzayAmICgxIDw8IHR5cGUpKSkKKwlpZiAocGFyYW1zLT5mb3JjZSAmJiAhKHZsb2NhdGlvbi0+dmxkYi52aWRtYXNrICYgKDEgPDwgcGFyYW1zLT50eXBlKSkpCiAJCWdvdG8gZXJyb3I7CiAKIAlzcnZ0bWFzayA9IDA7CiAJZm9yIChsb29wID0gMDsgbG9vcCA8IHZsb2NhdGlvbi0+dmxkYi5uc2VydmVyczsgbG9vcCsrKQogCQlzcnZ0bWFzayB8PSB2bG9jYXRpb24tPnZsZGIuc3J2dG1hc2tbbG9vcF07CiAKLQlpZiAoZm9yY2UpIHsKLQkJaWYgKCEoc3J2dG1hc2sgJiAoMSA8PCB0eXBlKSkpCisJaWYgKHBhcmFtcy0+Zm9yY2UpIHsKKwkJaWYgKCEoc3J2dG1hc2sgJiAoMSA8PCBwYXJhbXMtPnR5cGUpKSkKIAkJCWdvdG8gZXJyb3I7Ci0JfQotCWVsc2UgaWYgKHNydnRtYXNrICYgQUZTX1ZPTF9WVE1fUk8pIHsKLQkJdHlwZSA9IEFGU1ZMX1JPVk9MOwotCX0KLQllbHNlIGlmIChzcnZ0bWFzayAmIEFGU19WT0xfVlRNX1JXKSB7Ci0JCXR5cGUgPSBBRlNWTF9SV1ZPTDsKLQl9Ci0JZWxzZSB7CisJfSBlbHNlIGlmIChzcnZ0bWFzayAmIEFGU19WT0xfVlRNX1JPKSB7CisJCXBhcmFtcy0+dHlwZSA9IEFGU1ZMX1JPVk9MOworCX0gZWxzZSBpZiAoc3J2dG1hc2sgJiBBRlNfVk9MX1ZUTV9SVykgeworCQlwYXJhbXMtPnR5cGUgPSBBRlNWTF9SV1ZPTDsKKwl9IGVsc2UgewogCQlnb3RvIGVycm9yOwogCX0KIAotCWRvd25fd3JpdGUoJmNlbGwtPnZsX3NlbSk7CisJZG93bl93cml0ZSgmcGFyYW1zLT5jZWxsLT52bF9zZW0pOwogCiAJLyogaXMgdGhlIHZvbHVtZSBhbHJlYWR5IGFjdGl2ZT8gKi8KLQlpZiAodmxvY2F0aW9uLT52b2xzW3R5cGVdKSB7CisJaWYgKHZsb2NhdGlvbi0+dm9sc1twYXJhbXMtPnR5cGVdKSB7CiAJCS8qIHllcyAtIHJlLXVzZSBpdCAqLwotCQl2b2x1bWUgPSB2bG9jYXRpb24tPnZvbHNbdHlwZV07CisJCXZvbHVtZSA9IHZsb2NhdGlvbi0+dm9sc1twYXJhbXMtPnR5cGVdOwogCQlhZnNfZ2V0X3ZvbHVtZSh2b2x1bWUpOwogCQlnb3RvIHN1Y2Nlc3M7CiAJfQpAQCAtMTkxLDIzICsxMDAsMjQgQEAKIAkJZ290byBlcnJvcl91cDsKIAogCWF0b21pY19zZXQoJnZvbHVtZS0+dXNhZ2UsIDEpOwotCXZvbHVtZS0+dHlwZQkJPSB0eXBlOwotCXZvbHVtZS0+dHlwZV9mb3JjZQk9IGZvcmNlOwotCXZvbHVtZS0+Y2VsbAkJPSBjZWxsOwotCXZvbHVtZS0+dmlkCQk9IHZsb2NhdGlvbi0+dmxkYi52aWRbdHlwZV07CisJdm9sdW1lLT50eXBlCQk9IHBhcmFtcy0+dHlwZTsKKwl2b2x1bWUtPnR5cGVfZm9yY2UJPSBwYXJhbXMtPmZvcmNlOworCXZvbHVtZS0+Y2VsbAkJPSBwYXJhbXMtPmNlbGw7CisJdm9sdW1lLT52aWQJCT0gdmxvY2F0aW9uLT52bGRiLnZpZFtwYXJhbXMtPnR5cGVdOwogCiAJaW5pdF9yd3NlbSgmdm9sdW1lLT5zZXJ2ZXJfc2VtKTsKIAogCS8qIGxvb2sgdXAgYWxsIHRoZSBhcHBsaWNhYmxlIHNlcnZlciByZWNvcmRzICovCiAJZm9yIChsb29wID0gMDsgbG9vcCA8IDg7IGxvb3ArKykgewogCQlpZiAodmxvY2F0aW9uLT52bGRiLnNydnRtYXNrW2xvb3BdICYgKDEgPDwgdm9sdW1lLT50eXBlKSkgewotCQkJcmV0ID0gYWZzX3NlcnZlcl9sb29rdXAoCi0JCQkJdm9sdW1lLT5jZWxsLAotCQkJCSZ2bG9jYXRpb24tPnZsZGIuc2VydmVyc1tsb29wXSwKLQkJCQkmdm9sdW1lLT5zZXJ2ZXJzW3ZvbHVtZS0+bnNlcnZlcnNdKTsKLQkJCWlmIChyZXQgPCAwKQorCQkJc2VydmVyID0gYWZzX2xvb2t1cF9zZXJ2ZXIoCisJCQkgICAgICAgdm9sdW1lLT5jZWxsLCAmdmxvY2F0aW9uLT52bGRiLnNlcnZlcnNbbG9vcF0pOworCQkJaWYgKElTX0VSUihzZXJ2ZXIpKSB7CisJCQkJcmV0ID0gUFRSX0VSUihzZXJ2ZXIpOwogCQkJCWdvdG8gZXJyb3JfZGlzY2FyZDsKKwkJCX0KIAorCQkJdm9sdW1lLT5zZXJ2ZXJzW3ZvbHVtZS0+bnNlcnZlcnNdID0gc2VydmVyOwogCQkJdm9sdW1lLT5uc2VydmVycysrOwogCQl9CiAJfQpAQCAtMjIzLDM1ICsxMzMsMzQgQEAKIAlhZnNfZ2V0X3Zsb2NhdGlvbih2bG9jYXRpb24pOwogCXZvbHVtZS0+dmxvY2F0aW9uID0gdmxvY2F0aW9uOwogCi0JdmxvY2F0aW9uLT52b2xzW3R5cGVdID0gdm9sdW1lOworCXZsb2NhdGlvbi0+dm9sc1t2b2x1bWUtPnR5cGVdID0gdm9sdW1lOwogCi0gc3VjY2VzczoKK3N1Y2Nlc3M6CiAJX2RlYnVnKCJrQUZTIHNlbGVjdGVkICVzIHZvbHVtZSAlMDh4IiwKIAkgICAgICAgYWZzX3ZvbHR5cGVzW3ZvbHVtZS0+dHlwZV0sIHZvbHVtZS0+dmlkKTsKLQkqX3ZvbHVtZSA9IHZvbHVtZTsKLQlyZXQgPSAwOworCXVwX3dyaXRlKCZwYXJhbXMtPmNlbGwtPnZsX3NlbSk7CisJYWZzX3B1dF92bG9jYXRpb24odmxvY2F0aW9uKTsKKwlfbGVhdmUoIiA9ICVwIiwgdm9sdW1lKTsKKwlyZXR1cm4gdm9sdW1lOwogCiAJLyogY2xlYW4gdXAgKi8KLSBlcnJvcl91cDoKLQl1cF93cml0ZSgmY2VsbC0+dmxfc2VtKTsKLSBlcnJvcjoKK2Vycm9yX3VwOgorCXVwX3dyaXRlKCZwYXJhbXMtPmNlbGwtPnZsX3NlbSk7CitlcnJvcjoKIAlhZnNfcHV0X3Zsb2NhdGlvbih2bG9jYXRpb24pOwotCWFmc19wdXRfY2VsbChjZWxsKTsKKwlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwlyZXR1cm4gRVJSX1BUUihyZXQpOwogCi0JX2xlYXZlKCIgPSAlZCAoJXApIiwgcmV0LCB2b2x1bWUpOwotCXJldHVybiByZXQ7Ci0KLSBlcnJvcl9kaXNjYXJkOgotCXVwX3dyaXRlKCZjZWxsLT52bF9zZW0pOworZXJyb3JfZGlzY2FyZDoKKwl1cF93cml0ZSgmcGFyYW1zLT5jZWxsLT52bF9zZW0pOwogCiAJZm9yIChsb29wID0gdm9sdW1lLT5uc2VydmVycyAtIDE7IGxvb3AgPj0gMDsgbG9vcC0tKQogCQlhZnNfcHV0X3NlcnZlcih2b2x1bWUtPnNlcnZlcnNbbG9vcF0pOwogCiAJa2ZyZWUodm9sdW1lKTsKIAlnb3RvIGVycm9yOwotfSAvKiBlbmQgYWZzX3ZvbHVtZV9sb29rdXAoKSAqLworfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICogZGVzdHJveSBhIHZvbHVtZSByZWNvcmQKICAqLwpAQCAtMjY1LDEwICsxNzQsOSBAQAogCiAJX2VudGVyKCIlcCIsIHZvbHVtZSk7CiAKLQl2bG9jYXRpb24gPSB2b2x1bWUtPnZsb2NhdGlvbjsKKwlBU1NFUlRDTVAoYXRvbWljX3JlYWQoJnZvbHVtZS0+dXNhZ2UpLCA+LCAwKTsKIAotCS8qIHNhbml0eSBjaGVjayAqLwotCUJVR19PTihhdG9taWNfcmVhZCgmdm9sdW1lLT51c2FnZSkgPD0gMCk7CisJdmxvY2F0aW9uID0gdm9sdW1lLT52bG9jYXRpb247CiAKIAkvKiB0byBwcmV2ZW50IGEgcmFjZSwgdGhlIGRlY3JlbWVudCBhbmQgdGhlIGRlcXVldWUgbXVzdCBiZSBlZmZlY3RpdmVseQogCSAqIGF0b21pYyAqLwpAQCAtMjk2LDIxICsyMDQsMjcgQEAKIAlrZnJlZSh2b2x1bWUpOwogCiAJX2xlYXZlKCIgW2Rlc3Ryb3llZF0iKTsKLX0gLyogZW5kIGFmc19wdXRfdm9sdW1lKCkgKi8KK30KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAqIHBpY2sgYSBzZXJ2ZXIgdG8gdXNlIHRvIHRyeSBhY2Nlc3NpbmcgdGhpcyB2b2x1bWUKICAqIC0gcmV0dXJucyB3aXRoIGFuIGVsZXZhdGVkIHVzYWdlIGNvdW50IG9uIHRoZSBzZXJ2ZXIgY2hvc2VuCiAgKi8KLWludCBhZnNfdm9sdW1lX3BpY2tfZmlsZXNlcnZlcihzdHJ1Y3QgYWZzX3ZvbHVtZSAqdm9sdW1lLAotCQkJICAgICAgIHN0cnVjdCBhZnNfc2VydmVyICoqX3NlcnZlcikKK3N0cnVjdCBhZnNfc2VydmVyICphZnNfdm9sdW1lX3BpY2tfZmlsZXNlcnZlcihzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSkKIHsKKwlzdHJ1Y3QgYWZzX3ZvbHVtZSAqdm9sdW1lID0gdm5vZGUtPnZvbHVtZTsKIAlzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyOwogCWludCByZXQsIHN0YXRlLCBsb29wOwogCiAJX2VudGVyKCIlcyIsIHZvbHVtZS0+dmxvY2F0aW9uLT52bGRiLm5hbWUpOwogCisJLyogc3RpY2sgd2l0aCB0aGUgc2VydmVyIHdlJ3JlIGFscmVhZHkgdXNpbmcgaWYgd2UgY2FuICovCisJaWYgKHZub2RlLT5zZXJ2ZXIgJiYgdm5vZGUtPnNlcnZlci0+ZnNfc3RhdGUgPT0gMCkgeworCQlhZnNfZ2V0X3NlcnZlcih2bm9kZS0+c2VydmVyKTsKKwkJX2xlYXZlKCIgPSAlcCBbY3VycmVudF0iLCB2bm9kZS0+c2VydmVyKTsKKwkJcmV0dXJuIHZub2RlLT5zZXJ2ZXI7CisJfQorCiAJZG93bl9yZWFkKCZ2b2x1bWUtPnNlcnZlcl9zZW0pOwogCiAJLyogaGFuZGxlIHRoZSBuby1zZXJ2ZXIgY2FzZSAqLwpAQCAtMzE4LDcgKzIzMiw3IEBACiAJCXJldCA9IHZvbHVtZS0+cmpzZXJ2ZXJzID8gLUVOT01FRElVTSA6IC1FU1RBTEU7CiAJCXVwX3JlYWQoJnZvbHVtZS0+c2VydmVyX3NlbSk7CiAJCV9sZWF2ZSgiID0gJWQgW25vIHNlcnZlcnNdIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKKwkJcmV0dXJuIEVSUl9QVFIocmV0KTsKIAl9CiAKIAkvKiBiYXNpY2FsbHksIGp1c3Qgc2VhcmNoIHRoZSBsaXN0IGZvciB0aGUgZmlyc3QgbGl2ZSBzZXJ2ZXIgYW5kIHVzZQpAQCAtMzI4LDE1ICsyNDIsMTYgQEAKIAkJc2VydmVyID0gdm9sdW1lLT5zZXJ2ZXJzW2xvb3BdOwogCQlzdGF0ZSA9IHNlcnZlci0+ZnNfc3RhdGU7CiAKKwkJX2RlYnVnKCJjb25zaWRlciAlZCBbJWRdIiwgbG9vcCwgc3RhdGUpOworCiAJCXN3aXRjaCAoc3RhdGUpIHsKIAkJCS8qIGZvdW5kIGFuIGFwcGFyZW50bHkgaGVhbHRoeSBzZXJ2ZXIgKi8KIAkJY2FzZSAwOgogCQkJYWZzX2dldF9zZXJ2ZXIoc2VydmVyKTsKIAkJCXVwX3JlYWQoJnZvbHVtZS0+c2VydmVyX3NlbSk7Ci0JCQkqX3NlcnZlciA9IHNlcnZlcjsKLQkJCV9sZWF2ZSgiID0gMCAocGlja2VkICUwOHgpIiwKLQkJCSAgICAgICBudG9obChzZXJ2ZXItPmFkZHIuc19hZGRyKSk7Ci0JCQlyZXR1cm4gMDsKKwkJCV9sZWF2ZSgiID0gJXAgKHBpY2tlZCAlMDh4KSIsCisJCQkgICAgICAgc2VydmVyLCBudG9obChzZXJ2ZXItPmFkZHIuc19hZGRyKSk7CisJCQlyZXR1cm4gc2VydmVyOwogCiAJCWNhc2UgLUVORVRVTlJFQUNIOgogCQkJaWYgKHJldCA9PSAwKQpAQCAtMzcyLDIwICsyODcsMjEgQEAKIAkgKi8KIAl1cF9yZWFkKCZ2b2x1bWUtPnNlcnZlcl9zZW0pOwogCV9sZWF2ZSgiID0gJWQiLCByZXQpOwotCXJldHVybiByZXQ7Ci19IC8qIGVuZCBhZnNfdm9sdW1lX3BpY2tfZmlsZXNlcnZlcigpICovCisJcmV0dXJuIEVSUl9QVFIocmV0KTsKK30KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAqIHJlbGVhc2UgYSBzZXJ2ZXIgYWZ0ZXIgdXNlCiAgKiAtIHJlbGVhc2VzIHRoZSByZWYgb24gdGhlIHNlcnZlciBzdHJ1Y3QgdGhhdCB3YXMgYWNxdWlyZWQgYnkgcGlja2luZwogICogLSByZWNvcmRzIHJlc3VsdCBvZiB1c2luZyBhIHBhcnRpY3VsYXIgc2VydmVyIHRvIGFjY2VzcyBhIHZvbHVtZQogICogLSByZXR1cm4gMCB0byB0cnkgYWdhaW4sIDEgaWYgb2theSBvciB0byBpc3N1ZSBlcnJvcgorICogLSB0aGUgY2FsbGVyIG11c3QgcmVsZWFzZSB0aGUgc2VydmVyIHN0cnVjdCBpZiByZXN1bHQgd2FzIDAKICAqLwotaW50IGFmc192b2x1bWVfcmVsZWFzZV9maWxlc2VydmVyKHN0cnVjdCBhZnNfdm9sdW1lICp2b2x1bWUsCitpbnQgYWZzX3ZvbHVtZV9yZWxlYXNlX2ZpbGVzZXJ2ZXIoc3RydWN0IGFmc192bm9kZSAqdm5vZGUsCiAJCQkJICBzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyLAogCQkJCSAgaW50IHJlc3VsdCkKIHsKKwlzdHJ1Y3QgYWZzX3ZvbHVtZSAqdm9sdW1lID0gdm5vZGUtPnZvbHVtZTsKIAl1bnNpZ25lZCBsb29wOwogCiAJX2VudGVyKCIlcywlMDh4LCVkIiwKQEAgLTM5NiwxNCArMzEyLDE2IEBACiAJCS8qIHN1Y2Nlc3MgKi8KIAljYXNlIDA6CiAJCXNlcnZlci0+ZnNfYWN0X2ppZiA9IGppZmZpZXM7Ci0JCWJyZWFrOworCQlzZXJ2ZXItPmZzX3N0YXRlID0gMDsKKwkJX2xlYXZlKCIiKTsKKwkJcmV0dXJuIDE7CiAKIAkJLyogdGhlIGZpbGVzZXJ2ZXIgZGVuaWVkIGFsbCBrbm93bGVkZ2Ugb2YgdGhlIHZvbHVtZSAqLwogCWNhc2UgLUVOT01FRElVTToKIAkJc2VydmVyLT5mc19hY3RfamlmID0gamlmZmllczsKIAkJZG93bl93cml0ZSgmdm9sdW1lLT5zZXJ2ZXJfc2VtKTsKIAotCQkvKiBmaXJzdCwgZmluZCB3aGVyZSB0aGUgc2VydmVyIGlzIGluIHRoZSBhY3RpdmUgbGlzdCAoaWYgaXQKKwkJLyogZmlyc3RseSwgZmluZCB3aGVyZSB0aGUgc2VydmVyIGlzIGluIHRoZSBhY3RpdmUgbGlzdCAoaWYgaXQKIAkJICogaXMpICovCiAJCWZvciAobG9vcCA9IDA7IGxvb3AgPCB2b2x1bWUtPm5zZXJ2ZXJzOyBsb29wKyspCiAJCQlpZiAodm9sdW1lLT5zZXJ2ZXJzW2xvb3BdID09IHNlcnZlcikKQEAgLTQ0MSw2ICszNTksNyBAQAogCWNhc2UgLUVORVRVTlJFQUNIOgogCWNhc2UgLUVIT1NUVU5SRUFDSDoKIAljYXNlIC1FQ09OTlJFRlVTRUQ6CisJY2FzZSAtRVRJTUU6CiAJY2FzZSAtRVRJTUVET1VUOgogCWNhc2UgLUVSRU1PVEVJTzoKIAkJLyogbWFyayB0aGUgc2VydmVyIGFzIGRlYWQKQEAgLTQ2MCw2MCArMzc5LDE3IEBACiAJCXNlcnZlci0+ZnNfYWN0X2ppZiA9IGppZmZpZXM7CiAJY2FzZSAtRU5PTUVNOgogCWNhc2UgLUVOT05FVDoKLQkJYnJlYWs7CisJCS8qIHRlbGwgdGhlIGNhbGxlciB0byBhY2NlcHQgdGhlIHJlc3VsdCAqLworCQlhZnNfcHV0X3NlcnZlcihzZXJ2ZXIpOworCQlfbGVhdmUoIiBbbG9jYWwgZmFpbHVyZV0iKTsKKwkJcmV0dXJuIDE7CiAJfQogCi0JLyogdGVsbCB0aGUgY2FsbGVyIHRvIGFjY2VwdCB0aGUgcmVzdWx0ICovCi0JYWZzX3B1dF9zZXJ2ZXIoc2VydmVyKTsKLQlfbGVhdmUoIiIpOwotCXJldHVybiAxOwotCiAJLyogdGVsbCB0aGUgY2FsbGVyIHRvIGxvb3AgYXJvdW5kIGFuZCB0cnkgdGhlIG5leHQgc2VydmVyICovCi0gdHJ5X25leHRfc2VydmVyX3VwdzoKK3RyeV9uZXh0X3NlcnZlcl91cHc6CiAJdXBfd3JpdGUoJnZvbHVtZS0+c2VydmVyX3NlbSk7Ci0gdHJ5X25leHRfc2VydmVyOgordHJ5X25leHRfc2VydmVyOgogCWFmc19wdXRfc2VydmVyKHNlcnZlcik7CiAJX2xlYXZlKCIgW3RyeSBuZXh0IHNlcnZlcl0iKTsKIAlyZXR1cm4gMDsKLQotfSAvKiBlbmQgYWZzX3ZvbHVtZV9yZWxlYXNlX2ZpbGVzZXJ2ZXIoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogbWF0Y2ggYSB2b2x1bWUgaGFzaCByZWNvcmQgc3RvcmVkIGluIHRoZSBjYWNoZQotICovCi0jaWZkZWYgQUZTX0NBQ0hJTkdfU1VQUE9SVAotc3RhdGljIGNhY2hlZnNfbWF0Y2hfdmFsX3QgYWZzX3ZvbHVtZV9jYWNoZV9tYXRjaCh2b2lkICp0YXJnZXQsCi0JCQkJCQkgIGNvbnN0IHZvaWQgKmVudHJ5KQotewotCWNvbnN0IHN0cnVjdCBhZnNfY2FjaGVfdmhhc2ggKnZoYXNoID0gZW50cnk7Ci0Jc3RydWN0IGFmc192b2x1bWUgKnZvbHVtZSA9IHRhcmdldDsKLQotCV9lbnRlcigieyV1fSx7JXV9Iiwgdm9sdW1lLT50eXBlLCB2aGFzaC0+dnR5cGUpOwotCi0JaWYgKHZvbHVtZS0+dHlwZSA9PSB2aGFzaC0+dnR5cGUpIHsKLQkJX2xlYXZlKCIgPSBTVUNDRVNTIik7Ci0JCXJldHVybiBDQUNIRUZTX01BVENIX1NVQ0NFU1M7Ci0JfQotCi0JX2xlYXZlKCIgPSBGQUlMRUQiKTsKLQlyZXR1cm4gQ0FDSEVGU19NQVRDSF9GQUlMRUQ7Ci19IC8qIGVuZCBhZnNfdm9sdW1lX2NhY2hlX21hdGNoKCkgKi8KLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogdXBkYXRlIGEgdm9sdW1lIGhhc2ggcmVjb3JkIHN0b3JlZCBpbiB0aGUgY2FjaGUKLSAqLwotI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKLXN0YXRpYyB2b2lkIGFmc192b2x1bWVfY2FjaGVfdXBkYXRlKHZvaWQgKnNvdXJjZSwgdm9pZCAqZW50cnkpCi17Ci0Jc3RydWN0IGFmc19jYWNoZV92aGFzaCAqdmhhc2ggPSBlbnRyeTsKLQlzdHJ1Y3QgYWZzX3ZvbHVtZSAqdm9sdW1lID0gc291cmNlOwotCi0JX2VudGVyKCIiKTsKLQotCXZoYXNoLT52dHlwZSA9IHZvbHVtZS0+dHlwZTsKLQotfSAvKiBlbmQgYWZzX3ZvbHVtZV9jYWNoZV91cGRhdGUoKSAqLwotI2VuZGlmCit9CmRpZmYgLS1naXQgYS9mcy9hZnMvdm9sdW1lLmggYi9mcy9hZnMvdm9sdW1lLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGNmMTkuLjAwMDAwMDAKLS0tIGEvZnMvYWZzL3ZvbHVtZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qIHZvbHVtZS5oOiBBRlMgdm9sdW1lIG1hbmFnZW1lbnQKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLQotI2lmbmRlZiBfTElOVVhfQUZTX1ZPTFVNRV9ICi0jZGVmaW5lIF9MSU5VWF9BRlNfVk9MVU1FX0gKLQotI2luY2x1ZGUgInR5cGVzLmgiCi0jaW5jbHVkZSAiZnNjbGllbnQuaCIKLSNpbmNsdWRlICJrYWZzdGltb2QuaCIKLSNpbmNsdWRlICJrYWZzYXN5bmNkLmgiCi0jaW5jbHVkZSAiY2FjaGUuaCIKLQotdHlwZWRlZiBlbnVtIHsKLQlBRlNfVkxVUERfU0xFRVAsCQkvKiBzbGVlcGluZyB3YWl0aW5nIGZvciB1cGRhdGUgdGltZXIgdG8gZmlyZSAqLwotCUFGU19WTFVQRF9QRU5ESU5HLAkJLyogb24gcGVuZGluZyBxdWV1ZSAqLwotCUFGU19WTFVQRF9JTlBST0dSRVNTLAkJLyogb3AgaW4gcHJvZ3Jlc3MgKi8KLQlBRlNfVkxVUERfQlVTWVNMRUVQLAkJLyogc2xlZXBpbmcgYmVjYXVzZSBzZXJ2ZXIgcmV0dXJuZWQgRUJVU1kgKi8KLQkKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgYWZzX3Zsb2NhdGlvbl91cGRfdDsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIGVudHJ5IGluIHRoZSBjYWNoZWQgdm9sdW1lIGxvY2F0aW9uIGNhdGFsb2d1ZQotICovCi1zdHJ1Y3QgYWZzX2NhY2hlX3Zsb2NhdGlvbgotewotCXVpbnQ4X3QJCQluYW1lWzY0XTsJLyogdm9sdW1lIG5hbWUgKGxvd2VyY2FzZSwgcGFkZGVkIHdpdGggTlVMcykgKi8KLQl1aW50OF90CQkJbnNlcnZlcnM7CS8qIG51bWJlciBvZiBlbnRyaWVzIHVzZWQgaW4gc2VydmVyc1tdICovCi0JdWludDhfdAkJCXZpZG1hc2s7CS8qIHZvbHR5cGUgbWFzayBmb3IgdmlkW10gKi8KLQl1aW50OF90CQkJc3J2dG1hc2tbOF07CS8qIHZvbHR5cGUgbWFza3MgZm9yIHNlcnZlcnNbXSAqLwotI2RlZmluZSBBRlNfVk9MX1ZUTV9SVwkweDAxIC8qIFIvVyB2ZXJzaW9uIG9mIHRoZSB2b2x1bWUgaXMgYXZhaWxhYmxlIChvbiB0aGlzIHNlcnZlcikgKi8KLSNkZWZpbmUgQUZTX1ZPTF9WVE1fUk8JMHgwMiAvKiBSL08gdmVyc2lvbiBvZiB0aGUgdm9sdW1lIGlzIGF2YWlsYWJsZSAob24gdGhpcyBzZXJ2ZXIpICovCi0jZGVmaW5lIEFGU19WT0xfVlRNX0JBSwkweDA0IC8qIGJhY2t1cCB2ZXJzaW9uIG9mIHRoZSB2b2x1bWUgaXMgYXZhaWxhYmxlIChvbiB0aGlzIHNlcnZlcikgKi8KLQotCWFmc192b2xpZF90CQl2aWRbM107CQkvKiB2b2x1bWUgSURzIGZvciBSL1csIFIvTyBhbmQgQmFrIHZvbHVtZXMgKi8KLQlzdHJ1Y3QgaW5fYWRkcgkJc2VydmVyc1s4XTsJLyogZmlsZXNlcnZlciBhZGRyZXNzZXMgKi8KLQl0aW1lX3QJCQlydGltZTsJCS8qIGxhc3QgcmV0cmlldmFsIHRpbWUgKi8KLX07Ci0KLSNpZmRlZiBBRlNfQ0FDSElOR19TVVBQT1JUCi1leHRlcm4gc3RydWN0IGNhY2hlZnNfaW5kZXhfZGVmIGFmc192bG9jYXRpb25fY2FjaGVfaW5kZXhfZGVmOwotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiB2b2x1bWUgLT4gdm5vZGUgaGFzaCB0YWJsZSBlbnRyeQotICovCi1zdHJ1Y3QgYWZzX2NhY2hlX3ZoYXNoCi17Ci0JYWZzX3ZvbHR5cGVfdAkJdnR5cGU7CQkvKiB3aGljaCB2b2x1bWUgdmFyaWF0aW9uICovCi0JdWludDhfdAkJCWhhc2hfYnVja2V0OwkvKiB3aGljaCBoYXNoIGJ1Y2tldCB0aGlzIHJlcHJlc2VudHMgKi8KLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLSNpZmRlZiBBRlNfQ0FDSElOR19TVVBQT1JUCi1leHRlcm4gc3RydWN0IGNhY2hlZnNfaW5kZXhfZGVmIGFmc192b2x1bWVfY2FjaGVfaW5kZXhfZGVmOwotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBBRlMgdm9sdW1lIGxvY2F0aW9uIHJlY29yZAotICovCi1zdHJ1Y3QgYWZzX3Zsb2NhdGlvbgotewotCWF0b21pY190CQl1c2FnZTsKLQlzdHJ1Y3QgbGlzdF9oZWFkCWxpbms7CQkvKiBsaW5rIGluIGNlbGwgdm9sdW1lIGxvY2F0aW9uIGxpc3QgKi8KLQlzdHJ1Y3QgYWZzX3RpbWVyCXRpbWVvdXQ7CS8qIGRlY2FjaGluZyB0aW1lciAqLwotCXN0cnVjdCBhZnNfY2VsbAkJKmNlbGw7CQkvKiBjZWxsIHRvIHdoaWNoIHZvbHVtZSBiZWxvbmdzICovCi0jaWZkZWYgQUZTX0NBQ0hJTkdfU1VQUE9SVAotCXN0cnVjdCBjYWNoZWZzX2Nvb2tpZQkqY2FjaGU7CQkvKiBjYWNoaW5nIGNvb2tpZSAqLwotI2VuZGlmCi0Jc3RydWN0IGFmc19jYWNoZV92bG9jYXRpb24gdmxkYjsJLyogdm9sdW1lIGluZm9ybWF0aW9uIERCIHJlY29yZCAqLwotCXN0cnVjdCBhZnNfdm9sdW1lCSp2b2xzWzNdOwkvKiB2b2x1bWUgYWNjZXNzIHJlY29yZCBwb2ludGVyIChpbmRleCBieSB0eXBlKSAqLwotCXJ3bG9ja190CQlsb2NrOwkJLyogYWNjZXNzIGxvY2sgKi8KLQl1bnNpZ25lZCBsb25nCQlyZWFkX2ppZjsJLyogdGltZSBhdCB3aGljaCBsYXN0IHJlYWQgZnJvbSB2bHNlcnZlciAqLwotCXN0cnVjdCBhZnNfdGltZXIJdXBkX3RpbWVyOwkvKiB1cGRhdGUgdGltZXIgKi8KLQlzdHJ1Y3QgYWZzX2FzeW5jX29wCXVwZF9vcDsJCS8qIHVwZGF0ZSBvcGVyYXRpb24gKi8KLQlhZnNfdmxvY2F0aW9uX3VwZF90CXVwZF9zdGF0ZTsJLyogdXBkYXRlIHN0YXRlICovCi0JdW5zaWduZWQgc2hvcnQJCXVwZF9maXJzdF9zdml4OwkvKiBmaXJzdCBzZXJ2ZXIgaW5kZXggZHVyaW5nIHVwZGF0ZSAqLwotCXVuc2lnbmVkIHNob3J0CQl1cGRfY3Vycl9zdml4OwkvKiBjdXJyZW50IHNlcnZlciBpbmRleCBkdXJpbmcgdXBkYXRlICovCi0JdW5zaWduZWQgc2hvcnQJCXVwZF9yZWpfY250OwkvKiBFTk9NRURJVU0gY291bnQgZHVyaW5nIHVwZGF0ZSAqLwotCXVuc2lnbmVkIHNob3J0CQl1cGRfYnVzeV9jbnQ7CS8qIEVCVVNZIGNvdW50IGR1cmluZyB1cGRhdGUgKi8KLQl1bnNpZ25lZCBzaG9ydAkJdmFsaWQ7CQkvKiBUIGlmIHZhbGlkICovCi19OwotCi1leHRlcm4gaW50IGFmc192bG9jYXRpb25fbG9va3VwKHN0cnVjdCBhZnNfY2VsbCAqY2VsbCwKLQkJCQljb25zdCBjaGFyICpuYW1lLAotCQkJCXVuc2lnbmVkIG5hbWVzeiwKLQkJCQlzdHJ1Y3QgYWZzX3Zsb2NhdGlvbiAqKl92bG9jYXRpb24pOwotCi0jZGVmaW5lIGFmc19nZXRfdmxvY2F0aW9uKFYpIGRvIHsgYXRvbWljX2luYygmKFYpLT51c2FnZSk7IH0gd2hpbGUoMCkKLQotZXh0ZXJuIHZvaWQgYWZzX3B1dF92bG9jYXRpb24oc3RydWN0IGFmc192bG9jYXRpb24gKnZsb2NhdGlvbik7Ci1leHRlcm4gdm9pZCBhZnNfdmxvY2F0aW9uX2RvX3RpbWVvdXQoc3RydWN0IGFmc192bG9jYXRpb24gKnZsb2NhdGlvbik7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBBRlMgdm9sdW1lIGFjY2VzcyByZWNvcmQKLSAqLwotc3RydWN0IGFmc192b2x1bWUKLXsKLQlhdG9taWNfdAkJdXNhZ2U7Ci0Jc3RydWN0IGFmc19jZWxsCQkqY2VsbDsJCS8qIGNlbGwgdG8gd2hpY2ggYmVsb25ncyAodW5yZWZkIHB0cikgKi8KLQlzdHJ1Y3QgYWZzX3Zsb2NhdGlvbgkqdmxvY2F0aW9uOwkvKiB2b2x1bWUgbG9jYXRpb24gKi8KLSNpZmRlZiBBRlNfQ0FDSElOR19TVVBQT1JUCi0Jc3RydWN0IGNhY2hlZnNfY29va2llCSpjYWNoZTsJCS8qIGNhY2hpbmcgY29va2llICovCi0jZW5kaWYKLQlhZnNfdm9saWRfdAkJdmlkOwkJLyogdm9sdW1lIElEICovCi0JYWZzX3ZvbHR5cGVfdAkJdHlwZTsJCS8qIHR5cGUgb2Ygdm9sdW1lICovCi0JY2hhcgkJCXR5cGVfZm9yY2U7CS8qIGZvcmNlIHZvbHVtZSB0eXBlIChzdXBwcmVzcyBSL08gLT4gUi9XKSAqLwotCXVuc2lnbmVkIHNob3J0CQluc2VydmVyczsJLyogbnVtYmVyIG9mIHNlcnZlciBzbG90cyBmaWxsZWQgKi8KLQl1bnNpZ25lZCBzaG9ydAkJcmpzZXJ2ZXJzOwkvKiBudW1iZXIgb2Ygc2VydmVycyBkaXNjYXJkZWQgZHVlIHRvIC1FTk9NRURJVU0gKi8KLQlzdHJ1Y3QgYWZzX3NlcnZlcgkqc2VydmVyc1s4XTsJLyogc2VydmVycyBvbiB3aGljaCB2b2x1bWUgcmVzaWRlcyAob3JkZXJlZCkgKi8KLQlzdHJ1Y3Qgcndfc2VtYXBob3JlCXNlcnZlcl9zZW07CS8qIGxvY2sgZm9yIGFjY2Vzc2luZyBjdXJyZW50IHNlcnZlciAqLwotfTsKLQotZXh0ZXJuIGludCBhZnNfdm9sdW1lX2xvb2t1cChjb25zdCBjaGFyICpuYW1lLAotCQkJICAgICBzdHJ1Y3QgYWZzX2NlbGwgKmNlbGwsCi0JCQkgICAgIGludCByd3BhdGgsCi0JCQkgICAgIHN0cnVjdCBhZnNfdm9sdW1lICoqX3ZvbHVtZSk7Ci0KLSNkZWZpbmUgYWZzX2dldF92b2x1bWUoVikgZG8geyBhdG9taWNfaW5jKCYoViktPnVzYWdlKTsgfSB3aGlsZSgwKQotCi1leHRlcm4gdm9pZCBhZnNfcHV0X3ZvbHVtZShzdHJ1Y3QgYWZzX3ZvbHVtZSAqdm9sdW1lKTsKLQotZXh0ZXJuIGludCBhZnNfdm9sdW1lX3BpY2tfZmlsZXNlcnZlcihzdHJ1Y3QgYWZzX3ZvbHVtZSAqdm9sdW1lLAotCQkJCSAgICAgIHN0cnVjdCBhZnNfc2VydmVyICoqX3NlcnZlcik7Ci0KLWV4dGVybiBpbnQgYWZzX3ZvbHVtZV9yZWxlYXNlX2ZpbGVzZXJ2ZXIoc3RydWN0IGFmc192b2x1bWUgKnZvbHVtZSwKLQkJCQkJIHN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIsCi0JCQkJCSBpbnQgcmVzdWx0KTsKLQotI2VuZGlmIC8qIF9MSU5VWF9BRlNfVk9MVU1FX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL2Jpby5jIGIvZnMvYmlvLmMKaW5kZXggNzYxOGJjYi4uNjkzOTQwZCAxMDA2NDQKLS0tIGEvZnMvYmlvLmMKKysrIGIvZnMvYmlvLmMKQEAgLTI4LDcgKzI4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9ibGt0cmFjZV9hcGkuaD4KICNpbmNsdWRlIDxzY3NpL3NnLmg+CQkvKiBmb3Igc3RydWN0IHNnX2lvdmVjICovCiAKLSNkZWZpbmUgQklPX1BPT0xfU0laRSAyNTYKKyNkZWZpbmUgQklPX1BPT0xfU0laRSAyCiAKIHN0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqYmlvX3NsYWIgX19yZWFkX21vc3RseTsKIApAQCAtMzgsNyArMzgsNyBAQAogICogYSBzbWFsbCBudW1iZXIgb2YgZW50cmllcyBpcyBmaW5lLCBub3QgZ29pbmcgdG8gYmUgcGVyZm9ybWFuY2UgY3JpdGljYWwuCiAgKiBiYXNpY2FsbHkgd2UganVzdCBuZWVkIHRvIHN1cnZpdmUKICAqLwotI2RlZmluZSBCSU9fU1BMSVRfRU5UUklFUyA4CQorI2RlZmluZSBCSU9fU1BMSVRfRU5UUklFUyAyCiBtZW1wb29sX3QgKmJpb19zcGxpdF9wb29sIF9fcmVhZF9tb3N0bHk7CiAKIHN0cnVjdCBiaW92ZWNfc2xhYiB7CkBAIC0xMTIwLDcgKzExMjAsNyBAQAogICogY3JlYXRlIG1lbW9yeSBwb29scyBmb3IgYmlvdmVjJ3MgaW4gYSBiaW9fc2V0LgogICogdXNlIHRoZSBnbG9iYWwgYmlvdmVjIHNsYWJzIGNyZWF0ZWQgZm9yIGdlbmVyYWwgdXNlLgogICovCi1zdGF0aWMgaW50IGJpb3ZlY19jcmVhdGVfcG9vbHMoc3RydWN0IGJpb19zZXQgKmJzLCBpbnQgcG9vbF9lbnRyaWVzLCBpbnQgc2NhbGUpCitzdGF0aWMgaW50IGJpb3ZlY19jcmVhdGVfcG9vbHMoc3RydWN0IGJpb19zZXQgKmJzLCBpbnQgcG9vbF9lbnRyaWVzKQogewogCWludCBpOwogCkBAIC0xMTI4LDkgKzExMjgsNiBAQAogCQlzdHJ1Y3QgYmlvdmVjX3NsYWIgKmJwID0gYnZlY19zbGFicyArIGk7CiAJCW1lbXBvb2xfdCAqKmJ2cCA9IGJzLT5idmVjX3Bvb2xzICsgaTsKIAotCQlpZiAocG9vbF9lbnRyaWVzID4gMSAmJiBpID49IHNjYWxlKQotCQkJcG9vbF9lbnRyaWVzID4+PSAxOwotCiAJCSpidnAgPSBtZW1wb29sX2NyZWF0ZV9zbGFiX3Bvb2wocG9vbF9lbnRyaWVzLCBicC0+c2xhYik7CiAJCWlmICghKmJ2cCkKIAkJCXJldHVybiAtRU5PTUVNOwpAQCAtMTE2MSw3ICsxMTU4LDcgQEAKIAlrZnJlZShicyk7CiB9CiAKLXN0cnVjdCBiaW9fc2V0ICpiaW9zZXRfY3JlYXRlKGludCBiaW9fcG9vbF9zaXplLCBpbnQgYnZlY19wb29sX3NpemUsIGludCBzY2FsZSkKK3N0cnVjdCBiaW9fc2V0ICpiaW9zZXRfY3JlYXRlKGludCBiaW9fcG9vbF9zaXplLCBpbnQgYnZlY19wb29sX3NpemUpCiB7CiAJc3RydWN0IGJpb19zZXQgKmJzID0ga3phbGxvYyhzaXplb2YoKmJzKSwgR0ZQX0tFUk5FTCk7CiAKQEAgLTExNzIsNyArMTE2OSw3IEBACiAJaWYgKCFicy0+YmlvX3Bvb2wpCiAJCWdvdG8gYmFkOwogCi0JaWYgKCFiaW92ZWNfY3JlYXRlX3Bvb2xzKGJzLCBidmVjX3Bvb2xfc2l6ZSwgc2NhbGUpKQorCWlmICghYmlvdmVjX2NyZWF0ZV9wb29scyhicywgYnZlY19wb29sX3NpemUpKQogCQlyZXR1cm4gYnM7CiAKIGJhZDoKQEAgLTExOTYsMzggKzExOTMsMTIgQEAKIAogc3RhdGljIGludCBfX2luaXQgaW5pdF9iaW8odm9pZCkKIHsKLQlpbnQgbWVnYWJ5dGVzLCBidmVjX3Bvb2xfZW50cmllczsKLQlpbnQgc2NhbGUgPSBCSU9WRUNfTlJfUE9PTFM7Ci0KIAliaW9fc2xhYiA9IGttZW1fY2FjaGVfY3JlYXRlKCJiaW8iLCBzaXplb2Yoc3RydWN0IGJpbyksIDAsCiAJCQkJU0xBQl9IV0NBQ0hFX0FMSUdOfFNMQUJfUEFOSUMsIE5VTEwsIE5VTEwpOwogCiAJYmlvdmVjX2luaXRfc2xhYnMoKTsKIAotCW1lZ2FieXRlcyA9IG5yX2ZyZWVfcGFnZXMoKSA+PiAoMjAgLSBQQUdFX1NISUZUKTsKLQotCS8qCi0JICogZmluZCBvdXQgd2hlcmUgdG8gc3RhcnQgc2NhbGluZwotCSAqLwotCWlmIChtZWdhYnl0ZXMgPD0gMTYpCi0JCXNjYWxlID0gMDsKLQllbHNlIGlmIChtZWdhYnl0ZXMgPD0gMzIpCi0JCXNjYWxlID0gMTsKLQllbHNlIGlmIChtZWdhYnl0ZXMgPD0gNjQpCi0JCXNjYWxlID0gMjsKLQllbHNlIGlmIChtZWdhYnl0ZXMgPD0gOTYpCi0JCXNjYWxlID0gMzsKLQllbHNlIGlmIChtZWdhYnl0ZXMgPD0gMTI4KQotCQlzY2FsZSA9IDQ7Ci0KLQkvKgotCSAqIExpbWl0IG51bWJlciBvZiBlbnRyaWVzIHJlc2VydmVkIC0tIG1lbXBvb2xzIGFyZSBvbmx5IHVzZWQgd2hlbgotCSAqIHRoZSBzeXN0ZW0gaXMgY29tcGxldGVseSB1bmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5LCBzbyB3ZSBvbmx5Ci0JICogbmVlZCBlbm91Z2ggdG8gbWFrZSBwcm9ncmVzcy4KLQkgKi8KLQlidmVjX3Bvb2xfZW50cmllcyA9IDEgKyBzY2FsZTsKLQotCWZzX2Jpb19zZXQgPSBiaW9zZXRfY3JlYXRlKEJJT19QT09MX1NJWkUsIGJ2ZWNfcG9vbF9lbnRyaWVzLCBzY2FsZSk7CisJZnNfYmlvX3NldCA9IGJpb3NldF9jcmVhdGUoQklPX1BPT0xfU0laRSwgMik7CiAJaWYgKCFmc19iaW9fc2V0KQogCQlwYW5pYygiYmlvOiBjYW4ndCBhbGxvY2F0ZSBiaW9zXG4iKTsKIApkaWZmIC0tZ2l0IGEvZnMvY29tcGF0X2lvY3RsLmMgYi9mcy9jb21wYXRfaW9jdGwuYwppbmRleCA4YjFjNWQ4Li5jNjhiMDU1IDEwMDY0NAotLS0gYS9mcy9jb21wYXRfaW9jdGwuYworKysgYi9mcy9jb21wYXRfaW9jdGwuYwpAQCAtMjY2LDYgKzI2NiwyMyBAQAogCXJldHVybiBlcnI7CiB9CiAKK3N0YXRpYyBpbnQgZG9fc2lvY2dzdGFtcG5zKHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGNvbXBhdF90aW1lc3BlYyBfX3VzZXIgKnVwID0gY29tcGF0X3B0cihhcmcpOworCXN0cnVjdCB0aW1lc3BlYyBrdHM7CisJbW1fc2VnbWVudF90IG9sZF9mcyA9IGdldF9mcygpOworCWludCBlcnI7CisKKwlzZXRfZnMoS0VSTkVMX0RTKTsKKwllcnIgPSBzeXNfaW9jdGwoZmQsIGNtZCwgKHVuc2lnbmVkIGxvbmcpJmt0cyk7CisJc2V0X2ZzKG9sZF9mcyk7CisJaWYgKCFlcnIpIHsKKwkJZXJyID0gcHV0X3VzZXIoa3RzLnR2X3NlYywgJnVwLT50dl9zZWMpOworCQllcnIgfD0gX19wdXRfdXNlcihrdHMudHZfbnNlYywgJnVwLT50dl9uc2VjKTsKKwl9CisJcmV0dXJuIGVycjsKK30KKwogc3RydWN0IGlmbWFwMzIgewogCWNvbXBhdF91bG9uZ190IG1lbV9zdGFydDsKIAljb21wYXRfdWxvbmdfdCBtZW1fZW5kOwpAQCAtMjQzNyw2ICsyNDU0LDcgQEAKIC8qIE5vdGUgU0lPQ1JUTVNHIGlzIG5vIGxvbmdlciwgc28gdGhpcyBpcyBzYWZlIGFuZCAqIHRoZSB1c2VyIHdvdWxkIGhhdmUgc2VlbiBqdXN0IGFuIC1FSU5WQUwgYW55d2F5cy4gKi8KIEhBTkRMRV9JT0NUTChTSU9DUlRNU0csIHJldF9laW52YWwpCiBIQU5ETEVfSU9DVEwoU0lPQ0dTVEFNUCwgZG9fc2lvY2dzdGFtcCkKK0hBTkRMRV9JT0NUTChTSU9DR1NUQU1QTlMsIGRvX3Npb2Nnc3RhbXBucykKICNlbmRpZgogI2lmZGVmIENPTkZJR19CTE9DSwogSEFORExFX0lPQ1RMKEhESU9fR0VUR0VPLCBoZGlvX2dldGdlbykKZGlmZiAtLWdpdCBhL2ZzL2RlYnVnZnMvZmlsZS5jIGIvZnMvZGVidWdmcy9maWxlLmMKaW5kZXggNjgyZjkyOC4uMmUxMjRlMCAxMDA2NDQKLS0tIGEvZnMvZGVidWdmcy9maWxlLmMKKysrIGIvZnMvZGVidWdmcy9maWxlLmMKQEAgLTE3OSw2ICsxNzksNDggQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGRlYnVnZnNfY3JlYXRlX3UzMik7CiAKK3N0YXRpYyB2b2lkIGRlYnVnZnNfdTY0X3NldCh2b2lkICpkYXRhLCB1NjQgdmFsKQoreworCSoodTY0ICopZGF0YSA9IHZhbDsKK30KKworc3RhdGljIHU2NCBkZWJ1Z2ZzX3U2NF9nZXQodm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gKih1NjQgKilkYXRhOworfQorREVGSU5FX1NJTVBMRV9BVFRSSUJVVEUoZm9wc191NjQsIGRlYnVnZnNfdTY0X2dldCwgZGVidWdmc191NjRfc2V0LCAiJWxsdVxuIik7CisKKy8qKgorICogZGVidWdmc19jcmVhdGVfdTY0IC0gY3JlYXRlIGEgZGVidWdmcyBmaWxlIHRoYXQgaXMgdXNlZCB0byByZWFkIGFuZCB3cml0ZSBhbiB1bnNpZ25lZCA2NC1iaXQgdmFsdWUKKyAqIEBuYW1lOiBhIHBvaW50ZXIgdG8gYSBzdHJpbmcgY29udGFpbmluZyB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0byBjcmVhdGUuCisgKiBAbW9kZTogdGhlIHBlcm1pc3Npb24gdGhhdCB0aGUgZmlsZSBzaG91bGQgaGF2ZQorICogQHBhcmVudDogYSBwb2ludGVyIHRvIHRoZSBwYXJlbnQgZGVudHJ5IGZvciB0aGlzIGZpbGUuICBUaGlzIHNob3VsZCBiZSBhCisgKiAgICAgICAgICBkaXJlY3RvcnkgZGVudHJ5IGlmIHNldC4gIElmIHRoaXMgcGFyYW1ldGVyIGlzICVOVUxMLCB0aGVuIHRoZQorICogICAgICAgICAgZmlsZSB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIHJvb3Qgb2YgdGhlIGRlYnVnZnMgZmlsZXN5c3RlbS4KKyAqIEB2YWx1ZTogYSBwb2ludGVyIHRvIHRoZSB2YXJpYWJsZSB0aGF0IHRoZSBmaWxlIHNob3VsZCByZWFkIHRvIGFuZCB3cml0ZQorICogICAgICAgICBmcm9tLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyBhIGZpbGUgaW4gZGVidWdmcyB3aXRoIHRoZSBnaXZlbiBuYW1lIHRoYXQKKyAqIGNvbnRhaW5zIHRoZSB2YWx1ZSBvZiB0aGUgdmFyaWFibGUgQHZhbHVlLiAgSWYgdGhlIEBtb2RlIHZhcmlhYmxlIGlzIHNvCisgKiBzZXQsIGl0IGNhbiBiZSByZWFkIGZyb20sIGFuZCB3cml0dGVuIHRvLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gYSBwb2ludGVyIHRvIGEgZGVudHJ5IGlmIGl0IHN1Y2NlZWRzLiAgVGhpcworICogcG9pbnRlciBtdXN0IGJlIHBhc3NlZCB0byB0aGUgZGVidWdmc19yZW1vdmUoKSBmdW5jdGlvbiB3aGVuIHRoZSBmaWxlIGlzCisgKiB0byBiZSByZW1vdmVkIChubyBhdXRvbWF0aWMgY2xlYW51cCBoYXBwZW5zIGlmIHlvdXIgbW9kdWxlIGlzIHVubG9hZGVkLAorICogeW91IGFyZSByZXNwb25zaWJsZSBoZXJlLikgIElmIGFuIGVycm9yIG9jY3VycywgJU5VTEwgd2lsbCBiZSByZXR1cm5lZC4KKyAqCisgKiBJZiBkZWJ1Z2ZzIGlzIG5vdCBlbmFibGVkIGluIHRoZSBrZXJuZWwsIHRoZSB2YWx1ZSAtJUVOT0RFViB3aWxsIGJlCisgKiByZXR1cm5lZC4gIEl0IGlzIG5vdCB3aXNlIHRvIGNoZWNrIGZvciB0aGlzIHZhbHVlLCBidXQgcmF0aGVyLCBjaGVjayBmb3IKKyAqICVOVUxMIG9yICElTlVMTCBpbnN0ZWFkIGFzIHRvIGVsaW1pbmF0ZSB0aGUgbmVlZCBmb3IgI2lmZGVmIGluIHRoZSBjYWxsaW5nCisgKiBjb2RlLgorICovCitzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzX2NyZWF0ZV91NjQoY29uc3QgY2hhciAqbmFtZSwgbW9kZV90IG1vZGUsCisJCQkJIHN0cnVjdCBkZW50cnkgKnBhcmVudCwgdTY0ICp2YWx1ZSkKK3sKKwlyZXR1cm4gZGVidWdmc19jcmVhdGVfZmlsZShuYW1lLCBtb2RlLCBwYXJlbnQsIHZhbHVlLCAmZm9wc191NjQpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZGVidWdmc19jcmVhdGVfdTY0KTsKKwogc3RhdGljIHNzaXplX3QgcmVhZF9maWxlX2Jvb2woc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKIAkJCSAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewpkaWZmIC0tZ2l0IGEvZnMvZWNyeXB0ZnMvbmV0bGluay5jIGIvZnMvZWNyeXB0ZnMvbmV0bGluay5jCmluZGV4IGUzYWEyMjUuLmZlOTE4NjMgMTAwNjQ0Ci0tLSBhL2ZzL2VjcnlwdGZzL25ldGxpbmsuYworKysgYi9mcy9lY3J5cHRmcy9uZXRsaW5rLmMKQEAgLTk3LDcgKzk3LDcgQEAKICAqLwogc3RhdGljIGludCBlY3J5cHRmc19wcm9jZXNzX25sX3Jlc3BvbnNlKHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0Jc3RydWN0IG5sbXNnaGRyICpubGggPSAoc3RydWN0IG5sbXNnaGRyKilza2ItPmRhdGE7CisJc3RydWN0IG5sbXNnaGRyICpubGggPSBubG1zZ19oZHIoc2tiKTsKIAlzdHJ1Y3QgZWNyeXB0ZnNfbWVzc2FnZSAqbXNnID0gTkxNU0dfREFUQShubGgpOwogCWludCByYzsKIApAQCAtMTgxLDcgKzE4MSw3IEBACiAJCQkJInJjID0gWyVkXVxuIiwgcmMpOwogCQlyZXR1cm47CiAJfQotCW5saCA9IChzdHJ1Y3Qgbmxtc2doZHIgKilza2ItPmRhdGE7CisJbmxoID0gbmxtc2dfaGRyKHNrYik7CiAJaWYgKCFOTE1TR19PSyhubGgsIHNrYi0+bGVuKSkgewogCQllY3J5cHRmc19wcmludGsoS0VSTl9FUlIsICJSZWNlaXZlZCBjb3JydXB0IG5ldGxpbmsgIgogCQkJCSJtZXNzYWdlXG4iKTsKQEAgLTIyOSw3ICsyMjksNyBAQAogCiAJZWNyeXB0ZnNfbmxfc29jayA9IG5ldGxpbmtfa2VybmVsX2NyZWF0ZShORVRMSU5LX0VDUllQVEZTLCAwLAogCQkJCQkJIGVjcnlwdGZzX3JlY2VpdmVfbmxfbWVzc2FnZSwKLQkJCQkJCSBUSElTX01PRFVMRSk7CisJCQkJCQkgTlVMTCwgVEhJU19NT0RVTEUpOwogCWlmICghZWNyeXB0ZnNfbmxfc29jaykgewogCQlyYyA9IC1FSU87CiAJCWVjcnlwdGZzX3ByaW50ayhLRVJOX0VSUiwgIkZhaWxlZCB0byBjcmVhdGUgbmV0bGluayBzb2NrZXRcbiIpOwpkaWZmIC0tZ2l0IGEvZnMvamZmczIvTElDRU5DRSBiL2ZzL2pmZnMyL0xJQ0VOQ0UKaW5kZXggY2Q4MWQ4My4uNTYyODg1OSAxMDA2NDQKLS0tIGEvZnMvamZmczIvTElDRU5DRQorKysgYi9mcy9qZmZzMi9MSUNFTkNFCkBAIC0xLDcgKzEsNyBAQAogVGhlIGZpbGVzIGluIHRoaXMgZGlyZWN0b3J5IGFuZCBlbHNld2hlcmUgd2hpY2ggcmVmZXIgdG8gdGhpcyBMSUNFTkNFCiBmaWxlIGFyZSBwYXJ0IG9mIEpGRlMyLCB0aGUgSm91cm5hbGxpbmcgRmxhc2ggRmlsZSBTeXN0ZW0gdjIuCiAKLQlDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIgUmVkIEhhdCwgSW5jLgorCUNvcHlyaWdodCDCqSAyMDAxLTIwMDcgUmVkIEhhdCwgSW5jLiBhbmQgb3RoZXJzCiAKIEpGRlMyIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCkBAIC0yOCw4ICsyOCwzIEBACiBUaGlzIGV4Y2VwdGlvbiBkb2VzIG5vdCBpbnZhbGlkYXRlIGFueSBvdGhlciByZWFzb25zIHdoeSBhIHdvcmsgYmFzZWQgb24KIHRoaXMgZmlsZSBtaWdodCBiZSBjb3ZlcmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KIAotRm9yIGluZm9ybWF0aW9uIG9uIG9idGFpbmluZyBhbHRlcm5hdGl2ZSBsaWNlbmNlcyBmb3IgSkZGUzIsIHNlZSAKLWh0dHA6Ly9zb3VyY2VzLnJlZGhhdC5jb20vamZmczIvamZmczItbGljZW5jZS5odG1sCi0KLQotCSRJZDogTElDRU5DRSx2IDEuMSAyMDAyLzA1LzIwIDE0OjU2OjM3IGR3bXcyIEV4cCAkCmRpZmYgLS1naXQgYS9mcy9qZmZzMi9NYWtlZmlsZSBiL2ZzL2pmZnMyL01ha2VmaWxlCmluZGV4IDdmMjhlZTAuLmMzMmIyNDEgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL01ha2VmaWxlCisrKyBiL2ZzL2pmZnMyL01ha2VmaWxlCkBAIC0xLDcgKzEsNiBAQAogIwogIyBNYWtlZmlsZSBmb3IgdGhlIExpbnV4IEpvdXJuYWxsaW5nIEZsYXNoIEZpbGUgU3lzdGVtIHYyIChKRkZTMikKICMKLSMgJElkOiBNYWtlZmlsZS5jb21tb24sdiAxLjExIDIwMDUvMDkvMDcgMDg6MzQ6NTMgaGF2YXNpIEV4cCAkCiAjCiAKIG9iai0kKENPTkZJR19KRkZTMl9GUykgKz0gamZmczIubwpkaWZmIC0tZ2l0IGEvZnMvamZmczIvUkVBRE1FLkxvY2tpbmcgYi9mcy9qZmZzMi9SRUFETUUuTG9ja2luZwppbmRleCBjOGYwYmQ2Li5kMTRkNWE0IDEwMDY0NAotLS0gYS9mcy9qZmZzMi9SRUFETUUuTG9ja2luZworKysgYi9mcy9qZmZzMi9SRUFETUUuTG9ja2luZwpAQCAtMSw0ICsxLDMgQEAKLQkkSWQ6IFJFQURNRS5Mb2NraW5nLHYgMS4xMiAyMDA1LzA0LzEzIDEzOjIyOjM1IGR3bXcyIEV4cCAkCiAKIAlKRkZTMiBMT0NLSU5HIERPQ1VNRU5UQVRJT04KIAktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL1RPRE8gYi9mcy9qZmZzMi9UT0RPCmluZGV4IGQwZTIzYjIuLjVkM2VhNDAgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL1RPRE8KKysrIGIvZnMvamZmczIvVE9ETwpAQCAtMSw0ICsxLDMgQEAKLSRJZDogVE9ETyx2IDEuMTggMjAwNS8wOS8yMiAxMToyNDo1NiBkZWRla2luZCBFeHAgJAogCiAgLSBzdXBwb3J0IGFzeW5jaHJvbm91cyBvcGVyYXRpb24gLS0gYWRkIGEgcGVyLWZzICdyZXNlcnZlZF9zcGFjZScgY291bnQsCiAgICBsZXQgZWFjaCBvdXRzdGFuZGluZyB3cml0ZSByZXNlcnZlIHRoZSBfbWF4aW11bV8gYW1vdW50IG9mIHBoeXNpY2FsCkBAIC0zMCw4ICsyOSw2IEBACiAgICAgIHRoZSBmdWxsIGRpcmVudCwgd2Ugb25seSBuZWVkIHRvIGdvIHRvIHRoZSBmbGFzaCBpbiBsb29rdXAoKSB3aGVuIHdlIHRoaW5rIHdlJ3ZlCiAgICAgIGdvdCBhIG1hdGNoLCBhbmQgaW4gcmVhZGRpcigpLiAKICAgIC0gRG91Ymx5LWxpbmtlZCBuZXh0X2luX2lubyBsaXN0IHRvIGFsbG93IHVzIHRvIGZyZWUgb2Jzb2xldGVkIHJhd19ub2RlX3JlZnMgaW1tZWRpYXRlbHk/Ci0gICAtIFJlbW92ZSB0b3RsZW4gZnJvbSBqZmZzMl9yYXdfbm9kZV9yZWY/IE5lZWQgdG8gaGF2ZSB0b3RsZW4gcGFzc2VkIGludG8KLQlqZmZzMl9tYXJrX25vZGVfb2Jzb2xldGUoKS4gQ2FuIGFsbCBjYWxsZXJzIHdvcmsgaXQgb3V0PwogICAgLSBSZW1vdmUgc2l6ZSBmcm9tIGpmZnMyX3Jhd19ub2RlX2ZyYWcuIAogCiBkZWRla2luZDoKZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL2FjbC5jIGIvZnMvamZmczIvYWNsLmMKaW5kZXggNzNmMGQ2MC4uYTQ2MTAxZSAxMDA2NDQKLS0tIGEvZnMvamZmczIvYWNsLmMKKysrIGIvZnMvamZmczIvYWNsLmMKQEAgLTEsMTMgKzEsMTQgQEAKIC8qCiAgKiBKRkZTMiAtLSBKb3VybmFsbGluZyBGbGFzaCBGaWxlIFN5c3RlbSwgVmVyc2lvbiAyLgogICoKLSAqIENvcHlyaWdodCAoQykgMjAwNiAgTkVDIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgwqkgMjAwNiAgTkVDIENvcnBvcmF0aW9uCiAgKgogICogQ3JlYXRlZCBieSBLYWlHYWkgS29oZWkgPGthaWdhaUBhay5qcC5uZWMuY29tPgogICoKICAqIEZvciBsaWNlbnNpbmcgaW5mb3JtYXRpb24sIHNlZSB0aGUgZmlsZSAnTElDRU5DRScgaW4gdGhpcyBkaXJlY3RvcnkuCiAgKgogICovCisKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL2FjbC5oIGIvZnMvamZmczIvYWNsLmgKaW5kZXggZmEzMjdkYi4uYzg0Mzc4YyAxMDA2NDQKLS0tIGEvZnMvamZmczIvYWNsLmgKKysrIGIvZnMvamZmczIvYWNsLmgKQEAgLTEsMTMgKzEsMTQgQEAKIC8qCiAgKiBKRkZTMiAtLSBKb3VybmFsbGluZyBGbGFzaCBGaWxlIFN5c3RlbSwgVmVyc2lvbiAyLgogICoKLSAqIENvcHlyaWdodCAoQykgMjAwNiAgTkVDIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgwqkgMjAwNiAgTkVDIENvcnBvcmF0aW9uCiAgKgogICogQ3JlYXRlZCBieSBLYWlHYWkgS29oZWkgPGthaWdhaUBhay5qcC5uZWMuY29tPgogICoKICAqIEZvciBsaWNlbnNpbmcgaW5mb3JtYXRpb24sIHNlZSB0aGUgZmlsZSAnTElDRU5DRScgaW4gdGhpcyBkaXJlY3RvcnkuCiAgKgogICovCisKIHN0cnVjdCBqZmZzMl9hY2xfZW50cnkgewogCWppbnQxNl90CWVfdGFnOwogCWppbnQxNl90CWVfcGVybTsKZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL2JhY2tncm91bmQuYyBiL2ZzL2pmZnMyL2JhY2tncm91bmQuYwppbmRleCA4ODhmMjM2Li4wYzgyZGZjIDEwMDY0NAotLS0gYS9mcy9qZmZzMi9iYWNrZ3JvdW5kLmMKKysrIGIvZnMvamZmczIvYmFja2dyb3VuZC5jCkBAIC0xLDE0ICsxLDEyIEBACiAvKgogICogSkZGUzIgLS0gSm91cm5hbGxpbmcgRmxhc2ggRmlsZSBTeXN0ZW0sIFZlcnNpb24gMi4KICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMyBSZWQgSGF0LCBJbmMuCisgKiBDb3B5cmlnaHQgwqkgMjAwMS0yMDA3IFJlZCBIYXQsIEluYy4KICAqCiAgKiBDcmVhdGVkIGJ5IERhdmlkIFdvb2Rob3VzZSA8ZHdtdzJAaW5mcmFkZWFkLm9yZz4KICAqCiAgKiBGb3IgbGljZW5zaW5nIGluZm9ybWF0aW9uLCBzZWUgdGhlIGZpbGUgJ0xJQ0VOQ0UnIGluIHRoaXMgZGlyZWN0b3J5LgogICoKLSAqICRJZDogYmFja2dyb3VuZC5jLHYgMS41NCAyMDA1LzA1LzIwIDIxOjM3OjEyIGdsZWl4bmVyIEV4cCAkCi0gKgogICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL2J1aWxkLmMgYi9mcy9qZmZzMi9idWlsZC5jCmluZGV4IDA3MTE5YzQuLjBjYTJmZmYgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL2J1aWxkLmMKKysrIGIvZnMvamZmczIvYnVpbGQuYwpAQCAtMSwxNCArMSwxMiBAQAogLyoKICAqIEpGRlMyIC0tIEpvdXJuYWxsaW5nIEZsYXNoIEZpbGUgU3lzdGVtLCBWZXJzaW9uIDIuCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDMgUmVkIEhhdCwgSW5jLgorICogQ29weXJpZ2h0IMKpIDIwMDEtMjAwNyBSZWQgSGF0LCBJbmMuCiAgKgogICogQ3JlYXRlZCBieSBEYXZpZCBXb29kaG91c2UgPGR3bXcyQGluZnJhZGVhZC5vcmc+CiAgKgogICogRm9yIGxpY2Vuc2luZyBpbmZvcm1hdGlvbiwgc2VlIHRoZSBmaWxlICdMSUNFTkNFJyBpbiB0aGlzIGRpcmVjdG9yeS4KICAqCi0gKiAkSWQ6IGJ1aWxkLmMsdiAxLjg1IDIwMDUvMTEvMDcgMTE6MTQ6MzggZ2xlaXhuZXIgRXhwICQKLSAqCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpkaWZmIC0tZ2l0IGEvZnMvamZmczIvY29tcHIuYyBiL2ZzL2pmZnMyL2NvbXByLmMKaW5kZXggNzAwMWJhMi4uNDg1ZDA2NSAxMDA2NDQKLS0tIGEvZnMvamZmczIvY29tcHIuYworKysgYi9mcy9qZmZzMi9jb21wci5jCkBAIC0xLDE2ICsxLDE0IEBACiAvKgogICogSkZGUzIgLS0gSm91cm5hbGxpbmcgRmxhc2ggRmlsZSBTeXN0ZW0sIFZlcnNpb24gMi4KICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMyBSZWQgSGF0LCBJbmMuCisgKiBDb3B5cmlnaHQgwqkgMjAwMS0yMDA3IFJlZCBIYXQsIEluYy4KICAqIENyZWF0ZWQgYnkgQXJqYW4gdmFuIGRlIFZlbiA8YXJqYW52QHJlZGhhdC5jb20+CiAgKgotICogQ29weXJpZ2h0IChDKSAyMDA0IEZlcmVuYyBIYXZhc2kgPGhhdmFzaUBpbmYudS1zemVnZWQuaHU+LAorICogQ29weXJpZ2h0IMKpIDIwMDQgRmVyZW5jIEhhdmFzaSA8aGF2YXNpQGluZi51LXN6ZWdlZC5odT4sCiAgKiAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBvZiBTemVnZWQsIEh1bmdhcnkKICAqCiAgKiBGb3IgbGljZW5zaW5nIGluZm9ybWF0aW9uLCBzZWUgdGhlIGZpbGUgJ0xJQ0VOQ0UnIGluIHRoaXMgZGlyZWN0b3J5LgogICoKLSAqICRJZDogY29tcHIuYyx2IDEuNDYgMjAwNS8xMS8wNyAxMToxNDozOCBnbGVpeG5lciBFeHAgJAotICoKICAqLwogCiAjaW5jbHVkZSAiY29tcHIuaCIKQEAgLTI2OCwxNDQgKzI2Niw2IEBACiAgICAgICAgIHJldHVybiAwOwogfQogCi0jaWZkZWYgQ09ORklHX0pGRlMyX1BST0MKLQotI2RlZmluZSBKRkZTMl9TVEFUX0JVRl9TSVpFIDE2MDAwCi0KLWNoYXIgKmpmZnMyX2xpc3RfY29tcHJlc3NvcnModm9pZCkKLXsKLSAgICAgICAgc3RydWN0IGpmZnMyX2NvbXByZXNzb3IgKnRoaXM7Ci0gICAgICAgIGNoYXIgKmJ1ZiwgKmFjdF9idWY7Ci0KLSAgICAgICAgYWN0X2J1ZiA9IGJ1ZiA9IGttYWxsb2MoSkZGUzJfU1RBVF9CVUZfU0laRSxHRlBfS0VSTkVMKTsKLSAgICAgICAgbGlzdF9mb3JfZWFjaF9lbnRyeSh0aGlzLCAmamZmczJfY29tcHJlc3Nvcl9saXN0LCBsaXN0KSB7Ci0gICAgICAgICAgICAgICAgYWN0X2J1ZiArPSBzcHJpbnRmKGFjdF9idWYsICIlMTBzIHByaW9yaXR5OiVkICIsIHRoaXMtPm5hbWUsIHRoaXMtPnByaW9yaXR5KTsKLSAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPmRpc2FibGVkKXx8KCF0aGlzLT5jb21wcmVzcykpCi0gICAgICAgICAgICAgICAgICAgICAgICBhY3RfYnVmICs9IHNwcmludGYoYWN0X2J1ZiwiZGlzYWJsZWQiKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBhY3RfYnVmICs9IHNwcmludGYoYWN0X2J1ZiwiZW5hYmxlZCIpOwotICAgICAgICAgICAgICAgIGFjdF9idWYgKz0gc3ByaW50ZihhY3RfYnVmLCJcbiIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBidWY7Ci19Ci0KLWNoYXIgKmpmZnMyX3N0YXRzKHZvaWQpCi17Ci0gICAgICAgIHN0cnVjdCBqZmZzMl9jb21wcmVzc29yICp0aGlzOwotICAgICAgICBjaGFyICpidWYsICphY3RfYnVmOwotCi0gICAgICAgIGFjdF9idWYgPSBidWYgPSBrbWFsbG9jKEpGRlMyX1NUQVRfQlVGX1NJWkUsR0ZQX0tFUk5FTCk7Ci0KLSAgICAgICAgYWN0X2J1ZiArPSBzcHJpbnRmKGFjdF9idWYsIkpGRlMyIGNvbXByZXNzb3Igc3RhdGlzdGljczpcbiIpOwotICAgICAgICBhY3RfYnVmICs9IHNwcmludGYoYWN0X2J1ZiwiJTEwcyAgICIsIm5vbmUiKTsKLSAgICAgICAgYWN0X2J1ZiArPSBzcHJpbnRmKGFjdF9idWYsImNvbXByOiAlZCBibG9ja3MgKCVkKSAgZGVjb21wcjogJWQgYmxvY2tzXG4iLCBub25lX3N0YXRfY29tcHJfYmxvY2tzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uZV9zdGF0X2NvbXByX3NpemUsIG5vbmVfc3RhdF9kZWNvbXByX2Jsb2Nrcyk7Ci0gICAgICAgIHNwaW5fbG9jaygmamZmczJfY29tcHJlc3Nvcl9saXN0X2xvY2spOwotICAgICAgICBsaXN0X2Zvcl9lYWNoX2VudHJ5KHRoaXMsICZqZmZzMl9jb21wcmVzc29yX2xpc3QsIGxpc3QpIHsKLSAgICAgICAgICAgICAgICBhY3RfYnVmICs9IHNwcmludGYoYWN0X2J1ZiwiJTEwcyAiLHRoaXMtPm5hbWUpOwotICAgICAgICAgICAgICAgIGlmICgodGhpcy0+ZGlzYWJsZWQpfHwoIXRoaXMtPmNvbXByZXNzKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGFjdF9idWYgKz0gc3ByaW50ZihhY3RfYnVmLCItICIpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGFjdF9idWYgKz0gc3ByaW50ZihhY3RfYnVmLCIrICIpOwotICAgICAgICAgICAgICAgIGFjdF9idWYgKz0gc3ByaW50ZihhY3RfYnVmLCJjb21wcjogJWQgYmxvY2tzICglZC8lZCkgIGRlY29tcHI6ICVkIGJsb2NrcyAiLCB0aGlzLT5zdGF0X2NvbXByX2Jsb2NrcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+c3RhdF9jb21wcl9uZXdfc2l6ZSwgdGhpcy0+c3RhdF9jb21wcl9vcmlnX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnN0YXRfZGVjb21wcl9ibG9ja3MpOwotICAgICAgICAgICAgICAgIGFjdF9idWYgKz0gc3ByaW50ZihhY3RfYnVmLCJcbiIpOwotICAgICAgICB9Ci0gICAgICAgIHNwaW5fdW5sb2NrKCZqZmZzMl9jb21wcmVzc29yX2xpc3RfbG9jayk7Ci0KLSAgICAgICAgcmV0dXJuIGJ1ZjsKLX0KLQotY2hhciAqamZmczJfZ2V0X2NvbXByZXNzaW9uX21vZGVfbmFtZSh2b2lkKQotewotICAgICAgICBzd2l0Y2ggKGpmZnMyX2NvbXByZXNzaW9uX21vZGUpIHsKLSAgICAgICAgY2FzZSBKRkZTMl9DT01QUl9NT0RFX05PTkU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJub25lIjsKLSAgICAgICAgY2FzZSBKRkZTMl9DT01QUl9NT0RFX1BSSU9SSVRZOgotICAgICAgICAgICAgICAgIHJldHVybiAicHJpb3JpdHkiOwotICAgICAgICBjYXNlIEpGRlMyX0NPTVBSX01PREVfU0laRToKLSAgICAgICAgICAgICAgICByZXR1cm4gInNpemUiOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAidW5rb3duIjsKLX0KLQotaW50IGpmZnMyX3NldF9jb21wcmVzc2lvbl9tb2RlX25hbWUoY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgICAgICAgaWYgKCFzdHJjbXAoIm5vbmUiLG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgamZmczJfY29tcHJlc3Npb25fbW9kZSA9IEpGRlMyX0NPTVBSX01PREVfTk9ORTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBpZiAoIXN0cmNtcCgicHJpb3JpdHkiLG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgamZmczJfY29tcHJlc3Npb25fbW9kZSA9IEpGRlMyX0NPTVBSX01PREVfUFJJT1JJVFk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFzdHJjbXAoInNpemUiLG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgamZmczJfY29tcHJlc3Npb25fbW9kZSA9IEpGRlMyX0NPTVBSX01PREVfU0laRTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBqZmZzMl9jb21wcmVzc29yX1hhYmxlKGNvbnN0IGNoYXIgKm5hbWUsIGludCBkaXNhYmxlZCkKLXsKLSAgICAgICAgc3RydWN0IGpmZnMyX2NvbXByZXNzb3IgKnRoaXM7Ci0gICAgICAgIHNwaW5fbG9jaygmamZmczJfY29tcHJlc3Nvcl9saXN0X2xvY2spOwotICAgICAgICBsaXN0X2Zvcl9lYWNoX2VudHJ5KHRoaXMsICZqZmZzMl9jb21wcmVzc29yX2xpc3QsIGxpc3QpIHsKLSAgICAgICAgICAgICAgICBpZiAoIXN0cmNtcCh0aGlzLT5uYW1lLCBuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+ZGlzYWJsZWQgPSBkaXNhYmxlZDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrKCZqZmZzMl9jb21wcmVzc29yX2xpc3RfbG9jayk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgc3Bpbl91bmxvY2soJmpmZnMyX2NvbXByZXNzb3JfbGlzdF9sb2NrKTsKLSAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiSkZGUzI6IGNvbXByZXNzb3IgJXMgbm90IGZvdW5kLlxuIixuYW1lKTsKLSAgICAgICAgcmV0dXJuIDE7Ci19Ci0KLWludCBqZmZzMl9lbmFibGVfY29tcHJlc3Nvcl9uYW1lKGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0gICAgICAgIHJldHVybiBqZmZzMl9jb21wcmVzc29yX1hhYmxlKG5hbWUsIDApOwotfQotCi1pbnQgamZmczJfZGlzYWJsZV9jb21wcmVzc29yX25hbWUoY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgICAgICAgcmV0dXJuIGpmZnMyX2NvbXByZXNzb3JfWGFibGUobmFtZSwgMSk7Ci19Ci0KLWludCBqZmZzMl9zZXRfY29tcHJlc3Nvcl9wcmlvcml0eShjb25zdCBjaGFyICpuYW1lLCBpbnQgcHJpb3JpdHkpCi17Ci0gICAgICAgIHN0cnVjdCBqZmZzMl9jb21wcmVzc29yICp0aGlzLCpjb21wOwotICAgICAgICBzcGluX2xvY2soJmpmZnMyX2NvbXByZXNzb3JfbGlzdF9sb2NrKTsKLSAgICAgICAgbGlzdF9mb3JfZWFjaF9lbnRyeSh0aGlzLCAmamZmczJfY29tcHJlc3Nvcl9saXN0LCBsaXN0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFzdHJjbXAodGhpcy0+bmFtZSwgbmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnByaW9yaXR5ID0gcHJpb3JpdHk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb21wID0gdGhpczsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gcmVpbnNlcnQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHNwaW5fdW5sb2NrKCZqZmZzMl9jb21wcmVzc29yX2xpc3RfbG9jayk7Ci0gICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIkpGRlMyOiBjb21wcmVzc29yICVzIG5vdCBmb3VuZC5cbiIsbmFtZSk7Ci0gICAgICAgIHJldHVybiAxOwotcmVpbnNlcnQ6Ci0gICAgICAgIC8qIGxpc3QgaXMgc29ydGVkIGluIHRoZSBvcmRlciBvZiBwcmlvcml0eSwgc28gaWYKLSAgICAgICAgICAgd2UgY2hhbmdlIGl0IHdlIGhhdmUgdG8gcmVpbnNlcnQgaXQgaW50byB0aGUKLSAgICAgICAgICAgZ29vZCBwbGFjZSAqLwotICAgICAgICBsaXN0X2RlbCgmY29tcC0+bGlzdCk7Ci0gICAgICAgIGxpc3RfZm9yX2VhY2hfZW50cnkodGhpcywgJmpmZnMyX2NvbXByZXNzb3JfbGlzdCwgbGlzdCkgewotICAgICAgICAgICAgICAgIGlmICh0aGlzLT5wcmlvcml0eSA8IGNvbXAtPnByaW9yaXR5KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaXN0X2FkZCgmY29tcC0+bGlzdCwgdGhpcy0+bGlzdC5wcmV2KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrKCZqZmZzMl9jb21wcmVzc29yX2xpc3RfbG9jayk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbGlzdF9hZGRfdGFpbCgmY29tcC0+bGlzdCwgJmpmZnMyX2NvbXByZXNzb3JfbGlzdCk7Ci0gICAgICAgIHNwaW5fdW5sb2NrKCZqZmZzMl9jb21wcmVzc29yX2xpc3RfbG9jayk7Ci0gICAgICAgIHJldHVybiAwOwotfQotCi0jZW5kaWYKLQogdm9pZCBqZmZzMl9mcmVlX2NvbXByYnVmKHVuc2lnbmVkIGNoYXIgKmNvbXByYnVmLCB1bnNpZ25lZCBjaGFyICpvcmlnKQogewogICAgICAgICBpZiAob3JpZyAhPSBjb21wcmJ1ZikKZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL2NvbXByLmggYi9mcy9qZmZzMi9jb21wci5oCmluZGV4IDUwOWI4YjEuLjY4Y2M3MDEgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL2NvbXByLmgKKysrIGIvZnMvamZmczIvY29tcHIuaApAQCAtMSwxMyArMSwxMCBAQAogLyoKICAqIEpGRlMyIC0tIEpvdXJuYWxsaW5nIEZsYXNoIEZpbGUgU3lzdGVtLCBWZXJzaW9uIDIuCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDA0IEZlcmVuYyBIYXZhc2kgPGhhdmFzaUBpbmYudS1zemVnZWQuaHU+LAorICogQ29weXJpZ2h0IMKpIDIwMDQgICBGZXJlbmMgSGF2YXNpIDxoYXZhc2lAaW5mLnUtc3plZ2VkLmh1PiwKICAqICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IG9mIFN6ZWdlZCwgSHVuZ2FyeQogICoKLSAqIEZvciBsaWNlbnNpbmcgaW5mb3JtYXRpb24sIHNlZSB0aGUgZmlsZSAnTElDRU5DRScgaW4gdGhlCi0gKiBqZmZzMiBkaXJlY3RvcnkuCi0gKgotICogJElkOiBjb21wci5oLHYgMS45IDIwMDUvMTEvMDcgMTE6MTQ6MzggZ2xlaXhuZXIgRXhwICQKKyAqIEZvciBsaWNlbnNpbmcgaW5mb3JtYXRpb24sIHNlZSB0aGUgZmlsZSAnTElDRU5DRScgaW4gdGhpcyBkaXJlY3RvcnkuCiAgKgogICovCiAKQEAgLTc2LDE2ICs3Myw2IEBACiAKIHZvaWQgamZmczJfZnJlZV9jb21wcmJ1Zih1bnNpZ25lZCBjaGFyICpjb21wcmJ1ZiwgdW5zaWduZWQgY2hhciAqb3JpZyk7CiAKLSNpZmRlZiBDT05GSUdfSkZGUzJfUFJPQwotaW50IGpmZnMyX2VuYWJsZV9jb21wcmVzc29yX25hbWUoY29uc3QgY2hhciAqbmFtZSk7Ci1pbnQgamZmczJfZGlzYWJsZV9jb21wcmVzc29yX25hbWUoY29uc3QgY2hhciAqbmFtZSk7Ci1pbnQgamZmczJfc2V0X2NvbXByZXNzaW9uX21vZGVfbmFtZShjb25zdCBjaGFyICptb2RlX25hbWUpOwotY2hhciAqamZmczJfZ2V0X2NvbXByZXNzaW9uX21vZGVfbmFtZSh2b2lkKTsKLWludCBqZmZzMl9zZXRfY29tcHJlc3Nvcl9wcmlvcml0eShjb25zdCBjaGFyICptb2RlX25hbWUsIGludCBwcmlvcml0eSk7Ci1jaGFyICpqZmZzMl9saXN0X2NvbXByZXNzb3JzKHZvaWQpOwotY2hhciAqamZmczJfc3RhdHModm9pZCk7Ci0jZW5kaWYKLQogLyogQ29tcHJlc3NvciBtb2R1bGVzICovCiAvKiBUaGVzZSBmdW5jdGlvbnMgd2lsbCBiZSBjYWxsZWQgYnkgamZmczJfY29tcHJlc3NvcnNfaW5pdC9leGl0ICovCiAKZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL2NvbXByX3J0aW1lLmMgYi9mcy9qZmZzMi9jb21wcl9ydGltZS5jCmluZGV4IDJlYjFiNzQuLjBkMGJmZDIgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL2NvbXByX3J0aW1lLmMKKysrIGIvZnMvamZmczIvY29tcHJfcnRpbWUuYwpAQCAtMSwxMyArMSwxMiBAQAogLyoKICAqIEpGRlMyIC0tIEpvdXJuYWxsaW5nIEZsYXNoIEZpbGUgU3lzdGVtLCBWZXJzaW9uIDIuCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDMgUmVkIEhhdCwgSW5jLgorICogQ29weXJpZ2h0IMKpIDIwMDEtMjAwNyBSZWQgSGF0LCBJbmMuCiAgKgogICogQ3JlYXRlZCBieSBBcmphbiB2YW4gZGUgVmVuIDxhcmphbnZAcmVkaGF0LmNvbT4KICAqCiAgKiBGb3IgbGljZW5zaW5nIGluZm9ybWF0aW9uLCBzZWUgdGhlIGZpbGUgJ0xJQ0VOQ0UnIGluIHRoaXMgZGlyZWN0b3J5LgogICoKLSAqICRJZDogY29tcHJfcnRpbWUuYyx2IDEuMTQgMjAwNC8wNi8yMyAxNjozNDo0MCBoYXZhc2kgRXhwICQKICAqCiAgKgogICogVmVyeSBzaW1wbGUgbHo3Ny1pc2ggZW5jb2Rlci4KZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL2NvbXByX3J1YmluLmMgYi9mcy9qZmZzMi9jb21wcl9ydWJpbi5jCmluZGV4IGU3OTJlNjcuLmVhMDQzMWUgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL2NvbXByX3J1YmluLmMKKysrIGIvZnMvamZmczIvY29tcHJfcnViaW4uYwpAQCAtMSwyMyArMSw5NCBAQAogLyoKICAqIEpGRlMyIC0tIEpvdXJuYWxsaW5nIEZsYXNoIEZpbGUgU3lzdGVtLCBWZXJzaW9uIDIuCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyIFJlZCBIYXQsIEluYy4KKyAqIENvcHlyaWdodCDCqSAyMDAxLTIwMDcgUmVkIEhhdCwgSW5jLgogICoKICAqIENyZWF0ZWQgYnkgQXJqYW4gdmFuIGRlIFZlbiA8YXJqYW52QHJlZGhhdC5jb20+CiAgKgogICogRm9yIGxpY2Vuc2luZyBpbmZvcm1hdGlvbiwgc2VlIHRoZSBmaWxlICdMSUNFTkNFJyBpbiB0aGlzIGRpcmVjdG9yeS4KICAqCi0gKiAkSWQ6IGNvbXByX3J1YmluLmMsdiAxLjIwIDIwMDQvMDYvMjMgMTY6MzQ6NDAgaGF2YXNpIEV4cCAkCi0gKgogICovCiAKICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2pmZnMyLmg+Ci0jaW5jbHVkZSAiY29tcHJfcnViaW4uaCIKLSNpbmNsdWRlICJoaXN0b19taXBzLmgiCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlICJjb21wci5oIgogCisKKyNkZWZpbmUgUlVCSU5fUkVHX1NJWkUgICAxNgorI2RlZmluZSBVUFBFUl9CSVRfUlVCSU4gICAgKCgobG9uZykgMSk8PChSVUJJTl9SRUdfU0laRS0xKSkKKyNkZWZpbmUgTE9XRVJfQklUU19SVUJJTiAgICgoKChsb25nKSAxKTw8KFJVQklOX1JFR19TSVpFLTEpKS0xKQorCisKKyNkZWZpbmUgQklUX0RJVklERVJfTUlQUyAxMDQzCitzdGF0aWMgaW50IGJpdHNfbWlwc1s4XSA9IHsgMjc3LDI0OSwyOTAsMjY3LDIyOSwzNDEsMjEyLDI0MX07IC8qIG1pcHMzMiAqLworCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKworc3RydWN0IHB1c2hwdWxsIHsKKwl1bnNpZ25lZCBjaGFyICpidWY7CisJdW5zaWduZWQgaW50IGJ1ZmxlbjsKKwl1bnNpZ25lZCBpbnQgb2ZzOworCXVuc2lnbmVkIGludCByZXNlcnZlOworfTsKKworc3RydWN0IHJ1YmluX3N0YXRlIHsKKwl1bnNpZ25lZCBsb25nIHA7CisJdW5zaWduZWQgbG9uZyBxOworCXVuc2lnbmVkIGxvbmcgcmVjX3E7CisJbG9uZyBiaXRfbnVtYmVyOworCXN0cnVjdCBwdXNocHVsbCBwcDsKKwlpbnQgYml0X2RpdmlkZXI7CisJaW50IGJpdHNbOF07Cit9OworCitzdGF0aWMgaW5saW5lIHZvaWQgaW5pdF9wdXNocHVsbChzdHJ1Y3QgcHVzaHB1bGwgKnBwLCBjaGFyICpidWYsIHVuc2lnbmVkIGJ1ZmxlbiwgdW5zaWduZWQgb2ZzLCB1bnNpZ25lZCByZXNlcnZlKQoreworCXBwLT5idWYgPSBidWY7CisJcHAtPmJ1ZmxlbiA9IGJ1ZmxlbjsKKwlwcC0+b2ZzID0gb2ZzOworCXBwLT5yZXNlcnZlID0gcmVzZXJ2ZTsKK30KKworc3RhdGljIGlubGluZSBpbnQgcHVzaGJpdChzdHJ1Y3QgcHVzaHB1bGwgKnBwLCBpbnQgYml0LCBpbnQgdXNlX3Jlc2VydmVkKQoreworCWlmIChwcC0+b2ZzID49IHBwLT5idWZsZW4gLSAodXNlX3Jlc2VydmVkPzA6cHAtPnJlc2VydmUpKSB7CisJCXJldHVybiAtRU5PU1BDOworCX0KKworCWlmIChiaXQpIHsKKwkJcHAtPmJ1ZltwcC0+b2ZzID4+IDNdIHw9ICgxPDwoNy0ocHAtPm9mcyAmNykpKTsKKwl9CisJZWxzZSB7CisJCXBwLT5idWZbcHAtPm9mcyA+PiAzXSAmPSB+KDE8PCg3LShwcC0+b2ZzICY3KSkpOworCX0KKwlwcC0+b2ZzKys7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgcHVzaGVkYml0cyhzdHJ1Y3QgcHVzaHB1bGwgKnBwKQoreworCXJldHVybiBwcC0+b2ZzOworfQorCitzdGF0aWMgaW5saW5lIGludCBwdWxsYml0KHN0cnVjdCBwdXNocHVsbCAqcHApCit7CisJaW50IGJpdDsKKworCWJpdCA9IChwcC0+YnVmW3BwLT5vZnMgPj4gM10gPj4gKDctKHBwLT5vZnMgJiA3KSkpICYgMTsKKworCXBwLT5vZnMrKzsKKwlyZXR1cm4gYml0OworfQorCitzdGF0aWMgaW5saW5lIGludCBwdWxsZWRiaXRzKHN0cnVjdCBwdXNocHVsbCAqcHApCit7CisJcmV0dXJuIHBwLT5vZnM7Cit9CisKKwogc3RhdGljIHZvaWQgaW5pdF9ydWJpbihzdHJ1Y3QgcnViaW5fc3RhdGUgKnJzLCBpbnQgZGl2LCBpbnQgKmJpdHMpCiB7CiAJaW50IGM7CmRpZmYgLS1naXQgYS9mcy9qZmZzMi9jb21wcl9ydWJpbi5oIGIvZnMvamZmczIvY29tcHJfcnViaW4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYxYTkzNC4uMDAwMDAwMAotLS0gYS9mcy9qZmZzMi9jb21wcl9ydWJpbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyogUnViaW4gZW5jb2Rlci9kZWNvZGVyIGhlYWRlciAgICAgICAqLwotLyogd29yayBzdGFydGVkIGF0ICAgOiBhdWcgICAzLCAxOTk0ICAqLwotLyogbGFzdCBtb2RpZmljYXRpb24gOiBhdWcgIDE1LCAxOTk0ICAqLwotLyogJElkOiBjb21wcl9ydWJpbi5oLHYgMS43IDIwMDUvMTEvMDcgMTE6MTQ6MzggZ2xlaXhuZXIgRXhwICQgKi8KLQotI2luY2x1ZGUgInB1c2hwdWxsLmgiCi0KLSNkZWZpbmUgUlVCSU5fUkVHX1NJWkUgICAxNgotI2RlZmluZSBVUFBFUl9CSVRfUlVCSU4gICAgKCgobG9uZykgMSk8PChSVUJJTl9SRUdfU0laRS0xKSkKLSNkZWZpbmUgTE9XRVJfQklUU19SVUJJTiAgICgoKChsb25nKSAxKTw8KFJVQklOX1JFR19TSVpFLTEpKS0xKQotCi0KLXN0cnVjdCBydWJpbl9zdGF0ZSB7Ci0JdW5zaWduZWQgbG9uZyBwOwotCXVuc2lnbmVkIGxvbmcgcTsKLQl1bnNpZ25lZCBsb25nIHJlY19xOwotCWxvbmcgYml0X251bWJlcjsKLQlzdHJ1Y3QgcHVzaHB1bGwgcHA7Ci0JaW50IGJpdF9kaXZpZGVyOwotCWludCBiaXRzWzhdOwotfTsKZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL2NvbXByX3psaWIuYyBiL2ZzL2pmZnMyL2NvbXByX3psaWIuYwppbmRleCAwYzFmYzZlLi4yYjg3ZmNjIDEwMDY0NAotLS0gYS9mcy9qZmZzMi9jb21wcl96bGliLmMKKysrIGIvZnMvamZmczIvY29tcHJfemxpYi5jCkBAIC0xLDE0ICsxLDEyIEBACiAvKgogICogSkZGUzIgLS0gSm91cm5hbGxpbmcgRmxhc2ggRmlsZSBTeXN0ZW0sIFZlcnNpb24gMi4KICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMyBSZWQgSGF0LCBJbmMuCisgKiBDb3B5cmlnaHQgwqkgMjAwMS0yMDA3IFJlZCBIYXQsIEluYy4KICAqCiAgKiBDcmVhdGVkIGJ5IERhdmlkIFdvb2Rob3VzZSA8ZHdtdzJAaW5mcmFkZWFkLm9yZz4KICAqCiAgKiBGb3IgbGljZW5zaW5nIGluZm9ybWF0aW9uLCBzZWUgdGhlIGZpbGUgJ0xJQ0VOQ0UnIGluIHRoaXMgZGlyZWN0b3J5LgogICoKLSAqICRJZDogY29tcHJfemxpYi5jLHYgMS4zMiAyMDA1LzExLzA3IDExOjE0OjM4IGdsZWl4bmVyIEV4cCAkCi0gKgogICovCiAKICNpZiAhZGVmaW5lZChfX0tFUk5FTF9fKSAmJiAhZGVmaW5lZChfX0VDT1MpCmRpZmYgLS1naXQgYS9mcy9qZmZzMi9jb21wcnRlc3QuYyBiL2ZzL2pmZnMyL2NvbXBydGVzdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGZiOGJlLi4wMDAwMDAwCi0tLSBhL2ZzL2pmZnMyL2NvbXBydGVzdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzA3ICswLDAgQEAKLS8qICRJZDogY29tcHJ0ZXN0LmMsdiAxLjYgMjAwNS8xMS8wNyAxMToxNDozOCBnbGVpeG5lciBFeHAgJCAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8YXNtL3R5cGVzLmg+Ci0jaWYgMAotI2RlZmluZSBURVNUREFUQV9MRU4gNTEyCi1zdGF0aWMgdW5zaWduZWQgY2hhciB0ZXN0ZGF0YVtURVNUREFUQV9MRU5dID0gewotIDB4N2YsIDB4NDUsIDB4NGMsIDB4NDYsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gMHgwMiwgMHgwMCwgMHgwMywgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHg2MCwgMHg4MywgMHgwNCwgMHgwOCwgMHgzNCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAweGIwLCAweDI5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDM0LCAweDAwLCAweDIwLCAweDAwLCAweDA2LCAweDAwLCAweDI4LCAweDAwLAotIDB4MWUsIDB4MDAsIDB4MWIsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MzQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MzQsIDB4ODAsIDB4MDQsIDB4MDgsCi0gMHgzNCwgMHg4MCwgMHgwNCwgMHgwOCwgMHhjMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNSwgMHgwMCwgMHgwMCwgMHgwMCwKLSAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweGY0LCAweDAwLCAweDAwLCAweDAwLCAweGY0LCAweDgwLCAweDA0LCAweDA4LAotIDB4ZjQsIDB4ODAsIDB4MDQsIDB4MDgsIDB4MTMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsCi0gMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHgwNCwgMHgwOCwKLSAweDAwLCAweDgwLCAweDA0LCAweDA4LCAweDBkLCAweDA1LCAweDAwLCAweDAwLCAweDBkLCAweDA1LCAweDAwLCAweDAwLCAweDA1LCAweDAwLCAweDAwLCAweDAwLAotIDB4MDAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MTAsIDB4OTUsIDB4MDQsIDB4MDgsCi0gMHgxMCwgMHg5NSwgMHgwNCwgMHgwOCwgMHhlOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwNiwgMHgwMCwgMHgwMCwgMHgwMCwKLSAweDAwLCAweDEwLCAweDAwLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDU4LCAweDA1LCAweDAwLCAweDAwLCAweDU4LCAweDk1LCAweDA0LCAweDA4LAotIDB4NTgsIDB4OTUsIDB4MDQsIDB4MDgsIDB4YTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MDAsIDB4MDAsCi0gMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwOCwgMHg4MSwgMHgwNCwgMHgwOCwKLSAweDA4LCAweDgxLCAweDA0LCAweDA4LCAweDIwLCAweDAwLCAweDAwLCAweDAwLCAweDIwLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLAotIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MmYsIDB4NmMsIDB4NjksIDB4NjIsIDB4MmYsIDB4NmMsIDB4NjQsIDB4MmQsIDB4NmMsIDB4NjksIDB4NmUsIDB4NzUsCi0gMHg3OCwgMHgyZSwgMHg3MywgMHg2ZiwgMHgyZSwgMHgzMiwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDQ3LCAweDRlLCAweDU1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAwLAotIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDAsCi0gMHgwNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg2OSwgMHgwMCwgMHgwMCwgMHgwMCwKLSAweDBjLCAweDgzLCAweDA0LCAweDA4LCAweDgxLCAweDAwLCAweDAwLCAweDAwLCAweDIyLCAweDAwLCAweDAwLCAweDAwLCAweDMwLCAweDAwLCAweDAwLCAweDAwLAotIDB4MWMsIDB4ODMsIDB4MDQsIDB4MDgsIDB4YWMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NTcsIDB4MDAsIDB4MDAsIDB4MDAsCi0gMHgyYywgMHg4MywgMHgwNCwgMHgwOCwgMHhkZCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxYSwgMHgwMCwgMHgwMCwgMHgwMCwKLSAweDNjLCAweDgzLCAweDA0LCAweDA4LCAweDJlLCAweDAwLCAweDAwLCAweDAwLCAweDEyLCAweDAwLCAweDAwLCAweDAwLCAweDIxLCAweDAwLCAweDAwLCAweDAwLAotIDB4NGMsIDB4ODMsIDB4MDQsIDB4MDgsIDB4N2QsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDgsIDB4MDAsIDB4MDAsIDB4MDAsCi0gMHgwMCwgMHg4NSwgMHgwNCwgMHgwOCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMSwgMHgwMCwgMHgwZSwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwKLSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDIwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDVmLCAweDVmLCAweDY3LAotIDB4NmQsIDB4NmYsIDB4NmUsIDB4NWYsIDB4NzMsIDB4NzQsIDB4NjEsIDB4NzIsIDB4NzQsIDB4NWYsIDB4NWYsIDB4MDAsIDB4NmMsIDB4NjksIDB4NjIsIDB4NjMsCi0gMHgyZSwgMHg3MywgMHg2ZiwgMHgyZSwgMHgzNiwgMHgwMCwgMHg3MCwgMHg3MiwgMHg2OSwgMHg2ZSwgMHg3NCwgMHg2NiwgMHgwMCwgMHg1ZiwgMHg1ZiwgMHg2M307Ci0jZWxzZQotI2RlZmluZSBURVNUREFUQV9MRU4gMzQ4MQotc3RhdGljIHVuc2lnbmVkIGNoYXIgdGVzdGRhdGFbVEVTVERBVEFfTEVOXSA9IHsKLSAweDIzLCAweDY5LCAweDZlLCAweDYzLCAweDZjLCAweDc1LCAweDY0LCAweDY1LCAweDIwLCAweDIyLCAweDY0LCAweDYyLCAweDY1LCAweDZlLCAweDYzLCAweDY4LAotIDB4MmUsIDB4NjgsIDB4MjIsIDB4MGEsIDB4MGEsIDB4MjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjksIDB4NmUsIDB4NjUsIDB4MjAsIDB4NGQsIDB4NDEsIDB4NTgsCi0gMHg1ZiwgMHg0NiwgMHg0OSwgMHg0YywgMHg0NSwgMHg1MywgMHgyMCwgMHgzMSwgMHgzMCwgMHgzMCwgMHgzMCwgMHgwYSwgMHgwYSwgMHg3MywgMHg3NCwgMHg2MSwKLSAweDc0LCAweDY5LCAweDYzLCAweDIwLCAweDYzLCAweDY4LCAweDYxLCAweDcyLCAweDIwLCAweDYyLCAweDc1LCAweDY2LCAweDViLCAweDM3LCAweDMwLCAweDMwLAotIDB4MzAsIDB4MzAsIDB4NWQsIDB4M2IsIDB4MGEsIDB4NjUsIDB4NzgsIDB4NzQsIDB4NjUsIDB4NzIsIDB4NmUsIDB4MjAsIDB4NjksIDB4NmUsIDB4NzQsIDB4MjAsCi0gMHg2YywgMHg2OSwgMHg2ZSwgMHg2NSwgMHg1ZiwgMHg2MywgMHg2ZiwgMHg3NSwgMHg2ZSwgMHg3NCwgMHgzYiwgMHgwYSwgMHgwYSwgMHg3MywgMHg3NCwgMHg2MSwKLSAweDc0LCAweDY5LCAweDYzLCAweDIwLCAweDczLCAweDc0LCAweDcyLCAweDc1LCAweDYzLCAweDc0LCAweDIwLCAweDdiLCAweDBhLCAweDA5LCAweDY5LCAweDZlLAotIDB4NzQsIDB4MjAsIDB4NjYsIDB4NjQsIDB4M2IsIDB4MGEsIDB4MDksIDB4NjksIDB4NmUsIDB4NzQsIDB4MjAsIDB4NjgsIDB4NjEsIDB4NmUsIDB4NjQsIDB4NmMsCi0gMHg2NSwgMHgzYiwgMHgwYSwgMHg3ZCwgMHgyMCwgMHg2NiwgMHg3NCwgMHg2MSwgMHg2MiwgMHg2YywgMHg2NSwgMHg1YiwgMHg0ZCwgMHg0MSwgMHg1OCwgMHg1ZiwKLSAweDQ2LCAweDQ5LCAweDRjLCAweDQ1LCAweDUzLCAweDVkLCAweDNiLCAweDBhLCAweDBhLCAweDc2LCAweDZmLCAweDY5LCAweDY0LCAweDIwLCAweDY0LCAweDZmLAotIDB4NWYsIDB4NzUsIDB4NmUsIDB4NmMsIDB4NjksIDB4NmUsIDB4NmIsIDB4MjgsIDB4NjMsIDB4NjgsIDB4NjEsIDB4NzIsIDB4MjAsIDB4MmEsIDB4NjYsIDB4NmUsCi0gMHg2MSwgMHg2ZCwgMHg2NSwgMHgyOSwgMHgwYSwgMHg3YiwgMHgwYSwgMHgwOSwgMHg3MywgMHg3NCwgMHg3MiwgMHg3NSwgMHg3MCwgMHg3MCwgMHg2NSwgMHg3MiwKLSAweDI4LCAweDY2LCAweDZlLCAweDYxLCAweDZkLCAweDY1LCAweDI5LCAweDNiLCAweDBhLCAweDBhLCAweDA5LCAweDY5LCAweDY2LCAweDIwLCAweDI4LCAweDc1LAotIDB4NmUsIDB4NmMsIDB4NjksIDB4NmUsIDB4NmIsIDB4MjgsIDB4NjYsIDB4NmUsIDB4NjEsIDB4NmQsIDB4NjUsIDB4MjksIDB4MjAsIDB4MjEsIDB4M2QsIDB4MjAsCi0gMHgzMCwgMHgyOSwgMHgyMCwgMHg3YiwgMHgwYSwgMHgwOSwgMHgwOSwgMHg3MCwgMHg3MiwgMHg2OSwgMHg2ZSwgMHg3NCwgMHg2NiwgMHgyOCwgMHgyMiwgMHgyOCwKLSAweDI1LCAweDY0LCAweDI5LCAweDIwLCAweDc1LCAweDZlLCAweDZjLCAweDY5LCAweDZlLCAweDZiLCAweDIwLCAweDI1LCAweDczLCAweDIwLCAweDY2LCAweDYxLAotIDB4NjksIDB4NmMsIDB4NjUsIDB4NjQsIDB4MjAsIDB4MjgsIDB4MjUsIDB4NzMsIDB4MjksIDB4NWMsIDB4NmUsIDB4MjIsIDB4MmMsIDB4MjAsIDB4MGEsIDB4MDksCi0gMHgwOSwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHg2YywgMHg2OSwgMHg2ZSwgMHg2NSwgMHg1ZiwgMHg2MywgMHg2ZiwgMHg3NSwKLSAweDZlLCAweDc0LCAweDJjLCAweDIwLCAweDY2LCAweDZlLCAweDYxLCAweDZkLCAweDY1LCAweDJjLCAweDIwLCAweDczLCAweDc0LCAweDcyLCAweDY1LCAweDcyLAotIDB4NzIsIDB4NmYsIDB4NzIsIDB4MjgsIDB4NjUsIDB4NzIsIDB4NzIsIDB4NmUsIDB4NmYsIDB4MjksIDB4MjksIDB4M2IsIDB4MGEsIDB4MDksIDB4N2QsIDB4MGEsCi0gMHg3ZCwgMHgwYSwgMHgwYSwgMHg3NiwgMHg2ZiwgMHg2OSwgMHg2NCwgMHgyMCwgMHg2NSwgMHg3OCwgMHg3MCwgMHg2MSwgMHg2ZSwgMHg2NCwgMHg1ZiwgMHg2NiwKLSAweDY5LCAweDZjLCAweDY1LCAweDI4LCAweDY5LCAweDZlLCAweDc0LCAweDIwLCAweDY2LCAweDY0LCAweDJjLCAweDIwLCAweDY5LCAweDZlLCAweDc0LCAweDIwLAotIDB4NzMsIDB4NjksIDB4N2EsIDB4NjUsIDB4MjksIDB4MGEsIDB4N2IsIDB4MGEsIDB4MDksIDB4NjksIDB4NmUsIDB4NzQsIDB4MjAsIDB4NzMsIDB4M2IsIDB4MGEsCi0gMHgwOSwgMHg3NywgMHg2OCwgMHg2OSwgMHg2YywgMHg2NSwgMHgyMCwgMHgyOCwgMHg3MywgMHg2OSwgMHg3YSwgMHg2NSwgMHgyOSwgMHgyMCwgMHg3YiwgMHgwYSwKLSAweDA5LCAweDA5LCAweDczLCAweDIwLCAweDNkLCAweDIwLCAweDRkLCAweDQ5LCAweDRlLCAweDI4LCAweDczLCAweDY5LCAweDdhLCAweDY1LCAweDZmLCAweDY2LAotIDB4MjgsIDB4NjIsIDB4NzUsIDB4NjYsIDB4MjksIDB4MmMsIDB4MjAsIDB4NzMsIDB4NjksIDB4N2EsIDB4NjUsIDB4MjksIDB4M2IsIDB4MGEsIDB4MDksIDB4MDksCi0gMHg3NywgMHg3MiwgMHg2OSwgMHg3NCwgMHg2NSwgMHgyOCwgMHg2NiwgMHg2NCwgMHgyYywgMHgyMCwgMHg2MiwgMHg3NSwgMHg2NiwgMHgyYywgMHgyMCwgMHg3MywKLSAweDI5LCAweDNiLCAweDBhLCAweDA5LCAweDA5LCAweDczLCAweDY5LCAweDdhLCAweDY1LCAweDIwLCAweDJkLCAweDNkLCAweDIwLCAweDczLCAweDNiLCAweDBhLAotIDB4MDksIDB4N2QsIDB4MGEsIDB4N2QsIDB4MGEsIDB4MGEsIDB4NzYsIDB4NmYsIDB4NjksIDB4NjQsIDB4MjAsIDB4NjQsIDB4NmYsIDB4NWYsIDB4NmYsIDB4NzAsCi0gMHg2NSwgMHg2ZSwgMHgyOCwgMHg2MywgMHg2OCwgMHg2MSwgMHg3MiwgMHgyMCwgMHgyYSwgMHg2NiwgMHg2ZSwgMHg2MSwgMHg2ZCwgMHg2NSwgMHgyYywgMHgyMCwKLSAweDY5LCAweDZlLCAweDc0LCAweDIwLCAweDY4LCAweDYxLCAweDZlLCAweDY0LCAweDZjLCAweDY1LCAweDJjLCAweDIwLCAweDY5LCAweDZlLCAweDc0LCAweDIwLAotIDB4NzMsIDB4NjksIDB4N2EsIDB4NjUsIDB4MjksIDB4MGEsIDB4N2IsIDB4MGEsIDB4MDksIDB4NjksIDB4NmUsIDB4NzQsIDB4MjAsIDB4NjYsIDB4NjQsIDB4MmMsCi0gMHgyMCwgMHg2OSwgMHgzYiwgMHgwYSwgMHgwOSwgMHg2OSwgMHg2ZSwgMHg3NCwgMHgyMCwgMHg2NiwgMHg2YywgMHg2MSwgMHg2NywgMHg3MywgMHgyMCwgMHgzZCwKLSAweDIwLCAweDRmLCAweDVmLCAweDUyLCAweDQ0LCAweDU3LCAweDUyLCAweDdjLCAweDRmLCAweDVmLCAweDQzLCAweDUyLCAweDQ1LCAweDQxLCAweDU0LCAweDNiLAotIDB4MGEsIDB4MDksIDB4NzMsIDB4NzQsIDB4NzIsIDB4NzUsIDB4NjMsIDB4NzQsIDB4MjAsIDB4NzMsIDB4NzQsIDB4NjEsIDB4NzQsIDB4MjAsIDB4NzMsIDB4NzQsCi0gMHgzYiwgMHgwYSwgMHgwOSwgMHg3MywgMHg3NCwgMHg2MSwgMHg3NCwgMHg2OSwgMHg2MywgMHgyMCwgMHg2OSwgMHg2ZSwgMHg3NCwgMHgyMCwgMHg2MywgMHg2ZiwKLSAweDc1LCAweDZlLCAweDc0LCAweDNiLCAweDBhLCAweDBhLCAweDA5LCAweDczLCAweDc0LCAweDcyLCAweDc1LCAweDcwLCAweDcwLCAweDY1LCAweDcyLCAweDI4LAotIDB4NjYsIDB4NmUsIDB4NjEsIDB4NmQsIDB4NjUsIDB4MjksIDB4M2IsIDB4MGEsIDB4MGEsIDB4MDksIDB4NjksIDB4NjYsIDB4MjAsIDB4MjgsIDB4NzMsIDB4NjksCi0gMHg3YSwgMHg2NSwgMHgyMCwgMHgzZCwgMHgzZCwgMHgyMCwgMHgzMCwgMHgyOSwgMHgyMCwgMHg2NiwgMHg2YywgMHg2MSwgMHg2NywgMHg3MywgMHgyMCwgMHg3YywKLSAweDNkLCAweDIwLCAweDRmLCAweDVmLCAweDU0LCAweDUyLCAweDU1LCAweDRlLCAweDQzLCAweDNiLCAweDBhLCAweDBhLCAweDA5LCAweDY2LCAweDY0LCAweDIwLAotIDB4M2QsIDB4MjAsIDB4NmYsIDB4NzAsIDB4NjUsIDB4NmUsIDB4MjgsIDB4NjYsIDB4NmUsIDB4NjEsIDB4NmQsIDB4NjUsIDB4MmMsIDB4MjAsIDB4NjYsIDB4NmMsCi0gMHg2MSwgMHg2NywgMHg3MywgMHgyYywgMHgyMCwgMHgzMCwgMHgzNiwgMHgzMCwgMHgzMCwgMHgyOSwgMHgzYiwgMHgwYSwgMHgwOSwgMHg2OSwgMHg2NiwgMHgyMCwKLSAweDI4LCAweDY2LCAweDY0LCAweDIwLCAweDNkLCAweDNkLCAweDIwLCAweDJkLCAweDMxLCAweDI5LCAweDIwLCAweDdiLCAweDBhLCAweDA5LCAweDA5LCAweDcwLAotIDB4NzIsIDB4NjksIDB4NmUsIDB4NzQsIDB4NjYsIDB4MjgsIDB4MjIsIDB4MjgsIDB4MjUsIDB4NjQsIDB4MjksIDB4MjAsIDB4NmYsIDB4NzAsIDB4NjUsIDB4NmUsCi0gMHgyMCwgMHgyNSwgMHg3MywgMHgyMCwgMHg2NiwgMHg2MSwgMHg2OSwgMHg2YywgMHg2NSwgMHg2NCwgMHgyMCwgMHg2NiwgMHg2ZiwgMHg3MiwgMHgyMCwgMHg2OCwKLSAweDYxLCAweDZlLCAweDY0LCAweDZjLCAweDY1LCAweDIwLCAweDI1LCAweDY0LCAweDIwLCAweDI4LCAweDI1LCAweDczLCAweDI5LCAweDVjLCAweDZlLCAweDIyLAotIDB4MmMsIDB4MjAsIDB4MGEsIDB4MDksIDB4MDksIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4NmMsIDB4NjksIDB4NmUsIDB4NjUsCi0gMHg1ZiwgMHg2MywgMHg2ZiwgMHg3NSwgMHg2ZSwgMHg3NCwgMHgyYywgMHgyMCwgMHg2NiwgMHg2ZSwgMHg2MSwgMHg2ZCwgMHg2NSwgMHgyYywgMHgyMCwgMHg2OCwKLSAweDYxLCAweDZlLCAweDY0LCAweDZjLCAweDY1LCAweDJjLCAweDIwLCAweDczLCAweDc0LCAweDcyLCAweDY1LCAweDcyLCAweDcyLCAweDZmLCAweDcyLCAweDI4LAotIDB4NjUsIDB4NzIsIDB4NzIsIDB4NmUsIDB4NmYsIDB4MjksIDB4MjksIDB4M2IsIDB4MGEsIDB4MDksIDB4MDksIDB4NzIsIDB4NjUsIDB4NzQsIDB4NzUsIDB4NzIsCi0gMHg2ZSwgMHgzYiwgMHgwYSwgMHgwOSwgMHg3ZCwgMHgwYSwgMHgwOSwgMHg2NiwgMHg3MywgMHg3NCwgMHg2MSwgMHg3NCwgMHgyOCwgMHg2NiwgMHg2NCwgMHgyYywKLSAweDIwLCAweDI2LCAweDczLCAweDc0LCAweDI5LCAweDNiLCAweDBhLCAweDA5LCAweDY5LCAweDY2LCAweDIwLCAweDI4LCAweDczLCAweDY5LCAweDdhLCAweDY1LAotIDB4MjAsIDB4M2UsIDB4MjAsIDB4NzMsIDB4NzQsIDB4MmUsIDB4NzMsIDB4NzQsIDB4NWYsIDB4NzMsIDB4NjksIDB4N2EsIDB4NjUsIDB4MjksIDB4MjAsIDB4N2IsCi0gMHgwYSwgMHgyMywgMHg2OSwgMHg2NiwgMHgyMCwgMHg0NCwgMHg0NSwgMHg0MiwgMHg1NSwgMHg0NywgMHgwYSwgMHgwOSwgMHgwOSwgMHg3MCwgMHg3MiwgMHg2OSwKLSAweDZlLCAweDc0LCAweDY2LCAweDI4LCAweDIyLCAweDI4LCAweDI1LCAweDY0LCAweDI5LCAweDIwLCAweDY1LCAweDc4LCAweDcwLCAweDYxLCAweDZlLCAweDY0LAotIDB4NjksIDB4NmUsIDB4NjcsIDB4MjAsIDB4MjUsIDB4NzMsIDB4MjAsIDB4NzQsIDB4NmYsIDB4MjAsIDB4MjUsIDB4NjQsIDB4MjAsIDB4NjYsIDB4NzIsIDB4NmYsCi0gMHg2ZCwgMHgyMCwgMHgyNSwgMHg2NCwgMHg1YywgMHg2ZSwgMHgyMiwgMHgyYywgMHgyMCwgMHgwYSwgMHgwOSwgMHgwOSwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwKLSAweDIwLCAweDIwLCAweDIwLCAweDZjLCAweDY5LCAweDZlLCAweDY1LCAweDVmLCAweDYzLCAweDZmLCAweDc1LCAweDZlLCAweDc0LCAweDJjLCAweDIwLCAweDY2LAotIDB4NmUsIDB4NjEsIDB4NmQsIDB4NjUsIDB4MmMsIDB4MjAsIDB4NzMsIDB4NjksIDB4N2EsIDB4NjUsIDB4MmMsIDB4MjAsIDB4MjgsIDB4NjksIDB4NmUsIDB4NzQsCi0gMHgyOSwgMHg3MywgMHg3NCwgMHgyZSwgMHg3MywgMHg3NCwgMHg1ZiwgMHg3MywgMHg2OSwgMHg3YSwgMHg2NSwgMHgyOSwgMHgzYiwgMHgwYSwgMHgyMywgMHg2NSwKLSAweDZlLCAweDY0LCAweDY5LCAweDY2LCAweDBhLCAweDA5LCAweDA5LCAweDY1LCAweDc4LCAweDcwLCAweDYxLCAweDZlLCAweDY0LCAweDVmLCAweDY2LCAweDY5LAotIDB4NmMsIDB4NjUsIDB4MjgsIDB4NjYsIDB4NjQsIDB4MmMsIDB4MjAsIDB4NzMsIDB4NjksIDB4N2EsIDB4NjUsIDB4MjAsIDB4MmQsIDB4MjAsIDB4NzMsIDB4NzQsCi0gMHgyZSwgMHg3MywgMHg3NCwgMHg1ZiwgMHg3MywgMHg2OSwgMHg3YSwgMHg2NSwgMHgyOSwgMHgzYiwgMHgwYSwgMHgwOSwgMHg3ZCwgMHgyMCwgMHg2NSwgMHg2YywKLSAweDczLCAweDY1LCAweDIwLCAweDY5LCAweDY2LCAweDIwLCAweDI4LCAweDczLCAweDY5LCAweDdhLCAweDY1LCAweDIwLCAweDNjLCAweDIwLCAweDczLCAweDc0LAotIDB4MmUsIDB4NzMsIDB4NzQsIDB4NWYsIDB4NzMsIDB4NjksIDB4N2EsIDB4NjUsIDB4MjksIDB4MjAsIDB4N2IsIDB4MGEsIDB4MDksIDB4MDksIDB4NzAsIDB4NzIsCi0gMHg2OSwgMHg2ZSwgMHg3NCwgMHg2NiwgMHgyOCwgMHgyMiwgMHg3NCwgMHg3MiwgMHg3NSwgMHg2ZSwgMHg2MywgMHg2MSwgMHg3NCwgMHg2OSwgMHg2ZSwgMHg2NywKLSAweDIwLCAweDI1LCAweDczLCAweDIwLCAweDc0LCAweDZmLCAweDIwLCAweDI1LCAweDY0LCAweDIwLCAweDY2LCAweDcyLCAweDZmLCAweDZkLCAweDIwLCAweDI1LAotIDB4NjQsIDB4NWMsIDB4NmUsIDB4MjIsIDB4MmMsIDB4MjAsIDB4MGEsIDB4MDksIDB4MDksIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsCi0gMHg2NiwgMHg2ZSwgMHg2MSwgMHg2ZCwgMHg2NSwgMHgyYywgMHgyMCwgMHg3MywgMHg2OSwgMHg3YSwgMHg2NSwgMHgyYywgMHgyMCwgMHgyOCwgMHg2OSwgMHg2ZSwKLSAweDc0LCAweDI5LCAweDczLCAweDc0LCAweDJlLCAweDczLCAweDc0LCAweDVmLCAweDczLCAweDY5LCAweDdhLCAweDY1LCAweDI5LCAweDNiLCAweDBhLCAweDA5LAotIDB4MDksIDB4NjYsIDB4NzQsIDB4NzIsIDB4NzUsIDB4NmUsIDB4NjMsIDB4NjEsIDB4NzQsIDB4NjUsIDB4MjgsIDB4NjYsIDB4NjQsIDB4MmMsIDB4MjAsIDB4NzMsCi0gMHg2OSwgMHg3YSwgMHg2NSwgMHgyOSwgMHgzYiwgMHgwYSwgMHgwOSwgMHg3ZCwgMHgwYSwgMHgwOSwgMHg2NiwgMHg2ZiwgMHg3MiwgMHgyMCwgMHgyOCwgMHg2OSwKLSAweDNkLCAweDMwLCAweDNiLCAweDY5LCAweDNjLCAweDRkLCAweDQxLCAweDU4LCAweDVmLCAweDQ2LCAweDQ5LCAweDRjLCAweDQ1LCAweDUzLCAweDNiLCAweDY5LAotIDB4MmIsIDB4MmIsIDB4MjksIDB4MjAsIDB4N2IsIDB4MGEsIDB4MDksIDB4MDksIDB4NjksIDB4NjYsIDB4MjAsIDB4MjgsIDB4NjYsIDB4NzQsIDB4NjEsIDB4NjIsCi0gMHg2YywgMHg2NSwgMHg1YiwgMHg2OSwgMHg1ZCwgMHgyZSwgMHg2OCwgMHg2MSwgMHg2ZSwgMHg2NCwgMHg2YywgMHg2NSwgMHgyMCwgMHgzZCwgMHgzZCwgMHgyMCwKLSAweDMwLCAweDI5LCAweDIwLCAweDYyLCAweDcyLCAweDY1LCAweDYxLCAweDZiLCAweDNiLCAweDBhLCAweDA5LCAweDdkLCAweDBhLCAweDA5LCAweDY5LCAweDY2LAotIDB4MjAsIDB4MjgsIDB4NjksIDB4MjAsIDB4M2QsIDB4M2QsIDB4MjAsIDB4NGQsIDB4NDEsIDB4NTgsIDB4NWYsIDB4NDYsIDB4NDksIDB4NGMsIDB4NDUsIDB4NTMsCi0gMHgyOSwgMHgyMCwgMHg3YiwgMHgwYSwgMHgwOSwgMHgwOSwgMHg3MCwgMHg3MiwgMHg2OSwgMHg2ZSwgMHg3NCwgMHg2NiwgMHgyOCwgMHgyMiwgMHg2NiwgMHg2OSwKLSAweDZjLCAweDY1LCAweDIwLCAweDc0LCAweDYxLCAweDYyLCAweDZjLCAweDY1LCAweDIwLCAweDY2LCAweDc1LCAweDZjLCAweDZjLCAweDIwLCAweDY2LCAweDZmLAotIDB4NzIsIDB4MjAsIDB4MjUsIDB4NzMsIDB4NWMsIDB4NmUsIDB4MjIsIDB4MmMsIDB4MjAsIDB4NjYsIDB4NmUsIDB4NjEsIDB4NmQsIDB4NjUsIDB4MjksIDB4M2IsCi0gMHgwYSwgMHgwOSwgMHgwOSwgMHg2NSwgMHg3OCwgMHg2OSwgMHg3NCwgMHgyOCwgMHgzMSwgMHgyOSwgMHgzYiwgMHgwYSwgMHgwOSwgMHg3ZCwgMHgwYSwgMHgwOSwKLSAweDY2LCAweDc0LCAweDYxLCAweDYyLCAweDZjLCAweDY1LCAweDViLCAweDY5LCAweDVkLCAweDJlLCAweDY4LCAweDYxLCAweDZlLCAweDY0LCAweDZjLCAweDY1LAotIDB4MjAsIDB4M2QsIDB4MjAsIDB4NjgsIDB4NjEsIDB4NmUsIDB4NjQsIDB4NmMsIDB4NjUsIDB4M2IsIDB4MGEsIDB4MDksIDB4NjYsIDB4NzQsIDB4NjEsIDB4NjIsCi0gMHg2YywgMHg2NSwgMHg1YiwgMHg2OSwgMHg1ZCwgMHgyZSwgMHg2NiwgMHg2NCwgMHgyMCwgMHgzZCwgMHgyMCwgMHg2NiwgMHg2NCwgMHgzYiwgMHgwYSwgMHgwOSwKLSAweDY5LCAweDY2LCAweDIwLCAweDI4LCAweDYzLCAweDZmLCAweDc1LCAweDZlLCAweDc0LCAweDJiLCAweDJiLCAweDIwLCAweDI1LCAweDIwLCAweDMxLCAweDMwLAotIDB4MzAsIDB4MjAsIDB4M2QsIDB4M2QsIDB4MjAsIDB4MzAsIDB4MjksIDB4MjAsIDB4N2IsIDB4MGEsIDB4MDksIDB4MDksIDB4NzAsIDB4NzIsIDB4NjksIDB4NmUsCi0gMHg3NCwgMHg2NiwgMHgyOCwgMHgyMiwgMHgyZSwgMHgyMiwgMHgyOSwgMHgzYiwgMHgwYSwgMHgwOSwgMHg3ZCwgMHgwYSwgMHg3ZCwgMHgwYSwgMHgwYSwgMHg3NiwKLSAweDZmLCAweDY5LCAweDY0LCAweDIwLCAweDY0LCAweDZmLCAweDVmLCAweDc3LCAweDcyLCAweDY5LCAweDc0LCAweDY1LCAweDI4LCAweDY5LCAweDZlLCAweDc0LAotIDB4MjAsIDB4NjgsIDB4NjEsIDB4NmUsIDB4NjQsIDB4NmMsIDB4NjUsIDB4MmMsIDB4MjAsIDB4NjksIDB4NmUsIDB4NzQsIDB4MjAsIDB4NzMsIDB4NjksIDB4N2EsCi0gMHg2NSwgMHgyYywgMHgyMCwgMHg2OSwgMHg2ZSwgMHg3NCwgMHgyMCwgMHg2ZiwgMHg2NiwgMHg2NiwgMHg3MywgMHg2NSwgMHg3NCwgMHgyOSwgMHgwYSwgMHg3YiwKLSAweDBhLCAweDA5LCAweDY5LCAweDZlLCAweDc0LCAweDIwLCAweDY5LCAweDNiLCAweDBhLCAweDBhLCAweDA5LCAweDY5LCAweDY2LCAweDIwLCAweDI4LCAweDYyLAotIDB4NzUsIDB4NjYsIDB4NWIsIDB4MzAsIDB4NWQsIDB4MjAsIDB4M2QsIDB4M2QsIDB4MjAsIDB4MzAsIDB4MjksIDB4MjAsIDB4NmQsIDB4NjUsIDB4NmQsIDB4NzMsCi0gMHg2NSwgMHg3NCwgMHgyOCwgMHg2MiwgMHg3NSwgMHg2NiwgMHgyYywgMHgyMCwgMHgzMSwgMHgyYywgMHgyMCwgMHg3MywgMHg2OSwgMHg3YSwgMHg2NSwgMHg2ZiwKLSAweDY2LCAweDI4LCAweDYyLCAweDc1LCAweDY2LCAweDI5LCAweDI5LCAweDNiLCAweDBhLCAweDBhLCAweDA5LCAweDY2LCAweDZmLCAweDcyLCAweDIwLCAweDI4LAotIDB4NjksIDB4M2QsIDB4MzAsIDB4M2IsIDB4NjksIDB4M2MsIDB4NGQsIDB4NDEsIDB4NTgsIDB4NWYsIDB4NDYsIDB4NDksIDB4NGMsIDB4NDUsIDB4NTMsIDB4M2IsCi0gMHg2OSwgMHgyYiwgMHgyYiwgMHgyOSwgMHgyMCwgMHg3YiwgMHgwYSwgMHgwOSwgMHgwOSwgMHg2OSwgMHg2NiwgMHgyMCwgMHgyOCwgMHg2NiwgMHg3NCwgMHg2MSwKLSAweDYyLCAweDZjLCAweDY1LCAweDViLCAweDY5LCAweDVkLCAweDJlLCAweDY4LCAweDYxLCAweDZlLCAweDY0LCAweDZjLCAweDY1LCAweDIwLCAweDNkLCAweDNkLAotIDB4MjAsIDB4NjgsIDB4NjEsIDB4NmUsIDB4NjQsIDB4NmMsIDB4NjUsIDB4MjksIDB4MjAsIDB4NjIsIDB4NzIsIDB4NjUsIDB4NjEsIDB4NmIsIDB4M2IsIDB4MGEsCi0gMHgwOSwgMHg3ZCwgMHgwYSwgMHgwOSwgMHg2OSwgMHg2NiwgMHgyMCwgMHgyOCwgMHg2OSwgMHgyMCwgMHgzZCwgMHgzZCwgMHgyMCwgMHg0ZCwgMHg0MSwgMHg1OCwKLSAweDVmLCAweDQ2LCAweDQ5LCAweDRjLCAweDQ1LCAweDUzLCAweDI5LCAweDIwLCAweDdiLCAweDBhLCAweDIzLCAweDY5LCAweDY2LCAweDIwLCAweDMxLCAweDBhLAotIDB4MDksIDB4MDksIDB4NzAsIDB4NzIsIDB4NjksIDB4NmUsIDB4NzQsIDB4NjYsIDB4MjgsIDB4MjIsIDB4MjgsIDB4MjUsIDB4NjQsIDB4MjksIDB4MjAsIDB4NjQsCi0gMHg2ZiwgMHg1ZiwgMHg3NywgMHg3MiwgMHg2OSwgMHg3NCwgMHg2NSwgMHgzYSwgMHgyMCwgMHg2OCwgMHg2MSwgMHg2ZSwgMHg2NCwgMHg2YywgMHg2NSwgMHgyMCwKLSAweDI1LCAweDY0LCAweDIwLCAweDc3LCAweDYxLCAweDczLCAweDIwLCAweDZlLCAweDZmLCAweDc0LCAweDIwLCAweDZmLCAweDcwLCAweDY1LCAweDZlLCAweDIwLAotIDB4NzMsIDB4NjksIDB4N2EsIDB4NjUsIDB4M2QsIDB4MjUsIDB4NjQsIDB4MjAsIDB4NmYsIDB4NjYsIDB4NzMsIDB4M2QsIDB4MjUsIDB4NjQsIDB4NWMsIDB4NmUsCi0gMHgyMiwgMHgyYywgMHgyMCwgMHgwYSwgMHgwOSwgMHgwOSwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHg2YywgMHg2OSwgMHg2ZSwKLSAweDY1LCAweDVmLCAweDYzLCAweDZmLCAweDc1LCAweDZlLCAweDc0LCAweDJjLCAweDIwLCAweDY4LCAweDYxLCAweDZlLCAweDY0LCAweDZjLCAweDY1LCAweDJjLAotIDB4MjAsIDB4NzMsIDB4NjksIDB4N2EsIDB4NjUsIDB4MmMsIDB4MjAsIDB4NmYsIDB4NjYsIDB4NjYsIDB4NzMsIDB4NjUsIDB4NzQsIDB4MjksIDB4M2IsIDB4MGEsCi0gMHgyMywgMHg2NSwgMHg2ZSwgMHg2NCwgMHg2OSwgMHg2NiwgMHgwYSwgMHgwOSwgMHgwOSwgMHg3MiwgMHg2NSwgMHg3NCwgMHg3NSwgMHg3MiwgMHg2ZSwgMHgzYiwKLSAweDBhLCAweDA5LCAweDdkLCAweDBhLCAweDA5LCAweDZjLCAweDczLCAweDY1LCAweDY1LCAweDZiLCAweDI4LCAweDY2LCAweDc0LCAweDYxLCAweDYyLCAweDZjLAotIDB4NjUsIDB4NWIsIDB4NjksIDB4NWQsIDB4MmUsIDB4NjYsIDB4NjQsIDB4MmMsIDB4MjAsIDB4NmYsIDB4NjYsIDB4NjYsIDB4NzMsIDB4NjUsIDB4NzQsIDB4MmMsCi0gMHgyMCwgMHg1MywgMHg0NSwgMHg0NSwgMHg0YiwgMHg1ZiwgMHg1MywgMHg0NSwgMHg1NCwgMHgyOSwgMHgzYiwgMHgwYSwgMHgwOSwgMHg2OSwgMHg2NiwgMHgyMCwKLSAweDI4LCAweDc3LCAweDcyLCAweDY5LCAweDc0LCAweDY1LCAweDI4LCAweDY2LCAweDc0LCAweDYxLCAweDYyLCAweDZjLCAweDY1LCAweDViLCAweDY5LCAweDVkLAotIDB4MmUsIDB4NjYsIDB4NjQsIDB4MmMsIDB4MjAsIDB4NjIsIDB4NzUsIDB4NjYsIDB4MmMsIDB4MjAsIDB4NzMsIDB4NjksIDB4N2EsIDB4NjUsIDB4MjksIDB4MjAsCi0gMHgyMSwgMHgzZCwgMHgyMCwgMHg3MywgMHg2OSwgMHg3YSwgMHg2NSwgMHgyOSwgMHgyMCwgMHg3YiwgMHgwYSwgMHgwOSwgMHgwOSwgMHg3MCwgMHg3MiwgMHg2OSwKLSAweDZlLCAweDc0LCAweDY2LCAweDI4LCAweDIyLCAweDc3LCAweDcyLCAweDY5LCAweDc0LCAweDY1LCAweDIwLCAweDY2LCAweDYxLCAweDY5LCAweDZjLCAweDY1LAotIDB4NjQsIDB4MjAsIDB4NmYsIDB4NmUsIDB4MjAsIDB4NjgsIDB4NjEsIDB4NmUsIDB4NjQsIDB4NmMsIDB4NjUsIDB4MjAsIDB4MjUsIDB4NjQsIDB4NWMsIDB4NmUsCi0gMHgyMiwgMHgyYywgMHgyMCwgMHg2OCwgMHg2MSwgMHg2ZSwgMHg2NCwgMHg2YywgMHg2NSwgMHgyOSwgMHgzYiwgMHgwYSwgMHgwOSwgMHg3ZCwgMHgwYSwgMHg3ZCwKLSAweDBhLCAweDBhLCAweDc2LCAweDZmLCAweDY5LCAweDY0LCAweDIwLCAweDY0LCAweDZmLCAweDVmLCAweDcyLCAweDY1LCAweDYxLCAweDY0LCAweDI4LCAweDY5LAotIDB4NmUsIDB4NzQsIDB4MjAsIDB4NjgsIDB4NjEsIDB4NmUsIDB4NjQsIDB4NmMsIDB4NjUsIDB4MmMsIDB4MjAsIDB4NjksIDB4NmUsIDB4NzQsIDB4MjAsIDB4NzMsCi0gMHg2OSwgMHg3YSwgMHg2NSwgMHgyYywgMHgyMCwgMHg2OSwgMHg2ZSwgMHg3NCwgMHgyMCwgMHg2ZiwgMHg2NiwgMHg2NiwgMHg3MywgMHg2NSwgMHg3NCwgMHgyOSwKLSAweDBhLCAweDdiLCAweDBhLCAweDA5LCAweDY5LCAweDZlLCAweDc0LCAweDIwLCAweDY5LCAweDNiLCAweDBhLCAweDA5LCAweDY2LCAweDZmLCAweDcyLCAweDIwLAotIDB4MjgsIDB4NjksIDB4M2QsIDB4MzAsIDB4M2IsIDB4NjksIDB4M2MsIDB4NGQsIDB4NDEsIDB4NTgsIDB4NWYsIDB4NDYsIDB4NDksIDB4NGMsIDB4NDUsIDB4NTMsCi0gMHgzYiwgMHg2OSwgMHgyYiwgMHgyYiwgMHgyOSwgMHgyMCwgMHg3YiwgMHgwYSwgMHgwOSwgMHgwOSwgMHg2OSwgMHg2NiwgMHgyMCwgMHgyOCwgMHg2NiwgMHg3NCwKLSAweDYxLCAweDYyLCAweDZjLCAweDY1LCAweDViLCAweDY5LCAweDVkLCAweDJlLCAweDY4LCAweDYxLCAweDZlLCAweDY0LCAweDZjLCAweDY1LCAweDIwLCAweDNkLAotIDB4M2QsIDB4MjAsIDB4NjgsIDB4NjEsIDB4NmUsIDB4NjQsIDB4NmMsIDB4NjUsIDB4MjksIDB4MjAsIDB4NjIsIDB4NzIsIDB4NjUsIDB4NjEsIDB4NmIsIDB4M2IsCi0gMHgwYSwgMHgwOSwgMHg3ZCwgMHgwYSwgMHgwOSwgMHg2OSwgMHg2NiwgMHgyMCwgMHgyOCwgMHg2OSwgMHgyMCwgMHgzZCwgMHgzZCwgMHgyMCwgMHg0ZCwgMHg0MSwKLSAweDU4LCAweDVmLCAweDQ2LCAweDQ5LCAweDRjLCAweDQ1LCAweDUzLCAweDI5LCAweDIwLCAweDdiLCAweDBhLCAweDA5LCAweDA5LCAweDcwLCAweDcyLCAweDY5LAotIDB4NmUsIDB4NzQsIDB4NjYsIDB4MjgsIDB4MjIsIDB4MjgsIDB4MjUsIDB4NjQsIDB4MjksIDB4MjAsIDB4NjQsIDB4NmYsIDB4NWYsIDB4NzIsIDB4NjUsIDB4NjEsCi0gMHg2NCwgMHgzYSwgMHgyMCwgMHg2OCwgMHg2MSwgMHg2ZSwgMHg2NCwgMHg2YywgMHg2NSwgMHgyMCwgMHgyNSwgMHg2NCwgMHgyMCwgMHg3NywgMHg2MSwgMHg3MywKLSAweDIwLCAweDZlLCAweDZmLCAweDc0LCAweDIwLCAweDZmLCAweDcwLCAweDY1LCAweDZlLCAweDIwLCAweDczLCAweDY5LCAweDdhLCAweDY1LCAweDNkLCAweDI1LAotIDB4NjQsIDB4MjAsIDB4NmYsIDB4NjYsIDB4NzMsIDB4M2QsIDB4MjUsIDB4NjQsIDB4NWMsIDB4NmUsIDB4MjIsIDB4MmMsIDB4MjAsIDB4MGEsIDB4MDksIDB4MDksCi0gMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHg2YywgMHg2OSwgMHg2ZSwgMHg2NSwgMHg1ZiwgMHg2MywgMHg2ZiwgMHg3NSwgMHg2ZSwKLSAweDc0LCAweDJjLCAweDIwLCAweDY4LCAweDYxLCAweDZlLCAweDY0LCAweDZjLCAweDY1LCAweDJjLCAweDIwLCAweDczLCAweDY5LCAweDdhLCAweDY1LCAweDJjLAotIDB4MjAsIDB4NmYsIDB4NjYsIDB4NjYsIDB4NzMsIDB4NjUsIDB4NzQsIDB4MjksIDB4M2IsIDB4MGEsIDB4MDksIDB4MDksIDB4NzIsIDB4NjUsIDB4NzQsIDB4NzUsCi0gMHg3MiwgMHg2ZSwgMHgzYiwgMHgwYSwgMHgwOSwgMHg3ZCwgMHgwYSwgMHgwOSwgMHg2YywgMHg3MywgMHg2NSwgMHg2NSwgMHg2YiwgMHgyOCwgMHg2NiwgMHg3NCwKLSAweDYxLCAweDYyLCAweDZjLCAweDY1LCAweDViLCAweDY5LCAweDVkLCAweDJlLCAweDY2LCAweDY0LCAweDJjLCAweDIwLCAweDZmLCAweDY2LCAweDY2LCAweDczLAotIDB4NjUsIDB4NzQsIDB4MmMsIDB4MjAsIDB4NTMsIDB4NDUsIDB4NDUsIDB4NGIsIDB4NWYsIDB4NTMsIDB4NDUsIDB4NTQsIDB4MjksIDB4M2IsIDB4MGEsIDB4MDksCi0gMHg3MiwgMHg2NSwgMHg2MSwgMHg2NCwgMHgyOCwgMHg2NiwgMHg3NCwgMHg2MSwgMHg2MiwgMHg2YywgMHg2NSwgMHg1YiwgMHg2OSwgMHg1ZCwgMHgyZSwgMHg2NiwKLSAweDY0LCAweDJjLCAweDIwLCAweDYyLCAweDc1LCAweDY2LCAweDJjLCAweDIwLCAweDczLCAweDY5LCAweDdhLCAweDY1LCAweDI5LCAweDNiLCAweDBhLCAweDdkLAotIDB4MGEsIDB4MGEsIDB4NzYsIDB4NmYsIDB4NjksIDB4NjQsIDB4MjAsIDB4NjQsIDB4NmYsIDB4NWYsIDB4NjMsIDB4NmMsIDB4NmYsIDB4NzMsIDB4NjUsIDB4MjgsCi0gMHg2OSwgMHg2ZSwgMHg3NCwgMHgyMCwgMHg2OCwgMHg2MSwgMHg2ZSwgMHg2NCwgMHg2YywgMHg2NSwgMHgyOSwgMHgwYSwgMHg3YiwgMHgwYSwgMHgwOSwgMHg2OSwKLSAweDZlLCAweDc0LCAweDIwLCAweDY5LCAweDNiLCAweDBhLCAweDA5LCAweDY2LCAweDZmLCAweDcyLCAweDIwLCAweDI4LCAweDY5LCAweDNkLCAweDMwLCAweDNiLAotIDB4NjksIDB4M2MsIDB4NGQsIDB4NDEsIDB4NTgsIDB4NWYsIDB4NDYsIDB4NDksIDB4NGMsIDB4NDUsIDB4NTMsIDB4M2IsIDB4NjksIDB4MmIsIDB4MmIsIDB4MjksCi0gMHgyMCwgMHg3YiwgMHgwYSwgMHgwOSwgMHgwOSwgMHg2OSwgMHg2NiwgMHgyMCwgMHgyOCwgMHg2NiwgMHg3NCwgMHg2MSwgMHg2MiwgMHg2YywgMHg2NSwgMHg1YiwKLSAweDY5LCAweDVkLCAweDJlLCAweDY4LCAweDYxLCAweDZlLCAweDY0LCAweDZjLCAweDY1LCAweDIwLCAweDNkLCAweDNkLCAweDIwLCAweDY4LCAweDYxLCAweDZlLAotIDB4NjQsIDB4NmMsIDB4NjUsIDB4MjksIDB4MjAsIDB4NjIsIDB4NzIsIDB4NjUsIDB4NjEsIDB4NmIsIDB4M2IsIDB4MGEsIDB4MDksIDB4N2QsIDB4MGEsIDB4MDksCi0gMHg2OSwgMHg2NiwgMHgyMCwgMHgyOCwgMHg2OSwgMHgyMCwgMHgzZCwgMHgzZCwgMHgyMCwgMHg0ZCwgMHg0MSwgMHg1OCwgMHg1ZiwgMHg0NiwgMHg0OSwgMHg0YywKLSAweDQ1LCAweDUzLCAweDI5LCAweDIwLCAweDdiLCAweDBhLCAweDA5LCAweDA5LCAweDcwLCAweDcyLCAweDY5LCAweDZlLCAweDc0LCAweDY2LCAweDI4LCAweDIyLAotIDB4MjgsIDB4MjUsIDB4NjQsIDB4MjksIDB4MjAsIDB4NjQsIDB4NmYsIDB4NWYsIDB4NjMsIDB4NmMsIDB4NmYsIDB4NzMsIDB4NjUsIDB4M2EsIDB4MjAsIDB4NjgsCi0gMHg2MSwgMHg2ZSwgMHg2NCwgMHg2YywgMHg2NSwgMHgyMCwgMHgyNSwgMHg2NCwgMHgyMCwgMHg3NywgMHg2MSwgMHg3MywgMHgyMCwgMHg2ZSwgMHg2ZiwgMHg3NCwKLSAweDIwLCAweDZmLCAweDcwLCAweDY1LCAweDZlLCAweDVjLCAweDZlLCAweDIyLCAweDJjLCAweDIwLCAweDBhLCAweDA5LCAweDA5LCAweDIwLCAweDIwLCAweDIwLAotIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4NmMsIDB4NjksIDB4NmUsIDB4NjUsIDB4NWYsIDB4NjMsIDB4NmYsIDB4NzUsIDB4NmUsIDB4NzQsIDB4MmMsIDB4MjAsCi0gMHg2OCwgMHg2MSwgMHg2ZSwgMHg2NCwgMHg2YywgMHg2NSwgMHgyOSwgMHgzYiwgMHgwYSwgMHgwOSwgMHgwOSwgMHg3MiwgMHg2NSwgMHg3NCwgMHg3NSwgMHg3MiwKLSAweDZlLCAweDNiLCAweDBhLCAweDA5LCAweDdkLCAweDBhLCAweDA5LCAweDYzLCAweDZjLCAweDZmLCAweDczLCAweDY1LCAweDI4LCAweDY2LCAweDc0LCAweDYxLAotIDB4NjIsIDB4NmMsIDB4NjUsIDB4NWIsIDB4NjksIDB4NWQsIDB4MmUsIDB4NjYsIDB4NjQsIDB4MjksIDB4M2IsIDB4MGEsIDB4MDksIDB4NjYsIDB4NzQsIDB4NjEsCi0gMHg2MiwgMHg2YywgMHg2NSwgMHg1YiwgMHg2OSwgMHg1ZCwgMHgyZSwgMHg2OCwgMHg2MSwgMHg2ZSwgMHg2NCwgMHg2YywgMHg2NSwgMHgyMCwgMHgzZCwgMHgyMCwKLSAweDMwLCAweDNiLCAweDBhLCAweDdkLCAweDBhLCAweDBhLCAweDc2LCAweDZmLCAweDY5LCAweDY0LCAweDIwLCAweDY0LCAweDZmLCAweDVmLCAweDZkLCAweDZiLAotIDB4NjQsIDB4NjksIDB4NzIsIDB4MjgsIDB4NjMsIDB4NjgsIDB4NjEsIDB4NzIsIDB4MjAsIDB4MmEsIDB4NjYsIDB4NmUsIDB4NjEsIDB4NmQsIDB4NjUsIDB4MjksCi0gMHgwYSwgMHg3YiwgMHgwYSwgMHgwOSwgMHg3MywgMHg3NCwgMHg3MiwgMHg3NSwgMHg3MCwgMHg3MCwgMHg2NSwgMHg3MiwgMHgyOCwgMHg2NiwgMHg2ZSwgMHg2MSwKLSAweDZkLCAweDY1LCAweDI5LCAweDNiLCAweDBhLCAweDBhLCAweDA5LCAweDY5LCAweDY2LCAweDIwLCAweDI4LCAweDZkLCAweDZiLCAweDY0LCAweDY5LCAweDcyLAotIDB4MjgsIDB4NjYsIDB4NmUsIDB4NjEsIDB4NmQsIDB4NjUsIDB4MmMsIDB4MjAsIDB4MzAsIDB4MzcsIDB4MzAsIDB4MzAsIDB4MjksIDB4MjAsIDB4MjEsIDB4M2QsCi0gMHgyMCwgMHgzMCwgMHgyOSwgMHgyMCwgMHg3YiwgMHgwYSwgMHgyMywgMHg2OSwgMHg2NiwgMHgyMCwgMHg0NCwgMHg0NSwgMHg0MiwgMHg1NSwgMHg0NywgMHgwYSwKLSAweDA5LCAweDA5LCAweDcwLCAweDcyLCAweDY5LCAweDZlLCAweDc0LCAweDY2LCAweDI4LCAweDIyLCAweDZkLCAweDZiLCAweDY0LCAweDY5LCAweDcyLCAweDIwLAotIDB4MjUsIDB4NzMsIDB4MjAsIDB4NjYsIDB4NjEsIDB4NjksIDB4NmMsIDB4NjUsIDB4NjQsIDB4MjAsIDB4MjgsIDB4MjUsIDB4NzMsIDB4MjksIDB4NWMsIDB4NmUsCi0gMHgyMiwgMHgyYywgMHgyMCwgMHgwYSwgMHgwOSwgMHgwOSwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHg2NiwgMHg2ZSwgMHg2MSwKLSAweDZkLCAweDY1LCAweDJjLCAweDIwLCAweDczLCAweDc0LCAweDcyLCAweDY1LCAweDcyLCAweDcyLCAweDZmLCAweDcyLCAweDI4LCAweDY1LCAweDcyLCAweDcyLAotIDB4NmUsIDB4NmYsIDB4MjksIDB4MjksIDB4M2IsIDB4MGEsIDB4MjMsIDB4NjUsIDB4NmUsIDB4NjQsIDB4NjksIDB4NjYsIDB4MGEsIDB4MDksIDB4N2QsIDB4MGEsCi0gMHg3ZCwgMHgwYSwgMHgwYSwgMHg3NiwgMHg2ZiwgMHg2OSwgMHg2NCwgMHgyMCwgMHg2NCwgMHg2ZiwgMHg1ZiwgMHg3MiwgMHg2ZCwgMHg2NCwgMHg2OSwgMHg3MiwKLSAweDI4LCAweDYzLCAweDY4LCAweDYxLCAweDcyLCAweDIwLCAweDJhLCAweDY2LCAweDZlLCAweDYxLCAweDZkLCAweDY1LCAweDI5LCAweDBhLCAweDdiLCAweDBhLAotIDB4MDksIDB4NzMsIDB4NzQsIDB4NzIsIDB4NzUsIDB4NzAsIDB4NzAsIDB4NjUsIDB4NzIsIDB4MjgsIDB4NjYsIDB4NmUsIDB4NjEsIDB4NmQsIDB4NjUsIDB4MjksCi0gMHgzYiwgMHgwYSwgMHgwYSwgMHgwOSwgMHg2OSwgMHg2NiwgMHgyMCwgMHgyOCwgMHg3MiwgMHg2ZCwgMHg2NCwgMHg2OSwgMHg3MiwgMHgyOCwgMHg2NiwgMHg2ZSwKLSAweDYxLCAweDZkLCAweDY1LCAweDI5LCAweDIwLCAweDIxLCAweDNkLCAweDIwLCAweDMwLCAweDI5LCAweDIwLCAweDdiLCAweDBhLCAweDA5LCAweDA5LCAweDcwLAotIDB4NzIsIDB4NjksIDB4NmUsIDB4NzQsIDB4NjYsIDB4MjgsIDB4MjIsIDB4NzIsIDB4NmQsIDB4NjQsIDB4NjksIDB4NzIsIDB4MjAsIDB4MjUsIDB4NzMsIDB4MjAsCi0gMHg2NiwgMHg2MSwgMHg2OSwgMHg2YywgMHg2NSwgMHg2NCwgMHgyMCwgMHgyOCwgMHgyNSwgMHg3MywgMHgyOSwgMHg1YywgMHg2ZSwgMHgyMiwgMHgyYywgMHgyMCwKLSAweDBhLCAweDA5LCAweDA5LCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDY2LCAweDZlLCAweDYxLCAweDZkLCAweDY1LCAweDJjLAotIDB4MjAsIDB4NzMsIDB4NzQsIDB4NzIsIDB4NjUsIDB4NzIsIDB4NzIsIDB4NmYsIDB4NzIsIDB4MjgsIDB4NjUsIDB4NzIsIDB4NzIsIDB4NmUsIDB4NmYsIDB4MjksCi0gMHgyOSwgMHgzYiwgMHgwYSwgMHgwOSwgMHg3ZCwgMHgwYSwgMHg3ZCwgMHgwYSwgMHgwYSwgMHg3NiwgMHg2ZiwgMHg2OSwgMHg2NCwgMHgyMCwgMHg2NCwgMHg2ZiwKLSAweDVmLCAweDcyLCAweDY1LCAweDZlLCAweDYxLCAweDZkLCAweDY1LCAweDI4LCAweDYzLCAweDY4LCAweDYxLCAweDcyLCAweDIwLCAweDJhLCAweDZmLCAweDZjLAotIDB4NjQsIDB4MmMsIDB4MjAsIDB4NjMsIDB4NjgsIDB4NjEsIDB4NzIsIDB4MjAsIDB4MmEsIDB4NmUsIDB4NjUsIDB4NzcsIDB4MjksIDB4MGEsIDB4N2IsIDB4MGEsCi0gMHgwOSwgMHg3MywgMHg3NCwgMHg3MiwgMHg3NSwgMHg3MCwgMHg3MCwgMHg2NSwgMHg3MiwgMHgyOCwgMHg2ZiwgMHg2YywgMHg2NCwgMHgyOSwgMHgzYiwgMHgwYSwKLSAweDA5LCAweDczLCAweDc0LCAweDcyLCAweDc1LCAweDcwLCAweDcwLCAweDY1LCAweDcyLCAweDI4LCAweDZlLCAweDY1LCAweDc3LCAweDI5LCAweDNiLCAweDBhLAotIDB4MGEsIDB4MDksIDB4NjksIDB4NjYsIDB4MjAsIDB4MjgsIDB4NzIsIDB4NjUsIDB4NmUsIDB4NjEsIDB4NmQsIDB4NjUsIDB4MjgsIDB4NmYsIDB4NmMsIDB4NjQsCi0gMHgyYywgMHgyMCwgMHg2ZSwgMHg2NSwgMHg3NywgMHgyOSwgMHgyMCwgMHgyMSwgMHgzZCwgMHgyMCwgMHgzMCwgMHgyOSwgMHgyMCwgMHg3YiwgMHgwYSwgMHgwOSwKLSAweDA5LCAweDcwLCAweDcyLCAweDY5LCAweDZlLCAweDc0LCAweDY2LCAweDI4LCAweDIyLCAweDcyLCAweDY1LCAweDZlLCAweDYxLCAweDZkLCAweDY1LCAweDIwLAotIDB4MjUsIDB4NzMsIDB4MjAsIDB4MjUsIDB4NzMsIDB4MjAsIDB4NjYsIDB4NjEsIDB4NjksIDB4NmMsIDB4NjUsIDB4NjQsIDB4MjAsIDB4MjgsIDB4MjUsIDB4NzMsCi0gMHgyOSwgMHg1YywgMHg2ZSwgMHgyMiwgMHgyYywgMHgyMCwgMHgwYSwgMHgwOSwgMHgwOSwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwKLSAweDZmLCAweDZjLCAweDY0LCAweDJjLCAweDIwLCAweDZlLCAweDY1LCAweDc3LCAweDJjLCAweDIwLCAweDczLCAweDc0LCAweDcyLCAweDY1LCAweDcyLCAweDcyLAotIDB4NmYsIDB4NzIsIDB4MjgsIDB4NjUsIDB4NzIsIDB4NzIsIDB4NmUsIDB4NmYsIDB4MjksIDB4MjksIDB4M2IsIDB4MGEsIDB4MDksIDB4N2QsIDB4MGEsIDB4N2QsCi0gMHgwYSwgMHgwYSwgMHgwYSwgMHg3NiwgMHg2ZiwgMHg2OSwgMHg2NCwgMHgyMCwgMHg2NCwgMHg2ZiwgMHg1ZiwgMHg3MywgMHg3NCwgMHg2MSwgMHg3NCwgMHgyOCwKLSAweDYzLCAweDY4LCAweDYxLCAweDcyLCAweDIwLCAweDJhLCAweDY2LCAweDZlLCAweDYxLCAweDZkLCAweDY1LCAweDJjLCAweDIwLCAweDY5LCAweDZlLCAweDc0LAotIDB4MjAsIDB4NzMsIDB4NjksIDB4N2EsIDB4NjUsIDB4MjksIDB4MGEsIDB4N2IsIDB4MGEsIDB4MDksIDB4NzMsIDB4NzQsIDB4NzIsIDB4NzUsIDB4NjMsIDB4NzQsCi0gMHgyMCwgMHg3MywgMHg3NCwgMHg2MSwgMHg3NCwgMHgyMCwgMHg3MywgMHg3NCwgMHgzYiwgMHgwYSwgMHgwYSwgMHgwOSwgMHg3MywgMHg3NCwgMHg3MiwgMHg3NSwKLSAweDcwLCAweDcwLCAweDY1LCAweDcyLCAweDI4LCAweDY2LCAweDZlLCAweDYxLCAweDZkLCAweDY1LCAweDI5LCAweDNiLCAweDBhLCAweDBhLCAweDA5LCAweDY5LAotIDB4NjYsIDB4MjAsIDB4MjgsIDB4NzMsIDB4NzQsIDB4NjEsIDB4NzQsIDB4MjgsIDB4NjYsIDB4NmUsIDB4NjEsIDB4NmQsIDB4NjUsIDB4MmMsIDB4MjAsIDB4MjYsCi0gMHg3MywgMHg3NCwgMHgyOSwgMHgyMCwgMHgyMSwgMHgzZCwgMHgyMCwgMHgzMCwgMHgyOSwgMHgyMCwgMHg3YiwgMHgwYSwgMHgwOSwgMHgwOSwgMHg3MCwgMHg3MiwKLSAweDY5LCAweDZlLCAweDc0LCAweDY2LCAweDI4LCAweDIyLCAweDI4LCAweDI1LCAweDY0LCAweDI5LCAweDIwLCAweDY0LCAweDZmLCAweDVmLCAweDczLCAweDc0LAotIDB4NjEsIDB4NzQsIDB4M2EsIDB4MjAsIDB4MjUsIDB4NzMsIDB4MjAsIDB4NzMsIDB4NjksIDB4N2EsIDB4NjUsIDB4M2QsIDB4MjUsIDB4NjQsIDB4MjAsIDB4MjUsCi0gMHg3MywgMHg1YywgMHg2ZSwgMHgyMiwgMHgyYywgMHgyMCwgMHgwYSwgMHgwOSwgMHgwOSwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwKLSAweDZjLCAweDY5LCAweDZlLCAweDY1LCAweDVmLCAweDYzLCAweDZmLCAweDc1LCAweDZlLCAweDc0LCAweDJjLCAweDIwLCAweDY2LCAweDZlLCAweDYxLCAweDZkLAotIDB4NjUsIDB4MmMsIDB4MjAsIDB4NzMsIDB4NjksIDB4N2EsIDB4NjUsIDB4MmMsIDB4MjAsIDB4NzMsIDB4NzQsIDB4NzIsIDB4NjUsIDB4NzIsIDB4NzIsIDB4NmYsCi0gMHg3MiwgMHgyOCwgMHg2NSwgMHg3MiwgMHg3MiwgMHg2ZSwgMHg2ZiwgMHgyOSwgMHgyOSwgMHgzYiwgMHgwYSwgMHgwOSwgMHgwOSwgMHg3MiwgMHg2NSwgMHg3NCwKLSAweDc1LCAweDcyLCAweDZlLCAweDNiLCAweDBhLCAweDA5LCAweDdkLCAweDBhLCAweDA5LCAweDY5LCAweDY2LCAweDIwLCAweDI4LCAweDUzLCAweDVmLCAweDQ5LAotIDB4NTMsIDB4NDQsIDB4NDksIDB4NTIsIDB4MjgsIDB4NzMsIDB4NzQsIDB4MmUsIDB4NzMsIDB4NzQsIDB4NWYsIDB4NmQsIDB4NmYsIDB4NjQsIDB4NjUsIDB4MjksCi0gMHgyOSwgMHgyMCwgMHg3MiwgMHg2NSwgMHg3NCwgMHg3NSwgMHg3MiwgMHg2ZSwgMHgzYiwgMHgwYSwgMHgwYSwgMHgwOSwgMHg2OSwgMHg2NiwgMHgyMCwgMHgyOCwKLSAweDczLCAweDc0LCAweDJlLCAweDczLCAweDc0LCAweDVmLCAweDczLCAweDY5LCAweDdhLCAweDY1LCAweDIwLCAweDIxLCAweDNkLCAweDIwLCAweDczLCAweDY5LAotIDB4N2EsIDB4NjUsIDB4MjksIDB4MjAsIDB4N2IsIDB4MGEsIDB4MDksIDB4MDksIDB4NzAsIDB4NzIsIDB4NjksIDB4NmUsIDB4NzQsIDB4NjYsIDB4MjgsIDB4MjIsCi0gMHgyOCwgMHgyNSwgMHg2NCwgMHgyOSwgMHgyMCwgMHg2NCwgMHg2ZiwgMHg1ZiwgMHg3MywgMHg3NCwgMHg2MSwgMHg3NCwgMHgzYSwgMHgyMCwgMHgyNSwgMHg3MywKLSAweDIwLCAweDc3LCAweDcyLCAweDZmLCAweDZlLCAweDY3LCAweDIwLCAweDczLCAweDY5LCAweDdhLCAweDY1LCAweDIwLCAweDI1LCAweDY0LCAweDIwLCAweDI1LAotIDB4NjQsIDB4NWMsIDB4NmUsIDB4MjIsIDB4MmMsIDB4MjAsIDB4MGEsIDB4MDksIDB4MDksIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsCi0gMHg2YywgMHg2OSwgMHg2ZSwgMHg2NSwgMHg1ZiwgMHg2MywgMHg2ZiwgMHg3NSwgMHg2ZSwgMHg3NCwgMHgyYywgMHgyMCwgMHg2NiwgMHg2ZSwgMHg2MSwgMHg2ZCwKLSAweDY1LCAweDJjLCAweDIwLCAweDI4LCAweDY5LCAweDZlLCAweDc0LCAweDI5LCAweDczLCAweDc0LCAweDJlLCAweDczLCAweDc0LCAweDVmLCAweDczLCAweDY5LAotIDB4N2EsIDB4NjUsIDB4MmMsIDB4MjAsIDB4NzMsIDB4NjksIDB4N2EsIDB4NjUsIDB4MjksIDB4M2IsIDB4MGEsIDB4MDksIDB4N2QsIDB4MGEsIDB4N2QsIDB4MGEsCi0gMHgwYSwgMHg3NiwgMHg2ZiwgMHg2OSwgMHg2NCwgMHgyMCwgMHg2NCwgMHg2ZiwgMHg1ZiwgMHg2MywgMHg3MiwgMHg2NSwgMHg2MSwgMHg3NCwgMHg2NSwgMHgyOCwKLSAweDYzLCAweDY4LCAweDYxLCAweDcyLCAweDIwLCAweDJhLCAweDY2LCAweDZlLCAweDYxLCAweDZkLCAweDY1LCAweDJjLCAweDIwLCAweDY5LCAweDZlLCAweDc0LAotIDB4MjAsIDB4NzMsIDB4NjksIDB4N2EsIDB4NjUsIDB4MjksIDB4MGEsIDB4N2IsIDB4MGEsIDB4MDksIDB4NjQsIDB4NmYsIDB4NWYsIDB4NmYsIDB4NzAsIDB4NjUsCi0gMHg2ZSwgMHgyOCwgMHg2NiwgMHg2ZSwgMHg2MSwgMHg2ZCwgMHg2NSwgMHgyYywgMHgyMCwgMHgzNSwgMHgzMCwgMHgzMCwgMHgzMCwgMHgyYywgMHgyMCwgMHg3MywKLSAweDY5LCAweDdhLCAweDY1LCAweDI5LCAweDNiLCAweDBhLCAweDA5LCAweDY0LCAweDZmLCAweDVmLCAweDYzLCAweDZjLCAweDZmLCAweDczLCAweDY1LCAweDI4LAotIDB4MzUsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MjksIDB4M2IsIDB4MGEsIDB4N2QsIDB4MGEKLX07Ci0jZW5kaWYKLXN0YXRpYyB1bnNpZ25lZCBjaGFyIGNvbXByYnVmW1RFU1REQVRBX0xFTl07Ci1zdGF0aWMgdW5zaWduZWQgY2hhciBkZWNvbXByYnVmW1RFU1REQVRBX0xFTl07Ci0KLWludCBqZmZzMl9kZWNvbXByZXNzKHVuc2lnbmVkIGNoYXIgY29tcHJ0eXBlLCB1bnNpZ25lZCBjaGFyICpjZGF0YV9pbiwKLQkJICAgICB1bnNpZ25lZCBjaGFyICpkYXRhX291dCwgdWludDMyX3QgY2RhdGFsZW4sIHVpbnQzMl90IGRhdGFsZW4pOwotdW5zaWduZWQgY2hhciBqZmZzMl9jb21wcmVzcyh1bnNpZ25lZCBjaGFyICpkYXRhX2luLCB1bnNpZ25lZCBjaGFyICpjcGFnZV9vdXQsCi0JCQkgICAgIHVpbnQzMl90ICpkYXRhbGVuLCB1aW50MzJfdCAqY2RhdGFsZW4pOwotCi1pbnQgaW5pdF9tb2R1bGUodm9pZCApIHsKLQl1bnNpZ25lZCBjaGFyIGNvbXBydHlwZTsKLQl1aW50MzJfdCBjLCBkOwotCWludCByZXQ7Ci0KLQlwcmludGsoIk9yaWdpbmFsIGRhdGE6ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsCi0JICAgICAgIHRlc3RkYXRhWzBdLHRlc3RkYXRhWzFdLHRlc3RkYXRhWzJdLHRlc3RkYXRhWzNdLAotCSAgICAgICB0ZXN0ZGF0YVs0XSx0ZXN0ZGF0YVs1XSx0ZXN0ZGF0YVs2XSx0ZXN0ZGF0YVs3XSwKLQkgICAgICAgdGVzdGRhdGFbOF0sdGVzdGRhdGFbOV0sdGVzdGRhdGFbMTBdLHRlc3RkYXRhWzExXSwKLQkgICAgICAgdGVzdGRhdGFbMTJdLHRlc3RkYXRhWzEzXSx0ZXN0ZGF0YVsxNF0sdGVzdGRhdGFbMTVdKTsKLQlkID0gVEVTVERBVEFfTEVOOwotCWMgPSBURVNUREFUQV9MRU47Ci0JY29tcHJ0eXBlID0gamZmczJfY29tcHJlc3ModGVzdGRhdGEsIGNvbXByYnVmLCAmZCwgJmMpOwotCi0JcHJpbnRrKCJqZmZzMl9jb21wcmVzcyB1c2VkIGNvbXByZXNzaW9uIHR5cGUgJWQuIENvbXByZXNzZWQgc2l6ZSAlZCwgdW5jb21wcmVzc2VkIHNpemUgJWRcbiIsCi0JICAgICAgIGNvbXBydHlwZSwgYywgZCk7Ci0JcHJpbnRrKCJDb21wcmVzc2VkIGRhdGE6ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsCi0JICAgICAgIGNvbXByYnVmWzBdLGNvbXByYnVmWzFdLGNvbXByYnVmWzJdLGNvbXByYnVmWzNdLAotCSAgICAgICBjb21wcmJ1Zls0XSxjb21wcmJ1Zls1XSxjb21wcmJ1Zls2XSxjb21wcmJ1Zls3XSwKLQkgICAgICAgY29tcHJidWZbOF0sY29tcHJidWZbOV0sY29tcHJidWZbMTBdLGNvbXByYnVmWzExXSwKLQkgICAgICAgY29tcHJidWZbMTJdLGNvbXByYnVmWzEzXSxjb21wcmJ1ZlsxNF0sY29tcHJidWZbMTVdKTsKLQotCXJldCA9IGpmZnMyX2RlY29tcHJlc3MoY29tcHJ0eXBlLCBjb21wcmJ1ZiwgZGVjb21wcmJ1ZiwgYywgZCk7Ci0JcHJpbnRrKCJqZmZzMl9kZWNvbXByZXNzIHJldHVybmVkICVkXG4iLCByZXQpOwotCXByaW50aygiRGVjb21wcmVzc2VkIGRhdGE6ICAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAotCSAgICAgICBkZWNvbXByYnVmWzBdLGRlY29tcHJidWZbMV0sZGVjb21wcmJ1ZlsyXSxkZWNvbXByYnVmWzNdLAotCSAgICAgICBkZWNvbXByYnVmWzRdLGRlY29tcHJidWZbNV0sZGVjb21wcmJ1Zls2XSxkZWNvbXByYnVmWzddLAotCSAgICAgICBkZWNvbXByYnVmWzhdLGRlY29tcHJidWZbOV0sZGVjb21wcmJ1ZlsxMF0sZGVjb21wcmJ1ZlsxMV0sCi0JICAgICAgIGRlY29tcHJidWZbMTJdLGRlY29tcHJidWZbMTNdLGRlY29tcHJidWZbMTRdLGRlY29tcHJidWZbMTVdKTsKLQlpZiAobWVtY21wKGRlY29tcHJidWYsIHRlc3RkYXRhLCBkKSkKLQkJcHJpbnRrKCJDb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbiBjb3JydXB0ZWQgZGF0YVxuIik7Ci0JZWxzZQotCQlwcmludGsoIkNvbXByZXNzaW9uIGdvb2QgZm9yICVkIGJ5dGVzXG4iLCBkKTsKLQlyZXR1cm4gMTsKLX0KZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL2RlYnVnLmMgYi9mcy9qZmZzMi9kZWJ1Zy5jCmluZGV4IDQxODllNGEuLjNhMzJjNjQgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL2RlYnVnLmMKKysrIGIvZnMvamZmczIvZGVidWcuYwpAQCAtMSwxNSArMSwxNCBAQAogLyoKICAqIEpGRlMyIC0tIEpvdXJuYWxsaW5nIEZsYXNoIEZpbGUgU3lzdGVtLCBWZXJzaW9uIDIuCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDMgUmVkIEhhdCwgSW5jLgorICogQ29weXJpZ2h0IMKpIDIwMDEtMjAwNyBSZWQgSGF0LCBJbmMuCiAgKgogICogQ3JlYXRlZCBieSBEYXZpZCBXb29kaG91c2UgPGR3bXcyQGluZnJhZGVhZC5vcmc+CiAgKgogICogRm9yIGxpY2Vuc2luZyBpbmZvcm1hdGlvbiwgc2VlIHRoZSBmaWxlICdMSUNFTkNFJyBpbiB0aGlzIGRpcmVjdG9yeS4KICAqCi0gKiAkSWQ6IGRlYnVnLmMsdiAxLjEyIDIwMDUvMTEvMDcgMTE6MTQ6MzkgZ2xlaXhuZXIgRXhwICQKLSAqCiAgKi8KKwogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgpkaWZmIC0tZ2l0IGEvZnMvamZmczIvZGVidWcuaCBiL2ZzL2pmZnMyL2RlYnVnLmgKaW5kZXggZjg5Yzg1ZC4uMmE0OWYyYyAxMDA2NDQKLS0tIGEvZnMvamZmczIvZGVidWcuaAorKysgYi9mcy9qZmZzMi9kZWJ1Zy5oCkBAIC0xLDE1ICsxLDE0IEBACiAvKgogICogSkZGUzIgLS0gSm91cm5hbGxpbmcgRmxhc2ggRmlsZSBTeXN0ZW0sIFZlcnNpb24gMi4KICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMyBSZWQgSGF0LCBJbmMuCisgKiBDb3B5cmlnaHQgwqkgMjAwMS0yMDA3IFJlZCBIYXQsIEluYy4KICAqCiAgKiBDcmVhdGVkIGJ5IERhdmlkIFdvb2Rob3VzZSA8ZHdtdzJAaW5mcmFkZWFkLm9yZz4KICAqCiAgKiBGb3IgbGljZW5zaW5nIGluZm9ybWF0aW9uLCBzZWUgdGhlIGZpbGUgJ0xJQ0VOQ0UnIGluIHRoaXMgZGlyZWN0b3J5LgogICoKLSAqICRJZDogZGVidWcuaCx2IDEuMjEgMjAwNS8xMS8wNyAxMToxNDozOSBnbGVpeG5lciBFeHAgJAotICoKICAqLworCiAjaWZuZGVmIF9KRkZTMl9ERUJVR19IXwogI2RlZmluZSBfSkZGUzJfREVCVUdfSF8KIApkaWZmIC0tZ2l0IGEvZnMvamZmczIvZGlyLmMgYi9mcy9qZmZzMi9kaXIuYwppbmRleCA5ZmEyZTI3Li5jMWRmY2EzIDEwMDY0NAotLS0gYS9mcy9qZmZzMi9kaXIuYworKysgYi9mcy9qZmZzMi9kaXIuYwpAQCAtMSwxNCArMSwxMiBAQAogLyoKICAqIEpGRlMyIC0tIEpvdXJuYWxsaW5nIEZsYXNoIEZpbGUgU3lzdGVtLCBWZXJzaW9uIDIuCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDMgUmVkIEhhdCwgSW5jLgorICogQ29weXJpZ2h0IMKpIDIwMDEtMjAwNyBSZWQgSGF0LCBJbmMuCiAgKgogICogQ3JlYXRlZCBieSBEYXZpZCBXb29kaG91c2UgPGR3bXcyQGluZnJhZGVhZC5vcmc+CiAgKgogICogRm9yIGxpY2Vuc2luZyBpbmZvcm1hdGlvbiwgc2VlIHRoZSBmaWxlICdMSUNFTkNFJyBpbiB0aGlzIGRpcmVjdG9yeS4KICAqCi0gKiAkSWQ6IGRpci5jLHYgMS45MCAyMDA1LzExLzA3IDExOjE0OjM5IGdsZWl4bmVyIEV4cCAkCi0gKgogICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL2VyYXNlLmMgYi9mcy9qZmZzMi9lcmFzZS5jCmluZGV4IGFkMDEyMTAuLjY2ZTdjMmYgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL2VyYXNlLmMKKysrIGIvZnMvamZmczIvZXJhc2UuYwpAQCAtMSwxNCArMSwxMiBAQAogLyoKICAqIEpGRlMyIC0tIEpvdXJuYWxsaW5nIEZsYXNoIEZpbGUgU3lzdGVtLCBWZXJzaW9uIDIuCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDMgUmVkIEhhdCwgSW5jLgorICogQ29weXJpZ2h0IMKpIDIwMDEtMjAwNyBSZWQgSGF0LCBJbmMuCiAgKgogICogQ3JlYXRlZCBieSBEYXZpZCBXb29kaG91c2UgPGR3bXcyQGluZnJhZGVhZC5vcmc+CiAgKgogICogRm9yIGxpY2Vuc2luZyBpbmZvcm1hdGlvbiwgc2VlIHRoZSBmaWxlICdMSUNFTkNFJyBpbiB0aGlzIGRpcmVjdG9yeS4KICAqCi0gKiAkSWQ6IGVyYXNlLmMsdiAxLjg1IDIwMDUvMDkvMjAgMTQ6NTM6MTUgZGVkZWtpbmQgRXhwICQKLSAqCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpAQCAtMzMzLDcgKzMzMSw3IEBACiAKIAkJKmJhZF9vZmZzZXQgPSBvZnM7CiAKLQkJcmV0ID0gamZmczJfZmxhc2hfcmVhZChjLCBvZnMsIHJlYWRsZW4sICZyZXRsZW4sIGVidWYpOworCQlyZXQgPSBjLT5tdGQtPnJlYWQoYy0+bXRkLCBvZnMsIHJlYWRsZW4sICZyZXRsZW4sIGVidWYpOwogCQlpZiAocmV0KSB7CiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICJSZWFkIG9mIG5ld2x5LWVyYXNlZCBibG9jayBhdCAweCUwOHggZmFpbGVkOiAlZC4gUHV0dGluZyBvbiBiYWRfbGlzdFxuIiwgb2ZzLCByZXQpOwogCQkJZ290byBmYWlsOwpkaWZmIC0tZ2l0IGEvZnMvamZmczIvZmlsZS5jIGIvZnMvamZmczIvZmlsZS5jCmluZGV4IGU4MmVlYWYuLjk5ODcxMjcgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL2ZpbGUuYworKysgYi9mcy9qZmZzMi9maWxlLmMKQEAgLTEsMTQgKzEsMTIgQEAKIC8qCiAgKiBKRkZTMiAtLSBKb3VybmFsbGluZyBGbGFzaCBGaWxlIFN5c3RlbSwgVmVyc2lvbiAyLgogICoKLSAqIENvcHlyaWdodCAoQykgMjAwMS0yMDAzIFJlZCBIYXQsIEluYy4KKyAqIENvcHlyaWdodCDCqSAyMDAxLTIwMDcgUmVkIEhhdCwgSW5jLgogICoKICAqIENyZWF0ZWQgYnkgRGF2aWQgV29vZGhvdXNlIDxkd213MkBpbmZyYWRlYWQub3JnPgogICoKICAqIEZvciBsaWNlbnNpbmcgaW5mb3JtYXRpb24sIHNlZSB0aGUgZmlsZSAnTElDRU5DRScgaW4gdGhpcyBkaXJlY3RvcnkuCiAgKgotICogJElkOiBmaWxlLmMsdiAxLjEwNCAyMDA1LzEwLzE4IDIzOjI5OjM1IHRwb3lub3IgRXhwICQKLSAqCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpkaWZmIC0tZ2l0IGEvZnMvamZmczIvZnMuYyBiL2ZzL2pmZnMyL2ZzLmMKaW5kZXggYWJiOTBjMC4uMWQzYjdhOSAxMDA2NDQKLS0tIGEvZnMvamZmczIvZnMuYworKysgYi9mcy9qZmZzMi9mcy5jCkBAIC0xLDE0ICsxLDEyIEBACiAvKgogICogSkZGUzIgLS0gSm91cm5hbGxpbmcgRmxhc2ggRmlsZSBTeXN0ZW0sIFZlcnNpb24gMi4KICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMyBSZWQgSGF0LCBJbmMuCisgKiBDb3B5cmlnaHQgwqkgMjAwMS0yMDA3IFJlZCBIYXQsIEluYy4KICAqCiAgKiBDcmVhdGVkIGJ5IERhdmlkIFdvb2Rob3VzZSA8ZHdtdzJAaW5mcmFkZWFkLm9yZz4KICAqCiAgKiBGb3IgbGljZW5zaW5nIGluZm9ybWF0aW9uLCBzZWUgdGhlIGZpbGUgJ0xJQ0VOQ0UnIGluIHRoaXMgZGlyZWN0b3J5LgogICoKLSAqICRJZDogZnMuYyx2IDEuNjYgMjAwNS8wOS8yNyAxMzoxNzoyOSBkZWRla2luZCBFeHAgJAotICoKICAqLwogCiAjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgpAQCAtNjcyLDYgKzY3MCwxMyBAQAogCQkJcmV0dXJuIHJldDsKIAl9CiAKKwkvKiBhbmQgYW4gVUJJIHZvbHVtZSAqLworCWlmIChqZmZzMl91Yml2b2woYykpIHsKKwkJcmV0ID0gamZmczJfdWJpdm9sX3NldHVwKGMpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisKIAlyZXR1cm4gcmV0OwogfQogCkBAIC02OTAsNCArNjk1LDkgQEAKIAlpZiAoamZmczJfbm9yX3didWZfZmxhc2goYykpIHsKIAkJamZmczJfbm9yX3didWZfZmxhc2hfY2xlYW51cChjKTsKIAl9CisKKwkvKiBhbmQgYW4gVUJJIHZvbHVtZSAqLworCWlmIChqZmZzMl91Yml2b2woYykpIHsKKwkJamZmczJfdWJpdm9sX2NsZWFudXAoYyk7CisJfQogfQpkaWZmIC0tZ2l0IGEvZnMvamZmczIvZ2MuYyBiL2ZzL2pmZnMyL2djLmMKaW5kZXggM2EzY2YyMi4uMmQ5OWUwNiAxMDA2NDQKLS0tIGEvZnMvamZmczIvZ2MuYworKysgYi9mcy9qZmZzMi9nYy5jCkBAIC0xLDE0ICsxLDEyIEBACiAvKgogICogSkZGUzIgLS0gSm91cm5hbGxpbmcgRmxhc2ggRmlsZSBTeXN0ZW0sIFZlcnNpb24gMi4KICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMyBSZWQgSGF0LCBJbmMuCisgKiBDb3B5cmlnaHQgwqkgMjAwMS0yMDA3IFJlZCBIYXQsIEluYy4KICAqCiAgKiBDcmVhdGVkIGJ5IERhdmlkIFdvb2Rob3VzZSA8ZHdtdzJAaW5mcmFkZWFkLm9yZz4KICAqCiAgKiBGb3IgbGljZW5zaW5nIGluZm9ybWF0aW9uLCBzZWUgdGhlIGZpbGUgJ0xJQ0VOQ0UnIGluIHRoaXMgZGlyZWN0b3J5LgogICoKLSAqICRJZDogZ2MuYyx2IDEuMTU1IDIwMDUvMTEvMDcgMTE6MTQ6MzkgZ2xlaXhuZXIgRXhwICQKLSAqCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpAQCAtMTQ0LDcgKzE0Miw4IEBACiAJCQkgICAgICAgYy0+dW5jaGVja2VkX3NpemUpOwogCQkJamZmczJfZGJnX2R1bXBfYmxvY2tfbGlzdHNfbm9sb2NrKGMpOwogCQkJc3Bpbl91bmxvY2soJmMtPmVyYXNlX2NvbXBsZXRpb25fbG9jayk7Ci0JCQlCVUcoKTsKKwkJCXVwKCZjLT5hbGxvY19zZW0pOworCQkJcmV0dXJuIC1FTk9TUEM7CiAJCX0KIAogCQlzcGluX3VubG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL2lvY3RsLmMgYi9mcy9qZmZzMi9pb2N0bC5jCmluZGV4IDY5MDk5ODMuLmY0ZDUyNWIgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL2lvY3RsLmMKKysrIGIvZnMvamZmczIvaW9jdGwuYwpAQCAtMSwxNCArMSwxMiBAQAogLyoKICAqIEpGRlMyIC0tIEpvdXJuYWxsaW5nIEZsYXNoIEZpbGUgU3lzdGVtLCBWZXJzaW9uIDIuCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDMgUmVkIEhhdCwgSW5jLgorICogQ29weXJpZ2h0IMKpIDIwMDEtMjAwNyBSZWQgSGF0LCBJbmMuCiAgKgogICogQ3JlYXRlZCBieSBEYXZpZCBXb29kaG91c2UgPGR3bXcyQGluZnJhZGVhZC5vcmc+CiAgKgogICogRm9yIGxpY2Vuc2luZyBpbmZvcm1hdGlvbiwgc2VlIHRoZSBmaWxlICdMSUNFTkNFJyBpbiB0aGlzIGRpcmVjdG9yeS4KICAqCi0gKiAkSWQ6IGlvY3RsLmMsdiAxLjEwIDIwMDUvMTEvMDcgMTE6MTQ6NDAgZ2xlaXhuZXIgRXhwICQKLSAqCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CmRpZmYgLS1naXQgYS9mcy9qZmZzMi9qZmZzMl9mc19pLmggYi9mcy9qZmZzMi9qZmZzMl9mc19pLmgKaW5kZXggM2E1NjYwNy4uMGI3OGZkYyAxMDA2NDQKLS0tIGEvZnMvamZmczIvamZmczJfZnNfaS5oCisrKyBiL2ZzL2pmZnMyL2pmZnMyX2ZzX2kuaApAQCAtMSw0ICsxLDEzIEBACi0vKiAkSWQ6IGpmZnMyX2ZzX2kuaCx2IDEuMTkgMjAwNS8xMS8wNyAxMToxNDo1MiBnbGVpeG5lciBFeHAgJCAqLworLyoKKyAqIEpGRlMyIC0tIEpvdXJuYWxsaW5nIEZsYXNoIEZpbGUgU3lzdGVtLCBWZXJzaW9uIDIuCisgKgorICogQ29weXJpZ2h0IMKpIDIwMDEtMjAwNyBSZWQgSGF0LCBJbmMuCisgKgorICogQ3JlYXRlZCBieSBEYXZpZCBXb29kaG91c2UgPGR3bXcyQGluZnJhZGVhZC5vcmc+CisgKgorICogRm9yIGxpY2Vuc2luZyBpbmZvcm1hdGlvbiwgc2VlIHRoZSBmaWxlICdMSUNFTkNFJyBpbiB0aGlzIGRpcmVjdG9yeS4KKyAqCisgKi8KIAogI2lmbmRlZiBfSkZGUzJfRlNfSQogI2RlZmluZSBfSkZGUzJfRlNfSQpkaWZmIC0tZ2l0IGEvZnMvamZmczIvamZmczJfZnNfc2IuaCBiL2ZzL2pmZnMyL2pmZnMyX2ZzX3NiLmgKaW5kZXggZWE4OGY2OS4uYjEzMjk4YSAxMDA2NDQKLS0tIGEvZnMvamZmczIvamZmczJfZnNfc2IuaAorKysgYi9mcy9qZmZzMi9qZmZzMl9mc19zYi5oCkBAIC0xLDQgKzEsMTMgQEAKLS8qICRJZDogamZmczJfZnNfc2IuaCx2IDEuNTQgMjAwNS8wOS8yMSAxMzozNzozNCBkZWRla2luZCBFeHAgJCAqLworLyoKKyAqIEpGRlMyIC0tIEpvdXJuYWxsaW5nIEZsYXNoIEZpbGUgU3lzdGVtLCBWZXJzaW9uIDIuCisgKgorICogQ29weXJpZ2h0IMKpIDIwMDEtMjAwNyBSZWQgSGF0LCBJbmMuCisgKgorICogQ3JlYXRlZCBieSBEYXZpZCBXb29kaG91c2UgPGR3bXcyQGluZnJhZGVhZC5vcmc+CisgKgorICogRm9yIGxpY2Vuc2luZyBpbmZvcm1hdGlvbiwgc2VlIHRoZSBmaWxlICdMSUNFTkNFJyBpbiB0aGlzIGRpcmVjdG9yeS4KKyAqCisgKi8KIAogI2lmbmRlZiBfSkZGUzJfRlNfU0IKICNkZWZpbmUgX0pGRlMyX0ZTX1NCCmRpZmYgLS1naXQgYS9mcy9qZmZzMi9tYWxsb2MuYyBiL2ZzL2pmZnMyL21hbGxvYy5jCmluZGV4IDgzZjk4ODEuLjM1YzFhNWUgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL21hbGxvYy5jCisrKyBiL2ZzL2pmZnMyL21hbGxvYy5jCkBAIC0xLDE0ICsxLDEyIEBACiAvKgogICogSkZGUzIgLS0gSm91cm5hbGxpbmcgRmxhc2ggRmlsZSBTeXN0ZW0sIFZlcnNpb24gMi4KICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMyBSZWQgSGF0LCBJbmMuCisgKiBDb3B5cmlnaHQgwqkgMjAwMS0yMDA3IFJlZCBIYXQsIEluYy4KICAqCiAgKiBDcmVhdGVkIGJ5IERhdmlkIFdvb2Rob3VzZSA8ZHdtdzJAaW5mcmFkZWFkLm9yZz4KICAqCiAgKiBGb3IgbGljZW5zaW5nIGluZm9ybWF0aW9uLCBzZWUgdGhlIGZpbGUgJ0xJQ0VOQ0UnIGluIHRoaXMgZGlyZWN0b3J5LgogICoKLSAqICRJZDogbWFsbG9jLmMsdiAxLjMxIDIwMDUvMTEvMDcgMTE6MTQ6NDAgZ2xlaXhuZXIgRXhwICQKLSAqCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpkaWZmIC0tZ2l0IGEvZnMvamZmczIvbm9kZWxpc3QuYyBiL2ZzL2pmZnMyL25vZGVsaXN0LmMKaW5kZXggNWE2YjRkNi4uNGJmODYwOCAxMDA2NDQKLS0tIGEvZnMvamZmczIvbm9kZWxpc3QuYworKysgYi9mcy9qZmZzMi9ub2RlbGlzdC5jCkBAIC0xLDE0ICsxLDEyIEBACiAvKgogICogSkZGUzIgLS0gSm91cm5hbGxpbmcgRmxhc2ggRmlsZSBTeXN0ZW0sIFZlcnNpb24gMi4KICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMyBSZWQgSGF0LCBJbmMuCisgKiBDb3B5cmlnaHQgwqkgMjAwMS0yMDA3IFJlZCBIYXQsIEluYy4KICAqCiAgKiBDcmVhdGVkIGJ5IERhdmlkIFdvb2Rob3VzZSA8ZHdtdzJAaW5mcmFkZWFkLm9yZz4KICAqCiAgKiBGb3IgbGljZW5zaW5nIGluZm9ybWF0aW9uLCBzZWUgdGhlIGZpbGUgJ0xJQ0VOQ0UnIGluIHRoaXMgZGlyZWN0b3J5LgogICoKLSAqICRJZDogbm9kZWxpc3QuYyx2IDEuMTE1IDIwMDUvMTEvMDcgMTE6MTQ6NDAgZ2xlaXhuZXIgRXhwICQKLSAqCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpAQCAtNTQsNyArNTIsNyBAQAogCSpwcmV2ID0gbmV3OwogfQogCi12b2lkIGpmZnMyX3RydW5jYXRlX2ZyYWd0cmVlKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgcmJfcm9vdCAqbGlzdCwgdWludDMyX3Qgc2l6ZSkKK3VpbnQzMl90IGpmZnMyX3RydW5jYXRlX2ZyYWd0cmVlKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgcmJfcm9vdCAqbGlzdCwgdWludDMyX3Qgc2l6ZSkKIHsKIAlzdHJ1Y3QgamZmczJfbm9kZV9mcmFnICpmcmFnID0gamZmczJfbG9va3VwX25vZGVfZnJhZyhsaXN0LCBzaXplKTsKIApAQCAtNzYsMTggKzc0LDI0IEBACiAJfQogCiAJaWYgKHNpemUgPT0gMCkKLQkJcmV0dXJuOworCQlyZXR1cm4gMDsKIAotCS8qCi0JICogSWYgdGhlIGxhc3QgZnJhZ21lbnQgc3RhcnRzIGF0IHRoZSBSQU0gcGFnZSBib3VuZGFyeSwgaXQgaXMKLQkgKiBSRUZfUFJJU1RJTkUgaXJyZXNwZWN0aXZlIG9mIGl0cyBzaXplLgotCSAqLwogCWZyYWcgPSBmcmFnX2xhc3QobGlzdCk7CisKKwkvKiBTYW5pdHkgY2hlY2sgZm9yIHRydW5jYXRpb24gdG8gbG9uZ2VyIHRoYW4gd2Ugc3RhcnRlZCB3aXRoLi4uICovCisJaWYgKCFmcmFnKQorCQlyZXR1cm4gMDsKKwlpZiAoZnJhZy0+b2ZzICsgZnJhZy0+c2l6ZSA8IHNpemUpCisJCXJldHVybiBmcmFnLT5vZnMgKyBmcmFnLT5zaXplOworCisJLyogSWYgdGhlIGxhc3QgZnJhZ21lbnQgc3RhcnRzIGF0IHRoZSBSQU0gcGFnZSBib3VuZGFyeSwgaXQgaXMKKwkgKiBSRUZfUFJJU1RJTkUgaXJyZXNwZWN0aXZlIG9mIGl0cyBzaXplLiAqLwogCWlmIChmcmFnLT5ub2RlICYmIChmcmFnLT5vZnMgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSkpID09IDApIHsKIAkJZGJnX2ZyYWd0cmVlMigibWFya2luZyB0aGUgbGFzdCBmcmFnbWVudCAweCUwOHgtMHglMDh4IFJFRl9QUklTVElORS5cbiIsCiAJCQlmcmFnLT5vZnMsIGZyYWctPm9mcyArIGZyYWctPnNpemUpOwogCQlmcmFnLT5ub2RlLT5yYXctPmZsYXNoX29mZnNldCA9IHJlZl9vZmZzZXQoZnJhZy0+bm9kZS0+cmF3KSB8IFJFRl9QUklTVElORTsKIAl9CisJcmV0dXJuIHNpemU7CiB9CiAKIHN0YXRpYyB2b2lkIGpmZnMyX29ic29sZXRlX25vZGVfZnJhZyhzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywKQEAgLTM5Nyw0NjYgKzQwMSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qCi0gKiBDaGVjayB0aGUgZGF0YSBDUkMgb2YgdGhlIG5vZGUuCi0gKgotICogUmV0dXJuczogMCBpZiB0aGUgZGF0YSBDUkMgaXMgY29ycmVjdDsKLSAqIAkgICAgMSAtIGlmIGluY29ycmVjdDsKLSAqCSAgICBlcnJvciBjb2RlIGlmIGFuIGVycm9yIG9jY3VyZWQuCi0gKi8KLXN0YXRpYyBpbnQgY2hlY2tfbm9kZV9kYXRhKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfdG1wX2Rub2RlX2luZm8gKnRuKQotewotCXN0cnVjdCBqZmZzMl9yYXdfbm9kZV9yZWYgKnJlZiA9IHRuLT5mbi0+cmF3OwotCWludCBlcnIgPSAwLCBwb2ludGVkID0gMDsKLQlzdHJ1Y3QgamZmczJfZXJhc2VibG9jayAqamViOwotCXVuc2lnbmVkIGNoYXIgKmJ1ZmZlcjsKLQl1aW50MzJfdCBjcmMsIG9mcywgbGVuOwotCXNpemVfdCByZXRsZW47Ci0KLQlCVUdfT04odG4tPmNzaXplID09IDApOwotCi0JaWYgKCFqZmZzMl9pc193cml0ZWJ1ZmZlcmVkKGMpKQotCQlnb3RvIGFkal9hY2M7Ci0KLQkvKiBDYWxjdWxhdGUgaG93IG1hbnkgYnl0ZXMgd2VyZSBhbHJlYWR5IGNoZWNrZWQgKi8KLQlvZnMgPSByZWZfb2Zmc2V0KHJlZikgKyBzaXplb2Yoc3RydWN0IGpmZnMyX3Jhd19pbm9kZSk7Ci0JbGVuID0gb2ZzICUgYy0+d2J1Zl9wYWdlc2l6ZTsKLQlpZiAobGlrZWx5KGxlbikpCi0JCWxlbiA9IGMtPndidWZfcGFnZXNpemUgLSBsZW47Ci0KLQlpZiAobGVuID49IHRuLT5jc2l6ZSkgewotCQlkYmdfcmVhZGlub2RlKCJubyBuZWVkIHRvIGNoZWNrIG5vZGUgYXQgJSMwOHgsIGRhdGEgbGVuZ3RoICV1LCBkYXRhIHN0YXJ0cyBhdCAlIzA4eCAtIGl0IGhhcyBhbHJlYWR5IGJlZW4gY2hlY2tlZC5cbiIsCi0JCQlyZWZfb2Zmc2V0KHJlZiksIHRuLT5jc2l6ZSwgb2ZzKTsKLQkJZ290byBhZGpfYWNjOwotCX0KLQotCW9mcyArPSBsZW47Ci0JbGVuID0gdG4tPmNzaXplIC0gbGVuOwotCi0JZGJnX3JlYWRpbm9kZSgiY2hlY2sgbm9kZSBhdCAlIzA4eCwgZGF0YSBsZW5ndGggJXUsIHBhcnRpYWwgQ1JDICUjMDh4LCBjb3JyZWN0IENSQyAlIzA4eCwgZGF0YSBzdGFydHMgYXQgJSMwOHgsIHN0YXJ0IGNoZWNraW5nIGZyb20gJSMwOHggLSAldSBieXRlcy5cbiIsCi0JCXJlZl9vZmZzZXQocmVmKSwgdG4tPmNzaXplLCB0bi0+cGFydGlhbF9jcmMsIHRuLT5kYXRhX2NyYywgb2ZzIC0gbGVuLCBvZnMsIGxlbik7Ci0KLSNpZm5kZWYgX19FQ09TCi0JLyogVE9ETzogaW5zdGVhZCwgaW5jYXBzdWxhdGUgcG9pbnQoKSBzdHVmZiB0byBqZmZzMl9mbGFzaF9yZWFkKCksCi0JICogYWRkaW5nIGFuZCBqZmZzMl9mbGFzaF9yZWFkX2VuZCgpIGludGVyZmFjZS4gKi8KLQlpZiAoYy0+bXRkLT5wb2ludCkgewotCQllcnIgPSBjLT5tdGQtPnBvaW50KGMtPm10ZCwgb2ZzLCBsZW4sICZyZXRsZW4sICZidWZmZXIpOwotCQlpZiAoIWVyciAmJiByZXRsZW4gPCB0bi0+Y3NpemUpIHsKLQkJCUpGRlMyX1dBUk5JTkcoIk1URCBwb2ludCByZXR1cm5lZCBsZW4gdG9vIHNob3J0OiAlenUgaW5zdGVhZCBvZiAldS5cbiIsIHJldGxlbiwgdG4tPmNzaXplKTsKLQkJCWMtPm10ZC0+dW5wb2ludChjLT5tdGQsIGJ1ZmZlciwgb2ZzLCBsZW4pOwotCQl9IGVsc2UgaWYgKGVycikKLQkJCUpGRlMyX1dBUk5JTkcoIk1URCBwb2ludCBmYWlsZWQ6IGVycm9yIGNvZGUgJWQuXG4iLCBlcnIpOwotCQllbHNlCi0JCQlwb2ludGVkID0gMTsgLyogc3VjY2VmdWxseSBwb2ludGVkIHRvIGRldmljZSAqLwotCX0KLSNlbmRpZgotCi0JaWYgKCFwb2ludGVkKSB7Ci0JCWJ1ZmZlciA9IGttYWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKLQkJaWYgKHVubGlrZWx5KCFidWZmZXIpKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0KLQkJLyogVE9ETzogdGhpcyBpcyB2ZXJ5IGZyZXF1ZW50IHBhdHRlcm4sIG1ha2UgaXQgYSBzZXBhcmF0ZQotCQkgKiByb3V0aW5lICovCi0JCWVyciA9IGpmZnMyX2ZsYXNoX3JlYWQoYywgb2ZzLCBsZW4sICZyZXRsZW4sIGJ1ZmZlcik7Ci0JCWlmIChlcnIpIHsKLQkJCUpGRlMyX0VSUk9SKCJjYW4gbm90IHJlYWQgJWQgYnl0ZXMgZnJvbSAweCUwOHgsIGVycm9yIGNvZGU6ICVkLlxuIiwgbGVuLCBvZnMsIGVycik7Ci0JCQlnb3RvIGZyZWVfb3V0OwotCQl9Ci0KLQkJaWYgKHJldGxlbiAhPSBsZW4pIHsKLQkJCUpGRlMyX0VSUk9SKCJzaG9ydCByZWFkIGF0ICUjMDh4OiAlemQgaW5zdGVhZCBvZiAlZC5cbiIsIG9mcywgcmV0bGVuLCBsZW4pOwotCQkJZXJyID0gLUVJTzsKLQkJCWdvdG8gZnJlZV9vdXQ7Ci0JCX0KLQl9Ci0KLQkvKiBDb250aW51ZSBjYWxjdWxhdGluZyBDUkMgKi8KLQljcmMgPSBjcmMzMih0bi0+cGFydGlhbF9jcmMsIGJ1ZmZlciwgbGVuKTsKLQlpZighcG9pbnRlZCkKLQkJa2ZyZWUoYnVmZmVyKTsKLSNpZm5kZWYgX19FQ09TCi0JZWxzZQotCQljLT5tdGQtPnVucG9pbnQoYy0+bXRkLCBidWZmZXIsIG9mcywgbGVuKTsKLSNlbmRpZgotCi0JaWYgKGNyYyAhPSB0bi0+ZGF0YV9jcmMpIHsKLQkJSkZGUzJfTk9USUNFKCJ3cm9uZyBkYXRhIENSQyBpbiBkYXRhIG5vZGUgYXQgMHglMDh4OiByZWFkICUjMDh4LCBjYWxjdWxhdGVkICUjMDh4LlxuIiwKLQkJCW9mcywgdG4tPmRhdGFfY3JjLCBjcmMpOwotCQlyZXR1cm4gMTsKLQl9Ci0KLWFkal9hY2M6Ci0JamViID0gJmMtPmJsb2Nrc1tyZWYtPmZsYXNoX29mZnNldCAvIGMtPnNlY3Rvcl9zaXplXTsKLQlsZW4gPSByZWZfdG90bGVuKGMsIGplYiwgcmVmKTsKLQotCS8qCi0JICogTWFyayB0aGUgbm9kZSBhcyBoYXZpbmcgYmVlbiBjaGVja2VkIGFuZCBmaXggdGhlCi0JICogYWNjb3VudGluZyBhY2NvcmRpbmdseS4KLQkgKi8KLQlzcGluX2xvY2soJmMtPmVyYXNlX2NvbXBsZXRpb25fbG9jayk7Ci0JamViLT51c2VkX3NpemUgKz0gbGVuOwotCWplYi0+dW5jaGVja2VkX3NpemUgLT0gbGVuOwotCWMtPnVzZWRfc2l6ZSArPSBsZW47Ci0JYy0+dW5jaGVja2VkX3NpemUgLT0gbGVuOwotCXNwaW5fdW5sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOwotCi0JcmV0dXJuIDA7Ci0KLWZyZWVfb3V0OgotCWlmKCFwb2ludGVkKQotCQlrZnJlZShidWZmZXIpOwotI2lmbmRlZiBfX0VDT1MKLQllbHNlCi0JCWMtPm10ZC0+dW5wb2ludChjLT5tdGQsIGJ1ZmZlciwgb2ZzLCBsZW4pOwotI2VuZGlmCi0JcmV0dXJuIGVycjsKLX0KLQotLyoKLSAqIEhlbHBlciBmdW5jdGlvbiBmb3IgamZmczJfYWRkX29sZGVyX2ZyYWdfdG9fZnJhZ3RyZWUoKS4KLSAqCi0gKiBDaGVja3MgdGhlIG5vZGUgaWYgd2UgYXJlIGluIHRoZSBjaGVja2luZyBzdGFnZS4KLSAqLwotc3RhdGljIGludCBjaGVja19ub2RlKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqZiwgc3RydWN0IGpmZnMyX3RtcF9kbm9kZV9pbmZvICp0bikKLXsKLQlpbnQgcmV0OwotCi0JQlVHX09OKHJlZl9vYnNvbGV0ZSh0bi0+Zm4tPnJhdykpOwotCi0JLyogV2Ugb25seSBjaGVjayB0aGUgZGF0YSBDUkMgb2YgdW5jaGVja2VkIG5vZGVzICovCi0JaWYgKHJlZl9mbGFncyh0bi0+Zm4tPnJhdykgIT0gUkVGX1VOQ0hFQ0tFRCkKLQkJcmV0dXJuIDA7Ci0KLQlkYmdfZnJhZ3RyZWUyKCJjaGVjayBub2RlICUjMDR4LSUjMDR4LCBwaHlzIG9mZnMgJSMwOHguXG4iLAotCQl0bi0+Zm4tPm9mcywgdG4tPmZuLT5vZnMgKyB0bi0+Zm4tPnNpemUsIHJlZl9vZmZzZXQodG4tPmZuLT5yYXcpKTsKLQotCXJldCA9IGNoZWNrX25vZGVfZGF0YShjLCB0bik7Ci0JaWYgKHVubGlrZWx5KHJldCA8IDApKSB7Ci0JCUpGRlMyX0VSUk9SKCJjaGVja19ub2RlX2RhdGEoKSByZXR1cm5lZCBlcnJvcjogJWQuXG4iLAotCQkJcmV0KTsKLQl9IGVsc2UgaWYgKHVubGlrZWx5KHJldCA+IDApKSB7Ci0JCWRiZ19mcmFndHJlZTIoIkNSQyBlcnJvciwgbWFyayBpdCBvYnNvbGV0ZS5cbiIpOwotCQlqZmZzMl9tYXJrX25vZGVfb2Jzb2xldGUoYywgdG4tPmZuLT5yYXcpOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLS8qCi0gKiBIZWxwZXIgZnVuY3Rpb24gZm9yIGpmZnMyX2FkZF9vbGRlcl9mcmFnX3RvX2ZyYWd0cmVlKCkuCi0gKgotICogQ2FsbGVkIHdoZW4gdGhlIG5ldyBmcmFnbWVudCB0aGF0IGlzIGJlaW5nIGluc2VydGVkCi0gKiBzcGxpdHMgYSBob2xlIGZyYWdtZW50LgotICovCi1zdGF0aWMgaW50IHNwbGl0X2hvbGUoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIHN0cnVjdCByYl9yb290ICpyb290LAotCQkgICAgICBzdHJ1Y3QgamZmczJfbm9kZV9mcmFnICpuZXdmcmFnLCBzdHJ1Y3QgamZmczJfbm9kZV9mcmFnICpob2xlKQotewotCWRiZ19mcmFndHJlZTIoImZyYWdtZW50ICUjMDR4LSUjMDR4IHNwbGl0cyB0aGUgaG9sZSAlIzA0eC0lIzA0eFxuIiwKLQkJbmV3ZnJhZy0+b2ZzLCBuZXdmcmFnLT5vZnMgKyBuZXdmcmFnLT5zaXplLCBob2xlLT5vZnMsIGhvbGUtPm9mcyArIGhvbGUtPnNpemUpOwotCi0JaWYgKGhvbGUtPm9mcyA9PSBuZXdmcmFnLT5vZnMpIHsKLQkJLyoKLQkJICogV2VsbCwgdGhlIG5ldyBmcmFnbWVudCBhY3R1YWxseSBzdGFydHMgYXQgdGhlIHNhbWUgb2Zmc2V0IGFzCi0JCSAqIHRoZSBob2xlLgotCQkgKi8KLQkJaWYgKGhvbGUtPm9mcyArIGhvbGUtPnNpemUgPiBuZXdmcmFnLT5vZnMgKyBuZXdmcmFnLT5zaXplKSB7Ci0JCQkvKgotCQkJICogV2UgcmVwbGFjZSB0aGUgb3ZlcmxhcHBlZCBsZWZ0IHBhcnQgb2YgdGhlIGhvbGUgYnkKLQkJCSAqIHRoZSBuZXcgbm9kZS4KLQkJCSAqLwotCi0JCQlkYmdfZnJhZ3RyZWUyKCJpbnNlcnQgZnJhZ21lbnQgJSMwNHgtJSMwNHggYW5kIGN1dCB0aGUgbGVmdCBwYXJ0IG9mIHRoZSBob2xlXG4iLAotCQkJCW5ld2ZyYWctPm9mcywgbmV3ZnJhZy0+b2ZzICsgbmV3ZnJhZy0+c2l6ZSk7Ci0JCQlyYl9yZXBsYWNlX25vZGUoJmhvbGUtPnJiLCAmbmV3ZnJhZy0+cmIsIHJvb3QpOwotCi0JCQlob2xlLT5vZnMgKz0gbmV3ZnJhZy0+c2l6ZTsKLQkJCWhvbGUtPnNpemUgLT0gbmV3ZnJhZy0+c2l6ZTsKLQotCQkJLyoKLQkJCSAqIFdlIGtub3cgdGhhdCAnaG9sZScgc2hvdWxkIGJlIHRoZSByaWdodCBoYW5kCi0JCQkgKiBmcmFnbWVudC4KLQkJCSAqLwotCQkJamZmczJfZnJhZ3RyZWVfaW5zZXJ0KGhvbGUsIG5ld2ZyYWcpOwotCQkJcmJfaW5zZXJ0X2NvbG9yKCZob2xlLT5yYiwgcm9vdCk7Ci0JCX0gZWxzZSB7Ci0JCQkvKgotCQkJICogQWgsIHRoZSBuZXcgZnJhZ21lbnQgaXMgb2YgdGhlIHNhbWUgc2l6ZSBhcyB0aGUgaG9sZS4KLQkJCSAqIFJlbGFjZSB0aGUgaG9sZSBieSBpdC4KLQkJCSAqLwotCQkJZGJnX2ZyYWd0cmVlMigiaW5zZXJ0IGZyYWdtZW50ICUjMDR4LSUjMDR4IGFuZCBvdmVyd3JpdGUgaG9sZVxuIiwKLQkJCQluZXdmcmFnLT5vZnMsIG5ld2ZyYWctPm9mcyArIG5ld2ZyYWctPnNpemUpOwotCQkJcmJfcmVwbGFjZV9ub2RlKCZob2xlLT5yYiwgJm5ld2ZyYWctPnJiLCByb290KTsKLQkJCWpmZnMyX2ZyZWVfbm9kZV9mcmFnKGhvbGUpOwotCQl9Ci0JfSBlbHNlIHsKLQkJLyogVGhlIG5ldyBmcmFnbWVudCBsZWZ0cyBzb21lIGhvbGUgc3BhY2UgYXQgdGhlIGxlZnQgKi8KLQotCQlzdHJ1Y3QgamZmczJfbm9kZV9mcmFnICogbmV3ZnJhZzIgPSBOVUxMOwotCi0JCWlmIChob2xlLT5vZnMgKyBob2xlLT5zaXplID4gbmV3ZnJhZy0+b2ZzICsgbmV3ZnJhZy0+c2l6ZSkgewotCQkJLyogVGhlIG5ldyBmcmFnIGFsc28gbGVmdHMgc29tZSBzcGFjZSBhdCB0aGUgcmlnaHQgKi8KLQkJCW5ld2ZyYWcyID0gbmV3X2ZyYWdtZW50KE5VTEwsIG5ld2ZyYWctPm9mcyArCi0JCQkJbmV3ZnJhZy0+c2l6ZSwgaG9sZS0+b2ZzICsgaG9sZS0+c2l6ZQotCQkJCS0gbmV3ZnJhZy0+b2ZzIC0gbmV3ZnJhZy0+c2l6ZSk7Ci0JCQlpZiAodW5saWtlbHkoIW5ld2ZyYWcyKSkgewotCQkJCWpmZnMyX2ZyZWVfbm9kZV9mcmFnKG5ld2ZyYWcpOwotCQkJCXJldHVybiAtRU5PTUVNOwotCQkJfQotCQl9Ci0KLQkJaG9sZS0+c2l6ZSA9IG5ld2ZyYWctPm9mcyAtIGhvbGUtPm9mczsKLQkJZGJnX2ZyYWd0cmVlMigibGVmdCB0aGUgaG9sZSAlIzA0eC0lIzA0eCBhdCB0aGUgbGVmdCBhbmQgaW5zZXJkIGZyYWdtZW50ICUjMDR4LSUjMDR4XG4iLAotCQkJaG9sZS0+b2ZzLCBob2xlLT5vZnMgKyBob2xlLT5zaXplLCBuZXdmcmFnLT5vZnMsIG5ld2ZyYWctPm9mcyArIG5ld2ZyYWctPnNpemUpOwotCi0JCWpmZnMyX2ZyYWd0cmVlX2luc2VydChuZXdmcmFnLCBob2xlKTsKLQkJcmJfaW5zZXJ0X2NvbG9yKCZuZXdmcmFnLT5yYiwgcm9vdCk7Ci0KLQkJaWYgKG5ld2ZyYWcyKSB7Ci0JCQlkYmdfZnJhZ3RyZWUyKCJsZWZ0IHRoZSBob2xlICUjMDR4LSUjMDR4IGF0IHRoZSByaWdodFxuIiwKLQkJCQluZXdmcmFnMi0+b2ZzLCBuZXdmcmFnMi0+b2ZzICsgbmV3ZnJhZzItPnNpemUpOwotCQkJamZmczJfZnJhZ3RyZWVfaW5zZXJ0KG5ld2ZyYWcyLCBuZXdmcmFnKTsKLQkJCXJiX2luc2VydF9jb2xvcigmbmV3ZnJhZzItPnJiLCByb290KTsKLQkJfQotCX0KLQotCXJldHVybiAwOwotfQotCi0vKgotICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHdoZW4gd2UgYnVpbGQgaW5vZGUuIEl0IGV4cGVjdHMgdGhlIG5vZGVzIGFyZSBwYXNzZWQKLSAqIGluIHRoZSBkZWNyZWFzaW5nIHZlcnNpb24gb3JkZXIuIFRoZSB3aG9sZSBwb2ludCBvZiB0aGlzIGlzIHRvIGltcHJvdmUgdGhlCi0gKiBpbm9kZXMgY2hlY2tpbmcgb24gTkFORDogd2UgY2hlY2sgdGhlIG5vZGVzJyBkYXRhIENSQyBvbmx5IHdoZW4gdGhleSBhcmUgbm90Ci0gKiBvYnNvbGV0ZWQuIFByZXZpb3VzbHksIGFkZF9mcmFnX3RvX2ZyYWd0cmVlKCkgZnVuY3Rpb24gd2FzIHVzZWQgYW5kCi0gKiBub2RlcyB3ZXJlIHBhc3NlZCB0byBpdCBpbiB0aGUgaW5jcmVhc2luZyB2ZXJzaW9uIG9yZGVzIGFuZCBDUkNzIG9mIGFsbAotICogbm9kZXMgd2VyZSBjaGVja2VkLgotICoKLSAqIE5vdGU6IHRuLT5mbi0+c2l6ZSBzaG91bGRuJ3QgYmUgemVyby4KLSAqCi0gKiBSZXR1cm5zIDAgaWYgdGhlIG5vZGUgd2FzIGluc2VydGVkCi0gKiAgICAgICAgIDEgaWYgaXQgd2Fzbid0IGluc2VydGVkIChzaW5jZSBpdCBpcyBvYnNvbGV0ZSkKLSAqICAgICAgICAgPCAwIGFuIGlmIGVycm9yIG9jY3VyZWQKLSAqLwotaW50IGpmZnMyX2FkZF9vbGRlcl9mcmFnX3RvX2ZyYWd0cmVlKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqZiwKLQkJCQkgICAgIHN0cnVjdCBqZmZzMl90bXBfZG5vZGVfaW5mbyAqdG4pCi17Ci0Jc3RydWN0IGpmZnMyX25vZGVfZnJhZyAqdGhpcywgKm5ld2ZyYWc7Ci0JdWludDMyX3QgbGFzdGVuZDsKLQlzdHJ1Y3QgamZmczJfZnVsbF9kbm9kZSAqZm4gPSB0bi0+Zm47Ci0Jc3RydWN0IHJiX3Jvb3QgKnJvb3QgPSAmZi0+ZnJhZ3RyZWU7Ci0JdWludDMyX3QgZm5fc2l6ZSA9IGZuLT5zaXplLCBmbl9vZnMgPSBmbi0+b2ZzOwotCWludCBlcnIsIGNoZWNrZWQgPSAwOwotCWludCByZWZfZmxhZzsKLQotCWRiZ19mcmFndHJlZSgiaW5zZXJ0IGZyYWdtZW50ICUjMDR4LSUjMDR4LCB2ZXIgJXVcbiIsIGZuX29mcywgZm5fb2ZzICsgZm5fc2l6ZSwgdG4tPnZlcnNpb24pOwotCi0JLyogU2tpcCBhbGwgdGhlIG5vZGVzIHdoaWNoIGFyZSBjb21wbGV0ZWQgYmVmb3JlIHRoaXMgb25lIHN0YXJ0cyAqLwotCXRoaXMgPSBqZmZzMl9sb29rdXBfbm9kZV9mcmFnKHJvb3QsIGZuX29mcyk7Ci0JaWYgKHRoaXMpCi0JCWRiZ19mcmFndHJlZTIoIid0aGlzJyBmb3VuZCAlIzA0eC0lIzA0eCAoJXMpXG4iLCB0aGlzLT5vZnMsIHRoaXMtPm9mcyArIHRoaXMtPnNpemUsIHRoaXMtPm5vZGUgPyAiZGF0YSIgOiAiaG9sZSIpOwotCi0JaWYgKHRoaXMpCi0JCWxhc3RlbmQgPSB0aGlzLT5vZnMgKyB0aGlzLT5zaXplOwotCWVsc2UKLQkJbGFzdGVuZCA9IDA7Ci0KLQkvKiBEZXRlY3QgdGhlIHByZWxpbWluYXJ5IHR5cGUgb2Ygbm9kZSAqLwotCWlmIChmbi0+c2l6ZSA+PSBQQUdFX0NBQ0hFX1NJWkUpCi0JCXJlZl9mbGFnID0gUkVGX1BSSVNUSU5FOwotCWVsc2UKLQkJcmVmX2ZsYWcgPSBSRUZfTk9STUFMOwotCi0JLyogU2VlIGlmIHdlIHJhbiBvZmYgdGhlIGVuZCBvZiB0aGUgcm9vdCAqLwotCWlmIChsYXN0ZW5kIDw9IGZuX29mcykgewotCQkvKiBXZSBkaWQgKi8KLQotCQkvKgotCQkgKiBXZSBhcmUgZ29pbmcgdG8gaW5zZXJ0IHRoZSBuZXcgbm9kZSBpbnRvIHRoZQotCQkgKiBmcmFnbWVudCB0cmVlLCBzbyBjaGVjayBpdC4KLQkJICovCi0JCWVyciA9IGNoZWNrX25vZGUoYywgZiwgdG4pOwotCQlpZiAoZXJyICE9IDApCi0JCQlyZXR1cm4gZXJyOwotCi0JCWZuLT5mcmFncyA9IDE7Ci0KLQkJbmV3ZnJhZyA9IG5ld19mcmFnbWVudChmbiwgZm5fb2ZzLCBmbl9zaXplKTsKLQkJaWYgKHVubGlrZWx5KCFuZXdmcmFnKSkKLQkJCXJldHVybiAtRU5PTUVNOwotCi0JCWVyciA9IG5vX292ZXJsYXBwaW5nX25vZGUoYywgcm9vdCwgbmV3ZnJhZywgdGhpcywgbGFzdGVuZCk7Ci0JCWlmICh1bmxpa2VseShlcnIgIT0gMCkpIHsKLQkJCWpmZnMyX2ZyZWVfbm9kZV9mcmFnKG5ld2ZyYWcpOwotCQkJcmV0dXJuIGVycjsKLQkJfQotCi0JCWdvdG8gb3V0X29rOwotCX0KLQotCWZuLT5mcmFncyA9IDA7Ci0KLQl3aGlsZSAoMSkgewotCQkvKgotCQkgKiBIZXJlIHdlIGhhdmU6Ci0JCSAqIGZuX29mcyA8IHRoaXMtPm9mcyArIHRoaXMtPnNpemUgJiYgZm5fb2ZzID49IHRoaXMtPm9mcy4KLQkJICoKLQkJICogUmVtZW1iZXIsICd0aGlzJyBoYXMgaGlnaGVyIHZlcnNpb24sIGFueSBub24taG9sZSBub2RlCi0JCSAqIHdoaWNoIGlzIGFscmVhZHkgaW4gdGhlIGZyYWd0cmVlIGlzIG5ld2VyIHRoZW4gdGhlIG5ld2x5Ci0JCSAqIGluc2VydGVkLgotCQkgKi8KLQkJaWYgKCF0aGlzLT5ub2RlKSB7Ci0JCQkvKgotCQkJICogJ3RoaXMnIGlzIHRoZSBob2xlIGZyYWdtZW50LCBzbyBhdCBsZWFzdCB0aGUKLQkJCSAqIGJlZ2lubmluZyBvZiB0aGUgbmV3IGZyYWdtZW50IGlzIHZhbGlkLgotCQkJICovCi0KLQkJCS8qCi0JCQkgKiBXZSBhcmUgZ29pbmcgdG8gaW5zZXJ0IHRoZSBuZXcgbm9kZSBpbnRvIHRoZQotCQkJICogZnJhZ21lbnQgdHJlZSwgc28gY2hlY2sgaXQuCi0JCQkgKi8KLQkJCWlmICghY2hlY2tlZCkgewotCQkJCWVyciA9IGNoZWNrX25vZGUoYywgZiwgdG4pOwotCQkJCWlmICh1bmxpa2VseShlcnIgIT0gMCkpCi0JCQkJCXJldHVybiBlcnI7Ci0JCQkJY2hlY2tlZCA9IDE7Ci0JCQl9Ci0KLQkJCWlmICh0aGlzLT5vZnMgKyB0aGlzLT5zaXplID49IGZuX29mcyArIGZuX3NpemUpIHsKLQkJCQkvKiBXZSBzcGxpdCB0aGUgaG9sZSBvbiB0d28gcGFydHMgKi8KLQotCQkJCWZuLT5mcmFncyArPSAxOwotCQkJCW5ld2ZyYWcgPSBuZXdfZnJhZ21lbnQoZm4sIGZuX29mcywgZm5fc2l6ZSk7Ci0JCQkJaWYgKHVubGlrZWx5KCFuZXdmcmFnKSkKLQkJCQkJcmV0dXJuIC1FTk9NRU07Ci0KLQkJCQllcnIgPSBzcGxpdF9ob2xlKGMsIHJvb3QsIG5ld2ZyYWcsIHRoaXMpOwotCQkJCWlmICh1bmxpa2VseShlcnIpKQotCQkJCQlyZXR1cm4gZXJyOwotCQkJCWdvdG8gb3V0X29rOwotCQkJfQotCi0JCQkvKgotCQkJICogVGhlIGJlZ2lubmluZyBvZiB0aGUgbmV3IGZyYWdtZW50IGlzIHZhbGlkIHNpbmNlIGl0Ci0JCQkgKiBvdmVybGFwcyB0aGUgaG9sZSBub2RlLgotCQkJICovCi0KLQkJCXJlZl9mbGFnID0gUkVGX05PUk1BTDsKLQotCQkJZm4tPmZyYWdzICs9IDE7Ci0JCQluZXdmcmFnID0gbmV3X2ZyYWdtZW50KGZuLCBmbl9vZnMsCi0JCQkJCXRoaXMtPm9mcyArIHRoaXMtPnNpemUgLSBmbl9vZnMpOwotCQkJaWYgKHVubGlrZWx5KCFuZXdmcmFnKSkKLQkJCQlyZXR1cm4gLUVOT01FTTsKLQotCQkJaWYgKGZuX29mcyA9PSB0aGlzLT5vZnMpIHsKLQkJCQkvKgotCQkJCSAqIFRoZSBuZXcgbm9kZSBzdGFydHMgYXQgdGhlIHNhbWUgb2Zmc2V0IGFzCi0JCQkJICogdGhlIGhvbGUgYW5kIHN1cGVyc2llZHMgdGhlIGhvbGUuCi0JCQkJICovCi0JCQkJZGJnX2ZyYWd0cmVlMigiYWRkIHRoZSBuZXcgZnJhZ21lbnQgaW5zdGVhZCBvZiBob2xlICUjMDR4LSUjMDR4LCByZWZjbnQgJWRcbiIsCi0JCQkJCWZuX29mcywgZm5fb2ZzICsgdGhpcy0+b2ZzICsgdGhpcy0+c2l6ZSAtIGZuX29mcywgZm4tPmZyYWdzKTsKLQotCQkJCXJiX3JlcGxhY2Vfbm9kZSgmdGhpcy0+cmIsICZuZXdmcmFnLT5yYiwgcm9vdCk7Ci0JCQkJamZmczJfZnJlZV9ub2RlX2ZyYWcodGhpcyk7Ci0JCQl9IGVsc2UgewotCQkJCS8qCi0JCQkJICogVGhlIGhvbGUgYmVjb21lcyBzaG9ydGVyIGFzIGl0cyByaWdodCBwYXJ0Ci0JCQkJICogaXMgc3VwZXJzaWVkZWQgYnkgdGhlIG5ldyBmcmFnbWVudC4KLQkJCQkgKi8KLQkJCQlkYmdfZnJhZ3RyZWUyKCJyZWR1Y2Ugc2l6ZSBvZiBob2xlICUjMDR4LSUjMDR4IHRvICUjMDR4LSUjMDR4XG4iLAotCQkJCQl0aGlzLT5vZnMsIHRoaXMtPm9mcyArIHRoaXMtPnNpemUsIHRoaXMtPm9mcywgdGhpcy0+b2ZzICsgdGhpcy0+c2l6ZSAtIG5ld2ZyYWctPnNpemUpOwotCi0JCQkJZGJnX2ZyYWd0cmVlMigiYWRkIG5ldyBmcmFnbWVudCAlIzA0eC0lIzA0eCwgcmVmY250ICVkXG4iLCBmbl9vZnMsCi0JCQkJCWZuX29mcyArIHRoaXMtPm9mcyArIHRoaXMtPnNpemUgLSBmbl9vZnMsIGZuLT5mcmFncyk7Ci0KLQkJCQl0aGlzLT5zaXplIC09IG5ld2ZyYWctPnNpemU7Ci0JCQkJamZmczJfZnJhZ3RyZWVfaW5zZXJ0KG5ld2ZyYWcsIHRoaXMpOwotCQkJCXJiX2luc2VydF9jb2xvcigmbmV3ZnJhZy0+cmIsIHJvb3QpOwotCQkJfQotCi0JCQlmbl9vZnMgKz0gbmV3ZnJhZy0+c2l6ZTsKLQkJCWZuX3NpemUgLT0gbmV3ZnJhZy0+c2l6ZTsKLQkJCXRoaXMgPSByYl9lbnRyeShyYl9uZXh0KCZuZXdmcmFnLT5yYiksCi0JCQkJCXN0cnVjdCBqZmZzMl9ub2RlX2ZyYWcsIHJiKTsKLQotCQkJZGJnX2ZyYWd0cmVlMigic3dpdGNoIHRvIHRoZSBuZXh0ICd0aGlzJyBmcmFnbWVudDogJSMwNHgtJSMwNHggJXNcbiIsCi0JCQkJdGhpcy0+b2ZzLCB0aGlzLT5vZnMgKyB0aGlzLT5zaXplLCB0aGlzLT5ub2RlID8gIihkYXRhKSIgOiAiKGhvbGUpIik7Ci0JCX0KLQotCQkvKgotCQkgKiAnVGhpcycgbm9kZSBpcyBub3QgdGhlIGhvbGUgc28gaXQgb2Jzb2xldGVzIHRoZSBuZXcgZnJhZ21lbnQKLQkJICogZWl0aGVyIGZ1bGx5IG9yIHBhcnRpYWxseS4KLQkJICovCi0JCWlmICh0aGlzLT5vZnMgKyB0aGlzLT5zaXplID49IGZuX29mcyArIGZuX3NpemUpIHsKLQkJCS8qIFRoZSBuZXcgbm9kZSBpcyBvYnNvbGV0ZSwgZHJvcCBpdCAqLwotCQkJaWYgKGZuLT5mcmFncyA9PSAwKSB7Ci0JCQkJZGJnX2ZyYWd0cmVlMigiJSMwNHgtJSMwNHggaXMgb2Jzb2xldGUsIG1hcmsgaXQgb2Jzb2xldGVcbiIsIGZuX29mcywgZm5fb2ZzICsgZm5fc2l6ZSk7Ci0JCQkJcmVmX2ZsYWcgPSBSRUZfT0JTT0xFVEU7Ci0JCQl9Ci0JCQlnb3RvIG91dF9vazsKLQkJfSBlbHNlIHsKLQkJCXN0cnVjdCBqZmZzMl9ub2RlX2ZyYWcgKm5ld190aGlzOwotCi0JCQkvKiAnVGhpcycgbm9kZSBvYnNvbGV0ZXMgdGhlIGJlZ2lubmluZyBvZiB0aGUgbmV3IG5vZGUgKi8KLQkJCWRiZ19mcmFndHJlZTIoInRoZSBiZWdpbm5pbmcgJSMwNHgtJSMwNHggaXMgb2Jzb2xldGVcbiIsIGZuX29mcywgdGhpcy0+b2ZzICsgdGhpcy0+c2l6ZSk7Ci0KLQkJCXJlZl9mbGFnID0gUkVGX05PUk1BTDsKLQotCQkJZm5fc2l6ZSAtPSB0aGlzLT5vZnMgKyB0aGlzLT5zaXplIC0gZm5fb2ZzOwotCQkJZm5fb2ZzID0gdGhpcy0+b2ZzICsgdGhpcy0+c2l6ZTsKLQkJCWRiZ19mcmFndHJlZTIoIm5vdyBjb25zaWRlcmluZyAlIzA0eC0lIzA0eFxuIiwgZm5fb2ZzLCBmbl9vZnMgKyBmbl9zaXplKTsKLQotCQkJbmV3X3RoaXMgPSByYl9lbnRyeShyYl9uZXh0KCZ0aGlzLT5yYiksIHN0cnVjdCBqZmZzMl9ub2RlX2ZyYWcsIHJiKTsKLQkJCWlmICghbmV3X3RoaXMpIHsKLQkJCQkvKgotCQkJCSAqIFRoZXJlIGlzIG5vIG5leHQgZnJhZ21lbnQuIEFkZCB0aGUgcmVzdCBvZgotCQkJCSAqIHRoZSBuZXcgbm9kZSBhcyB0aGUgcmlnaHQtaGFuZCBjaGlsZC4KLQkJCQkgKi8KLQkJCQlpZiAoIWNoZWNrZWQpIHsKLQkJCQkJZXJyID0gY2hlY2tfbm9kZShjLCBmLCB0bik7Ci0JCQkJCWlmICh1bmxpa2VseShlcnIgIT0gMCkpCi0JCQkJCQlyZXR1cm4gZXJyOwotCQkJCQljaGVja2VkID0gMTsKLQkJCQl9Ci0KLQkJCQlmbi0+ZnJhZ3MgKz0gMTsKLQkJCQluZXdmcmFnID0gbmV3X2ZyYWdtZW50KGZuLCBmbl9vZnMsIGZuX3NpemUpOwotCQkJCWlmICh1bmxpa2VseSghbmV3ZnJhZykpCi0JCQkJCXJldHVybiAtRU5PTUVNOwotCi0JCQkJZGJnX2ZyYWd0cmVlMigidGhlcmUgYXJlIG5vIG1vcmUgZnJhZ21lbnRzLCBpbnNlcnQgJSMwNHgtJSMwNHhcbiIsCi0JCQkJCW5ld2ZyYWctPm9mcywgbmV3ZnJhZy0+b2ZzICsgbmV3ZnJhZy0+c2l6ZSk7Ci0JCQkJcmJfbGlua19ub2RlKCZuZXdmcmFnLT5yYiwgJnRoaXMtPnJiLCAmdGhpcy0+cmIucmJfcmlnaHQpOwotCQkJCXJiX2luc2VydF9jb2xvcigmbmV3ZnJhZy0+cmIsIHJvb3QpOwotCQkJCWdvdG8gb3V0X29rOwotCQkJfSBlbHNlIHsKLQkJCQl0aGlzID0gbmV3X3RoaXM7Ci0JCQkJZGJnX2ZyYWd0cmVlMigic3dpdGNoIHRvIHRoZSBuZXh0ICd0aGlzJyBmcmFnbWVudDogJSMwNHgtJSMwNHggJXNcbiIsCi0JCQkJCXRoaXMtPm9mcywgdGhpcy0+b2ZzICsgdGhpcy0+c2l6ZSwgdGhpcy0+bm9kZSA/ICIoZGF0YSkiIDogIihob2xlKSIpOwotCQkJfQotCQl9Ci0JfQotCi1vdXRfb2s6Ci0JQlVHX09OKGZuLT5zaXplIDwgUEFHRV9DQUNIRV9TSVpFICYmIHJlZl9mbGFnID09IFJFRl9QUklTVElORSk7Ci0KLQlpZiAocmVmX2ZsYWcgPT0gUkVGX09CU09MRVRFKSB7Ci0JCWRiZ19mcmFndHJlZTIoInRoZSBub2RlIGlzIG9ic29sZXRlIG5vd1xuIik7Ci0JCS8qIGpmZnMyX21hcmtfbm9kZV9vYnNvbGV0ZSgpIHdpbGwgYWRqdXN0IHNwYWNlIGFjY291bnRpbmcgKi8KLQkJamZmczJfbWFya19ub2RlX29ic29sZXRlKGMsIGZuLT5yYXcpOwotCQlyZXR1cm4gMTsKLQl9Ci0KLQlkYmdfZnJhZ3RyZWUyKCJ0aGUgbm9kZSBpcyBcIiVzXCIgbm93XG4iLCByZWZfZmxhZyA9PSBSRUZfTk9STUFMID8gIlJFRl9OT1JNQUwiIDogIlJFRl9QUklTVElORSIpOwotCi0JLyogU3BhY2UgYWNjb3VudGluZyB3YXMgYWRqdXN0ZWQgYXQgY2hlY2tfbm9kZV9kYXRhKCkgKi8KLQlzcGluX2xvY2soJmMtPmVyYXNlX2NvbXBsZXRpb25fbG9jayk7Ci0JZm4tPnJhdy0+Zmxhc2hfb2Zmc2V0ID0gcmVmX29mZnNldChmbi0+cmF3KSB8IHJlZl9mbGFnOwotCXNwaW5fdW5sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOwotCi0JcmV0dXJuIDA7Ci19Ci0KIHZvaWQgamZmczJfc2V0X2lub2NhY2hlX3N0YXRlKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfaW5vZGVfY2FjaGUgKmljLCBpbnQgc3RhdGUpCiB7CiAJc3Bpbl9sb2NrKCZjLT5pbm9jYWNoZV9sb2NrKTsKZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL25vZGVsaXN0LmggYi9mcy9qZmZzMi9ub2RlbGlzdC5oCmluZGV4IDQxNzhiNGI1Li4yNTEyNmEwIDEwMDY0NAotLS0gYS9mcy9qZmZzMi9ub2RlbGlzdC5oCisrKyBiL2ZzL2pmZnMyL25vZGVsaXN0LmgKQEAgLTEsMTQgKzEsMTIgQEAKIC8qCiAgKiBKRkZTMiAtLSBKb3VybmFsbGluZyBGbGFzaCBGaWxlIFN5c3RlbSwgVmVyc2lvbiAyLgogICoKLSAqIENvcHlyaWdodCAoQykgMjAwMS0yMDAzIFJlZCBIYXQsIEluYy4KKyAqIENvcHlyaWdodCDCqSAyMDAxLTIwMDcgUmVkIEhhdCwgSW5jLgogICoKICAqIENyZWF0ZWQgYnkgRGF2aWQgV29vZGhvdXNlIDxkd213MkBpbmZyYWRlYWQub3JnPgogICoKICAqIEZvciBsaWNlbnNpbmcgaW5mb3JtYXRpb24sIHNlZSB0aGUgZmlsZSAnTElDRU5DRScgaW4gdGhpcyBkaXJlY3RvcnkuCiAgKgotICogJElkOiBub2RlbGlzdC5oLHYgMS4xNDAgMjAwNS8wOS8wNyAwODozNDo1NCBoYXZhc2kgRXhwICQKLSAqCiAgKi8KIAogI2lmbmRlZiBfX0pGRlMyX05PREVMSVNUX0hfXwpAQCAtNDAsNiArMzgsOSBAQAogI2RlZmluZSBjcHVfdG9famUzMih4KSAoKGppbnQzMl90KXt4fSkKICNkZWZpbmUgY3B1X3RvX2plbW9kZSh4KSAoKGptb2RlX3Qpe29zX3RvX2pmZnMyX21vZGUoeCl9KQogCisjZGVmaW5lIGNvbnN0YW50X2NwdV90b19qZTE2KHgpICgoamludDE2X3Qpe3h9KQorI2RlZmluZSBjb25zdGFudF9jcHVfdG9famUzMih4KSAoKGppbnQzMl90KXt4fSkKKwogI2RlZmluZSBqZTE2X3RvX2NwdSh4KSAoKHgpLnYxNikKICNkZWZpbmUgamUzMl90b19jcHUoeCkgKCh4KS52MzIpCiAjZGVmaW5lIGplbW9kZV90b19jcHUoeCkgKGpmZnMyX3RvX29zX21vZGUoKHgpLm0pKQpAQCAtNDgsNiArNDksOSBAQAogI2RlZmluZSBjcHVfdG9famUzMih4KSAoKGppbnQzMl90KXtjcHVfdG9fYmUzMih4KX0pCiAjZGVmaW5lIGNwdV90b19qZW1vZGUoeCkgKChqbW9kZV90KXtjcHVfdG9fYmUzMihvc190b19qZmZzMl9tb2RlKHgpKX0pCiAKKyNkZWZpbmUgY29uc3RhbnRfY3B1X3RvX2plMTYoeCkgKChqaW50MTZfdCl7X19jb25zdGFudF9jcHVfdG9fYmUxNih4KX0pCisjZGVmaW5lIGNvbnN0YW50X2NwdV90b19qZTMyKHgpICgoamludDMyX3Qpe19fY29uc3RhbnRfY3B1X3RvX2JlMzIoeCl9KQorCiAjZGVmaW5lIGplMTZfdG9fY3B1KHgpIChiZTE2X3RvX2NwdSh4LnYxNikpCiAjZGVmaW5lIGplMzJfdG9fY3B1KHgpIChiZTMyX3RvX2NwdSh4LnYzMikpCiAjZGVmaW5lIGplbW9kZV90b19jcHUoeCkgKGJlMzJfdG9fY3B1KGpmZnMyX3RvX29zX21vZGUoKHgpLm0pKSkKQEAgLTU2LDYgKzYwLDkgQEAKICNkZWZpbmUgY3B1X3RvX2plMzIoeCkgKChqaW50MzJfdCl7Y3B1X3RvX2xlMzIoeCl9KQogI2RlZmluZSBjcHVfdG9famVtb2RlKHgpICgoam1vZGVfdCl7Y3B1X3RvX2xlMzIob3NfdG9famZmczJfbW9kZSh4KSl9KQogCisjZGVmaW5lIGNvbnN0YW50X2NwdV90b19qZTE2KHgpICgoamludDE2X3Qpe19fY29uc3RhbnRfY3B1X3RvX2xlMTYoeCl9KQorI2RlZmluZSBjb25zdGFudF9jcHVfdG9famUzMih4KSAoKGppbnQzMl90KXtfX2NvbnN0YW50X2NwdV90b19sZTMyKHgpfSkKKwogI2RlZmluZSBqZTE2X3RvX2NwdSh4KSAobGUxNl90b19jcHUoeC52MTYpKQogI2RlZmluZSBqZTMyX3RvX2NwdSh4KSAobGUzMl90b19jcHUoeC52MzIpKQogI2RlZmluZSBqZW1vZGVfdG9fY3B1KHgpIChsZTMyX3RvX2NwdShqZmZzMl90b19vc19tb2RlKCh4KS5tKSkpCkBAIC0yMTYsNyArMjIzLDIwIEBACiAJdWludDMyX3QgdmVyc2lvbjsKIAl1aW50MzJfdCBkYXRhX2NyYzsKIAl1aW50MzJfdCBwYXJ0aWFsX2NyYzsKLQl1aW50MzJfdCBjc2l6ZTsKKwl1aW50MTZfdCBjc2l6ZTsKKwl1aW50MTZfdCBvdmVybGFwcGVkOworfTsKKworLyogVGVtcG9yYXJ5IGRhdGEgc3RydWN0dXJlIHVzZWQgZHVyaW5nIHJlYWRpbm9kZS4gKi8KK3N0cnVjdCBqZmZzMl9yZWFkaW5vZGVfaW5mbworeworCXN0cnVjdCByYl9yb290IHRuX3Jvb3Q7CisJc3RydWN0IGpmZnMyX3RtcF9kbm9kZV9pbmZvICptZGF0YV90bjsKKwl1aW50MzJfdCBoaWdoZXN0X3ZlcnNpb247CisJdWludDMyX3QgbGF0ZXN0X21jdGltZTsKKwl1aW50MzJfdCBtY3RpbWVfdmVyOworCXN0cnVjdCBqZmZzMl9mdWxsX2RpcmVudCAqZmRzOworCXN0cnVjdCBqZmZzMl9yYXdfbm9kZV9yZWYgKmxhdGVzdF9yZWY7CiB9OwogCiBzdHJ1Y3QgamZmczJfZnVsbF9kaXJlbnQKQEAgLTMxOSw2ICszMzksMTUgQEAKICNkZWZpbmUgZnJhZ19yaWdodChmcmFnKSByYl9lbnRyeSgoZnJhZyktPnJiLnJiX3JpZ2h0LCBzdHJ1Y3QgamZmczJfbm9kZV9mcmFnLCByYikKICNkZWZpbmUgZnJhZ19lcmFzZShmcmFnLCBsaXN0KSByYl9lcmFzZSgmZnJhZy0+cmIsIGxpc3QpOwogCisjZGVmaW5lIHRuX25leHQodG4pIHJiX2VudHJ5KHJiX25leHQoJih0biktPnJiKSwgc3RydWN0IGpmZnMyX3RtcF9kbm9kZV9pbmZvLCByYikKKyNkZWZpbmUgdG5fcHJldih0bikgcmJfZW50cnkocmJfcHJldigmKHRuKS0+cmIpLCBzdHJ1Y3QgamZmczJfdG1wX2Rub2RlX2luZm8sIHJiKQorI2RlZmluZSB0bl9wYXJlbnQodG4pIHJiX2VudHJ5KHJiX3BhcmVudCgmKHRuKS0+cmIpLCBzdHJ1Y3QgamZmczJfdG1wX2Rub2RlX2luZm8sIHJiKQorI2RlZmluZSB0bl9sZWZ0KHRuKSByYl9lbnRyeSgodG4pLT5yYi5yYl9sZWZ0LCBzdHJ1Y3QgamZmczJfdG1wX2Rub2RlX2luZm8sIHJiKQorI2RlZmluZSB0bl9yaWdodCh0bikgcmJfZW50cnkoKHRuKS0+cmIucmJfcmlnaHQsIHN0cnVjdCBqZmZzMl90bXBfZG5vZGVfaW5mbywgcmIpCisjZGVmaW5lIHRuX2VyYXNlKHRuLCBsaXN0KSByYl9lcmFzZSgmdG4tPnJiLCBsaXN0KTsKKyNkZWZpbmUgdG5fbGFzdChsaXN0KSByYl9lbnRyeShyYl9sYXN0KGxpc3QpLCBzdHJ1Y3QgamZmczJfdG1wX2Rub2RlX2luZm8sIHJiKQorI2RlZmluZSB0bl9maXJzdChsaXN0KSByYl9lbnRyeShyYl9maXJzdChsaXN0KSwgc3RydWN0IGpmZnMyX3RtcF9kbm9kZV9pbmZvLCByYikKKwogLyogbm9kZWxpc3QuYyAqLwogdm9pZCBqZmZzMl9hZGRfZmRfdG9fbGlzdChzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX2Z1bGxfZGlyZW50ICpuZXcsIHN0cnVjdCBqZmZzMl9mdWxsX2RpcmVudCAqKmxpc3QpOwogdm9pZCBqZmZzMl9zZXRfaW5vY2FjaGVfc3RhdGUoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIHN0cnVjdCBqZmZzMl9pbm9kZV9jYWNoZSAqaWMsIGludCBzdGF0ZSk7CkBAIC0zMzMsOCArMzYyLDcgQEAKIHN0cnVjdCByYl9ub2RlICpyYl9wcmV2KHN0cnVjdCByYl9ub2RlICopOwogdm9pZCByYl9yZXBsYWNlX25vZGUoc3RydWN0IHJiX25vZGUgKnZpY3RpbSwgc3RydWN0IHJiX25vZGUgKm5ldywgc3RydWN0IHJiX3Jvb3QgKnJvb3QpOwogaW50IGpmZnMyX2FkZF9mdWxsX2Rub2RlX3RvX2lub2RlKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqZiwgc3RydWN0IGpmZnMyX2Z1bGxfZG5vZGUgKmZuKTsKLXZvaWQgamZmczJfdHJ1bmNhdGVfZnJhZ3RyZWUgKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgcmJfcm9vdCAqbGlzdCwgdWludDMyX3Qgc2l6ZSk7Ci1pbnQgamZmczJfYWRkX29sZGVyX2ZyYWdfdG9fZnJhZ3RyZWUoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIHN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICpmLCBzdHJ1Y3QgamZmczJfdG1wX2Rub2RlX2luZm8gKnRuKTsKK3VpbnQzMl90IGpmZnMyX3RydW5jYXRlX2ZyYWd0cmVlIChzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IHJiX3Jvb3QgKmxpc3QsIHVpbnQzMl90IHNpemUpOwogc3RydWN0IGpmZnMyX3Jhd19ub2RlX3JlZiAqamZmczJfbGlua19ub2RlX3JlZihzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywKIAkJCQkJICAgICAgIHN0cnVjdCBqZmZzMl9lcmFzZWJsb2NrICpqZWIsCiAJCQkJCSAgICAgICB1aW50MzJfdCBvZnMsIHVpbnQzMl90IGxlbiwKZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL25vZGVtZ210LmMgYi9mcy9qZmZzMi9ub2RlbWdtdC5jCmluZGV4IGQ4ODM3NjkuLmRiYzkwOGEgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL25vZGVtZ210LmMKKysrIGIvZnMvamZmczIvbm9kZW1nbXQuYwpAQCAtMSwxNCArMSwxMiBAQAogLyoKICAqIEpGRlMyIC0tIEpvdXJuYWxsaW5nIEZsYXNoIEZpbGUgU3lzdGVtLCBWZXJzaW9uIDIuCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDMgUmVkIEhhdCwgSW5jLgorICogQ29weXJpZ2h0IMKpIDIwMDEtMjAwNyBSZWQgSGF0LCBJbmMuCiAgKgogICogQ3JlYXRlZCBieSBEYXZpZCBXb29kaG91c2UgPGR3bXcyQGluZnJhZGVhZC5vcmc+CiAgKgogICogRm9yIGxpY2Vuc2luZyBpbmZvcm1hdGlvbiwgc2VlIHRoZSBmaWxlICdMSUNFTkNFJyBpbiB0aGlzIGRpcmVjdG9yeS4KICAqCi0gKiAkSWQ6IG5vZGVtZ210LmMsdiAxLjEyNyAyMDA1LzA5LzIwIDE1OjQ5OjEyIGRlZGVraW5kIEV4cCAkCi0gKgogICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KQEAgLTE3Miw2ICsxNzAsMTEgQEAKIHN0YXRpYyB2b2lkIGpmZnMyX2Nsb3NlX25leHRibG9jayhzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX2VyYXNlYmxvY2sgKmplYikKIHsKIAorCWlmIChjLT5uZXh0YmxvY2sgPT0gTlVMTCkgeworCQlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfY2xvc2VfbmV4dGJsb2NrOiBFcmFzZSBibG9jayBhdCAweCUwOHggaGFzIGFscmVhZHkgYmVlbiBwbGFjZWQgaW4gYSBsaXN0XG4iLAorCQkgIGplYi0+b2Zmc2V0KSk7CisJCXJldHVybjsKKwl9CiAJLyogQ2hlY2ssIGlmIHdlIGhhdmUgYSBkaXJ0eSBibG9jayBub3csIG9yIGlmIGl0IHdhcyBkaXJ0eSBhbHJlYWR5ICovCiAJaWYgKElTRElSVFkgKGplYi0+d2FzdGVkX3NpemUgKyBqZWItPmRpcnR5X3NpemUpKSB7CiAJCWMtPmRpcnR5X3NpemUgKz0gamViLT53YXN0ZWRfc2l6ZTsKZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL29zLWxpbnV4LmggYi9mcy9qZmZzMi9vcy1saW51eC5oCmluZGV4IGUwN2EwZWQuLjgwZGFlYTkgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL29zLWxpbnV4LmgKKysrIGIvZnMvamZmczIvb3MtbGludXguaApAQCAtMSwxNCArMSwxMiBAQAogLyoKICAqIEpGRlMyIC0tIEpvdXJuYWxsaW5nIEZsYXNoIEZpbGUgU3lzdGVtLCBWZXJzaW9uIDIuCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDMgUmVkIEhhdCwgSW5jLgorICogQ29weXJpZ2h0IMKpIDIwMDEtMjAwNyBSZWQgSGF0LCBJbmMuCiAgKgogICogQ3JlYXRlZCBieSBEYXZpZCBXb29kaG91c2UgPGR3bXcyQGluZnJhZGVhZC5vcmc+CiAgKgogICogRm9yIGxpY2Vuc2luZyBpbmZvcm1hdGlvbiwgc2VlIHRoZSBmaWxlICdMSUNFTkNFJyBpbiB0aGlzIGRpcmVjdG9yeS4KICAqCi0gKiAkSWQ6IG9zLWxpbnV4LmgsdiAxLjY0IDIwMDUvMDkvMzAgMTM6NTk6MTMgZGVkZWtpbmQgRXhwICQKLSAqCiAgKi8KIAogI2lmbmRlZiBfX0pGRlMyX09TX0xJTlVYX0hfXwpAQCAtOTgsNiArOTYsOSBAQAogI2RlZmluZSBqZmZzMl9ub3Jfd2J1Zl9mbGFzaChjKSAoMCkKICNkZWZpbmUgamZmczJfbm9yX3didWZfZmxhc2hfc2V0dXAoYykgKDApCiAjZGVmaW5lIGpmZnMyX25vcl93YnVmX2ZsYXNoX2NsZWFudXAoYykgZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIGpmZnMyX3ViaXZvbChjKSAoMCkKKyNkZWZpbmUgamZmczJfdWJpdm9sX3NldHVwKGMpICgwKQorI2RlZmluZSBqZmZzMl91Yml2b2xfY2xlYW51cChjKSBkbyB7fSB3aGlsZSAoMCkKIAogI2Vsc2UgLyogTkFORCBhbmQvb3IgRUNDJ2QgTk9SIHN1cHBvcnQgcHJlc2VudCAqLwogCkBAIC0xMzMsNiArMTM0LDkgQEAKICNkZWZpbmUgamZmczJfZGF0YWZsYXNoKGMpIChjLT5tdGQtPnR5cGUgPT0gTVREX0RBVEFGTEFTSCkKIGludCBqZmZzMl9kYXRhZmxhc2hfc2V0dXAoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMpOwogdm9pZCBqZmZzMl9kYXRhZmxhc2hfY2xlYW51cChzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYyk7CisjZGVmaW5lIGpmZnMyX3ViaXZvbChjKSAoYy0+bXRkLT50eXBlID09IE1URF9VQklWT0xVTUUpCitpbnQgamZmczJfdWJpdm9sX3NldHVwKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjKTsKK3ZvaWQgamZmczJfdWJpdm9sX2NsZWFudXAoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMpOwogCiAjZGVmaW5lIGpmZnMyX25vcl93YnVmX2ZsYXNoKGMpIChjLT5tdGQtPnR5cGUgPT0gTVREX05PUkZMQVNIICYmICEgKGMtPm10ZC0+ZmxhZ3MgJiBNVERfQklUX1dSSVRFQUJMRSkpCiBpbnQgamZmczJfbm9yX3didWZfZmxhc2hfc2V0dXAoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMpOwpkaWZmIC0tZ2l0IGEvZnMvamZmczIvcHVzaHB1bGwuaCBiL2ZzL2pmZnMyL3B1c2hwdWxsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwYzJhOTEuLjAwMDAwMDAKLS0tIGEvZnMvamZmczIvcHVzaHB1bGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qCi0gKiBKRkZTMiAtLSBKb3VybmFsbGluZyBGbGFzaCBGaWxlIFN5c3RlbSwgVmVyc2lvbiAyLgotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiBSZWQgSGF0LCBJbmMuCi0gKgotICogQ3JlYXRlZCBieSBEYXZpZCBXb29kaG91c2UgPGR3bXcyQGluZnJhZGVhZC5vcmc+Ci0gKgotICogRm9yIGxpY2Vuc2luZyBpbmZvcm1hdGlvbiwgc2VlIHRoZSBmaWxlICdMSUNFTkNFJyBpbiB0aGlzIGRpcmVjdG9yeS4KLSAqCi0gKiAkSWQ6IHB1c2hwdWxsLmgsdiAxLjEwIDIwMDQvMTEvMTYgMjA6MzY6MTEgZHdtdzIgRXhwICQKLSAqCi0gKi8KLQotI2lmbmRlZiBfX1BVU0hQVUxMX0hfXwotI2RlZmluZSBfX1BVU0hQVUxMX0hfXwotCi0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLQotc3RydWN0IHB1c2hwdWxsIHsKLQl1bnNpZ25lZCBjaGFyICpidWY7Ci0JdW5zaWduZWQgaW50IGJ1ZmxlbjsKLQl1bnNpZ25lZCBpbnQgb2ZzOwotCXVuc2lnbmVkIGludCByZXNlcnZlOwotfTsKLQotCi1zdGF0aWMgaW5saW5lIHZvaWQgaW5pdF9wdXNocHVsbChzdHJ1Y3QgcHVzaHB1bGwgKnBwLCBjaGFyICpidWYsIHVuc2lnbmVkIGJ1ZmxlbiwgdW5zaWduZWQgb2ZzLCB1bnNpZ25lZCByZXNlcnZlKQotewotCXBwLT5idWYgPSBidWY7Ci0JcHAtPmJ1ZmxlbiA9IGJ1ZmxlbjsKLQlwcC0+b2ZzID0gb2ZzOwotCXBwLT5yZXNlcnZlID0gcmVzZXJ2ZTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgcHVzaGJpdChzdHJ1Y3QgcHVzaHB1bGwgKnBwLCBpbnQgYml0LCBpbnQgdXNlX3Jlc2VydmVkKQotewotCWlmIChwcC0+b2ZzID49IHBwLT5idWZsZW4gLSAodXNlX3Jlc2VydmVkPzA6cHAtPnJlc2VydmUpKSB7Ci0JCXJldHVybiAtRU5PU1BDOwotCX0KLQotCWlmIChiaXQpIHsKLQkJcHAtPmJ1ZltwcC0+b2ZzID4+IDNdIHw9ICgxPDwoNy0ocHAtPm9mcyAmNykpKTsKLQl9Ci0JZWxzZSB7Ci0JCXBwLT5idWZbcHAtPm9mcyA+PiAzXSAmPSB+KDE8PCg3LShwcC0+b2ZzICY3KSkpOwotCX0KLQlwcC0+b2ZzKys7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgcHVzaGVkYml0cyhzdHJ1Y3QgcHVzaHB1bGwgKnBwKQotewotCXJldHVybiBwcC0+b2ZzOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBwdWxsYml0KHN0cnVjdCBwdXNocHVsbCAqcHApCi17Ci0JaW50IGJpdDsKLQotCWJpdCA9IChwcC0+YnVmW3BwLT5vZnMgPj4gM10gPj4gKDctKHBwLT5vZnMgJiA3KSkpICYgMTsKLQotCXBwLT5vZnMrKzsKLQlyZXR1cm4gYml0OwotfQotCi1zdGF0aWMgaW5saW5lIGludCBwdWxsZWRiaXRzKHN0cnVjdCBwdXNocHVsbCAqcHApCi17Ci0JcmV0dXJuIHBwLT5vZnM7Ci19Ci0KLSNlbmRpZiAvKiBfX1BVU0hQVUxMX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMvamZmczIvcmVhZC5jIGIvZnMvamZmczIvcmVhZC5jCmluZGV4IGYzYjg2ZGEuLmNmZTA1YzEgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL3JlYWQuYworKysgYi9mcy9qZmZzMi9yZWFkLmMKQEAgLTEsMTQgKzEsMTIgQEAKIC8qCiAgKiBKRkZTMiAtLSBKb3VybmFsbGluZyBGbGFzaCBGaWxlIFN5c3RlbSwgVmVyc2lvbiAyLgogICoKLSAqIENvcHlyaWdodCAoQykgMjAwMS0yMDAzIFJlZCBIYXQsIEluYy4KKyAqIENvcHlyaWdodCDCqSAyMDAxLTIwMDcgUmVkIEhhdCwgSW5jLgogICoKICAqIENyZWF0ZWQgYnkgRGF2aWQgV29vZGhvdXNlIDxkd213MkBpbmZyYWRlYWQub3JnPgogICoKICAqIEZvciBsaWNlbnNpbmcgaW5mb3JtYXRpb24sIHNlZSB0aGUgZmlsZSAnTElDRU5DRScgaW4gdGhpcyBkaXJlY3RvcnkuCiAgKgotICogJElkOiByZWFkLmMsdiAxLjQyIDIwMDUvMTEvMDcgMTE6MTQ6NDEgZ2xlaXhuZXIgRXhwICQKLSAqCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpkaWZmIC0tZ2l0IGEvZnMvamZmczIvcmVhZGlub2RlLmMgYi9mcy9qZmZzMi9yZWFkaW5vZGUuYwppbmRleCA3MTdhNDhjLi42YWZmMzg5IDEwMDY0NAotLS0gYS9mcy9qZmZzMi9yZWFkaW5vZGUuYworKysgYi9mcy9qZmZzMi9yZWFkaW5vZGUuYwpAQCAtMSwxNCArMSwxMiBAQAogLyoKICAqIEpGRlMyIC0tIEpvdXJuYWxsaW5nIEZsYXNoIEZpbGUgU3lzdGVtLCBWZXJzaW9uIDIuCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDMgUmVkIEhhdCwgSW5jLgorICogQ29weXJpZ2h0IMKpIDIwMDEtMjAwNyBSZWQgSGF0LCBJbmMuCiAgKgogICogQ3JlYXRlZCBieSBEYXZpZCBXb29kaG91c2UgPGR3bXcyQGluZnJhZGVhZC5vcmc+CiAgKgogICogRm9yIGxpY2Vuc2luZyBpbmZvcm1hdGlvbiwgc2VlIHRoZSBmaWxlICdMSUNFTkNFJyBpbiB0aGlzIGRpcmVjdG9yeS4KICAqCi0gKiAkSWQ6IHJlYWRpbm9kZS5jLHYgMS4xNDMgMjAwNS8xMS8wNyAxMToxNDo0MSBnbGVpeG5lciBFeHAgJAotICoKICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CkBAIC0yMiwzMCArMjAsNTEwIEBACiAjaW5jbHVkZSAibm9kZWxpc3QuaCIKIAogLyoKLSAqIFB1dCBhIG5ldyB0bXBfZG5vZGVfaW5mbyBpbnRvIHRoZSB0ZW1wb3JhdHkgUkItdHJlZSwga2VlcGluZyB0aGUgbGlzdCBpbgotICogb3JkZXIgb2YgaW5jcmVhc2luZyB2ZXJzaW9uLgorICogQ2hlY2sgdGhlIGRhdGEgQ1JDIG9mIHRoZSBub2RlLgorICoKKyAqIFJldHVybnM6IDAgaWYgdGhlIGRhdGEgQ1JDIGlzIGNvcnJlY3Q7CisgKiAJICAgIDEgLSBpZiBpbmNvcnJlY3Q7CisgKgkgICAgZXJyb3IgY29kZSBpZiBhbiBlcnJvciBvY2N1cmVkLgogICovCi1zdGF0aWMgdm9pZCBqZmZzMl9hZGRfdG5fdG9fdHJlZShzdHJ1Y3QgamZmczJfdG1wX2Rub2RlX2luZm8gKnRuLCBzdHJ1Y3QgcmJfcm9vdCAqbGlzdCkKK3N0YXRpYyBpbnQgY2hlY2tfbm9kZV9kYXRhKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfdG1wX2Rub2RlX2luZm8gKnRuKQogewotCXN0cnVjdCByYl9ub2RlICoqcCA9ICZsaXN0LT5yYl9ub2RlOwotCXN0cnVjdCByYl9ub2RlICogcGFyZW50ID0gTlVMTDsKLQlzdHJ1Y3QgamZmczJfdG1wX2Rub2RlX2luZm8gKnRoaXM7CisJc3RydWN0IGpmZnMyX3Jhd19ub2RlX3JlZiAqcmVmID0gdG4tPmZuLT5yYXc7CisJaW50IGVyciA9IDAsIHBvaW50ZWQgPSAwOworCXN0cnVjdCBqZmZzMl9lcmFzZWJsb2NrICpqZWI7CisJdW5zaWduZWQgY2hhciAqYnVmZmVyOworCXVpbnQzMl90IGNyYywgb2ZzLCBsZW47CisJc2l6ZV90IHJldGxlbjsKIAotCXdoaWxlICgqcCkgewotCQlwYXJlbnQgPSAqcDsKLQkJdGhpcyA9IHJiX2VudHJ5KHBhcmVudCwgc3RydWN0IGpmZnMyX3RtcF9kbm9kZV9pbmZvLCByYik7CisJQlVHX09OKHRuLT5jc2l6ZSA9PSAwKTsKIAotCQkvKiBUaGVyZSBtYXkgYWN0dWFsbHkgYmUgYSBjb2xsaXNpb24gaGVyZSwgYnV0IGl0IGRvZXNuJ3QKLQkJICAgYWN0dWFsbHkgbWF0dGVyLiBBcyBsb25nIGFzIHRoZSB0d28gbm9kZXMgd2l0aCB0aGUgc2FtZQotCQkgICB2ZXJzaW9uIGFyZSB0b2dldGhlciwgaXQncyBhbGwgZmluZS4gKi8KLQkJaWYgKHRuLT52ZXJzaW9uID4gdGhpcy0+dmVyc2lvbikKLQkJCXAgPSAmKCpwKS0+cmJfbGVmdDsKLQkJZWxzZQotCQkJcCA9ICYoKnApLT5yYl9yaWdodDsKKwlpZiAoIWpmZnMyX2lzX3dyaXRlYnVmZmVyZWQoYykpCisJCWdvdG8gYWRqX2FjYzsKKworCS8qIENhbGN1bGF0ZSBob3cgbWFueSBieXRlcyB3ZXJlIGFscmVhZHkgY2hlY2tlZCAqLworCW9mcyA9IHJlZl9vZmZzZXQocmVmKSArIHNpemVvZihzdHJ1Y3QgamZmczJfcmF3X2lub2RlKTsKKwlsZW4gPSBvZnMgJSBjLT53YnVmX3BhZ2VzaXplOworCWlmIChsaWtlbHkobGVuKSkKKwkJbGVuID0gYy0+d2J1Zl9wYWdlc2l6ZSAtIGxlbjsKKworCWlmIChsZW4gPj0gdG4tPmNzaXplKSB7CisJCWRiZ19yZWFkaW5vZGUoIm5vIG5lZWQgdG8gY2hlY2sgbm9kZSBhdCAlIzA4eCwgZGF0YSBsZW5ndGggJXUsIGRhdGEgc3RhcnRzIGF0ICUjMDh4IC0gaXQgaGFzIGFscmVhZHkgYmVlbiBjaGVja2VkLlxuIiwKKwkJCXJlZl9vZmZzZXQocmVmKSwgdG4tPmNzaXplLCBvZnMpOworCQlnb3RvIGFkal9hY2M7CiAJfQogCi0JcmJfbGlua19ub2RlKCZ0bi0+cmIsIHBhcmVudCwgcCk7Ci0JcmJfaW5zZXJ0X2NvbG9yKCZ0bi0+cmIsIGxpc3QpOworCW9mcyArPSBsZW47CisJbGVuID0gdG4tPmNzaXplIC0gbGVuOworCisJZGJnX3JlYWRpbm9kZSgiY2hlY2sgbm9kZSBhdCAlIzA4eCwgZGF0YSBsZW5ndGggJXUsIHBhcnRpYWwgQ1JDICUjMDh4LCBjb3JyZWN0IENSQyAlIzA4eCwgZGF0YSBzdGFydHMgYXQgJSMwOHgsIHN0YXJ0IGNoZWNraW5nIGZyb20gJSMwOHggLSAldSBieXRlcy5cbiIsCisJCXJlZl9vZmZzZXQocmVmKSwgdG4tPmNzaXplLCB0bi0+cGFydGlhbF9jcmMsIHRuLT5kYXRhX2NyYywgb2ZzIC0gbGVuLCBvZnMsIGxlbik7CisKKyNpZm5kZWYgX19FQ09TCisJLyogVE9ETzogaW5zdGVhZCwgaW5jYXBzdWxhdGUgcG9pbnQoKSBzdHVmZiB0byBqZmZzMl9mbGFzaF9yZWFkKCksCisJICogYWRkaW5nIGFuZCBqZmZzMl9mbGFzaF9yZWFkX2VuZCgpIGludGVyZmFjZS4gKi8KKwlpZiAoYy0+bXRkLT5wb2ludCkgeworCQllcnIgPSBjLT5tdGQtPnBvaW50KGMtPm10ZCwgb2ZzLCBsZW4sICZyZXRsZW4sICZidWZmZXIpOworCQlpZiAoIWVyciAmJiByZXRsZW4gPCB0bi0+Y3NpemUpIHsKKwkJCUpGRlMyX1dBUk5JTkcoIk1URCBwb2ludCByZXR1cm5lZCBsZW4gdG9vIHNob3J0OiAlenUgaW5zdGVhZCBvZiAldS5cbiIsIHJldGxlbiwgdG4tPmNzaXplKTsKKwkJCWMtPm10ZC0+dW5wb2ludChjLT5tdGQsIGJ1ZmZlciwgb2ZzLCBsZW4pOworCQl9IGVsc2UgaWYgKGVycikKKwkJCUpGRlMyX1dBUk5JTkcoIk1URCBwb2ludCBmYWlsZWQ6IGVycm9yIGNvZGUgJWQuXG4iLCBlcnIpOworCQllbHNlCisJCQlwb2ludGVkID0gMTsgLyogc3VjY2VmdWxseSBwb2ludGVkIHRvIGRldmljZSAqLworCX0KKyNlbmRpZgorCisJaWYgKCFwb2ludGVkKSB7CisJCWJ1ZmZlciA9IGttYWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKKwkJaWYgKHVubGlrZWx5KCFidWZmZXIpKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJLyogVE9ETzogdGhpcyBpcyB2ZXJ5IGZyZXF1ZW50IHBhdHRlcm4sIG1ha2UgaXQgYSBzZXBhcmF0ZQorCQkgKiByb3V0aW5lICovCisJCWVyciA9IGpmZnMyX2ZsYXNoX3JlYWQoYywgb2ZzLCBsZW4sICZyZXRsZW4sIGJ1ZmZlcik7CisJCWlmIChlcnIpIHsKKwkJCUpGRlMyX0VSUk9SKCJjYW4gbm90IHJlYWQgJWQgYnl0ZXMgZnJvbSAweCUwOHgsIGVycm9yIGNvZGU6ICVkLlxuIiwgbGVuLCBvZnMsIGVycik7CisJCQlnb3RvIGZyZWVfb3V0OworCQl9CisKKwkJaWYgKHJldGxlbiAhPSBsZW4pIHsKKwkJCUpGRlMyX0VSUk9SKCJzaG9ydCByZWFkIGF0ICUjMDh4OiAlemQgaW5zdGVhZCBvZiAlZC5cbiIsIG9mcywgcmV0bGVuLCBsZW4pOworCQkJZXJyID0gLUVJTzsKKwkJCWdvdG8gZnJlZV9vdXQ7CisJCX0KKwl9CisKKwkvKiBDb250aW51ZSBjYWxjdWxhdGluZyBDUkMgKi8KKwljcmMgPSBjcmMzMih0bi0+cGFydGlhbF9jcmMsIGJ1ZmZlciwgbGVuKTsKKwlpZighcG9pbnRlZCkKKwkJa2ZyZWUoYnVmZmVyKTsKKyNpZm5kZWYgX19FQ09TCisJZWxzZQorCQljLT5tdGQtPnVucG9pbnQoYy0+bXRkLCBidWZmZXIsIG9mcywgbGVuKTsKKyNlbmRpZgorCisJaWYgKGNyYyAhPSB0bi0+ZGF0YV9jcmMpIHsKKwkJSkZGUzJfTk9USUNFKCJ3cm9uZyBkYXRhIENSQyBpbiBkYXRhIG5vZGUgYXQgMHglMDh4OiByZWFkICUjMDh4LCBjYWxjdWxhdGVkICUjMDh4LlxuIiwKKwkJCW9mcywgdG4tPmRhdGFfY3JjLCBjcmMpOworCQlyZXR1cm4gMTsKKwl9CisKK2Fkal9hY2M6CisJamViID0gJmMtPmJsb2Nrc1tyZWYtPmZsYXNoX29mZnNldCAvIGMtPnNlY3Rvcl9zaXplXTsKKwlsZW4gPSByZWZfdG90bGVuKGMsIGplYiwgcmVmKTsKKwkvKiBJZiBpdCBzaG91bGQgYmUgUkVGX05PUk1BTCwgaXQnbGwgZ2V0IG1hcmtlZCBhcyBzdWNoIHdoZW4KKwkgICB3ZSBidWlsZCB0aGUgZnJhZ3RyZWUsIHNob3J0bHkuIE5vIG5lZWQgdG8gd29ycnkgYWJvdXQgR0MKKwkgICBtb3ZpbmcgaXQgd2hpbGUgaXQncyBtYXJrZWQgUkVGX1BSSVNUSU5FIC0tIEdDIHdvbid0IGhhcHBlbgorCSAgIHRpbGwgd2UndmUgZmluaXNoZWQgY2hlY2tpbmcgZXZlcnkgaW5vZGUgYW55d2F5LiAqLworCXJlZi0+Zmxhc2hfb2Zmc2V0IHw9IFJFRl9QUklTVElORTsKKwkvKgorCSAqIE1hcmsgdGhlIG5vZGUgYXMgaGF2aW5nIGJlZW4gY2hlY2tlZCBhbmQgZml4IHRoZQorCSAqIGFjY291bnRpbmcgYWNjb3JkaW5nbHkuCisJICovCisJc3Bpbl9sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCWplYi0+dXNlZF9zaXplICs9IGxlbjsKKwlqZWItPnVuY2hlY2tlZF9zaXplIC09IGxlbjsKKwljLT51c2VkX3NpemUgKz0gbGVuOworCWMtPnVuY2hlY2tlZF9zaXplIC09IGxlbjsKKwlqZmZzMl9kYmdfYWNjdF9wYXJhbm9pYV9jaGVja19ub2xvY2soYywgamViKTsKKwlzcGluX3VubG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKKworCXJldHVybiAwOworCitmcmVlX291dDoKKwlpZighcG9pbnRlZCkKKwkJa2ZyZWUoYnVmZmVyKTsKKyNpZm5kZWYgX19FQ09TCisJZWxzZQorCQljLT5tdGQtPnVucG9pbnQoYy0+bXRkLCBidWZmZXIsIG9mcywgbGVuKTsKKyNlbmRpZgorCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBIZWxwZXIgZnVuY3Rpb24gZm9yIGpmZnMyX2FkZF9vbGRlcl9mcmFnX3RvX2ZyYWd0cmVlKCkuCisgKgorICogQ2hlY2tzIHRoZSBub2RlIGlmIHdlIGFyZSBpbiB0aGUgY2hlY2tpbmcgc3RhZ2UuCisgKi8KK3N0YXRpYyBpbnQgY2hlY2tfdG5fbm9kZShzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX3RtcF9kbm9kZV9pbmZvICp0bikKK3sKKwlpbnQgcmV0OworCisJQlVHX09OKHJlZl9vYnNvbGV0ZSh0bi0+Zm4tPnJhdykpOworCisJLyogV2Ugb25seSBjaGVjayB0aGUgZGF0YSBDUkMgb2YgdW5jaGVja2VkIG5vZGVzICovCisJaWYgKHJlZl9mbGFncyh0bi0+Zm4tPnJhdykgIT0gUkVGX1VOQ0hFQ0tFRCkKKwkJcmV0dXJuIDA7CisKKwlkYmdfcmVhZGlub2RlKCJjaGVjayBub2RlICUjMDR4LSUjMDR4LCBwaHlzIG9mZnMgJSMwOHhcbiIsCisJCSAgICAgIHRuLT5mbi0+b2ZzLCB0bi0+Zm4tPm9mcyArIHRuLT5mbi0+c2l6ZSwgcmVmX29mZnNldCh0bi0+Zm4tPnJhdykpOworCisJcmV0ID0gY2hlY2tfbm9kZV9kYXRhKGMsIHRuKTsKKwlpZiAodW5saWtlbHkocmV0IDwgMCkpIHsKKwkJSkZGUzJfRVJST1IoImNoZWNrX25vZGVfZGF0YSgpIHJldHVybmVkIGVycm9yOiAlZC5cbiIsCisJCQlyZXQpOworCX0gZWxzZSBpZiAodW5saWtlbHkocmV0ID4gMCkpIHsKKwkJZGJnX3JlYWRpbm9kZSgiQ1JDIGVycm9yLCBtYXJrIGl0IG9ic29sZXRlLlxuIik7CisJCWpmZnMyX21hcmtfbm9kZV9vYnNvbGV0ZShjLCB0bi0+Zm4tPnJhdyk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBqZmZzMl90bXBfZG5vZGVfaW5mbyAqamZmczJfbG9va3VwX3RuKHN0cnVjdCByYl9yb290ICp0bl9yb290LCB1aW50MzJfdCBvZmZzZXQpCit7CisJc3RydWN0IHJiX25vZGUgKm5leHQ7CisJc3RydWN0IGpmZnMyX3RtcF9kbm9kZV9pbmZvICp0biA9IE5VTEw7CisKKwlkYmdfcmVhZGlub2RlKCJyb290ICVwLCBvZmZzZXQgJWRcbiIsIHRuX3Jvb3QsIG9mZnNldCk7CisKKwluZXh0ID0gdG5fcm9vdC0+cmJfbm9kZTsKKworCXdoaWxlIChuZXh0KSB7CisJCXRuID0gcmJfZW50cnkobmV4dCwgc3RydWN0IGpmZnMyX3RtcF9kbm9kZV9pbmZvLCByYik7CisKKwkJaWYgKHRuLT5mbi0+b2ZzIDwgb2Zmc2V0KQorCQkJbmV4dCA9IHRuLT5yYi5yYl9yaWdodDsKKwkJZWxzZSBpZiAodG4tPmZuLT5vZnMgPj0gb2Zmc2V0KQorCQkJbmV4dCA9IHRuLT5yYi5yYl9sZWZ0OworCQllbHNlCisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gdG47Cit9CisKKworc3RhdGljIHZvaWQgamZmczJfa2lsbF90bihzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX3RtcF9kbm9kZV9pbmZvICp0bikKK3sKKwlqZmZzMl9tYXJrX25vZGVfb2Jzb2xldGUoYywgdG4tPmZuLT5yYXcpOworCWpmZnMyX2ZyZWVfZnVsbF9kbm9kZSh0bi0+Zm4pOworCWpmZnMyX2ZyZWVfdG1wX2Rub2RlX2luZm8odG4pOworfQorLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB3aGVuIHdlIHJlYWQgYW4gaW5vZGUuIERhdGEgbm9kZXMgYXJyaXZlIGluCisgKiBhcmJpdHJhcnkgb3JkZXIgLS0gdGhleSBtYXkgYmUgb2xkZXIgb3IgbmV3ZXIgdGhhbiB0aGUgbm9kZXMgd2hpY2gKKyAqIGFyZSBhbHJlYWR5IGluIHRoZSB0cmVlLiBXaGVyZSBvdmVybGFwcyBvY2N1ciwgdGhlIG9sZGVyIG5vZGUgY2FuCisgKiBiZSBkaXNjYXJkZWQgYXMgbG9uZyBhcyB0aGUgbmV3ZXIgcGFzc2VzIHRoZSBDUkMgY2hlY2suIFdlIGRvbid0CisgKiBib3RoZXIgdG8ga2VlcCB0cmFjayBvZiBob2xlcyBpbiB0aGlzIHJidHJlZSwgYW5kIG5laXRoZXIgZG8gd2UgZGVhbAorICogd2l0aCBmcmFncyAtLSB3ZSBjYW4gaGF2ZSBtdWx0aXBsZSBlbnRyaWVzIHN0YXJ0aW5nIGF0IHRoZSBzYW1lCisgKiBvZmZzZXQsIGFuZCB0aGUgb25lIHdpdGggdGhlIHNtYWxsZXN0IGxlbmd0aCB3aWxsIGNvbWUgZmlyc3QgaW4gdGhlCisgKiBvcmRlcmluZy4KKyAqCisgKiBSZXR1cm5zIDAgaWYgdGhlIG5vZGUgd2FzIGluc2VydGVkCisgKiAgICAgICAgIDEgaWYgdGhlIG5vZGUgaXMgb2Jzb2xldGUgKGJlY2F1c2Ugd2UgY2FuJ3QgbWFyayBpdCBzbyB5ZXQpCisgKiAgICAgICAgIDwgMCBhbiBpZiBlcnJvciBvY2N1cnJlZAorICovCitzdGF0aWMgaW50IGpmZnMyX2FkZF90bl90b190cmVlKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLAorCQkJCXN0cnVjdCBqZmZzMl9yZWFkaW5vZGVfaW5mbyAqcmlpLAorCQkJCXN0cnVjdCBqZmZzMl90bXBfZG5vZGVfaW5mbyAqdG4pCit7CisJdWludDMyX3QgZm5fZW5kID0gdG4tPmZuLT5vZnMgKyB0bi0+Zm4tPnNpemU7CisJc3RydWN0IGpmZnMyX3RtcF9kbm9kZV9pbmZvICppbnNlcnRfcG9pbnQgPSBOVUxMLCAqdGhpczsKKworCWRiZ19yZWFkaW5vZGUoImluc2VydCBmcmFnbWVudCAlIzA0eC0lIzA0eCwgdmVyICV1XG4iLCB0bi0+Zm4tPm9mcywgZm5fZW5kLCB0bi0+dmVyc2lvbik7CisKKwkvKiBJZiBhIG5vZGUgaGFzIHplcm8gZHNpemUsIHdlIG9ubHkgaGF2ZSB0byBrZWVwIGlmIGl0IGlmIGl0IG1pZ2h0IGJlIHRoZQorCSAgIG5vZGUgd2l0aCBoaWdoZXN0IHZlcnNpb24gLS0gaS5lLiB0aGUgb25lIHdoaWNoIHdpbGwgZW5kIHVwIGFzIGYtPm1ldGFkYXRhLgorCSAgIE5vdGUgdGhhdCBzdWNoIG5vZGVzIHdvbid0IGJlIFJFRl9VTkNIRUNLRUQgc2luY2UgdGhlcmUgYXJlIG5vIGRhdGEgdG8KKwkgICBjaGVjayBhbnl3YXkuICovCisJaWYgKCF0bi0+Zm4tPnNpemUpIHsKKwkJaWYgKHJpaS0+bWRhdGFfdG4pIHsKKwkJCS8qIFdlIGhhZCBhIGNhbmRpZGF0ZSBtZGF0YSBub2RlIGFscmVhZHkgKi8KKwkJCWRiZ19yZWFkaW5vZGUoImtpbGwgb2xkIG1kYXRhIHdpdGggdmVyICVkXG4iLCByaWktPm1kYXRhX3RuLT52ZXJzaW9uKTsKKwkJCWpmZnMyX2tpbGxfdG4oYywgcmlpLT5tZGF0YV90bik7CisJCX0KKwkJcmlpLT5tZGF0YV90biA9IHRuOworCQlkYmdfcmVhZGlub2RlKCJrZWVwIG5ldyBtZGF0YSB3aXRoIHZlciAlZFxuIiwgdG4tPnZlcnNpb24pOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBGaW5kIHRoZSBlYXJsaWVzdCBub2RlIHdoaWNoIF9tYXlfIGJlIHJlbGV2YW50IHRvIHRoaXMgb25lICovCisJdGhpcyA9IGpmZnMyX2xvb2t1cF90bigmcmlpLT50bl9yb290LCB0bi0+Zm4tPm9mcyk7CisJaWYgKCF0aGlzKSB7CisJCS8qIEZpcnN0IGFkZGl0aW9uIHRvIGVtcHR5IHRyZWUuICRERUlUWSBob3cgSSBsb3ZlIHRoZSBlYXN5IGNhc2VzICovCisJCXJiX2xpbmtfbm9kZSgmdG4tPnJiLCBOVUxMLCAmcmlpLT50bl9yb290LnJiX25vZGUpOworCQlyYl9pbnNlcnRfY29sb3IoJnRuLT5yYiwgJnJpaS0+dG5fcm9vdCk7CisJCWRiZ19yZWFkaW5vZGUoImtlZXAgbmV3IGZyYWdcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBJZiB3ZSBhZGQgYSBuZXcgbm9kZSBpdCdsbCBiZSBzb21ld2hlcmUgdW5kZXIgaGVyZS4gKi8KKwlpbnNlcnRfcG9pbnQgPSB0aGlzOworCisJLyogSWYgdGhlIG5vZGUgaXMgY29pbmNpZGVudCB3aXRoIGFub3RoZXIgYXQgYSBsb3dlciBhZGRyZXNzLAorCSAgIGJhY2sgdXAgdW50aWwgdGhlIG90aGVyIG5vZGUgaXMgZm91bmQuIEl0IG1heSBiZSByZWxldmFudCAqLworCXdoaWxlICh0bi0+b3ZlcmxhcHBlZCkKKwkJdG4gPSB0bl9wcmV2KHRuKTsKKworCWRiZ19yZWFkaW5vZGUoIid0aGlzJyBmb3VuZCAlIzA0eC0lIzA0eCAoJXMpXG4iLCB0aGlzLT5mbi0+b2ZzLCB0aGlzLT5mbi0+b2ZzICsgdGhpcy0+Zm4tPnNpemUsIHRoaXMtPmZuID8gImRhdGEiIDogImhvbGUiKTsKKworCXdoaWxlICh0aGlzKSB7CisJCWlmICh0aGlzLT5mbi0+b2ZzID4gZm5fZW5kKQorCQkJYnJlYWs7CisJCWRiZ19yZWFkaW5vZGUoIlBvbmRlciB0aGlzIHZlciAlZCwgMHgleC0weCV4XG4iLAorCQkJICAgICAgdGhpcy0+dmVyc2lvbiwgdGhpcy0+Zm4tPm9mcywgdGhpcy0+Zm4tPnNpemUpOworCisJCWlmICh0aGlzLT52ZXJzaW9uID09IHRuLT52ZXJzaW9uKSB7CisJCQkvKiBWZXJzaW9uIG51bWJlciBjb2xsaXNpb24gbWVhbnMgUkVGX1BSSVNUSU5FIEdDLiBBY2NlcHQgZWl0aGVyIG9mIHRoZW0KKwkJCSAgIGFzIGxvbmcgYXMgdGhlIENSQyBpcyBjb3JyZWN0LiBDaGVjayB0aGUgb25lIHdlIGhhdmUgYWxyZWFkeS4uLiAgKi8KKwkJCWlmICghY2hlY2tfdG5fbm9kZShjLCB0aGlzKSkgeworCQkJCS8qIFRoZSBvbmUgd2UgYWxyZWFkeSBoYWQgd2FzIE9LLiBLZWVwIGl0IGFuZCB0aHJvdyBhd2F5IHRoZSBuZXcgb25lICovCisJCQkJZGJnX3JlYWRpbm9kZSgiTGlrZSBvbGQgbm9kZS4gVGhyb3cgYXdheSBuZXdcbiIpOworCQkJCWpmZnMyX2tpbGxfdG4oYywgdG4pOworCQkJCXJldHVybiAwOworCQkJfSBlbHNlIHsKKwkJCQkvKiBXaG8gY2FyZXMgaWYgdGhlIG5ldyBvbmUgaXMgZ29vZDsga2VlcCBpdCBmb3Igbm93IGFueXdheS4gKi8KKwkJCQlyYl9yZXBsYWNlX25vZGUoJnRoaXMtPnJiLCAmdG4tPnJiLCAmcmlpLT50bl9yb290KTsKKwkJCQkvKiBTYW1lIG92ZXJsYXBwaW5nIGZyb20gaW4gZnJvbnQgYW5kIGJlaGluZCAqLworCQkJCXRuLT5vdmVybGFwcGVkID0gdGhpcy0+b3ZlcmxhcHBlZDsKKwkJCQlqZmZzMl9raWxsX3RuKGMsIHRoaXMpOworCQkJCWRiZ19yZWFkaW5vZGUoIkxpa2UgbmV3IG5vZGUuIFRocm93IGF3YXkgb2xkXG4iKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCQlpZiAodGhpcy0+dmVyc2lvbiA8IHRuLT52ZXJzaW9uICYmCisJCSAgICB0aGlzLT5mbi0+b2ZzID49IHRuLT5mbi0+b2ZzICYmCisJCSAgICB0aGlzLT5mbi0+b2ZzICsgdGhpcy0+Zm4tPnNpemUgPD0gZm5fZW5kKSB7CisJCQkvKiBOZXcgbm9kZSBlbnRpcmVseSBvdmVybGFwcyAndGhpcycgKi8KKwkJCWlmIChjaGVja190bl9ub2RlKGMsIHRuKSkgeworCQkJCWRiZ19yZWFkaW5vZGUoIm5ldyBub2RlIGJhZCBDUkNcbiIpOworCQkJCWpmZnMyX2tpbGxfdG4oYywgdG4pOworCQkJCXJldHVybiAwOworCQkJfQorCQkJLyogLi4uIGFuZCBpcyBnb29kLiBLaWxsICd0aGlzJy4uLiAqLworCQkJcmJfcmVwbGFjZV9ub2RlKCZ0aGlzLT5yYiwgJnRuLT5yYiwgJnJpaS0+dG5fcm9vdCk7CisJCQl0bi0+b3ZlcmxhcHBlZCA9IHRoaXMtPm92ZXJsYXBwZWQ7CisJCQlqZmZzMl9raWxsX3RuKGMsIHRoaXMpOworCQkJLyogLi4uIGFuZCBhbnkgc3Vic2VxdWVudCBub2RlcyB3aGljaCBhcmUgYWxzbyBvdmVybGFwcGVkICovCisJCQl0aGlzID0gdG5fbmV4dCh0bik7CisJCQl3aGlsZSAodGhpcyAmJiB0aGlzLT5mbi0+b2ZzICsgdGhpcy0+Zm4tPnNpemUgPCBmbl9lbmQpIHsKKwkJCQlzdHJ1Y3QgamZmczJfdG1wX2Rub2RlX2luZm8gKm5leHQgPSB0bl9uZXh0KHRoaXMpOworCQkJCWlmICh0aGlzLT52ZXJzaW9uIDwgdG4tPnZlcnNpb24pIHsKKwkJCQkJdG5fZXJhc2UodGhpcywgJnJpaS0+dG5fcm9vdCk7CisJCQkJCWRiZ19yZWFkaW5vZGUoIktpbGwgb3ZlcmxhcHBlZCB2ZXIgJWQsIDB4JXgtMHgleFxuIiwKKwkJCQkJCSAgICAgIHRoaXMtPnZlcnNpb24sIHRoaXMtPmZuLT5vZnMsCisJCQkJCQkgICAgICB0aGlzLT5mbi0+b2ZzK3RoaXMtPmZuLT5zaXplKTsKKwkJCQkJamZmczJfa2lsbF90bihjLCB0aGlzKTsKKwkJCQl9CisJCQkJdGhpcyA9IG5leHQ7CisJCQl9CisJCQlkYmdfcmVhZGlub2RlKCJEb25lIGluc2VydGluZyBuZXdcbiIpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKHRoaXMtPnZlcnNpb24gPiB0bi0+dmVyc2lvbiAmJgorCQkgICAgdGhpcy0+Zm4tPm9mcyA8PSB0bi0+Zm4tPm9mcyAmJgorCQkgICAgdGhpcy0+Zm4tPm9mcyt0aGlzLT5mbi0+c2l6ZSA+PSBmbl9lbmQpIHsKKwkJCS8qIE5ldyBub2RlIGVudGlyZWx5IG92ZXJsYXBwZWQgYnkgJ3RoaXMnICovCisJCQlpZiAoIWNoZWNrX3RuX25vZGUoYywgdGhpcykpIHsKKwkJCQlkYmdfcmVhZGlub2RlKCJHb29kIENSQyBvbiBvbGQgbm9kZS4gS2lsbCBuZXdcbiIpOworCQkJCWpmZnMyX2tpbGxfdG4oYywgdG4pOworCQkJCXJldHVybiAwOworCQkJfQorCQkJLyogLi4uIGJ1dCAndGhpcycgd2FzIGJhZC4gUmVwbGFjZSBpdC4uLiAqLworCQkJcmJfcmVwbGFjZV9ub2RlKCZ0aGlzLT5yYiwgJnRuLT5yYiwgJnJpaS0+dG5fcm9vdCk7CisJCQlkYmdfcmVhZGlub2RlKCJCYWQgQ1JDIG9uIG9sZCBvdmVybGFwcGluZyBub2RlLiBLaWxsIGl0XG4iKTsKKwkJCWpmZnMyX2tpbGxfdG4oYywgdGhpcyk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQkvKiBXZSB3YW50IHRvIGJlIGluc2VydGVkIHVuZGVyIHRoZSBsYXN0IG5vZGUgd2hpY2ggaXMKKwkJICAgZWl0aGVyIGF0IGEgbG93ZXIgb2Zmc2V0IF9vcl8gaGFzIGEgc21hbGxlciByYW5nZSAqLworCQlpZiAodGhpcy0+Zm4tPm9mcyA8IHRuLT5mbi0+b2ZzIHx8CisJCSAgICAodGhpcy0+Zm4tPm9mcyA9PSB0bi0+Zm4tPm9mcyAmJgorCQkgICAgIHRoaXMtPmZuLT5zaXplIDw9IHRuLT5mbi0+c2l6ZSkpCisJCQlpbnNlcnRfcG9pbnQgPSB0aGlzOworCisJCXRoaXMgPSB0bl9uZXh0KHRoaXMpOworCX0KKwlkYmdfcmVhZGlub2RlKCJpbnNlcnRfcG9pbnQgJXAsIHZlciAlZCwgMHgleC0weCV4LCBvdiAlZFxuIiwKKwkJICAgICAgaW5zZXJ0X3BvaW50LCBpbnNlcnRfcG9pbnQtPnZlcnNpb24sIGluc2VydF9wb2ludC0+Zm4tPm9mcywKKwkJICAgICAgaW5zZXJ0X3BvaW50LT5mbi0+b2ZzK2luc2VydF9wb2ludC0+Zm4tPnNpemUsCisJCSAgICAgIGluc2VydF9wb2ludC0+b3ZlcmxhcHBlZCk7CisJLyogV2UgbmVpdGhlciBjb21wbGV0ZWx5IG9ic29sZXRlZCBub3Igd2VyZSBjb21wbGV0ZWx5CisJICAgb2Jzb2xldGVkIGJ5IGFuIGVhcmxpZXIgbm9kZS4gSW5zZXJ0IHVuZGVyIGluc2VydF9wb2ludCAqLworCXsKKwkJc3RydWN0IHJiX25vZGUgKnBhcmVudCA9ICZpbnNlcnRfcG9pbnQtPnJiOworCQlzdHJ1Y3QgcmJfbm9kZSAqKmxpbmsgPSAmcGFyZW50OworCisJCXdoaWxlICgqbGluaykgeworCQkJcGFyZW50ID0gKmxpbms7CisJCQlpbnNlcnRfcG9pbnQgPSByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCBqZmZzMl90bXBfZG5vZGVfaW5mbywgcmIpOworCQkJaWYgKHRuLT5mbi0+b2ZzID4gaW5zZXJ0X3BvaW50LT5mbi0+b2ZzKQorCQkJCWxpbmsgPSAmaW5zZXJ0X3BvaW50LT5yYi5yYl9yaWdodDsKKwkJCWVsc2UgaWYgKHRuLT5mbi0+b2ZzIDwgaW5zZXJ0X3BvaW50LT5mbi0+b2ZzIHx8CisJCQkJIHRuLT5mbi0+c2l6ZSA8IGluc2VydF9wb2ludC0+Zm4tPnNpemUpCisJCQkJbGluayA9ICZpbnNlcnRfcG9pbnQtPnJiLnJiX2xlZnQ7CisJCQllbHNlCisJCQkJbGluayA9ICZpbnNlcnRfcG9pbnQtPnJiLnJiX3JpZ2h0OworCQl9CisJCXJiX2xpbmtfbm9kZSgmdG4tPnJiLCAmaW5zZXJ0X3BvaW50LT5yYiwgbGluayk7CisJCXJiX2luc2VydF9jb2xvcigmdG4tPnJiLCAmcmlpLT50bl9yb290KTsKKwl9CisJLyogSWYgdGhlcmUncyBhbnl0aGluZyBiZWhpbmQgdGhhdCBvdmVybGFwcyB1cywgbm90ZSBpdCAqLworCXRoaXMgPSB0bl9wcmV2KHRuKTsKKwlpZiAodGhpcykgeworCQl3aGlsZSAoMSkgeworCQkJaWYgKHRoaXMtPmZuLT5vZnMgKyB0aGlzLT5mbi0+c2l6ZSA+IHRuLT5mbi0+b2ZzKSB7CisJCQkJZGJnX3JlYWRpbm9kZSgiTm9kZSBpcyBvdmVybGFwcGVkIGJ5ICVwICh2ICVkLCAweCV4LTB4JXgpXG4iLAorCQkJCQkgICAgICB0aGlzLCB0aGlzLT52ZXJzaW9uLCB0aGlzLT5mbi0+b2ZzLAorCQkJCQkgICAgICB0aGlzLT5mbi0+b2ZzK3RoaXMtPmZuLT5zaXplKTsKKwkJCQl0bi0+b3ZlcmxhcHBlZCA9IDE7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoIXRoaXMtPm92ZXJsYXBwZWQpCisJCQkJYnJlYWs7CisJCQl0aGlzID0gdG5fcHJldih0aGlzKTsKKwkJfQorCX0KKworCS8qIElmIHRoZSBuZXcgbm9kZSBvdmVybGFwcyBhbnl0aGluZyBhaGVhZCwgbm90ZSBpdCAqLworCXRoaXMgPSB0bl9uZXh0KHRuKTsKKwl3aGlsZSAodGhpcyAmJiB0aGlzLT5mbi0+b2ZzIDwgZm5fZW5kKSB7CisJCXRoaXMtPm92ZXJsYXBwZWQgPSAxOworCQlkYmdfcmVhZGlub2RlKCJOb2RlIHZlciAlZCwgMHgleC0weCV4IGlzIG92ZXJsYXBwZWRcbiIsCisJCQkgICAgICB0aGlzLT52ZXJzaW9uLCB0aGlzLT5mbi0+b2ZzLAorCQkJICAgICAgdGhpcy0+Zm4tPm9mcyt0aGlzLT5mbi0+c2l6ZSk7CisJCXRoaXMgPSB0bl9uZXh0KHRoaXMpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogVHJpdmlhbCBmdW5jdGlvbiB0byByZW1vdmUgdGhlIGxhc3Qgbm9kZSBpbiB0aGUgdHJlZS4gV2hpY2ggYnkgZGVmaW5pdGlvbgorICAgaGFzIG5vIHJpZ2h0LWhhbmQgLS0gc28gY2FuIGJlIHJlbW92ZWQganVzdCBieSBtYWtpbmcgaXRzIG9ubHkgY2hpbGQgKGlmCisgICBhbnkpIHRha2UgaXRzIHBsYWNlIHVuZGVyIGl0cyBwYXJlbnQuICovCitzdGF0aWMgdm9pZCBlYXRfbGFzdChzdHJ1Y3QgcmJfcm9vdCAqcm9vdCwgc3RydWN0IHJiX25vZGUgKm5vZGUpCit7CisJc3RydWN0IHJiX25vZGUgKnBhcmVudCA9IHJiX3BhcmVudChub2RlKTsKKwlzdHJ1Y3QgcmJfbm9kZSAqKmxpbms7CisKKwkvKiBMQVNUISAqLworCUJVR19PTihub2RlLT5yYl9yaWdodCk7CisKKwlpZiAoIXBhcmVudCkKKwkJbGluayA9ICZyb290LT5yYl9ub2RlOworCWVsc2UgaWYgKG5vZGUgPT0gcGFyZW50LT5yYl9sZWZ0KQorCQlsaW5rID0gJnBhcmVudC0+cmJfbGVmdDsKKwllbHNlCisJCWxpbmsgPSAmcGFyZW50LT5yYl9yaWdodDsKKworCSpsaW5rID0gbm9kZS0+cmJfbGVmdDsKKwkvKiBDb2xvdXIgZG9lc24ndCBtYXR0ZXIgbm93LiBPbmx5IHRoZSBwYXJlbnQgcG9pbnRlci4gKi8KKwlpZiAobm9kZS0+cmJfbGVmdCkKKwkJbm9kZS0+cmJfbGVmdC0+cmJfcGFyZW50X2NvbG9yID0gbm9kZS0+cmJfcGFyZW50X2NvbG9yOworfQorCisvKiBXZSBwdXQgdGhpcyBpbiByZXZlcnNlIG9yZGVyLCBzbyB3ZSBjYW4ganVzdCB1c2UgZWF0X2xhc3QgKi8KK3N0YXRpYyB2b2lkIHZlcl9pbnNlcnQoc3RydWN0IHJiX3Jvb3QgKnZlcl9yb290LCBzdHJ1Y3QgamZmczJfdG1wX2Rub2RlX2luZm8gKnRuKQoreworCXN0cnVjdCByYl9ub2RlICoqbGluayA9ICZ2ZXJfcm9vdC0+cmJfbm9kZTsKKwlzdHJ1Y3QgcmJfbm9kZSAqcGFyZW50ID0gTlVMTDsKKwlzdHJ1Y3QgamZmczJfdG1wX2Rub2RlX2luZm8gKnRoaXNfdG47CisKKwl3aGlsZSAoKmxpbmspIHsKKwkJcGFyZW50ID0gKmxpbms7CisJCXRoaXNfdG4gPSByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCBqZmZzMl90bXBfZG5vZGVfaW5mbywgcmIpOworCisJCWlmICh0bi0+dmVyc2lvbiA+IHRoaXNfdG4tPnZlcnNpb24pCisJCQlsaW5rID0gJnBhcmVudC0+cmJfbGVmdDsKKwkJZWxzZQorCQkJbGluayA9ICZwYXJlbnQtPnJiX3JpZ2h0OworCX0KKwlkYmdfcmVhZGlub2RlKCJMaW5rIG5ldyBub2RlIGF0ICVwIChyb290IGlzICVwKVxuIiwgbGluaywgdmVyX3Jvb3QpOworCXJiX2xpbmtfbm9kZSgmdG4tPnJiLCBwYXJlbnQsIGxpbmspOworCXJiX2luc2VydF9jb2xvcigmdG4tPnJiLCB2ZXJfcm9vdCk7Cit9CisKKy8qIEJ1aWxkIGZpbmFsLCBub3JtYWwgZnJhZ3RyZWUgZnJvbSB0biB0cmVlLiBJdCBkb2Vzbid0IG1hdHRlciB3aGljaCBvcmRlcgorICAgd2UgYWRkIG5vZGVzIHRvIHRoZSByZWFsIGZyYWd0cmVlLCBhcyBsb25nIGFzIHRoZXkgZG9uJ3Qgb3ZlcmxhcC4gQW5kCisgICBoYXZpbmcgdGhyb3duIGF3YXkgdGhlIG1ham9yaXR5IG9mIG92ZXJsYXBwZWQgbm9kZXMgYXMgd2Ugd2VudCwgdGhlcmUKKyAgIHJlYWxseSBzaG91bGRuJ3QgYmUgbWFueSBzZXRzIG9mIG5vZGVzIHdoaWNoIGRvIG92ZXJsYXAuIElmIHdlIHN0YXJ0IGF0CisgICB0aGUgZW5kLCB3ZSBjYW4gdXNlIHRoZSBvdmVybGFwIG1hcmtlcnMgLS0gd2UgY2FuIGp1c3QgZWF0IG5vZGVzIHdoaWNoCisgICBhcmVuJ3Qgb3ZlcmxhcHBlZCwgYW5kIHdoZW4gd2UgZW5jb3VudGVyIG5vZGVzIHdoaWNoIF9kb18gb3ZlcmxhcCB3ZQorICAgc29ydCB0aGVtIGFsbCBpbnRvIGEgdGVtcG9yYXJ5IHRyZWUgaW4gdmVyc2lvbiBvcmRlciBiZWZvcmUgcmVwbGF5aW5nIHRoZW0uICovCitzdGF0aWMgaW50IGpmZnMyX2J1aWxkX2lub2RlX2ZyYWd0cmVlKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLAorCQkJCSAgICAgIHN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICpmLAorCQkJCSAgICAgIHN0cnVjdCBqZmZzMl9yZWFkaW5vZGVfaW5mbyAqcmlpKQoreworCXN0cnVjdCBqZmZzMl90bXBfZG5vZGVfaW5mbyAqcGVuLCAqbGFzdCwgKnRoaXM7CisJc3RydWN0IHJiX3Jvb3QgdmVyX3Jvb3QgPSBSQl9ST09UOworCXVpbnQzMl90IGhpZ2hfdmVyID0gMDsKKworCWlmIChyaWktPm1kYXRhX3RuKSB7CisJCWRiZ19yZWFkaW5vZGUoInBvdGVudGlhbCBtZGF0YSBpcyB2ZXIgJWQgYXQgJXBcbiIsIHJpaS0+bWRhdGFfdG4tPnZlcnNpb24sIHJpaS0+bWRhdGFfdG4pOworCQloaWdoX3ZlciA9IHJpaS0+bWRhdGFfdG4tPnZlcnNpb247CisJCXJpaS0+bGF0ZXN0X3JlZiA9IHJpaS0+bWRhdGFfdG4tPmZuLT5yYXc7CisJfQorI2lmZGVmIEpGRlMyX0RCR19SRUFESU5PREVfTUVTU0FHRVMKKwl0aGlzID0gdG5fbGFzdCgmcmlpLT50bl9yb290KTsKKwl3aGlsZSAodGhpcykgeworCQlkYmdfcmVhZGlub2RlKCJ0biAlcCB2ZXIgJWQgcmFuZ2UgMHgleC0weCV4IG92ICVkXG4iLCB0aGlzLCB0aGlzLT52ZXJzaW9uLCB0aGlzLT5mbi0+b2ZzLAorCQkJICAgICB0aGlzLT5mbi0+b2ZzK3RoaXMtPmZuLT5zaXplLCB0aGlzLT5vdmVybGFwcGVkKTsKKwkJdGhpcyA9IHRuX3ByZXYodGhpcyk7CisJfQorI2VuZGlmCisJcGVuID0gdG5fbGFzdCgmcmlpLT50bl9yb290KTsKKwl3aGlsZSAoKGxhc3QgPSBwZW4pKSB7CisJCXBlbiA9IHRuX3ByZXYobGFzdCk7CisKKwkJZWF0X2xhc3QoJnJpaS0+dG5fcm9vdCwgJmxhc3QtPnJiKTsKKwkJdmVyX2luc2VydCgmdmVyX3Jvb3QsIGxhc3QpOworCisJCWlmICh1bmxpa2VseShsYXN0LT5vdmVybGFwcGVkKSkKKwkJCWNvbnRpbnVlOworCisJCS8qIE5vdyB3ZSBoYXZlIGEgYnVuY2ggb2Ygbm9kZXMgaW4gcmV2ZXJzZSB2ZXJzaW9uCisJCSAgIG9yZGVyLCBpbiB0aGUgdHJlZSBhdCB2ZXJfcm9vdC4gTW9zdCBvZiB0aGUgdGltZSwKKwkJICAgdGhlcmUnbGwgYWN0dWFsbHkgYmUgb25seSBvbmUgbm9kZSBpbiB0aGUgJ3RyZWUnLAorCQkgICBpbiBmYWN0LiAqLworCQl0aGlzID0gdG5fbGFzdCgmdmVyX3Jvb3QpOworCisJCXdoaWxlICh0aGlzKSB7CisJCQlzdHJ1Y3QgamZmczJfdG1wX2Rub2RlX2luZm8gKnZlcnNfbmV4dDsKKwkJCWludCByZXQ7CisJCQl2ZXJzX25leHQgPSB0bl9wcmV2KHRoaXMpOworCQkJZWF0X2xhc3QoJnZlcl9yb290LCAmdGhpcy0+cmIpOworCQkJaWYgKGNoZWNrX3RuX25vZGUoYywgdGhpcykpIHsKKwkJCQlkYmdfcmVhZGlub2RlKCJub2RlIHZlciAleCwgMHgleC0weCV4IGZhaWxlZCBDUkNcbiIsCisJCQkJCSAgICAgdGhpcy0+dmVyc2lvbiwgdGhpcy0+Zm4tPm9mcywKKwkJCQkJICAgICB0aGlzLT5mbi0+b2ZzK3RoaXMtPmZuLT5zaXplKTsKKwkJCQlqZmZzMl9raWxsX3RuKGMsIHRoaXMpOworCQkJfSBlbHNlIHsKKwkJCQlpZiAodGhpcy0+dmVyc2lvbiA+IGhpZ2hfdmVyKSB7CisJCQkJCS8qIE5vdGUgdGhhdCB0aGlzIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBvdGhlcgorCQkJCQkgICBoaWdoZXN0X3ZlcnNpb24sIGJlY2F1c2UgdGhpcyBvbmUgaXMgb25seQorCQkJCQkgICBjb3VudGluZyBfdmFsaWRfIG5vZGVzIHdoaWNoIGNvdWxkIGdpdmUgdGhlCisJCQkJCSAgIGxhdGVzdCBpbm9kZSBtZXRhZGF0YSAqLworCQkJCQloaWdoX3ZlciA9IHRoaXMtPnZlcnNpb247CisJCQkJCXJpaS0+bGF0ZXN0X3JlZiA9IHRoaXMtPmZuLT5yYXc7CisJCQkJfQorCQkJCWRiZ19yZWFkaW5vZGUoIkFkZCAlcCAodiAleCwgMHgleC0weCV4LCBvdiAlZCkgdG8gZnJhZ3RyZWVcbiIsCisJCQkJCSAgICAgdGhpcywgdGhpcy0+dmVyc2lvbiwgdGhpcy0+Zm4tPm9mcywKKwkJCQkJICAgICB0aGlzLT5mbi0+b2ZzK3RoaXMtPmZuLT5zaXplLCB0aGlzLT5vdmVybGFwcGVkKTsKKworCQkJCXJldCA9IGpmZnMyX2FkZF9mdWxsX2Rub2RlX3RvX2lub2RlKGMsIGYsIHRoaXMtPmZuKTsKKwkJCQlpZiAocmV0KSB7CisJCQkJCS8qIEZyZWUgdGhlIG5vZGVzIGluIHZlcnNfcm9vdDsgbGV0IHRoZSBjYWxsZXIKKwkJCQkJICAgZGVhbCB3aXRoIHRoZSByZXN0ICovCisJCQkJCUpGRlMyX0VSUk9SKCJBZGQgbm9kZSB0byB0cmVlIGZhaWxlZCAlZFxuIiwgcmV0KTsKKwkJCQkJd2hpbGUgKDEpIHsKKwkJCQkJCXZlcnNfbmV4dCA9IHRuX3ByZXYodGhpcyk7CisJCQkJCQlpZiAoY2hlY2tfdG5fbm9kZShjLCB0aGlzKSkKKwkJCQkJCQlqZmZzMl9tYXJrX25vZGVfb2Jzb2xldGUoYywgdGhpcy0+Zm4tPnJhdyk7CisJCQkJCQlqZmZzMl9mcmVlX2Z1bGxfZG5vZGUodGhpcy0+Zm4pOworCQkJCQkJamZmczJfZnJlZV90bXBfZG5vZGVfaW5mbyh0aGlzKTsKKwkJCQkJCXRoaXMgPSB2ZXJzX25leHQ7CisJCQkJCQlpZiAoIXRoaXMpCisJCQkJCQkJYnJlYWs7CisJCQkJCQllYXRfbGFzdCgmdmVyX3Jvb3QsICZ2ZXJzX25leHQtPnJiKTsKKwkJCQkJfQorCQkJCQlyZXR1cm4gcmV0OworCQkJCX0KKwkJCQlqZmZzMl9mcmVlX3RtcF9kbm9kZV9pbmZvKHRoaXMpOworCQkJfQorCQkJdGhpcyA9IHZlcnNfbmV4dDsKKwkJfQorCX0KKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgamZmczJfZnJlZV90bXBfZG5vZGVfaW5mb19saXN0KHN0cnVjdCByYl9yb290ICpsaXN0KQpAQCAtMTEyLDggKzU5MCw4IEBACiAgKiAJICAgIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KICAqLwogc3RhdGljIGlubGluZSBpbnQgcmVhZF9kaXJlbnRyeShzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX3Jhd19ub2RlX3JlZiAqcmVmLAotCQkJCXN0cnVjdCBqZmZzMl9yYXdfZGlyZW50ICpyZCwgc2l6ZV90IHJlYWQsIHN0cnVjdCBqZmZzMl9mdWxsX2RpcmVudCAqKmZkcCwKLQkJCQl1aW50MzJfdCAqbGF0ZXN0X21jdGltZSwgdWludDMyX3QgKm1jdGltZV92ZXIpCisJCQkJc3RydWN0IGpmZnMyX3Jhd19kaXJlbnQgKnJkLCBzaXplX3QgcmVhZCwKKwkJCQlzdHJ1Y3QgamZmczJfcmVhZGlub2RlX2luZm8gKnJpaSkKIHsKIAlzdHJ1Y3QgamZmczJfZnVsbF9kaXJlbnQgKmZkOwogCXVpbnQzMl90IGNyYzsKQEAgLTEyNSw3ICs2MDMsOCBAQAogCWlmICh1bmxpa2VseShjcmMgIT0gamUzMl90b19jcHUocmQtPm5vZGVfY3JjKSkpIHsKIAkJSkZGUzJfTk9USUNFKCJoZWFkZXIgQ1JDIGZhaWxlZCBvbiBkaXJlbnQgbm9kZSBhdCAlIzA4eDogcmVhZCAlIzA4eCwgY2FsY3VsYXRlZCAlIzA4eFxuIiwKIAkJCSAgICAgcmVmX29mZnNldChyZWYpLCBqZTMyX3RvX2NwdShyZC0+bm9kZV9jcmMpLCBjcmMpOwotCQlyZXR1cm4gMTsKKwkJamZmczJfbWFya19ub2RlX29ic29sZXRlKGMsIHJlZik7CisJCXJldHVybiAwOwogCX0KIAogCS8qIElmIHdlJ3ZlIG5ldmVyIGNoZWNrZWQgdGhlIENSQ3Mgb24gdGhpcyBub2RlLCBjaGVjayB0aGVtIG5vdyAqLwpAQCAtMTM3LDcgKzYxNiw4IEBACiAJCWlmICh1bmxpa2VseShQQUQoKHJkLT5uc2l6ZSArIHNpemVvZigqcmQpKSkgIT0gUEFEKGplMzJfdG9fY3B1KHJkLT50b3RsZW4pKSkpIHsKIAkJCUpGRlMyX0VSUk9SKCJpbGxlZ2FsIG5zaXplIGluIG5vZGUgYXQgJSMwOHg6IG5zaXplICUjMDJ4LCB0b3RsZW4gJSMwNHhcbiIsCiAJCQkJICAgIHJlZl9vZmZzZXQocmVmKSwgcmQtPm5zaXplLCBqZTMyX3RvX2NwdShyZC0+dG90bGVuKSk7Ci0JCQlyZXR1cm4gMTsKKwkJCWpmZnMyX21hcmtfbm9kZV9vYnNvbGV0ZShjLCByZWYpOworCQkJcmV0dXJuIDA7CiAJCX0KIAogCQlqZWIgPSAmYy0+YmxvY2tzW3JlZi0+Zmxhc2hfb2Zmc2V0IC8gYy0+c2VjdG9yX3NpemVdOwpAQCAtMTYxLDEwICs2NDEsMTMgQEAKIAlmZC0+aW5vID0gamUzMl90b19jcHUocmQtPmlubyk7CiAJZmQtPnR5cGUgPSByZC0+dHlwZTsKIAorCWlmIChmZC0+dmVyc2lvbiA+IHJpaS0+aGlnaGVzdF92ZXJzaW9uKQorCQlyaWktPmhpZ2hlc3RfdmVyc2lvbiA9IGZkLT52ZXJzaW9uOworCiAJLyogUGljayBvdXQgdGhlIG1jdGltZSBvZiB0aGUgbGF0ZXN0IGRpcmVudCAqLwotCWlmKGZkLT52ZXJzaW9uID4gKm1jdGltZV92ZXIgJiYgamUzMl90b19jcHUocmQtPm1jdGltZSkpIHsKLQkJKm1jdGltZV92ZXIgPSBmZC0+dmVyc2lvbjsKLQkJKmxhdGVzdF9tY3RpbWUgPSBqZTMyX3RvX2NwdShyZC0+bWN0aW1lKTsKKwlpZihmZC0+dmVyc2lvbiA+IHJpaS0+bWN0aW1lX3ZlciAmJiBqZTMyX3RvX2NwdShyZC0+bWN0aW1lKSkgeworCQlyaWktPm1jdGltZV92ZXIgPSBmZC0+dmVyc2lvbjsKKwkJcmlpLT5sYXRlc3RfbWN0aW1lID0gamUzMl90b19jcHUocmQtPm1jdGltZSk7CiAJfQogCiAJLyoKQEAgLTIwMSw3ICs2ODQsNyBAQAogCSAqIFdoZWVlLiBXZSBub3cgaGF2ZSBhIGNvbXBsZXRlIGpmZnMyX2Z1bGxfZGlyZW50IHN0cnVjdHVyZSwgd2l0aAogCSAqIHRoZSBuYW1lIGluIGl0IGFuZCBldmVyeXRoaW5nLiBMaW5rIGl0IGludG8gdGhlIGxpc3QKIAkgKi8KLQlqZmZzMl9hZGRfZmRfdG9fbGlzdChjLCBmZCwgZmRwKTsKKwlqZmZzMl9hZGRfZmRfdG9fbGlzdChjLCBmZCwgJnJpaS0+ZmRzKTsKIAogCXJldHVybiAwOwogfQpAQCAtMjEwLDEzICs2OTMsMTMgQEAKICAqIEhlbHBlciBmdW5jdGlvbiBmb3IgamZmczJfZ2V0X2lub2RlX25vZGVzKCkuCiAgKiBJdCBpcyBjYWxsZWQgZXZlcnkgdGltZSBhbiBpbm9kZSBub2RlIGlzIGZvdW5kLgogICoKLSAqIFJldHVybnM6IDAgb24gc3VjY2VzOworICogUmV0dXJuczogMCBvbiBzdWNjZXNzOwogICogCSAgICAxIGlmIHRoZSBub2RlIHNob3VsZCBiZSBtYXJrZWQgb2Jzb2xldGU7CiAgKiAJICAgIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KICAqLwogc3RhdGljIGlubGluZSBpbnQgcmVhZF9kbm9kZShzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX3Jhd19ub2RlX3JlZiAqcmVmLAotCQkJICAgICBzdHJ1Y3QgamZmczJfcmF3X2lub2RlICpyZCwgc3RydWN0IHJiX3Jvb3QgKnRucCwgaW50IHJkbGVuLAotCQkJICAgICB1aW50MzJfdCAqbGF0ZXN0X21jdGltZSwgdWludDMyX3QgKm1jdGltZV92ZXIpCisJCQkgICAgIHN0cnVjdCBqZmZzMl9yYXdfaW5vZGUgKnJkLCBpbnQgcmRsZW4sCisJCQkgICAgIHN0cnVjdCBqZmZzMl9yZWFkaW5vZGVfaW5mbyAqcmlpKQogewogCXN0cnVjdCBqZmZzMl90bXBfZG5vZGVfaW5mbyAqdG47CiAJdWludDMyX3QgbGVuLCBjc2l6ZTsKQEAgLTIzMCw3ICs3MTMsOCBAQAogCWlmICh1bmxpa2VseShjcmMgIT0gamUzMl90b19jcHUocmQtPm5vZGVfY3JjKSkpIHsKIAkJSkZGUzJfTk9USUNFKCJub2RlIENSQyBmYWlsZWQgb24gZG5vZGUgYXQgJSMwOHg6IHJlYWQgJSMwOHgsIGNhbGN1bGF0ZWQgJSMwOHhcbiIsCiAJCQkgICAgIHJlZl9vZmZzZXQocmVmKSwgamUzMl90b19jcHUocmQtPm5vZGVfY3JjKSwgY3JjKTsKLQkJcmV0dXJuIDE7CisJCWpmZnMyX21hcmtfbm9kZV9vYnNvbGV0ZShjLCByZWYpOworCQlyZXR1cm4gMDsKIAl9CiAKIAl0biA9IGpmZnMyX2FsbG9jX3RtcF9kbm9kZV9pbmZvKCk7CkBAIC0zNDIsNiArODI2LDEwIEBACiAJdG4tPmRhdGFfY3JjID0gamUzMl90b19jcHUocmQtPmRhdGFfY3JjKTsKIAl0bi0+Y3NpemUgPSBjc2l6ZTsKIAl0bi0+Zm4tPnJhdyA9IHJlZjsKKwl0bi0+b3ZlcmxhcHBlZCA9IDA7CisKKwlpZiAodG4tPnZlcnNpb24gPiByaWktPmhpZ2hlc3RfdmVyc2lvbikKKwkJcmlpLT5oaWdoZXN0X3ZlcnNpb24gPSB0bi0+dmVyc2lvbjsKIAogCS8qIFRoZXJlIHdhcyBhIGJ1ZyB3aGVyZSB3ZSB3cm90ZSBob2xlIG5vZGVzIG91dCB3aXRoCiAJICAgY3NpemUvZHNpemUgc3dhcHBlZC4gRGVhbCB3aXRoIGl0ICovCkBAIC0zNTMsMTMgKzg0MSwyNSBAQAogCWRiZ19yZWFkaW5vZGUoImRub2RlIEAlMDh4OiB2ZXIgJXUsIG9mZnNldCAlIzA0eCwgZHNpemUgJSMwNHgsIGNzaXplICUjMDR4XG4iLAogCQkgIHJlZl9vZmZzZXQocmVmKSwgamUzMl90b19jcHUocmQtPnZlcnNpb24pLCBqZTMyX3RvX2NwdShyZC0+b2Zmc2V0KSwgamUzMl90b19jcHUocmQtPmRzaXplKSwgY3NpemUpOwogCi0JamZmczJfYWRkX3RuX3RvX3RyZWUodG4sIHRucCk7CisJcmV0ID0gamZmczJfYWRkX3RuX3RvX3RyZWUoYywgcmlpLCB0bik7CiAKKwlpZiAocmV0KSB7CisJCWpmZnMyX2ZyZWVfZnVsbF9kbm9kZSh0bi0+Zm4pOworCWZyZWVfb3V0OgorCQlqZmZzMl9mcmVlX3RtcF9kbm9kZV9pbmZvKHRuKTsKKwkJcmV0dXJuIHJldDsKKwl9CisjaWZkZWYgSkZGUzJfREJHX1JFQURJTk9ERV9NRVNTQUdFUworCWRiZ19yZWFkaW5vZGUoIkFmdGVyIGFkZGluZyB2ZXIgJWQ6XG4iLCB0bi0+dmVyc2lvbik7CisJdG4gPSB0bl9maXJzdCgmcmlpLT50bl9yb290KTsKKwl3aGlsZSAodG4pIHsKKwkJZGJnX3JlYWRpbm9kZSgiJXA6IHYgJWQgciAweCV4LTB4JXggb3YgJWRcbiIsCisJCQkgICAgIHRuLCB0bi0+dmVyc2lvbiwgdG4tPmZuLT5vZnMsCisJCQkgICAgIHRuLT5mbi0+b2ZzK3RuLT5mbi0+c2l6ZSwgdG4tPm92ZXJsYXBwZWQpOworCQl0biA9IHRuX25leHQodG4pOworCX0KKyNlbmRpZgogCXJldHVybiAwOwotCi1mcmVlX291dDoKLQlqZmZzMl9mcmVlX3RtcF9kbm9kZV9pbmZvKHRuKTsKLQlyZXR1cm4gcmV0OwogfQogCiAvKgpAQCAtMzc5LDcgKzg3OSw4IEBACiAJCUpGRlMyX0VSUk9SKCJOb2RlIGlzIHslMDR4LCUwNHgsJTA4eCwlMDh4fS4gUGxlYXNlIHJlcG9ydCB0aGlzIGVycm9yLlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqZTE2X3RvX2NwdSh1bi0+bWFnaWMpLCBqZTE2X3RvX2NwdSh1bi0+bm9kZXR5cGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGplMzJfdG9fY3B1KHVuLT50b3RsZW4pLCBqZTMyX3RvX2NwdSh1bi0+aGRyX2NyYykpOwotCQlyZXR1cm4gMTsKKwkJamZmczJfbWFya19ub2RlX29ic29sZXRlKGMsIHJlZik7CisJCXJldHVybiAwOwogCX0KIAogCXVuLT5ub2RldHlwZSA9IGNwdV90b19qZTE2KEpGRlMyX05PREVfQUNDVVJBVEUgfCBqZTE2X3RvX2NwdSh1bi0+bm9kZXR5cGUpKTsKQEAgLTQwNyw3ICs5MDgsOCBAQAogCWNhc2UgSkZGUzJfRkVBVFVSRV9SV0NPTVBBVF9ERUxFVEU6CiAJCUpGRlMyX05PVElDRSgidW5rbm93biBSV0NPTVBBVF9ERUxFVEUgbm9kZXR5cGUgJSMwNFggYXQgJSMwOHhcbiIsCiAJCQkgICAgIGplMTZfdG9fY3B1KHVuLT5ub2RldHlwZSksIHJlZl9vZmZzZXQocmVmKSk7Ci0JCXJldHVybiAxOworCQlqZmZzMl9tYXJrX25vZGVfb2Jzb2xldGUoYywgcmVmKTsKKwkJcmV0dXJuIDA7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC00MjEsOTIgKzkyMyw2MiBAQAogICogCSAgICBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCiAgKi8KIHN0YXRpYyBpbnQgcmVhZF9tb3JlKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfcmF3X25vZGVfcmVmICpyZWYsCi0JCSAgICAgaW50IHJpZ2h0X3NpemUsIGludCAqcmRsZW4sIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgdW5zaWduZWQgY2hhciAqYnVmc3RhcnQpCisJCSAgICAgaW50IG5lZWRlZF9sZW4sIGludCAqcmRsZW4sIHVuc2lnbmVkIGNoYXIgKmJ1ZikKIHsKLQlpbnQgcmlnaHRfbGVuLCBlcnIsIGxlbjsKKwlpbnQgZXJyLCB0b19yZWFkID0gbmVlZGVkX2xlbiAtICpyZGxlbjsKIAlzaXplX3QgcmV0bGVuOwogCXVpbnQzMl90IG9mZnM7CiAKIAlpZiAoamZmczJfaXNfd3JpdGVidWZmZXJlZChjKSkgewotCQlyaWdodF9sZW4gPSBjLT53YnVmX3BhZ2VzaXplIC0gKGJ1ZnN0YXJ0IC0gYnVmKTsKLQkJaWYgKHJpZ2h0X3NpemUgKyAoaW50KShidWZzdGFydCAtIGJ1ZikgPiBjLT53YnVmX3BhZ2VzaXplKQotCQkJcmlnaHRfbGVuICs9IGMtPndidWZfcGFnZXNpemU7Ci0JfSBlbHNlCi0JCXJpZ2h0X2xlbiA9IHJpZ2h0X3NpemU7CisJCWludCByZW0gPSB0b19yZWFkICUgYy0+d2J1Zl9wYWdlc2l6ZTsKIAotCWlmICgqcmRsZW4gPT0gcmlnaHRfbGVuKQotCQlyZXR1cm4gMDsKKwkJaWYgKHJlbSkKKwkJCXRvX3JlYWQgKz0gYy0+d2J1Zl9wYWdlc2l6ZSAtIHJlbTsKKwl9CiAKIAkvKiBXZSBuZWVkIHRvIHJlYWQgbW9yZSBkYXRhICovCiAJb2ZmcyA9IHJlZl9vZmZzZXQocmVmKSArICpyZGxlbjsKLQlpZiAoamZmczJfaXNfd3JpdGVidWZmZXJlZChjKSkgewotCQlidWZzdGFydCA9IGJ1ZiArIGMtPndidWZfcGFnZXNpemU7Ci0JCWxlbiA9IGMtPndidWZfcGFnZXNpemU7Ci0JfSBlbHNlIHsKLQkJYnVmc3RhcnQgPSBidWYgKyAqcmRsZW47Ci0JCWxlbiA9IHJpZ2h0X3NpemUgLSAqcmRsZW47Ci0JfQogCi0JZGJnX3JlYWRpbm9kZSgicmVhZCBtb3JlICVkIGJ5dGVzXG4iLCBsZW4pOworCWRiZ19yZWFkaW5vZGUoInJlYWQgbW9yZSAlZCBieXRlc1xuIiwgdG9fcmVhZCk7CiAKLQllcnIgPSBqZmZzMl9mbGFzaF9yZWFkKGMsIG9mZnMsIGxlbiwgJnJldGxlbiwgYnVmc3RhcnQpOworCWVyciA9IGpmZnMyX2ZsYXNoX3JlYWQoYywgb2ZmcywgdG9fcmVhZCwgJnJldGxlbiwgYnVmICsgKnJkbGVuKTsKIAlpZiAoZXJyKSB7CiAJCUpGRlMyX0VSUk9SKCJjYW4gbm90IHJlYWQgJWQgYnl0ZXMgZnJvbSAweCUwOHgsICIKLQkJCSJlcnJvciBjb2RlOiAlZC5cbiIsIGxlbiwgb2ZmcywgZXJyKTsKKwkJCSJlcnJvciBjb2RlOiAlZC5cbiIsIHRvX3JlYWQsIG9mZnMsIGVycik7CiAJCXJldHVybiBlcnI7CiAJfQogCi0JaWYgKHJldGxlbiA8IGxlbikgeworCWlmIChyZXRsZW4gPCB0b19yZWFkKSB7CiAJCUpGRlMyX0VSUk9SKCJzaG9ydCByZWFkIGF0ICUjMDh4OiAlenUgaW5zdGVhZCBvZiAlZC5cbiIsCi0JCQkJb2ZmcywgcmV0bGVuLCBsZW4pOworCQkJCW9mZnMsIHJldGxlbiwgdG9fcmVhZCk7CiAJCXJldHVybiAtRUlPOwogCX0KIAotCSpyZGxlbiA9IHJpZ2h0X2xlbjsKLQorCSpyZGxlbiArPSB0b19yZWFkOwogCXJldHVybiAwOwogfQogCiAvKiBHZXQgdG1wX2Rub2RlX2luZm8gYW5kIGZ1bGxfZGlyZW50IGZvciBhbGwgbm9uLW9ic29sZXRlIG5vZGVzIGFzc29jaWF0ZWQKLSAgIHdpdGggdGhpcyBpbm8sIHJldHVybmluZyB0aGUgZm9ybWVyIGluIG9yZGVyIG9mIHZlcnNpb24gKi8KKyAgIHdpdGggdGhpcyBpbm8uIFBlcmZvcm0gYSBwcmVsaW1pbmFyeSBvcmRlcmluZyBvbiBkYXRhIG5vZGVzLCB0aHJvd2luZyBhd2F5CisgICB0aG9zZSB3aGljaCBhcmUgY29tcGxldGVseSBvYnNvbGV0ZWQgYnkgbmV3ZXIgb25lcy4gVGhlIG5hw692ZSBhcHByb2FjaCB3ZQorICAgdXNlIHRvIHRha2Ugb2YganVzdCByZXR1cm5pbmcgdGhlbSBfYWxsXyBpbiB2ZXJzaW9uIG9yZGVyIHdpbGwgY2F1c2UgdXMgdG8KKyAgIHJ1biBvdXQgb2YgbWVtb3J5IGluIGNlcnRhaW4gZGVnZW5lcmF0ZSBjYXNlcy4gKi8KIHN0YXRpYyBpbnQgamZmczJfZ2V0X2lub2RlX25vZGVzKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqZiwKLQkJCQkgc3RydWN0IHJiX3Jvb3QgKnRucCwgc3RydWN0IGpmZnMyX2Z1bGxfZGlyZW50ICoqZmRwLAotCQkJCSB1aW50MzJfdCAqaGlnaGVzdF92ZXJzaW9uLCB1aW50MzJfdCAqbGF0ZXN0X21jdGltZSwKLQkJCQkgdWludDMyX3QgKm1jdGltZV92ZXIpCisJCQkJIHN0cnVjdCBqZmZzMl9yZWFkaW5vZGVfaW5mbyAqcmlpKQogewogCXN0cnVjdCBqZmZzMl9yYXdfbm9kZV9yZWYgKnJlZiwgKnZhbGlkX3JlZjsKLQlzdHJ1Y3QgcmJfcm9vdCByZXRfdG4gPSBSQl9ST09UOwotCXN0cnVjdCBqZmZzMl9mdWxsX2RpcmVudCAqcmV0X2ZkID0gTlVMTDsKIAl1bnNpZ25lZCBjaGFyICpidWYgPSBOVUxMOwogCXVuaW9uIGpmZnMyX25vZGVfdW5pb24gKm5vZGU7CiAJc2l6ZV90IHJldGxlbjsKIAlpbnQgbGVuLCBlcnI7CiAKLQkqbWN0aW1lX3ZlciA9IDA7CisJcmlpLT5tY3RpbWVfdmVyID0gMDsKIAogCWRiZ19yZWFkaW5vZGUoImlubyAjJXVcbiIsIGYtPmlub2NhY2hlLT5pbm8pOwogCi0JaWYgKGpmZnMyX2lzX3dyaXRlYnVmZmVyZWQoYykpIHsKLQkJLyoKLQkJICogSWYgd2UgaGF2ZSB0aGUgd3JpdGUgYnVmZmVyLCB3ZSBhc3N1bWUgdGhlIG1pbmltYWwgSS9PIHVuaXQKLQkJICogaXMgYy0+d2J1Zl9wYWdlc2l6ZS4gV2UgaW1wbGVtZW50IHNvbWUgb3B0aW1pemF0aW9ucyB3aGljaCBpbgotCQkgKiB0aGlzIGNhc2UgYW5kIHdlIG5lZWQgYSB0ZW1wb3JhcnkgYnVmZmVyIG9mIHNpemUgPQotCQkgKiAyKmMtPndidWZfcGFnZXNpemUgYnl0ZXMgKHNlZSBjb21tZW50cyBpbiByZWFkX2Rub2RlKCkpLgotCQkgKiBCYXNpY2FsbHksIHdlIHdhbnQgdG8gcmVhZCBub3Qgb25seSB0aGUgbm9kZSBoZWFkZXIsIGJ1dCB0aGUKLQkJICogd2hvbGUgd2J1ZiAoTkFORCBwYWdlIGluIGNhc2Ugb2YgTkFORCkgb3IgMiwgaWYgdGhlIG5vZGUKLQkJICogaGVhZGVyIG92ZXJsYXBzIHRoZSBib3JkZXIgYmV0d2VlbiB0aGUgMiB3YnVmcy4KLQkJICovCi0JCWxlbiA9IDIqYy0+d2J1Zl9wYWdlc2l6ZTsKLQl9IGVsc2UgewotCQkvKgotCQkgKiBXaGVuIHRoZXJlIGlzIG5vIHdyaXRlIGJ1ZmZlciwgdGhlIHNpemUgb2YgdGhlIHRlbXBvcmFyeQotCQkgKiBidWZmZXIgaXMgdGhlIHNpemUgb2YgdGhlIGxhcmdlcyBub2RlIGhlYWRlci4KLQkJICovCi0JCWxlbiA9IHNpemVvZih1bmlvbiBqZmZzMl9ub2RlX3VuaW9uKTsKLQl9Ci0KIAkvKiBGSVhNRTogaW4gY2FzZSBvZiBOT1IgYW5kIGF2YWlsYWJsZSAtPnBvaW50KCkgdGhpcwogCSAqIG5lZWRzIHRvIGJlIGZpeGVkLiAqLworCWxlbiA9IHNpemVvZih1bmlvbiBqZmZzMl9ub2RlX3VuaW9uKSArIGMtPndidWZfcGFnZXNpemU7CiAJYnVmID0ga21hbGxvYyhsZW4sIEdGUF9LRVJORUwpOwogCWlmICghYnVmKQogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTUxNiw4ICs5ODgsNiBAQAogCWlmICghdmFsaWRfcmVmICYmIGYtPmlub2NhY2hlLT5pbm8gIT0gMSkKIAkJSkZGUzJfV0FSTklORygiRWVwLiBObyB2YWxpZCBub2RlcyBmb3IgaW5vICMldS5cbiIsIGYtPmlub2NhY2hlLT5pbm8pOwogCXdoaWxlICh2YWxpZF9yZWYpIHsKLQkJdW5zaWduZWQgY2hhciAqYnVmc3RhcnQ7Ci0KIAkJLyogV2UgY2FuIGhvbGQgYSBwb2ludGVyIHRvIGEgbm9uLW9ic29sZXRlIG5vZGUgd2l0aG91dCB0aGUgc3BpbmxvY2ssCiAJCSAgIGJ1dCBfb2Jzb2xldGVfIG5vZGVzIG1heSBkaXNhcHBlYXIgYXQgYW55IHRpbWUsIGlmIHRoZSBibG9jawogCQkgICB0aGV5J3JlIGluIGdldHMgZXJhc2VkLiBTbyBpZiB3ZSBtYXJrICdyZWYnIG9ic29sZXRlIHdoaWxlIHdlJ3JlCkBAIC01MzMsMzIgKzEwMDMsMzEgQEAKIAkJLyoKIAkJICogQXQgdGhpcyBwb2ludCB3ZSBkb24ndCBrbm93IHRoZSB0eXBlIG9mIHRoZSBub2RlIHdlJ3JlIGdvaW5nCiAJCSAqIHRvIHJlYWQsIHNvIHdlIGRvIG5vdCBrbm93IHRoZSBzaXplIG9mIGl0cyBoZWFkZXIuIEluIG9yZGVyCi0JCSAqIHRvIG1pbmltaXplIHRoZSBhbW91bnQgb2YgZmxhc2ggSU8gd2UgYXNzdW1lIHRoZSBub2RlIGhhcwotCQkgKiBzaXplID0gSkZGUzJfTUlOX05PREVfSEVBREVSLgorCQkgKiB0byBtaW5pbWl6ZSB0aGUgYW1vdW50IG9mIGZsYXNoIElPIHdlIGFzc3VtZSB0aGUgaGVhZGVyIGlzCisJCSAqIG9mIHNpemUgPSBKRkZTMl9NSU5fTk9ERV9IRUFERVIuCiAJCSAqLworCQlsZW4gPSBKRkZTMl9NSU5fTk9ERV9IRUFERVI7CiAJCWlmIChqZmZzMl9pc193cml0ZWJ1ZmZlcmVkKGMpKSB7CisJCQlpbnQgZW5kLCByZW07CisKIAkJCS8qCi0JCQkgKiBXZSB0cmVhdCAnYnVmJyBhcyAyIGFkamFjZW50IHdidWZzLiBXZSB3YW50IHRvCi0JCQkgKiBhZGp1c3QgYnVmc3RhcnQgc3VjaCBhcyBpdCBwb2ludHMgdG8gdGhlCi0JCQkgKiBiZWdpbm5pbmcgb2YgdGhlIG5vZGUgd2l0aGluIHRoaXMgd2J1Zi4KKwkJCSAqIFdlIGFyZSBhYm91dCB0byByZWFkIEpGRlMyX01JTl9OT0RFX0hFQURFUiBieXRlcywKKwkJCSAqIGJ1dCB0aGlzIGZsYXNoIGhhcyBzb21lIG1pbmltYWwgSS9PIHVuaXQuIEl0IGlzCisJCQkgKiBwb3NzaWJsZSB0aGF0IHdlJ2xsIG5lZWQgdG8gcmVhZCBtb3JlIHNvb24sIHNvIHJlYWQKKwkJCSAqIHVwIHRvIHRoZSBuZXh0IG1pbi4gSS9PIHVuaXQsIGluIG9yZGVyIG5vdCB0bworCQkJICogcmUtcmVhZCB0aGUgc2FtZSBtaW4uIEkvTyB1bml0IHR3aWNlLgogCQkJICovCi0JCQlidWZzdGFydCA9IGJ1ZiArIChyZWZfb2Zmc2V0KHJlZikgJSBjLT53YnVmX3BhZ2VzaXplKTsKLQkJCS8qIFdlIHdpbGwgcmVhZCBlaXRoZXIgb25lIHdidWYgb3IgMiB3YnVmcy4gKi8KLQkJCWxlbiA9IGMtPndidWZfcGFnZXNpemUgLSAoYnVmc3RhcnQgLSBidWYpOwotCQkJaWYgKEpGRlMyX01JTl9OT0RFX0hFQURFUiArIChpbnQpKGJ1ZnN0YXJ0IC0gYnVmKSA+IGMtPndidWZfcGFnZXNpemUpIHsKLQkJCQkvKiBUaGUgaGVhZGVyIHNwYW5zIHRoZSBib3JkZXIgb2YgdGhlIGZpcnN0IHdidWYgKi8KLQkJCQlsZW4gKz0gYy0+d2J1Zl9wYWdlc2l6ZTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWJ1ZnN0YXJ0ID0gYnVmOwotCQkJbGVuID0gSkZGUzJfTUlOX05PREVfSEVBREVSOworCQkJZW5kID0gcmVmX29mZnNldChyZWYpICsgbGVuOworCQkJcmVtID0gZW5kICUgYy0+d2J1Zl9wYWdlc2l6ZTsKKwkJCWlmIChyZW0pCisJCQkJZW5kICs9IGMtPndidWZfcGFnZXNpemUgLSByZW07CisJCQlsZW4gPSBlbmQgLSByZWZfb2Zmc2V0KHJlZik7CiAJCX0KIAogCQlkYmdfcmVhZGlub2RlKCJyZWFkICVkIGJ5dGVzIGF0ICUjMDh4KCVkKS5cbiIsIGxlbiwgcmVmX29mZnNldChyZWYpLCByZWZfZmxhZ3MocmVmKSk7CiAKIAkJLyogRklYTUU6IHBvaW50KCkgKi8KLQkJZXJyID0gamZmczJfZmxhc2hfcmVhZChjLCByZWZfb2Zmc2V0KHJlZiksIGxlbiwKLQkJCQkgICAgICAgJnJldGxlbiwgYnVmc3RhcnQpOworCQllcnIgPSBqZmZzMl9mbGFzaF9yZWFkKGMsIHJlZl9vZmZzZXQocmVmKSwgbGVuLCAmcmV0bGVuLCBidWYpOwogCQlpZiAoZXJyKSB7CiAJCQlKRkZTMl9FUlJPUigiY2FuIG5vdCByZWFkICVkIGJ5dGVzIGZyb20gMHglMDh4LCAiICJlcnJvciBjb2RlOiAlZC5cbiIsIGxlbiwgcmVmX29mZnNldChyZWYpLCBlcnIpOwogCQkJZ290byBmcmVlX291dDsKQEAgLTU3MCw3ICsxMDM5LDcgQEAKIAkJCWdvdG8gZnJlZV9vdXQ7CiAJCX0KIAotCQlub2RlID0gKHVuaW9uIGpmZnMyX25vZGVfdW5pb24gKilidWZzdGFydDsKKwkJbm9kZSA9ICh1bmlvbiBqZmZzMl9ub2RlX3VuaW9uICopYnVmOwogCiAJCS8qIE5vIG5lZWQgdG8gbWFzayBpbiB0aGUgdmFsaWQgYml0OyBpdCBzaG91bGRuJ3QgYmUgaW52YWxpZCAqLwogCQlpZiAoamUzMl90b19jcHUobm9kZS0+dS5oZHJfY3JjKSAhPSBjcmMzMigwLCBub2RlLCBzaXplb2Yobm9kZS0+dSktNCkpIHsKQEAgLTU4MywxMCArMTA1MiwxMCBAQAogCQkJamZmczJfbWFya19ub2RlX29ic29sZXRlKGMsIHJlZik7CiAJCQlnb3RvIGNvbnQ7CiAJCX0KLQkJLyogRHVlIHRvIHBvb3IgY2hvaWNlIG9mIGNyYzMyIHNlZWQsIGFuIGFsbC16ZXJvIG5vZGUgd2lsbCBoYXZlIGEgY29ycmVjdCBDUkMgKi8KLQkJaWYgKCFqZTMyX3RvX2NwdShub2RlLT51Lmhkcl9jcmMpICYmICFqZTE2X3RvX2NwdShub2RlLT51Lm5vZGV0eXBlKSAmJgotCQkgICAgIWplMTZfdG9fY3B1KG5vZGUtPnUubWFnaWMpICYmICFqZTMyX3RvX2NwdShub2RlLT51LnRvdGxlbikpIHsKLQkJCUpGRlMyX05PVElDRSgiQWxsIHplcm8gbm9kZSBoZWFkZXIgYXQgJSMwOHguXG4iLCByZWZfb2Zmc2V0KHJlZikpOworCQlpZiAoamUxNl90b19jcHUobm9kZS0+dS5tYWdpYykgIT0gSkZGUzJfTUFHSUNfQklUTUFTSykgeworCQkJLyogTm90IGEgSkZGUzIgbm9kZSwgd2hpbmdlIGFuZCBtb3ZlIG9uICovCisJCQlKRkZTMl9OT1RJQ0UoIldyb25nIG1hZ2ljIGJpdG1hc2sgMHglMDR4IGluIG5vZGUgaGVhZGVyIGF0ICUjMDh4LlxuIiwKKwkJCQkgICAgIGplMTZfdG9fY3B1KG5vZGUtPnUubWFnaWMpLCByZWZfb2Zmc2V0KHJlZikpOwogCQkJamZmczJfbWFya19ub2RlX29ic29sZXRlKGMsIHJlZik7CiAJCQlnb3RvIGNvbnQ7CiAJCX0KQEAgLTU5Niw0NiArMTA2NSwzNCBAQAogCQljYXNlIEpGRlMyX05PREVUWVBFX0RJUkVOVDoKIAogCQkJaWYgKEpGRlMyX01JTl9OT0RFX0hFQURFUiA8IHNpemVvZihzdHJ1Y3QgamZmczJfcmF3X2RpcmVudCkpIHsKLQkJCQllcnIgPSByZWFkX21vcmUoYywgcmVmLCBzaXplb2Yoc3RydWN0IGpmZnMyX3Jhd19kaXJlbnQpLCAmbGVuLCBidWYsIGJ1ZnN0YXJ0KTsKKwkJCQllcnIgPSByZWFkX21vcmUoYywgcmVmLCBzaXplb2Yoc3RydWN0IGpmZnMyX3Jhd19kaXJlbnQpLCAmbGVuLCBidWYpOwogCQkJCWlmICh1bmxpa2VseShlcnIpKQogCQkJCQlnb3RvIGZyZWVfb3V0OwogCQkJfQogCi0JCQllcnIgPSByZWFkX2RpcmVudHJ5KGMsIHJlZiwgJm5vZGUtPmQsIHJldGxlbiwgJnJldF9mZCwgbGF0ZXN0X21jdGltZSwgbWN0aW1lX3Zlcik7Ci0JCQlpZiAoZXJyID09IDEpIHsKLQkJCQlqZmZzMl9tYXJrX25vZGVfb2Jzb2xldGUoYywgcmVmKTsKLQkJCQlicmVhazsKLQkJCX0gZWxzZSBpZiAodW5saWtlbHkoZXJyKSkKKwkJCWVyciA9IHJlYWRfZGlyZW50cnkoYywgcmVmLCAmbm9kZS0+ZCwgcmV0bGVuLCByaWkpOworCQkJaWYgKHVubGlrZWx5KGVycikpCiAJCQkJZ290byBmcmVlX291dDsKIAotCQkJaWYgKGplMzJfdG9fY3B1KG5vZGUtPmQudmVyc2lvbikgPiAqaGlnaGVzdF92ZXJzaW9uKQotCQkJCSpoaWdoZXN0X3ZlcnNpb24gPSBqZTMyX3RvX2NwdShub2RlLT5kLnZlcnNpb24pOwotCiAJCQlicmVhazsKIAogCQljYXNlIEpGRlMyX05PREVUWVBFX0lOT0RFOgogCiAJCQlpZiAoSkZGUzJfTUlOX05PREVfSEVBREVSIDwgc2l6ZW9mKHN0cnVjdCBqZmZzMl9yYXdfaW5vZGUpKSB7Ci0JCQkJZXJyID0gcmVhZF9tb3JlKGMsIHJlZiwgc2l6ZW9mKHN0cnVjdCBqZmZzMl9yYXdfaW5vZGUpLCAmbGVuLCBidWYsIGJ1ZnN0YXJ0KTsKKwkJCQllcnIgPSByZWFkX21vcmUoYywgcmVmLCBzaXplb2Yoc3RydWN0IGpmZnMyX3Jhd19pbm9kZSksICZsZW4sIGJ1Zik7CiAJCQkJaWYgKHVubGlrZWx5KGVycikpCiAJCQkJCWdvdG8gZnJlZV9vdXQ7CiAJCQl9CiAKLQkJCWVyciA9IHJlYWRfZG5vZGUoYywgcmVmLCAmbm9kZS0+aSwgJnJldF90biwgbGVuLCBsYXRlc3RfbWN0aW1lLCBtY3RpbWVfdmVyKTsKLQkJCWlmIChlcnIgPT0gMSkgewotCQkJCWpmZnMyX21hcmtfbm9kZV9vYnNvbGV0ZShjLCByZWYpOwotCQkJCWJyZWFrOwotCQkJfSBlbHNlIGlmICh1bmxpa2VseShlcnIpKQorCQkJZXJyID0gcmVhZF9kbm9kZShjLCByZWYsICZub2RlLT5pLCBsZW4sIHJpaSk7CisJCQlpZiAodW5saWtlbHkoZXJyKSkKIAkJCQlnb3RvIGZyZWVfb3V0OwogCi0JCQlpZiAoamUzMl90b19jcHUobm9kZS0+aS52ZXJzaW9uKSA+ICpoaWdoZXN0X3ZlcnNpb24pCi0JCQkJKmhpZ2hlc3RfdmVyc2lvbiA9IGplMzJfdG9fY3B1KG5vZGUtPmkudmVyc2lvbik7Ci0KIAkJCWJyZWFrOwogCiAJCWRlZmF1bHQ6CiAJCQlpZiAoSkZGUzJfTUlOX05PREVfSEVBREVSIDwgc2l6ZW9mKHN0cnVjdCBqZmZzMl91bmtub3duX25vZGUpKSB7Ci0JCQkJZXJyID0gcmVhZF9tb3JlKGMsIHJlZiwgc2l6ZW9mKHN0cnVjdCBqZmZzMl91bmtub3duX25vZGUpLCAmbGVuLCBidWYsIGJ1ZnN0YXJ0KTsKKwkJCQllcnIgPSByZWFkX21vcmUoYywgcmVmLCBzaXplb2Yoc3RydWN0IGpmZnMyX3Vua25vd25fbm9kZSksICZsZW4sIGJ1Zik7CiAJCQkJaWYgKHVubGlrZWx5KGVycikpCiAJCQkJCWdvdG8gZnJlZV9vdXQ7CiAJCQl9CkBAIC02NTMsMTcgKzExMTAsMTkgQEAKIAl9CiAKIAlzcGluX3VubG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKLQkqdG5wID0gcmV0X3RuOwotCSpmZHAgPSByZXRfZmQ7CiAJa2ZyZWUoYnVmKTsKIAorCWYtPmhpZ2hlc3RfdmVyc2lvbiA9IHJpaS0+aGlnaGVzdF92ZXJzaW9uOworCiAJZGJnX3JlYWRpbm9kZSgibm9kZXMgb2YgaW5vZGUgIyV1IHdlcmUgcmVhZCwgdGhlIGhpZ2hlc3QgdmVyc2lvbiBpcyAldSwgbGF0ZXN0X21jdGltZSAldSwgbWN0aW1lX3ZlciAldS5cbiIsCi0JCQlmLT5pbm9jYWNoZS0+aW5vLCAqaGlnaGVzdF92ZXJzaW9uLCAqbGF0ZXN0X21jdGltZSwgKm1jdGltZV92ZXIpOworCQkgICAgICBmLT5pbm9jYWNoZS0+aW5vLCByaWktPmhpZ2hlc3RfdmVyc2lvbiwgcmlpLT5sYXRlc3RfbWN0aW1lLAorCQkgICAgICByaWktPm1jdGltZV92ZXIpOwogCXJldHVybiAwOwogCiAgZnJlZV9vdXQ6Ci0JamZmczJfZnJlZV90bXBfZG5vZGVfaW5mb19saXN0KCZyZXRfdG4pOwotCWpmZnMyX2ZyZWVfZnVsbF9kaXJlbnRfbGlzdChyZXRfZmQpOworCWpmZnMyX2ZyZWVfdG1wX2Rub2RlX2luZm9fbGlzdCgmcmlpLT50bl9yb290KTsKKwlqZmZzMl9mcmVlX2Z1bGxfZGlyZW50X2xpc3QocmlpLT5mZHMpOworCXJpaS0+ZmRzID0gTlVMTDsKIAlrZnJlZShidWYpOwogCXJldHVybiBlcnI7CiB9CkBAIC02NzIsMjAgKzExMzEsMTcgQEAKIAkJCQkJc3RydWN0IGpmZnMyX2lub2RlX2luZm8gKmYsCiAJCQkJCXN0cnVjdCBqZmZzMl9yYXdfaW5vZGUgKmxhdGVzdF9ub2RlKQogewotCXN0cnVjdCBqZmZzMl90bXBfZG5vZGVfaW5mbyAqdG47Ci0Jc3RydWN0IHJiX3Jvb3QgdG5fbGlzdDsKLQlzdHJ1Y3QgcmJfbm9kZSAqcmIsICpyZXBsX3JiOwotCXN0cnVjdCBqZmZzMl9mdWxsX2RpcmVudCAqZmRfbGlzdDsKLQlzdHJ1Y3QgamZmczJfZnVsbF9kbm9kZSAqZm4sICpmaXJzdF9mbiA9IE5VTEw7Ci0JdWludDMyX3QgY3JjOwotCXVpbnQzMl90IGxhdGVzdF9tY3RpbWUsIG1jdGltZV92ZXI7CisJc3RydWN0IGpmZnMyX3JlYWRpbm9kZV9pbmZvIHJpaTsKKwl1aW50MzJfdCBjcmMsIG5ld19zaXplOwogCXNpemVfdCByZXRsZW47CiAJaW50IHJldDsKIAogCWRiZ19yZWFkaW5vZGUoImlubyAjJXUgbmxpbmsgaXMgJWRcbiIsIGYtPmlub2NhY2hlLT5pbm8sIGYtPmlub2NhY2hlLT5ubGluayk7CiAKKwltZW1zZXQoJnJpaSwgMCwgc2l6ZW9mKHJpaSkpOworCiAJLyogR3JhYiBhbGwgbm9kZXMgcmVsZXZhbnQgdG8gdGhpcyBpbm8gKi8KLQlyZXQgPSBqZmZzMl9nZXRfaW5vZGVfbm9kZXMoYywgZiwgJnRuX2xpc3QsICZmZF9saXN0LCAmZi0+aGlnaGVzdF92ZXJzaW9uLCAmbGF0ZXN0X21jdGltZSwgJm1jdGltZV92ZXIpOworCXJldCA9IGpmZnMyX2dldF9pbm9kZV9ub2RlcyhjLCBmLCAmcmlpKTsKIAogCWlmIChyZXQpIHsKIAkJSkZGUzJfRVJST1IoImNhbm5vdCByZWFkIG5vZGVzIGZvciBpbm8gJXUsIHJldHVybmVkIGVycm9yIGlzICVkXG4iLCBmLT5pbm9jYWNoZS0+aW5vLCByZXQpOwpAQCAtNjkzLDc0ICsxMTQ5LDQyIEBACiAJCQlqZmZzMl9zZXRfaW5vY2FjaGVfc3RhdGUoYywgZi0+aW5vY2FjaGUsIElOT19TVEFURV9DSEVDS0VEQUJTRU5UKTsKIAkJcmV0dXJuIHJldDsKIAl9Ci0JZi0+ZGVudHMgPSBmZF9saXN0OwogCi0JcmIgPSByYl9maXJzdCgmdG5fbGlzdCk7Ci0KLQl3aGlsZSAocmIpIHsKLQkJY29uZF9yZXNjaGVkKCk7Ci0JCXRuID0gcmJfZW50cnkocmIsIHN0cnVjdCBqZmZzMl90bXBfZG5vZGVfaW5mbywgcmIpOwotCQlmbiA9IHRuLT5mbjsKLQkJcmV0ID0gMTsKLQkJZGJnX3JlYWRpbm9kZSgiY29uc2lkZXIgbm9kZSB2ZXIgJXUsIHBoeXMgb2Zmc2V0ICIKLQkJCSIlIzA4eCglZCksIHJhbmdlICV1LSV1LlxuIiwgdG4tPnZlcnNpb24sCi0JCQlyZWZfb2Zmc2V0KGZuLT5yYXcpLCByZWZfZmxhZ3MoZm4tPnJhdyksCi0JCQlmbi0+b2ZzLCBmbi0+b2ZzICsgZm4tPnNpemUpOwotCi0JCWlmIChmbi0+c2l6ZSkgewotCQkJcmV0ID0gamZmczJfYWRkX29sZGVyX2ZyYWdfdG9fZnJhZ3RyZWUoYywgZiwgdG4pOwotCQkJLyogVE9ETzogdGhlIGVycm9yIGNvZGUgaXNuJ3QgY2hlY2tlZCwgY2hlY2sgaXQgKi8KLQkJCWpmZnMyX2RiZ19mcmFndHJlZV9wYXJhbm9pYV9jaGVja19ub2xvY2soZik7Ci0JCQlCVUdfT04ocmV0IDwgMCk7Ci0JCQlpZiAoIWZpcnN0X2ZuICYmIHJldCA9PSAwKQotCQkJCWZpcnN0X2ZuID0gZm47Ci0JCX0gZWxzZSBpZiAoIWZpcnN0X2ZuKSB7Ci0JCQlmaXJzdF9mbiA9IGZuOwotCQkJZi0+bWV0YWRhdGEgPSBmbjsKLQkJCXJldCA9IDA7IC8qIFByZXZlbnQgZnJlZWluZyB0aGUgbWV0YWRhdGEgdXBkYXRlIG5vZGUgKi8KLQkJfSBlbHNlCi0JCQlqZmZzMl9tYXJrX25vZGVfb2Jzb2xldGUoYywgZm4tPnJhdyk7Ci0KLQkJQlVHX09OKHJiLT5yYl9sZWZ0KTsKLQkJaWYgKHJiX3BhcmVudChyYikgJiYgcmJfcGFyZW50KHJiKS0+cmJfbGVmdCA9PSByYikgewotCQkJLyogV2Ugd2VyZSB0aGVuIGxlZnQtaGFuZCBjaGlsZCBvZiBvdXIgcGFyZW50LiBXZSBuZWVkCi0JCQkgKiB0byBtb3ZlIG91ciBvd24gcmlnaHQtaGFuZCBjaGlsZCBpbnRvIG91ciBwbGFjZS4gKi8KLQkJCXJlcGxfcmIgPSByYi0+cmJfcmlnaHQ7Ci0JCQlpZiAocmVwbF9yYikKLQkJCQlyYl9zZXRfcGFyZW50KHJlcGxfcmIsIHJiX3BhcmVudChyYikpOwotCQl9IGVsc2UKLQkJCXJlcGxfcmIgPSBOVUxMOwotCi0JCXJiID0gcmJfbmV4dChyYik7Ci0KLQkJLyogUmVtb3ZlIHRoZSBzcGVudCB0biBmcm9tIHRoZSB0cmVlOyBkb24ndCBib3RoZXIgcmViYWxhbmNpbmcKLQkJICogYnV0IHB1dCBvdXIgcmlnaHQtaGFuZCBjaGlsZCBpbiBvdXIgb3duIHBsYWNlLiAqLwotCQlpZiAocmJfcGFyZW50KCZ0bi0+cmIpKSB7Ci0JCQlpZiAocmJfcGFyZW50KCZ0bi0+cmIpLT5yYl9sZWZ0ID09ICZ0bi0+cmIpCi0JCQkJcmJfcGFyZW50KCZ0bi0+cmIpLT5yYl9sZWZ0ID0gcmVwbF9yYjsKLQkJCWVsc2UgaWYgKHJiX3BhcmVudCgmdG4tPnJiKS0+cmJfcmlnaHQgPT0gJnRuLT5yYikKLQkJCQlyYl9wYXJlbnQoJnRuLT5yYiktPnJiX3JpZ2h0ID0gcmVwbF9yYjsKLQkJCWVsc2UgQlVHKCk7Ci0JCX0gZWxzZSBpZiAodG4tPnJiLnJiX3JpZ2h0KQotCQkJcmJfc2V0X3BhcmVudCh0bi0+cmIucmJfcmlnaHQsIE5VTEwpOwotCi0JCWpmZnMyX2ZyZWVfdG1wX2Rub2RlX2luZm8odG4pOwotCQlpZiAocmV0KSB7Ci0JCQlkYmdfcmVhZGlub2RlKCJkZWxldGUgZG5vZGUgJXUtJXUuXG4iLAotCQkJCWZuLT5vZnMsIGZuLT5vZnMgKyBmbi0+c2l6ZSk7Ci0JCQlqZmZzMl9mcmVlX2Z1bGxfZG5vZGUoZm4pOworCXJldCA9IGpmZnMyX2J1aWxkX2lub2RlX2ZyYWd0cmVlKGMsIGYsICZyaWkpOworCWlmIChyZXQpIHsKKwkJSkZGUzJfRVJST1IoIkZhaWxlZCB0byBidWlsZCBmaW5hbCBmcmFndHJlZSBmb3IgaW5vZGUgIyV1OiBlcnJvciAlZFxuIiwKKwkJCSAgICBmLT5pbm9jYWNoZS0+aW5vLCByZXQpOworCQlpZiAoZi0+aW5vY2FjaGUtPnN0YXRlID09IElOT19TVEFURV9SRUFESU5HKQorCQkJamZmczJfc2V0X2lub2NhY2hlX3N0YXRlKGMsIGYtPmlub2NhY2hlLCBJTk9fU1RBVEVfQ0hFQ0tFREFCU0VOVCk7CisJCWpmZnMyX2ZyZWVfdG1wX2Rub2RlX2luZm9fbGlzdCgmcmlpLnRuX3Jvb3QpOworCQkvKiBGSVhNRTogV2UgY291bGQgYXQgbGVhc3QgY3JjLWNoZWNrIHRoZW0gYWxsICovCisJCWlmIChyaWkubWRhdGFfdG4pIHsKKwkJCWpmZnMyX2ZyZWVfZnVsbF9kbm9kZShyaWkubWRhdGFfdG4tPmZuKTsKKwkJCWpmZnMyX2ZyZWVfdG1wX2Rub2RlX2luZm8ocmlpLm1kYXRhX3RuKTsKKwkJCXJpaS5tZGF0YV90biA9IE5VTEw7CiAJCX0KKwkJcmV0dXJuIHJldDsKIAl9CisKKwlpZiAocmlpLm1kYXRhX3RuKSB7CisJCWlmIChyaWkubWRhdGFfdG4tPmZuLT5yYXcgPT0gcmlpLmxhdGVzdF9yZWYpIHsKKwkJCWYtPm1ldGFkYXRhID0gcmlpLm1kYXRhX3RuLT5mbjsKKwkJCWpmZnMyX2ZyZWVfdG1wX2Rub2RlX2luZm8ocmlpLm1kYXRhX3RuKTsKKwkJfSBlbHNlIHsKKwkJCWpmZnMyX2tpbGxfdG4oYywgcmlpLm1kYXRhX3RuKTsKKwkJfQorCQlyaWkubWRhdGFfdG4gPSBOVUxMOworCX0KKworCWYtPmRlbnRzID0gcmlpLmZkczsKKwogCWpmZnMyX2RiZ19mcmFndHJlZV9wYXJhbm9pYV9jaGVja19ub2xvY2soZik7CiAKLQlCVUdfT04oZmlyc3RfZm4gJiYgcmVmX29ic29sZXRlKGZpcnN0X2ZuLT5yYXcpKTsKLQotCWZuID0gZmlyc3RfZm47Ci0JaWYgKHVubGlrZWx5KCFmaXJzdF9mbikpIHsKKwlpZiAodW5saWtlbHkoIXJpaS5sYXRlc3RfcmVmKSkgewogCQkvKiBObyBkYXRhIG5vZGVzIGZvciB0aGlzIGlub2RlLiAqLwogCQlpZiAoZi0+aW5vY2FjaGUtPmlubyAhPSAxKSB7CiAJCQlKRkZTMl9XQVJOSU5HKCJubyBkYXRhIG5vZGVzIGZvdW5kIGZvciBpbm8gIyV1XG4iLCBmLT5pbm9jYWNoZS0+aW5vKTsKLQkJCWlmICghZmRfbGlzdCkgeworCQkJaWYgKCFyaWkuZmRzKSB7CiAJCQkJaWYgKGYtPmlub2NhY2hlLT5zdGF0ZSA9PSBJTk9fU1RBVEVfUkVBRElORykKIAkJCQkJamZmczJfc2V0X2lub2NhY2hlX3N0YXRlKGMsIGYtPmlub2NhY2hlLCBJTk9fU1RBVEVfQ0hFQ0tFREFCU0VOVCk7CiAJCQkJcmV0dXJuIC1FSU87CkBAIC03NzgsNyArMTIwMiw3IEBACiAJCXJldHVybiAwOwogCX0KIAotCXJldCA9IGpmZnMyX2ZsYXNoX3JlYWQoYywgcmVmX29mZnNldChmbi0+cmF3KSwgc2l6ZW9mKCpsYXRlc3Rfbm9kZSksICZyZXRsZW4sICh2b2lkICopbGF0ZXN0X25vZGUpOworCXJldCA9IGpmZnMyX2ZsYXNoX3JlYWQoYywgcmVmX29mZnNldChyaWkubGF0ZXN0X3JlZiksIHNpemVvZigqbGF0ZXN0X25vZGUpLCAmcmV0bGVuLCAodm9pZCAqKWxhdGVzdF9ub2RlKTsKIAlpZiAocmV0IHx8IHJldGxlbiAhPSBzaXplb2YoKmxhdGVzdF9ub2RlKSkgewogCQlKRkZTMl9FUlJPUigiZmFpbGVkIHRvIHJlYWQgZnJvbSBmbGFzaDogZXJyb3IgJWQsICV6ZCBvZiAlemQgYnl0ZXMgcmVhZFxuIiwKIAkJCXJldCwgcmV0bGVuLCBzaXplb2YoKmxhdGVzdF9ub2RlKSk7CkBAIC03OTEsNyArMTIxNSw3IEBACiAJY3JjID0gY3JjMzIoMCwgbGF0ZXN0X25vZGUsIHNpemVvZigqbGF0ZXN0X25vZGUpLTgpOwogCWlmIChjcmMgIT0gamUzMl90b19jcHUobGF0ZXN0X25vZGUtPm5vZGVfY3JjKSkgewogCQlKRkZTMl9FUlJPUigiQ1JDIGZhaWxlZCBmb3IgcmVhZF9pbm9kZSBvZiBpbm9kZSAldSBhdCBwaHlzaWNhbCBsb2NhdGlvbiAweCV4XG4iLAotCQkJZi0+aW5vY2FjaGUtPmlubywgcmVmX29mZnNldChmbi0+cmF3KSk7CisJCQlmLT5pbm9jYWNoZS0+aW5vLCByZWZfb2Zmc2V0KHJpaS5sYXRlc3RfcmVmKSk7CiAJCXVwKCZmLT5zZW0pOwogCQlqZmZzMl9kb19jbGVhcl9pbm9kZShjLCBmKTsKIAkJcmV0dXJuIC1FSU87CkBAIC03OTksMTcgKzEyMjMsMjIgQEAKIAogCXN3aXRjaChqZW1vZGVfdG9fY3B1KGxhdGVzdF9ub2RlLT5tb2RlKSAmIFNfSUZNVCkgewogCWNhc2UgU19JRkRJUjoKLQkJaWYgKG1jdGltZV92ZXIgPiBqZTMyX3RvX2NwdShsYXRlc3Rfbm9kZS0+dmVyc2lvbikpIHsKKwkJaWYgKHJpaS5tY3RpbWVfdmVyID4gamUzMl90b19jcHUobGF0ZXN0X25vZGUtPnZlcnNpb24pKSB7CiAJCQkvKiBUaGUgdGltZXMgaW4gdGhlIGxhdGVzdF9ub2RlIGFyZSBhY3R1YWxseSBvbGRlciB0aGFuCiAJCQkgICBtY3RpbWUgaW4gdGhlIGxhdGVzdCBkaXJlbnQuIENoZWF0LiAqLwotCQkJbGF0ZXN0X25vZGUtPmN0aW1lID0gbGF0ZXN0X25vZGUtPm10aW1lID0gY3B1X3RvX2plMzIobGF0ZXN0X21jdGltZSk7CisJCQlsYXRlc3Rfbm9kZS0+Y3RpbWUgPSBsYXRlc3Rfbm9kZS0+bXRpbWUgPSBjcHVfdG9famUzMihyaWkubGF0ZXN0X21jdGltZSk7CiAJCX0KIAkJYnJlYWs7CiAKIAogCWNhc2UgU19JRlJFRzoKIAkJLyogSWYgaXQgd2FzIGEgcmVndWxhciBmaWxlLCB0cnVuY2F0ZSBpdCB0byB0aGUgbGF0ZXN0IG5vZGUncyBpc2l6ZSAqLwotCQlqZmZzMl90cnVuY2F0ZV9mcmFndHJlZShjLCAmZi0+ZnJhZ3RyZWUsIGplMzJfdG9fY3B1KGxhdGVzdF9ub2RlLT5pc2l6ZSkpOworCQluZXdfc2l6ZSA9IGpmZnMyX3RydW5jYXRlX2ZyYWd0cmVlKGMsICZmLT5mcmFndHJlZSwgamUzMl90b19jcHUobGF0ZXN0X25vZGUtPmlzaXplKSk7CisJCWlmIChuZXdfc2l6ZSAhPSBqZTMyX3RvX2NwdShsYXRlc3Rfbm9kZS0+aXNpemUpKSB7CisJCQlKRkZTMl9XQVJOSU5HKCJUcnVuY2F0aW5nIGlubyAjJXUgdG8gJWQgYnl0ZXMgZmFpbGVkIGJlY2F1c2UgaXQgb25seSBoYWQgJWQgYnl0ZXMgdG8gc3RhcnQgd2l0aCFcbiIsCisJCQkJICAgICAgZi0+aW5vY2FjaGUtPmlubywgamUzMl90b19jcHUobGF0ZXN0X25vZGUtPmlzaXplKSwgbmV3X3NpemUpOworCQkJbGF0ZXN0X25vZGUtPmlzaXplID0gY3B1X3RvX2plMzIobmV3X3NpemUpOworCQl9CiAJCWJyZWFrOwogCiAJY2FzZSBTX0lGTE5LOgpAQCAtODMyLDcgKzEyNjEsNyBAQAogCQkJCXJldHVybiAtRU5PTUVNOwogCQkJfQogCi0JCQlyZXQgPSBqZmZzMl9mbGFzaF9yZWFkKGMsIHJlZl9vZmZzZXQoZm4tPnJhdykgKyBzaXplb2YoKmxhdGVzdF9ub2RlKSwKKwkJCXJldCA9IGpmZnMyX2ZsYXNoX3JlYWQoYywgcmVmX29mZnNldChyaWkubGF0ZXN0X3JlZikgKyBzaXplb2YoKmxhdGVzdF9ub2RlKSwKIAkJCQkJCWplMzJfdG9fY3B1KGxhdGVzdF9ub2RlLT5jc2l6ZSksICZyZXRsZW4sIChjaGFyICopZi0+dGFyZ2V0KTsKIAogCQkJaWYgKHJldCAgfHwgcmV0bGVuICE9IGplMzJfdG9fY3B1KGxhdGVzdF9ub2RlLT5jc2l6ZSkpIHsKZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL3NjYW4uYyBiL2ZzL2pmZnMyL3NjYW4uYwppbmRleCA3ZmI0NWJkNC4uMmExYzk3NiAxMDA2NDQKLS0tIGEvZnMvamZmczIvc2Nhbi5jCisrKyBiL2ZzL2pmZnMyL3NjYW4uYwpAQCAtMSwxNSArMSwxNCBAQAogLyoKICAqIEpGRlMyIC0tIEpvdXJuYWxsaW5nIEZsYXNoIEZpbGUgU3lzdGVtLCBWZXJzaW9uIDIuCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDMgUmVkIEhhdCwgSW5jLgorICogQ29weXJpZ2h0IMKpIDIwMDEtMjAwNyBSZWQgSGF0LCBJbmMuCiAgKgogICogQ3JlYXRlZCBieSBEYXZpZCBXb29kaG91c2UgPGR3bXcyQGluZnJhZGVhZC5vcmc+CiAgKgogICogRm9yIGxpY2Vuc2luZyBpbmZvcm1hdGlvbiwgc2VlIHRoZSBmaWxlICdMSUNFTkNFJyBpbiB0aGlzIGRpcmVjdG9yeS4KICAqCi0gKiAkSWQ6IHNjYW4uYyx2IDEuMTI1IDIwMDUvMDkvMzAgMTM6NTk6MTMgZGVkZWtpbmQgRXhwICQKLSAqCiAgKi8KKwogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpAQCAtNjM2LDE2ICs2MzUsMTcgQEAKIAogCQlpZiAoKih1aW50MzJfdCAqKSgmYnVmW29mcy1idWZfb2ZzXSkgPT0gMHhmZmZmZmZmZikgewogCQkJdWludDMyX3QgaW5idWZfb2ZzOwotCQkJdWludDMyX3QgZW1wdHlfc3RhcnQ7CisJCQl1aW50MzJfdCBlbXB0eV9zdGFydCwgc2Nhbl9lbmQ7CiAKIAkJCWVtcHR5X3N0YXJ0ID0gb2ZzOwogCQkJb2ZzICs9IDQ7CisJCQlzY2FuX2VuZCA9IG1pbl90KHVpbnQzMl90LCBFTVBUWV9TQ0FOX1NJWkUoYy0+c2VjdG9yX3NpemUpLzgsIGJ1Zl9sZW4pOwogCiAJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiRm91bmQgZW1wdHkgZmxhc2ggYXQgMHglMDh4XG4iLCBvZnMpKTsKIAkJbW9yZV9lbXB0eToKIAkJCWluYnVmX29mcyA9IG9mcyAtIGJ1Zl9vZnM7Ci0JCQl3aGlsZSAoaW5idWZfb2ZzIDwgYnVmX2xlbikgewotCQkJCWlmICgqKHVpbnQzMl90ICopKCZidWZbaW5idWZfb2ZzXSkgIT0gMHhmZmZmZmZmZikgeworCQkJd2hpbGUgKGluYnVmX29mcyA8IHNjYW5fZW5kKSB7CisJCQkJaWYgKHVubGlrZWx5KCoodWludDMyX3QgKikoJmJ1ZltpbmJ1Zl9vZnNdKSAhPSAweGZmZmZmZmZmKSkgewogCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJFbXB0eSBmbGFzaCBhdCAweCUwOHggZW5kcyBhdCAweCUwOHhcbiIsCiAJCQkJCSAgICAgICBlbXB0eV9zdGFydCwgb2ZzKTsKIAkJCQkJaWYgKChlcnIgPSBqZmZzMl9zY2FuX2RpcnR5X3NwYWNlKGMsIGplYiwgb2ZzLWVtcHR5X3N0YXJ0KSkpCkBAIC02NjYsNyArNjY2LDExIEBACiAJCQkJRDEocHJpbnRrKEtFUk5fREVCVUcgIiVkIGJ5dGVzIGF0IHN0YXJ0IG9mIGJsb2NrIHNlZW1zIGNsZWFuLi4uIGFzc3VtaW5nIGFsbCBjbGVhblxuIiwgRU1QVFlfU0NBTl9TSVpFKGMtPnNlY3Rvcl9zaXplKSkpOwogCQkJCXJldHVybiBCTEtfU1RBVEVfQ0xFQU5NQVJLRVI7CiAJCQl9Ci0KKwkJCWlmICghYnVmX3NpemUgJiYgKHNjYW5fZW5kICE9IGJ1Zl9sZW4pKSB7LyogWElQL3BvaW50IGNhc2UgKi8KKwkJCQlzY2FuX2VuZCA9IGJ1Zl9sZW47CisJCQkJZ290byBtb3JlX2VtcHR5OworCQkJfQorCQkJCiAJCQkvKiBTZWUgaG93IG11Y2ggbW9yZSB0aGVyZSBpcyB0byByZWFkIGluIHRoaXMgZXJhc2VibG9jay4uLiAqLwogCQkJYnVmX2xlbiA9IG1pbl90KHVpbnQzMl90LCBidWZfc2l6ZSwgamViLT5vZmZzZXQgKyBjLT5zZWN0b3Jfc2l6ZSAtIG9mcyk7CiAJCQlpZiAoIWJ1Zl9sZW4pIHsKQEAgLTY3Niw2ICs2ODAsOCBAQAogCQkJCQkgIGVtcHR5X3N0YXJ0KSk7CiAJCQkJYnJlYWs7CiAJCQl9CisJCQkvKiBwb2ludCBuZXZlciByZWFjaGVzIGhlcmUgKi8KKwkJCXNjYW5fZW5kID0gYnVmX2xlbjsKIAkJCUQxKHByaW50ayhLRVJOX0RFQlVHICJSZWFkaW5nIGFub3RoZXIgMHgleCBhdCAweCUwOHhcbiIsIGJ1Zl9sZW4sIG9mcykpOwogCQkJZXJyID0gamZmczJfZmlsbF9zY2FuX2J1ZihjLCBidWYsIG9mcywgYnVmX2xlbik7CiAJCQlpZiAoZXJyKQpAQCAtNzM0LDE4ICs3NDAsOCBAQAogCQkJb2ZzICs9IDQ7CiAJCQljb250aW51ZTsKIAkJfQotCQkvKiBEdWUgdG8gcG9vciBjaG9pY2Ugb2YgY3JjMzIgc2VlZCwgYW4gYWxsLXplcm8gbm9kZSB3aWxsIGhhdmUgYSBjb3JyZWN0IENSQyAqLwotCQlpZiAoIWplMzJfdG9fY3B1KG5vZGUtPmhkcl9jcmMpICYmICFqZTE2X3RvX2NwdShub2RlLT5ub2RldHlwZSkgJiYKLQkJICAgICFqZTE2X3RvX2NwdShub2RlLT5tYWdpYykgJiYgIWplMzJfdG9fY3B1KG5vZGUtPnRvdGxlbikpIHsKLQkJCW5vaXN5X3ByaW50aygmbm9pc2UsICJqZmZzMl9zY2FuX2VyYXNlYmxvY2soKTogQWxsIHplcm8gbm9kZSBoZWFkZXIgYXQgMHglMDh4LlxuIiwgb2ZzKTsKLQkJCWlmICgoZXJyID0gamZmczJfc2Nhbl9kaXJ0eV9zcGFjZShjLCBqZWIsIDQpKSkKLQkJCQlyZXR1cm4gZXJyOwotCQkJb2ZzICs9IDQ7Ci0JCQljb250aW51ZTsKLQkJfQogCi0JCWlmIChvZnMgKyBqZTMyX3RvX2NwdShub2RlLT50b3RsZW4pID4KLQkJICAgIGplYi0+b2Zmc2V0ICsgYy0+c2VjdG9yX3NpemUpIHsKKwkJaWYgKG9mcyArIGplMzJfdG9fY3B1KG5vZGUtPnRvdGxlbikgPiBqZWItPm9mZnNldCArIGMtPnNlY3Rvcl9zaXplKSB7CiAJCQkvKiBFZXAuIE5vZGUgZ29lcyBvdmVyIHRoZSBlbmQgb2YgdGhlIGVyYXNlIGJsb2NrLiAqLwogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiTm9kZSBhdCAweCUwOHggd2l0aCBsZW5ndGggMHglMDh4IHdvdWxkIHJ1biBvdmVyIHRoZSBlbmQgb2YgdGhlIGVyYXNlIGJsb2NrXG4iLAogCQkJICAgICAgIG9mcywgamUzMl90b19jcHUobm9kZS0+dG90bGVuKSk7CkBAIC05NTIsOCArOTQ4LDcgQEAKIAkJCQkgc3RydWN0IGpmZnMyX3Jhd19pbm9kZSAqcmksIHVpbnQzMl90IG9mcywgc3RydWN0IGpmZnMyX3N1bW1hcnkgKnMpCiB7CiAJc3RydWN0IGpmZnMyX2lub2RlX2NhY2hlICppYzsKLQl1aW50MzJfdCBpbm8gPSBqZTMyX3RvX2NwdShyaS0+aW5vKTsKLQlpbnQgZXJyOworCXVpbnQzMl90IGNyYywgaW5vID0gamUzMl90b19jcHUocmktPmlubyk7CiAKIAlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfc2Nhbl9pbm9kZV9ub2RlKCk6IE5vZGUgYXQgMHglMDh4XG4iLCBvZnMpKTsKIApAQCAtOTY2LDIxICs5NjEsMjIgQEAKIAkgICBXaGljaCBtZWFucyB0aGF0IHRoZSBfZnVsbF8gYW1vdW50IG9mIHRpbWUgdG8gZ2V0IHRvIHByb3BlciB3cml0ZSBtb2RlIHdpdGggR0MKIAkgICBvcGVyYXRpb25hbCBtYXkgYWN0dWFsbHkgYmUgX2xvbmdlcl8gdGhhbiBiZWZvcmUuIFN1Y2tzIHRvIGJlIG1lLiAqLwogCisJLyogQ2hlY2sgdGhlIG5vZGUgQ1JDIGluIGFueSBjYXNlLiAqLworCWNyYyA9IGNyYzMyKDAsIHJpLCBzaXplb2YoKnJpKS04KTsKKwlpZiAoY3JjICE9IGplMzJfdG9fY3B1KHJpLT5ub2RlX2NyYykpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJqZmZzMl9zY2FuX2lub2RlX25vZGUoKTogQ1JDIGZhaWxlZCBvbiAiCisJCSAgICAgICAibm9kZSBhdCAweCUwOHg6IFJlYWQgMHglMDh4LCBjYWxjdWxhdGVkIDB4JTA4eFxuIiwKKwkJICAgICAgIG9mcywgamUzMl90b19jcHUocmktPm5vZGVfY3JjKSwgY3JjKTsKKwkJLyoKKwkJICogV2UgYmVsaWV2ZSB0b3RsZW4gYmVjYXVzZSB0aGUgQ1JDIG9uIHRoZSBub2RlCisJCSAqIF9oZWFkZXJfIHdhcyBPSywganVzdCB0aGUgbm9kZSBpdHNlbGYgZmFpbGVkLgorCQkgKi8KKwkJcmV0dXJuIGpmZnMyX3NjYW5fZGlydHlfc3BhY2UoYywgamViLAorCQkJCQkgICAgICBQQUQoamUzMl90b19jcHUocmktPnRvdGxlbikpKTsKKwl9CisKIAlpYyA9IGpmZnMyX2dldF9pbm9fY2FjaGUoYywgaW5vKTsKIAlpZiAoIWljKSB7Ci0JCS8qIElub2NhY2hlIGdldCBmYWlsZWQuIEVpdGhlciB3ZSByZWFkIGEgYm9ndXMgaW5vIyBvciBpdCdzIGp1c3QgZ2VudWluZWx5IHRoZQotCQkgICBmaXJzdCBub2RlIHdlIGZvdW5kIGZvciB0aGlzIGlub2RlLiBEbyBhIENSQyBjaGVjayB0byBwcm90ZWN0IGFnYWluc3QgdGhlIGZvcm1lcgotCQkgICBjYXNlICovCi0JCXVpbnQzMl90IGNyYyA9IGNyYzMyKDAsIHJpLCBzaXplb2YoKnJpKS04KTsKLQotCQlpZiAoY3JjICE9IGplMzJfdG9fY3B1KHJpLT5ub2RlX2NyYykpIHsKLQkJCXByaW50ayhLRVJOX05PVElDRSAiamZmczJfc2Nhbl9pbm9kZV9ub2RlKCk6IENSQyBmYWlsZWQgb24gbm9kZSBhdCAweCUwOHg6IFJlYWQgMHglMDh4LCBjYWxjdWxhdGVkIDB4JTA4eFxuIiwKLQkJCSAgICAgICBvZnMsIGplMzJfdG9fY3B1KHJpLT5ub2RlX2NyYyksIGNyYyk7Ci0JCQkvKiBXZSBiZWxpZXZlIHRvdGxlbiBiZWNhdXNlIHRoZSBDUkMgb24gdGhlIG5vZGUgX2hlYWRlcl8gd2FzIE9LLCBqdXN0IHRoZSBub2RlIGl0c2VsZiBmYWlsZWQuICovCi0JCQlpZiAoKGVyciA9IGpmZnMyX3NjYW5fZGlydHlfc3BhY2UoYywgamViLCBQQUQoamUzMl90b19jcHUocmktPnRvdGxlbikpKSkpCi0JCQkJcmV0dXJuIGVycjsKLQkJCXJldHVybiAwOwotCQl9CiAJCWljID0gamZmczJfc2Nhbl9tYWtlX2lub19jYWNoZShjLCBpbm8pOwogCQlpZiAoIWljKQogCQkJcmV0dXJuIC1FTk9NRU07CmRpZmYgLS1naXQgYS9mcy9qZmZzMi9zZWN1cml0eS5jIGIvZnMvamZmczIvc2VjdXJpdHkuYwppbmRleCA1MmE5ODk0Li5iYzlmNmJhIDEwMDY0NAotLS0gYS9mcy9qZmZzMi9zZWN1cml0eS5jCisrKyBiL2ZzL2pmZnMyL3NlY3VyaXR5LmMKQEAgLTEsMTMgKzEsMTQgQEAKIC8qCiAgKiBKRkZTMiAtLSBKb3VybmFsbGluZyBGbGFzaCBGaWxlIFN5c3RlbSwgVmVyc2lvbiAyLgogICoKLSAqIENvcHlyaWdodCAoQykgMjAwNiAgTkVDIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgwqkgMjAwNiAgTkVDIENvcnBvcmF0aW9uCiAgKgogICogQ3JlYXRlZCBieSBLYWlHYWkgS29oZWkgPGthaWdhaUBhay5qcC5uZWMuY29tPgogICoKICAqIEZvciBsaWNlbnNpbmcgaW5mb3JtYXRpb24sIHNlZSB0aGUgZmlsZSAnTElDRU5DRScgaW4gdGhpcyBkaXJlY3RvcnkuCiAgKgogICovCisKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL3N1bW1hcnkuYyBiL2ZzL2pmZnMyL3N1bW1hcnkuYwppbmRleCAzMGY4ODg0Li5kODI4YjI5IDEwMDY0NAotLS0gYS9mcy9qZmZzMi9zdW1tYXJ5LmMKKysrIGIvZnMvamZmczIvc3VtbWFyeS5jCkBAIC0xLDE2ICsxLDE0IEBACiAvKgogICogSkZGUzIgLS0gSm91cm5hbGxpbmcgRmxhc2ggRmlsZSBTeXN0ZW0sIFZlcnNpb24gMi4KICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQgIEZlcmVuYyBIYXZhc2kgPGhhdmFzaUBpbmYudS1zemVnZWQuaHU+LAotICogICAgICAgICAgICAgICAgICAgICBab2x0YW4gU29nb3IgPHdldGhAaW5mLnUtc3plZ2VkLmh1PiwKLSAqICAgICAgICAgICAgICAgICAgICAgUGF0cmlrIEtsdWJhIDxwYWprb0BoYWxvbS51LXN6ZWdlZC5odT4sCi0gKiAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgb2YgU3plZ2VkLCBIdW5nYXJ5Ci0gKiAgICAgICAgICAgICAgIDIwMDYgIEthaUdhaSBLb2hlaSA8a2FpZ2FpQGFrLmpwLm5lYy5jb20+CisgKiBDb3B5cmlnaHQgwqkgMjAwNCAgRmVyZW5jIEhhdmFzaSA8aGF2YXNpQGluZi51LXN6ZWdlZC5odT4sCisgKiAgICAgICAgICAgICAgICAgICBab2x0YW4gU29nb3IgPHdldGhAaW5mLnUtc3plZ2VkLmh1PiwKKyAqICAgICAgICAgICAgICAgICAgIFBhdHJpayBLbHViYSA8cGFqa29AaGFsb20udS1zemVnZWQuaHU+LAorICogICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBvZiBTemVnZWQsIEh1bmdhcnkKKyAqICAgICAgICAgICAgIDIwMDYgIEthaUdhaSBLb2hlaSA8a2FpZ2FpQGFrLmpwLm5lYy5jb20+CiAgKgogICogRm9yIGxpY2Vuc2luZyBpbmZvcm1hdGlvbiwgc2VlIHRoZSBmaWxlICdMSUNFTkNFJyBpbiB0aGlzIGRpcmVjdG9yeS4KICAqCi0gKiAkSWQ6IHN1bW1hcnkuYyx2IDEuNCAyMDA1LzA5LzI2IDExOjM3OjIxIGhhdmFzaSBFeHAgJAotICoKICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CmRpZmYgLS1naXQgYS9mcy9qZmZzMi9zdW1tYXJ5LmggYi9mcy9qZmZzMi9zdW1tYXJ5LmgKaW5kZXggNmJmMWY2YS4uMGM2NjY5ZSAxMDA2NDQKLS0tIGEvZnMvamZmczIvc3VtbWFyeS5oCisrKyBiL2ZzL2pmZnMyL3N1bW1hcnkuaApAQCAtMSwxNSArMSwxMyBAQAogLyoKICAqIEpGRlMyIC0tIEpvdXJuYWxsaW5nIEZsYXNoIEZpbGUgU3lzdGVtLCBWZXJzaW9uIDIuCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDA0ICBGZXJlbmMgSGF2YXNpIDxoYXZhc2lAaW5mLnUtc3plZ2VkLmh1PiwKLSAqICAgICAgICAgICAgICAgICAgICAgWm9sdGFuIFNvZ29yIDx3ZXRoQGluZi51LXN6ZWdlZC5odT4sCi0gKiAgICAgICAgICAgICAgICAgICAgIFBhdHJpayBLbHViYSA8cGFqa29AaGFsb20udS1zemVnZWQuaHU+LAotICogICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IG9mIFN6ZWdlZCwgSHVuZ2FyeQorICogQ29weXJpZ2h0IMKpIDIwMDQgIEZlcmVuYyBIYXZhc2kgPGhhdmFzaUBpbmYudS1zemVnZWQuaHU+LAorICogICAgICAgICAgICAgICAgICAgWm9sdGFuIFNvZ29yIDx3ZXRoQGluZi51LXN6ZWdlZC5odT4sCisgKiAgICAgICAgICAgICAgICAgICBQYXRyaWsgS2x1YmEgPHBhamtvQGhhbG9tLnUtc3plZ2VkLmh1PiwKKyAqICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdHkgb2YgU3plZ2VkLCBIdW5nYXJ5CiAgKgogICogRm9yIGxpY2Vuc2luZyBpbmZvcm1hdGlvbiwgc2VlIHRoZSBmaWxlICdMSUNFTkNFJyBpbiB0aGlzIGRpcmVjdG9yeS4KICAqCi0gKiAkSWQ6IHN1bW1hcnkuaCx2IDEuMiAyMDA1LzA5LzI2IDExOjM3OjIxIGhhdmFzaSBFeHAgJAotICoKICAqLwogCiAjaWZuZGVmIEpGRlMyX1NVTU1BUllfSApkaWZmIC0tZ2l0IGEvZnMvamZmczIvc3VwZXIuYyBiL2ZzL2pmZnMyL3N1cGVyLmMKaW5kZXggY2M3ZThlNy4uZTUxMTY0YSAxMDA2NDQKLS0tIGEvZnMvamZmczIvc3VwZXIuYworKysgYi9mcy9qZmZzMi9zdXBlci5jCkBAIC0xLDE0ICsxLDEyIEBACiAvKgogICogSkZGUzIgLS0gSm91cm5hbGxpbmcgRmxhc2ggRmlsZSBTeXN0ZW0sIFZlcnNpb24gMi4KICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMyBSZWQgSGF0LCBJbmMuCisgKiBDb3B5cmlnaHQgwqkgMjAwMS0yMDA3IFJlZCBIYXQsIEluYy4KICAqCiAgKiBDcmVhdGVkIGJ5IERhdmlkIFdvb2Rob3VzZSA8ZHdtdzJAaW5mcmFkZWFkLm9yZz4KICAqCiAgKiBGb3IgbGljZW5zaW5nIGluZm9ybWF0aW9uLCBzZWUgdGhlIGZpbGUgJ0xJQ0VOQ0UnIGluIHRoaXMgZGlyZWN0b3J5LgogICoKLSAqICRJZDogc3VwZXIuYyx2IDEuMTEwIDIwMDUvMTEvMDcgMTE6MTQ6NDIgZ2xlaXhuZXIgRXhwICQKLSAqCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpAQCAtMzQ3LDcgKzM0NSw3IEBACiAjaWZkZWYgQ09ORklHX0pGRlMyX1NVTU1BUlkKIAkgICAgICAgIiAoU1VNTUFSWSkgIgogI2VuZGlmCi0JICAgICAgICIgKEMpIDIwMDEtMjAwNiBSZWQgSGF0LCBJbmMuXG4iKTsKKwkgICAgICAgIiDCqSAyMDAxLTIwMDYgUmVkIEhhdCwgSW5jLlxuIik7CiAKIAlqZmZzMl9pbm9kZV9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiamZmczJfaSIsCiAJCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvKSwKZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL3N5bWxpbmsuYyBiL2ZzL2pmZnMyL3N5bWxpbmsuYwppbmRleCA3ZTQ4ODJjLi5iNzMzOWMzIDEwMDY0NAotLS0gYS9mcy9qZmZzMi9zeW1saW5rLmMKKysrIGIvZnMvamZmczIvc3ltbGluay5jCkBAIC0xLDE3ICsxLDE0IEBACiAvKgogICogSkZGUzIgLS0gSm91cm5hbGxpbmcgRmxhc2ggRmlsZSBTeXN0ZW0sIFZlcnNpb24gMi4KICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIgUmVkIEhhdCwgSW5jLgorICogQ29weXJpZ2h0IMKpIDIwMDEtMjAwNyBSZWQgSGF0LCBJbmMuCiAgKgogICogQ3JlYXRlZCBieSBEYXZpZCBXb29kaG91c2UgPGR3bXcyQGluZnJhZGVhZC5vcmc+CiAgKgogICogRm9yIGxpY2Vuc2luZyBpbmZvcm1hdGlvbiwgc2VlIHRoZSBmaWxlICdMSUNFTkNFJyBpbiB0aGlzIGRpcmVjdG9yeS4KICAqCi0gKiAkSWQ6IHN5bWxpbmsuYyx2IDEuMTkgMjAwNS8xMS8wNyAxMToxNDo0MiBnbGVpeG5lciBFeHAgJAotICoKICAqLwogCi0KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL3didWYuYyBiL2ZzL2pmZnMyL3didWYuYwppbmRleCA0ZmFjNmRkLi5jNTU2ZTg1IDEwMDY0NAotLS0gYS9mcy9qZmZzMi93YnVmLmMKKysrIGIvZnMvamZmczIvd2J1Zi5jCkBAIC0xLDE2ICsxLDE0IEBACiAvKgogICogSkZGUzIgLS0gSm91cm5hbGxpbmcgRmxhc2ggRmlsZSBTeXN0ZW0sIFZlcnNpb24gMi4KICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMyBSZWQgSGF0LCBJbmMuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQgVGhvbWFzIEdsZWl4bmVyIDx0Z2x4QGxpbnV0cm9uaXguZGU+CisgKiBDb3B5cmlnaHQgwqkgMjAwMS0yMDA3IFJlZCBIYXQsIEluYy4KKyAqIENvcHlyaWdodCDCqSAyMDA0IFRob21hcyBHbGVpeG5lciA8dGdseEBsaW51dHJvbml4LmRlPgogICoKICAqIENyZWF0ZWQgYnkgRGF2aWQgV29vZGhvdXNlIDxkd213MkBpbmZyYWRlYWQub3JnPgogICogTW9kaWZpZWQgZGVidWdnZWQgYW5kIGVuaGFuY2VkIGJ5IFRob21hcyBHbGVpeG5lciA8dGdseEBsaW51dHJvbml4LmRlPgogICoKICAqIEZvciBsaWNlbnNpbmcgaW5mb3JtYXRpb24sIHNlZSB0aGUgZmlsZSAnTElDRU5DRScgaW4gdGhpcyBkaXJlY3RvcnkuCiAgKgotICogJElkOiB3YnVmLmMsdiAxLjEwMCAyMDA1LzA5LzMwIDEzOjU5OjEzIGRlZGVraW5kIEV4cCAkCi0gKgogICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KQEAgLTM0NSw2ICszNDMsOSBAQAogCQlyZXR1cm47CiAJfQogCisJLyogVGhlIHN1bW1hcnkgaXMgbm90IHJlY292ZXJlZCwgc28gaXQgbXVzdCBiZSBkaXNhYmxlZCBmb3IgdGhpcyBlcmFzZSBibG9jayAqLworCWpmZnMyX3N1bV9kaXNhYmxlX2NvbGxlY3RpbmcoYy0+c3VtbWFyeSk7CisKIAlyZXQgPSBqZmZzMl9wcmVhbGxvY19yYXdfbm9kZV9yZWZzKGMsIGMtPm5leHRibG9jaywgbnJfcmVmaWxlKTsKIAlpZiAocmV0KSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIkZhaWxlZCB0byBhbGxvY2F0ZSBub2RlIHJlZnMgZm9yIHdidWYgcmVjb3ZlcnkuIERhdGEgbG9zcyBlbnN1ZXMuXG4iKTsKQEAgLTk2Nyw5ICs5NjgsOSBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGpmZnMyX3Vua25vd25fbm9kZSBvb2JfY2xlYW5tYXJrZXIgPQogewotCS5tYWdpYyA9IGNwdV90b19qZTE2KEpGRlMyX01BR0lDX0JJVE1BU0spLAotCS5ub2RldHlwZSA9IGNwdV90b19qZTE2KEpGRlMyX05PREVUWVBFX0NMRUFOTUFSS0VSKSwKLQkudG90bGVuID0gY3B1X3RvX2plMzIoOCkKKwkubWFnaWMgPSBjb25zdGFudF9jcHVfdG9famUxNihKRkZTMl9NQUdJQ19CSVRNQVNLKSwKKwkubm9kZXR5cGUgPSBjb25zdGFudF9jcHVfdG9famUxNihKRkZTMl9OT0RFVFlQRV9DTEVBTk1BUktFUiksCisJLnRvdGxlbiA9IGNvbnN0YW50X2NwdV90b19qZTMyKDgpCiB9OwogCiAvKgpAQCAtMTIwOCwzICsxMjA5LDI3IEBACiB2b2lkIGpmZnMyX25vcl93YnVmX2ZsYXNoX2NsZWFudXAoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMpIHsKIAlrZnJlZShjLT53YnVmKTsKIH0KKworaW50IGpmZnMyX3ViaXZvbF9zZXR1cChzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYykgeworCWMtPmNsZWFubWFya2VyX3NpemUgPSAwOworCisJaWYgKGMtPm10ZC0+d3JpdGVzaXplID09IDEpCisJCS8qIFdlIGRvIG5vdCBuZWVkIHdyaXRlLWJ1ZmZlciAqLworCQlyZXR1cm4gMDsKKworCWluaXRfcndzZW0oJmMtPndidWZfc2VtKTsKKworCWMtPndidWZfcGFnZXNpemUgPSAgYy0+bXRkLT53cml0ZXNpemU7CisJYy0+d2J1Zl9vZnMgPSAweEZGRkZGRkZGOworCWMtPndidWYgPSBrbWFsbG9jKGMtPndidWZfcGFnZXNpemUsIEdGUF9LRVJORUwpOworCWlmICghYy0+d2J1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwcmludGsoS0VSTl9JTkZPICJKRkZTMiB3cml0ZS1idWZmZXJpbmcgZW5hYmxlZCBidWZmZXIgKCVkKSBlcmFzZXNpemUgKCVkKVxuIiwgYy0+d2J1Zl9wYWdlc2l6ZSwgYy0+c2VjdG9yX3NpemUpOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgamZmczJfdWJpdm9sX2NsZWFudXAoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMpIHsKKwlrZnJlZShjLT53YnVmKTsKK30KZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL3dyaXRlLmMgYi9mcy9qZmZzMi93cml0ZS5jCmluZGV4IDY3MTc2NzkuLmM5ZmUwYWIgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL3dyaXRlLmMKKysrIGIvZnMvamZmczIvd3JpdGUuYwpAQCAtMSwxNCArMSwxMiBAQAogLyoKICAqIEpGRlMyIC0tIEpvdXJuYWxsaW5nIEZsYXNoIEZpbGUgU3lzdGVtLCBWZXJzaW9uIDIuCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDMgUmVkIEhhdCwgSW5jLgorICogQ29weXJpZ2h0IMKpIDIwMDEtMjAwNyBSZWQgSGF0LCBJbmMuCiAgKgogICogQ3JlYXRlZCBieSBEYXZpZCBXb29kaG91c2UgPGR3bXcyQGluZnJhZGVhZC5vcmc+CiAgKgogICogRm9yIGxpY2Vuc2luZyBpbmZvcm1hdGlvbiwgc2VlIHRoZSBmaWxlICdMSUNFTkNFJyBpbiB0aGlzIGRpcmVjdG9yeS4KICAqCi0gKiAkSWQ6IHdyaXRlLmMsdiAxLjk3IDIwMDUvMTEvMDcgMTE6MTQ6NDIgZ2xlaXhuZXIgRXhwICQKLSAqCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpAQCAtNTA3LDggKzUwNSw3IEBACiAJdWludDMyX3QgYWxsb2NsZW47CiAJaW50IHJldDsKIAotCWlmICgxIC8qIGFsdGVybmF0aXZlIGJyYW5jaCBuZWVkcyB0ZXN0aW5nICovIHx8Ci0JICAgICFqZmZzMl9jYW5fbWFya19vYnNvbGV0ZShjKSkgeworCWlmICghamZmczJfY2FuX21hcmtfb2Jzb2xldGUoYykpIHsKIAkJLyogV2UgY2FuJ3QgbWFyayBzdHVmZiBvYnNvbGV0ZSBvbiB0aGUgbWVkaXVtLiBXZSBuZWVkIHRvIHdyaXRlIGEgZGVsZXRpb24gZGlyZW50ICovCiAKIAkJcmQgPSBqZmZzMl9hbGxvY19yYXdfZGlyZW50KCk7CmRpZmYgLS1naXQgYS9mcy9qZmZzMi93cml0ZXYuYyBiL2ZzL2pmZnMyL3dyaXRldi5jCmluZGV4IGM2MzhhZTEuLmI5Mjc2YjEgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL3dyaXRldi5jCisrKyBiL2ZzL2pmZnMyL3dyaXRldi5jCkBAIC0xLDE0ICsxLDEyIEBACiAvKgogICogSkZGUzIgLS0gSm91cm5hbGxpbmcgRmxhc2ggRmlsZSBTeXN0ZW0sIFZlcnNpb24gMi4KICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIgUmVkIEhhdCwgSW5jLgorICogQ29weXJpZ2h0IMKpIDIwMDEtMjAwNyBSZWQgSGF0LCBJbmMuCiAgKgogICogQ3JlYXRlZCBieSBEYXZpZCBXb29kaG91c2UgPGR3bXcyQGluZnJhZGVhZC5vcmc+CiAgKgogICogRm9yIGxpY2Vuc2luZyBpbmZvcm1hdGlvbiwgc2VlIHRoZSBmaWxlICdMSUNFTkNFJyBpbiB0aGlzIGRpcmVjdG9yeS4KICAqCi0gKiAkSWQ6IHdyaXRldi5jLHYgMS44IDIwMDUvMDkvMDkgMTU6MTE6NTggaGF2YXNpIEV4cCAkCi0gKgogICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL3hhdHRyLmMgYi9mcy9qZmZzMi94YXR0ci5jCmluZGV4IDRiYjNmMTguLjc4ZmMwODggMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL3hhdHRyLmMKKysrIGIvZnMvamZmczIveGF0dHIuYwpAQCAtMSwxMyArMSwxNCBAQAogLyoKICAqIEpGRlMyIC0tIEpvdXJuYWxsaW5nIEZsYXNoIEZpbGUgU3lzdGVtLCBWZXJzaW9uIDIuCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDA2ICBORUMgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCDCqSAyMDA2ICBORUMgQ29ycG9yYXRpb24KICAqCiAgKiBDcmVhdGVkIGJ5IEthaUdhaSBLb2hlaSA8a2FpZ2FpQGFrLmpwLm5lYy5jb20+CiAgKgogICogRm9yIGxpY2Vuc2luZyBpbmZvcm1hdGlvbiwgc2VlIHRoZSBmaWxlICdMSUNFTkNFJyBpbiB0aGlzIGRpcmVjdG9yeS4KICAqCiAgKi8KKwogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgpkaWZmIC0tZ2l0IGEvZnMvamZmczIveGF0dHIuaCBiL2ZzL2pmZnMyL3hhdHRyLmgKaW5kZXggMDZhNWM2OS4uM2IwZmYyOSAxMDA2NDQKLS0tIGEvZnMvamZmczIveGF0dHIuaAorKysgYi9mcy9qZmZzMi94YXR0ci5oCkBAIC0xLDEzICsxLDE0IEBACiAvKgogICogSkZGUzIgLS0gSm91cm5hbGxpbmcgRmxhc2ggRmlsZSBTeXN0ZW0sIFZlcnNpb24gMi4KICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgIE5FQyBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IMKpIDIwMDYgIE5FQyBDb3Jwb3JhdGlvbgogICoKICAqIENyZWF0ZWQgYnkgS2FpR2FpIEtvaGVpIDxrYWlnYWlAYWsuanAubmVjLmNvbT4KICAqCiAgKiBGb3IgbGljZW5zaW5nIGluZm9ybWF0aW9uLCBzZWUgdGhlIGZpbGUgJ0xJQ0VOQ0UnIGluIHRoaXMgZGlyZWN0b3J5LgogICoKICAqLworCiAjaWZuZGVmIF9KRkZTMl9GU19YQVRUUl9IXwogI2RlZmluZSBfSkZGUzJfRlNfWEFUVFJfSF8KIApkaWZmIC0tZ2l0IGEvZnMvamZmczIveGF0dHJfdHJ1c3RlZC5jIGIvZnMvamZmczIveGF0dHJfdHJ1c3RlZC5jCmluZGV4IGVkMDQ2ZTEuLjhlYzU3NjUgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL3hhdHRyX3RydXN0ZWQuYworKysgYi9mcy9qZmZzMi94YXR0cl90cnVzdGVkLmMKQEAgLTEsMTMgKzEsMTQgQEAKIC8qCiAgKiBKRkZTMiAtLSBKb3VybmFsbGluZyBGbGFzaCBGaWxlIFN5c3RlbSwgVmVyc2lvbiAyLgogICoKLSAqIENvcHlyaWdodCAoQykgMjAwNiAgTkVDIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgwqkgMjAwNiAgTkVDIENvcnBvcmF0aW9uCiAgKgogICogQ3JlYXRlZCBieSBLYWlHYWkgS29oZWkgPGthaWdhaUBhay5qcC5uZWMuY29tPgogICoKICAqIEZvciBsaWNlbnNpbmcgaW5mb3JtYXRpb24sIHNlZSB0aGUgZmlsZSAnTElDRU5DRScgaW4gdGhpcyBkaXJlY3RvcnkuCiAgKgogICovCisKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2pmZnMyLmg+CmRpZmYgLS1naXQgYS9mcy9qZmZzMi94YXR0cl91c2VyLmMgYi9mcy9qZmZzMi94YXR0cl91c2VyLmMKaW5kZXggMmY4ZTlhYS4uNDA5NDJiYyAxMDA2NDQKLS0tIGEvZnMvamZmczIveGF0dHJfdXNlci5jCisrKyBiL2ZzL2pmZnMyL3hhdHRyX3VzZXIuYwpAQCAtMSwxMyArMSwxNCBAQAogLyoKICAqIEpGRlMyIC0tIEpvdXJuYWxsaW5nIEZsYXNoIEZpbGUgU3lzdGVtLCBWZXJzaW9uIDIuCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDA2ICBORUMgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCDCqSAyMDA2ICBORUMgQ29ycG9yYXRpb24KICAqCiAgKiBDcmVhdGVkIGJ5IEthaUdhaSBLb2hlaSA8a2FpZ2FpQGFrLmpwLm5lYy5jb20+CiAgKgogICogRm9yIGxpY2Vuc2luZyBpbmZvcm1hdGlvbiwgc2VlIHRoZSBmaWxlICdMSUNFTkNFJyBpbiB0aGlzIGRpcmVjdG9yeS4KICAqCiAgKi8KKwogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvamZmczIuaD4KZGlmZiAtLWdpdCBhL2ZzL25hbWVpLmMgYi9mcy9uYW1laS5jCmluZGV4IGVlNjBjYzQuLjg4MDA1MmMgMTAwNjQ0Ci0tLSBhL2ZzL25hbWVpLmMKKysrIGIvZnMvbmFtZWkuYwpAQCAtMTI0MywyMiArMTI0MywxMyBAQAogCXJldHVybiBlcnI7CiB9CiAKLS8qCi0gKiBSZXN0cmljdGVkIGZvcm0gb2YgbG9va3VwLiBEb2Vzbid0IGZvbGxvdyBsaW5rcywgc2luZ2xlLWNvbXBvbmVudCBvbmx5LAotICogbmVlZHMgcGFyZW50IGFscmVhZHkgbG9ja2VkLiBEb2Vzbid0IGZvbGxvdyBtb3VudHMuCi0gKiBTTVAtc2FmZS4KLSAqLwotc3RhdGljIHN0cnVjdCBkZW50cnkgKiBfX2xvb2t1cF9oYXNoKHN0cnVjdCBxc3RyICpuYW1lLCBzdHJ1Y3QgZGVudHJ5ICogYmFzZSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCitzdGF0aWMgaW5saW5lIHN0cnVjdCBkZW50cnkgKl9fbG9va3VwX2hhc2hfa2VybihzdHJ1Y3QgcXN0ciAqbmFtZSwgc3RydWN0IGRlbnRyeSAqYmFzZSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCiB7Ci0Jc3RydWN0IGRlbnRyeSAqIGRlbnRyeTsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CiAJc3RydWN0IGlub2RlICppbm9kZTsKIAlpbnQgZXJyOwogCiAJaW5vZGUgPSBiYXNlLT5kX2lub2RlOwotCWVyciA9IHBlcm1pc3Npb24oaW5vZGUsIE1BWV9FWEVDLCBuZCk7Ci0JZGVudHJ5ID0gRVJSX1BUUihlcnIpOwotCWlmIChlcnIpCi0JCWdvdG8gb3V0OwogCiAJLyoKIAkgKiBTZWUgaWYgdGhlIGxvdy1sZXZlbCBmaWxlc3lzdGVtIG1pZ2h0IHdhbnQKQEAgLTEyODcsMzUgKzEyNzgsNzYgQEAKIAlyZXR1cm4gZGVudHJ5OwogfQogCisvKgorICogUmVzdHJpY3RlZCBmb3JtIG9mIGxvb2t1cC4gRG9lc24ndCBmb2xsb3cgbGlua3MsIHNpbmdsZS1jb21wb25lbnQgb25seSwKKyAqIG5lZWRzIHBhcmVudCBhbHJlYWR5IGxvY2tlZC4gRG9lc24ndCBmb2xsb3cgbW91bnRzLgorICogU01QLXNhZmUuCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGRlbnRyeSAqIF9fbG9va3VwX2hhc2goc3RydWN0IHFzdHIgKm5hbWUsIHN0cnVjdCBkZW50cnkgKmJhc2UsIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCWludCBlcnI7CisKKwlpbm9kZSA9IGJhc2UtPmRfaW5vZGU7CisKKwllcnIgPSBwZXJtaXNzaW9uKGlub2RlLCBNQVlfRVhFQywgbmQpOworCWRlbnRyeSA9IEVSUl9QVFIoZXJyKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCWRlbnRyeSA9IF9fbG9va3VwX2hhc2hfa2VybihuYW1lLCBiYXNlLCBuZCk7CitvdXQ6CisJcmV0dXJuIGRlbnRyeTsKK30KKwogc3RhdGljIHN0cnVjdCBkZW50cnkgKmxvb2t1cF9oYXNoKHN0cnVjdCBuYW1laWRhdGEgKm5kKQogewogCXJldHVybiBfX2xvb2t1cF9oYXNoKCZuZC0+bGFzdCwgbmQtPmRlbnRyeSwgbmQpOwogfQogCiAvKiBTTVAtc2FmZSAqLwotc3RydWN0IGRlbnRyeSAqIGxvb2t1cF9vbmVfbGVuKGNvbnN0IGNoYXIgKiBuYW1lLCBzdHJ1Y3QgZGVudHJ5ICogYmFzZSwgaW50IGxlbikKK3N0YXRpYyBpbmxpbmUgaW50IF9fbG9va3VwX29uZV9sZW4oY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IHFzdHIgKnRoaXMsIHN0cnVjdCBkZW50cnkgKmJhc2UsIGludCBsZW4pCiB7CiAJdW5zaWduZWQgbG9uZyBoYXNoOwotCXN0cnVjdCBxc3RyIHRoaXM7CiAJdW5zaWduZWQgaW50IGM7CiAKLQl0aGlzLm5hbWUgPSBuYW1lOwotCXRoaXMubGVuID0gbGVuOworCXRoaXMtPm5hbWUgPSBuYW1lOworCXRoaXMtPmxlbiA9IGxlbjsKIAlpZiAoIWxlbikKLQkJZ290byBhY2Nlc3M7CisJCXJldHVybiAtRUFDQ0VTOwogCiAJaGFzaCA9IGluaXRfbmFtZV9oYXNoKCk7CiAJd2hpbGUgKGxlbi0tKSB7CiAJCWMgPSAqKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiluYW1lKys7CiAJCWlmIChjID09ICcvJyB8fCBjID09ICdcMCcpCi0JCQlnb3RvIGFjY2VzczsKKwkJCXJldHVybiAtRUFDQ0VTOwogCQloYXNoID0gcGFydGlhbF9uYW1lX2hhc2goYywgaGFzaCk7CiAJfQotCXRoaXMuaGFzaCA9IGVuZF9uYW1lX2hhc2goaGFzaCk7CisJdGhpcy0+aGFzaCA9IGVuZF9uYW1lX2hhc2goaGFzaCk7CisJcmV0dXJuIDA7Cit9CiAKK3N0cnVjdCBkZW50cnkgKmxvb2t1cF9vbmVfbGVuKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBkZW50cnkgKmJhc2UsIGludCBsZW4pCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgcXN0ciB0aGlzOworCisJZXJyID0gX19sb29rdXBfb25lX2xlbihuYW1lLCAmdGhpcywgYmFzZSwgbGVuKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gRVJSX1BUUihlcnIpOwogCXJldHVybiBfX2xvb2t1cF9oYXNoKCZ0aGlzLCBiYXNlLCBOVUxMKTsKLWFjY2VzczoKLQlyZXR1cm4gRVJSX1BUUigtRUFDQ0VTKTsKK30KKworc3RydWN0IGRlbnRyeSAqbG9va3VwX29uZV9sZW5fa2Vybihjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgZGVudHJ5ICpiYXNlLCBpbnQgbGVuKQoreworCWludCBlcnI7CisJc3RydWN0IHFzdHIgdGhpczsKKworCWVyciA9IF9fbG9va3VwX29uZV9sZW4obmFtZSwgJnRoaXMsIGJhc2UsIGxlbik7CisJaWYgKGVycikKKwkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKKwlyZXR1cm4gX19sb29rdXBfaGFzaF9rZXJuKCZ0aGlzLCBiYXNlLCBOVUxMKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2FsbG9jLmMgYi9mcy9vY2ZzMi9hbGxvYy5jCmluZGV4IGYyN2U1Mzc4Li5hMGM4NjY3IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9hbGxvYy5jCisrKyBiL2ZzL29jZnMyL2FsbG9jLmMKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisjaW5jbHVkZSA8bGludXgvc3dhcC5oPgogCiAjZGVmaW5lIE1MT0dfTUFTS19QUkVGSVggTUxfRElTS19BTExPQwogI2luY2x1ZGUgPGNsdXN0ZXIvbWFza2xvZy5oPgpAQCAtMzQsNiArMzUsNyBAQAogI2luY2x1ZGUgIm9jZnMyLmgiCiAKICNpbmNsdWRlICJhbGxvYy5oIgorI2luY2x1ZGUgImFvcHMuaCIKICNpbmNsdWRlICJkbG1nbHVlLmgiCiAjaW5jbHVkZSAiZXh0ZW50X21hcC5oIgogI2luY2x1ZGUgImlub2RlLmgiCkBAIC00Nyw2MiArNDksMjQyIEBACiAKICNpbmNsdWRlICJidWZmZXJfaGVhZF9pby5oIgogCi1zdGF0aWMgaW50IG9jZnMyX2V4dGVudF9jb250aWcoc3RydWN0IGlub2RlICppbm9kZSwKLQkJCSAgICAgICBzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyAqZXh0LAotCQkJICAgICAgIHU2NCBibGtubyk7Ci0KLXN0YXRpYyBpbnQgb2NmczJfY3JlYXRlX25ld19tZXRhX2JocyhzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKLQkJCQkgICAgIGhhbmRsZV90ICpoYW5kbGUsCi0JCQkJICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJCSAgICAgaW50IHdhbnRlZCwKLQkJCQkgICAgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICptZXRhX2FjLAotCQkJCSAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaHNbXSk7Ci0KLXN0YXRpYyBpbnQgb2NmczJfYWRkX2JyYW5jaChzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKLQkJCSAgICBoYW5kbGVfdCAqaGFuZGxlLAotCQkJICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpmZV9iaCwKLQkJCSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmViX2JoLAotCQkJICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqbGFzdF9lYl9iaCwKLQkJCSAgICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqbWV0YV9hYyk7Ci0KLXN0YXRpYyBpbnQgb2NmczJfc2hpZnRfdHJlZV9kZXB0aChzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKLQkJCQkgIGhhbmRsZV90ICpoYW5kbGUsCi0JCQkJICBzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJCSAgc3RydWN0IGJ1ZmZlcl9oZWFkICpmZV9iaCwKLQkJCQkgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICptZXRhX2FjLAotCQkJCSAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqcmV0X25ld19lYl9iaCk7Ci0KLXN0YXRpYyBpbnQgb2NmczJfZG9faW5zZXJ0X2V4dGVudChzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKLQkJCQkgIGhhbmRsZV90ICpoYW5kbGUsCi0JCQkJICBzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJCSAgc3RydWN0IGJ1ZmZlcl9oZWFkICpmZV9iaCwKLQkJCQkgIHU2NCBibGtubywKLQkJCQkgIHUzMiBuZXdfY2x1c3RlcnMpOwotCi1zdGF0aWMgaW50IG9jZnMyX2ZpbmRfYnJhbmNoX3RhcmdldChzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKLQkJCQkgICAgc3RydWN0IGlub2RlICppbm9kZSwKLQkJCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpmZV9iaCwKLQkJCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqdGFyZ2V0X2JoKTsKLQotc3RhdGljIGludCBvY2ZzMl9maW5kX25ld19sYXN0X2V4dF9ibGsoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCi0JCQkJICAgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkJICAgICAgIHN0cnVjdCBvY2ZzMl9kaW5vZGUgKmZlLAotCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgbmV3X2lfY2x1c3RlcnMsCi0JCQkJICAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqb2xkX2xhc3RfZWIsCi0JCQkJICAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqKm5ld19sYXN0X2ViKTsKLQogc3RhdGljIHZvaWQgb2NmczJfZnJlZV90cnVuY2F0ZV9jb250ZXh0KHN0cnVjdCBvY2ZzMl90cnVuY2F0ZV9jb250ZXh0ICp0Yyk7CiAKLXN0YXRpYyBpbnQgb2NmczJfZXh0ZW50X2NvbnRpZyhzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJICAgICAgIHN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjICpleHQsCi0JCQkgICAgICAgdTY0IGJsa25vKQorLyoKKyAqIFN0cnVjdHVyZXMgd2hpY2ggZGVzY3JpYmUgYSBwYXRoIHRocm91Z2ggYSBidHJlZSwgYW5kIGZ1bmN0aW9ucyB0bworICogbWFuaXB1bGF0ZSB0aGVtLgorICoKKyAqIFRoZSBpZGVhIGhlcmUgaXMgdG8gYmUgYXMgZ2VuZXJpYyBhcyBwb3NzaWJsZSB3aXRoIHRoZSB0cmVlCisgKiBtYW5pcHVsYXRpb24gY29kZS4KKyAqLworc3RydWN0IG9jZnMyX3BhdGhfaXRlbSB7CisJc3RydWN0IGJ1ZmZlcl9oZWFkCQkqYmg7CisJc3RydWN0IG9jZnMyX2V4dGVudF9saXN0CSplbDsKK307CisKKyNkZWZpbmUgT0NGUzJfTUFYX1BBVEhfREVQVEgJNQorCitzdHJ1Y3Qgb2NmczJfcGF0aCB7CisJaW50CQkJcF90cmVlX2RlcHRoOworCXN0cnVjdCBvY2ZzMl9wYXRoX2l0ZW0JcF9ub2RlW09DRlMyX01BWF9QQVRIX0RFUFRIXTsKK307CisKKyNkZWZpbmUgcGF0aF9yb290X2JoKF9wYXRoKSAoKF9wYXRoKS0+cF9ub2RlWzBdLmJoKQorI2RlZmluZSBwYXRoX3Jvb3RfZWwoX3BhdGgpICgoX3BhdGgpLT5wX25vZGVbMF0uZWwpCisjZGVmaW5lIHBhdGhfbGVhZl9iaChfcGF0aCkgKChfcGF0aCktPnBfbm9kZVsoX3BhdGgpLT5wX3RyZWVfZGVwdGhdLmJoKQorI2RlZmluZSBwYXRoX2xlYWZfZWwoX3BhdGgpICgoX3BhdGgpLT5wX25vZGVbKF9wYXRoKS0+cF90cmVlX2RlcHRoXS5lbCkKKyNkZWZpbmUgcGF0aF9udW1faXRlbXMoX3BhdGgpICgoX3BhdGgpLT5wX3RyZWVfZGVwdGggKyAxKQorCisvKgorICogUmVzZXQgdGhlIGFjdHVhbCBwYXRoIGVsZW1lbnRzIHNvIHRoYXQgd2UgY2FuIHJlLXVzZSB0aGUgc3RydWN0dXJlCisgKiB0byBidWlsZCBhbm90aGVyIHBhdGguIEdlbmVyYWxseSwgdGhpcyBpbnZvbHZlcyBmcmVlaW5nIHRoZSBidWZmZXIKKyAqIGhlYWRzLgorICovCitzdGF0aWMgdm9pZCBvY2ZzMl9yZWluaXRfcGF0aChzdHJ1Y3Qgb2NmczJfcGF0aCAqcGF0aCwgaW50IGtlZXBfcm9vdCkKIHsKLQlyZXR1cm4gYmxrbm8gPT0gKGxlNjRfdG9fY3B1KGV4dC0+ZV9ibGtubykgKwotCQkJIG9jZnMyX2NsdXN0ZXJzX3RvX2Jsb2Nrcyhpbm9kZS0+aV9zYiwKLQkJCQkJCSAgbGUzMl90b19jcHUoZXh0LT5lX2NsdXN0ZXJzKSkpOworCWludCBpLCBzdGFydCA9IDAsIGRlcHRoID0gMDsKKwlzdHJ1Y3Qgb2NmczJfcGF0aF9pdGVtICpub2RlOworCisJaWYgKGtlZXBfcm9vdCkKKwkJc3RhcnQgPSAxOworCisJZm9yKGkgPSBzdGFydDsgaSA8IHBhdGhfbnVtX2l0ZW1zKHBhdGgpOyBpKyspIHsKKwkJbm9kZSA9ICZwYXRoLT5wX25vZGVbaV07CisKKwkJYnJlbHNlKG5vZGUtPmJoKTsKKwkJbm9kZS0+YmggPSBOVUxMOworCQlub2RlLT5lbCA9IE5VTEw7CisJfQorCisJLyoKKwkgKiBUcmVlIGRlcHRoIG1heSBjaGFuZ2UgZHVyaW5nIHRydW5jYXRlLCBvciBpbnNlcnQuIElmIHdlJ3JlCisJICoga2VlcGluZyB0aGUgcm9vdCBleHRlbnQgbGlzdCwgdGhlbiBtYWtlIHN1cmUgdGhhdCBvdXIgcGF0aAorCSAqIHN0cnVjdHVyZSByZWZsZWN0cyB0aGUgcHJvcGVyIGRlcHRoLgorCSAqLworCWlmIChrZWVwX3Jvb3QpCisJCWRlcHRoID0gbGUxNl90b19jcHUocGF0aF9yb290X2VsKHBhdGgpLT5sX3RyZWVfZGVwdGgpOworCisJcGF0aC0+cF90cmVlX2RlcHRoID0gZGVwdGg7CiB9CiAKK3N0YXRpYyB2b2lkIG9jZnMyX2ZyZWVfcGF0aChzdHJ1Y3Qgb2NmczJfcGF0aCAqcGF0aCkKK3sKKwlpZiAocGF0aCkgeworCQlvY2ZzMl9yZWluaXRfcGF0aChwYXRoLCAwKTsKKwkJa2ZyZWUocGF0aCk7CisJfQorfQorCisvKgorICogTWFrZSB0aGUgKmRlc3QgcGF0aCB0aGUgc2FtZSBhcyBzcmMgYW5kIHJlLWluaXRpYWxpemUgc3JjIHBhdGggdG8KKyAqIGhhdmUgYSByb290IG9ubHkuCisgKi8KK3N0YXRpYyB2b2lkIG9jZnMyX212X3BhdGgoc3RydWN0IG9jZnMyX3BhdGggKmRlc3QsIHN0cnVjdCBvY2ZzMl9wYXRoICpzcmMpCit7CisJaW50IGk7CisKKwlCVUdfT04ocGF0aF9yb290X2JoKGRlc3QpICE9IHBhdGhfcm9vdF9iaChzcmMpKTsKKworCWZvcihpID0gMTsgaSA8IE9DRlMyX01BWF9QQVRIX0RFUFRIOyBpKyspIHsKKwkJYnJlbHNlKGRlc3QtPnBfbm9kZVtpXS5iaCk7CisKKwkJZGVzdC0+cF9ub2RlW2ldLmJoID0gc3JjLT5wX25vZGVbaV0uYmg7CisJCWRlc3QtPnBfbm9kZVtpXS5lbCA9IHNyYy0+cF9ub2RlW2ldLmVsOworCisJCXNyYy0+cF9ub2RlW2ldLmJoID0gTlVMTDsKKwkJc3JjLT5wX25vZGVbaV0uZWwgPSBOVUxMOworCX0KK30KKworLyoKKyAqIEluc2VydCBhbiBleHRlbnQgYmxvY2sgYXQgZ2l2ZW4gaW5kZXguCisgKgorICogVGhpcyB3aWxsIG5vdCB0YWtlIGFuIGFkZGl0aW9uYWwgcmVmZXJlbmNlIG9uIGViX2JoLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgb2NmczJfcGF0aF9pbnNlcnRfZWIoc3RydWN0IG9jZnMyX3BhdGggKnBhdGgsIGludCBpbmRleCwKKwkJCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICplYl9iaCkKK3sKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICplYiA9IChzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICopZWJfYmgtPmJfZGF0YTsKKworCS8qCisJICogUmlnaHQgbm93LCBubyByb290IGJoIGlzIGFuIGV4dGVudCBibG9jaywgc28gdGhpcyBoZWxwcworCSAqIGNhdGNoIGNvZGUgZXJyb3JzIHdpdGggZGlub2RlIHRyZWVzLiBUaGUgYXNzZXJ0aW9uIGNhbiBiZQorCSAqIHNhZmVseSByZW1vdmVkIGlmIHdlIGV2ZXIgbmVlZCB0byBpbnNlcnQgZXh0ZW50IGJsb2NrCisJICogc3RydWN0dXJlcyBhdCB0aGUgcm9vdC4KKwkgKi8KKwlCVUdfT04oaW5kZXggPT0gMCk7CisKKwlwYXRoLT5wX25vZGVbaW5kZXhdLmJoID0gZWJfYmg7CisJcGF0aC0+cF9ub2RlW2luZGV4XS5lbCA9ICZlYi0+aF9saXN0OworfQorCitzdGF0aWMgc3RydWN0IG9jZnMyX3BhdGggKm9jZnMyX25ld19wYXRoKHN0cnVjdCBidWZmZXJfaGVhZCAqcm9vdF9iaCwKKwkJCQkJIHN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqcm9vdF9lbCkKK3sKKwlzdHJ1Y3Qgb2NmczJfcGF0aCAqcGF0aDsKKworCUJVR19PTihsZTE2X3RvX2NwdShyb290X2VsLT5sX3RyZWVfZGVwdGgpID49IE9DRlMyX01BWF9QQVRIX0RFUFRIKTsKKworCXBhdGggPSBremFsbG9jKHNpemVvZigqcGF0aCksIEdGUF9OT0ZTKTsKKwlpZiAocGF0aCkgeworCQlwYXRoLT5wX3RyZWVfZGVwdGggPSBsZTE2X3RvX2NwdShyb290X2VsLT5sX3RyZWVfZGVwdGgpOworCQlnZXRfYmgocm9vdF9iaCk7CisJCXBhdGhfcm9vdF9iaChwYXRoKSA9IHJvb3RfYmg7CisJCXBhdGhfcm9vdF9lbChwYXRoKSA9IHJvb3RfZWw7CisJfQorCisJcmV0dXJuIHBhdGg7Cit9CisKKy8qCisgKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIG5ldyBwYXRoIGJhc2VkIG9uIGEgZGlzayBpbm9kZSB0cmVlLgorICovCitzdGF0aWMgc3RydWN0IG9jZnMyX3BhdGggKm9jZnMyX25ld19pbm9kZV9wYXRoKHN0cnVjdCBidWZmZXJfaGVhZCAqZGlfYmgpCit7CisJc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGkgPSAoc3RydWN0IG9jZnMyX2Rpbm9kZSAqKWRpX2JoLT5iX2RhdGE7CisJc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICplbCA9ICZkaS0+aWQyLmlfbGlzdDsKKworCXJldHVybiBvY2ZzMl9uZXdfcGF0aChkaV9iaCwgZWwpOworfQorCisvKgorICogQ29udmVuaWVuY2UgZnVuY3Rpb24gdG8gam91cm5hbCBhbGwgY29tcG9uZW50cyBpbiBhIHBhdGguCisgKi8KK3N0YXRpYyBpbnQgb2NmczJfam91cm5hbF9hY2Nlc3NfcGF0aChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBoYW5kbGVfdCAqaGFuZGxlLAorCQkJCSAgICAgc3RydWN0IG9jZnMyX3BhdGggKnBhdGgpCit7CisJaW50IGksIHJldCA9IDA7CisKKwlpZiAoIXBhdGgpCisJCWdvdG8gb3V0OworCisJZm9yKGkgPSAwOyBpIDwgcGF0aF9udW1faXRlbXMocGF0aCk7IGkrKykgeworCQlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCBwYXRoLT5wX25vZGVbaV0uYmgsCisJCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworZW51bSBvY2ZzMl9jb250aWdfdHlwZSB7CisJQ09OVElHX05PTkUgPSAwLAorCUNPTlRJR19MRUZULAorCUNPTlRJR19SSUdIVAorfTsKKworCisvKgorICogTk9URTogb2NmczJfYmxvY2tfZXh0ZW50X2NvbnRpZygpLCBvY2ZzMl9leHRlbnRzX2FkamFjZW50KCkgYW5kCisgKiBvY2ZzMl9leHRlbnRfY29udGlnIG9ubHkgd29yayBwcm9wZXJseSBhZ2FpbnN0IGxlYWYgbm9kZXMhCisgKi8KK3N0YXRpYyBpbnQgb2NmczJfYmxvY2tfZXh0ZW50X2NvbnRpZyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCSAgICAgc3RydWN0IG9jZnMyX2V4dGVudF9yZWMgKmV4dCwKKwkJCQkgICAgIHU2NCBibGtubykKK3sKKwl1NjQgYmxrX2VuZCA9IGxlNjRfdG9fY3B1KGV4dC0+ZV9ibGtubyk7CisKKwlibGtfZW5kICs9IG9jZnMyX2NsdXN0ZXJzX3RvX2Jsb2NrcyhzYiwKKwkJCQkgICAgbGUxNl90b19jcHUoZXh0LT5lX2xlYWZfY2x1c3RlcnMpKTsKKworCXJldHVybiBibGtubyA9PSBibGtfZW5kOworfQorCitzdGF0aWMgaW50IG9jZnMyX2V4dGVudHNfYWRqYWNlbnQoc3RydWN0IG9jZnMyX2V4dGVudF9yZWMgKmxlZnQsCisJCQkJICBzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyAqcmlnaHQpCit7CisJdTMyIGxlZnRfcmFuZ2U7CisKKwlsZWZ0X3JhbmdlID0gbGUzMl90b19jcHUobGVmdC0+ZV9jcG9zKSArCisJCWxlMTZfdG9fY3B1KGxlZnQtPmVfbGVhZl9jbHVzdGVycyk7CisKKwlyZXR1cm4gKGxlZnRfcmFuZ2UgPT0gbGUzMl90b19jcHUocmlnaHQtPmVfY3BvcykpOworfQorCitzdGF0aWMgZW51bSBvY2ZzMl9jb250aWdfdHlwZQorCW9jZnMyX2V4dGVudF9jb250aWcoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCSAgICBzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyAqZXh0LAorCQkJICAgIHN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjICppbnNlcnRfcmVjKQoreworCXU2NCBibGtubyA9IGxlNjRfdG9fY3B1KGluc2VydF9yZWMtPmVfYmxrbm8pOworCisJaWYgKG9jZnMyX2V4dGVudHNfYWRqYWNlbnQoZXh0LCBpbnNlcnRfcmVjKSAmJgorCSAgICBvY2ZzMl9ibG9ja19leHRlbnRfY29udGlnKGlub2RlLT5pX3NiLCBleHQsIGJsa25vKSkKKwkJCXJldHVybiBDT05USUdfUklHSFQ7CisKKwlibGtubyA9IGxlNjRfdG9fY3B1KGV4dC0+ZV9ibGtubyk7CisJaWYgKG9jZnMyX2V4dGVudHNfYWRqYWNlbnQoaW5zZXJ0X3JlYywgZXh0KSAmJgorCSAgICBvY2ZzMl9ibG9ja19leHRlbnRfY29udGlnKGlub2RlLT5pX3NiLCBpbnNlcnRfcmVjLCBibGtubykpCisJCXJldHVybiBDT05USUdfTEVGVDsKKworCXJldHVybiBDT05USUdfTk9ORTsKK30KKworLyoKKyAqIE5PVEU6IFdlIGNhbiBoYXZlIHByZXR0eSBtdWNoIGFueSBjb21iaW5hdGlvbiBvZiBjb250aWd1b3VzbmVzcyBhbmQKKyAqIGFwcGVuZGluZy4KKyAqCisgKiBUaGUgdXNlZnVsbmVzcyBvZiBBUFBFTkRfVEFJTCBpcyBtb3JlIGluIHRoYXQgaXQgbGV0cyB1cyBrbm93IHRoYXQKKyAqIHdlJ2xsIGhhdmUgdG8gdXBkYXRlIHRoZSBwYXRoIHRvIHRoYXQgbGVhZi4KKyAqLworZW51bSBvY2ZzMl9hcHBlbmRfdHlwZSB7CisJQVBQRU5EX05PTkUgPSAwLAorCUFQUEVORF9UQUlMLAorfTsKKworc3RydWN0IG9jZnMyX2luc2VydF90eXBlIHsKKwllbnVtIG9jZnMyX2FwcGVuZF90eXBlCWluc19hcHBlbmRpbmc7CisJZW51bSBvY2ZzMl9jb250aWdfdHlwZQlpbnNfY29udGlnOworCWludAkJCWluc19jb250aWdfaW5kZXg7CisJaW50CQkJaW5zX2ZyZWVfcmVjb3JkczsKKwlpbnQJCQlpbnNfdHJlZV9kZXB0aDsKK307CisKIC8qCiAgKiBIb3cgbWFueSBmcmVlIGV4dGVudHMgaGF2ZSB3ZSBnb3QgYmVmb3JlIHdlIG5lZWQgbW9yZSBtZXRhIGRhdGE/CiAgKi8KQEAgLTI0Miw2ICs0MjQsMjggQEAKIH0KIAogLyoKKyAqIEhlbHBlciBmdW5jdGlvbiBmb3Igb2NmczJfYWRkX2JyYW5jaCgpIGFuZCBvY2ZzMl9zaGlmdF90cmVlX2RlcHRoKCkuCisgKgorICogUmV0dXJucyB0aGUgc3VtIG9mIHRoZSByaWdodG1vc3QgZXh0ZW50IHJlYyBsb2dpY2FsIG9mZnNldCBhbmQKKyAqIGNsdXN0ZXIgY291bnQuCisgKgorICogb2NmczJfYWRkX2JyYW5jaCgpIHVzZXMgdGhpcyB0byBkZXRlcm1pbmUgd2hhdCBsb2dpY2FsIGNsdXN0ZXIKKyAqIHZhbHVlIHNob3VsZCBiZSBwb3B1bGF0ZWQgaW50byB0aGUgbGVmdG1vc3QgbmV3IGJyYW5jaCByZWNvcmRzLgorICoKKyAqIG9jZnMyX3NoaWZ0X3RyZWVfZGVwdGgoKSB1c2VzIHRoaXMgdG8gZGV0ZXJtaW5lIHRoZSAjIGNsdXN0ZXJzCisgKiB2YWx1ZSBmb3IgdGhlIG5ldyB0b3Btb3N0IHRyZWUgcmVjb3JkLgorICovCitzdGF0aWMgaW5saW5lIHUzMiBvY2ZzMl9zdW1fcmlnaHRtb3N0X3JlYyhzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgICplbCkKK3sKKwlpbnQgaTsKKworCWkgPSBsZTE2X3RvX2NwdShlbC0+bF9uZXh0X2ZyZWVfcmVjKSAtIDE7CisKKwlyZXR1cm4gbGUzMl90b19jcHUoZWwtPmxfcmVjc1tpXS5lX2Nwb3MpICsKKwkJb2NmczJfcmVjX2NsdXN0ZXJzKGVsLCAmZWwtPmxfcmVjc1tpXSk7Cit9CisKKy8qCiAgKiBBZGQgYW4gZW50aXJlIHRyZWUgYnJhbmNoIHRvIG91ciBpbm9kZS4gZWJfYmggaXMgdGhlIGV4dGVudCBibG9jawogICogdG8gc3RhcnQgYXQsIGlmIHdlIGRvbid0IHdhbnQgdG8gc3RhcnQgdGhlIGJyYW5jaCBhdCB0aGUgZGlub2RlCiAgKiBzdHJ1Y3R1cmUuCkBAIC0yNTAsNyArNDU0LDcgQEAKICAqIGZvciB0aGUgbmV3IGxhc3QgZXh0ZW50IGJsb2NrLgogICoKICAqIHRoZSBuZXcgYnJhbmNoIHdpbGwgYmUgJ2VtcHR5JyBpbiB0aGUgc2Vuc2UgdGhhdCBldmVyeSBibG9jayB3aWxsCi0gKiBjb250YWluIGEgc2luZ2xlIHJlY29yZCB3aXRoIGVfY2x1c3RlcnMgPT0gMC4KKyAqIGNvbnRhaW4gYSBzaW5nbGUgcmVjb3JkIHdpdGggY2x1c3RlciBjb3VudCA9PSAwLgogICovCiBzdGF0aWMgaW50IG9jZnMyX2FkZF9icmFuY2goc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCiAJCQkgICAgaGFuZGxlX3QgKmhhbmRsZSwKQEAgLTI2OCw2ICs0NzIsNyBAQAogCXN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKmViOwogCXN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAgKmViX2VsOwogCXN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAgKmVsOworCXUzMiBuZXdfY3BvczsKIAogCW1sb2dfZW50cnlfdm9pZCgpOwogCkBAIC0zMDIsNiArNTA3LDkgQEAKIAkJZ290byBiYWlsOwogCX0KIAorCWViID0gKHN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKilsYXN0X2ViX2JoLT5iX2RhdGE7CisJbmV3X2Nwb3MgPSBvY2ZzMl9zdW1fcmlnaHRtb3N0X3JlYygmZWItPmhfbGlzdCk7CisKIAkvKiBOb3RlOiBuZXdfZWJfYmhzW25ld19ibG9ja3MgLSAxXSBpcyB0aGUgZ3V5IHdoaWNoIHdpbGwgYmUKIAkgKiBsaW5rZWQgd2l0aCB0aGUgcmVzdCBvZiB0aGUgdHJlZS4KIAkgKiBjb252ZXJzbHksIG5ld19lYl9iaHNbMF0gaXMgdGhlIG5ldyBib3R0b21tb3N0IGxlYWYuCkBAIC0zMzAsOSArNTM4LDE4IEBACiAJCWViLT5oX25leHRfbGVhZl9ibGsgPSAwOwogCQllYl9lbC0+bF90cmVlX2RlcHRoID0gY3B1X3RvX2xlMTYoaSk7CiAJCWViX2VsLT5sX25leHRfZnJlZV9yZWMgPSBjcHVfdG9fbGUxNigxKTsKLQkJZWJfZWwtPmxfcmVjc1swXS5lX2Nwb3MgPSBmZS0+aV9jbHVzdGVyczsKKwkJLyoKKwkJICogVGhpcyBhY3R1YWxseSBjb3VudHMgYXMgYW4gZW1wdHkgZXh0ZW50IGFzCisJCSAqIGNfY2x1c3RlcnMgPT0gMAorCQkgKi8KKwkJZWJfZWwtPmxfcmVjc1swXS5lX2Nwb3MgPSBjcHVfdG9fbGUzMihuZXdfY3Bvcyk7CiAJCWViX2VsLT5sX3JlY3NbMF0uZV9ibGtubyA9IGNwdV90b19sZTY0KG5leHRfYmxrbm8pOwotCQllYl9lbC0+bF9yZWNzWzBdLmVfY2x1c3RlcnMgPSBjcHVfdG9fbGUzMigwKTsKKwkJLyoKKwkJICogZWJfZWwgaXNuJ3QgYWx3YXlzIGFuIGludGVyaW9yIG5vZGUsIGJ1dCBldmVuIGxlYWYKKwkJICogbm9kZXMgd2FudCBhIHplcm8nZCBmbGFncyBhbmQgcmVzZXJ2ZWQgZmllbGQgc28KKwkJICogdGhpcyBnZXRzIHRoZSB3aG9sZSAzMiBiaXRzIHJlZ2FyZGxlc3Mgb2YgdXNlLgorCQkgKi8KKwkJZWJfZWwtPmxfcmVjc1swXS5lX2ludF9jbHVzdGVycyA9IGNwdV90b19sZTMyKDApOwogCQlpZiAoIWViX2VsLT5sX3RyZWVfZGVwdGgpCiAJCQluZXdfbGFzdF9lYl9ibGsgPSBsZTY0X3RvX2NwdShlYi0+aF9ibGtubyk7CiAKQEAgLTM3Niw4ICs1OTMsOCBAQAogCSAqIGVpdGhlciBiZSBvbiB0aGUgZmUsIG9yIHRoZSBleHRlbnQgYmxvY2sgcGFzc2VkIGluLiAqLwogCWkgPSBsZTE2X3RvX2NwdShlbC0+bF9uZXh0X2ZyZWVfcmVjKTsKIAllbC0+bF9yZWNzW2ldLmVfYmxrbm8gPSBjcHVfdG9fbGU2NChuZXh0X2Jsa25vKTsKLQllbC0+bF9yZWNzW2ldLmVfY3BvcyA9IGZlLT5pX2NsdXN0ZXJzOwotCWVsLT5sX3JlY3NbaV0uZV9jbHVzdGVycyA9IDA7CisJZWwtPmxfcmVjc1tpXS5lX2Nwb3MgPSBjcHVfdG9fbGUzMihuZXdfY3Bvcyk7CisJZWwtPmxfcmVjc1tpXS5lX2ludF9jbHVzdGVycyA9IDA7CiAJbGUxNl9hZGRfY3B1KCZlbC0+bF9uZXh0X2ZyZWVfcmVjLCAxKTsKIAogCS8qIGZlIG5lZWRzIGEgbmV3IGxhc3QgZXh0ZW50IGJsb2NrIHBvaW50ZXIsIGFzIGRvZXMgdGhlCkBAIC00MjUsNiArNjQyLDcgQEAKIAkJCQkgIHN0cnVjdCBidWZmZXJfaGVhZCAqKnJldF9uZXdfZWJfYmgpCiB7CiAJaW50IHN0YXR1cywgaTsKKwl1MzIgbmV3X2NsdXN0ZXJzOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqbmV3X2ViX2JoID0gTlVMTDsKIAlzdHJ1Y3Qgb2NmczJfZGlub2RlICpmZTsKIAlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICplYjsKQEAgLTQ2MSwxMSArNjc5LDggQEAKIAkvKiBjb3B5IHRoZSBmZSBkYXRhIGludG8gdGhlIG5ldyBleHRlbnQgYmxvY2sgKi8KIAllYl9lbC0+bF90cmVlX2RlcHRoID0gZmVfZWwtPmxfdHJlZV9kZXB0aDsKIAllYl9lbC0+bF9uZXh0X2ZyZWVfcmVjID0gZmVfZWwtPmxfbmV4dF9mcmVlX3JlYzsKLQlmb3IoaSA9IDA7IGkgPCBsZTE2X3RvX2NwdShmZV9lbC0+bF9uZXh0X2ZyZWVfcmVjKTsgaSsrKSB7Ci0JCWViX2VsLT5sX3JlY3NbaV0uZV9jcG9zID0gZmVfZWwtPmxfcmVjc1tpXS5lX2Nwb3M7Ci0JCWViX2VsLT5sX3JlY3NbaV0uZV9jbHVzdGVycyA9IGZlX2VsLT5sX3JlY3NbaV0uZV9jbHVzdGVyczsKLQkJZWJfZWwtPmxfcmVjc1tpXS5lX2Jsa25vID0gZmVfZWwtPmxfcmVjc1tpXS5lX2Jsa25vOwotCX0KKwlmb3IoaSA9IDA7IGkgPCBsZTE2X3RvX2NwdShmZV9lbC0+bF9uZXh0X2ZyZWVfcmVjKTsgaSsrKQorCQllYl9lbC0+bF9yZWNzW2ldID0gZmVfZWwtPmxfcmVjc1tpXTsKIAogCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCBuZXdfZWJfYmgpOwogCWlmIChzdGF0dXMgPCAwKSB7CkBAIC00ODAsMTYgKzY5NSwxNSBAQAogCQlnb3RvIGJhaWw7CiAJfQogCisJbmV3X2NsdXN0ZXJzID0gb2NmczJfc3VtX3JpZ2h0bW9zdF9yZWMoZWJfZWwpOworCiAJLyogdXBkYXRlIGZlIG5vdyAqLwogCWxlMTZfYWRkX2NwdSgmZmVfZWwtPmxfdHJlZV9kZXB0aCwgMSk7CiAJZmVfZWwtPmxfcmVjc1swXS5lX2Nwb3MgPSAwOwogCWZlX2VsLT5sX3JlY3NbMF0uZV9ibGtubyA9IGViLT5oX2Jsa25vOwotCWZlX2VsLT5sX3JlY3NbMF0uZV9jbHVzdGVycyA9IGZlLT5pX2NsdXN0ZXJzOwotCWZvcihpID0gMTsgaSA8IGxlMTZfdG9fY3B1KGZlX2VsLT5sX25leHRfZnJlZV9yZWMpOyBpKyspIHsKLQkJZmVfZWwtPmxfcmVjc1tpXS5lX2Nwb3MgPSAwOwotCQlmZV9lbC0+bF9yZWNzW2ldLmVfY2x1c3RlcnMgPSAwOwotCQlmZV9lbC0+bF9yZWNzW2ldLmVfYmxrbm8gPSAwOwotCX0KKwlmZV9lbC0+bF9yZWNzWzBdLmVfaW50X2NsdXN0ZXJzID0gY3B1X3RvX2xlMzIobmV3X2NsdXN0ZXJzKTsKKwlmb3IoaSA9IDE7IGkgPCBsZTE2X3RvX2NwdShmZV9lbC0+bF9uZXh0X2ZyZWVfcmVjKTsgaSsrKQorCQltZW1zZXQoJmZlX2VsLT5sX3JlY3NbaV0sIDAsIHNpemVvZihzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYykpOwogCWZlX2VsLT5sX25leHRfZnJlZV9yZWMgPSBjcHVfdG9fbGUxNigxKTsKIAogCS8qIElmIHRoaXMgaXMgb3VyIDFzdCB0cmVlIGRlcHRoIHNoaWZ0LCB0aGVuIGxhc3RfZWJfYmxrCkBAIC01MTUsMTk5ICs3MjksNiBAQAogfQogCiAvKgotICogRXhwZWN0cyB0aGUgdHJlZSB0byBhbHJlYWR5IGhhdmUgcm9vbSBpbiB0aGUgcmlnaHRtb3N0IGxlYWYgZm9yIHRoZQotICogZXh0ZW50LiAgVXBkYXRlcyBhbGwgdGhlIGV4dGVudCBibG9ja3MgKGFuZCB0aGUgZGlub2RlKSBvbiB0aGUgd2F5Ci0gKiBkb3duLgotICovCi1zdGF0aWMgaW50IG9jZnMyX2RvX2luc2VydF9leHRlbnQoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCi0JCQkJICBoYW5kbGVfdCAqaGFuZGxlLAotCQkJCSAgc3RydWN0IGlub2RlICppbm9kZSwKLQkJCQkgIHN0cnVjdCBidWZmZXJfaGVhZCAqZmVfYmgsCi0JCQkJICB1NjQgc3RhcnRfYmxrLAotCQkJCSAgdTMyIG5ld19jbHVzdGVycykKLXsKLQlpbnQgc3RhdHVzLCBpLCBudW1fYmhzID0gMDsKLQl1NjQgbmV4dF9ibGtubzsKLQl1MTYgbmV4dF9mcmVlOwotCXN0cnVjdCBidWZmZXJfaGVhZCAqKmViX2JocyA9IE5VTEw7Ci0Jc3RydWN0IG9jZnMyX2Rpbm9kZSAqZmU7Ci0Jc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqZWI7Ci0Jc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICAqZWw7Ci0KLQltbG9nX2VudHJ5X3ZvaWQoKTsKLQotCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIGZlX2JoLAotCQkJCSAgICAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKLQlpZiAoc3RhdHVzIDwgMCkgewotCQltbG9nX2Vycm5vKHN0YXR1cyk7Ci0JCWdvdG8gYmFpbDsKLQl9Ci0KLQlmZSA9IChzdHJ1Y3Qgb2NmczJfZGlub2RlICopIGZlX2JoLT5iX2RhdGE7Ci0JZWwgPSAmZmUtPmlkMi5pX2xpc3Q7Ci0JaWYgKGVsLT5sX3RyZWVfZGVwdGgpIHsKLQkJLyogVGhpcyBpcyBhbm90aGVyIG9wZXJhdGlvbiB3aGVyZSB3ZSB3YW50IHRvIGJlCi0JCSAqIGNhcmVmdWwgYWJvdXQgb3VyIHRyZWUgdXBkYXRlcy4gQW4gZXJyb3IgaGVyZSBtZWFucwotCQkgKiBub25lIG9mIHRoZSBwcmV2aW91cyBjaGFuZ2VzIHdlIG1hZGUgc2hvdWxkIHJvbGwKLQkJICogZm9yd2FyZC4gQXMgYSByZXN1bHQsIHdlIGhhdmUgdG8gcmVjb3JkIHRoZSBidWZmZXJzCi0JCSAqIGZvciB0aGlzIHBhcnQgb2YgdGhlIHRyZWUgaW4gYW4gYXJyYXkgYW5kIHJlc2VydmUgYQotCQkgKiBqb3VybmFsIHdyaXRlIHRvIHRoZW0gYmVmb3JlIG1ha2luZyBhbnkgY2hhbmdlcy4gKi8KLQkJbnVtX2JocyA9IGxlMTZfdG9fY3B1KGZlLT5pZDIuaV9saXN0LmxfdHJlZV9kZXB0aCk7Ci0JCWViX2JocyA9IGtjYWxsb2MobnVtX2Jocywgc2l6ZW9mKHN0cnVjdCBidWZmZXJfaGVhZCAqKSwKLQkJCQkgR0ZQX0tFUk5FTCk7Ci0JCWlmICghZWJfYmhzKSB7Ci0JCQlzdGF0dXMgPSAtRU5PTUVNOwotCQkJbWxvZ19lcnJubyhzdGF0dXMpOwotCQkJZ290byBiYWlsOwotCQl9Ci0KLQkJaSA9IDA7Ci0JCXdoaWxlKGVsLT5sX3RyZWVfZGVwdGgpIHsKLQkJCW5leHRfZnJlZSA9IGxlMTZfdG9fY3B1KGVsLT5sX25leHRfZnJlZV9yZWMpOwotCQkJaWYgKG5leHRfZnJlZSA9PSAwKSB7Ci0JCQkJb2NmczJfZXJyb3IoaW5vZGUtPmlfc2IsCi0JCQkJCSAgICAiRGlub2RlICVsbHUgaGFzIGEgYmFkIGV4dGVudCBsaXN0IiwKLQkJCQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vKTsKLQkJCQlzdGF0dXMgPSAtRUlPOwotCQkJCWdvdG8gYmFpbDsKLQkJCX0KLQkJCW5leHRfYmxrbm8gPSBsZTY0X3RvX2NwdShlbC0+bF9yZWNzW25leHRfZnJlZSAtIDFdLmVfYmxrbm8pOwotCi0JCQlCVUdfT04oaSA+PSBudW1fYmhzKTsKLQkJCXN0YXR1cyA9IG9jZnMyX3JlYWRfYmxvY2sob3NiLCBuZXh0X2Jsa25vLCAmZWJfYmhzW2ldLAotCQkJCQkJICBPQ0ZTMl9CSF9DQUNIRUQsIGlub2RlKTsKLQkJCWlmIChzdGF0dXMgPCAwKSB7Ci0JCQkJbWxvZ19lcnJubyhzdGF0dXMpOwotCQkJCWdvdG8gYmFpbDsKLQkJCX0KLQkJCWViID0gKHN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKikgZWJfYmhzW2ldLT5iX2RhdGE7Ci0JCQlpZiAoIU9DRlMyX0lTX1ZBTElEX0VYVEVOVF9CTE9DSyhlYikpIHsKLQkJCQlPQ0ZTMl9ST19PTl9JTlZBTElEX0VYVEVOVF9CTE9DSyhpbm9kZS0+aV9zYiwKLQkJCQkJCQkJIGViKTsKLQkJCQlzdGF0dXMgPSAtRUlPOwotCQkJCWdvdG8gYmFpbDsKLQkJCX0KLQotCQkJc3RhdHVzID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgZWJfYmhzW2ldLAotCQkJCQkJICAgICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOwotCQkJaWYgKHN0YXR1cyA8IDApIHsKLQkJCQltbG9nX2Vycm5vKHN0YXR1cyk7Ci0JCQkJZ290byBiYWlsOwotCQkJfQotCi0JCQllbCA9ICZlYi0+aF9saXN0OwotCQkJaSsrOwotCQkJLyogV2hlbiB3ZSBsZWF2ZSB0aGlzIGxvb3AsIGViX2Joc1tudW1fYmhzIC0gMV0gd2lsbAotCQkJICogaG9sZCB0aGUgYm90dG9tLW1vc3QgbGVhZiBleHRlbnQgYmxvY2suICovCi0JCX0KLQkJQlVHX09OKGVsLT5sX3RyZWVfZGVwdGgpOwotCi0JCWVsID0gJmZlLT5pZDIuaV9saXN0OwotCQkvKiBJZiB3ZSBoYXZlIHRyZWUgZGVwdGgsIHRoZW4gdGhlIGZlIHVwZGF0ZSBpcwotCQkgKiB0cml2aWFsLCBhbmQgd2Ugd2FudCB0byBzd2l0Y2ggZWwgb3V0IGZvciB0aGUKLQkJICogYm90dG9tLW1vc3QgbGVhZiBpbiBvcmRlciB0byB1cGRhdGUgaXQgd2l0aCB0aGUKLQkJICogYWN0dWFsIGV4dGVudCBkYXRhIGJlbG93LiAqLwotCQluZXh0X2ZyZWUgPSBsZTE2X3RvX2NwdShlbC0+bF9uZXh0X2ZyZWVfcmVjKTsKLQkJaWYgKG5leHRfZnJlZSA9PSAwKSB7Ci0JCQlvY2ZzMl9lcnJvcihpbm9kZS0+aV9zYiwKLQkJCQkgICAgIkRpbm9kZSAlbGx1IGhhcyBhIGJhZCBleHRlbnQgbGlzdCIsCi0JCQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vKTsKLQkJCXN0YXR1cyA9IC1FSU87Ci0JCQlnb3RvIGJhaWw7Ci0JCX0KLQkJbGUzMl9hZGRfY3B1KCZlbC0+bF9yZWNzW25leHRfZnJlZSAtIDFdLmVfY2x1c3RlcnMsCi0JCQkgICAgIG5ld19jbHVzdGVycyk7Ci0JCS8qIChudW1fYmhzIC0gMSkgdG8gYXZvaWQgdGhlIGxlYWYgKi8KLQkJZm9yKGkgPSAwOyBpIDwgKG51bV9iaHMgLSAxKTsgaSsrKSB7Ci0JCQllYiA9IChzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICopIGViX2Joc1tpXS0+Yl9kYXRhOwotCQkJZWwgPSAmZWItPmhfbGlzdDsKLQotCQkJLyogZmluYWxseSwgbWFrZSBvdXIgYWN0dWFsIGNoYW5nZSB0byB0aGUKLQkJCSAqIGludGVybWVkaWF0ZSBleHRlbnQgYmxvY2tzLiAqLwotCQkJbmV4dF9mcmVlID0gbGUxNl90b19jcHUoZWwtPmxfbmV4dF9mcmVlX3JlYyk7Ci0JCQlsZTMyX2FkZF9jcHUoJmVsLT5sX3JlY3NbbmV4dF9mcmVlIC0gMV0uZV9jbHVzdGVycywKLQkJCQkgICAgIG5ld19jbHVzdGVycyk7Ci0KLQkJCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCBlYl9iaHNbaV0pOwotCQkJaWYgKHN0YXR1cyA8IDApCi0JCQkJbWxvZ19lcnJubyhzdGF0dXMpOwotCQl9Ci0JCUJVR19PTihpICE9IChudW1fYmhzIC0gMSkpOwotCQkvKiBub3RlIHRoYXQgdGhlIGxlYWYgYmxvY2sgd2Fzbid0IHRvdWNoZWQgaW4KLQkJICogdGhlIGxvb3AgYWJvdmUgKi8KLQkJZWIgPSAoc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqKSBlYl9iaHNbbnVtX2JocyAtIDFdLT5iX2RhdGE7Ci0JCWVsID0gJmViLT5oX2xpc3Q7Ci0JCUJVR19PTihlbC0+bF90cmVlX2RlcHRoKTsKLQl9Ci0KLQkvKiB5YXksIHdlIGNhbiBmaW5hbGx5IGFkZCB0aGUgYWN0dWFsIGV4dGVudCBub3chICovCi0JaSA9IGxlMTZfdG9fY3B1KGVsLT5sX25leHRfZnJlZV9yZWMpIC0gMTsKLQlpZiAobGUxNl90b19jcHUoZWwtPmxfbmV4dF9mcmVlX3JlYykgJiYKLQkgICAgb2NmczJfZXh0ZW50X2NvbnRpZyhpbm9kZSwgJmVsLT5sX3JlY3NbaV0sIHN0YXJ0X2JsaykpIHsKLQkJbGUzMl9hZGRfY3B1KCZlbC0+bF9yZWNzW2ldLmVfY2x1c3RlcnMsIG5ld19jbHVzdGVycyk7Ci0JfSBlbHNlIGlmIChsZTE2X3RvX2NwdShlbC0+bF9uZXh0X2ZyZWVfcmVjKSAmJgotCQkgICAobGUzMl90b19jcHUoZWwtPmxfcmVjc1tpXS5lX2NsdXN0ZXJzKSA9PSAwKSkgewotCQkvKiBoYXZpbmcgYW4gZW1wdHkgZXh0ZW50IGF0IGVvZiBpcyBsZWdhbC4gKi8KLQkJaWYgKGVsLT5sX3JlY3NbaV0uZV9jcG9zICE9IGZlLT5pX2NsdXN0ZXJzKSB7Ci0JCQlvY2ZzMl9lcnJvcihpbm9kZS0+aV9zYiwKLQkJCQkgICAgIkRpbm9kZSAlbGx1IHRyYWlsaW5nIGV4dGVudCBpcyBiYWQ6ICIKLQkJCQkgICAgImNwb3MgKCV1KSAhPSBudW1iZXIgb2YgY2x1c3RlcnMgKCV1KSIsCi0JCQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vLAotCQkJCSAgICBsZTMyX3RvX2NwdShlbC0+bF9yZWNzW2ldLmVfY3BvcyksCi0JCQkJICAgIGxlMzJfdG9fY3B1KGZlLT5pX2NsdXN0ZXJzKSk7Ci0JCQlzdGF0dXMgPSAtRUlPOwotCQkJZ290byBiYWlsOwotCQl9Ci0JCWVsLT5sX3JlY3NbaV0uZV9ibGtubyA9IGNwdV90b19sZTY0KHN0YXJ0X2Jsayk7Ci0JCWVsLT5sX3JlY3NbaV0uZV9jbHVzdGVycyA9IGNwdV90b19sZTMyKG5ld19jbHVzdGVycyk7Ci0JfSBlbHNlIHsKLQkJLyogTm8gY29udGlndW91cyByZWNvcmQsIG9yIG5vIGVtcHR5IHJlY29yZCBhdCBlb2YsIHNvCi0JCSAqIHdlIGFkZCBhIG5ldyBvbmUuICovCi0KLQkJQlVHX09OKGxlMTZfdG9fY3B1KGVsLT5sX25leHRfZnJlZV9yZWMpID49Ci0JCSAgICAgICBsZTE2X3RvX2NwdShlbC0+bF9jb3VudCkpOwotCQlpID0gbGUxNl90b19jcHUoZWwtPmxfbmV4dF9mcmVlX3JlYyk7Ci0KLQkJZWwtPmxfcmVjc1tpXS5lX2Jsa25vID0gY3B1X3RvX2xlNjQoc3RhcnRfYmxrKTsKLQkJZWwtPmxfcmVjc1tpXS5lX2NsdXN0ZXJzID0gY3B1X3RvX2xlMzIobmV3X2NsdXN0ZXJzKTsKLQkJZWwtPmxfcmVjc1tpXS5lX2Nwb3MgPSBmZS0+aV9jbHVzdGVyczsKLQkJbGUxNl9hZGRfY3B1KCZlbC0+bF9uZXh0X2ZyZWVfcmVjLCAxKTsKLQl9Ci0KLQkvKgotCSAqIGV4dGVudF9tYXAgZXJyb3JzIGFyZSBub3QgZmF0YWwsIHNvIHRoZXkgYXJlIGlnbm9yZWQgb3V0c2lkZQotCSAqIG9mIGZsdXNoaW5nIHRoZSB0aGluZy4KLQkgKi8KLQlzdGF0dXMgPSBvY2ZzMl9leHRlbnRfbWFwX2FwcGVuZChpbm9kZSwgJmVsLT5sX3JlY3NbaV0sCi0JCQkJCSBuZXdfY2x1c3RlcnMpOwotCWlmIChzdGF0dXMpIHsKLQkJbWxvZ19lcnJubyhzdGF0dXMpOwotCQlvY2ZzMl9leHRlbnRfbWFwX2Ryb3AoaW5vZGUsIGxlMzJfdG9fY3B1KGZlLT5pX2NsdXN0ZXJzKSk7Ci0JfQotCi0Jc3RhdHVzID0gb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIGZlX2JoKTsKLQlpZiAoc3RhdHVzIDwgMCkKLQkJbWxvZ19lcnJubyhzdGF0dXMpOwotCWlmIChmZS0+aWQyLmlfbGlzdC5sX3RyZWVfZGVwdGgpIHsKLQkJc3RhdHVzID0gb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIGViX2Joc1tudW1fYmhzIC0gMV0pOwotCQlpZiAoc3RhdHVzIDwgMCkKLQkJCW1sb2dfZXJybm8oc3RhdHVzKTsKLQl9Ci0KLQlzdGF0dXMgPSAwOwotYmFpbDoKLQlpZiAoZWJfYmhzKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBudW1fYmhzOyBpKyspCi0JCQlpZiAoZWJfYmhzW2ldKQotCQkJCWJyZWxzZShlYl9iaHNbaV0pOwotCQlrZnJlZShlYl9iaHMpOwotCX0KLQotCW1sb2dfZXhpdChzdGF0dXMpOwotCXJldHVybiBzdGF0dXM7Ci19Ci0KLS8qCiAgKiBTaG91bGQgb25seSBiZSBjYWxsZWQgd2hlbiB0aGVyZSBpcyBubyBzcGFjZSBsZWZ0IGluIGFueSBvZiB0aGUKICAqIGxlYWYgbm9kZXMuIFdoYXQgd2Ugd2FudCB0byBkbyBpcyBmaW5kIHRoZSBsb3dlc3QgdHJlZSBkZXB0aAogICogbm9uLWxlYWYgZXh0ZW50IGJsb2NrIHdpdGggcm9vbSBmb3IgbmV3IHJlY29yZHMuIFRoZXJlIGFyZSB0aHJlZQpAQCAtODA3LDUzICs4MjgsMTU0OCBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKLS8qIHRoZSBjYWxsZXIgbmVlZHMgdG8gdXBkYXRlIGZlLT5pX2NsdXN0ZXJzICovCisvKgorICogVGhpcyBpcyBvbmx5IHZhbGlkIGZvciBsZWFmIG5vZGVzLCB3aGljaCBhcmUgdGhlIG9ubHkgb25lcyB0aGF0IGNhbgorICogaGF2ZSBlbXB0eSBleHRlbnRzIGFueXdheS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgb2NmczJfaXNfZW1wdHlfZXh0ZW50KHN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjICpyZWMpCit7CisJcmV0dXJuICFyZWMtPmVfbGVhZl9jbHVzdGVyczsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBkaXNjYXJkIHRoZSByaWdodG1vc3QgZXh0ZW50IHJlY29yZC4KKyAqLworc3RhdGljIHZvaWQgb2NmczJfc2hpZnRfcmVjb3Jkc19yaWdodChzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKmVsKQoreworCWludCBuZXh0X2ZyZWUgPSBsZTE2X3RvX2NwdShlbC0+bF9uZXh0X2ZyZWVfcmVjKTsKKwlpbnQgY291bnQgPSBsZTE2X3RvX2NwdShlbC0+bF9jb3VudCk7CisJdW5zaWduZWQgaW50IG51bV9ieXRlczsKKworCUJVR19PTighbmV4dF9mcmVlKTsKKwkvKiBUaGlzIHdpbGwgY2F1c2UgdXMgdG8gZ28gb2ZmIHRoZSBlbmQgb2Ygb3VyIGV4dGVudCBsaXN0LiAqLworCUJVR19PTihuZXh0X2ZyZWUgPj0gY291bnQpOworCisJbnVtX2J5dGVzID0gc2l6ZW9mKHN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjKSAqIG5leHRfZnJlZTsKKworCW1lbW1vdmUoJmVsLT5sX3JlY3NbMV0sICZlbC0+bF9yZWNzWzBdLCBudW1fYnl0ZXMpOworfQorCitzdGF0aWMgdm9pZCBvY2ZzMl9yb3RhdGVfbGVhZihzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKmVsLAorCQkJICAgICAgc3RydWN0IG9jZnMyX2V4dGVudF9yZWMgKmluc2VydF9yZWMpCit7CisJaW50IGksIGluc2VydF9pbmRleCwgbmV4dF9mcmVlLCBoYXNfZW1wdHksIG51bV9ieXRlczsKKwl1MzIgaW5zZXJ0X2Nwb3MgPSBsZTMyX3RvX2NwdShpbnNlcnRfcmVjLT5lX2Nwb3MpOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjICpyZWM7CisKKwluZXh0X2ZyZWUgPSBsZTE2X3RvX2NwdShlbC0+bF9uZXh0X2ZyZWVfcmVjKTsKKwloYXNfZW1wdHkgPSBvY2ZzMl9pc19lbXB0eV9leHRlbnQoJmVsLT5sX3JlY3NbMF0pOworCisJQlVHX09OKCFuZXh0X2ZyZWUpOworCisJLyogVGhlIHRyZWUgY29kZSBiZWZvcmUgdXMgZGlkbid0IGFsbG93IGVub3VnaCByb29tIGluIHRoZSBsZWFmLiAqLworCWlmIChlbC0+bF9uZXh0X2ZyZWVfcmVjID09IGVsLT5sX2NvdW50ICYmICFoYXNfZW1wdHkpCisJCUJVRygpOworCisJLyoKKwkgKiBUaGUgZWFzaWVzdCB3YXkgdG8gYXBwcm9hY2ggdGhpcyBpcyB0byBqdXN0IHJlbW92ZSB0aGUKKwkgKiBlbXB0eSBleHRlbnQgYW5kIHRlbXBvcmFyaWx5IGRlY3JlbWVudCBuZXh0X2ZyZWUuCisJICovCisJaWYgKGhhc19lbXB0eSkgeworCQkvKgorCQkgKiBJZiBuZXh0X2ZyZWUgd2FzIDEgKG9ubHkgYW4gZW1wdHkgZXh0ZW50KSwgdGhpcworCQkgKiBsb29wIHdvbid0IGV4ZWN1dGUsIHdoaWNoIGlzIGZpbmUuIFdlIHN0aWxsIHdhbnQKKwkJICogdGhlIGRlY3JlbWVudCBhYm92ZSB0byBoYXBwZW4uCisJCSAqLworCQlmb3IoaSA9IDA7IGkgPCAobmV4dF9mcmVlIC0gMSk7IGkrKykKKwkJCWVsLT5sX3JlY3NbaV0gPSBlbC0+bF9yZWNzW2krMV07CisKKwkJbmV4dF9mcmVlLS07CisJfQorCisJLyoKKwkgKiBGaWd1cmUgb3V0IHdoYXQgdGhlIG5ldyByZWNvcmQgaW5kZXggc2hvdWxkIGJlLgorCSAqLworCWZvcihpID0gMDsgaSA8IG5leHRfZnJlZTsgaSsrKSB7CisJCXJlYyA9ICZlbC0+bF9yZWNzW2ldOworCisJCWlmIChpbnNlcnRfY3BvcyA8IGxlMzJfdG9fY3B1KHJlYy0+ZV9jcG9zKSkKKwkJCWJyZWFrOworCX0KKwlpbnNlcnRfaW5kZXggPSBpOworCisJbWxvZygwLCAiaW5zICV1OiBpbmRleCAlZCwgaGFzX2VtcHR5ICVkLCBuZXh0X2ZyZWUgJWQsIGNvdW50ICVkXG4iLAorCSAgICAgaW5zZXJ0X2Nwb3MsIGluc2VydF9pbmRleCwgaGFzX2VtcHR5LCBuZXh0X2ZyZWUsIGxlMTZfdG9fY3B1KGVsLT5sX2NvdW50KSk7CisKKwlCVUdfT04oaW5zZXJ0X2luZGV4IDwgMCk7CisJQlVHX09OKGluc2VydF9pbmRleCA+PSBsZTE2X3RvX2NwdShlbC0+bF9jb3VudCkpOworCUJVR19PTihpbnNlcnRfaW5kZXggPiBuZXh0X2ZyZWUpOworCisJLyoKKwkgKiBObyBuZWVkIHRvIG1lbW1vdmUgaWYgd2UncmUganVzdCBhZGRpbmcgdG8gdGhlIHRhaWwuCisJICovCisJaWYgKGluc2VydF9pbmRleCAhPSBuZXh0X2ZyZWUpIHsKKwkJQlVHX09OKG5leHRfZnJlZSA+PSBsZTE2X3RvX2NwdShlbC0+bF9jb3VudCkpOworCisJCW51bV9ieXRlcyA9IG5leHRfZnJlZSAtIGluc2VydF9pbmRleDsKKwkJbnVtX2J5dGVzICo9IHNpemVvZihzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyk7CisJCW1lbW1vdmUoJmVsLT5sX3JlY3NbaW5zZXJ0X2luZGV4ICsgMV0sCisJCQkmZWwtPmxfcmVjc1tpbnNlcnRfaW5kZXhdLAorCQkJbnVtX2J5dGVzKTsKKwl9CisKKwkvKgorCSAqIEVpdGhlciB3ZSBoYWQgYW4gZW1wdHkgZXh0ZW50LCBhbmQgbmVlZCB0byByZS1pbmNyZW1lbnQgb3IKKwkgKiB0aGVyZSB3YXMgbm8gZW1wdHkgZXh0ZW50IG9uIGEgbm9uIGZ1bGwgcmlnaHRtb3N0IGxlYWYgbm9kZSwKKwkgKiBpbiB3aGljaCBjYXNlIHdlIHN0aWxsIG5lZWQgdG8gaW5jcmVtZW50LgorCSAqLworCW5leHRfZnJlZSsrOworCWVsLT5sX25leHRfZnJlZV9yZWMgPSBjcHVfdG9fbGUxNihuZXh0X2ZyZWUpOworCS8qCisJICogTWFrZSBzdXJlIG5vbmUgb2YgdGhlIG1hdGggYWJvdmUganVzdCBtZXNzZWQgdXAgb3VyIHRyZWUuCisJICovCisJQlVHX09OKGxlMTZfdG9fY3B1KGVsLT5sX25leHRfZnJlZV9yZWMpID4gbGUxNl90b19jcHUoZWwtPmxfY291bnQpKTsKKworCWVsLT5sX3JlY3NbaW5zZXJ0X2luZGV4XSA9ICppbnNlcnRfcmVjOworCit9CisKKy8qCisgKiBDcmVhdGUgYW4gZW1wdHkgZXh0ZW50IHJlY29yZCAuCisgKgorICogbF9uZXh0X2ZyZWVfcmVjIG1heSBiZSB1cGRhdGVkLgorICoKKyAqIElmIGFuIGVtcHR5IGV4dGVudCBhbHJlYWR5IGV4aXN0cyBkbyBub3RoaW5nLgorICovCitzdGF0aWMgdm9pZCBvY2ZzMl9jcmVhdGVfZW1wdHlfZXh0ZW50KHN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqZWwpCit7CisJaW50IG5leHRfZnJlZSA9IGxlMTZfdG9fY3B1KGVsLT5sX25leHRfZnJlZV9yZWMpOworCisJQlVHX09OKGxlMTZfdG9fY3B1KGVsLT5sX3RyZWVfZGVwdGgpICE9IDApOworCisJaWYgKG5leHRfZnJlZSA9PSAwKQorCQlnb3RvIHNldF9hbmRfaW5jOworCisJaWYgKG9jZnMyX2lzX2VtcHR5X2V4dGVudCgmZWwtPmxfcmVjc1swXSkpCisJCXJldHVybjsKKworCW1sb2dfYnVnX29uX21zZyhlbC0+bF9jb3VudCA9PSBlbC0+bF9uZXh0X2ZyZWVfcmVjLAorCQkJIkFza2VkIHRvIGNyZWF0ZSBhbiBlbXB0eSBleHRlbnQgaW4gYSBmdWxsIGxpc3Q6XG4iCisJCQkiY291bnQgPSAldSwgdHJlZSBkZXB0aCA9ICV1IiwKKwkJCWxlMTZfdG9fY3B1KGVsLT5sX2NvdW50KSwKKwkJCWxlMTZfdG9fY3B1KGVsLT5sX3RyZWVfZGVwdGgpKTsKKworCW9jZnMyX3NoaWZ0X3JlY29yZHNfcmlnaHQoZWwpOworCitzZXRfYW5kX2luYzoKKwlsZTE2X2FkZF9jcHUoJmVsLT5sX25leHRfZnJlZV9yZWMsIDEpOworCW1lbXNldCgmZWwtPmxfcmVjc1swXSwgMCwgc2l6ZW9mKHN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjKSk7Cit9CisKKy8qCisgKiBGb3IgYSByb3RhdGlvbiB3aGljaCBpbnZvbHZlcyB0d28gbGVhZiBub2RlcywgdGhlICJyb290IG5vZGUiIGlzCisgKiB0aGUgbG93ZXN0IGxldmVsIHRyZWUgbm9kZSB3aGljaCBjb250YWlucyBhIHBhdGggdG8gYm90aCBsZWFmcy4gVGhpcworICogcmVzdWx0aW5nIHNldCBvZiBpbmZvcm1hdGlvbiBjYW4gYmUgdXNlZCB0byBmb3JtIGEgY29tcGxldGUgInN1YnRyZWUiCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBwYXNzZWQgdHdvIGZ1bGwgcGF0aHMgZnJvbSB0aGUgZGlub2RlIGRvd24gdG8gYQorICogcGFpciBvZiBhZGphY2VudCBsZWF2ZXMuIEl0J3MgdGFzayBpcyB0byBmaWd1cmUgb3V0IHdoaWNoIHBhdGgKKyAqIGluZGV4IGNvbnRhaW5zIHRoZSBzdWJ0cmVlIHJvb3QgLSB0aGlzIGNhbiBiZSB0aGUgcm9vdCBpbmRleCBpdHNlbGYKKyAqIGluIGEgd29yc3QtY2FzZSByb3RhdGlvbi4KKyAqCisgKiBUaGUgYXJyYXkgaW5kZXggb2YgdGhlIHN1YnRyZWUgcm9vdCBpcyBwYXNzZWQgYmFjay4KKyAqLworc3RhdGljIGludCBvY2ZzMl9maW5kX3N1YnRyZWVfcm9vdChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSAgIHN0cnVjdCBvY2ZzMl9wYXRoICpsZWZ0LAorCQkJCSAgIHN0cnVjdCBvY2ZzMl9wYXRoICpyaWdodCkKK3sKKwlpbnQgaSA9IDA7CisKKwkvKgorCSAqIENoZWNrIHRoYXQgdGhlIGNhbGxlciBwYXNzZWQgaW4gdHdvIHBhdGhzIGZyb20gdGhlIHNhbWUgdHJlZS4KKwkgKi8KKwlCVUdfT04ocGF0aF9yb290X2JoKGxlZnQpICE9IHBhdGhfcm9vdF9iaChyaWdodCkpOworCisJZG8geworCQlpKys7CisKKwkJLyoKKwkJICogVGhlIGNhbGxlciBkaWRuJ3QgcGFzcyB0d28gYWRqYWNlbnQgcGF0aHMuCisJCSAqLworCQltbG9nX2J1Z19vbl9tc2coaSA+IGxlZnQtPnBfdHJlZV9kZXB0aCwKKwkJCQkiSW5vZGUgJWx1LCBsZWZ0IGRlcHRoICV1LCByaWdodCBkZXB0aCAldVxuIgorCQkJCSJsZWZ0IGxlYWYgYmxrICVsbHUsIHJpZ2h0IGxlYWYgYmxrICVsbHVcbiIsCisJCQkJaW5vZGUtPmlfaW5vLCBsZWZ0LT5wX3RyZWVfZGVwdGgsCisJCQkJcmlnaHQtPnBfdHJlZV9kZXB0aCwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKXBhdGhfbGVhZl9iaChsZWZ0KS0+Yl9ibG9ja25yLAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpcGF0aF9sZWFmX2JoKHJpZ2h0KS0+Yl9ibG9ja25yKTsKKwl9IHdoaWxlIChsZWZ0LT5wX25vZGVbaV0uYmgtPmJfYmxvY2tuciA9PQorCQkgcmlnaHQtPnBfbm9kZVtpXS5iaC0+Yl9ibG9ja25yKTsKKworCXJldHVybiBpIC0gMTsKK30KKwordHlwZWRlZiB2b2lkIChwYXRoX2luc2VydF90KSh2b2lkICosIHN0cnVjdCBidWZmZXJfaGVhZCAqKTsKKworLyoKKyAqIFRyYXZlcnNlIGEgYnRyZWUgcGF0aCBpbiBzZWFyY2ggb2YgY3Bvcywgc3RhcnRpbmcgYXQgcm9vdF9lbC4KKyAqCisgKiBUaGlzIGNvZGUgY2FuIGJlIGNhbGxlZCB3aXRoIGEgY3BvcyBsYXJnZXIgdGhhbiB0aGUgdHJlZSwgaW4gd2hpY2gKKyAqIGNhc2UgaXQgd2lsbCByZXR1cm4gdGhlIHJpZ2h0bW9zdCBwYXRoLgorICovCitzdGF0aWMgaW50IF9fb2NmczJfZmluZF9wYXRoKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgICAgIHN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqcm9vdF9lbCwgdTMyIGNwb3MsCisJCQkgICAgIHBhdGhfaW5zZXJ0X3QgKmZ1bmMsIHZvaWQgKmRhdGEpCit7CisJaW50IGksIHJldCA9IDA7CisJdTMyIHJhbmdlOworCXU2NCBibGtubzsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICplYjsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKmVsOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjICpyZWM7CisJc3RydWN0IG9jZnMyX2lub2RlX2luZm8gKm9pID0gT0NGUzJfSShpbm9kZSk7CisKKwllbCA9IHJvb3RfZWw7CisJd2hpbGUgKGVsLT5sX3RyZWVfZGVwdGgpIHsKKwkJaWYgKGxlMTZfdG9fY3B1KGVsLT5sX25leHRfZnJlZV9yZWMpID09IDApIHsKKwkJCW9jZnMyX2Vycm9yKGlub2RlLT5pX3NiLAorCQkJCSAgICAiSW5vZGUgJWxsdSBoYXMgZW1wdHkgZXh0ZW50IGxpc3QgYXQgIgorCQkJCSAgICAiZGVwdGggJXVcbiIsCisJCQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpb2ktPmlwX2Jsa25vLAorCQkJCSAgICBsZTE2X3RvX2NwdShlbC0+bF90cmVlX2RlcHRoKSk7CisJCQlyZXQgPSAtRVJPRlM7CisJCQlnb3RvIG91dDsKKworCQl9CisKKwkJZm9yKGkgPSAwOyBpIDwgbGUxNl90b19jcHUoZWwtPmxfbmV4dF9mcmVlX3JlYykgLSAxOyBpKyspIHsKKwkJCXJlYyA9ICZlbC0+bF9yZWNzW2ldOworCisJCQkvKgorCQkJICogSW4gdGhlIGNhc2UgdGhhdCBjcG9zIGlzIG9mZiB0aGUgYWxsb2NhdGlvbgorCQkJICogdHJlZSwgdGhpcyBzaG91bGQganVzdCB3aW5kIHVwIHJldHVybmluZyB0aGUKKwkJCSAqIHJpZ2h0bW9zdCByZWNvcmQuCisJCQkgKi8KKwkJCXJhbmdlID0gbGUzMl90b19jcHUocmVjLT5lX2Nwb3MpICsKKwkJCQlvY2ZzMl9yZWNfY2x1c3RlcnMoZWwsIHJlYyk7CisJCQlpZiAoY3BvcyA+PSBsZTMyX3RvX2NwdShyZWMtPmVfY3BvcykgJiYgY3BvcyA8IHJhbmdlKQorCQkJICAgIGJyZWFrOworCQl9CisKKwkJYmxrbm8gPSBsZTY0X3RvX2NwdShlbC0+bF9yZWNzW2ldLmVfYmxrbm8pOworCQlpZiAoYmxrbm8gPT0gMCkgeworCQkJb2NmczJfZXJyb3IoaW5vZGUtPmlfc2IsCisJCQkJICAgICJJbm9kZSAlbGx1IGhhcyBiYWQgYmxrbm8gaW4gZXh0ZW50IGxpc3QgIgorCQkJCSAgICAiYXQgZGVwdGggJXUgKGluZGV4ICVkKVxuIiwKKwkJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylvaS0+aXBfYmxrbm8sCisJCQkJICAgIGxlMTZfdG9fY3B1KGVsLT5sX3RyZWVfZGVwdGgpLCBpKTsKKwkJCXJldCA9IC1FUk9GUzsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJYnJlbHNlKGJoKTsKKwkJYmggPSBOVUxMOworCQlyZXQgPSBvY2ZzMl9yZWFkX2Jsb2NrKE9DRlMyX1NCKGlub2RlLT5pX3NiKSwgYmxrbm8sCisJCQkJICAgICAgICZiaCwgT0NGUzJfQkhfQ0FDSEVELCBpbm9kZSk7CisJCWlmIChyZXQpIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJZWIgPSAoc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqKSBiaC0+Yl9kYXRhOworCQllbCA9ICZlYi0+aF9saXN0OworCQlpZiAoIU9DRlMyX0lTX1ZBTElEX0VYVEVOVF9CTE9DSyhlYikpIHsKKwkJCU9DRlMyX1JPX09OX0lOVkFMSURfRVhURU5UX0JMT0NLKGlub2RlLT5pX3NiLCBlYik7CisJCQlyZXQgPSAtRUlPOworCQkJZ290byBvdXQ7CisJCX0KKworCQlpZiAobGUxNl90b19jcHUoZWwtPmxfbmV4dF9mcmVlX3JlYykgPgorCQkgICAgbGUxNl90b19jcHUoZWwtPmxfY291bnQpKSB7CisJCQlvY2ZzMl9lcnJvcihpbm9kZS0+aV9zYiwKKwkJCQkgICAgIklub2RlICVsbHUgaGFzIGJhZCBjb3VudCBpbiBleHRlbnQgbGlzdCAiCisJCQkJICAgICJhdCBibG9jayAlbGx1IChuZXh0IGZyZWU9JXUsIGNvdW50PSV1KVxuIiwKKwkJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylvaS0+aXBfYmxrbm8sCisJCQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYmgtPmJfYmxvY2tuciwKKwkJCQkgICAgbGUxNl90b19jcHUoZWwtPmxfbmV4dF9mcmVlX3JlYyksCisJCQkJICAgIGxlMTZfdG9fY3B1KGVsLT5sX2NvdW50KSk7CisJCQlyZXQgPSAtRVJPRlM7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlmIChmdW5jKQorCQkJZnVuYyhkYXRhLCBiaCk7CisJfQorCitvdXQ6CisJLyoKKwkgKiBDYXRjaCBhbnkgdHJhaWxpbmcgYmggdGhhdCB0aGUgbG9vcCBkaWRuJ3QgaGFuZGxlLgorCSAqLworCWJyZWxzZShiaCk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogR2l2ZW4gYW4gaW5pdGlhbGl6ZWQgcGF0aCAodGhhdCBpcywgaXQgaGFzIGEgdmFsaWQgcm9vdCBleHRlbnQKKyAqIGxpc3QpLCB0aGlzIGZ1bmN0aW9uIHdpbGwgdHJhdmVyc2UgdGhlIGJ0cmVlIGluIHNlYXJjaCBvZiB0aGUgcGF0aAorICogd2hpY2ggd291bGQgY29udGFpbiBjcG9zLgorICoKKyAqIFRoZSBwYXRoIHRyYXZlbGVkIGlzIHJlY29yZGVkIGluIHRoZSBwYXRoIHN0cnVjdHVyZS4KKyAqCisgKiBOb3RlIHRoYXQgdGhpcyB3aWxsIG5vdCBkbyBhbnkgY29tcGFyaXNvbnMgb24gbGVhZiBub2RlIGV4dGVudAorICogcmVjb3Jkcywgc28gaXQgd2lsbCB3b3JrIGZpbmUgaW4gdGhlIGNhc2UgdGhhdCB3ZSBqdXN0IGFkZGVkIGEgdHJlZQorICogYnJhbmNoLgorICovCitzdHJ1Y3QgZmluZF9wYXRoX2RhdGEgeworCWludCBpbmRleDsKKwlzdHJ1Y3Qgb2NmczJfcGF0aCAqcGF0aDsKK307CitzdGF0aWMgdm9pZCBmaW5kX3BhdGhfaW5zKHZvaWQgKmRhdGEsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJc3RydWN0IGZpbmRfcGF0aF9kYXRhICpmcCA9IGRhdGE7CisKKwlnZXRfYmgoYmgpOworCW9jZnMyX3BhdGhfaW5zZXJ0X2ViKGZwLT5wYXRoLCBmcC0+aW5kZXgsIGJoKTsKKwlmcC0+aW5kZXgrKzsKK30KK3N0YXRpYyBpbnQgb2NmczJfZmluZF9wYXRoKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBvY2ZzMl9wYXRoICpwYXRoLAorCQkJICAgdTMyIGNwb3MpCit7CisJc3RydWN0IGZpbmRfcGF0aF9kYXRhIGRhdGE7CisKKwlkYXRhLmluZGV4ID0gMTsKKwlkYXRhLnBhdGggPSBwYXRoOworCXJldHVybiBfX29jZnMyX2ZpbmRfcGF0aChpbm9kZSwgcGF0aF9yb290X2VsKHBhdGgpLCBjcG9zLAorCQkJCSBmaW5kX3BhdGhfaW5zLCAmZGF0YSk7Cit9CisKK3N0YXRpYyB2b2lkIGZpbmRfbGVhZl9pbnModm9pZCAqZGF0YSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICplYiA9KHN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKiliaC0+Yl9kYXRhOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqZWwgPSAmZWItPmhfbGlzdDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKipyZXQgPSBkYXRhOworCisJLyogV2Ugd2FudCB0byByZXRhaW4gb25seSB0aGUgbGVhZiBibG9jay4gKi8KKwlpZiAobGUxNl90b19jcHUoZWwtPmxfdHJlZV9kZXB0aCkgPT0gMCkgeworCQlnZXRfYmgoYmgpOworCQkqcmV0ID0gYmg7CisJfQorfQorLyoKKyAqIEZpbmQgdGhlIGxlYWYgYmxvY2sgaW4gdGhlIHRyZWUgd2hpY2ggd291bGQgY29udGFpbiBjcG9zLiBObworICogY2hlY2tpbmcgb2YgdGhlIGFjdHVhbCBsZWFmIGlzIGRvbmUuCisgKgorICogU29tZSBwYXRocyB3YW50IHRvIGNhbGwgdGhpcyBpbnN0ZWFkIG9mIGFsbG9jYXRpbmcgYSBwYXRoIHN0cnVjdHVyZQorICogYW5kIGNhbGxpbmcgb2NmczJfZmluZF9wYXRoKCkuCisgKgorICogVGhpcyBmdW5jdGlvbiBkb2Vzbid0IGhhbmRsZSBub24gYnRyZWUgZXh0ZW50IGxpc3RzLgorICovCitpbnQgb2NmczJfZmluZF9sZWFmKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqcm9vdF9lbCwKKwkJICAgIHUzMiBjcG9zLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipsZWFmX2JoKQoreworCWludCByZXQ7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7CisKKwlyZXQgPSBfX29jZnMyX2ZpbmRfcGF0aChpbm9kZSwgcm9vdF9lbCwgY3BvcywgZmluZF9sZWFmX2lucywgJmJoKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJKmxlYWZfYmggPSBiaDsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogQWRqdXN0IHRoZSBhZGphY2VudCByZWNvcmRzIChsZWZ0X3JlYywgcmlnaHRfcmVjKSBpbnZvbHZlZCBpbiBhIHJvdGF0aW9uLgorICoKKyAqIEJhc2ljYWxseSwgd2UndmUgbW92ZWQgc3R1ZmYgYXJvdW5kIGF0IHRoZSBib3R0b20gb2YgdGhlIHRyZWUgYW5kCisgKiB3ZSBuZWVkIHRvIGZpeCB1cCB0aGUgZXh0ZW50IHJlY29yZHMgYWJvdmUgdGhlIGNoYW5nZXMgdG8gcmVmbGVjdAorICogdGhlIG5ldyBjaGFuZ2VzLgorICoKKyAqIGxlZnRfcmVjOiB0aGUgcmVjb3JkIG9uIHRoZSBsZWZ0LgorICogbGVmdF9jaGlsZF9lbDogaXMgdGhlIGNoaWxkIGxpc3QgcG9pbnRlZCB0byBieSBsZWZ0X3JlYworICogcmlnaHRfcmVjOiB0aGUgcmVjb3JkIHRvIHRoZSByaWdodCBvZiBsZWZ0X3JlYworICogcmlnaHRfY2hpbGRfZWw6IGlzIHRoZSBjaGlsZCBsaXN0IHBvaW50ZWQgdG8gYnkgcmlnaHRfcmVjCisgKgorICogQnkgZGVmaW5pdGlvbiwgdGhpcyBvbmx5IHdvcmtzIG9uIGludGVyaW9yIG5vZGVzLgorICovCitzdGF0aWMgdm9pZCBvY2ZzMl9hZGp1c3RfYWRqYWNlbnRfcmVjb3JkcyhzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyAqbGVmdF9yZWMsCisJCQkJICBzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKmxlZnRfY2hpbGRfZWwsCisJCQkJICBzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyAqcmlnaHRfcmVjLAorCQkJCSAgc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICpyaWdodF9jaGlsZF9lbCkKK3sKKwl1MzIgbGVmdF9jbHVzdGVycywgcmlnaHRfZW5kOworCisJLyoKKwkgKiBJbnRlcmlvciBub2RlcyBuZXZlciBoYXZlIGhvbGVzLiBUaGVpciBjcG9zIGlzIHRoZSBjcG9zIG9mCisJICogdGhlIGxlZnRtb3N0IHJlY29yZCBpbiB0aGVpciBjaGlsZCBsaXN0LiBUaGVpciBjbHVzdGVyCisJICogY291bnQgY292ZXJzIHRoZSBmdWxsIHRoZW9yZXRpY2FsIHJhbmdlIG9mIHRoZWlyIGNoaWxkIGxpc3QKKwkgKiAtIHRoZSByYW5nZSBiZXR3ZWVuIHRoZWlyIGNwb3MgYW5kIHRoZSBjcG9zIG9mIHRoZSByZWNvcmQKKwkgKiBpbW1lZGlhdGVseSB0byB0aGVpciByaWdodC4KKwkgKi8KKwlsZWZ0X2NsdXN0ZXJzID0gbGUzMl90b19jcHUocmlnaHRfY2hpbGRfZWwtPmxfcmVjc1swXS5lX2Nwb3MpOworCWxlZnRfY2x1c3RlcnMgLT0gbGUzMl90b19jcHUobGVmdF9yZWMtPmVfY3Bvcyk7CisJbGVmdF9yZWMtPmVfaW50X2NsdXN0ZXJzID0gY3B1X3RvX2xlMzIobGVmdF9jbHVzdGVycyk7CisKKwkvKgorCSAqIENhbGN1bGF0ZSB0aGUgcmlnaHRtb3N0IGNsdXN0ZXIgY291bnQgYm91bmRhcnkgYmVmb3JlCisJICogbW92aW5nIGNwb3MgLSB3ZSB3aWxsIG5lZWQgdG8gYWRqdXN0IGNsdXN0ZXJzIGFmdGVyCisJICogdXBkYXRpbmcgZV9jcG9zIHRvIGtlZXAgdGhlIHNhbWUgaGlnaGVzdCBjbHVzdGVyIGNvdW50LgorCSAqLworCXJpZ2h0X2VuZCA9IGxlMzJfdG9fY3B1KHJpZ2h0X3JlYy0+ZV9jcG9zKTsKKwlyaWdodF9lbmQgKz0gbGUzMl90b19jcHUocmlnaHRfcmVjLT5lX2ludF9jbHVzdGVycyk7CisKKwlyaWdodF9yZWMtPmVfY3BvcyA9IGxlZnRfcmVjLT5lX2Nwb3M7CisJbGUzMl9hZGRfY3B1KCZyaWdodF9yZWMtPmVfY3BvcywgbGVmdF9jbHVzdGVycyk7CisKKwlyaWdodF9lbmQgLT0gbGUzMl90b19jcHUocmlnaHRfcmVjLT5lX2Nwb3MpOworCXJpZ2h0X3JlYy0+ZV9pbnRfY2x1c3RlcnMgPSBjcHVfdG9fbGUzMihyaWdodF9lbmQpOworfQorCisvKgorICogQWRqdXN0IHRoZSBhZGphY2VudCByb290IG5vZGUgcmVjb3JkcyBpbnZvbHZlZCBpbiBhCisgKiByb3RhdGlvbi4gbGVmdF9lbF9ibGtubyBpcyBwYXNzZWQgaW4gYXMgYSBrZXkgc28gdGhhdCB3ZSBjYW4gZWFzaWx5CisgKiBmaW5kIGl0J3MgaW5kZXggaW4gdGhlIHJvb3QgbGlzdC4KKyAqLworc3RhdGljIHZvaWQgb2NmczJfYWRqdXN0X3Jvb3RfcmVjb3JkcyhzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKnJvb3RfZWwsCisJCQkJICAgICAgc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICpsZWZ0X2VsLAorCQkJCSAgICAgIHN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqcmlnaHRfZWwsCisJCQkJICAgICAgdTY0IGxlZnRfZWxfYmxrbm8pCit7CisJaW50IGk7CisKKwlCVUdfT04obGUxNl90b19jcHUocm9vdF9lbC0+bF90cmVlX2RlcHRoKSA8PQorCSAgICAgICBsZTE2X3RvX2NwdShsZWZ0X2VsLT5sX3RyZWVfZGVwdGgpKTsKKworCWZvcihpID0gMDsgaSA8IGxlMTZfdG9fY3B1KHJvb3RfZWwtPmxfbmV4dF9mcmVlX3JlYykgLSAxOyBpKyspIHsKKwkJaWYgKGxlNjRfdG9fY3B1KHJvb3RfZWwtPmxfcmVjc1tpXS5lX2Jsa25vKSA9PSBsZWZ0X2VsX2Jsa25vKQorCQkJYnJlYWs7CisJfQorCisJLyoKKwkgKiBUaGUgcGF0aCB3YWxraW5nIGNvZGUgc2hvdWxkIGhhdmUgbmV2ZXIgcmV0dXJuZWQgYSByb290IGFuZAorCSAqIHR3byBwYXRocyB3aGljaCBhcmUgbm90IGFkamFjZW50LgorCSAqLworCUJVR19PTihpID49IChsZTE2X3RvX2NwdShyb290X2VsLT5sX25leHRfZnJlZV9yZWMpIC0gMSkpOworCisJb2NmczJfYWRqdXN0X2FkamFjZW50X3JlY29yZHMoJnJvb3RfZWwtPmxfcmVjc1tpXSwgbGVmdF9lbCwKKwkJCQkgICAgICAmcm9vdF9lbC0+bF9yZWNzW2kgKyAxXSwgcmlnaHRfZWwpOworfQorCisvKgorICogV2UndmUgY2hhbmdlZCBhIGxlYWYgYmxvY2sgKGluIHJpZ2h0X3BhdGgpIGFuZCBuZWVkIHRvIHJlZmxlY3QgdGhhdAorICogY2hhbmdlIGJhY2sgdXAgdGhlIHN1YnRyZWUuCisgKgorICogVGhpcyBoYXBwZW5zIGluIG11bHRpcGxlIHBsYWNlczoKKyAqICAgLSBXaGVuIHdlJ3ZlIG1vdmVkIGFuIGV4dGVudCByZWNvcmQgZnJvbSB0aGUgbGVmdCBwYXRoIGxlYWYgdG8gdGhlIHJpZ2h0CisgKiAgICAgcGF0aCBsZWFmIHRvIG1ha2Ugcm9vbSBmb3IgYW4gZW1wdHkgZXh0ZW50IGluIHRoZSBsZWZ0IHBhdGggbGVhZi4KKyAqICAgLSBXaGVuIG91ciBpbnNlcnQgaW50byB0aGUgcmlnaHQgcGF0aCBsZWFmIGlzIGF0IHRoZSBsZWZ0bW9zdCBlZGdlCisgKiAgICAgYW5kIHJlcXVpcmVzIGFuIHVwZGF0ZSBvZiB0aGUgcGF0aCBpbW1lZGlhdGVseSB0byBpdCdzIGxlZnQuIFRoaXMKKyAqICAgICBjYW4gb2NjdXIgYXQgdGhlIGVuZCBvZiBzb21lIHR5cGVzIG9mIHJvdGF0aW9uIGFuZCBhcHBlbmRpbmcgaW5zZXJ0cy4KKyAqLworc3RhdGljIHZvaWQgb2NmczJfY29tcGxldGVfZWRnZV9pbnNlcnQoc3RydWN0IGlub2RlICppbm9kZSwgaGFuZGxlX3QgKmhhbmRsZSwKKwkJCQkgICAgICAgc3RydWN0IG9jZnMyX3BhdGggKmxlZnRfcGF0aCwKKwkJCQkgICAgICAgc3RydWN0IG9jZnMyX3BhdGggKnJpZ2h0X3BhdGgsCisJCQkJICAgICAgIGludCBzdWJ0cmVlX2luZGV4KQoreworCWludCByZXQsIGksIGlkeDsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKmVsLCAqbGVmdF9lbCwgKnJpZ2h0X2VsOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjICpsZWZ0X3JlYywgKnJpZ2h0X3JlYzsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnJvb3RfYmggPSBsZWZ0X3BhdGgtPnBfbm9kZVtzdWJ0cmVlX2luZGV4XS5iaDsKKworCS8qCisJICogVXBkYXRlIHRoZSBjb3VudHMgYW5kIHBvc2l0aW9uIHZhbHVlcyB3aXRoaW4gYWxsIHRoZQorCSAqIGludGVyaW9yIG5vZGVzIHRvIHJlZmxlY3QgdGhlIGxlYWYgcm90YXRpb24gd2UganVzdCBkaWQuCisJICoKKwkgKiBUaGUgcm9vdCBub2RlIGlzIGhhbmRsZWQgYmVsb3cgdGhlIGxvb3AuCisJICoKKwkgKiBXZSBiZWdpbiB0aGUgbG9vcCB3aXRoIHJpZ2h0X2VsIGFuZCBsZWZ0X2VsIHBvaW50aW5nIHRvIHRoZQorCSAqIGxlYWYgbGlzdHMgYW5kIHdvcmsgb3VyIHdheSB1cC4KKwkgKgorCSAqIE5PVEU6IHdpdGhpbiB0aGlzIGxvb3AsIGxlZnRfZWwgYW5kIHJpZ2h0X2VsIGFsd2F5cyByZWZlcgorCSAqIHRvIHRoZSAqY2hpbGQqIGxpc3RzLgorCSAqLworCWxlZnRfZWwgPSBwYXRoX2xlYWZfZWwobGVmdF9wYXRoKTsKKwlyaWdodF9lbCA9IHBhdGhfbGVhZl9lbChyaWdodF9wYXRoKTsKKwlmb3IoaSA9IGxlZnRfcGF0aC0+cF90cmVlX2RlcHRoIC0gMTsgaSA+IHN1YnRyZWVfaW5kZXg7IGktLSkgeworCQltbG9nKDAsICJBZGp1c3QgcmVjb3JkcyBhdCBpbmRleCAldVxuIiwgaSk7CisKKwkJLyoKKwkJICogT25lIG5pY2UgcHJvcGVydHkgb2Yga25vd2luZyB0aGF0IGFsbCBvZiB0aGVzZQorCQkgKiBub2RlcyBhcmUgYmVsb3cgdGhlIHJvb3QgaXMgdGhhdCB3ZSBvbmx5IGRlYWwgd2l0aAorCQkgKiB0aGUgbGVmdG1vc3QgcmlnaHQgbm9kZSByZWNvcmQgYW5kIHRoZSByaWdodG1vc3QKKwkJICogbGVmdCBub2RlIHJlY29yZC4KKwkJICovCisJCWVsID0gbGVmdF9wYXRoLT5wX25vZGVbaV0uZWw7CisJCWlkeCA9IGxlMTZfdG9fY3B1KGxlZnRfZWwtPmxfbmV4dF9mcmVlX3JlYykgLSAxOworCQlsZWZ0X3JlYyA9ICZlbC0+bF9yZWNzW2lkeF07CisKKwkJZWwgPSByaWdodF9wYXRoLT5wX25vZGVbaV0uZWw7CisJCXJpZ2h0X3JlYyA9ICZlbC0+bF9yZWNzWzBdOworCisJCW9jZnMyX2FkanVzdF9hZGphY2VudF9yZWNvcmRzKGxlZnRfcmVjLCBsZWZ0X2VsLCByaWdodF9yZWMsCisJCQkJCSAgICAgIHJpZ2h0X2VsKTsKKworCQlyZXQgPSBvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgbGVmdF9wYXRoLT5wX25vZGVbaV0uYmgpOworCQlpZiAocmV0KQorCQkJbWxvZ19lcnJubyhyZXQpOworCisJCXJldCA9IG9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCByaWdodF9wYXRoLT5wX25vZGVbaV0uYmgpOworCQlpZiAocmV0KQorCQkJbWxvZ19lcnJubyhyZXQpOworCisJCS8qCisJCSAqIFNldHVwIG91ciBsaXN0IHBvaW50ZXJzIG5vdyBzbyB0aGF0IHRoZSBjdXJyZW50CisJCSAqIHBhcmVudHMgYmVjb21lIGNoaWxkcmVuIGluIHRoZSBuZXh0IGl0ZXJhdGlvbi4KKwkJICovCisJCWxlZnRfZWwgPSBsZWZ0X3BhdGgtPnBfbm9kZVtpXS5lbDsKKwkJcmlnaHRfZWwgPSByaWdodF9wYXRoLT5wX25vZGVbaV0uZWw7CisJfQorCisJLyoKKwkgKiBBdCB0aGUgcm9vdCBub2RlLCBhZGp1c3QgdGhlIHR3byBhZGphY2VudCByZWNvcmRzIHdoaWNoCisJICogYmVnaW4gb3VyIHBhdGggdG8gdGhlIGxlYXZlcy4KKwkgKi8KKworCWVsID0gbGVmdF9wYXRoLT5wX25vZGVbc3VidHJlZV9pbmRleF0uZWw7CisJbGVmdF9lbCA9IGxlZnRfcGF0aC0+cF9ub2RlW3N1YnRyZWVfaW5kZXggKyAxXS5lbDsKKwlyaWdodF9lbCA9IHJpZ2h0X3BhdGgtPnBfbm9kZVtzdWJ0cmVlX2luZGV4ICsgMV0uZWw7CisKKwlvY2ZzMl9hZGp1c3Rfcm9vdF9yZWNvcmRzKGVsLCBsZWZ0X2VsLCByaWdodF9lbCwKKwkJCQkgIGxlZnRfcGF0aC0+cF9ub2RlW3N1YnRyZWVfaW5kZXggKyAxXS5iaC0+Yl9ibG9ja25yKTsKKworCXJvb3RfYmggPSBsZWZ0X3BhdGgtPnBfbm9kZVtzdWJ0cmVlX2luZGV4XS5iaDsKKworCXJldCA9IG9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCByb290X2JoKTsKKwlpZiAocmV0KQorCQltbG9nX2Vycm5vKHJldCk7Cit9CisKK3N0YXRpYyBpbnQgb2NmczJfcm90YXRlX3N1YnRyZWVfcmlnaHQoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgICAgICBoYW5kbGVfdCAqaGFuZGxlLAorCQkJCSAgICAgIHN0cnVjdCBvY2ZzMl9wYXRoICpsZWZ0X3BhdGgsCisJCQkJICAgICAgc3RydWN0IG9jZnMyX3BhdGggKnJpZ2h0X3BhdGgsCisJCQkJICAgICAgaW50IHN1YnRyZWVfaW5kZXgpCit7CisJaW50IHJldCwgaTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnJpZ2h0X2xlYWZfYmg7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpsZWZ0X2xlYWZfYmggPSBOVUxMOworCXN0cnVjdCBidWZmZXJfaGVhZCAqcm9vdF9iaDsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKnJpZ2h0X2VsLCAqbGVmdF9lbDsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyBtb3ZlX3JlYzsKKworCWxlZnRfbGVhZl9iaCA9IHBhdGhfbGVhZl9iaChsZWZ0X3BhdGgpOworCWxlZnRfZWwgPSBwYXRoX2xlYWZfZWwobGVmdF9wYXRoKTsKKworCWlmIChsZWZ0X2VsLT5sX25leHRfZnJlZV9yZWMgIT0gbGVmdF9lbC0+bF9jb3VudCkgeworCQlvY2ZzMl9lcnJvcihpbm9kZS0+aV9zYiwKKwkJCSAgICAiSW5vZGUgJWxsdSBoYXMgbm9uLWZ1bGwgaW50ZXJpb3IgbGVhZiBub2RlICVsbHUiCisJCQkgICAgIihuZXh0IGZyZWUgPSAldSkiLAorCQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vLAorCQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbGVmdF9sZWFmX2JoLT5iX2Jsb2NrbnIsCisJCQkgICAgbGUxNl90b19jcHUobGVmdF9lbC0+bF9uZXh0X2ZyZWVfcmVjKSk7CisJCXJldHVybiAtRVJPRlM7CisJfQorCisJLyoKKwkgKiBUaGlzIGV4dGVudCBibG9jayBtYXkgYWxyZWFkeSBoYXZlIGFuIGVtcHR5IHJlY29yZCwgc28gd2UKKwkgKiByZXR1cm4gZWFybHkgaWYgc28uCisJICovCisJaWYgKG9jZnMyX2lzX2VtcHR5X2V4dGVudCgmbGVmdF9lbC0+bF9yZWNzWzBdKSkKKwkJcmV0dXJuIDA7CisKKwlyb290X2JoID0gbGVmdF9wYXRoLT5wX25vZGVbc3VidHJlZV9pbmRleF0uYmg7CisJQlVHX09OKHJvb3RfYmggIT0gcmlnaHRfcGF0aC0+cF9ub2RlW3N1YnRyZWVfaW5kZXhdLmJoKTsKKworCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIHJvb3RfYmgsCisJCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwlmb3IoaSA9IHN1YnRyZWVfaW5kZXggKyAxOyBpIDwgcGF0aF9udW1faXRlbXMocmlnaHRfcGF0aCk7IGkrKykgeworCQlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLAorCQkJCQkgICByaWdodF9wYXRoLT5wX25vZGVbaV0uYmgsCisJCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwkJaWYgKHJldCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLAorCQkJCQkgICBsZWZ0X3BhdGgtPnBfbm9kZVtpXS5iaCwKKwkJCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCQlpZiAocmV0KSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCXJpZ2h0X2xlYWZfYmggPSBwYXRoX2xlYWZfYmgocmlnaHRfcGF0aCk7CisJcmlnaHRfZWwgPSBwYXRoX2xlYWZfZWwocmlnaHRfcGF0aCk7CisKKwkvKiBUaGlzIGlzIGEgY29kZSBlcnJvciwgbm90IGEgZGlzayBjb3JydXB0aW9uLiAqLworCW1sb2dfYnVnX29uX21zZyghcmlnaHRfZWwtPmxfbmV4dF9mcmVlX3JlYywgIklub2RlICVsbHU6IFJvdGF0ZSBmYWlscyAiCisJCQkiYmVjYXVzZSByaWdodG1vc3QgbGVhZiBibG9jayAlbGx1IGlzIGVtcHR5XG4iLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8sCisJCQkodW5zaWduZWQgbG9uZyBsb25nKXJpZ2h0X2xlYWZfYmgtPmJfYmxvY2tucik7CisKKwlvY2ZzMl9jcmVhdGVfZW1wdHlfZXh0ZW50KHJpZ2h0X2VsKTsKKworCXJldCA9IG9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCByaWdodF9sZWFmX2JoKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogRG8gdGhlIGNvcHkgbm93LiAqLworCWkgPSBsZTE2X3RvX2NwdShsZWZ0X2VsLT5sX25leHRfZnJlZV9yZWMpIC0gMTsKKwltb3ZlX3JlYyA9IGxlZnRfZWwtPmxfcmVjc1tpXTsKKwlyaWdodF9lbC0+bF9yZWNzWzBdID0gbW92ZV9yZWM7CisKKwkvKgorCSAqIENsZWFyIG91dCB0aGUgcmVjb3JkIHdlIGp1c3QgY29waWVkIGFuZCBzaGlmdCBldmVyeXRoaW5nCisJICogb3ZlciwgbGVhdmluZyBhbiBlbXB0eSBleHRlbnQgaW4gdGhlIGxlZnQgbGVhZi4KKwkgKgorCSAqIFdlIHRlbXBvcmFyaWx5IHN1YnRyYWN0IGZyb20gbmV4dF9mcmVlX3JlYyBzbyB0aGF0IHRoZQorCSAqIHNoaWZ0IHdpbGwgbG9zZSB0aGUgdGFpbCByZWNvcmQgKHdoaWNoIGlzIG5vdyBkZWZ1bmN0KS4KKwkgKi8KKwlsZTE2X2FkZF9jcHUoJmxlZnRfZWwtPmxfbmV4dF9mcmVlX3JlYywgLTEpOworCW9jZnMyX3NoaWZ0X3JlY29yZHNfcmlnaHQobGVmdF9lbCk7CisJbWVtc2V0KCZsZWZ0X2VsLT5sX3JlY3NbMF0sIDAsIHNpemVvZihzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYykpOworCWxlMTZfYWRkX2NwdSgmbGVmdF9lbC0+bF9uZXh0X2ZyZWVfcmVjLCAxKTsKKworCXJldCA9IG9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCBsZWZ0X2xlYWZfYmgpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwlvY2ZzMl9jb21wbGV0ZV9lZGdlX2luc2VydChpbm9kZSwgaGFuZGxlLCBsZWZ0X3BhdGgsIHJpZ2h0X3BhdGgsCisJCQkJc3VidHJlZV9pbmRleCk7CisKK291dDoKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogR2l2ZW4gYSBmdWxsIHBhdGgsIGRldGVybWluZSB3aGF0IGNwb3MgdmFsdWUgd291bGQgcmV0dXJuIHVzIGEgcGF0aAorICogY29udGFpbmluZyB0aGUgbGVhZiBpbW1lZGlhdGVseSB0byB0aGUgbGVmdCBvZiB0aGUgY3VycmVudCBvbmUuCisgKgorICogV2lsbCByZXR1cm4gemVybyBpZiB0aGUgcGF0aCBwYXNzZWQgaW4gaXMgYWxyZWFkeSB0aGUgbGVmdG1vc3QgcGF0aC4KKyAqLworc3RhdGljIGludCBvY2ZzMl9maW5kX2Nwb3NfZm9yX2xlZnRfbGVhZihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCQkgc3RydWN0IG9jZnMyX3BhdGggKnBhdGgsIHUzMiAqY3BvcykKK3sKKwlpbnQgaSwgaiwgcmV0ID0gMDsKKwl1NjQgYmxrbm87CisJc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICplbDsKKworCUJVR19PTihwYXRoLT5wX3RyZWVfZGVwdGggPT0gMCk7CisKKwkqY3BvcyA9IDA7CisKKwlibGtubyA9IHBhdGhfbGVhZl9iaChwYXRoKS0+Yl9ibG9ja25yOworCisJLyogU3RhcnQgYXQgdGhlIHRyZWUgbm9kZSBqdXN0IGFib3ZlIHRoZSBsZWFmIGFuZCB3b3JrIG91ciB3YXkgdXAuICovCisJaSA9IHBhdGgtPnBfdHJlZV9kZXB0aCAtIDE7CisJd2hpbGUgKGkgPj0gMCkgeworCQllbCA9IHBhdGgtPnBfbm9kZVtpXS5lbDsKKworCQkvKgorCQkgKiBGaW5kIHRoZSBleHRlbnQgcmVjb3JkIGp1c3QgYmVmb3JlIHRoZSBvbmUgaW4gb3VyCisJCSAqIHBhdGguCisJCSAqLworCQlmb3IoaiA9IDA7IGogPCBsZTE2X3RvX2NwdShlbC0+bF9uZXh0X2ZyZWVfcmVjKTsgaisrKSB7CisJCQlpZiAobGU2NF90b19jcHUoZWwtPmxfcmVjc1tqXS5lX2Jsa25vKSA9PSBibGtubykgeworCQkJCWlmIChqID09IDApIHsKKwkJCQkJaWYgKGkgPT0gMCkgeworCQkJCQkJLyoKKwkJCQkJCSAqIFdlJ3ZlIGRldGVybWluZWQgdGhhdCB0aGUKKwkJCQkJCSAqIHBhdGggc3BlY2lmaWVkIGlzIGFscmVhZHkKKwkJCQkJCSAqIHRoZSBsZWZ0bW9zdCBvbmUgLSByZXR1cm4gYQorCQkJCQkJICogY3BvcyBvZiB6ZXJvLgorCQkJCQkJICovCisJCQkJCQlnb3RvIG91dDsKKwkJCQkJfQorCQkJCQkvKgorCQkJCQkgKiBUaGUgbGVmdG1vc3QgcmVjb3JkIHBvaW50cyB0byBvdXIKKwkJCQkJICogbGVhZiAtIHdlIG5lZWQgdG8gdHJhdmVsIHVwIHRoZQorCQkJCQkgKiB0cmVlIG9uZSBsZXZlbC4KKwkJCQkJICovCisJCQkJCWdvdG8gbmV4dF9ub2RlOworCQkJCX0KKworCQkJCSpjcG9zID0gbGUzMl90b19jcHUoZWwtPmxfcmVjc1tqIC0gMV0uZV9jcG9zKTsKKwkJCQkqY3BvcyA9ICpjcG9zICsgb2NmczJfcmVjX2NsdXN0ZXJzKGVsLAorCQkJCQkJCSAgICZlbC0+bF9yZWNzW2ogLSAxXSk7CisJCQkJKmNwb3MgPSAqY3BvcyAtIDE7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKworCQkvKgorCQkgKiBJZiB3ZSBnb3QgaGVyZSwgd2UgbmV2ZXIgZm91bmQgYSB2YWxpZCBub2RlIHdoZXJlCisJCSAqIHRoZSB0cmVlIGluZGljYXRlZCBvbmUgc2hvdWxkIGJlLgorCQkgKi8KKwkJb2NmczJfZXJyb3Ioc2IsCisJCQkgICAgIkludmFsaWQgZXh0ZW50IHRyZWUgYXQgZXh0ZW50IGJsb2NrICVsbHVcbiIsCisJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylibGtubyk7CisJCXJldCA9IC1FUk9GUzsKKwkJZ290byBvdXQ7CisKK25leHRfbm9kZToKKwkJYmxrbm8gPSBwYXRoLT5wX25vZGVbaV0uYmgtPmJfYmxvY2tucjsKKwkJaS0tOworCX0KKworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgb2NmczJfZXh0ZW5kX3JvdGF0ZV90cmFuc2FjdGlvbihoYW5kbGVfdCAqaGFuZGxlLCBpbnQgc3VidHJlZV9kZXB0aCwKKwkJCQkJICAgc3RydWN0IG9jZnMyX3BhdGggKnBhdGgpCit7CisJaW50IGNyZWRpdHMgPSAocGF0aC0+cF90cmVlX2RlcHRoIC0gc3VidHJlZV9kZXB0aCkgKiAyICsgMTsKKworCWlmIChoYW5kbGUtPmhfYnVmZmVyX2NyZWRpdHMgPCBjcmVkaXRzKQorCQlyZXR1cm4gb2NmczJfZXh0ZW5kX3RyYW5zKGhhbmRsZSwgY3JlZGl0cyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRyYXAgdGhlIGNhc2Ugd2hlcmUgd2UncmUgaW5zZXJ0aW5nIGludG8gdGhlIHRoZW9yZXRpY2FsIHJhbmdlIHBhc3QKKyAqIHRoZSBfYWN0dWFsXyBsZWZ0IGxlYWYgcmFuZ2UuIE90aGVyd2lzZSwgd2UnbGwgcm90YXRlIGEgcmVjb3JkCisgKiB3aG9zZSBjcG9zIGlzIGxlc3MgdGhhbiBvdXJzIGludG8gdGhlIHJpZ2h0IGxlYWYuCisgKgorICogSXQncyBvbmx5IG5lY2Vzc2FyeSB0byBsb29rIGF0IHRoZSByaWdodG1vc3QgcmVjb3JkIG9mIHRoZSBsZWZ0CisgKiBsZWFmIGJlY2F1c2UgdGhlIGxvZ2ljIHRoYXQgY2FsbHMgdXMgc2hvdWxkIGVuc3VyZSB0aGF0IHRoZQorICogdGhlb3JldGljYWwgcmFuZ2VzIGluIHRoZSBwYXRoIGNvbXBvbmVudHMgYWJvdmUgdGhlIGxlYXZlcyBhcmUKKyAqIGNvcnJlY3QuCisgKi8KK3N0YXRpYyBpbnQgb2NmczJfcm90YXRlX3JlcXVpcmVzX3BhdGhfYWRqdXN0bWVudChzdHJ1Y3Qgb2NmczJfcGF0aCAqbGVmdF9wYXRoLAorCQkJCQkJIHUzMiBpbnNlcnRfY3BvcykKK3sKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKmxlZnRfZWw7CisJc3RydWN0IG9jZnMyX2V4dGVudF9yZWMgKnJlYzsKKwlpbnQgbmV4dF9mcmVlOworCisJbGVmdF9lbCA9IHBhdGhfbGVhZl9lbChsZWZ0X3BhdGgpOworCW5leHRfZnJlZSA9IGxlMTZfdG9fY3B1KGxlZnRfZWwtPmxfbmV4dF9mcmVlX3JlYyk7CisJcmVjID0gJmxlZnRfZWwtPmxfcmVjc1tuZXh0X2ZyZWUgLSAxXTsKKworCWlmIChpbnNlcnRfY3BvcyA+IGxlMzJfdG9fY3B1KHJlYy0+ZV9jcG9zKSkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSb3RhdGUgYWxsIHRoZSByZWNvcmRzIGluIGEgYnRyZWUgcmlnaHQgb25lIHJlY29yZCwgc3RhcnRpbmcgYXQgaW5zZXJ0X2Nwb3MuCisgKgorICogVGhlIHBhdGggdG8gdGhlIHJpZ2h0bW9zdCBsZWFmIHNob3VsZCBiZSBwYXNzZWQgaW4uCisgKgorICogVGhlIGFycmF5IGlzIGFzc3VtZWQgdG8gYmUgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgYW4gZW50aXJlIHBhdGggKHRyZWUgZGVwdGgpLgorICoKKyAqIFVwb24gc3VjY2VzZnVsIHJldHVybiBmcm9tIHRoaXMgZnVuY3Rpb246CisgKgorICogLSBUaGUgJ3JpZ2h0X3BhdGgnIGFycmF5IHdpbGwgY29udGFpbiBhIHBhdGggdG8gdGhlIGxlYWYgYmxvY2sKKyAqICAgd2hvc2UgcmFuZ2UgY29udGFpbnMgZV9jcG9zLgorICogLSBUaGF0IGxlYWYgYmxvY2sgd2lsbCBoYXZlIGEgc2luZ2xlIGVtcHR5IGV4dGVudCBpbiBsaXN0IGluZGV4IDAuCisgKiAtIEluIHRoZSBjYXNlIHRoYXQgdGhlIHJvdGF0aW9uIHJlcXVpcmVzIGEgcG9zdC1pbnNlcnQgdXBkYXRlLAorICogICAqcmV0X2xlZnRfcGF0aCB3aWxsIGNvbnRhaW4gYSB2YWxpZCBwYXRoIHdoaWNoIGNhbiBiZSBwYXNzZWQgdG8KKyAqICAgb2NmczJfaW5zZXJ0X3BhdGgoKS4KKyAqLworc3RhdGljIGludCBvY2ZzMl9yb3RhdGVfdHJlZV9yaWdodChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSAgIGhhbmRsZV90ICpoYW5kbGUsCisJCQkJICAgdTMyIGluc2VydF9jcG9zLAorCQkJCSAgIHN0cnVjdCBvY2ZzMl9wYXRoICpyaWdodF9wYXRoLAorCQkJCSAgIHN0cnVjdCBvY2ZzMl9wYXRoICoqcmV0X2xlZnRfcGF0aCkKK3sKKwlpbnQgcmV0LCBzdGFydDsKKwl1MzIgY3BvczsKKwlzdHJ1Y3Qgb2NmczJfcGF0aCAqbGVmdF9wYXRoID0gTlVMTDsKKworCSpyZXRfbGVmdF9wYXRoID0gTlVMTDsKKworCWxlZnRfcGF0aCA9IG9jZnMyX25ld19wYXRoKHBhdGhfcm9vdF9iaChyaWdodF9wYXRoKSwKKwkJCQkgICBwYXRoX3Jvb3RfZWwocmlnaHRfcGF0aCkpOworCWlmICghbGVmdF9wYXRoKSB7CisJCXJldCA9IC1FTk9NRU07CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gb2NmczJfZmluZF9jcG9zX2Zvcl9sZWZ0X2xlYWYoaW5vZGUtPmlfc2IsIHJpZ2h0X3BhdGgsICZjcG9zKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJbWxvZygwLCAiSW5zZXJ0OiAldSwgZmlyc3QgbGVmdCBwYXRoIGNwb3M6ICV1XG4iLCBpbnNlcnRfY3BvcywgY3Bvcyk7CisKKwkvKgorCSAqIFdoYXQgd2Ugd2FudCB0byBkbyBoZXJlIGlzOgorCSAqCisJICogMSkgU3RhcnQgd2l0aCB0aGUgcmlnaHRtb3N0IHBhdGguCisJICoKKwkgKiAyKSBEZXRlcm1pbmUgYSBwYXRoIHRvIHRoZSBsZWFmIGJsb2NrIGRpcmVjdGx5IHRvIHRoZSBsZWZ0CisJICogICAgb2YgdGhhdCBsZWFmLgorCSAqCisJICogMykgRGV0ZXJtaW5lIHRoZSAnc3VidHJlZSByb290JyAtIHRoZSBsb3dlc3QgbGV2ZWwgdHJlZSBub2RlCisJICogICAgd2hpY2ggY29udGFpbnMgYSBwYXRoIHRvIGJvdGggbGVhdmVzLgorCSAqCisJICogNCkgUm90YXRlIHRoZSBzdWJ0cmVlLgorCSAqCisJICogNSkgRmluZCB0aGUgbmV4dCBzdWJ0cmVlIGJ5IGNvbnNpZGVyaW5nIHRoZSBsZWZ0IHBhdGggdG8gYmUKKwkgKiAgICB0aGUgbmV3IHJpZ2h0IHBhdGguCisJICoKKwkgKiBUaGUgY2hlY2sgYXQgdGhlIHRvcCBvZiB0aGlzIHdoaWxlIGxvb3AgYWxzbyBhY2NlcHRzCisJICogaW5zZXJ0X2Nwb3MgPT0gY3BvcyBiZWNhdXNlIGNwb3MgaXMgb25seSBhIF90aGVvcmV0aWNhbF8KKwkgKiB2YWx1ZSB0byBnZXQgdXMgdGhlIGxlZnQgcGF0aCAtIGluc2VydF9jcG9zIG1pZ2h0IHZlcnkgd2VsbAorCSAqIGJlIGZpbGxpbmcgdGhhdCBob2xlLgorCSAqCisJICogU3RvcCBhdCBhIGNwb3Mgb2YgJzAnIGJlY2F1c2Ugd2UgZWl0aGVyIHN0YXJ0ZWQgYXQgdGhlCisJICogbGVmdG1vc3QgYnJhbmNoIChpLmUuLCBhIHRyZWUgd2l0aCBvbmUgYnJhbmNoIGFuZCBhCisJICogcm90YXRpb24gaW5zaWRlIG9mIGl0KSwgb3Igd2UndmUgZ29uZSBhcyBmYXIgYXMgd2UgY2FuIGluCisJICogcm90YXRpbmcgc3VidHJlZXMuCisJICovCisJd2hpbGUgKGNwb3MgJiYgaW5zZXJ0X2Nwb3MgPD0gY3BvcykgeworCQltbG9nKDAsICJSb3RhdGluZyBhIHRyZWU6IGlucy4gY3BvczogJXUsIGxlZnQgcGF0aCBjcG9zOiAldVxuIiwKKwkJICAgICBpbnNlcnRfY3BvcywgY3Bvcyk7CisKKwkJcmV0ID0gb2NmczJfZmluZF9wYXRoKGlub2RlLCBsZWZ0X3BhdGgsIGNwb3MpOworCQlpZiAocmV0KSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCW1sb2dfYnVnX29uX21zZyhwYXRoX2xlYWZfYmgobGVmdF9wYXRoKSA9PQorCQkJCXBhdGhfbGVhZl9iaChyaWdodF9wYXRoKSwKKwkJCQkiSW5vZGUgJWx1OiBlcnJvciBkdXJpbmcgaW5zZXJ0IG9mICV1ICIKKwkJCQkiKGxlZnQgcGF0aCBjcG9zICV1KSByZXN1bHRzIGluIHR3byBpZGVudGljYWwgIgorCQkJCSJwYXRocyBlbmRpbmcgYXQgJWxsdVxuIiwKKwkJCQlpbm9kZS0+aV9pbm8sIGluc2VydF9jcG9zLCBjcG9zLAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpCisJCQkJcGF0aF9sZWFmX2JoKGxlZnRfcGF0aCktPmJfYmxvY2tucik7CisKKwkJaWYgKG9jZnMyX3JvdGF0ZV9yZXF1aXJlc19wYXRoX2FkanVzdG1lbnQobGVmdF9wYXRoLAorCQkJCQkJCSAgaW5zZXJ0X2Nwb3MpKSB7CisJCQltbG9nKDAsICJQYXRoIGFkanVzdG1lbnQgcmVxdWlyZWRcbiIpOworCisJCQkvKgorCQkJICogV2UndmUgcm90YXRlZCB0aGUgdHJlZSBhcyBtdWNoIGFzIHdlCisJCQkgKiBzaG91bGQuIFRoZSByZXN0IGlzIHVwIHRvCisJCQkgKiBvY2ZzMl9pbnNlcnRfcGF0aCgpIHRvIGNvbXBsZXRlLCBhZnRlciB0aGUKKwkJCSAqIHJlY29yZCBpbnNlcnRpb24uIFdlIGluZGljYXRlIHRoaXMKKwkJCSAqIHNpdHVhdGlvbiBieSByZXR1cm5pbmcgdGhlIGxlZnQgcGF0aC4KKwkJCSAqCisJCQkgKiBUaGUgcmVhc29uIHdlIGRvbid0IGFkanVzdCB0aGUgcmVjb3JkcyBoZXJlCisJCQkgKiBiZWZvcmUgdGhlIHJlY29yZCBpbnNlcnQgaXMgdGhhdCBhbiBlcnJvcgorCQkJICogbGF0ZXIgbWlnaHQgYnJlYWsgdGhlIHJ1bGUgd2hlcmUgYSBwYXJlbnQKKwkJCSAqIHJlY29yZCBlX2Nwb3Mgd2lsbCByZWZsZWN0IHRoZSBhY3R1YWwKKwkJCSAqIGVfY3BvcyBvZiB0aGUgMXN0IG5vbmVtcHR5IHJlY29yZCBvZiB0aGUKKwkJCSAqIGNoaWxkIGxpc3QuCisJCQkgKi8KKwkJCSpyZXRfbGVmdF9wYXRoID0gbGVmdF9wYXRoOworCQkJZ290byBvdXRfcmV0X3BhdGg7CisJCX0KKworCQlzdGFydCA9IG9jZnMyX2ZpbmRfc3VidHJlZV9yb290KGlub2RlLCBsZWZ0X3BhdGgsIHJpZ2h0X3BhdGgpOworCisJCW1sb2coMCwgIlN1YnRyZWUgcm9vdCBhdCBpbmRleCAlZCAoYmxrICVsbHUsIGRlcHRoICVkKVxuIiwKKwkJICAgICBzdGFydCwKKwkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKSByaWdodF9wYXRoLT5wX25vZGVbc3RhcnRdLmJoLT5iX2Jsb2NrbnIsCisJCSAgICAgcmlnaHRfcGF0aC0+cF90cmVlX2RlcHRoKTsKKworCQlyZXQgPSBvY2ZzMl9leHRlbmRfcm90YXRlX3RyYW5zYWN0aW9uKGhhbmRsZSwgc3RhcnQsCisJCQkJCQkgICAgICByaWdodF9wYXRoKTsKKwkJaWYgKHJldCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlyZXQgPSBvY2ZzMl9yb3RhdGVfc3VidHJlZV9yaWdodChpbm9kZSwgaGFuZGxlLCBsZWZ0X3BhdGgsCisJCQkJCQkgcmlnaHRfcGF0aCwgc3RhcnQpOworCQlpZiAocmV0KSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCS8qCisJCSAqIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmUtcmVhZCB0aGUgbmV4dCByaWdodCBwYXRoCisJCSAqIGFzIHdlIGtub3cgdGhhdCBpdCdsbCBiZSBvdXIgY3VycmVudCBsZWZ0CisJCSAqIHBhdGguIE9wdGltaXplIGJ5IGNvcHlpbmcgdmFsdWVzIGluc3RlYWQuCisJCSAqLworCQlvY2ZzMl9tdl9wYXRoKHJpZ2h0X3BhdGgsIGxlZnRfcGF0aCk7CisKKwkJcmV0ID0gb2NmczJfZmluZF9jcG9zX2Zvcl9sZWZ0X2xlYWYoaW5vZGUtPmlfc2IsIHJpZ2h0X3BhdGgsCisJCQkJCQkgICAgJmNwb3MpOworCQlpZiAocmV0KSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworb3V0OgorCW9jZnMyX2ZyZWVfcGF0aChsZWZ0X3BhdGgpOworCitvdXRfcmV0X3BhdGg6CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIERvIHRoZSBmaW5hbCBiaXRzIG9mIGV4dGVudCByZWNvcmQgaW5zZXJ0aW9uIGF0IHRoZSB0YXJnZXQgbGVhZgorICogbGlzdC4gSWYgdGhpcyBsZWFmIGlzIHBhcnQgb2YgYW4gYWxsb2NhdGlvbiB0cmVlLCBpdCBpcyBhc3N1bWVkCisgKiB0aGF0IHRoZSB0cmVlIGFib3ZlIGhhcyBiZWVuIHByZXBhcmVkLgorICovCitzdGF0aWMgdm9pZCBvY2ZzMl9pbnNlcnRfYXRfbGVhZihzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyAqaW5zZXJ0X3JlYywKKwkJCQkgc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICplbCwKKwkJCQkgc3RydWN0IG9jZnMyX2luc2VydF90eXBlICppbnNlcnQsCisJCQkJIHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJaW50IGkgPSBpbnNlcnQtPmluc19jb250aWdfaW5kZXg7CisJdW5zaWduZWQgaW50IHJhbmdlOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjICpyZWM7CisKKwlCVUdfT04obGUxNl90b19jcHUoZWwtPmxfdHJlZV9kZXB0aCkgIT0gMCk7CisKKwkvKgorCSAqIENvbnRpZ3VvdXMgaW5zZXJ0IC0gZWl0aGVyIGxlZnQgb3IgcmlnaHQuCisJICovCisJaWYgKGluc2VydC0+aW5zX2NvbnRpZyAhPSBDT05USUdfTk9ORSkgeworCQlyZWMgPSAmZWwtPmxfcmVjc1tpXTsKKwkJaWYgKGluc2VydC0+aW5zX2NvbnRpZyA9PSBDT05USUdfTEVGVCkgeworCQkJcmVjLT5lX2Jsa25vID0gaW5zZXJ0X3JlYy0+ZV9ibGtubzsKKwkJCXJlYy0+ZV9jcG9zID0gaW5zZXJ0X3JlYy0+ZV9jcG9zOworCQl9CisJCWxlMTZfYWRkX2NwdSgmcmVjLT5lX2xlYWZfY2x1c3RlcnMsCisJCQkgICAgIGxlMTZfdG9fY3B1KGluc2VydF9yZWMtPmVfbGVhZl9jbHVzdGVycykpOworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBIYW5kbGUgaW5zZXJ0IGludG8gYW4gZW1wdHkgbGVhZi4KKwkgKi8KKwlpZiAobGUxNl90b19jcHUoZWwtPmxfbmV4dF9mcmVlX3JlYykgPT0gMCB8fAorCSAgICAoKGxlMTZfdG9fY3B1KGVsLT5sX25leHRfZnJlZV9yZWMpID09IDEpICYmCisJICAgICBvY2ZzMl9pc19lbXB0eV9leHRlbnQoJmVsLT5sX3JlY3NbMF0pKSkgeworCQllbC0+bF9yZWNzWzBdID0gKmluc2VydF9yZWM7CisJCWVsLT5sX25leHRfZnJlZV9yZWMgPSBjcHVfdG9fbGUxNigxKTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogQXBwZW5kaW5nIGluc2VydC4KKwkgKi8KKwlpZiAoaW5zZXJ0LT5pbnNfYXBwZW5kaW5nID09IEFQUEVORF9UQUlMKSB7CisJCWkgPSBsZTE2X3RvX2NwdShlbC0+bF9uZXh0X2ZyZWVfcmVjKSAtIDE7CisJCXJlYyA9ICZlbC0+bF9yZWNzW2ldOworCQlyYW5nZSA9IGxlMzJfdG9fY3B1KHJlYy0+ZV9jcG9zKQorCQkJKyBsZTE2X3RvX2NwdShyZWMtPmVfbGVhZl9jbHVzdGVycyk7CisJCUJVR19PTihsZTMyX3RvX2NwdShpbnNlcnRfcmVjLT5lX2Nwb3MpIDwgcmFuZ2UpOworCisJCW1sb2dfYnVnX29uX21zZyhsZTE2X3RvX2NwdShlbC0+bF9uZXh0X2ZyZWVfcmVjKSA+PQorCQkJCWxlMTZfdG9fY3B1KGVsLT5sX2NvdW50KSwKKwkJCQkiaW5vZGUgJWx1LCBkZXB0aCAldSwgY291bnQgJXUsIG5leHQgZnJlZSAldSwgIgorCQkJCSJyZWMuY3BvcyAldSwgcmVjLmNsdXN0ZXJzICV1LCAiCisJCQkJImluc2VydC5jcG9zICV1LCBpbnNlcnQuY2x1c3RlcnMgJXVcbiIsCisJCQkJaW5vZGUtPmlfaW5vLAorCQkJCWxlMTZfdG9fY3B1KGVsLT5sX3RyZWVfZGVwdGgpLAorCQkJCWxlMTZfdG9fY3B1KGVsLT5sX2NvdW50KSwKKwkJCQlsZTE2X3RvX2NwdShlbC0+bF9uZXh0X2ZyZWVfcmVjKSwKKwkJCQlsZTMyX3RvX2NwdShlbC0+bF9yZWNzW2ldLmVfY3BvcyksCisJCQkJbGUxNl90b19jcHUoZWwtPmxfcmVjc1tpXS5lX2xlYWZfY2x1c3RlcnMpLAorCQkJCWxlMzJfdG9fY3B1KGluc2VydF9yZWMtPmVfY3BvcyksCisJCQkJbGUxNl90b19jcHUoaW5zZXJ0X3JlYy0+ZV9sZWFmX2NsdXN0ZXJzKSk7CisJCWkrKzsKKwkJZWwtPmxfcmVjc1tpXSA9ICppbnNlcnRfcmVjOworCQlsZTE2X2FkZF9jcHUoJmVsLT5sX25leHRfZnJlZV9yZWMsIDEpOworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBPaywgd2UgaGF2ZSB0byByb3RhdGUuCisJICoKKwkgKiBBdCB0aGlzIHBvaW50LCBpdCBpcyBzYWZlIHRvIGFzc3VtZSB0aGF0IGluc2VydGluZyBpbnRvIGFuCisJICogZW1wdHkgbGVhZiBhbmQgYXBwZW5kaW5nIHRvIGEgbGVhZiBoYXZlIGJvdGggYmVlbiBoYW5kbGVkCisJICogYWJvdmUuCisJICoKKwkgKiBUaGlzIGxlYWYgbmVlZHMgdG8gaGF2ZSBzcGFjZSwgZWl0aGVyIGJ5IHRoZSBlbXB0eSAxc3QKKwkgKiBleHRlbnQgcmVjb3JkLCBvciBieSB2aXJ0dWUgb2YgYW4gbF9uZXh0X3JlYyA8IGxfY291bnQuCisJICovCisJb2NmczJfcm90YXRlX2xlYWYoZWwsIGluc2VydF9yZWMpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgb2NmczJfdXBkYXRlX2Rpbm9kZV9jbHVzdGVycyhzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQkJc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGksCisJCQkJCQl1MzIgY2x1c3RlcnMpCit7CisJbGUzMl9hZGRfY3B1KCZkaS0+aV9jbHVzdGVycywgY2x1c3RlcnMpOworCXNwaW5fbG9jaygmT0NGUzJfSShpbm9kZSktPmlwX2xvY2spOworCU9DRlMyX0koaW5vZGUpLT5pcF9jbHVzdGVycyA9IGxlMzJfdG9fY3B1KGRpLT5pX2NsdXN0ZXJzKTsKKwlzcGluX3VubG9jaygmT0NGUzJfSShpbm9kZSktPmlwX2xvY2spOworfQorCitzdGF0aWMgaW50IG9jZnMyX2FwcGVuZF9yZWNfdG9fcGF0aChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBoYW5kbGVfdCAqaGFuZGxlLAorCQkJCSAgICBzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyAqaW5zZXJ0X3JlYywKKwkJCQkgICAgc3RydWN0IG9jZnMyX3BhdGggKnJpZ2h0X3BhdGgsCisJCQkJICAgIHN0cnVjdCBvY2ZzMl9wYXRoICoqcmV0X2xlZnRfcGF0aCkKK3sKKwlpbnQgcmV0LCBpLCBuZXh0X2ZyZWU7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKmVsOworCXN0cnVjdCBvY2ZzMl9wYXRoICpsZWZ0X3BhdGggPSBOVUxMOworCisJKnJldF9sZWZ0X3BhdGggPSBOVUxMOworCisJLyoKKwkgKiBUaGlzIHNob3VsZG4ndCBoYXBwZW4gZm9yIG5vbi10cmVlcy4gVGhlIGV4dGVudCByZWMgY2x1c3RlcgorCSAqIGNvdW50IG1hbmlwdWxhdGlvbiBiZWxvdyBvbmx5IHdvcmtzIGZvciBpbnRlcmlvciBub2Rlcy4KKwkgKi8KKwlCVUdfT04ocmlnaHRfcGF0aC0+cF90cmVlX2RlcHRoID09IDApOworCisJLyoKKwkgKiBJZiBvdXIgYXBwZW5kaW5nIGluc2VydCBpcyBhdCB0aGUgbGVmdG1vc3QgZWRnZSBvZiBhIGxlYWYsCisJICogdGhlbiB3ZSBtaWdodCBuZWVkIHRvIHVwZGF0ZSB0aGUgcmlnaHRtb3N0IHJlY29yZHMgb2YgdGhlCisJICogbmVpZ2hib3JpbmcgcGF0aC4KKwkgKi8KKwllbCA9IHBhdGhfbGVhZl9lbChyaWdodF9wYXRoKTsKKwluZXh0X2ZyZWUgPSBsZTE2X3RvX2NwdShlbC0+bF9uZXh0X2ZyZWVfcmVjKTsKKwlpZiAobmV4dF9mcmVlID09IDAgfHwKKwkgICAgKG5leHRfZnJlZSA9PSAxICYmIG9jZnMyX2lzX2VtcHR5X2V4dGVudCgmZWwtPmxfcmVjc1swXSkpKSB7CisJCXUzMiBsZWZ0X2Nwb3M7CisKKwkJcmV0ID0gb2NmczJfZmluZF9jcG9zX2Zvcl9sZWZ0X2xlYWYoaW5vZGUtPmlfc2IsIHJpZ2h0X3BhdGgsCisJCQkJCQkgICAgJmxlZnRfY3Bvcyk7CisJCWlmIChyZXQpIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJbWxvZygwLCAiQXBwZW5kIG1heSBuZWVkIGEgbGVmdCBwYXRoIHVwZGF0ZS4gY3BvczogJXUsICIKKwkJICAgICAibGVmdF9jcG9zOiAldVxuIiwgbGUzMl90b19jcHUoaW5zZXJ0X3JlYy0+ZV9jcG9zKSwKKwkJICAgICBsZWZ0X2Nwb3MpOworCisJCS8qCisJCSAqIE5vIG5lZWQgdG8gd29ycnkgaWYgdGhlIGFwcGVuZCBpcyBhbHJlYWR5IGluIHRoZQorCQkgKiBsZWZ0bW9zdCBsZWFmLgorCQkgKi8KKwkJaWYgKGxlZnRfY3BvcykgeworCQkJbGVmdF9wYXRoID0gb2NmczJfbmV3X3BhdGgocGF0aF9yb290X2JoKHJpZ2h0X3BhdGgpLAorCQkJCQkJICAgcGF0aF9yb290X2VsKHJpZ2h0X3BhdGgpKTsKKwkJCWlmICghbGVmdF9wYXRoKSB7CisJCQkJcmV0ID0gLUVOT01FTTsKKwkJCQltbG9nX2Vycm5vKHJldCk7CisJCQkJZ290byBvdXQ7CisJCQl9CisKKwkJCXJldCA9IG9jZnMyX2ZpbmRfcGF0aChpbm9kZSwgbGVmdF9wYXRoLCBsZWZ0X2Nwb3MpOworCQkJaWYgKHJldCkgeworCQkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKworCQkJLyoKKwkJCSAqIG9jZnMyX2luc2VydF9wYXRoKCkgd2lsbCBwYXNzIHRoZSBsZWZ0X3BhdGggdG8gdGhlCisJCQkgKiBqb3VybmFsIGZvciB1cy4KKwkJCSAqLworCQl9CisJfQorCisJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3NfcGF0aChpbm9kZSwgaGFuZGxlLCByaWdodF9wYXRoKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJZWwgPSBwYXRoX3Jvb3RfZWwocmlnaHRfcGF0aCk7CisJYmggPSBwYXRoX3Jvb3RfYmgocmlnaHRfcGF0aCk7CisJaSA9IDA7CisJd2hpbGUgKDEpIHsKKwkJc3RydWN0IG9jZnMyX2V4dGVudF9yZWMgKnJlYzsKKworCQluZXh0X2ZyZWUgPSBsZTE2X3RvX2NwdShlbC0+bF9uZXh0X2ZyZWVfcmVjKTsKKwkJaWYgKG5leHRfZnJlZSA9PSAwKSB7CisJCQlvY2ZzMl9lcnJvcihpbm9kZS0+aV9zYiwKKwkJCQkgICAgIkRpbm9kZSAlbGx1IGhhcyBhIGJhZCBleHRlbnQgbGlzdCIsCisJCQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vKTsKKwkJCXJldCA9IC1FSU87CisJCQlnb3RvIG91dDsKKwkJfQorCisJCXJlYyA9ICZlbC0+bF9yZWNzW25leHRfZnJlZSAtIDFdOworCisJCXJlYy0+ZV9pbnRfY2x1c3RlcnMgPSBpbnNlcnRfcmVjLT5lX2Nwb3M7CisJCWxlMzJfYWRkX2NwdSgmcmVjLT5lX2ludF9jbHVzdGVycywKKwkJCSAgICAgbGUxNl90b19jcHUoaW5zZXJ0X3JlYy0+ZV9sZWFmX2NsdXN0ZXJzKSk7CisJCWxlMzJfYWRkX2NwdSgmcmVjLT5lX2ludF9jbHVzdGVycywKKwkJCSAgICAgLWxlMzJfdG9fY3B1KHJlYy0+ZV9jcG9zKSk7CisKKwkJcmV0ID0gb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIGJoKTsKKwkJaWYgKHJldCkKKwkJCW1sb2dfZXJybm8ocmV0KTsKKworCQkvKiBEb24ndCB0b3VjaCB0aGUgbGVhZiBub2RlICovCisJCWlmICgrK2kgPj0gcmlnaHRfcGF0aC0+cF90cmVlX2RlcHRoKQorCQkJYnJlYWs7CisKKwkJYmggPSByaWdodF9wYXRoLT5wX25vZGVbaV0uYmg7CisJCWVsID0gcmlnaHRfcGF0aC0+cF9ub2RlW2ldLmVsOworCX0KKworCSpyZXRfbGVmdF9wYXRoID0gbGVmdF9wYXRoOworCXJldCA9IDA7CitvdXQ6CisJaWYgKHJldCAhPSAwKQorCQlvY2ZzMl9mcmVlX3BhdGgobGVmdF9wYXRoKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIG9ubHkgZG9lcyBpbnNlcnRzIG9uIGFuIGFsbG9jYXRpb24gYi10cmVlLiBGb3IgZGlub2RlCisgKiBsaXN0cywgb2NmczJfaW5zZXJ0X2F0X2xlYWYoKSBpcyBjYWxsZWQgZGlyZWN0bHkuCisgKgorICogcmlnaHRfcGF0aCBpcyB0aGUgcGF0aCB3ZSB3YW50IHRvIGRvIHRoZSBhY3R1YWwgaW5zZXJ0CisgKiBpbi4gbGVmdF9wYXRoIHNob3VsZCBvbmx5IGJlIHBhc3NlZCBpbiBpZiB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGF0CisgKiBwb3J0aW9uIG9mIHRoZSB0cmVlIGFmdGVyIGFuIGVkZ2UgaW5zZXJ0LgorICovCitzdGF0aWMgaW50IG9jZnMyX2luc2VydF9wYXRoKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgICAgIGhhbmRsZV90ICpoYW5kbGUsCisJCQkgICAgIHN0cnVjdCBvY2ZzMl9wYXRoICpsZWZ0X3BhdGgsCisJCQkgICAgIHN0cnVjdCBvY2ZzMl9wYXRoICpyaWdodF9wYXRoLAorCQkJICAgICBzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyAqaW5zZXJ0X3JlYywKKwkJCSAgICAgc3RydWN0IG9jZnMyX2luc2VydF90eXBlICppbnNlcnQpCit7CisJaW50IHJldCwgc3VidHJlZV9pbmRleDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmxlYWZfYmggPSBwYXRoX2xlYWZfYmgocmlnaHRfcGF0aCk7CisJc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICplbDsKKworCS8qCisJICogUGFzcyBib3RoIHBhdGhzIHRvIHRoZSBqb3VybmFsLiBUaGUgbWFqb3JpdHkgb2YgaW5zZXJ0cworCSAqIHdpbGwgYmUgdG91Y2hpbmcgYWxsIGNvbXBvbmVudHMgYW55d2F5LgorCSAqLworCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzX3BhdGgoaW5vZGUsIGhhbmRsZSwgcmlnaHRfcGF0aCk7CisJaWYgKHJldCA8IDApIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAobGVmdF9wYXRoKSB7CisJCWludCBjcmVkaXRzID0gaGFuZGxlLT5oX2J1ZmZlcl9jcmVkaXRzOworCisJCS8qCisJCSAqIFRoZXJlJ3MgYSBjaGFuY2UgdGhhdCBsZWZ0X3BhdGggZ290IHBhc3NlZCBiYWNrIHRvCisJCSAqIHVzIHdpdGhvdXQgYmVpbmcgYWNjb3VudGVkIGZvciBpbiB0aGUKKwkJICogam91cm5hbC4gRXh0ZW5kIG91ciB0cmFuc2FjdGlvbiBoZXJlIHRvIGJlIHN1cmUgd2UKKwkJICogY2FuIGNoYW5nZSB0aG9zZSBibG9ja3MuCisJCSAqLworCQljcmVkaXRzICs9IGxlZnRfcGF0aC0+cF90cmVlX2RlcHRoOworCisJCXJldCA9IG9jZnMyX2V4dGVuZF90cmFucyhoYW5kbGUsIGNyZWRpdHMpOworCQlpZiAocmV0IDwgMCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2Vzc19wYXRoKGlub2RlLCBoYW5kbGUsIGxlZnRfcGF0aCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCWVsID0gcGF0aF9sZWFmX2VsKHJpZ2h0X3BhdGgpOworCisJb2NmczJfaW5zZXJ0X2F0X2xlYWYoaW5zZXJ0X3JlYywgZWwsIGluc2VydCwgaW5vZGUpOworCXJldCA9IG9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCBsZWFmX2JoKTsKKwlpZiAocmV0KQorCQltbG9nX2Vycm5vKHJldCk7CisKKwlpZiAobGVmdF9wYXRoKSB7CisJCS8qCisJCSAqIFRoZSByb3RhdGUgY29kZSBoYXMgaW5kaWNhdGVkIHRoYXQgd2UgbmVlZCB0byBmaXgKKwkJICogdXAgcG9ydGlvbnMgb2YgdGhlIHRyZWUgYWZ0ZXIgdGhlIGluc2VydC4KKwkJICoKKwkJICogWFhYOiBTaG91bGQgd2UgZXh0ZW5kIHRoZSB0cmFuc2FjdGlvbiBoZXJlPworCQkgKi8KKwkJc3VidHJlZV9pbmRleCA9IG9jZnMyX2ZpbmRfc3VidHJlZV9yb290KGlub2RlLCBsZWZ0X3BhdGgsCisJCQkJCQkJcmlnaHRfcGF0aCk7CisJCW9jZnMyX2NvbXBsZXRlX2VkZ2VfaW5zZXJ0KGlub2RlLCBoYW5kbGUsIGxlZnRfcGF0aCwKKwkJCQkJICAgcmlnaHRfcGF0aCwgc3VidHJlZV9pbmRleCk7CisJfQorCisJcmV0ID0gMDsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG9jZnMyX2RvX2luc2VydF9leHRlbnQoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgIGhhbmRsZV90ICpoYW5kbGUsCisJCQkJICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpX2JoLAorCQkJCSAgc3RydWN0IG9jZnMyX2V4dGVudF9yZWMgKmluc2VydF9yZWMsCisJCQkJICBzdHJ1Y3Qgb2NmczJfaW5zZXJ0X3R5cGUgKnR5cGUpCit7CisJaW50IHJldCwgcm90YXRlID0gMDsKKwl1MzIgY3BvczsKKwlzdHJ1Y3Qgb2NmczJfcGF0aCAqcmlnaHRfcGF0aCA9IE5VTEw7CisJc3RydWN0IG9jZnMyX3BhdGggKmxlZnRfcGF0aCA9IE5VTEw7CisJc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGk7CisJc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICplbDsKKworCWRpID0gKHN0cnVjdCBvY2ZzMl9kaW5vZGUgKikgZGlfYmgtPmJfZGF0YTsKKwllbCA9ICZkaS0+aWQyLmlfbGlzdDsKKworCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIGRpX2JoLAorCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGxlMTZfdG9fY3B1KGVsLT5sX3RyZWVfZGVwdGgpID09IDApIHsKKwkJb2NmczJfaW5zZXJ0X2F0X2xlYWYoaW5zZXJ0X3JlYywgZWwsIHR5cGUsIGlub2RlKTsKKwkJZ290byBvdXRfdXBkYXRlX2NsdXN0ZXJzOworCX0KKworCXJpZ2h0X3BhdGggPSBvY2ZzMl9uZXdfaW5vZGVfcGF0aChkaV9iaCk7CisJaWYgKCFyaWdodF9wYXRoKSB7CisJCXJldCA9IC1FTk9NRU07CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBEZXRlcm1pbmUgdGhlIHBhdGggdG8gc3RhcnQgd2l0aC4gUm90YXRpb25zIG5lZWQgdGhlCisJICogcmlnaHRtb3N0IHBhdGgsIGV2ZXJ5dGhpbmcgZWxzZSBjYW4gZ28gZGlyZWN0bHkgdG8gdGhlCisJICogdGFyZ2V0IGxlYWYuCisJICovCisJY3BvcyA9IGxlMzJfdG9fY3B1KGluc2VydF9yZWMtPmVfY3Bvcyk7CisJaWYgKHR5cGUtPmluc19hcHBlbmRpbmcgPT0gQVBQRU5EX05PTkUgJiYKKwkgICAgdHlwZS0+aW5zX2NvbnRpZyA9PSBDT05USUdfTk9ORSkgeworCQlyb3RhdGUgPSAxOworCQljcG9zID0gVUlOVF9NQVg7CisJfQorCisJcmV0ID0gb2NmczJfZmluZF9wYXRoKGlub2RlLCByaWdodF9wYXRoLCBjcG9zKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBSb3RhdGlvbnMgYW5kIGFwcGVuZHMgbmVlZCBzcGVjaWFsIHRyZWF0bWVudCAtIHRoZXkgbW9kaWZ5CisJICogcGFydHMgb2YgdGhlIHRyZWUncyBhYm92ZSB0aGVtLgorCSAqCisJICogQm90aCBtaWdodCBwYXNzIGJhY2sgYSBwYXRoIGltbWVkaWF0ZSB0byB0aGUgbGVmdCBvZiB0aGUKKwkgKiBvbmUgYmVpbmcgaW5zZXJ0ZWQgdG8uIFRoaXMgd2lsbCBiZSBjYXVzZQorCSAqIG9jZnMyX2luc2VydF9wYXRoKCkgdG8gbW9kaWZ5IHRoZSByaWdodG1vc3QgcmVjb3JkcyBvZgorCSAqIGxlZnRfcGF0aCB0byBhY2NvdW50IGZvciBhbiBlZGdlIGluc2VydC4KKwkgKgorCSAqIFhYWDogV2hlbiBtb2RpZnlpbmcgdGhpcyBjb2RlLCBrZWVwIGluIG1pbmQgdGhhdCBhbiBpbnNlcnQKKwkgKiBjYW4gd2luZCB1cCBza2lwcGluZyBib3RoIG9mIHRoZXNlIHR3byBzcGVjaWFsIGNhc2VzLi4uCisJICovCisJaWYgKHJvdGF0ZSkgeworCQlyZXQgPSBvY2ZzMl9yb3RhdGVfdHJlZV9yaWdodChpbm9kZSwgaGFuZGxlLAorCQkJCQkgICAgICBsZTMyX3RvX2NwdShpbnNlcnRfcmVjLT5lX2Nwb3MpLAorCQkJCQkgICAgICByaWdodF9wYXRoLCAmbGVmdF9wYXRoKTsKKwkJaWYgKHJldCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXQ7CisJCX0KKwl9IGVsc2UgaWYgKHR5cGUtPmluc19hcHBlbmRpbmcgPT0gQVBQRU5EX1RBSUwKKwkJICAgJiYgdHlwZS0+aW5zX2NvbnRpZyAhPSBDT05USUdfTEVGVCkgeworCQlyZXQgPSBvY2ZzMl9hcHBlbmRfcmVjX3RvX3BhdGgoaW5vZGUsIGhhbmRsZSwgaW5zZXJ0X3JlYywKKwkJCQkJICAgICAgIHJpZ2h0X3BhdGgsICZsZWZ0X3BhdGgpOworCQlpZiAocmV0KSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCXJldCA9IG9jZnMyX2luc2VydF9wYXRoKGlub2RlLCBoYW5kbGUsIGxlZnRfcGF0aCwgcmlnaHRfcGF0aCwKKwkJCQlpbnNlcnRfcmVjLCB0eXBlKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCitvdXRfdXBkYXRlX2NsdXN0ZXJzOgorCW9jZnMyX3VwZGF0ZV9kaW5vZGVfY2x1c3RlcnMoaW5vZGUsIGRpLAorCQkJCSAgICAgbGUxNl90b19jcHUoaW5zZXJ0X3JlYy0+ZV9sZWFmX2NsdXN0ZXJzKSk7CisKKwlyZXQgPSBvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgZGlfYmgpOworCWlmIChyZXQpCisJCW1sb2dfZXJybm8ocmV0KTsKKworb3V0OgorCW9jZnMyX2ZyZWVfcGF0aChsZWZ0X3BhdGgpOworCW9jZnMyX2ZyZWVfcGF0aChyaWdodF9wYXRoKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIG9jZnMyX2ZpZ3VyZV9jb250aWdfdHlwZShzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSAgICAgc3RydWN0IG9jZnMyX2luc2VydF90eXBlICppbnNlcnQsCisJCQkJICAgICBzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKmVsLAorCQkJCSAgICAgc3RydWN0IG9jZnMyX2V4dGVudF9yZWMgKmluc2VydF9yZWMpCit7CisJaW50IGk7CisJZW51bSBvY2ZzMl9jb250aWdfdHlwZSBjb250aWdfdHlwZSA9IENPTlRJR19OT05FOworCisJQlVHX09OKGxlMTZfdG9fY3B1KGVsLT5sX3RyZWVfZGVwdGgpICE9IDApOworCisJZm9yKGkgPSAwOyBpIDwgbGUxNl90b19jcHUoZWwtPmxfbmV4dF9mcmVlX3JlYyk7IGkrKykgeworCQljb250aWdfdHlwZSA9IG9jZnMyX2V4dGVudF9jb250aWcoaW5vZGUsICZlbC0+bF9yZWNzW2ldLAorCQkJCQkJICBpbnNlcnRfcmVjKTsKKwkJaWYgKGNvbnRpZ190eXBlICE9IENPTlRJR19OT05FKSB7CisJCQlpbnNlcnQtPmluc19jb250aWdfaW5kZXggPSBpOworCQkJYnJlYWs7CisJCX0KKwl9CisJaW5zZXJ0LT5pbnNfY29udGlnID0gY29udGlnX3R5cGU7Cit9CisKKy8qCisgKiBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBhZ2FpbnN0IHRoZSByaWdobW9zdCBsZWFmIGV4dGVudCBsaXN0LgorICoKKyAqIG9jZnMyX2ZpZ3VyZV9hcHBlbmRpbmdfdHlwZSgpIHdpbGwgZmlndXJlIG91dCB3aGV0aGVyIHdlJ2xsIGhhdmUgdG8KKyAqIGluc2VydCBhdCB0aGUgdGFpbCBvZiB0aGUgcmlnaHRtb3N0IGxlYWYuCisgKgorICogVGhpcyBzaG91bGQgYWxzbyB3b3JrIGFnYWluc3QgdGhlIGRpbm9kZSBsaXN0IGZvciB0cmVlJ3Mgd2l0aCAwCisgKiBkZXB0aC4gSWYgd2UgY29uc2lkZXIgdGhlIGRpbm9kZSBsaXN0IHRvIGJlIHRoZSByaWdodG1vc3QgbGVhZiBub2RlCisgKiB0aGVuIHRoZSBsb2dpYyBoZXJlIG1ha2VzIHNlbnNlLgorICovCitzdGF0aWMgdm9pZCBvY2ZzMl9maWd1cmVfYXBwZW5kaW5nX3R5cGUoc3RydWN0IG9jZnMyX2luc2VydF90eXBlICppbnNlcnQsCisJCQkJCXN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqZWwsCisJCQkJCXN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjICppbnNlcnRfcmVjKQoreworCWludCBpOworCXUzMiBjcG9zID0gbGUzMl90b19jcHUoaW5zZXJ0X3JlYy0+ZV9jcG9zKTsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyAqcmVjOworCisJaW5zZXJ0LT5pbnNfYXBwZW5kaW5nID0gQVBQRU5EX05PTkU7CisKKwlCVUdfT04obGUxNl90b19jcHUoZWwtPmxfdHJlZV9kZXB0aCkgIT0gMCk7CisKKwlpZiAoIWVsLT5sX25leHRfZnJlZV9yZWMpCisJCWdvdG8gc2V0X3RhaWxfYXBwZW5kOworCisJaWYgKG9jZnMyX2lzX2VtcHR5X2V4dGVudCgmZWwtPmxfcmVjc1swXSkpIHsKKwkJLyogV2VyZSBhbGwgcmVjb3JkcyBlbXB0eT8gKi8KKwkJaWYgKGxlMTZfdG9fY3B1KGVsLT5sX25leHRfZnJlZV9yZWMpID09IDEpCisJCQlnb3RvIHNldF90YWlsX2FwcGVuZDsKKwl9CisKKwlpID0gbGUxNl90b19jcHUoZWwtPmxfbmV4dF9mcmVlX3JlYykgLSAxOworCXJlYyA9ICZlbC0+bF9yZWNzW2ldOworCisJaWYgKGNwb3MgPj0KKwkgICAgKGxlMzJfdG9fY3B1KHJlYy0+ZV9jcG9zKSArIGxlMTZfdG9fY3B1KHJlYy0+ZV9sZWFmX2NsdXN0ZXJzKSkpCisJCWdvdG8gc2V0X3RhaWxfYXBwZW5kOworCisJcmV0dXJuOworCitzZXRfdGFpbF9hcHBlbmQ6CisJaW5zZXJ0LT5pbnNfYXBwZW5kaW5nID0gQVBQRU5EX1RBSUw7Cit9CisKKy8qCisgKiBIZWxwZXIgZnVuY3Rpb24gY2FsbGVkIGF0IHRoZSBiZWdpbmluZyBvZiBhbiBpbnNlcnQuCisgKgorICogVGhpcyBjb21wdXRlcyBhIGZldyB0aGluZ3MgdGhhdCBhcmUgY29tbW9ubHkgdXNlZCBpbiB0aGUgcHJvY2VzcyBvZgorICogaW5zZXJ0aW5nIGludG8gdGhlIGJ0cmVlOgorICogICAtIFdoZXRoZXIgdGhlIG5ldyBleHRlbnQgaXMgY29udGlndW91cyB3aXRoIGFuIGV4aXN0aW5nIG9uZS4KKyAqICAgLSBUaGUgY3VycmVudCB0cmVlIGRlcHRoLgorICogICAtIFdoZXRoZXIgdGhlIGluc2VydCBpcyBhbiBhcHBlbmRpbmcgb25lLgorICogICAtIFRoZSB0b3RhbCAjIG9mIGZyZWUgcmVjb3JkcyBpbiB0aGUgdHJlZS4KKyAqCisgKiBBbGwgb2YgdGhlIGluZm9ybWF0aW9uIGlzIHN0b3JlZCBvbiB0aGUgb2NmczJfaW5zZXJ0X3R5cGUKKyAqIHN0cnVjdHVyZS4KKyAqLworc3RhdGljIGludCBvY2ZzMl9maWd1cmVfaW5zZXJ0X3R5cGUoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpkaV9iaCwKKwkJCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqbGFzdF9lYl9iaCwKKwkJCQkgICAgc3RydWN0IG9jZnMyX2V4dGVudF9yZWMgKmluc2VydF9yZWMsCisJCQkJICAgIHN0cnVjdCBvY2ZzMl9pbnNlcnRfdHlwZSAqaW5zZXJ0KQoreworCWludCByZXQ7CisJc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGkgPSAoc3RydWN0IG9jZnMyX2Rpbm9kZSAqKWRpX2JoLT5iX2RhdGE7CisJc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqZWI7CisJc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICplbDsKKwlzdHJ1Y3Qgb2NmczJfcGF0aCAqcGF0aCA9IE5VTEw7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7CisKKwllbCA9ICZkaS0+aWQyLmlfbGlzdDsKKwlpbnNlcnQtPmluc190cmVlX2RlcHRoID0gbGUxNl90b19jcHUoZWwtPmxfdHJlZV9kZXB0aCk7CisKKwlpZiAoZWwtPmxfdHJlZV9kZXB0aCkgeworCQkvKgorCQkgKiBJZiB3ZSBoYXZlIHRyZWUgZGVwdGgsIHdlIHJlYWQgaW4gdGhlCisJCSAqIHJpZ2h0bW9zdCBleHRlbnQgYmxvY2sgYWhlYWQgb2YgdGltZSBhcworCQkgKiBvY2ZzMl9maWd1cmVfaW5zZXJ0X3R5cGUoKSBhbmQgb2NmczJfYWRkX2JyYW5jaCgpCisJCSAqIG1heSB3YW50IGl0IGxhdGVyLgorCQkgKi8KKwkJcmV0ID0gb2NmczJfcmVhZF9ibG9jayhPQ0ZTMl9TQihpbm9kZS0+aV9zYiksCisJCQkJICAgICAgIGxlNjRfdG9fY3B1KGRpLT5pX2xhc3RfZWJfYmxrKSwgJmJoLAorCQkJCSAgICAgICBPQ0ZTMl9CSF9DQUNIRUQsIGlub2RlKTsKKwkJaWYgKHJldCkgeworCQkJbWxvZ19leGl0KHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCQllYiA9IChzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICopIGJoLT5iX2RhdGE7CisJCWVsID0gJmViLT5oX2xpc3Q7CisJfQorCisJLyoKKwkgKiBVbmxlc3Mgd2UgaGF2ZSBhIGNvbnRpZ3VvdXMgaW5zZXJ0LCB3ZSdsbCBuZWVkIHRvIGtub3cgaWYKKwkgKiB0aGVyZSBpcyByb29tIGxlZnQgaW4gb3VyIGFsbG9jYXRpb24gdHJlZSBmb3IgYW5vdGhlcgorCSAqIGV4dGVudCByZWNvcmQuCisJICoKKwkgKiBYWFg6IFRoaXMgdGVzdCBpcyBzaW1wbGlzdGljLCB3ZSBjYW4gc2VhcmNoIGZvciBlbXB0eQorCSAqIGV4dGVudCByZWNvcmRzIHRvby4KKwkgKi8KKwlpbnNlcnQtPmluc19mcmVlX3JlY29yZHMgPSBsZTE2X3RvX2NwdShlbC0+bF9jb3VudCkgLQorCQlsZTE2X3RvX2NwdShlbC0+bF9uZXh0X2ZyZWVfcmVjKTsKKworCWlmICghaW5zZXJ0LT5pbnNfdHJlZV9kZXB0aCkgeworCQlvY2ZzMl9maWd1cmVfY29udGlnX3R5cGUoaW5vZGUsIGluc2VydCwgZWwsIGluc2VydF9yZWMpOworCQlvY2ZzMl9maWd1cmVfYXBwZW5kaW5nX3R5cGUoaW5zZXJ0LCBlbCwgaW5zZXJ0X3JlYyk7CisJCXJldHVybiAwOworCX0KKworCXBhdGggPSBvY2ZzMl9uZXdfaW5vZGVfcGF0aChkaV9iaCk7CisJaWYgKCFwYXRoKSB7CisJCXJldCA9IC1FTk9NRU07CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBJbiB0aGUgY2FzZSB0aGF0IHdlJ3JlIGluc2VydGluZyBwYXN0IHdoYXQgdGhlIHRyZWUKKwkgKiBjdXJyZW50bHkgYWNjb3VudHMgZm9yLCBvY2ZzMl9maW5kX3BhdGgoKSB3aWxsIHJldHVybiBmb3IKKwkgKiB1cyB0aGUgcmlnaHRtb3N0IHRyZWUgcGF0aC4gVGhpcyBpcyBhY2NvdW50ZWQgZm9yIGJlbG93IGluCisJICogdGhlIGFwcGVuZGluZyBjb2RlLgorCSAqLworCXJldCA9IG9jZnMyX2ZpbmRfcGF0aChpbm9kZSwgcGF0aCwgbGUzMl90b19jcHUoaW5zZXJ0X3JlYy0+ZV9jcG9zKSk7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCWVsID0gcGF0aF9sZWFmX2VsKHBhdGgpOworCisJLyoKKwkgKiBOb3cgdGhhdCB3ZSBoYXZlIHRoZSBwYXRoLCB0aGVyZSdzIHR3byB0aGluZ3Mgd2Ugd2FudCB0byBkZXRlcm1pbmU6CisJICogMSkgQ29udGlndW91c25lc3MgKGFsc28gc2V0IGNvbnRpZ19pbmRleCBpZiB0aGlzIGlzIHNvKQorCSAqCisJICogMikgQXJlIHdlIGRvaW5nIGFuIGFwcGVuZD8gV2UgY2FuIHRyaXZpYWxseSBicmVhayB0aGlzIHVwCisgICAgICAgICAqICAgICBpbnRvIHR3byB0eXBlcyBvZiBhcHBlbmRzOiBzaW1wbGUgcmVjb3JkIGFwcGVuZCwgb3IgYQorICAgICAgICAgKiAgICAgcm90YXRlIGluc2lkZSB0aGUgdGFpbCBsZWFmLgorCSAqLworCW9jZnMyX2ZpZ3VyZV9jb250aWdfdHlwZShpbm9kZSwgaW5zZXJ0LCBlbCwgaW5zZXJ0X3JlYyk7CisKKwkvKgorCSAqIFRoZSBpbnNlcnQgY29kZSBpc24ndCBxdWl0ZSByZWFkeSB0byBkZWFsIHdpdGggYWxsIGNhc2VzIG9mCisJICogbGVmdCBjb250aWd1b3VzbmVzcy4gU3BlY2lmaWNhbGx5LCBpZiBpdCdzIGFuIGluc2VydCBpbnRvCisJICogdGhlIDFzdCByZWNvcmQgaW4gYSBsZWFmLCBpdCB3aWxsIHJlcXVpcmUgdGhlIGFkanVzdG1lbnQgb2YKKwkgKiBjbHVzdGVyIGNvdW50IG9uIHRoZSBsYXN0IHJlY29yZCBvZiB0aGUgcGF0aCBkaXJlY3RseSB0byBpdCdzCisJICogbGVmdC4gRm9yIG5vdywganVzdCBjYXRjaCB0aGF0IGNhc2UgYW5kIGZvb2wgdGhlIGxheWVycworCSAqIGFib3ZlIHVzLiBUaGlzIHdvcmtzIGp1c3QgZmluZSBmb3IgdHJlZV9kZXB0aCA9PSAwLCB3aGljaAorCSAqIGlzIHdoeSB3ZSBhbGxvdyB0aGF0IGFib3ZlLgorCSAqLworCWlmIChpbnNlcnQtPmluc19jb250aWcgPT0gQ09OVElHX0xFRlQgJiYKKwkgICAgaW5zZXJ0LT5pbnNfY29udGlnX2luZGV4ID09IDApCisJCWluc2VydC0+aW5zX2NvbnRpZyA9IENPTlRJR19OT05FOworCisJLyoKKwkgKiBPaywgc28gd2UgY2FuIHNpbXBseSBjb21wYXJlIGFnYWluc3QgbGFzdF9lYiB0byBmaWd1cmUgb3V0CisJICogd2hldGhlciB0aGUgcGF0aCBkb2Vzbid0IGV4aXN0LiBUaGlzIHdpbGwgb25seSBoYXBwZW4gaW4KKwkgKiB0aGUgY2FzZSB0aGF0IHdlJ3JlIGRvaW5nIGEgdGFpbCBhcHBlbmQsIHNvIG1heWJlIHdlIGNhbgorCSAqIHRha2UgYWR2YW50YWdlIG9mIHRoYXQgaW5mb3JtYXRpb24gc29tZWhvdy4KKwkgKi8KKwlpZiAobGU2NF90b19jcHUoZGktPmlfbGFzdF9lYl9ibGspID09IHBhdGhfbGVhZl9iaChwYXRoKS0+Yl9ibG9ja25yKSB7CisJCS8qCisJCSAqIE9rLCBvY2ZzMl9maW5kX3BhdGgoKSByZXR1cm5lZCB1cyB0aGUgcmlnaHRtb3N0CisJCSAqIHRyZWUgcGF0aC4gVGhpcyBtaWdodCBiZSBhbiBhcHBlbmRpbmcgaW5zZXJ0LiBUaGVyZSBhcmUKKwkJICogdHdvIGNhc2VzOgorCQkgKiAgICAxKSBXZSdyZSBkb2luZyBhIHRydWUgYXBwZW5kIGF0IHRoZSB0YWlsOgorCQkgKgktVGhpcyBtaWdodCBldmVuIGJlIG9mZiB0aGUgZW5kIG9mIHRoZSBsZWFmCisJCSAqICAgIDIpIFdlJ3JlICJhcHBlbmRpbmciIGJ5IHJvdGF0aW5nIGluIHRoZSB0YWlsCisJCSAqLworCQlvY2ZzMl9maWd1cmVfYXBwZW5kaW5nX3R5cGUoaW5zZXJ0LCBlbCwgaW5zZXJ0X3JlYyk7CisJfQorCitvdXQ6CisJb2NmczJfZnJlZV9wYXRoKHBhdGgpOworCisJaWYgKHJldCA9PSAwKQorCQkqbGFzdF9lYl9iaCA9IGJoOworCWVsc2UKKwkJYnJlbHNlKGJoKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogSW5zZXJ0IGFuIGV4dGVudCBpbnRvIGFuIGlub2RlIGJ0cmVlLgorICoKKyAqIFRoZSBjYWxsZXIgbmVlZHMgdG8gdXBkYXRlIGZlLT5pX2NsdXN0ZXJzCisgKi8KIGludCBvY2ZzMl9pbnNlcnRfZXh0ZW50KHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAogCQkJaGFuZGxlX3QgKmhhbmRsZSwKIAkJCXN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmZlX2JoLAorCQkJdTMyIGNwb3MsCiAJCQl1NjQgc3RhcnRfYmxrLAogCQkJdTMyIG5ld19jbHVzdGVycywKIAkJCXN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICptZXRhX2FjKQogewotCWludCBzdGF0dXMsIGksIHNoaWZ0OworCWludCBzdGF0dXMsIHNoaWZ0OwogCXN0cnVjdCBidWZmZXJfaGVhZCAqbGFzdF9lYl9iaCA9IE5VTEw7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7Ci0Jc3RydWN0IG9jZnMyX2Rpbm9kZSAqZmU7Ci0Jc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqZWI7Ci0Jc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICAqZWw7CisJc3RydWN0IG9jZnMyX2luc2VydF90eXBlIGluc2VydCA9IHswLCB9OworCXN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjIHJlYzsKIAotCW1sb2dfZW50cnlfdm9pZCgpOworCW1sb2coMCwgImFkZCAldSBjbHVzdGVycyBhdCBwb3NpdGlvbiAldSB0byBpbm9kZSAlbGx1XG4iLAorCSAgICAgbmV3X2NsdXN0ZXJzLCBjcG9zLCAodW5zaWduZWQgbG9uZyBsb25nKU9DRlMyX0koaW5vZGUpLT5pcF9ibGtubyk7CiAKLQltbG9nKDAsICJhZGQgJXUgY2x1c3RlcnMgc3RhcnRpbmcgYXQgYmxvY2sgJWxsdSB0byBpbm9kZSAlbGx1XG4iLAotCSAgICAgbmV3X2NsdXN0ZXJzLCAodW5zaWduZWQgbG9uZyBsb25nKXN0YXJ0X2JsaywKLQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vKTsKKwltbG9nX2J1Z19vbl9tc2coIW9jZnMyX3NwYXJzZV9hbGxvYyhvc2IpICYmCisJCQkoT0NGUzJfSShpbm9kZSktPmlwX2NsdXN0ZXJzICE9IGNwb3MpLAorCQkJIkRldmljZSAlcywgYXNraW5nIGZvciBzcGFyc2UgYWxsb2NhdGlvbjogaW5vZGUgJWxsdSwgIgorCQkJImNwb3MgJXUsIGNsdXN0ZXJzICV1XG4iLAorCQkJb3NiLT5kZXZfc3RyLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8sIGNwb3MsCisJCQlPQ0ZTMl9JKGlub2RlKS0+aXBfY2x1c3RlcnMpOwogCi0JZmUgPSAoc3RydWN0IG9jZnMyX2Rpbm9kZSAqKSBmZV9iaC0+Yl9kYXRhOwotCWVsID0gJmZlLT5pZDIuaV9saXN0OworCW1lbXNldCgmcmVjLCAwLCBzaXplb2YocmVjKSk7CisJcmVjLmVfY3BvcyA9IGNwdV90b19sZTMyKGNwb3MpOworCXJlYy5lX2Jsa25vID0gY3B1X3RvX2xlNjQoc3RhcnRfYmxrKTsKKwlyZWMuZV9sZWFmX2NsdXN0ZXJzID0gY3B1X3RvX2xlMTYobmV3X2NsdXN0ZXJzKTsKIAotCWlmIChlbC0+bF90cmVlX2RlcHRoKSB7Ci0JCS8qIGp1bXAgdG8gZW5kIG9mIHRyZWUgKi8KLQkJc3RhdHVzID0gb2NmczJfcmVhZF9ibG9jayhvc2IsIGxlNjRfdG9fY3B1KGZlLT5pX2xhc3RfZWJfYmxrKSwKLQkJCQkJICAmbGFzdF9lYl9iaCwgT0NGUzJfQkhfQ0FDSEVELCBpbm9kZSk7Ci0JCWlmIChzdGF0dXMgPCAwKSB7Ci0JCQltbG9nX2V4aXQoc3RhdHVzKTsKLQkJCWdvdG8gYmFpbDsKLQkJfQotCQllYiA9IChzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICopIGxhc3RfZWJfYmgtPmJfZGF0YTsKLQkJZWwgPSAmZWItPmhfbGlzdDsKKwlzdGF0dXMgPSBvY2ZzMl9maWd1cmVfaW5zZXJ0X3R5cGUoaW5vZGUsIGZlX2JoLCAmbGFzdF9lYl9iaCwgJnJlYywKKwkJCQkJICAmaW5zZXJ0KTsKKwlpZiAoc3RhdHVzIDwgMCkgeworCQltbG9nX2Vycm5vKHN0YXR1cyk7CisJCWdvdG8gYmFpbDsKIAl9CiAKLQkvKiBDYW4gd2UgYWxsb2NhdGUgd2l0aG91dCBhZGRpbmcvc2hpZnRpbmcgdHJlZSBiaXRzPyAqLwotCWkgPSBsZTE2X3RvX2NwdShlbC0+bF9uZXh0X2ZyZWVfcmVjKSAtIDE7Ci0JaWYgKGxlMTZfdG9fY3B1KGVsLT5sX25leHRfZnJlZV9yZWMpID09IDAKLQkgICAgfHwgKGxlMTZfdG9fY3B1KGVsLT5sX25leHRfZnJlZV9yZWMpIDwgbGUxNl90b19jcHUoZWwtPmxfY291bnQpKQotCSAgICB8fCBsZTMyX3RvX2NwdShlbC0+bF9yZWNzW2ldLmVfY2x1c3RlcnMpID09IDAKLQkgICAgfHwgb2NmczJfZXh0ZW50X2NvbnRpZyhpbm9kZSwgJmVsLT5sX3JlY3NbaV0sIHN0YXJ0X2JsaykpCi0JCWdvdG8gb3V0X2FkZDsKKwltbG9nKDAsICJJbnNlcnQuYXBwZW5kaW5nOiAldSwgSW5zZXJ0LkNvbnRpZzogJXUsICIKKwkgICAgICJJbnNlcnQuY29udGlnX2luZGV4OiAlZCwgSW5zZXJ0LmZyZWVfcmVjb3JkczogJWQsICIKKwkgICAgICJJbnNlcnQudHJlZV9kZXB0aDogJWRcbiIsCisJICAgICBpbnNlcnQuaW5zX2FwcGVuZGluZywgaW5zZXJ0Lmluc19jb250aWcsIGluc2VydC5pbnNfY29udGlnX2luZGV4LAorCSAgICAgaW5zZXJ0Lmluc19mcmVlX3JlY29yZHMsIGluc2VydC5pbnNfdHJlZV9kZXB0aCk7CiAKLQltbG9nKDAsICJvY2ZzMl9hbGxvY2F0ZV9leHRlbnQ6IGNvdWxkbid0IGRvIGEgc2ltcGxlIGFkZCwgdHJhdmVyc2luZyAiCi0JICAgICAidHJlZSBub3cuXG4iKTsKKwkvKgorCSAqIEF2b2lkIGdyb3dpbmcgdGhlIHRyZWUgdW5sZXNzIHdlJ3JlIG91dCBvZiByZWNvcmRzIGFuZCB0aGUKKwkgKiBpbnNlcnQgdHlwZSByZXF1cmVzIG9uZS4KKwkgKi8KKwlpZiAoaW5zZXJ0Lmluc19jb250aWcgIT0gQ09OVElHX05PTkUgfHwgaW5zZXJ0Lmluc19mcmVlX3JlY29yZHMpCisJCWdvdG8gb3V0X2FkZDsKIAogCXNoaWZ0ID0gb2NmczJfZmluZF9icmFuY2hfdGFyZ2V0KG9zYiwgaW5vZGUsIGZlX2JoLCAmYmgpOwogCWlmIChzaGlmdCA8IDApIHsKQEAgLTg2NiwxMyArMjM4Miw5IEBACiAJICogYW5kIGRpZG4ndCBmaW5kIHJvb20gZm9yIGFueSBtb3JlIGV4dGVudHMgLSB3ZSBuZWVkIHRvIGFkZAogCSAqIGFub3RoZXIgdHJlZSBsZXZlbCAqLwogCWlmIChzaGlmdCkgewotCQkvKiBpZiB3ZSBoaXQgYSBsZWFmLCB3ZSdkIGJldHRlciBiZSBlbXB0eSA6KSAqLwotCQlCVUdfT04obGUxNl90b19jcHUoZWwtPmxfbmV4dF9mcmVlX3JlYykgIT0KLQkJICAgICAgIGxlMTZfdG9fY3B1KGVsLT5sX2NvdW50KSk7CiAJCUJVR19PTihiaCk7Ci0JCW1sb2coMCwgIm9jZnMyX2FsbG9jYXRlX2V4dGVudDogbmVlZCB0byBzaGlmdCB0cmVlIGRlcHRoICIKLQkJICAgICAiKGN1cnJlbnQgPSAldSlcbiIsCi0JCSAgICAgbGUxNl90b19jcHUoZmUtPmlkMi5pX2xpc3QubF90cmVlX2RlcHRoKSk7CisJCW1sb2coMCwgIm5lZWQgdG8gc2hpZnQgdHJlZSBkZXB0aCAiCisJCSAgICAgIihjdXJyZW50ID0gJWQpXG4iLCBpbnNlcnQuaW5zX3RyZWVfZGVwdGgpOwogCiAJCS8qIG9jZnMyX3NoaWZ0X3RyZWVfZGVwdGggd2lsbCByZXR1cm4gdXMgYSBidWZmZXIgd2l0aAogCQkgKiB0aGUgbmV3IGV4dGVudCBibG9jayAoc28gd2UgY2FuIHBhc3MgdGhhdCB0bwpAQCAtODgzLDE1ICsyMzk1LDE2IEBACiAJCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCQlnb3RvIGJhaWw7CiAJCX0KKwkJaW5zZXJ0Lmluc190cmVlX2RlcHRoKys7CiAJCS8qIFNwZWNpYWwgY2FzZTogd2UgaGF2ZSByb29tIG5vdyBpZiB3ZSBzaGlmdGVkIGZyb20KIAkJICogdHJlZV9kZXB0aCAwICovCi0JCWlmIChmZS0+aWQyLmlfbGlzdC5sX3RyZWVfZGVwdGggPT0gY3B1X3RvX2xlMTYoMSkpCisJCWlmIChpbnNlcnQuaW5zX3RyZWVfZGVwdGggPT0gMSkKIAkJCWdvdG8gb3V0X2FkZDsKIAl9CiAKIAkvKiBjYWxsIG9jZnMyX2FkZF9icmFuY2ggdG8gYWRkIHRoZSBmaW5hbCBwYXJ0IG9mIHRoZSB0cmVlIHdpdGgKIAkgKiB0aGUgbmV3IGRhdGEuICovCi0JbWxvZygwLCAib2NmczJfYWxsb2NhdGVfZXh0ZW50OiBhZGQgYnJhbmNoLiBiaCA9ICVwXG4iLCBiaCk7CisJbWxvZygwLCAiYWRkIGJyYW5jaC4gYmggPSAlcFxuIiwgYmgpOwogCXN0YXR1cyA9IG9jZnMyX2FkZF9icmFuY2gob3NiLCBoYW5kbGUsIGlub2RlLCBmZV9iaCwgYmgsIGxhc3RfZWJfYmgsCiAJCQkJICBtZXRhX2FjKTsKIAlpZiAoc3RhdHVzIDwgMCkgewpAQCAtOTAwLDExICsyNDEzLDEyIEBACiAJfQogCiBvdXRfYWRkOgotCS8qIEZpbmFsbHksIHdlIGNhbiBhZGQgY2x1c3RlcnMuICovCi0Jc3RhdHVzID0gb2NmczJfZG9faW5zZXJ0X2V4dGVudChvc2IsIGhhbmRsZSwgaW5vZGUsIGZlX2JoLAotCQkJCQlzdGFydF9ibGssIG5ld19jbHVzdGVycyk7CisJLyogRmluYWxseSwgd2UgY2FuIGFkZCBjbHVzdGVycy4gVGhpcyBtaWdodCByb3RhdGUgdGhlIHRyZWUgZm9yIHVzLiAqLworCXN0YXR1cyA9IG9jZnMyX2RvX2luc2VydF9leHRlbnQoaW5vZGUsIGhhbmRsZSwgZmVfYmgsICZyZWMsICZpbnNlcnQpOwogCWlmIChzdGF0dXMgPCAwKQogCQltbG9nX2Vycm5vKHN0YXR1cyk7CisJZWxzZQorCQlvY2ZzMl9leHRlbnRfbWFwX2luc2VydF9yZWMoaW5vZGUsICZyZWMpOwogCiBiYWlsOgogCWlmIChiaCkKQEAgLTE0NDcsMTY4ICsyOTYxLDM4OSBAQAogICogYmxvY2sgd2lsbCBiZSBkZWxldGVkLCBhbmQgaWYgaXQgd2lsbCwgd2hhdCB0aGUgbmV3IGxhc3QgZXh0ZW50CiAgKiBibG9jayB3aWxsIGJlIHNvIHdlIGNhbiB1cGRhdGUgaGlzIGhfbmV4dF9sZWFmX2JsayBmaWVsZCwgYXMgd2VsbAogICogYXMgdGhlIGRpbm9kZXMgaV9sYXN0X2ViX2JsayAqLwotc3RhdGljIGludCBvY2ZzMl9maW5kX25ld19sYXN0X2V4dF9ibGsoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCi0JCQkJICAgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkJICAgICAgIHN0cnVjdCBvY2ZzMl9kaW5vZGUgKmZlLAotCQkJCSAgICAgICB1MzIgbmV3X2lfY2x1c3RlcnMsCi0JCQkJICAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqb2xkX2xhc3RfZWIsCitzdGF0aWMgaW50IG9jZnMyX2ZpbmRfbmV3X2xhc3RfZXh0X2JsayhzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgY2x1c3RlcnNfdG9fZGVsLAorCQkJCSAgICAgICBzdHJ1Y3Qgb2NmczJfcGF0aCAqcGF0aCwKIAkJCQkgICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqbmV3X2xhc3RfZWIpCiB7Ci0JaW50IGksIHN0YXR1cyA9IDA7Ci0JdTY0IGJsb2NrID0gMDsKKwlpbnQgbmV4dF9mcmVlLCByZXQgPSAwOworCXUzMiBjcG9zOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjICpyZWM7CiAJc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqZWI7CiAJc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICplbDsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKIAogCSpuZXdfbGFzdF9lYiA9IE5VTEw7CiAKLQlpZiAoIU9DRlMyX0lTX1ZBTElEX0RJTk9ERShmZSkpIHsKLQkJT0NGUzJfUk9fT05fSU5WQUxJRF9ESU5PREUoaW5vZGUtPmlfc2IsIGZlKTsKLQkJc3RhdHVzID0gLUVJTzsKLQkJZ290byBiYWlsOwotCX0KLQogCS8qIHdlIGhhdmUgbm8gdHJlZSwgc28gb2YgY291cnNlLCBubyBsYXN0X2ViLiAqLwotCWlmICghZmUtPmlkMi5pX2xpc3QubF90cmVlX2RlcHRoKQotCQlnb3RvIGJhaWw7CisJaWYgKCFwYXRoLT5wX3RyZWVfZGVwdGgpCisJCWdvdG8gb3V0OwogCiAJLyogdHJ1bmMgdG8gemVybyBzcGVjaWFsIGNhc2UgLSB0aGlzIG1ha2VzIHRyZWVfZGVwdGggPSAwCiAJICogcmVnYXJkbGVzcyBvZiB3aGF0IGl0IGlzLiAgKi8KLQlpZiAoIW5ld19pX2NsdXN0ZXJzKQotCQlnb3RvIGJhaWw7CisJaWYgKE9DRlMyX0koaW5vZGUpLT5pcF9jbHVzdGVycyA9PSBjbHVzdGVyc190b19kZWwpCisJCWdvdG8gb3V0OwogCi0JZWIgPSAoc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqKSBvbGRfbGFzdF9lYi0+Yl9kYXRhOwotCWVsID0gJihlYi0+aF9saXN0KTsKKwllbCA9IHBhdGhfbGVhZl9lbChwYXRoKTsKIAlCVUdfT04oIWVsLT5sX25leHRfZnJlZV9yZWMpOwogCi0JLyogTWFrZSBzdXJlIHRoYXQgdGhpcyBndXkgd2lsbCBhY3R1YWxseSBiZSBlbXB0eSBhZnRlciB3ZQotCSAqIGNsZWFyIGF3YXkgdGhlIGRhdGEuICovCi0JaWYgKGxlMzJfdG9fY3B1KGVsLT5sX3JlY3NbMF0uZV9jcG9zKSA8IG5ld19pX2NsdXN0ZXJzKQotCQlnb3RvIGJhaWw7CisJLyoKKwkgKiBNYWtlIHN1cmUgdGhhdCB0aGlzIGV4dGVudCBsaXN0IHdpbGwgYWN0dWFsbHkgYmUgZW1wdHkKKwkgKiBhZnRlciB3ZSBjbGVhciBhd2F5IHRoZSBkYXRhLiBXZSBjYW4gc2hvcnRjdXQgb3V0IGlmCisJICogdGhlcmUncyBtb3JlIHRoYW4gb25lIG5vbi1lbXB0eSBleHRlbnQgaW4gdGhlCisJICogbGlzdC4gT3RoZXJ3aXNlLCBhIGNoZWNrIG9mIHRoZSByZW1haW5pbmcgZXh0ZW50IGlzCisJICogbmVjZXNzYXJ5LgorCSAqLworCW5leHRfZnJlZSA9IGxlMTZfdG9fY3B1KGVsLT5sX25leHRfZnJlZV9yZWMpOworCXJlYyA9IE5VTEw7CisJaWYgKG9jZnMyX2lzX2VtcHR5X2V4dGVudCgmZWwtPmxfcmVjc1swXSkpIHsKKwkJaWYgKG5leHRfZnJlZSA+IDIpCisJCQlnb3RvIG91dDsKIAotCS8qIE9rLCBhdCB0aGlzIHBvaW50LCB3ZSBrbm93IHRoYXQgbGFzdF9lYiB3aWxsIGRlZmluaXRlbHkKLQkgKiBjaGFuZ2UsIHNvIGxldHMgdHJhdmVyc2UgdGhlIHRyZWUgYW5kIGZpbmQgdGhlIHNlY29uZCB0bwotCSAqIGxhc3QgZXh0ZW50IGJsb2NrLiAqLwotCWVsID0gJihmZS0+aWQyLmlfbGlzdCk7Ci0JLyogZ28gZG93biB0aGUgdHJlZSwgKi8KLQlkbyB7Ci0JCWZvcihpID0gKGxlMTZfdG9fY3B1KGVsLT5sX25leHRfZnJlZV9yZWMpIC0gMSk7IGkgPj0gMDsgaS0tKSB7Ci0JCQlpZiAobGUzMl90b19jcHUoZWwtPmxfcmVjc1tpXS5lX2Nwb3MpIDwKLQkJCSAgICBuZXdfaV9jbHVzdGVycykgewotCQkJCWJsb2NrID0gbGU2NF90b19jcHUoZWwtPmxfcmVjc1tpXS5lX2Jsa25vKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlCVUdfT04oaSA8IDApOworCQkvKiBXZSBtYXkgaGF2ZSBhIHZhbGlkIGV4dGVudCBpbiBpbmRleCAxLCBjaGVjayBpdC4gKi8KKwkJaWYgKG5leHRfZnJlZSA9PSAyKQorCQkJcmVjID0gJmVsLT5sX3JlY3NbMV07CiAKLQkJaWYgKGJoKSB7Ci0JCQlicmVsc2UoYmgpOwotCQkJYmggPSBOVUxMOwotCQl9CisJCS8qCisJCSAqIEZhbGwgdGhyb3VnaCAtIG5vIG1vcmUgbm9uZW1wdHkgZXh0ZW50cywgc28gd2Ugd2FudAorCQkgKiB0byBkZWxldGUgdGhpcyBsZWFmLgorCQkgKi8KKwl9IGVsc2UgeworCQlpZiAobmV4dF9mcmVlID4gMSkKKwkJCWdvdG8gb3V0OwogCi0JCXN0YXR1cyA9IG9jZnMyX3JlYWRfYmxvY2sob3NiLCBibG9jaywgJmJoLCBPQ0ZTMl9CSF9DQUNIRUQsCi0JCQkJCSBpbm9kZSk7Ci0JCWlmIChzdGF0dXMgPCAwKSB7Ci0JCQltbG9nX2Vycm5vKHN0YXR1cyk7Ci0JCQlnb3RvIGJhaWw7Ci0JCX0KLQkJZWIgPSAoc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqKSBiaC0+Yl9kYXRhOwotCQllbCA9ICZlYi0+aF9saXN0OwotCQlpZiAoIU9DRlMyX0lTX1ZBTElEX0VYVEVOVF9CTE9DSyhlYikpIHsKLQkJCU9DRlMyX1JPX09OX0lOVkFMSURfRVhURU5UX0JMT0NLKGlub2RlLT5pX3NiLCBlYik7Ci0JCQlzdGF0dXMgPSAtRUlPOwotCQkJZ290byBiYWlsOwotCQl9Ci0JfSB3aGlsZSAoZWwtPmxfdHJlZV9kZXB0aCk7CisJCXJlYyA9ICZlbC0+bF9yZWNzWzBdOworCX0KKworCWlmIChyZWMpIHsKKwkJLyoKKwkJICogQ2hlY2sgaXQgd2UnbGwgb25seSBiZSB0cmltbWluZyBvZmYgdGhlIGVuZCBvZiB0aGlzCisJCSAqIGNsdXN0ZXIuCisJCSAqLworCQlpZiAobGUxNl90b19jcHUocmVjLT5lX2xlYWZfY2x1c3RlcnMpID4gY2x1c3RlcnNfdG9fZGVsKQorCQkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gb2NmczJfZmluZF9jcG9zX2Zvcl9sZWZ0X2xlYWYoaW5vZGUtPmlfc2IsIHBhdGgsICZjcG9zKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gb2NmczJfZmluZF9sZWFmKGlub2RlLCBwYXRoX3Jvb3RfZWwocGF0aCksIGNwb3MsICZiaCk7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCWViID0gKHN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKikgYmgtPmJfZGF0YTsKKwllbCA9ICZlYi0+aF9saXN0OworCWlmICghT0NGUzJfSVNfVkFMSURfRVhURU5UX0JMT0NLKGViKSkgeworCQlPQ0ZTMl9ST19PTl9JTlZBTElEX0VYVEVOVF9CTE9DSyhpbm9kZS0+aV9zYiwgZWIpOworCQlyZXQgPSAtRVJPRlM7CisJCWdvdG8gb3V0OworCX0KIAogCSpuZXdfbGFzdF9lYiA9IGJoOwogCWdldF9iaCgqbmV3X2xhc3RfZWIpOwotCW1sb2coMCwgInJldHVybmluZyBibG9jayAlbGx1XG4iLAotCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylsZTY0X3RvX2NwdShlYi0+aF9ibGtubykpOwotYmFpbDoKLQlpZiAoYmgpCi0JCWJyZWxzZShiaCk7CisJbWxvZygwLCAicmV0dXJuaW5nIGJsb2NrICVsbHUsIChjcG9zOiAldSlcbiIsCisJICAgICAodW5zaWduZWQgbG9uZyBsb25nKWxlNjRfdG9fY3B1KGViLT5oX2Jsa25vKSwgY3Bvcyk7CitvdXQ6CisJYnJlbHNlKGJoKTsKIAotCXJldHVybiBzdGF0dXM7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFRyaW0gc29tZSBjbHVzdGVycyBvZmYgdGhlIHJpZ2h0bW9zdCBlZGdlIG9mIGEgdHJlZS4gT25seSBjYWxsZWQKKyAqIGR1cmluZyB0cnVuY2F0ZS4KKyAqCisgKiBUaGUgY2FsbGVyIG5lZWRzIHRvOgorICogICAtIHN0YXJ0IGpvdXJuYWxpbmcgb2YgZWFjaCBwYXRoIGNvbXBvbmVudC4KKyAqICAgLSBjb21wdXRlIGFuZCBmdWxseSBzZXQgdXAgYW55IG5ldyBsYXN0IGV4dCBibG9jaworICovCitzdGF0aWMgaW50IG9jZnMyX3RyaW1fdHJlZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3Qgb2NmczJfcGF0aCAqcGF0aCwKKwkJCSAgIGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBvY2ZzMl90cnVuY2F0ZV9jb250ZXh0ICp0YywKKwkJCSAgIHUzMiBjbHVzdGVyc190b19kZWwsIHU2NCAqZGVsZXRlX3N0YXJ0KQoreworCWludCByZXQsIGksIGluZGV4ID0gcGF0aC0+cF90cmVlX2RlcHRoOworCXUzMiBuZXdfZWRnZSA9IDA7CisJdTY0IGRlbGV0ZWRfZWIgPSAwOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICplbDsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyAqcmVjOworCisJKmRlbGV0ZV9zdGFydCA9IDA7CisKKwl3aGlsZSAoaW5kZXggPj0gMCkgeworCQliaCA9IHBhdGgtPnBfbm9kZVtpbmRleF0uYmg7CisJCWVsID0gcGF0aC0+cF9ub2RlW2luZGV4XS5lbDsKKworCQltbG9nKDAsICJ0cmF2ZWxpbmcgdHJlZSAoaW5kZXggPSAlZCwgYmxvY2sgPSAlbGx1KVxuIiwKKwkJICAgICBpbmRleCwgICh1bnNpZ25lZCBsb25nIGxvbmcpYmgtPmJfYmxvY2tucik7CisKKwkJQlVHX09OKGxlMTZfdG9fY3B1KGVsLT5sX25leHRfZnJlZV9yZWMpID09IDApOworCisJCWlmIChpbmRleCAhPQorCQkgICAgKHBhdGgtPnBfdHJlZV9kZXB0aCAtIGxlMTZfdG9fY3B1KGVsLT5sX3RyZWVfZGVwdGgpKSkgeworCQkJb2NmczJfZXJyb3IoaW5vZGUtPmlfc2IsCisJCQkJICAgICJJbm9kZSAlbHUgaGFzIGludmFsaWQgZXh0LiBibG9jayAlbGx1IiwKKwkJCQkgICAgaW5vZGUtPmlfaW5vLAorCQkJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKWJoLT5iX2Jsb2NrbnIpOworCQkJcmV0ID0gLUVST0ZTOworCQkJZ290byBvdXQ7CisJCX0KKworZmluZF90YWlsX3JlY29yZDoKKwkJaSA9IGxlMTZfdG9fY3B1KGVsLT5sX25leHRfZnJlZV9yZWMpIC0gMTsKKwkJcmVjID0gJmVsLT5sX3JlY3NbaV07CisKKwkJbWxvZygwLCAiRXh0ZW50IGxpc3QgYmVmb3JlOiByZWNvcmQgJWQ6ICgldSwgJXUsICVsbHUpLCAiCisJCSAgICAgIm5leHQgPSAldVxuIiwgaSwgbGUzMl90b19jcHUocmVjLT5lX2Nwb3MpLAorCQkgICAgIG9jZnMyX3JlY19jbHVzdGVycyhlbCwgcmVjKSwKKwkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKWxlNjRfdG9fY3B1KHJlYy0+ZV9ibGtubyksCisJCSAgICAgbGUxNl90b19jcHUoZWwtPmxfbmV4dF9mcmVlX3JlYykpOworCisJCUJVR19PTihvY2ZzMl9yZWNfY2x1c3RlcnMoZWwsIHJlYykgPCBjbHVzdGVyc190b19kZWwpOworCisJCWlmIChsZTE2X3RvX2NwdShlbC0+bF90cmVlX2RlcHRoKSA9PSAwKSB7CisJCQkvKgorCQkJICogSWYgdGhlIGxlYWYgYmxvY2sgY29udGFpbnMgYSBzaW5nbGUgZW1wdHkKKwkJCSAqIGV4dGVudCBhbmQgbm8gcmVjb3Jkcywgd2UgY2FuIGp1c3QgcmVtb3ZlCisJCQkgKiB0aGUgYmxvY2suCisJCQkgKi8KKwkJCWlmIChpID09IDAgJiYgb2NmczJfaXNfZW1wdHlfZXh0ZW50KHJlYykpIHsKKwkJCQltZW1zZXQocmVjLCAwLAorCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IG9jZnMyX2V4dGVudF9yZWMpKTsKKwkJCQllbC0+bF9uZXh0X2ZyZWVfcmVjID0gY3B1X3RvX2xlMTYoMCk7CisKKwkJCQlnb3RvIGRlbGV0ZTsKKwkJCX0KKworCQkJLyoKKwkJCSAqIFJlbW92ZSBhbnkgZW1wdHkgZXh0ZW50cyBieSBzaGlmdGluZyB0aGluZ3MKKwkJCSAqIGxlZnQuIFRoYXQgc2hvdWxkIG1ha2UgbGlmZSBtdWNoIGVhc2llciBvbgorCQkJICogdGhlIGNvZGUgYmVsb3cuIFRoaXMgY29uZGl0aW9uIGlzIHJhcmUKKwkJCSAqIGVub3VnaCB0aGF0IHdlIHNob3VsZG4ndCBzZWUgYSBwZXJmb3JtYW5jZQorCQkJICogaGl0LgorCQkJICovCisJCQlpZiAob2NmczJfaXNfZW1wdHlfZXh0ZW50KCZlbC0+bF9yZWNzWzBdKSkgeworCQkJCWxlMTZfYWRkX2NwdSgmZWwtPmxfbmV4dF9mcmVlX3JlYywgLTEpOworCisJCQkJZm9yKGkgPSAwOworCQkJCSAgICBpIDwgbGUxNl90b19jcHUoZWwtPmxfbmV4dF9mcmVlX3JlYyk7IGkrKykKKwkJCQkJZWwtPmxfcmVjc1tpXSA9IGVsLT5sX3JlY3NbaSArIDFdOworCisJCQkJbWVtc2V0KCZlbC0+bF9yZWNzW2ldLCAwLAorCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IG9jZnMyX2V4dGVudF9yZWMpKTsKKworCQkJCS8qCisJCQkJICogV2UndmUgbW9kaWZpZWQgb3VyIGV4dGVudCBsaXN0LiBUaGUKKwkJCQkgKiBzaW1wbGVzdCB3YXkgdG8gaGFuZGxlIHRoaXMgY2hhbmdlCisJCQkJICogaXMgdG8gYmVpbmcgdGhlIHNlYXJjaCBmcm9tIHRoZQorCQkJCSAqIHN0YXJ0IGFnYWluLgorCQkJCSAqLworCQkJCWdvdG8gZmluZF90YWlsX3JlY29yZDsKKwkJCX0KKworCQkJbGUxNl9hZGRfY3B1KCZyZWMtPmVfbGVhZl9jbHVzdGVycywgLWNsdXN0ZXJzX3RvX2RlbCk7CisKKwkJCS8qCisJCQkgKiBXZSdsbCB1c2UgIm5ld19lZGdlIiBvbiBvdXIgd2F5IGJhY2sgdXAgdGhlCisJCQkgKiB0cmVlIHRvIGtub3cgd2hhdCBvdXIgcmlnaHRtb3N0IGNwb3MgaXMuCisJCQkgKi8KKwkJCW5ld19lZGdlID0gbGUxNl90b19jcHUocmVjLT5lX2xlYWZfY2x1c3RlcnMpOworCQkJbmV3X2VkZ2UgKz0gbGUzMl90b19jcHUocmVjLT5lX2Nwb3MpOworCisJCQkvKgorCQkJICogVGhlIGNhbGxlciB3aWxsIHVzZSB0aGlzIHRvIGRlbGV0ZSBkYXRhIGJsb2Nrcy4KKwkJCSAqLworCQkJKmRlbGV0ZV9zdGFydCA9IGxlNjRfdG9fY3B1KHJlYy0+ZV9ibGtubykKKwkJCQkrIG9jZnMyX2NsdXN0ZXJzX3RvX2Jsb2Nrcyhpbm9kZS0+aV9zYiwKKwkJCQkJbGUxNl90b19jcHUocmVjLT5lX2xlYWZfY2x1c3RlcnMpKTsKKworCQkJLyoKKwkJCSAqIElmIGl0J3Mgbm93IGVtcHR5LCByZW1vdmUgdGhpcyByZWNvcmQuCisJCQkgKi8KKwkJCWlmIChsZTE2X3RvX2NwdShyZWMtPmVfbGVhZl9jbHVzdGVycykgPT0gMCkgeworCQkJCW1lbXNldChyZWMsIDAsCisJCQkJICAgICAgIHNpemVvZihzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYykpOworCQkJCWxlMTZfYWRkX2NwdSgmZWwtPmxfbmV4dF9mcmVlX3JlYywgLTEpOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKGxlNjRfdG9fY3B1KHJlYy0+ZV9ibGtubykgPT0gZGVsZXRlZF9lYikgeworCQkJCW1lbXNldChyZWMsIDAsCisJCQkJICAgICAgIHNpemVvZihzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYykpOworCQkJCWxlMTZfYWRkX2NwdSgmZWwtPmxfbmV4dF9mcmVlX3JlYywgLTEpOworCisJCQkJZ290byBkZWxldGU7CisJCQl9CisKKwkJCS8qIENhbiB0aGlzIGFjdHVhbGx5IGhhcHBlbj8gKi8KKwkJCWlmIChsZTE2X3RvX2NwdShlbC0+bF9uZXh0X2ZyZWVfcmVjKSA9PSAwKQorCQkJCWdvdG8gZGVsZXRlOworCisJCQkvKgorCQkJICogV2UgbmV2ZXIgYWN0dWFsbHkgZGVsZXRlZCBhbnkgY2x1c3RlcnMKKwkJCSAqIGJlY2F1c2Ugb3VyIGxlYWYgd2FzIGVtcHR5LiBUaGVyZSdzIG5vCisJCQkgKiByZWFzb24gdG8gYWRqdXN0IHRoZSByaWdodG1vc3QgZWRnZSB0aGVuLgorCQkJICovCisJCQlpZiAobmV3X2VkZ2UgPT0gMCkKKwkJCQlnb3RvIGRlbGV0ZTsKKworCQkJcmVjLT5lX2ludF9jbHVzdGVycyA9IGNwdV90b19sZTMyKG5ld19lZGdlKTsKKwkJCWxlMzJfYWRkX2NwdSgmcmVjLT5lX2ludF9jbHVzdGVycywKKwkJCQkgICAgIC1sZTMyX3RvX2NwdShyZWMtPmVfY3BvcykpOworCisJCQkgLyoKKwkJCSAgKiBBIGRlbGV0ZWQgY2hpbGQgcmVjb3JkIHNob3VsZCBoYXZlIGJlZW4KKwkJCSAgKiBjYXVnaHQgYWJvdmUuCisJCQkgICovCisJCQkgQlVHX09OKGxlMzJfdG9fY3B1KHJlYy0+ZV9pbnRfY2x1c3RlcnMpID09IDApOworCQl9CisKK2RlbGV0ZToKKwkJcmV0ID0gb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIGJoKTsKKwkJaWYgKHJldCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXQ7CisJCX0KKworCQltbG9nKDAsICJleHRlbnQgbGlzdCBjb250YWluZXIgJWxsdSwgYWZ0ZXI6IHJlY29yZCAlZDogIgorCQkgICAgICIoJXUsICV1LCAlbGx1KSwgbmV4dCA9ICV1LlxuIiwKKwkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKWJoLT5iX2Jsb2NrbnIsIGksCisJCSAgICAgbGUzMl90b19jcHUocmVjLT5lX2Nwb3MpLCBvY2ZzMl9yZWNfY2x1c3RlcnMoZWwsIHJlYyksCisJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylsZTY0X3RvX2NwdShyZWMtPmVfYmxrbm8pLAorCQkgICAgIGxlMTZfdG9fY3B1KGVsLT5sX25leHRfZnJlZV9yZWMpKTsKKworCQkvKgorCQkgKiBXZSBtdXN0IGJlIGNhcmVmdWwgdG8gb25seSBhdHRlbXB0IGRlbGV0ZSBvZiBhbgorCQkgKiBleHRlbnQgYmxvY2sgKGFuZCBub3QgdGhlIHJvb3QgaW5vZGUgYmxvY2spLgorCQkgKi8KKwkJaWYgKGluZGV4ID4gMCAmJiBsZTE2X3RvX2NwdShlbC0+bF9uZXh0X2ZyZWVfcmVjKSA9PSAwKSB7CisJCQlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICplYiA9CisJCQkJKHN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKiliaC0+Yl9kYXRhOworCisJCQkvKgorCQkJICogU2F2ZSB0aGlzIGZvciB1c2Ugd2hlbiBwcm9jZXNzaW5nIHRoZQorCQkJICogcGFyZW50IGJsb2NrLgorCQkJICovCisJCQlkZWxldGVkX2ViID0gbGU2NF90b19jcHUoZWItPmhfYmxrbm8pOworCisJCQltbG9nKDAsICJkZWxldGluZyB0aGlzIGV4dGVudCBibG9jay5cbiIpOworCisJCQlvY2ZzMl9yZW1vdmVfZnJvbV9jYWNoZShpbm9kZSwgYmgpOworCisJCQlCVUdfT04ob2NmczJfcmVjX2NsdXN0ZXJzKGVsLCAmZWwtPmxfcmVjc1swXSkpOworCQkJQlVHX09OKGxlMzJfdG9fY3B1KGVsLT5sX3JlY3NbMF0uZV9jcG9zKSk7CisJCQlCVUdfT04obGU2NF90b19jcHUoZWwtPmxfcmVjc1swXS5lX2Jsa25vKSk7CisKKwkJCWlmIChsZTE2X3RvX2NwdShlYi0+aF9zdWJhbGxvY19zbG90KSA9PSAwKSB7CisJCQkJLyoKKwkJCQkgKiBUaGlzIGNvZGUgb25seSB1bmRlcnN0YW5kcyBob3cgdG8KKwkJCQkgKiBsb2NrIHRoZSBzdWJhbGxvY2F0b3IgaW4gc2xvdCAwLAorCQkJCSAqIHdoaWNoIGlzIGZpbmUgYmVjYXVzZSBhbGxvY2F0aW9uIGlzCisJCQkJICogb25seSBldmVyIGRvbmUgb3V0IG9mIHRoYXQKKwkJCQkgKiBzdWJhbGxvY2F0b3IgdG9vLiBBIGZ1dHVyZSB2ZXJzaW9uCisJCQkJICogbWlnaHQgY2hhbmdlIHRoYXQgaG93ZXZlciwgc28gYXZvaWQKKwkJCQkgKiBhIGZyZWUgaWYgd2UgZG9uJ3Qga25vdyBob3cgdG8KKwkJCQkgKiBoYW5kbGUgaXQuIFRoaXMgd2F5IGFuIGZzIGluY29tcGF0CisJCQkJICogYml0IHdpbGwgbm90IGJlIG5lY2Vzc2FyeS4KKwkJCQkgKi8KKwkJCQlyZXQgPSBvY2ZzMl9mcmVlX2V4dGVudF9ibG9jayhoYW5kbGUsCisJCQkJCQkJICAgICAgdGMtPnRjX2V4dF9hbGxvY19pbm9kZSwKKwkJCQkJCQkgICAgICB0Yy0+dGNfZXh0X2FsbG9jX2JoLAorCQkJCQkJCSAgICAgIGViKTsKKworCQkJCS8qIEFuIGVycm9yIGhlcmUgaXMgbm90IGZhdGFsLiAqLworCQkJCWlmIChyZXQgPCAwKQorCQkJCQltbG9nX2Vycm5vKHJldCk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlkZWxldGVkX2ViID0gMDsKKwkJfQorCisJCWluZGV4LS07CisJfQorCisJcmV0ID0gMDsKK291dDoKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IG9jZnMyX2RvX3RydW5jYXRlKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAogCQkJICAgICB1bnNpZ25lZCBpbnQgY2x1c3RlcnNfdG9fZGVsLAogCQkJICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmZlX2JoLAotCQkJICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKm9sZF9sYXN0X2ViX2JoLAogCQkJICAgICBoYW5kbGVfdCAqaGFuZGxlLAotCQkJICAgICBzdHJ1Y3Qgb2NmczJfdHJ1bmNhdGVfY29udGV4dCAqdGMpCisJCQkgICAgIHN0cnVjdCBvY2ZzMl90cnVuY2F0ZV9jb250ZXh0ICp0YywKKwkJCSAgICAgc3RydWN0IG9jZnMyX3BhdGggKnBhdGgpCiB7Ci0JaW50IHN0YXR1cywgaSwgZGVwdGg7CisJaW50IHN0YXR1czsKIAlzdHJ1Y3Qgb2NmczJfZGlub2RlICpmZTsKLQlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICplYjsKIAlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICpsYXN0X2ViID0gTlVMTDsKIAlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKmVsOwotCXN0cnVjdCBidWZmZXJfaGVhZCAqZWJfYmggPSBOVUxMOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqbGFzdF9lYl9iaCA9IE5VTEw7Ci0JdTY0IG5leHRfZWIgPSAwOwogCXU2NCBkZWxldGVfYmxrID0gMDsKIAogCWZlID0gKHN0cnVjdCBvY2ZzMl9kaW5vZGUgKikgZmVfYmgtPmJfZGF0YTsKIAotCXN0YXR1cyA9IG9jZnMyX2ZpbmRfbmV3X2xhc3RfZXh0X2Jsayhvc2IsCi0JCQkJCSAgICAgaW5vZGUsCi0JCQkJCSAgICAgZmUsCi0JCQkJCSAgICAgbGUzMl90b19jcHUoZmUtPmlfY2x1c3RlcnMpIC0KLQkJCQkJICAgICAJCWNsdXN0ZXJzX3RvX2RlbCwKLQkJCQkJICAgICBvbGRfbGFzdF9lYl9iaCwKLQkJCQkJICAgICAmbGFzdF9lYl9iaCk7CisJc3RhdHVzID0gb2NmczJfZmluZF9uZXdfbGFzdF9leHRfYmxrKGlub2RlLCBjbHVzdGVyc190b19kZWwsCisJCQkJCSAgICAgcGF0aCwgJmxhc3RfZWJfYmgpOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJZ290byBiYWlsOwogCX0KLQlpZiAobGFzdF9lYl9iaCkKLQkJbGFzdF9lYiA9IChzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICopIGxhc3RfZWJfYmgtPmJfZGF0YTsKIAotCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIGZlX2JoLAotCQkJCSAgICAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwkvKgorCSAqIEVhY2ggY29tcG9uZW50IHdpbGwgYmUgdG91Y2hlZCwgc28gd2UgbWlnaHQgYXMgd2VsbCBqb3VybmFsCisJICogaGVyZSB0byBhdm9pZCBoYXZpbmcgdG8gaGFuZGxlIGVycm9ycyBsYXRlci4KKwkgKi8KKwlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2FjY2Vzc19wYXRoKGlub2RlLCBoYW5kbGUsIHBhdGgpOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJZ290byBiYWlsOwogCX0KKworCWlmIChsYXN0X2ViX2JoKSB7CisJCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIGxhc3RfZWJfYmgsCisJCQkJCSAgICAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwkJaWYgKHN0YXR1cyA8IDApIHsKKwkJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJCWdvdG8gYmFpbDsKKwkJfQorCisJCWxhc3RfZWIgPSAoc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqKSBsYXN0X2ViX2JoLT5iX2RhdGE7CisJfQorCiAJZWwgPSAmKGZlLT5pZDIuaV9saXN0KTsKIAorCS8qCisJICogTG93ZXIgbGV2ZWxzIGRlcGVuZCBvbiB0aGlzIG5ldmVyIGhhcHBlbmluZywgYnV0IGl0J3MgYmVzdAorCSAqIHRvIGNoZWNrIGl0IHVwIGhlcmUgYmVmb3JlIGNoYW5naW5nIHRoZSB0cmVlLgorCSAqLworCWlmIChlbC0+bF90cmVlX2RlcHRoICYmIGVsLT5sX3JlY3NbMF0uZV9pbnRfY2x1c3RlcnMgPT0gMCkgeworCQlvY2ZzMl9lcnJvcihpbm9kZS0+aV9zYiwKKwkJCSAgICAiSW5vZGUgJWx1IGhhcyBhbiBlbXB0eSBleHRlbnQgcmVjb3JkLCBkZXB0aCAldVxuIiwKKwkJCSAgICBpbm9kZS0+aV9pbm8sIGxlMTZfdG9fY3B1KGVsLT5sX3RyZWVfZGVwdGgpKTsKKwkJc3RhdHVzID0gLUVST0ZTOworCQlnb3RvIGJhaWw7CisJfQorCiAJc3Bpbl9sb2NrKCZPQ0ZTMl9JKGlub2RlKS0+aXBfbG9jayk7CiAJT0NGUzJfSShpbm9kZSktPmlwX2NsdXN0ZXJzID0gbGUzMl90b19jcHUoZmUtPmlfY2x1c3RlcnMpIC0KIAkJCQkgICAgICBjbHVzdGVyc190b19kZWw7CiAJc3Bpbl91bmxvY2soJk9DRlMyX0koaW5vZGUpLT5pcF9sb2NrKTsKIAlsZTMyX2FkZF9jcHUoJmZlLT5pX2NsdXN0ZXJzLCAtY2x1c3RlcnNfdG9fZGVsKTsKLQlmZS0+aV9tdGltZSA9IGNwdV90b19sZTY0KENVUlJFTlRfVElNRS50dl9zZWMpOwotCWZlLT5pX210aW1lX25zZWMgPSBjcHVfdG9fbGUzMihDVVJSRU5UX1RJTUUudHZfbnNlYyk7CiAKLQlpID0gbGUxNl90b19jcHUoZWwtPmxfbmV4dF9mcmVlX3JlYykgLSAxOwotCi0JQlVHX09OKGxlMzJfdG9fY3B1KGVsLT5sX3JlY3NbaV0uZV9jbHVzdGVycykgPCBjbHVzdGVyc190b19kZWwpOwotCWxlMzJfYWRkX2NwdSgmZWwtPmxfcmVjc1tpXS5lX2NsdXN0ZXJzLCAtY2x1c3RlcnNfdG9fZGVsKTsKLQkvKiB0cmVlIGRlcHRoIHplcm8sIHdlIGNhbiBqdXN0IGRlbGV0ZSB0aGUgY2x1c3RlcnMsIG90aGVyd2lzZQotCSAqIHdlIG5lZWQgdG8gcmVjb3JkIHRoZSBvZmZzZXQgb2YgdGhlIG5leHQgbGV2ZWwgZXh0ZW50IGJsb2NrCi0JICogYXMgd2UgbWF5IG92ZXJ3cml0ZSBpdC4gKi8KLQlpZiAoIWVsLT5sX3RyZWVfZGVwdGgpCi0JCWRlbGV0ZV9ibGsgPSBsZTY0X3RvX2NwdShlbC0+bF9yZWNzW2ldLmVfYmxrbm8pCi0JCQkrIG9jZnMyX2NsdXN0ZXJzX3RvX2Jsb2Nrcyhvc2ItPnNiLAotCQkJCQlsZTMyX3RvX2NwdShlbC0+bF9yZWNzW2ldLmVfY2x1c3RlcnMpKTsKLQllbHNlCi0JCW5leHRfZWIgPSBsZTY0X3RvX2NwdShlbC0+bF9yZWNzW2ldLmVfYmxrbm8pOwotCi0JaWYgKCFlbC0+bF9yZWNzW2ldLmVfY2x1c3RlcnMpIHsKLQkJLyogaWYgd2UgZGVsZXRlZCB0aGUgd2hvbGUgZXh0ZW50IHJlY29yZCwgdGhlbiBjbGVhcgotCQkgKiBvdXQgdGhlIG90aGVyIGZpZWxkcyBhbmQgdXBkYXRlIHRoZSBleHRlbnQKLQkJICogbGlzdC4gRm9yIGRlcHRoID4gMCB0cmVlcywgd2UndmUgYWxyZWFkeSByZWNvcmRlZAotCQkgKiB0aGUgZXh0ZW50IGJsb2NrIGluICduZXh0X2ViJyAqLwotCQllbC0+bF9yZWNzW2ldLmVfY3BvcyA9IDA7Ci0JCWVsLT5sX3JlY3NbaV0uZV9ibGtubyA9IDA7Ci0JCUJVR19PTighZWwtPmxfbmV4dF9mcmVlX3JlYyk7Ci0JCWxlMTZfYWRkX2NwdSgmZWwtPmxfbmV4dF9mcmVlX3JlYywgLTEpOworCXN0YXR1cyA9IG9jZnMyX3RyaW1fdHJlZShpbm9kZSwgcGF0aCwgaGFuZGxlLCB0YywKKwkJCQkgY2x1c3RlcnNfdG9fZGVsLCAmZGVsZXRlX2Jsayk7CisJaWYgKHN0YXR1cykgeworCQltbG9nX2Vycm5vKHN0YXR1cyk7CisJCWdvdG8gYmFpbDsKIAl9CiAKLQlkZXB0aCA9IGxlMTZfdG9fY3B1KGVsLT5sX3RyZWVfZGVwdGgpOwotCWlmICghZmUtPmlfY2x1c3RlcnMpIHsKKwlpZiAobGUzMl90b19jcHUoZmUtPmlfY2x1c3RlcnMpID09IDApIHsKIAkJLyogdHJ1bmMgdG8gemVybyBpcyBhIHNwZWNpYWwgY2FzZS4gKi8KIAkJZWwtPmxfdHJlZV9kZXB0aCA9IDA7CiAJCWZlLT5pX2xhc3RfZWJfYmxrID0gMDsKQEAgLTE2MjUsMTIgKzMzNjAsNiBAQAogCQkvKiBJZiB0aGVyZSB3aWxsIGJlIGEgbmV3IGxhc3QgZXh0ZW50IGJsb2NrLCB0aGVuIGJ5CiAJCSAqIGRlZmluaXRpb24sIHRoZXJlIGNhbm5vdCBiZSBhbnkgbGVhdmVzIHRvIHRoZSByaWdodCBvZgogCQkgKiBoaW0uICovCi0JCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIGxhc3RfZWJfYmgsCi0JCQkJCSAgICAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKLQkJaWYgKHN0YXR1cyA8IDApIHsKLQkJCW1sb2dfZXJybm8oc3RhdHVzKTsKLQkJCWdvdG8gYmFpbDsKLQkJfQogCQlsYXN0X2ViLT5oX25leHRfbGVhZl9ibGsgPSAwOwogCQlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgbGFzdF9lYl9iaCk7CiAJCWlmIChzdGF0dXMgPCAwKSB7CkBAIC0xNjM5LDEyNSArMzM2OCwyNDkgQEAKIAkJfQogCX0KIAotCS8qIGlmIG91ciB0cmVlIGRlcHRoID4gMCwgdXBkYXRlIGFsbCB0aGUgdHJlZSBibG9ja3MgYmVsb3cgdXMuICovCi0Jd2hpbGUgKGRlcHRoKSB7Ci0JCW1sb2coMCwgInRyYXZlbGluZyB0cmVlIChkZXB0aCA9ICVkLCBuZXh0X2ViID0gJWxsdSlcbiIsCi0JCSAgICAgZGVwdGgsICAodW5zaWduZWQgbG9uZyBsb25nKW5leHRfZWIpOwotCQlzdGF0dXMgPSBvY2ZzMl9yZWFkX2Jsb2NrKG9zYiwgbmV4dF9lYiwgJmViX2JoLAotCQkJCQkgIE9DRlMyX0JIX0NBQ0hFRCwgaW5vZGUpOworCWlmIChkZWxldGVfYmxrKSB7CisJCXN0YXR1cyA9IG9jZnMyX3RydW5jYXRlX2xvZ19hcHBlbmQob3NiLCBoYW5kbGUsIGRlbGV0ZV9ibGssCisJCQkJCQkgICBjbHVzdGVyc190b19kZWwpOwogCQlpZiAoc3RhdHVzIDwgMCkgewogCQkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQkJZ290byBiYWlsOwogCQl9Ci0JCWViID0gKHN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKillYl9iaC0+Yl9kYXRhOwotCQlpZiAoIU9DRlMyX0lTX1ZBTElEX0VYVEVOVF9CTE9DSyhlYikpIHsKLQkJCU9DRlMyX1JPX09OX0lOVkFMSURfRVhURU5UX0JMT0NLKGlub2RlLT5pX3NiLCBlYik7Ci0JCQlzdGF0dXMgPSAtRUlPOwotCQkJZ290byBiYWlsOwotCQl9Ci0JCWVsID0gJihlYi0+aF9saXN0KTsKLQotCQlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCBlYl9iaCwKLQkJCQkJICAgICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOwotCQlpZiAoc3RhdHVzIDwgMCkgewotCQkJbWxvZ19lcnJubyhzdGF0dXMpOwotCQkJZ290byBiYWlsOwotCQl9Ci0KLQkJQlVHX09OKGxlMTZfdG9fY3B1KGVsLT5sX25leHRfZnJlZV9yZWMpID09IDApOwotCQlCVUdfT04oZGVwdGggIT0gKGxlMTZfdG9fY3B1KGVsLT5sX3RyZWVfZGVwdGgpICsgMSkpOwotCi0JCWkgPSBsZTE2X3RvX2NwdShlbC0+bF9uZXh0X2ZyZWVfcmVjKSAtIDE7Ci0KLQkJbWxvZygwLCAiZXh0ZW50IGJsb2NrICVsbHUsIGJlZm9yZTogcmVjb3JkICVkOiAiCi0JCSAgICAgIigldSwgJXUsICVsbHUpLCBuZXh0ID0gJXVcbiIsCi0JCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylsZTY0X3RvX2NwdShlYi0+aF9ibGtubyksIGksCi0JCSAgICAgbGUzMl90b19jcHUoZWwtPmxfcmVjc1tpXS5lX2Nwb3MpLAotCQkgICAgIGxlMzJfdG9fY3B1KGVsLT5sX3JlY3NbaV0uZV9jbHVzdGVycyksCi0JCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylsZTY0X3RvX2NwdShlbC0+bF9yZWNzW2ldLmVfYmxrbm8pLAotCQkgICAgIGxlMTZfdG9fY3B1KGVsLT5sX25leHRfZnJlZV9yZWMpKTsKLQotCQlCVUdfT04obGUzMl90b19jcHUoZWwtPmxfcmVjc1tpXS5lX2NsdXN0ZXJzKSA8IGNsdXN0ZXJzX3RvX2RlbCk7Ci0JCWxlMzJfYWRkX2NwdSgmZWwtPmxfcmVjc1tpXS5lX2NsdXN0ZXJzLCAtY2x1c3RlcnNfdG9fZGVsKTsKLQotCQluZXh0X2ViID0gbGU2NF90b19jcHUoZWwtPmxfcmVjc1tpXS5lX2Jsa25vKTsKLQkJLyogYm90dG9tLW1vc3QgYmxvY2sgcmVxdWlyZXMgdXMgdG8gZGVsZXRlIGRhdGEuKi8KLQkJaWYgKCFlbC0+bF90cmVlX2RlcHRoKQotCQkJZGVsZXRlX2JsayA9IGxlNjRfdG9fY3B1KGVsLT5sX3JlY3NbaV0uZV9ibGtubykKLQkJCQkrIG9jZnMyX2NsdXN0ZXJzX3RvX2Jsb2Nrcyhvc2ItPnNiLAotCQkJCQlsZTMyX3RvX2NwdShlbC0+bF9yZWNzW2ldLmVfY2x1c3RlcnMpKTsKLQkJaWYgKCFlbC0+bF9yZWNzW2ldLmVfY2x1c3RlcnMpIHsKLQkJCWVsLT5sX3JlY3NbaV0uZV9jcG9zID0gMDsKLQkJCWVsLT5sX3JlY3NbaV0uZV9ibGtubyA9IDA7Ci0JCQlCVUdfT04oIWVsLT5sX25leHRfZnJlZV9yZWMpOwotCQkJbGUxNl9hZGRfY3B1KCZlbC0+bF9uZXh0X2ZyZWVfcmVjLCAtMSk7Ci0JCX0KLQkJbWxvZygwLCAiZXh0ZW50IGJsb2NrICVsbHUsIGFmdGVyOiByZWNvcmQgJWQ6ICIKLQkJICAgICAiKCV1LCAldSwgJWxsdSksIG5leHQgPSAldVxuIiwKLQkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKWxlNjRfdG9fY3B1KGViLT5oX2Jsa25vKSwgaSwKLQkJICAgICBsZTMyX3RvX2NwdShlbC0+bF9yZWNzW2ldLmVfY3BvcyksCi0JCSAgICAgbGUzMl90b19jcHUoZWwtPmxfcmVjc1tpXS5lX2NsdXN0ZXJzKSwKLQkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKWxlNjRfdG9fY3B1KGVsLT5sX3JlY3NbaV0uZV9ibGtubyksCi0JCSAgICAgbGUxNl90b19jcHUoZWwtPmxfbmV4dF9mcmVlX3JlYykpOwotCi0JCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCBlYl9iaCk7Ci0JCWlmIChzdGF0dXMgPCAwKSB7Ci0JCQltbG9nX2Vycm5vKHN0YXR1cyk7Ci0JCQlnb3RvIGJhaWw7Ci0JCX0KLQotCQlpZiAoIWVsLT5sX25leHRfZnJlZV9yZWMpIHsKLQkJCW1sb2coMCwgImRlbGV0aW5nIHRoaXMgZXh0ZW50IGJsb2NrLlxuIik7Ci0KLQkJCW9jZnMyX3JlbW92ZV9mcm9tX2NhY2hlKGlub2RlLCBlYl9iaCk7Ci0KLQkJCUJVR19PTihlbC0+bF9yZWNzWzBdLmVfY2x1c3RlcnMpOwotCQkJQlVHX09OKGVsLT5sX3JlY3NbMF0uZV9jcG9zKTsKLQkJCUJVR19PTihlbC0+bF9yZWNzWzBdLmVfYmxrbm8pOwotCQkJaWYgKGViLT5oX3N1YmFsbG9jX3Nsb3QgPT0gMCkgewotCQkJCS8qCi0JCQkJICogVGhpcyBjb2RlIG9ubHkgdW5kZXJzdGFuZHMgaG93IHRvCi0JCQkJICogbG9jayB0aGUgc3ViYWxsb2NhdG9yIGluIHNsb3QgMCwKLQkJCQkgKiB3aGljaCBpcyBmaW5lIGJlY2F1c2UgYWxsb2NhdGlvbiBpcwotCQkJCSAqIG9ubHkgZXZlciBkb25lIG91dCBvZiB0aGF0Ci0JCQkJICogc3ViYWxsb2NhdG9yIHRvby4gQSBmdXR1cmUgdmVyc2lvbgotCQkJCSAqIG1pZ2h0IGNoYW5nZSB0aGF0IGhvd2V2ZXIsIHNvIGF2b2lkCi0JCQkJICogYSBmcmVlIGlmIHdlIGRvbid0IGtub3cgaG93IHRvCi0JCQkJICogaGFuZGxlIGl0LiBUaGlzIHdheSBhbiBmcyBpbmNvbXBhdAotCQkJCSAqIGJpdCB3aWxsIG5vdCBiZSBuZWNlc3NhcnkuCi0JCQkJICovCi0JCQkJc3RhdHVzID0gb2NmczJfZnJlZV9leHRlbnRfYmxvY2soaGFuZGxlLAotCQkJCQkJCQkgdGMtPnRjX2V4dF9hbGxvY19pbm9kZSwKLQkJCQkJCQkJIHRjLT50Y19leHRfYWxsb2NfYmgsCi0JCQkJCQkJCSBlYik7Ci0JCQkJaWYgKHN0YXR1cyA8IDApIHsKLQkJCQkJbWxvZ19lcnJubyhzdGF0dXMpOwotCQkJCQlnb3RvIGJhaWw7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWJyZWxzZShlYl9iaCk7Ci0JCWViX2JoID0gTlVMTDsKLQkJZGVwdGgtLTsKLQl9Ci0KLQlCVUdfT04oIWRlbGV0ZV9ibGspOwotCXN0YXR1cyA9IG9jZnMyX3RydW5jYXRlX2xvZ19hcHBlbmQob3NiLCBoYW5kbGUsIGRlbGV0ZV9ibGssCi0JCQkJCSAgIGNsdXN0ZXJzX3RvX2RlbCk7Ci0JaWYgKHN0YXR1cyA8IDApIHsKLQkJbWxvZ19lcnJubyhzdGF0dXMpOwotCQlnb3RvIGJhaWw7CiAJfQogCXN0YXR1cyA9IDA7CiBiYWlsOgotCWlmICghc3RhdHVzKQotCQlvY2ZzMl9leHRlbnRfbWFwX3RydW5jKGlub2RlLCBsZTMyX3RvX2NwdShmZS0+aV9jbHVzdGVycykpOwotCWVsc2UKLQkJb2NmczJfZXh0ZW50X21hcF9kcm9wKGlub2RlLCAwKTsKKwogCW1sb2dfZXhpdChzdGF0dXMpOwogCXJldHVybiBzdGF0dXM7CiB9CiAKK3N0YXRpYyBpbnQgb2NmczJfd3JpdGViYWNrX3plcm9fZnVuYyhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOworCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvY2ZzMl9vcmRlcmVkX3plcm9fZnVuYyhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOworCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKKwlyZXR1cm4gb2NmczJfam91cm5hbF9kaXJ0eV9kYXRhKGhhbmRsZSwgYmgpOworfQorCitzdGF0aWMgdm9pZCBvY2ZzMl96ZXJvX2NsdXN0ZXJfcGFnZXMoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IGlzaXplLAorCQkJCSAgICAgc3RydWN0IHBhZ2UgKipwYWdlcywgaW50IG51bXBhZ2VzLAorCQkJCSAgICAgdTY0IHBoeXMsIGhhbmRsZV90ICpoYW5kbGUpCit7CisJaW50IGksIHJldCwgcGFydGlhbCA9IDA7CisJdm9pZCAqa2FkZHI7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJdW5zaWduZWQgaW50IGZyb20sIHRvID0gUEFHRV9DQUNIRV9TSVpFOworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKworCUJVR19PTighb2NmczJfc3BhcnNlX2FsbG9jKE9DRlMyX1NCKHNiKSkpOworCisJaWYgKG51bXBhZ2VzID09IDApCisJCWdvdG8gb3V0OworCisJZnJvbSA9IGlzaXplICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpOyAvKiAxc3QgcGFnZSBvZmZzZXQgKi8KKwlpZiAoUEFHRV9DQUNIRV9TSElGVCA+IE9DRlMyX1NCKHNiKS0+c19jbHVzdGVyc2l6ZV9iaXRzKSB7CisJCS8qCisJCSAqIFNpbmNlICdmcm9tJyBoYXMgYmVlbiBjYXBwZWQgdG8gYSB2YWx1ZSBiZWxvdyBwYWdlCisJCSAqIHNpemUsIHRoaXMgY2FsY3VsYXRpb24gd29uJ3QgYmUgYWJsZSB0byBvdmVyZmxvdworCQkgKiAndG8nCisJCSAqLworCQl0byA9IG9jZnMyX2FsaWduX2J5dGVzX3RvX2NsdXN0ZXJzKHNiLCBmcm9tKTsKKworCQkvKgorCQkgKiBUaGUgdHJ1bmNhdGUgdGFpbCBpbiB0aGlzIGNhc2Ugc2hvdWxkIG5ldmVyIGNvbnRhaW4KKwkJICogbW9yZSB0aGFuIG9uZSBwYWdlIGF0IG1heGltdW0uIFRoZSBsb29wIGJlbG93IGFsc28KKwkJICogYXNzdW1lcyB0aGlzLgorCQkgKi8KKwkJQlVHX09OKG51bXBhZ2VzICE9IDEpOworCX0KKworCWZvcihpID0gMDsgaSA8IG51bXBhZ2VzOyBpKyspIHsKKwkJcGFnZSA9IHBhZ2VzW2ldOworCisJCUJVR19PTihmcm9tID4gUEFHRV9DQUNIRV9TSVpFKTsKKwkJQlVHX09OKHRvID4gUEFHRV9DQUNIRV9TSVpFKTsKKworCQlyZXQgPSBvY2ZzMl9tYXBfcGFnZV9ibG9ja3MocGFnZSwgJnBoeXMsIGlub2RlLCBmcm9tLCB0bywgMCk7CisJCWlmIChyZXQpCisJCQltbG9nX2Vycm5vKHJldCk7CisKKwkJa2FkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CisJCW1lbXNldChrYWRkciArIGZyb20sIDAsIHRvIC0gZnJvbSk7CisJCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKKworCQkvKgorCQkgKiBOZWVkIHRvIHNldCB0aGUgYnVmZmVycyB3ZSB6ZXJvJ2QgaW50byB1cHRvZGF0ZQorCQkgKiBoZXJlIGlmIHRoZXkgYXJlbid0IC0gb2NmczJfbWFwX3BhZ2VfYmxvY2tzKCkKKwkJICogbWlnaHQndmUgc2tpcHBlZCBzb21lCisJCSAqLworCQlpZiAob2NmczJfc2hvdWxkX29yZGVyX2RhdGEoaW5vZGUpKSB7CisJCQlyZXQgPSB3YWxrX3BhZ2VfYnVmZmVycyhoYW5kbGUsCisJCQkJCQlwYWdlX2J1ZmZlcnMocGFnZSksCisJCQkJCQlmcm9tLCB0bywgJnBhcnRpYWwsCisJCQkJCQlvY2ZzMl9vcmRlcmVkX3plcm9fZnVuYyk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQltbG9nX2Vycm5vKHJldCk7CisJCX0gZWxzZSB7CisJCQlyZXQgPSB3YWxrX3BhZ2VfYnVmZmVycyhoYW5kbGUsIHBhZ2VfYnVmZmVycyhwYWdlKSwKKwkJCQkJCWZyb20sIHRvLCAmcGFydGlhbCwKKwkJCQkJCW9jZnMyX3dyaXRlYmFja196ZXJvX2Z1bmMpOworCQkJaWYgKHJldCA8IDApCisJCQkJbWxvZ19lcnJubyhyZXQpOworCQl9CisKKwkJaWYgKCFwYXJ0aWFsKQorCQkJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOworCisJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCisJCS8qCisJCSAqIEV2ZXJ5IHBhZ2UgYWZ0ZXIgdGhlIDFzdCBvbmUgc2hvdWxkIGJlIGNvbXBsZXRlbHkgemVybydkLgorCQkgKi8KKwkJZnJvbSA9IDA7CisJfQorb3V0OgorCWlmIChwYWdlcykgeworCQlmb3IgKGkgPSAwOyBpIDwgbnVtcGFnZXM7IGkrKykgeworCQkJcGFnZSA9IHBhZ2VzW2ldOworCQkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCQltYXJrX3BhZ2VfYWNjZXNzZWQocGFnZSk7CisJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgb2NmczJfZ3JhYl9lb2ZfcGFnZXMoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IGlzaXplLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLAorCQkJCWludCAqbnVtLCB1NjQgKnBoeXMpCit7CisJaW50IGksIG51bXBhZ2VzID0gMCwgcmV0ID0gMDsKKwl1bnNpZ25lZCBpbnQgY3NpemUgPSBPQ0ZTMl9TQihpbm9kZS0+aV9zYiktPnNfY2x1c3RlcnNpemU7CisJdW5zaWduZWQgaW50IGV4dF9mbGFnczsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBpbm9kZS0+aV9tYXBwaW5nOworCXVuc2lnbmVkIGxvbmcgaW5kZXg7CisJdTY0IG5leHRfY2x1c3Rlcl9ieXRlczsKKworCUJVR19PTighb2NmczJfc3BhcnNlX2FsbG9jKE9DRlMyX1NCKHNiKSkpOworCisJLyogQ2x1c3RlciBib3VuZGFyeSwgc28gd2UgZG9uJ3QgbmVlZCB0byBncmFiIGFueSBwYWdlcy4gKi8KKwlpZiAoKGlzaXplICYgKGNzaXplIC0gMSkpID09IDApCisJCWdvdG8gb3V0OworCisJcmV0ID0gb2NmczJfZXh0ZW50X21hcF9nZXRfYmxvY2tzKGlub2RlLCBpc2l6ZSA+PiBzYi0+c19ibG9ja3NpemVfYml0cywKKwkJCQkJICBwaHlzLCBOVUxMLCAmZXh0X2ZsYWdzKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogVGFpbCBpcyBhIGhvbGUuICovCisJaWYgKCpwaHlzID09IDApCisJCWdvdG8gb3V0OworCisJLyogVGFpbCBpcyBtYXJrZWQgYXMgdW53cml0dGVuLCB3ZSBjYW4gY291bnQgb24gd3JpdGUgdG8gemVybworCSAqIGluIHRoYXQgY2FzZS4gKi8KKwlpZiAoZXh0X2ZsYWdzICYgT0NGUzJfRVhUX1VOV1JJVFRFTikKKwkJZ290byBvdXQ7CisKKwluZXh0X2NsdXN0ZXJfYnl0ZXMgPSBvY2ZzMl9hbGlnbl9ieXRlc190b19jbHVzdGVycyhpbm9kZS0+aV9zYiwgaXNpemUpOworCWluZGV4ID0gaXNpemUgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwlkbyB7CisJCXBhZ2VzW251bXBhZ2VzXSA9IGdyYWJfY2FjaGVfcGFnZShtYXBwaW5nLCBpbmRleCk7CisJCWlmICghcGFnZXNbbnVtcGFnZXNdKSB7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXQ7CisJCX0KKworCQludW1wYWdlcysrOworCQlpbmRleCsrOworCX0gd2hpbGUgKGluZGV4IDwgKG5leHRfY2x1c3Rlcl9ieXRlcyA+PiBQQUdFX0NBQ0hFX1NISUZUKSk7CisKK291dDoKKwlpZiAocmV0ICE9IDApIHsKKwkJaWYgKHBhZ2VzKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgbnVtcGFnZXM7IGkrKykgeworCQkJCWlmIChwYWdlc1tpXSkgeworCQkJCQl1bmxvY2tfcGFnZShwYWdlc1tpXSk7CisJCQkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlc1tpXSk7CisJCQkJfQorCQkJfQorCQl9CisJCW51bXBhZ2VzID0gMDsKKwl9CisKKwkqbnVtID0gbnVtcGFnZXM7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogWmVybyB0aGUgYXJlYSBwYXN0IGlfc2l6ZSBidXQgc3RpbGwgd2l0aGluIGFuIGFsbG9jYXRlZAorICogY2x1c3Rlci4gVGhpcyBhdm9pZHMgZXhwb3Npbmcgbm9uemVybyBkYXRhIG9uIHN1YnNlcXVlbnQgZmlsZQorICogZXh0ZW5kcy4KKyAqCisgKiBXZSBuZWVkIHRvIGNhbGwgdGhpcyBiZWZvcmUgaV9zaXplIGlzIHVwZGF0ZWQgb24gdGhlIGlub2RlIGJlY2F1c2UKKyAqIG90aGVyd2lzZSBibG9ja193cml0ZV9mdWxsX3BhZ2UoKSB3aWxsIHNraXAgd3JpdGVvdXQgb2YgcGFnZXMgcGFzdAorICogaV9zaXplLiBUaGUgbmV3X2lfc2l6ZSBwYXJhbWV0ZXIgaXMgcGFzc2VkIGZvciB0aGlzIHJlYXNvbi4KKyAqLworaW50IG9jZnMyX3plcm9fdGFpbF9mb3JfdHJ1bmNhdGUoc3RydWN0IGlub2RlICppbm9kZSwgaGFuZGxlX3QgKmhhbmRsZSwKKwkJCQkgdTY0IG5ld19pX3NpemUpCit7CisJaW50IHJldCwgbnVtcGFnZXM7CisJbG9mZl90IGVuZGJ5dGU7CisJc3RydWN0IHBhZ2UgKipwYWdlcyA9IE5VTEw7CisJdTY0IHBoeXM7CisKKwkvKgorCSAqIEZpbGUgc3lzdGVtcyB3aGljaCBkb24ndCBzdXBwb3J0IHNwYXJzZSBmaWxlcyB6ZXJvIG9uIGV2ZXJ5CisJICogZXh0ZW5kLgorCSAqLworCWlmICghb2NmczJfc3BhcnNlX2FsbG9jKE9DRlMyX1NCKGlub2RlLT5pX3NiKSkpCisJCXJldHVybiAwOworCisJcGFnZXMgPSBrY2FsbG9jKG9jZnMyX3BhZ2VzX3Blcl9jbHVzdGVyKGlub2RlLT5pX3NiKSwKKwkJCXNpemVvZihzdHJ1Y3QgcGFnZSAqKSwgR0ZQX05PRlMpOworCWlmIChwYWdlcyA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gb2NmczJfZ3JhYl9lb2ZfcGFnZXMoaW5vZGUsIG5ld19pX3NpemUsIHBhZ2VzLCAmbnVtcGFnZXMsICZwaHlzKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKG51bXBhZ2VzID09IDApCisJCWdvdG8gb3V0OworCisJb2NmczJfemVyb19jbHVzdGVyX3BhZ2VzKGlub2RlLCBuZXdfaV9zaXplLCBwYWdlcywgbnVtcGFnZXMsIHBoeXMsCisJCQkJIGhhbmRsZSk7CisKKwkvKgorCSAqIEluaXRpYXRlIHdyaXRlb3V0IG9mIHRoZSBwYWdlcyB3ZSB6ZXJvJ2QgaGVyZS4gV2UgZG9uJ3QKKwkgKiB3YWl0IG9uIHRoZW0gLSB0aGUgdHJ1bmNhdGVfaW5vZGVfcGFnZXMoKSBjYWxsIGxhdGVyIHdpbGwKKwkgKiBkbyB0aGF0IGZvciB1cy4KKwkgKi8KKwllbmRieXRlID0gb2NmczJfYWxpZ25fYnl0ZXNfdG9fY2x1c3RlcnMoaW5vZGUtPmlfc2IsIG5ld19pX3NpemUpOworCXJldCA9IGRvX3N5bmNfbWFwcGluZ19yYW5nZShpbm9kZS0+aV9tYXBwaW5nLCBuZXdfaV9zaXplLAorCQkJCSAgICBlbmRieXRlIC0gMSwgU1lOQ19GSUxFX1JBTkdFX1dSSVRFKTsKKwlpZiAocmV0KQorCQltbG9nX2Vycm5vKHJldCk7CisKK291dDoKKwlpZiAocGFnZXMpCisJCWtmcmVlKHBhZ2VzKTsKKworCXJldHVybiByZXQ7Cit9CisKIC8qCiAgKiBJdCBpcyBleHBlY3RlZCwgdGhhdCBieSB0aGUgdGltZSB5b3UgY2FsbCB0aGlzIGZ1bmN0aW9uLAogICogaW5vZGUtPmlfc2l6ZSBhbmQgZmUtPmlfc2l6ZSBoYXZlIGJlZW4gYWRqdXN0ZWQuCkBAIC0xNzcwLDgyICszNjIzLDkwIEBACiAJCQkgIHN0cnVjdCBvY2ZzMl90cnVuY2F0ZV9jb250ZXh0ICp0YykKIHsKIAlpbnQgc3RhdHVzLCBpLCBjcmVkaXRzLCB0bF9zZW0gPSAwOwotCXUzMiBjbHVzdGVyc190b19kZWwsIHRhcmdldF9pX2NsdXN0ZXJzOwotCXU2NCBsYXN0X2ViID0gMDsKLQlzdHJ1Y3Qgb2NmczJfZGlub2RlICpmZTsKLQlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICplYjsKKwl1MzIgY2x1c3RlcnNfdG9fZGVsLCBuZXdfaGlnaGVzdF9jcG9zLCByYW5nZTsKIAlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKmVsOwotCXN0cnVjdCBidWZmZXJfaGVhZCAqbGFzdF9lYl9iaDsKIAloYW5kbGVfdCAqaGFuZGxlID0gTlVMTDsKIAlzdHJ1Y3QgaW5vZGUgKnRsX2lub2RlID0gb3NiLT5vc2JfdGxfaW5vZGU7CisJc3RydWN0IG9jZnMyX3BhdGggKnBhdGggPSBOVUxMOwogCiAJbWxvZ19lbnRyeV92b2lkKCk7CiAKIAlkb3duX3dyaXRlKCZPQ0ZTMl9JKGlub2RlKS0+aXBfYWxsb2Nfc2VtKTsKIAotCXRhcmdldF9pX2NsdXN0ZXJzID0gb2NmczJfY2x1c3RlcnNfZm9yX2J5dGVzKG9zYi0+c2IsCisJbmV3X2hpZ2hlc3RfY3BvcyA9IG9jZnMyX2NsdXN0ZXJzX2Zvcl9ieXRlcyhvc2ItPnNiLAogCQkJCQkJICAgICBpX3NpemVfcmVhZChpbm9kZSkpOwogCi0JbGFzdF9lYl9iaCA9IHRjLT50Y19sYXN0X2ViX2JoOwotCXRjLT50Y19sYXN0X2ViX2JoID0gTlVMTDsKLQotCWZlID0gKHN0cnVjdCBvY2ZzMl9kaW5vZGUgKikgZmVfYmgtPmJfZGF0YTsKLQotCWlmIChmZS0+aWQyLmlfbGlzdC5sX3RyZWVfZGVwdGgpIHsKLQkJZWIgPSAoc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqKSBsYXN0X2ViX2JoLT5iX2RhdGE7Ci0JCWVsID0gJmViLT5oX2xpc3Q7Ci0JfSBlbHNlCi0JCWVsID0gJmZlLT5pZDIuaV9saXN0OwotCWxhc3RfZWIgPSBsZTY0X3RvX2NwdShmZS0+aV9sYXN0X2ViX2Jsayk7Ci1zdGFydDoKLQltbG9nKDAsICJvY2ZzMl9jb21taXRfdHJ1bmNhdGU6IGZlLT5pX2NsdXN0ZXJzID0gJXUsICIKLQkgICAgICJsYXN0X2ViID0gJWxsdSwgZmUtPmlfbGFzdF9lYl9ibGsgPSAlbGx1LCAiCi0JICAgICAiZmUtPmlkMi5pX2xpc3QubF90cmVlX2RlcHRoID0gJXUgbGFzdF9lYl9iaCA9ICVwXG4iLAotCSAgICAgbGUzMl90b19jcHUoZmUtPmlfY2x1c3RlcnMpLCAodW5zaWduZWQgbG9uZyBsb25nKWxhc3RfZWIsCi0JICAgICAodW5zaWduZWQgbG9uZyBsb25nKWxlNjRfdG9fY3B1KGZlLT5pX2xhc3RfZWJfYmxrKSwKLQkgICAgIGxlMTZfdG9fY3B1KGZlLT5pZDIuaV9saXN0LmxfdHJlZV9kZXB0aCksIGxhc3RfZWJfYmgpOwotCi0JaWYgKGxhc3RfZWIgIT0gbGU2NF90b19jcHUoZmUtPmlfbGFzdF9lYl9ibGspKSB7Ci0JCW1sb2coMCwgImxhc3RfZWIgY2hhbmdlZCFcbiIpOwotCQlCVUdfT04oIWZlLT5pZDIuaV9saXN0LmxfdHJlZV9kZXB0aCk7Ci0JCWxhc3RfZWIgPSBsZTY0X3RvX2NwdShmZS0+aV9sYXN0X2ViX2Jsayk7Ci0JCS8qIGlfbGFzdF9lYl9ibGsgbWF5IGhhdmUgY2hhbmdlZCwgcmVhZCBpdCBpZgotCQkgKiBuZWNlc3NhcnkuIFdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgdGhlCi0JCSAqIHRydW5jYXRlIHRvIHplcm8gY2FzZSBoZXJlICh3aGVyZSB0aGVyZSBiZWNvbWVzIG5vCi0JCSAqIGxhc3RfZWIpIGJlY2F1c2Ugd2UgbmV2ZXIgbG9vcCBiYWNrIGFmdGVyIG91ciB3b3JrCi0JCSAqIGlzIGRvbmUuICovCi0JCWlmIChsYXN0X2ViX2JoKSB7Ci0JCQlicmVsc2UobGFzdF9lYl9iaCk7Ci0JCQlsYXN0X2ViX2JoID0gTlVMTDsKLQkJfQotCi0JCXN0YXR1cyA9IG9jZnMyX3JlYWRfYmxvY2sob3NiLCBsYXN0X2ViLAotCQkJCQkgICZsYXN0X2ViX2JoLCBPQ0ZTMl9CSF9DQUNIRUQsCi0JCQkJCSAgaW5vZGUpOwotCQlpZiAoc3RhdHVzIDwgMCkgewotCQkJbWxvZ19lcnJubyhzdGF0dXMpOwotCQkJZ290byBiYWlsOwotCQl9Ci0JCWViID0gKHN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKikgbGFzdF9lYl9iaC0+Yl9kYXRhOwotCQlpZiAoIU9DRlMyX0lTX1ZBTElEX0VYVEVOVF9CTE9DSyhlYikpIHsKLQkJCU9DRlMyX1JPX09OX0lOVkFMSURfRVhURU5UX0JMT0NLKGlub2RlLT5pX3NiLCBlYik7Ci0JCQlzdGF0dXMgPSAtRUlPOwotCQkJZ290byBiYWlsOwotCQl9Ci0JCWVsID0gJihlYi0+aF9saXN0KTsKKwlwYXRoID0gb2NmczJfbmV3X2lub2RlX3BhdGgoZmVfYmgpOworCWlmICghcGF0aCkgeworCQlzdGF0dXMgPSAtRU5PTUVNOworCQltbG9nX2Vycm5vKHN0YXR1cyk7CisJCWdvdG8gYmFpbDsKIAl9CiAKLQkvKiBieSBub3csIGVsIHdpbGwgcG9pbnQgdG8gdGhlIGV4dGVudCBsaXN0IG9uIHRoZSBib3R0b20gbW9zdAotCSAqIHBvcnRpb24gb2YgdGhpcyB0cmVlLiAqLwotCWkgPSBsZTE2X3RvX2NwdShlbC0+bF9uZXh0X2ZyZWVfcmVjKSAtIDE7Ci0JaWYgKGxlMzJfdG9fY3B1KGVsLT5sX3JlY3NbaV0uZV9jcG9zKSA+PSB0YXJnZXRfaV9jbHVzdGVycykKLQkJY2x1c3RlcnNfdG9fZGVsID0gbGUzMl90b19jcHUoZWwtPmxfcmVjc1tpXS5lX2NsdXN0ZXJzKTsKLQllbHNlCi0JCWNsdXN0ZXJzX3RvX2RlbCA9IChsZTMyX3RvX2NwdShlbC0+bF9yZWNzW2ldLmVfY2x1c3RlcnMpICsKLQkJCQkgICBsZTMyX3RvX2NwdShlbC0+bF9yZWNzW2ldLmVfY3BvcykpIC0KLQkJCQkgIHRhcmdldF9pX2NsdXN0ZXJzOworCW9jZnMyX2V4dGVudF9tYXBfdHJ1bmMoaW5vZGUsIG5ld19oaWdoZXN0X2Nwb3MpOwogCi0JbWxvZygwLCAiY2x1c3RlcnNfdG9fZGVsID0gJXUgaW4gdGhpcyBwYXNzXG4iLCBjbHVzdGVyc190b19kZWwpOworc3RhcnQ6CisJLyoKKwkgKiBDaGVjayB0aGF0IHdlIHN0aWxsIGhhdmUgYWxsb2NhdGlvbiB0byBkZWxldGUuCisJICovCisJaWYgKE9DRlMyX0koaW5vZGUpLT5pcF9jbHVzdGVycyA9PSAwKSB7CisJCXN0YXR1cyA9IDA7CisJCWdvdG8gYmFpbDsKKwl9CisKKwkvKgorCSAqIFRydW5jYXRlIGFsd2F5cyB3b3JrcyBhZ2FpbnN0IHRoZSByaWdodG1vc3QgdHJlZSBicmFuY2guCisJICovCisJc3RhdHVzID0gb2NmczJfZmluZF9wYXRoKGlub2RlLCBwYXRoLCBVSU5UX01BWCk7CisJaWYgKHN0YXR1cykgeworCQltbG9nX2Vycm5vKHN0YXR1cyk7CisJCWdvdG8gYmFpbDsKKwl9CisKKwltbG9nKDAsICJpbm9kZS0+aXBfY2x1c3RlcnMgPSAldSwgdHJlZV9kZXB0aCA9ICV1XG4iLAorCSAgICAgT0NGUzJfSShpbm9kZSktPmlwX2NsdXN0ZXJzLCBwYXRoLT5wX3RyZWVfZGVwdGgpOworCisJLyoKKwkgKiBCeSBub3csIGVsIHdpbGwgcG9pbnQgdG8gdGhlIGV4dGVudCBsaXN0IG9uIHRoZSBib3R0b20gbW9zdAorCSAqIHBvcnRpb24gb2YgdGhpcyB0cmVlLiBPbmx5IHRoZSB0YWlsIHJlY29yZCBpcyBjb25zaWRlcmVkIGluCisJICogZWFjaCBwYXNzLgorCSAqCisJICogV2UgaGFuZGxlIHRoZSBmb2xsb3dpbmcgY2FzZXMsIGluIG9yZGVyOgorCSAqIC0gZW1wdHkgZXh0ZW50OiBkZWxldGUgdGhlIHJlbWFpbmluZyBicmFuY2gKKwkgKiAtIHJlbW92ZSB0aGUgZW50aXJlIHJlY29yZAorCSAqIC0gcmVtb3ZlIGEgcGFydGlhbCByZWNvcmQKKwkgKiAtIG5vIHJlY29yZCBuZWVkcyB0byBiZSByZW1vdmVkICh0cnVuY2F0ZSBoYXMgY29tcGxldGVkKQorCSAqLworCWVsID0gcGF0aF9sZWFmX2VsKHBhdGgpOworCWlmIChsZTE2X3RvX2NwdShlbC0+bF9uZXh0X2ZyZWVfcmVjKSA9PSAwKSB7CisJCW9jZnMyX2Vycm9yKGlub2RlLT5pX3NiLAorCQkJICAgICJJbm9kZSAlbGx1IGhhcyBlbXB0eSBleHRlbnQgYmxvY2sgYXQgJWxsdVxuIiwKKwkJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKU9DRlMyX0koaW5vZGUpLT5pcF9ibGtubywKKwkJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKXBhdGhfbGVhZl9iaChwYXRoKS0+Yl9ibG9ja25yKTsKKwkJc3RhdHVzID0gLUVST0ZTOworCQlnb3RvIGJhaWw7CisJfQorCisJaSA9IGxlMTZfdG9fY3B1KGVsLT5sX25leHRfZnJlZV9yZWMpIC0gMTsKKwlyYW5nZSA9IGxlMzJfdG9fY3B1KGVsLT5sX3JlY3NbaV0uZV9jcG9zKSArCisJCW9jZnMyX3JlY19jbHVzdGVycyhlbCwgJmVsLT5sX3JlY3NbaV0pOworCWlmIChpID09IDAgJiYgb2NmczJfaXNfZW1wdHlfZXh0ZW50KCZlbC0+bF9yZWNzW2ldKSkgeworCQljbHVzdGVyc190b19kZWwgPSAwOworCX0gZWxzZSBpZiAobGUzMl90b19jcHUoZWwtPmxfcmVjc1tpXS5lX2Nwb3MpID49IG5ld19oaWdoZXN0X2Nwb3MpIHsKKwkJY2x1c3RlcnNfdG9fZGVsID0gb2NmczJfcmVjX2NsdXN0ZXJzKGVsLCAmZWwtPmxfcmVjc1tpXSk7CisJfSBlbHNlIGlmIChyYW5nZSA+IG5ld19oaWdoZXN0X2Nwb3MpIHsKKwkJY2x1c3RlcnNfdG9fZGVsID0gKG9jZnMyX3JlY19jbHVzdGVycyhlbCwgJmVsLT5sX3JlY3NbaV0pICsKKwkJCQkgICBsZTMyX3RvX2NwdShlbC0+bF9yZWNzW2ldLmVfY3BvcykpIC0KKwkJCQkgIG5ld19oaWdoZXN0X2Nwb3M7CisJfSBlbHNlIHsKKwkJc3RhdHVzID0gMDsKKwkJZ290byBiYWlsOworCX0KKworCW1sb2coMCwgImNsdXN0ZXJzX3RvX2RlbCA9ICV1IGluIHRoaXMgcGFzcywgdGFpbCBibGs9JWxsdVxuIiwKKwkgICAgIGNsdXN0ZXJzX3RvX2RlbCwgKHVuc2lnbmVkIGxvbmcgbG9uZylwYXRoX2xlYWZfYmgocGF0aCktPmJfYmxvY2tucik7CisKKwlCVUdfT04oY2x1c3RlcnNfdG9fZGVsID09IDApOwogCiAJbXV0ZXhfbG9jaygmdGxfaW5vZGUtPmlfbXV0ZXgpOwogCXRsX3NlbSA9IDE7CkBAIC0xODYxLDcgKzM3MjIsOCBAQAogCX0KIAogCWNyZWRpdHMgPSBvY2ZzMl9jYWxjX3RyZWVfdHJ1bmNfY3JlZGl0cyhvc2ItPnNiLCBjbHVzdGVyc190b19kZWwsCi0JCQkJCQlmZSwgZWwpOworCQkJCQkJKHN0cnVjdCBvY2ZzMl9kaW5vZGUgKilmZV9iaC0+Yl9kYXRhLAorCQkJCQkJZWwpOwogCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKG9zYiwgY3JlZGl0cyk7CiAJaWYgKElTX0VSUihoYW5kbGUpKSB7CiAJCXN0YXR1cyA9IFBUUl9FUlIoaGFuZGxlKTsKQEAgLTE4NzAsMTMgKzM3MzIsOCBAQAogCQlnb3RvIGJhaWw7CiAJfQogCi0JaW5vZGUtPmlfY3RpbWUgPSBpbm9kZS0+aV9tdGltZSA9IENVUlJFTlRfVElNRTsKLQlzdGF0dXMgPSBvY2ZzMl9tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgaW5vZGUsIGZlX2JoKTsKLQlpZiAoc3RhdHVzIDwgMCkKLQkJbWxvZ19lcnJubyhzdGF0dXMpOwotCi0Jc3RhdHVzID0gb2NmczJfZG9fdHJ1bmNhdGUob3NiLCBjbHVzdGVyc190b19kZWwsIGlub2RlLCBmZV9iaCwKLQkJCQkgICBsYXN0X2ViX2JoLCBoYW5kbGUsIHRjKTsKKwlzdGF0dXMgPSBvY2ZzMl9kb190cnVuY2F0ZShvc2IsIGNsdXN0ZXJzX3RvX2RlbCwgaW5vZGUsIGZlX2JoLCBoYW5kbGUsCisJCQkJICAgdGMsIHBhdGgpOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJZ290byBiYWlsOwpAQCAtMTg4OCw5ICszNzQ1LDE0IEBACiAJb2NmczJfY29tbWl0X3RyYW5zKG9zYiwgaGFuZGxlKTsKIAloYW5kbGUgPSBOVUxMOwogCi0JQlVHX09OKGxlMzJfdG9fY3B1KGZlLT5pX2NsdXN0ZXJzKSA8IHRhcmdldF9pX2NsdXN0ZXJzKTsKLQlpZiAobGUzMl90b19jcHUoZmUtPmlfY2x1c3RlcnMpID4gdGFyZ2V0X2lfY2x1c3RlcnMpCi0JCWdvdG8gc3RhcnQ7CisJb2NmczJfcmVpbml0X3BhdGgocGF0aCwgMSk7CisKKwkvKgorCSAqIFRoZSBjaGVjayBhYm92ZSB3aWxsIGNhdGNoIHRoZSBjYXNlIHdoZXJlIHdlJ3ZlIHRydW5jYXRlZAorCSAqIGF3YXkgYWxsIGFsbG9jYXRpb24uCisJICovCisJZ290byBzdGFydDsKKwogYmFpbDoKIAl1cF93cml0ZSgmT0NGUzJfSShpbm9kZSktPmlwX2FsbG9jX3NlbSk7CiAKQEAgLTE5MDIsOCArMzc2NCw3IEBACiAJaWYgKGhhbmRsZSkKIAkJb2NmczJfY29tbWl0X3RyYW5zKG9zYiwgaGFuZGxlKTsKIAotCWlmIChsYXN0X2ViX2JoKQotCQlicmVsc2UobGFzdF9lYl9iaCk7CisJb2NmczJfZnJlZV9wYXRoKHBhdGgpOwogCiAJLyogVGhpcyB3aWxsIGRyb3AgdGhlIGV4dF9hbGxvYyBjbHVzdGVyIGxvY2sgZm9yIHVzICovCiAJb2NmczJfZnJlZV90cnVuY2F0ZV9jb250ZXh0KHRjKTsKQEAgLTE5MTIsNyArMzc3Myw2IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAotCiAvKgogICogRXhwZWN0cyB0aGUgaW5vZGUgdG8gYWxyZWFkeSBiZSBsb2NrZWQuIFRoaXMgd2lsbCBmaWd1cmUgb3V0IHdoaWNoCiAgKiBpbm9kZXMgbmVlZCB0byBiZSBsb2NrZWQgYW5kIHdpbGwgcHV0IHRoZW0gb24gdGhlIHJldHVybmVkIHRydW5jYXRlCkBAIC0xOTIzLDcgKzM3ODMsNyBAQAogCQkJICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpmZV9iaCwKIAkJCSAgIHN0cnVjdCBvY2ZzMl90cnVuY2F0ZV9jb250ZXh0ICoqdGMpCiB7Ci0JaW50IHN0YXR1cywgbWV0YWRhdGFfZGVsZXRlOworCWludCBzdGF0dXMsIG1ldGFkYXRhX2RlbGV0ZSwgaTsKIAl1bnNpZ25lZCBpbnQgbmV3X2lfY2x1c3RlcnM7CiAJc3RydWN0IG9jZnMyX2Rpbm9kZSAqZmU7CiAJc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqZWI7CkBAIC0xOTQ0LDIxICszODA0LDYgQEAKIAkgICAgICIlbGx1XG4iLCBmZS0+aV9jbHVzdGVycywgbmV3X2lfY2x1c3RlcnMsCiAJICAgICAodW5zaWduZWQgbG9uZyBsb25nKWZlLT5pX3NpemUpOwogCi0JaWYgKGxlMzJfdG9fY3B1KGZlLT5pX2NsdXN0ZXJzKSA8PSBuZXdfaV9jbHVzdGVycykgewotCQlvY2ZzMl9lcnJvcihpbm9kZS0+aV9zYiwgIkRpbm9kZSAlbGx1IGhhcyBjbHVzdGVyIGNvdW50ICIKLQkJCSAgICAiJXUgYW5kIHNpemUgJWxsdSB3aGVyZWFzIHN0cnVjdCBpbm9kZSBoYXMgIgotCQkJICAgICJjbHVzdGVyIGNvdW50ICV1IGFuZCBzaXplICVsbHUgd2hpY2ggY2F1c2VkIGFuICIKLQkJCSAgICAiaW52YWxpZCB0cnVuY2F0ZSB0byAldSBjbHVzdGVycy4iLAotCQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbGU2NF90b19jcHUoZmUtPmlfYmxrbm8pLAotCQkJICAgIGxlMzJfdG9fY3B1KGZlLT5pX2NsdXN0ZXJzKSwKLQkJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKWxlNjRfdG9fY3B1KGZlLT5pX3NpemUpLAotCQkJICAgIE9DRlMyX0koaW5vZGUpLT5pcF9jbHVzdGVycywgaV9zaXplX3JlYWQoaW5vZGUpLAotCQkJICAgIG5ld19pX2NsdXN0ZXJzKTsKLQkJbWxvZ19tZXRhX2x2YihNTF9FUlJPUiwgJk9DRlMyX0koaW5vZGUpLT5pcF9tZXRhX2xvY2tyZXMpOwotCQlzdGF0dXMgPSAtRUlPOwotCQlnb3RvIGJhaWw7Ci0JfQotCiAJKnRjID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG9jZnMyX3RydW5jYXRlX2NvbnRleHQpLCBHRlBfS0VSTkVMKTsKIAlpZiAoISgqdGMpKSB7CiAJCXN0YXR1cyA9IC1FTk9NRU07CkBAIC0xOTg2LDcgKzM4MzEsMTUgQEAKIAkJCWdvdG8gYmFpbDsKIAkJfQogCQllbCA9ICYoZWItPmhfbGlzdCk7Ci0JCWlmIChsZTMyX3RvX2NwdShlbC0+bF9yZWNzWzBdLmVfY3BvcykgPj0gbmV3X2lfY2x1c3RlcnMpCisKKwkJaSA9IDA7CisJCWlmIChvY2ZzMl9pc19lbXB0eV9leHRlbnQoJmVsLT5sX3JlY3NbMF0pKQorCQkJaSA9IDE7CisJCS8qCisJCSAqIFhYWDogU2hvdWxkIHdlIGNoZWNrIHRoYXQgbmV4dF9mcmVlX3JlYyBjb250YWlucworCQkgKiB0aGUgZXh0ZW50PworCQkgKi8KKwkJaWYgKGxlMzJfdG9fY3B1KGVsLT5sX3JlY3NbaV0uZV9jcG9zKSA+PSBuZXdfaV9jbHVzdGVycykKIAkJCW1ldGFkYXRhX2RlbGV0ZSA9IDE7CiAJfQogCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9hbGxvYy5oIGIvZnMvb2NmczIvYWxsb2MuaAppbmRleCAwYjgyZTgwLi5mYmNiNTkzIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9hbGxvYy5oCisrKyBiL2ZzL29jZnMyL2FsbG9jLmgKQEAgLTMxLDcgKzMxLDggQEAKIAkJCWhhbmRsZV90ICpoYW5kbGUsCiAJCQlzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpmZV9iaCwKLQkJCXU2NCBibGtubywKKwkJCXUzMiBjcG9zLAorCQkJdTY0IHN0YXJ0X2JsaywKIAkJCXUzMiBuZXdfY2x1c3RlcnMsCiAJCQlzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqbWV0YV9hYyk7CiBpbnQgb2NmczJfbnVtX2ZyZWVfZXh0ZW50cyhzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKQEAgLTcwLDYgKzcxLDggQEAKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnRjX2xhc3RfZWJfYmg7CiB9OwogCitpbnQgb2NmczJfemVyb190YWlsX2Zvcl90cnVuY2F0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBoYW5kbGVfdCAqaGFuZGxlLAorCQkJCSB1NjQgbmV3X2lfc2l6ZSk7CiBpbnQgb2NmczJfcHJlcGFyZV90cnVuY2F0ZShzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKIAkJCSAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmZlX2JoLApAQCAtNzksNCArODIsMjYgQEAKIAkJCSAgc3RydWN0IGJ1ZmZlcl9oZWFkICpmZV9iaCwKIAkJCSAgc3RydWN0IG9jZnMyX3RydW5jYXRlX2NvbnRleHQgKnRjKTsKIAoraW50IG9jZnMyX2ZpbmRfbGVhZihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKnJvb3RfZWwsCisJCSAgICB1MzIgY3Bvcywgc3RydWN0IGJ1ZmZlcl9oZWFkICoqbGVhZl9iaCk7CisKKy8qCisgKiBIZWxwZXIgZnVuY3Rpb24gdG8gbG9vayBhdCB0aGUgIyBvZiBjbHVzdGVycyBpbiBhbiBleHRlbnQgcmVjb3JkLgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBvY2ZzMl9yZWNfY2x1c3RlcnMoc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICplbCwKKwkJCQkJICAgICAgc3RydWN0IG9jZnMyX2V4dGVudF9yZWMgKnJlYykKK3sKKwkvKgorCSAqIENsdXN0ZXIgY291bnQgaW4gZXh0ZW50IHJlY29yZHMgaXMgc2xpZ2h0bHkgZGlmZmVyZW50CisJICogYmV0d2VlbiBpbnRlcmlvciBub2RlcyBhbmQgbGVhZiBub2Rlcy4gVGhpcyBpcyB0byBzdXBwb3J0CisJICogdW53cml0dGVuIGV4dGVudHMgd2hpY2ggbmVlZCBhIGZsYWdzIGZpZWxkIGluIGxlYWYgbm9kZQorCSAqIHJlY29yZHMsIHRodXMgc2hyaW5raW5nIHRoZSBhdmFpbGFibGUgc3BhY2UgZm9yIGEgY2x1c3RlcnMKKwkgKiBmaWVsZC4KKwkgKi8KKwlpZiAoZWwtPmxfdHJlZV9kZXB0aCkKKwkJcmV0dXJuIGxlMzJfdG9fY3B1KHJlYy0+ZV9pbnRfY2x1c3RlcnMpOworCWVsc2UKKwkJcmV0dXJuIGxlMTZfdG9fY3B1KHJlYy0+ZV9sZWFmX2NsdXN0ZXJzKTsKK30KKwogI2VuZGlmIC8qIE9DRlMyX0FMTE9DX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2FvcHMuYyBiL2ZzL29jZnMyL2FvcHMuYwppbmRleCA4NzVjMTE0Li41Njk2M2U2IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9hb3BzLmMKKysrIGIvZnMvb2NmczIvYW9wcy5jCkBAIC0yNCw2ICsyNCw4IEBACiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8bGludXgvc3dhcC5oPgorI2luY2x1ZGUgPGxpbnV4L3BpcGVfZnNfaS5oPgogCiAjZGVmaW5lIE1MT0dfTUFTS19QUkVGSVggTUxfRklMRV9JTwogI2luY2x1ZGUgPGNsdXN0ZXIvbWFza2xvZy5oPgpAQCAtMzcsNiArMzksNyBAQAogI2luY2x1ZGUgImZpbGUuaCIKICNpbmNsdWRlICJpbm9kZS5oIgogI2luY2x1ZGUgImpvdXJuYWwuaCIKKyNpbmNsdWRlICJzdWJhbGxvYy5oIgogI2luY2x1ZGUgInN1cGVyLmgiCiAjaW5jbHVkZSAic3ltbGluay5oIgogCkBAIC0xMzQsNyArMTM3LDkgQEAKIAkJCSAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmhfcmVzdWx0LCBpbnQgY3JlYXRlKQogewogCWludCBlcnIgPSAwOworCXVuc2lnbmVkIGludCBleHRfZmxhZ3M7CiAJdTY0IHBfYmxrbm8sIHBhc3RfZW9mOworCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoaW5vZGUtPmlfc2IpOwogCiAJbWxvZ19lbnRyeSgiKDB4JXAsICVsbHUsIDB4JXAsICVkKVxuIiwgaW5vZGUsCiAJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpaWJsb2NrLCBiaF9yZXN1bHQsIGNyZWF0ZSk7CkBAIC0xNDksMTcgKzE1NCw4IEBACiAJCWdvdG8gYmFpbDsKIAl9CiAKLQkvKiB0aGlzIGNhbiBoYXBwZW4gaWYgYW5vdGhlciBub2RlIHRydW5jcyBhZnRlciBvdXIgZXh0ZW5kISAqLwotCXNwaW5fbG9jaygmT0NGUzJfSShpbm9kZSktPmlwX2xvY2spOwotCWlmIChpYmxvY2sgPj0gb2NmczJfY2x1c3RlcnNfdG9fYmxvY2tzKGlub2RlLT5pX3NiLAotCQkJCQkgICAgICAgT0NGUzJfSShpbm9kZSktPmlwX2NsdXN0ZXJzKSkKLQkJZXJyID0gLUVJTzsKLQlzcGluX3VubG9jaygmT0NGUzJfSShpbm9kZSktPmlwX2xvY2spOwotCWlmIChlcnIpCi0JCWdvdG8gYmFpbDsKLQotCWVyciA9IG9jZnMyX2V4dGVudF9tYXBfZ2V0X2Jsb2Nrcyhpbm9kZSwgaWJsb2NrLCAxLCAmcF9ibGtubywKLQkJCQkJICBOVUxMKTsKKwllcnIgPSBvY2ZzMl9leHRlbnRfbWFwX2dldF9ibG9ja3MoaW5vZGUsIGlibG9jaywgJnBfYmxrbm8sIE5VTEwsCisJCQkJCSAgJmV4dF9mbGFncyk7CiAJaWYgKGVycikgewogCQltbG9nKE1MX0VSUk9SLCAiRXJyb3IgJWQgZnJvbSBnZXRfYmxvY2tzKDB4JXAsICVsbHUsIDEsICIKIAkJICAgICAiJWxsdSwgTlVMTClcbiIsIGVyciwgaW5vZGUsICh1bnNpZ25lZCBsb25nIGxvbmcpaWJsb2NrLApAQCAtMTY3LDIzICsxNjMsNDAgQEAKIAkJZ290byBiYWlsOwogCX0KIAotCW1hcF9iaChiaF9yZXN1bHQsIGlub2RlLT5pX3NiLCBwX2Jsa25vKTsKKwkvKgorCSAqIG9jZnMyIG5ldmVyIGFsbG9jYXRlcyBpbiB0aGlzIGZ1bmN0aW9uIC0gdGhlIG9ubHkgdGltZSB3ZQorCSAqIG5lZWQgdG8gdXNlIEJIX05ldyBpcyB3aGVuIHdlJ3JlIGV4dGVuZGluZyBpX3NpemUgb24gYSBmaWxlCisJICogc3lzdGVtIHdoaWNoIGRvZXNuJ3Qgc3VwcG9ydCBob2xlcywgaW4gd2hpY2ggY2FzZSBCSF9OZXcKKwkgKiBhbGxvd3MgYmxvY2tfcHJlcGFyZV93cml0ZSgpIHRvIHplcm8uCisJICovCisJbWxvZ19idWdfb25fbXNnKGNyZWF0ZSAmJiBwX2Jsa25vID09IDAgJiYgb2NmczJfc3BhcnNlX2FsbG9jKG9zYiksCisJCQkiaW5vICVsdSwgaWJsb2NrICVsbHVcbiIsIGlub2RlLT5pX2lubywKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpaWJsb2NrKTsKIAotCWlmIChiaF9yZXN1bHQtPmJfYmxvY2tuciA9PSAwKSB7Ci0JCWVyciA9IC1FSU87Ci0JCW1sb2coTUxfRVJST1IsICJpYmxvY2sgPSAlbGx1IHBfYmxrbm8gPSAlbGx1IGJsa25vPSglbGx1KVxuIiwKLQkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKWlibG9jaywKLQkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKXBfYmxrbm8sCi0JCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8pOworCS8qIFRyZWF0IHRoZSB1bndyaXR0ZW4gZXh0ZW50IGFzIGEgaG9sZSBmb3IgemVyb2luZyBwdXJwb3Nlcy4gKi8KKwlpZiAocF9ibGtubyAmJiAhKGV4dF9mbGFncyAmIE9DRlMyX0VYVF9VTldSSVRURU4pKQorCQltYXBfYmgoYmhfcmVzdWx0LCBpbm9kZS0+aV9zYiwgcF9ibGtubyk7CisKKwlpZiAoIW9jZnMyX3NwYXJzZV9hbGxvYyhvc2IpKSB7CisJCWlmIChwX2Jsa25vID09IDApIHsKKwkJCWVyciA9IC1FSU87CisJCQltbG9nKE1MX0VSUk9SLAorCQkJICAgICAiaWJsb2NrID0gJWxsdSBwX2Jsa25vID0gJWxsdSBibGtubz0oJWxsdSlcbiIsCisJCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpaWJsb2NrLAorCQkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKXBfYmxrbm8sCisJCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vKTsKKwkJCW1sb2coTUxfRVJST1IsICJTaXplICVsbHUsIGNsdXN0ZXJzICV1XG4iLCAodW5zaWduZWQgbG9uZyBsb25nKWlfc2l6ZV9yZWFkKGlub2RlKSwgT0NGUzJfSShpbm9kZSktPmlwX2NsdXN0ZXJzKTsKKwkJCWR1bXBfc3RhY2soKTsKKwkJfQorCisJCXBhc3RfZW9mID0gb2NmczJfYmxvY2tzX2Zvcl9ieXRlcyhpbm9kZS0+aV9zYiwgaV9zaXplX3JlYWQoaW5vZGUpKTsKKwkJbWxvZygwLCAiSW5vZGUgJWx1LCBwYXN0X2VvZiA9ICVsbHVcbiIsIGlub2RlLT5pX2lubywKKwkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKXBhc3RfZW9mKTsKKworCQlpZiAoY3JlYXRlICYmIChpYmxvY2sgPj0gcGFzdF9lb2YpKQorCQkJc2V0X2J1ZmZlcl9uZXcoYmhfcmVzdWx0KTsKIAl9CiAKLQlwYXN0X2VvZiA9IG9jZnMyX2Jsb2Nrc19mb3JfYnl0ZXMoaW5vZGUtPmlfc2IsIGlfc2l6ZV9yZWFkKGlub2RlKSk7Ci0JbWxvZygwLCAiSW5vZGUgJWx1LCBwYXN0X2VvZiA9ICVsbHVcbiIsIGlub2RlLT5pX2lubywKLQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpcGFzdF9lb2YpOwotCi0JaWYgKGNyZWF0ZSAmJiAoaWJsb2NrID49IHBhc3RfZW9mKSkKLQkJc2V0X2J1ZmZlcl9uZXcoYmhfcmVzdWx0KTsKLQogYmFpbDoKIAlpZiAoZXJyIDwgMCkKIAkJZXJyID0gLUVJTzsKQEAgLTI3Niw4ICsyODksMTEgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0vKiBUaGlzIGNhbiBhbHNvIGJlIGNhbGxlZCBmcm9tIG9jZnMyX3dyaXRlX3plcm9fcGFnZSgpIHdoaWNoIGhhcyBkb25lCi0gKiBpdCdzIG93biBjbHVzdGVyIGxvY2tpbmcuICovCisvKgorICogVGhpcyBpcyBjYWxsZWQgZnJvbSBvY2ZzMl93cml0ZV96ZXJvX3BhZ2UoKSB3aGljaCBoYXMgaGFuZGxlZCBpdCdzCisgKiBvd24gY2x1c3RlciBsb2NraW5nIGFuZCBoYXMgZW5zdXJlZCBhbGxvY2F0aW9uIGV4aXN0cyBmb3IgdGhvc2UKKyAqIGJsb2NrcyB0byBiZSB3cml0dGVuLgorICovCiBpbnQgb2NmczJfcHJlcGFyZV93cml0ZV9ub2xvY2soc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHBhZ2UgKnBhZ2UsCiAJCQkgICAgICAgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8pCiB7CkBAIC0yOTIsNDQgKzMwOCwxNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLS8qCi0gKiBvY2ZzMl9wcmVwYXJlX3dyaXRlKCkgY2FuIGJlIGFuIG91dGVyLW1vc3Qgb2NmczIgY2FsbCB3aGVuIGl0IGlzIGNhbGxlZAotICogZnJvbSBsb29wYmFjay4gIEl0IG11c3QgYmUgYWJsZSB0byBwZXJmb3JtIGl0cyBvd24gbG9ja2luZyBhcm91bmQKLSAqIG9jZnMyX2dldF9ibG9jaygpLgotICovCi1zdGF0aWMgaW50IG9jZnMyX3ByZXBhcmVfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlLAotCQkJICAgICAgIHVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIHRvKQotewotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBwYWdlLT5tYXBwaW5nLT5ob3N0OwotCWludCByZXQ7Ci0KLQltbG9nX2VudHJ5KCIoMHglcCwgMHglcCwgJXUsICV1KVxuIiwgZmlsZSwgcGFnZSwgZnJvbSwgdG8pOwotCi0JcmV0ID0gb2NmczJfbWV0YV9sb2NrX3dpdGhfcGFnZShpbm9kZSwgTlVMTCwgMCwgcGFnZSk7Ci0JaWYgKHJldCAhPSAwKSB7Ci0JCW1sb2dfZXJybm8ocmV0KTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JcmV0ID0gb2NmczJfcHJlcGFyZV93cml0ZV9ub2xvY2soaW5vZGUsIHBhZ2UsIGZyb20sIHRvKTsKLQotCW9jZnMyX21ldGFfdW5sb2NrKGlub2RlLCAwKTsKLW91dDoKLQltbG9nX2V4aXQocmV0KTsKLQlyZXR1cm4gcmV0OwotfQotCiAvKiBUYWtlbiBmcm9tIGV4dDMuIFdlIGRvbid0IG5lY2Vzc2FyaWx5IG5lZWQgdGhlIGZ1bGwgYmxvd24KICAqIGZ1bmN0aW9uYWxpdHkgeWV0LCBidXQgSU1ITyBpdCdzIGJldHRlciB0byBjdXQgYW5kIHBhc3RlIHRoZSB3aG9sZQogICogdGhpbmcgc28gd2UgY2FuIGF2b2lkIGludHJvZHVjaW5nIG91ciBvd24gYnVncyAoYW5kIGVhc2lseSBwaWNrIHVwCiAgKiB0aGVpciBmaXhlcyB3aGVuIHRoZXkgaGFwcGVuKSAtLU1hcmsgKi8KLXN0YXRpYyBpbnQgd2Fsa19wYWdlX2J1ZmZlcnMoCWhhbmRsZV90ICpoYW5kbGUsCi0JCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpoZWFkLAotCQkJCXVuc2lnbmVkIGZyb20sCi0JCQkJdW5zaWduZWQgdG8sCi0JCQkJaW50ICpwYXJ0aWFsLAotCQkJCWludCAoKmZuKSgJaGFuZGxlX3QgKmhhbmRsZSwKLQkJCQkJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgpKQoraW50IHdhbGtfcGFnZV9idWZmZXJzKAloYW5kbGVfdCAqaGFuZGxlLAorCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpoZWFkLAorCQkJdW5zaWduZWQgZnJvbSwKKwkJCXVuc2lnbmVkIHRvLAorCQkJaW50ICpwYXJ0aWFsLAorCQkJaW50ICgqZm4pKAloYW5kbGVfdCAqaGFuZGxlLAorCQkJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKSkKIHsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOwogCXVuc2lnbmVkIGJsb2NrX3N0YXJ0LCBibG9ja19lbmQ7CkBAIC0zODgsOTUgKzM3Nyw2IEBACiAJcmV0dXJuIGhhbmRsZTsKIH0KIAotc3RhdGljIGludCBvY2ZzMl9jb21taXRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlLAotCQkJICAgICAgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8pCi17Ci0JaW50IHJldDsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpX2JoID0gTlVMTDsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKLQloYW5kbGVfdCAqaGFuZGxlID0gTlVMTDsKLQlzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaTsKLQotCW1sb2dfZW50cnkoIigweCVwLCAweCVwLCAldSwgJXUpXG4iLCBmaWxlLCBwYWdlLCBmcm9tLCB0byk7Ci0KLQkvKiBOT1RFOiBvY2ZzMl9maWxlX2Fpb193cml0ZSBoYXMgZW5zdXJlZCB0aGF0IGl0J3Mgc2FmZSBmb3IKLQkgKiB1cyB0byBjb250aW51ZSBoZXJlIHdpdGhvdXQgcmVjaGVja2luZyB0aGUgSS9PIGFnYWluc3QKLQkgKiBjaGFuZ2VkIGlub2RlIHZhbHVlcy4KLQkgKgotCSAqIDEpIFdlJ3JlIGN1cnJlbnRseSBob2xkaW5nIHRoZSBpbm9kZSBhbGxvYyBsb2NrLCBzbyBubwotCSAqICAgIG5vZGVzIGNhbiBjaGFuZ2UgaXQgdW5kZXJuZWF0aCB1cy4KLQkgKgotCSAqIDIpIFdlJ3ZlIGhhZCB0byB0YWtlIHRoZSBtZXRhZGF0YSBsb2NrIGF0IGxlYXN0IG9uY2UKLQkgKiAgICBhbHJlYWR5IHRvIGNoZWNrIGZvciBleHRlbmRpbmcgd3JpdGVzLCBzdWlkIHJlbW92YWwsIGV0Yy4KLQkgKiAgICBUaGUgbWV0YSBkYXRhIHVwZGF0ZSBjb2RlIHRoZW4gZW5zdXJlcyB0aGF0IHdlIGRvbid0IGdldCBhCi0JICogICAgc3RhbGUgaW5vZGUgYWxsb2NhdGlvbiBpbWFnZSAoaV9zaXplLCBpX2NsdXN0ZXJzLCBldGMpLgotCSAqLwotCi0JcmV0ID0gb2NmczJfbWV0YV9sb2NrX3dpdGhfcGFnZShpbm9kZSwgJmRpX2JoLCAxLCBwYWdlKTsKLQlpZiAocmV0ICE9IDApIHsKLQkJbWxvZ19lcnJubyhyZXQpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlyZXQgPSBvY2ZzMl9kYXRhX2xvY2tfd2l0aF9wYWdlKGlub2RlLCAxLCBwYWdlKTsKLQlpZiAocmV0ICE9IDApIHsKLQkJbWxvZ19lcnJubyhyZXQpOwotCQlnb3RvIG91dF91bmxvY2tfbWV0YTsKLQl9Ci0KLQloYW5kbGUgPSBvY2ZzMl9zdGFydF93YWxrX3BhZ2VfdHJhbnMoaW5vZGUsIHBhZ2UsIGZyb20sIHRvKTsKLQlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKLQkJcmV0ID0gUFRSX0VSUihoYW5kbGUpOwotCQlnb3RvIG91dF91bmxvY2tfZGF0YTsKLQl9Ci0KLQkvKiBNYXJrIG91ciBidWZmZXIgZWFybHkuIFdlJ2QgcmF0aGVyIGNhdGNoIHRoaXMgZXJyb3IgdXAgaGVyZQotCSAqIGFzIG9wcG9zZWQgdG8gYWZ0ZXIgYSBzdWNjZXNzZnVsIGNvbW1pdF93cml0ZSB3aGljaCB3b3VsZAotCSAqIHJlcXVpcmUgdXMgdG8gc2V0IGJhY2sgaW5vZGUtPmlfc2l6ZS4gKi8KLQlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCBkaV9iaCwKLQkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJbWxvZ19lcnJubyhyZXQpOwotCQlnb3RvIG91dF9jb21taXQ7Ci0JfQotCi0JLyogbWlnaHQgdXBkYXRlIGlfc2l6ZSAqLwotCXJldCA9IGdlbmVyaWNfY29tbWl0X3dyaXRlKGZpbGUsIHBhZ2UsIGZyb20sIHRvKTsKLQlpZiAocmV0IDwgMCkgewotCQltbG9nX2Vycm5vKHJldCk7Ci0JCWdvdG8gb3V0X2NvbW1pdDsKLQl9Ci0KLQlkaSA9IChzdHJ1Y3Qgb2NmczJfZGlub2RlICopZGlfYmgtPmJfZGF0YTsKLQotCS8qIG9jZnMyX21hcmtfaW5vZGVfZGlydHkoKSBpcyB0b28gaGVhdnkgdG8gdXNlIGhlcmUuICovCi0JaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRTsKLQlkaS0+aV9tdGltZSA9IGRpLT5pX2N0aW1lID0gY3B1X3RvX2xlNjQoaW5vZGUtPmlfbXRpbWUudHZfc2VjKTsKLQlkaS0+aV9tdGltZV9uc2VjID0gZGktPmlfY3RpbWVfbnNlYyA9IGNwdV90b19sZTMyKGlub2RlLT5pX210aW1lLnR2X25zZWMpOwotCi0JaW5vZGUtPmlfYmxvY2tzID0gb2NmczJfYWxpZ25fYnl0ZXNfdG9fc2VjdG9ycygodTY0KShpX3NpemVfcmVhZChpbm9kZSkpKTsKLQlkaS0+aV9zaXplID0gY3B1X3RvX2xlNjQoKHU2NClpX3NpemVfcmVhZChpbm9kZSkpOwotCi0JcmV0ID0gb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIGRpX2JoKTsKLQlpZiAocmV0IDwgMCkgewotCQltbG9nX2Vycm5vKHJldCk7Ci0JCWdvdG8gb3V0X2NvbW1pdDsKLQl9Ci0KLW91dF9jb21taXQ6Ci0Jb2NmczJfY29tbWl0X3RyYW5zKE9DRlMyX1NCKGlub2RlLT5pX3NiKSwgaGFuZGxlKTsKLW91dF91bmxvY2tfZGF0YToKLQlvY2ZzMl9kYXRhX3VubG9jayhpbm9kZSwgMSk7Ci1vdXRfdW5sb2NrX21ldGE6Ci0Jb2NmczJfbWV0YV91bmxvY2soaW5vZGUsIDEpOwotb3V0OgotCWlmIChkaV9iaCkKLQkJYnJlbHNlKGRpX2JoKTsKLQotCW1sb2dfZXhpdChyZXQpOwotCXJldHVybiByZXQ7Ci19Ci0KIHN0YXRpYyBzZWN0b3JfdCBvY2ZzMl9ibWFwKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBzZWN0b3JfdCBibG9jaykKIHsKIAlzZWN0b3JfdCBzdGF0dXM7CkBAIC00OTksOCArMzk5LDcgQEAKIAkJZG93bl9yZWFkKCZPQ0ZTMl9JKGlub2RlKS0+aXBfYWxsb2Nfc2VtKTsKIAl9CiAKLQllcnIgPSBvY2ZzMl9leHRlbnRfbWFwX2dldF9ibG9ja3MoaW5vZGUsIGJsb2NrLCAxLCAmcF9ibGtubywKLQkJCQkJICBOVUxMKTsKKwllcnIgPSBvY2ZzMl9leHRlbnRfbWFwX2dldF9ibG9ja3MoaW5vZGUsIGJsb2NrLCAmcF9ibGtubywgTlVMTCwgTlVMTCk7CiAKIAlpZiAoIUlOT0RFX0pPVVJOQUwoaW5vZGUpKSB7CiAJCXVwX3JlYWQoJk9DRlMyX0koaW5vZGUpLT5pcF9hbGxvY19zZW0pOwpAQCAtNTQwLDggKzQzOSw4IEBACiAJCQkJICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoX3Jlc3VsdCwgaW50IGNyZWF0ZSkKIHsKIAlpbnQgcmV0OwotCXU2NCBwX2Jsa25vLCBpbm9kZV9ibG9ja3M7Ci0JaW50IGNvbnRpZ19ibG9ja3M7CisJdTY0IHBfYmxrbm8sIGlub2RlX2Jsb2NrcywgY29udGlnX2Jsb2NrczsKKwl1bnNpZ25lZCBpbnQgZXh0X2ZsYWdzOwogCXVuc2lnbmVkIGNoYXIgYmxvY2tzaXplX2JpdHMgPSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0czsKIAl1bnNpZ25lZCBsb25nIG1heF9ibG9ja3MgPSBiaF9yZXN1bHQtPmJfc2l6ZSA+PiBpbm9kZS0+aV9ibGtiaXRzOwogCkBAIC01NDksMzMgKzQ0OCwyMCBAQAogCSAqIG5pY2VseSBhbGlnbmVkIGFuZCBvZiB0aGUgcmlnaHQgc2l6ZSwgc28gdGhlcmUncyBubyBuZWVkCiAJICogZm9yIHVzIHRvIGNoZWNrIGFueSBvZiB0aGF0LiAqLwogCi0Jc3Bpbl9sb2NrKCZPQ0ZTMl9JKGlub2RlKS0+aXBfbG9jayk7Ci0JaW5vZGVfYmxvY2tzID0gb2NmczJfY2x1c3RlcnNfdG9fYmxvY2tzKGlub2RlLT5pX3NiLAotCQkJCQkJT0NGUzJfSShpbm9kZSktPmlwX2NsdXN0ZXJzKTsKLQotCS8qCi0JICogRm9yIGEgcmVhZCB3aGljaCBiZWdpbnMgcGFzdCB0aGUgZW5kIG9mIGZpbGUsIHdlIHJldHVybiBhIGhvbGUuCi0JICovCi0JaWYgKCFjcmVhdGUgJiYgKGlibG9jayA+PSBpbm9kZV9ibG9ja3MpKSB7Ci0JCXNwaW5fdW5sb2NrKCZPQ0ZTMl9JKGlub2RlKS0+aXBfbG9jayk7Ci0JCXJldCA9IDA7Ci0JCWdvdG8gYmFpbDsKLQl9CisJaW5vZGVfYmxvY2tzID0gb2NmczJfYmxvY2tzX2Zvcl9ieXRlcyhpbm9kZS0+aV9zYiwgaV9zaXplX3JlYWQoaW5vZGUpKTsKIAogCS8qCiAJICogQW55IHdyaXRlIHBhc3QgRU9GIGlzIG5vdCBhbGxvd2VkIGJlY2F1c2Ugd2UnZCBiZSBleHRlbmRpbmcuCiAJICovCiAJaWYgKGNyZWF0ZSAmJiAoaWJsb2NrICsgbWF4X2Jsb2NrcykgPiBpbm9kZV9ibG9ja3MpIHsKLQkJc3Bpbl91bmxvY2soJk9DRlMyX0koaW5vZGUpLT5pcF9sb2NrKTsKIAkJcmV0ID0gLUVJTzsKIAkJZ290byBiYWlsOwogCX0KLQlzcGluX3VubG9jaygmT0NGUzJfSShpbm9kZSktPmlwX2xvY2spOwogCiAJLyogVGhpcyBmaWd1cmVzIG91dCB0aGUgc2l6ZSBvZiB0aGUgbmV4dCBjb250aWd1b3VzIGJsb2NrLCBhbmQKIAkgKiBvdXIgbG9naWNhbCBvZmZzZXQgKi8KLQlyZXQgPSBvY2ZzMl9leHRlbnRfbWFwX2dldF9ibG9ja3MoaW5vZGUsIGlibG9jaywgMSwgJnBfYmxrbm8sCi0JCQkJCSAgJmNvbnRpZ19ibG9ja3MpOworCXJldCA9IG9jZnMyX2V4dGVudF9tYXBfZ2V0X2Jsb2Nrcyhpbm9kZSwgaWJsb2NrLCAmcF9ibGtubywKKwkJCQkJICAmY29udGlnX2Jsb2NrcywgJmV4dF9mbGFncyk7CiAJaWYgKHJldCkgewogCQltbG9nKE1MX0VSUk9SLCAiZ2V0X2Jsb2NrcygpIGZhaWxlZCBpYmxvY2s9JWxsdVxuIiwKIAkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKWlibG9jayk7CkBAIC01ODMsNyArNDY5LDM3IEBACiAJCWdvdG8gYmFpbDsKIAl9CiAKLQltYXBfYmgoYmhfcmVzdWx0LCBpbm9kZS0+aV9zYiwgcF9ibGtubyk7CisJaWYgKCFvY2ZzMl9zcGFyc2VfYWxsb2MoT0NGUzJfU0IoaW5vZGUtPmlfc2IpKSAmJiAhcF9ibGtubykgeworCQlvY2ZzMl9lcnJvcihpbm9kZS0+aV9zYiwKKwkJCSAgICAiSW5vZGUgJWxsdSBoYXMgYSBob2xlIGF0IGJsb2NrICVsbHVcbiIsCisJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8sCisJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylpYmxvY2spOworCQlyZXQgPSAtRVJPRlM7CisJCWdvdG8gYmFpbDsKKwl9CisKKwkvKgorCSAqIGdldF9tb3JlX2Jsb2NrcygpIGV4cGVjdHMgdXMgdG8gZGVzY3JpYmUgYSBob2xlIGJ5IGNsZWFyaW5nCisJICogdGhlIG1hcHBlZCBiaXQgb24gYmhfcmVzdWx0KCkuCisJICoKKwkgKiBDb25zaWRlciBhbiB1bndyaXR0ZW4gZXh0ZW50IGFzIGEgaG9sZS4KKwkgKi8KKwlpZiAocF9ibGtubyAmJiAhKGV4dF9mbGFncyAmIE9DRlMyX0VYVF9VTldSSVRURU4pKQorCQltYXBfYmgoYmhfcmVzdWx0LCBpbm9kZS0+aV9zYiwgcF9ibGtubyk7CisJZWxzZSB7CisJCS8qCisJCSAqIG9jZnMyX3ByZXBhcmVfaW5vZGVfZm9yX3dyaXRlKCkgc2hvdWxkIGhhdmUgY2F1Z2h0CisJCSAqIHRoZSBjYXNlIHdoZXJlIHdlJ2QgYmUgZmlsbGluZyBhIGhvbGUgYW5kIHRyaWdnZXJlZAorCQkgKiBhIGJ1ZmZlcmVkIHdyaXRlIGluc3RlYWQuCisJCSAqLworCQlpZiAoY3JlYXRlKSB7CisJCQlyZXQgPSAtRUlPOworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBiYWlsOworCQl9CisKKwkJY2xlYXJfYnVmZmVyX21hcHBlZChiaF9yZXN1bHQpOworCX0KIAogCS8qIG1ha2Ugc3VyZSB3ZSBkb24ndCBtYXAgbW9yZSB0aGFuIG1heF9ibG9ja3MgYmxvY2tzIGhlcmUgYXMKIAkgICB0aGF0J3MgYWxsIHRoZSBrZXJuZWwgd2lsbCBoYW5kbGUgYXQgdGhpcyBwb2ludC4gKi8KQEAgLTYwNiwxMiArNTIyLDE3IEBACiAJCQkgICAgIHZvaWQgKnByaXZhdGUpCiB7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGlvY2ItPmtpX2ZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CisJaW50IGxldmVsOwogCiAJLyogdGhpcyBpbydzIHN1Ym1pdHRlciBzaG91bGQgbm90IGhhdmUgdW5sb2NrZWQgdGhpcyBiZWZvcmUgd2UgY291bGQgKi8KIAlCVUdfT04oIW9jZnMyX2lvY2JfaXNfcndfbG9ja2VkKGlvY2IpKTsKKwogCW9jZnMyX2lvY2JfY2xlYXJfcndfbG9ja2VkKGlvY2IpOwotCXVwX3JlYWQoJmlub2RlLT5pX2FsbG9jX3NlbSk7Ci0Jb2NmczJfcndfdW5sb2NrKGlub2RlLCAwKTsKKworCWxldmVsID0gb2NmczJfaW9jYl9yd19sb2NrZWRfbGV2ZWwoaW9jYik7CisJaWYgKCFsZXZlbCkKKwkJdXBfcmVhZCgmaW5vZGUtPmlfYWxsb2Nfc2VtKTsKKwlvY2ZzMl9yd191bmxvY2soaW5vZGUsIGxldmVsKTsKIH0KIAogLyoKQEAgLTY0NywyMyArNTY4LDI3IEBACiAKIAltbG9nX2VudHJ5X3ZvaWQoKTsKIAotCS8qCi0JICogV2UgZ2V0IFBSIGRhdGEgbG9ja3MgZXZlbiBmb3IgT19ESVJFQ1QuICBUaGlzIGFsbG93cwotCSAqIGNvbmN1cnJlbnQgT19ESVJFQ1QgSS9PIGJ1dCBkb2Vzbid0IGxldCBPX0RJUkVDVCB3aXRoCi0JICogZXh0ZW5kaW5nIGFuZCBidWZmZXJlZCB6ZXJvaW5nIHdyaXRlcyByYWNlLiAgSWYgdGhleSBkaWQKLQkgKiByYWNlIHRoZW4gdGhlIGJ1ZmZlcmVkIHplcm9pbmcgY291bGQgYmUgd3JpdHRlbiBiYWNrIGFmdGVyCi0JICogdGhlIE9fRElSRUNUIEkvTy4gIEl0J3Mgb25lIHRoaW5nIHRvIHRlbGwgcGVvcGxlIG5vdCB0byBtaXgKLQkgKiBidWZmZXJlZCBhbmQgT19ESVJFQ1Qgd3JpdGVzLCBidXQgZXhwZWN0aW5nIHRoZW0gdG8KLQkgKiB1bmRlcnN0YW5kIHRoYXQgZmlsZSBleHRlbnNpb24gaXMgYWxzbyBhbiBpbXBsaWNpdCBidWZmZXJlZAotCSAqIHdyaXRlIGlzIHRvbyBtdWNoLiAgQnkgZ2V0dGluZyB0aGUgUFIgd2UgZm9yY2Ugd3JpdGViYWNrIG9mCi0JICogdGhlIGJ1ZmZlcmVkIHplcm9pbmcgYmVmb3JlIHByb2NlZWRpbmcuCi0JICovCi0JcmV0ID0gb2NmczJfZGF0YV9sb2NrKGlub2RlLCAwKTsKLQlpZiAocmV0IDwgMCkgewotCQltbG9nX2Vycm5vKHJldCk7Ci0JCWdvdG8gb3V0OworCWlmICghb2NmczJfc3BhcnNlX2FsbG9jKE9DRlMyX1NCKGlub2RlLT5pX3NiKSkpIHsKKwkJLyoKKwkJICogV2UgZ2V0IFBSIGRhdGEgbG9ja3MgZXZlbiBmb3IgT19ESVJFQ1QuICBUaGlzCisJCSAqIGFsbG93cyBjb25jdXJyZW50IE9fRElSRUNUIEkvTyBidXQgZG9lc24ndCBsZXQKKwkJICogT19ESVJFQ1Qgd2l0aCBleHRlbmRpbmcgYW5kIGJ1ZmZlcmVkIHplcm9pbmcgd3JpdGVzCisJCSAqIHJhY2UuICBJZiB0aGV5IGRpZCByYWNlIHRoZW4gdGhlIGJ1ZmZlcmVkIHplcm9pbmcKKwkJICogY291bGQgYmUgd3JpdHRlbiBiYWNrIGFmdGVyIHRoZSBPX0RJUkVDVCBJL08uICBJdCdzCisJCSAqIG9uZSB0aGluZyB0byB0ZWxsIHBlb3BsZSBub3QgdG8gbWl4IGJ1ZmZlcmVkIGFuZAorCQkgKiBPX0RJUkVDVCB3cml0ZXMsIGJ1dCBleHBlY3RpbmcgdGhlbSB0byB1bmRlcnN0YW5kCisJCSAqIHRoYXQgZmlsZSBleHRlbnNpb24gaXMgYWxzbyBhbiBpbXBsaWNpdCBidWZmZXJlZAorCQkgKiB3cml0ZSBpcyB0b28gbXVjaC4gIEJ5IGdldHRpbmcgdGhlIFBSIHdlIGZvcmNlCisJCSAqIHdyaXRlYmFjayBvZiB0aGUgYnVmZmVyZWQgemVyb2luZyBiZWZvcmUKKwkJICogcHJvY2VlZGluZy4KKwkJICovCisJCXJldCA9IG9jZnMyX2RhdGFfbG9jayhpbm9kZSwgMCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCQlvY2ZzMl9kYXRhX3VubG9jayhpbm9kZSwgMCk7CiAJfQotCW9jZnMyX2RhdGFfdW5sb2NrKGlub2RlLCAwKTsKIAogCXJldCA9IGJsb2NrZGV2X2RpcmVjdF9JT19ub19sb2NraW5nKHJ3LCBpb2NiLCBpbm9kZSwKIAkJCQkJICAgIGlub2RlLT5pX3NiLT5zX2JkZXYsIGlvdiwgb2Zmc2V0LApAQCAtNjc1LDExICs2MDAsNzE1IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIHZvaWQgb2NmczJfZmlndXJlX2NsdXN0ZXJfYm91bmRhcmllcyhzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKKwkJCQkJICAgIHUzMiBjcG9zLAorCQkJCQkgICAgdW5zaWduZWQgaW50ICpzdGFydCwKKwkJCQkJICAgIHVuc2lnbmVkIGludCAqZW5kKQoreworCXVuc2lnbmVkIGludCBjbHVzdGVyX3N0YXJ0ID0gMCwgY2x1c3Rlcl9lbmQgPSBQQUdFX0NBQ0hFX1NJWkU7CisKKwlpZiAodW5saWtlbHkoUEFHRV9DQUNIRV9TSElGVCA+IG9zYi0+c19jbHVzdGVyc2l6ZV9iaXRzKSkgeworCQl1bnNpZ25lZCBpbnQgY3BwOworCisJCWNwcCA9IDEgPDwgKFBBR0VfQ0FDSEVfU0hJRlQgLSBvc2ItPnNfY2x1c3RlcnNpemVfYml0cyk7CisKKwkJY2x1c3Rlcl9zdGFydCA9IGNwb3MgJSBjcHA7CisJCWNsdXN0ZXJfc3RhcnQgPSBjbHVzdGVyX3N0YXJ0IDw8IG9zYi0+c19jbHVzdGVyc2l6ZV9iaXRzOworCisJCWNsdXN0ZXJfZW5kID0gY2x1c3Rlcl9zdGFydCArIG9zYi0+c19jbHVzdGVyc2l6ZTsKKwl9CisKKwlCVUdfT04oY2x1c3Rlcl9zdGFydCA+IFBBR0VfU0laRSk7CisJQlVHX09OKGNsdXN0ZXJfZW5kID4gUEFHRV9TSVpFKTsKKworCWlmIChzdGFydCkKKwkJKnN0YXJ0ID0gY2x1c3Rlcl9zdGFydDsKKwlpZiAoZW5kKQorCQkqZW5kID0gY2x1c3Rlcl9lbmQ7Cit9CisKKy8qCisgKiAnZnJvbScgYW5kICd0bycgYXJlIHRoZSByZWdpb24gaW4gdGhlIHBhZ2UgdG8gYXZvaWQgemVyb2luZy4KKyAqCisgKiBJZiBwYWdlc2l6ZSA+IGNsdXN0ZXJzaXplLCB0aGlzIGZ1bmN0aW9uIHdpbGwgYXZvaWQgemVyb2luZyBvdXRzaWRlCisgKiBvZiB0aGUgY2x1c3RlciBib3VuZGFyeS4KKyAqCisgKiBmcm9tID09IHRvID09IDAgaXMgY29kZSBmb3IgInplcm8gdGhlIGVudGlyZSBjbHVzdGVyIHJlZ2lvbiIKKyAqLworc3RhdGljIHZvaWQgb2NmczJfY2xlYXJfcGFnZV9yZWdpb25zKHN0cnVjdCBwYWdlICpwYWdlLAorCQkJCSAgICAgc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsIHUzMiBjcG9zLAorCQkJCSAgICAgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8pCit7CisJdm9pZCAqa2FkZHI7CisJdW5zaWduZWQgaW50IGNsdXN0ZXJfc3RhcnQsIGNsdXN0ZXJfZW5kOworCisJb2NmczJfZmlndXJlX2NsdXN0ZXJfYm91bmRhcmllcyhvc2IsIGNwb3MsICZjbHVzdGVyX3N0YXJ0LCAmY2x1c3Rlcl9lbmQpOworCisJa2FkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CisKKwlpZiAoZnJvbSB8fCB0bykgeworCQlpZiAoZnJvbSA+IGNsdXN0ZXJfc3RhcnQpCisJCQltZW1zZXQoa2FkZHIgKyBjbHVzdGVyX3N0YXJ0LCAwLCBmcm9tIC0gY2x1c3Rlcl9zdGFydCk7CisJCWlmICh0byA8IGNsdXN0ZXJfZW5kKQorCQkJbWVtc2V0KGthZGRyICsgdG8sIDAsIGNsdXN0ZXJfZW5kIC0gdG8pOworCX0gZWxzZSB7CisJCW1lbXNldChrYWRkciArIGNsdXN0ZXJfc3RhcnQsIDAsIGNsdXN0ZXJfZW5kIC0gY2x1c3Rlcl9zdGFydCk7CisJfQorCisJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOworfQorCisvKgorICogU29tZSBvZiB0aGlzIHRha2VuIGZyb20gYmxvY2tfcHJlcGFyZV93cml0ZSgpLiBXZSBhbHJlYWR5IGhhdmUgb3VyCisgKiBtYXBwaW5nIGJ5IG5vdyB0aG91Z2gsIGFuZCB0aGUgZW50aXJlIHdyaXRlIHdpbGwgYmUgYWxsb2NhdGluZyBvcgorICogaXQgd29uJ3QsIHNvIG5vdCBtdWNoIG5lZWQgdG8gdXNlIEJIX05ldy4KKyAqCisgKiBUaGlzIHdpbGwgYWxzbyBza2lwIHplcm9pbmcsIHdoaWNoIGlzIGhhbmRsZWQgZXh0ZXJuYWxseS4KKyAqLworaW50IG9jZnMyX21hcF9wYWdlX2Jsb2NrcyhzdHJ1Y3QgcGFnZSAqcGFnZSwgdTY0ICpwX2Jsa25vLAorCQkJICBzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1bnNpZ25lZCBpbnQgZnJvbSwKKwkJCSAgdW5zaWduZWQgaW50IHRvLCBpbnQgbmV3KQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBidWZmZXJfaGVhZCAqaGVhZCwgKmJoLCAqd2FpdFsyXSwgKip3YWl0X2JoID0gd2FpdDsKKwl1bnNpZ25lZCBpbnQgYmxvY2tfZW5kLCBibG9ja19zdGFydDsKKwl1bnNpZ25lZCBpbnQgYnNpemUgPSAxIDw8IGlub2RlLT5pX2Jsa2JpdHM7CisKKwlpZiAoIXBhZ2VfaGFzX2J1ZmZlcnMocGFnZSkpCisJCWNyZWF0ZV9lbXB0eV9idWZmZXJzKHBhZ2UsIGJzaXplLCAwKTsKKworCWhlYWQgPSBwYWdlX2J1ZmZlcnMocGFnZSk7CisJZm9yIChiaCA9IGhlYWQsIGJsb2NrX3N0YXJ0ID0gMDsgYmggIT0gaGVhZCB8fCAhYmxvY2tfc3RhcnQ7CisJICAgICBiaCA9IGJoLT5iX3RoaXNfcGFnZSwgYmxvY2tfc3RhcnQgKz0gYnNpemUpIHsKKwkJYmxvY2tfZW5kID0gYmxvY2tfc3RhcnQgKyBic2l6ZTsKKworCQkvKgorCQkgKiBJZ25vcmUgYmxvY2tzIG91dHNpZGUgb2Ygb3VyIGkvbyByYW5nZSAtCisJCSAqIHRoZXkgbWF5IGJlbG9uZyB0byB1bmFsbG9jYXRlZCBjbHVzdGVycy4KKwkJICovCisJCWlmIChibG9ja19zdGFydCA+PSB0byB8fCBibG9ja19lbmQgPD0gZnJvbSkgeworCQkJaWYgKFBhZ2VVcHRvZGF0ZShwYWdlKSkKKwkJCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyoKKwkJICogRm9yIGFuIGFsbG9jYXRpbmcgd3JpdGUgd2l0aCBjbHVzdGVyIHNpemUgPj0gcGFnZQorCQkgKiBzaXplLCB3ZSBhbHdheXMgd3JpdGUgdGhlIGVudGlyZSBwYWdlLgorCQkgKi8KKworCQlpZiAoYnVmZmVyX25ldyhiaCkpCisJCQljbGVhcl9idWZmZXJfbmV3KGJoKTsKKworCQlpZiAoIWJ1ZmZlcl9tYXBwZWQoYmgpKSB7CisJCQltYXBfYmgoYmgsIGlub2RlLT5pX3NiLCAqcF9ibGtubyk7CisJCQl1bm1hcF91bmRlcmx5aW5nX21ldGFkYXRhKGJoLT5iX2JkZXYsIGJoLT5iX2Jsb2NrbnIpOworCQl9CisKKwkJaWYgKFBhZ2VVcHRvZGF0ZShwYWdlKSkgeworCQkJaWYgKCFidWZmZXJfdXB0b2RhdGUoYmgpKQorCQkJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOworCQl9IGVsc2UgaWYgKCFidWZmZXJfdXB0b2RhdGUoYmgpICYmICFidWZmZXJfZGVsYXkoYmgpICYmCisJCSAgICAgKGJsb2NrX3N0YXJ0IDwgZnJvbSB8fCBibG9ja19lbmQgPiB0bykpIHsKKwkJCWxsX3J3X2Jsb2NrKFJFQUQsIDEsICZiaCk7CisJCQkqd2FpdF9iaCsrPWJoOworCQl9CisKKwkJKnBfYmxrbm8gPSAqcF9ibGtubyArIDE7CisJfQorCisJLyoKKwkgKiBJZiB3ZSBpc3N1ZWQgcmVhZCByZXF1ZXN0cyAtIGxldCB0aGVtIGNvbXBsZXRlLgorCSAqLworCXdoaWxlKHdhaXRfYmggPiB3YWl0KSB7CisJCXdhaXRfb25fYnVmZmVyKCotLXdhaXRfYmgpOworCQlpZiAoIWJ1ZmZlcl91cHRvZGF0ZSgqd2FpdF9iaCkpCisJCQlyZXQgPSAtRUlPOworCX0KKworCWlmIChyZXQgPT0gMCB8fCAhbmV3KQorCQlyZXR1cm4gcmV0OworCisJLyoKKwkgKiBJZiB3ZSBnZXQgLUVJTyBhYm92ZSwgemVybyBvdXQgYW55IG5ld2x5IGFsbG9jYXRlZCBibG9ja3MKKwkgKiB0byBhdm9pZCBleHBvc2luZyBzdGFsZSBkYXRhLgorCSAqLworCWJoID0gaGVhZDsKKwlibG9ja19zdGFydCA9IDA7CisJZG8geworCQl2b2lkICprYWRkcjsKKworCQlibG9ja19lbmQgPSBibG9ja19zdGFydCArIGJzaXplOworCQlpZiAoYmxvY2tfZW5kIDw9IGZyb20pCisJCQlnb3RvIG5leHRfYmg7CisJCWlmIChibG9ja19zdGFydCA+PSB0bykKKwkJCWJyZWFrOworCisJCWthZGRyID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOworCQltZW1zZXQoa2FkZHIrYmxvY2tfc3RhcnQsIDAsIGJoLT5iX3NpemUpOworCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwkJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOworCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwkJbWFya19idWZmZXJfZGlydHkoYmgpOworCituZXh0X2JoOgorCQlibG9ja19zdGFydCA9IGJsb2NrX2VuZDsKKwkJYmggPSBiaC0+Yl90aGlzX3BhZ2U7CisJfSB3aGlsZSAoYmggIT0gaGVhZCk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogVGhpcyB3aWxsIGNvcHkgdXNlciBkYXRhIGZyb20gdGhlIGJ1ZmZlciBwYWdlIGluIHRoZSBzcGxpY2UKKyAqIGNvbnRleHQuCisgKgorICogRm9yIG5vdywgd2UgaWdub3JlIFNQTElDRV9GX01PVkUgYXMgdGhhdCB3b3VsZCByZXF1aXJlIHNvbWUgZXh0cmEKKyAqIGNvbW11bmljYXRpb24gb3V0IGFsbCB0aGUgd2F5IHRvIG9jZnMyX3dyaXRlKCkuCisgKi8KK2ludCBvY2ZzMl9tYXBfYW5kX3dyaXRlX3NwbGljZV9kYXRhKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJICBzdHJ1Y3Qgb2NmczJfd3JpdGVfY3R4dCAqd2MsIHU2NCAqcF9ibGtubywKKwkJCQkgIHVuc2lnbmVkIGludCAqcmV0X2Zyb20sIHVuc2lnbmVkIGludCAqcmV0X3RvKQoreworCWludCByZXQ7CisJdW5zaWduZWQgaW50IHRvLCBmcm9tLCBjbHVzdGVyX3N0YXJ0LCBjbHVzdGVyX2VuZDsKKwljaGFyICpzcmMsICpkc3Q7CisJc3RydWN0IG9jZnMyX3NwbGljZV93cml0ZV9wcml2ICpzcCA9IHdjLT53X3ByaXZhdGU7CisJc3RydWN0IHBpcGVfYnVmZmVyICpidWYgPSBzcC0+c19idWY7CisJdW5zaWduZWQgbG9uZyBieXRlcywgc3JjX2Zyb207CisJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihpbm9kZS0+aV9zYik7CisKKwlvY2ZzMl9maWd1cmVfY2x1c3Rlcl9ib3VuZGFyaWVzKG9zYiwgd2MtPndfY3BvcywgJmNsdXN0ZXJfc3RhcnQsCisJCQkJCSZjbHVzdGVyX2VuZCk7CisKKwlmcm9tID0gc3AtPnNfb2Zmc2V0OworCXNyY19mcm9tID0gc3AtPnNfYnVmX29mZnNldDsKKwlieXRlcyA9IHdjLT53X2NvdW50OworCisJaWYgKHdjLT53X2xhcmdlX3BhZ2VzKSB7CisJCS8qCisJCSAqIEZvciBjbHVzdGVyIHNpemUgPCBwYWdlIHNpemUsIHdlIGhhdmUgdG8KKwkJICogY2FsY3VsYXRlIHBvcyB3aXRoaW4gdGhlIGNsdXN0ZXIgYW5kIG9iZXkKKwkJICogdGhlIHJpZ2h0bW9zdCBib3VuZGFyeS4KKwkJICovCisJCWJ5dGVzID0gbWluKGJ5dGVzLCAodW5zaWduZWQgbG9uZykob3NiLT5zX2NsdXN0ZXJzaXplCisJCQkJICAgLSAod2MtPndfcG9zICYgKG9zYi0+c19jbHVzdGVyc2l6ZSAtIDEpKSkpOworCX0KKwl0byA9IGZyb20gKyBieXRlczsKKworCWlmICh3Yy0+d190aGlzX3BhZ2VfbmV3KQorCQlyZXQgPSBvY2ZzMl9tYXBfcGFnZV9ibG9ja3Mod2MtPndfdGhpc19wYWdlLCBwX2Jsa25vLCBpbm9kZSwKKwkJCQkJICAgIGNsdXN0ZXJfc3RhcnQsIGNsdXN0ZXJfZW5kLCAxKTsKKwllbHNlCisJCXJldCA9IG9jZnMyX21hcF9wYWdlX2Jsb2Nrcyh3Yy0+d190aGlzX3BhZ2UsIHBfYmxrbm8sIGlub2RlLAorCQkJCQkgICAgZnJvbSwgdG8sIDApOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwlCVUdfT04oZnJvbSA+IFBBR0VfQ0FDSEVfU0laRSk7CisJQlVHX09OKHRvID4gUEFHRV9DQUNIRV9TSVpFKTsKKwlCVUdfT04oZnJvbSA+IG9zYi0+c19jbHVzdGVyc2l6ZSk7CisJQlVHX09OKHRvID4gb3NiLT5zX2NsdXN0ZXJzaXplKTsKKworCXNyYyA9IGJ1Zi0+b3BzLT5tYXAoc3AtPnNfcGlwZSwgYnVmLCAxKTsKKwlkc3QgPSBrbWFwX2F0b21pYyh3Yy0+d190aGlzX3BhZ2UsIEtNX1VTRVIxKTsKKwltZW1jcHkoZHN0ICsgZnJvbSwgc3JjICsgc3JjX2Zyb20sIGJ5dGVzKTsKKwlrdW5tYXBfYXRvbWljKHdjLT53X3RoaXNfcGFnZSwgS01fVVNFUjEpOworCWJ1Zi0+b3BzLT51bm1hcChzcC0+c19waXBlLCBidWYsIHNyYyk7CisKKwl3Yy0+d19maW5pc2hlZF9jb3B5ID0gMTsKKworCSpyZXRfZnJvbSA9IGZyb207CisJKnJldF90byA9IHRvOworb3V0OgorCisJcmV0dXJuIGJ5dGVzID8gKHVuc2lnbmVkIGludClieXRlcyA6IHJldDsKK30KKworLyoKKyAqIFRoaXMgd2lsbCBjb3B5IHVzZXIgZGF0YSBmcm9tIHRoZSBpb3ZlYyBpbiB0aGUgYnVmZmVyZWQgd3JpdGUKKyAqIGNvbnRleHQuCisgKi8KK2ludCBvY2ZzMl9tYXBfYW5kX3dyaXRlX3VzZXJfZGF0YShzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSAgc3RydWN0IG9jZnMyX3dyaXRlX2N0eHQgKndjLCB1NjQgKnBfYmxrbm8sCisJCQkJICB1bnNpZ25lZCBpbnQgKnJldF9mcm9tLCB1bnNpZ25lZCBpbnQgKnJldF90bykKK3sKKwlpbnQgcmV0OworCXVuc2lnbmVkIGludCB0bywgZnJvbSwgY2x1c3Rlcl9zdGFydCwgY2x1c3Rlcl9lbmQ7CisJdW5zaWduZWQgbG9uZyBieXRlcywgc3JjX2Zyb207CisJY2hhciAqZHN0OworCXN0cnVjdCBvY2ZzMl9idWZmZXJlZF93cml0ZV9wcml2ICpicCA9IHdjLT53X3ByaXZhdGU7CisJY29uc3Qgc3RydWN0IGlvdmVjICpjdXJfaW92ID0gYnAtPmJfY3VyX2lvdjsKKwljaGFyIF9fdXNlciAqYnVmOworCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoaW5vZGUtPmlfc2IpOworCisJb2NmczJfZmlndXJlX2NsdXN0ZXJfYm91bmRhcmllcyhvc2IsIHdjLT53X2Nwb3MsICZjbHVzdGVyX3N0YXJ0LAorCQkJCQkmY2x1c3Rlcl9lbmQpOworCisJYnVmID0gY3VyX2lvdi0+aW92X2Jhc2UgKyBicC0+Yl9jdXJfb2ZmOworCXNyY19mcm9tID0gKHVuc2lnbmVkIGxvbmcpYnVmICYgflBBR0VfQ0FDSEVfTUFTSzsKKworCWZyb20gPSB3Yy0+d19wb3MgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSk7CisKKwkvKgorCSAqIFRoaXMgaXMgYSBsb3Qgb2YgY29tcGFyaXNvbnMsIGJ1dCBpdCByZWFkcyBxdWl0ZQorCSAqIGVhc2lseSwgd2hpY2ggaXMgaW1wb3J0YW50IGhlcmUuCisJICovCisJLyogU3RheSB3aXRoaW4gdGhlIHNyYyBwYWdlICovCisJYnl0ZXMgPSBQQUdFX1NJWkUgLSBzcmNfZnJvbTsKKwkvKiBTdGF5IHdpdGhpbiB0aGUgdmVjdG9yICovCisJYnl0ZXMgPSBtaW4oYnl0ZXMsCisJCSAgICAodW5zaWduZWQgbG9uZykoY3VyX2lvdi0+aW92X2xlbiAtIGJwLT5iX2N1cl9vZmYpKTsKKwkvKiBTdGF5IHdpdGhpbiBjb3VudCAqLworCWJ5dGVzID0gbWluKGJ5dGVzLCAodW5zaWduZWQgbG9uZyl3Yy0+d19jb3VudCk7CisJLyoKKwkgKiBGb3IgY2x1c3RlcnNpemUgPiBwYWdlIHNpemUsIGp1c3Qgc3RheSB3aXRoaW4KKwkgKiB0YXJnZXQgcGFnZSwgb3RoZXJ3aXNlIHdlIGhhdmUgdG8gY2FsY3VsYXRlIHBvcworCSAqIHdpdGhpbiB0aGUgY2x1c3RlciBhbmQgb2JleSB0aGUgcmlnaHRtb3N0CisJICogYm91bmRhcnkuCisJICovCisJaWYgKHdjLT53X2xhcmdlX3BhZ2VzKSB7CisJCS8qCisJCSAqIEZvciBjbHVzdGVyIHNpemUgPCBwYWdlIHNpemUsIHdlIGhhdmUgdG8KKwkJICogY2FsY3VsYXRlIHBvcyB3aXRoaW4gdGhlIGNsdXN0ZXIgYW5kIG9iZXkKKwkJICogdGhlIHJpZ2h0bW9zdCBib3VuZGFyeS4KKwkJICovCisJCWJ5dGVzID0gbWluKGJ5dGVzLCAodW5zaWduZWQgbG9uZykob3NiLT5zX2NsdXN0ZXJzaXplCisJCQkJICAgLSAod2MtPndfcG9zICYgKG9zYi0+c19jbHVzdGVyc2l6ZSAtIDEpKSkpOworCX0gZWxzZSB7CisJCS8qCisJCSAqIGNsdXN0ZXIgc2l6ZSA+IHBhZ2Ugc2l6ZSBpcyB0aGUgbW9zdCBjb21tb24KKwkJICogY2FzZSAtIHdlIGp1c3Qgc3RheSB3aXRoaW4gdGhlIHRhcmdldCBwYWdlCisJCSAqIGJvdW5kYXJ5LgorCQkgKi8KKwkJYnl0ZXMgPSBtaW4oYnl0ZXMsIFBBR0VfQ0FDSEVfU0laRSAtIGZyb20pOworCX0KKworCXRvID0gZnJvbSArIGJ5dGVzOworCisJaWYgKHdjLT53X3RoaXNfcGFnZV9uZXcpCisJCXJldCA9IG9jZnMyX21hcF9wYWdlX2Jsb2Nrcyh3Yy0+d190aGlzX3BhZ2UsIHBfYmxrbm8sIGlub2RlLAorCQkJCQkgICAgY2x1c3Rlcl9zdGFydCwgY2x1c3Rlcl9lbmQsIDEpOworCWVsc2UKKwkJcmV0ID0gb2NmczJfbWFwX3BhZ2VfYmxvY2tzKHdjLT53X3RoaXNfcGFnZSwgcF9ibGtubywgaW5vZGUsCisJCQkJCSAgICBmcm9tLCB0bywgMCk7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCUJVR19PTihmcm9tID4gUEFHRV9DQUNIRV9TSVpFKTsKKwlCVUdfT04odG8gPiBQQUdFX0NBQ0hFX1NJWkUpOworCUJVR19PTihmcm9tID4gb3NiLT5zX2NsdXN0ZXJzaXplKTsKKwlCVUdfT04odG8gPiBvc2ItPnNfY2x1c3RlcnNpemUpOworCisJZHN0ID0ga21hcCh3Yy0+d190aGlzX3BhZ2UpOworCW1lbWNweShkc3QgKyBmcm9tLCBicC0+Yl9zcmNfYnVmICsgc3JjX2Zyb20sIGJ5dGVzKTsKKwlrdW5tYXAod2MtPndfdGhpc19wYWdlKTsKKworCS8qCisJICogWFhYOiBUaGlzIGlzIHNsb3csIGJ1dCBzaW1wbGUuIFRoZSBjYWxsZXIgb2YKKwkgKiBvY2ZzMl9idWZmZXJlZF93cml0ZV9jbHVzdGVyKCkgaXMgcmVzcG9uc2libGUgZm9yCisJICogcGFzc2luZyB0aHJvdWdoIHRoZSBpb3ZlY3MsIHNvIGl0J3MgZGlmZmljdWx0IHRvCisJICogcHJlZGljdCB3aGF0IG91ciBuZXh0IHN0ZXAgaXMgaW4gaGVyZSBhZnRlciBvdXIKKwkgKiBpbml0aWFsIHdyaXRlLiBBIGZ1dHVyZSB2ZXJzaW9uIHNob3VsZCBiZSBwdXNoaW5nCisJICogdGhhdCBpb3ZlYyBtYW5pcHVsYXRpb24gZnVydGhlciBkb3duLgorCSAqCisJICogQnkgc2V0dGluZyB0aGlzLCB3ZSBpbmRpY2F0ZSB0aGF0IGEgY29weSBmcm9tIHVzZXIKKwkgKiBkYXRhIHdhcyBkb25lLCBhbmQgc3Vic2VxdWVudCBjYWxscyBmb3IgdGhpcworCSAqIGNsdXN0ZXIgd2lsbCBza2lwIGNvcHlpbmcgbW9yZSBkYXRhLgorCSAqLworCXdjLT53X2ZpbmlzaGVkX2NvcHkgPSAxOworCisJKnJldF9mcm9tID0gZnJvbTsKKwkqcmV0X3RvID0gdG87CitvdXQ6CisKKwlyZXR1cm4gYnl0ZXMgPyAodW5zaWduZWQgaW50KWJ5dGVzIDogcmV0OworfQorCisvKgorICogTWFwLCBmaWxsIGFuZCB3cml0ZSBhIHBhZ2UgdG8gZGlzay4KKyAqCisgKiBUaGUgd29yayBvZiBjb3B5aW5nIGRhdGEgaXMgZG9uZSB2aWEgY2FsbGJhY2suICBOZXdseSBhbGxvY2F0ZWQKKyAqIHBhZ2VzIHdoaWNoIGRvbid0IHRha2UgdXNlciBkYXRhIHdpbGwgYmUgemVybydkIChzZXQgJ25ldycgdG8KKyAqIGluZGljYXRlIGFuIGFsbG9jYXRpbmcgd3JpdGUpCisgKgorICogUmV0dXJucyBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb3IgdGhlIG51bWJlciBvZiBieXRlcyBjb3BpZWQgaW50bworICogdGhlIHBhZ2UuCisgKi8KK2ludCBvY2ZzMl93cml0ZV9kYXRhX3BhZ2Uoc3RydWN0IGlub2RlICppbm9kZSwgaGFuZGxlX3QgKmhhbmRsZSwKKwkJCSAgdTY0ICpwX2Jsa25vLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCSAgc3RydWN0IG9jZnMyX3dyaXRlX2N0eHQgKndjLCBpbnQgbmV3KQoreworCWludCByZXQsIGNvcGllZCA9IDA7CisJdW5zaWduZWQgaW50IGZyb20gPSAwLCB0byA9IDA7CisJdW5zaWduZWQgaW50IGNsdXN0ZXJfc3RhcnQsIGNsdXN0ZXJfZW5kOworCXVuc2lnbmVkIGludCB6ZXJvX2Zyb20gPSAwLCB6ZXJvX3RvID0gMDsKKworCW9jZnMyX2ZpZ3VyZV9jbHVzdGVyX2JvdW5kYXJpZXMoT0NGUzJfU0IoaW5vZGUtPmlfc2IpLCB3Yy0+d19jcG9zLAorCQkJCQkmY2x1c3Rlcl9zdGFydCwgJmNsdXN0ZXJfZW5kKTsKKworCWlmICgod2MtPndfcG9zID4+IFBBR0VfQ0FDSEVfU0hJRlQpID09IHBhZ2UtPmluZGV4CisJICAgICYmICF3Yy0+d19maW5pc2hlZF9jb3B5KSB7CisKKwkJd2MtPndfdGhpc19wYWdlID0gcGFnZTsKKwkJd2MtPndfdGhpc19wYWdlX25ldyA9IG5ldzsKKwkJcmV0ID0gd2MtPndfd3JpdGVfZGF0YV9wYWdlKGlub2RlLCB3YywgcF9ibGtubywgJmZyb20sICZ0byk7CisJCWlmIChyZXQgPCAwKSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWNvcGllZCA9IHJldDsKKworCQl6ZXJvX2Zyb20gPSBmcm9tOworCQl6ZXJvX3RvID0gdG87CisJCWlmIChuZXcpIHsKKwkJCWZyb20gPSBjbHVzdGVyX3N0YXJ0OworCQkJdG8gPSBjbHVzdGVyX2VuZDsKKwkJfQorCX0gZWxzZSB7CisJCS8qCisJCSAqIElmIHdlIGhhdmVuJ3QgYWxsb2NhdGVkIHRoZSBuZXcgcGFnZSB5ZXQsIHdlCisJCSAqIHNob3VsZG4ndCBiZSB3cml0aW5nIGl0IG91dCB3aXRob3V0IGNvcHlpbmcgdXNlcgorCQkgKiBkYXRhLiBUaGlzIGlzIGxpa2VseSBhIG1hdGggZXJyb3IgZnJvbSB0aGUgY2FsbGVyLgorCQkgKi8KKwkJQlVHX09OKCFuZXcpOworCisJCWZyb20gPSBjbHVzdGVyX3N0YXJ0OworCQl0byA9IGNsdXN0ZXJfZW5kOworCisJCXJldCA9IG9jZnMyX21hcF9wYWdlX2Jsb2NrcyhwYWdlLCBwX2Jsa25vLCBpbm9kZSwKKwkJCQkJICAgIGNsdXN0ZXJfc3RhcnQsIGNsdXN0ZXJfZW5kLCAxKTsKKwkJaWYgKHJldCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwkvKgorCSAqIFBhcnRzIG9mIG5ld2x5IGFsbG9jYXRlZCBwYWdlcyBuZWVkIHRvIGJlIHplcm8nZC4KKwkgKgorCSAqIEFib3ZlLCB3ZSBoYXZlIGFsc28gcmV3cml0dGVuICd0bycgYW5kICdmcm9tJyAtIGFzIGZhciBhcworCSAqIHRoZSByZXN0IG9mIHRoZSBmdW5jdGlvbiBpcyBjb25jZXJuZWQsIHRoZSBlbnRpcmUgY2x1c3RlcgorCSAqIHJhbmdlIGluc2lkZSBvZiBhIHBhZ2UgbmVlZHMgdG8gYmUgd3JpdHRlbi4KKwkgKgorCSAqIFdlIGNhbiBza2lwIHRoaXMgaWYgdGhlIHBhZ2UgaXMgdXAgdG8gZGF0ZSAtIGl0J3MgYWxyZWFkeQorCSAqIGJlZW4gemVybydkIGZyb20gYmVpbmcgcmVhZCBpbiBhcyBhIGhvbGUuCisJICovCisJaWYgKG5ldyAmJiAhUGFnZVVwdG9kYXRlKHBhZ2UpKQorCQlvY2ZzMl9jbGVhcl9wYWdlX3JlZ2lvbnMocGFnZSwgT0NGUzJfU0IoaW5vZGUtPmlfc2IpLAorCQkJCQkgd2MtPndfY3BvcywgemVyb19mcm9tLCB6ZXJvX3RvKTsKKworCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCisJaWYgKG9jZnMyX3Nob3VsZF9vcmRlcl9kYXRhKGlub2RlKSkgeworCQlyZXQgPSB3YWxrX3BhZ2VfYnVmZmVycyhoYW5kbGUsCisJCQkJCXBhZ2VfYnVmZmVycyhwYWdlKSwKKwkJCQkJZnJvbSwgdG8sIE5VTEwsCisJCQkJCW9jZnMyX2pvdXJuYWxfZGlydHlfZGF0YSk7CisJCWlmIChyZXQgPCAwKQorCQkJbWxvZ19lcnJubyhyZXQpOworCX0KKworCS8qCisJICogV2UgZG9uJ3QgdXNlIGdlbmVyaWNfY29tbWl0X3dyaXRlKCkgYmVjYXVzZSB3ZSBuZWVkIHRvCisJICogaGFuZGxlIG91ciBvd24gaV9zaXplIHVwZGF0ZS4KKwkgKi8KKwlyZXQgPSBibG9ja19jb21taXRfd3JpdGUocGFnZSwgZnJvbSwgdG8pOworCWlmIChyZXQpCisJCW1sb2dfZXJybm8ocmV0KTsKK291dDoKKworCXJldHVybiBjb3BpZWQgPyBjb3BpZWQgOiByZXQ7Cit9CisKKy8qCisgKiBEbyB0aGUgYWN0dWFsIHdyaXRlIG9mIHNvbWUgZGF0YSBpbnRvIGFuIGlub2RlLiBPcHRpb25hbGx5IGFsbG9jYXRlCisgKiBpbiBvcmRlciB0byBmdWxmaWxsIHRoZSB3cml0ZS4KKyAqCisgKiBjcG9zIGlzIHRoZSBsb2dpY2FsIGNsdXN0ZXIgb2Zmc2V0IHdpdGhpbiB0aGUgZmlsZSB0byB3cml0ZSBhdAorICoKKyAqICdwaHlzJyBpcyB0aGUgcGh5c2ljYWwgbWFwcGluZyBvZiB0aGF0IG9mZnNldC4gYSAncGh5cycgdmFsdWUgb2YKKyAqIHplcm8gaW5kaWNhdGVzIHRoYXQgYWxsb2NhdGlvbiBpcyByZXF1aXJlZC4gSW4gdGhpcyBjYXNlLCBkYXRhX2FjCisgKiBhbmQgbWV0YV9hYyBzaG91bGQgYmUgdmFsaWQgKG1ldGFfYWMgY2FuIGJlIG51bGwgaWYgbWV0YWRhdGEKKyAqIGFsbG9jYXRpb24gaXNuJ3QgcmVxdWlyZWQpLgorICovCitzdGF0aWMgc3NpemVfdCBvY2ZzMl93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgdTMyIHBoeXMsIGhhbmRsZV90ICpoYW5kbGUsCisJCQkgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpX2JoLAorCQkJICAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKmRhdGFfYWMsCisJCQkgICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqbWV0YV9hYywKKwkJCSAgIHN0cnVjdCBvY2ZzMl93cml0ZV9jdHh0ICp3YykKK3sKKwlpbnQgcmV0LCBpLCBudW1wYWdlcyA9IDEsIG5ldzsKKwl1bnNpZ25lZCBpbnQgY29waWVkID0gMDsKKwl1MzIgdG1wX3BvczsKKwl1NjQgdl9ibGtubywgcF9ibGtubzsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGZpbGUtPmZfbWFwcGluZzsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbWFwcGluZy0+aG9zdDsKKwl1bnNpZ25lZCBsb25nIGluZGV4LCBzdGFydDsKKwlzdHJ1Y3QgcGFnZSAqKmNwYWdlczsKKworCW5ldyA9IHBoeXMgPT0gMCA/IDEgOiAwOworCisJLyoKKwkgKiBGaWd1cmUgb3V0IGhvdyBtYW55IHBhZ2VzIHdlJ2xsIGJlIG1hbmlwdWxhdGluZyBoZXJlLiBGb3IKKwkgKiBub24gYWxsb2NhdGluZyB3cml0ZSwgd2UganVzdCBjaGFuZ2UgdGhlIG9uZQorCSAqIHBhZ2UuIE90aGVyd2lzZSwgd2UnbGwgbmVlZCBhIHdob2xlIGNsdXN0ZXJzIHdvcnRoLgorCSAqLworCWlmIChuZXcpCisJCW51bXBhZ2VzID0gb2NmczJfcGFnZXNfcGVyX2NsdXN0ZXIoaW5vZGUtPmlfc2IpOworCisJY3BhZ2VzID0ga3phbGxvYyhzaXplb2YoKmNwYWdlcykgKiBudW1wYWdlcywgR0ZQX05PRlMpOworCWlmICghY3BhZ2VzKSB7CisJCXJldCA9IC1FTk9NRU07CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKgorCSAqIEZpbGwgb3VyIHBhZ2UgYXJyYXkgZmlyc3QuIFRoYXQgd2F5IHdlJ3ZlIGdyYWJiZWQgZW5vdWdoIHNvCisJICogdGhhdCB3ZSBjYW4gemVybyBhbmQgZmx1c2ggaWYgd2UgZXJyb3IgYWZ0ZXIgYWRkaW5nIHRoZQorCSAqIGV4dGVudC4KKwkgKi8KKwlpZiAobmV3KSB7CisJCXN0YXJ0ID0gb2NmczJfYWxpZ25fY2x1c3RlcnNfdG9fcGFnZV9pbmRleChpbm9kZS0+aV9zYiwKKwkJCQkJCQkgICB3Yy0+d19jcG9zKTsKKwkJdl9ibGtubyA9IG9jZnMyX2NsdXN0ZXJzX3RvX2Jsb2Nrcyhpbm9kZS0+aV9zYiwgd2MtPndfY3Bvcyk7CisJfSBlbHNlIHsKKwkJc3RhcnQgPSB3Yy0+d19wb3MgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwkJdl9ibGtubyA9IHdjLT53X3BvcyA+PiBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0czsKKwl9CisKKwlmb3IoaSA9IDA7IGkgPCBudW1wYWdlczsgaSsrKSB7CisJCWluZGV4ID0gc3RhcnQgKyBpOworCisJCWNwYWdlc1tpXSA9IGdyYWJfY2FjaGVfcGFnZShtYXBwaW5nLCBpbmRleCk7CisJCWlmICghY3BhZ2VzW2ldKSB7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwlpZiAobmV3KSB7CisJCS8qCisJCSAqIFRoaXMgaXMgc2FmZSB0byBjYWxsIHdpdGggdGhlIHBhZ2UgbG9ja3MgLSBpdCB3b24ndCB0YWtlCisJCSAqIGFueSBhZGRpdGlvbmFsIHNlbWFwaG9yZXMgb3IgY2x1c3RlciBsb2Nrcy4KKwkJICovCisJCXRtcF9wb3MgPSB3Yy0+d19jcG9zOworCQlyZXQgPSBvY2ZzMl9kb19leHRlbmRfYWxsb2NhdGlvbihPQ0ZTMl9TQihpbm9kZS0+aV9zYiksIGlub2RlLAorCQkJCQkJICZ0bXBfcG9zLCAxLCBkaV9iaCwgaGFuZGxlLAorCQkJCQkJIGRhdGFfYWMsIG1ldGFfYWMsIE5VTEwpOworCQkvKgorCQkgKiBUaGlzIHNob3VsZG4ndCBoYXBwZW4gYmVjYXVzZSB3ZSBtdXN0IGhhdmUgYWxyZWFkeQorCQkgKiBjYWxjdWxhdGVkIHRoZSBjb3JyZWN0IG1ldGEgZGF0YSBhbGxvY2F0aW9uIHJlcXVpcmVkLiBUaGUKKwkJICogaW50ZXJuYWwgdHJlZSBhbGxvY2F0aW9uIGNvZGUgc2hvdWxkIGtub3cgaG93IHRvIGluY3JlYXNlCisJCSAqIHRyYW5zYWN0aW9uIGNyZWRpdHMgaXRzZWxmLgorCQkgKgorCQkgKiBJZiBuZWVkIGJlLCB3ZSBjb3VsZCBoYW5kbGUgLUVBR0FJTiBmb3IgYQorCQkgKiBSRVNUQVJUX1RSQU5TIGhlcmUuCisJCSAqLworCQltbG9nX2J1Z19vbl9tc2cocmV0ID09IC1FQUdBSU4sCisJCQkJIklub2RlICVsbHU6IEVBR0FJTiByZXR1cm4gZHVyaW5nIGFsbG9jYXRpb24uXG4iLAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJcmV0ID0gb2NmczJfZXh0ZW50X21hcF9nZXRfYmxvY2tzKGlub2RlLCB2X2Jsa25vLCAmcF9ibGtubywgTlVMTCwKKwkJCQkJICBOVUxMKTsKKwlpZiAocmV0IDwgMCkgeworCisJCS8qCisJCSAqIFhYWDogU2hvdWxkIHdlIGdvIHJlYWRvbmx5IGhlcmU/CisJCSAqLworCisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJQlVHX09OKHBfYmxrbm8gPT0gMCk7CisKKwlmb3IoaSA9IDA7IGkgPCBudW1wYWdlczsgaSsrKSB7CisJCXJldCA9IG9jZnMyX3dyaXRlX2RhdGFfcGFnZShpbm9kZSwgaGFuZGxlLCAmcF9ibGtubywgY3BhZ2VzW2ldLAorCQkJCQkgICAgd2MsIG5ldyk7CisJCWlmIChyZXQgPCAwKSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWNvcGllZCArPSByZXQ7CisJfQorCitvdXQ6CisJZm9yKGkgPSAwOyBpIDwgbnVtcGFnZXM7IGkrKykgeworCQl1bmxvY2tfcGFnZShjcGFnZXNbaV0pOworCQltYXJrX3BhZ2VfYWNjZXNzZWQoY3BhZ2VzW2ldKTsKKwkJcGFnZV9jYWNoZV9yZWxlYXNlKGNwYWdlc1tpXSk7CisJfQorCWtmcmVlKGNwYWdlcyk7CisKKwlyZXR1cm4gY29waWVkID8gY29waWVkIDogcmV0OworfQorCitzdGF0aWMgdm9pZCBvY2ZzMl93cml0ZV9jdHh0X2luaXQoc3RydWN0IG9jZnMyX3dyaXRlX2N0eHQgKndjLAorCQkJCSAgc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsIGxvZmZfdCBwb3MsCisJCQkJICBzaXplX3QgY291bnQsIG9jZnMyX3BhZ2Vfd3JpdGVyICpjYiwKKwkJCQkgIHZvaWQgKmNiX3ByaXYpCit7CisJd2MtPndfY291bnQgPSBjb3VudDsKKwl3Yy0+d19wb3MgPSBwb3M7CisJd2MtPndfY3BvcyA9IHdjLT53X3BvcyA+PiBvc2ItPnNfY2x1c3RlcnNpemVfYml0czsKKwl3Yy0+d19maW5pc2hlZF9jb3B5ID0gMDsKKworCWlmICh1bmxpa2VseShQQUdFX0NBQ0hFX1NISUZUID4gb3NiLT5zX2NsdXN0ZXJzaXplX2JpdHMpKQorCQl3Yy0+d19sYXJnZV9wYWdlcyA9IDE7CisJZWxzZQorCQl3Yy0+d19sYXJnZV9wYWdlcyA9IDA7CisKKwl3Yy0+d193cml0ZV9kYXRhX3BhZ2UgPSBjYjsKKwl3Yy0+d19wcml2YXRlID0gY2JfcHJpdjsKK30KKworLyoKKyAqIFdyaXRlIGEgY2x1c3RlciB0byBhbiBpbm9kZS4gVGhlIGNsdXN0ZXIgbWF5IG5vdCBiZSBhbGxvY2F0ZWQgeWV0LAorICogaW4gd2hpY2ggY2FzZSBpdCB3aWxsIGJlLiBUaGlzIG9ubHkgZXhpc3RzIGZvciBidWZmZXJlZCB3cml0ZXMgLQorICogT19ESVJFQ1QgdGFrZXMgYSBtb3JlICJ0cmFkaXRpb25hbCIgcGF0aCB0aHJvdWdoIHRoZSBrZXJuZWwuCisgKgorICogVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgaW5jcmVtZW50aW5nIHBvcywgd3JpdHRlbiBjb3VudHMsIGV0YworICoKKyAqIEZvciBmaWxlIHN5c3RlbXMgdGhhdCBkb24ndCBzdXBwb3J0IHNwYXJzZSBmaWxlcywgcHJlLWFsbG9jYXRpb24KKyAqIGFuZCBwYWdlIHplcm9pbmcgdXAgdW50aWwgY3BvcyBzaG91bGQgYmUgZG9uZSBwcmlvciB0byB0aGlzCisgKiBmdW5jdGlvbiBjYWxsLgorICoKKyAqIENhbGxlcnMgc2hvdWxkIGJlIGhvbGRpbmcgaV9zZW0sIGFuZCB0aGUgcncgY2x1c3RlciBsb2NrLgorICoKKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiB1c2VyIGJ5dGVzIHdyaXR0ZW4sIG9yIGxlc3MgdGhhbiB6ZXJvIGZvcgorICogZXJyb3IuCisgKi8KK3NzaXplX3Qgb2NmczJfYnVmZmVyZWRfd3JpdGVfY2x1c3RlcihzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IHBvcywKKwkJCQkgICAgIHNpemVfdCBjb3VudCwgb2NmczJfcGFnZV93cml0ZXIgKmFjdG9yLAorCQkJCSAgICAgdm9pZCAqcHJpdikKK3sKKwlpbnQgcmV0LCBjcmVkaXRzID0gT0NGUzJfSU5PREVfVVBEQVRFX0NSRURJVFM7CisJc3NpemVfdCB3cml0dGVuID0gMDsKKwl1MzIgcGh5czsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9tYXBwaW5nLT5ob3N0OworCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoaW5vZGUtPmlfc2IpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqZGlfYmggPSBOVUxMOworCXN0cnVjdCBvY2ZzMl9kaW5vZGUgKmRpOworCXN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICpkYXRhX2FjID0gTlVMTDsKKwlzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqbWV0YV9hYyA9IE5VTEw7CisJaGFuZGxlX3QgKmhhbmRsZTsKKwlzdHJ1Y3Qgb2NmczJfd3JpdGVfY3R4dCB3YzsKKworCW9jZnMyX3dyaXRlX2N0eHRfaW5pdCgmd2MsIG9zYiwgcG9zLCBjb3VudCwgYWN0b3IsIHByaXYpOworCisJcmV0ID0gb2NmczJfbWV0YV9sb2NrKGlub2RlLCAmZGlfYmgsIDEpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisJZGkgPSAoc3RydWN0IG9jZnMyX2Rpbm9kZSAqKWRpX2JoLT5iX2RhdGE7CisKKwkvKgorCSAqIFRha2UgYWxsb2Mgc2VtIGhlcmUgdG8gcHJldmVudCBjb25jdXJyZW50IGxvb2t1cHMuIFRoYXQgd2F5CisJICogdGhlIG1hcHBpbmcsIHplcm9pbmcgYW5kIHRyZWUgbWFuaXB1bGF0aW9uIHdpdGhpbgorCSAqIG9jZnMyX3dyaXRlKCkgd2lsbCBiZSBzYWZlIGFnYWluc3QgLT5yZWFkcGFnZSgpLiBUaGlzCisJICogc2hvdWxkIGFsc28gc2VydmUgdG8gbG9jayBvdXQgYWxsb2NhdGlvbiBmcm9tIGEgc2hhcmVkCisJICogd3JpdGVhYmxlIHJlZ2lvbi4KKwkgKi8KKwlkb3duX3dyaXRlKCZPQ0ZTMl9JKGlub2RlKS0+aXBfYWxsb2Nfc2VtKTsKKworCXJldCA9IG9jZnMyX2dldF9jbHVzdGVycyhpbm9kZSwgd2Mud19jcG9zLCAmcGh5cywgTlVMTCwgTlVMTCk7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0X21ldGE7CisJfQorCisJLyogcGh5cyA9PSAwIG1lYW5zIHRoYXQgYWxsb2NhdGlvbiBpcyByZXF1aXJlZC4gKi8KKwlpZiAocGh5cyA9PSAwKSB7CisJCXJldCA9IG9jZnMyX2xvY2tfYWxsb2NhdG9ycyhpbm9kZSwgZGksIDEsICZkYXRhX2FjLCAmbWV0YV9hYyk7CisJCWlmIChyZXQpIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0X21ldGE7CisJCX0KKworCQljcmVkaXRzID0gb2NmczJfY2FsY19leHRlbmRfY3JlZGl0cyhpbm9kZS0+aV9zYiwgZGksIDEpOworCX0KKworCXJldCA9IG9jZnMyX2RhdGFfbG9jayhpbm9kZSwgMSk7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0X21ldGE7CisJfQorCisJaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBjcmVkaXRzKTsKKwlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKKwkJcmV0ID0gUFRSX0VSUihoYW5kbGUpOworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0X2RhdGE7CisJfQorCisJd3JpdHRlbiA9IG9jZnMyX3dyaXRlKGZpbGUsIHBoeXMsIGhhbmRsZSwgZGlfYmgsIGRhdGFfYWMsCisJCQkgICAgICBtZXRhX2FjLCAmd2MpOworCWlmICh3cml0dGVuIDwgMCkgeworCQlyZXQgPSB3cml0dGVuOworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0X2NvbW1pdDsKKwl9CisKKwlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCBkaV9iaCwKKwkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0X2NvbW1pdDsKKwl9CisKKwlwb3MgKz0gd3JpdHRlbjsKKwlpZiAocG9zID4gaW5vZGUtPmlfc2l6ZSkgeworCQlpX3NpemVfd3JpdGUoaW5vZGUsIHBvcyk7CisJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCX0KKwlpbm9kZS0+aV9ibG9ja3MgPSBvY2ZzMl9pbm9kZV9zZWN0b3JfY291bnQoaW5vZGUpOworCWRpLT5pX3NpemUgPSBjcHVfdG9fbGU2NCgodTY0KWlfc2l6ZV9yZWFkKGlub2RlKSk7CisJaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRTsKKwlkaS0+aV9tdGltZSA9IGRpLT5pX2N0aW1lID0gY3B1X3RvX2xlNjQoaW5vZGUtPmlfbXRpbWUudHZfc2VjKTsKKwlkaS0+aV9tdGltZV9uc2VjID0gZGktPmlfY3RpbWVfbnNlYyA9IGNwdV90b19sZTMyKGlub2RlLT5pX210aW1lLnR2X25zZWMpOworCisJcmV0ID0gb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIGRpX2JoKTsKKwlpZiAocmV0KQorCQltbG9nX2Vycm5vKHJldCk7CisKK291dF9jb21taXQ6CisJb2NmczJfY29tbWl0X3RyYW5zKG9zYiwgaGFuZGxlKTsKKworb3V0X2RhdGE6CisJb2NmczJfZGF0YV91bmxvY2soaW5vZGUsIDEpOworCitvdXRfbWV0YToKKwl1cF93cml0ZSgmT0NGUzJfSShpbm9kZSktPmlwX2FsbG9jX3NlbSk7CisJb2NmczJfbWV0YV91bmxvY2soaW5vZGUsIDEpOworCitvdXQ6CisJYnJlbHNlKGRpX2JoKTsKKwlpZiAoZGF0YV9hYykKKwkJb2NmczJfZnJlZV9hbGxvY19jb250ZXh0KGRhdGFfYWMpOworCWlmIChtZXRhX2FjKQorCQlvY2ZzMl9mcmVlX2FsbG9jX2NvbnRleHQobWV0YV9hYyk7CisKKwlyZXR1cm4gd3JpdHRlbiA/IHdyaXR0ZW4gOiByZXQ7Cit9CisKIGNvbnN0IHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgb2NmczJfYW9wcyA9IHsKIAkucmVhZHBhZ2UJPSBvY2ZzMl9yZWFkcGFnZSwKIAkud3JpdGVwYWdlCT0gb2NmczJfd3JpdGVwYWdlLAotCS5wcmVwYXJlX3dyaXRlCT0gb2NmczJfcHJlcGFyZV93cml0ZSwKLQkuY29tbWl0X3dyaXRlCT0gb2NmczJfY29tbWl0X3dyaXRlLAogCS5ibWFwCQk9IG9jZnMyX2JtYXAsCiAJLnN5bmNfcGFnZQk9IGJsb2NrX3N5bmNfcGFnZSwKIAkuZGlyZWN0X0lPCT0gb2NmczJfZGlyZWN0X0lPLApkaWZmIC0tZ2l0IGEvZnMvb2NmczIvYW9wcy5oIGIvZnMvb2NmczIvYW9wcy5oCmluZGV4IGY0NDZhMTUuLjQ1ODIxZDQgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2FvcHMuaAorKysgYi9mcy9vY2ZzMi9hb3BzLmgKQEAgLTMwLDEyICszMCw4MyBAQAogCQkJCQkJCSB1bnNpZ25lZCBmcm9tLAogCQkJCQkJCSB1bnNpZ25lZCB0byk7CiAKK2ludCBvY2ZzMl9tYXBfcGFnZV9ibG9ja3Moc3RydWN0IHBhZ2UgKnBhZ2UsIHU2NCAqcF9ibGtubywKKwkJCSAgc3RydWN0IGlub2RlICppbm9kZSwgdW5zaWduZWQgaW50IGZyb20sCisJCQkgIHVuc2lnbmVkIGludCB0bywgaW50IG5ldyk7CisKK2ludCB3YWxrX3BhZ2VfYnVmZmVycygJaGFuZGxlX3QgKmhhbmRsZSwKKwkJCXN0cnVjdCBidWZmZXJfaGVhZCAqaGVhZCwKKwkJCXVuc2lnbmVkIGZyb20sCisJCQl1bnNpZ25lZCB0bywKKwkJCWludCAqcGFydGlhbCwKKwkJCWludCAoKmZuKSgJaGFuZGxlX3QgKmhhbmRsZSwKKwkJCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkpOworCitzdHJ1Y3Qgb2NmczJfd3JpdGVfY3R4dDsKK3R5cGVkZWYgaW50IChvY2ZzMl9wYWdlX3dyaXRlcikoc3RydWN0IGlub2RlICosIHN0cnVjdCBvY2ZzMl93cml0ZV9jdHh0ICosCisJCQkJdTY0ICosIHVuc2lnbmVkIGludCAqLCB1bnNpZ25lZCBpbnQgKik7CisKK3NzaXplX3Qgb2NmczJfYnVmZmVyZWRfd3JpdGVfY2x1c3RlcihzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IHBvcywKKwkJCQkgICAgIHNpemVfdCBjb3VudCwgb2NmczJfcGFnZV93cml0ZXIgKmFjdG9yLAorCQkJCSAgICAgdm9pZCAqcHJpdik7CisKK3N0cnVjdCBvY2ZzMl93cml0ZV9jdHh0IHsKKwlzaXplX3QJCQkJd19jb3VudDsKKwlsb2ZmX3QJCQkJd19wb3M7CisJdTMyCQkJCXdfY3BvczsKKwl1bnNpZ25lZCBpbnQJCQl3X2ZpbmlzaGVkX2NvcHk7CisKKwkvKiBUaGlzIGlzIHRydWUgaWYgcGFnZV9zaXplID4gY2x1c3Rlcl9zaXplICovCisJdW5zaWduZWQgaW50CQkJd19sYXJnZV9wYWdlczsKKworCS8qIEZpbGxlciBjYWxsYmFjayBhbmQgcHJpdmF0ZSBkYXRhICovCisJb2NmczJfcGFnZV93cml0ZXIJCSp3X3dyaXRlX2RhdGFfcGFnZTsKKwl2b2lkCQkJCSp3X3ByaXZhdGU7CisKKwkvKiBPbmx5IHZhbGlkIGZvciB0aGUgZmlsbGVyIGNhbGxiYWNrICovCisJc3RydWN0IHBhZ2UJCQkqd190aGlzX3BhZ2U7CisJdW5zaWduZWQgaW50CQkJd190aGlzX3BhZ2VfbmV3OworfTsKKworc3RydWN0IG9jZnMyX2J1ZmZlcmVkX3dyaXRlX3ByaXYgeworCWNoYXIJCQkJKmJfc3JjX2J1ZjsKKwljb25zdCBzdHJ1Y3QgaW92ZWMJCSpiX2N1cl9pb3Y7IC8qIEN1cnJlbnQgaW92ZWMgKi8KKwlzaXplX3QJCQkJYl9jdXJfb2ZmOyAvKiBPZmZzZXQgaW4gdGhlCisJCQkJCQkgICAgKiBjdXJyZW50IGlvdmVjICovCit9OworaW50IG9jZnMyX21hcF9hbmRfd3JpdGVfdXNlcl9kYXRhKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJICBzdHJ1Y3Qgb2NmczJfd3JpdGVfY3R4dCAqd2MsCisJCQkJICB1NjQgKnBfYmxrbm8sCisJCQkJICB1bnNpZ25lZCBpbnQgKnJldF9mcm9tLAorCQkJCSAgdW5zaWduZWQgaW50ICpyZXRfdG8pOworCitzdHJ1Y3Qgb2NmczJfc3BsaWNlX3dyaXRlX3ByaXYgeworCXN0cnVjdCBzcGxpY2VfZGVzYwkJKnNfc2Q7CisJc3RydWN0IHBpcGVfYnVmZmVyCQkqc19idWY7CisJc3RydWN0IHBpcGVfaW5vZGVfaW5mbwkJKnNfcGlwZTsKKwkvKiBOZWl0aGVyIG9mZnNldCB2YWx1ZSBpcyBldmVyIGxhcmdlciB0aGFuIG9uZSBwYWdlICovCisJdW5zaWduZWQgaW50CQkJc19vZmZzZXQ7CisJdW5zaWduZWQgaW50CQkJc19idWZfb2Zmc2V0OworfTsKK2ludCBvY2ZzMl9tYXBfYW5kX3dyaXRlX3NwbGljZV9kYXRhKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJICAgIHN0cnVjdCBvY2ZzMl93cml0ZV9jdHh0ICp3YywKKwkJCQkgICAgdTY0ICpwX2Jsa25vLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgKnJldF9mcm9tLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgKnJldF90byk7CisKIC8qIGFsbCBvY2ZzMl9kaW9fZW5kX2lvKCkncyBmYXVsdCAqLwogI2RlZmluZSBvY2ZzMl9pb2NiX2lzX3J3X2xvY2tlZChpb2NiKSBcCiAJdGVzdF9iaXQoMCwgKHVuc2lnbmVkIGxvbmcgKikmaW9jYi0+cHJpdmF0ZSkKLSNkZWZpbmUgb2NmczJfaW9jYl9zZXRfcndfbG9ja2VkKGlvY2IpIFwKLQlzZXRfYml0KDAsICh1bnNpZ25lZCBsb25nICopJmlvY2ItPnByaXZhdGUpCitzdGF0aWMgaW5saW5lIHZvaWQgb2NmczJfaW9jYl9zZXRfcndfbG9ja2VkKHN0cnVjdCBraW9jYiAqaW9jYiwgaW50IGxldmVsKQoreworCXNldF9iaXQoMCwgKHVuc2lnbmVkIGxvbmcgKikmaW9jYi0+cHJpdmF0ZSk7CisJaWYgKGxldmVsKQorCQlzZXRfYml0KDEsICh1bnNpZ25lZCBsb25nICopJmlvY2ItPnByaXZhdGUpOworCWVsc2UKKwkJY2xlYXJfYml0KDEsICh1bnNpZ25lZCBsb25nICopJmlvY2ItPnByaXZhdGUpOworfQogI2RlZmluZSBvY2ZzMl9pb2NiX2NsZWFyX3J3X2xvY2tlZChpb2NiKSBcCiAJY2xlYXJfYml0KDAsICh1bnNpZ25lZCBsb25nICopJmlvY2ItPnByaXZhdGUpCi0KKyNkZWZpbmUgb2NmczJfaW9jYl9yd19sb2NrZWRfbGV2ZWwoaW9jYikgXAorCXRlc3RfYml0KDEsICh1bnNpZ25lZCBsb25nICopJmlvY2ItPnByaXZhdGUpCiAjZW5kaWYgLyogT0NGUzJfRklMRV9IICovCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9jbHVzdGVyL3F1b3J1bS5jIGIvZnMvb2NmczIvY2x1c3Rlci9xdW9ydW0uYwppbmRleCA0NzA1ZDY1Li5iYmFjZjdkIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9jbHVzdGVyL3F1b3J1bS5jCisrKyBiL2ZzL29jZnMyL2NsdXN0ZXIvcXVvcnVtLmMKQEAgLTQ2LDYgKzQ2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CiAKICNpbmNsdWRlICJoZWFydGJlYXQuaCIKICNpbmNsdWRlICJub2RlbWFuYWdlci5oIgpAQCAtNzIsNyArNzMsOSBAQAogCS8qIHBhbmljIHNwaW5zIHdpdGggaW50ZXJydXB0cyBlbmFibGVkLiAgd2l0aCBwcmVlbXB0CiAJICogdGhyZWFkcyBjYW4gc3RpbGwgc2NoZWR1bGUsIGV0YywgZXRjICovCiAJbzJoYl9zdG9wX2FsbF9yZWdpb25zKCk7Ci0JcGFuaWMoIm9jZnMyIGlzIHZlcnkgc29ycnkgdG8gYmUgZmVuY2luZyB0aGlzIHN5c3RlbSBieSBwYW5pY2luZ1xuIik7CisKKwlwcmludGsoIm9jZnMyIGlzIHZlcnkgc29ycnkgdG8gYmUgZmVuY2luZyB0aGlzIHN5c3RlbSBieSByZXN0YXJ0aW5nXG4iKTsKKwllbWVyZ2VuY3lfcmVzdGFydCgpOwogfQogCiAvKiBJbmRpY2F0ZSB0aGF0IGEgdGltZW91dCBvY2N1cmVkIG9uIGEgaGVhcmJlYXQgcmVnaW9uIHdyaXRlLiBUaGUKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2NsdXN0ZXIvdGNwX2ludGVybmFsLmggYi9mcy9vY2ZzMi9jbHVzdGVyL3RjcF9pbnRlcm5hbC5oCmluZGV4IDRkYWU1ZGYuLjk2MDYxMTEgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2NsdXN0ZXIvdGNwX2ludGVybmFsLmgKKysrIGIvZnMvb2NmczIvY2x1c3Rlci90Y3BfaW50ZXJuYWwuaApAQCAtMzgsNiArMzgsOSBAQAogICogbG9ja2luZyBzZW1hbnRpY3Mgb2YgdGhlIGZpbGUgc3lzdGVtIHVzaW5nIHRoZSBwcm90b2NvbC4gIEl0IHNob3VsZCAKICAqIGJlIHNvbWV3aGVyZSBlbHNlLCBJJ20gc3VyZSwgYnV0IHJpZ2h0IG5vdyBpdCBpc24ndC4KICAqCisgKiBOZXcgaW4gdmVyc2lvbiA4OgorICogCS0gUmVwbGFjZSBkZWxldGUgaW5vZGUgdm90ZXMgd2l0aCBhIGNsdXN0ZXIgbG9jaworICoKICAqIE5ldyBpbiB2ZXJzaW9uIDc6CiAgKiAJLSBETE0gam9pbiBkb21haW4gaW5jbHVkZXMgdGhlIGxpdmUgbm9kZW1hcAogICoKQEAgLTU3LDcgKzYwLDcgQEAKICAqIAktIGZ1bGwgNjQgYml0IGlfc2l6ZSBpbiB0aGUgbWV0YWRhdGEgbG9jayBsdmJzCiAgKiAJLSBpbnRyb2R1Y3Rpb24gb2YgInJ3IiBsb2NrIGFuZCBwdXNoaW5nIG1ldGEvZGF0YSBsb2NraW5nIGRvd24KICAqLwotI2RlZmluZSBPMk5FVF9QUk9UT0NPTF9WRVJTSU9OIDdVTEwKKyNkZWZpbmUgTzJORVRfUFJPVE9DT0xfVkVSU0lPTiA4VUxMCiBzdHJ1Y3QgbzJuZXRfaGFuZHNoYWtlIHsKIAlfX2JlNjQJcHJvdG9jb2xfdmVyc2lvbjsKIAlfX2JlNjQJY29ubmVjdG9yX2lkOwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvZGlyLmMgYi9mcy9vY2ZzMi9kaXIuYwppbmRleCA2NjgyMWUxLi42N2U2ODY2IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9kaXIuYworKysgYi9mcy9vY2ZzMi9kaXIuYwpAQCAtMzU4LDE1ICszNTgsMTcgQEAKIHsKIAlpbnQgc3RhdHVzOwogCWludCBleHRlbmQ7Ci0JdTY0IHBfYmxrbm87CisJdTY0IHBfYmxrbm8sIHZfYmxrbm87CiAKIAlzcGluX2xvY2soJk9DRlMyX0koZGlyKS0+aXBfbG9jayk7CiAJZXh0ZW5kID0gKGlfc2l6ZV9yZWFkKGRpcikgPT0gb2NmczJfY2x1c3RlcnNfdG9fYnl0ZXMoc2IsIE9DRlMyX0koZGlyKS0+aXBfY2x1c3RlcnMpKTsKIAlzcGluX3VubG9jaygmT0NGUzJfSShkaXIpLT5pcF9sb2NrKTsKIAogCWlmIChleHRlbmQpIHsKLQkJc3RhdHVzID0gb2NmczJfZG9fZXh0ZW5kX2FsbG9jYXRpb24oT0NGUzJfU0Ioc2IpLCBkaXIsIDEsCi0JCQkJCQkgICAgcGFyZW50X2ZlX2JoLCBoYW5kbGUsCisJCXUzMiBvZmZzZXQgPSBPQ0ZTMl9JKGRpciktPmlwX2NsdXN0ZXJzOworCisJCXN0YXR1cyA9IG9jZnMyX2RvX2V4dGVuZF9hbGxvY2F0aW9uKE9DRlMyX1NCKHNiKSwgZGlyLCAmb2Zmc2V0LAorCQkJCQkJICAgIDEsIHBhcmVudF9mZV9iaCwgaGFuZGxlLAogCQkJCQkJICAgIGRhdGFfYWMsIG1ldGFfYWMsIE5VTEwpOwogCQlCVUdfT04oc3RhdHVzID09IC1FQUdBSU4pOwogCQlpZiAoc3RhdHVzIDwgMCkgewpAQCAtMzc1LDkgKzM3Nyw4IEBACiAJCX0KIAl9CiAKLQlzdGF0dXMgPSBvY2ZzMl9leHRlbnRfbWFwX2dldF9ibG9ja3MoZGlyLCAoZGlyLT5pX2Jsb2NrcyA+PgotCQkJCQkJICAgKHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzIC0gOSkpLAotCQkJCQkgICAgIDEsICZwX2Jsa25vLCBOVUxMKTsKKwl2X2Jsa25vID0gb2NmczJfYmxvY2tzX2Zvcl9ieXRlcyhzYiwgaV9zaXplX3JlYWQoZGlyKSk7CisJc3RhdHVzID0gb2NmczJfZXh0ZW50X21hcF9nZXRfYmxvY2tzKGRpciwgdl9ibGtubywgJnBfYmxrbm8sIE5VTEwsIE5VTEwpOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJZ290byBiYWlsOwpAQCAtNDg2LDcgKzQ4Nyw3IEBACiAKIAlkaXJfaV9zaXplICs9IGRpci0+aV9zYi0+c19ibG9ja3NpemU7CiAJaV9zaXplX3dyaXRlKGRpciwgZGlyX2lfc2l6ZSk7Ci0JZGlyLT5pX2Jsb2NrcyA9IG9jZnMyX2FsaWduX2J5dGVzX3RvX3NlY3RvcnMoZGlyX2lfc2l6ZSk7CisJZGlyLT5pX2Jsb2NrcyA9IG9jZnMyX2lub2RlX3NlY3Rvcl9jb3VudChkaXIpOwogCXN0YXR1cyA9IG9jZnMyX21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBkaXIsIHBhcmVudF9mZV9iaCk7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvZGxtL2RsbWRvbWFpbi5jIGIvZnMvb2NmczIvZGxtL2RsbWRvbWFpbi5jCmluZGV4IGM1NTg0NDIuLmQ4MzZiOTggMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2RsbS9kbG1kb21haW4uYworKysgYi9mcy9vY2ZzMi9kbG0vZGxtZG9tYWluLmMKQEAgLTQzMCwxMSArNDMwLDEwIEBACiAKIAkJCWRsbV9sb2NrcmVzX3B1dChyZXMpOwogCi0JCQljb25kX3Jlc2NoZWRfbG9jaygmZGxtLT5zcGlubG9jayk7Ci0KIAkJCWlmIChkcm9wcGVkKQogCQkJCWdvdG8gcmVkb19idWNrZXQ7CiAJCX0KKwkJY29uZF9yZXNjaGVkX2xvY2soJmRsbS0+c3BpbmxvY2spOwogCQludW0gKz0gbjsKIAkJbWxvZygwLCAiJXM6IHRvdWNoZWQgJWQgbG9ja3Jlc2VzIGluIGJ1Y2tldCAlZCAiCiAJCSAgICAgIih0b3Q9JWQpXG4iLCBkbG0tPm5hbWUsIG4sIGksIG51bSk7CkBAIC0xMDM1LDcgKzEwMzQsNyBAQAogewogCWludCBzdGF0dXMgPSAwLCB0bXBzdGF0LCBub2RlOwogCXN0cnVjdCBkb21haW5fam9pbl9jdHh0ICpjdHh0OwotCWVudW0gZGxtX3F1ZXJ5X2pvaW5fcmVzcG9uc2UgcmVzcG9uc2U7CisJZW51bSBkbG1fcXVlcnlfam9pbl9yZXNwb25zZSByZXNwb25zZSA9IEpPSU5fRElTQUxMT1c7CiAKIAltbG9nX2VudHJ5KCIlcCIsIGRsbSk7CiAKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2RsbS9kbG1yZWNvdmVyeS5jIGIvZnMvb2NmczIvZGxtL2RsbXJlY292ZXJ5LmMKaW5kZXggNmQ0YTgzZC4uYzE4MDdhNCAxMDA2NDQKLS0tIGEvZnMvb2NmczIvZGxtL2RsbXJlY292ZXJ5LmMKKysrIGIvZnMvb2NmczIvZGxtL2RsbXJlY292ZXJ5LmMKQEAgLTYxMSw2ICs2MTEsNyBAQAogCQkJfQogCQl9IHdoaWxlIChzdGF0dXMgIT0gMCk7CiAKKwkJc3Bpbl9sb2NrKCZkbG1fcmVjb19zdGF0ZV9sb2NrKTsKIAkJc3dpdGNoIChuZGF0YS0+c3RhdGUpIHsKIAkJCWNhc2UgRExNX1JFQ09fTk9ERV9EQVRBX0lOSVQ6CiAJCQljYXNlIERMTV9SRUNPX05PREVfREFUQV9GSU5BTElaRV9TRU5UOgpAQCAtNjQxLDYgKzY0Miw3IEBACiAJCQkJICAgICBuZGF0YS0+bm9kZV9udW0sIGRlYWRfbm9kZSk7CiAJCQkJYnJlYWs7CiAJCX0KKwkJc3Bpbl91bmxvY2soJmRsbV9yZWNvX3N0YXRlX2xvY2spOwogCX0KIAogCW1sb2coMCwgImRvbmUgcmVxdWVzdGluZyBhbGwgbG9jayBpbmZvXG4iKTsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2RsbWdsdWUuYyBiL2ZzL29jZnMyL2RsbWdsdWUuYwppbmRleCBlMzM1NTQxLi4yN2U0M2IwIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9kbG1nbHVlLmMKKysrIGIvZnMvb2NmczIvZGxtZ2x1ZS5jCkBAIC0yMjUsMTEgKzIyNSwxNyBAQAogCS5mbGFncwkJPSAwLAogfTsKIAorc3RhdGljIHN0cnVjdCBvY2ZzMl9sb2NrX3Jlc19vcHMgb2NmczJfaW5vZGVfb3Blbl9sb3BzID0geworCS5nZXRfb3NiCT0gb2NmczJfZ2V0X2lub2RlX29zYiwKKwkuZmxhZ3MJCT0gMCwKK307CisKIHN0YXRpYyBpbmxpbmUgaW50IG9jZnMyX2lzX2lub2RlX2xvY2soc3RydWN0IG9jZnMyX2xvY2tfcmVzICpsb2NrcmVzKQogewogCXJldHVybiBsb2NrcmVzLT5sX3R5cGUgPT0gT0NGUzJfTE9DS19UWVBFX01FVEEgfHwKIAkJbG9ja3Jlcy0+bF90eXBlID09IE9DRlMyX0xPQ0tfVFlQRV9EQVRBIHx8Ci0JCWxvY2tyZXMtPmxfdHlwZSA9PSBPQ0ZTMl9MT0NLX1RZUEVfUlc7CisJCWxvY2tyZXMtPmxfdHlwZSA9PSBPQ0ZTMl9MT0NLX1RZUEVfUlcgfHwKKwkJbG9ja3Jlcy0+bF90eXBlID09IE9DRlMyX0xPQ0tfVFlQRV9PUEVOOwogfQogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBpbm9kZSAqb2NmczJfbG9ja19yZXNfaW5vZGUoc3RydWN0IG9jZnMyX2xvY2tfcmVzICpsb2NrcmVzKQpAQCAtMzczLDYgKzM3OSw5IEBACiAJCWNhc2UgT0NGUzJfTE9DS19UWVBFX0RBVEE6CiAJCQlvcHMgPSAmb2NmczJfaW5vZGVfZGF0YV9sb3BzOwogCQkJYnJlYWs7CisJCWNhc2UgT0NGUzJfTE9DS19UWVBFX09QRU46CisJCQlvcHMgPSAmb2NmczJfaW5vZGVfb3Blbl9sb3BzOworCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQltbG9nX2J1Z19vbl9tc2coMSwgInR5cGU6ICVkXG4iLCB0eXBlKTsKIAkJCW9wcyA9IE5VTEw7IC8qIHRoYW5rcywgZ2NjICovCkBAIC0xMTI5LDYgKzExMzgsMTIgQEAKIAkJZ290byBiYWlsOwogCX0KIAorCXJldCA9IG9jZnMyX2NyZWF0ZV9uZXdfbG9jayhvc2IsICZPQ0ZTMl9JKGlub2RlKS0+aXBfb3Blbl9sb2NrcmVzLCAwLCAwKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBiYWlsOworCX0KKwogYmFpbDoKIAltbG9nX2V4aXQocmV0KTsKIAlyZXR1cm4gcmV0OwpAQCAtMTE4Miw2ICsxMTk3LDk5IEBACiAJbWxvZ19leGl0X3ZvaWQoKTsKIH0KIAorLyoKKyAqIG9jZnMyX29wZW5fbG9jayBhbHdheXMgZ2V0IFBSIG1vZGUgbG9jay4KKyAqLworaW50IG9jZnMyX29wZW5fbG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWludCBzdGF0dXMgPSAwOworCXN0cnVjdCBvY2ZzMl9sb2NrX3JlcyAqbG9ja3JlczsKKwlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKTsKKworCUJVR19PTighaW5vZGUpOworCisJbWxvZ19lbnRyeV92b2lkKCk7CisKKwltbG9nKDAsICJpbm9kZSAlbGx1IHRha2UgUFJNT0RFIG9wZW4gbG9ja1xuIiwKKwkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vKTsKKworCWlmIChvY2ZzMl9tb3VudF9sb2NhbChvc2IpKQorCQlnb3RvIG91dDsKKworCWxvY2tyZXMgPSAmT0NGUzJfSShpbm9kZSktPmlwX29wZW5fbG9ja3JlczsKKworCXN0YXR1cyA9IG9jZnMyX2NsdXN0ZXJfbG9jayhPQ0ZTMl9TQihpbm9kZS0+aV9zYiksIGxvY2tyZXMsCisJCQkJICAgIExLTV9QUk1PREUsIDAsIDApOworCWlmIChzdGF0dXMgPCAwKQorCQltbG9nX2Vycm5vKHN0YXR1cyk7CisKK291dDoKKwltbG9nX2V4aXQoc3RhdHVzKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitpbnQgb2NmczJfdHJ5X29wZW5fbG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgd3JpdGUpCit7CisJaW50IHN0YXR1cyA9IDAsIGxldmVsOworCXN0cnVjdCBvY2ZzMl9sb2NrX3JlcyAqbG9ja3JlczsKKwlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKTsKKworCUJVR19PTighaW5vZGUpOworCisJbWxvZ19lbnRyeV92b2lkKCk7CisKKwltbG9nKDAsICJpbm9kZSAlbGx1IHRyeSB0byB0YWtlICVzIG9wZW4gbG9ja1xuIiwKKwkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vLAorCSAgICAgd3JpdGUgPyAiRVhNT0RFIiA6ICJQUk1PREUiKTsKKworCWlmIChvY2ZzMl9tb3VudF9sb2NhbChvc2IpKQorCQlnb3RvIG91dDsKKworCWxvY2tyZXMgPSAmT0NGUzJfSShpbm9kZSktPmlwX29wZW5fbG9ja3JlczsKKworCWxldmVsID0gd3JpdGUgPyBMS01fRVhNT0RFIDogTEtNX1BSTU9ERTsKKworCS8qCisJICogVGhlIGZpbGUgc3lzdGVtIG1heSBhbHJlYWR5IGhvbGRpbmcgYSBQUk1PREUvRVhNT0RFIG9wZW4gbG9jay4KKwkgKiBTaW5jZSB3ZSBwYXNzIExLTV9OT1FVRVVFLCB0aGUgcmVxdWVzdCB3b24ndCBibG9jayB3YWl0aW5nIG9uCisJICogb3RoZXIgbm9kZXMgYW5kIHRoZSAtRUFHQUlOIHdpbGwgaW5kaWNhdGUgdG8gdGhlIGNhbGxlciB0aGF0CisJICogdGhpcyBpbm9kZSBpcyBzdGlsbCBpbiB1c2UuCisJICovCisJc3RhdHVzID0gb2NmczJfY2x1c3Rlcl9sb2NrKE9DRlMyX1NCKGlub2RlLT5pX3NiKSwgbG9ja3JlcywKKwkJCQkgICAgbGV2ZWwsIExLTV9OT1FVRVVFLCAwKTsKKworb3V0OgorCW1sb2dfZXhpdChzdGF0dXMpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBvY2ZzMl9vcGVuX3VubG9jayB1bmxvY2sgUFIgYW5kIEVYIG1vZGUgb3BlbiBsb2Nrcy4KKyAqLwordm9pZCBvY2ZzMl9vcGVuX3VubG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBvY2ZzMl9sb2NrX3JlcyAqbG9ja3JlcyA9ICZPQ0ZTMl9JKGlub2RlKS0+aXBfb3Blbl9sb2NrcmVzOworCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoaW5vZGUtPmlfc2IpOworCisJbWxvZ19lbnRyeV92b2lkKCk7CisKKwltbG9nKDAsICJpbm9kZSAlbGx1IGRyb3Agb3BlbiBsb2NrXG4iLAorCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8pOworCisJaWYgKG9jZnMyX21vdW50X2xvY2FsKG9zYikpCisJCWdvdG8gb3V0OworCisJaWYobG9ja3Jlcy0+bF9yb19ob2xkZXJzKQorCQlvY2ZzMl9jbHVzdGVyX3VubG9jayhPQ0ZTMl9TQihpbm9kZS0+aV9zYiksIGxvY2tyZXMsCisJCQkJICAgICBMS01fUFJNT0RFKTsKKwlpZihsb2NrcmVzLT5sX2V4X2hvbGRlcnMpCisJCW9jZnMyX2NsdXN0ZXJfdW5sb2NrKE9DRlMyX1NCKGlub2RlLT5pX3NiKSwgbG9ja3JlcywKKwkJCQkgICAgIExLTV9FWE1PREUpOworCitvdXQ6CisJbWxvZ19leGl0X3ZvaWQoKTsKK30KKwogaW50IG9jZnMyX2RhdGFfbG9ja19mdWxsKHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkgaW50IHdyaXRlLAogCQkJIGludCBhcmdfZmxhZ3MpCkBAIC0xMzg3LDggKzE0OTUsNyBAQAogCWlmIChTX0lTTE5LKGlub2RlLT5pX21vZGUpICYmICFvaS0+aXBfY2x1c3RlcnMpCiAJCWlub2RlLT5pX2Jsb2NrcyA9IDA7CiAJZWxzZQotCQlpbm9kZS0+aV9ibG9ja3MgPQotCQkJb2NmczJfYWxpZ25fYnl0ZXNfdG9fc2VjdG9ycyhpX3NpemVfcmVhZChpbm9kZSkpOworCQlpbm9kZS0+aV9ibG9ja3MgPSBvY2ZzMl9pbm9kZV9zZWN0b3JfY291bnQoaW5vZGUpOwogCiAJaW5vZGUtPmlfdWlkICAgICA9IGJlMzJfdG9fY3B1KGx2Yi0+bHZiX2l1aWQpOwogCWlub2RlLT5pX2dpZCAgICAgPSBiZTMyX3RvX2NwdShsdmItPmx2Yl9pZ2lkKTsKQEAgLTE0NzksMTIgKzE1ODYsMTUgQEAKIHsKIAlpbnQgc3RhdHVzID0gMDsKIAlzdHJ1Y3Qgb2NmczJfaW5vZGVfaW5mbyAqb2kgPSBPQ0ZTMl9JKGlub2RlKTsKLQlzdHJ1Y3Qgb2NmczJfbG9ja19yZXMgKmxvY2tyZXMgPSBOVUxMOworCXN0cnVjdCBvY2ZzMl9sb2NrX3JlcyAqbG9ja3JlcyA9ICZvaS0+aXBfbWV0YV9sb2NrcmVzOwogCXN0cnVjdCBvY2ZzMl9kaW5vZGUgKmZlOwogCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoaW5vZGUtPmlfc2IpOwogCiAJbWxvZ19lbnRyeV92b2lkKCk7CiAKKwlpZiAob2NmczJfbW91bnRfbG9jYWwob3NiKSkKKwkJZ290byBiYWlsOworCiAJc3Bpbl9sb2NrKCZvaS0+aXBfbG9jayk7CiAJaWYgKG9pLT5pcF9mbGFncyAmIE9DRlMyX0lOT0RFX0RFTEVURUQpIHsKIAkJbWxvZygwLCAiT3JwaGFuZWQgaW5vZGUgJWxsdSB3YXMgZGVsZXRlZCB3aGlsZSB3ZSAiCkBAIC0xNDk2LDIyICsxNjA2LDE2IEBACiAJfQogCXNwaW5fdW5sb2NrKCZvaS0+aXBfbG9jayk7CiAKLQlpZiAoIW9jZnMyX21vdW50X2xvY2FsKG9zYikpIHsKLQkJbG9ja3JlcyA9ICZvaS0+aXBfbWV0YV9sb2NrcmVzOwotCi0JCWlmICghb2NmczJfc2hvdWxkX3JlZnJlc2hfbG9ja19yZXMobG9ja3JlcykpCi0JCQlnb3RvIGJhaWw7Ci0JfQorCWlmICghb2NmczJfc2hvdWxkX3JlZnJlc2hfbG9ja19yZXMobG9ja3JlcykpCisJCWdvdG8gYmFpbDsKIAogCS8qIFRoaXMgd2lsbCBkaXNjYXJkIGFueSBjYWNoaW5nIGluZm9ybWF0aW9uIHdlIG1pZ2h0IGhhdmUgaGFkCiAJICogZm9yIHRoZSBpbm9kZSBtZXRhZGF0YS4gKi8KIAlvY2ZzMl9tZXRhZGF0YV9jYWNoZV9wdXJnZShpbm9kZSk7CiAKLQkvKiB3aWxsIGRvIG5vdGhpbmcgZm9yIGlub2RlIHR5cGVzIHRoYXQgZG9uJ3QgdXNlIHRoZSBleHRlbnQKLQkgKiBtYXAgKGRpcmVjdG9yaWVzLCBiaXRtYXAgZmlsZXMsIGV0YykgKi8KIAlvY2ZzMl9leHRlbnRfbWFwX3RydW5jKGlub2RlLCAwKTsKIAotCWlmIChsb2NrcmVzICYmIG9jZnMyX21ldGFfbHZiX2lzX3RydXN0YWJsZShpbm9kZSwgbG9ja3JlcykpIHsKKwlpZiAob2NmczJfbWV0YV9sdmJfaXNfdHJ1c3RhYmxlKGlub2RlLCBsb2NrcmVzKSkgewogCQltbG9nKDAsICJUcnVzdGluZyBMVkIgb24gaW5vZGUgJWxsdVxuIiwKIAkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKW9pLT5pcF9ibGtubyk7CiAJCW9jZnMyX3JlZnJlc2hfaW5vZGVfZnJvbV9sdmIoaW5vZGUpOwpAQCAtMTU1OCw4ICsxNjYyLDcgQEAKIAogCXN0YXR1cyA9IDA7CiBiYWlsX3JlZnJlc2g6Ci0JaWYgKGxvY2tyZXMpCi0JCW9jZnMyX2NvbXBsZXRlX2xvY2tfcmVzX3JlZnJlc2gobG9ja3Jlcywgc3RhdHVzKTsKKwlvY2ZzMl9jb21wbGV0ZV9sb2NrX3Jlc19yZWZyZXNoKGxvY2tyZXMsIHN0YXR1cyk7CiBiYWlsOgogCW1sb2dfZXhpdChzdGF0dXMpOwogCXJldHVybiBzdGF0dXM7CkBAIC0xNjMwLDcgKzE3MzMsNiBAQAogCQl3YWl0X2V2ZW50KG9zYi0+cmVjb3ZlcnlfZXZlbnQsCiAJCQkgICBvY2ZzMl9ub2RlX21hcF9pc19lbXB0eShvc2IsICZvc2ItPnJlY292ZXJ5X21hcCkpOwogCi0JYWNxdWlyZWQgPSAwOwogCWxvY2tyZXMgPSAmT0NGUzJfSShpbm9kZSktPmlwX21ldGFfbG9ja3JlczsKIAlsZXZlbCA9IGV4ID8gTEtNX0VYTU9ERSA6IExLTV9QUk1PREU7CiAJZGxtX2ZsYWdzID0gMDsKQEAgLTI0NTgsMTMgKzI1NjAsMjAgQEAKIAkgKiBvY2ZzMl9jbGVhcl9pbm9kZSBoYXMgZG9uZSBpdCBmb3IgdXMuICovCiAKIAllcnIgPSBvY2ZzMl9kcm9wX2xvY2soT0NGUzJfU0IoaW5vZGUtPmlfc2IpLAotCQkJICAgICAgJk9DRlMyX0koaW5vZGUpLT5pcF9kYXRhX2xvY2tyZXMpOworCQkJICAgICAgJk9DRlMyX0koaW5vZGUpLT5pcF9vcGVuX2xvY2tyZXMpOwogCWlmIChlcnIgPCAwKQogCQltbG9nX2Vycm5vKGVycik7CiAKIAlzdGF0dXMgPSBlcnI7CiAKIAllcnIgPSBvY2ZzMl9kcm9wX2xvY2soT0NGUzJfU0IoaW5vZGUtPmlfc2IpLAorCQkJICAgICAgJk9DRlMyX0koaW5vZGUpLT5pcF9kYXRhX2xvY2tyZXMpOworCWlmIChlcnIgPCAwKQorCQltbG9nX2Vycm5vKGVycik7CisJaWYgKGVyciA8IDAgJiYgIXN0YXR1cykKKwkJc3RhdHVzID0gZXJyOworCisJZXJyID0gb2NmczJfZHJvcF9sb2NrKE9DRlMyX1NCKGlub2RlLT5pX3NiKSwKIAkJCSAgICAgICZPQ0ZTMl9JKGlub2RlKS0+aXBfbWV0YV9sb2NrcmVzKTsKIAlpZiAoZXJyIDwgMCkKIAkJbWxvZ19lcnJubyhlcnIpOwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvZGxtZ2x1ZS5oIGIvZnMvb2NmczIvZGxtZ2x1ZS5oCmluZGV4IGMzNDNmY2EuLjU5Y2I1NjYgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2RsbWdsdWUuaAorKysgYi9mcy9vY2ZzMi9kbG1nbHVlLmgKQEAgLTgwLDYgKzgwLDkgQEAKIAkJICAgICAgIGludCB3cml0ZSk7CiBpbnQgb2NmczJfcndfbG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgd3JpdGUpOwogdm9pZCBvY2ZzMl9yd191bmxvY2soc3RydWN0IGlub2RlICppbm9kZSwgaW50IHdyaXRlKTsKK2ludCBvY2ZzMl9vcGVuX2xvY2soc3RydWN0IGlub2RlICppbm9kZSk7CitpbnQgb2NmczJfdHJ5X29wZW5fbG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgd3JpdGUpOwordm9pZCBvY2ZzMl9vcGVuX3VubG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKIGludCBvY2ZzMl9tZXRhX2xvY2tfYXRpbWUoc3RydWN0IGlub2RlICppbm9kZSwKIAkJCSAgc3RydWN0IHZmc21vdW50ICp2ZnNtbnQsCiAJCQkgIGludCAqbGV2ZWwpOwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvZXh0ZW50X21hcC5jIGIvZnMvb2NmczIvZXh0ZW50X21hcC5jCmluZGV4IDgwYWM2OWYuLmJhMmIyYWIgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2V4dGVudF9tYXAuYworKysgYi9mcy9vY2ZzMi9leHRlbnRfbWFwLmMKQEAgLTMsOCArMyw3IEBACiAgKgogICogZXh0ZW50X21hcC5jCiAgKgotICogSW4tbWVtb3J5IGV4dGVudCBtYXAgZm9yIE9DRlMyLiAgTWFuLCB0aGlzIGNvZGUgd2FzIHByZXR0aWVyIGluCi0gKiB0aGUgbGlicmFyeS4KKyAqIEJsb2NrL0NsdXN0ZXIgbWFwcGluZyBmdW5jdGlvbnMKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDQgT3JhY2xlLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCkBAIC0yNiwxMDE2ICsyNSw1MjggQEAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9yYnRyZWUuaD4KIAogI2RlZmluZSBNTE9HX01BU0tfUFJFRklYIE1MX0VYVEVOVF9NQVAKICNpbmNsdWRlIDxjbHVzdGVyL21hc2tsb2cuaD4KIAogI2luY2x1ZGUgIm9jZnMyLmgiCiAKKyNpbmNsdWRlICJhbGxvYy5oIgogI2luY2x1ZGUgImV4dGVudF9tYXAuaCIKICNpbmNsdWRlICJpbm9kZS5oIgogI2luY2x1ZGUgInN1cGVyLmgiCiAKICNpbmNsdWRlICJidWZmZXJfaGVhZF9pby5oIgogCi0KIC8qCi0gKiBTVUNLIFNVQ0sgU1VDSwotICogT3VyIGhlYWRlcnMgYXJlIHNvIGJhZCB0aGF0IHN0cnVjdCBvY2ZzMl9leHRlbnRfbWFwIGlzIGluIG9jZnMuaAorICogVGhlIGV4dGVudCBjYWNoaW5nIGltcGxlbWVudGF0aW9uIGlzIGludGVudGlvbmFsbHkgdHJpdmlhbC4KKyAqCisgKiBXZSBvbmx5IGNhY2hlIGEgc21hbGwgbnVtYmVyIG9mIGV4dGVudHMgc3RvcmVkIGRpcmVjdGx5IG9uIHRoZQorICogaW5vZGUsIHNvIGxpbmVhciBvcmRlciBvcGVyYXRpb25zIGFyZSBhY2NlcHRhYmxlLiBJZiB3ZSBldmVyIHdhbnQKKyAqIHRvIGluY3JlYXNlIHRoZSBzaXplIG9mIHRoZSBleHRlbnQgbWFwLCB0aGVuIHRoZXNlIGFsZ29yaXRobXMgbXVzdAorICogZ2V0IHNtYXJ0ZXIuCiAgKi8KIAotc3RydWN0IG9jZnMyX2V4dGVudF9tYXBfZW50cnkgewotCXN0cnVjdCByYl9ub2RlIGVfbm9kZTsKLQlpbnQgZV90cmVlX2RlcHRoOwotCXN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjIGVfcmVjOwotfTsKLQotc3RydWN0IG9jZnMyX2VtX2luc2VydF9jb250ZXh0IHsKLQlpbnQgbmVlZF9sZWZ0OwotCWludCBuZWVkX3JpZ2h0OwotCXN0cnVjdCBvY2ZzMl9leHRlbnRfbWFwX2VudHJ5ICpuZXdfZW50OwotCXN0cnVjdCBvY2ZzMl9leHRlbnRfbWFwX2VudHJ5ICpvbGRfZW50OwotCXN0cnVjdCBvY2ZzMl9leHRlbnRfbWFwX2VudHJ5ICpsZWZ0X2VudDsKLQlzdHJ1Y3Qgb2NmczJfZXh0ZW50X21hcF9lbnRyeSAqcmlnaHRfZW50OwotfTsKLQotc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpvY2ZzMl9lbV9lbnRfY2FjaGVwID0gTlVMTDsKLQotCi1zdGF0aWMgc3RydWN0IG9jZnMyX2V4dGVudF9tYXBfZW50cnkgKgotb2NmczJfZXh0ZW50X21hcF9sb29rdXAoc3RydWN0IG9jZnMyX2V4dGVudF9tYXAgKmVtLAotCQkJdTMyIGNwb3MsIHUzMiBjbHVzdGVycywKLQkJCXN0cnVjdCByYl9ub2RlICoqKnJldF9wLAotCQkJc3RydWN0IHJiX25vZGUgKipyZXRfcGFyZW50KTsKLXN0YXRpYyBpbnQgb2NmczJfZXh0ZW50X21hcF9pbnNlcnQoc3RydWN0IGlub2RlICppbm9kZSwKLQkJCQkgICBzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyAqcmVjLAotCQkJCSAgIGludCB0cmVlX2RlcHRoKTsKLXN0YXRpYyBpbnQgb2NmczJfZXh0ZW50X21hcF9pbnNlcnRfZW50cnkoc3RydWN0IG9jZnMyX2V4dGVudF9tYXAgKmVtLAotCQkJCQkgc3RydWN0IG9jZnMyX2V4dGVudF9tYXBfZW50cnkgKmVudCk7Ci1zdGF0aWMgaW50IG9jZnMyX2V4dGVudF9tYXBfZmluZF9sZWFmKHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkJICAgICAgdTMyIGNwb3MsIHUzMiBjbHVzdGVycywKLQkJCQkgICAgICBzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKmVsKTsKLXN0YXRpYyBpbnQgb2NmczJfZXh0ZW50X21hcF9sb29rdXBfcmVhZChzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJCQl1MzIgY3BvcywgdTMyIGNsdXN0ZXJzLAotCQkJCQlzdHJ1Y3Qgb2NmczJfZXh0ZW50X21hcF9lbnRyeSAqKnJldF9lbnQpOwotc3RhdGljIGludCBvY2ZzMl9leHRlbnRfbWFwX3RyeV9pbnNlcnQoc3RydWN0IGlub2RlICppbm9kZSwKLQkJCQkgICAgICAgc3RydWN0IG9jZnMyX2V4dGVudF9yZWMgKnJlYywKLQkJCQkgICAgICAgaW50IHRyZWVfZGVwdGgsCi0JCQkJICAgICAgIHN0cnVjdCBvY2ZzMl9lbV9pbnNlcnRfY29udGV4dCAqY3R4dCk7Ci0KLS8qIHJldHVybnMgMSBvbmx5IGlmIHRoZSByZWMgY29udGFpbnMgYWxsIHRoZSBnaXZlbiBjbHVzdGVycyAtLSB0aGF0IGlzIHRoYXQKLSAqIHJlYydzIGNwb3MgaXMgPD0gdGhlIGNsdXN0ZXIgY3BvcyBhbmQgdGhhdCB0aGUgcmVjIGVuZHBvaW50IChjcG9zICsKLSAqIGNsdXN0ZXJzKSBpcyA+PSB0aGUgYXJndW1lbnQncyBlbmRwb2ludCAqLwotc3RhdGljIGludCBvY2ZzMl9leHRlbnRfcmVjX2NvbnRhaW5zX2NsdXN0ZXJzKHN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjICpyZWMsCi0JCQkJCSAgICAgIHUzMiBjcG9zLCB1MzIgY2x1c3RlcnMpCit2b2lkIG9jZnMyX2V4dGVudF9tYXBfaW5pdChzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewotCWlmIChsZTMyX3RvX2NwdShyZWMtPmVfY3BvcykgPiBjcG9zKQotCQlyZXR1cm4gMDsKLQlpZiAoY3BvcyArIGNsdXN0ZXJzID4gbGUzMl90b19jcHUocmVjLT5lX2Nwb3MpICsgCi0JCQkgICAgICBsZTMyX3RvX2NwdShyZWMtPmVfY2x1c3RlcnMpKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gMTsKKwlzdHJ1Y3Qgb2NmczJfaW5vZGVfaW5mbyAqb2kgPSBPQ0ZTMl9JKGlub2RlKTsKKworCW9pLT5pcF9leHRlbnRfbWFwLmVtX251bV9pdGVtcyA9IDA7CisJSU5JVF9MSVNUX0hFQUQoJm9pLT5pcF9leHRlbnRfbWFwLmVtX2xpc3QpOwogfQogCitzdGF0aWMgdm9pZCBfX29jZnMyX2V4dGVudF9tYXBfbG9va3VwKHN0cnVjdCBvY2ZzMl9leHRlbnRfbWFwICplbSwKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgY3BvcywKKwkJCQkgICAgICBzdHJ1Y3Qgb2NmczJfZXh0ZW50X21hcF9pdGVtICoqcmV0X2VtaSkKK3sKKwl1bnNpZ25lZCBpbnQgcmFuZ2U7CisJc3RydWN0IG9jZnMyX2V4dGVudF9tYXBfaXRlbSAqZW1pOworCisJKnJldF9lbWkgPSBOVUxMOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShlbWksICZlbS0+ZW1fbGlzdCwgZWlfbGlzdCkgeworCQlyYW5nZSA9IGVtaS0+ZWlfY3BvcyArIGVtaS0+ZWlfY2x1c3RlcnM7CisKKwkJaWYgKGNwb3MgPj0gZW1pLT5laV9jcG9zICYmIGNwb3MgPCByYW5nZSkgeworCQkJbGlzdF9tb3ZlKCZlbWktPmVpX2xpc3QsICZlbS0+ZW1fbGlzdCk7CisKKwkJCSpyZXRfZW1pID0gZW1pOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgb2NmczJfZXh0ZW50X21hcF9sb29rdXAoc3RydWN0IGlub2RlICppbm9kZSwgdW5zaWduZWQgaW50IGNwb3MsCisJCQkJICAgdW5zaWduZWQgaW50ICpwaHlzLCB1bnNpZ25lZCBpbnQgKmxlbiwKKwkJCQkgICB1bnNpZ25lZCBpbnQgKmZsYWdzKQoreworCXVuc2lnbmVkIGludCBjb2ZmOworCXN0cnVjdCBvY2ZzMl9pbm9kZV9pbmZvICpvaSA9IE9DRlMyX0koaW5vZGUpOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfbWFwX2l0ZW0gKmVtaTsKKworCXNwaW5fbG9jaygmb2ktPmlwX2xvY2spOworCisJX19vY2ZzMl9leHRlbnRfbWFwX2xvb2t1cCgmb2ktPmlwX2V4dGVudF9tYXAsIGNwb3MsICZlbWkpOworCWlmIChlbWkpIHsKKwkJY29mZiA9IGNwb3MgLSBlbWktPmVpX2Nwb3M7CisJCSpwaHlzID0gZW1pLT5laV9waHlzICsgY29mZjsKKwkJaWYgKGxlbikKKwkJCSpsZW4gPSBlbWktPmVpX2NsdXN0ZXJzIC0gY29mZjsKKwkJaWYgKGZsYWdzKQorCQkJKmZsYWdzID0gZW1pLT5laV9mbGFnczsKKwl9CisKKwlzcGluX3VubG9jaygmb2ktPmlwX2xvY2spOworCisJaWYgKGVtaSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCXJldHVybiAwOworfQogCiAvKgotICogRmluZCBhbiBlbnRyeSBpbiB0aGUgdHJlZSB0aGF0IGludGVyc2VjdHMgdGhlIHJlZ2lvbiBwYXNzZWQgaW4uCi0gKiBOb3RlIHRoYXQgdGhpcyB3aWxsIGZpbmQgc3RyYWRkbGVkIGludGVydmFscywgaXQgaXMgdXAgdG8gdGhlCi0gKiBjYWxsZXJzIHRvIGVuZm9yY2UgYW55IGJvdW5kYXJ5IGNvbmRpdGlvbnMuCi0gKgotICogQ2FsbGVycyBtdXN0IGhvbGQgaXBfbG9jay4gIFRoaXMgbG9va3VwIGlzIG5vdCBndWFyYW50ZWVkIHRvIHJldHVybgotICogYSB0cmVlX2RlcHRoIDAgbWF0Y2gsIGFuZCBhcyBzdWNoIGNhbiByYWNlIGluc2VydHMgaWYgdGhlIGxvY2sKLSAqIHdlcmUgbm90IGhlbGQuCi0gKgotICogVGhlIHJiX25vZGUgZ2FyYmFnZSBsZXRzIGluc2VydGlvbiBzaGFyZSB0aGUgc2VhcmNoLiAgVHJpdmlhbAotICogY2FsbGVycyBwYXNzIE5VTEwuCisgKiBGb3JnZXQgYWJvdXQgYWxsIGNsdXN0ZXJzIGVxdWFsIHRvIG9yIGdyZWF0ZXIgdGhhbiBjcG9zLgogICovCi1zdGF0aWMgc3RydWN0IG9jZnMyX2V4dGVudF9tYXBfZW50cnkgKgotb2NmczJfZXh0ZW50X21hcF9sb29rdXAoc3RydWN0IG9jZnMyX2V4dGVudF9tYXAgKmVtLAotCQkJdTMyIGNwb3MsIHUzMiBjbHVzdGVycywKLQkJCXN0cnVjdCByYl9ub2RlICoqKnJldF9wLAotCQkJc3RydWN0IHJiX25vZGUgKipyZXRfcGFyZW50KQordm9pZCBvY2ZzMl9leHRlbnRfbWFwX3RydW5jKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHVuc2lnbmVkIGludCBjcG9zKQogewotCXN0cnVjdCByYl9ub2RlICoqcCA9ICZlbS0+ZW1fZXh0ZW50cy5yYl9ub2RlOwotCXN0cnVjdCByYl9ub2RlICpwYXJlbnQgPSBOVUxMOwotCXN0cnVjdCBvY2ZzMl9leHRlbnRfbWFwX2VudHJ5ICplbnQgPSBOVUxMOworCXN0cnVjdCBsaXN0X2hlYWQgKnAsICpuOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfbWFwX2l0ZW0gKmVtaTsKKwlzdHJ1Y3Qgb2NmczJfaW5vZGVfaW5mbyAqb2kgPSBPQ0ZTMl9JKGlub2RlKTsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X21hcCAqZW0gPSAmb2ktPmlwX2V4dGVudF9tYXA7CisJTElTVF9IRUFEKHRtcF9saXN0KTsKKwl1bnNpZ25lZCBpbnQgcmFuZ2U7CiAKLQl3aGlsZSAoKnApCi0JewotCQlwYXJlbnQgPSAqcDsKLQkJZW50ID0gcmJfZW50cnkocGFyZW50LCBzdHJ1Y3Qgb2NmczJfZXh0ZW50X21hcF9lbnRyeSwKLQkJCSAgICAgICBlX25vZGUpOwotCQlpZiAoKGNwb3MgKyBjbHVzdGVycykgPD0gbGUzMl90b19jcHUoZW50LT5lX3JlYy5lX2Nwb3MpKSB7Ci0JCQlwID0gJigqcCktPnJiX2xlZnQ7Ci0JCQllbnQgPSBOVUxMOwotCQl9IGVsc2UgaWYgKGNwb3MgPj0gKGxlMzJfdG9fY3B1KGVudC0+ZV9yZWMuZV9jcG9zKSArCi0JCQkJICAgIGxlMzJfdG9fY3B1KGVudC0+ZV9yZWMuZV9jbHVzdGVycykpKSB7Ci0JCQlwID0gJigqcCktPnJiX3JpZ2h0OwotCQkJZW50ID0gTlVMTDsKLQkJfSBlbHNlCisJc3Bpbl9sb2NrKCZvaS0+aXBfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9zYWZlKHAsIG4sICZlbS0+ZW1fbGlzdCkgeworCQllbWkgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBvY2ZzMl9leHRlbnRfbWFwX2l0ZW0sIGVpX2xpc3QpOworCisJCWlmIChlbWktPmVpX2Nwb3MgPj0gY3BvcykgeworCQkJLyogRnVsbCB0cnVuY2F0ZSBvZiB0aGlzIHJlY29yZC4gKi8KKwkJCWxpc3RfbW92ZSgmZW1pLT5laV9saXN0LCAmdG1wX2xpc3QpOworCQkJQlVHX09OKGVtLT5lbV9udW1faXRlbXMgPT0gMCk7CisJCQllbS0+ZW1fbnVtX2l0ZW1zLS07CisJCQljb250aW51ZTsKKwkJfQorCisJCXJhbmdlID0gZW1pLT5laV9jcG9zICsgZW1pLT5laV9jbHVzdGVyczsKKwkJaWYgKHJhbmdlID4gY3BvcykgeworCQkJLyogUGFydGlhbCB0cnVuY2F0ZSAqLworCQkJZW1pLT5laV9jbHVzdGVycyA9IGNwb3MgLSBlbWktPmVpX2Nwb3M7CisJCX0KKwl9CisJc3Bpbl91bmxvY2soJm9pLT5pcF9sb2NrKTsKKworCWxpc3RfZm9yX2VhY2hfc2FmZShwLCBuLCAmdG1wX2xpc3QpIHsKKwkJZW1pID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3Qgb2NmczJfZXh0ZW50X21hcF9pdGVtLCBlaV9saXN0KTsKKwkJbGlzdF9kZWwoJmVtaS0+ZWlfbGlzdCk7CisJCWtmcmVlKGVtaSk7CisJfQorfQorCisvKgorICogSXMgYW55IHBhcnQgb2YgZW1pMiBjb250YWluZWQgd2l0aGluIGVtaTEKKyAqLworc3RhdGljIGludCBvY2ZzMl9laV9pc19jb250YWluZWQoc3RydWN0IG9jZnMyX2V4dGVudF9tYXBfaXRlbSAqZW1pMSwKKwkJCQkgc3RydWN0IG9jZnMyX2V4dGVudF9tYXBfaXRlbSAqZW1pMikKK3sKKwl1bnNpZ25lZCBpbnQgcmFuZ2UxLCByYW5nZTI7CisKKwkvKgorCSAqIENoZWNrIGlmIGxvZ2ljYWwgc3RhcnQgb2YgZW1pMiBpcyBpbnNpZGUgZW1pMQorCSAqLworCXJhbmdlMSA9IGVtaTEtPmVpX2Nwb3MgKyBlbWkxLT5laV9jbHVzdGVyczsKKwlpZiAoZW1pMi0+ZWlfY3BvcyA+PSBlbWkxLT5laV9jcG9zICYmIGVtaTItPmVpX2Nwb3MgPCByYW5nZTEpCisJCXJldHVybiAxOworCisJLyoKKwkgKiBDaGVjayBpZiBsb2dpY2FsIGVuZCBvZiBlbWkyIGlzIGluc2lkZSBlbWkxCisJICovCisJcmFuZ2UyID0gZW1pMi0+ZWlfY3BvcyArIGVtaTItPmVpX2NsdXN0ZXJzOworCWlmIChyYW5nZTIgPiBlbWkxLT5laV9jcG9zICYmIHJhbmdlMiA8PSByYW5nZTEpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG9jZnMyX2NvcHlfZW1pX2ZpZWxkcyhzdHJ1Y3Qgb2NmczJfZXh0ZW50X21hcF9pdGVtICpkZXN0LAorCQkJCSAgc3RydWN0IG9jZnMyX2V4dGVudF9tYXBfaXRlbSAqc3JjKQoreworCWRlc3QtPmVpX2Nwb3MgPSBzcmMtPmVpX2Nwb3M7CisJZGVzdC0+ZWlfcGh5cyA9IHNyYy0+ZWlfcGh5czsKKwlkZXN0LT5laV9jbHVzdGVycyA9IHNyYy0+ZWlfY2x1c3RlcnM7CisJZGVzdC0+ZWlfZmxhZ3MgPSBzcmMtPmVpX2ZsYWdzOworfQorCisvKgorICogVHJ5IHRvIG1lcmdlIGVtaSB3aXRoIGlucy4gUmV0dXJucyAxIGlmIG1lcmdlIHN1Y2NlZWRzLCB6ZXJvCisgKiBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbnQgb2NmczJfdHJ5X3RvX21lcmdlX2V4dGVudF9tYXAoc3RydWN0IG9jZnMyX2V4dGVudF9tYXBfaXRlbSAqZW1pLAorCQkJCQkgc3RydWN0IG9jZnMyX2V4dGVudF9tYXBfaXRlbSAqaW5zKQoreworCS8qCisJICogSGFuZGxlIGNvbnRpZ3VvdXNuZXNzCisJICovCisJaWYgKGlucy0+ZWlfcGh5cyA9PSAoZW1pLT5laV9waHlzICsgZW1pLT5laV9jbHVzdGVycykgJiYKKwkgICAgaW5zLT5laV9jcG9zID09IChlbWktPmVpX2Nwb3MgKyBlbWktPmVpX2NsdXN0ZXJzKSAmJgorCSAgICBpbnMtPmVpX2ZsYWdzID09IGVtaS0+ZWlfZmxhZ3MpIHsKKwkJZW1pLT5laV9jbHVzdGVycyArPSBpbnMtPmVpX2NsdXN0ZXJzOworCQlyZXR1cm4gMTsKKwl9IGVsc2UgaWYgKChpbnMtPmVpX3BoeXMgKyBpbnMtPmVpX2NsdXN0ZXJzKSA9PSBlbWktPmVpX3BoeXMgJiYKKwkJICAgKGlucy0+ZWlfY3BvcyArIGlucy0+ZWlfY2x1c3RlcnMpID09IGVtaS0+ZWlfcGh5cyAmJgorCQkgICBpbnMtPmVpX2ZsYWdzID09IGVtaS0+ZWlfZmxhZ3MpIHsKKwkJZW1pLT5laV9waHlzID0gaW5zLT5laV9waHlzOworCQllbWktPmVpX2Nwb3MgPSBpbnMtPmVpX2Nwb3M7CisJCWVtaS0+ZWlfY2x1c3RlcnMgKz0gaW5zLT5laV9jbHVzdGVyczsKKwkJcmV0dXJuIDE7CisJfQorCisJLyoKKwkgKiBPdmVybGFwcGluZyBleHRlbnRzIC0gdGhpcyBzaG91bGRuJ3QgaGFwcGVuIHVubGVzcyB3ZSd2ZQorCSAqIHNwbGl0IGFuIGV4dGVudCB0byBjaGFuZ2UgaXQncyBmbGFncy4gVGhhdCBpcyBleGNlZWRpbmdseQorCSAqIHJhcmUsIHNvIHRoZXJlJ3Mgbm8gc2Vuc2UgaW4gdHJ5aW5nIHRvIG9wdGltaXplIGl0IHlldC4KKwkgKi8KKwlpZiAob2NmczJfZWlfaXNfY29udGFpbmVkKGVtaSwgaW5zKSB8fAorCSAgICBvY2ZzMl9laV9pc19jb250YWluZWQoaW5zLCBlbWkpKSB7CisJCW9jZnMyX2NvcHlfZW1pX2ZpZWxkcyhlbWksIGlucyk7CisJCXJldHVybiAxOworCX0KKworCS8qIE5vIG1lcmdlIHdhcyBwb3NzaWJsZS4gKi8KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEluIG9yZGVyIHRvIHJlZHVjZSBjb21wbGV4aXR5IG9uIHRoZSBjYWxsZXIsIHRoaXMgaW5zZXJ0IGZ1bmN0aW9uCisgKiBpcyBpbnRlbnRpb25hbGx5IGxpYmVyYWwgaW4gd2hhdCBpdCB3aWxsIGFjY2VwdC4KKyAqCisgKiBUaGUgb25seSBydWxlIGlzIHRoYXQgdGhlIHRydW5jYXRlIGNhbGwgKm11c3QqIGJlIHVzZWQgd2hlbmV2ZXIKKyAqIHJlY29yZHMgaGF2ZSBiZWVuIGRlbGV0ZWQuIFRoaXMgYXZvaWRzIGluc2VydGluZyBvdmVybGFwcGluZworICogcmVjb3JkcyB3aXRoIGRpZmZlcmVudCBwaHlzaWNhbCBtYXBwaW5ncy4KKyAqLwordm9pZCBvY2ZzMl9leHRlbnRfbWFwX2luc2VydF9yZWMoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgc3RydWN0IG9jZnMyX2V4dGVudF9yZWMgKnJlYykKK3sKKwlzdHJ1Y3Qgb2NmczJfaW5vZGVfaW5mbyAqb2kgPSBPQ0ZTMl9JKGlub2RlKTsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X21hcCAqZW0gPSAmb2ktPmlwX2V4dGVudF9tYXA7CisJc3RydWN0IG9jZnMyX2V4dGVudF9tYXBfaXRlbSAqZW1pLCAqbmV3X2VtaSA9IE5VTEw7CisJc3RydWN0IG9jZnMyX2V4dGVudF9tYXBfaXRlbSBpbnM7CisKKwlpbnMuZWlfY3BvcyA9IGxlMzJfdG9fY3B1KHJlYy0+ZV9jcG9zKTsKKwlpbnMuZWlfcGh5cyA9IG9jZnMyX2Jsb2Nrc190b19jbHVzdGVycyhpbm9kZS0+aV9zYiwKKwkJCQkJICAgICAgIGxlNjRfdG9fY3B1KHJlYy0+ZV9ibGtubykpOworCWlucy5laV9jbHVzdGVycyA9IGxlMTZfdG9fY3B1KHJlYy0+ZV9sZWFmX2NsdXN0ZXJzKTsKKwlpbnMuZWlfZmxhZ3MgPSByZWMtPmVfZmxhZ3M7CisKK3NlYXJjaDoKKwlzcGluX2xvY2soJm9pLT5pcF9sb2NrKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZW1pLCAmZW0tPmVtX2xpc3QsIGVpX2xpc3QpIHsKKwkJaWYgKG9jZnMyX3RyeV90b19tZXJnZV9leHRlbnRfbWFwKGVtaSwgJmlucykpIHsKKwkJCWxpc3RfbW92ZSgmZW1pLT5laV9saXN0LCAmZW0tPmVtX2xpc3QpOworCQkJc3Bpbl91bmxvY2soJm9pLT5pcF9sb2NrKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJLyoKKwkgKiBObyBpdGVtIGNvdWxkIGJlIG1lcmdlZC4KKwkgKgorCSAqIEVpdGhlciBhbGxvY2F0ZSBhbmQgYWRkIGEgbmV3IGl0ZW0sIG9yIG92ZXJ3cml0ZSB0aGUgbGFzdCByZWNlbnRseQorCSAqIGluc2VydGVkLgorCSAqLworCisJaWYgKGVtLT5lbV9udW1faXRlbXMgPCBPQ0ZTMl9NQVhfRVhURU5UX01BUF9JVEVNUykgeworCQlpZiAobmV3X2VtaSA9PSBOVUxMKSB7CisJCQlzcGluX3VubG9jaygmb2ktPmlwX2xvY2spOworCisJCQluZXdfZW1pID0ga21hbGxvYyhzaXplb2YoKm5ld19lbWkpLCBHRlBfTk9GUyk7CisJCQlpZiAobmV3X2VtaSA9PSBOVUxMKQorCQkJCWdvdG8gb3V0OworCisJCQlnb3RvIHNlYXJjaDsKKwkJfQorCisJCW9jZnMyX2NvcHlfZW1pX2ZpZWxkcyhuZXdfZW1pLCAmaW5zKTsKKwkJbGlzdF9hZGQoJm5ld19lbWktPmVpX2xpc3QsICZlbS0+ZW1fbGlzdCk7CisJCWVtLT5lbV9udW1faXRlbXMrKzsKKwkJbmV3X2VtaSA9IE5VTEw7CisJfSBlbHNlIHsKKwkJQlVHX09OKGxpc3RfZW1wdHkoJmVtLT5lbV9saXN0KSB8fCBlbS0+ZW1fbnVtX2l0ZW1zID09IDApOworCQllbWkgPSBsaXN0X2VudHJ5KGVtLT5lbV9saXN0LnByZXYsCisJCQkJIHN0cnVjdCBvY2ZzMl9leHRlbnRfbWFwX2l0ZW0sIGVpX2xpc3QpOworCQlsaXN0X21vdmUoJmVtaS0+ZWlfbGlzdCwgJmVtLT5lbV9saXN0KTsKKwkJb2NmczJfY29weV9lbWlfZmllbGRzKGVtaSwgJmlucyk7CisJfQorCisJc3Bpbl91bmxvY2soJm9pLT5pcF9sb2NrKTsKKworb3V0OgorCWlmIChuZXdfZW1pKQorCQlrZnJlZShuZXdfZW1pKTsKK30KKworLyoKKyAqIFJldHVybiB0aGUgMXN0IGluZGV4IHdpdGhpbiBlbCB3aGljaCBjb250YWlucyBhbiBleHRlbnQgc3RhcnQKKyAqIGxhcmdlciB0aGFuIHZfY2x1c3Rlci4KKyAqLworc3RhdGljIGludCBvY2ZzMl9zZWFyY2hfZm9yX2hvbGVfaW5kZXgoc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICplbCwKKwkJCQkgICAgICAgdTMyIHZfY2x1c3RlcikKK3sKKwlpbnQgaTsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyAqcmVjOworCisJZm9yKGkgPSAwOyBpIDwgbGUxNl90b19jcHUoZWwtPmxfbmV4dF9mcmVlX3JlYyk7IGkrKykgeworCQlyZWMgPSAmZWwtPmxfcmVjc1tpXTsKKworCQlpZiAodl9jbHVzdGVyIDwgbGUzMl90b19jcHUocmVjLT5lX2Nwb3MpKQogCQkJYnJlYWs7CiAJfQogCi0JaWYgKHJldF9wICE9IE5VTEwpCi0JCSpyZXRfcCA9IHA7Ci0JaWYgKHJldF9wYXJlbnQgIT0gTlVMTCkKLQkJKnJldF9wYXJlbnQgPSBwYXJlbnQ7Ci0JcmV0dXJuIGVudDsKKwlyZXR1cm4gaTsKIH0KIAogLyoKLSAqIEZpbmQgdGhlIGxlYWYgY29udGFpbmluZyB0aGUgaW50ZXJ2YWwgd2Ugd2FudC4gIFdoaWxlIHdlJ3JlIG9uIG91cgotICogd2F5IGRvd24gdGhlIHRyZWUsIGZpbGwgaW4gZXZlcnkgcmVjb3JkIHdlIHNlZSBhdCBhbnkgZGVwdGgsIGJlY2F1c2UKLSAqIHdlIG1pZ2h0IHdhbnQgaXQgbGF0ZXIuCisgKiBGaWd1cmUgb3V0IHRoZSBzaXplIG9mIGEgaG9sZSB3aGljaCBzdGFydHMgYXQgdl9jbHVzdGVyIHdpdGhpbiB0aGUgZ2l2ZW4KKyAqIGV4dGVudCBsaXN0LgogICoKLSAqIE5vdGUgdGhhdCB0aGlzIGNvZGUgaXMgcnVuIHdpdGhvdXQgaXBfbG9jay4gIFRoYXQncyBiZWNhdXNlIGl0Ci0gKiBzbGVlcHMgd2hpbGUgcmVhZGluZy4gIElmIHNvbWVvbmUgaXMgYWxzbyBmaWxsaW5nIHRoZSBleHRlbnQgbGlzdCBhdAotICogdGhlIHNhbWUgdGltZSB3ZSBhcmUsIHdlIG1pZ2h0IGhhdmUgdG8gcmVzdGFydC4KKyAqIElmIHRoZXJlIGlzIG5vIG1vcmUgYWxsb2NhdGlvbiBwYXN0IHZfY2x1c3Rlciwgd2UgcmV0dXJuIHRoZSBtYXhpbXVtCisgKiBjbHVzdGVyIHNpemUgbWludXMgdl9jbHVzdGVyLgorICoKKyAqIElmIHdlIGhhdmUgaW4taW5vZGUgZXh0ZW50cywgdGhlbiBlbCBwb2ludHMgdG8gdGhlIGRpbm9kZSBsaXN0IGFuZAorICogZWJfYmggaXMgTlVMTC4gT3RoZXJ3aXNlLCBlYl9iaCBzaG91bGQgcG9pbnQgdG8gdGhlIGV4dGVudCBibG9jaworICogY29udGFpbmluZyBlbC4KICAqLwotc3RhdGljIGludCBvY2ZzMl9leHRlbnRfbWFwX2ZpbmRfbGVhZihzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJCSAgICAgIHUzMiBjcG9zLCB1MzIgY2x1c3RlcnMsCi0JCQkJICAgICAgc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICplbCkKK3N0YXRpYyBpbnQgb2NmczJfZmlndXJlX2hvbGVfY2x1c3RlcnMoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgICAgICBzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKmVsLAorCQkJCSAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqZWJfYmgsCisJCQkJICAgICAgdTMyIHZfY2x1c3RlciwKKwkJCQkgICAgICB1MzIgKm51bV9jbHVzdGVycykKIHsKLQlpbnQgaSwgcmV0OwotCXN0cnVjdCBidWZmZXJfaGVhZCAqZWJfYmggPSBOVUxMOwotCXU2NCBibGtubzsKLQl1MzIgcmVjX2VuZDsKLQlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICplYjsKLQlzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyAqcmVjOworCWludCByZXQsIGk7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpuZXh0X2ViX2JoID0gTlVMTDsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICplYiwgKm5leHRfZWI7CiAKLQkvKgotCSAqIFRoZSBiaCBkYXRhIGNvbnRhaW5pbmcgdGhlIGVsIGNhbm5vdCBjaGFuZ2UgaGVyZSwgYmVjYXVzZQotCSAqIHdlIGhvbGQgYWxsb2Nfc2VtLiAgU28gd2UgY2FuIGRvIHRoaXMgd2l0aG91dCBvdGhlcgotCSAqIGxvY2tzLgotCSAqLwotCXdoaWxlIChlbC0+bF90cmVlX2RlcHRoKQotCXsKLQkJYmxrbm8gPSAwOwotCQlmb3IgKGkgPSAwOyBpIDwgbGUxNl90b19jcHUoZWwtPmxfbmV4dF9mcmVlX3JlYyk7IGkrKykgewotCQkJcmVjID0gJmVsLT5sX3JlY3NbaV07Ci0JCQlyZWNfZW5kID0gKGxlMzJfdG9fY3B1KHJlYy0+ZV9jcG9zKSArCi0JCQkJICAgbGUzMl90b19jcHUocmVjLT5lX2NsdXN0ZXJzKSk7CisJaSA9IG9jZnMyX3NlYXJjaF9mb3JfaG9sZV9pbmRleChlbCwgdl9jbHVzdGVyKTsKIAotCQkJcmV0ID0gLUVCQURSOwotCQkJaWYgKHJlY19lbmQgPiBPQ0ZTMl9JKGlub2RlKS0+aXBfY2x1c3RlcnMpIHsKLQkJCQltbG9nX2Vycm5vKHJldCk7Ci0JCQkJb2NmczJfZXJyb3IoaW5vZGUtPmlfc2IsCi0JCQkJCSAgICAiRXh0ZW50ICVkIGF0IGVfYmxrbm8gJWxsdSBvZiBpbm9kZSAlbGx1IGdvZXMgcGFzdCBpcF9jbHVzdGVycyBvZiAldVxuIiwKLQkJCQkJICAgIGksCi0JCQkJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKWxlNjRfdG9fY3B1KHJlYy0+ZV9ibGtubyksCi0JCQkJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKU9DRlMyX0koaW5vZGUpLT5pcF9ibGtubywKLQkJCQkJICAgIE9DRlMyX0koaW5vZGUpLT5pcF9jbHVzdGVycyk7Ci0JCQkJZ290byBvdXRfZnJlZTsKLQkJCX0KLQotCQkJaWYgKHJlY19lbmQgPD0gY3BvcykgewotCQkJCXJldCA9IG9jZnMyX2V4dGVudF9tYXBfaW5zZXJ0KGlub2RlLCByZWMsCi0JCQkJCQlsZTE2X3RvX2NwdShlbC0+bF90cmVlX2RlcHRoKSk7Ci0JCQkJaWYgKHJldCAmJiAocmV0ICE9IC1FRVhJU1QpKSB7Ci0JCQkJCW1sb2dfZXJybm8ocmV0KTsKLQkJCQkJZ290byBvdXRfZnJlZTsKLQkJCQl9Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAoKGNwb3MgKyBjbHVzdGVycykgPD0gbGUzMl90b19jcHUocmVjLT5lX2Nwb3MpKSB7Ci0JCQkJcmV0ID0gb2NmczJfZXh0ZW50X21hcF9pbnNlcnQoaW5vZGUsIHJlYywKLQkJCQkJCWxlMTZfdG9fY3B1KGVsLT5sX3RyZWVfZGVwdGgpKTsKLQkJCQlpZiAocmV0ICYmIChyZXQgIT0gLUVFWElTVCkpIHsKLQkJCQkJbWxvZ19lcnJubyhyZXQpOwotCQkJCQlnb3RvIG91dF9mcmVlOwotCQkJCX0KLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJLyoKLQkJCSAqIFdlJ3ZlIGZvdW5kIGEgcmVjb3JkIHRoYXQgbWF0Y2hlcyBvdXIKLQkJCSAqIGludGVydmFsLiAgV2UgZG9uJ3QgaW5zZXJ0IGl0IGJlY2F1c2Ugd2UncmUKLQkJCSAqIGFib3V0IHRvIHRyYXZlcnNlIGl0LgotCQkJICovCi0KLQkJCS8qIENoZWNrIHRvIHNlZSBpZiB3ZSdyZSBzdHJhZGxpbmcgKi8KLQkJCXJldCA9IC1FU1JDSDsKLQkJCWlmICghb2NmczJfZXh0ZW50X3JlY19jb250YWluc19jbHVzdGVycyhyZWMsCi0JCQkJCQkJICAgICAgICBjcG9zLAotCQkJCQkJCQljbHVzdGVycykpIHsKLQkJCQltbG9nX2Vycm5vKHJldCk7Ci0JCQkJZ290byBvdXRfZnJlZTsKLQkJCX0KLQotCQkJLyoKLQkJCSAqIElmIHdlJ3ZlIGFscmVhZHkgZm91bmQgYSByZWNvcmQsIHRoZSBlbCBoYXMKLQkJCSAqIHR3byByZWNvcmRzIGNvdmVyaW5nIHRoZSBzYW1lIGludGVydmFsLgotCQkJICogRUVFSyEKLQkJCSAqLwotCQkJcmV0ID0gLUVCQURSOwotCQkJaWYgKGJsa25vKSB7Ci0JCQkJbWxvZ19lcnJubyhyZXQpOwotCQkJCW9jZnMyX2Vycm9yKGlub2RlLT5pX3NiLAotCQkJCQkgICAgIk11bHRpcGxlIGV4dGVudHMgZm9yIChjcG9zID0gJXUsIGNsdXN0ZXJzID0gJXUpIG9uIGlub2RlICVsbHU7IGVfYmxrbm8gJWxsdSBhbmQgcmVjICVkIGF0IGVfYmxrbm8gJWxsdVxuIiwKLQkJCQkJICAgIGNwb3MsIGNsdXN0ZXJzLAotCQkJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8sCi0JCQkJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKWJsa25vLCBpLAotCQkJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylsZTY0X3RvX2NwdShyZWMtPmVfYmxrbm8pKTsKLQkJCQlnb3RvIG91dF9mcmVlOwotCQkJfQotCi0JCQlibGtubyA9IGxlNjRfdG9fY3B1KHJlYy0+ZV9ibGtubyk7Ci0JCX0KKwlpZiAoaSA9PSBsZTE2X3RvX2NwdShlbC0+bF9uZXh0X2ZyZWVfcmVjKSAmJiBlYl9iaCkgeworCQllYiA9IChzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICopZWJfYmgtPmJfZGF0YTsKIAogCQkvKgotCQkgKiBXZSBkb24ndCBzdXBwb3J0IGhvbGVzLCBhbmQgd2UncmUgc3RpbGwgdXAKLQkJICogaW4gdGhlIGJyYW5jaGVzLCBzbyB3ZSdkIGJldHRlciBoYXZlIGZvdW5kIHNvbWVvbmUKKwkJICogQ2hlY2sgdGhlIG5leHQgbGVhZiBmb3IgYW55IGV4dGVudHMuCiAJCSAqLwotCQlyZXQgPSAtRUJBRFI7Ci0JCWlmICghYmxrbm8pIHsKLQkJCW9jZnMyX2Vycm9yKGlub2RlLT5pX3NiLAotCQkJCSAgICAiTm8gcmVjb3JkIGZvdW5kIGZvciAoY3BvcyA9ICV1LCBjbHVzdGVycyA9ICV1KSBvbiBpbm9kZSAlbGx1XG4iLAotCQkJCSAgICBjcG9zLCBjbHVzdGVycywKLQkJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8pOwotCQkJbWxvZ19lcnJubyhyZXQpOwotCQkJZ290byBvdXRfZnJlZTsKLQkJfQogCi0JCWlmIChlYl9iaCkgewotCQkJYnJlbHNlKGViX2JoKTsKLQkJCWViX2JoID0gTlVMTDsKLQkJfQorCQlpZiAobGU2NF90b19jcHUoZWItPmhfbmV4dF9sZWFmX2JsaykgPT0gMFVMTCkKKwkJCWdvdG8gbm9fbW9yZV9leHRlbnRzOworCiAJCXJldCA9IG9jZnMyX3JlYWRfYmxvY2soT0NGUzJfU0IoaW5vZGUtPmlfc2IpLAotCQkJCSAgICAgICBibGtubywgJmViX2JoLCBPQ0ZTMl9CSF9DQUNIRUQsCi0JCQkJICAgICAgIGlub2RlKTsKKwkJCQkgICAgICAgbGU2NF90b19jcHUoZWItPmhfbmV4dF9sZWFmX2JsayksCisJCQkJICAgICAgICZuZXh0X2ViX2JoLCBPQ0ZTMl9CSF9DQUNIRUQsIGlub2RlKTsKIAkJaWYgKHJldCkgewogCQkJbWxvZ19lcnJubyhyZXQpOwotCQkJZ290byBvdXRfZnJlZTsKKwkJCWdvdG8gb3V0OwogCQl9Ci0JCWViID0gKHN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKillYl9iaC0+Yl9kYXRhOwotCQlpZiAoIU9DRlMyX0lTX1ZBTElEX0VYVEVOVF9CTE9DSyhlYikpIHsKLQkJCU9DRlMyX1JPX09OX0lOVkFMSURfRVhURU5UX0JMT0NLKGlub2RlLT5pX3NiLCBlYik7Ci0JCQlyZXQgPSAtRUlPOwotCQkJZ290byBvdXRfZnJlZTsKKwkJbmV4dF9lYiA9IChzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICopbmV4dF9lYl9iaC0+Yl9kYXRhOworCisJCWlmICghT0NGUzJfSVNfVkFMSURfRVhURU5UX0JMT0NLKG5leHRfZWIpKSB7CisJCQlyZXQgPSAtRVJPRlM7CisJCQlPQ0ZTMl9ST19PTl9JTlZBTElEX0VYVEVOVF9CTE9DSyhpbm9kZS0+aV9zYiwgbmV4dF9lYik7CisJCQlnb3RvIG91dDsKIAkJfQotCQllbCA9ICZlYi0+aF9saXN0OworCisJCWVsID0gJm5leHRfZWItPmhfbGlzdDsKKworCQlpID0gb2NmczJfc2VhcmNoX2Zvcl9ob2xlX2luZGV4KGVsLCB2X2NsdXN0ZXIpOwogCX0KIAotCUJVR19PTihlbC0+bF90cmVlX2RlcHRoKTsKLQotCWZvciAoaSA9IDA7IGkgPCBsZTE2X3RvX2NwdShlbC0+bF9uZXh0X2ZyZWVfcmVjKTsgaSsrKSB7Ci0JCXJlYyA9ICZlbC0+bF9yZWNzW2ldOwotCi0JCWlmICgobGUzMl90b19jcHUocmVjLT5lX2Nwb3MpICsgbGUzMl90b19jcHUocmVjLT5lX2NsdXN0ZXJzKSkgPgotCQkgICAgT0NGUzJfSShpbm9kZSktPmlwX2NsdXN0ZXJzKSB7Ci0JCQlyZXQgPSAtRUJBRFI7Ci0JCQltbG9nX2Vycm5vKHJldCk7Ci0JCQlvY2ZzMl9lcnJvcihpbm9kZS0+aV9zYiwKLQkJCQkgICAgIkV4dGVudCAlZCBhdCBlX2Jsa25vICVsbHUgb2YgaW5vZGUgJWxsdSBnb2VzIHBhc3QgaXBfY2x1c3RlcnMgb2YgJXVcbiIsCi0JCQkJICAgIGksCi0JCQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbGU2NF90b19jcHUocmVjLT5lX2Jsa25vKSwKLQkJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8sCi0JCQkJICAgIE9DRlMyX0koaW5vZGUpLT5pcF9jbHVzdGVycyk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0KLQkJcmV0ID0gb2NmczJfZXh0ZW50X21hcF9pbnNlcnQoaW5vZGUsIHJlYywKLQkJCQkJICAgICAgbGUxNl90b19jcHUoZWwtPmxfdHJlZV9kZXB0aCkpOwotCQlpZiAocmV0ICYmIChyZXQgIT0gLUVFWElTVCkpIHsKLQkJCW1sb2dfZXJybm8ocmV0KTsKLQkJCWdvdG8gb3V0X2ZyZWU7Ci0JCX0KK25vX21vcmVfZXh0ZW50czoKKwlpZiAoaSA9PSBsZTE2X3RvX2NwdShlbC0+bF9uZXh0X2ZyZWVfcmVjKSkgeworCQkvKgorCQkgKiBXZSdyZSBhdCB0aGUgZW5kIG9mIG91ciBleGlzdGluZyBhbGxvY2F0aW9uLiBKdXN0CisJCSAqIHJldHVybiB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2x1c3RlcnMgd2UgY291bGQKKwkJICogcG9zc2libHkgYWxsb2NhdGUuCisJCSAqLworCQkqbnVtX2NsdXN0ZXJzID0gVUlOVF9NQVggLSB2X2NsdXN0ZXI7CisJfSBlbHNlIHsKKwkJKm51bV9jbHVzdGVycyA9IGxlMzJfdG9fY3B1KGVsLT5sX3JlY3NbaV0uZV9jcG9zKSAtIHZfY2x1c3RlcjsKIAl9CiAKIAlyZXQgPSAwOwotCi1vdXRfZnJlZToKLQlpZiAoZWJfYmgpCi0JCWJyZWxzZShlYl9iaCk7Ci0KK291dDoKKwlicmVsc2UobmV4dF9lYl9iaCk7CiAJcmV0dXJuIHJldDsKIH0KIAogLyoKLSAqIFRoaXMgbG9va3VwIGFjdHVhbGx5IHdpbGwgcmVhZCBmcm9tIGRpc2suICBJdCBoYXMgb25lIGludmFyaWFudDoKLSAqIEl0IHdpbGwgbmV2ZXIgcmUtdHJhdmVyc2UgYmxvY2tzLiAgVGhpcyBtZWFucyB0aGF0IGFsbCBpbnNlcnRzIHNob3VsZAotICogYmUgbmV3IHJlZ2lvbnMgb3IgbW9yZSBncmFudWxhciByZWdpb25zIChib3RoIGFsbG93ZWQgYnkgaW5zZXJ0KS4KKyAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIGV4dGVudCByZWNvcmQgd2hpY2ggY29udGFpbnMgY2x1c3RlciAjdl9jbHVzdGVyLgorICogLTEgaXMgcmV0dXJuZWQgaWYgaXQgd2FzIG5vdCBmb3VuZC4KKyAqCisgKiBTaG91bGQgd29yayBmaW5lIG9uIGludGVyaW9yIGFuZCBleHRlcmlvciBub2Rlcy4KICAqLwotc3RhdGljIGludCBvY2ZzMl9leHRlbnRfbWFwX2xvb2t1cF9yZWFkKHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkJCXUzMiBjcG9zLAotCQkJCQl1MzIgY2x1c3RlcnMsCi0JCQkJCXN0cnVjdCBvY2ZzMl9leHRlbnRfbWFwX2VudHJ5ICoqcmV0X2VudCkKK3N0YXRpYyBpbnQgb2NmczJfc2VhcmNoX2V4dGVudF9saXN0KHN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqZWwsCisJCQkJICAgIHUzMiB2X2NsdXN0ZXIpCiB7Ci0JaW50IHJldDsKLQl1NjQgYmxrbm87Ci0Jc3RydWN0IG9jZnMyX2V4dGVudF9tYXAgKmVtID0gJk9DRlMyX0koaW5vZGUpLT5pcF9tYXA7Ci0Jc3RydWN0IG9jZnMyX2V4dGVudF9tYXBfZW50cnkgKmVudDsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKLQlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICplYjsKLQlzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaTsKLQlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKmVsOworCWludCByZXQgPSAtMTsKKwlpbnQgaTsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyAqcmVjOworCXUzMiByZWNfZW5kLCByZWNfc3RhcnQsIGNsdXN0ZXJzOwogCi0Jc3Bpbl9sb2NrKCZPQ0ZTMl9JKGlub2RlKS0+aXBfbG9jayk7Ci0JZW50ID0gb2NmczJfZXh0ZW50X21hcF9sb29rdXAoZW0sIGNwb3MsIGNsdXN0ZXJzLCBOVUxMLCBOVUxMKTsKLQlpZiAoZW50KSB7Ci0JCWlmICghZW50LT5lX3RyZWVfZGVwdGgpIHsKLQkJCXNwaW5fdW5sb2NrKCZPQ0ZTMl9JKGlub2RlKS0+aXBfbG9jayk7Ci0JCQkqcmV0X2VudCA9IGVudDsKLQkJCXJldHVybiAwOwotCQl9Ci0JCWJsa25vID0gbGU2NF90b19jcHUoZW50LT5lX3JlYy5lX2Jsa25vKTsKLQkJc3Bpbl91bmxvY2soJk9DRlMyX0koaW5vZGUpLT5pcF9sb2NrKTsKKwlmb3IoaSA9IDA7IGkgPCBsZTE2X3RvX2NwdShlbC0+bF9uZXh0X2ZyZWVfcmVjKTsgaSsrKSB7CisJCXJlYyA9ICZlbC0+bF9yZWNzW2ldOwogCi0JCXJldCA9IG9jZnMyX3JlYWRfYmxvY2soT0NGUzJfU0IoaW5vZGUtPmlfc2IpLCBibGtubywgJmJoLAotCQkJCSAgICAgICBPQ0ZTMl9CSF9DQUNIRUQsIGlub2RlKTsKLQkJaWYgKHJldCkgewotCQkJbWxvZ19lcnJubyhyZXQpOwotCQkJaWYgKGJoKQotCQkJCWJyZWxzZShiaCk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JCWViID0gKHN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKiliaC0+Yl9kYXRhOwotCQlpZiAoIU9DRlMyX0lTX1ZBTElEX0VYVEVOVF9CTE9DSyhlYikpIHsKLQkJCU9DRlMyX1JPX09OX0lOVkFMSURfRVhURU5UX0JMT0NLKGlub2RlLT5pX3NiLCBlYik7Ci0JCQlicmVsc2UoYmgpOwotCQkJcmV0dXJuIC1FSU87Ci0JCX0KLQkJZWwgPSAmZWItPmhfbGlzdDsKLQl9IGVsc2UgewotCQlzcGluX3VubG9jaygmT0NGUzJfSShpbm9kZSktPmlwX2xvY2spOworCQlyZWNfc3RhcnQgPSBsZTMyX3RvX2NwdShyZWMtPmVfY3Bvcyk7CisJCWNsdXN0ZXJzID0gb2NmczJfcmVjX2NsdXN0ZXJzKGVsLCByZWMpOwogCi0JCXJldCA9IG9jZnMyX3JlYWRfYmxvY2soT0NGUzJfU0IoaW5vZGUtPmlfc2IpLAotCQkJCSAgICAgICBPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8sICZiaCwKLQkJCQkgICAgICAgT0NGUzJfQkhfQ0FDSEVELCBpbm9kZSk7Ci0JCWlmIChyZXQpIHsKLQkJCW1sb2dfZXJybm8ocmV0KTsKLQkJCWlmIChiaCkKLQkJCQlicmVsc2UoYmgpOwotCQkJcmV0dXJuIHJldDsKKwkJcmVjX2VuZCA9IHJlY19zdGFydCArIGNsdXN0ZXJzOworCisJCWlmICh2X2NsdXN0ZXIgPj0gcmVjX3N0YXJ0ICYmIHZfY2x1c3RlciA8IHJlY19lbmQpIHsKKwkJCXJldCA9IGk7CisJCQlicmVhazsKIAkJfQotCQlkaSA9IChzdHJ1Y3Qgb2NmczJfZGlub2RlICopYmgtPmJfZGF0YTsKLQkJaWYgKCFPQ0ZTMl9JU19WQUxJRF9ESU5PREUoZGkpKSB7Ci0JCQlicmVsc2UoYmgpOwotCQkJT0NGUzJfUk9fT05fSU5WQUxJRF9ESU5PREUoaW5vZGUtPmlfc2IsIGRpKTsKLQkJCXJldHVybiAtRUlPOwotCQl9Ci0JCWVsID0gJmRpLT5pZDIuaV9saXN0OwogCX0KIAotCXJldCA9IG9jZnMyX2V4dGVudF9tYXBfZmluZF9sZWFmKGlub2RlLCBjcG9zLCBjbHVzdGVycywgZWwpOwotCWJyZWxzZShiaCk7CisJcmV0dXJuIHJldDsKK30KKworaW50IG9jZnMyX2dldF9jbHVzdGVycyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1MzIgdl9jbHVzdGVyLAorCQkgICAgICAgdTMyICpwX2NsdXN0ZXIsIHUzMiAqbnVtX2NsdXN0ZXJzLAorCQkgICAgICAgdW5zaWduZWQgaW50ICpleHRlbnRfZmxhZ3MpCit7CisJaW50IHJldCwgaTsKKwl1bnNpZ25lZCBpbnQgZmxhZ3MgPSAwOworCXN0cnVjdCBidWZmZXJfaGVhZCAqZGlfYmggPSBOVUxMOworCXN0cnVjdCBidWZmZXJfaGVhZCAqZWJfYmggPSBOVUxMOworCXN0cnVjdCBvY2ZzMl9kaW5vZGUgKmRpOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKmViOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqZWw7CisJc3RydWN0IG9jZnMyX2V4dGVudF9yZWMgKnJlYzsKKwl1MzIgY29mZjsKKworCXJldCA9IG9jZnMyX2V4dGVudF9tYXBfbG9va3VwKGlub2RlLCB2X2NsdXN0ZXIsIHBfY2x1c3RlciwKKwkJCQkgICAgICBudW1fY2x1c3RlcnMsIGV4dGVudF9mbGFncyk7CisJaWYgKHJldCA9PSAwKQorCQlnb3RvIG91dDsKKworCXJldCA9IG9jZnMyX3JlYWRfYmxvY2soT0NGUzJfU0IoaW5vZGUtPmlfc2IpLCBPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8sCisJCQkgICAgICAgJmRpX2JoLCBPQ0ZTMl9CSF9DQUNIRUQsIGlub2RlKTsKIAlpZiAocmV0KSB7CiAJCW1sb2dfZXJybm8ocmV0KTsKLQkJcmV0dXJuIHJldDsKKwkJZ290byBvdXQ7CiAJfQogCi0JZW50ID0gb2NmczJfZXh0ZW50X21hcF9sb29rdXAoZW0sIGNwb3MsIGNsdXN0ZXJzLCBOVUxMLCBOVUxMKTsKLQlpZiAoIWVudCkgewotCQlyZXQgPSAtRVNSQ0g7Ci0JCW1sb2dfZXJybm8ocmV0KTsKLQkJcmV0dXJuIHJldDsKKwlkaSA9IChzdHJ1Y3Qgb2NmczJfZGlub2RlICopIGRpX2JoLT5iX2RhdGE7CisJZWwgPSAmZGktPmlkMi5pX2xpc3Q7CisKKwlpZiAoZWwtPmxfdHJlZV9kZXB0aCkgeworCQlyZXQgPSBvY2ZzMl9maW5kX2xlYWYoaW5vZGUsIGVsLCB2X2NsdXN0ZXIsICZlYl9iaCk7CisJCWlmIChyZXQpIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJZWIgPSAoc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqKSBlYl9iaC0+Yl9kYXRhOworCQllbCA9ICZlYi0+aF9saXN0OworCisJCWlmIChlbC0+bF90cmVlX2RlcHRoKSB7CisJCQlvY2ZzMl9lcnJvcihpbm9kZS0+aV9zYiwKKwkJCQkgICAgIklub2RlICVsdSBoYXMgbm9uIHplcm8gdHJlZSBkZXB0aCBpbiAiCisJCQkJICAgICJsZWFmIGJsb2NrICVsbHVcbiIsIGlub2RlLT5pX2lubywKKwkJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyllYl9iaC0+Yl9ibG9ja25yKTsKKwkJCXJldCA9IC1FUk9GUzsKKwkJCWdvdG8gb3V0OworCQl9CiAJfQogCi0JLyogRklYTUU6IE1ha2Ugc3VyZSB0aGlzIGlzbid0IGEgY29ycnVwdGlvbiAqLwotCUJVR19PTihlbnQtPmVfdHJlZV9kZXB0aCk7CisJaSA9IG9jZnMyX3NlYXJjaF9leHRlbnRfbGlzdChlbCwgdl9jbHVzdGVyKTsKKwlpZiAoaSA9PSAtMSkgeworCQkvKgorCQkgKiBBIGhvbGUgd2FzIGZvdW5kLiBSZXR1cm4gc29tZSBjYW5uZWQgdmFsdWVzIHRoYXQKKwkJICogY2FsbGVycyBjYW4ga2V5IG9uLiBJZiBhc2tlZCBmb3IsIG51bV9jbHVzdGVycyB3aWxsCisJCSAqIGJlIHBvcHVsYXRlZCB3aXRoIHRoZSBzaXplIG9mIHRoZSBob2xlLgorCQkgKi8KKwkJKnBfY2x1c3RlciA9IDA7CisJCWlmIChudW1fY2x1c3RlcnMpIHsKKwkJCXJldCA9IG9jZnMyX2ZpZ3VyZV9ob2xlX2NsdXN0ZXJzKGlub2RlLCBlbCwgZWJfYmgsCisJCQkJCQkJIHZfY2x1c3RlciwKKwkJCQkJCQkgbnVtX2NsdXN0ZXJzKTsKKwkJCWlmIChyZXQpIHsKKwkJCQltbG9nX2Vycm5vKHJldCk7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlyZWMgPSAmZWwtPmxfcmVjc1tpXTsKIAotCSpyZXRfZW50ID0gZW50OworCQlCVUdfT04odl9jbHVzdGVyIDwgbGUzMl90b19jcHUocmVjLT5lX2Nwb3MpKTsKIAotCXJldHVybiAwOworCQlpZiAoIXJlYy0+ZV9ibGtubykgeworCQkJb2NmczJfZXJyb3IoaW5vZGUtPmlfc2IsICJJbm9kZSAlbHUgaGFzIGJhZCBleHRlbnQgIgorCQkJCSAgICAicmVjb3JkICgldSwgJXUsIDApIiwgaW5vZGUtPmlfaW5vLAorCQkJCSAgICBsZTMyX3RvX2NwdShyZWMtPmVfY3BvcyksCisJCQkJICAgIG9jZnMyX3JlY19jbHVzdGVycyhlbCwgcmVjKSk7CisJCQlyZXQgPSAtRVJPRlM7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWNvZmYgPSB2X2NsdXN0ZXIgLSBsZTMyX3RvX2NwdShyZWMtPmVfY3Bvcyk7CisKKwkJKnBfY2x1c3RlciA9IG9jZnMyX2Jsb2Nrc190b19jbHVzdGVycyhpbm9kZS0+aV9zYiwKKwkJCQkJCSAgICBsZTY0X3RvX2NwdShyZWMtPmVfYmxrbm8pKTsKKwkJKnBfY2x1c3RlciA9ICpwX2NsdXN0ZXIgKyBjb2ZmOworCisJCWlmIChudW1fY2x1c3RlcnMpCisJCQkqbnVtX2NsdXN0ZXJzID0gb2NmczJfcmVjX2NsdXN0ZXJzKGVsLCByZWMpIC0gY29mZjsKKworCQlmbGFncyA9IHJlYy0+ZV9mbGFnczsKKworCQlvY2ZzMl9leHRlbnRfbWFwX2luc2VydF9yZWMoaW5vZGUsIHJlYyk7CisJfQorCisJaWYgKGV4dGVudF9mbGFncykKKwkJKmV4dGVudF9mbGFncyA9IGZsYWdzOworCitvdXQ6CisJYnJlbHNlKGRpX2JoKTsKKwlicmVsc2UoZWJfYmgpOworCXJldHVybiByZXQ7CiB9CiAKIC8qCi0gKiBDYWxsZXJzIG11c3QgaG9sZCBpcF9sb2NrLiAgVGhpcyBjYW4gaW5zZXJ0IHBpZWNlcyBvZiB0aGUgdHJlZSwKLSAqIHRodXMgcmFjaW5nIGxvb2t1cCBpZiB0aGUgbG9jayB3ZXJlbid0IGhlbGQuCisgKiBUaGlzIGV4cGVjdHMgYWxsb2Nfc2VtIHRvIGJlIGhlbGQuIFRoZSBhbGxvY2F0aW9uIGNhbm5vdCBjaGFuZ2UgYXQKKyAqIGFsbCB3aGlsZSB0aGUgbWFwIGlzIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIHVwZGF0ZWQuCiAgKi8KLXN0YXRpYyBpbnQgb2NmczJfZXh0ZW50X21hcF9pbnNlcnRfZW50cnkoc3RydWN0IG9jZnMyX2V4dGVudF9tYXAgKmVtLAotCQkJCQkgc3RydWN0IG9jZnMyX2V4dGVudF9tYXBfZW50cnkgKmVudCkKLXsKLQlzdHJ1Y3QgcmJfbm9kZSAqKnAsICpwYXJlbnQ7Ci0Jc3RydWN0IG9jZnMyX2V4dGVudF9tYXBfZW50cnkgKm9sZF9lbnQ7Ci0KLQlvbGRfZW50ID0gb2NmczJfZXh0ZW50X21hcF9sb29rdXAoZW0sIGxlMzJfdG9fY3B1KGVudC0+ZV9yZWMuZV9jcG9zKSwKLQkJCQkJICBsZTMyX3RvX2NwdShlbnQtPmVfcmVjLmVfY2x1c3RlcnMpLAotCQkJCQkgICZwLCAmcGFyZW50KTsKLQlpZiAob2xkX2VudCkKLQkJcmV0dXJuIC1FRVhJU1Q7Ci0KLQlyYl9saW5rX25vZGUoJmVudC0+ZV9ub2RlLCBwYXJlbnQsIHApOwotCXJiX2luc2VydF9jb2xvcigmZW50LT5lX25vZGUsICZlbS0+ZW1fZXh0ZW50cyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotCi0vKgotICogU2ltcGxlIHJ1bGU6IG9uIGFueSByZXR1cm4gY29kZSBvdGhlciB0aGFuIC1FQUdBSU4sIGFueXRoaW5nIGxlZnQKLSAqIGluIHRoZSBpbnNlcnRfY29udGV4dCB3aWxsIGJlIGZyZWVkLgotICoKLSAqIFNpbXBsZSBydWxlICMyOiBBIHJldHVybiBjb2RlIG9mIC1FRVhJU1QgZnJvbSB0aGlzIGZ1bmN0aW9uIG9yCi0gKiBpdHMgY2FsbHMgdG8gb2NmczJfZXh0ZW50X21hcF9pbnNlcnRfZW50cnkoKSBzaWduaWZpZXMgdGhhdCBhbm90aGVyCi0gKiB0aHJlYWQgYmVhdCB1cyB0byB0aGUgaW5zZXJ0LiAgSXQgaXMgbm90IGFuIGFjdHVhbCBlcnJvciwgYnV0IGl0Ci0gKiB0ZWxscyB0aGUgY2FsbGVyIHdlIGhhdmUgbm8gbW9yZSB3b3JrIHRvIGRvLgotICovCi1zdGF0aWMgaW50IG9jZnMyX2V4dGVudF9tYXBfdHJ5X2luc2VydChzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJCSAgICAgICBzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyAqcmVjLAotCQkJCSAgICAgICBpbnQgdHJlZV9kZXB0aCwKLQkJCQkgICAgICAgc3RydWN0IG9jZnMyX2VtX2luc2VydF9jb250ZXh0ICpjdHh0KQoraW50IG9jZnMyX2V4dGVudF9tYXBfZ2V0X2Jsb2NrcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1NjQgdl9ibGtubywgdTY0ICpwX2Jsa25vLAorCQkJCXU2NCAqcmV0X2NvdW50LCB1bnNpZ25lZCBpbnQgKmV4dGVudF9mbGFncykKIHsKIAlpbnQgcmV0OwotCXN0cnVjdCBvY2ZzMl9leHRlbnRfbWFwICplbSA9ICZPQ0ZTMl9JKGlub2RlKS0+aXBfbWFwOwotCXN0cnVjdCBvY2ZzMl9leHRlbnRfbWFwX2VudHJ5ICpvbGRfZW50OworCWludCBicGMgPSBvY2ZzMl9jbHVzdGVyc190b19ibG9ja3MoaW5vZGUtPmlfc2IsIDEpOworCXUzMiBjcG9zLCBudW1fY2x1c3RlcnMsIHBfY2x1c3RlcjsKKwl1NjQgYm9mZiA9IDA7CiAKLQljdHh0LT5uZWVkX2xlZnQgPSAwOwotCWN0eHQtPm5lZWRfcmlnaHQgPSAwOwotCWN0eHQtPm9sZF9lbnQgPSBOVUxMOworCWNwb3MgPSBvY2ZzMl9ibG9ja3NfdG9fY2x1c3RlcnMoaW5vZGUtPmlfc2IsIHZfYmxrbm8pOwogCi0Jc3Bpbl9sb2NrKCZPQ0ZTMl9JKGlub2RlKS0+aXBfbG9jayk7Ci0JcmV0ID0gb2NmczJfZXh0ZW50X21hcF9pbnNlcnRfZW50cnkoZW0sIGN0eHQtPm5ld19lbnQpOwotCWlmICghcmV0KSB7Ci0JCWN0eHQtPm5ld19lbnQgPSBOVUxMOwotCQlnb3RvIG91dF91bmxvY2s7Ci0JfQotCi0JLyogU2luY2UgaW5zZXJ0X2VudHJ5IGZhaWxlZCwgdGhlIG1hcCBNVVNUIGhhdmUgb2xkX2VudCAqLwotCW9sZF9lbnQgPSBvY2ZzMl9leHRlbnRfbWFwX2xvb2t1cChlbSwgbGUzMl90b19jcHUocmVjLT5lX2Nwb3MpLAotCQkJCQkgIGxlMzJfdG9fY3B1KHJlYy0+ZV9jbHVzdGVycyksCi0JCQkJCSAgTlVMTCwgTlVMTCk7Ci0KLQlCVUdfT04oIW9sZF9lbnQpOwotCi0JaWYgKG9sZF9lbnQtPmVfdHJlZV9kZXB0aCA8IHRyZWVfZGVwdGgpIHsKLQkJLyogQW5vdGhlciB0aHJlYWQgYmVhdCB1cyB0byB0aGUgbG93ZXIgdHJlZV9kZXB0aCAqLwotCQlyZXQgPSAtRUVYSVNUOwotCQlnb3RvIG91dF91bmxvY2s7Ci0JfQotCi0JaWYgKG9sZF9lbnQtPmVfdHJlZV9kZXB0aCA9PSB0cmVlX2RlcHRoKSB7Ci0JCS8qCi0JCSAqIEFub3RoZXIgdGhyZWFkIGJlYXQgdXMgdG8gdGhpcyB0cmVlX2RlcHRoLgotCQkgKiBMZXQncyBtYWtlIHN1cmUgd2UgYWdyZWUgd2l0aCB0aGF0IHRocmVhZCAodGhlCi0JCSAqIGV4dGVudF9yZWMgc2hvdWxkIGJlIGlkZW50aWNhbCkuCi0JCSAqLwotCQlpZiAoIW1lbWNtcChyZWMsICZvbGRfZW50LT5lX3JlYywKLQkJCSAgICBzaXplb2Yoc3RydWN0IG9jZnMyX2V4dGVudF9yZWMpKSkKLQkJCXJldCA9IDA7Ci0JCWVsc2UKLQkJCS8qIEZJWE1FOiBTaG91bGQgdGhpcyBiZSBFU1JDSC9FQkFEUj8/PyAqLwotCQkJcmV0ID0gLUVFWElTVDsKLQotCQlnb3RvIG91dF91bmxvY2s7CisJcmV0ID0gb2NmczJfZ2V0X2NsdXN0ZXJzKGlub2RlLCBjcG9zLCAmcF9jbHVzdGVyLCAmbnVtX2NsdXN0ZXJzLAorCQkJCSBleHRlbnRfZmxhZ3MpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKIAl9CiAKIAkvKgotCSAqIFdlIGRvIGl0IGluIHRoaXMgb3JkZXIgc3BlY2lmaWNhbGx5IHNvIHRoYXQgbm8gYWN0dWFsIHRyZWUKLQkgKiBjaGFuZ2VzIG9jY3VyIHVudGlsIHdlIGhhdmUgYWxsIHRoZSBwaWVjZXMgd2UgbmVlZC4gIFdlCi0JICogZG9uJ3Qgd2FudCBtYWxsb2MgZmFpbHVyZXMgdG8gbGVhdmUgYW4gaW5jb25zaXN0ZW50IHRyZWUuCi0JICogV2hlbmV2ZXIgd2UgZHJvcCB0aGUgbG9jaywgYW5vdGhlciBwcm9jZXNzIGNvdWxkIGJlCi0JICogaW5zZXJ0aW5nLiAgQWxzbyBub3RlIHRoYXQsIGlmIGFub3RoZXIgcHJvY2VzcyBqdXN0IGJlYXQgdXMKLQkgKiB0byBhbiBpbnNlcnQsIHdlIG1pZ2h0IG5vdCBuZWVkIHRoZSBzYW1lIHBpZWNlcyB3ZSBuZWVkZWQKLQkgKiB0aGUgZmlyc3QgZ28gcm91bmQuICBJbiB0aGUgZW5kLCB0aGUgcGllY2VzIHdlIG5lZWQgd2lsbAotCSAqIGJlIHVzZWQsIGFuZCB0aGUgcGllY2VzIHdlIGRvbid0IHdpbGwgYmUgZnJlZWQuCisJICogcF9jbHVzdGVyID09IDAgaW5kaWNhdGVzIGEgaG9sZS4KIAkgKi8KLQljdHh0LT5uZWVkX2xlZnQgPSAhIShsZTMyX3RvX2NwdShyZWMtPmVfY3BvcykgPgotCQkJICAgICBsZTMyX3RvX2NwdShvbGRfZW50LT5lX3JlYy5lX2Nwb3MpKTsKLQljdHh0LT5uZWVkX3JpZ2h0ID0gISEoKGxlMzJfdG9fY3B1KG9sZF9lbnQtPmVfcmVjLmVfY3BvcykgKwotCQkJICAgICAgIGxlMzJfdG9fY3B1KG9sZF9lbnQtPmVfcmVjLmVfY2x1c3RlcnMpKSA+Ci0JCQkgICAgICAobGUzMl90b19jcHUocmVjLT5lX2Nwb3MpICsgbGUzMl90b19jcHUocmVjLT5lX2NsdXN0ZXJzKSkpOwotCXJldCA9IC1FQUdBSU47Ci0JaWYgKGN0eHQtPm5lZWRfbGVmdCkgewotCQlpZiAoIWN0eHQtPmxlZnRfZW50KQotCQkJZ290byBvdXRfdW5sb2NrOwotCQkqKGN0eHQtPmxlZnRfZW50KSA9ICpvbGRfZW50OwotCQljdHh0LT5sZWZ0X2VudC0+ZV9yZWMuZV9jbHVzdGVycyA9Ci0JCQljcHVfdG9fbGUzMihsZTMyX3RvX2NwdShyZWMtPmVfY3BvcykgLQotCQkJCSAgICBsZTMyX3RvX2NwdShjdHh0LT5sZWZ0X2VudC0+ZV9yZWMuZV9jcG9zKSk7Ci0JfQotCWlmIChjdHh0LT5uZWVkX3JpZ2h0KSB7Ci0JCWlmICghY3R4dC0+cmlnaHRfZW50KQotCQkJZ290byBvdXRfdW5sb2NrOwotCQkqKGN0eHQtPnJpZ2h0X2VudCkgPSAqb2xkX2VudDsKLQkJY3R4dC0+cmlnaHRfZW50LT5lX3JlYy5lX2Nwb3MgPQotCQkJY3B1X3RvX2xlMzIobGUzMl90b19jcHUocmVjLT5lX2Nwb3MpICsKLQkJCQkgICAgbGUzMl90b19jcHUocmVjLT5lX2NsdXN0ZXJzKSk7Ci0JCWN0eHQtPnJpZ2h0X2VudC0+ZV9yZWMuZV9jbHVzdGVycyA9Ci0JCQljcHVfdG9fbGUzMigobGUzMl90b19jcHUob2xkX2VudC0+ZV9yZWMuZV9jcG9zKSArCi0JCQkJICAgICBsZTMyX3RvX2NwdShvbGRfZW50LT5lX3JlYy5lX2NsdXN0ZXJzKSkgLQotCQkJCSAgICBsZTMyX3RvX2NwdShjdHh0LT5yaWdodF9lbnQtPmVfcmVjLmVfY3BvcykpOwotCX0KLQotCXJiX2VyYXNlKCZvbGRfZW50LT5lX25vZGUsICZlbS0+ZW1fZXh0ZW50cyk7Ci0JLyogTm93IHRoYXQgaGUncyBlcmFzZWQsIHNldCBoaW0gdXAgZm9yIGRlbGV0aW9uICovCi0JY3R4dC0+b2xkX2VudCA9IG9sZF9lbnQ7Ci0KLQlpZiAoY3R4dC0+bmVlZF9sZWZ0KSB7Ci0JCXJldCA9IG9jZnMyX2V4dGVudF9tYXBfaW5zZXJ0X2VudHJ5KGVtLAotCQkJCQkJICAgIGN0eHQtPmxlZnRfZW50KTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gb3V0X3VubG9jazsKLQkJY3R4dC0+bGVmdF9lbnQgPSBOVUxMOwotCX0KLQotCWlmIChjdHh0LT5uZWVkX3JpZ2h0KSB7Ci0JCXJldCA9IG9jZnMyX2V4dGVudF9tYXBfaW5zZXJ0X2VudHJ5KGVtLAotCQkJCQkJICAgIGN0eHQtPnJpZ2h0X2VudCk7Ci0JCWlmIChyZXQpCi0JCQlnb3RvIG91dF91bmxvY2s7Ci0JCWN0eHQtPnJpZ2h0X2VudCA9IE5VTEw7Ci0JfQotCi0JcmV0ID0gb2NmczJfZXh0ZW50X21hcF9pbnNlcnRfZW50cnkoZW0sIGN0eHQtPm5ld19lbnQpOwotCi0JaWYgKCFyZXQpCi0JCWN0eHQtPm5ld19lbnQgPSBOVUxMOwotCi1vdXRfdW5sb2NrOgotCXNwaW5fdW5sb2NrKCZPQ0ZTMl9JKGlub2RlKS0+aXBfbG9jayk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0KLXN0YXRpYyBpbnQgb2NmczJfZXh0ZW50X21hcF9pbnNlcnQoc3RydWN0IGlub2RlICppbm9kZSwKLQkJCQkgICBzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyAqcmVjLAotCQkJCSAgIGludCB0cmVlX2RlcHRoKQotewotCWludCByZXQ7Ci0Jc3RydWN0IG9jZnMyX2VtX2luc2VydF9jb250ZXh0IGN0eHQgPSB7MCwgfTsKLQotCWlmICgobGUzMl90b19jcHUocmVjLT5lX2Nwb3MpICsgbGUzMl90b19jcHUocmVjLT5lX2NsdXN0ZXJzKSkgPgotCSAgICBPQ0ZTMl9JKGlub2RlKS0+aXBfbWFwLmVtX2NsdXN0ZXJzKSB7Ci0JCXJldCA9IC1FQkFEUjsKLQkJbWxvZ19lcnJubyhyZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qIFplcm8gZV9jbHVzdGVycyBtZWFucyBhIHRydW5jYXRlZCB0YWlsIHJlY29yZC4gIEl0IGJldHRlciBiZSBFT0YgKi8KLQlpZiAoIXJlYy0+ZV9jbHVzdGVycykgewotCQlpZiAoKGxlMzJfdG9fY3B1KHJlYy0+ZV9jcG9zKSArIGxlMzJfdG9fY3B1KHJlYy0+ZV9jbHVzdGVycykpICE9Ci0JCSAgICBPQ0ZTMl9JKGlub2RlKS0+aXBfbWFwLmVtX2NsdXN0ZXJzKSB7Ci0JCQlyZXQgPSAtRUJBRFI7Ci0JCQltbG9nX2Vycm5vKHJldCk7Ci0JCQlvY2ZzMl9lcnJvcihpbm9kZS0+aV9zYiwKLQkJCQkgICAgIlplcm8gZV9jbHVzdGVycyBvbiBub24tdGFpbCBleHRlbnQgcmVjb3JkIGF0IGVfYmxrbm8gJWxsdSBvbiBpbm9kZSAlbGx1XG4iLAotCQkJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKWxlNjRfdG9fY3B1KHJlYy0+ZV9ibGtubyksCi0JCQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vKTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQotCQkvKiBJZ25vcmUgdGhlIHRydW5jYXRlZCB0YWlsICovCi0JCXJldHVybiAwOwotCX0KLQotCXJldCA9IC1FTk9NRU07Ci0JY3R4dC5uZXdfZW50ID0ga21lbV9jYWNoZV9hbGxvYyhvY2ZzMl9lbV9lbnRfY2FjaGVwLAotCQkJCQlHRlBfTk9GUyk7Ci0JaWYgKCFjdHh0Lm5ld19lbnQpIHsKLQkJbWxvZ19lcnJubyhyZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCWN0eHQubmV3X2VudC0+ZV9yZWMgPSAqcmVjOwotCWN0eHQubmV3X2VudC0+ZV90cmVlX2RlcHRoID0gdHJlZV9kZXB0aDsKLQotCWRvIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJaWYgKGN0eHQubmVlZF9sZWZ0ICYmICFjdHh0LmxlZnRfZW50KSB7Ci0JCQljdHh0LmxlZnRfZW50ID0KLQkJCQlrbWVtX2NhY2hlX2FsbG9jKG9jZnMyX2VtX2VudF9jYWNoZXAsCi0JCQkJCQkgR0ZQX05PRlMpOwotCQkJaWYgKCFjdHh0LmxlZnRfZW50KQotCQkJCWJyZWFrOwotCQl9Ci0JCWlmIChjdHh0Lm5lZWRfcmlnaHQgJiYgIWN0eHQucmlnaHRfZW50KSB7Ci0JCQljdHh0LnJpZ2h0X2VudCA9Ci0JCQkJa21lbV9jYWNoZV9hbGxvYyhvY2ZzMl9lbV9lbnRfY2FjaGVwLAotCQkJCQkJIEdGUF9OT0ZTKTsKLQkJCWlmICghY3R4dC5yaWdodF9lbnQpCi0JCQkJYnJlYWs7Ci0JCX0KLQotCQlyZXQgPSBvY2ZzMl9leHRlbnRfbWFwX3RyeV9pbnNlcnQoaW5vZGUsIHJlYywKLQkJCQkJCSAgdHJlZV9kZXB0aCwgJmN0eHQpOwotCX0gd2hpbGUgKHJldCA9PSAtRUFHQUlOKTsKLQotCWlmICgocmV0IDwgMCkgJiYgKHJldCAhPSAtRUVYSVNUKSkKLQkJbWxvZ19lcnJubyhyZXQpOwotCi0JaWYgKGN0eHQubGVmdF9lbnQpCi0JCWttZW1fY2FjaGVfZnJlZShvY2ZzMl9lbV9lbnRfY2FjaGVwLCBjdHh0LmxlZnRfZW50KTsKLQlpZiAoY3R4dC5yaWdodF9lbnQpCi0JCWttZW1fY2FjaGVfZnJlZShvY2ZzMl9lbV9lbnRfY2FjaGVwLCBjdHh0LnJpZ2h0X2VudCk7Ci0JaWYgKGN0eHQub2xkX2VudCkKLQkJa21lbV9jYWNoZV9mcmVlKG9jZnMyX2VtX2VudF9jYWNoZXAsIGN0eHQub2xkX2VudCk7Ci0JaWYgKGN0eHQubmV3X2VudCkKLQkJa21lbV9jYWNoZV9mcmVlKG9jZnMyX2VtX2VudF9jYWNoZXAsIGN0eHQubmV3X2VudCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0vKgotICogQXBwZW5kIHRoaXMgcmVjb3JkIHRvIHRoZSB0YWlsIG9mIHRoZSBleHRlbnQgbWFwLiAgSXQgbXVzdCBiZQotICogdHJlZV9kZXB0aCAwLiAgVGhlIHJlY29yZCBtaWdodCBiZSBhbiBleHRlbnNpb24gb2YgYW4gZXhpc3RpbmcKLSAqIHJlY29yZCwgYW5kIGFzIHN1Y2ggdGhhdCBuZWVkcyB0byBiZSBoYW5kbGVkLiAgZWc6Ci0gKgotICogRXhpc3RpbmcgcmVjb3JkIGluIHRoZSBleHRlbnQgbWFwOgotICoKLSAqCWNwb3MgPSAxMCwgbGVuID0gMTAKLSAqCXwtLS0tLS0tLS18Ci0gKgotICogTmV3IFJlY29yZDoKLSAqCi0gKgljcG9zID0gMTAsIGxlbiA9IDIwCi0gKgl8LS0tLS0tLS0tLS0tLS0tLS0tfAotICoKLSAqIFRoZSBwYXNzZWQgcmVjb3JkIGlzIHRoZSBuZXcgb24tZGlzayByZWNvcmQuICBUaGUgbmV3X2NsdXN0ZXJzIHZhbHVlCi0gKiBpcyBob3cgbWFueSBjbHVzdGVycyB3ZXJlIGFkZGVkIHRvIHRoZSBmaWxlLiAgSWYgdGhlIGFwcGVuZCBpcyBhCi0gKiBjb250aWd1b3VzIGFwcGVuZCwgdGhlIG5ld19jbHVzdGVycyBoYXMgYmVlbiBhZGRlZCB0bwotICogcmVjLT5lX2NsdXN0ZXJzLiAgSWYgdGhlIGFwcGVuZCBpcyBhbiBlbnRpcmVseSBuZXcgZXh0ZW50LCB0aGVuCi0gKiByZWMtPmVfY2x1c3RlcnMgaXMgPT0gbmV3X2NsdXN0ZXJzLgotICovCi1pbnQgb2NmczJfZXh0ZW50X21hcF9hcHBlbmQoc3RydWN0IGlub2RlICppbm9kZSwKLQkJCSAgICBzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyAqcmVjLAotCQkJICAgIHUzMiBuZXdfY2x1c3RlcnMpCi17Ci0JaW50IHJldDsKLQlzdHJ1Y3Qgb2NmczJfZXh0ZW50X21hcCAqZW0gPSAmT0NGUzJfSShpbm9kZSktPmlwX21hcDsKLQlzdHJ1Y3Qgb2NmczJfZXh0ZW50X21hcF9lbnRyeSAqZW50OwotCXN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjICpvbGQ7Ci0KLQlCVUdfT04oIW5ld19jbHVzdGVycyk7Ci0JQlVHX09OKGxlMzJfdG9fY3B1KHJlYy0+ZV9jbHVzdGVycykgPCBuZXdfY2x1c3RlcnMpOwotCi0JaWYgKGVtLT5lbV9jbHVzdGVycyA8IE9DRlMyX0koaW5vZGUpLT5pcF9jbHVzdGVycykgewotCQkvKgotCQkgKiBTaXplIGNoYW5nZWQgdW5kZXJuZWF0aCB1cyBvbiBkaXNrLiAgRHJvcCBhbnkKLQkJICogc3RyYWRkbGluZyByZWNvcmRzIGFuZCB1cGRhdGUgb3VyIGlkZWEgb2YKLQkJICogaV9jbHVzdGVycwotCQkgKi8KLQkJb2NmczJfZXh0ZW50X21hcF9kcm9wKGlub2RlLCBlbS0+ZW1fY2x1c3RlcnMgLSAxKTsKLQkJZW0tPmVtX2NsdXN0ZXJzID0gT0NGUzJfSShpbm9kZSktPmlwX2NsdXN0ZXJzOwotCX0KLQotCW1sb2dfYnVnX29uX21zZygobGUzMl90b19jcHUocmVjLT5lX2Nwb3MpICsKLQkJCSBsZTMyX3RvX2NwdShyZWMtPmVfY2x1c3RlcnMpKSAhPQotCQkJKGVtLT5lbV9jbHVzdGVycyArIG5ld19jbHVzdGVycyksCi0JCQkiSW5vZGUgJWxsdTpcbiIKLQkJCSJyZWMtPmVfY3BvcyA9ICV1ICsgcmVjLT5lX2NsdXN0ZXJzID0gJXUgPSAldVxuIgotCQkJImVtLT5lbV9jbHVzdGVycyA9ICV1ICsgbmV3X2NsdXN0ZXJzID0gJXUgPSAldVxuIiwKLQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vLAotCQkJbGUzMl90b19jcHUocmVjLT5lX2Nwb3MpLCBsZTMyX3RvX2NwdShyZWMtPmVfY2x1c3RlcnMpLAotCQkJbGUzMl90b19jcHUocmVjLT5lX2Nwb3MpICsgbGUzMl90b19jcHUocmVjLT5lX2NsdXN0ZXJzKSwKLQkJCWVtLT5lbV9jbHVzdGVycywgbmV3X2NsdXN0ZXJzLAotCQkJZW0tPmVtX2NsdXN0ZXJzICsgbmV3X2NsdXN0ZXJzKTsKLQotCWVtLT5lbV9jbHVzdGVycyArPSBuZXdfY2x1c3RlcnM7Ci0KLQlyZXQgPSAtRU5PRU5UOwotCWlmIChsZTMyX3RvX2NwdShyZWMtPmVfY2x1c3RlcnMpID4gbmV3X2NsdXN0ZXJzKSB7Ci0JCS8qIFRoaXMgaXMgYSBjb250aWd1b3VzIGFwcGVuZCAqLwotCQllbnQgPSBvY2ZzMl9leHRlbnRfbWFwX2xvb2t1cChlbSwgbGUzMl90b19jcHUocmVjLT5lX2Nwb3MpLCAxLAotCQkJCQkgICAgICBOVUxMLCBOVUxMKTsKLQkJaWYgKGVudCkgewotCQkJb2xkID0gJmVudC0+ZV9yZWM7Ci0JCQlCVUdfT04oKGxlMzJfdG9fY3B1KHJlYy0+ZV9jcG9zKSArCi0JCQkJbGUzMl90b19jcHUocmVjLT5lX2NsdXN0ZXJzKSkgIT0KLQkJCQkgKGxlMzJfdG9fY3B1KG9sZC0+ZV9jcG9zKSArCi0JCQkJICBsZTMyX3RvX2NwdShvbGQtPmVfY2x1c3RlcnMpICsKLQkJCQkgIG5ld19jbHVzdGVycykpOwotCQkJaWYgKGVudC0+ZV90cmVlX2RlcHRoID09IDApIHsKLQkJCQlCVUdfT04obGUzMl90b19jcHUob2xkLT5lX2Nwb3MpICE9Ci0JCQkJICAgICAgIGxlMzJfdG9fY3B1KHJlYy0+ZV9jcG9zKSk7Ci0JCQkJQlVHX09OKGxlNjRfdG9fY3B1KG9sZC0+ZV9ibGtubykgIT0KLQkJCQkgICAgICAgbGU2NF90b19jcHUocmVjLT5lX2Jsa25vKSk7Ci0JCQkJcmV0ID0gMDsKLQkJCX0KLQkJCS8qCi0JCQkgKiBMZXQgbm9uLWxlYWZzIGZhbGwgdGhyb3VnaCBhcyAtRU5PRU5UIHRvCi0JCQkgKiBmb3JjZSBpbnNlcnRpb24gb2YgdGhlIG5ldyBsZWFmLgotCQkJICovCi0JCQlsZTMyX2FkZF9jcHUoJm9sZC0+ZV9jbHVzdGVycywgbmV3X2NsdXN0ZXJzKTsKLQkJfQotCX0KLQotCWlmIChyZXQgPT0gLUVOT0VOVCkKLQkJcmV0ID0gb2NmczJfZXh0ZW50X21hcF9pbnNlcnQoaW5vZGUsIHJlYywgMCk7Ci0JaWYgKHJldCA8IDApCi0JCW1sb2dfZXJybm8ocmV0KTsKLQlyZXR1cm4gcmV0OwotfQotCi0jaWYgMAotLyogQ29kZSBoZXJlIGlzIGluY2x1ZGVkIGJ1dCBkZWZpbmVkIG91dCBhcyBpdCBjb21wbGV0ZXMgdGhlIGV4dGVudAotICogbWFwIGFwaSBhbmQgbWF5IGJlIHVzZWQgaW4gdGhlIGZ1dHVyZS4gKi8KLQotLyoKLSAqIExvb2sgdXAgdGhlIHJlY29yZCBjb250YWluaW5nIHRoaXMgY2x1c3RlciBvZmZzZXQuICBUaGlzIHJlY29yZCBpcwotICogcGFydCBvZiB0aGUgZXh0ZW50IG1hcC4gIERvIG5vdCBmcmVlIGl0LiAgQW55IGNoYW5nZXMgeW91IG1ha2UgdG8KLSAqIGl0IHdpbGwgcmVmbGVjdCBpbiB0aGUgZXh0ZW50IG1hcC4gIFNvLCBpZiB5b3VyIGxhc3QgZXh0ZW50Ci0gKiBpcyAoY3BvcyA9IDEwLCBjbHVzdGVycyA9IDEwKSBhbmQgeW91IHRydW5jYXRlIHRoZSBmaWxlIGJ5IDUKLSAqIGNsdXN0ZXJzLCB5b3UgY2FuIGRvOgotICoKLSAqIHJldCA9IG9jZnMyX2V4dGVudF9tYXBfZ2V0X3JlYyhlbSwgb3JpZ19zaXplIC0gNSwgJnJlYyk7Ci0gKiByZWMtPmVfY2x1c3RlcnMgLT0gNTsKLSAqCi0gKiBUaGUgbG9va3VwIGRvZXMgbm90IHJlYWQgZnJvbSBkaXNrLiAgSWYgdGhlIG1hcCBpc24ndCBmaWxsZWQgaW4gZm9yCi0gKiBhbiBlbnRyeSwgeW91IHdvbid0IGZpbmQgaXQuCi0gKgotICogQWxzbyBub3RlIHRoYXQgdGhlIHJldHVybmVkIHJlY29yZCBpcyB2YWxpZCB1bnRpbCBhbGxvY19zZW0gaXMKLSAqIGRyb3BwZWQuICBBZnRlciB0aGF0LCB0cnVuY2F0ZSBhbmQgZXh0ZW5kIGNhbiBoYXBwZW4uICBDYXZlYXQgRW1wdG9yLgotICovCi1pbnQgb2NmczJfZXh0ZW50X21hcF9nZXRfcmVjKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHUzMiBjcG9zLAotCQkJICAgICBzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyAqKnJlYywKLQkJCSAgICAgaW50ICp0cmVlX2RlcHRoKQotewotCWludCByZXQgPSAtRU5PRU5UOwotCXN0cnVjdCBvY2ZzMl9leHRlbnRfbWFwICplbSA9ICZPQ0ZTMl9JKGlub2RlKS0+aXBfbWFwOwotCXN0cnVjdCBvY2ZzMl9leHRlbnRfbWFwX2VudHJ5ICplbnQ7Ci0KLQkqcmVjID0gTlVMTDsKLQotCWlmIChjcG9zID49IE9DRlMyX0koaW5vZGUpLT5pcF9jbHVzdGVycykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoY3BvcyA+PSBlbS0+ZW1fY2x1c3RlcnMpIHsKLQkJLyoKLQkJICogU2l6ZSBjaGFuZ2VkIHVuZGVybmVhdGggdXMgb24gZGlzay4gIERyb3AgYW55Ci0JCSAqIHN0cmFkZGxpbmcgcmVjb3JkcyBhbmQgdXBkYXRlIG91ciBpZGVhIG9mCi0JCSAqIGlfY2x1c3RlcnMKLQkJICovCi0JCW9jZnMyX2V4dGVudF9tYXBfZHJvcChpbm9kZSwgZW0tPmVtX2NsdXN0ZXJzIC0gMSk7Ci0JCWVtLT5lbV9jbHVzdGVycyA9IE9DRlMyX0koaW5vZGUpLT5pcF9jbHVzdGVycyA7Ci0JfQotCi0JZW50ID0gb2NmczJfZXh0ZW50X21hcF9sb29rdXAoJk9DRlMyX0koaW5vZGUpLT5pcF9tYXAsIGNwb3MsIDEsCi0JCQkJICAgICAgTlVMTCwgTlVMTCk7Ci0KLQlpZiAoZW50KSB7Ci0JCSpyZWMgPSAmZW50LT5lX3JlYzsKLQkJaWYgKHRyZWVfZGVwdGgpCi0JCQkqdHJlZV9kZXB0aCA9IGVudC0+ZV90cmVlX2RlcHRoOwotCQlyZXQgPSAwOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLWludCBvY2ZzMl9leHRlbnRfbWFwX2dldF9jbHVzdGVycyhzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJCSAgdTMyIHZfY3BvcywgaW50IGNvdW50LAotCQkJCSAgdTMyICpwX2Nwb3MsIGludCAqcmV0X2NvdW50KQotewotCWludCByZXQ7Ci0JdTMyIGNvZmYsIGNjb3VudDsKLQlzdHJ1Y3Qgb2NmczJfZXh0ZW50X21hcCAqZW0gPSAmT0NGUzJfSShpbm9kZSktPmlwX21hcDsKLQlzdHJ1Y3Qgb2NmczJfZXh0ZW50X21hcF9lbnRyeSAqZW50ID0gTlVMTDsKLQotCSpwX2Nwb3MgPSBjY291bnQgPSAwOwotCi0JaWYgKCh2X2Nwb3MgKyBjb3VudCkgPiBPQ0ZTMl9JKGlub2RlKS0+aXBfY2x1c3RlcnMpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKCh2X2Nwb3MgKyBjb3VudCkgPiBlbS0+ZW1fY2x1c3RlcnMpIHsKLQkJLyoKLQkJICogU2l6ZSBjaGFuZ2VkIHVuZGVybmVhdGggdXMgb24gZGlzay4gIERyb3AgYW55Ci0JCSAqIHN0cmFkZGxpbmcgcmVjb3JkcyBhbmQgdXBkYXRlIG91ciBpZGVhIG9mCi0JCSAqIGlfY2x1c3RlcnMKLQkJICovCi0JCW9jZnMyX2V4dGVudF9tYXBfZHJvcChpbm9kZSwgZW0tPmVtX2NsdXN0ZXJzIC0gMSk7Ci0JCWVtLT5lbV9jbHVzdGVycyA9IE9DRlMyX0koaW5vZGUpLT5pcF9jbHVzdGVyczsKLQl9Ci0KLQotCXJldCA9IG9jZnMyX2V4dGVudF9tYXBfbG9va3VwX3JlYWQoaW5vZGUsIHZfY3BvcywgY291bnQsICZlbnQpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlpZiAoZW50KSB7Ci0JCS8qIFdlIHNob3VsZCBuZXZlciBmaW5kIG91cnNlbHZlcyBzdHJhZGRsaW5nIGFuIGludGVydmFsICovCi0JCWlmICghb2NmczJfZXh0ZW50X3JlY19jb250YWluc19jbHVzdGVycygmZW50LT5lX3JlYywKLQkJCQkJCQl2X2Nwb3MsCi0JCQkJCQkJY291bnQpKQotCQkJcmV0dXJuIC1FU1JDSDsKLQotCQljb2ZmID0gdl9jcG9zIC0gbGUzMl90b19jcHUoZW50LT5lX3JlYy5lX2Nwb3MpOwotCQkqcF9jcG9zID0gb2NmczJfYmxvY2tzX3RvX2NsdXN0ZXJzKGlub2RlLT5pX3NiLAotCQkJCWxlNjRfdG9fY3B1KGVudC0+ZV9yZWMuZV9ibGtubykpICsKLQkJCSAgY29mZjsKLQotCQlpZiAocmV0X2NvdW50KQotCQkJKnJldF9jb3VudCA9IGxlMzJfdG9fY3B1KGVudC0+ZV9yZWMuZV9jbHVzdGVycykgLSBjb2ZmOwotCi0JCXJldHVybiAwOwotCX0KLQotCi0JcmV0dXJuIC1FTk9FTlQ7Ci19Ci0KLSNlbmRpZiAgLyogIDAgICovCi0KLWludCBvY2ZzMl9leHRlbnRfbWFwX2dldF9ibG9ja3Moc3RydWN0IGlub2RlICppbm9kZSwKLQkJCQl1NjQgdl9ibGtubywgaW50IGNvdW50LAotCQkJCXU2NCAqcF9ibGtubywgaW50ICpyZXRfY291bnQpCi17Ci0JaW50IHJldDsKLQl1NjQgYm9mZjsKLQl1MzIgY3BvcywgY2x1c3RlcnM7Ci0JaW50IGJwYyA9IG9jZnMyX2NsdXN0ZXJzX3RvX2Jsb2Nrcyhpbm9kZS0+aV9zYiwgMSk7Ci0Jc3RydWN0IG9jZnMyX2V4dGVudF9tYXBfZW50cnkgKmVudCA9IE5VTEw7Ci0Jc3RydWN0IG9jZnMyX2V4dGVudF9tYXAgKmVtID0gJk9DRlMyX0koaW5vZGUpLT5pcF9tYXA7Ci0Jc3RydWN0IG9jZnMyX2V4dGVudF9yZWMgKnJlYzsKLQotCSpwX2Jsa25vID0gMDsKLQotCWNwb3MgPSBvY2ZzMl9ibG9ja3NfdG9fY2x1c3RlcnMoaW5vZGUtPmlfc2IsIHZfYmxrbm8pOwotCWNsdXN0ZXJzID0gb2NmczJfYmxvY2tzX3RvX2NsdXN0ZXJzKGlub2RlLT5pX3NiLAotCQkJCQkgICAgKHU2NCljb3VudCArIGJwYyAtIDEpOwotCWlmICgoY3BvcyArIGNsdXN0ZXJzKSA+IE9DRlMyX0koaW5vZGUpLT5pcF9jbHVzdGVycykgewotCQlyZXQgPSAtRUlOVkFMOwotCQltbG9nX2Vycm5vKHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JaWYgKChjcG9zICsgY2x1c3RlcnMpID4gZW0tPmVtX2NsdXN0ZXJzKSB7Ci0JCS8qCi0JCSAqIFNpemUgY2hhbmdlZCB1bmRlcm5lYXRoIHVzIG9uIGRpc2suICBEcm9wIGFueQotCQkgKiBzdHJhZGRsaW5nIHJlY29yZHMgYW5kIHVwZGF0ZSBvdXIgaWRlYSBvZgotCQkgKiBpX2NsdXN0ZXJzCi0JCSAqLwotCQlvY2ZzMl9leHRlbnRfbWFwX2Ryb3AoaW5vZGUsIGVtLT5lbV9jbHVzdGVycyAtIDEpOwotCQllbS0+ZW1fY2x1c3RlcnMgPSBPQ0ZTMl9JKGlub2RlKS0+aXBfY2x1c3RlcnM7Ci0JfQotCi0JcmV0ID0gb2NmczJfZXh0ZW50X21hcF9sb29rdXBfcmVhZChpbm9kZSwgY3BvcywgY2x1c3RlcnMsICZlbnQpOwotCWlmIChyZXQpIHsKLQkJbWxvZ19lcnJubyhyZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCWlmIChlbnQpCi0JewotCQlyZWMgPSAmZW50LT5lX3JlYzsKLQotCQkvKiBXZSBzaG91bGQgbmV2ZXIgZmluZCBvdXJzZWx2ZXMgc3RyYWRkbGluZyBhbiBpbnRlcnZhbCAqLwotCQlpZiAoIW9jZnMyX2V4dGVudF9yZWNfY29udGFpbnNfY2x1c3RlcnMocmVjLCBjcG9zLCBjbHVzdGVycykpIHsKLQkJCXJldCA9IC1FU1JDSDsKLQkJCW1sb2dfZXJybm8ocmV0KTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQotCQlib2ZmID0gb2NmczJfY2x1c3RlcnNfdG9fYmxvY2tzKGlub2RlLT5pX3NiLCBjcG9zIC0KLQkJCQkJCWxlMzJfdG9fY3B1KHJlYy0+ZV9jcG9zKSk7CisJaWYgKHBfY2x1c3RlcikgeworCQlib2ZmID0gb2NmczJfY2x1c3RlcnNfdG9fYmxvY2tzKGlub2RlLT5pX3NiLCBwX2NsdXN0ZXIpOwogCQlib2ZmICs9ICh2X2Jsa25vICYgKHU2NCkoYnBjIC0gMSkpOwotCQkqcF9ibGtubyA9IGxlNjRfdG9fY3B1KHJlYy0+ZV9ibGtubykgKyBib2ZmOwotCi0JCWlmIChyZXRfY291bnQpIHsKLQkJCSpyZXRfY291bnQgPSBvY2ZzMl9jbHVzdGVyc190b19ibG9ja3MoaW5vZGUtPmlfc2IsCi0JCQkJCWxlMzJfdG9fY3B1KHJlYy0+ZV9jbHVzdGVycykpIC0gYm9mZjsKLQkJfQotCi0JCXJldHVybiAwOwogCX0KIAotCXJldHVybiAtRU5PRU5UOwotfQorCSpwX2Jsa25vID0gYm9mZjsKIAotaW50IG9jZnMyX2V4dGVudF9tYXBfaW5pdChzdHJ1Y3QgaW5vZGUgKmlub2RlKQotewotCXN0cnVjdCBvY2ZzMl9leHRlbnRfbWFwICplbSA9ICZPQ0ZTMl9JKGlub2RlKS0+aXBfbWFwOwotCi0JZW0tPmVtX2V4dGVudHMgPSBSQl9ST09UOwotCWVtLT5lbV9jbHVzdGVycyA9IDA7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogTmVlZHMgdGhlIGxvY2sgKi8KLXN0YXRpYyB2b2lkIF9fb2NmczJfZXh0ZW50X21hcF9kcm9wKHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkJICAgIHUzMiBuZXdfY2x1c3RlcnMsCi0JCQkJICAgIHN0cnVjdCByYl9ub2RlICoqZnJlZV9oZWFkLAotCQkJCSAgICBzdHJ1Y3Qgb2NmczJfZXh0ZW50X21hcF9lbnRyeSAqKnRhaWxfZW50KQotewotCXN0cnVjdCByYl9ub2RlICpub2RlLCAqbmV4dDsKLQlzdHJ1Y3Qgb2NmczJfZXh0ZW50X21hcCAqZW0gPSAmT0NGUzJfSShpbm9kZSktPmlwX21hcDsKLQlzdHJ1Y3Qgb2NmczJfZXh0ZW50X21hcF9lbnRyeSAqZW50OwotCi0JKmZyZWVfaGVhZCA9IE5VTEw7Ci0KLQllbnQgPSBOVUxMOwotCW5vZGUgPSByYl9sYXN0KCZlbS0+ZW1fZXh0ZW50cyk7Ci0Jd2hpbGUgKG5vZGUpCi0JewotCQluZXh0ID0gcmJfcHJldihub2RlKTsKLQotCQllbnQgPSByYl9lbnRyeShub2RlLCBzdHJ1Y3Qgb2NmczJfZXh0ZW50X21hcF9lbnRyeSwKLQkJCSAgICAgICBlX25vZGUpOwotCQlpZiAobGUzMl90b19jcHUoZW50LT5lX3JlYy5lX2Nwb3MpIDwgbmV3X2NsdXN0ZXJzKQotCQkJYnJlYWs7Ci0KLQkJcmJfZXJhc2UoJmVudC0+ZV9ub2RlLCAmZW0tPmVtX2V4dGVudHMpOwotCi0JCW5vZGUtPnJiX3JpZ2h0ID0gKmZyZWVfaGVhZDsKLQkJKmZyZWVfaGVhZCA9IG5vZGU7Ci0KLQkJZW50ID0gTlVMTDsKLQkJbm9kZSA9IG5leHQ7CisJaWYgKHJldF9jb3VudCkgeworCQkqcmV0X2NvdW50ID0gb2NmczJfY2x1c3RlcnNfdG9fYmxvY2tzKGlub2RlLT5pX3NiLCBudW1fY2x1c3RlcnMpOworCQkqcmV0X2NvdW50IC09IHZfYmxrbm8gJiAodTY0KShicGMgLSAxKTsKIAl9CiAKLQkvKiBEbyB3ZSBoYXZlIGFuIGVudHJ5IHN0cmFkZGxpbmcgbmV3X2NsdXN0ZXJzPyAqLwotCWlmICh0YWlsX2VudCkgewotCQlpZiAoZW50ICYmCi0JCSAgICAoKGxlMzJfdG9fY3B1KGVudC0+ZV9yZWMuZV9jcG9zKSArCi0JCSAgICAgIGxlMzJfdG9fY3B1KGVudC0+ZV9yZWMuZV9jbHVzdGVycykpID4gbmV3X2NsdXN0ZXJzKSkKLQkJCSp0YWlsX2VudCA9IGVudDsKLQkJZWxzZQotCQkJKnRhaWxfZW50ID0gTlVMTDsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIF9fb2NmczJfZXh0ZW50X21hcF9kcm9wX2NsZWFudXAoc3RydWN0IHJiX25vZGUgKmZyZWVfaGVhZCkKLXsKLQlzdHJ1Y3QgcmJfbm9kZSAqbm9kZTsKLQlzdHJ1Y3Qgb2NmczJfZXh0ZW50X21hcF9lbnRyeSAqZW50OwotCi0Jd2hpbGUgKGZyZWVfaGVhZCkgewotCQlub2RlID0gZnJlZV9oZWFkOwotCQlmcmVlX2hlYWQgPSBub2RlLT5yYl9yaWdodDsKLQotCQllbnQgPSByYl9lbnRyeShub2RlLCBzdHJ1Y3Qgb2NmczJfZXh0ZW50X21hcF9lbnRyeSwKLQkJCSAgICAgICBlX25vZGUpOwotCQlrbWVtX2NhY2hlX2ZyZWUob2NmczJfZW1fZW50X2NhY2hlcCwgZW50KTsKLQl9Ci19Ci0KLS8qCi0gKiBSZW1vdmUgYWxsIGVudHJpZXMgcGFzdCBuZXdfY2x1c3RlcnMsIGluY2x1c2l2ZSBvZiBhbiBlbnRyeSB0aGF0Ci0gKiBjb250YWlucyBuZXdfY2x1c3RlcnMuICBUaGlzIGlzIGVmZmVjdGl2ZWx5IGEgY2FjaGUgZm9yZ2V0LgotICoKLSAqIElmIHlvdSB3YW50IHRvIGFsc28gY2xpcCB0aGUgbGFzdCBleHRlbnQgYnkgc29tZSBudW1iZXIgb2YgY2x1c3RlcnMsCi0gKiB5b3UgbmVlZCB0byBjYWxsIG9jZnMyX2V4dGVudF9tYXBfdHJ1bmMoKS4KLSAqIFRoaXMgY29kZSBkb2VzIG5vdCBjaGVjayBvciBtb2RpZnkgaXBfY2x1c3RlcnMuCi0gKi8KLWludCBvY2ZzMl9leHRlbnRfbWFwX2Ryb3Aoc3RydWN0IGlub2RlICppbm9kZSwgdTMyIG5ld19jbHVzdGVycykKLXsKLQlzdHJ1Y3QgcmJfbm9kZSAqZnJlZV9oZWFkID0gTlVMTDsKLQlzdHJ1Y3Qgb2NmczJfZXh0ZW50X21hcCAqZW0gPSAmT0NGUzJfSShpbm9kZSktPmlwX21hcDsKLQlzdHJ1Y3Qgb2NmczJfZXh0ZW50X21hcF9lbnRyeSAqZW50OwotCi0Jc3Bpbl9sb2NrKCZPQ0ZTMl9JKGlub2RlKS0+aXBfbG9jayk7Ci0KLQlfX29jZnMyX2V4dGVudF9tYXBfZHJvcChpbm9kZSwgbmV3X2NsdXN0ZXJzLCAmZnJlZV9oZWFkLCAmZW50KTsKLQotCWlmIChlbnQpIHsKLQkJcmJfZXJhc2UoJmVudC0+ZV9ub2RlLCAmZW0tPmVtX2V4dGVudHMpOwotCQllbnQtPmVfbm9kZS5yYl9yaWdodCA9IGZyZWVfaGVhZDsKLQkJZnJlZV9oZWFkID0gJmVudC0+ZV9ub2RlOwotCX0KLQotCXNwaW5fdW5sb2NrKCZPQ0ZTMl9JKGlub2RlKS0+aXBfbG9jayk7Ci0KLQlpZiAoZnJlZV9oZWFkKQotCQlfX29jZnMyX2V4dGVudF9tYXBfZHJvcF9jbGVhbnVwKGZyZWVfaGVhZCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIFJlbW92ZSBhbGwgZW50cmllcyBwYXN0IG5ld19jbHVzdGVycyBhbmQgYWxzbyBjbGlwIGFueSBleHRlbnQKLSAqIHN0cmFkZGxpbmcgbmV3X2NsdXN0ZXJzLCBpZiB0aGVyZSBpcyBvbmUuICBUaGlzIGRvZXMgbm90IGNoZWNrCi0gKiBvciBtb2RpZnkgaXBfY2x1c3RlcnMKLSAqLwotaW50IG9jZnMyX2V4dGVudF9tYXBfdHJ1bmMoc3RydWN0IGlub2RlICppbm9kZSwgdTMyIG5ld19jbHVzdGVycykKLXsKLQlzdHJ1Y3QgcmJfbm9kZSAqZnJlZV9oZWFkID0gTlVMTDsKLQlzdHJ1Y3Qgb2NmczJfZXh0ZW50X21hcF9lbnRyeSAqZW50ID0gTlVMTDsKLQotCXNwaW5fbG9jaygmT0NGUzJfSShpbm9kZSktPmlwX2xvY2spOwotCi0JX19vY2ZzMl9leHRlbnRfbWFwX2Ryb3AoaW5vZGUsIG5ld19jbHVzdGVycywgJmZyZWVfaGVhZCwgJmVudCk7Ci0KLQlpZiAoZW50KQotCQllbnQtPmVfcmVjLmVfY2x1c3RlcnMgPSBjcHVfdG9fbGUzMihuZXdfY2x1c3RlcnMgLQotCQkJCQkgICAgICAgbGUzMl90b19jcHUoZW50LT5lX3JlYy5lX2Nwb3MpKTsKLQotCU9DRlMyX0koaW5vZGUpLT5pcF9tYXAuZW1fY2x1c3RlcnMgPSBuZXdfY2x1c3RlcnM7Ci0KLQlzcGluX3VubG9jaygmT0NGUzJfSShpbm9kZSktPmlwX2xvY2spOwotCi0JaWYgKGZyZWVfaGVhZCkKLQkJX19vY2ZzMl9leHRlbnRfbWFwX2Ryb3BfY2xlYW51cChmcmVlX2hlYWQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBfX2luaXQgaW5pdF9vY2ZzMl9leHRlbnRfbWFwcyh2b2lkKQotewotCW9jZnMyX2VtX2VudF9jYWNoZXAgPQotCQlrbWVtX2NhY2hlX2NyZWF0ZSgib2NmczJfZW1fZW50IiwKLQkJCQkgIHNpemVvZihzdHJ1Y3Qgb2NmczJfZXh0ZW50X21hcF9lbnRyeSksCi0JCQkJICAwLCBTTEFCX0hXQ0FDSEVfQUxJR04sIE5VTEwsIE5VTEwpOwotCWlmICghb2NmczJfZW1fZW50X2NhY2hlcCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBleGl0X29jZnMyX2V4dGVudF9tYXBzKHZvaWQpCi17Ci0Ja21lbV9jYWNoZV9kZXN0cm95KG9jZnMyX2VtX2VudF9jYWNoZXApOworb3V0OgorCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9leHRlbnRfbWFwLmggYi9mcy9vY2ZzMi9leHRlbnRfbWFwLmgKaW5kZXggZmEzNzQ1ZS4uZGU5MWUzZSAxMDA2NDQKLS0tIGEvZnMvb2NmczIvZXh0ZW50X21hcC5oCisrKyBiL2ZzL29jZnMyL2V4dGVudF9tYXAuaApAQCAtMjUsMjIgKzI1LDI5IEBACiAjaWZuZGVmIF9FWFRFTlRfTUFQX0gKICNkZWZpbmUgX0VYVEVOVF9NQVBfSAogCi1pbnQgaW5pdF9vY2ZzMl9leHRlbnRfbWFwcyh2b2lkKTsKLXZvaWQgZXhpdF9vY2ZzMl9leHRlbnRfbWFwcyh2b2lkKTsKK3N0cnVjdCBvY2ZzMl9leHRlbnRfbWFwX2l0ZW0geworCXVuc2lnbmVkIGludAkJCWVpX2Nwb3M7CisJdW5zaWduZWQgaW50CQkJZWlfcGh5czsKKwl1bnNpZ25lZCBpbnQJCQllaV9jbHVzdGVyczsKKwl1bnNpZ25lZCBpbnQJCQllaV9mbGFnczsKIAotLyoKLSAqIEVWRVJZIENBTEwgaGVyZSBleGNlcHQgX2luaXQsIF90cnVuYywgYW5kIF9kcm9wIGV4cGVjdHMgYWxsb2Nfc2VtCi0gKiB0byBiZSBoZWxkLiAgVGhlIGFsbG9jYXRpb24gY2Fubm90IGNoYW5nZSBhdCBhbGwgd2hpbGUgdGhlIG1hcCBpcwotICogaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgdXBkYXRlZC4KLSAqLwotaW50IG9jZnMyX2V4dGVudF9tYXBfaW5pdChzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKLWludCBvY2ZzMl9leHRlbnRfbWFwX2FwcGVuZChzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJICAgIHN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjICpyZWMsCi0JCQkgICAgdTMyIG5ld19jbHVzdGVycyk7Ci1pbnQgb2NmczJfZXh0ZW50X21hcF9nZXRfYmxvY2tzKHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkJdTY0IHZfYmxrbm8sIGludCBjb3VudCwKLQkJCQl1NjQgKnBfYmxrbm8sIGludCAqcmV0X2NvdW50KTsKLWludCBvY2ZzMl9leHRlbnRfbWFwX2Ryb3Aoc3RydWN0IGlub2RlICppbm9kZSwgdTMyIG5ld19jbHVzdGVycyk7Ci1pbnQgb2NmczJfZXh0ZW50X21hcF90cnVuYyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1MzIgbmV3X2NsdXN0ZXJzKTsKKwlzdHJ1Y3QgbGlzdF9oZWFkCQllaV9saXN0OworfTsKKworI2RlZmluZSBPQ0ZTMl9NQVhfRVhURU5UX01BUF9JVEVNUwkJCTMKK3N0cnVjdCBvY2ZzMl9leHRlbnRfbWFwIHsKKwl1bnNpZ25lZCBpbnQJCQllbV9udW1faXRlbXM7CisJc3RydWN0IGxpc3RfaGVhZAkJZW1fbGlzdDsKK307CisKK3ZvaWQgb2NmczJfZXh0ZW50X21hcF9pbml0KHN0cnVjdCBpbm9kZSAqaW5vZGUpOwordm9pZCBvY2ZzMl9leHRlbnRfbWFwX3RydW5jKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHVuc2lnbmVkIGludCBjbHVzdGVyKTsKK3ZvaWQgb2NmczJfZXh0ZW50X21hcF9pbnNlcnRfcmVjKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJIHN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjICpyZWMpOworCitpbnQgb2NmczJfZ2V0X2NsdXN0ZXJzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHUzMiB2X2NsdXN0ZXIsIHUzMiAqcF9jbHVzdGVyLAorCQkgICAgICAgdTMyICpudW1fY2x1c3RlcnMsIHVuc2lnbmVkIGludCAqZXh0ZW50X2ZsYWdzKTsKK2ludCBvY2ZzMl9leHRlbnRfbWFwX2dldF9ibG9ja3Moc3RydWN0IGlub2RlICppbm9kZSwgdTY0IHZfYmxrbm8sIHU2NCAqcF9ibGtubywKKwkJCQl1NjQgKnJldF9jb3VudCwgdW5zaWduZWQgaW50ICpleHRlbnRfZmxhZ3MpOwogCiAjZW5kaWYgIC8qIF9FWFRFTlRfTUFQX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2ZpbGUuYyBiL2ZzL29jZnMyL2ZpbGUuYwppbmRleCBmMmNkM2JmLi41MjBhMmE2IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9maWxlLmMKKysrIGIvZnMvb2NmczIvZmlsZS5jCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9waXBlX2ZzX2kuaD4KICNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgorI2luY2x1ZGUgPGxpbnV4L3dyaXRlYmFjay5oPgogCiAjZGVmaW5lIE1MT0dfTUFTS19QUkVGSVggTUxfSU5PREUKICNpbmNsdWRlIDxjbHVzdGVyL21hc2tsb2cuaD4KQEAgLTIxNSw3ICsyMTYsNyBAQAogCiAJbWxvZ19lbnRyeV92b2lkKCk7CiAJaV9zaXplX3dyaXRlKGlub2RlLCBuZXdfaV9zaXplKTsKLQlpbm9kZS0+aV9ibG9ja3MgPSBvY2ZzMl9hbGlnbl9ieXRlc190b19zZWN0b3JzKG5ld19pX3NpemUpOworCWlub2RlLT5pX2Jsb2NrcyA9IG9jZnMyX2lub2RlX3NlY3Rvcl9jb3VudChpbm9kZSk7CiAJaW5vZGUtPmlfY3RpbWUgPSBpbm9kZS0+aV9tdGltZSA9IENVUlJFTlRfVElNRTsKIAogCXN0YXR1cyA9IG9jZnMyX21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSwgZmVfYmgpOwpAQCAtMjYxLDYgKzI2Miw3IEBACiB7CiAJaW50IHN0YXR1czsKIAloYW5kbGVfdCAqaGFuZGxlOworCXN0cnVjdCBvY2ZzMl9kaW5vZGUgKmRpOwogCiAJbWxvZ19lbnRyeV92b2lkKCk7CiAKQEAgLTI3NCwxMiArMjc2LDM5IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCXN0YXR1cyA9IG9jZnMyX3NldF9pbm9kZV9zaXplKGhhbmRsZSwgaW5vZGUsIGZlX2JoLCBuZXdfaV9zaXplKTsKKwlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCBmZV9iaCwKKwkJCQkgICAgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJbWxvZ19lcnJubyhzdGF0dXMpOworCQlnb3RvIG91dF9jb21taXQ7CisJfQorCisJLyoKKwkgKiBEbyB0aGlzIGJlZm9yZSBzZXR0aW5nIGlfc2l6ZS4KKwkgKi8KKwlzdGF0dXMgPSBvY2ZzMl96ZXJvX3RhaWxfZm9yX3RydW5jYXRlKGlub2RlLCBoYW5kbGUsIG5ld19pX3NpemUpOworCWlmIChzdGF0dXMpIHsKKwkJbWxvZ19lcnJubyhzdGF0dXMpOworCQlnb3RvIG91dF9jb21taXQ7CisJfQorCisJaV9zaXplX3dyaXRlKGlub2RlLCBuZXdfaV9zaXplKTsKKwlpbm9kZS0+aV9ibG9ja3MgPSBvY2ZzMl9hbGlnbl9ieXRlc190b19zZWN0b3JzKG5ld19pX3NpemUpOworCWlub2RlLT5pX2N0aW1lID0gaW5vZGUtPmlfbXRpbWUgPSBDVVJSRU5UX1RJTUU7CisKKwlkaSA9IChzdHJ1Y3Qgb2NmczJfZGlub2RlICopIGZlX2JoLT5iX2RhdGE7CisJZGktPmlfc2l6ZSA9IGNwdV90b19sZTY0KG5ld19pX3NpemUpOworCWRpLT5pX2N0aW1lID0gZGktPmlfbXRpbWUgPSBjcHVfdG9fbGU2NChpbm9kZS0+aV9jdGltZS50dl9zZWMpOworCWRpLT5pX2N0aW1lX25zZWMgPSBkaS0+aV9tdGltZV9uc2VjID0gY3B1X3RvX2xlMzIoaW5vZGUtPmlfY3RpbWUudHZfbnNlYyk7CisKKwlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgZmVfYmgpOwogCWlmIChzdGF0dXMgPCAwKQogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAKK291dF9jb21taXQ6CiAJb2NmczJfY29tbWl0X3RyYW5zKG9zYiwgaGFuZGxlKTsKIG91dDoKKwogCW1sb2dfZXhpdChzdGF0dXMpOwogCXJldHVybiBzdGF0dXM7CiB9CkBAIC0zNDIsMTkgKzM3MSw2IEBACiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJZ290byBiYWlsOwogCX0KLQlvY2ZzMl9kYXRhX3VubG9jayhpbm9kZSwgMSk7Ci0KLQlpZiAobGUzMl90b19jcHUoZmUtPmlfY2x1c3RlcnMpID09Ci0JICAgIG9jZnMyX2NsdXN0ZXJzX2Zvcl9ieXRlcyhvc2ItPnNiLCBuZXdfaV9zaXplKSkgewotCQltbG9nKDAsICJmZS0+aV9jbHVzdGVycyA9ICV1LCBzbyB3ZSBkbyBhIHNpbXBsZSB0cnVuY2F0ZVxuIiwKLQkJICAgICBmZS0+aV9jbHVzdGVycyk7Ci0JCS8qIE5vIGFsbG9jYXRpb24gY2hhbmdlIGlzIHJlcXVpcmVkLCBzbyBsZXRzIGZhc3QgcGF0aAotCQkgKiB0aGlzIHRydW5jYXRlLiAqLwotCQlzdGF0dXMgPSBvY2ZzMl9zaW1wbGVfc2l6ZV91cGRhdGUoaW5vZGUsIGRpX2JoLCBuZXdfaV9zaXplKTsKLQkJaWYgKHN0YXR1cyA8IDApCi0JCQltbG9nX2Vycm5vKHN0YXR1cyk7Ci0JCWdvdG8gYmFpbDsKLQl9CiAKIAkvKiBhbHJpZ2h0LCB3ZSdyZSBnb2luZyB0byBuZWVkIHRvIGRvIGEgZnVsbCBibG93biBhbGxvYyBzaXplCiAJICogY2hhbmdlLiBPcnBoYW4gdGhlIGlub2RlIHNvIHRoYXQgcmVjb3ZlcnkgY2FuIGNvbXBsZXRlIHRoZQpAQCAtMzYzLDIyICszNzksMjUgQEAKIAlzdGF0dXMgPSBvY2ZzMl9vcnBoYW5fZm9yX3RydW5jYXRlKG9zYiwgaW5vZGUsIGRpX2JoLCBuZXdfaV9zaXplKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQltbG9nX2Vycm5vKHN0YXR1cyk7Ci0JCWdvdG8gYmFpbDsKKwkJZ290byBiYWlsX3VubG9ja19kYXRhOwogCX0KIAogCXN0YXR1cyA9IG9jZnMyX3ByZXBhcmVfdHJ1bmNhdGUob3NiLCBpbm9kZSwgZGlfYmgsICZ0Yyk7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwotCQlnb3RvIGJhaWw7CisJCWdvdG8gYmFpbF91bmxvY2tfZGF0YTsKIAl9CiAKIAlzdGF0dXMgPSBvY2ZzMl9jb21taXRfdHJ1bmNhdGUob3NiLCBpbm9kZSwgZGlfYmgsIHRjKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQltbG9nX2Vycm5vKHN0YXR1cyk7Ci0JCWdvdG8gYmFpbDsKKwkJZ290byBiYWlsX3VubG9ja19kYXRhOwogCX0KIAogCS8qIFRPRE86IG9ycGhhbiBkaXIgY2xlYW51cCBoZXJlLiAqLworYmFpbF91bmxvY2tfZGF0YToKKwlvY2ZzMl9kYXRhX3VubG9jayhpbm9kZSwgMSk7CisKIGJhaWw6CiAKIAltbG9nX2V4aXQoc3RhdHVzKTsKQEAgLTM5Nyw2ICs0MTYsNyBAQAogICovCiBpbnQgb2NmczJfZG9fZXh0ZW5kX2FsbG9jYXRpb24oc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCiAJCQkgICAgICAgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCSAgICAgICB1MzIgKmxvZ2ljYWxfb2Zmc2V0LAogCQkJICAgICAgIHUzMiBjbHVzdGVyc190b19hZGQsCiAJCQkgICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpmZV9iaCwKIAkJCSAgICAgICBoYW5kbGVfdCAqaGFuZGxlLApAQCAtNDYwLDE4ICs0ODAsMTQgQEAKIAlibG9jayA9IG9jZnMyX2NsdXN0ZXJzX3RvX2Jsb2Nrcyhvc2ItPnNiLCBiaXRfb2ZmKTsKIAltbG9nKDAsICJBbGxvY2F0aW5nICV1IGNsdXN0ZXJzIGF0IGJsb2NrICV1IGZvciBpbm9kZSAlbGx1XG4iLAogCSAgICAgbnVtX2JpdHMsIGJpdF9vZmYsICh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vKTsKLQlzdGF0dXMgPSBvY2ZzMl9pbnNlcnRfZXh0ZW50KG9zYiwgaGFuZGxlLCBpbm9kZSwgZmVfYmgsIGJsb2NrLAotCQkJCSAgICAgbnVtX2JpdHMsIG1ldGFfYWMpOworCXN0YXR1cyA9IG9jZnMyX2luc2VydF9leHRlbnQob3NiLCBoYW5kbGUsIGlub2RlLCBmZV9iaCwKKwkJCQkgICAgICpsb2dpY2FsX29mZnNldCwgYmxvY2ssIG51bV9iaXRzLAorCQkJCSAgICAgbWV0YV9hYyk7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQlnb3RvIGxlYXZlOwogCX0KIAotCWxlMzJfYWRkX2NwdSgmZmUtPmlfY2x1c3RlcnMsIG51bV9iaXRzKTsKLQlzcGluX2xvY2soJk9DRlMyX0koaW5vZGUpLT5pcF9sb2NrKTsKLQlPQ0ZTMl9JKGlub2RlKS0+aXBfY2x1c3RlcnMgPSBsZTMyX3RvX2NwdShmZS0+aV9jbHVzdGVycyk7Ci0Jc3Bpbl91bmxvY2soJk9DRlMyX0koaW5vZGUpLT5pcF9sb2NrKTsKLQogCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCBmZV9iaCk7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwpAQCAtNDc5LDYgKzQ5NSw3IEBACiAJfQogCiAJY2x1c3RlcnNfdG9fYWRkIC09IG51bV9iaXRzOworCSpsb2dpY2FsX29mZnNldCArPSBudW1fYml0czsKIAogCWlmIChjbHVzdGVyc190b19hZGQpIHsKIAkJbWxvZygwLCAibmVlZCB0byBhbGxvYyBvbmNlIG1vcmUsIGNsdXN0ZXJzID0gJXUsIHdhbnRlZCA9ICIKQEAgLTQ5NCwxNCArNTExLDg3IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAorLyoKKyAqIEZvciBhIGdpdmVuIGFsbG9jYXRpb24sIGRldGVybWluZSB3aGljaCBhbGxvY2F0b3JzIHdpbGwgbmVlZCB0byBiZQorICogYWNjZXNzZWQsIGFuZCBsb2NrIHRoZW0sIHJlc2VydmluZyB0aGUgYXBwcm9wcmlhdGUgbnVtYmVyIG9mIGJpdHMuCisgKgorICogQ2FsbGVkIGZyb20gb2NmczJfZXh0ZW5kX2FsbG9jYXRpb24oKSBmb3IgZmlsZSBzeXN0ZW1zIHdoaWNoIGRvbid0CisgKiBzdXBwb3J0IGhvbGVzLCBhbmQgZnJvbSBvY2ZzMl93cml0ZSgpIGZvciBmaWxlIHN5c3RlbXMgd2hpY2gKKyAqIHVuZGVyc3RhbmQgc3BhcnNlIGlub2Rlcy4KKyAqLworaW50IG9jZnMyX2xvY2tfYWxsb2NhdG9ycyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaSwKKwkJCSAgdTMyIGNsdXN0ZXJzX3RvX2FkZCwKKwkJCSAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKipkYXRhX2FjLAorCQkJICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqKm1ldGFfYWMpCit7CisJaW50IHJldCwgbnVtX2ZyZWVfZXh0ZW50czsKKwlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKTsKKworCSptZXRhX2FjID0gTlVMTDsKKwkqZGF0YV9hYyA9IE5VTEw7CisKKwltbG9nKDAsICJleHRlbmQgaW5vZGUgJWxsdSwgaV9zaXplID0gJWxsZCwgZGktPmlfY2x1c3RlcnMgPSAldSwgIgorCSAgICAgImNsdXN0ZXJzX3RvX2FkZCA9ICV1XG4iLAorCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8sIGlfc2l6ZV9yZWFkKGlub2RlKSwKKwkgICAgIGxlMzJfdG9fY3B1KGRpLT5pX2NsdXN0ZXJzKSwgY2x1c3RlcnNfdG9fYWRkKTsKKworCW51bV9mcmVlX2V4dGVudHMgPSBvY2ZzMl9udW1fZnJlZV9leHRlbnRzKG9zYiwgaW5vZGUsIGRpKTsKKwlpZiAobnVtX2ZyZWVfZXh0ZW50cyA8IDApIHsKKwkJcmV0ID0gbnVtX2ZyZWVfZXh0ZW50czsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqIFNwYXJzZSBhbGxvY2F0aW9uIGZpbGUgc3lzdGVtcyBuZWVkIHRvIGJlIG1vcmUgY29uc2VydmF0aXZlCisJICogd2l0aCByZXNlcnZpbmcgcm9vbSBmb3IgZXhwYW5zaW9uIC0gdGhlIGFjdHVhbCBhbGxvY2F0aW9uCisJICogaGFwcGVucyB3aGlsZSB3ZSd2ZSBnb3QgYSBqb3VybmFsIGhhbmRsZSBvcGVuIHNvIHJlLXRha2luZworCSAqIGEgY2x1c3RlciBsb2NrIChiZWNhdXNlIHdlIHJhbiBvdXQgb2Ygcm9vbSBmb3IgYW5vdGhlcgorCSAqIGV4dGVudCkgd2lsbCB2aW9sYXRlIG9yZGVyaW5nIHJ1bGVzLgorCSAqCisJICogTW9zdCBvZiB0aGUgdGltZSB3ZSdsbCBvbmx5IGJlIHNlZWluZyB0aGlzIDEgY2x1c3RlciBhdCBhIHRpbWUKKwkgKiBhbnl3YXkuCisJICovCisJaWYgKCFudW1fZnJlZV9leHRlbnRzIHx8CisJICAgIChvY2ZzMl9zcGFyc2VfYWxsb2Mob3NiKSAmJiBudW1fZnJlZV9leHRlbnRzIDwgY2x1c3RlcnNfdG9fYWRkKSkgeworCQlyZXQgPSBvY2ZzMl9yZXNlcnZlX25ld19tZXRhZGF0YShvc2IsIGRpLCBtZXRhX2FjKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWlmIChyZXQgIT0gLUVOT1NQQykKKwkJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCXJldCA9IG9jZnMyX3Jlc2VydmVfY2x1c3RlcnMob3NiLCBjbHVzdGVyc190b19hZGQsIGRhdGFfYWMpOworCWlmIChyZXQgPCAwKSB7CisJCWlmIChyZXQgIT0gLUVOT1NQQykKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCitvdXQ6CisJaWYgKHJldCkgeworCQlpZiAoKm1ldGFfYWMpIHsKKwkJCW9jZnMyX2ZyZWVfYWxsb2NfY29udGV4dCgqbWV0YV9hYyk7CisJCQkqbWV0YV9hYyA9IE5VTEw7CisJCX0KKworCQkvKgorCQkgKiBXZSBjYW5ub3QgaGF2ZSBhbiBlcnJvciBhbmQgYSBub24gbnVsbCAqZGF0YV9hYy4KKwkJICovCisJfQorCisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIGludCBvY2ZzMl9leHRlbmRfYWxsb2NhdGlvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJCSAgIHUzMiBjbHVzdGVyc190b19hZGQpCiB7CiAJaW50IHN0YXR1cyA9IDA7CiAJaW50IHJlc3RhcnRfZnVuYyA9IDA7CiAJaW50IGRyb3BfYWxsb2Nfc2VtID0gMDsKLQlpbnQgY3JlZGl0cywgbnVtX2ZyZWVfZXh0ZW50czsKLQl1MzIgcHJldl9jbHVzdGVyczsKKwlpbnQgY3JlZGl0czsKKwl1MzIgcHJldl9jbHVzdGVycywgbG9naWNhbF9zdGFydDsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKIAlzdHJ1Y3Qgb2NmczJfZGlub2RlICpmZSA9IE5VTEw7CiAJaGFuZGxlX3QgKmhhbmRsZSA9IE5VTEw7CkBAIC01MTIsNiArNjAyLDEyIEBACiAKIAltbG9nX2VudHJ5KCIoY2x1c3RlcnNfdG9fYWRkID0gJXUpXG4iLCBjbHVzdGVyc190b19hZGQpOwogCisJLyoKKwkgKiBUaGlzIGZ1bmN0aW9uIG9ubHkgZXhpc3RzIGZvciBmaWxlIHN5c3RlbXMgd2hpY2ggZG9uJ3QKKwkgKiBzdXBwb3J0IGhvbGVzLgorCSAqLworCUJVR19PTihvY2ZzMl9zcGFyc2VfYWxsb2Mob3NiKSk7CisKIAlzdGF0dXMgPSBvY2ZzMl9yZWFkX2Jsb2NrKG9zYiwgT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vLCAmYmgsCiAJCQkJICBPQ0ZTMl9CSF9DQUNIRUQsIGlub2RlKTsKIAlpZiAoc3RhdHVzIDwgMCkgewpAQCAtNTI2LDM5ICs2MjIsMTEgQEAKIAkJZ290byBsZWF2ZTsKIAl9CiAKKwlsb2dpY2FsX3N0YXJ0ID0gT0NGUzJfSShpbm9kZSktPmlwX2NsdXN0ZXJzOworCiByZXN0YXJ0X2FsbDoKIAlCVUdfT04obGUzMl90b19jcHUoZmUtPmlfY2x1c3RlcnMpICE9IE9DRlMyX0koaW5vZGUpLT5pcF9jbHVzdGVycyk7CiAKLQltbG9nKDAsICJleHRlbmQgaW5vZGUgJWxsdSwgaV9zaXplID0gJWxsZCwgZmUtPmlfY2x1c3RlcnMgPSAldSwgIgotCSAgICAgImNsdXN0ZXJzX3RvX2FkZCA9ICV1XG4iLAotCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8sIGlfc2l6ZV9yZWFkKGlub2RlKSwKLQkgICAgIGZlLT5pX2NsdXN0ZXJzLCBjbHVzdGVyc190b19hZGQpOwotCi0JbnVtX2ZyZWVfZXh0ZW50cyA9IG9jZnMyX251bV9mcmVlX2V4dGVudHMob3NiLAotCQkJCQkJICBpbm9kZSwKLQkJCQkJCSAgZmUpOwotCWlmIChudW1fZnJlZV9leHRlbnRzIDwgMCkgewotCQlzdGF0dXMgPSBudW1fZnJlZV9leHRlbnRzOwotCQltbG9nX2Vycm5vKHN0YXR1cyk7Ci0JCWdvdG8gbGVhdmU7Ci0JfQotCi0JaWYgKCFudW1fZnJlZV9leHRlbnRzKSB7Ci0JCXN0YXR1cyA9IG9jZnMyX3Jlc2VydmVfbmV3X21ldGFkYXRhKG9zYiwgZmUsICZtZXRhX2FjKTsKLQkJaWYgKHN0YXR1cyA8IDApIHsKLQkJCWlmIChzdGF0dXMgIT0gLUVOT1NQQykKLQkJCQltbG9nX2Vycm5vKHN0YXR1cyk7Ci0JCQlnb3RvIGxlYXZlOwotCQl9Ci0JfQotCi0Jc3RhdHVzID0gb2NmczJfcmVzZXJ2ZV9jbHVzdGVycyhvc2IsIGNsdXN0ZXJzX3RvX2FkZCwgJmRhdGFfYWMpOwotCWlmIChzdGF0dXMgPCAwKSB7Ci0JCWlmIChzdGF0dXMgIT0gLUVOT1NQQykKLQkJCW1sb2dfZXJybm8oc3RhdHVzKTsKLQkJZ290byBsZWF2ZTsKLQl9Ci0KIAkvKiBibG9ja3MgcGVvcGUgaW4gcmVhZC93cml0ZSBmcm9tIHJlYWRpbmcgb3VyIGFsbG9jYXRpb24KIAkgKiB1bnRpbCB3ZSdyZSBkb25lIGNoYW5naW5nIGl0LiBXZSBkZXBlbmQgb24gaV9tdXRleCB0byBibG9jawogCSAqIG90aGVyIGV4dGVuZC90cnVuY2F0ZSBjYWxscyB3aGlsZSB3ZSdyZSBoZXJlLiBPcmRlcmluZyB3cnQKQEAgLTU2Niw2ICs2MzQsMTMgQEAKIAlkb3duX3dyaXRlKCZPQ0ZTMl9JKGlub2RlKS0+aXBfYWxsb2Nfc2VtKTsKIAlkcm9wX2FsbG9jX3NlbSA9IDE7CiAKKwlzdGF0dXMgPSBvY2ZzMl9sb2NrX2FsbG9jYXRvcnMoaW5vZGUsIGZlLCBjbHVzdGVyc190b19hZGQsICZkYXRhX2FjLAorCQkJCSAgICAgICAmbWV0YV9hYyk7CisJaWYgKHN0YXR1cykgeworCQltbG9nX2Vycm5vKHN0YXR1cyk7CisJCWdvdG8gbGVhdmU7CisJfQorCiAJY3JlZGl0cyA9IG9jZnMyX2NhbGNfZXh0ZW5kX2NyZWRpdHMob3NiLT5zYiwgZmUsIGNsdXN0ZXJzX3RvX2FkZCk7CiAJaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBjcmVkaXRzKTsKIAlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKQEAgLTU5MCw2ICs2NjUsNyBAQAogCiAJc3RhdHVzID0gb2NmczJfZG9fZXh0ZW5kX2FsbG9jYXRpb24ob3NiLAogCQkJCQkgICAgaW5vZGUsCisJCQkJCSAgICAmbG9naWNhbF9zdGFydCwKIAkJCQkJICAgIGNsdXN0ZXJzX3RvX2FkZCwKIAkJCQkJICAgIGJoLAogCQkJCQkgICAgaGFuZGxlLApAQCAtNzc4LDcgKzg1NCw3IEBACiAJCQkgICAgIHNpemVfdCB0YWlsX3RvX3NraXApCiB7CiAJaW50IHJldCA9IDA7Ci0JdTMyIGNsdXN0ZXJzX3RvX2FkZDsKKwl1MzIgY2x1c3RlcnNfdG9fYWRkID0gMDsKIAogCUJVR19PTighdGFpbF90b19za2lwICYmICFkaV9iaCk7CiAKQEAgLTc5MCw2ICs4NjYsMTEgQEAKICAgCQlnb3RvIG91dDsKIAlCVUdfT04obmV3X2lfc2l6ZSA8IGlfc2l6ZV9yZWFkKGlub2RlKSk7CiAKKwlpZiAob2NmczJfc3BhcnNlX2FsbG9jKE9DRlMyX1NCKGlub2RlLT5pX3NiKSkpIHsKKwkJQlVHX09OKHRhaWxfdG9fc2tpcCAhPSAwKTsKKwkJZ290byBvdXRfdXBkYXRlX3NpemU7CisJfQorCiAJY2x1c3RlcnNfdG9fYWRkID0gb2NmczJfY2x1c3RlcnNfZm9yX2J5dGVzKGlub2RlLT5pX3NiLCBuZXdfaV9zaXplKSAtIAogCQlPQ0ZTMl9JKGlub2RlKS0+aXBfY2x1c3RlcnM7CiAKQEAgLTgyNSw2ICs5MDYsNyBAQAogCQlnb3RvIG91dF91bmxvY2s7CiAJfQogCitvdXRfdXBkYXRlX3NpemU6CiAJaWYgKCF0YWlsX3RvX3NraXApIHsKIAkJLyogV2UncmUgYmVpbmcgY2FsbGVkIGZyb20gb2NmczJfc2V0YXR0cigpIHdoaWNoIHdhbnRzCiAJCSAqIHVzIHRvIHVwZGF0ZSBpX3NpemUgKi8KQEAgLTgzNCw3ICs5MTYsOCBAQAogCX0KIAogb3V0X3VubG9jazoKLQlvY2ZzMl9kYXRhX3VubG9jayhpbm9kZSwgMSk7CisJaWYgKCFvY2ZzMl9zcGFyc2VfYWxsb2MoT0NGUzJfU0IoaW5vZGUtPmlfc2IpKSkKKwkJb2NmczJfZGF0YV91bmxvY2soaW5vZGUsIDEpOwogCiBvdXQ6CiAJcmV0dXJuIHJldDsKQEAgLTk3Miw3ICsxMDU1LDggQEAKIAogCXJldCA9IG9jZnMyX21ldGFfbG9jayhpbm9kZSwgTlVMTCwgMCk7CiAJaWYgKHJldCkgewotCQltbG9nX2Vycm5vKHJldCk7CisJCWlmIChyZXQgIT0gLUVOT0VOVCkKKwkJCW1sb2dfZXJybm8ocmV0KTsKIAkJZ290byBvdXQ7CiAJfQogCkBAIC0xMDM1LDEwICsxMTE5LDQ5IEBACiAJcmV0dXJuIHJldDsKIH0KIAorLyoKKyAqIFdpbGwgbG9vayBmb3IgaG9sZXMgYW5kIHVud3JpdHRlbiBleHRlbnRzIGluIHRoZSByYW5nZSBzdGFydGluZyBhdAorICogcG9zIGZvciBjb3VudCBieXRlcyAoaW5jbHVzaXZlKS4KKyAqLworc3RhdGljIGludCBvY2ZzMl9jaGVja19yYW5nZV9mb3JfaG9sZXMoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IHBvcywKKwkJCQkgICAgICAgc2l6ZV90IGNvdW50KQoreworCWludCByZXQgPSAwOworCXVuc2lnbmVkIGludCBleHRlbnRfZmxhZ3M7CisJdTMyIGNwb3MsIGNsdXN0ZXJzLCBleHRlbnRfbGVuLCBwaHlzX2Nwb3M7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCisJY3BvcyA9IHBvcyA+PiBPQ0ZTMl9TQihzYiktPnNfY2x1c3RlcnNpemVfYml0czsKKwljbHVzdGVycyA9IG9jZnMyX2NsdXN0ZXJzX2Zvcl9ieXRlcyhzYiwgcG9zICsgY291bnQpIC0gY3BvczsKKworCXdoaWxlIChjbHVzdGVycykgeworCQlyZXQgPSBvY2ZzMl9nZXRfY2x1c3RlcnMoaW5vZGUsIGNwb3MsICZwaHlzX2Nwb3MsICZleHRlbnRfbGVuLAorCQkJCQkgJmV4dGVudF9mbGFncyk7CisJCWlmIChyZXQgPCAwKSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlmIChwaHlzX2Nwb3MgPT0gMCB8fCAoZXh0ZW50X2ZsYWdzICYgT0NGUzJfRVhUX1VOV1JJVFRFTikpIHsKKwkJCXJldCA9IDE7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChleHRlbnRfbGVuID4gY2x1c3RlcnMpCisJCQlleHRlbnRfbGVuID0gY2x1c3RlcnM7CisKKwkJY2x1c3RlcnMgLT0gZXh0ZW50X2xlbjsKKwkJY3BvcyArPSBleHRlbnRfbGVuOworCX0KK291dDoKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgaW50IG9jZnMyX3ByZXBhcmVfaW5vZGVfZm9yX3dyaXRlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKIAkJCQkJIGxvZmZfdCAqcHBvcywKIAkJCQkJIHNpemVfdCBjb3VudCwKLQkJCQkJIGludCBhcHBlbmRpbmcpCisJCQkJCSBpbnQgYXBwZW5kaW5nLAorCQkJCQkgaW50ICpkaXJlY3RfaW8pCiB7CiAJaW50IHJldCA9IDAsIG1ldGFfbGV2ZWwgPSBhcHBlbmRpbmc7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKQEAgLTEwODksNiArMTIxMiw0OSBAQAogCQl9IGVsc2UgewogCQkJc2F2ZWRfcG9zID0gKnBwb3M7CiAJCX0KKworCQlpZiAob2NmczJfc3BhcnNlX2FsbG9jKE9DRlMyX1NCKGlub2RlLT5pX3NiKSkpIHsKKwkJCWxvZmZfdCBlbmQgPSBzYXZlZF9wb3MgKyBjb3VudDsKKworCQkJLyoKKwkJCSAqIFNraXAgdGhlIE9fRElSRUNUIGNoZWNrcyBpZiB3ZSBkb24ndCBuZWVkCisJCQkgKiB0aGVtLgorCQkJICovCisJCQlpZiAoIWRpcmVjdF9pbyB8fCAhKCpkaXJlY3RfaW8pKQorCQkJCWJyZWFrOworCisJCQkvKgorCQkJICogQWxsb3dpbmcgY29uY3VycmVudCBkaXJlY3Qgd3JpdGVzIG1lYW5zCisJCQkgKiBpX3NpemUgY2hhbmdlcyB3b3VsZG4ndCBiZSBzeW5jaHJvbml6ZWQsIHNvCisJCQkgKiBvbmUgbm9kZSBjb3VsZCB3aW5kIHVwIHRydW5jYXRpbmcgYW5vdGhlcgorCQkJICogbm9kZXMgd3JpdGVzLgorCQkJICovCisJCQlpZiAoZW5kID4gaV9zaXplX3JlYWQoaW5vZGUpKSB7CisJCQkJKmRpcmVjdF9pbyA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCS8qCisJCQkgKiBXZSBkb24ndCBmaWxsIGhvbGVzIGR1cmluZyBkaXJlY3QgaW8sIHNvCisJCQkgKiBjaGVjayBmb3IgdGhlbSBoZXJlLiBJZiBhbnkgYXJlIGZvdW5kLCB0aGUKKwkJCSAqIGNhbGxlciB3aWxsIGhhdmUgdG8gcmV0YWtlIHNvbWUgY2x1c3RlcgorCQkJICogbG9ja3MgYW5kIGluaXRpYXRlIHRoZSBpbyBhcyBidWZmZXJlZC4KKwkJCSAqLworCQkJcmV0ID0gb2NmczJfY2hlY2tfcmFuZ2VfZm9yX2hvbGVzKGlub2RlLCBzYXZlZF9wb3MsCisJCQkJCQkJICBjb3VudCk7CisJCQlpZiAocmV0ID09IDEpIHsKKwkJCQkqZGlyZWN0X2lvID0gMDsKKwkJCQlyZXQgPSAwOworCQkJfSBlbHNlIGlmIChyZXQgPCAwKQorCQkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyoKKwkJICogVGhlIHJlc3Qgb2YgdGhpcyBsb29wIGlzIGNvbmNlcm5lZCB3aXRoIGxlZ2FjeSBmaWxlCisJCSAqIHN5c3RlbXMgd2hpY2ggZG9uJ3Qgc3VwcG9ydCBzcGFyc2UgZmlsZXMuCisJCSAqLworCiAJCW5ld3NpemUgPSBjb3VudCArIHNhdmVkX3BvczsKIAogCQltbG9nKDAsICJwb3M9JWxsZCBuZXdzaXplPSVsbGQgY3Vyc2l6ZT0lbGxkXG4iLApAQCAtMTE0MSw1NSArMTMwNywyNjQgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQKK29jZnMyX3NldF9uZXh0X2lvdmVjKGNvbnN0IHN0cnVjdCBpb3ZlYyAqKmlvdnAsIHNpemVfdCAqYmFzZXAsIHNpemVfdCBieXRlcykKK3sKKwljb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiA9ICppb3ZwOworCXNpemVfdCBiYXNlID0gKmJhc2VwOworCisJZG8geworCQlpbnQgY29weSA9IG1pbihieXRlcywgaW92LT5pb3ZfbGVuIC0gYmFzZSk7CisKKwkJYnl0ZXMgLT0gY29weTsKKwkJYmFzZSArPSBjb3B5OworCQlpZiAoaW92LT5pb3ZfbGVuID09IGJhc2UpIHsKKwkJCWlvdisrOworCQkJYmFzZSA9IDA7CisJCX0KKwl9IHdoaWxlIChieXRlcyk7CisJKmlvdnAgPSBpb3Y7CisJKmJhc2VwID0gYmFzZTsKK30KKworc3RhdGljIHN0cnVjdCBwYWdlICogb2NmczJfZ2V0X3dyaXRlX3NvdXJjZShzdHJ1Y3Qgb2NmczJfYnVmZmVyZWRfd3JpdGVfcHJpdiAqYnAsCisJCQkJCSAgICBjb25zdCBzdHJ1Y3QgaW92ZWMgKmN1cl9pb3YsCisJCQkJCSAgICBzaXplX3QgaW92X29mZnNldCkKK3sKKwlpbnQgcmV0OworCWNoYXIgKmJ1ZjsKKwlzdHJ1Y3QgcGFnZSAqc3JjX3BhZ2UgPSBOVUxMOworCisJYnVmID0gY3VyX2lvdi0+aW92X2Jhc2UgKyBpb3Zfb2Zmc2V0OworCisJaWYgKCFzZWdtZW50X2VxKGdldF9mcygpLCBLRVJORUxfRFMpKSB7CisJCS8qCisJCSAqIFB1bGwgaW4gdGhlIHVzZXIgcGFnZS4gV2Ugd2FudCB0byBkbyB0aGlzIG91dHNpZGUKKwkJICogb2YgdGhlIG1ldGEgZGF0YSBsb2NrcyBpbiBvcmRlciB0byBwcmVzZXJ2ZSBsb2NraW5nCisJCSAqIG9yZGVyIGluIGNhc2Ugb2YgcGFnZSBmYXVsdC4KKwkJICovCisJCXJldCA9IGdldF91c2VyX3BhZ2VzKGN1cnJlbnQsIGN1cnJlbnQtPm1tLAorCQkJCSAgICAgKHVuc2lnbmVkIGxvbmcpYnVmICYgUEFHRV9DQUNIRV9NQVNLLCAxLAorCQkJCSAgICAgMCwgMCwgJnNyY19wYWdlLCBOVUxMKTsKKwkJaWYgKHJldCA9PSAxKQorCQkJYnAtPmJfc3JjX2J1ZiA9IGttYXAoc3JjX3BhZ2UpOworCQllbHNlCisJCQlzcmNfcGFnZSA9IEVSUl9QVFIoLUVGQVVMVCk7CisJfSBlbHNlIHsKKwkJYnAtPmJfc3JjX2J1ZiA9IGJ1ZjsKKwl9CisKKwlyZXR1cm4gc3JjX3BhZ2U7Cit9CisKK3N0YXRpYyB2b2lkIG9jZnMyX3B1dF93cml0ZV9zb3VyY2Uoc3RydWN0IG9jZnMyX2J1ZmZlcmVkX3dyaXRlX3ByaXYgKmJwLAorCQkJCSAgIHN0cnVjdCBwYWdlICpwYWdlKQoreworCWlmIChwYWdlKSB7CisJCWt1bm1hcChwYWdlKTsKKwkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCX0KK30KKworc3RhdGljIHNzaXplX3Qgb2NmczJfZmlsZV9idWZmZXJlZF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90ICpwcG9zLAorCQkJCQkgY29uc3Qgc3RydWN0IGlvdmVjICppb3YsCisJCQkJCSB1bnNpZ25lZCBsb25nIG5yX3NlZ3MsCisJCQkJCSBzaXplX3QgY291bnQsCisJCQkJCSBzc2l6ZV90IG9fZGlyZWN0X3dyaXR0ZW4pCit7CisJaW50IHJldCA9IDA7CisJc3NpemVfdCBjb3BpZWQsIHRvdGFsID0gMDsKKwlzaXplX3QgaW92X29mZnNldCA9IDA7CisJY29uc3Qgc3RydWN0IGlvdmVjICpjdXJfaW92ID0gaW92OworCXN0cnVjdCBvY2ZzMl9idWZmZXJlZF93cml0ZV9wcml2IGJwOworCXN0cnVjdCBwYWdlICpwYWdlOworCisJLyoKKwkgKiBoYW5kbGUgcGFydGlhbCBESU8gd3JpdGUuICBBZGp1c3QgY3VyX2lvdiBpZiBuZWVkZWQuCisJICovCisJb2NmczJfc2V0X25leHRfaW92ZWMoJmN1cl9pb3YsICZpb3Zfb2Zmc2V0LCBvX2RpcmVjdF93cml0dGVuKTsKKworCWRvIHsKKwkJYnAuYl9jdXJfb2ZmID0gaW92X29mZnNldDsKKwkJYnAuYl9jdXJfaW92ID0gY3VyX2lvdjsKKworCQlwYWdlID0gb2NmczJfZ2V0X3dyaXRlX3NvdXJjZSgmYnAsIGN1cl9pb3YsIGlvdl9vZmZzZXQpOworCQlpZiAoSVNfRVJSKHBhZ2UpKSB7CisJCQlyZXQgPSBQVFJfRVJSKHBhZ2UpOworCQkJZ290byBvdXQ7CisJCX0KKworCQljb3BpZWQgPSBvY2ZzMl9idWZmZXJlZF93cml0ZV9jbHVzdGVyKGZpbGUsICpwcG9zLCBjb3VudCwKKwkJCQkJCSAgICAgIG9jZnMyX21hcF9hbmRfd3JpdGVfdXNlcl9kYXRhLAorCQkJCQkJICAgICAgJmJwKTsKKworCQlvY2ZzMl9wdXRfd3JpdGVfc291cmNlKCZicCwgcGFnZSk7CisKKwkJaWYgKGNvcGllZCA8IDApIHsKKwkJCW1sb2dfZXJybm8oY29waWVkKTsKKwkJCXJldCA9IGNvcGllZDsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJdG90YWwgKz0gY29waWVkOworCQkqcHBvcyA9ICpwcG9zICsgY29waWVkOworCQljb3VudCAtPSBjb3BpZWQ7CisKKwkJb2NmczJfc2V0X25leHRfaW92ZWMoJmN1cl9pb3YsICZpb3Zfb2Zmc2V0LCBjb3BpZWQpOworCX0gd2hpbGUoY291bnQpOworCitvdXQ6CisJcmV0dXJuIHRvdGFsID8gdG90YWwgOiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgb2NmczJfY2hlY2tfaW92ZWMoY29uc3Qgc3RydWN0IGlvdmVjICppb3YsIHNpemVfdCAqY291bnRlZCwKKwkJCSAgICAgdW5zaWduZWQgbG9uZyAqbnJfc2VncykKK3sKKwlzaXplX3Qgb2NvdW50OwkJLyogb3JpZ2luYWwgY291bnQgKi8KKwl1bnNpZ25lZCBsb25nIHNlZzsKKworCW9jb3VudCA9IDA7CisJZm9yIChzZWcgPSAwOyBzZWcgPCAqbnJfc2Vnczsgc2VnKyspIHsKKwkJY29uc3Qgc3RydWN0IGlvdmVjICppdiA9ICZpb3Zbc2VnXTsKKworCQkvKgorCQkgKiBJZiBhbnkgc2VnbWVudCBoYXMgYSBuZWdhdGl2ZSBsZW5ndGgsIG9yIHRoZSBjdW11bGF0aXZlCisJCSAqIGxlbmd0aCBldmVyIHdyYXBzIG5lZ2F0aXZlIHRoZW4gcmV0dXJuIC1FSU5WQUwuCisJCSAqLworCQlvY291bnQgKz0gaXYtPmlvdl9sZW47CisJCWlmICh1bmxpa2VseSgoc3NpemVfdCkob2NvdW50fGl2LT5pb3ZfbGVuKSA8IDApKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGl2LT5pb3ZfYmFzZSwgaXYtPmlvdl9sZW4pKQorCQkJY29udGludWU7CisJCWlmIChzZWcgPT0gMCkKKwkJCXJldHVybiAtRUZBVUxUOworCQkqbnJfc2VncyA9IHNlZzsKKwkJb2NvdW50IC09IGl2LT5pb3ZfbGVuOwkvKiBUaGlzIHNlZ21lbnQgaXMgbm8gZ29vZCAqLworCQlicmVhazsKKwl9CisKKwkqY291bnRlZCA9IG9jb3VudDsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHNzaXplX3Qgb2NmczJfZmlsZV9haW9fd3JpdGUoc3RydWN0IGtpb2NiICppb2NiLAogCQkJCSAgICBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwKIAkJCQkgICAgdW5zaWduZWQgbG9uZyBucl9zZWdzLAogCQkJCSAgICBsb2ZmX3QgcG9zKQogewotCWludCByZXQsIHJ3X2xldmVsLCBoYXZlX2FsbG9jX3NlbSA9IDA7Ci0Jc3RydWN0IGZpbGUgKmZpbHAgPSBpb2NiLT5raV9maWxwOwotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwotCWludCBhcHBlbmRpbmcgPSBmaWxwLT5mX2ZsYWdzICYgT19BUFBFTkQgPyAxIDogMDsKKwlpbnQgcmV0LCBkaXJlY3RfaW8sIGFwcGVuZGluZywgcndfbGV2ZWwsIGhhdmVfYWxsb2Nfc2VtICA9IDA7CisJaW50IGNhbl9kb19kaXJlY3QsIHN5bmMgPSAwOworCXNzaXplX3Qgd3JpdHRlbiA9IDA7CisJc2l6ZV90IG9jb3VudDsJCS8qIG9yaWdpbmFsIGNvdW50ICovCisJc2l6ZV90IGNvdW50OwkJLyogYWZ0ZXIgZmlsZSBsaW1pdCBjaGVja3MgKi8KKwlsb2ZmX3QgKnBwb3MgPSAmaW9jYi0+a2lfcG9zOworCXN0cnVjdCBmaWxlICpmaWxlID0gaW9jYi0+a2lfZmlscDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAotCW1sb2dfZW50cnkoIigweCVwLCAldSwgJyUuKnMnKVxuIiwgZmlscCwKKwltbG9nX2VudHJ5KCIoMHglcCwgJXUsICclLipzJylcbiIsIGZpbGUsCiAJCSAgICh1bnNpZ25lZCBpbnQpbnJfc2VncywKLQkJICAgZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9uYW1lLmxlbiwKLQkJICAgZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCQkgICBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX25hbWUubGVuLAorCQkgICBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX25hbWUubmFtZSk7CiAKLQkvKiBoYXBweSB3cml0ZSBvZiB6ZXJvIGJ5dGVzICovCiAJaWYgKGlvY2ItPmtpX2xlZnQgPT0gMCkKIAkJcmV0dXJuIDA7CiAKKwlyZXQgPSBvY2ZzMl9jaGVja19pb3ZlYyhpb3YsICZvY291bnQsICZucl9zZWdzKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJY291bnQgPSBvY291bnQ7CisKKwl2ZnNfY2hlY2tfZnJvemVuKGlub2RlLT5pX3NiLCBTQl9GUkVFWkVfV1JJVEUpOworCisJYXBwZW5kaW5nID0gZmlsZS0+Zl9mbGFncyAmIE9fQVBQRU5EID8gMSA6IDA7CisJZGlyZWN0X2lvID0gZmlsZS0+Zl9mbGFncyAmIE9fRElSRUNUID8gMSA6IDA7CisKIAltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7CisKK3JlbG9jazoKIAkvKiB0byBtYXRjaCBzZXRhdHRyJ3MgaV9tdXRleCAtPiBpX2FsbG9jX3NlbSAtPiByd19sb2NrIG9yZGVyaW5nICovCi0JaWYgKGZpbHAtPmZfZmxhZ3MgJiBPX0RJUkVDVCkgewotCQloYXZlX2FsbG9jX3NlbSA9IDE7CisJaWYgKGRpcmVjdF9pbykgewogCQlkb3duX3JlYWQoJmlub2RlLT5pX2FsbG9jX3NlbSk7CisJCWhhdmVfYWxsb2Nfc2VtID0gMTsKIAl9CiAKIAkvKiBjb25jdXJyZW50IE9fRElSRUNUIHdyaXRlcyBhcmUgYWxsb3dlZCAqLwotCXJ3X2xldmVsID0gKGZpbHAtPmZfZmxhZ3MgJiBPX0RJUkVDVCkgPyAwIDogMTsKKwlyd19sZXZlbCA9ICFkaXJlY3RfaW87CiAJcmV0ID0gb2NmczJfcndfbG9jayhpbm9kZSwgcndfbGV2ZWwpOwogCWlmIChyZXQgPCAwKSB7Ci0JCXJ3X2xldmVsID0gLTE7CiAJCW1sb2dfZXJybm8ocmV0KTsKLQkJZ290byBvdXQ7CisJCWdvdG8gb3V0X3NlbXM7CiAJfQogCi0JcmV0ID0gb2NmczJfcHJlcGFyZV9pbm9kZV9mb3Jfd3JpdGUoZmlscC0+Zl9wYXRoLmRlbnRyeSwgJmlvY2ItPmtpX3BvcywKLQkJCQkJICAgIGlvY2ItPmtpX2xlZnQsIGFwcGVuZGluZyk7CisJY2FuX2RvX2RpcmVjdCA9IGRpcmVjdF9pbzsKKwlyZXQgPSBvY2ZzMl9wcmVwYXJlX2lub2RlX2Zvcl93cml0ZShmaWxlLT5mX3BhdGguZGVudHJ5LCBwcG9zLAorCQkJCQkgICAgaW9jYi0+a2lfbGVmdCwgYXBwZW5kaW5nLAorCQkJCQkgICAgJmNhbl9kb19kaXJlY3QpOwogCWlmIChyZXQgPCAwKSB7CiAJCW1sb2dfZXJybm8ocmV0KTsKIAkJZ290byBvdXQ7CiAJfQogCisJLyoKKwkgKiBXZSBjYW4ndCBjb21wbGV0ZSB0aGUgZGlyZWN0IEkvTyBhcyByZXF1ZXN0ZWQsIGZhbGwgYmFjayB0bworCSAqIGJ1ZmZlcmVkIEkvTy4KKwkgKi8KKwlpZiAoZGlyZWN0X2lvICYmICFjYW5fZG9fZGlyZWN0KSB7CisJCW9jZnMyX3J3X3VubG9jayhpbm9kZSwgcndfbGV2ZWwpOworCQl1cF9yZWFkKCZpbm9kZS0+aV9hbGxvY19zZW0pOworCisJCWhhdmVfYWxsb2Nfc2VtID0gMDsKKwkJcndfbGV2ZWwgPSAtMTsKKworCQlkaXJlY3RfaW8gPSAwOworCQlzeW5jID0gMTsKKwkJZ290byByZWxvY2s7CisJfQorCisJaWYgKCFzeW5jICYmICgoZmlsZS0+Zl9mbGFncyAmIE9fU1lOQykgfHwgSVNfU1lOQyhpbm9kZSkpKQorCQlzeW5jID0gMTsKKworCS8qCisJICogWFhYOiBJcyBpdCBvayB0byBleGVjdXRlIHRoZXNlIGNoZWNrcyBhIHNlY29uZCB0aW1lPworCSAqLworCXJldCA9IGdlbmVyaWNfd3JpdGVfY2hlY2tzKGZpbGUsIHBwb3MsICZjb3VudCwgU19JU0JMSyhpbm9kZS0+aV9tb2RlKSk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwkvKgorCSAqIFNldCBwb3Mgc28gdGhhdCBzeW5jX3BhZ2VfcmFuZ2Vfbm9sb2NrKCkgYmVsb3cgdW5kZXJzdGFuZHMKKwkgKiB3aGVyZSB0byBzdGFydCBmcm9tLiBXZSBtaWdodCd2ZSBtb3ZlZCBpdCBhcm91bmQgdmlhIHRoZQorCSAqIGNhbGxzIGFib3ZlLiBUaGUgcmFuZ2Ugd2Ugd2FudCB0byBhY3R1YWxseSBzeW5jIHN0YXJ0cyBmcm9tCisJICogKnBwb3MgaGVyZS4KKwkgKgorCSAqLworCXBvcyA9ICpwcG9zOworCiAJLyogY29tbXVuaWNhdGUgd2l0aCBvY2ZzMl9kaW9fZW5kX2lvICovCi0Jb2NmczJfaW9jYl9zZXRfcndfbG9ja2VkKGlvY2IpOworCW9jZnMyX2lvY2Jfc2V0X3J3X2xvY2tlZChpb2NiLCByd19sZXZlbCk7CiAKLQlyZXQgPSBnZW5lcmljX2ZpbGVfYWlvX3dyaXRlX25vbG9jayhpb2NiLCBpb3YsIG5yX3NlZ3MsIGlvY2ItPmtpX3Bvcyk7CisJaWYgKGRpcmVjdF9pbykgeworCQl3cml0dGVuID0gZ2VuZXJpY19maWxlX2RpcmVjdF93cml0ZShpb2NiLCBpb3YsICZucl9zZWdzLCAqcHBvcywKKwkJCQkJCSAgICBwcG9zLCBjb3VudCwgb2NvdW50KTsKKwkJaWYgKHdyaXR0ZW4gPCAwKSB7CisJCQlyZXQgPSB3cml0dGVuOworCQkJZ290byBvdXRfZGlvOworCQl9CisJfSBlbHNlIHsKKwkJd3JpdHRlbiA9IG9jZnMyX2ZpbGVfYnVmZmVyZWRfd3JpdGUoZmlsZSwgcHBvcywgaW92LCBucl9zZWdzLAorCQkJCQkJICAgIGNvdW50LCB3cml0dGVuKTsKKwkJaWYgKHdyaXR0ZW4gPCAwKSB7CisJCQlyZXQgPSB3cml0dGVuOworCQkJaWYgKHJldCAhPSAtRUZBVUxUIHx8IHJldCAhPSAtRU5PU1BDKQorCQkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQogCitvdXRfZGlvOgogCS8qIGJ1ZmZlcmVkIGFpbyB3b3VsZG4ndCBoYXZlIHByb3BlciBsb2NrIGNvdmVyYWdlIHRvZGF5ICovCi0JQlVHX09OKHJldCA9PSAtRUlPQ0JRVUVVRUQgJiYgIShmaWxwLT5mX2ZsYWdzICYgT19ESVJFQ1QpKTsKKwlCVUdfT04ocmV0ID09IC1FSU9DQlFVRVVFRCAmJiAhKGZpbGUtPmZfZmxhZ3MgJiBPX0RJUkVDVCkpOwogCiAJLyogCiAJICogZGVlcCBpbiBnX2ZfYV93X24oKS0+b2NmczJfZGlyZWN0X0lPIHdlIHBhc3MgaW4gYSBvY2ZzMl9kaW9fZW5kX2lvCkBAIC0xMjA3LDEzICsxNTgyLDEwMiBAQAogCX0KIAogb3V0OgorCWlmIChyd19sZXZlbCAhPSAtMSkKKwkJb2NmczJfcndfdW5sb2NrKGlub2RlLCByd19sZXZlbCk7CisKK291dF9zZW1zOgogCWlmIChoYXZlX2FsbG9jX3NlbSkKIAkJdXBfcmVhZCgmaW5vZGUtPmlfYWxsb2Nfc2VtKTsKLQlpZiAocndfbGV2ZWwgIT0gLTEpIAotCQlvY2ZzMl9yd191bmxvY2soaW5vZGUsIHJ3X2xldmVsKTsKKworCWlmICh3cml0dGVuID4gMCAmJiBzeW5jKSB7CisJCXNzaXplX3QgZXJyOworCisJCWVyciA9IHN5bmNfcGFnZV9yYW5nZV9ub2xvY2soaW5vZGUsIGZpbGUtPmZfbWFwcGluZywgcG9zLCBjb3VudCk7CisJCWlmIChlcnIgPCAwKQorCQkJd3JpdHRlbiA9IGVycjsKKwl9CisKIAltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKIAogCW1sb2dfZXhpdChyZXQpOworCXJldHVybiB3cml0dGVuID8gd3JpdHRlbiA6IHJldDsKK30KKworc3RhdGljIGludCBvY2ZzMl9zcGxpY2Vfd3JpdGVfYWN0b3Ioc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqcGlwZSwKKwkJCQkgICAgc3RydWN0IHBpcGVfYnVmZmVyICpidWYsCisJCQkJICAgIHN0cnVjdCBzcGxpY2VfZGVzYyAqc2QpCit7CisJaW50IHJldCwgY291bnQsIHRvdGFsID0gMDsKKwlzc2l6ZV90IGNvcGllZCA9IDA7CisJc3RydWN0IG9jZnMyX3NwbGljZV93cml0ZV9wcml2IHNwOworCisJcmV0ID0gYnVmLT5vcHMtPnBpbihwaXBlLCBidWYpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJc3Auc19zZCA9IHNkOworCXNwLnNfYnVmID0gYnVmOworCXNwLnNfcGlwZSA9IHBpcGU7CisJc3Auc19vZmZzZXQgPSBzZC0+cG9zICYgflBBR0VfQ0FDSEVfTUFTSzsKKwlzcC5zX2J1Zl9vZmZzZXQgPSBidWYtPm9mZnNldDsKKworCWNvdW50ID0gc2QtPmxlbjsKKwlpZiAoY291bnQgKyBzcC5zX29mZnNldCA+IFBBR0VfQ0FDSEVfU0laRSkKKwkJY291bnQgPSBQQUdFX0NBQ0hFX1NJWkUgLSBzcC5zX29mZnNldDsKKworCWRvIHsKKwkJLyoKKwkJICogc3BsaWNlIHdhbnRzIHVzIHRvIGNvcHkgdXAgdG8gb25lIHBhZ2UgYXQgYQorCQkgKiB0aW1lLiBGb3IgcGFnZXNpemUgPiBjbHVzdGVyIHNpemUsIHRoaXMgbWVhbnMgd2UKKwkJICogbWlnaHQgZW50ZXIgb2NmczJfYnVmZmVyZWRfd3JpdGVfY2x1c3RlcigpIG1vcmUKKwkJICogdGhhbiBvbmNlLCBzbyBrZWVwIHRyYWNrIG9mIG91ciBwcm9ncmVzcyBoZXJlLgorCQkgKi8KKwkJY29waWVkID0gb2NmczJfYnVmZmVyZWRfd3JpdGVfY2x1c3RlcihzZC0+ZmlsZSwKKwkJCQkJCSAgICAgIChsb2ZmX3Qpc2QtPnBvcyArIHRvdGFsLAorCQkJCQkJICAgICAgY291bnQsCisJCQkJCQkgICAgICBvY2ZzMl9tYXBfYW5kX3dyaXRlX3NwbGljZV9kYXRhLAorCQkJCQkJICAgICAgJnNwKTsKKwkJaWYgKGNvcGllZCA8IDApIHsKKwkJCW1sb2dfZXJybm8oY29waWVkKTsKKwkJCXJldCA9IGNvcGllZDsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJY291bnQgLT0gY29waWVkOworCQlzcC5zX29mZnNldCArPSBjb3BpZWQ7CisJCXNwLnNfYnVmX29mZnNldCArPSBjb3BpZWQ7CisJCXRvdGFsICs9IGNvcGllZDsKKwl9IHdoaWxlIChjb3VudCk7CisKKwlyZXQgPSAwOworb3V0OgorCisJcmV0dXJuIHRvdGFsID8gdG90YWwgOiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IF9fb2NmczJfZmlsZV9zcGxpY2Vfd3JpdGUoc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqcGlwZSwKKwkJCQkJIHN0cnVjdCBmaWxlICpvdXQsCisJCQkJCSBsb2ZmX3QgKnBwb3MsCisJCQkJCSBzaXplX3QgbGVuLAorCQkJCQkgdW5zaWduZWQgaW50IGZsYWdzKQoreworCWludCByZXQsIGVycjsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IG91dC0+Zl9tYXBwaW5nOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBtYXBwaW5nLT5ob3N0OworCisJcmV0ID0gX19zcGxpY2VfZnJvbV9waXBlKHBpcGUsIG91dCwgcHBvcywgbGVuLCBmbGFncywKKwkJCQkgb2NmczJfc3BsaWNlX3dyaXRlX2FjdG9yKTsKKwlpZiAocmV0ID4gMCkgeworCQkqcHBvcyArPSByZXQ7CisKKwkJaWYgKHVubGlrZWx5KChvdXQtPmZfZmxhZ3MgJiBPX1NZTkMpIHx8IElTX1NZTkMoaW5vZGUpKSkgeworCQkJZXJyID0gZ2VuZXJpY19vc3luY19pbm9kZShpbm9kZSwgbWFwcGluZywKKwkJCQkJCSAgT1NZTkNfTUVUQURBVEF8T1NZTkNfREFUQSk7CisJCQlpZiAoZXJyKQorCQkJCXJldCA9IGVycjsKKwkJfQorCX0KKwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTEyMzksMTQgKzE3MDMsMTUgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JcmV0ID0gb2NmczJfcHJlcGFyZV9pbm9kZV9mb3Jfd3JpdGUob3V0LT5mX3BhdGguZGVudHJ5LCBwcG9zLCBsZW4sIDApOworCXJldCA9IG9jZnMyX3ByZXBhcmVfaW5vZGVfZm9yX3dyaXRlKG91dC0+Zl9wYXRoLmRlbnRyeSwgcHBvcywgbGVuLCAwLAorCQkJCQkgICAgTlVMTCk7CiAJaWYgKHJldCA8IDApIHsKIAkJbWxvZ19lcnJubyhyZXQpOwogCQlnb3RvIG91dF91bmxvY2s7CiAJfQogCiAJLyogb2ssIHdlJ3JlIGRvbmUgd2l0aCBpX3NpemUgYW5kIGFsbG9jIHdvcmsgKi8KLQlyZXQgPSBnZW5lcmljX2ZpbGVfc3BsaWNlX3dyaXRlX25vbG9jayhwaXBlLCBvdXQsIHBwb3MsIGxlbiwgZmxhZ3MpOworCXJldCA9IF9fb2NmczJfZmlsZV9zcGxpY2Vfd3JpdGUocGlwZSwgb3V0LCBwcG9zLCBsZW4sIGZsYWdzKTsKIAogb3V0X3VubG9jazoKIAlvY2ZzMl9yd191bmxvY2soaW5vZGUsIDEpOwpAQCAtMTMyMyw3ICsxNzg4LDcgQEAKIAkJfQogCQlyd19sZXZlbCA9IDA7CiAJCS8qIGNvbW11bmljYXRlIHdpdGggb2NmczJfZGlvX2VuZF9pbyAqLwotCQlvY2ZzMl9pb2NiX3NldF9yd19sb2NrZWQoaW9jYik7CisJCW9jZnMyX2lvY2Jfc2V0X3J3X2xvY2tlZChpb2NiLCByd19sZXZlbCk7CiAJfQogCiAJLyoKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2ZpbGUuaCBiL2ZzL29jZnMyL2ZpbGUuaAppbmRleCBjYzk3M2YwLi4yYzQ0NjBmIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9maWxlLmgKKysrIGIvZnMvb2NmczIvZmlsZS5oCkBAIC0zOSwxMiArMzksMTcgQEAKIH07CiBpbnQgb2NmczJfZG9fZXh0ZW5kX2FsbG9jYXRpb24oc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCiAJCQkgICAgICAgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCSAgICAgICB1MzIgKmNsdXN0ZXJfc3RhcnQsCiAJCQkgICAgICAgdTMyIGNsdXN0ZXJzX3RvX2FkZCwKIAkJCSAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmZlX2JoLAogCQkJICAgICAgIGhhbmRsZV90ICpoYW5kbGUsCiAJCQkgICAgICAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKmRhdGFfYWMsCiAJCQkgICAgICAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKm1ldGFfYWMsCiAJCQkgICAgICAgZW51bSBvY2ZzMl9hbGxvY19yZXN0YXJ0ZWQgKnJlYXNvbik7CitpbnQgb2NmczJfbG9ja19hbGxvY2F0b3JzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBvY2ZzMl9kaW5vZGUgKmRpLAorCQkJICB1MzIgY2x1c3RlcnNfdG9fYWRkLAorCQkJICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqKmRhdGFfYWMsCisJCQkgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICoqbWV0YV9hYyk7CiBpbnQgb2NmczJfc2V0YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpYXR0ciAqYXR0cik7CiBpbnQgb2NmczJfZ2V0YXR0cihzdHJ1Y3QgdmZzbW91bnQgKm1udCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAogCQkgIHN0cnVjdCBrc3RhdCAqc3RhdCk7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9pbm9kZS5jIGIvZnMvb2NmczIvaW5vZGUuYwppbmRleCAyOGFiNTZmLi4yMWE2MDUwIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9pbm9kZS5jCisrKyBiL2ZzL29jZnMyL2lub2RlLmMKQEAgLTg5LDI0ICs4OSw2IEBACiAJCWlub2RlLT5pX2ZsYWdzIHw9IFNfRElSU1lOQzsKIH0KIAotc3RydWN0IGlub2RlICpvY2ZzMl9pbG9va3VwX2Zvcl92b3RlKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAotCQkJCSAgICAgdTY0IGJsa25vLAotCQkJCSAgICAgaW50IGRlbGV0ZV92b3RlKQotewotCXN0cnVjdCBvY2ZzMl9maW5kX2lub2RlX2FyZ3MgYXJnczsKLQotCS8qIG9jZnMyX2lsb29rdXBfZm9yX3ZvdGUgc2hvdWxkICpvbmx5KiBiZSBjYWxsZWQgZnJvbSB0aGUKLQkgKiB2b3RlIHRocmVhZCAqLwotCUJVR19PTihjdXJyZW50ICE9IG9zYi0+dm90ZV90YXNrKTsKLQotCWFyZ3MuZmlfYmxrbm8gPSBibGtubzsKLQlhcmdzLmZpX2ZsYWdzID0gT0NGUzJfRklfRkxBR19OT1dBSVQ7Ci0JaWYgKGRlbGV0ZV92b3RlKQotCQlhcmdzLmZpX2ZsYWdzIHw9IE9DRlMyX0ZJX0ZMQUdfREVMRVRFOwotCWFyZ3MuZmlfaW5vID0gaW5vX2Zyb21fYmxrbm8ob3NiLT5zYiwgYmxrbm8pOwotCXJldHVybiBpbG9va3VwNShvc2ItPnNiLCBhcmdzLmZpX2lubywgb2NmczJfZmluZF9hY3RvciwgJmFyZ3MpOwotfQotCiBzdHJ1Y3QgaW5vZGUgKm9jZnMyX2lnZXQoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsIHU2NCBibGtubywgaW50IGZsYWdzKQogewogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBOVUxMOwpAQCAtMTgyLDI4ICsxNjQsNiBAQAogCWlmIChvaS0+aXBfYmxrbm8gIT0gYXJncy0+ZmlfYmxrbm8pCiAJCWdvdG8gYmFpbDsKIAotCS8qIE9DRlMyX0ZJX0ZMQUdfTk9XQUlUIGlzICpvbmx5KiBzZXQgZnJvbQotCSAqIG9jZnMyX2lsb29rdXBfZm9yX3ZvdGUgd2hpY2ggd29uJ3QgY3JlYXRlIGFuIGlub2RlIGZvciBvbmUKLQkgKiB0aGF0IGlzbid0IGZvdW5kLiBUaGUgdm90ZSB0aHJlYWQgd2hpY2ggZG9lc24ndCB3YW50IHRvIGdldAotCSAqIGFuIGlub2RlIHdoaWNoIGlzIGluIHRoZSBwcm9jZXNzIG9mIGdvaW5nIGF3YXkgLSBvdGhlcndpc2UKLQkgKiB0aGUgY2FsbCB0byBfX3dhaXRfb25fZnJlZWluZ19pbm9kZSBpbiBmaW5kX2lub2RlX2Zhc3Qgd2lsbAotCSAqIGNhdXNlIGl0IHRvIGRlYWRsb2NrIG9uIGFuIGlub2RlIHdoaWNoIG1heSBiZSB3YWl0aW5nIG9uIGEKLQkgKiB2b3RlIChvciBsb2NrIHJlbGVhc2UpIGluIGRlbGV0ZV9pbm9kZSAqLwotCWlmICgoYXJncy0+ZmlfZmxhZ3MgJiBPQ0ZTMl9GSV9GTEFHX05PV0FJVCkgJiYKLQkgICAgKGlub2RlLT5pX3N0YXRlICYgKElfRlJFRUlOR3xJX0NMRUFSKSkpIHsKLQkJLyogQXMgc3RhdGVkIGFib3ZlLCB3ZSdyZSBub3QgZ29pbmcgdG8gcmV0dXJuIGFuCi0JCSAqIGlub2RlLiAgSW4gdGhlIGNhc2Ugb2YgYSBkZWxldGUgdm90ZSwgdGhlIHZvdGluZwotCQkgKiBjb2RlIGlzIGdvaW5nIHRvIHNpZ25hbCB0aGUgb3RoZXIgbm9kZSB0byBnbwotCQkgKiBhaGVhZC4gTWFyayB0aGF0IHN0YXRlIGhlcmUsIHNvIHRoaXMgZnJlZWluZyBpbm9kZQotCQkgKiBoYXMgdGhlIHN0YXRlIHdoZW4gaXQgZ2V0cyB0byBkZWxldGVfaW5vZGUuICovCi0JCWlmIChhcmdzLT5maV9mbGFncyAmIE9DRlMyX0ZJX0ZMQUdfREVMRVRFKSB7Ci0JCQlzcGluX2xvY2soJm9pLT5pcF9sb2NrKTsKLQkJCW9jZnMyX21hcmtfaW5vZGVfcmVtb3RlbHlfZGVsZXRlZChpbm9kZSk7Ci0JCQlzcGluX3VubG9jaygmb2ktPmlwX2xvY2spOwotCQl9Ci0JCWdvdG8gYmFpbDsKLQl9Ci0KIAlyZXQgPSAxOwogYmFpbDoKIAltbG9nX2V4aXQocmV0KTsKQEAgLTI2MSw2ICsyMjEsOSBAQAogCQlnb3RvIGJhaWw7CiAJfQogCisJT0NGUzJfSShpbm9kZSktPmlwX2NsdXN0ZXJzID0gbGUzMl90b19jcHUoZmUtPmlfY2x1c3RlcnMpOworCU9DRlMyX0koaW5vZGUpLT5pcF9hdHRyID0gbGUzMl90b19jcHUoZmUtPmlfYXR0cik7CisKIAlpbm9kZS0+aV92ZXJzaW9uID0gMTsKIAlpbm9kZS0+aV9nZW5lcmF0aW9uID0gbGUzMl90b19jcHUoZmUtPmlfZ2VuZXJhdGlvbik7CiAJaW5vZGUtPmlfcmRldiA9IGh1Z2VfZGVjb2RlX2RldihsZTY0X3RvX2NwdShmZS0+aWQxLmRldjEuaV9yZGV2KSk7CkBAIC0yNzIsOCArMjM1LDcgQEAKIAlpZiAoU19JU0xOSyhpbm9kZS0+aV9tb2RlKSAmJiAhZmUtPmlfY2x1c3RlcnMpCiAJCWlub2RlLT5pX2Jsb2NrcyA9IDA7CiAJZWxzZQotCQlpbm9kZS0+aV9ibG9ja3MgPQotCQkJb2NmczJfYWxpZ25fYnl0ZXNfdG9fc2VjdG9ycyhsZTY0X3RvX2NwdShmZS0+aV9zaXplKSk7CisJCWlub2RlLT5pX2Jsb2NrcyA9IG9jZnMyX2lub2RlX3NlY3Rvcl9jb3VudChpbm9kZSk7CiAJaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmb2NmczJfYW9wczsKIAlpbm9kZS0+aV9hdGltZS50dl9zZWMgPSBsZTY0X3RvX2NwdShmZS0+aV9hdGltZSk7CiAJaW5vZGUtPmlfYXRpbWUudHZfbnNlYyA9IGxlMzJfdG9fY3B1KGZlLT5pX2F0aW1lX25zZWMpOwpAQCAtMjg4LDEwICsyNTAsNiBAQAogCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vLAogCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpZmUtPmlfYmxrbm8pOwogCi0JT0NGUzJfSShpbm9kZSktPmlwX2NsdXN0ZXJzID0gbGUzMl90b19jcHUoZmUtPmlfY2x1c3RlcnMpOwotCU9DRlMyX0koaW5vZGUpLT5pcF9vcnBoYW5lZF9zbG90ID0gT0NGUzJfSU5WQUxJRF9TTE9UOwotCU9DRlMyX0koaW5vZGUpLT5pcF9hdHRyID0gbGUzMl90b19jcHUoZmUtPmlfYXR0cik7Ci0KIAlpbm9kZS0+aV9ubGluayA9IGxlMTZfdG9fY3B1KGZlLT5pX2xpbmtzX2NvdW50KTsKIAogCWlmIChmZS0+aV9mbGFncyAmIGNwdV90b19sZTMyKE9DRlMyX1NZU1RFTV9GTCkpCkBAIC0zNDcsNiArMzA1LDkgQEAKIAogCQlvY2ZzMl9pbm9kZV9sb2NrX3Jlc19pbml0KCZPQ0ZTMl9JKGlub2RlKS0+aXBfbWV0YV9sb2NrcmVzLAogCQkJCQkgIE9DRlMyX0xPQ0tfVFlQRV9NRVRBLCAwLCBpbm9kZSk7CisKKwkJb2NmczJfaW5vZGVfbG9ja19yZXNfaW5pdCgmT0NGUzJfSShpbm9kZSktPmlwX29wZW5fbG9ja3JlcywKKwkJCQkJICBPQ0ZTMl9MT0NLX1RZUEVfT1BFTiwgMCwgaW5vZGUpOwogCX0KIAogCW9jZnMyX2lub2RlX2xvY2tfcmVzX2luaXQoJk9DRlMyX0koaW5vZGUpLT5pcF9yd19sb2NrcmVzLApAQCAtNDIxLDcgKzM4Miw3IEBACiAJICogY2x1c3RlciBsb2NrIGJlZm9yZSB0cnVzdGluZyBhbnl0aGluZyBhbnl3YXkuCiAJICovCiAJY2FuX2xvY2sgPSAhKGFyZ3MtPmZpX2ZsYWdzICYgT0NGUzJfRklfRkxBR19TWVNGSUxFKQotCQkmJiAhKGFyZ3MtPmZpX2ZsYWdzICYgT0NGUzJfRklfRkxBR19OT0xPQ0spCisJCSYmICEoYXJncy0+ZmlfZmxhZ3MgJiBPQ0ZTMl9GSV9GTEFHX09SUEhBTl9SRUNPVkVSWSkKIAkJJiYgIW9jZnMyX21vdW50X2xvY2FsKG9zYik7CiAKIAkvKgpAQCAtNDM4LDcgKzM5OSwxNyBAQAogCQkJCSAgT0NGUzJfTE9DS19UWVBFX01FVEEsCiAJCQkJICBnZW5lcmF0aW9uLCBpbm9kZSk7CiAKKwlvY2ZzMl9pbm9kZV9sb2NrX3Jlc19pbml0KCZPQ0ZTMl9JKGlub2RlKS0+aXBfb3Blbl9sb2NrcmVzLAorCQkJCSAgT0NGUzJfTE9DS19UWVBFX09QRU4sCisJCQkJICAwLCBpbm9kZSk7CisKIAlpZiAoY2FuX2xvY2spIHsKKwkJc3RhdHVzID0gb2NmczJfb3Blbl9sb2NrKGlub2RlKTsKKwkJaWYgKHN0YXR1cykgeworCQkJbWFrZV9iYWRfaW5vZGUoaW5vZGUpOworCQkJbWxvZ19lcnJubyhzdGF0dXMpOworCQkJcmV0dXJuIHN0YXR1czsKKwkJfQogCQlzdGF0dXMgPSBvY2ZzMl9tZXRhX2xvY2soaW5vZGUsIE5VTEwsIDApOwogCQlpZiAoc3RhdHVzKSB7CiAJCQltYWtlX2JhZF9pbm9kZShpbm9kZSk7CkBAIC00NDcsNiArNDE4LDE0IEBACiAJCX0KIAl9CiAKKwlpZiAoYXJncy0+ZmlfZmxhZ3MgJiBPQ0ZTMl9GSV9GTEFHX09SUEhBTl9SRUNPVkVSWSkgeworCQlzdGF0dXMgPSBvY2ZzMl90cnlfb3Blbl9sb2NrKGlub2RlLCAwKTsKKwkJaWYgKHN0YXR1cykgeworCQkJbWFrZV9iYWRfaW5vZGUoaW5vZGUpOwkKKwkJCXJldHVybiBzdGF0dXM7CisJCX0KKwl9CisKIAlzdGF0dXMgPSBvY2ZzMl9yZWFkX2Jsb2NrKG9zYiwgYXJncy0+ZmlfYmxrbm8sICZiaCwgMCwKIAkJCQkgIGNhbl9sb2NrID8gaW5vZGUgOiBOVUxMKTsKIAlpZiAoc3RhdHVzIDwgMCkgewpAQCAtNTA3LDUwICs0ODYsNTYgQEAKIAkJCQkgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqZmVfYmgpCiB7CiAJaW50IHN0YXR1cyA9IDA7Ci0JaGFuZGxlX3QgKmhhbmRsZSA9IE5VTEw7CiAJc3RydWN0IG9jZnMyX3RydW5jYXRlX2NvbnRleHQgKnRjID0gTlVMTDsKIAlzdHJ1Y3Qgb2NmczJfZGlub2RlICpmZTsKKwloYW5kbGVfdCAqaGFuZGxlID0gTlVMTDsKIAogCW1sb2dfZW50cnlfdm9pZCgpOwogCiAJZmUgPSAoc3RydWN0IG9jZnMyX2Rpbm9kZSAqKSBmZV9iaC0+Yl9kYXRhOwogCi0JLyogemVybyBhbGxvY2F0aW9uLCB6ZXJvIHRydW5jYXRlIDopICovCi0JaWYgKCFmZS0+aV9jbHVzdGVycykKLQkJZ290byBiYWlsOworCWlmIChmZS0+aV9jbHVzdGVycykgeworCQloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIE9DRlMyX0lOT0RFX1VQREFURV9DUkVESVRTKTsKKwkJaWYgKElTX0VSUihoYW5kbGUpKSB7CisJCQlzdGF0dXMgPSBQVFJfRVJSKGhhbmRsZSk7CisJCQltbG9nX2Vycm5vKHN0YXR1cyk7CisJCQlnb3RvIG91dDsKKwkJfQogCi0JaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBPQ0ZTMl9JTk9ERV9VUERBVEVfQ1JFRElUUyk7Ci0JaWYgKElTX0VSUihoYW5kbGUpKSB7Ci0JCXN0YXR1cyA9IFBUUl9FUlIoaGFuZGxlKTsKKwkJc3RhdHVzID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgZmVfYmgsCisJCQkJCSAgICAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwkJaWYgKHN0YXR1cyA8IDApIHsKKwkJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaV9zaXplX3dyaXRlKGlub2RlLCAwKTsKKworCQlzdGF0dXMgPSBvY2ZzMl9tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgaW5vZGUsIGZlX2JoKTsKKwkJaWYgKHN0YXR1cyA8IDApIHsKKwkJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJb2NmczJfY29tbWl0X3RyYW5zKG9zYiwgaGFuZGxlKTsKIAkJaGFuZGxlID0gTlVMTDsKLQkJbWxvZ19lcnJubyhzdGF0dXMpOwotCQlnb3RvIGJhaWw7CisKKwkJc3RhdHVzID0gb2NmczJfcHJlcGFyZV90cnVuY2F0ZShvc2IsIGlub2RlLCBmZV9iaCwgJnRjKTsKKwkJaWYgKHN0YXR1cyA8IDApIHsKKwkJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJc3RhdHVzID0gb2NmczJfY29tbWl0X3RydW5jYXRlKG9zYiwgaW5vZGUsIGZlX2JoLCB0Yyk7CisJCWlmIChzdGF0dXMgPCAwKSB7CisJCQltbG9nX2Vycm5vKHN0YXR1cyk7CisJCQlnb3RvIG91dDsKKwkJfQogCX0KIAotCXN0YXR1cyA9IG9jZnMyX3NldF9pbm9kZV9zaXplKGhhbmRsZSwgaW5vZGUsIGZlX2JoLCAwVUxMKTsKLQlpZiAoc3RhdHVzIDwgMCkgewotCQltbG9nX2Vycm5vKHN0YXR1cyk7Ci0JCWdvdG8gYmFpbDsKLQl9Ci0KLQlvY2ZzMl9jb21taXRfdHJhbnMob3NiLCBoYW5kbGUpOwotCWhhbmRsZSA9IE5VTEw7Ci0KLQlzdGF0dXMgPSBvY2ZzMl9wcmVwYXJlX3RydW5jYXRlKG9zYiwgaW5vZGUsIGZlX2JoLCAmdGMpOwotCWlmIChzdGF0dXMgPCAwKSB7Ci0JCW1sb2dfZXJybm8oc3RhdHVzKTsKLQkJZ290byBiYWlsOwotCX0KLQotCXN0YXR1cyA9IG9jZnMyX2NvbW1pdF90cnVuY2F0ZShvc2IsIGlub2RlLCBmZV9iaCwgdGMpOwotCWlmIChzdGF0dXMgPCAwKSB7Ci0JCW1sb2dfZXJybm8oc3RhdHVzKTsKLQkJZ290byBiYWlsOwotCX0KLWJhaWw6CitvdXQ6CiAJaWYgKGhhbmRsZSkKIAkJb2NmczJfY29tbWl0X3RyYW5zKG9zYiwgaGFuZGxlKTsKLQogCW1sb2dfZXhpdChzdGF0dXMpOwogCXJldHVybiBzdGF0dXM7CiB9CkBAIC02NzgsMTAgKzY2MywxMCBAQAogCXN0cnVjdCBpbm9kZSAqb3JwaGFuX2Rpcl9pbm9kZSA9IE5VTEw7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpvcnBoYW5fZGlyX2JoID0gTlVMTDsKIAlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKTsKKwlzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaTsKIAotCS8qIFdlJ3ZlIGFscmVhZHkgdm90ZWQgb24gdGhpcyBzbyBpdCBzaG91bGQgYmUgcmVhZG9ubHkgLSBubwotCSAqIHNwaW5sb2NrIG5lZWRlZC4gKi8KLQlvcnBoYW5lZF9zbG90ID0gT0NGUzJfSShpbm9kZSktPmlwX29ycGhhbmVkX3Nsb3Q7CisJZGkgPSAoc3RydWN0IG9jZnMyX2Rpbm9kZSAqKSBkaV9iaC0+Yl9kYXRhOworCW9ycGhhbmVkX3Nsb3QgPSBsZTE2X3RvX2NwdShkaS0+aV9vcnBoYW5lZF9zbG90KTsKIAogCXN0YXR1cyA9IG9jZnMyX2NoZWNrX29ycGhhbl9yZWNvdmVyeV9zdGF0ZShvc2IsIG9ycGhhbmVkX3Nsb3QpOwogCWlmIChzdGF0dXMpCkBAIC04MzksMTEgKzgyNCwyMCBAQAogCQlnb3RvIGJhaWw7CiAJfQogCi0Jc3RhdHVzID0gb2NmczJfcmVxdWVzdF9kZWxldGVfdm90ZShpbm9kZSk7Ci0JLyogLUVCVVNZIG1lYW5zIHRoYXQgb3RoZXIgbm9kZXMgYXJlIHN0aWxsIHVzaW5nIHRoZQotCSAqIGlub2RlLiBXZSdyZSBkb25lIGhlcmUgdGhvdWdoLCBzbyBhdm9pZCBkb2luZyBhbnl0aGluZyBvbgotCSAqIGRpc2sgYW5kIGxldCB0aGVtIHdvcnJ5IGFib3V0IGRlbGV0aW5nIGl0LiAqLwotCWlmIChzdGF0dXMgPT0gLUVCVVNZKSB7CisJLyoKKwkgKiBUaGlzIGlzIGhvdyBvY2ZzMiBkZXRlcm1pbmVzIHdoZXRoZXIgYW4gaW5vZGUgaXMgc3RpbGwgbGl2ZQorCSAqIHdpdGhpbiB0aGUgY2x1c3Rlci4gRXZlcnkgbm9kZSB0YWtlcyBhIHNoYXJlZCByZWFkIGxvY2sgb24KKwkgKiB0aGUgaW5vZGUgb3BlbiBsb2NrIGluIG9jZnMyX3JlYWRfbG9ja2VkX2lub2RlKCkuIFdoZW4gd2UKKwkgKiBnZXQgdG8gLT5kZWxldGVfaW5vZGUoKSwgZWFjaCBub2RlIHRyaWVzIHRvIGNvbnZlcnQgaXQncworCSAqIGxvY2sgdG8gYW4gZXhjbHVzaXZlLiBUcnlsb2NrcyBhcmUgc2VyaWFsaXplZCBieSB0aGUgaW5vZGUKKwkgKiBtZXRhIGRhdGEgbG9jay4gSWYgdGhlIHVwY29udmVydCBzdWNlZWRzLCB3ZSBrbm93IHRoZSBpbm9kZQorCSAqIGlzIG5vIGxvbmdlciBsaXZlIGFuZCBjYW4gYmUgZGVsZXRlZC4KKwkgKgorCSAqIFRob3VnaCB3ZSBjYWxsIHRoaXMgd2l0aCB0aGUgbWV0YSBkYXRhIGxvY2sgaGVsZCwgdGhlCisJICogdHJ5bG9jayBrZWVwcyB1cyBmcm9tIEFCQkEgZGVhZGxvY2suCisJICovCisJc3RhdHVzID0gb2NmczJfdHJ5X29wZW5fbG9jayhpbm9kZSwgMSk7CisJaWYgKHN0YXR1cyA9PSAtRUFHQUlOKSB7CiAJCXN0YXR1cyA9IDA7CiAJCW1sb2coMCwgIlNraXBwaW5nIGRlbGV0ZSBvZiAlbGx1IGJlY2F1c2UgaXQgaXMgaW4gdXNlIG9uIgogCQkgICAgICJvdGhlciBub2Rlc1xuIiwgKHVuc2lnbmVkIGxvbmcgbG9uZylvaS0+aXBfYmxrbm8pOwpAQCAtODU0LDIxICs4NDgsMTAgQEAKIAkJZ290byBiYWlsOwogCX0KIAotCXNwaW5fbG9jaygmb2ktPmlwX2xvY2spOwotCWlmIChvaS0+aXBfb3JwaGFuZWRfc2xvdCA9PSBPQ0ZTMl9JTlZBTElEX1NMT1QpIHsKLQkJLyogTm9ib2R5IGtuZXcgd2hpY2ggc2xvdCB0aGlzIGlub2RlIHdhcyBvcnBoYW5lZAotCQkgKiBpbnRvLiBUaGlzIG1heSBoYXBwZW4gZHVyaW5nIG5vZGUgZGVhdGggYW5kCi0JCSAqIHJlY292ZXJ5IGtub3dzIGhvdyB0byBjbGVhbiBpdCB1cCBzbyB3ZSBjYW4gc2FmZWx5Ci0JCSAqIGlnbm9yZSB0aGlzIGlub2RlIGZvciBub3cgb24uICovCi0JCW1sb2coMCwgIk5vYm9keSBrbmV3IHdoZXJlIGlub2RlICVsbHUgd2FzIG9ycGhhbmVkIVxuIiwKLQkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKW9pLT5pcF9ibGtubyk7Ci0JfSBlbHNlIHsKLQkJKndpcGUgPSAxOwotCi0JCW1sb2coMCwgIklub2RlICVsbHUgaXMgb2sgdG8gd2lwZSBmcm9tIG9ycGhhbiBkaXIgJWRcbiIsCi0JCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylvaS0+aXBfYmxrbm8sIG9pLT5pcF9vcnBoYW5lZF9zbG90KTsKLQl9Ci0Jc3Bpbl91bmxvY2soJm9pLT5pcF9sb2NrKTsKKwkqd2lwZSA9IDE7CisJbWxvZygwLCAiSW5vZGUgJWxsdSBpcyBvayB0byB3aXBlIGZyb20gb3JwaGFuIGRpciAldVxuIiwKKwkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpb2ktPmlwX2Jsa25vLAorCSAgICAgbGUxNl90b19jcHUoZGktPmlfb3JwaGFuZWRfc2xvdCkpOwogCiBiYWlsOgogCXJldHVybiBzdGF0dXM7CkBAIC0xMDAxLDExICs5ODQsMTYgQEAKIAltbG9nX2J1Z19vbl9tc2coT0NGUzJfU0IoaW5vZGUtPmlfc2IpID09IE5VTEwsCiAJCQkiSW5vZGU9JWx1XG4iLCBpbm9kZS0+aV9pbm8pOwogCisJLyogRm9yIHJlbW92ZSBkZWxldGVfaW5vZGUgdm90ZSwgd2UgaG9sZCBvcGVuIGxvY2sgYmVmb3JlLAorCSAqIG5vdyBpdCBpcyB0aW1lIHRvIHVubG9jayBQUiBhbmQgRVggb3BlbiBsb2Nrcy4gKi8KKwlvY2ZzMl9vcGVuX3VubG9jayhpbm9kZSk7CisKIAkvKiBEbyB0aGVzZSBiZWZvcmUgYWxsIHRoZSBvdGhlciB3b3JrIHNvIHRoYXQgd2UgZG9uJ3QgYm91bmNlCiAJICogdGhlIHZvdGUgdGhyZWFkIHdoaWxlIHdhaXRpbmcgdG8gZGVzdHJveSB0aGUgbG9ja3MuICovCiAJb2NmczJfbWFya19sb2NrcmVzX2ZyZWVpbmcoJm9pLT5pcF9yd19sb2NrcmVzKTsKIAlvY2ZzMl9tYXJrX2xvY2tyZXNfZnJlZWluZygmb2ktPmlwX21ldGFfbG9ja3Jlcyk7CiAJb2NmczJfbWFya19sb2NrcmVzX2ZyZWVpbmcoJm9pLT5pcF9kYXRhX2xvY2tyZXMpOworCW9jZnMyX21hcmtfbG9ja3Jlc19mcmVlaW5nKCZvaS0+aXBfb3Blbl9sb2NrcmVzKTsKIAogCS8qIFdlIHZlcnkgd2VsbCBtYXkgZ2V0IGEgY2xlYXJfaW5vZGUgYmVmb3JlIGFsbCBhbiBpbm9kZXMKIAkgKiBtZXRhZGF0YSBoYXMgaGl0IGRpc2suIE9mIGNvdXJzZSwgd2UgY2FuJ3QgZHJvcCBhbnkgY2x1c3RlcgpAQCAtMTAyMCw4ICsxMDA4LDcgQEAKIAkJCSJDbGVhciBpbm9kZSBvZiAlbGx1LCBpbm9kZSBoYXMgaW8gbWFya2Vyc1xuIiwKIAkJCSh1bnNpZ25lZCBsb25nIGxvbmcpb2ktPmlwX2Jsa25vKTsKIAotCW9jZnMyX2V4dGVudF9tYXBfZHJvcChpbm9kZSwgMCk7Ci0Jb2NmczJfZXh0ZW50X21hcF9pbml0KGlub2RlKTsKKwlvY2ZzMl9leHRlbnRfbWFwX3RydW5jKGlub2RlLCAwKTsKIAogCXN0YXR1cyA9IG9jZnMyX2Ryb3BfaW5vZGVfbG9ja3MoaW5vZGUpOwogCWlmIChzdGF0dXMgPCAwKQpAQCAtMTAzMCw2ICsxMDE3LDcgQEAKIAlvY2ZzMl9sb2NrX3Jlc19mcmVlKCZvaS0+aXBfcndfbG9ja3Jlcyk7CiAJb2NmczJfbG9ja19yZXNfZnJlZSgmb2ktPmlwX21ldGFfbG9ja3Jlcyk7CiAJb2NmczJfbG9ja19yZXNfZnJlZSgmb2ktPmlwX2RhdGFfbG9ja3Jlcyk7CisJb2NmczJfbG9ja19yZXNfZnJlZSgmb2ktPmlwX29wZW5fbG9ja3Jlcyk7CiAKIAlvY2ZzMl9tZXRhZGF0YV9jYWNoZV9wdXJnZShpbm9kZSk7CiAKQEAgLTEwODYsOSArMTA3NCw2IEBACiAJbWxvZygwLCAiRHJvcCBpbm9kZSAlbGx1LCBubGluayA9ICV1LCBpcF9mbGFncyA9IDB4JXhcbiIsCiAJICAgICAodW5zaWduZWQgbG9uZyBsb25nKW9pLT5pcF9ibGtubywgaW5vZGUtPmlfbmxpbmssIG9pLT5pcF9mbGFncyk7CiAKLQkvKiBUZXN0aW5nIGlwX29ycGhhbmVkX3Nsb3QgaGVyZSB3b3VsZG4ndCB3b3JrIGJlY2F1c2Ugd2UgbWF5Ci0JICogbm90IGhhdmUgZ290dGVuIGEgZGVsZXRlX2lub2RlIHZvdGUgZnJvbSBhbnkgb3RoZXIgbm9kZXMKLQkgKiB5ZXQuICovCiAJaWYgKG9pLT5pcF9mbGFncyAmIE9DRlMyX0lOT0RFX01BWUJFX09SUEhBTkVEKQogCQlnZW5lcmljX2RlbGV0ZV9pbm9kZShpbm9kZSk7CiAJZWxzZQpAQCAtMTEyMSw4ICsxMTA2LDggQEAKIAkJcmV0dXJuIE5VTEw7CiAJfQogCi0JdG1wZXJyID0gb2NmczJfZXh0ZW50X21hcF9nZXRfYmxvY2tzKGlub2RlLCBibG9jaywgMSwKLQkJCQkJICAgICAmcF9ibGtubywgTlVMTCk7CisJdG1wZXJyID0gb2NmczJfZXh0ZW50X21hcF9nZXRfYmxvY2tzKGlub2RlLCBibG9jaywgJnBfYmxrbm8sIE5VTEwsCisJCQkJCSAgICAgTlVMTCk7CiAJaWYgKHRtcGVyciA8IDApIHsKIAkJbWxvZ19lcnJubyh0bXBlcnIpOwogCQlnb3RvIGZhaWw7CkBAIC0xMjU5LDcgKzEyNDQsNyBAQAogCWlmIChTX0lTTE5LKGlub2RlLT5pX21vZGUpICYmIGxlMzJfdG9fY3B1KGZlLT5pX2NsdXN0ZXJzKSA9PSAwKQogCQlpbm9kZS0+aV9ibG9ja3MgPSAwOwogCWVsc2UKLQkJaW5vZGUtPmlfYmxvY2tzID0gb2NmczJfYWxpZ25fYnl0ZXNfdG9fc2VjdG9ycyhpX3NpemVfcmVhZChpbm9kZSkpOworCQlpbm9kZS0+aV9ibG9ja3MgPSBvY2ZzMl9pbm9kZV9zZWN0b3JfY291bnQoaW5vZGUpOwogCWlub2RlLT5pX2F0aW1lLnR2X3NlYyA9IGxlNjRfdG9fY3B1KGZlLT5pX2F0aW1lKTsKIAlpbm9kZS0+aV9hdGltZS50dl9uc2VjID0gbGUzMl90b19jcHUoZmUtPmlfYXRpbWVfbnNlYyk7CiAJaW5vZGUtPmlfbXRpbWUudHZfc2VjID0gbGU2NF90b19jcHUoZmUtPmlfbXRpbWUpOwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvaW5vZGUuaCBiL2ZzL29jZnMyL2lub2RlLmgKaW5kZXggMWE3ZGQyOS4uMDNhZTA3NSAxMDA2NDQKLS0tIGEvZnMvb2NmczIvaW5vZGUuaAorKysgYi9mcy9vY2ZzMi9pbm9kZS5oCkBAIC0yNiw2ICsyNiw4IEBACiAjaWZuZGVmIE9DRlMyX0lOT0RFX0gKICNkZWZpbmUgT0NGUzJfSU5PREVfSAogCisjaW5jbHVkZSAiZXh0ZW50X21hcC5oIgorCiAvKiBPQ0ZTMiBJbm9kZSBQcml2YXRlIERhdGEgKi8KIHN0cnVjdCBvY2ZzMl9pbm9kZV9pbmZvCiB7CkBAIC0zNCw2ICszNiw3IEBACiAJc3RydWN0IG9jZnMyX2xvY2tfcmVzCQlpcF9yd19sb2NrcmVzOwogCXN0cnVjdCBvY2ZzMl9sb2NrX3JlcwkJaXBfbWV0YV9sb2NrcmVzOwogCXN0cnVjdCBvY2ZzMl9sb2NrX3JlcwkJaXBfZGF0YV9sb2NrcmVzOworCXN0cnVjdCBvY2ZzMl9sb2NrX3JlcwkJaXBfb3Blbl9sb2NrcmVzOwogCiAJLyogcHJvdGVjdHMgYWxsb2NhdGlvbiBjaGFuZ2VzIG9uIHRoaXMgaW5vZGUuICovCiAJc3RydWN0IHJ3X3NlbWFwaG9yZQkJaXBfYWxsb2Nfc2VtOwpAQCAtNDIsOSArNDUsNyBAQAogCXNwaW5sb2NrX3QJCQlpcF9sb2NrOwogCXUzMgkJCQlpcF9vcGVuX2NvdW50OwogCXUzMgkJCQlpcF9jbHVzdGVyczsKLQlzdHJ1Y3Qgb2NmczJfZXh0ZW50X21hcAkJaXBfbWFwOwogCXN0cnVjdCBsaXN0X2hlYWQJCWlwX2lvX21hcmtlcnM7Ci0JaW50CQkJCWlwX29ycGhhbmVkX3Nsb3Q7CiAKIAlzdHJ1Y3QgbXV0ZXgJCQlpcF9pb19tdXRleDsKIApAQCAtNjQsNiArNjUsOCBAQAogCiAJc3RydWN0IG9jZnMyX2NhY2hpbmdfaW5mbwlpcF9tZXRhZGF0YV9jYWNoZTsKIAorCXN0cnVjdCBvY2ZzMl9leHRlbnRfbWFwCQlpcF9leHRlbnRfbWFwOworCiAJc3RydWN0IGlub2RlCQkJdmZzX2lub2RlOwogfTsKIApAQCAtMTE3LDE0ICsxMjAsOSBAQAogdm9pZCBvY2ZzMl9kcm9wX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpOwogCiAvKiBGbGFncyBmb3Igb2NmczJfaWdldCgpICovCi0jZGVmaW5lIE9DRlMyX0ZJX0ZMQUdfTk9XQUlUCTB4MQotI2RlZmluZSBPQ0ZTMl9GSV9GTEFHX0RFTEVURQkweDIKLSNkZWZpbmUgT0NGUzJfRklfRkxBR19TWVNGSUxFCTB4NAotI2RlZmluZSBPQ0ZTMl9GSV9GTEFHX05PTE9DSwkweDgKKyNkZWZpbmUgT0NGUzJfRklfRkxBR19TWVNGSUxFCQkweDQKKyNkZWZpbmUgT0NGUzJfRklfRkxBR19PUlBIQU5fUkVDT1ZFUlkJMHg4CiBzdHJ1Y3QgaW5vZGUgKm9jZnMyX2lnZXQoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsIHU2NCBmZW9mZiwgaW50IGZsYWdzKTsKLXN0cnVjdCBpbm9kZSAqb2NmczJfaWxvb2t1cF9mb3Jfdm90ZShzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKLQkJCQkgICAgIHU2NCBibGtubywKLQkJCQkgICAgIGludCBkZWxldGVfdm90ZSk7CiBpbnQgb2NmczJfaW5vZGVfaW5pdF9wcml2YXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUpOwogaW50IG9jZnMyX2lub2RlX3JldmFsaWRhdGUoc3RydWN0IGRlbnRyeSAqZGVudHJ5KTsKIGludCBvY2ZzMl9wb3B1bGF0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3Qgb2NmczJfZGlub2RlICpmZSwKQEAgLTE0NCw0ICsxNDIsMTEgQEAKIAogdm9pZCBvY2ZzMl9zZXRfaW5vZGVfZmxhZ3Moc3RydWN0IGlub2RlICppbm9kZSk7CiAKK3N0YXRpYyBpbmxpbmUgYmxrY250X3Qgb2NmczJfaW5vZGVfc2VjdG9yX2NvdW50KHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJaW50IGNfdG9fc19iaXRzID0gT0NGUzJfU0IoaW5vZGUtPmlfc2IpLT5zX2NsdXN0ZXJzaXplX2JpdHMgLSA5OworCisJcmV0dXJuIChibGtjbnRfdCkoT0NGUzJfSShpbm9kZSktPmlwX2NsdXN0ZXJzIDw8IGNfdG9fc19iaXRzKTsKK30KKwogI2VuZGlmIC8qIE9DRlMyX0lOT0RFX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2pvdXJuYWwuYyBiL2ZzL29jZnMyL2pvdXJuYWwuYwppbmRleCA4MjVjYjBhLi41YThhOTBkIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9qb3VybmFsLmMKKysrIGIvZnMvb2NmczIvam91cm5hbC5jCkBAIC02NDksMjkgKzY0OSwyMCBAQAogc3RhdGljIGludCBvY2ZzMl9mb3JjZV9yZWFkX2pvdXJuYWwoc3RydWN0IGlub2RlICppbm9kZSkKIHsKIAlpbnQgc3RhdHVzID0gMDsKLQlpbnQgaSwgcF9ibG9ja3M7Ci0JdTY0IHZfYmxrbm8sIHBfYmxrbm87Ci0jZGVmaW5lIENPTkNVUlJFTlRfSk9VUk5BTF9GSUxMIDMyCisJaW50IGk7CisJdTY0IHZfYmxrbm8sIHBfYmxrbm8sIHBfYmxvY2tzLCBudW1fYmxvY2tzOworI2RlZmluZSBDT05DVVJSRU5UX0pPVVJOQUxfRklMTCAzMlVMTAogCXN0cnVjdCBidWZmZXJfaGVhZCAqYmhzW0NPTkNVUlJFTlRfSk9VUk5BTF9GSUxMXTsKIAogCW1sb2dfZW50cnlfdm9pZCgpOwogCi0JQlVHX09OKGlub2RlLT5pX2Jsb2NrcyAhPQotCQkgICAgIG9jZnMyX2FsaWduX2J5dGVzX3RvX3NlY3RvcnMoaV9zaXplX3JlYWQoaW5vZGUpKSk7Ci0KIAltZW1zZXQoYmhzLCAwLCBzaXplb2Yoc3RydWN0IGJ1ZmZlcl9oZWFkICopICogQ09OQ1VSUkVOVF9KT1VSTkFMX0ZJTEwpOwogCi0JbWxvZygwLCAiRm9yY2UgcmVhZGluZyAlbGx1IGJsb2Nrc1xuIiwKLQkJKHVuc2lnbmVkIGxvbmcgbG9uZykoaW5vZGUtPmlfYmxvY2tzID4+Ci0JCQkoaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMgLSA5KSkpOwotCisJbnVtX2Jsb2NrcyA9IG9jZnMyX2Jsb2Nrc19mb3JfYnl0ZXMoaW5vZGUtPmlfc2IsIGlub2RlLT5pX3NpemUpOwogCXZfYmxrbm8gPSAwOwotCXdoaWxlICh2X2Jsa25vIDwKLQkgICAgICAgKGlub2RlLT5pX2Jsb2NrcyA+PiAoaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMgLSA5KSkpIHsKLQorCXdoaWxlICh2X2Jsa25vIDwgbnVtX2Jsb2NrcykgewogCQlzdGF0dXMgPSBvY2ZzMl9leHRlbnRfbWFwX2dldF9ibG9ja3MoaW5vZGUsIHZfYmxrbm8sCi0JCQkJCQkgICAgIDEsICZwX2Jsa25vLAotCQkJCQkJICAgICAmcF9ibG9ja3MpOworCQkJCQkJICAgICAmcF9ibGtubywgJnBfYmxvY2tzLCBOVUxMKTsKIAkJaWYgKHN0YXR1cyA8IDApIHsKIAkJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJCWdvdG8gYmFpbDsKQEAgLTEzMDYsNyArMTI5Nyw3IEBACiAJCQkJY29udGludWU7CiAKIAkJCWl0ZXIgPSBvY2ZzMl9pZ2V0KG9zYiwgbGU2NF90b19jcHUoZGUtPmlub2RlKSwKLQkJCQkJICBPQ0ZTMl9GSV9GTEFHX05PTE9DSyk7CisJCQkJCSAgT0NGUzJfRklfRkxBR19PUlBIQU5fUkVDT1ZFUlkpOwogCQkJaWYgKElTX0VSUihpdGVyKSkKIAkJCQljb250aW51ZTsKIApAQCAtMTQxOCw3ICsxNDA5LDYgQEAKIAkJLyogU2V0IHRoZSBwcm9wZXIgaW5mb3JtYXRpb24gdG8gZ2V0IHVzIGdvaW5nIGludG8KIAkJICogb2NmczJfZGVsZXRlX2lub2RlLiAqLwogCQlvaS0+aXBfZmxhZ3MgfD0gT0NGUzJfSU5PREVfTUFZQkVfT1JQSEFORUQ7Ci0JCW9pLT5pcF9vcnBoYW5lZF9zbG90ID0gc2xvdDsKIAkJc3Bpbl91bmxvY2soJm9pLT5pcF9sb2NrKTsKIAogCQlpcHV0KGlub2RlKTsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2pvdXJuYWwuaCBiL2ZzL29jZnMyL2pvdXJuYWwuaAppbmRleCBkMDI2YjRmLi4zZGI1ZGU0IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9qb3VybmFsLmgKKysrIGIvZnMvb2NmczIvam91cm5hbC5oCkBAIC0zOTAsNyArMzkwLDcgQEAKIAkvKiBXZSBtYXkgYmUgZGVsZXRpbmcgbWV0YWRhdGEgYmxvY2tzLCBzbyBtZXRhZGF0YSBhbGxvYyBkaW5vZGUgKwogCSAgIG9uZSBkZXNjLiBibG9jayBmb3IgZWFjaCBwb3NzaWJsZSBkZWxldGUuICovCiAJaWYgKHRyZWVfZGVwdGggJiYgbmV4dF9mcmVlID09IDEgJiYKLQkgICAgbGUzMl90b19jcHUobGFzdF9lbC0+bF9yZWNzW2ldLmVfY2x1c3RlcnMpID09IGNsdXN0ZXJzX3RvX2RlbCkKKwkgICAgb2NmczJfcmVjX2NsdXN0ZXJzKGxhc3RfZWwsICZsYXN0X2VsLT5sX3JlY3NbaV0pID09IGNsdXN0ZXJzX3RvX2RlbCkKIAkJY3JlZGl0cyArPSAxICsgdHJlZV9kZXB0aDsKIAogCS8qIHVwZGF0ZSB0byB0aGUgdHJ1bmNhdGUgbG9nLiAqLwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvbW1hcC5jIGIvZnMvb2NmczIvbW1hcC5jCmluZGV4IDUxYjAyMDQuLmFmMDExNTggMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL21tYXAuYworKysgYi9mcy9vY2ZzMi9tbWFwLmMKQEAgLTg1LDggKzg1LDExIEBACiAJaW50IHJldCA9IDAsIGxvY2tfbGV2ZWwgPSAwOwogCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfc2IpOwogCi0JLyogV2UgZG9uJ3Qgd2FudCB0byBzdXBwb3J0IHNoYXJlZCB3cml0YWJsZSBtYXBwaW5ncyB5ZXQuICovCi0JaWYgKCFvY2ZzMl9tb3VudF9sb2NhbChvc2IpICYmCisJLyoKKwkgKiBPbmx5IHN1cHBvcnQgc2hhcmVkIHdyaXRlYWJsZSBtbWFwIGZvciBsb2NhbCBtb3VudHMgd2hpY2gKKwkgKiBkb24ndCBrbm93IGFib3V0IGhvbGVzLgorCSAqLworCWlmICgoIW9jZnMyX21vdW50X2xvY2FsKG9zYikgfHwgb2NmczJfc3BhcnNlX2FsbG9jKG9zYikpICYmCiAJICAgICgodm1hLT52bV9mbGFncyAmIFZNX1NIQVJFRCkgfHwgKHZtYS0+dm1fZmxhZ3MgJiBWTV9NQVlTSEFSRSkpICYmCiAJICAgICgodm1hLT52bV9mbGFncyAmIFZNX1dSSVRFKSB8fCAodm1hLT52bV9mbGFncyAmIFZNX01BWVdSSVRFKSkpIHsKIAkJbWxvZygwLCAiZGlzYWxsb3cgc2hhcmVkIHdyaXRhYmxlIG1tYXBzICVseFxuIiwgdm1hLT52bV9mbGFncyk7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9uYW1laS5jIGIvZnMvb2NmczIvbmFtZWkuYwppbmRleCAyOGRkNzU3Li4yYmNmMzUzIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9uYW1laS5jCisrKyBiL2ZzL29jZnMyL25hbWVpLmMKQEAgLTE3NSw4ICsxNzUsNiBAQAogCiAJaW5vZGUgPSBvY2ZzMl9pZ2V0KE9DRlMyX1NCKGRpci0+aV9zYiksIGJsa25vLCAwKTsKIAlpZiAoSVNfRVJSKGlub2RlKSkgewotCQltbG9nKE1MX0VSUk9SLCAiVW5hYmxlIHRvIGNyZWF0ZSBpbm9kZSAlbGx1XG4iLAotCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYmxrbm8pOwogCQlyZXQgPSBFUlJfUFRSKC1FQUNDRVMpOwogCQlnb3RvIGJhaWxfdW5sb2NrOwogCX0KQEAgLTE4OSw3ICsxODcsNiBAQAogCSAqIHVubGluay4gKi8KIAlzcGluX2xvY2soJm9pLT5pcF9sb2NrKTsKIAlvaS0+aXBfZmxhZ3MgJj0gfk9DRlMyX0lOT0RFX01BWUJFX09SUEhBTkVEOwotCW9pLT5pcF9vcnBoYW5lZF9zbG90ID0gT0NGUzJfSU5WQUxJRF9TTE9UOwogCXNwaW5fdW5sb2NrKCZvaS0+aXBfbG9jayk7CiAKIGJhaWxfYWRkOgpAQCAtMjg4LDcgKzI4NSw3IEBACiAKIAlpX3NpemVfd3JpdGUoaW5vZGUsIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSk7CiAJaW5vZGUtPmlfbmxpbmsgPSAyOwotCWlub2RlLT5pX2Jsb2NrcyA9IG9jZnMyX2FsaWduX2J5dGVzX3RvX3NlY3RvcnMoaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKTsKKwlpbm9kZS0+aV9ibG9ja3MgPSBvY2ZzMl9pbm9kZV9zZWN0b3JfY291bnQoaW5vZGUpOwogCXN0YXR1cyA9IG9jZnMyX21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSwgZmVfYmgpOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKQEAgLTE0ODYsOCArMTQ4Myw3IEBACiAJc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmhzID0gTlVMTDsKIAljb25zdCBjaGFyICpjOwogCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBvc2ItPnNiOwotCXU2NCBwX2Jsa25vOwotCWludCBwX2Jsb2NrczsKKwl1NjQgcF9ibGtubywgcF9ibG9ja3M7CiAJaW50IHZpcnR1YWwsIGJsb2Nrcywgc3RhdHVzLCBpLCBieXRlc19sZWZ0OwogCiAJYnl0ZXNfbGVmdCA9IGlfc2l6ZV9yZWFkKGlub2RlKSArIDE7CkBAIC0xNTE0LDggKzE1MTAsOCBAQAogCQlnb3RvIGJhaWw7CiAJfQogCi0Jc3RhdHVzID0gb2NmczJfZXh0ZW50X21hcF9nZXRfYmxvY2tzKGlub2RlLCAwLCAxLCAmcF9ibGtubywKLQkJCQkJICAgICAmcF9ibG9ja3MpOworCXN0YXR1cyA9IG9jZnMyX2V4dGVudF9tYXBfZ2V0X2Jsb2Nrcyhpbm9kZSwgMCwgJnBfYmxrbm8sICZwX2Jsb2NrcywKKwkJCQkJICAgICBOVUxMKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCWdvdG8gYmFpbDsKQEAgLTE2NzQsOCArMTY3MCwxMSBAQAogCWlub2RlLT5pX3JkZXYgPSAwOwogCW5ld3NpemUgPSBsIC0gMTsKIAlpZiAobCA+IG9jZnMyX2Zhc3Rfc3ltbGlua19jaGFycyhzYikpIHsKKwkJdTMyIG9mZnNldCA9IDA7CisKIAkJaW5vZGUtPmlfb3AgPSAmb2NmczJfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zOwotCQlzdGF0dXMgPSBvY2ZzMl9kb19leHRlbmRfYWxsb2NhdGlvbihvc2IsIGlub2RlLCAxLCBuZXdfZmVfYmgsCisJCXN0YXR1cyA9IG9jZnMyX2RvX2V4dGVuZF9hbGxvY2F0aW9uKG9zYiwgaW5vZGUsICZvZmZzZXQsIDEsCisJCQkJCQkgICAgbmV3X2ZlX2JoLAogCQkJCQkJICAgIGhhbmRsZSwgZGF0YV9hYywgTlVMTCwKIAkJCQkJCSAgICBOVUxMKTsKIAkJaWYgKHN0YXR1cyA8IDApIHsKQEAgLTE2ODksNyArMTY4OCw3IEBACiAJCQlnb3RvIGJhaWw7CiAJCX0KIAkJaV9zaXplX3dyaXRlKGlub2RlLCBuZXdzaXplKTsKLQkJaW5vZGUtPmlfYmxvY2tzID0gb2NmczJfYWxpZ25fYnl0ZXNfdG9fc2VjdG9ycyhuZXdzaXplKTsKKwkJaW5vZGUtPmlfYmxvY2tzID0gb2NmczJfaW5vZGVfc2VjdG9yX2NvdW50KGlub2RlKTsKIAl9IGVsc2UgewogCQlpbm9kZS0+aV9vcCA9ICZvY2ZzMl9mYXN0X3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKIAkJbWVtY3B5KChjaGFyICopIGZlLT5pZDIuaV9zeW1saW5rLCBzeW1uYW1lLCBsKTsKQEAgLTIyMjIsOSArMjIyMSw3IEBACiAJLyogUmVjb3JkIHdoaWNoIG9ycGhhbiBkaXIgb3VyIGlub2RlIG5vdyByZXNpZGVzCiAJICogaW4uIGRlbGV0ZV9pbm9kZSB3aWxsIHVzZSB0aGlzIHRvIGRldGVybWluZSB3aGljaCBvcnBoYW4KIAkgKiBkaXIgdG8gbG9jay4gKi8KLQlzcGluX2xvY2soJk9DRlMyX0koaW5vZGUpLT5pcF9sb2NrKTsKLQlPQ0ZTMl9JKGlub2RlKS0+aXBfb3JwaGFuZWRfc2xvdCA9IG9zYi0+c2xvdF9udW07Ci0Jc3Bpbl91bmxvY2soJk9DRlMyX0koaW5vZGUpLT5pcF9sb2NrKTsKKwlmZS0+aV9vcnBoYW5lZF9zbG90ID0gY3B1X3RvX2xlMTYob3NiLT5zbG90X251bSk7CiAKIAltbG9nKDAsICJJbm9kZSAlbGx1IG9ycGhhbmVkIGluIHNsb3QgJWRcbiIsCiAJICAgICAodW5zaWduZWQgbG9uZyBsb25nKU9DRlMyX0koaW5vZGUpLT5pcF9ibGtubywgb3NiLT5zbG90X251bSk7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9vY2ZzMi5oIGIvZnMvb2NmczIvb2NmczIuaAppbmRleCBkYjhlNzdjLi44MmNjOTJkIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9vY2ZzMi5oCisrKyBiL2ZzL29jZnMyL29jZnMyLmgKQEAgLTQ2LDExICs0Niw2IEBACiAjaW5jbHVkZSAiZW5kaWFuLmgiCiAjaW5jbHVkZSAib2NmczJfbG9ja2lkLmgiCiAKLXN0cnVjdCBvY2ZzMl9leHRlbnRfbWFwIHsKLQl1MzIJCWVtX2NsdXN0ZXJzOwotCXN0cnVjdCByYl9yb290CWVtX2V4dGVudHM7Ci19OwotCiAvKiBNb3N0IHVzZXIgdmlzaWJsZSBPQ0ZTMiBpbm9kZXMgd2lsbCBoYXZlIHZlcnkgZmV3IHBpZWNlcyBvZgogICogbWV0YWRhdGEsIGJ1dCBsYXJnZXIgZmlsZXMgKGluY2x1ZGluZyBiaXRtYXBzLCBldGMpIG11c3QgYmUgdGFrZW4KICAqIGludG8gYWNjb3VudCB3aGVuIGRlc2lnbmluZyBhbiBhY2Nlc3Mgc2NoZW1lLiBXZSBhbGxvdyBhIHNtYWxsCkBAIC0zMDMsNiArMjk4LDEzIEBACiAJcmV0dXJuIDE7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IG9jZnMyX3NwYXJzZV9hbGxvYyhzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYikKK3sKKwlpZiAob3NiLT5zX2ZlYXR1cmVfaW5jb21wYXQgJiBPQ0ZTMl9GRUFUVVJFX0lOQ09NUEFUX1NQQVJTRV9BTExPQykKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKIC8qIHNldCAvIGNsZWFyIGZ1bmN0aW9ucyBiZWNhdXNlIGNsdXN0ZXIgZXZlbnRzIGNhbiBtYWtlIHRoZXNlIGhhcHBlbgogICogaW4gcGFyYWxsZWwgc28gd2Ugd2FudCB0aGUgdHJhbnNpdGlvbnMgdG8gYmUgYXRvbWljLiB0aGlzIGFsc28KICAqIG1lYW5zIHRoYXQgYW55IGZ1dHVyZSBmbGFncyBvc2JfZmxhZ3MgbXVzdCBiZSBwcm90ZWN0ZWQgYnkgc3BpbmxvY2sKQEAgLTQ2MSw2ICs0NjMsNDkgQEAKIAlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpKChieXRlcyArIDUxMSkgPj4gOSk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IG9jZnMyX3BhZ2VfaW5kZXhfdG9fY2x1c3RlcnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQkJCQl1bnNpZ25lZCBsb25nIHBnX2luZGV4KQoreworCXUzMiBjbHVzdGVycyA9IHBnX2luZGV4OworCXVuc2lnbmVkIGludCBjYml0cyA9IE9DRlMyX1NCKHNiKS0+c19jbHVzdGVyc2l6ZV9iaXRzOworCisJaWYgKHVubGlrZWx5KFBBR0VfQ0FDSEVfU0hJRlQgPiBjYml0cykpCisJCWNsdXN0ZXJzID0gcGdfaW5kZXggPDwgKFBBR0VfQ0FDSEVfU0hJRlQgLSBjYml0cyk7CisJZWxzZSBpZiAoUEFHRV9DQUNIRV9TSElGVCA8IGNiaXRzKQorCQljbHVzdGVycyA9IHBnX2luZGV4ID4+IChjYml0cyAtIFBBR0VfQ0FDSEVfU0hJRlQpOworCisJcmV0dXJuIGNsdXN0ZXJzOworfQorCisvKgorICogRmluZCB0aGUgMXN0IHBhZ2UgaW5kZXggd2hpY2ggY292ZXJzIHRoZSBnaXZlbiBjbHVzdGVycy4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIG9jZnMyX2FsaWduX2NsdXN0ZXJzX3RvX3BhZ2VfaW5kZXgoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQkJCQl1MzIgY2x1c3RlcnMpCit7CisJdW5zaWduZWQgaW50IGNiaXRzID0gT0NGUzJfU0Ioc2IpLT5zX2NsdXN0ZXJzaXplX2JpdHM7CisJdW5zaWduZWQgbG9uZyBpbmRleCA9IGNsdXN0ZXJzOworCisJaWYgKFBBR0VfQ0FDSEVfU0hJRlQgPiBjYml0cykgeworCQlpbmRleCA9IGNsdXN0ZXJzID4+IChQQUdFX0NBQ0hFX1NISUZUIC0gY2JpdHMpOworCX0gZWxzZSBpZiAoUEFHRV9DQUNIRV9TSElGVCA8IGNiaXRzKSB7CisJCWluZGV4ID0gY2x1c3RlcnMgPDwgKGNiaXRzIC0gUEFHRV9DQUNIRV9TSElGVCk7CisJfQorCisJcmV0dXJuIGluZGV4OworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBvY2ZzMl9wYWdlc19wZXJfY2x1c3RlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXVuc2lnbmVkIGludCBjYml0cyA9IE9DRlMyX1NCKHNiKS0+c19jbHVzdGVyc2l6ZV9iaXRzOworCXVuc2lnbmVkIGludCBwYWdlc19wZXJfY2x1c3RlciA9IDE7CisKKwlpZiAoUEFHRV9DQUNIRV9TSElGVCA8IGNiaXRzKQorCQlwYWdlc19wZXJfY2x1c3RlciA9IDEgPDwgKGNiaXRzIC0gUEFHRV9DQUNIRV9TSElGVCk7CisKKwlyZXR1cm4gcGFnZXNfcGVyX2NsdXN0ZXI7Cit9CisKICNkZWZpbmUgb2NmczJfc2V0X2JpdCBleHQyX3NldF9iaXQKICNkZWZpbmUgb2NmczJfY2xlYXJfYml0IGV4dDJfY2xlYXJfYml0CiAjZGVmaW5lIG9jZnMyX3Rlc3RfYml0IGV4dDJfdGVzdF9iaXQKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL29jZnMyX2ZzLmggYi9mcy9vY2ZzMi9vY2ZzMl9mcy5oCmluZGV4IGU2MWUyMTguLjcxMzA2NDcgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL29jZnMyX2ZzLmgKKysrIGIvZnMvb2NmczIvb2NmczJfZnMuaApAQCAtODYsNyArODYsOCBAQAogCU9DRlMyX1NCKHNiKS0+c19mZWF0dXJlX2luY29tcGF0ICY9IH4obWFzaykKIAogI2RlZmluZSBPQ0ZTMl9GRUFUVVJFX0NPTVBBVF9TVVBQCU9DRlMyX0ZFQVRVUkVfQ09NUEFUX0JBQ0tVUF9TQgotI2RlZmluZSBPQ0ZTMl9GRUFUVVJFX0lOQ09NUEFUX1NVUFAJT0NGUzJfRkVBVFVSRV9JTkNPTVBBVF9MT0NBTF9NT1VOVAorI2RlZmluZSBPQ0ZTMl9GRUFUVVJFX0lOQ09NUEFUX1NVUFAJKE9DRlMyX0ZFQVRVUkVfSU5DT01QQVRfTE9DQUxfTU9VTlQgXAorCQkJCQkgfCBPQ0ZTMl9GRUFUVVJFX0lOQ09NUEFUX1NQQVJTRV9BTExPQykKICNkZWZpbmUgT0NGUzJfRkVBVFVSRV9ST19DT01QQVRfU1VQUAkwCiAKIC8qCkBAIC0xNTUsNiArMTU2LDEyIEBACiAjZGVmaW5lIE9DRlMyX0ZMX01PRElGSUFCTEUJKDB4MDAwMTAwRkYpCS8qIFVzZXIgbW9kaWZpYWJsZSBmbGFncyAqLwogCiAvKgorICogRXh0ZW50IHJlY29yZCBmbGFncyAoZV9ub2RlLmxlYWYuZmxhZ3MpCisgKi8KKyNkZWZpbmUgT0NGUzJfRVhUX1VOV1JJVFRFTgkoMHgwMSkJLyogRXh0ZW50IGlzIGFsbG9jYXRlZCBidXQKKwkJCQkJICogdW53cml0dGVuICovCisKKy8qCiAgKiBpb2N0bCBjb21tYW5kcwogICovCiAjZGVmaW5lIE9DRlMyX0lPQ19HRVRGTEFHUwlfSU9SKCdmJywgMSwgbG9uZykKQEAgLTI4MiwxMCArMjg5LDIxIEBACiAvKgogICogT24gZGlzayBleHRlbnQgcmVjb3JkIGZvciBPQ0ZTMgogICogSXQgZGVzY3JpYmVzIGEgcmFuZ2Ugb2YgY2x1c3RlcnMgb24gZGlzay4KKyAqCisgKiBMZW5ndGggZmllbGRzIGFyZSBkaXZpZGVkIGludG8gaW50ZXJpb3IgYW5kIGxlYWYgbm9kZSB2ZXJzaW9ucy4KKyAqIFRoaXMgbGVhdmVzIHJvb20gZm9yIGEgZmxhZ3MgZmllbGQgKE9DRlMyX0VYVF8qKSBpbiB0aGUgbGVhZiBub2Rlcy4KICAqLwogc3RydWN0IG9jZnMyX2V4dGVudF9yZWMgewogLyowMCovCV9fbGUzMiBlX2Nwb3M7CQkvKiBPZmZzZXQgaW50byB0aGUgZmlsZSwgaW4gY2x1c3RlcnMgKi8KLQlfX2xlMzIgZV9jbHVzdGVyczsJLyogQ2x1c3RlcnMgY292ZXJlZCBieSB0aGlzIGV4dGVudCAqLworCXVuaW9uIHsKKwkJX19sZTMyIGVfaW50X2NsdXN0ZXJzOyAvKiBDbHVzdGVycyBjb3ZlcmVkIGJ5IGFsbCBjaGlsZHJlbiAqLworCQlzdHJ1Y3QgeworCQkJX19sZTE2IGVfbGVhZl9jbHVzdGVyczsgLyogQ2x1c3RlcnMgY292ZXJlZCBieSB0aGlzCisJCQkJCQkgICBleHRlbnQgKi8KKwkJCV9fdTggZV9yZXNlcnZlZDE7CisJCQlfX3U4IGVfZmxhZ3M7IC8qIEV4dGVudCBmbGFncyAqLworCQl9OworCX07CiAJX19sZTY0IGVfYmxrbm87CQkvKiBQaHlzaWNhbCBkaXNrIG9mZnNldCwgaW4gYmxvY2tzICovCiAvKjEwKi8KIH07CkBAIC0zMTEsNyArMzI5LDEwIEBACiAvKjAwKi8JX19sZTE2IGxfdHJlZV9kZXB0aDsJCS8qIEV4dGVudCB0cmVlIGRlcHRoIGZyb20gdGhpcwogCQkJCQkgICBwb2ludC4gIDAgbWVhbnMgZGF0YSBleHRlbnRzCiAJCQkJCSAgIGhhbmcgZGlyZWN0bHkgb2ZmIHRoaXMKLQkJCQkJICAgaGVhZGVyIChhIGxlYWYpICovCisJCQkJCSAgIGhlYWRlciAoYSBsZWFmKQorCQkJCQkgICBOT1RFOiBUaGUgaGlnaCA4IGJpdHMgY2Fubm90IGJlCisJCQkJCSAgIHVzZWQgLSB0cmVlX2RlcHRoIGlzIG5ldmVyIHRoYXQgYmlnLgorCQkJCQkqLwogCV9fbGUxNiBsX2NvdW50OwkJCS8qIE51bWJlciBvZiBleHRlbnQgcmVjb3JkcyAqLwogCV9fbGUxNiBsX25leHRfZnJlZV9yZWM7CQkvKiBOZXh0IHVudXNlZCBleHRlbnQgc2xvdCAqLwogCV9fbGUxNiBsX3Jlc2VydmVkMTsKQEAgLTQ0Niw3ICs0NjcsOSBAQAogCV9fbGUzMiBpX2N0aW1lX25zZWM7CiAJX19sZTMyIGlfbXRpbWVfbnNlYzsKIAlfX2xlMzIgaV9hdHRyOwotCV9fbGUzMiBpX3Jlc2VydmVkMTsKKwlfX2xlMTYgaV9vcnBoYW5lZF9zbG90OwkJLyogT25seSB2YWxpZCB3aGVuIE9DRlMyX09SUEhBTkVEX0ZMCisJCQkJCSAgIHdhcyBzZXQgaW4gaV9mbGFncyAqLworCV9fbGUxNiBpX3Jlc2VydmVkMTsKIC8qNzAqLwlfX2xlNjQgaV9yZXNlcnZlZDJbOF07CiAvKkI4Ki8JdW5pb24gewogCQlfX2xlNjQgaV9wYWQxOwkJLyogR2VuZXJpYyB3YXkgdG8gcmVmZXIgdG8gdGhpcwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvb2NmczJfbG9ja2lkLmggYi9mcy9vY2ZzMi9vY2ZzMl9sb2NraWQuaAppbmRleCA0ZDVkNTY1Li40Y2EwMmIxIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9vY2ZzMl9sb2NraWQuaAorKysgYi9mcy9vY2ZzMi9vY2ZzMl9sb2NraWQuaApAQCAtNDQsNiArNDQsNyBAQAogCU9DRlMyX0xPQ0tfVFlQRV9SRU5BTUUsCiAJT0NGUzJfTE9DS19UWVBFX1JXLAogCU9DRlMyX0xPQ0tfVFlQRV9ERU5UUlksCisJT0NGUzJfTE9DS19UWVBFX09QRU4sCiAJT0NGUzJfTlVNX0xPQ0tfVFlQRVMKIH07CiAKQEAgLTY5LDYgKzcwLDkgQEAKIAkJY2FzZSBPQ0ZTMl9MT0NLX1RZUEVfREVOVFJZOgogCQkJYyA9ICdOJzsKIAkJCWJyZWFrOworCQljYXNlIE9DRlMyX0xPQ0tfVFlQRV9PUEVOOgorCQkJYyA9ICdPJzsKKwkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJYyA9ICdcMCc7CiAJfQpAQCAtODUsNiArODksNyBAQAogCSAqIGltcG9ydGFudCBqb2IgaXQgZG9lcywgYW55d2F5LiAqLwogCVtPQ0ZTMl9MT0NLX1RZUEVfUlddID0gIldyaXRlL1JlYWQiLAogCVtPQ0ZTMl9MT0NLX1RZUEVfREVOVFJZXSA9ICJEZW50cnkiLAorCVtPQ0ZTMl9MT0NLX1RZUEVfT1BFTl0gPSAiT3BlbiIsCiB9OwogCiBzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKm9jZnMyX2xvY2tfdHlwZV9zdHJpbmcoZW51bSBvY2ZzMl9sb2NrX3R5cGUgdHlwZSkKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL3Nsb3RfbWFwLmMgYi9mcy9vY2ZzMi9zbG90X21hcC5jCmluZGV4IDJkM2FjMzIuLmQ5MjFhMjggMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL3Nsb3RfbWFwLmMKKysrIGIvZnMvb2NmczIvc2xvdF9tYXAuYwpAQCAtMTk3LDcgKzE5Nyw3IEBACiAJCWdvdG8gYmFpbDsKIAl9CiAKLQlzdGF0dXMgPSBvY2ZzMl9leHRlbnRfbWFwX2dldF9ibG9ja3MoaW5vZGUsIDBVTEwsIDEsICZibGtubywgTlVMTCk7CisJc3RhdHVzID0gb2NmczJfZXh0ZW50X21hcF9nZXRfYmxvY2tzKGlub2RlLCAwVUxMLCAmYmxrbm8sIE5VTEwsIE5VTEwpOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJZ290byBiYWlsOwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvc3ViYWxsb2MuYyBiL2ZzL29jZnMyL3N1YmFsbG9jLmMKaW5kZXggNmRiYjExNy4uMGRhNjU1YSAxMDA2NDQKLS0tIGEvZnMvb2NmczIvc3ViYWxsb2MuYworKysgYi9mcy9vY2ZzMi9zdWJhbGxvYy5jCkBAIC0zODEsOCArMzgxLDcgQEAKIAkJCQkJICAgICBsZTMyX3RvX2NwdShmZS0+aV9jbHVzdGVycykpKTsKIAlzcGluX3VubG9jaygmT0NGUzJfSShhbGxvY19pbm9kZSktPmlwX2xvY2spOwogCWlfc2l6ZV93cml0ZShhbGxvY19pbm9kZSwgbGU2NF90b19jcHUoZmUtPmlfc2l6ZSkpOwotCWFsbG9jX2lub2RlLT5pX2Jsb2NrcyA9Ci0JCW9jZnMyX2FsaWduX2J5dGVzX3RvX3NlY3RvcnMoaV9zaXplX3JlYWQoYWxsb2NfaW5vZGUpKTsKKwlhbGxvY19pbm9kZS0+aV9ibG9ja3MgPSBvY2ZzMl9pbm9kZV9zZWN0b3JfY291bnQoYWxsb2NfaW5vZGUpOwogCiAJc3RhdHVzID0gMDsKIGJhaWw6CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9zdXBlci5jIGIvZnMvb2NmczIvc3VwZXIuYwppbmRleCA2NTM0ZjkyLi41YzllODI0IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9zdXBlci5jCisrKyBiL2ZzL29jZnMyL3N1cGVyLmMKQEAgLTgwNiw5ICs4MDYsNiBAQAogCiAJb2NmczJfcHJpbnRfdmVyc2lvbigpOwogCi0JaWYgKGluaXRfb2NmczJfZXh0ZW50X21hcHMoKSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KIAlzdGF0dXMgPSBpbml0X29jZnMyX3VwdG9kYXRlX2NhY2hlKCk7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwpAQCAtODM3LDcgKzgzNCw2IEBACiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJb2NmczJfZnJlZV9tZW1fY2FjaGVzKCk7CiAJCWV4aXRfb2NmczJfdXB0b2RhdGVfY2FjaGUoKTsKLQkJZXhpdF9vY2ZzMl9leHRlbnRfbWFwcygpOwogCX0KIAogCW1sb2dfZXhpdChzdGF0dXMpOwpAQCAtODYzLDggKzg1OSw2IEBACiAKIAl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJm9jZnMyX2ZzX3R5cGUpOwogCi0JZXhpdF9vY2ZzMl9leHRlbnRfbWFwcygpOwotCiAJZXhpdF9vY2ZzMl91cHRvZGF0ZV9jYWNoZSgpOwogCiAJbWxvZ19leGl0X3ZvaWQoKTsKQEAgLTk2Myw2ICs5NTcsNyBAQAogCQlvY2ZzMl9sb2NrX3Jlc19pbml0X29uY2UoJm9pLT5pcF9yd19sb2NrcmVzKTsKIAkJb2NmczJfbG9ja19yZXNfaW5pdF9vbmNlKCZvaS0+aXBfbWV0YV9sb2NrcmVzKTsKIAkJb2NmczJfbG9ja19yZXNfaW5pdF9vbmNlKCZvaS0+aXBfZGF0YV9sb2NrcmVzKTsKKwkJb2NmczJfbG9ja19yZXNfaW5pdF9vbmNlKCZvaS0+aXBfb3Blbl9sb2NrcmVzKTsKIAogCQlvY2ZzMl9tZXRhZGF0YV9jYWNoZV9pbml0KCZvaS0+dmZzX2lub2RlKTsKIApkaWZmIC0tZ2l0IGEvZnMvb2NmczIvdm90ZS5jIGIvZnMvb2NmczIvdm90ZS5jCmluZGV4IGYzMGU2M2IuLjRmODJhMmYgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL3ZvdGUuYworKysgYi9mcy9vY2ZzMi92b3RlLmMKQEAgLTYzLDE3ICs2MywxMCBAQAogCV9fYmUzMiBoX25vZGVfbnVtOyAgICAvKiBub2RlIHNlbmRpbmcgdGhpcyBwYXJ0aWN1bGFyIG1lc3NhZ2UuICovCiB9OwogCi0vKiBPQ0ZTMl9NQVhfRklMRU5BTUVfTEVOIGlzIDI1NSBjaGFyYWN0ZXJzLCBidXQgd2Ugd2FudCB0byBhbGlnbiB0aGlzCi0gKiBmb3IgdGhlIG5ldHdvcmsuICovCi0jZGVmaW5lIE9DRlMyX1ZPVEVfRklMRU5BTUVfTEVOIDI1Ngogc3RydWN0IG9jZnMyX3ZvdGVfbXNnCiB7CiAJc3RydWN0IG9jZnMyX21zZ19oZHIgdl9oZHI7Ci0JdW5pb24gewotCQlfX2JlMzIgdl9nZW5lcmljMTsKLQkJX19iZTMyIHZfb3JwaGFuZWRfc2xvdDsJLyogVXNlZCBkdXJpbmcgZGVsZXRlIHZvdGVzICovCi0JCV9fYmUzMiB2X25saW5rOwkJLyogVXNlZCBkdXJpbmcgdW5saW5rIHZvdGVzICovCi0JfSBtZDE7CQkJCS8qIE1lc3NhZ2UgdHlwZSBkZXBlbmRhbnQgMSAqLworCV9fYmUzMiB2X3Jlc2VydmVkMTsKIH07CiAKIC8qIFJlc3BvbnNlcyBhcmUgZ2l2ZW4gdGhlc2UgdmFsdWVzIHRvIG1haW50YWluIGJhY2t3YXJkcwpAQCAtODYsNyArNzksNiBAQAogewogCXN0cnVjdCBvY2ZzMl9tc2dfaGRyIHJfaGRyOwogCV9fYmUzMiByX3Jlc3BvbnNlOwotCV9fYmUzMiByX29ycGhhbmVkX3Nsb3Q7CiB9OwogCiBzdHJ1Y3Qgb2NmczJfdm90ZV93b3JrIHsKQEAgLTk2LDcgKzg4LDYgQEAKIAogZW51bSBvY2ZzMl92b3RlX3JlcXVlc3QgewogCU9DRlMyX1ZPVEVfUkVRX0lOVkFMSUQgPSAwLAotCU9DRlMyX1ZPVEVfUkVRX0RFTEVURSwKIAlPQ0ZTMl9WT1RFX1JFUV9NT1VOVCwKIAlPQ0ZTMl9WT1RFX1JFUV9VTU9VTlQsCiAJT0NGUzJfVk9URV9SRVFfTEFTVApAQCAtMTUxLDEzNSArMTQyLDIzIEBACiAJb2NmczJfbm9kZV9tYXBfc2V0X2JpdChvc2IsICZvc2ItPnVtb3VudF9tYXAsIG5vZGVfbnVtKTsKIH0KIAotdm9pZCBvY2ZzMl9tYXJrX2lub2RlX3JlbW90ZWx5X2RlbGV0ZWQoc3RydWN0IGlub2RlICppbm9kZSkKLXsKLQlzdHJ1Y3Qgb2NmczJfaW5vZGVfaW5mbyAqb2kgPSBPQ0ZTMl9JKGlub2RlKTsKLQotCWFzc2VydF9zcGluX2xvY2tlZCgmb2ktPmlwX2xvY2spOwotCS8qIFdlIHNldCB0aGUgU0tJUF9ERUxFVEUgZmxhZyBvbiB0aGUgaW5vZGUgc28gd2UgZG9uJ3QgdHJ5IHRvCi0JICogZGVsZXRlIGl0IGluIGRlbGV0ZV9pbm9kZSBvdXJzZWx2ZXMsIHRodXMgYXZvaWRpbmcKLQkgKiB1bmVjZXNzYXJ5IGxvY2sgcGluZ2luZy4gSWYgdGhlIG90aGVyIG5vZGUgZmFpbGVkIHRvIHdpcGUKLQkgKiB0aGUgaW5vZGUgYXMgYSByZXN1bHQgb2YgYSBjcmFzaCwgdGhlbiByZWNvdmVyeSB3aWxsIHBpY2sKLQkgKiB1cCB0aGUgc2xhY2suICovCi0Jb2ktPmlwX2ZsYWdzIHw9IE9DRlMyX0lOT0RFX0RFTEVURUR8T0NGUzJfSU5PREVfU0tJUF9ERUxFVEU7Ci19Ci0KLXN0YXRpYyBpbnQgb2NmczJfcHJvY2Vzc19kZWxldGVfcmVxdWVzdChzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJCQlpbnQgKm9ycGhhbmVkX3Nsb3QpCi17Ci0JaW50IHJlc3BvbnNlID0gT0NGUzJfUkVTUE9OU0VfQlVTWTsKLQotCW1sb2coMCwgIkRFTEVURSB2b3RlIG9uIGlub2RlICVsdSwgcmVhZCBsbmtfY250ID0gJXUsIHNsb3QgPSAlZFxuIiwKLQkgICAgIGlub2RlLT5pX2lubywgaW5vZGUtPmlfbmxpbmssICpvcnBoYW5lZF9zbG90KTsKLQotCXNwaW5fbG9jaygmT0NGUzJfSShpbm9kZSktPmlwX2xvY2spOwotCi0JLyogV2hhdGV2ZXIgb3VyIHZvdGUgcmVzcG9uc2UgaXMsIHdlIHdhbnQgdG8gbWFrZSBzdXJlIHRoYXQKLQkgKiB0aGUgb3JwaGFuZWQgc2xvdCBpcyByZWNvcmRlZCBwcm9wZXJseSBvbiB0aGlzIG5vZGUgKmFuZCoKLQkgKiBvbiB0aGUgcmVxdWVzdGluZyBub2RlLiBUZWNobmljYWxseSwgaWYgdGhlIHJlcXVlc3Rpbmcgbm9kZQotCSAqIGRpZCBub3Qga25vdyB3aGljaCBzbG90IHRoZSBpbm9kZSBpcyBvcnBoYW5lZCBpbiBidXQgd2UKLQkgKiByZXNwb25kIHdpdGggQlVTWSBoZSBkb2Vzbid0IGFjdHVhbGx5IG5lZWQgdGhlIG9ycGhhbmVkCi0JICogc2xvdCwgYnV0IGl0IGRvZXNuJ3QgaHVydCB0byBkbyBpdCBoZXJlIGFueXdheS4gKi8KLQlpZiAoKCpvcnBoYW5lZF9zbG90KSAhPSBPQ0ZTMl9JTlZBTElEX1NMT1QpIHsKLQkJbWxvZ19idWdfb25fbXNnKE9DRlMyX0koaW5vZGUpLT5pcF9vcnBoYW5lZF9zbG90ICE9Ci0JCQkJT0NGUzJfSU5WQUxJRF9TTE9UICYmCi0JCQkJT0NGUzJfSShpbm9kZSktPmlwX29ycGhhbmVkX3Nsb3QgIT0KLQkJCQkoKm9ycGhhbmVkX3Nsb3QpLAotCQkJCSJJbm9kZSAlbGx1OiBUaGlzIG5vZGUgdGhpbmtzIGl0J3MgIgotCQkJCSJvcnBoYW5lZCBpbiBzbG90ICVkLCBtZXNzYWdlZCBpdCdzIGluICVkXG4iLAotCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vLAotCQkJCU9DRlMyX0koaW5vZGUpLT5pcF9vcnBoYW5lZF9zbG90LAotCQkJCSpvcnBoYW5lZF9zbG90KTsKLQotCQltbG9nKDAsICJTZXR0aW5nIG9ycGhhbmVkIHNsb3QgZm9yIGlub2RlICVsbHUgdG8gJWRcbiIsCi0JCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8sCi0JCSAgICAgKm9ycGhhbmVkX3Nsb3QpOwotCi0JCU9DRlMyX0koaW5vZGUpLT5pcF9vcnBoYW5lZF9zbG90ID0gKm9ycGhhbmVkX3Nsb3Q7Ci0JfSBlbHNlIHsKLQkJbWxvZygwLCAiU2VuZGluZyBiYWNrIG9ycGhhbmVkIHNsb3QgJWQgZm9yIGlub2RlICVsbHVcbiIsCi0JCSAgICAgT0NGUzJfSShpbm9kZSktPmlwX29ycGhhbmVkX3Nsb3QsCi0JCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8pOwotCi0JCSpvcnBoYW5lZF9zbG90ID0gT0NGUzJfSShpbm9kZSktPmlwX29ycGhhbmVkX3Nsb3Q7Ci0JfQotCi0JLyogdm90ZSBubyBpZiB0aGUgZmlsZSBpcyBzdGlsbCBvcGVuLiAqLwotCWlmIChPQ0ZTMl9JKGlub2RlKS0+aXBfb3Blbl9jb3VudCkgewotCQltbG9nKDAsICJvcGVuIGNvdW50ID0gJXVcbiIsCi0JCSAgICAgT0NGUzJfSShpbm9kZSktPmlwX29wZW5fY291bnQpOwotCQlzcGluX3VubG9jaygmT0NGUzJfSShpbm9kZSktPmlwX2xvY2spOwotCQlnb3RvIGRvbmU7Ci0JfQotCXNwaW5fdW5sb2NrKCZPQ0ZTMl9JKGlub2RlKS0+aXBfbG9jayk7Ci0KLQkvKiBkaXJlY3RvcmllcyBhcmUgYSBiaXQgdWdseS4uLiBXaGF0IGlmIHNvbWVvbmUgaXMgc2l0dGluZyBpbgotCSAqIGl0PyBXZSB3YW50IHRvIG1ha2Ugc3VyZSB0aGUgaW5vZGUgaXMgcmVtb3ZlZCBjb21wbGV0ZWx5IGFzCi0JICogYSByZXN1bHQgb2YgdGhlIGlwdXQgaW4gcHJvY2Vzc192b3RlLiAqLwotCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpICYmIChhdG9taWNfcmVhZCgmaW5vZGUtPmlfY291bnQpICE9IDEpKSB7Ci0JCW1sb2coMCwgImlfY291bnQgPSAldVxuIiwgYXRvbWljX3JlYWQoJmlub2RlLT5pX2NvdW50KSk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlpZiAoZmlsZW1hcF9mZGF0YXdyaXRlKGlub2RlLT5pX21hcHBpbmcpKSB7Ci0JCW1sb2coTUxfRVJST1IsICJDb3VsZCBub3Qgc3luYyBpbm9kZSAlbGx1IGZvciBkZWxldGUhXG4iLAotCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vKTsKLQkJZ290byBkb25lOwotCX0KLQlzeW5jX21hcHBpbmdfYnVmZmVycyhpbm9kZS0+aV9tYXBwaW5nKTsKLQl0cnVuY2F0ZV9pbm9kZV9wYWdlcyhpbm9kZS0+aV9tYXBwaW5nLCAwKTsKLQlvY2ZzMl9leHRlbnRfbWFwX3RydW5jKGlub2RlLCAwKTsKLQotCXNwaW5fbG9jaygmT0NGUzJfSShpbm9kZSktPmlwX2xvY2spOwotCS8qIGRvdWJsZSBjaGVjayBvcGVuIGNvdW50IC0gc29tZW9uZSBtaWdodCBoYXZlIHJhY2VkIHRoaXMKLQkgKiB0aHJlYWQgaW50byBvY2ZzMl9maWxlX29wZW4gd2hpbGUgd2Ugd2VyZSB3cml0aW5nIG91dAotCSAqIGRhdGEuIElmIHdlJ3JlIHRvIGFsbG93IGEgd2lwZSBvZiB0aGlzIGlub2RlIG5vdywgd2UgKm11c3QqCi0JICogaG9sZCB0aGUgc3BpbmxvY2sgdW50aWwgd2UndmUgbWFya2VkIGl0LiAqLwotCWlmIChPQ0ZTMl9JKGlub2RlKS0+aXBfb3Blbl9jb3VudCkgewotCQltbG9nKDAsICJSYWNlZCB0byB3aXBlISBvcGVuIGNvdW50ID0gJXVcbiIsCi0JCSAgICAgT0NGUzJfSShpbm9kZSktPmlwX29wZW5fY291bnQpOwotCQlzcGluX3VubG9jaygmT0NGUzJfSShpbm9kZSktPmlwX2xvY2spOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JLyogTWFyayB0aGUgaW5vZGUgYXMgYmVpbmcgd2lwZWQgZnJvbSBkaXNrLiAqLwotCW9jZnMyX21hcmtfaW5vZGVfcmVtb3RlbHlfZGVsZXRlZChpbm9kZSk7Ci0Jc3Bpbl91bmxvY2soJk9DRlMyX0koaW5vZGUpLT5pcF9sb2NrKTsKLQotCS8qIE5vdCBzdXJlIHRoaXMgaXMgbmVjZXNzYXJ5IGFueW1vcmUuICovCi0JZF9wcnVuZV9hbGlhc2VzKGlub2RlKTsKLQotCS8qIElmIHdlIGdldCBoZXJlLCB0aGVuIHdlJ3JlIHZvdGluZyAneWVzJywgc28gY29tbWl0IHRoZQotCSAqIGRlbGV0ZSBvbiBvdXIgc2lkZS4gKi8KLQlyZXNwb25zZSA9IE9DRlMyX1JFU1BPTlNFX09LOwotZG9uZToKLQlyZXR1cm4gcmVzcG9uc2U7Ci19Ci0KIHN0YXRpYyB2b2lkIG9jZnMyX3Byb2Nlc3Nfdm90ZShzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKIAkJCSAgICAgICBzdHJ1Y3Qgb2NmczJfdm90ZV9tc2cgKm1zZykKIHsKIAlpbnQgbmV0X3N0YXR1cywgdm90ZV9yZXNwb25zZTsKLQlpbnQgb3JwaGFuZWRfc2xvdCA9IDA7Ci0JdW5zaWduZWQgaW50IG5vZGVfbnVtLCBnZW5lcmF0aW9uOworCXVuc2lnbmVkIGludCBub2RlX251bTsKIAl1NjQgYmxrbm87CiAJZW51bSBvY2ZzMl92b3RlX3JlcXVlc3QgcmVxdWVzdDsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gTlVMTDsKIAlzdHJ1Y3Qgb2NmczJfbXNnX2hkciAqaGRyID0gJm1zZy0+dl9oZHI7CiAJc3RydWN0IG9jZnMyX3Jlc3BvbnNlX21zZyByZXNwb25zZTsKIAogCS8qIGRlY29kZSB0aGUgbmV0d29yayBtdW1ibyBqdW1ibyBpbnRvIGxvY2FsIHZhcmlhYmxlcy4gKi8KIAlyZXF1ZXN0ID0gYmUzMl90b19jcHUoaGRyLT5oX3JlcXVlc3QpOwogCWJsa25vID0gYmU2NF90b19jcHUoaGRyLT5oX2Jsa25vKTsKLQlnZW5lcmF0aW9uID0gYmUzMl90b19jcHUoaGRyLT5oX2dlbmVyYXRpb24pOwogCW5vZGVfbnVtID0gYmUzMl90b19jcHUoaGRyLT5oX25vZGVfbnVtKTsKLQlpZiAocmVxdWVzdCA9PSBPQ0ZTMl9WT1RFX1JFUV9ERUxFVEUpCi0JCW9ycGhhbmVkX3Nsb3QgPSBiZTMyX3RvX2NwdShtc2ctPm1kMS52X29ycGhhbmVkX3Nsb3QpOwogCi0JbWxvZygwLCAicHJvY2Vzc2luZyB2b3RlOiByZXF1ZXN0ID0gJXUsIGJsa25vID0gJWxsdSwgIgotCSAgICAgImdlbmVyYXRpb24gPSAldSwgbm9kZV9udW0gPSAldSwgcHJpdjEgPSAldVxuIiwgcmVxdWVzdCwKLQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYmxrbm8sIGdlbmVyYXRpb24sIG5vZGVfbnVtLAotCSAgICAgYmUzMl90b19jcHUobXNnLT5tZDEudl9nZW5lcmljMSkpOworCW1sb2coMCwgInByb2Nlc3Npbmcgdm90ZTogcmVxdWVzdCA9ICV1LCBibGtubyA9ICVsbHUsIG5vZGVfbnVtID0gJXVcbiIsCisJICAgICByZXF1ZXN0LCAodW5zaWduZWQgbG9uZyBsb25nKWJsa25vLCBub2RlX251bSk7CiAKIAlpZiAoIW9jZnMyX2lzX3ZhbGlkX3ZvdGVfcmVxdWVzdChyZXF1ZXN0KSkgewogCQltbG9nKE1MX0VSUk9SLCAiSW52YWxpZCB2b3RlIHJlcXVlc3QgJWQgZnJvbSBub2RlICV1XG4iLApAQCAtMzAyLDUyICsxODEsNiBAQAogCQlicmVhazsKIAl9CiAKLQkvKiBXZSBjYW5ub3QgcHJvY2VzcyB0aGUgcmVtYWluaW5nIG1lc3NhZ2UgdHlwZXMgYmVmb3JlIHdlJ3JlCi0JICogZnVsbHkgbW91bnRlZC4gSXQncyBwZXJmZWN0bHkgc2FmZSBob3dldmVyIHRvIHNlbmQgYSAneWVzJwotCSAqIHJlc3BvbnNlIGFzIHdlIGNhbid0IHBvc3NpYmx5IGhhdmUgYW55IG9mIHRoZSBzdGF0ZSB0aGV5J3JlCi0JICogYXNraW5nIHVzIHRvIG1vZGlmeSB5ZXQuICovCi0JaWYgKGF0b21pY19yZWFkKCZvc2ItPnZvbF9zdGF0ZSkgPT0gVk9MVU1FX0lOSVQpCi0JCWdvdG8gcmVzcG9uZDsKLQotCS8qIElmIHdlIGdldCBoZXJlLCB0aGVuIHRoZSByZXF1ZXN0IGlzIGFnYWluc3QgYW4gaW5vZGUuICovCi0JaW5vZGUgPSBvY2ZzMl9pbG9va3VwX2Zvcl92b3RlKG9zYiwgYmxrbm8sCi0JCQkJICAgICAgIHJlcXVlc3QgPT0gT0NGUzJfVk9URV9SRVFfREVMRVRFKTsKLQotCS8qIE5vdCBmaW5kaW5nIHRoZSBpbm9kZSBpcyBwZXJmZWN0bHkgdmFsaWQgLSBpdCBtZWFucyB3ZSdyZQotCSAqIG5vdCBpbnRlcmVzdGVkIGluIHdoYXQgdGhlIG90aGVyIG5vZGUgaXMgYWJvdXQgdG8gZG8gdG8gaXQKLQkgKiBzbyBpbiB0aG9zZSBjYXNlcyB3ZSBhdXRvbWF0aWNhbGx5IHJlc3BvbmQgd2l0aCBhbgotCSAqIGFmZmlybWF0aXZlLiBDbHVzdGVyIGxvY2tpbmcgZW5zdXJlcyB0aGF0IHdlIHdvbid0IHJhY2UKLQkgKiBpbnRlcmVzdCBpbiB0aGUgaW5vZGUgd2l0aCB0aGlzIHZvdGUgcmVxdWVzdC4gKi8KLQlpZiAoIWlub2RlKQotCQlnb3RvIHJlc3BvbmQ7Ci0KLQkvKiBDaGVjayBnZW5lcmF0aW9uIHZhbHVlcy4gSXQncyBwb3NzaWJsZSBmb3IgdXMgdG8gZ2V0IGEKLQkgKiByZXF1ZXN0IGFnYWluc3QgYSBzdGFsZSBpbm9kZS4gSWYgc28gdGhlbiB3ZSBwcm9jZWVkIGFzIGlmCi0JICogd2UgaGFkIG5vdCBmb3VuZCBhbiBpbm9kZSBpbiB0aGUgZmlyc3QgcGxhY2UuICovCi0JaWYgKGlub2RlLT5pX2dlbmVyYXRpb24gIT0gZ2VuZXJhdGlvbikgewotCQltbG9nKDAsICJnZW5lcmF0aW9uIHBhc3NlZCAldSAhPSBpbm9kZSBnZW5lcmF0aW9uID0gJXUsICIKLQkJICAgICAiaXBfZmxhZ3MgPSAleCwgaXBfYmxrbm8gPSAlbGx1LCBtc2cgJWxsdSwgaV9jb3VudCA9ICV1LCAiCi0JCSAgICAgIm1lc3NhZ2UgdHlwZSA9ICV1XG4iLCBnZW5lcmF0aW9uLCBpbm9kZS0+aV9nZW5lcmF0aW9uLAotCQkgICAgIE9DRlMyX0koaW5vZGUpLT5pcF9mbGFncywKLQkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKU9DRlMyX0koaW5vZGUpLT5pcF9ibGtubywKLQkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKWJsa25vLCBhdG9taWNfcmVhZCgmaW5vZGUtPmlfY291bnQpLAotCQkgICAgIHJlcXVlc3QpOwotCQlpcHV0KGlub2RlKTsKLQkJaW5vZGUgPSBOVUxMOwotCQlnb3RvIHJlc3BvbmQ7Ci0JfQotCi0Jc3dpdGNoIChyZXF1ZXN0KSB7Ci0JY2FzZSBPQ0ZTMl9WT1RFX1JFUV9ERUxFVEU6Ci0JCXZvdGVfcmVzcG9uc2UgPSBvY2ZzMl9wcm9jZXNzX2RlbGV0ZV9yZXF1ZXN0KGlub2RlLAotCQkJCQkJCSAgICAgJm9ycGhhbmVkX3Nsb3QpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQltbG9nKE1MX0VSUk9SLCAibm9kZSAldSwgaW52YWxpZCByZXF1ZXN0OiAldVxuIiwKLQkJICAgICBub2RlX251bSwgcmVxdWVzdCk7Ci0JCXZvdGVfcmVzcG9uc2UgPSBPQ0ZTMl9SRVNQT05TRV9CQURfTVNHOwotCX0KLQogcmVzcG9uZDoKIAkvKiBSZXNwb25zZSBzdHJ1dHVyZSBpcyBzbWFsbCBzbyB3ZSBqdXN0IHB1dCBpdCBvbiB0aGUgc3RhY2sKIAkgKiBhbmQgc3R1ZmYgaXQgaW5saW5lLiAqLwpAQCAtMzU3LDcgKzE5MCw2IEBACiAJcmVzcG9uc2Uucl9oZHIuaF9nZW5lcmF0aW9uID0gaGRyLT5oX2dlbmVyYXRpb247CiAJcmVzcG9uc2Uucl9oZHIuaF9ub2RlX251bSA9IGNwdV90b19iZTMyKG9zYi0+bm9kZV9udW0pOwogCXJlc3BvbnNlLnJfcmVzcG9uc2UgPSBjcHVfdG9fYmUzMih2b3RlX3Jlc3BvbnNlKTsKLQlyZXNwb25zZS5yX29ycGhhbmVkX3Nsb3QgPSBjcHVfdG9fYmUzMihvcnBoYW5lZF9zbG90KTsKIAogCW5ldF9zdGF0dXMgPSBvMm5ldF9zZW5kX21lc3NhZ2UoT0NGUzJfTUVTU0FHRV9UWVBFX1JFU1BPTlNFLAogCQkJCQlvc2ItPm5ldF9rZXksCkBAIC0zNzMsOSArMjA1LDYgQEAKIAkgICAgJiYgbmV0X3N0YXR1cyAhPSAtRU5PVENPTk4pCiAJCW1sb2coTUxfRVJST1IsICJtZXNzYWdlIHRvIG5vZGUgJXUgZmFpbHMgd2l0aCBlcnJvciAlZCFcbiIsCiAJCSAgICAgbm9kZV9udW0sIG5ldF9zdGF0dXMpOwotCi0JaWYgKGlub2RlKQotCQlpcHV0KGlub2RlKTsKIH0KIAogc3RhdGljIHZvaWQgb2NmczJfdm90ZV90aHJlYWRfZG9fd29yayhzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYikKQEAgLTYzNCw4ICs0NjMsNyBAQAogc3RhdGljIHN0cnVjdCBvY2ZzMl92b3RlX21zZyAqIG9jZnMyX25ld192b3RlX3JlcXVlc3Qoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCiAJCQkJCQkgICAgICB1NjQgYmxrbm8sCiAJCQkJCQkgICAgICB1bnNpZ25lZCBpbnQgZ2VuZXJhdGlvbiwKLQkJCQkJCSAgICAgIGVudW0gb2NmczJfdm90ZV9yZXF1ZXN0IHR5cGUsCi0JCQkJCQkgICAgICB1MzIgcHJpdikKKwkJCQkJCSAgICAgIGVudW0gb2NmczJfdm90ZV9yZXF1ZXN0IHR5cGUpCiB7CiAJc3RydWN0IG9jZnMyX3ZvdGVfbXNnICpyZXF1ZXN0OwogCXN0cnVjdCBvY2ZzMl9tc2dfaGRyICpoZHI7CkBAIC02NTEsOCArNDc5LDYgQEAKIAkJaGRyLT5oX3JlcXVlc3QgPSBjcHVfdG9fYmUzMih0eXBlKTsKIAkJaGRyLT5oX2Jsa25vID0gY3B1X3RvX2JlNjQoYmxrbm8pOwogCQloZHItPmhfZ2VuZXJhdGlvbiA9IGNwdV90b19iZTMyKGdlbmVyYXRpb24pOwotCi0JCXJlcXVlc3QtPm1kMS52X2dlbmVyaWMxID0gY3B1X3RvX2JlMzIocHJpdik7CiAJfQogCiAJcmV0dXJuIHJlcXVlc3Q7CkBAIC02NjQsNyArNDkwLDcgQEAKIAkJCQkgc3RydWN0IG9jZnMyX3ZvdGVfbXNnICpyZXF1ZXN0LAogCQkJCSBzdHJ1Y3Qgb2NmczJfbmV0X3Jlc3BvbnNlX2NiICpjYWxsYmFjaykKIHsKLQlpbnQgc3RhdHVzLCByZXNwb25zZTsKKwlpbnQgc3RhdHVzLCByZXNwb25zZSA9IC1FQlVTWTsKIAl1bnNpZ25lZCBpbnQgcmVzcG9uc2VfaWQ7CiAJc3RydWN0IG9jZnMyX21zZ19oZHIgKmhkcjsKIApAQCAtNjg2LDEwOSArNTEyLDEyIEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdGljIGludCBvY2ZzMl9yZXF1ZXN0X3ZvdGUoc3RydWN0IGlub2RlICppbm9kZSwKLQkJCSAgICAgIHN0cnVjdCBvY2ZzMl92b3RlX21zZyAqcmVxdWVzdCwKLQkJCSAgICAgIHN0cnVjdCBvY2ZzMl9uZXRfcmVzcG9uc2VfY2IgKmNhbGxiYWNrKQotewotCWludCBzdGF0dXM7Ci0Jc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihpbm9kZS0+aV9zYik7Ci0KLQlpZiAob2NmczJfaW5vZGVfaXNfbmV3KGlub2RlKSkKLQkJcmV0dXJuIDA7Ci0KLQlzdGF0dXMgPSAtRUFHQUlOOwotCXdoaWxlIChzdGF0dXMgPT0gLUVBR0FJTikgewotCQlpZiAoIShvc2ItPnNfbW91bnRfb3B0ICYgT0NGUzJfTU9VTlRfTk9JTlRSKSAmJgotCQkgICAgc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCi0JCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwotCi0JCXN0YXR1cyA9IG9jZnMyX3N1cGVyX2xvY2sob3NiLCAwKTsKLQkJaWYgKHN0YXR1cyA8IDApIHsKLQkJCW1sb2dfZXJybm8oc3RhdHVzKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJc3RhdHVzID0gMDsKLQkJaWYgKCFvY2ZzMl9ub2RlX21hcF9pc19vbmx5KG9zYiwgJm9zYi0+bW91bnRlZF9tYXAsCi0JCQkJCSAgIG9zYi0+bm9kZV9udW0pKQotCQkJc3RhdHVzID0gb2NmczJfZG9fcmVxdWVzdF92b3RlKG9zYiwgcmVxdWVzdCwgY2FsbGJhY2spOwotCi0JCW9jZnMyX3N1cGVyX3VubG9jayhvc2IsIDApOwotCX0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgdm9pZCBvY2ZzMl9kZWxldGVfcmVzcG9uc2VfY2Iodm9pZCAqcHJpdiwKLQkJCQkgICAgIHN0cnVjdCBvY2ZzMl9yZXNwb25zZV9tc2cgKnJlc3ApCi17Ci0JaW50IG9ycGhhbmVkX3Nsb3QsIG5vZGU7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IHByaXY7Ci0KLQlvcnBoYW5lZF9zbG90ID0gYmUzMl90b19jcHUocmVzcC0+cl9vcnBoYW5lZF9zbG90KTsKLQlub2RlID0gYmUzMl90b19jcHUocmVzcC0+cl9oZHIuaF9ub2RlX251bSk7Ci0JbWxvZygwLCAibm9kZSAlZCB0ZWxscyB1cyB0aGF0IGlub2RlICVsbHUgaXMgb3JwaGFuZWQgaW4gc2xvdCAlZFxuIiwKLQkgICAgIG5vZGUsICh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vLAotCSAgICAgb3JwaGFuZWRfc2xvdCk7Ci0KLQkvKiBUaGUgb3RoZXIgbm9kZSBtYXkgbm90IGFjdHVhbGx5IGtub3cgd2hpY2ggc2xvdCB0aGUgaW5vZGUKLQkgKiBpcyBvcnBoYW5lZCBpbi4gKi8KLQlpZiAob3JwaGFuZWRfc2xvdCA9PSBPQ0ZTMl9JTlZBTElEX1NMT1QpCi0JCXJldHVybjsKLQotCS8qIE9rLCB0aGUgcmVzcG9uZGluZyBub2RlIGtub3dzIHdoaWNoIHNsb3QgdGhpcyBpbm9kZSBpcwotCSAqIG9ycGhhbmVkIGluLiBXZSB2ZXJpZnkgdGhhdCB0aGUgaW5mb3JtYXRpb24gaXMgY29ycmVjdCBhbmQKLQkgKiB0aGVuIHJlY29yZCB0aGlzIGluIHRoZSBpbm9kZS4gb2NmczJfZGVsZXRlX2lub2RlIHdpbGwgdXNlCi0JICogdGhpcyBpbmZvcm1hdGlvbiB0byBkZXRlcm1pbmUgd2hpY2ggbG9jayB0byB0YWtlLiAqLwotCXNwaW5fbG9jaygmT0NGUzJfSShpbm9kZSktPmlwX2xvY2spOwotCW1sb2dfYnVnX29uX21zZyhPQ0ZTMl9JKGlub2RlKS0+aXBfb3JwaGFuZWRfc2xvdCAhPSBvcnBoYW5lZF9zbG90ICYmCi0JCQlPQ0ZTMl9JKGlub2RlKS0+aXBfb3JwaGFuZWRfc2xvdAotCQkJIT0gT0NGUzJfSU5WQUxJRF9TTE9ULCAiSW5vZGUgJWxsdTogTm9kZSAlZCBzYXlzIGl0J3MgIgotCQkJIm9ycGhhbmVkIGluIHNsb3QgJWQsIHdlIHRoaW5rIGl0J3MgaW4gJWRcbiIsCi0JCQkodW5zaWduZWQgbG9uZyBsb25nKU9DRlMyX0koaW5vZGUpLT5pcF9ibGtubywKLQkJCWJlMzJfdG9fY3B1KHJlc3AtPnJfaGRyLmhfbm9kZV9udW0pLAotCQkJb3JwaGFuZWRfc2xvdCwgT0NGUzJfSShpbm9kZSktPmlwX29ycGhhbmVkX3Nsb3QpOwotCi0JT0NGUzJfSShpbm9kZSktPmlwX29ycGhhbmVkX3Nsb3QgPSBvcnBoYW5lZF9zbG90OwotCXNwaW5fdW5sb2NrKCZPQ0ZTMl9JKGlub2RlKS0+aXBfbG9jayk7Ci19Ci0KLWludCBvY2ZzMl9yZXF1ZXN0X2RlbGV0ZV92b3RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCi17Ci0JaW50IG9ycGhhbmVkX3Nsb3QsIHN0YXR1czsKLQlzdHJ1Y3Qgb2NmczJfbmV0X3Jlc3BvbnNlX2NiIGRlbGV0ZV9jYjsKLQlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKTsKLQlzdHJ1Y3Qgb2NmczJfdm90ZV9tc2cgKnJlcXVlc3Q7Ci0KLQlzcGluX2xvY2soJk9DRlMyX0koaW5vZGUpLT5pcF9sb2NrKTsKLQlvcnBoYW5lZF9zbG90ID0gT0NGUzJfSShpbm9kZSktPmlwX29ycGhhbmVkX3Nsb3Q7Ci0Jc3Bpbl91bmxvY2soJk9DRlMyX0koaW5vZGUpLT5pcF9sb2NrKTsKLQotCWRlbGV0ZV9jYi5yY19jYiA9IG9jZnMyX2RlbGV0ZV9yZXNwb25zZV9jYjsKLQlkZWxldGVfY2IucmNfcHJpdiA9IGlub2RlOwotCi0JbWxvZygwLCAiSW5vZGUgJWxsdSwgd2Ugc3RhcnQgdGhpbmtpbmcgb3JwaGFuZWQgc2xvdCBpcyAlZFxuIiwKLQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vLCBvcnBoYW5lZF9zbG90KTsKLQotCXN0YXR1cyA9IC1FTk9NRU07Ci0JcmVxdWVzdCA9IG9jZnMyX25ld192b3RlX3JlcXVlc3Qob3NiLCBPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8sCi0JCQkJCSBpbm9kZS0+aV9nZW5lcmF0aW9uLAotCQkJCQkgT0NGUzJfVk9URV9SRVFfREVMRVRFLCBvcnBoYW5lZF9zbG90KTsKLQlpZiAocmVxdWVzdCkgewotCQlzdGF0dXMgPSBvY2ZzMl9yZXF1ZXN0X3ZvdGUoaW5vZGUsIHJlcXVlc3QsICZkZWxldGVfY2IpOwotCi0JCWtmcmVlKHJlcXVlc3QpOwotCX0KLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KIGludCBvY2ZzMl9yZXF1ZXN0X21vdW50X3ZvdGUoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IpCiB7CiAJaW50IHN0YXR1czsKIAlzdHJ1Y3Qgb2NmczJfdm90ZV9tc2cgKnJlcXVlc3QgPSBOVUxMOwogCi0JcmVxdWVzdCA9IG9jZnMyX25ld192b3RlX3JlcXVlc3Qob3NiLCAwVUxMLCAwLAotCQkJCQkgT0NGUzJfVk9URV9SRVFfTU9VTlQsIDApOworCXJlcXVlc3QgPSBvY2ZzMl9uZXdfdm90ZV9yZXF1ZXN0KG9zYiwgMFVMTCwgMCwgT0NGUzJfVk9URV9SRVFfTU9VTlQpOwogCWlmICghcmVxdWVzdCkgewogCQlzdGF0dXMgPSAtRU5PTUVNOwogCQlnb3RvIGJhaWw7CkBAIC04MjEsOCArNTUwLDcgQEAKIAlpbnQgc3RhdHVzOwogCXN0cnVjdCBvY2ZzMl92b3RlX21zZyAqcmVxdWVzdCA9IE5VTEw7CiAKLQlyZXF1ZXN0ID0gb2NmczJfbmV3X3ZvdGVfcmVxdWVzdChvc2IsIDBVTEwsIDAsCi0JCQkJCSBPQ0ZTMl9WT1RFX1JFUV9VTU9VTlQsIDApOworCXJlcXVlc3QgPSBvY2ZzMl9uZXdfdm90ZV9yZXF1ZXN0KG9zYiwgMFVMTCwgMCwgT0NGUzJfVk9URV9SRVFfVU1PVU5UKTsKIAlpZiAoIXJlcXVlc3QpIHsKIAkJc3RhdHVzID0gLUVOT01FTTsKIAkJZ290byBiYWlsOwpAQCAtOTY5LDcgKzY5Nyw2IEBACiAJICAgICBiZTMyX3RvX2NwdSh3b3JrLT53X21zZy52X2hkci5oX2dlbmVyYXRpb24pKTsKIAltbG9nKDAsICJoX25vZGVfbnVtID0gJXVcbiIsCiAJICAgICBiZTMyX3RvX2NwdSh3b3JrLT53X21zZy52X2hkci5oX25vZGVfbnVtKSk7Ci0JbWxvZygwLCAidl9nZW5lcmljMSA9ICV1XG4iLCBiZTMyX3RvX2NwdSh3b3JrLT53X21zZy5tZDEudl9nZW5lcmljMSkpOwogCiAJc3Bpbl9sb2NrKCZvc2ItPnZvdGVfdGFza19sb2NrKTsKIAlsaXN0X2FkZF90YWlsKCZ3b3JrLT53X2xpc3QsICZvc2ItPnZvdGVfbGlzdCk7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi92b3RlLmggYi9mcy9vY2ZzMi92b3RlLmgKaW5kZXggNTNlYmMxYzYuLjllYTQ2ZjYgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL3ZvdGUuaAorKysgYi9mcy9vY2ZzMi92b3RlLmgKQEAgLTM4LDE0ICszOCwxMSBAQAogCXdha2VfdXAoJm9zYi0+dm90ZV9ldmVudCk7CiB9CiAKLWludCBvY2ZzMl9yZXF1ZXN0X2RlbGV0ZV92b3RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpOwogaW50IG9jZnMyX3JlcXVlc3RfbW91bnRfdm90ZShzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYik7CiBpbnQgb2NmczJfcmVxdWVzdF91bW91bnRfdm90ZShzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYik7CiBpbnQgb2NmczJfcmVnaXN0ZXJfbmV0X2hhbmRsZXJzKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiKTsKIHZvaWQgb2NmczJfdW5yZWdpc3Rlcl9uZXRfaGFuZGxlcnMoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IpOwogCi12b2lkIG9jZnMyX21hcmtfaW5vZGVfcmVtb3RlbHlfZGVsZXRlZChzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKLQogdm9pZCBvY2ZzMl9yZW1vdmVfbm9kZV9mcm9tX3ZvdGVfcXVldWVzKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAogCQkJCQlpbnQgbm9kZV9udW0pOwogI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9wcm9jL3Byb2NfZGV2dHJlZS5jIGIvZnMvcHJvYy9wcm9jX2RldnRyZWUuYwppbmRleCBhYmRmMDY4Li5lY2E0NzFiYyAxMDA2NDQKLS0tIGEvZnMvcHJvYy9wcm9jX2RldnRyZWUuYworKysgYi9mcy9wcm9jL3Byb2NfZGV2dHJlZS5jCkBAIC0zOCw3ICszOCw3IEBACiAJCW4gPSBjb3VudDsKIAllbHNlCiAJCSplb2YgPSAxOwotCW1lbWNweShwYWdlLCBwcC0+dmFsdWUgKyBvZmYsIG4pOworCW1lbWNweShwYWdlLCAoY2hhciAqKXBwLT52YWx1ZSArIG9mZiwgbik7CiAJKnN0YXJ0ID0gcGFnZTsKIAlyZXR1cm4gbjsKIH0KZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL3hhdHRyLmMgYi9mcy9yZWlzZXJmcy94YXR0ci5jCmluZGV4IGM4MTc4YjcuLjJjYWM1NjIgMTAwNjQ0Ci0tLSBhL2ZzL3JlaXNlcmZzL3hhdHRyLmMKKysrIGIvZnMvcmVpc2VyZnMveGF0dHIuYwpAQCAtNjgsNyArNjgsNyBAQAogCWlmICghcHJpdnJvb3QpCiAJCXJldHVybiBFUlJfUFRSKC1FTk9EQVRBKTsKIAotCW11dGV4X2xvY2soJnByaXZyb290LT5kX2lub2RlLT5pX211dGV4KTsKKwltdXRleF9sb2NrX25lc3RlZCgmcHJpdnJvb3QtPmRfaW5vZGUtPmlfbXV0ZXgsIElfTVVURVhfWEFUVFIpOwogCWlmIChSRUlTRVJGU19TQihzYiktPnhhdHRyX3Jvb3QpIHsKIAkJeGFyb290ID0gZGdldChSRUlTRVJGU19TQihzYiktPnhhdHRyX3Jvb3QpOwogCQlnb3RvIG91dDsKZGlmZiAtLWdpdCBhL2ZzL3N1cGVyLmMgYi9mcy9zdXBlci5jCmluZGV4IDYwYjFlNTAuLjgzNDFlNGUgMTAwNjQ0Ci0tLSBhL2ZzL3N1cGVyLmMKKysrIGIvZnMvc3VwZXIuYwpAQCAtNzI1LDE2ICs3MjUsNiBAQAogCXJldHVybiAodm9pZCAqKXMtPnNfYmRldiA9PSBkYXRhOwogfQogCi1zdGF0aWMgdm9pZCBiZGV2X3VldmVudChzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBlbnVtIGtvYmplY3RfYWN0aW9uIGFjdGlvbikKLXsKLQlpZiAoYmRldi0+YmRfZGlzaykgewotCQlpZiAoYmRldi0+YmRfcGFydCkKLQkJCWtvYmplY3RfdWV2ZW50KCZiZGV2LT5iZF9wYXJ0LT5rb2JqLCBhY3Rpb24pOwotCQllbHNlCi0JCQlrb2JqZWN0X3VldmVudCgmYmRldi0+YmRfZGlzay0+a29iaiwgYWN0aW9uKTsKLQl9Ci19Ci0KIGludCBnZXRfc2JfYmRldihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKIAlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhLAogCWludCAoKmZpbGxfc3VwZXIpKHN0cnVjdCBzdXBlcl9ibG9jayAqLCB2b2lkICosIGludCksCkBAIC03ODIsNyArNzcyLDYgQEAKIAkJfQogCiAJCXMtPnNfZmxhZ3MgfD0gTVNfQUNUSVZFOwotCQliZGV2X3VldmVudChiZGV2LCBLT0JKX01PVU5UKTsKIAl9CiAKIAlyZXR1cm4gc2ltcGxlX3NldF9tbnQobW50LCBzKTsKQEAgLTgwMSw3ICs3OTAsNiBAQAogewogCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYgPSBzYi0+c19iZGV2OwogCi0JYmRldl91ZXZlbnQoYmRldiwgS09CSl9VTU9VTlQpOwogCWdlbmVyaWNfc2h1dGRvd25fc3VwZXIoc2IpOwogCXN5bmNfYmxvY2tkZXYoYmRldik7CiAJY2xvc2VfYmRldl9leGNsKGJkZXYpOwpkaWZmIC0tZ2l0IGEvZnMvc3luYy5jIGIvZnMvc3luYy5jCmluZGV4IGQwZmVmZjYuLjVjYjllN2UgMTAwNjQ0Ci0tLSBhL2ZzL3N5bmMuYworKysgYi9mcy9zeW5jLmMKQEAgLTIzOSwxMyArMjM5LDExIEBACiAvKgogICogYGVuZGJ5dGUnIGlzIGluY2x1c2l2ZQogICovCi1pbnQgZG9fc3luY19maWxlX3JhbmdlKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3Qgb2Zmc2V0LCBsb2ZmX3QgZW5kYnl0ZSwKLQkJCXVuc2lnbmVkIGludCBmbGFncykKK2ludCBkb19zeW5jX21hcHBpbmdfcmFuZ2Uoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIGxvZmZfdCBvZmZzZXQsCisJCQkgIGxvZmZfdCBlbmRieXRlLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCiB7CiAJaW50IHJldDsKLQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZzsKIAotCW1hcHBpbmcgPSBmaWxlLT5mX21hcHBpbmc7CiAJaWYgKCFtYXBwaW5nKSB7CiAJCXJldCA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0OwpAQCAtMjc1LDQgKzI3Myw0IEBACiBvdXQ6CiAJcmV0dXJuIHJldDsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKGRvX3N5bmNfZmlsZV9yYW5nZSk7CitFWFBPUlRfU1lNQk9MX0dQTChkb19zeW5jX21hcHBpbmdfcmFuZ2UpOwpkaWZmIC0tZ2l0IGEvZnMvc3lzZnMvYmluLmMgYi9mcy9zeXNmcy9iaW4uYwppbmRleCBkM2I5ZjVmLi44ZWEyYTUxIDEwMDY0NAotLS0gYS9mcy9zeXNmcy9iaW4uYworKysgYi9mcy9zeXNmcy9iaW4uYwpAQCAtNTksNyArNTksNyBAQAogCWlmIChjb3B5X3RvX3VzZXIodXNlcmJ1ZiwgYnVmZmVyLCBjb3VudCkpCiAJCXJldHVybiAtRUZBVUxUOwogCi0JcHJfZGVidWcoIm9mZnMgPSAlbGxkLCAqb2ZmID0gJWxsZCwgY291bnQgPSAlemRcbiIsIG9mZnMsICpvZmYsIGNvdW50KTsKKwlwcl9kZWJ1Zygib2ZmcyA9ICVsbGQsICpvZmYgPSAlbGxkLCBjb3VudCA9ICVkXG4iLCBvZmZzLCAqb2ZmLCBjb3VudCk7CiAKIAkqb2ZmID0gb2ZmcyArIGNvdW50OwogCmRpZmYgLS1naXQgYS9mcy9zeXNmcy9maWxlLmMgYi9mcy9zeXNmcy9maWxlLmMKaW5kZXggZmM0NjMzMy4uZGIwNDEzYSAxMDA2NDQKLS0tIGEvZnMvc3lzZnMvZmlsZS5jCisrKyBiL2ZzL3N5c2ZzL2ZpbGUuYwpAQCAtNjMzLDYgKzYzMyw3IEBACiAJc3RydWN0IGtvYmplY3QgCQkqa29iajsKIAl2b2lkCQkJKCpmdW5jKSh2b2lkICopOwogCXZvaWQJCQkqZGF0YTsKKwlzdHJ1Y3QgbW9kdWxlCQkqb3duZXI7CiAJc3RydWN0IHdvcmtfc3RydWN0CXdvcms7CiB9OwogCkBAIC02NDMsNiArNjQ0LDcgQEAKIAogCShzcy0+ZnVuYykoc3MtPmRhdGEpOwogCWtvYmplY3RfcHV0KHNzLT5rb2JqKTsKKwltb2R1bGVfcHV0KHNzLT5vd25lcik7CiAJa2ZyZWUoc3MpOwogfQogCkBAIC02NTEsNiArNjUzLDcgQEAKICAqIEBrb2JqOiBvYmplY3Qgd2UncmUgYWN0aW5nIGZvci4KICAqIEBmdW5jOiBjYWxsYmFjayBmdW5jdGlvbiB0byBpbnZva2UgbGF0ZXIuCiAgKiBAZGF0YTogYXJndW1lbnQgdG8gcGFzcyB0byBAZnVuYy4KKyAqIEBvd25lcjogbW9kdWxlIG93bmluZyB0aGUgY2FsbGJhY2sgY29kZQogICoKICAqIHN5c2ZzIGF0dHJpYnV0ZSBtZXRob2RzIG11c3Qgbm90IHVucmVnaXN0ZXIgdGhlbXNlbHZlcyBvciB0aGVpciBwYXJlbnQKICAqIGtvYmplY3QgKHdoaWNoIHdvdWxkIGFtb3VudCB0byB0aGUgc2FtZSB0aGluZykuICBBdHRlbXB0cyB0byBkbyBzbyB3aWxsCkBAIC02NjMsMjAgKzY2NiwyNSBAQAogICogdW50aWwgQGZ1bmMgcmV0dXJucy4KICAqCiAgKiBSZXR1cm5zIDAgaWYgdGhlIHJlcXVlc3Qgd2FzIHN1Ym1pdHRlZCwgLUVOT01FTSBpZiBzdG9yYWdlIGNvdWxkIG5vdAotICogYmUgYWxsb2NhdGVkLgorICogYmUgYWxsb2NhdGVkLCAtRU5PREVWIGlmIGEgcmVmZXJlbmNlIHRvIEBvd25lciBpc24ndCBhdmFpbGFibGUuCiAgKi8KIGludCBzeXNmc19zY2hlZHVsZV9jYWxsYmFjayhzdHJ1Y3Qga29iamVjdCAqa29iaiwgdm9pZCAoKmZ1bmMpKHZvaWQgKiksCi0JCXZvaWQgKmRhdGEpCisJCXZvaWQgKmRhdGEsIHN0cnVjdCBtb2R1bGUgKm93bmVyKQogewogCXN0cnVjdCBzeXNmc19zY2hlZHVsZV9jYWxsYmFja19zdHJ1Y3QgKnNzOwogCisJaWYgKCF0cnlfbW9kdWxlX2dldChvd25lcikpCisJCXJldHVybiAtRU5PREVWOwogCXNzID0ga21hbGxvYyhzaXplb2YoKnNzKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFzcykKKwlpZiAoIXNzKSB7CisJCW1vZHVsZV9wdXQob3duZXIpOwogCQlyZXR1cm4gLUVOT01FTTsKKwl9CiAJa29iamVjdF9nZXQoa29iaik7CiAJc3MtPmtvYmogPSBrb2JqOwogCXNzLT5mdW5jID0gZnVuYzsKIAlzcy0+ZGF0YSA9IGRhdGE7CisJc3MtPm93bmVyID0gb3duZXI7CiAJSU5JVF9XT1JLKCZzcy0+d29yaywgc3lzZnNfc2NoZWR1bGVfY2FsbGJhY2tfd29yayk7CiAJc2NoZWR1bGVfd29yaygmc3MtPndvcmspOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZnMvc3lzZnMvZ3JvdXAuYyBiL2ZzL3N5c2ZzL2dyb3VwLmMKaW5kZXggYjIwOTUxYy4uNTJlZWQyYSAxMDA2NDQKLS0tIGEvZnMvc3lzZnMvZ3JvdXAuYworKysgYi9mcy9zeXNmcy9ncm91cC5jCkBAIC03MCw5ICs3MCwxMSBAQAogewogCXN0cnVjdCBkZW50cnkgKiBkaXI7CiAKLQlpZiAoZ3JwLT5uYW1lKQotCQlkaXIgPSBsb29rdXBfb25lX2xlbihncnAtPm5hbWUsIGtvYmotPmRlbnRyeSwKKwlpZiAoZ3JwLT5uYW1lKSB7CisJCWRpciA9IGxvb2t1cF9vbmVfbGVuX2tlcm4oZ3JwLT5uYW1lLCBrb2JqLT5kZW50cnksCiAJCQkJc3RybGVuKGdycC0+bmFtZSkpOworCQlCVUdfT04oSVNfRVJSKGRpcikpOworCX0KIAllbHNlCiAJCWRpciA9IGRnZXQoa29iai0+ZGVudHJ5KTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjdGJsLmggYi9pbmNsdWRlL2FjcGkvYWN0YmwuaAppbmRleCAwOTQ2OWU3Li45NTVhZGZiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWN0YmwuaAorKysgYi9pbmNsdWRlL2FjcGkvYWN0YmwuaApAQCAtMjc2LDYgKzI3Niw3IEBACiAKICNkZWZpbmUgQkFGX0xFR0FDWV9ERVZJQ0VTICAgICAgICAgICAgICAweDAwMDEKICNkZWZpbmUgQkFGXzgwNDJfS0VZQk9BUkRfQ09OVFJPTExFUiAgICAweDAwMDIKKyNkZWZpbmUgQkFGX01TSV9OT1RfU1VQUE9SVEVEICAgICAgICAgICAweDAwMDgKIAogI2RlZmluZSBGQURUMl9SRVZJU0lPTl9JRCAgICAgICAgICAgICAgIDMKICNkZWZpbmUgRkFEVDJfTUlOVVNfUkVWSVNJT05fSUQgICAgICAgICAyCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hbHBoYS9zb2NrZXQuaCBiL2luY2x1ZGUvYXNtLWFscGhhL3NvY2tldC5oCmluZGV4IGQyMmFiOTcuLjFmZWRlN2YgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFscGhhL3NvY2tldC5oCisrKyBiL2luY2x1ZGUvYXNtLWFscGhhL3NvY2tldC5oCkBAIC01Miw2ICs1Miw4IEBACiAKICNkZWZpbmUgU09fUEVFUlNFQwkJMzAKICNkZWZpbmUgU09fUEFTU1NFQwkJMzQKKyNkZWZpbmUgU09fVElNRVNUQU1QTlMJCTM1CisjZGVmaW5lIFNDTV9USU1FU1RBTVBOUwkJU09fVElNRVNUQU1QTlMKIAogLyogU2VjdXJpdHkgbGV2ZWxzIC0gYXMgcGVyIE5STCBJUHY2IC0gZG9uJ3QgYWN0dWFsbHkgZG8gYW55dGhpbmcgKi8KICNkZWZpbmUgU09fU0VDVVJJVFlfQVVUSEVOVElDQVRJT04JCTE5CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hbHBoYS9zb2NraW9zLmggYi9pbmNsdWRlL2FzbS1hbHBoYS9zb2NraW9zLmgKaW5kZXggZTQ5NjFhNy4uNzkzMmM3YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYWxwaGEvc29ja2lvcy5oCisrKyBiL2luY2x1ZGUvYXNtLWFscGhhL3NvY2tpb3MuaApAQCAtMTAsNiArMTAsNyBAQAogI2RlZmluZSBTSU9DU1BHUlAJX0lPVygncycsIDgsIHBpZF90KQogI2RlZmluZSBTSU9DR1BHUlAJX0lPUigncycsIDksIHBpZF90KQogCi0jZGVmaW5lIFNJT0NHU1RBTVAJMHg4OTA2CQkvKiBHZXQgc3RhbXAgLSBsaW51eC1zcGVjaWZpYyAqLworI2RlZmluZSBTSU9DR1NUQU1QCTB4ODkwNgkJLyogR2V0IHN0YW1wICh0aW1ldmFsKSAqLworI2RlZmluZSBTSU9DR1NUQU1QTlMJMHg4OTA3CQkvKiBHZXQgc3RhbXAgKHRpbWVzcGVjKSAqLwogCiAjZW5kaWYgLyogX0FTTV9BTFBIQV9TT0NLSU9TX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFscGhhL3N0cmluZy5oIGIvaW5jbHVkZS9hc20tYWxwaGEvc3RyaW5nLmgKaW5kZXggOWU0NGZlYS4uYjAyYjhhMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYWxwaGEvc3RyaW5nLmgKKysrIGIvaW5jbHVkZS9hc20tYWxwaGEvc3RyaW5nLmgKQEAgLTYxLDggKzYxLDYgQEAKICA/IF9fY29uc3RhbnRfY19tZW1zZXQoKHMpLDB4MDAwMTAwMDEwMDAxMDAwMVVMKih1bnNpZ25lZCBzaG9ydCkoYyksKG4pKSBcCiAgOiBfX21lbXNldHcoKHMpLChjKSwobikpKQogCi1leHRlcm4gaW50IHN0cmNhc2VjbXAoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOwotCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogCiAjZW5kaWYgLyogX19BTFBIQV9TVFJJTkdfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vZGl2NjQuaCBiL2luY2x1ZGUvYXNtLWFybS9kaXY2NC5oCmluZGV4IDM3ZTBhOTYuLjBiNWY4ODEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9kaXY2NC5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9kaXY2NC5oCkBAIC0yLDYgKzIsNyBAQAogI2RlZmluZSBfX0FTTV9BUk1fRElWNjQKIAogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogCiAvKgogICogVGhlIHNlbWFudGljcyBvZiBkb19kaXYoKSBhcmU6CkBAIC0yMjMsNCArMjI0LDYgQEAKIAogI2VuZGlmCiAKK2V4dGVybiB1aW50NjRfdCBkaXY2NF82NCh1aW50NjRfdCBkaXZpZGVuZCwgdWludDY0X3QgZGl2aXNvcik7CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL3NvY2tldC5oIGIvaW5jbHVkZS9hc20tYXJtL3NvY2tldC5oCmluZGV4IDE5ZjdkZjcuLjY1YTFhNjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9zb2NrZXQuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vc29ja2V0LmgKQEAgLTQ5LDUgKzQ5LDcgQEAKIAogI2RlZmluZSBTT19QRUVSU0VDCQkzMQogI2RlZmluZSBTT19QQVNTU0VDCQkzNAorI2RlZmluZSBTT19USU1FU1RBTVBOUwkJMzUKKyNkZWZpbmUgU0NNX1RJTUVTVEFNUE5TCQlTT19USU1FU1RBTVBOUwogCiAjZW5kaWYgLyogX0FTTV9TT0NLRVRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL3NvY2tpb3MuaCBiL2luY2x1ZGUvYXNtLWFybS9zb2NraW9zLmgKaW5kZXggNzdjMzQwOC4uYTI1ODhhMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL3NvY2tpb3MuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vc29ja2lvcy5oCkBAIC03LDYgKzcsNyBAQAogI2RlZmluZSBGSU9HRVRPV04JMHg4OTAzCiAjZGVmaW5lIFNJT0NHUEdSUAkweDg5MDQKICNkZWZpbmUgU0lPQ0FUTUFSSwkweDg5MDUKLSNkZWZpbmUgU0lPQ0dTVEFNUAkweDg5MDYJCS8qIEdldCBzdGFtcCAqLworI2RlZmluZSBTSU9DR1NUQU1QCTB4ODkwNgkJLyogR2V0IHN0YW1wICh0aW1ldmFsKSAqLworI2RlZmluZSBTSU9DR1NUQU1QTlMJMHg4OTA3CQkvKiBHZXQgc3RhbXAgKHRpbWVzcGVjKSAqLwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybTI2L3NvY2tldC5oIGIvaW5jbHVkZS9hc20tYXJtMjYvc29ja2V0LmgKaW5kZXggMTlmN2RmNy4uNjVhMWE2NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtMjYvc29ja2V0LmgKKysrIGIvaW5jbHVkZS9hc20tYXJtMjYvc29ja2V0LmgKQEAgLTQ5LDUgKzQ5LDcgQEAKIAogI2RlZmluZSBTT19QRUVSU0VDCQkzMQogI2RlZmluZSBTT19QQVNTU0VDCQkzNAorI2RlZmluZSBTT19USU1FU1RBTVBOUwkJMzUKKyNkZWZpbmUgU0NNX1RJTUVTVEFNUE5TCQlTT19USU1FU1RBTVBOUwogCiAjZW5kaWYgLyogX0FTTV9TT0NLRVRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtMjYvc29ja2lvcy5oIGIvaW5jbHVkZS9hc20tYXJtMjYvc29ja2lvcy5oCmluZGV4IDc3YzM0MDguLmEyNTg4YTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybTI2L3NvY2tpb3MuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0yNi9zb2NraW9zLmgKQEAgLTcsNiArNyw3IEBACiAjZGVmaW5lIEZJT0dFVE9XTgkweDg5MDMKICNkZWZpbmUgU0lPQ0dQR1JQCTB4ODkwNAogI2RlZmluZSBTSU9DQVRNQVJLCTB4ODkwNQotI2RlZmluZSBTSU9DR1NUQU1QCTB4ODkwNgkJLyogR2V0IHN0YW1wICovCisjZGVmaW5lIFNJT0NHU1RBTVAJMHg4OTA2CQkvKiBHZXQgc3RhbXAgKHRpbWV2YWwpICovCisjZGVmaW5lIFNJT0NHU1RBTVBOUwkweDg5MDcJCS8qIEdldCBzdGFtcCAodGltZXNwZWMpICovCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXZyMzIvYXJjaC1hdDMyYXAvaW8uaCBiL2luY2x1ZGUvYXNtLWF2cjMyL2FyY2gtYXQzMmFwL2lvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU1OWU0MAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWF2cjMyL2FyY2gtYXQzMmFwL2lvLmgKQEAgLTAsMCArMSwzOSBAQAorI2lmbmRlZiBfX0FTTV9BVlIzMl9BUkNIX0FUMzJBUF9JT19ICisjZGVmaW5lIF9fQVNNX0FWUjMyX0FSQ0hfQVQzMkFQX0lPX0gKKworLyogRm9yICJiaXphcnJlIiBoYWxmd29yZCBzd2FwcGluZyAqLworI2luY2x1ZGUgPGxpbnV4L2J5dGVvcmRlci9zd2FiYi5oPgorCisjaWYgZGVmaW5lZChDT05GSUdfQVA3MDAwXzMyX0JJVF9TTUMpCisjIGRlZmluZSBfX3N3aXp6bGVfYWRkcl9iKGFkZHIpCShhZGRyIF4gM1VMKQorIyBkZWZpbmUgX19zd2l6emxlX2FkZHJfdyhhZGRyKQkoYWRkciBeIDJVTCkKKyMgZGVmaW5lIF9fc3dpenpsZV9hZGRyX2woYWRkcikJKGFkZHIpCisjIGRlZmluZSBpb3N3YWJiKGEsIHgpCQkoeCkKKyMgZGVmaW5lIGlvc3dhYncoYSwgeCkJCSh4KQorIyBkZWZpbmUgaW9zd2FibChhLCB4KQkJKHgpCisjIGRlZmluZSBfX21lbV9pb3N3YWJiKGEsIHgpCSh4KQorIyBkZWZpbmUgX19tZW1faW9zd2FidyhhLCB4KQlzd2FiMTYoeCkKKyMgZGVmaW5lIF9fbWVtX2lvc3dhYmwoYSwgeCkJc3dhYjMyKHgpCisjZWxpZiBkZWZpbmVkKENPTkZJR19BUDcwMDBfMTZfQklUX1NNQykKKyMgZGVmaW5lIF9fc3dpenpsZV9hZGRyX2IoYWRkcikJKGFkZHIgXiAxVUwpCisjIGRlZmluZSBfX3N3aXp6bGVfYWRkcl93KGFkZHIpCShhZGRyKQorIyBkZWZpbmUgX19zd2l6emxlX2FkZHJfbChhZGRyKQkoYWRkcikKKyMgZGVmaW5lIGlvc3dhYmIoYSwgeCkJCSh4KQorIyBkZWZpbmUgaW9zd2FidyhhLCB4KQkJKHgpCisjIGRlZmluZSBpb3N3YWJsKGEsIHgpCQlzd2FodzMyKHgpCisjIGRlZmluZSBfX21lbV9pb3N3YWJiKGEsIHgpCSh4KQorIyBkZWZpbmUgX19tZW1faW9zd2FidyhhLCB4KQlzd2FiMTYoeCkKKyMgZGVmaW5lIF9fbWVtX2lvc3dhYmwoYSwgeCkJc3dhaGIzMih4KQorI2Vsc2UKKyMgZGVmaW5lIF9fc3dpenpsZV9hZGRyX2IoYWRkcikJKGFkZHIpCisjIGRlZmluZSBfX3N3aXp6bGVfYWRkcl93KGFkZHIpCShhZGRyKQorIyBkZWZpbmUgX19zd2l6emxlX2FkZHJfbChhZGRyKQkoYWRkcikKKyMgZGVmaW5lIGlvc3dhYmIoYSwgeCkJCSh4KQorIyBkZWZpbmUgaW9zd2FidyhhLCB4KQkJc3dhYjE2KHgpCisjIGRlZmluZSBpb3N3YWJsKGEsIHgpCQlzd2FiMzIoeCkKKyMgZGVmaW5lIF9fbWVtX2lvc3dhYmIoYSwgeCkJKHgpCisjIGRlZmluZSBfX21lbV9pb3N3YWJ3KGEsIHgpCSh4KQorIyBkZWZpbmUgX19tZW1faW9zd2FibChhLCB4KQkoeCkKKyNlbmRpZgorCisjZW5kaWYgLyogX19BU01fQVZSMzJfQVJDSF9BVDMyQVBfSU9fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXZyMzIvYXJjaC1hdDMyYXAvc21jLmggYi9pbmNsdWRlL2FzbS1hdnIzMi9hcmNoLWF0MzJhcC9zbWMuaAppbmRleCAzNzMyYjMyLi4wNzE1MmI3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hdnIzMi9hcmNoLWF0MzJhcC9zbWMuaAorKysgYi9pbmNsdWRlL2FzbS1hdnIzMi9hcmNoLWF0MzJhcC9zbWMuaApAQCAtNDgsMTAgKzQ4LDMyIEBACiAJdW5zaWduZWQgaW50CW53ZV9jb250cm9sbGVkOjE7CiAKIAkvKgorCSAqIDA6IE5XQUlUIGlzIGRpc2FibGVkCisJICogMTogUmVzZXJ2ZWQKKwkgKiAyOiBOV0FJVCBpcyBmcm96ZW4gbW9kZQorCSAqIDM6IE5XQUlUIGluIHJlYWR5IG1vZGUKKwkgKi8KKwl1bnNpZ25lZCBpbnQJbndhaXRfbW9kZToyOworCisJLyoKIAkgKiAwOiBCeXRlIHNlbGVjdCBhY2Nlc3MgdHlwZQogCSAqIDE6IEJ5dGUgd3JpdGUgYWNjZXNzIHR5cGUKIAkgKi8KIAl1bnNpZ25lZCBpbnQJYnl0ZV93cml0ZToxOworCisJLyoKKwkgKiBOdW1iZXIgb2YgY2xvY2sgY3ljbGVzIGJlZm9yZSBkYXRhIGlzIHJlbGVhc2VkIGFmdGVyCisJICogdGhlIHJpc2luZyBlZGdlIG9mIHRoZSByZWFkIGNvbnRyb2xsaW5nIHNpZ25hbAorCSAqCisJICogVG90YWwgY3ljbGVzIGZyb20gU01DIGlzIHRkZl9jeWNsZXMgKyAxCisJICovCisJdW5zaWduZWQgaW50CXRkZl9jeWNsZXM6NDsKKworCS8qCisJICogMDogVERGIG9wdGltaXphdGlvbiBkaXNhYmxlZAorCSAqIDE6IFRERiBvcHRpbWl6YXRpb24gZW5hYmxlZAorCSAqLworCXVuc2lnbmVkIGludAl0ZGZfbW9kZToxOwogfTsKIAogZXh0ZXJuIGludCBzbWNfc2V0X2NvbmZpZ3VyYXRpb24oaW50IGNzLCBjb25zdCBzdHJ1Y3Qgc21jX2NvbmZpZyAqY29uZmlnKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWF2cjMyL2FyY2gtYXQzMmFwL3RpbWUuaCBiL2luY2x1ZGUvYXNtLWF2cjMyL2FyY2gtYXQzMmFwL3RpbWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzhhNDM0Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tYXZyMzIvYXJjaC1hdDMyYXAvdGltZS5oCkBAIC0wLDAgKzEsMTEyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IEF0bWVsIENvcnBvcmF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9BU01fQVZSMzJfQVJDSF9BVDMyQVBfVElNRV9ICisjZGVmaW5lIF9BU01fQVZSMzJfQVJDSF9BVDMyQVBfVElNRV9ICisKKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKworZXh0ZXJuIHN0cnVjdCBpcnFhY3Rpb24gdGltZXJfaXJxYWN0aW9uOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYXQzMl9zeXN0YzBfZGV2aWNlOworZXh0ZXJuIHZvaWQgbG9jYWxfdGltZXJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCk7CisKKyNkZWZpbmUgVElNRVJfQkNSCQkJCQkweDAwMDAwMGMwCisjZGVmaW5lIFRJTUVSX0JDUl9TWU5DCQkJCQkJIDAKKyNkZWZpbmUgVElNRVJfQk1SCQkJCQkweDAwMDAwMGM0CisjZGVmaW5lIFRJTUVSX0JNUl9UQzBYQzBTCQkJCQkgMAorI2RlZmluZSBUSU1FUl9CTVJfVEMxWEMxUwkJCQkJIDIKKyNkZWZpbmUgVElNRVJfQk1SX1RDMlhDMlMJCQkJCSA0CisjZGVmaW5lIFRJTUVSX0NDUgkJCQkJMHgwMDAwMDAwMAorI2RlZmluZSBUSU1FUl9DQ1JfQ0xLRElTCQkJCQkgMQorI2RlZmluZSBUSU1FUl9DQ1JfQ0xLRU4JCQkJCQkgMAorI2RlZmluZSBUSU1FUl9DQ1JfU1dUUkcJCQkJCQkgMgorI2RlZmluZSBUSU1FUl9DTVIJCQkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgVElNRVJfQ01SX0FCRVRSRwkJCQkJMTAKKyNkZWZpbmUgVElNRVJfQ01SX0FDUEEJCQkJCQkxNgorI2RlZmluZSBUSU1FUl9DTVJfQUNQQwkJCQkJCTE4CisjZGVmaW5lIFRJTUVSX0NNUl9BRUVWVAkJCQkJCTIwCisjZGVmaW5lIFRJTUVSX0NNUl9BU1dUUkcJCQkJCTIyCisjZGVmaW5lIFRJTUVSX0NNUl9CQ1BCCQkJCQkJMjQKKyNkZWZpbmUgVElNRVJfQ01SX0JDUEMJCQkJCQkyNgorI2RlZmluZSBUSU1FUl9DTVJfQkVFVlQJCQkJCQkyOAorI2RlZmluZSBUSU1FUl9DTVJfQlNXVFJHCQkJCQkzMAorI2RlZmluZSBUSU1FUl9DTVJfQlVSU1QJCQkJCQkgNAorI2RlZmluZSBUSU1FUl9DTVJfQ0xLSQkJCQkJCSAzCisjZGVmaW5lIFRJTUVSX0NNUl9DUENESVMJCQkJCSA3CisjZGVmaW5lIFRJTUVSX0NNUl9DUENTVE9QCQkJCQkgNgorI2RlZmluZSBUSU1FUl9DTVJfQ1BDVFJHCQkJCQkxNAorI2RlZmluZSBUSU1FUl9DTVJfRUVWVAkJCQkJCTEwCisjZGVmaW5lIFRJTUVSX0NNUl9FRVZURURHCQkJCQkgOAorI2RlZmluZSBUSU1FUl9DTVJfRU5FVFJHCQkJCQkxMgorI2RlZmluZSBUSU1FUl9DTVJfRVRSR0VERwkJCQkJIDgKKyNkZWZpbmUgVElNRVJfQ01SX0xEQkRJUwkJCQkJIDcKKyNkZWZpbmUgVElNRVJfQ01SX0xEQlNUT1AJCQkJCSA2CisjZGVmaW5lIFRJTUVSX0NNUl9MRFJBCQkJCQkJMTYKKyNkZWZpbmUgVElNRVJfQ01SX0xEUkIJCQkJCQkxOAorI2RlZmluZSBUSU1FUl9DTVJfVENDTEtTCQkJCQkgMAorI2RlZmluZSBUSU1FUl9DTVJfV0FWRQkJCQkJCTE1CisjZGVmaW5lIFRJTUVSX0NNUl9XQVZTRUwJCQkJCTEzCisjZGVmaW5lIFRJTUVSX0NWCQkJCQkweDAwMDAwMDEwCisjZGVmaW5lIFRJTUVSX0NWX0NWCQkJCQkJIDAKKyNkZWZpbmUgVElNRVJfSURSCQkJCQkweDAwMDAwMDI4CisjZGVmaW5lIFRJTUVSX0lEUl9DT1ZGUwkJCQkJCSAwCisjZGVmaW5lIFRJTUVSX0lEUl9DUEFTCQkJCQkJIDIKKyNkZWZpbmUgVElNRVJfSURSX0NQQlMJCQkJCQkgMworI2RlZmluZSBUSU1FUl9JRFJfQ1BDUwkJCQkJCSA0CisjZGVmaW5lIFRJTUVSX0lEUl9FVFJHUwkJCQkJCSA3CisjZGVmaW5lIFRJTUVSX0lEUl9MRFJBUwkJCQkJCSA1CisjZGVmaW5lIFRJTUVSX0lEUl9MRFJCUwkJCQkJCSA2CisjZGVmaW5lIFRJTUVSX0lEUl9MT1ZSUwkJCQkJCSAxCisjZGVmaW5lIFRJTUVSX0lFUgkJCQkJMHgwMDAwMDAyNAorI2RlZmluZSBUSU1FUl9JRVJfQ09WRlMJCQkJCQkgMAorI2RlZmluZSBUSU1FUl9JRVJfQ1BBUwkJCQkJCSAyCisjZGVmaW5lIFRJTUVSX0lFUl9DUEJTCQkJCQkJIDMKKyNkZWZpbmUgVElNRVJfSUVSX0NQQ1MJCQkJCQkgNAorI2RlZmluZSBUSU1FUl9JRVJfRVRSR1MJCQkJCQkgNworI2RlZmluZSBUSU1FUl9JRVJfTERSQVMJCQkJCQkgNQorI2RlZmluZSBUSU1FUl9JRVJfTERSQlMJCQkJCQkgNgorI2RlZmluZSBUSU1FUl9JRVJfTE9WUlMJCQkJCQkgMQorI2RlZmluZSBUSU1FUl9JTVIJCQkJCTB4MDAwMDAwMmMKKyNkZWZpbmUgVElNRVJfSU1SX0NPVkZTCQkJCQkJIDAKKyNkZWZpbmUgVElNRVJfSU1SX0NQQVMJCQkJCQkgMgorI2RlZmluZSBUSU1FUl9JTVJfQ1BCUwkJCQkJCSAzCisjZGVmaW5lIFRJTUVSX0lNUl9DUENTCQkJCQkJIDQKKyNkZWZpbmUgVElNRVJfSU1SX0VUUkdTCQkJCQkJIDcKKyNkZWZpbmUgVElNRVJfSU1SX0xEUkFTCQkJCQkJIDUKKyNkZWZpbmUgVElNRVJfSU1SX0xEUkJTCQkJCQkJIDYKKyNkZWZpbmUgVElNRVJfSU1SX0xPVlJTCQkJCQkJIDEKKyNkZWZpbmUgVElNRVJfUkEJCQkJCTB4MDAwMDAwMTQKKyNkZWZpbmUgVElNRVJfUkFfUkEJCQkJCQkgMAorI2RlZmluZSBUSU1FUl9SQgkJCQkJMHgwMDAwMDAxOAorI2RlZmluZSBUSU1FUl9SQl9SQgkJCQkJCSAwCisjZGVmaW5lIFRJTUVSX1JDCQkJCQkweDAwMDAwMDFjCisjZGVmaW5lIFRJTUVSX1JDX1JDCQkJCQkJIDAKKyNkZWZpbmUgVElNRVJfU1IJCQkJCTB4MDAwMDAwMjAKKyNkZWZpbmUgVElNRVJfU1JfQ0xLU1RBCQkJCQkJMTYKKyNkZWZpbmUgVElNRVJfU1JfQ09WRlMJCQkJCQkgMAorI2RlZmluZSBUSU1FUl9TUl9DUEFTCQkJCQkJIDIKKyNkZWZpbmUgVElNRVJfU1JfQ1BCUwkJCQkJCSAzCisjZGVmaW5lIFRJTUVSX1NSX0NQQ1MJCQkJCQkgNAorI2RlZmluZSBUSU1FUl9TUl9FVFJHUwkJCQkJCSA3CisjZGVmaW5lIFRJTUVSX1NSX0xEUkFTCQkJCQkJIDUKKyNkZWZpbmUgVElNRVJfU1JfTERSQlMJCQkJCQkgNgorI2RlZmluZSBUSU1FUl9TUl9MT1ZSUwkJCQkJCSAxCisjZGVmaW5lIFRJTUVSX1NSX01USU9BCQkJCQkJMTcKKyNkZWZpbmUgVElNRVJfU1JfTVRJT0IJCQkJCQkxOAorCisvKiBCaXQgbWFuaXB1bGF0aW9uIG1hY3JvcyAqLworI2RlZmluZSBUSU1FUl9CSVQobmFtZSkJCSgxIDw8IFRJTUVSXyMjbmFtZSkKKyNkZWZpbmUgVElNRVJfQkYobmFtZSx2YWx1ZSkJKCh2YWx1ZSkgPDwgVElNRVJfIyNuYW1lKQorCisvKiBSZWdpc3RlciBhY2Nlc3MgbWFjcm9zICovCisjZGVmaW5lIHRpbWVyX3JlYWQocG9ydCxpbnN0YW5jZSxyZWcpIFwKKwlfX3Jhd19yZWFkbChwb3J0ICsgKDB4NDAgKiBpbnN0YW5jZSkgKyBUSU1FUl8jI3JlZykKKyNkZWZpbmUgdGltZXJfd3JpdGUocG9ydCxpbnN0YW5jZSxyZWcsdmFsdWUpIFwKKwlfX3Jhd193cml0ZWwoKHZhbHVlKSwgcG9ydCArICgweDQwICogaW5zdGFuY2UpICsgVElNRVJfIyNyZWcpCisKKyNlbmRpZiAvKiBfQVNNX0FWUjMyX0FSQ0hfQVQzMkFQX1RJTUVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXZyMzIvYXRvbWljLmggYi9pbmNsdWRlL2FzbS1hdnIzMi9hdG9taWMuaAppbmRleCBjNDBiNjAzLi5iOWMyNTQ4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hdnIzMi9hdG9taWMuaAorKysgYi9pbmNsdWRlL2FzbS1hdnIzMi9hdG9taWMuaApAQCAtMTczLDcgKzE3Myw3IEBACiB9CiAKICNkZWZpbmUgYXRvbWljX3hjaGcodiwgbmV3KQkoeGNoZygmKCh2KS0+Y291bnRlciksIG5ldykpCi0jZGVmaW5lIGF0b21pY19jbXB4Y2hnKHYsIG8sIG4pCSgoaW50KWNtcHhjaGcoJigodiktPmNvdW50ZXIpLCAobyksIChuKSkpCisjZGVmaW5lIGF0b21pY19jbXB4Y2hnKHYsIG8sIG4pCShjbXB4Y2hnKCYoKHYpLT5jb3VudGVyKSwgKG8pLCAobikpKQogCiAjZGVmaW5lIGF0b21pY19zdWIoaSwgdikJKHZvaWQpYXRvbWljX3N1Yl9yZXR1cm4oaSwgdikKICNkZWZpbmUgYXRvbWljX2FkZChpLCB2KQkodm9pZClhdG9taWNfYWRkX3JldHVybihpLCB2KQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXZyMzIvYnVnLmggYi9pbmNsdWRlL2FzbS1hdnIzMi9idWcuaAppbmRleCA1MjE3NjZiLi5hZmRjZDc5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hdnIzMi9idWcuaAorKysgYi9pbmNsdWRlL2FzbS1hdnIzMi9idWcuaApAQCAtMTgsMjcgKzE4LDUzIEBACiAKICNpZmRlZiBDT05GSUdfREVCVUdfQlVHVkVSQk9TRQogCi0jZGVmaW5lIEJVRygpCQkJCQkJCQlcCi0JZG8gewkJCQkJCQkJXAotCQlhc20gdm9sYXRpbGUoIi5od29yZAklMFxuXHQiCQkJCVwKLQkJCSAgICAgIi5od29yZAklMVxuXHQiCQkJCVwKLQkJCSAgICAgIi5sb25nCSUyIgkJCQlcCi0JCQkgICAgIDoJCQkJCQlcCi0JCQkgICAgIDogIm4iKEFWUjMyX0JVR19PUENPREUpLAkJCVwKLQkJCSAgICAgICAiaSIoX19MSU5FX18pLCAiWCIoX19GSUxFX18pKTsJCVwKLQl9IHdoaWxlICgwKQorI2RlZmluZSBfQlVHX09SX1dBUk4oZmxhZ3MpCQkJCQkJXAorCWFzbSB2b2xhdGlsZSgJCQkJCQkJXAorCQkiMToJLmh3b3JkCSUwXG4iCQkJCQlcCisJCSIJLnNlY3Rpb24gX19idWdfdGFibGUsXCJhXCIsQHByb2diaXRzXG4iCQlcCisJCSIyOgkubG9uZwkxYlxuIgkJCQkJXAorCQkiCS5sb25nCSUxXG4iCQkJCQlcCisJCSIJLnNob3J0CSUyXG4iCQkJCQlcCisJCSIJLnNob3J0CSUzXG4iCQkJCQlcCisJCSIJLm9yZwkyYiArICU0XG4iCQkJCVwKKwkJIgkucHJldmlvdXMiCQkJCQlcCisJCToJCQkJCQkJXAorCQk6ICJpIihBVlIzMl9CVUdfT1BDT0RFKSwgImkiKF9fRklMRV9fKSwJCQlcCisJCSAgImkiKF9fTElORV9fKSwgImkiKGZsYWdzKSwJCQkJXAorCQkgICJpIihzaXplb2Yoc3RydWN0IGJ1Z19lbnRyeSkpKQogCiAjZWxzZQogCi0jZGVmaW5lIEJVRygpCQkJCQkJCQlcCi0JZG8gewkJCQkJCQkJXAotCQlhc20gdm9sYXRpbGUoIi5od29yZAklMFxuXHQiCQkJCVwKLQkJCSAgICAgOiA6ICJuIihBVlIzMl9CVUdfT1BDT0RFKSk7CQlcCi0JfSB3aGlsZSAoMCkKKyNkZWZpbmUgX0JVR19PUl9XQVJOKGZsYWdzKQkJCQkJCVwKKwlhc20gdm9sYXRpbGUoCQkJCQkJCVwKKwkJIjE6CS5od29yZAklMFxuIgkJCQkJXAorCQkiCS5zZWN0aW9uIF9fYnVnX3RhYmxlLFwiYVwiLEBwcm9nYml0c1xuIgkJXAorCQkiMjoJLmxvbmcJMWJcbiIJCQkJCVwKKwkJIgkuc2hvcnQJJTFcbiIJCQkJCVwKKwkJIgkub3JnCTJiICsgJTJcbiIJCQkJXAorCQkiCS5wcmV2aW91cyIJCQkJCVwKKwkJOgkJCQkJCQlcCisJCTogImkiKEFWUjMyX0JVR19PUENPREUpLCAiaSIoZmxhZ3MpLAkJCVwKKwkJICAiaSIoc2l6ZW9mKHN0cnVjdCBidWdfZW50cnkpKSkKIAogI2VuZGlmIC8qIENPTkZJR19ERUJVR19CVUdWRVJCT1NFICovCiAKKyNkZWZpbmUgQlVHKCkJCQkJCQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCV9CVUdfT1JfV0FSTigwKTsJCQkJCVwKKwkJZm9yICg7Oyk7CQkJCQkJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgV0FSTl9PTihjb25kaXRpb24pCQkJCQkJCVwKKwkoewkJCQkJCQkJXAorCQl0eXBlb2YoY29uZGl0aW9uKSBfX3JldF93YXJuX29uID0gKGNvbmRpdGlvbik7CQlcCisJCWlmICh1bmxpa2VseShfX3JldF93YXJuX29uKSkJCQkJXAorCQkJX0JVR19PUl9XQVJOKEJVR0ZMQUdfV0FSTklORyk7CQkJXAorCQl1bmxpa2VseShfX3JldF93YXJuX29uKTsJCQkJXAorCX0pCisKICNkZWZpbmUgSEFWRV9BUkNIX0JVRworI2RlZmluZSBIQVZFX0FSQ0hfV0FSTl9PTgogCiAjZW5kaWYgLyogQ09ORklHX0JVRyAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hdnIzMi9pby5oIGIvaW5jbHVkZS9hc20tYXZyMzIvaW8uaAppbmRleCBjMDhlODEwLi5lMzBkNGIzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hdnIzMi9pby5oCisrKyBiL2luY2x1ZGUvYXNtLWF2cjMyL2lvLmgKQEAgLTEsMTMgKzEsMTUgQEAKICNpZm5kZWYgX19BU01fQVZSMzJfSU9fSAogI2RlZmluZSBfX0FTTV9BVlIzMl9JT19ICiAKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLQotI2lmZGVmIF9fS0VSTkVMX18KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogCiAjaW5jbHVkZSA8YXNtL2FkZHJzcGFjZS5oPgogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KIAorI2luY2x1ZGUgPGFzbS9hcmNoL2lvLmg+CisKIC8qIHZpcnRfdG9fcGh5cyB3aWxsIG9ubHkgd29yayB3aGVuIGFkZHJlc3MgaXMgaW4gUDEgb3IgUDIgKi8KIHN0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGxvbmcgdmlydF90b19waHlzKHZvbGF0aWxlIHZvaWQgKmFkZHJlc3MpCiB7CkBAIC0zNiwxMDQgKzM4LDIxNSBAQAogZXh0ZXJuIHZvaWQgX19yYXdfcmVhZHN3KGNvbnN0IHZvaWQgX19pb21lbSAqYWRkciwgdm9pZCAqZGF0YSwgaW50IHdvcmRsZW4pOwogZXh0ZXJuIHZvaWQgX19yYXdfcmVhZHNsKGNvbnN0IHZvaWQgX19pb21lbSAqYWRkciwgdm9pZCAqZGF0YSwgaW50IGxvbmdsZW4pOwogCi1zdGF0aWMgaW5saW5lIHZvaWQgd3JpdGViKHVuc2lnbmVkIGNoYXIgYiwgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKQorc3RhdGljIGlubGluZSB2b2lkIF9fcmF3X3dyaXRlYih1OCB2LCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCiB7Ci0JKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIF9fZm9yY2UgKilhZGRyID0gYjsKKwkqKHZvbGF0aWxlIHU4IF9fZm9yY2UgKilhZGRyID0gdjsKIH0KLXN0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZXcodW5zaWduZWQgc2hvcnQgYiwgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKQorc3RhdGljIGlubGluZSB2b2lkIF9fcmF3X3dyaXRldyh1MTYgdiwgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKQogewotCSoodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgX19mb3JjZSAqKWFkZHIgPSBiOworCSoodm9sYXRpbGUgdTE2IF9fZm9yY2UgKilhZGRyID0gdjsKIH0KLXN0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZWwodW5zaWduZWQgaW50IGIsIHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3Jhd193cml0ZWwodTMyIHYsIHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikKIHsKLQkqKHZvbGF0aWxlIHVuc2lnbmVkIGludCBfX2ZvcmNlICopYWRkciA9IGI7CisJKih2b2xhdGlsZSB1MzIgX19mb3JjZSAqKWFkZHIgPSB2OwogfQotI2RlZmluZSBfX3Jhd193cml0ZWIgd3JpdGViCi0jZGVmaW5lIF9fcmF3X3dyaXRldyB3cml0ZXcKLSNkZWZpbmUgX19yYXdfd3JpdGVsIHdyaXRlbAogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgcmVhZGIoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKQorc3RhdGljIGlubGluZSB1OCBfX3Jhd19yZWFkYihjb25zdCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCiB7Ci0JcmV0dXJuICooY29uc3Qgdm9sYXRpbGUgdW5zaWduZWQgY2hhciBfX2ZvcmNlICopYWRkcjsKKwlyZXR1cm4gKihjb25zdCB2b2xhdGlsZSB1OCBfX2ZvcmNlICopYWRkcjsKIH0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgcmVhZHcoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKQorc3RhdGljIGlubGluZSB1MTYgX19yYXdfcmVhZHcoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKQogewotCXJldHVybiAqKGNvbnN0IHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0IF9fZm9yY2UgKilhZGRyOworCXJldHVybiAqKGNvbnN0IHZvbGF0aWxlIHUxNiBfX2ZvcmNlICopYWRkcjsKIH0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHJlYWRsKGNvbnN0IHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikKK3N0YXRpYyBpbmxpbmUgdTMyIF9fcmF3X3JlYWRsKGNvbnN0IHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikKIHsKLQlyZXR1cm4gKihjb25zdCB2b2xhdGlsZSB1bnNpZ25lZCBpbnQgX19mb3JjZSAqKWFkZHI7CisJcmV0dXJuICooY29uc3Qgdm9sYXRpbGUgdTMyIF9fZm9yY2UgKilhZGRyOwogfQotI2RlZmluZSBfX3Jhd19yZWFkYiByZWFkYgotI2RlZmluZSBfX3Jhd19yZWFkdyByZWFkdwotI2RlZmluZSBfX3Jhd19yZWFkbCByZWFkbAogCi0jZGVmaW5lIHdyaXRlc2IocCwgZCwgbCkJX19yYXdfd3JpdGVzYigodW5zaWduZWQgaW50KXAsIGQsIGwpCi0jZGVmaW5lIHdyaXRlc3cocCwgZCwgbCkJX19yYXdfd3JpdGVzdygodW5zaWduZWQgaW50KXAsIGQsIGwpCi0jZGVmaW5lIHdyaXRlc2wocCwgZCwgbCkJX19yYXdfd3JpdGVzbCgodW5zaWduZWQgaW50KXAsIGQsIGwpCisvKiBDb252ZXJ0IEkvTyBwb3J0IGFkZHJlc3MgdG8gdmlydHVhbCBhZGRyZXNzICovCisjaWZuZGVmIF9faW8KKyMgZGVmaW5lIF9faW8ocCkJKCh2b2lkICopcGh5c190b191bmNhY2hlZChwKSkKKyNlbmRpZgogCi0jZGVmaW5lIHJlYWRzYihwLCBkLCBsKQkJX19yYXdfcmVhZHNiKCh1bnNpZ25lZCBpbnQpcCwgZCwgbCkKLSNkZWZpbmUgcmVhZHN3KHAsIGQsIGwpCQlfX3Jhd19yZWFkc3coKHVuc2lnbmVkIGludClwLCBkLCBsKQotI2RlZmluZSByZWFkc2wocCwgZCwgbCkJCV9fcmF3X3JlYWRzbCgodW5zaWduZWQgaW50KXAsIGQsIGwpCisvKgorICogTm90IHJlYWxseSBzdXJlIGFib3V0IHRoZSBiZXN0IHdheSB0byBzbG93IGRvd24gSS9PIG9uCisgKiBBVlIzMi4gRGVmaW5pbmcgaXQgYXMgYSBuby1vcCB1bnRpbCB3ZSBoYXZlIGFuIGFjdHVhbCB0ZXN0IGNhc2UuCisgKi8KKyNkZWZpbmUgU0xPV19ET1dOX0lPCWRvIHsgfSB3aGlsZSAoMCkKIAorI2RlZmluZSBfX0JVSUxEX01FTU9SWV9TSU5HTEUocGZ4LCBid2wsIHR5cGUpCQkJCVwKK3N0YXRpYyBpbmxpbmUgdm9pZAkJCQkJCQlcCitwZngjI3dyaXRlIyNid2wodHlwZSB2YWwsIHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikJCQlcCit7CQkJCQkJCQkJXAorCXZvbGF0aWxlIHR5cGUgKl9fYWRkcjsJCQkJCQlcCisJdHlwZSBfX3ZhbDsJCQkJCQkJXAorCQkJCQkJCQkJXAorCV9fYWRkciA9ICh2b2lkICopX19zd2l6emxlX2FkZHJfIyNid2woKHVuc2lnbmVkIGxvbmcpKGFkZHIpKTsJXAorCV9fdmFsID0gcGZ4IyNpb3N3YWIjI2J3bChfX2FkZHIsIHZhbCk7CQkJCVwKKwkJCQkJCQkJCVwKKwlCVUlMRF9CVUdfT04oc2l6ZW9mKHR5cGUpID4gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsJCVwKKwkJCQkJCQkJCVwKKwkqX19hZGRyID0gX192YWw7CQkJCQkJXAorfQkJCQkJCQkJCVwKKwkJCQkJCQkJCVwKK3N0YXRpYyBpbmxpbmUgdHlwZSBwZngjI3JlYWQjI2J3bChjb25zdCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCVwKK3sJCQkJCQkJCQlcCisJdm9sYXRpbGUgdHlwZSAqX19hZGRyOwkJCQkJCVwKKwl0eXBlIF9fdmFsOwkJCQkJCQlcCisJCQkJCQkJCQlcCisJX19hZGRyID0gKHZvaWQgKilfX3N3aXp6bGVfYWRkcl8jI2J3bCgodW5zaWduZWQgbG9uZykoYWRkcikpOwlcCisJCQkJCQkJCQlcCisJQlVJTERfQlVHX09OKHNpemVvZih0eXBlKSA+IHNpemVvZih1bnNpZ25lZCBsb25nKSk7CQlcCisJCQkJCQkJCQlcCisJX192YWwgPSAqX19hZGRyOwkJCQkJCVwKKwlyZXR1cm4gcGZ4IyNpb3N3YWIjI2J3bChfX2FkZHIsIF9fdmFsKTsJCQkJXAorfQorCisjZGVmaW5lIF9fQlVJTERfSU9QT1JUX1NJTkdMRShwZngsIGJ3bCwgdHlwZSwgcCwgc2xvdykJCQlcCitzdGF0aWMgaW5saW5lIHZvaWQgcGZ4IyNvdXQjI2J3bCMjcCh0eXBlIHZhbCwgdW5zaWduZWQgbG9uZyBwb3J0KQlcCit7CQkJCQkJCQkJXAorCXZvbGF0aWxlIHR5cGUgKl9fYWRkcjsJCQkJCQlcCisJdHlwZSBfX3ZhbDsJCQkJCQkJXAorCQkJCQkJCQkJXAorCV9fYWRkciA9IF9faW8oX19zd2l6emxlX2FkZHJfIyNid2wocG9ydCkpOwkJCVwKKwlfX3ZhbCA9IHBmeCMjaW9zd2FiIyNid2woX19hZGRyLCB2YWwpOwkJCQlcCisJCQkJCQkJCQlcCisJQlVJTERfQlVHX09OKHNpemVvZih0eXBlKSA+IHNpemVvZih1bnNpZ25lZCBsb25nKSk7CQlcCisJCQkJCQkJCQlcCisJKl9fYWRkciA9IF9fdmFsOwkJCQkJCVwKKwlzbG93OwkJCQkJCQkJXAorfQkJCQkJCQkJCVwKKwkJCQkJCQkJCVwKK3N0YXRpYyBpbmxpbmUgdHlwZSBwZngjI2luIyNid2wjI3AodW5zaWduZWQgbG9uZyBwb3J0KQkJCVwKK3sJCQkJCQkJCQlcCisJdm9sYXRpbGUgdHlwZSAqX19hZGRyOwkJCQkJCVwKKwl0eXBlIF9fdmFsOwkJCQkJCQlcCisJCQkJCQkJCQlcCisJX19hZGRyID0gX19pbyhfX3N3aXp6bGVfYWRkcl8jI2J3bChwb3J0KSk7CQkJXAorCQkJCQkJCQkJXAorCUJVSUxEX0JVR19PTihzaXplb2YodHlwZSkgPiBzaXplb2YodW5zaWduZWQgbG9uZykpOwkJXAorCQkJCQkJCQkJXAorCV9fdmFsID0gKl9fYWRkcjsJCQkJCQlcCisJc2xvdzsJCQkJCQkJCVwKKwkJCQkJCQkJCVwKKwlyZXR1cm4gcGZ4IyNpb3N3YWIjI2J3bChfX2FkZHIsIF9fdmFsKTsJCQkJXAorfQorCisjZGVmaW5lIF9fQlVJTERfTUVNT1JZX1BGWChidXMsIGJ3bCwgdHlwZSkJCQkJXAorCV9fQlVJTERfTUVNT1JZX1NJTkdMRShidXMsIGJ3bCwgdHlwZSkKKworI2RlZmluZSBCVUlMRElPX01FTShid2wsIHR5cGUpCQkJCQkJXAorCV9fQlVJTERfTUVNT1JZX1BGWCgsIGJ3bCwgdHlwZSkJCQkJCVwKKwlfX0JVSUxEX01FTU9SWV9QRlgoX19tZW1fLCBid2wsIHR5cGUpCisKKyNkZWZpbmUgX19CVUlMRF9JT1BPUlRfUEZYKGJ1cywgYndsLCB0eXBlKQkJCQlcCisJX19CVUlMRF9JT1BPUlRfU0lOR0xFKGJ1cywgYndsLCB0eXBlLCAsKQkJCVwKKwlfX0JVSUxEX0lPUE9SVF9TSU5HTEUoYnVzLCBid2wsIHR5cGUsIF9wLCBTTE9XX0RPV05fSU8pCisKKyNkZWZpbmUgQlVJTERJT19JT1BPUlQoYndsLCB0eXBlKQkJCQkJXAorCV9fQlVJTERfSU9QT1JUX1BGWCgsIGJ3bCwgdHlwZSkJCQkJCVwKKwlfX0JVSUxEX0lPUE9SVF9QRlgoX19tZW1fLCBid2wsIHR5cGUpCisKK0JVSUxESU9fTUVNKGIsIHU4KQorQlVJTERJT19NRU0odywgdTE2KQorQlVJTERJT19NRU0obCwgdTMyKQorCitCVUlMRElPX0lPUE9SVChiLCB1OCkKK0JVSUxESU9fSU9QT1JUKHcsIHUxNikKK0JVSUxESU9fSU9QT1JUKGwsIHUzMikKKworI2RlZmluZSByZWFkYl9yZWxheGVkCQkJcmVhZGIKKyNkZWZpbmUgcmVhZHdfcmVsYXhlZAkJCXJlYWR3CisjZGVmaW5lIHJlYWRsX3JlbGF4ZWQJCQlyZWFkbAorCisjZGVmaW5lIF9fQlVJTERfTUVNT1JZX1NUUklORyhid2wsIHR5cGUpCQkJCVwKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZXMjI2J3bCh2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIsCQlcCisJCQkgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IGNvdW50KQlcCit7CQkJCQkJCQkJXAorCWNvbnN0IHR5cGUgKl9fZGF0YSA9IGRhdGE7CQkJCQlcCisJCQkJCQkJCQlcCisJd2hpbGUgKGNvdW50LS0pCQkJCQkJCVwKKwkJX19tZW1fd3JpdGUjI2J3bCgqX19kYXRhKyssIGFkZHIpOwkJCVwKK30JCQkJCQkJCQlcCisJCQkJCQkJCQlcCitzdGF0aWMgaW5saW5lIHZvaWQgcmVhZHMjI2J3bChjb25zdCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIsCVwKKwkJCSAgICAgIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBjb3VudCkJCVwKK3sJCQkJCQkJCQlcCisJdHlwZSAqX19kYXRhID0gZGF0YTsJCQkJCQlcCisJCQkJCQkJCQlcCisJd2hpbGUgKGNvdW50LS0pCQkJCQkJCVwKKwkJKl9fZGF0YSsrID0gX19tZW1fcmVhZCMjYndsKGFkZHIpOwkJCVwKK30KKworI2RlZmluZSBfX0JVSUxEX0lPUE9SVF9TVFJJTkcoYndsLCB0eXBlKQkJCQlcCitzdGF0aWMgaW5saW5lIHZvaWQgb3V0cyMjYndsKHVuc2lnbmVkIGxvbmcgcG9ydCwgY29uc3Qgdm9pZCAqZGF0YSwJXAorCQkJICAgICB1bnNpZ25lZCBpbnQgY291bnQpCQkJXAorewkJCQkJCQkJCVwKKwljb25zdCB0eXBlICpfX2RhdGEgPSBkYXRhOwkJCQkJXAorCQkJCQkJCQkJXAorCXdoaWxlIChjb3VudC0tKQkJCQkJCQlcCisJCV9fbWVtX291dCMjYndsKCpfX2RhdGErKywgcG9ydCk7CQkJXAorfQkJCQkJCQkJCVwKKwkJCQkJCQkJCVwKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbnMjI2J3bCh1bnNpZ25lZCBsb25nIHBvcnQsIHZvaWQgKmRhdGEsCQlcCisJCQkgICB1bnNpZ25lZCBpbnQgY291bnQpCQkJCVwKK3sJCQkJCQkJCQlcCisJdHlwZSAqX19kYXRhID0gZGF0YTsJCQkJCQlcCisJCQkJCQkJCQlcCisJd2hpbGUgKGNvdW50LS0pCQkJCQkJCVwKKwkJKl9fZGF0YSsrID0gX19tZW1faW4jI2J3bChwb3J0KTsJCQlcCit9CisKKyNkZWZpbmUgQlVJTERTVFJJTkcoYndsLCB0eXBlKQkJCQkJCVwKKwlfX0JVSUxEX01FTU9SWV9TVFJJTkcoYndsLCB0eXBlKQkJCQlcCisJX19CVUlMRF9JT1BPUlRfU1RSSU5HKGJ3bCwgdHlwZSkKKworQlVJTERTVFJJTkcoYiwgdTgpCitCVUlMRFNUUklORyh3LCB1MTYpCitCVUlMRFNUUklORyhsLCB1MzIpCiAKIC8qCiAgKiBpb3tyZWFkLHdyaXRlfXs4LDE2LDMyfSBtYWNyb3MgaW4gYm90aCBsZSAoZm9yIFBDSSBzdHlsZSBjb25zdW1lcnMpIGFuZCBuYXRpdmUgYmUKICAqLwogI2lmbmRlZiBpb3JlYWQ4CiAKLSNkZWZpbmUgaW9yZWFkOChwKQkoeyB1bnNpZ25lZCBpbnQgX192ID0gX19yYXdfcmVhZGIocCk7IF9fdjsgfSkKKyNkZWZpbmUgaW9yZWFkOChwKQkJKCh1bnNpZ25lZCBpbnQpcmVhZGIocCkpCiAKLSNkZWZpbmUgaW9yZWFkMTYocCkJKHsgdW5zaWduZWQgaW50IF9fdiA9IGxlMTZfdG9fY3B1KF9fcmF3X3JlYWR3KHApKTsgX192OyB9KQotI2RlZmluZSBpb3JlYWQxNmJlKHApCSh7IHVuc2lnbmVkIGludCBfX3YgPSBiZTE2X3RvX2NwdShfX3Jhd19yZWFkdyhwKSk7IF9fdjsgfSkKKyNkZWZpbmUgaW9yZWFkMTYocCkJCSgodW5zaWduZWQgaW50KXJlYWR3KHApKQorI2RlZmluZSBpb3JlYWQxNmJlKHApCQkoKHVuc2lnbmVkIGludClfX3Jhd19yZWFkdyhwKSkKIAotI2RlZmluZSBpb3JlYWQzMihwKQkoeyB1bnNpZ25lZCBpbnQgX192ID0gbGUzMl90b19jcHUoX19yYXdfcmVhZGwocCkpOyBfX3Y7IH0pCi0jZGVmaW5lIGlvcmVhZDMyYmUocCkJKHsgdW5zaWduZWQgaW50IF9fdiA9IGJlMzJfdG9fY3B1KF9fcmF3X3JlYWRsKHApKTsgX192OyB9KQorI2RlZmluZSBpb3JlYWQzMihwKQkJKCh1bnNpZ25lZCBpbnQpcmVhZGwocCkpCisjZGVmaW5lIGlvcmVhZDMyYmUocCkJCSgodW5zaWduZWQgaW50KV9fcmF3X3JlYWRsKHApKQogCi0jZGVmaW5lIGlvd3JpdGU4KHYscCkJX19yYXdfd3JpdGViKHYsIHApCisjZGVmaW5lIGlvd3JpdGU4KHYscCkJCXdyaXRlYih2LCBwKQogCi0jZGVmaW5lIGlvd3JpdGUxNih2LHApCV9fcmF3X3dyaXRldyhjcHVfdG9fbGUxNih2KSwgcCkKLSNkZWZpbmUgaW93cml0ZTE2YmUodixwKQlfX3Jhd193cml0ZXcoY3B1X3RvX2JlMTYodiksIHApCisjZGVmaW5lIGlvd3JpdGUxNih2LHApCQl3cml0ZXcodiwgcCkKKyNkZWZpbmUgaW93cml0ZTE2YmUodixwKQlfX3Jhd193cml0ZXcodiwgcCkKIAotI2RlZmluZSBpb3dyaXRlMzIodixwKQlfX3Jhd193cml0ZWwoY3B1X3RvX2xlMzIodiksIHApCi0jZGVmaW5lIGlvd3JpdGUzMmJlKHYscCkJX19yYXdfd3JpdGVsKGNwdV90b19iZTMyKHYpLCBwKQorI2RlZmluZSBpb3dyaXRlMzIodixwKQkJd3JpdGVsKHYsIHApCisjZGVmaW5lIGlvd3JpdGUzMmJlKHYscCkJX19yYXdfd3JpdGVsKHYsIHApCiAKLSNkZWZpbmUgaW9yZWFkOF9yZXAocCxkLGMpCV9fcmF3X3JlYWRzYihwLGQsYykKLSNkZWZpbmUgaW9yZWFkMTZfcmVwKHAsZCxjKQlfX3Jhd19yZWFkc3cocCxkLGMpCi0jZGVmaW5lIGlvcmVhZDMyX3JlcChwLGQsYykJX19yYXdfcmVhZHNsKHAsZCxjKQorI2RlZmluZSBpb3JlYWQ4X3JlcChwLGQsYykJcmVhZHNiKHAsZCxjKQorI2RlZmluZSBpb3JlYWQxNl9yZXAocCxkLGMpCXJlYWRzdyhwLGQsYykKKyNkZWZpbmUgaW9yZWFkMzJfcmVwKHAsZCxjKQlyZWFkc2wocCxkLGMpCiAKLSNkZWZpbmUgaW93cml0ZThfcmVwKHAscyxjKQlfX3Jhd193cml0ZXNiKHAscyxjKQotI2RlZmluZSBpb3dyaXRlMTZfcmVwKHAscyxjKQlfX3Jhd193cml0ZXN3KHAscyxjKQotI2RlZmluZSBpb3dyaXRlMzJfcmVwKHAscyxjKQlfX3Jhd193cml0ZXNsKHAscyxjKQorI2RlZmluZSBpb3dyaXRlOF9yZXAocCxzLGMpCXdyaXRlc2IocCxzLGMpCisjZGVmaW5lIGlvd3JpdGUxNl9yZXAocCxzLGMpCXdyaXRlc3cocCxzLGMpCisjZGVmaW5lIGlvd3JpdGUzMl9yZXAocCxzLGMpCXdyaXRlc2wocCxzLGMpCiAKICNlbmRpZgogCi0KLS8qCi0gKiBUaGVzZSB0d28gYXJlIG9ubHkgaGVyZSBiZWNhdXNlIEFMU0EgX3RoaW5rc18gaXQgbmVlZHMgdGhlbS4uLgotICovCiBzdGF0aWMgaW5saW5lIHZvaWQgbWVtY3B5X2Zyb21pbyh2b2lkICogdG8sIGNvbnN0IHZvbGF0aWxlIHZvaWQgX19pb21lbSAqZnJvbSwKIAkJCQkgdW5zaWduZWQgbG9uZyBjb3VudCkKIHsKLQljaGFyICpwID0gdG87Ci0Jd2hpbGUgKGNvdW50KSB7Ci0JCWNvdW50LS07Ci0JCSpwID0gcmVhZGIoZnJvbSk7Ci0JCXArKzsKLQkJZnJvbSsrOwotCX0KKwltZW1jcHkodG8sIChjb25zdCB2b2lkIF9fZm9yY2UgKilmcm9tLCBjb3VudCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCAgbWVtY3B5X3RvaW8odm9sYXRpbGUgdm9pZCBfX2lvbWVtICp0bywgY29uc3Qgdm9pZCAqIGZyb20sCiAJCQkJdW5zaWduZWQgbG9uZyBjb3VudCkKIHsKLQljb25zdCBjaGFyICpwID0gZnJvbTsKLQl3aGlsZSAoY291bnQpIHsKLQkJY291bnQtLTsKLQkJd3JpdGViKCpwLCB0byk7Ci0JCXArKzsKLQkJdG8rKzsKLQl9CisJbWVtY3B5KCh2b2lkIF9fZm9yY2UgKil0bywgZnJvbSwgY291bnQpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgbWVtc2V0X2lvKHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkciwgdW5zaWduZWQgY2hhciB2YWwsCkBAIC0xNDIsOTkgKzI1NSw4IEBACiAJbWVtc2V0KCh2b2lkIF9fZm9yY2UgKilhZGRyLCB2YWwsIGNvdW50KTsKIH0KIAotLyoKLSAqIEJhZCByZWFkL3dyaXRlIGFjY2Vzc2VzLi4uCi0gKi8KLWV4dGVybiB2b2lkIF9fcmVhZHdyaXRlX2J1Zyhjb25zdCBjaGFyICpmbik7Ci0KICNkZWZpbmUgSU9fU1BBQ0VfTElNSVQJMHhmZmZmZmZmZgogCi0vKiBDb252ZXJ0IEkvTyBwb3J0IGFkZHJlc3MgdG8gdmlydHVhbCBhZGRyZXNzICovCi0jZGVmaW5lIF9faW8ocCkJCSgodm9pZCBfX2lvbWVtICopcGh5c190b191bmNhY2hlZChwKSkKLQotLyoKLSAqICBJTyBwb3J0IGFjY2VzcyBwcmltaXRpdmVzCi0gKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIFRoZSBBVlIzMiBkb2Vzbid0IGhhdmUgc3BlY2lhbCBJTyBhY2Nlc3MgaW5zdHJ1Y3Rpb25zOyBhbGwgSU8gaXMgbWVtb3J5Ci0gKiBtYXBwZWQuIE5vdGUgdGhhdCB0aGVzZSBhcmUgZGVmaW5lZCB0byBwZXJmb3JtIGxpdHRsZSBlbmRpYW4gYWNjZXNzZXMKLSAqIG9ubHkuIFRoZWlyIHByaW1hcnkgcHVycG9zZSBpcyB0byBhY2Nlc3MgUENJIGFuZCBJU0EgcGVyaXBoZXJhbHMuCi0gKgotICogTm90ZSB0aGF0IGZvciBhIGJpZyBlbmRpYW4gbWFjaGluZSwgdGhpcyBpbXBsaWVzIHRoYXQgdGhlIGZvbGxvd2luZwotICogYmlnIGVuZGlhbiBtb2RlIGNvbm5lY3Rpdml0eSBpcyBpbiBwbGFjZS4KLSAqCi0gKiBUaGUgbWFjaGluZSBzcGVjaWZpYyBpby5oIGluY2x1ZGUgZGVmaW5lcyBfX2lvIHRvIHRyYW5zbGF0ZSBhbiAiSU8iCi0gKiBhZGRyZXNzIHRvIGEgbWVtb3J5IGFkZHJlc3MuCi0gKgotICogTm90ZSB0aGF0IHdlIHByZXZlbnQgR0NDIHJlLW9yZGVyaW5nIG9yIGNhY2hpbmcgdmFsdWVzIGluIGV4cHJlc3Npb25zCi0gKiBieSBpbnRyb2R1Y2luZyBzZXF1ZW5jZSBwb2ludHMgaW50byB0aGUgaW4qKCkgZGVmaW5pdGlvbnMuICBOb3RlIHRoYXQKLSAqIF9fcmF3XyogZG8gbm90IGd1YXJhbnRlZSB0aGlzIGJlaGF2aW91ci4KLSAqCi0gKiBUaGUge2luLG91dH1bYndsXSBtYWNyb3MgYXJlIGZvciBlbXVsYXRpbmcgeDg2LXN0eWxlIFBDSS9JU0EgSU8gc3BhY2UuCi0gKi8KLSNkZWZpbmUgb3V0Yih2LCBwKQkJX19yYXdfd3JpdGViKHYsIF9faW8ocCkpCi0jZGVmaW5lIG91dHcodiwgcCkJCV9fcmF3X3dyaXRldyhjcHVfdG9fbGUxNih2KSwgX19pbyhwKSkKLSNkZWZpbmUgb3V0bCh2LCBwKQkJX19yYXdfd3JpdGVsKGNwdV90b19sZTMyKHYpLCBfX2lvKHApKQotCi0jZGVmaW5lIGluYihwKQkJCV9fcmF3X3JlYWRiKF9faW8ocCkpCi0jZGVmaW5lIGludyhwKQkJCWxlMTZfdG9fY3B1KF9fcmF3X3JlYWR3KF9faW8ocCkpKQotI2RlZmluZSBpbmwocCkJCQlsZTMyX3RvX2NwdShfX3Jhd19yZWFkbChfX2lvKHApKSkKLQotc3RhdGljIGlubGluZSB2b2lkIF9fb3V0c2IodW5zaWduZWQgbG9uZyBwb3J0LCB2b2lkICphZGRyLCB1bnNpZ25lZCBpbnQgY291bnQpCi17Ci0Jd2hpbGUgKGNvdW50LS0pIHsKLQkJb3V0YigqKHU4ICopYWRkciwgcG9ydCk7Ci0JCWFkZHIrKzsKLQl9Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2luc2IodW5zaWduZWQgbG9uZyBwb3J0LCB2b2lkICphZGRyLCB1bnNpZ25lZCBpbnQgY291bnQpCi17Ci0Jd2hpbGUgKGNvdW50LS0pIHsKLQkJKih1OCAqKWFkZHIgPSBpbmIocG9ydCk7Ci0JCWFkZHIrKzsKLQl9Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX291dHN3KHVuc2lnbmVkIGxvbmcgcG9ydCwgdm9pZCAqYWRkciwgdW5zaWduZWQgaW50IGNvdW50KQotewotCXdoaWxlIChjb3VudC0tKSB7Ci0JCW91dHcoKih1MTYgKilhZGRyLCBwb3J0KTsKLQkJYWRkciArPSAyOwotCX0KLX0KLQotc3RhdGljIGlubGluZSB2b2lkIF9faW5zdyh1bnNpZ25lZCBsb25nIHBvcnQsIHZvaWQgKmFkZHIsIHVuc2lnbmVkIGludCBjb3VudCkKLXsKLQl3aGlsZSAoY291bnQtLSkgewotCQkqKHUxNiAqKWFkZHIgPSBpbncocG9ydCk7Ci0JCWFkZHIgKz0gMjsKLQl9Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX291dHNsKHVuc2lnbmVkIGxvbmcgcG9ydCwgdm9pZCAqYWRkciwgdW5zaWduZWQgaW50IGNvdW50KQotewotCXdoaWxlIChjb3VudC0tKSB7Ci0JCW91dGwoKih1MzIgKilhZGRyLCBwb3J0KTsKLQkJYWRkciArPSA0OwotCX0KLX0KLQotc3RhdGljIGlubGluZSB2b2lkIF9faW5zbCh1bnNpZ25lZCBsb25nIHBvcnQsIHZvaWQgKmFkZHIsIHVuc2lnbmVkIGludCBjb3VudCkKLXsKLQl3aGlsZSAoY291bnQtLSkgewotCQkqKHUzMiAqKWFkZHIgPSBpbmwocG9ydCk7Ci0JCWFkZHIgKz0gNDsKLQl9Ci19Ci0KLSNkZWZpbmUgb3V0c2IocG9ydCwgYWRkciwgY291bnQpCV9fb3V0c2IocG9ydCwgYWRkciwgY291bnQpCi0jZGVmaW5lIGluc2IocG9ydCwgYWRkciwgY291bnQpCQlfX2luc2IocG9ydCwgYWRkciwgY291bnQpCi0jZGVmaW5lIG91dHN3KHBvcnQsIGFkZHIsIGNvdW50KQlfX291dHN3KHBvcnQsIGFkZHIsIGNvdW50KQotI2RlZmluZSBpbnN3KHBvcnQsIGFkZHIsIGNvdW50KQkJX19pbnN3KHBvcnQsIGFkZHIsIGNvdW50KQotI2RlZmluZSBvdXRzbChwb3J0LCBhZGRyLCBjb3VudCkJX19vdXRzbChwb3J0LCBhZGRyLCBjb3VudCkKLSNkZWZpbmUgaW5zbChwb3J0LCBhZGRyLCBjb3VudCkJCV9faW5zbChwb3J0LCBhZGRyLCBjb3VudCkKLQogZXh0ZXJuIHZvaWQgX19pb21lbSAqX19pb3JlbWFwKHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwKIAkJCSAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzKTsKIGV4dGVybiB2b2lkIF9faW91bm1hcCh2b2lkIF9faW9tZW0gKmFkZHIpOwpAQCAtMjkyLDYgKzMxNCw0IEBACiAgKi8KICNkZWZpbmUgeGxhdGVfZGV2X2ttZW1fcHRyKHApICAgcAogCi0jZW5kaWYgLyogX19LRVJORUxfXyAqLwotCiAjZW5kaWYgLyogX19BU01fQVZSMzJfSU9fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXZyMzIvcHJvY2Vzc29yLmggYi9pbmNsdWRlL2FzbS1hdnIzMi9wcm9jZXNzb3IuaAppbmRleCBmNjkxMzc3Li42YTY0ODMzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hdnIzMi9wcm9jZXNzb3IuaAorKysgYi9pbmNsdWRlL2FzbS1hdnIzMi9wcm9jZXNzb3IuaApAQCAtNDAsNiArNDAsMTQgQEAKIAlUTEJfSU5WQUxJRAogfTsKIAorI2RlZmluZSBBVlIzMl9GRUFUVVJFX1JNVwkoMSA8PCAwKQorI2RlZmluZSBBVlIzMl9GRUFUVVJFX0RTUAkoMSA8PCAxKQorI2RlZmluZSBBVlIzMl9GRUFUVVJFX1NJTUQJKDEgPDwgMikKKyNkZWZpbmUgQVZSMzJfRkVBVFVSRV9PQ0QJKDEgPDwgMykKKyNkZWZpbmUgQVZSMzJfRkVBVFVSRV9QQ1RSCSgxIDw8IDQpCisjZGVmaW5lIEFWUjMyX0ZFQVRVUkVfSkFWQQkoMSA8PCA1KQorI2RlZmluZSBBVlIzMl9GRUFUVVJFX0ZQVQkoMSA8PCA2KQorCiBzdHJ1Y3QgYXZyMzJfY3B1aW5mbyB7CiAJc3RydWN0IGNsayAqY2xrOwogCXVuc2lnbmVkIGxvbmcgbG9vcHNfcGVyX2ppZmZ5OwpAQCAtNDgsNiArNTYsNyBAQAogCXVuc2lnbmVkIHNob3J0IGFyY2hfcmV2aXNpb247CiAJdW5zaWduZWQgc2hvcnQgY3B1X3JldmlzaW9uOwogCWVudW0gdGxiX2NvbmZpZyB0bGJfY29uZmlnOworCXVuc2lnbmVkIGxvbmcgZmVhdHVyZXM7CiAKIAlzdHJ1Y3QgY2FjaGVfaW5mbyBpY2FjaGU7CiAJc3RydWN0IGNhY2hlX2luZm8gZGNhY2hlOwpAQCAtMTI1LDEwICsxMzQsMTAgQEAKICNkZWZpbmUgdGhyZWFkX3NhdmVkX3BjKHRzaykgICAgKCh0c2spLT50aHJlYWQuY3B1X2NvbnRleHQucGMpCiAKIHN0cnVjdCBwdF9yZWdzOwotdm9pZCBzaG93X3RyYWNlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgdW5zaWduZWQgbG9uZyAqc3RhY2ssCi0JCXN0cnVjdCBwdF9yZWdzICpyZWdzKTsKLQogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZ2V0X3djaGFuKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCk7CitleHRlcm4gdm9pZCBzaG93X3JlZ3NfbG9nX2x2bChzdHJ1Y3QgcHRfcmVncyAqcmVncywgY29uc3QgY2hhciAqbG9nX2x2bCk7CitleHRlcm4gdm9pZCBzaG93X3N0YWNrX2xvZ19sdmwoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHVuc2lnbmVkIGxvbmcgc3AsCisJCQkgICAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGNvbnN0IGNoYXIgKmxvZ19sdmwpOwogCiAjZGVmaW5lIEtTVEtfRUlQKHRzaykJKCh0c2spLT50aHJlYWQuY3B1X2NvbnRleHQucGMpCiAjZGVmaW5lIEtTVEtfRVNQKHRzaykJKCh0c2spLT50aHJlYWQuY3B1X2NvbnRleHQua3NwKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXZyMzIvc2V0dXAuaCBiL2luY2x1ZGUvYXNtLWF2cjMyL3NldHVwLmgKaW5kZXggMGE1MjI0Mi4uMWZmMWEyMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXZyMzIvc2V0dXAuaAorKysgYi9pbmNsdWRlL2FzbS1hdnIzMi9zZXR1cC5oCkBAIC0xMjQsMTkgKzEyNCwxMiBAQAogI2RlZmluZSBmb3JfZWFjaF90YWcodCxiYXNlKQkJCQkJCVwKIAlmb3IgKHQgPSBiYXNlOyB0LT5oZHIuc2l6ZTsgdCA9IHRhZ19uZXh0KHQpKQogCi1leHRlcm4gc3RydWN0IHRhZ19tZW1fcmFuZ2UgKm1lbV9waHlzOwotZXh0ZXJuIHN0cnVjdCB0YWdfbWVtX3JhbmdlICptZW1fcmVzZXJ2ZWQ7Ci1leHRlcm4gc3RydWN0IHRhZ19tZW1fcmFuZ2UgKm1lbV9yYW1kaXNrOwotCiBleHRlcm4gc3RydWN0IHRhZyAqYm9vdGxvYWRlcl90YWdzOwogCi1leHRlcm4gdm9pZCBzZXR1cF9ib290bWVtKHZvaWQpOwotZXh0ZXJuIHZvaWQgc2V0dXBfcHJvY2Vzc29yKHZvaWQpOwotZXh0ZXJuIHZvaWQgYm9hcmRfc2V0dXBfZmJtZW0odW5zaWduZWQgbG9uZyBmYm1lbV9zdGFydCwKLQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgZmJtZW1fc2l6ZSk7CitleHRlcm4gcmVzb3VyY2Vfc2l6ZV90IGZibWVtX3N0YXJ0OworZXh0ZXJuIHJlc291cmNlX3NpemVfdCBmYm1lbV9zaXplOwogCi0vKiBDaGlwLXNwZWNpZmljIGhvb2sgdG8gZW5hYmxlIHRoZSB1c2Ugb2YgU0RSQU0gKi8KLXZvaWQgY2hpcF9lbmFibGVfc2RyYW0odm9pZCk7Cit2b2lkIHNldHVwX3Byb2Nlc3Nvcih2b2lkKTsKIAogI2VuZGlmIC8qICFfX0FTU0VNQkxZX18gKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXZyMzIvc29ja2V0LmggYi9pbmNsdWRlL2FzbS1hdnIzMi9zb2NrZXQuaAppbmRleCA1NDMyMjlkLi5hMGQwNTA3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hdnIzMi9zb2NrZXQuaAorKysgYi9pbmNsdWRlL2FzbS1hdnIzMi9zb2NrZXQuaApAQCAtNDksNSArNDksNyBAQAogCiAjZGVmaW5lIFNPX1BFRVJTRUMJCTMxCiAjZGVmaW5lIFNPX1BBU1NTRUMJCTM0CisjZGVmaW5lIFNPX1RJTUVTVEFNUE5TCQkzNQorI2RlZmluZSBTQ01fVElNRVNUQU1QTlMJCVNPX1RJTUVTVEFNUE5TCiAKICNlbmRpZiAvKiBfX0FTTV9BVlIzMl9TT0NLRVRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXZyMzIvc29ja2lvcy5oIGIvaW5jbHVkZS9hc20tYXZyMzIvc29ja2lvcy5oCmluZGV4IDg0ZjNkNjUuLjA4MDJkNzQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWF2cjMyL3NvY2tpb3MuaAorKysgYi9pbmNsdWRlL2FzbS1hdnIzMi9zb2NraW9zLmgKQEAgLTcsNiArNyw3IEBACiAjZGVmaW5lIEZJT0dFVE9XTgkweDg5MDMKICNkZWZpbmUgU0lPQ0dQR1JQCTB4ODkwNAogI2RlZmluZSBTSU9DQVRNQVJLCTB4ODkwNQotI2RlZmluZSBTSU9DR1NUQU1QCTB4ODkwNgkJLyogR2V0IHN0YW1wICovCisjZGVmaW5lIFNJT0NHU1RBTVAJMHg4OTA2CQkvKiBHZXQgc3RhbXAgKHRpbWV2YWwpICovCisjZGVmaW5lIFNJT0NHU1RBTVBOUwkweDg5MDcJCS8qIEdldCBzdGFtcCAodGltZXNwZWMpICovCiAKICNlbmRpZiAvKiBfX0FTTV9BVlIzMl9TT0NLSU9TX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWF2cjMyL3N5c3JlZy5oIGIvaW5jbHVkZS9hc20tYXZyMzIvc3lzcmVnLmgKaW5kZXggZjkxOTc1Zi4uYzAyYmM4MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXZyMzIvc3lzcmVnLmgKKysrIGIvaW5jbHVkZS9hc20tYXZyMzIvc3lzcmVnLmgKQEAgLTcsMzI2ICs3LDI4MSBAQAogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCi0jaWZuZGVmIF9fQVNNX0FWUjMyX1NZU1JFR19IX18KLSNkZWZpbmUgX19BU01fQVZSMzJfU1lTUkVHX0hfXworI2lmbmRlZiBfX0FTTV9BVlIzMl9TWVNSRUdfSAorI2RlZmluZSBfX0FTTV9BVlIzMl9TWVNSRUdfSAogCiAvKiBzeXNyZWcgcmVnaXN0ZXIgb2Zmc2V0cyAqLwotI2RlZmluZSBTWVNSRUdfU1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwCi0jZGVmaW5lIFNZU1JFR19FVkJBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDQKLSNkZWZpbmUgU1lTUkVHX0FDQkEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwOAotI2RlZmluZSBTWVNSRUdfQ1BVQ1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDBjCi0jZGVmaW5lIFNZU1JFR19FQ1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAKLSNkZWZpbmUgU1lTUkVHX1JTUl9TVVAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxNAotI2RlZmluZSBTWVNSRUdfUlNSX0lOVDAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDE4Ci0jZGVmaW5lIFNZU1JFR19SU1JfSU5UMSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMWMKLSNkZWZpbmUgU1lTUkVHX1JTUl9JTlQyICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMAotI2RlZmluZSBTWVNSRUdfUlNSX0lOVDMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDI0Ci0jZGVmaW5lIFNZU1JFR19SU1JfRVggICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMjgKLSNkZWZpbmUgU1lTUkVHX1JTUl9OTUkgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyYwotI2RlZmluZSBTWVNSRUdfUlNSX0RCRyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDMwCi0jZGVmaW5lIFNZU1JFR19SQVJfU1VQICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMzQKLSNkZWZpbmUgU1lTUkVHX1JBUl9JTlQwICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAzOAotI2RlZmluZSBTWVNSRUdfUkFSX0lOVDEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDNjCi0jZGVmaW5lIFNZU1JFR19SQVJfSU5UMiAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAKLSNkZWZpbmUgU1lTUkVHX1JBUl9JTlQzICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0NAotI2RlZmluZSBTWVNSRUdfUkFSX0VYICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQ4Ci0jZGVmaW5lIFNZU1JFR19SQVJfTk1JICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNGMKLSNkZWZpbmUgU1lTUkVHX1JBUl9EQkcgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA1MAotI2RlZmluZSBTWVNSRUdfSkVDUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDU0Ci0jZGVmaW5lIFNZU1JFR19KT1NQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNTgKLSNkZWZpbmUgU1lTUkVHX0pBVkFfTFYwICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA1YwotI2RlZmluZSBTWVNSRUdfSkFWQV9MVjEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDYwCi0jZGVmaW5lIFNZU1JFR19KQVZBX0xWMiAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNjQKLSNkZWZpbmUgU1lTUkVHX0pBVkFfTFYzICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2OAotI2RlZmluZSBTWVNSRUdfSkFWQV9MVjQgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDZjCi0jZGVmaW5lIFNZU1JFR19KQVZBX0xWNSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNzAKLSNkZWZpbmUgU1lTUkVHX0pBVkFfTFY2ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA3NAotI2RlZmluZSBTWVNSRUdfSkFWQV9MVjcgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDc4Ci0jZGVmaW5lIFNZU1JFR19KVEJBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwN2MKLSNkZWZpbmUgU1lTUkVHX0pCQ1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA4MAotI2RlZmluZSBTWVNSRUdfQ09ORklHMCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwCi0jZGVmaW5lIFNZU1JFR19DT05GSUcxICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDQKLSNkZWZpbmUgU1lTUkVHX0NPVU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwOAotI2RlZmluZSBTWVNSRUdfQ09NUEFSRSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTBjCi0jZGVmaW5lIFNZU1JFR19UTEJFSEkgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMTAKLSNkZWZpbmUgU1lTUkVHX1RMQkVMTyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDExNAotI2RlZmluZSBTWVNSRUdfUFRCUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTE4Ci0jZGVmaW5lIFNZU1JFR19UTEJFQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMWMKLSNkZWZpbmUgU1lTUkVHX01NVUNSICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEyMAotI2RlZmluZSBTWVNSRUdfVExCQVJMTyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTI0Ci0jZGVmaW5lIFNZU1JFR19UTEJBUkhJICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMjgKLSNkZWZpbmUgU1lTUkVHX1BDQ05UICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEyYwotI2RlZmluZSBTWVNSRUdfUENOVDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTMwCi0jZGVmaW5lIFNZU1JFR19QQ05UMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMzQKLSNkZWZpbmUgU1lTUkVHX1BDQ1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEzOAotI2RlZmluZSBTWVNSRUdfQkVBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTNjCisjZGVmaW5lIFNZU1JFR19TUgkJCQkweDAwMDAKKyNkZWZpbmUgU1lTUkVHX0VWQkEJCQkJMHgwMDA0CisjZGVmaW5lIFNZU1JFR19BQ0JBCQkJCTB4MDAwOAorI2RlZmluZSBTWVNSRUdfQ1BVQ1IJCQkJMHgwMDBjCisjZGVmaW5lIFNZU1JFR19FQ1IJCQkJMHgwMDEwCisjZGVmaW5lIFNZU1JFR19SU1JfU1VQCQkJCTB4MDAxNAorI2RlZmluZSBTWVNSRUdfUlNSX0lOVDAJCQkJMHgwMDE4CisjZGVmaW5lIFNZU1JFR19SU1JfSU5UMQkJCQkweDAwMWMKKyNkZWZpbmUgU1lTUkVHX1JTUl9JTlQyCQkJCTB4MDAyMAorI2RlZmluZSBTWVNSRUdfUlNSX0lOVDMJCQkJMHgwMDI0CisjZGVmaW5lIFNZU1JFR19SU1JfRVgJCQkJMHgwMDI4CisjZGVmaW5lIFNZU1JFR19SU1JfTk1JCQkJCTB4MDAyYworI2RlZmluZSBTWVNSRUdfUlNSX0RCRwkJCQkweDAwMzAKKyNkZWZpbmUgU1lTUkVHX1JBUl9TVVAJCQkJMHgwMDM0CisjZGVmaW5lIFNZU1JFR19SQVJfSU5UMAkJCQkweDAwMzgKKyNkZWZpbmUgU1lTUkVHX1JBUl9JTlQxCQkJCTB4MDAzYworI2RlZmluZSBTWVNSRUdfUkFSX0lOVDIJCQkJMHgwMDQwCisjZGVmaW5lIFNZU1JFR19SQVJfSU5UMwkJCQkweDAwNDQKKyNkZWZpbmUgU1lTUkVHX1JBUl9FWAkJCQkweDAwNDgKKyNkZWZpbmUgU1lTUkVHX1JBUl9OTUkJCQkJMHgwMDRjCisjZGVmaW5lIFNZU1JFR19SQVJfREJHCQkJCTB4MDA1MAorI2RlZmluZSBTWVNSRUdfSkVDUgkJCQkweDAwNTQKKyNkZWZpbmUgU1lTUkVHX0pPU1AJCQkJMHgwMDU4CisjZGVmaW5lIFNZU1JFR19KQVZBX0xWMAkJCQkweDAwNWMKKyNkZWZpbmUgU1lTUkVHX0pBVkFfTFYxCQkJCTB4MDA2MAorI2RlZmluZSBTWVNSRUdfSkFWQV9MVjIJCQkJMHgwMDY0CisjZGVmaW5lIFNZU1JFR19KQVZBX0xWMwkJCQkweDAwNjgKKyNkZWZpbmUgU1lTUkVHX0pBVkFfTFY0CQkJCTB4MDA2YworI2RlZmluZSBTWVNSRUdfSkFWQV9MVjUJCQkJMHgwMDcwCisjZGVmaW5lIFNZU1JFR19KQVZBX0xWNgkJCQkweDAwNzQKKyNkZWZpbmUgU1lTUkVHX0pBVkFfTFY3CQkJCTB4MDA3OAorI2RlZmluZSBTWVNSRUdfSlRCQQkJCQkweDAwN2MKKyNkZWZpbmUgU1lTUkVHX0pCQ1IJCQkJMHgwMDgwCisjZGVmaW5lIFNZU1JFR19DT05GSUcwCQkJCTB4MDEwMAorI2RlZmluZSBTWVNSRUdfQ09ORklHMQkJCQkweDAxMDQKKyNkZWZpbmUgU1lTUkVHX0NPVU5UCQkJCTB4MDEwOAorI2RlZmluZSBTWVNSRUdfQ09NUEFSRQkJCQkweDAxMGMKKyNkZWZpbmUgU1lTUkVHX1RMQkVISQkJCQkweDAxMTAKKyNkZWZpbmUgU1lTUkVHX1RMQkVMTwkJCQkweDAxMTQKKyNkZWZpbmUgU1lTUkVHX1BUQlIJCQkJMHgwMTE4CisjZGVmaW5lIFNZU1JFR19UTEJFQVIJCQkJMHgwMTFjCisjZGVmaW5lIFNZU1JFR19NTVVDUgkJCQkweDAxMjAKKyNkZWZpbmUgU1lTUkVHX1RMQkFSTE8JCQkJMHgwMTI0CisjZGVmaW5lIFNZU1JFR19UTEJBUkhJCQkJCTB4MDEyOAorI2RlZmluZSBTWVNSRUdfUENDTlQJCQkJMHgwMTJjCisjZGVmaW5lIFNZU1JFR19QQ05UMAkJCQkweDAxMzAKKyNkZWZpbmUgU1lTUkVHX1BDTlQxCQkJCTB4MDEzNAorI2RlZmluZSBTWVNSRUdfUENDUgkJCQkweDAxMzgKKyNkZWZpbmUgU1lTUkVHX0JFQVIJCQkJMHgwMTNjCisjZGVmaW5lIFNZU1JFR19TQUJBTAkJCQkweDAzMDAKKyNkZWZpbmUgU1lTUkVHX1NBQkFICQkJCTB4MDMwNAorI2RlZmluZSBTWVNSRUdfU0FCRAkJCQkweDAzMDgKIAogLyogQml0ZmllbGRzIGluIFNSICovCi0jZGVmaW5lIFNZU1JFR19TUl9DX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIFNZU1JFR19TUl9DX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIFNZU1JFR19aX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIFNZU1JFR19aX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIFNZU1JFR19TUl9OX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAyCi0jZGVmaW5lIFNZU1JFR19TUl9OX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIFNZU1JFR19TUl9WX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAzCi0jZGVmaW5lIFNZU1JFR19TUl9WX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIFNZU1JFR19RX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgICA0Ci0jZGVmaW5lIFNZU1JFR19RX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIFNZU1JFR19HTV9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgICAxNgotI2RlZmluZSBTWVNSRUdfR01fU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBTWVNSRUdfSTBNX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgMTcKLSNkZWZpbmUgU1lTUkVHX0kwTV9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgU1lTUkVHX0kxTV9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgIDE4Ci0jZGVmaW5lIFNZU1JFR19JMU1fU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIFNZU1JFR19JMk1fT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgICAxOQotI2RlZmluZSBTWVNSRUdfSTJNX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBTWVNSRUdfSTNNX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgMjAKLSNkZWZpbmUgU1lTUkVHX0kzTV9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgU1lTUkVHX0VNX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgIDIxCi0jZGVmaW5lIFNZU1JFR19FTV9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIFNZU1JFR19NMF9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgICAyMgotI2RlZmluZSBTWVNSRUdfTTBfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBTWVNSRUdfTTFfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgICAgMjMKLSNkZWZpbmUgU1lTUkVHX00xX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgU1lTUkVHX00yX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgIDI0Ci0jZGVmaW5lIFNZU1JFR19NMl9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIFNZU1JFR19TUl9EX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAyNgotI2RlZmluZSBTWVNSRUdfU1JfRF9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBTWVNSRUdfRE1fT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgICAgMjcKLSNkZWZpbmUgU1lTUkVHX0RNX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgU1lTUkVHX1NSX0pfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgIDI4Ci0jZGVmaW5lIFNZU1JFR19TUl9KX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIFNZU1JFR19SX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgICAyOQotI2RlZmluZSBTWVNSRUdfUl9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBTWVNSRUdfSF9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgICAgMzAKLSNkZWZpbmUgU1lTUkVHX0hfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKLQotLyogQml0ZmllbGRzIGluIEVWQkEgKi8KLQotLyogQml0ZmllbGRzIGluIEFDQkEgKi8KKyNkZWZpbmUgU1lTUkVHX1NSX0NfT0ZGU0VUCQkJMAorI2RlZmluZSBTWVNSRUdfU1JfQ19TSVpFCQkJMQorI2RlZmluZSBTWVNSRUdfWl9PRkZTRVQJCQkJMQorI2RlZmluZSBTWVNSRUdfWl9TSVpFCQkJCTEKKyNkZWZpbmUgU1lTUkVHX1NSX05fT0ZGU0VUCQkJMgorI2RlZmluZSBTWVNSRUdfU1JfTl9TSVpFCQkJMQorI2RlZmluZSBTWVNSRUdfU1JfVl9PRkZTRVQJCQkzCisjZGVmaW5lIFNZU1JFR19TUl9WX1NJWkUJCQkxCisjZGVmaW5lIFNZU1JFR19RX09GRlNFVAkJCQk0CisjZGVmaW5lIFNZU1JFR19RX1NJWkUJCQkJMQorI2RlZmluZSBTWVNSRUdfTF9PRkZTRVQJCQkJNQorI2RlZmluZSBTWVNSRUdfTF9TSVpFCQkJCTEKKyNkZWZpbmUgU1lTUkVHX1RfT0ZGU0VUCQkJCTE0CisjZGVmaW5lIFNZU1JFR19UX1NJWkUJCQkJMQorI2RlZmluZSBTWVNSRUdfU1JfUl9PRkZTRVQJCQkxNQorI2RlZmluZSBTWVNSRUdfU1JfUl9TSVpFCQkJMQorI2RlZmluZSBTWVNSRUdfR01fT0ZGU0VUCQkJMTYKKyNkZWZpbmUgU1lTUkVHX0dNX1NJWkUJCQkJMQorI2RlZmluZSBTWVNSRUdfSTBNX09GRlNFVAkJCTE3CisjZGVmaW5lIFNZU1JFR19JME1fU0laRQkJCQkxCisjZGVmaW5lIFNZU1JFR19JMU1fT0ZGU0VUCQkJMTgKKyNkZWZpbmUgU1lTUkVHX0kxTV9TSVpFCQkJCTEKKyNkZWZpbmUgU1lTUkVHX0kyTV9PRkZTRVQJCQkxOQorI2RlZmluZSBTWVNSRUdfSTJNX1NJWkUJCQkJMQorI2RlZmluZSBTWVNSRUdfSTNNX09GRlNFVAkJCTIwCisjZGVmaW5lIFNZU1JFR19JM01fU0laRQkJCQkxCisjZGVmaW5lIFNZU1JFR19FTV9PRkZTRVQJCQkyMQorI2RlZmluZSBTWVNSRUdfRU1fU0laRQkJCQkxCisjZGVmaW5lIFNZU1JFR19NMF9PRkZTRVQJCQkyMgorI2RlZmluZSBTWVNSRUdfTTBfU0laRQkJCQkxCisjZGVmaW5lIFNZU1JFR19NMV9PRkZTRVQJCQkyMworI2RlZmluZSBTWVNSRUdfTTFfU0laRQkJCQkxCisjZGVmaW5lIFNZU1JFR19NMl9PRkZTRVQJCQkyNAorI2RlZmluZSBTWVNSRUdfTTJfU0laRQkJCQkxCisjZGVmaW5lIFNZU1JFR19TUl9EX09GRlNFVAkJCTI2CisjZGVmaW5lIFNZU1JFR19TUl9EX1NJWkUJCQkxCisjZGVmaW5lIFNZU1JFR19ETV9PRkZTRVQJCQkyNworI2RlZmluZSBTWVNSRUdfRE1fU0laRQkJCQkxCisjZGVmaW5lIFNZU1JFR19TUl9KX09GRlNFVAkJCTI4CisjZGVmaW5lIFNZU1JFR19TUl9KX1NJWkUJCQkxCisjZGVmaW5lIFNZU1JFR19IX09GRlNFVAkJCQkyOQorI2RlZmluZSBTWVNSRUdfSF9TSVpFCQkJCTEKIAogLyogQml0ZmllbGRzIGluIENQVUNSICovCi0jZGVmaW5lIFNZU1JFR19CSV9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIFNZU1JFR19CSV9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIFNZU1JFR19CRV9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIFNZU1JFR19CRV9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIFNZU1JFR19GRV9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgICAyCi0jZGVmaW5lIFNZU1JFR19GRV9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIFNZU1JFR19SRV9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgICAzCi0jZGVmaW5lIFNZU1JFR19SRV9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIFNZU1JFR19JQkVfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgICA0Ci0jZGVmaW5lIFNZU1JFR19JQkVfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIFNZU1JFR19JRUVfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgICA1Ci0jZGVmaW5lIFNZU1JFR19JRUVfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAxCi0KLS8qIEJpdGZpZWxkcyBpbiBFQ1IgKi8KLSNkZWZpbmUgU1lTUkVHX0VDUl9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgU1lTUkVHX0VDUl9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgIDMyCi0KLS8qIEJpdGZpZWxkcyBpbiBSU1JfU1VQICovCi0KLS8qIEJpdGZpZWxkcyBpbiBSU1JfSU5UMCAqLwotCi0vKiBCaXRmaWVsZHMgaW4gUlNSX0lOVDEgKi8KLQotLyogQml0ZmllbGRzIGluIFJTUl9JTlQyICovCi0KLS8qIEJpdGZpZWxkcyBpbiBSU1JfSU5UMyAqLwotCi0vKiBCaXRmaWVsZHMgaW4gUlNSX0VYICovCi0KLS8qIEJpdGZpZWxkcyBpbiBSU1JfTk1JICovCi0KLS8qIEJpdGZpZWxkcyBpbiBSU1JfREJHICovCi0KLS8qIEJpdGZpZWxkcyBpbiBSQVJfU1VQICovCi0KLS8qIEJpdGZpZWxkcyBpbiBSQVJfSU5UMCAqLwotCi0vKiBCaXRmaWVsZHMgaW4gUkFSX0lOVDEgKi8KLQotLyogQml0ZmllbGRzIGluIFJBUl9JTlQyICovCi0KLS8qIEJpdGZpZWxkcyBpbiBSQVJfSU5UMyAqLwotCi0vKiBCaXRmaWVsZHMgaW4gUkFSX0VYICovCi0KLS8qIEJpdGZpZWxkcyBpbiBSQVJfTk1JICovCi0KLS8qIEJpdGZpZWxkcyBpbiBSQVJfREJHICovCi0KLS8qIEJpdGZpZWxkcyBpbiBKRUNSICovCi0KLS8qIEJpdGZpZWxkcyBpbiBKT1NQICovCi0KLS8qIEJpdGZpZWxkcyBpbiBKQVZBX0xWMCAqLwotCi0vKiBCaXRmaWVsZHMgaW4gSkFWQV9MVjEgKi8KLQotLyogQml0ZmllbGRzIGluIEpBVkFfTFYyICovCi0KLS8qIEJpdGZpZWxkcyBpbiBKQVZBX0xWMyAqLwotCi0vKiBCaXRmaWVsZHMgaW4gSkFWQV9MVjQgKi8KLQotLyogQml0ZmllbGRzIGluIEpBVkFfTFY1ICovCi0KLS8qIEJpdGZpZWxkcyBpbiBKQVZBX0xWNiAqLwotCi0vKiBCaXRmaWVsZHMgaW4gSkFWQV9MVjcgKi8KLQotLyogQml0ZmllbGRzIGluIEpUQkEgKi8KLQotLyogQml0ZmllbGRzIGluIEpCQ1IgKi8KKyNkZWZpbmUgU1lTUkVHX0JJX09GRlNFVAkJCTAKKyNkZWZpbmUgU1lTUkVHX0JJX1NJWkUJCQkJMQorI2RlZmluZSBTWVNSRUdfQkVfT0ZGU0VUCQkJMQorI2RlZmluZSBTWVNSRUdfQkVfU0laRQkJCQkxCisjZGVmaW5lIFNZU1JFR19GRV9PRkZTRVQJCQkyCisjZGVmaW5lIFNZU1JFR19GRV9TSVpFCQkJCTEKKyNkZWZpbmUgU1lTUkVHX1JFX09GRlNFVAkJCTMKKyNkZWZpbmUgU1lTUkVHX1JFX1NJWkUJCQkJMQorI2RlZmluZSBTWVNSRUdfSUJFX09GRlNFVAkJCTQKKyNkZWZpbmUgU1lTUkVHX0lCRV9TSVpFCQkJCTEKKyNkZWZpbmUgU1lTUkVHX0lFRV9PRkZTRVQJCQk1CisjZGVmaW5lIFNZU1JFR19JRUVfU0laRQkJCQkxCiAKIC8qIEJpdGZpZWxkcyBpbiBDT05GSUcwICovCi0jZGVmaW5lIFNZU1JFR19DT05GSUcwX0RfT0ZGU0VUICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIFNZU1JFR19DT05GSUcwX0RfU0laRSAgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIFNZU1JFR19DT05GSUcwX1NfT0ZGU0VUICAgICAgICAgICAgICAgICAyCi0jZGVmaW5lIFNZU1JFR19DT05GSUcwX1NfU0laRSAgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIFNZU1JFR19PX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgICAzCi0jZGVmaW5lIFNZU1JFR19PX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIFNZU1JFR19QX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgICA0Ci0jZGVmaW5lIFNZU1JFR19QX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIFNZU1JFR19DT05GSUcwX0pfT0ZGU0VUICAgICAgICAgICAgICAgICA1Ci0jZGVmaW5lIFNZU1JFR19DT05GSUcwX0pfU0laRSAgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIFNZU1JFR19GX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgICA2Ci0jZGVmaW5lIFNZU1JFR19GX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIFNZU1JFR19NTVVUX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICA3Ci0jZGVmaW5lIFNZU1JFR19NTVVUX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAzCi0jZGVmaW5lIFNZU1JFR19BUl9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgICAxMAotI2RlZmluZSBTWVNSRUdfQVJfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgMwotI2RlZmluZSBTWVNSRUdfQVRfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgICAgMTMKLSNkZWZpbmUgU1lTUkVHX0FUX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgIDMKLSNkZWZpbmUgU1lTUkVHX1BST0NFU1NPUlJFVklTSU9OX09GRlNFVCAgICAgICAgIDE2Ci0jZGVmaW5lIFNZU1JFR19QUk9DRVNTT1JSRVZJU0lPTl9TSVpFICAgICAgICAgICA4Ci0jZGVmaW5lIFNZU1JFR19QUk9DRVNTT1JJRF9PRkZTRVQgICAgICAgICAgICAgICAyNAotI2RlZmluZSBTWVNSRUdfUFJPQ0VTU09SSURfU0laRSAgICAgICAgICAgICAgICAgOAorI2RlZmluZSBTWVNSRUdfQ09ORklHMF9SX09GRlNFVAkJCTAKKyNkZWZpbmUgU1lTUkVHX0NPTkZJRzBfUl9TSVpFCQkJMQorI2RlZmluZSBTWVNSRUdfQ09ORklHMF9EX09GRlNFVAkJCTEKKyNkZWZpbmUgU1lTUkVHX0NPTkZJRzBfRF9TSVpFCQkJMQorI2RlZmluZSBTWVNSRUdfQ09ORklHMF9TX09GRlNFVAkJCTIKKyNkZWZpbmUgU1lTUkVHX0NPTkZJRzBfU19TSVpFCQkJMQorI2RlZmluZSBTWVNSRUdfQ09ORklHMF9PX09GRlNFVAkJCTMKKyNkZWZpbmUgU1lTUkVHX0NPTkZJRzBfT19TSVpFCQkJMQorI2RlZmluZSBTWVNSRUdfQ09ORklHMF9QX09GRlNFVAkJCTQKKyNkZWZpbmUgU1lTUkVHX0NPTkZJRzBfUF9TSVpFCQkJMQorI2RlZmluZSBTWVNSRUdfQ09ORklHMF9KX09GRlNFVAkJCTUKKyNkZWZpbmUgU1lTUkVHX0NPTkZJRzBfSl9TSVpFCQkJMQorI2RlZmluZSBTWVNSRUdfQ09ORklHMF9GX09GRlNFVAkJCTYKKyNkZWZpbmUgU1lTUkVHX0NPTkZJRzBfRl9TSVpFCQkJMQorI2RlZmluZSBTWVNSRUdfTU1VVF9PRkZTRVQJCQk3CisjZGVmaW5lIFNZU1JFR19NTVVUX1NJWkUJCQkzCisjZGVmaW5lIFNZU1JFR19BUl9PRkZTRVQJCQkxMAorI2RlZmluZSBTWVNSRUdfQVJfU0laRQkJCQkzCisjZGVmaW5lIFNZU1JFR19BVF9PRkZTRVQJCQkxMworI2RlZmluZSBTWVNSRUdfQVRfU0laRQkJCQkzCisjZGVmaW5lIFNZU1JFR19QUk9DRVNTT1JSRVZJU0lPTl9PRkZTRVQJCTE2CisjZGVmaW5lIFNZU1JFR19QUk9DRVNTT1JSRVZJU0lPTl9TSVpFCQk4CisjZGVmaW5lIFNZU1JFR19QUk9DRVNTT1JJRF9PRkZTRVQJCTI0CisjZGVmaW5lIFNZU1JFR19QUk9DRVNTT1JJRF9TSVpFCQkJOAogCiAvKiBCaXRmaWVsZHMgaW4gQ09ORklHMSAqLwotI2RlZmluZSBTWVNSRUdfREFTU19PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBTWVNSRUdfREFTU19TSVpFICAgICAgICAgICAgICAgICAgICAgICAgMwotI2RlZmluZSBTWVNSRUdfRExTWl9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgMwotI2RlZmluZSBTWVNSRUdfRExTWl9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgMwotI2RlZmluZSBTWVNSRUdfRFNFVF9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgNgotI2RlZmluZSBTWVNSRUdfRFNFVF9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgNAotI2RlZmluZSBTWVNSRUdfSUFTU19PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgMTAKLSNkZWZpbmUgU1lTUkVHX0lBU1NfU0laRSAgICAgICAgICAgICAgICAgICAgICAgIDIKLSNkZWZpbmUgU1lTUkVHX0lMU1pfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgIDEzCi0jZGVmaW5lIFNZU1JFR19JTFNaX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAzCi0jZGVmaW5lIFNZU1JFR19JU0VUX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAxNgotI2RlZmluZSBTWVNSRUdfSVNFVF9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgNAotI2RlZmluZSBTWVNSRUdfRE1NVVNaX09GRlNFVCAgICAgICAgICAgICAgICAgICAgMjAKLSNkZWZpbmUgU1lTUkVHX0RNTVVTWl9TSVpFICAgICAgICAgICAgICAgICAgICAgIDYKLSNkZWZpbmUgU1lTUkVHX0lNTVVTWl9PRkZTRVQgICAgICAgICAgICAgICAgICAgIDI2Ci0jZGVmaW5lIFNZU1JFR19JTU1VU1pfU0laRSAgICAgICAgICAgICAgICAgICAgICA2Ci0KLS8qIEJpdGZpZWxkcyBpbiBDT1VOVCAqLwotCi0vKiBCaXRmaWVsZHMgaW4gQ09NUEFSRSAqLworI2RlZmluZSBTWVNSRUdfREFTU19PRkZTRVQJCQkwCisjZGVmaW5lIFNZU1JFR19EQVNTX1NJWkUJCQkzCisjZGVmaW5lIFNZU1JFR19ETFNaX09GRlNFVAkJCTMKKyNkZWZpbmUgU1lTUkVHX0RMU1pfU0laRQkJCTMKKyNkZWZpbmUgU1lTUkVHX0RTRVRfT0ZGU0VUCQkJNgorI2RlZmluZSBTWVNSRUdfRFNFVF9TSVpFCQkJNAorI2RlZmluZSBTWVNSRUdfSUFTU19PRkZTRVQJCQkxMAorI2RlZmluZSBTWVNSRUdfSUFTU19TSVpFCQkJMworI2RlZmluZSBTWVNSRUdfSUxTWl9PRkZTRVQJCQkxMworI2RlZmluZSBTWVNSRUdfSUxTWl9TSVpFCQkJMworI2RlZmluZSBTWVNSRUdfSVNFVF9PRkZTRVQJCQkxNgorI2RlZmluZSBTWVNSRUdfSVNFVF9TSVpFCQkJNAorI2RlZmluZSBTWVNSRUdfRE1NVVNaX09GRlNFVAkJCTIwCisjZGVmaW5lIFNZU1JFR19ETU1VU1pfU0laRQkJCTYKKyNkZWZpbmUgU1lTUkVHX0lNTVVTWl9PRkZTRVQJCQkyNgorI2RlZmluZSBTWVNSRUdfSU1NVVNaX1NJWkUJCQk2CiAKIC8qIEJpdGZpZWxkcyBpbiBUTEJFSEkgKi8KLSNkZWZpbmUgU1lTUkVHX0FTSURfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgU1lTUkVHX0FTSURfU0laRSAgICAgICAgICAgICAgICAgICAgICAgIDgKLSNkZWZpbmUgU1lTUkVHX1RMQkVISV9JX09GRlNFVCAgICAgICAgICAgICAgICAgIDgKLSNkZWZpbmUgU1lTUkVHX1RMQkVISV9JX1NJWkUgICAgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgU1lTUkVHX1RMQkVISV9WX09GRlNFVCAgICAgICAgICAgICAgICAgIDkKLSNkZWZpbmUgU1lTUkVHX1RMQkVISV9WX1NJWkUgICAgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgU1lTUkVHX1ZQTl9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgIDEwCi0jZGVmaW5lIFNZU1JFR19WUE5fU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAyMgorI2RlZmluZSBTWVNSRUdfQVNJRF9PRkZTRVQJCQkwCisjZGVmaW5lIFNZU1JFR19BU0lEX1NJWkUJCQk4CisjZGVmaW5lIFNZU1JFR19UTEJFSElfSV9PRkZTRVQJCQk4CisjZGVmaW5lIFNZU1JFR19UTEJFSElfSV9TSVpFCQkJMQorI2RlZmluZSBTWVNSRUdfVExCRUhJX1ZfT0ZGU0VUCQkJOQorI2RlZmluZSBTWVNSRUdfVExCRUhJX1ZfU0laRQkJCTEKKyNkZWZpbmUgU1lTUkVHX1ZQTl9PRkZTRVQJCQkxMAorI2RlZmluZSBTWVNSRUdfVlBOX1NJWkUJCQkJMjIKIAogLyogQml0ZmllbGRzIGluIFRMQkVMTyAqLwotI2RlZmluZSBTWVNSRUdfV19PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBTWVNSRUdfV19TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBTWVNSRUdfVExCRUxPX0RfT0ZGU0VUICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBTWVNSRUdfVExCRUxPX0RfU0laRSAgICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBTWVNSRUdfU1pfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgICAgMgotI2RlZmluZSBTWVNSRUdfU1pfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgMgotI2RlZmluZSBTWVNSRUdfQVBfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgICAgNAotI2RlZmluZSBTWVNSRUdfQVBfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgMwotI2RlZmluZSBTWVNSRUdfQl9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgICAgNwotI2RlZmluZSBTWVNSRUdfQl9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBTWVNSRUdfR19PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgICAgOAotI2RlZmluZSBTWVNSRUdfR19TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBTWVNSRUdfVExCRUxPX0NfT0ZGU0VUICAgICAgICAgICAgICAgICAgOQotI2RlZmluZSBTWVNSRUdfVExCRUxPX0NfU0laRSAgICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBTWVNSRUdfUEZOX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgMTAKLSNkZWZpbmUgU1lTUkVHX1BGTl9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgIDIyCi0KLS8qIEJpdGZpZWxkcyBpbiBQVEJSICovCi0KLS8qIEJpdGZpZWxkcyBpbiBUTEJFQVIgKi8KKyNkZWZpbmUgU1lTUkVHX1dfT0ZGU0VUCQkJCTAKKyNkZWZpbmUgU1lTUkVHX1dfU0laRQkJCQkxCisjZGVmaW5lIFNZU1JFR19UTEJFTE9fRF9PRkZTRVQJCQkxCisjZGVmaW5lIFNZU1JFR19UTEJFTE9fRF9TSVpFCQkJMQorI2RlZmluZSBTWVNSRUdfU1pfT0ZGU0VUCQkJMgorI2RlZmluZSBTWVNSRUdfU1pfU0laRQkJCQkyCisjZGVmaW5lIFNZU1JFR19BUF9PRkZTRVQJCQk0CisjZGVmaW5lIFNZU1JFR19BUF9TSVpFCQkJCTMKKyNkZWZpbmUgU1lTUkVHX0JfT0ZGU0VUCQkJCTcKKyNkZWZpbmUgU1lTUkVHX0JfU0laRQkJCQkxCisjZGVmaW5lIFNZU1JFR19HX09GRlNFVAkJCQk4CisjZGVmaW5lIFNZU1JFR19HX1NJWkUJCQkJMQorI2RlZmluZSBTWVNSRUdfVExCRUxPX0NfT0ZGU0VUCQkJOQorI2RlZmluZSBTWVNSRUdfVExCRUxPX0NfU0laRQkJCTEKKyNkZWZpbmUgU1lTUkVHX1BGTl9PRkZTRVQJCQkxMAorI2RlZmluZSBTWVNSRUdfUEZOX1NJWkUJCQkJMjIKIAogLyogQml0ZmllbGRzIGluIE1NVUNSICovCi0jZGVmaW5lIFNZU1JFR19FX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIFNZU1JFR19FX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIFNZU1JFR19NX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIFNZU1JFR19NX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIFNZU1JFR19NTVVDUl9JX09GRlNFVCAgICAgICAgICAgICAgICAgICAyCi0jZGVmaW5lIFNZU1JFR19NTVVDUl9JX1NJWkUgICAgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIFNZU1JFR19NTVVDUl9OX09GRlNFVCAgICAgICAgICAgICAgICAgICAzCi0jZGVmaW5lIFNZU1JFR19NTVVDUl9OX1NJWkUgICAgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIFNZU1JFR19NTVVDUl9TX09GRlNFVCAgICAgICAgICAgICAgICAgICA0Ci0jZGVmaW5lIFNZU1JFR19NTVVDUl9TX1NJWkUgICAgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIFNZU1JFR19ETEFfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgICA4Ci0jZGVmaW5lIFNZU1JFR19ETEFfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICA2Ci0jZGVmaW5lIFNZU1JFR19EUlBfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgICAxNAotI2RlZmluZSBTWVNSRUdfRFJQX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgNgotI2RlZmluZSBTWVNSRUdfSUxBX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgMjAKLSNkZWZpbmUgU1lTUkVHX0lMQV9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgIDYKLSNkZWZpbmUgU1lTUkVHX0lSUF9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgIDI2Ci0jZGVmaW5lIFNZU1JFR19JUlBfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICA2Ci0KLS8qIEJpdGZpZWxkcyBpbiBUTEJBUkxPICovCi0KLS8qIEJpdGZpZWxkcyBpbiBUTEJBUkhJICovCi0KLS8qIEJpdGZpZWxkcyBpbiBQQ0NOVCAqLwotCi0vKiBCaXRmaWVsZHMgaW4gUENOVDAgKi8KLQotLyogQml0ZmllbGRzIGluIFBDTlQxICovCisjZGVmaW5lIFNZU1JFR19FX09GRlNFVAkJCQkwCisjZGVmaW5lIFNZU1JFR19FX1NJWkUJCQkJMQorI2RlZmluZSBTWVNSRUdfTV9PRkZTRVQJCQkJMQorI2RlZmluZSBTWVNSRUdfTV9TSVpFCQkJCTEKKyNkZWZpbmUgU1lTUkVHX01NVUNSX0lfT0ZGU0VUCQkJMgorI2RlZmluZSBTWVNSRUdfTU1VQ1JfSV9TSVpFCQkJMQorI2RlZmluZSBTWVNSRUdfTU1VQ1JfTl9PRkZTRVQJCQkzCisjZGVmaW5lIFNZU1JFR19NTVVDUl9OX1NJWkUJCQkxCisjZGVmaW5lIFNZU1JFR19NTVVDUl9TX09GRlNFVAkJCTQKKyNkZWZpbmUgU1lTUkVHX01NVUNSX1NfU0laRQkJCTEKKyNkZWZpbmUgU1lTUkVHX0RMQV9PRkZTRVQJCQk4CisjZGVmaW5lIFNZU1JFR19ETEFfU0laRQkJCQk2CisjZGVmaW5lIFNZU1JFR19EUlBfT0ZGU0VUCQkJMTQKKyNkZWZpbmUgU1lTUkVHX0RSUF9TSVpFCQkJCTYKKyNkZWZpbmUgU1lTUkVHX0lMQV9PRkZTRVQJCQkyMAorI2RlZmluZSBTWVNSRUdfSUxBX1NJWkUJCQkJNgorI2RlZmluZSBTWVNSRUdfSVJQX09GRlNFVAkJCTI2CisjZGVmaW5lIFNZU1JFR19JUlBfU0laRQkJCQk2CiAKIC8qIEJpdGZpZWxkcyBpbiBQQ0NSICovCi0KLS8qIEJpdGZpZWxkcyBpbiBCRUFSICovCisjZGVmaW5lIFNZU1JFR19QQ0NSX1JfT0ZGU0VUCQkJMQorI2RlZmluZSBTWVNSRUdfUENDUl9SX1NJWkUJCQkxCisjZGVmaW5lIFNZU1JFR19QQ0NSX0NfT0ZGU0VUCQkJMgorI2RlZmluZSBTWVNSRUdfUENDUl9DX1NJWkUJCQkxCisjZGVmaW5lIFNZU1JFR19QQ0NSX1NfT0ZGU0VUCQkJMworI2RlZmluZSBTWVNSRUdfUENDUl9TX1NJWkUJCQkxCisjZGVmaW5lIFNZU1JFR19JRUNfT0ZGU0VUCQkJNAorI2RlZmluZSBTWVNSRUdfSUVDX1NJWkUJCQkJMQorI2RlZmluZSBTWVNSRUdfSUUwX09GRlNFVAkJCTUKKyNkZWZpbmUgU1lTUkVHX0lFMF9TSVpFCQkJCTEKKyNkZWZpbmUgU1lTUkVHX0lFMV9PRkZTRVQJCQk2CisjZGVmaW5lIFNZU1JFR19JRTFfU0laRQkJCQkxCisjZGVmaW5lIFNZU1JFR19GQ19PRkZTRVQJCQk4CisjZGVmaW5lIFNZU1JFR19GQ19TSVpFCQkJCTEKKyNkZWZpbmUgU1lTUkVHX0YwX09GRlNFVAkJCTkKKyNkZWZpbmUgU1lTUkVHX0YwX1NJWkUJCQkJMQorI2RlZmluZSBTWVNSRUdfRjFfT0ZGU0VUCQkJMTAKKyNkZWZpbmUgU1lTUkVHX0YxX1NJWkUJCQkJMQorI2RlZmluZSBTWVNSRUdfQ09ORjBfT0ZGU0VUCQkJMTIKKyNkZWZpbmUgU1lTUkVHX0NPTkYwX1NJWkUJCQk2CisjZGVmaW5lIFNZU1JFR19DT05GMV9PRkZTRVQJCQkxOAorI2RlZmluZSBTWVNSRUdfQ09ORjFfU0laRQkJCTYKIAogLyogQ29uc3RhbnRzIGZvciBFQ1IgKi8KLSNkZWZpbmUgRUNSX1VOUkVDT1ZFUkFCTEUgICAgICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgRUNSX1RMQl9NVUxUSVBMRSAgICAgICAgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgRUNSX0JVU19FUlJPUl9XUklURSAgICAgICAgICAgICAgICAgICAgIDIKLSNkZWZpbmUgRUNSX0JVU19FUlJPUl9SRUFEICAgICAgICAgICAgICAgICAgICAgIDMKLSNkZWZpbmUgRUNSX05NSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQKLSNkZWZpbmUgRUNSX0FERFJfQUxJR05fWCAgICAgICAgICAgICAgICAgICAgICAgIDUKLSNkZWZpbmUgRUNSX1BST1RFQ1RJT05fWCAgICAgICAgICAgICAgICAgICAgICAgIDYKLSNkZWZpbmUgRUNSX0RFQlVHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcKLSNkZWZpbmUgRUNSX0lMTEVHQUxfT1BDT0RFICAgICAgICAgICAgICAgICAgICAgIDgKLSNkZWZpbmUgRUNSX1VOSU1QTF9JTlNUUlVDVElPTiAgICAgICAgICAgICAgICAgIDkKLSNkZWZpbmUgRUNSX1BSSVZJTEVHRV9WSU9MQVRJT04gICAgICAgICAgICAgICAgIDEwCi0jZGVmaW5lIEVDUl9GUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMQotI2RlZmluZSBFQ1JfQ09QUk9DX0FCU0VOVCAgICAgICAgICAgICAgICAgICAgICAgMTIKLSNkZWZpbmUgRUNSX0FERFJfQUxJR05fUiAgICAgICAgICAgICAgICAgICAgICAgIDEzCi0jZGVmaW5lIEVDUl9BRERSX0FMSUdOX1cgICAgICAgICAgICAgICAgICAgICAgICAxNAotI2RlZmluZSBFQ1JfUFJPVEVDVElPTl9SICAgICAgICAgICAgICAgICAgICAgICAgMTUKLSNkZWZpbmUgRUNSX1BST1RFQ1RJT05fVyAgICAgICAgICAgICAgICAgICAgICAgIDE2Ci0jZGVmaW5lIEVDUl9EVExCX01PRElGSUVEICAgICAgICAgICAgICAgICAgICAgICAxNwotI2RlZmluZSBFQ1JfVExCX01JU1NfWCAgICAgICAgICAgICAgICAgICAgICAgICAgMjAKLSNkZWZpbmUgRUNSX1RMQl9NSVNTX1IgICAgICAgICAgICAgICAgICAgICAgICAgIDI0Ci0jZGVmaW5lIEVDUl9UTEJfTUlTU19XICAgICAgICAgICAgICAgICAgICAgICAgICAyOAorI2RlZmluZSBFQ1JfVU5SRUNPVkVSQUJMRQkJCTAKKyNkZWZpbmUgRUNSX1RMQl9NVUxUSVBMRQkJCTEKKyNkZWZpbmUgRUNSX0JVU19FUlJPUl9XUklURQkJCTIKKyNkZWZpbmUgRUNSX0JVU19FUlJPUl9SRUFECQkJMworI2RlZmluZSBFQ1JfTk1JCQkJCQk0CisjZGVmaW5lIEVDUl9BRERSX0FMSUdOX1gJCQk1CisjZGVmaW5lIEVDUl9QUk9URUNUSU9OX1gJCQk2CisjZGVmaW5lIEVDUl9ERUJVRwkJCQk3CisjZGVmaW5lIEVDUl9JTExFR0FMX09QQ09ERQkJCTgKKyNkZWZpbmUgRUNSX1VOSU1QTF9JTlNUUlVDVElPTgkJCTkKKyNkZWZpbmUgRUNSX1BSSVZJTEVHRV9WSU9MQVRJT04JCQkxMAorI2RlZmluZSBFQ1JfRlBFCQkJCQkxMQorI2RlZmluZSBFQ1JfQ09QUk9DX0FCU0VOVAkJCTEyCisjZGVmaW5lIEVDUl9BRERSX0FMSUdOX1IJCQkxMworI2RlZmluZSBFQ1JfQUREUl9BTElHTl9XCQkJMTQKKyNkZWZpbmUgRUNSX1BST1RFQ1RJT05fUgkJCTE1CisjZGVmaW5lIEVDUl9QUk9URUNUSU9OX1cJCQkxNgorI2RlZmluZSBFQ1JfRFRMQl9NT0RJRklFRAkJCTE3CisjZGVmaW5lIEVDUl9UTEJfTUlTU19YCQkJCTIwCisjZGVmaW5lIEVDUl9UTEJfTUlTU19SCQkJCTI0CisjZGVmaW5lIEVDUl9UTEJfTUlTU19XCQkJCTI4CiAKIC8qIEJpdCBtYW5pcHVsYXRpb24gbWFjcm9zICovCi0jZGVmaW5lIFNZU1JFR19CSVQobmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCBTWVNSRUdfIyNuYW1lIyNfT0ZGU0VUKQotI2RlZmluZSBTWVNSRUdfQkYobmFtZSx2YWx1ZSkgICAgICAgICAgICAgICAgICAgKCgodmFsdWUpICYgKCgxIDw8IFNZU1JFR18jI25hbWUjI19TSVpFKSAtIDEpKSA8PCBTWVNSRUdfIyNuYW1lIyNfT0ZGU0VUKQotI2RlZmluZSBTWVNSRUdfQkZFWFQobmFtZSx2YWx1ZSkgICAgICAgICAgICAgICAgKCgodmFsdWUpID4+IFNZU1JFR18jI25hbWUjI19PRkZTRVQpICYgKCgxIDw8IFNZU1JFR18jI25hbWUjI19TSVpFKSAtIDEpKQotI2RlZmluZSBTWVNSRUdfQkZJTlMobmFtZSx2YWx1ZSxvbGQpICAgICAgICAgICAgKCgob2xkKSAmIH4oKCgxIDw8IFNZU1JFR18jI25hbWUjI19TSVpFKSAtIDEpIDw8IFNZU1JFR18jI25hbWUjI19PRkZTRVQpKSB8IFNZU1JFR19CRihuYW1lLHZhbHVlKSkKKyNkZWZpbmUgU1lTUkVHX0JJVChuYW1lKQkJCQlcCisJKDEgPDwgU1lTUkVHXyMjbmFtZSMjX09GRlNFVCkKKyNkZWZpbmUgU1lTUkVHX0JGKG5hbWUsdmFsdWUpCQkJCVwKKwkoKCh2YWx1ZSkgJiAoKDEgPDwgU1lTUkVHXyMjbmFtZSMjX1NJWkUpIC0gMSkpCVwKKwkgPDwgU1lTUkVHXyMjbmFtZSMjX09GRlNFVCkKKyNkZWZpbmUgU1lTUkVHX0JGRVhUKG5hbWUsdmFsdWUpXAorCSgoKHZhbHVlKSA+PiBTWVNSRUdfIyNuYW1lIyNfT0ZGU0VUKQkJXAorCSAmICgoMSA8PCBTWVNSRUdfIyNuYW1lIyNfU0laRSkgLSAxKSkKKyNkZWZpbmUgU1lTUkVHX0JGSU5TKG5hbWUsdmFsdWUsb2xkKQkJCVwKKwkoKChvbGQpICYgfigoKDEgPDwgU1lTUkVHXyMjbmFtZSMjX1NJWkUpIC0gMSkJXAorCQkgICAgPDwgU1lTUkVHXyMjbmFtZSMjX09GRlNFVCkpCQlcCisJIHwgU1lTUkVHX0JGKG5hbWUsdmFsdWUpKQogCisvKiBSZWdpc3RlciBhY2Nlc3MgbWFjcm9zICovCiAjaWZkZWYgX19DSEVDS0VSX18KIGV4dGVybiB1bnNpZ25lZCBsb25nIF9fYnVpbHRpbl9tZnNyKHVuc2lnbmVkIGxvbmcgcmVnKTsKIGV4dGVybiB2b2lkIF9fYnVpbHRpbl9tdHNyKHVuc2lnbmVkIGxvbmcgcmVnLCB1bnNpZ25lZCBsb25nIHZhbHVlKTsKICNlbmRpZgogCi0vKiBSZWdpc3RlciBhY2Nlc3MgbWFjcm9zICovCi0jZGVmaW5lIHN5c3JlZ19yZWFkKHJlZykgICAgICAgICAgICAgICAgICAgICAgICBfX2J1aWx0aW5fbWZzcihTWVNSRUdfIyNyZWcpCi0jZGVmaW5lIHN5c3JlZ193cml0ZShyZWcsIHZhbHVlKSAgICAgICAgICAgICAgICBfX2J1aWx0aW5fbXRzcihTWVNSRUdfIyNyZWcsIHZhbHVlKQorI2RlZmluZSBzeXNyZWdfcmVhZChyZWcpCQlfX2J1aWx0aW5fbWZzcihTWVNSRUdfIyNyZWcpCisjZGVmaW5lIHN5c3JlZ193cml0ZShyZWcsIHZhbHVlKQlfX2J1aWx0aW5fbXRzcihTWVNSRUdfIyNyZWcsIHZhbHVlKQogCi0jZW5kaWYgLyogX19BU01fQVZSMzJfU1lTUkVHX0hfXyAqLworI2VuZGlmIC8qIF9fQVNNX0FWUjMyX1NZU1JFR19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hdnIzMi9zeXN0ZW0uaCBiL2luY2x1ZGUvYXNtLWF2cjMyL3N5c3RlbS5oCmluZGV4IGFjNTk2MDU4Li5hODIzNmJhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hdnIzMi9zeXN0ZW0uaAorKysgYi9pbmNsdWRlL2FzbS1hdnIzMi9zeXN0ZW0uaApAQCAtOSw2ICs5LDcgQEAKICNkZWZpbmUgX19BU01fQVZSMzJfU1lTVEVNX0gKIAogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CkBAIC0xNDAsMTUgKzE0MSw5IEBACiAJCQkJICAgc2l6ZW9mKCoocHRyKSkpKQogCiBzdHJ1Y3QgcHRfcmVnczsKLWV4dGVybiB2b2lkIF9fZGllKGNvbnN0IGNoYXIgKiwgc3RydWN0IHB0X3JlZ3MgKiwgdW5zaWduZWQgbG9uZywKLQkJICBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgbG9uZyk7Ci1leHRlcm4gdm9pZCBfX2RpZV9pZl9rZXJuZWwoY29uc3QgY2hhciAqLCBzdHJ1Y3QgcHRfcmVncyAqLCB1bnNpZ25lZCBsb25nLAotCQkJICAgIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCB1bnNpZ25lZCBsb25nKTsKLQotI2RlZmluZSBkaWUobXNnLCByZWdzLCBlcnIpCQkJCQlcCi0JX19kaWUobXNnLCByZWdzLCBlcnIsIF9fRklMRV9fICI6IiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXykKLSNkZWZpbmUgZGllX2lmX2tlcm5lbChtc2csIHJlZ3MsIGVycikJCQkJCVwKLQlfX2RpZV9pZl9rZXJuZWwobXNnLCByZWdzLCBlcnIsIF9fRklMRV9fICI6IiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXykKK3ZvaWQgTk9SRVRfVFlQRSBkaWUoY29uc3QgY2hhciAqc3RyLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywgbG9uZyBlcnIpOwordm9pZCBfZXhjZXB0aW9uKGxvbmcgc2lnbnIsIHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgY29kZSwKKwkJdW5zaWduZWQgbG9uZyBhZGRyKTsKIAogI2RlZmluZSBhcmNoX2FsaWduX3N0YWNrKHgpCSh4KQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hdnIzMi90aHJlYWRfaW5mby5oIGIvaW5jbHVkZS9hc20tYXZyMzIvdGhyZWFkX2luZm8uaAppbmRleCBkMWY1YjM1Li5hMmU2MDZkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hdnIzMi90aHJlYWRfaW5mby5oCisrKyBiL2luY2x1ZGUvYXNtLWF2cjMyL3RocmVhZF9pbmZvLmgKQEAgLTgzLDYgKzgzLDcgQEAKICNkZWZpbmUgVElGX1NJTkdMRV9TVEVQCQk2CS8qIHNpbmdsZSBzdGVwIGFmdGVyIG5leHQgYnJlYWsgKi8KICNkZWZpbmUgVElGX01FTURJRQkJNwogI2RlZmluZSBUSUZfUkVTVE9SRV9TSUdNQVNLCTgJLyogcmVzdG9yZSBzaWduYWwgbWFzayBpbiBkb19zaWduYWwgKi8KKyNkZWZpbmUgVElGX0NQVV9HT0lOR19UT19TTEVFUAk5CS8qIENQVSBpcyBlbnRlcmluZyBzbGVlcCAwIG1vZGUgKi8KICNkZWZpbmUgVElGX1VTRVJTUEFDRQkJMzEgICAgICAvKiB0cnVlIGlmIEZTIHNldHMgdXNlcnNwYWNlICovCiAKICNkZWZpbmUgX1RJRl9TWVNDQUxMX1RSQUNFCSgxIDw8IFRJRl9TWVNDQUxMX1RSQUNFKQpAQCAtOTQsNiArOTUsNyBAQAogI2RlZmluZSBfVElGX1NJTkdMRV9TVEVQCSgxIDw8IFRJRl9TSU5HTEVfU1RFUCkKICNkZWZpbmUgX1RJRl9NRU1ESUUJCSgxIDw8IFRJRl9NRU1ESUUpCiAjZGVmaW5lIF9USUZfUkVTVE9SRV9TSUdNQVNLCSgxIDw8IFRJRl9SRVNUT1JFX1NJR01BU0spCisjZGVmaW5lIF9USUZfQ1BVX0dPSU5HX1RPX1NMRUVQICgxIDw8IFRJRl9DUFVfR09JTkdfVE9fU0xFRVApCiAKIC8qIFhYWDogVGhlc2UgdHdvIG1hc2tzIG11c3QgbmV2ZXIgc3BhbiBtb3JlIHRoYW4gMTYgYml0cyEgKi8KIC8qIHdvcmsgdG8gZG8gb24gaW50ZXJydXB0L2V4Y2VwdGlvbiByZXR1cm4gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWF2cjMyL3VhY2Nlc3MuaCBiL2luY2x1ZGUvYXNtLWF2cjMyL3VhY2Nlc3MuaAppbmRleCA3NGE2NzllOS4uZWQwOTIzOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXZyMzIvdWFjY2Vzcy5oCisrKyBiL2luY2x1ZGUvYXNtLWF2cjMyL3VhY2Nlc3MuaApAQCAtMTgxLDI0ICsxODEsMjMgQEAKIAogI2RlZmluZSBfX2dldF91c2VyX25vY2hlY2soeCwgcHRyLCBzaXplKQkJCQlcCiAoewkJCQkJCQkJCVwKLQl0eXBlb2YoKihwdHIpKSBfX2d1X3ZhbCA9ICh0eXBlb2YoKihwdHIpKSBfX2ZvcmNlKTA7CQlcCisJdW5zaWduZWQgbG9uZyBfX2d1X3ZhbCA9IDA7CQkJCQlcCiAJaW50IF9fZ3VfZXJyID0gMDsJCQkJCQlcCiAJCQkJCQkJCQlcCiAJc3dpdGNoIChzaXplKSB7CQkJCQkJCVwKIAljYXNlIDE6IF9fZ2V0X3VzZXJfYXNtKCJ1YiIsIF9fZ3VfdmFsLCBwdHIsIF9fZ3VfZXJyKTsgYnJlYWs7CVwKIAljYXNlIDI6IF9fZ2V0X3VzZXJfYXNtKCJ1aCIsIF9fZ3VfdmFsLCBwdHIsIF9fZ3VfZXJyKTsgYnJlYWs7CVwKIAljYXNlIDQ6IF9fZ2V0X3VzZXJfYXNtKCJ3IiwgX19ndV92YWwsIHB0ciwgX19ndV9lcnIpOyBicmVhazsJXAotCWNhc2UgODogX19nZXRfdXNlcl9hc20oImQiLCBfX2d1X3ZhbCwgcHRyLCBfX2d1X2Vycik7IGJyZWFrOwlcCiAJZGVmYXVsdDogX19ndV9lcnIgPSBfX2dldF91c2VyX2JhZCgpOyBicmVhazsJCQlcCiAJfQkJCQkJCQkJXAogCQkJCQkJCQkJXAotCXggPSBfX2d1X3ZhbDsJCQkJCQkJXAorCXggPSAodHlwZW9mKCoocHRyKSkpX19ndV92YWw7CQkJCQlcCiAJX19ndV9lcnI7CQkJCQkJCVwKIH0pCiAKICNkZWZpbmUgX19nZXRfdXNlcl9jaGVjayh4LCBwdHIsIHNpemUpCQkJCQlcCiAoewkJCQkJCQkJCVwKLQl0eXBlb2YoKihwdHIpKSBfX2d1X3ZhbCA9ICh0eXBlb2YoKihwdHIpKSBfX2ZvcmNlKTA7CQlcCisJdW5zaWduZWQgbG9uZyBfX2d1X3ZhbCA9IDA7CQkJCQlcCiAJY29uc3QgdHlwZW9mKCoocHRyKSkgX191c2VyICogX19ndV9hZGRyID0gKHB0cik7CQlcCiAJaW50IF9fZ3VfZXJyID0gMDsJCQkJCQlcCiAJCQkJCQkJCQlcCkBAIC0yMTYsMTAgKzIxNSw2IEBACiAJCQlfX2dldF91c2VyX2FzbSgidyIsIF9fZ3VfdmFsLCBfX2d1X2FkZHIsCVwKIAkJCQkgICAgICAgX19ndV9lcnIpOwkJCVwKIAkJCWJyZWFrOwkJCQkJCVwKLQkJY2FzZSA4OgkJCQkJCQlcCi0JCQlfX2dldF91c2VyX2FzbSgiZCIsIF9fZ3VfdmFsLCBfX2d1X2FkZHIsCVwKLQkJCQkgICAgICAgX19ndV9lcnIpOwkJCVwKLQkJCWJyZWFrOwkJCQkJCVwKIAkJZGVmYXVsdDoJCQkJCQlcCiAJCQlfX2d1X2VyciA9IF9fZ2V0X3VzZXJfYmFkKCk7CQkJXAogCQkJYnJlYWs7CQkJCQkJXApAQCAtMjI3LDcgKzIyMiw3IEBACiAJfSBlbHNlIHsJCQkJCQkJXAogCQlfX2d1X2VyciA9IC1FRkFVTFQ7CQkJCQlcCiAJfQkJCQkJCQkJXAotCXggPSBfX2d1X3ZhbDsJCQkJCQkJXAorCXggPSAodHlwZW9mKCoocHRyKSkpX19ndV92YWw7CQkJCQlcCiAJX19ndV9lcnI7CQkJCQkJCVwKIH0pCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWNyaXMvc29ja2V0LmggYi9pbmNsdWRlL2FzbS1jcmlzL3NvY2tldC5oCmluZGV4IDAxY2ZkZjEuLjViMThkZmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWNyaXMvc29ja2V0LmgKKysrIGIvaW5jbHVkZS9hc20tY3Jpcy9zb2NrZXQuaApAQCAtNTEsNiArNTEsOCBAQAogCiAjZGVmaW5lIFNPX1BFRVJTRUMgICAgICAgICAgICAgMzEKICNkZWZpbmUgU09fUEFTU1NFQwkJMzQKKyNkZWZpbmUgU09fVElNRVNUQU1QTlMJCTM1CisjZGVmaW5lIFNDTV9USU1FU1RBTVBOUwkJU09fVElNRVNUQU1QTlMKIAogI2VuZGlmIC8qIF9BU01fU09DS0VUX0ggKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tY3Jpcy9zb2NraW9zLmggYi9pbmNsdWRlL2FzbS1jcmlzL3NvY2tpb3MuaAppbmRleCA2YzQwMTJmLi5jZmU3YmZlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1jcmlzL3NvY2tpb3MuaAorKysgYi9pbmNsdWRlL2FzbS1jcmlzL3NvY2tpb3MuaApAQCAtNyw2ICs3LDcgQEAKICNkZWZpbmUgRklPR0VUT1dOCTB4ODkwMwogI2RlZmluZSBTSU9DR1BHUlAJMHg4OTA0CiAjZGVmaW5lIFNJT0NBVE1BUksJMHg4OTA1Ci0jZGVmaW5lIFNJT0NHU1RBTVAJMHg4OTA2CQkvKiBHZXQgc3RhbXAgKi8KKyNkZWZpbmUgU0lPQ0dTVEFNUAkweDg5MDYJCS8qIEdldCBzdGFtcCAodGltZXZhbCkgKi8KKyNkZWZpbmUgU0lPQ0dTVEFNUE5TCTB4ODkwNwkJLyogR2V0IHN0YW1wICh0aW1lc3BlYykgKi8KIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1mcnYvc29ja2V0LmggYi9pbmNsdWRlL2FzbS1mcnYvc29ja2V0LmgKaW5kZXggMzFkYjE4Zi4uYTgyM2JlZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZnJ2L3NvY2tldC5oCisrKyBiL2luY2x1ZGUvYXNtLWZydi9zb2NrZXQuaApAQCAtNDksNiArNDksOCBAQAogCiAjZGVmaW5lIFNPX1BFRVJTRUMJCTMxCiAjZGVmaW5lIFNPX1BBU1NTRUMJCTM0CisjZGVmaW5lIFNPX1RJTUVTVEFNUE5TCQkzNQorI2RlZmluZSBTQ01fVElNRVNUQU1QTlMJCVNPX1RJTUVTVEFNUE5TCiAKICNlbmRpZiAvKiBfQVNNX1NPQ0tFVF9IICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWZydi9zb2NraW9zLmggYi9pbmNsdWRlL2FzbS1mcnYvc29ja2lvcy5oCmluZGV4IDhhNmU0YjIuLjVkYmRkMTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWZydi9zb2NraW9zLmgKKysrIGIvaW5jbHVkZS9hc20tZnJ2L3NvY2tpb3MuaApAQCAtNyw3ICs3LDggQEAKICNkZWZpbmUgRklPR0VUT1dOCTB4ODkwMwogI2RlZmluZSBTSU9DR1BHUlAJMHg4OTA0CiAjZGVmaW5lIFNJT0NBVE1BUksJMHg4OTA1Ci0jZGVmaW5lIFNJT0NHU1RBTVAJMHg4OTA2CQkvKiBHZXQgc3RhbXAgKi8KKyNkZWZpbmUgU0lPQ0dTVEFNUAkweDg5MDYJCS8qIEdldCBzdGFtcCAodGltZXZhbCkgKi8KKyNkZWZpbmUgU0lPQ0dTVEFNUE5TCTB4ODkwNwkJLyogR2V0IHN0YW1wICh0aW1lc3BlYykgKi8KIAogI2VuZGlmIC8qIF9BU01fU09DS0lPU19fICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvZGl2NjQuaCBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvZGl2NjQuaAppbmRleCA4ZjRlMzE5Li5hNGE0OTM3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1nZW5lcmljL2RpdjY0LmgKKysrIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9kaXY2NC5oCkBAIC0zMCw2ICszMCwxMSBAQAogCV9fcmVtOwkJCQkJCQlcCiAgfSkKIAorc3RhdGljIGlubGluZSB1aW50NjRfdCBkaXY2NF82NCh1aW50NjRfdCBkaXZpZGVuZCwgdWludDY0X3QgZGl2aXNvcikKK3sKKwlyZXR1cm4gZGl2aWRlbmQgLyBkaXZpc29yOworfQorCiAjZWxpZiBCSVRTX1BFUl9MT05HID09IDMyCiAKIGV4dGVybiB1aW50MzJfdCBfX2RpdjY0XzMyKHVpbnQ2NF90ICpkaXZpZGVuZCwgdWludDMyX3QgZGl2aXNvcik7CkBAIC00OSw2ICs1NCw4IEBACiAJX19yZW07CQkJCQkJXAogIH0pCiAKK2V4dGVybiB1aW50NjRfdCBkaXY2NF82NCh1aW50NjRfdCBkaXZpZGVuZCwgdWludDY0X3QgZGl2aXNvcik7CisKICNlbHNlIC8qIEJJVFNfUEVSX0xPTkcgPT0gPz8gKi8KIAogIyBlcnJvciBkb19kaXYoKSBkb2VzIG5vdCB5ZXQgc3VwcG9ydCB0aGUgQzY0CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1nZW5lcmljL3BndGFibGUuaCBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvcGd0YWJsZS5oCmluZGV4IDZkN2UyNzkuLmRjOGY5OWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvcGd0YWJsZS5oCisrKyBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvcGd0YWJsZS5oCkBAIC0xMzksOCArMTM5LDE1IEBACiAjZGVmaW5lIHB0ZV9zYW1lKEEsQikJKHB0ZV92YWwoQSkgPT0gcHRlX3ZhbChCKSkKICNlbmRpZgogCi0jaWZuZGVmIF9fSEFWRV9BUkNIX1BBR0VfVEVTVF9BTkRfQ0xFQVJfRElSVFkKLSNkZWZpbmUgcGFnZV90ZXN0X2FuZF9jbGVhcl9kaXJ0eShwYWdlKSAoMCkKKyNpZm5kZWYgX19IQVZFX0FSQ0hfUEFHRV9URVNUX0RJUlRZCisjZGVmaW5lIHBhZ2VfdGVzdF9kaXJ0eShwYWdlKQkJKDApCisjZW5kaWYKKworI2lmbmRlZiBfX0hBVkVfQVJDSF9QQUdFX0NMRUFSX0RJUlRZCisjZGVmaW5lIHBhZ2VfY2xlYXJfZGlydHkocGFnZSkJCWRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisjaWZuZGVmIF9fSEFWRV9BUkNIX1BBR0VfVEVTVF9ESVJUWQogI2RlZmluZSBwdGVfbWF5YmVfZGlydHkocHRlKQkJcHRlX2RpcnR5KHB0ZSkKICNlbHNlCiAjZGVmaW5lIHB0ZV9tYXliZV9kaXJ0eShwdGUpCQkoMSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWg4MzAwL3NvY2tldC5oIGIvaW5jbHVkZS9hc20taDgzMDAvc29ja2V0LmgKaW5kZXggZWJjODMwZi4uMzk5MTFkOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taDgzMDAvc29ja2V0LmgKKysrIGIvaW5jbHVkZS9hc20taDgzMDAvc29ja2V0LmgKQEAgLTQ5LDUgKzQ5LDcgQEAKIAogI2RlZmluZSBTT19QRUVSU0VDCQkzMQogI2RlZmluZSBTT19QQVNTU0VDCQkzNAorI2RlZmluZSBTT19USU1FU1RBTVBOUwkJMzUKKyNkZWZpbmUgU0NNX1RJTUVTVEFNUE5TCQlTT19USU1FU1RBTVBOUwogCiAjZW5kaWYgLyogX0FTTV9TT0NLRVRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taDgzMDAvc29ja2lvcy5oIGIvaW5jbHVkZS9hc20taDgzMDAvc29ja2lvcy5oCmluZGV4IGQwMDVkOTUuLmU5YzdlYzggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWg4MzAwL3NvY2tpb3MuaAorKysgYi9pbmNsdWRlL2FzbS1oODMwMC9zb2NraW9zLmgKQEAgLTcsNiArNyw3IEBACiAjZGVmaW5lIEZJT0dFVE9XTgkweDg5MDMKICNkZWZpbmUgU0lPQ0dQR1JQCTB4ODkwNAogI2RlZmluZSBTSU9DQVRNQVJLCTB4ODkwNQotI2RlZmluZSBTSU9DR1NUQU1QCTB4ODkwNgkJLyogR2V0IHN0YW1wICovCisjZGVmaW5lIFNJT0NHU1RBTVAJMHg4OTA2CQkvKiBHZXQgc3RhbXAgKHRpbWV2YWwpICovCisjZGVmaW5lIFNJT0NHU1RBTVBOUwkweDg5MDcJCS8qIEdldCBzdGFtcCAodGltZXNwZWMpICovCiAKICNlbmRpZiAvKiBfX0FSQ0hfSDgzMDBfU09DS0lPU19fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L2RpdjY0LmggYi9pbmNsdWRlL2FzbS1pMzg2L2RpdjY0LmgKaW5kZXggNzVjNjdjNy4uNDM4ZTk4MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9kaXY2NC5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvZGl2NjQuaApAQCAtMSw2ICsxLDggQEAKICNpZm5kZWYgX19JMzg2X0RJVjY0CiAjZGVmaW5lIF9fSTM4Nl9ESVY2NAogCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKwogLyoKICAqIGRvX2RpdigpIGlzIE5PVCBhIEMgZnVuY3Rpb24uIEl0IHdhbnRzIHRvIHJldHVybgogICogdHdvIHZhbHVlcyAodGhlIHF1b3RpZW50IGFuZCB0aGUgcmVtYWluZGVyKSwgYnV0CkBAIC00NSw0ICs0Nyw2IEBACiAJcmV0dXJuIGR1bTI7CiAKIH0KKworZXh0ZXJuIHVpbnQ2NF90IGRpdjY0XzY0KHVpbnQ2NF90IGRpdmlkZW5kLCB1aW50NjRfdCBkaXZpc29yKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9zb2NrZXQuaCBiL2luY2x1ZGUvYXNtLWkzODYvc29ja2V0LmgKaW5kZXggNTc1NWQ1Ny4uOTljYTY0OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9zb2NrZXQuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L3NvY2tldC5oCkBAIC00OSw1ICs0OSw3IEBACiAKICNkZWZpbmUgU09fUEVFUlNFQwkJMzEKICNkZWZpbmUgU09fUEFTU1NFQwkJMzQKKyNkZWZpbmUgU09fVElNRVNUQU1QTlMJCTM1CisjZGVmaW5lIFNDTV9USU1FU1RBTVBOUwkJU09fVElNRVNUQU1QTlMKIAogI2VuZGlmIC8qIF9BU01fU09DS0VUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvc29ja2lvcy5oIGIvaW5jbHVkZS9hc20taTM4Ni9zb2NraW9zLmgKaW5kZXggNmI3NDdmOC4uZmY1MjhjNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9zb2NraW9zLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9zb2NraW9zLmgKQEAgLTcsNiArNyw3IEBACiAjZGVmaW5lIEZJT0dFVE9XTgkweDg5MDMKICNkZWZpbmUgU0lPQ0dQR1JQCTB4ODkwNAogI2RlZmluZSBTSU9DQVRNQVJLCTB4ODkwNQotI2RlZmluZSBTSU9DR1NUQU1QCTB4ODkwNgkJLyogR2V0IHN0YW1wICovCisjZGVmaW5lIFNJT0NHU1RBTVAJMHg4OTA2CQkvKiBHZXQgc3RhbXAgKHRpbWV2YWwpICovCisjZGVmaW5lIFNJT0NHU1RBTVBOUwkweDg5MDcJCS8qIEdldCBzdGFtcCAodGltZXNwZWMpICovCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9zb2NrZXQuaCBiL2luY2x1ZGUvYXNtLWlhNjQvc29ja2V0LmgKaW5kZXggZDYzOGVmMy4uOWU0MmNlNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9zb2NrZXQuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L3NvY2tldC5oCkBAIC01OCw1ICs1OCw3IEBACiAKICNkZWZpbmUgU09fUEVFUlNFQyAgICAgICAgICAgICAzMQogI2RlZmluZSBTT19QQVNTU0VDCQkzNAorI2RlZmluZSBTT19USU1FU1RBTVBOUwkJMzUKKyNkZWZpbmUgU0NNX1RJTUVTVEFNUE5TCQlTT19USU1FU1RBTVBOUwogCiAjZW5kaWYgLyogX0FTTV9JQTY0X1NPQ0tFVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L3NvY2tpb3MuaCBiL2luY2x1ZGUvYXNtLWlhNjQvc29ja2lvcy5oCmluZGV4IGNmOTQ4NTcuLjE1YzkyNDYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvc29ja2lvcy5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvc29ja2lvcy5oCkBAIC0xNCw2ICsxNCw3IEBACiAjZGVmaW5lIEZJT0dFVE9XTgkweDg5MDMKICNkZWZpbmUgU0lPQ0dQR1JQCTB4ODkwNAogI2RlZmluZSBTSU9DQVRNQVJLCTB4ODkwNQotI2RlZmluZSBTSU9DR1NUQU1QCTB4ODkwNgkJLyogR2V0IHN0YW1wICovCisjZGVmaW5lIFNJT0NHU1RBTVAJMHg4OTA2CQkvKiBHZXQgc3RhbXAgKHRpbWV2YWwpICovCisjZGVmaW5lIFNJT0NHU1RBTVBOUwkweDg5MDcJCS8qIEdldCBzdGFtcCAodGltZXNwZWMpICovCiAKICNlbmRpZiAvKiBfQVNNX0lBNjRfU09DS0lPU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tMzJyL3NvY2tldC5oIGIvaW5jbHVkZS9hc20tbTMyci9zb2NrZXQuaAppbmRleCBhY2RmNzQ4Li43OTNkNWQzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tMzJyL3NvY2tldC5oCisrKyBiL2luY2x1ZGUvYXNtLW0zMnIvc29ja2V0LmgKQEAgLTQ5LDUgKzQ5LDcgQEAKIAogI2RlZmluZSBTT19QRUVSU0VDCQkzMQogI2RlZmluZSBTT19QQVNTU0VDCQkzNAorI2RlZmluZSBTT19USU1FU1RBTVBOUwkJMzUKKyNkZWZpbmUgU0NNX1RJTUVTVEFNUE5TCQlTT19USU1FU1RBTVBOUwogCiAjZW5kaWYgLyogX0FTTV9NMzJSX1NPQ0tFVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tMzJyL3NvY2tpb3MuaCBiL2luY2x1ZGUvYXNtLW0zMnIvc29ja2lvcy5oCmluZGV4IGY4OTk2MmUuLjZjMWZiOWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW0zMnIvc29ja2lvcy5oCisrKyBiL2luY2x1ZGUvYXNtLW0zMnIvc29ja2lvcy5oCkBAIC03LDYgKzcsNyBAQAogI2RlZmluZSBGSU9HRVRPV04JMHg4OTAzCiAjZGVmaW5lIFNJT0NHUEdSUAkweDg5MDQKICNkZWZpbmUgU0lPQ0FUTUFSSwkweDg5MDUKLSNkZWZpbmUgU0lPQ0dTVEFNUAkweDg5MDYJCS8qIEdldCBzdGFtcCAqLworI2RlZmluZSBTSU9DR1NUQU1QCTB4ODkwNgkJLyogR2V0IHN0YW1wICh0aW1ldmFsKSAqLworI2RlZmluZSBTSU9DR1NUQU1QTlMJMHg4OTA3CQkvKiBHZXQgc3RhbXAgKHRpbWVzcGVjKSAqLwogCiAjZW5kaWYgIC8qIF9BU01fTTMyUl9TT0NLSU9TX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGsvZGl2NjQuaCBiL2luY2x1ZGUvYXNtLW02OGsvZGl2NjQuaAppbmRleCA5ZjY1ZGUxLi4zM2NhYWQxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrL2RpdjY0LmgKKysrIGIvaW5jbHVkZS9hc20tbTY4ay9kaXY2NC5oCkBAIC0xLDYgKzEsOCBAQAogI2lmbmRlZiBfTTY4S19ESVY2NF9ICiAjZGVmaW5lIF9NNjhLX0RJVjY0X0gKIAorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKIC8qIG4gPSBuIC8gYmFzZTsgcmV0dXJuIHJlbTsgKi8KIAogI2RlZmluZSBkb19kaXYobiwgYmFzZSkgKHsJCQkJCVwKQEAgLTIzLDQgKzI1LDUgQEAKIAlfX3JlbTsJCQkJCQkJXAogfSkKIAorZXh0ZXJuIHVpbnQ2NF90IGRpdjY0XzY0KHVpbnQ2NF90IGRpdmlkZW5kLCB1aW50NjRfdCBkaXZpc29yKTsKICNlbmRpZiAvKiBfTTY4S19ESVY2NF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrL3NvY2tldC5oIGIvaW5jbHVkZS9hc20tbTY4ay9zb2NrZXQuaAppbmRleCBhNTk2NmVjLi42ZDIxYjkwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrL3NvY2tldC5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGsvc29ja2V0LmgKQEAgLTQ5LDUgKzQ5LDcgQEAKIAogI2RlZmluZSBTT19QRUVSU0VDICAgICAgICAgICAgIDMxCiAjZGVmaW5lIFNPX1BBU1NTRUMJCTM0CisjZGVmaW5lIFNPX1RJTUVTVEFNUE5TCQkzNQorI2RlZmluZSBTQ01fVElNRVNUQU1QTlMJCVNPX1RJTUVTVEFNUE5TCiAKICNlbmRpZiAvKiBfQVNNX1NPQ0tFVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrL3NvY2tpb3MuaCBiL2luY2x1ZGUvYXNtLW02OGsvc29ja2lvcy5oCmluZGV4IDliOWVkOTcuLmMwNGEyMzkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW02OGsvc29ja2lvcy5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGsvc29ja2lvcy5oCkBAIC03LDYgKzcsNyBAQAogI2RlZmluZSBGSU9HRVRPV04JMHg4OTAzCiAjZGVmaW5lIFNJT0NHUEdSUAkweDg5MDQKICNkZWZpbmUgU0lPQ0FUTUFSSwkweDg5MDUKLSNkZWZpbmUgU0lPQ0dTVEFNUAkweDg5MDYJCS8qIEdldCBzdGFtcCAqLworI2RlZmluZSBTSU9DR1NUQU1QCTB4ODkwNgkJLyogR2V0IHN0YW1wICh0aW1ldmFsKSAqLworI2RlZmluZSBTSU9DR1NUQU1QTlMJMHg4OTA3CQkvKiBHZXQgc3RhbXAgKHRpbWVzcGVjKSAqLwogCiAjZW5kaWYgLyogX19BUkNIX002OEtfU09DS0lPU19fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2NhY2hlZmx1c2guaCBiL2luY2x1ZGUvYXNtLW1pcHMvY2FjaGVmbHVzaC5oCmluZGV4IDI4ZDkwN2QuLjQ5MzNiNDkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvY2FjaGVmbHVzaC5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvY2FjaGVmbHVzaC5oCkBAIC05Niw2ICs5Niw2IEBACiB1bnNpZ25lZCBsb25nIF9faW5pdCBydW5fdW5jYWNoZWQodm9pZCAqZnVuYyk7CiAKIGV4dGVybiB2b2lkICprbWFwX2NvaGVyZW50KHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIGFkZHIpOwotZXh0ZXJuIHZvaWQga3VubWFwX2NvaGVyZW50KHN0cnVjdCBwYWdlICpwYWdlKTsKK2V4dGVybiB2b2lkIGt1bm1hcF9jb2hlcmVudCh2b2lkKTsKIAogI2VuZGlmIC8qIF9BU01fQ0FDSEVGTFVTSF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2RpdjY0LmggYi9pbmNsdWRlL2FzbS1taXBzL2RpdjY0LmgKaW5kZXggZDEwNzgzMi4uNjYxODlmNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9kaXY2NC5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvZGl2NjQuaApAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDQgIE1hY2llaiBXLiBSb3p5Y2tpCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDMgUmFsZiBCYWVjaGxlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMsIDA3IFJhbGYgQmFlY2hsZSAocmFsZkBsaW51eC1taXBzLm9yZykKICAqCiAgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwogICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQpAQCAtOSw2ICs5LDggQEAKICNpZm5kZWYgX0FTTV9ESVY2NF9ICiAjZGVmaW5lIF9BU01fRElWNjRfSAogCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKwogI2lmIChfTUlQU19TWkxPTkcgPT0gMzIpCiAKICNpbmNsdWRlIDxhc20vY29tcGlsZXIuaD4KQEAgLTc4LDYgKzgwLDggQEAKIAlfX3F1b3QgPSBfX3F1b3QgPDwgMzIgfCBfX2xvdzsgXAogCShuKSA9IF9fcXVvdDsgXAogCV9fbW9kOyB9KQorCitleHRlcm4gdWludDY0X3QgZGl2NjRfNjQodWludDY0X3QgZGl2aWRlbmQsIHVpbnQ2NF90IGRpdmlzb3IpOwogI2VuZGlmIC8qIChfTUlQU19TWkxPTkcgPT0gMzIpICovCiAKICNpZiAoX01JUFNfU1pMT05HID09IDY0KQpAQCAtMTAxLDYgKzEwNSwxMSBAQAogCShuKSA9IF9fcXVvdDsgXAogCV9fbW9kOyB9KQogCitzdGF0aWMgaW5saW5lIHVpbnQ2NF90IGRpdjY0XzY0KHVpbnQ2NF90IGRpdmlkZW5kLCB1aW50NjRfdCBkaXZpc29yKQoreworCXJldHVybiBkaXZpZGVuZCAvIGRpdmlzb3I7Cit9CisKICNlbmRpZiAvKiAoX01JUFNfU1pMT05HID09IDY0KSAqLwogCiAjZW5kaWYgLyogX0FTTV9ESVY2NF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2ptcjM5MjcvaXJxLmggYi9pbmNsdWRlL2FzbS1taXBzL2ptcjM5MjcvaXJxLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzZTdlZDMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9qbXIzOTI3L2lycS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoKLSAqICBsaW51eC9pbmNsdWRlL2FzbS1taXBzL3R4MzkyNy9pcnEuaAotICoKLSAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCi0gKiBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMSBUb3NoaWJhIENvcnBvcmF0aW9uCi0gKi8KLSNpZm5kZWYgX19BU01fVFgzOTI3X0lSUV9ICi0jZGVmaW5lIF9fQVNNX1RYMzkyN19JUlFfSAotCi0jaWZuZGVmIF9fQVNTRU1CTFlfXwotCi0jaW5jbHVkZSA8YXNtL2lycS5oPgotCi1zdHJ1Y3QgdGJfaXJxX3NwYWNlIHsKLQlzdHJ1Y3QgdGJfaXJxX3NwYWNlKiBuZXh0OwotCWludCBzdGFydF9pcnFubzsKLQlpbnQgbnJfaXJxczsKLQl2b2lkICgqbWFza19mdW5jKShpbnQgaXJxX25yLCBpbnQgc3BhY2VfaWQpOwotCXZvaWQgKCp1bm1hc2tfZnVuYykoaW50IGlycV9ubywgaW50IHNwYWNlX2lkKTsKLQljb25zdCBjaGFyICpuYW1lOwotCWludCBzcGFjZV9pZDsKLQlpbnQgY2FuX3NoYXJlOwotfTsKLWV4dGVybiBzdHJ1Y3QgdGJfaXJxX3NwYWNlKiB0Yl9pcnFfc3BhY2VzOwotCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIGFkZF90Yl9pcnFfc3BhY2Uoc3RydWN0IHRiX2lycV9zcGFjZSogc3ApCi17Ci0Jc3AtPm5leHQgPSB0Yl9pcnFfc3BhY2VzOwotCXRiX2lycV9zcGFjZXMgPSBzcDsKLX0KLQotCi1zdHJ1Y3QgcHRfcmVnczsKLWV4dGVybiB2b2lkCi10b3NoaWJhYm9hcmRzX3NwdXJpb3VzKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgaXJxKTsKLWV4dGVybiB2b2lkCi10b3NoaWJhYm9hcmRzX2lycWRpc3BhdGNoKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgaXJxKTsKLQotZXh0ZXJuIHN0cnVjdCBpcnFhY3Rpb24gKgotdG9zaGliYWJvYXJkc19nZXRfaXJxX2FjdGlvbihpbnQgaXJxKTsKLWV4dGVybiBpbnQKLXRvc2hpYmFib2FyZHNfc2V0dXBfaXJxKGludCBpcnEsIHN0cnVjdCBpcnFhY3Rpb24gKiBuZXcpOwotCi0KLWV4dGVybiBpbnQgKCp0b3NoaWJhYm9hcmRzX2dlbl9pYWNrKSh2b2lkKTsKLQotI2VuZGlmIC8qICFfX0FTU0VNQkxZX18gKi8KLQotI2RlZmluZSBOUl9JU0FfSVJRUyAxNgotI2RlZmluZSBUQl9JUlFfSVNfSVNBKGlycSkJXAotCSgwIDw9IChpcnEpICYmIChpcnEpIDwgTlJfSVNBX0lSUVMpCi0jZGVmaW5lIFRCX0lSUV9UT19JU0FfSVJRKGlycSkJKGlycSkKLQotI2VuZGlmIC8qIF9fQVNNX1RYMzkyN19JUlFfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9qbXIzOTI3L2ptcjM5MjcuaCBiL2luY2x1ZGUvYXNtLW1pcHMvam1yMzkyNy9qbXIzOTI3LmgKaW5kZXggYzUwZTY4Zi4uOTU4ZTI5NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9qbXIzOTI3L2ptcjM5MjcuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL2ptcjM5Mjcvam1yMzkyNy5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIERlZmluZXMgZm9yIHRoZSBUSlNZUyBKTVItVFgzOTI3L0pNSS0zOTI3SU8yL0pNWS0xMzk0SUYuCisgKiBEZWZpbmVzIGZvciB0aGUgVEpTWVMgSk1SLVRYMzkyNwogICoKICAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCiAgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCkBAIC0xMiwxMCArMTIsNyBAQAogCiAjaW5jbHVkZSA8YXNtL2ptcjM5MjcvdHgzOTI3Lmg+CiAjaW5jbHVkZSA8YXNtL2FkZHJzcGFjZS5oPgotI2luY2x1ZGUgPGFzbS9qbXIzOTI3L2lycS5oPgotI2lmbmRlZiBfX0FTU0VNQkxZX18KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci0jZW5kaWYKIAogLyogQ1MgKi8KICNkZWZpbmUgSk1SMzkyN19ST01DRTAJMHgxZmMwMDAwMAkvKiA0TSAqLwpAQCAtMzUsMjggKzMyLDEwIEBACiAjZGVmaW5lIEpNUjM5MjdfU0RSQU1fU0laRQkweDAyMDAwMDAwCS8qIDMyTSAqLwogI2RlZmluZSBKTVIzOTI3X1BPUlRfQkFTRQlLU0VHMQogCi0vKiBzZWxlY3QgaW5kaXJlY3QgaW5pdGlhdG9yIGFjY2VzcyBwZXIgZXJyYXRhICovCi0jZGVmaW5lIEpNUjM5MjdfSU5JVF9JTkRJUkVDVF9QQ0kKLSNkZWZpbmUgUENJX0lTVEFUX0lESUNDICAgICAgICAgICAweDEwMDAKLSNkZWZpbmUgUENJX0lQQ0lCRV9JQkVfTE9ORyAgICAgICAwCi0jZGVmaW5lIFBDSV9JUENJQkVfSUNNRF9JT1JFQUQgICAgMgotI2RlZmluZSBQQ0lfSVBDSUJFX0lDTURfSU9XUklURSAgIDMKLSNkZWZpbmUgUENJX0lQQ0lCRV9JQ01EX01FTVJFQUQgICA2Ci0jZGVmaW5lIFBDSV9JUENJQkVfSUNNRF9NRU1XUklURSAgNwotI2RlZmluZSBQQ0lfSVBDSUJFX0lDTURfU0hJRlQgICAgIDQKLQogLyogQWRkcmVzcyBtYXAgKHZpcnR1YWwgYWRkcmVzcykgKi8KICNkZWZpbmUgSk1SMzkyN19ST00wX0JBU0UJKEtTRUcxICsgSk1SMzkyN19ST01DRTApCiAjZGVmaW5lIEpNUjM5MjdfUk9NMV9CQVNFCShLU0VHMSArIEpNUjM5MjdfUk9NQ0UxKQogI2RlZmluZSBKTVIzOTI3X0lPQ19CQVNFCShLU0VHMSArIEpNUjM5MjdfUk9NQ0UyKQotI2RlZmluZSBKTVIzOTI3X0lPQl9CQVNFCShLU0VHMSArIEpNUjM5MjdfUk9NQ0UzKQotI2RlZmluZSBKTVIzOTI3X0lTQU1FTV9CQVNFCShKTVIzOTI3X0lPQl9CQVNFKQotI2RlZmluZSBKTVIzOTI3X0lTQUlPX0JBU0UJKEpNUjM5MjdfSU9CX0JBU0UgKyAweDAxMDAwMDAwKQotI2RlZmluZSBKTVIzOTI3X0lTQUNfQkFTRQkoSk1SMzkyN19JT0JfQkFTRSArIDB4MDIwMDAwMDApCi0jZGVmaW5lIEpNUjM5MjdfTENEVkdBX1JFR19CQVNFCShKTVIzOTI3X0lPQl9CQVNFICsgMHgwMzAwMDAwMCkKLSNkZWZpbmUgSk1SMzkyN19MQ0RWR0FfTUVNX0JBU0UJKEpNUjM5MjdfSU9CX0JBU0UgKyAweDAzODAwMDAwKQotI2RlZmluZSBKTVIzOTI3X0pNWTEzOTRfQkFTRQkoS1NFRzEgKyBKTVIzOTI3X1JPTUNFNSkKLSNkZWZpbmUgSk1SMzkyN19QUkVNSUVSM19CQVNFCShKTVIzOTI3X0pNWTEzOTRfQkFTRSArIDB4MDAxMDAwMDApCiAjZGVmaW5lIEpNUjM5MjdfUENJTUVNX0JBU0UJKEtTRUcxICsgSk1SMzkyN19QQ0lNRU0pCiAjZGVmaW5lIEpNUjM5MjdfUENJSU9fQkFTRQkoS1NFRzEgKyBKTVIzOTI3X1BDSUlPKQogCkBAIC03MiwyNSArNTEsMTQgQEAKICNkZWZpbmUgSk1SMzkyN19JT0NfSU5UUF9BRERSCShKTVIzOTI3X0lPQ19CQVNFICsgMHgwMDBiMDAwMCkKICNkZWZpbmUgSk1SMzkyN19JT0NfUkVTRVRfQUREUgkoSk1SMzkyN19JT0NfQkFTRSArIDB4MDAwZjAwMDApCiAKLSNkZWZpbmUgSk1SMzkyN19JU0FDX1JFVl9BRERSCShKTVIzOTI3X0lTQUNfQkFTRSArIDB4MDAwMDAwMDApCi0jZGVmaW5lIEpNUjM5MjdfSVNBQ19FSU5UU19BRERSCShKTVIzOTI3X0lTQUNfQkFTRSArIDB4MDAyMDAwMDApCi0jZGVmaW5lIEpNUjM5MjdfSVNBQ19FSU5UTV9BRERSCShKTVIzOTI3X0lTQUNfQkFTRSArIDB4MDAzMDAwMDApCi0jZGVmaW5lIEpNUjM5MjdfSVNBQ19OTUlfQUREUgkoSk1SMzkyN19JU0FDX0JBU0UgKyAweDAwNDAwMDAwKQotI2RlZmluZSBKTVIzOTI3X0lTQUNfTEVEX0FERFIJKEpNUjM5MjdfSVNBQ19CQVNFICsgMHgwMDUwMDAwMCkKLSNkZWZpbmUgSk1SMzkyN19JU0FDX0lOVFBfQUREUgkoSk1SMzkyN19JU0FDX0JBU0UgKyAweDAwODAwMDAwKQotI2RlZmluZSBKTVIzOTI3X0lTQUNfSU5UUzFfQUREUgkoSk1SMzkyN19JU0FDX0JBU0UgKyAweDAwOTAwMDAwKQotI2RlZmluZSBKTVIzOTI3X0lTQUNfSU5UUzJfQUREUgkoSk1SMzkyN19JU0FDX0JBU0UgKyAweDAwYTAwMDAwKQotI2RlZmluZSBKTVIzOTI3X0lTQUNfSU5UTV9BRERSCShKTVIzOTI3X0lTQUNfQkFTRSArIDB4MDBiMDAwMDApCi0KIC8qIEZsYXNoIFJPTSAqLwogI2RlZmluZSBKTVIzOTI3X0ZMQVNIX0JBU0UJKEpNUjM5MjdfUk9NMF9CQVNFKQogI2RlZmluZSBKTVIzOTI3X0ZMQVNIX1NJWkUJMHgwMDQwMDAwMAogCi0vKiBiaXRzIGZvciBJT0NfUkVWL0lPQ19CUkVWL0lTQUNfUkVWIChoaWdoIGJ5dGUpICovCisvKiBiaXRzIGZvciBJT0NfUkVWL0lPQ19CUkVWIChoaWdoIGJ5dGUpICovCiAjZGVmaW5lIEpNUjM5MjdfSURUX01BU0sJMHhmYwogI2RlZmluZSBKTVIzOTI3X1JFVl9NQVNLCTB4MDMKICNkZWZpbmUgSk1SMzkyN19JT0NfSURUCQkweGUwCi0jZGVmaW5lIEpNUjM5MjdfSVNBQ19JRFQJMHgyMAogCiAvKiBiaXRzIGZvciBJT0NfSU5UUzEvSU9DX0lOVFMyL0lPQ19JTlRNL0lPQ19JTlRQIChoaWdoIGJ5dGUpICovCiAjZGVmaW5lIEpNUjM5MjdfSU9DX0lOVEJfUENJQQkwCkBAIC0xMTQsNDAgKzgyLDYgQEAKICNkZWZpbmUgSk1SMzkyN19JT0NfUkVTRVRfQ1BVCTEKICNkZWZpbmUgSk1SMzkyN19JT0NfUkVTRVRfUENJCTIKIAotLyogYml0cyBmb3IgSVNBQ19FSU5UUy9JU0FDX0VJTlRNIChoaWdoIGJ5dGUpICovCi0jZGVmaW5lIEpNUjM5MjdfSVNBQ19FSU5UQl9JT0NISwkyCi0jZGVmaW5lIEpNUjM5MjdfSVNBQ19FSU5UQl9CV1RICTQKLSNkZWZpbmUgSk1SMzkyN19JU0FDX0VJTlRGX0lPQ0hLCSgxIDw8IEpNUjM5MjdfSVNBQ19FSU5UQl9JT0NISykKLSNkZWZpbmUgSk1SMzkyN19JU0FDX0VJTlRGX0JXVEgJKDEgPDwgSk1SMzkyN19JU0FDX0VJTlRCX0JXVEgpCi0KLS8qIGJpdHMgZm9yIElTQUNfTEVEIChoaWdoIGJ5dGUpICovCi0jZGVmaW5lIEpNUjM5MjdfSVNBQ19MRURfSVNBTEVECTB4MDEKLSNkZWZpbmUgSk1SMzkyN19JU0FDX0xFRF9VU1JMRUQJMHgwMgotCi0vKiBiaXRzIGZvciBJU0FDX0lOVFMvSVNBQ19JTlRNL0lTQUNfSU5UUCAoaGlnaCBieXRlKSAqLwotI2RlZmluZSBKTVIzOTI3X0lTQUNfSU5UQl9JUlE1CTAKLSNkZWZpbmUgSk1SMzkyN19JU0FDX0lOVEJfSVJRS0IJMQotI2RlZmluZSBKTVIzOTI3X0lTQUNfSU5UQl9JUlFNT1VTRQkyCi0jZGVmaW5lIEpNUjM5MjdfSVNBQ19JTlRCX0lSUTQJMwotI2RlZmluZSBKTVIzOTI3X0lTQUNfSU5UQl9JUlExMgk0Ci0jZGVmaW5lIEpNUjM5MjdfSVNBQ19JTlRCX0lSUTMJNQotI2RlZmluZSBKTVIzOTI3X0lTQUNfSU5UQl9JUlExMAk2Ci0jZGVmaW5lIEpNUjM5MjdfSVNBQ19JTlRCX0lTQUVSCTcKLSNkZWZpbmUgSk1SMzkyN19JU0FDX0lOVEZfSVJRNQkoMSA8PCBKTVIzOTI3X0lTQUNfSU5UQl9JUlE1KQotI2RlZmluZSBKTVIzOTI3X0lTQUNfSU5URl9JUlFLQgkoMSA8PCBKTVIzOTI3X0lTQUNfSU5UQl9JUlFLQikKLSNkZWZpbmUgSk1SMzkyN19JU0FDX0lOVEZfSVJRTU9VU0UJKDEgPDwgSk1SMzkyN19JU0FDX0lOVEJfSVJRTU9VU0UpCi0jZGVmaW5lIEpNUjM5MjdfSVNBQ19JTlRGX0lSUTQJKDEgPDwgSk1SMzkyN19JU0FDX0lOVEJfSVJRNCkKLSNkZWZpbmUgSk1SMzkyN19JU0FDX0lOVEZfSVJRMTIJKDEgPDwgSk1SMzkyN19JU0FDX0lOVEJfSVJRMTIpCi0jZGVmaW5lIEpNUjM5MjdfSVNBQ19JTlRGX0lSUTMJKDEgPDwgSk1SMzkyN19JU0FDX0lOVEJfSVJRMykKLSNkZWZpbmUgSk1SMzkyN19JU0FDX0lOVEZfSVJRMTAJKDEgPDwgSk1SMzkyN19JU0FDX0lOVEJfSVJRMTApCi0jZGVmaW5lIEpNUjM5MjdfSVNBQ19JTlRGX0lTQUVSCSgxIDw8IEpNUjM5MjdfSVNBQ19JTlRCX0lTQUVSKQotCi0jaWZuZGVmIF9fQVNTRU1CTFlfXwotCi0jaWYgMAotI2RlZmluZSBqbXIzOTI3X2lvY19yZWdfb3V0KGQsIGEpCSgoKih2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKShhKSkgPSAoZCkgPDwgOCkKLSNkZWZpbmUgam1yMzkyN19pb2NfcmVnX2luKGEpCQkoKCgqKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopKGEpKSA+PiA4KSAmIDB4ZmYpCi0jZWxzZQogI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQogI2RlZmluZSBqbXIzOTI3X2lvY19yZWdfb3V0KGQsIGEpCSgoKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopKGEpKSA9IChkKSkKICNkZWZpbmUgam1yMzkyN19pb2NfcmVnX2luKGEpCQkoKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopKGEpKQpAQCAtMTU3LDMxICs5MSw5IEBACiAjZWxzZQogI2Vycm9yICJObyBFbmRpYW4iCiAjZW5kaWYKLSNlbmRpZgotI2RlZmluZSBqbXIzOTI3X2lzYWNfcmVnX291dChkLCBhKQkoKCoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKShhKSkgPSAoZCkpCi0jZGVmaW5lIGptcjM5MjdfaXNhY19yZWdfaW4oYSkJCSgqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikoYSkpCi0KLXN0YXRpYyBpbmxpbmUgaW50IGptcjM5MjdfaGF2ZV9pc2FjKHZvaWQpCi17Ci0JdW5zaWduZWQgY2hhciBpZHQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bnNpZ25lZCBsb25nIHJvbWNyMzsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQlyb21jcjMgPSB0eDM5Mjdfcm9tY3B0ci0+Y3JbM107Ci0JdHgzOTI3X3JvbWNwdHItPmNyWzNdICY9IDB4ZmZmZmVmZmY7CS8qIGRvIG5vdCB3YWl0IGluZmluaXRlbHkgKi8KLQlpZHQgPSBqbXIzOTI3X2lzYWNfcmVnX2luKEpNUjM5MjdfSVNBQ19SRVZfQUREUikgJiBKTVIzOTI3X0lEVF9NQVNLOwotCXR4MzkyN19yb21jcHRyLT5jclszXSA9IHJvbWNyMzsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0KLQlyZXR1cm4gaWR0ID09IEpNUjM5MjdfSVNBQ19JRFQ7Ci19Ci0jZGVmaW5lIGptcjM5MjdfaGF2ZV9udnJhbSgpIFwKLQkoKGptcjM5MjdfaW9jX3JlZ19pbihKTVIzOTI3X0lPQ19SRVZfQUREUikgJiBKTVIzOTI3X0lEVF9NQVNLKSA9PSBKTVIzOTI3X0lPQ19JRFQpCiAKIC8qIExFRCBtYWNybyAqLwogI2RlZmluZSBqbXIzOTI3X2xlZF9zZXQobi8qMC0xNiovKQlqbXIzOTI3X2lvY19yZWdfb3V0KH4obiksIEpNUjM5MjdfSU9DX0xFRF9BRERSKQotI2RlZmluZSBqbXIzOTI3X2lvX2xlZF9zZXQobi8qMC0zKi8pCWptcjM5MjdfaXNhY19yZWdfb3V0KChuKSwgSk1SMzkyN19JU0FDX0xFRF9BRERSKQogCiAjZGVmaW5lIGptcjM5MjdfbGVkX2FuZF9zZXQobi8qMC0xNiovKQlqbXIzOTI3X2lvY19yZWdfb3V0KCh+KG4pKSAmIGptcjM5MjdfaW9jX3JlZ19pbihKTVIzOTI3X0lPQ19MRURfQUREUiksIEpNUjM5MjdfSU9DX0xFRF9BRERSKQogCkBAIC0xOTAsMTAgKzEwMiw2IEBACiAjZGVmaW5lIGptcjM5MjdfZGlwc3cyKCkJKCh0eDM5MjdfcGlvcHRyLT5kaW4gJiAoMSA8PCAxMCkpID09IDApCiAjZGVmaW5lIGptcjM5MjdfZGlwc3czKCkJKChqbXIzOTI3X2lvY19yZWdfaW4oSk1SMzkyN19JT0NfRElQU1dfQUREUikgJiAyKSA9PSAwKQogI2RlZmluZSBqbXIzOTI3X2RpcHN3NCgpCSgoam1yMzkyN19pb2NfcmVnX2luKEpNUjM5MjdfSU9DX0RJUFNXX0FERFIpICYgMSkgPT0gMCkKLSNkZWZpbmUgam1yMzkyN19pb19kaXBzdygpCShqbXIzOTI3X2lzYWNfcmVnX2luKEpNUjM5MjdfSVNBQ19MRURfQUREUikgPj4gNCkKLQotCi0jZW5kaWYgLyogIV9fQVNTRU1CTFlfXyAqLwogCiAvKgogICogSVJRIG1hcHBpbmdzCkBAIC0yMDYsMTYgKzExNCwxMCBAQAogICovCiAjZGVmaW5lIEpNUjM5MjdfTlJfSVJRX0lSQwkxNgkvKiBPbi1DaGlwIElSQyAqLwogI2RlZmluZSBKTVIzOTI3X05SX0lSUV9JT0MJOAkvKiBQQ0kvTU9ERU0vSU5UWzY6N10gKi8KLSNkZWZpbmUgSk1SMzkyN19OUl9JUlFfSVNBQwk4CS8qIElTQSAqLwogCi0KLSNkZWZpbmUgSk1SMzkyN19JUlFfSVJDCU5SX0lTQV9JUlFTCisjZGVmaW5lIEpNUjM5MjdfSVJRX0lSQwkxNgogI2RlZmluZSBKTVIzOTI3X0lSUV9JT0MJKEpNUjM5MjdfSVJRX0lSQyArIEpNUjM5MjdfTlJfSVJRX0lSQykKLSNkZWZpbmUgSk1SMzkyN19JUlFfSVNBQwkoSk1SMzkyN19JUlFfSU9DICsgSk1SMzkyN19OUl9JUlFfSU9DKQotI2RlZmluZSBKTVIzOTI3X0lSUV9FTkQJKEpNUjM5MjdfSVJRX0lTQUMgKyBKTVIzOTI3X05SX0lSUV9JU0FDKQotI2RlZmluZSBKTVIzOTI3X0lSUV9JU19JUkMoaXJxKQkoSk1SMzkyN19JUlFfSVJDIDw9IChpcnEpICYmIChpcnEpIDwgSk1SMzkyN19JUlFfSU9DKQotI2RlZmluZSBKTVIzOTI3X0lSUV9JU19JT0MoaXJxKQkJKEpNUjM5MjdfSVJRX0lPQyA8PSAoaXJxKSAmJiAoaXJxKSA8IEpNUjM5MjdfSVJRX0lTQUMpCi0jZGVmaW5lIEpNUjM5MjdfSVJRX0lTX0lTQUMoaXJxKQkoSk1SMzkyN19JUlFfSVNBQyA8PSAoaXJxKSAmJiAoaXJxKSA8IEpNUjM5MjdfSVJRX0VORCkKKyNkZWZpbmUgSk1SMzkyN19JUlFfRU5ECShKTVIzOTI3X0lSUV9JT0MgKyBKTVIzOTI3X05SX0lSUV9JT0MpCiAKICNkZWZpbmUgSk1SMzkyN19JUlFfSVJDX0lOVDAJKEpNUjM5MjdfSVJRX0lSQyArIFRYMzkyN19JUl9JTlQwKQogI2RlZmluZSBKTVIzOTI3X0lSUV9JUkNfSU5UMQkoSk1SMzkyN19JUlFfSVJDICsgVFgzOTI3X0lSX0lOVDEpCkBAIC0yNDAsMzcgKzE0MiwxMyBAQAogI2RlZmluZSBKTVIzOTI3X0lSUV9JT0NfSU5UNgkoSk1SMzkyN19JUlFfSU9DICsgSk1SMzkyN19JT0NfSU5UQl9JTlQ2KQogI2RlZmluZSBKTVIzOTI3X0lSUV9JT0NfSU5UNwkoSk1SMzkyN19JUlFfSU9DICsgSk1SMzkyN19JT0NfSU5UQl9JTlQ3KQogI2RlZmluZSBKTVIzOTI3X0lSUV9JT0NfU09GVAkoSk1SMzkyN19JUlFfSU9DICsgSk1SMzkyN19JT0NfSU5UQl9TT0ZUKQotI2RlZmluZSBKTVIzOTI3X0lSUV9JU0FDX0lSUTUJKEpNUjM5MjdfSVJRX0lTQUMgKyBKTVIzOTI3X0lTQUNfSU5UQl9JUlE1KQotI2RlZmluZSBKTVIzOTI3X0lSUV9JU0FDX0lSUUtCCShKTVIzOTI3X0lSUV9JU0FDICsgSk1SMzkyN19JU0FDX0lOVEJfSVJRS0IpCi0jZGVmaW5lIEpNUjM5MjdfSVJRX0lTQUNfSVJRTU9VU0UJKEpNUjM5MjdfSVJRX0lTQUMgKyBKTVIzOTI3X0lTQUNfSU5UQl9JUlFNT1VTRSkKLSNkZWZpbmUgSk1SMzkyN19JUlFfSVNBQ19JUlE0CShKTVIzOTI3X0lSUV9JU0FDICsgSk1SMzkyN19JU0FDX0lOVEJfSVJRNCkKLSNkZWZpbmUgSk1SMzkyN19JUlFfSVNBQ19JUlExMgkoSk1SMzkyN19JUlFfSVNBQyArIEpNUjM5MjdfSVNBQ19JTlRCX0lSUTEyKQotI2RlZmluZSBKTVIzOTI3X0lSUV9JU0FDX0lSUTMJKEpNUjM5MjdfSVJRX0lTQUMgKyBKTVIzOTI3X0lTQUNfSU5UQl9JUlEzKQotI2RlZmluZSBKTVIzOTI3X0lSUV9JU0FDX0lSUTEwCShKTVIzOTI3X0lSUV9JU0FDICsgSk1SMzkyN19JU0FDX0lOVEJfSVJRMTApCi0jZGVmaW5lIEpNUjM5MjdfSVJRX0lTQUNfSVNBRVIJKEpNUjM5MjdfSVJRX0lTQUMgKyBKTVIzOTI3X0lTQUNfSU5UQl9JU0FFUikKIAotI2lmIDAJLyogYXV0byBkZXRlY3QgKi8KLS8qIFJUTDgwMTlBUyAxME0gRXRoZXIgKEpNSS0zOTI3SU8yOkpQVzI6MS0yIFNob3J0KSAqLwotI2RlZmluZSBKTVIzOTI3X0lSUV9FVEhFUjEJSk1SMzkyN19JUlFfSVJDX0lOVDAKLSNlbmRpZgogLyogSU9DIChQQ0ksIE1PREVNKSAqLwogI2RlZmluZSBKTVIzOTI3X0lSUV9JT0NJTlQJSk1SMzkyN19JUlFfSVJDX0lOVDEKLS8qIElTQUMgKElTQSwgUENNQ0lBLCBLRVlCT0FSRCwgTU9VU0UpICovCi0jZGVmaW5lIEpNUjM5MjdfSVJRX0lTQUNJTlQJSk1SMzkyN19JUlFfSVJDX0lOVDIKIC8qIFRDMzU4MTUgMTAwTSBFdGhlciAoSk1SLVRYMzkxMjpKUFc0OjItMyBTaG9ydCkgKi8KICNkZWZpbmUgSk1SMzkyN19JUlFfRVRIRVIwCUpNUjM5MjdfSVJRX0lSQ19JTlQzCiAvKiBDbG9jayBUaWNrICgxMG1zKSAqLwogI2RlZmluZSBKTVIzOTI3X0lSUV9USUNLCUpNUjM5MjdfSVJRX0lSQ19UTVIwCi0jZGVmaW5lIEpNUjM5MjdfSVJRX0lERQkJSk1SMzkyN19JUlFfSVNBQ19JUlExMgotCi0vKiBJRUVFMTM5NCAoTm90ZSB0aGF0IHRoaXMgbWF5IGNvbmZsaWN0cyB3aXRoIFJUTDgwMTlBUyAxME0gRXRoZXIuLi4pICovCi0jZGVmaW5lIEpNUjM5MjdfSVJRX1BSRU1JRVIzCUpNUjM5MjdfSVJRX0lSQ19JTlQwCi0KLS8qIEkvTyBQb3J0cyAqLwotLyogUlRMODAxOUFTIDEwTSBFdGhlciAqLwotI2RlZmluZSBKTVIzOTI3X0VUSEVSMV9QT1JUCShKTVIzOTI3X0lTQUlPX0JBU0UgLSBKTVIzOTI3X1BPUlRfQkFTRSArIDB4MjgwKQotI2RlZmluZSBKTVIzOTI3X0tCRF9QT1JUCShKTVIzOTI3X0lTQUlPX0JBU0UgLSBKTVIzOTI3X1BPUlRfQkFTRSArIDB4MDA4MDAwNjApCi0jZGVmaW5lIEpNUjM5MjdfSURFX1BPUlQJKEpNUjM5MjdfSVNBSU9fQkFTRSAtIEpNUjM5MjdfUE9SVF9CQVNFICsgMHgwMDEwMDFmMCkKIAogLyogQ2xvY2tzICovCiAjZGVmaW5lIEpNUjM5MjdfQ09SRUNMSwkxMzI3MTA0MDAJLyogMTMyLjdNSHogKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvam1yMzkyNy90eDM5MjcuaCBiL2luY2x1ZGUvYXNtLW1pcHMvam1yMzkyNy90eDM5MjcuaAppbmRleCBiM2Q2N2M3Li4wYjkwNzNiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL2ptcjM5MjcvdHgzOTI3LmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9qbXIzOTI3L3R4MzkyNy5oCkBAIC0yMiw4ICsyMiw2IEBACiAjZGVmaW5lIFRYMzkyN19TSU9fUkVHKGNoKQkoMHhmZmZlZjMwMCArIChjaCkgKiAweDEwMCkKICNkZWZpbmUgVFgzOTI3X1BJT19SRUcJCTB4ZmZmZWY1MDAKIAotI2lmbmRlZiBfX0FTU0VNQkxZX18KLQogc3RydWN0IHR4MzkyN19zZHJhbWNfcmVnIHsKIAl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIGNyWzhdOwogCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgdHJbM107CkBAIC0xNjQsOCArMTYyLDYgQEAKIAl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIHBkY3I7CiB9OwogCi0jZW5kaWYgLyogIV9fQVNTRU1CTFlfXyAqLwotCiAvKgogICogU0RSQU1DCiAgKi8KQEAgLTM0OCw4ICszNDQsNiBAQAogI2RlZmluZSBUWDM5MjdfUENGR19TRUxETUFfQUxMCTB4MDAwMDAwMGYKICNkZWZpbmUgVFgzOTI3X1BDRkdfU0VMRE1BKGNoKQkoMHgwMDAwMDAwMTw8KGNoKSkKIAotI2lmbmRlZiBfX0FTU0VNQkxZX18KLQogI2RlZmluZSB0eDM5Mjdfc2RyYW1jcHRyCSgoc3RydWN0IHR4MzkyN19zZHJhbWNfcmVnICopVFgzOTI3X1NEUkFNQ19SRUcpCiAjZGVmaW5lIHR4MzkyN19yb21jcHRyCQkoKHN0cnVjdCB0eDM5Mjdfcm9tY19yZWcgKilUWDM5MjdfUk9NQ19SRUcpCiAjZGVmaW5lIHR4MzkyN19kbWFwdHIJCSgoc3RydWN0IHR4MzkyN19kbWFfcmVnICopVFgzOTI3X0RNQV9SRUcpCkBAIC0zNjAsNiArMzU0LDQgQEAKICNkZWZpbmUgdHgzOTI3X3Npb3B0cihjaCkJKChzdHJ1Y3QgdHh4OTI3X3Npb19yZWcgKilUWDM5MjdfU0lPX1JFRyhjaCkpCiAjZGVmaW5lIHR4MzkyN19waW9wdHIJCSgoc3RydWN0IHR4eDkyN19waW9fcmVnICopVFgzOTI3X1BJT19SRUcpCiAKLSNlbmRpZiAvKiAhX19BU1NFTUJMWV9fICovCi0KICNlbmRpZiAvKiBfX0FTTV9UWDM5MjdfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9qbXIzOTI3L3R4eDkyNy5oIGIvaW5jbHVkZS9hc20tbWlwcy9qbXIzOTI3L3R4eDkyNy5oCmluZGV4IDlkNTc5MmUuLjU4YThmZjYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvam1yMzkyNy90eHg5MjcuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL2ptcjM5MjcvdHh4OTI3LmgKQEAgLTEwLDggKzEwLDYgQEAKICNpZm5kZWYgX19BU01fVFhYOTI3X0gKICNkZWZpbmUgX19BU01fVFhYOTI3X0gKIAotI2lmbmRlZiBfX0FTU0VNQkxZX18KLQogc3RydWN0IHR4eDkyN190bXJfcmVnIHsKIAl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIHRjcjsKIAl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIHRpc3I7CkBAIC01Miw5ICs1MCw2IEBACiAJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBtYXNrZXh0OwogfTsKIAotI2VuZGlmIC8qICFfX0FTU0VNQkxZX18gKi8KLQotCiAvKgogICogVE1SCiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvcGFjY2Vzcy5oIGIvaW5jbHVkZS9hc20tbWlwcy9wYWNjZXNzLmgKaW5kZXggMTQ3ODQ0ZS4uOGMwOGZhOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9wYWNjZXNzLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9wYWNjZXNzLmgKQEAgLTM0LDcgKzM0LDcgQEAKICNkZWZpbmUgX19nZXRfZGJlKHgscHRyLHNpemUpCQkJCQkJXAogKHsJCQkJCQkJCQlcCiAJbG9uZyBfX2d1X2VycjsJCQkJCQkJXAotCV9fdHlwZW9mKCoocHRyKSkgX19ndV92YWw7CQkJCQlcCisJX190eXBlb2ZfXygqKHB0cikpIF9fZ3VfdmFsOwkJCQkJXAogCXVuc2lnbmVkIGxvbmcgX19ndV9hZGRyOwkJCQkJXAogCV9fYXNtX18oIiI6Ij1yIiAoX19ndV92YWwpKTsJCQkJCVwKIAlfX2d1X2FkZHIgPSAodW5zaWduZWQgbG9uZykgKHB0cik7CQkJCVwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvc2dpL2hwYzMuaCBiL2luY2x1ZGUvYXNtLW1pcHMvc2dpL2hwYzMuaAppbmRleCBmY2VjNTJiLi5jNDcyOWY1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL3NnaS9ocGMzLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9zZ2kvaHBjMy5oCkBAIC0yMDYsNyArMjA2LDcgQEAKICNkZWZpbmUgSFBDM19HSU9NSVNDX0VSVElNRQkweDEJLyogRW5hYmxlIGV4dGVybmFsIHRpbWVyIHJlYWwgdGltZS4gKi8KICNkZWZpbmUgSFBDM19HSU9NSVNDX0RFTkRJQU4JMHgyCS8qIGRtYSBkZXNjcmlwdG9yIGVuZGlhbiwgMT1saXQgMD1iaWcgKi8KIAotCXZvbGF0aWxlIHUzMiBlZXByb207CQkvKiBFRVBST00gZGF0YSByZWcuICovCisJdTMyIGVlcHJvbTsJCQkvKiBFRVBST00gZGF0YSByZWcuICovCiAjZGVmaW5lIEhQQzNfRUVQUk9NX0VQUk9UCTB4MDEJLyogUHJvdGVjdCByZWdpc3RlciBlbmFibGUgKi8KICNkZWZpbmUgSFBDM19FRVBST01fQ1NFTAkweDAyCS8qIENoaXAgc2VsZWN0ICovCiAjZGVmaW5lIEhQQzNfRUVQUk9NX0VDTEsJMHgwNAkvKiBFRVBST00gY2xvY2sgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvc2dpL2lwMjIuaCBiL2luY2x1ZGUvYXNtLW1pcHMvc2dpL2lwMjIuaAppbmRleCA2NTkyZjNiLi5mNDk4MWM0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL3NnaS9pcDIyLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9zZ2kvaXAyMi5oCkBAIC03Miw3ICs3Miw3IEBACiAKICNkZWZpbmUgaXAyMl9pc19mdWxsaG91c2UoKQkoc2dpb2MtPnN5c2lkICYgU0dJT0NfU1lTSURfRlVMTEhPVVNFKQogCi1leHRlcm4gdW5zaWduZWQgc2hvcnQgaXAyMl9lZXByb21fcmVhZCh2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKmN0cmwsIGludCByZWcpOworZXh0ZXJuIHVuc2lnbmVkIHNob3J0IGlwMjJfZWVwcm9tX3JlYWQodW5zaWduZWQgaW50ICpjdHJsLCBpbnQgcmVnKTsKIGV4dGVybiB1bnNpZ25lZCBzaG9ydCBpcDIyX252cmFtX3JlYWQoaW50IHJlZyk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9zZ2kvbWMuaCBiL2luY2x1ZGUvYXNtLW1pcHMvc2dpL21jLmgKaW5kZXggYzUyZjc4My4uMTU3NmMyMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9zZ2kvbWMuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL3NnaS9tYy5oCkBAIC01Nyw3ICs1Nyw3IEBACiAJdm9sYXRpbGUgdTMyIGRpdmlkZXI7CS8qIERpdmlkZXIgcmVnIGZvciBSUFNTICovCiAKIAl1MzIgX3VudXNlZDU7Ci0Jdm9sYXRpbGUgdTMyIGVlcHJvbTsJLyogRUVQUk9NIGJ5dGUgcmVnIGZvciByNGsgKi8KKwl1MzIgZWVwcm9tOwkJLyogRUVQUk9NIGJ5dGUgcmVnIGZvciByNGsgKi8KICNkZWZpbmUgU0dJTUNfRUVQUk9NX1BSRQkweDAwMDAwMDAxIC8qIGVlcHJvbSBjaGlwIFBSRSBwaW4gYXNzZXJ0aW9uICovCiAjZGVmaW5lIFNHSU1DX0VFUFJPTV9DU0VMCTB4MDAwMDAwMDIgLyogQWN0aXZlIGhpZ2gsIGVlcHJvbSBjaGlwIHNlbGVjdCAqLwogI2RlZmluZSBTR0lNQ19FRVBST01fU0VDTE9DSwkweDAwMDAwMDA0IC8qIEVFUFJPTSBzZXJpYWwgY2xvY2sgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL2JjbTE0ODBfaW50LmggYi9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9iY20xNDgwX2ludC5oCmluZGV4IDQyZDRjZjAuLmMwZDUyMDYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL2JjbTE0ODBfaW50LmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvYmNtMTQ4MF9pbnQuaApAQCAtMTU3LDYgKzE1Nyw3IEBACiAgKiBNYXNrIHZhbHVlcyBmb3IgZWFjaCBpbnRlcnJ1cHQKICAqLwogCisjZGVmaW5lIF9CQ00xNDgwX0lOVF9NQVNLKHcsbikgICAgICAgICAgICAgIF9TQl9NQUtFTUFTSyh3LCgobikgJiAweDNGKSkKICNkZWZpbmUgX0JDTTE0ODBfSU5UX01BU0sxKG4pICAgICAgICAgICAgICAgX1NCX01BS0VNQVNLMSgoKG4pICYgMHgzRikpCiAjZGVmaW5lIF9CQ00xNDgwX0lOVF9PRkZTRVQobikgICAgICAgICAgICAgICgoKG4pICYgMHg0MCkgPDwgNikKIApAQCAtMTk1LDYgKzE5Niw3IEBACiAjZGVmaW5lIE1fQkNNMTQ4MF9JTlRfUE1JX0hJR0ggICAgICAgICAgICAgIF9CQ00xNDgwX0lOVF9NQVNLMShLX0JDTTE0ODBfSU5UX1BNSV9ISUdIKQogI2RlZmluZSBNX0JDTTE0ODBfSU5UX1BNT19MT1cgICAgICAgICAgICAgICBfQkNNMTQ4MF9JTlRfTUFTSzEoS19CQ00xNDgwX0lOVF9QTU9fTE9XKQogI2RlZmluZSBNX0JDTTE0ODBfSU5UX1BNT19ISUdIICAgICAgICAgICAgICBfQkNNMTQ4MF9JTlRfTUFTSzEoS19CQ00xNDgwX0lOVF9QTU9fSElHSCkKKyNkZWZpbmUgTV9CQ00xNDgwX0lOVF9NQk9YX0FMTCAgICAgICAgICAgICAgX0JDTTE0ODBfSU5UX01BU0soOCxLX0JDTTE0ODBfSU5UX01CT1hfMF8wKQogI2RlZmluZSBNX0JDTTE0ODBfSU5UX01CT1hfMF8wICAgICAgICAgICAgICBfQkNNMTQ4MF9JTlRfTUFTSzEoS19CQ00xNDgwX0lOVF9NQk9YXzBfMCkKICNkZWZpbmUgTV9CQ00xNDgwX0lOVF9NQk9YXzBfMSAgICAgICAgICAgICAgX0JDTTE0ODBfSU5UX01BU0sxKEtfQkNNMTQ4MF9JTlRfTUJPWF8wXzEpCiAjZGVmaW5lIE1fQkNNMTQ4MF9JTlRfTUJPWF8wXzIgICAgICAgICAgICAgIF9CQ00xNDgwX0lOVF9NQVNLMShLX0JDTTE0ODBfSU5UX01CT1hfMF8yKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvYmNtMTQ4MF9tYy5oIGIvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvYmNtMTQ4MF9tYy5oCmluZGV4IDZiZGM5NDEuLmE2YTQzNzQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL2JjbTE0ODBfbWMuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9iY20xNDgwX21jLmgKQEAgLTM4Miw2ICszODIsMTAgQEAKICNkZWZpbmUgTV9CQ00xNDgwX01DX0NTNiAgICAgICAgICAgICAgICAgICAgX1NCX01BS0VNQVNLMSgxMCkKICNkZWZpbmUgTV9CQ00xNDgwX01DX0NTNyAgICAgICAgICAgICAgICAgICAgX1NCX01BS0VNQVNLMSgxMSkKIAorI2RlZmluZSBNX0JDTTE0ODBfTUNfQ1MgICAgICAgICAgICAgICAgICBfU0JfTUFLRU1BU0soOCxTX0JDTTE0ODBfTUNfQ1MwKQorI2RlZmluZSBWX0JDTTE0ODBfTUNfQ1MoeCkgICAgICAgICAgICAgICBfU0JfTUFLRVZBTFVFKHgsU19CQ00xNDgwX01DX0NTMCkKKyNkZWZpbmUgR19CQ00xNDgwX01DX0NTKHgpICAgICAgICAgICAgICAgX1NCX0dFVFZBTFVFKHgsU19CQ00xNDgwX01DX0NTMCxNX0JDTTE0ODBfTUNfQ1MwKQorCiAjZGVmaW5lIE1fQkNNMTQ4MF9NQ19DTURfQUNUSVZFICAgICAgICAgICAgIF9TQl9NQUtFTUFTSzEoMTYpCiAKIC8qCkBAIC00MTIsNiArNDE2LDggQEAKICNkZWZpbmUgS19CQ00xNDgwX01DX0RSQU1fVFlQRV9ERFIyCSAgICAyCiAjZW5kaWYKIAorI2RlZmluZSBLX0JDTTE0ODBfTUNfRFJBTV9UWVBFX0REUjJfUEFTUzEgICAwCisKICNkZWZpbmUgVl9CQ00xNDgwX01DX0RSQU1fVFlQRV9KRURFQyAgICAgICAgVl9CQ00xNDgwX01DX0RSQU1fVFlQRShLX0JDTTE0ODBfTUNfRFJBTV9UWVBFX0pFREVDKQogI2RlZmluZSBWX0JDTTE0ODBfTUNfRFJBTV9UWVBFX0ZDUkFNICAgICAgICBWX0JDTTE0ODBfTUNfRFJBTV9UWVBFKEtfQkNNMTQ4MF9NQ19EUkFNX1RZUEVfRkNSQU0pCiAKQEAgLTUxMSw2ICs1MTcsMjIgQEAKICNkZWZpbmUgTV9CQ00xNDgwX01DX1dSX09EVDZfQ1M2CSAgICBfU0JfTUFLRU1BU0sxKDMxKQogCiAjZGVmaW5lIE1fQkNNMTQ4MF9NQ19DU19PRERfT0RUX0VOCSAgICBfU0JfTUFLRU1BU0sxKDMyKQorCisjZGVmaW5lIFNfQkNNMTQ4MF9NQ19PRFQwCSAgICAgICAgICAgIDAKKyNkZWZpbmUgTV9CQ00xNDgwX01DX09EVDAJCSAgICBfU0JfTUFLRU1BU0soOCxTX0JDTTE0ODBfTUNfT0RUMCkKKyNkZWZpbmUgVl9CQ00xNDgwX01DX09EVDAoeCkJCSAgICBfU0JfTUFLRVZBTFVFKHgsU19CQ00xNDgwX01DX09EVDApCisKKyNkZWZpbmUgU19CQ00xNDgwX01DX09EVDIJICAgICAgICAgICAgOAorI2RlZmluZSBNX0JDTTE0ODBfTUNfT0RUMgkJICAgIF9TQl9NQUtFTUFTSyg4LFNfQkNNMTQ4MF9NQ19PRFQyKQorI2RlZmluZSBWX0JDTTE0ODBfTUNfT0RUMih4KQkJICAgIF9TQl9NQUtFVkFMVUUoeCxTX0JDTTE0ODBfTUNfT0RUMikKKworI2RlZmluZSBTX0JDTTE0ODBfTUNfT0RUNAkgICAgICAgICAgICAxNgorI2RlZmluZSBNX0JDTTE0ODBfTUNfT0RUNAkJICAgIF9TQl9NQUtFTUFTSyg4LFNfQkNNMTQ4MF9NQ19PRFQ0KQorI2RlZmluZSBWX0JDTTE0ODBfTUNfT0RUNCh4KQkJICAgIF9TQl9NQUtFVkFMVUUoeCxTX0JDTTE0ODBfTUNfT0RUNCkKKworI2RlZmluZSBTX0JDTTE0ODBfTUNfT0RUNgkgICAgICAgICAgICAyNAorI2RlZmluZSBNX0JDTTE0ODBfTUNfT0RUNgkJICAgIF9TQl9NQUtFTUFTSyg4LFNfQkNNMTQ4MF9NQ19PRFQ2KQorI2RlZmluZSBWX0JDTTE0ODBfTUNfT0RUNih4KQkJICAgIF9TQl9NQUtFVkFMVUUoeCxTX0JDTTE0ODBfTUNfT0RUNikKICNlbmRpZgogCiAvKgpAQCAtNTg4LDExICs2MTAsMTEgQEAKICNkZWZpbmUJTV9CQ00xNDgwX01DX0RRT19TSElGVCAgICAgICAgICAgIF9TQl9NQUtFTUFTSzEoNDcpCiAjZW5kaWYKIAotI2RlZmluZSBTX0JDTTE0ODBfTUNfRExMX0RFRkFVTFQgICAgICAgICAgICA0OAotI2RlZmluZSBNX0JDTTE0ODBfTUNfRExMX0RFRkFVTFQgICAgICAgICAgICBfU0JfTUFLRU1BU0soNixTX0JDTTE0ODBfTUNfRExMX0RFRkFVTFQpCi0jZGVmaW5lIFZfQkNNMTQ4MF9NQ19ETExfREVGQVVMVCh4KSAgICAgICAgIF9TQl9NQUtFVkFMVUUoeCxTX0JDTTE0ODBfTUNfRExMX0RFRkFVTFQpCi0jZGVmaW5lIEdfQkNNMTQ4MF9NQ19ETExfREVGQVVMVCh4KSAgICAgICAgIF9TQl9HRVRWQUxVRSh4LFNfQkNNMTQ4MF9NQ19ETExfREVGQVVMVCxNX0JDTTE0ODBfTUNfRExMX0RFRkFVTFQpCi0jZGVmaW5lIFZfQkNNMTQ4MF9NQ19ETExfREVGQVVMVF9ERUZBVUxUICAgIFZfQkNNMTQ4MF9NQ19ETExfREVGQVVMVCgweDEwKQorI2RlZmluZSBTX0JDTTE0ODBfTUNfRExMX0RFRkFVTFQgICAgICAgICAgIDQ4CisjZGVmaW5lIE1fQkNNMTQ4MF9NQ19ETExfREVGQVVMVCAgICAgICAgICAgX1NCX01BS0VNQVNLKDYsU19CQ00xNDgwX01DX0RMTF9ERUZBVUxUKQorI2RlZmluZSBWX0JDTTE0ODBfTUNfRExMX0RFRkFVTFQoeCkgICAgICAgIF9TQl9NQUtFVkFMVUUoeCxTX0JDTTE0ODBfTUNfRExMX0RFRkFVTFQpCisjZGVmaW5lIEdfQkNNMTQ4MF9NQ19ETExfREVGQVVMVCh4KSAgICAgICAgX1NCX0dFVFZBTFVFKHgsU19CQ00xNDgwX01DX0RMTF9ERUZBVUxULE1fQkNNMTQ4MF9NQ19ETExfREVGQVVMVCkKKyNkZWZpbmUgVl9CQ00xNDgwX01DX0RMTF9ERUZBVUxUX0RFRkFVTFQgICBWX0JDTTE0ODBfTUNfRExMX0RFRkFVTFQoMHgxMCkKIAogI2lmIFNJQllURV9IRFJfRkVBVFVSRSgxNDgwLCBQQVNTMikKICNkZWZpbmUgU19CQ00xNDgwX01DX0RMTF9SRUdDVFJMCSAgNTQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL2JjbTE0ODBfcmVncy5oIGIvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvYmNtMTQ4MF9yZWdzLmgKaW5kZXggYzJkZDJmZS4uYmRhMzkxZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvYmNtMTQ4MF9yZWdzLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvYmNtMTQ4MF9yZWdzLmgKQEAgLTIzMCw2ICsyMzAsNyBAQAogCiAjZGVmaW5lIEFfQkNNMTQ4MF9EVUFSVF9JTVJSRUcoY2hhbikJICAgIChBX0JDTTE0ODBfRFVBUlQoY2hhbikgKyBSX0JDTTE0ODBfRFVBUlRfSU1SUkVHKGNoYW4pKQogI2RlZmluZSBBX0JDTTE0ODBfRFVBUlRfSVNSUkVHKGNoYW4pCSAgICAoQV9CQ00xNDgwX0RVQVJUKGNoYW4pICsgUl9CQ00xNDgwX0RVQVJUX0lTUlJFRyhjaGFuKSkKKyNkZWZpbmUgQV9CQ00xNDgwX0RVQVJUX0lOX1BPUlQoY2hhbikgICAgICAgKEFfQkNNMTQ4MF9EVUFSVChjaGFuKSArIFJfRFVBUlRfSU5QX09SVCkKIAogLyoKICAqIFRoZXNlIGNvbnN0YW50cyBhcmUgdGhlIGFic29sdXRlIGFkZHJlc3Nlcy4KQEAgLTQwNCw2ICs0MDUsMjEgQEAKICNkZWZpbmUgUl9CQ00xNDgwX0lNUl9BTElBU19NQUlMQk9YXzAgICAgICAgICAgIDB4MDAwMAkJLyogMHgweDAgKi8KICNkZWZpbmUgUl9CQ00xNDgwX0lNUl9BTElBU19NQUlMQk9YXzBfU0VUICAgICAgIDB4MDAwOAkJLyogMHgweDggKi8KIAorLyoKKyAqIHRoZXNlIG1hY3JvcyB3b3JrIHRvZ2V0aGVyIHRvIGJ1aWxkIHRoZSBhZGRyZXNzIG9mIGEgbWFpbGJveAorICogcmVnaXN0ZXIsIGUuZy4sIEFfQkNNMTQ4MF9NQUlMQk9YX1JFR0lTVEVSKDAsUl9CQ00xNDgwX0lNUl9NQUlMQk9YX1NFVCwyKQorICogZm9yIG1ib3hfMF9zZXRfY3B1MiByZXR1cm5zIDB4MDAxMDAyNDBDOAorICovCisjZGVmaW5lIFJfQkNNMTQ4MF9JTVJfTUFJTEJPWF9DUFUgICAgICAgICAweDAwCisjZGVmaW5lIFJfQkNNMTQ4MF9JTVJfTUFJTEJPWF9TRVQgICAgICAgICAweDA4CisjZGVmaW5lIFJfQkNNMTQ4MF9JTVJfTUFJTEJPWF9DTFIgICAgICAgICAweDEwCisjZGVmaW5lIFJfQkNNMTQ4MF9JTVJfTUFJTEJPWF9OVU1fU1BBQ0lORyAweDIwCisjZGVmaW5lIEFfQkNNMTQ4MF9NQUlMQk9YX1JFR0lTVEVSKG51bSxyZWcsY3B1KSBcCisgICAgKEFfQkNNMTQ4MF9JTVJfQ1BVMF9CQVNFICsgXAorICAgICAobnVtICogUl9CQ00xNDgwX0lNUl9NQUlMQk9YX05VTV9TUEFDSU5HKSArIFwKKyAgICAgKGNwdSAqIEJDTTE0ODBfSU1SX1JFR0lTVEVSX1NQQUNJTkcpICsgXAorICAgICAoUl9CQ00xNDgwX0lNUl9NQUlMQk9YXzBfQ1BVICsgcmVnKSkKKwogLyogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICogU3lzdGVtIFBlcmZvcm1hbmNlIENvdW50ZXIgUmVnaXN0ZXJzIChTZWN0aW9uIDQuNykKICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KQEAgLTQyOCw2ICs0NDQsMTAgQEAKICNkZWZpbmUgQV9CQ00xNDgwX1NDRF9QRVJGX0NOVF82ICAgICAgICAgICAgMHgwMDEwMDIwNTAwCiAjZGVmaW5lIEFfQkNNMTQ4MF9TQ0RfUEVSRl9DTlRfNyAgICAgICAgICAgIDB4MDAxMDAyMDUwOAogCisjZGVmaW5lIEJDTTE0ODBfU0NEX05VTV9QRVJGX0NOVCA4CisjZGVmaW5lIEJDTTE0ODBfU0NEX1BFUkZfQ05UX1NQQUNJTkcgOAorI2RlZmluZSBBX0JDTTE0ODBfU0NEX1BFUkZfQ05UKG4pIChBX1NDRF9QRVJGX0NOVF8wKyhuKkJDTTE0ODBfU0NEX1BFUkZfQ05UX1NQQUNJTkcpKQorCiAvKiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgKiBTeXN0ZW0gQnVzIFdhdGNoZXIgUmVnaXN0ZXJzIChTZWN0aW9uIDQuOCkKICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL2JjbTE0ODBfc2NkLmggYi9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9iY20xNDgwX3NjZC5oCmluZGV4IDY0OGJlZDkuLjYxMTFkNmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL2JjbTE0ODBfc2NkLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvYmNtMTQ4MF9zY2QuaApAQCAtMTAsNyArMTAsNyBAQAogICAgICoKICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAqCi0gICAgKiAgQ29weXJpZ2h0IDIwMDAsMjAwMSwyMDAyLDIwMDMKKyAgICAqICBDb3B5cmlnaHQgMjAwMCwyMDAxLDIwMDIsMjAwMywyMDA0LDIwMDUKICAgICAqICBCcm9hZGNvbSBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgICAqCiAgICAgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgpAQCAtNzgsNiArNzgsNyBAQAogI2RlZmluZSBLX1NZU19QQVJUX0JDTTEyODAgICAgICAgICAgMHgxMjA2CiAjZGVmaW5lIEtfU1lTX1BBUlRfQkNNMTQ1NSAgICAgICAgICAweDE0MDcKICNkZWZpbmUgS19TWVNfUEFSVF9CQ00xMjU1ICAgICAgICAgIDB4MTI1NworI2RlZmluZSBLX1NZU19QQVJUX0JDTTExNTggICAgICAgICAgMHgxMTU2CiAKIC8qCiAgKiBNYW51ZmFjdHVyaW5nIEluZm9ybWF0aW9uIFJlZ2lzdGVyIChUYWJsZSAxNCkKQEAgLTIzNyw1OCArMjM4LDQyIEBACiAgKiBTeXN0ZW0gUGVyZm9ybWFuY2UgQ291bnRlciBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIChUYWJsZSAzMSkKICAqIFJlZ2lzdGVyOiBQRVJGX0NOVF9DRkdfMAogICoKLSAqIFNpbmNlIHRoZSBjbGVhci9lbmFibGUgYml0cyBhcmUgbW92ZWQgY29tcGFyZWQgdG8gdGhlCi0gKiAxMjUwIGFuZCB0aGVyZSBhcmUgbW9yZSBmaWVsZHMsIHRoaXMgcmVnaXN0ZXIgd2lsbCBiZSBCQ00xNDgwIHNwZWNpZmljLgorICogU1BDX0NGR19TUkNbMC0zXSBpcyB0aGUgc2FtZSBhcyB0aGUgMTI1MC4KKyAqIFNQQ19DRkdfU1JDWzQtN10gb25seSBleGlzdCBvbiB0aGUgMTQ4MAorICogVGhlIGNsZWFyL2VuYWJsZSBiaXRzIGFyZSBpbiBkaWZmZXJlbnQgbG9jYXRpb25zIG9uIHRoZSAxMjUwIGFuZCAxNDgwLgogICovCiAKLSNkZWZpbmUgU19CQ00xNDgwX1NQQ19DRkdfU1JDMCAgICAgICAgICAgICAgMAotI2RlZmluZSBNX0JDTTE0ODBfU1BDX0NGR19TUkMwICAgICAgICAgICAgICBfU0JfTUFLRU1BU0soOCxTX0JDTTE0ODBfU1BDX0NGR19TUkMwKQotI2RlZmluZSBWX0JDTTE0ODBfU1BDX0NGR19TUkMwKHgpICAgICAgICAgICBfU0JfTUFLRVZBTFVFKHgsU19CQ00xNDgwX1NQQ19DRkdfU1JDMCkKLSNkZWZpbmUgR19CQ00xNDgwX1NQQ19DRkdfU1JDMCh4KSAgICAgICAgICAgX1NCX0dFVFZBTFVFKHgsU19CQ00xNDgwX1NQQ19DRkdfU1JDMCxNX0JDTTE0ODBfU1BDX0NGR19TUkMwKQorI2RlZmluZSBTX1NQQ19DRkdfU1JDNCAgICAgICAgICAgICAgMzIKKyNkZWZpbmUgTV9TUENfQ0ZHX1NSQzQgICAgICAgICAgICAgIF9TQl9NQUtFTUFTSyg4LFNfU1BDX0NGR19TUkM0KQorI2RlZmluZSBWX1NQQ19DRkdfU1JDNCh4KSAgICAgICAgICAgX1NCX01BS0VWQUxVRSh4LFNfU1BDX0NGR19TUkM0KQorI2RlZmluZSBHX1NQQ19DRkdfU1JDNCh4KSAgICAgICAgICAgX1NCX0dFVFZBTFVFKHgsU19TUENfQ0ZHX1NSQzQsTV9TUENfQ0ZHX1NSQzQpCiAKLSNkZWZpbmUgU19CQ00xNDgwX1NQQ19DRkdfU1JDMSAgICAgICAgICAgICAgOAotI2RlZmluZSBNX0JDTTE0ODBfU1BDX0NGR19TUkMxICAgICAgICAgICAgICBfU0JfTUFLRU1BU0soOCxTX0JDTTE0ODBfU1BDX0NGR19TUkMxKQotI2RlZmluZSBWX0JDTTE0ODBfU1BDX0NGR19TUkMxKHgpICAgICAgICAgICBfU0JfTUFLRVZBTFVFKHgsU19CQ00xNDgwX1NQQ19DRkdfU1JDMSkKLSNkZWZpbmUgR19CQ00xNDgwX1NQQ19DRkdfU1JDMSh4KSAgICAgICAgICAgX1NCX0dFVFZBTFVFKHgsU19CQ00xNDgwX1NQQ19DRkdfU1JDMSxNX0JDTTE0ODBfU1BDX0NGR19TUkMxKQorI2RlZmluZSBTX1NQQ19DRkdfU1JDNSAgICAgICAgICAgICAgNDAKKyNkZWZpbmUgTV9TUENfQ0ZHX1NSQzUgICAgICAgICAgICAgIF9TQl9NQUtFTUFTSyg4LFNfU1BDX0NGR19TUkM1KQorI2RlZmluZSBWX1NQQ19DRkdfU1JDNSh4KSAgICAgICAgICAgX1NCX01BS0VWQUxVRSh4LFNfU1BDX0NGR19TUkM1KQorI2RlZmluZSBHX1NQQ19DRkdfU1JDNSh4KSAgICAgICAgICAgX1NCX0dFVFZBTFVFKHgsU19TUENfQ0ZHX1NSQzUsTV9TUENfQ0ZHX1NSQzUpCiAKLSNkZWZpbmUgU19CQ00xNDgwX1NQQ19DRkdfU1JDMiAgICAgICAgICAgICAgMTYKLSNkZWZpbmUgTV9CQ00xNDgwX1NQQ19DRkdfU1JDMiAgICAgICAgICAgICAgX1NCX01BS0VNQVNLKDgsU19CQ00xNDgwX1NQQ19DRkdfU1JDMikKLSNkZWZpbmUgVl9CQ00xNDgwX1NQQ19DRkdfU1JDMih4KSAgICAgICAgICAgX1NCX01BS0VWQUxVRSh4LFNfQkNNMTQ4MF9TUENfQ0ZHX1NSQzIpCi0jZGVmaW5lIEdfQkNNMTQ4MF9TUENfQ0ZHX1NSQzIoeCkgICAgICAgICAgIF9TQl9HRVRWQUxVRSh4LFNfQkNNMTQ4MF9TUENfQ0ZHX1NSQzIsTV9CQ00xNDgwX1NQQ19DRkdfU1JDMikKKyNkZWZpbmUgU19TUENfQ0ZHX1NSQzYgICAgICAgICAgICAgIDQ4CisjZGVmaW5lIE1fU1BDX0NGR19TUkM2ICAgICAgICAgICAgICBfU0JfTUFLRU1BU0soOCxTX1NQQ19DRkdfU1JDNikKKyNkZWZpbmUgVl9TUENfQ0ZHX1NSQzYoeCkgICAgICAgICAgIF9TQl9NQUtFVkFMVUUoeCxTX1NQQ19DRkdfU1JDNikKKyNkZWZpbmUgR19TUENfQ0ZHX1NSQzYoeCkgICAgICAgICAgIF9TQl9HRVRWQUxVRSh4LFNfU1BDX0NGR19TUkM2LE1fU1BDX0NGR19TUkM2KQogCi0jZGVmaW5lIFNfQkNNMTQ4MF9TUENfQ0ZHX1NSQzMgICAgICAgICAgICAgIDI0Ci0jZGVmaW5lIE1fQkNNMTQ4MF9TUENfQ0ZHX1NSQzMgICAgICAgICAgICAgIF9TQl9NQUtFTUFTSyg4LFNfQkNNMTQ4MF9TUENfQ0ZHX1NSQzMpCi0jZGVmaW5lIFZfQkNNMTQ4MF9TUENfQ0ZHX1NSQzMoeCkgICAgICAgICAgIF9TQl9NQUtFVkFMVUUoeCxTX0JDTTE0ODBfU1BDX0NGR19TUkMzKQotI2RlZmluZSBHX0JDTTE0ODBfU1BDX0NGR19TUkMzKHgpICAgICAgICAgICBfU0JfR0VUVkFMVUUoeCxTX0JDTTE0ODBfU1BDX0NGR19TUkMzLE1fQkNNMTQ4MF9TUENfQ0ZHX1NSQzMpCi0KLSNkZWZpbmUgU19CQ00xNDgwX1NQQ19DRkdfU1JDNCAgICAgICAgICAgICAgMzIKLSNkZWZpbmUgTV9CQ00xNDgwX1NQQ19DRkdfU1JDNCAgICAgICAgICAgICAgX1NCX01BS0VNQVNLKDgsU19CQ00xNDgwX1NQQ19DRkdfU1JDNCkKLSNkZWZpbmUgVl9CQ00xNDgwX1NQQ19DRkdfU1JDNCh4KSAgICAgICAgICAgX1NCX01BS0VWQUxVRSh4LFNfQkNNMTQ4MF9TUENfQ0ZHX1NSQzQpCi0jZGVmaW5lIEdfQkNNMTQ4MF9TUENfQ0ZHX1NSQzQoeCkgICAgICAgICAgIF9TQl9HRVRWQUxVRSh4LFNfQkNNMTQ4MF9TUENfQ0ZHX1NSQzQsTV9CQ00xNDgwX1NQQ19DRkdfU1JDNCkKLQotI2RlZmluZSBTX0JDTTE0ODBfU1BDX0NGR19TUkM1ICAgICAgICAgICAgICA0MAotI2RlZmluZSBNX0JDTTE0ODBfU1BDX0NGR19TUkM1ICAgICAgICAgICAgICBfU0JfTUFLRU1BU0soOCxTX0JDTTE0ODBfU1BDX0NGR19TUkM1KQotI2RlZmluZSBWX0JDTTE0ODBfU1BDX0NGR19TUkM1KHgpICAgICAgICAgICBfU0JfTUFLRVZBTFVFKHgsU19CQ00xNDgwX1NQQ19DRkdfU1JDNSkKLSNkZWZpbmUgR19CQ00xNDgwX1NQQ19DRkdfU1JDNSh4KSAgICAgICAgICAgX1NCX0dFVFZBTFVFKHgsU19CQ00xNDgwX1NQQ19DRkdfU1JDNSxNX0JDTTE0ODBfU1BDX0NGR19TUkM1KQotCi0jZGVmaW5lIFNfQkNNMTQ4MF9TUENfQ0ZHX1NSQzYgICAgICAgICAgICAgIDQ4Ci0jZGVmaW5lIE1fQkNNMTQ4MF9TUENfQ0ZHX1NSQzYgICAgICAgICAgICAgIF9TQl9NQUtFTUFTSyg4LFNfQkNNMTQ4MF9TUENfQ0ZHX1NSQzYpCi0jZGVmaW5lIFZfQkNNMTQ4MF9TUENfQ0ZHX1NSQzYoeCkgICAgICAgICAgIF9TQl9NQUtFVkFMVUUoeCxTX0JDTTE0ODBfU1BDX0NGR19TUkM2KQotI2RlZmluZSBHX0JDTTE0ODBfU1BDX0NGR19TUkM2KHgpICAgICAgICAgICBfU0JfR0VUVkFMVUUoeCxTX0JDTTE0ODBfU1BDX0NGR19TUkM2LE1fQkNNMTQ4MF9TUENfQ0ZHX1NSQzYpCi0KLSNkZWZpbmUgU19CQ00xNDgwX1NQQ19DRkdfU1JDNyAgICAgICAgICAgICAgNTYKLSNkZWZpbmUgTV9CQ00xNDgwX1NQQ19DRkdfU1JDNyAgICAgICAgICAgICAgX1NCX01BS0VNQVNLKDgsU19CQ00xNDgwX1NQQ19DRkdfU1JDNykKLSNkZWZpbmUgVl9CQ00xNDgwX1NQQ19DRkdfU1JDNyh4KSAgICAgICAgICAgX1NCX01BS0VWQUxVRSh4LFNfQkNNMTQ4MF9TUENfQ0ZHX1NSQzcpCi0jZGVmaW5lIEdfQkNNMTQ4MF9TUENfQ0ZHX1NSQzcoeCkgICAgICAgICAgIF9TQl9HRVRWQUxVRSh4LFNfQkNNMTQ4MF9TUENfQ0ZHX1NSQzcsTV9CQ00xNDgwX1NQQ19DRkdfU1JDNykKKyNkZWZpbmUgU19TUENfQ0ZHX1NSQzcgICAgICAgICAgICAgIDU2CisjZGVmaW5lIE1fU1BDX0NGR19TUkM3ICAgICAgICAgICAgICBfU0JfTUFLRU1BU0soOCxTX1NQQ19DRkdfU1JDNykKKyNkZWZpbmUgVl9TUENfQ0ZHX1NSQzcoeCkgICAgICAgICAgIF9TQl9NQUtFVkFMVUUoeCxTX1NQQ19DRkdfU1JDNykKKyNkZWZpbmUgR19TUENfQ0ZHX1NSQzcoeCkgICAgICAgICAgIF9TQl9HRVRWQUxVRSh4LFNfU1BDX0NGR19TUkM3LE1fU1BDX0NGR19TUkM3KQogCiAvKgogICogU3lzdGVtIFBlcmZvcm1hbmNlIENvdW50ZXIgQ29udHJvbCBSZWdpc3RlciAoVGFibGUgMzIpCiAgKiBSZWdpc3RlcjogUEVSRl9DTlRfQ0ZHXzEKICAqIEJDTTE0ODAgc3BlY2lmaWMKICAqLwotCi0jZGVmaW5lIE1fQkNNMTQ4MF9TUENfQ0ZHX0NMRUFSICAgICAgICAgICAgIF9TQl9NQUtFTUFTSzEoMCkKLSNkZWZpbmUgTV9CQ00xNDgwX1NQQ19DRkdfRU5BQkxFICAgICAgICAgICAgX1NCX01BS0VNQVNLMSgxKQorI2RlZmluZSBNX0JDTTE0ODBfU1BDX0NGR19DTEVBUiAgICAgX1NCX01BS0VNQVNLMSgwKQorI2RlZmluZSBNX0JDTTE0ODBfU1BDX0NGR19FTkFCTEUgICAgX1NCX01BS0VNQVNLMSgxKQorI2lmIFNJQllURV9IRFJfRkVBVFVSRV9DSElQKDE0ODApCisjZGVmaW5lIE1fU1BDX0NGR19DTEVBUgkJCU1fQkNNMTQ4MF9TUENfQ0ZHX0NMRUFSCisjZGVmaW5lIE1fU1BDX0NGR19FTkFCTEUJCU1fQkNNMTQ4MF9TUENfQ0ZHX0VOQUJMRQorI2VuZGlmCiAKIC8qCiAgKiBTeXN0ZW0gUGVyZm9ybWFuY2UgQ291bnRlcnMgKFRhYmxlIDMzKQpAQCAtNDA1LDIwICszOTAsMTAgQEAKICAqIFRyYWNlIENvbnRyb2wgUmVnaXN0ZXIgKFRhYmxlIDQ5KQogICogUmVnaXN0ZXI6IFRSQUNFX0NGRwogICoKLSAqIEJpdHMgMC4uOCBhcmUgdGhlIHNhbWUgYXMgdGhlIEJDTTEyNTAsIHJlc3QgYXJlIGRpZmZlcmVudC4KLSAqIEVudGlyZSByZWdpc3RlciBpcyByZWRlZmluZWQgYmVsb3cuCisgKiBCQ00xNDgwIGNoYW5nZXMgdG8gdGhpcyByZWdpc3RlciAob3RoZXIgdGhhbiBsb2NhdGlvbiBvZiB0aGUgQ1VSX0FERFIgZmllbGQpCisgKiBhcmUgZGVmaW5lZCBiZWxvdy4KICAqLwogCi0jZGVmaW5lIE1fQkNNMTQ4MF9TQ0RfVFJBQ0VfQ0ZHX1JFU0VUICAgICAgIF9TQl9NQUtFTUFTSzEoMCkKLSNkZWZpbmUgTV9CQ00xNDgwX1NDRF9UUkFDRV9DRkdfU1RBUlRfUkVBRCAgX1NCX01BS0VNQVNLMSgxKQotI2RlZmluZSBNX0JDTTE0ODBfU0NEX1RSQUNFX0NGR19TVEFSVCAgICAgICBfU0JfTUFLRU1BU0sxKDIpCi0jZGVmaW5lIE1fQkNNMTQ4MF9TQ0RfVFJBQ0VfQ0ZHX1NUT1AgICAgICAgIF9TQl9NQUtFTUFTSzEoMykKLSNkZWZpbmUgTV9CQ00xNDgwX1NDRF9UUkFDRV9DRkdfRlJFRVpFICAgICAgX1NCX01BS0VNQVNLMSg0KQotI2RlZmluZSBNX0JDTTE0ODBfU0NEX1RSQUNFX0NGR19GUkVFWkVfRlVMTCBfU0JfTUFLRU1BU0sxKDUpCi0jZGVmaW5lIE1fQkNNMTQ4MF9TQ0RfVFJBQ0VfQ0ZHX0RFQlVHX0ZVTEwgIF9TQl9NQUtFTUFTSzEoNikKLSNkZWZpbmUgTV9CQ00xNDgwX1NDRF9UUkFDRV9DRkdfRlVMTCAgICAgICAgX1NCX01BS0VNQVNLMSg3KQotI2RlZmluZSBNX0JDTTE0ODBfU0NEX1RSQUNFX0NGR19GT1JDRV9DTlQgICBfU0JfTUFLRU1BU0sxKDgpCi0KICNkZWZpbmUgU19CQ00xNDgwX1NDRF9UUkFDRV9DRkdfTU9ERSAgICAgICAgMTYKICNkZWZpbmUgTV9CQ00xNDgwX1NDRF9UUkFDRV9DRkdfTU9ERSAgICAgICAgX1NCX01BS0VNQVNLKDIsU19CQ00xNDgwX1NDRF9UUkFDRV9DRkdfTU9ERSkKICNkZWZpbmUgVl9CQ00xNDgwX1NDRF9UUkFDRV9DRkdfTU9ERSh4KSAgICAgX1NCX01BS0VWQUxVRSh4LFNfQkNNMTQ4MF9TQ0RfVFJBQ0VfQ0ZHX01PREUpCkBAIC00MjgsOSArNDAzLDQgQEAKICNkZWZpbmUgS19CQ00xNDgwX1NDRF9UUkFDRV9DRkdfTU9ERV9CWVRFRU5fSU5UCTEKICNkZWZpbmUgS19CQ00xNDgwX1NDRF9UUkFDRV9DRkdfTU9ERV9GTE9XX0lECTIKIAotI2RlZmluZSBTX0JDTTE0ODBfU0NEX1RSQUNFX0NGR19DVVJfQUREUiAgICAyNAotI2RlZmluZSBNX0JDTTE0ODBfU0NEX1RSQUNFX0NGR19DVVJfQUREUiAgICBfU0JfTUFLRU1BU0soOCxTX0JDTTE0ODBfU0NEX1RSQUNFX0NGR19DVVJfQUREUikKLSNkZWZpbmUgVl9CQ00xNDgwX1NDRF9UUkFDRV9DRkdfQ1VSX0FERFIoeCkgX1NCX01BS0VWQUxVRSh4LFNfQkNNMTQ4MF9TQ0RfVFJBQ0VfQ0ZHX0NVUl9BRERSKQotI2RlZmluZSBHX0JDTTE0ODBfU0NEX1RSQUNFX0NGR19DVVJfQUREUih4KSBfU0JfR0VUVkFMVUUoeCxTX0JDTTE0ODBfU0NEX1RSQUNFX0NGR19DVVJfQUREUixNX0JDTTE0ODBfU0NEX1RSQUNFX0NGR19DVVJfQUREUikKLQogI2VuZGlmIC8qIF9CQ00xNDgwX1NDRF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9ib2FyZC5oIGIvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvYm9hcmQuaAppbmRleCAzZGZlMjllLi43M2JjZTkwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9ib2FyZC5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL2JvYXJkLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzIEJyb2FkY29tIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAsMjAwMSwyMDAyLDIwMDMsMjAwNCBCcm9hZGNvbSBDb3Jwb3JhdGlvbgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCkBAIC0xOSw4ICsxOSw4IEBACiAjaWZuZGVmIF9TSUJZVEVfQk9BUkRfSAogI2RlZmluZSBfU0lCWVRFX0JPQVJEX0gKIAotCiAjaWYgZGVmaW5lZChDT05GSUdfU0lCWVRFX1NXQVJNKSB8fCBkZWZpbmVkKENPTkZJR19TSUJZVEVfUFRTV0FSTSkgfHwgXAorICAgIGRlZmluZWQoQ09ORklHX1NJQllURV9QVDExMjApIHx8IGRlZmluZWQoQ09ORklHX1NJQllURV9QVDExMjUpIHx8IFwKICAgICBkZWZpbmVkKENPTkZJR19TSUJZVEVfQ1JIT05FKSB8fCBkZWZpbmVkKENPTkZJR19TSUJZVEVfQ1JISU5FKSB8fCBcCiAgICAgZGVmaW5lZChDT05GSUdfU0lCWVRFX0xJVFRMRVNVUikKICNpbmNsdWRlIDxhc20vc2lieXRlL3N3YXJtLmg+CkBAIC01NSw2ICs1NSwxNiBAQAogI2RlZmluZSBzZXRsZWRzKHQwLHQxLGMwLGMxLGMyLGMzKQogI2VuZGlmIC8qIExFRFNfUEhZUyAqLwogCisjZWxzZQorCit2b2lkIHN3YXJtX3NldHVwKHZvaWQpOworCisjaWZkZWYgTEVEU19QSFlTCitleHRlcm4gdm9pZCBzZXRsZWRzKGNoYXIgKnN0cik7CisjZWxzZQorI2RlZmluZSBzZXRsZWRzKHMpIGRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBMRURTX1BIWVMgKi8KKwogI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLwogCiAjZW5kaWYgLyogX1NJQllURV9CT0FSRF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9jYXJtZWwuaCBiL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL2Nhcm1lbC5oCmluZGV4IDU3YzUzZTYuLjExY2FkNzEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL2Nhcm1lbC5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL2Nhcm1lbC5oCkBAIC0xOCw3ICsxOCw2IEBACiAjaWZuZGVmIF9fQVNNX1NJQllURV9DQVJNRUxfSAogI2RlZmluZSBfX0FTTV9TSUJZVEVfQ0FSTUVMX0gKIAotCiAjaW5jbHVkZSA8YXNtL3NpYnl0ZS9zYjEyNTAuaD4KICNpbmNsdWRlIDxhc20vc2lieXRlL3NiMTI1MF9pbnQuaD4KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvc2IxMjUwX2ludC5oIGIvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvc2IxMjUwX2ludC5oCmluZGV4IDA1YzdiMzkuLjk0ZTgyOTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL3NiMTI1MF9pbnQuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9zYjEyNTBfaW50LmgKQEAgLTQ1LDggKzQ1LDYgQEAKICAqIEZpcnN0LCB0aGUgaW50ZXJydXB0IG51bWJlcnMuCiAgKi8KIAotI2lmIFNJQllURV9IRFJfRkVBVFVSRV8xMjUwXzExMngKLQogI2RlZmluZSBLX0lOVF9TT1VSQ0VTICAgICAgICAgICAgICAgNjQKIAogI2RlZmluZSBLX0lOVF9XQVRDSERPR19USU1FUl8wICAgICAgMApAQCAtMTUyLDYgKzE1MCw3IEBACiAjZGVmaW5lIE1fSU5UX01CT1hfMSAgICAgICAgICAgICAgICBfU0JfTUFLRU1BU0sxKEtfSU5UX01CT1hfMSkKICNkZWZpbmUgTV9JTlRfTUJPWF8yICAgICAgICAgICAgICAgIF9TQl9NQUtFTUFTSzEoS19JTlRfTUJPWF8yKQogI2RlZmluZSBNX0lOVF9NQk9YXzMgICAgICAgICAgICAgICAgX1NCX01BS0VNQVNLMShLX0lOVF9NQk9YXzMpCisjZGVmaW5lIE1fSU5UX01CT1hfQUxMICAgICAgICAgICAgICBfU0JfTUFLRU1BU0soNCxLX0lOVF9NQk9YXzApCiAjaWYgU0lCWVRFX0hEUl9GRUFUVVJFKDEyNTAsIFBBU1MyKSB8fCBTSUJZVEVfSERSX0ZFQVRVUkUoMTEyeCwgUEFTUzEpCiAjZGVmaW5lIE1fSU5UX0NZQ0xFX0NQMF9JTlQJICAgIF9TQl9NQUtFTUFTSzEoS19JTlRfQ1lDTEVfQ1AwX0lOVCkKICNkZWZpbmUgTV9JTlRfQ1lDTEVfQ1AxX0lOVAkgICAgX1NCX01BS0VNQVNLMShLX0lOVF9DWUNMRV9DUDFfSU5UKQpAQCAtMjQ3LDUgKzI0NiwzIEBACiAKIAogI2VuZGlmCS8qIDEyNTAvMTEyeCAqLwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL3NiMTI1MF9tYWMuaCBiL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL3NiMTI1MF9tYWMuaAppbmRleCBhZGZjNjg4Li44MzNjOGI1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9zYjEyNTBfbWFjLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvc2IxMjUwX21hYy5oCkBAIC0xMjksOSArMTI5LDkgQEAKICNkZWZpbmUgTV9NQUNfQllQQVNTXzE2ICAgICAgICAgICAgIF9TQl9NQUtFTUFTSzEoNDIpCiAjZGVmaW5lIE1fTUFDX0JZUEFTU19GQ1NfQ0hLCSAgICBfU0JfTUFLRU1BU0sxKDQzKQogCi0jaWYgU0lCWVRFX0hEUl9GRUFUVVJFKDEyNTAsIFBBU1MyKSB8fCBTSUJZVEVfSERSX0ZFQVRVUkUoMTEyeCwgUEFTUzEpCisjaWYgU0lCWVRFX0hEUl9GRUFUVVJFKDEyNTAsIFBBU1MyKSB8fCBTSUJZVEVfSERSX0ZFQVRVUkUoMTEyeCwgUEFTUzEpIHx8IFNJQllURV9IRFJfRkVBVFVSRV9DSElQKDE0ODApCiAjZGVmaW5lIE1fTUFDX1JYX0NIX1NFTF9NU0IJICAgIF9TQl9NQUtFTUFTSzEoNDQpCi0jZW5kaWYgLyogMTI1MCBQQVNTMiB8fCAxMTJ4IFBBU1MxICovCisjZW5kaWYgLyogMTI1MCBQQVNTMiB8fCAxMTJ4IFBBU1MxIHx8IDE0ODAqLwogCiAjaWYgU0lCWVRFX0hEUl9GRUFUVVJFKDEyNTAsIFBBU1MzKSB8fCBTSUJZVEVfSERSX0ZFQVRVUkUoMTEyeCwgUEFTUzEpIHx8IFNJQllURV9IRFJfRkVBVFVSRV9DSElQKDE0ODApCiAjZGVmaW5lIE1fTUFDX1NQTElUX0NIX1NFTAkgICAgX1NCX01BS0VNQVNLMSg0NSkKQEAgLTIyMyw5ICsyMjMsOSBAQAogLyogWFhYOiBDYW4ndCBlbmFibGUsIGFzIGl0IGhhcyB0aGUgc2FtZSBuYW1lIGFzIGEgcGFzczIrIGRlZmluZSBiZWxvdy4gICovCiAvKiAjZGVmaW5lIE1fTUFDX1RYX1dSX1RIUlNIICAgICAgICAgICBfU0JfTUFLRU1BU0soNixTX01BQ19UWF9XUl9USFJTSCkgKi8KICNlbmRpZiAvKiB1cCB0byAxMjUwIFBBU1MxICovCi0jaWYgU0lCWVRFX0hEUl9GRUFUVVJFKDEyNTAsIFBBU1MyKSB8fCBTSUJZVEVfSERSX0ZFQVRVUkUoMTEyeCwgUEFTUzEpCisjaWYgU0lCWVRFX0hEUl9GRUFUVVJFKDEyNTAsIFBBU1MyKSB8fCBTSUJZVEVfSERSX0ZFQVRVUkUoMTEyeCwgUEFTUzEpIHx8IFNJQllURV9IRFJfRkVBVFVSRV9DSElQKDE0ODApCiAjZGVmaW5lIE1fTUFDX1RYX1dSX1RIUlNIICAgICAgICAgICBfU0JfTUFLRU1BU0soNyxTX01BQ19UWF9XUl9USFJTSCkKLSNlbmRpZiAvKiAxMjUwIFBBU1MyIHx8IDExMnggUEFTUzEgKi8KKyNlbmRpZiAvKiAxMjUwIFBBU1MyIHx8IDExMnggUEFTUzEgfHwgMTQ4MCAqLwogI2RlZmluZSBWX01BQ19UWF9XUl9USFJTSCh4KSAgICAgICAgX1NCX01BS0VWQUxVRSh4LFNfTUFDX1RYX1dSX1RIUlNIKQogI2RlZmluZSBHX01BQ19UWF9XUl9USFJTSCh4KSAgICAgICAgX1NCX0dFVFZBTFVFKHgsU19NQUNfVFhfV1JfVEhSU0gsTV9NQUNfVFhfV1JfVEhSU0gpCiAKQEAgLTIzNCw5ICsyMzQsOSBAQAogLyogWFhYOiBDYW4ndCBlbmFibGUsIGFzIGl0IGhhcyB0aGUgc2FtZSBuYW1lIGFzIGEgcGFzczIrIGRlZmluZSBiZWxvdy4gICovCiAvKiAjZGVmaW5lIE1fTUFDX1RYX1JEX1RIUlNIICAgICAgICAgICBfU0JfTUFLRU1BU0soNixTX01BQ19UWF9SRF9USFJTSCkgKi8KICNlbmRpZiAvKiB1cCB0byAxMjUwIFBBU1MxICovCi0jaWYgU0lCWVRFX0hEUl9GRUFUVVJFKDEyNTAsIFBBU1MyKSB8fCBTSUJZVEVfSERSX0ZFQVRVUkUoMTEyeCwgUEFTUzEpCisjaWYgU0lCWVRFX0hEUl9GRUFUVVJFKDEyNTAsIFBBU1MyKSB8fCBTSUJZVEVfSERSX0ZFQVRVUkUoMTEyeCwgUEFTUzEpIHx8IFNJQllURV9IRFJfRkVBVFVSRV9DSElQKDE0ODApCiAjZGVmaW5lIE1fTUFDX1RYX1JEX1RIUlNIICAgICAgICAgICBfU0JfTUFLRU1BU0soNyxTX01BQ19UWF9SRF9USFJTSCkKLSNlbmRpZiAvKiAxMjUwIFBBU1MyIHx8IDExMnggUEFTUzEgKi8KKyNlbmRpZiAvKiAxMjUwIFBBU1MyIHx8IDExMnggUEFTUzEgfHwgMTQ4MCAqLwogI2RlZmluZSBWX01BQ19UWF9SRF9USFJTSCh4KSAgICAgICAgX1NCX01BS0VWQUxVRSh4LFNfTUFDX1RYX1JEX1RIUlNIKQogI2RlZmluZSBHX01BQ19UWF9SRF9USFJTSCh4KSAgICAgICAgX1NCX0dFVFZBTFVFKHgsU19NQUNfVFhfUkRfVEhSU0gsTV9NQUNfVFhfUkRfVEhSU0gpCiAKQEAgLTI2MCwxMiArMjYwLDEyIEBACiAjZGVmaW5lIFZfTUFDX1JYX1JMX1RIUlNIKHgpICAgICAgICBfU0JfTUFLRVZBTFVFKHgsU19NQUNfUlhfUkxfVEhSU0gpCiAjZGVmaW5lIEdfTUFDX1JYX1JMX1RIUlNIKHgpICAgICAgICBfU0JfR0VUVkFMVUUoeCxTX01BQ19SWF9STF9USFJTSCxNX01BQ19SWF9STF9USFJTSCkKIAotI2lmIFNJQllURV9IRFJfRkVBVFVSRSgxMjUwLCBQQVNTMikgfHwgU0lCWVRFX0hEUl9GRUFUVVJFKDExMngsIFBBU1MxKQorI2lmIFNJQllURV9IRFJfRkVBVFVSRSgxMjUwLCBQQVNTMikgfHwgU0lCWVRFX0hEUl9GRUFUVVJFKDExMngsIFBBU1MxKSB8fCBTSUJZVEVfSERSX0ZFQVRVUkVfQ0hJUCgxNDgwKQogI2RlZmluZSBTX01BQ19FTkNfRkNfVEhSU0ggICAgICAgICAgIF9TQl9NQUtFNjQoNTYpCiAjZGVmaW5lIE1fTUFDX0VOQ19GQ19USFJTSCAgICAgICAgICAgX1NCX01BS0VNQVNLKDYsU19NQUNfRU5DX0ZDX1RIUlNIKQogI2RlZmluZSBWX01BQ19FTkNfRkNfVEhSU0goeCkgICAgICAgIF9TQl9NQUtFVkFMVUUoeCxTX01BQ19FTkNfRkNfVEhSU0gpCiAjZGVmaW5lIEdfTUFDX0VOQ19GQ19USFJTSCh4KSAgICAgICAgX1NCX0dFVFZBTFVFKHgsU19NQUNfRU5DX0ZDX1RIUlNILE1fTUFDX0VOQ19GQ19USFJTSCkKLSNlbmRpZiAvKiAxMjUwIFBBU1MyIHx8IDExMnggUEFTUzEgKi8KKyNlbmRpZiAvKiAxMjUwIFBBU1MyIHx8IDExMnggUEFTUzEgfHwgMTQ4MCAqLwogCiAvKgogICogTUFDIEZyYW1lIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXJzIChUYWJsZSA5LTE1KQpAQCAtNDYyLDkgKzQ2Miw5IEBACiAjZGVmaW5lIE1fTUFDX0xUQ09MX0VSUiAgICAgICAgICAgICBfU0JfTUFLRU1BU0sxKDQ0KQogI2RlZmluZSBNX01BQ19FWENPTF9FUlIgICAgICAgICAgICAgX1NCX01BS0VNQVNLMSg0NSkKICNkZWZpbmUgTV9NQUNfQ05UUl9PVlJGTF9FUlIgICAgICAgIF9TQl9NQUtFTUFTSzEoNDYpCi0jaWYgU0lCWVRFX0hEUl9GRUFUVVJFKDEyNTAsIFBBU1MyKSB8fCBTSUJZVEVfSERSX0ZFQVRVUkUoMTEyeCwgUEFTUzEpCisjaWYgU0lCWVRFX0hEUl9GRUFUVVJFKDEyNTAsIFBBU1MyKSB8fCBTSUJZVEVfSERSX0ZFQVRVUkUoMTEyeCwgUEFTUzEpIHx8IFNJQllURV9IRFJfRkVBVFVSRV9DSElQKDE0ODApCiAjZGVmaW5lIE1fTUFDX1NQTElUX0VOCQkgICAgX1NCX01BS0VNQVNLMSg0NykgCS8qIGludGVycnVwdCBtYXNrIG9ubHkgKi8KLSNlbmRpZiAvKiAxMjUwIFBBU1MyIHx8IDExMnggUEFTUzEgKi8KKyNlbmRpZiAvKiAxMjUwIFBBU1MyIHx8IDExMnggUEFTUzEgfHwgMTQ4MCAqLwogCiAjZGVmaW5lIFNfTUFDX0NPVU5URVJfQUREUiAgICAgICAgICBfU0JfTUFLRTY0KDQ3KQogI2RlZmluZSBNX01BQ19DT1VOVEVSX0FERFIgICAgICAgICAgX1NCX01BS0VNQVNLKDUsU19NQUNfQ09VTlRFUl9BRERSKQpAQCAtNTk4LDkgKzU5OCw5IEBACiAjZGVmaW5lIE1fTUFDX01DQVNUX0lOViAgICAgICAgIF9TQl9NQUtFTUFTSzEoNCkKICNkZWZpbmUgTV9NQUNfQkNBU1RfRU4gICAgICAgICAgX1NCX01BS0VNQVNLMSg1KQogI2RlZmluZSBNX01BQ19ESVJFQ1RfSU5WICAgICAgICBfU0JfTUFLRU1BU0sxKDYpCi0jaWYgU0lCWVRFX0hEUl9GRUFUVVJFKDEyNTAsIFBBU1MyKSB8fCBTSUJZVEVfSERSX0ZFQVRVUkUoMTEyeCwgUEFTUzEpCisjaWYgU0lCWVRFX0hEUl9GRUFUVVJFKDEyNTAsIFBBU1MyKSB8fCBTSUJZVEVfSERSX0ZFQVRVUkUoMTEyeCwgUEFTUzEpIHx8IFNJQllURV9IRFJfRkVBVFVSRV9DSElQKDE0ODApCiAjZGVmaW5lIE1fTUFDX0FMTE1DQVNUX0VOCV9TQl9NQUtFTUFTSzEoNykKLSNlbmRpZiAvKiAxMjUwIFBBU1MyIHx8IDExMnggUEFTUzEgKi8KKyNlbmRpZiAvKiAxMjUwIFBBU1MyIHx8IDExMnggUEFTUzEgfHwgMTQ4MCAqLwogCiAjZGVmaW5lIFNfTUFDX0lQSERSX09GRlNFVCAgICAgIF9TQl9NQUtFNjQoOCkKICNkZWZpbmUgTV9NQUNfSVBIRFJfT0ZGU0VUICAgICAgX1NCX01BS0VNQVNLKDgsU19NQUNfSVBIRFJfT0ZGU0VUKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvc2IxMjUwX21jLmggYi9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9zYjEyNTBfbWMuaAppbmRleCAyNmU0MjE0OS4uNGZlODQ4ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvc2IxMjUwX21jLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvc2IxMjUwX21jLmgKQEAgLTI5NSw3ICsyOTUsNyBAQAogCiAjaWYgU0lCWVRFX0hEUl9GRUFUVVJFKDEyNTAsIFBBU1MzKSB8fCBTSUJZVEVfSERSX0ZFQVRVUkUoMTEyeCwgUEFTUzEpCiAjZGVmaW5lIE1fTUNfUFJFX09OX0E4ICAgICAgICAgICAgICBfU0JfTUFLRU1BU0sxKDM2KQotI2RlZmluZSBNX01DX1JBTV9XSVRIX0ExMyAgICAgICAgICAgX1NCX01BS0VNQVNLMSgzOCkKKyNkZWZpbmUgTV9NQ19SQU1fV0lUSF9BMTMgICAgICAgICAgIF9TQl9NQUtFTUFTSzEoMzcpCiAjZW5kaWYgLyogMTI1MCBQQVNTMyB8fCAxMTJ4IFBBU1MxICovCiAKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvc2IxMjUwX3JlZ3MuaCBiL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL3NiMTI1MF9yZWdzLmgKaW5kZXggYmFiM2E0NS4uZGE3YzE4OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvc2IxMjUwX3JlZ3MuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9zYjEyNTBfcmVncy5oCkBAIC0xMzEsNiArMTMxLDcgQEAKIAogI2VuZGlmCiAKKwogLyogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICogUENJIEludGVyZmFjZSBSZWdpc3RlcnMKICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KQEAgLTIzOSwxNCArMjQwLDE0IEBACiAjZGVmaW5lIFJfTUFDX1ZMQU5UQUcgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExMAogI2RlZmluZSBSX01BQ19GUkFNRUNGRyAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMTgKICNkZWZpbmUgUl9NQUNfRU9QQ05UICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTIwCi0jZGVmaW5lIFJfTUFDX0ZJRk9fUFRSUyAgICAgICAgICAgICAgICAgMHgwMDAwMDEzMAorI2RlZmluZSBSX01BQ19GSUZPX1BUUlMgICAgICAgICAgICAgICAgIDB4MDAwMDAxMjgKICNkZWZpbmUgUl9NQUNfQURGSUxURVJfQ0ZHICAgICAgICAgICAgICAweDAwMDAwMjAwCiAjZGVmaW5lIFJfTUFDX0VUSEVSTkVUX0FERFIgICAgICAgICAgICAgMHgwMDAwMDIwOAogI2RlZmluZSBSX01BQ19QS1RfVFlQRSAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMTAKLSNpZiBTSUJZVEVfSERSX0ZFQVRVUkUoMTI1MCwgUEFTUzMpIHx8IFNJQllURV9IRFJfRkVBVFVSRSgxMTJ4LCBQQVNTMSkKKyNpZiBTSUJZVEVfSERSX0ZFQVRVUkUoMTI1MCwgUEFTUzMpIHx8IFNJQllURV9IRFJfRkVBVFVSRSgxMTJ4LCBQQVNTMSkgfHwgU0lCWVRFX0hEUl9GRUFUVVJFX0NISVAoMTQ4MCkKICNkZWZpbmUgUl9NQUNfQURNQVNLMAkJCTB4MDAwMDAyMTgKICNkZWZpbmUgUl9NQUNfQURNQVNLMQkJCTB4MDAwMDAyMjAKLSNlbmRpZiAvKiAxMjUwIFBBU1MzIHx8IDExMnggUEFTUzEgKi8KKyNlbmRpZiAvKiAxMjUwIFBBU1MzIHx8IDExMnggUEFTUzEgfHwgMTQ4MCAqLwogI2RlZmluZSBSX01BQ19IQVNIX0JBU0UgICAgICAgICAgICAgICAgIDB4MDAwMDAyNDAKICNkZWZpbmUgUl9NQUNfQUREUl9CQVNFICAgICAgICAgICAgICAgICAweDAwMDAwMjgwCiAjZGVmaW5lIFJfTUFDX0NITE8wX0JBU0UgICAgICAgICAgICAgICAgMHgwMDAwMDMwMApAQCAtMjU2LDkgKzI1Nyw5IEBACiAjZGVmaW5lIFJfTUFDX0lOVF9NQVNLICAgICAgICAgICAgICAgICAgMHgwMDAwMDQxMAogI2RlZmluZSBSX01BQ19UWERfQ1RMICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MjAKICNkZWZpbmUgUl9NQUNfTURJTyAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDI4Ci0jaWYgU0lCWVRFX0hEUl9GRUFUVVJFKDEyNTAsIFBBU1MyKSB8fCBTSUJZVEVfSERSX0ZFQVRVUkUoMTEyeCwgUEFTUzEpCisjaWYgU0lCWVRFX0hEUl9GRUFUVVJFKDEyNTAsIFBBU1MyKSB8fCBTSUJZVEVfSERSX0ZFQVRVUkUoMTEyeCwgUEFTUzEpIHx8IFNJQllURV9IRFJfRkVBVFVSRV9DSElQKDE0ODApCiAjZGVmaW5lIFJfTUFDX1NUQVRVUzEJCSAgICAgICAgMHgwMDAwMDQzMAotI2VuZGlmIC8qIDEyNTAgUEFTUzIgfHwgMTEyeCBQQVNTMSAqLworI2VuZGlmIC8qIDEyNTAgUEFTUzIgfHwgMTEyeCBQQVNTMSB8fCAxNDgwICovCiAjZGVmaW5lIFJfTUFDX0RFQlVHX1NUQVRVUyAgICAgICAgICAgICAgMHgwMDAwMDQ0OAogCiAjZGVmaW5lIE1BQ19IQVNIX0NPVU5UCQkJOApAQCAtMjg5LDExICsyOTAsMTEgQEAKICNkZWZpbmUgUl9EVUFSVF9SWF9IT0xEICAgICAgICAgICAgIDB4MTYwCiAjZGVmaW5lIFJfRFVBUlRfVFhfSE9MRCAgICAgICAgICAgICAweDE3MAogCi0jaWYgU0lCWVRFX0hEUl9GRUFUVVJFKDEyNTAsIFBBU1MyKSB8fCBTSUJZVEVfSERSX0ZFQVRVUkUoMTEyeCwgUEFTUzEpCisjaWYgU0lCWVRFX0hEUl9GRUFUVVJFKDEyNTAsIFBBU1MyKSB8fCBTSUJZVEVfSERSX0ZFQVRVUkUoMTEyeCwgUEFTUzEpIHx8IFNJQllURV9IRFJfRkVBVFVSRV9DSElQKDE0ODApCiAjZGVmaW5lIFJfRFVBUlRfRlVMTF9DVEwJICAgIDB4MTQwCiAjZGVmaW5lIFJfRFVBUlRfT1BDUl9YCQkgICAgMHgxODAKICNkZWZpbmUgUl9EVUFSVF9BVVhDVExfWAkgICAgMHgxOTAKLSNlbmRpZiAvKiAxMjUwIFBBU1MyIHx8IDExMnggUEFTUzEgKi8KKyNlbmRpZiAvKiAxMjUwIFBBU1MyIHx8IDExMnggUEFTUzEgfHwgMTQ4MCovCiAKIAogLyoKQEAgLTMwOCw2ICszMDksNyBAQAogI2RlZmluZSBSX0RVQVJUX0lNUl9CICAgICAgICAgICAgICAgMHgzNTAKICNkZWZpbmUgUl9EVUFSVF9PVVRfUE9SVCAgICAgICAgICAgIDB4MzYwCiAjZGVmaW5lIFJfRFVBUlRfT1BDUiAgICAgICAgICAgICAgICAweDM3MAorI2RlZmluZSBSX0RVQVJUX0lOX1BPUlQgICAgICAgICAgICAgMHgzODAKIAogI2RlZmluZSBSX0RVQVJUX1NFVF9PUFIJCSAgICAweDNCMAogI2RlZmluZSBSX0RVQVJUX0NMRUFSX09QUgkgICAgMHgzQzAKQEAgLTY4NSwxMiArNjg3LDE3IEBACiAjZGVmaW5lIEFfQUREUl9UUkFQX1JFR19ERUJVRwkgICAgMHgwMDEwMDIwNDYwCiAjZW5kaWYgLyogMTI1MCBQQVNTMiB8fCAxMTJ4IFBBU1MxIHx8IDE0ODAgKi8KIAorI2RlZmluZSBBRERSX1RSQVBfU1BBQ0lORyA4CisjZGVmaW5lIE5VTV9BRERSX1RSQVAgNAorI2RlZmluZSBBX0FERFJfVFJBUF9VUChuKSAoQV9BRERSX1RSQVBfVVBfMCArICgobikgKiBBRERSX1RSQVBfU1BBQ0lORykpCisjZGVmaW5lIEFfQUREUl9UUkFQX0RPV04obikgKEFfQUREUl9UUkFQX0RPV05fMCArICgobikgKiBBRERSX1RSQVBfU1BBQ0lORykpCisjZGVmaW5lIEFfQUREUl9UUkFQX0NGRyhuKSAoQV9BRERSX1RSQVBfQ0ZHXzAgKyAoKG4pICogQUREUl9UUkFQX1NQQUNJTkcpKQorCiAKIC8qICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAqIFN5c3RlbSBJbnRlcnJ1cHQgTWFwcGVyIFJlZ2lzdGVycwogICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwogCi0jaWYgU0lCWVRFX0hEUl9GRUFUVVJFXzEyNTBfMTEyeAogI2RlZmluZSBBX0lNUl9DUFUwX0JBU0UgICAgICAgICAgICAgICAgIDB4MDAxMDAyMDAwMAogI2RlZmluZSBBX0lNUl9DUFUxX0JBU0UgICAgICAgICAgICAgICAgIDB4MDAxMDAyMjAwMAogI2RlZmluZSBJTVJfUkVHSVNURVJfU1BBQ0lORyAgICAgICAgICAgIDB4MjAwMApAQCAtNzAwLDYgKzcwNyw3IEBACiAjZGVmaW5lIEFfSU1SX1JFR0lTVEVSKGNwdSxyZWcpIChBX0lNUl9NQVBQRVIoY3B1KSsocmVnKSkKIAogI2RlZmluZSBSX0lNUl9JTlRFUlJVUFRfRElBRyAgICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBSX0lNUl9JTlRFUlJVUFRfTERUICAgICAgICAgICAgIDB4MDAxOAogI2RlZmluZSBSX0lNUl9JTlRFUlJVUFRfTUFTSyAgICAgICAgICAgIDB4MDAyOAogI2RlZmluZSBSX0lNUl9JTlRFUlJVUFRfVFJBQ0UgICAgICAgICAgIDB4MDAzOAogI2RlZmluZSBSX0lNUl9JTlRFUlJVUFRfU09VUkNFX1NUQVRVUyAgIDB4MDA0MApAQCAtNzE1LDcgKzcyMywxNCBAQAogI2RlZmluZSBSX0lNUl9JTlRFUlJVUFRfU1RBVFVTX0NPVU5UICAgIDcKICNkZWZpbmUgUl9JTVJfSU5URVJSVVBUX01BUF9CQVNFICAgICAgICAweDAyMDAKICNkZWZpbmUgUl9JTVJfSU5URVJSVVBUX01BUF9DT1VOVCAgICAgICA2NAotI2VuZGlmCS8qIDEyNTAvMTEyeCAqLworCisvKgorICogdGhlc2UgbWFjcm9zIHdvcmsgdG9nZXRoZXIgdG8gYnVpbGQgdGhlIGFkZHJlc3Mgb2YgYSBtYWlsYm94CisgKiByZWdpc3RlciwgZS5nLiwgQV9NQUlMQk9YX1JFR0lTVEVSKFJfSU1SX01BSUxCT1hfU0VUX0NQVSwxKQorICogZm9yIG1ib3hfMF9zZXRfY3B1MiByZXR1cm5zIDB4MDAxMDAyNDBDOAorICovCisjZGVmaW5lIEFfTUFJTEJPWF9SRUdJU1RFUihyZWcsY3B1KSBcCisgICAgKEFfSU1SX0NQVTBfQkFTRSArIChjcHUgKiBJTVJfUkVHSVNURVJfU1BBQ0lORykgKyByZWcpCiAKIC8qICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAqIFN5c3RlbSBQZXJmb3JtYW5jZSBDb3VudGVyIFJlZ2lzdGVycwpAQCAtNzI3LDYgKzc0MiwxMCBAQAogI2RlZmluZSBBX1NDRF9QRVJGX0NOVF8yICAgICAgICAgICAgMHgwMDEwMDIwNEUwCiAjZGVmaW5lIEFfU0NEX1BFUkZfQ05UXzMgICAgICAgICAgICAweDAwMTAwMjA0RTgKIAorI2RlZmluZSBTQ0RfTlVNX1BFUkZfQ05UIDQKKyNkZWZpbmUgU0NEX1BFUkZfQ05UX1NQQUNJTkcgOAorI2RlZmluZSBBX1NDRF9QRVJGX0NOVChuKSAoQV9TQ0RfUEVSRl9DTlRfMCsobipTQ0RfUEVSRl9DTlRfU1BBQ0lORykpCisKIC8qICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAqIFN5c3RlbSBCdXMgV2F0Y2hlciBSZWdpc3RlcnMKICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KQEAgLTc3Miw2ICs3OTEsMTUgQEAKICNkZWZpbmUgQV9TQ0RfVFJBQ0VfU0VRVUVOQ0VfNiAgICAgIDB4MDAxMDAyMEE5MAogI2RlZmluZSBBX1NDRF9UUkFDRV9TRVFVRU5DRV83ICAgICAgMHgwMDEwMDIwQTk4CiAKKyNkZWZpbmUgVFJBQ0VfUkVHSVNURVJfU1BBQ0lORyA4CisjZGVmaW5lIFRSQUNFX05VTV9SRUdJU1RFUlMgICAgOAorI2RlZmluZSBBX1NDRF9UUkFDRV9FVkVOVChuKSAoKChuKSAmIDQpID8gXAorICAgKEFfU0NEX1RSQUNFX0VWRU5UXzQgKyAoKChuKSAmIDMpICogVFJBQ0VfUkVHSVNURVJfU1BBQ0lORykpIDogXAorICAgKEFfU0NEX1RSQUNFX0VWRU5UXzAgKyAoKG4pICogVFJBQ0VfUkVHSVNURVJfU1BBQ0lORykpKQorI2RlZmluZSBBX1NDRF9UUkFDRV9TRVFVRU5DRShuKSAoKChuKSAmIDQpID8gXAorICAgKEFfU0NEX1RSQUNFX1NFUVVFTkNFXzQgKyAoKChuKSAmIDMpICogVFJBQ0VfUkVHSVNURVJfU1BBQ0lORykpIDogXAorICAgKEFfU0NEX1RSQUNFX1NFUVVFTkNFXzAgKyAoKG4pICogVFJBQ0VfUkVHSVNURVJfU1BBQ0lORykpKQorCiAvKiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgKiBTeXN0ZW0gR2VuZXJpYyBETUEgUmVnaXN0ZXJzCiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9zYjEyNTBfc2NkLmggYi9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9zYjEyNTBfc2NkLmgKaW5kZXggYjZhN2Q4Zi4uOWVhM2RhMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvc2IxMjUwX3NjZC5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL3NiMTI1MF9zY2QuaApAQCAtMTAsNyArMTAsNyBAQAogICAgICoKICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAqCi0gICAgKiAgQ29weXJpZ2h0IDIwMDAsMjAwMSwyMDAyLDIwMDMKKyAgICAqICBDb3B5cmlnaHQgMjAwMCwyMDAxLDIwMDIsMjAwMywyMDA0LDIwMDUKICAgICAqICBCcm9hZGNvbSBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgICAqCiAgICAgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgpAQCAtMTUwLDcgKzE1MCw3IEBACiAgKiAoRm9yIHRoZSBhc3NlbWJsZXIgdmVyc2lvbiwgc3lzcmV2IGFuZCBkZXN0IG1heSBiZSB0aGUgc2FtZSByZWdpc3Rlci4KICAqIEFsc28sIGl0IGNsb2JiZXJzIEFULikKICAqLwotI2lmZGVmIF9fQVNTRU1CTFlfXworI2lmZGVmIF9fQVNTRU1CTEVSX18KICNkZWZpbmUgU1lTX1NPQ19UWVBFKGRlc3QsIHN5c3JldikJCQkJCVwKIAkuc2V0IHB1c2ggOwkJCQkJCQlcCiAJLnNldCByZW9yZGVyIDsJCQkJCQkJXApAQCAtMjE0LDYgKzIxNCw3IEBACiAjZGVmaW5lIEdfU1lTX1lQT1MoeCkgICAgICAgICAgICAgX1NCX0dFVFZBTFVFKHgsU19TWVNfWVBPUyxNX1NZU19ZUE9TKQogI2VuZGlmCiAKKwogLyoKICAqIFN5c3RlbSBDb25maWcgUmVnaXN0ZXIgKFRhYmxlIDQtMikKICAqIFJlZ2lzdGVyOiBTQ0RfU1lTVEVNX0NGRwpAQCAtMzYwLDEzICszNjEsMTMgQEAKICAqLwogCiAjZGVmaW5lIFZfU0NEX1RJTUVSX0ZSRVEgICAgICAgICAgICAxMDAwMDAwCi0jZGVmaW5lIFZfU0NEX1RJTUVSX1dJRFRIICAgICAgICAgICAyMwogCiAjZGVmaW5lIFNfU0NEX1RJTUVSX0lOSVQgICAgICAgICAgICAwCi0jZGVmaW5lIE1fU0NEX1RJTUVSX0lOSVQgICAgICAgICAgICBfU0JfTUFLRU1BU0soVl9TQ0RfVElNRVJfV0lEVEgsU19TQ0RfVElNRVJfSU5JVCkKKyNkZWZpbmUgTV9TQ0RfVElNRVJfSU5JVCAgICAgICAgICAgIF9TQl9NQUtFTUFTSygyMyxTX1NDRF9USU1FUl9JTklUKQogI2RlZmluZSBWX1NDRF9USU1FUl9JTklUKHgpICAgICAgICAgX1NCX01BS0VWQUxVRSh4LFNfU0NEX1RJTUVSX0lOSVQpCiAjZGVmaW5lIEdfU0NEX1RJTUVSX0lOSVQoeCkgICAgICAgICBfU0JfR0VUVkFMVUUoeCxTX1NDRF9USU1FUl9JTklULE1fU0NEX1RJTUVSX0lOSVQpCiAKKyNkZWZpbmUgVl9TQ0RfVElNRVJfV0lEVEgJICAgIDIzCiAjZGVmaW5lIFNfU0NEX1RJTUVSX0NOVCAgICAgICAgICAgICAwCiAjZGVmaW5lIE1fU0NEX1RJTUVSX0NOVCAgICAgICAgICAgICBfU0JfTUFLRU1BU0soVl9TQ0RfVElNRVJfV0lEVEgsU19TQ0RfVElNRVJfQ05UKQogI2RlZmluZSBWX1NDRF9USU1FUl9DTlQoeCkgICAgICAgICBfU0JfTUFLRVZBTFVFKHgsU19TQ0RfVElNRVJfQ05UKQpAQCAtMzgwLDcgKzM4MSw2IEBACiAgKiBTeXN0ZW0gUGVyZm9ybWFuY2UgQ291bnRlcnMKICAqLwogCi0jaWYgU0lCWVRFX0hEUl9GRUFUVVJFXzEyNTBfMTEyeAogI2RlZmluZSBTX1NQQ19DRkdfU1JDMCAgICAgICAgICAgIDAKICNkZWZpbmUgTV9TUENfQ0ZHX1NSQzAgICAgICAgICAgICBfU0JfTUFLRU1BU0soOCxTX1NQQ19DRkdfU1JDMCkKICNkZWZpbmUgVl9TUENfQ0ZHX1NSQzAoeCkgICAgICAgICBfU0JfTUFLRVZBTFVFKHgsU19TUENfQ0ZHX1NSQzApCkBAIC00MDEsNiArNDAxLDcgQEAKICNkZWZpbmUgVl9TUENfQ0ZHX1NSQzMoeCkgICAgICAgICBfU0JfTUFLRVZBTFVFKHgsU19TUENfQ0ZHX1NSQzMpCiAjZGVmaW5lIEdfU1BDX0NGR19TUkMzKHgpICAgICAgICAgX1NCX0dFVFZBTFVFKHgsU19TUENfQ0ZHX1NSQzMsTV9TUENfQ0ZHX1NSQzMpCiAKKyNpZiBTSUJZVEVfSERSX0ZFQVRVUkVfMTI1MF8xMTJ4CiAjZGVmaW5lIE1fU1BDX0NGR19DTEVBUgkJX1NCX01BS0VNQVNLMSgzMikKICNkZWZpbmUgTV9TUENfQ0ZHX0VOQUJMRQlfU0JfTUFLRU1BU0sxKDMzKQogI2VuZGlmCkBAIC01MTYsOCArNTE3LDYgQEAKICAqIFRyYWNlIEJ1ZmZlciBDb25maWcgcmVnaXN0ZXIKICAqLwogCi0jaWYgU0lCWVRFX0hEUl9GRUFUVVJFXzEyNTBfMTEyeAotCiAjZGVmaW5lIE1fU0NEX1RSQUNFX0NGR19SRVNFVCAgICAgICAgICAgX1NCX01BS0VNQVNLMSgwKQogI2RlZmluZSBNX1NDRF9UUkFDRV9DRkdfU1RBUlRfUkVBRCAgICAgIF9TQl9NQUtFTUFTSzEoMSkKICNkZWZpbmUgTV9TQ0RfVFJBQ0VfQ0ZHX1NUQVJUICAgICAgICAgICBfU0JfTUFLRU1BU0sxKDIpCkBAIC01MjYsMTcgKzUyNSwyNiBAQAogI2RlZmluZSBNX1NDRF9UUkFDRV9DRkdfRlJFRVpFX0ZVTEwgICAgIF9TQl9NQUtFTUFTSzEoNSkKICNkZWZpbmUgTV9TQ0RfVFJBQ0VfQ0ZHX0RFQlVHX0ZVTEwgICAgICBfU0JfTUFLRU1BU0sxKDYpCiAjZGVmaW5lIE1fU0NEX1RSQUNFX0NGR19GVUxMICAgICAgICAgICAgX1NCX01BS0VNQVNLMSg3KQotI2lmIFNJQllURV9IRFJfRkVBVFVSRSgxMjUwLCBQQVNTMikgfHwgU0lCWVRFX0hEUl9GRUFUVVJFKDExMngsIFBBU1MxKQorI2lmIFNJQllURV9IRFJfRkVBVFVSRSgxMjUwLCBQQVNTMikgfHwgU0lCWVRFX0hEUl9GRUFUVVJFKDExMngsIFBBU1MxKSB8fCBTSUJZVEVfSERSX0ZFQVRVUkVfQ0hJUCgxNDgwKQogI2RlZmluZSBNX1NDRF9UUkFDRV9DRkdfRk9SQ0VDTlQgICAgICAgIF9TQl9NQUtFTUFTSzEoOCkKLSNlbmRpZiAvKiAxMjUwIFBBU1MyIHx8IDExMnggUEFTUzEgKi8KKyNlbmRpZiAvKiAxMjUwIFBBU1MyIHx8IDExMnggUEFTUzEgfHwgMTQ4MCAqLwogCisvKgorICogVGhpcyBmaWVsZCBpcyB0aGUgc2FtZSBvbiB0aGUgMTI1MC8xMTJ4IGFuZCAxNDgwLCBqdXN0IGxvY2F0ZWQgaW4KKyAqIGEgc2xpZ2h0bHkgZGlmZmVyZW50IHBsYWNlIGluIHRoZSByZWdpc3Rlci4KKyAqLworI2lmIFNJQllURV9IRFJfRkVBVFVSRV8xMjUwXzExMngKICNkZWZpbmUgU19TQ0RfVFJBQ0VfQ0ZHX0NVUl9BRERSICAgICAgICAxMAorI2Vsc2UKKyNpZiBTSUJZVEVfSERSX0ZFQVRVUkVfQ0hJUCgxNDgwKQorI2RlZmluZSBTX1NDRF9UUkFDRV9DRkdfQ1VSX0FERFIgICAgICAgIDI0CisjZW5kaWYJLyogMTQ4MCAqLworI2VuZGlmICAvKiAxMjUwLzExMnggKi8KKwogI2RlZmluZSBNX1NDRF9UUkFDRV9DRkdfQ1VSX0FERFIgICAgICAgIF9TQl9NQUtFTUFTSyg4LFNfU0NEX1RSQUNFX0NGR19DVVJfQUREUikKICNkZWZpbmUgVl9TQ0RfVFJBQ0VfQ0ZHX0NVUl9BRERSKHgpICAgICBfU0JfTUFLRVZBTFVFKHgsU19TQ0RfVFJBQ0VfQ0ZHX0NVUl9BRERSKQogI2RlZmluZSBHX1NDRF9UUkFDRV9DRkdfQ1VSX0FERFIoeCkgICAgIF9TQl9HRVRWQUxVRSh4LFNfU0NEX1RSQUNFX0NGR19DVVJfQUREUixNX1NDRF9UUkFDRV9DRkdfQ1VSX0FERFIpCiAKLSNlbmRpZgkvKiAxMjUwLzExMnggKi8KLQogLyoKICAqIFRyYWNlIEV2ZW50IHJlZ2lzdGVycwogICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9zd2FybS5oIGIvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvc3dhcm0uaAppbmRleCA4NmRiMzdlLi41NDA4NjVmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9zd2FybS5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL3N3YXJtLmgKQEAgLTMyLDYgKzMyLDE4IEBACiAjZGVmaW5lIFNJQllURV9IQVZFX0lERSAgICAxCiAjZGVmaW5lIFNJQllURV9ERUZBVUxUX0NPTlNPTEUgInR0eVMwLDExNTIwMCIKICNlbmRpZgorI2lmZGVmIENPTkZJR19TSUJZVEVfUFQxMTIwCisjZGVmaW5lIFNJQllURV9CT0FSRF9OQU1FICJQVDExMjAiCisjZGVmaW5lIFNJQllURV9IQVZFX1BDTUNJQSAxCisjZGVmaW5lIFNJQllURV9IQVZFX0lERSAgICAxCisjZGVmaW5lIFNJQllURV9ERUZBVUxUX0NPTlNPTEUgInR0eVMwLDExNTIwMCIKKyNlbmRpZgorI2lmZGVmIENPTkZJR19TSUJZVEVfUFQxMTI1CisjZGVmaW5lIFNJQllURV9CT0FSRF9OQU1FICJQVDExMjUiCisjZGVmaW5lIFNJQllURV9IQVZFX1BDTUNJQSAxCisjZGVmaW5lIFNJQllURV9IQVZFX0lERSAgICAxCisjZGVmaW5lIFNJQllURV9ERUZBVUxUX0NPTlNPTEUgInR0eVMwLDExNTIwMCIKKyNlbmRpZgogI2lmZGVmIENPTkZJR19TSUJZVEVfTElUVExFU1VSCiAjZGVmaW5lIFNJQllURV9CT0FSRF9OQU1FICJCQ005MTI1MEMyIChMaXR0bGVTdXIpIgogI2RlZmluZSBTSUJZVEVfSEFWRV9QQ01DSUEgMApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9zb2NrZXQuaCBiL2luY2x1ZGUvYXNtLW1pcHMvc29ja2V0LmgKaW5kZXggMzZlYmU0ZS4uOTU5NDU2OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9zb2NrZXQuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL3NvY2tldC5oCkBAIC03MCw2ICs3MCw4IEBACiAjZGVmaW5lIFNPX1NOREJVRkZPUkNFCQkzMQogI2RlZmluZSBTT19SQ1ZCVUZGT1JDRQkJMzMKICNkZWZpbmUgU09fUEFTU1NFQwkJMzQKKyNkZWZpbmUgU09fVElNRVNUQU1QTlMJCTM1CisjZGVmaW5lIFNDTV9USU1FU1RBTVBOUwkJU09fVElNRVNUQU1QTlMKIAogI2lmZGVmIF9fS0VSTkVMX18KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9zb2NraW9zLmggYi9pbmNsdWRlL2FzbS1taXBzL3NvY2tpb3MuaAppbmRleCA4N2E1MGJmLi5lZDFhNWY3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL3NvY2tpb3MuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL3NvY2tpb3MuaApAQCAtMjAsNiArMjAsNyBAQAogI2RlZmluZSBTSU9DU1BHUlAJX0lPVygncycsIDgsIHBpZF90KQogI2RlZmluZSBTSU9DR1BHUlAJX0lPUigncycsIDksIHBpZF90KQogCi0jZGVmaW5lIFNJT0NHU1RBTVAJMHg4OTA2CQkJLyogR2V0IHN0YW1wIC0gbGludXgtc3BlY2lmaWMgKi8KKyNkZWZpbmUgU0lPQ0dTVEFNUAkweDg5MDYJCS8qIEdldCBzdGFtcCAodGltZXZhbCkgKi8KKyNkZWZpbmUgU0lPQ0dTVEFNUE5TCTB4ODkwNwkJLyogR2V0IHN0YW1wICh0aW1lc3BlYykgKi8KIAogI2VuZGlmIC8qIF9BU01fU09DS0lPU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wYXJpc2Mvc29ja2V0LmggYi9pbmNsdWRlL2FzbS1wYXJpc2Mvc29ja2V0LmgKaW5kZXggY2UyZWFlMS4uOTllODY4ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcGFyaXNjL3NvY2tldC5oCisrKyBiL2luY2x1ZGUvYXNtLXBhcmlzYy9zb2NrZXQuaApAQCAtMzMsNiArMzMsOCBAQAogI2RlZmluZSBTT19QRUVSQ1JFRAkweDQwMTEKICNkZWZpbmUgU09fVElNRVNUQU1QCTB4NDAxMgogI2RlZmluZSBTQ01fVElNRVNUQU1QCVNPX1RJTUVTVEFNUAorI2RlZmluZSBTT19USU1FU1RBTVBOUwkweDQwMTMKKyNkZWZpbmUgU0NNX1RJTUVTVEFNUE5TCVNPX1RJTUVTVEFNUE5TCiAKIC8qIFNlY3VyaXR5IGxldmVscyAtIGFzIHBlciBOUkwgSVB2NiAtIGRvbid0IGFjdHVhbGx5IGRvIGFueXRoaW5nICovCiAjZGVmaW5lIFNPX1NFQ1VSSVRZX0FVVEhFTlRJQ0FUSU9OCQkweDQwMTYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBhcmlzYy9zb2NraW9zLmggYi9pbmNsdWRlL2FzbS1wYXJpc2Mvc29ja2lvcy5oCmluZGV4IGFhY2U0OTYuLmRhYmZiYzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBhcmlzYy9zb2NraW9zLmgKKysrIGIvaW5jbHVkZS9hc20tcGFyaXNjL3NvY2tpb3MuaApAQCAtNyw2ICs3LDcgQEAKICNkZWZpbmUgRklPR0VUT1dOCTB4ODkwMwogI2RlZmluZSBTSU9DR1BHUlAJMHg4OTA0CiAjZGVmaW5lIFNJT0NBVE1BUksJMHg4OTA1Ci0jZGVmaW5lIFNJT0NHU1RBTVAJMHg4OTA2CQkvKiBHZXQgc3RhbXAgKi8KKyNkZWZpbmUgU0lPQ0dTVEFNUAkweDg5MDYJCS8qIEdldCBzdGFtcCAodGltZXZhbCkgKi8KKyNkZWZpbmUgU0lPQ0dTVEFNUE5TCTB4ODkwNwkJLyogR2V0IHN0YW1wICh0aW1lc3BlYykgKi8KIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2FzbS1jb21wYXQuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvYXNtLWNvbXBhdC5oCmluZGV4IGM4OWJkNTguLmMxOWU3MzYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvYXNtLWNvbXBhdC5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvYXNtLWNvbXBhdC5oCkBAIC03OCw2ICs3OCwxNSBAQAogI2RlZmluZSBQUENfU1RMQ1gJc3RyaW5naWZ5X2luX2Moc3RkY3guKQogI2RlZmluZSBQUENfQ05UTFpMCXN0cmluZ2lmeV9pbl9jKGNudGx6ZCkKIAorLyogTW92ZSB0byBDUiwgc2luZ2xlLWVudHJ5IG9wdGltaXplZCB2ZXJzaW9uLiBPbmx5IGF2YWlsYWJsZQorICogb24gUE9XRVI0IGFuZCBsYXRlci4KKyAqLworI2lmZGVmIENPTkZJR19QT1dFUjRfT05MWQorI2RlZmluZSBQUENfTVRPQ1JGCXN0cmluZ2lmeV9pbl9jKG10b2NyZikKKyNlbHNlCisjZGVmaW5lIFBQQ19NVE9DUkYJc3RyaW5naWZ5X2luX2MobXRjcmYpCisjZW5kaWYKKwogI2Vsc2UgLyogMzItYml0ICovCiAKIC8qIG9wZXJhdGlvbnMgZm9yIGxvbmdzIGFuZCBwb2ludGVycyAqLwpAQCAtODksNiArOTgsNyBAQAogI2RlZmluZSBQUENfTExBUlgJc3RyaW5naWZ5X2luX2MobHdhcngpCiAjZGVmaW5lIFBQQ19TVExDWAlzdHJpbmdpZnlfaW5fYyhzdHdjeC4pCiAjZGVmaW5lIFBQQ19DTlRMWkwJc3RyaW5naWZ5X2luX2MoY250bHp3KQorI2RlZmluZSBQUENfTVRPQ1JGCXN0cmluZ2lmeV9pbl9jKG10Y3JmKQogCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9jYWNoZWZsdXNoLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2NhY2hlZmx1c2guaAppbmRleCAwOGU5M2U3Li5iYTY2N2EzODMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvY2FjaGVmbHVzaC5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvY2FjaGVmbHVzaC5oCkBAIC02NCw2ICs2NCwxMiBAQAogCW1lbWNweShkc3QsIHNyYywgbGVuKQogCiAKKworI2lmZGVmIENPTkZJR19ERUJVR19QQUdFQUxMT0MKKy8qIGludGVybmFsIGRlYnVnZ2luZyBmdW5jdGlvbiAqLwordm9pZCBrZXJuZWxfbWFwX3BhZ2VzKHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgbnVtcGFnZXMsIGludCBlbmFibGUpOworI2VuZGlmCisKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAKICNlbmRpZiAvKiBfQVNNX1BPV0VSUENfQ0FDSEVGTFVTSF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2NlbGwtcG11LmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2NlbGwtcG11LmgKaW5kZXggMzViOTU3Ny4uODA2NmVlZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9jZWxsLXBtdS5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvY2VsbC1wbXUuaApAQCAtOTcsMTEgKzk3LDYgQEAKIGV4dGVybiB1MzIgIGNiZV9nZXRfYW5kX2NsZWFyX3BtX2ludGVycnVwdHModTMyIGNwdSk7CiBleHRlcm4gdm9pZCBjYmVfc3luY19pcnEoaW50IG5vZGUpOwogCi0vKiBVdGlsaXR5IGZ1bmN0aW9ucywgbWFjcm9zICovCi1leHRlcm4gdTMyIGNiZV9nZXRfaHdfdGhyZWFkX2lkKGludCBjcHUpOwotCi0jZGVmaW5lIGNiZV9jcHVfdG9fbm9kZShjcHUpICgoY3B1KSA+PiAxKQotCiAjZGVmaW5lIENCRV9DT1VOVF9TVVBFUlZJU09SX01PREUgICAgICAgMAogI2RlZmluZSBDQkVfQ09VTlRfSFlQRVJWSVNPUl9NT0RFICAgICAgIDEKICNkZWZpbmUgQ0JFX0NPVU5UX1BST0JMRU1fTU9ERSAgICAgICAgICAyCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2NwdXRhYmxlLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2NwdXRhYmxlLmgKaW5kZXggZTg3MGI1My4uNDM0NTI0OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9jcHV0YWJsZS5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvY3B1dGFibGUuaApAQCAtNDgsNiArNDgsNyBAQAogCVBQQ19PUFJPRklMRV9HNCA9IDMsCiAJUFBDX09QUk9GSUxFX0JPT0tFID0gNCwKIAlQUENfT1BST0ZJTEVfQ0VMTCA9IDUsCisJUFBDX09QUk9GSUxFX1BBNlQgPSA2LAogfTsKIAogZW51bSBwb3dlcnBjX3BtY190eXBlIHsKQEAgLTIyMyw2ICsyMjQsMTAgQEAKIAkgICAgQ1BVX0ZUUl9NQVlCRV9DQU5fRE9aRSB8IENQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9MMkNSIHwgXAogCSAgICBDUFVfRlRSX1RBVSB8IENQVV9GVFJfSFBURV9UQUJMRSB8IENQVV9GVFJfTUFZQkVfQ0FOX05BUCB8IFwKIAkgICAgQ1BVX0ZUUl9QUENfTEUpCisjZGVmaW5lIENQVV9GVFJTXzc1MENMCShDUFVfRlRSX0NPTU1PTiB8IENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBcCisJICAgIENQVV9GVFJfTUFZQkVfQ0FOX0RPWkUgfCBDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfTDJDUiB8IFwKKwkgICAgQ1BVX0ZUUl9UQVUgfCBDUFVfRlRSX0hQVEVfVEFCTEUgfCBDUFVfRlRSX01BWUJFX0NBTl9OQVAgfCBcCisJICAgIENQVV9GVFJfSEFTX0hJR0hfQkFUUyB8IENQVV9GVFJfUFBDX0xFKQogI2RlZmluZSBDUFVfRlRSU183NTBGWDEJKENQVV9GVFJfQ09NTU9OIHwgQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IFwKIAkgICAgQ1BVX0ZUUl9NQVlCRV9DQU5fRE9aRSB8IENQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9MMkNSIHwgXAogCSAgICBDUFVfRlRSX1RBVSB8IENQVV9GVFJfSFBURV9UQUJMRSB8IENQVV9GVFJfTUFZQkVfQ0FOX05BUCB8IFwKQEAgLTIzNSw5ICsyNDAsOSBAQAogCSAgICBDUFVfRlRSX01BWUJFX0NBTl9ET1pFIHwgQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX0wyQ1IgfCBcCiAJICAgIENQVV9GVFJfVEFVIHwgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwgQ1BVX0ZUUl9NQVlCRV9DQU5fTkFQIHwgXAogCSAgICBDUFVfRlRSX0RVQUxfUExMXzc1MEZYIHwgQ1BVX0ZUUl9IQVNfSElHSF9CQVRTIHwgQ1BVX0ZUUl9QUENfTEUpCi0jZGVmaW5lIENQVV9GVFJTXzc1MEdYCShDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgQ1BVX0ZUUl9NQVlCRV9DQU5fRE9aRSB8IFwKLQkgICAgQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX0wyQ1IgfCBDUFVfRlRSX1RBVSB8IFwKLQkgICAgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwgQ1BVX0ZUUl9NQVlCRV9DQU5fTkFQIHwgXAorI2RlZmluZSBDUFVfRlRSU183NTBHWAkoQ1BVX0ZUUl9DT01NT04gfCBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgXAorCSAgICBDUFVfRlRSX01BWUJFX0NBTl9ET1pFIHwgQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX0wyQ1IgfCBcCisJICAgIENQVV9GVFJfVEFVIHwgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwgQ1BVX0ZUUl9NQVlCRV9DQU5fTkFQIHwgXAogCSAgICBDUFVfRlRSX0RVQUxfUExMXzc1MEZYIHwgQ1BVX0ZUUl9IQVNfSElHSF9CQVRTIHwgQ1BVX0ZUUl9QUENfTEUpCiAjZGVmaW5lIENQVV9GVFJTXzc0MDBfTk9UQVUJKENQVV9GVFJfQ09NTU9OIHwgQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IFwKIAkgICAgQ1BVX0ZUUl9NQVlCRV9DQU5fRE9aRSB8IENQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9MMkNSIHwgXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9jdXJyZW50LmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2N1cnJlbnQuaAppbmRleCBiODcwOGFlLi5lMmM3ZjA2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2N1cnJlbnQuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2N1cnJlbnQuaApAQCAtMTIsNiArMTIsNyBAQAogc3RydWN0IHRhc2tfc3RydWN0OwogCiAjaWZkZWYgX19wb3dlcnBjNjRfXworI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgogI2luY2x1ZGUgPGFzbS9wYWNhLmg+CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHRhc2tfc3RydWN0ICpnZXRfY3VycmVudCh2b2lkKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9lZGFjLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2VkYWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWFkODhiCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9lZGFjLmgKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIFBQQyBFREFDIGNvbW1vbiBkZWZzCisgKgorICogQXV0aG9yOiBEYXZlIEppYW5nIDxkamlhbmdAbXZpc3RhLmNvbT4KKyAqCisgKiAyMDA3IChjKSBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlcgorICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuIFRoaXMgcHJvZ3JhbQorICogaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueSB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzCisgKiBvciBpbXBsaWVkLgorICovCisjaWZuZGVmIEFTTV9FREFDX0gKKyNkZWZpbmUgQVNNX0VEQUNfSAorLyoKKyAqIEVDQyBhdG9taWMsIERNQSwgU01QIGFuZCBpbnRlcnJ1cHQgc2FmZSBzY3J1YiBmdW5jdGlvbi4KKyAqIEltcGxlbWVudHMgdGhlIHBlciBhcmNoIGF0b21pY19zY3J1YigpIHRoYXQgRURBQyB1c2UgZm9yIHNvZnR3YXJlCisgKiBFQ0Mgc2NydWJiaW5nLiAgSXQgcmVhZHMgbWVtb3J5IGFuZCB0aGVuIHdyaXRlcyBiYWNrIHRoZSBvcmlnaW5hbAorICogdmFsdWUsIGFsbG93aW5nIHRoZSBoYXJkd2FyZSB0byBkZXRlY3QgYW5kIGNvcnJlY3QgbWVtb3J5IGVycm9ycy4KKyAqLworc3RhdGljIF9faW5saW5lX18gdm9pZCBhdG9taWNfc2NydWIodm9pZCAqdmEsIHUzMiBzaXplKQoreworCXVuc2lnbmVkIGludCAqdmlydF9hZGRyID0gdmE7CisJdW5zaWduZWQgaW50IHRlbXA7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZSAvIHNpemVvZigqdmlydF9hZGRyKTsgaSsrLCB2aXJ0X2FkZHIrKykgeworCQkvKiBWZXJ5IGNhcmVmdWxseSByZWFkIGFuZCB3cml0ZSB0byBtZW1vcnkgYXRvbWljYWxseQorCQkgKiBzbyB3ZSBhcmUgaW50ZXJydXB0LCBETUEgYW5kIFNNUCBzYWZlLgorCQkgKi8KKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJcblwKKwkJCQkxOglsd2FyeAklMCwwLCUxXG5cCisJCQkJCXN0d2N4LgklMCwwLCUxXG5cCisJCQkJCWJuZS0JMWJcblwKKwkJCQkJaXN5bmMiCisJCQkJCTogIj0mciIodGVtcCkKKwkJCQkJOiAiciIodmlydF9hZGRyKQorCQkJCQk6ICJjcjAiLCAibWVtb3J5Iik7CisJfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvZWVoX2V2ZW50LmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2VlaF9ldmVudC5oCmluZGV4IGRjNmJmMGYuLmNjM2NiMDQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvZWVoX2V2ZW50LmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9lZWhfZXZlbnQuaApAQCAtMzAsOCArMzAsNiBAQAogCXN0cnVjdCBsaXN0X2hlYWQgICAgIGxpc3Q7CiAJc3RydWN0IGRldmljZV9ub2RlIAkqZG47ICAgLyogc3RydWN0IGRldmljZSBub2RlICovCiAJc3RydWN0IHBjaV9kZXYgICAgICAgKmRldjsgIC8qIGFmZmVjdGVkIGRldmljZSAqLwotCWVudW0gcGNpX2NoYW5uZWxfc3RhdGUgc3RhdGU7IC8qIFBDSSBidXMgc3RhdGUgZm9yIHRoZSBhZmZlY3RlZCBkZXZpY2UgKi8KLQlpbnQgdGltZV91bmF2YWlsOyAgICAvKiBtaWxsaXNlY29uZHMgdW50aWwgZGV2aWNlIG1pZ2h0IGJlIGF2YWlsYWJsZSAqLwogfTsKIAogLyoqCkBAIC00Niw5ICs0NCw3IEBACiAgKiAoZnJvbSBhIHdvcmtxdWV1ZSkuCiAgKi8KIGludCBlZWhfc2VuZF9mYWlsdXJlX2V2ZW50IChzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBwY2lfZGV2ICpkZXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBwY2lfY2hhbm5lbF9zdGF0ZSBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGltZV91bmF2YWlsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKIAogLyogTWFpbiByZWNvdmVyeSBmdW5jdGlvbiAqLwogc3RydWN0IHBjaV9kbiAqIGhhbmRsZV9lZWhfZXZlbnRzIChzdHJ1Y3QgZWVoX2V2ZW50ICopOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9pYm1lYnVzLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2libWVidXMuaAppbmRleCA2NjExMjExLi44N2QzOTZlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2libWVidXMuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2libWVidXMuaApAQCAtMiwzNiArMiwzNyBAQAogICogSUJNIFBvd2VyUEMgZUJ1cyBJbmZyYXN0cnVjdHVyZSBTdXBwb3J0LgogICoKICAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24KKyAqICBKb2FjaGltIEZlbmtlcyA8ZmVua2VzQGRlLmlibS5jb20+CiAgKiAgSGVpa28gSiBTY2hpY2sgPHNjaGlja2hqQGRlLmlibS5jb20+Ci0gKiAgICAKKyAqCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKLSAqIFRoaXMgc291cmNlIGNvZGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgYSBkdWFsIGxpY2Vuc2Ugb2YgR1BMIHYyLjAgYW5kIE9wZW5JQiAKLSAqIEJTRC4gCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIGEgZHVhbCBsaWNlbnNlIG9mIEdQTCB2Mi4wIGFuZCBPcGVuSUIKKyAqIEJTRC4KICAqCiAgKiBPcGVuSUIgQlNEIExpY2Vuc2UKICAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgCi0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgogICoKLSAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyAKLSAqIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcworICogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCiAgKgotICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCAKLSAqIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gCisgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCiAgKiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi0gKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIAorICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgogICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiAKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSAKLSAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSAKLSAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKICAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgogICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIKLSAqIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIAotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgCisgKiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogICovCiAKQEAgLTQ2LDEyICs0NywxMSBAQAogCiBleHRlcm4gc3RydWN0IGJ1c190eXBlIGlibWVidXNfYnVzX3R5cGU7CiAKLXN0cnVjdCBpYm1lYnVzX2RldiB7CQotCWNvbnN0IGNoYXIgKm5hbWU7CitzdHJ1Y3QgaWJtZWJ1c19kZXYgewogCXN0cnVjdCBvZl9kZXZpY2Ugb2ZkZXY7CiB9OwogCi1zdHJ1Y3QgaWJtZWJ1c19kcml2ZXIgewkKK3N0cnVjdCBpYm1lYnVzX2RyaXZlciB7CiAJY2hhciAqbmFtZTsKIAlzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICppZF90YWJsZTsKIAlpbnQgKCpwcm9iZSkgKHN0cnVjdCBpYm1lYnVzX2RldiAqZGV2LCBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICppZCk7CkBAIC02Myw3ICs2Myw3IEBACiB2b2lkIGlibWVidXNfdW5yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IGlibWVidXNfZHJpdmVyICpkcnYpOwogCiBpbnQgaWJtZWJ1c19yZXF1ZXN0X2lycShzdHJ1Y3QgaWJtZWJ1c19kZXYgKmRldiwKLQkJCXUzMiBpc3QsIAorCQkJdTMyIGlzdCwKIAkJCWlycV9oYW5kbGVyX3QgaGFuZGxlciwKIAkJCXVuc2lnbmVkIGxvbmcgaXJxX2ZsYWdzLCBjb25zdCBjaGFyICogZGV2bmFtZSwKIAkJCXZvaWQgKmRldl9pZCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2ltbWFwXzg2eHguaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvaW1tYXBfODZ4eC5oCmluZGV4IGQ5MDViNjYuLjU5YjllMDcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvaW1tYXBfODZ4eC5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvaW1tYXBfODZ4eC5oCkBAIC04NSw4MSArODUsNiBAQAogCWNoYXIJcmVzMTlbNDcyXTsKIH0gY2Nzcl9wY2lfdDsKIAotLyogUENJIEV4cHJlc3MgUmVnaXN0ZXJzICovCi10eXBlZGVmIHN0cnVjdCBjY3NyX3BleCB7Ci0JdWludCAgICBwZXhfY29uZmlnX2FkZHI7ICAgICAgICAvKiAweC4wMDAgLSBQQ0kgRXhwcmVzcyBDb25maWd1cmF0aW9uIEFkZHJlc3MgUmVnaXN0ZXIgKi8KLQl1aW50ICAgIHBleF9jb25maWdfZGF0YTsgICAgICAgIC8qIDB4LjAwNCAtIFBDSSBFeHByZXNzIENvbmZpZ3VyYXRpb24gRGF0YSBSZWdpc3RlciAqLwotCWNoYXIgICAgcmVzMVs0XTsKLQl1aW50ICAgIHBleF9vdGJfY3BsX3RvcjsgICAgICAgIC8qIDB4LjAwYyAtIFBDSSBFeHByZXNzIE91dGJvdW5kIGNvbXBsZXRpb24gdGltZW91dCByZWdpc3RlciAqLwotCXVpbnQgICAgcGV4X2NvbmZfdG9yOyAgICAgICAgICAgLyogMHguMDEwIC0gUENJIEV4cHJlc3MgY29uZmlndXJhdGlvbiB0aW1lb3V0IHJlZ2lzdGVyICovCi0JY2hhciAgICByZXMyWzEyXTsKLQl1aW50ICAgIHBleF9wbWVfbWVzX2RyOyAgICAgICAgIC8qIDB4LjAyMCAtIFBDSSBFeHByZXNzIFBNRSBhbmQgbWVzc2FnZSBkZXRlY3QgcmVnaXN0ZXIgKi8KLQl1aW50ICAgIHBleF9wbWVfbWVzX2Rpc3I7ICAgICAgIC8qIDB4LjAyNCAtIFBDSSBFeHByZXNzIFBNRSBhbmQgbWVzc2FnZSBkaXNhYmxlIHJlZ2lzdGVyICovCi0JdWludCAgICBwZXhfcG1lX21lc19pZXI7ICAgICAgICAvKiAweC4wMjggLSBQQ0kgRXhwcmVzcyBQTUUgYW5kIG1lc3NhZ2UgaW50ZXJydXB0IGVuYWJsZSByZWdpc3RlciAqLwotCXVpbnQgICAgcGV4X3BtY3I7ICAgICAgICAgICAgICAgLyogMHguMDJjIC0gUENJIEV4cHJlc3MgcG93ZXIgbWFuYWdlbWVudCBjb21tYW5kIHJlZ2lzdGVyICovCi0JY2hhciAgICByZXMzWzMwMjRdOwotCXVpbnQgICAgcGV4b3RhcjA7ICAgICAgICAgICAgICAgLyogMHguYzAwIC0gUENJIEV4cHJlc3Mgb3V0Ym91bmQgdHJhbnNsYXRpb24gYWRkcmVzcyByZWdpc3RlciAwICovCi0JdWludCAgICBwZXhvdGVhcjA7ICAgICAgICAgICAgICAvKiAweC5jMDQgLSBQQ0kgRXhwcmVzcyBvdXRib3VuZCB0cmFuc2xhdGlvbiBleHRlbmRlZCBhZGRyZXNzIHJlZ2lzdGVyIDAqLwotCWNoYXIgICAgcmVzNFs4XTsKLQl1aW50ICAgIHBleG93YXIwOyAgICAgICAgICAgICAgIC8qIDB4LmMxMCAtIFBDSSBFeHByZXNzIG91dGJvdW5kIHdpbmRvdyBhdHRyaWJ1dGVzIHJlZ2lzdGVyIDAqLwotCWNoYXIgICAgcmVzNVsxMl07Ci0JdWludCAgICBwZXhvdGFyMTsgICAgICAgICAgICAgICAvKiAweC5jMjAgLSBQQ0kgRXhwcmVzcyBvdXRib3VuZCB0cmFuc2xhdGlvbiBhZGRyZXNzIHJlZ2lzdGVyIDEgKi8KLQl1aW50ICAgIHBleG90ZWFyMTsgICAgICAgICAgICAgIC8qIDB4LmMyNCAtIFBDSSBFeHByZXNzIG91dGJvdW5kIHRyYW5zbGF0aW9uIGV4dGVuZGVkIGFkZHJlc3MgcmVnaXN0ZXIgMSovCi0JdWludCAgICBwZXhvd2JhcjE7ICAgICAgICAgICAgICAvKiAweC5jMjggLSBQQ0kgRXhwcmVzcyBvdXRib3VuZCB3aW5kb3cgYmFzZSBhZGRyZXNzIHJlZ2lzdGVyIDEqLwotCWNoYXIgICAgcmVzNls0XTsKLQl1aW50ICAgIHBleG93YXIxOyAgICAgICAgICAgICAgIC8qIDB4LmMzMCAtIFBDSSBFeHByZXNzIG91dGJvdW5kIHdpbmRvdyBhdHRyaWJ1dGVzIHJlZ2lzdGVyIDEqLwotCWNoYXIgICAgcmVzN1sxMl07Ci0JdWludCAgICBwZXhvdGFyMjsgICAgICAgICAgICAgICAvKiAweC5jNDAgLSBQQ0kgRXhwcmVzcyBvdXRib3VuZCB0cmFuc2xhdGlvbiBhZGRyZXNzIHJlZ2lzdGVyIDIgKi8KLQl1aW50ICAgIHBleG90ZWFyMjsgICAgICAgICAgICAgIC8qIDB4LmM0NCAtIFBDSSBFeHByZXNzIG91dGJvdW5kIHRyYW5zbGF0aW9uIGV4dGVuZGVkIGFkZHJlc3MgcmVnaXN0ZXIgMiovCi0JdWludCAgICBwZXhvd2JhcjI7ICAgICAgICAgICAgICAvKiAweC5jNDggLSBQQ0kgRXhwcmVzcyBvdXRib3VuZCB3aW5kb3cgYmFzZSBhZGRyZXNzIHJlZ2lzdGVyIDIqLwotCWNoYXIgICAgcmVzOFs0XTsKLQl1aW50ICAgIHBleG93YXIyOyAgICAgICAgICAgICAgIC8qIDB4LmM1MCAtIFBDSSBFeHByZXNzIG91dGJvdW5kIHdpbmRvdyBhdHRyaWJ1dGVzIHJlZ2lzdGVyIDIqLwotCWNoYXIgICAgcmVzOVsxMl07Ci0JdWludCAgICBwZXhvdGFyMzsgICAgICAgICAgICAgICAvKiAweC5jNjAgLSBQQ0kgRXhwcmVzcyBvdXRib3VuZCB0cmFuc2xhdGlvbiBhZGRyZXNzIHJlZ2lzdGVyIDMgKi8KLQl1aW50ICAgIHBleG90ZWFyMzsgICAgICAgICAgICAgIC8qIDB4LmM2NCAtIFBDSSBFeHByZXNzIG91dGJvdW5kIHRyYW5zbGF0aW9uIGV4dGVuZGVkIGFkZHJlc3MgcmVnaXN0ZXIgMyovCi0JdWludCAgICBwZXhvd2JhcjM7ICAgICAgICAgICAgICAvKiAweC5jNjggLSBQQ0kgRXhwcmVzcyBvdXRib3VuZCB3aW5kb3cgYmFzZSBhZGRyZXNzIHJlZ2lzdGVyIDMqLwotCWNoYXIgICAgcmVzMTBbNF07Ci0JdWludCAgICBwZXhvd2FyMzsgICAgICAgICAgICAgICAvKiAweC5jNzAgLSBQQ0kgRXhwcmVzcyBvdXRib3VuZCB3aW5kb3cgYXR0cmlidXRlcyByZWdpc3RlciAzKi8KLQljaGFyICAgIHJlczExWzEyXTsKLQl1aW50ICAgIHBleG90YXI0OyAgICAgICAgICAgICAgIC8qIDB4LmM4MCAtIFBDSSBFeHByZXNzIG91dGJvdW5kIHRyYW5zbGF0aW9uIGFkZHJlc3MgcmVnaXN0ZXIgNCAqLwotCXVpbnQgICAgcGV4b3RlYXI0OyAgICAgICAgICAgICAgLyogMHguYzg0IC0gUENJIEV4cHJlc3Mgb3V0Ym91bmQgdHJhbnNsYXRpb24gZXh0ZW5kZWQgYWRkcmVzcyByZWdpc3RlciA0Ki8KLQl1aW50ICAgIHBleG93YmFyNDsgICAgICAgICAgICAgIC8qIDB4LmM4OCAtIFBDSSBFeHByZXNzIG91dGJvdW5kIHdpbmRvdyBiYXNlIGFkZHJlc3MgcmVnaXN0ZXIgNCovCi0JY2hhciAgICByZXMxMls0XTsKLQl1aW50ICAgIHBleG93YXI0OyAgICAgICAgICAgICAgIC8qIDB4LmM5MCAtIFBDSSBFeHByZXNzIG91dGJvdW5kIHdpbmRvdyBhdHRyaWJ1dGVzIHJlZ2lzdGVyIDQqLwotCWNoYXIgICAgcmVzMTNbMTJdOwotCWNoYXIgICAgcmVzMTRbMjU2XTsKLQl1aW50ICAgIHBleGl0YXIzOyAgICAgICAgICAgICAgIC8qIDB4LmRhMCAtIFBDSSBFeHByZXNzIGluYm91bmQgdHJhbnNsYXRpb24gYWRkcmVzcyByZWdpc3RlciAzICovCi0JY2hhciAgICByZXMxNVs0XTsKLQl1aW50ICAgIHBleGl3YmFyMzsgICAgICAgICAgICAgIC8qIDB4LmRhOCAtIFBDSSBFeHByZXNzIGluYm91bmQgd2luZG93IGJhc2UgYWRkcmVzcyByZWdpc3RlciAzICovCi0JdWludCAgICBwZXhpd2JlYXIzOyAgICAgICAgICAgICAvKiAweC5kYWMgLSBQQ0kgRXhwcmVzcyBpbmJvdW5kIHdpbmRvdyBiYXNlIGV4dGVuZGVkIGFkZHJlc3MgcmVnaXN0ZXIgMyAqLwotCXVpbnQgICAgcGV4aXdhcjM7ICAgICAgICAgICAgICAgLyogMHguZGIwIC0gUENJIEV4cHJlc3MgaW5ib3VuZCB3aW5kb3cgYXR0cmlidXRlcyByZWdpc3RlciAzICovCi0JY2hhciAgICByZXMxNlsxMl07Ci0JdWludCAgICBwZXhpdGFyMjsgICAgICAgICAgICAgICAvKiAweC5kYzAgLSBQQ0kgRXhwcmVzcyBpbmJvdW5kIHRyYW5zbGF0aW9uIGFkZHJlc3MgcmVnaXN0ZXIgMiAqLwotCWNoYXIgICAgcmVzMTdbNF07Ci0JdWludCAgICBwZXhpd2JhcjI7ICAgICAgICAgICAgICAvKiAweC5kYzggLSBQQ0kgRXhwcmVzcyBpbmJvdW5kIHdpbmRvdyBiYXNlIGFkZHJlc3MgcmVnaXN0ZXIgMiAqLwotCXVpbnQgICAgcGV4aXdiZWFyMjsgICAgICAgICAgICAgLyogMHguZGNjIC0gUENJIEV4cHJlc3MgaW5ib3VuZCB3aW5kb3cgYmFzZSBleHRlbmRlZCBhZGRyZXNzIHJlZ2lzdGVyIDIgKi8KLQl1aW50ICAgIHBleGl3YXIyOyAgICAgICAgICAgICAgIC8qIDB4LmRkMCAtIFBDSSBFeHByZXNzIGluYm91bmQgd2luZG93IGF0dHJpYnV0ZXMgcmVnaXN0ZXIgMiAqLwotCWNoYXIgICAgcmVzMThbMTJdOwotCXVpbnQgICAgcGV4aXRhcjE7ICAgICAgICAgICAgICAgLyogMHguZGUwIC0gUENJIEV4cHJlc3MgaW5ib3VuZCB0cmFuc2xhdGlvbiBhZGRyZXNzIHJlZ2lzdGVyIDIgKi8KLQljaGFyICAgIHJlczE5WzRdOwotCXVpbnQgICAgcGV4aXdiYXIxOyAgICAgICAgICAgICAgLyogMHguZGU4IC0gUENJIEV4cHJlc3MgaW5ib3VuZCB3aW5kb3cgYmFzZSBhZGRyZXNzIHJlZ2lzdGVyIDIgKi8KLQl1aW50ICAgIHBleGl3YmVhcjE7ICAgICAgICAgICAgIC8qIDB4LmRlYyAtIFBDSSBFeHByZXNzIGluYm91bmQgd2luZG93IGJhc2UgZXh0ZW5kZWQgYWRkcmVzcyByZWdpc3RlciAyICovCi0JdWludCAgICBwZXhpd2FyMTsgICAgICAgICAgICAgICAvKiAweC5kZjAgLSBQQ0kgRXhwcmVzcyBpbmJvdW5kIHdpbmRvdyBhdHRyaWJ1dGVzIHJlZ2lzdGVyIDIgKi8KLQljaGFyICAgIHJlczIwWzEyXTsKLQl1aW50ICAgIHBleF9lcnJfZHI7ICAgICAgICAgICAgIC8qIDB4LmUwMCAtIFBDSSBFeHByZXNzIGVycm9yIGRldGVjdCByZWdpc3RlciAqLwotCWNoYXIgICAgcmVzMjFbNF07Ci0JdWludCAgICBwZXhfZXJyX2VuOyAgICAgICAgICAgICAvKiAweC5lMDggLSBQQ0kgRXhwcmVzcyBlcnJvciBpbnRlcnJ1cHQgZW5hYmxlIHJlZ2lzdGVyICovCi0JY2hhciAgICByZXMyMls0XTsKLQl1aW50ICAgIHBleF9lcnJfZGlzcjsgICAgICAgICAgIC8qIDB4LmUxMCAtIFBDSSBFeHByZXNzIGVycm9yIGRpc2FibGUgcmVnaXN0ZXIgKi8KLQljaGFyICAgIHJlczIzWzEyXTsKLQl1aW50ICAgIHBleF9lcnJfY2FwX3N0YXQ7ICAgICAgIC8qIDB4LmUyMCAtIFBDSSBFeHByZXNzIGVycm9yIGNhcHR1cmUgc3RhdHVzIHJlZ2lzdGVyICovCi0JY2hhciAgICByZXMyNFs0XTsKLQl1aW50ICAgIHBleF9lcnJfY2FwX3IwOyAgICAgICAgIC8qIDB4LmUyOCAtIFBDSSBFeHByZXNzIGVycm9yIGNhcHR1cmUgcmVnaXN0ZXIgMCAqLwotCXVpbnQgICAgcGV4X2Vycl9jYXBfcjE7ICAgICAgICAgLyogMHguZTJjIC0gUENJIEV4cHJlc3MgZXJyb3IgY2FwdHVyZSByZWdpc3RlciAwICovCi0JdWludCAgICBwZXhfZXJyX2NhcF9yMjsgICAgICAgICAvKiAweC5lMzAgLSBQQ0kgRXhwcmVzcyBlcnJvciBjYXB0dXJlIHJlZ2lzdGVyIDAgKi8KLQl1aW50ICAgIHBleF9lcnJfY2FwX3IzOyAgICAgICAgIC8qIDB4LmUzNCAtIFBDSSBFeHByZXNzIGVycm9yIGNhcHR1cmUgcmVnaXN0ZXIgMCAqLwotfSBjY3NyX3BleF90OwotCiAvKiBHbG9iYWwgVXRpbGl0eSBSZWdpc3RlcnMgKi8KIHR5cGVkZWYgc3RydWN0IGNjc3JfZ3V0cyB7CiAJdWludAlwb3JwbGxzcjsJLyogMHguMDAwMCAtIFBPUiBQTEwgUmF0aW8gU3RhdHVzIFJlZ2lzdGVyICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2lvLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2lvLmgKaW5kZXggMzAxYzliYi4uMzUwYzliZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9pby5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvaW8uaApAQCAtMTEsNyArMTEsMTIgQEAKIAogLyogQ2hlY2sgb2YgZXhpc3RlbmNlIG9mIGxlZ2FjeSBkZXZpY2VzICovCiBleHRlcm4gaW50IGNoZWNrX2xlZ2FjeV9pb3BvcnQodW5zaWduZWQgbG9uZyBiYXNlX3BvcnQpOwotI2RlZmluZSBQTlBCSU9TX0JBU0UJMHhmMDAwCS8qIG9ubHkgcmVsZXZhbnQgZm9yIFBSZVAgKi8KKyNkZWZpbmUgSTgwNDJfREFUQV9SRUcJMHg2MAorI2RlZmluZSBGRENfQkFTRQkweDNmMAorLyogb25seSByZWxldmFudCBmb3IgUFJlUCAqLworI2RlZmluZSBfUElEWFIJCTB4Mjc5CisjZGVmaW5lIF9QTlBXUlAJCTB4YTc5CisjZGVmaW5lIFBOUEJJT1NfQkFTRQkweGYwMDAKIAogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMva3Byb2Jlcy5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9rcHJvYmVzLmgKaW5kZXggM2E1ZGQ0OS4uZjg1MGNhNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9rcHJvYmVzLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9rcHJvYmVzLmgKQEAgLTg3LDYgKzg3LDExIEBACiBzdHJ1Y3QgYXJjaF9zcGVjaWZpY19pbnNuIHsKIAkvKiBjb3B5IG9mIG9yaWdpbmFsIGluc3RydWN0aW9uICovCiAJa3Byb2JlX29wY29kZV90ICppbnNuOworCS8qCisJICogU2V0IGluIGtwcm9iZXMgY29kZSwgaW5pdGlhbGx5IHRvIDAuIElmIHRoZSBpbnN0cnVjdGlvbiBjYW4gYmUKKwkgKiBldW11bGF0ZWQsIHRoaXMgaXMgc2V0IHRvIDEsIGlmIG5vdCwgdG8gLTEuCisJICovCisJaW50IGJvb3N0YWJsZTsKIH07CiAKIHN0cnVjdCBwcmV2X2twcm9iZSB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL21hY2hkZXAuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvbWFjaGRlcC5oCmluZGV4IDFiMDRlNTcuLmIyMDQ5MjYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvbWFjaGRlcC5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvbWFjaGRlcC5oCkBAIC0xNTMsOSArMTUzLDYgQEAKIAkgKi8KIAlsb25nCSAJKCpmZWF0dXJlX2NhbGwpKHVuc2lnbmVkIGludCBmZWF0dXJlLCAuLi4pOwogCi0JLyogQ2hlY2sgYXZhaWxhYmlsaXR5IG9mIGxlZ2FjeSBkZXZpY2VzIGxpa2UgaTgwNDIgKi8KLQlpbnQgCQkoKmNoZWNrX2xlZ2FjeV9pb3BvcnQpKHVuc2lnbmVkIGludCBiYXNlcG9ydCk7Ci0KIAkvKiBHZXQgbGVnYWN5IFBDSS9JREUgaW50ZXJydXB0IG1hcHBpbmcgKi8gCiAJaW50CQkoKnBjaV9nZXRfbGVnYWN5X2lkZV9pcnEpKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBjaGFubmVsKTsKIAkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvbW11LWhhc2g2NC5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9tbXUtaGFzaDY0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjczOTQ1NwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvbW11LWhhc2g2NC5oCkBAIC0wLDAgKzEsNDAwIEBACisjaWZuZGVmIF9BU01fUE9XRVJQQ19NTVVfSEFTSDY0X0hfCisjZGVmaW5lIF9BU01fUE9XRVJQQ19NTVVfSEFTSDY0X0hfCisvKgorICogUG93ZXJQQzY0IG1lbW9yeSBtYW5hZ2VtZW50IHN0cnVjdHVyZXMKKyAqCisgKiBEYXZlIEVuZ2VicmV0c2VuICYgTWlrZSBDb3JyaWdhbiA8e2VuZ2VicmV0fG1pa2VqY31AdXMuaWJtLmNvbT4KKyAqICAgUFBDNjQgcmV3b3JrLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGFzbS9hc20tY29tcGF0Lmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKworLyoKKyAqIFNlZ21lbnQgdGFibGUKKyAqLworCisjZGVmaW5lIFNURV9FU0lEX1YJMHg4MAorI2RlZmluZSBTVEVfRVNJRF9LUwkweDIwCisjZGVmaW5lIFNURV9FU0lEX0tQCTB4MTAKKyNkZWZpbmUgU1RFX0VTSURfTgkweDA4CisKKyNkZWZpbmUgU1RFX1ZTSURfU0hJRlQJMTIKKworLyogTG9jYXRpb24gb2YgY3B1MCdzIHNlZ21lbnQgdGFibGUgKi8KKyNkZWZpbmUgU1RBQjBfUEFHRQkweDYKKyNkZWZpbmUgU1RBQjBfT0ZGU0VUCShTVEFCMF9QQUdFIDw8IDEyKQorI2RlZmluZSBTVEFCMF9QSFlTX0FERFIJKFNUQUIwX09GRlNFVCArIFBIWVNJQ0FMX1NUQVJUKQorCisjaWZuZGVmIF9fQVNTRU1CTFlfXworZXh0ZXJuIGNoYXIgaW5pdGlhbF9zdGFiW107CisjZW5kaWYgLyogISBfX0FTU0VNQkxZICovCisKKy8qCisgKiBTTEIKKyAqLworCisjZGVmaW5lIFNMQl9OVU1fQk9MVEVECQkzCisjZGVmaW5lIFNMQl9DQUNIRV9FTlRSSUVTCTgKKworLyogQml0cyBpbiB0aGUgU0xCIEVTSUQgd29yZCAqLworI2RlZmluZSBTTEJfRVNJRF9WCQlBU01fQ09OU1QoMHgwMDAwMDAwMDA4MDAwMDAwKSAvKiB2YWxpZCAqLworCisvKiBCaXRzIGluIHRoZSBTTEIgVlNJRCB3b3JkICovCisjZGVmaW5lIFNMQl9WU0lEX1NISUZUCQkxMgorI2RlZmluZSBTTEJfVlNJRF9CCQlBU01fQ09OU1QoMHhjMDAwMDAwMDAwMDAwMDAwKQorI2RlZmluZSBTTEJfVlNJRF9CXzI1Nk0JCUFTTV9DT05TVCgweDAwMDAwMDAwMDAwMDAwMDApCisjZGVmaW5lIFNMQl9WU0lEX0JfMVQJCUFTTV9DT05TVCgweDQwMDAwMDAwMDAwMDAwMDApCisjZGVmaW5lIFNMQl9WU0lEX0tTCQlBU01fQ09OU1QoMHgwMDAwMDAwMDAwMDAwODAwKQorI2RlZmluZSBTTEJfVlNJRF9LUAkJQVNNX0NPTlNUKDB4MDAwMDAwMDAwMDAwMDQwMCkKKyNkZWZpbmUgU0xCX1ZTSURfTgkJQVNNX0NPTlNUKDB4MDAwMDAwMDAwMDAwMDIwMCkgLyogbm8tZXhlY3V0ZSAqLworI2RlZmluZSBTTEJfVlNJRF9MCQlBU01fQ09OU1QoMHgwMDAwMDAwMDAwMDAwMTAwKQorI2RlZmluZSBTTEJfVlNJRF9DCQlBU01fQ09OU1QoMHgwMDAwMDAwMDAwMDAwMDgwKSAvKiBjbGFzcyAqLworI2RlZmluZSBTTEJfVlNJRF9MUAkJQVNNX0NPTlNUKDB4MDAwMDAwMDAwMDAwMDAzMCkKKyNkZWZpbmUgU0xCX1ZTSURfTFBfMDAJCUFTTV9DT05TVCgweDAwMDAwMDAwMDAwMDAwMDApCisjZGVmaW5lIFNMQl9WU0lEX0xQXzAxCQlBU01fQ09OU1QoMHgwMDAwMDAwMDAwMDAwMDEwKQorI2RlZmluZSBTTEJfVlNJRF9MUF8xMAkJQVNNX0NPTlNUKDB4MDAwMDAwMDAwMDAwMDAyMCkKKyNkZWZpbmUgU0xCX1ZTSURfTFBfMTEJCUFTTV9DT05TVCgweDAwMDAwMDAwMDAwMDAwMzApCisjZGVmaW5lIFNMQl9WU0lEX0xMUAkJKFNMQl9WU0lEX0x8U0xCX1ZTSURfTFApCisKKyNkZWZpbmUgU0xCX1ZTSURfS0VSTkVMCQkoU0xCX1ZTSURfS1ApCisjZGVmaW5lIFNMQl9WU0lEX1VTRVIJCShTTEJfVlNJRF9LUHxTTEJfVlNJRF9LU3xTTEJfVlNJRF9DKQorCisjZGVmaW5lIFNMQklFX0MJCQkoMHgwODAwMDAwMCkKKworLyoKKyAqIEhhc2ggdGFibGUKKyAqLworCisjZGVmaW5lIEhQVEVTX1BFUl9HUk9VUCA4CisKKyNkZWZpbmUgSFBURV9WX0FWUE5fU0hJRlQJNworI2RlZmluZSBIUFRFX1ZfQVZQTgkJQVNNX0NPTlNUKDB4ZmZmZmZmZmZmZmZmZmY4MCkKKyNkZWZpbmUgSFBURV9WX0FWUE5fVkFMKHgpCSgoKHgpICYgSFBURV9WX0FWUE4pID4+IEhQVEVfVl9BVlBOX1NISUZUKQorI2RlZmluZSBIUFRFX1ZfQ09NUEFSRSh4LHkpCSghKCgoeCkgXiAoeSkpICYgSFBURV9WX0FWUE4pKQorI2RlZmluZSBIUFRFX1ZfQk9MVEVECQlBU01fQ09OU1QoMHgwMDAwMDAwMDAwMDAwMDEwKQorI2RlZmluZSBIUFRFX1ZfTE9DSwkJQVNNX0NPTlNUKDB4MDAwMDAwMDAwMDAwMDAwOCkKKyNkZWZpbmUgSFBURV9WX0xBUkdFCQlBU01fQ09OU1QoMHgwMDAwMDAwMDAwMDAwMDA0KQorI2RlZmluZSBIUFRFX1ZfU0VDT05EQVJZCUFTTV9DT05TVCgweDAwMDAwMDAwMDAwMDAwMDIpCisjZGVmaW5lIEhQVEVfVl9WQUxJRAkJQVNNX0NPTlNUKDB4MDAwMDAwMDAwMDAwMDAwMSkKKworI2RlZmluZSBIUFRFX1JfUFAwCQlBU01fQ09OU1QoMHg4MDAwMDAwMDAwMDAwMDAwKQorI2RlZmluZSBIUFRFX1JfVFMJCUFTTV9DT05TVCgweDQwMDAwMDAwMDAwMDAwMDApCisjZGVmaW5lIEhQVEVfUl9SUE5fU0hJRlQJMTIKKyNkZWZpbmUgSFBURV9SX1JQTgkJQVNNX0NPTlNUKDB4M2ZmZmZmZmZmZmZmZjAwMCkKKyNkZWZpbmUgSFBURV9SX0ZMQUdTCQlBU01fQ09OU1QoMHgwMDAwMDAwMDAwMDAwM2ZmKQorI2RlZmluZSBIUFRFX1JfUFAJCUFTTV9DT05TVCgweDAwMDAwMDAwMDAwMDAwMDMpCisjZGVmaW5lIEhQVEVfUl9OCQlBU01fQ09OU1QoMHgwMDAwMDAwMDAwMDAwMDA0KQorI2RlZmluZSBIUFRFX1JfQwkJQVNNX0NPTlNUKDB4MDAwMDAwMDAwMDAwMDA4MCkKKyNkZWZpbmUgSFBURV9SX1IJCUFTTV9DT05TVCgweDAwMDAwMDAwMDAwMDAxMDApCisKKy8qIFZhbHVlcyBmb3IgUFAgKGFzc3VtZXMgS3M9MCwgS3A9MSkgKi8KKy8qIHBwMCB3aWxsIGFsd2F5cyBiZSAwIGZvciBsaW51eCAgICAgKi8KKyNkZWZpbmUgUFBfUldYWAkwCS8qIFN1cGVydmlzb3IgcmVhZC93cml0ZSwgVXNlciBub25lICovCisjZGVmaW5lIFBQX1JXUlggMQkvKiBTdXBlcnZpc29yIHJlYWQvd3JpdGUsIFVzZXIgcmVhZCAqLworI2RlZmluZSBQUF9SV1JXIDIJLyogU3VwZXJ2aXNvciByZWFkL3dyaXRlLCBVc2VyIHJlYWQvd3JpdGUgKi8KKyNkZWZpbmUgUFBfUlhSWCAzCS8qIFN1cGVydmlzb3IgcmVhZCwgICAgICAgVXNlciByZWFkICovCisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBsb25nIHY7CisJdW5zaWduZWQgbG9uZyByOworfSBocHRlX3Q7CisKK2V4dGVybiBocHRlX3QgKmh0YWJfYWRkcmVzczsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGh0YWJfc2l6ZV9ieXRlczsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGh0YWJfaGFzaF9tYXNrOworCisvKgorICogUGFnZSBzaXplIGRlZmluaXRpb24KKyAqCisgKiAgICBzaGlmdCA6IGlzIHRoZSAiUEFHRV9TSElGVCIgdmFsdWUgZm9yIHRoYXQgcGFnZSBzaXplCisgKiAgICBzbGxwICA6IGlzIGEgYml0IG1hc2sgd2l0aCB0aGUgdmFsdWUgb2YgU0xCIEwgfHwgTFAgdG8gYmUgb3InZWQKKyAqICAgICAgICAgICAgZGlyZWN0bHkgdG8gYSBzbGJtdGUgInZzaWQiIHZhbHVlCisgKiAgICBwZW5jICA6IGlzIHRoZSBIUFRFIGVuY29kaW5nIG1hc2sgZm9yIHRoZSAiTFAiIGZpZWxkOgorICoKKyAqLworc3RydWN0IG1tdV9wc2l6ZV9kZWYKK3sKKwl1bnNpZ25lZCBpbnQJc2hpZnQ7CS8qIG51bWJlciBvZiBiaXRzICovCisJdW5zaWduZWQgaW50CXBlbmM7CS8qIEhQVEUgZW5jb2RpbmcgKi8KKwl1bnNpZ25lZCBpbnQJdGxiaWVsOwkvKiB0bGJpZWwgc3VwcG9ydGVkIGZvciB0aGF0IHBhZ2Ugc2l6ZSAqLworCXVuc2lnbmVkIGxvbmcJYXZwbm07CS8qIGJpdHMgdG8gbWFzayBvdXQgaW4gQVZQTiBpbiB0aGUgSFBURSAqLworCXVuc2lnbmVkIGxvbmcJc2xscDsJLyogU0xCIEx8fExQIChleGFjdCBtYXNrIHRvIHVzZSBpbiBzbGJtdGUpICovCit9OworCisjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCisKKy8qCisgKiBUaGUga2VybmVsIHVzZSB0aGUgY29uc3RhbnRzIGJlbG93IHRvIGluZGV4IGluIHRoZSBwYWdlIHNpemVzIGFycmF5LgorICogVGhlIHVzZSBvZiBmaXhlZCBjb25zdGFudHMgZm9yIHRoaXMgcHVycG9zZSBpcyBiZXR0ZXIgZm9yIHBlcmZvcm1hbmNlcworICogb2YgdGhlIGxvdyBsZXZlbCBoYXNoIHJlZmlsbCBoYW5kbGVycy4KKyAqCisgKiBBIG5vbiBzdXBwb3J0ZWQgcGFnZSBzaXplIGhhcyBhICJzaGlmdCIgZmllbGQgc2V0IHRvIDAKKyAqCisgKiBBbnkgbmV3IHBhZ2Ugc2l6ZSBiZWluZyBpbXBsZW1lbnRlZCBjYW4gZ2V0IGEgbmV3IGVudHJ5IGluIGhlcmUuIFdoZXRoZXIKKyAqIHRoZSBrZXJuZWwgd2lsbCB1c2UgaXQgb3Igbm90IGlzIGEgZGlmZmVyZW50IG1hdHRlciB0aG91Z2guIFRoZSBhY3R1YWwgcGFnZQorICogc2l6ZSB1c2VkIGJ5IGh1Z2V0bGJmcyBpcyBub3QgZGVmaW5lZCBoZXJlIGFuZCBtYXkgYmUgbWFkZSB2YXJpYWJsZQorICovCisKKyNkZWZpbmUgTU1VX1BBR0VfNEsJCTAJLyogNEsgKi8KKyNkZWZpbmUgTU1VX1BBR0VfNjRLCQkxCS8qIDY0SyAqLworI2RlZmluZSBNTVVfUEFHRV82NEtfQVAJCTIJLyogNjRLIEFkbWl4ZWQgKGluIGEgNEsgc2VnbWVudCkgKi8KKyNkZWZpbmUgTU1VX1BBR0VfMU0JCTMJLyogMU0gKi8KKyNkZWZpbmUgTU1VX1BBR0VfMTZNCQk0CS8qIDE2TSAqLworI2RlZmluZSBNTVVfUEFHRV8xNkcJCTUJLyogMTZHICovCisjZGVmaW5lIE1NVV9QQUdFX0NPVU5UCQk2CisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisKKy8qCisgKiBUaGUgY3VycmVudCBzeXN0ZW0gcGFnZSBzaXplcworICovCitleHRlcm4gc3RydWN0IG1tdV9wc2l6ZV9kZWYgbW11X3BzaXplX2RlZnNbTU1VX1BBR0VfQ09VTlRdOworZXh0ZXJuIGludCBtbXVfbGluZWFyX3BzaXplOworZXh0ZXJuIGludCBtbXVfdmlydHVhbF9wc2l6ZTsKK2V4dGVybiBpbnQgbW11X3ZtYWxsb2NfcHNpemU7CitleHRlcm4gaW50IG1tdV9pb19wc2l6ZTsKKworLyoKKyAqIElmIHRoZSBwcm9jZXNzb3Igc3VwcG9ydHMgNjRrIG5vcm1hbCBwYWdlcyBidXQgbm90IDY0ayBjYWNoZQorICogaW5oaWJpdGVkIHBhZ2VzLCB3ZSBoYXZlIHRvIGJlIHByZXBhcmVkIHRvIHN3aXRjaCBwcm9jZXNzZXMKKyAqIHRvIHVzZSA0ayBwYWdlcyB3aGVuIHRoZXkgY3JlYXRlIGNhY2hlLWluaGliaXRlZCBtYXBwaW5ncy4KKyAqIElmIHRoaXMgaXMgdGhlIGNhc2UsIG1tdV9jaV9yZXN0cmljdGlvbnMgd2lsbCBiZSBzZXQgdG8gMS4KKyAqLworZXh0ZXJuIGludCBtbXVfY2lfcmVzdHJpY3Rpb25zOworCisjaWZkZWYgQ09ORklHX0hVR0VUTEJfUEFHRQorLyoKKyAqIFRoZSBwYWdlIHNpemUgaW5kZXggb2YgdGhlIGh1Z2UgcGFnZXMgZm9yIHVzZSBieSBodWdldGxiZnMKKyAqLworZXh0ZXJuIGludCBtbXVfaHVnZV9wc2l6ZTsKKworI2VuZGlmIC8qIENPTkZJR19IVUdFVExCX1BBR0UgKi8KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgQVZQTiBhbmQgTCBmaWVsZHMgb2YgdGhlIEhQVEUgIGFwcHJvcHJpYXRlbHkKKyAqIGZvciB0aGUgcGFnZSBzaXplCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBocHRlX2VuY29kZV92KHVuc2lnbmVkIGxvbmcgdmEsIGludCBwc2l6ZSkKK3sKKwl1bnNpZ25lZCBsb25nIHYgPQorCXYgPSAodmEgPj4gMjMpICYgfihtbXVfcHNpemVfZGVmc1twc2l6ZV0uYXZwbm0pOworCXYgPDw9IEhQVEVfVl9BVlBOX1NISUZUOworCWlmIChwc2l6ZSAhPSBNTVVfUEFHRV80SykKKwkJdiB8PSBIUFRFX1ZfTEFSR0U7CisJcmV0dXJuIHY7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIEFSUE4sIGFuZCBMUCBmaWVsZHMgb2YgdGhlIEhQVEUgYXBwcm9wcmlhdGVseQorICogZm9yIHRoZSBwYWdlIHNpemUuIFdlIGFzc3VtZSB0aGUgcGEgaXMgYWxyZWFkeSAiY2xlYW4iIHRoYXQgaXMgcHJvcGVybHkKKyAqIGFsaWduZWQgZm9yIHRoZSByZXF1ZXN0ZWQgcGFnZSBzaXplCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBocHRlX2VuY29kZV9yKHVuc2lnbmVkIGxvbmcgcGEsIGludCBwc2l6ZSkKK3sKKwl1bnNpZ25lZCBsb25nIHI7CisKKwkvKiBBIDRLIHBhZ2UgbmVlZHMgbm8gc3BlY2lhbCBlbmNvZGluZyAqLworCWlmIChwc2l6ZSA9PSBNTVVfUEFHRV80SykKKwkJcmV0dXJuIHBhICYgSFBURV9SX1JQTjsKKwllbHNlIHsKKwkJdW5zaWduZWQgaW50IHBlbmMgPSBtbXVfcHNpemVfZGVmc1twc2l6ZV0ucGVuYzsKKwkJdW5zaWduZWQgaW50IHNoaWZ0ID0gbW11X3BzaXplX2RlZnNbcHNpemVdLnNoaWZ0OworCQlyZXR1cm4gKHBhICYgfigoMXVsIDw8IHNoaWZ0KSAtIDEpKSB8IChwZW5jIDw8IDEyKTsKKwl9CisJcmV0dXJuIHI7Cit9CisKKy8qCisgKiBUaGlzIGhhc2hlcyBhIHZpcnR1YWwgYWRkcmVzcyBmb3IgYSAyNTZNYiBzZWdtZW50IG9ubHkgZm9yIG5vdworICovCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBocHRfaGFzaCh1bnNpZ25lZCBsb25nIHZhLCB1bnNpZ25lZCBpbnQgc2hpZnQpCit7CisJcmV0dXJuICgodmEgPj4gMjgpICYgMHg3ZmZmZmZmZmZmVUwpIF4gKCh2YSAmIDB4MGZmZmZmZmZVTCkgPj4gc2hpZnQpOworfQorCitleHRlcm4gaW50IF9faGFzaF9wYWdlXzRLKHVuc2lnbmVkIGxvbmcgZWEsIHVuc2lnbmVkIGxvbmcgYWNjZXNzLAorCQkJICB1bnNpZ25lZCBsb25nIHZzaWQsIHB0ZV90ICpwdGVwLCB1bnNpZ25lZCBsb25nIHRyYXAsCisJCQkgIHVuc2lnbmVkIGludCBsb2NhbCk7CitleHRlcm4gaW50IF9faGFzaF9wYWdlXzY0Syh1bnNpZ25lZCBsb25nIGVhLCB1bnNpZ25lZCBsb25nIGFjY2VzcywKKwkJCSAgIHVuc2lnbmVkIGxvbmcgdnNpZCwgcHRlX3QgKnB0ZXAsIHVuc2lnbmVkIGxvbmcgdHJhcCwKKwkJCSAgIHVuc2lnbmVkIGludCBsb2NhbCk7CitzdHJ1Y3QgbW1fc3RydWN0OworZXh0ZXJuIGludCBoYXNoX3BhZ2UodW5zaWduZWQgbG9uZyBlYSwgdW5zaWduZWQgbG9uZyBhY2Nlc3MsIHVuc2lnbmVkIGxvbmcgdHJhcCk7CitleHRlcm4gaW50IGhhc2hfaHVnZV9wYWdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFjY2VzcywKKwkJCSAgdW5zaWduZWQgbG9uZyBlYSwgdW5zaWduZWQgbG9uZyB2c2lkLCBpbnQgbG9jYWwsCisJCQkgIHVuc2lnbmVkIGxvbmcgdHJhcCk7CisKK2V4dGVybiBpbnQgaHRhYl9ib2x0X21hcHBpbmcodW5zaWduZWQgbG9uZyB2c3RhcnQsIHVuc2lnbmVkIGxvbmcgdmVuZCwKKwkJCSAgICAgdW5zaWduZWQgbG9uZyBwc3RhcnQsIHVuc2lnbmVkIGxvbmcgbW9kZSwKKwkJCSAgICAgaW50IHBzaXplKTsKKworZXh0ZXJuIHZvaWQgaHRhYl9pbml0aWFsaXplKHZvaWQpOworZXh0ZXJuIHZvaWQgaHRhYl9pbml0aWFsaXplX3NlY29uZGFyeSh2b2lkKTsKK2V4dGVybiB2b2lkIGhwdGVfaW5pdF9uYXRpdmUodm9pZCk7CitleHRlcm4gdm9pZCBocHRlX2luaXRfbHBhcih2b2lkKTsKK2V4dGVybiB2b2lkIGhwdGVfaW5pdF9pU2VyaWVzKHZvaWQpOworZXh0ZXJuIHZvaWQgaHB0ZV9pbml0X2JlYXQodm9pZCk7CisKK2V4dGVybiB2b2lkIHN0YWJzX2FsbG9jKHZvaWQpOworZXh0ZXJuIHZvaWQgc2xiX2luaXRpYWxpemUodm9pZCk7CitleHRlcm4gdm9pZCBzbGJfZmx1c2hfYW5kX3JlYm9sdCh2b2lkKTsKK2V4dGVybiB2b2lkIHN0YWJfaW5pdGlhbGl6ZSh1bnNpZ25lZCBsb25nIHN0YWIpOworCisjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCisKKy8qCisgKiBWU0lEIGFsbG9jYXRpb24KKyAqCisgKiBXZSBmaXJzdCBnZW5lcmF0ZSBhIDM2LWJpdCAicHJvdG8tVlNJRCIuICBGb3Iga2VybmVsIGFkZHJlc3NlcyB0aGlzCisgKiBpcyBlcXVhbCB0byB0aGUgRVNJRCwgZm9yIHVzZXIgYWRkcmVzc2VzIGl0IGlzOgorICoJKGNvbnRleHQgPDwgMTUpIHwgKGVzaWQgJiAweDdmZmYpCisgKgorICogVGhlIHR3byBmb3JtcyBhcmUgZGlzdGluZ3Vpc2hhYmxlIGJlY2F1c2UgdGhlIHRvcCBiaXQgaXMgMCBmb3IgdXNlcgorICogYWRkcmVzc2VzLCB3aGVyZWFzIHRoZSB0b3AgdHdvIGJpdHMgYXJlIDEgZm9yIGtlcm5lbCBhZGRyZXNzZXMuCisgKiBQcm90by1WU0lEcyB3aXRoIHRoZSB0b3AgdHdvIGJpdHMgZXF1YWwgdG8gMGIxMCBhcmUgcmVzZXJ2ZWQgZm9yCisgKiBub3cuCisgKgorICogVGhlIHByb3RvLVZTSURzIGFyZSB0aGVuIHNjcmFtYmxlZCBpbnRvIHJlYWwgVlNJRHMgd2l0aCB0aGUKKyAqIG11bHRpcGxpY2F0aXZlIGhhc2g6CisgKgorICoJVlNJRCA9IChwcm90by1WU0lEICogVlNJRF9NVUxUSVBMSUVSKSAlIFZTSURfTU9EVUxVUworICoJd2hlcmUJVlNJRF9NVUxUSVBMSUVSID0gMjY4NDM1Mzk5ID0gMHhGRkZGRkM3CisgKgkJVlNJRF9NT0RVTFVTID0gMl4zNi0xID0gMHhGRkZGRkZGRkYKKyAqCisgKiBUaGlzIHNjcmFtYmxlIGlzIG9ubHkgd2VsbCBkZWZpbmVkIGZvciBwcm90by1WU0lEcyBiZWxvdworICogMHhGRkZGRkZGRkYsIHNvIGJvdGggcHJvdG8tVlNJRCBhbmQgYWN0dWFsIFZTSUQgMHhGRkZGRkZGRkYgYXJlCisgKiByZXNlcnZlZC4gIFZTSURfTVVMVElQTElFUiBpcyBwcmltZSwgc28gaW4gcGFydGljdWxhciBpdCBpcworICogY28tcHJpbWUgdG8gVlNJRF9NT0RVTFVTLCBtYWtpbmcgdGhpcyBhIDE6MSBzY3JhbWJsaW5nIGZ1bmN0aW9uLgorICogQmVjYXVzZSB0aGUgbW9kdWx1cyBpcyAyXm4tMSB3ZSBjYW4gY29tcHV0ZSBpdCBlZmZpY2llbnRseSB3aXRob3V0CisgKiBhIGRpdmlkZSBvciBleHRyYSBtdWx0aXBseSAoc2VlIGJlbG93KS4KKyAqCisgKiBUaGlzIHNjaGVtZSBoYXMgc2V2ZXJhbCBhZHZhbnRhZ2VzIG92ZXIgb2xkZXIgbWV0aG9kczoKKyAqCisgKiAJLSBXZSBoYXZlIFZTSURzIGFsbG9jYXRlZCBmb3IgZXZlcnkga2VybmVsIGFkZHJlc3MKKyAqIChpLmUuIGV2ZXJ5dGhpbmcgYWJvdmUgMHhDMDAwMDAwMDAwMDAwMDAwKSwgZXhjZXB0IHRoZSB2ZXJ5IHRvcAorICogc2VnbWVudCwgd2hpY2ggc2ltcGxpZmllcyBzZXZlcmFsIHRoaW5ncy4KKyAqCisgKiAJLSBXZSBhbGxvdyBmb3IgMTUgc2lnbmlmaWNhbnQgYml0cyBvZiBFU0lEIGFuZCAyMCBiaXRzIG9mCisgKiBjb250ZXh0IGZvciB1c2VyIGFkZHJlc3Nlcy4gIGkuZS4gOFQgKDQzIGJpdHMpIG9mIGFkZHJlc3Mgc3BhY2UgZm9yCisgKiB1cCB0byAxTSBjb250ZXh0cyAoYWx0aG91Z2ggdGhlIHBhZ2UgdGFibGUgc3RydWN0dXJlIGFuZCBjb250ZXh0CisgKiBhbGxvY2F0aW9uIHdpbGwgbmVlZCBjaGFuZ2VzIHRvIHRha2UgYWR2YW50YWdlIG9mIHRoaXMpLgorICoKKyAqIAktIFRoZSBzY3JhbWJsZSBmdW5jdGlvbiBnaXZlcyByb2J1c3Qgc2NhdHRlcmluZyBpbiB0aGUgaGFzaAorICogdGFibGUgKGF0IGxlYXN0IGJhc2VkIG9uIHNvbWUgaW5pdGlhbCByZXN1bHRzKS4gIFRoZSBwcmV2aW91cworICogbWV0aG9kIHdhcyBtb3JlIHN1c2NlcHRpYmxlIHRvIHBhdGhvbG9naWNhbCBjYXNlcyBnaXZpbmcgZXhjZXNzaXZlCisgKiBoYXNoIGNvbGxpc2lvbnMuCisgKi8KKy8qCisgKiBXQVJOSU5HIC0gSWYgeW91IGNoYW5nZSB0aGVzZSB5b3UgbXVzdCBtYWtlIHN1cmUgdGhlIGFzbQorICogaW1wbGVtZW50YXRpb25zIGluIHNsYl9hbGxvY2F0ZSAoc2xiX2xvdy5TKSwgZG9fc3RhYl9ib2x0ZWQKKyAqIChoZWFkLlMpIGFuZCBBU01fVlNJRF9TQ1JBTUJMRSAoYmVsb3cpIGFyZSBjaGFuZ2VkIGFjY29yZGluZ2x5LgorICoKKyAqIFlvdSdsbCBhbHNvIG5lZWQgdG8gY2hhbmdlIHRoZSBwcmVjb21wdXRlZCBWU0lEIHZhbHVlcyBpbiBoZWFkLlMKKyAqIHdoaWNoIGFyZSB1c2VkIGJ5IHRoZSBpU2VyaWVzIGZpcm13YXJlLgorICovCisKKyNkZWZpbmUgVlNJRF9NVUxUSVBMSUVSCUFTTV9DT05TVCgyMDA3MzAxMzkpCS8qIDI4LWJpdCBwcmltZSAqLworI2RlZmluZSBWU0lEX0JJVFMJMzYKKyNkZWZpbmUgVlNJRF9NT0RVTFVTCSgoMVVMPDxWU0lEX0JJVFMpLTEpCisKKyNkZWZpbmUgQ09OVEVYVF9CSVRTCTE5CisjZGVmaW5lIFVTRVJfRVNJRF9CSVRTCTE2CisKKyNkZWZpbmUgVVNFUl9WU0lEX1JBTkdFCSgxVUwgPDwgKFVTRVJfRVNJRF9CSVRTICsgU0lEX1NISUZUKSkKKworLyoKKyAqIFRoaXMgbWFjcm8gZ2VuZXJhdGVzIGFzbSBjb2RlIHRvIGNvbXB1dGUgdGhlIFZTSUQgc2NyYW1ibGUKKyAqIGZ1bmN0aW9uLiAgVXNlZCBpbiBzbGJfYWxsb2NhdGUoKSBhbmQgZG9fc3RhYl9ib2x0ZWQuICBUaGUgZnVuY3Rpb24KKyAqIGNvbXB1dGVkIGlzOiAocHJvdG92c2lkKlZTSURfTVVMVElQTElFUikgJSBWU0lEX01PRFVMVVMKKyAqCisgKglydCA9IHJlZ2lzdGVyIGNvbnRpbmFpbmcgdGhlIHByb3RvLVZTSUQgYW5kIGludG8gd2hpY2ggdGhlCisgKgkJVlNJRCB3aWxsIGJlIHN0b3JlZAorICoJcnggPSBzY3JhdGNoIHJlZ2lzdGVyIChjbG9iYmVyZWQpCisgKgorICogCS0gcnQgYW5kIHJ4IG11c3QgYmUgZGlmZmVyZW50IHJlZ2lzdGVycworICogCS0gVGhlIGFuc3dlciB3aWxsIGVuZCB1cCBpbiB0aGUgbG93IDM2IGJpdHMgb2YgcnQuICBUaGUgaGlnaGVyCisgKiAJICBiaXRzIG1heSBjb250YWluIG90aGVyIGdhcmJhZ2UsIHNvIHlvdSBtYXkgbmVlZCB0byBtYXNrIHRoZQorICogCSAgcmVzdWx0LgorICovCisjZGVmaW5lIEFTTV9WU0lEX1NDUkFNQkxFKHJ0LCByeCkJXAorCWxpcwlyeCxWU0lEX01VTFRJUExJRVJAaDsJCQkJCVwKKwlvcmkJcngscngsVlNJRF9NVUxUSVBMSUVSQGw7CQkJCVwKKwltdWxsZAlydCxydCxyeDsJCS8qIHJ0ID0gcnQgKiBNVUxUSVBMSUVSICovCVwKKwkJCQkJCQkJCVwKKwlzcmRpCXJ4LHJ0LFZTSURfQklUUzsJCQkJCVwKKwljbHJsZGkJcnQscnQsKDY0LVZTSURfQklUUyk7CQkJCQlcCisJYWRkCXJ0LHJ0LHJ4OwkJLyogYWRkIGhpZ2ggYW5kIGxvdyBiaXRzICovCVwKKwkvKiBOb3csIHIzID09IFZTSUQgKG1vZCAyXjM2LTEpLCBhbmQgbGllcyBiZXR3ZWVuIDAgYW5kCQlcCisJICogMl4zNi0xKzJeMjgtMS4gIFRoYXQgaW4gcGFydGljdWxhciBtZWFucyB0aGF0IGlmIHIzID49CVwKKwkgKiAyXjM2LTEsIHRoZW4gcjMrMSBoYXMgdGhlIDJeMzYgYml0IHNldC4gIFNvLCBpZiByMysxIGhhcwlcCisJICogdGhlIGJpdCBjbGVhciwgcjMgYWxyZWFkeSBoYXMgdGhlIGFuc3dlciB3ZSB3YW50LCBpZiBpdAlcCisJICogZG9lc24ndCwgdGhlIGFuc3dlciBpcyB0aGUgbG93IDM2IGJpdHMgb2YgcjMrMS4gIFNvIGluIGFsbAlcCisJICogY2FzZXMgdGhlIGFuc3dlciBpcyB0aGUgbG93IDM2IGJpdHMgb2YgKHIzICsgKChyMysxKSA+PiAzNikpKi9cCisJYWRkaQlyeCxydCwxOwkJCQkJCVwKKwlzcmRpCXJ4LHJ4LFZTSURfQklUUzsJLyogZXh0cmFjdCAyXjM2IGJpdCAqLwkJXAorCWFkZAlydCxydCxyeAorCisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBtbV9jb250ZXh0X2lkX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwltbV9jb250ZXh0X2lkX3QgaWQ7CisJdTE2IHVzZXJfcHNpemU7CQkJLyogcGFnZSBzaXplIGluZGV4ICovCisJdTE2IHNsbHA7CQkJLyogU0xCIGVudHJ5IHBhZ2Ugc2l6ZSBlbmNvZGluZyAqLworI2lmZGVmIENPTkZJR19IVUdFVExCX1BBR0UKKwl1MTYgbG93X2h0bGJfYXJlYXMsIGhpZ2hfaHRsYl9hcmVhczsKKyNlbmRpZgorCXVuc2lnbmVkIGxvbmcgdmRzb19iYXNlOworfSBtbV9jb250ZXh0X3Q7CisKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHZzaWRfc2NyYW1ibGUodW5zaWduZWQgbG9uZyBwcm90b3ZzaWQpCit7CisjaWYgMAorCS8qIFRoZSBjb2RlIGJlbG93IGlzIGVxdWl2YWxlbnQgdG8gdGhpcyBmdW5jdGlvbiBmb3IgYXJndW1lbnRzCisJICogPCAyXlZTSURfQklUUywgd2hpY2ggaXMgYWxsIHRoaXMgc2hvdWxkIGV2ZXIgYmUgY2FsbGVkCisJICogd2l0aC4gIEhvd2V2ZXIgZ2NjIGlzIG5vdCBjbGV2ZXIgZW5vdWdoIHRvIGNvbXB1dGUgdGhlCisJICogbW9kdWx1cyAoMl5uLTEpIHdpdGhvdXQgYSBzZWNvbmQgbXVsdGlwbHkuICovCisJcmV0dXJuICgocHJvdG92c2lkICogVlNJRF9NVUxUSVBMSUVSKSAlIFZTSURfTU9EVUxVUyk7CisjZWxzZSAvKiAxICovCisJdW5zaWduZWQgbG9uZyB4OworCisJeCA9IHByb3RvdnNpZCAqIFZTSURfTVVMVElQTElFUjsKKwl4ID0gKHggPj4gVlNJRF9CSVRTKSArICh4ICYgVlNJRF9NT0RVTFVTKTsKKwlyZXR1cm4gKHggKyAoKHgrMSkgPj4gVlNJRF9CSVRTKSkgJiBWU0lEX01PRFVMVVM7CisjZW5kaWYgLyogMSAqLworfQorCisvKiBUaGlzIGlzIG9ubHkgdmFsaWQgZm9yIGFkZHJlc3NlcyA+PSBLRVJORUxCQVNFICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZ2V0X2tlcm5lbF92c2lkKHVuc2lnbmVkIGxvbmcgZWEpCit7CisJcmV0dXJuIHZzaWRfc2NyYW1ibGUoZWEgPj4gU0lEX1NISUZUKTsKK30KKworLyogVGhpcyBpcyBvbmx5IHZhbGlkIGZvciB1c2VyIGFkZHJlc3NlcyAod2hpY2ggYXJlIGJlbG93IDJeNDEpICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZ2V0X3ZzaWQodW5zaWduZWQgbG9uZyBjb250ZXh0LCB1bnNpZ25lZCBsb25nIGVhKQoreworCXJldHVybiB2c2lkX3NjcmFtYmxlKChjb250ZXh0IDw8IFVTRVJfRVNJRF9CSVRTKQorCQkJICAgICB8IChlYSA+PiBTSURfU0hJRlQpKTsKK30KKworI2RlZmluZSBWU0lEX1NDUkFNQkxFKHB2c2lkKQkoKChwdnNpZCkgKiBWU0lEX01VTFRJUExJRVIpICUgVlNJRF9NT0RVTFVTKQorI2RlZmluZSBLRVJORUxfVlNJRChlYSkJCVZTSURfU0NSQU1CTEUoR0VUX0VTSUQoZWEpKQorCisvKiBQaHlzaWNhbCBhZGRyZXNzIHVzZWQgYnkgc29tZSBJTyBmdW5jdGlvbnMgKi8KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBwaHlzX2FkZHJfdDsKKworI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLworCisjZW5kaWYgLyogX0FTTV9QT1dFUlBDX01NVV9IQVNINjRfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvbW11LmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL21tdS5oCmluZGV4IDIwMDA1NWEuLjA2YjNlNmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvbW11LmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9tbXUuaApAQCAtMiw0MDcgKzIsMTQgQEAKICNkZWZpbmUgX0FTTV9QT1dFUlBDX01NVV9IXwogI2lmZGVmIF9fS0VSTkVMX18KIAotI2lmbmRlZiBDT05GSUdfUFBDNjQKLSNpbmNsdWRlIDxhc20tcHBjL21tdS5oPgorI2lmZGVmIENPTkZJR19QUEM2NAorLyogNjQtYml0IGNsYXNzaWMgaGFzaCB0YWJsZSBNTVUgKi8KKyMgIGluY2x1ZGUgPGFzbS9tbXUtaGFzaDY0Lmg+CiAjZWxzZQotCi0vKgotICogUG93ZXJQQyBtZW1vcnkgbWFuYWdlbWVudCBzdHJ1Y3R1cmVzCi0gKgotICogRGF2ZSBFbmdlYnJldHNlbiAmIE1pa2UgQ29ycmlnYW4gPHtlbmdlYnJldHxtaWtlamN9QHVzLmlibS5jb20+Ci0gKiAgIFBQQzY0IHJld29yay4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi0KLSNpbmNsdWRlIDxhc20vYXNtLWNvbXBhdC5oPgotI2luY2x1ZGUgPGFzbS9wYWdlLmg+Ci0KLS8qCi0gKiBTZWdtZW50IHRhYmxlCi0gKi8KLQotI2RlZmluZSBTVEVfRVNJRF9WCTB4ODAKLSNkZWZpbmUgU1RFX0VTSURfS1MJMHgyMAotI2RlZmluZSBTVEVfRVNJRF9LUAkweDEwCi0jZGVmaW5lIFNURV9FU0lEX04JMHgwOAotCi0jZGVmaW5lIFNURV9WU0lEX1NISUZUCTEyCi0KLS8qIExvY2F0aW9uIG9mIGNwdTAncyBzZWdtZW50IHRhYmxlICovCi0jZGVmaW5lIFNUQUIwX1BBR0UJMHg2Ci0jZGVmaW5lIFNUQUIwX09GRlNFVAkoU1RBQjBfUEFHRSA8PCAxMikKLSNkZWZpbmUgU1RBQjBfUEhZU19BRERSCShTVEFCMF9PRkZTRVQgKyBQSFlTSUNBTF9TVEFSVCkKLQotI2lmbmRlZiBfX0FTU0VNQkxZX18KLWV4dGVybiBjaGFyIGluaXRpYWxfc3RhYltdOwotI2VuZGlmIC8qICEgX19BU1NFTUJMWSAqLwotCi0vKgotICogU0xCCi0gKi8KLQotI2RlZmluZSBTTEJfTlVNX0JPTFRFRAkJMwotI2RlZmluZSBTTEJfQ0FDSEVfRU5UUklFUwk4Ci0KLS8qIEJpdHMgaW4gdGhlIFNMQiBFU0lEIHdvcmQgKi8KLSNkZWZpbmUgU0xCX0VTSURfVgkJQVNNX0NPTlNUKDB4MDAwMDAwMDAwODAwMDAwMCkgLyogdmFsaWQgKi8KLQotLyogQml0cyBpbiB0aGUgU0xCIFZTSUQgd29yZCAqLwotI2RlZmluZSBTTEJfVlNJRF9TSElGVAkJMTIKLSNkZWZpbmUgU0xCX1ZTSURfQgkJQVNNX0NPTlNUKDB4YzAwMDAwMDAwMDAwMDAwMCkKLSNkZWZpbmUgU0xCX1ZTSURfQl8yNTZNCQlBU01fQ09OU1QoMHgwMDAwMDAwMDAwMDAwMDAwKQotI2RlZmluZSBTTEJfVlNJRF9CXzFUCQlBU01fQ09OU1QoMHg0MDAwMDAwMDAwMDAwMDAwKQotI2RlZmluZSBTTEJfVlNJRF9LUwkJQVNNX0NPTlNUKDB4MDAwMDAwMDAwMDAwMDgwMCkKLSNkZWZpbmUgU0xCX1ZTSURfS1AJCUFTTV9DT05TVCgweDAwMDAwMDAwMDAwMDA0MDApCi0jZGVmaW5lIFNMQl9WU0lEX04JCUFTTV9DT05TVCgweDAwMDAwMDAwMDAwMDAyMDApIC8qIG5vLWV4ZWN1dGUgKi8KLSNkZWZpbmUgU0xCX1ZTSURfTAkJQVNNX0NPTlNUKDB4MDAwMDAwMDAwMDAwMDEwMCkKLSNkZWZpbmUgU0xCX1ZTSURfQwkJQVNNX0NPTlNUKDB4MDAwMDAwMDAwMDAwMDA4MCkgLyogY2xhc3MgKi8KLSNkZWZpbmUgU0xCX1ZTSURfTFAJCUFTTV9DT05TVCgweDAwMDAwMDAwMDAwMDAwMzApCi0jZGVmaW5lIFNMQl9WU0lEX0xQXzAwCQlBU01fQ09OU1QoMHgwMDAwMDAwMDAwMDAwMDAwKQotI2RlZmluZSBTTEJfVlNJRF9MUF8wMQkJQVNNX0NPTlNUKDB4MDAwMDAwMDAwMDAwMDAxMCkKLSNkZWZpbmUgU0xCX1ZTSURfTFBfMTAJCUFTTV9DT05TVCgweDAwMDAwMDAwMDAwMDAwMjApCi0jZGVmaW5lIFNMQl9WU0lEX0xQXzExCQlBU01fQ09OU1QoMHgwMDAwMDAwMDAwMDAwMDMwKQotI2RlZmluZSBTTEJfVlNJRF9MTFAJCShTTEJfVlNJRF9MfFNMQl9WU0lEX0xQKQotCi0jZGVmaW5lIFNMQl9WU0lEX0tFUk5FTAkJKFNMQl9WU0lEX0tQKQotI2RlZmluZSBTTEJfVlNJRF9VU0VSCQkoU0xCX1ZTSURfS1B8U0xCX1ZTSURfS1N8U0xCX1ZTSURfQykKLQotI2RlZmluZSBTTEJJRV9DCQkJKDB4MDgwMDAwMDApCi0KLS8qCi0gKiBIYXNoIHRhYmxlCi0gKi8KLQotI2RlZmluZSBIUFRFU19QRVJfR1JPVVAgOAotCi0jZGVmaW5lIEhQVEVfVl9BVlBOX1NISUZUCTcKLSNkZWZpbmUgSFBURV9WX0FWUE4JCUFTTV9DT05TVCgweGZmZmZmZmZmZmZmZmZmODApCi0jZGVmaW5lIEhQVEVfVl9BVlBOX1ZBTCh4KQkoKCh4KSAmIEhQVEVfVl9BVlBOKSA+PiBIUFRFX1ZfQVZQTl9TSElGVCkKLSNkZWZpbmUgSFBURV9WX0NPTVBBUkUoeCx5KQkoISgoKHgpIF4gKHkpKSAmIEhQVEVfVl9BVlBOKSkKLSNkZWZpbmUgSFBURV9WX0JPTFRFRAkJQVNNX0NPTlNUKDB4MDAwMDAwMDAwMDAwMDAxMCkKLSNkZWZpbmUgSFBURV9WX0xPQ0sJCUFTTV9DT05TVCgweDAwMDAwMDAwMDAwMDAwMDgpCi0jZGVmaW5lIEhQVEVfVl9MQVJHRQkJQVNNX0NPTlNUKDB4MDAwMDAwMDAwMDAwMDAwNCkKLSNkZWZpbmUgSFBURV9WX1NFQ09OREFSWQlBU01fQ09OU1QoMHgwMDAwMDAwMDAwMDAwMDAyKQotI2RlZmluZSBIUFRFX1ZfVkFMSUQJCUFTTV9DT05TVCgweDAwMDAwMDAwMDAwMDAwMDEpCi0KLSNkZWZpbmUgSFBURV9SX1BQMAkJQVNNX0NPTlNUKDB4ODAwMDAwMDAwMDAwMDAwMCkKLSNkZWZpbmUgSFBURV9SX1RTCQlBU01fQ09OU1QoMHg0MDAwMDAwMDAwMDAwMDAwKQotI2RlZmluZSBIUFRFX1JfUlBOX1NISUZUCTEyCi0jZGVmaW5lIEhQVEVfUl9SUE4JCUFTTV9DT05TVCgweDNmZmZmZmZmZmZmZmYwMDApCi0jZGVmaW5lIEhQVEVfUl9GTEFHUwkJQVNNX0NPTlNUKDB4MDAwMDAwMDAwMDAwMDNmZikKLSNkZWZpbmUgSFBURV9SX1BQCQlBU01fQ09OU1QoMHgwMDAwMDAwMDAwMDAwMDAzKQotI2RlZmluZSBIUFRFX1JfTgkJQVNNX0NPTlNUKDB4MDAwMDAwMDAwMDAwMDAwNCkKLSNkZWZpbmUgSFBURV9SX0MJCUFTTV9DT05TVCgweDAwMDAwMDAwMDAwMDAwODApCi0jZGVmaW5lIEhQVEVfUl9SCQlBU01fQ09OU1QoMHgwMDAwMDAwMDAwMDAwMTAwKQotCi0vKiBWYWx1ZXMgZm9yIFBQIChhc3N1bWVzIEtzPTAsIEtwPTEpICovCi0vKiBwcDAgd2lsbCBhbHdheXMgYmUgMCBmb3IgbGludXggICAgICovCi0jZGVmaW5lIFBQX1JXWFgJMAkvKiBTdXBlcnZpc29yIHJlYWQvd3JpdGUsIFVzZXIgbm9uZSAqLwotI2RlZmluZSBQUF9SV1JYIDEJLyogU3VwZXJ2aXNvciByZWFkL3dyaXRlLCBVc2VyIHJlYWQgKi8KLSNkZWZpbmUgUFBfUldSVyAyCS8qIFN1cGVydmlzb3IgcmVhZC93cml0ZSwgVXNlciByZWFkL3dyaXRlICovCi0jZGVmaW5lIFBQX1JYUlggMwkvKiBTdXBlcnZpc29yIHJlYWQsICAgICAgIFVzZXIgcmVhZCAqLwotCi0jaWZuZGVmIF9fQVNTRU1CTFlfXwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JdW5zaWduZWQgbG9uZyB2OwotCXVuc2lnbmVkIGxvbmcgcjsKLX0gaHB0ZV90OwotCi1leHRlcm4gaHB0ZV90ICpodGFiX2FkZHJlc3M7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBodGFiX3NpemVfYnl0ZXM7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBodGFiX2hhc2hfbWFzazsKLQotLyoKLSAqIFBhZ2Ugc2l6ZSBkZWZpbml0aW9uCi0gKgotICogICAgc2hpZnQgOiBpcyB0aGUgIlBBR0VfU0hJRlQiIHZhbHVlIGZvciB0aGF0IHBhZ2Ugc2l6ZQotICogICAgc2xscCAgOiBpcyBhIGJpdCBtYXNrIHdpdGggdGhlIHZhbHVlIG9mIFNMQiBMIHx8IExQIHRvIGJlIG9yJ2VkCi0gKiAgICAgICAgICAgIGRpcmVjdGx5IHRvIGEgc2xibXRlICJ2c2lkIiB2YWx1ZQotICogICAgcGVuYyAgOiBpcyB0aGUgSFBURSBlbmNvZGluZyBtYXNrIGZvciB0aGUgIkxQIiBmaWVsZDoKLSAqCi0gKi8KLXN0cnVjdCBtbXVfcHNpemVfZGVmCi17Ci0JdW5zaWduZWQgaW50CXNoaWZ0OwkvKiBudW1iZXIgb2YgYml0cyAqLwotCXVuc2lnbmVkIGludAlwZW5jOwkvKiBIUFRFIGVuY29kaW5nICovCi0JdW5zaWduZWQgaW50CXRsYmllbDsJLyogdGxiaWVsIHN1cHBvcnRlZCBmb3IgdGhhdCBwYWdlIHNpemUgKi8KLQl1bnNpZ25lZCBsb25nCWF2cG5tOwkvKiBiaXRzIHRvIG1hc2sgb3V0IGluIEFWUE4gaW4gdGhlIEhQVEUgKi8KLQl1bnNpZ25lZCBsb25nCXNsbHA7CS8qIFNMQiBMfHxMUCAoZXhhY3QgbWFzayB0byB1c2UgaW4gc2xibXRlKSAqLwotfTsKLQotI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLwotCi0vKgotICogVGhlIGtlcm5lbCB1c2UgdGhlIGNvbnN0YW50cyBiZWxvdyB0byBpbmRleCBpbiB0aGUgcGFnZSBzaXplcyBhcnJheS4KLSAqIFRoZSB1c2Ugb2YgZml4ZWQgY29uc3RhbnRzIGZvciB0aGlzIHB1cnBvc2UgaXMgYmV0dGVyIGZvciBwZXJmb3JtYW5jZXMKLSAqIG9mIHRoZSBsb3cgbGV2ZWwgaGFzaCByZWZpbGwgaGFuZGxlcnMuCi0gKgotICogQSBub24gc3VwcG9ydGVkIHBhZ2Ugc2l6ZSBoYXMgYSAic2hpZnQiIGZpZWxkIHNldCB0byAwCi0gKgotICogQW55IG5ldyBwYWdlIHNpemUgYmVpbmcgaW1wbGVtZW50ZWQgY2FuIGdldCBhIG5ldyBlbnRyeSBpbiBoZXJlLiBXaGV0aGVyCi0gKiB0aGUga2VybmVsIHdpbGwgdXNlIGl0IG9yIG5vdCBpcyBhIGRpZmZlcmVudCBtYXR0ZXIgdGhvdWdoLiBUaGUgYWN0dWFsIHBhZ2UKLSAqIHNpemUgdXNlZCBieSBodWdldGxiZnMgaXMgbm90IGRlZmluZWQgaGVyZSBhbmQgbWF5IGJlIG1hZGUgdmFyaWFibGUKLSAqLwotCi0jZGVmaW5lIE1NVV9QQUdFXzRLCQkwCS8qIDRLICovCi0jZGVmaW5lIE1NVV9QQUdFXzY0SwkJMQkvKiA2NEsgKi8KLSNkZWZpbmUgTU1VX1BBR0VfNjRLX0FQCQkyCS8qIDY0SyBBZG1peGVkIChpbiBhIDRLIHNlZ21lbnQpICovCi0jZGVmaW5lIE1NVV9QQUdFXzFNCQkzCS8qIDFNICovCi0jZGVmaW5lIE1NVV9QQUdFXzE2TQkJNAkvKiAxNk0gKi8KLSNkZWZpbmUgTU1VX1BBR0VfMTZHCQk1CS8qIDE2RyAqLwotI2RlZmluZSBNTVVfUEFHRV9DT1VOVAkJNgotCi0jaWZuZGVmIF9fQVNTRU1CTFlfXwotCi0vKgotICogVGhlIGN1cnJlbnQgc3lzdGVtIHBhZ2Ugc2l6ZXMKLSAqLwotZXh0ZXJuIHN0cnVjdCBtbXVfcHNpemVfZGVmIG1tdV9wc2l6ZV9kZWZzW01NVV9QQUdFX0NPVU5UXTsKLWV4dGVybiBpbnQgbW11X2xpbmVhcl9wc2l6ZTsKLWV4dGVybiBpbnQgbW11X3ZpcnR1YWxfcHNpemU7Ci1leHRlcm4gaW50IG1tdV92bWFsbG9jX3BzaXplOwotZXh0ZXJuIGludCBtbXVfaW9fcHNpemU7Ci0KLS8qCi0gKiBJZiB0aGUgcHJvY2Vzc29yIHN1cHBvcnRzIDY0ayBub3JtYWwgcGFnZXMgYnV0IG5vdCA2NGsgY2FjaGUKLSAqIGluaGliaXRlZCBwYWdlcywgd2UgaGF2ZSB0byBiZSBwcmVwYXJlZCB0byBzd2l0Y2ggcHJvY2Vzc2VzCi0gKiB0byB1c2UgNGsgcGFnZXMgd2hlbiB0aGV5IGNyZWF0ZSBjYWNoZS1pbmhpYml0ZWQgbWFwcGluZ3MuCi0gKiBJZiB0aGlzIGlzIHRoZSBjYXNlLCBtbXVfY2lfcmVzdHJpY3Rpb25zIHdpbGwgYmUgc2V0IHRvIDEuCi0gKi8KLWV4dGVybiBpbnQgbW11X2NpX3Jlc3RyaWN0aW9uczsKLQotI2lmZGVmIENPTkZJR19IVUdFVExCX1BBR0UKLS8qCi0gKiBUaGUgcGFnZSBzaXplIGluZGV4IG9mIHRoZSBodWdlIHBhZ2VzIGZvciB1c2UgYnkgaHVnZXRsYmZzCi0gKi8KLWV4dGVybiBpbnQgbW11X2h1Z2VfcHNpemU7Ci0KLSNlbmRpZiAvKiBDT05GSUdfSFVHRVRMQl9QQUdFICovCi0KLS8qCi0gKiBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIEFWUE4gYW5kIEwgZmllbGRzIG9mIHRoZSBIUFRFICBhcHByb3ByaWF0ZWx5Ci0gKiBmb3IgdGhlIHBhZ2Ugc2l6ZQotICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgaHB0ZV9lbmNvZGVfdih1bnNpZ25lZCBsb25nIHZhLCBpbnQgcHNpemUpCi17Ci0JdW5zaWduZWQgbG9uZyB2ID0KLQl2ID0gKHZhID4+IDIzKSAmIH4obW11X3BzaXplX2RlZnNbcHNpemVdLmF2cG5tKTsKLQl2IDw8PSBIUFRFX1ZfQVZQTl9TSElGVDsKLQlpZiAocHNpemUgIT0gTU1VX1BBR0VfNEspCi0JCXYgfD0gSFBURV9WX0xBUkdFOwotCXJldHVybiB2OwotfQotCi0vKgotICogVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBBUlBOLCBhbmQgTFAgZmllbGRzIG9mIHRoZSBIUFRFIGFwcHJvcHJpYXRlbHkKLSAqIGZvciB0aGUgcGFnZSBzaXplLiBXZSBhc3N1bWUgdGhlIHBhIGlzIGFscmVhZHkgImNsZWFuIiB0aGF0IGlzIHByb3Blcmx5Ci0gKiBhbGlnbmVkIGZvciB0aGUgcmVxdWVzdGVkIHBhZ2Ugc2l6ZQotICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgaHB0ZV9lbmNvZGVfcih1bnNpZ25lZCBsb25nIHBhLCBpbnQgcHNpemUpCi17Ci0JdW5zaWduZWQgbG9uZyByOwotCi0JLyogQSA0SyBwYWdlIG5lZWRzIG5vIHNwZWNpYWwgZW5jb2RpbmcgKi8KLQlpZiAocHNpemUgPT0gTU1VX1BBR0VfNEspCi0JCXJldHVybiBwYSAmIEhQVEVfUl9SUE47Ci0JZWxzZSB7Ci0JCXVuc2lnbmVkIGludCBwZW5jID0gbW11X3BzaXplX2RlZnNbcHNpemVdLnBlbmM7Ci0JCXVuc2lnbmVkIGludCBzaGlmdCA9IG1tdV9wc2l6ZV9kZWZzW3BzaXplXS5zaGlmdDsKLQkJcmV0dXJuIChwYSAmIH4oKDF1bCA8PCBzaGlmdCkgLSAxKSkgfCAocGVuYyA8PCAxMik7Ci0JfQotCXJldHVybiByOwotfQotCi0vKgotICogVGhpcyBoYXNoZXMgYSB2aXJ0dWFsIGFkZHJlc3MgZm9yIGEgMjU2TWIgc2VnbWVudCBvbmx5IGZvciBub3cKLSAqLwotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgaHB0X2hhc2godW5zaWduZWQgbG9uZyB2YSwgdW5zaWduZWQgaW50IHNoaWZ0KQotewotCXJldHVybiAoKHZhID4+IDI4KSAmIDB4N2ZmZmZmZmZmZlVMKSBeICgodmEgJiAweDBmZmZmZmZmVUwpID4+IHNoaWZ0KTsKLX0KLQotZXh0ZXJuIGludCBfX2hhc2hfcGFnZV80Syh1bnNpZ25lZCBsb25nIGVhLCB1bnNpZ25lZCBsb25nIGFjY2VzcywKLQkJCSAgdW5zaWduZWQgbG9uZyB2c2lkLCBwdGVfdCAqcHRlcCwgdW5zaWduZWQgbG9uZyB0cmFwLAotCQkJICB1bnNpZ25lZCBpbnQgbG9jYWwpOwotZXh0ZXJuIGludCBfX2hhc2hfcGFnZV82NEsodW5zaWduZWQgbG9uZyBlYSwgdW5zaWduZWQgbG9uZyBhY2Nlc3MsCi0JCQkgICB1bnNpZ25lZCBsb25nIHZzaWQsIHB0ZV90ICpwdGVwLCB1bnNpZ25lZCBsb25nIHRyYXAsCi0JCQkgICB1bnNpZ25lZCBpbnQgbG9jYWwpOwotc3RydWN0IG1tX3N0cnVjdDsKLWV4dGVybiBpbnQgaGFzaF9odWdlX3BhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWNjZXNzLAotCQkJICB1bnNpZ25lZCBsb25nIGVhLCB1bnNpZ25lZCBsb25nIHZzaWQsIGludCBsb2NhbCwKLQkJCSAgdW5zaWduZWQgbG9uZyB0cmFwKTsKLQotZXh0ZXJuIGludCBodGFiX2JvbHRfbWFwcGluZyh1bnNpZ25lZCBsb25nIHZzdGFydCwgdW5zaWduZWQgbG9uZyB2ZW5kLAotCQkJICAgICB1bnNpZ25lZCBsb25nIHBzdGFydCwgdW5zaWduZWQgbG9uZyBtb2RlLAotCQkJICAgICBpbnQgcHNpemUpOwotCi1leHRlcm4gdm9pZCBodGFiX2luaXRpYWxpemUodm9pZCk7Ci1leHRlcm4gdm9pZCBodGFiX2luaXRpYWxpemVfc2Vjb25kYXJ5KHZvaWQpOwotZXh0ZXJuIHZvaWQgaHB0ZV9pbml0X25hdGl2ZSh2b2lkKTsKLWV4dGVybiB2b2lkIGhwdGVfaW5pdF9scGFyKHZvaWQpOwotZXh0ZXJuIHZvaWQgaHB0ZV9pbml0X2lTZXJpZXModm9pZCk7Ci1leHRlcm4gdm9pZCBocHRlX2luaXRfYmVhdCh2b2lkKTsKLQotZXh0ZXJuIHZvaWQgc3RhYnNfYWxsb2Modm9pZCk7Ci1leHRlcm4gdm9pZCBzbGJfaW5pdGlhbGl6ZSh2b2lkKTsKLWV4dGVybiB2b2lkIHNsYl9mbHVzaF9hbmRfcmVib2x0KHZvaWQpOwotZXh0ZXJuIHZvaWQgc3RhYl9pbml0aWFsaXplKHVuc2lnbmVkIGxvbmcgc3RhYik7Ci0KLSNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KLQotLyoKLSAqIFZTSUQgYWxsb2NhdGlvbgotICoKLSAqIFdlIGZpcnN0IGdlbmVyYXRlIGEgMzYtYml0ICJwcm90by1WU0lEIi4gIEZvciBrZXJuZWwgYWRkcmVzc2VzIHRoaXMKLSAqIGlzIGVxdWFsIHRvIHRoZSBFU0lELCBmb3IgdXNlciBhZGRyZXNzZXMgaXQgaXM6Ci0gKgkoY29udGV4dCA8PCAxNSkgfCAoZXNpZCAmIDB4N2ZmZikKLSAqCi0gKiBUaGUgdHdvIGZvcm1zIGFyZSBkaXN0aW5ndWlzaGFibGUgYmVjYXVzZSB0aGUgdG9wIGJpdCBpcyAwIGZvciB1c2VyCi0gKiBhZGRyZXNzZXMsIHdoZXJlYXMgdGhlIHRvcCB0d28gYml0cyBhcmUgMSBmb3Iga2VybmVsIGFkZHJlc3Nlcy4KLSAqIFByb3RvLVZTSURzIHdpdGggdGhlIHRvcCB0d28gYml0cyBlcXVhbCB0byAwYjEwIGFyZSByZXNlcnZlZCBmb3IKLSAqIG5vdy4KLSAqCi0gKiBUaGUgcHJvdG8tVlNJRHMgYXJlIHRoZW4gc2NyYW1ibGVkIGludG8gcmVhbCBWU0lEcyB3aXRoIHRoZQotICogbXVsdGlwbGljYXRpdmUgaGFzaDoKLSAqCi0gKglWU0lEID0gKHByb3RvLVZTSUQgKiBWU0lEX01VTFRJUExJRVIpICUgVlNJRF9NT0RVTFVTCi0gKgl3aGVyZQlWU0lEX01VTFRJUExJRVIgPSAyNjg0MzUzOTkgPSAweEZGRkZGQzcKLSAqCQlWU0lEX01PRFVMVVMgPSAyXjM2LTEgPSAweEZGRkZGRkZGRgotICoKLSAqIFRoaXMgc2NyYW1ibGUgaXMgb25seSB3ZWxsIGRlZmluZWQgZm9yIHByb3RvLVZTSURzIGJlbG93Ci0gKiAweEZGRkZGRkZGRiwgc28gYm90aCBwcm90by1WU0lEIGFuZCBhY3R1YWwgVlNJRCAweEZGRkZGRkZGRiBhcmUKLSAqIHJlc2VydmVkLiAgVlNJRF9NVUxUSVBMSUVSIGlzIHByaW1lLCBzbyBpbiBwYXJ0aWN1bGFyIGl0IGlzCi0gKiBjby1wcmltZSB0byBWU0lEX01PRFVMVVMsIG1ha2luZyB0aGlzIGEgMToxIHNjcmFtYmxpbmcgZnVuY3Rpb24uCi0gKiBCZWNhdXNlIHRoZSBtb2R1bHVzIGlzIDJebi0xIHdlIGNhbiBjb21wdXRlIGl0IGVmZmljaWVudGx5IHdpdGhvdXQKLSAqIGEgZGl2aWRlIG9yIGV4dHJhIG11bHRpcGx5IChzZWUgYmVsb3cpLgotICoKLSAqIFRoaXMgc2NoZW1lIGhhcyBzZXZlcmFsIGFkdmFudGFnZXMgb3ZlciBvbGRlciBtZXRob2RzOgotICoKLSAqIAktIFdlIGhhdmUgVlNJRHMgYWxsb2NhdGVkIGZvciBldmVyeSBrZXJuZWwgYWRkcmVzcwotICogKGkuZS4gZXZlcnl0aGluZyBhYm92ZSAweEMwMDAwMDAwMDAwMDAwMDApLCBleGNlcHQgdGhlIHZlcnkgdG9wCi0gKiBzZWdtZW50LCB3aGljaCBzaW1wbGlmaWVzIHNldmVyYWwgdGhpbmdzLgotICoKLSAqIAktIFdlIGFsbG93IGZvciAxNSBzaWduaWZpY2FudCBiaXRzIG9mIEVTSUQgYW5kIDIwIGJpdHMgb2YKLSAqIGNvbnRleHQgZm9yIHVzZXIgYWRkcmVzc2VzLiAgaS5lLiA4VCAoNDMgYml0cykgb2YgYWRkcmVzcyBzcGFjZSBmb3IKLSAqIHVwIHRvIDFNIGNvbnRleHRzIChhbHRob3VnaCB0aGUgcGFnZSB0YWJsZSBzdHJ1Y3R1cmUgYW5kIGNvbnRleHQKLSAqIGFsbG9jYXRpb24gd2lsbCBuZWVkIGNoYW5nZXMgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhpcykuCi0gKgotICogCS0gVGhlIHNjcmFtYmxlIGZ1bmN0aW9uIGdpdmVzIHJvYnVzdCBzY2F0dGVyaW5nIGluIHRoZSBoYXNoCi0gKiB0YWJsZSAoYXQgbGVhc3QgYmFzZWQgb24gc29tZSBpbml0aWFsIHJlc3VsdHMpLiAgVGhlIHByZXZpb3VzCi0gKiBtZXRob2Qgd2FzIG1vcmUgc3VzY2VwdGlibGUgdG8gcGF0aG9sb2dpY2FsIGNhc2VzIGdpdmluZyBleGNlc3NpdmUKLSAqIGhhc2ggY29sbGlzaW9ucy4KLSAqLwotLyoKLSAqIFdBUk5JTkcgLSBJZiB5b3UgY2hhbmdlIHRoZXNlIHlvdSBtdXN0IG1ha2Ugc3VyZSB0aGUgYXNtCi0gKiBpbXBsZW1lbnRhdGlvbnMgaW4gc2xiX2FsbG9jYXRlIChzbGJfbG93LlMpLCBkb19zdGFiX2JvbHRlZAotICogKGhlYWQuUykgYW5kIEFTTV9WU0lEX1NDUkFNQkxFIChiZWxvdykgYXJlIGNoYW5nZWQgYWNjb3JkaW5nbHkuCi0gKgotICogWW91J2xsIGFsc28gbmVlZCB0byBjaGFuZ2UgdGhlIHByZWNvbXB1dGVkIFZTSUQgdmFsdWVzIGluIGhlYWQuUwotICogd2hpY2ggYXJlIHVzZWQgYnkgdGhlIGlTZXJpZXMgZmlybXdhcmUuCi0gKi8KLQotI2RlZmluZSBWU0lEX01VTFRJUExJRVIJQVNNX0NPTlNUKDIwMDczMDEzOSkJLyogMjgtYml0IHByaW1lICovCi0jZGVmaW5lIFZTSURfQklUUwkzNgotI2RlZmluZSBWU0lEX01PRFVMVVMJKCgxVUw8PFZTSURfQklUUyktMSkKLQotI2RlZmluZSBDT05URVhUX0JJVFMJMTkKLSNkZWZpbmUgVVNFUl9FU0lEX0JJVFMJMTYKLQotI2RlZmluZSBVU0VSX1ZTSURfUkFOR0UJKDFVTCA8PCAoVVNFUl9FU0lEX0JJVFMgKyBTSURfU0hJRlQpKQotCi0vKgotICogVGhpcyBtYWNybyBnZW5lcmF0ZXMgYXNtIGNvZGUgdG8gY29tcHV0ZSB0aGUgVlNJRCBzY3JhbWJsZQotICogZnVuY3Rpb24uICBVc2VkIGluIHNsYl9hbGxvY2F0ZSgpIGFuZCBkb19zdGFiX2JvbHRlZC4gIFRoZSBmdW5jdGlvbgotICogY29tcHV0ZWQgaXM6IChwcm90b3ZzaWQqVlNJRF9NVUxUSVBMSUVSKSAlIFZTSURfTU9EVUxVUwotICoKLSAqCXJ0ID0gcmVnaXN0ZXIgY29udGluYWluZyB0aGUgcHJvdG8tVlNJRCBhbmQgaW50byB3aGljaCB0aGUKLSAqCQlWU0lEIHdpbGwgYmUgc3RvcmVkCi0gKglyeCA9IHNjcmF0Y2ggcmVnaXN0ZXIgKGNsb2JiZXJlZCkKLSAqCi0gKiAJLSBydCBhbmQgcnggbXVzdCBiZSBkaWZmZXJlbnQgcmVnaXN0ZXJzCi0gKiAJLSBUaGUgYW5zd2VyIHdpbGwgZW5kIHVwIGluIHRoZSBsb3cgMzYgYml0cyBvZiBydC4gIFRoZSBoaWdoZXIKLSAqIAkgIGJpdHMgbWF5IGNvbnRhaW4gb3RoZXIgZ2FyYmFnZSwgc28geW91IG1heSBuZWVkIHRvIG1hc2sgdGhlCi0gKiAJICByZXN1bHQuCi0gKi8KLSNkZWZpbmUgQVNNX1ZTSURfU0NSQU1CTEUocnQsIHJ4KQlcCi0JbGlzCXJ4LFZTSURfTVVMVElQTElFUkBoOwkJCQkJXAotCW9yaQlyeCxyeCxWU0lEX01VTFRJUExJRVJAbDsJCQkJXAotCW11bGxkCXJ0LHJ0LHJ4OwkJLyogcnQgPSBydCAqIE1VTFRJUExJRVIgKi8JXAotCQkJCQkJCQkJXAotCXNyZGkJcngscnQsVlNJRF9CSVRTOwkJCQkJXAotCWNscmxkaQlydCxydCwoNjQtVlNJRF9CSVRTKTsJCQkJCVwKLQlhZGQJcnQscnQscng7CQkvKiBhZGQgaGlnaCBhbmQgbG93IGJpdHMgKi8JXAotCS8qIE5vdywgcjMgPT0gVlNJRCAobW9kIDJeMzYtMSksIGFuZCBsaWVzIGJldHdlZW4gMCBhbmQJCVwKLQkgKiAyXjM2LTErMl4yOC0xLiAgVGhhdCBpbiBwYXJ0aWN1bGFyIG1lYW5zIHRoYXQgaWYgcjMgPj0JXAotCSAqIDJeMzYtMSwgdGhlbiByMysxIGhhcyB0aGUgMl4zNiBiaXQgc2V0LiAgU28sIGlmIHIzKzEgaGFzCVwKLQkgKiB0aGUgYml0IGNsZWFyLCByMyBhbHJlYWR5IGhhcyB0aGUgYW5zd2VyIHdlIHdhbnQsIGlmIGl0CVwKLQkgKiBkb2Vzbid0LCB0aGUgYW5zd2VyIGlzIHRoZSBsb3cgMzYgYml0cyBvZiByMysxLiAgU28gaW4gYWxsCVwKLQkgKiBjYXNlcyB0aGUgYW5zd2VyIGlzIHRoZSBsb3cgMzYgYml0cyBvZiAocjMgKyAoKHIzKzEpID4+IDM2KSkqL1wKLQlhZGRpCXJ4LHJ0LDE7CQkJCQkJXAotCXNyZGkJcngscngsVlNJRF9CSVRTOwkvKiBleHRyYWN0IDJeMzYgYml0ICovCQlcCi0JYWRkCXJ0LHJ0LHJ4Ci0KLQotI2lmbmRlZiBfX0FTU0VNQkxZX18KLQotdHlwZWRlZiB1bnNpZ25lZCBsb25nIG1tX2NvbnRleHRfaWRfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotCW1tX2NvbnRleHRfaWRfdCBpZDsKLQl1MTYgdXNlcl9wc2l6ZTsJCQkvKiBwYWdlIHNpemUgaW5kZXggKi8KLQl1MTYgc2xscDsJCQkvKiBTTEIgZW50cnkgcGFnZSBzaXplIGVuY29kaW5nICovCi0jaWZkZWYgQ09ORklHX0hVR0VUTEJfUEFHRQotCXUxNiBsb3dfaHRsYl9hcmVhcywgaGlnaF9odGxiX2FyZWFzOworLyogMzItYml0LiAgRklYTUU6IHNwbGl0IHVwIHRoZSAzMi1iaXQgTU1VIHR5cGVzLCBhbmQgcmV2aXNlIGZvcgorICogYXJjaC9wb3dlcnBjICovCisjICBpbmNsdWRlIDxhc20tcHBjL21tdS5oPgogI2VuZGlmCi0JdW5zaWduZWQgbG9uZyB2ZHNvX2Jhc2U7Ci19IG1tX2NvbnRleHRfdDsKIAotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgdnNpZF9zY3JhbWJsZSh1bnNpZ25lZCBsb25nIHByb3RvdnNpZCkKLXsKLSNpZiAwCi0JLyogVGhlIGNvZGUgYmVsb3cgaXMgZXF1aXZhbGVudCB0byB0aGlzIGZ1bmN0aW9uIGZvciBhcmd1bWVudHMKLQkgKiA8IDJeVlNJRF9CSVRTLCB3aGljaCBpcyBhbGwgdGhpcyBzaG91bGQgZXZlciBiZSBjYWxsZWQKLQkgKiB3aXRoLiAgSG93ZXZlciBnY2MgaXMgbm90IGNsZXZlciBlbm91Z2ggdG8gY29tcHV0ZSB0aGUKLQkgKiBtb2R1bHVzICgyXm4tMSkgd2l0aG91dCBhIHNlY29uZCBtdWx0aXBseS4gKi8KLQlyZXR1cm4gKChwcm90b3ZzaWQgKiBWU0lEX01VTFRJUExJRVIpICUgVlNJRF9NT0RVTFVTKTsKLSNlbHNlIC8qIDEgKi8KLQl1bnNpZ25lZCBsb25nIHg7Ci0KLQl4ID0gcHJvdG92c2lkICogVlNJRF9NVUxUSVBMSUVSOwotCXggPSAoeCA+PiBWU0lEX0JJVFMpICsgKHggJiBWU0lEX01PRFVMVVMpOwotCXJldHVybiAoeCArICgoeCsxKSA+PiBWU0lEX0JJVFMpKSAmIFZTSURfTU9EVUxVUzsKLSNlbmRpZiAvKiAxICovCi19Ci0KLS8qIFRoaXMgaXMgb25seSB2YWxpZCBmb3IgYWRkcmVzc2VzID49IEtFUk5FTEJBU0UgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBnZXRfa2VybmVsX3ZzaWQodW5zaWduZWQgbG9uZyBlYSkKLXsKLQlyZXR1cm4gdnNpZF9zY3JhbWJsZShlYSA+PiBTSURfU0hJRlQpOwotfQotCi0vKiBUaGlzIGlzIG9ubHkgdmFsaWQgZm9yIHVzZXIgYWRkcmVzc2VzICh3aGljaCBhcmUgYmVsb3cgMl40MSkgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBnZXRfdnNpZCh1bnNpZ25lZCBsb25nIGNvbnRleHQsIHVuc2lnbmVkIGxvbmcgZWEpCi17Ci0JcmV0dXJuIHZzaWRfc2NyYW1ibGUoKGNvbnRleHQgPDwgVVNFUl9FU0lEX0JJVFMpCi0JCQkgICAgIHwgKGVhID4+IFNJRF9TSElGVCkpOwotfQotCi0jZGVmaW5lIFZTSURfU0NSQU1CTEUocHZzaWQpCSgoKHB2c2lkKSAqIFZTSURfTVVMVElQTElFUikgJSBWU0lEX01PRFVMVVMpCi0jZGVmaW5lIEtFUk5FTF9WU0lEKGVhKQkJVlNJRF9TQ1JBTUJMRShHRVRfRVNJRChlYSkpCi0KLS8qIFBoeXNpY2FsIGFkZHJlc3MgdXNlZCBieSBzb21lIElPIGZ1bmN0aW9ucyAqLwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIHBoeXNfYWRkcl90OwotCi0KLSNlbmRpZiAvKiBfX0FTU0VNQkxZICovCi0KLSNlbmRpZiAvKiBDT05GSUdfUFBDNjQgKi8KICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAjZW5kaWYgLyogX0FTTV9QT1dFUlBDX01NVV9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9tcGljLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL21waWMuaAppbmRleCBjYjIwNGE3Li5lNGQ1ZmM1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL21waWMuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL21waWMuaApAQCAtMTk5LDcgKzE5OSw3IEBACiB9OwogCiAKLSNpZmRlZiBDT05GSUdfTVBJQ19CUk9LRU5fVTMKKyNpZmRlZiBDT05GSUdfTVBJQ19VM19IVF9JUlFTCiAvKiBGaXh1cCB0YWJsZSBlbnRyeSAqLwogc3RydWN0IG1waWNfaXJxX2ZpeHVwCiB7CkBAIC0yMDgsNyArMjA4LDcgQEAKIAl1MzIJCWRhdGE7CiAJdW5zaWduZWQgaW50CWluZGV4OwogfTsKLSNlbmRpZiAvKiBDT05GSUdfTVBJQ19CUk9LRU5fVTMgKi8KKyNlbmRpZiAvKiBDT05GSUdfTVBJQ19VM19IVF9JUlFTICovCiAKIAogZW51bSBtcGljX3JlZ190eXBlIHsKQEAgLTIzOSw3ICsyMzksNyBAQAogCiAJLyogVGhlICJsaW51eCIgY29udHJvbGxlciBzdHJ1Y3QgKi8KIAlzdHJ1Y3QgaXJxX2NoaXAJCWhjX2lycTsKLSNpZmRlZiBDT05GSUdfTVBJQ19CUk9LRU5fVTMKKyNpZmRlZiBDT05GSUdfTVBJQ19VM19IVF9JUlFTCiAJc3RydWN0IGlycV9jaGlwCQloY19odF9pcnE7CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfU01QCkBAIC0yNjgsNyArMjY4LDcgQEAKIAkvKiBTcHVyaW91cyB2ZWN0b3IgdG8gcHJvZ3JhbSBpbnRvIHVudXNlZCBzb3VyY2VzICovCiAJdW5zaWduZWQgaW50CQlzcHVyaW91c192ZWM7CiAKLSNpZmRlZiBDT05GSUdfTVBJQ19CUk9LRU5fVTMKKyNpZmRlZiBDT05GSUdfTVBJQ19VM19IVF9JUlFTCiAJLyogVGhlIGZpeHVwIHRhYmxlICovCiAJc3RydWN0IG1waWNfaXJxX2ZpeHVwCSpmaXh1cHM7CiAJc3BpbmxvY2tfdAkJZml4dXBfbG9jazsKQEAgLTMxMyw3ICszMTMsNyBAQAogLyogU2V0IHRoaXMgZm9yIGEgYmlnLWVuZGlhbiBNUElDICovCiAjZGVmaW5lIE1QSUNfQklHX0VORElBTgkJCTB4MDAwMDAwMDIKIC8qIEJyb2tlbiBVMyBNUElDICovCi0jZGVmaW5lIE1QSUNfQlJPS0VOX1UzCQkJMHgwMDAwMDAwNAorI2RlZmluZSBNUElDX1UzX0hUX0lSUVMJCQkweDAwMDAwMDA0CiAvKiBCcm9rZW4gSVBJIHJlZ2lzdGVycyAoYXV0b2RldGVjdGVkKSAqLwogI2RlZmluZSBNUElDX0JST0tFTl9JUEkJCQkweDAwMDAwMDA4CiAvKiBNUElDIHdhbnRzIGEgcmVzZXQgKi8KQEAgLTM1Miw3ICszNTIsNyBAQAogICogQHNlbnNlc19udW06IG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBhcnJheQogICoKICAqIE5vdGUgYWJvdXQgdGhlIHNlbnNlIGFycmF5LiBJZiBub25lIGlzIHBhc3NlZCwgYWxsIGludGVycnVwdHMgYXJlCi0gKiBzZXR1cCB0byBiZSBsZXZlbCBuZWdhdGl2ZSB1bmxlc3MgTVBJQ19CUk9LRU5fVTMgaXMgc2V0IGluIHdoaWNoCisgKiBzZXR1cCB0byBiZSBsZXZlbCBuZWdhdGl2ZSB1bmxlc3MgTVBJQ19VM19IVF9JUlFTIGlzIHNldCBpbiB3aGljaAogICogY2FzZSB0aGV5IGFyZSBlZGdlIHBvc2l0aXZlIChhbmQgdGhlIGFycmF5IGlzIGlnbm9yZWQgYW55d2F5KS4KICAqIFRoZSB2YWx1ZXMgaW4gdGhlIGFycmF5IHN0YXJ0IGF0IHRoZSBmaXJzdCBzb3VyY2Ugb2YgdGhlIE1QSUMsCiAgKiB0aGF0IGlzIHNlbnNlc1swXSBjb3JyZXNwb25kIHRvIGxpbnV4IGlycSAiaXJxX29mZnNldCIuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL29mX2RldmljZS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9vZl9kZXZpY2UuaAppbmRleCBhODg5YjIwLi40ZjFhYWJlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL29mX2RldmljZS5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvb2ZfZGV2aWNlLmgKQEAgLTMyLDUgKzMyLDggQEAKIGV4dGVybiB2b2lkIG9mX2RldmljZV91bnJlZ2lzdGVyKHN0cnVjdCBvZl9kZXZpY2UgKm9mZGV2KTsKIGV4dGVybiB2b2lkIG9mX3JlbGVhc2VfZGV2KHN0cnVjdCBkZXZpY2UgKmRldik7CiAKK2V4dGVybiBpbnQgb2ZfZGV2aWNlX3VldmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJY2hhciAqKmVudnAsIGludCBudW1fZW52cCwgY2hhciAqYnVmZmVyLCBpbnQgYnVmZmVyX3NpemUpOworCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogI2VuZGlmIC8qIF9BU01fUE9XRVJQQ19PRl9ERVZJQ0VfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9vcHJvZmlsZV9pbXBsLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL29wcm9maWxlX2ltcGwuaAppbmRleCA5NGMwYWQyLi44ZDZiNDdmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL29wcm9maWxlX2ltcGwuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL29wcm9maWxlX2ltcGwuaApAQCAtNTcsNiArNTcsOCBAQAogZXh0ZXJuIHN0cnVjdCBvcF9wb3dlcnBjX21vZGVsIG9wX21vZGVsX3Bvd2VyNDsKIGV4dGVybiBzdHJ1Y3Qgb3BfcG93ZXJwY19tb2RlbCBvcF9tb2RlbF83NDUwOwogZXh0ZXJuIHN0cnVjdCBvcF9wb3dlcnBjX21vZGVsIG9wX21vZGVsX2NlbGw7CitleHRlcm4gc3RydWN0IG9wX3Bvd2VycGNfbW9kZWwgb3BfbW9kZWxfcGE2dDsKKwogCiAvKiBBbGwgdGhlIGNsYXNzaWMgUFBDIHBhcnRzIHVzZSB0aGVzZSAqLwogc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY2xhc3NpY19jdHJfcmVhZCh1bnNpZ25lZCBpbnQgaSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcGFjYS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wYWNhLmgKaW5kZXggMGQzYWRjMC4uY2Y5NTI3NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wYWNhLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wYWNhLmgKQEAgLTcwLDYgKzcwLDcgQEAKIAlzMTYgaHdfY3B1X2lkOwkJCS8qIFBoeXNpY2FsIHByb2Nlc3NvciBudW1iZXIgKi8KIAl1OCBjcHVfc3RhcnQ7CQkJLyogQXQgc3RhcnR1cCwgcHJvY2Vzc29yIHNwaW5zIHVudGlsICovCiAJCQkJCS8qIHRoaXMgYmVjb21lcyBub24temVyby4gKi8KKwlzdHJ1Y3Qgc2xiX3NoYWRvdyAqc2xiX3NoYWRvd19wdHI7CiAKIAkvKgogCSAqIE5vdywgc3RhcnRpbmcgaW4gY2FjaGVsaW5lIDIsIHRoZSBleGNlcHRpb24gc2F2ZSBhcmVhcwpAQCAtOTMsNiArOTQsNyBAQAogCXU2NCBzdGFiX3JyOwkJCS8qIHN0YWIvc2xiIHJvdW5kLXJvYmluIGNvdW50ZXIgKi8KIAl1NjQgc2F2ZWRfcjE7CQkJLyogcjEgc2F2ZSBmb3IgUlRBUyBjYWxscyAqLwogCXU2NCBzYXZlZF9tc3I7CQkJLyogTVNSIHNhdmVkIGhlcmUgYnkgZW50ZXJfcnRhcyAqLworCXUxNiB0cmFwX3NhdmU7CQkJLyogVXNlZCB3aGVuIGJhZCBzdGFjayBpcyBlbmNvdW50ZXJlZCAqLwogCXU4IHNvZnRfZW5hYmxlZDsJCS8qIGlycSBzb2Z0LWVuYWJsZSBmbGFnICovCiAJdTggaGFyZF9lbmFibGVkOwkJLyogc2V0IGlmIGlycXMgYXJlIGVuYWJsZWQgaW4gTVNSICovCiAJdTggaW9fc3luYzsJCQkvKiB3cml0ZWwoKSBuZWVkcyBzcGluX3VubG9jayBzeW5jICovCkBAIC0xMDEsOCArMTAzLDYgQEAKIAl1NjQgdXNlcl90aW1lOwkJCS8qIGFjY3VtdWxhdGVkIHVzZXJtb2RlIFRCIHRpY2tzICovCiAJdTY0IHN5c3RlbV90aW1lOwkJLyogYWNjdW11bGF0ZWQgc3lzdGVtIFRCIHRpY2tzICovCiAJdTY0IHN0YXJ0cHVycjsJCQkvKiBQVVJSL1RCIHZhbHVlIHNuYXBzaG90ICovCi0KLQlzdHJ1Y3Qgc2xiX3NoYWRvdyAqc2xiX3NoYWRvd19wdHI7CiB9OwogCiBleHRlcm4gc3RydWN0IHBhY2Ffc3RydWN0IHBhY2FbXTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcGFycG9ydC5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wYXJwb3J0LmgKaW5kZXggM2ZjYTIxZC4uYjM3YjgxZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wYXJwb3J0LmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wYXJwb3J0LmgKQEAgLTIwLDE4ICsyMCwxOCBAQAogc3RhdGljIGludCBfX2RldmluaXQgcGFycG9ydF9wY19maW5kX25vbnBjaV9wb3J0cyAoaW50IGF1dG9pcnEsIGludCBhdXRvZG1hKQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7Ci0JdTMyICpwcm9wOworCWNvbnN0IHUzMiAqcHJvcDsKIAl1MzIgaW8xLCBpbzI7CiAJaW50IHByb3BzaXplOwogCWludCBjb3VudCA9IDA7CiAJZm9yIChucCA9IE5VTEw7IChucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKG5wLAogCQkJCQkJICAgICAgInBhcmFsbGVsIiwKIAkJCQkJCSAgICAgICJwbnBQTlAsNDAwIikpICE9IE5VTEw7KSB7Ci0JCXByb3AgPSAodTMyICopZ2V0X3Byb3BlcnR5KG5wLCAicmVnIiwgJnByb3BzaXplKTsKKwkJcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShucCwgInJlZyIsICZwcm9wc2l6ZSk7CiAJCWlmICghcHJvcCB8fCBwcm9wc2l6ZSA+IDYqc2l6ZW9mKHUzMikpCiAJCQljb250aW51ZTsKIAkJaW8xID0gcHJvcFsxXTsgaW8yID0gcHJvcFsyXTsKLQkJcHJvcCA9ICh1MzIgKilnZXRfcHJvcGVydHkobnAsICJpbnRlcnJ1cHRzIiwgTlVMTCk7CisJCXByb3AgPSBvZl9nZXRfcHJvcGVydHkobnAsICJpbnRlcnJ1cHRzIiwgTlVMTCk7CiAJCWlmICghcHJvcCkKIAkJCWNvbnRpbnVlOwogCQlpZiAocGFycG9ydF9wY19wcm9iZV9wb3J0KGlvMSwgaW8yLCBwcm9wWzBdLCBhdXRvZG1hLCBOVUxMKSAhPSBOVUxMKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wY2kuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcGNpLmgKaW5kZXggYWM2NTZlZS4uY2UwZjEzZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wY2kuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BjaS5oCkBAIC03MCwxOSArNzAsMjIgQEAKICAqLwogI2RlZmluZSBQQ0lfRElTQUJMRV9NV0kKIAotZXh0ZXJuIHN0cnVjdCBkbWFfbWFwcGluZ19vcHMgKnBjaV9kbWFfb3BzOworI2lmZGVmIENPTkZJR19QQ0kKK2V4dGVybiB2b2lkIHNldF9wY2lfZG1hX29wcyhzdHJ1Y3QgZG1hX21hcHBpbmdfb3BzICpkbWFfb3BzKTsKK2V4dGVybiBzdHJ1Y3QgZG1hX21hcHBpbmdfb3BzICpnZXRfcGNpX2RtYV9vcHModm9pZCk7CiAKIC8qIEZvciBEQUMgRE1BLCB3ZSBjdXJyZW50bHkgZG9uJ3Qgc3VwcG9ydCBpdCBieSBkZWZhdWx0LCBidXQKICAqIHdlIGxldCA2NC1iaXQgcGxhdGZvcm1zIG92ZXJyaWRlIHRoaXMuCiAgKi8KIHN0YXRpYyBpbmxpbmUgaW50IHBjaV9kYWNfZG1hX3N1cHBvcnRlZChzdHJ1Y3QgcGNpX2RldiAqaHdkZXYsdTY0IG1hc2spCiB7Ci0JaWYgKHBjaV9kbWFfb3BzICYmIHBjaV9kbWFfb3BzLT5kYWNfZG1hX3N1cHBvcnRlZCkKLQkJcmV0dXJuIHBjaV9kbWFfb3BzLT5kYWNfZG1hX3N1cHBvcnRlZCgmaHdkZXYtPmRldiwgbWFzayk7CisJc3RydWN0IGRtYV9tYXBwaW5nX29wcyAqZCA9IGdldF9wY2lfZG1hX29wcygpOworCisJaWYgKGQgJiYgZC0+ZGFjX2RtYV9zdXBwb3J0ZWQpCisJCXJldHVybiBkLT5kYWNfZG1hX3N1cHBvcnRlZCgmaHdkZXYtPmRldiwgbWFzayk7CiAJcmV0dXJuIDA7CiB9CiAKLSNpZmRlZiBDT05GSUdfUENJCiBzdGF0aWMgaW5saW5lIHZvaWQgcGNpX2RtYV9idXJzdF9hZHZpY2Uoc3RydWN0IHBjaV9kZXYgKnBkZXYsCiAJCQkJCWVudW0gcGNpX2RtYV9idXJzdF9zdHJhdGVneSAqc3RyYXQsCiAJCQkJCXVuc2lnbmVkIGxvbmcgKnN0cmF0ZWd5X3BhcmFtZXRlcikKQEAgLTk5LDYgKzEwMiw5IEBACiAJKnN0cmF0ID0gUENJX0RNQV9CVVJTVF9NVUxUSVBMRTsKIAkqc3RyYXRlZ3lfcGFyYW1ldGVyID0gY2FjaGVsaW5lX3NpemU7CiB9CisjZWxzZQkvKiBDT05GSUdfUENJICovCisjZGVmaW5lIHNldF9wY2lfZG1hX29wcyhkKQorI2RlZmluZSBnZXRfcGNpX2RtYV9vcHMoKQlOVUxMCiAjZW5kaWYKIAogZXh0ZXJuIGludCBwY2lfZG9tYWluX25yKHN0cnVjdCBwY2lfYnVzICpidXMpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wZ3RhYmxlLTRrLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BndGFibGUtNGsuaAppbmRleCAzNDVkOWIwLi5hMjhmYThiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3BndGFibGUtNGsuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BndGFibGUtNGsuaApAQCAtOTcsMyArOTcsNiBAQAogCiAjZGVmaW5lIHB1ZF9FUlJPUihlKSBcCiAJcHJpbnRrKCIlczolZDogYmFkIHB1ZCAlMDhseC5cbiIsIF9fRklMRV9fLCBfX0xJTkVfXywgcHVkX3ZhbChlKSkKKworI2RlZmluZSByZW1hcF80a19wZm4odm1hLCBhZGRyLCBwZm4sIHByb3QpCVwKKwlyZW1hcF9wZm5fcmFuZ2UoKHZtYSksIChhZGRyKSwgKHBmbiksIFBBR0VfU0laRSwgKHByb3QpKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wZ3RhYmxlLTY0ay5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wZ3RhYmxlLTY0ay5oCmluZGV4IDRiNzEyNmMuLjVlODRmMDcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcGd0YWJsZS02NGsuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BndGFibGUtNjRrLmgKQEAgLTM1LDYgKzM1LDcgQEAKICNkZWZpbmUgX1BBR0VfSFBURV9TVUIJMHgwZmZmZjAwMCAvKiBjb21ibyBvbmx5OiBzdWIgcGFnZXMgSFBURSBiaXRzICovCiAjZGVmaW5lIF9QQUdFX0hQVEVfU1VCMAkweDA4MDAwMDAwIC8qIGNvbWJvIG9ubHk6IGZpcnN0IHN1YiBwYWdlICovCiAjZGVmaW5lIF9QQUdFX0NPTUJPCTB4MTAwMDAwMDAgLyogdGhpcyBpcyBhIGNvbWJvIDRrIHBhZ2UgKi8KKyNkZWZpbmUgX1BBR0VfNEtfUEZOCTB4MjAwMDAwMDAgLyogUEZOIGlzIGZvciBhIHNpbmdsZSA0ayBwYWdlICovCiAjZGVmaW5lIF9QQUdFX0ZfU0VDT05EICAweDAwMDA4MDAwIC8qIGZ1bGwgcGFnZTogaGlkeCBiaXRzICovCiAjZGVmaW5lIF9QQUdFX0ZfR0lYICAgICAweDAwMDA3MDAwIC8qIGZ1bGwgcGFnZTogaGlkeCBiaXRzICovCiAKQEAgLTkzLDYgKzk0LDEwIEBACiAjZGVmaW5lIHB0ZV9wYWdlc2l6ZV9pbmRleChwdGUpCVwKIAkoKChwdGUpICYgX1BBR0VfQ09NQk8pPyBNTVVfUEFHRV80SzogTU1VX1BBR0VfNjRLKQogCisjZGVmaW5lIHJlbWFwXzRrX3Bmbih2bWEsIGFkZHIsIHBmbiwgcHJvdCkJCQkJXAorCXJlbWFwX3Bmbl9yYW5nZSgodm1hKSwgKGFkZHIpLCAocGZuKSwgUEFHRV9TSVpFLAkJXAorCQkJX19wZ3Byb3QocGdwcm90X3ZhbCgocHJvdCkpIHwgX1BBR0VfNEtfUEZOKSkKKwogI2VuZGlmIC8qICBfX0FTU0VNQkxZX18gKi8KICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAjZW5kaWYgLyogX0FTTV9QT1dFUlBDX1BHVEFCTEVfNjRLX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcGd0YWJsZS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wZ3RhYmxlLmgKaW5kZXggMTBmNTI3NDNmLi4xOWVkYjY5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3BndGFibGUuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BndGFibGUuaApAQCAtMjcyLDcgKzI3MiwxMCBAQAogCXJldHVybiBwdGU7IH0KIAogLyogQXRvbWljIFBURSB1cGRhdGVzICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcHRlX3VwZGF0ZShwdGVfdCAqcCwgdW5zaWduZWQgbG9uZyBjbHIpCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcHRlX3VwZGF0ZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwKKwkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBhZGRyLAorCQkJCSAgICAgICBwdGVfdCAqcHRlcCwgdW5zaWduZWQgbG9uZyBjbHIsCisJCQkJICAgICAgIGludCBodWdlKQogewogCXVuc2lnbmVkIGxvbmcgb2xkLCB0bXA7CiAKQEAgLTI4MywyMCArMjg2LDE1IEBACiAJYW5kYwklMSwlMCwlNCBcblwKIAlzdGRjeC4JJTEsMCwlMyBcblwKIAlibmUtCTFiIgotCTogIj0mciIgKG9sZCksICI9JnIiICh0bXApLCAiPW0iICgqcCkKLQk6ICJyIiAocCksICJyIiAoY2xyKSwgIm0iICgqcCksICJpIiAoX1BBR0VfQlVTWSkKKwk6ICI9JnIiIChvbGQpLCAiPSZyIiAodG1wKSwgIj1tIiAoKnB0ZXApCisJOiAiciIgKHB0ZXApLCAiciIgKGNsciksICJtIiAoKnB0ZXApLCAiaSIgKF9QQUdFX0JVU1kpCiAJOiAiY2MiICk7CisKKwlpZiAob2xkICYgX1BBR0VfSEFTSFBURSkKKwkJaHB0ZV9uZWVkX2ZsdXNoKG1tLCBhZGRyLCBwdGVwLCBvbGQsIGh1Z2UpOwogCXJldHVybiBvbGQ7CiB9CiAKLS8qIFBURSB1cGRhdGluZyBmdW5jdGlvbnMsIHRoaXMgZnVuY3Rpb24gcHV0cyB0aGUgUFRFIGluIHRoZQotICogYmF0Y2gsIGRvZXNuJ3QgYWN0dWFsbHkgdHJpZ2dlcnMgdGhlIGhhc2ggZmx1c2ggaW1tZWRpYXRlbHksCi0gKiB5b3UgbmVlZCB0byBjYWxsIGZsdXNoX3RsYl9wZW5kaW5nKCkgdG8gZG8gdGhhdC4KLSAqIFBhc3MgLTEgZm9yICJub3JtYWwiIHNpemUgKDRLIG9yIDY0SykKLSAqLwotZXh0ZXJuIHZvaWQgaHB0ZV91cGRhdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkciwKLQkJCXB0ZV90ICpwdGVwLCB1bnNpZ25lZCBsb25nIHB0ZSwgaW50IGh1Z2UpOwotCiBzdGF0aWMgaW5saW5lIGludCBfX3B0ZXBfdGVzdF9hbmRfY2xlYXJfeW91bmcoc3RydWN0IG1tX3N0cnVjdCAqbW0sCiAJCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYWRkciwgcHRlX3QgKnB0ZXApCiB7CkBAIC0zMDQsMTEgKzMwMiw3IEBACiAKICAgICAgICAJaWYgKChwdGVfdmFsKCpwdGVwKSAmIChfUEFHRV9BQ0NFU1NFRCB8IF9QQUdFX0hBU0hQVEUpKSA9PSAwKQogCQlyZXR1cm4gMDsKLQlvbGQgPSBwdGVfdXBkYXRlKHB0ZXAsIF9QQUdFX0FDQ0VTU0VEKTsKLQlpZiAob2xkICYgX1BBR0VfSEFTSFBURSkgewotCQlocHRlX3VwZGF0ZShtbSwgYWRkciwgcHRlcCwgb2xkLCAwKTsKLQkJZmx1c2hfdGxiX3BlbmRpbmcoKTsKLQl9CisJb2xkID0gcHRlX3VwZGF0ZShtbSwgYWRkciwgcHRlcCwgX1BBR0VfQUNDRVNTRUQsIDApOwogCXJldHVybiAob2xkICYgX1BBR0VfQUNDRVNTRUQpICE9IDA7CiB9CiAjZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfVEVTVF9BTkRfQ0xFQVJfWU9VTkcKQEAgLTMzMSw5ICszMjUsNyBAQAogCiAgICAgICAgCWlmICgocHRlX3ZhbCgqcHRlcCkgJiBfUEFHRV9ESVJUWSkgPT0gMCkKIAkJcmV0dXJuIDA7Ci0Jb2xkID0gcHRlX3VwZGF0ZShwdGVwLCBfUEFHRV9ESVJUWSk7Ci0JaWYgKG9sZCAmIF9QQUdFX0hBU0hQVEUpCi0JCWhwdGVfdXBkYXRlKG1tLCBhZGRyLCBwdGVwLCBvbGQsIDApOworCW9sZCA9IHB0ZV91cGRhdGUobW0sIGFkZHIsIHB0ZXAsIF9QQUdFX0RJUlRZLCAwKTsKIAlyZXR1cm4gKG9sZCAmIF9QQUdFX0RJUlRZKSAhPSAwOwogfQogI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX1RFU1RfQU5EX0NMRUFSX0RJUlRZCkBAIC0zNTIsOSArMzQ0LDcgQEAKIAogICAgICAgIAlpZiAoKHB0ZV92YWwoKnB0ZXApICYgX1BBR0VfUlcpID09IDApCiAgICAgICAgCQlyZXR1cm47Ci0Jb2xkID0gcHRlX3VwZGF0ZShwdGVwLCBfUEFHRV9SVyk7Ci0JaWYgKG9sZCAmIF9QQUdFX0hBU0hQVEUpCi0JCWhwdGVfdXBkYXRlKG1tLCBhZGRyLCBwdGVwLCBvbGQsIDApOworCW9sZCA9IHB0ZV91cGRhdGUobW0sIGFkZHIsIHB0ZXAsIF9QQUdFX1JXLCAwKTsKIH0KIAogLyoKQEAgLTM3OCw3ICszNjgsNiBAQAogKHsJCQkJCQkJCQlcCiAJaW50IF9fZGlydHkgPSBfX3B0ZXBfdGVzdF9hbmRfY2xlYXJfZGlydHkoKF9fdm1hKS0+dm1fbW0sIF9fYWRkcmVzcywgXAogCQkJCQkJICBfX3B0ZXApOyAJCVwKLQlmbHVzaF90bGJfcGFnZShfX3ZtYSwgX19hZGRyZXNzKTsJCQkJXAogCV9fZGlydHk7CQkJCQkJCVwKIH0pCiAKQEAgLTM4NiwyMCArMzc1LDE0IEBACiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZXBfZ2V0X2FuZF9jbGVhcihzdHJ1Y3QgbW1fc3RydWN0ICptbSwKIAkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBhZGRyLCBwdGVfdCAqcHRlcCkKIHsKLQl1bnNpZ25lZCBsb25nIG9sZCA9IHB0ZV91cGRhdGUocHRlcCwgfjBVTCk7Ci0KLQlpZiAob2xkICYgX1BBR0VfSEFTSFBURSkKLQkJaHB0ZV91cGRhdGUobW0sIGFkZHIsIHB0ZXAsIG9sZCwgMCk7CisJdW5zaWduZWQgbG9uZyBvbGQgPSBwdGVfdXBkYXRlKG1tLCBhZGRyLCBwdGVwLCB+MFVMLCAwKTsKIAlyZXR1cm4gX19wdGUob2xkKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHB0ZV9jbGVhcihzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLAogCQkJICAgICBwdGVfdCAqIHB0ZXApCiB7Ci0JdW5zaWduZWQgbG9uZyBvbGQgPSBwdGVfdXBkYXRlKHB0ZXAsIH4wVUwpOwotCi0JaWYgKG9sZCAmIF9QQUdFX0hBU0hQVEUpCi0JCWhwdGVfdXBkYXRlKG1tLCBhZGRyLCBwdGVwLCBvbGQsIDApOworCXB0ZV91cGRhdGUobW0sIGFkZHIsIHB0ZXAsIH4wVUwsIDApOwogfQogCiAvKgpAQCAtNDA4LDEwICszOTEsOCBAQAogc3RhdGljIGlubGluZSB2b2lkIHNldF9wdGVfYXQoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkciwKIAkJCSAgICAgIHB0ZV90ICpwdGVwLCBwdGVfdCBwdGUpCiB7Ci0JaWYgKHB0ZV9wcmVzZW50KCpwdGVwKSkgeworCWlmIChwdGVfcHJlc2VudCgqcHRlcCkpCiAJCXB0ZV9jbGVhcihtbSwgYWRkciwgcHRlcCk7Ci0JCWZsdXNoX3RsYl9wZW5kaW5nKCk7Ci0JfQogCXB0ZSA9IF9fcHRlKHB0ZV92YWwocHRlKSAmIH5fUEFHRV9IUFRFRkxBR1MpOwogCSpwdGVwID0gcHRlOwogfQpAQCAtNDY3LDE2ICs0NDgsNiBAQAogCiBleHRlcm4gdm9pZCBwYWdpbmdfaW5pdCh2b2lkKTsKIAotLyoKLSAqIFRoaXMgZ2V0cyBjYWxsZWQgYXQgdGhlIGVuZCBvZiBoYW5kbGluZyBhIHBhZ2UgZmF1bHQsIHdoZW4KLSAqIHRoZSBrZXJuZWwgaGFzIHB1dCBhIG5ldyBQVEUgaW50byB0aGUgcGFnZSB0YWJsZSBmb3IgdGhlIHByb2Nlc3MuCi0gKiBXZSB1c2UgaXQgdG8gcHV0IGEgY29ycmVzcG9uZGluZyBIUFRFIGludG8gdGhlIGhhc2ggdGFibGUKLSAqIGFoZWFkIG9mIHRpbWUsIGluc3RlYWQgb2Ygd2FpdGluZyBmb3IgdGhlIGluZXZpdGFibGUgZXh0cmEKLSAqIGhhc2gtdGFibGUgbWlzcyBleGNlcHRpb24uCi0gKi8KLXN0cnVjdCB2bV9hcmVhX3N0cnVjdDsKLWV4dGVybiB2b2lkIHVwZGF0ZV9tbXVfY2FjaGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICosIHVuc2lnbmVkIGxvbmcsIHB0ZV90KTsKLQogLyogRW5jb2RlIGFuZCBkZS1jb2RlIGEgc3dhcCBlbnRyeSAqLwogI2RlZmluZSBfX3N3cF90eXBlKGVudHJ5KQkoKChlbnRyeSkudmFsID4+IDEpICYgMHgzZikKICNkZWZpbmUgX19zd3Bfb2Zmc2V0KGVudHJ5KQkoKGVudHJ5KS52YWwgPj4gOCkKQEAgLTUyMiw2ICs0OTMsNyBAQAogCXJldHVybiBwdDsKIH0KIAorCiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvcGd0YWJsZS5oPgogCiAjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3BtYy5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wbWMuaAppbmRleCA4NTg4YmU2Li5kNmE2MTZhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3BtYy5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcG1jLmgKQEAgLTMwLDYgKzMwLDcgQEAKIAogI2lmZGVmIENPTkZJR19QUEM2NAogdm9pZCBwb3dlcjRfZW5hYmxlX3BtY3Modm9pZCk7Cit2b2lkIHBhc2VtaV9lbmFibGVfcG1jcyh2b2lkKTsKICNlbmRpZgogCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wcGMtcGNpLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BwYy1wY2kuaAppbmRleCBhYjZlZGRiLi5kNzRiMjk2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3BwYy1wY2kuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BwYy1wY2kuaApAQCAtMTAsNiArMTAsOCBAQAogI2RlZmluZSBfQVNNX1BPV0VSUENfUFBDX1BDSV9ICiAjaWZkZWYgX19LRVJORUxfXwogCisjaWZkZWYgQ09ORklHX1BDSQorCiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8YXNtL3BjaS1icmlkZ2UuaD4KIApAQCAtMjIsNyArMjQsNyBAQAogZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgaG9zZV9saXN0OwogZXh0ZXJuIGludCBnbG9iYWxfcGhiX251bWJlcjsKIAotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZmluZF9hbmRfaW5pdF9waGJzKHZvaWQpOworZXh0ZXJuIHZvaWQgZmluZF9hbmRfaW5pdF9waGJzKHZvaWQpOwogCiBleHRlcm4gc3RydWN0IHBjaV9kZXYgKnBwYzY0X2lzYWJyaWRnZV9kZXY7CS8qIG1heSBiZSBOVUxMIGlmIG5vIElTQSBidXMgKi8KIApAQCAtNjgsNyArNzAsNyBAQAogdm9pZCBlZWhfc2xvdF9lcnJvcl9kZXRhaWwgKHN0cnVjdCBwY2lfZG4gKnBkbiwgaW50IHNldmVyaXR5KTsKIAogLyoqCi0gKiBydGFzX3BjaV9lbmFibGVvIC0gZW5hYmxlIElPIHRyYW5zZmVycyBmb3IgdGhpcyBzbG90CisgKiBydGFzX3BjaV9lbmFibGUgLSBlbmFibGUgSU8gdHJhbnNmZXJzIGZvciB0aGlzIHNsb3QKICAqIEBwZG46ICAgICAgIHBjaSBkZXZpY2Ugbm9kZQogICogQGZ1bmN0aW9uOiAgZWl0aGVyIEVFSF9USEFXX01NSU8gb3IgRUVIX1RIQVdfRE1BIAogICoKQEAgLTg5LDYgKzkxLDcgQEAKICAqIFJldHVybnMgYSBub24temVybyB2YWx1ZSBpZiB0aGUgcmVzZXQgZmFpbGVkLgogICovCiBpbnQgcnRhc19zZXRfc2xvdF9yZXNldCAoc3RydWN0IHBjaV9kbiAqKTsKK2ludCBlZWhfd2FpdF9mb3Jfc2xvdF9zdGF0dXMoc3RydWN0IHBjaV9kbiAqcGRuLCBpbnQgbWF4X3dhaXRfbXNlY3MpOwogCiAvKiogCiAgKiBlZWhfcmVzdG9yZV9iYXJzIC0gUmVzdG9yZSBkZXZpY2UgY29uZmlndXJhdGlvbiBpbmZvLgpAQCAtMTI2LDUgKzEyOSwxMCBAQAogCiAjZW5kaWYKIAorI2Vsc2UgLyogQ09ORklHX1BDSSAqLworc3RhdGljIGlubGluZSB2b2lkIGZpbmRfYW5kX2luaXRfcGhicyh2b2lkKSB7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBpbml0X3BjaV9jb25maWdfdG9rZW5zKHZvaWQpIHsgfQorI2VuZGlmIC8qICFDT05GSUdfUENJICovCisKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAjZW5kaWYgLyogX0FTTV9QT1dFUlBDX1BQQ19QQ0lfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wcm9jZXNzb3IuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcHJvY2Vzc29yLmgKaW5kZXggYTI2YzMyZS4uZDk0N2IxNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wcm9jZXNzb3IuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3Byb2Nlc3Nvci5oCkBAIC0xMzMsNyArMTMzLDYgQEAKIAltbV9zZWdtZW50X3QJZnM7CQkvKiBmb3IgZ2V0X2ZzKCkgdmFsaWRhdGlvbiAqLwogI2lmZGVmIENPTkZJR19QUEMzMgogCXZvaWQJCSpwZ2RpcjsJCS8qIHJvb3Qgb2YgcGFnZS10YWJsZSB0cmVlICovCi0Jc2lnbmVkIGxvbmcJbGFzdF9zeXNjYWxsOwogI2VuZGlmCiAjaWYgZGVmaW5lZChDT05GSUdfNHh4KSB8fCBkZWZpbmVkIChDT05GSUdfQk9PS0UpCiAJdW5zaWduZWQgbG9uZwlkYmNyMDsJCS8qIGRlYnVnIGNvbnRyb2wgcmVnaXN0ZXIgdmFsdWVzICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3Byb20uaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcHJvbS5oCmluZGV4IDAyMGVkMDEuLmVjNDAwZjYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcHJvbS5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcHJvbS5oCkBAIC0xOCw3ICsxOCw5IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KIAogLyogRGVmaW5pdGlvbnMgdXNlZCBieSB0aGUgZmxhdHRlbmVkIGRldmljZSB0cmVlICovCiAjZGVmaW5lIE9GX0RUX0hFQURFUgkJMHhkMDBkZmVlZAkvKiBtYXJrZXIgKi8KQEAgLTU4LDYgKzYwLDggQEAKIAl1MzIJYm9vdF9jcHVpZF9waHlzOwkvKiBQaHlzaWNhbCBDUFUgaWQgd2UncmUgYm9vdGluZyBvbiAqLwogCS8qIHZlcnNpb24gMyBmaWVsZHMgYmVsb3cgKi8KIAl1MzIJZHRfc3RyaW5nc19zaXplOwkvKiBzaXplIG9mIHRoZSBEVCBzdHJpbmdzIGJsb2NrICovCisJLyogdmVyc2lvbiAxNyBmaWVsZHMgYmVsb3cgKi8KKwl1MzIJZHRfc3RydWN0X3NpemU7CQkvKiBzaXplIG9mIHRoZSBEVCBzdHJ1Y3R1cmUgYmxvY2sgKi8KIH07CiAKIApAQCAtNjgsNyArNzIsNyBAQAogc3RydWN0IHByb3BlcnR5IHsKIAljaGFyCSpuYW1lOwogCWludAlsZW5ndGg7Ci0JdW5zaWduZWQgY2hhciAqdmFsdWU7CisJdm9pZAkqdmFsdWU7CiAJc3RydWN0IHByb3BlcnR5ICpuZXh0OwogfTsKIApAQCAtMTA4LDE0ICsxMTIsNiBAQAogfQogCiAKLS8qIE9CU09MRVRFOiBPbGQgc3R5bGUgbm9kZSBsb29rdXAgKi8KLWV4dGVybiBzdHJ1Y3QgZGV2aWNlX25vZGUgKmZpbmRfZGV2aWNlcyhjb25zdCBjaGFyICpuYW1lKTsKLWV4dGVybiBzdHJ1Y3QgZGV2aWNlX25vZGUgKmZpbmRfdHlwZV9kZXZpY2VzKGNvbnN0IGNoYXIgKnR5cGUpOwotZXh0ZXJuIHN0cnVjdCBkZXZpY2Vfbm9kZSAqZmluZF9wYXRoX2RldmljZShjb25zdCBjaGFyICpwYXRoKTsKLWV4dGVybiBzdHJ1Y3QgZGV2aWNlX25vZGUgKmZpbmRfY29tcGF0aWJsZV9kZXZpY2VzKGNvbnN0IGNoYXIgKnR5cGUsCi0JCQkJCQkgICBjb25zdCBjaGFyICpjb21wYXQpOwotZXh0ZXJuIHN0cnVjdCBkZXZpY2Vfbm9kZSAqZmluZF9hbGxfbm9kZXModm9pZCk7Ci0KIC8qIE5ldyBzdHlsZSBub2RlIGxvb2t1cCAqLwogZXh0ZXJuIHN0cnVjdCBkZXZpY2Vfbm9kZSAqb2ZfZmluZF9ub2RlX2J5X25hbWUoc3RydWN0IGRldmljZV9ub2RlICpmcm9tLAogCWNvbnN0IGNoYXIgKm5hbWUpOwpAQCAtMTU5LDE1ICsxNTUsMTcgQEAKIGV4dGVybiB2b2lkIGZpbmlzaF9kZXZpY2VfdHJlZSh2b2lkKTsKIGV4dGVybiB2b2lkIHVuZmxhdHRlbl9kZXZpY2VfdHJlZSh2b2lkKTsKIGV4dGVybiB2b2lkIGVhcmx5X2luaXRfZGV2dHJlZSh2b2lkICopOwotZXh0ZXJuIGludCBkZXZpY2VfaXNfY29tcGF0aWJsZShjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldmljZSwKK2V4dGVybiBpbnQgb2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpkZXZpY2UsCiAJCQkJY29uc3QgY2hhciAqKTsKKyNkZWZpbmUgZGV2aWNlX2lzX2NvbXBhdGlibGUoZCwgYykJb2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUoKGQpLCAoYykpCiBleHRlcm4gaW50IG1hY2hpbmVfaXNfY29tcGF0aWJsZShjb25zdCBjaGFyICpjb21wYXQpOwotZXh0ZXJuIGNvbnN0IHZvaWQgKmdldF9wcm9wZXJ0eShjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsCitleHRlcm4gY29uc3Qgdm9pZCAqb2ZfZ2V0X3Byb3BlcnR5KGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwKIAkJCQljb25zdCBjaGFyICpuYW1lLAogCQkJCWludCAqbGVucCk7CisjZGVmaW5lIGdldF9wcm9wZXJ0eShhLCBiLCBjKQlvZl9nZXRfcHJvcGVydHkoKGEpLCAoYiksIChjKSkKIGV4dGVybiB2b2lkIHByaW50X3Byb3BlcnRpZXMoc3RydWN0IGRldmljZV9ub2RlICpub2RlKTsKLWV4dGVybiBpbnQgcHJvbV9uX2FkZHJfY2VsbHMoc3RydWN0IGRldmljZV9ub2RlKiBucCk7Ci1leHRlcm4gaW50IHByb21fbl9zaXplX2NlbGxzKHN0cnVjdCBkZXZpY2Vfbm9kZSogbnApOworZXh0ZXJuIGludCBvZl9uX2FkZHJfY2VsbHMoc3RydWN0IGRldmljZV9ub2RlKiBucCk7CitleHRlcm4gaW50IG9mX25fc2l6ZV9jZWxscyhzdHJ1Y3QgZGV2aWNlX25vZGUqIG5wKTsKIGV4dGVybiBpbnQgcHJvbV9uX2ludHJfY2VsbHMoc3RydWN0IGRldmljZV9ub2RlKiBucCk7CiBleHRlcm4gdm9pZCBwcm9tX2dldF9pcnFfc2Vuc2VzKHVuc2lnbmVkIGNoYXIgKnNlbnNlcywgaW50IG9mZiwgaW50IG1heCk7CiBleHRlcm4gaW50IHByb21fYWRkX3Byb3BlcnR5KHN0cnVjdCBkZXZpY2Vfbm9kZSogbnAsIHN0cnVjdCBwcm9wZXJ0eSogcHJvcCk7CkBAIC0zNTAsNiArMzQ4LDE2IEBACiAJcmV0dXJuIGlycTsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIF9faW9tZW0gKm9mX2lvbWFwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIGludCBpbmRleCkKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgcmVzOworCisJaWYgKG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UobnAsIGluZGV4LCAmcmVzKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gaW9yZW1hcChyZXMuc3RhcnQsIDEgKyByZXMuZW5kIC0gcmVzLnN0YXJ0KTsKK30KKwogCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogI2VuZGlmIC8qIF9QT1dFUlBDX1BST01fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9yZWcuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcmVnLmgKaW5kZXggMGQ3ZjAxNi4uNzQ5YzdmOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9yZWcuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3JlZy5oCkBAIC00NjksMTIgKzQ2OSw2OCBAQAogI2RlZmluZSBTUFJOX1NJQVIJNzgwCiAjZGVmaW5lIFNQUk5fU0RBUgk3ODEKIAotI2RlZmluZSBQQTZUX1NQUk5fUE1DMAk3ODcKLSNkZWZpbmUgUEE2VF9TUFJOX1BNQzEJNzg4Ci0jZGVmaW5lIFBBNlRfU1BSTl9QTUMyCTc4OQotI2RlZmluZSBQQTZUX1NQUk5fUE1DMwk3OTAKLSNkZWZpbmUgUEE2VF9TUFJOX1BNQzQJNzkxCi0jZGVmaW5lIFBBNlRfU1BSTl9QTUM1CTc5MgorI2RlZmluZSBTUFJOX1BBNlRfTU1DUjAgNzk1CisjZGVmaW5lICAgUEE2VF9NTUNSMF9FTjAJMHgwMDAwMDAwMDAwMDAwMDAxVUwKKyNkZWZpbmUgICBQQTZUX01NQ1IwX0VOMQkweDAwMDAwMDAwMDAwMDAwMDJVTAorI2RlZmluZSAgIFBBNlRfTU1DUjBfRU4yCTB4MDAwMDAwMDAwMDAwMDAwNFVMCisjZGVmaW5lICAgUEE2VF9NTUNSMF9FTjMJMHgwMDAwMDAwMDAwMDAwMDA4VUwKKyNkZWZpbmUgICBQQTZUX01NQ1IwX0VONAkweDAwMDAwMDAwMDAwMDAwMTBVTAorI2RlZmluZSAgIFBBNlRfTU1DUjBfRU41CTB4MDAwMDAwMDAwMDAwMDAyMFVMCisjZGVmaW5lICAgUEE2VF9NTUNSMF9TVVBFTgkweDAwMDAwMDAwMDAwMDAwNDBVTAorI2RlZmluZSAgIFBBNlRfTU1DUjBfUFJFTgkweDAwMDAwMDAwMDAwMDAwODBVTAorI2RlZmluZSAgIFBBNlRfTU1DUjBfSFlQRU4JMHgwMDAwMDAwMDAwMDAwMTAwVUwKKyNkZWZpbmUgICBQQTZUX01NQ1IwX0ZDTTAJMHgwMDAwMDAwMDAwMDAwMjAwVUwKKyNkZWZpbmUgICBQQTZUX01NQ1IwX0ZDTTEJMHgwMDAwMDAwMDAwMDAwNDAwVUwKKyNkZWZpbmUgICBQQTZUX01NQ1IwX0lOVEdFTgkweDAwMDAwMDAwMDAwMDA4MDBVTAorI2RlZmluZSAgIFBBNlRfTU1DUjBfSU5URU4wCTB4MDAwMDAwMDAwMDAwMTAwMFVMCisjZGVmaW5lICAgUEE2VF9NTUNSMF9JTlRFTjEJMHgwMDAwMDAwMDAwMDAyMDAwVUwKKyNkZWZpbmUgICBQQTZUX01NQ1IwX0lOVEVOMgkweDAwMDAwMDAwMDAwMDQwMDBVTAorI2RlZmluZSAgIFBBNlRfTU1DUjBfSU5URU4zCTB4MDAwMDAwMDAwMDAwODAwMFVMCisjZGVmaW5lICAgUEE2VF9NTUNSMF9JTlRFTjQJMHgwMDAwMDAwMDAwMDEwMDAwVUwKKyNkZWZpbmUgICBQQTZUX01NQ1IwX0lOVEVONQkweDAwMDAwMDAwMDAwMjAwMDBVTAorI2RlZmluZSAgIFBBNlRfTU1DUjBfRElTQ05UCTB4MDAwMDAwMDAwMDA0MDAwMFVMCisjZGVmaW5lICAgUEE2VF9NTUNSMF9VT1AJMHgwMDAwMDAwMDAwMDgwMDAwVUwKKyNkZWZpbmUgICBQQTZUX01NQ1IwX1RSRwkweDAwMDAwMDAwMDAxMDAwMDBVTAorI2RlZmluZSAgIFBBNlRfTU1DUjBfVFJHRU4JMHgwMDAwMDAwMDAwMjAwMDAwVUwKKyNkZWZpbmUgICBQQTZUX01NQ1IwX1RSR1JFRwkweDAwMDAwMDAwMDE2MDAwMDBVTAorI2RlZmluZSAgIFBBNlRfTU1DUjBfU0lBUkxPRwkweDAwMDAwMDAwMDIwMDAwMDBVTAorI2RlZmluZSAgIFBBNlRfTU1DUjBfU0RBUkxPRwkweDAwMDAwMDAwMDQwMDAwMDBVTAorI2RlZmluZSAgIFBBNlRfTU1DUjBfUFJPRU4JMHgwMDAwMDAwMDA4MDAwMDAwVUwKKyNkZWZpbmUgICBQQTZUX01NQ1IwX1BST0xPRwkweDAwMDAwMDAwMTAwMDAwMDBVTAorI2RlZmluZSAgIFBBNlRfTU1DUjBfREFNRU4yCTB4MDAwMDAwMDAyMDAwMDAwMFVMCisjZGVmaW5lICAgUEE2VF9NTUNSMF9EQU1FTjMJMHgwMDAwMDAwMDQwMDAwMDAwVUwKKyNkZWZpbmUgICBQQTZUX01NQ1IwX0RBTUVONAkweDAwMDAwMDAwODAwMDAwMDBVTAorI2RlZmluZSAgIFBBNlRfTU1DUjBfREFNRU41CTB4MDAwMDAwMDEwMDAwMDAwMFVMCisjZGVmaW5lICAgUEE2VF9NTUNSMF9EQU1TRUwyCTB4MDAwMDAwMDIwMDAwMDAwMFVMCisjZGVmaW5lICAgUEE2VF9NTUNSMF9EQU1TRUwzCTB4MDAwMDAwMDQwMDAwMDAwMFVMCisjZGVmaW5lICAgUEE2VF9NTUNSMF9EQU1TRUw0CTB4MDAwMDAwMDgwMDAwMDAwMFVMCisjZGVmaW5lICAgUEE2VF9NTUNSMF9EQU1TRUw1CTB4MDAwMDAwMTAwMDAwMDAwMFVMCisjZGVmaW5lICAgUEE2VF9NTUNSMF9IQU5ERElTCTB4MDAwMDAwMjAwMDAwMDAwMFVMCisjZGVmaW5lICAgUEE2VF9NTUNSMF9QQ1RFTgkweDAwMDAwMDQwMDAwMDAwMDBVTAorI2RlZmluZSAgIFBBNlRfTU1DUjBfU09DRU4JMHgwMDAwMDA4MDAwMDAwMDAwVUwKKyNkZWZpbmUgICBQQTZUX01NQ1IwX1NPQ01PRAkweDAwMDAwMTAwMDAwMDAwMDBVTAorCisjZGVmaW5lIFNQUk5fUEE2VF9NTUNSMSA3OTgKKyNkZWZpbmUgICBQQTZUX01NQ1IxX0VTMgkweDAwMDAwMDAwMDAwMDAwZmZVTAorI2RlZmluZSAgIFBBNlRfTU1DUjFfRVMzCTB4MDAwMDAwMDAwMDAwZmYwMFVMCisjZGVmaW5lICAgUEE2VF9NTUNSMV9FUzQJMHgwMDAwMDAwMDAwZmYwMDAwVUwKKyNkZWZpbmUgICBQQTZUX01NQ1IxX0VTNQkweDAwMDAwMDAwZmYwMDAwMDBVTAorCisjZGVmaW5lIFNQUk5fUEE2VF9TSUFSICA3ODAKKyNkZWZpbmUgU1BSTl9QQTZUX1VQTUMwIDc3MQorI2RlZmluZSBTUFJOX1BBNlRfVVBNQzEgNzcyCisjZGVmaW5lIFNQUk5fUEE2VF9VUE1DMiA3NzMKKyNkZWZpbmUgU1BSTl9QQTZUX1VQTUMzIDc3NAorI2RlZmluZSBTUFJOX1BBNlRfVVBNQzQgNzc1CisjZGVmaW5lIFNQUk5fUEE2VF9VUE1DNSA3NzYKKyNkZWZpbmUgU1BSTl9QQTZUX1VNTUNSMCA3NzkKKyNkZWZpbmUgU1BSTl9QQTZUX1VNTUNSMSA3ODIKKyNkZWZpbmUgU1BSTl9QQTZUX1BNQzAgIDc4NworI2RlZmluZSBTUFJOX1BBNlRfUE1DMSAgNzg4CisjZGVmaW5lIFNQUk5fUEE2VF9QTUMyICA3ODkKKyNkZWZpbmUgU1BSTl9QQTZUX1BNQzMgIDc5MAorI2RlZmluZSBTUFJOX1BBNlRfUE1DNCAgNzkxCisjZGVmaW5lIFNQUk5fUEE2VF9QTUM1ICA3OTIKIAogI2Vsc2UgLyogMzItYml0ICovCiAjZGVmaW5lIFNQUk5fTU1DUjAJOTUyCS8qIE1vbml0b3IgTW9kZSBDb250cm9sIFJlZ2lzdGVyIDAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvc29ja2V0LmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3NvY2tldC5oCmluZGV4IGM4YjFkYTUuLjQwM2U5ZmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvc29ja2V0LmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9zb2NrZXQuaApAQCAtNTYsNSArNTYsNyBAQAogCiAjZGVmaW5lIFNPX1BFRVJTRUMJCTMxCiAjZGVmaW5lIFNPX1BBU1NTRUMJCTM0CisjZGVmaW5lIFNPX1RJTUVTVEFNUE5TCQkzNQorI2RlZmluZSBTQ01fVElNRVNUQU1QTlMJCVNPX1RJTUVTVEFNUE5TCiAKICNlbmRpZgkvKiBfQVNNX1BPV0VSUENfU09DS0VUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvc29ja2lvcy5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9zb2NraW9zLmgKaW5kZXggNTkwMDc4ZC4uNTVjZWY3NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9zb2NraW9zLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9zb2NraW9zLmgKQEAgLTE0LDYgKzE0LDcgQEAKICNkZWZpbmUgRklPR0VUT1dOCTB4ODkwMwogI2RlZmluZSBTSU9DR1BHUlAJMHg4OTA0CiAjZGVmaW5lIFNJT0NBVE1BUksJMHg4OTA1Ci0jZGVmaW5lIFNJT0NHU1RBTVAJMHg4OTA2CQkvKiBHZXQgc3RhbXAgKi8KKyNkZWZpbmUgU0lPQ0dTVEFNUAkweDg5MDYJCS8qIEdldCBzdGFtcCAodGltZXZhbCkgKi8KKyNkZWZpbmUgU0lPQ0dTVEFNUE5TCTB4ODkwNwkJLyogR2V0IHN0YW1wICh0aW1lc3BlYykgKi8KIAogI2VuZGlmCS8qIF9BU01fUE9XRVJQQ19TT0NLSU9TX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvc3B1X2NzYS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9zcHVfY3NhLmgKaW5kZXggOGFhZDA2MS4uMDJlNTZhNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9zcHVfY3NhLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9zcHVfY3NhLmgKQEAgLTI0Miw2ICsyNDIsNyBAQAogCXU2NCBzcHVfY2hubGRhdGFfUldbMzJdOwogCXUzMiBzcHVfbWFpbGJveF9kYXRhWzRdOwogCXUzMiBwdV9tYWlsYm94X2RhdGFbMV07CisJdTY0IGRhciwgZHNpc3I7CiAJdW5zaWduZWQgbG9uZyBzdXNwZW5kX3RpbWU7CiAJc3BpbmxvY2tfdCByZWdpc3Rlcl9sb2NrOwogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvc3RyaW5nLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3N0cmluZy5oCmluZGV4IGZhYTQwN2YuLmFhNDBmOTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvc3RyaW5nLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9zdHJpbmcuaApAQCAtMTQsOCArMTQsNiBAQAogI2RlZmluZSBfX0hBVkVfQVJDSF9NRU1DTVAKICNkZWZpbmUgX19IQVZFX0FSQ0hfTUVNQ0hSCiAKLWV4dGVybiBpbnQgc3RyY2FzZWNtcChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7Ci1leHRlcm4gaW50IHN0cm5jYXNlY21wKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBfX2tlcm5lbF9zaXplX3QpOwogZXh0ZXJuIGNoYXIgKiBzdHJjcHkoY2hhciAqLGNvbnN0IGNoYXIgKik7CiBleHRlcm4gY2hhciAqIHN0cm5jcHkoY2hhciAqLGNvbnN0IGNoYXIgKiwgX19rZXJuZWxfc2l6ZV90KTsKIGV4dGVybiBfX2tlcm5lbF9zaXplX3Qgc3RybGVuKGNvbnN0IGNoYXIgKik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3N5c3RlbS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9zeXN0ZW0uaAppbmRleCBmN2IxMjI3Li5kM2UwOTA2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3N5c3RlbS5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvc3lzdGVtLmgKQEAgLTEzMSw2ICsxMzEsNyBAQAogZXh0ZXJuIHZvaWQgZ2l2ZXVwX2FsdGl2ZWMoc3RydWN0IHRhc2tfc3RydWN0ICopOwogZXh0ZXJuIHZvaWQgbG9hZF91cF9hbHRpdmVjKHN0cnVjdCB0YXNrX3N0cnVjdCAqKTsKIGV4dGVybiBpbnQgZW11bGF0ZV9hbHRpdmVjKHN0cnVjdCBwdF9yZWdzICopOworZXh0ZXJuIHZvaWQgZW5hYmxlX2tlcm5lbF9zcGUodm9pZCk7CiBleHRlcm4gdm9pZCBnaXZldXBfc3BlKHN0cnVjdCB0YXNrX3N0cnVjdCAqKTsKIGV4dGVybiB2b2lkIGxvYWRfdXBfc3BlKHN0cnVjdCB0YXNrX3N0cnVjdCAqKTsKIGV4dGVybiBpbnQgZml4X2FsaWdubWVudChzdHJ1Y3QgcHRfcmVncyAqKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvdGxiLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3RsYi5oCmluZGV4IDRlMmE4MzQuLjBhMTc2ODIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvdGxiLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy90bGIuaApAQCAtMzgsNyArMzgsNiBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgdGxiX2ZsdXNoKHN0cnVjdCBtbXVfZ2F0aGVyICp0bGIpCiB7Ci0JZmx1c2hfdGxiX3BlbmRpbmcoKTsKIAlwdGVfZnJlZV9maW5pc2goKTsKIH0KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy90bGJmbHVzaC5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy90bGJmbHVzaC5oCmluZGV4IDkzYzdkMGMuLjg2ZTYyNjYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvdGxiZmx1c2guaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3RsYmZsdXNoLmgKQEAgLTE3LDEwICsxNyw3MyBAQAogICovCiAjaWZkZWYgX19LRVJORUxfXwogCi0KIHN0cnVjdCBtbV9zdHJ1Y3Q7CitzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3Q7CiAKLSNpZmRlZiBDT05GSUdfUFBDNjQKKyNpZiBkZWZpbmVkKENPTkZJR180eHgpIHx8IGRlZmluZWQoQ09ORklHXzh4eCkgfHwgZGVmaW5lZChDT05GSUdfRlNMX0JPT0tFKQorLyoKKyAqIFRMQiBmbHVzaGluZyBmb3Igc29mdHdhcmUgbG9hZGVkIFRMQiBjaGlwcworICoKKyAqIFRPRE86IChDT05GSUdfRlNMX0JPT0tFKSBkZXRlcm1pbmUgaWYgZmx1c2hfdGxiX3JhbmdlICYKKyAqIGZsdXNoX3RsYl9rZXJuZWxfcmFuZ2UgYXJlIGJlc3QgaW1wbGVtZW50ZWQgYXMgdGxiaWEgdnMKKyAqIHNwZWNpZmljIHRsYmllJ3MKKyAqLworCitleHRlcm4gdm9pZCBfdGxiaWUodW5zaWduZWQgbG9uZyBhZGRyZXNzKTsKKworI2lmIGRlZmluZWQoQ09ORklHXzQweCkgfHwgZGVmaW5lZChDT05GSUdfOHh4KQorI2RlZmluZSBfdGxiaWEoKQlhc20gdm9sYXRpbGUgKCJ0bGJpYTsgc3luYyIgOiA6IDogIm1lbW9yeSIpCisjZWxzZSAvKiBDT05GSUdfNDR4IHx8IENPTkZJR19GU0xfQk9PS0UgKi8KK2V4dGVybiB2b2lkIF90bGJpYSh2b2lkKTsKKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIHZvaWQgZmx1c2hfdGxiX21tKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQoreworCV90bGJpYSgpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZmx1c2hfdGxiX3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkJICB1bnNpZ25lZCBsb25nIHZtYWRkcikKK3sKKwlfdGxiaWUodm1hZGRyKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGZsdXNoX3RsYl9wYWdlX25vaGFzaChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJCQkJIHVuc2lnbmVkIGxvbmcgdm1hZGRyKQoreworCV90bGJpZSh2bWFkZHIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZmx1c2hfdGxiX3JhbmdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQoreworCV90bGJpYSgpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZmx1c2hfdGxiX2tlcm5lbF9yYW5nZSh1bnNpZ25lZCBsb25nIHN0YXJ0LAorCQkJCQkgIHVuc2lnbmVkIGxvbmcgZW5kKQoreworCV90bGJpYSgpOworfQorCisjZWxpZiBkZWZpbmVkKENPTkZJR19QUEMzMikKKy8qCisgKiBUTEIgZmx1c2hpbmcgZm9yICJjbGFzc2ljIiBoYXNoLU1NTVUgMzItYml0IENQVXMsIDZ4eCwgN3h4LCA3eHh4CisgKi8KK2V4dGVybiB2b2lkIF90bGJpZSh1bnNpZ25lZCBsb25nIGFkZHJlc3MpOworZXh0ZXJuIHZvaWQgX3RsYmlhKHZvaWQpOworCitleHRlcm4gdm9pZCBmbHVzaF90bGJfbW0oc3RydWN0IG1tX3N0cnVjdCAqbW0pOworZXh0ZXJuIHZvaWQgZmx1c2hfdGxiX3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgdm1hZGRyKTsKK2V4dGVybiB2b2lkIGZsdXNoX3RsYl9wYWdlX25vaGFzaChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyKTsKK2V4dGVybiB2b2lkIGZsdXNoX3RsYl9yYW5nZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBzdGFydCwKKwkJCSAgICB1bnNpZ25lZCBsb25nIGVuZCk7CitleHRlcm4gdm9pZCBmbHVzaF90bGJfa2VybmVsX3JhbmdlKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKTsKKworI2Vsc2UKKy8qCisgKiBUTEIgZmx1c2hpbmcgZm9yIDY0LWJpdCBoYXMtTU1VIENQVXMKKyAqLwogCiAjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KQEAgLTI4LDQ2ICs5MSw3MCBAQAogI2RlZmluZSBQUEM2NF9UTEJfQkFUQ0hfTlIgMTkyCiAKIHN0cnVjdCBwcGM2NF90bGJfYmF0Y2ggewotCXVuc2lnbmVkIGxvbmcgaW5kZXg7Ci0Jc3RydWN0IG1tX3N0cnVjdCAqbW07Ci0JcmVhbF9wdGVfdCBwdGVbUFBDNjRfVExCX0JBVENIX05SXTsKLQl1bnNpZ25lZCBsb25nIHZhZGRyW1BQQzY0X1RMQl9CQVRDSF9OUl07Ci0JdW5zaWduZWQgaW50IHBzaXplOworCWludAkJCWFjdGl2ZTsKKwl1bnNpZ25lZCBsb25nCQlpbmRleDsKKwlzdHJ1Y3QgbW1fc3RydWN0CSptbTsKKwlyZWFsX3B0ZV90CQlwdGVbUFBDNjRfVExCX0JBVENIX05SXTsKKwl1bnNpZ25lZCBsb25nCQl2YWRkcltQUEM2NF9UTEJfQkFUQ0hfTlJdOworCXVuc2lnbmVkIGludAkJcHNpemU7CiB9OwogREVDTEFSRV9QRVJfQ1BVKHN0cnVjdCBwcGM2NF90bGJfYmF0Y2gsIHBwYzY0X3RsYl9iYXRjaCk7CiAKIGV4dGVybiB2b2lkIF9fZmx1c2hfdGxiX3BlbmRpbmcoc3RydWN0IHBwYzY0X3RsYl9iYXRjaCAqYmF0Y2gpOwogCi1zdGF0aWMgaW5saW5lIHZvaWQgZmx1c2hfdGxiX3BlbmRpbmcodm9pZCkKK2V4dGVybiB2b2lkIGhwdGVfbmVlZF9mbHVzaChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLAorCQkJICAgIHB0ZV90ICpwdGVwLCB1bnNpZ25lZCBsb25nIHB0ZSwgaW50IGh1Z2UpOworCisjZGVmaW5lIF9fSEFWRV9BUkNIX0VOVEVSX0xBWllfTU1VX01PREUKKworc3RhdGljIGlubGluZSB2b2lkIGFyY2hfZW50ZXJfbGF6eV9tbXVfbW9kZSh2b2lkKQogewotCXN0cnVjdCBwcGM2NF90bGJfYmF0Y2ggKmJhdGNoID0gJmdldF9jcHVfdmFyKHBwYzY0X3RsYl9iYXRjaCk7CisJc3RydWN0IHBwYzY0X3RsYl9iYXRjaCAqYmF0Y2ggPSAmX19nZXRfY3B1X3ZhcihwcGM2NF90bGJfYmF0Y2gpOworCisJYmF0Y2gtPmFjdGl2ZSA9IDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhcmNoX2xlYXZlX2xhenlfbW11X21vZGUodm9pZCkKK3sKKwlzdHJ1Y3QgcHBjNjRfdGxiX2JhdGNoICpiYXRjaCA9ICZfX2dldF9jcHVfdmFyKHBwYzY0X3RsYl9iYXRjaCk7CiAKIAlpZiAoYmF0Y2gtPmluZGV4KQogCQlfX2ZsdXNoX3RsYl9wZW5kaW5nKGJhdGNoKTsKLQlwdXRfY3B1X3ZhcihwcGM2NF90bGJfYmF0Y2gpOworCWJhdGNoLT5hY3RpdmUgPSAwOwogfQogCisjZGVmaW5lIGFyY2hfZmx1c2hfbGF6eV9tbXVfbW9kZSgpICAgICAgZG8ge30gd2hpbGUgKDApCisKKwogZXh0ZXJuIHZvaWQgZmx1c2hfaGFzaF9wYWdlKHVuc2lnbmVkIGxvbmcgdmEsIHJlYWxfcHRlX3QgcHRlLCBpbnQgcHNpemUsCiAJCQkgICAgaW50IGxvY2FsKTsKIGV4dGVybiB2b2lkIGZsdXNoX2hhc2hfcmFuZ2UodW5zaWduZWQgbG9uZyBudW1iZXIsIGludCBsb2NhbCk7CiAKLSNlbHNlIC8qIENPTkZJR19QUEM2NCAqLwogCi0jaW5jbHVkZSA8bGludXgvbW0uaD4KK3N0YXRpYyBpbmxpbmUgdm9pZCBmbHVzaF90bGJfbW0oc3RydWN0IG1tX3N0cnVjdCAqbW0pCit7Cit9CiAKLWV4dGVybiB2b2lkIF90bGJpZSh1bnNpZ25lZCBsb25nIGFkZHJlc3MpOwotZXh0ZXJuIHZvaWQgX3RsYmlhKHZvaWQpOworc3RhdGljIGlubGluZSB2b2lkIGZsdXNoX3RsYl9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCQkJCSAgdW5zaWduZWQgbG9uZyB2bWFkZHIpCit7Cit9CiAKLS8qCi0gKiBUT0RPOiAoQ09ORklHX0ZTTF9CT09LRSkgZGV0ZXJtaW5lIGlmIGZsdXNoX3RsYl9yYW5nZSAmCi0gKiBmbHVzaF90bGJfa2VybmVsX3JhbmdlIGFyZSBiZXN0IGltcGxlbWVudGVkIGFzIHRsYmlhIHZzCi0gKiBzcGVjaWZpYyB0bGJpZSdzCi0gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBmbHVzaF90bGJfcGFnZV9ub2hhc2goc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkJCSB1bnNpZ25lZCBsb25nIHZtYWRkcikKK3sKK30KIAotI2lmIChkZWZpbmVkKENPTkZJR180eHgpICYmICFkZWZpbmVkKENPTkZJR180NHgpKSB8fCBkZWZpbmVkKENPTkZJR184eHgpCi0jZGVmaW5lIGZsdXNoX3RsYl9wZW5kaW5nKCkJYXNtIHZvbGF0aWxlICgidGxiaWE7IHN5bmMiIDogOiA6ICJtZW1vcnkiKQotI2VsaWYgZGVmaW5lZChDT05GSUdfNHh4KSB8fCBkZWZpbmVkKENPTkZJR19GU0xfQk9PS0UpCi0jZGVmaW5lIGZsdXNoX3RsYl9wZW5kaW5nKCkJX3RsYmlhKCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBmbHVzaF90bGJfcmFuZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkJICAgdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmbHVzaF90bGJfa2VybmVsX3JhbmdlKHVuc2lnbmVkIGxvbmcgc3RhcnQsCisJCQkJCSAgdW5zaWduZWQgbG9uZyBlbmQpCit7Cit9CisKICNlbmRpZgogCiAvKgpAQCAtODEsNjQgKzE2OCwxMyBAQAogICovCiBleHRlcm4gdm9pZCB1cGRhdGVfbW11X2NhY2hlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqLCB1bnNpZ25lZCBsb25nLCBwdGVfdCk7CiAKLSNlbmRpZiAvKiBDT05GSUdfUFBDNjQgKi8KLQotI2lmIGRlZmluZWQoQ09ORklHX1BQQzY0KSB8fCBkZWZpbmVkKENPTkZJR180eHgpIHx8IFwKLQlkZWZpbmVkKENPTkZJR19GU0xfQk9PS0UpIHx8IGRlZmluZWQoQ09ORklHXzh4eCkKLQotc3RhdGljIGlubGluZSB2b2lkIGZsdXNoX3RsYl9tbShzdHJ1Y3QgbW1fc3RydWN0ICptbSkKLXsKLQlmbHVzaF90bGJfcGVuZGluZygpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgZmx1c2hfdGxiX3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCi0JCQkJdW5zaWduZWQgbG9uZyB2bWFkZHIpCi17Ci0jaWZkZWYgQ09ORklHX1BQQzY0Ci0JZmx1c2hfdGxiX3BlbmRpbmcoKTsKLSNlbHNlCi0JX3RsYmllKHZtYWRkcik7Ci0jZW5kaWYKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGZsdXNoX3RsYl9wYWdlX25vaGFzaChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKLQkJCQkJIHVuc2lnbmVkIGxvbmcgdm1hZGRyKQotewotI2lmbmRlZiBDT05GSUdfUFBDNjQKLQlfdGxiaWUodm1hZGRyKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgZmx1c2hfdGxiX3JhbmdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAotCQl1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKLXsKLQlmbHVzaF90bGJfcGVuZGluZygpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgZmx1c2hfdGxiX2tlcm5lbF9yYW5nZSh1bnNpZ25lZCBsb25nIHN0YXJ0LAotCQl1bnNpZ25lZCBsb25nIGVuZCkKLXsKLQlmbHVzaF90bGJfcGVuZGluZygpOwotfQotCi0jZWxzZQkvKiA2eHgsIDd4eCwgN3h4eCBjcHVzICovCi0KLWV4dGVybiB2b2lkIGZsdXNoX3RsYl9tbShzdHJ1Y3QgbW1fc3RydWN0ICptbSk7Ci1leHRlcm4gdm9pZCBmbHVzaF90bGJfcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyB2bWFkZHIpOwotZXh0ZXJuIHZvaWQgZmx1c2hfdGxiX3BhZ2Vfbm9oYXNoKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIpOwotZXh0ZXJuIHZvaWQgZmx1c2hfdGxiX3JhbmdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHN0YXJ0LAotCQkJICAgIHVuc2lnbmVkIGxvbmcgZW5kKTsKLWV4dGVybiB2b2lkIGZsdXNoX3RsYl9rZXJuZWxfcmFuZ2UodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpOwotCi0jZW5kaWYKLQogLyoKICAqIFRoaXMgaXMgY2FsbGVkIGluIG11bm1hcCB3aGVuIHdlIGhhdmUgZnJlZWQgdXAgc29tZSBwYWdlLXRhYmxlCiAgKiBwYWdlcy4gIFdlIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcgaGVyZSwgdGhlcmUncyBub3RoaW5nIHNwZWNpYWwKICAqIGFib3V0IG91ciBwYWdlLXRhYmxlIHBhZ2VzLiAgLS0gcGF1bHVzCiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBmbHVzaF90bGJfcGd0YWJsZXMoc3RydWN0IG1tX3N0cnVjdCAqbW0sCi0JCXVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQogewogfQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3VhY2Nlc3MuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvdWFjY2Vzcy5oCmluZGV4IGFkYmYxNmIuLjhlNzk4ZTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvdWFjY2Vzcy5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvdWFjY2Vzcy5oCkBAIC0xMTAsMTIgKzExMCwxOCBAQAogCV9fZ2V0X3VzZXJfbm9jaGVjaygoeCksIChwdHIpLCBzaXplb2YoKihwdHIpKSkKICNkZWZpbmUgX19wdXRfdXNlcih4LCBwdHIpIFwKIAlfX3B1dF91c2VyX25vY2hlY2soKF9fdHlwZW9mX18oKihwdHIpKSkoeCksIChwdHIpLCBzaXplb2YoKihwdHIpKSkKKwogI2lmbmRlZiBfX3Bvd2VycGM2NF9fCiAjZGVmaW5lIF9fZ2V0X3VzZXI2NCh4LCBwdHIpIFwKIAlfX2dldF91c2VyNjRfbm9jaGVjaygoeCksIChwdHIpLCBzaXplb2YoKihwdHIpKSkKICNkZWZpbmUgX19wdXRfdXNlcjY0KHgsIHB0cikgX19wdXRfdXNlcih4LCBwdHIpCiAjZW5kaWYKIAorI2RlZmluZSBfX2dldF91c2VyX2luYXRvbWljKHgsIHB0cikgXAorCV9fZ2V0X3VzZXJfbm9zbGVlcCgoeCksIChwdHIpLCBzaXplb2YoKihwdHIpKSkKKyNkZWZpbmUgX19wdXRfdXNlcl9pbmF0b21pYyh4LCBwdHIpIFwKKwlfX3B1dF91c2VyX25vc2xlZXAoKF9fdHlwZW9mX18oKihwdHIpKSkoeCksIChwdHIpLCBzaXplb2YoKihwdHIpKSkKKwogI2RlZmluZSBfX2dldF91c2VyX3VuYWxpZ25lZCBfX2dldF91c2VyCiAjZGVmaW5lIF9fcHV0X3VzZXJfdW5hbGlnbmVkIF9fcHV0X3VzZXIKIApAQCAtMTk4LDYgKzIwNCwxNiBAQAogCV9fcHVfZXJyOwkJCQkJCQlcCiB9KQogCisjZGVmaW5lIF9fcHV0X3VzZXJfbm9zbGVlcCh4LCBwdHIsIHNpemUpCQkJXAorKHsJCQkJCQkJCVwKKwlsb25nIF9fcHVfZXJyOwkJCQkJCVwKKwlfX3R5cGVvZl9fKCoocHRyKSkgX191c2VyICpfX3B1X2FkZHIgPSAocHRyKTsJCVwKKwlfX2Noa191c2VyX3B0cihwdHIpOwkJCQkJXAorCV9fcHV0X3VzZXJfc2l6ZSgoeCksIF9fcHVfYWRkciwgKHNpemUpLCBfX3B1X2Vycik7CVwKKwlfX3B1X2VycjsJCQkJCQlcCit9KQorCisKIGV4dGVybiBsb25nIF9fZ2V0X3VzZXJfYmFkKHZvaWQpOwogCiAjZGVmaW5lIF9fZ2V0X3VzZXJfYXNtKHgsIGFkZHIsIGVyciwgb3ApCQlcCkBAIC0yOTcsNiArMzEzLDE4IEBACiAJX19ndV9lcnI7CQkJCQkJCVwKIH0pCiAKKyNkZWZpbmUgX19nZXRfdXNlcl9ub3NsZWVwKHgsIHB0ciwgc2l6ZSkJCQlcCisoewkJCQkJCQkJXAorCWxvbmcgX19ndV9lcnI7CQkJCQkJXAorCXVuc2lnbmVkIGxvbmcgX19ndV92YWw7CQkJCQlcCisJY29uc3QgX190eXBlb2ZfXygqKHB0cikpIF9fdXNlciAqX19ndV9hZGRyID0gKHB0cik7CVwKKwlfX2Noa191c2VyX3B0cihwdHIpOwkJCQkJXAorCV9fZ2V0X3VzZXJfc2l6ZShfX2d1X3ZhbCwgX19ndV9hZGRyLCAoc2l6ZSksIF9fZ3VfZXJyKTsJXAorCSh4KSA9IChfX3R5cGVvZl9fKCoocHRyKSkpX19ndV92YWw7CQkJXAorCV9fZ3VfZXJyOwkJCQkJCVwKK30pCisKKwogLyogbW9yZSBjb21wbGV4IHJvdXRpbmVzICovCiAKIGV4dGVybiB1bnNpZ25lZCBsb25nIF9fY29weV90b2Zyb21fdXNlcih2b2lkIF9fdXNlciAqdG8sCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3VjY19mYXN0LmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3VjY19mYXN0LmgKaW5kZXggMzlkMWM5MC4uZjUyOWY3MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy91Y2NfZmFzdC5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvdWNjX2Zhc3QuaApAQCAtMTU5LDYgKzE1OSw5IEBACiAJc3RydWN0IHVjY19mYXN0ICp1Zl9yZWdzOwkvKiBhIHBvaW50ZXIgdG8gbWVtb3J5IG1hcCBvZiBVQ0MgcmVncy4gKi8KIAl1MzIgKnBfdWNjZTsJCS8qIGEgcG9pbnRlciB0byB0aGUgZXZlbnQgcmVnaXN0ZXIgaW4gbWVtb3J5LiAqLwogCXUzMiAqcF91Y2NtOwkJLyogYSBwb2ludGVyIHRvIHRoZSBtYXNrIHJlZ2lzdGVyIGluIG1lbW9yeS4gKi8KKyNpZmRlZiBDT05GSUdfVUdFVEhfVFhfT05fREVNQU5ECisJdTE2ICpwX3V0b2RyOwkJLyogcG9pbnRlciB0byB0aGUgdHJhbnNtaXQgb24gZGVtYW5kIHJlZ2lzdGVyICovCisjZW5kaWYKIAlpbnQgZW5hYmxlZF90eDsJCS8qIFdoZXRoZXIgY2hhbm5lbCBpcyBlbmFibGVkIGZvciBUeCAoRU5UKSAqLwogCWludCBlbmFibGVkX3J4OwkJLyogV2hldGhlciBjaGFubmVsIGlzIGVuYWJsZWQgZm9yIFJ4IChFTlIpICovCiAJaW50IHN0b3BwZWRfdHg7CQkvKiBXaGV0aGVyIGNoYW5uZWwgaGFzIGJlZW4gc3RvcHBlZCBmb3IgVHgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvdWljLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3VpYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3MGViN2UKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3VpYy5oCkBAIC0wLDAgKzEsMjMgQEAKKy8qCisgKiBpbmNsdWRlL2FzbS1wb3dlcnBjL3VpYy5oCisgKgorICogSUJNIFBQQzR4eCBVSUMgZXh0ZXJuYWwgZGVmaW5pdGlvbnMgYW5kIHN0cnVjdHVyZS4KKyAqCisgKiBNYWludGFpbmVyOiBEYXZpZCBHaWJzb24gPGR3Z0BhdTEuaWJtLmNvbT4KKyAqIENvcHlyaWdodCAyMDA3IElCTSBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaWZuZGVmIF9BU01fUE9XRVJQQ19VSUNfSAorI2RlZmluZSBfQVNNX1BPV0VSUENfVUlDX0gKKworI2lmZGVmIF9fS0VSTkVMX18KKworZXh0ZXJuIHZvaWQgX19pbml0IHVpY19pbml0X3RyZWUodm9pZCk7CitleHRlcm4gdW5zaWduZWQgaW50IHVpY19nZXRfaXJxKHZvaWQpOworCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworI2VuZGlmIC8qIF9BU01fUE9XRVJQQ19VSUNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjL2libTR4eC5oIGIvaW5jbHVkZS9hc20tcHBjL2libTR4eC5oCmluZGV4IDkyZmQwMmQuLmVkNjg5MWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBwYy9pYm00eHguaAorKysgYi9pbmNsdWRlL2FzbS1wcGMvaWJtNHh4LmgKQEAgLTQ3LDEyICs0Nyw4IEBACiAjaW5jbHVkZSA8cGxhdGZvcm1zLzR4eC93YWxudXQuaD4KICNlbmRpZgogCi0jaWYgZGVmaW5lZChDT05GSUdfWElMSU5YX01MMzAwKQotI2luY2x1ZGUgPHBsYXRmb3Jtcy80eHgveGlsaW54X21sMzAwLmg+Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoQ09ORklHX1hJTElOWF9NTDQwMykKLSNpbmNsdWRlIDxwbGF0Zm9ybXMvNHh4L3hpbGlueF9tbDQwMy5oPgorI2lmIGRlZmluZWQoQ09ORklHX1hJTElOWF9WSVJURVgpCisjaW5jbHVkZSA8cGxhdGZvcm1zLzR4eC92aXJ0ZXguaD4KICNlbmRpZgogCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjL3BwY19zeXMuaCBiL2luY2x1ZGUvYXNtLXBwYy9wcGNfc3lzLmgKaW5kZXggNDBmMTk3YS4uZGU5OWU5MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcHBjL3BwY19zeXMuaAorKysgYi9pbmNsdWRlL2FzbS1wcGMvcHBjX3N5cy5oCkBAIC0zMyw4ICszMyw2IEBACiAjaW5jbHVkZSA8YXNtL21wYzUyeHguaD4KICNlbGlmIGRlZmluZWQoQ09ORklHX01QQzEwWF9CUklER0UpCiAjaW5jbHVkZSA8YXNtL21wYzEweC5oPgotI2VsaWYgZGVmaW5lZChDT05GSUdfWElMSU5YX1ZJUlRFWCkKLSNpbmNsdWRlIDxwbGF0Zm9ybXMvNHh4L3ZpcnRleC5oPgogI2Vsc2UKICNlcnJvciAibmVlZCBkZWZpbml0aW9uIG9mIHBwY19zeXNfZGV2aWNlcyIKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjL3Byb20uaCBiL2luY2x1ZGUvYXNtLXBwYy9wcm9tLmgKaW5kZXggYWRjNWFlNy4uOTAxZjdmYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcHBjL3Byb20uaAorKysgYi9pbmNsdWRlL2FzbS1wcGMvcHJvbS5oCkBAIC0zNCw3ICszNCw4IEBACiAgKi8KICNkZWZpbmUgbWFjaGluZV9pc19jb21wYXRpYmxlKHgpCQkwCiAjZGVmaW5lIG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKGYsIHQsIGMpCU5VTEwKLSNkZWZpbmUgZ2V0X3Byb3BlcnR5KHAsIG4sIGwpCQkJTlVMTAorI2RlZmluZSBvZl9nZXRfcHJvcGVydHkocCwgbiwgbCkJCU5VTEwKKyNkZWZpbmUgZ2V0X3Byb3BlcnR5KGEsIGIsIGMpCQkJb2ZfZ2V0X3Byb3BlcnR5KChhKSwgKGIpLCAoYykpCiAKICNlbmRpZiAvKiBfUFBDX1BST01fSCAqLwogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXMzOTAvYnVnLmggYi9pbmNsdWRlL2FzbS1zMzkwL2J1Zy5oCmluZGV4IDg3Njg5ODMuLjgzODY4NGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXMzOTAvYnVnLmgKKysrIGIvaW5jbHVkZS9hc20tczM5MC9idWcuaApAQCAtMSwyNyArMSw3MCBAQAotI2lmbmRlZiBfUzM5MF9CVUdfSAotI2RlZmluZSBfUzM5MF9CVUdfSAorI2lmbmRlZiBfQVNNX1MzOTBfQlVHX0gKKyNkZWZpbmUgX0FTTV9TMzkwX0JVR19ICiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KIAogI2lmZGVmIENPTkZJR19CVUcKIAotc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9fKChub3JldHVybikpIHZvaWQgX19kb19pbGxlZ2FsX29wKHZvaWQpCi17Ci0jaWYgX19HTlVDX18gPiAzIHx8IChfX0dOVUNfXyA9PSAzICYmIF9fR05VQ19NSU5PUl9fID49IDMpCi0JX19idWlsdGluX3RyYXAoKTsKKyNpZmRlZiBDT05GSUdfNjRCSVQKKyNkZWZpbmUgUzM5MF9MT05HICIucXVhZCIKICNlbHNlCi0JYXNtIHZvbGF0aWxlKCIubG9uZyAwIik7CisjZGVmaW5lIFMzOTBfTE9ORyAiLmxvbmciCiAjZW5kaWYKLX0KIAotI2RlZmluZSBCVUcoKSBkbyB7IFwKLQlwcmludGsoImtlcm5lbCBCVUcgYXQgJXM6JWQhXG4iLCBfX0ZJTEVfXywgX19MSU5FX18pOyBcCi0JX19kb19pbGxlZ2FsX29wKCk7IFwKKyNpZmRlZiBDT05GSUdfREVCVUdfQlVHVkVSQk9TRQorCisjZGVmaW5lIF9fRU1JVF9CVUcoeCkgZG8gewkJCQkJXAorCWFzbSB2b2xhdGlsZSgJCQkJCQlcCisJCSIwOglqCTBiKzJcbiIJCQkJXAorCQkiMTpcbiIJCQkJCQlcCisJCSIuc2VjdGlvbiAucm9kYXRhLnN0cixcImFNU1wiLEBwcm9nYml0cywxXG4iCVwKKwkJIjI6CS5hc2NpeglcIiJfX0ZJTEVfXyJcIlxuIgkJXAorCQkiLnByZXZpb3VzXG4iCQkJCQlcCisJCSIuc2VjdGlvbiBfX2J1Z190YWJsZSxcImFcIlxuIgkJCVwKKwkJIjM6XHQiCVMzOTBfTE9ORyAiXHQxYiwyYlxuIgkJCVwKKwkJIgkuc2hvcnQJJTAsJTFcbiIJCQlcCisJCSIJLm9yZwkzYislMlxuIgkJCVwKKwkJIi5wcmV2aW91c1xuIgkJCQkJXAorCQk6IDogImkiIChfX0xJTkVfXyksCQkJCVwKKwkJICAgICJpIiAoeCksCQkJCQlcCisJCSAgICAiaSIgKHNpemVvZihzdHJ1Y3QgYnVnX2VudHJ5KSkpOwkJXAogfSB3aGlsZSAoMCkKIAorI2Vsc2UgLyogQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0UgKi8KKworI2RlZmluZSBfX0VNSVRfQlVHKHgpIGRvIHsJCQkJXAorCWFzbSB2b2xhdGlsZSgJCQkJCVwKKwkJIjA6CWoJMGIrMlxuIgkJCVwKKwkJIjE6XG4iCQkJCQlcCisJCSIuc2VjdGlvbiBfX2J1Z190YWJsZSxcImFcIlxuIgkJXAorCQkiMjpcdCIJUzM5MF9MT05HICJcdDFiXG4iCQlcCisJCSIJLnNob3J0CSUwXG4iCQkJXAorCQkiCS5vcmcJMmIrJTFcbiIJCVwKKwkJIi5wcmV2aW91c1xuIgkJCQlcCisJCTogOiAiaSIgKHgpLAkJCQlcCisJCSAgICAiaSIgKHNpemVvZihzdHJ1Y3QgYnVnX2VudHJ5KSkpOwlcCit9IHdoaWxlICgwKQorCisjZW5kaWYgLyogQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0UgKi8KKworI2RlZmluZSBCVUcoKQlfX0VNSVRfQlVHKDApCisKKyNkZWZpbmUgV0FSTl9PTih4KSAoewkJCQkJXAorCXR5cGVvZih4KSBfX3JldF93YXJuX29uID0gKHgpOwkJCVwKKwlpZiAoX19idWlsdGluX2NvbnN0YW50X3AoX19yZXRfd2Fybl9vbikpIHsJXAorCQlpZiAoX19yZXRfd2Fybl9vbikJCQlcCisJCQlfX0VNSVRfQlVHKEJVR0ZMQUdfV0FSTklORyk7CVwKKwl9IGVsc2UgewkJCQkJXAorCQlpZiAodW5saWtlbHkoX19yZXRfd2Fybl9vbikpCQlcCisJCQlfX0VNSVRfQlVHKEJVR0ZMQUdfV0FSTklORyk7CVwKKwl9CQkJCQkJXAorCXVubGlrZWx5KF9fcmV0X3dhcm5fb24pOwkJCVwKK30pCisKICNkZWZpbmUgSEFWRV9BUkNIX0JVRwotI2VuZGlmCisjZGVmaW5lIEhBVkVfQVJDSF9XQVJOX09OCisjZW5kaWYgLyogQ09ORklHX0JVRyAqLwogCiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvYnVnLmg+CiAKLSNlbmRpZgorI2VuZGlmIC8qIF9BU01fUzM5MF9CVUdfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tczM5MC9jY3dkZXYuaCBiL2luY2x1ZGUvYXNtLXMzOTAvY2N3ZGV2LmgKaW5kZXggY2ZjODE1My4uNjc5NWVjZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tczM5MC9jY3dkZXYuaAorKysgYi9pbmNsdWRlL2FzbS1zMzkwL2Njd2Rldi5oCkBAIC0xNjQsOSArMTY0LDkgQEAKIGV4dGVybiBpbnQgY2N3X2RldmljZV9oYWx0KHN0cnVjdCBjY3dfZGV2aWNlICosIHVuc2lnbmVkIGxvbmcpOwogZXh0ZXJuIGludCBjY3dfZGV2aWNlX2NsZWFyKHN0cnVjdCBjY3dfZGV2aWNlICosIHVuc2lnbmVkIGxvbmcpOwogCi1leHRlcm4gaW50IHJlYWRfZGV2X2NoYXJzKHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2LCB2b2lkICoqYnVmZmVyLCBpbnQgbGVuZ3RoKTsKLWV4dGVybiBpbnQgcmVhZF9jb25mX2RhdGEoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYsIHZvaWQgKipidWZmZXIsIGludCAqbGVuZ3RoKTsKLWV4dGVybiBpbnQgcmVhZF9jb25mX2RhdGFfbHBtKHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2LCB2b2lkICoqYnVmZmVyLAorZXh0ZXJuIGludCBfX2RlcHJlY2F0ZWQgcmVhZF9kZXZfY2hhcnMoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYsIHZvaWQgKipidWZmZXIsIGludCBsZW5ndGgpOworZXh0ZXJuIGludCBfX2RlcHJlY2F0ZWQgcmVhZF9jb25mX2RhdGEoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYsIHZvaWQgKipidWZmZXIsIGludCAqbGVuZ3RoKTsKK2V4dGVybiBpbnQgX19kZXByZWNhdGVkIHJlYWRfY29uZl9kYXRhX2xwbShzdHJ1Y3QgY2N3X2RldmljZSAqY2Rldiwgdm9pZCAqKmJ1ZmZlciwKIAkJCSAgICAgIGludCAqbGVuZ3RoLCBfX3U4IGxwbSk7CiAKIGV4dGVybiBpbnQgY2N3X2RldmljZV9zZXRfb25saW5lKHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXMzOTAvY2N3Z3JvdXAuaCBiL2luY2x1ZGUvYXNtLXMzOTAvY2N3Z3JvdXAuaAppbmRleCBkMmY5YzBkLi45MjViM2RkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zMzkwL2Njd2dyb3VwLmgKKysrIGIvaW5jbHVkZS9hc20tczM5MC9jY3dncm91cC5oCkBAIC0xMSw2ICsxMSw3IEBACiAJCUNDV0dST1VQX09OTElORSwKIAl9IHN0YXRlOwogCWF0b21pY190IG9ub2ZmOworCXN0cnVjdCBtdXRleCByZWdfbXV0ZXg7CiAJdW5zaWduZWQgaW50IGNvdW50OwkJLyogbnVtYmVyIG9mIGF0dGFjaGVkIHNsYXZlIGRldmljZXMgKi8KIAlzdHJ1Y3QgZGV2aWNlCWRldjsJCS8qIG1hc3RlciBkZXZpY2UJCSAgICAqLwogCXN0cnVjdCBjY3dfZGV2aWNlICpjZGV2WzBdOwkvKiB2YXJpYWJsZSBudW1iZXIsIGFsbG9jYXRlIGFzIG5lZWRlZCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tczM5MC9jaHBpZC5oIGIvaW5jbHVkZS9hc20tczM5MC9jaHBpZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyMDMzMzYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1zMzkwL2NocGlkLmgKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqICBkcml2ZXJzL3MzOTAvY2lvL2NocGlkLmgKKyAqCisgKiAgICBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDcKKyAqICAgIEF1dGhvcihzKTogUGV0ZXIgT2JlcnBhcmxlaXRlciA8cGV0ZXIub2JlcnBhcmxlaXRlckBkZS5pYm0uY29tPgorICovCisKKyNpZm5kZWYgX0FTTV9TMzkwX0NIUElEX0gKKyNkZWZpbmUgX0FTTV9TMzkwX0NIUElEX0ggX0FTTV9TMzkwX0NIUElEX0gKKworI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9jaW8uaD4KKworI2RlZmluZSBfX01BWF9DSFBJRCAyNTUKKworc3RydWN0IGNocF9pZCB7CisJdTggcmVzZXJ2ZWQxOworCXU4IGNzc2lkOworCXU4IHJlc2VydmVkMjsKKwl1OCBpZDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjaHBfaWRfaW5pdChzdHJ1Y3QgY2hwX2lkICpjaHBpZCkKK3sKKwltZW1zZXQoY2hwaWQsIDAsIHNpemVvZihzdHJ1Y3QgY2hwX2lkKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGNocF9pZF9pc19lcXVhbChzdHJ1Y3QgY2hwX2lkICphLCBzdHJ1Y3QgY2hwX2lkICpiKQoreworCXJldHVybiAoYS0+aWQgPT0gYi0+aWQpICYmIChhLT5jc3NpZCA9PSBiLT5jc3NpZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjaHBfaWRfbmV4dChzdHJ1Y3QgY2hwX2lkICpjaHBpZCkKK3sKKwlpZiAoY2hwaWQtPmlkIDwgX19NQVhfQ0hQSUQpCisJCWNocGlkLT5pZCsrOworCWVsc2UgeworCQljaHBpZC0+aWQgPSAwOworCQljaHBpZC0+Y3NzaWQrKzsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGNocF9pZF9pc192YWxpZChzdHJ1Y3QgY2hwX2lkICpjaHBpZCkKK3sKKwlyZXR1cm4gKGNocGlkLT5jc3NpZCA8PSBfX01BWF9DU1NJRCk7Cit9CisKKworI2RlZmluZSBjaHBfaWRfZm9yX2VhY2goYykgXAorCWZvciAoY2hwX2lkX2luaXQoYyk7IGNocF9pZF9pc192YWxpZChjKTsgY2hwX2lkX25leHQoYykpCisKKyNlbmRpZiAvKiBfQVNNX1MzOTBfQ0hQSURfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tczM5MC9jaW8uaCBiL2luY2x1ZGUvYXNtLXMzOTAvY2lvLmgKaW5kZXggZDkyNzg1MC4uZjczOGQyOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tczM5MC9jaW8uaAorKysgYi9pbmNsdWRlL2FzbS1zMzkwL2Npby5oCkBAIC0xMyw2ICsxMyw3IEBACiAjaWZkZWYgX19LRVJORUxfXwogCiAjZGVmaW5lIExQTV9BTllQQVRIIDB4ZmYKKyNkZWZpbmUgX19NQVhfQ1NTSUQgMAogCiAvKgogICogc3ViY2hhbm5lbCBzdGF0dXMgd29yZApAQCAtMjkyLDYgKzI5MywxMyBAQAogCiBleHRlcm4gdm9pZCByZWlwbF9jY3dfZGV2KHN0cnVjdCBjY3dfZGV2X2lkICppZCk7CiAKK3N0cnVjdCBjaW9faXBsaW5mbyB7CisJdTE2IGRldm5vOworCWludCBpc19xZGlvOworfTsKKworZXh0ZXJuIGludCBjaW9fZ2V0X2lwbGluZm8oc3RydWN0IGNpb19pcGxpbmZvICppcGxpbmZvKTsKKwogI2VuZGlmCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tczM5MC9lbGYuaCBiL2luY2x1ZGUvYXNtLXMzOTAvZWxmLmgKaW5kZXggYzBkNjI5ZC4uOTFkMDYzMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tczM5MC9lbGYuaAorKysgYi9pbmNsdWRlL2FzbS1zMzkwL2VsZi5oCkBAIC0xODgsNyArMTg4LDggQEAKIC8qIFRoaXMgeWllbGRzIGEgbWFzayB0aGF0IHVzZXIgcHJvZ3JhbXMgY2FuIHVzZSB0byBmaWd1cmUgb3V0IHdoYXQKICAgIGluc3RydWN0aW9uIHNldCB0aGlzIENQVSBzdXBwb3J0cy4gKi8KIAotI2RlZmluZSBFTEZfSFdDQVAgKDApCitleHRlcm4gdW5zaWduZWQgbG9uZyBlbGZfaHdjYXA7CisjZGVmaW5lIEVMRl9IV0NBUCAoZWxmX2h3Y2FwKQogCiAvKiBUaGlzIHlpZWxkcyBhIHN0cmluZyB0aGF0IGxkLnNvIHdpbGwgdXNlIHRvIGxvYWQgaW1wbGVtZW50YXRpb24KICAgIHNwZWNpZmljIGxpYnJhcmllcyBmb3Igb3B0aW1pemF0aW9uLiAgVGhpcyBpcyBtb3JlIHNwZWNpZmljIGluCkBAIC0xOTcsNyArMTk4LDkgQEAKICAgIEZvciB0aGUgbW9tZW50LCB3ZSBoYXZlIG9ubHkgb3B0aW1pemF0aW9ucyBmb3IgdGhlIEludGVsIGdlbmVyYXRpb25zLAogICAgYnV0IHRoYXQgY291bGQgY2hhbmdlLi4uICovCiAKLSNkZWZpbmUgRUxGX1BMQVRGT1JNIChOVUxMKQorI2RlZmluZSBFTEZfUExBVEZPUk1fU0laRSA4CitleHRlcm4gY2hhciBlbGZfcGxhdGZvcm1bXTsKKyNkZWZpbmUgRUxGX1BMQVRGT1JNIChlbGZfcGxhdGZvcm0pCiAKICNpZm5kZWYgX19zMzkweF9fCiAjZGVmaW5lIFNFVF9QRVJTT05BTElUWShleCwgaWJjczIpIHNldF9wZXJzb25hbGl0eSgoaWJjczIpP1BFUl9TVlI0OlBFUl9MSU5VWCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXMzOTAvaXBsLmggYi9pbmNsdWRlL2FzbS1zMzkwL2lwbC5oCmluZGV4IDBlYjY0MDguLmJkY2Q0NDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXMzOTAvaXBsLmgKKysrIGIvaW5jbHVkZS9hc20tczM5MC9pcGwuaApAQCAtOCw2ICs4LDggQEAKICNkZWZpbmUgX0FTTV9TMzkwX0lQTF9ICiAKICNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vY2lvLmg+CisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAKICNkZWZpbmUgSVBMX1BBUk1CTE9DS19PUklHSU4JMHgyMDAwCiAKQEAgLTc0LDEyICs3NiwxMiBAQAogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogLyoKLSAqIElQTCB2YWxpZGl0eSBmbGFncyBhbmQgcGFyYW1ldGVycyBhcyBkZXRlY3RlZCBpbiBoZWFkLlMKKyAqIElQTCB2YWxpZGl0eSBmbGFncwogICovCiBleHRlcm4gdTMyIGlwbF9mbGFnczsKLWV4dGVybiB1MTYgaXBsX2Rldm5vOwogCiBleHRlcm4gdTMyIGR1bXBfcHJlZml4X3BhZ2U7CisKIGV4dGVybiB2b2lkIGRvX3JlaXBsKHZvaWQpOwogZXh0ZXJuIHZvaWQgaXBsX3NhdmVfcGFyYW1ldGVycyh2b2lkKTsKIApAQCAtODksNiArOTEsMzUgQEAKIAlJUExfTlNTX1ZBTElECQk9IDQsCiB9OwogCitlbnVtIGlwbF90eXBlIHsKKwlJUExfVFlQRV9VTktOT1dOCT0gMSwKKwlJUExfVFlQRV9DQ1cJCT0gMiwKKwlJUExfVFlQRV9GQ1AJCT0gNCwKKwlJUExfVFlQRV9GQ1BfRFVNUAk9IDgsCisJSVBMX1RZUEVfTlNTCQk9IDE2LAorfTsKKworc3RydWN0IGlwbF9pbmZvCit7CisJZW51bSBpcGxfdHlwZSB0eXBlOworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXN0cnVjdCBjY3dfZGV2X2lkIGRldl9pZDsKKwkJfSBjY3c7CisJCXN0cnVjdCB7CisJCQlzdHJ1Y3QgY2N3X2Rldl9pZCBkZXZfaWQ7CisJCQl1NjQgd3dwbjsKKwkJCXU2NCBsdW47CisJCX0gZmNwOworCQlzdHJ1Y3QgeworCQkJY2hhciBuYW1lW05TU19OQU1FX1NJWkUgKyAxXTsKKwkJfSBuc3M7CisJfSBkYXRhOworfTsKKworZXh0ZXJuIHN0cnVjdCBpcGxfaW5mbyBpcGxfaW5mbzsKK2V4dGVybiB2b2lkIHNldHVwX2lwbF9pbmZvKHZvaWQpOworCiAvKgogICogRElBRyAzMDggc3VwcG9ydAogICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zMzkwL2tkZWJ1Zy5oIGIvaW5jbHVkZS9hc20tczM5MC9rZGVidWcuaAppbmRleCAxYjUwZjg5Li5kMmQ3YWQyNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tczM5MC9rZGVidWcuaAorKysgYi9pbmNsdWRlL2FzbS1zMzkwL2tkZWJ1Zy5oCkBAIC0yMiw4ICsyMiwyMSBAQAogICovCiBleHRlcm4gaW50IHJlZ2lzdGVyX2RpZV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKik7CiBleHRlcm4gaW50IHVucmVnaXN0ZXJfZGllX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqKTsKLWV4dGVybiBpbnQgcmVnaXN0ZXJfcGFnZV9mYXVsdF9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKik7Ci1leHRlcm4gaW50IHVucmVnaXN0ZXJfcGFnZV9mYXVsdF9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKik7CisKKy8qCisgKiBUaGVzZSBhcmUgb25seSBoZXJlIGJlY2F1c2Uga3Byb2Jlcy5jIHdhbnRzIHRoZW0gdG8gaW1wbGVtZW50IGEKKyAqIGJsYXRhbnQgbGF5ZXJpbmcgdmlvbGF0aW9uLiBXaWxsIGhvcGVmdWxseSBnbyBhd2F5IHNvb24gb25jZSBhbGwKKyAqIGFyY2hpdGVjdHVyZXMgYXJlIHVwZGF0ZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHJlZ2lzdGVyX3BhZ2VfZmF1bHRfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKK3sKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbmxpbmUgaW50IHVucmVnaXN0ZXJfcGFnZV9mYXVsdF9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKQoreworCXJldHVybiAwOworfQorCiBleHRlcm4gc3RydWN0IGF0b21pY19ub3RpZmllcl9oZWFkIHMzOTBkaWVfY2hhaW47CiAKIGVudW0gZGllX3ZhbCB7CkBAIC0zOSw3ICs1Miw2IEBACiAJRElFX0dQRiwKIAlESUVfQ0FMTCwKIAlESUVfTk1JX0lQSSwKLQlESUVfUEFHRV9GQVVMVCwKIH07CiAKIHN0YXRpYyBpbmxpbmUgaW50IG5vdGlmeV9kaWUoZW51bSBkaWVfdmFsIHZhbCwgY29uc3QgY2hhciAqc3RyLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tczM5MC9rcHJvYmVzLmggYi9pbmNsdWRlL2FzbS1zMzkwL2twcm9iZXMuaAppbmRleCBiODQ3ZmYwLi44MzBmZTRjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zMzkwL2twcm9iZXMuaAorKysgYi9pbmNsdWRlL2FzbS1zMzkwL2twcm9iZXMuaApAQCAtOTcsMTggKzk3LDEwIEBACiBpbnQgIGlzX3Byb2hpYml0ZWRfb3Bjb2RlKGtwcm9iZV9vcGNvZGVfdCAqaW5zdHJ1Y3Rpb24pOwogdm9pZCBnZXRfaW5zdHJ1Y3Rpb25fdHlwZShzdHJ1Y3QgYXJjaF9zcGVjaWZpY19pbnNuICphaW5zbik7CiAKK2ludCBrcHJvYmVfZmF1bHRfaGFuZGxlcihzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IHRyYXBucik7CitpbnQga3Byb2JlX2V4Y2VwdGlvbnNfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqc2VsZiwKKwl1bnNpZ25lZCBsb25nIHZhbCwgdm9pZCAqZGF0YSk7CisKICNkZWZpbmUgZmx1c2hfaW5zbl9zbG90KHApCWRvIHsgfSB3aGlsZSAoMCkKIAogI2VuZGlmCS8qIF9BU01fUzM5MF9LUFJPQkVTX0ggKi8KLQotI2lmZGVmIENPTkZJR19LUFJPQkVTCi0KLWV4dGVybiBpbnQga3Byb2JlX2V4Y2VwdGlvbnNfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqc2VsZiwKLQkJCQkJdW5zaWduZWQgbG9uZyB2YWwsIHZvaWQgKmRhdGEpOwotI2Vsc2UJLyogIUNPTkZJR19LUFJPQkVTICovCi1zdGF0aWMgaW5saW5lIGludCBrcHJvYmVfZXhjZXB0aW9uc19ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLAotCQkJCQkJdW5zaWduZWQgbG9uZyB2YWwsIHZvaWQgKmRhdGEpCi17Ci0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXMzOTAvbG93Y29yZS5oIGIvaW5jbHVkZS9hc20tczM5MC9sb3djb3JlLmgKaW5kZXggNGEzMWQwYS4uODAxYTZmZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tczM5MC9sb3djb3JlLmgKKysrIGIvaW5jbHVkZS9hc20tczM5MC9sb3djb3JlLmgKQEAgLTE0Nyw2ICsxNDcsNTIgQEAKIHZvaWQgbWNja19pbnRfaGFuZGxlcih2b2lkKTsKIHZvaWQgaW9faW50X2hhbmRsZXIodm9pZCk7CiAKK3N0cnVjdCBzYXZlX2FyZWFfczM5MCB7CisJdTMyCWV4dF9zYXZlOworCXU2NAl0aW1lcjsKKwl1NjQJY2xrX2NtcDsKKwl1OAlwYWQxWzI0XTsKKwl1OAlwc3dbOF07CisJdTMyCXByZWZfcmVnOworCXU4CXBhZDJbMjBdOworCXUzMglhY2NfcmVnc1sxNl07CisJdTY0CWZwX3JlZ3NbNF07CisJdTMyCWdwX3JlZ3NbMTZdOworCXUzMgljdHJsX3JlZ3NbMTZdOworfSAgX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBzYXZlX2FyZWFfczM5MHggeworCXU2NAlmcF9yZWdzWzE2XTsKKwl1NjQJZ3BfcmVnc1sxNl07CisJdTgJcHN3WzE2XTsKKwl1OAlwYWQxWzhdOworCXUzMglwcmVmX3JlZzsKKwl1MzIJZnBfY3RybF9yZWc7CisJdTgJcGFkMls0XTsKKwl1MzIJdG9kX3JlZzsKKwl1NjQJdGltZXI7CisJdTY0CWNsa19jbXA7CisJdTgJcGFkM1s4XTsKKwl1MzIJYWNjX3JlZ3NbMTZdOworCXU2NAljdHJsX3JlZ3NbMTZdOworfSAgX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3VuaW9uIHNhdmVfYXJlYSB7CisJc3RydWN0IHNhdmVfYXJlYV9zMzkwCXMzOTA7CisJc3RydWN0IHNhdmVfYXJlYV9zMzkweAlzMzkweDsKK307CisKKyNkZWZpbmUgU0FWRV9BUkVBX0JBU0VfUzM5MAkweGQ0CisjZGVmaW5lIFNBVkVfQVJFQV9CQVNFX1MzOTBYCTB4MTIwMAorCisjaWZuZGVmIF9fczM5MHhfXworI2RlZmluZSBTQVZFX0FSRUFfU0laRSBzaXplb2Yoc3RydWN0IHNhdmVfYXJlYV9zMzkwKQorI2RlZmluZSBTQVZFX0FSRUFfQkFTRSBTQVZFX0FSRUFfQkFTRV9TMzkwCisjZWxzZQorI2RlZmluZSBTQVZFX0FSRUFfU0laRSBzaXplb2Yoc3RydWN0IHNhdmVfYXJlYV9zMzkweCkKKyNkZWZpbmUgU0FWRV9BUkVBX0JBU0UgU0FWRV9BUkVBX0JBU0VfUzM5MFgKKyNlbmRpZgorCiBzdHJ1Y3QgX2xvd2NvcmUKIHsKICNpZm5kZWYgX19zMzkweF9fCkBAIC0xODMsMTcgKzIyOSwxOSBAQAogCV9fdTE2ICAgICAgICBzdWJjaGFubmVsX25yOyAgICAgICAgICAgIC8qIDB4MGJhICovCiAJX191MzIgICAgICAgIGlvX2ludF9wYXJtOyAgICAgICAgICAgICAgLyogMHgwYmMgKi8KIAlfX3UzMiAgICAgICAgaW9faW50X3dvcmQ7ICAgICAgICAgICAgICAvKiAweDBjMCAqLwotICAgICAgICBfX3U4ICAgICAgICAgcGFkM1sweEQ0LTB4QzRdOyAgICAgICAgICAvKiAweDBjNCAqLworCV9fdTgJICAgICBwYWQzWzB4YzgtMHhjNF07CSAgICAgICAvKiAweDBjNCAqLworCV9fdTMyCSAgICAgc3RmbF9mYWNfbGlzdDsJICAgICAgIC8qIDB4MGM4ICovCisJX191OAkgICAgIHBhZDRbMHhkNC0weGNjXTsJICAgICAgIC8qIDB4MGNjICovCiAJX191MzIgICAgICAgIGV4dGVuZGVkX3NhdmVfYXJlYV9hZGRyOyAgLyogMHgwZDQgKi8KIAlfX3UzMiAgICAgICAgY3B1X3RpbWVyX3NhdmVfYXJlYVsyXTsgICAvKiAweDBkOCAqLwogCV9fdTMyICAgICAgICBjbG9ja19jb21wX3NhdmVfYXJlYVsyXTsgIC8qIDB4MGUwICovCiAJX191MzIgICAgICAgIG1jY2tfaW50ZXJydXB0aW9uX2NvZGVbMl07IC8qIDB4MGU4ICovCi0JX191OCAgICAgICAgIHBhZDRbMHhmNC0weGYwXTsgICAgICAgICAgLyogMHgwZjAgKi8KKwlfX3U4CSAgICAgcGFkNVsweGY0LTB4ZjBdOwkgICAgICAgLyogMHgwZjAgKi8KIAlfX3UzMiAgICAgICAgZXh0ZXJuYWxfZGFtYWdlX2NvZGU7ICAgICAvKiAweDBmNCAqLwogCV9fdTMyICAgICAgICBmYWlsaW5nX3N0b3JhZ2VfYWRkcmVzczsgIC8qIDB4MGY4ICovCi0JX191OCAgICAgICAgIHBhZDVbMHgxMDAtMHhmY107ICAgICAgICAgLyogMHgwZmMgKi8KKwlfX3U4CSAgICAgcGFkNlsweDEwMC0weGZjXTsJICAgICAgIC8qIDB4MGZjICovCiAJX191MzIgICAgICAgIHN0X3N0YXR1c19maXhlZF9sb2dvdXRbNF07LyogMHgxMDAgKi8KLQlfX3U4ICAgICAgICAgcGFkNlsweDEyMC0weDExMF07ICAgICAgICAvKiAweDExMCAqLworCV9fdTgJICAgICBwYWQ3WzB4MTIwLTB4MTEwXTsgICAgICAgIC8qIDB4MTEwICovCiAJX191MzIgICAgICAgIGFjY2Vzc19yZWdzX3NhdmVfYXJlYVsxNl07LyogMHgxMjAgKi8KIAlfX3UzMiAgICAgICAgZmxvYXRpbmdfcHRfc2F2ZV9hcmVhWzhdOyAvKiAweDE2MCAqLwogCV9fdTMyICAgICAgICBncHJlZ3Nfc2F2ZV9hcmVhWzE2XTsgICAgIC8qIDB4MTgwICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zMzkwL3BndGFibGUuaCBiL2luY2x1ZGUvYXNtLXMzOTAvcGd0YWJsZS5oCmluZGV4IDEzYzE2NTQuLjhmZThkNDIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXMzOTAvcGd0YWJsZS5oCisrKyBiL2luY2x1ZGUvYXNtLXMzOTAvcGd0YWJsZS5oCkBAIC03NTMsMTQgKzc1MywxNCBAQAogICogc2hvdWxkIHRoZXJlZm9yZSBvbmx5IGJlIGNhbGxlZCBpZiBpdCBpcyBub3QgbWFwcGVkIGluIGFueQogICogYWRkcmVzcyBzcGFjZS4KICAqLwotc3RhdGljIGlubGluZSBpbnQgcGFnZV90ZXN0X2FuZF9jbGVhcl9kaXJ0eShzdHJ1Y3QgcGFnZSAqcGFnZSkKK3N0YXRpYyBpbmxpbmUgaW50IHBhZ2VfdGVzdF9kaXJ0eShzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKLQl1bnNpZ25lZCBsb25nIHBoeXNwYWdlID0gcGFnZV90b19waHlzKHBhZ2UpOwotCWludCBza2V5ID0gcGFnZV9nZXRfc3RvcmFnZV9rZXkocGh5c3BhZ2UpOworCXJldHVybiAocGFnZV9nZXRfc3RvcmFnZV9rZXkocGFnZV90b19waHlzKHBhZ2UpKSAmIF9QQUdFX0NIQU5HRUQpICE9IDA7Cit9CiAKLQlpZiAoc2tleSAmIF9QQUdFX0NIQU5HRUQpCi0JCXBhZ2Vfc2V0X3N0b3JhZ2Vfa2V5KHBoeXNwYWdlLCBza2V5ICYgfl9QQUdFX0NIQU5HRUQpOwotCXJldHVybiBza2V5ICYgX1BBR0VfQ0hBTkdFRDsKK3N0YXRpYyBpbmxpbmUgdm9pZCBwYWdlX2NsZWFyX2RpcnR5KHN0cnVjdCBwYWdlICpwYWdlKQoreworCXBhZ2Vfc2V0X3N0b3JhZ2Vfa2V5KHBhZ2VfdG9fcGh5cyhwYWdlKSwgUEFHRV9ERUZBVUxUX0tFWSk7CiB9CiAKIC8qCkBAIC05NTMsNyArOTUzLDggQEAKICNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9DTEVBUl9GTFVTSAogI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX1NFVF9XUlBST1RFQ1QKICNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFX1NBTUUKLSNkZWZpbmUgX19IQVZFX0FSQ0hfUEFHRV9URVNUX0FORF9DTEVBUl9ESVJUWQorI2RlZmluZSBfX0hBVkVfQVJDSF9QQUdFX1RFU1RfRElSVFkKKyNkZWZpbmUgX19IQVZFX0FSQ0hfUEFHRV9DTEVBUl9ESVJUWQogI2RlZmluZSBfX0hBVkVfQVJDSF9QQUdFX1RFU1RfQU5EX0NMRUFSX1lPVU5HCiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvcGd0YWJsZS5oPgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zMzkwL3Byb2Nlc3Nvci5oIGIvaW5jbHVkZS9hc20tczM5MC9wcm9jZXNzb3IuaAppbmRleCAzM2I4MGNlLi5lMGZjZWE4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zMzkwL3Byb2Nlc3Nvci5oCisrKyBiL2luY2x1ZGUvYXNtLXMzOTAvcHJvY2Vzc29yLmgKQEAgLTU3LDYgKzU3LDcgQEAKIAogZXh0ZXJuIHZvaWQgczM5MF9hZGp1c3RfamlmZmllcyh2b2lkKTsKIGV4dGVybiB2b2lkIHByaW50X2NwdV9pbmZvKHN0cnVjdCBjcHVpbmZvX1MzOTAgKik7CitleHRlcm4gaW50IGdldF9jcHVfY2FwYWJpbGl0eSh1bnNpZ25lZCBpbnQgKik7CiAKIC8qIExhenkgRlBVIGhhbmRsaW5nIG9uIHVuaS1wcm9jZXNzb3IgKi8KIGV4dGVybiBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmxhc3RfdGFza191c2VkX21hdGg7CkBAIC0xOTYsNiArMTk3LDcgQEAKIGV4dGVybiBjaGFyICp0YXNrX3Nob3dfcmVncyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGNoYXIgKmJ1ZmZlcik7CiAKIGV4dGVybiB2b2lkIHNob3dfcmVnaXN0ZXJzKHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK2V4dGVybiB2b2lkIHNob3dfY29kZShzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CiBleHRlcm4gdm9pZCBzaG93X3RyYWNlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgdW5zaWduZWQgbG9uZyAqc3ApOwogCiB1bnNpZ25lZCBsb25nIGdldF93Y2hhbihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tczM5MC9zY2xwLmggYi9pbmNsdWRlL2FzbS1zMzkwL3NjbHAuaAppbmRleCA0NjhiOTcwLi4yMWVkNjQ3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zMzkwL3NjbHAuaAorKysgYi9pbmNsdWRlL2FzbS1zMzkwL3NjbHAuaApAQCAtOSw2ICs5LDcgQEAKICNkZWZpbmUgX0FTTV9TMzkwX1NDTFBfSAogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vY2hwaWQuaD4KIAogc3RydWN0IHNjY2JfaGVhZGVyIHsKIAl1MTYJbGVuZ3RoOwpAQCAtMzMsNyArMzQsMjAgQEAKIAl1OAlfcmVzZXJ2ZWQzWzQwOTYgLSAxMTJdOwkvKiAxMTItNDA5NSAqLwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNDA5NikpKTsKIAorI2RlZmluZSBTQ0xQX0NIUF9JTkZPX01BU0tfU0laRQkJMzIKKworc3RydWN0IHNjbHBfY2hwX2luZm8geworCXU4IHJlY29nbml6ZWRbU0NMUF9DSFBfSU5GT19NQVNLX1NJWkVdOworCXU4IHN0YW5kYnlbU0NMUF9DSFBfSU5GT19NQVNLX1NJWkVdOworCXU4IGNvbmZpZ3VyZWRbU0NMUF9DSFBfSU5GT19NQVNLX1NJWkVdOworfTsKKwogZXh0ZXJuIHN0cnVjdCBzY2xwX3JlYWRpbmZvX3NjY2IgczM5MF9yZWFkaW5mb19zY2NiOwogZXh0ZXJuIHZvaWQgc2NscF9yZWFkaW5mb19lYXJseSh2b2lkKTsKK2V4dGVybiBpbnQgc2NscF9zZGlhc19ibGtfY291bnQodm9pZCk7CitleHRlcm4gaW50IHNjbHBfc2RpYXNfY29weSh2b2lkICpkZXN0LCBpbnQgYmxrX251bSwgaW50IG5yX2Jsa3MpOworZXh0ZXJuIGludCBzY2xwX2NocF9jb25maWd1cmUoc3RydWN0IGNocF9pZCBjaHBpZCk7CitleHRlcm4gaW50IHNjbHBfY2hwX2RlY29uZmlndXJlKHN0cnVjdCBjaHBfaWQgY2hwaWQpOworZXh0ZXJuIGludCBzY2xwX2NocF9yZWFkX2luZm8oc3RydWN0IHNjbHBfY2hwX2luZm8gKmluZm8pOwogCiAjZW5kaWYgLyogX0FTTV9TMzkwX1NDTFBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tczM5MC9zZXR1cC5oIGIvaW5jbHVkZS9hc20tczM5MC9zZXR1cC5oCmluZGV4IDQ0YzdhZWUuLmE3NmE2YjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXMzOTAvc2V0dXAuaAorKysgYi9pbmNsdWRlL2FzbS1zMzkwL3NldHVwLmgKQEAgLTQwLDYgKzQwLDcgQEAKIH07CiAKIGV4dGVybiBzdHJ1Y3QgbWVtX2NodW5rIG1lbW9yeV9jaHVua1tdOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcmVhbF9tZW1vcnlfc2l6ZTsKIAogI2lmZGVmIENPTkZJR19TMzkwX1NXSVRDSF9BTU9ERQogZXh0ZXJuIHVuc2lnbmVkIGludCBzd2l0Y2hfYW1vZGU7CkBAIC03Nyw2ICs3OCw3IEBACiAjZW5kaWYgLyogX19zMzkweF9fICovCiAKICNkZWZpbmUgTUFDSElORV9IQVNfU0NMUAkoIU1BQ0hJTkVfSVNfUDM5MCkKKyNkZWZpbmUgWkZDUERVTVBfSFNBX1NJWkUJKDMyVUw8PDIwKQogCiAvKgogICogQ29uc29sZSBtb2RlLiBPdmVycmlkZSB3aXRoIGNvbm1vZGU9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zMzkwL3NtcC5oIGIvaW5jbHVkZS9hc20tczM5MC9zbXAuaAppbmRleCBiOTU3ZTRjLi4wYTI4ZTZkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zMzkwL3NtcC5oCisrKyBiL2luY2x1ZGUvYXNtLXMzOTAvc21wLmgKQEAgLTU0LDkgKzU0LDYgQEAKIAogI2RlZmluZSByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpCShTMzkwX2xvd2NvcmUuY3B1X2RhdGEuY3B1X25yKQogCi1leHRlcm4gaW50IHNtcF9nZXRfY3B1KGNwdW1hc2tfdCBjcHVfbWFwKTsKLWV4dGVybiB2b2lkIHNtcF9wdXRfY3B1KGludCBjcHUpOwotCiBzdGF0aWMgaW5saW5lIF9fdTE2IGhhcmRfc21wX3Byb2Nlc3Nvcl9pZCh2b2lkKQogewogICAgICAgICBfX3UxNiBjcHVfYWRkcmVzczsKQEAgLTExNCw5ICsxMTEsOCBAQAogfQogCiAjZGVmaW5lIHNtcF9jcHVfbm90X3J1bm5pbmcoY3B1KQkxCi0jZGVmaW5lIHNtcF9nZXRfY3B1KGNwdSkgKHsgMDsgfSkKLSNkZWZpbmUgc21wX3B1dF9jcHUoY3B1KSAoeyAwOyB9KQogI2RlZmluZSBzbXBfc2V0dXBfY3B1X3Bvc3NpYmxlX21hcCgpCWRvIHsgfSB3aGlsZSAoMCkKICNlbmRpZgogCitleHRlcm4gdW5pb24gc2F2ZV9hcmVhICp6ZmNwZHVtcF9zYXZlX2FyZWFzW05SX0NQVVMgKyAxXTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tczM5MC9zb2NrZXQuaCBiL2luY2x1ZGUvYXNtLXMzOTAvc29ja2V0LmgKaW5kZXggMTc3OGE0OS4uMTE2MWViZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tczM5MC9zb2NrZXQuaAorKysgYi9pbmNsdWRlL2FzbS1zMzkwL3NvY2tldC5oCkBAIC01Nyw1ICs1Nyw3IEBACiAKICNkZWZpbmUgU09fUEVFUlNFQwkJMzEKICNkZWZpbmUgU09fUEFTU1NFQwkJMzQKKyNkZWZpbmUgU09fVElNRVNUQU1QTlMJCTM1CisjZGVmaW5lIFNDTV9USU1FU1RBTVBOUwkJU09fVElNRVNUQU1QTlMKIAogI2VuZGlmIC8qIF9BU01fU09DS0VUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXMzOTAvc29ja2lvcy5oIGIvaW5jbHVkZS9hc20tczM5MC9zb2NraW9zLmgKaW5kZXggNDEyYWViNGQuLmY0ZmMxNmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXMzOTAvc29ja2lvcy5oCisrKyBiL2luY2x1ZGUvYXNtLXMzOTAvc29ja2lvcy5oCkBAIC0xNSw2ICsxNSw3IEBACiAjZGVmaW5lIEZJT0dFVE9XTgkweDg5MDMKICNkZWZpbmUgU0lPQ0dQR1JQCTB4ODkwNAogI2RlZmluZSBTSU9DQVRNQVJLCTB4ODkwNQotI2RlZmluZSBTSU9DR1NUQU1QCTB4ODkwNgkJLyogR2V0IHN0YW1wICovCisjZGVmaW5lIFNJT0NHU1RBTVAJMHg4OTA2CQkvKiBHZXQgc3RhbXAgKHRpbWV2YWwpICovCisjZGVmaW5lIFNJT0NHU1RBTVBOUwkweDg5MDcJCS8qIEdldCBzdGFtcCAodGltZXNwZWMpICovCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvc29ja2V0LmggYi9pbmNsdWRlL2FzbS1zaC9zb2NrZXQuaAppbmRleCBjYTcwMzYyLi5jNDhkNmZjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9zb2NrZXQuaAorKysgYi9pbmNsdWRlL2FzbS1zaC9zb2NrZXQuaApAQCAtNDksNSArNDksNyBAQAogCiAjZGVmaW5lIFNPX1BFRVJTRUMJCTMxCiAjZGVmaW5lIFNPX1BBU1NTRUMJCTM0CisjZGVmaW5lIFNPX1RJTUVTVEFNUE5TCQkzNQorI2RlZmluZSBTQ01fVElNRVNUQU1QTlMJCVNPX1RJTUVTVEFNUE5TCiAKICNlbmRpZiAvKiBfX0FTTV9TSF9TT0NLRVRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvc29ja2lvcy5oIGIvaW5jbHVkZS9hc20tc2gvc29ja2lvcy5oCmluZGV4IDA4YTcxZGYuLmNmOGI5NmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL3NvY2tpb3MuaAorKysgYi9pbmNsdWRlL2FzbS1zaC9zb2NraW9zLmgKQEAgLTksNSArOSw2IEBACiAjZGVmaW5lIFNJT0NTUEdSUAlfSU9XKCdzJywgOCwgcGlkX3QpCiAjZGVmaW5lIFNJT0NHUEdSUAlfSU9SKCdzJywgOSwgcGlkX3QpCiAKLSNkZWZpbmUgU0lPQ0dTVEFNUAlfSU9SKCdzJywgMTAwLCBzdHJ1Y3QgdGltZXZhbCkgLyogR2V0IHN0YW1wIC0gbGludXgtc3BlY2lmaWMgKi8KKyNkZWZpbmUgU0lPQ0dTVEFNUAlfSU9SKCdzJywgMTAwLCBzdHJ1Y3QgdGltZXZhbCkgLyogR2V0IHN0YW1wICh0aW1ldmFsKSAqLworI2RlZmluZSBTSU9DR1NUQU1QTlMJX0lPUigncycsIDEwMSwgc3RydWN0IHRpbWVzcGVjKSAvKiBHZXQgc3RhbXAgKHRpbWVzcGVjKSAqLwogI2VuZGlmIC8qIF9fQVNNX1NIX1NPQ0tJT1NfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvc3RyaW5nLmggYi9pbmNsdWRlL2FzbS1zaC9zdHJpbmcuaAppbmRleCA5NWJjN2RiLi41NWY4ZGI2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9zdHJpbmcuaAorKysgYi9pbmNsdWRlL2FzbS1zaC9zdHJpbmcuaApAQCAtMTI2LDkgKzEyNiw2IEBACiAjZGVmaW5lIF9fSEFWRV9BUkNIX1NUUkxFTgogZXh0ZXJuIHNpemVfdCBzdHJsZW4oY29uc3QgY2hhciAqKTsKIAotLyogYXJjaC9zaC9saWIvc3RyY2FzZWNtcC5jICovCi1leHRlcm4gaW50IHN0cmNhc2VjbXAoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOwotCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogCiAjZW5kaWYgLyogX19BU01fU0hfU1RSSU5HX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoNjQvc29ja2lvcy5oIGIvaW5jbHVkZS9hc20tc2g2NC9zb2NraW9zLmgKaW5kZXggMWFlMjNhZS4uNDE5ZTc2ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2g2NC9zb2NraW9zLmgKKysrIGIvaW5jbHVkZS9hc20tc2g2NC9zb2NraW9zLmgKQEAgLTIwLDUgKzIwLDYgQEAKICNkZWZpbmUgU0lPQ1NQR1JQCV9JT1coJ3MnLCA4LCBwaWRfdCkKICNkZWZpbmUgU0lPQ0dQR1JQCV9JT1IoJ3MnLCA5LCBwaWRfdCkKIAotI2RlZmluZSBTSU9DR1NUQU1QCV9JT1IoJ3MnLCAxMDAsIHN0cnVjdCB0aW1ldmFsKSAvKiBHZXQgc3RhbXAgLSBsaW51eC1zcGVjaWZpYyAqLworI2RlZmluZSBTSU9DR1NUQU1QCV9JT1IoJ3MnLCAxMDAsIHN0cnVjdCB0aW1ldmFsKSAvKiBHZXQgc3RhbXAgKHRpbWV2YWwpICovCisjZGVmaW5lIFNJT0NHU1RBTVBOUwlfSU9SKCdzJywgMTAxLCBzdHJ1Y3QgdGltZXNwZWMpIC8qIEdldCBzdGFtcCAodGltZXNwZWMpICovCiAjZW5kaWYgLyogX19BU01fU0g2NF9TT0NLSU9TX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjL3Byb20uaCBiL2luY2x1ZGUvYXNtLXNwYXJjL3Byb20uaAppbmRleCAyNzQ4NjhkLi45ZWExMDVlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYy9wcm9tLmgKKysrIGIvaW5jbHVkZS9hc20tc3BhcmMvcHJvbS5oCkBAIC0zNSw4ICszNSw4IEBACiB9OwogCiBzdHJ1Y3QgZGV2aWNlX25vZGUgewotCWNoYXIJKm5hbWU7Ci0JY2hhcgkqdHlwZTsKKwljb25zdCBjaGFyCSpuYW1lOworCWNvbnN0IGNoYXIJKnR5cGU7CiAJcGhhbmRsZQlub2RlOwogCWNoYXIJKnBhdGhfY29tcG9uZW50X25hbWU7CiAJY2hhcgkqZnVsbF9uYW1lOwpAQCAtODUsMTIgKzg1LDE0IEBACiBleHRlcm4gc3RydWN0IGRldmljZV9ub2RlICpvZl9nZXRfcGFyZW50KGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSk7CiBleHRlcm4gc3RydWN0IGRldmljZV9ub2RlICpvZl9nZXRfbmV4dF9jaGlsZChjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsCiAJCQkJCSAgICAgc3RydWN0IGRldmljZV9ub2RlICpwcmV2KTsKLWV4dGVybiBzdHJ1Y3QgcHJvcGVydHkgKm9mX2ZpbmRfcHJvcGVydHkoc3RydWN0IGRldmljZV9ub2RlICpucCwKK2V4dGVybiBzdHJ1Y3QgcHJvcGVydHkgKm9mX2ZpbmRfcHJvcGVydHkoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpucCwKIAkJCQkJIGNvbnN0IGNoYXIgKm5hbWUsCiAJCQkJCSBpbnQgKmxlbnApOwotZXh0ZXJuIGludCBvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldmljZSwgY29uc3QgY2hhciAqKTsKLWV4dGVybiB2b2lkICpvZl9nZXRfcHJvcGVydHkoc3RydWN0IGRldmljZV9ub2RlICpub2RlLCBjb25zdCBjaGFyICpuYW1lLAotCQkJICAgICBpbnQgKmxlbnApOworZXh0ZXJuIGludCBvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldmljZSwKKwkJCQkgICBjb25zdCBjaGFyICopOworZXh0ZXJuIGNvbnN0IHZvaWQgKm9mX2dldF9wcm9wZXJ0eShjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsCisJCQkJICAgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkgICBpbnQgKmxlbnApOwogI2RlZmluZSBnZXRfcHJvcGVydHkobm9kZSxuYW1lLGxlbnApIG9mX2dldF9wcm9wZXJ0eShub2RlLG5hbWUsbGVucCkKIGV4dGVybiBpbnQgb2Zfc2V0X3Byb3BlcnR5KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwgY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqdmFsLCBpbnQgbGVuKTsKIGV4dGVybiBpbnQgb2ZfZ2V0aW50cHJvcF9kZWZhdWx0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYy9zb2NrZXQuaCBiL2luY2x1ZGUvYXNtLXNwYXJjL3NvY2tldC5oCmluZGV4IGY2YzRlNWIuLjdjMTQyMzkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjL3NvY2tldC5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjL3NvY2tldC5oCkBAIC00OSw2ICs0OSw4IEBACiAKICNkZWZpbmUgU09fUEVFUlNFQwkJMHgwMDFlCiAjZGVmaW5lIFNPX1BBU1NTRUMJCTB4MDAxZgorI2RlZmluZSBTT19USU1FU1RBTVBOUwkJMHgwMDIxCisjZGVmaW5lIFNDTV9USU1FU1RBTVBOUwkJU09fVElNRVNUQU1QTlMKIAogLyogU2VjdXJpdHkgbGV2ZWxzIC0gYXMgcGVyIE5STCBJUHY2IC0gZG9uJ3QgYWN0dWFsbHkgZG8gYW55dGhpbmcgKi8KICNkZWZpbmUgU09fU0VDVVJJVFlfQVVUSEVOVElDQVRJT04JCTB4NTAwMQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmMvc29ja2lvcy5oIGIvaW5jbHVkZS9hc20tc3BhcmMvc29ja2lvcy5oCmluZGV4IDBjMDFiNTkuLjk5MGVhNzQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjL3NvY2tpb3MuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYy9zb2NraW9zLmgKQEAgLTcsNyArNyw4IEBACiAjZGVmaW5lIEZJT0dFVE9XTgkweDg5MDMKICNkZWZpbmUgU0lPQ0dQR1JQCTB4ODkwNAogI2RlZmluZSBTSU9DQVRNQVJLCTB4ODkwNQotI2RlZmluZSBTSU9DR1NUQU1QCTB4ODkwNgkJLyogR2V0IHN0YW1wICovCisjZGVmaW5lIFNJT0NHU1RBTVAJMHg4OTA2CQkvKiBHZXQgc3RhbXAgKHRpbWV2YWwpICovCisjZGVmaW5lIFNJT0NHU1RBTVBOUwkweDg5MDcJCS8qIEdldCBzdGFtcCAodGltZXNwZWMpICovCiAKICNlbmRpZiAvKiAhKF9BU01fU1BBUkNfU09DS0lPU19IKSAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L2NwdWRhdGEuaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvY3B1ZGF0YS5oCmluZGV4IGYyY2M5NDEuLmU4OTkyMmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvY3B1ZGF0YS5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvY3B1ZGF0YS5oCkBAIC0xNyw4ICsxNyw4IEBACiB0eXBlZGVmIHN0cnVjdCB7CiAJLyogRGNhY2hlIGxpbmUgMSAqLwogCXVuc2lnbmVkIGludAlfX3NvZnRpcnFfcGVuZGluZzsgLyogbXVzdCBiZSAxc3QsIHNlZSBydHJhcC5TICovCi0JdW5zaWduZWQgaW50CW11bHRpcGxpZXI7Ci0JdW5zaWduZWQgaW50CWNvdW50ZXI7CisJdW5zaWduZWQgaW50CV9fcGFkMF8xOworCXVuc2lnbmVkIGludAlfX3BhZDBfMjsKIAl1bnNpZ25lZCBpbnQJX19wYWQxOwogCXVuc2lnbmVkIGxvbmcJY2xvY2tfdGljazsJLyogJXRpY2sncyBwZXIgc2Vjb25kICovCiAJdW5zaWduZWQgbG9uZwl1ZGVsYXlfdmFsOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9kZXZpY2UuaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvZGV2aWNlLmgKaW5kZXggZDhmOTg3Mi4uZDVhNDU1OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmM2NC9kZXZpY2UuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L2RldmljZS5oCkBAIC0zLDUgKzMsMjEgQEAKICAqCiAgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyCiAgKi8KLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9kZXZpY2UuaD4KKyNpZm5kZWYgX0FTTV9TUEFSQzY0X0RFVklDRV9ICisjZGVmaW5lIF9BU01fU1BBUkM2NF9ERVZJQ0VfSAogCitzdHJ1Y3QgZGV2aWNlX25vZGU7CitzdHJ1Y3Qgb2ZfZGV2aWNlOworCitzdHJ1Y3QgZGV2X2FyY2hkYXRhIHsKKwl2b2lkCQkJKmlvbW11OworCXZvaWQJCQkqc3RjOworCXZvaWQJCQkqaG9zdF9jb250cm9sbGVyOworCisJc3RydWN0IGRldmljZV9ub2RlCSpwcm9tX25vZGU7CisJc3RydWN0IG9mX2RldmljZQkqb3A7CisKKwl1bnNpZ25lZCBpbnQJCW1zaV9udW07Cit9OworCisjZW5kaWYgLyogX0FTTV9TUEFSQzY0X0RFVklDRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L2VidXMuaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvZWJ1cy5oCmluZGV4IGE0YWZlOWQuLjljMWM2ZGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvZWJ1cy5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvZWJ1cy5oCkBAIC04LDcgKzgsNiBAQAogI2lmbmRlZiBfX1NQQVJDNjRfRUJVU19ICiAjZGVmaW5lIF9fU1BBUkM2NF9FQlVTX0gKIAotI2luY2x1ZGUgPGFzbS9wYm0uaD4KICNpbmNsdWRlIDxhc20vb3BsaWIuaD4KICNpbmNsdWRlIDxhc20vcHJvbS5oPgogI2luY2x1ZGUgPGFzbS9vZl9kZXZpY2UuaD4KQEAgLTQxLDcgKzQwLDYgQEAKIAlzdHJ1Y3Qgb2ZfZGV2aWNlCQlvZmRldjsKIAlzdHJ1Y3QgbGludXhfZWJ1cwkJKm5leHQ7CiAJc3RydWN0IGxpbnV4X2VidXNfZGV2aWNlCSpkZXZpY2VzOwotCXN0cnVjdCBwY2lfcGJtX2luZm8JCSpwYXJlbnQ7CiAJc3RydWN0IHBjaV9kZXYJCQkqc2VsZjsKIAlpbnQJCQkJIGluZGV4OwogCWludAkJCQkgaXNfcmlvOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9mbG9wcHkuaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvZmxvcHB5LmgKaW5kZXggMzMxMDEzYS4uNGFhMDkyNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmM2NC9mbG9wcHkuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L2Zsb3BweS5oCkBAIC01NDksNyArNTQ5LDcgQEAKIAlpZiAoIXN0cmNtcChlZGV2LT5wcm9tX25vZGUtPm5hbWUsICJmZHRocmVlIikpCiAJCXJldHVybiAxOwogCWlmICghc3RyY21wKGVkZXYtPnByb21fbm9kZS0+bmFtZSwgImZsb3BweSIpKSB7Ci0JCWNoYXIgKmNvbXBhdDsKKwkJY29uc3QgY2hhciAqY29tcGF0OwogCiAJCWNvbXBhdCA9IG9mX2dldF9wcm9wZXJ0eShlZGV2LT5wcm9tX25vZGUsCiAJCQkJCSAiY29tcGF0aWJsZSIsIE5VTEwpOwpAQCAtNjYxLDcgKzY2MSw3IEBACiAJCXN0cnVjdCBsaW51eF9lYnVzX2RldmljZSAqZWRldiA9IE5VTEw7CiAJCXVuc2lnbmVkIGxvbmcgY29uZmlnID0gMDsKIAkJdm9pZCBfX2lvbWVtICphdXhpb19yZWc7Ci0JCWNoYXIgKnN0YXRlX3Byb3A7CisJCWNvbnN0IGNoYXIgKnN0YXRlX3Byb3A7CiAKIAkJZm9yX2VhY2hfZWJ1cyhlYnVzKSB7CiAJCQlmb3JfZWFjaF9lYnVzZGV2KGVkZXYsIGVidXMpIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvaW8uaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvaW8uaAppbmRleCAzMGI5MTJkLi5hZDU5NWI2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYzY0L2lvLmgKKysrIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9pby5oCkBAIC0yNCwxNCArMjQsNiBAQAogI2RlZmluZSBwYWdlX3RvX3BoeXMocGFnZSkJKHBhZ2VfdG9fcGZuKHBhZ2UpIDw8IFBBR0VfU0hJRlQpCiAjZGVmaW5lIEJJT19WTUVSR0VfQk9VTkRBUlkJODE5MgogCi0vKiBEaWZmZXJlbnQgUENJIGNvbnRyb2xsZXJzIHdlIHN1cHBvcnQgaGF2ZSB0aGVpciBQQ0kgTUVNIHNwYWNlCi0gKiBtYXBwZWQgdG8gYW4gZWl0aGVyIDJHQiAoUHN5Y2hvKSBvciA0R0IgKFNhYnJlKSBhbGlnbmVkIGFyZWEsCi0gKiBzbyBuZWVkIHRvIGNob3Agb2ZmIHRoZSB0b3AgMzMgb3IgMzIgYml0cy4KLSAqLwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcGNpX21lbXNwYWNlX21hc2s7Ci0KLSNkZWZpbmUgYnVzX2R2bWFfdG9fbWVtKF9fdmFkZHIpICgoX192YWRkcikgJiBwY2lfbWVtc3BhY2VfbWFzaykKLQogc3RhdGljIF9faW5saW5lX18gdTggX2luYih1bnNpZ25lZCBsb25nIGFkZHIpCiB7CiAJdTggcmV0OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9pb21tdS5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9pb21tdS5oCmluZGV4IDBkZTdhM2QuLmUxOTk1OTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvaW9tbXUuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L2lvbW11LmgKQEAgLTcsMTUgKzcsNTAgQEAKICNkZWZpbmUgX1NQQVJDNjRfSU9NTVVfSAogCiAvKiBUaGUgZm9ybWF0IG9mIGFuIGlvcHRlIGluIHRoZSBwYWdlIHRhYmxlcy4gKi8KLSNkZWZpbmUgSU9QVEVfVkFMSUQgICAweDgwMDAwMDAwMDAwMDAwMDBVTCAvKiBJT1BURSBpcyB2YWxpZCAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIElPUFRFXzY0SyAgICAgMHgyMDAwMDAwMDAwMDAwMDAwVUwgLyogSU9QVEUgaXMgZm9yIDY0ayBwYWdlICAgICAgICAgICAqLwotI2RlZmluZSBJT1BURV9TVEJVRiAgIDB4MTAwMDAwMDAwMDAwMDAwMFVMIC8qIERWTUEgY2FuIHVzZSBzdHJlYW1pbmcgYnVmZmVyICAgKi8KLSNkZWZpbmUgSU9QVEVfSU5UUkEgICAweDA4MDAwMDAwMDAwMDAwMDBVTCAvKiBTQlVTIHNsb3QtLT5zbG90IGRpcmVjdCB0cmFuc2ZlciovCi0jZGVmaW5lIElPUFRFX0NPTlRFWFQgMHgwN2ZmODAwMDAwMDAwMDAwVUwgLyogQ29udGV4dCBudW1iZXIJCSAgICAgICovCi0jZGVmaW5lIElPUFRFX1BBR0UgICAgMHgwMDAwN2ZmZmZmZmZlMDAwVUwgLyogUGh5c2ljYWwgcGFnZSBudW1iZXIgKFBBWzQyOjEzXSkqLwotI2RlZmluZSBJT1BURV9DQUNIRSAgIDB4MDAwMDAwMDAwMDAwMDAxMFVMIC8qIENhY2hlZCAoaW4gVVBBIEUtY2FjaGUpICAgICAgICAgKi8KLSNkZWZpbmUgSU9QVEVfV1JJVEUgICAweDAwMDAwMDAwMDAwMDAwMDJVTCAvKiBXcml0ZWFibGUgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIElPUFRFX1ZBTElEICAgMHg4MDAwMDAwMDAwMDAwMDAwVUwKKyNkZWZpbmUgSU9QVEVfNjRLICAgICAweDIwMDAwMDAwMDAwMDAwMDBVTAorI2RlZmluZSBJT1BURV9TVEJVRiAgIDB4MTAwMDAwMDAwMDAwMDAwMFVMCisjZGVmaW5lIElPUFRFX0lOVFJBICAgMHgwODAwMDAwMDAwMDAwMDAwVUwKKyNkZWZpbmUgSU9QVEVfQ09OVEVYVCAweDA3ZmY4MDAwMDAwMDAwMDBVTAorI2RlZmluZSBJT1BURV9QQUdFICAgIDB4MDAwMDdmZmZmZmZmZTAwMFVMCisjZGVmaW5lIElPUFRFX0NBQ0hFICAgMHgwMDAwMDAwMDAwMDAwMDEwVUwKKyNkZWZpbmUgSU9QVEVfV1JJVEUgICAweDAwMDAwMDAwMDAwMDAwMDJVTAogCiAjZGVmaW5lIElPTU1VX05VTV9DVFhTCTQwOTYKIAorc3RydWN0IGlvbW11X2FyZW5hIHsKKwl1bnNpZ25lZCBsb25nCSptYXA7CisJdW5zaWduZWQgaW50CWhpbnQ7CisJdW5zaWduZWQgaW50CWxpbWl0OworfTsKKworc3RydWN0IGlvbW11IHsKKwlzcGlubG9ja190CQlsb2NrOworCXN0cnVjdCBpb21tdV9hcmVuYQlhcmVuYTsKKwlpb3B0ZV90CQkJKnBhZ2VfdGFibGU7CisJdTMyCQkJcGFnZV90YWJsZV9tYXBfYmFzZTsKKwl1bnNpZ25lZCBsb25nCQlpb21tdV9jb250cm9sOworCXVuc2lnbmVkIGxvbmcJCWlvbW11X3RzYmJhc2U7CisJdW5zaWduZWQgbG9uZwkJaW9tbXVfZmx1c2g7CisJdW5zaWduZWQgbG9uZwkJaW9tbXVfY3R4Zmx1c2g7CisJdW5zaWduZWQgbG9uZwkJd3JpdGVfY29tcGxldGVfcmVnOworCXVuc2lnbmVkIGxvbmcJCWR1bW15X3BhZ2U7CisJdW5zaWduZWQgbG9uZwkJZHVtbXlfcGFnZV9wYTsKKwl1bnNpZ25lZCBsb25nCQljdHhfbG93ZXN0X2ZyZWU7CisJREVDTEFSRV9CSVRNQVAoY3R4X2JpdG1hcCwgSU9NTVVfTlVNX0NUWFMpOworCXUzMgkJCWRtYV9hZGRyX21hc2s7Cit9OworCitzdHJ1Y3Qgc3RyYnVmIHsKKwlpbnQJCQlzdHJidWZfZW5hYmxlZDsKKwl1bnNpZ25lZCBsb25nCQlzdHJidWZfY29udHJvbDsKKwl1bnNpZ25lZCBsb25nCQlzdHJidWZfcGZsdXNoOworCXVuc2lnbmVkIGxvbmcJCXN0cmJ1Zl9mc3luYzsKKwl1bnNpZ25lZCBsb25nCQlzdHJidWZfY3R4Zmx1c2g7CisJdW5zaWduZWQgbG9uZwkJc3RyYnVmX2N0eG1hdGNoX2Jhc2U7CisJdW5zaWduZWQgbG9uZwkJc3RyYnVmX2ZsdXNoZmxhZ19wYTsKKwl2b2xhdGlsZSB1bnNpZ25lZCBsb25nICpzdHJidWZfZmx1c2hmbGFnOworCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcJX19mbHVzaGZsYWdfYnVmWyg2NCsoNjQtMSkpIC8gc2l6ZW9mKGxvbmcpXTsKK307CisKICNlbmRpZiAvKiAhKF9TUEFSQ19JT01NVV9IKSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9pc2EuaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvaXNhLmgKaW5kZXggZDk3MjhiOS4uZWNkOTI5MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmM2NC9pc2EuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L2lzYS5oCkBAIC03LDcgKzcsNiBAQAogI2lmbmRlZiBfX1NQQVJDNjRfSVNBX0gKICNkZWZpbmUgX19TUEFSQzY0X0lTQV9ICiAKLSNpbmNsdWRlIDxhc20vcGJtLmg+CiAjaW5jbHVkZSA8YXNtL29wbGliLmg+CiAjaW5jbHVkZSA8YXNtL3Byb20uaD4KICNpbmNsdWRlIDxhc20vb2ZfZGV2aWNlLmg+CkBAIC0yOSw3ICsyOCw2IEBACiAJc3RydWN0IG9mX2RldmljZQlvZmRldjsKIAlzdHJ1Y3Qgc3BhcmNfaXNhX2JyaWRnZQkqbmV4dDsKIAlzdHJ1Y3Qgc3BhcmNfaXNhX2RldmljZQkqZGV2aWNlczsKLQlzdHJ1Y3QgcGNpX3BibV9pbmZvCSpwYXJlbnQ7CiAJc3RydWN0IHBjaV9kZXYJCSpzZWxmOwogCWludAkJCWluZGV4OwogCXN0cnVjdCBkZXZpY2Vfbm9kZQkqcHJvbV9ub2RlOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9wYXJwb3J0LmggYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3BhcnBvcnQuaAppbmRleCAyODRkZmQwLi42MzQwYTUyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYzY0L3BhcnBvcnQuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3BhcnBvcnQuaApAQCAtMTAzLDcgKzEwMyw3IEBACiAJaWYgKCFzdHJjbXAoZWRldi0+cHJvbV9ub2RlLT5uYW1lLCAiZWNwcCIpKQogCQlyZXR1cm4gMTsKIAlpZiAoIXN0cmNtcChlZGV2LT5wcm9tX25vZGUtPm5hbWUsICJwYXJhbGxlbCIpKSB7Ci0JCWNoYXIgKmNvbXBhdDsKKwkJY29uc3QgY2hhciAqY29tcGF0OwogCiAJCWNvbXBhdCA9IG9mX2dldF9wcm9wZXJ0eShlZGV2LT5wcm9tX25vZGUsCiAJCQkJCSAiY29tcGF0aWJsZSIsIE5VTEwpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9wYm0uaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvcGJtLmgKaW5kZXggN2EyNDZkOC4uYzAwOGNlY2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvcGJtLmgKKysrIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9wYm0uaApAQCAtMSw3ICsxLDYgQEAKLS8qICRJZDogcGJtLmgsdiAxLjI3IDIwMDEvMDgvMTIgMTM6MTg6MjMgZGF2ZW0gRXhwICQKLSAqIHBibS5oOiBVbHRyYVNwYXJjIFBDSSBjb250cm9sbGVyIHNvZnR3YXJlIHN0YXRlLgorLyogcGJtLmg6IFVsdHJhU3BhcmMgUENJIGNvbnRyb2xsZXIgc29mdHdhcmUgc3RhdGUuCiAgKgotICogQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4LCAxOTk5IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AcmVkaGF0LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCwgMTk5OSwgMjAwNyBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQGRhdmVtbG9mdC5uZXQpCiAgKi8KIAogI2lmbmRlZiBfX1NQQVJDNjRfUEJNX0gKQEAgLTMwLDkwICsyOSw3IEBACiAgKiBQQ0kgYnVzLgogICovCiAKLXN0cnVjdCBwY2lfY29udHJvbGxlcl9pbmZvOwotCi0vKiBUaGlzIGNvbnRhaW5zIHRoZSBzb2Z0d2FyZSBzdGF0ZSBuZWNlc3NhcnkgdG8gZHJpdmUgYSBQQ0kKLSAqIGNvbnRyb2xsZXIncyBJT01NVS4KLSAqLwotc3RydWN0IHBjaV9pb21tdV9hcmVuYSB7Ci0JdW5zaWduZWQgbG9uZwkqbWFwOwotCXVuc2lnbmVkIGludAloaW50OwotCXVuc2lnbmVkIGludAlsaW1pdDsKLX07Ci0KLXN0cnVjdCBwY2lfaW9tbXUgewotCS8qIFRoaXMgcHJvdGVjdHMgdGhlIGNvbnRyb2xsZXIncyBJT01NVSBhbmQgYWxsCi0JICogc3RyZWFtaW5nIGJ1ZmZlcnMgdW5kZXJuZWF0aC4KLQkgKi8KLQlzcGlubG9ja190CWxvY2s7Ci0KLQlzdHJ1Y3QgcGNpX2lvbW11X2FyZW5hIGFyZW5hOwotCi0JLyogSU9NTVUgcGFnZSB0YWJsZSwgYSBsaW5lYXIgYXJyYXkgb2YgaW9wdGVzLiAqLwotCWlvcHRlX3QJCSpwYWdlX3RhYmxlOwkJLyogVGhlIHBhZ2UgdGFibGUgaXRzZWxmLiAqLwotCi0JLyogQmFzZSBQQ0kgbWVtb3J5IHNwYWNlIGFkZHJlc3Mgd2hlcmUgSU9NTVUgbWFwcGluZ3MKLQkgKiBiZWdpbi4KLQkgKi8KLQl1MzIJCXBhZ2VfdGFibGVfbWFwX2Jhc2U7Ci0KLQkvKiBJT01NVSBDb250cm9sbGVyIFJlZ2lzdGVycyAqLwotCXVuc2lnbmVkIGxvbmcJaW9tbXVfY29udHJvbDsJCS8qIElPTU1VIGNvbnRyb2wgcmVnaXN0ZXIgKi8KLQl1bnNpZ25lZCBsb25nCWlvbW11X3RzYmJhc2U7CQkvKiBJT01NVSBwYWdlIHRhYmxlIGJhc2UgcmVnaXN0ZXIgKi8KLQl1bnNpZ25lZCBsb25nCWlvbW11X2ZsdXNoOwkJLyogSU9NTVUgcGFnZSBmbHVzaCByZWdpc3RlciAqLwotCXVuc2lnbmVkIGxvbmcJaW9tbXVfY3R4Zmx1c2g7CQkvKiBJT01NVSBjb250ZXh0IGZsdXNoIHJlZ2lzdGVyICovCi0KLQkvKiBUaGlzIGlzIGEgcmVnaXN0ZXIgaW4gdGhlIFBDSSBjb250cm9sbGVyLCB3aGljaCBpZgotCSAqIHJlYWQgd2lsbCBoYXZlIG5vIHNpZGUtZWZmZWN0cyBidXQgd2lsbCBndWFyYW50ZWUKLQkgKiBjb21wbGV0aW9uIG9mIGFsbCBwcmV2aW91cyB3cml0ZXMgaW50byBJT01NVS9TVEMuCi0JICovCi0JdW5zaWduZWQgbG9uZwl3cml0ZV9jb21wbGV0ZV9yZWc7Ci0KLQkvKiBJbiBvcmRlciB0byBkZWFsIHdpdGggc29tZSBidWdneSB0aGlyZC1wYXJ0eSBQQ0kgYnJpZGdlcyB0aGF0Ci0JICogZG8gd3JvbmcgcHJlZmV0Y2hpbmcsIHdlIG5ldmVyIG1hcmsgdmFsaWQgbWFwcGluZ3MgYXMgaW52YWxpZC4KLQkgKiBJbnN0ZWFkIHdlIHBvaW50IHRoZW0gYXQgdGhpcyBkdW1teSBwYWdlLgotCSAqLwotCXVuc2lnbmVkIGxvbmcJZHVtbXlfcGFnZTsKLQl1bnNpZ25lZCBsb25nCWR1bW15X3BhZ2VfcGE7Ci0KLQkvKiBDVFggYWxsb2NhdGlvbi4gKi8KLQl1bnNpZ25lZCBsb25nIGN0eF9sb3dlc3RfZnJlZTsKLQl1bnNpZ25lZCBsb25nIGN0eF9iaXRtYXBbSU9NTVVfTlVNX0NUWFMgLyAoc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICogOCldOwotCi0JLyogSGVyZSBhIFBDSSBjb250cm9sbGVyIGRyaXZlciBkZXNjcmliZXMgdGhlIGFyZWFzIG9mCi0JICogUENJIG1lbW9yeSBzcGFjZSB3aGVyZSBETUEgdG8vZnJvbSBwaHlzaWNhbCBtZW1vcnkKLQkgKiBhcmUgYWRkcmVzc2VkLiAgRHJpdmVycyBpbnRlcnJvZ2F0ZSB0aGUgUENJIGxheWVyCi0JICogaWYgdGhlaXIgZGV2aWNlIGhhcyBhZGRyZXNzaW5nIGxpbWl0YXRpb25zLiAgVGhleQotCSAqIGRvIHNvIHZpYSBwY2lfZG1hX3N1cHBvcnRlZCwgYW5kIHBhc3MgaW4gYSBtYXNrIG9mCi0JICogRE1BIGFkZHJlc3MgYml0cyB0aGVpciBkZXZpY2UgY2FuIGFjdHVhbGx5IGRyaXZlLgotCSAqCi0JICogVGhlIHRlc3QgZm9yIGJlaW5nIHVzYWJsZSBpczoKLQkgKiAJKGRldmljZV9tYXNrICYgZG1hX2FkZHJfbWFzaykgPT0gZG1hX2FkZHJfbWFzawotCSAqLwotCXUzMiBkbWFfYWRkcl9tYXNrOwotfTsKLQotZXh0ZXJuIHZvaWQgcGNpX2lvbW11X3RhYmxlX2luaXQoc3RydWN0IHBjaV9pb21tdSAqaW9tbXUsIGludCB0c2JzaXplLCB1MzIgZG1hX29mZnNldCwgdTMyIGRtYV9hZGRyX21hc2spOwotCi0vKiBUaGlzIGRlc2NyaWJlcyBhIFBDSSBidXMgbW9kdWxlJ3Mgc3RyZWFtaW5nIGJ1ZmZlci4gKi8KLXN0cnVjdCBwY2lfc3RyYnVmIHsKLQlpbnQJCXN0cmJ1Zl9lbmFibGVkOwkJLyogUHJlc2VudCBhbmQgdXNpbmcgaXQ/ICovCi0KLQkvKiBTdHJlYW1pbmcgQnVmZmVyIENvbnRyb2wgUmVnaXN0ZXJzICovCi0JdW5zaWduZWQgbG9uZwlzdHJidWZfY29udHJvbDsJCS8qIFNUQyBjb250cm9sIHJlZ2lzdGVyICovCi0JdW5zaWduZWQgbG9uZwlzdHJidWZfcGZsdXNoOwkJLyogU1RDIHBhZ2UgZmx1c2ggcmVnaXN0ZXIgKi8KLQl1bnNpZ25lZCBsb25nCXN0cmJ1Zl9mc3luYzsJCS8qIFNUQyBmbHVzaCBzeW5jaHJvbml6YXRpb24gcmVnICovCi0JdW5zaWduZWQgbG9uZwlzdHJidWZfY3R4Zmx1c2g7CS8qIFNUQyBjb250ZXh0IGZsdXNoIHJlZ2lzdGVyICovCi0JdW5zaWduZWQgbG9uZwlzdHJidWZfY3R4bWF0Y2hfYmFzZTsJLyogU1RDIGNvbnRleHQgZmx1c2ggbWF0Y2ggcmVnICovCi0JdW5zaWduZWQgbG9uZwlzdHJidWZfZmx1c2hmbGFnX3BhOwkvKiBQaHlzaWNhbCBhZGRyZXNzIG9mIGZsdXNoIGZsYWcgKi8KLQl2b2xhdGlsZSB1bnNpZ25lZCBsb25nICpzdHJidWZfZmx1c2hmbGFnOyAvKiBUaGUgZmx1c2ggZmxhZyBpdHNlbGYgKi8KLQotCS8qIEFuZCB0aGlzIGlzIHRoZSBhY3R1YWwgZmx1c2ggZmxhZyBhcmVhLgotCSAqIFdlIGFsbG9jYXRlIGV4dHJhIGJlY2F1c2UgdGhlIGNoaXBzIHJlcXVpcmUKLQkgKiBhIDY0LWJ5dGUgYWxpZ25lZCBhcmVhLgotCSAqLwotCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcJX19mbHVzaGZsYWdfYnVmWyg2NCArICg2NCAtIDEpKSAvIHNpemVvZihsb25nKV07Ci19OworZXh0ZXJuIHZvaWQgcGNpX2lvbW11X3RhYmxlX2luaXQoc3RydWN0IGlvbW11ICppb21tdSwgaW50IHRzYnNpemUsIHUzMiBkbWFfb2Zmc2V0LCB1MzIgZG1hX2FkZHJfbWFzayk7CiAKICNkZWZpbmUgUENJX1NUQ19GTFVTSEZMQUdfSU5JVChTVEMpIFwKIAkoKigoU1RDKS0+c3RyYnVmX2ZsdXNoZmxhZykgPSAwVUwpCkBAIC0xMjYsNiArNDIsOCBAQAogI2RlZmluZSBQUk9NX1BDSVJOR19NQVgJCTY0CiAjZGVmaW5lIFBST01fUENJSU1BUF9NQVgJNjQKIAorc3RydWN0IHBjaV9jb250cm9sbGVyX2luZm87CisKIHN0cnVjdCBwY2lfcGJtX2luZm8gewogCS8qIFBDSSBjb250cm9sbGVyIHdlIHNpdCB1bmRlci4gKi8KIAlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXJfaW5mbwkqcGFyZW50OwpAQCAtMTYwLDExICs3OCw2IEBACiAKIAkvKiBPQlAgc3BlY2lmaWMgaW5mb3JtYXRpb24uICovCiAJc3RydWN0IGRldmljZV9ub2RlCQkqcHJvbV9ub2RlOwotCXN0cnVjdCBsaW51eF9wcm9tX3BjaV9yYW5nZXMJKnBibV9yYW5nZXM7Ci0JaW50CQkJCW51bV9wYm1fcmFuZ2VzOwotCXN0cnVjdCBsaW51eF9wcm9tX3BjaV9pbnRtYXAJKnBibV9pbnRtYXA7Ci0JaW50CQkJCW51bV9wYm1faW50bWFwOwotCXN0cnVjdCBsaW51eF9wcm9tX3BjaV9pbnRtYXNrCSpwYm1faW50bWFzazsKIAl1NjQJCQkJaW5vX2JpdG1hcDsKIAogCS8qIFBCTSBJL08gYW5kIE1lbW9yeSBzcGFjZSByZXNvdXJjZXMuICovCkBAIC0xOTcsMTMgKzExMCwxMCBAQAogI2VuZGlmIC8qICEoQ09ORklHX1BDSV9NU0kpICovCiAKIAkvKiBUaGlzIFBCTSdzIHN0cmVhbWluZyBidWZmZXIuICovCi0Jc3RydWN0IHBjaV9zdHJidWYJCXN0YzsKKwlzdHJ1Y3Qgc3RyYnVmCQkJc3RjOwogCiAJLyogSU9NTVUgc3RhdGUsIHBvdGVudGlhbGx5IHNoYXJlZCBieSBib3RoIFBCTSBzZWdtZW50cy4gKi8KLQlzdHJ1Y3QgcGNpX2lvbW11CQkqaW9tbXU7Ci0KLQkvKiBQQ0kgc2xvdCBtYXBwaW5nLiAqLwotCXVuc2lnbmVkIGludAkJCXBjaV9maXJzdF9zbG90OworCXN0cnVjdCBpb21tdQkJCSppb21tdTsKIAogCS8qIE5vdyB0aGluZ3MgZm9yIHRoZSBhY3R1YWwgUENJIGJ1cyBwcm9iZXMuICovCiAJdW5zaWduZWQgaW50CQkJcGNpX2ZpcnN0X2J1c25vOwpAQCAtMjIwLDE3ICsxMzAsMTIgQEAKIAkgKi8KIAlpbnQJCQkJaW5kZXg7CiAKLQkvKiBEbyB0aGUgUEJNcyBib3RoIGV4aXN0IGluIHRoZSBzYW1lIFBDSSBkb21haW4/ICovCi0JaW50CQkJCXBibXNfc2FtZV9kb21haW47Ci0KIAkvKiBUaGUgUENJIGJ1cyBtb2R1bGVzIGNvbnRyb2xsZWQgYnkgdXMuICovCiAJc3RydWN0IHBjaV9wYm1faW5mbwkJcGJtX0E7CiAJc3RydWN0IHBjaV9wYm1faW5mbwkJcGJtX0I7CiAKIAkvKiBPcGVyYXRpb25zIHdoaWNoIGFyZSBjb250cm9sbGVyIHNwZWNpZmljLiAqLwogCXZvaWQgKCpzY2FuX2J1cykoc3RydWN0IHBjaV9jb250cm9sbGVyX2luZm8gKik7Ci0Jdm9pZCAoKmJhc2VfYWRkcmVzc191cGRhdGUpKHN0cnVjdCBwY2lfZGV2ICosIGludCk7Ci0Jdm9pZCAoKnJlc291cmNlX2FkanVzdCkoc3RydWN0IHBjaV9kZXYgKiwgc3RydWN0IHJlc291cmNlICosIHN0cnVjdCByZXNvdXJjZSAqKTsKIAogI2lmZGVmIENPTkZJR19QQ0lfTVNJCiAJaW50ICgqc2V0dXBfbXNpX2lycSkodW5zaWduZWQgaW50ICp2aXJ0X2lycV9wLCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwKQEAgLTI0NCwyNyArMTQ5LDQgQEAKIAl1bnNpZ25lZCBpbnQJCQlwY2lfbGFzdF9idXNubzsKIH07CiAKLS8qIFBDSSBkZXZpY2VzIHdoaWNoIGFyZSBub3QgYnJpZGdlcyBoYXZlIHRoaXMgcGxhY2VkIGluIHRoZWlyIHBjaV9kZXYKLSAqIHN5c2RhdGEgbWVtYmVyLiAgVGhpcyBtYWtlcyBPQlAgYXdhcmUgUENJIGRldmljZSBkcml2ZXJzIGVhc2llciB0bwotICogY29kZS4KLSAqLwotc3RydWN0IHBjaWRldl9jb29raWUgewotCXN0cnVjdCBwY2lfcGJtX2luZm8JCSpwYm07Ci0Jc3RydWN0IGRldmljZV9ub2RlCQkqcHJvbV9ub2RlOwotCXN0cnVjdCBvZl9kZXZpY2UJCSpvcDsKLQlzdHJ1Y3QgbGludXhfcHJvbV9wY2lfcmVnaXN0ZXJzCXByb21fcmVnc1tQUk9NUkVHX01BWF07Ci0JaW50IG51bV9wcm9tX3JlZ3M7Ci0Jc3RydWN0IGxpbnV4X3Byb21fcGNpX3JlZ2lzdGVycyBwcm9tX2Fzc2lnbm1lbnRzW1BST01SRUdfTUFYXTsKLQlpbnQgbnVtX3Byb21fYXNzaWdubWVudHM7Ci0jaWZkZWYgQ09ORklHX1BDSV9NU0kKLQl1bnNpZ25lZCBpbnQJCQltc2lfbnVtOwotI2VuZGlmCi19OwotCi0vKiBDdXJyZW50bHkgdGhlc2UgYXJlIHRoZSBzYW1lIGFjcm9zcyBhbGwgUENJIGNvbnRyb2xsZXJzCi0gKiB3ZSBzdXBwb3J0LiAgU29tZWRheSB0aGV5IG1heSBub3QgYmUuLi4KLSAqLwotI2RlZmluZSBQQ0lfSVJRX0lHTgkweDAwMDAwN2MwCS8qIEludGVycnVwdCBHcm91cCBOdW1iZXIgKi8KLSNkZWZpbmUgUENJX0lSUV9JTk8JMHgwMDAwMDAzZgkvKiBJbnRlcnJ1cHQgTnVtYmVyICovCi0KICNlbmRpZiAvKiAhKF9fU1BBUkM2NF9QQk1fSCkgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvcGNpLmggYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3BjaS5oCmluZGV4IGIxNGE3MjViLi40N2NlYTE2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYzY0L3BjaS5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvcGNpLmgKQEAgLTU0LDcgKzU0LDcgQEAKIAl2b2lkICgqZG1hX3N5bmNfc2dfZm9yX2NwdSkoc3RydWN0IHBjaV9kZXYgKiwgc3RydWN0IHNjYXR0ZXJsaXN0ICosIGludCwgaW50KTsKIH07CiAKLWV4dGVybiBzdHJ1Y3QgcGNpX2lvbW11X29wcyAqcGNpX2lvbW11X29wczsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgcGNpX2lvbW11X29wcyAqcGNpX2lvbW11X29wczsKIAogLyogQWxsb2NhdGUgYW5kIG1hcCBrZXJuZWwgYnVmZmVyIHVzaW5nIGNvbnNpc3RlbnQgbW9kZSBETUEgZm9yIGEgZGV2aWNlLgogICogaHdkZXYgc2hvdWxkIGJlIHZhbGlkIHN0cnVjdCBwY2lfZGV2IHBvaW50ZXIgZm9yIFBDSSBkZXZpY2VzLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9wZ3RhYmxlLmggYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3BndGFibGUuaAppbmRleCBiMTJiZTdhLi40NjcwNWVmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYzY0L3BndGFibGUuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3BndGFibGUuaApAQCAtNzM3LDIwICs3MzcsNiBAQAogZXh0ZXJuIHB0ZV90IHBnb2ZmX3RvX3B0ZSh1bnNpZ25lZCBsb25nKTsKICNkZWZpbmUgUFRFX0ZJTEVfTUFYX0JJVFMJKDY0VUwgLSBQQUdFX1NISUZUIC0gMVVMKQogCi1leHRlcm4gdW5zaWduZWQgbG9uZyBwcm9tX3ZpcnRfdG9fcGh5cyh1bnNpZ25lZCBsb25nLCBpbnQgKik7Ci0KLWV4dGVybiB1bnNpZ25lZCBsb25nIHN1bjR1X2dldF9wdGUodW5zaWduZWQgbG9uZyk7Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX2dldF9waHlzKHVuc2lnbmVkIGxvbmcgYWRkcikKLXsKLQlyZXR1cm4gc3VuNHVfZ2V0X3B0ZShhZGRyKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgX19nZXRfaW9zcGFjZSh1bnNpZ25lZCBsb25nIGFkZHIpCi17Ci0JcmV0dXJuICgoc3VuNHVfZ2V0X3B0ZShhZGRyKSAmIDB4ZjAwMDAwMDApID4+IDI4KTsKLX0KLQogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgKnNwYXJjNjRfdmFsaWRfYWRkcl9iaXRtYXA7CiAKIC8qIE5lZWRzIHRvIGJlIGRlZmluZWQgaGVyZSBhbmQgbm90IGluIGxpbnV4L21tLmgsIGFzIGl0IGlzIGFyY2ggZGVwZW5kZW50ICovCkBAIC03OTEsNiArNzc3LDggQEAKIGV4dGVybiB2b2lkIHN1bjR2X3JlZ2lzdGVyX2ZhdWx0X3N0YXR1cyh2b2lkKTsKIGV4dGVybiB2b2lkIHN1bjR2X2t0c2JfcmVnaXN0ZXIodm9pZCk7CiAKK2V4dGVybiB1bnNpZ25lZCBsb25nIGNtZGxpbmVfbWVtb3J5X3NpemU7CisKICNlbmRpZiAvKiAhKF9fQVNTRU1CTFlfXykgKi8KIAogI2VuZGlmIC8qICEoX1NQQVJDNjRfUEdUQUJMRV9IKSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9wcm9tLmggYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3Byb20uaAppbmRleCAwZWNhMmQ5Li5kZGFkNWY5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYzY0L3Byb20uaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3Byb20uaApAQCAtMzYsOCArMzYsOCBAQAogCiBzdHJ1Y3Qgb2ZfaXJxX2NvbnRyb2xsZXI7CiBzdHJ1Y3QgZGV2aWNlX25vZGUgewotCWNoYXIJKm5hbWU7Ci0JY2hhcgkqdHlwZTsKKwljb25zdCBjaGFyCSpuYW1lOworCWNvbnN0IGNoYXIJKnR5cGU7CiAJcGhhbmRsZQlub2RlOwogCWNoYXIJKnBhdGhfY29tcG9uZW50X25hbWU7CiAJY2hhcgkqZnVsbF9uYW1lOwpAQCAtOTMsMTEgKzkzLDEzIEBACiBleHRlcm4gc3RydWN0IGRldmljZV9ub2RlICpvZl9nZXRfcGFyZW50KGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSk7CiBleHRlcm4gc3RydWN0IGRldmljZV9ub2RlICpvZl9nZXRfbmV4dF9jaGlsZChjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsCiAJCQkJCSAgICAgc3RydWN0IGRldmljZV9ub2RlICpwcmV2KTsKLWV4dGVybiBzdHJ1Y3QgcHJvcGVydHkgKm9mX2ZpbmRfcHJvcGVydHkoc3RydWN0IGRldmljZV9ub2RlICpucCwKK2V4dGVybiBzdHJ1Y3QgcHJvcGVydHkgKm9mX2ZpbmRfcHJvcGVydHkoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpucCwKIAkJCQkJIGNvbnN0IGNoYXIgKm5hbWUsCiAJCQkJCSBpbnQgKmxlbnApOwotZXh0ZXJuIGludCBvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldmljZSwgY29uc3QgY2hhciAqKTsKLWV4dGVybiB2b2lkICpvZl9nZXRfcHJvcGVydHkoc3RydWN0IGRldmljZV9ub2RlICpub2RlLCBjb25zdCBjaGFyICpuYW1lLAorZXh0ZXJuIGludCBvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldmljZSwKKwkJCQkgICBjb25zdCBjaGFyICopOworZXh0ZXJuIGNvbnN0IHZvaWQgKm9mX2dldF9wcm9wZXJ0eShjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsCisJCQkgICAgIGNvbnN0IGNoYXIgKm5hbWUsCiAJCQkgICAgIGludCAqbGVucCk7CiAjZGVmaW5lIGdldF9wcm9wZXJ0eShub2RlLG5hbWUsbGVucCkgb2ZfZ2V0X3Byb3BlcnR5KG5vZGUsbmFtZSxsZW5wKQogZXh0ZXJuIGludCBvZl9zZXRfcHJvcGVydHkoc3RydWN0IGRldmljZV9ub2RlICpub2RlLCBjb25zdCBjaGFyICpuYW1lLCB2b2lkICp2YWwsIGludCBsZW4pOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9zbXAuaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvc21wLmgKaW5kZXggMzg4MjQ5Yi4uY2NhNTQ4MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmM2NC9zbXAuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3NtcC5oCkBAIC00MiwxNSArNDIsMTUgQEAKICNkZWZpbmUgcmF3X3NtcF9wcm9jZXNzb3JfaWQoKSAoY3VycmVudF90aHJlYWRfaW5mbygpLT5jcHUpCiAKIGV4dGVybiB2b2lkIHNtcF9zZXR1cF9jcHVfcG9zc2libGVfbWFwKHZvaWQpOworZXh0ZXJuIHVuc2lnbmVkIGNoYXIgYm9vdF9jcHVfaWQ7CiAKICNlbmRpZiAvKiAhKF9fQVNTRU1CTFlfXykgKi8KIAogI2Vsc2UKIAogI2RlZmluZSBzbXBfc2V0dXBfY3B1X3Bvc3NpYmxlX21hcCgpIGRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgYm9vdF9jcHVfaWQJKDApCiAKICNlbmRpZiAvKiAhKENPTkZJR19TTVApICovCiAKLSNkZWZpbmUgTk9fUFJPQ19JRAkJMHhGRgotCiAjZW5kaWYgLyogIShfU1BBUkM2NF9TTVBfSCkgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvc29ja2V0LmggYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3NvY2tldC5oCmluZGV4IDc1NGQ0NmEuLjk4NjQ0MWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvc29ja2V0LmgKKysrIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9zb2NrZXQuaApAQCAtNDksNiArNDksOCBAQAogCiAjZGVmaW5lIFNPX1BFRVJTRUMJCTB4MDAxZQogI2RlZmluZSBTT19QQVNTU0VDCQkweDAwMWYKKyNkZWZpbmUgU09fVElNRVNUQU1QTlMJCTB4MDAyMQorI2RlZmluZSBTQ01fVElNRVNUQU1QTlMJCVNPX1RJTUVTVEFNUE5TCiAKIC8qIFNlY3VyaXR5IGxldmVscyAtIGFzIHBlciBOUkwgSVB2NiAtIGRvbid0IGFjdHVhbGx5IGRvIGFueXRoaW5nICovCiAjZGVmaW5lIFNPX1NFQ1VSSVRZX0FVVEhFTlRJQ0FUSU9OCQkweDUwMDEKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvc29ja2lvcy5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9zb2NraW9zLmgKaW5kZXggNjczNWJhYjQuLmM3ZDk5MDAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvc29ja2lvcy5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvc29ja2lvcy5oCkBAIC03LDcgKzcsOCBAQAogI2RlZmluZSBGSU9HRVRPV04JMHg4OTAzCiAjZGVmaW5lIFNJT0NHUEdSUAkweDg5MDQKICNkZWZpbmUgU0lPQ0FUTUFSSwkweDg5MDUKLSNkZWZpbmUgU0lPQ0dTVEFNUAkweDg5MDYJCS8qIEdldCBzdGFtcCAqLworI2RlZmluZSBTSU9DR1NUQU1QCTB4ODkwNgkJLyogR2V0IHN0YW1wICh0aW1ldmFsKSAqLworI2RlZmluZSBTSU9DR1NUQU1QTlMJMHg4OTA3CQkvKiBHZXQgc3RhbXAgKHRpbWVzcGVjKSAqLwogCiAjZW5kaWYgLyogIShfQVNNX1NQQVJDNjRfU09DS0lPU19IKSAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L3NwYXJzZW1lbS5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9zcGFyc2VtZW0uaAppbmRleCBlZDVjOWQ4Li43N2JjZDJiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYzY0L3NwYXJzZW1lbS5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvc3BhcnNlbWVtLmgKQEAgLTMsNyArMyw3IEBACiAKICNpZmRlZiBfX0tFUk5FTF9fCiAKLSNkZWZpbmUgU0VDVElPTl9TSVpFX0JJVFMgICAgICAgMjYKKyNkZWZpbmUgU0VDVElPTl9TSVpFX0JJVFMgICAgICAgMzEKICNkZWZpbmUgTUFYX1BIWVNBRERSX0JJVFMgICAgICAgNDIKICNkZWZpbmUgTUFYX1BIWVNNRU1fQklUUyAgICAgICAgNDIKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC90aW1lci5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC90aW1lci5oCmluZGV4IGQ0MzU1OTQuLmNjYmQ2OTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvdGltZXIuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3RpbWVyLmgKQEAgLTExLDIyICsxMSwxOSBAQAogCiAKIHN0cnVjdCBzcGFyYzY0X3RpY2tfb3BzIHsKLQl2b2lkICgqaW5pdF90aWNrKSh1bnNpZ25lZCBsb25nKTsKIAl1bnNpZ25lZCBsb25nICgqZ2V0X3RpY2spKHZvaWQpOwotCXVuc2lnbmVkIGxvbmcgKCpnZXRfY29tcGFyZSkodm9pZCk7Ci0JdW5zaWduZWQgbG9uZyAoKmFkZF90aWNrKSh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nKTsKLQl1bnNpZ25lZCBsb25nICgqYWRkX2NvbXBhcmUpKHVuc2lnbmVkIGxvbmcpOworCWludCAoKmFkZF9jb21wYXJlKSh1bnNpZ25lZCBsb25nKTsKIAl1bnNpZ25lZCBsb25nIHNvZnRpbnRfbWFzazsKKwl2b2lkICgqZGlzYWJsZV9pcnEpKHZvaWQpOworCisJdm9pZCAoKmluaXRfdGljaykodm9pZCk7CisJdW5zaWduZWQgbG9uZyAoKmFkZF90aWNrKSh1bnNpZ25lZCBsb25nKTsKKworCWNoYXIgKm5hbWU7CiB9OwogCiBleHRlcm4gc3RydWN0IHNwYXJjNjRfdGlja19vcHMgKnRpY2tfb3BzOwogCi0jaWZkZWYgQ09ORklHX1NNUAotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdGltZXJfdGlja19vZmZzZXQ7Ci1zdHJ1Y3QgcHRfcmVnczsKLWV4dGVybiB2b2lkIHRpbWVyX3RpY2tfaW50ZXJydXB0KHN0cnVjdCBwdF9yZWdzICopOwotI2VuZGlmCi0KIGV4dGVybiB1bnNpZ25lZCBsb25nIHNwYXJjNjRfZ2V0X2Nsb2NrX3RpY2sodW5zaWduZWQgaW50IGNwdSk7CiAKICNlbmRpZiAvKiBfU1BBUkM2NF9USU1FUl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L3R0YWJsZS5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC90dGFibGUuaAppbmRleCBjMmExNmUxLi5iYmI5YzhmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYzY0L3R0YWJsZS5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvdHRhYmxlLmgKQEAgLTE1NywyMyArMTU3LDYgQEAKIAliYSxhLHB0CSV4Y2MsIHJ0cmFwX2lycTsJCQlcCiAJLnByZXZpb3VzOwogCi0jZGVmaW5lIFRJQ0tfU01QX0lSUQkJCQkJXAotCXJkcHIJJXBpbCwgJWcyOwkJCQlcCi0Jd3JwcgklZzAsIDE1LCAlcGlsOwkJCQlcCi0Jc2V0aGkJJWhpKDFmLTQpLCAlZzc7CQkJCVwKLQliYSxwdAkleGNjLCBldHJhcF9pcnE7CQkJXAotCSBvcgklZzcsICVsbygxZi00KSwgJWc3OwkJCVwKLQlub3A7CQkJCQkJXAotCW5vcDsJCQkJCQlcCi0Jbm9wOwkJCQkJCVwKLQkuc3Vic2VjdGlvbgkyOwkJCQlcCi0xOgljYWxsCXRyYWNlX2hhcmRpcnFzX29mZjsJCQlcCi0JIG5vcDsJCQkJCQlcCi0JY2FsbAlzbXBfcGVyY3B1X3RpbWVyX2ludGVycnVwdDsJCVwKLQkgYWRkCSVzcCwgUFRSRUdTX09GRiwgJW8wOwkJCVwKLQliYSxhLHB0CSV4Y2MsIHJ0cmFwX2lycTsJCQlcCi0JLnByZXZpb3VzOwotCiAjZWxzZQogCiAjZGVmaW5lIFRSQVBfSVJRKHJvdXRpbmUsIGxldmVsKQkJCVwKQEAgLTE4NiwxNiArMTY5LDYgQEAKIAkgYWRkCSVzcCwgUFRSRUdTX09GRiwgJW8xOwkJCVwKIAliYSxhLHB0CSV4Y2MsIHJ0cmFwX2lycTsKIAkKLSNkZWZpbmUgVElDS19TTVBfSVJRCQkJCQlcCi0JcmRwcgklcGlsLCAlZzI7CQkJCVwKLQl3cnByCSVnMCwgMTUsICVwaWw7CQkJCVwKLQlzZXRoaQklaGkoMTA5ZiksICVnNzsJCQkJXAotCWJhLHB0CSV4Y2MsIGV0cmFwX2lycTsJCQlcCi0xMDk6CSBvcgklZzcsICVsbygxMDliKSwgJWc3OwkJCVwKLQljYWxsCXNtcF9wZXJjcHVfdGltZXJfaW50ZXJydXB0OwkJXAotCSBhZGQJJXNwLCBQVFJFR1NfT0ZGLCAlbzA7CQkJXAotCWJhLGEscHQJJXhjYywgcnRyYXBfaXJxOwotCiAjZW5kaWYKIAogI2RlZmluZSBUUkFQX0lWRUMgVFJBUF9OT1NBVkUoZG9faXZlYykKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXVtL2RpdjY0LmggYi9pbmNsdWRlL2FzbS11bS9kaXY2NC5oCmluZGV4IDFlMTdmNzQuLjdiNzNiMmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXVtL2RpdjY0LmgKKysrIGIvaW5jbHVkZS9hc20tdW0vZGl2NjQuaApAQCAtMyw0ICszLDUgQEAKIAogI2luY2x1ZGUgImFzbS9hcmNoL2RpdjY0LmgiCiAKK2V4dGVybiB1aW50NjRfdCBkaXY2NF82NCh1aW50NjRfdCBkaXZpZGVuZCwgdWludDY0X3QgZGl2aXNvcik7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXY4NTAvc29ja2V0LmggYi9pbmNsdWRlL2FzbS12ODUwL3NvY2tldC5oCmluZGV4IDBkZmU1NWEuLmE0YzI0OTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXY4NTAvc29ja2V0LmgKKysrIGIvaW5jbHVkZS9hc20tdjg1MC9zb2NrZXQuaApAQCAtNDksNSArNDksNyBAQAogCiAjZGVmaW5lIFNPX1BFRVJTRUMJCTMxCiAjZGVmaW5lIFNPX1BBU1NTRUMJCTM0CisjZGVmaW5lIFNPX1RJTUVTVEFNUE5TCQkzNQorI2RlZmluZSBTQ01fVElNRVNUQU1QTlMJCVNPX1RJTUVTVEFNUE5TCiAKICNlbmRpZiAvKiBfX1Y4NTBfU09DS0VUX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tdjg1MC9zb2NraW9zLmggYi9pbmNsdWRlL2FzbS12ODUwL3NvY2tpb3MuaAppbmRleCBjZjQ4NzRjLi44MjNlMTA2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS12ODUwL3NvY2tpb3MuaAorKysgYi9pbmNsdWRlL2FzbS12ODUwL3NvY2tpb3MuaApAQCAtNyw2ICs3LDcgQEAKICNkZWZpbmUgRklPR0VUT1dOCTB4ODkwMwogI2RlZmluZSBTSU9DR1BHUlAJMHg4OTA0CiAjZGVmaW5lIFNJT0NBVE1BUksJMHg4OTA1Ci0jZGVmaW5lIFNJT0NHU1RBTVAJMHg4OTA2CQkvKiBHZXQgc3RhbXAgKi8KKyNkZWZpbmUgU0lPQ0dTVEFNUAkweDg5MDYJCS8qIEdldCBzdGFtcCAodGltZXZhbCkgKi8KKyNkZWZpbmUgU0lPQ0dTVEFNUE5TCTB4ODkwNwkJLyogR2V0IHN0YW1wICh0aW1lc3BlYykgKi8KIAogI2VuZGlmIC8qIF9fVjg1MF9TT0NLSU9TX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L3NvY2tldC5oIGIvaW5jbHVkZS9hc20teDg2XzY0L3NvY2tldC5oCmluZGV4IGI0NjcwMjYuLjkwYWY2MGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9zb2NrZXQuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvc29ja2V0LmgKQEAgLTQ5LDUgKzQ5LDcgQEAKIAogI2RlZmluZSBTT19QRUVSU0VDICAgICAgICAgICAgIDMxCiAjZGVmaW5lIFNPX1BBU1NTRUMJCTM0CisjZGVmaW5lIFNPX1RJTUVTVEFNUE5TCQkzNQorI2RlZmluZSBTQ01fVElNRVNUQU1QTlMJCVNPX1RJTUVTVEFNUE5TCiAKICNlbmRpZiAvKiBfQVNNX1NPQ0tFVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvc29ja2lvcy5oIGIvaW5jbHVkZS9hc20teDg2XzY0L3NvY2tpb3MuaAppbmRleCAyZWVmZDEwLi5kNzI2YmEyNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L3NvY2tpb3MuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvc29ja2lvcy5oCkBAIC03LDYgKzcsNyBAQAogI2RlZmluZSBGSU9HRVRPV04JMHg4OTAzCiAjZGVmaW5lIFNJT0NHUEdSUAkweDg5MDQKICNkZWZpbmUgU0lPQ0FUTUFSSwkweDg5MDUKLSNkZWZpbmUgU0lPQ0dTVEFNUAkweDg5MDYJCS8qIEdldCBzdGFtcCAqLworI2RlZmluZSBTSU9DR1NUQU1QCTB4ODkwNgkJLyogR2V0IHN0YW1wICh0aW1ldmFsKSAqLworI2RlZmluZSBTSU9DR1NUQU1QTlMJMHg4OTA3CQkvKiBHZXQgc3RhbXAgKHRpbWVzcGVjKSAqLwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9kaXY2NC5oIGIvaW5jbHVkZS9hc20teHRlbnNhL2RpdjY0LmgKaW5kZXggYzRhMTA1Ny4uMjA5NjVlMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teHRlbnNhL2RpdjY0LmgKKysrIGIvaW5jbHVkZS9hc20teHRlbnNhL2RpdjY0LmgKQEAgLTExLDkgKzExLDE1IEBACiAjaWZuZGVmIF9YVEVOU0FfRElWNjRfSAogI2RlZmluZSBfWFRFTlNBX0RJVjY0X0gKIAorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKICNkZWZpbmUgZG9fZGl2KG4sYmFzZSkgKHsgXAogCWludCBfX3JlcyA9IG4gJSAoKHVuc2lnbmVkIGludCkgYmFzZSk7IFwKIAluIC89ICh1bnNpZ25lZCBpbnQpIGJhc2U7IFwKIAlfX3JlczsgfSkKIAorc3RhdGljIGlubGluZSB1aW50NjRfdCBkaXY2NF82NCh1aW50NjRfdCBkaXZpZGVuZCwgdWludDY0X3QgZGl2aXNvcikKK3sKKwlyZXR1cm4gZGl2aWRlbmQgLyBkaXZpc29yOworfQogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2Evc29ja2V0LmggYi9pbmNsdWRlL2FzbS14dGVuc2Evc29ja2V0LmgKaW5kZXggOTcxZDIzMS4uMWY1YWVhYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teHRlbnNhL3NvY2tldC5oCisrKyBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9zb2NrZXQuaApAQCAtNjAsNSArNjAsNyBAQAogI2RlZmluZSBTT19BQ0NFUFRDT05OCQkzMAogI2RlZmluZSBTT19QRUVSU0VDCQkzMQogI2RlZmluZSBTT19QQVNTU0VDCQkzNAorI2RlZmluZSBTT19USU1FU1RBTVBOUwkJMzUKKyNkZWZpbmUgU0NNX1RJTUVTVEFNUE5TCQlTT19USU1FU1RBTVBOUwogCiAjZW5kaWYJLyogX1hURU5TQV9TT0NLRVRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3NvY2tpb3MuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9zb2NraW9zLmgKaW5kZXggMjBkMmJhMS4uZWZlMGFmMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teHRlbnNhL3NvY2tpb3MuaAorKysgYi9pbmNsdWRlL2FzbS14dGVuc2Evc29ja2lvcy5oCkBAIC0yNSw2ICsyNSw3IEBACiAjZGVmaW5lIFNJT0NTUEdSUAlfSU9XKCdzJywgOCwgcGlkX3QpCiAjZGVmaW5lIFNJT0NHUEdSUAlfSU9SKCdzJywgOSwgcGlkX3QpCiAKLSNkZWZpbmUgU0lPQ0dTVEFNUAkweDg5MDYJCS8qIEdldCBzdGFtcCAtIGxpbnV4LXNwZWNpZmljICovCisjZGVmaW5lIFNJT0NHU1RBTVAJMHg4OTA2CQkvKiBHZXQgc3RhbXAgKHRpbWV2YWwpICovCisjZGVmaW5lIFNJT0NHU1RBTVBOUwkweDg5MDcJCS8qIEdldCBzdGFtcCAodGltZXNwZWMpICovCiAKICNlbmRpZgkvKiBfWFRFTlNBX1NPQ0tJT1NfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9rZXlzL3J4cnBjLXR5cGUuaCBiL2luY2x1ZGUva2V5cy9yeHJwYy10eXBlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJlZTczYQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUva2V5cy9yeHJwYy10eXBlLmgKQEAgLTAsMCArMSwyMiBAQAorLyogUnhSUEMga2V5IHR5cGUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBfS0VZU19SWFJQQ19UWVBFX0gKKyNkZWZpbmUgX0tFWVNfUlhSUENfVFlQRV9ICisKKyNpbmNsdWRlIDxsaW51eC9rZXkuaD4KKworLyoKKyAqIGtleSB0eXBlIGZvciBBRl9SWFJQQyBrZXlzCisgKi8KK2V4dGVybiBzdHJ1Y3Qga2V5X3R5cGUga2V5X3R5cGVfcnhycGM7CisKKyNlbmRpZiAvKiBfS0VZU19VU0VSX1RZUEVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9LYnVpbGQgYi9pbmNsdWRlL2xpbnV4L0tidWlsZAppbmRleCBlODFlMzAxLi40ZmYwZjU3ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9LYnVpbGQKKysrIGIvaW5jbHVkZS9saW51eC9LYnVpbGQKQEAgLTY5LDkgKzY5LDcgQEAKIGhlYWRlci15ICs9IGh5c2RuX2lmLmgKIGhlYWRlci15ICs9IGkyYy1kZXYuaAogaGVhZGVyLXkgKz0gaThrLmgKLWhlYWRlci15ICs9IGljbXAuaAogaGVhZGVyLXkgKz0gaWZfYXJjbmV0LmgKLWhlYWRlci15ICs9IGlmX2FycC5oCiBoZWFkZXIteSArPSBpZl9ib25kaW5nLmgKIGhlYWRlci15ICs9IGlmX2NhYmxlbW9kZW0uaAogaGVhZGVyLXkgKz0gaWZfZmMuaApAQCAtODgsNyArODYsNiBAQAogaGVhZGVyLXkgKz0gaW42LmgKIGhlYWRlci15ICs9IGluX3JvdXRlLmgKIGhlYWRlci15ICs9IGlvY3RsLmgKLWhlYWRlci15ICs9IGlwLmgKIGhlYWRlci15ICs9IGlwbWlfbXNnZGVmcy5oCiBoZWFkZXIteSArPSBpcF9tcF9hbGcuaAogaGVhZGVyLXkgKz0gaXBzZWMuaApAQCAtMTE2LDYgKzExMyw3IEBACiBoZWFkZXIteSArPSBuZnMyLmgKIGhlYWRlci15ICs9IG5mczRfbW91bnQuaAogaGVhZGVyLXkgKz0gbmZzX21vdW50LmgKK2hlYWRlci15ICs9IG5sODAyMTEuaAogaGVhZGVyLXkgKz0gb29tLmgKIGhlYWRlci15ICs9IHBhcmFtLmgKIGhlYWRlci15ICs9IHBjaV9yZWdzLmgKQEAgLTIxMCw4ICsyMDgsMTAgQEAKIHVuaWZkZWYteSArPSBocGV0LmgKIHVuaWZkZWYteSArPSBpMmMuaAogdW5pZmRlZi15ICs9IGkyby1kZXYuaAordW5pZmRlZi15ICs9IGljbXAuaAogdW5pZmRlZi15ICs9IGljbXB2Ni5oCiB1bmlmZGVmLXkgKz0gaWZfYWRkci5oCit1bmlmZGVmLXkgKz0gaWZfYXJwLmgKIHVuaWZkZWYteSArPSBpZl9icmlkZ2UuaAogdW5pZmRlZi15ICs9IGlmX2VjLmgKIHVuaWZkZWYteSArPSBpZl9lcWwuaApAQCAtMjMxLDYgKzIzMSw3IEBACiB1bmlmZGVmLXkgKz0gaW4uaAogdW5pZmRlZi15ICs9IGlub3RpZnkuaAogdW5pZmRlZi15ICs9IGlucHV0LmgKK3VuaWZkZWYteSArPSBpcC5oCiB1bmlmZGVmLXkgKz0gaXBjLmgKIHVuaWZkZWYteSArPSBpcG1pLmgKIHVuaWZkZWYteSArPSBpcHY2LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYXRhLmggYi9pbmNsdWRlL2xpbnV4L2F0YS5oCmluZGV4IDZjYWViOTguLmVkYjMxYmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYXRhLmgKKysrIGIvaW5jbHVkZS9saW51eC9hdGEuaApAQCAtMTU5LDExICsxNTksMTkgQEAKIAlBVEFfQ01EX0lOSVRfREVWX1BBUkFNUwk9IDB4OTEsCiAJQVRBX0NNRF9SRUFEX05BVElWRV9NQVgJPSAweEY4LAogCUFUQV9DTURfUkVBRF9OQVRJVkVfTUFYX0VYVCA9IDB4MjcsCisJQVRBX0NNRF9TRVRfTUFYCQk9IDB4RjksCisJQVRBX0NNRF9TRVRfTUFYX0VYVAk9IDB4MzcsCiAJQVRBX0NNRF9SRUFEX0xPR19FWFQJPSAweDJmLAogCiAJLyogUkVBRF9MT0dfRVhUIHBhZ2VzICovCiAJQVRBX0xPR19TQVRBX05DUQk9IDB4MTAsCiAKKwkvKiBSRUFEL1dSSVRFIExPTkcgKG9ic29sZXRlKSAqLworCUFUQV9DTURfUkVBRF9MT05HCT0gMHgyMiwKKwlBVEFfQ01EX1JFQURfTE9OR19PTkNFCT0gMHgyMywKKwlBVEFfQ01EX1dSSVRFX0xPTkcJPSAweDMyLAorCUFUQV9DTURfV1JJVEVfTE9OR19PTkNFCT0gMHgzMywKKwogCS8qIFNFVEZFQVRVUkVTIHN0dWZmICovCiAJU0VURkVBVFVSRVNfWEZFUgk9IDB4MDMsCiAJWEZFUl9VRE1BXzcJCT0gMHg0NywKQEAgLTE5NCw2ICsyMDIsOCBAQAogCVNFVEZFQVRVUkVTX1dDX09OCT0gMHgwMiwgLyogRW5hYmxlIHdyaXRlIGNhY2hlICovCiAJU0VURkVBVFVSRVNfV0NfT0ZGCT0gMHg4MiwgLyogRGlzYWJsZSB3cml0ZSBjYWNoZSAqLwogCisJU0VURkVBVFVSRVNfU1BJTlVQCT0gMHgwNywgLyogU3Bpbi11cCBkcml2ZSAqLworCiAJLyogQVRBUEkgc3R1ZmYgKi8KIAlBVEFQSV9QS1RfRE1BCQk9ICgxIDw8IDApLAogCUFUQVBJX0RNQURJUgkJPSAoMSA8PCAyKSwJLyogQVRBUEkgZGF0YSBkaXI6CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2F0YWxrLmggYi9pbmNsdWRlL2xpbnV4L2F0YWxrLmgKaW5kZXggZDEyOTg0ZC4uY2VkOGExZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9hdGFsay5oCisrKyBiL2luY2x1ZGUvbGludXgvYXRhbGsuaApAQCAtMTAxLDcgKzEwMSw3IEBACiAKIHN0YXRpYyBfX2lubGluZV9fIHN0cnVjdCBkZHBlaGRyICpkZHBfaGRyKHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JcmV0dXJuIChzdHJ1Y3QgZGRwZWhkciAqKXNrYi0+aC5yYXc7CisJcmV0dXJuIChzdHJ1Y3QgZGRwZWhkciAqKXNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYik7CiB9CiAKIC8qIEFwcGxlVGFsayBBQVJQIGhlYWRlcnMgKi8KQEAgLTEyOSw3ICsxMjksNyBAQAogCiBzdGF0aWMgX19pbmxpbmVfXyBzdHJ1Y3QgZWxhcGFhcnAgKmFhcnBfaGRyKHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JcmV0dXJuIChzdHJ1Y3QgZWxhcGFhcnAgKilza2ItPmgucmF3OworCXJldHVybiAoc3RydWN0IGVsYXBhYXJwICopc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKIH0KIAogLyogTm90IHNwZWNpZmllZCAtIGhvdyBsb25nIHRpbGwgd2UgZHJvcCBhIHJlc29sdmVkIGVudHJ5ICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Jpby5oIGIvaW5jbHVkZS9saW51eC9iaW8uaAppbmRleCAwOGRhZjMyLi40ZDg1MjYyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Jpby5oCisrKyBiL2luY2x1ZGUvbGludXgvYmlvLmgKQEAgLTI3Niw3ICsyNzYsNyBAQAogZXh0ZXJuIG1lbXBvb2xfdCAqYmlvX3NwbGl0X3Bvb2w7CiBleHRlcm4gdm9pZCBiaW9fcGFpcl9yZWxlYXNlKHN0cnVjdCBiaW9fcGFpciAqZGJpbyk7CiAKLWV4dGVybiBzdHJ1Y3QgYmlvX3NldCAqYmlvc2V0X2NyZWF0ZShpbnQsIGludCwgaW50KTsKK2V4dGVybiBzdHJ1Y3QgYmlvX3NldCAqYmlvc2V0X2NyZWF0ZShpbnQsIGludCk7CiBleHRlcm4gdm9pZCBiaW9zZXRfZnJlZShzdHJ1Y3QgYmlvX3NldCAqKTsKIAogZXh0ZXJuIHN0cnVjdCBiaW8gKmJpb19hbGxvYyhnZnBfdCwgaW50KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYmxrZGV2LmggYi9pbmNsdWRlL2xpbnV4L2Jsa2Rldi5oCmluZGV4IDgzZGNkOGMuLmE2ODZlYWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYmxrZGV2LmgKKysrIGIvaW5jbHVkZS9saW51eC9ibGtkZXYuaApAQCAtMTE2LDYgKzExNiw3IEBACiAKIAlzdHJ1Y3QgYXNfaW9fY29udGV4dCAqYWljOwogCXN0cnVjdCByYl9yb290IGNpY19yb290OworCXZvaWQgKmlvY19kYXRhOwogfTsKIAogdm9pZCBwdXRfaW9fY29udGV4dChzdHJ1Y3QgaW9fY29udGV4dCAqaW9jKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZGNjcC5oIGIvaW5jbHVkZS9saW51eC9kY2NwLmgKaW5kZXggMWNiMDU0Yi4uZmRhMjE0OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9kY2NwLmgKKysrIGIvaW5jbHVkZS9saW51eC9kY2NwLmgKQEAgLTI2MCwxOSArMjYwLDIwIEBACiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGRjY3BfaGRyICpkY2NwX2hkcihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXJldHVybiAoc3RydWN0IGRjY3BfaGRyICopc2tiLT5oLnJhdzsKKwlyZXR1cm4gKHN0cnVjdCBkY2NwX2hkciAqKXNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYik7CiB9CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGRjY3BfaGRyICpkY2NwX3plcm9lZF9oZHIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGhlYWRsZW4pCiB7Ci0Jc2tiLT5oLnJhdyA9IHNrYl9wdXNoKHNrYiwgaGVhZGxlbik7Ci0JbWVtc2V0KHNrYi0+aC5yYXcsIDAsIGhlYWRsZW4pOwotCXJldHVybiBkY2NwX2hkcihza2IpOworCXNrYl9wdXNoKHNrYiwgaGVhZGxlbik7CisJc2tiX3Jlc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKKwlyZXR1cm4gbWVtc2V0KHNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYiksIDAsIGhlYWRsZW4pOwogfQogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBkY2NwX2hkcl9leHQgKmRjY3BfaGRyeChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXJldHVybiAoc3RydWN0IGRjY3BfaGRyX2V4dCAqKShza2ItPmgucmF3ICsgc2l6ZW9mKHN0cnVjdCBkY2NwX2hkcikpOworCXJldHVybiAoc3RydWN0IGRjY3BfaGRyX2V4dCAqKShza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpICsKKwkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBkY2NwX2hkcikpOwogfQogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBfX2RjY3BfYmFzaWNfaGRyX2xlbihjb25zdCBzdHJ1Y3QgZGNjcF9oZHIgKmRoKQpAQCAtMzAxLDEyICszMDIsMTQgQEAKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgZGNjcF9oZHJfcmVxdWVzdCAqZGNjcF9oZHJfcmVxdWVzdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXJldHVybiAoc3RydWN0IGRjY3BfaGRyX3JlcXVlc3QgKikoc2tiLT5oLnJhdyArIGRjY3BfYmFzaWNfaGRyX2xlbihza2IpKTsKKwlyZXR1cm4gKHN0cnVjdCBkY2NwX2hkcl9yZXF1ZXN0ICopKHNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYikgKworCQkJCQkgICBkY2NwX2Jhc2ljX2hkcl9sZW4oc2tiKSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGRjY3BfaGRyX2Fja19iaXRzICpkY2NwX2hkcl9hY2tfYml0cyhjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXJldHVybiAoc3RydWN0IGRjY3BfaGRyX2Fja19iaXRzICopKHNrYi0+aC5yYXcgKyBkY2NwX2Jhc2ljX2hkcl9sZW4oc2tiKSk7CisJcmV0dXJuIChzdHJ1Y3QgZGNjcF9oZHJfYWNrX2JpdHMgKikoc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKSArCisJCQkJCSAgICBkY2NwX2Jhc2ljX2hkcl9sZW4oc2tiKSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdTY0IGRjY3BfaGRyX2Fja19zZXEoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKQEAgLTMxNywxMiArMzIwLDE0IEBACiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGRjY3BfaGRyX3Jlc3BvbnNlICpkY2NwX2hkcl9yZXNwb25zZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXJldHVybiAoc3RydWN0IGRjY3BfaGRyX3Jlc3BvbnNlICopKHNrYi0+aC5yYXcgKyBkY2NwX2Jhc2ljX2hkcl9sZW4oc2tiKSk7CisJcmV0dXJuIChzdHJ1Y3QgZGNjcF9oZHJfcmVzcG9uc2UgKikoc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKSArCisJCQkJCSAgICBkY2NwX2Jhc2ljX2hkcl9sZW4oc2tiKSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGRjY3BfaGRyX3Jlc2V0ICpkY2NwX2hkcl9yZXNldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXJldHVybiAoc3RydWN0IGRjY3BfaGRyX3Jlc2V0ICopKHNrYi0+aC5yYXcgKyBkY2NwX2Jhc2ljX2hkcl9sZW4oc2tiKSk7CisJcmV0dXJuIChzdHJ1Y3QgZGNjcF9oZHJfcmVzZXQgKikoc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKSArCisJCQkJCSBkY2NwX2Jhc2ljX2hkcl9sZW4oc2tiKSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IF9fZGNjcF9oZHJfbGVuKGNvbnN0IHN0cnVjdCBkY2NwX2hkciAqZGgpCkBAIC00NjAsMjYgKzQ2NSwyNyBAQAogICogQGRjY3BzX3NlcnZpY2VfbGlzdCAtIHNlY29uZCAuLiBsYXN0IHNlcnZpY2UgY29kZSBvbiBwYXNzaXZlIHNvY2tldAogICogQGRjY3BzX3RpbWVzdGFtcF90aW1lIC0gdGltZSBvZiBsYXRlc3QgVElNRVNUQU1QIG9wdGlvbgogICogQGRjY3BzX3RpbWVzdGFtcF9lY2hvIC0gbGF0ZXN0IHRpbWVzdGFtcCByZWNlaXZlZCBvbiBhIFRJTUVTVEFNUCBvcHRpb24KLSAqIEBkY2Nwc19sX2Fja19yYXRpbyAtCi0gKiBAZGNjcHNfcl9hY2tfcmF0aW8gLQorICogQGRjY3BzX2xfYWNrX3JhdGlvIC0gZmVhdHVyZS1sb2NhbCBBY2sgUmF0aW8KKyAqIEBkY2Nwc19yX2Fja19yYXRpbyAtIGZlYXR1cmUtcmVtb3RlIEFjayBSYXRpbwogICogQGRjY3BzX3Bjc2xlbiAtIHNlbmRlciAgIHBhcnRpYWwgY2hlY2tzdW0gY292ZXJhZ2UgKHZpYSBzb2Nrb3B0KQogICogQGRjY3BzX3BjcmxlbiAtIHJlY2VpdmVyIHBhcnRpYWwgY2hlY2tzdW0gY292ZXJhZ2UgKHZpYSBzb2Nrb3B0KQogICogQGRjY3BzX25kcF9jb3VudCAtIG51bWJlciBvZiBOb24gRGF0YSBQYWNrZXRzIHNpbmNlIGxhc3QgZGF0YSBwYWNrZXQKLSAqIEBkY2Nwc19tc3NfY2FjaGUgLQotICogQGRjY3BzX21pbmlzb2NrIC0KKyAqIEBkY2Nwc19tc3NfY2FjaGUgLSBjdXJyZW50IHZhbHVlIG9mIE1TUyAocGF0aCBNVFUgbWludXMgaGVhZGVyIHNpemVzKQorICogQGRjY3BzX21pbmlzb2NrIC0gYXNzb2NpYXRlZCBtaW5pc29jayAoYWNjZXNzZWQgdmlhIGRjY3BfbXNrKQogICogQGRjY3BzX2hjX3J4X2Fja3ZlYyAtIHJ4IGhhbGYgY29ubmVjdGlvbiBhY2sgdmVjdG9yCi0gKiBAZGNjcHNfaGNfcnhfY2NpZCAtCi0gKiBAZGNjcHNfaGNfdHhfY2NpZCAtCi0gKiBAZGNjcHNfb3B0aW9uc19yZWNlaXZlZCAtCi0gKiBAZGNjcHNfZXBvY2ggLQotICogQGRjY3BzX3JvbGUgLSBSb2xlIG9mIHRoaXMgc29jaywgb25lIG9mICVkY2NwX3JvbGUKLSAqIEBkY2Nwc19oY19yeF9pbnNlcnRfb3B0aW9ucyAtCi0gKiBAZGNjcHNfaGNfdHhfaW5zZXJ0X29wdGlvbnMgLQorICogQGRjY3BzX2hjX3J4X2NjaWQgLSBDQ0lEIHVzZWQgZm9yIHRoZSByZWNlaXZlciAob3IgcmVjZWl2aW5nIGhhbGYtY29ubmVjdGlvbikKKyAqIEBkY2Nwc19oY190eF9jY2lkIC0gQ0NJRCB1c2VkIGZvciB0aGUgc2VuZGVyIChvciBzZW5kaW5nIGhhbGYtY29ubmVjdGlvbikKKyAqIEBkY2Nwc19vcHRpb25zX3JlY2VpdmVkIC0gcGFyc2VkIHNldCBvZiByZXRyaWV2ZWQgb3B0aW9ucworICogQGRjY3BzX3JvbGUgLSByb2xlIG9mIHRoaXMgc29jaywgb25lIG9mICVkY2NwX3JvbGUKKyAqIEBkY2Nwc19oY19yeF9pbnNlcnRfb3B0aW9ucyAtIHJlY2VpdmVyIHdhbnRzIHRvIGFkZCBvcHRpb25zIHdoZW4gYWNraW5nCisgKiBAZGNjcHNfaGNfdHhfaW5zZXJ0X29wdGlvbnMgLSBzZW5kZXIgd2FudHMgdG8gYWRkIG9wdGlvbnMgd2hlbiBzZW5kaW5nCiAgKiBAZGNjcHNfeG1pdF90aW1lciAtIHRpbWVyIGZvciB3aGVuIENDSUQgaXMgbm90IHJlYWR5IHRvIHNlbmQKKyAqIEBkY2Nwc19zeW5fcnR0IC0gUlRUIHNhbXBsZSBmcm9tIFJlcXVlc3QvUmVzcG9uc2UgZXhjaGFuZ2UgKGluIHVzZWNzKQogICovCiBzdHJ1Y3QgZGNjcF9zb2NrIHsKIAkvKiBpbmV0X2Nvbm5lY3Rpb25fc29jayBoYXMgdG8gYmUgdGhlIGZpcnN0IG1lbWJlciBvZiBkY2NwX3NvY2sgKi8KIAlzdHJ1Y3QgaW5ldF9jb25uZWN0aW9uX3NvY2sJZGNjcHNfaW5ldF9jb25uZWN0aW9uOworI2RlZmluZSBkY2Nwc19zeW5fcnR0CQkJZGNjcHNfaW5ldF9jb25uZWN0aW9uLmljc2tfYWNrLmxyY3Z0aW1lCiAJX191NjQJCQkJZGNjcHNfc3dsOwogCV9fdTY0CQkJCWRjY3BzX3N3aDsKIAlfX3U2NAkJCQlkY2Nwc19hd2w7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RlYnVnZnMuaCBiL2luY2x1ZGUvbGludXgvZGVidWdmcy5oCmluZGV4IDlmYTA5ODMuLjVhOWM0OTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZGVidWdmcy5oCisrKyBiL2luY2x1ZGUvbGludXgvZGVidWdmcy5oCkBAIC00NCw2ICs0NCw4IEBACiAJCQkJICBzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQsIHUxNiAqdmFsdWUpOwogc3RydWN0IGRlbnRyeSAqZGVidWdmc19jcmVhdGVfdTMyKGNvbnN0IGNoYXIgKm5hbWUsIG1vZGVfdCBtb2RlLAogCQkJCSAgc3RydWN0IGRlbnRyeSAqcGFyZW50LCB1MzIgKnZhbHVlKTsKK3N0cnVjdCBkZW50cnkgKmRlYnVnZnNfY3JlYXRlX3U2NChjb25zdCBjaGFyICpuYW1lLCBtb2RlX3QgbW9kZSwKKwkJCQkgIHN0cnVjdCBkZW50cnkgKnBhcmVudCwgdTY0ICp2YWx1ZSk7CiBzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzX2NyZWF0ZV9ib29sKGNvbnN0IGNoYXIgKm5hbWUsIG1vZGVfdCBtb2RlLAogCQkJCSAgc3RydWN0IGRlbnRyeSAqcGFyZW50LCB1MzIgKnZhbHVlKTsKIApAQCAtMTA0LDYgKzEwNiwxMyBAQAogCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOwogfQogCitzdGF0aWMgaW5saW5lIHN0cnVjdCBkZW50cnkgKmRlYnVnZnNfY3JlYXRlX3U2NChjb25zdCBjaGFyICpuYW1lLCBtb2RlX3QgbW9kZSwKKwkJCQkJCXN0cnVjdCBkZW50cnkgKnBhcmVudCwKKwkJCQkJCXU2NCAqdmFsdWUpCit7CisJcmV0dXJuIEVSUl9QVFIoLUVOT0RFVik7Cit9CisKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGRlbnRyeSAqZGVidWdmc19jcmVhdGVfYm9vbChjb25zdCBjaGFyICpuYW1lLCBtb2RlX3QgbW9kZSwKIAkJCQkJCSBzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQsCiAJCQkJCQkgdTMyICp2YWx1ZSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZGV2aWNlLmggYi9pbmNsdWRlL2xpbnV4L2RldmljZS5oCmluZGV4IDVjZjMwZTkuLmEwY2QyY2UgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZGV2aWNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9kZXZpY2UuaApAQCAtMzQsOSArMzQsMjQgQEAKIHN0cnVjdCBkZXZpY2VfZHJpdmVyOwogc3RydWN0IGNsYXNzOwogc3RydWN0IGNsYXNzX2RldmljZTsKK3N0cnVjdCBidXNfdHlwZTsKKworc3RydWN0IGJ1c19hdHRyaWJ1dGUgeworCXN0cnVjdCBhdHRyaWJ1dGUJYXR0cjsKKwlzc2l6ZV90ICgqc2hvdykoc3RydWN0IGJ1c190eXBlICosIGNoYXIgKiBidWYpOworCXNzaXplX3QgKCpzdG9yZSkoc3RydWN0IGJ1c190eXBlICosIGNvbnN0IGNoYXIgKiBidWYsIHNpemVfdCBjb3VudCk7Cit9OworCisjZGVmaW5lIEJVU19BVFRSKF9uYW1lLF9tb2RlLF9zaG93LF9zdG9yZSkJXAorc3RydWN0IGJ1c19hdHRyaWJ1dGUgYnVzX2F0dHJfIyNfbmFtZSA9IF9fQVRUUihfbmFtZSxfbW9kZSxfc2hvdyxfc3RvcmUpCisKK2V4dGVybiBpbnQgX19tdXN0X2NoZWNrIGJ1c19jcmVhdGVfZmlsZShzdHJ1Y3QgYnVzX3R5cGUgKiwKKwkJCQkJc3RydWN0IGJ1c19hdHRyaWJ1dGUgKik7CitleHRlcm4gdm9pZCBidXNfcmVtb3ZlX2ZpbGUoc3RydWN0IGJ1c190eXBlICosIHN0cnVjdCBidXNfYXR0cmlidXRlICopOwogCiBzdHJ1Y3QgYnVzX3R5cGUgewogCWNvbnN0IGNoYXIJCSogbmFtZTsKKwlzdHJ1Y3QgbW9kdWxlCQkqIG93bmVyOwogCiAJc3RydWN0IHN1YnN5c3RlbQlzdWJzeXM7CiAJc3RydWN0IGtzZXQJCWRyaXZlcnM7CkBAIC00OSw2ICs2NCw4IEBACiAJc3RydWN0IGJ1c19hdHRyaWJ1dGUJKiBidXNfYXR0cnM7CiAJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUJKiBkZXZfYXR0cnM7CiAJc3RydWN0IGRyaXZlcl9hdHRyaWJ1dGUJKiBkcnZfYXR0cnM7CisJc3RydWN0IGJ1c19hdHRyaWJ1dGUgZHJpdmVyc19hdXRvcHJvYmVfYXR0cjsKKwlzdHJ1Y3QgYnVzX2F0dHJpYnV0ZSBkcml2ZXJzX3Byb2JlX2F0dHI7CiAKIAlpbnQJCSgqbWF0Y2gpKHN0cnVjdCBkZXZpY2UgKiBkZXYsIHN0cnVjdCBkZXZpY2VfZHJpdmVyICogZHJ2KTsKIAlpbnQJCSgqdWV2ZW50KShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKiplbnZwLApAQCAtNjEsNiArNzgsOSBAQAogCWludCAoKnN1c3BlbmRfbGF0ZSkoc3RydWN0IGRldmljZSAqIGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKIAlpbnQgKCpyZXN1bWVfZWFybHkpKHN0cnVjdCBkZXZpY2UgKiBkZXYpOwogCWludCAoKnJlc3VtZSkoc3RydWN0IGRldmljZSAqIGRldik7CisKKwl1bnNpZ25lZCBpbnQgZHJpdmVyc19hdXRvcHJvYmU6MTsKKwl1bnNpZ25lZCBpbnQgbXVsdGl0aHJlYWRfcHJvYmU6MTsKIH07CiAKIGV4dGVybiBpbnQgX19tdXN0X2NoZWNrIGJ1c19yZWdpc3RlcihzdHJ1Y3QgYnVzX3R5cGUgKiBidXMpOwpAQCAtMTAyLDI2ICsxMjIsMTAgQEAKICNkZWZpbmUgQlVTX05PVElGWV9VTkJJTkRfRFJJVkVSCTB4MDAwMDAwMDQgLyogZHJpdmVyIGFib3V0IHRvIGJlCiAJCQkJCQkgICAgICB1bmJvdW5kICovCiAKLS8qIHN5c2ZzIGludGVyZmFjZSBmb3IgZXhwb3J0aW5nIGJ1cyBhdHRyaWJ1dGVzICovCi0KLXN0cnVjdCBidXNfYXR0cmlidXRlIHsKLQlzdHJ1Y3QgYXR0cmlidXRlCWF0dHI7Ci0Jc3NpemVfdCAoKnNob3cpKHN0cnVjdCBidXNfdHlwZSAqLCBjaGFyICogYnVmKTsKLQlzc2l6ZV90ICgqc3RvcmUpKHN0cnVjdCBidXNfdHlwZSAqLCBjb25zdCBjaGFyICogYnVmLCBzaXplX3QgY291bnQpOwotfTsKLQotI2RlZmluZSBCVVNfQVRUUihfbmFtZSxfbW9kZSxfc2hvdyxfc3RvcmUpCVwKLXN0cnVjdCBidXNfYXR0cmlidXRlIGJ1c19hdHRyXyMjX25hbWUgPSBfX0FUVFIoX25hbWUsX21vZGUsX3Nob3csX3N0b3JlKQotCi1leHRlcm4gaW50IF9fbXVzdF9jaGVjayBidXNfY3JlYXRlX2ZpbGUoc3RydWN0IGJ1c190eXBlICosCi0JCQkJCXN0cnVjdCBidXNfYXR0cmlidXRlICopOwotZXh0ZXJuIHZvaWQgYnVzX3JlbW92ZV9maWxlKHN0cnVjdCBidXNfdHlwZSAqLCBzdHJ1Y3QgYnVzX2F0dHJpYnV0ZSAqKTsKLQogc3RydWN0IGRldmljZV9kcml2ZXIgewogCWNvbnN0IGNoYXIJCSogbmFtZTsKIAlzdHJ1Y3QgYnVzX3R5cGUJCSogYnVzOwogCi0Jc3RydWN0IGNvbXBsZXRpb24JdW5sb2FkZWQ7CiAJc3RydWN0IGtvYmplY3QJCWtvYmo7CiAJc3RydWN0IGtsaXN0CQlrbGlzdF9kZXZpY2VzOwogCXN0cnVjdCBrbGlzdF9ub2RlCWtub2RlX2J1czsKQEAgLTEzNSw4ICsxMzksNiBAQAogCXZvaWQJKCpzaHV0ZG93bikJKHN0cnVjdCBkZXZpY2UgKiBkZXYpOwogCWludAkoKnN1c3BlbmQpCShzdHJ1Y3QgZGV2aWNlICogZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpOwogCWludAkoKnJlc3VtZSkJKHN0cnVjdCBkZXZpY2UgKiBkZXYpOwotCi0JdW5zaWduZWQgaW50IG11bHRpdGhyZWFkX3Byb2JlOjE7CiB9OwogCiAKQEAgLTE4MSwxMCArMTgzLDkgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkCWNoaWxkcmVuOwogCXN0cnVjdCBsaXN0X2hlYWQJZGV2aWNlczsKIAlzdHJ1Y3QgbGlzdF9oZWFkCWludGVyZmFjZXM7CisJc3RydWN0IGtzZXQJCWNsYXNzX2RpcnM7CiAJc3RydWN0IHNlbWFwaG9yZQlzZW07CS8qIGxvY2tzIGJvdGggdGhlIGNoaWxkcmVuIGFuZCBpbnRlcmZhY2VzIGxpc3RzICovCiAKLQlzdHJ1Y3Qga29iamVjdAkJKnZpcnR1YWxfZGlyOwotCiAJc3RydWN0IGNsYXNzX2F0dHJpYnV0ZQkJKiBjbGFzc19hdHRyczsKIAlzdHJ1Y3QgY2xhc3NfZGV2aWNlX2F0dHJpYnV0ZQkqIGNsYXNzX2Rldl9hdHRyczsKIAlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZQkJKiBkZXZfYXR0cnM7CkBAIC0zMjgsMTEgKzMyOSwyMyBAQAogCQkJCQlfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLDUsNikpKTsKIGV4dGVybiB2b2lkIGNsYXNzX2RldmljZV9kZXN0cm95KHN0cnVjdCBjbGFzcyAqY2xzLCBkZXZfdCBkZXZ0KTsKIAorLyoKKyAqIFRoZSB0eXBlIG9mIGRldmljZSwgInN0cnVjdCBkZXZpY2UiIGlzIGVtYmVkZGVkIGluLiBBIGNsYXNzCisgKiBvciBidXMgY2FuIGNvbnRhaW4gZGV2aWNlcyBvZiBkaWZmZXJlbnQgdHlwZXMKKyAqIGxpa2UgInBhcnRpdGlvbnMiIGFuZCAiZGlza3MiLCAibW91c2UiIGFuZCAiZXZlbnQiLgorICogVGhpcyBpZGVudGlmaWVzIHRoZSBkZXZpY2UgdHlwZSBhbmQgY2FycmllcyB0eXBlLXNwZWNpZmljCisgKiBpbmZvcm1hdGlvbiwgZXF1aXZhbGVudCB0byB0aGUga29ial90eXBlIG9mIGEga29iamVjdC4KKyAqIElmICJuYW1lIiBpcyBzcGVjaWZpZWQsIHRoZSB1ZXZlbnQgd2lsbCBjb250YWluIGl0IGluCisgKiB0aGUgREVWVFlQRSB2YXJpYWJsZS4KKyAqLwogc3RydWN0IGRldmljZV90eXBlIHsKLQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0cnM7CisJY29uc3QgY2hhciAqbmFtZTsKKwlzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICoqZ3JvdXBzOwogCWludCAoKnVldmVudCkoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICoqZW52cCwgaW50IG51bV9lbnZwLAogCQkgICAgICBjaGFyICpidWZmZXIsIGludCBidWZmZXJfc2l6ZSk7CiAJdm9pZCAoKnJlbGVhc2UpKHN0cnVjdCBkZXZpY2UgKmRldik7CisJaW50ICgqc3VzcGVuZCkoc3RydWN0IGRldmljZSAqIGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKKwlpbnQgKCpyZXN1bWUpKHN0cnVjdCBkZXZpY2UgKiBkZXYpOwogfTsKIAogLyogaW50ZXJmYWNlIGZvciBleHBvcnRpbmcgZGV2aWNlIGF0dHJpYnV0ZXMgKi8KQEAgLTM1NCw4ICszNjcsMTIgQEAKIAkJCQkJICAgICAgIHN0cnVjdCBiaW5fYXR0cmlidXRlICphdHRyKTsKIGV4dGVybiB2b2lkIGRldmljZV9yZW1vdmVfYmluX2ZpbGUoc3RydWN0IGRldmljZSAqZGV2LAogCQkJCSAgIHN0cnVjdCBiaW5fYXR0cmlidXRlICphdHRyKTsKLWV4dGVybiBpbnQgZGV2aWNlX3NjaGVkdWxlX2NhbGxiYWNrKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJdm9pZCAoKmZ1bmMpKHN0cnVjdCBkZXZpY2UgKikpOworZXh0ZXJuIGludCBkZXZpY2Vfc2NoZWR1bGVfY2FsbGJhY2tfb3duZXIoc3RydWN0IGRldmljZSAqZGV2LAorCQl2b2lkICgqZnVuYykoc3RydWN0IGRldmljZSAqKSwgc3RydWN0IG1vZHVsZSAqb3duZXIpOworCisvKiBUaGlzIGlzIGEgbWFjcm8gdG8gYXZvaWQgaW5jbHVkZSBwcm9ibGVtcyB3aXRoIFRISVNfTU9EVUxFICovCisjZGVmaW5lIGRldmljZV9zY2hlZHVsZV9jYWxsYmFjayhkZXYsIGZ1bmMpCQkJXAorCWRldmljZV9zY2hlZHVsZV9jYWxsYmFja19vd25lcihkZXYsIGZ1bmMsIFRISVNfTU9EVUxFKQogCiAvKiBkZXZpY2UgcmVzb3VyY2UgbWFuYWdlbWVudCAqLwogdHlwZWRlZiB2b2lkICgqZHJfcmVsZWFzZV90KShzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKnJlcyk7CkBAIC01NTQsNyArNTcxLDExIEBACiAjZGVmaW5lIGRldl9kYmcoZGV2LCBmb3JtYXQsIGFyZy4uLikJCVwKIAlkZXZfcHJpbnRrKEtFUk5fREVCVUcgLCBkZXYgLCBmb3JtYXQgLCAjIyBhcmcpCiAjZWxzZQotI2RlZmluZSBkZXZfZGJnKGRldiwgZm9ybWF0LCBhcmcuLi4pIGRvIHsgKHZvaWQpKGRldik7IH0gd2hpbGUgKDApCitzdGF0aWMgaW5saW5lIGludCBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDIsIDMpKSkKK2Rldl9kYmcoc3RydWN0IGRldmljZSAqIGRldiwgY29uc3QgY2hhciAqIGZtdCwgLi4uKQoreworCXJldHVybiAwOworfQogI2VuZGlmCiAKICNkZWZpbmUgZGV2X2VycihkZXYsIGZvcm1hdCwgYXJnLi4uKQkJXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kdmIvYXVkaW8uaCBiL2luY2x1ZGUvbGludXgvZHZiL2F1ZGlvLmgKaW5kZXggMDg3NGE2Ny4uODk0MTJlMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9kdmIvYXVkaW8uaAorKysgYi9pbmNsdWRlL2xpbnV4L2R2Yi9hdWRpby5oCkBAIC00Nyw3ICs0Nyw5IEBACiB0eXBlZGVmIGVudW0gewogCUFVRElPX1NURVJFTywKIAlBVURJT19NT05PX0xFRlQsCi0JQVVESU9fTU9OT19SSUdIVAorCUFVRElPX01PTk9fUklHSFQsCisJQVVESU9fTU9OTywKKwlBVURJT19TVEVSRU9fU1dBUFBFRAogfSBhdWRpb19jaGFubmVsX3NlbGVjdF90OwogCiAKQEAgLTEzMyw1ICsxMzUsNiBAQAogICogZXh0cmFjdGVkIGJ5IHRoZSBQRVMgcGFyc2VyLgogICovCiAjZGVmaW5lIEFVRElPX0dFVF9QVFMgICAgICAgICAgICAgIF9JT1IoJ28nLCAxOSwgX191NjQpCisjZGVmaW5lIEFVRElPX0JJTElOR1VBTF9DSEFOTkVMX1NFTEVDVCBfSU8oJ28nLCAyMCkKIAogI2VuZGlmIC8qIF9EVkJBVURJT19IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kdmIvdmVyc2lvbi5oIGIvaW5jbHVkZS9saW51eC9kdmIvdmVyc2lvbi5oCmluZGV4IDYxODNjOWMuLjEyNmUwYzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZHZiL3ZlcnNpb24uaAorKysgYi9pbmNsdWRlL2xpbnV4L2R2Yi92ZXJzaW9uLmgKQEAgLTI0LDYgKzI0LDYgQEAKICNkZWZpbmUgX0RWQlZFUlNJT05fSF8KIAogI2RlZmluZSBEVkJfQVBJX1ZFUlNJT04gMwotI2RlZmluZSBEVkJfQVBJX1ZFUlNJT05fTUlOT1IgMQorI2RlZmluZSBEVkJfQVBJX1ZFUlNJT05fTUlOT1IgMgogCiAjZW5kaWYgLypfRFZCVkVSU0lPTl9IXyovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2R2Yi92aWRlby5oIGIvaW5jbHVkZS9saW51eC9kdmIvdmlkZW8uaAppbmRleCBmYWViZmRhLi45M2U0YzNhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2R2Yi92aWRlby5oCisrKyBiL2luY2x1ZGUvbGludXgvZHZiL3ZpZGVvLmgKQEAgLTgwLDE0ICs4MCw3MCBAQAogfSB2aWRlb19wbGF5X3N0YXRlX3Q7CiAKIAorLyogRGVjb2RlciBjb21tYW5kcyAqLworI2RlZmluZSBWSURFT19DTURfUExBWSAgICAgICAgKDApCisjZGVmaW5lIFZJREVPX0NNRF9TVE9QICAgICAgICAoMSkKKyNkZWZpbmUgVklERU9fQ01EX0ZSRUVaRSAgICAgICgyKQorI2RlZmluZSBWSURFT19DTURfQ09OVElOVUUgICAgKDMpCisKKy8qIEZsYWdzIGZvciBWSURFT19DTURfRlJFRVpFICovCisjZGVmaW5lIFZJREVPX0NNRF9GUkVFWkVfVE9fQkxBQ0sgICAgIAkoMSA8PCAwKQorCisvKiBGbGFncyBmb3IgVklERU9fQ01EX1NUT1AgKi8KKyNkZWZpbmUgVklERU9fQ01EX1NUT1BfVE9fQkxBQ0sgICAgICAJKDEgPDwgMCkKKyNkZWZpbmUgVklERU9fQ01EX1NUT1BfSU1NRURJQVRFTFkgICAgIAkoMSA8PCAxKQorCisvKiBQbGF5IGlucHV0IGZvcm1hdHM6ICovCisvKiBUaGUgZGVjb2RlciBoYXMgbm8gc3BlY2lhbCBmb3JtYXQgcmVxdWlyZW1lbnRzICovCisjZGVmaW5lIFZJREVPX1BMQVlfRk1UX05PTkUgICAgICAgICAoMCkKKy8qIFRoZSBkZWNvZGVyIHJlcXVpcmVzIGZ1bGwgR09QcyAqLworI2RlZmluZSBWSURFT19QTEFZX0ZNVF9HT1AgICAgICAgICAgKDEpCisKKy8qIFRoZSBzdHJ1Y3R1cmUgbXVzdCBiZSB6ZXJvZWQgYmVmb3JlIHVzZSBieSB0aGUgYXBwbGljYXRpb24KKyAgIFRoaXMgZW5zdXJlcyBpdCBjYW4gYmUgZXh0ZW5kZWQgc2FmZWx5IGluIHRoZSBmdXR1cmUuICovCitzdHJ1Y3QgdmlkZW9fY29tbWFuZCB7CisJX191MzIgY21kOworCV9fdTMyIGZsYWdzOworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCV9fdTY0IHB0czsKKwkJfSBzdG9wOworCisJCXN0cnVjdCB7CisJCQkvKiAwIG9yIDEwMDAgc3BlY2lmaWVzIG5vcm1hbCBzcGVlZCwKKwkJCSAgIDEgc3BlY2lmaWVzIGZvcndhcmQgc2luZ2xlIHN0ZXBwaW5nLAorCQkJICAgLTEgc3BlY2lmaWVzIGJhY2t3YXJkIHNpbmdsZSBzdGVwcGluZywKKwkJCSAgID4xOiBwbGF5YmFjayBhdCBzcGVlZC8xMDAwIG9mIHRoZSBub3JtYWwgc3BlZWQsCisJCQkgICA8LTE6IHJldmVyc2UgcGxheWJhY2sgYXQgKC1zcGVlZC8xMDAwKSBvZiB0aGUgbm9ybWFsIHNwZWVkLiAqLworCQkJX19zMzIgc3BlZWQ7CisJCQlfX3UzMiBmb3JtYXQ7CisJCX0gcGxheTsKKworCQlzdHJ1Y3QgeworCQkJX191MzIgZGF0YVsxNl07CisJCX0gcmF3OworCX07Cit9OworCisvKiBGSUVMRF9VTktOT1dOIGNhbiBiZSB1c2VkIGlmIHRoZSBoYXJkd2FyZSBkb2VzIG5vdCBrbm93IHdoZXRoZXIKKyAgIHRoZSBWc3luYyBpcyBmb3IgYW4gb2RkLCBldmVuIG9yIHByb2dyZXNzaXZlIChpLmUuIG5vbi1pbnRlcmxhY2VkKQorICAgZmllbGQuICovCisjZGVmaW5lIFZJREVPX1ZTWU5DX0ZJRUxEX1VOS05PV04gIAkoMCkKKyNkZWZpbmUgVklERU9fVlNZTkNfRklFTERfT0REIAkJKDEpCisjZGVmaW5lIFZJREVPX1ZTWU5DX0ZJRUxEX0VWRU4JCSgyKQorI2RlZmluZSBWSURFT19WU1lOQ19GSUVMRF9QUk9HUkVTU0lWRQkoMykKKwogc3RydWN0IHZpZGVvX2V2ZW50IHsKIAlpbnQzMl90IHR5cGU7CiAjZGVmaW5lIFZJREVPX0VWRU5UX1NJWkVfQ0hBTkdFRAkxCiAjZGVmaW5lIFZJREVPX0VWRU5UX0ZSQU1FX1JBVEVfQ0hBTkdFRAkyCisjZGVmaW5lIFZJREVPX0VWRU5UX0RFQ09ERVJfU1RPUFBFRCAJMworI2RlZmluZSBWSURFT19FVkVOVF9WU1lOQyAJCTQKIAl0aW1lX3QgdGltZXN0YW1wOwogCXVuaW9uIHsKIAkJdmlkZW9fc2l6ZV90IHNpemU7CiAJCXVuc2lnbmVkIGludCBmcmFtZV9yYXRlOwkvKiBpbiBmcmFtZXMgcGVyIDEwMDBzZWMgKi8KKwkJdW5zaWduZWQgY2hhciB2c3luY19maWVsZDsJLyogdW5rbm93bi9vZGQvZXZlbi9wcm9ncmVzc2l2ZSAqLwogCX0gdTsKIH07CiAKQEAgLTIxMyw0ICsyNjksMTAgQEAKICAqLwogI2RlZmluZSBWSURFT19HRVRfUFRTICAgICAgICAgICAgICBfSU9SKCdvJywgNTcsIF9fdTY0KQogCisvKiBSZWFkIHRoZSBudW1iZXIgb2YgZGlzcGxheWVkIGZyYW1lcyBzaW5jZSB0aGUgZGVjb2RlciB3YXMgc3RhcnRlZCAqLworI2RlZmluZSBWSURFT19HRVRfRlJBTUVfQ09VTlQgIAkgICBfSU9SKCdvJywgNTgsIF9fdTY0KQorCisjZGVmaW5lIFZJREVPX0NPTU1BTkQgICAgIAkgICBfSU9XUignbycsIDU5LCBzdHJ1Y3QgdmlkZW9fY29tbWFuZCkKKyNkZWZpbmUgVklERU9fVFJZX0NPTU1BTkQgCSAgIF9JT1dSKCdvJywgNjAsIHN0cnVjdCB2aWRlb19jb21tYW5kKQorCiAjZW5kaWYgLypfRFZCVklERU9fSF8qLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9maWJfcnVsZXMuaCBiL2luY2x1ZGUvbGludXgvZmliX3J1bGVzLmgKaW5kZXggODI3MGFhYy4uODdiNjA2YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9maWJfcnVsZXMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ZpYl9ydWxlcy5oCkBAIC01LDggKzUsMTMgQEAKICNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KIAogLyogcnVsZSBpcyBwZXJtYW5lbnQsIGFuZCBjYW5ub3QgYmUgZGVsZXRlZCAqLwotI2RlZmluZSBGSUJfUlVMRV9QRVJNQU5FTlQJMQotI2RlZmluZSBGSUJfUlVMRV9JTlZFUlQJCTIKKyNkZWZpbmUgRklCX1JVTEVfUEVSTUFORU5UCTB4MDAwMDAwMDEKKyNkZWZpbmUgRklCX1JVTEVfSU5WRVJUCQkweDAwMDAwMDAyCisjZGVmaW5lIEZJQl9SVUxFX1VOUkVTT0xWRUQJMHgwMDAwMDAwNAorI2RlZmluZSBGSUJfUlVMRV9ERVZfREVUQUNIRUQJMHgwMDAwMDAwOAorCisvKiB0cnkgdG8gZmluZCBzb3VyY2UgYWRkcmVzcyBpbiByb3V0aW5nIGxvb2t1cHMgKi8KKyNkZWZpbmUgRklCX1JVTEVfRklORF9TQUREUgkweDAwMDEwMDAwCiAKIHN0cnVjdCBmaWJfcnVsZV9oZHIKIHsKQEAgLTI5LDcgKzM0LDcgQEAKIAlGUkFfRFNULAkvKiBkZXN0aW5hdGlvbiBhZGRyZXNzICovCiAJRlJBX1NSQywJLyogc291cmNlIGFkZHJlc3MgKi8KIAlGUkFfSUZOQU1FLAkvKiBpbnRlcmZhY2UgbmFtZSAqLwotCUZSQV9VTlVTRUQxLAorCUZSQV9HT1RPLAkvKiB0YXJnZXQgdG8ganVtcCB0byAoRlJfQUNUX0dPVE8pICovCiAJRlJBX1VOVVNFRDIsCiAJRlJBX1BSSU9SSVRZLAkvKiBwcmlvcml0eS9wcmVmZXJlbmNlICovCiAJRlJBX1VOVVNFRDMsCkBAIC01MSw4ICs1Niw4IEBACiB7CiAJRlJfQUNUX1VOU1BFQywKIAlGUl9BQ1RfVE9fVEJMLAkJLyogUGFzcyB0byBmaXhlZCB0YWJsZSAqLwotCUZSX0FDVF9SRVMxLAotCUZSX0FDVF9SRVMyLAorCUZSX0FDVF9HT1RPLAkJLyogSnVtcCB0byBhbm90aGVyIHJ1bGUgKi8KKwlGUl9BQ1RfTk9QLAkJLyogTm8gb3BlcmF0aW9uICovCiAJRlJfQUNUX1JFUzMsCiAJRlJfQUNUX1JFUzQsCiAJRlJfQUNUX0JMQUNLSE9MRSwJLyogRHJvcCB3aXRob3V0IG5vdGlmaWNhdGlvbiAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mcy5oIGIvaW5jbHVkZS9saW51eC9mcy5oCmluZGV4IDg2ZWMzZjQuLjA5NWE5YzkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ZzLmgKQEAgLTg0Myw4ICs4NDMsMTMgQEAKIGV4dGVybiBpbnQgZmNudGxfZ2V0bGVhc2Uoc3RydWN0IGZpbGUgKmZpbHApOwogCiAvKiBmcy9zeW5jLmMgKi8KLWV4dGVybiBpbnQgZG9fc3luY19maWxlX3JhbmdlKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3Qgb2Zmc2V0LCBsb2ZmX3QgZW5kYnl0ZSwKLQkJCXVuc2lnbmVkIGludCBmbGFncyk7CitleHRlcm4gaW50IGRvX3N5bmNfbWFwcGluZ19yYW5nZShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgbG9mZl90IG9mZnNldCwKKwkJCWxvZmZfdCBlbmRieXRlLCB1bnNpZ25lZCBpbnQgZmxhZ3MpOworc3RhdGljIGlubGluZSBpbnQgZG9fc3luY19maWxlX3JhbmdlKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3Qgb2Zmc2V0LAorCQkJbG9mZl90IGVuZGJ5dGUsIHVuc2lnbmVkIGludCBmbGFncykKK3sKKwlyZXR1cm4gZG9fc3luY19tYXBwaW5nX3JhbmdlKGZpbGUtPmZfbWFwcGluZywgb2Zmc2V0LCBlbmRieXRlLCBmbGFncyk7Cit9CiAKIC8qIGZzL2xvY2tzLmMgKi8KIGV4dGVybiB2b2lkIGxvY2tzX2luaXRfbG9jayhzdHJ1Y3QgZmlsZV9sb2NrICopOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mc2xfZGV2aWNlcy5oIGIvaW5jbHVkZS9saW51eC9mc2xfZGV2aWNlcy5oCmluZGV4IGFiYjY0YzQuLjczNzEwZDYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZnNsX2RldmljZXMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ZzbF9kZXZpY2VzLmgKQEAgLTEyMCw0NCArMTIwLDUgQEAKIAl1MzIJc3lzY2xrOwogfTsKIAotLyogRXRoZXJuZXQgaW50ZXJmYWNlIChwaHkgbWFuYWdlbWVudCBhbmQgc3BlZWQpCi0qLwotZW51bSBlbmV0X2ludGVyZmFjZSB7Ci0JRU5FVF8xMF9NSUksCQkvKiAxMCBCYXNlIFQsICAgTUlJIGludGVyZmFjZSAqLwotCUVORVRfMTBfUk1JSSwJCS8qIDEwIEJhc2UgVCwgIFJNSUkgaW50ZXJmYWNlICovCi0JRU5FVF8xMF9SR01JSSwJCS8qIDEwIEJhc2UgVCwgUkdNSUkgaW50ZXJmYWNlICovCi0JRU5FVF8xMDBfTUlJLAkJLyogMTAwIEJhc2UgVCwgICBNSUkgaW50ZXJmYWNlICovCi0JRU5FVF8xMDBfUk1JSSwJCS8qIDEwMCBCYXNlIFQsICBSTUlJIGludGVyZmFjZSAqLwotCUVORVRfMTAwX1JHTUlJLAkJLyogMTAwIEJhc2UgVCwgUkdNSUkgaW50ZXJmYWNlICovCi0JRU5FVF8xMDAwX0dNSUksCQkvKiAxMDAwIEJhc2UgVCwgIEdNSUkgaW50ZXJmYWNlICovCi0JRU5FVF8xMDAwX1JHTUlJLAkvKiAxMDAwIEJhc2UgVCwgUkdNSUkgaW50ZXJmYWNlICovCi0JRU5FVF8xMDAwX1RCSSwJCS8qIDEwMDAgQmFzZSBULCAgIFRCSSBpbnRlcmZhY2UgKi8KLQlFTkVUXzEwMDBfUlRCSQkJLyogMTAwMCBCYXNlIFQsICBSVEJJIGludGVyZmFjZSAqLwotfTsKLQotc3RydWN0IHVjY19nZXRoX3BsYXRmb3JtX2RhdGEgewotCS8qIGRldmljZSBzcGVjaWZpYyBpbmZvcm1hdGlvbiAqLwotCXUzMgkJCWRldmljZV9mbGFnczsKLQl1MzIJCQlwaHlfcmVnX2FkZHI7Ci0KLQkvKiBib2FyZCBzcGVjaWZpYyBpbmZvcm1hdGlvbiAqLwotCXUzMgkJCWJvYXJkX2ZsYWdzOwotCXU4CQkJcnhfY2xvY2s7Ci0JdTgJCQl0eF9jbG9jazsKLQl1MzIJCQlwaHlfaWQ7Ci0JZW51bSBlbmV0X2ludGVyZmFjZQlwaHlfaW50ZXJmYWNlOwotCXUzMgkJCXBoeV9pbnRlcnJ1cHQ7Ci0JdTgJCQltYWNfYWRkcls2XTsKLX07Ci0KLS8qIEZsYWdzIHJlbGF0ZWQgdG8gVUNDIEdpZ2FiaXQgRXRoZXJuZXQgZGV2aWNlIGZlYXR1cmVzICovCi0jZGVmaW5lIEZTTF9VR0VUSF9ERVZfSEFTX0dJR0FCSVQJCTB4MDAwMDAwMDEKLSNkZWZpbmUgRlNMX1VHRVRIX0RFVl9IQVNfQ09BTEVTQ0UJCTB4MDAwMDAwMDIKLSNkZWZpbmUgRlNMX1VHRVRIX0RFVl9IQVNfUk1PTgkJCTB4MDAwMDAwMDQKLQotLyogRmxhZ3MgaW4gdWNjX2dldGhfcGxhdGZvcm1fZGF0YSAqLwotI2RlZmluZSBGU0xfVUdFVEhfQlJEX0hBU19QSFlfSU5UUgkJMHgwMDAwMDAwMQotCQkJCS8qIGlmIG5vdCBzZXQgdXNlIGEgdGltZXIgKi8KLQogI2VuZGlmIC8qIF9GU0xfREVWSUNFX0hfICovCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9oZGxjLmggYi9pbmNsdWRlL2xpbnV4L2hkbGMuaAppbmRleCBkNGIzMzM5Li5kYjM5MGM1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2hkbGMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2hkbGMuaApAQCAtNDMsOCArNDMsNyBAQAogCXZvaWQgKCpzdG9wKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsgLyogaWYgb3BlbiAmICFEQ0QgKi8KIAl2b2lkICgqZGV0YWNoKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIAlpbnQgKCppb2N0bCkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIpOwotCXVuc2lnbmVkIHNob3J0ICgqdHlwZV90cmFucykoc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCV9fYmUxNiAoKnR5cGVfdHJhbnMpKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogCXN0cnVjdCBtb2R1bGUgKm1vZHVsZTsKIAlzdHJ1Y3QgaGRsY19wcm90byAqbmV4dDsgLyogbmV4dCBwcm90b2NvbCBpbiB0aGUgbGlzdCAqLwogfTsKQEAgLTEzMiw4ICsxMzEsOCBAQAogewogCWhkbGNfZGV2aWNlICpoZGxjID0gZGV2X3RvX2hkbGMoZGV2KTsKIAotCXNrYi0+bWFjLnJhdyAgPSBza2ItPmRhdGE7Ci0Jc2tiLT5kZXYgICAgICA9IGRldjsKKwlza2ItPmRldiA9IGRldjsKKwlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwogCiAJaWYgKGhkbGMtPnByb3RvLT50eXBlX3RyYW5zKQogCQlyZXR1cm4gaGRsYy0+cHJvdG8tPnR5cGVfdHJhbnMoc2tiLCBkZXYpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9oaWQuaCBiL2luY2x1ZGUvbGludXgvaGlkLmgKaW5kZXggOGM5N2Q0ZC4uMzcwNzZiMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9oaWQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2hpZC5oCkBAIC0yNDcsNiArMjQ3LDExIEBACiAgKiBISUQgZGV2aWNlIHF1aXJrcy4KICAqLwogCisvKiAKKyAqIEluY3JlYXNlIHRoaXMgaWYgeW91IG5lZWQgdG8gY29uZmlndXJlIG1vcmUgSElEIHF1aXJrcyBhdCBtb2R1bGUgbG9hZCB0aW1lCisgKi8KKyNkZWZpbmUgTUFYX1VTQkhJRF9CT09UX1FVSVJLUyA0CisKICNkZWZpbmUgSElEX1FVSVJLX0lOVkVSVAkJCTB4MDAwMDAwMDEKICNkZWZpbmUgSElEX1FVSVJLX05PVE9VQ0gJCQkweDAwMDAwMDAyCiAjZGVmaW5lIEhJRF9RVUlSS19JR05PUkUJCQkweDAwMDAwMDA0CkBAIC0yNjcsOCArMjcyLDkgQEAKICNkZWZpbmUgSElEX1FVSVJLX1NLSVBfT1VUUFVUX1JFUE9SVFMJCTB4MDAwMjAwMDAKICNkZWZpbmUgSElEX1FVSVJLX0lHTk9SRV9NT1VTRQkJCTB4MDAwNDAwMDAKICNkZWZpbmUgSElEX1FVSVJLX1NPTllfUFMzX0NPTlRST0xMRVIJCTB4MDAwODAwMDAKLSNkZWZpbmUgSElEX1FVSVJLX0xPR0lURUNIX1M1MTBfREVTQ1JJUFRPUgkweDAwMTAwMDAwCisjZGVmaW5lIEhJRF9RVUlSS19MT0dJVEVDSF9ERVNDUklQVE9SCQkweDAwMTAwMDAwCiAjZGVmaW5lIEhJRF9RVUlSS19EVVBMSUNBVEVfVVNBR0VTCQkweDAwMjAwMDAwCisjZGVmaW5lIEhJRF9RVUlSS19SRVNFVF9MRURTCQkJMHgwMDQwMDAwMAogCiAvKgogICogVGhpcyBpcyB0aGUgZ2xvYmFsIGVudmlyb25tZW50IG9mIHRoZSBwYXJzZXIuIFRoaXMgaW5mb3JtYXRpb24gaXMKQEAgLTQ5NCw2ICs1MDAsMTIgQEAKIHZvaWQgaGlkX2ZyZWVfZGV2aWNlKHN0cnVjdCBoaWRfZGV2aWNlICpkZXZpY2UpOwogc3RydWN0IGhpZF9kZXZpY2UgKmhpZF9wYXJzZV9yZXBvcnQoX191OCAqc3RhcnQsIHVuc2lnbmVkIHNpemUpOwogCisvKiBISUQgcXVpcmtzIEFQSSAqLwordTMyIHVzYmhpZF9sb29rdXBfcXVpcmsoY29uc3QgdTE2IGlkVmVuZG9yLCBjb25zdCB1MTYgaWRQcm9kdWN0KTsKK2ludCB1c2JoaWRfbW9kaWZ5X2RxdWlyayhjb25zdCB1MTYgaWRWZW5kb3IsIGNvbnN0IHUxNiBpZFByb2R1Y3QsIGNvbnN0IHUzMiBxdWlya3MpOworaW50IHVzYmhpZF9xdWlya3NfaW5pdChjaGFyICoqcXVpcmtzX3BhcmFtKTsKK3ZvaWQgdXNiaGlkX3F1aXJrc19leGl0KHZvaWQpOworCiAjaWZkZWYgQ09ORklHX0hJRF9GRgogaW50IGhpZF9mZl9pbml0KHN0cnVjdCBoaWRfZGV2aWNlICpoaWQpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ljbXAuaCBiL2luY2x1ZGUvbGludXgvaWNtcC5oCmluZGV4IDI0ZGE0ZmIuLjQ3NGYyYTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaWNtcC5oCisrKyBiL2luY2x1ZGUvbGludXgvaWNtcC5oCkBAIC04Miw2ICs4MiwxNSBAQAogICB9IHVuOwogfTsKIAorI2lmZGVmIF9fS0VSTkVMX18KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaWNtcGhkciAqaWNtcF9oZHIoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gKHN0cnVjdCBpY21waGRyICopc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKK30KKyNlbmRpZgorCiAvKgogICoJY29uc3RhbnRzIGZvciAoc2V0fGdldClzb2Nrb3B0CiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaWNtcHY2LmggYi9pbmNsdWRlL2xpbnV4L2ljbXB2Ni5oCmluZGV4IDY4ZDM1MjYuLjdjNWU5ODEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaWNtcHY2LmgKKysrIGIvaW5jbHVkZS9saW51eC9pY21wdjYuaApAQCAtNzUsNiArNzUsMTUgQEAKICNkZWZpbmUgaWNtcDZfcm91dGVyX3ByZWYJaWNtcDZfZGF0YXVuLnVfbmRfcmEucm91dGVyX3ByZWYKIH07CiAKKyNpZmRlZiBfX0tFUk5FTF9fCisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGljbXA2aGRyICppY21wNl9oZHIoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gKHN0cnVjdCBpY21wNmhkciAqKXNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYik7Cit9CisjZW5kaWYKKwogI2RlZmluZSBJQ01QVjZfUk9VVEVSX1BSRUZfTE9XCQkweDMKICNkZWZpbmUgSUNNUFY2X1JPVVRFUl9QUkVGX01FRElVTQkweDAKICNkZWZpbmUgSUNNUFY2X1JPVVRFUl9QUkVGX0hJR0gJCTB4MQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pZl9hZGRyLmggYi9pbmNsdWRlL2xpbnV4L2lmX2FkZHIuaAppbmRleCBkNTU3ZTRjLi40M2YzYmVkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lmX2FkZHIuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lmX2FkZHIuaApAQCAtMzksNiArMzksNyBAQAogI2RlZmluZSBJRkFfRl9URU1QT1JBUlkJCUlGQV9GX1NFQ09OREFSWQogCiAjZGVmaW5lCUlGQV9GX05PREFECQkweDAyCisjZGVmaW5lIElGQV9GX09QVElNSVNUSUMJMHgwNAogI2RlZmluZQlJRkFfRl9IT01FQUREUkVTUwkweDEwCiAjZGVmaW5lIElGQV9GX0RFUFJFQ0FURUQJMHgyMAogI2RlZmluZSBJRkFfRl9URU5UQVRJVkUJCTB4NDAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaWZfYXJwLmggYi9pbmNsdWRlL2xpbnV4L2lmX2FycC5oCmluZGV4IDdmNTcxNDIuLmVkN2I5M2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaWZfYXJwLmgKKysrIGIvaW5jbHVkZS9saW51eC9pZl9hcnAuaApAQCAtMTQ4LDQgKzE0OCwxMyBAQAogCiB9OwogCisjaWZkZWYgX19LRVJORUxfXworI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBhcnBoZHIgKmFycF9oZHIoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gKHN0cnVjdCBhcnBoZHIgKilza2JfbmV0d29ya19oZWFkZXIoc2tiKTsKK30KKyNlbmRpZgorCiAjZW5kaWYJLyogX0xJTlVYX0lGX0FSUF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lmX2JyaWRnZS5oIGIvaW5jbHVkZS9saW51eC9pZl9icmlkZ2UuaAppbmRleCBmZDFiNmViLi40ZmYyMTFkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lmX2JyaWRnZS5oCisrKyBiL2luY2x1ZGUvbGludXgvaWZfYnJpZGdlLmgKQEAgLTEwNSw3ICsxMDUsOCBAQAogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogCiBleHRlcm4gdm9pZCBicmlvY3RsX3NldChpbnQgKCppb2N0bF9ob29rKSh1bnNpZ25lZCBpbnQsIHZvaWQgX191c2VyICopKTsKLWV4dGVybiBpbnQgKCpicl9oYW5kbGVfZnJhbWVfaG9vaykoc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCwgc3RydWN0IHNrX2J1ZmYgKipwc2tiKTsKK2V4dGVybiBzdHJ1Y3Qgc2tfYnVmZiAqKCpicl9oYW5kbGVfZnJhbWVfaG9vaykoc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCwKKwkJCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IpOwogZXh0ZXJuIGludCAoKmJyX3Nob3VsZF9yb3V0ZV9ob29rKShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaWZfZXRoZXIuaCBiL2luY2x1ZGUvbGludXgvaWZfZXRoZXIuaAppbmRleCBhYjA4ZjM1Li4xZGI3NzRjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lmX2V0aGVyLmgKKysrIGIvaW5jbHVkZS9saW51eC9pZl9ldGhlci5oCkBAIC02MSw2ICs2MSw3IEBACiAjZGVmaW5lIEVUSF9QXzgwMjFRCTB4ODEwMCAgICAgICAgICAvKiA4MDIuMVEgVkxBTiBFeHRlbmRlZCBIZWFkZXIgICovCiAjZGVmaW5lIEVUSF9QX0lQWAkweDgxMzcJCS8qIElQWCBvdmVyIERJWAkJCSovCiAjZGVmaW5lIEVUSF9QX0lQVjYJMHg4NkRECQkvKiBJUHY2IG92ZXIgYmx1ZWJvb2sJCSovCisjZGVmaW5lIEVUSF9QX1BBVVNFCTB4ODgwOAkJLyogSUVFRSBQYXVzZSBmcmFtZXMuIFNlZSA4MDIuMyAzMUIgKi8KICNkZWZpbmUgRVRIX1BfU0xPVwkweDg4MDkJCS8qIFNsb3cgUHJvdG9jb2wuIFNlZSA4MDIuM2FkIDQzQiAqLwogI2RlZmluZSBFVEhfUF9XQ0NQCTB4ODgzRQkJLyogV2ViLWNhY2hlIGNvb3JkaW5hdGlvbiBwcm90b2NvbAogCQkJCQkgKiBkZWZpbmVkIGluIGRyYWZ0LXdpbHNvbi13cmVjLXdjY3AtdjItMDAudHh0ICovCkBAIC0xMTIsNyArMTEzLDcgQEAKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgZXRoaGRyICpldGhfaGRyKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JcmV0dXJuIChzdHJ1Y3QgZXRoaGRyICopc2tiLT5tYWMucmF3OworCXJldHVybiAoc3RydWN0IGV0aGhkciAqKXNrYl9tYWNfaGVhZGVyKHNrYik7CiB9CiAKICNpZmRlZiBDT05GSUdfU1lTQ1RMCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lmX2xpbmsuaCBiL2luY2x1ZGUvbGludXgvaWZfbGluay5oCmluZGV4IDM1ZWQzYjUuLjYwNGMyNDMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaWZfbGluay5oCisrKyBiL2luY2x1ZGUvbGludXgvaWZfbGluay5oCkBAIC0xMjYsNiArMTI2LDcgQEAKIAlJRkxBX0lORVQ2X1NUQVRTLAkvKiBzdGF0aXN0aWNzCQkJKi8KIAlJRkxBX0lORVQ2X01DQVNULAkvKiBNQyB0aGluZ3MuIFdoYXQgb2YgdGhlbT8JKi8KIAlJRkxBX0lORVQ2X0NBQ0hFSU5GTywJLyogdGltZSB2YWx1ZXMgYW5kIG1heCByZWFzbSBzaXplICovCisJSUZMQV9JTkVUNl9JQ01QNlNUQVRTLAkvKiBzdGF0aXN0aWNzIChpY21wdjYpCQkqLwogCV9fSUZMQV9JTkVUNl9NQVgKIH07CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaWZfcGFja2V0LmggYi9pbmNsdWRlL2xpbnV4L2lmX3BhY2tldC5oCmluZGV4IGYzZGUwNWMuLmFkMDk2MDkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaWZfcGFja2V0LmgKKysrIGIvaW5jbHVkZS9saW51eC9pZl9wYWNrZXQuaApAQCAtNDIsNiArNDIsNyBAQAogI2RlZmluZSBQQUNLRVRfU1RBVElTVElDUwkJNgogI2RlZmluZSBQQUNLRVRfQ09QWV9USFJFU0gJCTcKICNkZWZpbmUgUEFDS0VUX0FVWERBVEEJCQk4CisjZGVmaW5lIFBBQ0tFVF9PUklHREVWCQkJOQogCiBzdHJ1Y3QgdHBhY2tldF9zdGF0cwogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pZl9wcHBveC5oIGIvaW5jbHVkZS9saW51eC9pZl9wcHBveC5oCmluZGV4IGUzM2VlNzYuLjZmOTg3YmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaWZfcHBwb3guaAorKysgYi9pbmNsdWRlL2xpbnV4L2lmX3BwcG94LmgKQEAgLTExMSw3ICsxMTEsMTcgQEAKIAlzdHJ1Y3QgcHBwb2VfdGFnIHRhZ1swXTsKIH0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCisvKiBMZW5ndGggb2YgZW50aXJlIFBQUG9FICsgUFBQIGhlYWRlciAqLworI2RlZmluZSBQUFBPRV9TRVNfSExFTgk4CisKICNpZmRlZiBfX0tFUk5FTF9fCisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHBwcG9lX2hkciAqcHBwb2VfaGRyKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIChzdHJ1Y3QgcHBwb2VfaGRyICopc2tiX25ldHdvcmtfaGVhZGVyKHNrYik7Cit9CisKIHN0cnVjdCBwcHBvZV9vcHQgewogCXN0cnVjdCBuZXRfZGV2aWNlICAgICAgKmRldjsJICAvKiBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHNvY2tldCovCiAJaW50CQkJaWZpbmRleDsgIC8qIGlmaW5kZXggb2YgZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCBzb2NrZXQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaWZfdHIuaCBiL2luY2x1ZGUvbGludXgvaWZfdHIuaAppbmRleCAyZjk0Y2YyLi4wNDZlOWQ5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lmX3RyLmgKKysrIGIvaW5jbHVkZS9saW51eC9pZl90ci5oCkBAIC00Nyw3ICs0Nyw3IEBACiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHRyaF9oZHIgKnRyX2hkcihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXJldHVybiAoc3RydWN0IHRyaF9oZHIgKilza2ItPm1hYy5yYXc7CisJcmV0dXJuIChzdHJ1Y3QgdHJoX2hkciAqKXNrYl9tYWNfaGVhZGVyKHNrYik7CiB9CiAjaWZkZWYgQ09ORklHX1NZU0NUTAogZXh0ZXJuIHN0cnVjdCBjdGxfdGFibGUgdHJfdGFibGVbXTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaWZfdmxhbi5oIGIvaW5jbHVkZS9saW51eC9pZl92bGFuLmgKaW5kZXggZDEwMzU4MC4uODFlOWJjOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pZl92bGFuLmgKKysrIGIvaW5jbHVkZS9saW51eC9pZl92bGFuLmgKQEAgLTUxLDcgKzUxLDcgQEAKIAogc3RhdGljIGlubGluZSBzdHJ1Y3Qgdmxhbl9ldGhoZHIgKnZsYW5fZXRoX2hkcihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXJldHVybiAoc3RydWN0IHZsYW5fZXRoaGRyICopc2tiLT5tYWMucmF3OworCXJldHVybiAoc3RydWN0IHZsYW5fZXRoaGRyICopc2tiX21hY19oZWFkZXIoc2tiKTsKIH0KIAogc3RydWN0IHZsYW5faGRyIHsKQEAgLTI3NSw4ICsyNzUsOCBAQAogCXZldGgtPmhfdmxhbl9UQ0kgPSBodG9ucyh0YWcpOwogCiAJc2tiLT5wcm90b2NvbCA9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfODAyMVEpOwotCXNrYi0+bWFjLnJhdyAtPSBWTEFOX0hMRU47Ci0Jc2tiLT5uaC5yYXcgLT0gVkxBTl9ITEVOOworCXNrYi0+bWFjX2hlYWRlciAtPSBWTEFOX0hMRU47CisJc2tiLT5uZXR3b3JrX2hlYWRlciAtPSBWTEFOX0hMRU47CiAKIAlyZXR1cm4gc2tiOwogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pZl93YW5waXBlX2NvbW1vbi5oIGIvaW5jbHVkZS9saW51eC9pZl93YW5waXBlX2NvbW1vbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTU0NjFkLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbGludXgvaWZfd2FucGlwZV9jb21tb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBpZl93YW5pcGVfY29tbW9uLmggICBTYW5nb21hIERyaXZlci9Tb2NrZXQgY29tbW9uIGFyZWEgZGVmaW5pdGlvbnMuCi0qCi0qIEF1dGhvcjogICAgICAgTmVuYWQgQ29yYmljIDxuY29yYmljQHNhbmdvbWEuY29tPgotKgotKiBDb3B5cmlnaHQ6ICAgIChjKSAyMDAwIFNhbmdvbWEgVGVjaG5vbG9naWVzIEluYy4KLSoKLSogICAgICAgICAgICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0qICAgICAgICAgICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSogICAgICAgICAgICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSogICAgICAgICAgICAgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qIEphbiAxMywgMjAwMCAgTmVuYWQgQ29yYmljICAgICAgSW5pdGlhbCB2ZXJzaW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9XQU5QSVBFX1NPQ0tfRFJJVkVSX0NPTU1PTl9ICi0jZGVmaW5lIF9XQU5QSVBFX1NPQ0tfRFJJVkVSX0NPTU1PTl9ICi0KLXR5cGVkZWYgc3RydWN0IHsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqc2xhdmU7Ci0JYXRvbWljX3QgcGFja2V0X3NlbnQ7Ci0JYXRvbWljX3QgcmVjZWl2ZV9ibG9jazsKLQlhdG9taWNfdCBjb21tYW5kOwotCWF0b21pY190IGRpc2Nvbm5lY3Q7Ci0JYXRvbWljX3QgZHJpdmVyX2J1c3k7Ci0JbG9uZyBjb21tb25fY3JpdGljYWw7Ci0Jc3RydWN0IHRpbWVyX2xpc3QgKnR4X3RpbWVyOwotCXN0cnVjdCBzb2NrICpzazsJCS8qIFdhbnBpcGUgU29jayBiaW5kJ3MgaGVyZSAqLyAKLQlpbnQgKCpmdW5jKShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCAKLQkJICAgIHN0cnVjdCBzb2NrICpzayk7Ci0KLQlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd2FucGlwZV93b3JrOyAgICAvKiBkZWZlcnJlZCBrZXZlbnRkIHdvcmsgKi8KLQl1bnNpZ25lZCBjaGFyIHJ3X2JpbmQ7CQkJICAvKiBTb2NrIGJpbmQgc3RhdGUgKi8KLQl1bnNpZ25lZCBjaGFyIHVzZWRieTsKLQl1bnNpZ25lZCBjaGFyIHN0YXRlOwotCXVuc2lnbmVkIGNoYXIgc3ZjOwotCXVuc2lnbmVkIHNob3J0IGxjbjsKLQl2b2lkICptYm94OwotfSB3YW5waXBlX2NvbW1vbl90OwotCi0KLWVudW0gewotCVdBTlNPQ0tfVU5DT05GSUdVUkVELAkvKiBsaW5rL2NoYW5uZWwgaXMgbm90IGNvbmZpZ3VyZWQgKi8KLQlXQU5TT0NLX0RJU0NPTk5FQ1RFRCwJLyogbGluay9jaGFubmVsIGlzIGRpc2Nvbm5lY3RlZCAqLwotCVdBTlNPQ0tfQ09OTkVDVElORywJCS8qIGNvbm5lY3Rpb24gaXMgaW4gcHJvZ3Jlc3MgKi8KLQlXQU5TT0NLX0NPTk5FQ1RFRCwJCS8qIGxpbmsvY2hhbm5lbCBpcyBvcGVyYXRpb25hbCAqLwotCVdBTlNPQ0tfTElNSVQsCQkvKiBmb3IgdmVyaWZpY2F0aW9uIG9ubHkgKi8KLQlXQU5TT0NLX0RVQUxQT1JULAkJLyogZm9yIER1YWwgUG9ydCBjYXJkcyAqLwotCVdBTlNPQ0tfRElTQ09OTkVDVElORywKLQlXQU5TT0NLX0JJTkRFRCwKLQlXQU5TT0NLX0JJTkRfTElTVEVOLAotCVdBTlNPQ0tfTElTVEVOCi19OwotCi0jZW5kaWYKLQotCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lnbXAuaCBiL2luY2x1ZGUvbGludXgvaWdtcC5oCmluZGV4IGExMTNmZTYuLmY1MTBlN2UgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaWdtcC5oCisrKyBiL2luY2x1ZGUvbGludXgvaWdtcC5oCkBAIC04MCw2ICs4MCwyNyBAQAogCV9fYmUzMiBzcmNzWzBdOwogfTsKIAorI2lmZGVmIF9fS0VSTkVMX18KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaWdtcGhkciAqaWdtcF9oZHIoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gKHN0cnVjdCBpZ21waGRyICopc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaWdtcHYzX3JlcG9ydCAqCisJCQlpZ21wdjNfcmVwb3J0X2hkcihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiAoc3RydWN0IGlnbXB2M19yZXBvcnQgKilza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpZ21wdjNfcXVlcnkgKgorCQkJaWdtcHYzX3F1ZXJ5X2hkcihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiAoc3RydWN0IGlnbXB2M19xdWVyeSAqKXNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYik7Cit9CisjZW5kaWYKKwogI2RlZmluZSBJR01QX0hPU1RfTUVNQkVSU0hJUF9RVUVSWQkweDExCS8qIEZyb20gUkZDMTExMiAqLwogI2RlZmluZSBJR01QX0hPU1RfTUVNQkVSU0hJUF9SRVBPUlQJMHgxMgkvKiBEaXR0byAqLwogI2RlZmluZSBJR01QX0RWTVJQCQkJMHgxMwkvKiBEVk1SUCByb3V0aW5nICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2luLmggYi9pbmNsdWRlL2xpbnV4L2luLmgKaW5kZXggMTkxMmU3Yy4uMzk3NWNiZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pbi5oCisrKyBiL2luY2x1ZGUvbGludXgvaW4uaApAQCAtODMsNiArODMsNyBAQAogI2RlZmluZSBJUF9QTVRVRElTQ19ET05UCQkwCS8qIE5ldmVyIHNlbmQgREYgZnJhbWVzICovCiAjZGVmaW5lIElQX1BNVFVESVNDX1dBTlQJCTEJLyogVXNlIHBlciByb3V0ZSBoaW50cwkqLwogI2RlZmluZSBJUF9QTVRVRElTQ19ETwkJCTIJLyogQWx3YXlzIERGCQkqLworI2RlZmluZSBJUF9QTVRVRElTQ19QUk9CRQkJMyAgICAgICAvKiBJZ25vcmUgZHN0IHBtdHUgICAgICAqLwogCiAjZGVmaW5lIElQX01VTFRJQ0FTVF9JRgkJCTMyCiAjZGVmaW5lIElQX01VTFRJQ0FTVF9UVEwgCQkzMwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pbjYuaCBiL2luY2x1ZGUvbGludXgvaW42LmgKaW5kZXggNGU4MzUwYS4uMmE2MWM4MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pbjYuaAorKysgYi9pbmNsdWRlL2xpbnV4L2luNi5oCkBAIC00NCwxMCArNDQsOCBAQAogICogTk9URTogQmUgYXdhcmUgdGhlIElONkFERFJfKiBjb25zdGFudHMgYW5kIGluNmFkZHJfKiBleHRlcm5hbHMgYXJlIGRlZmluZWQKICAqIGluIG5ldHdvcmsgYnl0ZSBvcmRlciwgbm90IGluIGhvc3QgYnl0ZSBvcmRlciBhcyBhcmUgdGhlIElQdjQgZXF1aXZhbGVudHMKICAqLwotI2lmIDAKIGV4dGVybiBjb25zdCBzdHJ1Y3QgaW42X2FkZHIgaW42YWRkcl9hbnk7CiAjZGVmaW5lIElONkFERFJfQU5ZX0lOSVQgeyB7IHsgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCB9IH0gfQotI2VuZGlmCiBleHRlcm4gY29uc3Qgc3RydWN0IGluNl9hZGRyIGluNmFkZHJfbG9vcGJhY2s7CiAjZGVmaW5lIElONkFERFJfTE9PUEJBQ0tfSU5JVCB7IHsgeyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxIH0gfSB9CiAKQEAgLTE3OSw2ICsxNzcsNyBAQAogI2RlZmluZSBJUFY2X1BNVFVESVNDX0RPTlQJCTAKICNkZWZpbmUgSVBWNl9QTVRVRElTQ19XQU5UCQkxCiAjZGVmaW5lIElQVjZfUE1UVURJU0NfRE8JCTIKKyNkZWZpbmUgSVBWNl9QTVRVRElTQ19QUk9CRQkJMwogCiAvKiBGbG93bGFiZWwgKi8KICNkZWZpbmUgSVBWNl9GTE9XTEFCRUxfTUdSCTMyCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lvcG9ydC5oIGIvaW5jbHVkZS9saW51eC9pb3BvcnQuaAppbmRleCA2ODU5YTNiLi43MWVhOTIzMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pb3BvcnQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lvcG9ydC5oCkBAIC05OSw3ICs5OSw2IEBACiBleHRlcm4gc3RydWN0IHJlc291cmNlIGlvbWVtX3Jlc291cmNlOwogCiBleHRlcm4gaW50IHJlcXVlc3RfcmVzb3VyY2Uoc3RydWN0IHJlc291cmNlICpyb290LCBzdHJ1Y3QgcmVzb3VyY2UgKm5ldyk7Ci1leHRlcm4gc3RydWN0IHJlc291cmNlICogX19fX3JlcXVlc3RfcmVzb3VyY2Uoc3RydWN0IHJlc291cmNlICpyb290LCBzdHJ1Y3QgcmVzb3VyY2UgKm5ldyk7CiBleHRlcm4gaW50IHJlbGVhc2VfcmVzb3VyY2Uoc3RydWN0IHJlc291cmNlICpuZXcpOwogZXh0ZXJuIGludCBpbnNlcnRfcmVzb3VyY2Uoc3RydWN0IHJlc291cmNlICpwYXJlbnQsIHN0cnVjdCByZXNvdXJjZSAqbmV3KTsKIGV4dGVybiBpbnQgYWxsb2NhdGVfcmVzb3VyY2Uoc3RydWN0IHJlc291cmNlICpyb290LCBzdHJ1Y3QgcmVzb3VyY2UgKm5ldywKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaXAuaCBiL2luY2x1ZGUvbGludXgvaXAuaAppbmRleCAxZDM2Yjk3Li5iZDBhMmE4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lwLmgKKysrIGIvaW5jbHVkZS9saW51eC9pcC5oCkBAIC0xMDQsNiArMTA0LDIwIEBACiAJLypUaGUgb3B0aW9ucyBzdGFydCBoZXJlLiAqLwogfTsKIAorI2lmZGVmIF9fS0VSTkVMX18KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaXBoZHIgKmlwX2hkcihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiAoc3RydWN0IGlwaGRyICopc2tiX25ldHdvcmtfaGVhZGVyKHNrYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGlwaGRyICppcGlwX2hkcihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiAoc3RydWN0IGlwaGRyICopc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKK30KKyNlbmRpZgorCiBzdHJ1Y3QgaXBfYXV0aF9oZHIgewogCV9fdTggIG5leHRoZHI7CiAJX191OCAgaGRybGVuOwkJLyogVGhpcyBvbmUgaXMgbWVhc3VyZWQgaW4gMzIgYml0IHVuaXRzISAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pcHY2LmggYi9pbmNsdWRlL2xpbnV4L2lwdjYuaAppbmRleCA3MTNlYjVlLi4wOWVhMDFhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lwdjYuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lwdjYuaApAQCAtMTc4LDYgKzE3OCw5IEBACiAjZW5kaWYKIAlfX3MzMgkJcHJveHlfbmRwOwogCV9fczMyCQlhY2NlcHRfc291cmNlX3JvdXRlOworI2lmZGVmIENPTkZJR19JUFY2X09QVElNSVNUSUNfREFECisJX19zMzIJCW9wdGltaXN0aWNfZGFkOworI2VuZGlmCiAJdm9pZAkJKnN5c2N0bDsKIH07CiAKQEAgLTIwOCw2ICsyMTEsNyBAQAogCURFVkNPTkZfUFJPWFlfTkRQLAogCV9fREVWQ09ORl9PUFRJTUlTVElDX0RBRCwKIAlERVZDT05GX0FDQ0VQVF9TT1VSQ0VfUk9VVEUsCisJREVWQ09ORl9PUFRJTUlTVElDX0RBRCwKIAlERVZDT05GX01BWAogfTsKIApAQCAtMjE5LDYgKzIyMywxNiBAQAogI2luY2x1ZGUgPG5ldC9pZl9pbmV0Ni5oPiAgICAgICAvKiBzdHJ1Y3QgaXB2Nl9tY19zb2NrbGlzdCAqLwogI2luY2x1ZGUgPG5ldC9pbmV0X3NvY2suaD4KIAorc3RhdGljIGlubGluZSBzdHJ1Y3QgaXB2NmhkciAqaXB2Nl9oZHIoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gKHN0cnVjdCBpcHY2aGRyICopc2tiX25ldHdvcmtfaGVhZGVyKHNrYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGlwdjZoZHIgKmlwaXB2Nl9oZHIoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gKHN0cnVjdCBpcHY2aGRyICopc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKK30KKwogLyogCiAgICBUaGlzIHN0cnVjdHVyZSBjb250YWlucyByZXN1bHRzIG9mIGV4dGhkcnMgcGFyc2luZwogICAgYXMgb2Zmc2V0cyBmcm9tIHNrYi0+bmguCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2poYXNoLmggYi9pbmNsdWRlL2xpbnV4L2poYXNoLmgKaW5kZXggODJjN2FlNC4uMmEyZjk5ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9qaGFzaC5oCisrKyBiL2luY2x1ZGUvbGludXgvamhhc2guaApAQCAtODQsNyArODQsNyBAQAogLyogQSBzcGVjaWFsIG9wdGltaXplZCB2ZXJzaW9uIHRoYXQgaGFuZGxlcyAxIG9yIG1vcmUgb2YgdTMycy4KICAqIFRoZSBsZW5ndGggcGFyYW1ldGVyIGhlcmUgaXMgdGhlIG51bWJlciBvZiB1MzJzIGluIHRoZSBrZXkuCiAgKi8KLXN0YXRpYyBpbmxpbmUgdTMyIGpoYXNoMih1MzIgKmssIHUzMiBsZW5ndGgsIHUzMiBpbml0dmFsKQorc3RhdGljIGlubGluZSB1MzIgamhhc2gyKGNvbnN0IHUzMiAqaywgdTMyIGxlbmd0aCwgdTMyIGluaXR2YWwpCiB7CiAJdTMyIGEsIGIsIGMsIGxlbjsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9rYWxsc3ltcy5oIGIvaW5jbHVkZS9saW51eC9rYWxsc3ltcy5oCmluZGV4IDFjZWJjYmMuLjNlM2I5MmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgva2FsbHN5bXMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2thbGxzeW1zLmgKQEAgLTcsNiArNyw4IEBACiAKIAogI2RlZmluZSBLU1lNX05BTUVfTEVOIDEyNworI2RlZmluZSBLU1lNX1NZTUJPTF9MRU4gKHNpemVvZigiJXMrJSNseC8lI2x4IFslc10iKSArIEtTWU1fTkFNRV9MRU4gKwlcCisJCQkgMiooQklUU19QRVJfTE9ORyozLzEwKSArIE1PRFVMRV9OQU1FX0xFTiArIDEpCiAKICNpZmRlZiBDT05GSUdfS0FMTFNZTVMKIC8qIExvb2t1cCB0aGUgYWRkcmVzcyBmb3IgYSBzeW1ib2wuIFJldHVybnMgMCBpZiBub3QgZm91bmQuICovCkBAIC0yMiw3ICsyNCwxMCBAQAogCQkJICAgIHVuc2lnbmVkIGxvbmcgKm9mZnNldCwKIAkJCSAgICBjaGFyICoqbW9kbmFtZSwgY2hhciAqbmFtZWJ1Zik7CiAKLS8qIFJlcGxhY2UgIiVzIiBpbiBmb3JtYXQgd2l0aCBhZGRyZXNzLCBpZiBmb3VuZCAqLworLyogTG9vayB1cCBhIGtlcm5lbCBzeW1ib2wgYW5kIHJldHVybiBpdCBpbiBhIHRleHQgYnVmZmVyLiAqLworZXh0ZXJuIGludCBzcHJpbnRfc3ltYm9sKGNoYXIgKmJ1ZmZlciwgdW5zaWduZWQgbG9uZyBhZGRyZXNzKTsKKworLyogTG9vayB1cCBhIGtlcm5lbCBzeW1ib2wgYW5kIHByaW50IGl0IHRvIHRoZSBrZXJuZWwgbWVzc2FnZXMuICovCiBleHRlcm4gdm9pZCBfX3ByaW50X3N5bWJvbChjb25zdCBjaGFyICpmbXQsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyk7CiAKICNlbHNlIC8qICFDT05GSUdfS0FMTFNZTVMgKi8KQEAgLTQ3LDYgKzUyLDEyIEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IHNwcmludF9zeW1ib2woY2hhciAqYnVmZmVyLCB1bnNpZ25lZCBsb25nIGFkZHIpCit7CisJKmJ1ZmZlciA9ICdcMCc7CisJcmV0dXJuIDA7Cit9CisKIC8qIFN0dXBpZCB0aGF0IHRoaXMgZG9lcyBub3RoaW5nLCBidXQgSSBkaWRuJ3QgY3JlYXRlIHRoaXMgbWVzcy4gKi8KICNkZWZpbmUgX19wcmludF9zeW1ib2woZm10LCBhZGRyKQogI2VuZGlmIC8qQ09ORklHX0tBTExTWU1TKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva2VybmVsLmggYi9pbmNsdWRlL2xpbnV4L2tlcm5lbC5oCmluZGV4IDlkZGYyNWMuLmUyZjQxYjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgva2VybmVsLmgKKysrIGIvaW5jbHVkZS9saW51eC9rZXJuZWwuaApAQCAtMTIxLDYgKzEyMSw3IEBACiAJX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAzLCAwKSkpOwogZXh0ZXJuIGNoYXIgKmthc3ByaW50ZihnZnBfdCBnZnAsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQogCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMiwgMykpKTsKK2V4dGVybiBjaGFyICprdmFzcHJpbnRmKGdmcF90IGdmcCwgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFyZ3MpOwogCiBleHRlcm4gaW50IHNzY2FuZihjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgLi4uKQogCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHNjYW5mLCAyLCAzKSkpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9rZXkuaCBiL2luY2x1ZGUvbGludXgva2V5LmgKaW5kZXggMTY5ZjA1ZTQuLmE5MjIwZTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgva2V5LmgKKysrIGIvaW5jbHVkZS9saW51eC9rZXkuaApAQCAtMTYwLDYgKzE2MCw4IEBACiAJICovCiAJdW5pb24gewogCQlzdHJ1Y3QgbGlzdF9oZWFkCWxpbms7CisJCXVuc2lnbmVkIGxvbmcJCXhbMl07CisJCXZvaWQJCQkqcFsyXTsKIAl9IHR5cGVfZGF0YTsKIAogCS8qIGtleSBkYXRhCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2tvYmplY3QuaCBiL2luY2x1ZGUvbGludXgva29iamVjdC5oCmluZGV4IGI4NTBlMDMuLmViMGU2M2UgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgva29iamVjdC5oCisrKyBiL2luY2x1ZGUvbGludXgva29iamVjdC5oCkBAIC0yMiw3ICsyMiw2IEBACiAjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvcndzZW0uaD4KICNpbmNsdWRlIDxsaW51eC9rcmVmLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgpAQCAtNDMsMTEgKzQyLDkgQEAKIAlLT0JKX0FERAk9IChfX2ZvcmNlIGtvYmplY3RfYWN0aW9uX3QpIDB4MDEsCS8qIGV4Y2x1c2l2ZSB0byBjb3JlICovCiAJS09CSl9SRU1PVkUJPSAoX19mb3JjZSBrb2JqZWN0X2FjdGlvbl90KSAweDAyLAkvKiBleGNsdXNpdmUgdG8gY29yZSAqLwogCUtPQkpfQ0hBTkdFCT0gKF9fZm9yY2Uga29iamVjdF9hY3Rpb25fdCkgMHgwMywJLyogZGV2aWNlIHN0YXRlIGNoYW5nZSAqLwotCUtPQkpfTU9VTlQJPSAoX19mb3JjZSBrb2JqZWN0X2FjdGlvbl90KSAweDA0LAkvKiBtb3VudCBldmVudCBmb3IgYmxvY2sgZGV2aWNlcyAoYnJva2VuKSAqLwotCUtPQkpfVU1PVU5UCT0gKF9fZm9yY2Uga29iamVjdF9hY3Rpb25fdCkgMHgwNSwJLyogdW1vdW50IGV2ZW50IGZvciBibG9jayBkZXZpY2VzIChicm9rZW4pICovCi0JS09CSl9PRkZMSU5FCT0gKF9fZm9yY2Uga29iamVjdF9hY3Rpb25fdCkgMHgwNiwJLyogZGV2aWNlIG9mZmxpbmUgKi8KLQlLT0JKX09OTElORQk9IChfX2ZvcmNlIGtvYmplY3RfYWN0aW9uX3QpIDB4MDcsCS8qIGRldmljZSBvbmxpbmUgKi8KLQlLT0JKX01PVkUJPSAoX19mb3JjZSBrb2JqZWN0X2FjdGlvbl90KSAweDA4LAkvKiBkZXZpY2UgbW92ZSAqLworCUtPQkpfT0ZGTElORQk9IChfX2ZvcmNlIGtvYmplY3RfYWN0aW9uX3QpIDB4MDQsCS8qIGRldmljZSBvZmZsaW5lICovCisJS09CSl9PTkxJTkUJPSAoX19mb3JjZSBrb2JqZWN0X2FjdGlvbl90KSAweDA1LAkvKiBkZXZpY2Ugb25saW5lICovCisJS09CSl9NT1ZFCT0gKF9fZm9yY2Uga29iamVjdF9hY3Rpb25fdCkgMHgwNiwJLyogZGV2aWNlIG1vdmUgKi8KIH07CiAKIHN0cnVjdCBrb2JqZWN0IHsKQEAgLTg5LDYgKzg2LDggQEAKIGV4dGVybiBzdHJ1Y3Qga29iamVjdCAqIGtvYmplY3RfZ2V0KHN0cnVjdCBrb2JqZWN0ICopOwogZXh0ZXJuIHZvaWQga29iamVjdF9wdXQoc3RydWN0IGtvYmplY3QgKik7CiAKK2V4dGVybiBzdHJ1Y3Qga29iamVjdCAqa29iamVjdF9rc2V0X2FkZF9kaXIoc3RydWN0IGtzZXQgKmtzZXQsCisJCQkJCSAgICBzdHJ1Y3Qga29iamVjdCAqLCBjb25zdCBjaGFyICopOwogZXh0ZXJuIHN0cnVjdCBrb2JqZWN0ICprb2JqZWN0X2FkZF9kaXIoc3RydWN0IGtvYmplY3QgKiwgY29uc3QgY2hhciAqKTsKIAogZXh0ZXJuIGNoYXIgKiBrb2JqZWN0X2dldF9wYXRoKHN0cnVjdCBrb2JqZWN0ICosIGdmcF90KTsKQEAgLTE3NSw3ICsxNzQsNiBAQAogCiBzdHJ1Y3Qgc3Vic3lzdGVtIHsKIAlzdHJ1Y3Qga3NldAkJa3NldDsKLQlzdHJ1Y3Qgcndfc2VtYXBob3JlCXJ3c2VtOwogfTsKIAogI2RlZmluZSBkZWNsX3N1YnN5cyhfbmFtZSxfdHlwZSxfdWV2ZW50X29wcykgXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9rdGltZS5oIGIvaW5jbHVkZS9saW51eC9rdGltZS5oCmluZGV4IDI0ODMwNWIuLjgxYmI5YzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgva3RpbWUuaAorKysgYi9pbmNsdWRlL2xpbnV4L2t0aW1lLmgKQEAgLTI1OSw2ICsyNTksMTIgQEAKIAogI2VuZGlmCiAKK3N0YXRpYyBpbmxpbmUgczY0IGt0aW1lX3RvX3VzKGNvbnN0IGt0aW1lX3Qga3QpCit7CisJc3RydWN0IHRpbWV2YWwgdHYgPSBrdGltZV90b190aW1ldmFsKGt0KTsKKwlyZXR1cm4gKHM2NCkgdHYudHZfc2VjICogVVNFQ19QRVJfU0VDICsgdHYudHZfdXNlYzsKK30KKwogLyoKICAqIFRoZSByZXNvbHV0aW9uIG9mIHRoZSBjbG9ja3MuIFRoZSByZXNvbHV0aW9uIHZhbHVlIGlzIHJldHVybmVkIGluCiAgKiB0aGUgY2xvY2tfZ2V0cmVzKCkgc3lzdGVtIGNhbGwgdG8gZ2l2ZSBhcHBsaWNhdGlvbiBwcm9ncmFtbWVycyBhbgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9saWJhdGEuaCBiL2luY2x1ZGUvbGludXgvbGliYXRhLmgKaW5kZXggMGNmYmNiNi4uZDhjZmM3MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9saWJhdGEuaAorKysgYi9pbmNsdWRlL2xpbnV4L2xpYmF0YS5oCkBAIC0yMTAsNiArMjEwLDcgQEAKIAogCS8qIGhvc3Qgc2V0IGZsYWdzICovCiAJQVRBX0hPU1RfU0lNUExFWAk9ICgxIDw8IDApLAkvKiBIb3N0IGlzIHNpbXBsZXgsIG9uZSBETUEgY2hhbm5lbCBwZXIgaG9zdCBvbmx5ICovCisJQVRBX0hPU1RfU1RBUlRFRAk9ICgxIDw8IDEpLAkvKiBIb3N0IHN0YXJ0ZWQgKi8KIAogCS8qIHZhcmlvdXMgbGVuZ3RocyBvZiB0aW1lICovCiAJQVRBX1RNT1VUX0JPT1QJCT0gMzAgKiBIWiwJLyogaGV1cmlzdGljICovCkBAIC0yODEsMTEgKzI4MiwxMyBAQAogCUFUQV9FSElfTk9fQVVUT1BTWQk9ICgxIDw8IDIpLCAgLyogbm8gYXV0b3BzeSAqLwogCUFUQV9FSElfUVVJRVQJCT0gKDEgPDwgMyksICAvKiBiZSBxdWlldCAqLwogCi0JQVRBX0VISV9ESURfUkVTRVQJPSAoMSA8PCAxNiksIC8qIGFscmVhZHkgcmVzZXQgdGhpcyBwb3J0ICovCi0JQVRBX0VISV9QUklOVElORk8JPSAoMSA8PCAxNyksIC8qIHByaW50IGNvbmZpZ3VyYXRpb24gaW5mbyAqLwotCUFUQV9FSElfU0VUTU9ERQkJPSAoMSA8PCAxOCksIC8qIGNvbmZpZ3VyZSB0cmFuc2ZlciBtb2RlICovCi0JQVRBX0VISV9QT1NUX1NFVE1PREUJPSAoMSA8PCAxOSksIC8qIHJldmFpbGRhdGluZyBhZnRlciBzZXRtb2RlICovCisJQVRBX0VISV9ESURfU09GVFJFU0VUCT0gKDEgPDwgMTYpLCAvKiBhbHJlYWR5IHNvZnQtcmVzZXQgdGhpcyBwb3J0ICovCisJQVRBX0VISV9ESURfSEFSRFJFU0VUCT0gKDEgPDwgMTcpLCAvKiBhbHJlYWR5IHNvZnQtcmVzZXQgdGhpcyBwb3J0ICovCisJQVRBX0VISV9QUklOVElORk8JPSAoMSA8PCAxOCksIC8qIHByaW50IGNvbmZpZ3VyYXRpb24gaW5mbyAqLworCUFUQV9FSElfU0VUTU9ERQkJPSAoMSA8PCAxOSksIC8qIGNvbmZpZ3VyZSB0cmFuc2ZlciBtb2RlICovCisJQVRBX0VISV9QT1NUX1NFVE1PREUJPSAoMSA8PCAyMCksIC8qIHJldmFpbGRhdGluZyBhZnRlciBzZXRtb2RlICovCiAKKwlBVEFfRUhJX0RJRF9SRVNFVAk9IEFUQV9FSElfRElEX1NPRlRSRVNFVCB8IEFUQV9FSElfRElEX0hBUkRSRVNFVCwKIAlBVEFfRUhJX1JFU0VUX01PRElGSUVSX01BU0sgPSBBVEFfRUhJX1JFU1VNRV9MSU5LLAogCiAJLyogbWF4IHJlcGVhdCBpZiBlcnJvciBjb25kaXRpb24gaXMgc3RpbGwgc2V0IGFmdGVyIC0+ZXJyb3JfaGFuZGxlciAqLwpAQCAtMzY3LDM0ICszNzAsNiBAQAogCXZvaWQgX19pb21lbQkJKnNjcl9hZGRyOwogfTsKIAotc3RydWN0IGF0YV9wcm9iZV9lbnQgewotCXN0cnVjdCBsaXN0X2hlYWQJbm9kZTsKLQlzdHJ1Y3QgZGV2aWNlIAkJKmRldjsKLQljb25zdCBzdHJ1Y3QgYXRhX3BvcnRfb3BlcmF0aW9ucyAqcG9ydF9vcHM7Ci0Jc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqc2h0OwotCXN0cnVjdCBhdGFfaW9wb3J0cwlwb3J0W0FUQV9NQVhfUE9SVFNdOwotCXVuc2lnbmVkIGludAkJbl9wb3J0czsKLQl1bnNpZ25lZCBpbnQJCWR1bW15X3BvcnRfbWFzazsKLQl1bnNpZ25lZCBpbnQJCXBpb19tYXNrOwotCXVuc2lnbmVkIGludAkJbXdkbWFfbWFzazsKLQl1bnNpZ25lZCBpbnQJCXVkbWFfbWFzazsKLQl1bnNpZ25lZCBsb25nCQlpcnE7Ci0JdW5zaWduZWQgbG9uZwkJaXJxMjsKLQl1bnNpZ25lZCBpbnQJCWlycV9mbGFnczsKLQl1bnNpZ25lZCBsb25nCQlwb3J0X2ZsYWdzOwotCXVuc2lnbmVkIGxvbmcJCV9ob3N0X2ZsYWdzOwotCXZvaWQgX19pb21lbSAqIGNvbnN0CSppb21hcDsKLQl2b2lkCQkJKnByaXZhdGVfZGF0YTsKLQotCS8qIHBvcnRfaW5mbyBmb3IgdGhlIHNlY29uZGFyeSBwb3J0LiAgVG9nZXRoZXIgd2l0aCBpcnEyLCBpdCdzCi0JICogdXNlZCB0byBpbXBsZW1lbnQgbm9uLXVuaWZvcm0gc2Vjb25kYXJ5IHBvcnQuICBDdXJyZW50bHksCi0JICogdGhlIG9ubHkgdXNlciBpcyBhdGFfcGlpeCBjb21iaW5lZCBtb2RlLiAgVGhpcyB3b3JrYXJvdW5kCi0JICogd2lsbCBiZSByZW1vdmVkIHRvZ2V0aGVyIHdpdGggYXRhX3Byb2JlX2VudCB3aGVuIGluaXQgbW9kZWwKLQkgKiBpcyB1cGRhdGVkLgotCSAqLwotCWNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvICpwaW5mbzI7Ci19OwotCiBzdHJ1Y3QgYXRhX2hvc3QgewogCXNwaW5sb2NrX3QJCWxvY2s7CiAJc3RydWN0IGRldmljZSAJCSpkZXY7CkBAIC00MjcsNiArNDAyLDcgQEAKIAlpbnQJCQlkbWFfZGlyOwogCiAJdW5zaWduZWQgaW50CQlwYWRfbGVuOworCXVuc2lnbmVkIGludAkJc2VjdF9zaXplOwogCiAJdW5zaWduZWQgaW50CQluYnl0ZXM7CiAJdW5zaWduZWQgaW50CQljdXJieXRlczsKQEAgLTQ3Miw2ICs0NDgsNyBAQAogCXN0cnVjdCBzY3NpX2RldmljZQkqc2RldjsJCS8qIGF0dGFjaGVkIFNDU0kgZGV2aWNlICovCiAJLyogbl9zZWN0b3IgaXMgdXNlZCBhcyBDTEVBUl9PRkZTRVQsIHJlYWQgY29tbWVudCBhYm92ZSBDTEVBUl9PRkZTRVQgKi8KIAl1NjQJCQluX3NlY3RvcnM7CS8qIHNpemUgb2YgZGV2aWNlLCBpZiBBVEEgKi8KKwl1NjQJCQluX3NlY3RvcnNfYm9vdDsJLyogc2l6ZSBvZiBBVEEgZGV2aWNlIGF0IHN0YXJ0dXAgKi8KIAl1bnNpZ25lZCBpbnQJCWNsYXNzOwkJLyogQVRBX0RFVl94eHggKi8KIAl1MTYJCQlpZFtBVEFfSURfV09SRFNdOyAvKiBJREVOVElGWSB4eHggREVWSUNFIGRhdGEgKi8KIAl1OAkJCXBpb19tb2RlOwpAQCAtNTk3LDExICs1NzQsMTEgQEAKIHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIHsKIAl2b2lkICgqcG9ydF9kaXNhYmxlKSAoc3RydWN0IGF0YV9wb3J0ICopOwogCi0Jdm9pZCAoKmRldl9jb25maWcpIChzdHJ1Y3QgYXRhX3BvcnQgKiwgc3RydWN0IGF0YV9kZXZpY2UgKik7CisJdm9pZCAoKmRldl9jb25maWcpIChzdHJ1Y3QgYXRhX2RldmljZSAqKTsKIAogCXZvaWQgKCpzZXRfcGlvbW9kZSkgKHN0cnVjdCBhdGFfcG9ydCAqLCBzdHJ1Y3QgYXRhX2RldmljZSAqKTsKIAl2b2lkICgqc2V0X2RtYW1vZGUpIChzdHJ1Y3QgYXRhX3BvcnQgKiwgc3RydWN0IGF0YV9kZXZpY2UgKik7Ci0JdW5zaWduZWQgbG9uZyAoKm1vZGVfZmlsdGVyKSAoY29uc3Qgc3RydWN0IGF0YV9wb3J0ICosIHN0cnVjdCBhdGFfZGV2aWNlICosIHVuc2lnbmVkIGxvbmcpOworCXVuc2lnbmVkIGxvbmcgKCptb2RlX2ZpbHRlcikgKHN0cnVjdCBhdGFfZGV2aWNlICosIHVuc2lnbmVkIGxvbmcpOwogCiAJdm9pZCAoKnRmX2xvYWQpIChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBjb25zdCBzdHJ1Y3QgYXRhX3Rhc2tmaWxlICp0Zik7CiAJdm9pZCAoKnRmX3JlYWQpIChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX3Rhc2tmaWxlICp0Zik7CkBAIC02MTYsNiArNTkzLDggQEAKIAogCXZvaWQgKCpwb3N0X3NldF9tb2RlKSAoc3RydWN0IGF0YV9wb3J0ICphcCk7CiAKKwlpbnQgKCpjYWJsZV9kZXRlY3QpIChzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKKwogCWludCAgKCpjaGVja19hdGFwaV9kbWEpIChzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKTsKIAogCXZvaWQgKCpibWRtYV9zZXR1cCkgKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpOwpAQCAtNjY0LDYgKzY0Myw3IEBACiAJdW5zaWduZWQgbG9uZwkJbXdkbWFfbWFzazsKIAl1bnNpZ25lZCBsb25nCQl1ZG1hX21hc2s7CiAJY29uc3Qgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgKnBvcnRfb3BzOworCWlycV9oYW5kbGVyX3QJCWlycV9oYW5kbGVyOwogCXZvaWQgCQkJKnByaXZhdGVfZGF0YTsKIH07CiAKQEAgLTY4Niw2ICs2NjYsNyBAQAogZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGxvbmcgc2F0YV9kZWJfdGltaW5nX2xvbmdbXTsKIAogZXh0ZXJuIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIGF0YV9kdW1teV9wb3J0X29wczsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBhdGFfZHVtbXlfcG9ydF9pbmZvOwogCiBzdGF0aWMgaW5saW5lIGNvbnN0IHVuc2lnbmVkIGxvbmcgKgogc2F0YV9laGNfZGViX3RpbWluZyhzdHJ1Y3QgYXRhX2VoX2NvbnRleHQgKmVoYykKQEAgLTcwMSw2ICs2ODIsNyBAQAogCXJldHVybiBhcC0+b3BzID09ICZhdGFfZHVtbXlfcG9ydF9vcHM7CiB9CiAKK2V4dGVybiB2b2lkIHNhdGFfcHJpbnRfbGlua19zdGF0dXMoc3RydWN0IGF0YV9wb3J0ICphcCk7CiBleHRlcm4gdm9pZCBhdGFfcG9ydF9wcm9iZShzdHJ1Y3QgYXRhX3BvcnQgKik7CiBleHRlcm4gdm9pZCBfX3NhdGFfcGh5X3Jlc2V0KHN0cnVjdCBhdGFfcG9ydCAqYXApOwogZXh0ZXJuIHZvaWQgc2F0YV9waHlfcmVzZXQoc3RydWN0IGF0YV9wb3J0ICphcCk7CkBAIC03MjgsNyArNzEwLDE1IEBACiAjZW5kaWYKIGV4dGVybiBpbnQgYXRhX3BjaV9jbGVhcl9zaW1wbGV4KHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKICNlbmRpZiAvKiBDT05GSUdfUENJICovCi1leHRlcm4gaW50IGF0YV9kZXZpY2VfYWRkKGNvbnN0IHN0cnVjdCBhdGFfcHJvYmVfZW50ICplbnQpOworZXh0ZXJuIHN0cnVjdCBhdGFfaG9zdCAqYXRhX2hvc3RfYWxsb2Moc3RydWN0IGRldmljZSAqZGV2LCBpbnQgbWF4X3BvcnRzKTsKK2V4dGVybiBzdHJ1Y3QgYXRhX2hvc3QgKmF0YV9ob3N0X2FsbG9jX3BpbmZvKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCWNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvICogY29uc3QgKiBwcGksIGludCBuX3BvcnRzKTsKK2V4dGVybiBpbnQgYXRhX2hvc3Rfc3RhcnQoc3RydWN0IGF0YV9ob3N0ICpob3N0KTsKK2V4dGVybiBpbnQgYXRhX2hvc3RfcmVnaXN0ZXIoc3RydWN0IGF0YV9ob3N0ICpob3N0LAorCQkJICAgICBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlICpzaHQpOworZXh0ZXJuIGludCBhdGFfaG9zdF9hY3RpdmF0ZShzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QsIGludCBpcnEsCisJCQkgICAgIGlycV9oYW5kbGVyX3QgaXJxX2hhbmRsZXIsIHVuc2lnbmVkIGxvbmcgaXJxX2ZsYWdzLAorCQkJICAgICBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlICpzaHQpOwogZXh0ZXJuIHZvaWQgYXRhX2hvc3RfZGV0YWNoKHN0cnVjdCBhdGFfaG9zdCAqaG9zdCk7CiBleHRlcm4gdm9pZCBhdGFfaG9zdF9pbml0KHN0cnVjdCBhdGFfaG9zdCAqLCBzdHJ1Y3QgZGV2aWNlICosCiAJCQkgIHVuc2lnbmVkIGxvbmcsIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zICopOwpAQCAtODI4LDExICs4MTgsMTcgQEAKIGV4dGVybiBpbnQgYXRhX3Njc2lfY2hhbmdlX3F1ZXVlX2RlcHRoKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldiwKIAkJCQkgICAgICAgaW50IHF1ZXVlX2RlcHRoKTsKIGV4dGVybiBzdHJ1Y3QgYXRhX2RldmljZSAqYXRhX2Rldl9wYWlyKHN0cnVjdCBhdGFfZGV2aWNlICphZGV2KTsKK2V4dGVybiBpbnQgYXRhX2RvX3NldF9tb2RlKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfZGV2aWNlICoqcl9mYWlsZWRfZGV2KTsKIGV4dGVybiB1OCBhdGFfaXJxX29uKHN0cnVjdCBhdGFfcG9ydCAqYXApOwogZXh0ZXJuIHU4IGF0YV9kdW1teV9pcnFfb24oc3RydWN0IGF0YV9wb3J0ICphcCk7CiBleHRlcm4gdTggYXRhX2lycV9hY2soc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IGNoa19kcnEpOwogZXh0ZXJuIHU4IGF0YV9kdW1teV9pcnFfYWNrKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCBjaGtfZHJxKTsKIAorZXh0ZXJuIGludCBhdGFfY2FibGVfNDB3aXJlKHN0cnVjdCBhdGFfcG9ydCAqYXApOworZXh0ZXJuIGludCBhdGFfY2FibGVfODB3aXJlKHN0cnVjdCBhdGFfcG9ydCAqYXApOworZXh0ZXJuIGludCBhdGFfY2FibGVfc2F0YShzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKK2V4dGVybiBpbnQgYXRhX2NhYmxlX3Vua25vd24oc3RydWN0IGF0YV9wb3J0ICphcCk7CisKIC8qCiAgKiBUaW1pbmcgaGVscGVycwogICovCkBAIC04NzAsMTAgKzg2NiwxMyBAQAogCXVuc2lnbmVkIGxvbmcJCXZhbDsKIH07CiAKLWV4dGVybiBzdHJ1Y3QgYXRhX3Byb2JlX2VudCAqCi1hdGFfcGNpX2luaXRfbmF0aXZlX21vZGUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCBhdGFfcG9ydF9pbmZvICoqcG9ydCwgaW50IHBvcnRtYXNrKTsKK2V4dGVybiBpbnQgYXRhX3BjaV9pbml0X25hdGl2ZV9ob3N0KHN0cnVjdCBhdGFfaG9zdCAqaG9zdCwKKwkJCQkgICAgdW5zaWduZWQgaW50IHBvcnRfbWFzayk7CitleHRlcm4gaW50IGF0YV9wY2lfcHJlcGFyZV9uYXRpdmVfaG9zdChzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQljb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqIGNvbnN0ICogcHBpLAorCQkJCWludCBuX3BvcnRzLCBzdHJ1Y3QgYXRhX2hvc3QgKipyX2hvc3QpOwogZXh0ZXJuIGludCBwY2lfdGVzdF9jb25maWdfYml0cyhzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9iaXRzICpiaXRzKTsKLWV4dGVybiB1bnNpZ25lZCBsb25nIGF0YV9wY2lfZGVmYXVsdF9maWx0ZXIoY29uc3Qgc3RydWN0IGF0YV9wb3J0ICosIHN0cnVjdCBhdGFfZGV2aWNlICosIHVuc2lnbmVkIGxvbmcpOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgYXRhX3BjaV9kZWZhdWx0X2ZpbHRlcihzdHJ1Y3QgYXRhX2RldmljZSAqLCB1bnNpZ25lZCBsb25nKTsKICNlbmRpZiAvKiBDT05GSUdfUENJICovCiAKIC8qCkBAIC0xMTczLDYgKzExNzIsNyBAQAogCXFjLT5uX2VsZW0gPSAwOwogCXFjLT5lcnJfbWFzayA9IDA7CiAJcWMtPnBhZF9sZW4gPSAwOworCXFjLT5zZWN0X3NpemUgPSBBVEFfU0VDVF9TSVpFOwogCiAJYXRhX3RmX2luaXQocWMtPmRldiwgJnFjLT50Zik7CiAKQEAgLTEyMjAsNyArMTIyMCw3IEBACiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGF0YV9wb3J0ICphdGFfc2hvc3RfdG9fcG9ydChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KQogewotCXJldHVybiAoc3RydWN0IGF0YV9wb3J0ICopICZob3N0LT5ob3N0ZGF0YVswXTsKKwlyZXR1cm4gKihzdHJ1Y3QgYXRhX3BvcnQgKiopJmhvc3QtPmhvc3RkYXRhWzBdOwogfQogCiAjZW5kaWYgLyogX19MSU5VWF9MSUJBVEFfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L210ZC9pZmxhc2guaCBiL2luY2x1ZGUvbGludXgvbXRkL2lmbGFzaC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWE1YjRmLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbGludXgvbXRkL2lmbGFzaC5oCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyogJElkOiBpZmxhc2guaCx2IDEuMiAyMDAwLzExLzEzIDE4OjAxOjU0IGR3bXcyIEV4cCAkICovCi0KLSNpZm5kZWYgX19NVERfSUZMQVNIX0hfXwotI2RlZmluZSBfX01URF9JRkxBU0hfSF9fCi0KLS8qIEV4dGVuZGVkIENJUyByZWdpc3RlcnMgZm9yIFNlcmllcyAyIGFuZCAyKyBjYXJkcyAqLwotLyogVGhlIHJlZ2lzdGVycyBhcmUgYWxsIG9mZnNldHMgZnJvbSAweDQwMDAgKi8KLSNkZWZpbmUgQ0lTUkVHX0NTUgkJMHgwMTAwCi0jZGVmaW5lIENJU1JFR19XUAkJMHgwMTA0Ci0jZGVmaW5lIENJU1JFR19SRFlCU1kJCTB4MDE0MAotCi0vKiBFeHRlbmRlZCBDSVMgcmVnaXN0ZXJzIGZvciBTZXJpZXMgMiBjYXJkcyAqLwotI2RlZmluZSBDSVNSRUdfU0xFRVAJCTB4MDExOAotI2RlZmluZSBDSVNSRUdfUkRZX01BU0sJCTB4MDEyMAotI2RlZmluZSBDSVNSRUdfUkRZX1NUQVRVUwkweDAxMzAKLQotLyogRXh0ZW5kZWQgQ0lTIHJlZ2lzdGVycyBmb3IgU2VyaWVzIDIrIGNhcmRzICovCi0jZGVmaW5lIENJU1JFR19WQ1IJCTB4MDEwYwotCi0vKiBDYXJkIFN0YXR1cyBSZWdpc3RlciAqLwotI2RlZmluZSBDU1JfU1JFU0VUCQkweDIwCS8qIFNvZnQgcmVzZXQgKi8KLSNkZWZpbmUgQ1NSX0NNV1AJCTB4MTAJLyogQ29tbW9uIG1lbW9yeSB3cml0ZSBwcm90ZWN0ICovCi0jZGVmaW5lIENTUl9QV1JET1dOCQkweDA4CS8qIFBvd2VyIGRvd24gc3RhdHVzICovCi0jZGVmaW5lIENTUl9DSVNXUAkJMHgwNAkvKiBDb21tb24gbWVtb3J5IENJUyBXUCAqLwotI2RlZmluZSBDU1JfV1AJCQkweDAyCS8qIE1lY2hhbmljYWwgd3JpdGUgcHJvdGVjdCAqLwotI2RlZmluZSBDU1JfUkVBRFkJCTB4MDEJLyogUmVhZHkvYnVzeSBzdGF0dXMgKi8KLQotLyogV3JpdGUgUHJvdGVjdGlvbiBSZWdpc3RlciAqLwotI2RlZmluZSBXUF9CTEtFTgkJMHgwNAkvKiBFbmFibGUgYmxvY2sgbG9ja2luZyAqLwotI2RlZmluZSBXUF9DTVdQCQkJMHgwMgkvKiBDb21tb24gbWVtb3J5IHdyaXRlIHByb3RlY3QgKi8KLSNkZWZpbmUgV1BfQ0lTV1AJCTB4MDEJLyogQ29tbW9uIG1lbW9yeSBDSVMgV1AgKi8KLQotLyogVm9sdGFnZSBDb250cm9sIFJlZ2lzdGVyICovCi0jZGVmaW5lIFZDUl9WQ0NfTEVWRUwJCTB4ODAJLyogMCA9IDVWLCAxID0gMy4zViAqLwotI2RlZmluZSBWQ1JfVlBQX1ZBTElECQkweDAyCS8qIFZwcCBWYWxpZCAqLwotI2RlZmluZSBWQ1JfVlBQX0dFTgkJMHgwMQkvKiBJbnRlZ3JhdGVkIFZwcCBnZW5lcmF0b3IgKi8KLQotLyogUmVhZHkvQnVzeSBNb2RlIFJlZ2lzdGVyICovCi0jZGVmaW5lIFJEWUJTWV9SQUNLCQkweDAyCS8qIFJlYWR5IGFja25vd2xlZGdlICovCi0jZGVmaW5lIFJEWUJTWV9NT0RFCQkweDAxCS8qIDEgPSBoaWdoIHBlcmZvcm1hbmNlICovCi0KLSNkZWZpbmUgTE9XKHgpICgoeCkgJiAweGZmKQotCi0vKiAyOEYwMDhTQS1Db21wYXRpYmxlIENvbW1hbmQgU2V0ICovCi0jZGVmaW5lIElGX1JFQURfQVJSQVkJCTB4ZmZmZgotI2RlZmluZSBJRl9JTlRFTF9JRAkJMHg5MDkwCi0jZGVmaW5lIElGX1JFQURfQ1NSCQkweDcwNzAKLSNkZWZpbmUgSUZfQ0xFQVJfQ1NSCQkweDUwNTAKLSNkZWZpbmUgSUZfV1JJVEUJCTB4NDA0MAotI2RlZmluZSBJRl9CTE9DS19FUkFTRQkJMHgyMDIwCi0jZGVmaW5lIElGX0VSQVNFX1NVU1BFTkQJMHhiMGIwCi0jZGVmaW5lIElGX0NPTkZJUk0JCTB4ZDBkMAotCi0vKiAyOEYwMTZTQSBQZXJmb3JtYW5jZSBFbmhhbmNlbWVudCBDb21tYW5kcyAqLwotI2RlZmluZSBJRl9SRUFEX1BBR0UJCTB4NzU3NQotI2RlZmluZSBJRl9QQUdFX1NXQVAJCTB4NzI3MgotI2RlZmluZSBJRl9TSU5HTEVfTE9BRAkJMHg3NDc0Ci0jZGVmaW5lIElGX1NFUV9MT0FECQkweGUwZTAKLSNkZWZpbmUgSUZfUEFHRV9XUklURQkJMHgwYzBjCi0jZGVmaW5lIElGX1JEWV9NT0RFCQkweDk2OTYKLSNkZWZpbmUgSUZfUkRZX0xFVkVMCQkweDAxMDEKLSNkZWZpbmUgSUZfUkRZX1BVTFNFX1dSSVRFCTB4MDIwMgotI2RlZmluZSBJRl9SRFlfUFVMU0VfRVJBU0UJMHgwMzAzCi0jZGVmaW5lIElGX1JEWV9ESVNBQkxFCQkweDA0MDQKLSNkZWZpbmUgSUZfTE9DS19CTE9DSwkJMHg3Nzc3Ci0jZGVmaW5lIElGX1VQTE9BRF9TVEFUVVMJMHg5Nzk3Ci0jZGVmaW5lIElGX1JFQURfRVNSCQkweDcxNzEKLSNkZWZpbmUgSUZfRVJBU0VfVU5MT0NLRUQJMHhhN2E3Ci0jZGVmaW5lIElGX1NMRUVQCQkweGYwZjAKLSNkZWZpbmUgSUZfQUJPUlQJCTB4ODA4MAotI2RlZmluZSBJRl9VUExPQURfREVWSU5GTwkweDk5OTkKLQotLyogRGVmaW5pdGlvbnMgZm9yIENvbXBhdGlibGUgU3RhdHVzIFJlZ2lzdGVyICovCi0jZGVmaW5lIENTUl9XUl9SRUFEWQkJMHg4MDgwCS8qIFdyaXRlIHN0YXRlIG1hY2hpbmUgc3RhdHVzICovCi0jZGVmaW5lIENTUl9FUkFfU1VTUEVORAkJMHg0MDQwCS8qIEVyYXNlIHN1c3BlbmQgc3RhdHVzICovCi0jZGVmaW5lIENTUl9FUkFfRVJSCQkweDIwMjAJLyogRXJhc2Ugc3RhdHVzICovCi0jZGVmaW5lIENTUl9XUl9FUlIJCTB4MTAxMAkvKiBEYXRhIHdyaXRlIHN0YXR1cyAqLwotI2RlZmluZSBDU1JfVlBQX0xPVwkJMHgwODA4CS8qIFZwcCBzdGF0dXMgKi8KLQotLyogRGVmaW5pdGlvbnMgZm9yIEdsb2JhbCBTdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgR1NSX1dSX1JFQURZCQkweDgwODAJLyogV3JpdGUgc3RhdGUgbWFjaGluZSBzdGF0dXMgKi8KLSNkZWZpbmUgR1NSX09QX1NVU1BFTkQJCTB4NDA0MAkvKiBPcGVyYXRpb24gc3VzcGVuZCBzdGF0dXMgKi8KLSNkZWZpbmUgR1NSX09QX0VSUgkJMHgyMDIwCS8qIERldmljZSBvcGVyYXRpb24gc3RhdHVzICovCi0jZGVmaW5lIEdTUl9TTEVFUAkJMHgxMDEwCS8qIERldmljZSBzbGVlcCBzdGF0dXMgKi8KLSNkZWZpbmUgR1NSX1FVRVVFX0ZVTEwJCTB4MDgwOAkvKiBRdWV1ZSBzdGF0dXMgKi8KLSNkZWZpbmUgR1NSX1BBR0VfQVZBSUwJCTB4MDQwNAkvKiBQYWdlIGJ1ZmZlciBhdmFpbGFibGUgc3RhdHVzICovCi0jZGVmaW5lIEdTUl9QQUdFX1JFQURZCQkweDAyMDIJLyogUGFnZSBidWZmZXIgc3RhdHVzICovCi0jZGVmaW5lIEdTUl9QQUdFX1NFTEVDVAkJMHgwMTAxCS8qIFBhZ2UgYnVmZmVyIHNlbGVjdCBzdGF0dXMgKi8KLQotLyogRGVmaW5pdGlvbnMgZm9yIEJsb2NrIFN0YXR1cyBSZWdpc3RlciAqLwotI2RlZmluZSBCU1JfUkVBRFkJCTB4ODA4MAkvKiBCbG9jayBzdGF0dXMgKi8KLSNkZWZpbmUgQlNSX1VOTE9DSwkJMHg0MDQwCS8qIEJsb2NrIGxvY2sgc3RhdHVzICovCi0jZGVmaW5lIEJTUl9GQUlMRUQJCTB4MjAyMAkvKiBCbG9jayBvcGVyYXRpb24gc3RhdHVzICovCi0jZGVmaW5lIEJTUl9BQk9SVEVECQkweDEwMTAJLyogT3BlcmF0aW9uIGFib3J0IHN0YXR1cyAqLwotI2RlZmluZSBCU1JfUVVFVUVfRlVMTAkJMHgwODA4CS8qIFF1ZXVlIHN0YXR1cyAqLwotI2RlZmluZSBCU1JfVlBQX0xPVwkJMHgwNDA0CS8qIFZwcCBzdGF0dXMgKi8KLQotI2VuZGlmIC8qIF9fTVREX0lGTEFTSF9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbXRkL210ZC5oIGIvaW5jbHVkZS9saW51eC9tdGQvbXRkLmgKaW5kZXggM2Q5NTZjM2EuLjQ1ZDQ4MmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbXRkL210ZC5oCisrKyBiL2luY2x1ZGUvbGludXgvbXRkL210ZC5oCkBAIC01Myw2ICs1Myw3IEBACiAJdV9pbnQzMl90IG9mZnNldDsJCQkvKiBBdCB3aGljaCB0aGlzIHJlZ2lvbiBzdGFydHMsIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgTVREICovCiAJdV9pbnQzMl90IGVyYXNlc2l6ZTsJCS8qIEZvciB0aGlzIHJlZ2lvbiAqLwogCXVfaW50MzJfdCBudW1ibG9ja3M7CQkvKiBOdW1iZXIgb2YgYmxvY2tzIG9mIGVyYXNlc2l6ZSBpbiB0aGlzIHJlZ2lvbiAqLworCXVuc2lnbmVkIGxvbmcgKmxvY2ttYXA7CQkvKiBJZiBrZWVwaW5nIGJpdG1hcCBvZiBsb2NrcyAqLwogfTsKIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbXRkL25hbmQuaCBiL2luY2x1ZGUvbGludXgvbXRkL25hbmQuaAppbmRleCA5NzUyMzg4Li5jZjE5N2FkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L210ZC9uYW5kLmgKKysrIGIvaW5jbHVkZS9saW51eC9tdGQvbmFuZC5oCkBAIC00MzEsNiArNDMxLDcgQEAKICNkZWZpbmUgTkFORF9NRlJfUkVORVNBUwkweDA3CiAjZGVmaW5lIE5BTkRfTUZSX1NUTUlDUk8JMHgyMAogI2RlZmluZSBOQU5EX01GUl9IWU5JWAkJMHhhZAorI2RlZmluZSBOQU5EX01GUl9NSUNST04JCTB4MmMKIAogLyoqCiAgKiBzdHJ1Y3QgbmFuZF9mbGFzaF9kZXYgLSBOQU5EIEZsYXNoIERldmljZSBJRCBTdHJ1Y3R1cmUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbXRkL3ViaS5oIGIvaW5jbHVkZS9saW51eC9tdGQvdWJpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q5NjdiNgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbXRkL3ViaS5oCkBAIC0wLDAgKzEsMjAyIEBACisvKgorICogQ29weXJpZ2h0IChjKSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuLCAyMDA2CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZQorICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqIEF1dGhvcjogQXJ0ZW0gQml0eXV0c2tpeSAo0JHQuNGC0Y7RhtC60LjQuSDQkNGA0YLRkdC8KQorICovCisKKyNpZm5kZWYgX19MSU5VWF9VQklfSF9fCisjZGVmaW5lIF9fTElOVVhfVUJJX0hfXworCisjaW5jbHVkZSA8YXNtL2lvY3RsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxtdGQvdWJpLXVzZXIuaD4KKworLyoKKyAqIFVCSSBkYXRhIHR5cGUgaGludCBjb25zdGFudHMuCisgKgorICogVUJJX0xPTkdURVJNOiBsb25nLXRlcm0gZGF0YQorICogVUJJX1NIT1JUVEVSTTogc2hvcnQtdGVybSBkYXRhCisgKiBVQklfVU5LTk9XTjogZGF0YSBwZXJzaXN0ZW5jZSBpcyB1bmtub3duCisgKgorICogVGhlc2UgY29uc3RhbnRzIGFyZSB1c2VkIHdoZW4gZGF0YSBpcyB3cml0dGVuIHRvIFVCSSB2b2x1bWVzIGluIG9yZGVyIHRvCisgKiBoZWxwIHRoZSBVQkkgd2Vhci1sZXZlbGluZyB1bml0IHRvIGZpbmQgbW9yZSBhcHByb3ByaWF0ZSBwaHlzaWNhbAorICogZXJhc2VibG9ja3MuCisgKi8KK2VudW0geworCVVCSV9MT05HVEVSTSA9IDEsCisJVUJJX1NIT1JUVEVSTSwKKwlVQklfVU5LTk9XTgorfTsKKworLyoKKyAqIGVudW0gdWJpX29wZW5fbW9kZSAtIFVCSSB2b2x1bWUgb3BlbiBtb2RlIGNvbnN0YW50cy4KKyAqCisgKiBVQklfUkVBRE9OTFk6IHJlYWQtb25seSBtb2RlCisgKiBVQklfUkVBRFdSSVRFOiByZWFkLXdyaXRlIG1vZGUKKyAqIFVCSV9FWENMVVNJVkU6IGV4Y2x1c2l2ZSBtb2RlCisgKi8KK2VudW0geworCVVCSV9SRUFET05MWSA9IDEsCisJVUJJX1JFQURXUklURSwKKwlVQklfRVhDTFVTSVZFCit9OworCisvKioKKyAqIHN0cnVjdCB1Ymlfdm9sdW1lX2luZm8gLSBVQkkgdm9sdW1lIGRlc2NyaXB0aW9uIGRhdGEgc3RydWN0dXJlLgorICogQHZvbF9pZDogdm9sdW1lIElECisgKiBAdWJpX251bTogVUJJIGRldmljZSBudW1iZXIgdGhpcyB2b2x1bWUgYmVsb25ncyB0bworICogQHNpemU6IGhvdyBtYW55IHBoeXNpY2FsIGVyYXNlYmxvY2tzIGFyZSByZXNlcnZlZCBmb3IgdGhpcyB2b2x1bWUKKyAqIEB1c2VkX2J5dGVzOiBob3cgbWFueSBieXRlcyBvZiBkYXRhIHRoaXMgdm9sdW1lIGNvbnRhaW5zCisgKiBAdXNlZF9lYnM6IGhvdyBtYW55IHBoeXNpY2FsIGVyYXNlYmxvY2tzIG9mIHRoaXMgdm9sdW1lIGFjdHVhbGx5IGNvbnRhaW4gYW55CisgKiBkYXRhCisgKiBAdm9sX3R5cGU6IHZvbHVtZSB0eXBlICglVUJJX0RZTkFNSUNfVk9MVU1FIG9yICVVQklfU1RBVElDX1ZPTFVNRSkKKyAqIEBjb3JydXB0ZWQ6IG5vbi16ZXJvIGlmIHRoZSB2b2x1bWUgaXMgY29ycnVwdGVkIChzdGF0aWMgdm9sdW1lcyBvbmx5KQorICogQHVwZF9tYXJrZXI6IG5vbi16ZXJvIGlmIHRoZSB2b2x1bWUgaGFzIHVwZGF0ZSBtYXJrZXIgc2V0CisgKiBAYWxpZ25tZW50OiB2b2x1bWUgYWxpZ25tZW50CisgKiBAdXNhYmxlX2xlYl9zaXplOiBob3cgbWFueSBieXRlcyBhcmUgYXZhaWxhYmxlIGluIGxvZ2ljYWwgZXJhc2VibG9ja3Mgb2YKKyAqIHRoaXMgdm9sdW1lCisgKiBAbmFtZV9sZW46IHZvbHVtZSBuYW1lIGxlbmd0aAorICogQG5hbWU6IHZvbHVtZSBuYW1lCisgKiBAY2RldjogVUJJIHZvbHVtZSBjaGFyYWN0ZXIgZGV2aWNlIG1ham9yIGFuZCBtaW5vciBudW1iZXJzCisgKgorICogVGhlIEBjb3JydXB0ZWQgZmxhZyBpcyBvbmx5IHJlbGV2YW50IHRvIHN0YXRpYyB2b2x1bWVzIGFuZCBpcyBhbHdheXMgemVybworICogZm9yIGR5bmFtaWMgb25lcy4gVGhpcyBpcyBiZWNhdXNlIFVCSSBkb2VzIG5vdCBjYXJlIGFib3V0IGR5bmFtaWMgdm9sdW1lCisgKiBkYXRhIHByb3RlY3Rpb24gYW5kIG9ubHkgY2FyZXMgYWJvdXQgcHJvdGVjdGluZyBzdGF0aWMgdm9sdW1lIGRhdGEuCisgKgorICogVGhlIEB1cGRfbWFya2VyIGZsYWcgaXMgc2V0IGlmIHRoZSB2b2x1bWUgdXBkYXRlIG9wZXJhdGlvbiB3YXMgaW50ZXJydXB0ZWQuCisgKiBCZWZvcmUgdG91Y2hpbmcgdGhlIHZvbHVtZSBkYXRhIGR1cmluZyB0aGUgdXBkYXRlIG9wZXJhdGlvbiwgVUJJIGZpcnN0IHNldHMKKyAqIHRoZSB1cGRhdGUgbWFya2VyIGZsYWcgZm9yIHRoaXMgdm9sdW1lLiBJZiB0aGUgdm9sdW1lIHVwZGF0ZSBvcGVyYXRpb24gd2FzCisgKiBmdXJ0aGVyIGludGVycnVwdGVkLCB0aGUgdXBkYXRlIG1hcmtlciBpbmRpY2F0ZXMgdGhpcy4gSWYgdGhlIHVwZGF0ZSBtYXJrZXIKKyAqIGlzIHNldCwgdGhlIGNvbnRlbnRzIG9mIHRoZSB2b2x1bWUgaXMgY2VydGFpbmx5IGRhbWFnZWQgYW5kIGEgbmV3IHZvbHVtZQorICogdXBkYXRlIG9wZXJhdGlvbiBoYXMgdG8gYmUgc3RhcnRlZC4KKyAqCisgKiBUbyBwdXQgaXQgZGlmZmVyZW50bHksIEBjb3JydXB0ZWQgYW5kIEB1cGRfbWFya2VyIGZpZWxkcyBoYXZlIGRpZmZlcmVudAorICogc2VtYW50aWNzOgorICogICAgIG8gdGhlIEBjb3JydXB0ZWQgZmxhZyBtZWFucyB0aGF0IHRoaXMgc3RhdGljIHZvbHVtZSBpcyBjb3JydXB0ZWQgZm9yIHNvbWUKKyAqICAgICAgIHJlYXNvbnMsIGJ1dCBub3QgYmVjYXVzZSBhbiBpbnRlcnJ1cHRlZCB2b2x1bWUgdXBkYXRlCisgKiAgICAgbyB0aGUgQHVwZF9tYXJrZXIgZmllbGQgbWVhbnMgdGhhdCB0aGUgdm9sdW1lIGlzIGRhbWFnZWQgYmVjYXVzZSBvZiBhbgorICogICAgICAgaW50ZXJydXB0ZWQgdXBkYXRlIG9wZXJhdGlvbi4KKyAqCisgKiBJLmUuLCB0aGUgQGNvcnJ1cHRlZCBmbGFnIGlzIG5ldmVyIHNldCBpZiB0aGUgQHVwZF9tYXJrZXIgZmxhZyBpcyBzZXQuCisgKgorICogVGhlIEB1c2VkX2J5dGVzIGFuZCBAdXNlZF9lYnMgZmllbGRzIGFyZSBvbmx5IHJlYWxseSBuZWVkZWQgZm9yIHN0YXRpYworICogdm9sdW1lcyBhbmQgY29udGFpbiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHN0b3JlZCBpbiB0aGlzIHN0YXRpYyB2b2x1bWUgYW5kIGhvdworICogbWFueSBlcmFzZWJsb2NrIHRoaXMgZGF0YSBvY2N1cGllcy4gSW4gY2FzZSBvZiBkeW5hbWljIHZvbHVtZXMsIHRoZQorICogQHVzZWRfYnl0ZXMgZmllbGQgaXMgZXF1aXZhbGVudCB0byBAc2l6ZSpAdXNhYmxlX2xlYl9zaXplLCBhbmQgdGhlIEB1c2VkX2VicworICogZmllbGQgaXMgZXF1aXZhbGVudCB0byBAc2l6ZS4KKyAqCisgKiBJbiBnZW5lcmFsLCBsb2dpY2FsIGVyYXNlYmxvY2sgc2l6ZSBpcyBhIHByb3BlcnR5IG9mIHRoZSBVQkkgZGV2aWNlLCBub3QKKyAqIG9mIHRoZSBVQkkgdm9sdW1lLiBJbmRlZWQsIHRoZSBsb2dpY2FsIGVyYXNlYmxvY2sgc2l6ZSBkZXBlbmRzIG9uIHRoZQorICogcGh5c2ljYWwgZXJhc2VibG9jayBzaXplIGFuZCBvbiBob3cgbXVjaCBieXRlcyBVQkkgaGVhZGVycyBjb25zdW1lLiBCdXQKKyAqIGJlY2F1c2Ugb2YgdGhlIHZvbHVtZSBhbGlnbm1lbnQgKEBhbGlnbm1lbnQpLCB0aGUgdXNhYmxlIHNpemUgb2YgbG9naWNhbAorICogZXJhc2VibG9ja3MgaWYgYSB2b2x1bWUgbWF5IGJlIGxlc3MuIFRoZSBmb2xsb3dpbmcgZXF1YXRpb24gaXMgdHJ1ZToKKyAqIAlAdXNhYmxlX2xlYl9zaXplID0gTEVCIHNpemUgLSAoTEVCIHNpemUgbW9kIEBhbGlnbm1lbnQpLAorICogd2hlcmUgTEVCIHNpemUgaXMgdGhlIGxvZ2ljYWwgZXJhc2VibG9jayBzaXplIGRlZmluZWQgYnkgdGhlIFVCSSBkZXZpY2UuCisgKgorICogVGhlIGFsaWdubWVudCBpcyBtdWx0aXBsZSB0byB0aGUgbWluaW1hbCBmbGFzaCBpbnB1dC9vdXRwdXQgdW5pdCBzaXplIG9yICUxCisgKiBpZiBhbGwgdGhlIGF2YWlsYWJsZSBzcGFjZSBpcyB1c2VkLgorICoKKyAqIFRvIHB1dCB0aGlzIGRpZmZlcmVudGx5LCBhbGlnbm1lbnQgbWF5IGJlIGNvbnNpZGVyZWQgaXMgYSB3YXkgdG8gY2hhbmdlCisgKiB2b2x1bWUgbG9naWNhbCBlcmFzZWJsb2NrIHNpemVzLgorICovCitzdHJ1Y3QgdWJpX3ZvbHVtZV9pbmZvIHsKKwlpbnQgdWJpX251bTsKKwlpbnQgdm9sX2lkOworCWludCBzaXplOworCWxvbmcgbG9uZyB1c2VkX2J5dGVzOworCWludCB1c2VkX2ViczsKKwlpbnQgdm9sX3R5cGU7CisJaW50IGNvcnJ1cHRlZDsKKwlpbnQgdXBkX21hcmtlcjsKKwlpbnQgYWxpZ25tZW50OworCWludCB1c2FibGVfbGViX3NpemU7CisJaW50IG5hbWVfbGVuOworCWNvbnN0IGNoYXIgKm5hbWU7CisJZGV2X3QgY2RldjsKK307CisKKy8qKgorICogc3RydWN0IHViaV9kZXZpY2VfaW5mbyAtIFVCSSBkZXZpY2UgZGVzY3JpcHRpb24gZGF0YSBzdHJ1Y3R1cmUuCisgKiBAdWJpX251bTogdWJpIGRldmljZSBudW1iZXIKKyAqIEBsZWJfc2l6ZTogbG9naWNhbCBlcmFzZWJsb2NrIHNpemUgb24gdGhpcyBVQkkgZGV2aWNlCisgKiBAbWluX2lvX3NpemU6IG1pbmltYWwgSS9PIHVuaXQgc2l6ZQorICogQHJvX21vZGU6IGlmIHRoaXMgZGV2aWNlIGlzIGluIHJlYWQtb25seSBtb2RlCisgKiBAY2RldjogVUJJIGNoYXJhY3RlciBkZXZpY2UgbWFqb3IgYW5kIG1pbm9yIG51bWJlcnMKKyAqCisgKiBOb3RlLCBAbGViX3NpemUgaXMgdGhlIGxvZ2ljYWwgZXJhc2VibG9jayBzaXplIG9mZmVyZWQgYnkgdGhlIFVCSSBkZXZpY2UuCisgKiBWb2x1bWVzIG9mIHRoaXMgVUJJIGRldmljZSBtYXkgaGF2ZSBzbWFsbGVyIGxvZ2ljYWwgZXJhc2VibG9jayBzaXplIGlmIHRoZWlyCisgKiBhbGlnbm1lbnQgaXMgbm90IGVxdWl2YWxlbnQgdG8gJTEuCisgKi8KK3N0cnVjdCB1YmlfZGV2aWNlX2luZm8geworCWludCB1YmlfbnVtOworCWludCBsZWJfc2l6ZTsKKwlpbnQgbWluX2lvX3NpemU7CisJaW50IHJvX21vZGU7CisJZGV2X3QgY2RldjsKK307CisKKy8qIFVCSSBkZXNjcmlwdG9yIGdpdmVuIHRvIHVzZXJzIHdoZW4gdGhleSBvcGVuIFVCSSB2b2x1bWVzICovCitzdHJ1Y3QgdWJpX3ZvbHVtZV9kZXNjOworCitpbnQgdWJpX2dldF9kZXZpY2VfaW5mbyhpbnQgdWJpX251bSwgc3RydWN0IHViaV9kZXZpY2VfaW5mbyAqZGkpOwordm9pZCB1YmlfZ2V0X3ZvbHVtZV9pbmZvKHN0cnVjdCB1Ymlfdm9sdW1lX2Rlc2MgKmRlc2MsCisJCQkgc3RydWN0IHViaV92b2x1bWVfaW5mbyAqdmkpOworc3RydWN0IHViaV92b2x1bWVfZGVzYyAqdWJpX29wZW5fdm9sdW1lKGludCB1YmlfbnVtLCBpbnQgdm9sX2lkLCBpbnQgbW9kZSk7CitzdHJ1Y3QgdWJpX3ZvbHVtZV9kZXNjICp1Ymlfb3Blbl92b2x1bWVfbm0oaW50IHViaV9udW0sIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJCSAgIGludCBtb2RlKTsKK3ZvaWQgdWJpX2Nsb3NlX3ZvbHVtZShzdHJ1Y3QgdWJpX3ZvbHVtZV9kZXNjICpkZXNjKTsKK2ludCB1YmlfbGViX3JlYWQoc3RydWN0IHViaV92b2x1bWVfZGVzYyAqZGVzYywgaW50IGxudW0sIGNoYXIgKmJ1ZiwgaW50IG9mZnNldCwKKwkJIGludCBsZW4sIGludCBjaGVjayk7CitpbnQgdWJpX2xlYl93cml0ZShzdHJ1Y3QgdWJpX3ZvbHVtZV9kZXNjICpkZXNjLCBpbnQgbG51bSwgY29uc3Qgdm9pZCAqYnVmLAorCQkgIGludCBvZmZzZXQsIGludCBsZW4sIGludCBkdHlwZSk7CitpbnQgdWJpX2xlYl9jaGFuZ2Uoc3RydWN0IHViaV92b2x1bWVfZGVzYyAqZGVzYywgaW50IGxudW0sIGNvbnN0IHZvaWQgKmJ1ZiwKKwkJICAgaW50IGxlbiwgaW50IGR0eXBlKTsKK2ludCB1YmlfbGViX2VyYXNlKHN0cnVjdCB1Ymlfdm9sdW1lX2Rlc2MgKmRlc2MsIGludCBsbnVtKTsKK2ludCB1YmlfbGViX3VubWFwKHN0cnVjdCB1Ymlfdm9sdW1lX2Rlc2MgKmRlc2MsIGludCBsbnVtKTsKK2ludCB1YmlfaXNfbWFwcGVkKHN0cnVjdCB1Ymlfdm9sdW1lX2Rlc2MgKmRlc2MsIGludCBsbnVtKTsKKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdGhlIHNhbWUgYXMgdGhlICd1YmlfbGViX3JlYWQoKScgZnVuY3Rpb24sIGJ1dCBpdCBkb2VzIG5vdAorICogcHJvdmlkZSB0aGUgY2hlY2tpbmcgY2FwYWJpbGl0eS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgdWJpX3JlYWQoc3RydWN0IHViaV92b2x1bWVfZGVzYyAqZGVzYywgaW50IGxudW0sIGNoYXIgKmJ1ZiwKKwkJCSAgIGludCBvZmZzZXQsIGludCBsZW4pCit7CisJcmV0dXJuIHViaV9sZWJfcmVhZChkZXNjLCBsbnVtLCBidWYsIG9mZnNldCwgbGVuLCAwKTsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdGhlIHNhbWUgYXMgdGhlICd1YmlfbGViX3dyaXRlKCknIGZ1bmN0aW9ucywgYnV0IGl0IGRvZXMKKyAqIG5vdCBoYXZlIHRoZSBkYXRhIHR5cGUgYXJndW1lbnQuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHViaV93cml0ZShzdHJ1Y3QgdWJpX3ZvbHVtZV9kZXNjICpkZXNjLCBpbnQgbG51bSwKKwkJCSAgICBjb25zdCB2b2lkICpidWYsIGludCBvZmZzZXQsIGludCBsZW4pCit7CisJcmV0dXJuIHViaV9sZWJfd3JpdGUoZGVzYywgbG51bSwgYnVmLCBvZmZzZXQsIGxlbiwgVUJJX1VOS05PV04pOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyB0aGUgc2FtZSBhcyB0aGUgJ3ViaV9sZWJfY2hhbmdlKCknIGZ1bmN0aW9ucywgYnV0IGl0IGRvZXMKKyAqIG5vdCBoYXZlIHRoZSBkYXRhIHR5cGUgYXJndW1lbnQuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHViaV9jaGFuZ2Uoc3RydWN0IHViaV92b2x1bWVfZGVzYyAqZGVzYywgaW50IGxudW0sCisJCQkJICAgIGNvbnN0IHZvaWQgKmJ1ZiwgaW50IGxlbikKK3sKKwlyZXR1cm4gdWJpX2xlYl9jaGFuZ2UoZGVzYywgbG51bSwgYnVmLCBsZW4sIFVCSV9VTktOT1dOKTsKK30KKworI2VuZGlmIC8qICFfX0xJTlVYX1VCSV9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmFtZWkuaCBiL2luY2x1ZGUvbGludXgvbmFtZWkuaAppbmRleCBkMzlhNWE2Li5iN2RkMjQ5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25hbWVpLmgKKysrIGIvaW5jbHVkZS9saW51eC9uYW1laS5oCkBAIC04Miw2ICs4Miw3IEBACiBleHRlcm4gdm9pZCByZWxlYXNlX29wZW5faW50ZW50KHN0cnVjdCBuYW1laWRhdGEgKik7CiAKIGV4dGVybiBzdHJ1Y3QgZGVudHJ5ICogbG9va3VwX29uZV9sZW4oY29uc3QgY2hhciAqLCBzdHJ1Y3QgZGVudHJ5ICosIGludCk7CitleHRlcm4gc3RydWN0IGRlbnRyeSAqbG9va3VwX29uZV9sZW5fa2Vybihjb25zdCBjaGFyICosIHN0cnVjdCBkZW50cnkgKiwgaW50KTsKIAogZXh0ZXJuIGludCBmb2xsb3dfZG93bihzdHJ1Y3QgdmZzbW91bnQgKiosIHN0cnVjdCBkZW50cnkgKiopOwogZXh0ZXJuIGludCBmb2xsb3dfdXAoc3RydWN0IHZmc21vdW50ICoqLCBzdHJ1Y3QgZGVudHJ5ICoqKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0LmggYi9pbmNsdWRlL2xpbnV4L25ldC5oCmluZGV4IDRkYjIxZTYuLmVmYzQ1MTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0LmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXQuaApAQCAtMjQsNyArMjQsNyBAQAogc3RydWN0IHBvbGxfdGFibGVfc3RydWN0Owogc3RydWN0IGlub2RlOwogCi0jZGVmaW5lIE5QUk9UTwkJMzMJCS8qIHNob3VsZCBiZSBlbm91Z2ggZm9yIG5vdy4uCSovCisjZGVmaW5lIE5QUk9UTwkJMzQJCS8qIHNob3VsZCBiZSBlbm91Z2ggZm9yIG5vdy4uCSovCiAKICNkZWZpbmUgU1lTX1NPQ0tFVAkxCQkvKiBzeXNfc29ja2V0KDIpCQkqLwogI2RlZmluZSBTWVNfQklORAkyCQkvKiBzeXNfYmluZCgyKQkJCSovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGRldmljZS5oIGIvaW5jbHVkZS9saW51eC9uZXRkZXZpY2UuaAppbmRleCAxYTUyODU0Li5hYzBjOTJiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGRldmljZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZGV2aWNlLmgKQEAgLTQyLDYgKzQyLDggQEAKIHN0cnVjdCB2bGFuX2dyb3VwOwogc3RydWN0IGV0aHRvb2xfb3BzOwogc3RydWN0IG5ldHBvbGxfaW5mbzsKKy8qIDgwMi4xMSBzcGVjaWZpYyAqLworc3RydWN0IHdpcmVsZXNzX2RldjsKIAkJCQkJLyogc291cmNlIGJhY2stY29tcGF0IGhvb2tzICovCiAjZGVmaW5lIFNFVF9FVEhUT09MX09QUyhuZXRkZXYsb3BzKSBcCiAJKCAobmV0ZGV2KS0+ZXRodG9vbF9vcHMgPSAob3BzKSApCkBAIC0zNDcsMTMgKzM0OSwxNSBAQAogCiAKIAlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyogKCpnZXRfc3RhdHMpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzCXN0YXRzOwogCisjaWZkZWYgQ09ORklHX1dJUkVMRVNTX0VYVAogCS8qIExpc3Qgb2YgZnVuY3Rpb25zIHRvIGhhbmRsZSBXaXJlbGVzcyBFeHRlbnNpb25zIChpbnN0ZWFkIG9mIGlvY3RsKS4KIAkgKiBTZWUgPG5ldC9pd19oYW5kbGVyLmg+IGZvciBkZXRhaWxzLiBKZWFuIElJICovCiAJY29uc3Qgc3RydWN0IGl3X2hhbmRsZXJfZGVmICoJd2lyZWxlc3NfaGFuZGxlcnM7CiAJLyogSW5zdGFuY2UgZGF0YSBtYW5hZ2VkIGJ5IHRoZSBjb3JlIG9mIFdpcmVsZXNzIEV4dGVuc2lvbnMuICovCiAJc3RydWN0IGl3X3B1YmxpY19kYXRhICoJd2lyZWxlc3NfZGF0YTsKLQorI2VuZGlmCiAJY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzICpldGh0b29sX29wczsKIAogCS8qCkBAIC0zOTgsNiArNDAyLDggQEAKIAl2b2lkICAgICAgICAgICAgICAgICAgICAqaXA2X3B0cjsgICAgICAgLyogSVB2NiBzcGVjaWZpYyBkYXRhICovCiAJdm9pZAkJCSplY19wdHI7CS8qIEVjb25ldCBzcGVjaWZpYyBkYXRhCSovCiAJdm9pZAkJCSpheDI1X3B0cjsJLyogQVguMjUgc3BlY2lmaWMgZGF0YSAqLworCXN0cnVjdCB3aXJlbGVzc19kZXYJKmllZWU4MDIxMV9wdHI7CS8qIElFRUUgODAyLjExIHNwZWNpZmljIGRhdGEsCisJCQkJCQkgICBhc3NpZ24gYmVmb3JlIHJlZ2lzdGVyaW5nICovCiAKIC8qCiAgKiBDYWNoZSBsaW5lIG1vc3RseSB1c2VkIG9uIHJlY2VpdmUgcGF0aCAoaW5jbHVkaW5nIGV0aF90eXBlX3RyYW5zKCkpCkBAIC02NDcsOCArNjUzLDEwIEBACiBzdGF0aWMgaW5saW5lIHZvaWQgbmV0aWZfd2FrZV9xdWV1ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogI2lmZGVmIENPTkZJR19ORVRQT0xMX1RSQVAKLQlpZiAobmV0cG9sbF90cmFwKCkpCisJaWYgKG5ldHBvbGxfdHJhcCgpKSB7CisJCWNsZWFyX2JpdChfX0xJTktfU1RBVEVfWE9GRiwgJmRldi0+c3RhdGUpOwogCQlyZXR1cm47CisJfQogI2VuZGlmCiAJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChfX0xJTktfU1RBVEVfWE9GRiwgJmRldi0+c3RhdGUpKQogCQlfX25ldGlmX3NjaGVkdWxlKGRldik7CkBAIC02NTYsMTAgKzY2NCw2IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBuZXRpZl9zdG9wX3F1ZXVlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0jaWZkZWYgQ09ORklHX05FVFBPTExfVFJBUAotCWlmIChuZXRwb2xsX3RyYXAoKSkKLQkJcmV0dXJuOwotI2VuZGlmCiAJc2V0X2JpdChfX0xJTktfU1RBVEVfWE9GRiwgJmRldi0+c3RhdGUpOwogfQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIuaAppbmRleCA3MGQzYjRmLi4xMGI1YzYyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyLmgKQEAgLTI4MSw5ICsyODEsNiBAQAogCQkJc3RydWN0IG5mX2luZm8gKmluZm8sCiAJCQl1bnNpZ25lZCBpbnQgdmVyZGljdCk7CiAKLWV4dGVybiB2b2lkICgqaXBfY3RfYXR0YWNoKShzdHJ1Y3Qgc2tfYnVmZiAqLCBzdHJ1Y3Qgc2tfYnVmZiAqKTsKLWV4dGVybiB2b2lkIG5mX2N0X2F0dGFjaChzdHJ1Y3Qgc2tfYnVmZiAqLCBzdHJ1Y3Qgc2tfYnVmZiAqKTsKLQogLyogRklYTUU6IEJlZm9yZSBjYWNoZSBpcyBldmVyIHVzZWQsIHRoaXMgbXVzdCBiZSBpbXBsZW1lbnRlZCBmb3IgcmVhbC4gKi8KIGV4dGVybiB2b2lkIG5mX2ludmFsaWRhdGVfY2FjaGUoaW50IHBmKTsKIApAQCAtMzg4LDExICszODUsMTggQEAKIHsKIAlyZXR1cm4gMTsKIH0KLXN0YXRpYyBpbmxpbmUgdm9pZCBuZl9jdF9hdHRhY2goc3RydWN0IHNrX2J1ZmYgKm5ldywgc3RydWN0IHNrX2J1ZmYgKnNrYikge30KIHN0cnVjdCBmbG93aTsKIHN0YXRpYyBpbmxpbmUgdm9pZAogbmZfbmF0X2RlY29kZV9zZXNzaW9uKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBmbG93aSAqZmwsIGludCBmYW1pbHkpIHt9CiAjZW5kaWYgLypDT05GSUdfTkVURklMVEVSKi8KIAorI2lmIGRlZmluZWQoQ09ORklHX05GX0NPTk5UUkFDSykgfHwgZGVmaW5lZChDT05GSUdfTkZfQ09OTlRSQUNLX01PRFVMRSkKK2V4dGVybiB2b2lkICgqaXBfY3RfYXR0YWNoKShzdHJ1Y3Qgc2tfYnVmZiAqLCBzdHJ1Y3Qgc2tfYnVmZiAqKTsKK2V4dGVybiB2b2lkIG5mX2N0X2F0dGFjaChzdHJ1Y3Qgc2tfYnVmZiAqLCBzdHJ1Y3Qgc2tfYnVmZiAqKTsKK2V4dGVybiB2b2lkICgqbmZfY3RfZGVzdHJveSkoc3RydWN0IG5mX2Nvbm50cmFjayAqKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgbmZfY3RfYXR0YWNoKHN0cnVjdCBza19idWZmICpuZXcsIHN0cnVjdCBza19idWZmICpza2IpIHt9CisjZW5kaWYKKwogI2VuZGlmIC8qX19LRVJORUxfXyovCiAjZW5kaWYgLypfX0xJTlVYX05FVEZJTFRFUl9IKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja190Y3AuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja190Y3AuaAppbmRleCAwMDdhZjRjLi4yMmNlMjk5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfdGNwLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3RjcC5oCkBAIC0zMCw2ICszMCwxMSBAQAogLyogQmUgbGliZXJhbCBpbiB3aW5kb3cgY2hlY2tpbmcgKi8KICNkZWZpbmUgSVBfQ1RfVENQX0ZMQUdfQkVfTElCRVJBTAkJMHgwOAogCitzdHJ1Y3QgbmZfY3RfdGNwX2ZsYWdzIHsKKwl1X2ludDhfdCBmbGFnczsKKwl1X2ludDhfdCBtYXNrOworfTsKKwogI2lmZGVmIF9fS0VSTkVMX18KIAogc3RydWN0IGlwX2N0X3RjcF9zdGF0ZSB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZm5ldGxpbmsuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mbmV0bGluay5oCmluZGV4IDFlOWM4MjEuLjBmOTMxMWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mbmV0bGluay5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mbmV0bGluay5oCkBAIC02MiwxMSArNjIsMTEgQEAKICNkZWZpbmUgTkZBX0RBVEEobmZhKSAgICgodm9pZCAqKSgoKGNoYXIgKikobmZhKSkgKyBORkFfTEVOR1RIKDApKSkKICNkZWZpbmUgTkZBX1BBWUxPQUQobmZhKSAoKGludCkoKG5mYSktPm5mYV9sZW4pIC0gTkZBX0xFTkdUSCgwKSkKICNkZWZpbmUgTkZBX05FU1Qoc2tiLCB0eXBlKSBcCi0oewlzdHJ1Y3QgbmZhdHRyICpfX3N0YXJ0ID0gKHN0cnVjdCBuZmF0dHIgKikgKHNrYiktPnRhaWw7IFwKKyh7CXN0cnVjdCBuZmF0dHIgKl9fc3RhcnQgPSAoc3RydWN0IG5mYXR0ciAqKXNrYl90YWlsX3BvaW50ZXIoc2tiKTsgXAogCU5GQV9QVVQoc2tiLCAoTkZOTF9ORkFfTkVTVCB8IHR5cGUpLCAwLCBOVUxMKTsgXAogCV9fc3RhcnQ7ICB9KQogI2RlZmluZSBORkFfTkVTVF9FTkQoc2tiLCBzdGFydCkgXAotKHsgICAgICAoc3RhcnQpLT5uZmFfbGVuID0gKChza2IpLT50YWlsIC0gKHVuc2lnbmVkIGNoYXIgKikgKHN0YXJ0KSk7IFwKKyh7ICAgICAgKHN0YXJ0KS0+bmZhX2xlbiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKSAtICh1bnNpZ25lZCBjaGFyICopKHN0YXJ0KTsgXAogICAgICAgICAoc2tiKS0+bGVuOyB9KQogI2RlZmluZSBORkFfTkVTVF9DQU5DRUwoc2tiLCBzdGFydCkgXAogKHsgICAgICBpZiAoc3RhcnQpIFwKQEAgLTExMSw3ICsxMTEsNyBAQAogc3RydWN0IG5mbmxfY2FsbGJhY2sKIHsKIAlpbnQgKCpjYWxsKShzdHJ1Y3Qgc29jayAqbmwsIHN0cnVjdCBza19idWZmICpza2IsIAotCQlzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgc3RydWN0IG5mYXR0ciAqY2RhW10sIGludCAqZXJycCk7CisJCXN0cnVjdCBubG1zZ2hkciAqbmxoLCBzdHJ1Y3QgbmZhdHRyICpjZGFbXSk7CiAJdV9pbnQxNl90IGF0dHJfY291bnQ7CS8qIG51bWJlciBvZiBuZmF0dHIncyAqLwogfTsKIApAQCAtMTI5LDE5ICsxMjksNiBAQAogKHsgaWYgKHNrYl90YWlscm9vbShza2IpIDwgKGludClORkFfU1BBQ0UoYXR0cmxlbikpIGdvdG8gbmZhdHRyX2ZhaWx1cmU7IFwKICAgIF9fbmZhX2ZpbGwoc2tiLCBhdHRydHlwZSwgYXR0cmxlbiwgZGF0YSk7IH0pCiAKLWV4dGVybiBzdHJ1Y3Qgc2VtYXBob3JlIG5mbmxfc2VtOwotCi0jZGVmaW5lIG5mbmxfc2hsb2NrKCkJCWRvd24oJm5mbmxfc2VtKQotI2RlZmluZSBuZm5sX3NobG9ja19ub3dhaXQoKQlkb3duX3RyeWxvY2soJm5mbmxfc2VtKQotCi0jZGVmaW5lIG5mbmxfc2h1bmxvY2soKQkJZG8geyB1cCgmbmZubF9zZW0pOyBcCi0JCQkJICAgICBpZihuZm5sICYmIG5mbmwtPnNrX3JlY2VpdmVfcXVldWUucWxlbikgXAotCQkJCQkgICAgbmZubC0+c2tfZGF0YV9yZWFkeShuZm5sLCAwKTsgXAotICAgICAgICAgICAgICAgICAgICAgICAgCX0gd2hpbGUoMCkKLQotZXh0ZXJuIHZvaWQgbmZubF9sb2NrKHZvaWQpOwotZXh0ZXJuIHZvaWQgbmZubF91bmxvY2sodm9pZCk7Ci0KIGV4dGVybiBpbnQgbmZuZXRsaW5rX3N1YnN5c19yZWdpc3RlcihzdHJ1Y3QgbmZuZXRsaW5rX3N1YnN5c3RlbSAqbik7CiBleHRlcm4gaW50IG5mbmV0bGlua19zdWJzeXNfdW5yZWdpc3RlcihzdHJ1Y3QgbmZuZXRsaW5rX3N1YnN5c3RlbSAqbik7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mbmV0bGlua19jb25udHJhY2suaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mbmV0bGlua19jb25udHJhY2suaAppbmRleCBiNTg4M2NjLi5kN2MzNTAzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZm5ldGxpbmtfY29ubnRyYWNrLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZuZXRsaW5rX2Nvbm50cmFjay5oCkBAIC04Myw2ICs4MywxMCBAQAogZW51bSBjdGF0dHJfcHJvdG9pbmZvX3RjcCB7CiAJQ1RBX1BST1RPSU5GT19UQ1BfVU5TUEVDLAogCUNUQV9QUk9UT0lORk9fVENQX1NUQVRFLAorCUNUQV9QUk9UT0lORk9fVENQX1dTQ0FMRV9PUklHSU5BTCwKKwlDVEFfUFJPVE9JTkZPX1RDUF9XU0NBTEVfUkVQTFksCisJQ1RBX1BST1RPSU5GT19UQ1BfRkxBR1NfT1JJR0lOQUwsCisJQ1RBX1BST1RPSU5GT19UQ1BfRkxBR1NfUkVQTFksCiAJX19DVEFfUFJPVE9JTkZPX1RDUF9NQVgKIH07CiAjZGVmaW5lIENUQV9QUk9UT0lORk9fVENQX01BWCAoX19DVEFfUFJPVE9JTkZPX1RDUF9NQVggLSAxKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UuaAppbmRleCA1NTY4OWYzLi4xOTA2MDAzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UuaApAQCAtNyw2ICs3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9wcHBveC5oPgogCiAvKiBCcmlkZ2UgSG9va3MgKi8KIC8qIEFmdGVyIHByb21pc2MgZHJvcHMsIGNoZWNrc3VtIGNoZWNrcy4gKi8KQEAgLTU4LDggKzU5LDE0IEBACiAgKiBlbm91Z2ggcm9vbSBmb3IgdGhlIGVuY2Fwc3VsYXRpbmcgaGVhZGVyIChpZiB0aGVyZSBpcyBvbmUpLiAqLwogc3RhdGljIGlubGluZSBpbnQgbmZfYnJpZGdlX3BhZChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotIAlyZXR1cm4gKHNrYi0+bmZfYnJpZGdlICYmIHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfODAyMVEpKQotCQk/IFZMQU5fSExFTiA6IDA7CisJaW50IHBhZGRpbmcgPSAwOworCisJaWYgKHNrYi0+bmZfYnJpZGdlICYmIHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfODAyMVEpKQorCQlwYWRkaW5nID0gVkxBTl9ITEVOOworCWVsc2UgaWYgKHNrYi0+bmZfYnJpZGdlICYmIHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfUFBQX1NFUykpCisJCXBhZGRpbmcgPSBQUFBPRV9TRVNfSExFTjsKKworCXJldHVybiBwYWRkaW5nOwogfQogCiBzdHJ1Y3QgYnJpZGdlX3NrYl9jYiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0XzgwMl8zLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0XzgwMl8zLmgKaW5kZXggMDdmMDQ0Zi4uYTExYjBjMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF84MDJfMy5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfODAyXzMuaApAQCAtNTQsNyArNTQsNyBAQAogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBlYnRfODAyXzNfaGRyICplYnRfODAyXzNfaGRyKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JcmV0dXJuIChzdHJ1Y3QgZWJ0XzgwMl8zX2hkciAqKXNrYi0+bWFjLnJhdzsKKwlyZXR1cm4gKHN0cnVjdCBlYnRfODAyXzNfaGRyICopc2tiX21hY19oZWFkZXIoc2tiKTsKIH0KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X2FycC5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9hcnAuaAppbmRleCA5N2U0ZGJkLi5jYmY0ODQzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X2FycC5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfYXJwLmgKQEAgLTgsOCArOCwxMCBAQAogI2RlZmluZSBFQlRfQVJQX0RTVF9JUCAweDEwCiAjZGVmaW5lIEVCVF9BUlBfU1JDX01BQyAweDIwCiAjZGVmaW5lIEVCVF9BUlBfRFNUX01BQyAweDQwCisjZGVmaW5lIEVCVF9BUlBfR1JBVCAweDgwCiAjZGVmaW5lIEVCVF9BUlBfTUFTSyAoRUJUX0FSUF9PUENPREUgfCBFQlRfQVJQX0hUWVBFIHwgRUJUX0FSUF9QVFlQRSB8IFwKLSAgIEVCVF9BUlBfU1JDX0lQIHwgRUJUX0FSUF9EU1RfSVAgfCBFQlRfQVJQX1NSQ19NQUMgfCBFQlRfQVJQX0RTVF9NQUMpCisgICBFQlRfQVJQX1NSQ19JUCB8IEVCVF9BUlBfRFNUX0lQIHwgRUJUX0FSUF9TUkNfTUFDIHwgRUJUX0FSUF9EU1RfTUFDIHwgXAorICAgRUJUX0FSUF9HUkFUKQogI2RlZmluZSBFQlRfQVJQX01BVENIICJhcnAiCiAKIHN0cnVjdCBlYnRfYXJwX2luZm8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvS2J1aWxkIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9LYnVpbGQKaW5kZXggMTgwMzM3OC4uNzE4NTc5MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9LYnVpbGQKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9LYnVpbGQKQEAgLTEsOSArMSwzIEBACi1oZWFkZXIteSArPSBpcF9jb25udHJhY2tfaGVscGVyLmgKLWhlYWRlci15ICs9IGlwX2Nvbm50cmFja19wcm90b2NvbC5oCi1oZWFkZXIteSArPSBpcF9jb25udHJhY2tfc2N0cC5oCi1oZWFkZXIteSArPSBpcF9jb25udHJhY2tfdGNwLmgKLWhlYWRlci15ICs9IGlwX2Nvbm50cmFja190ZnRwLmgKLWhlYWRlci15ICs9IGlwX25hdF9wcHRwLmgKIGhlYWRlci15ICs9IGlwdF9hZGRydHlwZS5oCiBoZWFkZXIteSArPSBpcHRfYWguaAogaGVhZGVyLXkgKz0gaXB0X0NMQVNTSUZZLmgKQEAgLTQ5LDEzICs0Myw1IEBACiBoZWFkZXIteSArPSBpcHRfVFRMLmgKIGhlYWRlci15ICs9IGlwdF9VTE9HLmgKIAotdW5pZmRlZi15ICs9IGlwX2Nvbm50cmFjay5oCi11bmlmZGVmLXkgKz0gaXBfY29ubnRyYWNrX2gzMjMuaAotdW5pZmRlZi15ICs9IGlwX2Nvbm50cmFja19pcmMuaAotdW5pZmRlZi15ICs9IGlwX2Nvbm50cmFja19wcHRwLmgKLXVuaWZkZWYteSArPSBpcF9jb25udHJhY2tfcHJvdG9fZ3JlLmgKLXVuaWZkZWYteSArPSBpcF9jb25udHJhY2tfdHVwbGUuaAotdW5pZmRlZi15ICs9IGlwX25hdC5oCi11bmlmZGVmLXkgKz0gaXBfbmF0X3J1bGUuaAogdW5pZmRlZi15ICs9IGlwX3F1ZXVlLmgKIHVuaWZkZWYteSArPSBpcF90YWJsZXMuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2suaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhOTI3NGUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2suaAorKysgL2Rldi9udWxsCkBAIC0xLDQwMiArMCwwIEBACi0jaWZuZGVmIF9JUF9DT05OVFJBQ0tfSAotI2RlZmluZSBfSVBfQ09OTlRSQUNLX0gKLQotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29tbW9uLmg+Ci0KLSNpZmRlZiBfX0tFUk5FTF9fCi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX3R1cGxlLmg+Ci0jaW5jbHVkZSA8bGludXgvYml0b3BzLmg+Ci0jaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KLSNpbmNsdWRlIDxhc20vYXRvbWljLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC90aW1lci5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja190Y3AuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfaWNtcC5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19wcm90b19ncmUuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfc2N0cC5oPgotCi0vKiBwZXIgY29ubnRyYWNrOiBwcm90b2NvbCBwcml2YXRlIGRhdGEgKi8KLXVuaW9uIGlwX2Nvbm50cmFja19wcm90byB7Ci0JLyogaW5zZXJ0IGNvbm50cmFjayBwcm90byBwcml2YXRlIGRhdGEgaGVyZSAqLwotCXN0cnVjdCBpcF9jdF9ncmUgZ3JlOwotCXN0cnVjdCBpcF9jdF9zY3RwIHNjdHA7Ci0Jc3RydWN0IGlwX2N0X3RjcCB0Y3A7Ci0Jc3RydWN0IGlwX2N0X2ljbXAgaWNtcDsKLX07Ci0KLXVuaW9uIGlwX2Nvbm50cmFja19leHBlY3RfcHJvdG8gewotCS8qIGluc2VydCBleHBlY3QgcHJvdG8gcHJpdmF0ZSBkYXRhIGhlcmUgKi8KLX07Ci0KLS8qIEFkZCBwcm90b2NvbCBoZWxwZXIgaW5jbHVkZSBmaWxlIGhlcmUgKi8KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfaDMyMy5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19wcHRwLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2FtYW5kYS5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19mdHAuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfaXJjLmg+Ci0KLS8qIHBlciBjb25udHJhY2s6IGFwcGxpY2F0aW9uIGhlbHBlciBwcml2YXRlIGRhdGEgKi8KLXVuaW9uIGlwX2Nvbm50cmFja19oZWxwIHsKLQkvKiBpbnNlcnQgY29ubnRyYWNrIGhlbHBlciBwcml2YXRlIGRhdGEgKG1hc3RlcikgaGVyZSAqLwotCXN0cnVjdCBpcF9jdF9oMzIzX21hc3RlciBjdF9oMzIzX2luZm87Ci0Jc3RydWN0IGlwX2N0X3BwdHBfbWFzdGVyIGN0X3BwdHBfaW5mbzsKLQlzdHJ1Y3QgaXBfY3RfZnRwX21hc3RlciBjdF9mdHBfaW5mbzsKLQlzdHJ1Y3QgaXBfY3RfaXJjX21hc3RlciBjdF9pcmNfaW5mbzsKLX07Ci0KLSNpZmRlZiBDT05GSUdfSVBfTkZfTkFUX05FRURFRAotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdC5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdF9wcHRwLmg+Ci0KLS8qIHBlciBjb25udHJhY2s6IG5hdCBhcHBsaWNhdGlvbiBoZWxwZXIgcHJpdmF0ZSBkYXRhICovCi11bmlvbiBpcF9jb25udHJhY2tfbmF0X2hlbHAgewotCS8qIGluc2VydCBuYXQgaGVscGVyIHByaXZhdGUgZGF0YSBoZXJlICovCi0Jc3RydWN0IGlwX25hdF9wcHRwIG5hdF9wcHRwX2luZm87Ci19OwotI2VuZGlmCi0KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotCi0jaWZkZWYgQ09ORklHX05FVEZJTFRFUl9ERUJVRwotI2RlZmluZSBJUF9ORl9BU1NFUlQoeCkJCQkJCQkJXAotZG8gewkJCQkJCQkJCVwKLQlpZiAoISh4KSkJCQkJCQkJXAotCQkvKiBXb29haCEgIEknbSB0cmlwcGluZyBteSBjb25udHJhY2sgaW4gYSBmcmVuenkgb2YJXAotCQkgICBuZXRwbGF5Li4uICovCQkJCQlcCi0JCXByaW50aygiTkZfSVBfQVNTRVJUOiAlczolaSglcylcbiIsCQkJXAotCQkgICAgICAgX19GSUxFX18sIF9fTElORV9fLCBfX0ZVTkNUSU9OX18pOwkJXAotfSB3aGlsZSgwKQotI2Vsc2UKLSNkZWZpbmUgSVBfTkZfQVNTRVJUKHgpCi0jZW5kaWYKLQotc3RydWN0IGlwX2Nvbm50cmFja19oZWxwZXI7Ci0KLXN0cnVjdCBpcF9jb25udHJhY2sKLXsKLQkvKiBVc2FnZSBjb3VudCBpbiBoZXJlIGlzIDEgZm9yIGhhc2ggdGFibGUvZGVzdHJ1Y3QgdGltZXIsIDEgcGVyIHNrYiwKLSAgICAgICAgICAgcGx1cyAxIGZvciBhbnkgY29ubmVjdGlvbihzKSB3ZSBhcmUgYG1hc3RlcicgZm9yICovCi0Jc3RydWN0IG5mX2Nvbm50cmFjayBjdF9nZW5lcmFsOwotCi0JLyogSGF2ZSB3ZSBzZWVuIHRyYWZmaWMgYm90aCB3YXlzIHlldD8gKGJpdHNldCkgKi8KLQl1bnNpZ25lZCBsb25nIHN0YXR1czsKLQotCS8qIFRpbWVyIGZ1bmN0aW9uOyBkcm9wcyByZWZjbnQgd2hlbiBpdCBnb2VzIG9mZi4gKi8KLQlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lb3V0OwotCi0jaWZkZWYgQ09ORklHX0lQX05GX0NUX0FDQ1QKLQkvKiBBY2NvdW50aW5nIEluZm9ybWF0aW9uIChzYW1lIGNhY2hlIGxpbmUgYXMgb3RoZXIgd3JpdHRlbiBtZW1iZXJzKSAqLwotCXN0cnVjdCBpcF9jb25udHJhY2tfY291bnRlciBjb3VudGVyc1tJUF9DVF9ESVJfTUFYXTsKLSNlbmRpZgotCS8qIElmIHdlIHdlcmUgZXhwZWN0ZWQgYnkgYW4gZXhwZWN0YXRpb24sIHRoaXMgd2lsbCBiZSBpdCAqLwotCXN0cnVjdCBpcF9jb25udHJhY2sgKm1hc3RlcjsKLQotCS8qIEN1cnJlbnQgbnVtYmVyIG9mIGV4cGVjdGVkIGNvbm5lY3Rpb25zICovCi0JdW5zaWduZWQgaW50IGV4cGVjdGluZzsKLQotCS8qIFVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhpcyBjb25udHJhY2sqLwotCXVuc2lnbmVkIGludCBpZDsKLQotCS8qIEhlbHBlciwgaWYgYW55LiAqLwotCXN0cnVjdCBpcF9jb25udHJhY2tfaGVscGVyICpoZWxwZXI7Ci0KLQkvKiBTdG9yYWdlIHJlc2VydmVkIGZvciBvdGhlciBtb2R1bGVzOiAqLwotCXVuaW9uIGlwX2Nvbm50cmFja19wcm90byBwcm90bzsKLQotCXVuaW9uIGlwX2Nvbm50cmFja19oZWxwIGhlbHA7Ci0KLSNpZmRlZiBDT05GSUdfSVBfTkZfTkFUX05FRURFRAotCXN0cnVjdCB7Ci0JCXN0cnVjdCBpcF9uYXRfaW5mbyBpbmZvOwotCQl1bmlvbiBpcF9jb25udHJhY2tfbmF0X2hlbHAgaGVscDsKLSNpZiBkZWZpbmVkKENPTkZJR19JUF9ORl9UQVJHRVRfTUFTUVVFUkFERSkgfHwgXAotCWRlZmluZWQoQ09ORklHX0lQX05GX1RBUkdFVF9NQVNRVUVSQURFX01PRFVMRSkKLQkJaW50IG1hc3FfaW5kZXg7Ci0jZW5kaWYKLQl9IG5hdDsKLSNlbmRpZiAvKiBDT05GSUdfSVBfTkZfTkFUX05FRURFRCAqLwotCi0jaWYgZGVmaW5lZChDT05GSUdfSVBfTkZfQ09OTlRSQUNLX01BUkspCi0JdV9pbnQzMl90IG1hcms7Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19JUF9ORl9DT05OVFJBQ0tfU0VDTUFSSwotCXVfaW50MzJfdCBzZWNtYXJrOwotI2VuZGlmCi0KLQkvKiBUcmF2ZXJzZWQgb2Z0ZW4sIHNvIGhvcGVmdWxseSBpbiBkaWZmZXJlbnQgY2FjaGVsaW5lIHRvIHRvcCAqLwotCS8qIFRoZXNlIGFyZSBteSB0dXBsZXM7IG9yaWdpbmFsIGFuZCByZXBseSAqLwotCXN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGVfaGFzaCB0dXBsZWhhc2hbSVBfQ1RfRElSX01BWF07Ci19OwotCi1zdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdAotewotCS8qIEludGVybmFsIGxpbmtlZCBsaXN0IChnbG9iYWwgZXhwZWN0YXRpb24gbGlzdCkgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci0KLQkvKiBXZSBleHBlY3QgdGhpcyB0dXBsZSwgd2l0aCB0aGUgZm9sbG93aW5nIG1hc2sgKi8KLQlzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlIHR1cGxlLCBtYXNrOwotIAotCS8qIEZ1bmN0aW9uIHRvIGNhbGwgYWZ0ZXIgc2V0dXAgYW5kIGluc2VydGlvbiAqLwotCXZvaWQgKCpleHBlY3Rmbikoc3RydWN0IGlwX2Nvbm50cmFjayAqbmV3LAotCQkJIHN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICp0aGlzKTsKLQotCS8qIFRoZSBjb25udHJhY2sgb2YgdGhlIG1hc3RlciBjb25uZWN0aW9uICovCi0Jc3RydWN0IGlwX2Nvbm50cmFjayAqbWFzdGVyOwotCi0JLyogVGltZXIgZnVuY3Rpb247IGRlbGV0ZXMgdGhlIGV4cGVjdGF0aW9uLiAqLwotCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVvdXQ7Ci0KLQkvKiBVc2FnZSBjb3VudC4gKi8KLQlhdG9taWNfdCB1c2U7Ci0KLQkvKiBVbmlxdWUgSUQgKi8KLQl1bnNpZ25lZCBpbnQgaWQ7Ci0KLQkvKiBGbGFncyAqLwotCXVuc2lnbmVkIGludCBmbGFnczsKLQotI2lmZGVmIENPTkZJR19JUF9ORl9OQVRfTkVFREVECi0JX19iZTMyIHNhdmVkX2lwOwotCS8qIFRoaXMgaXMgdGhlIG9yaWdpbmFsIHBlci1wcm90byBwYXJ0LCB1c2VkIHRvIG1hcCB0aGUKLQkgKiBleHBlY3RlZCBjb25uZWN0aW9uIHRoZSB3YXkgdGhlIHJlY2lwaWVudCBleHBlY3RzLiAqLwotCXVuaW9uIGlwX2Nvbm50cmFja19tYW5pcF9wcm90byBzYXZlZF9wcm90bzsKLQkvKiBEaXJlY3Rpb24gcmVsYXRpdmUgdG8gdGhlIG1hc3RlciBjb25uZWN0aW9uLiAqLwotCWVudW0gaXBfY29ubnRyYWNrX2RpciBkaXI7Ci0jZW5kaWYKLX07Ci0KLSNkZWZpbmUgSVBfQ1RfRVhQRUNUX1BFUk1BTkVOVAkweDEKLQotc3RhdGljIGlubGluZSBzdHJ1Y3QgaXBfY29ubnRyYWNrICoKLXR1cGxlaGFzaF90b19jdHJhY2soY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZV9oYXNoICpoYXNoKQotewotCXJldHVybiBjb250YWluZXJfb2YoaGFzaCwgc3RydWN0IGlwX2Nvbm50cmFjaywKLQkJCSAgICB0dXBsZWhhc2hbaGFzaC0+dHVwbGUuZHN0LmRpcl0pOwotfQotCi0vKiBnZXQgbWFzdGVyIGNvbm50cmFjayB2aWEgbWFzdGVyIGV4cGVjdGF0aW9uICovCi0jZGVmaW5lIG1hc3Rlcl9jdChjb25udHIpIChjb25udHItPm1hc3RlcikKLQotLyogQWx0ZXIgcmVwbHkgdHVwbGUgKG1heWJlIGFsdGVyIGhlbHBlcikuICovCi1leHRlcm4gdm9pZAotaXBfY29ubnRyYWNrX2FsdGVyX3JlcGx5KHN0cnVjdCBpcF9jb25udHJhY2sgKmNvbm50cmFjaywKLQkJCSBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICpuZXdyZXBseSk7Ci0KLS8qIElzIHRoaXMgdHVwbGUgdGFrZW4/IChpZ25vcmluZyBhbnkgYmVsb25naW5nIHRvIHRoZSBnaXZlbgotICAgY29ubnRyYWNrKS4gKi8KLWV4dGVybiBpbnQKLWlwX2Nvbm50cmFja190dXBsZV90YWtlbihjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0dXBsZSwKLQkJCSBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrICppZ25vcmVkX2Nvbm50cmFjayk7Ci0KLS8qIFJldHVybiBjb25udHJhY2tfaW5mbyBhbmQgdHVwbGUgaGFzaCBmb3IgZ2l2ZW4gc2tiLiAqLwotc3RhdGljIGlubGluZSBzdHJ1Y3QgaXBfY29ubnRyYWNrICoKLWlwX2Nvbm50cmFja19nZXQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgZW51bSBpcF9jb25udHJhY2tfaW5mbyAqY3RpbmZvKQotewotCSpjdGluZm8gPSBza2ItPm5mY3RpbmZvOwotCXJldHVybiAoc3RydWN0IGlwX2Nvbm50cmFjayAqKXNrYi0+bmZjdDsKLX0KLQotLyogZGVjcmVtZW50IHJlZmVyZW5jZSBjb3VudCBvbiBhIGNvbm50cmFjayAqLwotc3RhdGljIGlubGluZSB2b2lkCi1pcF9jb25udHJhY2tfcHV0KHN0cnVjdCBpcF9jb25udHJhY2sgKmN0KQotewotCUlQX05GX0FTU0VSVChjdCk7Ci0JbmZfY29ubnRyYWNrX3B1dCgmY3QtPmN0X2dlbmVyYWwpOwotfQotCi1leHRlcm4gaW50IGludmVydF90dXBsZXByKHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKmludmVyc2UsCi0JCQkgIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKm9yaWcpOwotCi1leHRlcm4gdm9pZCBfX2lwX2N0X3JlZnJlc2hfYWNjdChzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKLQkJCSAgICAgICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAotCQkJICAgICAgICAgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCSAgICAgICAgIHVuc2lnbmVkIGxvbmcgZXh0cmFfamlmZmllcywKLQkJCQkgaW50IGRvX2FjY3QpOwotCi0vKiBSZWZyZXNoIGNvbm50cmFjayBmb3IgdGhpcyBtYW55IGppZmZpZXMgYW5kIGRvIGFjY291bnRpbmcgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBpcF9jdF9yZWZyZXNoX2FjY3Qoc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsIAotCQkJCSAgICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAotCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJICAgICAgdW5zaWduZWQgbG9uZyBleHRyYV9qaWZmaWVzKQotewotCV9faXBfY3RfcmVmcmVzaF9hY2N0KGN0LCBjdGluZm8sIHNrYiwgZXh0cmFfamlmZmllcywgMSk7Ci19Ci0KLS8qIFJlZnJlc2ggY29ubnRyYWNrIGZvciB0aGlzIG1hbnkgamlmZmllcyAqLwotc3RhdGljIGlubGluZSB2b2lkIGlwX2N0X3JlZnJlc2goc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsCi0JCQkJIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJIHVuc2lnbmVkIGxvbmcgZXh0cmFfamlmZmllcykKLXsKLQlfX2lwX2N0X3JlZnJlc2hfYWNjdChjdCwgMCwgc2tiLCBleHRyYV9qaWZmaWVzLCAwKTsKLX0KLQotLyogVGhlc2UgYXJlIGZvciBOQVQuICBJY2t5LiAqLwotLyogVXBkYXRlIFRDUCB3aW5kb3cgdHJhY2tpbmcgZGF0YSB3aGVuIE5BVCBtYW5nbGVzIHRoZSBwYWNrZXQgKi8KLWV4dGVybiB2b2lkIGlwX2Nvbm50cmFja190Y3BfdXBkYXRlKHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJICAgIHN0cnVjdCBpcF9jb25udHJhY2sgKmNvbm50cmFjaywKLQkJCQkgICAgZW51bSBpcF9jb25udHJhY2tfZGlyIGRpcik7Ci0KLS8qIENhbGwgbWUgd2hlbiBhIGNvbm50cmFjayBpcyBkZXN0cm95ZWQuICovCi1leHRlcm4gdm9pZCAoKmlwX2Nvbm50cmFja19kZXN0cm95ZWQpKHN0cnVjdCBpcF9jb25udHJhY2sgKmNvbm50cmFjayk7Ci0KLS8qIEZha2UgY29ubnRyYWNrIGVudHJ5IGZvciB1bnRyYWNrZWQgY29ubmVjdGlvbnMgKi8KLWV4dGVybiBzdHJ1Y3QgaXBfY29ubnRyYWNrIGlwX2Nvbm50cmFja191bnRyYWNrZWQ7Ci0KLS8qIFJldHVybnMgbmV3IHNrX2J1ZmYsIG9yIE5VTEwgKi8KLXN0cnVjdCBza19idWZmICoKLWlwX2N0X2dhdGhlcl9mcmFncyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1X2ludDMyX3QgdXNlcik7Ci0KLS8qIEl0ZXJhdGUgb3ZlciBhbGwgY29ubnRyYWNrczogaWYgaXRlciByZXR1cm5zIHRydWUsIGl0J3MgZGVsZXRlZC4gKi8KLWV4dGVybiB2b2lkCi1pcF9jdF9pdGVyYXRlX2NsZWFudXAoaW50ICgqaXRlcikoc3RydWN0IGlwX2Nvbm50cmFjayAqaSwgdm9pZCAqZGF0YSksCi0JCSAgICAgIHZvaWQgKmRhdGEpOwotCi1leHRlcm4gc3RydWN0IGlwX2Nvbm50cmFja19oZWxwZXIgKgotX19pcF9jb25udHJhY2tfaGVscGVyX2ZpbmRfYnluYW1lKGNvbnN0IGNoYXIgKik7Ci1leHRlcm4gc3RydWN0IGlwX2Nvbm50cmFja19oZWxwZXIgKgotaXBfY29ubnRyYWNrX2hlbHBlcl9maW5kX2dldChjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0dXBsZSk7Ci1leHRlcm4gdm9pZCBpcF9jb25udHJhY2tfaGVscGVyX3B1dChzdHJ1Y3QgaXBfY29ubnRyYWNrX2hlbHBlciAqaGVscGVyKTsKLQotZXh0ZXJuIHN0cnVjdCBpcF9jb25udHJhY2tfcHJvdG9jb2wgKgotX19pcF9jb25udHJhY2tfcHJvdG9fZmluZCh1X2ludDhfdCBwcm90b2NvbCk7Ci1leHRlcm4gc3RydWN0IGlwX2Nvbm50cmFja19wcm90b2NvbCAqCi1pcF9jb25udHJhY2tfcHJvdG9fZmluZF9nZXQodV9pbnQ4X3QgcHJvdG9jb2wpOwotZXh0ZXJuIHZvaWQgaXBfY29ubnRyYWNrX3Byb3RvX3B1dChzdHJ1Y3QgaXBfY29ubnRyYWNrX3Byb3RvY29sICpwcm90byk7Ci0KLWV4dGVybiB2b2lkIGlwX2N0X3JlbW92ZV9leHBlY3RhdGlvbnMoc3RydWN0IGlwX2Nvbm50cmFjayAqY3QpOwotCi1leHRlcm4gc3RydWN0IGlwX2Nvbm50cmFjayAqaXBfY29ubnRyYWNrX2FsbG9jKHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKiwKLQkJCQkJICAgICAgIHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKik7Ci0KLWV4dGVybiB2b2lkIGlwX2Nvbm50cmFja19mcmVlKHN0cnVjdCBpcF9jb25udHJhY2sgKmN0KTsKLQotZXh0ZXJuIHZvaWQgaXBfY29ubnRyYWNrX2hhc2hfaW5zZXJ0KHN0cnVjdCBpcF9jb25udHJhY2sgKmN0KTsKLQotZXh0ZXJuIHN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICoKLV9faXBfY29ubnRyYWNrX2V4cGVjdF9maW5kKGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnR1cGxlKTsKLQotZXh0ZXJuIHN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICoKLWlwX2Nvbm50cmFja19leHBlY3RfZmluZF9nZXQoY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUpOwotCi1leHRlcm4gc3RydWN0IGlwX2Nvbm50cmFja190dXBsZV9oYXNoICoKLV9faXBfY29ubnRyYWNrX2ZpbmQoY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2sgKmlnbm9yZWRfY29ubnRyYWNrKTsKLQotZXh0ZXJuIHZvaWQgaXBfY29ubnRyYWNrX2ZsdXNoKHZvaWQpOwotCi0vKiBJdCdzIGNvbmZpcm1lZCBpZiBpdCBpcywgb3IgaGFzIGJlZW4gaW4gdGhlIGhhc2ggdGFibGUuICovCi1zdGF0aWMgaW5saW5lIGludCBpc19jb25maXJtZWQoc3RydWN0IGlwX2Nvbm50cmFjayAqY3QpCi17Ci0JcmV0dXJuIHRlc3RfYml0KElQU19DT05GSVJNRURfQklULCAmY3QtPnN0YXR1cyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGlzX2R5aW5nKHN0cnVjdCBpcF9jb25udHJhY2sgKmN0KQotewotCXJldHVybiB0ZXN0X2JpdChJUFNfRFlJTkdfQklULCAmY3QtPnN0YXR1cyk7Ci19Ci0KLWV4dGVybiB1bnNpZ25lZCBpbnQgaXBfY29ubnRyYWNrX2h0YWJsZV9zaXplOwotZXh0ZXJuIGludCBpcF9jb25udHJhY2tfY2hlY2tzdW07Ci0gCi0jZGVmaW5lIENPTk5UUkFDS19TVEFUX0lOQyhjb3VudCkgKF9fZ2V0X2NwdV92YXIoaXBfY29ubnRyYWNrX3N0YXQpLmNvdW50KyspCi0jZGVmaW5lIENPTk5UUkFDS19TVEFUX0lOQ19BVE9NSUMoY291bnQpCQlcCi1kbyB7CQkJCQkJCVwKLQlsb2NhbF9iaF9kaXNhYmxlKCk7CQkJCVwKLQlfX2dldF9jcHVfdmFyKGlwX2Nvbm50cmFja19zdGF0KS5jb3VudCsrOwlcCi0JbG9jYWxfYmhfZW5hYmxlKCk7CQkJCVwKLX0gd2hpbGUgKDApCi0KLSNpZmRlZiBDT05GSUdfSVBfTkZfQ09OTlRSQUNLX0VWRU5UUwotI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0KLXN0cnVjdCBpcF9jb25udHJhY2tfZWNhY2hlIHsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdDsKLQl1bnNpZ25lZCBpbnQgZXZlbnRzOwotfTsKLURFQ0xBUkVfUEVSX0NQVShzdHJ1Y3QgaXBfY29ubnRyYWNrX2VjYWNoZSwgaXBfY29ubnRyYWNrX2VjYWNoZSk7Ci0KLSNkZWZpbmUgQ09OTlRSQUNLX0VDQUNIRSh4KQkoX19nZXRfY3B1X3ZhcihpcF9jb25udHJhY2tfZWNhY2hlKS54KQotIAotZXh0ZXJuIHN0cnVjdCBhdG9taWNfbm90aWZpZXJfaGVhZCBpcF9jb25udHJhY2tfY2hhaW47Ci1leHRlcm4gc3RydWN0IGF0b21pY19ub3RpZmllcl9oZWFkIGlwX2Nvbm50cmFja19leHBlY3RfY2hhaW47Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGlwX2Nvbm50cmFja19yZWdpc3Rlcl9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKQotewotCXJldHVybiBhdG9taWNfbm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIoJmlwX2Nvbm50cmFja19jaGFpbiwgbmIpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBpcF9jb25udHJhY2tfdW5yZWdpc3Rlcl9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKQotewotCXJldHVybiBhdG9taWNfbm90aWZpZXJfY2hhaW5fdW5yZWdpc3RlcigmaXBfY29ubnRyYWNrX2NoYWluLCBuYik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IAotaXBfY29ubnRyYWNrX2V4cGVjdF9yZWdpc3Rlcl9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKQotewotCXJldHVybiBhdG9taWNfbm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIoJmlwX2Nvbm50cmFja19leHBlY3RfY2hhaW4sIG5iKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQKLWlwX2Nvbm50cmFja19leHBlY3RfdW5yZWdpc3Rlcl9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKQotewotCXJldHVybiBhdG9taWNfbm90aWZpZXJfY2hhaW5fdW5yZWdpc3RlcigmaXBfY29ubnRyYWNrX2V4cGVjdF9jaGFpbiwKLQkJCW5iKTsKLX0KLQotZXh0ZXJuIHZvaWQgaXBfY3RfZGVsaXZlcl9jYWNoZWRfZXZlbnRzKGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2sgKmN0KTsKLWV4dGVybiB2b2lkIF9faXBfY3RfZXZlbnRfY2FjaGVfaW5pdChzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCk7Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCAKLWlwX2Nvbm50cmFja19ldmVudF9jYWNoZShlbnVtIGlwX2Nvbm50cmFja19ldmVudHMgZXZlbnQsCi0JCQkgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCA9IChzdHJ1Y3QgaXBfY29ubnRyYWNrICopc2tiLT5uZmN0OwotCXN0cnVjdCBpcF9jb25udHJhY2tfZWNhY2hlICplY2FjaGU7Ci0JCi0JbG9jYWxfYmhfZGlzYWJsZSgpOwotCWVjYWNoZSA9ICZfX2dldF9jcHVfdmFyKGlwX2Nvbm50cmFja19lY2FjaGUpOwotCWlmIChjdCAhPSBlY2FjaGUtPmN0KQotCQlfX2lwX2N0X2V2ZW50X2NhY2hlX2luaXQoY3QpOwotCWVjYWNoZS0+ZXZlbnRzIHw9IGV2ZW50OwotCWxvY2FsX2JoX2VuYWJsZSgpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgaXBfY29ubnRyYWNrX2V2ZW50KGVudW0gaXBfY29ubnRyYWNrX2V2ZW50cyBldmVudCwKLQkJCQkgICAgICBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCkKLXsKLQlpZiAoaXNfY29uZmlybWVkKGN0KSAmJiAhaXNfZHlpbmcoY3QpKQotCQlhdG9taWNfbm90aWZpZXJfY2FsbF9jaGFpbigmaXBfY29ubnRyYWNrX2NoYWluLCBldmVudCwgY3QpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgCi1pcF9jb25udHJhY2tfZXhwZWN0X2V2ZW50KGVudW0gaXBfY29ubnRyYWNrX2V4cGVjdF9ldmVudHMgZXZlbnQsCi0JCQkgIHN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpleHApCi17Ci0JYXRvbWljX25vdGlmaWVyX2NhbGxfY2hhaW4oJmlwX2Nvbm50cmFja19leHBlY3RfY2hhaW4sIGV2ZW50LCBleHApOwotfQotI2Vsc2UgLyogQ09ORklHX0lQX05GX0NPTk5UUkFDS19FVkVOVFMgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBpcF9jb25udHJhY2tfZXZlbnRfY2FjaGUoZW51bSBpcF9jb25udHJhY2tfZXZlbnRzIGV2ZW50LCAKLQkJCQkJICAgIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpIHt9Ci1zdGF0aWMgaW5saW5lIHZvaWQgaXBfY29ubnRyYWNrX2V2ZW50KGVudW0gaXBfY29ubnRyYWNrX2V2ZW50cyBldmVudCwgCi0JCQkJICAgICAgc3RydWN0IGlwX2Nvbm50cmFjayAqY3QpIHt9Ci1zdGF0aWMgaW5saW5lIHZvaWQgaXBfY3RfZGVsaXZlcl9jYWNoZWRfZXZlbnRzKGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2sgKmN0KSB7fQotc3RhdGljIGlubGluZSB2b2lkIAotaXBfY29ubnRyYWNrX2V4cGVjdF9ldmVudChlbnVtIGlwX2Nvbm50cmFja19leHBlY3RfZXZlbnRzIGV2ZW50LCAKLQkJCSAgc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmV4cCkge30KLSNlbmRpZiAvKiBDT05GSUdfSVBfTkZfQ09OTlRSQUNLX0VWRU5UUyAqLwotCi0jaWZkZWYgQ09ORklHX0lQX05GX05BVF9ORUVERUQKLXN0YXRpYyBpbmxpbmUgaW50IGlwX25hdF9pbml0aWFsaXplZChzdHJ1Y3QgaXBfY29ubnRyYWNrICpjb25udHJhY2ssCi0JCQkJICAgICBlbnVtIGlwX25hdF9tYW5pcF90eXBlIG1hbmlwKQotewotCWlmIChtYW5pcCA9PSBJUF9OQVRfTUFOSVBfU1JDKQotCQlyZXR1cm4gdGVzdF9iaXQoSVBTX1NSQ19OQVRfRE9ORV9CSVQsICZjb25udHJhY2stPnN0YXR1cyk7Ci0JcmV0dXJuIHRlc3RfYml0KElQU19EU1RfTkFUX0RPTkVfQklULCAmY29ubnRyYWNrLT5zdGF0dXMpOwotfQotI2VuZGlmIC8qIENPTkZJR19JUF9ORl9OQVRfTkVFREVEICovCi0KLSNlbmRpZiAvKiBfX0tFUk5FTF9fICovCi0jZW5kaWYgLyogX0lQX0NPTk5UUkFDS19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19hbWFuZGEuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2FtYW5kYS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTNlNDFmLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2FtYW5kYS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotI2lmbmRlZiBfSVBfQ09OTlRSQUNLX0FNQU5EQV9ICi0jZGVmaW5lIF9JUF9DT05OVFJBQ0tfQU1BTkRBX0gKLS8qIEFNQU5EQSB0cmFja2luZy4gKi8KLQotc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3Q7Ci1leHRlcm4gdW5zaWduZWQgaW50ICgqaXBfbmF0X2FtYW5kYV9ob29rKShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCi0JCQkJCSAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCi0JCQkJCSAgdW5zaWduZWQgaW50IG1hdGNob2ZmLAotCQkJCQkgIHVuc2lnbmVkIGludCBtYXRjaGxlbiwKLQkJCQkJICBzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqZXhwKTsKLSNlbmRpZiAvKiBfSVBfQ09OTlRSQUNLX0FNQU5EQV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19jb3JlLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19jb3JlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzYTZkZjAuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfY29yZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotI2lmbmRlZiBfSVBfQ09OTlRSQUNLX0NPUkVfSAotI2RlZmluZSBfSVBfQ09OTlRSQUNLX0NPUkVfSAotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgotCi0jZGVmaW5lIE1BWF9JUF9DVF9QUk9UTyAyNTYKLWV4dGVybiBzdHJ1Y3QgaXBfY29ubnRyYWNrX3Byb3RvY29sICppcF9jdF9wcm90b3NbTUFYX0lQX0NUX1BST1RPXTsKLQotLyogVGhpcyBoZWFkZXIgaXMgdXNlZCB0byBzaGFyZSBjb3JlIGZ1bmN0aW9uYWxpdHkgYmV0d2VlbiB0aGUKLSAgIHN0YW5kYWxvbmUgY29ubmVjdGlvbiB0cmFja2luZyBtb2R1bGUsIGFuZCB0aGUgY29tcGF0aWJpbGl0eSBsYXllcidzIHVzZQotICAgb2YgY29ubmVjdGlvbiB0cmFja2luZy4gKi8KLWV4dGVybiB1bnNpZ25lZCBpbnQgaXBfY29ubnRyYWNrX2luKHVuc2lnbmVkIGludCBob29rbnVtLAotCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCi0JCQkJICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLQkJCQkgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLQkJCQkgICAgaW50ICgqb2tmbikoc3RydWN0IHNrX2J1ZmYgKikpOwotCi1leHRlcm4gaW50IGlwX2Nvbm50cmFja19pbml0KHZvaWQpOwotZXh0ZXJuIHZvaWQgaXBfY29ubnRyYWNrX2NsZWFudXAodm9pZCk7Ci0KLXN0cnVjdCBpcF9jb25udHJhY2tfcHJvdG9jb2w7Ci0KLWV4dGVybiBpbnQKLWlwX2N0X2dldF90dXBsZShjb25zdCBzdHJ1Y3QgaXBoZHIgKmlwaCwKLQkJY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJdW5zaWduZWQgaW50IGRhdGFvZmYsCi0JCXN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnR1cGxlLAotCQljb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3Byb3RvY29sICpwcm90b2NvbCk7Ci0KLWV4dGVybiBpbnQKLWlwX2N0X2ludmVydF90dXBsZShzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICppbnZlcnNlLAotCQkgICBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICpvcmlnLAotCQkgICBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3Byb3RvY29sICpwcm90b2NvbCk7Ci0KLS8qIEZpbmQgYSBjb25uZWN0aW9uIGNvcnJlc3BvbmRpbmcgdG8gYSB0dXBsZS4gKi8KLXN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGVfaGFzaCAqCi1pcF9jb25udHJhY2tfZmluZF9nZXQoY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUsCi0JCSAgICAgIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2sgKmlnbm9yZWRfY29ubnRyYWNrKTsKLQotZXh0ZXJuIGludCBfX2lwX2Nvbm50cmFja19jb25maXJtKHN0cnVjdCBza19idWZmICoqcHNrYik7Ci0KLS8qIENvbmZpcm0gYSBjb25uZWN0aW9uOiByZXR1cm5zIE5GX0RST1AgaWYgcGFja2V0IG11c3QgYmUgZHJvcHBlZC4gKi8KLXN0YXRpYyBpbmxpbmUgaW50IGlwX2Nvbm50cmFja19jb25maXJtKHN0cnVjdCBza19idWZmICoqcHNrYikKLXsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCA9IChzdHJ1Y3QgaXBfY29ubnRyYWNrICopKCpwc2tiKS0+bmZjdDsKLQlpbnQgcmV0ID0gTkZfQUNDRVBUOwotCi0JaWYgKGN0KSB7Ci0JCWlmICghaXNfY29uZmlybWVkKGN0KSAmJiAhaXNfZHlpbmcoY3QpKQotCQkJcmV0ID0gX19pcF9jb25udHJhY2tfY29uZmlybShwc2tiKTsKLQkJaXBfY3RfZGVsaXZlcl9jYWNoZWRfZXZlbnRzKGN0KTsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotZXh0ZXJuIHZvaWQgaXBfY3RfdW5saW5rX2V4cGVjdChzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqZXhwKTsKLQotZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgKmlwX2Nvbm50cmFja19oYXNoOwotZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgaXBfY29ubnRyYWNrX2V4cGVjdF9saXN0OwotZXh0ZXJuIHJ3bG9ja190IGlwX2Nvbm50cmFja19sb2NrOwotI2VuZGlmIC8qIF9JUF9DT05OVFJBQ0tfQ09SRV9IICovCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2Z0cC5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfZnRwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMjlmYzMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfZnRwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0jaWZuZGVmIF9JUF9DT05OVFJBQ0tfRlRQX0gKLSNkZWZpbmUgX0lQX0NPTk5UUkFDS19GVFBfSAotLyogRlRQIHRyYWNraW5nLiAqLwotCi0vKiBUaGlzIGVudW0gaXMgZXhwb3NlZCB0byB1c2Vyc3BhY2UgKi8KLWVudW0gaXBfY3RfZnRwX3R5cGUKLXsKLQkvKiBQT1JUIGNvbW1hbmQgZnJvbSBjbGllbnQgKi8KLQlJUF9DVF9GVFBfUE9SVCwKLQkvKiBQQVNWIHJlc3BvbnNlIGZyb20gc2VydmVyICovCi0JSVBfQ1RfRlRQX1BBU1YsCi0JLyogRVBSVCBjb21tYW5kIGZyb20gY2xpZW50ICovCi0JSVBfQ1RfRlRQX0VQUlQsCi0JLyogRVBTViByZXNwb25zZSBmcm9tIHNlcnZlciAqLwotCUlQX0NUX0ZUUF9FUFNWLAotfTsKLQotI2lmZGVmIF9fS0VSTkVMX18KLQotI2RlZmluZSBGVFBfUE9SVAkyMQotCi0jZGVmaW5lIE5VTV9TRVFfVE9fUkVNRU1CRVIgMgotLyogVGhpcyBzdHJ1Y3R1cmUgZXhpc3RzIG9ubHkgb25jZSBwZXIgbWFzdGVyICovCi1zdHJ1Y3QgaXBfY3RfZnRwX21hc3RlciB7Ci0JLyogVmFsaWQgc2VxIHBvc2l0aW9ucyBmb3IgY21kIG1hdGNoaW5nIGFmdGVyIG5ld2xpbmUgKi8KLQl1X2ludDMyX3Qgc2VxX2FmdF9ubFtJUF9DVF9ESVJfTUFYXVtOVU1fU0VRX1RPX1JFTUVNQkVSXTsKLQkvKiAwIG1lYW5zIHNlcV9tYXRjaF9hZnRfbmwgbm90IHNldCAqLwotCWludCBzZXFfYWZ0X25sX251bVtJUF9DVF9ESVJfTUFYXTsKLX07Ci0KLXN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0OwotCi0vKiBGb3IgTkFUIHRvIGhvb2sgaW4gd2hlbiB3ZSBmaW5kIGEgcGFja2V0IHdoaWNoIGRlc2NyaWJlcyB3aGF0IG90aGVyCi0gKiBjb25uZWN0aW9uIHdlIHNob3VsZCBleHBlY3QuICovCi1leHRlcm4gdW5zaWduZWQgaW50ICgqaXBfbmF0X2Z0cF9ob29rKShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCi0JCQkJICAgICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAotCQkJCSAgICAgICBlbnVtIGlwX2N0X2Z0cF90eXBlIHR5cGUsCi0JCQkJICAgICAgIHVuc2lnbmVkIGludCBtYXRjaG9mZiwKLQkJCQkgICAgICAgdW5zaWduZWQgaW50IG1hdGNobGVuLAotCQkJCSAgICAgICBzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqZXhwLAotCQkJCSAgICAgICB1MzIgKnNlcSk7Ci0jZW5kaWYgLyogX19LRVJORUxfXyAqLwotCi0jZW5kaWYgLyogX0lQX0NPTk5UUkFDS19GVFBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfaDMyMy5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfaDMyMy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGY3Njk4Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2gzMjMuaAorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLSNpZm5kZWYgX0lQX0NPTk5UUkFDS19IMzIzX0gKLSNkZWZpbmUgX0lQX0NPTk5UUkFDS19IMzIzX0gKLQotI2lmZGVmIF9fS0VSTkVMX18KLQotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfaDMyM19hc24xLmg+Ci0KLSNkZWZpbmUgUkFTX1BPUlQgMTcxOQotI2RlZmluZSBROTMxX1BPUlQgMTcyMAotI2RlZmluZSBIMzIzX1JUUF9DSEFOTkVMX01BWCA0CS8qIEF1ZGlvLCB2aWRlbywgRkFYIGFuZCBvdGhlciAqLwotCi0vKiBUaGlzIHN0cnVjdHVyZSBleGlzdHMgb25seSBvbmNlIHBlciBtYXN0ZXIgKi8KLXN0cnVjdCBpcF9jdF9oMzIzX21hc3RlciB7Ci0KLQkvKiBPcmlnaW5hbCBhbmQgTkFUZWQgUS45MzEgb3IgSC4yNDUgc2lnbmFsIHBvcnRzICovCi0JdV9pbnQxNl90IHNpZ19wb3J0W0lQX0NUX0RJUl9NQVhdOwotCi0JLyogT3JpZ2luYWwgYW5kIE5BVGVkIFJUUCBwb3J0cyAqLwotCXVfaW50MTZfdCBydHBfcG9ydFtIMzIzX1JUUF9DSEFOTkVMX01BWF1bSVBfQ1RfRElSX01BWF07Ci0KLQl1bmlvbiB7Ci0JCS8qIFJBUyBjb25uZWN0aW9uIHRpbWVvdXQgKi8KLQkJdV9pbnQzMl90IHRpbWVvdXQ7Ci0KLQkJLyogTmV4dCBUUEtUIGxlbmd0aCAoZm9yIHNlcGFyYXRlIFRQS1QgaGVhZGVyIGFuZCBkYXRhKSAqLwotCQl1X2ludDE2X3QgdHBrdF9sZW5bSVBfQ1RfRElSX01BWF07Ci0JfTsKLX07Ci0KLXN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0OwotCi1leHRlcm4gaW50IGdldF9oMjI1X2FkZHIodW5zaWduZWQgY2hhciAqZGF0YSwgVHJhbnNwb3J0QWRkcmVzcyAqIGFkZHIsCi0JCQkgX19iZTMyICogaXAsIHVfaW50MTZfdCAqIHBvcnQpOwotZXh0ZXJuIHZvaWQgaXBfY29ubnRyYWNrX2gyNDVfZXhwZWN0KHN0cnVjdCBpcF9jb25udHJhY2sgKm5ldywKLQkJCQkgICAgIHN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICp0aGlzKTsKLWV4dGVybiB2b2lkIGlwX2Nvbm50cmFja19xOTMxX2V4cGVjdChzdHJ1Y3QgaXBfY29ubnRyYWNrICpuZXcsCi0JCQkJICAgICBzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqdGhpcyk7Ci1leHRlcm4gaW50ICgqc2V0X2gyNDVfYWRkcl9ob29rKSAoc3RydWN0IHNrX2J1ZmYgKiogcHNrYiwKLQkJCQkgIHVuc2lnbmVkIGNoYXIgKipkYXRhLCBpbnQgZGF0YW9mZiwKLQkJCQkgIEgyNDVfVHJhbnNwb3J0QWRkcmVzcyAqIGFkZHIsCi0JCQkJICBfX2JlMzIgaXAsIHVfaW50MTZfdCBwb3J0KTsKLWV4dGVybiBpbnQgKCpzZXRfaDIyNV9hZGRyX2hvb2spIChzdHJ1Y3Qgc2tfYnVmZiAqKiBwc2tiLAotCQkJCSAgdW5zaWduZWQgY2hhciAqKmRhdGEsIGludCBkYXRhb2ZmLAotCQkJCSAgVHJhbnNwb3J0QWRkcmVzcyAqIGFkZHIsCi0JCQkJICBfX2JlMzIgaXAsIHVfaW50MTZfdCBwb3J0KTsKLWV4dGVybiBpbnQgKCpzZXRfc2lnX2FkZHJfaG9vaykgKHN0cnVjdCBza19idWZmICoqIHBza2IsCi0JCQkJIHN0cnVjdCBpcF9jb25udHJhY2sgKiBjdCwKLQkJCQkgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCi0JCQkJIHVuc2lnbmVkIGNoYXIgKipkYXRhLAotCQkJCSBUcmFuc3BvcnRBZGRyZXNzICogYWRkciwgaW50IGNvdW50KTsKLWV4dGVybiBpbnQgKCpzZXRfcmFzX2FkZHJfaG9vaykgKHN0cnVjdCBza19idWZmICoqIHBza2IsCi0JCQkJIHN0cnVjdCBpcF9jb25udHJhY2sgKiBjdCwKLQkJCQkgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCi0JCQkJIHVuc2lnbmVkIGNoYXIgKipkYXRhLAotCQkJCSBUcmFuc3BvcnRBZGRyZXNzICogYWRkciwgaW50IGNvdW50KTsKLWV4dGVybiBpbnQgKCpuYXRfcnRwX3J0Y3BfaG9vaykgKHN0cnVjdCBza19idWZmICoqIHBza2IsCi0JCQkJIHN0cnVjdCBpcF9jb25udHJhY2sgKiBjdCwKLQkJCQkgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCi0JCQkJIHVuc2lnbmVkIGNoYXIgKipkYXRhLCBpbnQgZGF0YW9mZiwKLQkJCQkgSDI0NV9UcmFuc3BvcnRBZGRyZXNzICogYWRkciwKLQkJCQkgdV9pbnQxNl90IHBvcnQsIHVfaW50MTZfdCBydHBfcG9ydCwKLQkJCQkgc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKiBydHBfZXhwLAotCQkJCSBzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqIHJ0Y3BfZXhwKTsKLWV4dGVybiBpbnQgKCpuYXRfdDEyMF9ob29rKSAoc3RydWN0IHNrX2J1ZmYgKiogcHNrYiwgc3RydWN0IGlwX2Nvbm50cmFjayAqIGN0LAotCQkJICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKLQkJCSAgICAgdW5zaWduZWQgY2hhciAqKmRhdGEsIGludCBkYXRhb2ZmLAotCQkJICAgICBIMjQ1X1RyYW5zcG9ydEFkZHJlc3MgKiBhZGRyLCB1X2ludDE2X3QgcG9ydCwKLQkJCSAgICAgc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKiBleHApOwotZXh0ZXJuIGludCAoKm5hdF9oMjQ1X2hvb2spIChzdHJ1Y3Qgc2tfYnVmZiAqKiBwc2tiLCBzdHJ1Y3QgaXBfY29ubnRyYWNrICogY3QsCi0JCQkgICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAotCQkJICAgICB1bnNpZ25lZCBjaGFyICoqZGF0YSwgaW50IGRhdGFvZmYsCi0JCQkgICAgIFRyYW5zcG9ydEFkZHJlc3MgKiBhZGRyLCB1X2ludDE2X3QgcG9ydCwKLQkJCSAgICAgc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKiBleHApOwotZXh0ZXJuIGludCAoKm5hdF9jYWxsZm9yd2FyZGluZ19ob29rKSAoc3RydWN0IHNrX2J1ZmYgKiogcHNrYiwKLQkJCQkgICAgICAgc3RydWN0IGlwX2Nvbm50cmFjayAqIGN0LAotCQkJCSAgICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKLQkJCQkgICAgICAgdW5zaWduZWQgY2hhciAqKmRhdGEsIGludCBkYXRhb2ZmLAotCQkJCSAgICAgICBUcmFuc3BvcnRBZGRyZXNzICogYWRkciwKLQkJCQkgICAgICAgdV9pbnQxNl90IHBvcnQsCi0JCQkJICAgICAgIHN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICogZXhwKTsKLWV4dGVybiBpbnQgKCpuYXRfcTkzMV9ob29rKSAoc3RydWN0IHNrX2J1ZmYgKiogcHNrYiwgc3RydWN0IGlwX2Nvbm50cmFjayAqIGN0LAotCQkJICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKLQkJCSAgICAgdW5zaWduZWQgY2hhciAqKmRhdGEsIFRyYW5zcG9ydEFkZHJlc3MgKiBhZGRyLAotCQkJICAgICBpbnQgaWR4LCB1X2ludDE2X3QgcG9ydCwKLQkJCSAgICAgc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKiBleHApOwotCi0jZW5kaWYKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19oZWxwZXIuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2hlbHBlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2ZlODY4Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2hlbHBlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyogSVAgY29ubmVjdGlvbiB0cmFja2luZyBoZWxwZXJzLiAqLwotI2lmbmRlZiBfSVBfQ09OTlRSQUNLX0hFTFBFUl9ICi0jZGVmaW5lIF9JUF9DT05OVFJBQ0tfSEVMUEVSX0gKLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2suaD4KLQotc3RydWN0IG1vZHVsZTsKLQotc3RydWN0IGlwX2Nvbm50cmFja19oZWxwZXIKLXsJCi0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OyAJCS8qIEludGVybmFsIHVzZS4gKi8KLQotCWNvbnN0IGNoYXIgKm5hbWU7CQkvKiBuYW1lIG9mIHRoZSBtb2R1bGUgKi8KLQlzdHJ1Y3QgbW9kdWxlICptZTsJCS8qIHBvaW50ZXIgdG8gc2VsZiAqLwotCXVuc2lnbmVkIGludCBtYXhfZXhwZWN0ZWQ7CS8qIE1heGltdW0gbnVtYmVyIG9mIGNvbmN1cnJlbnQgCi0JCQkJCSAqIGV4cGVjdGVkIGNvbm5lY3Rpb25zICovCi0JdW5zaWduZWQgaW50IHRpbWVvdXQ7CQkvKiB0aW1lb3V0IGZvciBleHBlY3RlZHMgKi8KLQotCS8qIE1hc2sgb2YgdGhpbmdzIHdlIHdpbGwgaGVscCAoY29tcGFyZWQgYWdhaW5zdCBzZXJ2ZXIgcmVzcG9uc2UpICovCi0Jc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSB0dXBsZTsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlIG1hc2s7Ci0JCi0JLyogRnVuY3Rpb24gdG8gY2FsbCB3aGVuIGRhdGEgcGFzc2VzOyByZXR1cm4gdmVyZGljdCwgb3IgLTEgdG8KLSAgICAgICAgICAgaW52YWxpZGF0ZS4gKi8KLQlpbnQgKCpoZWxwKShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCi0JCSAgICBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKLQkJICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY29ubnRyYWNraW5mbyk7Ci0KLQl2b2lkICgqZGVzdHJveSkoc3RydWN0IGlwX2Nvbm50cmFjayAqY3QpOwotCi0JaW50ICgqdG9fbmZhdHRyKShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCk7Ci19OwotCi1leHRlcm4gaW50IGlwX2Nvbm50cmFja19oZWxwZXJfcmVnaXN0ZXIoc3RydWN0IGlwX2Nvbm50cmFja19oZWxwZXIgKik7Ci1leHRlcm4gdm9pZCBpcF9jb25udHJhY2tfaGVscGVyX3VucmVnaXN0ZXIoc3RydWN0IGlwX2Nvbm50cmFja19oZWxwZXIgKik7Ci0KLS8qIEFsbG9jYXRlIHNwYWNlIGZvciBhbiBleHBlY3RhdGlvbjogdGhpcyBpcyBtYW5kYXRvcnkgYmVmb3JlIGNhbGxpbmcgCi0gICBpcF9jb25udHJhY2tfZXhwZWN0X3JlbGF0ZWQuICBZb3Ugd2lsbCBoYXZlIHRvIGNhbGwgcHV0IGFmdGVyd2FyZHMuICovCi1leHRlcm4gc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKgotaXBfY29ubnRyYWNrX2V4cGVjdF9hbGxvYyhzdHJ1Y3QgaXBfY29ubnRyYWNrICptYXN0ZXIpOwotZXh0ZXJuIHZvaWQgaXBfY29ubnRyYWNrX2V4cGVjdF9wdXQoc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmV4cCk7Ci0KLS8qIEFkZCBhbiBleHBlY3RlZCBjb25uZWN0aW9uOiBjYW4gaGF2ZSBtb3JlIHRoYW4gb25lIHBlciBjb25uZWN0aW9uICovCi1leHRlcm4gaW50IGlwX2Nvbm50cmFja19leHBlY3RfcmVsYXRlZChzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqZXhwKTsKLWV4dGVybiB2b2lkIGlwX2Nvbm50cmFja191bmV4cGVjdF9yZWxhdGVkKHN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpleHApOwotCi0jZW5kaWYgLypfSVBfQ09OTlRSQUNLX0hFTFBFUl9IKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2ljbXAuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2ljbXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVkNWVlMy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19pY21wLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSNpZm5kZWYgX0lQX0NPTk5UUkFDS19JQ01QX0gKLSNkZWZpbmUgX0lQX0NPTk5UUkFDS19JQ01QX0gKLQotI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvaXB2NC9uZl9jb25udHJhY2tfaWNtcC5oPgotCi0jZW5kaWYgLyogX0lQX0NPTk5UUkFDS19JQ01QX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2lyYy5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfaXJjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2NjAxZTAuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfaXJjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKiBJUkMgZXh0ZW5zaW9uIGZvciBJUCBjb25uZWN0aW9uIHRyYWNraW5nLgotICogKEMpIDIwMDAgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KLSAqIGJhc2VkIG9uIFJSJ3MgaXBfY29ubnRyYWNrX2Z0cC5oCi0gKgotICogaXBfY29ubnRyYWNrX2lyYy5oLHYgMS42IDIwMDAvMTEvMDcgMTg6MjY6NDIgbGFmb3JnZSBFeHAKLSAqCi0gKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqICAgICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gKiAgICAgIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICoKLSAqLwotI2lmbmRlZiBfSVBfQ09OTlRSQUNLX0lSQ19ICi0jZGVmaW5lIF9JUF9DT05OVFJBQ0tfSVJDX0gKLQotLyogVGhpcyBzdHJ1Y3R1cmUgZXhpc3RzIG9ubHkgb25jZSBwZXIgbWFzdGVyICovCi1zdHJ1Y3QgaXBfY3RfaXJjX21hc3RlciB7Ci19OwotCi0jaWZkZWYgX19LRVJORUxfXwotZXh0ZXJuIHVuc2lnbmVkIGludCAoKmlwX25hdF9pcmNfaG9vaykoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAotCQkJCSAgICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKLQkJCQkgICAgICAgdW5zaWduZWQgaW50IG1hdGNob2ZmLAotCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgbWF0Y2hsZW4sCi0JCQkJICAgICAgIHN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpleHApOwotCi0jZGVmaW5lIElSQ19QT1JUCTY2NjcKLQotI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KLQotI2VuZGlmIC8qIF9JUF9DT05OVFJBQ0tfSVJDX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX3BwdHAuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX3BwdHAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY0NGIxZi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19wcHRwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMjYgKzAsMCBAQAotLyogUFBUUCBjb25zdGFudHMgYW5kIHN0cnVjdHMgKi8KLSNpZm5kZWYgX0NPTk5UUkFDS19QUFRQX0gKLSNkZWZpbmUgX0NPTk5UUkFDS19QUFRQX0gKLQotLyogc3RhdGUgb2YgdGhlIGNvbnRyb2wgc2Vzc2lvbiAqLwotZW51bSBwcHRwX2N0cmxzZXNzX3N0YXRlIHsKLQlQUFRQX1NFU1NJT05fTk9ORSwJCQkvKiBubyBzZXNzaW9uIHByZXNlbnQgKi8KLQlQUFRQX1NFU1NJT05fRVJST1IsCQkJLyogc29tZSBzZXNzaW9uIGVycm9yICovCi0JUFBUUF9TRVNTSU9OX1NUT1BSRVEsCQkJLyogc3RvcF9zZXNzIHJlcXVlc3Qgc2VlbiAqLwotCVBQVFBfU0VTU0lPTl9SRVFVRVNURUQsCQkJLyogc3RhcnRfc2VzcyByZXF1ZXN0IHNlZW4gKi8KLQlQUFRQX1NFU1NJT05fQ09ORklSTUVELAkJCS8qIHNlc3Npb24gZXN0YWJsaXNoZWQgKi8KLX07Ci0KLS8qIHN0YXRlIG9mIHRoZSBjYWxsIGluc2lkZSB0aGUgY29udHJvbCBzZXNzaW9uICovCi1lbnVtIHBwdHBfY3RybGNhbGxfc3RhdGUgewotCVBQVFBfQ0FMTF9OT05FLAotCVBQVFBfQ0FMTF9FUlJPUiwKLQlQUFRQX0NBTExfT1VUX1JFUSwKLQlQUFRQX0NBTExfT1VUX0NPTkYsCi0JUFBUUF9DQUxMX0lOX1JFUSwKLQlQUFRQX0NBTExfSU5fUkVQLAotCVBQVFBfQ0FMTF9JTl9DT05GLAotCVBQVFBfQ0FMTF9DTEVBUl9SRVEsCi19OwotCi0KLS8qIGNvbm50cmFjayBwcml2YXRlIGRhdGEgKi8KLXN0cnVjdCBpcF9jdF9wcHRwX21hc3RlciB7Ci0JZW51bSBwcHRwX2N0cmxzZXNzX3N0YXRlIHNzdGF0ZTsJLyogc2Vzc2lvbiBzdGF0ZSAqLwotCi0JLyogZXZlcnl0aGluZyBiZWxvdyBpcyBnb2luZyB0byBiZSBwZXItZXhwZWN0YXRpb24gaW4gbmV3bmF0LAotCSAqIHNpbmNlIHRoZXJlIGNvdWxkIGJlIG1vcmUgdGhhbiBvbmUgY2FsbCB3aXRoaW4gb25lIHNlc3Npb24gKi8KLQllbnVtIHBwdHBfY3RybGNhbGxfc3RhdGUgY3N0YXRlOwkvKiBjYWxsIHN0YXRlICovCi0JX19iZTE2IHBhY19jYWxsX2lkOwkJCS8qIGNhbGwgaWQgb2YgUEFDLCBob3N0IGJ5dGUgb3JkZXIgKi8KLQlfX2JlMTYgcG5zX2NhbGxfaWQ7CQkJLyogY2FsbCBpZCBvZiBQTlMsIGhvc3QgYnl0ZSBvcmRlciAqLwotCi0JLyogaW4gcHJlLTIuNi4xMSB0aGlzIHVzZWQgdG8gYmUgcGVyLWV4cGVjdC4gTm93IGl0IGlzIHBlci1jb25udHJhY2sKLQkgKiBhbmQgdGhlcmVmb3JlIGltcG9zZXMgYSBmaXhlZCBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIG1hcHMgKi8KLQlzdHJ1Y3QgaXBfY3RfZ3JlX2tleW1hcCAqa2V5bWFwX29yaWcsICprZXltYXBfcmVwbHk7Ci19OwotCi0vKiBjb25udHJhY2tfZXhwZWN0IHByaXZhdGUgbWVtYmVyICovCi1zdHJ1Y3QgaXBfY3RfcHB0cF9leHBlY3QgewotCWVudW0gcHB0cF9jdHJsY2FsbF9zdGF0ZSBjc3RhdGU7IAkvKiBjYWxsIHN0YXRlICovCi0JX19iZTE2IHBhY19jYWxsX2lkOwkJCS8qIGNhbGwgaWQgb2YgUEFDICovCi0JX19iZTE2IHBuc19jYWxsX2lkOwkJCS8qIGNhbGwgaWQgb2YgUE5TICovCi19OwotCi0KLSNpZmRlZiBfX0tFUk5FTF9fCi0KLSNkZWZpbmUgSVBfQ09OTlRSX1BQVFAJCVBQVFBfQ09OVFJPTF9QT1JUCi0KLSNkZWZpbmUgUFBUUF9DT05UUk9MX1BPUlQJMTcyMwotCi0jZGVmaW5lIFBQVFBfUEFDS0VUX0NPTlRST0wJMQotI2RlZmluZSBQUFRQX1BBQ0tFVF9NR01UCTIKLQotI2RlZmluZSBQUFRQX01BR0lDX0NPT0tJRQkweDFhMmIzYzRkCi0KLXN0cnVjdCBwcHRwX3BrdF9oZHIgewotCV9fdTE2CXBhY2tldExlbmd0aDsKLQlfX2JlMTYJcGFja2V0VHlwZTsKLQlfX2JlMzIJbWFnaWNDb29raWU7Ci19OwotCi0vKiBQcHRwQ29udHJvbE1lc3NhZ2VUeXBlIHZhbHVlcyAqLwotI2RlZmluZSBQUFRQX1NUQVJUX1NFU1NJT05fUkVRVUVTVAkxCi0jZGVmaW5lIFBQVFBfU1RBUlRfU0VTU0lPTl9SRVBMWQkyCi0jZGVmaW5lIFBQVFBfU1RPUF9TRVNTSU9OX1JFUVVFU1QJMwotI2RlZmluZSBQUFRQX1NUT1BfU0VTU0lPTl9SRVBMWQkJNAotI2RlZmluZSBQUFRQX0VDSE9fUkVRVUVTVAkJNQotI2RlZmluZSBQUFRQX0VDSE9fUkVQTFkJCQk2Ci0jZGVmaW5lIFBQVFBfT1VUX0NBTExfUkVRVUVTVAkJNwotI2RlZmluZSBQUFRQX09VVF9DQUxMX1JFUExZCQk4Ci0jZGVmaW5lIFBQVFBfSU5fQ0FMTF9SRVFVRVNUCQk5Ci0jZGVmaW5lIFBQVFBfSU5fQ0FMTF9SRVBMWQkJMTAKLSNkZWZpbmUgUFBUUF9JTl9DQUxMX0NPTk5FQ1QJCTExCi0jZGVmaW5lIFBQVFBfQ0FMTF9DTEVBUl9SRVFVRVNUCQkxMgotI2RlZmluZSBQUFRQX0NBTExfRElTQ09OTkVDVF9OT1RJRlkJMTMKLSNkZWZpbmUgUFBUUF9XQU5fRVJST1JfTk9USUZZCQkxNAotI2RlZmluZSBQUFRQX1NFVF9MSU5LX0lORk8JCTE1Ci0KLSNkZWZpbmUgUFBUUF9NU0dfTUFYCQkJMTUKLQotLyogUHB0cEdlbmVyYWxFcnJvciB2YWx1ZXMgKi8KLSNkZWZpbmUgUFBUUF9FUlJPUl9DT0RFX05PTkUJCTAKLSNkZWZpbmUgUFBUUF9OT1RfQ09OTkVDVEVECQkxCi0jZGVmaW5lIFBQVFBfQkFEX0ZPUk1BVAkJCTIKLSNkZWZpbmUgUFBUUF9CQURfVkFMVUUJCQkzCi0jZGVmaW5lIFBQVFBfTk9fUkVTT1VSQ0UJCTQKLSNkZWZpbmUgUFBUUF9CQURfQ0FMTElECQkJNQotI2RlZmluZSBQUFRQX1JFTU9WRV9ERVZJQ0VfRVJST1IJNgotCi1zdHJ1Y3QgUHB0cENvbnRyb2xIZWFkZXIgewotCV9fYmUxNgltZXNzYWdlVHlwZTsKLQlfX3UxNglyZXNlcnZlZDsKLX07Ci0KLS8qIEZyYW1pbmdDYXBhYmlsaXR5IEJpdG1hcCBWYWx1ZXMgKi8KLSNkZWZpbmUgUFBUUF9GUkFNRV9DQVBfQVNZTkMJCTB4MQotI2RlZmluZSBQUFRQX0ZSQU1FX0NBUF9TWU5DCQkweDIKLQotLyogQmVhcmVyQ2FwYWJpbGl0eSBCaXRtYXAgVmFsdWVzICovCi0jZGVmaW5lIFBQVFBfQkVBUkVSX0NBUF9BTkFMT0cJCTB4MQotI2RlZmluZSBQUFRQX0JFQVJFUl9DQVBfRElHSVRBTAkJMHgyCi0KLXN0cnVjdCBQcHRwU3RhcnRTZXNzaW9uUmVxdWVzdCB7Ci0JX19iZTE2CXByb3RvY29sVmVyc2lvbjsKLQlfX3UxNglyZXNlcnZlZDE7Ci0JX19iZTMyCWZyYW1pbmdDYXBhYmlsaXR5OwotCV9fYmUzMgliZWFyZXJDYXBhYmlsaXR5OwotCV9fYmUxNgltYXhDaGFubmVsczsKLQlfX2JlMTYJZmlybXdhcmVSZXZpc2lvbjsKLQlfX3U4CWhvc3ROYW1lWzY0XTsKLQlfX3U4CXZlbmRvclN0cmluZ1s2NF07Ci19OwotCi0vKiBQcHRwU3RhcnRTZXNzaW9uUmVzdWx0Q29kZSBWYWx1ZXMgKi8KLSNkZWZpbmUgUFBUUF9TVEFSVF9PSwkJCTEKLSNkZWZpbmUgUFBUUF9TVEFSVF9HRU5FUkFMX0VSUk9SCTIKLSNkZWZpbmUgUFBUUF9TVEFSVF9BTFJFQURZX0NPTk5FQ1RFRAkzCi0jZGVmaW5lIFBQVFBfU1RBUlRfTk9UX0FVVEhPUklaRUQJNAotI2RlZmluZSBQUFRQX1NUQVJUX1VOS05PV05fUFJPVE9DT0wJNQotCi1zdHJ1Y3QgUHB0cFN0YXJ0U2Vzc2lvblJlcGx5IHsKLQlfX2JlMTYJcHJvdG9jb2xWZXJzaW9uOwotCV9fdTgJcmVzdWx0Q29kZTsKLQlfX3U4CWdlbmVyYWxFcnJvckNvZGU7Ci0JX19iZTMyCWZyYW1pbmdDYXBhYmlsaXR5OwotCV9fYmUzMgliZWFyZXJDYXBhYmlsaXR5OwotCV9fYmUxNgltYXhDaGFubmVsczsKLQlfX2JlMTYJZmlybXdhcmVSZXZpc2lvbjsKLQlfX3U4CWhvc3ROYW1lWzY0XTsKLQlfX3U4CXZlbmRvclN0cmluZ1s2NF07Ci19OwotCi0vKiBQcHRwU3RvcFJlYXNvbnMgKi8KLSNkZWZpbmUgUFBUUF9TVE9QX05PTkUJCQkxCi0jZGVmaW5lIFBQVFBfU1RPUF9QUk9UT0NPTAkJMgotI2RlZmluZSBQUFRQX1NUT1BfTE9DQUxfU0hVVERPV04JMwotCi1zdHJ1Y3QgUHB0cFN0b3BTZXNzaW9uUmVxdWVzdCB7Ci0JX191OAlyZWFzb247Ci0JX191OAlyZXNlcnZlZDE7Ci0JX191MTYJcmVzZXJ2ZWQyOwotfTsKLQotLyogUHB0cFN0b3BTZXNzaW9uUmVzdWx0Q29kZSAqLwotI2RlZmluZSBQUFRQX1NUT1BfT0sJCQkxCi0jZGVmaW5lIFBQVFBfU1RPUF9HRU5FUkFMX0VSUk9SCQkyCi0KLXN0cnVjdCBQcHRwU3RvcFNlc3Npb25SZXBseSB7Ci0JX191OAlyZXN1bHRDb2RlOwotCV9fdTgJZ2VuZXJhbEVycm9yQ29kZTsKLQlfX3UxNglyZXNlcnZlZDE7Ci19OwotCi1zdHJ1Y3QgUHB0cEVjaG9SZXF1ZXN0IHsKLQlfX2JlMzIgaWRlbnROdW1iZXI7Ci19OwotCi0vKiBQcHRwRWNob1JlcGx5UmVzdWx0Q29kZSAqLwotI2RlZmluZSBQUFRQX0VDSE9fT0sJCQkxCi0jZGVmaW5lIFBQVFBfRUNIT19HRU5FUkFMX0VSUk9SCQkyCi0KLXN0cnVjdCBQcHRwRWNob1JlcGx5IHsKLQlfX2JlMzIJaWRlbnROdW1iZXI7Ci0JX191OAlyZXN1bHRDb2RlOwotCV9fdTgJZ2VuZXJhbEVycm9yQ29kZTsKLQlfX3UxNglyZXNlcnZlZDsKLX07Ci0KLS8qIFBwdHBGcmFtaW5nVHlwZSAqLwotI2RlZmluZSBQUFRQX0FTWU5DX0ZSQU1JTkcJCTEKLSNkZWZpbmUgUFBUUF9TWU5DX0ZSQU1JTkcJCTIKLSNkZWZpbmUgUFBUUF9ET05UX0NBUkVfRlJBTUlORwkJMwotCi0vKiBQcHRwQ2FsbEJlYXJlclR5cGUgKi8KLSNkZWZpbmUgUFBUUF9BTkFMT0dfVFlQRQkJMQotI2RlZmluZSBQUFRQX0RJR0lUQUxfVFlQRQkJMgotI2RlZmluZSBQUFRQX0RPTlRfQ0FSRV9CRUFSRVJfVFlQRQkzCi0KLXN0cnVjdCBQcHRwT3V0Q2FsbFJlcXVlc3QgewotCV9fYmUxNgljYWxsSUQ7Ci0JX19iZTE2CWNhbGxTZXJpYWxOdW1iZXI7Ci0JX19iZTMyCW1pbkJQUzsKLQlfX2JlMzIJbWF4QlBTOwotCV9fYmUzMgliZWFyZXJUeXBlOwotCV9fYmUzMglmcmFtaW5nVHlwZTsKLQlfX2JlMTYJcGFja2V0V2luZG93OwotCV9fYmUxNglwYWNrZXRQcm9jRGVsYXk7Ci0JX19iZTE2CXBob25lTnVtYmVyTGVuZ3RoOwotCV9fdTE2CXJlc2VydmVkMTsKLQlfX3U4CXBob25lTnVtYmVyWzY0XTsKLQlfX3U4CXN1YkFkZHJlc3NbNjRdOwotfTsKLQotLyogUHB0cENhbGxSZXN1bHRDb2RlICovCi0jZGVmaW5lIFBQVFBfT1VUQ0FMTF9DT05ORUNUCQkxCi0jZGVmaW5lIFBQVFBfT1VUQ0FMTF9HRU5FUkFMX0VSUk9SCTIKLSNkZWZpbmUgUFBUUF9PVVRDQUxMX05PX0NBUlJJRVIJCTMKLSNkZWZpbmUgUFBUUF9PVVRDQUxMX0JVU1kJCTQKLSNkZWZpbmUgUFBUUF9PVVRDQUxMX05PX0RJQUxfVE9ORQk1Ci0jZGVmaW5lIFBQVFBfT1VUQ0FMTF9USU1FT1VUCQk2Ci0jZGVmaW5lIFBQVFBfT1VUQ0FMTF9ET05UX0FDQ0VQVAk3Ci0KLXN0cnVjdCBQcHRwT3V0Q2FsbFJlcGx5IHsKLQlfX2JlMTYJY2FsbElEOwotCV9fYmUxNglwZWVyc0NhbGxJRDsKLQlfX3U4CXJlc3VsdENvZGU7Ci0JX191OAlnZW5lcmFsRXJyb3JDb2RlOwotCV9fYmUxNgljYXVzZUNvZGU7Ci0JX19iZTMyCWNvbm5lY3RTcGVlZDsKLQlfX2JlMTYJcGFja2V0V2luZG93OwotCV9fYmUxNglwYWNrZXRQcm9jRGVsYXk7Ci0JX19iZTMyCXBoeXNDaGFubmVsSUQ7Ci19OwotCi1zdHJ1Y3QgUHB0cEluQ2FsbFJlcXVlc3QgewotCV9fYmUxNgljYWxsSUQ7Ci0JX19iZTE2CWNhbGxTZXJpYWxOdW1iZXI7Ci0JX19iZTMyCWNhbGxCZWFyZXJUeXBlOwotCV9fYmUzMglwaHlzQ2hhbm5lbElEOwotCV9fYmUxNglkaWFsZWROdW1iZXJMZW5ndGg7Ci0JX19iZTE2CWRpYWxpbmdOdW1iZXJMZW5ndGg7Ci0JX191OAlkaWFsZWROdW1iZXJbNjRdOwotCV9fdTgJZGlhbGluZ051bWJlcls2NF07Ci0JX191OAlzdWJBZGRyZXNzWzY0XTsKLX07Ci0KLS8qIFBwdHBJbkNhbGxSZXN1bHRDb2RlICovCi0jZGVmaW5lIFBQVFBfSU5DQUxMX0FDQ0VQVAkJMQotI2RlZmluZSBQUFRQX0lOQ0FMTF9HRU5FUkFMX0VSUk9SCTIKLSNkZWZpbmUgUFBUUF9JTkNBTExfRE9OVF9BQ0NFUFQJCTMKLQotc3RydWN0IFBwdHBJbkNhbGxSZXBseSB7Ci0JX19iZTE2CWNhbGxJRDsKLQlfX2JlMTYJcGVlcnNDYWxsSUQ7Ci0JX191OAlyZXN1bHRDb2RlOwotCV9fdTgJZ2VuZXJhbEVycm9yQ29kZTsKLQlfX2JlMTYJcGFja2V0V2luZG93OwotCV9fYmUxNglwYWNrZXRQcm9jRGVsYXk7Ci0JX191MTYJcmVzZXJ2ZWQ7Ci19OwotCi1zdHJ1Y3QgUHB0cEluQ2FsbENvbm5lY3RlZCB7Ci0JX19iZTE2CXBlZXJzQ2FsbElEOwotCV9fdTE2CXJlc2VydmVkOwotCV9fYmUzMgljb25uZWN0U3BlZWQ7Ci0JX19iZTE2CXBhY2tldFdpbmRvdzsKLQlfX2JlMTYJcGFja2V0UHJvY0RlbGF5OwotCV9fYmUzMgljYWxsRnJhbWluZ1R5cGU7Ci19OwotCi1zdHJ1Y3QgUHB0cENsZWFyQ2FsbFJlcXVlc3QgewotCV9fYmUxNgljYWxsSUQ7Ci0JX191MTYJcmVzZXJ2ZWQ7Ci19OwotCi1zdHJ1Y3QgUHB0cENhbGxEaXNjb25uZWN0Tm90aWZ5IHsKLQlfX2JlMTYJY2FsbElEOwotCV9fdTgJcmVzdWx0Q29kZTsKLQlfX3U4CWdlbmVyYWxFcnJvckNvZGU7Ci0JX19iZTE2CWNhdXNlQ29kZTsKLQlfX3UxNglyZXNlcnZlZDsKLQlfX3U4CWNhbGxTdGF0aXN0aWNzWzEyOF07Ci19OwotCi1zdHJ1Y3QgUHB0cFdhbkVycm9yTm90aWZ5IHsKLQlfX2JlMTYJcGVlcnNDYWxsSUQ7Ci0JX191MTYJcmVzZXJ2ZWQ7Ci0JX19iZTMyCWNyY0Vycm9yczsKLQlfX2JlMzIJZnJhbWluZ0Vycm9yczsKLQlfX2JlMzIJaGFyZHdhcmVPdmVyUnVuczsKLQlfX2JlMzIJYnVmZmVyT3ZlclJ1bnM7Ci0JX19iZTMyCXRpbWVvdXRFcnJvcnM7Ci0JX19iZTMyCWFsaWdubWVudEVycm9yczsKLX07Ci0KLXN0cnVjdCBQcHRwU2V0TGlua0luZm8gewotCV9fYmUxNglwZWVyc0NhbGxJRDsKLQlfX3UxNglyZXNlcnZlZDsKLQlfX2JlMzIJc2VuZEFjY207Ci0JX19iZTMyCXJlY3ZBY2NtOwotfTsKLQotdW5pb24gcHB0cF9jdHJsX3VuaW9uIHsKLQlzdHJ1Y3QgUHB0cFN0YXJ0U2Vzc2lvblJlcXVlc3QJc3JlcTsKLQlzdHJ1Y3QgUHB0cFN0YXJ0U2Vzc2lvblJlcGx5CXNyZXA7Ci0Jc3RydWN0IFBwdHBTdG9wU2Vzc2lvblJlcXVlc3QJc3RyZXE7Ci0Jc3RydWN0IFBwdHBTdG9wU2Vzc2lvblJlcGx5CXN0cmVwOwotCXN0cnVjdCBQcHRwT3V0Q2FsbFJlcXVlc3QJb2NyZXE7Ci0Jc3RydWN0IFBwdHBPdXRDYWxsUmVwbHkJCW9jYWNrOwotCXN0cnVjdCBQcHRwSW5DYWxsUmVxdWVzdAlpY3JlcTsKLQlzdHJ1Y3QgUHB0cEluQ2FsbFJlcGx5CQlpY2FjazsKLQlzdHJ1Y3QgUHB0cEluQ2FsbENvbm5lY3RlZAlpY2NvbjsKLQlzdHJ1Y3QgUHB0cENsZWFyQ2FsbFJlcXVlc3QJY2xycmVxOwotCXN0cnVjdCBQcHRwQ2FsbERpc2Nvbm5lY3ROb3RpZnkgZGlzYzsKLQlzdHJ1Y3QgUHB0cFdhbkVycm9yTm90aWZ5CXdhbmVycjsKLQlzdHJ1Y3QgUHB0cFNldExpbmtJbmZvCQlzZXRsaW5rOwotfTsKLQotZXh0ZXJuIGludAotKCppcF9uYXRfcHB0cF9ob29rX291dGJvdW5kKShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCi0JCQkgIHN0cnVjdCBpcF9jb25udHJhY2sgKmN0LAotCQkJICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKLQkJCSAgc3RydWN0IFBwdHBDb250cm9sSGVhZGVyICpjdGxoLAotCQkJICB1bmlvbiBwcHRwX2N0cmxfdW5pb24gKnBwdHBSZXEpOwotCi1leHRlcm4gaW50Ci0oKmlwX25hdF9wcHRwX2hvb2tfaW5ib3VuZCkoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAotCQkJICBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKLQkJCSAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCi0JCQkgIHN0cnVjdCBQcHRwQ29udHJvbEhlYWRlciAqY3RsaCwKLQkJCSAgdW5pb24gcHB0cF9jdHJsX3VuaW9uICpwcHRwUmVxKTsKLQotZXh0ZXJuIHZvaWQKLSgqaXBfbmF0X3BwdHBfaG9va19leHBfZ3JlKShzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqZXhwX29yaWcsCi0JCQkgICAgc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmV4cF9yZXBseSk7Ci0KLWV4dGVybiB2b2lkCi0oKmlwX25hdF9wcHRwX2hvb2tfZXhwZWN0Zm4pKHN0cnVjdCBpcF9jb25udHJhY2sgKmN0LAotCQkJICAgICBzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqZXhwKTsKLSNlbmRpZiAvKiBfX0tFUk5FTF9fICovCi0jZW5kaWYgLyogX0NPTk5UUkFDS19QUFRQX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX3Byb3RvX2dyZS5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfcHJvdG9fZ3JlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzNzFlMGYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfcHJvdG9fZ3JlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotI2lmbmRlZiBfQ09OTlRSQUNLX1BST1RPX0dSRV9ICi0jZGVmaW5lIF9DT05OVFJBQ0tfUFJPVE9fR1JFX0gKLSNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+Ci0KLS8qIEdSRSBQUk9UT0NPTCBIRUFERVIgKi8KLQotLyogR1JFIFZlcnNpb24gZmllbGQgKi8KLSNkZWZpbmUgR1JFX1ZFUlNJT05fMTcwMQkweDAKLSNkZWZpbmUgR1JFX1ZFUlNJT05fUFBUUAkweDEKLQotLyogR1JFIFByb3RvY29sIGZpZWxkICovCi0jZGVmaW5lIEdSRV9QUk9UT0NPTF9QUFRQCTB4ODgwQgotCi0vKiBHUkUgRmxhZ3MgKi8KLSNkZWZpbmUgR1JFX0ZMQUdfQwkJMHg4MAotI2RlZmluZSBHUkVfRkxBR19SCQkweDQwCi0jZGVmaW5lIEdSRV9GTEFHX0sJCTB4MjAKLSNkZWZpbmUgR1JFX0ZMQUdfUwkJMHgxMAotI2RlZmluZSBHUkVfRkxBR19BCQkweDgwCi0KLSNkZWZpbmUgR1JFX0lTX0MoZikJKChmKSZHUkVfRkxBR19DKQotI2RlZmluZSBHUkVfSVNfUihmKQkoKGYpJkdSRV9GTEFHX1IpCi0jZGVmaW5lIEdSRV9JU19LKGYpCSgoZikmR1JFX0ZMQUdfSykKLSNkZWZpbmUgR1JFX0lTX1MoZikJKChmKSZHUkVfRkxBR19TKQotI2RlZmluZSBHUkVfSVNfQShmKQkoKGYpJkdSRV9GTEFHX0EpCi0KLS8qIEdSRSBpcyBhIG1lc3M6IEZvdXIgZGlmZmVyZW50IHN0YW5kYXJkcyAqLwotc3RydWN0IGdyZV9oZHIgewotI2lmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxEKQotCV9fdTE2CXJlYzozLAotCQlzcnI6MSwKLQkJc2VxOjEsCi0JCWtleToxLAotCQlyb3V0aW5nOjEsCi0JCWNzdW06MSwKLQkJdmVyc2lvbjozLAotCQlyZXNlcnZlZDo0LAotCQlhY2s6MTsKLSNlbGlmIGRlZmluZWQoX19CSUdfRU5ESUFOX0JJVEZJRUxEKQotCV9fdTE2CWNzdW06MSwKLQkJcm91dGluZzoxLAotCQlrZXk6MSwKLQkJc2VxOjEsCi0JCXNycjoxLAotCQlyZWM6MywKLQkJYWNrOjEsCi0JCXJlc2VydmVkOjQsCi0JCXZlcnNpb246MzsKLSNlbHNlCi0jZXJyb3IgIkFkanVzdCB5b3VyIDxhc20vYnl0ZW9yZGVyLmg+IGRlZmluZXMiCi0jZW5kaWYKLQlfX2JlMTYJcHJvdG9jb2w7Ci19OwotCi0vKiBtb2RpZmllZCBHUkUgaGVhZGVyIGZvciBQUFRQICovCi1zdHJ1Y3QgZ3JlX2hkcl9wcHRwIHsKLQlfX3U4ICAgZmxhZ3M7CQkvKiBiaXRmaWVsZCAqLwotCV9fdTggICB2ZXJzaW9uOwkJLyogc2hvdWxkIGJlIEdSRV9WRVJTSU9OX1BQVFAgKi8KLQlfX2JlMTYgcHJvdG9jb2w7CS8qIHNob3VsZCBiZSBHUkVfUFJPVE9DT0xfUFBUUCAqLwotCV9fYmUxNiBwYXlsb2FkX2xlbjsJLyogc2l6ZSBvZiBwcHAgcGF5bG9hZCwgbm90IGluYy4gZ3JlIGhlYWRlciAqLwotCV9fYmUxNiBjYWxsX2lkOwkJLyogcGVlcidzIGNhbGxfaWQgZm9yIHRoaXMgc2Vzc2lvbiAqLwotCV9fYmUzMiBzZXE7CQkvKiBzZXF1ZW5jZSBudW1iZXIuICBQcmVzZW50IGlmIFM9PTEgKi8KLQlfX2JlMzIgYWNrOwkJLyogc2VxIG51bWJlciBvZiBoaWdoZXN0IHBhY2tldCByZWNpZXZlZCBieSAqLwotCQkJCS8qICBzZW5kZXIgaW4gdGhpcyBzZXNzaW9uICovCi19OwotCi0KLS8qIHRoaXMgaXMgcGFydCBvZiBpcF9jb25udHJhY2sgKi8KLXN0cnVjdCBpcF9jdF9ncmUgewotCXVuc2lnbmVkIGludCBzdHJlYW1fdGltZW91dDsKLQl1bnNpZ25lZCBpbnQgdGltZW91dDsKLX07Ci0KLSNpZmRlZiBfX0tFUk5FTF9fCi1zdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdDsKLXN0cnVjdCBpcF9jb25udHJhY2s7Ci0KLS8qIHN0cnVjdHVyZSBmb3Igb3JpZ2luYWwgPC0+IHJlcGx5IGtleW1hcCAqLwotc3RydWN0IGlwX2N0X2dyZV9rZXltYXAgewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQotCXN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgdHVwbGU7Ci19OwotCi0vKiBhZGQgbmV3IHR1cGxlLT5rZXlfcmVwbHkgcGFpciB0byBrZXltYXAgKi8KLWludCBpcF9jdF9ncmVfa2V5bWFwX2FkZChzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKLQkJCSBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0LAotCQkJIGludCByZXBseSk7Ci0KLS8qIGRlbGV0ZSBrZXltYXAgZW50cmllcyAqLwotdm9pZCBpcF9jdF9ncmVfa2V5bWFwX2Rlc3Ryb3koc3RydWN0IGlwX2Nvbm50cmFjayAqY3QpOwotCi0KLS8qIGdldCBwb2ludGVyIHRvIGdyZSBrZXksIGlmIHByZXNlbnQgKi8KLXN0YXRpYyBpbmxpbmUgX19iZTMyICpncmVfa2V5KHN0cnVjdCBncmVfaGRyICpncmVoKQotewotCWlmICghZ3JlaC0+a2V5KQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoZ3JlaC0+Y3N1bSB8fCBncmVoLT5yb3V0aW5nKQotCQlyZXR1cm4gKF9fYmUzMiAqKSAoZ3JlaCtzaXplb2YoKmdyZWgpKzQpOwotCXJldHVybiAoX19iZTMyICopIChncmVoK3NpemVvZigqZ3JlaCkpOwotfQotCi0vKiBnZXQgcG9pbnRlciBvdCBncmUgY3N1bSwgaWYgcHJlc2VudCAqLwotc3RhdGljIGlubGluZSBfX3N1bTE2ICpncmVfY3N1bShzdHJ1Y3QgZ3JlX2hkciAqZ3JlaCkKLXsKLQlpZiAoIWdyZWgtPmNzdW0pCi0JCXJldHVybiBOVUxMOwotCXJldHVybiAoX19zdW0xNiAqKSAoZ3JlaCtzaXplb2YoKmdyZWgpKTsKLX0KLQotI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KLQotI2VuZGlmIC8qIF9DT05OVFJBQ0tfUFJPVE9fR1JFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX3Byb3RvY29sLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19wcm90b2NvbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzc2Yjg3Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX3Byb3RvY29sLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKiBIZWFkZXIgZm9yIHVzZSBpbiBkZWZpbmluZyBhIGdpdmVuIHByb3RvY29sIGZvciBjb25uZWN0aW9uIHRyYWNraW5nLiAqLwotI2lmbmRlZiBfSVBfQ09OTlRSQUNLX1BST1RPQ09MX0gKLSNkZWZpbmUgX0lQX0NPTk5UUkFDS19QUk9UT0NPTF9ICi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL25mbmV0bGlua19jb25udHJhY2suaD4KLQotc3RydWN0IHNlcV9maWxlOwotCi1zdHJ1Y3QgaXBfY29ubnRyYWNrX3Byb3RvY29sCi17Ci0JLyogUHJvdG9jb2wgbnVtYmVyLiAqLwotCXVfaW50OF90IHByb3RvOwotCi0JLyogUHJvdG9jb2wgbmFtZSAqLwotCWNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkvKiBUcnkgdG8gZmlsbCBpbiB0aGUgdGhpcmQgYXJnOiBkYXRhb2ZmIGlzIG9mZnNldCBwYXN0IElQCi0gICAgICAgICAgIGhkci4gIFJldHVybiB0cnVlIGlmIHBvc3NpYmxlLiAqLwotCWludCAoKnBrdF90b190dXBsZSkoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCSAgIHVuc2lnbmVkIGludCBkYXRhb2ZmLAotCQkJICAgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUpOwotCi0JLyogSW52ZXJ0IHRoZSBwZXItcHJvdG8gcGFydCBvZiB0aGUgdHVwbGU6IGllLiB0dXJuIHhtaXQgaW50byByZXBseS4KLQkgKiBTb21lIHBhY2tldHMgY2FuJ3QgYmUgaW52ZXJ0ZWQ6IHJldHVybiAwIGluIHRoYXQgY2FzZS4KLQkgKi8KLQlpbnQgKCppbnZlcnRfdHVwbGUpKHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKmludmVyc2UsCi0JCQkgICAgY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqb3JpZyk7Ci0KLQkvKiBQcmludCBvdXQgdGhlIHBlci1wcm90b2NvbCBwYXJ0IG9mIHRoZSB0dXBsZS4gUmV0dXJuIGxpa2Ugc2VxXyogKi8KLQlpbnQgKCpwcmludF90dXBsZSkoc3RydWN0IHNlcV9maWxlICosCi0JCQkgICBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICopOwotCi0JLyogUHJpbnQgb3V0IHRoZSBwcml2YXRlIHBhcnQgb2YgdGhlIGNvbm50cmFjay4gKi8KLQlpbnQgKCpwcmludF9jb25udHJhY2spKHN0cnVjdCBzZXFfZmlsZSAqLCBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrICopOwotCi0JLyogUmV0dXJucyB2ZXJkaWN0IGZvciBwYWNrZXQsIG9yIC0xIGZvciBpbnZhbGlkLiAqLwotCWludCAoKnBhY2tldCkoc3RydWN0IGlwX2Nvbm50cmFjayAqY29ubnRyYWNrLAotCQkgICAgICBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkgICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbyk7Ci0KLQkvKiBDYWxsZWQgd2hlbiBhIG5ldyBjb25uZWN0aW9uIGZvciB0aGlzIHByb3RvY29sIGZvdW5kOwotCSAqIHJldHVybnMgVFJVRSBpZiBpdCdzIE9LLiAgSWYgc28sIHBhY2tldCgpIGNhbGxlZCBuZXh0LiAqLwotCWludCAoKm5ldykoc3RydWN0IGlwX2Nvbm50cmFjayAqY29ubnRyYWNrLCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLQotCS8qIENhbGxlZCB3aGVuIGEgY29ubnRyYWNrIGVudHJ5IGlzIGRlc3Ryb3llZCAqLwotCXZvaWQgKCpkZXN0cm95KShzdHJ1Y3QgaXBfY29ubnRyYWNrICpjb25udHJhY2spOwotCi0JaW50ICgqZXJyb3IpKHN0cnVjdCBza19idWZmICpza2IsIGVudW0gaXBfY29ubnRyYWNrX2luZm8gKmN0aW5mbywKLQkJICAgICB1bnNpZ25lZCBpbnQgaG9va251bSk7Ci0KLQkvKiBjb252ZXJ0IHByb3RvaW5mbyB0byBuZm5ldGluayBhdHRyaWJ1dGVzICovCi0JaW50ICgqdG9fbmZhdHRyKShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmZhdHRyICpuZmEsCi0JCQkgY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFjayAqY3QpOwotCi0JLyogY29udmVydCBuZm5ldGxpbmsgYXR0cmlidXRlcyB0byBwcm90b2luZm8gKi8KLQlpbnQgKCpmcm9tX25mYXR0cikoc3RydWN0IG5mYXR0ciAqdGJbXSwgc3RydWN0IGlwX2Nvbm50cmFjayAqY3QpOwotCi0JaW50ICgqdHVwbGVfdG9fbmZhdHRyKShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJICAgICAgIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnQpOwotCWludCAoKm5mYXR0cl90b190dXBsZSkoc3RydWN0IG5mYXR0ciAqdGJbXSwKLQkJCSAgICAgICBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0KTsKLQotCS8qIE1vZHVsZSAoaWYgYW55KSB3aGljaCB0aGlzIGlzIGNvbm5lY3RlZCB0by4gKi8KLQlzdHJ1Y3QgbW9kdWxlICptZTsKLX07Ci0KLS8qIFByb3RvY29sIHJlZ2lzdHJhdGlvbi4gKi8KLWV4dGVybiBpbnQgaXBfY29ubnRyYWNrX3Byb3RvY29sX3JlZ2lzdGVyKHN0cnVjdCBpcF9jb25udHJhY2tfcHJvdG9jb2wgKnByb3RvKTsKLWV4dGVybiB2b2lkIGlwX2Nvbm50cmFja19wcm90b2NvbF91bnJlZ2lzdGVyKHN0cnVjdCBpcF9jb25udHJhY2tfcHJvdG9jb2wgKnByb3RvKTsKLS8qIEV4aXN0aW5nIGJ1aWx0LWluIHByb3RvY29scyAqLwotZXh0ZXJuIHN0cnVjdCBpcF9jb25udHJhY2tfcHJvdG9jb2wgaXBfY29ubnRyYWNrX3Byb3RvY29sX3RjcDsKLWV4dGVybiBzdHJ1Y3QgaXBfY29ubnRyYWNrX3Byb3RvY29sIGlwX2Nvbm50cmFja19wcm90b2NvbF91ZHA7Ci1leHRlcm4gc3RydWN0IGlwX2Nvbm50cmFja19wcm90b2NvbCBpcF9jb25udHJhY2tfcHJvdG9jb2xfaWNtcDsKLWV4dGVybiBzdHJ1Y3QgaXBfY29ubnRyYWNrX3Byb3RvY29sIGlwX2Nvbm50cmFja19nZW5lcmljX3Byb3RvY29sOwotZXh0ZXJuIGludCBpcF9jb25udHJhY2tfcHJvdG9jb2xfdGNwX2luaXQodm9pZCk7Ci0KLS8qIExvZyBpbnZhbGlkIHBhY2tldHMgKi8KLWV4dGVybiB1bnNpZ25lZCBpbnQgaXBfY3RfbG9nX2ludmFsaWQ7Ci0KLWV4dGVybiBpbnQgaXBfY3RfcG9ydF90dXBsZV90b19uZmF0dHIoc3RydWN0IHNrX2J1ZmYgKiwKLQkJCQkgICAgICBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICopOwotZXh0ZXJuIGludCBpcF9jdF9wb3J0X25mYXR0cl90b190dXBsZShzdHJ1Y3QgbmZhdHRyICp0YltdLAotCQkJCSAgICAgIHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKik7Ci0KLSNpZmRlZiBDT05GSUdfU1lTQ1RMCi0jaWZkZWYgREVCVUdfSU5WQUxJRF9QQUNLRVRTCi0jZGVmaW5lIExPR19JTlZBTElEKHByb3RvKSBcCi0JKGlwX2N0X2xvZ19pbnZhbGlkID09IChwcm90bykgfHwgaXBfY3RfbG9nX2ludmFsaWQgPT0gSVBQUk9UT19SQVcpCi0jZWxzZQotI2RlZmluZSBMT0dfSU5WQUxJRChwcm90bykgXAotCSgoaXBfY3RfbG9nX2ludmFsaWQgPT0gKHByb3RvKSB8fCBpcF9jdF9sb2dfaW52YWxpZCA9PSBJUFBST1RPX1JBVykgXAotCSAmJiBuZXRfcmF0ZWxpbWl0KCkpCi0jZW5kaWYKLSNlbHNlCi0jZGVmaW5lIExPR19JTlZBTElEKHByb3RvKSAwCi0jZW5kaWYgLyogQ09ORklHX1NZU0NUTCAqLwotCi0jZW5kaWYgLypfSVBfQ09OTlRSQUNLX1BST1RPQ09MX0gqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfc2N0cC5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfc2N0cC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDk5YTA0Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX3NjdHAuaAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotI2lmbmRlZiBfSVBfQ09OTlRSQUNLX1NDVFBfSAotI2RlZmluZSBfSVBfQ09OTlRSQUNLX1NDVFBfSAotCi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19zY3RwLmg+Ci0KLSNlbmRpZiAvKiBfSVBfQ09OTlRSQUNLX1NDVFBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfc2lwLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19zaXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVmNmM2NC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19zaXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLSNpZm5kZWYgX19JUF9DT05OVFJBQ0tfU0lQX0hfXwotI2RlZmluZSBfX0lQX0NPTk5UUkFDS19TSVBfSF9fCi0jaWZkZWYgX19LRVJORUxfXwotCi0jZGVmaW5lIFNJUF9QT1JUCTUwNjAKLSNkZWZpbmUgU0lQX1RJTUVPVVQJMzYwMAotCi1lbnVtIHNpcF9oZWFkZXJfcG9zIHsKLQlQT1NfUkVHX1JFUV9VUkksCi0JUE9TX1JFUV9VUkksCi0JUE9TX0ZST00sCi0JUE9TX1RPLAotCVBPU19WSUEsCi0JUE9TX0NPTlRBQ1QsCi0JUE9TX0NPTlRFTlQsCi0JUE9TX01FRElBLAotCVBPU19PV05FUiwKLQlQT1NfQ09OTkVDVElPTiwKLQlQT1NfU0RQX0hFQURFUiwKLX07Ci0KLWV4dGVybiB1bnNpZ25lZCBpbnQgKCppcF9uYXRfc2lwX2hvb2spKHN0cnVjdCBza19idWZmICoqcHNrYiwKLQkJCQkgICAgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCi0JCQkJICAgICAgIHN0cnVjdCBpcF9jb25udHJhY2sgKmN0LAotCQkJCSAgICAgICBjb25zdCBjaGFyICoqZHB0cik7Ci1leHRlcm4gdW5zaWduZWQgaW50ICgqaXBfbmF0X3NkcF9ob29rKShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCi0JCQkJICAgICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAotCQkJCSAgICAgICBzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqZXhwLAotCQkJCSAgICAgICBjb25zdCBjaGFyICpkcHRyKTsKLQotZXh0ZXJuIGludCBjdF9zaXBfZ2V0X2luZm8oY29uc3QgY2hhciAqZHB0ciwgc2l6ZV90IGRsZW4sCi0JCQkgICB1bnNpZ25lZCBpbnQgKm1hdGNob2ZmLAotCQkJICAgdW5zaWduZWQgaW50ICptYXRjaGxlbiwKLQkJCSAgIGVudW0gc2lwX2hlYWRlcl9wb3MgcG9zKTsKLWV4dGVybiBpbnQgY3Rfc2lwX2xubGVuKGNvbnN0IGNoYXIgKmxpbmUsIGNvbnN0IGNoYXIgKmxpbWl0KTsKLWV4dGVybiBjb25zdCBjaGFyICpjdF9zaXBfc2VhcmNoKGNvbnN0IGNoYXIgKm5lZWRsZSwgY29uc3QgY2hhciAqaGF5c3RhY2ssCi0JCQkJIHNpemVfdCBuZWVkbGVfbGVuLCBzaXplX3QgaGF5c3RhY2tfbGVuLAotCQkJCSBpbnQgY2FzZV9zZW5zaXRpdmUpOwotI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KLSNlbmRpZiAvKiBfX0lQX0NPTk5UUkFDS19TSVBfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja190Y3AuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX3RjcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzZiOGZiLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX3RjcC5oCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jaWZuZGVmIF9JUF9DT05OVFJBQ0tfVENQX0gKLSNkZWZpbmUgX0lQX0NPTk5UUkFDS19UQ1BfSAotCi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja190Y3AuaD4KLQotI2VuZGlmIC8qIF9JUF9DT05OVFJBQ0tfVENQX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX3RmdHAuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX3RmdHAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQwNGZjMC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja190ZnRwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jaWZuZGVmIF9JUF9DVF9URlRQCi0jZGVmaW5lIF9JUF9DVF9URlRQCi0KLSNkZWZpbmUgVEZUUF9QT1JUIDY5Ci0KLXN0cnVjdCB0ZnRwaGRyIHsKLQlfX2JlMTYgb3Bjb2RlOwotfTsKLQotI2RlZmluZSBURlRQX09QQ09ERV9SRUFECTEKLSNkZWZpbmUgVEZUUF9PUENPREVfV1JJVEUJMgotI2RlZmluZSBURlRQX09QQ09ERV9EQVRBCTMKLSNkZWZpbmUgVEZUUF9PUENPREVfQUNLCQk0Ci0jZGVmaW5lIFRGVFBfT1BDT0RFX0VSUk9SCTUKLQotZXh0ZXJuIHVuc2lnbmVkIGludCAoKmlwX25hdF90ZnRwX2hvb2spKHN0cnVjdCBza19idWZmICoqcHNrYiwKLQkJCQkgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCi0JCQkJIHN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpleHApOwotCi0jZW5kaWYgLyogX0lQX0NUX1RGVFAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX3R1cGxlLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja190dXBsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjI4YmRlLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX3R1cGxlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotI2lmbmRlZiBfSVBfQ09OTlRSQUNLX1RVUExFX0gKLSNkZWZpbmUgX0lQX0NPTk5UUkFDS19UVVBMRV9ICi0KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfdHVwbGVfY29tbW9uLmg+Ci0KLS8qIEEgYHR1cGxlJyBpcyBhIHN0cnVjdHVyZSBjb250YWluaW5nIHRoZSBpbmZvcm1hdGlvbiB0byB1bmlxdWVseQotICBpZGVudGlmeSBhIGNvbm5lY3Rpb24uICBpZS4gaWYgdHdvIHBhY2tldHMgaGF2ZSB0aGUgc2FtZSB0dXBsZSwgdGhleQotICBhcmUgaW4gdGhlIHNhbWUgY29ubmVjdGlvbjsgaWYgbm90LCB0aGV5IGFyZSBub3QuCi0KLSAgV2UgZGl2aWRlIHRoZSBzdHJ1Y3R1cmUgYWxvbmcgIm1hbmlwdWxhdGFibGUiIGFuZAotICAibm9uLW1hbmlwdWxhdGFibGUiIGxpbmVzLCBmb3IgdGhlIGJlbmVmaXQgb2YgdGhlIE5BVCBjb2RlLgotKi8KLQotLyogVGhlIHByb3RvY29sLXNwZWNpZmljIG1hbmlwdWxhYmxlIHBhcnRzIG9mIHRoZSB0dXBsZTogYWx3YXlzIGluCi0gICBuZXR3b3JrIG9yZGVyISAqLwotdW5pb24gaXBfY29ubnRyYWNrX21hbmlwX3Byb3RvCi17Ci0JLyogQWRkIG90aGVyIHByb3RvY29scyBoZXJlLiAqLwotCXVfaW50MTZfdCBhbGw7Ci0KLQlzdHJ1Y3QgewotCQlfX2JlMTYgcG9ydDsKLQl9IHRjcDsKLQlzdHJ1Y3QgewotCQlfX2JlMTYgcG9ydDsKLQl9IHVkcDsKLQlzdHJ1Y3QgewotCQlfX2JlMTYgaWQ7Ci0JfSBpY21wOwotCXN0cnVjdCB7Ci0JCV9fYmUxNiBwb3J0OwotCX0gc2N0cDsKLQlzdHJ1Y3QgewotCQlfX2JlMTYga2V5OwkvKiBrZXkgaXMgMzJiaXQsIHBwdHAgb25seSB1c2VzIDE2ICovCi0JfSBncmU7Ci19OwotCi0vKiBUaGUgbWFuaXB1bGFibGUgcGFydCBvZiB0aGUgdHVwbGUuICovCi1zdHJ1Y3QgaXBfY29ubnRyYWNrX21hbmlwCi17Ci0JX19iZTMyIGlwOwotCXVuaW9uIGlwX2Nvbm50cmFja19tYW5pcF9wcm90byB1OwotfTsKLQotLyogVGhpcyBjb250YWlucyB0aGUgaW5mb3JtYXRpb24gdG8gZGlzdGluZ3Vpc2ggYSBjb25uZWN0aW9uLiAqLwotc3RydWN0IGlwX2Nvbm50cmFja190dXBsZQotewotCXN0cnVjdCBpcF9jb25udHJhY2tfbWFuaXAgc3JjOwotCi0JLyogVGhlc2UgYXJlIHRoZSBwYXJ0cyBvZiB0aGUgdHVwbGUgd2hpY2ggYXJlIGZpeGVkLiAqLwotCXN0cnVjdCB7Ci0JCV9fYmUzMiBpcDsKLQkJdW5pb24gewotCQkJLyogQWRkIG90aGVyIHByb3RvY29scyBoZXJlLiAqLwotCQkJdV9pbnQxNl90IGFsbDsKLQotCQkJc3RydWN0IHsKLQkJCQlfX2JlMTYgcG9ydDsKLQkJCX0gdGNwOwotCQkJc3RydWN0IHsKLQkJCQlfX2JlMTYgcG9ydDsKLQkJCX0gdWRwOwotCQkJc3RydWN0IHsKLQkJCQl1X2ludDhfdCB0eXBlLCBjb2RlOwotCQkJfSBpY21wOwotCQkJc3RydWN0IHsKLQkJCQlfX2JlMTYgcG9ydDsKLQkJCX0gc2N0cDsKLQkJCXN0cnVjdCB7Ci0JCQkJX19iZTE2IGtleTsJLyoga2V5IGlzIDMyYml0LCAKLQkJCQkJCSAqIHBwdHAgb25seSB1c2VzIDE2ICovCi0JCQl9IGdyZTsKLQkJfSB1OwotCi0JCS8qIFRoZSBwcm90b2NvbC4gKi8KLQkJdV9pbnQ4X3QgcHJvdG9udW07Ci0KLQkJLyogVGhlIGRpcmVjdGlvbiAoZm9yIHR1cGxlaGFzaCkgKi8KLQkJdV9pbnQ4X3QgZGlyOwotCX0gZHN0OwotfTsKLQotLyogVGhpcyBpcyBvcHRpbWl6ZWQgb3Bwb3NlZCB0byBhIG1lbXNldCBvZiB0aGUgd2hvbGUgc3RydWN0dXJlLiAgRXZlcnl0aGluZyB3ZQotICogcmVhbGx5IGNhcmUgYWJvdXQgaXMgdGhlICBzb3VyY2UvZGVzdGluYXRpb24gdW5pb25zICovCi0jZGVmaW5lIElQX0NUX1RVUExFX1VfQkxBTksodHVwbGUpIAkJCQlcCi0JZG8gewkJCQkJCQlcCi0JCSh0dXBsZSktPnNyYy51LmFsbCA9IDA7CQkJCVwKLQkJKHR1cGxlKS0+ZHN0LnUuYWxsID0gMDsJCQkJXAotCX0gd2hpbGUgKDApCi0KLSNpZmRlZiBfX0tFUk5FTF9fCi0KLSNkZWZpbmUgRFVNUF9UVVBMRSh0cCkJCQkJCQlcCi1ERUJVR1AoInR1cGxlICVwOiAldSAldS4ldS4ldS4ldTolaHUgLT4gJXUuJXUuJXUuJXU6JWh1XG4iLAlcCi0gICAgICAgKHRwKSwgKHRwKS0+ZHN0LnByb3RvbnVtLAkJCQlcCi0gICAgICAgTklQUVVBRCgodHApLT5zcmMuaXApLCBudG9ocygodHApLT5zcmMudS5hbGwpLAkJXAotICAgICAgIE5JUFFVQUQoKHRwKS0+ZHN0LmlwKSwgbnRvaHMoKHRwKS0+ZHN0LnUuYWxsKSkKLQotLyogSWYgd2UncmUgdGhlIGZpcnN0IHR1cGxlLCBpdCdzIHRoZSBvcmlnaW5hbCBkaXIuICovCi0jZGVmaW5lIERJUkVDVElPTihoKSAoKGVudW0gaXBfY29ubnRyYWNrX2RpcikoaCktPnR1cGxlLmRzdC5kaXIpCi0KLS8qIENvbm5lY3Rpb25zIGhhdmUgdHdvIGVudHJpZXMgaW4gdGhlIGhhc2ggdGFibGU6IG9uZSBmb3IgZWFjaCB3YXkgKi8KLXN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGVfaGFzaAotewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQotCXN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgdHVwbGU7Ci19OwotCi0jZW5kaWYgLyogX19LRVJORUxfXyAqLwotCi1zdGF0aWMgaW5saW5lIGludCBpcF9jdF90dXBsZV9zcmNfZXF1YWwoY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdDEsCi0JCQkJICAgICAgICBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0MikKLXsKLQlyZXR1cm4gdDEtPnNyYy5pcCA9PSB0Mi0+c3JjLmlwCi0JCSYmIHQxLT5zcmMudS5hbGwgPT0gdDItPnNyYy51LmFsbDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgaXBfY3RfdHVwbGVfZHN0X2VxdWFsKGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnQxLAotCQkJCSAgICAgICAgY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdDIpCi17Ci0JcmV0dXJuIHQxLT5kc3QuaXAgPT0gdDItPmRzdC5pcAotCQkmJiB0MS0+ZHN0LnUuYWxsID09IHQyLT5kc3QudS5hbGwKLQkJJiYgdDEtPmRzdC5wcm90b251bSA9PSB0Mi0+ZHN0LnByb3RvbnVtOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBpcF9jdF90dXBsZV9lcXVhbChjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0MSwKLQkJCQkgICAgY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdDIpCi17Ci0JcmV0dXJuIGlwX2N0X3R1cGxlX3NyY19lcXVhbCh0MSwgdDIpICYmIGlwX2N0X3R1cGxlX2RzdF9lcXVhbCh0MSwgdDIpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBpcF9jdF90dXBsZV9tYXNrX2NtcChjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0LAotCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0dXBsZSwKLQkJCQkgICAgICAgY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqbWFzaykKLXsKLQlyZXR1cm4gISgoKHQtPnNyYy5pcCBeIHR1cGxlLT5zcmMuaXApICYgbWFzay0+c3JjLmlwKQotCQkgfHwgKCh0LT5kc3QuaXAgXiB0dXBsZS0+ZHN0LmlwKSAmIG1hc2stPmRzdC5pcCkKLQkJIHx8ICgodC0+c3JjLnUuYWxsIF4gdHVwbGUtPnNyYy51LmFsbCkgJiBtYXNrLT5zcmMudS5hbGwpCi0JCSB8fCAoKHQtPmRzdC51LmFsbCBeIHR1cGxlLT5kc3QudS5hbGwpICYgbWFzay0+ZHN0LnUuYWxsKQotCQkgfHwgKCh0LT5kc3QucHJvdG9udW0gXiB0dXBsZS0+ZHN0LnByb3RvbnVtKQotCQkgICAgICYgbWFzay0+ZHN0LnByb3RvbnVtKSk7Ci19Ci0KLSNlbmRpZiAvKiBfSVBfQ09OTlRSQUNLX1RVUExFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0LmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmNhODlhLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0jaWZuZGVmIF9JUF9OQVRfSAotI2RlZmluZSBfSVBfTkFUX0gKLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja190dXBsZS5oPgotCi0jZGVmaW5lIElQX05BVF9NQVBQSU5HX1RZUEVfTUFYX05BTUVMRU4gMTYKLQotZW51bSBpcF9uYXRfbWFuaXBfdHlwZQotewotCUlQX05BVF9NQU5JUF9TUkMsCi0JSVBfTkFUX01BTklQX0RTVAotfTsKLQotLyogU1JDIG1hbmlwIG9jY3VycyBQT1NUX1JPVVRJTkcgb3IgTE9DQUxfSU4gKi8KLSNkZWZpbmUgSE9PSzJNQU5JUChob29rbnVtKSAoKGhvb2tudW0pICE9IE5GX0lQX1BPU1RfUk9VVElORyAmJiAoaG9va251bSkgIT0gTkZfSVBfTE9DQUxfSU4pCi0KLSNkZWZpbmUgSVBfTkFUX1JBTkdFX01BUF9JUFMgMQotI2RlZmluZSBJUF9OQVRfUkFOR0VfUFJPVE9fU1BFQ0lGSUVEIDIKLSNkZWZpbmUgSVBfTkFUX1JBTkdFX1BST1RPX1JBTkRPTSA0IC8qIGFkZCByYW5kb21uZXNzIHRvICJwb3J0IiBzZWxlY3Rpb24gKi8KLQotLyogTkFUIHNlcXVlbmNlIG51bWJlciBtb2RpZmljYXRpb25zICovCi1zdHJ1Y3QgaXBfbmF0X3NlcSB7Ci0JLyogcG9zaXRpb24gb2YgdGhlIGxhc3QgVENQIHNlcXVlbmNlIG51bWJlciAKLQkgKiBtb2RpZmljYXRpb24gKGlmIGFueSkgKi8KLQl1X2ludDMyX3QgY29ycmVjdGlvbl9wb3M7Ci0JLyogc2VxdWVuY2UgbnVtYmVyIG9mZnNldCBiZWZvcmUgYW5kIGFmdGVyIGxhc3QgbW9kaWZpY2F0aW9uICovCi0JaW50MTZfdCBvZmZzZXRfYmVmb3JlLCBvZmZzZXRfYWZ0ZXI7Ci19OwotCi0vKiBTaW5nbGUgcmFuZ2Ugc3BlY2lmaWNhdGlvbi4gKi8KLXN0cnVjdCBpcF9uYXRfcmFuZ2UKLXsKLQkvKiBTZXQgdG8gT1Igb2YgZmxhZ3MgYWJvdmUuICovCi0JdW5zaWduZWQgaW50IGZsYWdzOwotCi0JLyogSW5jbHVzaXZlOiBuZXR3b3JrIG9yZGVyLiAqLwotCV9fYmUzMiBtaW5faXAsIG1heF9pcDsKLQotCS8qIEluY2x1c2l2ZTogbmV0d29yayBvcmRlciAqLwotCXVuaW9uIGlwX2Nvbm50cmFja19tYW5pcF9wcm90byBtaW4sIG1heDsKLX07Ci0KLS8qIEZvciBiYWNrd2FyZHMgY29tcGF0OiBkb24ndCB1c2UgaW4gbW9kZXJuIGNvZGUuICovCi1zdHJ1Y3QgaXBfbmF0X211bHRpX3JhbmdlX2NvbXBhdAotewotCXVuc2lnbmVkIGludCByYW5nZXNpemU7IC8qIE11c3QgYmUgMS4gKi8KLQotCS8qIGhhbmdzIG9mZiBlbmQuICovCi0Jc3RydWN0IGlwX25hdF9yYW5nZSByYW5nZVsxXTsKLX07Ci0KLSNpZmRlZiBfX0tFUk5FTF9fCi0jaW5jbHVkZSA8bGludXgvbGlzdC5oPgotCi0vKiBQcm90ZWN0cyBOQVQgaGFzaCB0YWJsZXMsIGFuZCBOQVQtcHJpdmF0ZSBwYXJ0IG9mIGNvbm50cmFja3MuICovCi1leHRlcm4gcndsb2NrX3QgaXBfbmF0X2xvY2s7Ci0KLS8qIFRoZSBzdHJ1Y3R1cmUgZW1iZWRkZWQgaW4gdGhlIGNvbm50cmFjayBzdHJ1Y3R1cmUuICovCi1zdHJ1Y3QgaXBfbmF0X2luZm8KLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGJ5c291cmNlOwotCXN0cnVjdCBpcF9uYXRfc2VxIHNlcVtJUF9DVF9ESVJfTUFYXTsKLX07Ci0KLXN0cnVjdCBpcF9jb25udHJhY2s7Ci0KLS8qIFNldCB1cCB0aGUgaW5mbyBzdHJ1Y3R1cmUgdG8gbWFwIGludG8gdGhpcyByYW5nZS4gKi8KLWV4dGVybiB1bnNpZ25lZCBpbnQgaXBfbmF0X3NldHVwX2luZm8oc3RydWN0IGlwX2Nvbm50cmFjayAqY29ubnRyYWNrLAotCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBpcF9uYXRfcmFuZ2UgKnJhbmdlLAotCQkJCSAgICAgIHVuc2lnbmVkIGludCBob29rbnVtKTsKLQotLyogSXMgdGhpcyB0dXBsZSBhbHJlYWR5IHRha2VuPyAobm90IGJ5IHVzKSovCi1leHRlcm4gaW50IGlwX25hdF91c2VkX3R1cGxlKGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnR1cGxlLAotCQkJICAgICBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrICppZ25vcmVkX2Nvbm50cmFjayk7Ci0KLSNlbHNlICAvKiAhX19LRVJORUxfXzogaXB0YWJsZXMgd2FudHMgdGhpcyB0byBjb21waWxlLiAqLwotI2RlZmluZSBpcF9uYXRfbXVsdGlfcmFuZ2UgaXBfbmF0X211bHRpX3JhbmdlX2NvbXBhdAotI2VuZGlmIC8qX19LRVJORUxfXyovCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0X2NvcmUuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0X2NvcmUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA1NjZmOWYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9uYXRfY29yZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotI2lmbmRlZiBfSVBfTkFUX0NPUkVfSAotI2RlZmluZSBfSVBfTkFUX0NPUkVfSAotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2suaD4KLQotLyogVGhpcyBoZWFkZXIgdXNlZCB0byBzaGFyZSBjb3JlIGZ1bmN0aW9uYWxpdHkgYmV0d2VlbiB0aGUgc3RhbmRhbG9uZQotICAgTkFUIG1vZHVsZSwgYW5kIHRoZSBjb21wYXRpYmlsaXR5IGxheWVyJ3MgdXNlIG9mIE5BVCBmb3IgbWFzcXVlcmFkaW5nLiAqLwotCi1leHRlcm4gdW5zaWduZWQgaW50IGlwX25hdF9wYWNrZXQoc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsCi0JCQkgICAgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjb25udHJhY2tpbmZvLAotCQkJICAgICAgIHVuc2lnbmVkIGludCBob29rbnVtLAotCQkJICAgICAgIHN0cnVjdCBza19idWZmICoqcHNrYik7Ci0KLWV4dGVybiBpbnQgaXBfbmF0X2ljbXBfcmVwbHlfdHJhbnNsYXRpb24oc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsCi0JCQkJCSBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKLQkJCQkJIHVuc2lnbmVkIGludCBob29rbnVtLAotCQkJCQkgc3RydWN0IHNrX2J1ZmYgKipwc2tiKTsKLSNlbmRpZiAvKiBfSVBfTkFUX0NPUkVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9uYXRfaGVscGVyLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdF9oZWxwZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY5Y2IxMC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdF9oZWxwZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLSNpZm5kZWYgX0lQX05BVF9IRUxQRVJfSAotI2RlZmluZSBfSVBfTkFUX0hFTFBFUl9ICi0vKiBOQVQgcHJvdG9jb2wgaGVscGVyIHJvdXRpbmVzLiAqLwotCi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0KLXN0cnVjdCBza19idWZmOwotCi0vKiBUaGVzZSByZXR1cm4gdHJ1ZSBvciBmYWxzZS4gKi8KLWV4dGVybiBpbnQgaXBfbmF0X21hbmdsZV90Y3BfcGFja2V0KHN0cnVjdCBza19idWZmICoqc2tiLAotCQkJCXN0cnVjdCBpcF9jb25udHJhY2sgKmN0LAotCQkJCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAotCQkJCXVuc2lnbmVkIGludCBtYXRjaF9vZmZzZXQsCi0JCQkJdW5zaWduZWQgaW50IG1hdGNoX2xlbiwKLQkJCQljb25zdCBjaGFyICpyZXBfYnVmZmVyLAotCQkJCXVuc2lnbmVkIGludCByZXBfbGVuKTsKLWV4dGVybiBpbnQgaXBfbmF0X21hbmdsZV91ZHBfcGFja2V0KHN0cnVjdCBza19idWZmICoqc2tiLAotCQkJCXN0cnVjdCBpcF9jb25udHJhY2sgKmN0LAotCQkJCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAotCQkJCXVuc2lnbmVkIGludCBtYXRjaF9vZmZzZXQsCi0JCQkJdW5zaWduZWQgaW50IG1hdGNoX2xlbiwKLQkJCQljb25zdCBjaGFyICpyZXBfYnVmZmVyLAotCQkJCXVuc2lnbmVkIGludCByZXBfbGVuKTsKLWV4dGVybiBpbnQgaXBfbmF0X3NlcV9hZGp1c3Qoc3RydWN0IHNrX2J1ZmYgKipwc2tiLCAKLQkJCSAgICAgc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsIAotCQkJICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbyk7Ci0KLS8qIFNldHVwIE5BVCBvbiB0aGlzIGV4cGVjdGVkIGNvbm50cmFjayBzbyBpdCBmb2xsb3dzIG1hc3RlciwgYnV0IGdvZXMKLSAqIHRvIHBvcnQgY3QtPm1hc3Rlci0+c2F2ZWRfcHJvdG8uICovCi1leHRlcm4gdm9pZCBpcF9uYXRfZm9sbG93X21hc3RlcihzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKLQkJCQkgc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKnRoaXMpOwotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdF9wcHRwLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdF9wcHRwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2NjY4YmYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9uYXRfcHB0cC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotLyogUFBUUCBjb25zdGFudHMgYW5kIHN0cnVjdHMgKi8KLSNpZm5kZWYgX05BVF9QUFRQX0gKLSNkZWZpbmUgX05BVF9QUFRQX0gKLQotLyogY29ubnRyYWNrIHByaXZhdGUgZGF0YSAqLwotc3RydWN0IGlwX25hdF9wcHRwIHsKLQlfX2JlMTYgcG5zX2NhbGxfaWQ7CQkvKiBOQVQnZWQgUE5TIGNhbGwgaWQgKi8KLQlfX2JlMTYgcGFjX2NhbGxfaWQ7CQkvKiBOQVQnZWQgUEFDIGNhbGwgaWQgKi8KLX07Ci0KLSNlbmRpZiAvKiBfTkFUX1BQVFBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9uYXRfcHJvdG9jb2wuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0X3Byb3RvY29sLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxMmE0MzYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9uYXRfcHJvdG9jb2wuaAorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qIEhlYWRlciBmb3IgdXNlIGluIGRlZmluaW5nIGEgZ2l2ZW4gcHJvdG9jb2wuICovCi0jaWZuZGVmIF9JUF9OQVRfUFJPVE9DT0xfSAotI2RlZmluZSBfSVBfTkFUX1BST1RPQ09MX0gKLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbGlzdC5oPgotCi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL25mbmV0bGlua19jb25udHJhY2suaD4KLQotc3RydWN0IGlwaGRyOwotc3RydWN0IGlwX25hdF9yYW5nZTsKLQotc3RydWN0IGlwX25hdF9wcm90b2NvbAotewotCS8qIFByb3RvY29sIG5hbWUgKi8KLQljb25zdCBjaGFyICpuYW1lOwotCi0JLyogUHJvdG9jb2wgbnVtYmVyLiAqLwotCXVuc2lnbmVkIGludCBwcm90b251bTsKLQotCXN0cnVjdCBtb2R1bGUgKm1lOwotCi0JLyogVHJhbnNsYXRlIGEgcGFja2V0IHRvIHRoZSB0YXJnZXQgYWNjb3JkaW5nIHRvIG1hbmlwIHR5cGUuCi0JICAgUmV0dXJuIHRydWUgaWYgc3VjY2VlZGVkLiAqLwotCWludCAoKm1hbmlwX3BrdCkoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAotCQkJIHVuc2lnbmVkIGludCBpcGhkcm9mZiwKLQkJCSBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0dXBsZSwKLQkJCSBlbnVtIGlwX25hdF9tYW5pcF90eXBlIG1hbmlwdHlwZSk7Ci0KLQkvKiBJcyB0aGUgbWFuaXBhYmxlIHBhcnQgb2YgdGhlIHR1cGxlIGJldHdlZW4gbWluIGFuZCBtYXggaW5jbD8gKi8KLQlpbnQgKCppbl9yYW5nZSkoY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUsCi0JCQllbnVtIGlwX25hdF9tYW5pcF90eXBlIG1hbmlwdHlwZSwKLQkJCWNvbnN0IHVuaW9uIGlwX2Nvbm50cmFja19tYW5pcF9wcm90byAqbWluLAotCQkJY29uc3QgdW5pb24gaXBfY29ubnRyYWNrX21hbmlwX3Byb3RvICptYXgpOwotCi0JLyogQWx0ZXIgdGhlIHBlci1wcm90byBwYXJ0IG9mIHRoZSB0dXBsZSAoZGVwZW5kaW5nIG9uCi0JICAgbWFuaXB0eXBlKSwgdG8gZ2l2ZSBhIHVuaXF1ZSB0dXBsZSBpbiB0aGUgZ2l2ZW4gcmFuZ2UgaWYKLQkgICBwb3NzaWJsZTsgcmV0dXJuIGZhbHNlIGlmIG5vdC4gIFBlci1wcm90b2NvbCBwYXJ0IG9mIHR1cGxlCi0JICAgaXMgaW5pdGlhbGl6ZWQgdG8gdGhlIGluY29taW5nIHBhY2tldC4gKi8KLQlpbnQgKCp1bmlxdWVfdHVwbGUpKHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnR1cGxlLAotCQkJICAgIGNvbnN0IHN0cnVjdCBpcF9uYXRfcmFuZ2UgKnJhbmdlLAotCQkJICAgIGVudW0gaXBfbmF0X21hbmlwX3R5cGUgbWFuaXB0eXBlLAotCQkJICAgIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2sgKmNvbm50cmFjayk7Ci0KLQlpbnQgKCpyYW5nZV90b19uZmF0dHIpKHN0cnVjdCBza19idWZmICpza2IsCi0JCQkgICAgICAgY29uc3Qgc3RydWN0IGlwX25hdF9yYW5nZSAqcmFuZ2UpOwotCi0JaW50ICgqbmZhdHRyX3RvX3JhbmdlKShzdHJ1Y3QgbmZhdHRyICp0YltdLAotCQkJICAgICAgIHN0cnVjdCBpcF9uYXRfcmFuZ2UgKnJhbmdlKTsKLX07Ci0KLS8qIFByb3RvY29sIHJlZ2lzdHJhdGlvbi4gKi8KLWV4dGVybiBpbnQgaXBfbmF0X3Byb3RvY29sX3JlZ2lzdGVyKHN0cnVjdCBpcF9uYXRfcHJvdG9jb2wgKnByb3RvKTsKLWV4dGVybiB2b2lkIGlwX25hdF9wcm90b2NvbF91bnJlZ2lzdGVyKHN0cnVjdCBpcF9uYXRfcHJvdG9jb2wgKnByb3RvKTsKLQotZXh0ZXJuIHN0cnVjdCBpcF9uYXRfcHJvdG9jb2wgKmlwX25hdF9wcm90b19maW5kX2dldCh1X2ludDhfdCBwcm90b2NvbCk7Ci1leHRlcm4gdm9pZCBpcF9uYXRfcHJvdG9fcHV0KHN0cnVjdCBpcF9uYXRfcHJvdG9jb2wgKnByb3RvKTsKLQotLyogQnVpbHQtaW4gcHJvdG9jb2xzLiAqLwotZXh0ZXJuIHN0cnVjdCBpcF9uYXRfcHJvdG9jb2wgaXBfbmF0X3Byb3RvY29sX3RjcDsKLWV4dGVybiBzdHJ1Y3QgaXBfbmF0X3Byb3RvY29sIGlwX25hdF9wcm90b2NvbF91ZHA7Ci1leHRlcm4gc3RydWN0IGlwX25hdF9wcm90b2NvbCBpcF9uYXRfcHJvdG9jb2xfaWNtcDsKLWV4dGVybiBzdHJ1Y3QgaXBfbmF0X3Byb3RvY29sIGlwX25hdF91bmtub3duX3Byb3RvY29sOwotCi1leHRlcm4gaW50IGluaXRfcHJvdG9jb2xzKHZvaWQpIF9faW5pdDsKLWV4dGVybiB2b2lkIGNsZWFudXBfcHJvdG9jb2xzKHZvaWQpOwotZXh0ZXJuIHN0cnVjdCBpcF9uYXRfcHJvdG9jb2wgKmZpbmRfbmF0X3Byb3RvKHVfaW50MTZfdCBwcm90b251bSk7Ci0KLWV4dGVybiBpbnQgaXBfbmF0X3BvcnRfcmFuZ2VfdG9fbmZhdHRyKHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJICAgICAgIGNvbnN0IHN0cnVjdCBpcF9uYXRfcmFuZ2UgKnJhbmdlKTsKLWV4dGVybiBpbnQgaXBfbmF0X3BvcnRfbmZhdHRyX3RvX3JhbmdlKHN0cnVjdCBuZmF0dHIgKnRiW10sCi0JCQkJICAgICAgIHN0cnVjdCBpcF9uYXRfcmFuZ2UgKnJhbmdlKTsKLQotI2VuZGlmIC8qX0lQX05BVF9QUk9UT19IKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0X3J1bGUuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0X3J1bGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNiOTU1Mi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdF9ydWxlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0jaWZuZGVmIF9JUF9OQVRfUlVMRV9ICi0jZGVmaW5lIF9JUF9OQVRfUlVMRV9ICi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0Lmg+Ci0KLSNpZmRlZiBfX0tFUk5FTF9fCi0KLWV4dGVybiBpbnQgaXBfbmF0X3J1bGVfaW5pdCh2b2lkKSBfX2luaXQ7Ci1leHRlcm4gdm9pZCBpcF9uYXRfcnVsZV9jbGVhbnVwKHZvaWQpOwotZXh0ZXJuIGludCBpcF9uYXRfcnVsZV9maW5kKHN0cnVjdCBza19idWZmICoqcHNrYiwKLQkJCSAgICB1bnNpZ25lZCBpbnQgaG9va251bSwKLQkJCSAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0JCQkgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLQkJCSAgICBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKLQkJCSAgICBzdHJ1Y3QgaXBfbmF0X2luZm8gKmluZm8pOwotCi1leHRlcm4gdW5zaWduZWQgaW50Ci1hbGxvY19udWxsX2JpbmRpbmcoc3RydWN0IGlwX2Nvbm50cmFjayAqY29ubnRyYWNrLAotCQkgICBzdHJ1Y3QgaXBfbmF0X2luZm8gKmluZm8sCi0JCSAgIHVuc2lnbmVkIGludCBob29rbnVtKTsKLQotZXh0ZXJuIHVuc2lnbmVkIGludAotYWxsb2NfbnVsbF9iaW5kaW5nX2NvbmZpcm1lZChzdHJ1Y3QgaXBfY29ubnRyYWNrICpjb25udHJhY2ssCi0JCQkgICAgIHN0cnVjdCBpcF9uYXRfaW5mbyAqaW5mbywKLQkJCSAgICAgdW5zaWduZWQgaW50IGhvb2tudW0pOwotI2VuZGlmCi0jZW5kaWYgLyogX0lQX05BVF9SVUxFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X1NBTUUuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X1NBTUUuaAppbmRleCBjYzRjMGIyLi5iZTZlNjgyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9TQU1FLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfU0FNRS5oCkBAIC0xMyw3ICsxMyw3IEBACiAJdV9pbnQzMl90ICppcGFycmF5OwogCiAJLyogaGFuZ3Mgb2ZmIGVuZC4gKi8KLQlzdHJ1Y3QgaXBfbmF0X3JhbmdlIHJhbmdlW0lQVF9TQU1FX01BWF9SQU5HRV07CisJc3RydWN0IG5mX25hdF9yYW5nZSByYW5nZVtJUFRfU0FNRV9NQVhfUkFOR0VdOwogfTsKIAogI2VuZGlmIC8qX0lQVF9TQU1FX0gqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRsaW5rLmggYi9pbmNsdWRlL2xpbnV4L25ldGxpbmsuaAppbmRleCAyYTIwZjQ4Li5mNDE2ODhmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGxpbmsuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGxpbmsuaApAQCAtMTM4LDYgKzEzOCwxMSBAQAogI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KIAorc3RhdGljIGlubGluZSBzdHJ1Y3Qgbmxtc2doZHIgKm5sbXNnX2hkcihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiAoc3RydWN0IG5sbXNnaGRyICopc2tiLT5kYXRhOworfQorCiBzdHJ1Y3QgbmV0bGlua19za2JfcGFybXMKIHsKIAlzdHJ1Y3QgdWNyZWQJCWNyZWRzOwkJLyogU2tiIGNyZWRlbnRpYWxzCSovCkBAIC0xNTIsNyArMTU3LDEwIEBACiAjZGVmaW5lIE5FVExJTktfQ1JFRFMoc2tiKQkoJk5FVExJTktfQ0IoKHNrYikpLmNyZWRzKQogCiAKLWV4dGVybiBzdHJ1Y3Qgc29jayAqbmV0bGlua19rZXJuZWxfY3JlYXRlKGludCB1bml0LCB1bnNpZ25lZCBpbnQgZ3JvdXBzLCB2b2lkICgqaW5wdXQpKHN0cnVjdCBzb2NrICpzaywgaW50IGxlbiksIHN0cnVjdCBtb2R1bGUgKm1vZHVsZSk7CitleHRlcm4gc3RydWN0IHNvY2sgKm5ldGxpbmtfa2VybmVsX2NyZWF0ZShpbnQgdW5pdCwgdW5zaWduZWQgaW50IGdyb3VwcywKKwkJCQkJICB2b2lkICgqaW5wdXQpKHN0cnVjdCBzb2NrICpzaywgaW50IGxlbiksCisJCQkJCSAgc3RydWN0IG11dGV4ICpjYl9tdXRleCwKKwkJCQkJICBzdHJ1Y3QgbW9kdWxlICptb2R1bGUpOwogZXh0ZXJuIHZvaWQgbmV0bGlua19hY2soc3RydWN0IHNrX2J1ZmYgKmluX3NrYiwgc3RydWN0IG5sbXNnaGRyICpubGgsIGludCBlcnIpOwogZXh0ZXJuIGludCBuZXRsaW5rX2hhc19saXN0ZW5lcnMoc3RydWN0IHNvY2sgKnNrLCB1bnNpZ25lZCBpbnQgZ3JvdXApOwogZXh0ZXJuIGludCBuZXRsaW5rX3VuaWNhc3Qoc3RydWN0IHNvY2sgKnNzaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwgX191MzIgcGlkLCBpbnQgbm9uYmxvY2spOwpAQCAtMTcxLDkgKzE3OSwxNiBAQAogCiAvKgogICoJc2tiIHNob3VsZCBmaXQgb25lIHBhZ2UuIFRoaXMgY2hvaWNlIGlzIGdvb2QgZm9yIGhlYWRlcmxlc3MgbWFsbG9jLgorICoJQnV0IHdlIHNob3VsZCBsaW1pdCB0byA4SyBzbyB0aGF0IHVzZXJzcGFjZSBkb2VzIG5vdCBoYXZlIHRvCisgKgl1c2UgZW5vcm1vdXMgYnVmZmVyIHNpemVzIG9uIHJlY3Ztc2coKSBjYWxscyBqdXN0IHRvIGF2b2lkCisgKglNU0dfVFJVTkMgd2hlbiBQQUdFX1NJWkUgaXMgdmVyeSBsYXJnZS4KICAqLwotI2RlZmluZSBOTE1TR19HT09ET1JERVIgMAotI2RlZmluZSBOTE1TR19HT09EU0laRSAoU0tCX01BWF9PUkRFUigwLCBOTE1TR19HT09ET1JERVIpKQorI2lmIFBBR0VfU0laRSA8IDgxOTJVTAorI2RlZmluZSBOTE1TR19HT09EU0laRQlTS0JfV0lUSF9PVkVSSEVBRChQQUdFX1NJWkUpCisjZWxzZQorI2RlZmluZSBOTE1TR19HT09EU0laRQlTS0JfV0lUSF9PVkVSSEVBRCg4MTkyVUwpCisjZW5kaWYKKwogI2RlZmluZSBOTE1TR19ERUZBVUxUX1NJWkUgKE5MTVNHX0dPT0RTSVpFIC0gTkxNU0dfSERSTEVOKQogCiAKQEAgLTIxNywxOCArMjMyLDYgQEAKICNkZWZpbmUgTkxNU0dfUFVUKHNrYiwgcGlkLCBzZXEsIHR5cGUsIGxlbikgXAogCU5MTVNHX05FVyhza2IsIHBpZCwgc2VxLCB0eXBlLCBsZW4sIDApCiAKLSNkZWZpbmUgTkxNU0dfTkVXX0FOU1dFUihza2IsIGNiLCB0eXBlLCBsZW4sIGZsYWdzKSBcCi0JTkxNU0dfTkVXKHNrYiwgTkVUTElOS19DQigoY2IpLT5za2IpLnBpZCwgXAotCQkgIChjYiktPm5saC0+bmxtc2dfc2VxLCB0eXBlLCBsZW4sIGZsYWdzKQotCi0jZGVmaW5lIE5MTVNHX0VORChza2IsIG5saCkgXAotKHsJKG5saCktPm5sbXNnX2xlbiA9IChza2IpLT50YWlsIC0gKHVuc2lnbmVkIGNoYXIgKikgKG5saCk7IFwKLQkoc2tiKS0+bGVuOyB9KQotCi0jZGVmaW5lIE5MTVNHX0NBTkNFTChza2IsIG5saCkgXAotKHsJc2tiX3RyaW0oc2tiLCAodW5zaWduZWQgY2hhciAqKSAobmxoKSAtIChza2IpLT5kYXRhKTsgXAotCS0xOyB9KQotCiBleHRlcm4gaW50IG5ldGxpbmtfZHVtcF9zdGFydChzdHJ1Y3Qgc29jayAqc3NrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJICAgICAgc3RydWN0IG5sbXNnaGRyICpubGgsCiAJCQkgICAgICBpbnQgKCpkdW1wKShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayopLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9ubDgwMjExLmggYi9pbmNsdWRlL2xpbnV4L25sODAyMTEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTMwYmEyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9ubDgwMjExLmgKQEAgLTAsMCArMSwzOCBAQAorI2lmbmRlZiBfX0xJTlVYX05MODAyMTFfSAorI2RlZmluZSBfX0xJTlVYX05MODAyMTFfSAorLyoKKyAqIDgwMi4xMSBuZXRsaW5rIGludGVyZmFjZSBwdWJsaWMgaGVhZGVyCisgKgorICogQ29weXJpZ2h0IDIwMDYsIDIwMDcgSm9oYW5uZXMgQmVyZyA8am9oYW5uZXNAc2lwc29sdXRpb25zLm5ldD4KKyAqLworCisvKioKKyAqIGVudW0gbmw4MDIxMV9pZnR5cGUgLSAodmlydHVhbCkgaW50ZXJmYWNlIHR5cGVzCisgKiBATkw4MDIxMV9JRlRZUEVfVU5TUEVDSUZJRUQ6IHVuc3BlY2lmaWVkIHR5cGUsIGRyaXZlciBkZWNpZGVzCisgKiBATkw4MDIxMV9JRlRZUEVfQURIT0M6IGluZGVwZW5kZW50IEJTUyBtZW1iZXIKKyAqIEBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOiBtYW5hZ2VkIEJTUyBtZW1iZXIKKyAqIEBOTDgwMjExX0lGVFlQRV9BUDogYWNjZXNzIHBvaW50CisgKiBATkw4MDIxMV9JRlRZUEVfQVBfVkxBTjogVkxBTiBpbnRlcmZhY2UgZm9yIGFjY2VzcyBwb2ludHMKKyAqIEBOTDgwMjExX0lGVFlQRV9XRFM6IHdpcmVsZXNzIGRpc3RyaWJ1dGlvbiBpbnRlcmZhY2UKKyAqIEBOTDgwMjExX0lGVFlQRV9NT05JVE9SOiBtb25pdG9yIGludGVyZmFjZSByZWNlaXZpbmcgYWxsIGZyYW1lcworICogQF9fTkw4MDIxMV9JRlRZUEVfQUZURVJfTEFTVDogaW50ZXJuYWwgdXNlCisgKgorICogVGhlc2UgdmFsdWVzIGFyZSB1c2VkIHdpdGggdGhlIE5MODAyMTFfQVRUUl9JRlRZUEUKKyAqIHRvIHNldCB0aGUgdHlwZSBvZiBhbiBpbnRlcmZhY2UuCisgKgorICovCitlbnVtIG5sODAyMTFfaWZ0eXBlIHsKKwlOTDgwMjExX0lGVFlQRV9VTlNQRUNJRklFRCwKKwlOTDgwMjExX0lGVFlQRV9BREhPQywKKwlOTDgwMjExX0lGVFlQRV9TVEFUSU9OLAorCU5MODAyMTFfSUZUWVBFX0FQLAorCU5MODAyMTFfSUZUWVBFX0FQX1ZMQU4sCisJTkw4MDIxMV9JRlRZUEVfV0RTLAorCU5MODAyMTFfSUZUWVBFX01PTklUT1IsCisKKwkvKiBrZWVwIGxhc3QgKi8KKwlfX05MODAyMTFfSUZUWVBFX0FGVEVSX0xBU1QKK307CisjZGVmaW5lIE5MODAyMTFfSUZUWVBFX01BWCAoX19OTDgwMjExX0lGVFlQRV9BRlRFUl9MQVNUIC0gMSkKKworI2VuZGlmIC8qIF9fTElOVVhfTkw4MDIxMV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BhZ2UtZmxhZ3MuaCBiL2luY2x1ZGUvbGludXgvcGFnZS1mbGFncy5oCmluZGV4IDljZDBkMGUuLjk2MzI2NTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGFnZS1mbGFncy5oCisrKyBiL2luY2x1ZGUvbGludXgvcGFnZS1mbGFncy5oCkBAIC0xMzMsNyArMTMzLDcgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBTZXRQYWdlVXB0b2RhdGUoc3RydWN0IHBhZ2UgKnBhZ2UpCiB7CiAJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KFBHX3VwdG9kYXRlLCAmcGFnZS0+ZmxhZ3MpKQotCQlwYWdlX3Rlc3RfYW5kX2NsZWFyX2RpcnR5KHBhZ2UpOworCQlwYWdlX2NsZWFyX2RpcnR5KHBhZ2UpOwogfQogI2Vsc2UKICNkZWZpbmUgU2V0UGFnZVVwdG9kYXRlKHBhZ2UpCXNldF9iaXQoUEdfdXB0b2RhdGUsICYocGFnZSktPmZsYWdzKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wY2kuaCBiL2luY2x1ZGUvbGludXgvcGNpLmgKaW5kZXggNDgxZWEwNi4uOTcyNDkxMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wY2kuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BjaS5oCkBAIC0zNjEsOCArMzYxLDYgQEAKIAlzdHJ1Y3QgcGNpX2Vycm9yX2hhbmRsZXJzICplcnJfaGFuZGxlcjsKIAlzdHJ1Y3QgZGV2aWNlX2RyaXZlcglkcml2ZXI7CiAJc3RydWN0IHBjaV9keW5pZHMgZHluaWRzOwotCi0JaW50IG11bHRpdGhyZWFkX3Byb2JlOwogfTsKIAogI2RlZmluZQl0b19wY2lfZHJpdmVyKGRydikgY29udGFpbmVyX29mKGRydixzdHJ1Y3QgcGNpX2RyaXZlciwgZHJpdmVyKQpAQCAtODQwLDYgKzgzOCw3IEBACiB2b2lkIHBjaW1faW91bm1hcChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdm9pZCBfX2lvbWVtICphZGRyKTsKIHZvaWQgX19pb21lbSAqIGNvbnN0ICogcGNpbV9pb21hcF90YWJsZShzdHJ1Y3QgcGNpX2RldiAqcGRldik7CiBpbnQgcGNpbV9pb21hcF9yZWdpb25zKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1MTYgbWFzaywgY29uc3QgY2hhciAqbmFtZSk7Cit2b2lkIHBjaW1faW91bm1hcF9yZWdpb25zKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1MTYgbWFzayk7CiAKIGV4dGVybiBpbnQgcGNpX3BjaV9wcm9ibGVtczsKICNkZWZpbmUgUENJUENJX0ZBSUwJCTEJLyogTm8gUENJIFBDSSBETUEgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGNpX2lkcy5oIGIvaW5jbHVkZS9saW51eC9wY2lfaWRzLmgKaW5kZXggNjAwMzA4Zi4uMWIwZGRiYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wY2lfaWRzLmgKKysrIGIvaW5jbHVkZS9saW51eC9wY2lfaWRzLmgKQEAgLTM2OCw3ICszNjgsNiBAQAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FUSV9JWFA0MDBfU0FUQSAgIDB4NDM3OQogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FUSV9JWFA0MDBfU0FUQTIJMHg0MzdhCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRJX0lYUDYwMF9TQVRBCTB4NDM4MAotI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FUSV9JWFA2MDBfU1JBSUQJMHg0MzgxCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRJX0lYUDYwMF9TTUJVUwkweDQzODUKICNkZWZpbmUgUENJX0RFVklDRV9JRF9BVElfSVhQNjAwX0lERQkweDQzOGMKIApAQCAtMTQ1OSw2ICsxNDU4LDggQEAKIAogI2RlZmluZSBQQ0lfVkVORE9SX0lEX1RPU0hJQkFfMgkJMHgxMDJmCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVE9TSElCQV9UQzM1ODE1Q0YJMHgwMDMwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVE9TSElCQV9UQzM1ODE1X05XVQkweDAwMzEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9UT1NISUJBX1RDMzU4MTVfVFg0OTM5CTB4MDAzMgogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RPU0hJQkFfVEM4NkMwMDFfSURFCTB4MDEwNQogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RPU0hJQkFfVEM4NkMwMDFfTUlTQwkweDAxMDgKICNkZWZpbmUgUENJX0RFVklDRV9JRF9UT1NISUJBX1NQSURFUl9ORVQgMHgwMWIzCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BoeS5oIGIvaW5jbHVkZS9saW51eC9waHkuaAppbmRleCBlZGQ0Yzg4Li4yYTY1OTc4OWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGh5LmgKKysrIGIvaW5jbHVkZS9saW51eC9waHkuaApAQCAtNTUsNiArNTUsNyBAQAogCVBIWV9JTlRFUkZBQ0VfTU9ERV9UQkksCiAJUEhZX0lOVEVSRkFDRV9NT0RFX1JNSUksCiAJUEhZX0lOVEVSRkFDRV9NT0RFX1JHTUlJLAorCVBIWV9JTlRFUkZBQ0VfTU9ERV9SR01JSV9JRCwKIAlQSFlfSU5URVJGQUNFX01PREVfUlRCSQogfSBwaHlfaW50ZXJmYWNlX3Q7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcG0uaCBiL2luY2x1ZGUvbGludXgvcG0uaAppbmRleCAyMWRiMDVhLi42ZThmYTMwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BtLmgKKysrIGIvaW5jbHVkZS9saW51eC9wbS5oCkBAIC0xMTIsMjEgKzExMiwyNSBAQAogCiB0eXBlZGVmIGludCBfX2JpdHdpc2Ugc3VzcGVuZF9kaXNrX21ldGhvZF90OwogCi0jZGVmaW5lCVBNX0RJU0tfRklSTVdBUkUJKChfX2ZvcmNlIHN1c3BlbmRfZGlza19tZXRob2RfdCkgMSkKLSNkZWZpbmUJUE1fRElTS19QTEFURk9STQkoKF9fZm9yY2Ugc3VzcGVuZF9kaXNrX21ldGhvZF90KSAyKQotI2RlZmluZQlQTV9ESVNLX1NIVVRET1dOCSgoX19mb3JjZSBzdXNwZW5kX2Rpc2tfbWV0aG9kX3QpIDMpCi0jZGVmaW5lCVBNX0RJU0tfUkVCT09UCQkoKF9fZm9yY2Ugc3VzcGVuZF9kaXNrX21ldGhvZF90KSA0KQotI2RlZmluZQlQTV9ESVNLX1RFU1QJCSgoX19mb3JjZSBzdXNwZW5kX2Rpc2tfbWV0aG9kX3QpIDUpCi0jZGVmaW5lCVBNX0RJU0tfVEVTVFBST0MJKChfX2ZvcmNlIHN1c3BlbmRfZGlza19tZXRob2RfdCkgNikKLSNkZWZpbmUJUE1fRElTS19NQVgJCSgoX19mb3JjZSBzdXNwZW5kX2Rpc2tfbWV0aG9kX3QpIDcpCisvKiBpbnZhbGlkIG11c3QgYmUgMCBzbyBzdHJ1Y3QgcG1fb3BzIGluaXRpYWxpc2VycyBjYW4gbGVhdmUgaXQgb3V0ICovCisjZGVmaW5lIFBNX0RJU0tfSU5WQUxJRAkJKChfX2ZvcmNlIHN1c3BlbmRfZGlza19tZXRob2RfdCkgMCkKKyNkZWZpbmUJUE1fRElTS19QTEFURk9STQkoKF9fZm9yY2Ugc3VzcGVuZF9kaXNrX21ldGhvZF90KSAxKQorI2RlZmluZQlQTV9ESVNLX1NIVVRET1dOCSgoX19mb3JjZSBzdXNwZW5kX2Rpc2tfbWV0aG9kX3QpIDIpCisjZGVmaW5lCVBNX0RJU0tfUkVCT09UCQkoKF9fZm9yY2Ugc3VzcGVuZF9kaXNrX21ldGhvZF90KSAzKQorI2RlZmluZQlQTV9ESVNLX1RFU1QJCSgoX19mb3JjZSBzdXNwZW5kX2Rpc2tfbWV0aG9kX3QpIDQpCisjZGVmaW5lCVBNX0RJU0tfVEVTVFBST0MJKChfX2ZvcmNlIHN1c3BlbmRfZGlza19tZXRob2RfdCkgNSkKKyNkZWZpbmUJUE1fRElTS19NQVgJCSgoX19mb3JjZSBzdXNwZW5kX2Rpc2tfbWV0aG9kX3QpIDYpCiAKIC8qKgogICogc3RydWN0IHBtX29wcyAtIENhbGxiYWNrcyBmb3IgbWFuYWdpbmcgcGxhdGZvcm0gZGVwZW5kZW50IHN1c3BlbmQgc3RhdGVzLgogICogQHZhbGlkOiBDYWxsYmFjayB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgZ2l2ZW4gc3RhdGUgY2FuIGJlIGVudGVyZWQuCiAgKiAJSWYgJUNPTkZJR19TT0ZUV0FSRV9TVVNQRU5EIGlzIHNldCB0aGVuICVQTV9TVVNQRU5EX0RJU0sgaXMKLSAqCWFsd2F5cyB2YWxpZCBhbmQgbmV2ZXIgcGFzc2VkIHRvIHRoaXMgY2FsbC4KLSAqCUlmIG5vdCBhc3NpZ25lZCwgYWxsIHN1c3BlbmQgc3RhdGVzIGFyZSBhZHZlcnRpc2VkIGFzIHZhbGlkCi0gKglpbiAvc3lzL3Bvd2VyL3N0YXRlIChidXQgY2FuIHN0aWxsIGJlIHJlamVjdGVkIGJ5IHByZXBhcmUgb3IgZW50ZXIuKQorICoJYWx3YXlzIHZhbGlkIGFuZCBuZXZlciBwYXNzZWQgdG8gdGhpcyBjYWxsLiBJZiBub3QgYXNzaWduZWQsCisgKglubyBzdXNwZW5kIHN0YXRlcyBhcmUgdmFsaWQuCisgKglWYWxpZCBzdGF0ZXMgYXJlIGFkdmVydGlzZWQgaW4gL3N5cy9wb3dlci9zdGF0ZSBidXQgY2FuIHN0aWxsCisgKgliZSByZWplY3RlZCBieSBwcmVwYXJlIG9yIGVudGVyIGlmIHRoZSBjb25kaXRpb25zIGFyZW4ndCByaWdodC4KKyAqCVRoZXJlIGlzIGEgJXBtX3ZhbGlkX29ubHlfbWVtIGZ1bmN0aW9uIGF2YWlsYWJsZSB0aGF0IGNhbiBiZSBhc3NpZ25lZAorICoJdG8gdGhpcyBpZiB5b3Ugb25seSBpbXBsZW1lbnQgbWVtIHNsZWVwLgogICoKICAqIEBwcmVwYXJlOiBQcmVwYXJlIHRoZSBwbGF0Zm9ybSBmb3IgdGhlIGdpdmVuIHN1c3BlbmQgc3RhdGUuIENhbiByZXR1cm4gYQogICoJbmVnYXRpdmUgZXJyb3IgY29kZSBpZiBuZWNlc3NhcnkuCkBAIC0xMzcsMTcgKzE0MSwxNiBAQAogICogQGZpbmlzaDogQ2FsbGVkIHdoZW4gdGhlIHN5c3RlbSBoYXMgbGVmdCB0aGUgZ2l2ZW4gc3RhdGUgYW5kIGFsbCBkZXZpY2VzCiAgKglhcmUgcmVzdW1lZC4gVGhlIHJldHVybiB2YWx1ZSBpcyBpZ25vcmVkLgogICoKLSAqIEBwbV9kaXNrX21vZGU6IFNldCB0byB0aGUgZGlzayBtZXRob2QgdGhhdCB0aGUgdXNlciBzaG91bGQgYmUgYWJsZSB0bwotICoJY29uZmlndXJlIGZvciBzdXNwZW5kLXRvLWRpc2suIFNpbmNlICVQTV9ESVNLX1NIVVRET1dOLAotICoJJVBNX0RJU0tfUkVCT09ULCAlUE1fRElTS19URVNUIGFuZCAlUE1fRElTS19URVNUUFJPQwotICoJYXJlIGFsd2F5cyBhbGxvd2VkLCBjdXJyZW50bHkgb25seSAlUE1fRElTS19QTEFURk9STQotICoJbWFrZXMgc2Vuc2UuIElmIHRoZSB1c2VyIHRoZW4gY2hvc2VzICVQTV9ESVNLX1BMQVRGT1JNLAotICoJdGhlIEBwcmVwYXJlIGNhbGwgd2lsbCBiZSBjYWxsZWQgYmVmb3JlIHN1c3BlbmRpbmcgdG8gZGlzawotICoJKGlmIHByZXNlbnQpLCB0aGUgQGVudGVyIGNhbGwgc2hvdWxkIGJlIHByZXNlbnQgYW5kIHdpbGwKLSAqCWJlIGNhbGxlZCBhZnRlciBhbGwgc3RhdGUgaGFzIGJlZW4gc2F2ZWQgYW5kIHRoZSBtYWNoaW5lCi0gKglpcyByZWFkeSB0byBiZSBzaHV0IGRvd24vc3VzcGVuZGVkLy4uLiwgYW5kIHRoZSBAZmluaXNoCi0gKgljYWxsYmFjayBpcyBjYWxsZWQgYWZ0ZXIgc3RhdGUgaGFzIGJlZW4gcmVzdG9yZWQuIEFsbAotICoJdGhlc2UgY2FsbHMgYXJlIGNhbGxlZCB3aXRoICVQTV9TVVNQRU5EX0RJU0sgYXMgdGhlIHN0YXRlLgorICogQHBtX2Rpc2tfbW9kZTogVGhlIGdlbmVyaWMgY29kZSBhbHdheXMgYWxsb3dzIG9uZSBvZiB0aGUgc2h1dGRvd24gbWV0aG9kcworICoJJVBNX0RJU0tfU0hVVERPV04sICVQTV9ESVNLX1JFQk9PVCwgJVBNX0RJU0tfVEVTVCBhbmQKKyAqCSVQTV9ESVNLX1RFU1RQUk9DLiBJZiB0aGlzIHZhcmlhYmxlIGlzIHNldCwgdGhlIG1vZGUgaXQgaXMgc2V0CisgKgl0byBpcyBhbGxvd2VkIGluIGFkZGl0aW9uIHRvIHRob3NlIG1vZGVzIGFuZCBpcyBhbHNvIG1hZGUgZGVmYXVsdC4KKyAqCVdoZW4gdGhpcyBtb2RlIGlzIHNlbnQgc2VsZWN0ZWQsIHRoZSBAcHJlcGFyZSBjYWxsIHdpbGwgYmUgY2FsbGVkCisgKgliZWZvcmUgc3VzcGVuZGluZyB0byBkaXNrIChpZiBwcmVzZW50KSwgdGhlIEBlbnRlciBjYWxsIHNob3VsZCBiZQorICoJcHJlc2VudCBhbmQgd2lsbCBiZSBjYWxsZWQgYWZ0ZXIgYWxsIHN0YXRlIGhhcyBiZWVuIHNhdmVkIGFuZCB0aGUKKyAqCW1hY2hpbmUgaXMgcmVhZHkgdG8gYmUgcG93ZXJlZCBvZmY7IHRoZSBAZmluaXNoIGNhbGxiYWNrIGlzIGNhbGxlZAorICoJYWZ0ZXIgc3RhdGUgaGFzIGJlZW4gcmVzdG9yZWQuIEFsbCB0aGVzZSBjYWxscyBhcmUgY2FsbGVkIHdpdGgKKyAqCSVQTV9TVVNQRU5EX0RJU0sgYXMgdGhlIHN0YXRlLgogICovCiBzdHJ1Y3QgcG1fb3BzIHsKIAlpbnQgKCp2YWxpZCkoc3VzcGVuZF9zdGF0ZV90IHN0YXRlKTsKQEAgLTE2NSw2ICsxNjgsMjUgQEAKIGV4dGVybiBzdHJ1Y3QgcG1fb3BzICpwbV9vcHM7CiBleHRlcm4gaW50IHBtX3N1c3BlbmQoc3VzcGVuZF9zdGF0ZV90IHN0YXRlKTsKIAorZXh0ZXJuIGludCBwbV92YWxpZF9vbmx5X21lbShzdXNwZW5kX3N0YXRlX3Qgc3RhdGUpOworCisvKioKKyAqIGFyY2hfc3VzcGVuZF9kaXNhYmxlX2lycXMgLSBkaXNhYmxlIElSUXMgZm9yIHN1c3BlbmQKKyAqCisgKiBEaXNhYmxlcyBJUlFzIChpbiB0aGUgZGVmYXVsdCBjYXNlKS4gVGhpcyBpcyBhIHdlYWsgc3ltYm9sIGluIHRoZSBjb21tb24KKyAqIGNvZGUgYW5kIHRodXMgYWxsb3dzIGFyY2hpdGVjdHVyZXMgdG8gb3ZlcnJpZGUgaXQgaWYgbW9yZSBuZWVkcyB0byBiZQorICogZG9uZS4gTm90IGNhbGxlZCBmb3Igc3VzcGVuZCB0byBkaXNrLgorICovCitleHRlcm4gdm9pZCBhcmNoX3N1c3BlbmRfZGlzYWJsZV9pcnFzKHZvaWQpOworCisvKioKKyAqIGFyY2hfc3VzcGVuZF9lbmFibGVfaXJxcyAtIGVuYWJsZSBJUlFzIGFmdGVyIHN1c3BlbmQKKyAqCisgKiBFbmFibGVzIElSUXMgKGluIHRoZSBkZWZhdWx0IGNhc2UpLiBUaGlzIGlzIGEgd2VhayBzeW1ib2wgaW4gdGhlIGNvbW1vbgorICogY29kZSBhbmQgdGh1cyBhbGxvd3MgYXJjaGl0ZWN0dXJlcyB0byBvdmVycmlkZSBpdCBpZiBtb3JlIG5lZWRzIHRvIGJlCisgKiBkb25lLiBOb3QgY2FsbGVkIGZvciBzdXNwZW5kIHRvIGRpc2suCisgKi8KK2V4dGVybiB2b2lkIGFyY2hfc3VzcGVuZF9lbmFibGVfaXJxcyh2b2lkKTsKIAogLyoKICAqIERldmljZSBwb3dlciBtYW5hZ2VtZW50CkBAIC0yNzMsNiArMjk1LDIwIEBACiAJCV9fc3VzcGVuZF9yZXBvcnRfcmVzdWx0KF9fRlVOQ1RJT05fXywgZm4sIHJldCk7CQlcCiAJfSB3aGlsZSAoMCkKIAorLyoKKyAqIFBsYXRmb3JtIGhvb2sgdG8gYWN0aXZhdGUgZGV2aWNlIHdha2V1cCBjYXBhYmlsaXR5LCBpZiB0aGF0J3Mgbm90IGFscmVhZHkKKyAqIGhhbmRsZWQgYnkgZW5hYmxlX2lycV93YWtlKCkgZXRjLgorICogUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3MsIGVsc2UgbmVnYXRpdmUgZXJybm8KKyAqLworZXh0ZXJuIGludCAoKnBsYXRmb3JtX2VuYWJsZV93YWtldXApKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGlzX29uKTsKKworc3RhdGljIGlubGluZSBpbnQgY2FsbF9wbGF0Zm9ybV9lbmFibGVfd2FrZXVwKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGlzX29uKQoreworCWlmIChwbGF0Zm9ybV9lbmFibGVfd2FrZXVwKQorCQlyZXR1cm4gKCpwbGF0Zm9ybV9lbmFibGVfd2FrZXVwKShkZXYsIGlzX29uKTsKKwlyZXR1cm4gMDsKK30KKwogI2Vsc2UgLyogIUNPTkZJR19QTSAqLwogCiBzdGF0aWMgaW5saW5lIGludCBkZXZpY2Vfc3VzcGVuZChwbV9tZXNzYWdlX3Qgc3RhdGUpCkBAIC0yOTQsNiArMzMwLDExIEBACiAKICNkZWZpbmUgc3VzcGVuZF9yZXBvcnRfcmVzdWx0KGZuLCByZXQpIGRvIHsgfSB3aGlsZSAoMCkKIAorc3RhdGljIGlubGluZSBpbnQgY2FsbF9wbGF0Zm9ybV9lbmFibGVfd2FrZXVwKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGlzX29uKQoreworCXJldHVybiAwOworfQorCiAjZW5kaWYKIAogLyogY2hhbmdlcyB0byBkZXZpY2VfbWF5X3dha2V1cCB0YWtlIGVmZmVjdCBvbiB0aGUgbmV4dCBwbSBzdGF0ZSBjaGFuZ2UuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BtdS5oIGIvaW5jbHVkZS9saW51eC9wbXUuaAppbmRleCA3ODMxNzczLi5iMDk1MmU1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BtdS5oCisrKyBiL2luY2x1ZGUvbGludXgvcG11LmgKQEAgLTE2OCwyNCArMTY4LDE2IEBACiAKIHN0cnVjdCBwbXVfc2xlZXBfbm90aWZpZXIKIHsKLQlpbnQgKCpub3RpZmllcl9jYWxsKShzdHJ1Y3QgcG11X3NsZWVwX25vdGlmaWVyICpzZWxmLCBpbnQgd2hlbik7CisJdm9pZCAoKm5vdGlmaWVyX2NhbGwpKHN0cnVjdCBwbXVfc2xlZXBfbm90aWZpZXIgKnNlbGYsIGludCB3aGVuKTsKIAlpbnQgcHJpb3JpdHk7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogfTsKIAogLyogQ29kZSB2YWx1ZXMgZm9yIGNhbGxpbmcgc2xlZXAvd2FrZXVwIGhhbmRsZXJzCi0gKgotICogTm90ZTogSWYgYSBzbGVlcCByZXF1ZXN0IGdvdCBjYW5jZWxsZWQsIGFsbCBkcml2ZXJzIHdpbGwgZ2V0Ci0gKiB0aGUgUEJPT0tfU0xFRVBfUkVKRUNULCBldmVuIHRob3NlIHdobyBkaWRuJ3QgZ2V0IHRoZSBQQk9PS19TTEVFUF9SRVFVRVNULgogICovCiAjZGVmaW5lIFBCT09LX1NMRUVQX1JFUVVFU1QJMQogI2RlZmluZSBQQk9PS19TTEVFUF9OT1cJCTIKLSNkZWZpbmUgUEJPT0tfU0xFRVBfUkVKRUNUCTMKLSNkZWZpbmUgUEJPT0tfV0FLRQkJNAotCi0vKiBSZXN1bHQgY29kZXMgcmV0dXJuZWQgYnkgdGhlIG5vdGlmaWVycyAqLwotI2RlZmluZSBQQk9PS19TTEVFUF9PSwkJMAotI2RlZmluZSBQQk9PS19TTEVFUF9SRUZVU0UJLTEKKyNkZWZpbmUgUEJPT0tfV0FLRQkJMwogCiAvKiBwcmlvcml0eSBsZXZlbHMgaW4gbm90aWZpZXJzICovCiAjZGVmaW5lIFNMRUVQX0xFVkVMX1ZJREVPCTEwMAkvKiBWaWRlbyBkcml2ZXIgKGZpcnN0IHdha2UpICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3J0bmV0bGluay5oIGIvaW5jbHVkZS9saW51eC9ydG5ldGxpbmsuaAppbmRleCA0YTYyOWVhLi4xZmFlMzBhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3J0bmV0bGluay5oCisrKyBiL2luY2x1ZGUvbGludXgvcnRuZXRsaW5rLmgKQEAgLTU3NCwxMyArNTc0LDYgQEAKICNkZWZpbmUgcnRhdHRyX3BhcnNlX25lc3RlZCh0YiwgbWF4LCBydGEpIFwKIAlydGF0dHJfcGFyc2UoKHRiKSwgKG1heCksIFJUQV9EQVRBKChydGEpKSwgUlRBX1BBWUxPQUQoKHJ0YSkpKQogCi1zdHJ1Y3QgcnRuZXRsaW5rX2xpbmsKLXsKLQlpbnQgKCpkb2l0KShzdHJ1Y3Qgc2tfYnVmZiAqLCBzdHJ1Y3Qgbmxtc2doZHIqLCB2b2lkICphdHRyKTsKLQlpbnQgKCpkdW1waXQpKHN0cnVjdCBza19idWZmICosIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYik7Ci19OwotCi1leHRlcm4gc3RydWN0IHJ0bmV0bGlua19saW5rICogcnRuZXRsaW5rX2xpbmtzW05QUk9UT107CiBleHRlcm4gaW50IHJ0bmV0bGlua19zZW5kKHN0cnVjdCBza19idWZmICpza2IsIHUzMiBwaWQsIHUzMiBncm91cCwgaW50IGVjaG8pOwogZXh0ZXJuIGludCBydG5sX3VuaWNhc3Qoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIHBpZCk7CiBleHRlcm4gaW50IHJ0bmxfbm90aWZ5KHN0cnVjdCBza19idWZmICpza2IsIHUzMiBwaWQsIHUzMiBncm91cCwKQEAgLTYwNSw3ICs1OTgsNyBAQAogCiAjZGVmaW5lIFJUQV9QVVRfTk9IRFIoc2tiLCBhdHRybGVuLCBkYXRhKSBcCiAoewlSVEFfQVBQRU5EKHNrYiwgUlRBX0FMSUdOKGF0dHJsZW4pLCBkYXRhKTsgXAotCW1lbXNldChza2ItPnRhaWwgLSAoUlRBX0FMSUdOKGF0dHJsZW4pIC0gYXR0cmxlbiksIDAsIFwKKwltZW1zZXQoc2tiX3RhaWxfcG9pbnRlcihza2IpIC0gKFJUQV9BTElHTihhdHRybGVuKSAtIGF0dHJsZW4pLCAwLCBcCiAJICAgICAgIFJUQV9BTElHTihhdHRybGVuKSAtIGF0dHJsZW4pOyB9KQogCiAjZGVmaW5lIFJUQV9QVVRfVTgoc2tiLCBhdHRydHlwZSwgdmFsdWUpIFwKQEAgLTYzNywxMiArNjMwLDEyIEBACiAJUlRBX1BVVChza2IsIGF0dHJ0eXBlLCAwLCBOVUxMKTsKIAogI2RlZmluZSBSVEFfTkVTVChza2IsIHR5cGUpIFwKLSh7CXN0cnVjdCBydGF0dHIgKl9fc3RhcnQgPSAoc3RydWN0IHJ0YXR0ciAqKSAoc2tiKS0+dGFpbDsgXAorKHsJc3RydWN0IHJ0YXR0ciAqX19zdGFydCA9IChzdHJ1Y3QgcnRhdHRyICopc2tiX3RhaWxfcG9pbnRlcihza2IpOyBcCiAJUlRBX1BVVChza2IsIHR5cGUsIDAsIE5VTEwpOyBcCiAJX19zdGFydDsgIH0pCiAKICNkZWZpbmUgUlRBX05FU1RfRU5EKHNrYiwgc3RhcnQpIFwKLSh7CShzdGFydCktPnJ0YV9sZW4gPSAoKHNrYiktPnRhaWwgLSAodW5zaWduZWQgY2hhciAqKSAoc3RhcnQpKTsgXAorKHsJKHN0YXJ0KS0+cnRhX2xlbiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKSAtICh1bnNpZ25lZCBjaGFyICopKHN0YXJ0KTsgXAogCShza2IpLT5sZW47IH0pCiAKICNkZWZpbmUgUlRBX05FU1RfQ0FOQ0VMKHNrYiwgc3RhcnQpIFwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcnhycGMuaCBiL2luY2x1ZGUvbGludXgvcnhycGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2I4MjZiCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9yeHJwYy5oCkBAIC0wLDAgKzEsNjIgQEAKKy8qIEFGX1JYUlBDIHBhcmFtZXRlcnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBfTElOVVhfUlhSUENfSAorI2RlZmluZSBfTElOVVhfUlhSUENfSAorCisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pbjYuaD4KKworLyoKKyAqIFJ4UlBDIHNvY2tldCBhZGRyZXNzCisgKi8KK3N0cnVjdCBzb2NrYWRkcl9yeHJwYyB7CisJc2FfZmFtaWx5X3QJc3J4X2ZhbWlseTsJLyogYWRkcmVzcyBmYW1pbHkgKi8KKwl1MTYJCXNyeF9zZXJ2aWNlOwkvKiBzZXJ2aWNlIGRlc2lyZWQgKi8KKwl1MTYJCXRyYW5zcG9ydF90eXBlOwkvKiB0eXBlIG9mIHRyYW5zcG9ydCBzb2NrZXQgKFNPQ0tfREdSQU0pICovCisJdTE2CQl0cmFuc3BvcnRfbGVuOwkvKiBsZW5ndGggb2YgdHJhbnNwb3J0IGFkZHJlc3MgKi8KKwl1bmlvbiB7CisJCXNhX2ZhbWlseV90IGZhbWlseTsJCS8qIHRyYW5zcG9ydCBhZGRyZXNzIGZhbWlseSAqLworCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2luOwkJLyogSVB2NCB0cmFuc3BvcnQgYWRkcmVzcyAqLworCQlzdHJ1Y3Qgc29ja2FkZHJfaW42IHNpbjY7CS8qIElQdjYgdHJhbnNwb3J0IGFkZHJlc3MgKi8KKwl9IHRyYW5zcG9ydDsKK307CisKKy8qCisgKiBSeFJQQyBzb2NrZXQgb3B0aW9ucworICovCisjZGVmaW5lIFJYUlBDX1NFQ1VSSVRZX0tFWQkJMQkvKiBbY2xudF0gc2V0IGNsaWVudCBzZWN1cml0eSBrZXkgKi8KKyNkZWZpbmUgUlhSUENfU0VDVVJJVFlfS0VZUklORwkJMgkvKiBbc3J2cl0gc2V0IHJpbmcgb2Ygc2VydmVyIHNlY3VyaXR5IGtleXMgKi8KKyNkZWZpbmUgUlhSUENfRVhDTFVTSVZFX0NPTk5FQ1RJT04JMwkvKiBbY2xudF0gdXNlIGV4Y2x1c2l2ZSBSeFJQQyBjb25uZWN0aW9uICovCisjZGVmaW5lIFJYUlBDX01JTl9TRUNVUklUWV9MRVZFTAk0CS8qIG1pbmltdW0gc2VjdXJpdHkgbGV2ZWwgKi8KKworLyoKKyAqIFJ4UlBDIGNvbnRyb2wgbWVzc2FnZXMKKyAqIC0gdGVybWluYWwgbWVzc2FnZXMgbWVhbiB0aGF0IGEgdXNlciBjYWxsIElEIHRhZyBjYW4gYmUgcmVjeWNsZWQKKyAqLworI2RlZmluZSBSWFJQQ19VU0VSX0NBTExfSUQJMQkvKiB1c2VyIGNhbGwgSUQgc3BlY2lmaWVyICovCisjZGVmaW5lIFJYUlBDX0FCT1JUCQkyCS8qIGFib3J0IHJlcXVlc3QgLyBub3RpZmljYXRpb24gW3Rlcm1pbmFsXSAqLworI2RlZmluZSBSWFJQQ19BQ0sJCTMJLyogW1NlcnZlcl0gUlBDIG9wIGZpbmFsIEFDSyByZWNlaXZlZCBbdGVybWluYWxdICovCisjZGVmaW5lIFJYUlBDX05FVF9FUlJPUgkJNQkvKiBuZXR3b3JrIGVycm9yIHJlY2VpdmVkIFt0ZXJtaW5hbF0gKi8KKyNkZWZpbmUgUlhSUENfQlVTWQkJNgkvKiBzZXJ2ZXIgYnVzeSByZWNlaXZlZCBbdGVybWluYWxdICovCisjZGVmaW5lIFJYUlBDX0xPQ0FMX0VSUk9SCTcJLyogbG9jYWwgZXJyb3IgZ2VuZXJhdGVkIFt0ZXJtaW5hbF0gKi8KKyNkZWZpbmUgUlhSUENfTkVXX0NBTEwJCTgJLyogW1NlcnZlcl0gbmV3IGluY29taW5nIGNhbGwgbm90aWZpY2F0aW9uICovCisjZGVmaW5lIFJYUlBDX0FDQ0VQVAkJOQkvKiBbU2VydmVyXSBhY2NlcHQgcmVxdWVzdCAqLworCisvKgorICogUnhSUEMgc2VjdXJpdHkgbGV2ZWxzCisgKi8KKyNkZWZpbmUgUlhSUENfU0VDVVJJVFlfUExBSU4JMAkvKiBwbGFpbiBzZWN1cmUtY2hlY2tzdW1tZWQgcGFja2V0cyBvbmx5ICovCisjZGVmaW5lIFJYUlBDX1NFQ1VSSVRZX0FVVEgJMQkvKiBhdXRoZW50aWNhdGVkIHBhY2tldHMgKi8KKyNkZWZpbmUgUlhSUENfU0VDVVJJVFlfRU5DUllQVAkyCS8qIGVuY3J5cHRlZCBwYWNrZXRzICovCisKKworI2VuZGlmIC8qIF9MSU5VWF9SWFJQQ19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NjaGVkLmggYi9pbmNsdWRlL2xpbnV4L3NjaGVkLmgKaW5kZXggNDlmZTI5OS4uYTE3MDc1OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zY2hlZC5oCisrKyBiL2luY2x1ZGUvbGludXgvc2NoZWQuaApAQCAtMTk2LDEzICsxOTYsMTMgQEAKIGV4dGVybiBjcHVtYXNrX3Qgbm9oel9jcHVfbWFzazsKIAogLyoKLSAqIE9ubHkgZHVtcCBUQVNLXyogdGFza3MuICgtMSBmb3IgYWxsIHRhc2tzKQorICogT25seSBkdW1wIFRBU0tfKiB0YXNrcy4gKDAgZm9yIGFsbCB0YXNrcykKICAqLwogZXh0ZXJuIHZvaWQgc2hvd19zdGF0ZV9maWx0ZXIodW5zaWduZWQgbG9uZyBzdGF0ZV9maWx0ZXIpOwogCiBzdGF0aWMgaW5saW5lIHZvaWQgc2hvd19zdGF0ZSh2b2lkKQogewotCXNob3dfc3RhdGVfZmlsdGVyKC0xKTsKKwlzaG93X3N0YXRlX2ZpbHRlcigwKTsKIH0KIAogZXh0ZXJuIHZvaWQgc2hvd19yZWdzKHN0cnVjdCBwdF9yZWdzICopOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zY3RwLmggYi9pbmNsdWRlL2xpbnV4L3NjdHAuaAppbmRleCBkNGY4NjU2Li5kNzBkZjYxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NjdHAuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NjdHAuaApAQCAtNjMsNiArNjMsMTUgQEAKIAlfX2JlMzIgY2hlY2tzdW07CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHNjdHBfc2N0cGhkcl90OwogCisjaWZkZWYgX19LRVJORUxfXworI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzY3RwaGRyICpzY3RwX2hkcihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiAoc3RydWN0IHNjdHBoZHIgKilza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpOworfQorI2VuZGlmCisKIC8qIFNlY3Rpb24gMy4yLiAgQ2h1bmsgRmllbGQgRGVzY3JpcHRpb25zLiAqLwogdHlwZWRlZiBzdHJ1Y3Qgc2N0cF9jaHVua2hkciB7CiAJX191OCB0eXBlOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zZGxhX2ZyLmggYi9pbmNsdWRlL2xpbnV4L3NkbGFfZnIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RmYTc3Zi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2xpbnV4L3NkbGFfZnIuaAorKysgL2Rldi9udWxsCkBAIC0xLDYzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogc2RsYV9mci5oCVNhbmdvbWEgZnJhbWUgcmVsYXkgZmlybXdhcmUgQVBJIGRlZmluaXRpb25zLgotKgotKiBBdXRob3I6ICAgICAgIEdpZGVvbiBIYWNrICAJCi0qCQlOZW5hZCBDb3JiaWMgPG5jb3JiaWNAc2FuZ29tYS5jb20+IAkKLSoKLSogQ29weXJpZ2h0OgkoYykgMTk5NS0yMDAwIFNhbmdvbWEgVGVjaG5vbG9naWVzIEluYy4KLSoKLSoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0qCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSogT2N0IDA0LCAxOTk5ICBHaWRlb24gSGFjayAgICAgVXBkYXRlZCBBUEkgc3RydWN0dXJlcwotKiBKdW4gMDIsIDE5OTkgIEdpZGVvbiBIYWNrIAlNb2RpZmljYXRpb25zIGZvciBTNTE0IHN1cHBvcnQKLSogT2N0IDEyLCAxOTk3CUphc3ByZWV0IFNpbmdoCUFkZGVkIEZSX1JFQURfRExDSV9JQl9NQVBQSU5HCi0qIEp1bCAyMSwgMTk5NyAJSmFzcHJlZXQgU2luZ2gJQ2hhbmdlZCBGUlJFU19UT09fTE9ORyBhbmQgRlJSRVNfVE9PX01BTlkgdG8gCi0qCQkJCTB4MDUgYW5kIDB4MDYgcmVzcGVjdGl2ZWx5LgotKiBEZWMgMjMsIDE5OTYJR2VuZSBLb3ppbgl2Mi4wCi0qIEFwciAyOSwgMTk5NglHZW5lIEtvemluCXYxLjAgKG1lcmdlZCB2ZXJzaW9uIFM1MDIgJiBTNTA4IGRlZmluaXRpb25zKS4KLSogU2VwIDI2LCAxOTk1CUdlbmUgS296aW4JSW5pdGlhbCB2ZXJzaW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmCV9TRExBX0ZSX0gKLSNkZWZpbmUJX1NETEFfRlJfSAotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIE5vdGVzOgotICogLS0tLS0tCi0gKiAxLiBBbGwgc3RydWN0dXJlcyBkZWZpbmVkIGluIHRoaXMgZmlsZSBhcmUgYnl0ZS1hbGluZWQuICAKLSAqCi0gKglDb21waWxlcglQbGF0Zm9ybQotICoJLS0tLS0tLS0JLS0tLS0tLS0KLSAqCUdOVSBDCQlMaW51eAotICovCi0KLSNpZm5kZWYJUEFDS0VECi0jICAgIGRlZmluZQlQQUNLRUQJX19hdHRyaWJ1dGVfXygocGFja2VkKSkKLSNlbmRpZgkvKiBQQUNLRUQgKi8KLQotLyogQWRhcHRlciBtZW1vcnkgbGF5b3V0ICovCi0jZGVmaW5lCUZSX01CX1ZFQ1RPUgkweEUwMDAJLyogbWFpbGJveCB3aW5kb3cgdmVjdG9yICovCi0jZGVmaW5lCUZSNTAyX1JYX1ZFQ1RPUgkweEEwMDAJLyogUzUwMiBkaXJlY3QgcmVjZWl2ZSB3aW5kb3cgdmVjdG9yICovCi0jZGVmaW5lCUZSNTAyX01CT1hfT0ZGUwkweEY2MAkvKiBTNTAyIG1haWxib3ggb2Zmc2V0ICovCi0jZGVmaW5lCUZSNTA4X01CT1hfT0ZGUwkwCS8qIFM1MDggbWFpbGJveCBvZmZzZXQgKi8KLSNkZWZpbmUJRlI1MDJfRkxBR19PRkZTCTB4MUZGMAkvKiBTNTAyIHN0YXR1cyBmbGFncyBvZmZzZXQgKi8KLSNkZWZpbmUJRlI1MDhfRkxBR19PRkZTCTB4MTAwMAkvKiBTNTA4IHN0YXR1cyBmbGFncyBvZmZzZXQgKi8KLSNkZWZpbmUJRlI1MDJfUlhNQl9PRkZTCTB4OTAwCS8qIFM1MDIgZGlyZWN0IHJlY2VpdmUgbWFpbGJveCBvZmZzZXQgKi8KLSNkZWZpbmUJRlI1MDhfVFhCQ19PRkZTCTB4MTEwMAkvKiBTNTA4IFR4IGJ1ZmZlciBpbmZvIG9mZnNldCAqLwotI2RlZmluZQlGUjUwOF9SWEJDX09GRlMJMHgxMTIwCS8qIFM1MDggUnggYnVmZmVyIGluZm8gb2Zmc2V0ICovCi0KLS8qIEltcG9ydGFudCBjb25zdGFudHMgKi8KLSNkZWZpbmUgRlI1MDJfTUFYX0RBVEEJNDA5NgkvKiBtYXhpbXVtIGRhdGEgYnVmZmVyIGxlbmd0aCAqLwotI2RlZmluZSBGUjUwOF9NQVhfREFUQQk0MDgwCS8qIG1heGltdW0gZGF0YSBidWZmZXIgbGVuZ3RoICovCi0jZGVmaW5lIE1JTl9MR1RIX0ZSX0RBVEFfQ0ZHICAgICAgICAgMzAwICAgICAvKiBtaW4gSW5mb3JtYXRpb24gZnJhbWUgbGVuZ3RoCi0oZm9yIGNvbmZpZ3VyYXRpb24gcHVycG9zZXMpICovCi0jZGVmaW5lIEZSX01BWF9OT19EQVRBX0JZVEVTX0lOX0ZSQU1FICAxNTM1NCAJLyogbWF4IEluZm9ybWF0aW9uIGZyYW1lIGxlbmd0aCAqLwotIAotI2RlZmluZSBISUdIRVNUX1ZBTElEX0RMQ0kJOTkxCi0KLS8qKioqKiogRGF0YSBTdHJ1Y3R1cmVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIEZyYW1lIHJlbGF5IGNvbW1hbmQgYmxvY2suCi0gKi8KLXR5cGVkZWYgc3RydWN0IGZyX2NtZAotewotCXVuc2lnbmVkIGNoYXIgIGNvbW1hbmQJUEFDS0VEOwkvKiBjb21tYW5kIGNvZGUgKi8KLQl1bnNpZ25lZCBzaG9ydCBsZW5ndGgJUEFDS0VEOwkvKiBsZW5ndGggb2YgZGF0YSBidWZmZXIgKi8KLQl1bnNpZ25lZCBjaGFyICByZXN1bHQJUEFDS0VEOwkvKiByZXR1cm4gY29kZSAqLwotCXVuc2lnbmVkIHNob3J0IGRsY2kJUEFDS0VEOwkvKiBETENJIG51bWJlciAqLwotCXVuc2lnbmVkIGNoYXIgIGF0dHIJUEFDS0VEOwkvKiBGRUNOLCBCRUNOLCBERSBhbmQgQy9SIGJpdHMgKi8KLQl1bnNpZ25lZCBzaG9ydCByeGxvc3QxCVBBQ0tFRDsJLyogZnJhbWVzIGRpc2NhcmRlZCBhdCBpbnQuIGxldmVsICovCi0JdW5zaWduZWQgbG9uZyAgcnhsb3N0MglQQUNLRUQ7CS8qIGZyYW1lcyBkaXNjYXJkZWQgYXQgYXBwLiBsZXZlbCAqLwotCXVuc2lnbmVkIGNoYXIgIHJzcnZbMl0JUEFDS0VEOwkvKiByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAqLwotfSBmcl9jbWRfdDsKLQotLyogJ2NvbW1hbmQnIGZpZWxkIGRlZmluZXMgKi8KLSNkZWZpbmUJRlJfV1JJVEUJCTB4MDEKLSNkZWZpbmUJRlJfUkVBRAkJCTB4MDIKLSNkZWZpbmUJRlJfSVNTVUVfSVNfRlJBTUUJMHgwMwotI2RlZmluZSBGUl9TRVRfQ09ORklHCQkweDEwCi0jZGVmaW5lIEZSX1JFQURfQ09ORklHCQkweDExCi0jZGVmaW5lIEZSX0NPTU1fRElTQUJMRQkJMHgxMgotI2RlZmluZSBGUl9DT01NX0VOQUJMRQkJMHgxMwotI2RlZmluZSBGUl9SRUFEX1NUQVRVUwkJMHgxNAotI2RlZmluZSBGUl9SRUFEX1NUQVRJU1RJQ1MJMHgxNQotI2RlZmluZSBGUl9GTFVTSF9TVEFUSVNUSUNTCTB4MTYKLSNkZWZpbmUJRlJfTElTVF9BQ1RJVkVfRExDSQkweDE3Ci0jZGVmaW5lIEZSX0ZMVVNIX0RBVEFfQlVGRkVSUwkweDE4Ci0jZGVmaW5lIEZSX1JFQURfQUREX0RMQ19TVEFUUwkweDE5Ci0jZGVmaW5lCUZSX0FERF9ETENJCQkweDIwCi0jZGVmaW5lCUZSX0RFTEVURV9ETENJCQkweDIxCi0jZGVmaW5lCUZSX0FDVElWQVRFX0RMQ0kJMHgyMgotI2RlZmluZQlGUl9ERUFDVElWQVRFX0RMQ0kJMHgyMgotI2RlZmluZSBGUl9SRUFEX01PREVNX1NUQVRVUwkweDMwCi0jZGVmaW5lIEZSX1NFVF9NT0RFTV9TVEFUVVMJMHgzMQotI2RlZmluZSBGUl9SRUFEX0VSUk9SX1NUQVRTCTB4MzIKLSNkZWZpbmUgRlJfRkxVU0hfRVJST1JfU1RBVFMJMHgzMwotI2RlZmluZSBGUl9SRUFEX0RMQ0lfSUJfTUFQUElORyAweDM0Ci0jZGVmaW5lIEZSX1JFQURfQ09ERV9WRVJTSU9OCTB4NDAKLSNkZWZpbmUJRlJfU0VUX0lOVFJfTU9ERQkweDUwCi0jZGVmaW5lCUZSX1JFQURfSU5UUl9NT0RFCTB4NTEKLSNkZWZpbmUgRlJfU0VUX1RSQUNFX0NPTkZJRwkweDYwCi0jZGVmaW5lIEZSX0ZUMV9TVEFUVVNfQ1RSTCAJMHg4MAotI2RlZmluZSBGUl9TRVRfRlQxX01PREUJCTB4ODEKLQotLyogU3BlY2lhbCBVRFAgZHJpdmVycyBtYW5hZ2VtZW50IGNvbW1hbmRzICovCi0jZGVmaW5lIEZQSVBFX0VOQUJMRV9UUkFDSU5HICAgICAgICAgIAkweDQxCi0jZGVmaW5lIEZQSVBFX0RJU0FCTEVfVFJBQ0lORwkJMHg0MgotI2RlZmluZSBGUElQRV9HRVRfVFJBQ0VfSU5GTyAgICAgICAgICAgIDB4NDMKLSNkZWZpbmUgRlBJUEVfRlQxX1JFQURfU1RBVFVTICAgICAgICAgICAweDQ0Ci0jZGVmaW5lIEZQSVBFX0RSSVZFUl9TVEFUX0lGU0VORCAgICAgICAgMHg0NQotI2RlZmluZSBGUElQRV9EUklWRVJfU1RBVF9JTlRSICAgICAgICAgIDB4NDYKLSNkZWZpbmUgRlBJUEVfRFJJVkVSX1NUQVRfR0VOICAgICAgICAgICAweDQ3Ci0jZGVmaW5lIEZQSVBFX0ZMVVNIX0RSSVZFUl9TVEFUUyAgICAgICAgMHg0OAotI2RlZmluZSBGUElQRV9ST1VURVJfVVBfVElNRSAgICAgICAgICAgIDB4NDkKLQotLyogJ3Jlc3VsdCcgZmllbGQgZGVmaW5lcyAqLwotI2RlZmluZSBGUlJFU19PSwkJMHgwMAkvKiBjb21tYW5kIGV4ZWN1dGVkIHN1Y2Nlc3NmdWxseSAqLwotI2RlZmluZQlGUlJFU19ESVNBQkxFRAkJMHgwMQkvKiBjb21tdW5pY2F0aW9ucyBub3QgZW5hYmxlZCAqLwotI2RlZmluZQlGUlJFU19JTk9QRVJBVElWRQkweDAyCS8qIGNoYW5uZWwgaW5vcGVyYXRpdmUgKi8KLSNkZWZpbmUJRlJSRVNfRExDSV9JTkFDVElWRQkweDAzCS8qIERMQ0kgaXMgaW5hY3RpdmUgKi8KLSNkZWZpbmUJRlJSRVNfRExDSV9JTlZBTElECTB4MDQJLyogRExDSSBpcyBub3QgY29uZmlndXJlZCAqLwotI2RlZmluZQlGUlJFU19UT09fTE9ORwkJMHgwNQotI2RlZmluZQlGUlJFU19UT09fTUFOWQkJMHgwNgotI2RlZmluZQlGUlJFU19DSVJfT1ZFUkZMT1cJMHgwNwkvKiBUeCB0aHJvdWdocHV0IGhhcyBleGNlZWRlZCBDSVIgKi8KLSNkZWZpbmUJRlJSRVNfQlVGRkVSX09WRVJGTE9XCTB4MDgKLSNkZWZpbmUJRlJSRVNfTU9ERU1fRkFJTFVSRQkweDEwCS8qIERDRCBhbmQvb3IgQ1RTIGRyb3BwZWQgKi8KLSNkZWZpbmUJRlJSRVNfQ0hBTk5FTF9ET1dOCTB4MTEJLyogY2hhbm5lbCBiZWNhbWUgaW5vcGVyYXRpdmUgKi8KLSNkZWZpbmUJRlJSRVNfQ0hBTk5FTF9VUAkweDEyCS8qIGNoYW5uZWwgYmVjYW1lIG9wZXJhdGl2ZSAqLwotI2RlZmluZQlGUlJFU19ETENJX0NIQU5HRQkweDEzCS8qIERMQ0kgc3RhdHVzIChvciBudW1iZXIpIGNoYW5nZWQgKi8KLSNkZWZpbmUJRlJSRVNfRExDSV9NSVNNQVRDSAkweDE0Ci0jZGVmaW5lCUZSUkVTX0lOVkFMSURfQ01ECTB4MUYJLyogaW52YWxpZCBjb21tYW5kICovCi0KLS8qICdhdHRyJyBmaWVsZCBkZWZpbmVzICovCi0jZGVmaW5lCUZSQVRUUl8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBGcmFtZSByZWxheSBtYWlsYm94LgotICoJVGhpcyBzdHJ1Y3R1cmUgaXMgbG9jYXRlZCBhdCBvZmZzZXQgRlI1MD9fTUJPWF9PRkZTIGludG8gRlJfTUJfVkVDVE9SLgotICoJRm9yIFM1MDIgaXQgaXMgYWxzbyBsb2NhdGVkIGF0IG9mZnNldCBGUjUwMl9SWE1CX09GRlMgaW50bwotICoJRlI1MDJfUlhfVkVDVE9SLgotICovCi10eXBlZGVmIHN0cnVjdCBmcl9tYm94Ci17Ci0JdW5zaWduZWQgY2hhciBvcGZsYWcJUEFDS0VEOwkvKiAwMGg6IGV4ZWN1dGlvbiBmbGFnICovCi0JZnJfY21kX3QgY21kCQlQQUNLRUQ7CS8qIDAxaDogY29tbWFuZCBibG9jayAqLwotCXVuc2lnbmVkIGNoYXIgZGF0YVsxXQlQQUNLRUQ7CS8qIDEwaDogdmFyaWFibGUgbGVuZ3RoIGRhdGEgYnVmZmVyICovCi19IGZyX21ib3hfdDsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBTNTAyIGZyYW1lIHJlbGF5IHN0YXR1cyBmbGFncy4KLSAqCVRoaXMgc3RydWN0dXJlIGlzIGxvY2F0ZWQgYXQgb2Zmc2V0IEZSNTAyX0ZMQUdfT0ZGUyBpbnRvIEZSX01CX1ZFQ1RPUi4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QJZnI1MDJfZmxhZ3MKLXsJCi0JdW5zaWduZWQgY2hhciByc3J2MVsxXQlQQUNLRUQ7CS8qIDAwaDogKi8KLQl1bnNpZ25lZCBjaGFyIHR4X3JlYWR5CVBBQ0tFRDsJLyogMDFoOiBUeCBidWZmZXIgYXZhaWxhYmxlICovCi0JdW5zaWduZWQgY2hhciByeF9yZWFkeQlQQUNLRUQ7CS8qIDAyaDogUnggZnJhbWUgYXZhaWxhYmxlICovCi0JdW5zaWduZWQgY2hhciBldmVudAlQQUNLRUQ7CS8qIDAzaDogYXN5bmNocm9ub3VzIGV2ZW50ICovCi0JdW5zaWduZWQgY2hhciBtc3RhdHVzCVBBQ0tFRDsJLyogMDRoOiBtb2RlbSBzdGF0dXMgKi8KLQl1bnNpZ25lZCBjaGFyIHJzcnYyWzhdCVBBQ0tFRDsJLyogMDVoOiAqLwotCXVuc2lnbmVkIGNoYXIgaWZsYWcJUEFDS0VEOwkvKiAwRGg6IGludGVycnVwdCBmbGFnICovCi0JdW5zaWduZWQgY2hhciBpbWFzawlQQUNLRUQ7CS8qIDBFaDogaW50ZXJydXB0IG1hc2sgKi8KLX0gZnI1MDJfZmxhZ3NfdDsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBTNTA4IGZyYW1lIHJlbGF5IHN0YXR1cyBmbGFncy4KLSAqCVRoaXMgc3RydWN0dXJlIGlzIGxvY2F0ZWQgYXQgb2Zmc2V0IEZSNTA4X0ZMQUdfT0ZGUyBpbnRvIEZSX01CX1ZFQ1RPUi4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QJZnI1MDhfZmxhZ3MKLXsKLQl1bnNpZ25lZCBjaGFyIHJzcnYxWzNdCVBBQ0tFRDsJLyogMDBoOiByZXNlcnZlZCAqLwotCXVuc2lnbmVkIGNoYXIgZXZlbnQJUEFDS0VEOwkvKiAwM2g6IGFzeW5jaHJvbm91cyBldmVudCAqLwotCXVuc2lnbmVkIGNoYXIgbXN0YXR1cwlQQUNLRUQ7CS8qIDA0aDogbW9kZW0gc3RhdHVzICovCi0JdW5zaWduZWQgY2hhciByc3J2MlsxMV0JUEFDS0VEOwkvKiAwNWg6IHJlc2VydmVkICovCi0JdW5zaWduZWQgY2hhciBpZmxhZwlQQUNLRUQ7CS8qIDEwaDogaW50ZXJydXB0IGZsYWcgKi8KLQl1bnNpZ25lZCBjaGFyIGltYXNrCVBBQ0tFRDsJLyogMTFoOiBpbnRlcnJ1cHQgbWFzayAqLwotCXVuc2lnbmVkIGxvbmcgdHNlX29mZnMJUEFDS0VEOwkvKiAxMmg6IFR4IHN0YXR1cyBlbGVtZW50ICovCi0JdW5zaWduZWQgc2hvcnQgZGxjaQlQQUNLRUQ7IC8qIDE2aDogRExDSSBOVU1CRVIgKi8KLX0gZnI1MDhfZmxhZ3NfdDsKLQotLyogJ2V2ZW50JyBmaWVsZCBkZWZpbmVzICovCi0jZGVmaW5lCUZSX0VWRU5UX1NUQVRVUwkJMHgwMQkvKiBjaGFubmVsIHN0YXR1cyBjaGFuZ2UgKi8KLSNkZWZpbmUJRlJfRVZFTlRfRExDX1NUQVRVUwkweDAyCS8qIERMQyBzdGF0dXMgY2hhbmdlICovCi0jZGVmaW5lCUZSX0VWRU5UX0JBRF9ETENJCTB4MDQJLyogRlNSIGluY2x1ZGVkIHdyb25nIERMQ0kgKi8KLSNkZWZpbmUJRlJfRVZFTlRfTElOS19ET1dOCTB4NDAJLyogRENEIG9yIENUUyBsb3cgKi8KLQotLyogJ21zdGF0dXMnIGZpZWxkIGRlZmluZXMgKi8KLSNkZWZpbmUJRlJfTURNX0RDRAkJMHgwOAkvKiBtZG1fc3RhdHVzOiBEQ0QgKi8KLSNkZWZpbmUJRlJfTURNX0NUUwkJMHgyMAkvKiBtZG1fc3RhdHVzOiBDVFMgKi8KLQotLyogJ2lmbGFnJyAmICdpbWFzaycgZmllbGRzIGRlZmluZXMgKi8KLSNkZWZpbmUJRlJfSU5UUl9SWFJEWQkJMHgwMQkvKiBSeCByZWFkeSAqLwotI2RlZmluZQlGUl9JTlRSX1RYUkRZCQkweDAyCS8qIFR4IHJlYWR5ICovCi0jZGVmaW5lCUZSX0lOVFJfTU9ERU0JCTB4MDQJLyogbW9kZW0gc3RhdHVzIGNoYW5nZSAoRENELCBDVFMpICovCi0jZGVmaW5lCUZSX0lOVFJfUkVBRFkJCTB4MDgJLyogaW50ZXJmYWNlIGNvbW1hbmQgY29tcGxldGVkICovCi0jZGVmaW5lCUZSX0lOVFJfRExDCQkweDEwCS8qIERMQyBzdGF0dXMgY2hhbmdlICovCi0jZGVmaW5lCUZSX0lOVFJfVElNRVIJCTB4MjAJLyogbWlsbGlzZWNvbmQgdGltZXIgKi8KLSNkZWZpbmUgRlJfSU5UUl9UWF9NVUxUX0RMQ0lzCTB4ODAJLyogVHggaW50ZXJydXB0IG9uIG11bHRpcGxlIERMQ0lzICovCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBSZWNlaXZlIEJ1ZmZlciBDb25maWd1cmF0aW9uIEluZm8uIFM1MDggb25seSEKLSAqCVRoaXMgc3RydWN0dXJlIGlzIGxvY2F0ZWQgYXQgb2Zmc2V0IEZSNTA4X1JYQkNfT0ZGUyBpbnRvIEZSX01CX1ZFQ1RPUi4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QJZnJfYnVmX2luZm8KLXsKLQl1bnNpZ25lZCBzaG9ydCByc2VfbnVtCVBBQ0tFRDsJLyogMDBoOiBudW1iZXIgb2Ygc3RhdHVzIGVsZW1lbnRzICovCi0JdW5zaWduZWQgbG9uZyByc2VfYmFzZQlQQUNLRUQ7CS8qIDAyaDogcmVjZWl2ZSBzdGF0dXMgYXJyYXkgYmFzZSAqLwotCXVuc2lnbmVkIGxvbmcgcnNlX25leHQJUEFDS0VEOwkvKiAwNmg6IG5leHQgc3RhdHVzIGVsZW1lbnQgKi8KLQl1bnNpZ25lZCBsb25nIGJ1Zl9iYXNlCVBBQ0tFRDsJLyogMEFoOiByb3RhdGlvbmFsIGJ1ZmZlciBiYXNlICovCi0JdW5zaWduZWQgc2hvcnQgcmVzZXJ2ZWQJUEFDS0VEOwkvKiAwRWg6ICAqLwotCXVuc2lnbmVkIGxvbmcgYnVmX3RvcAlQQUNLRUQ7CS8qIDEwaDogcm90YXRpb25hbCBidWZmZXIgdG9wICovCi19IGZyX2J1Zl9pbmZvX3Q7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogQnVmZmVyIFN0YXR1cyBFbGVtZW50LiBTNTA4IG9ubHkhCi0gKglBcnJheSBvZiBzdHJ1Y3R1cmVzIG9mIHRoaXMgdHlwZSBpcyBsb2NhdGVkIGF0IG9mZnNldCBkZWZpbmVkIGJ5IHRoZQotICoJJ3JzZV9iYXNlJyBmaWVsZCBvZiB0aGUgZnJCdWZJbmZvX3Qgc3RydWN0dXJlIGludG8gYWJzb2x1dGUgYWRhcHRlcgotICoJbWVtb3J5IGFkZHJlc3Mgc3BhY2UuCi0gKi8KLXR5cGVkZWYgc3RydWN0CWZyX3J4X2J1Zl9jdGwKLXsKLQl1bnNpZ25lZCBjaGFyIGZsYWcJUEFDS0VEOwkvKiAwMGg6IHJlYWR5IGZsYWcgKi8KLQl1bnNpZ25lZCBzaG9ydCBsZW5ndGgJUEFDS0VEOwkvKiAwMWg6IGZyYW1lIGxlbmd0aCAqLwotCXVuc2lnbmVkIHNob3J0IGRsY2kJUEFDS0VEOwkvKiAwM2g6IERMQ0kgKi8KLQl1bnNpZ25lZCBjaGFyIGF0dHIJUEFDS0VEOwkvKiAwNWg6IEZFQ04vQkVDTi9ERS9DUiAqLwotCXVuc2lnbmVkIHNob3J0IHRtc3RhbXAJUEFDS0VEOwkvKiAwNmg6IHRpbWUgc3RhbXAgKi8KLQl1bnNpZ25lZCBzaG9ydCByc3J2WzJdCVBBQ0tFRDsgLyogMDhoOiAgKi8KLQl1bnNpZ25lZCBsb25nIG9mZnNldAlQQUNLRUQ7CS8qIDBDaDogYnVmZmVyIGFic29sdXRlIGFkZHJlc3MgKi8KLX0gZnJfcnhfYnVmX2N0bF90OwotCi10eXBlZGVmIHN0cnVjdCAgZnJfdHhfYnVmX2N0bAotewotICAgICAgICB1bnNpZ25lZCBjaGFyIGZsYWcgICAgICBQQUNLRUQ7IC8qIDAwaDogcmVhZHkgZmxhZyAqLwotCXVuc2lnbmVkIHNob3J0IHJzcnYwWzJdCVBBQ0tFRDsJLyogMDFoOiAqLwotICAgICAgICB1bnNpZ25lZCBzaG9ydCBsZW5ndGggICBQQUNLRUQ7IC8qIDA1aDogZnJhbWUgbGVuZ3RoICovCi0gICAgICAgIHVuc2lnbmVkIHNob3J0IGRsY2kgICAgIFBBQ0tFRDsgLyogMDdoOiBETENJICovCi0gICAgICAgIHVuc2lnbmVkIGNoYXIgYXR0ciAgICAgIFBBQ0tFRDsgLyogMDloOiBGRUNOL0JFQ04vREUvQ1IgKi8KLSAgICAgICAgdW5zaWduZWQgc2hvcnQgcnNydjEgCVBBQ0tFRDsgLyogMEFoOiAgKi8KLSAgICAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQgICAgUEFDS0VEOyAvKiAwQ2g6IGJ1ZmZlciBhYnNvbHV0ZSBhZGRyZXNzICovCi19IGZyX3R4X2J1Zl9jdGxfdDsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBHbG9iYWwgQ29uZmlndXJhdGlvbiBCbG9jay4gUGFzc2VkIHRvIEZSX1NFVF9DT05GSUcgY29tbWFuZCB3aGVuIGRsY2kgPT0gMC4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QJZnJfY29uZgotewotCXVuc2lnbmVkIHNob3J0IHN0YXRpb24JUEFDS0VEOwkvKiAwMGg6IENQRS9Ob2RlICovCi0JdW5zaWduZWQgc2hvcnQgb3B0aW9ucwlQQUNLRUQ7CS8qIDAyaDogY29uZmlndXJhdGlvbiBvcHRpb25zICovCi0JdW5zaWduZWQgc2hvcnQga2JwcwlQQUNLRUQ7CS8qIDA0aDogYmF1ZCByYXRlIGluIGticHMgKi8KLQl1bnNpZ25lZCBzaG9ydCBwb3J0CVBBQ0tFRDsJLyogMDZoOiBSUy0yMzIvVi4zNSAqLwotCXVuc2lnbmVkIHNob3J0IG10dQlQQUNLRUQ7CS8qIDA4aDogbWF4LiB0cmFuc21pdCBsZW5ndGggKi8KLQl1bnNpZ25lZCBzaG9ydCB0MzkxCVBBQ0tFRDsJLyogMEFoOiAgKi8KLQl1bnNpZ25lZCBzaG9ydCB0MzkyCVBBQ0tFRDsJLyogMENoOiAgKi8KLQl1bnNpZ25lZCBzaG9ydCBuMzkxCVBBQ0tFRDsJLyogMEVoOiAgKi8KLQl1bnNpZ25lZCBzaG9ydCBuMzkyCVBBQ0tFRDsJLyogMTBoOiAgKi8KLQl1bnNpZ25lZCBzaG9ydCBuMzkzCVBBQ0tFRDsJLyogMTJoOiAgKi8KLQl1bnNpZ25lZCBzaG9ydCBjaXJfZndkCVBBQ0tFRDsJLyogMTRoOiAgKi8KLQl1bnNpZ25lZCBzaG9ydCBiY19md2QJUEFDS0VEOwkvKiAxNmg6ICAqLwotCXVuc2lnbmVkIHNob3J0IGJlX2Z3ZAlQQUNLRUQ7CS8qIDE4aDogICovCi0JdW5zaWduZWQgc2hvcnQgY2lyX2J3ZAlQQUNLRUQ7CS8qIDFBaDogICovCi0JdW5zaWduZWQgc2hvcnQgYmNfYndkCVBBQ0tFRDsJLyogMUNoOiAgKi8KLQl1bnNpZ25lZCBzaG9ydCBiZV9id2QJUEFDS0VEOwkvKiAxRWg6ICAqLwotCXVuc2lnbmVkIHNob3J0IGRsY2lbMF0JUEFDS0VEOwkvKiAyMGg6ICAqLwotfSBmcl9jb25mX3Q7Ci0KLS8qICdzdGF0aW9uX3R5cGUnIGRlZmluZXMgKi8KLSNkZWZpbmUJRlJDRkdfU1RBVElPTl9DUEUJMAotI2RlZmluZQlGUkNGR19TVEFUSU9OX05PREUJMQotCi0vKiAnY29uZl9mbGFncycgZGVmaW5lcyAqLwotI2RlZmluZQlGUkNGR19JR05PUkVfVFhfQ0lSCTB4MDAwMQotI2RlZmluZQlGUkNGR19JR05PUkVfUlhfQ0lSCTB4MDAwMgotI2RlZmluZQlGUkNGR19ET05UX1JFVFJBTlNNSVQJMHgwMDA0Ci0jZGVmaW5lCUZSQ0ZHX0lHTk9SRV9DQlMJMHgwMDA4Ci0jZGVmaW5lCUZSQ0ZHX1RIUk9VR0hQVVQJMHgwMDEwCS8qIGVuYWJsZSB0aHJvdWdocHV0IGNhbGN1bGF0aW9uICovCi0jZGVmaW5lCUZSQ0ZHX0RJUkVDVF9SWAkJMHgwMDgwCS8qIGVuYWJsZSBkaXJlY3QgcmVjZWl2ZSBidWZmZXIgKi8KLSNkZWZpbmUJRlJDRkdfQVVUT19DT05GSUcJMHg4MDAwCS8qIGVuYWJsZSAgYXV0byBETENJIGNvbmZpZ3VyYXRpb24gKi8KLQotLyogJ2JhdWRfcmF0ZScgZGVmaW5lcyAqLwotI2RlZmluZQlGUkNGR19CQVVEXzEyMDAJCTEyCi0jZGVmaW5lCUZSQ0ZHX0JBVURfMjQwMAkJMjQKLSNkZWZpbmUJRlJDRkdfQkFVRF80ODAwCQk0OAotI2RlZmluZQlGUkNGR19CQVVEXzk2MDAJCTk2Ci0jZGVmaW5lCUZSQ0ZHX0JBVURfMTkyMDAJMTkKLSNkZWZpbmUJRlJDRkdfQkFVRF8zODQwMAkzOAotI2RlZmluZQlGUkNGR19CQVVEXzU2MDAwCTU2Ci0jZGVmaW5lCUZSQ0ZHX0JBVURfNjQwMDAJNjQKLSNkZWZpbmUJRlJDRkdfQkFVRF8xMjgwMDAJMTI4Ci0KLS8qICdwb3J0X21vZGUnIGRlZmluZXMgKi8KLSNkZWZpbmUJRlJDRkdfTU9ERV9FWFRfQ0xLCTB4MDAwMAotI2RlZmluZQlGUkNGR19NT0RFX0lOVF9DTEsJMHgwMDAxCi0jZGVmaW5lCUZSQ0ZHX01PREVfVjM1CQkweDAwMDAJLyogUzUwOCBvbmx5ICovCi0jZGVmaW5lCUZSQ0ZHX01PREVfUlMyMzIJMHgwMDAyCS8qIFM1MDggb25seSAqLwotCi0vKiBkZWZpbmVzIGZvciBsaW5lIHRyYWNpbmcgKi8KLQotLyogdGhlIGxpbmUgdHJhY2Ugc3RhdHVzIGVsZW1lbnQgcHJlc2VudGVkIGJ5IHRoZSBmcmFtZSByZWxheSBjb2RlICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgZmxhZyAgICAgIFBBQ0tFRDsgLyogcmVhZHkgZmxhZyAqLwotICAgICAgICB1bnNpZ25lZCBzaG9ydCBsZW5ndGggICBQQUNLRUQ7IC8qIHRyYWNlIGxlbmd0aCAqLwotICAgICAgICB1bnNpZ25lZCBjaGFyIHJzcnYwWzJdICBQQUNLRUQ7IC8qIHJlc2VydmVkICovCi0gICAgICAgIHVuc2lnbmVkIGNoYXIgYXR0ciAgICAgIFBBQ0tFRDsgLyogdHJhY2UgYXR0cmlidXRlcyAqLwotICAgICAgICB1bnNpZ25lZCBzaG9ydCB0bXN0YW1wICBQQUNLRUQ7IC8qIHRpbWUgc3RhbXAgKi8KLSAgICAgICAgdW5zaWduZWQgY2hhciByc3J2MVs0XSAgUEFDS0VEOyAvKiByZXNlcnZlZCAqLwotICAgICAgICB1bnNpZ25lZCBsb25nIG9mZnNldCAgICBQQUNLRUQ7IC8qIGJ1ZmZlciBhYnNvbHV0ZSBhZGRyZXNzICovCi19IGZyX3RyY19lbF90OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgc3RhdHVzICAgIAlQQUNLRUQ7IC8qIHN0YXR1cyBmbGFnICovCi0JdW5zaWduZWQgY2hhciBkYXRhX3Bhc3NlZAlQQUNLRUQ7CS8qIDAgaWYgbm8gZGF0YSBwYXNzZWQsIDEgaWYgKi8KLQkJCQkJCS8qIGRhdGEgcGFzc2VkICovCi0gICAgICAgIHVuc2lnbmVkIHNob3J0IGxlbmd0aCAgIAlQQUNLRUQ7IC8qIGZyYW1lIGxlbmd0aCAqLwotICAgICAgICB1bnNpZ25lZCBzaG9ydCB0bXN0YW1wICAJUEFDS0VEOyAvKiB0aW1lIHN0YW1wICovCi19IGZwaXBlbW9uX3RyY19oZHJfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotCWZwaXBlbW9uX3RyY19oZHJfdCBmcGlwZW1vbl90cmNfaGRyCQkJUEFDS0VEOwotICAgICAgICB1bnNpZ25lZCBjaGFyIGRhdGFbRlJfTUFYX05PX0RBVEFfQllURVNfSU5fRlJBTUVdCVBBQ0tFRDsKLX0gZnBpcGVtb25fdHJjX3Q7Ci0KLS8qIGJpdCBzZXR0aW5ncyBmb3IgdGhlICdzdGF0dXMnIGJ5dGUgIC0gbm90ZSB0aGF0IGJpdHMgMSwgMiBhbmQgMyBhcmUgdXNlZCAqLwotLyogZm9yIHJldHVybmluZyB0aGUgbnVtYmVyIG9mIGZyYW1lcyBiZWluZyBwYXNzZWQgdG8gZnBpcGVtb24gKi8KLSNkZWZpbmUgVFJDX09VVEdPSU5HX0ZSTQkweDAxCi0jZGVmaW5lIFRSQ19BQk9SVF9FUlJPUiAgICAgICAgIDB4MTAKLSNkZWZpbmUgVFJDX0NSQ19FUlJPUiAgICAgICAgICAgMHgyMAotI2RlZmluZSBUUkNfT1ZFUlJVTl9FUlJPUiAgICAgICAweDQwCi0jZGVmaW5lIE1PUkVfVFJDX0RBVEEJCTB4ODAKLQotI2RlZmluZSBNQVhfRlJNU19UUkFDRUQJCTB4MDcKLQotI2RlZmluZSBOT19UUkNfRUxFTUVOVFNfT0ZGCQkweDkwMDAKLSNkZWZpbmUgQkFTRV9UUkNfRUxFTUVOVFNfT0ZGCQkweDkwMDIKLSNkZWZpbmUgVFJDX0FDVElWRQkJCTB4MDEKLSNkZWZpbmUgRkxVU0hfVFJDX0JVRkZFUlMgCQkweDAyCi0jZGVmaW5lIEZMVVNIX1RSQ19TVEFUSVNUSUNTCQkweDA0Ci0jZGVmaW5lIFRSQ19TSUdOQUxMSU5HX0ZSTVMJCTB4MTAKLSNkZWZpbmUgVFJDX0lORk9fRlJNUwkJCTB4MjAKLSNkZWZpbmUgQUNUSVZBVEVfVFJDCShUUkNfQUNUSVZFIHwgVFJDX1NJR05BTExJTkdfRlJNUyB8IFRSQ19JTkZPX0ZSTVMpCi0jZGVmaW5lIFJFU0VUX1RSQwkoRkxVU0hfVFJDX0JVRkZFUlMgfCBGTFVTSF9UUkNfU1RBVElTVElDUykKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBDaGFubmVsIGNvbmZpZ3VyYXRpb24uCi0gKglUaGlzIHN0cnVjdHVyZSBpcyBwYXNzZWQgdG8gdGhlIEZSX1NFVF9DT05GSUcgY29tbWFuZCB3aGVuIGRsY2kgIT0gMC4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QJZnJfZGxjX2NvbmYKLXsKLQl1bnNpZ25lZCBzaG9ydCBjb25mX2ZsYWdzCVBBQ0tFRDsJLyogMDBoOiBjb25maWd1cmF0aW9uIGJpdHMgKi8KLQl1bnNpZ25lZCBzaG9ydCBjaXJfZndkCQlQQUNLRUQ7CS8qIDAyaDogICovCi0JdW5zaWduZWQgc2hvcnQgYmNfZndkCQlQQUNLRUQ7CS8qIDA0aDogICovCi0JdW5zaWduZWQgc2hvcnQgYmVfZndkCQlQQUNLRUQ7CS8qIDA2aDogICovCi0JdW5zaWduZWQgc2hvcnQgY2lyX2J3ZAkJUEFDS0VEOwkvKiAwOGg6ICAqLwotCXVuc2lnbmVkIHNob3J0IGJjX2J3ZAkJUEFDS0VEOwkvKiAwQWg6ICAqLwotCXVuc2lnbmVkIHNob3J0IGJlX2J3ZAkJUEFDS0VEOwkvKiAwQ2g6ICAqLwotfSBmcl9kbGNfY29uZl90OwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIFM1MDIgaW50ZXJydXB0IG1vZGUgY29udHJvbCBibG9jay4KLSAqCVRoaXMgc3RydWN0dXJlIGlzIHBhc3NlZCB0byB0aGUgRlJfU0VUX0lOVFJfRkxBR1MgYW5kIHJldHVybmVkIGJ5IHRoZQotICoJRlJfUkVBRF9JTlRSX0ZMQUdTIGNvbW1hbmRzLgotICovCi10eXBlZGVmIHN0cnVjdCBmcjUwMl9pbnRyX2N0bAotewotCXVuc2lnbmVkIGNoYXIgbW9kZQlQQUNLRUQ7CS8qIDAwaDogaW50ZXJydXB0IGVuYWJsZSBmbGFncyAqLwotCXVuc2lnbmVkIHNob3J0IHR4X2xlbglQQUNLRUQ7CS8qIDAxaDogcmVxdWlyZWQgVHggYnVmZmVyIHNpemUgKi8KLX0gZnI1MDJfaW50cl9jdGxfdDsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBTNTA4IGludGVycnVwdCBtb2RlIGNvbnRyb2wgYmxvY2suCi0gKglUaGlzIHN0cnVjdHVyZSBpcyBwYXNzZWQgdG8gdGhlIEZSX1NFVF9JTlRSX0ZMQUdTIGFuZCByZXR1cm5lZCBieSB0aGUKLSAqCUZSX1JFQURfSU5UUl9GTEFHUyBjb21tYW5kcy4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgZnI1MDhfaW50cl9jdGwKLXsKLQl1bnNpZ25lZCBjaGFyIG1vZGUJUEFDS0VEOwkvKiAwMGg6IGludGVycnVwdCBlbmFibGUgZmxhZ3MgKi8KLQl1bnNpZ25lZCBzaG9ydCB0eF9sZW4JUEFDS0VEOwkvKiAwMWg6IHJlcXVpcmVkIFR4IGJ1ZmZlciBzaXplICovCi0JdW5zaWduZWQgY2hhciBpcnEJUEFDS0VEOwkvKiAwM2g6IElSUSBsZXZlbCB0byBhY3RpdmF0ZSAqLwotCXVuc2lnbmVkIGNoYXIgZmxhZ3MJUEFDS0VEOwkvKiAwNGg6ID8/ICovCi0JdW5zaWduZWQgc2hvcnQgdGltZW91dAlQQUNLRUQ7CS8qIDA1aDogbXMsIGZvciB0aW1lciBpbnRlcnJ1cHQgKi8KLX0gZnI1MDhfaW50cl9jdGxfdDsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBDaGFubmVsIHN0YXR1cy4KLSAqCVRoaXMgc3RydWN0dXJlIGlzIHJldHVybmVkIGJ5IHRoZSBGUl9SRUFEX1NUQVRVUyBjb21tYW5kLgotICovCi10eXBlZGVmIHN0cnVjdAlmcl9kbGNfU3RhdHVzCi17Ci0JdW5zaWduZWQgY2hhciBzdGF0dXMJCVBBQ0tFRDsJLyogMDBoOiBsaW5rL0RMQ0kgc3RhdHVzICovCi0Jc3RydWN0Ci0JewotCQl1bnNpZ25lZCBzaG9ydCBkbGNpCVBBQ0tFRDsJLyogMDFoOiBETENJIG51bWJlciAqLwotCQl1bnNpZ25lZCBjaGFyIHN0YXR1cwlQQUNLRUQ7CS8qIDAzaDogRExDSSBzdGF0dXMgKi8KLQl9IGNpcmN1aXRbMV0JCQlQQUNLRUQ7Ci19IGZyX2RsY19zdGF0dXNfdDsKLQotLyogJ3N0YXR1cycgZGVmaW5lcyAqLwotI2RlZmluZQlGUl9MSU5LX0lOT1BFUgkweDAwCQkvKiBmb3IgZ2xvYmFsIHN0YXR1cyAoRExDSSA9PSAwKSAqLwotI2RlZmluZQlGUl9MSU5LX09QRVIJMHgwMQotI2RlZmluZQlGUl9ETENJX0RFTEVURUQJMHgwMQkJLyogZm9yIGNpcmN1aXQgc3RhdHVzIChETENJICE9IDApICovCi0jZGVmaW5lCUZSX0RMQ0lfQUNUSVZFCTB4MDIKLSNkZWZpbmUJRlJfRExDSV9XQUlUSU5HCTB4MDQKLSNkZWZpbmUJRlJfRExDSV9ORVcJMHgwOAotI2RlZmluZQlGUl9ETENJX1JFUE9SVAkweDQwCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogR2xvYmFsIFN0YXRpc3RpY3MgQmxvY2suCi0gKglUaGlzIHN0cnVjdHVyZSBpcyByZXR1cm5lZCBieSB0aGUgRlJfUkVBRF9TVEFUSVNUSUNTIGNvbW1hbmQgd2hlbgotICoJZGNsaSA9PSAwLgotICovCi10eXBlZGVmIHN0cnVjdAlmcl9saW5rX3N0YXQKLXsKLQl1bnNpZ25lZCBzaG9ydCByeF90b29fbG9uZwlQQUNLRUQ7CS8qIDAwaDogICovCi0JdW5zaWduZWQgc2hvcnQgcnhfZHJvcHBlZAlQQUNLRUQ7CS8qIDAyaDogICovCi0JdW5zaWduZWQgc2hvcnQgcnhfZHJvcHBlZDIJUEFDS0VEOwkvKiAwNGg6ICAqLwotCXVuc2lnbmVkIHNob3J0IHJ4X2JhZF9kbGNpCVBBQ0tFRDsJLyogMDZoOiAgKi8KLQl1bnNpZ25lZCBzaG9ydCByeF9iYWRfZm9ybWF0CVBBQ0tFRDsJLyogMDhoOiAgKi8KLQl1bnNpZ25lZCBzaG9ydCByZXRyYW5zbWl0dGVkCVBBQ0tFRDsJLyogMEFoOiAgKi8KLQl1bnNpZ25lZCBzaG9ydCBjcGVfdHhfRlNFCVBBQ0tFRDsJLyogMENoOiAgKi8KLQl1bnNpZ25lZCBzaG9ydCBjcGVfdHhfTElWCVBBQ0tFRDsJLyogMEVoOiAgKi8KLQl1bnNpZ25lZCBzaG9ydCBjcGVfcnhfRlNSCVBBQ0tFRDsJLyogMTBoOiAgKi8KLQl1bnNpZ25lZCBzaG9ydCBjcGVfcnhfTElWCVBBQ0tFRDsJLyogMTJoOiAgKi8KLQl1bnNpZ25lZCBzaG9ydCBub2RlX3J4X0ZTRQlQQUNLRUQ7CS8qIDE0aDogICovCi0JdW5zaWduZWQgc2hvcnQgbm9kZV9yeF9MSVYJUEFDS0VEOwkvKiAxNmg6ICAqLwotCXVuc2lnbmVkIHNob3J0IG5vZGVfdHhfRlNSCVBBQ0tFRDsJLyogMThoOiAgKi8KLQl1bnNpZ25lZCBzaG9ydCBub2RlX3R4X0xJVglQQUNLRUQ7CS8qIDFBaDogICovCi0JdW5zaWduZWQgc2hvcnQgcnhfSVNGX2VycglQQUNLRUQ7CS8qIDFDaDogICovCi0JdW5zaWduZWQgc2hvcnQgcnhfdW5zb2xpY2l0ZWQJUEFDS0VEOwkvKiAxRWg6ICAqLwotCXVuc2lnbmVkIHNob3J0IHJ4X1NTTl9lcnIJUEFDS0VEOwkvKiAyMGg6ICAqLwotCXVuc2lnbmVkIHNob3J0IHJ4X1JTTl9lcnIJUEFDS0VEOwkvKiAyMmg6ICAqLwotCXVuc2lnbmVkIHNob3J0IFQzOTFfdGltZW91dHMJUEFDS0VEOwkvKiAyNGg6ICAqLwotCXVuc2lnbmVkIHNob3J0IFQzOTJfdGltZW91dHMJUEFDS0VEOwkvKiAyNmg6ICAqLwotCXVuc2lnbmVkIHNob3J0IE4zOTJfcmVhY2hlZAlQQUNLRUQ7CS8qIDI4aDogICovCi0JdW5zaWduZWQgc2hvcnQgY3BlX1NTTl9SU04JUEFDS0VEOwkvKiAyQWg6ICAqLwotCXVuc2lnbmVkIHNob3J0IGN1cnJlbnRfU1NOCVBBQ0tFRDsJLyogMkNoOiAgKi8KLQl1bnNpZ25lZCBzaG9ydCBjdXJyZW50X1JTTglQQUNLRUQ7CS8qIDJFaDogICovCi0JdW5zaWduZWQgc2hvcnQgY3VycmVueV9UMzkxCVBBQ0tFRDsJLyogMzBoOiAgKi8KLQl1bnNpZ25lZCBzaG9ydCBjdXJyZW50X1QzOTIJUEFDS0VEOwkvKiAzMmg6ICAqLwotCXVuc2lnbmVkIHNob3J0IGN1cnJlbnRfTjM5MglQQUNLRUQ7CS8qIDM0aDogICovCi0JdW5zaWduZWQgc2hvcnQgY3VycmVudF9OMzkzCVBBQ0tFRDsJLyogMzZoOiAgKi8KLX0gZnJfbGlua19zdGF0X3Q7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogRExDSSBzdGF0aXN0aWNzLgotICoJVGhpcyBzdHJ1Y3R1cmUgaXMgcmV0dXJuZWQgYnkgdGhlIEZSX1JFQURfU1RBVElTVElDUyBjb21tYW5kIHdoZW4KLSAqCWRsY2kgIT0gMC4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QJZnJfZGxjaV9zdGF0Ci17Ci0JdW5zaWduZWQgbG9uZyB0eF9mcmFtZXMJCVBBQ0tFRDsJLyogMDBoOiAgKi8KLQl1bnNpZ25lZCBsb25nIHR4X2J5dGVzCQlQQUNLRUQ7CS8qIDA0aDogICovCi0JdW5zaWduZWQgbG9uZyByeF9mcmFtZXMJCVBBQ0tFRDsJLyogMDhoOiAgKi8KLQl1bnNpZ25lZCBsb25nIHJ4X2J5dGVzCQlQQUNLRUQ7CS8qIDBDaDogICovCi0JdW5zaWduZWQgbG9uZyByeF9kcm9wcGVkCVBBQ0tFRDsJLyogMTBoOiAgKi8KLQl1bnNpZ25lZCBsb25nIHJ4X2luYWN0aXZlCVBBQ0tFRDsJLyogMTRoOiAgKi8KLQl1bnNpZ25lZCBsb25nIHJ4X2V4Y2VlZF9DSVIJUEFDS0VEOwkvKiAxOGg6ICAqLwotCXVuc2lnbmVkIGxvbmcgcnhfREVfc2V0CQlQQUNLRUQ7CS8qIDFDaDogICovCi0JdW5zaWduZWQgbG9uZyB0eF90aHJvdWdocHV0CVBBQ0tFRDsJLyogMjBoOiAgKi8KLQl1bnNpZ25lZCBsb25nIHR4X2NhbGNfdGltZXIJUEFDS0VEOwkvKiAyNGg6ICAqLwotCXVuc2lnbmVkIGxvbmcgcnhfdGhyb3VnaHB1dAlQQUNLRUQ7CS8qIDI4aDogICovCi0JdW5zaWduZWQgbG9uZyByeF9jYWxjX3RpbWVyCVBBQ0tFRDsJLyogMkNoOiAgKi8KLX0gZnJfZGxjaV9zdGF0X3Q7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogQ29tbXVuaWNhdGlvbnMgZXJyb3Igc3RhdGlzdGljcy4KLSAqCVRoaXMgc3RydWN0dXJlIGlzIHJldHVybmVkIGJ5IHRoZSBGUl9SRUFEX0VSUk9SX1NUQVRTIGNvbW1hbmQuCi0gKi8KLXR5cGVkZWYgc3RydWN0CWZyX2NvbW1fc3RhdAotewotCXVuc2lnbmVkIGNoYXIgcnhfb3ZlcnJ1bnMJUEFDS0VEOwkvKiAwMGg6ICAqLwotCXVuc2lnbmVkIGNoYXIgcnhfYmFkX2NyYwlQQUNLRUQ7CS8qIDAxaDogICovCi0JdW5zaWduZWQgY2hhciByeF9hYm9ydHMJCVBBQ0tFRDsJLyogMDJoOiAgKi8KLQl1bnNpZ25lZCBjaGFyIHJ4X3Rvb19sb25nCVBBQ0tFRDsJLyogMDNoOiAgKi8KLQl1bnNpZ25lZCBjaGFyIHR4X2Fib3J0cwkJUEFDS0VEOwkvKiAwNGg6ICAqLwotCXVuc2lnbmVkIGNoYXIgdHhfdW5kZXJydW5zCVBBQ0tFRDsJLyogMDVoOiAgKi8KLQl1bnNpZ25lZCBjaGFyIHR4X21pc3NlZF91bmRyCVBBQ0tFRDsJLyogMDZoOiAgKi8KLQl1bnNpZ25lZCBjaGFyIGRjZF9kcm9wcGVkCVBBQ0tFRDsJLyogMDdoOiAgKi8KLQl1bnNpZ25lZCBjaGFyIGN0c19kcm9wcGVkCVBBQ0tFRDsJLyogMDhoOiAgKi8KLX0gZnJfY29tbV9zdGF0X3Q7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogRGVmaW5lcyBmb3IgdGhlIEZSX0lTU1VFX0lTX0ZSQU1FIGNvbW1hbmQuCi0gKi8KLSNkZWZpbmUJRlJfSVNGX0xWRQkyCQkvKiBpc3N1ZSBMaW5rIFZlcmlmaWNhdGlvbiBFbnF1aXJ5ICovCi0jZGVmaW5lCUZSX0lTRl9GU0UJMwkJLyogaXNzdWUgRnVsbCBTdGF0dXMgRW5xdWlyeSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIEZyYW1lIFJlbGF5IEFSUCBIZWFkZXIgLS0gVXNlZCBmb3IgRHluYW1pYyByb3V0ZSBjcmVhdGlvbiB3aXRoIEludkFSUCAKLSAqLwotCi10eXBlZGVmIHN0cnVjdCBhcnBoZHJfZnIKLQl7Ci0JdW5zaWduZWQgc2hvcnQgYXJfaHJkIFBBQ0tFRDsJCS8qIGZvcm1hdCBvZiBoYXJkd2FyZSBhZGRyICovCi0JdW5zaWduZWQgc2hvcnQgYXJfcHJvIFBBQ0tFRDsJCS8qIGZvcm1hdCBvZiBwcm90b2NvbCBhZGRyICovCi0JdW5zaWduZWQgY2hhciAgYXJfaGxuIFBBQ0tFRDsJCS8qIGxlbmd0aCBvZiBoYXJkd2FyZSBhZGRyICovCQotCXVuc2lnbmVkIGNoYXIgIGFyX3BsbiBQQUNLRUQ7CQkvKiBsZW5ndGggb2YgcHJvdG9jb2wgYWRkciAqLwotCXVuc2lnbmVkIHNob3J0IGFyX29wICBQQUNLRUQ7CQkvKiBBUlAgb3Bjb2RlCQkgICAqLwotCXVuc2lnbmVkIHNob3J0IGFyX3NoYSBQQUNLRUQ7CQkvKiBTZW5kZXIgRExDSSBhZGRyIDIgYnl0ZXMgKi8KLQl1bnNpZ25lZCBsb25nICBhcl9zaXAgUEFDS0VEOwkJLyogU2VuZGVyIElQICAgYWRkciA0IGJ5dGVzICovCi0JdW5zaWduZWQgc2hvcnQgYXJfdGhhIFBBQ0tFRDsJCS8qIFRhcmdldCBETENJIGFkZHIgMiBieXRlcyAqLwotCXVuc2lnbmVkIGxvbmcgIGFyX3RpcCBQQUNLRUQ7CQkvKiBUYXJnZXQgSVAgICBhZGRyIDQgYnl0ZXMgKi8KLQl9IGFycGhkcl9mcl90OwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIEZyYW1lIFJlbGF5IFJGQyAxNDkwIFNOQVAgSGVhZGVyIC0tIFVzZWQgdG8gY2hlY2sgZm9yIEFSUCBwYWNrZXRzCi0gKi8KLXR5cGVkZWYgc3RydWN0IGFycGhkcl8xNDkwCi0JewotCXVuc2lnbmVkIGNoYXIgY29udHJvbCBQQUNLRUQ7CQkvKiBVSSwgZXRjLi4uICAqLwotCXVuc2lnbmVkIGNoYXIgcGFkICAgICBQQUNLRUQ7CQkvKiBQYWQgKi8KLQl1bnNpZ25lZCBjaGFyIE5MUElEICAgUEFDS0VEOwkJLyogU05BUCAqLwotCXVuc2lnbmVkIGNoYXIgT1VJWzNdICBQQUNLRUQ7CQkvKiBFdGhlcnR5cGUsIGV0Yy4uLiAqLwotCXVuc2lnbmVkIHNob3J0IFBJRCAgICBQQUNLRUQ7CQkvKiBBUlAsIElQLCBldGMuLi4gKi8KLQl9ICBhcnBoZHJfMTQ5MF90OwotCi0vKiBVRFAvSVAgcGFja2V0IChmb3IgVURQIG1hbmFnZW1lbnQpIGxheW91dCAqLwotCi0vKiBUaGUgZW1iZWRkZWQgY29udHJvbCBibG9jayBmb3IgVURQIG1nbXQKLSAgIFRoaXMgaXMgZXNzZW50aWFsbHkgYSBtYWlsYm94IHN0cnVjdHVyZSwgd2l0aG91dCB0aGUgbGFyZ2UgZGF0YSBmaWVsZCAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgIG9wcF9mbGFnIFBBQ0tFRDsgLyogdGhlIG9wcCBmbGFnICovCi0gICAgICAgIHVuc2lnbmVkIGNoYXIgIGNvbW1hbmQgIFBBQ0tFRDsgLyogY29tbWFuZCBjb2RlICovCi0gICAgICAgIHVuc2lnbmVkIHNob3J0IGxlbmd0aCAgIFBBQ0tFRDsgLyogbGVuZ3RoIG9mIGRhdGEgYnVmZmVyICovCi0gICAgICAgIHVuc2lnbmVkIGNoYXIgIHJlc3VsdCAgIFBBQ0tFRDsgLyogcmV0dXJuIGNvZGUgKi8KLSAgICAgICAgdW5zaWduZWQgc2hvcnQgZGxjaSAgICAgUEFDS0VEOyAvKiBETENJIG51bWJlciAqLwotICAgICAgICB1bnNpZ25lZCBjaGFyICBhdHRyICAgICBQQUNLRUQ7IC8qIEZFQ04sIEJFQ04sIERFIGFuZCBDL1IgYml0cyAqLwotICAgICAgICB1bnNpZ25lZCBzaG9ydCByeGxvc3QxICBQQUNLRUQ7IC8qIGZyYW1lcyBkaXNjYXJkZWQgYXQgaW50LiBsZXZlbCAqLwotICAgICAgICB1bnNpZ25lZCBsb25nICByeGxvc3QyICBQQUNLRUQ7IC8qIGZyYW1lcyBkaXNjYXJkZWQgYXQgYXBwLiBsZXZlbCAqLwotICAgICAgICB1bnNpZ25lZCBjaGFyICByc3J2WzJdICBQQUNLRUQ7IC8qIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlICovCi19IGNibG9ja190OwotCi0KLS8qIFVEUCBtYW5hZ2VtZW50IHBhY2tldCBsYXlvdXQgKGRhdGEgYXJlYSBvZiBpcCBwYWNrZXQpICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICAgICAgdW5zaWduZWQgY2hhciAgIGNvbnRyb2wgICAgICAgICAgICAgICAgIFBBQ0tFRDsKLSAgICAgICAgdW5zaWduZWQgY2hhciAgIE5MUElEICAgICAgICAgICAgICAgICAgIFBBQ0tFRDsKLX0gZnJfZW5jYXBfaGRyX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLS8vCWZyX2VuY2FwX2hkcl90IAkJZnJfZW5jYXBfaGRyCVBBQ0tFRDsKLQlpcF9wa3RfdCAJCWlwX3BrdAkJUEFDS0VEOwotCXVkcF9wa3RfdAkJdWRwX3BrdAkJUEFDS0VEOwotCXdwX21nbXRfdCAJCXdwX21nbXQgICAgICAgCVBBQ0tFRDsKLSAgICAgICAgY2Jsb2NrX3QgICAgICAgICAgICAgICAgY2Jsb2NrICAgICAgICAgIFBBQ0tFRDsKLSAgICAgICAgdW5zaWduZWQgY2hhciAgICAgICAgICAgZGF0YVs0MDgwXSAgICAgIFBBQ0tFRDsKLX0gZnJfdWRwX3BrdF90OwotCi0KLS8qIHZhbGlkIGlwX3Byb3RvY29sIGZvciBVRFAgbWFuYWdlbWVudCAqLwotI2RlZmluZSBVRFBNR01UX1VEUF9QUk9UT0NPTCAweDExCi0KLSNkZWZpbmUgVURQTUdNVF9GUElQRV9TSUdOQVRVUkUgICAgICAgICAiRlBJUEU4TkQiCi0jZGVmaW5lIFVEUE1HTVRfRFJWUlNUQVRTX1NJR05BVFVSRSAgICAgIkRSVlNUQVRTIgotCi0vKiB2YWx1ZXMgZm9yIHJlcXVlc3QvcmVwbHkgYnl0ZSAqLwotI2RlZmluZSBVRFBNR01UX1JFUVVFU1QJMHgwMQotI2RlZmluZSBVRFBNR01UX1JFUExZCTB4MDIKLSNkZWZpbmUgVURQX09GRlNFVAkxMgotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgaWZfc2VuZF9lbnRyeTsKLSAgICAgICAgdW5zaWduZWQgbG9uZyBpZl9zZW5kX3NrYl9udWxsOwotICAgICAgICB1bnNpZ25lZCBsb25nIGlmX3NlbmRfYnJvYWRjYXN0OwotICAgICAgICB1bnNpZ25lZCBsb25nIGlmX3NlbmRfbXVsdGljYXN0OwotICAgICAgICB1bnNpZ25lZCBsb25nIGlmX3NlbmRfY3JpdGljYWxfSVNSOwotICAgICAgICB1bnNpZ25lZCBsb25nIGlmX3NlbmRfY3JpdGljYWxfbm9uX0lTUjsKLSAgICAgICAgdW5zaWduZWQgbG9uZyBpZl9zZW5kX2J1c3k7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgaWZfc2VuZF9idXN5X3RpbWVvdXQ7Ci0JdW5zaWduZWQgbG9uZyBpZl9zZW5kX0RSVlNUQVRTX3JlcXVlc3Q7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgaWZfc2VuZF9GUElQRV9yZXF1ZXN0OwotICAgICAgICB1bnNpZ25lZCBsb25nIGlmX3NlbmRfd2FuX2Rpc2Nvbm5lY3RlZDsKLSAgICAgICAgdW5zaWduZWQgbG9uZyBpZl9zZW5kX2RsY2lfZGlzY29ubmVjdGVkOwotICAgICAgICB1bnNpZ25lZCBsb25nIGlmX3NlbmRfbm9fYmZyczsKLSAgICAgICAgdW5zaWduZWQgbG9uZyBpZl9zZW5kX2FkcHRyX2JmcnNfZnVsbDsKLSAgICAgICAgdW5zaWduZWQgbG9uZyBpZl9zZW5kX2JmcnNfcGFzc2VkX3RvX2FkcHRyOwotCXVuc2lnbmVkIGxvbmcgaWZfc2VuZF9jb25zZWNfc2VuZF9mYWlsOwotfSBkcnZzdGF0c19pZl9zZW5kX3Q7IAotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgcnhfaW50cl9ub19zb2NrZXQ7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgcnhfaW50cl9kZXZfbm90X3N0YXJ0ZWQ7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgcnhfaW50cl9EUlZTVEFUU19yZXF1ZXN0OwotICAgICAgICB1bnNpZ25lZCBsb25nIHJ4X2ludHJfRlBJUEVfcmVxdWVzdDsKLSAgICAgICAgdW5zaWduZWQgbG9uZyByeF9pbnRyX2Jmcl9ub3RfcGFzc2VkX3RvX3N0YWNrOwotICAgICAgICB1bnNpZ25lZCBsb25nIHJ4X2ludHJfYmZyX3Bhc3NlZF90b19zdGFjazsKLSB9IGRydnN0YXRzX3J4X2ludHJfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgICAgICB1bnNpZ25lZCBsb25nIFVEUF9GUElQRV9tZ210X2ttYWxsb2NfZXJyOwotICAgICAgICB1bnNpZ25lZCBsb25nIFVEUF9GUElQRV9tZ210X2RpcmVjdGlvbl9lcnI7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgVURQX0ZQSVBFX21nbXRfYWRwdHJfdHlwZV9lcnI7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgVURQX0ZQSVBFX21nbXRfYWRwdHJfY21uZF9PSzsKLSAgICAgICAgdW5zaWduZWQgbG9uZyBVRFBfRlBJUEVfbWdtdF9hZHB0cl9jbW5kX3RpbWVvdXQ7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgVURQX0ZQSVBFX21nbXRfYWRwdHJfc2VuZF9wYXNzZWQ7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgVURQX0ZQSVBFX21nbXRfYWRwdHJfc2VuZF9mYWlsZWQ7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgVURQX0ZQSVBFX21nbXRfbm90X3Bhc3NlZF90b19zdGFjazsKLSAgICAgICAgdW5zaWduZWQgbG9uZyBVRFBfRlBJUEVfbWdtdF9wYXNzZWRfdG9fc3RhY2s7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgVURQX0ZQSVBFX21nbXRfbm9fc29ja2V0OwotICAgICAgICB1bnNpZ25lZCBsb25nIFVEUF9EUlZTVEFUU19tZ210X2ttYWxsb2NfZXJyOwotICAgICAgICB1bnNpZ25lZCBsb25nIFVEUF9EUlZTVEFUU19tZ210X2FkcHRyX2NtbmRfT0s7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgVURQX0RSVlNUQVRTX21nbXRfYWRwdHJfY21uZF90aW1lb3V0OwotICAgICAgICB1bnNpZ25lZCBsb25nIFVEUF9EUlZTVEFUU19tZ210X2FkcHRyX3NlbmRfcGFzc2VkOwotICAgICAgICB1bnNpZ25lZCBsb25nIFVEUF9EUlZTVEFUU19tZ210X2FkcHRyX3NlbmRfZmFpbGVkOwotICAgICAgICB1bnNpZ25lZCBsb25nIFVEUF9EUlZTVEFUU19tZ210X25vdF9wYXNzZWRfdG9fc3RhY2s7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgVURQX0RSVlNUQVRTX21nbXRfcGFzc2VkX3RvX3N0YWNrOwotICAgICAgICB1bnNpZ25lZCBsb25nIFVEUF9EUlZTVEFUU19tZ210X25vX3NvY2tldDsKLX0gZHJ2c3RhdHNfZ2VuX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICAgICAgdW5zaWduZWQgY2hhciAgIGF0dHIgICAgICAJUEFDS0VEOwotICAgICAgICB1bnNpZ25lZCBzaG9ydCAgdGltZV9zdGFtcCAgICAgIFBBQ0tFRDsKLSAgICAgICAgdW5zaWduZWQgY2hhciAgIHJlc2VydmVkWzEzXSAgICBQQUNLRUQ7Ci19IGFwaV9yeF9oZHJfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgICAgICBhcGlfcnhfaGRyX3QgICAgYXBpX3J4X2hkciAgICAgIFBBQ0tFRDsKLSAgICAgICAgdm9pZCAqICAgICAgICAgIGRhdGEgICAgICAgICAgICBQQUNLRUQ7Ci19IGFwaV9yeF9lbGVtZW50X3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICAgICAgdW5zaWduZWQgY2hhciAgIGF0dHIgICAgICAgICAgICBQQUNLRUQ7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgICByZXNlcnZlZFsxNV0gICAgUEFDS0VEOwotfSBhcGlfdHhfaGRyX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICAgICAgYXBpX3R4X2hkcl90ICAgIGFwaV90eF9oZHIgICAgICBQQUNLRUQ7Ci0gICAgICAgIHZvaWQgKiAgICAgICAgICBkYXRhICAgICAgICAgICAgUEFDS0VEOwotfSBhcGlfdHhfZWxlbWVudF90OwotCi0jaWZkZWYJCV9NU0NfCi0jICBwcmFnbWEJcGFjaygpCi0jZW5kaWYKLSNlbmRpZgkvKiBfU0RMQV9GUl9IICovCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2VxbG9jay5oIGIvaW5jbHVkZS9saW51eC9zZXFsb2NrLmgKaW5kZXggNTJjOWViOS4uMjZlNDkyNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zZXFsb2NrLmgKKysrIGIvaW5jbHVkZS9saW51eC9zZXFsb2NrLmgKQEAgLTYxLDEwICs2MSwxMCBAQAogewogCXNwaW5fbG9jaygmc2wtPmxvY2spOwogCSsrc2wtPnNlcXVlbmNlOwotCXNtcF93bWIoKTsJCQkKLX0JCisJc21wX3dtYigpOworfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfc2VxdW5sb2NrKHNlcWxvY2tfdCAqc2wpIAorc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX3NlcXVubG9jayhzZXFsb2NrX3QgKnNsKQogewogCXNtcF93bWIoKTsKIAlzbC0+c2VxdWVuY2UrKzsKQEAgLTc3LDcgKzc3LDcgQEAKIAogCWlmIChyZXQpIHsKIAkJKytzbC0+c2VxdWVuY2U7Ci0JCXNtcF93bWIoKTsJCQkKKwkJc21wX3dtYigpOwogCX0KIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9za2J1ZmYuaCBiL2luY2x1ZGUvbGludXgvc2tidWZmLmgKaW5kZXggNTk5MmY2NS4uMjUzYTJiOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9za2J1ZmYuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NrYnVmZi5oCkBAIC0yNywyMCArMjcsMjQgQEAKICNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KICNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYWVuZ2luZS5oPgorI2luY2x1ZGUgPGxpbnV4L2hydGltZXIuaD4KIAogI2RlZmluZSBIQVZFX0FMTE9DX1NLQgkJLyogRm9yIHRoZSBkcml2ZXJzIHRvIGtub3cgKi8KICNkZWZpbmUgSEFWRV9BTElHTkFCTEVfU0tCCS8qIERpdHRvIDgpCQkgICAqLwogCisvKiBEb24ndCBjaGFuZ2UgdGhpcyB3aXRob3V0IGNoYW5naW5nIHNrYl9jc3VtX3VubmVjZXNzYXJ5ISAqLwogI2RlZmluZSBDSEVDS1NVTV9OT05FIDAKLSNkZWZpbmUgQ0hFQ0tTVU1fUEFSVElBTCAxCi0jZGVmaW5lIENIRUNLU1VNX1VOTkVDRVNTQVJZIDIKLSNkZWZpbmUgQ0hFQ0tTVU1fQ09NUExFVEUgMworI2RlZmluZSBDSEVDS1NVTV9VTk5FQ0VTU0FSWSAxCisjZGVmaW5lIENIRUNLU1VNX0NPTVBMRVRFIDIKKyNkZWZpbmUgQ0hFQ0tTVU1fUEFSVElBTCAzCiAKICNkZWZpbmUgU0tCX0RBVEFfQUxJR04oWCkJKCgoWCkgKyAoU01QX0NBQ0hFX0JZVEVTIC0gMSkpICYgXAogCQkJCSB+KFNNUF9DQUNIRV9CWVRFUyAtIDEpKQotI2RlZmluZSBTS0JfTUFYX09SREVSKFgsIE9SREVSKQkoKChQQUdFX1NJWkUgPDwgKE9SREVSKSkgLSAoWCkgLSBcCi0JCQkJICBzaXplb2Yoc3RydWN0IHNrYl9zaGFyZWRfaW5mbykpICYgXAotCQkJCSAgfihTTVBfQ0FDSEVfQllURVMgLSAxKSkKKyNkZWZpbmUgU0tCX1dJVEhfT1ZFUkhFQUQoWCkJXAorCSgoKFgpIC0gc2l6ZW9mKHN0cnVjdCBza2Jfc2hhcmVkX2luZm8pKSAmIFwKKwkgfihTTVBfQ0FDSEVfQllURVMgLSAxKSkKKyNkZWZpbmUgU0tCX01BWF9PUkRFUihYLCBPUkRFUikgXAorCVNLQl9XSVRIX09WRVJIRUFEKChQQUdFX1NJWkUgPDwgKE9SREVSKSkgLSAoWCkpCiAjZGVmaW5lIFNLQl9NQVhfSEVBRChYKQkJKFNLQl9NQVhfT1JERVIoKFgpLCAwKSkKICNkZWZpbmUgU0tCX01BWF9BTExPQwkJKFNLQl9NQVhfT1JERVIoMCwgMikpCiAKQEAgLTY2LDggKzcwLDggQEAKICAqCU5PTkU6IHNrYiBpcyBjaGVja3N1bW1lZCBieSBwcm90b2NvbCBvciBjc3VtIGlzIG5vdCByZXF1aXJlZC4KICAqCiAgKglQQVJUSUFMOiBkZXZpY2UgaXMgcmVxdWlyZWQgdG8gY3N1bSBwYWNrZXQgYXMgc2VlbiBieSBoYXJkX3N0YXJ0X3htaXQKLSAqCWZyb20gc2tiLT5oLnJhdyB0byB0aGUgZW5kIGFuZCB0byByZWNvcmQgdGhlIGNoZWNrc3VtCi0gKglhdCBza2ItPmgucmF3K3NrYi0+Y3N1bS4KKyAqCWZyb20gc2tiLT50cmFuc3BvcnRfaGVhZGVyIHRvIHRoZSBlbmQgYW5kIHRvIHJlY29yZCB0aGUgY2hlY2tzdW0KKyAqCWF0IHNrYi0+dHJhbnNwb3J0X2hlYWRlciArIHNrYi0+Y3N1bS4KICAqCiAgKglEZXZpY2UgbXVzdCBzaG93IGl0cyBjYXBhYmlsaXRpZXMgaW4gZGV2LT5mZWF0dXJlcywgc2V0CiAgKglhdCBkZXZpY2Ugc2V0dXAgdGltZS4KQEAgLTgzLDEyICs4NywxMyBAQAogICovCiAKIHN0cnVjdCBuZXRfZGV2aWNlOworc3RydWN0IHNjYXR0ZXJsaXN0OwogCi0jaWZkZWYgQ09ORklHX05FVEZJTFRFUgorI2lmIGRlZmluZWQoQ09ORklHX05GX0NPTk5UUkFDSykgfHwgZGVmaW5lZChDT05GSUdfTkZfQ09OTlRSQUNLX01PRFVMRSkKIHN0cnVjdCBuZl9jb25udHJhY2sgewogCWF0b21pY190IHVzZTsKLQl2b2lkICgqZGVzdHJveSkoc3RydWN0IG5mX2Nvbm50cmFjayAqKTsKIH07CisjZW5kaWYKIAogI2lmZGVmIENPTkZJR19CUklER0VfTkVURklMVEVSCiBzdHJ1Y3QgbmZfYnJpZGdlX2luZm8gewpAQCAtMTAzLDggKzEwOCw2IEBACiB9OwogI2VuZGlmCiAKLSNlbmRpZgotCiBzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHsKIAkvKiBUaGVzZSB0d28gbWVtYmVycyBtdXN0IGJlIGZpcnN0LiAqLwogCXN0cnVjdCBza19idWZmCSpuZXh0OwpAQCAtMTU2LDExICsxNTksNiBAQAogI2RlZmluZSBTS0JfREFUQVJFRl9TSElGVCAxNgogI2RlZmluZSBTS0JfREFUQVJFRl9NQVNLICgoMSA8PCBTS0JfREFUQVJFRl9TSElGVCkgLSAxKQogCi1zdHJ1Y3Qgc2tiX3RpbWV2YWwgewotCXUzMglvZmZfc2VjOwotCXUzMglvZmZfdXNlYzsKLX07Ci0KIAogZW51bSB7CiAJU0tCX0ZDTE9ORV9VTkFWQUlMQUJMRSwKQEAgLTE4MSw2ICsxNzksMTYgQEAKIAlTS0JfR1NPX1RDUFY2ID0gMSA8PCA0LAogfTsKIAorI2lmIEJJVFNfUEVSX0xPTkcgPiAzMgorI2RlZmluZSBORVRfU0tCVUZGX0RBVEFfVVNFU19PRkZTRVQgMQorI2VuZGlmCisKKyNpZmRlZiBORVRfU0tCVUZGX0RBVEFfVVNFU19PRkZTRVQKK3R5cGVkZWYgdW5zaWduZWQgaW50IHNrX2J1ZmZfZGF0YV90OworI2Vsc2UKK3R5cGVkZWYgdW5zaWduZWQgY2hhciAqc2tfYnVmZl9kYXRhX3Q7CisjZW5kaWYKKwogLyoqIAogICoJc3RydWN0IHNrX2J1ZmYgLSBzb2NrZXQgYnVmZmVyCiAgKglAbmV4dDogTmV4dCBidWZmZXIgaW4gbGlzdApAQCAtMTkwLDE1ICsxOTgsMTcgQEAKICAqCUBkZXY6IERldmljZSB3ZSBhcnJpdmVkIG9uL2FyZSBsZWF2aW5nIGJ5CiAgKglAaWlmOiBpZmluZGV4IG9mIGRldmljZSB3ZSBhcnJpdmVkIG9uCiAgKglAaDogVHJhbnNwb3J0IGxheWVyIGhlYWRlcgotICoJQG5oOiBOZXR3b3JrIGxheWVyIGhlYWRlcgotICoJQG1hYzogTGluayBsYXllciBoZWFkZXIKKyAqCUBuZXR3b3JrX2hlYWRlcjogTmV0d29yayBsYXllciBoZWFkZXIKKyAqCUBtYWNfaGVhZGVyOiBMaW5rIGxheWVyIGhlYWRlcgogICoJQGRzdDogZGVzdGluYXRpb24gZW50cnkKICAqCUBzcDogdGhlIHNlY3VyaXR5IHBhdGgsIHVzZWQgZm9yIHhmcm0KICAqCUBjYjogQ29udHJvbCBidWZmZXIuIEZyZWUgZm9yIHVzZSBieSBldmVyeSBsYXllci4gUHV0IHByaXZhdGUgdmFycyBoZXJlCiAgKglAbGVuOiBMZW5ndGggb2YgYWN0dWFsIGRhdGEKICAqCUBkYXRhX2xlbjogRGF0YSBsZW5ndGgKICAqCUBtYWNfbGVuOiBMZW5ndGggb2YgbGluayBsYXllciBoZWFkZXIKLSAqCUBjc3VtOiBDaGVja3N1bQorICoJQGNzdW06IENoZWNrc3VtIChtdXN0IGluY2x1ZGUgc3RhcnQvb2Zmc2V0IHBhaXIpCisgKglAY3N1bV9zdGFydDogT2Zmc2V0IGZyb20gc2tiLT5oZWFkIHdoZXJlIGNoZWNrc3VtbWluZyBzaG91bGQgc3RhcnQKKyAqCUBjc3VtX29mZnNldDogT2Zmc2V0IGZyb20gY3N1bV9zdGFydCB3aGVyZSBjaGVja3N1bSBzaG91bGQgYmUgc3RvcmVkCiAgKglAbG9jYWxfZGY6IGFsbG93IGxvY2FsIGZyYWdtZW50YXRpb24KICAqCUBjbG9uZWQ6IEhlYWQgbWF5IGJlIGNsb25lZCAoY2hlY2sgcmVmY250IHRvIGJlIHN1cmUpCiAgKglAbm9oZHI6IFBheWxvYWQgcmVmZXJlbmNlIG9ubHksIG11c3Qgbm90IG1vZGlmeSBoZWFkZXIKQEAgLTIzMywzMiArMjQzLDExIEBACiAJc3RydWN0IHNrX2J1ZmYJCSpwcmV2OwogCiAJc3RydWN0IHNvY2sJCSpzazsKLQlzdHJ1Y3Qgc2tiX3RpbWV2YWwJdHN0YW1wOworCWt0aW1lX3QJCQl0c3RhbXA7CiAJc3RydWN0IG5ldF9kZXZpY2UJKmRldjsKIAlpbnQJCQlpaWY7CiAJLyogNCBieXRlIGhvbGUgb24gNjQgYml0Ki8KIAotCXVuaW9uIHsKLQkJc3RydWN0IHRjcGhkcgkqdGg7Ci0JCXN0cnVjdCB1ZHBoZHIJKnVoOwotCQlzdHJ1Y3QgaWNtcGhkcgkqaWNtcGg7Ci0JCXN0cnVjdCBpZ21waGRyCSppZ21waDsKLQkJc3RydWN0IGlwaGRyCSppcGlwaDsKLQkJc3RydWN0IGlwdjZoZHIJKmlwdjZoOwotCQl1bnNpZ25lZCBjaGFyCSpyYXc7Ci0JfSBoOwotCi0JdW5pb24gewotCQlzdHJ1Y3QgaXBoZHIJKmlwaDsKLQkJc3RydWN0IGlwdjZoZHIJKmlwdjZoOwotCQlzdHJ1Y3QgYXJwaGRyCSphcnBoOwotCQl1bnNpZ25lZCBjaGFyCSpyYXc7Ci0JfSBuaDsKLQotCXVuaW9uIHsKLQkgIAl1bnNpZ25lZCBjaGFyIAkqcmF3OwotCX0gbWFjOwotCiAJc3RydWN0ICBkc3RfZW50cnkJKmRzdDsKIAlzdHJ1Y3QJc2VjX3BhdGgJKnNwOwogCkBAIC0yNzUsNyArMjY0LDEwIEBACiAJCQkJbWFjX2xlbjsKIAl1bmlvbiB7CiAJCV9fd3N1bQkJY3N1bTsKLQkJX191MzIJCWNzdW1fb2Zmc2V0OworCQlzdHJ1Y3QgeworCQkJX191MTYJY3N1bV9zdGFydDsKKwkJCV9fdTE2CWNzdW1fb2Zmc2V0OworCQl9OwogCX07CiAJX191MzIJCQlwcmlvcml0eTsKIAlfX3U4CQkJbG9jYWxfZGY6MSwKQEAgLTI4OSwxNSArMjgxLDEzIEBACiAJX19iZTE2CQkJcHJvdG9jb2w7CiAKIAl2b2lkCQkJKCpkZXN0cnVjdG9yKShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLSNpZmRlZiBDT05GSUdfTkVURklMVEVSCi0Jc3RydWN0IG5mX2Nvbm50cmFjawkqbmZjdDsKICNpZiBkZWZpbmVkKENPTkZJR19ORl9DT05OVFJBQ0spIHx8IGRlZmluZWQoQ09ORklHX05GX0NPTk5UUkFDS19NT0RVTEUpCisJc3RydWN0IG5mX2Nvbm50cmFjawkqbmZjdDsKIAlzdHJ1Y3Qgc2tfYnVmZgkJKm5mY3RfcmVhc207CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfQlJJREdFX05FVEZJTFRFUgogCXN0cnVjdCBuZl9icmlkZ2VfaW5mbwkqbmZfYnJpZGdlOwogI2VuZGlmCi0jZW5kaWYgLyogQ09ORklHX05FVEZJTFRFUiAqLwogI2lmZGVmIENPTkZJR19ORVRfU0NIRUQKIAlfX3UxNgkJCXRjX2luZGV4OwkvKiB0cmFmZmljIGNvbnRyb2wgaW5kZXggKi8KICNpZmRlZiBDT05GSUdfTkVUX0NMU19BQ1QKQEAgLTMxMywxMyArMzAzLDE2IEBACiAKIAlfX3UzMgkJCW1hcms7CiAKKwlza19idWZmX2RhdGFfdAkJdHJhbnNwb3J0X2hlYWRlcjsKKwlza19idWZmX2RhdGFfdAkJbmV0d29ya19oZWFkZXI7CisJc2tfYnVmZl9kYXRhX3QJCW1hY19oZWFkZXI7CiAJLyogVGhlc2UgZWxlbWVudHMgbXVzdCBiZSBhdCB0aGUgZW5kLCBzZWUgYWxsb2Nfc2tiKCkgZm9yIGRldGFpbHMuICAqLworCXNrX2J1ZmZfZGF0YV90CQl0YWlsOworCXNrX2J1ZmZfZGF0YV90CQllbmQ7CisJdW5zaWduZWQgY2hhcgkJKmhlYWQsCisJCQkJKmRhdGE7CiAJdW5zaWduZWQgaW50CQl0cnVlc2l6ZTsKIAlhdG9taWNfdAkJdXNlcnM7Ci0JdW5zaWduZWQgY2hhcgkJKmhlYWQsCi0JCQkJKmRhdGEsCi0JCQkJKnRhaWwsCi0JCQkJKmVuZDsKIH07CiAKICNpZmRlZiBfX0tFUk5FTF9fCkBAIC0zNjEsNiArMzU0LDExIEBACiBleHRlcm4gc3RydWN0IHNrX2J1ZmYgKnNrYl9jb3B5X2V4cGFuZChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJCSAgICAgICBpbnQgbmV3aGVhZHJvb20sIGludCBuZXd0YWlscm9vbSwKIAkJCQkgICAgICAgZ2ZwX3QgcHJpb3JpdHkpOworZXh0ZXJuIGludAkgICAgICAgc2tiX3RvX3NndmVjKHN0cnVjdCBza19idWZmICpza2IsCisJCQkJICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBvZmZzZXQsCisJCQkJICAgIGludCBsZW4pOworZXh0ZXJuIGludAkgICAgICAgc2tiX2Nvd19kYXRhKHN0cnVjdCBza19idWZmICpza2IsIGludCB0YWlsYml0cywKKwkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKip0cmFpbGVyKTsKIGV4dGVybiBpbnQJICAgICAgIHNrYl9wYWQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHBhZCk7CiAjZGVmaW5lIGRldl9rZnJlZV9za2IoYSkJa2ZyZWVfc2tiKGEpCiBleHRlcm4gdm9pZAkgICAgICBza2Jfb3Zlcl9wYW5pYyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgbGVuLApAQCAtNDAyLDggKzQwMCwyMCBAQAogCQkJCSAgICB1bnNpZ25lZCBpbnQgdG8sIHN0cnVjdCB0c19jb25maWcgKmNvbmZpZywKIAkJCQkgICAgc3RydWN0IHRzX3N0YXRlICpzdGF0ZSk7CiAKKyNpZmRlZiBORVRfU0tCVUZGX0RBVEFfVVNFU19PRkZTRVQKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciAqc2tiX2VuZF9wb2ludGVyKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIHNrYi0+aGVhZCArIHNrYi0+ZW5kOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciAqc2tiX2VuZF9wb2ludGVyKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIHNrYi0+ZW5kOworfQorI2VuZGlmCisKIC8qIEludGVybmFsICovCi0jZGVmaW5lIHNrYl9zaGluZm8oU0tCKQkJKChzdHJ1Y3Qgc2tiX3NoYXJlZF9pbmZvICopKChTS0IpLT5lbmQpKQorI2RlZmluZSBza2Jfc2hpbmZvKFNLQikJKChzdHJ1Y3Qgc2tiX3NoYXJlZF9pbmZvICopKHNrYl9lbmRfcG9pbnRlcihTS0IpKSkKIAogLyoqCiAgKglza2JfcXVldWVfZW1wdHkgLSBjaGVjayBpZiBhIHF1ZXVlIGlzIGVtcHR5CkBAIC04MjIsMTIgKzgzMiw0NiBAQAogI2RlZmluZSBTS0JfRlJBR19BU1NFUlQoc2tiKSAJQlVHX09OKHNrYl9zaGluZm8oc2tiKS0+ZnJhZ19saXN0KQogI2RlZmluZSBTS0JfTElORUFSX0FTU0VSVChza2IpICBCVUdfT04oc2tiX2lzX25vbmxpbmVhcihza2IpKQogCisjaWZkZWYgTkVUX1NLQlVGRl9EQVRBX1VTRVNfT0ZGU0VUCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgKnNrYl90YWlsX3BvaW50ZXIoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gc2tiLT5oZWFkICsgc2tiLT50YWlsOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2tiX3Jlc2V0X3RhaWxfcG9pbnRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXNrYi0+dGFpbCA9IHNrYi0+ZGF0YSAtIHNrYi0+aGVhZDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNrYl9zZXRfdGFpbF9wb2ludGVyKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IGludCBvZmZzZXQpCit7CisJc2tiX3Jlc2V0X3RhaWxfcG9pbnRlcihza2IpOworCXNrYi0+dGFpbCArPSBvZmZzZXQ7Cit9CisjZWxzZSAvKiBORVRfU0tCVUZGX0RBVEFfVVNFU19PRkZTRVQgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciAqc2tiX3RhaWxfcG9pbnRlcihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiBza2ItPnRhaWw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBza2JfcmVzZXRfdGFpbF9wb2ludGVyKHN0cnVjdCBza19idWZmICpza2IpCit7CisJc2tiLT50YWlsID0gc2tiLT5kYXRhOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2tiX3NldF90YWlsX3BvaW50ZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3QgaW50IG9mZnNldCkKK3sKKwlza2ItPnRhaWwgPSBza2ItPmRhdGEgKyBvZmZzZXQ7Cit9CisKKyNlbmRpZiAvKiBORVRfU0tCVUZGX0RBVEFfVVNFU19PRkZTRVQgKi8KKwogLyoKICAqCUFkZCBkYXRhIHRvIGFuIHNrX2J1ZmYKICAqLwogc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyICpfX3NrYl9wdXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IGxlbikKIHsKLQl1bnNpZ25lZCBjaGFyICp0bXAgPSBza2ItPnRhaWw7CisJdW5zaWduZWQgY2hhciAqdG1wID0gc2tiX3RhaWxfcG9pbnRlcihza2IpOwogCVNLQl9MSU5FQVJfQVNTRVJUKHNrYik7CiAJc2tiLT50YWlsICs9IGxlbjsKIAlza2ItPmxlbiAgKz0gbGVuOwpAQCAtODQ1LDExICs4ODksMTEgQEAKICAqLwogc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyICpza2JfcHV0KHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCBsZW4pCiB7Ci0JdW5zaWduZWQgY2hhciAqdG1wID0gc2tiLT50YWlsOworCXVuc2lnbmVkIGNoYXIgKnRtcCA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKTsKIAlTS0JfTElORUFSX0FTU0VSVChza2IpOwogCXNrYi0+dGFpbCArPSBsZW47CiAJc2tiLT5sZW4gICs9IGxlbjsKLQlpZiAodW5saWtlbHkoc2tiLT50YWlsPnNrYi0+ZW5kKSkKKwlpZiAodW5saWtlbHkoc2tiLT50YWlsID4gc2tiLT5lbmQpKQogCQlza2Jfb3Zlcl9wYW5pYyhza2IsIGxlbiwgY3VycmVudF90ZXh0X2FkZHIoKSk7CiAJcmV0dXJuIHRtcDsKIH0KQEAgLTk2Miw2ICsxMDA2LDEzMCBAQAogCXNrYi0+dGFpbCArPSBsZW47CiB9CiAKKyNpZmRlZiBORVRfU0tCVUZGX0RBVEFfVVNFU19PRkZTRVQKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciAqc2tiX3RyYW5zcG9ydF9oZWFkZXIoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gc2tiLT5oZWFkICsgc2tiLT50cmFuc3BvcnRfaGVhZGVyOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2tiX3Jlc2V0X3RyYW5zcG9ydF9oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlza2ItPnRyYW5zcG9ydF9oZWFkZXIgPSBza2ItPmRhdGEgLSBza2ItPmhlYWQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBza2Jfc2V0X3RyYW5zcG9ydF9oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkJICAgIGNvbnN0IGludCBvZmZzZXQpCit7CisJc2tiX3Jlc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKKwlza2ItPnRyYW5zcG9ydF9oZWFkZXIgKz0gb2Zmc2V0OworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgKnNrYl9uZXR3b3JrX2hlYWRlcihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiBza2ItPmhlYWQgKyBza2ItPm5ldHdvcmtfaGVhZGVyOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IpCit7CisJc2tiLT5uZXR3b3JrX2hlYWRlciA9IHNrYi0+ZGF0YSAtIHNrYi0+aGVhZDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNrYl9zZXRfbmV0d29ya19oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3QgaW50IG9mZnNldCkKK3sKKwlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiKTsKKwlza2ItPm5ldHdvcmtfaGVhZGVyICs9IG9mZnNldDsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyICpza2JfbWFjX2hlYWRlcihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiBza2ItPmhlYWQgKyBza2ItPm1hY19oZWFkZXI7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHNrYl9tYWNfaGVhZGVyX3dhc19zZXQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gc2tiLT5tYWNfaGVhZGVyICE9IH4wVTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNrYl9yZXNldF9tYWNfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IpCit7CisJc2tiLT5tYWNfaGVhZGVyID0gc2tiLT5kYXRhIC0gc2tiLT5oZWFkOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2tiX3NldF9tYWNfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IGludCBvZmZzZXQpCit7CisJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKKwlza2ItPm1hY19oZWFkZXIgKz0gb2Zmc2V0OworfQorCisjZWxzZSAvKiBORVRfU0tCVUZGX0RBVEFfVVNFU19PRkZTRVQgKi8KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyICpza2JfdHJhbnNwb3J0X2hlYWRlcihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiBza2ItPnRyYW5zcG9ydF9oZWFkZXI7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBza2JfcmVzZXRfdHJhbnNwb3J0X2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXNrYi0+dHJhbnNwb3J0X2hlYWRlciA9IHNrYi0+ZGF0YTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNrYl9zZXRfdHJhbnNwb3J0X2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCQkgICAgY29uc3QgaW50IG9mZnNldCkKK3sKKwlza2ItPnRyYW5zcG9ydF9oZWFkZXIgPSBza2ItPmRhdGEgKyBvZmZzZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciAqc2tiX25ldHdvcmtfaGVhZGVyKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIHNrYi0+bmV0d29ya19oZWFkZXI7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlza2ItPm5ldHdvcmtfaGVhZGVyID0gc2tiLT5kYXRhOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2tiX3NldF9uZXR3b3JrX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBpbnQgb2Zmc2V0KQoreworCXNrYi0+bmV0d29ya19oZWFkZXIgPSBza2ItPmRhdGEgKyBvZmZzZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciAqc2tiX21hY19oZWFkZXIoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gc2tiLT5tYWNfaGVhZGVyOworfQorCitzdGF0aWMgaW5saW5lIGludCBza2JfbWFjX2hlYWRlcl93YXNfc2V0KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIHNrYi0+bWFjX2hlYWRlciAhPSBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2tiX3Jlc2V0X21hY19oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlza2ItPm1hY19oZWFkZXIgPSBza2ItPmRhdGE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBza2Jfc2V0X21hY19oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3QgaW50IG9mZnNldCkKK3sKKwlza2ItPm1hY19oZWFkZXIgPSBza2ItPmRhdGEgKyBvZmZzZXQ7Cit9CisjZW5kaWYgLyogTkVUX1NLQlVGRl9EQVRBX1VTRVNfT0ZGU0VUICovCisKK3N0YXRpYyBpbmxpbmUgaW50IHNrYl90cmFuc3BvcnRfb2Zmc2V0KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIHNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYikgLSBza2ItPmRhdGE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIHNrYl9uZXR3b3JrX2hlYWRlcl9sZW4oY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gc2tiLT50cmFuc3BvcnRfaGVhZGVyIC0gc2tiLT5uZXR3b3JrX2hlYWRlcjsKK30KKworc3RhdGljIGlubGluZSBpbnQgc2tiX25ldHdvcmtfb2Zmc2V0KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIHNrYl9uZXR3b3JrX2hlYWRlcihza2IpIC0gc2tiLT5kYXRhOworfQorCiAvKgogICogQ1BVcyBvZnRlbiB0YWtlIGEgcGVyZm9ybWFuY2UgaGl0IHdoZW4gYWNjZXNzaW5nIHVuYWxpZ25lZCBtZW1vcnkKICAqIGxvY2F0aW9ucy4gVGhlIGFjdHVhbCBwZXJmb3JtYW5jZSBoaXQgdmFyaWVzLCBpdCBjYW4gYmUgc21hbGwgaWYgdGhlCkBAIC0xMDEzLDggKzExODEsOCBAQAogCQlXQVJOX09OKDEpOwogCQlyZXR1cm47CiAJfQotCXNrYi0+bGVuICA9IGxlbjsKLQlza2ItPnRhaWwgPSBza2ItPmRhdGEgKyBsZW47CisJc2tiLT5sZW4gPSBsZW47CisJc2tiX3NldF90YWlsX3BvaW50ZXIoc2tiLCBsZW4pOwogfQogCiAvKioKQEAgLTEzMDMsNiArMTQ3MSwxMSBAQAogCQkgICAgIHByZWZldGNoKHNrYi0+bmV4dCksIChza2IgIT0gKHN0cnVjdCBza19idWZmICopKHF1ZXVlKSk7CVwKIAkJICAgICBza2IgPSBza2ItPm5leHQpCiAKKyNkZWZpbmUgc2tiX3F1ZXVlX3dhbGtfc2FmZShxdWV1ZSwgc2tiLCB0bXApCQkJCQlcCisJCWZvciAoc2tiID0gKHF1ZXVlKS0+bmV4dCwgdG1wID0gc2tiLT5uZXh0OwkJCVwKKwkJICAgICBza2IgIT0gKHN0cnVjdCBza19idWZmICopKHF1ZXVlKTsJCQkJXAorCQkgICAgIHNrYiA9IHRtcCwgdG1wID0gc2tiLT5uZXh0KQorCiAjZGVmaW5lIHNrYl9xdWV1ZV9yZXZlcnNlX3dhbGsocXVldWUsIHNrYikgXAogCQlmb3IgKHNrYiA9IChxdWV1ZSktPnByZXY7CQkJCQlcCiAJCSAgICAgcHJlZmV0Y2goc2tiLT5wcmV2KSwgKHNrYiAhPSAoc3RydWN0IHNrX2J1ZmYgKikocXVldWUpKTsJXApAQCAtMTMyNiw4ICsxNDk5LDggQEAKIAkJCQkgICAgaW50IGxlbiwgX193c3VtIGNzdW0pOwogZXh0ZXJuIGludAkgICAgICAgc2tiX2NvcHlfYml0cyhjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgb2Zmc2V0LAogCQkJCSAgICAgdm9pZCAqdG8sIGludCBsZW4pOwotZXh0ZXJuIGludAkgICAgICAgc2tiX3N0b3JlX2JpdHMoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IG9mZnNldCwKLQkJCQkgICAgICB2b2lkICpmcm9tLCBpbnQgbGVuKTsKK2V4dGVybiBpbnQJICAgICAgIHNrYl9zdG9yZV9iaXRzKHN0cnVjdCBza19idWZmICpza2IsIGludCBvZmZzZXQsCisJCQkJICAgICAgY29uc3Qgdm9pZCAqZnJvbSwgaW50IGxlbik7CiBleHRlcm4gX193c3VtCSAgICAgICBza2JfY29weV9hbmRfY3N1bV9iaXRzKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCiAJCQkJCSAgICAgIGludCBvZmZzZXQsIHU4ICp0bywgaW50IGxlbiwKIAkJCQkJICAgICAgX193c3VtIGNzdW0pOwpAQCAtMTM1MSw4ICsxNTI0LDM2IEBACiAJcmV0dXJuIGJ1ZmZlcjsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIHNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkJICAgICB2b2lkICp0bywKKwkJCQkJICAgICBjb25zdCB1bnNpZ25lZCBpbnQgbGVuKQoreworCW1lbWNweSh0bywgc2tiLT5kYXRhLCBsZW4pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YV9vZmZzZXQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkJCSAgICBjb25zdCBpbnQgb2Zmc2V0LCB2b2lkICp0bywKKwkJCQkJCSAgICBjb25zdCB1bnNpZ25lZCBpbnQgbGVuKQoreworCW1lbWNweSh0bywgc2tiLT5kYXRhICsgb2Zmc2V0LCBsZW4pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2tiX2NvcHlfdG9fbGluZWFyX2RhdGEoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkJICAgY29uc3Qgdm9pZCAqZnJvbSwKKwkJCQkJICAgY29uc3QgdW5zaWduZWQgaW50IGxlbikKK3sKKwltZW1jcHkoc2tiLT5kYXRhLCBmcm9tLCBsZW4pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2tiX2NvcHlfdG9fbGluZWFyX2RhdGFfb2Zmc2V0KHN0cnVjdCBza19idWZmICpza2IsCisJCQkJCQkgIGNvbnN0IGludCBvZmZzZXQsCisJCQkJCQkgIGNvbnN0IHZvaWQgKmZyb20sCisJCQkJCQkgIGNvbnN0IHVuc2lnbmVkIGludCBsZW4pCit7CisJbWVtY3B5KHNrYi0+ZGF0YSArIG9mZnNldCwgZnJvbSwgbGVuKTsKK30KKwogZXh0ZXJuIHZvaWQgc2tiX2luaXQodm9pZCk7Ci1leHRlcm4gdm9pZCBza2JfYWRkX210dShpbnQgbXR1KTsKIAogLyoqCiAgKglza2JfZ2V0X3RpbWVzdGFtcCAtIGdldCB0aW1lc3RhbXAgZnJvbSBhIHNrYgpAQCAtMTM2NSwyOSArMTU2NiwyOCBAQAogICovCiBzdGF0aWMgaW5saW5lIHZvaWQgc2tiX2dldF90aW1lc3RhbXAoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHRpbWV2YWwgKnN0YW1wKQogewotCXN0YW1wLT50dl9zZWMgID0gc2tiLT50c3RhbXAub2ZmX3NlYzsKLQlzdGFtcC0+dHZfdXNlYyA9IHNrYi0+dHN0YW1wLm9mZl91c2VjOworCSpzdGFtcCA9IGt0aW1lX3RvX3RpbWV2YWwoc2tiLT50c3RhbXApOwogfQogCi0vKioKLSAqIAlza2Jfc2V0X3RpbWVzdGFtcCAtIHNldCB0aW1lc3RhbXAgb2YgYSBza2IKLSAqCUBza2I6IHNrYiB0byBzZXQgc3RhbXAgb2YKLSAqCUBzdGFtcDogcG9pbnRlciB0byBzdHJ1Y3QgdGltZXZhbCB0byBnZXQgc3RhbXAgZnJvbQotICoKLSAqCVRpbWVzdGFtcHMgYXJlIHN0b3JlZCBpbiB0aGUgc2tiIGFzIG9mZnNldHMgdG8gYSBiYXNlIHRpbWVzdGFtcC4KLSAqCVRoaXMgZnVuY3Rpb24gY29udmVydHMgYSBzdHJ1Y3QgdGltZXZhbCB0byBhbiBvZmZzZXQgYW5kIHN0b3JlcwotICoJaXQgaW4gdGhlIHNrYi4KLSAqLwotc3RhdGljIGlubGluZSB2b2lkIHNrYl9zZXRfdGltZXN0YW1wKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCB0aW1ldmFsICpzdGFtcCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX25ldF90aW1lc3RhbXAoc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlza2ItPnRzdGFtcC5vZmZfc2VjICA9IHN0YW1wLT50dl9zZWM7Ci0Jc2tiLT50c3RhbXAub2ZmX3VzZWMgPSBzdGFtcC0+dHZfdXNlYzsKKwlza2ItPnRzdGFtcCA9IGt0aW1lX2dldF9yZWFsKCk7CiB9CiAKLWV4dGVybiB2b2lkIF9fbmV0X3RpbWVzdGFtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3N0YXRpYyBpbmxpbmUga3RpbWVfdCBuZXRfdGltZWRlbHRhKGt0aW1lX3QgdCkKK3sKKwlyZXR1cm4ga3RpbWVfc3ViKGt0aW1lX2dldF9yZWFsKCksIHQpOworfQogCisKK2V4dGVybiBfX3N1bTE2IF9fc2tiX2NoZWNrc3VtX2NvbXBsZXRlX2hlYWQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGxlbik7CiBleHRlcm4gX19zdW0xNiBfX3NrYl9jaGVja3N1bV9jb21wbGV0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIAorc3RhdGljIGlubGluZSBpbnQgc2tiX2NzdW1fdW5uZWNlc3NhcnkoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gc2tiLT5pcF9zdW1tZWQgJiBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKK30KKwogLyoqCiAgKglza2JfY2hlY2tzdW1fY29tcGxldGUgLSBDYWxjdWxhdGUgY2hlY2tzdW0gb2YgYW4gZW50aXJlIHBhY2tldAogICoJQHNrYjogcGFja2V0IHRvIHByb2Nlc3MKQEAgLTE0MDYsMjIgKzE2MDYsMjIgQEAKICAqLwogc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgc2tiX2NoZWNrc3VtX2NvbXBsZXRlKHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JcmV0dXJuIHNrYi0+aXBfc3VtbWVkICE9IENIRUNLU1VNX1VOTkVDRVNTQVJZICYmCi0JCV9fc2tiX2NoZWNrc3VtX2NvbXBsZXRlKHNrYik7CisJcmV0dXJuIHNrYl9jc3VtX3VubmVjZXNzYXJ5KHNrYikgPworCSAgICAgICAwIDogX19za2JfY2hlY2tzdW1fY29tcGxldGUoc2tiKTsKIH0KIAotI2lmZGVmIENPTkZJR19ORVRGSUxURVIKKyNpZiBkZWZpbmVkKENPTkZJR19ORl9DT05OVFJBQ0spIHx8IGRlZmluZWQoQ09ORklHX05GX0NPTk5UUkFDS19NT0RVTEUpCitleHRlcm4gdm9pZCBuZl9jb25udHJhY2tfZGVzdHJveShzdHJ1Y3QgbmZfY29ubnRyYWNrICpuZmN0KTsKIHN0YXRpYyBpbmxpbmUgdm9pZCBuZl9jb25udHJhY2tfcHV0KHN0cnVjdCBuZl9jb25udHJhY2sgKm5mY3QpCiB7CiAJaWYgKG5mY3QgJiYgYXRvbWljX2RlY19hbmRfdGVzdCgmbmZjdC0+dXNlKSkKLQkJbmZjdC0+ZGVzdHJveShuZmN0KTsKKwkJbmZfY29ubnRyYWNrX2Rlc3Ryb3kobmZjdCk7CiB9CiBzdGF0aWMgaW5saW5lIHZvaWQgbmZfY29ubnRyYWNrX2dldChzdHJ1Y3QgbmZfY29ubnRyYWNrICpuZmN0KQogewogCWlmIChuZmN0KQogCQlhdG9taWNfaW5jKCZuZmN0LT51c2UpOwogfQotI2lmIGRlZmluZWQoQ09ORklHX05GX0NPTk5UUkFDSykgfHwgZGVmaW5lZChDT05GSUdfTkZfQ09OTlRSQUNLX01PRFVMRSkKIHN0YXRpYyBpbmxpbmUgdm9pZCBuZl9jb25udHJhY2tfZ2V0X3JlYXNtKHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJaWYgKHNrYikKQEAgLTE0NDcsOSArMTY0Nyw5IEBACiAjZW5kaWYgLyogQ09ORklHX0JSSURHRV9ORVRGSUxURVIgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBuZl9yZXNldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogeworI2lmIGRlZmluZWQoQ09ORklHX05GX0NPTk5UUkFDSykgfHwgZGVmaW5lZChDT05GSUdfTkZfQ09OTlRSQUNLX01PRFVMRSkKIAluZl9jb25udHJhY2tfcHV0KHNrYi0+bmZjdCk7CiAJc2tiLT5uZmN0ID0gTlVMTDsKLSNpZiBkZWZpbmVkKENPTkZJR19ORl9DT05OVFJBQ0spIHx8IGRlZmluZWQoQ09ORklHX05GX0NPTk5UUkFDS19NT0RVTEUpCiAJbmZfY29ubnRyYWNrX3B1dF9yZWFzbShza2ItPm5mY3RfcmVhc20pOwogCXNrYi0+bmZjdF9yZWFzbSA9IE5VTEw7CiAjZW5kaWYKQEAgLTE0NTksOSArMTY1OSwzMyBAQAogI2VuZGlmCiB9CiAKLSNlbHNlIC8qIENPTkZJR19ORVRGSUxURVIgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBuZl9yZXNldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKSB7fQotI2VuZGlmIC8qIENPTkZJR19ORVRGSUxURVIgKi8KKy8qIE5vdGU6IFRoaXMgZG9lc24ndCBwdXQgYW55IGNvbm50cmFjayBhbmQgYnJpZGdlIGluZm8gaW4gZHN0LiAqLworc3RhdGljIGlubGluZSB2b2lkIF9fbmZfY29weShzdHJ1Y3Qgc2tfYnVmZiAqZHN0LCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc3JjKQoreworI2lmIGRlZmluZWQoQ09ORklHX05GX0NPTk5UUkFDSykgfHwgZGVmaW5lZChDT05GSUdfTkZfQ09OTlRSQUNLX01PRFVMRSkKKwlkc3QtPm5mY3QgPSBzcmMtPm5mY3Q7CisJbmZfY29ubnRyYWNrX2dldChzcmMtPm5mY3QpOworCWRzdC0+bmZjdGluZm8gPSBzcmMtPm5mY3RpbmZvOworCWRzdC0+bmZjdF9yZWFzbSA9IHNyYy0+bmZjdF9yZWFzbTsKKwluZl9jb25udHJhY2tfZ2V0X3JlYXNtKHNyYy0+bmZjdF9yZWFzbSk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQlJJREdFX05FVEZJTFRFUgorCWRzdC0+bmZfYnJpZGdlICA9IHNyYy0+bmZfYnJpZGdlOworCW5mX2JyaWRnZV9nZXQoc3JjLT5uZl9icmlkZ2UpOworI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBuZl9jb3B5KHN0cnVjdCBza19idWZmICpkc3QsIGNvbnN0IHN0cnVjdCBza19idWZmICpzcmMpCit7CisjaWYgZGVmaW5lZChDT05GSUdfTkZfQ09OTlRSQUNLKSB8fCBkZWZpbmVkKENPTkZJR19ORl9DT05OVFJBQ0tfTU9EVUxFKQorCW5mX2Nvbm50cmFja19wdXQoZHN0LT5uZmN0KTsKKwluZl9jb25udHJhY2tfcHV0X3JlYXNtKGRzdC0+bmZjdF9yZWFzbSk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQlJJREdFX05FVEZJTFRFUgorCW5mX2JyaWRnZV9wdXQoZHN0LT5uZl9icmlkZ2UpOworI2VuZGlmCisJX19uZl9jb3B5KGRzdCwgc3JjKTsKK30KIAogI2lmZGVmIENPTkZJR19ORVRXT1JLX1NFQ01BUksKIHN0YXRpYyBpbmxpbmUgdm9pZCBza2JfY29weV9zZWNtYXJrKHN0cnVjdCBza19idWZmICp0bywgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKmZyb20pCkBAIC0xNDg2LDUgKzE3MTAsMTIgQEAKIAlyZXR1cm4gc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZTsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIHNrYl9mb3J3YXJkX2NzdW0oc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwkvKiBVbmZvcnR1bmF0ZWx5IHdlIGRvbid0IHN1cHBvcnQgdGhpcyBvbmUuICBBbnkgYnJhdmUgc291bHM/ICovCisJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0NPTVBMRVRFKQorCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7Cit9CisKICNlbmRpZgkvKiBfX0tFUk5FTF9fICovCiAjZW5kaWYJLyogX0xJTlVYX1NLQlVGRl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NubXAuaCBiL2luY2x1ZGUvbGludXgvc25tcC5oCmluZGV4IDg1NGFhNmIuLjgwMmIzYTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc25tcC5oCisrKyBiL2luY2x1ZGUvbGludXgvc25tcC5oCkBAIC00MCw2ICs0MCw4IEBACiAJSVBTVEFUU19NSUJfRlJBR0NSRUFURVMsCQkvKiBGcmFnQ3JlYXRlcyAqLwogCUlQU1RBVFNfTUlCX0lOTUNBU1RQS1RTLAkJLyogSW5NY2FzdFBrdHMgKi8KIAlJUFNUQVRTX01JQl9PVVRNQ0FTVFBLVFMsCQkvKiBPdXRNY2FzdFBrdHMgKi8KKwlJUFNUQVRTX01JQl9JTkJDQVNUUEtUUywJCS8qIEluQmNhc3RQa3RzICovCisJSVBTVEFUU19NSUJfT1VUQkNBU1RQS1RTLAkJLyogT3V0QmNhc3RQa3RzICovCiAJX19JUFNUQVRTX01JQl9NQVgKIH07CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc29ja2V0LmggYi9pbmNsdWRlL2xpbnV4L3NvY2tldC5oCmluZGV4IGZjZDM1YTIuLjZlN2M5NDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc29ja2V0LmgKKysrIGIvaW5jbHVkZS9saW51eC9zb2NrZXQuaApAQCAtMTg4LDcgKzE4OCw4IEBACiAjZGVmaW5lIEFGX1RJUEMJCTMwCS8qIFRJUEMgc29ja2V0cwkJCSovCiAjZGVmaW5lIEFGX0JMVUVUT09USAkzMQkvKiBCbHVldG9vdGggc29ja2V0cyAJCSovCiAjZGVmaW5lIEFGX0lVQ1YJCTMyCS8qIElVQ1Ygc29ja2V0cwkJCSovCi0jZGVmaW5lIEFGX01BWAkJMzMJLyogRm9yIG5vdy4uICovCisjZGVmaW5lIEFGX1JYUlBDCTMzCS8qIFJ4UlBDIHNvY2tldHMgCQkqLworI2RlZmluZSBBRl9NQVgJCTM0CS8qIEZvciBub3cuLiAqLwogCiAvKiBQcm90b2NvbCBmYW1pbGllcywgc2FtZSBhcyBhZGRyZXNzIGZhbWlsaWVzLiAqLwogI2RlZmluZSBQRl9VTlNQRUMJQUZfVU5TUEVDCkBAIC0yMjIsNiArMjIzLDcgQEAKICNkZWZpbmUgUEZfVElQQwkJQUZfVElQQwogI2RlZmluZSBQRl9CTFVFVE9PVEgJQUZfQkxVRVRPT1RICiAjZGVmaW5lIFBGX0lVQ1YJCUFGX0lVQ1YKKyNkZWZpbmUgUEZfUlhSUEMJQUZfUlhSUEMKICNkZWZpbmUgUEZfTUFYCQlBRl9NQVgKIAogLyogTWF4aW11bSBxdWV1ZSBsZW5ndGggc3BlY2lmaWFibGUgYnkgbGlzdGVuLiAgKi8KQEAgLTI4NCw2ICsyODYsNyBAQAogI2RlZmluZSBTT0xfRENDUAkyNjkKICNkZWZpbmUgU09MX05FVExJTksJMjcwCiAjZGVmaW5lIFNPTF9USVBDCTI3MQorI2RlZmluZSBTT0xfUlhSUEMJMjcyCiAKIC8qIElQWCBvcHRpb25zICovCiAjZGVmaW5lIElQWF9UWVBFCTEKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc29ueS1sYXB0b3AuaCBiL2luY2x1ZGUvbGludXgvc29ueS1sYXB0b3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmUwMzZkCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9zb255LWxhcHRvcC5oCkBAIC0wLDAgKzEsMzQgQEAKKyNpZm5kZWYgX1NPTllMQVBUT1BfSF8KKyNkZWZpbmUgX1NPTllMQVBUT1BfSF8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qIHVzZWQgb25seSBmb3IgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHY0bCBhbmQgc29ueS1sYXB0b3AgKi8KKworI2RlZmluZSBTT05ZX1BJQ19DT01NQU5EX0dFVENBTUVSQQkJIDEJLyogb2Jzb2xldGUgKi8KKyNkZWZpbmUgU09OWV9QSUNfQ09NTUFORF9TRVRDQU1FUkEJCSAyCisjZGVmaW5lIFNPTllfUElDX0NPTU1BTkRfR0VUQ0FNRVJBQlJJR0hUTkVTUwkgMwkvKiBvYnNvbGV0ZSAqLworI2RlZmluZSBTT05ZX1BJQ19DT01NQU5EX1NFVENBTUVSQUJSSUdIVE5FU1MJIDQKKyNkZWZpbmUgU09OWV9QSUNfQ09NTUFORF9HRVRDQU1FUkFDT05UUkFTVAkgNQkvKiBvYnNvbGV0ZSAqLworI2RlZmluZSBTT05ZX1BJQ19DT01NQU5EX1NFVENBTUVSQUNPTlRSQVNUCSA2CisjZGVmaW5lIFNPTllfUElDX0NPTU1BTkRfR0VUQ0FNRVJBSFVFCQkgNwkvKiBvYnNvbGV0ZSAqLworI2RlZmluZSBTT05ZX1BJQ19DT01NQU5EX1NFVENBTUVSQUhVRQkJIDgKKyNkZWZpbmUgU09OWV9QSUNfQ09NTUFORF9HRVRDQU1FUkFDT0xPUgkJIDkJLyogb2Jzb2xldGUgKi8KKyNkZWZpbmUgU09OWV9QSUNfQ09NTUFORF9TRVRDQU1FUkFDT0xPUgkJMTAKKyNkZWZpbmUgU09OWV9QSUNfQ09NTUFORF9HRVRDQU1FUkFTSEFSUE5FU1MJMTEJLyogb2Jzb2xldGUgKi8KKyNkZWZpbmUgU09OWV9QSUNfQ09NTUFORF9TRVRDQU1FUkFTSEFSUE5FU1MJMTIKKyNkZWZpbmUgU09OWV9QSUNfQ09NTUFORF9HRVRDQU1FUkFQSUNUVVJFCTEzCS8qIG9ic29sZXRlICovCisjZGVmaW5lIFNPTllfUElDX0NPTU1BTkRfU0VUQ0FNRVJBUElDVFVSRQkxNAorI2RlZmluZSBTT05ZX1BJQ19DT01NQU5EX0dFVENBTUVSQUFHQwkJMTUJLyogb2Jzb2xldGUgKi8KKyNkZWZpbmUgU09OWV9QSUNfQ09NTUFORF9TRVRDQU1FUkFBR0MJCTE2CisjZGVmaW5lIFNPTllfUElDX0NPTU1BTkRfR0VUQ0FNRVJBRElSRUNUSU9OCTE3CS8qIG9ic29sZXRlICovCisjZGVmaW5lIFNPTllfUElDX0NPTU1BTkRfR0VUQ0FNRVJBUk9NVkVSU0lPTgkxOAkvKiBvYnNvbGV0ZSAqLworI2RlZmluZSBTT05ZX1BJQ19DT01NQU5EX0dFVENBTUVSQVJFVklTSU9OCTE5CS8qIG9ic29sZXRlICovCisKK2ludCBzb255X3BpY19jYW1lcmFfY29tbWFuZChpbnQgY29tbWFuZCwgdTggdmFsdWUpOworCisjZW5kaWYJLyogX19LRVJORUxfXyAqLworCisjZW5kaWYgLyogX1NPTllMQVBUT1BfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3RyaW5nLmggYi9pbmNsdWRlL2xpbnV4L3N0cmluZy5oCmluZGV4IDRmNjllZjkuLjdmMmViNmEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3RyaW5nLmgKKysrIGIvaW5jbHVkZS9saW51eC9zdHJpbmcuaApAQCAtNDcsNiArNDcsMTIgQEAKICNpZm5kZWYgX19IQVZFX0FSQ0hfU1RSTklDTVAKIGV4dGVybiBpbnQgc3RybmljbXAoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIF9fa2VybmVsX3NpemVfdCk7CiAjZW5kaWYKKyNpZm5kZWYgX19IQVZFX0FSQ0hfU1RSQ0FTRUNNUAorZXh0ZXJuIGludCBzdHJjYXNlY21wKGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMik7CisjZW5kaWYKKyNpZm5kZWYgX19IQVZFX0FSQ0hfU1RSTkNBU0VDTVAKK2V4dGVybiBpbnQgc3RybmNhc2VjbXAoY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyLCBzaXplX3Qgbik7CisjZW5kaWYKICNpZm5kZWYgX19IQVZFX0FSQ0hfU1RSQ0hSCiBleHRlcm4gY2hhciAqIHN0cmNocihjb25zdCBjaGFyICosaW50KTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zeXNjdGwuaCBiL2luY2x1ZGUvbGludXgvc3lzY3RsLmgKaW5kZXggOWE4OTcwYi4uNDdmMWM1MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zeXNjdGwuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N5c2N0bC5oCkBAIC0yOTAsNiArMjkwLDcgQEAKIAlORVRfQ09SRV9CVURHRVQ9MTksCiAJTkVUX0NPUkVfQUVWRU5UX0VUSU1FPTIwLAogCU5FVF9DT1JFX0FFVkVOVF9SU0VRVEg9MjEsCisJTkVUX0NPUkVfV0FSTklOR1M9MjIsCiB9OwogCiAvKiAvcHJvYy9zeXMvbmV0L2V0aGVybmV0ICovCkBAIC00MzgsNiArNDM5LDggQEAKIAlORVRfQ0lQU09WNF9SQk1fU1RSSUNUVkFMSUQ9MTIxLAogCU5FVF9UQ1BfQVZBSUxfQ09OR19DT05UUk9MPTEyMiwKIAlORVRfVENQX0FMTE9XRURfQ09OR19DT05UUk9MPTEyMywKKwlORVRfVENQX01BWF9TU1RIUkVTSD0xMjQsCisJTkVUX1RDUF9GUlRPX1JFU1BPTlNFPTEyNSwKIH07CiAKIGVudW0gewpAQCAtNzg5LDYgKzc5Miw3IEBACiAJTkVUX0JSSURHRV9ORl9DQUxMX0lQVEFCTEVTID0gMiwKIAlORVRfQlJJREdFX05GX0NBTExfSVA2VEFCTEVTID0gMywKIAlORVRfQlJJREdFX05GX0ZJTFRFUl9WTEFOX1RBR0dFRCA9IDQsCisJTkVUX0JSSURHRV9ORl9GSUxURVJfUFBQT0VfVEFHR0VEID0gNSwKIH07CiAKIC8qIENUTF9GUyBuYW1lczogKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3lzZnMuaCBiL2luY2x1ZGUvbGludXgvc3lzZnMuaAppbmRleCBmZWE5YTZiLi43ZDVkMWVjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N5c2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9zeXNmcy5oCkBAIC04MCw3ICs4MCw3IEBACiAjaWZkZWYgQ09ORklHX1NZU0ZTCiAKIGV4dGVybiBpbnQgc3lzZnNfc2NoZWR1bGVfY2FsbGJhY2soc3RydWN0IGtvYmplY3QgKmtvYmosCi0JCXZvaWQgKCpmdW5jKSh2b2lkICopLCB2b2lkICpkYXRhKTsKKwkJdm9pZCAoKmZ1bmMpKHZvaWQgKiksIHZvaWQgKmRhdGEsIHN0cnVjdCBtb2R1bGUgKm93bmVyKTsKIAogZXh0ZXJuIGludCBfX211c3RfY2hlY2sKIHN5c2ZzX2NyZWF0ZV9kaXIoc3RydWN0IGtvYmplY3QgKiwgc3RydWN0IGRlbnRyeSAqKTsKQEAgLTEzNyw3ICsxMzcsNyBAQAogI2Vsc2UgLyogQ09ORklHX1NZU0ZTICovCiAKIHN0YXRpYyBpbmxpbmUgaW50IHN5c2ZzX3NjaGVkdWxlX2NhbGxiYWNrKHN0cnVjdCBrb2JqZWN0ICprb2JqLAotCQl2b2lkICgqZnVuYykodm9pZCAqKSwgdm9pZCAqZGF0YSkKKwkJdm9pZCAoKmZ1bmMpKHZvaWQgKiksIHZvaWQgKmRhdGEsIHN0cnVjdCBtb2R1bGUgKm93bmVyKQogewogCXJldHVybiAtRU5PU1lTOwogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90Y3AuaCBiL2luY2x1ZGUvbGludXgvdGNwLmgKaW5kZXggMjlkMzA4OS4uYzZiOWY5MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC90Y3AuaAorKysgYi9pbmNsdWRlL2xpbnV4L3RjcC5oCkBAIC0xNzgsNiArMTc4LDIxIEBACiAjaW5jbHVkZSA8bmV0L2luZXRfY29ubmVjdGlvbl9zb2NrLmg+CiAjaW5jbHVkZSA8bmV0L2luZXRfdGltZXdhaXRfc29jay5oPgogCitzdGF0aWMgaW5saW5lIHN0cnVjdCB0Y3BoZHIgKnRjcF9oZHIoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gKHN0cnVjdCB0Y3BoZHIgKilza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCB0Y3BfaGRybGVuKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIHRjcF9oZHIoc2tiKS0+ZG9mZiAqIDQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHRjcF9vcHRsZW4oY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gKHRjcF9oZHIoc2tiKS0+ZG9mZiAtIDUpICogNDsKK30KKwogLyogVGhpcyBkZWZpbmVzIGEgc2VsZWN0aXZlIGFja25vd2xlZGdlbWVudCBibG9jay4gKi8KIHN0cnVjdCB0Y3Bfc2Fja19ibG9ja193aXJlIHsKIAlfX2JlMzIJc3RhcnRfc2VxOwpAQCAtMjQyLDYgKzI1Nyw4IEBACiAgKglTZWUgUkZDNzkzIGFuZCBSRkMxMTIyLiBUaGUgUkZDIHdyaXRlcyB0aGVzZSBpbiBjYXBpdGFscy4KICAqLwogIAl1MzIJcmN2X254dDsJLyogV2hhdCB3ZSB3YW50IHRvIHJlY2VpdmUgbmV4dCAJKi8KKwl1MzIJY29waWVkX3NlcTsJLyogSGVhZCBvZiB5ZXQgdW5yZWFkIGRhdGEJCSovCisJdTMyCXJjdl93dXA7CS8qIHJjdl9ueHQgb24gbGFzdCB3aW5kb3cgdXBkYXRlIHNlbnQJKi8KICAJdTMyCXNuZF9ueHQ7CS8qIE5leHQgc2VxdWVuY2Ugd2Ugc2VuZAkJKi8KIAogIAl1MzIJc25kX3VuYTsJLyogRmlyc3QgYnl0ZSB3ZSB3YW50IGFuIGFjayBmb3IJKi8KQEAgLTMwMCwxNyArMzE3LDE1IEBACiAgCXUzMglzbmRfc3N0aHJlc2g7CS8qIFNsb3cgc3RhcnQgc2l6ZSB0aHJlc2hvbGQJCSovCiAgCXUzMglzbmRfY3duZDsJLyogU2VuZGluZyBjb25nZXN0aW9uIHdpbmRvdwkJKi8KICAJdTE2CXNuZF9jd25kX2NudDsJLyogTGluZWFyIGluY3JlYXNlIGNvdW50ZXIJCSovCi0JdTE2CXNuZF9jd25kX2NsYW1wOyAvKiBEbyBub3QgYWxsb3cgc25kX2N3bmQgdG8gZ3JvdyBhYm92ZSB0aGlzICovCisJdTMyCXNuZF9jd25kX2NsYW1wOyAvKiBEbyBub3QgYWxsb3cgc25kX2N3bmQgdG8gZ3JvdyBhYm92ZSB0aGlzICovCiAJdTMyCXNuZF9jd25kX3VzZWQ7CiAJdTMyCXNuZF9jd25kX3N0YW1wOwogCiAJc3RydWN0IHNrX2J1ZmZfaGVhZAlvdXRfb2Zfb3JkZXJfcXVldWU7IC8qIE91dCBvZiBvcmRlciBzZWdtZW50cyBnbyBoZXJlICovCiAKICAJdTMyCXJjdl93bmQ7CS8qIEN1cnJlbnQgcmVjZWl2ZXIgd2luZG93CQkqLwotCXUzMglyY3Zfd3VwOwkvKiByY3Zfbnh0IG9uIGxhc3Qgd2luZG93IHVwZGF0ZSBzZW50CSovCiAJdTMyCXdyaXRlX3NlcTsJLyogVGFpbCgrMSkgb2YgZGF0YSBoZWxkIGluIHRjcCBzZW5kIGJ1ZmZlciAqLwogCXUzMglwdXNoZWRfc2VxOwkvKiBMYXN0IHB1c2hlZCBzZXEsIHJlcXVpcmVkIHRvIHRhbGsgdG8gd2luZG93cyAqLwotCXUzMgljb3BpZWRfc2VxOwkvKiBIZWFkIG9mIHlldCB1bnJlYWQgZGF0YQkJKi8KIAogLyoJU0FDS3MgZGF0YQkqLwogCXN0cnVjdCB0Y3Bfc2Fja19ibG9jayBkdXBsaWNhdGVfc2Fja1sxXTsgLyogRC1TQUNLIGJsb2NrICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VkcC5oIGIvaW5jbHVkZS9saW51eC91ZHAuaAppbmRleCA3ZTA4YzA3Li42ZGU0NDVjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3VkcC5oCisrKyBiL2luY2x1ZGUvbGludXgvdWRwLmgKQEAgLTI2LDYgKzI2LDE1IEBACiAJX19zdW0xNgljaGVjazsKIH07CiAKKyNpZmRlZiBfX0tFUk5FTF9fCisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHVkcGhkciAqdWRwX2hkcihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiAoc3RydWN0IHVkcGhkciAqKXNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYik7Cit9CisjZW5kaWYKKwogLyogVURQIHNvY2tldCBvcHRpb25zICovCiAjZGVmaW5lIFVEUF9DT1JLCTEJLyogTmV2ZXIgc2VuZCBwYXJ0aWFsbHkgY29tcGxldGUgc2VnbWVudHMgKi8KICNkZWZpbmUgVURQX0VOQ0FQCTEwMAkvKiBTZXQgdGhlIHNvY2tldCB0byBhY2NlcHQgZW5jYXBzdWxhdGVkIHBhY2tldHMgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdXNiLmggYi9pbmNsdWRlL2xpbnV4L3VzYi5oCmluZGV4IDg3ZGM3NWEuLmNmYmQyYmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdXNiLmgKKysrIGIvaW5jbHVkZS9saW51eC91c2IuaApAQCAtMjk5LDggKzI5OSw5IEBACiAJaW50IGJhbmR3aWR0aF9pbnRfcmVxczsJCS8qIG51bWJlciBvZiBJbnRlcnJ1cHQgcmVxdWVzdHMgKi8KIAlpbnQgYmFuZHdpZHRoX2lzb2NfcmVxczsJLyogbnVtYmVyIG9mIElzb2MuIHJlcXVlc3RzICovCiAKKyNpZmRlZiBDT05GSUdfVVNCX0RFVklDRUZTCiAJc3RydWN0IGRlbnRyeSAqdXNiZnNfZGVudHJ5OwkvKiB1c2JmcyBkZW50cnkgZW50cnkgZm9yIHRoZSBidXMgKi8KLQorI2VuZGlmCiAJc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2OwkvKiBjbGFzcyBkZXZpY2UgZm9yIHRoaXMgYnVzICovCiAKICNpZiBkZWZpbmVkKENPTkZJR19VU0JfTU9OKQpAQCAtMzczLDkgKzM3NCwxMiBAQAogCWNoYXIgKnNlcmlhbDsJCQkvKiBpU2VyaWFsTnVtYmVyIHN0cmluZywgaWYgcHJlc2VudCAqLwogCiAJc3RydWN0IGxpc3RfaGVhZCBmaWxlbGlzdDsKLQlzdHJ1Y3QgZGV2aWNlICp1c2Jmc19kZXY7CisjaWZkZWYgQ09ORklHX1VTQl9ERVZJQ0VfQ0xBU1MKKwlzdHJ1Y3QgZGV2aWNlICp1c2JfY2xhc3NkZXY7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfVVNCX0RFVklDRUZTCiAJc3RydWN0IGRlbnRyeSAqdXNiZnNfZGVudHJ5OwkvKiB1c2JmcyBkZW50cnkgZW50cnkgZm9yIHRoZSBkZXZpY2UgKi8KLQorI2VuZGlmCiAJLyoKIAkgKiBDaGlsZCBkZXZpY2VzIC0gdGhlc2UgY2FuIGJlIGVpdGhlciBuZXcgZGV2aWNlcwogCSAqIChpZiB0aGlzIGlzIGEgaHViIGRldmljZSksIG9yIGRpZmZlcmVudCBpbnN0YW5jZXMKQEAgLTM5NCwxMCArMzk4LDEzIEBACiAJc3RydWN0IGRlbGF5ZWRfd29yayBhdXRvc3VzcGVuZDsgLyogZm9yIGRlbGF5ZWQgYXV0b3N1c3BlbmRzICovCiAJc3RydWN0IG11dGV4IHBtX211dGV4OwkJLyogcHJvdGVjdHMgUE0gb3BlcmF0aW9ucyAqLwogCi0JdW5zaWduZWQgYXV0b3N1c3BlbmRfZGVsYXk7CS8qIGluIGppZmZpZXMgKi8KKwl1bnNpZ25lZCBsb25nIGxhc3RfYnVzeTsJLyogdGltZSBvZiBsYXN0IHVzZSAqLworCWludCBhdXRvc3VzcGVuZF9kZWxheTsJCS8qIGluIGppZmZpZXMgKi8KIAogCXVuc2lnbmVkIGF1dG9fcG06MTsJCS8qIGF1dG9zdXNwZW5kL3Jlc3VtZSBpbiBwcm9ncmVzcyAqLwogCXVuc2lnbmVkIGRvX3JlbW90ZV93YWtldXA6MTsJLyogcmVtb3RlIHdha2V1cCBzaG91bGQgYmUgZW5hYmxlZCAqLworCXVuc2lnbmVkIGF1dG9zdXNwZW5kX2Rpc2FibGVkOjE7IC8qIGF1dG9zdXNwZW5kIGFuZCBhdXRvcmVzdW1lICovCisJdW5zaWduZWQgYXV0b3Jlc3VtZV9kaXNhYmxlZDoxOyAgLyogIGRpc2FibGVkIGJ5IHRoZSB1c2VyICovCiAjZW5kaWYKIH07CiAjZGVmaW5lCXRvX3VzYl9kZXZpY2UoZCkgY29udGFpbmVyX29mKGQsIHN0cnVjdCB1c2JfZGV2aWNlLCBkZXYpCkBAIC00MzcsNiArNDQ0LDExIEBACiAJdXNiX2F1dG9wbV9zZXRfaW50ZXJmYWNlKGludGYpOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgdXNiX21hcmtfbGFzdF9idXN5KHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2KQoreworCXVkZXYtPmxhc3RfYnVzeSA9IGppZmZpZXM7Cit9CisKICNlbHNlCiAKIHN0YXRpYyBpbmxpbmUgaW50IHVzYl9hdXRvcG1fc2V0X2ludGVyZmFjZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKQEAgLTQ1MSw2ICs0NjMsOCBAQAogeyB9CiBzdGF0aWMgaW5saW5lIHZvaWQgdXNiX2F1dG9wbV9kaXNhYmxlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQogeyB9CitzdGF0aWMgaW5saW5lIHZvaWQgdXNiX21hcmtfbGFzdF9idXN5KHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2KQoreyB9CiAjZW5kaWYKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdXNiL2NkYy5oIGIvaW5jbHVkZS9saW51eC91c2IvY2RjLmgKaW5kZXggOTU2ZWRmMy4uMjIwNGFlMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91c2IvY2RjLmgKKysrIGIvaW5jbHVkZS9saW51eC91c2IvY2RjLmgKQEAgLTkxLDYgKzkxLDE3IEBACiAJLyogLi4uIGFuZCB0aGVyZSBjb3VsZCBiZSBvdGhlciBzbGF2ZSBpbnRlcmZhY2VzICovCiB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIAorLyogIkNvdW50cnkgU2VsZWN0aW9uIEZ1bmN0aW9uYWwgRGVzY3JpcHRvciIgZnJvbSBDREMgc3BlYyA1LjIuMy45ICovCitzdHJ1Y3QgdXNiX2NkY19jb3VudHJ5X2Z1bmN0aW9uYWxfZGVzYyB7CisJX191OAliTGVuZ3RoOworCV9fdTgJYkRlc2NyaXB0b3JUeXBlOworCV9fdTgJYkRlc2NyaXB0b3JTdWJUeXBlOworCisJX191OAlpQ291bnRyeUNvZGVSZWxEYXRlOworCV9fbGUxNgl3Q291bnR5Q29kZTA7CisJLyogLi4uIGFuZCB0aGVyZSBjYW4gYmUgYSBsb3Qgb2YgY291bnRyeSBjb2RlcyAqLworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKIC8qICJOZXR3b3JrIENoYW5uZWwgVGVybWluYWwgRnVuY3Rpb25hbCBEZXNjcmlwdG9yIiBmcm9tIENEQyBzcGVjIDUuMi4zLjExICovCiBzdHJ1Y3QgdXNiX2NkY19uZXR3b3JrX3Rlcm1pbmFsX2Rlc2MgewogCV9fdTgJYkxlbmd0aDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdXNiL2NoOS5oIGIvaW5jbHVkZS9saW51eC91c2IvY2g5LmgKaW5kZXggMTEyMmE2Yy4uNjE2OTQzOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91c2IvY2g5LmgKKysrIGIvaW5jbHVkZS9saW51eC91c2IvY2g5LmgKQEAgLTE4MSwxMiArMTgxLDE1IEBACiAjZGVmaW5lIFVTQl9EVF9XSVJFX0FEQVBURVIJCTB4MjEKICNkZWZpbmUgVVNCX0RUX1JQSVBFCQkJMHgyMgogCi0vKiBjb252ZW50aW9uYWwgY29kZXMgZm9yIGNsYXNzLXNwZWNpZmljIGRlc2NyaXB0b3JzICovCi0jZGVmaW5lIFVTQl9EVF9DU19ERVZJQ0UJCTB4MjEKLSNkZWZpbmUgVVNCX0RUX0NTX0NPTkZJRwkJMHgyMgotI2RlZmluZSBVU0JfRFRfQ1NfU1RSSU5HCQkweDIzCi0jZGVmaW5lIFVTQl9EVF9DU19JTlRFUkZBQ0UJCTB4MjQKLSNkZWZpbmUgVVNCX0RUX0NTX0VORFBPSU5UCQkweDI1CisvKiBDb252ZW50aW9uYWwgY29kZXMgZm9yIGNsYXNzLXNwZWNpZmljIGRlc2NyaXB0b3JzLiAgVGhlIGNvbnZlbnRpb24gaXMKKyAqIGRlZmluZWQgaW4gdGhlIFVTQiAiQ29tbW9uIENsYXNzIiBTcGVjICgzLjExKS4gIEluZGl2aWR1YWwgY2xhc3Mgc3BlY3MKKyAqIGFyZSBhdXRob3JpdGF0aXZlIGZvciB0aGVpciB1c2FnZSwgbm90IHRoZSAiY29tbW9uIGNsYXNzIiB3cml0ZXVwLgorICovCisjZGVmaW5lIFVTQl9EVF9DU19ERVZJQ0UJCShVU0JfVFlQRV9DTEFTUyB8IFVTQl9EVF9ERVZJQ0UpCisjZGVmaW5lIFVTQl9EVF9DU19DT05GSUcJCShVU0JfVFlQRV9DTEFTUyB8IFVTQl9EVF9DT05GSUcpCisjZGVmaW5lIFVTQl9EVF9DU19TVFJJTkcJCShVU0JfVFlQRV9DTEFTUyB8IFVTQl9EVF9TVFJJTkcpCisjZGVmaW5lIFVTQl9EVF9DU19JTlRFUkZBQ0UJCShVU0JfVFlQRV9DTEFTUyB8IFVTQl9EVF9JTlRFUkZBQ0UpCisjZGVmaW5lIFVTQl9EVF9DU19FTkRQT0lOVAkJKFVTQl9UWVBFX0NMQVNTIHwgVVNCX0RUX0VORFBPSU5UKQogCiAvKiBBbGwgc3RhbmRhcmQgZGVzY3JpcHRvcnMgaGF2ZSB0aGVzZSAyIGZpZWxkcyBhdCB0aGUgYmVnaW5uaW5nICovCiBzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdmlkZW9kZXYyLmggYi9pbmNsdWRlL2xpbnV4L3ZpZGVvZGV2Mi5oCmluZGV4IDQ0MWI4NzcuLmEyNWMyYWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdmlkZW9kZXYyLmgKKysrIGIvaW5jbHVkZS9saW51eC92aWRlb2RldjIuaApAQCAtOTYsNDQgKzk2LDYwIEBACiAgKglFIE4gVSBNIFMKICAqLwogZW51bSB2NGwyX2ZpZWxkIHsKLQlWNEwyX0ZJRUxEX0FOWSAgICAgICAgPSAwLCAvKiBkcml2ZXIgY2FuIGNob29zZSBmcm9tIG5vbmUsCi0JCQkJICAgICAgdG9wLCBib3R0b20sIGludGVybGFjZWQKLQkJCQkgICAgICBkZXBlbmRpbmcgb24gd2hhdGV2ZXIgaXQgdGhpbmtzCi0JCQkJICAgICAgaXMgYXBwcm94aW1hdGUgLi4uICovCi0JVjRMMl9GSUVMRF9OT05FICAgICAgID0gMSwgLyogdGhpcyBkZXZpY2UgaGFzIG5vIGZpZWxkcyAuLi4gKi8KLQlWNEwyX0ZJRUxEX1RPUCAgICAgICAgPSAyLCAvKiB0b3AgZmllbGQgb25seSAqLwotCVY0TDJfRklFTERfQk9UVE9NICAgICA9IDMsIC8qIGJvdHRvbSBmaWVsZCBvbmx5ICovCi0JVjRMMl9GSUVMRF9JTlRFUkxBQ0VEID0gNCwgLyogYm90aCBmaWVsZHMgaW50ZXJsYWNlZCAqLwotCVY0TDJfRklFTERfU0VRX1RCICAgICA9IDUsIC8qIGJvdGggZmllbGRzIHNlcXVlbnRpYWwgaW50byBvbmUKLQkJCQkgICAgICBidWZmZXIsIHRvcC1ib3R0b20gb3JkZXIgKi8KLQlWNEwyX0ZJRUxEX1NFUV9CVCAgICAgPSA2LCAvKiBzYW1lIGFzIGFib3ZlICsgYm90dG9tLXRvcCBvcmRlciAqLwotCVY0TDJfRklFTERfQUxURVJOQVRFICA9IDcsIC8qIGJvdGggZmllbGRzIGFsdGVybmF0aW5nIGludG8KLQkJCQkgICAgICBzZXBhcmF0ZSBidWZmZXJzICovCisJVjRMMl9GSUVMRF9BTlkgICAgICAgICAgID0gMCwgLyogZHJpdmVyIGNhbiBjaG9vc2UgZnJvbSBub25lLAorCQkJCQkgdG9wLCBib3R0b20sIGludGVybGFjZWQKKwkJCQkJIGRlcGVuZGluZyBvbiB3aGF0ZXZlciBpdCB0aGlua3MKKwkJCQkJIGlzIGFwcHJveGltYXRlIC4uLiAqLworCVY0TDJfRklFTERfTk9ORSAgICAgICAgICA9IDEsIC8qIHRoaXMgZGV2aWNlIGhhcyBubyBmaWVsZHMgLi4uICovCisJVjRMMl9GSUVMRF9UT1AgICAgICAgICAgID0gMiwgLyogdG9wIGZpZWxkIG9ubHkgKi8KKwlWNEwyX0ZJRUxEX0JPVFRPTSAgICAgICAgPSAzLCAvKiBib3R0b20gZmllbGQgb25seSAqLworCVY0TDJfRklFTERfSU5URVJMQUNFRCAgICA9IDQsIC8qIGJvdGggZmllbGRzIGludGVybGFjZWQgKi8KKwlWNEwyX0ZJRUxEX1NFUV9UQiAgICAgICAgPSA1LCAvKiBib3RoIGZpZWxkcyBzZXF1ZW50aWFsIGludG8gb25lCisJCQkJCSBidWZmZXIsIHRvcC1ib3R0b20gb3JkZXIgKi8KKwlWNEwyX0ZJRUxEX1NFUV9CVCAgICAgICAgPSA2LCAvKiBzYW1lIGFzIGFib3ZlICsgYm90dG9tLXRvcCBvcmRlciAqLworCVY0TDJfRklFTERfQUxURVJOQVRFICAgICA9IDcsIC8qIGJvdGggZmllbGRzIGFsdGVybmF0aW5nIGludG8KKwkJCQkJIHNlcGFyYXRlIGJ1ZmZlcnMgKi8KKwlWNEwyX0ZJRUxEX0lOVEVSTEFDRURfVEIgPSA4LCAvKiBib3RoIGZpZWxkcyBpbnRlcmxhY2VkLCB0b3AgZmllbGQKKwkJCQkJIGZpcnN0IGFuZCB0aGUgdG9wIGZpZWxkIGlzCisJCQkJCSB0cmFuc21pdHRlZCBmaXJzdCAqLworCVY0TDJfRklFTERfSU5URVJMQUNFRF9CVCA9IDksIC8qIGJvdGggZmllbGRzIGludGVybGFjZWQsIHRvcCBmaWVsZAorCQkJCQkgZmlyc3QgYW5kIHRoZSBib3R0b20gZmllbGQgaXMKKwkJCQkJIHRyYW5zbWl0dGVkIGZpcnN0ICovCiB9OwogI2RlZmluZSBWNEwyX0ZJRUxEX0hBU19UT1AoZmllbGQpCVwKIAkoKGZpZWxkKSA9PSBWNEwyX0ZJRUxEX1RPUCAJfHxcCiAJIChmaWVsZCkgPT0gVjRMMl9GSUVMRF9JTlRFUkxBQ0VEIHx8XAorCSAoZmllbGQpID09IFY0TDJfRklFTERfSU5URVJMQUNFRF9UQiB8fFwKKwkgKGZpZWxkKSA9PSBWNEwyX0ZJRUxEX0lOVEVSTEFDRURfQlQgfHxcCiAJIChmaWVsZCkgPT0gVjRMMl9GSUVMRF9TRVFfVEIJfHxcCiAJIChmaWVsZCkgPT0gVjRMMl9GSUVMRF9TRVFfQlQpCiAjZGVmaW5lIFY0TDJfRklFTERfSEFTX0JPVFRPTShmaWVsZCkJXAogCSgoZmllbGQpID09IFY0TDJfRklFTERfQk9UVE9NIAl8fFwKIAkgKGZpZWxkKSA9PSBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQgfHxcCisJIChmaWVsZCkgPT0gVjRMMl9GSUVMRF9JTlRFUkxBQ0VEX1RCIHx8XAorCSAoZmllbGQpID09IFY0TDJfRklFTERfSU5URVJMQUNFRF9CVCB8fFwKIAkgKGZpZWxkKSA9PSBWNEwyX0ZJRUxEX1NFUV9UQgl8fFwKIAkgKGZpZWxkKSA9PSBWNEwyX0ZJRUxEX1NFUV9CVCkKICNkZWZpbmUgVjRMMl9GSUVMRF9IQVNfQk9USChmaWVsZCkJXAogCSgoZmllbGQpID09IFY0TDJfRklFTERfSU5URVJMQUNFRCB8fFwKLQkgKGZpZWxkKSA9PSBWNEwyX0ZJRUxEX1NFUV9UQgl8fFwKKwkgKGZpZWxkKSA9PSBWNEwyX0ZJRUxEX0lOVEVSTEFDRURfVEIgfHxcCisJIChmaWVsZCkgPT0gVjRMMl9GSUVMRF9JTlRFUkxBQ0VEX0JUIHx8XAorCSAoZmllbGQpID09IFY0TDJfRklFTERfU0VRX1RCIHx8XAogCSAoZmllbGQpID09IFY0TDJfRklFTERfU0VRX0JUKQogCiBlbnVtIHY0bDJfYnVmX3R5cGUgewotCVY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSAgICAgID0gMSwKLQlWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVCAgICAgICA9IDIsCi0JVjRMMl9CVUZfVFlQRV9WSURFT19PVkVSTEFZICAgICAgPSAzLAotCVY0TDJfQlVGX1RZUEVfVkJJX0NBUFRVUkUgICAgICAgID0gNCwKLQlWNEwyX0JVRl9UWVBFX1ZCSV9PVVRQVVQgICAgICAgICA9IDUsCi0JVjRMMl9CVUZfVFlQRV9TTElDRURfVkJJX0NBUFRVUkUgPSA2LAotCVY0TDJfQlVGX1RZUEVfU0xJQ0VEX1ZCSV9PVVRQVVQgID0gNywKLQlWNEwyX0JVRl9UWVBFX1BSSVZBVEUgICAgICAgICAgICA9IDB4ODAsCisJVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFICAgICAgICA9IDEsCisJVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQgICAgICAgICA9IDIsCisJVjRMMl9CVUZfVFlQRV9WSURFT19PVkVSTEFZICAgICAgICA9IDMsCisJVjRMMl9CVUZfVFlQRV9WQklfQ0FQVFVSRSAgICAgICAgICA9IDQsCisJVjRMMl9CVUZfVFlQRV9WQklfT1VUUFVUICAgICAgICAgICA9IDUsCisJVjRMMl9CVUZfVFlQRV9TTElDRURfVkJJX0NBUFRVUkUgICA9IDYsCisJVjRMMl9CVUZfVFlQRV9TTElDRURfVkJJX09VVFBVVCAgICA9IDcsCisjaWYgMQorCS8qIEV4cGVyaW1lbnRhbCAqLworCVY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX09WRVJMQVkgPSA4LAorI2VuZGlmCisJVjRMMl9CVUZfVFlQRV9QUklWQVRFICAgICAgICAgICAgICA9IDB4ODAsCiB9OwogCiBlbnVtIHY0bDJfY3RybF90eXBlIHsKQEAgLTIyNyw2ICsyNDMsOCBAQAogI2RlZmluZSBWNEwyX0NBUF9TTElDRURfVkJJX0NBUFRVUkUJMHgwMDAwMDA0MCAgLyogSXMgYSBzbGljZWQgVkJJIGNhcHR1cmUgZGV2aWNlICovCiAjZGVmaW5lIFY0TDJfQ0FQX1NMSUNFRF9WQklfT1VUUFVUCTB4MDAwMDAwODAgIC8qIElzIGEgc2xpY2VkIFZCSSBvdXRwdXQgZGV2aWNlICovCiAjZGVmaW5lIFY0TDJfQ0FQX1JEU19DQVBUVVJFCQkweDAwMDAwMTAwICAvKiBSRFMgZGF0YSBjYXB0dXJlICovCisjZGVmaW5lIFY0TDJfQ0FQX1ZJREVPX09VVFBVVF9QT1MgICAgICAgMHgwMDAwMDIwMCAgLyogVmlkZW8gb3V0cHV0IGNhbiBoYXZlIHgseSBjb29yZHMgKi8KKyNkZWZpbmUgVjRMMl9DQVBfVklERU9fT1VUUFVUX09WRVJMQVkJMHgwMDAwMDQwMCAgLyogQ2FuIGRvIHZpZGVvIG91dHB1dCBvdmVybGF5ICovCiAKICNkZWZpbmUgVjRMMl9DQVBfVFVORVIJCQkweDAwMDEwMDAwICAvKiBoYXMgYSB0dW5lciAqLwogI2RlZmluZSBWNEwyX0NBUF9BVURJTwkJCTB4MDAwMjAwMDAgIC8qIGhhcyBhdWRpbyBzdXBwb3J0ICovCkBAIC0yNDksNiArMjY3LDggQEAKIAlfX3UzMiAgICAgICAgICAJCXNpemVpbWFnZTsKIAllbnVtIHY0bDJfY29sb3JzcGFjZQljb2xvcnNwYWNlOwogCV9fdTMyCQkJcHJpdjsJCS8qIHByaXZhdGUgZGF0YSwgZGVwZW5kcyBvbiBwaXhlbGZvcm1hdCAqLworCV9fdTMyIAkJCWxlZnQ7CS8qIG9ubHkgdmFsaWQgaWYgVjRMMl9DQVBfVklERU9fT1VUUFVUX1BPUyBpcyBzZXQgKi8KKwlfX3UzMiAJCQl0b3A7CS8qIG9ubHkgdmFsaWQgaWYgVjRMMl9DQVBfVklERU9fT1VUUFVUX1BPUyBpcyBzZXQgKi8KIH07CiAKIC8qICAgICAgUGl4ZWwgZm9ybWF0ICAgICAgICAgRk9VUkNDICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGggIERlc2NyaXB0aW9uICAqLwpAQCAtNTk2LDEwICs2MTYsMTQgQEAKICNkZWZpbmUgVjRMMl9GQlVGX0NBUF9DSFJPTUFLRVkJCTB4MDAwMgogI2RlZmluZSBWNEwyX0ZCVUZfQ0FQX0xJU1RfQ0xJUFBJTkcgICAgIDB4MDAwNAogI2RlZmluZSBWNEwyX0ZCVUZfQ0FQX0JJVE1BUF9DTElQUElORwkweDAwMDgKKyNkZWZpbmUgVjRMMl9GQlVGX0NBUF9MT0NBTF9BTFBIQQkweDAwMTAKKyNkZWZpbmUgVjRMMl9GQlVGX0NBUF9HTE9CQUxfQUxQSEEJMHgwMDIwCiAvKiAgRmxhZ3MgZm9yIHRoZSAnZmxhZ3MnIGZpZWxkLiAqLwogI2RlZmluZSBWNEwyX0ZCVUZfRkxBR19QUklNQVJZCQkweDAwMDEKICNkZWZpbmUgVjRMMl9GQlVGX0ZMQUdfT1ZFUkxBWQkJMHgwMDAyCiAjZGVmaW5lIFY0TDJfRkJVRl9GTEFHX0NIUk9NQUtFWQkweDAwMDQKKyNkZWZpbmUgVjRMMl9GQlVGX0ZMQUdfTE9DQUxfQUxQSEEJMHgwMDA4CisjZGVmaW5lIFY0TDJfRkJVRl9GTEFHX0dMT0JBTF9BTFBIQQkweDAwMTAKIAogc3RydWN0IHY0bDJfY2xpcAogewpAQCAtNjE1LDYgKzYzOSw3IEBACiAJc3RydWN0IHY0bDJfY2xpcAlfX3VzZXIgKmNsaXBzOwogCV9fdTMyCQkJY2xpcGNvdW50OwogCXZvaWQJCQlfX3VzZXIgKmJpdG1hcDsKKwlfX3U4ICAgICAgICAgICAgICAgICAgICBnbG9iYWxfYWxwaGE7CiB9OwogCiAvKgpAQCAtMTAzNyw2ICsxMDYyLDcgQEAKIAlWNEwyX01QRUdfQVVESU9fQ1JDX05PTkUgID0gMCwKIAlWNEwyX01QRUdfQVVESU9fQ1JDX0NSQzE2ID0gMSwKIH07CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQVVESU9fTVVURSAJCShWNEwyX0NJRF9NUEVHX0JBU0UrMTA5KQogCiAvKiAgTVBFRyB2aWRlbyAqLwogI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0VOQ09ESU5HIAkJKFY0TDJfQ0lEX01QRUdfQkFTRSsyMDApCkBAIC0xMDYzLDYgKzEwODksOCBAQAogI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0JJVFJBVEUgCQkoVjRMMl9DSURfTVBFR19CQVNFKzIwNykKICNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19CSVRSQVRFX1BFQUsgCShWNEwyX0NJRF9NUEVHX0JBU0UrMjA4KQogI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX1RFTVBPUkFMX0RFQ0lNQVRJT04gKFY0TDJfQ0lEX01QRUdfQkFTRSsyMDkpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fTVVURSAJCShWNEwyX0NJRF9NUEVHX0JBU0UrMjEwKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX01VVEVfWVVWIAkJKFY0TDJfQ0lEX01QRUdfQkFTRSsyMTEpCiAKIC8qICBNUEVHLWNsYXNzIGNvbnRyb2wgSURzIHNwZWNpZmljIHRvIHRoZSBDWDI1ODR4IGRyaXZlciBhcyBkZWZpbmVkIGJ5IFY0TDIgKi8KICNkZWZpbmUgVjRMMl9DSURfTVBFR19DWDIzNDFYX0JBU0UgCQkJCShWNEwyX0NUUkxfQ0xBU1NfTVBFRyB8IDB4MTAwMCkKQEAgLTExMDMsNiArMTEzMSw3IEBACiAjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19MVU1BX01FRElBTl9GSUxURVJfVE9QIAkoVjRMMl9DSURfTVBFR19DWDIzNDFYX0JBU0UrOCkKICNkZWZpbmUgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX0NIUk9NQV9NRURJQU5fRklMVEVSX0JPVFRPTQkoVjRMMl9DSURfTVBFR19DWDIzNDFYX0JBU0UrOSkKICNkZWZpbmUgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX0NIUk9NQV9NRURJQU5fRklMVEVSX1RPUCAJKFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9CQVNFKzEwKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfU1RSRUFNX0lOU0VSVF9OQVZfUEFDS0VUUyAJKFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9CQVNFKzExKQogCiAvKgogICoJVCBVIE4gSSBOIEcKQEAgLTEzNjksNiArMTM5OCwxNCBAQAogCV9fdTY0IHZhbDsKIH07CiAKKy8qIFZJRElPQ19HX0NISVBfSURFTlQgKi8KK3N0cnVjdCB2NGwyX2NoaXBfaWRlbnQgeworCV9fdTMyIG1hdGNoX3R5cGU7ICAvKiBNYXRjaCB0eXBlICovCisJX191MzIgbWF0Y2hfY2hpcDsgIC8qIE1hdGNoIHRoaXMgY2hpcCwgbWVhbmluZyBkZXRlcm1pbmVkIGJ5IG1hdGNoX3R5cGUgKi8KKwlfX3UzMiBpZGVudDsgICAgICAgLyogY2hpcCBpZGVudGlmaWVyIGFzIHNwZWNpZmllZCBpbiA8bWVkaWEvdjRsMi1jaGlwLWlkZW50Lmg+ICovCisJX191MzIgcmV2aXNpb247ICAgIC8qIGNoaXAgcmV2aXNpb24sIGNoaXAgc3BlY2lmaWMgKi8KK307CisKIC8qCiAgKglJIE8gQyBUIEwgICBDIE8gRCBFIFMgICBGIE8gUiAgIFYgSSBEIEUgTyAgIEQgRSBWIEkgQyBFIFMKICAqCkBAIC0xNDQyLDYgKzE0NzksOCBAQAogLyogRXhwZXJpbWVudGFsLCBvbmx5IGltcGxlbWVudGVkIGlmIENPTkZJR19WSURFT19BRFZfREVCVUcgaXMgZGVmaW5lZCAqLwogI2RlZmluZQlWSURJT0NfREJHX1NfUkVHSVNURVIgCV9JT1cgICgnVicsIDc5LCBzdHJ1Y3QgdjRsMl9yZWdpc3RlcikKICNkZWZpbmUJVklESU9DX0RCR19HX1JFR0lTVEVSIAlfSU9XUiAoJ1YnLCA4MCwgc3RydWN0IHY0bDJfcmVnaXN0ZXIpCisKKyNkZWZpbmUgVklESU9DX0dfQ0hJUF9JREVOVCAgICAgX0lPV1IgKCdWJywgODEsIHN0cnVjdCB2NGwyX2NoaXBfaWRlbnQpCiAjZW5kaWYKIAogI2lmZGVmIF9fT0xEX1ZJRElPQ18KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvd2lyZWxlc3MuaCBiL2luY2x1ZGUvbGludXgvd2lyZWxlc3MuaAppbmRleCA0ODc1OWIyLi4wOTg3YWE3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3dpcmVsZXNzLmgKKysrIGIvaW5jbHVkZS9saW51eC93aXJlbGVzcy5oCkBAIC0xODYsNyArMTg2LDcgQEAKICAqCS0gV2lyZWxlc3MgRXZlbnQgY2FwYWJpbGl0eSBpbiBzdHJ1Y3QgaXdfcmFuZ2UKICAqCS0gQWRkIHN1cHBvcnQgZm9yIHJlbGF0aXZlIFR4UG93ZXIgKHlpY2sgISkKICAqCi0gKiBWMTcgdG8gVjE4IChGcm9tIEpvdW5pIE1hbGluZW4gPGprbWFsaW5lQGNjLmh1dC5maT4pCisgKiBWMTcgdG8gVjE4IChGcm9tIEpvdW5pIE1hbGluZW4gPGpAdzEuZmk+KQogICogLS0tLS0tLS0tLQogICoJLSBBZGQgc3VwcG9ydCBmb3IgV1BBL1dQQTIKICAqCS0gQWRkIGV4dGVuZGVkIGVuY29kaW5nIGNvbmZpZ3VyYXRpb24gKFNJT0NTSVdFTkNPREVFWFQgYW5kCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3dvcmtxdWV1ZS5oIGIvaW5jbHVkZS9saW51eC93b3JrcXVldWUuaAppbmRleCAyYTdiMzhkLi5iOGFiZmM3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3dvcmtxdWV1ZS5oCisrKyBiL2luY2x1ZGUvbGludXgvd29ya3F1ZXVlLmgKQEAgLTE5MSwxNCArMTkxLDE1IEBACiAKIC8qCiAgKiBLaWxsIG9mZiBhIHBlbmRpbmcgc2NoZWR1bGVfZGVsYXllZF93b3JrKCkuICBOb3RlIHRoYXQgdGhlIHdvcmsgY2FsbGJhY2sKLSAqIGZ1bmN0aW9uIG1heSBzdGlsbCBiZSBydW5uaW5nIG9uIHJldHVybiBmcm9tIGNhbmNlbF9kZWxheWVkX3dvcmsoKS4gIFJ1bgotICogZmx1c2hfc2NoZWR1bGVkX3dvcmsoKSB0byB3YWl0IG9uIGl0LgorICogZnVuY3Rpb24gbWF5IHN0aWxsIGJlIHJ1bm5pbmcgb24gcmV0dXJuIGZyb20gY2FuY2VsX2RlbGF5ZWRfd29yaygpLCB1bmxlc3MKKyAqIGl0IHJldHVybnMgMSBhbmQgdGhlIHdvcmsgZG9lc24ndCByZS1hcm0gaXRzZWxmLiBSdW4gZmx1c2hfd29ya3F1ZXVlKCkgb3IKKyAqIGNhbmNlbF93b3JrX3N5bmMoKSB0byB3YWl0IG9uIGl0LgogICovCiBzdGF0aWMgaW5saW5lIGludCBjYW5jZWxfZGVsYXllZF93b3JrKHN0cnVjdCBkZWxheWVkX3dvcmsgKndvcmspCiB7CiAJaW50IHJldDsKIAotCXJldCA9IGRlbF90aW1lcl9zeW5jKCZ3b3JrLT50aW1lcik7CisJcmV0ID0gZGVsX3RpbWVyKCZ3b3JrLT50aW1lcik7CiAJaWYgKHJldCkKIAkJd29ya19yZWxlYXNlKCZ3b3JrLT53b3JrKTsKIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC94ZnJtLmggYi9pbmNsdWRlL2xpbnV4L3hmcm0uaAppbmRleCAxNWNhODllLi5hNWQ1M2UwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3hmcm0uaAorKysgYi9pbmNsdWRlL2xpbnV4L3hmcm0uaApAQCAtMTgxLDYgKzE4MSwxNSBAQAogCVhGUk1fTVNHX01JR1JBVEUsCiAjZGVmaW5lIFhGUk1fTVNHX01JR1JBVEUgWEZSTV9NU0dfTUlHUkFURQogCisJWEZSTV9NU0dfTkVXU0FESU5GTywKKyNkZWZpbmUgWEZSTV9NU0dfTkVXU0FESU5GTyBYRlJNX01TR19ORVdTQURJTkZPCisJWEZSTV9NU0dfR0VUU0FESU5GTywKKyNkZWZpbmUgWEZSTV9NU0dfR0VUU0FESU5GTyBYRlJNX01TR19HRVRTQURJTkZPCisKKwlYRlJNX01TR19ORVdTUERJTkZPLAorI2RlZmluZSBYRlJNX01TR19ORVdTUERJTkZPIFhGUk1fTVNHX05FV1NQRElORk8KKwlYRlJNX01TR19HRVRTUERJTkZPLAorI2RlZmluZSBYRlJNX01TR19HRVRTUERJTkZPIFhGUk1fTVNHX0dFVFNQRElORk8KIAlfX1hGUk1fTVNHX01BWAogfTsKICNkZWZpbmUgWEZSTV9NU0dfTUFYIChfX1hGUk1fTVNHX01BWCAtIDEpCkBAIC0yMzQsNiArMjQzLDE3IEBACiAjZGVmaW5lIFhGUk1fQUVfTUFYIChfX1hGUk1fQUVfTUFYIC0gMSkKIH07CiAKKy8qIFNBRCBUYWJsZSBmaWx0ZXIgZmxhZ3MgICovCitlbnVtIHhmcm1fc2FkX2Z0eXBlX3QgeworCVhGUk1fU0FEX1VOU1BFQywKKwlYRlJNX1NBRF9ITUFTSz0xLAorCVhGUk1fU0FEX0hNQVg9MiwKKwlYRlJNX1NBRF9DTlQ9NCwKKwlfX1hGUk1fU0FEX01BWAorCisjZGVmaW5lIFhGUk1fU0FEX01BWCAoX19YRlJNX1NBRF9NQVggLSAxKQorfTsKKwogc3RydWN0IHhmcm1fdXNlcnBvbGljeV90eXBlIHsKIAlfX3U4CQl0eXBlOwogCV9fdTE2CQlyZXNlcnZlZDE7CkBAIC0yNjUsNiArMjg1LDQ2IEBACiAjZGVmaW5lIFhGUk1BX01BWCAoX19YRlJNQV9NQVggLSAxKQogfTsKIAorZW51bSB4ZnJtX3NhZGF0dHJfdHlwZV90IHsKKwlYRlJNQV9TQURfVU5TUEVDLAorCVhGUk1BX1NBREhNQVNLLAorCVhGUk1BX1NBREhNQVgsCisJWEZSTUFfU0FEQ05ULAorCV9fWEZSTUFfU0FEX01BWAorCisjZGVmaW5lIFhGUk1BX1NBRF9NQVggKF9fWEZSTUFfU0FEX01BWCAtIDEpCit9OworCisvKiBTUEQgVGFibGUgZmlsdGVyIGZsYWdzICAqLworZW51bSB4ZnJtX3NwZF9mdHlwZV90IHsKKwlYRlJNX1NQRF9VTlNQRUMsCisJWEZSTV9TUERfSE1BU0s9MSwKKwlYRlJNX1NQRF9ITUFYPTIsCisJWEZSTV9TUERfSUNOVD00LAorCVhGUk1fU1BEX09DTlQ9OCwKKwlYRlJNX1NQRF9GQ05UPTE2LAorCVhGUk1fU1BEX0lTQ05UPTMyLAorCVhGUk1fU1BEX09TQ05UPTY0LAorCVhGUk1fU1BEX0ZTQ05UPTEyOCwKKwlfX1hGUk1fU1BEX01BWAorCisjZGVmaW5lIFhGUk1fU1BEX01BWCAoX19YRlJNX1NQRF9NQVggLSAxKQorfTsKK2VudW0geGZybV9zcGRhdHRyX3R5cGVfdCB7CisJWEZSTUFfU1BEX1VOU1BFQywKKwlYRlJNQV9TUERITUFTSywKKwlYRlJNQV9TUERITUFYLAorCVhGUk1BX1NQRElDTlQsCisJWEZSTUFfU1BET0NOVCwKKwlYRlJNQV9TUERGQ05ULAorCVhGUk1BX1NQRElTQ05ULAorCVhGUk1BX1NQRE9TQ05ULAorCVhGUk1BX1NQREZTQ05ULAorCV9fWEZSTUFfU1BEX01BWAorCisjZGVmaW5lIFhGUk1BX1NQRF9NQVggKF9fWEZSTUFfU1BEX01BWCAtIDEpCit9OworCiBzdHJ1Y3QgeGZybV91c2Vyc2FfaW5mbyB7CiAJc3RydWN0IHhmcm1fc2VsZWN0b3IJCXNlbDsKIAlzdHJ1Y3QgeGZybV9pZAkJCWlkOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9jeDIzNDF4LmggYi9pbmNsdWRlL21lZGlhL2N4MjM0MXguaAppbmRleCBkNzU4YTUyYy4uMzhjMTJmZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9jeDIzNDF4LmgKKysrIGIvaW5jbHVkZS9tZWRpYS9jeDIzNDF4LmgKQEAgLTQwLDYgKzQwLDcgQEAKIAkvKiBzdHJlYW0gKi8KIAllbnVtIHY0bDJfbXBlZ19zdHJlYW1fdHlwZSBzdHJlYW1fdHlwZTsKIAllbnVtIHY0bDJfbXBlZ19zdHJlYW1fdmJpX2ZtdCBzdHJlYW1fdmJpX2ZtdDsKKwl1MTYgc3RyZWFtX2luc2VydF9uYXZfcGFja2V0czsKIAogCS8qIGF1ZGlvICovCiAJZW51bSB2NGwyX21wZWdfYXVkaW9fc2FtcGxpbmdfZnJlcSBhdWRpb19zYW1wbGluZ19mcmVxOwpAQCAtNTAsNiArNTEsNyBAQAogCWVudW0gdjRsMl9tcGVnX2F1ZGlvX2VtcGhhc2lzIGF1ZGlvX2VtcGhhc2lzOwogCWVudW0gdjRsMl9tcGVnX2F1ZGlvX2NyYyBhdWRpb19jcmM7CiAJdTE2IGF1ZGlvX3Byb3BlcnRpZXM7CisJdTE2IGF1ZGlvX211dGU7CiAKIAkvKiB2aWRlbyAqLwogCWVudW0gdjRsMl9tcGVnX3ZpZGVvX2VuY29kaW5nIHZpZGVvX2VuY29kaW5nOwpAQCAtNjEsNiArNjMsOCBAQAogCXUzMiB2aWRlb19iaXRyYXRlOwogCXUzMiB2aWRlb19iaXRyYXRlX3BlYWs7CiAJdTE2IHZpZGVvX3RlbXBvcmFsX2RlY2ltYXRpb247CisJdTE2IHZpZGVvX211dGU7CisJdTMyIHZpZGVvX211dGVfeXV2OwogCiAJLyogZW5jb2RpbmcgZmlsdGVycyAqLwogCWVudW0gdjRsMl9tcGVnX2N4MjM0MXhfdmlkZW9fc3BhdGlhbF9maWx0ZXJfbW9kZSB2aWRlb19zcGF0aWFsX2ZpbHRlcl9tb2RlOwpAQCAtMTYyLDcgKzE2Niw3IEBACiAjZGVmaW5lIENYMjM0MVhfRU5DX1NFVF9QTEFDRUhPTERFUiAJCTB4ZDcKICNkZWZpbmUgQ1gyMzQxWF9FTkNfTVVURV9WSURFTyAJCQkweGQ5CiAjZGVmaW5lIENYMjM0MVhfRU5DX01VVEVfQVVESU8gCQkJMHhkYQotI2RlZmluZSBDWDIzNDFYX0VOQ19VTktOT1dOCQkJMHhkYgorI2RlZmluZSBDWDIzNDFYX0VOQ19TRVRfVkVSVF9DUk9QX0xJTkUJCTB4ZGIKICNkZWZpbmUgQ1gyMzQxWF9FTkNfTUlTQyAJCQkweGRjCiAKIC8qIE9TRCBBUEksIHNwZWNpZmljIHRvIHRoZSBjeDIzNDE1ICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL2l2dHYuaCBiL2luY2x1ZGUvbWVkaWEvaXZ0di5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxMmI0OGUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL2l2dHYuaApAQCAtMCwwICsxLDY1IEBACisvKgorICAgIFB1YmxpYyBpdnR2IEFQSSBoZWFkZXIKKyAgICBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNCAgS2V2aW4gVGhheWVyIDxudWZhbl93ZmsgYXQgeWFob28uY29tPgorICAgIENvcHlyaWdodCAoQykgMjAwNC0yMDA3ICBIYW5zIFZlcmt1aWwgPGh2ZXJrdWlsQHhzNGFsbC5ubD4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaWZuZGVmIF9MSU5VWF9JVlRWX0gKKyNkZWZpbmUgX0xJTlVYX0lWVFZfSAorCisvKiBpdnR2IGtub3dzIHNldmVyYWwgZGlzdGluY3Qgb3V0cHV0IG1vZGVzOiBNUEVHIHN0cmVhbWluZywKKyAgIFlVViBzdHJlYW1pbmcsIFlVViB1cGRhdGVzIHRocm91Z2ggdXNlciBETUEgYW5kIHRoZSBwYXNzdGhyb3VnaAorICAgbW9kZS4KKworICAgSW4gb3JkZXIgdG8gY2xlYXJseSB0ZWxsIHRoZSBkcml2ZXIgdGhhdCB3ZSBhcmUgaW4gdXNlciBETUEKKyAgIFlVViBtb2RlIHlvdSBuZWVkIHRvIGNhbGwgSVZUVl9JT0NfRE1BX0ZSQU1FIHdpdGggeV9zb3VyY2UgPT0gTlVMTAorICAgZmlyc3QgKGFsdGhyb3VnaCBpZiB5b3UgZG9uJ3QgdGhlbiB0aGUgZmlyc3QgdGltZQorICAgRE1BX0ZSQU1FIGlzIGNhbGxlZCB0aGUgbW9kZSBzd2l0Y2ggaXMgZG9uZSBhdXRvbWF0aWNhbGx5KS4KKworICAgV2hlbiB5b3UgY2xvc2UgdGhlIGZpbGUgaGFuZGxlIHRoZSB1c2VyIERNQSBtb2RlIGlzIGV4aXRlZCBhZ2Fpbi4KKworICAgV2hpbGUgaW4gb25lIG1vZGUsIHlvdSBjYW5ub3QgdXNlIGFub3RoZXIgbW9kZSAoRUJVU1kgaXMgcmV0dXJuZWQpLgorCisgICBBbGwgdGhpcyBtZWFucyB0aGF0IGlmIHlvdSB3YW50IHRvIGNoYW5nZSB0aGUgWVVWIGludGVybGFjaW5nCisgICBmb3IgdGhlIHVzZXIgRE1BIFlVViBtb2RlIHlvdSBmaXJzdCBuZWVkIHRvIGRvIGNhbGwgSVZUVl9JT0NfRE1BX0ZSQU1FCisgICB3aXRoIHlfc291cmNlID09IE5VTEwgYmVmb3JlIHlvdSBjYW4gc2V0IHRoZSBjb3JyZWN0IGZvcm1hdCB1c2luZworICAgVklESU9DX1NfRk1ULgorCisgICBFdmVudHVhbGx5IGFsbCB0aGlzIHNob3VsZCBiZSByZXBsYWNlZCB3aXRoIGEgcHJvcGVyIFY0TDIgQVBJLAorICAgYnV0IGZvciBub3cgd2UgaGF2ZSB0byBkbyBpdCB0aGlzIHdheS4gKi8KKworc3RydWN0IGl2dHZfZG1hX2ZyYW1lIHsKKwllbnVtIHY0bDJfYnVmX3R5cGUgdHlwZTsgLyogVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQgKi8KKwlfX3UzMiBwaXhlbGZvcm1hdDsJIC8qIDAgPT0gc2FtZSBhcyBkZXN0aW5hdGlvbiAqLworCXZvaWQgX191c2VyICp5X3NvdXJjZTsgICAvKiBpZiBOVUxMIGFuZCB0eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVULAorCQkJCSAgICB0aGVuIGp1c3Qgc3dpdGNoIHRvIHVzZXIgRE1BIFlVViBvdXRwdXQgbW9kZSAqLworCXZvaWQgX191c2VyICp1dl9zb3VyY2U7ICAvKiBVbnVzZWQgZm9yIFJHQiBwaXhlbGZvcm1hdHMgKi8KKwlzdHJ1Y3QgdjRsMl9yZWN0IHNyYzsKKwlzdHJ1Y3QgdjRsMl9yZWN0IGRzdDsKKwlfX3UzMiBzcmNfd2lkdGg7CisJX191MzIgc3JjX2hlaWdodDsKK307CisKKyNkZWZpbmUgSVZUVl9JT0NfRE1BX0ZSQU1FICBfSU9XICgnVicsIEJBU0VfVklESU9DX1BSSVZBVEUrMCwgc3RydWN0IGl2dHZfZG1hX2ZyYW1lKQorCisvKiBUaGVzZSBhcmUgdGhlIFZCSSB0eXBlcyBhcyB0aGV5IGFwcGVhciBpbiB0aGUgZW1iZWRkZWQgVkJJIHByaXZhdGUgcGFja2V0cy4gKi8KKyNkZWZpbmUgSVZUVl9TTElDRURfVFlQRV9URUxFVEVYVF9CICAgICAoMSkKKyNkZWZpbmUgSVZUVl9TTElDRURfVFlQRV9DQVBUSU9OXzUyNSAgICAoNCkKKyNkZWZpbmUgSVZUVl9TTElDRURfVFlQRV9XU1NfNjI1ICAgICAgICAoNSkKKyNkZWZpbmUgSVZUVl9TTElDRURfVFlQRV9WUFMgICAgICAgICAgICAoNykKKworI2VuZGlmIC8qIF9MSU5VWF9JVlRWX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvdHVuZXIuaCBiL2luY2x1ZGUvbWVkaWEvdHVuZXIuaAppbmRleCA5OWFjZjg0Li5hNDFhYzQxMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS90dW5lci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvdHVuZXIuaApAQCAtMTc3LDYgKzE3Nyw4IEBACiAJdW5zaWduZWQgc2hvcnQJYWRkcjsgCS8qIEkyQyBhZGRyZXNzICovCiAJdW5zaWduZWQgaW50CXR5cGU7ICAgLyogVHVuZXIgdHlwZSAqLwogCXVuc2lnbmVkIGludAltb2RlX21hc2s7ICAvKiBBbGxvd2VkIHR1bmVyIG1vZGVzICovCisJdW5zaWduZWQgaW50CWNvbmZpZzsgLyogY29uZmlndXJhaW9uIGZvciBtb3JlIGNvbXBsZXggdHVuZXJzICovCisJaW50ICgqdHVuZXJfY2FsbGJhY2spICh2b2lkICpkZXYsIGludCBjb21tYW5kLGludCBhcmcpOwogfTsKIAogc3RydWN0IHR1bmVyIHsKQEAgLTIxMSw2ICsyMTMsOSBAQAogCXVuc2lnbmVkIGNoYXIgdGRhODI3eF92ZXI7CiAJdW5zaWduZWQgaW50IHNnSUY7CiAKKwl1bnNpZ25lZCBpbnQgY29uZmlnOworCWludCAoKnR1bmVyX2NhbGxiYWNrKSAodm9pZCAqZGV2LCBpbnQgY29tbWFuZCxpbnQgYXJnKTsKKwogCS8qIGZ1bmN0aW9uIHB0cnMgKi8KIAl2b2lkICgqc2V0X3R2X2ZyZXEpKHN0cnVjdCBpMmNfY2xpZW50ICpjLCB1bnNpZ25lZCBpbnQgZnJlcSk7CiAJdm9pZCAoKnNldF9yYWRpb19mcmVxKShzdHJ1Y3QgaTJjX2NsaWVudCAqYywgdW5zaWduZWQgaW50IGZyZXEpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS92NGwyLWNoaXAtaWRlbnQuaCBiL2luY2x1ZGUvbWVkaWEvdjRsMi1jaGlwLWlkZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDlkMTZjNAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvdjRsMi1jaGlwLWlkZW50LmgKQEAgLTAsMCArMSwxNDkgQEAKKy8qCisgICAgdjRsMiBjaGlwIGlkZW50aWZpZXJzIGhlYWRlcgorCisgICAgVGhpcyBoZWFkZXIgcHJvdmlkZXMgYSBsaXN0IG9mIGNoaXAgaWRlbnRpZmllcnMgdGhhdCBjYW4gYmUgcmV0dXJuZWQKKyAgICB0aHJvdWdoIHRoZSBWSURJT0NfR19DSElQX0lERU5UIGlvY3RsLgorCisgICAgQ29weXJpZ2h0IChDKSAyMDA3IEhhbnMgVmVya3VpbCA8aHZlcmt1aWxAeHM0YWxsLm5sPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpZm5kZWYgVjRMMl9DSElQX0lERU5UX0hfCisjZGVmaW5lIFY0TDJfQ0hJUF9JREVOVF9IXworCisvKiBWSURJT0NfR19DSElQX0lERU5UOiBpZGVudGlmaWVzIHRoZSBhY3R1YWwgY2hpcCBpbnN0YWxsZWQgb24gdGhlIGJvYXJkICovCitlbnVtIHsKKwkvKiBnZW5lcmFsIGlkZW50czogcmVzZXJ2ZWQgcmFuZ2UgMC00OSAqLworCVY0TDJfSURFTlRfTk9ORSAgICAgID0gMCwgICAgICAgLyogTm8gY2hpcCBtYXRjaGVkICovCisJVjRMMl9JREVOVF9BTUJJR1VPVVMgPSAxLCAgICAgICAvKiBNYXRjaCB0b28gZ2VuZXJhbCwgbXVsdGlwbGUgY2hpcHMgbWF0Y2hlZCAqLworCVY0TDJfSURFTlRfVU5LTk9XTiAgID0gMiwgICAgICAgLyogQ2hpcCBmb3VuZCwgYnV0IGNhbm5vdCBpZGVudGlmeSAqLworCisJLyogbW9kdWxlIHR2YXVkaW86IHJlc2VydmVkIHJhbmdlIDUwLTk5ICovCisJVjRMMl9JREVOVF9UVkFVRElPID0gNTAsCS8qIEEgdHZhdWRpbyBjaGlwLCB1bmtub3duIHdoaWNoIGl0IGlzIGV4YWN0bHkgKi8KKworCS8qIG1vZHVsZSBzYWE3MTEwOiBqdXN0IGlkZW50IDEwMCAqLworCVY0TDJfSURFTlRfU0FBNzExMCA9IDEwMCwKKworCS8qIG1vZHVsZSBzYWE3MTExOiBqdXN0IGlkZW50IDEwMSAqLworCVY0TDJfSURFTlRfU0FBNzExMSA9IDEwMSwKKworCS8qIG1vZHVsZSBzYWE3MTE1OiByZXNlcnZlZCByYW5nZSAxMDItMTQ5ICovCisJVjRMMl9JREVOVF9TQUE3MTEzID0gMTAzLAorCVY0TDJfSURFTlRfU0FBNzExNCA9IDEwNCwKKwlWNEwyX0lERU5UX1NBQTcxMTUgPSAxMDUsCisJVjRMMl9JREVOVF9TQUE3MTE4ID0gMTA4LAorCisJLyogbW9kdWxlIHNhYTcxMjc6IHJlc2VydmVkIHJhbmdlIDE1MC0xOTkgKi8KKwlWNEwyX0lERU5UX1NBQTcxMjcgPSAxNTcsCisJVjRMMl9JREVOVF9TQUE3MTI5ID0gMTU5LAorCisJLyogbW9kdWxlIGN4MjU4NDA6IHJlc2VydmVkIHJhbmdlIDIwMC0yNDkgKi8KKwlWNEwyX0lERU5UX0NYMjU4MzYgPSAyMzYsCisJVjRMMl9JREVOVF9DWDI1ODM3ID0gMjM3LAorCVY0TDJfSURFTlRfQ1gyNTg0MCA9IDI0MCwKKwlWNEwyX0lERU5UX0NYMjU4NDEgPSAyNDEsCisJVjRMMl9JREVOVF9DWDI1ODQyID0gMjQyLAorCVY0TDJfSURFTlRfQ1gyNTg0MyA9IDI0MywKKworCS8qIE9tbmlWaXNpb24gc2Vuc29yczogcmVzZXJ2ZWQgcmFuZ2UgMjUwLTI5OSAqLworCVY0TDJfSURFTlRfT1Y3NjcwID0gMjUwLAorCisJLyogQ29uZXhhbnQgTVBFRyBlbmNvZGVyL2RlY29kZXJzOiByZXNlcnZlZCByYW5nZSA0MTAtNDIwICovCisJVjRMMl9JREVOVF9DWDIzNDE1ID0gNDE1LAorCVY0TDJfSURFTlRfQ1gyMzQxNiA9IDQxNiwKKworCS8qIG1vZHVsZSB3bTg3Mzk6IGp1c3QgaWRlbnQgODczOSAqLworCVY0TDJfSURFTlRfV004NzM5ID0gODczOSwKKworCS8qIG1vZHVsZSB3bTg3NzU6IGp1c3QgaWRlbnQgODc3NSAqLworCVY0TDJfSURFTlRfV004Nzc1ID0gODc3NSwKKworCS8qIG1vZHVsZSBjczUzMTMyYToganVzdCBpZGVudCA1MzEzMiAqLworCVY0TDJfSURFTlRfQ1M1M2wzMkEgPSA1MzEzMiwKKworCS8qIG1vZHVsZSB1cGQ2NDAzMWE6IGp1c3QgaWRlbnQgNjQwMzEgKi8KKwlWNEwyX0lERU5UX1VQRDY0MDMxQSA9IDY0MDMxLAorCisJLyogbW9kdWxlIHVwZDY0MDgzOiBqdXN0IGlkZW50IDY0MDgzICovCisJVjRMMl9JREVOVF9VUEQ2NDA4MyA9IDY0MDgzLAorCisJLyogbW9kdWxlIG1zcDM0eHg6IHJlc2VydmVkIHJhbmdlIDM0MDAwLTM0OTk5ICovCisJVjRMMl9JREVOVF9NU1AzNDAwQiA9IDM0MDAyLAorCVY0TDJfSURFTlRfTVNQMzQxMEIgPSAzNDEwMiwKKworCVY0TDJfSURFTlRfTVNQMzQwMEMgPSAzNDAwMywKKwlWNEwyX0lERU5UX01TUDM0MTBDID0gMzQxMDMsCisKKwlWNEwyX0lERU5UX01TUDM0MDBEID0gMzQwMDQsCisJVjRMMl9JREVOVF9NU1AzNDEwRCA9IDM0MTA0LAorCVY0TDJfSURFTlRfTVNQMzQwNUQgPSAzNDA1NCwKKwlWNEwyX0lERU5UX01TUDM0MTVEID0gMzQxNTQsCisJVjRMMl9JREVOVF9NU1AzNDA3RCA9IDM0MDc0LAorCVY0TDJfSURFTlRfTVNQMzQxN0QgPSAzNDE3NCwKKworCVY0TDJfSURFTlRfTVNQMzQwMEcgPSAzNDAwNywKKwlWNEwyX0lERU5UX01TUDM0MTBHID0gMzQxMDcsCisJVjRMMl9JREVOVF9NU1AzNDIwRyA9IDM0MjA3LAorCVY0TDJfSURFTlRfTVNQMzQzMEcgPSAzNDMwNywKKwlWNEwyX0lERU5UX01TUDM0NDBHID0gMzQ0MDcsCisJVjRMMl9JREVOVF9NU1AzNDUwRyA9IDM0NTA3LAorCVY0TDJfSURFTlRfTVNQMzQ2MEcgPSAzNDYwNywKKworCVY0TDJfSURFTlRfTVNQMzQwMUcgPSAzNDAxNywKKwlWNEwyX0lERU5UX01TUDM0MTFHID0gMzQxMTcsCisJVjRMMl9JREVOVF9NU1AzNDIxRyA9IDM0MjE3LAorCVY0TDJfSURFTlRfTVNQMzQzMUcgPSAzNDMxNywKKwlWNEwyX0lERU5UX01TUDM0NDFHID0gMzQ0MTcsCisJVjRMMl9JREVOVF9NU1AzNDUxRyA9IDM0NTE3LAorCVY0TDJfSURFTlRfTVNQMzQ2MUcgPSAzNDYxNywKKworCVY0TDJfSURFTlRfTVNQMzQwMkcgPSAzNDAyNywKKwlWNEwyX0lERU5UX01TUDM0MTJHID0gMzQxMjcsCisJVjRMMl9JREVOVF9NU1AzNDIyRyA9IDM0MjI3LAorCVY0TDJfSURFTlRfTVNQMzQ0MkcgPSAzNDQyNywKKwlWNEwyX0lERU5UX01TUDM0NTJHID0gMzQ1MjcsCisKKwlWNEwyX0lERU5UX01TUDM0MDVHID0gMzQwNTcsCisJVjRMMl9JREVOVF9NU1AzNDE1RyA9IDM0MTU3LAorCVY0TDJfSURFTlRfTVNQMzQyNUcgPSAzNDI1NywKKwlWNEwyX0lERU5UX01TUDM0MzVHID0gMzQzNTcsCisJVjRMMl9JREVOVF9NU1AzNDQ1RyA9IDM0NDU3LAorCVY0TDJfSURFTlRfTVNQMzQ1NUcgPSAzNDU1NywKKwlWNEwyX0lERU5UX01TUDM0NjVHID0gMzQ2NTcsCisKKwlWNEwyX0lERU5UX01TUDM0MDdHID0gMzQwNzcsCisJVjRMMl9JREVOVF9NU1AzNDE3RyA9IDM0MTc3LAorCVY0TDJfSURFTlRfTVNQMzQyN0cgPSAzNDI3NywKKwlWNEwyX0lERU5UX01TUDM0MzdHID0gMzQzNzcsCisJVjRMMl9JREVOVF9NU1AzNDQ3RyA9IDM0NDc3LAorCVY0TDJfSURFTlRfTVNQMzQ1N0cgPSAzNDU3NywKKwlWNEwyX0lERU5UX01TUDM0NjdHID0gMzQ2NzcsCisKKwkvKiBtb2R1bGUgbXNwNDR4eDogcmVzZXJ2ZWQgcmFuZ2UgNDQwMDAtNDQ5OTkgKi8KKwlWNEwyX0lERU5UX01TUDQ0MDBHID0gNDQwMDcsCisJVjRMMl9JREVOVF9NU1A0NDEwRyA9IDQ0MTA3LAorCVY0TDJfSURFTlRfTVNQNDQyMEcgPSA0NDIwNywKKwlWNEwyX0lERU5UX01TUDQ0NDBHID0gNDQ0MDcsCisJVjRMMl9JREVOVF9NU1A0NDUwRyA9IDQ0NTA3LAorCisJVjRMMl9JREVOVF9NU1A0NDA4RyA9IDQ0MDg3LAorCVY0TDJfSURFTlRfTVNQNDQxOEcgPSA0NDE4NywKKwlWNEwyX0lERU5UX01TUDQ0MjhHID0gNDQyODcsCisJVjRMMl9JREVOVF9NU1A0NDQ4RyA9IDQ0NDg3LAorCVY0TDJfSURFTlRfTVNQNDQ1OEcgPSA0NDU4NywKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS92NGwyLWNvbW1vbi5oIGIvaW5jbHVkZS9tZWRpYS92NGwyLWNvbW1vbi5oCmluZGV4IDZlYWVlYzkuLjE4MWE0MGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvdjRsMi1jb21tb24uaAorKysgYi9pbmNsdWRlL21lZGlhL3Y0bDItY29tbW9uLmgKQEAgLTk4LDYgKzk4LDggQEAKIAogc3RydWN0IGkyY19jbGllbnQ7IC8qIGZvcndhcmQgcmVmZXJlbmNlICovCiBpbnQgdjRsMl9jaGlwX21hdGNoX2kyY19jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmMsIHUzMiBpZF90eXBlLCB1MzIgY2hpcF9pZCk7CitpbnQgdjRsMl9jaGlwX2lkZW50X2kyY19jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmMsIHN0cnVjdCB2NGwyX2NoaXBfaWRlbnQgKmNoaXAsCisJCXUzMiBpZGVudCwgdTMyIHJldmlzaW9uKTsKIGludCB2NGwyX2NoaXBfbWF0Y2hfaG9zdCh1MzIgaWRfdHlwZSwgdTMyIGNoaXBfaWQpOwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0xMTQsMzkgKzExNiw2IEBACiAJdTMyIHR5cGU7CQkvKiBWQkkgc2VydmljZSB0eXBlIChWNEwyX1NMSUNFRF8qKS4gMCBpZiBubyBzZXJ2aWNlIGZvdW5kICovCiB9OwogCi0vKiBWSURJT0NfSU5UX0dfQ0hJUF9JREVOVDogaWRlbnRpZmllcyB0aGUgYWN0dWFsIGNoaXAgaW5zdGFsbGVkIG9uIHRoZSBib2FyZCAqLwotZW51bSB2NGwyX2NoaXBfaWRlbnQgewotCS8qIGdlbmVyYWwgaWRlbnRzOiByZXNlcnZlZCByYW5nZSAwLTQ5ICovCi0JVjRMMl9JREVOVF9VTktOT1dOID0gMCwKLQotCS8qIG1vZHVsZSBzYWE3MTEwOiBqdXN0IGlkZW50PSAxMDAgKi8KLQlWNEwyX0lERU5UX1NBQTcxMTAgPSAxMDAsCi0KLQkvKiBtb2R1bGUgc2FhNzExMToganVzdCBpZGVudD0gMTAxICovCi0JVjRMMl9JREVOVF9TQUE3MTExID0gMTAxLAotCi0JLyogbW9kdWxlIHNhYTcxMTU6IHJlc2VydmVkIHJhbmdlIDEwMi0xNDkgKi8KLQlWNEwyX0lERU5UX1NBQTcxMTMgPSAxMDMsCi0JVjRMMl9JREVOVF9TQUE3MTE0ID0gMTA0LAotCVY0TDJfSURFTlRfU0FBNzExNSA9IDEwNSwKLQlWNEwyX0lERU5UX1NBQTcxMTggPSAxMDgsCi0KLQkvKiBtb2R1bGUgc2FhNzEyNzogcmVzZXJ2ZWQgcmFuZ2UgMTUwLTE5OSAqLwotCVY0TDJfSURFTlRfU0FBNzEyNyA9IDE1NywKLQlWNEwyX0lERU5UX1NBQTcxMjkgPSAxNTksCi0KLQkvKiBtb2R1bGUgY3gyNTg0MDogcmVzZXJ2ZWQgcmFuZ2UgMjAwLTI0OSAqLwotCVY0TDJfSURFTlRfQ1gyNTgzNiA9IDIzNiwKLQlWNEwyX0lERU5UX0NYMjU4MzcgPSAyMzcsCi0JVjRMMl9JREVOVF9DWDI1ODQwID0gMjQwLAotCVY0TDJfSURFTlRfQ1gyNTg0MSA9IDI0MSwKLQlWNEwyX0lERU5UX0NYMjU4NDIgPSAyNDIsCi0JVjRMMl9JREVOVF9DWDI1ODQzID0gMjQzLAotCi0JLyogT21uaVZpc2lvbiBzZW5zb3JzIC0gcmFuZ2UgMjUwLTI5OSAqLwotCVY0TDJfSURFTlRfT1Y3NjcwID0gMjUwLAotfTsKLQogLyogYXVkaW8gaW9jdGxzICovCiAKIC8qIHY0bCBkZXZpY2Ugd2FzIG9wZW5lZCBpbiBSYWRpbyBtb2RlLCB0byBiZSByZXBsYWNlZCBieSBWSURJT0NfSU5UX1NfVFVORVJfTU9ERSAqLwpAQCAtMjA4LDEwICsxNzcsNiBAQAogICAgd2hldGhlciBDQyBkYXRhIGZyb20gdGhlIGZpcnN0IG9yIHNlY29uZCBmaWVsZCBzaG91bGQgYmUgb2J0YWluZWQpLiAqLwogI2RlZmluZSBWSURJT0NfSU5UX0dfVkJJX0RBVEEgCQlfSU9XUignZCcsIDEwNiwgc3RydWN0IHY0bDJfc2xpY2VkX3ZiaV9kYXRhKQogCi0vKiBSZXR1cm5zIHRoZSBjaGlwIGlkZW50aWZpZXIgb3IgVjRMMl9JREVOVF9VTktOT1dOIGlmIG5vIGlkZW50aWZpY2F0aW9uIGNhbgotICAgYmUgbWFkZS4gKi8KLSNkZWZpbmUgVklESU9DX0lOVF9HX0NISVBfSURFTlQJCV9JT1IgKCdkJywgMTA3LCBlbnVtIHY0bDJfY2hpcF9pZGVudCkKLQogLyogU2V0cyBJMlMgc3BlZWQgaW4gYnBzLiBUaGlzIGlzIHVzZWQgdG8gcHJvdmlkZSBhIHN0YW5kYXJkIHdheSB0byBzZWxlY3QgSTJTCiAgICBjbG9jayB1c2VkIGJ5IGRyaXZpbmcgZGlnaXRhbCBhdWRpbyBzdHJlYW1zIGF0IHNvbWUgYm9hcmQgZGVzaWducy4KICAgIFVzdWFsIHZhbHVlcyBmb3IgdGhlIGZyZXF1ZW5jeSBhcmUgMTAyNDAwMCBhbmQgMjA0ODAwMC4KQEAgLTI1NCw0ICsyMTksMTIgQEAKICAgIGRlZmF1bHQgdmFsdWVzLiAqLwogI2RlZmluZSBWSURJT0NfSU5UX0lOSVQJCQlfSU9XICgnZCcsIDExNCwgdTMyKQogCisvKiBTZXQgdjRsMl9zdGRfaWQgZm9yIHZpZGVvIE9VVFBVVCBkZXZpY2VzLiBUaGlzIGlzIGlnbm9yZWQgYnkKKyAgIHZpZGVvIGlucHV0IGRldmljZXMuICovCisjZGVmaW5lIFZJRElPQ19JTlRfU19TVERfT1VUUFVUCQlfSU9XICAoJ2QnLCAxMTUsIHY0bDJfc3RkX2lkKQorCisvKiBHZXQgdjRsMl9zdGRfaWQgZm9yIHZpZGVvIE9VVFBVVCBkZXZpY2VzLiBUaGlzIGlzIGlnbm9yZWQgYnkKKyAgIHZpZGVvIGlucHV0IGRldmljZXMuICovCisjZGVmaW5lIFZJRElPQ19JTlRfR19TVERfT1VUUFVUCQlfSU9XICAoJ2QnLCAxMTYsIHY0bDJfc3RkX2lkKQorCiAjZW5kaWYgLyogVjRMMl9DT01NT05fSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvdjRsMi1kZXYuaCBiL2luY2x1ZGUvbWVkaWEvdjRsMi1kZXYuaAppbmRleCAxZGQzZDMyLi5kNjI4NDdmIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3Y0bDItZGV2LmgKKysrIGIvaW5jbHVkZS9tZWRpYS92NGwyLWRldi5oCkBAIC0xMjcsNiArMTI3LDggQEAKIAkJCQkJICAgIHN0cnVjdCB2NGwyX2ZtdGRlc2MgKmYpOwogCWludCAoKnZpZGlvY19lbnVtX2ZtdF92aWRlb19vdXRwdXQpKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKIAkJCQkJICAgIHN0cnVjdCB2NGwyX2ZtdGRlc2MgKmYpOworCWludCAoKnZpZGlvY19lbnVtX2ZtdF9vdXRwdXRfb3ZlcmxheSkgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKKwkJCQkJICAgIHN0cnVjdCB2NGwyX2ZtdGRlc2MgKmYpOwogCWludCAoKnZpZGlvY19lbnVtX2ZtdF92Ymlfb3V0cHV0KSAgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKIAkJCQkJICAgIHN0cnVjdCB2NGwyX2ZtdGRlc2MgKmYpOwogCWludCAoKnZpZGlvY19lbnVtX2ZtdF90eXBlX3ByaXZhdGUpKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKQEAgLTE0NSw2ICsxNDcsOCBAQAogCQkJCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpOwogCWludCAoKnZpZGlvY19nX2ZtdF92aWRlb19vdXRwdXQpKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKIAkJCQkJc3RydWN0IHY0bDJfZm9ybWF0ICpmKTsKKwlpbnQgKCp2aWRpb2NfZ19mbXRfb3V0cHV0X292ZXJsYXkpIChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCisJCQkJCXN0cnVjdCB2NGwyX2Zvcm1hdCAqZik7CiAJaW50ICgqdmlkaW9jX2dfZm10X3R5cGVfcHJpdmF0ZSkoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAogCQkJCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpOwogCkBAIC0xNjIsNiArMTY2LDggQEAKIAkJCQkJc3RydWN0IHY0bDJfZm9ybWF0ICpmKTsKIAlpbnQgKCp2aWRpb2Nfc19mbXRfdmlkZW9fb3V0cHV0KShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCiAJCQkJCXN0cnVjdCB2NGwyX2Zvcm1hdCAqZik7CisJaW50ICgqdmlkaW9jX3NfZm10X291dHB1dF9vdmVybGF5KSAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAorCQkJCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpOwogCWludCAoKnZpZGlvY19zX2ZtdF90eXBlX3ByaXZhdGUpKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKIAkJCQkJc3RydWN0IHY0bDJfZm9ybWF0ICpmKTsKIApAQCAtMTc4LDYgKzE4NCw4IEBACiAJCQkJCSAgc3RydWN0IHY0bDJfZm9ybWF0ICpmKTsKIAlpbnQgKCp2aWRpb2NfdHJ5X2ZtdF92aWRlb19vdXRwdXQpKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKIAkJCQkJICBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpOworCWludCAoKnZpZGlvY190cnlfZm10X291dHB1dF9vdmVybGF5KShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCisJCQkJCSAgc3RydWN0IHY0bDJfZm9ybWF0ICpmKTsKIAlpbnQgKCp2aWRpb2NfdHJ5X2ZtdF90eXBlX3ByaXZhdGUpKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKIAkJCQkJICBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpOwogCkBAIC0zMDksNiArMzE3LDggQEAKIAlpbnQgKCp2aWRpb2Nfc19yZWdpc3RlcikgICAgICAgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKIAkJCQkJc3RydWN0IHY0bDJfcmVnaXN0ZXIgKnJlZyk7CiAjZW5kaWYKKwlpbnQgKCp2aWRpb2NfZ19jaGlwX2lkZW50KSAgICAgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKKwkJCQkJc3RydWN0IHY0bDJfY2hpcF9pZGVudCAqY2hpcCk7CiAKIAogI2lmZGVmIE9CU09MRVRFX09XTkVSIC8qIHRvIGJlIHJlbW92ZWQgc29vbiAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tdGQvS2J1aWxkIGIvaW5jbHVkZS9tdGQvS2J1aWxkCmluZGV4IGUwZmU5MmIuLjRkNDZiM2IgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbXRkL0tidWlsZAorKysgYi9pbmNsdWRlL210ZC9LYnVpbGQKQEAgLTMsMyArMyw1IEBACiBoZWFkZXIteSArPSBtdGQtYWJpLmgKIGhlYWRlci15ICs9IG10ZC11c2VyLmgKIGhlYWRlci15ICs9IG5mdGwtdXNlci5oCitoZWFkZXIteSArPSB1YmktaGVhZGVyLmgKK2hlYWRlci15ICs9IHViaS11c2VyLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbXRkL210ZC1hYmkuaCBiL2luY2x1ZGUvbXRkL210ZC1hYmkuaAppbmRleCA4ZTUwMWE3Li5mNzFkYWM0IDEwMDY0NAotLS0gYS9pbmNsdWRlL210ZC9tdGQtYWJpLmgKKysrIGIvaW5jbHVkZS9tdGQvbXRkLWFiaS5oCkBAIC0yNCw2ICsyNCw3IEBACiAjZGVmaW5lIE1URF9OT1JGTEFTSAkJMwogI2RlZmluZSBNVERfTkFOREZMQVNICQk0CiAjZGVmaW5lIE1URF9EQVRBRkxBU0gJCTYKKyNkZWZpbmUgTVREX1VCSVZPTFVNRQkJNwogCiAjZGVmaW5lIE1URF9XUklURUFCTEUJCTB4NDAwCS8qIERldmljZSBpcyB3cml0ZWFibGUgKi8KICNkZWZpbmUgTVREX0JJVF9XUklURUFCTEUJMHg4MDAJLyogU2luZ2xlIGJpdHMgY2FuIGJlIGZsaXBwZWQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbXRkL3ViaS1oZWFkZXIuaCBiL2luY2x1ZGUvbXRkL3ViaS1oZWFkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTQ3OWM3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tdGQvdWJpLWhlYWRlci5oCkBAIC0wLDAgKzEsMzYwIEBACisvKgorICogQ29weXJpZ2h0IChjKSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuLCAyMDA2CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZQorICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqIEF1dGhvcnM6IEFydGVtIEJpdHl1dHNraXkgKNCR0LjRgtGO0YbQutC40Lkg0JDRgNGC0ZHQvCkKKyAqICAgICAgICAgIFRob21hcyBHbGVpeG5lcgorICogICAgICAgICAgRnJhbmsgSGF2ZXJrYW1wCisgKiAgICAgICAgICBPbGl2ZXIgTG9obWFubgorICogICAgICAgICAgQW5kcmVhcyBBcm5legorICovCisKKy8qCisgKiBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgbGF5b3V0IG9mIFVCSSBoZWFkZXJzIGFuZCBhbGwgdGhlIG90aGVyIFVCSSBvbi1mbGFzaAorICogZGF0YSBzdHJ1Y3R1cmVzLiBNYXkgYmUgaW5jbHVkZWQgYnkgdXNlci1zcGFjZS4KKyAqLworCisjaWZuZGVmIF9fVUJJX0hFQURFUl9IX18KKyNkZWZpbmUgX19VQklfSEVBREVSX0hfXworCisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCisvKiBUaGUgdmVyc2lvbiBvZiBVQkkgaW1hZ2VzIHN1cHBvcnRlZCBieSB0aGlzIGltcGxlbWVudGF0aW9uICovCisjZGVmaW5lIFVCSV9WRVJTSU9OIDEKKworLyogVGhlIGhpZ2hlc3QgZXJhc2UgY291bnRlciB2YWx1ZSBzdXBwb3J0ZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvbiAqLworI2RlZmluZSBVQklfTUFYX0VSQVNFQ09VTlRFUiAweDdGRkZGRkZGCisKKy8qIFRoZSBpbml0aWFsIENSQzMyIHZhbHVlIHVzZWQgd2hlbiBjYWxjdWxhdGluZyBDUkMgY2hlY2tzdW1zICovCisjZGVmaW5lIFVCSV9DUkMzMl9JTklUIDB4RkZGRkZGRkZVCisKKy8qIEVyYXNlIGNvdW50ZXIgaGVhZGVyIG1hZ2ljIG51bWJlciAoQVNDSUkgIlVCSSMiKSAqLworI2RlZmluZSBVQklfRUNfSERSX01BR0lDICAweDU1NDI0OTIzCisvKiBWb2x1bWUgaWRlbnRpZmllciBoZWFkZXIgbWFnaWMgbnVtYmVyIChBU0NJSSAiVUJJISIpICovCisjZGVmaW5lIFVCSV9WSURfSERSX01BR0lDIDB4NTU0MjQ5MjEKKworLyoKKyAqIFZvbHVtZSB0eXBlIGNvbnN0YW50cyB1c2VkIGluIHRoZSB2b2x1bWUgaWRlbnRpZmllciBoZWFkZXIuCisgKgorICogQFVCSV9WSURfRFlOQU1JQzogZHluYW1pYyB2b2x1bWUKKyAqIEBVQklfVklEX1NUQVRJQzogc3RhdGljIHZvbHVtZQorICovCitlbnVtIHsKKwlVQklfVklEX0RZTkFNSUMgPSAxLAorCVVCSV9WSURfU1RBVElDICA9IDIKK307CisKKy8qCisgKiBDb21wYXRpYmlsaXR5IGNvbnN0YW50cyB1c2VkIGJ5IGludGVybmFsIHZvbHVtZXMuCisgKgorICogQFVCSV9DT01QQVRfREVMRVRFOiBkZWxldGUgdGhpcyBpbnRlcm5hbCB2b2x1bWUgYmVmb3JlIGFueXRoaW5nIGlzIHdyaXR0ZW4KKyAqIHRvIHRoZSBmbGFzaAorICogQFVCSV9DT01QQVRfUk86IGF0dGFjaCB0aGlzIGRldmljZSBpbiByZWFkLW9ubHkgbW9kZQorICogQFVCSV9DT01QQVRfUFJFU0VSVkU6IHByZXNlcnZlIHRoaXMgaW50ZXJuYWwgdm9sdW1lIC0gZG8gbm90IHRvdWNoIGl0cworICogcGh5c2ljYWwgZXJhc2VibG9ja3MsIGRvbid0IGFsbG93IHRoZSB3ZWFyLWxldmVsaW5nIHVuaXQgdG8gbW92ZSB0aGVtCisgKiBAVUJJX0NPTVBBVF9SRUpFQ1Q6IHJlamVjdCB0aGlzIFVCSSBpbWFnZQorICovCitlbnVtIHsKKwlVQklfQ09NUEFUX0RFTEVURSAgID0gMSwKKwlVQklfQ09NUEFUX1JPICAgICAgID0gMiwKKwlVQklfQ09NUEFUX1BSRVNFUlZFID0gNCwKKwlVQklfQ09NUEFUX1JFSkVDVCAgID0gNQorfTsKKworLyoKKyAqIHViaTE2X3QvdWJpMzJfdC91Ymk2NF90IC0gMTYsIDMyLCBhbmQgNjQtYml0IGludGVnZXJzIHVzZWQgaW4gVUJJIG9uLWZsYXNoCisgKiBkYXRhIHN0cnVjdHVyZXMuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50MTZfdCBpbnQxNjsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIHViaTE2X3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50MzJfdCBpbnQzMjsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIHViaTMyX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50NjRfdCBpbnQ2NDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIHViaTY0X3Q7CisKKy8qCisgKiBJbiB0aGlzIGltcGxlbWVudGF0aW9uIG9mIFVCSSB1c2VzIHRoZSBiaWctZW5kaWFuIGZvcm1hdCBmb3Igb24tZmxhc2gKKyAqIGludGVnZXJzLiBUaGUgYmVsb3cgYXJlIHRoZSBjb3JyZXNwb25kaW5nIGNvbnZlcnNpb24gbWFjcm9zLgorICovCisjZGVmaW5lIGNwdV90b191YmkxNih4KSAoKHViaTE2X3Qpe19fY3B1X3RvX2JlMTYoeCl9KQorI2RlZmluZSB1YmkxNl90b19jcHUoeCkgKCh1aW50MTZfdClfX2JlMTZfdG9fY3B1KCh4KS5pbnQxNikpCisKKyNkZWZpbmUgY3B1X3RvX3ViaTMyKHgpICgodWJpMzJfdCl7X19jcHVfdG9fYmUzMih4KX0pCisjZGVmaW5lIHViaTMyX3RvX2NwdSh4KSAoKHVpbnQzMl90KV9fYmUzMl90b19jcHUoKHgpLmludDMyKSkKKworI2RlZmluZSBjcHVfdG9fdWJpNjQoeCkgKCh1Ymk2NF90KXtfX2NwdV90b19iZTY0KHgpfSkKKyNkZWZpbmUgdWJpNjRfdG9fY3B1KHgpICgodWludDY0X3QpX19iZTY0X3RvX2NwdSgoeCkuaW50NjQpKQorCisvKiBTaXplcyBvZiBVQkkgaGVhZGVycyAqLworI2RlZmluZSBVQklfRUNfSERSX1NJWkUgIHNpemVvZihzdHJ1Y3QgdWJpX2VjX2hkcikKKyNkZWZpbmUgVUJJX1ZJRF9IRFJfU0laRSBzaXplb2Yoc3RydWN0IHViaV92aWRfaGRyKQorCisvKiBTaXplcyBvZiBVQkkgaGVhZGVycyB3aXRob3V0IHRoZSBlbmRpbmcgQ1JDICovCisjZGVmaW5lIFVCSV9FQ19IRFJfU0laRV9DUkMgIChVQklfRUNfSERSX1NJWkUgIC0gc2l6ZW9mKHViaTMyX3QpKQorI2RlZmluZSBVQklfVklEX0hEUl9TSVpFX0NSQyAoVUJJX1ZJRF9IRFJfU0laRSAtIHNpemVvZih1YmkzMl90KSkKKworLyoqCisgKiBzdHJ1Y3QgdWJpX2VjX2hkciAtIFVCSSBlcmFzZSBjb3VudGVyIGhlYWRlci4KKyAqIEBtYWdpYzogZXJhc2UgY291bnRlciBoZWFkZXIgbWFnaWMgbnVtYmVyICglVUJJX0VDX0hEUl9NQUdJQykKKyAqIEB2ZXJzaW9uOiB2ZXJzaW9uIG9mIFVCSSBpbXBsZW1lbnRhdGlvbiB3aGljaCBpcyBzdXBwb3NlZCB0byBhY2NlcHQgdGhpcworICogVUJJIGltYWdlCisgKiBAcGFkZGluZzE6IHJlc2VydmVkIGZvciBmdXR1cmUsIHplcm9lcworICogQGVjOiB0aGUgZXJhc2UgY291bnRlcgorICogQHZpZF9oZHJfb2Zmc2V0OiB3aGVyZSB0aGUgVklEIGhlYWRlciBzdGFydHMKKyAqIEBkYXRhX29mZnNldDogd2hlcmUgdGhlIHVzZXIgZGF0YSBzdGFydAorICogQHBhZGRpbmcyOiByZXNlcnZlZCBmb3IgZnV0dXJlLCB6ZXJvZXMKKyAqIEBoZHJfY3JjOiBlcmFzZSBjb3VudGVyIGhlYWRlciBDUkMgY2hlY2tzdW0KKyAqCisgKiBUaGUgZXJhc2UgY291bnRlciBoZWFkZXIgdGFrZXMgNjQgYnl0ZXMgYW5kIGhhcyBhIHBsZW50eSBvZiB1bnVzZWQgc3BhY2UgZm9yCisgKiBmdXR1cmUgdXNhZ2UuIFRoZSB1bnVzZWQgZmllbGRzIGFyZSB6ZXJvZWQuIFRoZSBAdmVyc2lvbiBmaWVsZCBpcyB1c2VkIHRvCisgKiBpbmRpY2F0ZSB0aGUgdmVyc2lvbiBvZiBVQkkgaW1wbGVtZW50YXRpb24gd2hpY2ggaXMgc3VwcG9zZWQgdG8gYmUgYWJsZSB0bworICogd29yayB3aXRoIHRoaXMgVUJJIGltYWdlLiBJZiBAdmVyc2lvbiBpcyBncmVhdGVyIHRoZW4gdGhlIGN1cnJlbnQgVUJJCisgKiB2ZXJzaW9uLCB0aGUgaW1hZ2UgaXMgcmVqZWN0ZWQuIFRoaXMgbWF5IGJlIHVzZWZ1bCBpbiBmdXR1cmUgaWYgc29tZXRoaW5nCisgKiBpcyBjaGFuZ2VkIHJhZGljYWxseS4gVGhpcyBmaWVsZCBpcyBkdXBsaWNhdGVkIGluIHRoZSB2b2x1bWUgaWRlbnRpZmllcgorICogaGVhZGVyLgorICoKKyAqIFRoZSBAdmlkX2hkcl9vZmZzZXQgYW5kIEBkYXRhX29mZnNldCBmaWVsZHMgY29udGFpbiB0aGUgb2Zmc2V0IG9mIHRoZSB0aGUKKyAqIHZvbHVtZSBpZGVudGlmaWVyIGhlYWRlciBhbmQgdXNlciBkYXRhLCByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZQorICogcGh5c2ljYWwgZXJhc2VibG9jay4gVGhlc2UgdmFsdWVzIGhhdmUgdG8gYmUgdGhlIHNhbWUgZm9yIGFsbCBwaHlzaWNhbAorICogZXJhc2VibG9ja3MuCisgKi8KK3N0cnVjdCB1YmlfZWNfaGRyIHsKKwl1YmkzMl90IG1hZ2ljOworCXVpbnQ4X3QgdmVyc2lvbjsKKwl1aW50OF90IHBhZGRpbmcxWzNdOworCXViaTY0X3QgZWM7IC8qIFdhcm5pbmc6IHRoZSBjdXJyZW50IGxpbWl0IGlzIDMxLWJpdCBhbnl3YXkhICovCisJdWJpMzJfdCB2aWRfaGRyX29mZnNldDsKKwl1YmkzMl90IGRhdGFfb2Zmc2V0OworCXVpbnQ4X3QgcGFkZGluZzJbMzZdOworCXViaTMyX3QgaGRyX2NyYzsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKioKKyAqIHN0cnVjdCB1YmlfdmlkX2hkciAtIG9uLWZsYXNoIFVCSSB2b2x1bWUgaWRlbnRpZmllciBoZWFkZXIuCisgKiBAbWFnaWM6IHZvbHVtZSBpZGVudGlmaWVyIGhlYWRlciBtYWdpYyBudW1iZXIgKCVVQklfVklEX0hEUl9NQUdJQykKKyAqIEB2ZXJzaW9uOiBVQkkgaW1wbGVtZW50YXRpb24gdmVyc2lvbiB3aGljaCBpcyBzdXBwb3NlZCB0byBhY2NlcHQgdGhpcyBVQkkKKyAqIGltYWdlICglVUJJX1ZFUlNJT04pCisgKiBAdm9sX3R5cGU6IHZvbHVtZSB0eXBlICglVUJJX1ZJRF9EWU5BTUlDIG9yICVVQklfVklEX1NUQVRJQykKKyAqIEBjb3B5X2ZsYWc6IGlmIHRoaXMgbG9naWNhbCBlcmFzZWJsb2NrIHdhcyBjb3BpZWQgZnJvbSBhbm90aGVyIHBoeXNpY2FsCisgKiBlcmFzZWJsb2NrIChmb3Igd2Vhci1sZXZlbGluZyByZWFzb25zKQorICogQGNvbXBhdDogY29tcGF0aWJpbGl0eSBvZiB0aGlzIHZvbHVtZSAoJTAsICVVQklfQ09NUEFUX0RFTEVURSwKKyAqICVVQklfQ09NUEFUX0lHTk9SRSwgJVVCSV9DT01QQVRfUFJFU0VSVkUsIG9yICVVQklfQ09NUEFUX1JFSkVDVCkKKyAqIEB2b2xfaWQ6IElEIG9mIHRoaXMgdm9sdW1lCisgKiBAbG51bTogbG9naWNhbCBlcmFzZWJsb2NrIG51bWJlcgorICogQGxlYl92ZXI6IHZlcnNpb24gb2YgdGhpcyBsb2dpY2FsIGVyYXNlYmxvY2sgKElNUE9SVEFOVDogb2Jzb2xldGUsIHRvIGJlCisgKiByZW1vdmVkLCBrZXB0IG9ubHkgZm9yIG5vdCBicmVha2luZyBvbGRlciBVQkkgdXNlcnMpCisgKiBAZGF0YV9zaXplOiBob3cgbWFueSBieXRlcyBvZiBkYXRhIHRoaXMgbG9naWNhbCBlcmFzZWJsb2NrIGNvbnRhaW5zCisgKiBAdXNlZF9lYnM6IHRvdGFsIG51bWJlciBvZiB1c2VkIGxvZ2ljYWwgZXJhc2VibG9ja3MgaW4gdGhpcyB2b2x1bWUKKyAqIEBkYXRhX3BhZDogaG93IG1hbnkgYnl0ZXMgYXQgdGhlIGVuZCBvZiB0aGlzIHBoeXNpY2FsIGVyYXNlYmxvY2sgYXJlIG5vdAorICogdXNlZAorICogQGRhdGFfY3JjOiBDUkMgY2hlY2tzdW0gb2YgdGhlIGRhdGEgc3RvcmVkIGluIHRoaXMgbG9naWNhbCBlcmFzZWJsb2NrCisgKiBAcGFkZGluZzE6IHJlc2VydmVkIGZvciBmdXR1cmUsIHplcm9lcworICogQHNxbnVtOiBzZXF1ZW5jZSBudW1iZXIKKyAqIEBwYWRkaW5nMjogcmVzZXJ2ZWQgZm9yIGZ1dHVyZSwgemVyb2VzCisgKiBAaGRyX2NyYzogdm9sdW1lIGlkZW50aWZpZXIgaGVhZGVyIENSQyBjaGVja3N1bQorICoKKyAqIFRoZSBAc3FudW0gaXMgdGhlIHZhbHVlIG9mIHRoZSBnbG9iYWwgc2VxdWVuY2UgY291bnRlciBhdCB0aGUgdGltZSB3aGVuIHRoaXMKKyAqIFZJRCBoZWFkZXIgd2FzIGNyZWF0ZWQuIFRoZSBnbG9iYWwgc2VxdWVuY2UgY291bnRlciBpcyBpbmNyZW1lbnRlZCBlYWNoIHRpbWUKKyAqIFVCSSB3cml0ZXMgYSBuZXcgVklEIGhlYWRlciB0byB0aGUgZmxhc2gsIGkuZS4gd2hlbiBpdCBtYXBzIGEgbG9naWNhbAorICogZXJhc2VibG9jayB0byBhIG5ldyBwaHlzaWNhbCBlcmFzZWJsb2NrLiBUaGUgZ2xvYmFsIHNlcXVlbmNlIGNvdW50ZXIgaXMgYW4KKyAqIHVuc2lnbmVkIDY0LWJpdCBpbnRlZ2VyIGFuZCB3ZSBhc3N1bWUgaXQgbmV2ZXIgb3ZlcmZsb3dzLiBUaGUgQHNxbnVtCisgKiAoc2VxdWVuY2UgbnVtYmVyKSBpcyB1c2VkIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gb2xkZXIgYW5kIG5ld2VyIHZlcnNpb25zIG9mCisgKiBsb2dpY2FsIGVyYXNlYmxvY2tzLgorICoKKyAqIFRoZXJlIGFyZSAyIHNpdHVhdGlvbnMgd2hlbiB0aGVyZSBtYXkgYmUgbW9yZSB0aGVuIG9uZSBwaHlzaWNhbCBlcmFzZWJsb2NrCisgKiBjb3JyZXNwb25kaW5nIHRvIHRoZSBzYW1lIGxvZ2ljYWwgZXJhc2VibG9jaywgaS5lLiwgaGF2aW5nIHRoZSBzYW1lIEB2b2xfaWQKKyAqIGFuZCBAbG51bSB2YWx1ZXMgaW4gdGhlIHZvbHVtZSBpZGVudGlmaWVyIGhlYWRlci4gU3VwcG9zZSB3ZSBoYXZlIGEgbG9naWNhbAorICogZXJhc2VibG9jayBMIGFuZCBpdCBpcyBtYXBwZWQgdG8gdGhlIHBoeXNpY2FsIGVyYXNlYmxvY2sgUC4KKyAqCisgKiAxLiBCZWNhdXNlIFVCSSBtYXkgZXJhc2UgcGh5c2ljYWwgZXJhc2VibG9ja3MgYXN5bmNocm9ub3VzbHksIHRoZSBmb2xsb3dpbmcKKyAqIHNpdHVhdGlvbiBpcyBwb3NzaWJsZTogTCBpcyBhc3luY2hyb25vdXNseSBlcmFzZWQsIHNvIFAgaXMgc2NoZWR1bGVkIGZvcgorICogZXJhc3VyZSwgdGhlbiBMIGlzIHdyaXR0ZW4gdG8saS5lLiBtYXBwZWQgdG8gYW5vdGhlciBwaHlzaWNhbCBlcmFzZWJsb2NrIFAxLAorICogc28gUDEgaXMgd3JpdHRlbiB0bywgdGhlbiBhbiB1bmNsZWFuIHJlYm9vdCBoYXBwZW5zLiBSZXN1bHQgLSB0aGVyZSBhcmUgMgorICogcGh5c2ljYWwgZXJhc2VibG9ja3MgUCBhbmQgUDEgY29ycmVzcG9uZGluZyB0byB0aGUgc2FtZSBsb2dpY2FsIGVyYXNlYmxvY2sKKyAqIEwuIEJ1dCBQMSBoYXMgZ3JlYXRlciBzZXF1ZW5jZSBudW1iZXIsIHNvIFVCSSBwaWNrcyBQMSB3aGVuIGl0IGF0dGFjaGVzIHRoZQorICogZmxhc2guCisgKgorICogMi4gRnJvbSB0aW1lIHRvIHRpbWUgVUJJIG1vdmVzIGxvZ2ljYWwgZXJhc2VibG9ja3MgdG8gb3RoZXIgcGh5c2ljYWwKKyAqIGVyYXNlYmxvY2tzIGZvciB3ZWFyLWxldmVsaW5nIHJlYXNvbnMuIElmLCBmb3IgZXhhbXBsZSwgVUJJIG1vdmVzIEwgZnJvbSBQCisgKiB0byBQMSwgYW5kIGFuIHVuY2xlYW4gcmVib290IGhhcHBlbnMgYmVmb3JlIFAgaXMgcGh5c2ljYWxseSBlcmFzZWQsIHRoZXJlCisgKiBhcmUgdHdvIHBoeXNpY2FsIGVyYXNlYmxvY2tzIFAgYW5kIFAxIGNvcnJlc3BvbmRpbmcgdG8gTCBhbmQgVUJJIGhhcyB0bworICogc2VsZWN0IG9uZSBvZiB0aGVtIHdoZW4gdGhlIGZsYXNoIGlzIGF0dGFjaGVkLiBUaGUgQHNxbnVtIGZpZWxkIHNheXMgd2hpY2gKKyAqIFBFQiBpcyB0aGUgb3JpZ2luYWwgKG9idmlvdXNseSBQIHdpbGwgaGF2ZSBsb3dlciBAc3FudW0pIGFuZCB0aGUgY29weS4gQnV0CisgKiBpdCBpcyBub3QgZW5vdWdoIHRvIHNlbGVjdCB0aGUgcGh5c2ljYWwgZXJhc2VibG9jayB3aXRoIHRoZSBoaWdoZXIgc2VxdWVuY2UKKyAqIG51bWJlciwgYmVjYXVzZSB0aGUgdW5jbGVhbiByZWJvb3QgY291bGQgaGF2ZSBoYXBwZW4gaW4gdGhlIG1pZGRsZSBvZiB0aGUKKyAqIGNvcHlpbmcgcHJvY2Vzcywgc28gdGhlIGRhdGEgaW4gUCBpcyBjb3JydXB0ZWQuIEl0IGlzIGFsc28gbm90IGVub3VnaCB0bworICoganVzdCBzZWxlY3QgdGhlIHBoeXNpY2FsIGVyYXNlYmxvY2sgd2l0aCBsb3dlciBzZXF1ZW5jZSBudW1iZXIsIGJlY2F1c2UgdGhlCisgKiBkYXRhIHRoZXJlIG1heSBiZSBvbGQgKGNvbnNpZGVyIGEgY2FzZSBpZiBtb3JlIGRhdGEgd2FzIGFkZGVkIHRvIFAxIGFmdGVyCisgKiB0aGUgY29weWluZykuIE1vcmVvdmVyLCB0aGUgdW5jbGVhbiByZWJvb3QgbWF5IGhhcHBlbiB3aGVuIHRoZSBlcmFzdXJlIG9mIFAKKyAqIHdhcyBqdXN0IHN0YXJ0ZWQsIHNvIGl0IHJlc3VsdCBpbiB1bnN0YWJsZSBQLCB3aGljaCBpcyAibW9zdGx5IiBPSywgYnV0CisgKiBzdGlsbCBoYXMgdW5zdGFibGUgYml0cy4KKyAqCisgKiBVQkkgdXNlcyB0aGUgQGNvcHlfZmxhZyBmaWVsZCB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgbG9naWNhbCBlcmFzZWJsb2NrIGlzIGEKKyAqIGNvcHkuIFVCSSBhbHNvIGNhbGN1bGF0ZXMgZGF0YSBDUkMgd2hlbiB0aGUgZGF0YSBpcyBtb3ZlZCBhbmQgc3RvcmVzIGl0IGF0CisgKiB0aGUgQGRhdGFfY3JjIGZpZWxkIG9mIHRoZSBjb3B5IChQMSkuIFNvIHdoZW4gVUJJIG5lZWRzIHRvIHBpY2sgb25lIHBoeXNpY2FsCisgKiBlcmFzZWJsb2NrIG9mIHR3byAoUCBvciBQMSksIHRoZSBAY29weV9mbGFnIG9mIHRoZSBuZXdlciBvbmUgKFAxKSBpcworICogZXhhbWluZWQuIElmIGl0IGlzIGNsZWFyZWQsIHRoZSBzaXR1YXRpb24qIGlzIHNpbXBsZSBhbmQgdGhlIG5ld2VyIG9uZSBpcworICogcGlja2VkLiBJZiBpdCBpcyBzZXQsIHRoZSBkYXRhIENSQyBvZiB0aGUgY29weSAoUDEpIGlzIGV4YW1pbmVkLiBJZiB0aGUgQ1JDCisgKiBjaGVja3N1bSBpcyBjb3JyZWN0LCB0aGlzIHBoeXNpY2FsIGVyYXNlYmxvY2sgaXMgc2VsZWN0ZWQgKFAxKS4gT3RoZXJ3aXNlCisgKiB0aGUgb2xkZXIgb25lIChQKSBpcyBzZWxlY3RlZC4KKyAqCisgKiBOb3RlLCB0aGVyZSBpcyBhbiBvYnNvbGV0ZSBAbGViX3ZlciBmaWVsZCB3aGljaCB3YXMgdXNlZCBpbnN0ZWFkIG9mIEBzcW51bQorICogaW4gdGhlIHBhc3QuIEJ1dCBpdCBpcyBub3QgdXNlZCBhbnltb3JlIGFuZCB3ZSBrZWVwIGl0IGluIG9yZGVyIHRvIGJlIGFibGUKKyAqIHRvIGRlYWwgd2l0aCBvbGQgVUJJIGltYWdlcy4gSXQgd2lsbCBiZSByZW1vdmVkIGF0IHNvbWUgcG9pbnQuCisgKgorICogVGhlcmUgYXJlIDIgc29ydHMgb2Ygdm9sdW1lcyBpbiBVQkk6IHVzZXIgdm9sdW1lcyBhbmQgaW50ZXJuYWwgdm9sdW1lcy4KKyAqIEludGVybmFsIHZvbHVtZXMgYXJlIG5vdCBzZWVuIGZyb20gb3V0c2lkZSBhbmQgYXJlIHVzZWQgZm9yIHZhcmlvdXMgaW50ZXJuYWwKKyAqIFVCSSBwdXJwb3Nlcy4gSW4gdGhpcyBpbXBsZW1lbnRhdGlvbiB0aGVyZSBpcyBvbmx5IG9uZSBpbnRlcm5hbCB2b2x1bWUgLSB0aGUKKyAqIGxheW91dCB2b2x1bWUuIEludGVybmFsIHZvbHVtZXMgYXJlIHRoZSBtYWluIG1lY2hhbmlzbSBvZiBVQkkgZXh0ZW5zaW9ucy4KKyAqIEZvciBleGFtcGxlLCBpbiBmdXR1cmUgb25lIG1heSBpbnRyb2R1Y2UgYSBqb3VybmFsIGludGVybmFsIHZvbHVtZS4gSW50ZXJuYWwKKyAqIHZvbHVtZXMgaGF2ZSB0aGVpciBvd24gcmVzZXJ2ZWQgcmFuZ2Ugb2YgSURzLgorICoKKyAqIFRoZSBAY29tcGF0IGZpZWxkIGlzIG9ubHkgdXNlZCBmb3IgaW50ZXJuYWwgdm9sdW1lcyBhbmQgY29udGFpbnMgdGhlICJkZWdyZWUKKyAqIG9mIHRoZWlyIGNvbXBhdGliaWxpdHkiLiBJdCBpcyBhbHdheXMgemVybyBmb3IgdXNlciB2b2x1bWVzLiBUaGlzIGZpZWxkCisgKiBwcm92aWRlcyBhIG1lY2hhbmlzbSB0byBpbnRyb2R1Y2UgVUJJIGV4dGVuc2lvbnMgYW5kIHRvIGJlIHN0aWxsIGNvbXBhdGlibGUKKyAqIHdpdGggb2xkZXIgVUJJIGJpbmFyaWVzLiBGb3IgZXhhbXBsZSwgaWYgc29tZW9uZSBpbnRyb2R1Y2VkIGEgam91cm5hbCBpbgorICogZnV0dXJlLCBoZSB3b3VsZCBwcm9iYWJseSB1c2UgJVVCSV9DT01QQVRfREVMRVRFIGNvbXBhdGliaWxpdHkgZm9yIHRoZQorICogam91cm5hbCB2b2x1bWUuICBBbmQgaW4gdGhpcyBjYXNlLCBvbGRlciBVQkkgYmluYXJpZXMsIHdoaWNoIGtub3cgbm90aGluZworICogYWJvdXQgdGhlIGpvdXJuYWwgdm9sdW1lLCB3b3VsZCBqdXN0IGRlbGV0ZSB0aGlzIHZvbHVtZSBhbmQgd29yayBwZXJmZWN0bHkKKyAqIGZpbmUuIFRoaXMgaXMgc2ltaWxhciB0byB3aGF0IEV4dDJmcyBkb2VzIHdoZW4gaXQgaXMgZmVkIGJ5IGFuIEV4dDNmcyBpbWFnZQorICogLSBpdCBqdXN0IGlnbm9yZXMgdGhlIEV4dDNmcyBqb3VybmFsLgorICoKKyAqIFRoZSBAZGF0YV9jcmMgZmllbGQgY29udGFpbnMgdGhlIENSQyBjaGVja3N1bSBvZiB0aGUgY29udGVudHMgb2YgdGhlIGxvZ2ljYWwKKyAqIGVyYXNlYmxvY2sgaWYgdGhpcyBpcyBhIHN0YXRpYyB2b2x1bWUuIEluIGNhc2Ugb2YgZHluYW1pYyB2b2x1bWVzLCBpdCBkb2VzCisgKiBub3QgY29udGFpbiB0aGUgQ1JDIGNoZWNrc3VtIGFzIGEgcnVsZS4gVGhlIG9ubHkgZXhjZXB0aW9uIGlzIHdoZW4gdGhlCisgKiBkYXRhIG9mIHRoZSBwaHlzaWNhbCBlcmFzZWJsb2NrIHdhcyBtb3ZlZCBieSB0aGUgd2Vhci1sZXZlbGluZyB1bml0LCB0aGVuCisgKiB0aGUgd2Vhci1sZXZlbGluZyB1bml0IGNhbGN1bGF0ZXMgdGhlIGRhdGEgQ1JDIGFuZCBzdG9yZXMgaXQgaW4gdGhlCisgKiBAZGF0YV9jcmMgZmllbGQuIEFuZCBvZiBjb3Vyc2UsIHRoZSBAY29weV9mbGFnIGlzICVpbiB0aGlzIGNhc2UuCisgKgorICogVGhlIEBkYXRhX3NpemUgZmllbGQgaXMgdXNlZCBvbmx5IGZvciBzdGF0aWMgdm9sdW1lcyBiZWNhdXNlIFVCSSBoYXMgdG8ga25vdworICogaG93IG1hbnkgYnl0ZXMgb2YgZGF0YSBhcmUgc3RvcmVkIGluIHRoaXMgZXJhc2VibG9jay4gRm9yIGR5bmFtaWMgdm9sdW1lcywKKyAqIHRoaXMgZmllbGQgdXN1YWxseSBjb250YWlucyB6ZXJvLiBUaGUgb25seSBleGNlcHRpb24gaXMgd2hlbiB0aGUgZGF0YSBvZiB0aGUKKyAqIHBoeXNpY2FsIGVyYXNlYmxvY2sgd2FzIG1vdmVkIHRvIGFub3RoZXIgcGh5c2ljYWwgZXJhc2VibG9jayBmb3IKKyAqIHdlYXItbGV2ZWxpbmcgcmVhc29ucy4gSW4gdGhpcyBjYXNlLCBVQkkgY2FsY3VsYXRlcyBDUkMgY2hlY2tzdW0gb2YgdGhlCisgKiBjb250ZW50cyBhbmQgdXNlcyBib3RoIEBkYXRhX2NyYyBhbmQgQGRhdGFfc2l6ZSBmaWVsZHMuIEluIHRoaXMgY2FzZSwgdGhlCisgKiBAZGF0YV9zaXplIGZpZWxkIGNvbnRhaW5zIGRhdGEgc2l6ZS4KKyAqCisgKiBUaGUgQHVzZWRfZWJzIGZpZWxkIGlzIHVzZWQgb25seSBmb3Igc3RhdGljIHZvbHVtZXMgYW5kIGluZGljYXRlcyBob3cgbWFueQorICogZXJhc2VibG9ja3MgdGhlIGRhdGEgb2YgdGhlIHZvbHVtZSB0YWtlcy4gRm9yIGR5bmFtaWMgdm9sdW1lcyB0aGlzIGZpZWxkIGlzCisgKiBub3QgdXNlZCBhbmQgYWx3YXlzIGNvbnRhaW5zIHplcm8uCisgKgorICogVGhlIEBkYXRhX3BhZCBpcyBjYWxjdWxhdGVkIHdoZW4gdm9sdW1lcyBhcmUgY3JlYXRlZCB1c2luZyB0aGUgYWxpZ25tZW50CisgKiBwYXJhbWV0ZXIuIFNvLCBlZmZlY3RpdmVseSwgdGhlIEBkYXRhX3BhZCBmaWVsZCByZWR1Y2VzIHRoZSBzaXplIG9mIGxvZ2ljYWwKKyAqIGVyYXNlYmxvY2tzIG9mIHRoaXMgdm9sdW1lLiBUaGlzIGlzIHZlcnkgaGFuZHkgd2hlbiBvbmUgdXNlcyBibG9jay1vcmllbnRlZAorICogc29mdHdhcmUgKHNheSwgY3JhbWZzKSBvbiB0b3Agb2YgdGhlIFVCSSB2b2x1bWUuCisgKi8KK3N0cnVjdCB1YmlfdmlkX2hkciB7CisJdWJpMzJfdCBtYWdpYzsKKwl1aW50OF90IHZlcnNpb247CisJdWludDhfdCB2b2xfdHlwZTsKKwl1aW50OF90IGNvcHlfZmxhZzsKKwl1aW50OF90IGNvbXBhdDsKKwl1YmkzMl90IHZvbF9pZDsKKwl1YmkzMl90IGxudW07CisJdWJpMzJfdCBsZWJfdmVyOyAvKiBvYnNvbGV0ZSwgdG8gYmUgcmVtb3ZlZCwgZG9uJ3QgdXNlICovCisJdWJpMzJfdCBkYXRhX3NpemU7CisJdWJpMzJfdCB1c2VkX2ViczsKKwl1YmkzMl90IGRhdGFfcGFkOworCXViaTMyX3QgZGF0YV9jcmM7CisJdWludDhfdCBwYWRkaW5nMVs0XTsKKwl1Ymk2NF90IHNxbnVtOworCXVpbnQ4X3QgcGFkZGluZzJbMTJdOworCXViaTMyX3QgaGRyX2NyYzsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBJbnRlcm5hbCBVQkkgdm9sdW1lcyBjb3VudCAqLworI2RlZmluZSBVQklfSU5UX1ZPTF9DT1VOVCAxCisKKy8qCisgKiBTdGFydGluZyBJRCBvZiBpbnRlcm5hbCB2b2x1bWVzLiBUaGVyZSBpcyByZXNlcnZlZCByb29tIGZvciA0MDk2IGludGVybmFsCisgKiB2b2x1bWVzLgorICovCisjZGVmaW5lIFVCSV9JTlRFUk5BTF9WT0xfU1RBUlQgKDB4N0ZGRkZGRkYgLSA0MDk2KQorCisvKiBUaGUgbGF5b3V0IHZvbHVtZSBjb250YWlucyB0aGUgdm9sdW1lIHRhYmxlICovCisKKyNkZWZpbmUgVUJJX0xBWU9VVF9WT0xfSUQgICAgICAgIFVCSV9JTlRFUk5BTF9WT0xfU1RBUlQKKyNkZWZpbmUgVUJJX0xBWU9VVF9WT0xVTUVfRUJTICAgIDIKKyNkZWZpbmUgVUJJX0xBWU9VVF9WT0xVTUVfTkFNRSAgICJsYXlvdXQgdm9sdW1lIgorI2RlZmluZSBVQklfTEFZT1VUX1ZPTFVNRV9DT01QQVQgVUJJX0NPTVBBVF9SRUpFQ1QKKworLyogVGhlIG1heGltdW0gbnVtYmVyIG9mIHZvbHVtZXMgcGVyIG9uZSBVQkkgZGV2aWNlICovCisjZGVmaW5lIFVCSV9NQVhfVk9MVU1FUyAxMjgKKworLyogVGhlIG1heGltdW0gdm9sdW1lIG5hbWUgbGVuZ3RoICovCisjZGVmaW5lIFVCSV9WT0xfTkFNRV9NQVggMTI3CisKKy8qIFNpemUgb2YgdGhlIHZvbHVtZSB0YWJsZSByZWNvcmQgKi8KKyNkZWZpbmUgVUJJX1ZUQkxfUkVDT1JEX1NJWkUgc2l6ZW9mKHN0cnVjdCB1YmlfdnRibF9yZWNvcmQpCisKKy8qIFNpemUgb2YgdGhlIHZvbHVtZSB0YWJsZSByZWNvcmQgd2l0aG91dCB0aGUgZW5kaW5nIENSQyAqLworI2RlZmluZSBVQklfVlRCTF9SRUNPUkRfU0laRV9DUkMgKFVCSV9WVEJMX1JFQ09SRF9TSVpFIC0gc2l6ZW9mKHViaTMyX3QpKQorCisvKioKKyAqIHN0cnVjdCB1YmlfdnRibF9yZWNvcmQgLSBhIHJlY29yZCBpbiB0aGUgdm9sdW1lIHRhYmxlLgorICogQHJlc2VydmVkX3BlYnM6IGhvdyBtYW55IHBoeXNpY2FsIGVyYXNlYmxvY2tzIGFyZSByZXNlcnZlZCBmb3IgdGhpcyB2b2x1bWUKKyAqIEBhbGlnbm1lbnQ6IHZvbHVtZSBhbGlnbm1lbnQKKyAqIEBkYXRhX3BhZDogaG93IG1hbnkgYnl0ZXMgYXJlIHVudXNlZCBhdCB0aGUgZW5kIG9mIHRoZSBlYWNoIHBoeXNpY2FsCisgKiBlcmFzZWJsb2NrIHRvIHNhdGlzZnkgdGhlIHJlcXVlc3RlZCBhbGlnbm1lbnQKKyAqIEB2b2xfdHlwZTogdm9sdW1lIHR5cGUgKCVVQklfRFlOQU1JQ19WT0xVTUUgb3IgJVVCSV9TVEFUSUNfVk9MVU1FKQorICogQHVwZF9tYXJrZXI6IGlmIHZvbHVtZSB1cGRhdGUgd2FzIHN0YXJ0ZWQgYnV0IG5vdCBmaW5pc2hlZAorICogQG5hbWVfbGVuOiB2b2x1bWUgbmFtZSBsZW5ndGgKKyAqIEBuYW1lOiB0aGUgdm9sdW1lIG5hbWUKKyAqIEBwYWRkaW5nMjogcmVzZXJ2ZWQsIHplcm9lcworICogQGNyYzogYSBDUkMzMiBjaGVja3N1bSBvZiB0aGUgcmVjb3JkCisgKgorICogVGhlIHZvbHVtZSB0YWJsZSByZWNvcmRzIGFyZSBzdG9yZWQgaW4gdGhlIHZvbHVtZSB0YWJsZSwgd2hpY2ggaXMgc3RvcmVkIGluCisgKiB0aGUgbGF5b3V0IHZvbHVtZS4gVGhlIGxheW91dCB2b2x1bWUgY29uc2lzdHMgb2YgMiBsb2dpY2FsIGVyYXNlYmxvY2ssIGVhY2gKKyAqIG9mIHdoaWNoIGNvbnRhaW5zIGEgY29weSBvZiB0aGUgdm9sdW1lIHRhYmxlIChpLmUuLCB0aGUgdm9sdW1lIHRhYmxlIGlzCisgKiBkdXBsaWNhdGVkKS4gVGhlIHZvbHVtZSB0YWJsZSBpcyBhbiBhcnJheSBvZiAmc3RydWN0IHViaV92dGJsX3JlY29yZAorICogb2JqZWN0cyBpbmRleGVkIGJ5IHRoZSB2b2x1bWUgSUQuCisgKgorICogSWYgdGhlIHNpemUgb2YgdGhlIGxvZ2ljYWwgZXJhc2VibG9jayBpcyBsYXJnZSBlbm91Z2ggdG8gZml0CisgKiAlVUJJX01BWF9WT0xVTUVTIHJlY29yZHMsIHRoZSB2b2x1bWUgdGFibGUgY29udGFpbnMgJVVCSV9NQVhfVk9MVU1FUworICogcmVjb3Jkcy4gT3RoZXJ3aXNlLCBpdCBjb250YWlucyBhcyBtYW55IHJlY29yZHMgYXMgaXQgY2FuIGZpdCAoaS5lLiwgc2l6ZSBvZgorICogbG9naWNhbCBlcmFzZWJsb2NrIGRpdmlkZWQgYnkgc2l6ZW9mKHN0cnVjdCB1YmlfdnRibF9yZWNvcmQpKS4KKyAqCisgKiBUaGUgQHVwZF9tYXJrZXIgZmxhZyBpcyB1c2VkIHRvIGltcGxlbWVudCB2b2x1bWUgdXBkYXRlLiBJdCBpcyBzZXQgdG8gJTEKKyAqIGJlZm9yZSB1cGRhdGUgYW5kIHNldCB0byAlMCBhZnRlciB0aGUgdXBkYXRlLiBTbyBpZiB0aGUgdXBkYXRlIG9wZXJhdGlvbiB3YXMKKyAqIGludGVycnVwdGVkLCBVQkkga25vd3MgdGhhdCB0aGUgdm9sdW1lIGlzIGNvcnJ1cHRlZC4KKyAqCisgKiBUaGUgQGFsaWdubWVudCBmaWVsZCBpcyBzcGVjaWZpZWQgd2hlbiB0aGUgdm9sdW1lIGlzIGNyZWF0ZWQgYW5kIGNhbm5vdCBiZQorICogbGF0ZXIgY2hhbmdlZC4gSXQgbWF5IGJlIHVzZWZ1bCwgZm9yIGV4YW1wbGUsIHdoZW4gYSBibG9jay1vcmllbnRlZCBmaWxlCisgKiBzeXN0ZW0gd29ya3Mgb24gdG9wIG9mIFVCSS4gVGhlIEBkYXRhX3BhZCBmaWVsZCBpcyBjYWxjdWxhdGVkIHVzaW5nIHRoZQorICogbG9naWNhbCBlcmFzZWJsb2NrIHNpemUgYW5kIEBhbGlnbm1lbnQuIFRoZSBhbGlnbm1lbnQgbXVzdCBiZSBtdWx0aXBsZSB0byB0aGUKKyAqIG1pbmltYWwgZmxhc2ggSS9PIHVuaXQuIElmIEBhbGlnbm1lbnQgaXMgMSwgYWxsIHRoZSBhdmFpbGFibGUgc3BhY2Ugb2YKKyAqIHRoZSBwaHlzaWNhbCBlcmFzZWJsb2NrcyBpcyB1c2VkLgorICoKKyAqIEVtcHR5IHJlY29yZHMgY29udGFpbiBhbGwgemVyb2VzIGFuZCB0aGUgQ1JDIGNoZWNrc3VtIG9mIHRob3NlIHplcm9lcy4KKyAqLworc3RydWN0IHViaV92dGJsX3JlY29yZCB7CisJdWJpMzJfdCByZXNlcnZlZF9wZWJzOworCXViaTMyX3QgYWxpZ25tZW50OworCXViaTMyX3QgZGF0YV9wYWQ7CisJdWludDhfdCB2b2xfdHlwZTsKKwl1aW50OF90IHVwZF9tYXJrZXI7CisJdWJpMTZfdCBuYW1lX2xlbjsKKwl1aW50OF90IG5hbWVbVUJJX1ZPTF9OQU1FX01BWCsxXTsKKwl1aW50OF90IHBhZGRpbmcyWzI0XTsKKwl1YmkzMl90IGNyYzsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisjZW5kaWYgLyogIV9fVUJJX0hFQURFUl9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbXRkL3ViaS11c2VyLmggYi9pbmNsdWRlL210ZC91YmktdXNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMDZkZWQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL210ZC91YmktdXNlci5oCkBAIC0wLDAgKzEsMTYxIEBACisvKgorICogQ29weXJpZ2h0IChjKSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuLCAyMDA2CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZQorICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqIEF1dGhvcjogQXJ0ZW0gQml0eXV0c2tpeSAo0JHQuNGC0Y7RhtC60LjQuSDQkNGA0YLRkdC8KQorICovCisKKyNpZm5kZWYgX19VQklfVVNFUl9IX18KKyNkZWZpbmUgX19VQklfVVNFUl9IX18KKworLyoKKyAqIFVCSSB2b2x1bWUgY3JlYXRpb24KKyAqIH5+fn5+fn5+fn5+fn5+fn5+fn4KKyAqCisgKiBVQkkgdm9sdW1lcyBhcmUgY3JlYXRlZCB2aWEgdGhlICVVQklfSU9DTUtWT0wgSU9DVEwgY29tbWFuZCBvZiBVQkkgY2hhcmFjdGVyCisgKiBkZXZpY2UuIEEgJnN0cnVjdCB1YmlfbWt2b2xfcmVxIG9iamVjdCBoYXMgdG8gYmUgcHJvcGVybHkgZmlsbGVkIGFuZCBhCisgKiBwb2ludGVyIHRvIGl0IGhhcyB0byBiZSBwYXNzZWQgdG8gdGhlIElPQ1RMLgorICoKKyAqIFVCSSB2b2x1bWUgZGVsZXRpb24KKyAqIH5+fn5+fn5+fn5+fn5+fn5+fn4KKyAqCisgKiBUbyBkZWxldGUgYSB2b2x1bWUsIHRoZSAlVUJJX0lPQ1JNVk9MIElPQ1RMIGNvbW1hbmQgb2YgdGhlIFVCSSBjaGFyYWN0ZXIKKyAqIGRldmljZSBzaG91bGQgYmUgdXNlZC4gQSBwb2ludGVyIHRvIHRoZSAzMi1iaXQgdm9sdW1lIElEIGhhc3QgdG8gYmUgcGFzc2VkCisgKiB0byB0aGUgSU9DVEwuCisgKgorICogVUJJIHZvbHVtZSByZS1zaXplCisgKiB+fn5+fn5+fn5+fn5+fn5+fn4KKyAqCisgKiBUbyByZS1zaXplIGEgdm9sdW1lLCB0aGUgJVVCSV9JT0NSU1ZPTCBJT0NUTCBjb21tYW5kIG9mIHRoZSBVQkkgY2hhcmFjdGVyCisgKiBkZXZpY2Ugc2hvdWxkIGJlIHVzZWQuIEEgJnN0cnVjdCB1YmlfcnN2b2xfcmVxIG9iamVjdCBoYXMgdG8gYmUgcHJvcGVybHkKKyAqIGZpbGxlZCBhbmQgYSBwb2ludGVyIHRvIGl0IGhhcyB0byBiZSBwYXNzZWQgdG8gdGhlIElPQ1RMLgorICoKKyAqIFVCSSB2b2x1bWUgdXBkYXRlCisgKiB+fn5+fn5+fn5+fn5+fn5+fgorICoKKyAqIFZvbHVtZSB1cGRhdGUgc2hvdWxkIGJlIGRvbmUgdmlhIHRoZSAlVUJJX0lPQ1ZPTFVQIElPQ1RMIGNvbW1hbmQgb2YgdGhlCisgKiBjb3JyZXNwb25kaW5nIFVCSSB2b2x1bWUgY2hhcmFjdGVyIGRldmljZS4gQSBwb2ludGVyIHRvIGEgNjQtYml0IHVwZGF0ZQorICogc2l6ZSBzaG91bGQgYmUgcGFzc2VkIHRvIHRoZSBJT0NUTC4gQWZ0ZXIgdGhlbiwgVUJJIGV4cGVjdHMgdXNlciB0byB3cml0ZQorICogdGhpcyBudW1iZXIgb2YgYnl0ZXMgdG8gdGhlIHZvbHVtZSBjaGFyYWN0ZXIgZGV2aWNlLiBUaGUgdXBkYXRlIGlzIGZpbmlzaGVkCisgKiB3aGVuIHRoZSBjbGFpbWVkIG51bWJlciBvZiBieXRlcyBpcyBwYXNzZWQuIFNvLCB0aGUgdm9sdW1lIHVwZGF0ZSBzZXF1ZW5jZQorICogaXMgc29tZXRoaW5nIGxpa2U6CisgKgorICogZmQgPSBvcGVuKCIvZGV2L215X3ZvbHVtZSIpOworICogaW9jdGwoZmQsIFVCSV9JT0NWT0xVUCwgJmltYWdlX3NpemUpOworICogd3JpdGUoZmQsIGJ1ZiwgaW1hZ2Vfc2l6ZSk7CisgKiBjbG9zZShmZCk7CisgKi8KKworLyoKKyAqIFdoZW4gYSBuZXcgdm9sdW1lIGlzIGNyZWF0ZWQsIHVzZXJzIG1heSBlaXRoZXIgc3BlY2lmeSB0aGUgdm9sdW1lIG51bWJlciB0aGV5CisgKiB3YW50IHRvIGNyZWF0ZSBvciB0byBsZXQgVUJJIGF1dG9tYXRpY2FsbHkgYXNzaWduIGEgdm9sdW1lIG51bWJlciB1c2luZyB0aGlzCisgKiBjb25zdGFudC4KKyAqLworI2RlZmluZSBVQklfVk9MX05VTV9BVVRPICgtMSkKKworLyogTWF4aW11bSB2b2x1bWUgbmFtZSBsZW5ndGggKi8KKyNkZWZpbmUgVUJJX01BWF9WT0xVTUVfTkFNRSAxMjcKKworLyogSU9DVEwgY29tbWFuZHMgb2YgVUJJIGNoYXJhY3RlciBkZXZpY2VzICovCisKKyNkZWZpbmUgVUJJX0lPQ19NQUdJQyAnbycKKworLyogQ3JlYXRlIGFuIFVCSSB2b2x1bWUgKi8KKyNkZWZpbmUgVUJJX0lPQ01LVk9MIF9JT1coVUJJX0lPQ19NQUdJQywgMCwgc3RydWN0IHViaV9ta3ZvbF9yZXEpCisvKiBSZW1vdmUgYW4gVUJJIHZvbHVtZSAqLworI2RlZmluZSBVQklfSU9DUk1WT0wgX0lPVyhVQklfSU9DX01BR0lDLCAxLCBpbnQzMl90KQorLyogUmUtc2l6ZSBhbiBVQkkgdm9sdW1lICovCisjZGVmaW5lIFVCSV9JT0NSU1ZPTCBfSU9XKFVCSV9JT0NfTUFHSUMsIDIsIHN0cnVjdCB1YmlfcnN2b2xfcmVxKQorCisvKiBJT0NUTCBjb21tYW5kcyBvZiBVQkkgdm9sdW1lIGNoYXJhY3RlciBkZXZpY2VzICovCisKKyNkZWZpbmUgVUJJX1ZPTF9JT0NfTUFHSUMgJ08nCisKKy8qIFN0YXJ0IFVCSSB2b2x1bWUgdXBkYXRlICovCisjZGVmaW5lIFVCSV9JT0NWT0xVUCBfSU9XKFVCSV9WT0xfSU9DX01BR0lDLCAwLCBpbnQ2NF90KQorLyogQW4gZXJhc2VibG9jayBlcmFzdXJlIGNvbW1hbmQsIHVzZWQgZm9yIGRlYnVnZ2luZywgZGlzYWJsZWQgYnkgZGVmYXVsdCAqLworI2RlZmluZSBVQklfSU9DRUJFUiBfSU9XKFVCSV9WT0xfSU9DX01BR0lDLCAxLCBpbnQzMl90KQorCisvKgorICogVUJJIHZvbHVtZSB0eXBlIGNvbnN0YW50cy4KKyAqCisgKiBAVUJJX0RZTkFNSUNfVk9MVU1FOiBkeW5hbWljIHZvbHVtZQorICogQFVCSV9TVEFUSUNfVk9MVU1FOiAgc3RhdGljIHZvbHVtZQorICovCitlbnVtIHsKKwlVQklfRFlOQU1JQ19WT0xVTUUgPSAzLAorCVVCSV9TVEFUSUNfVk9MVU1FID0gNAorfTsKKworLyoqCisgKiBzdHJ1Y3QgdWJpX21rdm9sX3JlcSAtIHZvbHVtZSBkZXNjcmlwdGlvbiBkYXRhIHN0cnVjdHVyZSB1c2VkIGluCisgKiB2b2x1bWUgY3JlYXRpb24gcmVxdWVzdHMuCisgKiBAdm9sX2lkOiB2b2x1bWUgbnVtYmVyCisgKiBAYWxpZ25tZW50OiB2b2x1bWUgYWxpZ25tZW50CisgKiBAYnl0ZXM6IHZvbHVtZSBzaXplIGluIGJ5dGVzCisgKiBAdm9sX3R5cGU6IHZvbHVtZSB0eXBlICglVUJJX0RZTkFNSUNfVk9MVU1FIG9yICVVQklfU1RBVElDX1ZPTFVNRSkKKyAqIEBwYWRkaW5nMTogcmVzZXJ2ZWQgZm9yIGZ1dHVyZSwgbm90IHVzZWQKKyAqIEBuYW1lX2xlbjogdm9sdW1lIG5hbWUgbGVuZ3RoCisgKiBAcGFkZGluZzI6IHJlc2VydmVkIGZvciBmdXR1cmUsIG5vdCB1c2VkCisgKiBAbmFtZTogdm9sdW1lIG5hbWUKKyAqCisgKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGJ5IHVzZXJzcGFjZSBwcm9ncmFtcyB3aGVuIGNyZWF0aW5nIG5ldyB2b2x1bWVzLiBUaGUKKyAqIEB1c2VkX2J5dGVzIGZpZWxkIGlzIG9ubHkgbmVjZXNzYXJ5IHdoZW4gY3JlYXRpbmcgc3RhdGljIHZvbHVtZXMuCisgKgorICogVGhlIEBhbGlnbm1lbnQgZmllbGQgc3BlY2lmaWVzIHRoZSByZXF1aXJlZCBhbGlnbm1lbnQgb2YgdGhlIHZvbHVtZSBsb2dpY2FsCisgKiBlcmFzZWJsb2NrLiBUaGlzIG1lYW5zLCB0aGF0IHRoZSBzaXplIG9mIGxvZ2ljYWwgZXJhc2VibG9ja3Mgd2lsbCBiZSBhbGlnbmVkCisgKiB0byB0aGlzIG51bWJlciwgaS5lLiwKKyAqCShVQkkgZGV2aWNlIGxvZ2ljYWwgZXJhc2VibG9jayBzaXplKSBtb2QgKEBhbGlnbm1lbnQpID0gMC4KKyAqCisgKiBUbyBwdXQgaXQgZGlmZmVyZW50bHksIHRoZSBsb2dpY2FsIGVyYXNlYmxvY2sgb2YgdGhpcyB2b2x1bWUgbWF5IGJlIHNsaWdodGx5CisgKiBzaG9ydGVuZWQgaW4gb3JkZXIgdG8gbWFrZSBpdCBwcm9wZXJseSBhbGlnbmVkLiBUaGUgYWxpZ25tZW50IGhhcyB0byBiZQorICogbXVsdGlwbGUgb2YgdGhlIGZsYXNoIG1pbmltYWwgaW5wdXQvb3V0cHV0IHVuaXQsIG9yICUxIHRvIHV0aWxpemUgdGhlIGVudGlyZQorICogYXZhaWxhYmxlIHNwYWNlIG9mIGxvZ2ljYWwgZXJhc2VibG9ja3MuCisgKgorICogVGhlIEBhbGlnbm1lbnQgZmllbGQgbWF5IGJlIHVzZWZ1bCwgZm9yIGV4YW1wbGUsIHdoZW4gb25lIHdhbnRzIHRvIG1haW50YWluCisgKiBhIGJsb2NrIGRldmljZSBvbiB0b3Agb2YgYW4gVUJJIHZvbHVtZS4gSW4gdGhpcyBjYXNlLCBpdCBpcyBkZXNpcmFibGUgdG8gZml0CisgKiBhbiBpbnRlZ2VyIG51bWJlciBvZiBibG9ja3MgaW4gbG9naWNhbCBlcmFzZWJsb2NrcyBvZiB0aGlzIFVCSSB2b2x1bWUuIFdpdGgKKyAqIGFsaWdubWVudCBpdCBpcyBwb3NzaWJsZSB0byB1cGRhdGUgdGhpcyB2b2x1bWUgdXNpbmcgcGxhbmUgVUJJIHZvbHVtZSBpbWFnZQorICogQkxPQnMsIHdpdGhvdXQgY2FyaW5nIGFib3V0IGhvdyB0byBwcm9wZXJseSBhbGlnbiB0aGVtLgorICovCitzdHJ1Y3QgdWJpX21rdm9sX3JlcSB7CisJaW50MzJfdCB2b2xfaWQ7CisJaW50MzJfdCBhbGlnbm1lbnQ7CisJaW50NjRfdCBieXRlczsKKwlpbnQ4X3Qgdm9sX3R5cGU7CisJaW50OF90IHBhZGRpbmcxOworCWludDE2X3QgbmFtZV9sZW47CisJaW50OF90IHBhZGRpbmcyWzRdOworCWNoYXIgbmFtZVtVQklfTUFYX1ZPTFVNRV9OQU1FKzFdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qKgorICogc3RydWN0IHViaV9yc3ZvbF9yZXEgLSBhIGRhdGEgc3RydWN0dXJlIHVzZWQgaW4gdm9sdW1lIHJlLXNpemUgcmVxdWVzdHMuCisgKiBAdm9sX2lkOiBJRCBvZiB0aGUgdm9sdW1lIHRvIHJlLXNpemUKKyAqIEBieXRlczogbmV3IHNpemUgb2YgdGhlIHZvbHVtZSBpbiBieXRlcworICoKKyAqIFJlLXNpemluZyBpcyBwb3NzaWJsZSBmb3IgYm90aCBkeW5hbWljIGFuZCBzdGF0aWMgdm9sdW1lcy4gQnV0IHdoaWxlIGR5bmFtaWMKKyAqIHZvbHVtZXMgbWF5IGJlIHJlLXNpemVkIGFyYml0cmFyaWx5LCBzdGF0aWMgdm9sdW1lcyBjYW5ub3QgYmUgbWFkZSB0byBiZQorICogc21hbGxlciB0aGVuIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhleSBiZWFyLiBUbyBhcmJpdHJhcmlseSBzaHJpbmsgYSBzdGF0aWMKKyAqIHZvbHVtZSwgaXQgbXVzdCBiZSB3aXBlZCBvdXQgZmlyc3QgKGJ5IG1lYW5zIG9mIHZvbHVtZSB1cGRhdGUgb3BlcmF0aW9uIHdpdGgKKyAqIHplcm8gbnVtYmVyIG9mIGJ5dGVzKS4KKyAqLworc3RydWN0IHViaV9yc3ZvbF9yZXEgeworCWludDY0X3QgYnl0ZXM7CisJaW50MzJfdCB2b2xfaWQ7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworI2VuZGlmIC8qIF9fVUJJX1VTRVJfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9hZGRyY29uZi5oIGIvaW5jbHVkZS9uZXQvYWRkcmNvbmYuaAppbmRleCA4OGRmOGZjLi5mMzUzMWQwIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9hZGRyY29uZi5oCisrKyBiL2luY2x1ZGUvbmV0L2FkZHJjb25mLmgKQEAgLTczLDcgKzczLDkgQEAKIGV4dGVybiBpbnQJCQlpcHY2X2Rldl9nZXRfc2FkZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgCiAJCQkJCSAgICAgICBzdHJ1Y3QgaW42X2FkZHIgKmRhZGRyLAogCQkJCQkgICAgICAgc3RydWN0IGluNl9hZGRyICpzYWRkcik7Ci1leHRlcm4gaW50CQkJaXB2Nl9nZXRfbGxhZGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpbjZfYWRkciAqKTsKK2V4dGVybiBpbnQJCQlpcHY2X2dldF9sbGFkZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJCXN0cnVjdCBpbjZfYWRkciAqYWRkciwKKwkJCQkJCXVuc2lnbmVkIGNoYXIgYmFubmVkX2ZsYWdzKTsKIGV4dGVybiBpbnQJCQlpcHY2X3Jjdl9zYWRkcl9lcXVhbChjb25zdCBzdHJ1Y3Qgc29jayAqc2ssIAogCQkJCQkJICAgICAgY29uc3Qgc3RydWN0IHNvY2sgKnNrMik7CiBleHRlcm4gdm9pZAkJCWFkZHJjb25mX2pvaW5fc29saWN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9hZl9yeHJwYy5oIGIvaW5jbHVkZS9uZXQvYWZfcnhycGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGMyZWFhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9uZXQvYWZfcnhycGMuaApAQCAtMCwwICsxLDU3IEBACisvKiBSeFJQQyBrZXJuZWwgc2VydmljZSBpbnRlcmZhY2UgZGVmaW5pdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBfTkVUX1JYUlBDX0gKKyNkZWZpbmUgX05FVF9SWFJQQ19ICisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNpbmNsdWRlIDxsaW51eC9yeHJwYy5oPgorCitzdHJ1Y3QgcnhycGNfY2FsbDsKKworLyoKKyAqIHRoZSBtYXJrIGFwcGxpZWQgdG8gc29ja2V0IGJ1ZmZlcnMgdGhhdCBtYXkgYmUgaW50ZXJjZXB0ZWQKKyAqLworZW51bSB7CisJUlhSUENfU0tCX01BUktfREFUQSwJCS8qIGRhdGEgbWVzc2FnZSAqLworCVJYUlBDX1NLQl9NQVJLX0ZJTkFMX0FDSywJLyogZmluYWwgQUNLIHJlY2VpdmVkIG1lc3NhZ2UgKi8KKwlSWFJQQ19TS0JfTUFSS19CVVNZLAkJLyogc2VydmVyIGJ1c3kgbWVzc2FnZSAqLworCVJYUlBDX1NLQl9NQVJLX1JFTU9URV9BQk9SVCwJLyogcmVtb3RlIGFib3J0IG1lc3NhZ2UgKi8KKwlSWFJQQ19TS0JfTUFSS19ORVRfRVJST1IsCS8qIG5ldHdvcmsgZXJyb3IgbWVzc2FnZSAqLworCVJYUlBDX1NLQl9NQVJLX0xPQ0FMX0VSUk9SLAkvKiBsb2NhbCBlcnJvciBtZXNzYWdlICovCisJUlhSUENfU0tCX01BUktfTkVXX0NBTEwsCS8qIGxvY2FsIGVycm9yIG1lc3NhZ2UgKi8KK307CisKK3R5cGVkZWYgdm9pZCAoKnJ4cnBjX2ludGVyY2VwdG9yX3QpKHN0cnVjdCBzb2NrICosIHVuc2lnbmVkIGxvbmcsCisJCQkJICAgIHN0cnVjdCBza19idWZmICopOworZXh0ZXJuIHZvaWQgcnhycGNfa2VybmVsX2ludGVyY2VwdF9yeF9tZXNzYWdlcyhzdHJ1Y3Qgc29ja2V0ICosCisJCQkJCSAgICAgICByeHJwY19pbnRlcmNlcHRvcl90KTsKK2V4dGVybiBzdHJ1Y3QgcnhycGNfY2FsbCAqcnhycGNfa2VybmVsX2JlZ2luX2NhbGwoc3RydWN0IHNvY2tldCAqLAorCQkJCQkJICBzdHJ1Y3Qgc29ja2FkZHJfcnhycGMgKiwKKwkJCQkJCSAgc3RydWN0IGtleSAqLAorCQkJCQkJICB1bnNpZ25lZCBsb25nLAorCQkJCQkJICBnZnBfdCk7CitleHRlcm4gaW50IHJ4cnBjX2tlcm5lbF9zZW5kX2RhdGEoc3RydWN0IHJ4cnBjX2NhbGwgKiwgc3RydWN0IG1zZ2hkciAqLAorCQkJCSAgc2l6ZV90KTsKK2V4dGVybiB2b2lkIHJ4cnBjX2tlcm5lbF9hYm9ydF9jYWxsKHN0cnVjdCByeHJwY19jYWxsICosIHUzMik7CitleHRlcm4gdm9pZCByeHJwY19rZXJuZWxfZW5kX2NhbGwoc3RydWN0IHJ4cnBjX2NhbGwgKik7CitleHRlcm4gYm9vbCByeHJwY19rZXJuZWxfaXNfZGF0YV9sYXN0KHN0cnVjdCBza19idWZmICopOworZXh0ZXJuIHUzMiByeHJwY19rZXJuZWxfZ2V0X2Fib3J0X2NvZGUoc3RydWN0IHNrX2J1ZmYgKik7CitleHRlcm4gaW50IHJ4cnBjX2tlcm5lbF9nZXRfZXJyb3JfbnVtYmVyKHN0cnVjdCBza19idWZmICopOworZXh0ZXJuIHZvaWQgcnhycGNfa2VybmVsX2RhdGFfZGVsaXZlcmVkKHN0cnVjdCBza19idWZmICopOworZXh0ZXJuIHZvaWQgcnhycGNfa2VybmVsX2ZyZWVfc2tiKHN0cnVjdCBza19idWZmICopOworZXh0ZXJuIHN0cnVjdCByeHJwY19jYWxsICpyeHJwY19rZXJuZWxfYWNjZXB0X2NhbGwoc3RydWN0IHNvY2tldCAqLAorCQkJCQkJICAgdW5zaWduZWQgbG9uZyk7CitleHRlcm4gaW50IHJ4cnBjX2tlcm5lbF9yZWplY3RfY2FsbChzdHJ1Y3Qgc29ja2V0ICopOworCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworI2VuZGlmIC8qIF9ORVRfUlhSUENfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvYXgyNS5oIGIvaW5jbHVkZS9uZXQvYXgyNS5oCmluZGV4IDQ3ZmYyZjQuLjk5YTRlMzYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2F4MjUuaAorKysgYi9pbmNsdWRlL25ldC9heDI1LmgKQEAgLTI2Myw4ICsyNjMsOCBAQAogc3RhdGljIGlubGluZSBfX2JlMTYgYXgyNV90eXBlX3RyYW5zKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc2tiLT5kZXYgICAgICA9IGRldjsKKwlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwogCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfSE9TVDsKLQlza2ItPm1hYy5yYXcgID0gc2tiLT5kYXRhOwogCXJldHVybiBodG9ucyhFVEhfUF9BWDI1KTsKIH0KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL2hjaS5oIGIvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL2hjaS5oCmluZGV4IDQxNDU2YzEuLjkzY2UyNzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2JsdWV0b290aC9oY2kuaAorKysgYi9pbmNsdWRlL25ldC9ibHVldG9vdGgvaGNpLmgKQEAgLTcwOSw2ICs3MDksMjQgQEAKIAlfX3U4IAlkbGVuOwogfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKKyNpZmRlZiBfX0tFUk5FTF9fCisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CitzdGF0aWMgaW5saW5lIHN0cnVjdCBoY2lfZXZlbnRfaGRyICpoY2lfZXZlbnRfaGRyKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIChzdHJ1Y3QgaGNpX2V2ZW50X2hkciAqKXNrYi0+ZGF0YTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaGNpX2FjbF9oZHIgKmhjaV9hY2xfaGRyKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIChzdHJ1Y3QgaGNpX2FjbF9oZHIgKilza2ItPmRhdGE7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGhjaV9zY29faGRyICpoY2lfc2NvX2hkcihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiAoc3RydWN0IGhjaV9zY29faGRyICopc2tiLT5kYXRhOworfQorI2VuZGlmCisKIC8qIENvbW1hbmQgb3Bjb2RlIHBhY2svdW5wYWNrICovCiAjZGVmaW5lIGhjaV9vcGNvZGVfcGFjayhvZ2YsIG9jZikJKF9fdTE2KSAoKG9jZiAmIDB4MDNmZil8KG9nZiA8PCAxMCkpCiAjZGVmaW5lIGhjaV9vcGNvZGVfb2dmKG9wKQkJKG9wID4+IDEwKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvY2ZnODAyMTEuaCBiL2luY2x1ZGUvbmV0L2NmZzgwMjExLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgxNzFmOAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbmV0L2NmZzgwMjExLmgKQEAgLTAsMCArMSw0MCBAQAorI2lmbmRlZiBfX05FVF9DRkc4MDIxMV9ICisjZGVmaW5lIF9fTkVUX0NGRzgwMjExX0gKKworI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxuZXQvZ2VuZXRsaW5rLmg+CisKKy8qCisgKiA4MDIuMTEgY29uZmlndXJhdGlvbiBpbi1rZXJuZWwgaW50ZXJmYWNlCisgKgorICogQ29weXJpZ2h0IDIwMDYgSm9oYW5uZXMgQmVyZyA8am9oYW5uZXNAc2lwc29sdXRpb25zLm5ldD4KKyAqLworCisvKiBmcm9tIG5ldC93aXJlbGVzcy5oICovCitzdHJ1Y3Qgd2lwaHk7CisKKy8qKgorICogc3RydWN0IGNmZzgwMjExX29wcyAtIGJhY2tlbmQgZGVzY3JpcHRpb24gZm9yIHdpcmVsZXNzIGNvbmZpZ3VyYXRpb24KKyAqCisgKiBUaGlzIHN0cnVjdCBpcyByZWdpc3RlcmVkIGJ5IGZ1bGxtYWMgY2FyZCBkcml2ZXJzIGFuZC9vciB3aXJlbGVzcyBzdGFja3MKKyAqIGluIG9yZGVyIHRvIGhhbmRsZSBjb25maWd1cmF0aW9uIHJlcXVlc3RzIG9uIHRoZWlyIGludGVyZmFjZXMuCisgKgorICogQWxsIGNhbGxiYWNrcyBleGNlcHQgd2hlcmUgb3RoZXJ3aXNlIG5vdGVkIHNob3VsZCByZXR1cm4gMAorICogb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgKgorICogQWxsIG9wZXJhdGlvbnMgYXJlIGN1cnJlbnRseSBpbnZva2VkIHVuZGVyIHJ0bmwgZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlCisgKiB3aXJlbGVzcyBleHRlbnNpb25zIGJ1dCB0aGlzIGlzIHN1YmplY3QgdG8gcmVldmFsdWF0aW9uIGFzIHNvb24gYXMgdGhpcworICogY29kZSBpcyB1c2VkIG1vcmUgd2lkZWx5IGFuZCB3ZSBoYXZlIGEgZmlyc3QgdXNlciB3aXRob3V0IHdleHQuCisgKgorICogQGFkZF92aXJ0dWFsX2ludGY6IGNyZWF0ZSBhIG5ldyB2aXJ0dWFsIGludGVyZmFjZSB3aXRoIHRoZSBnaXZlbiBuYW1lCisgKgorICogQGRlbF92aXJ0dWFsX2ludGY6IHJlbW92ZSB0aGUgdmlydHVhbCBpbnRlcmZhY2UgZGV0ZXJtaW5lZCBieSBpZmluZGV4LgorICovCitzdHJ1Y3QgY2ZnODAyMTFfb3BzIHsKKwlpbnQJKCphZGRfdmlydHVhbF9pbnRmKShzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBjaGFyICpuYW1lLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgdHlwZSk7CisJaW50CSgqZGVsX3ZpcnR1YWxfaW50Zikoc3RydWN0IHdpcGh5ICp3aXBoeSwgaW50IGlmaW5kZXgpOworfTsKKworI2VuZGlmIC8qIF9fTkVUX0NGRzgwMjExX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2NpcHNvX2lwdjQuaCBiL2luY2x1ZGUvbmV0L2NpcHNvX2lwdjQuaAppbmRleCA0Yzk1MjJjLi40ZjkwZjU1IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9jaXBzb19pcHY0LmgKKysrIGIvaW5jbHVkZS9uZXQvY2lwc29faXB2NC5oCkBAIC0xMjAsNyArMTIwLDcgQEAKICAqLwogCiAjZGVmaW5lIENJUFNPX1Y0X09QVEVYSVNUKHgpIChJUENCKHgpLT5vcHQuY2lwc28gIT0gMCkKLSNkZWZpbmUgQ0lQU09fVjRfT1BUUFRSKHgpICgoeCktPm5oLnJhdyArIElQQ0IoeCktPm9wdC5jaXBzbykKKyNkZWZpbmUgQ0lQU09fVjRfT1BUUFRSKHgpIChza2JfbmV0d29ya19oZWFkZXIoeCkgKyBJUENCKHgpLT5vcHQuY2lwc28pCiAKIC8qCiAgKiBET0kgTGlzdCBGdW5jdGlvbnMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2NvbXBhdC5oIGIvaW5jbHVkZS9uZXQvY29tcGF0LmgKaW5kZXggOTg1OWI2MC4uNDA2ZGIyNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvY29tcGF0LmgKKysrIGIvaW5jbHVkZS9uZXQvY29tcGF0LmgKQEAgLTI1LDYgKzI1LDcgQEAKIH07CiAKIGV4dGVybiBpbnQgY29tcGF0X3NvY2tfZ2V0X3RpbWVzdGFtcChzdHJ1Y3Qgc29jayAqLCBzdHJ1Y3QgdGltZXZhbCBfX3VzZXIgKik7CitleHRlcm4gaW50IGNvbXBhdF9zb2NrX2dldF90aW1lc3RhbXBucyhzdHJ1Y3Qgc29jayAqLCBzdHJ1Y3QgdGltZXNwZWMgX191c2VyICopOwogCiAjZWxzZSAvKiBkZWZpbmVkKENPTkZJR19DT01QQVQpICovCiAjZGVmaW5lIGNvbXBhdF9tc2doZHIJbXNnaGRyCQkvKiB0byBhdm9pZCBjb21waWxlciB3YXJuaW5ncyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvZG5fZmliLmggYi9pbmNsdWRlL25ldC9kbl9maWIuaAppbmRleCBmMDE2MjZjLi4zMDEyNTExIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9kbl9maWIuaAorKysgYi9pbmNsdWRlL25ldC9kbl9maWIuaApAQCAtMTQ4LDE3ICsxNDgsOCBAQAogZXh0ZXJuIHVuc2lnbmVkIGRuZXRfYWRkcl90eXBlKF9fbGUxNiBhZGRyKTsKIGV4dGVybiBpbnQgZG5fZmliX2xvb2t1cChzdHJ1Y3QgZmxvd2kgKmZsLCBzdHJ1Y3QgZG5fZmliX3JlcyAqcmVzKTsKIAotLyoKLSAqIHJ0bmV0bGluayBpbnRlcmZhY2UKLSAqLwotZXh0ZXJuIGludCBkbl9maWJfcnRtX2RlbHJvdXRlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBubG1zZ2hkciAqbmxoLCB2b2lkICphcmcpOwotZXh0ZXJuIGludCBkbl9maWJfcnRtX25ld3JvdXRlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBubG1zZ2hkciAqbmxoLCB2b2lkICphcmcpOwogZXh0ZXJuIGludCBkbl9maWJfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpOwogCi1leHRlcm4gaW50IGRuX2ZpYl9ydG1fZGVscnVsZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgdm9pZCAqYXJnKTsKLWV4dGVybiBpbnQgZG5fZmliX3J0bV9uZXdydWxlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBubG1zZ2hkciAqbmxoLCB2b2lkICphcmcpOwotZXh0ZXJuIGludCBkbl9maWJfZHVtcF9ydWxlcyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpOwotCiBleHRlcm4gdm9pZCBkbl9maWJfZnJlZV9pbmZvKHN0cnVjdCBkbl9maWJfaW5mbyAqZmkpOwogCiBzdGF0aWMgaW5saW5lIHZvaWQgZG5fZmliX2luZm9fcHV0KHN0cnVjdCBkbl9maWJfaW5mbyAqZmkpCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9kbl9yb3V0ZS5oIGIvaW5jbHVkZS9uZXQvZG5fcm91dGUuaAppbmRleCBhNTY2OTQ0Li5jMTBlOGU3IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9kbl9yb3V0ZS5oCisrKyBiL2luY2x1ZGUvbmV0L2RuX3JvdXRlLmgKQEAgLTE4LDcgKzE4LDYgQEAKIGV4dGVybiBzdHJ1Y3Qgc2tfYnVmZiAqZG5fYWxsb2Nfc2tiKHN0cnVjdCBzb2NrICpzaywgaW50IHNpemUsIGdmcF90IHByaSk7CiBleHRlcm4gaW50IGRuX3JvdXRlX291dHB1dF9zb2NrKHN0cnVjdCBkc3RfZW50cnkgKipwcHJ0LCBzdHJ1Y3QgZmxvd2kgKiwgc3RydWN0IHNvY2sgKnNrLCBpbnQgZmxhZ3MpOwogZXh0ZXJuIGludCBkbl9jYWNoZV9kdW1wKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYik7Ci1leHRlcm4gaW50IGRuX2NhY2hlX2dldHJvdXRlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBubG1zZ2hkciAqbmxoLCB2b2lkICphcmcpOwogZXh0ZXJuIHZvaWQgZG5fcnRfY2FjaGVfZmx1c2goaW50IGRlbGF5KTsKIAogLyogTWFza3MgZm9yIGZsYWdzIGZpZWxkICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9lc3AuaCBiL2luY2x1ZGUvbmV0L2VzcC5oCmluZGV4IDcxM2QwMzlmLi5kMDVkOGQyIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9lc3AuaAorKysgYi9pbmNsdWRlL25ldC9lc3AuaApAQCAtNDAsOCArNDAsNiBAQAogCX0gYXV0aDsKIH07CiAKLWV4dGVybiBpbnQgc2tiX3RvX3NndmVjKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBvZmZzZXQsIGludCBsZW4pOwotZXh0ZXJuIGludCBza2JfY293X2RhdGEoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHRhaWxiaXRzLCBzdHJ1Y3Qgc2tfYnVmZiAqKnRyYWlsZXIpOwogZXh0ZXJuIHZvaWQgKnBza2JfcHV0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBza19idWZmICp0YWlsLCBpbnQgbGVuKTsKIAogc3RhdGljIGlubGluZSBpbnQgZXNwX21hY19kaWdlc3Qoc3RydWN0IGVzcF9kYXRhICplc3AsIHN0cnVjdCBza19idWZmICpza2IsCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9maWJfcnVsZXMuaCBiL2luY2x1ZGUvbmV0L2ZpYl9ydWxlcy5oCmluZGV4IGQ1ODVlYTkuLmVkM2E4ODcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2ZpYl9ydWxlcy5oCisrKyBiL2luY2x1ZGUvbmV0L2ZpYl9ydWxlcy5oCkBAIC01LDcgKzUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZpYl9ydWxlcy5oPgogI2luY2x1ZGUgPG5ldC9mbG93Lmg+Ci0jaW5jbHVkZSA8bmV0L25ldGxpbmsuaD4KKyNpbmNsdWRlIDxuZXQvcnRuZXRsaW5rLmg+CiAKIHN0cnVjdCBmaWJfcnVsZQogewpAQCAtMTksNiArMTksOCBAQAogCXUzMgkJCWZsYWdzOwogCXUzMgkJCXRhYmxlOwogCXU4CQkJYWN0aW9uOworCXUzMgkJCXRhcmdldDsKKwlzdHJ1Y3QgZmliX3J1bGUgKgljdGFyZ2V0OwogCXN0cnVjdCByY3VfaGVhZAkJcmN1OwogfTsKIApAQCAtMzUsNiArMzcsOCBAQAogCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKIAlpbnQJCQlydWxlX3NpemU7CiAJaW50CQkJYWRkcl9zaXplOworCWludAkJCXVucmVzb2x2ZWRfcnVsZXM7CisJaW50CQkJbnJfZ290b19ydWxlczsKIAogCWludAkJCSgqYWN0aW9uKShzdHJ1Y3QgZmliX3J1bGUgKiwKIAkJCQkJICBzdHJ1Y3QgZmxvd2kgKiwgaW50LApAQCAtNTUsNiArNTksMTAgQEAKIAl1MzIJCQkoKmRlZmF1bHRfcHJlZikodm9pZCk7CiAJc2l6ZV90CQkJKCpubG1zZ19wYXlsb2FkKShzdHJ1Y3QgZmliX3J1bGUgKik7CiAKKwkvKiBDYWxsZWQgYWZ0ZXIgbW9kaWZpY2F0aW9ucyB0byB0aGUgcnVsZXMgc2V0LCBtdXN0IGZsdXNoCisJICogdGhlIHJvdXRlIGNhY2hlIGlmIG9uZSBleGlzdHMuICovCisJdm9pZAkJCSgqZmx1c2hfY2FjaGUpKHZvaWQpOworCiAJaW50CQkJbmxncm91cDsKIAlzdHJ1Y3QgbmxhX3BvbGljeQkqcG9saWN5OwogCXN0cnVjdCBsaXN0X2hlYWQJKnJ1bGVzX2xpc3Q7CkBAIC02Niw3ICs3NCw4IEBACiAJW0ZSQV9QUklPUklUWV0JPSB7IC50eXBlID0gTkxBX1UzMiB9LCBcCiAJW0ZSQV9GV01BUktdCT0geyAudHlwZSA9IE5MQV9VMzIgfSwgXAogCVtGUkFfRldNQVNLXQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sIFwKLQlbRlJBX1RBQkxFXSAgICAgPSB7IC50eXBlID0gTkxBX1UzMiB9CisJW0ZSQV9UQUJMRV0gICAgID0geyAudHlwZSA9IE5MQV9VMzIgfSwgXAorCVtGUkFfR09UT10JPSB7IC50eXBlID0gTkxBX1UzMiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBmaWJfcnVsZV9nZXQoc3RydWN0IGZpYl9ydWxlICpydWxlKQogewpAQCAtOTgsMTEgKzEwNyw0IEBACiBleHRlcm4gaW50CQkJZmliX3J1bGVzX2xvb2t1cChzdHJ1Y3QgZmliX3J1bGVzX29wcyAqLAogCQkJCQkJIHN0cnVjdCBmbG93aSAqLCBpbnQgZmxhZ3MsCiAJCQkJCQkgc3RydWN0IGZpYl9sb29rdXBfYXJnICopOwotCi1leHRlcm4gaW50CQkJZmliX25sX25ld3J1bGUoc3RydWN0IHNrX2J1ZmYgKiwKLQkJCQkJICAgICAgIHN0cnVjdCBubG1zZ2hkciAqLCB2b2lkICopOwotZXh0ZXJuIGludAkJCWZpYl9ubF9kZWxydWxlKHN0cnVjdCBza19idWZmICosCi0JCQkJCSAgICAgICBzdHJ1Y3Qgbmxtc2doZHIgKiwgdm9pZCAqKTsKLWV4dGVybiBpbnQJCQlmaWJfcnVsZXNfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqLAotCQkJCQkgICAgICAgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKiwgaW50KTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvZmxvdy5oIGIvaW5jbHVkZS9uZXQvZmxvdy5oCmluZGV4IGNlNGIxMGQuLmYzY2MxZjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2Zsb3cuaAorKysgYi9pbmNsdWRlL25ldC9mbG93LmgKQEAgLTk3LDQgKzk3LDEwIEBACiBleHRlcm4gdm9pZCBmbG93X2NhY2hlX2ZsdXNoKHZvaWQpOwogZXh0ZXJuIGF0b21pY190IGZsb3dfY2FjaGVfZ2VuaWQ7CiAKK3N0YXRpYyBpbmxpbmUgaW50IGZsb3dfY2FjaGVfdWxpX21hdGNoKHN0cnVjdCBmbG93aSAqZmwxLCBzdHJ1Y3QgZmxvd2kgKmZsMikKK3sKKwlyZXR1cm4gKGZsMS0+cHJvdG8gPT0gZmwyLT5wcm90byAmJgorCQkhbWVtY21wKCZmbDEtPnVsaV91LCAmZmwyLT51bGlfdSwgc2l6ZW9mKGZsMS0+dWxpX3UpKSk7Cit9CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvaWVlZTgwMjExLmggYi9pbmNsdWRlL25ldC9pZWVlODAyMTEuaAppbmRleCBlMDJkODVmLi5kNTZiMjkyIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9pZWVlODAyMTEuaAorKysgYi9pbmNsdWRlL25ldC9pZWVlODAyMTEuaApAQCAtNiw4ICs2LDggQEAKICAqIExBTiBhY2Nlc3MgcG9pbnQpIGRyaXZlciBmb3IgSW50ZXJzaWwgUHJpc20yLzIuNS8zLgogICoKICAqIENvcHlyaWdodCAoYykgMjAwMS0yMDAyLCBTU0ggQ29tbXVuaWNhdGlvbnMgU2VjdXJpdHkgQ29ycCBhbmQgSm91bmkgTWFsaW5lbgotICogPGprbWFsaW5lQGNjLmh1dC5maT4KLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDAzLCBKb3VuaSBNYWxpbmVuIDxqa21hbGluZUBjYy5odXQuZmk+CisgKiA8akB3MS5maT4KKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDAzLCBKb3VuaSBNYWxpbmVuIDxqQHcxLmZpPgogICoKICAqIEFkYXB0aW9uIHRvIGEgZ2VuZXJpYyBJRUVFIDgwMi4xMSBzdGFjayBieSBKYW1lcyBLZXRyZW5vcwogICogPGprZXRyZW5vQGxpbnV4LmludGVsLmNvbT4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2llZWU4MDIxMV9jcnlwdC5oIGIvaW5jbHVkZS9uZXQvaWVlZTgwMjExX2NyeXB0LmgKaW5kZXggZWI0NzY0MTQuLmIzZDY1ZTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2llZWU4MDIxMV9jcnlwdC5oCisrKyBiL2luY2x1ZGUvbmV0L2llZWU4MDIxMV9jcnlwdC5oCkBAIC0zLDggKzMsOCBAQAogICogZm9yIEludGVyc2lsIFByaXNtMi8yLjUvMy4KICAqCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMiwgU1NIIENvbW11bmljYXRpb25zIFNlY3VyaXR5IENvcnAgYW5kIEpvdW5pIE1hbGluZW4KLSAqIDxqa21hbGluZUBjYy5odXQuZmk+Ci0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwMywgSm91bmkgTWFsaW5lbiA8amttYWxpbmVAY2MuaHV0LmZpPgorICogPGpAdzEuZmk+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwMywgSm91bmkgTWFsaW5lbiA8akB3MS5maT4KICAqCiAgKiBBZGFwdGlvbiB0byBhIGdlbmVyaWMgSUVFRSA4MDIuMTEgc3RhY2sgYnkgSmFtZXMgS2V0cmVub3MKICAqIDxqa2V0cmVub0BsaW51eC5pbnRlbC5jb20+CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pZWVlODAyMTFfcmFkaW90YXAuaCBiL2luY2x1ZGUvbmV0L2llZWU4MDIxMV9yYWRpb3RhcC5oCmluZGV4IDQyOWI3MzguLmEwYzJiNDEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2llZWU4MDIxMV9yYWRpb3RhcC5oCisrKyBiL2luY2x1ZGUvbmV0L2llZWU4MDIxMV9yYWRpb3RhcC5oCkBAIC02Niw3ICs2Niw5IEBACiAgKi8KICNkZWZpbmUgSUVFRTgwMjExX1JBRElPVEFQX0hEUkxFTgk2NAogCi0vKiBUaGUgcmFkaW8gY2FwdHVyZSBoZWFkZXIgcHJlY2VkZXMgdGhlIDgwMi4xMSBoZWFkZXIuICovCisvKiBUaGUgcmFkaW8gY2FwdHVyZSBoZWFkZXIgcHJlY2VkZXMgdGhlIDgwMi4xMSBoZWFkZXIuCisgKiBBbGwgZGF0YSBpbiB0aGUgaGVhZGVyIGlzIGxpdHRsZSBlbmRpYW4gb24gYWxsIHBsYXRmb3Jtcy4KKyAqLwogc3RydWN0IGllZWU4MDIxMV9yYWRpb3RhcF9oZWFkZXIgewogCXU4IGl0X3ZlcnNpb247CQkvKiBWZXJzaW9uIDAuIE9ubHkgaW5jcmVhc2VzCiAJCQkJICogZm9yIGRyYXN0aWMgY2hhbmdlcywKQEAgLTc0LDEyICs3NiwxMiBAQAogCQkJCSAqIG5ldyBmaWVsZHMgZG9lcyBub3QgY291bnQuCiAJCQkJICovCiAJdTggaXRfcGFkOwotCXUxNiBpdF9sZW47CQkvKiBsZW5ndGggb2YgdGhlIHdob2xlCisJX19sZTE2IGl0X2xlbjsJCS8qIGxlbmd0aCBvZiB0aGUgd2hvbGUKIAkJCQkgKiBoZWFkZXIgaW4gYnl0ZXMsIGluY2x1ZGluZwogCQkJCSAqIGl0X3ZlcnNpb24sIGl0X3BhZCwKIAkJCQkgKiBpdF9sZW4sIGFuZCBkYXRhIGZpZWxkcy4KIAkJCQkgKi8KLQl1MzIgaXRfcHJlc2VudDsJCS8qIEEgYml0bWFwIHRlbGxpbmcgd2hpY2gKKwlfX2xlMzIgaXRfcHJlc2VudDsJLyogQSBiaXRtYXAgdGVsbGluZyB3aGljaAogCQkJCSAqIGZpZWxkcyBhcmUgcHJlc2VudC4gU2V0IGJpdCAzMQogCQkJCSAqICgweDgwMDAwMDAwKSB0byBleHRlbmQgdGhlCiAJCQkJICogYml0bWFwIGJ5IGFub3RoZXIgMzIgYml0cy4KQEAgLTg4LDg5ICs5MCwxMDIgQEAKIAkJCQkgKi8KIH07CiAKLS8qIE5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhIHR5cGUgICAgICAgVW5pdHMKLSAqIC0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0gICAgICAgLS0tLS0KKy8qIE5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhIHR5cGUgICAgVW5pdHMKKyAqIC0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0gICAgLS0tLS0KICAqCi0gKiBJRUVFODAyMTFfUkFESU9UQVBfVFNGVCAgICAgICAgICAgICAgdTY0ICAgICAgIG1pY3Jvc2Vjb25kcworICogSUVFRTgwMjExX1JBRElPVEFQX1RTRlQgICAgICAgICAgICAgIF9fbGU2NCAgICAgICBtaWNyb3NlY29uZHMKICAqCiAgKiAgICAgIFZhbHVlIGluIG1pY3Jvc2Vjb25kcyBvZiB0aGUgTUFDJ3MgNjQtYml0IDgwMi4xMSBUaW1lCiAgKiAgICAgIFN5bmNocm9uaXphdGlvbiBGdW5jdGlvbiB0aW1lciB3aGVuIHRoZSBmaXJzdCBiaXQgb2YgdGhlCiAgKiAgICAgIE1QRFUgYXJyaXZlZCBhdCB0aGUgTUFDLiBGb3IgcmVjZWl2ZWQgZnJhbWVzLCBvbmx5LgogICoKLSAqIElFRUU4MDIxMV9SQURJT1RBUF9DSEFOTkVMICAgICAgICAgICAyIHggdTE2ICAgTUh6LCBiaXRtYXAKKyAqIElFRUU4MDIxMV9SQURJT1RBUF9DSEFOTkVMICAgICAgICAgICAyIHggX19sZTE2ICAgTUh6LCBiaXRtYXAKICAqCiAgKiAgICAgIFR4L1J4IGZyZXF1ZW5jeSBpbiBNSHosIGZvbGxvd2VkIGJ5IGZsYWdzIChzZWUgYmVsb3cpLgogICoKLSAqIElFRUU4MDIxMV9SQURJT1RBUF9GSFNTICAgICAgICAgICAgICB1MTYgICAgICAgc2VlIGJlbG93CisgKiBJRUVFODAyMTFfUkFESU9UQVBfRkhTUyAgICAgICAgICAgICAgX19sZTE2ICAgICAgIHNlZSBiZWxvdwogICoKICAqICAgICAgRm9yIGZyZXF1ZW5jeS1ob3BwaW5nIHJhZGlvcywgdGhlIGhvcCBzZXQgKGZpcnN0IGJ5dGUpCiAgKiAgICAgIGFuZCBwYXR0ZXJuIChzZWNvbmQgYnl0ZSkuCiAgKgotICogSUVFRTgwMjExX1JBRElPVEFQX1JBVEUgICAgICAgICAgICAgIHU4ICAgICAgICA1MDBrYi9zCisgKiBJRUVFODAyMTFfUkFESU9UQVBfUkFURSAgICAgICAgICAgICAgdTggICAgICAgICAgIDUwMGtiL3MKICAqCiAgKiAgICAgIFR4L1J4IGRhdGEgcmF0ZQogICoKLSAqIElFRUU4MDIxMV9SQURJT1RBUF9EQk1fQU5UU0lHTkFMICAgICBpbnQ4X3QgICAgICAgICAgZGVjaWJlbHMgZnJvbQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmUgbWlsbGl3YXR0IChkQm0pCisgKiBJRUVFODAyMTFfUkFESU9UQVBfREJNX0FOVFNJR05BTCAgICAgczggICAgICAgICAgIGRlY2liZWxzIGZyb20KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25lIG1pbGxpd2F0dCAoZEJtKQogICoKICAqICAgICAgUkYgc2lnbmFsIHBvd2VyIGF0IHRoZSBhbnRlbm5hLCBkZWNpYmVsIGRpZmZlcmVuY2UgZnJvbQogICogICAgICBvbmUgbWlsbGl3YXR0LgogICoKLSAqIElFRUU4MDIxMV9SQURJT1RBUF9EQk1fQU5UTk9JU0UgICAgICBpbnQ4X3QgICAgICAgICAgZGVjaWJlbHMgZnJvbQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmUgbWlsbGl3YXR0IChkQm0pCisgKiBJRUVFODAyMTFfUkFESU9UQVBfREJNX0FOVE5PSVNFICAgICAgczggICAgICAgICAgIGRlY2liZWxzIGZyb20KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25lIG1pbGxpd2F0dCAoZEJtKQogICoKICAqICAgICAgUkYgbm9pc2UgcG93ZXIgYXQgdGhlIGFudGVubmEsIGRlY2liZWwgZGlmZmVyZW5jZSBmcm9tIG9uZQogICogICAgICBtaWxsaXdhdHQuCiAgKgotICogSUVFRTgwMjExX1JBRElPVEFQX0RCX0FOVFNJR05BTCAgICAgIHU4ICAgICAgICBkZWNpYmVsIChkQikKKyAqIElFRUU4MDIxMV9SQURJT1RBUF9EQl9BTlRTSUdOQUwgICAgICB1OCAgICAgICAgICAgZGVjaWJlbCAoZEIpCiAgKgogICogICAgICBSRiBzaWduYWwgcG93ZXIgYXQgdGhlIGFudGVubmEsIGRlY2liZWwgZGlmZmVyZW5jZSBmcm9tIGFuCiAgKiAgICAgIGFyYml0cmFyeSwgZml4ZWQgcmVmZXJlbmNlLgogICoKLSAqIElFRUU4MDIxMV9SQURJT1RBUF9EQl9BTlROT0lTRSAgICAgICB1OCAgICAgICAgZGVjaWJlbCAoZEIpCisgKiBJRUVFODAyMTFfUkFESU9UQVBfREJfQU5UTk9JU0UgICAgICAgdTggICAgICAgICAgIGRlY2liZWwgKGRCKQogICoKICAqICAgICAgUkYgbm9pc2UgcG93ZXIgYXQgdGhlIGFudGVubmEsIGRlY2liZWwgZGlmZmVyZW5jZSBmcm9tIGFuCiAgKiAgICAgIGFyYml0cmFyeSwgZml4ZWQgcmVmZXJlbmNlIHBvaW50LgogICoKLSAqIElFRUU4MDIxMV9SQURJT1RBUF9MT0NLX1FVQUxJVFkgICAgICB1MTYgICAgICAgdW5pdGxlc3MKKyAqIElFRUU4MDIxMV9SQURJT1RBUF9MT0NLX1FVQUxJVFkgICAgICBfX2xlMTYgICAgICAgdW5pdGxlc3MKICAqCiAgKiAgICAgIFF1YWxpdHkgb2YgQmFya2VyIGNvZGUgbG9jay4gVW5pdGxlc3MuIE1vbm90b25pY2FsbHkKICAqICAgICAgbm9uZGVjcmVhc2luZyB3aXRoICJiZXR0ZXIiIGxvY2sgc3RyZW5ndGguIENhbGxlZCAiU2lnbmFsCiAgKiAgICAgIFF1YWxpdHkiIGluIGRhdGFzaGVldHMuICAoSXMgdGhlcmUgYSBzdGFuZGFyZCB3YXkgdG8gbWVhc3VyZQogICogICAgICB0aGlzPykKICAqCi0gKiBJRUVFODAyMTFfUkFESU9UQVBfVFhfQVRURU5VQVRJT04gICAgdTE2ICAgICAgIHVuaXRsZXNzCisgKiBJRUVFODAyMTFfUkFESU9UQVBfVFhfQVRURU5VQVRJT04gICAgX19sZTE2ICAgICAgIHVuaXRsZXNzCiAgKgogICogICAgICBUcmFuc21pdCBwb3dlciBleHByZXNzZWQgYXMgdW5pdGxlc3MgZGlzdGFuY2UgZnJvbSBtYXgKICAqICAgICAgcG93ZXIgc2V0IGF0IGZhY3RvcnkgY2FsaWJyYXRpb24uICAwIGlzIG1heCBwb3dlci4KICAqICAgICAgTW9ub3RvbmljYWxseSBub25kZWNyZWFzaW5nIHdpdGggbG93ZXIgcG93ZXIgbGV2ZWxzLgogICoKLSAqIElFRUU4MDIxMV9SQURJT1RBUF9EQl9UWF9BVFRFTlVBVElPTiB1MTYgICAgICAgZGVjaWJlbHMgKGRCKQorICogSUVFRTgwMjExX1JBRElPVEFQX0RCX1RYX0FUVEVOVUFUSU9OIF9fbGUxNiAgICAgICBkZWNpYmVscyAoZEIpCiAgKgogICogICAgICBUcmFuc21pdCBwb3dlciBleHByZXNzZWQgYXMgZGVjaWJlbCBkaXN0YW5jZSBmcm9tIG1heCBwb3dlcgogICogICAgICBzZXQgYXQgZmFjdG9yeSBjYWxpYnJhdGlvbi4gIDAgaXMgbWF4IHBvd2VyLiAgTW9ub3RvbmljYWxseQogICogICAgICBub25kZWNyZWFzaW5nIHdpdGggbG93ZXIgcG93ZXIgbGV2ZWxzLgogICoKLSAqIElFRUU4MDIxMV9SQURJT1RBUF9EQk1fVFhfUE9XRVIgICAgICBpbnQ4X3QgICAgICAgICAgZGVjaWJlbHMgZnJvbQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmUgbWlsbGl3YXR0IChkQm0pCisgKiBJRUVFODAyMTFfUkFESU9UQVBfREJNX1RYX1BPV0VSICAgICAgczggICAgICAgICAgIGRlY2liZWxzIGZyb20KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25lIG1pbGxpd2F0dCAoZEJtKQogICoKICAqICAgICAgVHJhbnNtaXQgcG93ZXIgZXhwcmVzc2VkIGFzIGRCbSAoZGVjaWJlbHMgZnJvbSBhIDEgbWlsbGl3YXR0CiAgKiAgICAgIHJlZmVyZW5jZSkuIFRoaXMgaXMgdGhlIGFic29sdXRlIHBvd2VyIGxldmVsIG1lYXN1cmVkIGF0CiAgKiAgICAgIHRoZSBhbnRlbm5hIHBvcnQuCiAgKgotICogSUVFRTgwMjExX1JBRElPVEFQX0ZMQUdTICAgICAgICAgICAgIHU4ICAgICAgICBiaXRtYXAKKyAqIElFRUU4MDIxMV9SQURJT1RBUF9GTEFHUyAgICAgICAgICAgICB1OCAgICAgICAgICAgYml0bWFwCiAgKgogICogICAgICBQcm9wZXJ0aWVzIG9mIHRyYW5zbWl0dGVkIGFuZCByZWNlaXZlZCBmcmFtZXMuIFNlZSBmbGFncwogICogICAgICBkZWZpbmVkIGJlbG93LgogICoKLSAqIElFRUU4MDIxMV9SQURJT1RBUF9BTlRFTk5BICAgICAgICAgICB1OCAgICAgICAgYW50ZW5uYSBpbmRleAorICogSUVFRTgwMjExX1JBRElPVEFQX0FOVEVOTkEgICAgICAgICAgIHU4ICAgICAgICAgICBhbnRlbm5hIGluZGV4CiAgKgogICogICAgICBVbml0bGVzcyBpbmRpY2F0aW9uIG9mIHRoZSBSeC9UeCBhbnRlbm5hIGZvciB0aGlzIHBhY2tldC4KICAqICAgICAgVGhlIGZpcnN0IGFudGVubmEgaXMgYW50ZW5uYSAwLgogICoKLSAqIElFRUU4MDIxMV9SQURJT1RBUF9GQ1MgICAgICAgICAgIAl1MzIgICAgICAgZGF0YQorICogSUVFRTgwMjExX1JBRElPVEFQX1JYX0ZMQUdTICAgICAgICAgIF9fbGUxNiAgICAgICBiaXRtYXAKICAqCi0gKglGQ1MgZnJvbSBmcmFtZSBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIuCisgKiAgICAgUHJvcGVydGllcyBvZiByZWNlaXZlZCBmcmFtZXMuIFNlZSBmbGFncyBkZWZpbmVkIGJlbG93LgorICoKKyAqIElFRUU4MDIxMV9SQURJT1RBUF9UWF9GTEFHUyAgICAgICAgICBfX2xlMTYgICAgICAgYml0bWFwCisgKgorICogICAgIFByb3BlcnRpZXMgb2YgdHJhbnNtaXR0ZWQgZnJhbWVzLiBTZWUgZmxhZ3MgZGVmaW5lZCBiZWxvdy4KKyAqCisgKiBJRUVFODAyMTFfUkFESU9UQVBfUlRTX1JFVFJJRVMgICAgICAgdTggICAgICAgICAgIGRhdGEKKyAqCisgKiAgICAgTnVtYmVyIG9mIHJ0cyByZXRyaWVzIGEgdHJhbnNtaXR0ZWQgZnJhbWUgdXNlZC4KKyAqCisgKiBJRUVFODAyMTFfUkFESU9UQVBfREFUQV9SRVRSSUVTICAgICAgdTggICAgICAgICAgIGRhdGEKKyAqCisgKiAgICAgTnVtYmVyIG9mIHVuaWNhc3QgcmV0cmllcyBhIHRyYW5zbWl0dGVkIGZyYW1lIHVzZWQuCisgKgogICovCiBlbnVtIGllZWU4MDIxMV9yYWRpb3RhcF90eXBlIHsKIAlJRUVFODAyMTFfUkFESU9UQVBfVFNGVCA9IDAsCkBAIC0xODcsNyArMjAyLDExIEBACiAJSUVFRTgwMjExX1JBRElPVEFQX0FOVEVOTkEgPSAxMSwKIAlJRUVFODAyMTFfUkFESU9UQVBfREJfQU5UU0lHTkFMID0gMTIsCiAJSUVFRTgwMjExX1JBRElPVEFQX0RCX0FOVE5PSVNFID0gMTMsCi0JSUVFRTgwMjExX1JBRElPVEFQX0VYVCA9IDMxLAorCUlFRUU4MDIxMV9SQURJT1RBUF9SWF9GTEFHUyA9IDE0LAorCUlFRUU4MDIxMV9SQURJT1RBUF9UWF9GTEFHUyA9IDE1LAorCUlFRUU4MDIxMV9SQURJT1RBUF9SVFNfUkVUUklFUyA9IDE2LAorCUlFRUU4MDIxMV9SQURJT1RBUF9EQVRBX1JFVFJJRVMgPSAxNywKKwlJRUVFODAyMTFfUkFESU9UQVBfRVhUID0gMzEKIH07CiAKIC8qIENoYW5uZWwgZmxhZ3MuICovCkBAIC0yMTksNiArMjM4LDE0IEBACiAJCQkJCQkgKiA4MDIuMTEgaGVhZGVyIGFuZCBwYXlsb2FkCiAJCQkJCQkgKiAodG8gMzItYml0IGJvdW5kYXJ5KQogCQkJCQkJICovCisvKiBGb3IgSUVFRTgwMjExX1JBRElPVEFQX1JYX0ZMQUdTICovCisjZGVmaW5lIElFRUU4MDIxMV9SQURJT1RBUF9GX1JYX0JBREZDUwkweDAwMDEJLyogZnJhbWUgZmFpbGVkIGNyYyBjaGVjayAqLworCisvKiBGb3IgSUVFRTgwMjExX1JBRElPVEFQX1RYX0ZMQUdTICovCisjZGVmaW5lIElFRUU4MDIxMV9SQURJT1RBUF9GX1RYX0ZBSUwJMHgwMDAxCS8qIGZhaWxlZCBkdWUgdG8gZXhjZXNzaXZlCisJCQkJCQkgKiByZXRyaWVzICovCisjZGVmaW5lIElFRUU4MDIxMV9SQURJT1RBUF9GX1RYX0NUUwkweDAwMDIJLyogdXNlZCBjdHMgJ3Byb3RlY3Rpb24nICovCisjZGVmaW5lIElFRUU4MDIxMV9SQURJT1RBUF9GX1RYX1JUUwkweDAwMDQJLyogdXNlZCBydHMvY3RzIGhhbmRzaGFrZSAqLwogCiAvKiBVZ2x5IG1hY3JvIHRvIGNvbnZlcnQgbGl0ZXJhbCBjaGFubmVsIG51bWJlcnMgaW50byB0aGVpciBtaHogZXF1aXZhbGVudHMKICAqIFRoZXJlIGFyZSBjZXJ0aWFubHkgc29tZSBjb25kaXRpb25zIHRoYXQgd2lsbCBicmVhayB0aGlzIChsaWtlIGZlZWRpbmcgaXQgJzMwJykKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2luZXQ2X2hhc2h0YWJsZXMuaCBiL2luY2x1ZGUvbmV0L2luZXQ2X2hhc2h0YWJsZXMuaAppbmRleCBjMjhlNDI0Li42NjgwNTZiIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9pbmV0Nl9oYXNodGFibGVzLmgKKysrIGIvaW5jbHVkZS9uZXQvaW5ldDZfaGFzaHRhYmxlcy5oCkBAIC0xOSw2ICsxOSw5IEBACiAjaW5jbHVkZSA8bGludXgvaW42Lmg+CiAjaW5jbHVkZSA8bGludXgvaXB2Ni5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvamhhc2guaD4KKworI2luY2x1ZGUgPG5ldC9pbmV0X3NvY2suaD4KIAogI2luY2x1ZGUgPG5ldC9pcHY2Lmg+CiAKQEAgLTI4LDEyICszMSwxMSBAQAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgaW5ldDZfZWhhc2hmbihjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmxhZGRyLCBjb25zdCB1MTYgbHBvcnQsCiAJCQkJY29uc3Qgc3RydWN0IGluNl9hZGRyICpmYWRkciwgY29uc3QgX19iZTE2IGZwb3J0KQogewotCXVuc2lnbmVkIGludCBoYXNoZW50ID0gKGxwb3J0IF4gKF9fZm9yY2UgdTE2KWZwb3J0KTsKKwl1MzIgcG9ydHMgPSAobHBvcnQgXiAoX19mb3JjZSB1MTYpZnBvcnQpOwogCi0JaGFzaGVudCBePSAoX19mb3JjZSB1MzIpKGxhZGRyLT5zNl9hZGRyMzJbM10gXiBmYWRkci0+czZfYWRkcjMyWzNdKTsKLQloYXNoZW50IF49IGhhc2hlbnQgPj4gMTY7Ci0JaGFzaGVudCBePSBoYXNoZW50ID4+IDg7Ci0JcmV0dXJuIGhhc2hlbnQ7CisJcmV0dXJuIGpoYXNoXzN3b3JkcygoX19mb3JjZSB1MzIpbGFkZHItPnM2X2FkZHIzMlszXSwKKwkJCSAgICAoX19mb3JjZSB1MzIpZmFkZHItPnM2X2FkZHIzMlszXSwKKwkJCSAgICBwb3J0cywgaW5ldF9laGFzaF9zZWNyZXQpOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBpbmV0Nl9za19laGFzaGZuKGNvbnN0IHN0cnVjdCBzb2NrICpzaykKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2luZXRfZWNuLmggYi9pbmNsdWRlL25ldC9pbmV0X2Vjbi5oCmluZGV4IDEwMTE3YzguLmRlODM5OWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2luZXRfZWNuLmgKKysrIGIvaW5jbHVkZS9uZXQvaW5ldF9lY24uaApAQCAtMTE0LDEzICsxMTQsMTMgQEAKIHsKIAlzd2l0Y2ggKHNrYi0+cHJvdG9jb2wpIHsKIAljYXNlIF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfSVApOgotCQlpZiAoc2tiLT5uaC5yYXcgKyBzaXplb2Yoc3RydWN0IGlwaGRyKSA8PSBza2ItPnRhaWwpCi0JCQlyZXR1cm4gSVBfRUNOX3NldF9jZShza2ItPm5oLmlwaCk7CisJCWlmIChza2ItPm5ldHdvcmtfaGVhZGVyICsgc2l6ZW9mKHN0cnVjdCBpcGhkcikgPD0gc2tiLT50YWlsKQorCQkJcmV0dXJuIElQX0VDTl9zZXRfY2UoaXBfaGRyKHNrYikpOwogCQlicmVhazsKIAogCWNhc2UgX19jb25zdGFudF9odG9ucyhFVEhfUF9JUFY2KToKLQkJaWYgKHNrYi0+bmgucmF3ICsgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSA8PSBza2ItPnRhaWwpCi0JCQlyZXR1cm4gSVA2X0VDTl9zZXRfY2Uoc2tiLT5uaC5pcHY2aCk7CisJCWlmIChza2ItPm5ldHdvcmtfaGVhZGVyICsgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSA8PSBza2ItPnRhaWwpCisJCQlyZXR1cm4gSVA2X0VDTl9zZXRfY2UoaXB2Nl9oZHIoc2tiKSk7CiAJCWJyZWFrOwogCX0KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvaW5ldF9zb2NrLmggYi9pbmNsdWRlL25ldC9pbmV0X3NvY2suaAppbmRleCBjZTZkYTk3Li42MmRhZjIxIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9pbmV0X3NvY2suaAorKysgYi9pbmNsdWRlL25ldC9pbmV0X3NvY2suaApAQCAtMTksNiArMTksNyBAQAogCiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9qaGFzaC5oPgogCiAjaW5jbHVkZSA8bmV0L2Zsb3cuaD4KICNpbmNsdWRlIDxuZXQvc29jay5oPgpAQCAtMTY3LDEzICsxNjgsMTUgQEAKIAogZXh0ZXJuIGludCBpbmV0X3NrX3JlYnVpbGRfaGVhZGVyKHN0cnVjdCBzb2NrICpzayk7CiAKK2V4dGVybiB1MzIgaW5ldF9laGFzaF9zZWNyZXQ7CitleHRlcm4gdm9pZCBidWlsZF9laGFzaF9zZWNyZXQodm9pZCk7CisKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGluZXRfZWhhc2hmbihjb25zdCBfX2JlMzIgbGFkZHIsIGNvbnN0IF9fdTE2IGxwb3J0LAogCQkJCQljb25zdCBfX2JlMzIgZmFkZHIsIGNvbnN0IF9fYmUxNiBmcG9ydCkKIHsKLQl1bnNpZ25lZCBpbnQgaCA9ICgoX19mb3JjZSBfX3UzMilsYWRkciBeIGxwb3J0KSBeICgoX19mb3JjZSBfX3UzMilmYWRkciBeIChfX2ZvcmNlIF9fdTMyKWZwb3J0KTsKLQloIF49IGggPj4gMTY7Ci0JaCBePSBoID4+IDg7Ci0JcmV0dXJuIGg7CisJcmV0dXJuIGpoYXNoXzJ3b3JkcygoX19mb3JjZSBfX3UzMikgbGFkZHIgXiAoX19mb3JjZSBfX3UzMikgZmFkZHIsCisJCQkgICAgKChfX3UzMikgbHBvcnQpIDw8IDE2IHwgKF9fZm9yY2UgX191MzIpZnBvcnQsCisJCQkgICAgaW5ldF9laGFzaF9zZWNyZXQpOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBpbmV0X3NrX2VoYXNoZm4oY29uc3Qgc3RydWN0IHNvY2sgKnNrKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvaXAuaCBiL2luY2x1ZGUvbmV0L2lwLmgKaW5kZXggZTc5YzNlMy4uYmIyMDdkYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvaXAuaAorKysgYi9pbmNsdWRlL25ldC9pcC5oCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9pcC5oPgogI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAKICNpbmNsdWRlIDxuZXQvaW5ldF9zb2NrLmg+CiAjaW5jbHVkZSA8bmV0L3NubXAuaD4KQEAgLTQzLDYgKzQ0LDExIEBACiAjZGVmaW5lIElQU0tCX1JFUk9VVEVECQkxNgogfTsKIAorc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgaXBfaGRybGVuKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIGlwX2hkcihza2IpLT5paGwgKiA0OworfQorCiBzdHJ1Y3QgaXBjbV9jb29raWUKIHsKIAlfX2JlMzIJCQlhZGRyOwpAQCAtNzQsNyArODAsNiBAQAogc3RydWN0IG5ldF9kZXZpY2U7CiBzdHJ1Y3QgcGFja2V0X3R5cGU7CiBzdHJ1Y3QgcnRhYmxlOwotc3RydWN0IHNrX2J1ZmY7CiBzdHJ1Y3Qgc29ja2FkZHI7CiAKIGV4dGVybiB2b2lkCQlpcF9tY19kcm9wc29ja2V0KHN0cnVjdCBzb2NrICopOwpAQCAtMTYxLDYgKzE2NiwxMCBAQAogI2RlZmluZSBORVRfQUREX1NUQVRTX0JIKGZpZWxkLCBhZG5kKQlTTk1QX0FERF9TVEFUU19CSChuZXRfc3RhdGlzdGljcywgZmllbGQsIGFkbmQpCiAjZGVmaW5lIE5FVF9BRERfU1RBVFNfVVNFUihmaWVsZCwgYWRuZCkJU05NUF9BRERfU1RBVFNfVVNFUihuZXRfc3RhdGlzdGljcywgZmllbGQsIGFkbmQpCiAKK2V4dGVybiB1bnNpZ25lZCBsb25nIHNubXBfZm9sZF9maWVsZCh2b2lkICptaWJbXSwgaW50IG9mZnQpOworZXh0ZXJuIGludCBzbm1wX21pYl9pbml0KHZvaWQgKnB0clsyXSwgc2l6ZV90IG1pYnNpemUsIHNpemVfdCBtaWJhbGlnbik7CitleHRlcm4gdm9pZCBzbm1wX21pYl9mcmVlKHZvaWQgKnB0clsyXSk7CisKIGV4dGVybiBpbnQgc3lzY3RsX2xvY2FsX3BvcnRfcmFuZ2VbMl07CiBleHRlcm4gaW50IHN5c2N0bF9pcF9kZWZhdWx0X3R0bDsKIGV4dGVybiBpbnQgc3lzY3RsX2lwX25vbmxvY2FsX2JpbmQ7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pcDZfZmliLmggYi9pbmNsdWRlL25ldC9pcDZfZmliLmgKaW5kZXggY2YzNTVhMy4uYzQ4ZWE4NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvaXA2X2ZpYi5oCisrKyBiL2luY2x1ZGUvbmV0L2lwNl9maWIuaApAQCAtMjE5LDggKzIxOSw2IEBACiAKIGV4dGVybiB2b2lkCQkJZmliNl9ydWxlc19pbml0KHZvaWQpOwogZXh0ZXJuIHZvaWQJCQlmaWI2X3J1bGVzX2NsZWFudXAodm9pZCk7Ci1leHRlcm4gaW50CQkJZmliNl9ydWxlc19kdW1wKHN0cnVjdCBza19idWZmICosCi0JCQkJCQlzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqKTsKIAogI2VuZGlmCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2lwNl9yb3V0ZS5oIGIvaW5jbHVkZS9uZXQvaXA2X3JvdXRlLmgKaW5kZXggNGU5MjdlYi4uNTQ1NmZkZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvaXA2X3JvdXRlLmgKKysrIGIvaW5jbHVkZS9uZXQvaXA2X3JvdXRlLmgKQEAgLTExNiwxMiArMTE2LDcgQEAKIAkJCQkJCSAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkJCQkgICB1MzIgcG10dSk7CiAKLXN0cnVjdCBubG1zZ2hkcjsKIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrOwotZXh0ZXJuIGludCBpbmV0Nl9kdW1wX2ZpYihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpOwotZXh0ZXJuIGludCBpbmV0Nl9ydG1fbmV3cm91dGUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5sbXNnaGRyKiBubGgsIHZvaWQgKmFyZyk7Ci1leHRlcm4gaW50IGluZXQ2X3J0bV9kZWxyb3V0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgbmxtc2doZHIqIG5saCwgdm9pZCAqYXJnKTsKLWV4dGVybiBpbnQgaW5ldDZfcnRtX2dldHJvdXRlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBubG1zZ2hkciogbmxoLCB2b2lkICphcmcpOwogCiBzdHJ1Y3QgcnQ2X3J0bmxfZHVtcF9hcmcKIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2lwX2ZpYi5oIGIvaW5jbHVkZS9uZXQvaXBfZmliLmgKaW5kZXggMzZjNjM1Yy4uNWE0YTAzNjYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2lwX2ZpYi5oCisrKyBiL2luY2x1ZGUvbmV0L2lwX2ZpYi5oCkBAIC0yMTUsMTAgKzIxNSw2IEBACiAvKiBFeHBvcnRlZCBieSBmaWJfZnJvbnRlbmQuYyAqLwogZXh0ZXJuIHN0cnVjdCBubGFfcG9saWN5IHJ0bV9pcHY0X3BvbGljeVtdOwogZXh0ZXJuIHZvaWQJCWlwX2ZpYl9pbml0KHZvaWQpOwotZXh0ZXJuIGludCBpbmV0X3J0bV9kZWxyb3V0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgbmxtc2doZHIqIG5saCwgdm9pZCAqYXJnKTsKLWV4dGVybiBpbnQgaW5ldF9ydG1fbmV3cm91dGUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5sbXNnaGRyKiBubGgsIHZvaWQgKmFyZyk7Ci1leHRlcm4gaW50IGluZXRfcnRtX2dldHJvdXRlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBubG1zZ2hkciogbmxoLCB2b2lkICphcmcpOwotZXh0ZXJuIGludCBpbmV0X2R1bXBfZmliKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYik7CiBleHRlcm4gaW50IGZpYl92YWxpZGF0ZV9zb3VyY2UoX19iZTMyIHNyYywgX19iZTMyIGRzdCwgdTggdG9zLCBpbnQgb2lmLAogCQkJICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIF9fYmUzMiAqc3BlY19kc3QsIHUzMiAqaXRhZyk7CiBleHRlcm4gdm9pZCBmaWJfc2VsZWN0X211bHRpcGF0aChjb25zdCBzdHJ1Y3QgZmxvd2kgKmZscCwgc3RydWN0IGZpYl9yZXN1bHQgKnJlcyk7CkBAIC0yMzUsOCArMjMxLDYgQEAKIGV4dGVybiBzdHJ1Y3QgZmliX3RhYmxlICpmaWJfaGFzaF9pbml0KHUzMiBpZCk7CiAKICNpZmRlZiBDT05GSUdfSVBfTVVMVElQTEVfVEFCTEVTCi1leHRlcm4gaW50IGZpYjRfcnVsZXNfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpOwotCiBleHRlcm4gdm9pZCBfX2luaXQgZmliNF9ydWxlc19pbml0KHZvaWQpOwogCiAjaWZkZWYgQ09ORklHX05FVF9DTFNfUk9VVEUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2lwdjYuaCBiL2luY2x1ZGUvbmV0L2lwdjYuaAppbmRleCAwMDMyOGI3Li5mNzBhZmVmIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9pcHY2LmgKKysrIGIvaW5jbHVkZS9uZXQvaXB2Ni5oCkBAIC0xNjYsMTMgKzE2Niw2IEBACiAJaWYgKGlzX3VkcGxpdGUpIFNOTVBfSU5DX1NUQVRTX1VTRVIodWRwbGl0ZV9zdGF0c19pbjYsIGZpZWxkKTsgICAgICAgICBcCiAJZWxzZQkJU05NUF9JTkNfU1RBVFNfVVNFUih1ZHBfc3RhdHNfaW42LCBmaWVsZCk7ICAgIH0gd2hpbGUoMCkKIAotaW50IHNubXA2X3JlZ2lzdGVyX2RldihzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2KTsKLWludCBzbm1wNl91bnJlZ2lzdGVyX2RldihzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2KTsKLWludCBzbm1wNl9hbGxvY19kZXYoc3RydWN0IGluZXQ2X2RldiAqaWRldik7Ci1pbnQgc25tcDZfZnJlZV9kZXYoc3RydWN0IGluZXQ2X2RldiAqaWRldik7Ci1pbnQgc25tcDZfbWliX2luaXQodm9pZCAqcHRyWzJdLCBzaXplX3QgbWlic2l6ZSwgc2l6ZV90IG1pYmFsaWduKTsKLXZvaWQgc25tcDZfbWliX2ZyZWUodm9pZCAqcHRyWzJdKTsKLQogc3RydWN0IGlwNl9yYV9jaGFpbgogewogCXN0cnVjdCBpcDZfcmFfY2hhaW4JKm5leHQ7CkBAIC02MDUsOCArNTk4LDIwIEBACiBleHRlcm4gdm9pZCB1ZHBsaXRlNl9wcm9jX2V4aXQodm9pZCk7CiBleHRlcm4gaW50ICBpcHY2X21pc2NfcHJvY19pbml0KHZvaWQpOwogZXh0ZXJuIHZvaWQgaXB2Nl9taXNjX3Byb2NfZXhpdCh2b2lkKTsKK2V4dGVybiBpbnQgc25tcDZfcmVnaXN0ZXJfZGV2KHN0cnVjdCBpbmV0Nl9kZXYgKmlkZXYpOworZXh0ZXJuIGludCBzbm1wNl91bnJlZ2lzdGVyX2RldihzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2KTsKIAogZXh0ZXJuIHN0cnVjdCBydDZfc3RhdGlzdGljcyBydDZfc3RhdHM7CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgc25tcDZfcmVnaXN0ZXJfZGV2KHN0cnVjdCBpbmV0Nl9kZXYgKmlkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHNubXA2X3VucmVnaXN0ZXJfZGV2KHN0cnVjdCBpbmV0Nl9kZXYgKmlkZXYpCit7CisJcmV0dXJuIDA7Cit9CiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19TWVNDVEwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2lweC5oIGIvaW5jbHVkZS9uZXQvaXB4LmgKaW5kZXggYzZiMmVlNi4uNGNjMGI0ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvaXB4LmgKKysrIGIvaW5jbHVkZS9uZXQvaXB4LmgKQEAgLTQzLDcgKzQzLDcgQEAKIAogc3RhdGljIF9faW5saW5lX18gc3RydWN0IGlweGhkciAqaXB4X2hkcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXJldHVybiAoc3RydWN0IGlweGhkciAqKXNrYi0+aC5yYXc7CisJcmV0dXJuIChzdHJ1Y3QgaXB4aGRyICopc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKIH0KIAogc3RydWN0IGlweF9pbnRlcmZhY2UgewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvaXVjdi9pdWN2LmggYi9pbmNsdWRlL25ldC9pdWN2L2l1Y3YuaAppbmRleCA3NDZlNzQxLi5mZDcwYWRiIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9pdWN2L2l1Y3YuaAorKysgYi9pbmNsdWRlL25ldC9pdWN2L2l1Y3YuaApAQCAtMTYsNyArMTYsNyBAQAogICogY29tcGxldGVkIGEgcmVnaXN0ZXIsIGl0IGNhbiBleHBsb2l0IHRoZSBvdGhlciBmdW5jdGlvbnMuCiAgKiBGb3IgZnVydGh1ciByZWZlcmVuY2Ugb24gYWxsIElVQ1YgZnVuY3Rpb25hbGl0eSwgcmVmZXIgdG8gdGhlCiAgKiBDUCBQcm9ncmFtbWluZyBTZXJ2aWNlcyBib29rLCBhbHNvIGF2YWlsYWJsZSBvbiB0aGUgd2ViIHRocnUKLSAqIHd3dy5pYm0uY29tL3MzOTAvdm0vcHVicywgbWFudWFsICMgU0MyNC01NzYwCisgKiB3d3cudm0uaWJtLmNvbS9wdWJzLCBtYW51YWwgIyBTQzI0LTYwODQKICAqCiAgKiBEZWZpbml0aW9uIG9mIFJldHVybiBDb2RlcwogICogLSBBbGwgcG9zaXRpdmUgcmV0dXJuIGNvZGVzIGluY2x1ZGluZyB6ZXJvIGFyZSByZWZsZWN0ZWQgYmFjawpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvaXdfaGFuZGxlci5oIGIvaW5jbHVkZS9uZXQvaXdfaGFuZGxlci5oCmluZGV4IDhhODMwMTguLmYyM2QwN2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2l3X2hhbmRsZXIuaAorKysgYi9pbmNsdWRlL25ldC9pd19oYW5kbGVyLmgKQEAgLTQzMSwyNiArNDMxLDcgQEAKICAqIFRob3NlIG1heSBiZSBjYWxsZWQgb25seSB3aXRoaW4gdGhlIGtlcm5lbC4KICAqLwogCi0vKiBGaXJzdCA6IGZ1bmN0aW9uIHN0cmljdGx5IHVzZWQgaW5zaWRlIHRoZSBrZXJuZWwgKi8KLQotLyogSGFuZGxlIC9wcm9jL25ldC93aXJlbGVzcywgY2FsbGVkIGluIG5ldC9jb2RlL2Rldi5jICovCi1leHRlcm4gaW50IGRldl9nZXRfd2lyZWxlc3NfaW5mbyhjaGFyICogYnVmZmVyLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwKLQkJCQkgaW50IGxlbmd0aCk7Ci0KLS8qIEhhbmRsZSBJT0NUTHMsIGNhbGxlZCBpbiBuZXQvY29yZS9kZXYuYyAqLwotZXh0ZXJuIGludCB3aXJlbGVzc19wcm9jZXNzX2lvY3RsKHN0cnVjdCBpZnJlcSAqaWZyLCB1bnNpZ25lZCBpbnQgY21kKTsKLQotLyogSGFuZGxlIFJ0TmV0bGluayByZXF1ZXN0cywgY2FsbGVkIGluIG5ldC9jb3JlL3J0bmV0bGluay5jICovCi1leHRlcm4gaW50IHdpcmVsZXNzX3J0bmV0bGlua19zZXQoc3RydWN0IG5ldF9kZXZpY2UgKglkZXYsCi0JCQkJICBjaGFyICoJCWRhdGEsCi0JCQkJICBpbnQJCQlsZW4pOwotZXh0ZXJuIGludCB3aXJlbGVzc19ydG5ldGxpbmtfZ2V0KHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2LAotCQkJCSAgY2hhciAqCQlkYXRhLAotCQkJCSAgaW50CQkJbGVuLAotCQkJCSAgY2hhciAqKgkJcF9idWYsCi0JCQkJICBpbnQgKgkJCXBfbGVuKTsKLQotLyogU2Vjb25kIDogZnVuY3Rpb25zIHRoYXQgbWF5IGJlIGNhbGxlZCBieSBkcml2ZXIgbW9kdWxlcyAqLworLyogZnVuY3Rpb25zIHRoYXQgbWF5IGJlIGNhbGxlZCBieSBkcml2ZXIgbW9kdWxlcyAqLwogCiAvKiBTZW5kIGEgc2luZ2xlIGV2ZW50IHRvIHVzZXIgc3BhY2UgKi8KIGV4dGVybiB2b2lkIHdpcmVsZXNzX3NlbmRfZXZlbnQoc3RydWN0IG5ldF9kZXZpY2UgKglkZXYsCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9sbGNfcGR1LmggYi9pbmNsdWRlL25ldC9sbGNfcGR1LmgKaW5kZXggYWEzM2E0Ny4uNGE4ZjU4YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbGxjX3BkdS5oCisrKyBiL2luY2x1ZGUvbmV0L2xsY19wZHUuaApAQCAtMjAzLDcgKzIwMyw3IEBACiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGxsY19wZHVfc24gKmxsY19wZHVfc25faGRyKHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JcmV0dXJuIChzdHJ1Y3QgbGxjX3BkdV9zbiAqKXNrYi0+bmgucmF3OworCXJldHVybiAoc3RydWN0IGxsY19wZHVfc24gKilza2JfbmV0d29ya19oZWFkZXIoc2tiKTsKIH0KIAogLyogVW4tbnVtYmVyZWQgUERVIGZvcm1hdCAoMyBieXRlcyBpbiBsZW5ndGgpICovCkBAIC0yMTUsMTIgKzIxNSw3IEBACiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGxsY19wZHVfdW4gKmxsY19wZHVfdW5faGRyKHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JcmV0dXJuIChzdHJ1Y3QgbGxjX3BkdV91biAqKXNrYi0+bmgucmF3OwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgKmxsY19zZXRfcGR1X2hkcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB2b2lkICpwdHIpCi17Ci0JcmV0dXJuIHNrYi0+bmgucmF3ID0gcHRyOworCXJldHVybiAoc3RydWN0IGxsY19wZHVfdW4gKilza2JfbmV0d29ya19oZWFkZXIoc2tiKTsKIH0KIAogLyoqCkBAIC0yMzcsNyArMjMyLDExIEBACiAJCQkJICAgICAgIHU4IHNzYXAsIHU4IGRzYXAsIHU4IGNyKQogewogCWNvbnN0IGludCBobGVuID0gdHlwZSA9PSBMTENfUERVX1RZUEVfVSA/IDMgOiA0OwotCXN0cnVjdCBsbGNfcGR1X3VuICpwZHUgPSBsbGNfc2V0X3BkdV9oZHIoc2tiLCBza2JfcHVzaChza2IsIGhsZW4pKTsKKwlzdHJ1Y3QgbGxjX3BkdV91biAqcGR1OworCisJc2tiX3B1c2goc2tiLCBobGVuKTsKKwlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiKTsKKwlwZHUgPSBsbGNfcGR1X3VuX2hkcihza2IpOwogCXBkdS0+ZHNhcCA9IGRzYXA7CiAJcGR1LT5zc2FwID0gc3NhcDsKIAlwZHUtPnNzYXAgfD0gY3I7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZWlnaGJvdXIuaCBiL2luY2x1ZGUvbmV0L25laWdoYm91ci5oCmluZGV4IGFkN2ZlMTEuLmE0ZjI2MTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25laWdoYm91ci5oCisrKyBiL2luY2x1ZGUvbmV0L25laWdoYm91ci5oCkBAIC0yNCw2ICsyNCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KKyNpbmNsdWRlIDxuZXQvcnRuZXRsaW5rLmg+CiAKICNkZWZpbmUgTlVEX0lOX1RJTUVSCShOVURfSU5DT01QTEVURXxOVURfUkVBQ0hBQkxFfE5VRF9ERUxBWXxOVURfUFJPQkUpCiAjZGVmaW5lIE5VRF9WQUxJRAkoTlVEX1BFUk1BTkVOVHxOVURfTk9BUlB8TlVEX1JFQUNIQUJMRXxOVURfUFJPQkV8TlVEX1NUQUxFfE5VRF9ERUxBWSkKQEAgLTIxMywxNiArMjE0LDcgQEAKIGV4dGVybiBzdHJ1Y3QgcG5laWdoX2VudHJ5CSpwbmVpZ2hfbG9va3VwKHN0cnVjdCBuZWlnaF90YWJsZSAqdGJsLCBjb25zdCB2b2lkICprZXksIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjcmVhdCk7CiBleHRlcm4gaW50CQkJcG5laWdoX2RlbGV0ZShzdHJ1Y3QgbmVpZ2hfdGFibGUgKnRibCwgY29uc3Qgdm9pZCAqa2V5LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIAotc3RydWN0IG5ldGxpbmtfY2FsbGJhY2s7Ci1zdHJ1Y3Qgbmxtc2doZHI7Ci1leHRlcm4gaW50IG5laWdoX2R1bXBfaW5mbyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpOwotZXh0ZXJuIGludCBuZWlnaF9hZGQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5sbXNnaGRyICpubGgsIHZvaWQgKmFyZyk7Ci1leHRlcm4gaW50IG5laWdoX2RlbGV0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgdm9pZCAqYXJnKTsKIGV4dGVybiB2b2lkIG5laWdoX2FwcF9ucyhzdHJ1Y3QgbmVpZ2hib3VyICpuKTsKLQotZXh0ZXJuIGludCBuZWlnaHRibF9kdW1wX2luZm8oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKTsKLWV4dGVybiBpbnQgbmVpZ2h0Ymxfc2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBubG1zZ2hkciAqbmxoLCB2b2lkICphcmcpOwotCiBleHRlcm4gdm9pZCBuZWlnaF9mb3JfZWFjaChzdHJ1Y3QgbmVpZ2hfdGFibGUgKnRibCwgdm9pZCAoKmNiKShzdHJ1Y3QgbmVpZ2hib3VyICosIHZvaWQgKiksIHZvaWQgKmNvb2tpZSk7CiBleHRlcm4gdm9pZCBfX25laWdoX2Zvcl9lYWNoX3JlbGVhc2Uoc3RydWN0IG5laWdoX3RhYmxlICp0YmwsIGludCAoKmNiKShzdHJ1Y3QgbmVpZ2hib3VyICopKTsKIGV4dGVybiB2b2lkIHBuZWlnaF9mb3JfZWFjaChzdHJ1Y3QgbmVpZ2hfdGFibGUgKnRibCwgdm9pZCAoKmNiKShzdHJ1Y3QgcG5laWdoX2VudHJ5ICopKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2suaCBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2suaAppbmRleCAwZTY5MGUzLi4xYzZiOGJkIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrLmgKKysrIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oCkBAIC0yNTAsNiArMjUwLDExIEBACiAJcmV0dXJuIHRlc3RfYml0KElQU19EWUlOR19CSVQsICZjdC0+c3RhdHVzKTsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgbmZfY3RfaXNfdW50cmFja2VkKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIChza2ItPm5mY3QgPT0gJm5mX2Nvbm50cmFja191bnRyYWNrZWQuY3RfZ2VuZXJhbCk7Cit9CisKIGV4dGVybiB1bnNpZ25lZCBpbnQgbmZfY29ubnRyYWNrX2h0YWJsZV9zaXplOwogZXh0ZXJuIGludCBuZl9jb25udHJhY2tfY2hlY2tzdW07CiBleHRlcm4gYXRvbWljX3QgbmZfY29ubnRyYWNrX2NvdW50OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb21wYXQuaCBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29tcGF0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmODRjMWYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb21wYXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0jaWZuZGVmIF9ORl9DT05OVFJBQ0tfQ09NUEFUX0gKLSNkZWZpbmUgX05GX0NPTk5UUkFDS19DT01QQVRfSAotCi0jaWZkZWYgX19LRVJORUxfXwotCi0jaWYgZGVmaW5lZChDT05GSUdfSVBfTkZfQ09OTlRSQUNLKSB8fCBkZWZpbmVkKENPTkZJR19JUF9ORl9DT05OVFJBQ0tfTU9EVUxFKQotCi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrLmg+Ci0jaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+Ci0KLSNpZmRlZiBDT05GSUdfSVBfTkZfQ09OTlRSQUNLX01BUksKLXN0YXRpYyBpbmxpbmUgdV9pbnQzMl90ICpuZl9jdF9nZXRfbWFyayhjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCQl1X2ludDMyX3QgKmN0aW5mbykKLXsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCA9IGlwX2Nvbm50cmFja19nZXQoc2tiLCBjdGluZm8pOwotCi0JaWYgKGN0KQotCQlyZXR1cm4gJmN0LT5tYXJrOwotCWVsc2UKLQkJcmV0dXJuIE5VTEw7Ci19Ci0jZW5kaWYgLyogQ09ORklHX0lQX05GX0NPTk5UUkFDS19NQVJLICovCi0KLSNpZmRlZiBDT05GSUdfSVBfTkZfQ09OTlRSQUNLX1NFQ01BUksKLXN0YXRpYyBpbmxpbmUgdV9pbnQzMl90ICpuZl9jdF9nZXRfc2VjbWFyayhjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCQkgICB1X2ludDMyX3QgKmN0aW5mbykKLXsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCA9IGlwX2Nvbm50cmFja19nZXQoc2tiLCBjdGluZm8pOwotCi0JaWYgKGN0KQotCQlyZXR1cm4gJmN0LT5zZWNtYXJrOwotCWVsc2UKLQkJcmV0dXJuIE5VTEw7Ci19Ci0jZW5kaWYgLyogQ09ORklHX0lQX05GX0NPTk5UUkFDS19TRUNNQVJLICovCi0KLSNpZmRlZiBDT05GSUdfSVBfTkZfQ1RfQUNDVAotc3RhdGljIGlubGluZSBzdHJ1Y3QgaXBfY29ubnRyYWNrX2NvdW50ZXIgKgotbmZfY3RfZ2V0X2NvdW50ZXJzKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCi17Ci0JZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm87Ci0Jc3RydWN0IGlwX2Nvbm50cmFjayAqY3QgPSBpcF9jb25udHJhY2tfZ2V0KHNrYiwgJmN0aW5mbyk7Ci0KLQlpZiAoY3QpCi0JCXJldHVybiBjdC0+Y291bnRlcnM7Ci0JZWxzZQotCQlyZXR1cm4gTlVMTDsKLX0KLSNlbmRpZiAvKiBDT05GSUdfSVBfTkZfQ1RfQUNDVCAqLwotCi1zdGF0aWMgaW5saW5lIGludCBuZl9jdF9pc191bnRyYWNrZWQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlyZXR1cm4gKHNrYi0+bmZjdCA9PSAmaXBfY29ubnRyYWNrX3VudHJhY2tlZC5jdF9nZW5lcmFsKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIG5mX2N0X3VudHJhY2soc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlza2ItPm5mY3QgPSAmaXBfY29ubnRyYWNrX3VudHJhY2tlZC5jdF9nZW5lcmFsOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBuZl9jdF9nZXRfY3RpbmZvKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyAqY3RpbmZvKQotewotCXN0cnVjdCBpcF9jb25udHJhY2sgKmN0ID0gaXBfY29ubnRyYWNrX2dldChza2IsIGN0aW5mbyk7Ci0JcmV0dXJuIChjdCAhPSBOVUxMKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgbmZfY3RfbDNwcm90b190cnlfbW9kdWxlX2dldCh1bnNpZ25lZCBzaG9ydCBsM3Byb3RvKQotewotCW5lZWRfY29ubnRyYWNrKCk7Ci0JcmV0dXJuIGwzcHJvdG8gPT0gUEZfSU5FVCA/IDAgOiAtMTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIG5mX2N0X2wzcHJvdG9fbW9kdWxlX3B1dCh1bnNpZ25lZCBzaG9ydCBsM3Byb3RvKQotewotfQotCi0jZWxzZSAvKiBDT05GSUdfSVBfTkZfQ09OTlRSQUNLICovCi0KLSNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL2lwdjQvbmZfY29ubnRyYWNrX2lwdjQuaD4KLSNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oPgotCi0jaWZkZWYgQ09ORklHX05GX0NPTk5UUkFDS19NQVJLCi0KLXN0YXRpYyBpbmxpbmUgdV9pbnQzMl90ICpuZl9jdF9nZXRfbWFyayhjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCQl1X2ludDMyX3QgKmN0aW5mbykKLXsKLQlzdHJ1Y3QgbmZfY29ubiAqY3QgPSBuZl9jdF9nZXQoc2tiLCBjdGluZm8pOwotCi0JaWYgKGN0KQotCQlyZXR1cm4gJmN0LT5tYXJrOwotCWVsc2UKLQkJcmV0dXJuIE5VTEw7Ci19Ci0jZW5kaWYgLyogQ09ORklHX05GX0NPTk5UUkFDS19NQVJLICovCi0KLSNpZmRlZiBDT05GSUdfTkZfQ09OTlRSQUNLX1NFQ01BUksKLXN0YXRpYyBpbmxpbmUgdV9pbnQzMl90ICpuZl9jdF9nZXRfc2VjbWFyayhjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCQkgICB1X2ludDMyX3QgKmN0aW5mbykKLXsKLQlzdHJ1Y3QgbmZfY29ubiAqY3QgPSBuZl9jdF9nZXQoc2tiLCBjdGluZm8pOwotCi0JaWYgKGN0KQotCQlyZXR1cm4gJmN0LT5zZWNtYXJrOwotCWVsc2UKLQkJcmV0dXJuIE5VTEw7Ci19Ci0jZW5kaWYgLyogQ09ORklHX05GX0NPTk5UUkFDS19NQVJLICovCi0KLSNpZmRlZiBDT05GSUdfTkZfQ1RfQUNDVAotc3RhdGljIGlubGluZSBzdHJ1Y3QgaXBfY29ubnRyYWNrX2NvdW50ZXIgKgotbmZfY3RfZ2V0X2NvdW50ZXJzKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCi17Ci0JZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm87Ci0Jc3RydWN0IG5mX2Nvbm4gKmN0ID0gbmZfY3RfZ2V0KHNrYiwgJmN0aW5mbyk7Ci0KLQlpZiAoY3QpCi0JCXJldHVybiBjdC0+Y291bnRlcnM7Ci0JZWxzZQotCQlyZXR1cm4gTlVMTDsKLX0KLSNlbmRpZiAvKiBDT05GSUdfTkZfQ1RfQUNDVCAqLwotCi1zdGF0aWMgaW5saW5lIGludCBuZl9jdF9pc191bnRyYWNrZWQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlyZXR1cm4gKHNrYi0+bmZjdCA9PSAmbmZfY29ubnRyYWNrX3VudHJhY2tlZC5jdF9nZW5lcmFsKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIG5mX2N0X3VudHJhY2soc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlza2ItPm5mY3QgPSAmbmZfY29ubnRyYWNrX3VudHJhY2tlZC5jdF9nZW5lcmFsOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBuZl9jdF9nZXRfY3RpbmZvKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyAqY3RpbmZvKQotewotCXN0cnVjdCBuZl9jb25uICpjdCA9IG5mX2N0X2dldChza2IsIGN0aW5mbyk7Ci0JcmV0dXJuIChjdCAhPSBOVUxMKTsKLX0KLQotI2VuZGlmIC8qIENPTkZJR19JUF9ORl9DT05OVFJBQ0sgKi8KLQotI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KLQotI2VuZGlmIC8qIF9ORl9DT05OVFJBQ0tfQ09NUEFUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29yZS5oIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb3JlLmgKaW5kZXggODU2MzRlMS4uOWZiOTA2NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb3JlLmgKKysrIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb3JlLmgKQEAgLTI3LDYgKzI3LDkgQEAKIGV4dGVybiBpbnQgbmZfY29ubnRyYWNrX2luaXQodm9pZCk7CiBleHRlcm4gdm9pZCBuZl9jb25udHJhY2tfY2xlYW51cCh2b2lkKTsKIAorZXh0ZXJuIGludCBuZl9jb25udHJhY2tfcHJvdG9faW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIG5mX2Nvbm50cmFja19wcm90b19maW5pKHZvaWQpOworCiBzdHJ1Y3QgbmZfY29ubnRyYWNrX2wzcHJvdG87CiBleHRlcm4gc3RydWN0IG5mX2Nvbm50cmFja19sM3Byb3RvICpuZl9jdF9maW5kX2wzcHJvdG8odV9pbnQxNl90IHBmKTsKIC8qIExpa2UgYWJvdmUsIGJ1dCB5b3UgYWxyZWFkeSBoYXZlIGNvbm50cmFjayByZWFkIGxvY2suICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2VjYWNoZS5oIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19lY2FjaGUuaAppbmRleCBiNjJhOGE5Li44MTFjOTA3IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2VjYWNoZS5oCisrKyBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZWNhY2hlLmgKQEAgLTIwLDMwICsyMCw4IEBACiAjZGVmaW5lIENPTk5UUkFDS19FQ0FDSEUoeCkJKF9fZ2V0X2NwdV92YXIobmZfY29ubnRyYWNrX2VjYWNoZSkueCkKIAogZXh0ZXJuIHN0cnVjdCBhdG9taWNfbm90aWZpZXJfaGVhZCBuZl9jb25udHJhY2tfY2hhaW47Ci1leHRlcm4gc3RydWN0IGF0b21pY19ub3RpZmllcl9oZWFkIG5mX2Nvbm50cmFja19leHBlY3RfY2hhaW47Ci0KLXN0YXRpYyBpbmxpbmUgaW50IG5mX2Nvbm50cmFja19yZWdpc3Rlcl9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKQotewotCXJldHVybiBhdG9taWNfbm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIoJm5mX2Nvbm50cmFja19jaGFpbiwgbmIpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBuZl9jb25udHJhY2tfdW5yZWdpc3Rlcl9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKQotewotCXJldHVybiBhdG9taWNfbm90aWZpZXJfY2hhaW5fdW5yZWdpc3RlcigmbmZfY29ubnRyYWNrX2NoYWluLCBuYik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1uZl9jb25udHJhY2tfZXhwZWN0X3JlZ2lzdGVyX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpCi17Ci0JcmV0dXJuIGF0b21pY19ub3RpZmllcl9jaGFpbl9yZWdpc3RlcigmbmZfY29ubnRyYWNrX2V4cGVjdF9jaGFpbiwgbmIpOwotfQotCi1zdGF0aWMgaW5saW5lIGludAotbmZfY29ubnRyYWNrX2V4cGVjdF91bnJlZ2lzdGVyX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpCi17Ci0JcmV0dXJuIGF0b21pY19ub3RpZmllcl9jaGFpbl91bnJlZ2lzdGVyKCZuZl9jb25udHJhY2tfZXhwZWN0X2NoYWluLAotCQkJbmIpOwotfQorZXh0ZXJuIGludCBuZl9jb25udHJhY2tfcmVnaXN0ZXJfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYik7CitleHRlcm4gaW50IG5mX2Nvbm50cmFja191bnJlZ2lzdGVyX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpOwogCiBleHRlcm4gdm9pZCBuZl9jdF9kZWxpdmVyX2NhY2hlZF9ldmVudHMoY29uc3Qgc3RydWN0IG5mX2Nvbm4gKmN0KTsKIGV4dGVybiB2b2lkIF9fbmZfY3RfZXZlbnRfY2FjaGVfaW5pdChzdHJ1Y3QgbmZfY29ubiAqY3QpOwpAQCAtNzEsNiArNDksMTAgQEAKIAkJYXRvbWljX25vdGlmaWVyX2NhbGxfY2hhaW4oJm5mX2Nvbm50cmFja19jaGFpbiwgZXZlbnQsIGN0KTsKIH0KIAorZXh0ZXJuIHN0cnVjdCBhdG9taWNfbm90aWZpZXJfaGVhZCBuZl9jb25udHJhY2tfZXhwZWN0X2NoYWluOworZXh0ZXJuIGludCBuZl9jb25udHJhY2tfZXhwZWN0X3JlZ2lzdGVyX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpOworZXh0ZXJuIGludCBuZl9jb25udHJhY2tfZXhwZWN0X3VucmVnaXN0ZXJfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYik7CisKIHN0YXRpYyBpbmxpbmUgdm9pZAogbmZfY29ubnRyYWNrX2V4cGVjdF9ldmVudChlbnVtIGlwX2Nvbm50cmFja19leHBlY3RfZXZlbnRzIGV2ZW50LAogCQkJICBzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqZXhwKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sM3Byb3RvLmggYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2wzcHJvdG8uaAppbmRleCBlYjU3NWNiLi5mMzJmNzE0IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2wzcHJvdG8uaAorKysgYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2wzcHJvdG8uaApAQCAtOTAsMTAgKzkwLDcgQEAKIC8qIFByb3RvY29sIHJlZ2lzdHJhdGlvbi4gKi8KIGV4dGVybiBpbnQgbmZfY29ubnRyYWNrX2wzcHJvdG9fcmVnaXN0ZXIoc3RydWN0IG5mX2Nvbm50cmFja19sM3Byb3RvICpwcm90byk7CiBleHRlcm4gdm9pZCBuZl9jb25udHJhY2tfbDNwcm90b191bnJlZ2lzdGVyKHN0cnVjdCBuZl9jb25udHJhY2tfbDNwcm90byAqcHJvdG8pOwotCi1leHRlcm4gc3RydWN0IG5mX2Nvbm50cmFja19sM3Byb3RvICoKLW5mX2N0X2wzcHJvdG9fZmluZF9nZXQodV9pbnQxNl90IGwzcHJvdG8pOwotCitleHRlcm4gc3RydWN0IG5mX2Nvbm50cmFja19sM3Byb3RvICpuZl9jdF9sM3Byb3RvX2ZpbmRfZ2V0KHVfaW50MTZfdCBsM3Byb3RvKTsKIGV4dGVybiB2b2lkIG5mX2N0X2wzcHJvdG9fcHV0KHN0cnVjdCBuZl9jb25udHJhY2tfbDNwcm90byAqcCk7CiAKIC8qIEV4aXN0aW5nIGJ1aWx0LWluIHByb3RvY29scyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sNHByb3RvLmggYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2w0cHJvdG8uaAppbmRleCA4NDE1MTgyLi5mNDZjYjkzIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2w0cHJvdG8uaAorKysgYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2w0cHJvdG8uaApAQCAtOTcsNyArOTcsNiBAQAogZXh0ZXJuIHN0cnVjdCBuZl9jb25udHJhY2tfbDRwcm90byBuZl9jb25udHJhY2tfbDRwcm90b19nZW5lcmljOwogCiAjZGVmaW5lIE1BWF9ORl9DVF9QUk9UTyAyNTYKLWV4dGVybiBzdHJ1Y3QgbmZfY29ubnRyYWNrX2w0cHJvdG8gKipuZl9jdF9wcm90b3NbUEZfTUFYXTsKIAogZXh0ZXJuIHN0cnVjdCBuZl9jb25udHJhY2tfbDRwcm90byAqCiBfX25mX2N0X2w0cHJvdG9fZmluZCh1X2ludDE2X3QgbDNwcm90bywgdV9pbnQ4X3QgbDRwcm90byk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfbmF0X3J1bGUuaCBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9uYXRfcnVsZS5oCmluZGV4IGYxOTFjNjcuLmU3NjU2NTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9uYXRfcnVsZS5oCisrKyBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9uYXRfcnVsZS5oCkBAIC00LDE2ICs0LDYgQEAKICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX25hdC5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgogCi0vKiBDb21wYXRpYmlsaXR5IGRlZmluaXRpb25zIGZvciBpcHRfRk9PIG1vZHVsZXMgKi8KLSNkZWZpbmUgaXBfbmF0X3JhbmdlCQkJbmZfbmF0X3JhbmdlCi0jZGVmaW5lIGlwX2Nvbm50cmFja190dXBsZQkJbmZfY29ubnRyYWNrX3R1cGxlCi0jZGVmaW5lIGlwX2Nvbm50cmFja19nZXQJCW5mX2N0X2dldAotI2RlZmluZSBpcF9jb25udHJhY2sJCQluZl9jb25uCi0jZGVmaW5lIGlwX25hdF9zZXR1cF9pbmZvCQluZl9uYXRfc2V0dXBfaW5mbwotI2RlZmluZSBpcF9uYXRfbXVsdGlfcmFuZ2VfY29tcGF0CW5mX25hdF9tdWx0aV9yYW5nZV9jb21wYXQKLSNkZWZpbmUgaXBfY3RfaXRlcmF0ZV9jbGVhbnVwCQluZl9jdF9pdGVyYXRlX2NsZWFudXAKLSNkZWZpbmUJSVBfTkZfQVNTRVJUCQkJTkZfQ1RfQVNTRVJUCi0KIGV4dGVybiBpbnQgbmZfbmF0X3J1bGVfaW5pdCh2b2lkKSBfX2luaXQ7CiBleHRlcm4gdm9pZCBuZl9uYXRfcnVsZV9jbGVhbnVwKHZvaWQpOwogZXh0ZXJuIGludCBuZl9uYXRfcnVsZV9maW5kKHN0cnVjdCBza19idWZmICoqcHNrYiwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L25ldGxpbmsuaCBiL2luY2x1ZGUvbmV0L25ldGxpbmsuaAppbmRleCBiY2FmNjdiLi4wYmYzMjVjIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9uZXRsaW5rLmgKKysrIGIvaW5jbHVkZS9uZXQvbmV0bGluay5oCkBAIC0xNzEsNiArMTcxLDcgQEAKIAlOTEFfTVNFQ1MsCiAJTkxBX05FU1RFRCwKIAlOTEFfTlVMX1NUUklORywKKwlOTEFfQklOQVJZLAogCV9fTkxBX1RZUEVfTUFYLAogfTsKIApAQCAtMTg4LDEyICsxODksMTMgQEAKICAqICAgIE5MQV9TVFJJTkcgICAgICAgICAgIE1heGltdW0gbGVuZ3RoIG9mIHN0cmluZwogICogICAgTkxBX05VTF9TVFJJTkcgICAgICAgTWF4aW11bSBsZW5ndGggb2Ygc3RyaW5nIChleGNsdWRpbmcgTlVMKQogICogICAgTkxBX0ZMQUcgICAgICAgICAgICAgVW51c2VkCisgKiAgICBOTEFfQklOQVJZICAgICAgICAgICBNYXhpbXVtIGxlbmd0aCBvZiBhdHRyaWJ1dGUgcGF5bG9hZAogICogICAgQWxsIG90aGVyICAgICAgICAgICAgRXhhY3QgbGVuZ3RoIG9mIGF0dHJpYnV0ZSBwYXlsb2FkCiAgKgogICogRXhhbXBsZToKICAqIHN0YXRpYyBzdHJ1Y3QgbmxhX3BvbGljeSBteV9wb2xpY3lbQVRUUl9NQVgrMV0gX19yZWFkX21vc3RseSA9IHsKICAqIAlbQVRUUl9GT09dID0geyAudHlwZSA9IE5MQV9VMTYgfSwKLSAqCVtBVFRSX0JBUl0gPSB7IC50eXBlID0gTkxBX1NUUklORywgbGVuID0gQkFSU0laIH0sCisgKglbQVRUUl9CQVJdID0geyAudHlwZSA9IE5MQV9TVFJJTkcsIC5sZW4gPSBCQVJTSVogfSwKICAqCVtBVFRSX0JBWl0gPSB7IC5sZW4gPSBzaXplb2Yoc3RydWN0IG15c3RydWN0KSB9LAogICogfTsKICAqLwpAQCAtMjE0LDkgKzIxNiw3IEBACiAKIGV4dGVybiB2b2lkCQluZXRsaW5rX3J1bl9xdWV1ZShzdHJ1Y3Qgc29jayAqc2ssIHVuc2lnbmVkIGludCAqcWxlbiwKIAkJCQkJICBpbnQgKCpjYikoc3RydWN0IHNrX2J1ZmYgKiwKLQkJCQkJCSAgICBzdHJ1Y3Qgbmxtc2doZHIgKiwgaW50ICopKTsKLWV4dGVybiB2b2lkCQluZXRsaW5rX3F1ZXVlX3NraXAoc3RydWN0IG5sbXNnaGRyICpubGgsCi0JCQkJCSAgIHN0cnVjdCBza19idWZmICpza2IpOworCQkJCQkJICAgIHN0cnVjdCBubG1zZ2hkciAqKSk7CiBleHRlcm4gaW50CQlubG1zZ19ub3RpZnkoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJCSAgICAgdTMyIHBpZCwgdW5zaWduZWQgaW50IGdyb3VwLCBpbnQgcmVwb3J0LAogCQkJCSAgICAgZ2ZwX3QgZmxhZ3MpOwpAQCAtNTI1LDcgKzUyNSw3IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgaW50IG5sbXNnX2VuZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCkKIHsKLQlubGgtPm5sbXNnX2xlbiA9IHNrYi0+dGFpbCAtICh1bnNpZ25lZCBjaGFyICopIG5saDsKKwlubGgtPm5sbXNnX2xlbiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKSAtICh1bnNpZ25lZCBjaGFyICopbmxoOwogCiAJcmV0dXJuIHNrYi0+bGVuOwogfQpAQCAtNTM4LDcgKzUzOCw3IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCAqbmxtc2dfZ2V0X3BvcyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXJldHVybiBza2ItPnRhaWw7CisJcmV0dXJuIHNrYl90YWlsX3BvaW50ZXIoc2tiKTsKIH0KIAogLyoqCkBAIC01NDgsNyArNTQ4LDcgQEAKICAqCiAgKiBUcmltcyB0aGUgbWVzc2FnZSB0byB0aGUgcHJvdmlkZWQgbWFyay4gUmV0dXJucyAtMS4KICAqLwotc3RhdGljIGlubGluZSBpbnQgbmxtc2dfdHJpbShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB2b2lkICptYXJrKQorc3RhdGljIGlubGluZSBpbnQgbmxtc2dfdHJpbShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCB2b2lkICptYXJrKQogewogCWlmIChtYXJrKQogCQlza2JfdHJpbShza2IsICh1bnNpZ25lZCBjaGFyICopIG1hcmsgLSBza2ItPmRhdGEpOwpAQCAtOTQwLDcgKzk0MCw3IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgc3RydWN0IG5sYXR0ciAqbmxhX25lc3Rfc3RhcnQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGF0dHJ0eXBlKQogewotCXN0cnVjdCBubGF0dHIgKnN0YXJ0ID0gKHN0cnVjdCBubGF0dHIgKikgc2tiLT50YWlsOworCXN0cnVjdCBubGF0dHIgKnN0YXJ0ID0gKHN0cnVjdCBubGF0dHIgKilza2JfdGFpbF9wb2ludGVyKHNrYik7CiAKIAlpZiAobmxhX3B1dChza2IsIGF0dHJ0eXBlLCAwLCBOVUxMKSA8IDApCiAJCXJldHVybiBOVUxMOwpAQCAtOTYwLDcgKzk2MCw3IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgaW50IG5sYV9uZXN0X2VuZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmxhdHRyICpzdGFydCkKIHsKLQlzdGFydC0+bmxhX2xlbiA9IHNrYi0+dGFpbCAtICh1bnNpZ25lZCBjaGFyICopIHN0YXJ0OworCXN0YXJ0LT5ubGFfbGVuID0gc2tiX3RhaWxfcG9pbnRlcihza2IpIC0gKHVuc2lnbmVkIGNoYXIgKilzdGFydDsKIAlyZXR1cm4gc2tiLT5sZW47CiB9CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3BrdF9jbHMuaCBiL2luY2x1ZGUvbmV0L3BrdF9jbHMuaAppbmRleCAwMjY0N2ZlLi40MTI5ZGY3IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9wa3RfY2xzLmgKKysrIGIvaW5jbHVkZS9uZXQvcGt0X2Nscy5oCkBAIC0zMjYsMTggKzMyNiwxOCBAQAogCQljYXNlIFRDRl9MQVlFUl9MSU5LOgogCQkJcmV0dXJuIHNrYi0+ZGF0YTsKIAkJY2FzZSBUQ0ZfTEFZRVJfTkVUV09SSzoKLQkJCXJldHVybiBza2ItPm5oLnJhdzsKKwkJCXJldHVybiBza2JfbmV0d29ya19oZWFkZXIoc2tiKTsKIAkJY2FzZSBUQ0ZfTEFZRVJfVFJBTlNQT1JUOgotCQkJcmV0dXJuIHNrYi0+aC5yYXc7CisJCQlyZXR1cm4gc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKIAl9CiAKIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgdGNmX3ZhbGlkX29mZnNldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBjaGFyICpwdHIsCi0JCQkJICAgaW50IGxlbikKK3N0YXRpYyBpbmxpbmUgaW50IHRjZl92YWxpZF9vZmZzZXQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgICBjb25zdCB1bnNpZ25lZCBjaGFyICpwdHIsIGNvbnN0IGludCBsZW4pCiB7Ci0JcmV0dXJuIHVubGlrZWx5KChwdHIgKyBsZW4pIDwgc2tiLT50YWlsICYmIHB0ciA+IHNrYi0+aGVhZCk7CisJcmV0dXJuIHVubGlrZWx5KChwdHIgKyBsZW4pIDwgc2tiX3RhaWxfcG9pbnRlcihza2IpICYmIHB0ciA+IHNrYi0+aGVhZCk7CiB9CiAKICNpZmRlZiBDT05GSUdfTkVUX0NMU19JTkQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3BrdF9zY2hlZC5oIGIvaW5jbHVkZS9uZXQvcGt0X3NjaGVkLmgKaW5kZXggZjZhZmVlNy4uNTc1NGQ1MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvcGt0X3NjaGVkLmgKKysrIGIvaW5jbHVkZS9uZXQvcGt0X3NjaGVkLmgKQEAgLTIsNiArMiw3IEBACiAjZGVmaW5lIF9fTkVUX1BLVF9TQ0hFRF9ICiAKICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgva3RpbWUuaD4KICNpbmNsdWRlIDxuZXQvc2NoX2dlbmVyaWMuaD4KIAogc3RydWN0IHFkaXNjX3dhbGtlcgpAQCAtMTIsOCArMTMsNiBAQAogCWludAkoKmZuKShzdHJ1Y3QgUWRpc2MgKiwgdW5zaWduZWQgbG9uZyBjbCwgc3RydWN0IHFkaXNjX3dhbGtlciAqKTsKIH07CiAKLWV4dGVybiByd2xvY2tfdCBxZGlzY190cmVlX2xvY2s7Ci0KICNkZWZpbmUgUURJU0NfQUxJR05UTwkJMzIKICNkZWZpbmUgUURJU0NfQUxJR04obGVuKQkoKChsZW4pICsgUURJU0NfQUxJR05UTy0xKSAmIH4oUURJU0NfQUxJR05UTy0xKSkKIApAQCAtMzcsMTc1ICszNiwzOCBAQAogICAgVGhlIHRoaW5ncyBhcmUgbm90IHNvIGJhZCwgYmVjYXVzZSB3ZSBtYXkgdXNlIGFydGlmaWNhbAogICAgY2xvY2sgZXZhbHVhdGVkIGJ5IGludGVncmF0aW9uIG9mIG5ldHdvcmsgZGF0YSBmbG93CiAgICBpbiB0aGUgbW9zdCBjcml0aWNhbCBwbGFjZXMuCi0KLSAgIE5vdGU6IHdlIGRvIG5vdCB1c2UgZmFzdGdldHRpbWVvZmRheS4KLSAgIFRoZSByZWFzb24gaXMgdGhhdCwgd2hlbiBpdCBpcyBub3QgdGhlIHNhbWUgdGhpbmcgYXMKLSAgIGdldHRpbWVvZmRheSwgaXQgcmV0dXJucyBpbnZhbGlkIHRpbWVzdGFtcCwgd2hpY2ggaXMKLSAgIG5vdCB1cGRhdGVkLCB3aGVuIG5ldF9iaCBpcyBhY3RpdmUuCiAgKi8KIAotLyogR2VuZXJhbCBub3RlIGFib3V0IGludGVybmFsIGNsb2NrLgotCi0gICBBbnkgY2xvY2sgc291cmNlIHJldHVybnMgdGltZSBpbnRlcnZhbHMsIG1lYXN1cmVkIGluIHVuaXRzCi0gICBjbG9zZSB0byAxdXNlYy4gV2l0aCBzb3VyY2UgQ09ORklHX05FVF9TQ0hfQ0xLX0dFVFRJTUVPRkRBWSBpdCBpcyBwcmVjaXNlbHkKLSAgIG1pY3Jvc2Vjb25kcywgb3RoZXJ3aXNlIHNvbWV0aGluZyBjbG9zZSBidXQgZGlmZmVyZW50IGNob3NlbiB0byBtaW5pbWl6ZQotICAgYXJpdGhtZXRpYyBjb3N0LiBSYXRpbyB1c2VjL2ludGVybmFsIHVudGlzIGluIGZvcm0gbm9taW5hdG9yL2Rlbm9taW5hdG9yCi0gICBtYXkgYmUgcmVhZCBmcm9tIC9wcm9jL25ldC9wc2NoZWQuCi0gKi8KLQotCi0jaWZkZWYgQ09ORklHX05FVF9TQ0hfQ0xLX0dFVFRJTUVPRkRBWQotCi10eXBlZGVmIHN0cnVjdCB0aW1ldmFsCXBzY2hlZF90aW1lX3Q7Ci10eXBlZGVmIGxvbmcJCXBzY2hlZF90ZGlmZl90OwotCi0jZGVmaW5lIFBTQ0hFRF9HRVRfVElNRShzdGFtcCkgZG9fZ2V0dGltZW9mZGF5KCYoc3RhbXApKQotI2RlZmluZSBQU0NIRURfVVMySklGRklFKHVzZWNzKSB1c2Vjc190b19qaWZmaWVzKHVzZWNzKQotI2RlZmluZSBQU0NIRURfSklGRklFMlVTKGRlbGF5KSBqaWZmaWVzX3RvX3VzZWNzKGRlbGF5KQotCi0jZWxzZSAvKiAhQ09ORklHX05FVF9TQ0hfQ0xLX0dFVFRJTUVPRkRBWSAqLwotCiB0eXBlZGVmIHU2NAlwc2NoZWRfdGltZV90OwogdHlwZWRlZiBsb25nCXBzY2hlZF90ZGlmZl90OwogCi0jaWZkZWYgQ09ORklHX05FVF9TQ0hfQ0xLX0pJRkZJRVMKKy8qIEF2b2lkIGRvaW5nIDY0IGJpdCBkaXZpZGUgYnkgMTAwMCAqLworI2RlZmluZSBQU0NIRURfVVMyTlMoeCkJCQkoKHM2NCkoeCkgPDwgMTApCisjZGVmaW5lIFBTQ0hFRF9OUzJVUyh4KQkJCSgoeCkgPj4gMTApCiAKLSNpZiBIWiA8IDk2Ci0jZGVmaW5lIFBTQ0hFRF9KU0NBTEUgMTQKLSNlbGlmIEhaID49IDk2ICYmIEhaIDwgMTkyCi0jZGVmaW5lIFBTQ0hFRF9KU0NBTEUgMTMKLSNlbGlmIEhaID49IDE5MiAmJiBIWiA8IDM4NAotI2RlZmluZSBQU0NIRURfSlNDQUxFIDEyCi0jZWxpZiBIWiA+PSAzODQgJiYgSFogPCA3NjgKLSNkZWZpbmUgUFNDSEVEX0pTQ0FMRSAxMQotI2VsaWYgSFogPj0gNzY4Ci0jZGVmaW5lIFBTQ0hFRF9KU0NBTEUgMTAKLSNlbmRpZgorI2RlZmluZSBQU0NIRURfVElDS1NfUEVSX1NFQwkJUFNDSEVEX05TMlVTKE5TRUNfUEVSX1NFQykKKyNkZWZpbmUgUFNDSEVEX1BBU1RQRVJGRUNUCQkwCiAKLSNkZWZpbmUgUFNDSEVEX0dFVF9USU1FKHN0YW1wKSAoKHN0YW1wKSA9IChnZXRfamlmZmllc182NCgpPDxQU0NIRURfSlNDQUxFKSkKLSNkZWZpbmUgUFNDSEVEX1VTMkpJRkZJRShkZWxheSkgKCgoZGVsYXkpKygxPDxQU0NIRURfSlNDQUxFKS0xKT4+UFNDSEVEX0pTQ0FMRSkKLSNkZWZpbmUgUFNDSEVEX0pJRkZJRTJVUyhkZWxheSkgKChkZWxheSk8PFBTQ0hFRF9KU0NBTEUpCi0KLSNlbmRpZiAvKiBDT05GSUdfTkVUX1NDSF9DTEtfSklGRklFUyAqLwotI2lmZGVmIENPTkZJR19ORVRfU0NIX0NMS19DUFUKLSNpbmNsdWRlIDxhc20vdGltZXguaD4KLQotZXh0ZXJuIHBzY2hlZF90ZGlmZl90IHBzY2hlZF9jbG9ja19wZXJfaHo7Ci1leHRlcm4gaW50IHBzY2hlZF9jbG9ja19zY2FsZTsKLWV4dGVybiBwc2NoZWRfdGltZV90IHBzY2hlZF90aW1lX2Jhc2U7Ci1leHRlcm4gY3ljbGVzX3QgcHNjaGVkX3RpbWVfbWFyazsKLQotI2RlZmluZSBQU0NIRURfR0VUX1RJTUUoc3RhbXApCQkJCQkJXAotZG8gewkJCQkJCQkJCVwKLQljeWNsZXNfdCBjdXIgPSBnZXRfY3ljbGVzKCk7CQkJCQlcCi0JaWYgKHNpemVvZihjeWNsZXNfdCkgPT0gc2l6ZW9mKHUzMikpIHsJCQkJXAotCQlpZiAoY3VyIDw9IHBzY2hlZF90aW1lX21hcmspCQkJCVwKLQkJCXBzY2hlZF90aW1lX2Jhc2UgKz0gMHgxMDAwMDAwMDBVTEw7CQlcCi0JCXBzY2hlZF90aW1lX21hcmsgPSBjdXI7CQkJCQlcCi0JCShzdGFtcCkgPSAocHNjaGVkX3RpbWVfYmFzZSArIGN1cik+PnBzY2hlZF9jbG9ja19zY2FsZTsJXAotCX0gZWxzZSB7CQkJCQkJCVwKLQkJKHN0YW1wKSA9IGN1cj4+cHNjaGVkX2Nsb2NrX3NjYWxlOwkJCVwKLQl9CQkJCQkJCQlcCi19IHdoaWxlICgwKQotI2RlZmluZSBQU0NIRURfVVMySklGRklFKGRlbGF5KSAoKChkZWxheSkrcHNjaGVkX2Nsb2NrX3Blcl9oei0xKS9wc2NoZWRfY2xvY2tfcGVyX2h6KQotI2RlZmluZSBQU0NIRURfSklGRklFMlVTKGRlbGF5KSAoKGRlbGF5KSpwc2NoZWRfY2xvY2tfcGVyX2h6KQotCi0jZW5kaWYgLyogQ09ORklHX05FVF9TQ0hfQ0xLX0NQVSAqLwotCi0jZW5kaWYgLyogIUNPTkZJR19ORVRfU0NIX0NMS19HRVRUSU1FT0ZEQVkgKi8KLQotI2lmZGVmIENPTkZJR19ORVRfU0NIX0NMS19HRVRUSU1FT0ZEQVkKLSNkZWZpbmUgUFNDSEVEX1RESUZGKHR2MSwgdHYyKSBcCi0oeyBcCi0JICAgaW50IF9fZGVsdGFfc2VjID0gKHR2MSkudHZfc2VjIC0gKHR2MikudHZfc2VjOyBcCi0JICAgaW50IF9fZGVsdGEgPSAodHYxKS50dl91c2VjIC0gKHR2MikudHZfdXNlYzsgXAotCSAgIGlmIChfX2RlbHRhX3NlYykgeyBcCi0JICAgICAgICAgICBzd2l0Y2ggKF9fZGVsdGFfc2VjKSB7IFwKLQkJICAgZGVmYXVsdDogXAotCQkJICAgX19kZWx0YSA9IDA7IFwKLQkJICAgY2FzZSAyOiBcCi0JCQkgICBfX2RlbHRhICs9IFVTRUNfUEVSX1NFQzsgXAotCQkgICBjYXNlIDE6IFwKLQkJCSAgIF9fZGVsdGEgKz0gVVNFQ19QRVJfU0VDOyBcCi0JICAgICAgICAgICB9IFwKLQkgICB9IFwKLQkgICBfX2RlbHRhOyBcCi19KQotCi1zdGF0aWMgaW5saW5lIGludAotcHNjaGVkX3RvZF9kaWZmKGludCBkZWx0YV9zZWMsIGludCBib3VuZCkKK3N0YXRpYyBpbmxpbmUgcHNjaGVkX3RpbWVfdCBwc2NoZWRfZ2V0X3RpbWUodm9pZCkKIHsKLQlpbnQgZGVsdGE7Ci0KLQlpZiAoYm91bmQgPD0gVVNFQ19QRVJfU0VDIHx8IGRlbHRhX3NlYyA+ICgweDdGRkZGRkZGL1VTRUNfUEVSX1NFQyktMSkKLQkJcmV0dXJuIGJvdW5kOwotCWRlbHRhID0gZGVsdGFfc2VjICogVVNFQ19QRVJfU0VDOwotCWlmIChkZWx0YSA+IGJvdW5kIHx8IGRlbHRhIDwgMCkKLQkJZGVsdGEgPSBib3VuZDsKLQlyZXR1cm4gZGVsdGE7CisJcmV0dXJuIFBTQ0hFRF9OUzJVUyhrdGltZV90b19ucyhrdGltZV9nZXQoKSkpOwogfQogCi0jZGVmaW5lIFBTQ0hFRF9URElGRl9TQUZFKHR2MSwgdHYyLCBib3VuZCkgXAotKHsgXAotCSAgIGludCBfX2RlbHRhX3NlYyA9ICh0djEpLnR2X3NlYyAtICh0djIpLnR2X3NlYzsgXAotCSAgIGludCBfX2RlbHRhID0gKHR2MSkudHZfdXNlYyAtICh0djIpLnR2X3VzZWM7IFwKLQkgICBzd2l0Y2ggKF9fZGVsdGFfc2VjKSB7IFwKLQkgICBkZWZhdWx0OiBcCi0JCSAgIF9fZGVsdGEgPSBwc2NoZWRfdG9kX2RpZmYoX19kZWx0YV9zZWMsIGJvdW5kKTsgIGJyZWFrOyBcCi0JICAgY2FzZSAyOiBcCi0JCSAgIF9fZGVsdGEgKz0gVVNFQ19QRVJfU0VDOyBcCi0JICAgY2FzZSAxOiBcCi0JCSAgIF9fZGVsdGEgKz0gVVNFQ19QRVJfU0VDOyBcCi0JICAgY2FzZSAwOiBcCi0gCQkgICBpZiAoX19kZWx0YSA+IGJvdW5kIHx8IF9fZGVsdGEgPCAwKSBcCi0gCQkJX19kZWx0YSA9IGJvdW5kOyBcCi0JICAgfSBcCi0JICAgX19kZWx0YTsgXAotfSkKK3N0YXRpYyBpbmxpbmUgcHNjaGVkX3RkaWZmX3QKK3BzY2hlZF90ZGlmZl9ib3VuZGVkKHBzY2hlZF90aW1lX3QgdHYxLCBwc2NoZWRfdGltZV90IHR2MiwgcHNjaGVkX3RpbWVfdCBib3VuZCkKK3sKKwlyZXR1cm4gbWluKHR2MSAtIHR2MiwgYm91bmQpOworfQogCi0jZGVmaW5lIFBTQ0hFRF9UTEVTUyh0djEsIHR2MikgKCgodHYxKS50dl91c2VjIDwgKHR2MikudHZfdXNlYyAmJiBcCi0JCQkJKHR2MSkudHZfc2VjIDw9ICh0djIpLnR2X3NlYykgfHwgXAotCQkJCSAodHYxKS50dl9zZWMgPCAodHYyKS50dl9zZWMpCitzdHJ1Y3QgcWRpc2Nfd2F0Y2hkb2cgeworCXN0cnVjdCBocnRpbWVyCXRpbWVyOworCXN0cnVjdCBRZGlzYwkqcWRpc2M7Cit9OwogCi0jZGVmaW5lIFBTQ0hFRF9UQUREMih0diwgZGVsdGEsIHR2X3JlcykgXAotKHsgXAotCSAgIGludCBfX2RlbHRhID0gKHR2KS50dl91c2VjICsgKGRlbHRhKTsgXAotCSAgICh0dl9yZXMpLnR2X3NlYyA9ICh0dikudHZfc2VjOyBcCi0JICAgd2hpbGUgKF9fZGVsdGEgPj0gVVNFQ19QRVJfU0VDKSB7ICh0dl9yZXMpLnR2X3NlYysrOyBfX2RlbHRhIC09IFVTRUNfUEVSX1NFQzsgfSBcCi0JICAgKHR2X3JlcykudHZfdXNlYyA9IF9fZGVsdGE7IFwKLX0pCi0KLSNkZWZpbmUgUFNDSEVEX1RBREQodHYsIGRlbHRhKSBcCi0oeyBcCi0JICAgKHR2KS50dl91c2VjICs9IChkZWx0YSk7IFwKLQkgICB3aGlsZSAoKHR2KS50dl91c2VjID49IFVTRUNfUEVSX1NFQykgeyAodHYpLnR2X3NlYysrOyBcCi0JCSAodHYpLnR2X3VzZWMgLT0gVVNFQ19QRVJfU0VDOyB9IFwKLX0pCi0KLS8qIFNldC9jaGVjayB0aGF0IHRpbWUgaXMgaW4gdGhlICJwYXN0IHBlcmZlY3QiOwotICAgaXQgZGVwZW5kcyBvbiBjb25jcmV0ZSByZXByZXNlbnRhdGlvbiBvZiBzeXN0ZW0gdGltZQotICovCi0KLSNkZWZpbmUgUFNDSEVEX1NFVF9QQVNUUEVSRkVDVCh0KQkoKHQpLnR2X3NlYyA9IDApCi0jZGVmaW5lIFBTQ0hFRF9JU19QQVNUUEVSRkVDVCh0KQkoKHQpLnR2X3NlYyA9PSAwKQotCi0jZGVmaW5lCVBTQ0hFRF9BVURJVF9URElGRih0KSAoeyBpZiAoKHQpID4gMjAwMDAwMCkgKHQpID0gMjAwMDAwMDsgfSkKLQotI2Vsc2UgLyogIUNPTkZJR19ORVRfU0NIX0NMS19HRVRUSU1FT0ZEQVkgKi8KLQotI2RlZmluZSBQU0NIRURfVERJRkYodHYxLCB0djIpIChsb25nKSgodHYxKSAtICh0djIpKQotI2RlZmluZSBQU0NIRURfVERJRkZfU0FGRSh0djEsIHR2MiwgYm91bmQpIFwKLQltaW5fdChsb25nIGxvbmcsICh0djEpIC0gKHR2MiksIGJvdW5kKQotCi0KLSNkZWZpbmUgUFNDSEVEX1RMRVNTKHR2MSwgdHYyKSAoKHR2MSkgPCAodHYyKSkKLSNkZWZpbmUgUFNDSEVEX1RBREQyKHR2LCBkZWx0YSwgdHZfcmVzKSAoKHR2X3JlcykgPSAodHYpICsgKGRlbHRhKSkKLSNkZWZpbmUgUFNDSEVEX1RBREQodHYsIGRlbHRhKSAoKHR2KSArPSAoZGVsdGEpKQotI2RlZmluZSBQU0NIRURfU0VUX1BBU1RQRVJGRUNUKHQpCSgodCkgPSAwKQotI2RlZmluZSBQU0NIRURfSVNfUEFTVFBFUkZFQ1QodCkJKCh0KSA9PSAwKQotI2RlZmluZQlQU0NIRURfQVVESVRfVERJRkYodCkKLQotI2VuZGlmIC8qICFDT05GSUdfTkVUX1NDSF9DTEtfR0VUVElNRU9GREFZICovCitleHRlcm4gdm9pZCBxZGlzY193YXRjaGRvZ19pbml0KHN0cnVjdCBxZGlzY193YXRjaGRvZyAqd2QsIHN0cnVjdCBRZGlzYyAqcWRpc2MpOworZXh0ZXJuIHZvaWQgcWRpc2Nfd2F0Y2hkb2dfc2NoZWR1bGUoc3RydWN0IHFkaXNjX3dhdGNoZG9nICp3ZCwKKwkJCQkgICAgcHNjaGVkX3RpbWVfdCBleHBpcmVzKTsKK2V4dGVybiB2b2lkIHFkaXNjX3dhdGNoZG9nX2NhbmNlbChzdHJ1Y3QgcWRpc2Nfd2F0Y2hkb2cgKndkKTsKIAogZXh0ZXJuIHN0cnVjdCBRZGlzY19vcHMgcGZpZm9fcWRpc2Nfb3BzOwogZXh0ZXJuIHN0cnVjdCBRZGlzY19vcHMgYmZpZm9fcWRpc2Nfb3BzOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvcmVkLmggYi9pbmNsdWRlL25ldC9yZWQuaAppbmRleCBhNGViMzc5Li4zY2YzMWQ0IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9yZWQuaAorKysgYi9pbmNsdWRlL25ldC9yZWQuaApAQCAtMTUxLDE3ICsxNTEsMTcgQEAKIAogc3RhdGljIGlubGluZSBpbnQgcmVkX2lzX2lkbGluZyhzdHJ1Y3QgcmVkX3Bhcm1zICpwKQogewotCXJldHVybiAhUFNDSEVEX0lTX1BBU1RQRVJGRUNUKHAtPnFpZGxlc3RhcnQpOworCXJldHVybiBwLT5xaWRsZXN0YXJ0ICE9IFBTQ0hFRF9QQVNUUEVSRkVDVDsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHJlZF9zdGFydF9vZl9pZGxlX3BlcmlvZChzdHJ1Y3QgcmVkX3Bhcm1zICpwKQogewotCVBTQ0hFRF9HRVRfVElNRShwLT5xaWRsZXN0YXJ0KTsKKwlwLT5xaWRsZXN0YXJ0ID0gcHNjaGVkX2dldF90aW1lKCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCByZWRfZW5kX29mX2lkbGVfcGVyaW9kKHN0cnVjdCByZWRfcGFybXMgKnApCiB7Ci0JUFNDSEVEX1NFVF9QQVNUUEVSRkVDVChwLT5xaWRsZXN0YXJ0KTsKKwlwLT5xaWRsZXN0YXJ0ID0gUFNDSEVEX1BBU1RQRVJGRUNUOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgcmVkX3Jlc3RhcnQoc3RydWN0IHJlZF9wYXJtcyAqcCkKQEAgLTE3Nyw4ICsxNzcsOCBAQAogCWxvbmcgdXNfaWRsZTsKIAlpbnQgIHNoaWZ0OwogCi0JUFNDSEVEX0dFVF9USU1FKG5vdyk7Ci0JdXNfaWRsZSA9IFBTQ0hFRF9URElGRl9TQUZFKG5vdywgcC0+cWlkbGVzdGFydCwgcC0+U2NlbGxfbWF4KTsKKwlub3cgPSBwc2NoZWRfZ2V0X3RpbWUoKTsKKwl1c19pZGxlID0gcHNjaGVkX3RkaWZmX2JvdW5kZWQobm93LCBwLT5xaWRsZXN0YXJ0LCBwLT5TY2VsbF9tYXgpOwogCiAJLyoKIAkgKiBUaGUgcHJvYmxlbTogaWRlYWxseSwgYXZlcmFnZSBsZW5ndGggcXVldWUgcmVjYWxjdWx0aW9uIHNob3VsZApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvcnRuZXRsaW5rLmggYi9pbmNsdWRlL25ldC9ydG5ldGxpbmsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjNkNDc0Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9uZXQvcnRuZXRsaW5rLmgKQEAgLTAsMCArMSwyNSBAQAorI2lmbmRlZiBfX05FVF9SVE5FVExJTktfSAorI2RlZmluZSBfX05FVF9SVE5FVExJTktfSAorCisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisjaW5jbHVkZSA8bmV0L25ldGxpbmsuaD4KKwordHlwZWRlZiBpbnQgKCpydG5sX2RvaXRfZnVuYykoc3RydWN0IHNrX2J1ZmYgKiwgc3RydWN0IG5sbXNnaGRyICosIHZvaWQgKik7Cit0eXBlZGVmIGludCAoKnJ0bmxfZHVtcGl0X2Z1bmMpKHN0cnVjdCBza19idWZmICosIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICopOworCitleHRlcm4gaW50CV9fcnRubF9yZWdpc3RlcihpbnQgcHJvdG9jb2wsIGludCBtc2d0eXBlLAorCQkJCXJ0bmxfZG9pdF9mdW5jLCBydG5sX2R1bXBpdF9mdW5jKTsKK2V4dGVybiB2b2lkCXJ0bmxfcmVnaXN0ZXIoaW50IHByb3RvY29sLCBpbnQgbXNndHlwZSwKKwkJCSAgICAgIHJ0bmxfZG9pdF9mdW5jLCBydG5sX2R1bXBpdF9mdW5jKTsKK2V4dGVybiBpbnQJcnRubF91bnJlZ2lzdGVyKGludCBwcm90b2NvbCwgaW50IG1zZ3R5cGUpOworZXh0ZXJuIHZvaWQJcnRubF91bnJlZ2lzdGVyX2FsbChpbnQgcHJvdG9jb2wpOworCitzdGF0aWMgaW5saW5lIGludCBydG5sX21zZ19mYW1pbHkoc3RydWN0IG5sbXNnaGRyICpubGgpCit7CisJaWYgKG5sbXNnX2xlbihubGgpID49IHNpemVvZihzdHJ1Y3QgcnRnZW5tc2cpKQorCQlyZXR1cm4gKChzdHJ1Y3QgcnRnZW5tc2cgKikgbmxtc2dfZGF0YShubGgpKS0+cnRnZW5fZmFtaWx5OworCWVsc2UKKwkJcmV0dXJuIEFGX1VOU1BFQzsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9zY2hfZ2VuZXJpYy5oIGIvaW5jbHVkZS9uZXQvc2NoX2dlbmVyaWMuaAppbmRleCA4MjA4NjM5Li4xYjhlMzUxIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9zY2hfZ2VuZXJpYy5oCisrKyBiL2luY2x1ZGUvbmV0L3NjaF9nZW5lcmljLmgKQEAgLTUsMTAgKzUsMTAgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CiAjaW5jbHVkZSA8bGludXgvcGt0X3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvcGt0X2Nscy5oPgogI2luY2x1ZGUgPG5ldC9nZW5fc3RhdHMuaD4KKyNpbmNsdWRlIDxuZXQvcnRuZXRsaW5rLmg+CiAKIHN0cnVjdCBRZGlzY19vcHM7CiBzdHJ1Y3QgcWRpc2Nfd2Fsa2VyOwpAQCAtMTc3LDE0ICsxNzcsOCBAQAogZXh0ZXJuIHN0cnVjdCBRZGlzYyAqcWRpc2NfYWxsb2Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IFFkaXNjX29wcyAqb3BzKTsKIGV4dGVybiBzdHJ1Y3QgUWRpc2MgKnFkaXNjX2NyZWF0ZV9kZmx0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkJICAgICAgIHN0cnVjdCBRZGlzY19vcHMgKm9wcywgdTMyIHBhcmVudGlkKTsKLQotc3RhdGljIGlubGluZSB2b2lkCi10Y2ZfZGVzdHJveShzdHJ1Y3QgdGNmX3Byb3RvICp0cCkKLXsKLQl0cC0+b3BzLT5kZXN0cm95KHRwKTsKLQltb2R1bGVfcHV0KHRwLT5vcHMtPm93bmVyKTsKLQlrZnJlZSh0cCk7Ci19CitleHRlcm4gdm9pZCB0Y2ZfZGVzdHJveShzdHJ1Y3QgdGNmX3Byb3RvICp0cCk7CitleHRlcm4gdm9pZCB0Y2ZfZGVzdHJveV9jaGFpbihzdHJ1Y3QgdGNmX3Byb3RvICpmbCk7CiAKIHN0YXRpYyBpbmxpbmUgaW50IF9fcWRpc2NfZW5xdWV1ZV90YWlsKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBRZGlzYyAqc2NoLAogCQkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpsaXN0KQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvc2N0cC9jb25zdGFudHMuaCBiL2luY2x1ZGUvbmV0L3NjdHAvY29uc3RhbnRzLmgKaW5kZXggNWRkYjg1NS4uYmIzNzcyNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvc2N0cC9jb25zdGFudHMuaAorKysgYi9pbmNsdWRlL25ldC9zY3RwL2NvbnN0YW50cy5oCkBAIC0yODMsNyArMjgzLDcgQEAKICNkZWZpbmUgU0NUUF9SVE9fQkVUQSAgICAgICAgICAgMiAgIC8qIDEvNCB3aGVuIGNvbnZlcnRlZCB0byByaWdodCBzaGlmdHMuICovCiAKIC8qIE1heGltdW0gbnVtYmVyIG9mIG5ldyBkYXRhIHBhY2tldHMgdGhhdCBjYW4gYmUgc2VudCBpbiBhIGJ1cnN0LiAgKi8KLSNkZWZpbmUgU0NUUF9NQVhfQlVSU1QJCTQKKyNkZWZpbmUgU0NUUF9ERUZBVUxUX01BWF9CVVJTVAkJNAogCiAjZGVmaW5lIFNDVFBfQ0xPQ0tfR1JBTlVMQVJJVFkJMQkvKiAxIGppZmZ5ICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3NjdHAvc3RydWN0cy5oIGIvaW5jbHVkZS9uZXQvc2N0cC9zdHJ1Y3RzLmgKaW5kZXggZjQzMWFjZi4uN2I0ZmZmOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvc2N0cC9zdHJ1Y3RzLmgKKysrIGIvaW5jbHVkZS9uZXQvc2N0cC9zdHJ1Y3RzLmgKQEAgLTI3Niw2ICsyNzYsNyBAQAogCV9fdTMyIGRlZmF1bHRfY29udGV4dDsKIAlfX3UzMiBkZWZhdWx0X3RpbWV0b2xpdmU7CiAJX191MzIgZGVmYXVsdF9yY3ZfY29udGV4dDsKKwlpbnQgbWF4X2J1cnN0OwogCiAJLyogSGVhcnRiZWF0IGludGVydmFsOiBUaGUgZW5kcG9pbnQgc2VuZHMgb3V0IGEgSGVhcnRiZWF0IGNodW5rIHRvCiAJICogdGhlIGRlc3RpbmF0aW9uIGFkZHJlc3MgZXZlcnkgaGVhcnRiZWF0IGludGVydmFsLiBUaGlzIHZhbHVlCkBAIC0zMDQsMTAgKzMwNSwxMiBAQAogCV9fdTMyIGF1dG9jbG9zZTsKIAlfX3U4IG5vZGVsYXk7CiAJX191OCBkaXNhYmxlX2ZyYWdtZW50czsKLQlfX3U4IHBkX21vZGU7CiAJX191OCB2NG1hcHBlZDsKKwlfX3U4IGZyYWdfaW50ZXJsZWF2ZTsKIAlfX3UzMiBhZGFwdGF0aW9uX2luZDsKKwlfX3UzMiBwZF9wb2ludDsKIAorCWF0b21pY190IHBkX21vZGU7CiAJLyogUmVjZWl2ZSB0byBoZXJlIHdoaWxlIHBhcnRpYWwgZGVsaXZlcnkgaXMgaW4gZWZmZWN0LiAqLwogCXN0cnVjdCBza19idWZmX2hlYWQgcGRfbG9iYnk7CiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvc2N0cC91bHBldmVudC5oIGIvaW5jbHVkZS9uZXQvc2N0cC91bHBldmVudC5oCmluZGV4IDI5MjNlM2QzLi5kZTg4ZWQ1IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9zY3RwL3VscGV2ZW50LmgKKysrIGIvaW5jbHVkZS9uZXQvc2N0cC91bHBldmVudC5oCkBAIC04OSw2ICs4OSw3IEBACiAJX191MTYgZXJyb3IsCiAJX191MTYgb3V0Ym91bmQsCiAJX191MTYgaW5ib3VuZCwKKwlzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmssCiAJZ2ZwX3QgZ2ZwKTsKIAogc3RydWN0IHNjdHBfdWxwZXZlbnQgKnNjdHBfdWxwZXZlbnRfbWFrZV9wZWVyX2FkZHJfY2hhbmdlKApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvc2N0cC91bHBxdWV1ZS5oIGIvaW5jbHVkZS9uZXQvc2N0cC91bHBxdWV1ZS5oCmluZGV4IGFiMjZhYjMuLjM5ZWEzZjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3NjdHAvdWxwcXVldWUuaAorKysgYi9pbmNsdWRlL25ldC9zY3RwL3VscHF1ZXVlLmgKQEAgLTc4LDcgKzc4LDcgQEAKIHZvaWQgc2N0cF91bHBxX2Fib3J0X3BkKHN0cnVjdCBzY3RwX3VscHEgKiwgZ2ZwX3QpOwogCiAvKiBDbGVhciB0aGUgcGFydGlhbCBkYXRhIGRlbGl2ZXJ5IGNvbmRpdGlvbiBvbiB0aGlzIHNvY2tldC4gKi8KLWludCBzY3RwX2NsZWFyX3BkKHN0cnVjdCBzb2NrICpzayk7CitpbnQgc2N0cF9jbGVhcl9wZChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jKTsKIAogLyogU2tpcCBvdmVyIGFuIFNTTi4gKi8KIHZvaWQgc2N0cF91bHBxX3NraXAoc3RydWN0IHNjdHBfdWxwcSAqdWxwcSwgX191MTYgc2lkLCBfX3UxNiBzc24pOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvc2N0cC91c2VyLmggYi9pbmNsdWRlL25ldC9zY3RwL3VzZXIuaAppbmRleCA2N2EzMGViLi42ZDJiNTc3IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9zY3RwL3VzZXIuaAorKysgYi9pbmNsdWRlL25ldC9zY3RwL3VzZXIuaApAQCAtOTcsNiArOTcsMTIgQEAKICNkZWZpbmUgU0NUUF9ERUxBWUVEX0FDS19USU1FIFNDVFBfREVMQVlFRF9BQ0tfVElNRQogCVNDVFBfQ09OVEVYVCwJLyogUmVjZWl2ZSBDb250ZXh0ICovCiAjZGVmaW5lIFNDVFBfQ09OVEVYVCBTQ1RQX0NPTlRFWFQKKwlTQ1RQX0ZSQUdNRU5UX0lOVEVSTEVBVkUsCisjZGVmaW5lIFNDVFBfRlJBR01FTlRfSU5URVJMRUFWRSBTQ1RQX0ZSQUdNRU5UX0lOVEVSTEVBVkUKKwlTQ1RQX1BBUlRJQUxfREVMSVZFUllfUE9JTlQsCS8qIFNldC9HZXQgcGFydGlhbCBkZWxpdmVyeSBwb2ludCAqLworI2RlZmluZSBTQ1RQX1BBUlRJQUxfREVMSVZFUllfUE9JTlQgU0NUUF9QQVJUSUFMX0RFTElWRVJZX1BPSU5UCisJU0NUUF9NQVhfQlVSU1QsCQkvKiBTZXQvR2V0IG1heCBidXJzdCAqLworI2RlZmluZSBTQ1RQX01BWF9CVVJTVCBTQ1RQX01BWF9CVVJTVAogCiAJLyogSW50ZXJuYWwgU29ja2V0IE9wdGlvbnMuIFNvbWUgb2YgdGhlIHNjdHAgbGlicmFyeSBmdW5jdGlvbnMgYXJlIAogCSAqIGltcGxlbWVudGVkIHVzaW5nIHRoZXNlIHNvY2tldCBvcHRpb25zLgpAQCAtMjEzLDYgKzIxOSw3IEBACiAJX191MTYgc2FjX291dGJvdW5kX3N0cmVhbXM7CiAJX191MTYgc2FjX2luYm91bmRfc3RyZWFtczsKIAlzY3RwX2Fzc29jX3Qgc2FjX2Fzc29jX2lkOworCV9fdTggc2FjX2luZm9bMF07CiB9OwogCiAvKgpAQCAtMjYxLDYgKzI2OCw3IEBACiAJU0NUUF9BRERSX1JFTU9WRUQsCiAJU0NUUF9BRERSX0FEREVELAogCVNDVFBfQUREUl9NQURFX1BSSU0sCisJU0NUUF9BRERSX0NPTkZJUk1FRCwKIH07CiAKIApAQCAtNTA4LDE2ICs1MTYsMTcgQEAKICAqICAgYWRkcmVzcydzIHBhcmFtZXRlcnM6CiAgKi8KIGVudW0gIHNjdHBfc3BwX2ZsYWdzIHsKLQlTUFBfSEJfRU5BQkxFID0gMSwJCS8qRW5hYmxlIGhlYXJ0YmVhdHMqLwotCVNQUF9IQl9ESVNBQkxFID0gMiwJCS8qRGlzYWJsZSBoZWFydGJlYXRzKi8KKwlTUFBfSEJfRU5BQkxFID0gMTw8MCwJCS8qRW5hYmxlIGhlYXJ0YmVhdHMqLworCVNQUF9IQl9ESVNBQkxFID0gMTw8MSwJCS8qRGlzYWJsZSBoZWFydGJlYXRzKi8KIAlTUFBfSEIgPSBTUFBfSEJfRU5BQkxFIHwgU1BQX0hCX0RJU0FCTEUsCi0JU1BQX0hCX0RFTUFORCA9IDQsCQkvKlNlbmQgaGVhcnRiZWF0IGltbWVkaWF0ZWx5Ki8KLQlTUFBfUE1UVURfRU5BQkxFID0gOCwJCS8qRW5hYmxlIFBNVFUgZGlzY292ZXJ5Ki8KLQlTUFBfUE1UVURfRElTQUJMRSA9IDE2LAkJLypEaXNhYmxlIFBNVFUgZGlzY292ZXJ5Ki8KKwlTUFBfSEJfREVNQU5EID0gMTw8MiwJCS8qU2VuZCBoZWFydGJlYXQgaW1tZWRpYXRlbHkqLworCVNQUF9QTVRVRF9FTkFCTEUgPSAxPDwzLAkvKkVuYWJsZSBQTVRVIGRpc2NvdmVyeSovCisJU1BQX1BNVFVEX0RJU0FCTEUgPSAxPDw0LAkvKkRpc2FibGUgUE1UVSBkaXNjb3ZlcnkqLwogCVNQUF9QTVRVRCA9IFNQUF9QTVRVRF9FTkFCTEUgfCBTUFBfUE1UVURfRElTQUJMRSwKLQlTUFBfU0FDS0RFTEFZX0VOQUJMRSA9IDMyLAkvKkVuYWJsZSBTQUNLKi8KLQlTUFBfU0FDS0RFTEFZX0RJU0FCTEUgPSA2NCwJLypEaXNhYmxlIFNBQ0sqLworCVNQUF9TQUNLREVMQVlfRU5BQkxFID0gMTw8NSwJLypFbmFibGUgU0FDSyovCisJU1BQX1NBQ0tERUxBWV9ESVNBQkxFID0gMTw8NiwJLypEaXNhYmxlIFNBQ0sqLwogCVNQUF9TQUNLREVMQVkgPSBTUFBfU0FDS0RFTEFZX0VOQUJMRSB8IFNQUF9TQUNLREVMQVlfRElTQUJMRSwKKwlTUFBfSEJfVElNRV9JU19aRVJPID0gMTw8NywJLyogU2V0IEhCIGRlbGF5IHRvIDAgKi8KIH07CiAKIHN0cnVjdCBzY3RwX3BhZGRycGFyYW1zIHsKQEAgLTUzMCw3ICs1MzksNyBAQAogCV9fdTMyCQkJc3BwX2ZsYWdzOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKTsKIAotLyogNy4xLjI0LiBEZWxheWVkIEFjayBUaW1lciAoU0NUUF9ERUxBWUVEX0FDS19USU1FKQorLyogNy4xLjIzLiBEZWxheWVkIEFjayBUaW1lciAoU0NUUF9ERUxBWUVEX0FDS19USU1FKQogICoKICAqICAgVGhpcyBvcHRpb25zIHdpbGwgZ2V0IG9yIHNldCB0aGUgZGVsYXllZCBhY2sgdGltZXIuICBUaGUgdGltZSBpcyBzZXQKICAqICAgaW4gbWlsbGlzZWNvbmRzLiAgSWYgdGhlIGFzc29jX2lkIGlzIDAsIHRoZW4gdGhpcyBzZXRzIG9yIGdldHMgdGhlCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9zb2NrLmggYi9pbmNsdWRlL25ldC9zb2NrLmgKaW5kZXggMmM3ZDYwYy4uMjVjMzdlMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvc29jay5oCisrKyBiL2luY2x1ZGUvbmV0L3NvY2suaApAQCAtMjAyLDYgKzIwMiwxNSBAQAogCXVuc2lnbmVkIHNob3J0CQlza190eXBlOwogCWludAkJCXNrX3JjdmJ1ZjsKIAlzb2NrZXRfbG9ja190CQlza19sb2NrOworCS8qCisJICogVGhlIGJhY2tsb2cgcXVldWUgaXMgc3BlY2lhbCwgaXQgaXMgYWx3YXlzIHVzZWQgd2l0aAorCSAqIHRoZSBwZXItc29ja2V0IHNwaW5sb2NrIGhlbGQgYW5kIHJlcXVpcmVzIGxvdyBsYXRlbmN5CisJICogYWNjZXNzLiBUaGVyZWZvcmUgd2Ugc3BlY2lhbCBjYXNlIGl0J3MgaW1wbGVtZW50YXRpb24uCisJICovCisJc3RydWN0IHsKKwkJc3RydWN0IHNrX2J1ZmYgKmhlYWQ7CisJCXN0cnVjdCBza19idWZmICp0YWlsOworCX0gc2tfYmFja2xvZzsKIAl3YWl0X3F1ZXVlX2hlYWRfdAkqc2tfc2xlZXA7CiAJc3RydWN0IGRzdF9lbnRyeQkqc2tfZHN0X2NhY2hlOwogCXN0cnVjdCB4ZnJtX3BvbGljeQkqc2tfcG9saWN5WzJdOwpAQCAtMjIxLDE1ICsyMzAsNiBAQAogCWludAkJCXNrX3Jjdmxvd2F0OwogCXVuc2lnbmVkIGxvbmcgCQlza19mbGFnczsKIAl1bnNpZ25lZCBsb25nCSAgICAgICAgc2tfbGluZ2VydGltZTsKLQkvKgotCSAqIFRoZSBiYWNrbG9nIHF1ZXVlIGlzIHNwZWNpYWwsIGl0IGlzIGFsd2F5cyB1c2VkIHdpdGgKLQkgKiB0aGUgcGVyLXNvY2tldCBzcGlubG9jayBoZWxkIGFuZCByZXF1aXJlcyBsb3cgbGF0ZW5jeQotCSAqIGFjY2Vzcy4gVGhlcmVmb3JlIHdlIHNwZWNpYWwgY2FzZSBpdCdzIGltcGxlbWVudGF0aW9uLgotCSAqLwotCXN0cnVjdCB7Ci0JCXN0cnVjdCBza19idWZmICpoZWFkOwotCQlzdHJ1Y3Qgc2tfYnVmZiAqdGFpbDsKLQl9IHNrX2JhY2tsb2c7CiAJc3RydWN0IHNrX2J1ZmZfaGVhZAlza19lcnJvcl9xdWV1ZTsKIAlzdHJ1Y3QgcHJvdG8JCSpza19wcm90X2NyZWF0b3I7CiAJcndsb2NrX3QJCXNrX2NhbGxiYWNrX2xvY2s7CkBAIC0yNDQsNyArMjQ0LDcgQEAKIAlzdHJ1Y3Qgc2tfZmlsdGVyICAgICAgCSpza19maWx0ZXI7CiAJdm9pZAkJCSpza19wcm90aW5mbzsKIAlzdHJ1Y3QgdGltZXJfbGlzdAlza190aW1lcjsKLQlzdHJ1Y3QgdGltZXZhbAkJc2tfc3RhbXA7CisJa3RpbWVfdAkJCXNrX3N0YW1wOwogCXN0cnVjdCBzb2NrZXQJCSpza19zb2NrZXQ7CiAJdm9pZAkJCSpza191c2VyX2RhdGE7CiAJc3RydWN0IHBhZ2UJCSpza19zbmRtc2dfcGFnZTsKQEAgLTM5MCw2ICszOTAsNyBAQAogCVNPQ0tfVVNFX1dSSVRFX1FVRVVFLCAvKiB3aGV0aGVyIHRvIGNhbGwgc2stPnNrX3dyaXRlX3NwYWNlIGluIHNvY2tfd2ZyZWUgKi8KIAlTT0NLX0RCRywgLyogJVNPX0RFQlVHIHNldHRpbmcgKi8KIAlTT0NLX1JDVlRTVEFNUCwgLyogJVNPX1RJTUVTVEFNUCBzZXR0aW5nICovCisJU09DS19SQ1ZUU1RBTVBOUywgLyogJVNPX1RJTUVTVEFNUE5TIHNldHRpbmcgKi8KIAlTT0NLX0xPQ0FMUk9VVEUsIC8qIHJvdXRlIGxvY2FsbHkgb25seSwgJVNPX0RPTlRST1VURSBzZXR0aW5nICovCiAJU09DS19RVUVVRV9TSFJVTkssIC8qIHdyaXRlIHF1ZXVlIGhhcyBiZWVuIHNocnVuayByZWNlbnRseSAqLwogfTsKQEAgLTcxMCwxNSArNzExLDYgQEAKIAkJX19za19zdHJlYW1fbWVtX3JlY2xhaW0oc2spOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgc2tfc3RyZWFtX3dyaXRlcXVldWVfcHVyZ2Uoc3RydWN0IHNvY2sgKnNrKQotewotCXN0cnVjdCBza19idWZmICpza2I7Ci0KLQl3aGlsZSAoKHNrYiA9IF9fc2tiX2RlcXVldWUoJnNrLT5za193cml0ZV9xdWV1ZSkpICE9IE5VTEwpCi0JCXNrX3N0cmVhbV9mcmVlX3NrYihzaywgc2tiKTsKLQlza19zdHJlYW1fbWVtX3JlY2xhaW0oc2spOwotfQotCiBzdGF0aWMgaW5saW5lIGludCBza19zdHJlYW1fcm1lbV9zY2hlZHVsZShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJcmV0dXJuIChpbnQpc2tiLT50cnVlc2l6ZSA8PSBzay0+c2tfZm9yd2FyZF9hbGxvYyB8fApAQCAtMTA4MywxOSArMTA3NSw3IEBACiAJcmV0dXJuIG5ldF9nc29fb2soc2stPnNrX3JvdXRlX2NhcHMsIHNrLT5za19nc29fdHlwZSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBza19zZXR1cF9jYXBzKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IGRzdF9lbnRyeSAqZHN0KQotewotCV9fc2tfZHN0X3NldChzaywgZHN0KTsKLQlzay0+c2tfcm91dGVfY2FwcyA9IGRzdC0+ZGV2LT5mZWF0dXJlczsKLQlpZiAoc2stPnNrX3JvdXRlX2NhcHMgJiBORVRJRl9GX0dTTykKLQkJc2stPnNrX3JvdXRlX2NhcHMgfD0gTkVUSUZfRl9HU09fTUFTSzsKLQlpZiAoc2tfY2FuX2dzbyhzaykpIHsKLQkJaWYgKGRzdC0+aGVhZGVyX2xlbikKLQkJCXNrLT5za19yb3V0ZV9jYXBzICY9IH5ORVRJRl9GX0dTT19NQVNLOwotCQllbHNlIAotCQkJc2stPnNrX3JvdXRlX2NhcHMgfD0gTkVUSUZfRl9TRyB8IE5FVElGX0ZfSFdfQ1NVTTsKLQl9Ci19CitleHRlcm4gdm9pZCBza19zZXR1cF9jYXBzKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IGRzdF9lbnRyeSAqZHN0KTsKIAogc3RhdGljIGlubGluZSB2b2lkIHNrX2NoYXJnZV9za2Ioc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewpAQCAtMTI1NiwxOCArMTIzNiw2IEBACiAJcmV0dXJuIHBhZ2U7CiB9CiAKLSNkZWZpbmUgc2tfc3RyZWFtX2Zvcl9yZXRyYW5zX3F1ZXVlKHNrYiwgc2spCQkJCVwKLQkJZm9yIChza2IgPSAoc2spLT5za193cml0ZV9xdWV1ZS5uZXh0OwkJCVwKLQkJICAgICAoc2tiICE9IChzayktPnNrX3NlbmRfaGVhZCkgJiYJCQlcCi0JCSAgICAgKHNrYiAhPSAoc3RydWN0IHNrX2J1ZmYgKikmKHNrKS0+c2tfd3JpdGVfcXVldWUpOwlcCi0JCSAgICAgc2tiID0gc2tiLT5uZXh0KQotCi0vKmZyb20gU1RDUCBmb3IgZmFzdCBTQUNLIFByb2Nlc3MqLwotI2RlZmluZSBza19zdHJlYW1fZm9yX3JldHJhbnNfcXVldWVfZnJvbShza2IsIHNrKQkJCVwKLQkJZm9yICg7IChza2IgIT0gKHNrKS0+c2tfc2VuZF9oZWFkKSAmJiAgICAgICAgICAgICAgICAgICBcCi0JCSAgICAgKHNrYiAhPSAoc3RydWN0IHNrX2J1ZmYgKikmKHNrKS0+c2tfd3JpdGVfcXVldWUpOwlcCi0JCSAgICAgc2tiID0gc2tiLT5uZXh0KQotCiAvKgogICoJRGVmYXVsdCB3cml0ZSBwb2xpY3kgYXMgc2hvd24gdG8gdXNlciBzcGFjZSB2aWEgcG9sbC9zZWxlY3QvU0lHSU8KICAqLwpAQCAtMTMwNCwyMiArMTI3MiwxOCBAQAogCXJldHVybiB0aW1lbyA9PSBNQVhfU0NIRURVTEVfVElNRU9VVCA/IC1FUkVTVEFSVFNZUyA6IC1FSU5UUjsKIH0KIAorZXh0ZXJuIHZvaWQgX19zb2NrX3JlY3ZfdGltZXN0YW1wKHN0cnVjdCBtc2doZHIgKm1zZywgc3RydWN0IHNvY2sgKnNrLAorCXN0cnVjdCBza19idWZmICpza2IpOworCiBzdGF0aWMgX19pbmxpbmVfXyB2b2lkCiBzb2NrX3JlY3ZfdGltZXN0YW1wKHN0cnVjdCBtc2doZHIgKm1zZywgc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXN0cnVjdCB0aW1ldmFsIHN0YW1wOworCWt0aW1lX3Qga3QgPSBza2ItPnRzdGFtcDsKIAotCXNrYl9nZXRfdGltZXN0YW1wKHNrYiwgJnN0YW1wKTsKLQlpZiAoc29ja19mbGFnKHNrLCBTT0NLX1JDVlRTVEFNUCkpIHsKLQkJLyogUmFjZSBvY2N1cnJlZCBiZXR3ZWVuIHRpbWVzdGFtcCBlbmFibGluZyBhbmQgcGFja2V0Ci0JCSAgIHJlY2VpdmluZy4gIEZpbGwgaW4gdGhlIGN1cnJlbnQgdGltZSBmb3Igbm93LiAqLwotCQlpZiAoc3RhbXAudHZfc2VjID09IDApCi0JCQlkb19nZXR0aW1lb2ZkYXkoJnN0YW1wKTsKLQkJc2tiX3NldF90aW1lc3RhbXAoc2tiLCAmc3RhbXApOwotCQlwdXRfY21zZyhtc2csIFNPTF9TT0NLRVQsIFNPX1RJTUVTVEFNUCwgc2l6ZW9mKHN0cnVjdCB0aW1ldmFsKSwKLQkJCSAmc3RhbXApOwotCX0gZWxzZQotCQlzay0+c2tfc3RhbXAgPSBzdGFtcDsKKwlpZiAoc29ja19mbGFnKHNrLCBTT0NLX1JDVlRTVEFNUCkpCisJCV9fc29ja19yZWN2X3RpbWVzdGFtcChtc2csIHNrLCBza2IpOworCWVsc2UKKwkJc2stPnNrX3N0YW1wID0ga3Q7CiB9CiAKIC8qKgpAQCAtMTM1MCwxOCArMTMxNCwxNyBAQAogCiBleHRlcm4gdm9pZCBzb2NrX2VuYWJsZV90aW1lc3RhbXAoc3RydWN0IHNvY2sgKnNrKTsKIGV4dGVybiBpbnQgc29ja19nZXRfdGltZXN0YW1wKHN0cnVjdCBzb2NrICosIHN0cnVjdCB0aW1ldmFsIF9fdXNlciAqKTsKK2V4dGVybiBpbnQgc29ja19nZXRfdGltZXN0YW1wbnMoc3RydWN0IHNvY2sgKiwgc3RydWN0IHRpbWVzcGVjIF9fdXNlciAqKTsKIAogLyogCiAgKglFbmFibGUgZGVidWcvaW5mbyBtZXNzYWdlcyAKICAqLworZXh0ZXJuIGludCBuZXRfbXNnX3dhcm47CisjZGVmaW5lIE5FVERFQlVHKGZtdCwgYXJncy4uLikgXAorCWRvIHsgaWYgKG5ldF9tc2dfd2FybikgcHJpbnRrKGZtdCwjI2FyZ3MpOyB9IHdoaWxlICgwKQogCi0jaWZkZWYgQ09ORklHX05FVERFQlVHCi0jZGVmaW5lIE5FVERFQlVHKGZtdCwgYXJncy4uLikJcHJpbnRrKGZtdCwjI2FyZ3MpCi0jZGVmaW5lIExJTUlUX05FVERFQlVHKGZtdCwgYXJncy4uLikgZG8geyBpZiAobmV0X3JhdGVsaW1pdCgpKSBwcmludGsoZm10LCMjYXJncyk7IH0gd2hpbGUoMCkKLSNlbHNlCi0jZGVmaW5lIE5FVERFQlVHKGZtdCwgYXJncy4uLikJZG8geyB9IHdoaWxlICgwKQotI2RlZmluZSBMSU1JVF9ORVRERUJVRyhmbXQsIGFyZ3MuLi4pIGRvIHsgfSB3aGlsZSgwKQotI2VuZGlmCisjZGVmaW5lIExJTUlUX05FVERFQlVHKGZtdCwgYXJncy4uLikgXAorCWRvIHsgaWYgKG5ldF9tc2dfd2FybiAmJiBuZXRfcmF0ZWxpbWl0KCkpIHByaW50ayhmbXQsIyNhcmdzKTsgfSB3aGlsZSgwKQogCiAvKgogICogTWFjcm9zIGZvciBzbGVlcGluZyBvbiBhIHNvY2tldC4gVXNlIHRoZW0gbGlrZSB0aGlzOgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvdGNwLmggYi9pbmNsdWRlL25ldC90Y3AuaAppbmRleCA1YzQ3MmYyLi5lZjhmOWQ0IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC90Y3AuaAorKysgYi9pbmNsdWRlL25ldC90Y3AuaApAQCAtMjIwLDYgKzIyMCw3IEBACiBleHRlcm4gaW50IHN5c2N0bF90Y3BfYWR2X3dpbl9zY2FsZTsKIGV4dGVybiBpbnQgc3lzY3RsX3RjcF90d19yZXVzZTsKIGV4dGVybiBpbnQgc3lzY3RsX3RjcF9mcnRvOworZXh0ZXJuIGludCBzeXNjdGxfdGNwX2ZydG9fcmVzcG9uc2U7CiBleHRlcm4gaW50IHN5c2N0bF90Y3BfbG93X2xhdGVuY3k7CiBleHRlcm4gaW50IHN5c2N0bF90Y3BfZG1hX2NvcHlicmVhazsKIGV4dGVybiBpbnQgc3lzY3RsX3RjcF9ub21ldHJpY3Nfc2F2ZTsKQEAgLTIzMCw2ICsyMzEsNyBAQAogZXh0ZXJuIGludCBzeXNjdGxfdGNwX2Jhc2VfbXNzOwogZXh0ZXJuIGludCBzeXNjdGxfdGNwX3dvcmthcm91bmRfc2lnbmVkX3dpbmRvd3M7CiBleHRlcm4gaW50IHN5c2N0bF90Y3Bfc2xvd19zdGFydF9hZnRlcl9pZGxlOworZXh0ZXJuIGludCBzeXNjdGxfdGNwX21heF9zc3RocmVzaDsKIAogZXh0ZXJuIGF0b21pY190IHRjcF9tZW1vcnlfYWxsb2NhdGVkOwogZXh0ZXJuIGF0b21pY190IHRjcF9zb2NrZXRzX2FsbG9jYXRlZDsKQEAgLTM0MSw2ICszNDMsNyBAQAogZXh0ZXJuIGludAkJCXRjcF9jaGlsZF9wcm9jZXNzKHN0cnVjdCBzb2NrICpwYXJlbnQsCiAJCQkJCQkgIHN0cnVjdCBzb2NrICpjaGlsZCwKIAkJCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CitleHRlcm4gaW50CQkJdGNwX3VzZV9mcnRvKHN0cnVjdCBzb2NrICpzayk7CiBleHRlcm4gdm9pZAkJCXRjcF9lbnRlcl9mcnRvKHN0cnVjdCBzb2NrICpzayk7CiBleHRlcm4gdm9pZAkJCXRjcF9lbnRlcl9sb3NzKHN0cnVjdCBzb2NrICpzaywgaW50IGhvdyk7CiBleHRlcm4gdm9pZAkJCXRjcF9jbGVhcl9yZXRyYW5zKHN0cnVjdCB0Y3Bfc29jayAqdHApOwpAQCAtNDE3LDkgKzQyMCw5IEBACiAKIC8qIHRjcF9vdXRwdXQuYyAqLwogCi1leHRlcm4gdm9pZCBfX3RjcF9wdXNoX3BlbmRpbmdfZnJhbWVzKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHRjcF9zb2NrICp0cCwKLQkJCQkgICAgICB1bnNpZ25lZCBpbnQgY3VyX21zcywgaW50IG5vbmFnbGUpOwotZXh0ZXJuIGludCB0Y3BfbWF5X3NlbmRfbm93KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHRjcF9zb2NrICp0cCk7CitleHRlcm4gdm9pZCBfX3RjcF9wdXNoX3BlbmRpbmdfZnJhbWVzKHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgaW50IGN1cl9tc3MsCisJCQkJICAgICAgaW50IG5vbmFnbGUpOworZXh0ZXJuIGludCB0Y3BfbWF5X3NlbmRfbm93KHN0cnVjdCBzb2NrICpzayk7CiBleHRlcm4gaW50IHRjcF9yZXRyYW5zbWl0X3NrYihzdHJ1Y3Qgc29jayAqLCBzdHJ1Y3Qgc2tfYnVmZiAqKTsKIGV4dGVybiB2b2lkIHRjcF94bWl0X3JldHJhbnNtaXRfcXVldWUoc3RydWN0IHNvY2sgKik7CiBleHRlcm4gdm9pZCB0Y3Bfc2ltcGxlX3JldHJhbnNtaXQoc3RydWN0IHNvY2sgKik7CkBAIC00NzYsOCArNDc5LDEwIEBACiAJX190Y3BfZmFzdF9wYXRoX29uKHRwLCB0cC0+c25kX3duZCA+PiB0cC0+cnhfb3B0LnNuZF93c2NhbGUpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgdGNwX2Zhc3RfcGF0aF9jaGVjayhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCB0Y3Bfc29jayAqdHApCitzdGF0aWMgaW5saW5lIHZvaWQgdGNwX2Zhc3RfcGF0aF9jaGVjayhzdHJ1Y3Qgc29jayAqc2spCiB7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisKIAlpZiAoc2tiX3F1ZXVlX2VtcHR5KCZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlKSAmJgogCSAgICB0cC0+cmN2X3duZCAmJgogCSAgICBhdG9taWNfcmVhZCgmc2stPnNrX3JtZW1fYWxsb2MpIDwgc2stPnNrX3JjdmJ1ZiAmJgpAQCAtNTg4LDEwICs1OTMsMTAgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCB0Y3BfcGFja2V0c19vdXRfaW5jKHN0cnVjdCBzb2NrICpzaywgCi0JCQkJICAgICAgIHN0cnVjdCB0Y3Bfc29jayAqdHAsCitzdGF0aWMgaW5saW5lIHZvaWQgdGNwX3BhY2tldHNfb3V0X2luYyhzdHJ1Y3Qgc29jayAqc2ssCiAJCQkJICAgICAgIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCiB7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CiAJaW50IG9yaWcgPSB0cC0+cGFja2V0c19vdXQ7CiAKIAl0cC0+cGFja2V0c19vdXQgKz0gdGNwX3NrYl9wY291bnQoc2tiKTsKQEAgLTYyNCw5ICs2MjksMTIgQEAKICNkZWZpbmUgVENQX0NBX01BWAkxMjgKICNkZWZpbmUgVENQX0NBX0JVRl9NQVgJKFRDUF9DQV9OQU1FX01BWCpUQ1BfQ0FfTUFYKQogCisjZGVmaW5lIFRDUF9DT05HX05PTl9SRVNUUklDVEVEIDB4MQorI2RlZmluZSBUQ1BfQ09OR19SVFRfU1RBTVAJMHgyCisKIHN0cnVjdCB0Y3BfY29uZ2VzdGlvbl9vcHMgewogCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKLQlpbnQJbm9uX3Jlc3RyaWN0ZWQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCS8qIGluaXRpYWxpemUgcHJpdmF0ZSBkYXRhIChvcHRpb25hbCkgKi8KIAl2b2lkICgqaW5pdCkoc3RydWN0IHNvY2sgKnNrKTsKQEAgLTY0MCw4ICs2NDgsNiBAQAogCS8qIGRvIG5ldyBjd25kIGNhbGN1bGF0aW9uIChyZXF1aXJlZCkgKi8KIAl2b2lkICgqY29uZ19hdm9pZCkoc3RydWN0IHNvY2sgKnNrLCB1MzIgYWNrLAogCQkJICAgdTMyIHJ0dCwgdTMyIGluX2ZsaWdodCwgaW50IGdvb2RfYWNrKTsKLQkvKiByb3VuZCB0cmlwIHRpbWUgc2FtcGxlIHBlciBhY2tlZCBwYWNrZXQgKG9wdGlvbmFsKSAqLwotCXZvaWQgKCpydHRfc2FtcGxlKShzdHJ1Y3Qgc29jayAqc2ssIHUzMiB1c3J0dCk7CiAJLyogY2FsbCBiZWZvcmUgY2hhbmdpbmcgY2Ffc3RhdGUgKG9wdGlvbmFsKSAqLwogCXZvaWQgKCpzZXRfc3RhdGUpKHN0cnVjdCBzb2NrICpzaywgdTggbmV3X3N0YXRlKTsKIAkvKiBjYWxsIHdoZW4gY3duZCBldmVudCBvY2N1cnMgKG9wdGlvbmFsKSAqLwpAQCAtNjQ5LDcgKzY1NSw3IEBACiAJLyogbmV3IHZhbHVlIG9mIGN3bmQgYWZ0ZXIgbG9zcyAob3B0aW9uYWwpICovCiAJdTMyICAoKnVuZG9fY3duZCkoc3RydWN0IHNvY2sgKnNrKTsKIAkvKiBob29rIGZvciBwYWNrZXQgYWNrIGFjY291bnRpbmcgKG9wdGlvbmFsKSAqLwotCXZvaWQgKCpwa3RzX2Fja2VkKShzdHJ1Y3Qgc29jayAqc2ssIHUzMiBudW1fYWNrZWQpOworCXZvaWQgKCpwa3RzX2Fja2VkKShzdHJ1Y3Qgc29jayAqc2ssIHUzMiBudW1fYWNrZWQsIGt0aW1lX3QgbGFzdCk7CiAJLyogZ2V0IGluZm8gZm9yIGluZXRfZGlhZyAob3B0aW9uYWwpICovCiAJdm9pZCAoKmdldF9pbmZvKShzdHJ1Y3Qgc29jayAqc2ssIHUzMiBleHQsIHN0cnVjdCBza19idWZmICpza2IpOwogCkBAIC03MzAsMTMgKzczNiwxMSBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgdGNwX3N5bmNfbGVmdF9vdXQoc3RydWN0IHRjcF9zb2NrICp0cCkKIHsKLQlpZiAodHAtPnJ4X29wdC5zYWNrX29rICYmCi0JICAgICh0cC0+c2Fja2VkX291dCA+PSB0cC0+cGFja2V0c19vdXQgLSB0cC0+bG9zdF9vdXQpKQotCQl0cC0+c2Fja2VkX291dCA9IHRwLT5wYWNrZXRzX291dCAtIHRwLT5sb3N0X291dDsKKwlCVUdfT04odHAtPnNhY2tlZF9vdXQgKyB0cC0+bG9zdF9vdXQgPiB0cC0+cGFja2V0c19vdXQpOwogCXRwLT5sZWZ0X291dCA9IHRwLT5zYWNrZWRfb3V0ICsgdHAtPmxvc3Rfb3V0OwogfQogCi1leHRlcm4gdm9pZCB0Y3BfZW50ZXJfY3dyKHN0cnVjdCBzb2NrICpzayk7CitleHRlcm4gdm9pZCB0Y3BfZW50ZXJfY3dyKHN0cnVjdCBzb2NrICpzaywgY29uc3QgaW50IHNldF9zc3RocmVzaCk7CiBleHRlcm4gX191MzIgdGNwX2luaXRfY3duZChzdHJ1Y3QgdGNwX3NvY2sgKnRwLCBzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QpOwogCiAvKiBTbG93IHN0YXJ0IHdpdGggZGVsYWNrIHByb2R1Y2VzIDMgcGFja2V0cyBvZiBidXJzdCwgc28gdGhhdApAQCAtNzc1LDE4ICs3NzksMjEgQEAKIAkJdHAtPnNuZF9zbWwgPSBUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXE7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCB0Y3BfY2hlY2tfcHJvYmVfdGltZXIoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgdGNwX3NvY2sgKnRwKQorc3RhdGljIGlubGluZSB2b2lkIHRjcF9jaGVja19wcm9iZV90aW1lcihzdHJ1Y3Qgc29jayAqc2spCiB7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CiAJY29uc3Qgc3RydWN0IGluZXRfY29ubmVjdGlvbl9zb2NrICppY3NrID0gaW5ldF9jc2soc2spOworCiAJaWYgKCF0cC0+cGFja2V0c19vdXQgJiYgIWljc2stPmljc2tfcGVuZGluZykKIAkJaW5ldF9jc2tfcmVzZXRfeG1pdF90aW1lcihzaywgSUNTS19USU1FX1BST0JFMCwKIAkJCQkJICBpY3NrLT5pY3NrX3J0bywgVENQX1JUT19NQVgpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgdGNwX3B1c2hfcGVuZGluZ19mcmFtZXMoc3RydWN0IHNvY2sgKnNrLAotCQkJCQkgICBzdHJ1Y3QgdGNwX3NvY2sgKnRwKQorc3RhdGljIGlubGluZSB2b2lkIHRjcF9wdXNoX3BlbmRpbmdfZnJhbWVzKHN0cnVjdCBzb2NrICpzaykKIHsKLQlfX3RjcF9wdXNoX3BlbmRpbmdfZnJhbWVzKHNrLCB0cCwgdGNwX2N1cnJlbnRfbXNzKHNrLCAxKSwgdHAtPm5vbmFnbGUpOworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCisJX190Y3BfcHVzaF9wZW5kaW5nX2ZyYW1lcyhzaywgdGNwX2N1cnJlbnRfbXNzKHNrLCAxKSwgdHAtPm5vbmFnbGUpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgdGNwX2luaXRfd2woc3RydWN0IHRjcF9zb2NrICp0cCwgdTMyIGFjaywgdTMyIHNlcSkKQEAgLTgxNSw3ICs4MjIsNyBAQAogCiBzdGF0aWMgaW5saW5lIGludCB0Y3BfY2hlY2tzdW1fY29tcGxldGUoc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlyZXR1cm4gc2tiLT5pcF9zdW1tZWQgIT0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlkgJiYKKwlyZXR1cm4gIXNrYl9jc3VtX3VubmVjZXNzYXJ5KHNrYikgJiYKIAkJX190Y3BfY2hlY2tzdW1fY29tcGxldGUoc2tiKTsKIH0KIApAQCAtOTE4LDIxICs5MjUsNyBAQAogI2VuZGlmCQogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgdGNwX2RvbmUoc3RydWN0IHNvY2sgKnNrKQotewotCWlmKHNrLT5za19zdGF0ZSA9PSBUQ1BfU1lOX1NFTlQgfHwgc2stPnNrX3N0YXRlID09IFRDUF9TWU5fUkVDVikKLQkJVENQX0lOQ19TVEFUU19CSChUQ1BfTUlCX0FUVEVNUFRGQUlMUyk7Ci0KLQl0Y3Bfc2V0X3N0YXRlKHNrLCBUQ1BfQ0xPU0UpOwotCXRjcF9jbGVhcl94bWl0X3RpbWVycyhzayk7Ci0KLQlzay0+c2tfc2h1dGRvd24gPSBTSFVURE9XTl9NQVNLOwotCi0JaWYgKCFzb2NrX2ZsYWcoc2ssIFNPQ0tfREVBRCkpCi0JCXNrLT5za19zdGF0ZV9jaGFuZ2Uoc2spOwotCWVsc2UKLQkJaW5ldF9jc2tfZGVzdHJveV9zb2NrKHNrKTsKLX0KK2V4dGVybiB2b2lkIHRjcF9kb25lKHN0cnVjdCBzb2NrICpzayk7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCB0Y3Bfc2Fja19yZXNldChzdHJ1Y3QgdGNwX29wdGlvbnNfcmVjZWl2ZWQgKnJ4X29wdCkKIHsKQEAgLTk4MSw3ICs5NzQsNyBAQAogCWlyZXEtPndzY2FsZV9vayA9IHJ4X29wdC0+d3NjYWxlX29rOwogCWlyZXEtPmFja2VkID0gMDsKIAlpcmVxLT5lY25fb2sgPSAwOwotCWlyZXEtPnJtdF9wb3J0ID0gc2tiLT5oLnRoLT5zb3VyY2U7CisJaXJlcS0+cm10X3BvcnQgPSB0Y3BfaGRyKHNrYiktPnNvdXJjZTsKIH0KIAogZXh0ZXJuIHZvaWQgdGNwX2VudGVyX21lbW9yeV9wcmVzc3VyZSh2b2lkKTsKQEAgLTEwMTEsNyArMTAwNCw3IEBACiB7CiAJaWYgKChzMzIpKHJ4X29wdC0+cmN2X3RzdmFsIC0gcnhfb3B0LT50c19yZWNlbnQpID49IDApCiAJCXJldHVybiAwOwotCWlmICh4dGltZS50dl9zZWMgPj0gcnhfb3B0LT50c19yZWNlbnRfc3RhbXAgKyBUQ1BfUEFXU18yNERBWVMpCisJaWYgKGdldF9zZWNvbmRzKCkgPj0gcnhfb3B0LT50c19yZWNlbnRfc3RhbXAgKyBUQ1BfUEFXU18yNERBWVMpCiAJCXJldHVybiAwOwogCiAJLyogUlNUIHNlZ21lbnRzIGFyZSBub3QgcmVjb21tZW5kZWQgdG8gY2FycnkgdGltZXN0YW1wLApAQCAtMTAyNiwyNiArMTAxOSwxMyBAQAogCiAJICAgSG93ZXZlciwgd2UgY2FuIHJlbGF4IHRpbWUgYm91bmRzIGZvciBSU1Qgc2VnbWVudHMgdG8gTVNMLgogCSAqLwotCWlmIChyc3QgJiYgeHRpbWUudHZfc2VjID49IHJ4X29wdC0+dHNfcmVjZW50X3N0YW1wICsgVENQX1BBV1NfTVNMKQorCWlmIChyc3QgJiYgZ2V0X3NlY29uZHMoKSA+PSByeF9vcHQtPnRzX3JlY2VudF9zdGFtcCArIFRDUF9QQVdTX01TTCkKIAkJcmV0dXJuIDA7CiAJcmV0dXJuIDE7CiB9CiAKICNkZWZpbmUgVENQX0NIRUNLX1RJTUVSKHNrKSBkbyB7IH0gd2hpbGUgKDApCiAKLXN0YXRpYyBpbmxpbmUgaW50IHRjcF91c2VfZnJ0byhjb25zdCBzdHJ1Y3Qgc29jayAqc2spCi17Ci0JY29uc3Qgc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7Ci0JCi0JLyogRi1SVE8gbXVzdCBiZSBhY3RpdmF0ZWQgaW4gc3lzY3RsIGFuZCB0aGVyZSBtdXN0IGJlIHNvbWUKLQkgKiB1bnNlbnQgbmV3IGRhdGEsIGFuZCB0aGUgYWR2ZXJ0aXNlZCB3aW5kb3cgc2hvdWxkIGFsbG93Ci0JICogc2VuZGluZyBpdC4KLQkgKi8KLQlyZXR1cm4gKHN5c2N0bF90Y3BfZnJ0byAmJiBzay0+c2tfc2VuZF9oZWFkICYmCi0JCSFhZnRlcihUQ1BfU0tCX0NCKHNrLT5za19zZW5kX2hlYWQpLT5lbmRfc2VxLAotCQkgICAgICAgdHAtPnNuZF91bmEgKyB0cC0+c25kX3duZCkpOwotfQotCiBzdGF0aWMgaW5saW5lIHZvaWQgdGNwX21pYl9pbml0KHZvaWQpCiB7CiAJLyogU2VlIFJGQyAyMDEyICovCkBAIC0xMTcyLDYgKzExNTIsMTI1IEBACiAJcHV0X2NwdSgpOwogfQogCisvKiB3cml0ZSBxdWV1ZSBhYnN0cmFjdGlvbiAqLworc3RhdGljIGlubGluZSB2b2lkIHRjcF93cml0ZV9xdWV1ZV9wdXJnZShzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCXdoaWxlICgoc2tiID0gX19za2JfZGVxdWV1ZSgmc2stPnNrX3dyaXRlX3F1ZXVlKSkgIT0gTlVMTCkKKwkJc2tfc3RyZWFtX2ZyZWVfc2tiKHNrLCBza2IpOworCXNrX3N0cmVhbV9tZW1fcmVjbGFpbShzayk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKnRjcF93cml0ZV9xdWV1ZV9oZWFkKHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gc2stPnNrX3dyaXRlX3F1ZXVlLm5leHQ7CisJaWYgKHNrYiA9PSAoc3RydWN0IHNrX2J1ZmYgKikgJnNrLT5za193cml0ZV9xdWV1ZSkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIHNrYjsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqdGNwX3dyaXRlX3F1ZXVlX3RhaWwoc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCBza19idWZmICpza2IgPSBzay0+c2tfd3JpdGVfcXVldWUucHJldjsKKwlpZiAoc2tiID09IChzdHJ1Y3Qgc2tfYnVmZiAqKSAmc2stPnNrX3dyaXRlX3F1ZXVlKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gc2tiOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBza19idWZmICp0Y3Bfd3JpdGVfcXVldWVfbmV4dChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIHNrYi0+bmV4dDsKK30KKworI2RlZmluZSB0Y3BfZm9yX3dyaXRlX3F1ZXVlKHNrYiwgc2spCQkJCQlcCisJCWZvciAoc2tiID0gKHNrKS0+c2tfd3JpdGVfcXVldWUubmV4dDsJCQlcCisJCSAgICAgKHNrYiAhPSAoc3RydWN0IHNrX2J1ZmYgKikmKHNrKS0+c2tfd3JpdGVfcXVldWUpOwlcCisJCSAgICAgc2tiID0gc2tiLT5uZXh0KQorCisjZGVmaW5lIHRjcF9mb3Jfd3JpdGVfcXVldWVfZnJvbShza2IsIHNrKQkJCQlcCisJCWZvciAoOyAoc2tiICE9IChzdHJ1Y3Qgc2tfYnVmZiAqKSYoc2spLT5za193cml0ZV9xdWV1ZSk7XAorCQkgICAgIHNrYiA9IHNrYi0+bmV4dCkKKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqdGNwX3NlbmRfaGVhZChzdHJ1Y3Qgc29jayAqc2spCit7CisJcmV0dXJuIHNrLT5za19zZW5kX2hlYWQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y3BfYWR2YW5jZV9zZW5kX2hlYWQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCisJc2stPnNrX3NlbmRfaGVhZCA9IHNrYi0+bmV4dDsKKwlpZiAoc2stPnNrX3NlbmRfaGVhZCA9PSAoc3RydWN0IHNrX2J1ZmYgKikmc2stPnNrX3dyaXRlX3F1ZXVlKQorCQlzay0+c2tfc2VuZF9oZWFkID0gTlVMTDsKKwkvKiBEb24ndCBvdmVycmlkZSBOYWdsZSBpbmRlZmluYXRlbHkgd2l0aCBGLVJUTyAqLworCWlmICh0cC0+ZnJ0b19jb3VudGVyID09IDIpCisJCXRwLT5mcnRvX2NvdW50ZXIgPSAzOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNwX2NoZWNrX3NlbmRfaGVhZChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2JfdW5saW5rZWQpCit7CisJaWYgKHNrLT5za19zZW5kX2hlYWQgPT0gc2tiX3VubGlua2VkKQorCQlzay0+c2tfc2VuZF9oZWFkID0gTlVMTDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjcF9pbml0X3NlbmRfaGVhZChzdHJ1Y3Qgc29jayAqc2spCit7CisJc2stPnNrX3NlbmRfaGVhZCA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3RjcF9hZGRfd3JpdGVfcXVldWVfdGFpbChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJX19za2JfcXVldWVfdGFpbCgmc2stPnNrX3dyaXRlX3F1ZXVlLCBza2IpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNwX2FkZF93cml0ZV9xdWV1ZV90YWlsKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlfX3RjcF9hZGRfd3JpdGVfcXVldWVfdGFpbChzaywgc2tiKTsKKworCS8qIFF1ZXVlIGl0LCByZW1lbWJlcmluZyB3aGVyZSB3ZSBtdXN0IHN0YXJ0IHNlbmRpbmcuICovCisJaWYgKHNrLT5za19zZW5kX2hlYWQgPT0gTlVMTCkKKwkJc2stPnNrX3NlbmRfaGVhZCA9IHNrYjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9fdGNwX2FkZF93cml0ZV9xdWV1ZV9oZWFkKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlfX3NrYl9xdWV1ZV9oZWFkKCZzay0+c2tfd3JpdGVfcXVldWUsIHNrYik7Cit9CisKKy8qIEluc2VydCBidWZmIGFmdGVyIHNrYiBvbiB0aGUgd3JpdGUgcXVldWUgb2Ygc2suICAqLworc3RhdGljIGlubGluZSB2b2lkIHRjcF9pbnNlcnRfd3JpdGVfcXVldWVfYWZ0ZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkJCXN0cnVjdCBza19idWZmICpidWZmLAorCQkJCQkJc3RydWN0IHNvY2sgKnNrKQoreworCV9fc2tiX2FwcGVuZChza2IsIGJ1ZmYsICZzay0+c2tfd3JpdGVfcXVldWUpOworfQorCisvKiBJbnNlcnQgc2tiIGJldHdlZW4gcHJldiBhbmQgbmV4dCBvbiB0aGUgd3JpdGUgcXVldWUgb2Ygc2suICAqLworc3RhdGljIGlubGluZSB2b2lkIHRjcF9pbnNlcnRfd3JpdGVfcXVldWVfYmVmb3JlKHN0cnVjdCBza19idWZmICpuZXcsCisJCQkJCQkgIHN0cnVjdCBza19idWZmICpza2IsCisJCQkJCQkgIHN0cnVjdCBzb2NrICpzaykKK3sKKwlfX3NrYl9pbnNlcnQobmV3LCBza2ItPnByZXYsIHNrYiwgJnNrLT5za193cml0ZV9xdWV1ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y3BfdW5saW5rX3dyaXRlX3F1ZXVlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBzb2NrICpzaykKK3sKKwlfX3NrYl91bmxpbmsoc2tiLCAmc2stPnNrX3dyaXRlX3F1ZXVlKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgdGNwX3NrYl9pc19sYXN0KGNvbnN0IHN0cnVjdCBzb2NrICpzaywKKwkJCQkgIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIHNrYi0+bmV4dCA9PSAoc3RydWN0IHNrX2J1ZmYgKikmc2stPnNrX3dyaXRlX3F1ZXVlOworfQorCitzdGF0aWMgaW5saW5lIGludCB0Y3Bfd3JpdGVfcXVldWVfZW1wdHkoc3RydWN0IHNvY2sgKnNrKQoreworCXJldHVybiBza2JfcXVldWVfZW1wdHkoJnNrLT5za193cml0ZV9xdWV1ZSk7Cit9CisKIC8qIC9wcm9jICovCiBlbnVtIHRjcF9zZXFfc3RhdGVzIHsKIAlUQ1BfU0VRX1NUQVRFX0xJU1RFTklORywKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3RjcF9lY24uaCBiL2luY2x1ZGUvbmV0L3RjcF9lY24uaAppbmRleCA0NjI5ZDc3Li44OWViM2UwIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC90Y3BfZWNuLmgKKysrIGIvaW5jbHVkZS9uZXQvdGNwX2Vjbi5oCkBAIC0yNyw5ICsyNywxMCBAQAogCQlUQ1BfU0tCX0NCKHNrYiktPmZsYWdzICY9IH5UQ1BDQl9GTEFHX0VDRTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIFRDUF9FQ05fc2VuZF9zeW4oc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgdGNwX3NvY2sgKnRwLAotCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorc3RhdGljIGlubGluZSB2b2lkIFRDUF9FQ05fc2VuZF9zeW4oc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogeworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCiAJdHAtPmVjbl9mbGFncyA9IDA7CiAJaWYgKHN5c2N0bF90Y3BfZWNuKSB7CiAJCVRDUF9TS0JfQ0Ioc2tiKS0+ZmxhZ3MgfD0gVENQQ0JfRkxBR19FQ0V8VENQQ0JfRkxBR19DV1I7CkBAIC00NCw5ICs0NSwxMSBAQAogCQl0aC0+ZWNlID0gMTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIFRDUF9FQ05fc2VuZChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCB0Y3Bfc29jayAqdHAsCi0JCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHRjcF9oZWFkZXJfbGVuKQorc3RhdGljIGlubGluZSB2b2lkIFRDUF9FQ05fc2VuZChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsCisJCQkJaW50IHRjcF9oZWFkZXJfbGVuKQogeworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCiAJaWYgKHRwLT5lY25fZmxhZ3MgJiBUQ1BfRUNOX09LKSB7CiAJCS8qIE5vdC1yZXRyYW5zbWl0dGVkIGRhdGEgc2VnbWVudDogc2V0IEVDVCBhbmQgaW5qZWN0IENXUi4gKi8KIAkJaWYgKHNrYi0+bGVuICE9IHRjcF9oZWFkZXJfbGVuICYmCkBAIC01NCw3ICs1Nyw3IEBACiAJCQlJTkVUX0VDTl94bWl0KHNrKTsKIAkJCWlmICh0cC0+ZWNuX2ZsYWdzJlRDUF9FQ05fUVVFVUVfQ1dSKSB7CiAJCQkJdHAtPmVjbl9mbGFncyAmPSB+VENQX0VDTl9RVUVVRV9DV1I7Ci0JCQkJc2tiLT5oLnRoLT5jd3IgPSAxOworCQkJCXRjcF9oZHIoc2tiKS0+Y3dyID0gMTsKIAkJCQlza2Jfc2hpbmZvKHNrYiktPmdzb190eXBlIHw9IFNLQl9HU09fVENQX0VDTjsKIAkJCX0KIAkJfSBlbHNlIHsKQEAgLTYyLDcgKzY1LDcgQEAKIAkJCUlORVRfRUNOX2RvbnR4bWl0KHNrKTsKIAkJfQogCQlpZiAodHAtPmVjbl9mbGFncyAmIFRDUF9FQ05fREVNQU5EX0NXUikKLQkJCXNrYi0+aC50aC0+ZWNlID0gMTsKKwkJCXRjcF9oZHIoc2tiKS0+ZWNlID0gMTsKIAl9CiB9CiAKQEAgLTcwLDcgKzczLDcgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIFRDUF9FQ05fYWNjZXB0X2N3cihzdHJ1Y3QgdGNwX3NvY2sgKnRwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCWlmIChza2ItPmgudGgtPmN3cikKKwlpZiAodGNwX2hkcihza2IpLT5jd3IpCiAJCXRwLT5lY25fZmxhZ3MgJj0gflRDUF9FQ05fREVNQU5EX0NXUjsKIH0KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvdWRwLmggYi9pbmNsdWRlL25ldC91ZHAuaAppbmRleCAxYjkyMWZhLi45ODc1NWViIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC91ZHAuaAorKysgYi9pbmNsdWRlL25ldC91ZHAuaApAQCAtNzIsMTUgKzcyLDEyIEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgX19zdW0xNiBfX3VkcF9saWJfY2hlY2tzdW1fY29tcGxldGUoc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlpZiAoISBVRFBfU0tCX0NCKHNrYiktPnBhcnRpYWxfY292KQotCQlyZXR1cm4gX19za2JfY2hlY2tzdW1fY29tcGxldGUoc2tiKTsKLQlyZXR1cm4gY3N1bV9mb2xkKHNrYl9jaGVja3N1bShza2IsIDAsIFVEUF9TS0JfQ0Ioc2tiKS0+Y3Njb3YsCi0JCQkJICAgICAgc2tiLT5jc3VtKSk7CisJcmV0dXJuIF9fc2tiX2NoZWNrc3VtX2NvbXBsZXRlX2hlYWQoc2tiLCBVRFBfU0tCX0NCKHNrYiktPmNzY292KTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgdWRwX2xpYl9jaGVja3N1bV9jb21wbGV0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXJldHVybiBza2ItPmlwX3N1bW1lZCAhPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWSAmJgorCXJldHVybiAhc2tiX2NzdW1fdW5uZWNlc3Nhcnkoc2tiKSAmJgogCQlfX3VkcF9saWJfY2hlY2tzdW1fY29tcGxldGUoc2tiKTsKIH0KIApAQCAtOTIsOCArODksOCBAQAogICovCiBzdGF0aWMgaW5saW5lIF9fd3N1bSB1ZHBfY3N1bV9vdXRnb2luZyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JX193c3VtIGNzdW0gPSBjc3VtX3BhcnRpYWwoc2tiLT5oLnJhdywgc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpLCAwKTsKLQorCV9fd3N1bSBjc3VtID0gY3N1bV9wYXJ0aWFsKHNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYiksCisJCQkJICAgc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpLCAwKTsKIAlza2JfcXVldWVfd2Fsaygmc2stPnNrX3dyaXRlX3F1ZXVlLCBza2IpIHsKIAkJY3N1bSA9IGNzdW1fYWRkKGNzdW0sIHNrYi0+Y3N1bSk7CiAJfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvdWRwbGl0ZS5oIGIvaW5jbHVkZS9uZXQvdWRwbGl0ZS5oCmluZGV4IDY3YWM1MTQuLjYzNWIwZWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3VkcGxpdGUuaAorKysgYi9pbmNsdWRlL25ldC91ZHBsaXRlLmgKQEAgLTQ3LDExICs0NywxMCBAQAogCQlyZXR1cm4gMTsKIAl9CiAKLSAgICAgICAgVURQX1NLQl9DQihza2IpLT5wYXJ0aWFsX2NvdiA9IDA7CiAJY3Njb3YgPSBudG9ocyh1aC0+bGVuKTsKIAogCWlmIChjc2NvdiA9PSAwKQkJIC8qIEluZGljYXRlcyB0aGF0IGZ1bGwgY292ZXJhZ2UgaXMgcmVxdWlyZWQuICovCi0JCWNzY292ID0gc2tiLT5sZW47CisJCTsKIAllbHNlIGlmIChjc2NvdiA8IDggIHx8IGNzY292ID4gc2tiLT5sZW4pIHsKIAkJLyoKIAkJICogQ292ZXJhZ2UgbGVuZ3RoIHZpb2xhdGVzIFJGQyAzODI4OiBsb2cgYW5kIGRpc2NhcmQgc2lsZW50bHkuCkBAIC02MCw0MiArNTksMTYgQEAKIAkJCSAgICAgICBjc2Nvdiwgc2tiLT5sZW4pOwogCQlyZXR1cm4gMTsKIAotCX0gZWxzZSBpZiAoY3Njb3YgPCBza2ItPmxlbikKKwl9IGVsc2UgaWYgKGNzY292IDwgc2tiLT5sZW4pIHsKICAgICAgICAgCVVEUF9TS0JfQ0Ioc2tiKS0+cGFydGlhbF9jb3YgPSAxOwotCi0gICAgICAgIFVEUF9TS0JfQ0Ioc2tiKS0+Y3Njb3YgPSBjc2NvdjsKLQotCS8qCi0JICogVGhlcmUgaXMgbm8ga25vd24gTklDIG1hbnVmYWN0dXJlciBzdXBwb3J0aW5nIFVEUC1MaXRlIHlldCwKLQkgKiBoZW5jZSBpcF9zdW1tZWQgaXMgYWx3YXlzIChyZS0pc2V0IHRvIENIRUNLU1VNX05PTkUuCi0JICovCi0Jc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworCQlVRFBfU0tCX0NCKHNrYiktPmNzY292ID0gY3Njb3Y7CisJCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9DT01QTEVURSkKKwkJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKKyAgICAgICAgfQogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBfX2lubGluZV9fIGludCB1ZHBsaXRlNF9jc3VtX2luaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHVkcGhkciAqdWgpCi17Ci0JaW50IHJjID0gdWRwbGl0ZV9jaGVja3N1bV9pbml0KHNrYiwgdWgpOwotCi0JaWYgKCFyYykKLQkJc2tiLT5jc3VtID0gY3N1bV90Y3B1ZHBfbm9mb2xkKHNrYi0+bmguaXBoLT5zYWRkciwKLQkJCQkJICAgICAgIHNrYi0+bmguaXBoLT5kYWRkciwKLQkJCQkJICAgICAgIHNrYi0+bGVuLCBJUFBST1RPX1VEUExJVEUsIDApOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIF9faW5saW5lX18gaW50IHVkcGxpdGU2X2NzdW1faW5pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdWRwaGRyICp1aCkKLXsKLQlpbnQgcmMgPSB1ZHBsaXRlX2NoZWNrc3VtX2luaXQoc2tiLCB1aCk7Ci0KLQlpZiAoIXJjKQotCQlza2ItPmNzdW0gPSB+Y3N1bV91bmZvbGQoY3N1bV9pcHY2X21hZ2ljKCZza2ItPm5oLmlwdjZoLT5zYWRkciwKLQkJCQkJICAgICAmc2tiLT5uaC5pcHY2aC0+ZGFkZHIsCi0JCQkJCSAgICAgc2tiLT5sZW4sIElQUFJPVE9fVURQTElURSwgMCkpOwotCXJldHVybiByYzsKLX0KLQogc3RhdGljIGlubGluZSBpbnQgdWRwbGl0ZV9zZW5kZXJfY3Njb3Yoc3RydWN0IHVkcF9zb2NrICp1cCwgc3RydWN0IHVkcGhkciAqdWgpCiB7CiAJaW50IGNzY292ID0gdXAtPmxlbjsKQEAgLTEyOCwxNCArMTAxLDE0IEBACiAKIHN0YXRpYyBpbmxpbmUgX193c3VtIHVkcGxpdGVfY3N1bV9vdXRnb2luZyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JaW50IG9mZiwgbGVuLCBjc2NvdiA9IHVkcGxpdGVfc2VuZGVyX2NzY292KHVkcF9zayhzayksIHNrYi0+aC51aCk7CisJaW50IGNzY292ID0gdWRwbGl0ZV9zZW5kZXJfY3Njb3YodWRwX3NrKHNrKSwgdWRwX2hkcihza2IpKTsKIAlfX3dzdW0gY3N1bSA9IDA7CiAKIAlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7ICAgICAvKiBubyBIVyBzdXBwb3J0IGZvciBjaGVja3N1bW1pbmcgKi8KIAogCXNrYl9xdWV1ZV93YWxrKCZzay0+c2tfd3JpdGVfcXVldWUsIHNrYikgewotCQlvZmYgPSBza2ItPmgucmF3IC0gc2tiLT5kYXRhOwotCQlsZW4gPSBza2ItPmxlbiAtIG9mZjsKKwkJY29uc3QgaW50IG9mZiA9IHNrYl90cmFuc3BvcnRfb2Zmc2V0KHNrYik7CisJCWNvbnN0IGludCBsZW4gPSBza2ItPmxlbiAtIG9mZjsKIAogCQljc3VtID0gc2tiX2NoZWNrc3VtKHNrYiwgb2ZmLCAoY3Njb3YgPiBsZW4pPyBsZW4gOiBjc2NvdiwgY3N1bSk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3dleHQuaCBiL2luY2x1ZGUvbmV0L3dleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDJiOGRlCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9uZXQvd2V4dC5oCkBAIC0wLDAgKzEsMjQgQEAKKyNpZm5kZWYgX19ORVRfV0VYVF9ICisjZGVmaW5lIF9fTkVUX1dFWFRfSAorCisvKgorICogd2lyZWxlc3MgZXh0ZW5zaW9ucyBpbnRlcmZhY2UgdG8gdGhlIGNvcmUgY29kZQorICovCisKKyNpZmRlZiBDT05GSUdfV0lSRUxFU1NfRVhUCitleHRlcm4gaW50IHdleHRfcHJvY19pbml0KHZvaWQpOworZXh0ZXJuIGludCB3ZXh0X2hhbmRsZV9pb2N0bChzdHJ1Y3QgaWZyZXEgKmlmciwgdW5zaWduZWQgaW50IGNtZCwKKwkJCSAgICAgdm9pZCBfX3VzZXIgKmFyZyk7CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgd2V4dF9wcm9jX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbmxpbmUgaW50IHdleHRfaGFuZGxlX2lvY3RsKHN0cnVjdCBpZnJlcSAqaWZyLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJCSAgICB2b2lkIF9fdXNlciAqYXJnKQoreworCXJldHVybiAtRUlOVkFMOworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX05FVF9XRVhUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3dpcmVsZXNzLmggYi9pbmNsdWRlL25ldC93aXJlbGVzcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzMGM0YmEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL25ldC93aXJlbGVzcy5oCkBAIC0wLDAgKzEsMTM5IEBACisjaWZuZGVmIF9fTkVUX1dJUkVMRVNTX0gKKyNkZWZpbmUgX19ORVRfV0lSRUxFU1NfSAorCisvKgorICogODAyLjExIGRldmljZSBtYW5hZ2VtZW50CisgKgorICogQ29weXJpZ2h0IDIwMDcJSm9oYW5uZXMgQmVyZyA8am9oYW5uZXNAc2lwc29sdXRpb25zLm5ldD4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxuZXQvY2ZnODAyMTEuaD4KKworLyoqCisgKiBzdHJ1Y3Qgd2lwaHkgLSB3aXJlbGVzcyBoYXJkd2FyZSBkZXNjcmlwdGlvbgorICogQGlkeDogdGhlIHdpcGh5IGluZGV4IGFzc2lnbmVkIHRvIHRoaXMgaXRlbQorICogQGNsYXNzX2RldjogdGhlIGNsYXNzIGRldmljZSByZXByZXNlbnRpbmcgL3N5cy9jbGFzcy9pZWVlODAyMTEvPHdpcGh5LW5hbWU+CisgKi8KK3N0cnVjdCB3aXBoeSB7CisJLyogYXNzaWduIHRoZXNlIGZpZWxkcyBiZWZvcmUgeW91IHJlZ2lzdGVyIHRoZSB3aXBoeSAqLworCisJLyogcGVybWFuZW50IE1BQyBhZGRyZXNzICovCisJdTggcGVybV9hZGRyW0VUSF9BTEVOXTsKKworCS8qIElmIG11bHRpcGxlIHdpcGh5cyBhcmUgcmVnaXN0ZXJlZCBhbmQgeW91J3JlIGhhbmRlZCBlLmcuCisJICogYSByZWd1bGFyIG5ldGRldiB3aXRoIGFzc2lnbmVkIGllZWU4MDIxMV9wdHIsIHlvdSB3b24ndAorCSAqIGtub3cgd2hldGhlciBpdCBwb2ludHMgdG8gYSB3aXBoeSB5b3VyIGRyaXZlciBoYXMgcmVnaXN0ZXJlZAorCSAqIG9yIG5vdC4gQXNzaWduIHRoaXMgdG8gc29tZXRoaW5nIGdsb2JhbCB0byB5b3VyIGRyaXZlciB0bworCSAqIGhlbHAgZGV0ZXJtaW5lIHdoZXRoZXIgeW91IG93biB0aGlzIHdpcGh5IG9yIG5vdC4gKi8KKwl2b2lkICpwcml2aWQ7CisKKwkvKiBmaWVsZHMgYmVsb3cgYXJlIHJlYWQtb25seSwgYXNzaWduZWQgYnkgY2ZnODAyMTEgKi8KKworCS8qIHRoZSBpdGVtIGluIC9zeXMvY2xhc3MvaWVlZTgwMjExLyBwb2ludHMgdG8gdGhpcywKKwkgKiB5b3UgbmVlZCB1c2Ugc2V0X3dpcGh5X2RldigpIChzZWUgYmVsb3cpICovCisJc3RydWN0IGRldmljZSBkZXY7CisKKwkvKiBkaXIgaW4gZGVidWdmczogaWVlZTgwMjExLzx3aXBoeW5hbWU+ICovCisJc3RydWN0IGRlbnRyeSAqZGVidWdmc2RpcjsKKworCWNoYXIgcHJpdlswXSBfX2F0dHJpYnV0ZV9fKChfX2FsaWduZWRfXyhORVRERVZfQUxJR04pKSk7Cit9OworCisvKiogc3RydWN0IHdpcmVsZXNzX2RldiAtIHdpcmVsZXNzIHBlci1uZXRkZXYgc3RhdGUKKyAqCisgKiBUaGlzIHN0cnVjdHVyZSBtdXN0IGJlIGFsbG9jYXRlZCBieSB0aGUgZHJpdmVyL3N0YWNrCisgKiB0aGF0IHVzZXMgdGhlIGllZWU4MDIxMV9wdHIgZmllbGQgaW4gc3RydWN0IG5ldF9kZXZpY2UKKyAqICh0aGlzIGlzIGludGVudGlvbmFsIHNvIGl0IGNhbiBiZSBhbGxvY2F0ZWQgYWxvbmcgd2l0aAorICogdGhlIG5ldGRldi4pCisgKgorICogQHdpcGh5OiBwb2ludGVyIHRvIGhhcmR3YXJlIGRlc2NyaXB0aW9uCisgKi8KK3N0cnVjdCB3aXJlbGVzc19kZXYgeworCXN0cnVjdCB3aXBoeSAqd2lwaHk7CisKKwkvKiBwcml2YXRlIHRvIHRoZSBnZW5lcmljIHdpcmVsZXNzIGNvZGUgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKK307CisKKy8qKgorICogd2lwaHlfcHJpdiAtIHJldHVybiBwcml2IGZyb20gd2lwaHkKKyAqLworc3RhdGljIGlubGluZSB2b2lkICp3aXBoeV9wcml2KHN0cnVjdCB3aXBoeSAqd2lwaHkpCit7CisJQlVHX09OKCF3aXBoeSk7CisJcmV0dXJuICZ3aXBoeS0+cHJpdjsKK30KKworLyoqCisgKiBzZXRfd2lwaHlfZGV2IC0gc2V0IGRldmljZSBwb2ludGVyIGZvciB3aXBoeQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3dpcGh5X2RldihzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJd2lwaHktPmRldi5wYXJlbnQgPSBkZXY7Cit9CisKKy8qKgorICogd2lwaHlfZGV2IC0gZ2V0IHdpcGh5IGRldiBwb2ludGVyCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGRldmljZSAqd2lwaHlfZGV2KHN0cnVjdCB3aXBoeSAqd2lwaHkpCit7CisJcmV0dXJuIHdpcGh5LT5kZXYucGFyZW50OworfQorCisvKioKKyAqIHdpcGh5X25hbWUgLSBnZXQgd2lwaHkgbmFtZQorICovCitzdGF0aWMgaW5saW5lIGNoYXIgKndpcGh5X25hbWUoc3RydWN0IHdpcGh5ICp3aXBoeSkKK3sKKwlyZXR1cm4gd2lwaHktPmRldi5idXNfaWQ7Cit9CisKKy8qKgorICogd2Rldl9wcml2IC0gcmV0dXJuIHdpcGh5IHByaXYgZnJvbSB3aXJlbGVzc19kZXYKKyAqLworc3RhdGljIGlubGluZSB2b2lkICp3ZGV2X3ByaXYoc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldikKK3sKKwlCVUdfT04oIXdkZXYpOworCXJldHVybiB3aXBoeV9wcml2KHdkZXYtPndpcGh5KTsKK30KKworLyoqCisgKiB3aXBoeV9uZXcgLSBjcmVhdGUgYSBuZXcgd2lwaHkgZm9yIHVzZSB3aXRoIGNmZzgwMjExCisgKgorICogY3JlYXRlIGEgbmV3IHdpcGh5IGFuZCBhc3NvY2lhdGUgdGhlIGdpdmVuIG9wZXJhdGlvbnMgd2l0aCBpdC4KKyAqIEBzaXplb2ZfcHJpdiBieXRlcyBhcmUgYWxsb2NhdGVkIGZvciBwcml2YXRlIHVzZS4KKyAqCisgKiB0aGUgcmV0dXJuZWQgcG9pbnRlciBtdXN0IGJlIGFzc2lnbmVkIHRvIGVhY2ggbmV0ZGV2J3MKKyAqIGllZWU4MDIxMV9wdHIgZm9yIHByb3BlciBvcGVyYXRpb24uCisgKi8KK3N0cnVjdCB3aXBoeSAqd2lwaHlfbmV3KHN0cnVjdCBjZmc4MDIxMV9vcHMgKm9wcywgaW50IHNpemVvZl9wcml2KTsKKworLyoqCisgKiB3aXBoeV9yZWdpc3RlciAtIHJlZ2lzdGVyIGEgd2lwaHkgd2l0aCBjZmc4MDIxMQorICoKKyAqIHJlZ2lzdGVyIHRoZSBnaXZlbiB3aXBoeQorICoKKyAqIFJldHVybnMgYSBub24tbmVnYXRpdmUgd2lwaHkgaW5kZXggb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICovCitleHRlcm4gaW50IHdpcGh5X3JlZ2lzdGVyKHN0cnVjdCB3aXBoeSAqd2lwaHkpOworCisvKioKKyAqIHdpcGh5X3VucmVnaXN0ZXIgLSBkZXJlZ2lzdGVyIGEgd2lwaHkgZnJvbSBjZmc4MDIxMQorICoKKyAqIHVucmVnaXN0ZXIgYSBkZXZpY2Ugd2l0aCB0aGUgZ2l2ZW4gcHJpdiBwb2ludGVyLgorICogQWZ0ZXIgdGhpcyBjYWxsLCBubyBtb3JlIHJlcXVlc3RzIGNhbiBiZSBtYWRlIHdpdGggdGhpcyBwcml2CisgKiBwb2ludGVyLCBidXQgdGhlIGNhbGwgbWF5IHNsZWVwIHRvIHdhaXQgZm9yIGFuIG91dHN0YW5kaW5nCisgKiByZXF1ZXN0IHRoYXQgaXMgYmVpbmcgaGFuZGxlZC4KKyAqLworZXh0ZXJuIHZvaWQgd2lwaHlfdW5yZWdpc3RlcihzdHJ1Y3Qgd2lwaHkgKndpcGh5KTsKKworLyoqCisgKiB3aXBoeV9mcmVlIC0gZnJlZSB3aXBoeQorICovCitleHRlcm4gdm9pZCB3aXBoeV9mcmVlKHN0cnVjdCB3aXBoeSAqd2lwaHkpOworCisjZW5kaWYgLyogX19ORVRfV0lSRUxFU1NfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQveDI1ZGV2aWNlLmggYi9pbmNsdWRlL25ldC94MjVkZXZpY2UuaAppbmRleCAxZDEwYzg3Li4xNDE1YmNmIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC94MjVkZXZpY2UuaAorKysgYi9pbmNsdWRlL25ldC94MjVkZXZpY2UuaApAQCAtNyw4ICs3LDggQEAKIAogc3RhdGljIGlubGluZSBfX2JlMTYgeDI1X3R5cGVfdHJhbnMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CiAJc2tiLT5kZXYgPSBkZXY7CisJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKIAlza2ItPnBrdF90eXBlID0gUEFDS0VUX0hPU1Q7CiAJCiAJcmV0dXJuIGh0b25zKEVUSF9QX1gyNSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC94ZnJtLmggYi9pbmNsdWRlL25ldC94ZnJtLmgKaW5kZXggNWEwMGFhOC4uNjZjMmQzZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQveGZybS5oCisrKyBiL2luY2x1ZGUvbmV0L3hmcm0uaApAQCAtMjc5LDcgKzI3OSw3IEBACiAJeGZybV9hZGRyZXNzX3QJCSooKmxvY2FsX2FkZHIpKHN0cnVjdCB4ZnJtX3N0YXRlICosIHhmcm1fYWRkcmVzc190ICopOwogCXhmcm1fYWRkcmVzc190CQkqKCpyZW1vdGVfYWRkcikoc3RydWN0IHhmcm1fc3RhdGUgKiwgeGZybV9hZGRyZXNzX3QgKik7CiAJLyogRXN0aW1hdGUgbWF4aW1hbCBzaXplIG9mIHJlc3VsdCBvZiB0cmFuc2Zvcm1hdGlvbiBvZiBhIGRncmFtICovCi0JdTMyCQkJKCpnZXRfbWF4X3NpemUpKHN0cnVjdCB4ZnJtX3N0YXRlICosIGludCBzaXplKTsKKwl1MzIJCQkoKmdldF9tdHUpKHN0cnVjdCB4ZnJtX3N0YXRlICosIGludCBzaXplKTsKIH07CiAKIGV4dGVybiBpbnQgeGZybV9yZWdpc3Rlcl90eXBlKHN0cnVjdCB4ZnJtX3R5cGUgKnR5cGUsIHVuc2lnbmVkIHNob3J0IGZhbWlseSk7CkBAIC00MTYsNiArNDE2LDI1IEBACiAJdTMyCXNlY2lkOwogfTsKIAorLyogU0FEIG1ldGFkYXRhLCBhZGQgbW9yZSBsYXRlciAqLworc3RydWN0IHhmcm1fc2FkaW5mbworeworCXUzMiBzYWRoY250OyAvKiBjdXJyZW50IGhhc2ggYmt0cyAqLworCXUzMiBzYWRobWNudDsgLyogbWF4IGFsbG93ZWQgaGFzaCBia3RzICovCisJdTMyIHNhZGNudDsgLyogY3VycmVudCBydW5uaW5nIGNvdW50ICovCit9OworCitzdHJ1Y3QgeGZybV9zcGRpbmZvCit7CisJdTMyIGluY250OworCXUzMiBvdXRjbnQ7CisJdTMyIGZ3ZGNudDsKKwl1MzIgaW5zY250OworCXUzMiBvdXRzY250OworCXUzMiBmd2RzY250OworCXUzMiBzcGRoY250OworCXUzMiBzcGRobWNudDsKK307CiAjaWZkZWYgQ09ORklHX0FVRElUU1lTQ0FMTAogZXh0ZXJuIHZvaWQgeGZybV9hdWRpdF9sb2codWlkX3QgYXVpZCwgdTMyIHNlY2lkLCBpbnQgdHlwZSwgaW50IHJlc3VsdCwKIAkJICAgIHN0cnVjdCB4ZnJtX3BvbGljeSAqeHAsIHN0cnVjdCB4ZnJtX3N0YXRlICp4KTsKQEAgLTU4NCw2ICs2MDMsMTAgQEAKIAkJc3RydWN0IHJ0Nl9pbmZvCQlydDY7CiAJfSB1OwogCXN0cnVjdCBkc3RfZW50cnkgKnJvdXRlOworI2lmZGVmIENPTkZJR19YRlJNX1NVQl9QT0xJQ1kKKwlzdHJ1Y3QgZmxvd2kgKm9yaWdpbjsKKwlzdHJ1Y3QgeGZybV9zZWxlY3RvciAqcGFydG5lcjsKKyNlbmRpZgogCXUzMiBnZW5pZDsKIAl1MzIgcm91dGVfbXR1X2NhY2hlZDsKIAl1MzIgY2hpbGRfbXR1X2NhY2hlZDsKQEAgLTU5Niw2ICs2MTksMTIgQEAKIAlkc3RfcmVsZWFzZSh4ZHN0LT5yb3V0ZSk7CiAJaWYgKGxpa2VseSh4ZHN0LT51LmRzdC54ZnJtKSkKIAkJeGZybV9zdGF0ZV9wdXQoeGRzdC0+dS5kc3QueGZybSk7CisjaWZkZWYgQ09ORklHX1hGUk1fU1VCX1BPTElDWQorCWtmcmVlKHhkc3QtPm9yaWdpbik7CisJeGRzdC0+b3JpZ2luID0gTlVMTDsKKwlrZnJlZSh4ZHN0LT5wYXJ0bmVyKTsKKwl4ZHN0LT5wYXJ0bmVyID0gTlVMTDsKKyNlbmRpZgogfQogCiBleHRlcm4gdm9pZCB4ZnJtX2RzdF9pZmRvd24oc3RydWN0IGRzdF9lbnRyeSAqZHN0LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKQEAgLTkzOCw2ICs5NjcsOCBAQAogZXh0ZXJuIHN0cnVjdCB4ZnJtX3N0YXRlICp4ZnJtX2ZpbmRfYWNxX2J5c2VxKHUzMiBzZXEpOwogZXh0ZXJuIGludCB4ZnJtX3N0YXRlX2RlbGV0ZShzdHJ1Y3QgeGZybV9zdGF0ZSAqeCk7CiBleHRlcm4gdm9pZCB4ZnJtX3N0YXRlX2ZsdXNoKHU4IHByb3RvLCBzdHJ1Y3QgeGZybV9hdWRpdCAqYXVkaXRfaW5mbyk7CitleHRlcm4gdm9pZCB4ZnJtX3NhZF9nZXRpbmZvKHN0cnVjdCB4ZnJtX3NhZGluZm8gKnNpKTsKK2V4dGVybiB2b2lkIHhmcm1fc3BkX2dldGluZm8oc3RydWN0IHhmcm1fc3BkaW5mbyAqc2kpOwogZXh0ZXJuIGludCB4ZnJtX3JlcGxheV9jaGVjayhzdHJ1Y3QgeGZybV9zdGF0ZSAqeCwgX19iZTMyIHNlcSk7CiBleHRlcm4gdm9pZCB4ZnJtX3JlcGxheV9hZHZhbmNlKHN0cnVjdCB4ZnJtX3N0YXRlICp4LCBfX2JlMzIgc2VxKTsKIGV4dGVybiB2b2lkIHhmcm1fcmVwbGF5X25vdGlmeShzdHJ1Y3QgeGZybV9zdGF0ZSAqeCwgaW50IGV2ZW50KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcnhycGMvY2FsbC5oIGIvaW5jbHVkZS9yeHJwYy9jYWxsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4NmY4MzcuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9yeHJwYy9jYWxsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotLyogY2FsbC5oOiBSeCBjYWxsIHJlY29yZAotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMiBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotCi0jaWZuZGVmIF9MSU5VWF9SWFJQQ19DQUxMX0gKLSNkZWZpbmUgX0xJTlVYX1JYUlBDX0NBTExfSAotCi0jaW5jbHVkZSA8cnhycGMvdHlwZXMuaD4KLSNpbmNsdWRlIDxyeHJwYy9yeHJwYy5oPgotI2luY2x1ZGUgPHJ4cnBjL3BhY2tldC5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+Ci0KLSNkZWZpbmUgUlhSUENfQ0FMTF9BQ0tfV0lORE9XX1NJWkUJMTYKLQotZXh0ZXJuIHVuc2lnbmVkIHJ4cnBjX2NhbGxfcmN2X3RpbWVvdXQ7CQkvKiByZWNlaXZlIGFjdGl2aXR5IHRpbWVvdXQgKHNlY3MpICovCi0KLS8qIGFwcGxpY2F0aW9uIGNhbGwgc3RhdGUKLSAqIC0gb25seSBzdGF0ZSAwIGFuZCBmZmZmIGFyZSByZXNlcnZlZCwgdGhlIHN0YXRlIGlzIHNldCB0byAxIGFmdGVyIGFuIG9waWQgaXMgcmVjZWl2ZWQKLSAqLwotZW51bSByeHJwY19hcHBfY3N0YXRlIHsKLQlSWFJQQ19DU1RBVEVfQ09NUExFVEUJCT0gMCwJLyogb3BlcmF0aW9uIGNvbXBsZXRlICovCi0JUlhSUENfQ1NUQVRFX0VSUk9SLAkJCS8qIG9wZXJhdGlvbiBJQ01QIGVycm9yIG9yIGFib3J0ZWQgKi8KLQlSWFJQQ19DU1RBVEVfU1JWUl9SQ1ZfT1BJRCwJCS8qIFtTRVJWRVJdIHJlY2VpdmluZyBvcGVyYXRpb24gSUQgKi8KLQlSWFJQQ19DU1RBVEVfU1JWUl9SQ1ZfQVJHUywJCS8qIFtTRVJWRVJdIHJlY2VpdmluZyBvcGVyYXRpb24gZGF0YSAqLwotCVJYUlBDX0NTVEFURV9TUlZSX0dPVF9BUkdTLAkJLyogW1NFUlZFUl0gY29tcGxldGVseSByZWNlaXZlZCBvcGVyYXRpb24gZGF0YSAqLwotCVJYUlBDX0NTVEFURV9TUlZSX1NORF9SRVBMWSwJCS8qIFtTRVJWRVJdIHNlbmRpbmcgb3BlcmF0aW9uIHJlcGx5ICovCi0JUlhSUENfQ1NUQVRFX1NSVlJfUkNWX0ZJTkFMX0FDSywJLyogW1NFUlZFUl0gcmVjZWl2aW5nIGZpbmFsIEFDSyAqLwotCVJYUlBDX0NTVEFURV9DTE5UX1NORF9BUkdTLAkJLyogW0NMSUVOVF0gc2VuZGluZyBvcGVyYXRpb24gYXJncyAqLwotCVJYUlBDX0NTVEFURV9DTE5UX1JDVl9SRVBMWSwJCS8qIFtDTElFTlRdIHJlY2VpdmluZyBvcGVyYXRpb24gcmVwbHkgKi8KLQlSWFJQQ19DU1RBVEVfQ0xOVF9HT1RfUkVQTFksCQkvKiBbQ0xJRU5UXSBjb21wbGV0ZWx5IHJlY2VpdmVkIG9wZXJhdGlvbiByZXBseSAqLwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotZXh0ZXJuIGNvbnN0IGNoYXIgKnJ4cnBjX2NhbGxfc3RhdGVzW107Ci0KLWVudW0gcnhycGNfYXBwX2VzdGF0ZSB7Ci0JUlhSUENfRVNUQVRFX05PX0VSUk9SCQk9IDAsCS8qIG5vIGVycm9yICovCi0JUlhSUENfRVNUQVRFX0xPQ0FMX0FCT1JULAkJLyogYWJvcnRlZCBsb2NhbGx5IGJ5IGFwcGxpY2F0aW9uIGxheWVyICovCi0JUlhSUENfRVNUQVRFX1BFRVJfQUJPUlQsCQkvKiBhYm9ydGVkIHJlbW90ZWx5IGJ5IHBlZXIgKi8KLQlSWFJQQ19FU1RBVEVfTE9DQUxfRVJST1IsCQkvKiBsb2NhbCBJQ01QIG5ldHdvcmsgZXJyb3IgKi8KLQlSWFJQQ19FU1RBVEVfUkVNT1RFX0VSUk9SLAkJLyogcmVtb3RlIElDTVAgbmV0d29yayBlcnJvciAqLwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotZXh0ZXJuIGNvbnN0IGNoYXIgKnJ4cnBjX2NhbGxfZXJyb3Jfc3RhdGVzW107Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBSeCBjYWxsIHJlY29yZCBhbmQgYXBwbGljYXRpb24gc2NyYXRjaCBidWZmZXIKLSAqIC0gdGhlIGNhbGwgcmVjb3JkIG9jY3VwaWVzIHRoZSBib3R0b20gb2YgYSBjb21wbGV0ZSBwYWdlCi0gKiAtIHRoZSBhcHBsaWNhdGlvbiBzY3JhdGNoIGJ1ZmZlciBvY2N1cGllcyB0aGUgcmVzdAotICovCi1zdHJ1Y3QgcnhycGNfY2FsbAotewotCWF0b21pY190CQl1c2FnZTsKLQlzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbgkqY29ubjsJCS8qIGNvbm5lY3Rpb24gdXBvbiB3aGljaCBhY3RpdmUgKi8KLQlzcGlubG9ja190CQlsb2NrOwkJLyogYWNjZXNzIGxvY2sgKi8KLQlzdHJ1Y3QgbW9kdWxlCQkqb3duZXI7CQkvKiBvd25lciBtb2R1bGUgKi8KLQl3YWl0X3F1ZXVlX2hlYWRfdAl3YWl0cTsJCS8qIHdhaXQgcXVldWUgZm9yIGV2ZW50cyB0byBoYXBwZW4gKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkCWxpbms7CQkvKiBnZW5lcmFsIGludGVybmFsIGxpc3QgbGluayAqLwotCXN0cnVjdCBsaXN0X2hlYWQJY2FsbF9saW5rOwkvKiBtYXN0ZXIgY2FsbCBsaXN0IGxpbmsgKi8KLQlfX2JlMzIJCQljaGFuX2l4OwkvKiBjb25uZWN0aW9uIGNoYW5uZWwgaW5kZXggICovCi0JX19iZTMyCQkJY2FsbF9pZDsJLyogY2FsbCBJRCBvbiBjb25uZWN0aW9uICAqLwotCXVuc2lnbmVkIGxvbmcJCWNqaWY7CQkvKiBqaWZmaWVzIGF0IGNhbGwgY3JlYXRpb24gKi8KLQl1bnNpZ25lZCBsb25nCQlmbGFnczsJCS8qIGNvbnRyb2wgZmxhZ3MgKi8KLSNkZWZpbmUgUlhSUENfQ0FMTF9BQ0tTX1RJTU8JMHgwMDAwMDAwMQkvKiBBQ0tTIHRpbWVvdXQgcmVhY2hlZCAqLwotI2RlZmluZSBSWFJQQ19DQUxMX0FDS1JfVElNTwkweDAwMDAwMDAyCS8qIEFDS1IgdGltZW91dCByZWFjaGVkICovCi0jZGVmaW5lIFJYUlBDX0NBTExfUkNWX1RJTU8JMHgwMDAwMDAwNAkvKiBSQ1YgdGltZW91dCByZWFjaGVkICovCi0jZGVmaW5lIFJYUlBDX0NBTExfUkNWX1BLVAkweDAwMDAwMDA4CS8qIHJlY2VpdmVkIHBhY2tldCAqLwotCi0JLyogdHJhbnNtaXNzaW9uICovCi0JcnhycGNfc2VxX3QJCXNuZF9zZXFfY291bnQ7CS8qIG91dGdvaW5nIHBhY2tldCBzZXF1ZW5jZSBudW1iZXIgY291bnRlciAqLwotCXN0cnVjdCByeHJwY19tZXNzYWdlCSpzbmRfbmV4dG1zZzsJLyogbmV4dCBtZXNzYWdlIGJlaW5nIGNvbnN0cnVjdGVkIGZvciBzZW5kaW5nICovCi0Jc3RydWN0IHJ4cnBjX21lc3NhZ2UJKnNuZF9waW5nOwkvKiBsYXN0IHBpbmcgbWVzc2FnZSBzZW50ICovCi0JdW5zaWduZWQgc2hvcnQJCXNuZF9yZXNlbmRfY250OwkvKiBjb3VudCBvZiByZXNlbmRzIHNpbmNlIGxhc3QgQUNLICovCi0KLQkvKiB0cmFuc21pc3Npb24gQUNLIHRyYWNraW5nICovCi0Jc3RydWN0IGxpc3RfaGVhZAlhY2tzX3BlbmRxOwkvKiBtZXNzYWdlcyBwZW5kaW5nIEFDSyAob3JkZXJlZCBieSBzZXEpICovCi0JdW5zaWduZWQJCWFja3NfcGVuZF9jbnQ7CS8qIG51bWJlciBvZiB1bi1BQ0snZCBwYWNrZXRzICovCi0JcnhycGNfc2VxX3QJCWFja3NfZGZ0dl9zZXE7CS8qIGhpZ2hlc3QgZGVmaW5pdGl2ZWx5IEFDSydkIG1zZyBzZXEgKi8KLQlzdHJ1Y3QgdGltZXJfbGlzdAlhY2tzX3RpbWVvdXQ7CS8qIHRpbWVvdXQgb24gZXhwZWN0ZWQgQUNLICovCi0KLQkvKiByZWNlcHRpb24gKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkCXJjdl9yZWNlaXZlcTsJLyogbWVzc2FnZXMgcGVuZGluZyByZWNlcHRpb24gKG9yZGVyZWQgYnkgc2VxKSAqLwotCXN0cnVjdCBsaXN0X2hlYWQJcmN2X2tyeGlvZHFfbGs7CS8qIGtyeGlvZCBxdWV1ZSBmb3IgbmV3IGluYm91bmQgcGFja2V0cyAqLwotCXN0cnVjdCB0aW1lcl9saXN0CXJjdl90aW1lb3V0OwkvKiBjYWxsIHJlY2VpdmUgYWN0aXZpdHkgdGltZW91dCAqLwotCi0JLyogcmVjZXB0aW9uIEFDSydpbmcgKi8KLQlyeHJwY19zZXFfdAkJYWNrcl93aW5fYm90OwkvKiBib3R0b20gb2YgQUNLIHdpbmRvdyAqLwotCXJ4cnBjX3NlcV90CQlhY2tyX3dpbl90b3A7CS8qIHRvcCBvZiBBQ0sgd2luZG93ICovCi0JcnhycGNfc2VxX3QJCWFja3JfaGlnaF9zZXE7CS8qIGhpZ2hlc3Qgc2Vxbm8geWV0IHJlY2VpdmVkICovCi0JcnhycGNfc2VxX25ldF90CQlhY2tyX3ByZXZfc2VxOwkvKiBwcmV2aW91cyBzZXFubyByZWNlaXZlZCAqLwotCXVuc2lnbmVkCQlhY2tyX3BlbmRfY250OwkvKiBudW1iZXIgb2YgcGVuZGluZyBBQ0tzICovCi0Jc3RydWN0IHRpbWVyX2xpc3QJYWNrcl9kZnJfdGltbzsJLyogdGltZW91dCBvbiBkZWZlcnJlZCBBQ0sgKi8KLQljaGFyCQkJYWNrcl9kZnJfcGVybTsJLyogcmVxdWVzdCBmb3IgZGVmZXJyZWQgQUNLcyBwZXJtaXR0ZWQgKi8KLQlyeHJwY19zZXFfdAkJYWNrcl9kZnJfc2VxOwkvKiBzZXFubyBmb3IgZGVmZXJyZWQgQUNLICovCi0Jc3RydWN0IHJ4cnBjX2Fja3BhY2tldAlhY2tyOwkJLyogcGVuZGluZyBub3JtYWwgQUNLIHBhY2tldCAqLwotCXVpbnQ4X3QJCQlhY2tyX2FycmF5W1JYUlBDX0NBTExfQUNLX1dJTkRPV19TSVpFXTsJLyogQUNLIHJlY29yZHMgKi8KLQotCS8qIHByZXNlbnRhdGlvbiBsYXllciAqLwotCWNoYXIJCQlhcHBfbGFzdF9yY3Y7CS8qIFQgaWYgcmVjZWl2ZWQgbGFzdCBwYWNrZXQgZnJvbSByZW1vdGUgZW5kICovCi0JZW51bSByeHJwY19hcHBfY3N0YXRlCWFwcF9jYWxsX3N0YXRlOwkvKiBjYWxsIHN0YXRlICovCi0JZW51bSByeHJwY19hcHBfZXN0YXRlCWFwcF9lcnJfc3RhdGU7CS8qIGFib3J0L2Vycm9yIHN0YXRlICovCi0Jc3RydWN0IGxpc3RfaGVhZAlhcHBfcmVhZHlxOwkvKiBvcmRlcmVkIHJlYWR5IHJlY2VpdmVkIHBhY2tldCBxdWV1ZSAqLwotCXN0cnVjdCBsaXN0X2hlYWQJYXBwX3VucmVhZHlxOwkvKiBvcmRlcmVkIHBvc3QtaG9sZSByZWN2J2QgcGFja2V0IHF1ZXVlICovCi0JcnhycGNfc2VxX3QJCWFwcF9yZWFkeV9zZXE7CS8qIGxhc3Qgc2VxIG51bWJlciBkcm9wcGVkIGludG8gcmVhZHlxICovCi0Jc2l6ZV90CQkJYXBwX3JlYWR5X3F0eTsJLyogYW1vdW50IG9mIGRhdGEgcmVhZHkgaW4gcmVhZHlxICovCi0JdW5zaWduZWQJCWFwcF9vcGNvZGU7CS8qIG9wZXJhdGlvbiBJRCAqLwotCXVuc2lnbmVkCQlhcHBfYWJvcnRfY29kZTsJLyogYWJvcnQgY29kZSAod2hlbiBhYm9ydGVkKSAqLwotCWludAkJCWFwcF9lcnJubzsJLyogZXJyb3IgbnVtYmVyICh3aGVuIElDTVAgZXJyb3IgcmVjZWl2ZWQpICovCi0KLQkvKiBzdGF0aXNpY3MgKi8KLQl1bnNpZ25lZAkJcGt0X3Jjdl9jb3VudDsJLyogY291bnQgb2YgcmVjZWl2ZWQgcGFja2V0cyBvbiB0aGlzIGNhbGwgKi8KLQl1bnNpZ25lZAkJcGt0X3NuZF9jb3VudDsJLyogY291bnQgb2Ygc2VudCBwYWNrZXRzIG9uIHRoaXMgY2FsbCAqLwotCXVuc2lnbmVkCQlhcHBfcmVhZF9jb3VudDsJLyogbnVtYmVyIG9mIHJlYWRzIGlzc3VlZCAqLwotCi0JLyogYml0cyBmb3IgdGhlIGFwcGxpY2F0aW9uIHRvIHVzZSAqLwotCXJ4cnBjX2NhbGxfYXR0bl9mdW5jX3QJYXBwX2F0dG5fZnVuYzsJLyogY2FsbGJhY2sgd2hlbiBhdHRlbnRpb24gcmVxdWlyZWQgKi8KLQlyeHJwY19jYWxsX2Vycm9yX2Z1bmNfdAlhcHBfZXJyb3JfZnVuYzsJLyogY2FsbGJhY2sgd2hlbiBhYm9ydCBzZW50IChjbGVhbnVwIGFuZCBwdXQpICovCi0JcnhycGNfY2FsbF9hZW1hcF9mdW5jX3QJYXBwX2FlbWFwX2Z1bmM7CS8qIGNhbGxiYWNrIHRvIG1hcCBhYm9ydCBjb2RlIHRvL2Zyb20gZXJybm8gKi8KLQl2b2lkCQkJKmFwcF91c2VyOwkvKiBhcHBsaWNhdGlvbiBkYXRhICovCi0Jc3RydWN0IGxpc3RfaGVhZAlhcHBfbGluazsJLyogYXBwbGljYXRpb24gbGlzdCBsaW5rYWdlICovCi0Jc3RydWN0IGxpc3RfaGVhZAlhcHBfYXR0bl9saW5rOwkvKiBhcHBsaWNhdGlvbiBhdHRlbnRpb24gbGlzdCBsaW5rYWdlICovCi0Jc2l6ZV90CQkJYXBwX21hcms7CS8qIHRyaWdnZXIgY2FsbGJhY2sgd2hlbiBhcHBfcmVhZHlfcXR5Pj1hcHBfbWFyayAqLwotCWNoYXIJCQlhcHBfYXN5bmNfcmVhZDsJLyogVCBpZiBpbiBhc3luYy1yZWFkIG1vZGUgKi8KLQl1aW50OF90CQkJKmFwcF9yZWFkX2J1ZjsJLyogYXBwbGljYXRpb24gYXN5bmMgcmVhZCBidWZmZXIgKGFwcF9tYXJrIHNpemUpICovCi0JdWludDhfdAkJCSphcHBfc2NyX2FsbG9jOwkvKiBhcHBsaWNhdGlvbiBzY3JhdGNoIGFsbG9jYXRpb24gcG9pbnRlciAqLwotCXZvaWQJCQkqYXBwX3Njcl9wdHI7CS8qIGFwcGxpY2F0aW9uIHBvaW50ZXIgaW50byBzY3JhdGNoIGJ1ZmZlciAqLwotCi0jZGVmaW5lIFJYUlBDX0FQUF9NQVJLX0VPRiAweEZGRkZGRkZGVQkvKiBtYXJrIGF0IGVuZCBvZiBpbnB1dCAqLwotCi0JLyogYXBwbGljYXRpb24gc2NyYXRjaCBidWZmZXIgKi8KLQl1aW50OF90CQkJYXBwX3NjcmF0Y2hbMF0gX19hdHRyaWJ1dGVfXygoYWxpZ25lZChzaXplb2YobG9uZykpKSk7Ci19OwotCi0jZGVmaW5lIFJYUlBDX0NBTExfU0NSQVRDSF9TSVpFIChQQUdFX1NJWkUgLSBzaXplb2Yoc3RydWN0IHJ4cnBjX2NhbGwpKQotCi0jZGVmaW5lIHJ4cnBjX2NhbGxfcmVzZXRfc2NyYXRjaChDQUxMKSBcCi1kbyB7IChDQUxMKS0+YXBwX3Njcl9hbGxvYyA9IChDQUxMKS0+YXBwX3NjcmF0Y2g7IH0gd2hpbGUoMCkKLQotI2RlZmluZSByeHJwY19jYWxsX2FsbG9jX3NjcmF0Y2goQ0FMTCxTSVpFKQkJCQkJCVwKLSh7CQkJCQkJCQkJCQlcCi0Jdm9pZCAqcHRyOwkJCQkJCQkJCVwKLQlwdHIgPSAoQ0FMTCktPmFwcF9zY3JfYWxsb2M7CQkJCQkJCVwKLQkoQ0FMTCktPmFwcF9zY3JfYWxsb2MgKz0gKFNJWkUpOwkJCQkJCVwKLQlpZiAoKFNJWkUpPlJYUlBDX0NBTExfU0NSQVRDSF9TSVpFIHx8CQkJCQkJXAotCSAgICAoc2l6ZV90KSgoQ0FMTCktPmFwcF9zY3JfYWxsb2MgLSAodTgqKShDQUxMKSkgPiBSWFJQQ19DQUxMX1NDUkFUQ0hfU0laRSkgewlcCi0JCXByaW50aygicnhycGNfY2FsbF9hbGxvY19zY3JhdGNoKCVwLCVadSlcbiIsKENBTEwpLChzaXplX3QpKFNJWkUpKTsJXAotCQlCVUcoKTsJCQkJCQkJCQlcCi0JfQkJCQkJCQkJCQlcCi0JcHRyOwkJCQkJCQkJCQlcCi19KQotCi0jZGVmaW5lIHJ4cnBjX2NhbGxfYWxsb2Nfc2NyYXRjaF9zKENBTEwsVFlQRSkJCQkJCQlcCi0oewkJCQkJCQkJCQkJXAotCXNpemVfdCBzaXplID0gc2l6ZW9mKFRZUEUpOwkJCQkJCQlcCi0JVFlQRSAqcHRyOwkJCQkJCQkJCVwKLQlwdHIgPSAoVFlQRSopKENBTEwpLT5hcHBfc2NyX2FsbG9jOwkJCQkJCVwKLQkoQ0FMTCktPmFwcF9zY3JfYWxsb2MgKz0gc2l6ZTsJCQkJCQkJXAotCWlmIChzaXplPlJYUlBDX0NBTExfU0NSQVRDSF9TSVpFIHx8CQkJCQkJXAotCSAgICAoc2l6ZV90KSgoQ0FMTCktPmFwcF9zY3JfYWxsb2MgLSAodTgqKShDQUxMKSkgPiBSWFJQQ19DQUxMX1NDUkFUQ0hfU0laRSkgewlcCi0JCXByaW50aygicnhycGNfY2FsbF9hbGxvY19zY3JhdGNoKCVwLCVadSlcbiIsKENBTEwpLHNpemUpOwkJXAotCQlCVUcoKTsJCQkJCQkJCQlcCi0JfQkJCQkJCQkJCQlcCi0JcHRyOwkJCQkJCQkJCQlcCi19KQotCi0jZGVmaW5lIHJ4cnBjX2NhbGxfaXNfYWNrX3BlbmRpbmcoQ0FMTCkgKChDQUxMKS0+YWNrci5yZWFzb24gIT0gMCkKLQotZXh0ZXJuIGludCByeHJwY19jcmVhdGVfY2FsbChzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubiwKLQkJCSAgICAgcnhycGNfY2FsbF9hdHRuX2Z1bmNfdCBhdHRuLAotCQkJICAgICByeHJwY19jYWxsX2Vycm9yX2Z1bmNfdCBlcnJvciwKLQkJCSAgICAgcnhycGNfY2FsbF9hZW1hcF9mdW5jX3QgYWVtYXAsCi0JCQkgICAgIHN0cnVjdCByeHJwY19jYWxsICoqX2NhbGwpOwotCi1leHRlcm4gaW50IHJ4cnBjX2luY29taW5nX2NhbGwoc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4sCi0JCQkgICAgICAgc3RydWN0IHJ4cnBjX21lc3NhZ2UgKm1zZywKLQkJCSAgICAgICBzdHJ1Y3QgcnhycGNfY2FsbCAqKl9jYWxsKTsKLQotc3RhdGljIGlubGluZSB2b2lkIHJ4cnBjX2dldF9jYWxsKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKQotewotCUJVR19PTihhdG9taWNfcmVhZCgmY2FsbC0+dXNhZ2UpPD0wKTsKLQlhdG9taWNfaW5jKCZjYWxsLT51c2FnZSk7Ci0JLypwcmludGsoInJ4cnBjX2dldF9jYWxsKCVwe3U9JWR9KVxuIiwoQyksYXRvbWljX3JlYWQoJihDKS0+dXNhZ2UpKTsqLwotfQotCi1leHRlcm4gdm9pZCByeHJwY19wdXRfY2FsbChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCk7Ci0KLWV4dGVybiB2b2lkIHJ4cnBjX2NhbGxfZG9fc3R1ZmYoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpOwotCi1leHRlcm4gaW50IHJ4cnBjX2NhbGxfYWJvcnQoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIGludCBlcnJvcik7Ci0KLSNkZWZpbmUgUlhSUENfQ0FMTF9SRUFEX0JMT0NLCTB4MDAwMQkvKiBibG9jayBpZiBub3QgZW5vdWdoIGRhdGEgYW5kIG5vdCB5ZXQgRU9GICovCi0jZGVmaW5lIFJYUlBDX0NBTExfUkVBRF9BTEwJMHgwMDAyCS8qIGVycm9yIGlmIGluc3VmZmljaWVudCBkYXRhIHJlY2VpdmVkICovCi1leHRlcm4gaW50IHJ4cnBjX2NhbGxfcmVhZF9kYXRhKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLCB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpOwotCi1leHRlcm4gaW50IHJ4cnBjX2NhbGxfd3JpdGVfZGF0YShzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwKLQkJCQkgc2l6ZV90IHNpb2MsCi0JCQkJIHN0cnVjdCBrdmVjICpzaW92LAotCQkJCSB1aW50OF90IHJ4aGRyX2ZsYWdzLAotCQkJCSBnZnBfdCBhbGxvY19mbGFncywKLQkJCQkgaW50IGR1cF9kYXRhLAotCQkJCSBzaXplX3QgKnNpemVfc2VudCk7Ci0KLWV4dGVybiB2b2lkIHJ4cnBjX2NhbGxfaGFuZGxlX2Vycm9yKHN0cnVjdCByeHJwY19jYWxsICpjb25uLCBpbnQgbG9jYWwsIGludCBlcnJubyk7Ci0KLSNlbmRpZiAvKiBfTElOVVhfUlhSUENfQ0FMTF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3J4cnBjL2Nvbm5lY3Rpb24uaCBiL2luY2x1ZGUvcnhycGMvY29ubmVjdGlvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWU2NzgxLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvcnhycGMvY29ubmVjdGlvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyogY29ubmVjdGlvbi5oOiBSeCBjb25uZWN0aW9uIHJlY29yZAotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMiBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotCi0jaWZuZGVmIF9MSU5VWF9SWFJQQ19DT05ORUNUSU9OX0gKLSNkZWZpbmUgX0xJTlVYX1JYUlBDX0NPTk5FQ1RJT05fSAotCi0jaW5jbHVkZSA8cnhycGMvdHlwZXMuaD4KLSNpbmNsdWRlIDxyeHJwYy9rcnh0aW1vZC5oPgotCi1zdHJ1Y3Qgc2tfYnVmZjsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIFJ4IGNvbm5lY3Rpb24KLSAqIC0gY29ubmVjdGlvbnMgYXJlIG1hdGNoZWQgYnkgKHJtdF9wb3J0LHJtdF9hZGRyLHNlcnZpY2VfaWQsY29ubl9pZCxjbGllbnRmbGFnKQotICogLSBjb25uZWN0aW9ucyBvbmx5IHJldGFpbiBhIHJlZmNvdW50IG9uIHRoZSBwZWVyIHdoZW4gdGhleSBhcmUgYWN0aXZlCi0gKiAtIGNvbm5lY3Rpb25zIHdpdGggcmVmY291bnQ9PTAgYXJlIGluYWN0aXZlIGFuZCByZXNpZGUgaW4gdGhlIHBlZXIncyBncmF2ZXlhcmQKLSAqLwotc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24KLXsKLQlhdG9taWNfdAkJdXNhZ2U7Ci0Jc3RydWN0IHJ4cnBjX3RyYW5zcG9ydAkqdHJhbnM7CQkvKiB0cmFuc3BvcnQgZW5kcG9pbnQgKi8KLQlzdHJ1Y3QgcnhycGNfcGVlcgkqcGVlcjsJCS8qIHBlZXIgZnJvbS90byB3aGljaCBjb25uZWN0ZWQgKi8KLQlzdHJ1Y3QgcnhycGNfc2VydmljZQkqc2VydmljZTsJLyogcmVzcG9uc2libGUgc2VydmljZSAoaW5ib3VuZCBjb25ucykgKi8KLQlzdHJ1Y3QgcnhycGNfdGltZXIJdGltZW91dDsJLyogZGVjYWNoaW5nIHRpbWVyICovCi0Jc3RydWN0IGxpc3RfaGVhZAlsaW5rOwkJLyogbGluayBpbiBwZWVyJ3MgbGlzdCAqLwotCXN0cnVjdCBsaXN0X2hlYWQJcHJvY19saW5rOwkvKiBsaW5rIGluIHByb2MgbGlzdCAqLwotCXN0cnVjdCBsaXN0X2hlYWQJZXJyX2xpbms7CS8qIGxpbmsgaW4gSUNNUCBlcnJvciBwcm9jZXNzaW5nIGxpc3QgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkCWlkX2xpbms7CS8qIGxpbmsgaW4gSUQgZ3JhbnQgbGlzdCAqLwotCXN0cnVjdCBzb2NrYWRkcl9pbglhZGRyOwkJLyogcmVtb3RlIGFkZHJlc3MgKi8KLQlzdHJ1Y3QgcnhycGNfY2FsbAkqY2hhbm5lbHNbNF07CS8qIGNoYW5uZWxzIChhY3RpdmUgY2FsbHMpICovCi0Jd2FpdF9xdWV1ZV9oZWFkX3QJY2hhbndhaXQ7CS8qIHdhaXQgZm9yIGNoYW5uZWwgdG8gYmVjb21lIGF2YWlsYWJsZSAqLwotCXNwaW5sb2NrX3QJCWxvY2s7CQkvKiBhY2Nlc3MgbG9jayAqLwotCXN0cnVjdCB0aW1ldmFsCQlhdGltZTsJCS8qIGxhc3QgYWNjZXNzIHRpbWUgKi8KLQlzaXplX3QJCQltdHVfc2l6ZTsJLyogTVRVIHNpemUgZm9yIG91dGJvdW5kIG1lc3NhZ2VzICovCi0JdW5zaWduZWQJCWNhbGxfY291bnRlcjsJLyogY2FsbCBJRCBjb3VudGVyICovCi0JcnhycGNfc2VyaWFsX3QJCXNlcmlhbF9jb3VudGVyOwkvKiBwYWNrZXQgc2VyaWFsIG51bWJlciBjb3VudGVyICovCi0KLQkvKiB0aGUgZm9sbG93aW5nIHNob3VsZCBhbGwgYmUgaW4gbmV0IG9yZGVyICovCi0JX19iZTMyCQkJaW5fZXBvY2g7CS8qIHBlZXIncyBlcG9jaCAqLwotCV9fYmUzMgkJCW91dF9lcG9jaDsJLyogbXkgZXBvY2ggKi8KLQlfX2JlMzIJCQljb25uX2lkOwkvKiBjb25uZWN0aW9uIElELCBhcHByb3ByaWF0ZWx5IHNoaWZ0ZWQgKi8KLQlfX2JlMTYJCQlzZXJ2aWNlX2lkOwkvKiBzZXJ2aWNlIElEICovCi0JdWludDhfdAkJCXNlY3VyaXR5X2l4OwkvKiBzZWN1cml0eSBJRCAqLwotCXVpbnQ4X3QJCQlpbl9jbGllbnRmbGFnOwkvKiBSWFJQQ19DTElFTlRfSU5JVElBVEVEIGlmIHdlIGFyZSBzZXJ2ZXIgKi8KLQl1aW50OF90CQkJb3V0X2NsaWVudGZsYWc7CS8qIFJYUlBDX0NMSUVOVF9JTklUSUFURUQgaWYgd2UgYXJlIGNsaWVudCAqLwotfTsKLQotZXh0ZXJuIGludCByeHJwY19jcmVhdGVfY29ubmVjdGlvbihzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICp0cmFucywKLQkJCQkgICBfX2JlMTYgcG9ydCwKLQkJCQkgICBfX2JlMzIgYWRkciwKLQkJCQkgICB1aW50MTZfdCBzZXJ2aWNlX2lkLAotCQkJCSAgIHZvaWQgKnNlY3VyaXR5LAotCQkJCSAgIHN0cnVjdCByeHJwY19jb25uZWN0aW9uICoqX2Nvbm4pOwotCi1leHRlcm4gaW50IHJ4cnBjX2Nvbm5lY3Rpb25fbG9va3VwKHN0cnVjdCByeHJwY19wZWVyICpwZWVyLAotCQkJCSAgIHN0cnVjdCByeHJwY19tZXNzYWdlICptc2csCi0JCQkJICAgc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKipfY29ubik7Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCByeHJwY19nZXRfY29ubmVjdGlvbihzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubikKLXsKLQlCVUdfT04oYXRvbWljX3JlYWQoJmNvbm4tPnVzYWdlKTwwKTsKLQlhdG9taWNfaW5jKCZjb25uLT51c2FnZSk7Ci0JLy9wcmludGsoInJ4cnBjX2dldF9jb25uKCVwe3U9JWR9KVxuIixjb25uLGF0b21pY19yZWFkKCZjb25uLT51c2FnZSkpOwotfQotCi1leHRlcm4gdm9pZCByeHJwY19wdXRfY29ubmVjdGlvbihzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubik7Ci0KLWV4dGVybiBpbnQgcnhycGNfY29ubl9yZWNlaXZlX2NhbGxfcGFja2V0KHN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uLAotCQkJCQkgIHN0cnVjdCByeHJwY19jYWxsICpjYWxsLAotCQkJCQkgIHN0cnVjdCByeHJwY19tZXNzYWdlICptc2cpOwotCi1leHRlcm4gdm9pZCByeHJwY19jb25uX2hhbmRsZV9lcnJvcihzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubiwgaW50IGxvY2FsLCBpbnQgZXJybm8pOwotCi0jZW5kaWYgLyogX0xJTlVYX1JYUlBDX0NPTk5FQ1RJT05fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9yeHJwYy9rcnhpb2QuaCBiL2luY2x1ZGUvcnhycGMva3J4aW9kLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwZTBlODIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9yeHJwYy9rcnhpb2QuaAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qIGtyeGlvZC5oOiBSeCBSUEMgSS9PIGtlcm5lbCB0aHJlYWQgaW50ZXJmYWNlCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi0KLSNpZm5kZWYgX0xJTlVYX1JYUlBDX0tSWElPRF9ICi0jZGVmaW5lIF9MSU5VWF9SWFJQQ19LUlhJT0RfSAotCi0jaW5jbHVkZSA8cnhycGMvdHlwZXMuaD4KLQotZXh0ZXJuIGludCByeHJwY19rcnhpb2RfaW5pdCh2b2lkKTsKLWV4dGVybiB2b2lkIHJ4cnBjX2tyeGlvZF9raWxsKHZvaWQpOwotZXh0ZXJuIHZvaWQgcnhycGNfa3J4aW9kX3F1ZXVlX3RyYW5zcG9ydChzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICp0cmFucyk7Ci1leHRlcm4gdm9pZCByeHJwY19rcnhpb2RfZGVxdWV1ZV90cmFuc3BvcnQoc3RydWN0IHJ4cnBjX3RyYW5zcG9ydCAqdHJhbnMpOwotZXh0ZXJuIHZvaWQgcnhycGNfa3J4aW9kX3F1ZXVlX3BlZXIoc3RydWN0IHJ4cnBjX3BlZXIgKnBlZXIpOwotZXh0ZXJuIHZvaWQgcnhycGNfa3J4aW9kX2RlcXVldWVfcGVlcihzdHJ1Y3QgcnhycGNfcGVlciAqcGVlcik7Ci1leHRlcm4gdm9pZCByeHJwY19rcnhpb2RfY2xlYXJfcGVlcnMoc3RydWN0IHJ4cnBjX3RyYW5zcG9ydCAqdHJhbnMpOwotZXh0ZXJuIHZvaWQgcnhycGNfa3J4aW9kX3F1ZXVlX2NhbGwoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpOwotZXh0ZXJuIHZvaWQgcnhycGNfa3J4aW9kX2RlcXVldWVfY2FsbChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCk7Ci0KLSNlbmRpZiAvKiBfTElOVVhfUlhSUENfS1JYSU9EX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcnhycGMva3J4c2VjZC5oIGIvaW5jbHVkZS9yeHJwYy9rcnhzZWNkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1Y2U0M2EuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9yeHJwYy9rcnhzZWNkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKiBrcnhzZWNkLmg6IFJ4IFJQQyBzZWN1cml0eSBrZXJuZWwgdGhyZWFkIGludGVyZmFjZQotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMiBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotCi0jaWZuZGVmIF9MSU5VWF9SWFJQQ19LUlhTRUNEX0gKLSNkZWZpbmUgX0xJTlVYX1JYUlBDX0tSWFNFQ0RfSAotCi0jaW5jbHVkZSA8cnhycGMvdHlwZXMuaD4KLQotZXh0ZXJuIGludCByeHJwY19rcnhzZWNkX2luaXQodm9pZCk7Ci1leHRlcm4gdm9pZCByeHJwY19rcnhzZWNkX2tpbGwodm9pZCk7Ci1leHRlcm4gdm9pZCByeHJwY19rcnhzZWNkX2NsZWFyX3RyYW5zcG9ydChzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICp0cmFucyk7Ci1leHRlcm4gdm9pZCByeHJwY19rcnhzZWNkX3F1ZXVlX2luY29taW5nX2NhbGwoc3RydWN0IHJ4cnBjX21lc3NhZ2UgKm1zZyk7Ci0KLSNlbmRpZiAvKiBfTElOVVhfUlhSUENfS1JYU0VDRF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3J4cnBjL2tyeHRpbW9kLmggYi9pbmNsdWRlL3J4cnBjL2tyeHRpbW9kLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzZDI5OGIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9yeHJwYy9rcnh0aW1vZC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoga3J4dGltb2QuaDogUnhSUEMgdGltZW91dCBkYWVtb24KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLQotI2lmbmRlZiBfTElOVVhfUlhSUENfS1JYVElNT0RfSAotI2RlZmluZSBfTElOVVhfUlhSUENfS1JYVElNT0RfSAotCi0jaW5jbHVkZSA8cnhycGMvdHlwZXMuaD4KLQotc3RydWN0IHJ4cnBjX3RpbWVyX29wcyB7Ci0JLyogY2FsbGVkIHdoZW4gdGhlIGZyb250IG9mIHRoZSB0aW1lciBxdWV1ZSBoYXMgdGltZWQgb3V0ICovCi0Jdm9pZCAoKnRpbWVkX291dCkoc3RydWN0IHJ4cnBjX3RpbWVyICp0aW1lcik7Ci19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogUlhSUEMgdGltZXIvdGltZW91dCByZWNvcmQKLSAqLwotc3RydWN0IHJ4cnBjX3RpbWVyCi17Ci0Jc3RydWN0IGxpc3RfaGVhZAkJbGluazsJCS8qIGxpbmsgaW4gdGltZXIgcXVldWUgKi8KLQl1bnNpZ25lZCBsb25nCQkJdGltb19qaWY7CS8qIHRpbWVvdXQgdGltZSAqLwotCWNvbnN0IHN0cnVjdCByeHJwY190aW1lcl9vcHMJKm9wczsJCS8qIHRpbWVvdXQgZXhwaXJ5IGZ1bmN0aW9uICovCi19OwotCi1zdGF0aWMgaW5saW5lIHZvaWQgcnhycGNfdGltZXJfaW5pdChyeHJwY190aW1lcl90ICp0aW1lciwgY29uc3Qgc3RydWN0IHJ4cnBjX3RpbWVyX29wcyAqb3BzKQotewotCUlOSVRfTElTVF9IRUFEKCZ0aW1lci0+bGluayk7Ci0JdGltZXItPm9wcyA9IG9wczsKLX0KLQotZXh0ZXJuIGludCByeHJwY19rcnh0aW1vZF9zdGFydCh2b2lkKTsKLWV4dGVybiB2b2lkIHJ4cnBjX2tyeHRpbW9kX2tpbGwodm9pZCk7Ci0KLWV4dGVybiB2b2lkIHJ4cnBjX2tyeHRpbW9kX2FkZF90aW1lcihyeHJwY190aW1lcl90ICp0aW1lciwgdW5zaWduZWQgbG9uZyB0aW1lb3V0KTsKLWV4dGVybiBpbnQgcnhycGNfa3J4dGltb2RfZGVsX3RpbWVyKHJ4cnBjX3RpbWVyX3QgKnRpbWVyKTsKLQotI2VuZGlmIC8qIF9MSU5VWF9SWFJQQ19LUlhUSU1PRF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3J4cnBjL21lc3NhZ2UuaCBiL2luY2x1ZGUvcnhycGMvbWVzc2FnZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzE4ZjI3Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvcnhycGMvbWVzc2FnZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyogbWVzc2FnZS5oOiBSeCBtZXNzYWdlIGNhY2hpbmcKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLQotI2lmbmRlZiBfTElOVVhfUlhSUENfTUVTU0FHRV9ICi0jZGVmaW5lIF9MSU5VWF9SWFJQQ19NRVNTQUdFX0gKLQotI2luY2x1ZGUgPHJ4cnBjL3BhY2tldC5oPgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogUnggbWVzc2FnZSByZWNvcmQKLSAqLwotc3RydWN0IHJ4cnBjX21lc3NhZ2UKLXsKLQlhdG9taWNfdAkJdXNhZ2U7Ci0Jc3RydWN0IGxpc3RfaGVhZAlsaW5rOwkJLyogbGlzdCBsaW5rICovCi0Jc3RydWN0IHRpbWV2YWwJCXN0YW1wOwkJLyogdGltZSByZWNlaXZlZCBvciBsYXN0IHNlbnQgKi8KLQlyeHJwY19zZXFfdAkJc2VxOwkJLyogbWVzc2FnZSBzZXF1ZW5jZSBudW1iZXIgKi8KLQotCWludAkJCXN0YXRlOwkJLyogdGhlIHN0YXRlIHRoZSBtZXNzYWdlIGlzIGN1cnJlbnRseSBpbiAqLwotI2RlZmluZSBSWFJQQ19NU0dfUFJFUEFSRUQJMAotI2RlZmluZSBSWFJQQ19NU0dfU0VOVAkJMQotI2RlZmluZSBSWFJQQ19NU0dfQUNLRUQJCTIJCS8qIHByb3Zpc2lvbmFsbHkgQUNLJ2QgKi8KLSNkZWZpbmUgUlhSUENfTVNHX0RPTkUJCTMJCS8qIGRlZmluaXRpdmVseSBBQ0snZCAobXNnLT5zZXE8YWNrLmZpcnN0UGFja2V0KSAqLwotI2RlZmluZSBSWFJQQ19NU0dfUkVDRUlWRUQJNAotI2RlZmluZSBSWFJQQ19NU0dfRVJST1IJCS0xCi0JY2hhcgkJCXJ0dGRvbmU7CS8qIHVzZWQgZm9yIFJUVCAqLwotCi0Jc3RydWN0IHJ4cnBjX3RyYW5zcG9ydAkqdHJhbnM7CQkvKiB0cmFuc3BvcnQgcmVjZWl2ZWQgdGhyb3VnaCAqLwotCXN0cnVjdCByeHJwY19jb25uZWN0aW9uCSpjb25uOwkJLyogY29ubmVjdGlvbiByZWNlaXZlZCBvdmVyICovCi0Jc3RydWN0IHNrX2J1ZmYJCSpwa3Q7CQkvKiByZWNlaXZlZCBwYWNrZXQgKi8KLQlvZmZfdAkJCW9mZnNldDsJCS8qIG9mZnNldCBpbnRvIHBrdCBvZiBuZXh0IGJ5dGUgb2YgZGF0YSAqLwotCi0Jc3RydWN0IHJ4cnBjX2hlYWRlcgloZHI7CQkvKiBtZXNzYWdlIGhlYWRlciAqLwotCi0JaW50CQkJZGNvdW50OwkJLyogZGF0YSBwYXJ0IGNvdW50ICovCi0Jc2l6ZV90CQkJZHNpemU7CQkvKiBkYXRhIHNpemUgKi8KLSNkZWZpbmUgUlhSUENfTVNHX01BWF9JT0NTIDgKLQlzdHJ1Y3Qga3ZlYwkJZGF0YVtSWFJQQ19NU0dfTUFYX0lPQ1NdOyAvKiBtZXNzYWdlIGRhdGEgKi8KLQl1bnNpZ25lZCBsb25nCQlkZnJlZTsJCS8qIGJpdCBtYXNrIGluZGljYXRpbmcga2ZyZWUoZGF0YVt4XSkgaWYgVCAqLwotfTsKLQotI2RlZmluZSByeHJwY19nZXRfbWVzc2FnZShNKSBkbyB7IGF0b21pY19pbmMoJihNKS0+dXNhZ2UpOyB9IHdoaWxlKDApCi0KLWV4dGVybiB2b2lkIF9fcnhycGNfcHV0X21lc3NhZ2Uoc3RydWN0IHJ4cnBjX21lc3NhZ2UgKm1zZyk7Ci1zdGF0aWMgaW5saW5lIHZvaWQgcnhycGNfcHV0X21lc3NhZ2Uoc3RydWN0IHJ4cnBjX21lc3NhZ2UgKm1zZykKLXsKLQlCVUdfT04oYXRvbWljX3JlYWQoJm1zZy0+dXNhZ2UpPD0wKTsKLQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmbXNnLT51c2FnZSkpCi0JCV9fcnhycGNfcHV0X21lc3NhZ2UobXNnKTsKLX0KLQotZXh0ZXJuIGludCByeHJwY19jb25uX25ld21zZyhzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubiwKLQkJCSAgICAgc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsCi0JCQkgICAgIHVpbnQ4X3QgdHlwZSwKLQkJCSAgICAgaW50IGNvdW50LAotCQkJICAgICBzdHJ1Y3Qga3ZlYyAqZGlvdiwKLQkJCSAgICAgZ2ZwX3QgYWxsb2NfZmxhZ3MsCi0JCQkgICAgIHN0cnVjdCByeHJwY19tZXNzYWdlICoqX21zZyk7Ci0KLWV4dGVybiBpbnQgcnhycGNfY29ubl9zZW5kbXNnKHN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uLCBzdHJ1Y3QgcnhycGNfbWVzc2FnZSAqbXNnKTsKLQotI2VuZGlmIC8qIF9MSU5VWF9SWFJQQ19NRVNTQUdFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcnhycGMvcGFja2V0LmggYi9pbmNsdWRlL3J4cnBjL3BhY2tldC5oCmluZGV4IDE0NDdmMGEuLmI2OWU2ZTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcnhycGMvcGFja2V0LmgKKysrIGIvaW5jbHVkZS9yeHJwYy9wYWNrZXQuaApAQCAtMSw2ICsxLDYgQEAKIC8qIHBhY2tldC5oOiBSeCBwYWNrZXQgbGF5b3V0IGFuZCBkZWZpbml0aW9ucwogICoKLSAqIENvcHlyaWdodCAoQykgMjAwMiBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKQEAgLTEyLDI4ICsxMiwyNSBAQAogI2lmbmRlZiBfTElOVVhfUlhSUENfUEFDS0VUX0gKICNkZWZpbmUgX0xJTlVYX1JYUlBDX1BBQ0tFVF9ICiAKLSNpbmNsdWRlIDxyeHJwYy90eXBlcy5oPgotCi0jZGVmaW5lIFJYUlBDX0lQVURQX1NJWkUJCTI4Ci1leHRlcm4gc2l6ZV90IFJYUlBDX01BWF9QQUNLRVRfU0laRTsKLSNkZWZpbmUgUlhSUENfTUFYX1BBQ0tFVF9EQVRBX1NJWkUJKFJYUlBDX01BWF9QQUNLRVRfU0laRSAtIHNpemVvZihzdHJ1Y3QgcnhycGNfaGVhZGVyKSkKLSNkZWZpbmUgUlhSUENfTE9DQUxfUEFDS0VUX1NJWkUJCVJYUlBDX01BWF9QQUNLRVRfU0laRQotI2RlZmluZSBSWFJQQ19SRU1PVEVfUEFDS0VUX1NJWkUJKDU3NiAtIFJYUlBDX0lQVURQX1NJWkUpCit0eXBlZGVmIHUzMglyeHJwY19zZXFfdDsJLyogUnggbWVzc2FnZSBzZXF1ZW5jZSBudW1iZXIgKi8KK3R5cGVkZWYgdTMyCXJ4cnBjX3NlcmlhbF90OwkvKiBSeCBtZXNzYWdlIHNlcmlhbCBudW1iZXIgKi8KK3R5cGVkZWYgX19iZTMyCXJ4cnBjX3NlcV9uZXRfdDsgLyogb24tdGhlLXdpcmUgUnggbWVzc2FnZSBzZXF1ZW5jZSBudW1iZXIgKi8KK3R5cGVkZWYgX19iZTMyCXJ4cnBjX3NlcmlhbF9uZXRfdDsgLyogb24tdGhlLXdpcmUgUnggbWVzc2FnZSBzZXJpYWwgbnVtYmVyICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCiAgKiBvbi10aGUtd2lyZSBSeCBwYWNrZXQgaGVhZGVyCiAgKiAtIGFsbCBtdWx0aWJ5dGUgZmllbGRzIHNob3VsZCBiZSBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIKICAqLwotc3RydWN0IHJ4cnBjX2hlYWRlcgoteworc3RydWN0IHJ4cnBjX2hlYWRlciB7CiAJX19iZTMyCQllcG9jaDsJCS8qIGNsaWVudCBib290IHRpbWVzdGFtcCAqLwogCiAJX19iZTMyCQljaWQ7CQkvKiBjb25uZWN0aW9uIGFuZCBjaGFubmVsIElEICovCiAjZGVmaW5lIFJYUlBDX01BWENBTExTCQk0CQkJLyogbWF4IGFjdGl2ZSBjYWxscyBwZXIgY29ubiAqLwogI2RlZmluZSBSWFJQQ19DSEFOTkVMTUFTSwkoUlhSUENfTUFYQ0FMTFMtMSkJLyogbWFzayBmb3IgY2hhbm5lbCBJRCAqLwogI2RlZmluZSBSWFJQQ19DSURNQVNLCQkoflJYUlBDX0NIQU5ORUxNQVNLKQkvKiBtYXNrIGZvciBjb25uZWN0aW9uIElEICovCi0jZGVmaW5lIFJYUlBDX0NJRFNISUZUCQkyCQkJLyogc2hpZnQgZm9yIGNvbm5lY3Rpb24gSUQgKi8KKyNkZWZpbmUgUlhSUENfQ0lEU0hJRlQJCWlsb2cyKFJYUlBDX01BWENBTExTKQkvKiBzaGlmdCBmb3IgY29ubmVjdGlvbiBJRCAqLworI2RlZmluZSBSWFJQQ19DSURfSU5DCQkoMSA8PCBSWFJQQ19DSURTSElGVCkJLyogY29ubmVjdGlvbiBJRCBpbmNyZW1lbnQgKi8KIAogCV9fYmUzMgkJY2FsbE51bWJlcjsJLyogY2FsbCBJRCAoMCBmb3IgY29ubmVjdGlvbi1sZXZlbCBwYWNrZXRzKSAqLwogI2RlZmluZSBSWFJQQ19QUk9DRVNTX01BWENBTExTCSgxPDwyKQkvKiBtYXhpbXVtIG51bWJlciBvZiBhY3RpdmUgY2FsbHMgcGVyIGNvbm4gKHBvd2VyIG9mIDIpICovCkBAIC02Miw3ICs1OSwxMCBAQAogCiAJdWludDhfdAkJdXNlclN0YXR1czsJLyogYXBwLWxheWVyIGRlZmluZWQgc3RhdHVzICovCiAJdWludDhfdAkJc2VjdXJpdHlJbmRleDsJLyogc2VjdXJpdHkgcHJvdG9jb2wgSUQgKi8KLQlfX2JlMTYJCV9yc3ZkOwkJLyogcmVzZXJ2ZWQgKHVzZWQgYnkga2VyYmVyb3Mgc2VjdXJpdHkgYXMgY2tzdW0pICovCisJdW5pb24geworCQlfX2JlMTYJX3JzdmQ7CQkvKiByZXNlcnZlZCAqLworCQlfX2JlMTYJY2tzdW07CQkvKiBrZXJiZXJvcyBzZWN1cml0eSBjaGVja3N1bSAqLworCX07CiAJX19iZTE2CQlzZXJ2aWNlSWQ7CS8qIHNlcnZpY2UgSUQgKi8KIAogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKQEAgLTgxLDggKzgxLDcgQEAKICAqICAgLSBuZXdfX3JzdmQgPSBqX19yc3ZkCiAgKiAgIC0gZHVwbGljYXRpbmcgYWxsIG90aGVyIGZpZWxkcwogICovCi1zdHJ1Y3QgcnhycGNfanVtYm9faGVhZGVyCi17CitzdHJ1Y3QgcnhycGNfanVtYm9faGVhZGVyIHsKIAl1aW50OF90CQlmbGFnczsJCS8qIHBhY2tldCBmbGFncyAoYXMgcGVyIHJ4cnBjX2hlYWRlcikgKi8KIAl1aW50OF90CQlwYWQ7CiAJX19iZTE2CQlfcnN2ZDsJCS8qIHJlc2VydmVkICh1c2VkIGJ5IGtlcmJlcm9zIHNlY3VyaXR5IGFzIGNrc3VtKSAqLwpAQCAtOTUsOCArOTQsNyBAQAogICogb24tdGhlLXdpcmUgUnggQUNLIHBhY2tldCBkYXRhIHBheWxvYWQKICAqIC0gYWxsIG11bHRpYnl0ZSBmaWVsZHMgc2hvdWxkIGJlIGluIG5ldHdvcmsgYnl0ZSBvcmRlcgogICovCi1zdHJ1Y3QgcnhycGNfYWNrcGFja2V0Ci17CitzdHJ1Y3QgcnhycGNfYWNrcGFja2V0IHsKIAlfX2JlMTYJCWJ1ZmZlclNwYWNlOwkvKiBudW1iZXIgb2YgcGFja2V0IGJ1ZmZlcnMgYXZhaWxhYmxlICovCiAJX19iZTE2CQltYXhTa2V3OwkvKiBkaWZmIGJldHdlZW4gc2Vybm8gYmVpbmcgQUNLJ2QgYW5kIGhpZ2hlc3Qgc2VyaWFsIG5vCiAJCQkJCSAqIHJlY2VpdmVkICovCkBAIC0xMjQsNCArMTIyLDkzIEBACiAKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKKy8qCisgKiBBQ0sgcGFja2V0cyBjYW4gaGF2ZSBhIGZ1cnRoZXIgcGllY2Ugb2YgaW5mb3JtYXRpb24gdGFnZ2VkIG9uIHRoZSBlbmQKKyAqLworc3RydWN0IHJ4cnBjX2Fja2luZm8geworCV9fYmUzMgkJcnhNVFU7CQkvKiBtYXhpbXVtIFJ4IE1UVSBzaXplIChieXRlcykgW0FGUyAzLjNdICovCisJX19iZTMyCQltYXhNVFU7CQkvKiBtYXhpbXVtIGludGVyZmFjZSBNVFUgc2l6ZSAoYnl0ZXMpIFtBRlMgMy4zXSAqLworCV9fYmUzMgkJcndpbmQ7CQkvKiBSeCB3aW5kb3cgc2l6ZSAocGFja2V0cykgW0FGUyAzLjRdICovCisJX19iZTMyCQlqdW1ib19tYXg7CS8qIG1heCBwYWNrZXRzIHRvIHN0aWNrIGludG8gYSBqdW1ibyBwYWNrZXQgW0FGUyAzLjVdICovCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogS2VyYmVyb3Mgc2VjdXJpdHkgdHlwZS0yIGNoYWxsZW5nZSBwYWNrZXQKKyAqLworc3RydWN0IHJ4a2FkX2NoYWxsZW5nZSB7CisJX19iZTMyCQl2ZXJzaW9uOwkvKiB2ZXJzaW9uIG9mIHRoaXMgY2hhbGxlbmdlIHR5cGUgKi8KKwlfX2JlMzIJCW5vbmNlOwkJLyogZW5jcnlwdGVkIHJhbmRvbSBudW1iZXIgKi8KKwlfX2JlMzIJCW1pbl9sZXZlbDsJLyogbWluaW11bSBzZWN1cml0eSBsZXZlbCAqLworCV9fYmUzMgkJX19wYWRkaW5nOwkvKiBwYWRkaW5nIHRvIDgtYnl0ZSBib3VuZGFyeSAqLworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIEtlcmJlcm9zIHNlY3VyaXR5IHR5cGUtMiByZXNwb25zZSBwYWNrZXQKKyAqLworc3RydWN0IHJ4a2FkX3Jlc3BvbnNlIHsKKwlfX2JlMzIJCXZlcnNpb247CS8qIHZlcnNpb24gb2YgdGhpcyByZXBvbnNlIHR5cGUgKi8KKwlfX2JlMzIJCV9fcGFkOworCisJLyogZW5jcnlwdGVkIGJpdCBvZiB0aGUgcmVzcG9uc2UgKi8KKwlzdHJ1Y3QgeworCQlfX2JlMzIJCWVwb2NoOwkJLyogY3VycmVudCBlcG9jaCAqLworCQlfX2JlMzIJCWNpZDsJCS8qIHBhcmVudCBjb25uZWN0aW9uIElEICovCisJCV9fYmUzMgkJY2hlY2tzdW07CS8qIGNoZWNrc3VtICovCisJCV9fYmUzMgkJc2VjdXJpdHlJbmRleDsJLyogc2VjdXJpdHkgdHlwZSAqLworCQlfX2JlMzIJCWNhbGxfaWRbNF07CS8qIGVuY3J5cHRlZCBjYWxsIElEcyAqLworCQlfX2JlMzIJCWluY19ub25jZTsJLyogY2hhbGxlbmdlIG5vbmNlICsgMSAqLworCQlfX2JlMzIJCWxldmVsOwkJLyogZGVzaXJlZCBsZXZlbCAqLworCX0gZW5jcnlwdGVkOworCisJX19iZTMyCQlrdm5vOwkJLyogS2VyYmVyb3Mga2V5IHZlcnNpb24gbnVtYmVyICovCisJX19iZTMyCQl0aWNrZXRfbGVuOwkvKiBLZXJiZXJvcyB0aWNrZXQgbGVuZ3RoICAqLworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIFJ4UlBDLWxldmVsIGFib3J0IGNvZGVzCisgKi8KKyNkZWZpbmUgUlhfQ0FMTF9ERUFECQktMQkvKiBjYWxsL2Nvbm4gaGFzIGJlZW4gaW5hY3RpdmUgYW5kIGlzIHNodXQgZG93biAqLworI2RlZmluZSBSWF9JTlZBTElEX09QRVJBVElPTgktMgkvKiBpbnZhbGlkIG9wZXJhdGlvbiByZXF1ZXN0ZWQgLyBhdHRlbXB0ZWQgKi8KKyNkZWZpbmUgUlhfQ0FMTF9USU1FT1VUCQktMwkvKiBjYWxsIHRpbWVvdXQgZXhjZWVkZWQgKi8KKyNkZWZpbmUgUlhfRU9GCQkJLTQJLyogdW5leHBlY3RlZCBlbmQgb2YgZGF0YSBvbiByZWFkIG9wICovCisjZGVmaW5lIFJYX1BST1RPQ09MX0VSUk9SCS01CS8qIGxvdy1sZXZlbCBwcm90b2NvbCBlcnJvciAqLworI2RlZmluZSBSWF9VU0VSX0FCT1JUCQktNgkvKiBnZW5lcmljIHVzZXIgYWJvcnQgKi8KKyNkZWZpbmUgUlhfQUREUklOVVNFCQktNwkvKiBVRFAgcG9ydCBpbiB1c2UgKi8KKyNkZWZpbmUgUlhfREVCVUdJX0JBRFRZUEUJLTgJLyogYmFkIGRlYnVnZ2luZyBwYWNrZXQgdHlwZSAqLworCisvKgorICogKHVuKW1hcnNoYWxsaW5nIGFib3J0IGNvZGVzIChyeGdlbikKKyAqLworI2RlZmluZQlSWEdFTl9DQ19NQVJTSEFMICAgIC00NTAKKyNkZWZpbmUJUlhHRU5fQ0NfVU5NQVJTSEFMICAtNDUxCisjZGVmaW5lCVJYR0VOX1NTX01BUlNIQUwgICAgLTQ1MgorI2RlZmluZQlSWEdFTl9TU19VTk1BUlNIQUwgIC00NTMKKyNkZWZpbmUJUlhHRU5fREVDT0RFCSAgICAtNDU0CisjZGVmaW5lCVJYR0VOX09QQ09ERQkgICAgLTQ1NQorI2RlZmluZQlSWEdFTl9TU19YRFJGUkVFICAgIC00NTYKKyNkZWZpbmUJUlhHRU5fQ0NfWERSRlJFRSAgICAtNDU3CisKKy8qCisgKiBSeCBrZXJiZXJvcyBzZWN1cml0eSBhYm9ydCBjb2RlcworICogLSB1bmZvcnR1bmF0ZWx5IHdlIGhhdmUgbm8gZ2VuZXJhbGlzZWQgc2VjdXJpdHkgYWJvcnQgY29kZXMgdG8gc2F5IHRoaW5ncworICogICBsaWtlICJ1bnN1cHBvcnRlZCBzZWN1cml0eSIsIHNvIHdlIGhhdmUgdG8gdXNlIHRoZXNlIGluc3RlYWQgYW5kIGhvcGUgdGhlCisgKiAgIG90aGVyIHNpZGUgdW5kZXJzdGFuZHMKKyAqLworI2RlZmluZSBSWEtBRElOQ09OU0lTVEVOQ1kJMTkyNzA0MDAJLyogc2VjdXJpdHkgbW9kdWxlIHN0cnVjdHVyZSBpbmNvbnNpc3RlbnQgKi8KKyNkZWZpbmUgUlhLQURQQUNLRVRTSE9SVAkxOTI3MDQwMQkvKiBwYWNrZXQgdG9vIHNob3J0IGZvciBzZWN1cml0eSBjaGFsbGVuZ2UgKi8KKyNkZWZpbmUgUlhLQURMRVZFTEZBSUwJCTE5MjcwNDAyCS8qIHNlY3VyaXR5IGxldmVsIG5lZ290aWF0aW9uIGZhaWxlZCAqLworI2RlZmluZSBSWEtBRFRJQ0tFVExFTgkJMTkyNzA0MDMJLyogdGlja2V0IGxlbmd0aCB0b28gc2hvcnQgb3IgdG9vIGxvbmcgKi8KKyNkZWZpbmUgUlhLQURPVVRPRlNFUVVFTkNFCTE5MjcwNDA0CS8qIHBhY2tldCBoYWQgYmFkIHNlcXVlbmNlIG51bWJlciAqLworI2RlZmluZSBSWEtBRE5PQVVUSAkJMTkyNzA0MDUJLyogY2FsbGVyIG5vdCBhdXRob3Jpc2VkICovCisjZGVmaW5lIFJYS0FEQkFES0VZCQkxOTI3MDQwNgkvKiBpbGxlZ2FsIGtleTogYmFkIHBhcml0eSBvciB3ZWFrICovCisjZGVmaW5lIFJYS0FEQkFEVElDS0VUCQkxOTI3MDQwNwkvKiBzZWN1cml0eSBvYmplY3Qgd2FzIHBhc3NlZCBhIGJhZCB0aWNrZXQgKi8KKyNkZWZpbmUgUlhLQURVTktOT1dOS0VZCQkxOTI3MDQwOAkvKiB0aWNrZXQgY29udGFpbmVkIHVua25vd24ga2V5IHZlcnNpb24gbnVtYmVyICovCisjZGVmaW5lIFJYS0FERVhQSVJFRAkJMTkyNzA0MDkJLyogYXV0aGVudGljYXRpb24gZXhwaXJlZCAqLworI2RlZmluZSBSWEtBRFNFQUxFRElOQ09OCTE5MjcwNDEwCS8qIHNlYWxlZCBkYXRhIGluY29uc2lzdGVudCAqLworI2RlZmluZSBSWEtBRERBVEFMRU4JCTE5MjcwNDExCS8qIHVzZXIgZGF0YSB0b28gbG9uZyAqLworI2RlZmluZSBSWEtBRElMTEVHQUxMRVZFTAkxOTI3MDQxMgkvKiBjYWxsZXIgbm90IGF1dGhvcmlzZWQgdG8gdXNlIGVuY3J5cHRlZCBjb25ucyAqLworCiAjZW5kaWYgLyogX0xJTlVYX1JYUlBDX1BBQ0tFVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3J4cnBjL3BlZXIuaCBiL2luY2x1ZGUvcnhycGMvcGVlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjhmZTk3Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvcnhycGMvcGVlci5oCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyogcGVlci5oOiBSeCBSUEMgcGVyLXRyYW5zcG9ydCBwZWVyIHJlY29yZAotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMiBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotCi0jaWZuZGVmIF9MSU5VWF9SWFJQQ19QRUVSX0gKLSNkZWZpbmUgX0xJTlVYX1JYUlBDX1BFRVJfSAotCi0jaW5jbHVkZSA8bGludXgvd2FpdC5oPgotI2luY2x1ZGUgPHJ4cnBjL3R5cGVzLmg+Ci0jaW5jbHVkZSA8cnhycGMva3J4dGltb2QuaD4KLQotc3RydWN0IHJ4cnBjX3BlZXJfb3BzCi17Ci0JLyogcGVlciByZWNvcmQgYmVpbmcgYWRkZWQgKi8KLQlpbnQgKCphZGRpbmcpKHN0cnVjdCByeHJwY19wZWVyICpwZWVyKTsKLQotCS8qIHBlZXIgcmVjb3JkIGJlaW5nIGRpc2NhcmRlZCBmcm9tIGdyYXZleWFyZCAqLwotCXZvaWQgKCpkaXNjYXJkaW5nKShzdHJ1Y3QgcnhycGNfcGVlciAqcGVlcik7Ci0KLQkvKiBjaGFuZ2Ugb2YgZXBvY2ggZGV0ZWN0ZWQgb24gY29ubmVjdGlvbiAqLwotCXZvaWQgKCpjaGFuZ2Vfb2ZfZXBvY2gpKHN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uKTsKLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBSeCBSUEMgcGVyLXRyYW5zcG9ydCBwZWVyIHJlY29yZAotICogLSBwZWVycyBvbmx5IHJldGFpbiBhIHJlZmNvdW50IG9uIHRoZSB0cmFuc3BvcnQgd2hlbiB0aGV5IGFyZSBhY3RpdmUKLSAqIC0gcGVlcnMgd2l0aCByZWZjb3VudD09MCBhcmUgaW5hY3RpdmUgYW5kIHJlc2lkZSBpbiB0aGUgdHJhbnNwb3J0J3MgZ3JhdmV5YXJkCi0gKi8KLXN0cnVjdCByeHJwY19wZWVyCi17Ci0JYXRvbWljX3QJCXVzYWdlOwotCXN0cnVjdCByeHJwY19wZWVyX29wcwkqb3BzOwkJLyogb3BlcmF0aW9ucyBvbiB0aGlzIHBlZXIgKi8KLQlzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0CSp0cmFuczsJCS8qIG93bmVyIHRyYW5zcG9ydCAqLwotCXN0cnVjdCByeHJwY190aW1lcgl0aW1lb3V0OwkvKiB0aW1lb3V0IGZvciBncmF2ZSBkZXN0cnVjdGlvbiAqLwotCXN0cnVjdCBsaXN0X2hlYWQJbGluazsJCS8qIGxpbmsgaW4gdHJhbnNwb3J0J3MgcGVlciBsaXN0ICovCi0Jc3RydWN0IGxpc3RfaGVhZAlwcm9jX2xpbms7CS8qIGxpbmsgaW4gL3Byb2MgbGlzdCAqLwotCXJ3bG9ja190CQljb25uX2lkbG9jazsJLyogbG9jayBmb3IgY29ubmVjdGlvbiBJRHMgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkCWNvbm5faWRsaXN0OwkvKiBsaXN0IG9mIGNvbm5lY3Rpb25zIGdyYW50ZWQgSURzICovCi0JdWludDMyX3QJCWNvbm5faWRjb3VudGVyOwkvKiBjb25uZWN0aW9uIElEIGNvdW50ZXIgKi8KLQlyd2xvY2tfdAkJY29ubl9sb2NrOwkvKiBsb2NrIGZvciBhY3RpdmUvZGVhZCBjb25uZWN0aW9ucyAqLwotCXN0cnVjdCBsaXN0X2hlYWQJY29ubl9hY3RpdmU7CS8qIGFjdGl2ZSBjb25uZWN0aW9ucyB0by9mcm9tIHRoaXMgcGVlciAqLwotCXN0cnVjdCBsaXN0X2hlYWQJY29ubl9ncmF2ZXlhcmQ7CS8qIGdyYXZleWFyZCBmb3IgaW5hY3RpdmUgY29ubmVjdGlvbnMgKi8KLQlzcGlubG9ja190CQljb25uX2d5bG9jazsJLyogbG9jayBmb3IgY29ubl9ncmF2ZXlhcmQgKi8KLQl3YWl0X3F1ZXVlX2hlYWRfdAljb25uX2d5X3dhaXRxOwkvKiB3YWl0IHF1ZXVlIGhpdCB3aGVuIGdyYXZleWFyZCBpcyBlbXB0eSAqLwotCWF0b21pY190CQljb25uX2NvdW50OwkvKiBudW1iZXIgb2YgYXR0YWNoZWQgY29ubmVjdGlvbnMgKi8KLQlzdHJ1Y3QgaW5fYWRkcgkJYWRkcjsJCS8qIHJlbW90ZSBhZGRyZXNzICovCi0Jc2l6ZV90CQkJaWZfbXR1OwkJLyogaW50ZXJmYWNlIE1UVSBmb3IgdGhpcyBwZWVyICovCi0Jc3BpbmxvY2tfdAkJbG9jazsJCS8qIGFjY2VzcyBsb2NrICovCi0KLQl2b2lkCQkJKnVzZXI7CQkvKiBhcHBsaWNhdGlvbiBsYXllciBkYXRhICovCi0KLQkvKiBjYWxjdWxhdGVkIFJUVCBjYWNoZSAqLwotI2RlZmluZSBSWFJQQ19SVFRfQ0FDSEVfU0laRSAzMgotCXN1c2Vjb25kc190CQlydHQ7CQkvKiBjdXJyZW50IFJUVCBlc3RpbWF0ZSAoaW4gdVMpICovCi0JdW5zaWduZWQJCXJ0dF9wb2ludDsJLyogbmV4dCBlbnRyeSBhdCB3aGljaCB0byBpbnNlcnQgKi8KLQl1bnNpZ25lZAkJcnR0X3VzYWdlOwkvKiBhbW91bnQgb2YgY2FjaGUgYWN0dWFsbHkgdXNlZCAqLwotCXN1c2Vjb25kc190CQlydHRfY2FjaGVbUlhSUENfUlRUX0NBQ0hFX1NJWkVdOyAvKiBjYWxjdWxhdGVkIFJUVCBjYWNoZSAqLwotfTsKLQotCi1leHRlcm4gaW50IHJ4cnBjX3BlZXJfbG9va3VwKHN0cnVjdCByeHJwY190cmFuc3BvcnQgKnRyYW5zLAotCQkJICAgICBfX2JlMzIgYWRkciwKLQkJCSAgICAgc3RydWN0IHJ4cnBjX3BlZXIgKipfcGVlcik7Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCByeHJwY19nZXRfcGVlcihzdHJ1Y3QgcnhycGNfcGVlciAqcGVlcikKLXsKLQlCVUdfT04oYXRvbWljX3JlYWQoJnBlZXItPnVzYWdlKTwwKTsKLQlhdG9taWNfaW5jKCZwZWVyLT51c2FnZSk7Ci0JLy9wcmludGsoInJ4cnBjX2dldF9wZWVyKCVwe3U9JWR9KVxuIixwZWVyLGF0b21pY19yZWFkKCZwZWVyLT51c2FnZSkpOwotfQotCi1leHRlcm4gdm9pZCByeHJwY19wdXRfcGVlcihzdHJ1Y3QgcnhycGNfcGVlciAqcGVlcik7Ci0KLSNlbmRpZiAvKiBfTElOVVhfUlhSUENfUEVFUl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3J4cnBjL3J4cnBjLmggYi9pbmNsdWRlL3J4cnBjL3J4cnBjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkOTg3NGMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9yeHJwYy9yeHJwYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyogcnguaDogUnggUlBDIGludGVyZmFjZQotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMiBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotCi0jaWZuZGVmIF9MSU5VWF9SWFJQQ19SWFJQQ19ICi0jZGVmaW5lIF9MSU5VWF9SWFJQQ19SWFJQQ19ICi0KLSNpZmRlZiBfX0tFUk5FTF9fCi0KLWV4dGVybiBfX2JlMzIgcnhycGNfZXBvY2g7Ci0KLSNpZmRlZiBDT05GSUdfU1lTQ1RMCi1leHRlcm4gaW50IHJ4cnBjX2t0cmFjZTsKLWV4dGVybiBpbnQgcnhycGNfa2RlYnVnOwotZXh0ZXJuIGludCByeHJwY19rcHJvdG87Ci1leHRlcm4gaW50IHJ4cnBjX2tuZXQ7Ci0jZWxzZQotI2RlZmluZSByeHJwY19rdHJhY2UJMAotI2RlZmluZSByeHJwY19rZGVidWcJMAotI2RlZmluZSByeHJwY19rcHJvdG8JMAotI2RlZmluZSByeHJwY19rbmV0CTAKLSNlbmRpZgotCi1leHRlcm4gaW50IHJ4cnBjX3N5c2N0bF9pbml0KHZvaWQpOwotZXh0ZXJuIHZvaWQgcnhycGNfc3lzY3RsX2NsZWFudXAodm9pZCk7Ci0KLSNlbmRpZiAvKiBfX0tFUk5FTF9fICovCi0KLSNlbmRpZiAvKiBfTElOVVhfUlhSUENfUlhSUENfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9yeHJwYy90cmFuc3BvcnQuaCBiL2luY2x1ZGUvcnhycGMvdHJhbnNwb3J0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjN2I5NjguLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9yeHJwYy90cmFuc3BvcnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKiB0cmFuc3BvcnQuaDogUnggdHJhbnNwb3J0IG1hbmFnZW1lbnQKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLQotI2lmbmRlZiBfTElOVVhfUlhSUENfVFJBTlNQT1JUX0gKLSNkZWZpbmUgX0xJTlVYX1JYUlBDX1RSQU5TUE9SVF9ICi0KLSNpbmNsdWRlIDxyeHJwYy90eXBlcy5oPgotI2luY2x1ZGUgPHJ4cnBjL2tyeGlvZC5oPgotI2luY2x1ZGUgPHJ4cnBjL3J4cnBjLmg+Ci0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0jaW5jbHVkZSA8bGludXgvcndzZW0uaD4KLQotdHlwZWRlZiBpbnQgKCpyeHJwY19uZXdjYWxsX2ZueF90KShzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCk7Ci0KLWV4dGVybiB3YWl0X3F1ZXVlX2hlYWRfdCByeHJwY19rcnhpb2Rfd3E7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBSeCBvcGVyYXRpb24gc3BlY2lmaWNhdGlvbgotICogLSB0YWJsZXMgb2YgdGhlc2UgbXVzdCBiZSBzb3J0ZWQgYnkgb3AgSUQgc28gdGhhdCB0aGV5IGNhbiBiZSBiaW5hcnktY2hvcCBzZWFyY2hlZAotICovCi1zdHJ1Y3QgcnhycGNfb3BlcmF0aW9uCi17Ci0JdW5zaWduZWQJCWlkOwkJLyogb3BlcmF0aW9uIElEICovCi0Jc2l6ZV90CQkJYXNpemU7CQkvKiBtaW5pbXVtIHNpemUgb2YgYXJndW1lbnQgYmxvY2sgKi8KLQljb25zdCBjaGFyCQkqbmFtZTsJCS8qIG5hbWUgb2Ygb3BlcmF0aW9uICovCi0Jdm9pZAkJCSp1c2VyOwkJLyogaW5pdGlhbCB1c2VyIGRhdGEgKi8KLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBSeCB0cmFuc3BvcnQgc2VydmljZSByZWNvcmQKLSAqLwotc3RydWN0IHJ4cnBjX3NlcnZpY2UKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkCWxpbms7CQkvKiBsaW5rIGluIHNlcnZpY2VzIGxpc3Qgb24gdHJhbnNwb3J0ICovCi0Jc3RydWN0IG1vZHVsZQkJKm93bmVyOwkJLyogb3duZXIgbW9kdWxlICovCi0JcnhycGNfbmV3Y2FsbF9mbnhfdAluZXdfY2FsbDsJLyogbmV3IGNhbGwgaGFuZGxlciBmdW5jdGlvbiAqLwotCWNvbnN0IGNoYXIJCSpuYW1lOwkJLyogbmFtZSBvZiBzZXJ2aWNlICovCi0JdW5zaWduZWQgc2hvcnQJCXNlcnZpY2VfaWQ7CS8qIFJ4IHNlcnZpY2UgSUQgKi8KLQlyeHJwY19jYWxsX2F0dG5fZnVuY190CWF0dG5fZnVuYzsJLyogY2FsbCByZXF1aXJlcyBhdHRlbnRpb24gY2FsbGJhY2sgKi8KLQlyeHJwY19jYWxsX2Vycm9yX2Z1bmNfdAllcnJvcl9mdW5jOwkvKiBjYWxsIGVycm9yIGNhbGxiYWNrICovCi0JcnhycGNfY2FsbF9hZW1hcF9mdW5jX3QJYWVtYXBfZnVuYzsJLyogYWJvcnQgLT4gZXJybm8gbWFwcGluZyBjYWxsYmFjayAqLwotCi0JY29uc3Qgc3RydWN0IHJ4cnBjX29wZXJhdGlvbgkqb3BzX2JlZ2luOwkvKiBiZWdpbm5pbmcgb2Ygb3BlcmF0aW9ucyB0YWJsZSAqLwotCWNvbnN0IHN0cnVjdCByeHJwY19vcGVyYXRpb24JKm9wc19lbmQ7CS8qIGVuZCBvZiBvcGVyYXRpb25zIHRhYmxlICovCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogUnggdHJhbnNwb3J0IGVuZHBvaW50IHJlY29yZAotICovCi1zdHJ1Y3QgcnhycGNfdHJhbnNwb3J0Ci17Ci0JYXRvbWljX3QJCXVzYWdlOwotCXN0cnVjdCBzb2NrZXQJCSpzb2NrZXQ7CS8qIG15IFVEUCBzb2NrZXQgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkCXNlcnZpY2VzOwkvKiBzZXJ2aWNlcyBsaXN0ZW5pbmcgb24gdGhpcyBzb2NrZXQgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkCWxpbms7CQkvKiBsaW5rIGluIHRyYW5zcG9ydCBsaXN0ICovCi0Jc3RydWN0IGxpc3RfaGVhZAlwcm9jX2xpbms7CS8qIGxpbmsgaW4gdHJhbnNwb3J0IHByb2MgbGlzdCAqLwotCXN0cnVjdCBsaXN0X2hlYWQJa3J4aW9kcV9saW5rOwkvKiBrcnhpb2QgYXR0ZW50aW9uIHF1ZXVlIGxpbmsgKi8KLQlzcGlubG9ja190CQlsb2NrOwkJLyogYWNjZXNzIGxvY2sgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkCXBlZXJfYWN0aXZlOwkvKiBhY3RpdmUgcGVlcnMgY29ubmVjdGVkIHRvIG92ZXIgdGhpcyBzb2NrZXQgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkCXBlZXJfZ3JhdmV5YXJkOwkvKiBpbmFjdGl2ZSBwZWVyIGxpc3QgKi8KLQlzcGlubG9ja190CQlwZWVyX2d5bG9jazsJLyogcGVlciBncmF2ZXlhcmQgbG9jayAqLwotCXdhaXRfcXVldWVfaGVhZF90CXBlZXJfZ3lfd2FpdHE7CS8qIHdhaXQgcXVldWUgaGl0IHdoZW4gcGVlciBncmF2ZXlhcmQgaXMgZW1wdHkgKi8KLQlyd2xvY2tfdAkJcGVlcl9sb2NrOwkvKiBwZWVyIGxpc3QgYWNjZXNzIGxvY2sgKi8KLQlhdG9taWNfdAkJcGVlcl9jb3VudDsJLyogbnVtYmVyIG9mIHBlZXJzICovCi0Jc3RydWN0IHJ4cnBjX3BlZXJfb3BzCSpwZWVyX29wczsJLyogZGVmYXVsdCBwZWVyIG9wZXJhdGlvbnMgKi8KLQl1bnNpZ25lZCBzaG9ydAkJcG9ydDsJCS8qIHBvcnQgdXBvbiB3aGljaCBsaXN0ZW5pbmcgKi8KLQl2b2xhdGlsZSBjaGFyCQllcnJvcl9yY3ZkOwkvKiBUIGlmIHJlY2VpdmVkIElDTVAgZXJyb3Igb3V0c3RhbmRpbmcgKi8KLX07Ci0KLWV4dGVybiBpbnQgcnhycGNfY3JlYXRlX3RyYW5zcG9ydCh1bnNpZ25lZCBzaG9ydCBwb3J0LAotCQkJCSAgc3RydWN0IHJ4cnBjX3RyYW5zcG9ydCAqKl90cmFucyk7Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCByeHJwY19nZXRfdHJhbnNwb3J0KHN0cnVjdCByeHJwY190cmFuc3BvcnQgKnRyYW5zKQotewotCUJVR19PTihhdG9taWNfcmVhZCgmdHJhbnMtPnVzYWdlKSA8PSAwKTsKLQlhdG9taWNfaW5jKCZ0cmFucy0+dXNhZ2UpOwotCS8vcHJpbnRrKCJyeHJwY19nZXRfdHJhbnNwb3J0KCVwe3U9JWR9KVxuIiwKLQkvLyAgICAgICB0cmFucywgYXRvbWljX3JlYWQoJnRyYW5zLT51c2FnZSkpOwotfQotCi1leHRlcm4gdm9pZCByeHJwY19wdXRfdHJhbnNwb3J0KHN0cnVjdCByeHJwY190cmFuc3BvcnQgKnRyYW5zKTsKLQotZXh0ZXJuIGludCByeHJwY19hZGRfc2VydmljZShzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICp0cmFucywKLQkJCSAgICAgc3RydWN0IHJ4cnBjX3NlcnZpY2UgKnNydik7Ci0KLWV4dGVybiB2b2lkIHJ4cnBjX2RlbF9zZXJ2aWNlKHN0cnVjdCByeHJwY190cmFuc3BvcnQgKnRyYW5zLAotCQkJICAgICAgc3RydWN0IHJ4cnBjX3NlcnZpY2UgKnNydik7Ci0KLWV4dGVybiB2b2lkIHJ4cnBjX3RyYW5zX3JlY2VpdmVfcGFja2V0KHN0cnVjdCByeHJwY190cmFuc3BvcnQgKnRyYW5zKTsKLQotZXh0ZXJuIGludCByeHJwY190cmFuc19pbW1lZGlhdGVfYWJvcnQoc3RydWN0IHJ4cnBjX3RyYW5zcG9ydCAqdHJhbnMsCi0JCQkJICAgICAgIHN0cnVjdCByeHJwY19tZXNzYWdlICptc2csCi0JCQkJICAgICAgIGludCBlcnJvcik7Ci0KLSNlbmRpZiAvKiBfTElOVVhfUlhSUENfVFJBTlNQT1JUX0ggKi8KZGlmZiAtLWdpdCBhL2tlcm5lbC9hdWRpdC5jIGIva2VybmVsL2F1ZGl0LmMKaW5kZXggNzZjOWExMS4uNGU5ZDIwOCAxMDA2NDQKLS0tIGEva2VybmVsL2F1ZGl0LmMKKysrIGIva2VybmVsL2F1ZGl0LmMKQEAgLTE1MSw3ICsxNTEsNyBAQAogCiBzdGF0aWMgdm9pZCBhdWRpdF9zZXRfcGlkKHN0cnVjdCBhdWRpdF9idWZmZXIgKmFiLCBwaWRfdCBwaWQpCiB7Ci0Jc3RydWN0IG5sbXNnaGRyICpubGggPSAoc3RydWN0IG5sbXNnaGRyICopYWItPnNrYi0+ZGF0YTsKKwlzdHJ1Y3Qgbmxtc2doZHIgKm5saCA9IG5sbXNnX2hkcihhYi0+c2tiKTsKIAlubGgtPm5sbXNnX3BpZCA9IHBpZDsKIH0KIApAQCAtNzUwLDcgKzc1MCw3IEBACiAJdTMyCQlybGVuOwogCiAJd2hpbGUgKHNrYi0+bGVuID49IE5MTVNHX1NQQUNFKDApKSB7Ci0JCW5saCA9IChzdHJ1Y3Qgbmxtc2doZHIgKilza2ItPmRhdGE7CisJCW5saCA9IG5sbXNnX2hkcihza2IpOwogCQlpZiAobmxoLT5ubG1zZ19sZW4gPCBzaXplb2YoKm5saCkgfHwgc2tiLT5sZW4gPCBubGgtPm5sbXNnX2xlbikKIAkJCXJldHVybjsKIAkJcmxlbiA9IE5MTVNHX0FMSUdOKG5saC0+bmxtc2dfbGVuKTsKQEAgLTc5NSw3ICs3OTUsNyBAQAogCXByaW50ayhLRVJOX0lORk8gImF1ZGl0OiBpbml0aWFsaXppbmcgbmV0bGluayBzb2NrZXQgKCVzKVxuIiwKIAkgICAgICAgYXVkaXRfZGVmYXVsdCA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOwogCWF1ZGl0X3NvY2sgPSBuZXRsaW5rX2tlcm5lbF9jcmVhdGUoTkVUTElOS19BVURJVCwgMCwgYXVkaXRfcmVjZWl2ZSwKLQkJCQkJICAgVEhJU19NT0RVTEUpOworCQkJCQkgICBOVUxMLCBUSElTX01PRFVMRSk7CiAJaWYgKCFhdWRpdF9zb2NrKQogCQlhdWRpdF9wYW5pYygiY2Fubm90IGluaXRpYWxpemUgbmV0bGluayBzb2NrZXQiKTsKIAllbHNlCkBAIC0xMDczLDcgKzEwNzMsNyBAQAogCQkJZ290byBvdXQ7CiAJfQogCXZhX2NvcHkoYXJnczIsIGFyZ3MpOwotCWxlbiA9IHZzbnByaW50Zihza2ItPnRhaWwsIGF2YWlsLCBmbXQsIGFyZ3MpOworCWxlbiA9IHZzbnByaW50Zihza2JfdGFpbF9wb2ludGVyKHNrYiksIGF2YWlsLCBmbXQsIGFyZ3MpOwogCWlmIChsZW4gPj0gYXZhaWwpIHsKIAkJLyogVGhlIHByaW50ayBidWZmZXIgaXMgMTAyNCBieXRlcyBsb25nLCBzbyBpZiB3ZSBnZXQKIAkJICogaGVyZSBhbmQgQVVESVRfQlVGU0laIGlzIGF0IGxlYXN0IDEwMjQsIHRoZW4gd2UgY2FuCkBAIC0xMDgyLDcgKzEwODIsNyBAQAogCQkJbWF4X3QodW5zaWduZWQsIEFVRElUX0JVRlNJWiwgMStsZW4tYXZhaWwpKTsKIAkJaWYgKCFhdmFpbCkKIAkJCWdvdG8gb3V0OwotCQlsZW4gPSB2c25wcmludGYoc2tiLT50YWlsLCBhdmFpbCwgZm10LCBhcmdzMik7CisJCWxlbiA9IHZzbnByaW50Zihza2JfdGFpbF9wb2ludGVyKHNrYiksIGF2YWlsLCBmbXQsIGFyZ3MyKTsKIAl9CiAJaWYgKGxlbiA+IDApCiAJCXNrYl9wdXQoc2tiLCBsZW4pOwpAQCAtMTE0Myw3ICsxMTQzLDcgQEAKIAkJCXJldHVybjsKIAl9CiAKLQlwdHIgPSBza2ItPnRhaWw7CisJcHRyID0gc2tiX3RhaWxfcG9pbnRlcihza2IpOwogCWZvciAoaT0wOyBpPGxlbjsgaSsrKSB7CiAJCSpwdHIrKyA9IGhleFsoYnVmW2ldICYgMHhGMCk+PjRdOyAvKiBVcHBlciBuaWJibGUgKi8KIAkJKnB0cisrID0gaGV4W2J1ZltpXSAmIDB4MEZdOwkgIC8qIExvd2VyIG5pYmJsZSAqLwpAQCAtMTE3NSw3ICsxMTc1LDcgQEAKIAkJaWYgKCFhdmFpbCkKIAkJCXJldHVybjsKIAl9Ci0JcHRyID0gc2tiLT50YWlsOworCXB0ciA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKTsKIAkqcHRyKysgPSAnIic7CiAJbWVtY3B5KHB0ciwgc3RyaW5nLCBzbGVuKTsKIAlwdHIgKz0gc2xlbjsKQEAgLTEyNjgsNyArMTI2OCw3IEBACiAJCWF1ZGl0X2xvZ19sb3N0KCJyYXRlIGxpbWl0IGV4Y2VlZGVkIik7CiAJfSBlbHNlIHsKIAkJaWYgKGF1ZGl0X3BpZCkgewotCQkJc3RydWN0IG5sbXNnaGRyICpubGggPSAoc3RydWN0IG5sbXNnaGRyICopYWItPnNrYi0+ZGF0YTsKKwkJCXN0cnVjdCBubG1zZ2hkciAqbmxoID0gbmxtc2dfaGRyKGFiLT5za2IpOwogCQkJbmxoLT5ubG1zZ19sZW4gPSBhYi0+c2tiLT5sZW4gLSBOTE1TR19TUEFDRSgwKTsKIAkJCXNrYl9xdWV1ZV90YWlsKCZhdWRpdF9za2JfcXVldWUsIGFiLT5za2IpOwogCQkJYWItPnNrYiA9IE5VTEw7CmRpZmYgLS1naXQgYS9rZXJuZWwvaHJ0aW1lci5jIGIva2VybmVsL2hydGltZXIuYwppbmRleCBiNzQ4NjBhLi4xYjMwMzMxIDEwMDY0NAotLS0gYS9rZXJuZWwvaHJ0aW1lci5jCisrKyBiL2tlcm5lbC9ocnRpbWVyLmMKQEAgLTU5LDYgKzU5LDcgQEAKIAogCXJldHVybiB0aW1lc3BlY190b19rdGltZShub3cpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoa3RpbWVfZ2V0KTsKIAogLyoqCiAgKiBrdGltZV9nZXRfcmVhbCAtIGdldCB0aGUgcmVhbCAod2FsbC0pIHRpbWUgaW4ga3RpbWVfdCBmb3JtYXQKQEAgLTI3OCw2ICsyNzksOCBAQAogCiAJcmV0dXJuIGt0aW1lX2FkZChrdCwgdG1wKTsKIH0KKworRVhQT1JUX1NZTUJPTF9HUEwoa3RpbWVfYWRkX25zKTsKICMgZW5kaWYgLyogIUNPTkZJR19LVElNRV9TQ0FMQVIgKi8KIAogLyoKZGlmZiAtLWdpdCBhL2tlcm5lbC9rYWxsc3ltcy5jIGIva2VybmVsL2thbGxzeW1zLmMKaW5kZXggNmYyOTRmZi4uNWEwZGU4NCAxMDA2NDQKLS0tIGEva2VybmVsL2thbGxzeW1zLmMKKysrIGIva2VybmVsL2thbGxzeW1zLmMKQEAgLTI2NywyNyArMjY3LDMzIEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLS8qIFJlcGxhY2UgIiVzIiBpbiBmb3JtYXQgd2l0aCBhZGRyZXNzLCBvciByZXR1cm5zIC1lcnJuby4gKi8KLXZvaWQgX19wcmludF9zeW1ib2woY29uc3QgY2hhciAqZm10LCB1bnNpZ25lZCBsb25nIGFkZHJlc3MpCisvKiBMb29rIHVwIGEga2VybmVsIHN5bWJvbCBhbmQgcmV0dXJuIGl0IGluIGEgdGV4dCBidWZmZXIuICovCitpbnQgc3ByaW50X3N5bWJvbChjaGFyICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKIHsKIAljaGFyICptb2RuYW1lOwogCWNvbnN0IGNoYXIgKm5hbWU7CiAJdW5zaWduZWQgbG9uZyBvZmZzZXQsIHNpemU7CiAJY2hhciBuYW1lYnVmW0tTWU1fTkFNRV9MRU4rMV07Ci0JY2hhciBidWZmZXJbc2l6ZW9mKCIlcyslI2x4LyUjbHggWyVzXSIpICsgS1NZTV9OQU1FX0xFTiArCi0JCSAgICAyKihCSVRTX1BFUl9MT05HKjMvMTApICsgTU9EVUxFX05BTUVfTEVOICsgMV07CiAKIAluYW1lID0ga2FsbHN5bXNfbG9va3VwKGFkZHJlc3MsICZzaXplLCAmb2Zmc2V0LCAmbW9kbmFtZSwgbmFtZWJ1Zik7Ci0KIAlpZiAoIW5hbWUpCi0JCXNwcmludGYoYnVmZmVyLCAiMHglbHgiLCBhZGRyZXNzKTsKKwkJcmV0dXJuIHNwcmludGYoYnVmZmVyLCAiMHglbHgiLCBhZGRyZXNzKTsKIAllbHNlIHsKIAkJaWYgKG1vZG5hbWUpCi0JCQlzcHJpbnRmKGJ1ZmZlciwgIiVzKyUjbHgvJSNseCBbJXNdIiwgbmFtZSwgb2Zmc2V0LAorCQkJcmV0dXJuIHNwcmludGYoYnVmZmVyLCAiJXMrJSNseC8lI2x4IFslc10iLCBuYW1lLCBvZmZzZXQsCiAJCQkJc2l6ZSwgbW9kbmFtZSk7CiAJCWVsc2UKLQkJCXNwcmludGYoYnVmZmVyLCAiJXMrJSNseC8lI2x4IiwgbmFtZSwgb2Zmc2V0LCBzaXplKTsKKwkJCXJldHVybiBzcHJpbnRmKGJ1ZmZlciwgIiVzKyUjbHgvJSNseCIsIG5hbWUsIG9mZnNldCwgc2l6ZSk7CiAJfQorfQorCisvKiBMb29rIHVwIGEga2VybmVsIHN5bWJvbCBhbmQgcHJpbnQgaXQgdG8gdGhlIGtlcm5lbCBtZXNzYWdlcy4gKi8KK3ZvaWQgX19wcmludF9zeW1ib2woY29uc3QgY2hhciAqZm10LCB1bnNpZ25lZCBsb25nIGFkZHJlc3MpCit7CisJY2hhciBidWZmZXJbS1NZTV9TWU1CT0xfTEVOXTsKKworCXNwcmludF9zeW1ib2woYnVmZmVyLCBhZGRyZXNzKTsKKwogCXByaW50ayhmbXQsIGJ1ZmZlcik7CiB9CiAKQEAgLTQ1MiwzICs0NTgsNCBAQAogX19pbml0Y2FsbChrYWxsc3ltc19pbml0KTsKIAogRVhQT1JUX1NZTUJPTChfX3ByaW50X3N5bWJvbCk7CitFWFBPUlRfU1lNQk9MX0dQTChzcHJpbnRfc3ltYm9sKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9tb2R1bGUuYyBiL2tlcm5lbC9tb2R1bGUuYwppbmRleCBkY2RiMzJiLi45ZGE1YWY2IDEwMDY0NAotLS0gYS9rZXJuZWwvbW9kdWxlLmMKKysrIGIva2VybmVsL21vZHVsZS5jCkBAIC0xMTQ4LDggKzExNDgsMTAgQEAKIAkJZ290byBvdXQ7CiAKIAltb2QtPmhvbGRlcnNfZGlyID0ga29iamVjdF9hZGRfZGlyKCZtb2QtPm1rb2JqLmtvYmosICJob2xkZXJzIik7Ci0JaWYgKCFtb2QtPmhvbGRlcnNfZGlyKQorCWlmICghbW9kLT5ob2xkZXJzX2RpcikgeworCQllcnIgPSAtRU5PTUVNOwogCQlnb3RvIG91dF91bnJlZzsKKwl9CiAKIAllcnIgPSBtb2R1bGVfcGFyYW1fc3lzZnNfc2V0dXAobW9kLCBrcGFyYW0sIG51bV9wYXJhbXMpOwogCWlmIChlcnIpCmRpZmYgLS1naXQgYS9rZXJuZWwvcG93ZXIvZGlzay5jIGIva2VybmVsL3Bvd2VyL2Rpc2suYwppbmRleCBhZWMxOWIwLi4wMmU0ZmI2OSAxMDA2NDQKLS0tIGEva2VybmVsL3Bvd2VyL2Rpc2suYworKysgYi9rZXJuZWwvcG93ZXIvZGlzay5jCkBAIC0zOSw3ICszOSwxMyBAQAogewogCWludCBlcnJvciA9IDA7CiAKLQlpZiAocG1fZGlza19tb2RlID09IFBNX0RJU0tfUExBVEZPUk0pIHsKKwlzd2l0Y2ggKHBtX2Rpc2tfbW9kZSkgeworCWNhc2UgUE1fRElTS19URVNUOgorCWNhc2UgUE1fRElTS19URVNUUFJPQzoKKwljYXNlIFBNX0RJU0tfU0hVVERPV046CisJY2FzZSBQTV9ESVNLX1JFQk9PVDoKKwkJYnJlYWs7CisJZGVmYXVsdDoKIAkJaWYgKHBtX29wcyAmJiBwbV9vcHMtPnByZXBhcmUpCiAJCQllcnJvciA9IHBtX29wcy0+cHJlcGFyZShQTV9TVVNQRU5EX0RJU0spOwogCX0KQEAgLTQ4LDQwICs1NCw0OCBAQAogCiAvKioKICAqCXBvd2VyX2Rvd24gLSBTaHV0IG1hY2hpbmUgZG93biBmb3IgaGliZXJuYXRlLgotICoJQG1vZGU6CQlTdXNwZW5kLXRvLWRpc2sgbW9kZQogICoKLSAqCVVzZSB0aGUgcGxhdGZvcm0gZHJpdmVyLCBpZiBjb25maWd1cmVkIHNvLCBhbmQgcmV0dXJuIGdyYWNlZnVsbHkgaWYgaXQKLSAqCWZhaWxzLgotICoJT3RoZXJ3aXNlLCB0cnkgdG8gcG93ZXIgb2ZmIGFuZCByZWJvb3QuIElmIHRoZXkgZmFpbCwgaGFsdCB0aGUgbWFjaGluZSwKLSAqCXRoZXJlIGFpbid0IG5vIHR1cm5pbmcgYmFjay4KKyAqCVVzZSB0aGUgcGxhdGZvcm0gZHJpdmVyLCBpZiBjb25maWd1cmVkIHNvOyBvdGhlcndpc2UgdHJ5CisgKgl0byBwb3dlciBvZmYgb3IgcmVib290LgogICovCiAKLXN0YXRpYyB2b2lkIHBvd2VyX2Rvd24oc3VzcGVuZF9kaXNrX21ldGhvZF90IG1vZGUpCitzdGF0aWMgdm9pZCBwb3dlcl9kb3duKHZvaWQpCiB7Ci0Jc3dpdGNoKG1vZGUpIHsKLQljYXNlIFBNX0RJU0tfUExBVEZPUk06Ci0JCWlmIChwbV9vcHMgJiYgcG1fb3BzLT5lbnRlcikgewotCQkJa2VybmVsX3NodXRkb3duX3ByZXBhcmUoU1lTVEVNX1NVU1BFTkRfRElTSyk7Ci0JCQlwbV9vcHMtPmVudGVyKFBNX1NVU1BFTkRfRElTSyk7Ci0JCQlicmVhazsKLQkJfQorCXN3aXRjaCAocG1fZGlza19tb2RlKSB7CisJY2FzZSBQTV9ESVNLX1RFU1Q6CisJY2FzZSBQTV9ESVNLX1RFU1RQUk9DOgorCQlicmVhazsKIAljYXNlIFBNX0RJU0tfU0hVVERPV046CiAJCWtlcm5lbF9wb3dlcl9vZmYoKTsKIAkJYnJlYWs7CiAJY2FzZSBQTV9ESVNLX1JFQk9PVDoKIAkJa2VybmVsX3Jlc3RhcnQoTlVMTCk7CiAJCWJyZWFrOworCWRlZmF1bHQ6CisJCWlmIChwbV9vcHMgJiYgcG1fb3BzLT5lbnRlcikgeworCQkJa2VybmVsX3NodXRkb3duX3ByZXBhcmUoU1lTVEVNX1NVU1BFTkRfRElTSyk7CisJCQlwbV9vcHMtPmVudGVyKFBNX1NVU1BFTkRfRElTSyk7CisJCQlicmVhazsKKwkJfQogCX0KIAlrZXJuZWxfaGFsdCgpOwotCS8qIFZhbGlkIGltYWdlIGlzIG9uIHRoZSBkaXNrLCBpZiB3ZSBjb250aW51ZSB3ZSByaXNrIHNlcmlvdXMgZGF0YSBjb3JydXB0aW9uCi0JICAgYWZ0ZXIgcmVzdW1lLiAqLworCS8qCisJICogVmFsaWQgaW1hZ2UgaXMgb24gdGhlIGRpc2ssIGlmIHdlIGNvbnRpbnVlIHdlIHJpc2sgc2VyaW91cyBkYXRhCisJICogY29ycnVwdGlvbiBhZnRlciByZXN1bWUuCisJICovCiAJcHJpbnRrKEtFUk5fQ1JJVCAiUGxlYXNlIHBvd2VyIG1lIGRvd24gbWFudWFsbHlcbiIpOwogCXdoaWxlKDEpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgcGxhdGZvcm1fZmluaXNoKHZvaWQpCiB7Ci0JaWYgKHBtX2Rpc2tfbW9kZSA9PSBQTV9ESVNLX1BMQVRGT1JNKSB7CisJc3dpdGNoIChwbV9kaXNrX21vZGUpIHsKKwljYXNlIFBNX0RJU0tfVEVTVDoKKwljYXNlIFBNX0RJU0tfVEVTVFBST0M6CisJY2FzZSBQTV9ESVNLX1NIVVRET1dOOgorCWNhc2UgUE1fRElTS19SRUJPT1Q6CisJCWJyZWFrOworCWRlZmF1bHQ6CiAJCWlmIChwbV9vcHMgJiYgcG1fb3BzLT5maW5pc2gpCiAJCQlwbV9vcHMtPmZpbmlzaChQTV9TVVNQRU5EX0RJU0spOwogCX0KQEAgLTEwOCw4ICsxMjIsNiBAQAogLyoqCiAgKglwbV9zdXNwZW5kX2Rpc2sgLSBUaGUgZ3JhbnBhcHB5IG9mIGhpYmVybmF0aW9uIHBvd2VyIG1hbmFnZW1lbnQuCiAgKgotICoJSWYgd2UncmUgZ29pbmcgdGhyb3VnaCB0aGUgZmlybXdhcmUsIHRoZW4gZ2V0IGl0IG92ZXIgd2l0aCBxdWlja2x5LgotICoKICAqCUlmIG5vdCwgdGhlbiBjYWxsIHN3c3VzcCB0byBkbyBpdHMgdGhpbmcsIHRoZW4gZmlndXJlIG91dCBob3cKICAqCXRvIHBvd2VyIGRvd24gdGhlIHN5c3RlbS4KICAqLwpAQCAtMTY2LDcgKzE3OCw3IEBACiAJCXByX2RlYnVnKCJQTTogd3JpdGluZyBpbWFnZS5cbiIpOwogCQllcnJvciA9IHN3c3VzcF93cml0ZSgpOwogCQlpZiAoIWVycm9yKQotCQkJcG93ZXJfZG93bihwbV9kaXNrX21vZGUpOworCQkJcG93ZXJfZG93bigpOwogCQllbHNlIHsKIAkJCXN3c3VzcF9mcmVlKCk7CiAJCQlnb3RvIFRoYXc7CkBAIC0yNzgsNyArMjkwLDYgQEAKIAogCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHBtX2Rpc2tfbW9kZXNbXSA9IHsKLQlbUE1fRElTS19GSVJNV0FSRV0JPSAiZmlybXdhcmUiLAogCVtQTV9ESVNLX1BMQVRGT1JNXQk9ICJwbGF0Zm9ybSIsCiAJW1BNX0RJU0tfU0hVVERPV05dCT0gInNodXRkb3duIiwKIAlbUE1fRElTS19SRUJPT1RdCT0gInJlYm9vdCIsCkBAIC0yODksMjcgKzMwMCwyNSBAQAogLyoqCiAgKglkaXNrIC0gQ29udHJvbCBzdXNwZW5kLXRvLWRpc2sgbW9kZQogICoKLSAqCVN1c3BlbmQtdG8tZGlzayBjYW4gYmUgaGFuZGxlZCBpbiBzZXZlcmFsIHdheXMuIFRoZSBncmVhdGVzdAotICoJZGlzdGluY3Rpb24gaXMgd2hvIHdyaXRlcyBtZW1vcnkgdG8gZGlzayAtIHRoZSBmaXJtd2FyZSBvciB0aGUgT1MuCi0gKglJZiB0aGUgZmlybXdhcmUgZG9lcyBpdCwgd2UgYXNzdW1lIHRoYXQgaXQgYWxzbyBoYW5kbGVzIHN1c3BlbmRpbmcKLSAqCXRoZSBzeXN0ZW0uCi0gKglJZiB0aGUgT1MgZG9lcyBpdCwgdGhlbiB3ZSBoYXZlIHRocmVlIG9wdGlvbnMgZm9yIHB1dHRpbmcgdGhlIHN5c3RlbQotICoJdG8gc2xlZXAgLSB1c2luZyB0aGUgcGxhdGZvcm0gZHJpdmVyIChlLmcuIEFDUEkgb3Igb3RoZXIgUE0gcmVnaXN0ZXJzKSwKLSAqCXBvd2VyaW5nIG9mZiB0aGUgc3lzdGVtIG9yIHJlYm9vdGluZyB0aGUgc3lzdGVtIChmb3IgdGVzdGluZykuCisgKglTdXNwZW5kLXRvLWRpc2sgY2FuIGJlIGhhbmRsZWQgaW4gc2V2ZXJhbCB3YXlzLiBXZSBoYXZlIGEgZmV3IG9wdGlvbnMKKyAqCWZvciBwdXR0aW5nIHRoZSBzeXN0ZW0gdG8gc2xlZXAgLSB1c2luZyB0aGUgcGxhdGZvcm0gZHJpdmVyIChlLmcuIEFDUEkKKyAqCW9yIG90aGVyIHBtX29wcyksIHBvd2VyaW5nIG9mZiB0aGUgc3lzdGVtIG9yIHJlYm9vdGluZyB0aGUgc3lzdGVtCisgKgkoZm9yIHRlc3RpbmcpIGFzIHdlbGwgYXMgdGhlIHR3byB0ZXN0IG1vZGVzLgogICoKLSAqCVRoZSBzeXN0ZW0gd2lsbCBzdXBwb3J0IGVpdGhlciAnZmlybXdhcmUnIG9yICdwbGF0Zm9ybScsIGFuZCB0aGF0IGlzCi0gKglrbm93biBhIHByaW9yaSAoYW5kIGVuY29kZWQgaW4gcG1fb3BzKS4gQnV0LCB0aGUgdXNlciBtYXkgY2hvb3NlCi0gKgknc2h1dGRvd24nIG9yICdyZWJvb3QnIGFzIGFsdGVybmF0aXZlcy4KKyAqCVRoZSBzeXN0ZW0gY2FuIHN1cHBvcnQgJ3BsYXRmb3JtJywgYW5kIHRoYXQgaXMga25vd24gYSBwcmlvcmkgKGFuZAorICoJZW5jb2RlZCBpbiBwbV9vcHMpLiBIb3dldmVyLCB0aGUgdXNlciBtYXkgY2hvb3NlICdzaHV0ZG93bicgb3IgJ3JlYm9vdCcKKyAqCWFzIGFsdGVybmF0aXZlcywgYXMgd2VsbCBhcyB0aGUgdGVzdCBtb2RlcyAndGVzdCcgYW5kICd0ZXN0cHJvYycuCiAgKgogICoJc2hvdygpIHdpbGwgZGlzcGxheSB3aGF0IHRoZSBtb2RlIGlzIGN1cnJlbnRseSBzZXQgdG8uCiAgKglzdG9yZSgpIHdpbGwgYWNjZXB0IG9uZSBvZgogICoKLSAqCSdmaXJtd2FyZScKICAqCSdwbGF0Zm9ybScKICAqCSdzaHV0ZG93bicKICAqCSdyZWJvb3QnCisgKgkndGVzdCcKKyAqCSd0ZXN0cHJvYycKICAqCi0gKglJdCB3aWxsIG9ubHkgY2hhbmdlIHRvICdmaXJtd2FyZScgb3IgJ3BsYXRmb3JtJyBpZiB0aGUgc3lzdGVtCisgKglJdCB3aWxsIG9ubHkgY2hhbmdlIHRvICdwbGF0Zm9ybScgaWYgdGhlIHN5c3RlbQogICoJc3VwcG9ydHMgaXQgKGFzIGRldGVybWluZWQgZnJvbSBwbV9vcHMtPnBtX2Rpc2tfbW9kZSkuCiAgKi8KIApAQCAtMzMxLDE3ICszNDAsMjEgQEAKIAlsZW4gPSBwID8gcCAtIGJ1ZiA6IG47CiAKIAltdXRleF9sb2NrKCZwbV9tdXRleCk7Ci0JZm9yIChpID0gUE1fRElTS19GSVJNV0FSRTsgaSA8IFBNX0RJU0tfTUFYOyBpKyspIHsKKwlmb3IgKGkgPSBQTV9ESVNLX1BMQVRGT1JNOyBpIDwgUE1fRElTS19NQVg7IGkrKykgewogCQlpZiAoIXN0cm5jbXAoYnVmLCBwbV9kaXNrX21vZGVzW2ldLCBsZW4pKSB7CiAJCQltb2RlID0gaTsKIAkJCWJyZWFrOwogCQl9CiAJfQogCWlmIChtb2RlKSB7Ci0JCWlmIChtb2RlID09IFBNX0RJU0tfU0hVVERPV04gfHwgbW9kZSA9PSBQTV9ESVNLX1JFQk9PVCB8fAotCQkgICAgIG1vZGUgPT0gUE1fRElTS19URVNUIHx8IG1vZGUgPT0gUE1fRElTS19URVNUUFJPQykgeworCQlzd2l0Y2ggKG1vZGUpIHsKKwkJY2FzZSBQTV9ESVNLX1NIVVRET1dOOgorCQljYXNlIFBNX0RJU0tfUkVCT09UOgorCQljYXNlIFBNX0RJU0tfVEVTVDoKKwkJY2FzZSBQTV9ESVNLX1RFU1RQUk9DOgogCQkJcG1fZGlza19tb2RlID0gbW9kZTsKLQkJfSBlbHNlIHsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgogCQkJaWYgKHBtX29wcyAmJiBwbV9vcHMtPmVudGVyICYmCiAJCQkgICAgKG1vZGUgPT0gcG1fb3BzLT5wbV9kaXNrX21vZGUpKQogCQkJCXBtX2Rpc2tfbW9kZSA9IG1vZGU7CmRpZmYgLS1naXQgYS9rZXJuZWwvcG93ZXIvbWFpbi5jIGIva2VybmVsL3Bvd2VyL21haW4uYwppbmRleCBhMDY0ZGZkLi43MjQxOWEzIDEwMDY0NAotLS0gYS9rZXJuZWwvcG93ZXIvbWFpbi5jCisrKyBiL2tlcm5lbC9wb3dlci9tYWluLmMKQEAgLTMwLDcgKzMwLDcgQEAKIERFRklORV9NVVRFWChwbV9tdXRleCk7CiAKIHN0cnVjdCBwbV9vcHMgKnBtX29wczsKLXN1c3BlbmRfZGlza19tZXRob2RfdCBwbV9kaXNrX21vZGUgPSBQTV9ESVNLX1BMQVRGT1JNOworc3VzcGVuZF9kaXNrX21ldGhvZF90IHBtX2Rpc2tfbW9kZSA9IFBNX0RJU0tfU0hVVERPV047CiAKIC8qKgogICoJcG1fc2V0X29wcyAtIFNldCB0aGUgZ2xvYmFsIHBvd2VyIG1ldGhvZCB0YWJsZS4gCkBAIC00MSw5ICs0MSwyNiBAQAogewogCW11dGV4X2xvY2soJnBtX211dGV4KTsKIAlwbV9vcHMgPSBvcHM7CisJaWYgKG9wcyAmJiBvcHMtPnBtX2Rpc2tfbW9kZSAhPSBQTV9ESVNLX0lOVkFMSUQpIHsKKwkJcG1fZGlza19tb2RlID0gb3BzLT5wbV9kaXNrX21vZGU7CisJfSBlbHNlCisJCXBtX2Rpc2tfbW9kZSA9IFBNX0RJU0tfU0hVVERPV047CiAJbXV0ZXhfdW5sb2NrKCZwbV9tdXRleCk7CiB9CiAKKy8qKgorICogcG1fdmFsaWRfb25seV9tZW0gLSBnZW5lcmljIG1lbW9yeS1vbmx5IHZhbGlkIGNhbGxiYWNrCisgKgorICogcG1fb3BzIGRyaXZlcnMgdGhhdCBpbXBsZW1lbnQgbWVtIHN1c3BlbmQgb25seSBhbmQgb25seSBuZWVkCisgKiB0byBjaGVjayBmb3IgdGhhdCBpbiB0aGVpciAudmFsaWQgY2FsbGJhY2sgY2FuIHVzZSB0aGlzIGluc3RlYWQKKyAqIG9mIHJvbGxpbmcgdGhlaXIgb3duIC52YWxpZCBjYWxsYmFjay4KKyAqLworaW50IHBtX3ZhbGlkX29ubHlfbWVtKHN1c3BlbmRfc3RhdGVfdCBzdGF0ZSkKK3sKKwlyZXR1cm4gc3RhdGUgPT0gUE1fU1VTUEVORF9NRU07Cit9CisKKwogc3RhdGljIGlubGluZSB2b2lkIHBtX2ZpbmlzaChzdXNwZW5kX3N0YXRlX3Qgc3RhdGUpCiB7CiAJaWYgKHBtX29wcy0+ZmluaXNoKQpAQCAtMTExLDEzICsxMjgsMjQgQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKKy8qIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gKi8KK3ZvaWQgX19hdHRyaWJ1dGVfXyAoKHdlYWspKSBhcmNoX3N1c3BlbmRfZGlzYWJsZV9pcnFzKHZvaWQpCit7CisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKK30KKworLyogZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiAqLwordm9pZCBfX2F0dHJpYnV0ZV9fICgod2VhaykpIGFyY2hfc3VzcGVuZF9lbmFibGVfaXJxcyh2b2lkKQoreworCWxvY2FsX2lycV9lbmFibGUoKTsKK30KIAogaW50IHN1c3BlbmRfZW50ZXIoc3VzcGVuZF9zdGF0ZV90IHN0YXRlKQogewogCWludCBlcnJvciA9IDA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlhcmNoX3N1c3BlbmRfZGlzYWJsZV9pcnFzKCk7CisJQlVHX09OKCFpcnFzX2Rpc2FibGVkKCkpOwogCiAJaWYgKChlcnJvciA9IGRldmljZV9wb3dlcl9kb3duKFBNU0dfU1VTUEVORCkpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiU29tZSBkZXZpY2VzIGZhaWxlZCB0byBwb3dlciBkb3duXG4iKTsKQEAgLTEyNiw3ICsxNTQsOCBAQAogCWVycm9yID0gcG1fb3BzLT5lbnRlcihzdGF0ZSk7CiAJZGV2aWNlX3Bvd2VyX3VwKCk7CiAgRG9uZToKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJYXJjaF9zdXNwZW5kX2VuYWJsZV9pcnFzKCk7CisJQlVHX09OKGlycXNfZGlzYWJsZWQoKSk7CiAJcmV0dXJuIGVycm9yOwogfQogCkBAIC0xNjksOCArMTk4LDggQEAKIAogCS8qIGFsbCBvdGhlciBzdGF0ZXMgbmVlZCBsb3dsZXZlbCBzdXBwb3J0IGFuZCBuZWVkIHRvIGJlCiAJICogdmFsaWQgdG8gdGhlIGxvd2xldmVsIGltcGxlbWVudGF0aW9uLCBubyB2YWxpZCBjYWxsYmFjawotCSAqIGltcGxpZXMgdGhhdCBhbGwgYXJlIHZhbGlkLiAqLwotCWlmICghcG1fb3BzIHx8IChwbV9vcHMtPnZhbGlkICYmICFwbV9vcHMtPnZhbGlkKHN0YXRlKSkpCisJICogaW1wbGllcyB0aGF0IG5vbmUgYXJlIHZhbGlkLiAqLworCWlmICghcG1fb3BzIHx8ICFwbV9vcHMtPnZhbGlkIHx8ICFwbV9vcHMtPnZhbGlkKHN0YXRlKSkKIAkJcmV0dXJuIDA7CiAJcmV0dXJuIDE7CiB9CmRpZmYgLS1naXQgYS9rZXJuZWwvcmVzb3VyY2UuYyBiL2tlcm5lbC9yZXNvdXJjZS5jCmluZGV4IGJkYjU1YTMuLjliZDE0ZmQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9yZXNvdXJjZS5jCisrKyBiL2tlcm5lbC9yZXNvdXJjZS5jCkBAIC0yMTMsMjcgKzIxMyw2IEBACiBFWFBPUlRfU1lNQk9MKHJlcXVlc3RfcmVzb3VyY2UpOwogCiAvKioKLSAqIF9fX19yZXF1ZXN0X3Jlc291cmNlIC0gcmVzZXJ2ZSBhIHJlc291cmNlLCB3aXRoIHJlc291cmNlIGNvbmZsaWN0IHJldHVybmVkCi0gKiBAcm9vdDogcm9vdCByZXNvdXJjZSBkZXNjcmlwdG9yCi0gKiBAbmV3OiByZXNvdXJjZSBkZXNjcmlwdG9yIGRlc2lyZWQgYnkgY2FsbGVyCi0gKgotICogUmV0dXJuczoKLSAqIE9uIHN1Y2Nlc3MsIE5VTEwgaXMgcmV0dXJuZWQuCi0gKiBPbiBlcnJvciwgYSBwb2ludGVyIHRvIHRoZSBjb25mbGljdGluZyByZXNvdXJjZSBpcyByZXR1cm5lZC4KLSAqLwotc3RydWN0IHJlc291cmNlICpfX19fcmVxdWVzdF9yZXNvdXJjZShzdHJ1Y3QgcmVzb3VyY2UgKnJvb3QsIHN0cnVjdCByZXNvdXJjZSAqbmV3KQotewotCXN0cnVjdCByZXNvdXJjZSAqY29uZmxpY3Q7Ci0KLQl3cml0ZV9sb2NrKCZyZXNvdXJjZV9sb2NrKTsKLQljb25mbGljdCA9IF9fcmVxdWVzdF9yZXNvdXJjZShyb290LCBuZXcpOwotCXdyaXRlX3VubG9jaygmcmVzb3VyY2VfbG9jayk7Ci0JcmV0dXJuIGNvbmZsaWN0OwotfQotCi1FWFBPUlRfU1lNQk9MKF9fX19yZXF1ZXN0X3Jlc291cmNlKTsKLQotLyoqCiAgKiByZWxlYXNlX3Jlc291cmNlIC0gcmVsZWFzZSBhIHByZXZpb3VzbHkgcmVzZXJ2ZWQgcmVzb3VyY2UKICAqIEBvbGQ6IHJlc291cmNlIHBvaW50ZXIKICAqLwpkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkLmMgYi9rZXJuZWwvc2NoZWQuYwppbmRleCBiOWE2ODM3Li45NjBkN2M1IDEwMDY0NAotLS0gYS9rZXJuZWwvc2NoZWQuYworKysgYi9rZXJuZWwvc2NoZWQuYwpAQCAtNDc0Niw3ICs0NzQ2LDcgQEAKIAkJICogY29uc29sZSBtaWdodCB0YWtlIGFsb3Qgb2YgdGltZToKIAkJICovCiAJCXRvdWNoX25taV93YXRjaGRvZygpOwotCQlpZiAocC0+c3RhdGUgJiBzdGF0ZV9maWx0ZXIpCisJCWlmICghc3RhdGVfZmlsdGVyIHx8IChwLT5zdGF0ZSAmIHN0YXRlX2ZpbHRlcikpCiAJCQlzaG93X3Rhc2socCk7CiAJfSB3aGlsZV9lYWNoX3RocmVhZChnLCBwKTsKIApkaWZmIC0tZ2l0IGEva2VybmVsL3Rhc2tzdGF0cy5jIGIva2VybmVsL3Rhc2tzdGF0cy5jCmluZGV4IDRjMzQ3NmYuLmFkN2QyMzkgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90YXNrc3RhdHMuYworKysgYi9rZXJuZWwvdGFza3N0YXRzLmMKQEAgLTEwMiw3ICsxMDIsNyBAQAogICovCiBzdGF0aWMgaW50IHNlbmRfcmVwbHkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgcGlkX3QgcGlkKQogewotCXN0cnVjdCBnZW5sbXNnaGRyICpnZW5saGRyID0gbmxtc2dfZGF0YSgoc3RydWN0IG5sbXNnaGRyICopc2tiLT5kYXRhKTsKKwlzdHJ1Y3QgZ2VubG1zZ2hkciAqZ2VubGhkciA9IG5sbXNnX2RhdGEobmxtc2dfaGRyKHNrYikpOwogCXZvaWQgKnJlcGx5ID0gZ2VubG1zZ19kYXRhKGdlbmxoZHIpOwogCWludCByYzsKIApAQCAtMTIxLDcgKzEyMSw3IEBACiBzdGF0aWMgdm9pZCBzZW5kX2NwdV9saXN0ZW5lcnMoc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCQkJc3RydWN0IGxpc3RlbmVyX2xpc3QgKmxpc3RlbmVycykKIHsKLQlzdHJ1Y3QgZ2VubG1zZ2hkciAqZ2VubGhkciA9IG5sbXNnX2RhdGEoKHN0cnVjdCBubG1zZ2hkciAqKXNrYi0+ZGF0YSk7CisJc3RydWN0IGdlbmxtc2doZHIgKmdlbmxoZHIgPSBubG1zZ19kYXRhKG5sbXNnX2hkcihza2IpKTsKIAlzdHJ1Y3QgbGlzdGVuZXIgKnMsICp0bXA7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYl9uZXh0LCAqc2tiX2N1ciA9IHNrYjsKIAl2b2lkICpyZXBseSA9IGdlbmxtc2dfZGF0YShnZW5saGRyKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lLmMgYi9rZXJuZWwvdGltZS5jCmluZGV4IDJmNDc4ODguLmJhMThlYzQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lLmMKKysrIGIva2VybmVsL3RpbWUuYwpAQCAtNDUyLDYgKzQ1Miw3IEBACiAKIAlyZXR1cm4gdHM7CiB9CitFWFBPUlRfU1lNQk9MKG5zX3RvX3RpbWVzcGVjKTsKIAogLyoqCiAgKiBuc190b190aW1ldmFsIC0gQ29udmVydCBuYW5vc2Vjb25kcyB0byB0aW1ldmFsCkBAIC00NjksNiArNDcwLDcgQEAKIAogCXJldHVybiB0djsKIH0KK0VYUE9SVF9TWU1CT0wobnNfdG9fdGltZXZhbCk7CiAKIC8qCiAgKiBDb252ZXJ0IGppZmZpZXMgdG8gbWlsbGlzZWNvbmRzIGFuZCBiYWNrLgpkaWZmIC0tZ2l0IGEva2VybmVsL3RpbWVyLmMgYi9rZXJuZWwvdGltZXIuYwppbmRleCBkZDZjMmMxLi5iMjJiZDM5IDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZXIuYworKysgYi9rZXJuZWwvdGltZXIuYwpAQCAtNTA1LDYgKzUwNSw4IEBACiAJcmV0dXJuIHJldDsKIH0KIAorRVhQT1JUX1NZTUJPTCh0cnlfdG9fZGVsX3RpbWVyX3N5bmMpOworCiAvKioKICAqIGRlbF90aW1lcl9zeW5jIC0gZGVhY3RpdmF0ZSBhIHRpbWVyIGFuZCB3YWl0IGZvciB0aGUgaGFuZGxlciB0byBmaW5pc2guCiAgKiBAdGltZXI6IHRoZSB0aW1lciB0byBiZSBkZWFjdGl2YXRlZApkaWZmIC0tZ2l0IGEvbGliL0tjb25maWcuZGVidWcgYi9saWIvS2NvbmZpZy5kZWJ1ZwppbmRleCAzZjNlNzQwLi43OWFmZDAwIDEwMDY0NAotLS0gYS9saWIvS2NvbmZpZy5kZWJ1ZworKysgYi9saWIvS2NvbmZpZy5kZWJ1ZwpAQCAtMjYxLDcgKzI2MSw3IEBACiAJYm9vbAogCWRlcGVuZHMgb24gREVCVUdfS0VSTkVMICYmIFRSQUNFX0lSUUZMQUdTX1NVUFBPUlQgJiYgU1RBQ0tUUkFDRV9TVVBQT1JUICYmIExPQ0tERVBfU1VQUE9SVAogCXNlbGVjdCBTVEFDS1RSQUNFCi0Jc2VsZWN0IEZSQU1FX1BPSU5URVIgaWYgIVg4NgorCXNlbGVjdCBGUkFNRV9QT0lOVEVSIGlmICFYODYgJiYgIU1JUFMKIAlzZWxlY3QgS0FMTFNZTVMKIAlzZWxlY3QgS0FMTFNZTVNfQUxMCiAKZGlmZiAtLWdpdCBhL2xpYi9NYWtlZmlsZSBiL2xpYi9NYWtlZmlsZQppbmRleCA5OTJhMzllLi5hZTU3ZjM1IDEwMDY0NAotLS0gYS9saWIvTWFrZWZpbGUKKysrIGIvbGliL01ha2VmaWxlCkBAIC00LDcgKzQsNyBAQAogCiBsaWIteSA6PSBjdHlwZS5vIHN0cmluZy5vIHZzcHJpbnRmLm8gY21kbGluZS5vIFwKIAkgcmJ0cmVlLm8gcmFkaXgtdHJlZS5vIGR1bXBfc3RhY2subyBcCi0JIGlkci5vIGRpdjY0Lm8gaW50X3NxcnQubyBiaXRtYXAubyBleHRhYmxlLm8gcHJpb190cmVlLm8gXAorCSBpZHIubyBpbnRfc3FydC5vIGJpdG1hcC5vIGV4dGFibGUubyBwcmlvX3RyZWUubyBcCiAJIHNoYTEubyBpcnFfcmVncy5vIHJlY2lwcm9jYWxfZGl2Lm8KIAogbGliLSQoQ09ORklHX01NVSkgKz0gaW9yZW1hcC5vCkBAIC0xMiw3ICsxMiw4IEBACiAKIGxpYi15CSs9IGtvYmplY3QubyBrcmVmLm8ga29iamVjdF91ZXZlbnQubyBrbGlzdC5vCiAKLW9iai15ICs9IHNvcnQubyBwYXJzZXIubyBoYWxmbWQ0Lm8gZGVidWdfbG9ja3MubyByYW5kb20zMi5vIGJ1c3Rfc3BpbmxvY2tzLm8KK29iai15ICs9IGRpdjY0Lm8gc29ydC5vIHBhcnNlci5vIGhhbGZtZDQubyBkZWJ1Z19sb2Nrcy5vIHJhbmRvbTMyLm8gXAorCSBidXN0X3NwaW5sb2Nrcy5vCiAKIGlmZXEgKCQoQ09ORklHX0RFQlVHX0tPQkpFQ1QpLHkpCiBDRkxBR1Nfa29iamVjdC5vICs9IC1EREVCVUcKZGlmZiAtLWdpdCBhL2xpYi9kZXZyZXMuYyBiL2xpYi9kZXZyZXMuYwppbmRleCBlYjM4ODQ5Li5iMWQzMzZjIDEwMDY0NAotLS0gYS9saWIvZGV2cmVzLmMKKysrIGIvbGliL2RldnJlcy5jCkBAIC0yOTYsNSArMjk2LDMxIEBACiAJcmV0dXJuIHJjOwogfQogRVhQT1JUX1NZTUJPTChwY2ltX2lvbWFwX3JlZ2lvbnMpOworCisvKioKKyAqIHBjaW1faW91bm1hcF9yZWdpb25zIC0gVW5tYXAgYW5kIHJlbGVhc2UgUENJIEJBUnMKKyAqIEBwZGV2OiBQQ0kgZGV2aWNlIHRvIG1hcCBJTyByZXNvdXJjZXMgZm9yCisgKiBAbWFzazogTWFzayBvZiBCQVJzIHRvIHVubWFwIGFuZCByZWxlYXNlCisgKgorICogVW5hbXAgYW5kIHJlbGVhc2UgcmVnaW9ucyBzcGVjaWZpZWQgYnkgQG1hc2suCisgKi8KK3ZvaWQgcGNpbV9pb3VubWFwX3JlZ2lvbnMoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHUxNiBtYXNrKQoreworCXZvaWQgX19pb21lbSAqIGNvbnN0ICppb21hcDsKKwlpbnQgaTsKKworCWlvbWFwID0gcGNpbV9pb21hcF90YWJsZShwZGV2KTsKKwlpZiAoIWlvbWFwKQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSAwOyBpIDwgREVWSUNFX0NPVU5UX1JFU09VUkNFOyBpKyspIHsKKwkJaWYgKCEobWFzayAmICgxIDw8IGkpKSkKKwkJCWNvbnRpbnVlOworCisJCXBjaW1faW91bm1hcChwZGV2LCBpb21hcFtpXSk7CisJCXBjaV9yZWxlYXNlX3JlZ2lvbihwZGV2LCBpKTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKHBjaW1faW91bm1hcF9yZWdpb25zKTsKICNlbmRpZgogI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvZGl2NjQuYyBiL2xpYi9kaXY2NC5jCmluZGV4IDM2NTcxOWYuLmI3MWNmOTMgMTAwNjQ0Ci0tLSBhL2xpYi9kaXY2NC5jCisrKyBiL2xpYi9kaXY2NC5jCkBAIC0yMyw3ICsyMyw3IEBACiAvKiBOb3QgbmVlZGVkIG9uIDY0Yml0IGFyY2hpdGVjdHVyZXMgKi8KICNpZiBCSVRTX1BFUl9MT05HID09IDMyCiAKLXVpbnQzMl90IF9fZGl2NjRfMzIodWludDY0X3QgKm4sIHVpbnQzMl90IGJhc2UpCit1aW50MzJfdCBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSkgX19kaXY2NF8zMih1aW50NjRfdCAqbiwgdWludDMyX3QgYmFzZSkKIHsKIAl1aW50NjRfdCByZW0gPSAqbjsKIAl1aW50NjRfdCBiID0gYmFzZTsKQEAgLTU4LDQgKzU4LDI0IEBACiAKIEVYUE9SVF9TWU1CT0woX19kaXY2NF8zMik7CiAKKy8qIDY0Yml0IGRpdmlzb3IsIGRpdmlkZW5kIGFuZCByZXN1bHQuIGR5bmFtaWMgcHJlY2lzaW9uICovCit1aW50NjRfdCBkaXY2NF82NCh1aW50NjRfdCBkaXZpZGVuZCwgdWludDY0X3QgZGl2aXNvcikKK3sKKwl1aW50MzJfdCBoaWdoLCBkOworCisJaGlnaCA9IGRpdmlzb3IgPj4gMzI7CisJaWYgKGhpZ2gpIHsKKwkJdW5zaWduZWQgaW50IHNoaWZ0ID0gZmxzKGhpZ2gpOworCisJCWQgPSBkaXZpc29yID4+IHNoaWZ0OworCQlkaXZpZGVuZCA+Pj0gc2hpZnQ7CisJfSBlbHNlCisJCWQgPSBkaXZpc29yOworCisJZG9fZGl2KGRpdmlkZW5kLCBkKTsKKworCXJldHVybiBkaXZpZGVuZDsKK30KK0VYUE9SVF9TWU1CT0woZGl2NjRfNjQpOworCiAjZW5kaWYgLyogQklUU19QRVJfTE9ORyA9PSAzMiAqLwpkaWZmIC0tZ2l0IGEvbGliL2tvYmplY3QuYyBiL2xpYi9rb2JqZWN0LmMKaW5kZXggMDU3OTIxYy4uY2VjZjJmYiAxMDA2NDQKLS0tIGEvbGliL2tvYmplY3QuYworKysgYi9saWIva29iamVjdC5jCkBAIC0xNTcsNyArMTU3LDcgQEAKIH0KIAogLyoqCi0gKglrb2JqZWN0X2FkZCAtIGFkZCBhbiBvYmplY3QgdG8gdGhlIGhpZXJhcmNoeS4KKyAqCWtvYmplY3Rfc2hhZG93X2FkZCAtIGFkZCBhbiBvYmplY3QgdG8gdGhlIGhpZXJhcmNoeS4KICAqCUBrb2JqOglvYmplY3QuCiAgKglAc2hhZG93X3BhcmVudDogc3lzZnMgZGlyZWN0b3J5IHRvIGFkZCB0by4KICAqLwpAQCAtMTc0LDYgKzE3NCw3IEBACiAJaWYgKCEqa29iai0+a19uYW1lKSB7CiAJCXByX2RlYnVnKCJrb2JqZWN0IGF0dGVtcHRlZCB0byBiZSByZWdpc3RlcmVkIHdpdGggbm8gbmFtZSFcbiIpOwogCQlXQVJOX09OKDEpOworCQlrb2JqZWN0X3B1dChrb2JqKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCXBhcmVudCA9IGtvYmplY3RfZ2V0KGtvYmotPnBhcmVudCk7CkBAIC0xOTAsOCArMTkxLDggQEAKIAogCQlsaXN0X2FkZF90YWlsKCZrb2JqLT5lbnRyeSwma29iai0+a3NldC0+bGlzdCk7CiAJCXNwaW5fdW5sb2NrKCZrb2JqLT5rc2V0LT5saXN0X2xvY2spOworCQlrb2JqLT5wYXJlbnQgPSBwYXJlbnQ7CiAJfQotCWtvYmotPnBhcmVudCA9IHBhcmVudDsKIAogCWVycm9yID0gY3JlYXRlX2Rpcihrb2JqLCBzaGFkb3dfcGFyZW50KTsKIAlpZiAoZXJyb3IpIHsKQEAgLTMxMSwxMyArMzEyLDQzIEBACiBpbnQga29iamVjdF9yZW5hbWUoc3RydWN0IGtvYmplY3QgKiBrb2JqLCBjb25zdCBjaGFyICpuZXdfbmFtZSkKIHsKIAlpbnQgZXJyb3IgPSAwOworCWNvbnN0IGNoYXIgKmRldnBhdGggPSBOVUxMOworCWNoYXIgKmRldnBhdGhfc3RyaW5nID0gTlVMTDsKKwljaGFyICplbnZwWzJdOwogCiAJa29iaiA9IGtvYmplY3RfZ2V0KGtvYmopOwogCWlmICgha29iaikKIAkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKCFrb2JqLT5wYXJlbnQpCiAJCXJldHVybiAtRUlOVkFMOworCisJZGV2cGF0aCA9IGtvYmplY3RfZ2V0X3BhdGgoa29iaiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXZwYXRoKSB7CisJCWVycm9yID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCWRldnBhdGhfc3RyaW5nID0ga21hbGxvYyhzdHJsZW4oZGV2cGF0aCkgKyAxNSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXZwYXRoX3N0cmluZykgeworCQllcnJvciA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKwlzcHJpbnRmKGRldnBhdGhfc3RyaW5nLCAiREVWUEFUSF9PTEQ9JXMiLCBkZXZwYXRoKTsKKwllbnZwWzBdID0gZGV2cGF0aF9zdHJpbmc7CisJZW52cFsxXSA9IE5VTEw7CisJLyogTm90ZSA6IGlmIHdlIHdhbnQgdG8gc2VuZCB0aGUgbmV3IG5hbWUgYWxvbmUsIG5vdCB0aGUgZnVsbCBwYXRoLAorCSAqIHdlIGNvdWxkIHByb2JhYmx5IHVzZSBrb2JqZWN0X25hbWUoa29iaik7ICovCisKIAllcnJvciA9IHN5c2ZzX3JlbmFtZV9kaXIoa29iaiwga29iai0+cGFyZW50LT5kZW50cnksIG5ld19uYW1lKTsKKworCS8qIFRoaXMgZnVuY3Rpb24gaXMgbW9zdGx5L29ubHkgdXNlZCBmb3IgbmV0d29yayBpbnRlcmZhY2UuCisJICogU29tZSBob3RwbHVnIHBhY2thZ2UgdHJhY2sgaW50ZXJmYWNlcyBieSB0aGVpciBuYW1lIGFuZAorCSAqIHRoZXJlZm9yZSB3YW50IHRvIGtub3cgd2hlbiB0aGUgbmFtZSBpcyBjaGFuZ2VkIGJ5IHRoZSB1c2VyLiAqLworCWlmICghZXJyb3IpCisJCWtvYmplY3RfdWV2ZW50X2Vudihrb2JqLCBLT0JKX01PVkUsIGVudnApOworCitvdXQ6CisJa2ZyZWUoZGV2cGF0aF9zdHJpbmcpOworCWtmcmVlKGRldnBhdGgpOwogCWtvYmplY3RfcHV0KGtvYmopOwogCiAJcmV0dXJuIGVycm9yOwpAQCAtNDg4LDEzICs1MTksMTUgQEAKIH07CiAKIC8qKgotICoJa29iamVjdF9hZGRfZGlyIC0gYWRkIHN1YiBkaXJlY3Rvcnkgb2Ygb2JqZWN0LgorICoJa29iamVjdF9rc2V0X2FkZF9kaXIgLSBhZGQgc3ViIGRpcmVjdG9yeSBvZiBvYmplY3QuCisgKglAa3NldDoJCWtzZXQgdGhlIGRpcmVjdG9yeSBpcyBiZWxvbmdzIHRvLgogICoJQHBhcmVudDoJb2JqZWN0IGluIHdoaWNoIGEgZGlyZWN0b3J5IGlzIGNyZWF0ZWQuCiAgKglAbmFtZToJZGlyZWN0b3J5IG5hbWUuCiAgKgogICoJQWRkIGEgcGxhaW4gZGlyZWN0b3J5IG9iamVjdCBhcyBjaGlsZCBvZiBnaXZlbiBvYmplY3QuCiAgKi8KLXN0cnVjdCBrb2JqZWN0ICprb2JqZWN0X2FkZF9kaXIoc3RydWN0IGtvYmplY3QgKnBhcmVudCwgY29uc3QgY2hhciAqbmFtZSkKK3N0cnVjdCBrb2JqZWN0ICprb2JqZWN0X2tzZXRfYWRkX2RpcihzdHJ1Y3Qga3NldCAqa3NldCwKKwkJCQkgICAgIHN0cnVjdCBrb2JqZWN0ICpwYXJlbnQsIGNvbnN0IGNoYXIgKm5hbWUpCiB7CiAJc3RydWN0IGtvYmplY3QgKms7CiAJaW50IHJldDsKQEAgLTUwNiwxMyArNTM5LDE0IEBACiAJaWYgKCFrKQogCQlyZXR1cm4gTlVMTDsKIAorCWstPmtzZXQgPSBrc2V0OwogCWstPnBhcmVudCA9IHBhcmVudDsKIAlrLT5rdHlwZSA9ICZkaXJfa3R5cGU7CiAJa29iamVjdF9zZXRfbmFtZShrLCBuYW1lKTsKIAlyZXQgPSBrb2JqZWN0X3JlZ2lzdGVyKGspOwogCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgImtvYmplY3RfYWRkX2RpcjogIgotCQkJImtvYmplY3RfcmVnaXN0ZXIgZXJyb3I6ICVkXG4iLCByZXQpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczoga29iamVjdF9yZWdpc3RlciBlcnJvcjogJWRcbiIsCisJCQlfX2Z1bmNfXywgcmV0KTsKIAkJa29iamVjdF9kZWwoayk7CiAJCXJldHVybiBOVUxMOwogCX0KQEAgLTUyMSw2ICs1NTUsMTggQEAKIH0KIAogLyoqCisgKglrb2JqZWN0X2FkZF9kaXIgLSBhZGQgc3ViIGRpcmVjdG9yeSBvZiBvYmplY3QuCisgKglAcGFyZW50OglvYmplY3QgaW4gd2hpY2ggYSBkaXJlY3RvcnkgaXMgY3JlYXRlZC4KKyAqCUBuYW1lOglkaXJlY3RvcnkgbmFtZS4KKyAqCisgKglBZGQgYSBwbGFpbiBkaXJlY3Rvcnkgb2JqZWN0IGFzIGNoaWxkIG9mIGdpdmVuIG9iamVjdC4KKyAqLworc3RydWN0IGtvYmplY3QgKmtvYmplY3RfYWRkX2RpcihzdHJ1Y3Qga29iamVjdCAqcGFyZW50LCBjb25zdCBjaGFyICpuYW1lKQoreworCXJldHVybiBrb2JqZWN0X2tzZXRfYWRkX2RpcihOVUxMLCBwYXJlbnQsIG5hbWUpOworfQorCisvKioKICAqCWtzZXRfaW5pdCAtIGluaXRpYWxpemUgYSBrc2V0IGZvciB1c2UKICAqCUBrOglrc2V0IAogICovCkBAIC02MTMsNyArNjU5LDYgQEAKIAogdm9pZCBzdWJzeXN0ZW1faW5pdChzdHJ1Y3Qgc3Vic3lzdGVtICogcykKIHsKLQlpbml0X3J3c2VtKCZzLT5yd3NlbSk7CiAJa3NldF9pbml0KCZzLT5rc2V0KTsKIH0KIApAQCAtNjIyLDggKzY2Nyw3IEBACiAgKglAczoJdGhlIHN1YnN5c3RlbSB3ZSdyZSByZWdpc3RlcmluZy4KICAqCiAgKglPbmNlIHdlIHJlZ2lzdGVyIHRoZSBzdWJzeXN0ZW0sIHdlIHdhbnQgdG8gbWFrZSBzdXJlIHRoYXQgCi0gKgl0aGUga3NldCBwb2ludHMgYmFjayB0byB0aGlzIHN1YnN5c3RlbSBmb3IgY29ycmVjdCB1c2FnZSBvZiAKLSAqCXRoZSByd3NlbS4gCisgKgl0aGUga3NldCBwb2ludHMgYmFjayB0byB0aGlzIHN1YnN5c3RlbS4KICAqLwogCiBpbnQgc3Vic3lzdGVtX3JlZ2lzdGVyKHN0cnVjdCBzdWJzeXN0ZW0gKiBzKQpkaWZmIC0tZ2l0IGEvbGliL2tvYmplY3RfdWV2ZW50LmMgYi9saWIva29iamVjdF91ZXZlbnQuYwppbmRleCA4NDI3MmVkLi4xMmUzMTFkIDEwMDY0NAotLS0gYS9saWIva29iamVjdF91ZXZlbnQuYworKysgYi9saWIva29iamVjdF91ZXZlbnQuYwpAQCAtNDIsMTAgKzQyLDYgQEAKIAkJcmV0dXJuICJyZW1vdmUiOwogCWNhc2UgS09CSl9DSEFOR0U6CiAJCXJldHVybiAiY2hhbmdlIjsKLQljYXNlIEtPQkpfTU9VTlQ6Ci0JCXJldHVybiAibW91bnQiOwotCWNhc2UgS09CSl9VTU9VTlQ6Ci0JCXJldHVybiAidW1vdW50IjsKIAljYXNlIEtPQkpfT0ZGTElORToKIAkJcmV0dXJuICJvZmZsaW5lIjsKIAljYXNlIEtPQkpfT05MSU5FOgpAQCAtOTUsMTAgKzkxLDggQEAKIAogCS8qIHNlYXJjaCB0aGUga3NldCB3ZSBiZWxvbmcgdG8gKi8KIAl0b3Bfa29iaiA9IGtvYmo7Ci0JaWYgKCF0b3Bfa29iai0+a3NldCAmJiB0b3Bfa29iai0+cGFyZW50KSB7Ci0JCWRvIHsKLQkJCXRvcF9rb2JqID0gdG9wX2tvYmotPnBhcmVudDsKLQkJfSB3aGlsZSAoIXRvcF9rb2JqLT5rc2V0ICYmIHRvcF9rb2JqLT5wYXJlbnQpOworCXdoaWxlICghdG9wX2tvYmotPmtzZXQgJiYgdG9wX2tvYmotPnBhcmVudCkgeworCQl0b3Bfa29iaiA9IHRvcF9rb2JqLT5wYXJlbnQ7CiAJfQogCWlmICghdG9wX2tvYmotPmtzZXQpIHsKIAkJcHJfZGVidWcoImtvYmplY3QgYXR0ZW1wdGVkIHRvIHNlbmQgdWV2ZW50IHdpdGhvdXQga3NldCFcbiIpOwpAQCAtMTE1LDYgKzEwOSwxNiBAQAogCQkJcmV0dXJuIDA7CiAJCX0KIAorCS8qIG9yaWdpbmF0aW5nIHN1YnN5c3RlbSAqLworCWlmICh1ZXZlbnRfb3BzICYmIHVldmVudF9vcHMtPm5hbWUpCisJCXN1YnN5c3RlbSA9IHVldmVudF9vcHMtPm5hbWUoa3NldCwga29iaik7CisJZWxzZQorCQlzdWJzeXN0ZW0gPSBrb2JqZWN0X25hbWUoJmtzZXQtPmtvYmopOworCWlmICghc3Vic3lzdGVtKSB7CisJCXByX2RlYnVnKCJ1bnNldCBzdWJzeXRlbSBjYXVzZWQgdGhlIGV2ZW50IHRvIGRyb3AhXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCiAJLyogZW52aXJvbm1lbnQgaW5kZXggKi8KIAllbnZwID0ga3phbGxvYyhOVU1fRU5WUCAqIHNpemVvZiAoY2hhciAqKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFlbnZwKQpAQCAtMTM0LDEyICsxMzgsNiBAQAogCQlnb3RvIGV4aXQ7CiAJfQogCi0JLyogb3JpZ2luYXRpbmcgc3Vic3lzdGVtICovCi0JaWYgKHVldmVudF9vcHMgJiYgdWV2ZW50X29wcy0+bmFtZSkKLQkJc3Vic3lzdGVtID0gdWV2ZW50X29wcy0+bmFtZShrc2V0LCBrb2JqKTsKLQllbHNlCi0JCXN1YnN5c3RlbSA9IGtvYmplY3RfbmFtZSgma3NldC0+a29iaik7Ci0KIAkvKiBldmVudCBlbnZpcm9uZW1udCBmb3IgaGVscGVyIHByb2Nlc3Mgb25seSAqLwogCWVudnBbaSsrXSA9ICJIT01FPS8iOwogCWVudnBbaSsrXSA9ICJQQVRIPS9zYmluOi9iaW46L3Vzci9zYmluOi91c3IvYmluIjsKQEAgLTI5Myw3ICsyOTEsNyBAQAogc3RhdGljIGludCBfX2luaXQga29iamVjdF91ZXZlbnRfaW5pdCh2b2lkKQogewogCXVldmVudF9zb2NrID0gbmV0bGlua19rZXJuZWxfY3JlYXRlKE5FVExJTktfS09CSkVDVF9VRVZFTlQsIDEsIE5VTEwsCi0JCQkJCSAgICBUSElTX01PRFVMRSk7CisJCQkJCSAgICBOVUxMLCBUSElTX01PRFVMRSk7CiAKIAlpZiAoIXVldmVudF9zb2NrKSB7CiAJCXByaW50ayhLRVJOX0VSUgpkaWZmIC0tZ2l0IGEvbGliL2tyZWYuYyBiL2xpYi9rcmVmLmMKaW5kZXggMGQwN2NjMy4uYTZkYzNlYyAxMDA2NDQKLS0tIGEvbGliL2tyZWYuYworKysgYi9saWIva3JlZi5jCkBAIC0yMSw2ICsyMSw3IEBACiB2b2lkIGtyZWZfaW5pdChzdHJ1Y3Qga3JlZiAqa3JlZikKIHsKIAlhdG9taWNfc2V0KCZrcmVmLT5yZWZjb3VudCwxKTsKKwlzbXBfbWIoKTsKIH0KIAogLyoqCkBAIC0zMSw2ICszMiw3IEBACiB7CiAJV0FSTl9PTighYXRvbWljX3JlYWQoJmtyZWYtPnJlZmNvdW50KSk7CiAJYXRvbWljX2luYygma3JlZi0+cmVmY291bnQpOworCXNtcF9tYl9fYWZ0ZXJfYXRvbWljX2luYygpOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2xpYi9zdHJpbmcuYyBiL2xpYi9zdHJpbmcuYwppbmRleCBiYWI0NDBmLi41ZWZhZmVkIDEwMDY0NAotLS0gYS9saWIvc3RyaW5nLmMKKysrIGIvbGliL3N0cmluZy5jCkBAIC02MCw2ICs2MCwzNCBAQAogRVhQT1JUX1NZTUJPTChzdHJuaWNtcCk7CiAjZW5kaWYKIAorI2lmbmRlZiBfX0hBVkVfQVJDSF9TVFJDQVNFQ01QCitpbnQgc3RyY2FzZWNtcChjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIpCit7CisJaW50IGMxLCBjMjsKKworCWRvIHsKKwkJYzEgPSB0b2xvd2VyKCpzMSsrKTsKKwkJYzIgPSB0b2xvd2VyKCpzMisrKTsKKwl9IHdoaWxlIChjMSA9PSBjMiAmJiBjMSAhPSAwKTsKKwlyZXR1cm4gYzEgLSBjMjsKK30KK0VYUE9SVF9TWU1CT0woc3RyY2FzZWNtcCk7CisjZW5kaWYKKworI2lmbmRlZiBfX0hBVkVfQVJDSF9TVFJOQ0FTRUNNUAoraW50IHN0cm5jYXNlY21wKGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMiwgc2l6ZV90IG4pCit7CisJaW50IGMxLCBjMjsKKworCWRvIHsKKwkJYzEgPSB0b2xvd2VyKCpzMSsrKTsKKwkJYzIgPSB0b2xvd2VyKCpzMisrKTsKKwl9IHdoaWxlICgoLS1uID4gMCkgJiYgYzEgPT0gYzIgJiYgYzEgIT0gMCk7CisJcmV0dXJuIGMxIC0gYzI7Cit9CitFWFBPUlRfU1lNQk9MKHN0cm5jYXNlY21wKTsKKyNlbmRpZgorCiAjaWZuZGVmIF9fSEFWRV9BUkNIX1NUUkNQWQogLyoqCiAgKiBzdHJjcHkgLSBDb3B5IGEgJU5VTCB0ZXJtaW5hdGVkIHN0cmluZwpkaWZmIC0tZ2l0IGEvbGliL3ZzcHJpbnRmLmMgYi9saWIvdnNwcmludGYuYwppbmRleCBiMDI1ODY0Li5jYmFiMWRmIDEwMDY0NAotLS0gYS9saWIvdnNwcmludGYuYworKysgYi9saWIvdnNwcmludGYuYwpAQCAtODUxLDIzICs4NTEsMzUgQEAKIAogCiAvKiBTaW1wbGlmaWVkIGFzcHJpbnRmLiAqLwotY2hhciAqa2FzcHJpbnRmKGdmcF90IGdmcCwgY29uc3QgY2hhciAqZm10LCAuLi4pCitjaGFyICprdmFzcHJpbnRmKGdmcF90IGdmcCwgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFwKQogewotCXZhX2xpc3QgYXA7CiAJdW5zaWduZWQgaW50IGxlbjsKIAljaGFyICpwOworCXZhX2xpc3QgYXE7CiAKLQl2YV9zdGFydChhcCwgZm10KTsKLQlsZW4gPSB2c25wcmludGYoTlVMTCwgMCwgZm10LCBhcCk7Ci0JdmFfZW5kKGFwKTsKKwl2YV9jb3B5KGFxLCBhcCk7CisJbGVuID0gdnNucHJpbnRmKE5VTEwsIDAsIGZtdCwgYXEpOworCXZhX2VuZChhcSk7CiAKIAlwID0ga21hbGxvYyhsZW4rMSwgZ2ZwKTsKIAlpZiAoIXApCiAJCXJldHVybiBOVUxMOwotCXZhX3N0YXJ0KGFwLCBmbXQpOworCiAJdnNucHJpbnRmKHAsIGxlbisxLCBmbXQsIGFwKTsKLQl2YV9lbmQoYXApOworCiAJcmV0dXJuIHA7CiB9CitFWFBPUlRfU1lNQk9MKGt2YXNwcmludGYpOwogCitjaGFyICprYXNwcmludGYoZ2ZwX3QgZ2ZwLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFwOworCWNoYXIgKnA7CisKKwl2YV9zdGFydChhcCwgZm10KTsKKwlwID0ga3Zhc3ByaW50ZihnZnAsIGZtdCwgYXApOworCXZhX2VuZChhcCk7CisKKwlyZXR1cm4gcDsKK30KIEVYUE9SVF9TWU1CT0woa2FzcHJpbnRmKTsKZGlmZiAtLWdpdCBhL21tL3BhZ2Utd3JpdGViYWNrLmMgYi9tbS9wYWdlLXdyaXRlYmFjay5jCmluZGV4IGY0NjllM2MuLmE3OTQ5NDUgMTAwNjQ0Ci0tLSBhL21tL3BhZ2Utd3JpdGViYWNrLmMKKysrIGIvbW0vcGFnZS13cml0ZWJhY2suYwpAQCAtNjcsMTIgKzY3LDEyIEBACiAvKgogICogU3RhcnQgYmFja2dyb3VuZCB3cml0ZWJhY2sgKHZpYSBwZGZsdXNoKSBhdCB0aGlzIHBlcmNlbnRhZ2UKICAqLwotaW50IGRpcnR5X2JhY2tncm91bmRfcmF0aW8gPSAxMDsKK2ludCBkaXJ0eV9iYWNrZ3JvdW5kX3JhdGlvID0gNTsKIAogLyoKICAqIFRoZSBnZW5lcmF0b3Igb2YgZGlydHkgZGF0YSBzdGFydHMgd3JpdGViYWNrIGF0IHRoaXMgcGVyY2VudGFnZQogICovCi1pbnQgdm1fZGlydHlfcmF0aW8gPSA0MDsKK2ludCB2bV9kaXJ0eV9yYXRpbyA9IDEwOwogCiAvKgogICogVGhlIGludGVydmFsIGJldHdlZW4gYGt1cGRhdGUnLXN0eWxlIHdyaXRlYmFja3MsIGluIGppZmZpZXMKZGlmZiAtLWdpdCBhL21tL3JtYXAuYyBiL21tL3JtYXAuYwppbmRleCBiODIxNDZlLi41OWRhNWI3IDEwMDY0NAotLS0gYS9tbS9ybWFwLmMKKysrIGIvbW0vcm1hcC5jCkBAIC00OTgsOCArNDk4LDEwIEBACiAJCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gcGFnZV9tYXBwaW5nKHBhZ2UpOwogCQlpZiAobWFwcGluZykKIAkJCXJldCA9IHBhZ2VfbWtjbGVhbl9maWxlKG1hcHBpbmcsIHBhZ2UpOwotCQlpZiAocGFnZV90ZXN0X2FuZF9jbGVhcl9kaXJ0eShwYWdlKSkKKwkJaWYgKHBhZ2VfdGVzdF9kaXJ0eShwYWdlKSkgeworCQkJcGFnZV9jbGVhcl9kaXJ0eShwYWdlKTsKIAkJCXJldCA9IDE7CisJCX0KIAl9CiAKIAlyZXR1cm4gcmV0OwpAQCAtNjA1LDggKzYwNywxMCBAQAogCQkgKiBMZWF2aW5nIGl0IHNldCBhbHNvIGhlbHBzIHN3YXBvZmYgdG8gcmVpbnN0YXRlIHB0ZXMKIAkJICogZmFzdGVyIGZvciB0aG9zZSBwYWdlcyBzdGlsbCBpbiBzd2FwY2FjaGUuCiAJCSAqLwotCQlpZiAocGFnZV90ZXN0X2FuZF9jbGVhcl9kaXJ0eShwYWdlKSkKKwkJaWYgKHBhZ2VfdGVzdF9kaXJ0eShwYWdlKSkgeworCQkJcGFnZV9jbGVhcl9kaXJ0eShwYWdlKTsKIAkJCXNldF9wYWdlX2RpcnR5KHBhZ2UpOworCQl9CiAJCV9fZGVjX3pvbmVfcGFnZV9zdGF0ZShwYWdlLAogCQkJCVBhZ2VBbm9uKHBhZ2UpID8gTlJfQU5PTl9QQUdFUyA6IE5SX0ZJTEVfTUFQUEVEKTsKIAl9CmRpZmYgLS1naXQgYS9uZXQvODAyL2ZkZGkuYyBiL25ldC84MDIvZmRkaS5jCmluZGV4IGFjZTYzODYuLjkxZGRlNDEgMTAwNjQ0Ci0tLSBhL25ldC84MDIvZmRkaS5jCisrKyBiL25ldC84MDIvZmRkaS5jCkBAIC0xMDAsNyArMTAwLDcgQEAKIAlzdHJ1Y3QgZmRkaWhkciAqZmRkaSA9IChzdHJ1Y3QgZmRkaWhkciAqKXNrYi0+ZGF0YTsKIAogI2lmZGVmIENPTkZJR19JTkVUCi0JaWYgKGZkZGktPmhkci5sbGNfc25hcC5ldGhlcnR5cGUgPT0gX19jb25zdGFudF9odG9ucyhFVEhfUF9JUCkpCisJaWYgKGZkZGktPmhkci5sbGNfc25hcC5ldGhlcnR5cGUgPT0gaHRvbnMoRVRIX1BfSVApKQogCQkvKiBUcnkgdG8gZ2V0IEFSUCB0byByZXNvbHZlIHRoZSBoZWFkZXIgYW5kIGZpbGwgZGVzdGluYXRpb24gYWRkcmVzcyAqLwogCQlyZXR1cm4gYXJwX2ZpbmQoZmRkaS0+ZGFkZHIsIHNrYik7CiAJZWxzZQpAQCAtMTMwLDEyICsxMzAsMTMgQEAKIAkgKiB0byBzdGFydCBvZiBwYWNrZXQgZGF0YS4gIEFzc3VtZSA4MDIuMiBTTkFQIGZyYW1lcyBmb3Igbm93LgogCSAqLwogCi0Jc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOwkvKiBwb2ludCB0byBmcmFtZSBjb250cm9sIChGQykgKi8KKwlza2ItPmRldiA9IGRldjsKKwlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwkvKiBwb2ludCB0byBmcmFtZSBjb250cm9sIChGQykgKi8KIAogCWlmKGZkZGktPmhkci5sbGNfODAyMl8xLmRzYXA9PTB4ZTApCiAJewogCQlza2JfcHVsbChza2IsIEZERElfS184MDIyX0hMRU4tMyk7Ci0JCXR5cGUgPSBfX2NvbnN0YW50X2h0b25zKEVUSF9QXzgwMl8yKTsKKwkJdHlwZSA9IGh0b25zKEVUSF9QXzgwMl8yKTsKIAl9CiAJZWxzZQogCXsKZGlmZiAtLWdpdCBhL25ldC84MDIvaGlwcGkuYyBiL25ldC84MDIvaGlwcGkuYwppbmRleCA1NzhmMmEzLi44N2ZmYzEyIDEwMDY0NAotLS0gYS9uZXQvODAyL2hpcHBpLmMKKysrIGIvbmV0LzgwMi9oaXBwaS5jCkBAIC02MCw3ICs2MCw3IEBACiAJICogRHVlIHRvIHRoZSBzdHVwaWRpdHkgb2YgdGhlIGxpdHRsZSBlbmRpYW4gYnl0ZS1vcmRlciB3ZQogCSAqIGhhdmUgdG8gc2V0IHRoZSBmcCBmaWVsZCB0aGlzIHdheS4KIAkgKi8KLQloaXAtPmZwLmZpeGVkCQk9IF9fY29uc3RhbnRfaHRvbmwoMHgwNDgwMDAxOCk7CisJaGlwLT5mcC5maXhlZAkJPSBodG9ubCgweDA0ODAwMDE4KTsKIAloaXAtPmZwLmQyX3NpemUJCT0gaHRvbmwobGVuICsgOCk7CiAJaGlwLT5sZS5mYwkJPSAwOwogCWhpcC0+bGUuZG91YmxlX3dpZGUJPSAwOwkvKiBvbmx5IEhJUFBJIDgwMCBmb3IgdGhlIHRpbWUgYmVpbmcgKi8KQEAgLTEwNCw3ICsxMDQsNyBAQAogCSAqIE9ubHkgSVAgaXMgY3VycmVudGx5IHN1cHBvcnRlZAogCSAqLwogCi0JaWYoaGlwLT5zbmFwLmV0aGVydHlwZSAhPSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0lQKSkKKwlpZihoaXAtPnNuYXAuZXRoZXJ0eXBlICE9IGh0b25zKEVUSF9QX0lQKSkKIAl7CiAJCXByaW50ayhLRVJOX0RFQlVHICIlczogdW5hYmxlIHRvIHJlc29sdmUgdHlwZSAlWCBhZGRyZXNzZXMuXG4iLHNrYi0+ZGV2LT5uYW1lLG50b2hzKGhpcC0+c25hcC5ldGhlcnR5cGUpKTsKIAkJcmV0dXJuIDA7CkBAIC0xMjYsMTQgKzEyNiwxNCBAQAogewogCXN0cnVjdCBoaXBwaV9oZHIgKmhpcDsKIAotCWhpcCA9IChzdHJ1Y3QgaGlwcGlfaGRyICopIHNrYi0+ZGF0YTsKLQogCS8qCiAJICogVGhpcyBpcyBhY3R1YWxseSB3cm9uZyAuLi4gcXVlc3Rpb24gaXMgaWYgd2UgcmVhbGx5IHNob3VsZAogCSAqIHNldCB0aGUgcmF3IGFkZHJlc3MgaGVyZS4KIAkgKi8KLQkgc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOwotCSBza2JfcHVsbChza2IsIEhJUFBJX0hMRU4pOworCXNrYi0+ZGV2ID0gZGV2OworCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CisJaGlwID0gKHN0cnVjdCBoaXBwaV9oZHIgKilza2JfbWFjX2hlYWRlcihza2IpOworCXNrYl9wdWxsKHNrYiwgSElQUElfSExFTik7CiAKIAkvKgogCSAqIE5vIGZhbmN5IHByb21pc2Mgc3R1ZmYgaGVyZSBub3cuCmRpZmYgLS1naXQgYS9uZXQvODAyL3BzbmFwLmMgYi9uZXQvODAyL3BzbmFwLmMKaW5kZXggNmU3YzIxMi4uMDRlZTQzZSAxMDA2NDQKLS0tIGEvbmV0LzgwMi9wc25hcC5jCisrKyBiL25ldC84MDIvcHNuYXAuYwpAQCAtNTYsMTAgKzU2LDEwIEBACiAJfTsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQlwcm90byA9IGZpbmRfc25hcF9jbGllbnQoc2tiLT5oLnJhdyk7CisJcHJvdG8gPSBmaW5kX3NuYXBfY2xpZW50KHNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYikpOwogCWlmIChwcm90bykgewogCQkvKiBQYXNzIHRoZSBmcmFtZSBvbi4gKi8KLQkJc2tiLT5oLnJhdyAgKz0gNTsKKwkJc2tiLT50cmFuc3BvcnRfaGVhZGVyICs9IDU7CiAJCXNrYl9wdWxsX3Jjc3VtKHNrYiwgNSk7CiAJCXJjID0gcHJvdG8tPnJjdmZ1bmMoc2tiLCBkZXYsICZzbmFwX3BhY2tldF90eXBlLCBvcmlnX2Rldik7CiAJfSBlbHNlIHsKZGlmZiAtLWdpdCBhL25ldC84MDIvdHIuYyBiL25ldC84MDIvdHIuYwppbmRleCA5NmJkMTQ0Li4wYmExOTQ2IDEwMDY0NAotLS0gYS9uZXQvODAyL3RyLmMKKysrIGIvbmV0LzgwMi90ci5jCkBAIC0xODksMTEgKzE4OSwxMyBAQAogX19iZTE2IHRyX3R5cGVfdHJhbnMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAotCXN0cnVjdCB0cmhfaGRyICp0cmg9KHN0cnVjdCB0cmhfaGRyICopc2tiLT5kYXRhOworCXN0cnVjdCB0cmhfaGRyICp0cmg7CiAJc3RydWN0IHRybGxjICp0cmxsYzsKIAl1bnNpZ25lZCByaWZsZW49MDsKIAotCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKwlza2ItPmRldiA9IGRldjsKKwlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOworCXRyaCA9IHRyX2hkcihza2IpOwogCiAJaWYodHJoLT5zYWRkclswXSAmIFRSX1JJSSkKIAkJcmlmbGVuID0gKG50b2hzKHRyaC0+cmNmKSAmIFRSX1JDRl9MRU5fTUFTSykgPj4gODsKQEAgLTU1Miw3ICs1NTQsOCBAQAogCQkJCQlpZihqPT0xKSB7CiAJCQkJCQlzZWdtZW50PW50b2hzKGVudHJ5LT5yc2VnW2otMV0pPj40OwogCQkJCQkJc2VxX3ByaW50ZihzZXEsIiAgJTAzWCIsc2VnbWVudCk7Ci0JCQkJCX07CisJCQkJCX0KKwogCQkJCQlzZWdtZW50PW50b2hzKGVudHJ5LT5yc2VnW2pdKT4+NDsKIAkJCQkJYnJkZ25tYj1udG9ocyhlbnRyeS0+cnNlZ1tqLTFdKSYweDAwZjsKIAkJCQkJc2VxX3ByaW50ZihzZXEsIi0lMDFYLSUwM1giLGJyZGdubWIsc2VnbWVudCk7CmRpZmYgLS1naXQgYS9uZXQvODAyMXEvdmxhbi5jIGIvbmV0LzgwMjFxL3ZsYW4uYwppbmRleCBlYjFjNzFlLi5jMGM3YmI4IDEwMDY0NAotLS0gYS9uZXQvODAyMXEvdmxhbi5jCisrKyBiL25ldC84MDIxcS92bGFuLmMKQEAgLTQ3MCw3ICs0NzAsNyBAQAogCQkgKi8KIAlkZWZhdWx0OgogCQlzbnByaW50ZihuYW1lLCBJRk5BTVNJWiwgInZsYW4lLjRpIiwgVkxBTl9JRCk7Ci0JfTsKKwl9CiAKIAluZXdfZGV2ID0gYWxsb2NfbmV0ZGV2KHNpemVvZihzdHJ1Y3Qgdmxhbl9kZXZfaW5mbyksIG5hbWUsCiAJCQkgICAgICAgdmxhbl9zZXR1cCk7CkBAIC02ODUsNyArNjg1LDcgQEAKIAkJCQlicmVhazsKIAkJfQogCQlicmVhazsKLQl9OworCX0KIAogb3V0OgogCXJldHVybiBOT1RJRllfRE9ORTsKQEAgLTgxOSw3ICs4MTksNyBAQAogCQlwcmludGsoVkxBTl9EQkcgIiVzOiBVbmtub3duIFZMQU4gQ01EOiAleCBcbiIsCiAJCQlfX0ZVTkNUSU9OX18sIGFyZ3MuY21kKTsKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JfTsKKwl9CiBvdXQ6CiAJcmV0dXJuIGVycjsKIH0KZGlmZiAtLWdpdCBhL25ldC84MDIxcS92bGFuX2Rldi5jIGIvbmV0LzgwMjFxL3ZsYW5fZGV2LmMKaW5kZXggYjZlMGVlYS4uZWM0NjA4NCAxMDA2NDQKLS0tIGEvbmV0LzgwMjFxL3ZsYW5fZGV2LmMKKysrIGIvbmV0LzgwMjFxL3ZsYW5fZGV2LmMKQEAgLTY2LDcgKzY2LDcgQEAKIAogCQltZW1jcHkodmV0aC0+aF9zb3VyY2UsIGRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKIAkJYnJlYWs7Ci0JfTsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTgzLDcgKzgzLDcgQEAKIAkJCS8qIExpZnRlZCBmcm9tIEdsZWIncyBWTEFOIGNvZGUuLi4gKi8KIAkJCW1lbW1vdmUoc2tiLT5kYXRhIC0gRVRIX0hMRU4sCiAJCQkJc2tiLT5kYXRhIC0gVkxBTl9FVEhfSExFTiwgMTIpOwotCQkJc2tiLT5tYWMucmF3ICs9IFZMQU5fSExFTjsKKwkJCXNrYi0+bWFjX2hlYWRlciArPSBWTEFOX0hMRU47CiAJCX0KIAl9CiAKQEAgLTIxOSw3ICsyMTksNyBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlicmVhazsKLQl9OworCX0KIAogCS8qICBXYXMgYSBWTEFOIHBhY2tldCwgZ3JhYiB0aGUgZW5jYXBzdWxhdGVkIHByb3RvY29sLCB3aGljaCB0aGUgbGF5ZXIKIAkgKiB0aHJlZSBwcm90b2NvbHMgY2FyZSBhYm91dC4KQEAgLTI1OCw3ICsyNTgsNyBAQAogCSAqIHdvbid0IHdvcmsgZm9yIGZhdWx0IHRvbGVyYW50IG5ldHdhcmUgYnV0IGRvZXMgZm9yIHRoZSByZXN0LgogCSAqLwogCWlmICgqKHVuc2lnbmVkIHNob3J0ICopcmF3cCA9PSAweEZGRkYpIHsKLQkJc2tiLT5wcm90b2NvbCA9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfODAyXzMpOworCQlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfODAyXzMpOwogCQkvKiBwbGFjZSBpdCBiYWNrIG9uIHRoZSBxdWV1ZSB0byBiZSBoYW5kbGVkIGJ5IHRydWUgbGF5ZXIgMyBwcm90b2NvbHMuCiAJCSAqLwogCkBAIC0yODEsNyArMjgxLDcgQEAKIAkvKgogCSAqCVJlYWwgODAyLjIgTExDCiAJICovCi0Jc2tiLT5wcm90b2NvbCA9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfODAyXzIpOworCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF84MDJfMik7CiAJLyogcGxhY2UgaXQgYmFjayBvbiB0aGUgcXVldWUgdG8gYmUgaGFuZGxlZCBieSB1cHBlciBsYXllciBwcm90b2NvbHMuCiAJICovCiAKQEAgLTM4Miw3ICszODIsNyBAQAogCQl9CiAKIAkJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QXzgwMjFRKTsKLQkJc2tiLT5uaC5yYXcgPSBza2ItPmRhdGE7CisJCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOwogCX0KIAogCS8qIEJlZm9yZSBkZWxlZ2F0aW5nIHdvcmsgdG8gdGhlIGxvd2VyIGxheWVyLCBlbnRlciBvdXIgTUFDLWFkZHJlc3MgKi8KQEAgLTQ0OCw3ICs0NDgsNyBAQAogCSAqIE9USEVSIFRISU5HUyBMSUtFIEZEREkvVG9rZW5SaW5nLzgwMi4zIFNOQVBzLi4uCiAJICovCiAKLQlpZiAodmV0aC0+aF92bGFuX3Byb3RvICE9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfODAyMVEpKSB7CisJaWYgKHZldGgtPmhfdmxhbl9wcm90byAhPSBodG9ucyhFVEhfUF84MDIxUSkpIHsKIAkJaW50IG9yaWdfaGVhZHJvb20gPSBza2JfaGVhZHJvb20oc2tiKTsKIAkJdW5zaWduZWQgc2hvcnQgdmV0aF9UQ0k7CiAKZGlmZiAtLWdpdCBhL25ldC9LY29uZmlnIGIvbmV0L0tjb25maWcKaW5kZXggOTE1NjU3OC4uMmZjOGU3NyAxMDA2NDQKLS0tIGEvbmV0L0tjb25maWcKKysrIGIvbmV0L0tjb25maWcKQEAgLTI3LDEzICsyNyw2IEBACiAKIG1lbnUgIk5ldHdvcmtpbmcgb3B0aW9ucyIKIAotY29uZmlnIE5FVERFQlVHCi0JYm9vbCAiTmV0d29yayBwYWNrZXQgZGVidWdnaW5nIgotCWhlbHAKLQkgIFlvdSBjYW4gc2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBnZXQgYWRkaXRpb25hbCBtZXNzYWdlcyB1c2VmdWwgaW4KLQkgIGRlYnVnZ2luZyBiYWQgcGFja2V0cywgYnV0IGNhbiBvdmVyd2hlbG0gbG9ncyB1bmRlciBkZW5pYWwgb2Ygc2VydmljZQotCSAgYXR0YWNrcy4KLQogc291cmNlICJuZXQvcGFja2V0L0tjb25maWciCiBzb3VyY2UgIm5ldC91bml4L0tjb25maWciCiBzb3VyY2UgIm5ldC94ZnJtL0tjb25maWciCkBAIC0yMTksMTQgKzIxMiwxOCBAQAogc291cmNlICJuZXQvYXgyNS9LY29uZmlnIgogc291cmNlICJuZXQvaXJkYS9LY29uZmlnIgogc291cmNlICJuZXQvYmx1ZXRvb3RoL0tjb25maWciCi1zb3VyY2UgIm5ldC9pZWVlODAyMTEvS2NvbmZpZyIKLQotY29uZmlnIFdJUkVMRVNTX0VYVAotCWJvb2wKK3NvdXJjZSAibmV0L3J4cnBjL0tjb25maWciCiAKIGNvbmZpZyBGSUJfUlVMRVMKIAlib29sCiAKK21lbnUgIldpcmVsZXNzIgorCitzb3VyY2UgIm5ldC93aXJlbGVzcy9LY29uZmlnIgorc291cmNlICJuZXQvaWVlZTgwMjExL0tjb25maWciCisKK2VuZG1lbnUKKwogZW5kaWYgICAjIGlmIE5FVAogZW5kbWVudSAjIE5ldHdvcmtpbmcKIApkaWZmIC0tZ2l0IGEvbmV0L01ha2VmaWxlIGIvbmV0L01ha2VmaWxlCmluZGV4IDQ4NTRhYzUuLjZiNzRkNDEgMTAwNjQ0Ci0tLSBhL25ldC9NYWtlZmlsZQorKysgYi9uZXQvTWFrZWZpbGUKQEAgLTM4LDYgKzM4LDcgQEAKIG9iai0kKENPTkZJR19CVCkJCSs9IGJsdWV0b290aC8KIG9iai0kKENPTkZJR19TVU5SUEMpCQkrPSBzdW5ycGMvCiBvYmotJChDT05GSUdfUlhSUEMpCQkrPSByeHJwYy8KK29iai0kKENPTkZJR19BRl9SWFJQQykJCSs9IHJ4cnBjLwogb2JqLSQoQ09ORklHX0FUTSkJCSs9IGF0bS8KIG9iai0kKENPTkZJR19ERUNORVQpCQkrPSBkZWNuZXQvCiBvYmotJChDT05GSUdfRUNPTkVUKQkJKz0gZWNvbmV0LwpAQCAtNTIsMyArNTMsNSBAQAogaWZlcSAoJChDT05GSUdfTkVUKSx5KQogb2JqLSQoQ09ORklHX1NZU0NUTCkJCSs9IHN5c2N0bF9uZXQubwogZW5kaWYKKworb2JqLXkJCQkJKz0gd2lyZWxlc3MvCmRpZmYgLS1naXQgYS9uZXQvYXBwbGV0YWxrL2FhcnAuYyBiL25ldC9hcHBsZXRhbGsvYWFycC5jCmluZGV4IGQ4OWQ2MmYuLjVlZjZhMjMgMTAwNjQ0Ci0tLSBhL25ldC9hcHBsZXRhbGsvYWFycC5jCisrKyBiL25ldC9hcHBsZXRhbGsvYWFycC5jCkBAIC0xMTgsNyArMTE4LDkgQEAKIAogCS8qIFNldCB1cCB0aGUgYnVmZmVyICovCiAJc2tiX3Jlc2VydmUoc2tiLCBkZXYtPmhhcmRfaGVhZGVyX2xlbiArIGFhcnBfZGwtPmhlYWRlcl9sZW5ndGgpOwotCXNrYi0+bmgucmF3ICAgICAgPSBza2ItPmgucmF3ID0gc2tiX3B1dChza2IsIHNpemVvZigqZWFoKSk7CisJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CisJc2tiX3Jlc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKKwlza2JfcHV0KHNrYiwgc2l6ZW9mKCplYWgpKTsKIAlza2ItPnByb3RvY29sICAgID0gaHRvbnMoRVRIX1BfQVRBTEspOwogCXNrYi0+ZGV2CSA9IGRldjsKIAllYWgJCSA9IGFhcnBfaGRyKHNrYik7CkBAIC0xNjMsNyArMTY1LDkgQEAKIAogCS8qIFNldCB1cCB0aGUgYnVmZmVyICovCiAJc2tiX3Jlc2VydmUoc2tiLCBkZXYtPmhhcmRfaGVhZGVyX2xlbiArIGFhcnBfZGwtPmhlYWRlcl9sZW5ndGgpOwotCXNrYi0+bmgucmF3ICAgICAgPSBza2ItPmgucmF3ID0gc2tiX3B1dChza2IsIHNpemVvZigqZWFoKSk7CisJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CisJc2tiX3Jlc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKKwlza2JfcHV0KHNrYiwgc2l6ZW9mKCplYWgpKTsKIAlza2ItPnByb3RvY29sICAgID0gaHRvbnMoRVRIX1BfQVRBTEspOwogCXNrYi0+ZGV2CSA9IGRldjsKIAllYWgJCSA9IGFhcnBfaGRyKHNrYik7CkBAIC0yMTIsNyArMjE2LDkgQEAKIAogCS8qIFNldCB1cCB0aGUgYnVmZmVyICovCiAJc2tiX3Jlc2VydmUoc2tiLCBkZXYtPmhhcmRfaGVhZGVyX2xlbiArIGFhcnBfZGwtPmhlYWRlcl9sZW5ndGgpOwotCXNrYi0+bmgucmF3ICAgICAgPSBza2ItPmgucmF3ID0gc2tiX3B1dChza2IsIHNpemVvZigqZWFoKSk7CisJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CisJc2tiX3Jlc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKKwlza2JfcHV0KHNrYiwgc2l6ZW9mKCplYWgpKTsKIAlza2ItPnByb3RvY29sICAgID0gaHRvbnMoRVRIX1BfQVRBTEspOwogCXNrYi0+ZGV2CSA9IGRldjsKIAllYWgJCSA9IGFhcnBfaGRyKHNrYik7CkBAIC01MzksNyArNTQ1LDcgQEAKIAlpbnQgaGFzaDsKIAlzdHJ1Y3QgYWFycF9lbnRyeSAqYTsKIAotCXNrYi0+bmgucmF3ID0gc2tiLT5kYXRhOworCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOwogCiAJLyogQ2hlY2sgZm9yIExvY2FsVGFsayBmaXJzdCAqLwogCWlmIChkZXYtPnR5cGUgPT0gQVJQSFJEX0xPQ0FMVExLKSB7CmRpZmYgLS1naXQgYS9uZXQvYXBwbGV0YWxrL2RkcC5jIGIvbmV0L2FwcGxldGFsay9kZHAuYwppbmRleCBjOGI3ZGMyLi5mNmE5MmEwIDEwMDY0NAotLS0gYS9uZXQvYXBwbGV0YWxrL2RkcC5jCisrKyBiL25ldC9hcHBsZXRhbGsvZGRwLmMKQEAgLTEyNzUsNyArMTI3NSw3IEBACiAJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0lQKTsKIAlza2JfcHVsbChza2IsIDEzKTsKIAlza2ItPmRldiAgID0gZGV2OwotCXNrYi0+aC5yYXcgPSBza2ItPmRhdGE7CisJc2tiX3Jlc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKIAogCXN0YXRzID0gZGV2LT5wcml2OwogCXN0YXRzLT5yeF9wYWNrZXRzKys7CkBAIC0xMzgzLDEwICsxMzgzLDEwIEBACiAgKglAcHQgLSBwYWNrZXQgdHlwZQogICoKICAqCVJlY2VpdmUgYSBwYWNrZXQgKGluIHNrYikgZnJvbSBkZXZpY2UgZGV2LiBUaGlzIGhhcyBjb21lIGZyb20gdGhlIFNOQVAKLSAqCWRlY29kZXIsIGFuZCBvbiBlbnRyeSBza2ItPmgucmF3IGlzIHRoZSBERFAgaGVhZGVyLCBza2ItPmxlbiBpcyB0aGUgRERQCi0gKgloZWFkZXIsIHNrYi0+bGVuIGlzIHRoZSBERFAgbGVuZ3RoLiBUaGUgcGh5c2ljYWwgaGVhZGVycyBoYXZlIGJlZW4KLSAqCWV4dHJhY3RlZC4gUFBQIHNob3VsZCBwcm9iYWJseSBwYXNzIGZyYW1lcyBtYXJrZWQgYXMgZm9yIHRoaXMgbGF5ZXIuCi0gKglbaWUgQVJQSFJEX0VUSEVSVEFMS10KKyAqCWRlY29kZXIsIGFuZCBvbiBlbnRyeSBza2ItPnRyYW5zcG9ydF9oZWFkZXIgaXMgdGhlIEREUCBoZWFkZXIsIHNrYi0+bGVuCisgKglpcyB0aGUgRERQIGhlYWRlciwgc2tiLT5sZW4gaXMgdGhlIEREUCBsZW5ndGguIFRoZSBwaHlzaWNhbCBoZWFkZXJzCisgKgloYXZlIGJlZW4gZXh0cmFjdGVkLiBQUFAgc2hvdWxkIHByb2JhYmx5IHBhc3MgZnJhbWVzIG1hcmtlZCBhcyBmb3IgdGhpcworICoJbGF5ZXIuICBbaWUgQVJQSFJEX0VUSEVSVEFMS10KICAqLwogc3RhdGljIGludCBhdGFsa19yY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJICAgICBzdHJ1Y3QgcGFja2V0X3R5cGUgKnB0LCBzdHJ1Y3QgbmV0X2RldmljZSAqb3JpZ19kZXYpCkBAIC0xNDg0LDcgKzE0ODQsNyBAQAogCQkgICAgIHN0cnVjdCBwYWNrZXRfdHlwZSAqcHQsIHN0cnVjdCBuZXRfZGV2aWNlICpvcmlnX2RldikKIHsKIAkvKiBFeHBhbmQgYW55IHNob3J0IGZvcm0gZnJhbWVzICovCi0JaWYgKHNrYi0+bWFjLnJhd1syXSA9PSAxKSB7CisJaWYgKHNrYl9tYWNfaGVhZGVyKHNrYilbMl0gPT0gMSkgewogCQlzdHJ1Y3QgZGRwZWhkciAqZGRwOwogCQkvKiBGaW5kIG91ciBhZGRyZXNzICovCiAJCXN0cnVjdCBhdGFsa19hZGRyICphcCA9IGF0YWxrX2ZpbmRfZGV2X2FkZHIoZGV2KTsKQEAgLTE1MTAsOCArMTUxMCw4IEBACiAJCSAqIHdlIHdyaXRlIHRoZSBuZXR3b3JrIG51bWJlcnMgIQogCQkgKi8KIAotCQlkZHAtPmRlaF9kbm9kZSA9IHNrYi0+bWFjLnJhd1swXTsgICAgIC8qIEZyb20gcGh5c2ljYWwgaGVhZGVyICovCi0JCWRkcC0+ZGVoX3Nub2RlID0gc2tiLT5tYWMucmF3WzFdOyAgICAgLyogRnJvbSBwaHlzaWNhbCBoZWFkZXIgKi8KKwkJZGRwLT5kZWhfZG5vZGUgPSBza2JfbWFjX2hlYWRlcihza2IpWzBdOyAgICAgLyogRnJvbSBwaHlzaWNhbCBoZWFkZXIgKi8KKwkJZGRwLT5kZWhfc25vZGUgPSBza2JfbWFjX2hlYWRlcihza2IpWzFdOyAgICAgLyogRnJvbSBwaHlzaWNhbCBoZWFkZXIgKi8KIAogCQlkZHAtPmRlaF9kbmV0ICA9IGFwLT5zX25ldDsJLyogTmV0d29yayBudW1iZXIgKi8KIAkJZGRwLT5kZWhfc25ldCAgPSBhcC0+c19uZXQ7CkBAIC0xNTIyLDcgKzE1MjIsNyBAQAogCQkvKiBOb24gcm91dGFibGUsIHNvIGZvcmNlIGEgZHJvcCBpZiB3ZSBzbGlwIHVwIGxhdGVyICovCiAJCWRkcC0+ZGVoX2xlbl9ob3BzID0gaHRvbnMoc2tiLT5sZW4gKyAoRERQX01BWEhPUFMgPDwgMTApKTsKIAl9Ci0Jc2tiLT5oLnJhdyA9IHNrYi0+ZGF0YTsKKwlza2JfcmVzZXRfdHJhbnNwb3J0X2hlYWRlcihza2IpOwogCiAJcmV0dXJuIGF0YWxrX3Jjdihza2IsIGRldiwgcHQsIG9yaWdfZGV2KTsKIGZyZWVpdDoKQEAgLTE3NzEsNiArMTc3MSw5IEBACiAJCWNhc2UgU0lPQ0dTVEFNUDoKIAkJCXJjID0gc29ja19nZXRfdGltZXN0YW1wKHNrLCBhcmdwKTsKIAkJCWJyZWFrOworCQljYXNlIFNJT0NHU1RBTVBOUzoKKwkJCXJjID0gc29ja19nZXRfdGltZXN0YW1wbnMoc2ssIGFyZ3ApOworCQkJYnJlYWs7CiAJCS8qIFJvdXRpbmcgKi8KIAkJY2FzZSBTSU9DQUREUlQ6CiAJCWNhc2UgU0lPQ0RFTFJUOgpkaWZmIC0tZ2l0IGEvbmV0L2F0bS9icjI2ODQuYyBiL25ldC9hdG0vYnIyNjg0LmMKaW5kZXggZWM0ZWJkMy4uMGU5ZjAwYyAxMDA2NDQKLS0tIGEvbmV0L2F0bS9icjI2ODQuYworKysgYi9uZXQvYXRtL2JyMjY4NC5jCkBAIC0xNzMsNyArMTczLDcgQEAKIAl9CiAJc2tiX3B1c2goc2tiLCBtaW5oZWFkcm9vbSk7CiAJaWYgKGJydmNjLT5lbmNhcHMgPT0gZV9sbGMpCi0JCW1lbWNweShza2ItPmRhdGEsIGxsY19vdWlfcGlkX3BhZCwgMTApOworCQlza2JfY29weV90b19saW5lYXJfZGF0YShza2IsIGxsY19vdWlfcGlkX3BhZCwgMTApOwogCWVsc2UKIAkJbWVtc2V0KHNrYi0+ZGF0YSwgMCwgMik7CiAjZW5kaWYgLyogRkFTVEVSX1ZFUlNJT04gKi8KQEAgLTM3NSwxMSArMzc1LDExIEBACiB7CiAJaWYgKGJydmNjLT5maWx0ZXIubmV0bWFzayA9PSAwKQogCQlyZXR1cm4gMDsJCQkvKiBubyBmaWx0ZXIgaW4gcGxhY2UgKi8KLQlpZiAodHlwZSA9PSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0lQKSAmJgorCWlmICh0eXBlID09IGh0b25zKEVUSF9QX0lQKSAmJgogCSAgICAoKChzdHJ1Y3QgaXBoZHIgKikgKHNrYi0+ZGF0YSkpLT5kYWRkciAmIGJydmNjLT5maWx0ZXIuCiAJICAgICBuZXRtYXNrKSA9PSBicnZjYy0+ZmlsdGVyLnByZWZpeCkKIAkJcmV0dXJuIDA7Ci0JaWYgKHR5cGUgPT0gX19jb25zdGFudF9odG9ucyhFVEhfUF9BUlApKQorCWlmICh0eXBlID09IGh0b25zKEVUSF9QX0FSUCkpCiAJCXJldHVybiAwOwogCS8qIFRPRE86IHdlIHNob3VsZCBwcm9iYWJseSBmaWx0ZXIgQVJQcyB0b28uLiBkb24ndCB3YW50IHRvIGhhdmUKIAkgKiAgIHRoZW0gcmV0dXJuaW5nIHZhbHVlcyB0aGF0IGRvbid0IG1ha2Ugc2Vuc2UsIG9yIGlzIHRoYXQgb2s/CkBAIC00NTgsNyArNDU4LDcgQEAKIAkvKiBGSVhNRTogdGNwZHVtcCBzaG93cyB0aGF0IHBvaW50ZXIgdG8gbWFjIGhlYWRlciBpcyAyIGJ5dGVzIGVhcmxpZXIsCiAJICAgdGhhbiBzaG91bGQgYmUuIFdoYXQgZWxzZSBzaG91bGQgSSBzZXQ/ICovCiAJc2tiX3B1bGwoc2tiLCBwbGVuKTsKLQlza2ItPm1hYy5yYXcgPSAoKGNoYXIgKikgKHNrYi0+ZGF0YSkpIC0gRVRIX0hMRU47CisJc2tiX3NldF9tYWNfaGVhZGVyKHNrYiwgLUVUSF9ITEVOKTsKIAlza2ItPnBrdF90eXBlID0gUEFDS0VUX0hPU1Q7CiAjaWZkZWYgQ09ORklHX0JSMjY4NF9GQVNUX1RSQU5TCiAJc2tiLT5wcm90b2NvbCA9ICgodTE2ICopIHNrYi0+ZGF0YSlbLTFdOwpkaWZmIC0tZ2l0IGEvbmV0L2F0bS9jbGlwLmMgYi9uZXQvYXRtL2NsaXAuYwppbmRleCA4YzM4MjU4Li44NzZiNzdmIDEwMDY0NAotLS0gYS9uZXQvYXRtL2NsaXAuYworKysgYi9uZXQvYXRtL2NsaXAuYwpAQCAtMjEzLDcgKzIxMyw3IEBACiAJCXJldHVybjsKIAl9CiAJQVRNX1NLQihza2IpLT52Y2MgPSB2Y2M7Ci0Jc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOworCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CiAJaWYgKCFjbGlwX3ZjYy0+ZW5jYXAKIAkgICAgfHwgc2tiLT5sZW4gPCBSRkMxNDgzTExDX0xFTgogCSAgICB8fCBtZW1jbXAoc2tiLT5kYXRhLCBsbGNfb3VpLCBzaXplb2YgKGxsY19vdWkpKSkKQEAgLTcwMiw3ICs3MDIsNyBAQAogCS5vcHMgPQkJCSZhdG1hcnBkX2Rldl9vcHMsCiAJLnR5cGUgPQkJCSJhcnBkIiwKIAkubnVtYmVyID0gCQk5OTksCi0JLmxvY2sgPQkJCVNQSU5fTE9DS19VTkxPQ0tFRAorCS5sb2NrID0JCQlfX1NQSU5fTE9DS19VTkxPQ0tFRChhdG1hcnBkX2Rldi5sb2NrKQogfTsKIAogCmRpZmYgLS1naXQgYS9uZXQvYXRtL2lvY3RsLmMgYi9uZXQvYXRtL2lvY3RsLmMKaW5kZXggOGNjZWU0NS4uN2FmZDhlNyAxMDA2NDQKLS0tIGEvbmV0L2F0bS9pb2N0bC5jCisrKyBiL25ldC9hdG0vaW9jdGwuYwpAQCAtODIsNiArODIsOSBAQAogCQljYXNlIFNJT0NHU1RBTVA6IC8qIGJvcnJvd2VkIGZyb20gSVAgKi8KIAkJCWVycm9yID0gc29ja19nZXRfdGltZXN0YW1wKHNrLCBhcmdwKTsKIAkJCWdvdG8gZG9uZTsKKwkJY2FzZSBTSU9DR1NUQU1QTlM6IC8qIGJvcnJvd2VkIGZyb20gSVAgKi8KKwkJCWVycm9yID0gc29ja19nZXRfdGltZXN0YW1wbnMoc2ssIGFyZ3ApOworCQkJZ290byBkb25lOwogCQljYXNlIEFUTV9TRVRTQzoKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkFUTV9TRVRTQyBpcyBvYnNvbGV0ZVxuIik7CiAJCQllcnJvciA9IDA7CmRpZmYgLS1naXQgYS9uZXQvYXRtL2xlYy5jIGIvbmV0L2F0bS9sZWMuYwppbmRleCAzZDgwNGQ2Li40ZGM1ZjJiIDEwMDY0NAotLS0gYS9uZXQvYXRtL2xlYy5jCisrKyBiL25ldC9hdG0vbGVjLmMKQEAgLTI4Myw4ICsyODMsOCBAQAogCX0KIAogCURQUklOVEsoInNrYnVmZiBoZWFkOiVseCBkYXRhOiVseCB0YWlsOiVseCBlbmQ6JWx4XG4iLAotCQkobG9uZylza2ItPmhlYWQsIChsb25nKXNrYi0+ZGF0YSwgKGxvbmcpc2tiLT50YWlsLAotCQkobG9uZylza2ItPmVuZCk7CisJCShsb25nKXNrYi0+aGVhZCwgKGxvbmcpc2tiLT5kYXRhLCAobG9uZylza2JfdGFpbF9wb2ludGVyKHNrYiksCisJCShsb25nKXNrYl9lbmRfcG9pbnRlcihza2IpKTsKICNpZiBkZWZpbmVkKENPTkZJR19CUklER0UpIHx8IGRlZmluZWQoQ09ORklHX0JSSURHRV9NT0RVTEUpCiAJaWYgKG1lbWNtcChza2ItPmRhdGEsIGJyaWRnZV91bGFfbGVjLCBzaXplb2YoYnJpZGdlX3VsYV9sZWMpKSA9PSAwKQogCQlsZWNfaGFuZGxlX2JyaWRnZShza2IsIGRldik7CkBAIC01NzYsOCArNTc2LDggQEAKIAkJCQkJYnJlYWs7CiAJCQkJfQogCQkJCXNrYjItPmxlbiA9IHNpemVvZihzdHJ1Y3QgYXRtbGVjX21zZyk7Ci0JCQkJbWVtY3B5KHNrYjItPmRhdGEsIG1lc2csCi0JCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgYXRtbGVjX21zZykpOworCQkJCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhKHNrYjIsIG1lc2csCisJCQkJCQkJc2l6ZW9mKCptZXNnKSk7CiAJCQkJYXRtX2ZvcmNlX2NoYXJnZShwcml2LT5sZWNkLCBza2IyLT50cnVlc2l6ZSk7CiAJCQkJc2sgPSBza19hdG0ocHJpdi0+bGVjZCk7CiAJCQkJc2tiX3F1ZXVlX3RhaWwoJnNrLT5za19yZWNlaXZlX3F1ZXVlLCBza2IyKTsKQEAgLTYzMCw3ICs2MzAsNyBAQAogCS5vcHMgPSAmbGVjZGV2X29wcywKIAkudHlwZSA9ICJsZWMiLAogCS5udW1iZXIgPSA5OTksCQkvKiBkdW1teSBkZXZpY2UgbnVtYmVyICovCi0JLmxvY2sgPSBTUElOX0xPQ0tfVU5MT0NLRUQKKwkubG9jayA9IF9fU1BJTl9MT0NLX1VOTE9DS0VEKGxlY2F0bV9kZXYubG9jaykKIH07CiAKIC8qCkBAIC04MjUsNyArODI1LDYgQEAKIAkJaWYgKCFobGlzdF9lbXB0eSgmcHJpdi0+bGVjX2FycF9lbXB0eV9vbmVzKSkgewogCQkJbGVjX2FycF9jaGVja19lbXB0aWVzKHByaXYsIHZjYywgc2tiKTsKIAkJfQotCQlza2ItPmRldiA9IGRldjsKIAkJc2tiX3B1bGwoc2tiLCAyKTsJLyogc2tpcCBsZWNfaWQgKi8KICNpZmRlZiBDT05GSUdfVFIKIAkJaWYgKHByaXYtPmlzX3RyZGV2KQpAQCAtMTMzOCw3ICsxMzM3LDcgQEAKIAkJaWYgKHNrYiA9PSBOVUxMKQogCQkJcmV0dXJuIC0xOwogCQlza2ItPmxlbiA9ICpzaXplb2Z0bHZzOwotCQltZW1jcHkoc2tiLT5kYXRhLCAqdGx2cywgKnNpemVvZnRsdnMpOworCQlza2JfY29weV90b19saW5lYXJfZGF0YShza2IsICp0bHZzLCAqc2l6ZW9mdGx2cyk7CiAJCXJldHZhbCA9IHNlbmRfdG9fbGVjZChwcml2LCBsX2FycF94bXQsIGRzdF9tYWMsIE5VTEwsIHNrYik7CiAJfQogCXJldHVybiByZXR2YWw7CkBAIC0xMzcyLDcgKzEzNzEsNyBAQAogCWlmIChza2IgPT0gTlVMTCkKIAkJcmV0dXJuIDA7CiAJc2tiLT5sZW4gPSBzaXplb2Z0bHZzOwotCW1lbWNweShza2ItPmRhdGEsIHRsdnMsIHNpemVvZnRsdnMpOworCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhKHNrYiwgdGx2cywgc2l6ZW9mdGx2cyk7CiAJcmV0dmFsID0gc2VuZF90b19sZWNkKHByaXYsIGxfYXNzb2NpYXRlX3JlcSwgTlVMTCwgTlVMTCwgc2tiKTsKIAlpZiAocmV0dmFsICE9IDApCiAJCXByaW50aygibGVjLmM6IGxhbmUyX2Fzc29jaWF0ZV9yZXEoKSBmYWlsZWRcbiIpOwpkaWZmIC0tZ2l0IGEvbmV0L2F0bS9tcGMuYyBiL25ldC9hdG0vbXBjLmMKaW5kZXggY2IzYzAwNC4uN2M4NWFhNSAxMDA2NDQKLS0tIGEvbmV0L2F0bS9tcGMuYworKysgYi9uZXQvYXRtL21wYy5jCkBAIC01MDQsMTEgKzUwNCwxMyBAQAogCQl0YWdnZWRfbGxjX3NuYXBfaGRyLnRhZyA9IGVudHJ5LT5jdHJsX2luZm8udGFnOwogCQlza2JfcHVsbChza2IsIEVUSF9ITEVOKTsgICAgICAgICAgICAgICAgICAgICAgIC8qIGdldCByaWQgb2YgRXRoIGhlYWRlciAqLwogCQlza2JfcHVzaChza2IsIHNpemVvZih0YWdnZWRfbGxjX3NuYXBfaGRyKSk7ICAgIC8qIGFkZCBMTEMvU05BUCBoZWFkZXIgICAqLwotCQltZW1jcHkoc2tiLT5kYXRhLCAmdGFnZ2VkX2xsY19zbmFwX2hkciwgc2l6ZW9mKHRhZ2dlZF9sbGNfc25hcF9oZHIpKTsKKwkJc2tiX2NvcHlfdG9fbGluZWFyX2RhdGEoc2tiLCAmdGFnZ2VkX2xsY19zbmFwX2hkciwKKwkJCQkJc2l6ZW9mKHRhZ2dlZF9sbGNfc25hcF9oZHIpKTsKIAl9IGVsc2UgewogCQlza2JfcHVsbChza2IsIEVUSF9ITEVOKTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBnZXQgcmlkIG9mIEV0aCBoZWFkZXIgKi8KIAkJc2tiX3B1c2goc2tiLCBzaXplb2Yoc3RydWN0IGxsY19zbmFwX2hkcikpOyAgICAgLyogYWRkIExMQy9TTkFQIGhlYWRlciArIHRhZyAgKi8KLQkJbWVtY3B5KHNrYi0+ZGF0YSwgJmxsY19zbmFwX21wb2FfZGF0YSwgc2l6ZW9mKHN0cnVjdCBsbGNfc25hcF9oZHIpKTsKKwkJc2tiX2NvcHlfdG9fbGluZWFyX2RhdGEoc2tiLCAmbGxjX3NuYXBfbXBvYV9kYXRhLAorCQkJCQlzaXplb2Yoc3RydWN0IGxsY19zbmFwX2hkcikpOwogCX0KIAogCWF0b21pY19hZGQoc2tiLT50cnVlc2l6ZSwgJnNrX2F0bShlbnRyeS0+c2hvcnRjdXQpLT5za193bWVtX2FsbG9jKTsKQEAgLTcxMSwxMSArNzEzLDEyIEBACiAJCXJldHVybjsKIAl9CiAJc2tiX3B1c2gobmV3X3NrYiwgZWctPmN0cmxfaW5mby5ESF9sZW5ndGgpOyAgICAgLyogYWRkIE1BQyBoZWFkZXIgKi8KLQltZW1jcHkobmV3X3NrYi0+ZGF0YSwgZWctPmN0cmxfaW5mby5ETExfaGVhZGVyLCBlZy0+Y3RybF9pbmZvLkRIX2xlbmd0aCk7CisJc2tiX2NvcHlfdG9fbGluZWFyX2RhdGEobmV3X3NrYiwgZWctPmN0cmxfaW5mby5ETExfaGVhZGVyLAorCQkJCWVnLT5jdHJsX2luZm8uREhfbGVuZ3RoKTsKIAluZXdfc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKG5ld19za2IsIGRldik7Ci0JbmV3X3NrYi0+bmgucmF3ID0gbmV3X3NrYi0+ZGF0YTsKKwlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIobmV3X3NrYik7CiAKLQllZy0+bGF0ZXN0X2lwX2FkZHIgPSBuZXdfc2tiLT5uaC5pcGgtPnNhZGRyOworCWVnLT5sYXRlc3RfaXBfYWRkciA9IGlwX2hkcihuZXdfc2tiKS0+c2FkZHI7CiAJZWctPnBhY2tldHNfcmN2ZCsrOwogCW1wYy0+ZWdfb3BzLT5wdXQoZWcpOwogCkBAIC03MzQsNyArNzM3LDcgQEAKIAkub3BzCT0gJm1wY19vcHMsCiAJLnR5cGUJPSAibXBjIiwKIAkubnVtYmVyCT0gNDIsCi0JLmxvY2sJPSBTUElOX0xPQ0tfVU5MT0NLRUQKKwkubG9jawk9IF9fU1BJTl9MT0NLX1VOTE9DS0VEKG1wY19kZXYubG9jaykKIAkvKiBtZW1iZXJzIG5vdCBleHBsaWNpdGx5IGluaXRpYWxpc2VkIHdpbGwgYmUgMCAqLwogfTsKIApAQCAtOTM2LDcgKzkzOSw3IEBACiAJaWYgKHNrYiA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIAlza2JfcHV0KHNrYiwgc2l6ZW9mKHN0cnVjdCBrX21lc3NhZ2UpKTsKLQltZW1jcHkoc2tiLT5kYXRhLCBtZXNnLCBzaXplb2Yoc3RydWN0IGtfbWVzc2FnZSkpOworCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhKHNrYiwgbWVzZywgc2l6ZW9mKCptZXNnKSk7CiAJYXRtX2ZvcmNlX2NoYXJnZShtcGMtPm1wb2FkX3ZjYywgc2tiLT50cnVlc2l6ZSk7CiAKIAlzayA9IHNrX2F0bShtcGMtPm1wb2FkX3ZjYyk7CmRpZmYgLS1naXQgYS9uZXQvYXRtL3NpZ25hbGluZy5jIGIvbmV0L2F0bS9zaWduYWxpbmcuYwppbmRleCAzMWQ5OGI1Li5kMTRiYWFmIDEwMDY0NAotLS0gYS9uZXQvYXRtL3NpZ25hbGluZy5jCisrKyBiL25ldC9hdG0vc2lnbmFsaW5nLmMKQEAgLTI1Niw3ICsyNTYsNyBAQAogCS5vcHMgPQkJJnNpZ2RfZGV2X29wcywKIAkudHlwZSA9CQkic2lnIiwKIAkubnVtYmVyID0JOTk5LAotCS5sb2NrID0JCVNQSU5fTE9DS19VTkxPQ0tFRAorCS5sb2NrID0JCV9fU1BJTl9MT0NLX1VOTE9DS0VEKHNpZ2RfZGV2LmxvY2spCiB9OwogCiAKZGlmZiAtLWdpdCBhL25ldC9heDI1L2FmX2F4MjUuYyBiL25ldC9heDI1L2FmX2F4MjUuYwppbmRleCAxYzA3YzZhLi42ZGVkOTUyIDEwMDY0NAotLS0gYS9uZXQvYXgyNS9hZl9heDI1LmMKKysrIGIvbmV0L2F4MjUvYWZfYXgyNS5jCkBAIC0xMTI3LDIyICsxMTI3LDIyIEBACiAJCXN3aXRjaCAoc2stPnNrX3N0YXRlKSB7CiAJCWNhc2UgVENQX1NZTl9TRU5UOiAvKiBzdGlsbCB0cnlpbmcgKi8KIAkJCWVyciA9IC1FSU5QUk9HUkVTUzsKLQkJCWdvdG8gb3V0OworCQkJZ290byBvdXRfcmVsZWFzZTsKIAogCQljYXNlIFRDUF9FU1RBQkxJU0hFRDogLyogY29ubmVjdGlvbiBlc3RhYmxpc2hlZCAqLwogCQkJc29jay0+c3RhdGUgPSBTU19DT05ORUNURUQ7Ci0JCQlnb3RvIG91dDsKKwkJCWdvdG8gb3V0X3JlbGVhc2U7CiAKIAkJY2FzZSBUQ1BfQ0xPU0U6IC8qIGNvbm5lY3Rpb24gcmVmdXNlZCAqLwogCQkJc29jay0+c3RhdGUgPSBTU19VTkNPTk5FQ1RFRDsKIAkJCWVyciA9IC1FQ09OTlJFRlVTRUQ7Ci0JCQlnb3RvIG91dDsKKwkJCWdvdG8gb3V0X3JlbGVhc2U7CiAJCX0KIAl9CiAKIAlpZiAoc2stPnNrX3N0YXRlID09IFRDUF9FU1RBQkxJU0hFRCAmJiBzay0+c2tfdHlwZSA9PSBTT0NLX1NFUVBBQ0tFVCkgewogCQllcnIgPSAtRUlTQ09OTjsJLyogTm8gcmVjb25uZWN0IG9uIGEgc2VxcGFja2V0IHNvY2tldCAqLwotCQlnb3RvIG91dDsKKwkJZ290byBvdXRfcmVsZWFzZTsKIAl9CiAKIAlzay0+c2tfc3RhdGUgICA9IFRDUF9DTE9TRTsKQEAgLTExNTksMTIgKzExNTksMTIgQEAKIAkJLyogVmFsaWQgbnVtYmVyIG9mIGRpZ2lwZWF0ZXJzID8gKi8KIAkJaWYgKGZzYS0+ZnNhX2F4MjUuc2F4MjVfbmRpZ2lzIDwgMSB8fCBmc2EtPmZzYV9heDI1LnNheDI1X25kaWdpcyA+IEFYMjVfTUFYX0RJR0lTKSB7CiAJCQllcnIgPSAtRUlOVkFMOwotCQkJZ290byBvdXQ7CisJCQlnb3RvIG91dF9yZWxlYXNlOwogCQl9CiAKIAkJaWYgKChkaWdpID0ga21hbGxvYyhzaXplb2YoYXgyNV9kaWdpKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpIHsKIAkJCWVyciA9IC1FTk9CVUZTOwotCQkJZ290byBvdXQ7CisJCQlnb3RvIG91dF9yZWxlYXNlOwogCQl9CiAKIAkJZGlnaS0+bmRpZ2kgICAgICA9IGZzYS0+ZnNhX2F4MjUuc2F4MjVfbmRpZ2lzOwpAQCAtMTE5NCw3ICsxMTk0LDcgQEAKIAkJCWN1cnJlbnQtPmNvbW0pOwogCQlpZiAoKGVyciA9IGF4MjVfcnRfYXV0b2JpbmQoYXgyNSwgJmZzYS0+ZnNhX2F4MjUuc2F4MjVfY2FsbCkpIDwgMCkgewogCQkJa2ZyZWUoZGlnaSk7Ci0JCQlnb3RvIG91dDsKKwkJCWdvdG8gb3V0X3JlbGVhc2U7CiAJCX0KIAogCQlheDI1X2ZpbGxpbl9jYihheDI1LCBheDI1LT5heDI1X2Rldik7CkBAIC0xMjAzLDcgKzEyMDMsNyBAQAogCQlpZiAoYXgyNS0+YXgyNV9kZXYgPT0gTlVMTCkgewogCQkJa2ZyZWUoZGlnaSk7CiAJCQllcnIgPSAtRUhPU1RVTlJFQUNIOwotCQkJZ290byBvdXQ7CisJCQlnb3RvIG91dF9yZWxlYXNlOwogCQl9CiAJfQogCkBAIC0xMjEzLDcgKzEyMTMsNyBAQAogCQlrZnJlZShkaWdpKTsKIAkJZXJyID0gLUVBRERSSU5VU0U7CQkvKiBBbHJlYWR5IHN1Y2ggYSBjb25uZWN0aW9uICovCiAJCWF4MjVfY2JfcHV0KGF4MjV0KTsKLQkJZ290byBvdXQ7CisJCWdvdG8gb3V0X3JlbGVhc2U7CiAJfQogCiAJYXgyNS0+ZGVzdF9hZGRyID0gZnNhLT5mc2FfYXgyNS5zYXgyNV9jYWxsOwpAQCAtMTIyMyw3ICsxMjIzLDcgQEAKIAlpZiAoc2stPnNrX3R5cGUgIT0gU09DS19TRVFQQUNLRVQpIHsKIAkJc29jay0+c3RhdGUgPSBTU19DT05ORUNURUQ7CiAJCXNrLT5za19zdGF0ZSAgID0gVENQX0VTVEFCTElTSEVEOwotCQlnb3RvIG91dDsKKwkJZ290byBvdXRfcmVsZWFzZTsKIAl9CiAKIAkvKiBNb3ZlIHRvIGNvbm5lY3Rpbmcgc29ja2V0LCBheC4yNSBsYXBiIFdBSVRfVUEuLiAqLwpAQCAtMTI1NSw1NSArMTI1NSw1MyBAQAogCS8qIE5vdyB0aGUgbG9vcCAqLwogCWlmIChzay0+c2tfc3RhdGUgIT0gVENQX0VTVEFCTElTSEVEICYmIChmbGFncyAmIE9fTk9OQkxPQ0spKSB7CiAJCWVyciA9IC1FSU5QUk9HUkVTUzsKLQkJZ290byBvdXQ7CisJCWdvdG8gb3V0X3JlbGVhc2U7CiAJfQogCiAJaWYgKHNrLT5za19zdGF0ZSA9PSBUQ1BfU1lOX1NFTlQpIHsKLQkJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OwotCQlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCB0c2spOworCQlERUZJTkVfV0FJVCh3YWl0KTsKIAotCQlhZGRfd2FpdF9xdWV1ZShzay0+c2tfc2xlZXAsICZ3YWl0KTsKIAkJZm9yICg7OykgeworCQkJcHJlcGFyZV90b193YWl0KHNrLT5za19zbGVlcCwgJndhaXQsCisJCQkgICAgICAgICAgICAgICAgVEFTS19JTlRFUlJVUFRJQkxFKTsKIAkJCWlmIChzay0+c2tfc3RhdGUgIT0gVENQX1NZTl9TRU5UKQogCQkJCWJyZWFrOwotCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJCXJlbGVhc2Vfc29jayhzayk7Ci0JCQlpZiAoIXNpZ25hbF9wZW5kaW5nKHRzaykpIHsKKwkJCWlmICghc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQlyZWxlYXNlX3NvY2soc2spOwogCQkJCXNjaGVkdWxlKCk7CiAJCQkJbG9ja19zb2NrKHNrKTsKIAkJCQljb250aW51ZTsKIAkJCX0KLQkJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOwotCQkJcmVtb3ZlX3dhaXRfcXVldWUoc2stPnNrX3NsZWVwLCAmd2FpdCk7Ci0JCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCQkJZXJyID0gLUVSRVNUQVJUU1lTOworCQkJYnJlYWs7CiAJCX0KLQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7Ci0JCXJlbW92ZV93YWl0X3F1ZXVlKHNrLT5za19zbGVlcCwgJndhaXQpOworCQlmaW5pc2hfd2FpdChzay0+c2tfc2xlZXAsICZ3YWl0KTsKKworCQlpZiAoZXJyKQorCQkJZ290byBvdXRfcmVsZWFzZTsKIAl9CiAKIAlpZiAoc2stPnNrX3N0YXRlICE9IFRDUF9FU1RBQkxJU0hFRCkgewogCQkvKiBOb3QgaW4gQUJNLCBub3QgaW4gV0FJVF9VQSAtPiBmYWlsZWQgKi8KIAkJc29jay0+c3RhdGUgPSBTU19VTkNPTk5FQ1RFRDsKIAkJZXJyID0gc29ja19lcnJvcihzayk7CS8qIEFsd2F5cyBzZXQgYXQgdGhpcyBwb2ludCAqLwotCQlnb3RvIG91dDsKKwkJZ290byBvdXRfcmVsZWFzZTsKIAl9CiAKIAlzb2NrLT5zdGF0ZSA9IFNTX0NPTk5FQ1RFRDsKIAotCWVycj0wOwotb3V0OgorCWVyciA9IDA7CitvdXRfcmVsZWFzZToKIAlyZWxlYXNlX3NvY2soc2spOwogCiAJcmV0dXJuIGVycjsKIH0KIAotCiBzdGF0aWMgaW50IGF4MjVfYWNjZXB0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrZXQgKm5ld3NvY2ssIGludCBmbGFncykKIHsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7Ci0JREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgdHNrKTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCBzb2NrICpuZXdzazsKKwlERUZJTkVfV0FJVCh3YWl0KTsKIAlzdHJ1Y3Qgc29jayAqc2s7CiAJaW50IGVyciA9IDA7CiAKQEAgLTEzMjgsMzAgKzEzMjYsMjkgQEAKIAkgKglUaGUgcmVhZCBxdWV1ZSB0aGlzIHRpbWUgaXMgaG9sZGluZyBzb2NrZXRzIHJlYWR5IHRvIHVzZQogCSAqCWhvb2tlZCBpbnRvIHRoZSBTQUJNIHdlIHNhdmVkCiAJICovCi0JYWRkX3dhaXRfcXVldWUoc2stPnNrX3NsZWVwLCAmd2FpdCk7CiAJZm9yICg7OykgeworCQlwcmVwYXJlX3RvX3dhaXQoc2stPnNrX3NsZWVwLCAmd2FpdCwgVEFTS19JTlRFUlJVUFRJQkxFKTsKIAkJc2tiID0gc2tiX2RlcXVldWUoJnNrLT5za19yZWNlaXZlX3F1ZXVlKTsKIAkJaWYgKHNrYikKIAkJCWJyZWFrOwogCi0JCXJlbGVhc2Vfc29jayhzayk7Ci0JCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOwogCQlpZiAoZmxhZ3MgJiBPX05PTkJMT0NLKSB7Ci0JCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKLQkJCXJlbW92ZV93YWl0X3F1ZXVlKHNrLT5za19zbGVlcCwgJndhaXQpOwotCQkJcmV0dXJuIC1FV09VTERCTE9DSzsKKwkJCWVyciA9IC1FV09VTERCTE9DSzsKKwkJCWJyZWFrOwogCQl9Ci0JCWlmICghc2lnbmFsX3BlbmRpbmcodHNrKSkgeworCQlpZiAoIXNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlyZWxlYXNlX3NvY2soc2spOwogCQkJc2NoZWR1bGUoKTsKIAkJCWxvY2tfc29jayhzayk7CiAJCQljb250aW51ZTsKIAkJfQotCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKLQkJcmVtb3ZlX3dhaXRfcXVldWUoc2stPnNrX3NsZWVwLCAmd2FpdCk7Ci0JCXJldHVybiAtRVJFU1RBUlRTWVM7CisJCWVyciA9IC1FUkVTVEFSVFNZUzsKKwkJYnJlYWs7CiAJfQotCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOwotCXJlbW92ZV93YWl0X3F1ZXVlKHNrLT5za19zbGVlcCwgJndhaXQpOworCWZpbmlzaF93YWl0KHNrLT5za19zbGVlcCwgJndhaXQpOworCisJaWYgKGVycikKKwkJZ290byBvdXQ7CiAKIAluZXdzawkJID0gc2tiLT5zazsKIAluZXdzay0+c2tfc29ja2V0ID0gbmV3c29jazsKQEAgLTE0MjUsNyArMTQyMiw2IEBACiAJc3RydWN0IHNvY2thZGRyX2F4MjUgc2F4OwogCXN0cnVjdCBza19idWZmICpza2I7CiAJYXgyNV9kaWdpIGR0bXAsICpkcDsKLQl1bnNpZ25lZCBjaGFyICphc21wdHI7CiAJYXgyNV9jYiAqYXgyNTsKIAlzaXplX3Qgc2l6ZTsKIAlpbnQgbHYsIGVyciwgYWRkcl9sZW4gPSBtc2ctPm1zZ19uYW1lbGVuOwpAQCAtMTU0OCwxMyArMTU0NCwxMSBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlza2ItPm5oLnJhdyA9IHNrYi0+ZGF0YTsKKwlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiKTsKIAogCS8qIEFkZCB0aGUgUElEIGlmIG9uZSBpcyBub3Qgc3VwcGxpZWQgYnkgdGhlIHVzZXIgaW4gdGhlIHNrYiAqLwotCWlmICghYXgyNS0+cGlkaW5jbCkgewotCQlhc21wdHIgID0gc2tiX3B1c2goc2tiLCAxKTsKLQkJKmFzbXB0ciA9IHNrLT5za19wcm90b2NvbDsKLQl9CisJaWYgKCFheDI1LT5waWRpbmNsKQorCQkqc2tiX3B1c2goc2tiLCAxKSA9IHNrLT5za19wcm90b2NvbDsKIAogCVNPQ0tfREVCVUcoc2ssICJBWC4yNTogVHJhbnNtaXR0aW5nIGJ1ZmZlclxuIik7CiAKQEAgLTE1NzMsNyArMTU2Nyw3IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCWFzbXB0ciA9IHNrYl9wdXNoKHNrYiwgMSArIGF4MjVfYWRkcl9zaXplKGRwKSk7CisJc2tiX3B1c2goc2tiLCAxICsgYXgyNV9hZGRyX3NpemUoZHApKTsKIAogCVNPQ0tfREVCVUcoc2ssICJCdWlsZGluZyBBWC4yNSBIZWFkZXIgKGRwPSVwKS5cbiIsIGRwKTsKIApAQCAtMTU4MSwxNyArMTU3NSwxNyBAQAogCQlTT0NLX0RFQlVHKHNrLCAiTnVtIGRpZ2lwZWF0ZXJzPSVkXG4iLCBkcC0+bmRpZ2kpOwogCiAJLyogQnVpbGQgYW4gQVguMjUgaGVhZGVyICovCi0JYXNtcHRyICs9IChsdiA9IGF4MjVfYWRkcl9idWlsZChhc21wdHIsICZheDI1LT5zb3VyY2VfYWRkciwKLQkJCQkJJnNheC5zYXgyNV9jYWxsLCBkcCwKLQkJCQkJQVgyNV9DT01NQU5ELCBBWDI1X01PRFVMVVMpKTsKKwlsdiA9IGF4MjVfYWRkcl9idWlsZChza2ItPmRhdGEsICZheDI1LT5zb3VyY2VfYWRkciwgJnNheC5zYXgyNV9jYWxsLAorCQkJICAgICBkcCwgQVgyNV9DT01NQU5ELCBBWDI1X01PRFVMVVMpOwogCiAJU09DS19ERUJVRyhzaywgIkJ1aWx0IGhlYWRlciAoJWQgYnl0ZXMpXG4iLGx2KTsKIAotCXNrYi0+aC5yYXcgPSBhc21wdHI7CisJc2tiX3NldF90cmFuc3BvcnRfaGVhZGVyKHNrYiwgbHYpOwogCi0JU09DS19ERUJVRyhzaywgImJhc2U9JXAgcG9zPSVwXG4iLCBza2ItPmRhdGEsIGFzbXB0cik7CisJU09DS19ERUJVRyhzaywgImJhc2U9JXAgcG9zPSVwXG4iLAorCQkgICBza2ItPmRhdGEsIHNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYikpOwogCi0JKmFzbXB0ciA9IEFYMjVfVUk7CisJKnNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYikgPSBBWDI1X1VJOwogCiAJLyogRGF0YWdyYW0gZnJhbWVzIGdvIHN0cmFpZ2h0IG91dCBvZiB0aGUgZG9vciBhcyBVSSAqLwogCWF4MjVfcXVldWVfeG1pdChza2IsIGF4MjUtPmF4MjVfZGV2LT5kZXYpOwpAQCAtMTYzMSw4ICsxNjI1LDggQEAKIAlpZiAoIWF4MjVfc2soc2spLT5waWRpbmNsKQogCQlza2JfcHVsbChza2IsIDEpOwkJLyogUmVtb3ZlIFBJRCAqLwogCi0Jc2tiLT5oLnJhdyA9IHNrYi0+ZGF0YTsKLQljb3BpZWQgICAgID0gc2tiLT5sZW47CisJc2tiX3Jlc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKKwljb3BpZWQgPSBza2ItPmxlbjsKIAogCWlmIChjb3BpZWQgPiBzaXplKSB7CiAJCWNvcGllZCA9IHNpemU7CkBAIC0xNjQ1LDkgKzE2MzksMTAgQEAKIAkJc3RydWN0IHNvY2thZGRyX2F4MjUgKnNheCA9IChzdHJ1Y3Qgc29ja2FkZHJfYXgyNSAqKW1zZy0+bXNnX25hbWU7CiAJCWF4MjVfZGlnaSBkaWdpOwogCQlheDI1X2FkZHJlc3Mgc3JjOworCQljb25zdCB1bnNpZ25lZCBjaGFyICptYWMgPSBza2JfbWFjX2hlYWRlcihza2IpOwogCi0JCWF4MjVfYWRkcl9wYXJzZShza2ItPm1hYy5yYXcrMSwgc2tiLT5kYXRhLXNrYi0+bWFjLnJhdy0xLCAmc3JjLCBOVUxMLCAmZGlnaSwgTlVMTCwgTlVMTCk7Ci0KKwkJYXgyNV9hZGRyX3BhcnNlKG1hYyArIDEsIHNrYi0+ZGF0YSAtIG1hYyAtIDEsICZzcmMsIE5VTEwsCisJCQkJJmRpZ2ksIE5VTEwsIE5VTEwpOwogCQlzYXgtPnNheDI1X2ZhbWlseSA9IEFGX0FYMjU7CiAJCS8qIFdlIHNldCB0aGlzIGNvcnJlY3RseSwgZXZlbiB0aG91Z2ggd2UgbWF5IG5vdCBsZXQgdGhlCiAJCSAgIGFwcGxpY2F0aW9uIGtub3cgdGhlIGRpZ2kgY2FsbHMgZnVydGhlciBkb3duIChiZWNhdXNlIGl0CkBAIC0xNzExLDYgKzE3MDYsMTAgQEAKIAkJcmVzID0gc29ja19nZXRfdGltZXN0YW1wKHNrLCBhcmdwKTsKIAkJYnJlYWs7CiAKKwljYXNlIFNJT0NHU1RBTVBOUzoKKwkJcmVzID0gc29ja19nZXRfdGltZXN0YW1wbnMoc2ssIGFyZ3ApOworCQlicmVhazsKKwogCWNhc2UgU0lPQ0FYMjVBRERVSUQ6CS8qIEFkZCBhIHVpZCB0byB0aGUgdWlkL2NhbGwgbWFwIHRhYmxlICovCiAJY2FzZSBTSU9DQVgyNURFTFVJRDoJLyogRGVsZXRlIGEgdWlkIGZyb20gdGhlIHVpZC9jYWxsIG1hcCB0YWJsZSAqLwogCWNhc2UgU0lPQ0FYMjVHRVRVSUQ6IHsKZGlmZiAtLWdpdCBhL25ldC9heDI1L2F4MjVfZHNfc3Vici5jIGIvbmV0L2F4MjUvYXgyNV9kc19zdWJyLmMKaW5kZXggOTU2OWRkMy4uYTQ5NzczZiAxMDA2NDQKLS0tIGEvbmV0L2F4MjUvYXgyNV9kc19zdWJyLmMKKysrIGIvbmV0L2F4MjUvYXgyNV9kc19zdWJyLmMKQEAgLTEzNiw3ICsxMzYsNyBAQAogCWlmICgoc2tiID0gYWxsb2Nfc2tiKDIsIEdGUF9BVE9NSUMpKSA9PSBOVUxMKQogCQlyZXR1cm47CiAKLQlza2ItPm5oLnJhdyA9IHNrYi0+ZGF0YTsKKwlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiKTsKIAlwID0gc2tiX3B1dChza2IsIDIpOwogCiAJKnArKyA9IGNtZDsKZGlmZiAtLWdpdCBhL25ldC9heDI1L2F4MjVfaW4uYyBiL25ldC9heDI1L2F4MjVfaW4uYwppbmRleCA0YTZiMjZiLi4wZGRhZmYwIDEwMDY0NAotLS0gYS9uZXQvYXgyNS9heDI1X2luLmMKKysrIGIvbmV0L2F4MjUvYXgyNV9pbi5jCkBAIC02MSwxMiArNjEsMTQgQEAKIAkJCQkJc2tiX3Jlc2VydmUoc2tibiwgQVgyNV9NQVhfSEVBREVSX0xFTik7CiAKIAkJCQkJc2tibi0+ZGV2ICAgPSBheDI1LT5heDI1X2Rldi0+ZGV2OwotCQkJCQlza2JuLT5oLnJhdyA9IHNrYm4tPmRhdGE7Ci0JCQkJCXNrYm4tPm5oLnJhdyA9IHNrYm4tPmRhdGE7CisJCQkJCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2JuKTsKKwkJCQkJc2tiX3Jlc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tibik7CiAKIAkJCQkJLyogQ29weSBkYXRhIGZyb20gdGhlIGZyYWdtZW50cyAqLwogCQkJCQl3aGlsZSAoKHNrYm8gPSBza2JfZGVxdWV1ZSgmYXgyNS0+ZnJhZ19xdWV1ZSkpICE9IE5VTEwpIHsKLQkJCQkJCW1lbWNweShza2JfcHV0KHNrYm4sIHNrYm8tPmxlbiksIHNrYm8tPmRhdGEsIHNrYm8tPmxlbik7CisJCQkJCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYm8sCisJCQkJCQkJICBza2JfcHV0KHNrYm4sIHNrYm8tPmxlbiksCisJCQkJCQkJCQkgIHNrYm8tPmxlbik7CiAJCQkJCQlrZnJlZV9za2Ioc2tibyk7CiAJCQkJCX0KIApAQCAtMTIyLDggKzEyNCw4IEBACiAJCX0KIAogCQlza2JfcHVsbChza2IsIDEpOwkvKiBSZW1vdmUgUElEICovCi0JCXNrYi0+bWFjLnJhdyAgPSBza2ItPm5oLnJhdzsKLQkJc2tiLT5uaC5yYXcgICA9IHNrYi0+ZGF0YTsKKwkJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKKwkJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CiAJCXNrYi0+ZGV2ICAgICAgPSBheDI1LT5heDI1X2Rldi0+ZGV2OwogCQlza2ItPnBrdF90eXBlID0gUEFDS0VUX0hPU1Q7CiAJCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUCk7CkBAIC0xOTYsNyArMTk4LDcgQEAKIAkgKglQcm9jZXNzIHRoZSBBWC4yNS9MQVBCIGZyYW1lLgogCSAqLwogCi0Jc2tiLT5oLnJhdyA9IHNrYi0+ZGF0YTsKKwlza2JfcmVzZXRfdHJhbnNwb3J0X2hlYWRlcihza2IpOwogCiAJaWYgKChheDI1X2RldiA9IGF4MjVfZGV2X2F4MjVkZXYoZGV2KSkgPT0gTlVMTCkgewogCQlrZnJlZV9za2Ioc2tiKTsKQEAgLTIzMyw3ICsyMzUsNyBAQAogCiAJLyogVUkgZnJhbWUgLSBieXBhc3MgTEFQQiBwcm9jZXNzaW5nICovCiAJaWYgKCgqc2tiLT5kYXRhICYgfjB4MTApID09IEFYMjVfVUkgJiYgZHAubGFzdHJlcGVhdCArIDEgPT0gZHAubmRpZ2kpIHsKLQkJc2tiLT5oLnJhdyA9IHNrYi0+ZGF0YSArIDI7CQkvKiBza2lwIGNvbnRyb2wgYW5kIHBpZCAqLworCQlza2Jfc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiLCAyKTsgLyogc2tpcCBjb250cm9sIGFuZCBwaWQgKi8KIAogCQlheDI1X3NlbmRfdG9fcmF3KCZkZXN0LCBza2IsIHNrYi0+ZGF0YVsxXSk7CiAKQEAgLTI0Niw4ICsyNDgsOCBAQAogCQlzd2l0Y2ggKHNrYi0+ZGF0YVsxXSkgewogCQljYXNlIEFYMjVfUF9JUDoKIAkJCXNrYl9wdWxsKHNrYiwyKTsJCS8qIGRyb3AgUElEL0NUUkwgKi8KLQkJCXNrYi0+aC5yYXcgICAgPSBza2ItPmRhdGE7Ci0JCQlza2ItPm5oLnJhdyAgID0gc2tiLT5kYXRhOworCQkJc2tiX3Jlc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKKwkJCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOwogCQkJc2tiLT5kZXYgICAgICA9IGRldjsKIAkJCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfSE9TVDsKIAkJCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUCk7CkBAIC0yNTYsOCArMjU4LDggQEAKIAogCQljYXNlIEFYMjVfUF9BUlA6CiAJCQlza2JfcHVsbChza2IsMik7Ci0JCQlza2ItPmgucmF3ICAgID0gc2tiLT5kYXRhOwotCQkJc2tiLT5uaC5yYXcgICA9IHNrYi0+ZGF0YTsKKwkJCXNrYl9yZXNldF90cmFuc3BvcnRfaGVhZGVyKHNrYik7CisJCQlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiKTsKIAkJCXNrYi0+ZGV2ICAgICAgPSBkZXY7CiAJCQlza2ItPnBrdF90eXBlID0gUEFDS0VUX0hPU1Q7CiAJCQlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfQVJQKTsKZGlmZiAtLWdpdCBhL25ldC9heDI1L2F4MjVfaXAuYyBiL25ldC9heDI1L2F4MjVfaXAuYwppbmRleCA3ZjgxOGJiLi45MzBlNDkxIDEwMDY0NAotLS0gYS9uZXQvYXgyNS9heDI1X2lwLmMKKysrIGIvbmV0L2F4MjUvYXgyNV9pcC5jCkBAIC0xMjEsNyArMTIxLDcgQEAKIAkJZGlnaXBlYXQgPSByb3V0ZS0+ZGlnaXBlYXQ7CiAJCWRldiA9IHJvdXRlLT5kZXY7CiAJCWlwX21vZGUgPSByb3V0ZS0+aXBfbW9kZTsKLQl9OworCX0KIAogCWlmIChkZXYgPT0gTlVMTCkKIAkJZGV2ID0gc2tiLT5kZXY7CkBAIC0xNzEsNyArMTcxLDcgQEAKIAkJCXNyY19jID0gKihheDI1X2FkZHJlc3MgKikoYnAgKyA4KTsKIAogCQkJc2tiX3B1bGwob3Vyc2tiLCBBWDI1X0hFQURFUl9MRU4gLSAxKTsJLyogS2VlcCBQSUQgKi8KLQkJCW91cnNrYi0+bmgucmF3ID0gb3Vyc2tiLT5kYXRhOworCQkJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKG91cnNrYik7CiAKIAkJCWF4MjU9YXgyNV9zZW5kX2ZyYW1lKAogCQkJICAgIG91cnNrYiwKZGlmZiAtLWdpdCBhL25ldC9heDI1L2F4MjVfb3V0LmMgYi9uZXQvYXgyNS9heDI1X291dC5jCmluZGV4IDIyMzgzNTAuLjkyYjUxN2EgMTAwNjQ0Ci0tLSBhL25ldC9heDI1L2F4MjVfb3V0LmMKKysrIGIvbmV0L2F4MjUvYXgyNV9vdXQuYwpAQCAtMTQ4LDggKzE0OCw5IEBACiAKIAkJCWlmIChrYTlxZnJhZyA9PSAxKSB7CiAJCQkJc2tiX3Jlc2VydmUoc2tibiwgZnJvbnRsZW4gKyAyKTsKLQkJCQlza2JuLT5uaC5yYXcgPSBza2JuLT5kYXRhICsgKHNrYi0+bmgucmF3IC0gc2tiLT5kYXRhKTsKLQkJCQltZW1jcHkoc2tiX3B1dChza2JuLCBsZW4pLCBza2ItPmRhdGEsIGxlbik7CisJCQkJc2tiX3NldF9uZXR3b3JrX2hlYWRlcihza2JuLAorCQkJCQkJICAgICAgc2tiX25ldHdvcmtfb2Zmc2V0KHNrYikpOworCQkJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCBza2JfcHV0KHNrYm4sIGxlbiksIGxlbik7CiAJCQkJcCA9IHNrYl9wdXNoKHNrYm4sIDIpOwogCiAJCQkJKnArKyA9IEFYMjVfUF9TRUdNRU5UOwpAQCAtMTYxLDggKzE2Miw5IEBACiAJCQkJfQogCQkJfSBlbHNlIHsKIAkJCQlza2JfcmVzZXJ2ZShza2JuLCBmcm9udGxlbiArIDEpOwotCQkJCXNrYm4tPm5oLnJhdyA9IHNrYm4tPmRhdGEgKyAoc2tiLT5uaC5yYXcgLSBza2ItPmRhdGEpOwotCQkJCW1lbWNweShza2JfcHV0KHNrYm4sIGxlbiksIHNrYi0+ZGF0YSwgbGVuKTsKKwkJCQlza2Jfc2V0X25ldHdvcmtfaGVhZGVyKHNrYm4sCisJCQkJCQkgICAgICBza2JfbmV0d29ya19vZmZzZXQoc2tiKSk7CisJCQkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIHNrYl9wdXQoc2tibiwgbGVuKSwgbGVuKTsKIAkJCQlwID0gc2tiX3B1c2goc2tibiwgMSk7CiAJCQkJKnAgPSBBWDI1X1BfVEVYVDsKIAkJCX0KQEAgLTIwNSw3ICsyMDcsNyBAQAogCWlmIChza2IgPT0gTlVMTCkKIAkJcmV0dXJuOwogCi0Jc2tiLT5uaC5yYXcgPSBza2ItPmRhdGE7CisJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CiAKIAlpZiAoYXgyNS0+bW9kdWx1cyA9PSBBWDI1X01PRFVMVVMpIHsKIAkJZnJhbWUgPSBza2JfcHVzaChza2IsIDEpOwpkaWZmIC0tZ2l0IGEvbmV0L2F4MjUvYXgyNV9zdWJyLmMgYi9uZXQvYXgyNS9heDI1X3N1YnIuYwppbmRleCBiNmM1NzdlLi41ZmU5YjJhIDEwMDY0NAotLS0gYS9uZXQvYXgyNS9heDI1X3N1YnIuYworKysgYi9uZXQvYXgyNS9heDI1X3N1YnIuYwpAQCAtMTYyLDcgKzE2Miw3IEBACiAKIAlza2JfcmVzZXJ2ZShza2IsIGF4MjUtPmF4MjVfZGV2LT5kZXYtPmhhcmRfaGVhZGVyX2xlbik7CiAKLQlza2ItPm5oLnJhdyA9IHNrYi0+ZGF0YTsKKwlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiKTsKIAogCS8qIEFzc3VtZSBhIHJlc3BvbnNlIC0gYWRkcmVzcyBzdHJ1Y3R1cmUgZm9yIERURSAqLwogCWlmIChheDI1LT5tb2R1bHVzID09IEFYMjVfTU9EVUxVUykgewpAQCAtMjA1LDcgKzIwNSw3IEBACiAJCXJldHVybjsJLyogTmV4dCBTQUJNIHdpbGwgZ2V0IERNJ2QgKi8KIAogCXNrYl9yZXNlcnZlKHNrYiwgZGV2LT5oYXJkX2hlYWRlcl9sZW4pOwotCXNrYi0+bmgucmF3ID0gc2tiLT5kYXRhOworCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOwogCiAJYXgyNV9kaWdpX2ludmVydChkaWdpLCAmcmV0ZGlnaSk7CiAKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvYWZfYmx1ZXRvb3RoLmMgYi9uZXQvYmx1ZXRvb3RoL2FmX2JsdWV0b290aC5jCmluZGV4IGM3MjI4Y2YuLmQ5NDJiOTQgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvYWZfYmx1ZXRvb3RoLmMKKysrIGIvbmV0L2JsdWV0b290aC9hZl9ibHVldG9vdGguYwpAQCAtMjIxLDcgKzIyMSw3IEBACiAJCWNvcGllZCA9IGxlbjsKIAl9CiAKLQlza2ItPmgucmF3ID0gc2tiLT5kYXRhOworCXNrYl9yZXNldF90cmFuc3BvcnRfaGVhZGVyKHNrYik7CiAJZXJyID0gc2tiX2NvcHlfZGF0YWdyYW1faW92ZWMoc2tiLCAwLCBtc2ctPm1zZ19pb3YsIGNvcGllZCk7CiAKIAlza2JfZnJlZV9kYXRhZ3JhbShzaywgc2tiKTsKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvYm5lcC9jb3JlLmMgYi9uZXQvYmx1ZXRvb3RoL2JuZXAvY29yZS5jCmluZGV4IGI4NWQxNDkuLmFiMmRiNTUgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvYm5lcC9jb3JlLmMKKysrIGIvbmV0L2JsdWV0b290aC9ibmVwL2NvcmUuYwpAQCAtMzI2LDcgKzMyNiw3IEBACiAJCXJldHVybiAwOwogCX0KIAotCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKwlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwogCiAJLyogVmVyaWZ5IGFuZCBwdWxsIG91dCBoZWFkZXIgKi8KIAlpZiAoIXNrYl9wdWxsKHNrYiwgX19ibmVwX3J4X2hsZW5bdHlwZSAmIEJORVBfVFlQRV9NQVNLXSkpCkBAIC0zNjQsMjYgKzM2NCwyOCBAQAogCiAJY2FzZSBCTkVQX0NPTVBSRVNTRURfU1JDX09OTFk6CiAJCW1lbWNweShfX3NrYl9wdXQobnNrYiwgRVRIX0FMRU4pLCBzLT5laC5oX2Rlc3QsIEVUSF9BTEVOKTsKLQkJbWVtY3B5KF9fc2tiX3B1dChuc2tiLCBFVEhfQUxFTiksIHNrYi0+bWFjLnJhdywgRVRIX0FMRU4pOworCQltZW1jcHkoX19za2JfcHV0KG5za2IsIEVUSF9BTEVOKSwgc2tiX21hY19oZWFkZXIoc2tiKSwgRVRIX0FMRU4pOwogCQlwdXRfdW5hbGlnbmVkKHMtPmVoLmhfcHJvdG8sIChfX2JlMTYgKikgX19za2JfcHV0KG5za2IsIDIpKTsKIAkJYnJlYWs7CiAKIAljYXNlIEJORVBfQ09NUFJFU1NFRF9EU1RfT05MWToKLQkJbWVtY3B5KF9fc2tiX3B1dChuc2tiLCBFVEhfQUxFTiksIHNrYi0+bWFjLnJhdywgRVRIX0FMRU4pOwotCQltZW1jcHkoX19za2JfcHV0KG5za2IsIEVUSF9BTEVOICsgMiksIHMtPmVoLmhfc291cmNlLCBFVEhfQUxFTiArIDIpOworCQltZW1jcHkoX19za2JfcHV0KG5za2IsIEVUSF9BTEVOKSwgc2tiX21hY19oZWFkZXIoc2tiKSwKKwkJICAgICAgIEVUSF9BTEVOKTsKKwkJbWVtY3B5KF9fc2tiX3B1dChuc2tiLCBFVEhfQUxFTiArIDIpLCBzLT5laC5oX3NvdXJjZSwKKwkJICAgICAgIEVUSF9BTEVOICsgMik7CiAJCWJyZWFrOwogCiAJY2FzZSBCTkVQX0dFTkVSQUw6Ci0JCW1lbWNweShfX3NrYl9wdXQobnNrYiwgRVRIX0FMRU4gKiAyKSwgc2tiLT5tYWMucmF3LCBFVEhfQUxFTiAqIDIpOworCQltZW1jcHkoX19za2JfcHV0KG5za2IsIEVUSF9BTEVOICogMiksIHNrYl9tYWNfaGVhZGVyKHNrYiksCisJCSAgICAgICBFVEhfQUxFTiAqIDIpOwogCQlwdXRfdW5hbGlnbmVkKHMtPmVoLmhfcHJvdG8sIChfX2JlMTYgKikgX19za2JfcHV0KG5za2IsIDIpKTsKIAkJYnJlYWs7CiAJfQogCi0JbWVtY3B5KF9fc2tiX3B1dChuc2tiLCBza2ItPmxlbiksIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCBfX3NrYl9wdXQobnNrYiwgc2tiLT5sZW4pLCBza2ItPmxlbik7CiAJa2ZyZWVfc2tiKHNrYik7CiAKIAlzLT5zdGF0cy5yeF9wYWNrZXRzKys7Ci0JbnNrYi0+ZGV2ICAgICAgID0gZGV2OwogCW5za2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CiAJbnNrYi0+cHJvdG9jb2wgID0gZXRoX3R5cGVfdHJhbnMobnNrYiwgZGV2KTsKIAluZXRpZl9yeF9uaShuc2tiKTsKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvY210cC9jb3JlLmMgYi9uZXQvYmx1ZXRvb3RoL2NtdHAvY29yZS5jCmluZGV4IDM5MzM2MDguLjY2YmVmMWMgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvY210cC9jb3JlLmMKKysrIGIvbmV0L2JsdWV0b290aC9jbXRwL2NvcmUuYwpAQCAtMTI0LDcgKzEyNCw3IEBACiAJfQogCiAJaWYgKHNrYiAmJiAoc2tiLT5sZW4gPiAwKSkKLQkJbWVtY3B5KHNrYl9wdXQobnNrYiwgc2tiLT5sZW4pLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIHNrYl9wdXQobnNrYiwgc2tiLT5sZW4pLCBza2ItPmxlbik7CiAKIAltZW1jcHkoc2tiX3B1dChuc2tiLCBjb3VudCksIGJ1ZiwgY291bnQpOwogCkBAIC0yNTYsNyArMjU2LDcgQEAKIAkJCWhkclsyXSA9IHNpemUgPj4gODsKIAkJfQogCi0JCW1lbWNweShza2JfcHV0KG5za2IsIHNpemUpLCBza2ItPmRhdGEsIHNpemUpOworCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgc2tiX3B1dChuc2tiLCBzaXplKSwgc2l6ZSk7CiAJCXNrYl9wdWxsKHNrYiwgc2l6ZSk7CiAKIAkJaWYgKHNrYi0+bGVuID4gMCkgewpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9oY2lfY29ubi5jIGIvbmV0L2JsdWV0b290aC9oY2lfY29ubi5jCmluZGV4IGYzNDAzZmQuLjYzOTgwYmQgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvaGNpX2Nvbm4uYworKysgYi9uZXQvYmx1ZXRvb3RoL2hjaV9jb25uLmMKQEAgLTcyLDExICs3MiwxMSBAQAogCQkJaW5xdWlyeV9lbnRyeV9hZ2UoaWUpIDw9IElOUVVJUllfRU5UUllfQUdFX01BWCkgewogCQljcC5wc2Nhbl9yZXBfbW9kZSA9IGllLT5kYXRhLnBzY2FuX3JlcF9tb2RlOwogCQljcC5wc2Nhbl9tb2RlICAgICA9IGllLT5kYXRhLnBzY2FuX21vZGU7Ci0JCWNwLmNsb2NrX29mZnNldCAgID0gaWUtPmRhdGEuY2xvY2tfb2Zmc2V0IHwgX19jcHVfdG9fbGUxNigweDgwMDApOworCQljcC5jbG9ja19vZmZzZXQgICA9IGllLT5kYXRhLmNsb2NrX29mZnNldCB8IGNwdV90b19sZTE2KDB4ODAwMCk7CiAJCW1lbWNweShjb25uLT5kZXZfY2xhc3MsIGllLT5kYXRhLmRldl9jbGFzcywgMyk7CiAJfQogCi0JY3AucGt0X3R5cGUgPSBfX2NwdV90b19sZTE2KGhkZXYtPnBrdF90eXBlICYgQUNMX1BUWVBFX01BU0spOworCWNwLnBrdF90eXBlID0gY3B1X3RvX2xlMTYoaGRldi0+cGt0X3R5cGUgJiBBQ0xfUFRZUEVfTUFTSyk7CiAJaWYgKGxtcF9yc3dpdGNoX2NhcGFibGUoaGRldikgJiYgIShoZGV2LT5saW5rX21vZGUgJiBIQ0lfTE1fTUFTVEVSKSkKIAkJY3Aucm9sZV9zd2l0Y2gJPSAweDAxOwogCWVsc2UKQEAgLTEwNyw3ICsxMDcsNyBAQAogCiAJY29ubi0+c3RhdGUgPSBCVF9ESVNDT05OOwogCi0JY3AuaGFuZGxlID0gX19jcHVfdG9fbGUxNihjb25uLT5oYW5kbGUpOworCWNwLmhhbmRsZSA9IGNwdV90b19sZTE2KGNvbm4tPmhhbmRsZSk7CiAJY3AucmVhc29uID0gcmVhc29uOwogCWhjaV9zZW5kX2NtZChjb25uLT5oZGV2LCBPR0ZfTElOS19DVEwsCiAJCQkJT0NGX0RJU0NPTk5FQ1QsIHNpemVvZihjcCksICZjcCk7CkBAIC0xMjMsOCArMTIzLDggQEAKIAljb25uLT5zdGF0ZSA9IEJUX0NPTk5FQ1Q7CiAJY29ubi0+b3V0ID0gMTsKIAotCWNwLnBrdF90eXBlID0gX19jcHVfdG9fbGUxNihoZGV2LT5wa3RfdHlwZSAmIFNDT19QVFlQRV9NQVNLKTsKLQljcC5oYW5kbGUgICA9IF9fY3B1X3RvX2xlMTYoaGFuZGxlKTsKKwljcC5wa3RfdHlwZSA9IGNwdV90b19sZTE2KGhkZXYtPnBrdF90eXBlICYgU0NPX1BUWVBFX01BU0spOworCWNwLmhhbmRsZSAgID0gY3B1X3RvX2xlMTYoaGFuZGxlKTsKIAogCWhjaV9zZW5kX2NtZChoZGV2LCBPR0ZfTElOS19DVEwsIE9DRl9BRERfU0NPLCBzaXplb2YoY3ApLCAmY3ApOwogfQpAQCAtMzQ4LDcgKzM0OCw3IEBACiAKIAlpZiAoIXRlc3RfYW5kX3NldF9iaXQoSENJX0NPTk5fQVVUSF9QRU5ELCAmY29ubi0+cGVuZCkpIHsKIAkJc3RydWN0IGhjaV9jcF9hdXRoX3JlcXVlc3RlZCBjcDsKLQkJY3AuaGFuZGxlID0gX19jcHVfdG9fbGUxNihjb25uLT5oYW5kbGUpOworCQljcC5oYW5kbGUgPSBjcHVfdG9fbGUxNihjb25uLT5oYW5kbGUpOwogCQloY2lfc2VuZF9jbWQoY29ubi0+aGRldiwgT0dGX0xJTktfQ1RMLCBPQ0ZfQVVUSF9SRVFVRVNURUQsIHNpemVvZihjcCksICZjcCk7CiAJfQogCXJldHVybiAwOwpAQCAtMzY4LDcgKzM2OCw3IEBACiAKIAlpZiAoaGNpX2Nvbm5fYXV0aChjb25uKSkgewogCQlzdHJ1Y3QgaGNpX2NwX3NldF9jb25uX2VuY3J5cHQgY3A7Ci0JCWNwLmhhbmRsZSAgPSBfX2NwdV90b19sZTE2KGNvbm4tPmhhbmRsZSk7CisJCWNwLmhhbmRsZSAgPSBjcHVfdG9fbGUxNihjb25uLT5oYW5kbGUpOwogCQljcC5lbmNyeXB0ID0gMTsKIAkJaGNpX3NlbmRfY21kKGNvbm4tPmhkZXYsIE9HRl9MSU5LX0NUTCwgT0NGX1NFVF9DT05OX0VOQ1JZUFQsIHNpemVvZihjcCksICZjcCk7CiAJfQpAQCAtMzgzLDcgKzM4Myw3IEBACiAKIAlpZiAoIXRlc3RfYW5kX3NldF9iaXQoSENJX0NPTk5fQVVUSF9QRU5ELCAmY29ubi0+cGVuZCkpIHsKIAkJc3RydWN0IGhjaV9jcF9jaGFuZ2VfY29ubl9saW5rX2tleSBjcDsKLQkJY3AuaGFuZGxlID0gX19jcHVfdG9fbGUxNihjb25uLT5oYW5kbGUpOworCQljcC5oYW5kbGUgPSBjcHVfdG9fbGUxNihjb25uLT5oYW5kbGUpOwogCQloY2lfc2VuZF9jbWQoY29ubi0+aGRldiwgT0dGX0xJTktfQ1RMLCBPQ0ZfQ0hBTkdFX0NPTk5fTElOS19LRVksIHNpemVvZihjcCksICZjcCk7CiAJfQogCXJldHVybiAwOwpAQCAtNDIzLDcgKzQyMyw3IEBACiAKIAlpZiAoIXRlc3RfYW5kX3NldF9iaXQoSENJX0NPTk5fTU9ERV9DSEFOR0VfUEVORCwgJmNvbm4tPnBlbmQpKSB7CiAJCXN0cnVjdCBoY2lfY3BfZXhpdF9zbmlmZl9tb2RlIGNwOwotCQljcC5oYW5kbGUgPSBfX2NwdV90b19sZTE2KGNvbm4tPmhhbmRsZSk7CisJCWNwLmhhbmRsZSA9IGNwdV90b19sZTE2KGNvbm4tPmhhbmRsZSk7CiAJCWhjaV9zZW5kX2NtZChoZGV2LCBPR0ZfTElOS19QT0xJQ1ksCiAJCQkJT0NGX0VYSVRfU05JRkZfTU9ERSwgc2l6ZW9mKGNwKSwgJmNwKTsKIAl9CkBAIC00NTIsMjEgKzQ1MiwyMSBAQAogCiAJaWYgKGxtcF9zbmlmZnN1YnJfY2FwYWJsZShoZGV2KSAmJiBsbXBfc25pZmZzdWJyX2NhcGFibGUoY29ubikpIHsKIAkJc3RydWN0IGhjaV9jcF9zbmlmZl9zdWJyYXRlIGNwOwotCQljcC5oYW5kbGUgICAgICAgICAgICAgPSBfX2NwdV90b19sZTE2KGNvbm4tPmhhbmRsZSk7Ci0JCWNwLm1heF9sYXRlbmN5ICAgICAgICA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMCk7Ci0JCWNwLm1pbl9yZW1vdGVfdGltZW91dCA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMCk7Ci0JCWNwLm1pbl9sb2NhbF90aW1lb3V0ICA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMCk7CisJCWNwLmhhbmRsZSAgICAgICAgICAgICA9IGNwdV90b19sZTE2KGNvbm4tPmhhbmRsZSk7CisJCWNwLm1heF9sYXRlbmN5ICAgICAgICA9IGNwdV90b19sZTE2KDApOworCQljcC5taW5fcmVtb3RlX3RpbWVvdXQgPSBjcHVfdG9fbGUxNigwKTsKKwkJY3AubWluX2xvY2FsX3RpbWVvdXQgID0gY3B1X3RvX2xlMTYoMCk7CiAJCWhjaV9zZW5kX2NtZChoZGV2LCBPR0ZfTElOS19QT0xJQ1ksCiAJCQkJT0NGX1NOSUZGX1NVQlJBVEUsIHNpemVvZihjcCksICZjcCk7CiAJfQogCiAJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KEhDSV9DT05OX01PREVfQ0hBTkdFX1BFTkQsICZjb25uLT5wZW5kKSkgewogCQlzdHJ1Y3QgaGNpX2NwX3NuaWZmX21vZGUgY3A7Ci0JCWNwLmhhbmRsZSAgICAgICA9IF9fY3B1X3RvX2xlMTYoY29ubi0+aGFuZGxlKTsKLQkJY3AubWF4X2ludGVydmFsID0gX19jcHVfdG9fbGUxNihoZGV2LT5zbmlmZl9tYXhfaW50ZXJ2YWwpOwotCQljcC5taW5faW50ZXJ2YWwgPSBfX2NwdV90b19sZTE2KGhkZXYtPnNuaWZmX21pbl9pbnRlcnZhbCk7Ci0JCWNwLmF0dGVtcHQgICAgICA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoNCk7Ci0JCWNwLnRpbWVvdXQgICAgICA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMSk7CisJCWNwLmhhbmRsZSAgICAgICA9IGNwdV90b19sZTE2KGNvbm4tPmhhbmRsZSk7CisJCWNwLm1heF9pbnRlcnZhbCA9IGNwdV90b19sZTE2KGhkZXYtPnNuaWZmX21heF9pbnRlcnZhbCk7CisJCWNwLm1pbl9pbnRlcnZhbCA9IGNwdV90b19sZTE2KGhkZXYtPnNuaWZmX21pbl9pbnRlcnZhbCk7CisJCWNwLmF0dGVtcHQgICAgICA9IGNwdV90b19sZTE2KDQpOworCQljcC50aW1lb3V0ICAgICAgPSBjcHVfdG9fbGUxNigxKTsKIAkJaGNpX3NlbmRfY21kKGhkZXYsIE9HRl9MSU5LX1BPTElDWSwKIAkJCQlPQ0ZfU05JRkZfTU9ERSwgc2l6ZW9mKGNwKSwgJmNwKTsKIAl9CmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2hjaV9jb3JlLmMgYi9uZXQvYmx1ZXRvb3RoL2hjaV9jb3JlLmMKaW5kZXggNDkxNzkxOS4uYWE0YjU2YSAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9oY2lfY29yZS5jCisrKyBiL25ldC9ibHVldG9vdGgvaGNpX2NvcmUuYwpAQCAtMTQ5LDcgKzE0OSw3IEBACiAJZGVmYXVsdDoKIAkJZXJyID0gLUVUSU1FRE9VVDsKIAkJYnJlYWs7Ci0JfTsKKwl9CiAKIAloZGV2LT5yZXFfc3RhdHVzID0gaGRldi0+cmVxX3Jlc3VsdCA9IDA7CiAKQEAgLTIxNiwxMCArMjE2LDEwIEBACiAJLyogSG9zdCBidWZmZXIgc2l6ZSAqLwogCXsKIAkJc3RydWN0IGhjaV9jcF9ob3N0X2J1ZmZlcl9zaXplIGNwOwotCQljcC5hY2xfbXR1ID0gX19jcHVfdG9fbGUxNihIQ0lfTUFYX0FDTF9TSVpFKTsKKwkJY3AuYWNsX210dSA9IGNwdV90b19sZTE2KEhDSV9NQVhfQUNMX1NJWkUpOwogCQljcC5zY29fbXR1ID0gSENJX01BWF9TQ09fU0laRTsKLQkJY3AuYWNsX21heF9wa3QgPSBfX2NwdV90b19sZTE2KDB4ZmZmZik7Ci0JCWNwLnNjb19tYXhfcGt0ID0gX19jcHVfdG9fbGUxNigweGZmZmYpOworCQljcC5hY2xfbWF4X3BrdCA9IGNwdV90b19sZTE2KDB4ZmZmZik7CisJCWNwLnNjb19tYXhfcGt0ID0gY3B1X3RvX2xlMTYoMHhmZmZmKTsKIAkJaGNpX3NlbmRfY21kKGhkZXYsIE9HRl9IT1NUX0NUTCwgT0NGX0hPU1RfQlVGRkVSX1NJWkUsIHNpemVvZihjcCksICZjcCk7CiAJfQogI2VuZGlmCkBAIC0yNDAsMTEgKzI0MCwxMSBAQAogCX0KIAogCS8qIFBhZ2UgdGltZW91dCB+MjAgc2VjcyAqLwotCXBhcmFtID0gX19jcHVfdG9fbGUxNigweDgwMDApOworCXBhcmFtID0gY3B1X3RvX2xlMTYoMHg4MDAwKTsKIAloY2lfc2VuZF9jbWQoaGRldiwgT0dGX0hPU1RfQ1RMLCBPQ0ZfV1JJVEVfUEdfVElNRU9VVCwgMiwgJnBhcmFtKTsKIAogCS8qIENvbm5lY3Rpb24gYWNjZXB0IHRpbWVvdXQgfjIwIHNlY3MgKi8KLQlwYXJhbSA9IF9fY3B1X3RvX2xlMTYoMHg3ZDAwKTsKKwlwYXJhbSA9IGNwdV90b19sZTE2KDB4N2QwMCk7CiAJaGNpX3NlbmRfY21kKGhkZXYsIE9HRl9IT1NUX0NUTCwgT0NGX1dSSVRFX0NBX1RJTUVPVVQsIDIsICZwYXJhbSk7CiB9CiAKQEAgLTEwMzQsNyArMTAzNCw3IEBACiAJfQogCiAJaGRyID0gKHN0cnVjdCBoY2lfY29tbWFuZF9oZHIgKikgc2tiX3B1dChza2IsIEhDSV9DT01NQU5EX0hEUl9TSVpFKTsKLQloZHItPm9wY29kZSA9IF9fY3B1X3RvX2xlMTYoaGNpX29wY29kZV9wYWNrKG9nZiwgb2NmKSk7CisJaGRyLT5vcGNvZGUgPSBjcHVfdG9fbGUxNihoY2lfb3Bjb2RlX3BhY2sob2dmLCBvY2YpKTsKIAloZHItPnBsZW4gICA9IHBsZW47CiAKIAlpZiAocGxlbikKQEAgLTEwNjAsNyArMTA2MCw3IEBACiAKIAloZHIgPSAodm9pZCAqKSBoZGV2LT5zZW50X2NtZC0+ZGF0YTsKIAotCWlmIChoZHItPm9wY29kZSAhPSBfX2NwdV90b19sZTE2KGhjaV9vcGNvZGVfcGFjayhvZ2YsIG9jZikpKQorCWlmIChoZHItPm9wY29kZSAhPSBjcHVfdG9fbGUxNihoY2lfb3Bjb2RlX3BhY2sob2dmLCBvY2YpKSkKIAkJcmV0dXJuIE5VTEw7CiAKIAlCVF9EQkcoIiVzIG9nZiAweCV4IG9jZiAweCV4IiwgaGRldi0+bmFtZSwgb2dmLCBvY2YpOwpAQCAtMTA3NCwxMSArMTA3NCwxMSBAQAogCXN0cnVjdCBoY2lfYWNsX2hkciAqaGRyOwogCWludCBsZW4gPSBza2ItPmxlbjsKIAotCWhkciA9IChzdHJ1Y3QgaGNpX2FjbF9oZHIgKikgc2tiX3B1c2goc2tiLCBIQ0lfQUNMX0hEUl9TSVpFKTsKLQloZHItPmhhbmRsZSA9IF9fY3B1X3RvX2xlMTYoaGNpX2hhbmRsZV9wYWNrKGhhbmRsZSwgZmxhZ3MpKTsKLQloZHItPmRsZW4gICA9IF9fY3B1X3RvX2xlMTYobGVuKTsKLQotCXNrYi0+aC5yYXcgPSAodm9pZCAqKSBoZHI7CisJc2tiX3B1c2goc2tiLCBIQ0lfQUNMX0hEUl9TSVpFKTsKKwlza2JfcmVzZXRfdHJhbnNwb3J0X2hlYWRlcihza2IpOworCWhkciA9IChzdHJ1Y3QgaGNpX2FjbF9oZHIgKilza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpOworCWhkci0+aGFuZGxlID0gY3B1X3RvX2xlMTYoaGNpX2hhbmRsZV9wYWNrKGhhbmRsZSwgZmxhZ3MpKTsKKwloZHItPmRsZW4gICA9IGNwdV90b19sZTE2KGxlbik7CiB9CiAKIGludCBoY2lfc2VuZF9hY2woc3RydWN0IGhjaV9jb25uICpjb25uLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBfX3UxNiBmbGFncykKQEAgLTExNDAsMTEgKzExNDAsMTIgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JaGRyLmhhbmRsZSA9IF9fY3B1X3RvX2xlMTYoY29ubi0+aGFuZGxlKTsKKwloZHIuaGFuZGxlID0gY3B1X3RvX2xlMTYoY29ubi0+aGFuZGxlKTsKIAloZHIuZGxlbiAgID0gc2tiLT5sZW47CiAKLQlza2ItPmgucmF3ID0gc2tiX3B1c2goc2tiLCBIQ0lfU0NPX0hEUl9TSVpFKTsKLQltZW1jcHkoc2tiLT5oLnJhdywgJmhkciwgSENJX1NDT19IRFJfU0laRSk7CisJc2tiX3B1c2goc2tiLCBIQ0lfU0NPX0hEUl9TSVpFKTsKKwlza2JfcmVzZXRfdHJhbnNwb3J0X2hlYWRlcihza2IpOworCW1lbWNweShza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpLCAmaGRyLCBIQ0lfU0NPX0hEUl9TSVpFKTsKIAogCXNrYi0+ZGV2ID0gKHZvaWQgKikgaGRldjsKIAlidF9jYihza2IpLT5wa3RfdHlwZSA9IEhDSV9TQ09EQVRBX1BLVDsKQEAgLTEzODcsNyArMTM4OCw3IEBACiAJCQljYXNlIEhDSV9TQ09EQVRBX1BLVDoKIAkJCQlrZnJlZV9za2Ioc2tiKTsKIAkJCQljb250aW51ZTsKLQkJCX07CisJCQl9CiAJCX0KIAogCQkvKiBQcm9jZXNzIGZyYW1lICovCmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2hjaV9ldmVudC5jIGIvbmV0L2JsdWV0b290aC9oY2lfZXZlbnQuYwppbmRleCA5MzZkM2ZjLi40NDdiYTcxIDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL2hjaV9ldmVudC5jCisrKyBiL25ldC9ibHVldG9vdGgvaGNpX2V2ZW50LmMKQEAgLTc4Myw3ICs3ODMsNyBAQAogCQlpZiAoY29ubi0+dHlwZSA9PSBBQ0xfTElOSyAmJiBoZGV2LT5saW5rX3BvbGljeSkgewogCQkJc3RydWN0IGhjaV9jcF93cml0ZV9saW5rX3BvbGljeSBjcDsKIAkJCWNwLmhhbmRsZSA9IGV2LT5oYW5kbGU7Ci0JCQljcC5wb2xpY3kgPSBfX2NwdV90b19sZTE2KGhkZXYtPmxpbmtfcG9saWN5KTsKKwkJCWNwLnBvbGljeSA9IGNwdV90b19sZTE2KGhkZXYtPmxpbmtfcG9saWN5KTsKIAkJCWhjaV9zZW5kX2NtZChoZGV2LCBPR0ZfTElOS19QT0xJQ1ksCiAJCQkJT0NGX1dSSVRFX0xJTktfUE9MSUNZLCBzaXplb2YoY3ApLCAmY3ApOwogCQl9CkBAIC03OTMsOCArNzkzLDggQEAKIAkJCXN0cnVjdCBoY2lfY3BfY2hhbmdlX2Nvbm5fcHR5cGUgY3A7CiAJCQljcC5oYW5kbGUgPSBldi0+aGFuZGxlOwogCQkJY3AucGt0X3R5cGUgPSAoY29ubi0+dHlwZSA9PSBBQ0xfTElOSykgPwotCQkJCV9fY3B1X3RvX2xlMTYoaGRldi0+cGt0X3R5cGUgJiBBQ0xfUFRZUEVfTUFTSyk6Ci0JCQkJX19jcHVfdG9fbGUxNihoZGV2LT5wa3RfdHlwZSAmIFNDT19QVFlQRV9NQVNLKTsKKwkJCQljcHVfdG9fbGUxNihoZGV2LT5wa3RfdHlwZSAmIEFDTF9QVFlQRV9NQVNLKToKKwkJCQljcHVfdG9fbGUxNihoZGV2LT5wa3RfdHlwZSAmIFNDT19QVFlQRV9NQVNLKTsKIAogCQkJaGNpX3NlbmRfY21kKGhkZXYsIE9HRl9MSU5LX0NUTCwKIAkJCQlPQ0ZfQ0hBTkdFX0NPTk5fUFRZUEUsIHNpemVvZihjcCksICZjcCk7CkBAIC05NzAsNyArOTcwLDcgQEAKIAkJaWYgKHRlc3RfYml0KEhDSV9DT05OX0VOQ1JZUFRfUEVORCwgJmNvbm4tPnBlbmQpKSB7CiAJCQlpZiAoIWV2LT5zdGF0dXMpIHsKIAkJCQlzdHJ1Y3QgaGNpX2NwX3NldF9jb25uX2VuY3J5cHQgY3A7Ci0JCQkJY3AuaGFuZGxlICA9IF9fY3B1X3RvX2xlMTYoY29ubi0+aGFuZGxlKTsKKwkJCQljcC5oYW5kbGUgID0gY3B1X3RvX2xlMTYoY29ubi0+aGFuZGxlKTsKIAkJCQljcC5lbmNyeXB0ID0gMTsKIAkJCQloY2lfc2VuZF9jbWQoY29ubi0+aGRldiwgT0dGX0xJTktfQ1RMLAogCQkJCQlPQ0ZfU0VUX0NPTk5fRU5DUllQVCwgc2l6ZW9mKGNwKSwgJmNwKTsKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvaGNpX3NvY2suYyBiL25ldC9ibHVldG9vdGgvaGNpX3NvY2suYwppbmRleCA3MWY1Y2ZiLi44MzJiNWY0IDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL2hjaV9zb2NrLmMKKysrIGIvbmV0L2JsdWV0b290aC9oY2lfc29jay5jCkBAIC0zNzUsNyArMzc1LDcgQEAKIAkJY29waWVkID0gbGVuOwogCX0KIAotCXNrYi0+aC5yYXcgPSBza2ItPmRhdGE7CisJc2tiX3Jlc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKIAllcnIgPSBza2JfY29weV9kYXRhZ3JhbV9pb3ZlYyhza2IsIDAsIG1zZy0+bXNnX2lvdiwgY29waWVkKTsKIAogCWhjaV9zb2NrX2Ntc2coc2ssIG1zZywgc2tiKTsKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvbDJjYXAuYyBiL25ldC9ibHVldG9vdGgvbDJjYXAuYwppbmRleCBlODNlZTgyLi5hNTg2Nzg3IDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL2wyY2FwLmMKKysrIGIvbmV0L2JsdWV0b290aC9sMmNhcC5jCkBAIC00NTksOCArNDU5LDggQEAKIAkJCXNrLT5za19zdGF0ZSA9IEJUX0RJU0NPTk47CiAJCQlsMmNhcF9zb2NrX3NldF90aW1lcihzaywgc2stPnNrX3NuZHRpbWVvKTsKIAotCQkJcmVxLmRjaWQgPSBfX2NwdV90b19sZTE2KGwyY2FwX3BpKHNrKS0+ZGNpZCk7Ci0JCQlyZXEuc2NpZCA9IF9fY3B1X3RvX2xlMTYobDJjYXBfcGkoc2spLT5zY2lkKTsKKwkJCXJlcS5kY2lkID0gY3B1X3RvX2xlMTYobDJjYXBfcGkoc2spLT5kY2lkKTsKKwkJCXJlcS5zY2lkID0gY3B1X3RvX2xlMTYobDJjYXBfcGkoc2spLT5zY2lkKTsKIAkJCWwyY2FwX3NlbmRfY21kKGNvbm4sIGwyY2FwX2dldF9pZGVudChjb25uKSwKIAkJCQkJTDJDQVBfRElTQ09OTl9SRVEsIHNpemVvZihyZXEpLCAmcmVxKTsKIAkJfSBlbHNlIHsKQEAgLTY1Miw3ICs2NTIsNyBAQAogCQlpZiAoc2stPnNrX3R5cGUgPT0gU09DS19TRVFQQUNLRVQpIHsKIAkJCXN0cnVjdCBsMmNhcF9jb25uX3JlcSByZXE7CiAJCQlsMmNhcF9waShzayktPmlkZW50ID0gbDJjYXBfZ2V0X2lkZW50KGNvbm4pOwotCQkJcmVxLnNjaWQgPSBfX2NwdV90b19sZTE2KGwyY2FwX3BpKHNrKS0+c2NpZCk7CisJCQlyZXEuc2NpZCA9IGNwdV90b19sZTE2KGwyY2FwX3BpKHNrKS0+c2NpZCk7CiAJCQlyZXEucHNtICA9IGwyY2FwX3BpKHNrKS0+cHNtOwogCQkJbDJjYXBfc2VuZF9jbWQoY29ubiwgbDJjYXBfcGkoc2spLT5pZGVudCwKIAkJCQkJTDJDQVBfQ09OTl9SRVEsIHNpemVvZihyZXEpLCAmcmVxKTsKQEAgLTg2OCw4ICs4NjgsOCBAQAogCiAJLyogQ3JlYXRlIEwyQ0FQIGhlYWRlciAqLwogCWxoID0gKHN0cnVjdCBsMmNhcF9oZHIgKikgc2tiX3B1dChza2IsIEwyQ0FQX0hEUl9TSVpFKTsKLQlsaC0+Y2lkID0gX19jcHVfdG9fbGUxNihsMmNhcF9waShzayktPmRjaWQpOwotCWxoLT5sZW4gPSBfX2NwdV90b19sZTE2KGxlbiArIChobGVuIC0gTDJDQVBfSERSX1NJWkUpKTsKKwlsaC0+Y2lkID0gY3B1X3RvX2xlMTYobDJjYXBfcGkoc2spLT5kY2lkKTsKKwlsaC0+bGVuID0gY3B1X3RvX2xlMTYobGVuICsgKGhsZW4gLSBMMkNBUF9IRFJfU0laRSkpOwogCiAJaWYgKHNrLT5za190eXBlID09IFNPQ0tfREdSQU0pCiAJCXB1dF91bmFsaWduZWQobDJjYXBfcGkoc2spLT5wc20sICh1MTYgKikgc2tiX3B1dChza2IsIDIpKTsKQEAgLTEwOTYsNyArMTA5Niw3IEBACiAJCX0gZWxzZSBpZiAoc2stPnNrX3N0YXRlID09IEJUX0NPTk5FQ1QpIHsKIAkJCXN0cnVjdCBsMmNhcF9jb25uX3JlcSByZXE7CiAJCQlsMmNhcF9waShzayktPmlkZW50ID0gbDJjYXBfZ2V0X2lkZW50KGNvbm4pOwotCQkJcmVxLnNjaWQgPSBfX2NwdV90b19sZTE2KGwyY2FwX3BpKHNrKS0+c2NpZCk7CisJCQlyZXEuc2NpZCA9IGNwdV90b19sZTE2KGwyY2FwX3BpKHNrKS0+c2NpZCk7CiAJCQlyZXEucHNtICA9IGwyY2FwX3BpKHNrKS0+cHNtOwogCQkJbDJjYXBfc2VuZF9jbWQoY29ubiwgbDJjYXBfcGkoc2spLT5pZGVudCwgTDJDQVBfQ09OTl9SRVEsIHNpemVvZihyZXEpLCAmcmVxKTsKIAkJfQpAQCAtMTE5MiwxMyArMTE5MiwxMyBAQAogCQlyZXR1cm4gTlVMTDsKIAogCWxoID0gKHN0cnVjdCBsMmNhcF9oZHIgKikgc2tiX3B1dChza2IsIEwyQ0FQX0hEUl9TSVpFKTsKLQlsaC0+bGVuID0gX19jcHVfdG9fbGUxNihMMkNBUF9DTURfSERSX1NJWkUgKyBkbGVuKTsKLQlsaC0+Y2lkID0gX19jcHVfdG9fbGUxNigweDAwMDEpOworCWxoLT5sZW4gPSBjcHVfdG9fbGUxNihMMkNBUF9DTURfSERSX1NJWkUgKyBkbGVuKTsKKwlsaC0+Y2lkID0gY3B1X3RvX2xlMTYoMHgwMDAxKTsKIAogCWNtZCA9IChzdHJ1Y3QgbDJjYXBfY21kX2hkciAqKSBza2JfcHV0KHNrYiwgTDJDQVBfQ01EX0hEUl9TSVpFKTsKIAljbWQtPmNvZGUgID0gY29kZTsKIAljbWQtPmlkZW50ID0gaWRlbnQ7Ci0JY21kLT5sZW4gICA9IF9fY3B1X3RvX2xlMTYoZGxlbik7CisJY21kLT5sZW4gICA9IGNwdV90b19sZTE2KGRsZW4pOwogCiAJaWYgKGRsZW4pIHsKIAkJY291bnQgLT0gTDJDQVBfSERSX1NJWkUgKyBMMkNBUF9DTURfSERSX1NJWkU7CkBAIC0xMzE2LDExICsxMzE2LDExIEBACiAJCWJyZWFrOwogCiAJY2FzZSAyOgotCQkqKCh1MTYgKikgb3B0LT52YWwpID0gX19jcHVfdG9fbGUxNih2YWwpOworCQkqKCh1MTYgKikgb3B0LT52YWwpID0gY3B1X3RvX2xlMTYodmFsKTsKIAkJYnJlYWs7CiAKIAljYXNlIDQ6Ci0JCSooKHUzMiAqKSBvcHQtPnZhbCkgPSBfX2NwdV90b19sZTMyKHZhbCk7CisJCSooKHUzMiAqKSBvcHQtPnZhbCkgPSBjcHVfdG9fbGUzMih2YWwpOwogCQlicmVhazsKIAogCWRlZmF1bHQ6CkBAIC0xMzQ2LDggKzEzNDYsOCBAQAogCS8vaWYgKGZsdXNoX3RvICE9IEwyQ0FQX0RFRkFVTFRfRkxVU0hfVE8pCiAJLy8gICBsMmNhcF9hZGRfY29uZl9vcHQoJnB0ciwgTDJDQVBfQ09ORl9GTFVTSF9UTywgMiwgcGktPmZsdXNoX3RvKTsKIAotCXJlcS0+ZGNpZCAgPSBfX2NwdV90b19sZTE2KHBpLT5kY2lkKTsKLQlyZXEtPmZsYWdzID0gX19jcHVfdG9fbGUxNigwKTsKKwlyZXEtPmRjaWQgID0gY3B1X3RvX2xlMTYocGktPmRjaWQpOworCXJlcS0+ZmxhZ3MgPSBjcHVfdG9fbGUxNigwKTsKIAogCXJldHVybiBwdHIgLSBkYXRhOwogfQpAQCAtMTM4Myw5ICsxMzgzLDkgQEAKIAllbHNlCiAJCWZsYWdzID0gMHgwMDAxOwogCi0JcnNwLT5zY2lkICAgPSBfX2NwdV90b19sZTE2KGwyY2FwX3BpKHNrKS0+ZGNpZCk7Ci0JcnNwLT5yZXN1bHQgPSBfX2NwdV90b19sZTE2KHJlc3VsdCA/ICpyZXN1bHQgOiAwKTsKLQlyc3AtPmZsYWdzICA9IF9fY3B1X3RvX2xlMTYoZmxhZ3MpOworCXJzcC0+c2NpZCAgID0gY3B1X3RvX2xlMTYobDJjYXBfcGkoc2spLT5kY2lkKTsKKwlyc3AtPnJlc3VsdCA9IGNwdV90b19sZTE2KHJlc3VsdCA/ICpyZXN1bHQgOiAwKTsKKwlyc3AtPmZsYWdzICA9IGNwdV90b19sZTE2KGZsYWdzKTsKIAogCXJldHVybiBwdHIgLSBkYXRhOwogfQpAQCAtMTQ3MCwxMCArMTQ3MCwxMCBAQAogCWJoX3VubG9ja19zb2NrKHBhcmVudCk7CiAKIHNlbmRyZXNwOgotCXJzcC5zY2lkICAgPSBfX2NwdV90b19sZTE2KHNjaWQpOwotCXJzcC5kY2lkICAgPSBfX2NwdV90b19sZTE2KGRjaWQpOwotCXJzcC5yZXN1bHQgPSBfX2NwdV90b19sZTE2KHJlc3VsdCk7Ci0JcnNwLnN0YXR1cyA9IF9fY3B1X3RvX2xlMTYoc3RhdHVzKTsKKwlyc3Auc2NpZCAgID0gY3B1X3RvX2xlMTYoc2NpZCk7CisJcnNwLmRjaWQgICA9IGNwdV90b19sZTE2KGRjaWQpOworCXJzcC5yZXN1bHQgPSBjcHVfdG9fbGUxNihyZXN1bHQpOworCXJzcC5zdGF0dXMgPSBjcHVfdG9fbGUxNihzdGF0dXMpOwogCWwyY2FwX3NlbmRfY21kKGNvbm4sIGNtZC0+aWRlbnQsIEwyQ0FQX0NPTk5fUlNQLCBzaXplb2YocnNwKSwgJnJzcCk7CiAJcmV0dXJuIDA7CiB9CkBAIC0xNjEzLDggKzE2MTMsOCBAQAogCQlsMmNhcF9zb2NrX3NldF90aW1lcihzaywgSFogKiA1KTsKIAkJewogCQkJc3RydWN0IGwyY2FwX2Rpc2Nvbm5fcmVxIHJlcTsKLQkJCXJlcS5kY2lkID0gX19jcHVfdG9fbGUxNihsMmNhcF9waShzayktPmRjaWQpOwotCQkJcmVxLnNjaWQgPSBfX2NwdV90b19sZTE2KGwyY2FwX3BpKHNrKS0+c2NpZCk7CisJCQlyZXEuZGNpZCA9IGNwdV90b19sZTE2KGwyY2FwX3BpKHNrKS0+ZGNpZCk7CisJCQlyZXEuc2NpZCA9IGNwdV90b19sZTE2KGwyY2FwX3BpKHNrKS0+c2NpZCk7CiAJCQlsMmNhcF9zZW5kX2NtZChjb25uLCBsMmNhcF9nZXRfaWRlbnQoY29ubiksCiAJCQkJCUwyQ0FQX0RJU0NPTk5fUkVRLCBzaXplb2YocmVxKSwgJnJlcSk7CiAJCX0KQEAgLTE2NTIsOCArMTY1Miw4IEBACiAJaWYgKCEoc2sgPSBsMmNhcF9nZXRfY2hhbl9ieV9zY2lkKCZjb25uLT5jaGFuX2xpc3QsIGRjaWQpKSkKIAkJcmV0dXJuIDA7CiAKLQlyc3AuZGNpZCA9IF9fY3B1X3RvX2xlMTYobDJjYXBfcGkoc2spLT5zY2lkKTsKLQlyc3Auc2NpZCA9IF9fY3B1X3RvX2xlMTYobDJjYXBfcGkoc2spLT5kY2lkKTsKKwlyc3AuZGNpZCA9IGNwdV90b19sZTE2KGwyY2FwX3BpKHNrKS0+c2NpZCk7CisJcnNwLnNjaWQgPSBjcHVfdG9fbGUxNihsMmNhcF9waShzayktPmRjaWQpOwogCWwyY2FwX3NlbmRfY21kKGNvbm4sIGNtZC0+aWRlbnQsIEwyQ0FQX0RJU0NPTk5fUlNQLCBzaXplb2YocnNwKSwgJnJzcCk7CiAKIAlzay0+c2tfc2h1dGRvd24gPSBTSFVURE9XTl9NQVNLOwpAQCAtMTY5Niw4ICsxNjk2LDggQEAKIAogCUJUX0RCRygidHlwZSAweCU0LjR4IiwgdHlwZSk7CiAKLQlyc3AudHlwZSAgID0gX19jcHVfdG9fbGUxNih0eXBlKTsKLQlyc3AucmVzdWx0ID0gX19jcHVfdG9fbGUxNihMMkNBUF9JUl9OT1RTVVBQKTsKKwlyc3AudHlwZSAgID0gY3B1X3RvX2xlMTYodHlwZSk7CisJcnNwLnJlc3VsdCA9IGNwdV90b19sZTE2KEwyQ0FQX0lSX05PVFNVUFApOwogCWwyY2FwX3NlbmRfY21kKGNvbm4sIGNtZC0+aWRlbnQsIEwyQ0FQX0lORk9fUlNQLCBzaXplb2YocnNwKSwgJnJzcCk7CiAKIAlyZXR1cm4gMDsKQEAgLTE3OTQsNyArMTc5NCw3IEBACiAJCQlCVF9EQkcoImVycm9yICVkIiwgZXJyKTsKIAogCQkJLyogRklYTUU6IE1hcCBlcnIgdG8gYSB2YWxpZCByZWFzb24gKi8KLQkJCXJlai5yZWFzb24gPSBfX2NwdV90b19sZTE2KDApOworCQkJcmVqLnJlYXNvbiA9IGNwdV90b19sZTE2KDApOwogCQkJbDJjYXBfc2VuZF9jbWQoY29ubiwgY21kLmlkZW50LCBMMkNBUF9DT01NQU5EX1JFSiwgc2l6ZW9mKHJlaiksICZyZWopOwogCQl9CiAKQEAgLTE5OTMsMTAgKzE5OTMsMTAgQEAKIAkJCXJlc3VsdCA9IEwyQ0FQX0NSX1NFQ19CTE9DSzsKIAkJfQogCi0JCXJzcC5zY2lkICAgPSBfX2NwdV90b19sZTE2KGwyY2FwX3BpKHNrKS0+ZGNpZCk7Ci0JCXJzcC5kY2lkICAgPSBfX2NwdV90b19sZTE2KGwyY2FwX3BpKHNrKS0+c2NpZCk7Ci0JCXJzcC5yZXN1bHQgPSBfX2NwdV90b19sZTE2KHJlc3VsdCk7Ci0JCXJzcC5zdGF0dXMgPSBfX2NwdV90b19sZTE2KDApOworCQlyc3Auc2NpZCAgID0gY3B1X3RvX2xlMTYobDJjYXBfcGkoc2spLT5kY2lkKTsKKwkJcnNwLmRjaWQgICA9IGNwdV90b19sZTE2KGwyY2FwX3BpKHNrKS0+c2NpZCk7CisJCXJzcC5yZXN1bHQgPSBjcHVfdG9fbGUxNihyZXN1bHQpOworCQlyc3Auc3RhdHVzID0gY3B1X3RvX2xlMTYoMCk7CiAJCWwyY2FwX3NlbmRfY21kKGNvbm4sIGwyY2FwX3BpKHNrKS0+aWRlbnQsCiAJCQkJTDJDQVBfQ09OTl9SU1AsIHNpemVvZihyc3ApLCAmcnNwKTsKIApAQCAtMjA0MSwxMCArMjA0MSwxMCBAQAogCQkJcmVzdWx0ID0gTDJDQVBfQ1JfU0VDX0JMT0NLOwogCQl9CiAKLQkJcnNwLnNjaWQgICA9IF9fY3B1X3RvX2xlMTYobDJjYXBfcGkoc2spLT5kY2lkKTsKLQkJcnNwLmRjaWQgICA9IF9fY3B1X3RvX2xlMTYobDJjYXBfcGkoc2spLT5zY2lkKTsKLQkJcnNwLnJlc3VsdCA9IF9fY3B1X3RvX2xlMTYocmVzdWx0KTsKLQkJcnNwLnN0YXR1cyA9IF9fY3B1X3RvX2xlMTYoMCk7CisJCXJzcC5zY2lkICAgPSBjcHVfdG9fbGUxNihsMmNhcF9waShzayktPmRjaWQpOworCQlyc3AuZGNpZCAgID0gY3B1X3RvX2xlMTYobDJjYXBfcGkoc2spLT5zY2lkKTsKKwkJcnNwLnJlc3VsdCA9IGNwdV90b19sZTE2KHJlc3VsdCk7CisJCXJzcC5zdGF0dXMgPSBjcHVfdG9fbGUxNigwKTsKIAkJbDJjYXBfc2VuZF9jbWQoY29ubiwgbDJjYXBfcGkoc2spLT5pZGVudCwKIAkJCQlMMkNBUF9DT05OX1JTUCwgc2l6ZW9mKHJzcCksICZyc3ApOwogCkBAIC0yMTA3LDcgKzIxMDcsOCBAQAogCQlpZiAoIShjb25uLT5yeF9za2IgPSBidF9za2JfYWxsb2MobGVuLCBHRlBfQVRPTUlDKSkpCiAJCQlnb3RvIGRyb3A7CiAKLQkJbWVtY3B5KHNrYl9wdXQoY29ubi0+cnhfc2tiLCBza2ItPmxlbiksIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgc2tiX3B1dChjb25uLT5yeF9za2IsIHNrYi0+bGVuKSwKKwkJCSAgICAgIHNrYi0+bGVuKTsKIAkJY29ubi0+cnhfbGVuID0gbGVuIC0gc2tiLT5sZW47CiAJfSBlbHNlIHsKIAkJQlRfREJHKCJDb250OiBmcmFnIGxlbiAlZCAoZXhwZWN0aW5nICVkKSIsIHNrYi0+bGVuLCBjb25uLT5yeF9sZW4pOwpAQCAtMjEyOCw3ICsyMTI5LDggQEAKIAkJCWdvdG8gZHJvcDsKIAkJfQogCi0JCW1lbWNweShza2JfcHV0KGNvbm4tPnJ4X3NrYiwgc2tiLT5sZW4pLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIHNrYl9wdXQoY29ubi0+cnhfc2tiLCBza2ItPmxlbiksCisJCQkgICAgICBza2ItPmxlbik7CiAJCWNvbm4tPnJ4X2xlbiAtPSBza2ItPmxlbjsKIAogCQlpZiAoIWNvbm4tPnJ4X2xlbikgewpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9yZmNvbW0vY29yZS5jIGIvbmV0L2JsdWV0b290aC9yZmNvbW0vY29yZS5jCmluZGV4IDk0ZjQ1NzMuLmZlN2RmOTAgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvcmZjb21tL2NvcmUuYworKysgYi9uZXQvYmx1ZXRvb3RoL3JmY29tbS9jb3JlLmMKQEAgLTE1NjcsNyArMTU2Nyw3IEBACiAKIAkvKiBUcmltIEZDUyAqLwogCXNrYi0+bGVuLS07IHNrYi0+dGFpbC0tOwotCWZjcyA9ICoodTggKikgc2tiLT50YWlsOworCWZjcyA9ICoodTggKilza2JfdGFpbF9wb2ludGVyKHNrYik7CiAKIAlpZiAoX19jaGVja19mY3Moc2tiLT5kYXRhLCB0eXBlLCBmY3MpKSB7CiAJCUJUX0VSUigiYmFkIGNoZWNrc3VtIGluIHBhY2tldCIpOwpAQCAtMTg1MSwxOCArMTg1MSwxOCBAQAogCUJUX0RCRygiIik7CiAKIAl3aGlsZSAoIWF0b21pY19yZWFkKCZ0ZXJtaW5hdGUpKSB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CiAJCWlmICghdGVzdF9iaXQoUkZDT01NX1NDSEVEX1dBS0VVUCwgJnJmY29tbV9ldmVudCkpIHsKIAkJCS8qIE5vIHBlbmRpbmcgZXZlbnRzLiBMZXQncyBzbGVlcC4KIAkJCSAqIEluY29taW5nIGNvbm5lY3Rpb25zIGFuZCBkYXRhIHdpbGwgd2FrZSB1cyB1cC4gKi8KLQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CiAJCQlzY2hlZHVsZSgpOwogCQl9CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CiAKIAkJLyogUHJvY2VzcyBzdHVmZiAqLwogCQljbGVhcl9iaXQoUkZDT01NX1NDSEVEX1dBS0VVUCwgJnJmY29tbV9ldmVudCk7CiAJCXJmY29tbV9wcm9jZXNzX3Nlc3Npb25zKCk7CiAJfQotCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CiAJcmV0dXJuOwogfQogCmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL3Njby5jIGIvbmV0L2JsdWV0b290aC9zY28uYwppbmRleCBhZTQzOTE0Li4zZjUxNjNlIDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL3Njby5jCisrKyBiL25ldC9ibHVldG9vdGgvc2NvLmMKQEAgLTM5Myw3ICszOTMsNyBAQAogCWRlZmF1bHQ6CiAJCXNvY2tfc2V0X2ZsYWcoc2ssIFNPQ0tfWkFQUEVEKTsKIAkJYnJlYWs7Ci0JfTsKKwl9CiAKIAlyZWxlYXNlX3NvY2soc2spOwogCmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyLmMgYi9uZXQvYnJpZGdlL2JyLmMKaW5kZXggMjk5NDM4Ny4uODQ4YjhmYSAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9ici5jCisrKyBiL25ldC9icmlkZ2UvYnIuYwpAQCAtMzcsNyArMzcsOSBAQAogCQlyZXR1cm4gLUVBRERSSU5VU0U7CiAJfQogCi0JYnJfZmRiX2luaXQoKTsKKwllcnIgPSBicl9mZGJfaW5pdCgpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX291dDE7CiAKIAllcnIgPSBicl9uZXRmaWx0ZXJfaW5pdCgpOwogCWlmIChlcnIpCkBAIC00Nyw3ICs0OSwxMCBAQAogCWlmIChlcnIpCiAJCWdvdG8gZXJyX291dDI7CiAKLQlicl9uZXRsaW5rX2luaXQoKTsKKwllcnIgPSBicl9uZXRsaW5rX2luaXQoKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9vdXQzOworCiAJYnJpb2N0bF9zZXQoYnJfaW9jdGxfZGV2aWNlbGVzc19zdHViKTsKIAlicl9oYW5kbGVfZnJhbWVfaG9vayA9IGJyX2hhbmRsZV9mcmFtZTsKIApAQCAtNTUsNyArNjAsOCBAQAogCWJyX2ZkYl9wdXRfaG9vayA9IGJyX2ZkYl9wdXQ7CiAKIAlyZXR1cm4gMDsKLQorZXJyX291dDM6CisJdW5yZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJmJyX2RldmljZV9ub3RpZmllcik7CiBlcnJfb3V0MjoKIAlicl9uZXRmaWx0ZXJfZmluaSgpOwogZXJyX291dDE6CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX2RldmljZS5jIGIvbmV0L2JyaWRnZS9icl9kZXZpY2UuYwppbmRleCA5MDVhMzljLi41ZTE4OTJkIDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL2JyX2RldmljZS5jCisrKyBiL25ldC9icmlkZ2UvYnJfZGV2aWNlLmMKQEAgLTM3LDcgKzM3LDcgQEAKIAlici0+c3RhdGlzdGljcy50eF9wYWNrZXRzKys7CiAJYnItPnN0YXRpc3RpY3MudHhfYnl0ZXMgKz0gc2tiLT5sZW47CiAKLQlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKIAlza2JfcHVsbChza2IsIEVUSF9ITEVOKTsKIAogCWlmIChkZXN0WzBdICYgMSkKQEAgLTgzLDI3ICs4MywyMSBAQAogCXJldHVybiAwOwogfQogCi0vKiBBbGxvdyBzZXR0aW5nIG1hYyBhZGRyZXNzIG9mIHBzZXVkby1icmlkZ2UgdG8gYmUgc2FtZSBhcwotICogYW55IG9mIHRoZSBib3VuZCBpbnRlcmZhY2VzCi0gKi8KKy8qIEFsbG93IHNldHRpbmcgbWFjIGFkZHJlc3MgdG8gYW55IHZhbGlkIGV0aGVybmV0IGFkZHJlc3MuICovCiBzdGF0aWMgaW50IGJyX3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICpwKQogewogCXN0cnVjdCBuZXRfYnJpZGdlICpiciA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IHNvY2thZGRyICphZGRyID0gcDsKLQlzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwb3J0OwotCWludCBlcnIgPSAtRUFERFJOT1RBVkFJTDsKKworCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihhZGRyLT5zYV9kYXRhKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAlzcGluX2xvY2tfYmgoJmJyLT5sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvcnQsICZici0+cG9ydF9saXN0LCBsaXN0KSB7Ci0JCWlmICghY29tcGFyZV9ldGhlcl9hZGRyKHBvcnQtPmRldi0+ZGV2X2FkZHIsIGFkZHItPnNhX2RhdGEpKSB7Ci0JCQlicl9zdHBfY2hhbmdlX2JyaWRnZV9pZChiciwgYWRkci0+c2FfZGF0YSk7Ci0JCQllcnIgPSAwOwotCQkJYnJlYWs7Ci0JCX0KLQl9CisJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIGFkZHItPnNhX2RhdGEsIEVUSF9BTEVOKTsKKwlicl9zdHBfY2hhbmdlX2JyaWRnZV9pZChiciwgYWRkci0+c2FfZGF0YSk7CiAJc3Bpbl91bmxvY2tfYmgoJmJyLT5sb2NrKTsKIAotCXJldHVybiBlcnI7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIGJyX2dldGluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvYnJfZmRiLmMgYi9uZXQvYnJpZGdlL2JyX2ZkYi5jCmluZGV4IDhkNTY2YzEuLjkxYjAxNzAgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvYnJfZmRiLmMKKysrIGIvbmV0L2JyaWRnZS9icl9mZGIuYwpAQCAtMjAsMTkgKzIwLDI4IEBACiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9qaGFzaC5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKyNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CiAjaW5jbHVkZSAiYnJfcHJpdmF0ZS5oIgogCiBzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKmJyX2ZkYl9jYWNoZSBfX3JlYWRfbW9zdGx5Owogc3RhdGljIGludCBmZGJfaW5zZXJ0KHN0cnVjdCBuZXRfYnJpZGdlICpiciwgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqc291cmNlLAogCQkgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICphZGRyKTsKIAotdm9pZCBfX2luaXQgYnJfZmRiX2luaXQodm9pZCkKK3N0YXRpYyB1MzIgZmRiX3NhbHQgX19yZWFkX21vc3RseTsKKworaW50IF9faW5pdCBicl9mZGJfaW5pdCh2b2lkKQogewogCWJyX2ZkYl9jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKCJicmlkZ2VfZmRiX2NhY2hlIiwKIAkJCQkJIHNpemVvZihzdHJ1Y3QgbmV0X2JyaWRnZV9mZGJfZW50cnkpLAogCQkJCQkgMCwKIAkJCQkJIFNMQUJfSFdDQUNIRV9BTElHTiwgTlVMTCwgTlVMTCk7CisJaWYgKCFicl9mZGJfY2FjaGUpCisJCXJldHVybiAtRU5PTUVNOworCisJZ2V0X3JhbmRvbV9ieXRlcygmZmRiX3NhbHQsIHNpemVvZihmZGJfc2FsdCkpOworCXJldHVybiAwOwogfQogCiB2b2lkIF9fZXhpdCBicl9mZGJfZmluaSh2b2lkKQpAQCAtNDQsMjQgKzUzLDI2IEBACiAvKiBpZiB0b3BvbG9neV9jaGFuZ2luZyB0aGVuIHVzZSBmb3J3YXJkX2RlbGF5IChkZWZhdWx0IDE1IHNlYykKICAqIG90aGVyd2lzZSBrZWVwIGxvbmdlciAoZGVmYXVsdCA1IG1pbnV0ZXMpCiAgKi8KLXN0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGxvbmcgaG9sZF90aW1lKGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlICpicikKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBob2xkX3RpbWUoY29uc3Qgc3RydWN0IG5ldF9icmlkZ2UgKmJyKQogewogCXJldHVybiBici0+dG9wb2xvZ3lfY2hhbmdlID8gYnItPmZvcndhcmRfZGVsYXkgOiBici0+YWdlaW5nX3RpbWU7CiB9CiAKLXN0YXRpYyBfX2lubGluZV9fIGludCBoYXNfZXhwaXJlZChjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsCitzdGF0aWMgaW5saW5lIGludCBoYXNfZXhwaXJlZChjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsCiAJCQkJICBjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZV9mZGJfZW50cnkgKmZkYikKIHsKIAlyZXR1cm4gIWZkYi0+aXNfc3RhdGljCiAJCSYmIHRpbWVfYmVmb3JlX2VxKGZkYi0+YWdlaW5nX3RpbWVyICsgaG9sZF90aW1lKGJyKSwgamlmZmllcyk7CiB9CiAKLXN0YXRpYyBfX2lubGluZV9fIGludCBicl9tYWNfaGFzaChjb25zdCB1bnNpZ25lZCBjaGFyICptYWMpCitzdGF0aWMgaW5saW5lIGludCBicl9tYWNfaGFzaChjb25zdCB1bnNpZ25lZCBjaGFyICptYWMpCiB7Ci0JcmV0dXJuIGpoYXNoKG1hYywgRVRIX0FMRU4sIDApICYgKEJSX0hBU0hfU0laRSAtIDEpOworCS8qIHVzZSAxIGJ5dGUgb2YgT1VJIGNuZCAzIGJ5dGVzIG9mIE5JQyAqLworCXUzMiBrZXkgPSBnZXRfdW5hbGlnbmVkKCh1MzIgKikobWFjICsgMikpOworCXJldHVybiBqaGFzaF8xd29yZChrZXksIGZkYl9zYWx0KSAmIChCUl9IQVNIX1NJWkUgLSAxKTsKIH0KIAotc3RhdGljIF9faW5saW5lX18gdm9pZCBmZGJfZGVsZXRlKHN0cnVjdCBuZXRfYnJpZGdlX2ZkYl9lbnRyeSAqZikKK3N0YXRpYyBpbmxpbmUgdm9pZCBmZGJfZGVsZXRlKHN0cnVjdCBuZXRfYnJpZGdlX2ZkYl9lbnRyeSAqZikKIHsKIAlobGlzdF9kZWxfcmN1KCZmLT5obGlzdCk7CiAJYnJfZmRiX3B1dChmKTsKQEAgLTEyOCw3ICsxMzksMjYgQEAKIAltb2RfdGltZXIoJmJyLT5nY190aW1lciwgamlmZmllcyArIEhaLzEwKTsKIH0KIAorLyogQ29tcGxldGVseSBmbHVzaCBhbGwgZHluYW1pYyBlbnRyaWVzIGluIGZvcndhcmRpbmcgZGF0YWJhc2UuKi8KK3ZvaWQgYnJfZmRiX2ZsdXNoKHN0cnVjdCBuZXRfYnJpZGdlICpicikKK3sKKwlpbnQgaTsKIAorCXNwaW5fbG9ja19iaCgmYnItPmhhc2hfbG9jayk7CisJZm9yIChpID0gMDsgaSA8IEJSX0hBU0hfU0laRTsgaSsrKSB7CisJCXN0cnVjdCBuZXRfYnJpZGdlX2ZkYl9lbnRyeSAqZjsKKwkJc3RydWN0IGhsaXN0X25vZGUgKmgsICpuOworCQlobGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGYsIGgsIG4sICZici0+aGFzaFtpXSwgaGxpc3QpIHsKKwkJCWlmICghZi0+aXNfc3RhdGljKQorCQkJCWZkYl9kZWxldGUoZik7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfYmgoJmJyLT5oYXNoX2xvY2spOworfQorCisvKiBGbHVzaCBhbGwgZW50cmllcyByZWZlcmluZyB0byBhIHNwZWNpZmljIHBvcnQuCisgKiBpZiBkb19hbGwgaXMgc2V0IGFsc28gZmx1c2ggc3RhdGljIGVudHJpZXMKKyAqLwogdm9pZCBicl9mZGJfZGVsZXRlX2J5X3BvcnQoc3RydWN0IG5ldF9icmlkZ2UgKmJyLAogCQkJICAgY29uc3Qgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCwKIAkJCSAgIGludCBkb19hbGwpCmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX2ZvcndhcmQuYyBiL25ldC9icmlkZ2UvYnJfZm9yd2FyZC5jCmluZGV4IDNlNDVjMWEuLmFkYTdmNDkgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvYnJfZm9yd2FyZC5jCisrKyBiL25ldC9icmlkZ2UvYnJfZm9yd2FyZC5jCkBAIC03MSw3ICs3MSw3IEBACiAKIAlpbmRldiA9IHNrYi0+ZGV2OwogCXNrYi0+ZGV2ID0gdG8tPmRldjsKLQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisJc2tiX2ZvcndhcmRfY3N1bShza2IpOwogCiAJTkZfSE9PSyhQRl9CUklER0UsIE5GX0JSX0ZPUldBUkQsIHNrYiwgaW5kZXYsIHNrYi0+ZGV2LAogCQkJYnJfZm9yd2FyZF9maW5pc2gpOwpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9icl9pZi5jIGIvbmV0L2JyaWRnZS9icl9pZi5jCmluZGV4IGYzYTJlMjkuLjY5MDU3M2IgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvYnJfaWYuYworKysgYi9uZXQvYnJpZGdlL2JyX2lmLmMKQEAgLTE1Miw2ICsxNTIsOCBAQAogCWJyX3N0cF9kaXNhYmxlX3BvcnQocCk7CiAJc3Bpbl91bmxvY2tfYmgoJmJyLT5sb2NrKTsKIAorCWJyX2lmaW5mb19ub3RpZnkoUlRNX0RFTExJTkssIHApOworCiAJYnJfZmRiX2RlbGV0ZV9ieV9wb3J0KGJyLCBwLCAxKTsKIAogCWxpc3RfZGVsX3JjdSgmcC0+bGlzdCk7CkBAIC0yMDMsNyArMjA1LDcgQEAKIAltZW1jcHkoYnItPmdyb3VwX2FkZHIsIGJyX2dyb3VwX2FkZHJlc3MsIEVUSF9BTEVOKTsKIAogCWJyLT5mZWF0dXJlX21hc2sgPSBkZXYtPmZlYXR1cmVzOwotCWJyLT5zdHBfZW5hYmxlZCA9IDA7CisJYnItPnN0cF9lbmFibGVkID0gQlJfTk9fU1RQOwogCWJyLT5kZXNpZ25hdGVkX3Jvb3QgPSBici0+YnJpZGdlX2lkOwogCWJyLT5yb290X3BhdGhfY29zdCA9IDA7CiAJYnItPnJvb3RfcG9ydCA9IDA7CkBAIC00MzQsNiArNDM2LDggQEAKIAkJYnJfc3RwX2VuYWJsZV9wb3J0KHApOwogCXNwaW5fdW5sb2NrX2JoKCZici0+bG9jayk7CiAKKwlicl9pZmluZm9fbm90aWZ5KFJUTV9ORVdMSU5LLCBwKTsKKwogCWRldl9zZXRfbXR1KGJyLT5kZXYsIGJyX21pbl9tdHUoYnIpKTsKIAogCWtvYmplY3RfdWV2ZW50KCZwLT5rb2JqLCBLT0JKX0FERCk7CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX2lucHV0LmMgYi9uZXQvYnJpZGdlL2JyX2lucHV0LmMKaW5kZXggMzViOTRmOS4uNDIwYmJiOSAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl9pbnB1dC5jCisrKyBiL25ldC9icmlkZ2UvYnJfaW5wdXQuYwpAQCAtMTEyLDQ2ICsxMTIsNTkgQEAKICAqLwogc3RhdGljIGlubGluZSBpbnQgaXNfbGlua19sb2NhbChjb25zdCB1bnNpZ25lZCBjaGFyICpkZXN0KQogewotCXJldHVybiBtZW1jbXAoZGVzdCwgYnJfZ3JvdXBfYWRkcmVzcywgNSkgPT0gMCAmJiAoZGVzdFs1XSAmIDB4ZjApID09IDA7CisJY29uc3QgdTE2ICphID0gKGNvbnN0IHUxNiAqKSBkZXN0OworCXN0YXRpYyBjb25zdCB1MTYgKmNvbnN0IGIgPSAoY29uc3QgdTE2ICpjb25zdCApIGJyX2dyb3VwX2FkZHJlc3M7CisJc3RhdGljIGNvbnN0IHUxNiBtID0gX19jb25zdGFudF9jcHVfdG9fYmUxNigweGZmZjApOworCisJcmV0dXJuICgoYVswXSBeIGJbMF0pIHwgKGFbMV0gXiBiWzFdKSB8ICgoYVsyXSBeIGJbMl0pICYgbSkpID09IDA7CiB9CiAKIC8qCiAgKiBDYWxsZWQgdmlhIGJyX2hhbmRsZV9mcmFtZV9ob29rLgotICogUmV0dXJuIDAgaWYgKnBza2Igc2hvdWxkIGJlIHByb2Nlc3NlZCBmdXJ0aHVyCi0gKgkgIDEgaWYgKnBza2IgaXMgaGFuZGxlZAorICogUmV0dXJuIE5VTEwgaWYgc2tiIGlzIGhhbmRsZWQKICAqIG5vdGU6IGFscmVhZHkgY2FsbGVkIHdpdGggcmN1X3JlYWRfbG9jayAocHJlZW1wdF9kaXNhYmxlZCkKICAqLwotaW50IGJyX2hhbmRsZV9mcmFtZShzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLCBzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IpCitzdHJ1Y3Qgc2tfYnVmZiAqYnJfaGFuZGxlX2ZyYW1lKHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAsIHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9ICpwc2tiOwogCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmRlc3QgPSBldGhfaGRyKHNrYiktPmhfZGVzdDsKIAogCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihldGhfaGRyKHNrYiktPmhfc291cmNlKSkKLQkJZ290byBlcnI7CisJCWdvdG8gZHJvcDsKIAogCWlmICh1bmxpa2VseShpc19saW5rX2xvY2FsKGRlc3QpKSkgewotCQlza2ItPnBrdF90eXBlID0gUEFDS0VUX0hPU1Q7Ci0JCXJldHVybiBORl9IT09LKFBGX0JSSURHRSwgTkZfQlJfTE9DQUxfSU4sIHNrYiwgc2tiLT5kZXYsCi0JCQkgICAgICAgTlVMTCwgYnJfaGFuZGxlX2xvY2FsX2ZpbmlzaCkgIT0gMDsKKwkJLyogUGF1c2UgZnJhbWVzIHNob3VsZG4ndCBiZSBwYXNzZWQgdXAgYnkgZHJpdmVyIGFueXdheSAqLworCQlpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9QQVVTRSkpCisJCQlnb3RvIGRyb3A7CisKKwkJLyogUHJvY2VzcyBTVFAgQlBEVSdzIHRocm91Z2ggbm9ybWFsIG5ldGlmX3JlY2VpdmVfc2tiKCkgcGF0aCAqLworCQlpZiAocC0+YnItPnN0cF9lbmFibGVkICE9IEJSX05PX1NUUCkgeworCQkJaWYgKE5GX0hPT0soUEZfQlJJREdFLCBORl9CUl9MT0NBTF9JTiwgc2tiLCBza2ItPmRldiwKKwkJCQkgICAgTlVMTCwgYnJfaGFuZGxlX2xvY2FsX2ZpbmlzaCkpCisJCQkJcmV0dXJuIE5VTEw7CisJCQllbHNlCisJCQkJcmV0dXJuIHNrYjsKKwkJfQogCX0KIAotCWlmIChwLT5zdGF0ZSA9PSBCUl9TVEFURV9GT1JXQVJESU5HIHx8IHAtPnN0YXRlID09IEJSX1NUQVRFX0xFQVJOSU5HKSB7CisJc3dpdGNoIChwLT5zdGF0ZSkgeworCWNhc2UgQlJfU1RBVEVfRk9SV0FSRElORzoKKwogCQlpZiAoYnJfc2hvdWxkX3JvdXRlX2hvb2spIHsKLQkJCWlmIChicl9zaG91bGRfcm91dGVfaG9vayhwc2tiKSkKLQkJCQlyZXR1cm4gMDsKLQkJCXNrYiA9ICpwc2tiOworCQkJaWYgKGJyX3Nob3VsZF9yb3V0ZV9ob29rKCZza2IpKQorCQkJCXJldHVybiBza2I7CiAJCQlkZXN0ID0gZXRoX2hkcihza2IpLT5oX2Rlc3Q7CiAJCX0KLQorCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIEJSX1NUQVRFX0xFQVJOSU5HOgogCQlpZiAoIWNvbXBhcmVfZXRoZXJfYWRkcihwLT5ici0+ZGV2LT5kZXZfYWRkciwgZGVzdCkpCiAJCQlza2ItPnBrdF90eXBlID0gUEFDS0VUX0hPU1Q7CiAKIAkJTkZfSE9PSyhQRl9CUklER0UsIE5GX0JSX1BSRV9ST1VUSU5HLCBza2IsIHNrYi0+ZGV2LCBOVUxMLAogCQkJYnJfaGFuZGxlX2ZyYW1lX2ZpbmlzaCk7Ci0JCXJldHVybiAxOworCQlicmVhazsKKwlkZWZhdWx0OgorZHJvcDoKKwkJa2ZyZWVfc2tiKHNrYik7CiAJfQotCi1lcnI6Ci0Ja2ZyZWVfc2tiKHNrYik7Ci0JcmV0dXJuIDE7CisJcmV0dXJuIE5VTEw7CiB9CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX2lvY3RsLmMgYi9uZXQvYnJpZGdlL2JyX2lvY3RsLmMKaW5kZXggMTQ3MDE1Zi4uZWRhMGZiZiAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl9pb2N0bC5jCisrKyBiL25ldC9icmlkZ2UvYnJfaW9jdGwuYwpAQCAtMTM3LDcgKzEzNyw4IEBACiAJCWIudG9wb2xvZ3lfY2hhbmdlID0gYnItPnRvcG9sb2d5X2NoYW5nZTsKIAkJYi50b3BvbG9neV9jaGFuZ2VfZGV0ZWN0ZWQgPSBici0+dG9wb2xvZ3lfY2hhbmdlX2RldGVjdGVkOwogCQliLnJvb3RfcG9ydCA9IGJyLT5yb290X3BvcnQ7Ci0JCWIuc3RwX2VuYWJsZWQgPSBici0+c3RwX2VuYWJsZWQ7CisKKwkJYi5zdHBfZW5hYmxlZCA9IChici0+c3RwX2VuYWJsZWQgIT0gQlJfTk9fU1RQKTsKIAkJYi5hZ2VpbmdfdGltZSA9IGppZmZpZXNfdG9fY2xvY2tfdChici0+YWdlaW5nX3RpbWUpOwogCQliLmhlbGxvX3RpbWVyX3ZhbHVlID0gYnJfdGltZXJfdmFsdWUoJmJyLT5oZWxsb190aW1lcik7CiAJCWIudGNuX3RpbWVyX3ZhbHVlID0gYnJfdGltZXJfdmFsdWUoJmJyLT50Y25fdGltZXIpOwpAQCAtMjUxLDcgKzI1Miw3IEBACiAJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKIAkJCXJldHVybiAtRVBFUk07CiAKLQkJYnItPnN0cF9lbmFibGVkID0gYXJnc1sxXT8xOjA7CisJCWJyX3N0cF9zZXRfZW5hYmxlZChiciwgYXJnc1sxXSk7CiAJCXJldHVybiAwOwogCiAJY2FzZSBCUkNUTF9TRVRfQlJJREdFX1BSSU9SSVRZOgpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9icl9uZXRmaWx0ZXIuYyBiL25ldC9icmlkZ2UvYnJfbmV0ZmlsdGVyLmMKaW5kZXggNTQzOWEzYy4uOWIyOTg2YiAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl9uZXRmaWx0ZXIuYworKysgYi9uZXQvYnJpZGdlL2JyX25ldGZpbHRlci5jCkBAIC0yOSw2ICsyOSw4IEBACiAjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KICNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CisjaW5jbHVkZSA8bGludXgvaWZfcHBwb3guaD4KKyNpbmNsdWRlIDxsaW51eC9wcHBfZGVmcy5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9icmlkZ2UuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY2Lmg+CkBAIC00OCw4ICs1MCw4IEBACiAKICNkZWZpbmUgc2tiX29yaWdhZGRyKHNrYikJICgoKHN0cnVjdCBicmlkZ2Vfc2tiX2NiICopIFwKIAkJCQkgKHNrYi0+bmZfYnJpZGdlLT5kYXRhKSktPmRhZGRyLmlwdjQpCi0jZGVmaW5lIHN0b3JlX29yaWdfZHN0YWRkcihza2IpCSAoc2tiX29yaWdhZGRyKHNrYikgPSAoc2tiKS0+bmguaXBoLT5kYWRkcikKLSNkZWZpbmUgZG5hdF90b29rX3BsYWNlKHNrYikJIChza2Jfb3JpZ2FkZHIoc2tiKSAhPSAoc2tiKS0+bmguaXBoLT5kYWRkcikKKyNkZWZpbmUgc3RvcmVfb3JpZ19kc3RhZGRyKHNrYikJIChza2Jfb3JpZ2FkZHIoc2tiKSA9IGlwX2hkcihza2IpLT5kYWRkcikKKyNkZWZpbmUgZG5hdF90b29rX3BsYWNlKHNrYikJIChza2Jfb3JpZ2FkZHIoc2tiKSAhPSBpcF9oZHIoc2tiKS0+ZGFkZHIpCiAKICNpZmRlZiBDT05GSUdfU1lTQ1RMCiBzdGF0aWMgc3RydWN0IGN0bF90YWJsZV9oZWFkZXIgKmJybmZfc3lzY3RsX2hlYWRlcjsKQEAgLTU3LDggKzU5LDEwIEBACiBzdGF0aWMgaW50IGJybmZfY2FsbF9pcDZ0YWJsZXMgX19yZWFkX21vc3RseSA9IDE7CiBzdGF0aWMgaW50IGJybmZfY2FsbF9hcnB0YWJsZXMgX19yZWFkX21vc3RseSA9IDE7CiBzdGF0aWMgaW50IGJybmZfZmlsdGVyX3ZsYW5fdGFnZ2VkIF9fcmVhZF9tb3N0bHkgPSAxOworc3RhdGljIGludCBicm5mX2ZpbHRlcl9wcHBvZV90YWdnZWQgX19yZWFkX21vc3RseSA9IDE7CiAjZWxzZQogI2RlZmluZSBicm5mX2ZpbHRlcl92bGFuX3RhZ2dlZCAxCisjZGVmaW5lIGJybmZfZmlsdGVyX3BwcG9lX3RhZ2dlZCAxCiAjZW5kaWYKIAogc3RhdGljIGlubGluZSBfX2JlMTYgdmxhbl9wcm90byhjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQpAQCAtODEsNiArODUsMjIgQEAKIAkgdmxhbl9wcm90byhza2IpID09IGh0b25zKEVUSF9QX0FSUCkgJiYJXAogCSBicm5mX2ZpbHRlcl92bGFuX3RhZ2dlZCkKIAorc3RhdGljIGlubGluZSBfX2JlMTYgcHBwb2VfcHJvdG8oY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gKigoX19iZTE2ICopKHNrYl9tYWNfaGVhZGVyKHNrYikgKyBFVEhfSExFTiArCisJCQkgICAgc2l6ZW9mKHN0cnVjdCBwcHBvZV9oZHIpKSk7Cit9CisKKyNkZWZpbmUgSVNfUFBQT0VfSVAoc2tiKSBcCisJKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfUFBQX1NFUykgJiYgXAorCSBwcHBvZV9wcm90byhza2IpID09IGh0b25zKFBQUF9JUCkgJiYgXAorCSBicm5mX2ZpbHRlcl9wcHBvZV90YWdnZWQpCisKKyNkZWZpbmUgSVNfUFBQT0VfSVBWNihza2IpIFwKKwkoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9QUFBfU0VTKSAmJiBcCisJIHBwcG9lX3Byb3RvKHNrYikgPT0gaHRvbnMoUFBQX0lQVjYpICYmIFwKKwkgYnJuZl9maWx0ZXJfcHBwb2VfdGFnZ2VkKQorCiAvKiBXZSBuZWVkIHRoZXNlIGZha2Ugc3RydWN0dXJlcyB0byBtYWtlIG5ldGZpbHRlciBoYXBweSAtLQogICogbG90cyBvZiBwbGFjZXMgYXNzdW1lIHRoYXQgc2tiLT5kc3QgIT0gTlVMTCwgd2hpY2ggaXNuJ3QKICAqIGFsbCB0aGF0IHVucmVhc29uYWJsZS4KQEAgLTEyOCw4ICsxNDgsMTEgQEAKIAogCWlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QXzgwMjFRKSkKIAkJaGVhZGVyX3NpemUgKz0gVkxBTl9ITEVOOworCWVsc2UgaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfUFBQX1NFUykpCisJCWhlYWRlcl9zaXplICs9IFBQUE9FX1NFU19ITEVOOwogCi0JbWVtY3B5KHNrYi0+bmZfYnJpZGdlLT5kYXRhLCBza2ItPmRhdGEgLSBoZWFkZXJfc2l6ZSwgaGVhZGVyX3NpemUpOworCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGFfb2Zmc2V0KHNrYiwgLWhlYWRlcl9zaXplLAorCQkJCQkgc2tiLT5uZl9icmlkZ2UtPmRhdGEsIGhlYWRlcl9zaXplKTsKIH0KIAogLyoKQEAgLTE0MywxNSArMTY2LDIwIEBACiAKIAlpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF84MDIxUSkpCiAJCWhlYWRlcl9zaXplICs9IFZMQU5fSExFTjsKKwllbHNlIGlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX1BQUF9TRVMpKQorCQloZWFkZXJfc2l6ZSArPSBQUFBPRV9TRVNfSExFTjsKIAogCWVyciA9IHNrYl9jb3coc2tiLCBoZWFkZXJfc2l6ZSk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAotCW1lbWNweShza2ItPmRhdGEgLSBoZWFkZXJfc2l6ZSwgc2tiLT5uZl9icmlkZ2UtPmRhdGEsIGhlYWRlcl9zaXplKTsKKwlza2JfY29weV90b19saW5lYXJfZGF0YV9vZmZzZXQoc2tiLCAtaGVhZGVyX3NpemUsCisJCQkJICAgICAgIHNrYi0+bmZfYnJpZGdlLT5kYXRhLCBoZWFkZXJfc2l6ZSk7CiAKIAlpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF84MDIxUSkpCiAJCV9fc2tiX3B1c2goc2tiLCBWTEFOX0hMRU4pOworCWVsc2UgaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfUFBQX1NFUykpCisJCV9fc2tiX3B1c2goc2tiLCBQUFBPRV9TRVNfSExFTik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE3NCw3ICsyMDIsMTAgQEAKIAlza2ItPmRldiA9IG5mX2JyaWRnZS0+cGh5c2luZGV2OwogCWlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QXzgwMjFRKSkgewogCQlza2JfcHVzaChza2IsIFZMQU5fSExFTik7Ci0JCXNrYi0+bmgucmF3IC09IFZMQU5fSExFTjsKKwkJc2tiLT5uZXR3b3JrX2hlYWRlciAtPSBWTEFOX0hMRU47CisJfSBlbHNlIGlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX1BQUF9TRVMpKSB7CisJCXNrYl9wdXNoKHNrYiwgUFBQT0VfU0VTX0hMRU4pOworCQlza2ItPm5ldHdvcmtfaGVhZGVyIC09IFBQUE9FX1NFU19ITEVOOwogCX0KIAlORl9IT09LX1RIUkVTSChQRl9CUklER0UsIE5GX0JSX1BSRV9ST1VUSU5HLCBza2IsIHNrYi0+ZGV2LCBOVUxMLAogCQkgICAgICAgYnJfaGFuZGxlX2ZyYW1lX2ZpbmlzaCwgMSk7CkBAIC0yNTUsNyArMjg2LDEwIEBACiAJZWxzZSB7CiAJCWlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QXzgwMjFRKSkgewogCQkJc2tiX3B1bGwoc2tiLCBWTEFOX0hMRU4pOwotCQkJc2tiLT5uaC5yYXcgKz0gVkxBTl9ITEVOOworCQkJc2tiLT5uZXR3b3JrX2hlYWRlciArPSBWTEFOX0hMRU47CisJCX0gZWxzZSBpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9QUFBfU0VTKSkgeworCQkJc2tiX3B1bGwoc2tiLCBQUFBPRV9TRVNfSExFTik7CisJCQlza2ItPm5ldHdvcmtfaGVhZGVyICs9IFBQUE9FX1NFU19ITEVOOwogCQl9CiAJCXNrYi0+ZHN0LT5vdXRwdXQoc2tiKTsKIAl9CkBAIC0yNjUsNyArMjk5LDcgQEAKIHN0YXRpYyBpbnQgYnJfbmZfcHJlX3JvdXRpbmdfZmluaXNoKHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHNrYi0+ZGV2OwotCXN0cnVjdCBpcGhkciAqaXBoID0gc2tiLT5uaC5pcGg7CisJc3RydWN0IGlwaGRyICppcGggPSBpcF9oZHIoc2tiKTsKIAlzdHJ1Y3QgbmZfYnJpZGdlX2luZm8gKm5mX2JyaWRnZSA9IHNrYi0+bmZfYnJpZGdlOwogCWludCBlcnI7CiAKQEAgLTMyNSw3ICszNTksMTEgQEAKIAkJCQlpZiAoc2tiLT5wcm90b2NvbCA9PQogCQkJCSAgICBodG9ucyhFVEhfUF84MDIxUSkpIHsKIAkJCQkJc2tiX3B1c2goc2tiLCBWTEFOX0hMRU4pOwotCQkJCQlza2ItPm5oLnJhdyAtPSBWTEFOX0hMRU47CisJCQkJCXNrYi0+bmV0d29ya19oZWFkZXIgLT0gVkxBTl9ITEVOOworCQkJCX0gZWxzZSBpZihza2ItPnByb3RvY29sID09CisJCQkJICAgIGh0b25zKEVUSF9QX1BQUF9TRVMpKSB7CisJCQkJCXNrYl9wdXNoKHNrYiwgUFBQT0VfU0VTX0hMRU4pOworCQkJCQlza2ItPm5ldHdvcmtfaGVhZGVyIC09IFBQUE9FX1NFU19ITEVOOwogCQkJCX0KIAkJCQlORl9IT09LX1RIUkVTSChQRl9CUklER0UsIE5GX0JSX1BSRV9ST1VUSU5HLAogCQkJCQkgICAgICAgc2tiLCBza2ItPmRldiwgTlVMTCwKQEAgLTM0NCw3ICszODIsMTAgQEAKIAlza2ItPmRldiA9IG5mX2JyaWRnZS0+cGh5c2luZGV2OwogCWlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QXzgwMjFRKSkgewogCQlza2JfcHVzaChza2IsIFZMQU5fSExFTik7Ci0JCXNrYi0+bmgucmF3IC09IFZMQU5fSExFTjsKKwkJc2tiLT5uZXR3b3JrX2hlYWRlciAtPSBWTEFOX0hMRU47CisJfSBlbHNlIGlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX1BQUF9TRVMpKSB7CisJCXNrYl9wdXNoKHNrYiwgUFBQT0VfU0VTX0hMRU4pOworCQlza2ItPm5ldHdvcmtfaGVhZGVyIC09IFBQUE9FX1NFU19ITEVOOwogCX0KIAlORl9IT09LX1RIUkVTSChQRl9CUklER0UsIE5GX0JSX1BSRV9ST1VUSU5HLCBza2IsIHNrYi0+ZGV2LCBOVUxMLAogCQkgICAgICAgYnJfaGFuZGxlX2ZyYW1lX2ZpbmlzaCwgMSk7CkBAIC0zNzIsOSArNDEzLDEwIEBACiAvKiBXZSBvbmx5IGNoZWNrIHRoZSBsZW5ndGguIEEgYnJpZGdlIHNob3VsZG4ndCBkbyBhbnkgaG9wLWJ5LWhvcCBzdHVmZiBhbnl3YXkgKi8KIHN0YXRpYyBpbnQgY2hlY2tfaGJoX2xlbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXVuc2lnbmVkIGNoYXIgKnJhdyA9ICh1OCAqKSAoc2tiLT5uaC5pcHY2aCArIDEpOworCXVuc2lnbmVkIGNoYXIgKnJhdyA9ICh1OCAqKShpcHY2X2hkcihza2IpICsgMSk7CiAJdTMyIHBrdF9sZW47Ci0JaW50IG9mZiA9IHJhdyAtIHNrYi0+bmgucmF3OworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKm5oID0gc2tiX25ldHdvcmtfaGVhZGVyKHNrYik7CisJaW50IG9mZiA9IHJhdyAtIG5oOwogCWludCBsZW4gPSAocmF3WzFdICsgMSkgPDwgMzsKIAogCWlmICgocmF3ICsgbGVuKSAtIHNrYi0+ZGF0YSA+IHNrYl9oZWFkbGVuKHNrYikpCkBAIC0zODQsOSArNDI2LDkgQEAKIAlsZW4gLT0gMjsKIAogCXdoaWxlIChsZW4gPiAwKSB7Ci0JCWludCBvcHRsZW4gPSBza2ItPm5oLnJhd1tvZmYgKyAxXSArIDI7CisJCWludCBvcHRsZW4gPSBuaFtvZmYgKyAxXSArIDI7CiAKLQkJc3dpdGNoIChza2ItPm5oLnJhd1tvZmZdKSB7CisJCXN3aXRjaCAobmhbb2ZmXSkgewogCQljYXNlIElQVjZfVExWX1BBRDA6CiAJCQlvcHRsZW4gPSAxOwogCQkJYnJlYWs7CkBAIC0zOTUsMTcgKzQzNywxOCBAQAogCQkJYnJlYWs7CiAKIAkJY2FzZSBJUFY2X1RMVl9KVU1CTzoKLQkJCWlmIChza2ItPm5oLnJhd1tvZmYgKyAxXSAhPSA0IHx8IChvZmYgJiAzKSAhPSAyKQorCQkJaWYgKG5oW29mZiArIDFdICE9IDQgfHwgKG9mZiAmIDMpICE9IDIpCiAJCQkJZ290byBiYWQ7Ci0JCQlwa3RfbGVuID0gbnRvaGwoKihfX2JlMzIgKikgKHNrYi0+bmgucmF3ICsgb2ZmICsgMikpOworCQkJcGt0X2xlbiA9IG50b2hsKCooX19iZTMyICopIChuaCArIG9mZiArIDIpKTsKIAkJCWlmIChwa3RfbGVuIDw9IElQVjZfTUFYUExFTiB8fAotCQkJICAgIHNrYi0+bmguaXB2NmgtPnBheWxvYWRfbGVuKQorCQkJICAgIGlwdjZfaGRyKHNrYiktPnBheWxvYWRfbGVuKQogCQkJCWdvdG8gYmFkOwogCQkJaWYgKHBrdF9sZW4gPiBza2ItPmxlbiAtIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikpCiAJCQkJZ290byBiYWQ7CiAJCQlpZiAocHNrYl90cmltX3Jjc3VtKHNrYiwKIAkJCQkJICAgIHBrdF9sZW4gKyBzaXplb2Yoc3RydWN0IGlwdjZoZHIpKSkKIAkJCQlnb3RvIGJhZDsKKwkJCW5oID0gc2tiX25ldHdvcmtfaGVhZGVyKHNrYik7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCWlmIChvcHRsZW4gPiBsZW4pCkBAIC00MzksNyArNDgyLDcgQEAKIAlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IGlwdjZoZHIpKSkKIAkJZ290byBpbmhkcl9lcnJvcjsKIAotCWhkciA9IHNrYi0+bmguaXB2Nmg7CisJaGRyID0gaXB2Nl9oZHIoc2tiKTsKIAogCWlmIChoZHItPnZlcnNpb24gIT0gNikKIAkJZ290byBpbmhkcl9lcnJvcjsKQEAgLTQ4NSw3ICs1MjgsOCBAQAogCV9fdTMyIGxlbjsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gKnBza2I7CiAKLQlpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9JUFY2KSB8fCBJU19WTEFOX0lQVjYoc2tiKSkgeworCWlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX0lQVjYpIHx8IElTX1ZMQU5fSVBWNihza2IpIHx8CisJICAgIElTX1BQUE9FX0lQVjYoc2tiKSkgewogI2lmZGVmIENPTkZJR19TWVNDVEwKIAkJaWYgKCFicm5mX2NhbGxfaXA2dGFibGVzKQogCQkJcmV0dXJuIE5GX0FDQ0VQVDsKQEAgLTQ5NSw3ICs1MzksMTAgQEAKIAogCQlpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF84MDIxUSkpIHsKIAkJCXNrYl9wdWxsX3Jjc3VtKHNrYiwgVkxBTl9ITEVOKTsKLQkJCXNrYi0+bmgucmF3ICs9IFZMQU5fSExFTjsKKwkJCXNrYi0+bmV0d29ya19oZWFkZXIgKz0gVkxBTl9ITEVOOworCQl9IGVsc2UgaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfUFBQX1NFUykpIHsKKwkJCXNrYl9wdWxsX3Jjc3VtKHNrYiwgUFBQT0VfU0VTX0hMRU4pOworCQkJc2tiLT5uZXR3b3JrX2hlYWRlciArPSBQUFBPRV9TRVNfSExFTjsKIAkJfQogCQlyZXR1cm4gYnJfbmZfcHJlX3JvdXRpbmdfaXB2Nihob29rLCBza2IsIGluLCBvdXQsIG9rZm4pOwogCX0KQEAgLTUwNCw3ICs1NTEsOCBAQAogCQlyZXR1cm4gTkZfQUNDRVBUOwogI2VuZGlmCiAKLQlpZiAoc2tiLT5wcm90b2NvbCAhPSBodG9ucyhFVEhfUF9JUCkgJiYgIUlTX1ZMQU5fSVAoc2tiKSkKKwlpZiAoc2tiLT5wcm90b2NvbCAhPSBodG9ucyhFVEhfUF9JUCkgJiYgIUlTX1ZMQU5fSVAoc2tiKSAmJgorCSAgICAhSVNfUFBQT0VfSVAoc2tiKSkKIAkJcmV0dXJuIE5GX0FDQ0VQVDsKIAogCWlmICgoc2tiID0gc2tiX3NoYXJlX2NoZWNrKCpwc2tiLCBHRlBfQVRPTUlDKSkgPT0gTlVMTCkKQEAgLTUxMiwyMCArNTYwLDIzIEBACiAKIAlpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF84MDIxUSkpIHsKIAkJc2tiX3B1bGxfcmNzdW0oc2tiLCBWTEFOX0hMRU4pOwotCQlza2ItPm5oLnJhdyArPSBWTEFOX0hMRU47CisJCXNrYi0+bmV0d29ya19oZWFkZXIgKz0gVkxBTl9ITEVOOworCX0gZWxzZSBpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9QUFBfU0VTKSkgeworCQlza2JfcHVsbF9yY3N1bShza2IsIFBQUE9FX1NFU19ITEVOKTsKKwkJc2tiLT5uZXR3b3JrX2hlYWRlciArPSBQUFBPRV9TRVNfSExFTjsKIAl9CiAKIAlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IGlwaGRyKSkpCiAJCWdvdG8gaW5oZHJfZXJyb3I7CiAKLQlpcGggPSBza2ItPm5oLmlwaDsKKwlpcGggPSBpcF9oZHIoc2tiKTsKIAlpZiAoaXBoLT5paGwgPCA1IHx8IGlwaC0+dmVyc2lvbiAhPSA0KQogCQlnb3RvIGluaGRyX2Vycm9yOwogCiAJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgNCAqIGlwaC0+aWhsKSkKIAkJZ290byBpbmhkcl9lcnJvcjsKIAotCWlwaCA9IHNrYi0+bmguaXBoOworCWlwaCA9IGlwX2hkcihza2IpOwogCWlmIChpcF9mYXN0X2NzdW0oKF9fdTggKikgaXBoLCBpcGgtPmlobCkgIT0gMCkKIAkJZ290byBpbmhkcl9lcnJvcjsKIApAQCAtNTkzLDcgKzY0NCwxMCBAQAogCX0KIAlpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF84MDIxUSkpIHsKIAkJc2tiX3B1c2goc2tiLCBWTEFOX0hMRU4pOwotCQlza2ItPm5oLnJhdyAtPSBWTEFOX0hMRU47CisJCXNrYi0+bmV0d29ya19oZWFkZXIgLT0gVkxBTl9ITEVOOworCX0gZWxzZSBpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9QUFBfU0VTKSkgeworCQlza2JfcHVzaChza2IsIFBQUE9FX1NFU19ITEVOKTsKKwkJc2tiLT5uZXR3b3JrX2hlYWRlciAtPSBQUFBPRV9TRVNfSExFTjsKIAl9CiAJTkZfSE9PS19USFJFU0goUEZfQlJJREdFLCBORl9CUl9GT1JXQVJELCBza2IsIGluLAogCQkgICAgICAgc2tiLT5kZXYsIGJyX2ZvcndhcmRfZmluaXNoLCAxKTsKQEAgLTYyMiwxNCArNjc2LDE4IEBACiAJaWYgKCFwYXJlbnQpCiAJCXJldHVybiBORl9EUk9QOwogCi0JaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfSVApIHx8IElTX1ZMQU5fSVAoc2tiKSkKKwlpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9JUCkgfHwgSVNfVkxBTl9JUChza2IpIHx8CisJICAgIElTX1BQUE9FX0lQKHNrYikpCiAJCXBmID0gUEZfSU5FVDsKIAllbHNlCiAJCXBmID0gUEZfSU5FVDY7CiAKIAlpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF84MDIxUSkpIHsKIAkJc2tiX3B1bGwoKnBza2IsIFZMQU5fSExFTik7Ci0JCSgqcHNrYiktPm5oLnJhdyArPSBWTEFOX0hMRU47CisJCSgqcHNrYiktPm5ldHdvcmtfaGVhZGVyICs9IFZMQU5fSExFTjsKKwl9IGVsc2UgaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfUFBQX1NFUykpIHsKKwkJc2tiX3B1bGwoKnBza2IsIFBQUE9FX1NFU19ITEVOKTsKKwkJKCpwc2tiKS0+bmV0d29ya19oZWFkZXIgKz0gUFBQT0VfU0VTX0hMRU47CiAJfQogCiAJbmZfYnJpZGdlID0gc2tiLT5uZl9icmlkZ2U7CkBAIC02NjUsMTMgKzcyMywxMyBAQAogCQlpZiAoIUlTX1ZMQU5fQVJQKHNrYikpCiAJCQlyZXR1cm4gTkZfQUNDRVBUOwogCQlza2JfcHVsbCgqcHNrYiwgVkxBTl9ITEVOKTsKLQkJKCpwc2tiKS0+bmgucmF3ICs9IFZMQU5fSExFTjsKKwkJKCpwc2tiKS0+bmV0d29ya19oZWFkZXIgKz0gVkxBTl9ITEVOOwogCX0KIAotCWlmIChza2ItPm5oLmFycGgtPmFyX3BsbiAhPSA0KSB7CisJaWYgKGFycF9oZHIoc2tiKS0+YXJfcGxuICE9IDQpIHsKIAkJaWYgKElTX1ZMQU5fQVJQKHNrYikpIHsKIAkJCXNrYl9wdXNoKCpwc2tiLCBWTEFOX0hMRU4pOwotCQkJKCpwc2tiKS0+bmgucmF3IC09IFZMQU5fSExFTjsKKwkJCSgqcHNrYiktPm5ldHdvcmtfaGVhZGVyIC09IFZMQU5fSExFTjsKIAkJfQogCQlyZXR1cm4gTkZfQUNDRVBUOwogCX0KQEAgLTcyMSw3ICs3NzksMTAgQEAKIAl9CiAJaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfODAyMVEpKSB7CiAJCXNrYl9wdXNoKHNrYiwgVkxBTl9ITEVOKTsKLQkJc2tiLT5uaC5yYXcgLT0gVkxBTl9ITEVOOworCQlza2ItPm5ldHdvcmtfaGVhZGVyIC09IFZMQU5fSExFTjsKKwl9IGVsc2UgaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfUFBQX1NFUykpIHsKKwkJc2tiX3B1c2goc2tiLCBQUFBPRV9TRVNfSExFTik7CisJCXNrYi0+bmV0d29ya19oZWFkZXIgLT0gUFBQT0VfU0VTX0hMRU47CiAJfQogCiAJTkZfSE9PSyhQRl9CUklER0UsIE5GX0JSX0ZPUldBUkQsIHNrYiwgcmVhbGluZGV2LCBza2ItPmRldiwKQEAgLTc1Myw3ICs4MTQsOCBAQAogI2lmZGVmIENPTkZJR19ORVRGSUxURVJfREVCVUcKIAkvKiBCZSB2ZXJ5IHBhcmFub2lkLiBUaGlzIHByb2JhYmx5IHdvbid0IGhhcHBlbiBhbnltb3JlLCBidXQgbGV0J3MKIAkgKiBrZWVwIHRoZSBjaGVjayBqdXN0IHRvIGJlIHN1cmUuLi4gKi8KLQlpZiAoc2tiLT5tYWMucmF3IDwgc2tiLT5oZWFkIHx8IHNrYi0+bWFjLnJhdyArIEVUSF9ITEVOID4gc2tiLT5kYXRhKSB7CisJaWYgKHNrYl9tYWNfaGVhZGVyKHNrYikgPCBza2ItPmhlYWQgfHwKKwkgICAgc2tiX21hY19oZWFkZXIoc2tiKSArIEVUSF9ITEVOID4gc2tiLT5kYXRhKSB7CiAJCXByaW50ayhLRVJOX0NSSVQgImJyX25ldGZpbHRlcjogQXJnaCEhIGJyX25mX3Bvc3Rfcm91dGluZzogIgogCQkgICAgICAgImJhZCBtYWMucmF3IHBvaW50ZXIuXG4iKTsKIAkJZ290byBwcmludF9lcnJvcjsKQEAgLTc2Niw3ICs4MjgsOCBAQAogCWlmICghcmVhbG91dGRldikKIAkJcmV0dXJuIE5GX0RST1A7CiAKLQlpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9JUCkgfHwgSVNfVkxBTl9JUChza2IpKQorCWlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX0lQKSB8fCBJU19WTEFOX0lQKHNrYikgfHwKKwkgICAgSVNfUFBQT0VfSVAoc2tiKSkKIAkJcGYgPSBQRl9JTkVUOwogCWVsc2UKIAkJcGYgPSBQRl9JTkVUNjsKQEAgLTc4Nyw3ICs4NTAsMTAgQEAKIAogCWlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QXzgwMjFRKSkgewogCQlza2JfcHVsbChza2IsIFZMQU5fSExFTik7Ci0JCXNrYi0+bmgucmF3ICs9IFZMQU5fSExFTjsKKwkJc2tiLT5uZXR3b3JrX2hlYWRlciArPSBWTEFOX0hMRU47CisJfSBlbHNlIGlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX1BQUF9TRVMpKSB7CisJCXNrYl9wdWxsKHNrYiwgUFBQT0VfU0VTX0hMRU4pOworCQlza2ItPm5ldHdvcmtfaGVhZGVyICs9IFBQUE9FX1NFU19ITEVOOwogCX0KIAogCW5mX2JyaWRnZV9zYXZlX2hlYWRlcihza2IpOwpAQCAtODA4LDcgKzg3NCw3IEBACiAJCWlmIChyZWFsb3V0ZGV2KQogCQkJcHJpbnRrKCJbJXNdIiwgcmVhbG91dGRldi0+bmFtZSk7CiAJfQotCXByaW50aygiIGhlYWQ6JXAsIHJhdzolcCwgZGF0YTolcFxuIiwgc2tiLT5oZWFkLCBza2ItPm1hYy5yYXcsCisJcHJpbnRrKCIgaGVhZDolcCwgcmF3OiVwLCBkYXRhOiVwXG4iLCBza2ItPmhlYWQsIHNrYl9tYWNfaGVhZGVyKHNrYiksCiAJICAgICAgIHNrYi0+ZGF0YSk7CiAJZHVtcF9zdGFjaygpOwogCXJldHVybiBORl9BQ0NFUFQ7CkBAIC05MjUsNiArOTkxLDE0IEBACiAJCS5tb2RlCQk9IDA2NDQsCiAJCS5wcm9jX2hhbmRsZXIJPSAmYnJuZl9zeXNjdGxfY2FsbF90YWJsZXMsCiAJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9CUklER0VfTkZfRklMVEVSX1BQUE9FX1RBR0dFRCwKKwkJLnByb2NuYW1lCT0gImJyaWRnZS1uZi1maWx0ZXItcHBwb2UtdGFnZ2VkIiwKKwkJLmRhdGEJCT0gJmJybmZfZmlsdGVyX3BwcG9lX3RhZ2dlZCwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZicm5mX3N5c2N0bF9jYWxsX3RhYmxlcywKKwl9LAogCXsgLmN0bF9uYW1lID0gMCB9CiB9OwogCmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX25ldGxpbmsuYyBiL25ldC9icmlkZ2UvYnJfbmV0bGluay5jCmluZGV4IDdkNjhiMjQuLjM1ZmFjYzAgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvYnJfbmV0bGluay5jCisrKyBiL25ldC9icmlkZ2UvYnJfbmV0bGluay5jCkBAIC0xMSw4ICsxMSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgotI2luY2x1ZGUgPG5ldC9uZXRsaW5rLmg+CisjaW5jbHVkZSA8bmV0L3J0bmV0bGluay5oPgogI2luY2x1ZGUgImJyX3ByaXZhdGUuaCIKIAogc3RhdGljIGlubGluZSBzaXplX3QgYnJfbmxtc2dfc2l6ZSh2b2lkKQpAQCAtMTEwLDcgKzEwOSw2IEBACiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIAlpbnQgaWR4OwogCi0JcmVhZF9sb2NrKCZkZXZfYmFzZV9sb2NrKTsKIAlmb3IgKGRldiA9IGRldl9iYXNlLCBpZHggPSAwOyBkZXY7IGRldiA9IGRldi0+bmV4dCkgewogCQkvKiBub3QgYSBicmlkZ2UgcG9ydCAqLwogCQlpZiAoZGV2LT5icl9wb3J0ID09IE5VTEwgfHwgaWR4IDwgY2ItPmFyZ3NbMF0pCkBAIC0xMjMsNyArMTIxLDYgQEAKIHNraXA6CiAJCSsraWR4OwogCX0KLQlyZWFkX3VubG9jaygmZGV2X2Jhc2VfbG9jayk7CiAKIAljYi0+YXJnc1swXSA9IGlkeDsKIApAQCAtMTY2LDcgKzE2Myw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJLyogaWYga2VybmVsIFNUUCBpcyBydW5uaW5nLCBkb24ndCBhbGxvdyBjaGFuZ2VzICovCi0JaWYgKHAtPmJyLT5zdHBfZW5hYmxlZCkKKwlpZiAocC0+YnItPnN0cF9lbmFibGVkID09IEJSX0tFUk5FTF9TVFApCiAJCXJldHVybiAtRUJVU1k7CiAKIAlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSB8fApAQCAtMTc5LDE4ICsxNzYsMTkgQEAKIH0KIAogCi1zdGF0aWMgc3RydWN0IHJ0bmV0bGlua19saW5rIGJyaWRnZV9ydG5ldGxpbmtfdGFibGVbUlRNX05SX01TR1RZUEVTXSA9IHsKLQlbUlRNX0dFVExJTksgLSBSVE1fQkFTRV0gPSB7IC5kdW1waXQJPSBicl9kdW1wX2lmaW5mbywgfSwKLQlbUlRNX1NFVExJTksgLSBSVE1fQkFTRV0gPSB7IC5kb2l0ICAgICAgPSBicl9ydG1fc2V0bGluaywgfSwKLX07Ci0KLXZvaWQgX19pbml0IGJyX25ldGxpbmtfaW5pdCh2b2lkKQoraW50IF9faW5pdCBicl9uZXRsaW5rX2luaXQodm9pZCkKIHsKLQlydG5ldGxpbmtfbGlua3NbUEZfQlJJREdFXSA9IGJyaWRnZV9ydG5ldGxpbmtfdGFibGU7CisJaWYgKF9fcnRubF9yZWdpc3RlcihQRl9CUklER0UsIFJUTV9HRVRMSU5LLCBOVUxMLCBicl9kdW1wX2lmaW5mbykpCisJCXJldHVybiAtRU5PQlVGUzsKKworCS8qIE9ubHkgdGhlIGZpcnN0IGNhbGwgdG8gX19ydG5sX3JlZ2lzdGVyIGNhbiBmYWlsICovCisJX19ydG5sX3JlZ2lzdGVyKFBGX0JSSURHRSwgUlRNX1NFVExJTkssIGJyX3J0bV9zZXRsaW5rLCBOVUxMKTsKKworCXJldHVybiAwOwogfQogCiB2b2lkIF9fZXhpdCBicl9uZXRsaW5rX2Zpbmkodm9pZCkKIHsKLQlydG5ldGxpbmtfbGlua3NbUEZfQlJJREdFXSA9IE5VTEw7CisJcnRubF91bnJlZ2lzdGVyX2FsbChQRl9CUklER0UpOwogfQogCmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX25vdGlmeS5jIGIvbmV0L2JyaWRnZS9icl9ub3RpZnkuYwppbmRleCAzNzM1N2VkLi5jODQ1MWQzIDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL2JyX25vdGlmeS5jCisrKyBiL25ldC9icmlkZ2UvYnJfbm90aWZ5LmMKQEAgLTUwLDcgKzUwLDYgQEAKIAljYXNlIE5FVERFVl9DSEFOR0VBRERSOgogCQlzcGluX2xvY2tfYmgoJmJyLT5sb2NrKTsKIAkJYnJfZmRiX2NoYW5nZWFkZHIocCwgZGV2LT5kZXZfYWRkcik7Ci0JCWJyX2lmaW5mb19ub3RpZnkoUlRNX05FV0xJTkssIHApOwogCQlicl9zdHBfcmVjYWxjdWxhdGVfYnJpZGdlX2lkKGJyKTsKIAkJc3Bpbl91bmxvY2tfYmgoJmJyLT5sb2NrKTsKIAkJYnJlYWs7CkBAIC03NCwxMCArNzMsMTEgQEAKIAkJYnJlYWs7CiAKIAljYXNlIE5FVERFVl9VUDoKLQkJc3Bpbl9sb2NrX2JoKCZici0+bG9jayk7Ci0JCWlmIChuZXRpZl9jYXJyaWVyX29rKGRldikgJiYgKGJyLT5kZXYtPmZsYWdzICYgSUZGX1VQKSkKKwkJaWYgKG5ldGlmX2NhcnJpZXJfb2soZGV2KSAmJiAoYnItPmRldi0+ZmxhZ3MgJiBJRkZfVVApKSB7CisJCQlzcGluX2xvY2tfYmgoJmJyLT5sb2NrKTsKIAkJCWJyX3N0cF9lbmFibGVfcG9ydChwKTsKLQkJc3Bpbl91bmxvY2tfYmgoJmJyLT5sb2NrKTsKKwkJCXNwaW5fdW5sb2NrX2JoKCZici0+bG9jayk7CisJCX0KIAkJYnJlYWs7CiAKIAljYXNlIE5FVERFVl9VTlJFR0lTVEVSOgpAQCAtODUsNSArODUsMTAgQEAKIAkJYnJlYWs7CiAJfQogCisJLyogRXZlbnRzIHRoYXQgbWF5IGNhdXNlIHNwYW5uaW5nIHRyZWUgdG8gcmVmcmVzaCAqLworCWlmIChldmVudCA9PSBORVRERVZfQ0hBTkdFQUREUiB8fCBldmVudCA9PSBORVRERVZfVVAgfHwKKwkgICAgZXZlbnQgPT0gTkVUREVWX0NIQU5HRSB8fCBldmVudCA9PSBORVRERVZfRE9XTikKKwkJYnJfaWZpbmZvX25vdGlmeShSVE1fTkVXTElOSywgcCk7CisKIAlyZXR1cm4gTk9USUZZX0RPTkU7CiB9CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX3ByaXZhdGUuaCBiL25ldC9icmlkZ2UvYnJfcHJpdmF0ZS5oCmluZGV4IGNjM2YxYzkuLjIxYmYzYTkgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvYnJfcHJpdmF0ZS5oCisrKyBiL25ldC9icmlkZ2UvYnJfcHJpdmF0ZS5oCkBAIC0yNiw3ICsyNiwxMCBAQAogI2RlZmluZSBCUl9QT1JUX0JJVFMJMTAKICNkZWZpbmUgQlJfTUFYX1BPUlRTCSgxPDxCUl9QT1JUX0JJVFMpCiAKLSNkZWZpbmUgQlJfVkVSU0lPTgkiMi4yIgorI2RlZmluZSBCUl9WRVJTSU9OCSIyLjMiCisKKy8qIFBhdGggdG8gdXNlcm1vZGUgc3Bhbm5pbmcgdHJlZSBwcm9ncmFtICovCisjZGVmaW5lIEJSX1NUUF9QUk9HCSIvc2Jpbi9icmlkZ2Utc3RwIgogCiB0eXBlZGVmIHN0cnVjdCBicmlkZ2VfaWQgYnJpZGdlX2lkOwogdHlwZWRlZiBzdHJ1Y3QgbWFjX2FkZHIgbWFjX2FkZHI7CkBAIC0xMDcsNyArMTEwLDEzIEBACiAKIAl1OAkJCQlncm91cF9hZGRyW0VUSF9BTEVOXTsKIAl1MTYJCQkJcm9vdF9wb3J0OwotCXVuc2lnbmVkIGNoYXIJCQlzdHBfZW5hYmxlZDsKKworCWVudW0geworCQlCUl9OT19TVFAsIAkJLyogbm8gc3Bhbm5pbmcgdHJlZSAqLworCQlCUl9LRVJORUxfU1RQLAkJLyogb2xkIFNUUCBpbiBrZXJuZWwgKi8KKwkJQlJfVVNFUl9TVFAsCQkvKiBuZXcgUlNUUCBpbiB1c2Vyc3BhY2UgKi8KKwl9IHN0cF9lbmFibGVkOworCiAJdW5zaWduZWQgY2hhcgkJCXRvcG9sb2d5X2NoYW5nZTsKIAl1bnNpZ25lZCBjaGFyCQkJdG9wb2xvZ3lfY2hhbmdlX2RldGVjdGVkOwogCkBAIC0xMjcsMTQgKzEzNiwxNCBAQAogCXJldHVybiAhbWVtY21wKCZici0+YnJpZGdlX2lkLCAmYnItPmRlc2lnbmF0ZWRfcm9vdCwgOCk7CiB9CiAKLQogLyogYnJfZGV2aWNlLmMgKi8KIGV4dGVybiB2b2lkIGJyX2Rldl9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIGV4dGVybiBpbnQgYnJfZGV2X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiAKIC8qIGJyX2ZkYi5jICovCi1leHRlcm4gdm9pZCBicl9mZGJfaW5pdCh2b2lkKTsKK2V4dGVybiBpbnQgYnJfZmRiX2luaXQodm9pZCk7CiBleHRlcm4gdm9pZCBicl9mZGJfZmluaSh2b2lkKTsKK2V4dGVybiB2b2lkIGJyX2ZkYl9mbHVzaChzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIpOwogZXh0ZXJuIHZvaWQgYnJfZmRiX2NoYW5nZWFkZHIoc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCwKIAkJCSAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm5ld2FkZHIpOwogZXh0ZXJuIHZvaWQgYnJfZmRiX2NsZWFudXAodW5zaWduZWQgbG9uZyBhcmcpOwpAQCAtMTgyLDcgKzE5MSw4IEBACiAKIC8qIGJyX2lucHV0LmMgKi8KIGV4dGVybiBpbnQgYnJfaGFuZGxlX2ZyYW1lX2ZpbmlzaChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLWV4dGVybiBpbnQgYnJfaGFuZGxlX2ZyYW1lKHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAsIHN0cnVjdCBza19idWZmICoqcHNrYik7CitleHRlcm4gc3RydWN0IHNrX2J1ZmYgKmJyX2hhbmRsZV9mcmFtZShzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLAorCQkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIAogLyogYnJfaW9jdGwuYyAqLwogZXh0ZXJuIGludCBicl9kZXZfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCk7CkBAIC0yMDcsNiArMjE3LDcgQEAKIC8qIGJyX3N0cF9pZi5jICovCiBleHRlcm4gdm9pZCBicl9zdHBfZW5hYmxlX2JyaWRnZShzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIpOwogZXh0ZXJuIHZvaWQgYnJfc3RwX2Rpc2FibGVfYnJpZGdlKHN0cnVjdCBuZXRfYnJpZGdlICpicik7CitleHRlcm4gdm9pZCBicl9zdHBfc2V0X2VuYWJsZWQoc3RydWN0IG5ldF9icmlkZ2UgKmJyLCB1bnNpZ25lZCBsb25nIHZhbCk7CiBleHRlcm4gdm9pZCBicl9zdHBfZW5hYmxlX3BvcnQoc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCk7CiBleHRlcm4gdm9pZCBicl9zdHBfZGlzYWJsZV9wb3J0KHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnApOwogZXh0ZXJuIHZvaWQgYnJfc3RwX3JlY2FsY3VsYXRlX2JyaWRnZV9pZChzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIpOwpAQCAtMjM1LDcgKzI0Niw3IEBACiAKIAogLyogYnJfbmV0bGluay5jICovCi1leHRlcm4gdm9pZCBicl9uZXRsaW5rX2luaXQodm9pZCk7CitleHRlcm4gaW50IGJyX25ldGxpbmtfaW5pdCh2b2lkKTsKIGV4dGVybiB2b2lkIGJyX25ldGxpbmtfZmluaSh2b2lkKTsKIGV4dGVybiB2b2lkIGJyX2lmaW5mb19ub3RpZnkoaW50IGV2ZW50LCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwb3J0KTsKIApkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9icl9zdHAuYyBiL25ldC9icmlkZ2UvYnJfc3RwLmMKaW5kZXggZjlmZjRkNS4uZWJiMDg2MSAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl9zdHAuYworKysgYi9uZXQvYnJpZGdlL2JyX3N0cC5jCkBAIC0zNzAsMTEgKzM3MCwxMSBAQAogc3RhdGljIHZvaWQgYnJfbWFrZV9mb3J3YXJkaW5nKHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnApCiB7CiAJaWYgKHAtPnN0YXRlID09IEJSX1NUQVRFX0JMT0NLSU5HKSB7Ci0JCWlmIChwLT5ici0+c3RwX2VuYWJsZWQpIHsKKwkJaWYgKHAtPmJyLT5zdHBfZW5hYmxlZCA9PSBCUl9LRVJORUxfU1RQKQogCQkJcC0+c3RhdGUgPSBCUl9TVEFURV9MSVNURU5JTkc7Ci0JCX0gZWxzZSB7CisJCWVsc2UKIAkJCXAtPnN0YXRlID0gQlJfU1RBVEVfTEVBUk5JTkc7Ci0JCX0KKwogCQlicl9sb2dfc3RhdGUocCk7CiAJCW1vZF90aW1lcigmcC0+Zm9yd2FyZF9kZWxheV90aW1lciwgamlmZmllcyArIHAtPmJyLT5mb3J3YXJkX2RlbGF5KTsJfQogfQpAQCAtMzg0LDYgKzM4NCwxMCBAQAogewogCXN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnA7CiAKKwkvKiBEb24ndCBjaGFuZ2UgcG9ydCBzdGF0ZXMgaWYgdXNlcnNwYWNlIGlzIGhhbmRsaW5nIFNUUCAqLworCWlmIChici0+c3RwX2VuYWJsZWQgPT0gQlJfVVNFUl9TVFApCisJCXJldHVybjsKKwogCWxpc3RfZm9yX2VhY2hfZW50cnkocCwgJmJyLT5wb3J0X2xpc3QsIGxpc3QpIHsKIAkJaWYgKHAtPnN0YXRlICE9IEJSX1NUQVRFX0RJU0FCTEVEKSB7CiAJCQlpZiAocC0+cG9ydF9ubyA9PSBici0+cm9vdF9wb3J0KSB7CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX3N0cF9icGR1LmMgYi9uZXQvYnJpZGdlL2JyX3N0cF9icGR1LmMKaW5kZXggYjlmYjBkYy4uNjAxMTJiYyAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl9zdHBfYnBkdS5jCisrKyBiL25ldC9icmlkZ2UvYnJfc3RwX2JwZHUuYwpAQCAtMzMsOSArMzMsNiBAQAogewogCXN0cnVjdCBza19idWZmICpza2I7CiAKLQlpZiAoIXAtPmJyLT5zdHBfZW5hYmxlZCkKLQkJcmV0dXJuOwotCiAJc2tiID0gZGV2X2FsbG9jX3NrYihsZW5ndGgrTExDX1JFU0VSVkUpOwogCWlmICghc2tiKQogCQlyZXR1cm47CkBAIC03NSw2ICs3Miw5IEBACiB7CiAJdW5zaWduZWQgY2hhciBidWZbMzVdOwogCisJaWYgKHAtPmJyLT5zdHBfZW5hYmxlZCAhPSBCUl9LRVJORUxfU1RQKQorCQlyZXR1cm47CisKIAlidWZbMF0gPSAwOwogCWJ1ZlsxXSA9IDA7CiAJYnVmWzJdID0gMDsKQEAgLTExNyw2ICsxMTcsOSBAQAogewogCXVuc2lnbmVkIGNoYXIgYnVmWzRdOwogCisJaWYgKHAtPmJyLT5zdHBfZW5hYmxlZCAhPSBCUl9LRVJORUxfU1RQKQorCQlyZXR1cm47CisKIAlidWZbMF0gPSAwOwogCWJ1ZlsxXSA9IDA7CiAJYnVmWzJdID0gMDsKQEAgLTE1Nyw5ICsxNjAsMTMgQEAKIAliciA9IHAtPmJyOwogCXNwaW5fbG9jaygmYnItPmxvY2spOwogCi0JaWYgKHAtPnN0YXRlID09IEJSX1NUQVRFX0RJU0FCTEVECi0JICAgIHx8ICFici0+c3RwX2VuYWJsZWQKLQkgICAgfHwgIShici0+ZGV2LT5mbGFncyAmIElGRl9VUCkpCisJaWYgKGJyLT5zdHBfZW5hYmxlZCAhPSBCUl9LRVJORUxfU1RQKQorCQlnb3RvIG91dDsKKworCWlmICghKGJyLT5kZXYtPmZsYWdzICYgSUZGX1VQKSkKKwkJZ290byBvdXQ7CisKKwlpZiAocC0+c3RhdGUgPT0gQlJfU1RBVEVfRElTQUJMRUQpCiAJCWdvdG8gb3V0OwogCiAJaWYgKGNvbXBhcmVfZXRoZXJfYWRkcihkZXN0LCBici0+Z3JvdXBfYWRkcikgIT0gMCkKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvYnJfc3RwX2lmLmMgYi9uZXQvYnJpZGdlL2JyX3N0cF9pZi5jCmluZGV4IGEyODU4OTcuLjNlMjQ2YjMgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvYnJfc3RwX2lmLmMKKysrIGIvbmV0L2JyaWRnZS9icl9zdHBfaWYuYwpAQCAtODcsNyArODcsNiBAQAogdm9pZCBicl9zdHBfZW5hYmxlX3BvcnQoc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCkKIHsKIAlicl9pbml0X3BvcnQocCk7Ci0JYnJfaWZpbmZvX25vdGlmeShSVE1fTkVXTElOSywgcCk7CiAJYnJfcG9ydF9zdGF0ZV9zZWxlY3Rpb24ocC0+YnIpOwogfQogCkBAIC0xMDEsOCArMTAwLDYgQEAKIAlwcmludGsoS0VSTl9JTkZPICIlczogcG9ydCAlaSglcykgZW50ZXJpbmcgJXMgc3RhdGVcbiIsCiAJICAgICAgIGJyLT5kZXYtPm5hbWUsIHAtPnBvcnRfbm8sIHAtPmRldi0+bmFtZSwgImRpc2FibGVkIik7CiAKLQlicl9pZmluZm9fbm90aWZ5KFJUTV9ERUxMSU5LLCBwKTsKLQogCXdhc3Jvb3QgPSBicl9pc19yb290X2JyaWRnZShicik7CiAJYnJfYmVjb21lX2Rlc2lnbmF0ZWRfcG9ydChwKTsKIAlwLT5zdGF0ZSA9IEJSX1NUQVRFX0RJU0FCTEVEOwpAQCAtMTIzLDYgKzEyMCw2MiBAQAogCQlicl9iZWNvbWVfcm9vdF9icmlkZ2UoYnIpOwogfQogCitzdGF0aWMgdm9pZCBicl9zdHBfc3RhcnQoc3RydWN0IG5ldF9icmlkZ2UgKmJyKQoreworCWludCByOworCWNoYXIgKmFyZ3ZbXSA9IHsgQlJfU1RQX1BST0csIGJyLT5kZXYtPm5hbWUsICJzdGFydCIsIE5VTEwgfTsKKwljaGFyICplbnZwW10gPSB7IE5VTEwgfTsKKworCXIgPSBjYWxsX3VzZXJtb2RlaGVscGVyKEJSX1NUUF9QUk9HLCBhcmd2LCBlbnZwLCAxKTsKKwlpZiAociA9PSAwKSB7CisJCWJyLT5zdHBfZW5hYmxlZCA9IEJSX1VTRVJfU1RQOworCQlwcmludGsoS0VSTl9JTkZPICIlczogdXNlcnNwYWNlIFNUUCBzdGFydGVkXG4iLCBici0+ZGV2LT5uYW1lKTsKKwl9IGVsc2UgeworCQlici0+c3RwX2VuYWJsZWQgPSBCUl9LRVJORUxfU1RQOworCQlwcmludGsoS0VSTl9JTkZPICIlczogc3RhcnRpbmcgdXNlcnNwYWNlIFNUUCBmYWlsZWQsICIKKwkJCQkic3RhcmluZyBrZXJuZWwgU1RQXG4iLCBici0+ZGV2LT5uYW1lKTsKKworCQkvKiBUbyBzdGFydCB0aW1lcnMgb24gYW55IHBvcnRzIGxlZnQgaW4gYmxvY2tpbmcgKi8KKwkJc3Bpbl9sb2NrX2JoKCZici0+bG9jayk7CisJCWJyX3BvcnRfc3RhdGVfc2VsZWN0aW9uKGJyKTsKKwkJc3Bpbl91bmxvY2tfYmgoJmJyLT5sb2NrKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGJyX3N0cF9zdG9wKHN0cnVjdCBuZXRfYnJpZGdlICpicikKK3sKKwlpbnQgcjsKKwljaGFyICphcmd2W10gPSB7IEJSX1NUUF9QUk9HLCBici0+ZGV2LT5uYW1lLCAic3RvcCIsIE5VTEwgfTsKKwljaGFyICplbnZwW10gPSB7IE5VTEwgfTsKKworCWlmIChici0+c3RwX2VuYWJsZWQgPT0gQlJfVVNFUl9TVFApIHsKKwkJciA9IGNhbGxfdXNlcm1vZGVoZWxwZXIoQlJfU1RQX1BST0csIGFyZ3YsIGVudnAsIDEpOworCQlwcmludGsoS0VSTl9JTkZPICIlczogdXNlcnNwYWNlIFNUUCBzdG9wcGVkLCByZXR1cm4gY29kZSAlZFxuIiwKKwkJCWJyLT5kZXYtPm5hbWUsIHIpOworCisKKwkJLyogVG8gc3RhcnQgdGltZXJzIG9uIGFueSBwb3J0cyBsZWZ0IGluIGJsb2NraW5nICovCisJCXNwaW5fbG9ja19iaCgmYnItPmxvY2spOworCQlicl9wb3J0X3N0YXRlX3NlbGVjdGlvbihicik7CisJCXNwaW5fdW5sb2NrX2JoKCZici0+bG9jayk7CisJfQorCisJYnItPnN0cF9lbmFibGVkID0gQlJfTk9fU1RQOworfQorCit2b2lkIGJyX3N0cF9zZXRfZW5hYmxlZChzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsIHVuc2lnbmVkIGxvbmcgdmFsKQoreworCUFTU0VSVF9SVE5MKCk7CisKKwlpZiAodmFsKSB7CisJCWlmIChici0+c3RwX2VuYWJsZWQgPT0gQlJfTk9fU1RQKQorCQkJYnJfc3RwX3N0YXJ0KGJyKTsKKwl9IGVsc2UgeworCQlpZiAoYnItPnN0cF9lbmFibGVkICE9IEJSX05PX1NUUCkKKwkJCWJyX3N0cF9zdG9wKGJyKTsKKwl9Cit9CisKIC8qIGNhbGxlZCB1bmRlciBicmlkZ2UgbG9jayAqLwogdm9pZCBicl9zdHBfY2hhbmdlX2JyaWRnZV9pZChzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFkZHIpCiB7CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX3N5c2ZzX2JyLmMgYi9uZXQvYnJpZGdlL2JyX3N5c2ZzX2JyLmMKaW5kZXggMDFhMjJhZC4uMzNjNmM0YSAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl9zeXNmc19ici5jCisrKyBiL25ldC9icmlkZ2UvYnJfc3lzZnNfYnIuYwpAQCAtMTQ5LDcgKzE0OSwxMSBAQAogCiBzdGF0aWMgdm9pZCBzZXRfc3RwX3N0YXRlKHN0cnVjdCBuZXRfYnJpZGdlICpiciwgdW5zaWduZWQgbG9uZyB2YWwpCiB7Ci0JYnItPnN0cF9lbmFibGVkID0gdmFsOworCXJ0bmxfbG9jaygpOworCXNwaW5fdW5sb2NrX2JoKCZici0+bG9jayk7CisJYnJfc3RwX3NldF9lbmFibGVkKGJyLCB2YWwpOworCXNwaW5fbG9ja19iaCgmYnItPmxvY2spOworCXJ0bmxfdW5sb2NrKCk7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IHN0b3JlX3N0cF9zdGF0ZShzdHJ1Y3QgZGV2aWNlICpkLApAQCAtMzA5LDYgKzMxMywxOSBAQAogc3RhdGljIERFVklDRV9BVFRSKGdyb3VwX2FkZHIsIFNfSVJVR08gfCBTX0lXVVNSLAogCQkgICBzaG93X2dyb3VwX2FkZHIsIHN0b3JlX2dyb3VwX2FkZHIpOwogCitzdGF0aWMgc3NpemVfdCBzdG9yZV9mbHVzaChzdHJ1Y3QgZGV2aWNlICpkLAorCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisJc3RydWN0IG5ldF9icmlkZ2UgKmJyID0gdG9fYnJpZGdlKGQpOworCisJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJNOworCisJYnJfZmRiX2ZsdXNoKGJyKTsKKwlyZXR1cm4gbGVuOworfQorc3RhdGljIERFVklDRV9BVFRSKGZsdXNoLCBTX0lXVVNSLCBOVUxMLCBzdG9yZV9mbHVzaCk7CiAKIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpicmlkZ2VfYXR0cnNbXSA9IHsKIAkmZGV2X2F0dHJfZm9yd2FyZF9kZWxheS5hdHRyLApAQCAtMzI4LDYgKzM0NSw3IEBACiAJJmRldl9hdHRyX3RvcG9sb2d5X2NoYW5nZV90aW1lci5hdHRyLAogCSZkZXZfYXR0cl9nY190aW1lci5hdHRyLAogCSZkZXZfYXR0cl9ncm91cF9hZGRyLmF0dHIsCisJJmRldl9hdHRyX2ZsdXNoLmF0dHIsCiAJTlVMTAogfTsKIApkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9icl9zeXNmc19pZi5jIGIvbmV0L2JyaWRnZS9icl9zeXNmc19pZi5jCmluZGV4IDBiYzJhZWYuLjJkYTIyOTIgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvYnJfc3lzZnNfaWYuYworKysgYi9uZXQvYnJpZGdlL2JyX3N5c2ZzX2lmLmMKQEAgLTEzNyw2ICsxMzcsMTMgQEAKIH0KIHN0YXRpYyBCUlBPUlRfQVRUUihob2xkX3RpbWVyLCBTX0lSVUdPLCBzaG93X2hvbGRfdGltZXIsIE5VTEwpOwogCitzdGF0aWMgc3NpemVfdCBzdG9yZV9mbHVzaChzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLCB1bnNpZ25lZCBsb25nIHYpCit7CisJYnJfZmRiX2RlbGV0ZV9ieV9wb3J0KHAtPmJyLCBwLCAwKTsgLy8gRG9uJ3QgZGVsZXRlIGxvY2FsIGVudHJ5CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgQlJQT1JUX0FUVFIoZmx1c2gsIFNfSVdVU1IsIE5VTEwsIHN0b3JlX2ZsdXNoKTsKKwogc3RhdGljIHN0cnVjdCBicnBvcnRfYXR0cmlidXRlICpicnBvcnRfYXR0cnNbXSA9IHsKIAkmYnJwb3J0X2F0dHJfcGF0aF9jb3N0LAogCSZicnBvcnRfYXR0cl9wcmlvcml0eSwKQEAgLTE1Miw2ICsxNTksNyBAQAogCSZicnBvcnRfYXR0cl9tZXNzYWdlX2FnZV90aW1lciwKIAkmYnJwb3J0X2F0dHJfZm9yd2FyZF9kZWxheV90aW1lciwKIAkmYnJwb3J0X2F0dHJfaG9sZF90aW1lciwKKwkmYnJwb3J0X2F0dHJfZmx1c2gsCiAJTlVMTAogfTsKIApkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X2FycC5jIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X2FycC5jCmluZGV4IDljNTk5ODAuLjFhNDY5NTIgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF9hcnAuYworKysgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfYXJwLmMKQEAgLTM1LDQwICszNSwzNiBAQAogCQlyZXR1cm4gRUJUX05PTUFUQ0g7CiAKIAlpZiAoaW5mby0+Yml0bWFzayAmIChFQlRfQVJQX1NSQ19JUCB8IEVCVF9BUlBfRFNUX0lQKSkgewotCQlfX2JlMzIgX2FkZHIsICphcDsKKwkJX19iZTMyIHNhZGRyLCBkYWRkciwgKnNhcCwgKmRhcDsKIAotCQkvKiBJUHY0IGFkZHJlc3NlcyBhcmUgYWx3YXlzIDQgYnl0ZXMgKi8KLQkJaWYgKGFoLT5hcl9wbG4gIT0gc2l6ZW9mKF9fYmUzMikpCisJCWlmIChhaC0+YXJfcGxuICE9IHNpemVvZihfX2JlMzIpIHx8IGFoLT5hcl9wcm8gIT0gaHRvbnMoRVRIX1BfSVApKQogCQkJcmV0dXJuIEVCVF9OT01BVENIOwotCQlpZiAoaW5mby0+Yml0bWFzayAmIEVCVF9BUlBfU1JDX0lQKSB7Ci0JCQlhcCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHNpemVvZihzdHJ1Y3QgYXJwaGRyKSArCi0JCQkJCQlhaC0+YXJfaGxuLCBzaXplb2YoX2FkZHIpLAotCQkJCQkJJl9hZGRyKTsKLQkJCWlmIChhcCA9PSBOVUxMKQotCQkJCXJldHVybiBFQlRfTk9NQVRDSDsKLQkJCWlmIChGV0lOVihpbmZvLT5zYWRkciAhPSAoKmFwICYgaW5mby0+c21zayksCi0JCQkgICBFQlRfQVJQX1NSQ19JUCkpCi0JCQkJcmV0dXJuIEVCVF9OT01BVENIOwotCQl9Ci0KLQkJaWYgKGluZm8tPmJpdG1hc2sgJiBFQlRfQVJQX0RTVF9JUCkgewotCQkJYXAgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBzaXplb2Yoc3RydWN0IGFycGhkcikgKwotCQkJCQkJMiphaC0+YXJfaGxuK3NpemVvZihfX2JlMzIpLAotCQkJCQkJc2l6ZW9mKF9hZGRyKSwgJl9hZGRyKTsKLQkJCWlmIChhcCA9PSBOVUxMKQotCQkJCXJldHVybiBFQlRfTk9NQVRDSDsKLQkJCWlmIChGV0lOVihpbmZvLT5kYWRkciAhPSAoKmFwICYgaW5mby0+ZG1zayksCi0JCQkgICBFQlRfQVJQX0RTVF9JUCkpCi0JCQkJcmV0dXJuIEVCVF9OT01BVENIOwotCQl9CisJCXNhcCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHNpemVvZihzdHJ1Y3QgYXJwaGRyKSArCisJCQkJCWFoLT5hcl9obG4sIHNpemVvZihzYWRkciksCisJCQkJCSZzYWRkcik7CisJCWlmIChzYXAgPT0gTlVMTCkKKwkJCXJldHVybiBFQlRfTk9NQVRDSDsKKwkJZGFwID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgc2l6ZW9mKHN0cnVjdCBhcnBoZHIpICsKKwkJCQkJMiphaC0+YXJfaGxuK3NpemVvZihzYWRkciksCisJCQkJCXNpemVvZihkYWRkciksICZkYWRkcik7CisJCWlmIChkYXAgPT0gTlVMTCkKKwkJCXJldHVybiBFQlRfTk9NQVRDSDsKKwkJaWYgKGluZm8tPmJpdG1hc2sgJiBFQlRfQVJQX1NSQ19JUCAmJgorCQkgICAgRldJTlYoaW5mby0+c2FkZHIgIT0gKCpzYXAgJiBpbmZvLT5zbXNrKSwgRUJUX0FSUF9TUkNfSVApKQorCQkJcmV0dXJuIEVCVF9OT01BVENIOworCQlpZiAoaW5mby0+Yml0bWFzayAmIEVCVF9BUlBfRFNUX0lQICYmCisJCSAgICBGV0lOVihpbmZvLT5kYWRkciAhPSAoKmRhcCAmIGluZm8tPmRtc2spLCBFQlRfQVJQX0RTVF9JUCkpCisJCQlyZXR1cm4gRUJUX05PTUFUQ0g7CisJCWlmIChpbmZvLT5iaXRtYXNrICYgRUJUX0FSUF9HUkFUICYmCisJCSAgICBGV0lOVigqZGFwICE9ICpzYXAsIEVCVF9BUlBfR1JBVCkpCisJCQlyZXR1cm4gRUJUX05PTUFUQ0g7CiAJfQogCiAJaWYgKGluZm8tPmJpdG1hc2sgJiAoRUJUX0FSUF9TUkNfTUFDIHwgRUJUX0FSUF9EU1RfTUFDKSkgewogCQl1bnNpZ25lZCBjaGFyIF9tYWNbRVRIX0FMRU5dLCAqbXA7CiAJCXVpbnQ4X3QgdmVyZGljdCwgaTsKIAotCQkvKiBNQUMgYWRkcmVzc2VzIGFyZSA2IGJ5dGVzICovCi0JCWlmIChhaC0+YXJfaGxuICE9IEVUSF9BTEVOKQorCQlpZiAoYWgtPmFyX2hsbiAhPSBFVEhfQUxFTiB8fCBhaC0+YXJfaHJkICE9IGh0b25zKEFSUEhSRF9FVEhFUikpCiAJCQlyZXR1cm4gRUJUX05PTUFUQ0g7CiAJCWlmIChpbmZvLT5iaXRtYXNrICYgRUJUX0FSUF9TUkNfTUFDKSB7CiAJCQltcCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHNpemVvZihzdHJ1Y3QgYXJwaGRyKSwKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF9sb2cuYyBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF9sb2cuYwppbmRleCA0NTcxMmFlLi4wMzFiZmE0IDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfbG9nLmMKKysrIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X2xvZy5jCkBAIC0xOTYsMTQgKzE5NiwxMCBAQAogCXJldCA9IGVidF9yZWdpc3Rlcl93YXRjaGVyKCZsb2cpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwotCWlmIChuZl9sb2dfcmVnaXN0ZXIoUEZfQlJJREdFLCAmZWJ0X2xvZ19sb2dnZXIpIDwgMCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJlYnRfbG9nOiBub3QgbG9nZ2luZyB2aWEgc3lzdGVtIGNvbnNvbGUgIgotCQkgICAgICAgInNpbmNlIHNvbWVib2R5IGVsc2UgYWxyZWFkeSByZWdpc3RlcmVkIGZvciBQRl9JTkVUXG4iKTsKLQkJLyogd2UgY2Fubm90IG1ha2UgbW9kdWxlIGxvYWQgZmFpbCBoZXJlLCBzaW5jZSBvdGhlcndpc2UKLQkJICogZWJ0YWJsZXMgdXNlcnNwYWNlIHdvdWxkIGFib3J0ICovCi0JfQotCi0JcmV0dXJuIDA7CisJcmV0ID0gbmZfbG9nX3JlZ2lzdGVyKFBGX0JSSURHRSwgJmVidF9sb2dfbG9nZ2VyKTsKKwlpZiAocmV0IDwgMCAmJiByZXQgIT0gLUVFWElTVCkKKwkJZWJ0X3VucmVnaXN0ZXJfd2F0Y2hlcigmbG9nKTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgZWJ0X2xvZ19maW5pKHZvaWQpCmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfdWxvZy5jIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X3Vsb2cuYwppbmRleCA4ZTE1Y2M0Li45NDExZGI2MiAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X3Vsb2cuYworKysgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfdWxvZy5jCkBAIC0xMzAsNiArMTMwLDcgQEAKIAl1bnNpZ25lZCBpbnQgZ3JvdXAgPSB1bG9naW5mby0+bmxncm91cDsKIAllYnRfdWxvZ19idWZmX3QgKnViID0gJnVsb2dfYnVmZmVyc1tncm91cF07CiAJc3BpbmxvY2tfdCAqbG9jayA9ICZ1Yi0+bG9jazsKKwlrdGltZV90IGt0OwogCiAJaWYgKCh1bG9naW5mby0+Y3ByYW5nZSA9PSAwKSB8fAogCSAgICAodWxvZ2luZm8tPmNwcmFuZ2UgPiBza2ItPmxlbiArIEVUSF9ITEVOKSkKQEAgLTE2NCw5ICsxNjUsMTAgQEAKIAogCS8qIEZpbGwgaW4gdGhlIHVsb2cgZGF0YSAqLwogCXBtLT52ZXJzaW9uID0gRUJUX1VMT0dfVkVSU0lPTjsKLQlkb19nZXR0aW1lb2ZkYXkoJnBtLT5zdGFtcCk7CisJa3QgPSBrdGltZV9nZXRfcmVhbCgpOworCXBtLT5zdGFtcCA9IGt0aW1lX3RvX3RpbWV2YWwoa3QpOwogCWlmICh1Yi0+cWxlbiA9PSAxKQotCQlza2Jfc2V0X3RpbWVzdGFtcCh1Yi0+c2tiLCAmcG0tPnN0YW1wKTsKKwkJdWItPnNrYi0+dHN0YW1wID0ga3Q7CiAJcG0tPmRhdGFfbGVuID0gY29weV9sZW47CiAJcG0tPm1hcmsgPSBza2ItPm1hcms7CiAJcG0tPmhvb2sgPSBob29rbnI7CkBAIC0yOTUsMTQgKzI5NywxMiBAQAogCiAJLyogaW5pdGlhbGl6ZSB1bG9nX2J1ZmZlcnMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgRUJUX1VMT0dfTUFYTkxHUk9VUFM7IGkrKykgewotCQlpbml0X3RpbWVyKCZ1bG9nX2J1ZmZlcnNbaV0udGltZXIpOwotCQl1bG9nX2J1ZmZlcnNbaV0udGltZXIuZnVuY3Rpb24gPSB1bG9nX3RpbWVyOwotCQl1bG9nX2J1ZmZlcnNbaV0udGltZXIuZGF0YSA9IGk7CisJCXNldHVwX3RpbWVyKCZ1bG9nX2J1ZmZlcnNbaV0udGltZXIsIHVsb2dfdGltZXIsIGkpOwogCQlzcGluX2xvY2tfaW5pdCgmdWxvZ19idWZmZXJzW2ldLmxvY2spOwogCX0KIAogCWVidHVsb2dubCA9IG5ldGxpbmtfa2VybmVsX2NyZWF0ZShORVRMSU5LX05GTE9HLCBFQlRfVUxPR19NQVhOTEdST1VQUywKLQkJCQkJICBOVUxMLCBUSElTX01PRFVMRSk7CisJCQkJCSAgTlVMTCwgTlVMTCwgVEhJU19NT0RVTEUpOwogCWlmICghZWJ0dWxvZ25sKQogCQlyZXQgPSAtRU5PTUVNOwogCWVsc2UgaWYgKChyZXQgPSBlYnRfcmVnaXN0ZXJfd2F0Y2hlcigmdWxvZykpKQpkaWZmIC0tZ2l0IGEvbmV0L2NvbXBhdC5jIGIvbmV0L2NvbXBhdC5jCmluZGV4IDFmMzI4NjYuLjlhMGY1ZjIgMTAwNjQ0Ci0tLSBhL25ldC9jb21wYXQuYworKysgYi9uZXQvY29tcGF0LmMKQEAgLTM0LDExICszNCwxMSBAQAogewogCWludCB0b3RfbGVuID0gMDsKIAotCXdoaWxlKG5pb3YgPiAwKSB7CisJd2hpbGUgKG5pb3YgPiAwKSB7CiAJCWNvbXBhdF91cHRyX3QgYnVmOwogCQljb21wYXRfc2l6ZV90IGxlbjsKIAotCQlpZihnZXRfdXNlcihsZW4sICZ1aW92MzItPmlvdl9sZW4pIHx8CisJCWlmIChnZXRfdXNlcihsZW4sICZ1aW92MzItPmlvdl9sZW4pIHx8CiAJCSAgIGdldF91c2VyKGJ1ZiwgJnVpb3YzMi0+aW92X2Jhc2UpKSB7CiAJCQl0b3RfbGVuID0gLUVGQVVMVDsKIAkJCWJyZWFrOwpAQCAtNzgsMTIgKzc4LDEyIEBACiB7CiAJaW50IHRvdF9sZW47CiAKLQlpZihrZXJuX21zZy0+bXNnX25hbWVsZW4pIHsKLQkJaWYobW9kZT09VkVSSUZZX1JFQUQpIHsKKwlpZiAoa2Vybl9tc2ctPm1zZ19uYW1lbGVuKSB7CisJCWlmIChtb2RlPT1WRVJJRllfUkVBRCkgewogCQkJaW50IGVyciA9IG1vdmVfYWRkcl90b19rZXJuZWwoa2Vybl9tc2ctPm1zZ19uYW1lLAogCQkJCQkJICAgICAga2Vybl9tc2ctPm1zZ19uYW1lbGVuLAogCQkJCQkJICAgICAga2Vybl9hZGRyZXNzKTsKLQkJCWlmKGVyciA8IDApCisJCQlpZiAoZXJyIDwgMCkKIAkJCQlyZXR1cm4gZXJyOwogCQl9CiAJCWtlcm5fbXNnLT5tc2dfbmFtZSA9IGtlcm5fYWRkcmVzczsKQEAgLTkzLDcgKzkzLDcgQEAKIAl0b3RfbGVuID0gaW92X2Zyb21fdXNlcl9jb21wYXRfdG9fa2VybihrZXJuX2lvdiwKIAkJCQkJICAoc3RydWN0IGNvbXBhdF9pb3ZlYyBfX3VzZXIgKilrZXJuX21zZy0+bXNnX2lvdiwKIAkJCQkJICBrZXJuX21zZy0+bXNnX2lvdmxlbik7Ci0JaWYodG90X2xlbiA+PSAwKQorCWlmICh0b3RfbGVuID49IDApCiAJCWtlcm5fbXNnLT5tc2dfaW92ID0ga2Vybl9pb3Y7CiAKIAlyZXR1cm4gdG90X2xlbjsKQEAgLTE0Niw4ICsxNDYsOCBAQAogCWtjbWxlbiA9IDA7CiAJa2Ntc2dfYmFzZSA9IGtjbXNnID0gKHN0cnVjdCBjbXNnaGRyICopc3RhY2tidWY7CiAJdWNtc2cgPSBDTVNHX0NPTVBBVF9GSVJTVEhEUihrbXNnKTsKLQl3aGlsZSh1Y21zZyAhPSBOVUxMKSB7Ci0JCWlmKGdldF91c2VyKHVjbWxlbiwgJnVjbXNnLT5jbXNnX2xlbikpCisJd2hpbGUgKHVjbXNnICE9IE5VTEwpIHsKKwkJaWYgKGdldF91c2VyKHVjbWxlbiwgJnVjbXNnLT5jbXNnX2xlbikpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAogCQkvKiBDYXRjaCBib2dvbnMuICovCkBAIC0xNjAsNyArMTYwLDcgQEAKIAkJa2NtbGVuICs9IHRtcDsKIAkJdWNtc2cgPSBjbXNnX2NvbXBhdF9ueHRoZHIoa21zZywgdWNtc2csIHVjbWxlbik7CiAJfQotCWlmKGtjbWxlbiA9PSAwKQorCWlmIChrY21sZW4gPT0gMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAkvKiBUaGUga2NtbGVuIGhvbGRzIHRoZSA2NC1iaXQgdmVyc2lvbiBvZiB0aGUgY29udHJvbCBsZW5ndGguCkBAIC0xNzYsNyArMTc2LDcgQEAKIAkvKiBOb3cgY29weSB0aGVtIG92ZXIgbmVhdGx5LiAqLwogCW1lbXNldChrY21zZywgMCwga2NtbGVuKTsKIAl1Y21zZyA9IENNU0dfQ09NUEFUX0ZJUlNUSERSKGttc2cpOwotCXdoaWxlKHVjbXNnICE9IE5VTEwpIHsKKwl3aGlsZSAodWNtc2cgIT0gTlVMTCkgewogCQlpZiAoX19nZXRfdXNlcih1Y21sZW4sICZ1Y21zZy0+Y21zZ19sZW4pKQogCQkJZ290byBFZmF1bHQ7CiAJCWlmICghQ01TR19DT01QQVRfT0sodWNtbGVuLCB1Y21zZywga21zZykpCkBAIC0yMTUsMTEgKzIxNSwxMiBAQAogaW50IHB1dF9jbXNnX2NvbXBhdChzdHJ1Y3QgbXNnaGRyICprbXNnLCBpbnQgbGV2ZWwsIGludCB0eXBlLCBpbnQgbGVuLCB2b2lkICpkYXRhKQogewogCXN0cnVjdCBjb21wYXRfdGltZXZhbCBjdHY7CisJc3RydWN0IGNvbXBhdF90aW1lc3BlYyBjdHM7CiAJc3RydWN0IGNvbXBhdF9jbXNnaGRyIF9fdXNlciAqY20gPSAoc3RydWN0IGNvbXBhdF9jbXNnaGRyIF9fdXNlciAqKSBrbXNnLT5tc2dfY29udHJvbDsKIAlzdHJ1Y3QgY29tcGF0X2Ntc2doZHIgY21oZHI7CiAJaW50IGNtbGVuOwogCi0JaWYoY20gPT0gTlVMTCB8fCBrbXNnLT5tc2dfY29udHJvbGxlbiA8IHNpemVvZigqY20pKSB7CisJaWYgKGNtID09IE5VTEwgfHwga21zZy0+bXNnX2NvbnRyb2xsZW4gPCBzaXplb2YoKmNtKSkgewogCQlrbXNnLT5tc2dfZmxhZ3MgfD0gTVNHX0NUUlVOQzsKIAkJcmV0dXJuIDA7IC8qIFhYWDogcmV0dXJuIGVycm9yPyBjaGVjayBzcGVjLiAqLwogCX0KQEAgLTIyOSwxMSArMjMwLDE4IEBACiAJCWN0di50dl9zZWMgPSB0di0+dHZfc2VjOwogCQljdHYudHZfdXNlYyA9IHR2LT50dl91c2VjOwogCQlkYXRhID0gJmN0djsKLQkJbGVuID0gc2l6ZW9mKHN0cnVjdCBjb21wYXRfdGltZXZhbCk7CisJCWxlbiA9IHNpemVvZihjdHYpOworCX0KKwlpZiAobGV2ZWwgPT0gU09MX1NPQ0tFVCAmJiB0eXBlID09IFNPX1RJTUVTVEFNUE5TKSB7CisJCXN0cnVjdCB0aW1lc3BlYyAqdHMgPSAoc3RydWN0IHRpbWVzcGVjICopZGF0YTsKKwkJY3RzLnR2X3NlYyA9IHRzLT50dl9zZWM7CisJCWN0cy50dl9uc2VjID0gdHMtPnR2X25zZWM7CisJCWRhdGEgPSAmY3RzOworCQlsZW4gPSBzaXplb2YoY3RzKTsKIAl9CiAKIAljbWxlbiA9IENNU0dfQ09NUEFUX0xFTihsZW4pOwotCWlmKGttc2ctPm1zZ19jb250cm9sbGVuIDwgY21sZW4pIHsKKwlpZiAoa21zZy0+bXNnX2NvbnRyb2xsZW4gPCBjbWxlbikgewogCQlrbXNnLT5tc2dfZmxhZ3MgfD0gTVNHX0NUUlVOQzsKIAkJY21sZW4gPSBrbXNnLT5tc2dfY29udHJvbGxlbjsKIAl9CkBAIC0yNDEsOSArMjQ5LDkgQEAKIAljbWhkci5jbXNnX3R5cGUgPSB0eXBlOwogCWNtaGRyLmNtc2dfbGVuID0gY21sZW47CiAKLQlpZihjb3B5X3RvX3VzZXIoY20sICZjbWhkciwgc2l6ZW9mIGNtaGRyKSkKKwlpZiAoY29weV90b191c2VyKGNtLCAmY21oZHIsIHNpemVvZiBjbWhkcikpCiAJCXJldHVybiAtRUZBVUxUOwotCWlmKGNvcHlfdG9fdXNlcihDTVNHX0NPTVBBVF9EQVRBKGNtKSwgZGF0YSwgY21sZW4gLSBzaXplb2Yoc3RydWN0IGNvbXBhdF9jbXNnaGRyKSkpCisJaWYgKGNvcHlfdG9fdXNlcihDTVNHX0NPTVBBVF9EQVRBKGNtKSwgZGF0YSwgY21sZW4gLSBzaXplb2Yoc3RydWN0IGNvbXBhdF9jbXNnaGRyKSkpCiAJCXJldHVybiAtRUZBVUxUOwogCWNtbGVuID0gQ01TR19DT01QQVRfU1BBQ0UobGVuKTsKIAlrbXNnLT5tc2dfY29udHJvbCArPSBjbWxlbjsKQEAgLTU0NSwyMCArNTUzLDQ5IEBACiAJc3RydWN0IGNvbXBhdF90aW1ldmFsIF9fdXNlciAqY3R2ID0KIAkJCShzdHJ1Y3QgY29tcGF0X3RpbWV2YWwgX191c2VyKikgdXNlcnN0YW1wOwogCWludCBlcnIgPSAtRU5PRU5UOworCXN0cnVjdCB0aW1ldmFsIHR2OwogCiAJaWYgKCFzb2NrX2ZsYWcoc2ssIFNPQ0tfVElNRVNUQU1QKSkKIAkJc29ja19lbmFibGVfdGltZXN0YW1wKHNrKTsKLQlpZiAoc2stPnNrX3N0YW1wLnR2X3NlYyA9PSAtMSkKKwl0diA9IGt0aW1lX3RvX3RpbWV2YWwoc2stPnNrX3N0YW1wKTsKKwlpZiAodHYudHZfc2VjID09IC0xKQogCQlyZXR1cm4gZXJyOwotCWlmIChzay0+c2tfc3RhbXAudHZfc2VjID09IDApCi0JCWRvX2dldHRpbWVvZmRheSgmc2stPnNrX3N0YW1wKTsKLQlpZiAocHV0X3VzZXIoc2stPnNrX3N0YW1wLnR2X3NlYywgJmN0di0+dHZfc2VjKSB8fAotCQkJcHV0X3VzZXIoc2stPnNrX3N0YW1wLnR2X3VzZWMsICZjdHYtPnR2X3VzZWMpKQorCWlmICh0di50dl9zZWMgPT0gMCkgeworCQlzay0+c2tfc3RhbXAgPSBrdGltZV9nZXRfcmVhbCgpOworCQl0diA9IGt0aW1lX3RvX3RpbWV2YWwoc2stPnNrX3N0YW1wKTsKKwl9CisJZXJyID0gMDsKKwlpZiAocHV0X3VzZXIodHYudHZfc2VjLCAmY3R2LT50dl9zZWMpIHx8CisJCQlwdXRfdXNlcih0di50dl91c2VjLCAmY3R2LT50dl91c2VjKSkKIAkJZXJyID0gLUVGQVVMVDsKIAlyZXR1cm4gZXJyOwogfQogRVhQT1JUX1NZTUJPTChjb21wYXRfc29ja19nZXRfdGltZXN0YW1wKTsKIAoraW50IGNvbXBhdF9zb2NrX2dldF90aW1lc3RhbXBucyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCB0aW1lc3BlYyBfX3VzZXIgKnVzZXJzdGFtcCkKK3sKKwlzdHJ1Y3QgY29tcGF0X3RpbWVzcGVjIF9fdXNlciAqY3R2ID0KKwkJCShzdHJ1Y3QgY29tcGF0X3RpbWVzcGVjIF9fdXNlciopIHVzZXJzdGFtcDsKKwlpbnQgZXJyID0gLUVOT0VOVDsKKwlzdHJ1Y3QgdGltZXNwZWMgdHM7CisKKwlpZiAoIXNvY2tfZmxhZyhzaywgU09DS19USU1FU1RBTVApKQorCQlzb2NrX2VuYWJsZV90aW1lc3RhbXAoc2spOworCXRzID0ga3RpbWVfdG9fdGltZXNwZWMoc2stPnNrX3N0YW1wKTsKKwlpZiAodHMudHZfc2VjID09IC0xKQorCQlyZXR1cm4gZXJyOworCWlmICh0cy50dl9zZWMgPT0gMCkgeworCQlzay0+c2tfc3RhbXAgPSBrdGltZV9nZXRfcmVhbCgpOworCQl0cyA9IGt0aW1lX3RvX3RpbWVzcGVjKHNrLT5za19zdGFtcCk7CisJfQorCWVyciA9IDA7CisJaWYgKHB1dF91c2VyKHRzLnR2X3NlYywgJmN0di0+dHZfc2VjKSB8fAorCQkJcHV0X3VzZXIodHMudHZfbnNlYywgJmN0di0+dHZfbnNlYykpCisJCWVyciA9IC1FRkFVTFQ7CisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0woY29tcGF0X3NvY2tfZ2V0X3RpbWVzdGFtcG5zKTsKKwogYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfZ2V0c29ja29wdChpbnQgZmQsIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCiAJCQkJY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IF9fdXNlciAqb3B0bGVuKQogewpAQCAtNjE3LDcgKzY1NCw3IEBACiAJYTAgPSBhWzBdOwogCWExID0gYVsxXTsKIAotCXN3aXRjaChjYWxsKSB7CisJc3dpdGNoIChjYWxsKSB7CiAJY2FzZSBTWVNfU09DS0VUOgogCQlyZXQgPSBzeXNfc29ja2V0KGEwLCBhMSwgYVsyXSk7CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvTWFrZWZpbGUgYi9uZXQvY29yZS9NYWtlZmlsZQppbmRleCA3MzI3MmQ1Li40NzUxNjEzIDEwMDY0NAotLS0gYS9uZXQvY29yZS9NYWtlZmlsZQorKysgYi9uZXQvY29yZS9NYWtlZmlsZQpAQCAtMTMsNyArMTMsNiBAQAogb2JqLSQoQ09ORklHX1hGUk0pICs9IGZsb3cubwogb2JqLSQoQ09ORklHX1NZU0ZTKSArPSBuZXQtc3lzZnMubwogb2JqLSQoQ09ORklHX05FVF9QS1RHRU4pICs9IHBrdGdlbi5vCi1vYmotJChDT05GSUdfV0lSRUxFU1NfRVhUKSArPSB3aXJlbGVzcy5vCiBvYmotJChDT05GSUdfTkVUUE9MTCkgKz0gbmV0cG9sbC5vCiBvYmotJChDT05GSUdfTkVUX0RNQSkgKz0gdXNlcl9kbWEubwogb2JqLSQoQ09ORklHX0ZJQl9SVUxFUykgKz0gZmliX3J1bGVzLm8KZGlmZiAtLWdpdCBhL25ldC9jb3JlL2RhdGFncmFtLmMgYi9uZXQvY29yZS9kYXRhZ3JhbS5jCmluZGV4IDE4NjIxMmIuLmNiMDU2ZjQgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL2RhdGFncmFtLmMKKysrIGIvbmV0L2NvcmUvZGF0YWdyYW0uYwpAQCAtNDExLDExICs0MTEsMTEgQEAKIAlyZXR1cm4gLUVGQVVMVDsKIH0KIAotX19zdW0xNiBfX3NrYl9jaGVja3N1bV9jb21wbGV0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorX19zdW0xNiBfX3NrYl9jaGVja3N1bV9jb21wbGV0ZV9oZWFkKHN0cnVjdCBza19idWZmICpza2IsIGludCBsZW4pCiB7CiAJX19zdW0xNiBzdW07CiAKLQlzdW0gPSBjc3VtX2ZvbGQoc2tiX2NoZWNrc3VtKHNrYiwgMCwgc2tiLT5sZW4sIHNrYi0+Y3N1bSkpOworCXN1bSA9IGNzdW1fZm9sZChza2JfY2hlY2tzdW0oc2tiLCAwLCBsZW4sIHNrYi0+Y3N1bSkpOwogCWlmIChsaWtlbHkoIXN1bSkpIHsKIAkJaWYgKHVubGlrZWx5KHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0NPTVBMRVRFKSkKIAkJCW5ldGRldl9yeF9jc3VtX2ZhdWx0KHNrYi0+ZGV2KTsKQEAgLTQyMyw2ICs0MjMsMTIgQEAKIAl9CiAJcmV0dXJuIHN1bTsKIH0KK0VYUE9SVF9TWU1CT0woX19za2JfY2hlY2tzdW1fY29tcGxldGVfaGVhZCk7CisKK19fc3VtMTYgX19za2JfY2hlY2tzdW1fY29tcGxldGUoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gX19za2JfY2hlY2tzdW1fY29tcGxldGVfaGVhZChza2IsIHNrYi0+bGVuKTsKK30KIEVYUE9SVF9TWU1CT0woX19za2JfY2hlY2tzdW1fY29tcGxldGUpOwogCiAvKioKZGlmZiAtLWdpdCBhL25ldC9jb3JlL2Rldi5jIGIvbmV0L2NvcmUvZGV2LmMKaW5kZXggNGRjOTNjYy4uZWI5OTkwMCAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvZGV2LmMKKysrIGIvbmV0L2NvcmUvZGV2LmMKQEAgLTEwOSw3ICsxMDksNyBAQAogI2luY2x1ZGUgPGxpbnV4L25ldHBvbGwuaD4KICNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKyNpbmNsdWRlIDxuZXQvd2V4dC5oPgogI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+CiAjaW5jbHVkZSA8YXNtL2N1cnJlbnQuaD4KICNpbmNsdWRlIDxsaW51eC9hdWRpdC5oPgpAQCAtMTQ2LDggKzE0Niw4IEBACiAgKi8KIAogc3RhdGljIERFRklORV9TUElOTE9DSyhwdHlwZV9sb2NrKTsKLXN0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIHB0eXBlX2Jhc2VbMTZdOwkvKiAxNiB3YXkgaGFzaGVkIGxpc3QgKi8KLXN0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIHB0eXBlX2FsbDsJCS8qIFRhcHMgKi8KK3N0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIHB0eXBlX2Jhc2VbMTZdIF9fcmVhZF9tb3N0bHk7CS8qIDE2IHdheSBoYXNoZWQgbGlzdCAqLworc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgcHR5cGVfYWxsIF9fcmVhZF9tb3N0bHk7CS8qIFRhcHMgKi8KIAogI2lmZGVmIENPTkZJR19ORVRfRE1BCiBzdGF0aWMgc3RydWN0IGRtYV9jbGllbnQgKm5ldF9kbWFfY2xpZW50OwpAQCAtMjI2LDEyICsyMjYsNiBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqCUZvciBlZmZpY2llbmN5Ci0gKi8KLQotc3RhdGljIGludCBuZXRkZXZfbml0OwotCi0vKgogICoJQWRkIGEgcHJvdG9jb2wgSUQgdG8gdGhlIGxpc3QuIE5vdyB0aGF0IHRoZSBpbnB1dCBoYW5kbGVyIGlzCiAgKglzbWFydGVyIHdlIGNhbiBkaXNwZW5zZSB3aXRoIGFsbCB0aGUgbWVzc3kgc3R1ZmYgdGhhdCB1c2VkIHRvIGJlCiAgKgloZXJlLgpAQCAtMjY1LDEwICsyNTksOSBAQAogCWludCBoYXNoOwogCiAJc3Bpbl9sb2NrX2JoKCZwdHlwZV9sb2NrKTsKLQlpZiAocHQtPnR5cGUgPT0gaHRvbnMoRVRIX1BfQUxMKSkgewotCQluZXRkZXZfbml0Kys7CisJaWYgKHB0LT50eXBlID09IGh0b25zKEVUSF9QX0FMTCkpCiAJCWxpc3RfYWRkX3JjdSgmcHQtPmxpc3QsICZwdHlwZV9hbGwpOwotCX0gZWxzZSB7CisJZWxzZSB7CiAJCWhhc2ggPSBudG9ocyhwdC0+dHlwZSkgJiAxNTsKIAkJbGlzdF9hZGRfcmN1KCZwdC0+bGlzdCwgJnB0eXBlX2Jhc2VbaGFzaF0pOwogCX0KQEAgLTI5NSwxMCArMjg4LDkgQEAKIAogCXNwaW5fbG9ja19iaCgmcHR5cGVfbG9jayk7CiAKLQlpZiAocHQtPnR5cGUgPT0gaHRvbnMoRVRIX1BfQUxMKSkgewotCQluZXRkZXZfbml0LS07CisJaWYgKHB0LT50eXBlID09IGh0b25zKEVUSF9QX0FMTCkpCiAJCWhlYWQgPSAmcHR5cGVfYWxsOwotCX0gZWxzZQorCWVsc2UKIAkJaGVhZCA9ICZwdHlwZV9iYXNlW250b2hzKHB0LT50eXBlKSAmIDE1XTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkocHQxLCBoZWFkLCBsaXN0KSB7CkBAIC04MTcsNyArODA5LDYgQEAKIAlyZXR1cm4gMTsKIH0KIAotCiAvKioKICAqCWRldl9vcGVuCS0gcHJlcGFyZSBhbiBpbnRlcmZhY2UgZm9yIHVzZS4KICAqCUBkZXY6CWRldmljZSB0byBvcGVuCkBAIC0xMDMxLDIzICsxMDIyLDEyIEBACiAJYXRvbWljX2RlYygmbmV0c3RhbXBfbmVlZGVkKTsKIH0KIAotdm9pZCBfX25ldF90aW1lc3RhbXAoc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlzdHJ1Y3QgdGltZXZhbCB0djsKLQotCWRvX2dldHRpbWVvZmRheSgmdHYpOwotCXNrYl9zZXRfdGltZXN0YW1wKHNrYiwgJnR2KTsKLX0KLUVYUE9SVF9TWU1CT0woX19uZXRfdGltZXN0YW1wKTsKLQogc3RhdGljIGlubGluZSB2b2lkIG5ldF90aW1lc3RhbXAoc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlpZiAoYXRvbWljX3JlYWQoJm5ldHN0YW1wX25lZWRlZCkpCiAJCV9fbmV0X3RpbWVzdGFtcChza2IpOwotCWVsc2UgewotCQlza2ItPnRzdGFtcC5vZmZfc2VjID0gMDsKLQkJc2tiLT50c3RhbXAub2ZmX3VzZWMgPSAwOwotCX0KKwllbHNlCisJCXNrYi0+dHN0YW1wLnR2NjQgPSAwOwogfQogCiAvKgpAQCAtMTA3NywxOCArMTA1NywxOCBAQAogCQkJICAgc2V0IGJ5IHNlbmRlciwgc28gdGhhdCB0aGUgc2Vjb25kIHN0YXRlbWVudCBpcwogCQkJICAganVzdCBwcm90ZWN0aW9uIGFnYWluc3QgYnVnZ3kgcHJvdG9jb2xzLgogCQkJICovCi0JCQlza2IyLT5tYWMucmF3ID0gc2tiMi0+ZGF0YTsKKwkJCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYjIpOwogCi0JCQlpZiAoc2tiMi0+bmgucmF3IDwgc2tiMi0+ZGF0YSB8fAotCQkJICAgIHNrYjItPm5oLnJhdyA+IHNrYjItPnRhaWwpIHsKKwkJCWlmIChza2JfbmV0d29ya19oZWFkZXIoc2tiMikgPCBza2IyLT5kYXRhIHx8CisJCQkgICAgc2tiMi0+bmV0d29ya19oZWFkZXIgPiBza2IyLT50YWlsKSB7CiAJCQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKIAkJCQkJcHJpbnRrKEtFUk5fQ1JJVCAicHJvdG9jb2wgJTA0eCBpcyAiCiAJCQkJCSAgICAgICAiYnVnZ3ksIGRldiAlc1xuIiwKIAkJCQkJICAgICAgIHNrYjItPnByb3RvY29sLCBkZXYtPm5hbWUpOwotCQkJCXNrYjItPm5oLnJhdyA9IHNrYjItPmRhdGE7CisJCQkJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYjIpOwogCQkJfQogCi0JCQlza2IyLT5oLnJhdyA9IHNrYjItPm5oLnJhdzsKKwkJCXNrYjItPnRyYW5zcG9ydF9oZWFkZXIgPSBza2IyLT5uZXR3b3JrX2hlYWRlcjsKIAkJCXNrYjItPnBrdF90eXBlID0gUEFDS0VUX09VVEdPSU5HOwogCQkJcHR5cGUtPmZ1bmMoc2tiMiwgc2tiLT5kZXYsIHB0eXBlLCBza2ItPmRldik7CiAJCX0KQEAgLTExNjcsNyArMTE0Nyw3IEBACiBpbnQgc2tiX2NoZWNrc3VtX2hlbHAoc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlfX3dzdW0gY3N1bTsKLQlpbnQgcmV0ID0gMCwgb2Zmc2V0ID0gc2tiLT5oLnJhdyAtIHNrYi0+ZGF0YTsKKwlpbnQgcmV0ID0gMCwgb2Zmc2V0OwogCiAJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0NPTVBMRVRFKQogCQlnb3RvIG91dF9zZXRfc3VtbWVkOwpAQCAtMTE4MywxNSArMTE2MywxNiBAQAogCQkJZ290byBvdXQ7CiAJfQogCisJb2Zmc2V0ID0gc2tiLT5jc3VtX3N0YXJ0IC0gc2tiX2hlYWRyb29tKHNrYik7CiAJQlVHX09OKG9mZnNldCA+IChpbnQpc2tiLT5sZW4pOwogCWNzdW0gPSBza2JfY2hlY2tzdW0oc2tiLCBvZmZzZXQsIHNrYi0+bGVuLW9mZnNldCwgMCk7CiAKLQlvZmZzZXQgPSBza2ItPnRhaWwgLSBza2ItPmgucmF3OworCW9mZnNldCA9IHNrYl9oZWFkbGVuKHNrYikgLSBvZmZzZXQ7CiAJQlVHX09OKG9mZnNldCA8PSAwKTsKIAlCVUdfT04oc2tiLT5jc3VtX29mZnNldCArIDIgPiBvZmZzZXQpOwogCi0JKihfX3N1bTE2Kikoc2tiLT5oLnJhdyArIHNrYi0+Y3N1bV9vZmZzZXQpID0gY3N1bV9mb2xkKGNzdW0pOwotCisJKihfX3N1bTE2ICopKHNrYi0+aGVhZCArIHNrYi0+Y3N1bV9zdGFydCArIHNrYi0+Y3N1bV9vZmZzZXQpID0KKwkJY3N1bV9mb2xkKGNzdW0pOwogb3V0X3NldF9zdW1tZWQ6CiAJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOwogb3V0OgpAQCAtMTIxNywxMSArMTE5OCwxMSBAQAogCiAJQlVHX09OKHNrYl9zaGluZm8oc2tiKS0+ZnJhZ19saXN0KTsKIAotCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKLQlza2ItPm1hY19sZW4gPSBza2ItPm5oLnJhdyAtIHNrYi0+ZGF0YTsKKwlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOworCXNrYi0+bWFjX2xlbiA9IHNrYi0+bmV0d29ya19oZWFkZXIgLSBza2ItPm1hY19oZWFkZXI7CiAJX19za2JfcHVsbChza2IsIHNrYi0+bWFjX2xlbik7CiAKLQlpZiAodW5saWtlbHkoc2tiLT5pcF9zdW1tZWQgIT0gQ0hFQ0tTVU1fUEFSVElBTCkpIHsKKwlpZiAoV0FSTl9PTihza2ItPmlwX3N1bW1lZCAhPSBDSEVDS1NVTV9QQVJUSUFMKSkgewogCQlpZiAoc2tiX2hlYWRlcl9jbG9uZWQoc2tiKSAmJgogCQkgICAgKGVyciA9IHBza2JfZXhwYW5kX2hlYWQoc2tiLCAwLCAwLCBHRlBfQVRPTUlDKSkpCiAJCQlyZXR1cm4gRVJSX1BUUihlcnIpOwpAQCAtMTIzNSw3ICsxMjE2LDggQEAKIAkJCQlzZWdzID0gRVJSX1BUUihlcnIpOwogCQkJCWlmIChlcnIgfHwgc2tiX2dzb19vayhza2IsIGZlYXR1cmVzKSkKIAkJCQkJYnJlYWs7Ci0JCQkJX19za2JfcHVzaChza2IsIHNrYi0+ZGF0YSAtIHNrYi0+bmgucmF3KTsKKwkJCQlfX3NrYl9wdXNoKHNrYiwgKHNrYi0+ZGF0YSAtCisJCQkJCQkgc2tiX25ldHdvcmtfaGVhZGVyKHNrYikpKTsKIAkJCX0KIAkJCXNlZ3MgPSBwdHlwZS0+Z3NvX3NlZ21lbnQoc2tiLCBmZWF0dXJlcyk7CiAJCQlicmVhazsKQEAgLTEyNDMsNyArMTIyNSw3IEBACiAJfQogCXJjdV9yZWFkX3VubG9jaygpOwogCi0JX19za2JfcHVzaChza2IsIHNrYi0+ZGF0YSAtIHNrYi0+bWFjLnJhdyk7CisJX19za2JfcHVzaChza2IsIHNrYi0+ZGF0YSAtIHNrYl9tYWNfaGVhZGVyKHNrYikpOwogCiAJcmV0dXJuIHNlZ3M7CiB9CkBAIC0xMzQwLDcgKzEzMjIsNyBAQAogaW50IGRldl9oYXJkX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlpZiAobGlrZWx5KCFza2ItPm5leHQpKSB7Ci0JCWlmIChuZXRkZXZfbml0KQorCQlpZiAoIWxpc3RfZW1wdHkoJnB0eXBlX2FsbCkpCiAJCQlkZXZfcXVldWVfeG1pdF9uaXQoc2tiLCBkZXYpOwogCiAJCWlmIChuZXRpZl9uZWVkc19nc28oZGV2LCBza2IpKSB7CkBAIC0xNDQyLDEyICsxNDI0LDE2IEBACiAJLyogSWYgcGFja2V0IGlzIG5vdCBjaGVja3N1bW1lZCBhbmQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQKIAkgKiBjaGVja3N1bW1pbmcgZm9yIHRoaXMgcHJvdG9jb2wsIGNvbXBsZXRlIGNoZWNrc3VtbWluZyBoZXJlLgogCSAqLwotCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9QQVJUSUFMICYmCi0JICAgICghKGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0dFTl9DU1VNKSAmJgotCSAgICAgKCEoZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfSVBfQ1NVTSkgfHwKLQkgICAgICBza2ItPnByb3RvY29sICE9IGh0b25zKEVUSF9QX0lQKSkpKQotCQlpZiAoc2tiX2NoZWNrc3VtX2hlbHAoc2tiKSkKLQkJCWdvdG8gb3V0X2tmcmVlX3NrYjsKKwlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCkgeworCQlza2Jfc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiLCBza2ItPmNzdW1fc3RhcnQgLQorCQkJCQkgICAgICBza2JfaGVhZHJvb20oc2tiKSk7CisKKwkJaWYgKCEoZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfR0VOX0NTVU0pICYmCisJCSAgICAoIShkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9JUF9DU1VNKSB8fAorCQkgICAgIHNrYi0+cHJvdG9jb2wgIT0gaHRvbnMoRVRIX1BfSVApKSkKKwkJCWlmIChza2JfY2hlY2tzdW1faGVscChza2IpKQorCQkJCWdvdG8gb3V0X2tmcmVlX3NrYjsKKwl9CiAKIGdzbzoKIAlzcGluX2xvY2tfcHJlZmV0Y2goJmRldi0+cXVldWVfbG9jayk7CkBAIC0xNTQzLDkgKzE1MjksOSBAQAogCQkJUmVjZWl2ZXIgcm91dGluZXMKICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogCi1pbnQgbmV0ZGV2X21heF9iYWNrbG9nID0gMTAwMDsKLWludCBuZXRkZXZfYnVkZ2V0ID0gMzAwOwotaW50IHdlaWdodF9wID0gNjQ7ICAgICAgICAgICAgLyogb2xkIGJhY2tsb2cgd2VpZ2h0ICovCitpbnQgbmV0ZGV2X21heF9iYWNrbG9nIF9fcmVhZF9tb3N0bHkgPSAxMDAwOworaW50IG5ldGRldl9idWRnZXQgX19yZWFkX21vc3RseSA9IDMwMDsKK2ludCB3ZWlnaHRfcCBfX3JlYWRfbW9zdGx5ID0gNjQ7ICAgICAgICAgICAgLyogb2xkIGJhY2tsb2cgd2VpZ2h0ICovCiAKIERFRklORV9QRVJfQ1BVKHN0cnVjdCBuZXRpZl9yeF9zdGF0cywgbmV0ZGV2X3J4X3N0YXQpID0geyAwLCB9OwogCkBAIC0xNTc3LDcgKzE1NjMsNyBAQAogCWlmIChuZXRwb2xsX3J4KHNrYikpCiAJCXJldHVybiBORVRfUlhfRFJPUDsKIAotCWlmICghc2tiLT50c3RhbXAub2ZmX3NlYykKKwlpZiAoIXNrYi0+dHN0YW1wLnR2NjQpCiAJCW5ldF90aW1lc3RhbXAoc2tiKTsKIAogCS8qCkBAIC0xNjg0LDQwICsxNjcwLDQ2IEBACiAJfQogfQogCi1zdGF0aWMgX19pbmxpbmVfXyBpbnQgZGVsaXZlcl9za2Ioc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkgIHN0cnVjdCBwYWNrZXRfdHlwZSAqcHRfcHJldiwKLQkJCQkgIHN0cnVjdCBuZXRfZGV2aWNlICpvcmlnX2RldikKK3N0YXRpYyBpbmxpbmUgaW50IGRlbGl2ZXJfc2tiKHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgICBzdHJ1Y3QgcGFja2V0X3R5cGUgKnB0X3ByZXYsCisJCQkgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqb3JpZ19kZXYpCiB7CiAJYXRvbWljX2luYygmc2tiLT51c2Vycyk7CiAJcmV0dXJuIHB0X3ByZXYtPmZ1bmMoc2tiLCBza2ItPmRldiwgcHRfcHJldiwgb3JpZ19kZXYpOwogfQogCiAjaWYgZGVmaW5lZChDT05GSUdfQlJJREdFKSB8fCBkZWZpbmVkIChDT05GSUdfQlJJREdFX01PRFVMRSkKLWludCAoKmJyX2hhbmRsZV9mcmFtZV9ob29rKShzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLCBzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IpOworLyogVGhlc2UgaG9va3MgZGVmaW5lZCBoZXJlIGZvciBBVE0gKi8KIHN0cnVjdCBuZXRfYnJpZGdlOwogc3RydWN0IG5ldF9icmlkZ2VfZmRiX2VudHJ5ICooKmJyX2ZkYl9nZXRfaG9vaykoc3RydWN0IG5ldF9icmlkZ2UgKmJyLAogCQkJCQkJdW5zaWduZWQgY2hhciAqYWRkcik7Ci12b2lkICgqYnJfZmRiX3B1dF9ob29rKShzdHJ1Y3QgbmV0X2JyaWRnZV9mZGJfZW50cnkgKmVudCk7Cit2b2lkICgqYnJfZmRiX3B1dF9ob29rKShzdHJ1Y3QgbmV0X2JyaWRnZV9mZGJfZW50cnkgKmVudCkgX19yZWFkX21vc3RseTsKIAotc3RhdGljIF9faW5saW5lX18gaW50IGhhbmRsZV9icmlkZ2Uoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAotCQkJCSAgICBzdHJ1Y3QgcGFja2V0X3R5cGUgKipwdF9wcmV2LCBpbnQgKnJldCwKLQkJCQkgICAgc3RydWN0IG5ldF9kZXZpY2UgKm9yaWdfZGV2KQorLyoKKyAqIElmIGJyaWRnZSBtb2R1bGUgaXMgbG9hZGVkIGNhbGwgYnJpZGdpbmcgaG9vay4KKyAqICByZXR1cm5zIE5VTEwgaWYgcGFja2V0IHdhcyBjb25zdW1lZC4KKyAqLworc3RydWN0IHNrX2J1ZmYgKigqYnJfaGFuZGxlX2ZyYW1lX2hvb2spKHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAsCisJCQkJCXN0cnVjdCBza19idWZmICpza2IpIF9fcmVhZF9tb3N0bHk7CitzdGF0aWMgaW5saW5lIHN0cnVjdCBza19idWZmICpoYW5kbGVfYnJpZGdlKHN0cnVjdCBza19idWZmICpza2IsCisJCQkJCSAgICBzdHJ1Y3QgcGFja2V0X3R5cGUgKipwdF9wcmV2LCBpbnQgKnJldCwKKwkJCQkJICAgIHN0cnVjdCBuZXRfZGV2aWNlICpvcmlnX2RldikKIHsKIAlzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwb3J0OwogCi0JaWYgKCgqcHNrYiktPnBrdF90eXBlID09IFBBQ0tFVF9MT09QQkFDSyB8fAotCSAgICAocG9ydCA9IHJjdV9kZXJlZmVyZW5jZSgoKnBza2IpLT5kZXYtPmJyX3BvcnQpKSA9PSBOVUxMKQotCQlyZXR1cm4gMDsKKwlpZiAoc2tiLT5wa3RfdHlwZSA9PSBQQUNLRVRfTE9PUEJBQ0sgfHwKKwkgICAgKHBvcnQgPSByY3VfZGVyZWZlcmVuY2Uoc2tiLT5kZXYtPmJyX3BvcnQpKSA9PSBOVUxMKQorCQlyZXR1cm4gc2tiOwogCiAJaWYgKCpwdF9wcmV2KSB7Ci0JCSpyZXQgPSBkZWxpdmVyX3NrYigqcHNrYiwgKnB0X3ByZXYsIG9yaWdfZGV2KTsKKwkJKnJldCA9IGRlbGl2ZXJfc2tiKHNrYiwgKnB0X3ByZXYsIG9yaWdfZGV2KTsKIAkJKnB0X3ByZXYgPSBOVUxMOwogCX0KIAotCXJldHVybiBicl9oYW5kbGVfZnJhbWVfaG9vayhwb3J0LCBwc2tiKTsKKwlyZXR1cm4gYnJfaGFuZGxlX2ZyYW1lX2hvb2socG9ydCwgc2tiKTsKIH0KICNlbHNlCi0jZGVmaW5lIGhhbmRsZV9icmlkZ2Uoc2tiLCBwdF9wcmV2LCByZXQsIG9yaWdfZGV2KQkoMCkKKyNkZWZpbmUgaGFuZGxlX2JyaWRnZShza2IsIHB0X3ByZXYsIHJldCwgb3JpZ19kZXYpCShza2IpCiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19ORVRfQ0xTX0FDVApAQCAtMTc0NywxMCArMTczOSwxMCBAQAogCiAJCXNrYi0+dGNfdmVyZCA9IFNFVF9UQ19BVChza2ItPnRjX3ZlcmQsQVRfSU5HUkVTUyk7CiAKLQkJc3Bpbl9sb2NrKCZkZXYtPnF1ZXVlX2xvY2spOworCQlzcGluX2xvY2soJmRldi0+aW5ncmVzc19sb2NrKTsKIAkJaWYgKChxID0gZGV2LT5xZGlzY19pbmdyZXNzKSAhPSBOVUxMKQogCQkJcmVzdWx0ID0gcS0+ZW5xdWV1ZShza2IsIHEpOwotCQlzcGluX3VubG9jaygmZGV2LT5xdWV1ZV9sb2NrKTsKKwkJc3Bpbl91bmxvY2soJmRldi0+aW5ncmVzc19sb2NrKTsKIAogCX0KIApAQCAtMTc2OSw3ICsxNzYxLDcgQEAKIAlpZiAoc2tiLT5kZXYtPnBvbGwgJiYgbmV0cG9sbF9yeChza2IpKQogCQlyZXR1cm4gTkVUX1JYX0RST1A7CiAKLQlpZiAoIXNrYi0+dHN0YW1wLm9mZl9zZWMpCisJaWYgKCFza2ItPnRzdGFtcC50djY0KQogCQluZXRfdGltZXN0YW1wKHNrYik7CiAKIAlpZiAoIXNrYi0+aWlmKQpAQCAtMTc4Miw4ICsxNzc0LDkgQEAKIAogCV9fZ2V0X2NwdV92YXIobmV0ZGV2X3J4X3N0YXQpLnRvdGFsKys7CiAKLQlza2ItPmgucmF3ID0gc2tiLT5uaC5yYXcgPSBza2ItPmRhdGE7Ci0Jc2tiLT5tYWNfbGVuID0gc2tiLT5uaC5yYXcgLSBza2ItPm1hYy5yYXc7CisJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CisJc2tiX3Jlc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKKwlza2ItPm1hY19sZW4gPSBza2ItPm5ldHdvcmtfaGVhZGVyIC0gc2tiLT5tYWNfaGVhZGVyOwogCiAJcHRfcHJldiA9IE5VTEw7CiAKQEAgLTE4MjMsNyArMTgxNiw4IEBACiBuY2xzOgogI2VuZGlmCiAKLQlpZiAoaGFuZGxlX2JyaWRnZSgmc2tiLCAmcHRfcHJldiwgJnJldCwgb3JpZ19kZXYpKQorCXNrYiA9IGhhbmRsZV9icmlkZ2Uoc2tiLCAmcHRfcHJldiwgJnJldCwgb3JpZ19kZXYpOworCWlmICghc2tiKQogCQlnb3RvIG91dDsKIAogCXR5cGUgPSBza2ItPnByb3RvY29sOwpAQCAtMjA3Niw3ICsyMDcwLDcgQEAKICAqCVRoaXMgaXMgaW52b2tlZCBieSB0aGUgL3Byb2MgZmlsZXN5c3RlbSBoYW5kbGVyIHRvIGRpc3BsYXkgYSBkZXZpY2UKICAqCWluIGRldGFpbC4KICAqLwotc3RhdGljIF9faW5saW5lX18gc3RydWN0IG5ldF9kZXZpY2UgKmRldl9nZXRfaWR4KGxvZmZfdCBwb3MpCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmRldl9nZXRfaWR4KGxvZmZfdCBwb3MpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIAlsb2ZmX3QgaTsKQEAgLTIxMDUsMjggKzIwOTksMjUgQEAKIAogc3RhdGljIHZvaWQgZGV2X3NlcV9wcmludGZfc3RhdHMoc3RydWN0IHNlcV9maWxlICpzZXEsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0JaWYgKGRldi0+Z2V0X3N0YXRzKSB7Ci0JCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9IGRldi0+Z2V0X3N0YXRzKGRldik7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gZGV2LT5nZXRfc3RhdHMoZGV2KTsKIAotCQlzZXFfcHJpbnRmKHNlcSwgIiU2czolOGx1ICU3bHUgJTRsdSAlNGx1ICU0bHUgJTVsdSAlMTBsdSAlOWx1ICIKLQkJCQkiJThsdSAlN2x1ICU0bHUgJTRsdSAlNGx1ICU1bHUgJTdsdSAlMTBsdVxuIiwKLQkJCSAgIGRldi0+bmFtZSwgc3RhdHMtPnJ4X2J5dGVzLCBzdGF0cy0+cnhfcGFja2V0cywKLQkJCSAgIHN0YXRzLT5yeF9lcnJvcnMsCi0JCQkgICBzdGF0cy0+cnhfZHJvcHBlZCArIHN0YXRzLT5yeF9taXNzZWRfZXJyb3JzLAotCQkJICAgc3RhdHMtPnJ4X2ZpZm9fZXJyb3JzLAotCQkJICAgc3RhdHMtPnJ4X2xlbmd0aF9lcnJvcnMgKyBzdGF0cy0+cnhfb3Zlcl9lcnJvcnMgKwotCQkJICAgICBzdGF0cy0+cnhfY3JjX2Vycm9ycyArIHN0YXRzLT5yeF9mcmFtZV9lcnJvcnMsCi0JCQkgICBzdGF0cy0+cnhfY29tcHJlc3NlZCwgc3RhdHMtPm11bHRpY2FzdCwKLQkJCSAgIHN0YXRzLT50eF9ieXRlcywgc3RhdHMtPnR4X3BhY2tldHMsCi0JCQkgICBzdGF0cy0+dHhfZXJyb3JzLCBzdGF0cy0+dHhfZHJvcHBlZCwKLQkJCSAgIHN0YXRzLT50eF9maWZvX2Vycm9ycywgc3RhdHMtPmNvbGxpc2lvbnMsCi0JCQkgICBzdGF0cy0+dHhfY2Fycmllcl9lcnJvcnMgKwotCQkJICAgICBzdGF0cy0+dHhfYWJvcnRlZF9lcnJvcnMgKwotCQkJICAgICBzdGF0cy0+dHhfd2luZG93X2Vycm9ycyArCi0JCQkgICAgIHN0YXRzLT50eF9oZWFydGJlYXRfZXJyb3JzLAotCQkJICAgc3RhdHMtPnR4X2NvbXByZXNzZWQpOwotCX0gZWxzZQotCQlzZXFfcHJpbnRmKHNlcSwgIiU2czogTm8gc3RhdGlzdGljcyBhdmFpbGFibGUuXG4iLCBkZXYtPm5hbWUpOworCXNlcV9wcmludGYoc2VxLCAiJTZzOiU4bHUgJTdsdSAlNGx1ICU0bHUgJTRsdSAlNWx1ICUxMGx1ICU5bHUgIgorCQkgICAiJThsdSAlN2x1ICU0bHUgJTRsdSAlNGx1ICU1bHUgJTdsdSAlMTBsdVxuIiwKKwkJICAgZGV2LT5uYW1lLCBzdGF0cy0+cnhfYnl0ZXMsIHN0YXRzLT5yeF9wYWNrZXRzLAorCQkgICBzdGF0cy0+cnhfZXJyb3JzLAorCQkgICBzdGF0cy0+cnhfZHJvcHBlZCArIHN0YXRzLT5yeF9taXNzZWRfZXJyb3JzLAorCQkgICBzdGF0cy0+cnhfZmlmb19lcnJvcnMsCisJCSAgIHN0YXRzLT5yeF9sZW5ndGhfZXJyb3JzICsgc3RhdHMtPnJ4X292ZXJfZXJyb3JzICsKKwkJICAgIHN0YXRzLT5yeF9jcmNfZXJyb3JzICsgc3RhdHMtPnJ4X2ZyYW1lX2Vycm9ycywKKwkJICAgc3RhdHMtPnJ4X2NvbXByZXNzZWQsIHN0YXRzLT5tdWx0aWNhc3QsCisJCSAgIHN0YXRzLT50eF9ieXRlcywgc3RhdHMtPnR4X3BhY2tldHMsCisJCSAgIHN0YXRzLT50eF9lcnJvcnMsIHN0YXRzLT50eF9kcm9wcGVkLAorCQkgICBzdGF0cy0+dHhfZmlmb19lcnJvcnMsIHN0YXRzLT5jb2xsaXNpb25zLAorCQkgICBzdGF0cy0+dHhfY2Fycmllcl9lcnJvcnMgKworCQkgICAgc3RhdHMtPnR4X2Fib3J0ZWRfZXJyb3JzICsKKwkJICAgIHN0YXRzLT50eF93aW5kb3dfZXJyb3JzICsKKwkJICAgIHN0YXRzLT50eF9oZWFydGJlYXRfZXJyb3JzLAorCQkgICBzdGF0cy0+dHhfY29tcHJlc3NlZCk7CiB9CiAKIC8qCkBAIC0yMTg1LDcgKzIxNzYsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIGRldl9zZXFfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBkZXZfc2VxX29wcyA9IHsKIAkuc3RhcnQgPSBkZXZfc2VxX3N0YXJ0LAogCS5uZXh0ICA9IGRldl9zZXFfbmV4dCwKIAkuc3RvcCAgPSBkZXZfc2VxX3N0b3AsCkBAIC0yMjA1LDcgKzIxOTYsNyBAQAogCS5yZWxlYXNlID0gc2VxX3JlbGVhc2UsCiB9OwogCi1zdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIHNvZnRuZXRfc2VxX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgc29mdG5ldF9zZXFfb3BzID0gewogCS5zdGFydCA9IHNvZnRuZXRfc2VxX3N0YXJ0LAogCS5uZXh0ICA9IHNvZnRuZXRfc2VxX25leHQsCiAJLnN0b3AgID0gc29mdG5ldF9zZXFfc3RvcCwKQEAgLTIyMjUsMTIgKzIyMTYsMTM1IEBACiAJLnJlbGVhc2UgPSBzZXFfcmVsZWFzZSwKIH07CiAKLSNpZmRlZiBDT05GSUdfV0lSRUxFU1NfRVhUCi1leHRlcm4gaW50IHdpcmVsZXNzX3Byb2NfaW5pdCh2b2lkKTsKLSNlbHNlCi0jZGVmaW5lIHdpcmVsZXNzX3Byb2NfaW5pdCgpIDAKK3N0YXRpYyB2b2lkICpwdHlwZV9nZXRfaWR4KGxvZmZfdCBwb3MpCit7CisJc3RydWN0IHBhY2tldF90eXBlICpwdCA9IE5VTEw7CisJbG9mZl90IGkgPSAwOworCWludCB0OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UocHQsICZwdHlwZV9hbGwsIGxpc3QpIHsKKwkJaWYgKGkgPT0gcG9zKQorCQkJcmV0dXJuIHB0OworCQkrK2k7CisJfQorCisJZm9yICh0ID0gMDsgdCA8IDE2OyB0KyspIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UocHQsICZwdHlwZV9iYXNlW3RdLCBsaXN0KSB7CisJCQlpZiAoaSA9PSBwb3MpCisJCQkJcmV0dXJuIHB0OworCQkJKytpOworCQl9CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCAqcHR5cGVfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgKnBvcykKK3sKKwlyY3VfcmVhZF9sb2NrKCk7CisJcmV0dXJuICpwb3MgPyBwdHlwZV9nZXRfaWR4KCpwb3MgLSAxKSA6IFNFUV9TVEFSVF9UT0tFTjsKK30KKworc3RhdGljIHZvaWQgKnB0eXBlX3NlcV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3QgcGFja2V0X3R5cGUgKnB0OworCXN0cnVjdCBsaXN0X2hlYWQgKm54dDsKKwlpbnQgaGFzaDsKKworCSsrKnBvczsKKwlpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pCisJCXJldHVybiBwdHlwZV9nZXRfaWR4KDApOworCisJcHQgPSB2OworCW54dCA9IHB0LT5saXN0Lm5leHQ7CisJaWYgKHB0LT50eXBlID09IGh0b25zKEVUSF9QX0FMTCkpIHsKKwkJaWYgKG54dCAhPSAmcHR5cGVfYWxsKQorCQkJZ290byBmb3VuZDsKKwkJaGFzaCA9IDA7CisJCW54dCA9IHB0eXBlX2Jhc2VbMF0ubmV4dDsKKwl9IGVsc2UKKwkJaGFzaCA9IG50b2hzKHB0LT50eXBlKSAmIDE1OworCisJd2hpbGUgKG54dCA9PSAmcHR5cGVfYmFzZVtoYXNoXSkgeworCQlpZiAoKytoYXNoID49IDE2KQorCQkJcmV0dXJuIE5VTEw7CisJCW54dCA9IHB0eXBlX2Jhc2VbaGFzaF0ubmV4dDsKKwl9Citmb3VuZDoKKwlyZXR1cm4gbGlzdF9lbnRyeShueHQsIHN0cnVjdCBwYWNrZXRfdHlwZSwgbGlzdCk7Cit9CisKK3N0YXRpYyB2b2lkIHB0eXBlX3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCXJjdV9yZWFkX3VubG9jaygpOworfQorCitzdGF0aWMgdm9pZCBwdHlwZV9zZXFfZGVjb2RlKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpzeW0pCit7CisjaWZkZWYgQ09ORklHX0tBTExTWU1TCisJdW5zaWduZWQgbG9uZyBvZmZzZXQgPSAwLCBzeW1zaXplOworCWNvbnN0IGNoYXIgKnN5bW5hbWU7CisJY2hhciAqbW9kbmFtZTsKKwljaGFyIG5hbWVidWZbMTI4XTsKKworCXN5bW5hbWUgPSBrYWxsc3ltc19sb29rdXAoKHVuc2lnbmVkIGxvbmcpc3ltLCAmc3ltc2l6ZSwgJm9mZnNldCwKKwkJCQkgICZtb2RuYW1lLCBuYW1lYnVmKTsKKworCWlmIChzeW1uYW1lKSB7CisJCWNoYXIgKmRlbGltID0gIjoiOworCisJCWlmICghbW9kbmFtZSkKKwkJCW1vZG5hbWUgPSBkZWxpbSA9ICIiOworCQlzZXFfcHJpbnRmKHNlcSwgIiVzJXMlcyVzKzB4JWx4IiwgZGVsaW0sIG1vZG5hbWUsIGRlbGltLAorCQkJICAgc3ltbmFtZSwgb2Zmc2V0KTsKKwkJcmV0dXJuOworCX0KICNlbmRpZgogCisJc2VxX3ByaW50ZihzZXEsICJbJXBdIiwgc3ltKTsKK30KKworc3RhdGljIGludCBwdHlwZV9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlzdHJ1Y3QgcGFja2V0X3R5cGUgKnB0ID0gdjsKKworCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikKKwkJc2VxX3B1dHMoc2VxLCAiVHlwZSBEZXZpY2UgICAgICBGdW5jdGlvblxuIik7CisJZWxzZSB7CisJCWlmIChwdC0+dHlwZSA9PSBodG9ucyhFVEhfUF9BTEwpKQorCQkJc2VxX3B1dHMoc2VxLCAiQUxMICIpOworCQllbHNlCisJCQlzZXFfcHJpbnRmKHNlcSwgIiUwNHgiLCBudG9ocyhwdC0+dHlwZSkpOworCisJCXNlcV9wcmludGYoc2VxLCAiICUtOHMgIiwKKwkJCSAgIHB0LT5kZXYgPyBwdC0+ZGV2LT5uYW1lIDogIiIpOworCQlwdHlwZV9zZXFfZGVjb2RlKHNlcSwgIHB0LT5mdW5jKTsKKwkJc2VxX3B1dGMoc2VxLCAnXG4nKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBwdHlwZV9zZXFfb3BzID0geworCS5zdGFydCA9IHB0eXBlX3NlcV9zdGFydCwKKwkubmV4dCAgPSBwdHlwZV9zZXFfbmV4dCwKKwkuc3RvcCAgPSBwdHlwZV9zZXFfc3RvcCwKKwkuc2hvdyAgPSBwdHlwZV9zZXFfc2hvdywKK307CisKK3N0YXRpYyBpbnQgcHR5cGVfc2VxX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNlcV9vcGVuKGZpbGUsICZwdHlwZV9zZXFfb3BzKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHR5cGVfc2VxX2ZvcHMgPSB7CisJLm93bmVyCSA9IFRISVNfTU9EVUxFLAorCS5vcGVuICAgID0gcHR5cGVfc2VxX29wZW4sCisJLnJlYWQgICAgPSBzZXFfcmVhZCwKKwkubGxzZWVrICA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNlcV9yZWxlYXNlLAorfTsKKworCiBzdGF0aWMgaW50IF9faW5pdCBkZXZfcHJvY19pbml0KHZvaWQpCiB7CiAJaW50IHJjID0gLUVOT01FTTsKQEAgLTIyMzksMTMgKzIzNTMsMTggQEAKIAkJZ290byBvdXQ7CiAJaWYgKCFwcm9jX25ldF9mb3BzX2NyZWF0ZSgic29mdG5ldF9zdGF0IiwgU19JUlVHTywgJnNvZnRuZXRfc2VxX2ZvcHMpKQogCQlnb3RvIG91dF9kZXY7Ci0JaWYgKHdpcmVsZXNzX3Byb2NfaW5pdCgpKQorCWlmICghcHJvY19uZXRfZm9wc19jcmVhdGUoInB0eXBlIiwgU19JUlVHTywgJnB0eXBlX3NlcV9mb3BzKSkKKwkJZ290byBvdXRfZGV2MjsKKworCWlmICh3ZXh0X3Byb2NfaW5pdCgpKQogCQlnb3RvIG91dF9zb2Z0bmV0OwogCXJjID0gMDsKIG91dDoKIAlyZXR1cm4gcmM7CiBvdXRfc29mdG5ldDoKIAlwcm9jX25ldF9yZW1vdmUoInNvZnRuZXRfc3RhdCIpOworb3V0X2RldjI6CisJcHJvY19uZXRfcmVtb3ZlKCJwdHlwZSIpOwogb3V0X2RldjoKIAlwcm9jX25ldF9yZW1vdmUoImRldiIpOwogCWdvdG8gb3V0OwpAQCAtMjc5NSwyOSArMjkxNCw5IEBACiAJCQkJCXJldCA9IC1FRkFVTFQ7CiAJCQkJcmV0dXJuIHJldDsKIAkJCX0KLSNpZmRlZiBDT05GSUdfV0lSRUxFU1NfRVhUCiAJCQkvKiBUYWtlIGNhcmUgb2YgV2lyZWxlc3MgRXh0ZW5zaW9ucyAqLwotCQkJaWYgKGNtZCA+PSBTSU9DSVdGSVJTVCAmJiBjbWQgPD0gU0lPQ0lXTEFTVCkgewotCQkJCS8qIElmIGNvbW1hbmQgaXMgYHNldCBhIHBhcmFtZXRlcicsIG9yCi0JCQkJICogYGdldCB0aGUgZW5jb2RpbmcgcGFyYW1ldGVycycsIGNoZWNrIGlmCi0JCQkJICogdGhlIHVzZXIgaGFzIHRoZSByaWdodCB0byBkbyBpdCAqLwotCQkJCWlmIChJV19JU19TRVQoY21kKSB8fCBjbWQgPT0gU0lPQ0dJV0VOQ09ERQotCQkJCSAgICB8fCBjbWQgPT0gU0lPQ0dJV0VOQ09ERUVYVCkgewotCQkJCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCi0JCQkJCQlyZXR1cm4gLUVQRVJNOwotCQkJCX0KLQkJCQlkZXZfbG9hZChpZnIuaWZyX25hbWUpOwotCQkJCXJ0bmxfbG9jaygpOwotCQkJCS8qIEZvbGxvdyBtZSBpbiBuZXQvY29yZS93aXJlbGVzcy5jICovCi0JCQkJcmV0ID0gd2lyZWxlc3NfcHJvY2Vzc19pb2N0bCgmaWZyLCBjbWQpOwotCQkJCXJ0bmxfdW5sb2NrKCk7Ci0JCQkJaWYgKElXX0lTX0dFVChjbWQpICYmCi0JCQkJICAgIGNvcHlfdG9fdXNlcihhcmcsICZpZnIsCi0JCQkJCQkgc2l6ZW9mKHN0cnVjdCBpZnJlcSkpKQotCQkJCQlyZXQgPSAtRUZBVUxUOwotCQkJCXJldHVybiByZXQ7Ci0JCQl9Ci0jZW5kaWYJLyogQ09ORklHX1dJUkVMRVNTX0VYVCAqLworCQkJaWYgKGNtZCA+PSBTSU9DSVdGSVJTVCAmJiBjbWQgPD0gU0lPQ0lXTEFTVCkKKwkJCQlyZXR1cm4gd2V4dF9oYW5kbGVfaW9jdGwoJmlmciwgY21kLCBhcmcpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJfQogfQpAQCAtMjg0Nyw3ICsyOTQ2LDcgQEAKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0sobmV0X3RvZG9fbGlzdF9sb2NrKTsKIHN0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIG5ldF90b2RvX2xpc3QgPSBMSVNUX0hFQURfSU5JVChuZXRfdG9kb19saXN0KTsKIAotc3RhdGljIGlubGluZSB2b2lkIG5ldF9zZXRfdG9kbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIHZvaWQgbmV0X3NldF90b2RvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3Bpbl9sb2NrKCZuZXRfdG9kb19saXN0X2xvY2spOwogCWxpc3RfYWRkX3RhaWwoJmRldi0+dG9kb19saXN0LCAmbmV0X3RvZG9fbGlzdCk7CkBAIC0yODg4LDkgKzI5ODcsNyBAQAogCXNwaW5fbG9ja19pbml0KCZkZXYtPnF1ZXVlX2xvY2spOwogCXNwaW5fbG9ja19pbml0KCZkZXYtPl94bWl0X2xvY2spOwogCWRldi0+eG1pdF9sb2NrX293bmVyID0gLTE7Ci0jaWZkZWYgQ09ORklHX05FVF9DTFNfQUNUCiAJc3Bpbl9sb2NrX2luaXQoJmRldi0+aW5ncmVzc19sb2NrKTsKLSNlbmRpZgogCiAJZGV2LT5pZmxpbmsgPSAtMTsKIApAQCAtMzAwMiw3ICszMDk5LDcgQEAKICAqCWNoYWluLiAwIGlzIHJldHVybmVkIG9uIHN1Y2Nlc3MuIEEgbmVnYXRpdmUgZXJybm8gY29kZSBpcyByZXR1cm5lZAogICoJb24gYSBmYWlsdXJlIHRvIHNldCB1cCB0aGUgZGV2aWNlLCBvciBpZiB0aGUgbmFtZSBpcyBhIGR1cGxpY2F0ZS4KICAqCi0gKglUaGlzIGlzIGEgd3JhcHBlciBhcm91bmQgcmVnaXN0ZXJfbmV0ZGV2IHRoYXQgdGFrZXMgdGhlIHJ0bmwgc2VtYXBob3JlCisgKglUaGlzIGlzIGEgd3JhcHBlciBhcm91bmQgcmVnaXN0ZXJfbmV0ZGV2aWNlIHRoYXQgdGFrZXMgdGhlIHJ0bmwgc2VtYXBob3JlCiAgKglhbmQgZXhwYW5kcyB0aGUgZGV2aWNlIG5hbWUgaWYgeW91IHBhc3NlZCBhIGZvcm1hdCBzdHJpbmcgdG8KICAqCWFsbG9jX25ldGRldi4KICAqLwpAQCAtMzE1Nyw2ICszMjU0LDExIEBACiAJbXV0ZXhfdW5sb2NrKCZuZXRfdG9kb19ydW5fbXV0ZXgpOwogfQogCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmludGVybmFsX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuICZkZXYtPnN0YXRzOworfQorCiAvKioKICAqCWFsbG9jX25ldGRldiAtIGFsbG9jYXRlIG5ldHdvcmsgZGV2aWNlCiAgKglAc2l6ZW9mX3ByaXY6CXNpemUgb2YgcHJpdmF0ZSBkYXRhIHRvIGFsbG9jYXRlIHNwYWNlIGZvcgpAQCAtMzE5Miw2ICszMjk0LDcgQEAKIAlpZiAoc2l6ZW9mX3ByaXYpCiAJCWRldi0+cHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAKKwlkZXYtPmdldF9zdGF0cyA9IGludGVybmFsX3N0YXRzOwogCXNldHVwKGRldik7CiAJc3RyY3B5KGRldi0+bmFtZSwgbmFtZSk7CiAJcmV0dXJuIGRldjsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL2Rldl9tY2FzdC5jIGIvbmV0L2NvcmUvZGV2X21jYXN0LmMKaW5kZXggNTZiMzEwYy4uN2Q1N2JmNyAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvZGV2X21jYXN0LmMKKysrIGIvbmV0L2NvcmUvZGV2X21jYXN0LmMKQEAgLTI2NCw3ICsyNjQsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIGRldl9tY19zZXFfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBkZXZfbWNfc2VxX29wcyA9IHsKIAkuc3RhcnQgPSBkZXZfbWNfc2VxX3N0YXJ0LAogCS5uZXh0ICA9IGRldl9tY19zZXFfbmV4dCwKIAkuc3RvcCAgPSBkZXZfbWNfc2VxX3N0b3AsCmRpZmYgLS1naXQgYS9uZXQvY29yZS9ldGh0b29sLmMgYi9uZXQvY29yZS9ldGh0b29sLmMKaW5kZXggNjE2OGVkZC4uOGQ1ZTVhMCAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvZXRodG9vbC5jCisrKyBiL25ldC9jb3JlL2V0aHRvb2wuYwpAQCAtODM2LDcgKzgzNiw3IEBACiAJCQlyZXR1cm4gLUVQRVJNOwogCX0KIAotCWlmKGRldi0+ZXRodG9vbF9vcHMtPmJlZ2luKQorCWlmIChkZXYtPmV0aHRvb2xfb3BzLT5iZWdpbikKIAkJaWYgKChyYyA9IGRldi0+ZXRodG9vbF9vcHMtPmJlZ2luKGRldikpIDwgMCkKIAkJCXJldHVybiByYzsKIApAQCAtOTUyLDcgKzk1Miw3IEBACiAJCXJjID0gIC1FT1BOT1RTVVBQOwogCX0KIAotCWlmKGRldi0+ZXRodG9vbF9vcHMtPmNvbXBsZXRlKQorCWlmIChkZXYtPmV0aHRvb2xfb3BzLT5jb21wbGV0ZSkKIAkJZGV2LT5ldGh0b29sX29wcy0+Y29tcGxldGUoZGV2KTsKIAogCWlmIChvbGRfZmVhdHVyZXMgIT0gZGV2LT5mZWF0dXJlcykKZGlmZiAtLWdpdCBhL25ldC9jb3JlL2ZpYl9ydWxlcy5jIGIvbmV0L2NvcmUvZmliX3J1bGVzLmMKaW5kZXggNzE3NGNlZC4uOGM1NDc0ZSAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvZmliX3J1bGVzLmMKKysrIGIvbmV0L2NvcmUvZmliX3J1bGVzLmMKQEAgLTQ0LDYgKzQ0LDEyIEBACiAJCW1vZHVsZV9wdXQob3BzLT5vd25lcik7CiB9CiAKK3N0YXRpYyB2b2lkIGZsdXNoX3JvdXRlX2NhY2hlKHN0cnVjdCBmaWJfcnVsZXNfb3BzICpvcHMpCit7CisJaWYgKG9wcy0+Zmx1c2hfY2FjaGUpCisJCW9wcy0+Zmx1c2hfY2FjaGUoKTsKK30KKwogaW50IGZpYl9ydWxlc19yZWdpc3RlcihzdHJ1Y3QgZmliX3J1bGVzX29wcyAqb3BzKQogewogCWludCBlcnIgPSAtRUVYSVNUOwpAQCAtMTMyLDEwICsxMzgsMjUgQEAKIAlyY3VfcmVhZF9sb2NrKCk7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShydWxlLCBvcHMtPnJ1bGVzX2xpc3QsIGxpc3QpIHsKK2p1bXBlZDoKIAkJaWYgKCFmaWJfcnVsZV9tYXRjaChydWxlLCBvcHMsIGZsLCBmbGFncykpCiAJCQljb250aW51ZTsKIAotCQllcnIgPSBvcHMtPmFjdGlvbihydWxlLCBmbCwgZmxhZ3MsIGFyZyk7CisJCWlmIChydWxlLT5hY3Rpb24gPT0gRlJfQUNUX0dPVE8pIHsKKwkJCXN0cnVjdCBmaWJfcnVsZSAqdGFyZ2V0OworCisJCQl0YXJnZXQgPSByY3VfZGVyZWZlcmVuY2UocnVsZS0+Y3RhcmdldCk7CisJCQlpZiAodGFyZ2V0ID09IE5VTEwpIHsKKwkJCQljb250aW51ZTsKKwkJCX0gZWxzZSB7CisJCQkJcnVsZSA9IHRhcmdldDsKKwkJCQlnb3RvIGp1bXBlZDsKKwkJCX0KKwkJfSBlbHNlIGlmIChydWxlLT5hY3Rpb24gPT0gRlJfQUNUX05PUCkKKwkJCWNvbnRpbnVlOworCQllbHNlCisJCQllcnIgPSBvcHMtPmFjdGlvbihydWxlLCBmbCwgZmxhZ3MsIGFyZyk7CisKIAkJaWYgKGVyciAhPSAtRUFHQUlOKSB7CiAJCQlmaWJfcnVsZV9nZXQocnVsZSk7CiAJCQlhcmctPnJ1bGUgPSBydWxlOwpAQCAtMTc0LDEzICsxOTUsMTMgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1pbnQgZmliX25sX25ld3J1bGUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5sbXNnaGRyKiBubGgsIHZvaWQgKmFyZykKK3N0YXRpYyBpbnQgZmliX25sX25ld3J1bGUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5sbXNnaGRyKiBubGgsIHZvaWQgKmFyZykKIHsKIAlzdHJ1Y3QgZmliX3J1bGVfaGRyICpmcmggPSBubG1zZ19kYXRhKG5saCk7CiAJc3RydWN0IGZpYl9ydWxlc19vcHMgKm9wcyA9IE5VTEw7CiAJc3RydWN0IGZpYl9ydWxlICpydWxlLCAqciwgKmxhc3QgPSBOVUxMOwogCXN0cnVjdCBubGF0dHIgKnRiW0ZSQV9NQVgrMV07Ci0JaW50IGVyciA9IC1FSU5WQUw7CisJaW50IGVyciA9IC1FSU5WQUwsIHVucmVzb2x2ZWQgPSAwOwogCiAJaWYgKG5saC0+bmxtc2dfbGVuIDwgbmxtc2dfbXNnX3NpemUoc2l6ZW9mKCpmcmgpKSkKIAkJZ290byBlcnJvdXQ7CkBAIC0yMzcsNiArMjU4LDI4IEBACiAJaWYgKCFydWxlLT5wcmVmICYmIG9wcy0+ZGVmYXVsdF9wcmVmKQogCQlydWxlLT5wcmVmID0gb3BzLT5kZWZhdWx0X3ByZWYoKTsKIAorCWVyciA9IC1FSU5WQUw7CisJaWYgKHRiW0ZSQV9HT1RPXSkgeworCQlpZiAocnVsZS0+YWN0aW9uICE9IEZSX0FDVF9HT1RPKQorCQkJZ290byBlcnJvdXRfZnJlZTsKKworCQlydWxlLT50YXJnZXQgPSBubGFfZ2V0X3UzMih0YltGUkFfR09UT10pOworCQkvKiBCYWNrd2FyZCBqdW1wcyBhcmUgcHJvaGliaXRlZCB0byBhdm9pZCBlbmRsZXNzIGxvb3BzICovCisJCWlmIChydWxlLT50YXJnZXQgPD0gcnVsZS0+cHJlZikKKwkJCWdvdG8gZXJyb3V0X2ZyZWU7CisKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShyLCBvcHMtPnJ1bGVzX2xpc3QsIGxpc3QpIHsKKwkJCWlmIChyLT5wcmVmID09IHJ1bGUtPnRhcmdldCkgeworCQkJCXJ1bGUtPmN0YXJnZXQgPSByOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJaWYgKHJ1bGUtPmN0YXJnZXQgPT0gTlVMTCkKKwkJCXVucmVzb2x2ZWQgPSAxOworCX0gZWxzZSBpZiAocnVsZS0+YWN0aW9uID09IEZSX0FDVF9HT1RPKQorCQlnb3RvIGVycm91dF9mcmVlOworCiAJZXJyID0gb3BzLT5jb25maWd1cmUocnVsZSwgc2tiLCBubGgsIGZyaCwgdGIpOwogCWlmIChlcnIgPCAwKQogCQlnb3RvIGVycm91dF9mcmVlOwpAQCAtMjQ5LDEyICsyOTIsMzUgQEAKIAogCWZpYl9ydWxlX2dldChydWxlKTsKIAorCWlmIChvcHMtPnVucmVzb2x2ZWRfcnVsZXMpIHsKKwkJLyoKKwkJICogVGhlcmUgYXJlIHVucmVzb2x2ZWQgZ290byBydWxlcyBpbiB0aGUgbGlzdCwgY2hlY2sgaWYKKwkJICogYW55IG9mIHRoZW0gYXJlIHBvaW50aW5nIHRvIHRoaXMgbmV3IHJ1bGUuCisJCSAqLworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHIsIG9wcy0+cnVsZXNfbGlzdCwgbGlzdCkgeworCQkJaWYgKHItPmFjdGlvbiA9PSBGUl9BQ1RfR09UTyAmJgorCQkJICAgIHItPnRhcmdldCA9PSBydWxlLT5wcmVmKSB7CisJCQkJQlVHX09OKHItPmN0YXJnZXQgIT0gTlVMTCk7CisJCQkJcmN1X2Fzc2lnbl9wb2ludGVyKHItPmN0YXJnZXQsIHJ1bGUpOworCQkJCWlmICgtLW9wcy0+dW5yZXNvbHZlZF9ydWxlcyA9PSAwKQorCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCWlmIChydWxlLT5hY3Rpb24gPT0gRlJfQUNUX0dPVE8pCisJCW9wcy0+bnJfZ290b19ydWxlcysrOworCisJaWYgKHVucmVzb2x2ZWQpCisJCW9wcy0+dW5yZXNvbHZlZF9ydWxlcysrOworCiAJaWYgKGxhc3QpCiAJCWxpc3RfYWRkX3JjdSgmcnVsZS0+bGlzdCwgJmxhc3QtPmxpc3QpOwogCWVsc2UKIAkJbGlzdF9hZGRfcmN1KCZydWxlLT5saXN0LCBvcHMtPnJ1bGVzX2xpc3QpOwogCiAJbm90aWZ5X3J1bGVfY2hhbmdlKFJUTV9ORVdSVUxFLCBydWxlLCBvcHMsIG5saCwgTkVUTElOS19DQihza2IpLnBpZCk7CisJZmx1c2hfcm91dGVfY2FjaGUob3BzKTsKIAlydWxlc19vcHNfcHV0KG9wcyk7CiAJcmV0dXJuIDA7CiAKQEAgLTI2NSwxMSArMzMxLDExIEBACiAJcmV0dXJuIGVycjsKIH0KIAotaW50IGZpYl9ubF9kZWxydWxlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBubG1zZ2hkciogbmxoLCB2b2lkICphcmcpCitzdGF0aWMgaW50IGZpYl9ubF9kZWxydWxlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBubG1zZ2hkciogbmxoLCB2b2lkICphcmcpCiB7CiAJc3RydWN0IGZpYl9ydWxlX2hkciAqZnJoID0gbmxtc2dfZGF0YShubGgpOwogCXN0cnVjdCBmaWJfcnVsZXNfb3BzICpvcHMgPSBOVUxMOwotCXN0cnVjdCBmaWJfcnVsZSAqcnVsZTsKKwlzdHJ1Y3QgZmliX3J1bGUgKnJ1bGUsICp0bXA7CiAJc3RydWN0IG5sYXR0ciAqdGJbRlJBX01BWCsxXTsKIAlpbnQgZXJyID0gLUVJTlZBTDsKIApAQCAtMzIyLDEwICszODgsMzAgQEAKIAkJfQogCiAJCWxpc3RfZGVsX3JjdSgmcnVsZS0+bGlzdCk7CisKKwkJaWYgKHJ1bGUtPmFjdGlvbiA9PSBGUl9BQ1RfR09UTykKKwkJCW9wcy0+bnJfZ290b19ydWxlcy0tOworCisJCS8qCisJCSAqIENoZWNrIGlmIHRoaXMgcnVsZSBpcyBhIHRhcmdldCB0byBhbnkgb2YgdGhlbS4gSWYgc28sCisJCSAqIGRpc2FibGUgdGhlbS4gQXMgdGhpcyBvcGVyYXRpb24gaXMgZXZlbnR1YWxseSB2ZXJ5CisJCSAqIGV4cGVuc2l2ZSwgaXQgaXMgb25seSBwZXJmb3JtZWQgaWYgZ290byBydWxlcyBoYXZlCisJCSAqIGFjdHVhbGx5IGJlZW4gYWRkZWQuCisJCSAqLworCQlpZiAob3BzLT5ucl9nb3RvX3J1bGVzID4gMCkgeworCQkJbGlzdF9mb3JfZWFjaF9lbnRyeSh0bXAsIG9wcy0+cnVsZXNfbGlzdCwgbGlzdCkgeworCQkJCWlmICh0bXAtPmN0YXJnZXQgPT0gcnVsZSkgeworCQkJCQlyY3VfYXNzaWduX3BvaW50ZXIodG1wLT5jdGFyZ2V0LCBOVUxMKTsKKwkJCQkJb3BzLT51bnJlc29sdmVkX3J1bGVzKys7CisJCQkJfQorCQkJfQorCQl9CisKIAkJc3luY2hyb25pemVfcmN1KCk7CiAJCW5vdGlmeV9ydWxlX2NoYW5nZShSVE1fREVMUlVMRSwgcnVsZSwgb3BzLCBubGgsCiAJCQkJICAgTkVUTElOS19DQihza2IpLnBpZCk7CiAJCWZpYl9ydWxlX3B1dChydWxlKTsKKwkJZmx1c2hfcm91dGVfY2FjaGUob3BzKTsKIAkJcnVsZXNfb3BzX3B1dChvcHMpOwogCQlyZXR1cm4gMDsKIAl9CkBAIC0zNzEsOSArNDU3LDE2IEBACiAJZnJoLT5hY3Rpb24gPSBydWxlLT5hY3Rpb247CiAJZnJoLT5mbGFncyA9IHJ1bGUtPmZsYWdzOwogCi0JaWYgKHJ1bGUtPmlmbmFtZVswXSkKKwlpZiAocnVsZS0+YWN0aW9uID09IEZSX0FDVF9HT1RPICYmIHJ1bGUtPmN0YXJnZXQgPT0gTlVMTCkKKwkJZnJoLT5mbGFncyB8PSBGSUJfUlVMRV9VTlJFU09MVkVEOworCisJaWYgKHJ1bGUtPmlmbmFtZVswXSkgewogCQlOTEFfUFVUX1NUUklORyhza2IsIEZSQV9JRk5BTUUsIHJ1bGUtPmlmbmFtZSk7CiAKKwkJaWYgKHJ1bGUtPmlmaW5kZXggPT0gLTEpCisJCQlmcmgtPmZsYWdzIHw9IEZJQl9SVUxFX0RFVl9ERVRBQ0hFRDsKKwl9CisKIAlpZiAocnVsZS0+cHJlZikKIAkJTkxBX1BVVF9VMzIoc2tiLCBGUkFfUFJJT1JJVFksIHJ1bGUtPnByZWYpOwogCkBAIC0zODMsNiArNDc2LDkgQEAKIAlpZiAocnVsZS0+bWFya19tYXNrIHx8IHJ1bGUtPm1hcmspCiAJCU5MQV9QVVRfVTMyKHNrYiwgRlJBX0ZXTUFTSywgcnVsZS0+bWFya19tYXNrKTsKIAorCWlmIChydWxlLT50YXJnZXQpCisJCU5MQV9QVVRfVTMyKHNrYiwgRlJBX0dPVE8sIHJ1bGUtPnRhcmdldCk7CisKIAlpZiAob3BzLT5maWxsKHJ1bGUsIHNrYiwgbmxoLCBmcmgpIDwgMCkKIAkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAKQEAgLTM5MywxOSArNDg5LDE0IEBACiAJcmV0dXJuIC1FTVNHU0laRTsKIH0KIAotaW50IGZpYl9ydWxlc19kdW1wKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYiwgaW50IGZhbWlseSkKK3N0YXRpYyBpbnQgZHVtcF9ydWxlcyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IsCisJCSAgICAgIHN0cnVjdCBmaWJfcnVsZXNfb3BzICpvcHMpCiB7CiAJaW50IGlkeCA9IDA7CiAJc3RydWN0IGZpYl9ydWxlICpydWxlOwotCXN0cnVjdCBmaWJfcnVsZXNfb3BzICpvcHM7CiAKLQlvcHMgPSBsb29rdXBfcnVsZXNfb3BzKGZhbWlseSk7Ci0JaWYgKG9wcyA9PSBOVUxMKQotCQlyZXR1cm4gLUVBRk5PU1VQUE9SVDsKLQotCXJjdV9yZWFkX2xvY2soKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShydWxlLCBvcHMtPnJ1bGVzX2xpc3QsIGxpc3QpIHsKLQkJaWYgKGlkeCA8IGNiLT5hcmdzWzBdKQorCWxpc3RfZm9yX2VhY2hfZW50cnkocnVsZSwgb3BzLT5ydWxlc19saXN0LCBsaXN0KSB7CisJCWlmIChpZHggPCBjYi0+YXJnc1sxXSkKIAkJCWdvdG8gc2tpcDsKIAogCQlpZiAoZmliX25sX2ZpbGxfcnVsZShza2IsIHJ1bGUsIE5FVExJTktfQ0IoY2ItPnNrYikucGlkLApAQCAtNDE1LDE0ICs1MDYsNDQgQEAKIHNraXA6CiAJCWlkeCsrOwogCX0KLQlyY3VfcmVhZF91bmxvY2soKTsKLQljYi0+YXJnc1swXSA9IGlkeDsKKwljYi0+YXJnc1sxXSA9IGlkeDsKIAlydWxlc19vcHNfcHV0KG9wcyk7CiAKIAlyZXR1cm4gc2tiLT5sZW47CiB9CiAKLUVYUE9SVF9TWU1CT0xfR1BMKGZpYl9ydWxlc19kdW1wKTsKK3N0YXRpYyBpbnQgZmliX25sX2R1bXBydWxlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYikKK3sKKwlzdHJ1Y3QgZmliX3J1bGVzX29wcyAqb3BzOworCWludCBpZHggPSAwLCBmYW1pbHk7CisKKwlmYW1pbHkgPSBydG5sX21zZ19mYW1pbHkoY2ItPm5saCk7CisJaWYgKGZhbWlseSAhPSBBRl9VTlNQRUMpIHsKKwkJLyogUHJvdG9jb2wgc3BlY2lmaWMgZHVtcCByZXF1ZXN0ICovCisJCW9wcyA9IGxvb2t1cF9ydWxlc19vcHMoZmFtaWx5KTsKKwkJaWYgKG9wcyA9PSBOVUxMKQorCQkJcmV0dXJuIC1FQUZOT1NVUFBPUlQ7CisKKwkJcmV0dXJuIGR1bXBfcnVsZXMoc2tiLCBjYiwgb3BzKTsKKwl9CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3Uob3BzLCAmcnVsZXNfb3BzLCBsaXN0KSB7CisJCWlmIChpZHggPCBjYi0+YXJnc1swXSB8fCAhdHJ5X21vZHVsZV9nZXQob3BzLT5vd25lcikpCisJCQlnb3RvIHNraXA7CisKKwkJaWYgKGR1bXBfcnVsZXMoc2tiLCBjYiwgb3BzKSA8IDApCisJCQlicmVhazsKKworCQljYi0+YXJnc1sxXSA9IDA7CisJc2tpcDoKKwkJaWR4Kys7CisJfQorCXJjdV9yZWFkX3VubG9jaygpOworCWNiLT5hcmdzWzBdID0gaWR4OworCisJcmV0dXJuIHNrYi0+bGVuOworfQogCiBzdGF0aWMgdm9pZCBub3RpZnlfcnVsZV9jaGFuZ2UoaW50IGV2ZW50LCBzdHJ1Y3QgZmliX3J1bGUgKnJ1bGUsCiAJCQkgICAgICAgc3RydWN0IGZpYl9ydWxlc19vcHMgKm9wcywgc3RydWN0IG5sbXNnaGRyICpubGgsCkBAIC01MDEsNiArNjIyLDEwIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGZpYl9ydWxlc19pbml0KHZvaWQpCiB7CisJcnRubF9yZWdpc3RlcihQRl9VTlNQRUMsIFJUTV9ORVdSVUxFLCBmaWJfbmxfbmV3cnVsZSwgTlVMTCk7CisJcnRubF9yZWdpc3RlcihQRl9VTlNQRUMsIFJUTV9ERUxSVUxFLCBmaWJfbmxfZGVscnVsZSwgTlVMTCk7CisJcnRubF9yZWdpc3RlcihQRl9VTlNQRUMsIFJUTV9HRVRSVUxFLCBOVUxMLCBmaWJfbmxfZHVtcHJ1bGUpOworCiAJcmV0dXJuIHJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmZmliX3J1bGVzX25vdGlmaWVyKTsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvZmlsdGVyLmMgYi9uZXQvY29yZS9maWx0ZXIuYwppbmRleCA4ZDE4NWEwLi5iZDkwM2FhIDEwMDY0NAotLS0gYS9uZXQvY29yZS9maWx0ZXIuYworKysgYi9uZXQvY29yZS9maWx0ZXIuYwpAQCAtNDIsMTEgKzQyLDExIEBACiAJdTggKnB0ciA9IE5VTEw7CiAKIAlpZiAoayA+PSBTS0ZfTkVUX09GRikKLQkJcHRyID0gc2tiLT5uaC5yYXcgKyBrIC0gU0tGX05FVF9PRkY7CisJCXB0ciA9IHNrYl9uZXR3b3JrX2hlYWRlcihza2IpICsgayAtIFNLRl9ORVRfT0ZGOwogCWVsc2UgaWYgKGsgPj0gU0tGX0xMX09GRikKLQkJcHRyID0gc2tiLT5tYWMucmF3ICsgayAtIFNLRl9MTF9PRkY7CisJCXB0ciA9IHNrYl9tYWNfaGVhZGVyKHNrYikgKyBrIC0gU0tGX0xMX09GRjsKIAotCWlmIChwdHIgPj0gc2tiLT5oZWFkICYmIHB0ciA8IHNrYi0+dGFpbCkKKwlpZiAocHRyID49IHNrYi0+aGVhZCAmJiBwdHIgPCBza2JfdGFpbF9wb2ludGVyKHNrYikpCiAJCXJldHVybiBwdHI7CiAJcmV0dXJuIE5VTEw7CiB9CmRpZmYgLS1naXQgYS9uZXQvY29yZS9nZW5fc3RhdHMuYyBiL25ldC9jb3JlL2dlbl9zdGF0cy5jCmluZGV4IDI1OTQ3M2QuLmJjYzI1NTkgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL2dlbl9zdGF0cy5jCisrKyBiL25ldC9jb3JlL2dlbl9zdGF0cy5jCkBAIC02MSw3ICs2MSw3IEBACiAJc3Bpbl9sb2NrX2JoKGxvY2spOwogCWQtPmxvY2sgPSBsb2NrOwogCWlmICh0eXBlKQotCQlkLT50YWlsID0gKHN0cnVjdCBydGF0dHIgKikgc2tiLT50YWlsOworCQlkLT50YWlsID0gKHN0cnVjdCBydGF0dHIgKilza2JfdGFpbF9wb2ludGVyKHNrYik7CiAJZC0+c2tiID0gc2tiOwogCWQtPmNvbXBhdF90Y19zdGF0cyA9IHRjX3N0YXRzX3R5cGU7CiAJZC0+Y29tcGF0X3hzdGF0cyA9IHhzdGF0c190eXBlOwpAQCAtMjEyLDcgKzIxMiw3IEBACiBnbmV0X3N0YXRzX2ZpbmlzaF9jb3B5KHN0cnVjdCBnbmV0X2R1bXAgKmQpCiB7CiAJaWYgKGQtPnRhaWwpCi0JCWQtPnRhaWwtPnJ0YV9sZW4gPSBkLT5za2ItPnRhaWwgLSAodTggKikgZC0+dGFpbDsKKwkJZC0+dGFpbC0+cnRhX2xlbiA9IHNrYl90YWlsX3BvaW50ZXIoZC0+c2tiKSAtICh1OCAqKWQtPnRhaWw7CiAKIAlpZiAoZC0+Y29tcGF0X3RjX3N0YXRzKQogCQlpZiAoZ25ldF9zdGF0c19jb3B5KGQsIGQtPmNvbXBhdF90Y19zdGF0cywgJmQtPnRjX3N0YXRzLApkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvbGlua193YXRjaC5jIGIvbmV0L2NvcmUvbGlua193YXRjaC5jCmluZGV4IDhiNDVjOWQuLmUzYzI2YTkgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL2xpbmtfd2F0Y2guYworKysgYi9uZXQvY29yZS9saW5rX3dhdGNoLmMKQEAgLTc5LDcgKzc5LDcgQEAKIAljYXNlIElGX0xJTktfTU9ERV9ERUZBVUxUOgogCWRlZmF1bHQ6CiAJCWJyZWFrOwotCX07CisJfQogCiAJZGV2LT5vcGVyc3RhdGUgPSBvcGVyc3RhdGU7CiAKZGlmZiAtLWdpdCBhL25ldC9jb3JlL25laWdoYm91ci5jIGIvbmV0L2NvcmUvbmVpZ2hib3VyLmMKaW5kZXggODQxZTNmMy4uNmYzYmI3MyAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvbmVpZ2hib3VyLmMKKysrIGIvbmV0L2NvcmUvbmVpZ2hib3VyLmMKQEAgLTExMjUsNyArMTEyNSw3IEBACiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHNrYi0+ZGV2OwogCi0JX19za2JfcHVsbChza2IsIHNrYi0+bmgucmF3IC0gc2tiLT5kYXRhKTsKKwlfX3NrYl9wdWxsKHNrYiwgc2tiX25ldHdvcmtfb2Zmc2V0KHNrYikpOwogCiAJaWYgKGRldi0+aGFyZF9oZWFkZXIgJiYKIAkgICAgZGV2LT5oYXJkX2hlYWRlcihza2IsIGRldiwgbnRvaHMoc2tiLT5wcm90b2NvbCksIE5VTEwsIE5VTEwsCkBAIC0xMTQ3LDcgKzExNDcsNyBAQAogCWlmICghZHN0IHx8ICEobmVpZ2ggPSBkc3QtPm5laWdoYm91cikpCiAJCWdvdG8gZGlzY2FyZDsKIAotCV9fc2tiX3B1bGwoc2tiLCBza2ItPm5oLnJhdyAtIHNrYi0+ZGF0YSk7CisJX19za2JfcHVsbChza2IsIHNrYl9uZXR3b3JrX29mZnNldChza2IpKTsKIAogCWlmICghbmVpZ2hfZXZlbnRfc2VuZChuZWlnaCwgc2tiKSkgewogCQlpbnQgZXJyOwpAQCAtMTE5MCw3ICsxMTkwLDcgQEAKIAlzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaCA9IGRzdC0+bmVpZ2hib3VyOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBuZWlnaC0+ZGV2OwogCi0JX19za2JfcHVsbChza2IsIHNrYi0+bmgucmF3IC0gc2tiLT5kYXRhKTsKKwlfX3NrYl9wdWxsKHNrYiwgc2tiX25ldHdvcmtfb2Zmc2V0KHNrYikpOwogCiAJcmVhZF9sb2NrX2JoKCZuZWlnaC0+bG9jayk7CiAJZXJyID0gZGV2LT5oYXJkX2hlYWRlcihza2IsIGRldiwgbnRvaHMoc2tiLT5wcm90b2NvbCksCkBAIC0xNDQxLDcgKzE0NDEsNyBAQAogCXJldHVybiAwOwogfQogCi1pbnQgbmVpZ2hfZGVsZXRlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBubG1zZ2hkciAqbmxoLCB2b2lkICphcmcpCitzdGF0aWMgaW50IG5laWdoX2RlbGV0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgdm9pZCAqYXJnKQogewogCXN0cnVjdCBuZG1zZyAqbmRtOwogCXN0cnVjdCBubGF0dHIgKmRzdF9hdHRyOwpAQCAtMTUwNiw3ICsxNTA2LDcgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1pbnQgbmVpZ2hfYWRkKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBubG1zZ2hkciAqbmxoLCB2b2lkICphcmcpCitzdGF0aWMgaW50IG5laWdoX2FkZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgdm9pZCAqYXJnKQogewogCXN0cnVjdCBuZG1zZyAqbmRtOwogCXN0cnVjdCBubGF0dHIgKnRiW05EQV9NQVgrMV07CkBAIC0xNzg2LDcgKzE3ODYsNyBAQAogCVtORFRQQV9MT0NLVElNRV0JCT0geyAudHlwZSA9IE5MQV9VNjQgfSwKIH07CiAKLWludCBuZWlnaHRibF9zZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5sbXNnaGRyICpubGgsIHZvaWQgKmFyZykKK3N0YXRpYyBpbnQgbmVpZ2h0Ymxfc2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBubG1zZ2hkciAqbmxoLCB2b2lkICphcmcpCiB7CiAJc3RydWN0IG5laWdoX3RhYmxlICp0Ymw7CiAJc3RydWN0IG5kdG1zZyAqbmR0bXNnOwpAQCAtMTkxMCw3ICsxOTEwLDcgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1pbnQgbmVpZ2h0YmxfZHVtcF9pbmZvKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYikKK3N0YXRpYyBpbnQgbmVpZ2h0YmxfZHVtcF9pbmZvKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYikKIHsKIAlpbnQgZmFtaWx5LCB0aWR4LCBuaWR4ID0gMDsKIAlpbnQgdGJsX3NraXAgPSBjYi0+YXJnc1swXTsKQEAgLTIwMzQsNyArMjAzNCw3IEBACiAJcmV0dXJuIHJjOwogfQogCi1pbnQgbmVpZ2hfZHVtcF9pbmZvKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYikKK3N0YXRpYyBpbnQgbmVpZ2hfZHVtcF9pbmZvKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYikKIHsKIAlzdHJ1Y3QgbmVpZ2hfdGFibGUgKnRibDsKIAlpbnQgdCwgZmFtaWx5LCBzX3Q7CkBAIC0yMzkzLDcgKzIzOTMsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIG5laWdoX3N0YXRfc2VxX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgbmVpZ2hfc3RhdF9zZXFfb3BzID0gewogCS5zdGFydAk9IG5laWdoX3N0YXRfc2VxX3N0YXJ0LAogCS5uZXh0CT0gbmVpZ2hfc3RhdF9zZXFfbmV4dCwKIAkuc3RvcAk9IG5laWdoX3N0YXRfc2VxX3N0b3AsCkBAIC0yNzQ2LDE0ICsyNzQ2LDI2IEBACiAKICNlbmRpZgkvKiBDT05GSUdfU1lTQ1RMICovCiAKK3N0YXRpYyBpbnQgX19pbml0IG5laWdoX2luaXQodm9pZCkKK3sKKwlydG5sX3JlZ2lzdGVyKFBGX1VOU1BFQywgUlRNX05FV05FSUdILCBuZWlnaF9hZGQsIE5VTEwpOworCXJ0bmxfcmVnaXN0ZXIoUEZfVU5TUEVDLCBSVE1fREVMTkVJR0gsIG5laWdoX2RlbGV0ZSwgTlVMTCk7CisJcnRubF9yZWdpc3RlcihQRl9VTlNQRUMsIFJUTV9HRVRORUlHSCwgTlVMTCwgbmVpZ2hfZHVtcF9pbmZvKTsKKworCXJ0bmxfcmVnaXN0ZXIoUEZfVU5TUEVDLCBSVE1fR0VUTkVJR0hUQkwsIE5VTEwsIG5laWdodGJsX2R1bXBfaW5mbyk7CisJcnRubF9yZWdpc3RlcihQRl9VTlNQRUMsIFJUTV9TRVRORUlHSFRCTCwgbmVpZ2h0Ymxfc2V0LCBOVUxMKTsKKworCXJldHVybiAwOworfQorCitzdWJzeXNfaW5pdGNhbGwobmVpZ2hfaW5pdCk7CisKIEVYUE9SVF9TWU1CT0woX19uZWlnaF9ldmVudF9zZW5kKTsKIEVYUE9SVF9TWU1CT0wobmVpZ2hfY2hhbmdlYWRkcik7CiBFWFBPUlRfU1lNQk9MKG5laWdoX2NvbXBhdF9vdXRwdXQpOwogRVhQT1JUX1NZTUJPTChuZWlnaF9jb25uZWN0ZWRfb3V0cHV0KTsKIEVYUE9SVF9TWU1CT0wobmVpZ2hfY3JlYXRlKTsKLUVYUE9SVF9TWU1CT0wobmVpZ2hfZGVsZXRlKTsKIEVYUE9SVF9TWU1CT0wobmVpZ2hfZGVzdHJveSk7Ci1FWFBPUlRfU1lNQk9MKG5laWdoX2R1bXBfaW5mbyk7CiBFWFBPUlRfU1lNQk9MKG5laWdoX2V2ZW50X25zKTsKIEVYUE9SVF9TWU1CT0wobmVpZ2hfaWZkb3duKTsKIEVYUE9SVF9TWU1CT0wobmVpZ2hfbG9va3VwKTsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL25ldC1zeXNmcy5jIGIvbmV0L2NvcmUvbmV0LXN5c2ZzLmMKaW5kZXggNGNiYjEyOS4uYjIxMzA3YiAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvbmV0LXN5c2ZzLmMKKysrIGIvbmV0L2NvcmUvbmV0LXN5c2ZzLmMKQEAgLTM1Miw4ICszNTIsOCBAQAogCiAJcmVhZF9sb2NrKCZkZXZfYmFzZV9sb2NrKTsKIAlpZiAoZGV2X2lzYWxpdmUoZGV2KSkgewotCQlpZihkZXYtPndpcmVsZXNzX2hhbmRsZXJzICYmCi0JCSAgIGRldi0+d2lyZWxlc3NfaGFuZGxlcnMtPmdldF93aXJlbGVzc19zdGF0cykKKwkJaWYgKGRldi0+d2lyZWxlc3NfaGFuZGxlcnMgJiYKKwkJICAgIGRldi0+d2lyZWxlc3NfaGFuZGxlcnMtPmdldF93aXJlbGVzc19zdGF0cykKIAkJCWl3ID0gZGV2LT53aXJlbGVzc19oYW5kbGVycy0+Z2V0X3dpcmVsZXNzX3N0YXRzKGRldik7CiAJCWlmIChpdyAhPSBOVUxMKQogCQkJcmV0ID0gKCpmb3JtYXQpKGl3LCBidWYpOwpAQCAtNDEyLDIwICs0MTIsMjUgQEAKIAkJCSBpbnQgbnVtX2VudnAsIGNoYXIgKmJ1ZiwgaW50IHNpemUpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHRvX25ldF9kZXYoZCk7Ci0JaW50IGkgPSAwOwotCWludCBuOworCWludCByZXR2YWwsIGxlbiA9IDAsIGkgPSAwOwogCiAJLyogcGFzcyBpbnRlcmZhY2UgdG8gdWV2ZW50LiAqLwotCWVudnBbaSsrXSA9IGJ1ZjsKLQluID0gc25wcmludGYoYnVmLCBzaXplLCAiSU5URVJGQUNFPSVzIiwgZGV2LT5uYW1lKSArIDE7Ci0JYnVmICs9IG47Ci0Jc2l6ZSAtPSBuOworCXJldHZhbCA9IGFkZF91ZXZlbnRfdmFyKGVudnAsIG51bV9lbnZwLCAmaSwKKwkJCQlidWYsIHNpemUsICZsZW4sCisJCQkJIklOVEVSRkFDRT0lcyIsIGRldi0+bmFtZSk7CisJaWYgKHJldHZhbCkKKwkJZ290byBleGl0OwogCi0JaWYgKChzaXplIDw9IDApIHx8IChpID49IG51bV9lbnZwKSkKLQkJcmV0dXJuIC1FTk9NRU07CisJLyogcGFzcyBpZmluZGV4IHRvIHVldmVudC4KKwkgKiBpZmluZGV4IGlzIHVzZWZ1bCBhcyBpdCB3b24ndCBjaGFuZ2UgKGludGVyZmFjZSBuYW1lIG1heSBjaGFuZ2UpCisJICogYW5kIGlzIHdoYXQgUnROZXRsaW5rIHVzZXMgbmF0aXZlbHkuICovCisJcmV0dmFsID0gYWRkX3VldmVudF92YXIoZW52cCwgbnVtX2VudnAsICZpLAorCQkJCWJ1Ziwgc2l6ZSwgJmxlbiwKKwkJCQkiSUZJTkRFWD0lZCIsIGRldi0+aWZpbmRleCk7CiAKK2V4aXQ6CiAJZW52cFtpXSA9IE5VTEw7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIHJldHZhbDsKIH0KICNlbmRpZgogCmRpZmYgLS1naXQgYS9uZXQvY29yZS9uZXRwb2xsLmMgYi9uZXQvY29yZS9uZXRwb2xsLmMKaW5kZXggNDU4MWVjZS4uYjMxNjQzNSAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvbmV0cG9sbC5jCisrKyBiL25ldC9jb3JlL25ldHBvbGwuYwpAQCAtODYsNyArODYsNyBAQAogewogCV9fd3N1bSBwc3VtOwogCi0JaWYgKHVoLT5jaGVjayA9PSAwIHx8IHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1VOTkVDRVNTQVJZKQorCWlmICh1aC0+Y2hlY2sgPT0gMCB8fCBza2JfY3N1bV91bm5lY2Vzc2FyeShza2IpKQogCQlyZXR1cm4gMDsKIAogCXBzdW0gPSBjc3VtX3RjcHVkcF9ub2ZvbGQoc2FkZHIsIGRhZGRyLCB1bGVuLCBJUFBST1RPX1VEUCwgMCk7CkBAIC0yOTMsMTAgKzI5MywxMiBAQAogCWlmICghc2tiKQogCQlyZXR1cm47CiAKLQltZW1jcHkoc2tiLT5kYXRhLCBtc2csIGxlbik7CisJc2tiX2NvcHlfdG9fbGluZWFyX2RhdGEoc2tiLCBtc2csIGxlbik7CiAJc2tiLT5sZW4gKz0gbGVuOwogCi0Jc2tiLT5oLnVoID0gdWRwaCA9IChzdHJ1Y3QgdWRwaGRyICopIHNrYl9wdXNoKHNrYiwgc2l6ZW9mKCp1ZHBoKSk7CisJc2tiX3B1c2goc2tiLCBzaXplb2YoKnVkcGgpKTsKKwlza2JfcmVzZXRfdHJhbnNwb3J0X2hlYWRlcihza2IpOworCXVkcGggPSB1ZHBfaGRyKHNrYik7CiAJdWRwaC0+c291cmNlID0gaHRvbnMobnAtPmxvY2FsX3BvcnQpOwogCXVkcGgtPmRlc3QgPSBodG9ucyhucC0+cmVtb3RlX3BvcnQpOwogCXVkcGgtPmxlbiA9IGh0b25zKHVkcF9sZW4pOwpAQCAtMzA4LDcgKzMxMCw5IEBACiAJaWYgKHVkcGgtPmNoZWNrID09IDApCiAJCXVkcGgtPmNoZWNrID0gQ1NVTV9NQU5HTEVEXzA7CiAKLQlza2ItPm5oLmlwaCA9IGlwaCA9IChzdHJ1Y3QgaXBoZHIgKilza2JfcHVzaChza2IsIHNpemVvZigqaXBoKSk7CisJc2tiX3B1c2goc2tiLCBzaXplb2YoKmlwaCkpOworCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOworCWlwaCA9IGlwX2hkcihza2IpOwogCiAJLyogaXBoLT52ZXJzaW9uID0gNDsgaXBoLT5paGwgPSA1OyAqLwogCXB1dF91bmFsaWduZWQoMHg0NSwgKHVuc2lnbmVkIGNoYXIgKilpcGgpOwpAQCAtMzI0LDcgKzMyOCw3IEBACiAJaXBoLT5jaGVjayAgICA9IGlwX2Zhc3RfY3N1bSgodW5zaWduZWQgY2hhciAqKWlwaCwgaXBoLT5paGwpOwogCiAJZXRoID0gKHN0cnVjdCBldGhoZHIgKikgc2tiX3B1c2goc2tiLCBFVEhfSExFTik7Ci0Jc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOworCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CiAJc2tiLT5wcm90b2NvbCA9IGV0aC0+aF9wcm90byA9IGh0b25zKEVUSF9QX0lQKTsKIAltZW1jcHkoZXRoLT5oX3NvdXJjZSwgbnAtPmxvY2FsX21hYywgNik7CiAJbWVtY3B5KGV0aC0+aF9kZXN0LCBucC0+cmVtb3RlX21hYywgNik7CkBAIC0zNTksOCArMzYzLDkgQEAKIAkJCQkgKDIgKiBzaXplb2YodTMyKSkpKSkKIAkJcmV0dXJuOwogCi0Jc2tiLT5oLnJhdyA9IHNrYi0+bmgucmF3ID0gc2tiLT5kYXRhOwotCWFycCA9IHNrYi0+bmguYXJwaDsKKwlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiKTsKKwlza2JfcmVzZXRfdHJhbnNwb3J0X2hlYWRlcihza2IpOworCWFycCA9IGFycF9oZHIoc2tiKTsKIAogCWlmICgoYXJwLT5hcl9ocmQgIT0gaHRvbnMoQVJQSFJEX0VUSEVSKSAmJgogCSAgICAgYXJwLT5hcl9ocmQgIT0gaHRvbnMoQVJQSFJEX0lFRUU4MDIpKSB8fApAQCAtMzg5LDcgKzM5NCw3IEBACiAJaWYgKCFzZW5kX3NrYikKIAkJcmV0dXJuOwogCi0Jc2VuZF9za2ItPm5oLnJhdyA9IHNlbmRfc2tiLT5kYXRhOworCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihzZW5kX3NrYik7CiAJYXJwID0gKHN0cnVjdCBhcnBoZHIgKikgc2tiX3B1dChzZW5kX3NrYiwgc2l6ZSk7CiAJc2VuZF9za2ItPmRldiA9IHNrYi0+ZGV2OwogCXNlbmRfc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0FSUCk7CkBAIC00NDMsNyArNDQ4LDcgQEAKIAkJZ290byBvdXQ7CiAKIAkvKiBjaGVjayBpZiBuZXRwb2xsIGNsaWVudHMgbmVlZCBBUlAgKi8KLQlpZiAoc2tiLT5wcm90b2NvbCA9PSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0FSUCkgJiYKKwlpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9BUlApICYmCiAJICAgIGF0b21pY19yZWFkKCZ0cmFwcGVkKSkgewogCQlza2JfcXVldWVfdGFpbCgmbnBpLT5hcnBfdHgsIHNrYik7CiAJCXJldHVybiAxOwpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvcGt0Z2VuLmMgYi9uZXQvY29yZS9wa3RnZW4uYwppbmRleCA0YjAxNDk2Li5iOTJhMzIyIDEwMDY0NAotLS0gYS9uZXQvY29yZS9wa3RnZW4uYworKysgYi9uZXQvY29yZS9wa3RnZW4uYwpAQCAtMTY0LDE0ICsxNjQsMTEgQEAKIAogI2RlZmluZSBWRVJTSU9OICAicGt0Z2VuIHYyLjY4OiBQYWNrZXQgR2VuZXJhdG9yIGZvciBwYWNrZXQgcGVyZm9ybWFuY2UgdGVzdGluZy5cbiIKIAotLyogI2RlZmluZSBQR19ERUJVRyhhKSBhICovCi0jZGVmaW5lIFBHX0RFQlVHKGEpCi0KIC8qIFRoZSBidWNrZXRzIGFyZSBleHBvbmVudGlhbCBpbiAnd2lkdGgnICovCiAjZGVmaW5lIExBVF9CVUNLRVRTX01BWCAzMgogI2RlZmluZSBJUF9OQU1FX1NaIDMyCiAjZGVmaW5lIE1BWF9NUExTX0xBQkVMUyAxNiAvKiBUaGlzIGlzIHRoZSBtYXggbGFiZWwgc3RhY2sgZGVwdGggKi8KLSNkZWZpbmUgTVBMU19TVEFDS19CT1RUT00gX19jb25zdGFudF9odG9ubCgweDAwMDAwMTAwKQorI2RlZmluZSBNUExTX1NUQUNLX0JPVFRPTSBodG9ubCgweDAwMDAwMTAwKQogCiAvKiBEZXZpY2UgZmxhZyBiaXRzICovCiAjZGVmaW5lIEZfSVBTUkNfUk5EICAgKDE8PDApCS8qIElQLVNyYyBSYW5kb20gICovCkBAIC0yMTQsMTUgKzIxMSwxMSBAQAogfTsKIAogc3RydWN0IHBrdGdlbl9kZXYgewotCiAJLyoKIAkgKiBUcnkgdG8ga2VlcCBmcmVxdWVudC9pbmZyZXF1ZW50IHVzZWQgdmFycy4gc2VwYXJhdGVkLgogCSAqLwotCi0JY2hhciBpZm5hbWVbSUZOQU1TSVpdOwotCWNoYXIgcmVzdWx0WzUxMl07Ci0KLQlzdHJ1Y3QgcGt0Z2VuX3RocmVhZCAqcGdfdGhyZWFkOwkvKiB0aGUgb3duZXIgKi8KKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmVudHJ5OwkvKiBwcm9jIGZpbGUgKi8KKwlzdHJ1Y3QgcGt0Z2VuX3RocmVhZCAqcGdfdGhyZWFkOy8qIHRoZSBvd25lciAqLwogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsJCS8qIFVzZWQgZm9yIGNoYWluaW5nIGluIHRoZSB0aHJlYWQncyBydW4tcXVldWUgKi8KIAogCWludCBydW5uaW5nOwkJLyogaWYgdGhpcyBjaGFuZ2VzIHRvIGZhbHNlLCB0aGUgdGVzdCB3aWxsIHN0b3AgKi8KQEAgLTM0OSw2ICszNDIsOCBAQAogCXVuc2lnbmVkIGNmbG93czsJLyogQ29uY3VycmVudCBmbG93cyAoY29uZmlnKSAqLwogCXVuc2lnbmVkIGxmbG93OwkJLyogRmxvdyBsZW5ndGggIChjb25maWcpICovCiAJdW5zaWduZWQgbmZsb3dzOwkvKiBhY2N1bXVsYXRlZCBmbG93cyAoc3RhdHMpICovCisKKwljaGFyIHJlc3VsdFs1MTJdOwogfTsKIAogc3RydWN0IHBrdGdlbl9oZHIgewpAQCAtNDY4LDE3ICs0NjMsNiBAQAogCXJldHVybiB0bXA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdTMyIHBrdGdlbl9yYW5kb20odm9pZCkKLXsKLSNpZiAwCi0JX191MzIgbjsKLQlnZXRfcmFuZG9tX2J5dGVzKCZuLCA0KTsKLQlyZXR1cm4gbjsKLSNlbHNlCi0JcmV0dXJuIG5ldF9yYW5kb20oKTsKLSNlbmRpZgotfQotCiBzdGF0aWMgaW5saW5lIF9fdTY0IGdldEN1ck1zKHZvaWQpCiB7CiAJc3RydWN0IHRpbWV2YWwgdHY7CkBAIC01MTIsNyArNDk2LDcgQEAKIHN0YXRpYyBpbnQgcGt0Z2VuX3N0b3BfZGV2aWNlKHN0cnVjdCBwa3RnZW5fZGV2ICpwa3RfZGV2KTsKIHN0YXRpYyB2b2lkIHBrdGdlbl9zdG9wKHN0cnVjdCBwa3RnZW5fdGhyZWFkICp0KTsKIHN0YXRpYyB2b2lkIHBrdGdlbl9jbGVhcl9jb3VudGVycyhzdHJ1Y3QgcGt0Z2VuX2RldiAqcGt0X2Rldik7Ci1zdGF0aWMgaW50IHBrdGdlbl9tYXJrX2RldmljZShjb25zdCBjaGFyICppZm5hbWUpOworCiBzdGF0aWMgdW5zaWduZWQgaW50IHNjYW5faXA2KGNvbnN0IGNoYXIgKnMsIGNoYXIgaXBbMTZdKTsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgZm10X2lwNihjaGFyICpzLCBjb25zdCBjaGFyIGlwWzE2XSk7CiAKQEAgLTYwNiw3ICs1OTAsNyBAQAogCQkgICAiICAgICBmcmFnczogJWQgIGRlbGF5OiAldSAgY2xvbmVfc2tiOiAlZCAgaWZuYW1lOiAlc1xuIiwKIAkJICAgcGt0X2Rldi0+bmZyYWdzLAogCQkgICAxMDAwICogcGt0X2Rldi0+ZGVsYXlfdXMgKyBwa3RfZGV2LT5kZWxheV9ucywKLQkJICAgcGt0X2Rldi0+Y2xvbmVfc2tiLCBwa3RfZGV2LT5pZm5hbWUpOworCQkgICBwa3RfZGV2LT5jbG9uZV9za2IsIHBrdF9kZXYtPm9kZXYtPm5hbWUpOwogCiAJc2VxX3ByaW50ZihzZXEsICIgICAgIGZsb3dzOiAldSBmbG93bGVuOiAldVxuIiwgcGt0X2Rldi0+Y2Zsb3dzLAogCQkgICBwa3RfZGV2LT5sZmxvdyk7CkBAIC02NjEsNyArNjQ1LDcgQEAKIAlpZiAocGt0X2Rldi0+bnJfbGFiZWxzKSB7CiAJCXVuc2lnbmVkIGk7CiAJCXNlcV9wcmludGYoc2VxLCAiICAgICBtcGxzOiAiKTsKLQkJZm9yKGkgPSAwOyBpIDwgcGt0X2Rldi0+bnJfbGFiZWxzOyBpKyspCisJCWZvciAoaSA9IDA7IGkgPCBwa3RfZGV2LT5ucl9sYWJlbHM7IGkrKykKIAkJCXNlcV9wcmludGYoc2VxLCAiJTA4eCVzIiwgbnRvaGwocGt0X2Rldi0+bGFiZWxzW2ldKSwKIAkJCQkgICBpID09IHBrdF9kZXYtPm5yX2xhYmVscy0xID8gIlxuIiA6ICIsICIpOwogCX0KQEAgLTc2Niw3ICs3NTAsNyBAQAogCWludCBpID0gMDsKIAkqbnVtID0gMDsKIAotCWZvcig7IGkgPCBtYXhsZW47IGkrKykgeworCWZvciAoOyBpIDwgbWF4bGVuOyBpKyspIHsKIAkJY2hhciBjOwogCQkqbnVtIDw8PSA0OwogCQlpZiAoZ2V0X3VzZXIoYywgJnVzZXJfYnVmZmVyW2ldKSkKQEAgLTgwMiw3ICs3ODYsNyBAQAogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlnb3RvIGRvbmU7Ci0JCX07CisJCX0KIAl9CiBkb25lOgogCXJldHVybiBpOwpAQCAtODQ1LDcgKzgyOSw3IEBACiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCWJyZWFrOwotCQl9OworCQl9CiAJfQogZG9uZV9zdHI6CiAJcmV0dXJuIGk7CkBAIC04NzQsNyArODU4LDcgQEAKIAkJbisrOwogCQlpZiAobiA+PSBNQVhfTVBMU19MQUJFTFMpCiAJCQlyZXR1cm4gLUUyQklHOwotCX0gd2hpbGUoYyA9PSAnLCcpOworCX0gd2hpbGUgKGMgPT0gJywnKTsKIAogCXBrdF9kZXYtPm5yX2xhYmVscyA9IG47CiAJcmV0dXJuIGk7CkBAIC0xNTAzLDcgKzE0ODcsNyBAQAogCQlpZiAobGVuIDwgMCkgeyByZXR1cm4gbGVuOyB9CiAJCWkgKz0gbGVuOwogCQlvZmZzZXQgPSBzcHJpbnRmKHBnX3Jlc3VsdCwgIk9LOiBtcGxzPSIpOwotCQlmb3IobiA9IDA7IG4gPCBwa3RfZGV2LT5ucl9sYWJlbHM7IG4rKykKKwkJZm9yIChuID0gMDsgbiA8IHBrdF9kZXYtPm5yX2xhYmVsczsgbisrKQogCQkJb2Zmc2V0ICs9IHNwcmludGYocGdfcmVzdWx0ICsgb2Zmc2V0LAogCQkJCQkgICIlMDh4JXMiLCBudG9obChwa3RfZGV2LT5sYWJlbHNbbl0pLAogCQkJCQkgIG4gPT0gcGt0X2Rldi0+bnJfbGFiZWxzLTEgPyAiIiA6ICIsIik7CkBAIC0xNjk3LDEzICsxNjgxLDEzIEBACiAJaWZfbG9jayh0KTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBrdF9kZXYsICZ0LT5pZl9saXN0LCBsaXN0KQogCQlpZiAocGt0X2Rldi0+cnVubmluZykKLQkJCXNlcV9wcmludGYoc2VxLCAiJXMgIiwgcGt0X2Rldi0+aWZuYW1lKTsKKwkJCXNlcV9wcmludGYoc2VxLCAiJXMgIiwgcGt0X2Rldi0+b2Rldi0+bmFtZSk7CiAKIAlzZXFfcHJpbnRmKHNlcSwgIlxuU3RvcHBlZDogIik7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBrdF9kZXYsICZ0LT5pZl9saXN0LCBsaXN0KQogCQlpZiAoIXBrdF9kZXYtPnJ1bm5pbmcpCi0JCQlzZXFfcHJpbnRmKHNlcSwgIiVzICIsIHBrdF9kZXYtPmlmbmFtZSk7CisJCQlzZXFfcHJpbnRmKHNlcSwgIiVzICIsIHBrdF9kZXYtPm9kZXYtPm5hbWUpOwogCiAJaWYgKHQtPnJlc3VsdFswXSkKIAkJc2VxX3ByaW50ZihzZXEsICJcblJlc3VsdDogJXNcbiIsIHQtPnJlc3VsdCk7CkBAIC0xODQ5LDE2ICsxODMzLDE0IEBACiAvKgogICogbWFyayBhIGRldmljZSBmb3IgcmVtb3ZhbAogICovCi1zdGF0aWMgaW50IHBrdGdlbl9tYXJrX2RldmljZShjb25zdCBjaGFyICppZm5hbWUpCitzdGF0aWMgdm9pZCBwa3RnZW5fbWFya19kZXZpY2UoY29uc3QgY2hhciAqaWZuYW1lKQogewogCXN0cnVjdCBwa3RnZW5fZGV2ICpwa3RfZGV2ID0gTlVMTDsKIAljb25zdCBpbnQgbWF4X3RyaWVzID0gMTAsIG1zZWNfcGVyX3RyeSA9IDEyNTsKIAlpbnQgaSA9IDA7Ci0JaW50IHJldCA9IDA7CiAKIAltdXRleF9sb2NrKCZwa3RnZW5fdGhyZWFkX2xvY2spOwotCVBHX0RFQlVHKHByaW50aygicGt0Z2VuOiBwa3RnZW5fbWFya19kZXZpY2UgbWFya2luZyAlcyBmb3IgcmVtb3ZhbFxuIiwKLQkJCWlmbmFtZSkpOworCXByX2RlYnVnKCJwa3RnZW46IHBrdGdlbl9tYXJrX2RldmljZSBtYXJraW5nICVzIGZvciByZW1vdmFsXG4iLCBpZm5hbWUpOwogCiAJd2hpbGUgKDEpIHsKIApAQCAtMTg2Nyw4ICsxODQ5LDggQEAKIAkJCWJyZWFrOwkvKiBzdWNjZXNzICovCiAKIAkJbXV0ZXhfdW5sb2NrKCZwa3RnZW5fdGhyZWFkX2xvY2spOwotCQlQR19ERUJVRyhwcmludGsoInBrdGdlbjogcGt0Z2VuX21hcmtfZGV2aWNlIHdhaXRpbmcgZm9yICVzICIKLQkJCQkidG8gZGlzYXBwZWFyLi4uLlxuIiwgaWZuYW1lKSk7CisJCXByX2RlYnVnKCJwa3RnZW46IHBrdGdlbl9tYXJrX2RldmljZSB3YWl0aW5nIGZvciAlcyAiCisJCQkJInRvIGRpc2FwcGVhci4uLi5cbiIsIGlmbmFtZSk7CiAJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZShtc2Vjc190b19qaWZmaWVzKG1zZWNfcGVyX3RyeSkpOwogCQltdXRleF9sb2NrKCZwa3RnZW5fdGhyZWFkX2xvY2spOwogCkBAIC0xODc2LDc5ICsxODU4LDkxIEBACiAJCQlwcmludGsoInBrdGdlbl9tYXJrX2RldmljZTogdGltZWQgb3V0IGFmdGVyIHdhaXRpbmcgIgogCQkJICAgICAgICIlZCBtc2VjIGZvciBkZXZpY2UgJXMgdG8gYmUgcmVtb3ZlZFxuIiwKIAkJCSAgICAgICBtc2VjX3Blcl90cnkgKiBpLCBpZm5hbWUpOwotCQkJcmV0ID0gMTsKIAkJCWJyZWFrOwogCQl9CiAKIAl9CiAKIAltdXRleF91bmxvY2soJnBrdGdlbl90aHJlYWRfbG9jayk7Cit9CiAKLQlyZXR1cm4gcmV0Oworc3RhdGljIHZvaWQgcGt0Z2VuX2NoYW5nZV9uYW1lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBrdGdlbl90aHJlYWQgKnQ7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHQsICZwa3RnZW5fdGhyZWFkcywgdGhfbGlzdCkgeworCQlzdHJ1Y3QgcGt0Z2VuX2RldiAqcGt0X2RldjsKKworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBrdF9kZXYsICZ0LT5pZl9saXN0LCBsaXN0KSB7CisJCQlpZiAocGt0X2Rldi0+b2RldiAhPSBkZXYpCisJCQkJY29udGludWU7CisKKwkJCXJlbW92ZV9wcm9jX2VudHJ5KHBrdF9kZXYtPmVudHJ5LT5uYW1lLCBwZ19wcm9jX2Rpcik7CisKKwkJCXBrdF9kZXYtPmVudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkoZGV2LT5uYW1lLCAwNjAwLAorCQkJCQkJCSAgIHBnX3Byb2NfZGlyKTsKKwkJCWlmICghcGt0X2Rldi0+ZW50cnkpCisJCQkJcHJpbnRrKEtFUk5fRVJSICJwa3RnZW46IGNhbid0IG1vdmUgcHJvYyAiCisJCQkJICAgICAgICIgZW50cnkgZm9yICclcydcbiIsIGRldi0+bmFtZSk7CisJCQlicmVhazsKKwkJfQorCX0KIH0KIAogc3RhdGljIGludCBwa3RnZW5fZGV2aWNlX2V2ZW50KHN0cnVjdCBub3RpZmllcl9ibG9jayAqdW51c2VkLAogCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKnB0cikKIHsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopKHB0cik7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHB0cjsKIAogCS8qIEl0IGlzIE9LIHRoYXQgd2UgZG8gbm90IGhvbGQgdGhlIGdyb3VwIGxvY2sgcmlnaHQgbm93LAogCSAqIGFzIHdlIHJ1biB1bmRlciB0aGUgUlROTCBsb2NrLgogCSAqLwogCiAJc3dpdGNoIChldmVudCkgewotCWNhc2UgTkVUREVWX0NIQU5HRUFERFI6Ci0JY2FzZSBORVRERVZfR09JTkdfRE9XTjoKLQljYXNlIE5FVERFVl9ET1dOOgotCWNhc2UgTkVUREVWX1VQOgotCQkvKiBJZ25vcmUgZm9yIG5vdyAqLworCWNhc2UgTkVUREVWX0NIQU5HRU5BTUU6CisJCXBrdGdlbl9jaGFuZ2VfbmFtZShkZXYpOwogCQlicmVhazsKIAogCWNhc2UgTkVUREVWX1VOUkVHSVNURVI6CiAJCXBrdGdlbl9tYXJrX2RldmljZShkZXYtPm5hbWUpOwogCQlicmVhazsKLQl9OworCX0KIAogCXJldHVybiBOT1RJRllfRE9ORTsKIH0KIAogLyogQXNzb2NpYXRlIHBrdGdlbl9kZXYgd2l0aCBhIGRldmljZS4gKi8KIAotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpwa3RnZW5fc2V0dXBfZGV2KHN0cnVjdCBwa3RnZW5fZGV2ICpwa3RfZGV2KQorc3RhdGljIGludCBwa3RnZW5fc2V0dXBfZGV2KHN0cnVjdCBwa3RnZW5fZGV2ICpwa3RfZGV2LCBjb25zdCBjaGFyICppZm5hbWUpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm9kZXY7CisJaW50IGVycjsKIAogCS8qIENsZWFuIG9sZCBzZXR1cHMgKi8KLQogCWlmIChwa3RfZGV2LT5vZGV2KSB7CiAJCWRldl9wdXQocGt0X2Rldi0+b2Rldik7CiAJCXBrdF9kZXYtPm9kZXYgPSBOVUxMOwogCX0KIAotCW9kZXYgPSBkZXZfZ2V0X2J5X25hbWUocGt0X2Rldi0+aWZuYW1lKTsKLQorCW9kZXYgPSBkZXZfZ2V0X2J5X25hbWUoaWZuYW1lKTsKIAlpZiAoIW9kZXYpIHsKLQkJcHJpbnRrKCJwa3RnZW46IG5vIHN1Y2ggbmV0ZGV2aWNlOiBcIiVzXCJcbiIsIHBrdF9kZXYtPmlmbmFtZSk7Ci0JCWdvdG8gb3V0OworCQlwcmludGsoInBrdGdlbjogbm8gc3VjaCBuZXRkZXZpY2U6IFwiJXNcIlxuIiwgaWZuYW1lKTsKKwkJcmV0dXJuIC1FTk9ERVY7CiAJfQorCiAJaWYgKG9kZXYtPnR5cGUgIT0gQVJQSFJEX0VUSEVSKSB7Ci0JCXByaW50aygicGt0Z2VuOiBub3QgYW4gZXRoZXJuZXQgZGV2aWNlOiBcIiVzXCJcbiIsCi0JCSAgICAgICBwa3RfZGV2LT5pZm5hbWUpOwotCQlnb3RvIG91dF9wdXQ7CisJCXByaW50aygicGt0Z2VuOiBub3QgYW4gZXRoZXJuZXQgZGV2aWNlOiBcIiVzXCJcbiIsIGlmbmFtZSk7CisJCWVyciA9IC1FSU5WQUw7CisJfSBlbHNlIGlmICghbmV0aWZfcnVubmluZyhvZGV2KSkgeworCQlwcmludGsoInBrdGdlbjogZGV2aWNlIGlzIGRvd246IFwiJXNcIlxuIiwgaWZuYW1lKTsKKwkJZXJyID0gLUVORVRET1dOOworCX0gZWxzZSB7CisJCXBrdF9kZXYtPm9kZXYgPSBvZGV2OworCQlyZXR1cm4gMDsKIAl9Ci0JaWYgKCFuZXRpZl9ydW5uaW5nKG9kZXYpKSB7Ci0JCXByaW50aygicGt0Z2VuOiBkZXZpY2UgaXMgZG93bjogXCIlc1wiXG4iLCBwa3RfZGV2LT5pZm5hbWUpOwotCQlnb3RvIG91dF9wdXQ7Ci0JfQotCXBrdF9kZXYtPm9kZXYgPSBvZGV2OwogCi0JcmV0dXJuIHBrdF9kZXYtPm9kZXY7Ci0KLW91dF9wdXQ6CiAJZGV2X3B1dChvZGV2KTsKLW91dDoKLQlyZXR1cm4gTlVMTDsKLQorCXJldHVybiBlcnI7CiB9CiAKIC8qIFJlYWQgcGt0X2RldiBmcm9tIHRoZSBpbnRlcmZhY2UgYW5kIHNldCB1cCBpbnRlcm5hbCBwa3RnZW5fZGV2CkBAIC0xOTU2LDEwICsxOTUwLDYgQEAKICAqLwogc3RhdGljIHZvaWQgcGt0Z2VuX3NldHVwX2luamVjdChzdHJ1Y3QgcGt0Z2VuX2RldiAqcGt0X2RldikKIHsKLQkvKiBUcnkgb25jZSBtb3JlLCBqdXN0IGluIGNhc2UgaXQgd29ya3Mgbm93LiAqLwotCWlmICghcGt0X2Rldi0+b2RldikKLQkJcGt0Z2VuX3NldHVwX2Rldihwa3RfZGV2KTsKLQogCWlmICghcGt0X2Rldi0+b2RldikgewogCQlwcmludGsoInBrdGdlbjogRVJST1I6IHBrdF9kZXYtPm9kZXYgPT0gTlVMTCBpbiBzZXR1cF9pbmplY3QuXG4iKTsKIAkJc3ByaW50Zihwa3RfZGV2LT5yZXN1bHQsCkBAIC0yMDk2LDcgKzIwODYsNyBAQAogCWludCBmbG93ID0gMDsKIAogCWlmIChwa3RfZGV2LT5jZmxvd3MpIHsKLQkJZmxvdyA9IHBrdGdlbl9yYW5kb20oKSAlIHBrdF9kZXYtPmNmbG93czsKKwkJZmxvdyA9IHJhbmRvbTMyKCkgJSBwa3RfZGV2LT5jZmxvd3M7CiAKIAkJaWYgKHBrdF9kZXYtPmZsb3dzW2Zsb3ddLmNvdW50ID4gcGt0X2Rldi0+bGZsb3cpCiAJCQlwa3RfZGV2LT5mbG93c1tmbG93XS5jb3VudCA9IDA7CkBAIC0yMTA4LDcgKzIwOTgsNyBAQAogCQlfX3UzMiB0bXA7CiAKIAkJaWYgKHBrdF9kZXYtPmZsYWdzICYgRl9NQUNTUkNfUk5EKQotCQkJbWMgPSBwa3RnZW5fcmFuZG9tKCkgJSAocGt0X2Rldi0+c3JjX21hY19jb3VudCk7CisJCQltYyA9IHJhbmRvbTMyKCkgJSBwa3RfZGV2LT5zcmNfbWFjX2NvdW50OwogCQllbHNlIHsKIAkJCW1jID0gcGt0X2Rldi0+Y3VyX3NyY19tYWNfb2Zmc2V0Kys7CiAJCQlpZiAocGt0X2Rldi0+Y3VyX3NyY19tYWNfb2Zmc2V0ID4KQEAgLTIxMzQsNyArMjEyNCw3IEBACiAJCV9fdTMyIHRtcDsKIAogCQlpZiAocGt0X2Rldi0+ZmxhZ3MgJiBGX01BQ0RTVF9STkQpCi0JCQltYyA9IHBrdGdlbl9yYW5kb20oKSAlIChwa3RfZGV2LT5kc3RfbWFjX2NvdW50KTsKKwkJCW1jID0gcmFuZG9tMzIoKSAlIHBrdF9kZXYtPmRzdF9tYWNfY291bnQ7CiAKIAkJZWxzZSB7CiAJCQltYyA9IHBrdF9kZXYtPmN1cl9kc3RfbWFjX29mZnNldCsrOwpAQCAtMjE1OCwyNyArMjE0OCwyNiBAQAogCiAJaWYgKHBrdF9kZXYtPmZsYWdzICYgRl9NUExTX1JORCkgewogCQl1bnNpZ25lZCBpOwotCQlmb3IoaSA9IDA7IGkgPCBwa3RfZGV2LT5ucl9sYWJlbHM7IGkrKykKKwkJZm9yIChpID0gMDsgaSA8IHBrdF9kZXYtPm5yX2xhYmVsczsgaSsrKQogCQkJaWYgKHBrdF9kZXYtPmxhYmVsc1tpXSAmIE1QTFNfU1RBQ0tfQk9UVE9NKQogCQkJCXBrdF9kZXYtPmxhYmVsc1tpXSA9IE1QTFNfU1RBQ0tfQk9UVE9NIHwKLQkJCQkJICAgICAoKF9fZm9yY2UgX19iZTMyKXBrdGdlbl9yYW5kb20oKSAmCisJCQkJCSAgICAgKChfX2ZvcmNlIF9fYmUzMilyYW5kb20zMigpICYKIAkJCQkJCSAgICAgIGh0b25sKDB4MDAwZmZmZmYpKTsKIAl9CiAKIAlpZiAoKHBrdF9kZXYtPmZsYWdzICYgRl9WSURfUk5EKSAmJiAocGt0X2Rldi0+dmxhbl9pZCAhPSAweGZmZmYpKSB7Ci0JCXBrdF9kZXYtPnZsYW5faWQgPSBwa3RnZW5fcmFuZG9tKCkgJSA0MDk2OworCQlwa3RfZGV2LT52bGFuX2lkID0gcmFuZG9tMzIoKSAmICg0MDk2LTEpOwogCX0KIAogCWlmICgocGt0X2Rldi0+ZmxhZ3MgJiBGX1NWSURfUk5EKSAmJiAocGt0X2Rldi0+c3ZsYW5faWQgIT0gMHhmZmZmKSkgewotCQlwa3RfZGV2LT5zdmxhbl9pZCA9IHBrdGdlbl9yYW5kb20oKSAlIDQwOTY7CisJCXBrdF9kZXYtPnN2bGFuX2lkID0gcmFuZG9tMzIoKSAmICg0MDk2IC0gMSk7CiAJfQogCiAJaWYgKHBrdF9kZXYtPnVkcF9zcmNfbWluIDwgcGt0X2Rldi0+dWRwX3NyY19tYXgpIHsKIAkJaWYgKHBrdF9kZXYtPmZsYWdzICYgRl9VRFBTUkNfUk5EKQotCQkJcGt0X2Rldi0+Y3VyX3VkcF9zcmMgPQotCQkJICAgICgocGt0Z2VuX3JhbmRvbSgpICUKLQkJCSAgICAgIChwa3RfZGV2LT51ZHBfc3JjX21heCAtIHBrdF9kZXYtPnVkcF9zcmNfbWluKSkgKwotCQkJICAgICBwa3RfZGV2LT51ZHBfc3JjX21pbik7CisJCQlwa3RfZGV2LT5jdXJfdWRwX3NyYyA9IHJhbmRvbTMyKCkgJQorCQkJCShwa3RfZGV2LT51ZHBfc3JjX21heCAtIHBrdF9kZXYtPnVkcF9zcmNfbWluKQorCQkJCSsgcGt0X2Rldi0+dWRwX3NyY19taW47CiAKIAkJZWxzZSB7CiAJCQlwa3RfZGV2LT5jdXJfdWRwX3NyYysrOwpAQCAtMjE4OSwxMCArMjE3OCw5IEBACiAKIAlpZiAocGt0X2Rldi0+dWRwX2RzdF9taW4gPCBwa3RfZGV2LT51ZHBfZHN0X21heCkgewogCQlpZiAocGt0X2Rldi0+ZmxhZ3MgJiBGX1VEUERTVF9STkQpIHsKLQkJCXBrdF9kZXYtPmN1cl91ZHBfZHN0ID0KLQkJCSAgICAoKHBrdGdlbl9yYW5kb20oKSAlCi0JCQkgICAgICAocGt0X2Rldi0+dWRwX2RzdF9tYXggLSBwa3RfZGV2LT51ZHBfZHN0X21pbikpICsKLQkJCSAgICAgcGt0X2Rldi0+dWRwX2RzdF9taW4pOworCQkJcGt0X2Rldi0+Y3VyX3VkcF9kc3QgPSByYW5kb20zMigpICUKKwkJCQkocGt0X2Rldi0+dWRwX2RzdF9tYXggLSBwa3RfZGV2LT51ZHBfZHN0X21pbikKKwkJCQkrIHBrdF9kZXYtPnVkcF9kc3RfbWluOwogCQl9IGVsc2UgewogCQkJcGt0X2Rldi0+Y3VyX3VkcF9kc3QrKzsKIAkJCWlmIChwa3RfZGV2LT5jdXJfdWRwX2RzdCA+PSBwa3RfZGV2LT51ZHBfZHN0X21heCkKQEAgLTIyMDcsNyArMjE5NSw3IEBACiAJCQkJCQkJICAgICAgIHNhZGRyX21heCkpKSB7CiAJCQlfX3UzMiB0OwogCQkJaWYgKHBrdF9kZXYtPmZsYWdzICYgRl9JUFNSQ19STkQpCi0JCQkJdCA9ICgocGt0Z2VuX3JhbmRvbSgpICUgKGlteCAtIGltbikpICsgaW1uKTsKKwkJCQl0ID0gcmFuZG9tMzIoKSAlIChpbXggLSBpbW4pICsgaW1uOwogCQkJZWxzZSB7CiAJCQkJdCA9IG50b2hsKHBrdF9kZXYtPmN1cl9zYWRkcik7CiAJCQkJdCsrOwpAQCAtMjIyOCwxNCArMjIxNiwxMyBAQAogCQkJCV9fYmUzMiBzOwogCQkJCWlmIChwa3RfZGV2LT5mbGFncyAmIEZfSVBEU1RfUk5EKSB7CiAKLQkJCQkJdCA9IHBrdGdlbl9yYW5kb20oKSAlIChpbXggLSBpbW4pICsgaW1uOworCQkJCQl0ID0gcmFuZG9tMzIoKSAlIChpbXggLSBpbW4pICsgaW1uOwogCQkJCQlzID0gaHRvbmwodCk7CiAKIAkJCQkJd2hpbGUgKExPT1BCQUNLKHMpIHx8IE1VTFRJQ0FTVChzKQogCQkJCQkgICAgICAgfHwgQkFEQ0xBU1MocykgfHwgWkVST05FVChzKQogCQkJCQkgICAgICAgfHwgTE9DQUxfTUNBU1QocykpIHsKLQkJCQkJCXQgPSAocGt0Z2VuX3JhbmRvbSgpICUKLQkJCQkJCSAgICAgIChpbXggLSBpbW4pKSArIGltbjsKKwkJCQkJCXQgPSByYW5kb20zMigpICUgKGlteCAtIGltbikgKyBpbW47CiAJCQkJCQlzID0gaHRvbmwodCk7CiAJCQkJCX0KIAkJCQkJcGt0X2Rldi0+Y3VyX2RhZGRyID0gczsKQEAgLTIyNjcsNyArMjI1NCw3IEBACiAKIAkJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKIAkJCQlwa3RfZGV2LT5jdXJfaW42X2RhZGRyLnM2X2FkZHIzMltpXSA9Ci0JCQkJICAgICgoKF9fZm9yY2UgX19iZTMyKXBrdGdlbl9yYW5kb20oKSB8CisJCQkJICAgICgoKF9fZm9yY2UgX19iZTMyKXJhbmRvbTMyKCkgfAogCQkJCSAgICAgIHBrdF9kZXYtPm1pbl9pbjZfZGFkZHIuczZfYWRkcjMyW2ldKSAmCiAJCQkJICAgICBwa3RfZGV2LT5tYXhfaW42X2RhZGRyLnM2X2FkZHIzMltpXSk7CiAJCQl9CkBAIC0yMjc3LDkgKzIyNjQsOSBAQAogCWlmIChwa3RfZGV2LT5taW5fcGt0X3NpemUgPCBwa3RfZGV2LT5tYXhfcGt0X3NpemUpIHsKIAkJX191MzIgdDsKIAkJaWYgKHBrdF9kZXYtPmZsYWdzICYgRl9UWFNJWkVfUk5EKSB7Ci0JCQl0ID0gKChwa3RnZW5fcmFuZG9tKCkgJQotCQkJICAgICAgKHBrdF9kZXYtPm1heF9wa3Rfc2l6ZSAtIHBrdF9kZXYtPm1pbl9wa3Rfc2l6ZSkpCi0JCQkgICAgICsgcGt0X2Rldi0+bWluX3BrdF9zaXplKTsKKwkJCXQgPSByYW5kb20zMigpICUKKwkJCQkocGt0X2Rldi0+bWF4X3BrdF9zaXplIC0gcGt0X2Rldi0+bWluX3BrdF9zaXplKQorCQkJCSsgcGt0X2Rldi0+bWluX3BrdF9zaXplOwogCQl9IGVsc2UgewogCQkJdCA9IHBrdF9kZXYtPmN1cl9wa3Rfc2l6ZSArIDE7CiAJCQlpZiAodCA+IHBrdF9kZXYtPm1heF9wa3Rfc2l6ZSkKQEAgLTIyOTQsNyArMjI4MSw3IEBACiBzdGF0aWMgdm9pZCBtcGxzX3B1c2goX19iZTMyICptcGxzLCBzdHJ1Y3QgcGt0Z2VuX2RldiAqcGt0X2RldikKIHsKIAl1bnNpZ25lZCBpOwotCWZvcihpID0gMDsgaSA8IHBrdF9kZXYtPm5yX2xhYmVsczsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IHBrdF9kZXYtPm5yX2xhYmVsczsgaSsrKSB7CiAJCSptcGxzKysgPSBwa3RfZGV2LT5sYWJlbHNbaV0gJiB+TVBMU19TVEFDS19CT1RUT007CiAJfQogCW1wbHMtLTsKQEAgLTIzMTYsNyArMjMwMyw3IEBACiAJaW50IGRhdGFsZW4sIGlwbGVuOwogCXN0cnVjdCBpcGhkciAqaXBoOwogCXN0cnVjdCBwa3RnZW5faGRyICpwZ2ggPSBOVUxMOwotCV9fYmUxNiBwcm90b2NvbCA9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfSVApOworCV9fYmUxNiBwcm90b2NvbCA9IGh0b25zKEVUSF9QX0lQKTsKIAlfX2JlMzIgKm1wbHM7CiAJX19iZTE2ICp2bGFuX3RjaSA9IE5VTEw7ICAgICAgICAgICAgICAgICAvKiBFbmNhcHN1bGF0ZXMgcHJpb3JpdHkgYW5kIFZMQU4gSUQgKi8KIAlfX2JlMTYgKnZsYW5fZW5jYXBzdWxhdGVkX3Byb3RvID0gTlVMTDsgIC8qIHBhY2tldCB0eXBlIElEIGZpZWxkIChvciBsZW4pIGZvciBWTEFOIHRhZyAqLwpAQCAtMjMyNSwxMCArMjMxMiwxMCBAQAogCiAKIAlpZiAocGt0X2Rldi0+bnJfbGFiZWxzKQotCQlwcm90b2NvbCA9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfTVBMU19VQyk7CisJCXByb3RvY29sID0gaHRvbnMoRVRIX1BfTVBMU19VQyk7CiAKIAlpZiAocGt0X2Rldi0+dmxhbl9pZCAhPSAweGZmZmYpCi0JCXByb3RvY29sID0gX19jb25zdGFudF9odG9ucyhFVEhfUF84MDIxUSk7CisJCXByb3RvY29sID0gaHRvbnMoRVRIX1BfODAyMVEpOwogCiAJLyogVXBkYXRlIGFueSBvZiB0aGUgdmFsdWVzLCB1c2VkIHdoZW4gd2UncmUgaW5jcmVtZW50aW5nIHZhcmlvdXMKIAkgKiBmaWVsZHMuCkBAIC0yMzU0LDI0ICsyMzQxLDI4IEBACiAJCW1wbHNfcHVzaChtcGxzLCBwa3RfZGV2KTsKIAogCWlmIChwa3RfZGV2LT52bGFuX2lkICE9IDB4ZmZmZikgewotCQlpZihwa3RfZGV2LT5zdmxhbl9pZCAhPSAweGZmZmYpIHsKKwkJaWYgKHBrdF9kZXYtPnN2bGFuX2lkICE9IDB4ZmZmZikgewogCQkJc3ZsYW5fdGNpID0gKF9fYmUxNiAqKXNrYl9wdXQoc2tiLCBzaXplb2YoX19iZTE2KSk7CiAJCQkqc3ZsYW5fdGNpID0gYnVpbGRfdGNpKHBrdF9kZXYtPnN2bGFuX2lkLAogCQkJCQkgICAgICAgcGt0X2Rldi0+c3ZsYW5fY2ZpLAogCQkJCQkgICAgICAgcGt0X2Rldi0+c3ZsYW5fcCk7CiAJCQlzdmxhbl9lbmNhcHN1bGF0ZWRfcHJvdG8gPSAoX19iZTE2ICopc2tiX3B1dChza2IsIHNpemVvZihfX2JlMTYpKTsKLQkJCSpzdmxhbl9lbmNhcHN1bGF0ZWRfcHJvdG8gPSBfX2NvbnN0YW50X2h0b25zKEVUSF9QXzgwMjFRKTsKKwkJCSpzdmxhbl9lbmNhcHN1bGF0ZWRfcHJvdG8gPSBodG9ucyhFVEhfUF84MDIxUSk7CiAJCX0KIAkJdmxhbl90Y2kgPSAoX19iZTE2ICopc2tiX3B1dChza2IsIHNpemVvZihfX2JlMTYpKTsKIAkJKnZsYW5fdGNpID0gYnVpbGRfdGNpKHBrdF9kZXYtPnZsYW5faWQsCiAJCQkJICAgICAgcGt0X2Rldi0+dmxhbl9jZmksCiAJCQkJICAgICAgcGt0X2Rldi0+dmxhbl9wKTsKIAkJdmxhbl9lbmNhcHN1bGF0ZWRfcHJvdG8gPSAoX19iZTE2ICopc2tiX3B1dChza2IsIHNpemVvZihfX2JlMTYpKTsKLQkJKnZsYW5fZW5jYXBzdWxhdGVkX3Byb3RvID0gX19jb25zdGFudF9odG9ucyhFVEhfUF9JUCk7CisJCSp2bGFuX2VuY2Fwc3VsYXRlZF9wcm90byA9IGh0b25zKEVUSF9QX0lQKTsKIAl9CiAKLQlpcGggPSAoc3RydWN0IGlwaGRyICopc2tiX3B1dChza2IsIHNpemVvZihzdHJ1Y3QgaXBoZHIpKTsKLQl1ZHBoID0gKHN0cnVjdCB1ZHBoZHIgKilza2JfcHV0KHNrYiwgc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpKTsKKwlza2ItPm5ldHdvcmtfaGVhZGVyID0gc2tiLT50YWlsOworCXNrYi0+dHJhbnNwb3J0X2hlYWRlciA9IHNrYi0+bmV0d29ya19oZWFkZXIgKyBzaXplb2Yoc3RydWN0IGlwaGRyKTsKKwlza2JfcHV0KHNrYiwgc2l6ZW9mKHN0cnVjdCBpcGhkcikgKyBzaXplb2Yoc3RydWN0IHVkcGhkcikpOworCisJaXBoID0gaXBfaGRyKHNrYik7CisJdWRwaCA9IHVkcF9oZHIoc2tiKTsKIAogCW1lbWNweShldGgsIHBrdF9kZXYtPmhoLCAxMik7CiAJKihfX2JlMTYgKikgJiBldGhbMTJdID0gcHJvdG9jb2w7CkBAIC0yNDAwLDEyICsyMzkxLDExIEBACiAJaXBoLT5jaGVjayA9IDA7CiAJaXBoLT5jaGVjayA9IGlwX2Zhc3RfY3N1bSgodm9pZCAqKWlwaCwgaXBoLT5paGwpOwogCXNrYi0+cHJvdG9jb2wgPSBwcm90b2NvbDsKLQlza2ItPm1hYy5yYXcgPSAoKHU4ICopIGlwaCkgLSAxNCAtIHBrdF9kZXYtPm5yX2xhYmVscypzaXplb2YodTMyKSAtCi0JCVZMQU5fVEFHX1NJWkUocGt0X2RldikgLSBTVkxBTl9UQUdfU0laRShwa3RfZGV2KTsKKwlza2ItPm1hY19oZWFkZXIgPSAoc2tiLT5uZXR3b3JrX2hlYWRlciAtIEVUSF9ITEVOIC0KKwkJCSAgIHBrdF9kZXYtPm5yX2xhYmVscyAqIHNpemVvZih1MzIpIC0KKwkJCSAgIFZMQU5fVEFHX1NJWkUocGt0X2RldikgLSBTVkxBTl9UQUdfU0laRShwa3RfZGV2KSk7CiAJc2tiLT5kZXYgPSBvZGV2OwogCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfSE9TVDsKLQlza2ItPm5oLmlwaCA9IGlwaDsKLQlza2ItPmgudWggPSB1ZHBoOwogCiAJaWYgKHBrdF9kZXYtPm5mcmFncyA8PSAwKQogCQlwZ2ggPSAoc3RydWN0IHBrdGdlbl9oZHIgKilza2JfcHV0KHNrYiwgZGF0YWxlbik7CkBAIC0yNjU0LDcgKzI2NDQsNyBAQAogCWludCBkYXRhbGVuOwogCXN0cnVjdCBpcHY2aGRyICppcGg7CiAJc3RydWN0IHBrdGdlbl9oZHIgKnBnaCA9IE5VTEw7Ci0JX19iZTE2IHByb3RvY29sID0gX19jb25zdGFudF9odG9ucyhFVEhfUF9JUFY2KTsKKwlfX2JlMTYgcHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUFY2KTsKIAlfX2JlMzIgKm1wbHM7CiAJX19iZTE2ICp2bGFuX3RjaSA9IE5VTEw7ICAgICAgICAgICAgICAgICAvKiBFbmNhcHN1bGF0ZXMgcHJpb3JpdHkgYW5kIFZMQU4gSUQgKi8KIAlfX2JlMTYgKnZsYW5fZW5jYXBzdWxhdGVkX3Byb3RvID0gTlVMTDsgIC8qIHBhY2tldCB0eXBlIElEIGZpZWxkIChvciBsZW4pIGZvciBWTEFOIHRhZyAqLwpAQCAtMjY2MiwxMCArMjY1MiwxMCBAQAogCV9fYmUxNiAqc3ZsYW5fZW5jYXBzdWxhdGVkX3Byb3RvID0gTlVMTDsgLyogcGFja2V0IHR5cGUgSUQgZmllbGQgKG9yIGxlbikgZm9yIFNWTEFOIHRhZyAqLwogCiAJaWYgKHBrdF9kZXYtPm5yX2xhYmVscykKLQkJcHJvdG9jb2wgPSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX01QTFNfVUMpOworCQlwcm90b2NvbCA9IGh0b25zKEVUSF9QX01QTFNfVUMpOwogCiAJaWYgKHBrdF9kZXYtPnZsYW5faWQgIT0gMHhmZmZmKQotCQlwcm90b2NvbCA9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfODAyMVEpOworCQlwcm90b2NvbCA9IGh0b25zKEVUSF9QXzgwMjFRKTsKIAogCS8qIFVwZGF0ZSBhbnkgb2YgdGhlIHZhbHVlcywgdXNlZCB3aGVuIHdlJ3JlIGluY3JlbWVudGluZyB2YXJpb3VzCiAJICogZmllbGRzLgpAQCAtMjY5MCwyNCArMjY4MCwyOCBAQAogCQltcGxzX3B1c2gobXBscywgcGt0X2Rldik7CiAKIAlpZiAocGt0X2Rldi0+dmxhbl9pZCAhPSAweGZmZmYpIHsKLQkJaWYocGt0X2Rldi0+c3ZsYW5faWQgIT0gMHhmZmZmKSB7CisJCWlmIChwa3RfZGV2LT5zdmxhbl9pZCAhPSAweGZmZmYpIHsKIAkJCXN2bGFuX3RjaSA9IChfX2JlMTYgKilza2JfcHV0KHNrYiwgc2l6ZW9mKF9fYmUxNikpOwogCQkJKnN2bGFuX3RjaSA9IGJ1aWxkX3RjaShwa3RfZGV2LT5zdmxhbl9pZCwKIAkJCQkJICAgICAgIHBrdF9kZXYtPnN2bGFuX2NmaSwKIAkJCQkJICAgICAgIHBrdF9kZXYtPnN2bGFuX3ApOwogCQkJc3ZsYW5fZW5jYXBzdWxhdGVkX3Byb3RvID0gKF9fYmUxNiAqKXNrYl9wdXQoc2tiLCBzaXplb2YoX19iZTE2KSk7Ci0JCQkqc3ZsYW5fZW5jYXBzdWxhdGVkX3Byb3RvID0gX19jb25zdGFudF9odG9ucyhFVEhfUF84MDIxUSk7CisJCQkqc3ZsYW5fZW5jYXBzdWxhdGVkX3Byb3RvID0gaHRvbnMoRVRIX1BfODAyMVEpOwogCQl9CiAJCXZsYW5fdGNpID0gKF9fYmUxNiAqKXNrYl9wdXQoc2tiLCBzaXplb2YoX19iZTE2KSk7CiAJCSp2bGFuX3RjaSA9IGJ1aWxkX3RjaShwa3RfZGV2LT52bGFuX2lkLAogCQkJCSAgICAgIHBrdF9kZXYtPnZsYW5fY2ZpLAogCQkJCSAgICAgIHBrdF9kZXYtPnZsYW5fcCk7CiAJCXZsYW5fZW5jYXBzdWxhdGVkX3Byb3RvID0gKF9fYmUxNiAqKXNrYl9wdXQoc2tiLCBzaXplb2YoX19iZTE2KSk7Ci0JCSp2bGFuX2VuY2Fwc3VsYXRlZF9wcm90byA9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfSVBWNik7CisJCSp2bGFuX2VuY2Fwc3VsYXRlZF9wcm90byA9IGh0b25zKEVUSF9QX0lQVjYpOwogCX0KIAotCWlwaCA9IChzdHJ1Y3QgaXB2NmhkciAqKXNrYl9wdXQoc2tiLCBzaXplb2Yoc3RydWN0IGlwdjZoZHIpKTsKLQl1ZHBoID0gKHN0cnVjdCB1ZHBoZHIgKilza2JfcHV0KHNrYiwgc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpKTsKKwlza2ItPm5ldHdvcmtfaGVhZGVyID0gc2tiLT50YWlsOworCXNrYi0+dHJhbnNwb3J0X2hlYWRlciA9IHNrYi0+bmV0d29ya19oZWFkZXIgKyBzaXplb2Yoc3RydWN0IGlwdjZoZHIpOworCXNrYl9wdXQoc2tiLCBzaXplb2Yoc3RydWN0IGlwdjZoZHIpICsgc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpKTsKKworCWlwaCA9IGlwdjZfaGRyKHNrYik7CisJdWRwaCA9IHVkcF9oZHIoc2tiKTsKIAogCW1lbWNweShldGgsIHBrdF9kZXYtPmhoLCAxMik7CiAJKihfX2JlMTYgKikgJiBldGhbMTJdID0gcHJvdG9jb2w7CkBAIC0yNzI5LDcgKzI3MjMsNyBAQAogCXVkcGgtPmxlbiA9IGh0b25zKGRhdGFsZW4gKyBzaXplb2Yoc3RydWN0IHVkcGhkcikpOwogCXVkcGgtPmNoZWNrID0gMDsJLyogTm8gY2hlY2tzdW0gKi8KIAotCSooX19iZTMyICopIGlwaCA9IF9fY29uc3RhbnRfaHRvbmwoMHg2MDAwMDAwMCk7CS8qIFZlcnNpb24gKyBmbG93ICovCisJKihfX2JlMzIgKikgaXBoID0gaHRvbmwoMHg2MDAwMDAwMCk7CS8qIFZlcnNpb24gKyBmbG93ICovCiAKIAlpZiAocGt0X2Rldi0+dHJhZmZpY19jbGFzcykgewogCQkvKiBWZXJzaW9uICsgdHJhZmZpYyBjbGFzcyArIGZsb3cgKDApICovCkBAIC0yNzQ0LDEzICsyNzM4LDEyIEBACiAJaXB2Nl9hZGRyX2NvcHkoJmlwaC0+ZGFkZHIsICZwa3RfZGV2LT5jdXJfaW42X2RhZGRyKTsKIAlpcHY2X2FkZHJfY29weSgmaXBoLT5zYWRkciwgJnBrdF9kZXYtPmN1cl9pbjZfc2FkZHIpOwogCi0Jc2tiLT5tYWMucmF3ID0gKCh1OCAqKSBpcGgpIC0gMTQgLSBwa3RfZGV2LT5ucl9sYWJlbHMqc2l6ZW9mKHUzMikgLQotCQlWTEFOX1RBR19TSVpFKHBrdF9kZXYpIC0gU1ZMQU5fVEFHX1NJWkUocGt0X2Rldik7CisJc2tiLT5tYWNfaGVhZGVyID0gKHNrYi0+bmV0d29ya19oZWFkZXIgLSBFVEhfSExFTiAtCisJCQkgICBwa3RfZGV2LT5ucl9sYWJlbHMgKiBzaXplb2YodTMyKSAtCisJCQkgICBWTEFOX1RBR19TSVpFKHBrdF9kZXYpIC0gU1ZMQU5fVEFHX1NJWkUocGt0X2RldikpOwogCXNrYi0+cHJvdG9jb2wgPSBwcm90b2NvbDsKIAlza2ItPmRldiA9IG9kZXY7CiAJc2tiLT5wa3RfdHlwZSA9IFBBQ0tFVF9IT1NUOwotCXNrYi0+bmguaXB2NmggPSBpcGg7Ci0Jc2tiLT5oLnVoID0gdWRwaDsKIAogCWlmIChwa3RfZGV2LT5uZnJhZ3MgPD0gMCkKIAkJcGdoID0gKHN0cnVjdCBwa3RnZW5faGRyICopc2tiX3B1dChza2IsIGRhdGFsZW4pOwpAQCAtMjg0OCw3ICsyODQxLDcgQEAKIAlzdHJ1Y3QgcGt0Z2VuX2RldiAqcGt0X2RldjsKIAlpbnQgc3RhcnRlZCA9IDA7CiAKLQlQR19ERUJVRyhwcmludGsoInBrdGdlbjogZW50ZXJpbmcgcGt0Z2VuX3J1bi4gJXBcbiIsIHQpKTsKKwlwcl9kZWJ1ZygicGt0Z2VuOiBlbnRlcmluZyBwa3RnZW5fcnVuLiAlcFxuIiwgdCk7CiAKIAlpZl9sb2NrKHQpOwogCWxpc3RfZm9yX2VhY2hfZW50cnkocGt0X2RldiwgJnQtPmlmX2xpc3QsIGxpc3QpIHsKQEAgLTI4ODAsNyArMjg3Myw3IEBACiB7CiAJc3RydWN0IHBrdGdlbl90aHJlYWQgKnQ7CiAKLQlQR19ERUJVRyhwcmludGsoInBrdGdlbjogZW50ZXJpbmcgcGt0Z2VuX3N0b3BfYWxsX3RocmVhZHNfaWZzLlxuIikpOworCXByX2RlYnVnKCJwa3RnZW46IGVudGVyaW5nIHBrdGdlbl9zdG9wX2FsbF90aHJlYWRzX2lmcy5cbiIpOwogCiAJbXV0ZXhfbG9jaygmcGt0Z2VuX3RocmVhZF9sb2NrKTsKIApAQCAtMjk0OCw3ICsyOTQxLDcgQEAKIHsKIAlzdHJ1Y3QgcGt0Z2VuX3RocmVhZCAqdDsKIAotCVBHX0RFQlVHKHByaW50aygicGt0Z2VuOiBlbnRlcmluZyBwa3RnZW5fcnVuX2FsbF90aHJlYWRzLlxuIikpOworCXByX2RlYnVnKCJwa3RnZW46IGVudGVyaW5nIHBrdGdlbl9ydW5fYWxsX3RocmVhZHMuXG4iKTsKIAogCW11dGV4X2xvY2soJnBrdGdlbl90aHJlYWRfbG9jayk7CiAKQEAgLTMwMDYsNyArMjk5OSw3IEBACiAKIAlpZiAoIXBrdF9kZXYtPnJ1bm5pbmcpIHsKIAkJcHJpbnRrKCJwa3RnZW46IGludGVyZmFjZTogJXMgaXMgYWxyZWFkeSBzdG9wcGVkXG4iLAotCQkgICAgICAgcGt0X2Rldi0+aWZuYW1lKTsKKwkJICAgICAgIHBrdF9kZXYtPm9kZXYtPm5hbWUpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTMwNDAsNyArMzAzMyw3IEBACiB7CiAJc3RydWN0IHBrdGdlbl9kZXYgKnBrdF9kZXY7CiAKLQlQR19ERUJVRyhwcmludGsoInBrdGdlbjogZW50ZXJpbmcgcGt0Z2VuX3N0b3BcbiIpKTsKKwlwcl9kZWJ1ZygicGt0Z2VuOiBlbnRlcmluZyBwa3RnZW5fc3RvcFxuIik7CiAKIAlpZl9sb2NrKHQpOwogCkBAIC0zMDY0LDcgKzMwNTcsNyBAQAogCXN0cnVjdCBsaXN0X2hlYWQgKnEsICpuOwogCXN0cnVjdCBwa3RnZW5fZGV2ICpjdXI7CiAKLQlQR19ERUJVRyhwcmludGsoInBrdGdlbjogZW50ZXJpbmcgcGt0Z2VuX3JlbV9vbmVfaWZcbiIpKTsKKwlwcl9kZWJ1ZygicGt0Z2VuOiBlbnRlcmluZyBwa3RnZW5fcmVtX29uZV9pZlxuIik7CiAKIAlpZl9sb2NrKHQpOwogCkBAIC0zMDkzLDcgKzMwODYsNyBAQAogCiAJLyogUmVtb3ZlIGFsbCBkZXZpY2VzLCBmcmVlIG1lbSAqLwogCi0JUEdfREVCVUcocHJpbnRrKCJwa3RnZW46IGVudGVyaW5nIHBrdGdlbl9yZW1fYWxsX2lmc1xuIikpOworCXByX2RlYnVnKCJwa3RnZW46IGVudGVyaW5nIHBrdGdlbl9yZW1fYWxsX2lmc1xuIik7CiAJaWZfbG9jayh0KTsKIAogCWxpc3RfZm9yX2VhY2hfc2FmZShxLCBuLCAmdC0+aWZfbGlzdCkgewpAQCAtMzI3Niw3ICszMjY5LDcgQEAKIAogCXQtPnBpZCA9IGN1cnJlbnQtPnBpZDsKIAotCVBHX0RFQlVHKHByaW50aygicGt0Z2VuOiBzdGFydGluZyBwa3RnZW4vJWQ6ICBwaWQ9JWRcbiIsIGNwdSwgY3VycmVudC0+cGlkKSk7CisJcHJfZGVidWcoInBrdGdlbjogc3RhcnRpbmcgcGt0Z2VuLyVkOiAgcGlkPSVkXG4iLCBjcHUsIGN1cnJlbnQtPnBpZCk7CiAKIAltYXhfYmVmb3JlX3NvZnRpcnEgPSB0LT5tYXhfYmVmb3JlX3NvZnRpcnE7CiAKQEAgLTMzMzksMTMgKzMzMzIsMTMgQEAKIAkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKIAl9CiAKLQlQR19ERUJVRyhwcmludGsoInBrdGdlbjogJXMgc3RvcHBpbmcgYWxsIGRldmljZVxuIiwgdC0+dHNrLT5jb21tKSk7CisJcHJfZGVidWcoInBrdGdlbjogJXMgc3RvcHBpbmcgYWxsIGRldmljZVxuIiwgdC0+dHNrLT5jb21tKTsKIAlwa3RnZW5fc3RvcCh0KTsKIAotCVBHX0RFQlVHKHByaW50aygicGt0Z2VuOiAlcyByZW1vdmluZyBhbGwgZGV2aWNlXG4iLCB0LT50c2stPmNvbW0pKTsKKwlwcl9kZWJ1ZygicGt0Z2VuOiAlcyByZW1vdmluZyBhbGwgZGV2aWNlXG4iLCB0LT50c2stPmNvbW0pOwogCXBrdGdlbl9yZW1fYWxsX2lmcyh0KTsKIAotCVBHX0RFQlVHKHByaW50aygicGt0Z2VuOiAlcyByZW1vdmluZyB0aHJlYWQuXG4iLCB0LT50c2stPmNvbW0pKTsKKwlwcl9kZWJ1ZygicGt0Z2VuOiAlcyByZW1vdmluZyB0aHJlYWQuXG4iLCB0LT50c2stPmNvbW0pOwogCXBrdGdlbl9yZW1fdGhyZWFkKHQpOwogCiAJcmV0dXJuIDA7CkBAIC0zMzU4LDEzICszMzUxLDEzIEBACiAJaWZfbG9jayh0KTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkocCwgJnQtPmlmX2xpc3QsIGxpc3QpCi0JCWlmIChzdHJuY21wKHAtPmlmbmFtZSwgaWZuYW1lLCBJRk5BTVNJWikgPT0gMCkgeworCQlpZiAoc3RybmNtcChwLT5vZGV2LT5uYW1lLCBpZm5hbWUsIElGTkFNU0laKSA9PSAwKSB7CiAJCQlwa3RfZGV2ID0gcDsKIAkJCWJyZWFrOwogCQl9CiAKIAlpZl91bmxvY2sodCk7Ci0JUEdfREVCVUcocHJpbnRrKCJwa3RnZW46IGZpbmRfZGV2KCVzKSByZXR1cm5pbmcgJXBcbiIsIGlmbmFtZSwgcGt0X2RldikpOworCXByX2RlYnVnKCJwa3RnZW46IGZpbmRfZGV2KCVzKSByZXR1cm5pbmcgJXBcbiIsIGlmbmFtZSwgcGt0X2Rldik7CiAJcmV0dXJuIHBrdF9kZXY7CiB9CiAKQEAgLTMzOTksNyArMzM5Miw3IEBACiBzdGF0aWMgaW50IHBrdGdlbl9hZGRfZGV2aWNlKHN0cnVjdCBwa3RnZW5fdGhyZWFkICp0LCBjb25zdCBjaGFyICppZm5hbWUpCiB7CiAJc3RydWN0IHBrdGdlbl9kZXYgKnBrdF9kZXY7Ci0Jc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwZTsKKwlpbnQgZXJyOwogCiAJLyogV2UgZG9uJ3QgYWxsb3cgYSBkZXZpY2UgdG8gYmUgb24gc2V2ZXJhbCB0aHJlYWRzICovCiAKQEAgLTM0NDEsMjkgKzM0MzQsMjggQEAKIAlwa3RfZGV2LT5zdmxhbl9jZmkgPSAwOwogCXBrdF9kZXYtPnN2bGFuX2lkID0gMHhmZmZmOwogCi0Jc3RybmNweShwa3RfZGV2LT5pZm5hbWUsIGlmbmFtZSwgSUZOQU1TSVopOworCWVyciA9IHBrdGdlbl9zZXR1cF9kZXYocGt0X2RldiwgaWZuYW1lKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDE7CiAKLQlpZiAoIXBrdGdlbl9zZXR1cF9kZXYocGt0X2RldikpIHsKLQkJcHJpbnRrKCJwa3RnZW46IEVSUk9SOiBwa3RnZW5fc2V0dXBfZGV2IGZhaWxlZC5cbiIpOwotCQlpZiAocGt0X2Rldi0+Zmxvd3MpCi0JCQl2ZnJlZShwa3RfZGV2LT5mbG93cyk7Ci0JCWtmcmVlKHBrdF9kZXYpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlwZSA9IGNyZWF0ZV9wcm9jX2VudHJ5KGlmbmFtZSwgMDYwMCwgcGdfcHJvY19kaXIpOwotCWlmICghcGUpIHsKKwlwa3RfZGV2LT5lbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KGlmbmFtZSwgMDYwMCwgcGdfcHJvY19kaXIpOworCWlmICghcGt0X2Rldi0+ZW50cnkpIHsKIAkJcHJpbnRrKCJwa3RnZW46IGNhbm5vdCBjcmVhdGUgJXMvJXMgcHJvY2ZzIGVudHJ5LlxuIiwKIAkJICAgICAgIFBHX1BST0NfRElSLCBpZm5hbWUpOwotCQlpZiAocGt0X2Rldi0+Zmxvd3MpCi0JCQl2ZnJlZShwa3RfZGV2LT5mbG93cyk7Ci0JCWtmcmVlKHBrdF9kZXYpOwotCQlyZXR1cm4gLUVJTlZBTDsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBvdXQyOwogCX0KLQlwZS0+cHJvY19mb3BzID0gJnBrdGdlbl9pZl9mb3BzOwotCXBlLT5kYXRhID0gcGt0X2RldjsKKwlwa3RfZGV2LT5lbnRyeS0+cHJvY19mb3BzID0gJnBrdGdlbl9pZl9mb3BzOworCXBrdF9kZXYtPmVudHJ5LT5kYXRhID0gcGt0X2RldjsKIAogCXJldHVybiBhZGRfZGV2X3RvX3RocmVhZCh0LCBwa3RfZGV2KTsKK291dDI6CisJZGV2X3B1dChwa3RfZGV2LT5vZGV2KTsKK291dDE6CisJaWYgKHBrdF9kZXYtPmZsb3dzKQorCQl2ZnJlZShwa3RfZGV2LT5mbG93cyk7CisJa2ZyZWUocGt0X2Rldik7CisJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIGludCBfX2luaXQgcGt0Z2VuX2NyZWF0ZV90aHJlYWQoaW50IGNwdSkKQEAgLTM1MzMsNyArMzUyNSw3IEBACiAJCQkJc3RydWN0IHBrdGdlbl9kZXYgKnBrdF9kZXYpCiB7CiAKLQlQR19ERUJVRyhwcmludGsoInBrdGdlbjogcmVtb3ZlX2RldmljZSBwa3RfZGV2PSVwXG4iLCBwa3RfZGV2KSk7CisJcHJfZGVidWcoInBrdGdlbjogcmVtb3ZlX2RldmljZSBwa3RfZGV2PSVwXG4iLCBwa3RfZGV2KTsKIAogCWlmIChwa3RfZGV2LT5ydW5uaW5nKSB7CiAJCXByaW50aygicGt0Z2VuOldBUk5JTkc6IHRyeWluZyB0byByZW1vdmUgYSBydW5uaW5nIGludGVyZmFjZSwgc3RvcHBpbmcgaXQgbm93LlxuIik7CkBAIC0zNTUxLDkgKzM1NDMsOCBAQAogCiAJX3JlbV9kZXZfZnJvbV9pZl9saXN0KHQsIHBrdF9kZXYpOwogCi0JLyogQ2xlYW4gdXAgcHJvYyBmaWxlIHN5c3RlbSAqLwotCi0JcmVtb3ZlX3Byb2NfZW50cnkocGt0X2Rldi0+aWZuYW1lLCBwZ19wcm9jX2Rpcik7CisJaWYgKHBrdF9kZXYtPmVudHJ5KQorCQlyZW1vdmVfcHJvY19lbnRyeShwa3RfZGV2LT5lbnRyeS0+bmFtZSwgcGdfcHJvY19kaXIpOwogCiAJaWYgKHBrdF9kZXYtPmZsb3dzKQogCQl2ZnJlZShwa3RfZGV2LT5mbG93cyk7CmRpZmYgLS1naXQgYS9uZXQvY29yZS9ydG5ldGxpbmsuYyBiL25ldC9jb3JlL3J0bmV0bGluay5jCmluZGV4IDMzZWE4ZWEuLmNlYzExMTEgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL3J0bmV0bGluay5jCisrKyBiL25ldC9jb3JlL3J0bmV0bGluay5jCkBAIC01MCwxMSArNTAsMTMgQEAKICNpbmNsdWRlIDxuZXQvc29jay5oPgogI2luY2x1ZGUgPG5ldC9wa3Rfc2NoZWQuaD4KICNpbmNsdWRlIDxuZXQvZmliX3J1bGVzLmg+Ci0jaW5jbHVkZSA8bmV0L25ldGxpbmsuaD4KLSNpZmRlZiBDT05GSUdfTkVUX1dJUkVMRVNTX1JUTkVUTElOSwotI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+Ci0jaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4KLSNlbmRpZgkvKiBDT05GSUdfTkVUX1dJUkVMRVNTX1JUTkVUTElOSyAqLworI2luY2x1ZGUgPG5ldC9ydG5ldGxpbmsuaD4KKworc3RydWN0IHJ0bmxfbGluaworeworCXJ0bmxfZG9pdF9mdW5jCQlkb2l0OworCXJ0bmxfZHVtcGl0X2Z1bmMJZHVtcGl0OworfTsKIAogc3RhdGljIERFRklORV9NVVRFWChydG5sX211dGV4KTsKIHN0YXRpYyBzdHJ1Y3Qgc29jayAqcnRubDsKQEAgLTk1LDcgKzk3LDE1MSBAQAogCXJldHVybiAwOwogfQogCi1zdHJ1Y3QgcnRuZXRsaW5rX2xpbmsgKiBydG5ldGxpbmtfbGlua3NbTlBST1RPXTsKK3N0YXRpYyBzdHJ1Y3QgcnRubF9saW5rICpydG5sX21zZ19oYW5kbGVyc1tOUFJPVE9dOworCitzdGF0aWMgaW5saW5lIGludCBydG1fbXNnaW5kZXgoaW50IG1zZ3R5cGUpCit7CisJaW50IG1zZ2luZGV4ID0gbXNndHlwZSAtIFJUTV9CQVNFOworCisJLyoKKwkgKiBtc2dpbmRleCA8IDAgaW1wbGllcyBzb21lb25lIHRyaWVkIHRvIHJlZ2lzdGVyIGEgbmV0bGluaworCSAqIGNvbnRyb2wgY29kZS4gbXNnaW5kZXggPj0gUlRNX05SX01TR1RZUEVTIG1heSBpbmRpY2F0ZSB0aGF0CisJICogdGhlIG1lc3NhZ2UgdHlwZSBoYXMgbm90IGJlZW4gYWRkZWQgdG8gbGludXgvcnRuZXRsaW5rLmgKKwkgKi8KKwlCVUdfT04obXNnaW5kZXggPCAwIHx8IG1zZ2luZGV4ID49IFJUTV9OUl9NU0dUWVBFUyk7CisKKwlyZXR1cm4gbXNnaW5kZXg7Cit9CisKK3N0YXRpYyBydG5sX2RvaXRfZnVuYyBydG5sX2dldF9kb2l0KGludCBwcm90b2NvbCwgaW50IG1zZ2luZGV4KQoreworCXN0cnVjdCBydG5sX2xpbmsgKnRhYjsKKworCXRhYiA9IHJ0bmxfbXNnX2hhbmRsZXJzW3Byb3RvY29sXTsKKwlpZiAodGFiID09IE5VTEwgfHwgdGFiW21zZ2luZGV4XS5kb2l0ID09IE5VTEwpCisJCXRhYiA9IHJ0bmxfbXNnX2hhbmRsZXJzW1BGX1VOU1BFQ107CisKKwlyZXR1cm4gdGFiID8gdGFiW21zZ2luZGV4XS5kb2l0IDogTlVMTDsKK30KKworc3RhdGljIHJ0bmxfZHVtcGl0X2Z1bmMgcnRubF9nZXRfZHVtcGl0KGludCBwcm90b2NvbCwgaW50IG1zZ2luZGV4KQoreworCXN0cnVjdCBydG5sX2xpbmsgKnRhYjsKKworCXRhYiA9IHJ0bmxfbXNnX2hhbmRsZXJzW3Byb3RvY29sXTsKKwlpZiAodGFiID09IE5VTEwgfHwgdGFiW21zZ2luZGV4XS5kdW1waXQgPT0gTlVMTCkKKwkJdGFiID0gcnRubF9tc2dfaGFuZGxlcnNbUEZfVU5TUEVDXTsKKworCXJldHVybiB0YWIgPyB0YWJbbXNnaW5kZXhdLmR1bXBpdCA6IE5VTEw7Cit9CisKKy8qKgorICogX19ydG5sX3JlZ2lzdGVyIC0gUmVnaXN0ZXIgYSBydG5ldGxpbmsgbWVzc2FnZSB0eXBlCisgKiBAcHJvdG9jb2w6IFByb3RvY29sIGZhbWlseSBvciBQRl9VTlNQRUMKKyAqIEBtc2d0eXBlOiBydG5ldGxpbmsgbWVzc2FnZSB0eXBlCisgKiBAZG9pdDogRnVuY3Rpb24gcG9pbnRlciBjYWxsZWQgZm9yIGVhY2ggcmVxdWVzdCBtZXNzYWdlCisgKiBAZHVtcGl0OiBGdW5jdGlvbiBwb2ludGVyIGNhbGxlZCBmb3IgZWFjaCBkdW1wIHJlcXVlc3QgKE5MTV9GX0RVTVApIG1lc3NhZ2UKKyAqCisgKiBSZWdpc3RlcnMgdGhlIHNwZWNpZmllZCBmdW5jdGlvbiBwb2ludGVycyAoYXQgbGVhc3Qgb25lIG9mIHRoZW0gaGFzCisgKiB0byBiZSBub24tTlVMTCkgdG8gYmUgY2FsbGVkIHdoZW5ldmVyIGEgcmVxdWVzdCBtZXNzYWdlIGZvciB0aGUKKyAqIHNwZWNpZmllZCBwcm90b2NvbCBmYW1pbHkgYW5kIG1lc3NhZ2UgdHlwZSBpcyByZWNlaXZlZC4KKyAqCisgKiBUaGUgc3BlY2lhbCBwcm90b2NvbCBmYW1pbHkgUEZfVU5TUEVDIG1heSBiZSB1c2VkIHRvIGRlZmluZSBmYWxsYmFjaworICogZnVuY3Rpb24gcG9pbnRlcnMgZm9yIHRoZSBjYXNlIHdoZW4gbm8gZW50cnkgZm9yIHRoZSBzcGVjaWZpYyBwcm90b2NvbAorICogZmFtaWx5IGV4aXN0cy4KKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgKi8KK2ludCBfX3J0bmxfcmVnaXN0ZXIoaW50IHByb3RvY29sLCBpbnQgbXNndHlwZSwKKwkJICAgIHJ0bmxfZG9pdF9mdW5jIGRvaXQsIHJ0bmxfZHVtcGl0X2Z1bmMgZHVtcGl0KQoreworCXN0cnVjdCBydG5sX2xpbmsgKnRhYjsKKwlpbnQgbXNnaW5kZXg7CisKKwlCVUdfT04ocHJvdG9jb2wgPCAwIHx8IHByb3RvY29sID49IE5QUk9UTyk7CisJbXNnaW5kZXggPSBydG1fbXNnaW5kZXgobXNndHlwZSk7CisKKwl0YWIgPSBydG5sX21zZ19oYW5kbGVyc1twcm90b2NvbF07CisJaWYgKHRhYiA9PSBOVUxMKSB7CisJCXRhYiA9IGtjYWxsb2MoUlRNX05SX01TR1RZUEVTLCBzaXplb2YoKnRhYiksIEdGUF9LRVJORUwpOworCQlpZiAodGFiID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT0JVRlM7CisKKwkJcnRubF9tc2dfaGFuZGxlcnNbcHJvdG9jb2xdID0gdGFiOworCX0KKworCWlmIChkb2l0KQorCQl0YWJbbXNnaW5kZXhdLmRvaXQgPSBkb2l0OworCisJaWYgKGR1bXBpdCkKKwkJdGFiW21zZ2luZGV4XS5kdW1waXQgPSBkdW1waXQ7CisKKwlyZXR1cm4gMDsKK30KKworRVhQT1JUX1NZTUJPTF9HUEwoX19ydG5sX3JlZ2lzdGVyKTsKKworLyoqCisgKiBydG5sX3JlZ2lzdGVyIC0gUmVnaXN0ZXIgYSBydG5ldGxpbmsgbWVzc2FnZSB0eXBlCisgKgorICogSWRlbnRpY2FsIHRvIF9fcnRubF9yZWdpc3RlcigpIGJ1dCBwYW5pY3Mgb24gZmFpbHVyZS4gVGhpcyBpcyB1c2VmdWwKKyAqIGFzIGZhaWx1cmUgb2YgdGhpcyBmdW5jdGlvbiBpcyB2ZXJ5IHVubGlrZWx5LCBpdCBjYW4gb25seSBoYXBwZW4gZHVlCisgKiB0byBsYWNrIG9mIG1lbW9yeSB3aGVuIGFsbG9jYXRpbmcgdGhlIGNoYWluIHRvIHN0b3JlIGFsbCBtZXNzYWdlCisgKiBoYW5kbGVycyBmb3IgYSBwcm90b2NvbC4gTWVhbnQgZm9yIHVzZSBpbiBpbml0IGZ1bmN0aW9ucyB3aGVyZSBsYWNrCisgKiBvZiBtZW1vcnkgaW1wbGllcyBubyBzZW5zZSBpbiBjb250aW51ZWluZy4KKyAqLwordm9pZCBydG5sX3JlZ2lzdGVyKGludCBwcm90b2NvbCwgaW50IG1zZ3R5cGUsCisJCSAgIHJ0bmxfZG9pdF9mdW5jIGRvaXQsIHJ0bmxfZHVtcGl0X2Z1bmMgZHVtcGl0KQoreworCWlmIChfX3J0bmxfcmVnaXN0ZXIocHJvdG9jb2wsIG1zZ3R5cGUsIGRvaXQsIGR1bXBpdCkgPCAwKQorCQlwYW5pYygiVW5hYmxlIHRvIHJlZ2lzdGVyIHJ0bmV0bGluayBtZXNzYWdlIGhhbmRsZXIsICIKKwkJICAgICAgInByb3RvY29sID0gJWQsIG1lc3NhZ2UgdHlwZSA9ICVkXG4iLAorCQkgICAgICBwcm90b2NvbCwgbXNndHlwZSk7Cit9CisKK0VYUE9SVF9TWU1CT0xfR1BMKHJ0bmxfcmVnaXN0ZXIpOworCisvKioKKyAqIHJ0bmxfdW5yZWdpc3RlciAtIFVucmVnaXN0ZXIgYSBydG5ldGxpbmsgbWVzc2FnZSB0eXBlCisgKiBAcHJvdG9jb2w6IFByb3RvY29sIGZhbWlseSBvciBQRl9VTlNQRUMKKyAqIEBtc2d0eXBlOiBydG5ldGxpbmsgbWVzc2FnZSB0eXBlCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICovCitpbnQgcnRubF91bnJlZ2lzdGVyKGludCBwcm90b2NvbCwgaW50IG1zZ3R5cGUpCit7CisJaW50IG1zZ2luZGV4OworCisJQlVHX09OKHByb3RvY29sIDwgMCB8fCBwcm90b2NvbCA+PSBOUFJPVE8pOworCW1zZ2luZGV4ID0gcnRtX21zZ2luZGV4KG1zZ3R5cGUpOworCisJaWYgKHJ0bmxfbXNnX2hhbmRsZXJzW3Byb3RvY29sXSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCXJ0bmxfbXNnX2hhbmRsZXJzW3Byb3RvY29sXVttc2dpbmRleF0uZG9pdCA9IE5VTEw7CisJcnRubF9tc2dfaGFuZGxlcnNbcHJvdG9jb2xdW21zZ2luZGV4XS5kdW1waXQgPSBOVUxMOworCisJcmV0dXJuIDA7Cit9CisKK0VYUE9SVF9TWU1CT0xfR1BMKHJ0bmxfdW5yZWdpc3Rlcik7CisKKy8qKgorICogcnRubF91bnJlZ2lzdGVyX2FsbCAtIFVucmVnaXN0ZXIgYWxsIHJ0bmV0bGluayBtZXNzYWdlIHR5cGUgb2YgYSBwcm90b2NvbAorICogQHByb3RvY29sIDogUHJvdG9jb2wgZmFtaWx5IG9yIFBGX1VOU1BFQworICoKKyAqIElkZW50aWNhbCB0byBjYWxsaW5nIHJ0bmxfdW5yZWdzdGVyKCkgZm9yIGFsbCByZWdpc3RlcmVkIG1lc3NhZ2UgdHlwZXMKKyAqIG9mIGEgY2VydGFpbiBwcm90b2NvbCBmYW1pbHkuCisgKi8KK3ZvaWQgcnRubF91bnJlZ2lzdGVyX2FsbChpbnQgcHJvdG9jb2wpCit7CisJQlVHX09OKHByb3RvY29sIDwgMCB8fCBwcm90b2NvbCA+PSBOUFJPVE8pOworCisJa2ZyZWUocnRubF9tc2dfaGFuZGxlcnNbcHJvdG9jb2xdKTsKKwlydG5sX21zZ19oYW5kbGVyc1twcm90b2NvbF0gPSBOVUxMOworfQorCitFWFBPUlRfU1lNQk9MX0dQTChydG5sX3VucmVnaXN0ZXJfYWxsKTsKIAogc3RhdGljIGNvbnN0IGludCBydG1fbWluW1JUTV9OUl9GQU1JTElFU10gPQogewpAQCAtMjQ5LDcgKzM5NSw3IEBACiAJCSAgICBvcGVyc3RhdGUgPT0gSUZfT1BFUl9VTktOT1dOKQogCQkJb3BlcnN0YXRlID0gSUZfT1BFUl9ET1JNQU5UOwogCQlicmVhazsKLQl9OworCX0KIAogCWlmIChkZXYtPm9wZXJzdGF0ZSAhPSBvcGVyc3RhdGUpIHsKIAkJd3JpdGVfbG9ja19iaCgmZGV2X2Jhc2VfbG9jayk7CkBAIC0zOTMsNyArNTM5LDYgQEAKIAlpbnQgc19pZHggPSBjYi0+YXJnc1swXTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwogCi0JcmVhZF9sb2NrKCZkZXZfYmFzZV9sb2NrKTsKIAlmb3IgKGRldj1kZXZfYmFzZSwgaWR4PTA7IGRldjsgZGV2ID0gZGV2LT5uZXh0LCBpZHgrKykgewogCQlpZiAoaWR4IDwgc19pZHgpCiAJCQljb250aW51ZTsKQEAgLTQwMiw3ICs1NDcsNiBAQAogCQkJCSAgICAgY2ItPm5saC0+bmxtc2dfc2VxLCAwLCBOTE1fRl9NVUxUSSkgPD0gMCkKIAkJCWJyZWFrOwogCX0KLQlyZWFkX3VubG9jaygmZGV2X2Jhc2VfbG9jayk7CiAJY2ItPmFyZ3NbMF0gPSBpZHg7CiAKIAlyZXR1cm4gc2tiLT5sZW47CkBAIC01MzYsMTcgKzY4MCw2IEBACiAJCW1vZGlmaWVkID0gMTsKIAl9CiAKLSNpZmRlZiBDT05GSUdfTkVUX1dJUkVMRVNTX1JUTkVUTElOSwotCWlmICh0YltJRkxBX1dJUkVMRVNTXSkgewotCQkvKiBDYWxsIFdpcmVsZXNzIEV4dGVuc2lvbnMuCi0JCSAqIFZhcmlvdXMgc3R1ZmYgY2hlY2tlZCBpbiB0aGVyZS4uLiAqLwotCQllcnIgPSB3aXJlbGVzc19ydG5ldGxpbmtfc2V0KGRldiwgbmxhX2RhdGEodGJbSUZMQV9XSVJFTEVTU10pLAotCQkJCQkgICAgIG5sYV9sZW4odGJbSUZMQV9XSVJFTEVTU10pKTsKLQkJaWYgKGVyciA8IDApCi0JCQlnb3RvIGVycm91dF9kZXY7Ci0JfQotI2VuZGlmCS8qIENPTkZJR19ORVRfV0lSRUxFU1NfUlRORVRMSU5LICovCi0KIAlpZiAodGJbSUZMQV9CUk9BRENBU1RdKSB7CiAJCW5sYV9tZW1jcHkoZGV2LT5icm9hZGNhc3QsIHRiW0lGTEFfQlJPQURDQVNUXSwgZGV2LT5hZGRyX2xlbik7CiAJCXNlbmRfYWRkcl9ub3RpZnkgPSAxOwpAQCAtNjEwLDIyICs3NDMsNiBAQAogCX0gZWxzZQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCi0jaWZkZWYgQ09ORklHX05FVF9XSVJFTEVTU19SVE5FVExJTksKLQlpZiAodGJbSUZMQV9XSVJFTEVTU10pIHsKLQkJLyogQ2FsbCBXaXJlbGVzcyBFeHRlbnNpb25zLiBXZSBuZWVkIHRvIGtub3cgdGhlIHNpemUgYmVmb3JlCi0JCSAqIHdlIGNhbiBhbGxvYy4gVmFyaW91cyBzdHVmZiBjaGVja2VkIGluIHRoZXJlLi4uICovCi0JCWVyciA9IHdpcmVsZXNzX3J0bmV0bGlua19nZXQoZGV2LCBubGFfZGF0YSh0YltJRkxBX1dJUkVMRVNTXSksCi0JCQkJCSAgICAgbmxhX2xlbih0YltJRkxBX1dJUkVMRVNTXSksCi0JCQkJCSAgICAgJml3X2J1ZiwgJml3X2J1Zl9sZW4pOwotCQlpZiAoZXJyIDwgMCkKLQkJCWdvdG8gZXJyb3V0OwotCi0JCS8qIFBheWxvYWQgaXMgYXQgYW4gb2Zmc2V0IGluIGJ1ZmZlciAqLwotCQlpdyA9IGl3X2J1ZiArIElXX0VWX1BPSU5UX09GRjsKLQl9Ci0jZW5kaWYJLyogQ09ORklHX05FVF9XSVJFTEVTU19SVE5FVExJTksgKi8KLQogCW5za2IgPSBubG1zZ19uZXcoaWZfbmxtc2dfc2l6ZShpd19idWZfbGVuKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKG5za2IgPT0gTlVMTCkgewogCQllcnIgPSAtRU5PQlVGUzsKQEAgLTY1OSwxMiArNzc2LDEyIEBACiAJCWludCB0eXBlID0gY2ItPm5saC0+bmxtc2dfdHlwZS1SVE1fQkFTRTsKIAkJaWYgKGlkeCA8IHNfaWR4IHx8IGlkeCA9PSBQRl9QQUNLRVQpCiAJCQljb250aW51ZTsKLQkJaWYgKHJ0bmV0bGlua19saW5rc1tpZHhdID09IE5VTEwgfHwKLQkJICAgIHJ0bmV0bGlua19saW5rc1tpZHhdW3R5cGVdLmR1bXBpdCA9PSBOVUxMKQorCQlpZiAocnRubF9tc2dfaGFuZGxlcnNbaWR4XSA9PSBOVUxMIHx8CisJCSAgICBydG5sX21zZ19oYW5kbGVyc1tpZHhdW3R5cGVdLmR1bXBpdCA9PSBOVUxMKQogCQkJY29udGludWU7CiAJCWlmIChpZHggPiBzX2lkeCkKIAkJCW1lbXNldCgmY2ItPmFyZ3NbMF0sIDAsIHNpemVvZihjYi0+YXJncykpOwotCQlpZiAocnRuZXRsaW5rX2xpbmtzW2lkeF1bdHlwZV0uZHVtcGl0KHNrYiwgY2IpKQorCQlpZiAocnRubF9tc2dfaGFuZGxlcnNbaWR4XVt0eXBlXS5kdW1waXQoc2tiLCBjYikpCiAJCQlicmVhazsKIAl9CiAJY2ItPmZhbWlseSA9IGlkeDsKQEAgLTcwMCwzMCArODE3LDE4IEBACiAKIC8qIFByb2Nlc3Mgb25lIHJ0bmV0bGluayBtZXNzYWdlLiAqLwogCi1zdGF0aWMgX19pbmxpbmVfXyBpbnQKLXJ0bmV0bGlua19yY3ZfbXNnKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBubG1zZ2hkciAqbmxoLCBpbnQgKmVycnApCitzdGF0aWMgaW50IHJ0bmV0bGlua19yY3ZfbXNnKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBubG1zZ2hkciAqbmxoKQogewotCXN0cnVjdCBydG5ldGxpbmtfbGluayAqbGluazsKLQlzdHJ1Y3QgcnRuZXRsaW5rX2xpbmsgKmxpbmtfdGFiOworCXJ0bmxfZG9pdF9mdW5jIGRvaXQ7CiAJaW50IHN6X2lkeCwga2luZDsKIAlpbnQgbWluX2xlbjsKIAlpbnQgZmFtaWx5OwogCWludCB0eXBlOwogCWludCBlcnI7CiAKLQkvKiBPbmx5IHJlcXVlc3RzIGFyZSBoYW5kbGVkIGJ5IGtlcm5lbCBub3cgKi8KLQlpZiAoIShubGgtPm5sbXNnX2ZsYWdzJk5MTV9GX1JFUVVFU1QpKQotCQlyZXR1cm4gMDsKLQogCXR5cGUgPSBubGgtPm5sbXNnX3R5cGU7Ci0KLQkvKiBBIGNvbnRyb2wgbWVzc2FnZTogaWdub3JlIHRoZW0gKi8KLQlpZiAodHlwZSA8IFJUTV9CQVNFKQotCQlyZXR1cm4gMDsKLQotCS8qIFVua25vd24gbWVzc2FnZTogcmVwbHkgd2l0aCBFSU5WQUwgKi8KIAlpZiAodHlwZSA+IFJUTV9NQVgpCi0JCWdvdG8gZXJyX2ludmFsOworCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKIAl0eXBlIC09IFJUTV9CQVNFOwogCkBAIC03MzIsNDUgKzgzNywzMyBAQAogCQlyZXR1cm4gMDsKIAogCWZhbWlseSA9ICgoc3RydWN0IHJ0Z2VubXNnKilOTE1TR19EQVRBKG5saCkpLT5ydGdlbl9mYW1pbHk7Ci0JaWYgKGZhbWlseSA+PSBOUFJPVE8pIHsKLQkJKmVycnAgPSAtRUFGTk9TVVBQT1JUOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JbGlua190YWIgPSBydG5ldGxpbmtfbGlua3NbZmFtaWx5XTsKLQlpZiAobGlua190YWIgPT0gTlVMTCkKLQkJbGlua190YWIgPSBydG5ldGxpbmtfbGlua3NbUEZfVU5TUEVDXTsKLQlsaW5rID0gJmxpbmtfdGFiW3R5cGVdOworCWlmIChmYW1pbHkgPj0gTlBST1RPKQorCQlyZXR1cm4gLUVBRk5PU1VQUE9SVDsKIAogCXN6X2lkeCA9IHR5cGU+PjI7CiAJa2luZCA9IHR5cGUmMzsKIAotCWlmIChraW5kICE9IDIgJiYgc2VjdXJpdHlfbmV0bGlua19yZWN2KHNrYiwgQ0FQX05FVF9BRE1JTikpIHsKLQkJKmVycnAgPSAtRVBFUk07Ci0JCXJldHVybiAtMTsKLQl9CisJaWYgKGtpbmQgIT0gMiAmJiBzZWN1cml0eV9uZXRsaW5rX3JlY3Yoc2tiLCBDQVBfTkVUX0FETUlOKSkKKwkJcmV0dXJuIC1FUEVSTTsKIAogCWlmIChraW5kID09IDIgJiYgbmxoLT5ubG1zZ19mbGFncyZOTE1fRl9EVU1QKSB7Ci0JCWlmIChsaW5rLT5kdW1waXQgPT0gTlVMTCkKLQkJCWxpbmsgPSAmKHJ0bmV0bGlua19saW5rc1tQRl9VTlNQRUNdW3R5cGVdKTsKKwkJcnRubF9kdW1waXRfZnVuYyBkdW1waXQ7CiAKLQkJaWYgKGxpbmstPmR1bXBpdCA9PSBOVUxMKQotCQkJZ290byBlcnJfaW52YWw7CisJCWR1bXBpdCA9IHJ0bmxfZ2V0X2R1bXBpdChmYW1pbHksIHR5cGUpOworCQlpZiAoZHVtcGl0ID09IE5VTEwpCisJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKLQkJaWYgKCgqZXJycCA9IG5ldGxpbmtfZHVtcF9zdGFydChydG5sLCBza2IsIG5saCwKLQkJCQkJCWxpbmstPmR1bXBpdCwgTlVMTCkpICE9IDApIHsKLQkJCXJldHVybiAtMTsKLQkJfQotCi0JCW5ldGxpbmtfcXVldWVfc2tpcChubGgsIHNrYik7Ci0JCXJldHVybiAtMTsKKwkJX19ydG5sX3VubG9jaygpOworCQllcnIgPSBuZXRsaW5rX2R1bXBfc3RhcnQocnRubCwgc2tiLCBubGgsIGR1bXBpdCwgTlVMTCk7CisJCXJ0bmxfbG9jaygpOworCQlyZXR1cm4gZXJyOwogCX0KIAogCW1lbXNldChydGFfYnVmLCAwLCAocnRhdHRyX21heCAqIHNpemVvZihzdHJ1Y3QgcnRhdHRyICopKSk7CiAKIAltaW5fbGVuID0gcnRtX21pbltzel9pZHhdOwogCWlmIChubGgtPm5sbXNnX2xlbiA8IG1pbl9sZW4pCi0JCWdvdG8gZXJyX2ludmFsOworCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmIChubGgtPm5sbXNnX2xlbiA+IG1pbl9sZW4pIHsKIAkJaW50IGF0dHJsZW4gPSBubGgtPm5sbXNnX2xlbiAtIE5MTVNHX0FMSUdOKG1pbl9sZW4pOwpAQCAtNzgwLDI1ICs4NzMsMTggQEAKIAkJCXVuc2lnbmVkIGZsYXZvciA9IGF0dHItPnJ0YV90eXBlOwogCQkJaWYgKGZsYXZvcikgewogCQkJCWlmIChmbGF2b3IgPiBydGFfbWF4W3N6X2lkeF0pCi0JCQkJCWdvdG8gZXJyX2ludmFsOworCQkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCQlydGFfYnVmW2ZsYXZvci0xXSA9IGF0dHI7CiAJCQl9CiAJCQlhdHRyID0gUlRBX05FWFQoYXR0ciwgYXR0cmxlbik7CiAJCX0KIAl9CiAKLQlpZiAobGluay0+ZG9pdCA9PSBOVUxMKQotCQlsaW5rID0gJihydG5ldGxpbmtfbGlua3NbUEZfVU5TUEVDXVt0eXBlXSk7Ci0JaWYgKGxpbmstPmRvaXQgPT0gTlVMTCkKLQkJZ290byBlcnJfaW52YWw7Ci0JZXJyID0gbGluay0+ZG9pdChza2IsIG5saCwgKHZvaWQgKikmcnRhX2J1ZlswXSk7CisJZG9pdCA9IHJ0bmxfZ2V0X2RvaXQoZmFtaWx5LCB0eXBlKTsKKwlpZiAoZG9pdCA9PSBOVUxMKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKLQkqZXJycCA9IGVycjsKLQlyZXR1cm4gZXJyOwotCi1lcnJfaW52YWw6Ci0JKmVycnAgPSAtRUlOVkFMOwotCXJldHVybiAtMTsKKwlyZXR1cm4gZG9pdChza2IsIG5saCwgKHZvaWQgKikmcnRhX2J1ZlswXSk7CiB9CiAKIHN0YXRpYyB2b2lkIHJ0bmV0bGlua19yY3Yoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGVuKQpAQCAtODE0LDI1ICs5MDAsNiBAQAogCX0gd2hpbGUgKHFsZW4pOwogfQogCi1zdGF0aWMgc3RydWN0IHJ0bmV0bGlua19saW5rIGxpbmtfcnRuZXRsaW5rX3RhYmxlW1JUTV9OUl9NU0dUWVBFU10gPQotewotCVtSVE1fR0VUTElOSyAgICAgLSBSVE1fQkFTRV0gPSB7IC5kb2l0ICAgPSBydG5sX2dldGxpbmssCi0JCQkJCSAuZHVtcGl0ID0gcnRubF9kdW1wX2lmaW5mbwkgfSwKLQlbUlRNX1NFVExJTksgICAgIC0gUlRNX0JBU0VdID0geyAuZG9pdCAgID0gcnRubF9zZXRsaW5rCQkgfSwKLQlbUlRNX0dFVEFERFIgICAgIC0gUlRNX0JBU0VdID0geyAuZHVtcGl0ID0gcnRubF9kdW1wX2FsbAkgfSwKLQlbUlRNX0dFVFJPVVRFICAgIC0gUlRNX0JBU0VdID0geyAuZHVtcGl0ID0gcnRubF9kdW1wX2FsbAkgfSwKLQlbUlRNX05FV05FSUdIICAgIC0gUlRNX0JBU0VdID0geyAuZG9pdCAgID0gbmVpZ2hfYWRkCQkgfSwKLQlbUlRNX0RFTE5FSUdIICAgIC0gUlRNX0JBU0VdID0geyAuZG9pdCAgID0gbmVpZ2hfZGVsZXRlCQkgfSwKLQlbUlRNX0dFVE5FSUdIICAgIC0gUlRNX0JBU0VdID0geyAuZHVtcGl0ID0gbmVpZ2hfZHVtcF9pbmZvCSB9LAotI2lmZGVmIENPTkZJR19GSUJfUlVMRVMKLQlbUlRNX05FV1JVTEUgICAgIC0gUlRNX0JBU0VdID0geyAuZG9pdCAgID0gZmliX25sX25ld3J1bGUJIH0sCi0JW1JUTV9ERUxSVUxFICAgICAtIFJUTV9CQVNFXSA9IHsgLmRvaXQgICA9IGZpYl9ubF9kZWxydWxlCSB9LAotI2VuZGlmCi0JW1JUTV9HRVRSVUxFICAgICAtIFJUTV9CQVNFXSA9IHsgLmR1bXBpdCA9IHJ0bmxfZHVtcF9hbGwJIH0sCi0JW1JUTV9HRVRORUlHSFRCTCAtIFJUTV9CQVNFXSA9IHsgLmR1bXBpdCA9IG5laWdodGJsX2R1bXBfaW5mbwkgfSwKLQlbUlRNX1NFVE5FSUdIVEJMIC0gUlRNX0JBU0VdID0geyAuZG9pdCAgID0gbmVpZ2h0Ymxfc2V0CQkgfSwKLX07Ci0KIHN0YXRpYyBpbnQgcnRuZXRsaW5rX2V2ZW50KHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcywgdW5zaWduZWQgbG9uZyBldmVudCwgdm9pZCAqcHRyKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwdHI7CkBAIC04NzQsMTkgKzk0MSwyMiBAQAogCQlwYW5pYygicnRuZXRsaW5rX2luaXQ6IGNhbm5vdCBhbGxvY2F0ZSBydGFfYnVmXG4iKTsKIAogCXJ0bmwgPSBuZXRsaW5rX2tlcm5lbF9jcmVhdGUoTkVUTElOS19ST1VURSwgUlROTEdSUF9NQVgsIHJ0bmV0bGlua19yY3YsCi0JCQkJICAgICBUSElTX01PRFVMRSk7CisJCQkJICAgICAmcnRubF9tdXRleCwgVEhJU19NT0RVTEUpOwogCWlmIChydG5sID09IE5VTEwpCiAJCXBhbmljKCJydG5ldGxpbmtfaW5pdDogY2Fubm90IGluaXRpYWxpemUgcnRuZXRsaW5rXG4iKTsKIAluZXRsaW5rX3NldF9ub25yb290KE5FVExJTktfUk9VVEUsIE5MX05PTlJPT1RfUkVDVik7CiAJcmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZydG5ldGxpbmtfZGV2X25vdGlmaWVyKTsKLQlydG5ldGxpbmtfbGlua3NbUEZfVU5TUEVDXSA9IGxpbmtfcnRuZXRsaW5rX3RhYmxlOwotCXJ0bmV0bGlua19saW5rc1tQRl9QQUNLRVRdID0gbGlua19ydG5ldGxpbmtfdGFibGU7CisKKwlydG5sX3JlZ2lzdGVyKFBGX1VOU1BFQywgUlRNX0dFVExJTkssIHJ0bmxfZ2V0bGluaywgcnRubF9kdW1wX2lmaW5mbyk7CisJcnRubF9yZWdpc3RlcihQRl9VTlNQRUMsIFJUTV9TRVRMSU5LLCBydG5sX3NldGxpbmssIE5VTEwpOworCisJcnRubF9yZWdpc3RlcihQRl9VTlNQRUMsIFJUTV9HRVRBRERSLCBOVUxMLCBydG5sX2R1bXBfYWxsKTsKKwlydG5sX3JlZ2lzdGVyKFBGX1VOU1BFQywgUlRNX0dFVFJPVVRFLCBOVUxMLCBydG5sX2R1bXBfYWxsKTsKIH0KIAogRVhQT1JUX1NZTUJPTChfX3J0YV9maWxsKTsKIEVYUE9SVF9TWU1CT0wocnRhdHRyX3N0cmxjcHkpOwogRVhQT1JUX1NZTUJPTChydGF0dHJfcGFyc2UpOwotRVhQT1JUX1NZTUJPTChydG5ldGxpbmtfbGlua3MpOwogRVhQT1JUX1NZTUJPTChydG5ldGxpbmtfcHV0X21ldHJpY3MpOwogRVhQT1JUX1NZTUJPTChydG5sX2xvY2spOwogRVhQT1JUX1NZTUJPTChydG5sX3RyeWxvY2spOwpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvc2tidWZmLmMgYi9uZXQvY29yZS9za2J1ZmYuYwppbmRleCAzMzY5NThmLi4xNDIyNTczIDEwMDY0NAotLS0gYS9uZXQvY29yZS9za2J1ZmYuYworKysgYi9uZXQvY29yZS9za2J1ZmYuYwpAQCAtNTUsNiArNTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NhY2hlLmg+CiAjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CiAKICNpbmNsdWRlIDxuZXQvcHJvdG9jb2wuaD4KICNpbmNsdWRlIDxuZXQvZHN0Lmg+CkBAIC04Nyw4ICs4OCw5IEBACiB2b2lkIHNrYl9vdmVyX3BhbmljKHN0cnVjdCBza19idWZmICpza2IsIGludCBzeiwgdm9pZCAqaGVyZSkKIHsKIAlwcmludGsoS0VSTl9FTUVSRyAic2tiX292ZXJfcGFuaWM6IHRleHQ6JXAgbGVuOiVkIHB1dDolZCBoZWFkOiVwICIKLQkJCSAgImRhdGE6JXAgdGFpbDolcCBlbmQ6JXAgZGV2OiVzXG4iLAotCSAgICAgICBoZXJlLCBza2ItPmxlbiwgc3osIHNrYi0+aGVhZCwgc2tiLT5kYXRhLCBza2ItPnRhaWwsIHNrYi0+ZW5kLAorCQkJICAiZGF0YTolcCB0YWlsOiUjbHggZW5kOiUjbHggZGV2OiVzXG4iLAorCSAgICAgICBoZXJlLCBza2ItPmxlbiwgc3osIHNrYi0+aGVhZCwgc2tiLT5kYXRhLAorCSAgICAgICAodW5zaWduZWQgbG9uZylza2ItPnRhaWwsICh1bnNpZ25lZCBsb25nKXNrYi0+ZW5kLAogCSAgICAgICBza2ItPmRldiA/IHNrYi0+ZGV2LT5uYW1lIDogIjxOVUxMPiIpOwogCUJVRygpOwogfQpAQCAtMTA1LDggKzEwNyw5IEBACiB2b2lkIHNrYl91bmRlcl9wYW5pYyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgc3osIHZvaWQgKmhlcmUpCiB7CiAJcHJpbnRrKEtFUk5fRU1FUkcgInNrYl91bmRlcl9wYW5pYzogdGV4dDolcCBsZW46JWQgcHV0OiVkIGhlYWQ6JXAgIgotCQkJICAiZGF0YTolcCB0YWlsOiVwIGVuZDolcCBkZXY6JXNcbiIsCi0JICAgICAgIGhlcmUsIHNrYi0+bGVuLCBzeiwgc2tiLT5oZWFkLCBza2ItPmRhdGEsIHNrYi0+dGFpbCwgc2tiLT5lbmQsCisJCQkgICJkYXRhOiVwIHRhaWw6JSNseCBlbmQ6JSNseCBkZXY6JXNcbiIsCisJICAgICAgIGhlcmUsIHNrYi0+bGVuLCBzeiwgc2tiLT5oZWFkLCBza2ItPmRhdGEsCisJICAgICAgICh1bnNpZ25lZCBsb25nKXNrYi0+dGFpbCwgKHVuc2lnbmVkIGxvbmcpc2tiLT5lbmQsCiAJICAgICAgIHNrYi0+ZGV2ID8gc2tiLT5kZXYtPm5hbWUgOiAiPE5VTEw+Iik7CiAJQlVHKCk7CiB9CkBAIC0xNTUsMjAgKzE1OCwyMiBAQAogCWlmICghc2tiKQogCQlnb3RvIG91dDsKIAotCS8qIEdldCB0aGUgREFUQS4gU2l6ZSBtdXN0IG1hdGNoIHNrYl9hZGRfbXR1KCkuICovCiAJc2l6ZSA9IFNLQl9EQVRBX0FMSUdOKHNpemUpOwogCWRhdGEgPSBrbWFsbG9jX25vZGVfdHJhY2tfY2FsbGVyKHNpemUgKyBzaXplb2Yoc3RydWN0IHNrYl9zaGFyZWRfaW5mbyksCiAJCQlnZnBfbWFzaywgbm9kZSk7CiAJaWYgKCFkYXRhKQogCQlnb3RvIG5vZGF0YTsKIAotCW1lbXNldChza2IsIDAsIG9mZnNldG9mKHN0cnVjdCBza19idWZmLCB0cnVlc2l6ZSkpOworCS8qCisJICogU2VlIGNvbW1lbnQgaW4gc2tfYnVmZiBkZWZpbml0aW9uLCBqdXN0IGJlZm9yZSB0aGUgJ3RhaWwnIG1lbWJlcgorCSAqLworCW1lbXNldChza2IsIDAsIG9mZnNldG9mKHN0cnVjdCBza19idWZmLCB0YWlsKSk7CiAJc2tiLT50cnVlc2l6ZSA9IHNpemUgKyBzaXplb2Yoc3RydWN0IHNrX2J1ZmYpOwogCWF0b21pY19zZXQoJnNrYi0+dXNlcnMsIDEpOwogCXNrYi0+aGVhZCA9IGRhdGE7CiAJc2tiLT5kYXRhID0gZGF0YTsKLQlza2ItPnRhaWwgPSBkYXRhOwotCXNrYi0+ZW5kICA9IGRhdGEgKyBzaXplOworCXNrYl9yZXNldF90YWlsX3BvaW50ZXIoc2tiKTsKKwlza2ItPmVuZCA9IHNrYi0+dGFpbCArIHNpemU7CiAJLyogbWFrZSBzdXJlIHdlIGluaXRpYWxpemUgc2hpbmZvIHNlcXVlbnRpYWxseSAqLwogCXNoaW5mbyA9IHNrYl9zaGluZm8oc2tiKTsKIAlhdG9taWNfc2V0KCZzaGluZm8tPmRhdGFyZWYsIDEpOwpAQCAtMjk5LDcgKzMwNCw3IEBACiAJCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KGZjbG9uZV9yZWYpKQogCQkJa21lbV9jYWNoZV9mcmVlKHNrYnVmZl9mY2xvbmVfY2FjaGUsIG90aGVyKTsKIAkJYnJlYWs7Ci0JfTsKKwl9CiB9CiAKIC8qKgpAQCAtMzIxLDE1ICszMjYsMTMgQEAKIAkJV0FSTl9PTihpbl9pcnEoKSk7CiAJCXNrYi0+ZGVzdHJ1Y3Rvcihza2IpOwogCX0KLSNpZmRlZiBDT05GSUdfTkVURklMVEVSCi0JbmZfY29ubnRyYWNrX3B1dChza2ItPm5mY3QpOwogI2lmIGRlZmluZWQoQ09ORklHX05GX0NPTk5UUkFDSykgfHwgZGVmaW5lZChDT05GSUdfTkZfQ09OTlRSQUNLX01PRFVMRSkKKwluZl9jb25udHJhY2tfcHV0KHNrYi0+bmZjdCk7CiAJbmZfY29ubnRyYWNrX3B1dF9yZWFzbShza2ItPm5mY3RfcmVhc20pOwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0JSSURHRV9ORVRGSUxURVIKIAluZl9icmlkZ2VfcHV0KHNrYi0+bmZfYnJpZGdlKTsKICNlbmRpZgotI2VuZGlmCiAvKiBYWFg6IElTIHRoaXMgc3RpbGwgbmVjZXNzYXJ5PyAtIEpIUyAqLwogI2lmZGVmIENPTkZJR19ORVRfU0NIRUQKIAlza2ItPnRjX2luZGV4ID0gMDsKQEAgLTM5Niw5ICszOTksOSBAQAogCW4tPnNrID0gTlVMTDsKIAlDKHRzdGFtcCk7CiAJQyhkZXYpOwotCUMoaCk7Ci0JQyhuaCk7Ci0JQyhtYWMpOworCUModHJhbnNwb3J0X2hlYWRlcik7CisJQyhuZXR3b3JrX2hlYWRlcik7CisJQyhtYWNfaGVhZGVyKTsKIAlDKGRzdCk7CiAJZHN0X2Nsb25lKHNrYi0+ZHN0KTsKIAlDKHNwKTsKQEAgLTQyMiwxOSArNDI1LDcgQEAKIAlDKHByb3RvY29sKTsKIAluLT5kZXN0cnVjdG9yID0gTlVMTDsKIAlDKG1hcmspOwotI2lmZGVmIENPTkZJR19ORVRGSUxURVIKLQlDKG5mY3QpOwotCW5mX2Nvbm50cmFja19nZXQoc2tiLT5uZmN0KTsKLQlDKG5mY3RpbmZvKTsKLSNpZiBkZWZpbmVkKENPTkZJR19ORl9DT05OVFJBQ0spIHx8IGRlZmluZWQoQ09ORklHX05GX0NPTk5UUkFDS19NT0RVTEUpCi0JQyhuZmN0X3JlYXNtKTsKLQluZl9jb25udHJhY2tfZ2V0X3JlYXNtKHNrYi0+bmZjdF9yZWFzbSk7Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfQlJJREdFX05FVEZJTFRFUgotCUMobmZfYnJpZGdlKTsKLQluZl9icmlkZ2VfZ2V0KHNrYi0+bmZfYnJpZGdlKTsKLSNlbmRpZgotI2VuZGlmIC8qQ09ORklHX05FVEZJTFRFUiovCisJX19uZl9jb3B5KG4sIHNrYik7CiAjaWZkZWYgQ09ORklHX05FVF9TQ0hFRAogCUModGNfaW5kZXgpOwogI2lmZGVmIENPTkZJR19ORVRfQ0xTX0FDVApAQCAtNDYwLDExICs0NTEsMTIgQEAKIAogc3RhdGljIHZvaWQgY29weV9za2JfaGVhZGVyKHN0cnVjdCBza19idWZmICpuZXcsIGNvbnN0IHN0cnVjdCBza19idWZmICpvbGQpCiB7CisjaWZuZGVmIE5FVF9TS0JVRkZfREFUQV9VU0VTX09GRlNFVAogCS8qCiAJICoJU2hpZnQgYmV0d2VlbiB0aGUgdHdvIGRhdGEgYXJlYXMgaW4gYnl0ZXMKIAkgKi8KIAl1bnNpZ25lZCBsb25nIG9mZnNldCA9IG5ldy0+ZGF0YSAtIG9sZC0+ZGF0YTsKLQorI2VuZGlmCiAJbmV3LT5zawkJPSBOVUxMOwogCW5ldy0+ZGV2CT0gb2xkLT5kZXY7CiAJbmV3LT5wcmlvcml0eQk9IG9sZC0+cHJpb3JpdHk7CkBAIC00NzMsOSArNDY1LDE1IEBACiAjaWZkZWYgQ09ORklHX0lORVQKIAluZXctPnNwCQk9IHNlY3BhdGhfZ2V0KG9sZC0+c3ApOwogI2VuZGlmCi0JbmV3LT5oLnJhdwk9IG9sZC0+aC5yYXcgKyBvZmZzZXQ7Ci0JbmV3LT5uaC5yYXcJPSBvbGQtPm5oLnJhdyArIG9mZnNldDsKLQluZXctPm1hYy5yYXcJPSBvbGQtPm1hYy5yYXcgKyBvZmZzZXQ7CisJbmV3LT50cmFuc3BvcnRfaGVhZGVyID0gb2xkLT50cmFuc3BvcnRfaGVhZGVyOworCW5ldy0+bmV0d29ya19oZWFkZXIgICA9IG9sZC0+bmV0d29ya19oZWFkZXI7CisJbmV3LT5tYWNfaGVhZGVyCSAgICAgID0gb2xkLT5tYWNfaGVhZGVyOworI2lmbmRlZiBORVRfU0tCVUZGX0RBVEFfVVNFU19PRkZTRVQKKwkvKiB7dHJhbnNwb3J0LG5ldHdvcmssbWFjfV9oZWFkZXIgYXJlIHJlbGF0aXZlIHRvIHNrYi0+aGVhZCAqLworCW5ldy0+dHJhbnNwb3J0X2hlYWRlciArPSBvZmZzZXQ7CisJbmV3LT5uZXR3b3JrX2hlYWRlciAgICs9IG9mZnNldDsKKwluZXctPm1hY19oZWFkZXIJICAgICAgKz0gb2Zmc2V0OworI2VuZGlmCiAJbWVtY3B5KG5ldy0+Y2IsIG9sZC0+Y2IsIHNpemVvZihvbGQtPmNiKSk7CiAJbmV3LT5sb2NhbF9kZgk9IG9sZC0+bG9jYWxfZGY7CiAJbmV3LT5mY2xvbmUJPSBTS0JfRkNMT05FX1VOQVZBSUxBQkxFOwpAQCAtNDgzLDIyICs0ODEsMTAgQEAKIAluZXctPnRzdGFtcAk9IG9sZC0+dHN0YW1wOwogCW5ldy0+ZGVzdHJ1Y3RvciA9IE5VTEw7CiAJbmV3LT5tYXJrCT0gb2xkLT5tYXJrOwotI2lmZGVmIENPTkZJR19ORVRGSUxURVIKLQluZXctPm5mY3QJPSBvbGQtPm5mY3Q7Ci0JbmZfY29ubnRyYWNrX2dldChvbGQtPm5mY3QpOwotCW5ldy0+bmZjdGluZm8JPSBvbGQtPm5mY3RpbmZvOwotI2lmIGRlZmluZWQoQ09ORklHX05GX0NPTk5UUkFDSykgfHwgZGVmaW5lZChDT05GSUdfTkZfQ09OTlRSQUNLX01PRFVMRSkKLQluZXctPm5mY3RfcmVhc20gPSBvbGQtPm5mY3RfcmVhc207Ci0JbmZfY29ubnRyYWNrX2dldF9yZWFzbShvbGQtPm5mY3RfcmVhc20pOwotI2VuZGlmCisJX19uZl9jb3B5KG5ldywgb2xkKTsKICNpZiBkZWZpbmVkKENPTkZJR19JUF9WUykgfHwgZGVmaW5lZChDT05GSUdfSVBfVlNfTU9EVUxFKQogCW5ldy0+aXB2c19wcm9wZXJ0eSA9IG9sZC0+aXB2c19wcm9wZXJ0eTsKICNlbmRpZgotI2lmZGVmIENPTkZJR19CUklER0VfTkVURklMVEVSCi0JbmV3LT5uZl9icmlkZ2UJPSBvbGQtPm5mX2JyaWRnZTsKLQluZl9icmlkZ2VfZ2V0KG9sZC0+bmZfYnJpZGdlKTsKLSNlbmRpZgotI2VuZGlmCiAjaWZkZWYgQ09ORklHX05FVF9TQ0hFRAogI2lmZGVmIENPTkZJR19ORVRfQ0xTX0FDVAogCW5ldy0+dGNfdmVyZCA9IG9sZC0+dGNfdmVyZDsKQEAgLTUzNSw4ICs1MjEsMTIgQEAKIAkvKgogCSAqCUFsbG9jYXRlIHRoZSBjb3B5IGJ1ZmZlcgogCSAqLwotCXN0cnVjdCBza19idWZmICpuID0gYWxsb2Nfc2tiKHNrYi0+ZW5kIC0gc2tiLT5oZWFkICsgc2tiLT5kYXRhX2xlbiwKLQkJCQkgICAgICBnZnBfbWFzayk7CisJc3RydWN0IHNrX2J1ZmYgKm47CisjaWZkZWYgTkVUX1NLQlVGRl9EQVRBX1VTRVNfT0ZGU0VUCisJbiA9IGFsbG9jX3NrYihza2ItPmVuZCArIHNrYi0+ZGF0YV9sZW4sIGdmcF9tYXNrKTsKKyNlbHNlCisJbiA9IGFsbG9jX3NrYihza2ItPmVuZCAtIHNrYi0+aGVhZCArIHNrYi0+ZGF0YV9sZW4sIGdmcF9tYXNrKTsKKyNlbmRpZgogCWlmICghbikKIAkJcmV0dXJuIE5VTEw7CiAKQEAgLTU3Myw4ICs1NjMsMTIgQEAKIAkvKgogCSAqCUFsbG9jYXRlIHRoZSBjb3B5IGJ1ZmZlcgogCSAqLwotCXN0cnVjdCBza19idWZmICpuID0gYWxsb2Nfc2tiKHNrYi0+ZW5kIC0gc2tiLT5oZWFkLCBnZnBfbWFzayk7Ci0KKwlzdHJ1Y3Qgc2tfYnVmZiAqbjsKKyNpZmRlZiBORVRfU0tCVUZGX0RBVEFfVVNFU19PRkZTRVQKKwluID0gYWxsb2Nfc2tiKHNrYi0+ZW5kLCBnZnBfbWFzayk7CisjZWxzZQorCW4gPSBhbGxvY19za2Ioc2tiLT5lbmQgLSBza2ItPmhlYWQsIGdmcF9tYXNrKTsKKyNlbmRpZgogCWlmICghbikKIAkJZ290byBvdXQ7CiAKQEAgLTU4Myw3ICs1NzcsNyBAQAogCS8qIFNldCB0aGUgdGFpbCBwb2ludGVyIGFuZCBsZW5ndGggKi8KIAlza2JfcHV0KG4sIHNrYl9oZWFkbGVuKHNrYikpOwogCS8qIENvcHkgdGhlIGJ5dGVzICovCi0JbWVtY3B5KG4tPmRhdGEsIHNrYi0+ZGF0YSwgbi0+bGVuKTsKKwlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgbi0+ZGF0YSwgbi0+bGVuKTsKIAluLT5jc3VtCSAgICAgPSBza2ItPmNzdW07CiAJbi0+aXBfc3VtbWVkID0gc2tiLT5pcF9zdW1tZWQ7CiAKQEAgLTYzMiw3ICs2MjYsMTEgQEAKIHsKIAlpbnQgaTsKIAl1OCAqZGF0YTsKKyNpZmRlZiBORVRfU0tCVUZGX0RBVEFfVVNFU19PRkZTRVQKKwlpbnQgc2l6ZSA9IG5oZWFkICsgc2tiLT5lbmQgKyBudGFpbDsKKyNlbHNlCiAJaW50IHNpemUgPSBuaGVhZCArIChza2ItPmVuZCAtIHNrYi0+aGVhZCkgKyBudGFpbDsKKyNlbmRpZgogCWxvbmcgb2ZmOwogCiAJaWYgKHNrYl9zaGFyZWQoc2tiKSkKQEAgLTY0Niw4ICs2NDQsMTQgQEAKIAogCS8qIENvcHkgb25seSByZWFsIGRhdGEuLi4gYW5kLCBhbGFzLCBoZWFkZXIuIFRoaXMgc2hvdWxkIGJlCiAJICogb3B0aW1pemVkIGZvciB0aGUgY2FzZXMgd2hlbiBoZWFkZXIgaXMgdm9pZC4gKi8KLQltZW1jcHkoZGF0YSArIG5oZWFkLCBza2ItPmhlYWQsIHNrYi0+dGFpbCAtIHNrYi0+aGVhZCk7Ci0JbWVtY3B5KGRhdGEgKyBzaXplLCBza2ItPmVuZCwgc2l6ZW9mKHN0cnVjdCBza2Jfc2hhcmVkX2luZm8pKTsKKwltZW1jcHkoZGF0YSArIG5oZWFkLCBza2ItPmhlYWQsCisjaWZkZWYgTkVUX1NLQlVGRl9EQVRBX1VTRVNfT0ZGU0VUCisJCXNrYi0+dGFpbCk7CisjZWxzZQorCQlza2ItPnRhaWwgLSBza2ItPmhlYWQpOworI2VuZGlmCisJbWVtY3B5KGRhdGEgKyBzaXplLCBza2JfZW5kX3BvaW50ZXIoc2tiKSwKKwkgICAgICAgc2l6ZW9mKHN0cnVjdCBza2Jfc2hhcmVkX2luZm8pKTsKIAogCWZvciAoaSA9IDA7IGkgPCBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzOyBpKyspCiAJCWdldF9wYWdlKHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0ucGFnZSk7CkBAIC02NjAsMTIgKzY2NCwxOCBAQAogCW9mZiA9IChkYXRhICsgbmhlYWQpIC0gc2tiLT5oZWFkOwogCiAJc2tiLT5oZWFkICAgICA9IGRhdGE7Ci0Jc2tiLT5lbmQgICAgICA9IGRhdGEgKyBzaXplOwogCXNrYi0+ZGF0YSAgICArPSBvZmY7Ci0Jc2tiLT50YWlsICAgICs9IG9mZjsKLQlza2ItPm1hYy5yYXcgKz0gb2ZmOwotCXNrYi0+aC5yYXcgICArPSBvZmY7Ci0Jc2tiLT5uaC5yYXcgICs9IG9mZjsKKyNpZmRlZiBORVRfU0tCVUZGX0RBVEFfVVNFU19PRkZTRVQKKwlza2ItPmVuZCAgICAgID0gc2l6ZTsKKwlvZmYgICAgICAgICAgID0gbmhlYWQ7CisjZWxzZQorCXNrYi0+ZW5kICAgICAgPSBza2ItPmhlYWQgKyBzaXplOworI2VuZGlmCisJLyoge3RyYW5zcG9ydCxuZXR3b3JrLG1hY31faGVhZGVyIGFuZCB0YWlsIGFyZSByZWxhdGl2ZSB0byBza2ItPmhlYWQgKi8KKwlza2ItPnRhaWwJICAgICAgKz0gb2ZmOworCXNrYi0+dHJhbnNwb3J0X2hlYWRlciArPSBvZmY7CisJc2tiLT5uZXR3b3JrX2hlYWRlciAgICs9IG9mZjsKKwlza2ItPm1hY19oZWFkZXIJICAgICAgKz0gb2ZmOwogCXNrYi0+Y2xvbmVkICAgPSAwOwogCXNrYi0+bm9oZHIgICAgPSAwOwogCWF0b21pY19zZXQoJnNrYl9zaGluZm8oc2tiKS0+ZGF0YXJlZiwgMSk7CkBAIC03MjYsNyArNzM2LDkgQEAKIAkgKi8KIAlzdHJ1Y3Qgc2tfYnVmZiAqbiA9IGFsbG9jX3NrYihuZXdoZWFkcm9vbSArIHNrYi0+bGVuICsgbmV3dGFpbHJvb20sCiAJCQkJICAgICAgZ2ZwX21hc2spOworCWludCBvbGRoZWFkcm9vbSA9IHNrYl9oZWFkcm9vbShza2IpOwogCWludCBoZWFkX2NvcHlfbGVuLCBoZWFkX2NvcHlfb2ZmOworCWludCBvZmYgPSAwOwogCiAJaWYgKCFuKQogCQlyZXR1cm4gTlVMTDsKQEAgLTczNiw3ICs3NDgsNyBAQAogCS8qIFNldCB0aGUgdGFpbCBwb2ludGVyIGFuZCBsZW5ndGggKi8KIAlza2JfcHV0KG4sIHNrYi0+bGVuKTsKIAotCWhlYWRfY29weV9sZW4gPSBza2JfaGVhZHJvb20oc2tiKTsKKwloZWFkX2NvcHlfbGVuID0gb2xkaGVhZHJvb207CiAJaGVhZF9jb3B5X29mZiA9IDA7CiAJaWYgKG5ld2hlYWRyb29tIDw9IGhlYWRfY29weV9sZW4pCiAJCWhlYWRfY29weV9sZW4gPSBuZXdoZWFkcm9vbTsKQEAgLTc1MCw2ICs3NjIsMTMgQEAKIAogCWNvcHlfc2tiX2hlYWRlcihuLCBza2IpOwogCisjaWZkZWYgTkVUX1NLQlVGRl9EQVRBX1VTRVNfT0ZGU0VUCisJb2ZmICAgICAgICAgICAgICAgICAgPSBuZXdoZWFkcm9vbSAtIG9sZGhlYWRyb29tOworI2VuZGlmCisJbi0+dHJhbnNwb3J0X2hlYWRlciArPSBvZmY7CisJbi0+bmV0d29ya19oZWFkZXIgICArPSBvZmY7CisJbi0+bWFjX2hlYWRlcgkgICAgKz0gb2ZmOworCiAJcmV0dXJuIG47CiB9CiAKQEAgLTg3Nyw3ICs4OTYsNyBAQAogCX0gZWxzZSB7CiAJCXNrYi0+bGVuICAgICAgID0gbGVuOwogCQlza2ItPmRhdGFfbGVuICA9IDA7Ci0JCXNrYi0+dGFpbCAgICAgID0gc2tiLT5kYXRhICsgbGVuOworCQlza2Jfc2V0X3RhaWxfcG9pbnRlcihza2IsIGxlbik7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC05MjIsNyArOTQxLDcgQEAKIAkJCXJldHVybiBOVUxMOwogCX0KIAotCWlmIChza2JfY29weV9iaXRzKHNrYiwgc2tiX2hlYWRsZW4oc2tiKSwgc2tiLT50YWlsLCBkZWx0YSkpCisJaWYgKHNrYl9jb3B5X2JpdHMoc2tiLCBza2JfaGVhZGxlbihza2IpLCBza2JfdGFpbF9wb2ludGVyKHNrYiksIGRlbHRhKSkKIAkJQlVHKCk7CiAKIAkvKiBPcHRpbWl6YXRpb246IG5vIGZyYWdtZW50cywgbm8gcmVhc29ucyB0byBwcmVlc3RpbWF0ZQpAQCAtMTAxOCw3ICsxMDM3LDcgQEAKIAlza2ItPnRhaWwgICAgICs9IGRlbHRhOwogCXNrYi0+ZGF0YV9sZW4gLT0gZGVsdGE7CiAKLQlyZXR1cm4gc2tiLT50YWlsOworCXJldHVybiBza2JfdGFpbF9wb2ludGVyKHNrYik7CiB9CiAKIC8qIENvcHkgc29tZSBkYXRhIGJpdHMgZnJvbSBza2IgdG8ga2VybmVsIGJ1ZmZlci4gKi8KQEAgLTEwMzUsNyArMTA1NCw3IEBACiAJaWYgKChjb3B5ID0gc3RhcnQgLSBvZmZzZXQpID4gMCkgewogCQlpZiAoY29weSA+IGxlbikKIAkJCWNvcHkgPSBsZW47Ci0JCW1lbWNweSh0bywgc2tiLT5kYXRhICsgb2Zmc2V0LCBjb3B5KTsKKwkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YV9vZmZzZXQoc2tiLCBvZmZzZXQsIHRvLCBjb3B5KTsKIAkJaWYgKChsZW4gLT0gY29weSkgPT0gMCkKIAkJCXJldHVybiAwOwogCQlvZmZzZXQgKz0gY29weTsKQEAgLTExMTAsNyArMTEyOSw3IEBACiAgKgl0cmF2ZXJzaW5nIGZyYWdtZW50IGxpc3RzIGFuZCBzdWNoLgogICovCiAKLWludCBza2Jfc3RvcmVfYml0cyhjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgb2Zmc2V0LCB2b2lkICpmcm9tLCBpbnQgbGVuKQoraW50IHNrYl9zdG9yZV9iaXRzKHN0cnVjdCBza19idWZmICpza2IsIGludCBvZmZzZXQsIGNvbnN0IHZvaWQgKmZyb20sIGludCBsZW4pCiB7CiAJaW50IGksIGNvcHk7CiAJaW50IHN0YXJ0ID0gc2tiX2hlYWRsZW4oc2tiKTsKQEAgLTExMjEsNyArMTE0MCw3IEBACiAJaWYgKChjb3B5ID0gc3RhcnQgLSBvZmZzZXQpID4gMCkgewogCQlpZiAoY29weSA+IGxlbikKIAkJCWNvcHkgPSBsZW47Ci0JCW1lbWNweShza2ItPmRhdGEgKyBvZmZzZXQsIGZyb20sIGNvcHkpOworCQlza2JfY29weV90b19saW5lYXJfZGF0YV9vZmZzZXQoc2tiLCBvZmZzZXQsIGZyb20sIGNvcHkpOwogCQlpZiAoKGxlbiAtPSBjb3B5KSA9PSAwKQogCQkJcmV0dXJuIDA7CiAJCW9mZnNldCArPSBjb3B5OwpAQCAtMTM0OCwxMyArMTM2NywxMyBAQAogCWxvbmcgY3NzdGFydDsKIAogCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9QQVJUSUFMKQotCQljc3N0YXJ0ID0gc2tiLT5oLnJhdyAtIHNrYi0+ZGF0YTsKKwkJY3NzdGFydCA9IHNrYi0+Y3N1bV9zdGFydCAtIHNrYl9oZWFkcm9vbShza2IpOwogCWVsc2UKIAkJY3NzdGFydCA9IHNrYl9oZWFkbGVuKHNrYik7CiAKIAlCVUdfT04oY3NzdGFydCA+IHNrYl9oZWFkbGVuKHNrYikpOwogCi0JbWVtY3B5KHRvLCBza2ItPmRhdGEsIGNzc3RhcnQpOworCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCB0bywgY3NzdGFydCk7CiAKIAljc3VtID0gMDsKIAlpZiAoY3NzdGFydCAhPSBza2ItPmxlbikKQEAgLTE1MjIsMjcgKzE1NDEsMTQgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsaXN0LT5sb2NrLCBmbGFncyk7CiB9CiAKLSNpZiAwCi0vKgotICogCVR1bmUgdGhlIG1lbW9yeSBhbGxvY2F0b3IgZm9yIGEgbmV3IE1UVSBzaXplLgotICovCi12b2lkIHNrYl9hZGRfbXR1KGludCBtdHUpCi17Ci0JLyogTXVzdCBtYXRjaCBhbGxvY2F0aW9uIGluIGFsbG9jX3NrYiAqLwotCW10dSA9IFNLQl9EQVRBX0FMSUdOKG10dSkgKyBzaXplb2Yoc3RydWN0IHNrYl9zaGFyZWRfaW5mbyk7Ci0KLQlrbWVtX2FkZF9jYWNoZV9zaXplKG10dSk7Ci19Ci0jZW5kaWYKLQogc3RhdGljIGlubGluZSB2b2lkIHNrYl9zcGxpdF9pbnNpZGVfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IsCiAJCQkJCSAgIHN0cnVjdCBza19idWZmKiBza2IxLAogCQkJCQkgICBjb25zdCB1MzIgbGVuLCBjb25zdCBpbnQgcG9zKQogewogCWludCBpOwogCi0JbWVtY3B5KHNrYl9wdXQoc2tiMSwgcG9zIC0gbGVuKSwgc2tiLT5kYXRhICsgbGVuLCBwb3MgLSBsZW4pOwotCisJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YV9vZmZzZXQoc2tiLCBsZW4sIHNrYl9wdXQoc2tiMSwgcG9zIC0gbGVuKSwKKwkJCQkJIHBvcyAtIGxlbik7CiAJLyogQW5kIG1vdmUgZGF0YSBhcHBlbmRpeCBhcyBpcy4gKi8KIAlmb3IgKGkgPSAwOyBpIDwgc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsgaSsrKQogCQlza2Jfc2hpbmZvKHNrYjEpLT5mcmFnc1tpXSA9IHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV07CkBAIC0xNTUzLDcgKzE1NTksNyBAQAogCXNrYjEtPmxlbgkJICAgKz0gc2tiMS0+ZGF0YV9sZW47CiAJc2tiLT5kYXRhX2xlbgkJICAgPSAwOwogCXNrYi0+bGVuCQkgICA9IGxlbjsKLQlza2ItPnRhaWwJCSAgID0gc2tiLT5kYXRhICsgbGVuOworCXNrYl9zZXRfdGFpbF9wb2ludGVyKHNrYiwgbGVuKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHNrYl9zcGxpdF9ub19oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwKQEAgLTE4NzgsNyArMTg4NCw3IEBACiAJc3RydWN0IHNrX2J1ZmYgKnNlZ3MgPSBOVUxMOwogCXN0cnVjdCBza19idWZmICp0YWlsID0gTlVMTDsKIAl1bnNpZ25lZCBpbnQgbXNzID0gc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZTsKLQl1bnNpZ25lZCBpbnQgZG9mZnNldCA9IHNrYi0+ZGF0YSAtIHNrYi0+bWFjLnJhdzsKKwl1bnNpZ25lZCBpbnQgZG9mZnNldCA9IHNrYi0+ZGF0YSAtIHNrYl9tYWNfaGVhZGVyKHNrYik7CiAJdW5zaWduZWQgaW50IG9mZnNldCA9IGRvZmZzZXQ7CiAJdW5zaWduZWQgaW50IGhlYWRyb29tOwogCXVuc2lnbmVkIGludCBsZW47CkBAIC0xOTI4LDExICsxOTM0LDEyIEBACiAJCW5za2ItPm1hY19sZW4gPSBza2ItPm1hY19sZW47CiAKIAkJc2tiX3Jlc2VydmUobnNrYiwgaGVhZHJvb20pOwotCQluc2tiLT5tYWMucmF3ID0gbnNrYi0+ZGF0YTsKLQkJbnNrYi0+bmgucmF3ID0gbnNrYi0+ZGF0YSArIHNrYi0+bWFjX2xlbjsKLQkJbnNrYi0+aC5yYXcgPSBuc2tiLT5uaC5yYXcgKyAoc2tiLT5oLnJhdyAtIHNrYi0+bmgucmF3KTsKLQkJbWVtY3B5KHNrYl9wdXQobnNrYiwgZG9mZnNldCksIHNrYi0+ZGF0YSwgZG9mZnNldCk7Ci0KKwkJc2tiX3Jlc2V0X21hY19oZWFkZXIobnNrYik7CisJCXNrYl9zZXRfbmV0d29ya19oZWFkZXIobnNrYiwgc2tiLT5tYWNfbGVuKTsKKwkJbnNrYi0+dHJhbnNwb3J0X2hlYWRlciA9IChuc2tiLT5uZXR3b3JrX2hlYWRlciArCisJCQkJCSAgc2tiX25ldHdvcmtfaGVhZGVyX2xlbihza2IpKTsKKwkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIHNrYl9wdXQobnNrYiwgZG9mZnNldCksCisJCQkJCSAgZG9mZnNldCk7CiAJCWlmICghc2cpIHsKIAkJCW5za2ItPmNzdW0gPSBza2JfY29weV9hbmRfY3N1bV9iaXRzKHNrYiwgb2Zmc2V0LAogCQkJCQkJCSAgICBza2JfcHV0KG5za2IsIGxlbiksCkBAIC0xOTQ1LDcgKzE5NTIsOCBAQAogCiAJCW5za2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1BBUlRJQUw7CiAJCW5za2ItPmNzdW0gPSBza2ItPmNzdW07Ci0JCW1lbWNweShza2JfcHV0KG5za2IsIGhzaXplKSwgc2tiLT5kYXRhICsgb2Zmc2V0LCBoc2l6ZSk7CisJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGFfb2Zmc2V0KHNrYiwgb2Zmc2V0LAorCQkJCQkJIHNrYl9wdXQobnNrYiwgaHNpemUpLCBoc2l6ZSk7CiAKIAkJd2hpbGUgKHBvcyA8IG9mZnNldCArIGxlbikgewogCQkJQlVHX09OKGkgPj0gbmZyYWdzKTsKQEAgLTIwMDUsNiArMjAxMywxOTAgQEAKIAkJCQkJCU5VTEwsIE5VTEwpOwogfQogCisvKioKKyAqCXNrYl90b19zZ3ZlYyAtIEZpbGwgYSBzY2F0dGVyLWdhdGhlciBsaXN0IGZyb20gYSBzb2NrZXQgYnVmZmVyCisgKglAc2tiOiBTb2NrZXQgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGJ1ZmZlcnMgdG8gYmUgbWFwcGVkCisgKglAc2c6IFRoZSBzY2F0dGVyLWdhdGhlciBsaXN0IHRvIG1hcCBpbnRvCisgKglAb2Zmc2V0OiBUaGUgb2Zmc2V0IGludG8gdGhlIGJ1ZmZlcidzIGNvbnRlbnRzIHRvIHN0YXJ0IG1hcHBpbmcKKyAqCUBsZW46IExlbmd0aCBvZiBidWZmZXIgc3BhY2UgdG8gYmUgbWFwcGVkCisgKgorICoJRmlsbCB0aGUgc3BlY2lmaWVkIHNjYXR0ZXItZ2F0aGVyIGxpc3Qgd2l0aCBtYXBwaW5ncy9wb2ludGVycyBpbnRvIGEKKyAqCXJlZ2lvbiBvZiB0aGUgYnVmZmVyIHNwYWNlIGF0dGFjaGVkIHRvIGEgc29ja2V0IGJ1ZmZlci4KKyAqLworaW50Citza2JfdG9fc2d2ZWMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgaW50IG9mZnNldCwgaW50IGxlbikKK3sKKwlpbnQgc3RhcnQgPSBza2JfaGVhZGxlbihza2IpOworCWludCBpLCBjb3B5ID0gc3RhcnQgLSBvZmZzZXQ7CisJaW50IGVsdCA9IDA7CisKKwlpZiAoY29weSA+IDApIHsKKwkJaWYgKGNvcHkgPiBsZW4pCisJCQljb3B5ID0gbGVuOworCQlzZ1tlbHRdLnBhZ2UgPSB2aXJ0X3RvX3BhZ2Uoc2tiLT5kYXRhICsgb2Zmc2V0KTsKKwkJc2dbZWx0XS5vZmZzZXQgPSAodW5zaWduZWQgbG9uZykoc2tiLT5kYXRhICsgb2Zmc2V0KSAlIFBBR0VfU0laRTsKKwkJc2dbZWx0XS5sZW5ndGggPSBjb3B5OworCQllbHQrKzsKKwkJaWYgKChsZW4gLT0gY29weSkgPT0gMCkKKwkJCXJldHVybiBlbHQ7CisJCW9mZnNldCArPSBjb3B5OworCX0KKworCWZvciAoaSA9IDA7IGkgPCBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzOyBpKyspIHsKKwkJaW50IGVuZDsKKworCQlCVUdfVFJBUChzdGFydCA8PSBvZmZzZXQgKyBsZW4pOworCisJCWVuZCA9IHN0YXJ0ICsgc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXS5zaXplOworCQlpZiAoKGNvcHkgPSBlbmQgLSBvZmZzZXQpID4gMCkgeworCQkJc2tiX2ZyYWdfdCAqZnJhZyA9ICZza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldOworCisJCQlpZiAoY29weSA+IGxlbikKKwkJCQljb3B5ID0gbGVuOworCQkJc2dbZWx0XS5wYWdlID0gZnJhZy0+cGFnZTsKKwkJCXNnW2VsdF0ub2Zmc2V0ID0gZnJhZy0+cGFnZV9vZmZzZXQrb2Zmc2V0LXN0YXJ0OworCQkJc2dbZWx0XS5sZW5ndGggPSBjb3B5OworCQkJZWx0Kys7CisJCQlpZiAoIShsZW4gLT0gY29weSkpCisJCQkJcmV0dXJuIGVsdDsKKwkJCW9mZnNldCArPSBjb3B5OworCQl9CisJCXN0YXJ0ID0gZW5kOworCX0KKworCWlmIChza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdCkgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqbGlzdCA9IHNrYl9zaGluZm8oc2tiKS0+ZnJhZ19saXN0OworCisJCWZvciAoOyBsaXN0OyBsaXN0ID0gbGlzdC0+bmV4dCkgeworCQkJaW50IGVuZDsKKworCQkJQlVHX1RSQVAoc3RhcnQgPD0gb2Zmc2V0ICsgbGVuKTsKKworCQkJZW5kID0gc3RhcnQgKyBsaXN0LT5sZW47CisJCQlpZiAoKGNvcHkgPSBlbmQgLSBvZmZzZXQpID4gMCkgeworCQkJCWlmIChjb3B5ID4gbGVuKQorCQkJCQljb3B5ID0gbGVuOworCQkJCWVsdCArPSBza2JfdG9fc2d2ZWMobGlzdCwgc2crZWx0LCBvZmZzZXQgLSBzdGFydCwgY29weSk7CisJCQkJaWYgKChsZW4gLT0gY29weSkgPT0gMCkKKwkJCQkJcmV0dXJuIGVsdDsKKwkJCQlvZmZzZXQgKz0gY29weTsKKwkJCX0KKwkJCXN0YXJ0ID0gZW5kOworCQl9CisJfQorCUJVR19PTihsZW4pOworCXJldHVybiBlbHQ7Cit9CisKKy8qKgorICoJc2tiX2Nvd19kYXRhIC0gQ2hlY2sgdGhhdCBhIHNvY2tldCBidWZmZXIncyBkYXRhIGJ1ZmZlcnMgYXJlIHdyaXRhYmxlCisgKglAc2tiOiBUaGUgc29ja2V0IGJ1ZmZlciB0byBjaGVjay4KKyAqCUB0YWlsYml0czogQW1vdW50IG9mIHRyYWlsaW5nIHNwYWNlIHRvIGJlIGFkZGVkCisgKglAdHJhaWxlcjogUmV0dXJuZWQgcG9pbnRlciB0byB0aGUgc2tiIHdoZXJlIHRoZSBAdGFpbGJpdHMgc3BhY2UgYmVnaW5zCisgKgorICoJTWFrZSBzdXJlIHRoYXQgdGhlIGRhdGEgYnVmZmVycyBhdHRhY2hlZCB0byBhIHNvY2tldCBidWZmZXIgYXJlCisgKgl3cml0YWJsZS4gSWYgdGhleSBhcmUgbm90LCBwcml2YXRlIGNvcGllcyBhcmUgbWFkZSBvZiB0aGUgZGF0YSBidWZmZXJzCisgKglhbmQgdGhlIHNvY2tldCBidWZmZXIgaXMgc2V0IHRvIHVzZSB0aGVzZSBpbnN0ZWFkLgorICoKKyAqCUlmIEB0YWlsYml0cyBpcyBnaXZlbiwgbWFrZSBzdXJlIHRoYXQgdGhlcmUgaXMgc3BhY2UgdG8gd3JpdGUgQHRhaWxiaXRzCisgKglieXRlcyBvZiBkYXRhIGJleW9uZCBjdXJyZW50IGVuZCBvZiBzb2NrZXQgYnVmZmVyLiAgQHRyYWlsZXIgd2lsbCBiZQorICoJc2V0IHRvIHBvaW50IHRvIHRoZSBza2IgaW4gd2hpY2ggdGhpcyBzcGFjZSBiZWdpbnMuCisgKgorICoJVGhlIG51bWJlciBvZiBzY2F0dGVybGlzdCBlbGVtZW50cyByZXF1aXJlZCB0byBjb21wbGV0ZWx5IG1hcCB0aGUKKyAqCUNPVydkIGFuZCBleHRlbmRlZCBzb2NrZXQgYnVmZmVyIHdpbGwgYmUgcmV0dXJuZWQuCisgKi8KK2ludCBza2JfY293X2RhdGEoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHRhaWxiaXRzLCBzdHJ1Y3Qgc2tfYnVmZiAqKnRyYWlsZXIpCit7CisJaW50IGNvcHlmbGFnOworCWludCBlbHQ7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjEsICoqc2tiX3A7CisKKwkvKiBJZiBza2IgaXMgY2xvbmVkIG9yIGl0cyBoZWFkIGlzIHBhZ2VkLCByZWFsbG9jYXRlCisJICogaGVhZCBwdWxsaW5nIG91dCBhbGwgdGhlIHBhZ2VzIChwYWdlcyBhcmUgY29uc2lkZXJlZCBub3Qgd3JpdGFibGUKKwkgKiBhdCB0aGUgbW9tZW50IGV2ZW4gaWYgdGhleSBhcmUgYW5vbnltb3VzKS4KKwkgKi8KKwlpZiAoKHNrYl9jbG9uZWQoc2tiKSB8fCBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzKSAmJgorCSAgICBfX3Bza2JfcHVsbF90YWlsKHNrYiwgc2tiX3BhZ2VsZW4oc2tiKS1za2JfaGVhZGxlbihza2IpKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIEVhc3kgY2FzZS4gTW9zdCBvZiBwYWNrZXRzIHdpbGwgZ28gdGhpcyB3YXkuICovCisJaWYgKCFza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdCkgeworCQkvKiBBIGxpdHRsZSBvZiB0cm91YmxlLCBub3QgZW5vdWdoIG9mIHNwYWNlIGZvciB0cmFpbGVyLgorCQkgKiBUaGlzIHNob3VsZCBub3QgaGFwcGVuLCB3aGVuIHN0YWNrIGlzIHR1bmVkIHRvIGdlbmVyYXRlCisJCSAqIGdvb2QgZnJhbWVzLiBPSywgb24gbWlzcyB3ZSByZWFsbG9jYXRlIGFuZCByZXNlcnZlIGV2ZW4gbW9yZQorCQkgKiBzcGFjZSwgMTI4IGJ5dGVzIGlzIGZhaXIuICovCisKKwkJaWYgKHNrYl90YWlscm9vbShza2IpIDwgdGFpbGJpdHMgJiYKKwkJICAgIHBza2JfZXhwYW5kX2hlYWQoc2tiLCAwLCB0YWlsYml0cy1za2JfdGFpbHJvb20oc2tiKSsxMjgsIEdGUF9BVE9NSUMpKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJLyogVm9pbGEhICovCisJCSp0cmFpbGVyID0gc2tiOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBNaXNlcnkuIFdlIGFyZSBpbiB0cm91YmxlcywgZ29pbmcgdG8gbWluY2VyIGZyYWdtZW50cy4uLiAqLworCisJZWx0ID0gMTsKKwlza2JfcCA9ICZza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdDsKKwljb3B5ZmxhZyA9IDA7CisKKwl3aGlsZSAoKHNrYjEgPSAqc2tiX3ApICE9IE5VTEwpIHsKKwkJaW50IG50YWlsID0gMDsKKworCQkvKiBUaGUgZnJhZ21lbnQgaXMgcGFydGlhbGx5IHB1bGxlZCBieSBzb21lb25lLAorCQkgKiB0aGlzIGNhbiBoYXBwZW4gb24gaW5wdXQuIENvcHkgaXQgYW5kIGV2ZXJ5dGhpbmcKKwkJICogYWZ0ZXIgaXQuICovCisKKwkJaWYgKHNrYl9zaGFyZWQoc2tiMSkpCisJCQljb3B5ZmxhZyA9IDE7CisKKwkJLyogSWYgdGhlIHNrYiBpcyB0aGUgbGFzdCwgd29ycnkgYWJvdXQgdHJhaWxlci4gKi8KKworCQlpZiAoc2tiMS0+bmV4dCA9PSBOVUxMICYmIHRhaWxiaXRzKSB7CisJCQlpZiAoc2tiX3NoaW5mbyhza2IxKS0+bnJfZnJhZ3MgfHwKKwkJCSAgICBza2Jfc2hpbmZvKHNrYjEpLT5mcmFnX2xpc3QgfHwKKwkJCSAgICBza2JfdGFpbHJvb20oc2tiMSkgPCB0YWlsYml0cykKKwkJCQludGFpbCA9IHRhaWxiaXRzICsgMTI4OworCQl9CisKKwkJaWYgKGNvcHlmbGFnIHx8CisJCSAgICBza2JfY2xvbmVkKHNrYjEpIHx8CisJCSAgICBudGFpbCB8fAorCQkgICAgc2tiX3NoaW5mbyhza2IxKS0+bnJfZnJhZ3MgfHwKKwkJICAgIHNrYl9zaGluZm8oc2tiMSktPmZyYWdfbGlzdCkgeworCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjI7CisKKwkJCS8qIEZ1Y2ssIHdlIGFyZSBtaXNlcmFibGUgcG9vciBndXlzLi4uICovCisJCQlpZiAobnRhaWwgPT0gMCkKKwkJCQlza2IyID0gc2tiX2NvcHkoc2tiMSwgR0ZQX0FUT01JQyk7CisJCQllbHNlCisJCQkJc2tiMiA9IHNrYl9jb3B5X2V4cGFuZChza2IxLAorCQkJCQkJICAgICAgIHNrYl9oZWFkcm9vbShza2IxKSwKKwkJCQkJCSAgICAgICBudGFpbCwKKwkJCQkJCSAgICAgICBHRlBfQVRPTUlDKTsKKwkJCWlmICh1bmxpa2VseShza2IyID09IE5VTEwpKQorCQkJCXJldHVybiAtRU5PTUVNOworCisJCQlpZiAoc2tiMS0+c2spCisJCQkJc2tiX3NldF9vd25lcl93KHNrYjIsIHNrYjEtPnNrKTsKKworCQkJLyogTG9va2luZyBhcm91bmQuIEFyZSB3ZSBzdGlsbCBhbGl2ZT8KKwkJCSAqIE9LLCBsaW5rIG5ldyBza2IsIGRyb3Agb2xkIG9uZSAqLworCisJCQlza2IyLT5uZXh0ID0gc2tiMS0+bmV4dDsKKwkJCSpza2JfcCA9IHNrYjI7CisJCQlrZnJlZV9za2Ioc2tiMSk7CisJCQlza2IxID0gc2tiMjsKKwkJfQorCQllbHQrKzsKKwkJKnRyYWlsZXIgPSBza2IxOworCQlza2JfcCA9ICZza2IxLT5uZXh0OworCX0KKworCXJldHVybiBlbHQ7Cit9CisKIEVYUE9SVF9TWU1CT0woX19fcHNrYl90cmltKTsKIEVYUE9SVF9TWU1CT0woX19rZnJlZV9za2IpOwogRVhQT1JUX1NZTUJPTChrZnJlZV9za2IpOwpAQCAtMjAzOSwzICsyMjMxLDYgQEAKIEVYUE9SVF9TWU1CT0woc2tiX2Fib3J0X3NlcV9yZWFkKTsKIEVYUE9SVF9TWU1CT0woc2tiX2ZpbmRfdGV4dCk7CiBFWFBPUlRfU1lNQk9MKHNrYl9hcHBlbmRfZGF0YXRvX2ZyYWdzKTsKKworRVhQT1JUX1NZTUJPTF9HUEwoc2tiX3RvX3NndmVjKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHNrYl9jb3dfZGF0YSk7CmRpZmYgLS1naXQgYS9uZXQvY29yZS9zb2NrLmMgYi9uZXQvY29yZS9zb2NrLmMKaW5kZXggMjdjNGY2Mi4uMjIxODNjMiAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvc29jay5jCisrKyBiL25ldC9jb3JlL3NvY2suYwpAQCAtMTU0LDcgKzE1NCw4IEBACiAgICJza19sb2NrLTIxIiAgICAgICAsICJza19sb2NrLUFGX1NOQSIgICAgICAsICJza19sb2NrLUFGX0lSREEiICAgICAsCiAgICJza19sb2NrLUFGX1BQUE9YIiAsICJza19sb2NrLUFGX1dBTlBJUEUiICAsICJza19sb2NrLUFGX0xMQyIgICAgICAsCiAgICJza19sb2NrLTI3IiAgICAgICAsICJza19sb2NrLTI4IiAgICAgICAgICAsICJza19sb2NrLTI5IiAgICAgICAgICAsCi0gICJza19sb2NrLUFGX1RJUEMiICAsICJza19sb2NrLUFGX0JMVUVUT09USCIsICJza19sb2NrLUFGX01BWCIKKyAgInNrX2xvY2stQUZfVElQQyIgICwgInNrX2xvY2stQUZfQkxVRVRPT1RIIiwgInNrX2xvY2stSVVDViIgICAgICAgICwKKyAgInNrX2xvY2stQUZfUlhSUEMiICwgInNrX2xvY2stQUZfTUFYIgogfTsKIHN0YXRpYyBjb25zdCBjaGFyICphZl9mYW1pbHlfc2xvY2tfa2V5X3N0cmluZ3NbQUZfTUFYKzFdID0gewogICAic2xvY2stQUZfVU5TUEVDIiwgInNsb2NrLUFGX1VOSVgiICAgICAsICJzbG9jay1BRl9JTkVUIiAgICAgLApAQCAtMTY3LDcgKzE2OCw4IEBACiAgICJzbG9jay0yMSIgICAgICAgLCAic2xvY2stQUZfU05BIiAgICAgICwgInNsb2NrLUFGX0lSREEiICAgICAsCiAgICJzbG9jay1BRl9QUFBPWCIgLCAic2xvY2stQUZfV0FOUElQRSIgICwgInNsb2NrLUFGX0xMQyIgICAgICAsCiAgICJzbG9jay0yNyIgICAgICAgLCAic2xvY2stMjgiICAgICAgICAgICwgInNsb2NrLTI5IiAgICAgICAgICAsCi0gICJzbG9jay1BRl9USVBDIiAgLCAic2xvY2stQUZfQkxVRVRPT1RIIiwgInNsb2NrLUFGX01BWCIKKyAgInNsb2NrLUFGX1RJUEMiICAsICJzbG9jay1BRl9CTFVFVE9PVEgiLCAic2xvY2stQUZfSVVDViIgICAgICwKKyAgInNsb2NrLUFGX1JYUlBDIiAsICJzbG9jay1BRl9NQVgiCiB9OwogI2VuZGlmCiAKQEAgLTM2MSw4ICszNjMsOCBAQAogCX0KICNlbmRpZgogCi0JaWYob3B0bGVuPHNpemVvZihpbnQpKQotCQlyZXR1cm4oLUVJTlZBTCk7CisJaWYgKG9wdGxlbiA8IHNpemVvZihpbnQpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmIChnZXRfdXNlcih2YWwsIChpbnQgX191c2VyICopb3B0dmFsKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CkBAIC0zNzEsMjY1ICszNzMsMjcwIEBACiAKIAlsb2NrX3NvY2soc2spOwogCi0Jc3dpdGNoKG9wdG5hbWUpCi0JewotCQljYXNlIFNPX0RFQlVHOgotCQkJaWYodmFsICYmICFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQotCQkJewotCQkJCXJldCA9IC1FQUNDRVM7Ci0JCQl9Ci0JCQllbHNlIGlmICh2YWxib29sKQotCQkJCXNvY2tfc2V0X2ZsYWcoc2ssIFNPQ0tfREJHKTsKLQkJCWVsc2UKLQkJCQlzb2NrX3Jlc2V0X2ZsYWcoc2ssIFNPQ0tfREJHKTsKLQkJCWJyZWFrOwotCQljYXNlIFNPX1JFVVNFQUREUjoKLQkJCXNrLT5za19yZXVzZSA9IHZhbGJvb2w7Ci0JCQlicmVhazsKLQkJY2FzZSBTT19UWVBFOgotCQljYXNlIFNPX0VSUk9SOgotCQkJcmV0ID0gLUVOT1BST1RPT1BUOwotCQkJYnJlYWs7Ci0JCWNhc2UgU09fRE9OVFJPVVRFOgotCQkJaWYgKHZhbGJvb2wpCi0JCQkJc29ja19zZXRfZmxhZyhzaywgU09DS19MT0NBTFJPVVRFKTsKLQkJCWVsc2UKLQkJCQlzb2NrX3Jlc2V0X2ZsYWcoc2ssIFNPQ0tfTE9DQUxST1VURSk7Ci0JCQlicmVhazsKLQkJY2FzZSBTT19CUk9BRENBU1Q6Ci0JCQlzb2NrX3ZhbGJvb2xfZmxhZyhzaywgU09DS19CUk9BRENBU1QsIHZhbGJvb2wpOwotCQkJYnJlYWs7Ci0JCWNhc2UgU09fU05EQlVGOgotCQkJLyogRG9uJ3QgZXJyb3Igb24gdGhpcyBCU0QgZG9lc24ndCBhbmQgaWYgeW91IHRoaW5rCi0JCQkgICBhYm91dCBpdCB0aGlzIGlzIHJpZ2h0LiBPdGhlcndpc2UgYXBwcyBoYXZlIHRvCi0JCQkgICBwbGF5ICdndWVzcyB0aGUgYmlnZ2VzdCBzaXplJyBnYW1lcy4gUkNWQlVGL1NOREJVRgotCQkJICAgYXJlIHRyZWF0ZWQgaW4gQlNEIGFzIGhpbnRzICovCisJc3dpdGNoKG9wdG5hbWUpIHsKKwljYXNlIFNPX0RFQlVHOgorCQlpZiAodmFsICYmICFjYXBhYmxlKENBUF9ORVRfQURNSU4pKSB7CisJCQlyZXQgPSAtRUFDQ0VTOworCQl9CisJCWVsc2UgaWYgKHZhbGJvb2wpCisJCQlzb2NrX3NldF9mbGFnKHNrLCBTT0NLX0RCRyk7CisJCWVsc2UKKwkJCXNvY2tfcmVzZXRfZmxhZyhzaywgU09DS19EQkcpOworCQlicmVhazsKKwljYXNlIFNPX1JFVVNFQUREUjoKKwkJc2stPnNrX3JldXNlID0gdmFsYm9vbDsKKwkJYnJlYWs7CisJY2FzZSBTT19UWVBFOgorCWNhc2UgU09fRVJST1I6CisJCXJldCA9IC1FTk9QUk9UT09QVDsKKwkJYnJlYWs7CisJY2FzZSBTT19ET05UUk9VVEU6CisJCWlmICh2YWxib29sKQorCQkJc29ja19zZXRfZmxhZyhzaywgU09DS19MT0NBTFJPVVRFKTsKKwkJZWxzZQorCQkJc29ja19yZXNldF9mbGFnKHNrLCBTT0NLX0xPQ0FMUk9VVEUpOworCQlicmVhazsKKwljYXNlIFNPX0JST0FEQ0FTVDoKKwkJc29ja192YWxib29sX2ZsYWcoc2ssIFNPQ0tfQlJPQURDQVNULCB2YWxib29sKTsKKwkJYnJlYWs7CisJY2FzZSBTT19TTkRCVUY6CisJCS8qIERvbid0IGVycm9yIG9uIHRoaXMgQlNEIGRvZXNuJ3QgYW5kIGlmIHlvdSB0aGluaworCQkgICBhYm91dCBpdCB0aGlzIGlzIHJpZ2h0LiBPdGhlcndpc2UgYXBwcyBoYXZlIHRvCisJCSAgIHBsYXkgJ2d1ZXNzIHRoZSBiaWdnZXN0IHNpemUnIGdhbWVzLiBSQ1ZCVUYvU05EQlVGCisJCSAgIGFyZSB0cmVhdGVkIGluIEJTRCBhcyBoaW50cyAqLwogCi0JCQlpZiAodmFsID4gc3lzY3RsX3dtZW1fbWF4KQotCQkJCXZhbCA9IHN5c2N0bF93bWVtX21heDsKKwkJaWYgKHZhbCA+IHN5c2N0bF93bWVtX21heCkKKwkJCXZhbCA9IHN5c2N0bF93bWVtX21heDsKIHNldF9zbmRidWY6Ci0JCQlzay0+c2tfdXNlcmxvY2tzIHw9IFNPQ0tfU05EQlVGX0xPQ0s7Ci0JCQlpZiAoKHZhbCAqIDIpIDwgU09DS19NSU5fU05EQlVGKQotCQkJCXNrLT5za19zbmRidWYgPSBTT0NLX01JTl9TTkRCVUY7Ci0JCQllbHNlCi0JCQkJc2stPnNrX3NuZGJ1ZiA9IHZhbCAqIDI7CisJCXNrLT5za191c2VybG9ja3MgfD0gU09DS19TTkRCVUZfTE9DSzsKKwkJaWYgKCh2YWwgKiAyKSA8IFNPQ0tfTUlOX1NOREJVRikKKwkJCXNrLT5za19zbmRidWYgPSBTT0NLX01JTl9TTkRCVUY7CisJCWVsc2UKKwkJCXNrLT5za19zbmRidWYgPSB2YWwgKiAyOwogCi0JCQkvKgotCQkJICoJV2FrZSB1cCBzZW5kaW5nIHRhc2tzIGlmIHdlCi0JCQkgKgl1cHBlZCB0aGUgdmFsdWUuCi0JCQkgKi8KLQkJCXNrLT5za193cml0ZV9zcGFjZShzayk7Ci0JCQlicmVhazsKKwkJLyoKKwkJICoJV2FrZSB1cCBzZW5kaW5nIHRhc2tzIGlmIHdlCisJCSAqCXVwcGVkIHRoZSB2YWx1ZS4KKwkJICovCisJCXNrLT5za193cml0ZV9zcGFjZShzayk7CisJCWJyZWFrOwogCi0JCWNhc2UgU09fU05EQlVGRk9SQ0U6Ci0JCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpIHsKLQkJCQlyZXQgPSAtRVBFUk07Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlnb3RvIHNldF9zbmRidWY7Ci0KLQkJY2FzZSBTT19SQ1ZCVUY6Ci0JCQkvKiBEb24ndCBlcnJvciBvbiB0aGlzIEJTRCBkb2Vzbid0IGFuZCBpZiB5b3UgdGhpbmsKLQkJCSAgIGFib3V0IGl0IHRoaXMgaXMgcmlnaHQuIE90aGVyd2lzZSBhcHBzIGhhdmUgdG8KLQkJCSAgIHBsYXkgJ2d1ZXNzIHRoZSBiaWdnZXN0IHNpemUnIGdhbWVzLiBSQ1ZCVUYvU05EQlVGCi0JCQkgICBhcmUgdHJlYXRlZCBpbiBCU0QgYXMgaGludHMgKi8KLQotCQkJaWYgKHZhbCA+IHN5c2N0bF9ybWVtX21heCkKLQkJCQl2YWwgPSBzeXNjdGxfcm1lbV9tYXg7Ci1zZXRfcmN2YnVmOgotCQkJc2stPnNrX3VzZXJsb2NrcyB8PSBTT0NLX1JDVkJVRl9MT0NLOwotCQkJLyoKLQkJCSAqIFdlIGRvdWJsZSBpdCBvbiB0aGUgd2F5IGluIHRvIGFjY291bnQgZm9yCi0JCQkgKiAic3RydWN0IHNrX2J1ZmYiIGV0Yy4gb3ZlcmhlYWQuICAgQXBwbGljYXRpb25zCi0JCQkgKiBhc3N1bWUgdGhhdCB0aGUgU09fUkNWQlVGIHNldHRpbmcgdGhleSBtYWtlIHdpbGwKLQkJCSAqIGFsbG93IHRoYXQgbXVjaCBhY3R1YWwgZGF0YSB0byBiZSByZWNlaXZlZCBvbiB0aGF0Ci0JCQkgKiBzb2NrZXQuCi0JCQkgKgotCQkJICogQXBwbGljYXRpb25zIGFyZSB1bmF3YXJlIHRoYXQgInN0cnVjdCBza19idWZmIiBhbmQKLQkJCSAqIG90aGVyIG92ZXJoZWFkcyBhbGxvY2F0ZSBmcm9tIHRoZSByZWNlaXZlIGJ1ZmZlcgotCQkJICogZHVyaW5nIHNvY2tldCBidWZmZXIgYWxsb2NhdGlvbi4KLQkJCSAqCi0JCQkgKiBBbmQgYWZ0ZXIgY29uc2lkZXJpbmcgdGhlIHBvc3NpYmxlIGFsdGVybmF0aXZlcywKLQkJCSAqIHJldHVybmluZyB0aGUgdmFsdWUgd2UgYWN0dWFsbHkgdXNlZCBpbiBnZXRzb2Nrb3B0Ci0JCQkgKiBpcyB0aGUgbW9zdCBkZXNpcmFibGUgYmVoYXZpb3IuCi0JCQkgKi8KLQkJCWlmICgodmFsICogMikgPCBTT0NLX01JTl9SQ1ZCVUYpCi0JCQkJc2stPnNrX3JjdmJ1ZiA9IFNPQ0tfTUlOX1JDVkJVRjsKLQkJCWVsc2UKLQkJCQlzay0+c2tfcmN2YnVmID0gdmFsICogMjsKLQkJCWJyZWFrOwotCi0JCWNhc2UgU09fUkNWQlVGRk9SQ0U6Ci0JCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpIHsKLQkJCQlyZXQgPSAtRVBFUk07Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlnb3RvIHNldF9yY3ZidWY7Ci0KLQkJY2FzZSBTT19LRUVQQUxJVkU6Ci0jaWZkZWYgQ09ORklHX0lORVQKLQkJCWlmIChzay0+c2tfcHJvdG9jb2wgPT0gSVBQUk9UT19UQ1ApCi0JCQkJdGNwX3NldF9rZWVwYWxpdmUoc2ssIHZhbGJvb2wpOwotI2VuZGlmCi0JCQlzb2NrX3ZhbGJvb2xfZmxhZyhzaywgU09DS19LRUVQT1BFTiwgdmFsYm9vbCk7Ci0JCQlicmVhazsKLQotCQljYXNlIFNPX09PQklOTElORToKLQkJCXNvY2tfdmFsYm9vbF9mbGFnKHNrLCBTT0NLX1VSR0lOTElORSwgdmFsYm9vbCk7Ci0JCQlicmVhazsKLQotCQljYXNlIFNPX05PX0NIRUNLOgotCQkJc2stPnNrX25vX2NoZWNrID0gdmFsYm9vbDsKLQkJCWJyZWFrOwotCi0JCWNhc2UgU09fUFJJT1JJVFk6Ci0JCQlpZiAoKHZhbCA+PSAwICYmIHZhbCA8PSA2KSB8fCBjYXBhYmxlKENBUF9ORVRfQURNSU4pKQotCQkJCXNrLT5za19wcmlvcml0eSA9IHZhbDsKLQkJCWVsc2UKLQkJCQlyZXQgPSAtRVBFUk07Ci0JCQlicmVhazsKLQotCQljYXNlIFNPX0xJTkdFUjoKLQkJCWlmKG9wdGxlbjxzaXplb2YobGluZykpIHsKLQkJCQlyZXQgPSAtRUlOVkFMOwkvKiAxMDAzLjFnICovCi0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoY29weV9mcm9tX3VzZXIoJmxpbmcsb3B0dmFsLHNpemVvZihsaW5nKSkpIHsKLQkJCQlyZXQgPSAtRUZBVUxUOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKCFsaW5nLmxfb25vZmYpCi0JCQkJc29ja19yZXNldF9mbGFnKHNrLCBTT0NLX0xJTkdFUik7Ci0JCQllbHNlIHsKLSNpZiAoQklUU19QRVJfTE9ORyA9PSAzMikKLQkJCQlpZiAoKHVuc2lnbmVkIGludClsaW5nLmxfbGluZ2VyID49IE1BWF9TQ0hFRFVMRV9USU1FT1VUL0haKQotCQkJCQlzay0+c2tfbGluZ2VydGltZSA9IE1BWF9TQ0hFRFVMRV9USU1FT1VUOwotCQkJCWVsc2UKLSNlbmRpZgotCQkJCQlzay0+c2tfbGluZ2VydGltZSA9ICh1bnNpZ25lZCBpbnQpbGluZy5sX2xpbmdlciAqIEhaOwotCQkJCXNvY2tfc2V0X2ZsYWcoc2ssIFNPQ0tfTElOR0VSKTsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgU09fQlNEQ09NUEFUOgotCQkJc29ja193YXJuX29ic29sZXRlX2JzZGlzbSgic2V0c29ja29wdCIpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBTT19QQVNTQ1JFRDoKLQkJCWlmICh2YWxib29sKQotCQkJCXNldF9iaXQoU09DS19QQVNTQ1JFRCwgJnNvY2stPmZsYWdzKTsKLQkJCWVsc2UKLQkJCQljbGVhcl9iaXQoU09DS19QQVNTQ1JFRCwgJnNvY2stPmZsYWdzKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgU09fVElNRVNUQU1QOgotCQkJaWYgKHZhbGJvb2wpICB7Ci0JCQkJc29ja19zZXRfZmxhZyhzaywgU09DS19SQ1ZUU1RBTVApOwotCQkJCXNvY2tfZW5hYmxlX3RpbWVzdGFtcChzayk7Ci0JCQl9IGVsc2UKLQkJCQlzb2NrX3Jlc2V0X2ZsYWcoc2ssIFNPQ0tfUkNWVFNUQU1QKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgU09fUkNWTE9XQVQ6Ci0JCQlpZiAodmFsIDwgMCkKLQkJCQl2YWwgPSBJTlRfTUFYOwotCQkJc2stPnNrX3Jjdmxvd2F0ID0gdmFsID8gOiAxOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBTT19SQ1ZUSU1FTzoKLQkJCXJldCA9IHNvY2tfc2V0X3RpbWVvdXQoJnNrLT5za19yY3Z0aW1lbywgb3B0dmFsLCBvcHRsZW4pOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBTT19TTkRUSU1FTzoKLQkJCXJldCA9IHNvY2tfc2V0X3RpbWVvdXQoJnNrLT5za19zbmR0aW1lbywgb3B0dmFsLCBvcHRsZW4pOwotCQkJYnJlYWs7Ci0KLSNpZmRlZiBDT05GSUdfTkVUREVWSUNFUwotCQljYXNlIFNPX0JJTkRUT0RFVklDRToKLQkJewotCQkJY2hhciBkZXZuYW1lW0lGTkFNU0laXTsKLQotCQkJLyogU29ycnkuLi4gKi8KLQkJCWlmICghY2FwYWJsZShDQVBfTkVUX1JBVykpIHsKLQkJCQlyZXQgPSAtRVBFUk07Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCS8qIEJpbmQgdGhpcyBzb2NrZXQgdG8gYSBwYXJ0aWN1bGFyIGRldmljZSBsaWtlICJldGgwIiwKLQkJCSAqIGFzIHNwZWNpZmllZCBpbiB0aGUgcGFzc2VkIGludGVyZmFjZSBuYW1lLiBJZiB0aGUKLQkJCSAqIG5hbWUgaXMgIiIgb3IgdGhlIG9wdGlvbiBsZW5ndGggaXMgemVybyB0aGUgc29ja2V0Ci0JCQkgKiBpcyBub3QgYm91bmQuCi0JCQkgKi8KLQotCQkJaWYgKCF2YWxib29sKSB7Ci0JCQkJc2stPnNrX2JvdW5kX2Rldl9pZiA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChvcHRsZW4gPiBJRk5BTVNJWiAtIDEpCi0JCQkJCW9wdGxlbiA9IElGTkFNU0laIC0gMTsKLQkJCQltZW1zZXQoZGV2bmFtZSwgMCwgc2l6ZW9mKGRldm5hbWUpKTsKLQkJCQlpZiAoY29weV9mcm9tX3VzZXIoZGV2bmFtZSwgb3B0dmFsLCBvcHRsZW4pKSB7Ci0JCQkJCXJldCA9IC1FRkFVTFQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCS8qIFJlbW92ZSBhbnkgY2FjaGVkIHJvdXRlIGZvciB0aGlzIHNvY2tldC4gKi8KLQkJCQlza19kc3RfcmVzZXQoc2spOwotCi0JCQkJaWYgKGRldm5hbWVbMF0gPT0gJ1wwJykgewotCQkJCQlzay0+c2tfYm91bmRfZGV2X2lmID0gMDsKLQkJCQl9IGVsc2UgewotCQkJCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2dldF9ieV9uYW1lKGRldm5hbWUpOwotCQkJCQlpZiAoIWRldikgewotCQkJCQkJcmV0ID0gLUVOT0RFVjsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCXNrLT5za19ib3VuZF9kZXZfaWYgPSBkZXYtPmlmaW5kZXg7Ci0JCQkJCWRldl9wdXQoZGV2KTsKLQkJCQl9Ci0JCQl9CisJY2FzZSBTT19TTkRCVUZGT1JDRToKKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKSB7CisJCQlyZXQgPSAtRVBFUk07CiAJCQlicmVhazsKIAkJfQorCQlnb3RvIHNldF9zbmRidWY7CisKKwljYXNlIFNPX1JDVkJVRjoKKwkJLyogRG9uJ3QgZXJyb3Igb24gdGhpcyBCU0QgZG9lc24ndCBhbmQgaWYgeW91IHRoaW5rCisJCSAgIGFib3V0IGl0IHRoaXMgaXMgcmlnaHQuIE90aGVyd2lzZSBhcHBzIGhhdmUgdG8KKwkJICAgcGxheSAnZ3Vlc3MgdGhlIGJpZ2dlc3Qgc2l6ZScgZ2FtZXMuIFJDVkJVRi9TTkRCVUYKKwkJICAgYXJlIHRyZWF0ZWQgaW4gQlNEIGFzIGhpbnRzICovCisKKwkJaWYgKHZhbCA+IHN5c2N0bF9ybWVtX21heCkKKwkJCXZhbCA9IHN5c2N0bF9ybWVtX21heDsKK3NldF9yY3ZidWY6CisJCXNrLT5za191c2VybG9ja3MgfD0gU09DS19SQ1ZCVUZfTE9DSzsKKwkJLyoKKwkJICogV2UgZG91YmxlIGl0IG9uIHRoZSB3YXkgaW4gdG8gYWNjb3VudCBmb3IKKwkJICogInN0cnVjdCBza19idWZmIiBldGMuIG92ZXJoZWFkLiAgIEFwcGxpY2F0aW9ucworCQkgKiBhc3N1bWUgdGhhdCB0aGUgU09fUkNWQlVGIHNldHRpbmcgdGhleSBtYWtlIHdpbGwKKwkJICogYWxsb3cgdGhhdCBtdWNoIGFjdHVhbCBkYXRhIHRvIGJlIHJlY2VpdmVkIG9uIHRoYXQKKwkJICogc29ja2V0LgorCQkgKgorCQkgKiBBcHBsaWNhdGlvbnMgYXJlIHVuYXdhcmUgdGhhdCAic3RydWN0IHNrX2J1ZmYiIGFuZAorCQkgKiBvdGhlciBvdmVyaGVhZHMgYWxsb2NhdGUgZnJvbSB0aGUgcmVjZWl2ZSBidWZmZXIKKwkJICogZHVyaW5nIHNvY2tldCBidWZmZXIgYWxsb2NhdGlvbi4KKwkJICoKKwkJICogQW5kIGFmdGVyIGNvbnNpZGVyaW5nIHRoZSBwb3NzaWJsZSBhbHRlcm5hdGl2ZXMsCisJCSAqIHJldHVybmluZyB0aGUgdmFsdWUgd2UgYWN0dWFsbHkgdXNlZCBpbiBnZXRzb2Nrb3B0CisJCSAqIGlzIHRoZSBtb3N0IGRlc2lyYWJsZSBiZWhhdmlvci4KKwkJICovCisJCWlmICgodmFsICogMikgPCBTT0NLX01JTl9SQ1ZCVUYpCisJCQlzay0+c2tfcmN2YnVmID0gU09DS19NSU5fUkNWQlVGOworCQllbHNlCisJCQlzay0+c2tfcmN2YnVmID0gdmFsICogMjsKKwkJYnJlYWs7CisKKwljYXNlIFNPX1JDVkJVRkZPUkNFOgorCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpIHsKKwkJCXJldCA9IC1FUEVSTTsKKwkJCWJyZWFrOworCQl9CisJCWdvdG8gc2V0X3JjdmJ1ZjsKKworCWNhc2UgU09fS0VFUEFMSVZFOgorI2lmZGVmIENPTkZJR19JTkVUCisJCWlmIChzay0+c2tfcHJvdG9jb2wgPT0gSVBQUk9UT19UQ1ApCisJCQl0Y3Bfc2V0X2tlZXBhbGl2ZShzaywgdmFsYm9vbCk7CisjZW5kaWYKKwkJc29ja192YWxib29sX2ZsYWcoc2ssIFNPQ0tfS0VFUE9QRU4sIHZhbGJvb2wpOworCQlicmVhazsKKworCWNhc2UgU09fT09CSU5MSU5FOgorCQlzb2NrX3ZhbGJvb2xfZmxhZyhzaywgU09DS19VUkdJTkxJTkUsIHZhbGJvb2wpOworCQlicmVhazsKKworCWNhc2UgU09fTk9fQ0hFQ0s6CisJCXNrLT5za19ub19jaGVjayA9IHZhbGJvb2w7CisJCWJyZWFrOworCisJY2FzZSBTT19QUklPUklUWToKKwkJaWYgKCh2YWwgPj0gMCAmJiB2YWwgPD0gNikgfHwgY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXNrLT5za19wcmlvcml0eSA9IHZhbDsKKwkJZWxzZQorCQkJcmV0ID0gLUVQRVJNOworCQlicmVhazsKKworCWNhc2UgU09fTElOR0VSOgorCQlpZiAob3B0bGVuIDwgc2l6ZW9mKGxpbmcpKSB7CisJCQlyZXQgPSAtRUlOVkFMOwkvKiAxMDAzLjFnICovCisJCQlicmVhazsKKwkJfQorCQlpZiAoY29weV9mcm9tX3VzZXIoJmxpbmcsb3B0dmFsLHNpemVvZihsaW5nKSkpIHsKKwkJCXJldCA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCQlpZiAoIWxpbmcubF9vbm9mZikKKwkJCXNvY2tfcmVzZXRfZmxhZyhzaywgU09DS19MSU5HRVIpOworCQllbHNlIHsKKyNpZiAoQklUU19QRVJfTE9ORyA9PSAzMikKKwkJCWlmICgodW5zaWduZWQgaW50KWxpbmcubF9saW5nZXIgPj0gTUFYX1NDSEVEVUxFX1RJTUVPVVQvSFopCisJCQkJc2stPnNrX2xpbmdlcnRpbWUgPSBNQVhfU0NIRURVTEVfVElNRU9VVDsKKwkJCWVsc2UKKyNlbmRpZgorCQkJCXNrLT5za19saW5nZXJ0aW1lID0gKHVuc2lnbmVkIGludClsaW5nLmxfbGluZ2VyICogSFo7CisJCQlzb2NrX3NldF9mbGFnKHNrLCBTT0NLX0xJTkdFUik7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFNPX0JTRENPTVBBVDoKKwkJc29ja193YXJuX29ic29sZXRlX2JzZGlzbSgic2V0c29ja29wdCIpOworCQlicmVhazsKKworCWNhc2UgU09fUEFTU0NSRUQ6CisJCWlmICh2YWxib29sKQorCQkJc2V0X2JpdChTT0NLX1BBU1NDUkVELCAmc29jay0+ZmxhZ3MpOworCQllbHNlCisJCQljbGVhcl9iaXQoU09DS19QQVNTQ1JFRCwgJnNvY2stPmZsYWdzKTsKKwkJYnJlYWs7CisKKwljYXNlIFNPX1RJTUVTVEFNUDoKKwljYXNlIFNPX1RJTUVTVEFNUE5TOgorCQlpZiAodmFsYm9vbCkgIHsKKwkJCWlmIChvcHRuYW1lID09IFNPX1RJTUVTVEFNUCkKKwkJCQlzb2NrX3Jlc2V0X2ZsYWcoc2ssIFNPQ0tfUkNWVFNUQU1QTlMpOworCQkJZWxzZQorCQkJCXNvY2tfc2V0X2ZsYWcoc2ssIFNPQ0tfUkNWVFNUQU1QTlMpOworCQkJc29ja19zZXRfZmxhZyhzaywgU09DS19SQ1ZUU1RBTVApOworCQkJc29ja19lbmFibGVfdGltZXN0YW1wKHNrKTsKKwkJfSBlbHNlIHsKKwkJCXNvY2tfcmVzZXRfZmxhZyhzaywgU09DS19SQ1ZUU1RBTVApOworCQkJc29ja19yZXNldF9mbGFnKHNrLCBTT0NLX1JDVlRTVEFNUE5TKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgU09fUkNWTE9XQVQ6CisJCWlmICh2YWwgPCAwKQorCQkJdmFsID0gSU5UX01BWDsKKwkJc2stPnNrX3Jjdmxvd2F0ID0gdmFsID8gOiAxOworCQlicmVhazsKKworCWNhc2UgU09fUkNWVElNRU86CisJCXJldCA9IHNvY2tfc2V0X3RpbWVvdXQoJnNrLT5za19yY3Z0aW1lbywgb3B0dmFsLCBvcHRsZW4pOworCQlicmVhazsKKworCWNhc2UgU09fU05EVElNRU86CisJCXJldCA9IHNvY2tfc2V0X3RpbWVvdXQoJnNrLT5za19zbmR0aW1lbywgb3B0dmFsLCBvcHRsZW4pOworCQlicmVhazsKKworI2lmZGVmIENPTkZJR19ORVRERVZJQ0VTCisJY2FzZSBTT19CSU5EVE9ERVZJQ0U6CisJeworCQljaGFyIGRldm5hbWVbSUZOQU1TSVpdOworCisJCS8qIFNvcnJ5Li4uICovCisJCWlmICghY2FwYWJsZShDQVBfTkVUX1JBVykpIHsKKwkJCXJldCA9IC1FUEVSTTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogQmluZCB0aGlzIHNvY2tldCB0byBhIHBhcnRpY3VsYXIgZGV2aWNlIGxpa2UgImV0aDAiLAorCQkgKiBhcyBzcGVjaWZpZWQgaW4gdGhlIHBhc3NlZCBpbnRlcmZhY2UgbmFtZS4gSWYgdGhlCisJCSAqIG5hbWUgaXMgIiIgb3IgdGhlIG9wdGlvbiBsZW5ndGggaXMgemVybyB0aGUgc29ja2V0CisJCSAqIGlzIG5vdCBib3VuZC4KKwkJICovCisKKwkJaWYgKCF2YWxib29sKSB7CisJCQlzay0+c2tfYm91bmRfZGV2X2lmID0gMDsKKwkJfSBlbHNlIHsKKwkJCWlmIChvcHRsZW4gPiBJRk5BTVNJWiAtIDEpCisJCQkJb3B0bGVuID0gSUZOQU1TSVogLSAxOworCQkJbWVtc2V0KGRldm5hbWUsIDAsIHNpemVvZihkZXZuYW1lKSk7CisJCQlpZiAoY29weV9mcm9tX3VzZXIoZGV2bmFtZSwgb3B0dmFsLCBvcHRsZW4pKSB7CisJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLyogUmVtb3ZlIGFueSBjYWNoZWQgcm91dGUgZm9yIHRoaXMgc29ja2V0LiAqLworCQkJc2tfZHN0X3Jlc2V0KHNrKTsKKworCQkJaWYgKGRldm5hbWVbMF0gPT0gJ1wwJykgeworCQkJCXNrLT5za19ib3VuZF9kZXZfaWYgPSAwOworCQkJfSBlbHNlIHsKKwkJCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2dldF9ieV9uYW1lKGRldm5hbWUpOworCQkJCWlmICghZGV2KSB7CisJCQkJCXJldCA9IC1FTk9ERVY7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlzay0+c2tfYm91bmRfZGV2X2lmID0gZGV2LT5pZmluZGV4OworCQkJCWRldl9wdXQoZGV2KTsKKwkJCX0KKwkJfQorCQlicmVhazsKKwl9CiAjZW5kaWYKIAogCi0JCWNhc2UgU09fQVRUQUNIX0ZJTFRFUjoKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCQlpZiAob3B0bGVuID09IHNpemVvZihzdHJ1Y3Qgc29ja19mcHJvZykpIHsKLQkJCQlzdHJ1Y3Qgc29ja19mcHJvZyBmcHJvZzsKKwljYXNlIFNPX0FUVEFDSF9GSUxURVI6CisJCXJldCA9IC1FSU5WQUw7CisJCWlmIChvcHRsZW4gPT0gc2l6ZW9mKHN0cnVjdCBzb2NrX2Zwcm9nKSkgeworCQkJc3RydWN0IHNvY2tfZnByb2cgZnByb2c7CiAKLQkJCQlyZXQgPSAtRUZBVUxUOwotCQkJCWlmIChjb3B5X2Zyb21fdXNlcigmZnByb2csIG9wdHZhbCwgc2l6ZW9mKGZwcm9nKSkpCi0JCQkJCWJyZWFrOwotCi0JCQkJcmV0ID0gc2tfYXR0YWNoX2ZpbHRlcigmZnByb2csIHNrKTsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgU09fREVUQUNIX0ZJTFRFUjoKLQkJCXJjdV9yZWFkX2xvY2tfYmgoKTsKLQkJCWZpbHRlciA9IHJjdV9kZXJlZmVyZW5jZShzay0+c2tfZmlsdGVyKTsKLQkJCWlmIChmaWx0ZXIpIHsKLQkJCQlyY3VfYXNzaWduX3BvaW50ZXIoc2stPnNrX2ZpbHRlciwgTlVMTCk7Ci0JCQkJc2tfZmlsdGVyX3JlbGVhc2Uoc2ssIGZpbHRlcik7Ci0JCQkJcmN1X3JlYWRfdW5sb2NrX2JoKCk7CisJCQlyZXQgPSAtRUZBVUxUOworCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZmcHJvZywgb3B0dmFsLCBzaXplb2YoZnByb2cpKSkKIAkJCQlicmVhazsKLQkJCX0KLQkJCXJjdV9yZWFkX3VubG9ja19iaCgpOwotCQkJcmV0ID0gLUVOT05FVDsKLQkJCWJyZWFrOwogCi0JCWNhc2UgU09fUEFTU1NFQzoKLQkJCWlmICh2YWxib29sKQotCQkJCXNldF9iaXQoU09DS19QQVNTU0VDLCAmc29jay0+ZmxhZ3MpOwotCQkJZWxzZQotCQkJCWNsZWFyX2JpdChTT0NLX1BBU1NTRUMsICZzb2NrLT5mbGFncyk7CisJCQlyZXQgPSBza19hdHRhY2hfZmlsdGVyKCZmcHJvZywgc2spOworCQl9CisJCWJyZWFrOworCisJY2FzZSBTT19ERVRBQ0hfRklMVEVSOgorCQlyY3VfcmVhZF9sb2NrX2JoKCk7CisJCWZpbHRlciA9IHJjdV9kZXJlZmVyZW5jZShzay0+c2tfZmlsdGVyKTsKKwkJaWYgKGZpbHRlcikgeworCQkJcmN1X2Fzc2lnbl9wb2ludGVyKHNrLT5za19maWx0ZXIsIE5VTEwpOworCQkJc2tfZmlsdGVyX3JlbGVhc2Uoc2ssIGZpbHRlcik7CisJCQlyY3VfcmVhZF91bmxvY2tfYmgoKTsKIAkJCWJyZWFrOworCQl9CisJCXJjdV9yZWFkX3VubG9ja19iaCgpOworCQlyZXQgPSAtRU5PTkVUOworCQlicmVhazsKKworCWNhc2UgU09fUEFTU1NFQzoKKwkJaWYgKHZhbGJvb2wpCisJCQlzZXRfYml0KFNPQ0tfUEFTU1NFQywgJnNvY2stPmZsYWdzKTsKKwkJZWxzZQorCQkJY2xlYXJfYml0KFNPQ0tfUEFTU1NFQywgJnNvY2stPmZsYWdzKTsKKwkJYnJlYWs7CiAKIAkJLyogV2UgaW1wbGVtZW50IHRoZSBTT19TTkRMT1dBVCBldGMgdG8KIAkJICAgbm90IGJlIHNldHRhYmxlICgxMDAzLjFnIDUuMykgKi8KLQkJZGVmYXVsdDoKLQkJCXJldCA9IC1FTk9QUk9UT09QVDsKLQkJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FTk9QUk9UT09QVDsKKwkJYnJlYWs7CiAJfQogCXJlbGVhc2Vfc29jayhzayk7CiAJcmV0dXJuIHJldDsKQEAgLTY0MSw4ICs2NDgsNyBAQAogewogCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOwogCi0JdW5pb24KLQl7CisJdW5pb24gewogCQlpbnQgdmFsOwogCQlzdHJ1Y3QgbGluZ2VyIGxpbmc7CiAJCXN0cnVjdCB0aW1ldmFsIHRtOwpAQCAtNjUxLDE0OCArNjU3LDE1MyBAQAogCXVuc2lnbmVkIGludCBsdiA9IHNpemVvZihpbnQpOwogCWludCBsZW47CiAKLQlpZihnZXRfdXNlcihsZW4sb3B0bGVuKSkKKwlpZiAoZ2V0X3VzZXIobGVuLCBvcHRsZW4pKQogCQlyZXR1cm4gLUVGQVVMVDsKLQlpZihsZW4gPCAwKQorCWlmIChsZW4gPCAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXN3aXRjaChvcHRuYW1lKQotCXsKLQkJY2FzZSBTT19ERUJVRzoKLQkJCXYudmFsID0gc29ja19mbGFnKHNrLCBTT0NLX0RCRyk7Ci0JCQlicmVhazsKKwlzd2l0Y2gob3B0bmFtZSkgeworCWNhc2UgU09fREVCVUc6CisJCXYudmFsID0gc29ja19mbGFnKHNrLCBTT0NLX0RCRyk7CisJCWJyZWFrOwogCi0JCWNhc2UgU09fRE9OVFJPVVRFOgotCQkJdi52YWwgPSBzb2NrX2ZsYWcoc2ssIFNPQ0tfTE9DQUxST1VURSk7Ci0JCQlicmVhazsKKwljYXNlIFNPX0RPTlRST1VURToKKwkJdi52YWwgPSBzb2NrX2ZsYWcoc2ssIFNPQ0tfTE9DQUxST1VURSk7CisJCWJyZWFrOwogCi0JCWNhc2UgU09fQlJPQURDQVNUOgotCQkJdi52YWwgPSAhIXNvY2tfZmxhZyhzaywgU09DS19CUk9BRENBU1QpOwotCQkJYnJlYWs7CisJY2FzZSBTT19CUk9BRENBU1Q6CisJCXYudmFsID0gISFzb2NrX2ZsYWcoc2ssIFNPQ0tfQlJPQURDQVNUKTsKKwkJYnJlYWs7CiAKLQkJY2FzZSBTT19TTkRCVUY6Ci0JCQl2LnZhbCA9IHNrLT5za19zbmRidWY7Ci0JCQlicmVhazsKKwljYXNlIFNPX1NOREJVRjoKKwkJdi52YWwgPSBzay0+c2tfc25kYnVmOworCQlicmVhazsKIAotCQljYXNlIFNPX1JDVkJVRjoKLQkJCXYudmFsID0gc2stPnNrX3JjdmJ1ZjsKLQkJCWJyZWFrOworCWNhc2UgU09fUkNWQlVGOgorCQl2LnZhbCA9IHNrLT5za19yY3ZidWY7CisJCWJyZWFrOwogCi0JCWNhc2UgU09fUkVVU0VBRERSOgotCQkJdi52YWwgPSBzay0+c2tfcmV1c2U7Ci0JCQlicmVhazsKKwljYXNlIFNPX1JFVVNFQUREUjoKKwkJdi52YWwgPSBzay0+c2tfcmV1c2U7CisJCWJyZWFrOwogCi0JCWNhc2UgU09fS0VFUEFMSVZFOgotCQkJdi52YWwgPSAhIXNvY2tfZmxhZyhzaywgU09DS19LRUVQT1BFTik7Ci0JCQlicmVhazsKKwljYXNlIFNPX0tFRVBBTElWRToKKwkJdi52YWwgPSAhIXNvY2tfZmxhZyhzaywgU09DS19LRUVQT1BFTik7CisJCWJyZWFrOwogCi0JCWNhc2UgU09fVFlQRToKLQkJCXYudmFsID0gc2stPnNrX3R5cGU7Ci0JCQlicmVhazsKKwljYXNlIFNPX1RZUEU6CisJCXYudmFsID0gc2stPnNrX3R5cGU7CisJCWJyZWFrOwogCi0JCWNhc2UgU09fRVJST1I6Ci0JCQl2LnZhbCA9IC1zb2NrX2Vycm9yKHNrKTsKLQkJCWlmKHYudmFsPT0wKQotCQkJCXYudmFsID0geGNoZygmc2stPnNrX2Vycl9zb2Z0LCAwKTsKLQkJCWJyZWFrOworCWNhc2UgU09fRVJST1I6CisJCXYudmFsID0gLXNvY2tfZXJyb3Ioc2spOworCQlpZiAodi52YWw9PTApCisJCQl2LnZhbCA9IHhjaGcoJnNrLT5za19lcnJfc29mdCwgMCk7CisJCWJyZWFrOwogCi0JCWNhc2UgU09fT09CSU5MSU5FOgotCQkJdi52YWwgPSAhIXNvY2tfZmxhZyhzaywgU09DS19VUkdJTkxJTkUpOwotCQkJYnJlYWs7CisJY2FzZSBTT19PT0JJTkxJTkU6CisJCXYudmFsID0gISFzb2NrX2ZsYWcoc2ssIFNPQ0tfVVJHSU5MSU5FKTsKKwkJYnJlYWs7CiAKLQkJY2FzZSBTT19OT19DSEVDSzoKLQkJCXYudmFsID0gc2stPnNrX25vX2NoZWNrOwotCQkJYnJlYWs7CisJY2FzZSBTT19OT19DSEVDSzoKKwkJdi52YWwgPSBzay0+c2tfbm9fY2hlY2s7CisJCWJyZWFrOwogCi0JCWNhc2UgU09fUFJJT1JJVFk6Ci0JCQl2LnZhbCA9IHNrLT5za19wcmlvcml0eTsKLQkJCWJyZWFrOworCWNhc2UgU09fUFJJT1JJVFk6CisJCXYudmFsID0gc2stPnNrX3ByaW9yaXR5OworCQlicmVhazsKIAotCQljYXNlIFNPX0xJTkdFUjoKLQkJCWx2CQk9IHNpemVvZih2LmxpbmcpOwotCQkJdi5saW5nLmxfb25vZmYJPSAhIXNvY2tfZmxhZyhzaywgU09DS19MSU5HRVIpOwotCQkJdi5saW5nLmxfbGluZ2VyCT0gc2stPnNrX2xpbmdlcnRpbWUgLyBIWjsKLQkJCWJyZWFrOworCWNhc2UgU09fTElOR0VSOgorCQlsdgkJPSBzaXplb2Yodi5saW5nKTsKKwkJdi5saW5nLmxfb25vZmYJPSAhIXNvY2tfZmxhZyhzaywgU09DS19MSU5HRVIpOworCQl2LmxpbmcubF9saW5nZXIJPSBzay0+c2tfbGluZ2VydGltZSAvIEhaOworCQlicmVhazsKIAotCQljYXNlIFNPX0JTRENPTVBBVDoKLQkJCXNvY2tfd2Fybl9vYnNvbGV0ZV9ic2Rpc20oImdldHNvY2tvcHQiKTsKLQkJCWJyZWFrOworCWNhc2UgU09fQlNEQ09NUEFUOgorCQlzb2NrX3dhcm5fb2Jzb2xldGVfYnNkaXNtKCJnZXRzb2Nrb3B0Iik7CisJCWJyZWFrOwogCi0JCWNhc2UgU09fVElNRVNUQU1QOgotCQkJdi52YWwgPSBzb2NrX2ZsYWcoc2ssIFNPQ0tfUkNWVFNUQU1QKTsKLQkJCWJyZWFrOworCWNhc2UgU09fVElNRVNUQU1QOgorCQl2LnZhbCA9IHNvY2tfZmxhZyhzaywgU09DS19SQ1ZUU1RBTVApICYmCisJCQkJIXNvY2tfZmxhZyhzaywgU09DS19SQ1ZUU1RBTVBOUyk7CisJCWJyZWFrOwogCi0JCWNhc2UgU09fUkNWVElNRU86Ci0JCQlsdj1zaXplb2Yoc3RydWN0IHRpbWV2YWwpOwotCQkJaWYgKHNrLT5za19yY3Z0aW1lbyA9PSBNQVhfU0NIRURVTEVfVElNRU9VVCkgewotCQkJCXYudG0udHZfc2VjID0gMDsKLQkJCQl2LnRtLnR2X3VzZWMgPSAwOwotCQkJfSBlbHNlIHsKLQkJCQl2LnRtLnR2X3NlYyA9IHNrLT5za19yY3Z0aW1lbyAvIEhaOwotCQkJCXYudG0udHZfdXNlYyA9ICgoc2stPnNrX3JjdnRpbWVvICUgSFopICogMTAwMDAwMCkgLyBIWjsKLQkJCX0KLQkJCWJyZWFrOworCWNhc2UgU09fVElNRVNUQU1QTlM6CisJCXYudmFsID0gc29ja19mbGFnKHNrLCBTT0NLX1JDVlRTVEFNUE5TKTsKKwkJYnJlYWs7CiAKLQkJY2FzZSBTT19TTkRUSU1FTzoKLQkJCWx2PXNpemVvZihzdHJ1Y3QgdGltZXZhbCk7Ci0JCQlpZiAoc2stPnNrX3NuZHRpbWVvID09IE1BWF9TQ0hFRFVMRV9USU1FT1VUKSB7Ci0JCQkJdi50bS50dl9zZWMgPSAwOwotCQkJCXYudG0udHZfdXNlYyA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCXYudG0udHZfc2VjID0gc2stPnNrX3NuZHRpbWVvIC8gSFo7Ci0JCQkJdi50bS50dl91c2VjID0gKChzay0+c2tfc25kdGltZW8gJSBIWikgKiAxMDAwMDAwKSAvIEhaOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBTT19SQ1ZMT1dBVDoKLQkJCXYudmFsID0gc2stPnNrX3Jjdmxvd2F0OwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBTT19TTkRMT1dBVDoKLQkJCXYudmFsPTE7Ci0JCQlicmVhazsKLQotCQljYXNlIFNPX1BBU1NDUkVEOgotCQkJdi52YWwgPSB0ZXN0X2JpdChTT0NLX1BBU1NDUkVELCAmc29jay0+ZmxhZ3MpID8gMSA6IDA7Ci0JCQlicmVhazsKLQotCQljYXNlIFNPX1BFRVJDUkVEOgotCQkJaWYgKGxlbiA+IHNpemVvZihzay0+c2tfcGVlcmNyZWQpKQotCQkJCWxlbiA9IHNpemVvZihzay0+c2tfcGVlcmNyZWQpOwotCQkJaWYgKGNvcHlfdG9fdXNlcihvcHR2YWwsICZzay0+c2tfcGVlcmNyZWQsIGxlbikpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQlnb3RvIGxlbm91dDsKLQotCQljYXNlIFNPX1BFRVJOQU1FOgotCQl7Ci0JCQljaGFyIGFkZHJlc3NbMTI4XTsKLQotCQkJaWYgKHNvY2stPm9wcy0+Z2V0bmFtZShzb2NrLCAoc3RydWN0IHNvY2thZGRyICopYWRkcmVzcywgJmx2LCAyKSkKLQkJCQlyZXR1cm4gLUVOT1RDT05OOwotCQkJaWYgKGx2IDwgbGVuKQotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJaWYgKGNvcHlfdG9fdXNlcihvcHR2YWwsIGFkZHJlc3MsIGxlbikpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQlnb3RvIGxlbm91dDsKKwljYXNlIFNPX1JDVlRJTUVPOgorCQlsdj1zaXplb2Yoc3RydWN0IHRpbWV2YWwpOworCQlpZiAoc2stPnNrX3JjdnRpbWVvID09IE1BWF9TQ0hFRFVMRV9USU1FT1VUKSB7CisJCQl2LnRtLnR2X3NlYyA9IDA7CisJCQl2LnRtLnR2X3VzZWMgPSAwOworCQl9IGVsc2UgeworCQkJdi50bS50dl9zZWMgPSBzay0+c2tfcmN2dGltZW8gLyBIWjsKKwkJCXYudG0udHZfdXNlYyA9ICgoc2stPnNrX3JjdnRpbWVvICUgSFopICogMTAwMDAwMCkgLyBIWjsKIAkJfQorCQlicmVhazsKIAotCQkvKiBEdWJpb3VzIEJTRCB0aGluZy4uLiBQcm9iYWJseSBub2JvZHkgZXZlbiB1c2VzIGl0LCBidXQKLQkJICogdGhlIFVOSVggc3RhbmRhcmQgd2FudHMgaXQgZm9yIHdoYXRldmVyIHJlYXNvbi4uLiAtRGF2ZU0KLQkJICovCi0JCWNhc2UgU09fQUNDRVBUQ09OTjoKLQkJCXYudmFsID0gc2stPnNrX3N0YXRlID09IFRDUF9MSVNURU47Ci0JCQlicmVhazsKKwljYXNlIFNPX1NORFRJTUVPOgorCQlsdj1zaXplb2Yoc3RydWN0IHRpbWV2YWwpOworCQlpZiAoc2stPnNrX3NuZHRpbWVvID09IE1BWF9TQ0hFRFVMRV9USU1FT1VUKSB7CisJCQl2LnRtLnR2X3NlYyA9IDA7CisJCQl2LnRtLnR2X3VzZWMgPSAwOworCQl9IGVsc2UgeworCQkJdi50bS50dl9zZWMgPSBzay0+c2tfc25kdGltZW8gLyBIWjsKKwkJCXYudG0udHZfdXNlYyA9ICgoc2stPnNrX3NuZHRpbWVvICUgSFopICogMTAwMDAwMCkgLyBIWjsKKwkJfQorCQlicmVhazsKIAotCQljYXNlIFNPX1BBU1NTRUM6Ci0JCQl2LnZhbCA9IHRlc3RfYml0KFNPQ0tfUEFTU1NFQywgJnNvY2stPmZsYWdzKSA/IDEgOiAwOwotCQkJYnJlYWs7CisJY2FzZSBTT19SQ1ZMT1dBVDoKKwkJdi52YWwgPSBzay0+c2tfcmN2bG93YXQ7CisJCWJyZWFrOwogCi0JCWNhc2UgU09fUEVFUlNFQzoKLQkJCXJldHVybiBzZWN1cml0eV9zb2NrZXRfZ2V0cGVlcnNlY19zdHJlYW0oc29jaywgb3B0dmFsLCBvcHRsZW4sIGxlbik7CisJY2FzZSBTT19TTkRMT1dBVDoKKwkJdi52YWw9MTsKKwkJYnJlYWs7CiAKLQkJZGVmYXVsdDoKLQkJCXJldHVybigtRU5PUFJPVE9PUFQpOworCWNhc2UgU09fUEFTU0NSRUQ6CisJCXYudmFsID0gdGVzdF9iaXQoU09DS19QQVNTQ1JFRCwgJnNvY2stPmZsYWdzKSA/IDEgOiAwOworCQlicmVhazsKKworCWNhc2UgU09fUEVFUkNSRUQ6CisJCWlmIChsZW4gPiBzaXplb2Yoc2stPnNrX3BlZXJjcmVkKSkKKwkJCWxlbiA9IHNpemVvZihzay0+c2tfcGVlcmNyZWQpOworCQlpZiAoY29weV90b191c2VyKG9wdHZhbCwgJnNrLT5za19wZWVyY3JlZCwgbGVuKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlnb3RvIGxlbm91dDsKKworCWNhc2UgU09fUEVFUk5BTUU6CisJeworCQljaGFyIGFkZHJlc3NbMTI4XTsKKworCQlpZiAoc29jay0+b3BzLT5nZXRuYW1lKHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKilhZGRyZXNzLCAmbHYsIDIpKQorCQkJcmV0dXJuIC1FTk9UQ09OTjsKKwkJaWYgKGx2IDwgbGVuKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChjb3B5X3RvX3VzZXIob3B0dmFsLCBhZGRyZXNzLCBsZW4pKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWdvdG8gbGVub3V0OwogCX0KKworCS8qIER1YmlvdXMgQlNEIHRoaW5nLi4uIFByb2JhYmx5IG5vYm9keSBldmVuIHVzZXMgaXQsIGJ1dAorCSAqIHRoZSBVTklYIHN0YW5kYXJkIHdhbnRzIGl0IGZvciB3aGF0ZXZlciByZWFzb24uLi4gLURhdmVNCisJICovCisJY2FzZSBTT19BQ0NFUFRDT05OOgorCQl2LnZhbCA9IHNrLT5za19zdGF0ZSA9PSBUQ1BfTElTVEVOOworCQlicmVhazsKKworCWNhc2UgU09fUEFTU1NFQzoKKwkJdi52YWwgPSB0ZXN0X2JpdChTT0NLX1BBU1NTRUMsICZzb2NrLT5mbGFncykgPyAxIDogMDsKKwkJYnJlYWs7CisKKwljYXNlIFNPX1BFRVJTRUM6CisJCXJldHVybiBzZWN1cml0eV9zb2NrZXRfZ2V0cGVlcnNlY19zdHJlYW0oc29jaywgb3B0dmFsLCBvcHRsZW4sIGxlbik7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT1BST1RPT1BUOworCX0KKwogCWlmIChsZW4gPiBsdikKIAkJbGVuID0gbHY7CiAJaWYgKGNvcHlfdG9fdXNlcihvcHR2YWwsICZ2LCBsZW4pKQpAQCAtOTA0LDYgKzkxNSw3IEBACiAJCXNrX25vZGVfaW5pdCgmbmV3c2stPnNrX25vZGUpOwogCQlzb2NrX2xvY2tfaW5pdChuZXdzayk7CiAJCWJoX2xvY2tfc29jayhuZXdzayk7CisJCW5ld3NrLT5za19iYWNrbG9nLmhlYWQJPSBuZXdzay0+c2tfYmFja2xvZy50YWlsID0gTlVMTDsKIAogCQlhdG9taWNfc2V0KCZuZXdzay0+c2tfcm1lbV9hbGxvYywgMCk7CiAJCWF0b21pY19zZXQoJm5ld3NrLT5za193bWVtX2FsbG9jLCAwKTsKQEAgLTkyMyw3ICs5MzUsNiBAQAogCQluZXdzay0+c2tfd21lbV9xdWV1ZWQJPSAwOwogCQluZXdzay0+c2tfZm9yd2FyZF9hbGxvYyA9IDA7CiAJCW5ld3NrLT5za19zZW5kX2hlYWQJPSBOVUxMOwotCQluZXdzay0+c2tfYmFja2xvZy5oZWFkCT0gbmV3c2stPnNrX2JhY2tsb2cudGFpbCA9IE5VTEw7CiAJCW5ld3NrLT5za191c2VybG9ja3MJPSBzay0+c2tfdXNlcmxvY2tzICYgflNPQ0tfQklORFBPUlRfTE9DSzsKIAogCQlzb2NrX3Jlc2V0X2ZsYWcobmV3c2ssIFNPQ0tfRE9ORSk7CkBAIC05NzAsNiArOTgxLDIxIEBACiAKIEVYUE9SVF9TWU1CT0xfR1BMKHNrX2Nsb25lKTsKIAordm9pZCBza19zZXR1cF9jYXBzKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IGRzdF9lbnRyeSAqZHN0KQoreworCV9fc2tfZHN0X3NldChzaywgZHN0KTsKKwlzay0+c2tfcm91dGVfY2FwcyA9IGRzdC0+ZGV2LT5mZWF0dXJlczsKKwlpZiAoc2stPnNrX3JvdXRlX2NhcHMgJiBORVRJRl9GX0dTTykKKwkJc2stPnNrX3JvdXRlX2NhcHMgfD0gTkVUSUZfRl9HU09fTUFTSzsKKwlpZiAoc2tfY2FuX2dzbyhzaykpIHsKKwkJaWYgKGRzdC0+aGVhZGVyX2xlbikKKwkJCXNrLT5za19yb3V0ZV9jYXBzICY9IH5ORVRJRl9GX0dTT19NQVNLOworCQllbHNlCisJCQlzay0+c2tfcm91dGVfY2FwcyB8PSBORVRJRl9GX1NHIHwgTkVUSUZfRl9IV19DU1VNOworCX0KK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNrX3NldHVwX2NhcHMpOworCiB2b2lkIF9faW5pdCBza19pbml0KHZvaWQpCiB7CiAJaWYgKG51bV9waHlzcGFnZXMgPD0gNDA5NikgewpAQCAtMTIyMCwxMyArMTI0NiwxMyBAQAogewogCURFRklORV9XQUlUKHdhaXQpOwogCi0JZm9yKDs7KSB7CisJZm9yICg7OykgewogCQlwcmVwYXJlX3RvX3dhaXRfZXhjbHVzaXZlKCZzay0+c2tfbG9jay53cSwgJndhaXQsCiAJCQkJCVRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKIAkJc3Bpbl91bmxvY2tfYmgoJnNrLT5za19sb2NrLnNsb2NrKTsKIAkJc2NoZWR1bGUoKTsKIAkJc3Bpbl9sb2NrX2JoKCZzay0+c2tfbG9jay5zbG9jayk7Ci0JCWlmKCFzb2NrX293bmVkX2J5X3VzZXIoc2spKQorCQlpZiAoIXNvY2tfb3duZWRfYnlfdXNlcihzaykpCiAJCQlicmVhazsKIAl9CiAJZmluaXNoX3dhaXQoJnNrLT5za19sb2NrLndxLCAmd2FpdCk7CkBAIC0xMjU4LDcgKzEyODQsNyBAQAogCQl9IHdoaWxlIChza2IgIT0gTlVMTCk7CiAKIAkJYmhfbG9ja19zb2NrKHNrKTsKLQl9IHdoaWxlKChza2IgPSBzay0+c2tfYmFja2xvZy5oZWFkKSAhPSBOVUxMKTsKKwl9IHdoaWxlICgoc2tiID0gc2stPnNrX2JhY2tsb2cuaGVhZCkgIT0gTlVMTCk7CiB9CiAKIC8qKgpAQCAtMTQyMCw3ICsxNDQ2LDcgQEAKIAkvKiBEbyBub3Qgd2FrZSB1cCBhIHdyaXRlciB1bnRpbCBoZSBjYW4gbWFrZSAic2lnbmlmaWNhbnQiCiAJICogcHJvZ3Jlc3MuICAtLURhdmVNCiAJICovCi0JaWYoKGF0b21pY19yZWFkKCZzay0+c2tfd21lbV9hbGxvYykgPDwgMSkgPD0gc2stPnNrX3NuZGJ1ZikgeworCWlmICgoYXRvbWljX3JlYWQoJnNrLT5za193bWVtX2FsbG9jKSA8PCAxKSA8PSBzay0+c2tfc25kYnVmKSB7CiAJCWlmIChzay0+c2tfc2xlZXAgJiYgd2FpdHF1ZXVlX2FjdGl2ZShzay0+c2tfc2xlZXApKQogCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKHNrLT5za19zbGVlcCk7CiAKQEAgLTE0ODIsOCArMTUwOCw3IEBACiAKIAlzb2NrX3NldF9mbGFnKHNrLCBTT0NLX1pBUFBFRCk7CiAKLQlpZihzb2NrKQotCXsKKwlpZiAoc29jaykgewogCQlzay0+c2tfdHlwZQk9CXNvY2stPnR5cGU7CiAJCXNrLT5za19zbGVlcAk9CSZzb2NrLT53YWl0OwogCQlzb2NrLT5zawk9CXNrOwpAQCAtMTUxMiw4ICsxNTM3LDcgQEAKIAlzay0+c2tfcmN2dGltZW8JCT0JTUFYX1NDSEVEVUxFX1RJTUVPVVQ7CiAJc2stPnNrX3NuZHRpbWVvCQk9CU1BWF9TQ0hFRFVMRV9USU1FT1VUOwogCi0Jc2stPnNrX3N0YW1wLnR2X3NlYyAgICAgPSAtMUw7Ci0Jc2stPnNrX3N0YW1wLnR2X3VzZWMgICAgPSAtMUw7CisJc2stPnNrX3N0YW1wID0ga3RpbWVfc2V0KC0xTCwgLTFMKTsKIAogCWF0b21pY19zZXQoJnNrLT5za19yZWZjbnQsIDEpOwogfQpAQCAtMTU1NCwxNyArMTU3OCwzNiBAQAogCiBpbnQgc29ja19nZXRfdGltZXN0YW1wKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHRpbWV2YWwgX191c2VyICp1c2Vyc3RhbXApCiB7CisJc3RydWN0IHRpbWV2YWwgdHY7CiAJaWYgKCFzb2NrX2ZsYWcoc2ssIFNPQ0tfVElNRVNUQU1QKSkKIAkJc29ja19lbmFibGVfdGltZXN0YW1wKHNrKTsKLQlpZiAoc2stPnNrX3N0YW1wLnR2X3NlYyA9PSAtMSkKKwl0diA9IGt0aW1lX3RvX3RpbWV2YWwoc2stPnNrX3N0YW1wKTsKKwlpZiAodHYudHZfc2VjID09IC0xKQogCQlyZXR1cm4gLUVOT0VOVDsKLQlpZiAoc2stPnNrX3N0YW1wLnR2X3NlYyA9PSAwKQotCQlkb19nZXR0aW1lb2ZkYXkoJnNrLT5za19zdGFtcCk7Ci0JcmV0dXJuIGNvcHlfdG9fdXNlcih1c2Vyc3RhbXAsICZzay0+c2tfc3RhbXAsIHNpemVvZihzdHJ1Y3QgdGltZXZhbCkpID8KLQkJLUVGQVVMVCA6IDA7CisJaWYgKHR2LnR2X3NlYyA9PSAwKSB7CisJCXNrLT5za19zdGFtcCA9IGt0aW1lX2dldF9yZWFsKCk7CisJCXR2ID0ga3RpbWVfdG9fdGltZXZhbChzay0+c2tfc3RhbXApOworCX0KKwlyZXR1cm4gY29weV90b191c2VyKHVzZXJzdGFtcCwgJnR2LCBzaXplb2YodHYpKSA/IC1FRkFVTFQgOiAwOwogfQogRVhQT1JUX1NZTUJPTChzb2NrX2dldF90aW1lc3RhbXApOwogCitpbnQgc29ja19nZXRfdGltZXN0YW1wbnMoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgdGltZXNwZWMgX191c2VyICp1c2Vyc3RhbXApCit7CisJc3RydWN0IHRpbWVzcGVjIHRzOworCWlmICghc29ja19mbGFnKHNrLCBTT0NLX1RJTUVTVEFNUCkpCisJCXNvY2tfZW5hYmxlX3RpbWVzdGFtcChzayk7CisJdHMgPSBrdGltZV90b190aW1lc3BlYyhzay0+c2tfc3RhbXApOworCWlmICh0cy50dl9zZWMgPT0gLTEpCisJCXJldHVybiAtRU5PRU5UOworCWlmICh0cy50dl9zZWMgPT0gMCkgeworCQlzay0+c2tfc3RhbXAgPSBrdGltZV9nZXRfcmVhbCgpOworCQl0cyA9IGt0aW1lX3RvX3RpbWVzcGVjKHNrLT5za19zdGFtcCk7CisJfQorCXJldHVybiBjb3B5X3RvX3VzZXIodXNlcnN0YW1wLCAmdHMsIHNpemVvZih0cykpID8gLUVGQVVMVCA6IDA7Cit9CitFWFBPUlRfU1lNQk9MKHNvY2tfZ2V0X3RpbWVzdGFtcG5zKTsKKwogdm9pZCBzb2NrX2VuYWJsZV90aW1lc3RhbXAoc3RydWN0IHNvY2sgKnNrKQogewogCWlmICghc29ja19mbGFnKHNrLCBTT0NLX1RJTUVTVEFNUCkpIHsKQEAgLTE4OTksNyArMTk0Miw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgcHJvdG9fc2VxX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgcHJvdG9fc2VxX29wcyA9IHsKIAkuc3RhcnQgID0gcHJvdG9fc2VxX3N0YXJ0LAogCS5uZXh0ICAgPSBwcm90b19zZXFfbmV4dCwKIAkuc3RvcCAgID0gcHJvdG9fc2VxX3N0b3AsCmRpZmYgLS1naXQgYS9uZXQvY29yZS9zeXNjdGxfbmV0X2NvcmUuYyBiL25ldC9jb3JlL3N5c2N0bF9uZXRfY29yZS5jCmluZGV4IDFlNzViMTUuLmIyOTcxMjAgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL3N5c2N0bF9uZXRfY29yZS5jCisrKyBiL25ldC9jb3JlL3N5c2N0bF9uZXRfY29yZS5jCkBAIC0xMzYsNiArMTM2LDE0IEBACiAJCS5tb2RlCQk9IDA2NDQsCiAJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYwogCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfQ09SRV9XQVJOSU5HUywKKwkJLnByb2NuYW1lCT0gIndhcm5pbmdzIiwKKwkJLmRhdGEJCT0gJm5ldF9tc2dfd2FybiwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjCisJfSwKIAl7IC5jdGxfbmFtZSA9IDAgfQogfTsKIApkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvdXRpbHMuYyBiL25ldC9jb3JlL3V0aWxzLmMKaW5kZXggMDcyMzZjMS4uYWRlY2ZkMiAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvdXRpbHMuYworKysgYi9uZXQvY29yZS91dGlscy5jCkBAIC0zMCw4ICszMCwxMCBAQAogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCi1pbnQgbmV0X21zZ19jb3N0ID0gNSpIWjsKLWludCBuZXRfbXNnX2J1cnN0ID0gMTA7CitpbnQgbmV0X21zZ19jb3N0IF9fcmVhZF9tb3N0bHkgPSA1KkhaOworaW50IG5ldF9tc2dfYnVyc3QgX19yZWFkX21vc3RseSA9IDEwOworaW50IG5ldF9tc2dfd2FybiBfX3JlYWRfbW9zdGx5ID0gMTsKK0VYUE9SVF9TWU1CT0wobmV0X21zZ193YXJuKTsKIAogLyoKICAqIEFsbCBuZXQgd2FybmluZyBwcmludGsoKXMgc2hvdWxkIGJlIGd1YXJkZWQgYnkgdGhpcyBmdW5jdGlvbi4KZGlmZiAtLWdpdCBhL25ldC9jb3JlL3dpcmVsZXNzLmMgYi9uZXQvY29yZS93aXJlbGVzcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDdmZTI3Li4wMDAwMDAwCi0tLSBhL25ldC9jb3JlL3dpcmVsZXNzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzcxICswLDAgQEAKLS8qCi0gKiBUaGlzIGZpbGUgaW1wbGVtZW50IHRoZSBXaXJlbGVzcyBFeHRlbnNpb25zIEFQSXMuCi0gKgotICogQXV0aG9ycyA6CUplYW4gVG91cnJpbGhlcyAtIEhQTCAtIDxqdEBocGwuaHAuY29tPgotICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMDcgSmVhbiBUb3VycmlsaGVzLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIChBcyBhbGwgcGFydCBvZiB0aGUgTGludXgga2VybmVsLCB0aGlzIGZpbGUgaXMgR1BMKQotICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKiBET0NVTUVOVEFUSU9OICoqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIEFQSSBkZWZpbml0aW9uIDoKLSAqIC0tLS0tLS0tLS0tLS0tCi0gKiBTZWUgPGxpbnV4L3dpcmVsZXNzLmg+IGZvciBkZXRhaWxzIG9mIHRoZSBBUElzIGFuZCB0aGUgcmVzdC4KLSAqCi0gKiBIaXN0b3J5IDoKLSAqIC0tLS0tLS0KLSAqCi0gKiB2MSAtIDUuMTIuMDEgLSBKZWFuIElJCi0gKglvIENyZWF0ZWQgdGhpcyBmaWxlLgotICoKLSAqIHYyIC0gMTMuMTIuMDEgLSBKZWFuIElJCi0gKglvIE1vdmUgL3Byb2MvbmV0L3dpcmVsZXNzIHN0dWZmIGZyb20gbmV0L2NvcmUvZGV2LmMgdG8gaGVyZQotICoJbyBNYWtlIFdpcmVsZXNzIEV4dGVuc2lvbiBJT0NUTHMgZ28gdGhyb3VnaCBoZXJlCi0gKglvIEFkZGVkIGl3X2hhbmRsZXIgaGFuZGxpbmcgOy0pCi0gKglvIEFkZGVkIHN0YW5kYXJkIGlvY3RsIGRlc2NyaXB0aW9uCi0gKglvIEluaXRpYWwgZHVtYiBjb21taXQgc3RyYXRlZ3kgYmFzZWQgb24gb3Jpbm9jby5jCi0gKgotICogdjMgLSAxOS4xMi4wMSAtIEplYW4gSUkKLSAqCW8gTWFrZSBzdXJlIHdlIGRvbid0IGdvIG91dCBvZiBzdGFuZGFyZF9pb2N0bFtdIGluIGlvY3RsX3N0YW5kYXJkX2NhbGwKLSAqCW8gQWRkIGV2ZW50IGRpc3BhdGNoZXIgZnVuY3Rpb24KLSAqCW8gQWRkIGV2ZW50IGRlc2NyaXB0aW9uCi0gKglvIFByb3BhZ2F0ZSBldmVudHMgYXMgcnRuZXRsaW5rIElGTEFfV0lSRUxFU1Mgb3B0aW9uCi0gKglvIEdlbmVyYXRlIGV2ZW50IG9uIHNlbGVjdGVkIFNFVCByZXF1ZXN0cwotICoKLSAqIHY0IC0gMTguMDQuMDIgLSBKZWFuIElJCi0gKglvIEZpeCBzdHVwaWQgb2ZmIGJ5IG9uZSBpbiBpd19pb2N0bF9kZXNjcmlwdGlvbiA6IElXX0VTU0lEX01BWF9TSVpFICsgMQotICoKLSAqIHY1IC0gMjEuMDYuMDIgLSBKZWFuIElJCi0gKglvIEFkZCBJV19QUklWX1RZUEVfQUREUiBpbiBwcml2X3R5cGVfc2l6ZSAoK2NsZWFudXApCi0gKglvIFJlc2h1ZmZsZSBJV19IRUFERVJfVFlQRV9YWFggdG8gbWFwIElXX1BSSVZfVFlQRV9YWFggY2hhbmdlcwotICoJbyBBZGQgSVdFVkNVU1RPTSBmb3IgZHJpdmVyIHNwZWNpZmljIGV2ZW50L3NjYW5uaW5nIHRva2VuCi0gKglvIFR1cm4gb24gV0VfU1RSSUNUX1dSSVRFIGJ5IGRlZmF1bHQgKyBrZXJuZWwgd2FybmluZwotICoJbyBGaXggV0VfU1RSSUNUX1dSSVRFIGluIGlvY3RsX2V4cG9ydF9wcml2YXRlKCkgKDMyID0+IGl3X251bSkKLSAqCW8gRml4IG9mZi1ieS1vbmUgaW4gdGVzdCAoZXh0cmFfc2l6ZSA8PSBJRk5BTVNJWikKLSAqCi0gKiB2NiAtIDkuMDEuMDMgLSBKZWFuIElJCi0gKglvIEFkZCBjb21tb24gc3B5IHN1cHBvcnQgOiBpd19oYW5kbGVyX3NldF9zcHkoKSwgd2lyZWxlc3Nfc3B5X3VwZGF0ZSgpCi0gKglvIEFkZCBlbmhhbmNlZCBzcHkgc3VwcG9ydCA6IGl3X2hhbmRsZXJfc2V0X3RocnNweSgpIGFuZCBldmVudC4KLSAqCW8gQWRkIFdJUkVMRVNTX0VYVCB2ZXJzaW9uIGRpc3BsYXkgaW4gL3Byb2MvbmV0L3dpcmVsZXNzCi0gKgotICogdjYgLSAxOC4wNi4wNCAtIEplYW4gSUkKLSAqCW8gQ2hhbmdlIGdldF9zcHlkYXRhKCkgbWV0aG9kIGZvciBhZGRlZCBzYWZldHkKLSAqCW8gUmVtb3ZlIHNweSAjaWZkZWYsIHRoZXkgYXJlIGFsd2F5cyBvbiAtPiBjbGVhbmVyIGNvZGUKLSAqCW8gQWxsb3cgYW55IHNpemUgR0VUIHJlcXVlc3QgaWYgdXNlciBzcGVjaWZpZXMgbGVuZ3RoID4gbWF4Ci0gKgkJYW5kIGlmIHJlcXVlc3QgaGFzIElXX0RFU0NSX0ZMQUdfTk9NQVggZmxhZyBvciBpcyBTSU9DR0lXUFJJVgotICoJbyBTdGFydCBtaWdyYXRpbmcgZ2V0X3dpcmVsZXNzX3N0YXRzIHRvIHN0cnVjdCBpd19oYW5kbGVyX2RlZgotICoJbyBBZGQgd21iKCkgaW4gaXdfaGFuZGxlcl9zZXRfc3B5KCkgZm9yIG5vbi1jb2hlcmVudCBhcmNocy9jcHVzCi0gKiBCYXNlZCBvbiBwYXRjaCBmcm9tIFBhdmVsIFJvc2tpbiA8cHJvc2tpQGdudS5vcmc+IDoKLSAqCW8gRml4IGtlcm5lbCBkYXRhIGxlYWsgdG8gdXNlciBzcGFjZSBpbiBwcml2YXRlIGhhbmRsZXIgaGFuZGxpbmcKLSAqCi0gKiB2NyAtIDE4LjMuMDUgLSBKZWFuIElJCi0gKglvIFJlbW92ZSAoc3RydWN0IGl3X3BvaW50ICopLT5wb2ludGVyIGZyb20gZXZlbnRzIGFuZCBzdHJlYW1zCi0gKglvIFJlbW92ZSBzcHlfb2Zmc2V0IGZyb20gc3RydWN0IGl3X2hhbmRsZXJfZGVmCi0gKglvIFN0YXJ0IGRlcHJlY2F0aW5nIGRldi0+Z2V0X3dpcmVsZXNzX3N0YXRzLCBvdXRwdXQgYSB3YXJuaW5nCi0gKglvIElmIElXX1FVQUxfREJNIGlzIHNldCwgc2hvdyBkQm0gdmFsdWVzIGluIC9wcm9jL25ldC93aXJlbGVzcwotICoJbyBEb24ndCBsb29zZSBJTlZBTElEL0RCTSBmbGFncyB3aGVuIGNsZWFyaW5nIFVQREFURUQgZmxhZ3MgKGl3c3RhdHMpCi0gKgotICogdjggLSAxNy4wMi4wNiAtIEplYW4gSUkKLSAqCW8gUnROZXRsaW5rIHJlcXVlc3RzIHN1cHBvcnQgKFNFVC9HRVQpCi0gKgotICogdjhiIC0gMDMuMDguMDYgLSBIZXJiZXJ0IFh1Ci0gKglvIEZpeCBXaXJlbGVzcyBFdmVudCBsb2NraW5nIGlzc3Vlcy4KLSAqCi0gKiB2OSAtIDE0LjMuMDYgLSBKZWFuIElJCi0gKglvIENoYW5nZSBsZW5ndGggaW4gRVNTSUQgYW5kIE5JQ0sgdG8gc3RybGVuKCkgaW5zdGVhZCBvZiBzdHJsZW4oKSsxCi0gKglvIE1ha2Ugc3RhbmRhcmRfaW9jdGxfbnVtIGFuZCBzdGFuZGFyZF9ldmVudF9udW0gdW5zaWduZWQKLSAqCW8gUmVtb3ZlIChzdHJ1Y3QgbmV0X2RldmljZSAqKS0+Z2V0X3dpcmVsZXNzX3N0YXRzKCkKLSAqCi0gKiB2MTAgLSAxNi4zLjA3IC0gSmVhbiBJSQotICoJbyBQcmV2ZW50IGxlYWtpbmcgb2Yga2VybmVsIHNwYWNlIGluIHN0cmVhbSBvbiA2NCBiaXRzLgotICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBJTkNMVURFUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CQkvKiBvZmZfdCAqLwotI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgkJLyogc3RydWN0IGlmcmVxLCBkZXZfZ2V0X2J5X25hbWUoKSAqLwotI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4JCS8qIHJ0bmV0bGluayBzdHVmZiAqLwotI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgkJCS8qIGZvciBfX2luaXQgKi8KLSNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4JCS8qIEFSUEhSRF9FVEhFUiAqLwotI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CQkvKiBjb21wYXJlX2V0aGVyX2FkZHIgKi8KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLQotI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CQkvKiBQcmV0dHkgb2J2aW91cyAqLwotI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+CQkvKiBOZXcgZHJpdmVyIEFQSSAqLwotI2luY2x1ZGUgPG5ldC9uZXRsaW5rLmg+Ci0KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgkJLyogY29weV90b191c2VyKCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogQ09OU1RBTlRTICoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIERlYnVnZ2luZyBzdHVmZiAqLwotI3VuZGVmIFdFX0lPQ1RMX0RFQlVHCQkvKiBEZWJ1ZyBJT0NUTCBBUEkgKi8KLSN1bmRlZiBXRV9SVE5FVExJTktfREVCVUcJLyogRGVidWcgUnROZXRsaW5rIEFQSSAqLwotI3VuZGVmIFdFX0VWRU5UX0RFQlVHCQkvKiBEZWJ1ZyBFdmVudCBkaXNwYXRjaGVyICovCi0jdW5kZWYgV0VfU1BZX0RFQlVHCQkvKiBEZWJ1ZyBlbmhhbmNlZCBzcHkgc3VwcG9ydCAqLwotCi0vKiBPcHRpb25zICovCi0vL0NPTkZJR19ORVRfV0lSRUxFU1NfUlRORVRMSU5LCS8qIFdpcmVsZXNzIHJlcXVlc3RzIG92ZXIgUnROZXRsaW5rICovCi0jZGVmaW5lIFdFX0VWRU5UX1JUTkVUTElOSwkvKiBQcm9wYWdhdGUgZXZlbnRzIHVzaW5nIFJ0TmV0bGluayAqLwotI2RlZmluZSBXRV9TRVRfRVZFTlQJCS8qIEdlbmVyYXRlIGFuIGV2ZW50IG9uIHNvbWUgc2V0IGNvbW1hbmRzICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqIEdMT0JBTCBWQVJJQUJMRVMgKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBZb3Ugc2hvdWxkIG5vdCB1c2UgZ2xvYmFsIHZhcmlhYmxlcywgYmVjYXVzZSBvZiByZS1lbnRyYW5jeS4KLSAqIE9uIG91ciBjYXNlLCBpdCdzIG9ubHkgY29uc3QsIHNvIGl0J3MgT0suLi4KLSAqLwotLyoKLSAqIE1ldGEtZGF0YSBhYm91dCBhbGwgdGhlIHN0YW5kYXJkIFdpcmVsZXNzIEV4dGVuc2lvbiByZXF1ZXN0IHdlCi0gKiBrbm93IGFib3V0LgotICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGl3X2lvY3RsX2Rlc2NyaXB0aW9uIHN0YW5kYXJkX2lvY3RsW10gPSB7Ci0JW1NJT0NTSVdDT01NSVQJLSBTSU9DSVdGSVJTVF0gPSB7Ci0JCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX05VTEwsCi0JfSwKLQlbU0lPQ0dJV05BTUUJLSBTSU9DSVdGSVJTVF0gPSB7Ci0JCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX0NIQVIsCi0JCS5mbGFncwkJPSBJV19ERVNDUl9GTEFHX0RVTVAsCi0JfSwKLQlbU0lPQ1NJV05XSUQJLSBTSU9DSVdGSVJTVF0gPSB7Ci0JCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1BBUkFNLAotCQkuZmxhZ3MJCT0gSVdfREVTQ1JfRkxBR19FVkVOVCwKLQl9LAotCVtTSU9DR0lXTldJRAktIFNJT0NJV0ZJUlNUXSA9IHsKLQkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfUEFSQU0sCi0JCS5mbGFncwkJPSBJV19ERVNDUl9GTEFHX0RVTVAsCi0JfSwKLQlbU0lPQ1NJV0ZSRVEJLSBTSU9DSVdGSVJTVF0gPSB7Ci0JCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX0ZSRVEsCi0JCS5mbGFncwkJPSBJV19ERVNDUl9GTEFHX0VWRU5ULAotCX0sCi0JW1NJT0NHSVdGUkVRCS0gU0lPQ0lXRklSU1RdID0gewotCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9GUkVRLAotCQkuZmxhZ3MJCT0gSVdfREVTQ1JfRkxBR19EVU1QLAotCX0sCi0JW1NJT0NTSVdNT0RFCS0gU0lPQ0lXRklSU1RdID0gewotCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9VSU5ULAotCQkuZmxhZ3MJCT0gSVdfREVTQ1JfRkxBR19FVkVOVCwKLQl9LAotCVtTSU9DR0lXTU9ERQktIFNJT0NJV0ZJUlNUXSA9IHsKLQkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfVUlOVCwKLQkJLmZsYWdzCQk9IElXX0RFU0NSX0ZMQUdfRFVNUCwKLQl9LAotCVtTSU9DU0lXU0VOUwktIFNJT0NJV0ZJUlNUXSA9IHsKLQkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfUEFSQU0sCi0JfSwKLQlbU0lPQ0dJV1NFTlMJLSBTSU9DSVdGSVJTVF0gPSB7Ci0JCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1BBUkFNLAotCX0sCi0JW1NJT0NTSVdSQU5HRQktIFNJT0NJV0ZJUlNUXSA9IHsKLQkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfTlVMTCwKLQl9LAotCVtTSU9DR0lXUkFOR0UJLSBTSU9DSVdGSVJTVF0gPSB7Ci0JCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1BPSU5ULAotCQkudG9rZW5fc2l6ZQk9IDEsCi0JCS5tYXhfdG9rZW5zCT0gc2l6ZW9mKHN0cnVjdCBpd19yYW5nZSksCi0JCS5mbGFncwkJPSBJV19ERVNDUl9GTEFHX0RVTVAsCi0JfSwKLQlbU0lPQ1NJV1BSSVYJLSBTSU9DSVdGSVJTVF0gPSB7Ci0JCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX05VTEwsCi0JfSwKLQlbU0lPQ0dJV1BSSVYJLSBTSU9DSVdGSVJTVF0gPSB7IC8qIChoYW5kbGVkIGRpcmVjdGx5IGJ5IHVzKSAqLwotCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9QT0lOVCwKLQkJLnRva2VuX3NpemUJPSBzaXplb2Yoc3RydWN0IGl3X3ByaXZfYXJncyksCi0JCS5tYXhfdG9rZW5zCT0gMTYsCi0JCS5mbGFncwkJPSBJV19ERVNDUl9GTEFHX05PTUFYLAotCX0sCi0JW1NJT0NTSVdTVEFUUwktIFNJT0NJV0ZJUlNUXSA9IHsKLQkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfTlVMTCwKLQl9LAotCVtTSU9DR0lXU1RBVFMJLSBTSU9DSVdGSVJTVF0gPSB7IC8qIChoYW5kbGVkIGRpcmVjdGx5IGJ5IHVzKSAqLwotCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9QT0lOVCwKLQkJLnRva2VuX3NpemUJPSAxLAotCQkubWF4X3Rva2Vucwk9IHNpemVvZihzdHJ1Y3QgaXdfc3RhdGlzdGljcyksCi0JCS5mbGFncwkJPSBJV19ERVNDUl9GTEFHX0RVTVAsCi0JfSwKLQlbU0lPQ1NJV1NQWQktIFNJT0NJV0ZJUlNUXSA9IHsKLQkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfUE9JTlQsCi0JCS50b2tlbl9zaXplCT0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkciksCi0JCS5tYXhfdG9rZW5zCT0gSVdfTUFYX1NQWSwKLQl9LAotCVtTSU9DR0lXU1BZCS0gU0lPQ0lXRklSU1RdID0gewotCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9QT0lOVCwKLQkJLnRva2VuX3NpemUJPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyKSArCi0JCQkJICBzaXplb2Yoc3RydWN0IGl3X3F1YWxpdHkpLAotCQkubWF4X3Rva2Vucwk9IElXX01BWF9TUFksCi0JfSwKLQlbU0lPQ1NJV1RIUlNQWQktIFNJT0NJV0ZJUlNUXSA9IHsKLQkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfUE9JTlQsCi0JCS50b2tlbl9zaXplCT0gc2l6ZW9mKHN0cnVjdCBpd190aHJzcHkpLAotCQkubWluX3Rva2Vucwk9IDEsCi0JCS5tYXhfdG9rZW5zCT0gMSwKLQl9LAotCVtTSU9DR0lXVEhSU1BZCS0gU0lPQ0lXRklSU1RdID0gewotCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9QT0lOVCwKLQkJLnRva2VuX3NpemUJPSBzaXplb2Yoc3RydWN0IGl3X3RocnNweSksCi0JCS5taW5fdG9rZW5zCT0gMSwKLQkJLm1heF90b2tlbnMJPSAxLAotCX0sCi0JW1NJT0NTSVdBUAktIFNJT0NJV0ZJUlNUXSA9IHsKLQkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfQUREUiwKLQl9LAotCVtTSU9DR0lXQVAJLSBTSU9DSVdGSVJTVF0gPSB7Ci0JCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX0FERFIsCi0JCS5mbGFncwkJPSBJV19ERVNDUl9GTEFHX0RVTVAsCi0JfSwKLQlbU0lPQ1NJV01MTUUJLSBTSU9DSVdGSVJTVF0gPSB7Ci0JCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1BPSU5ULAotCQkudG9rZW5fc2l6ZQk9IDEsCi0JCS5taW5fdG9rZW5zCT0gc2l6ZW9mKHN0cnVjdCBpd19tbG1lKSwKLQkJLm1heF90b2tlbnMJPSBzaXplb2Yoc3RydWN0IGl3X21sbWUpLAotCX0sCi0JW1NJT0NHSVdBUExJU1QJLSBTSU9DSVdGSVJTVF0gPSB7Ci0JCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1BPSU5ULAotCQkudG9rZW5fc2l6ZQk9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpICsKLQkJCQkgIHNpemVvZihzdHJ1Y3QgaXdfcXVhbGl0eSksCi0JCS5tYXhfdG9rZW5zCT0gSVdfTUFYX0FQLAotCQkuZmxhZ3MJCT0gSVdfREVTQ1JfRkxBR19OT01BWCwKLQl9LAotCVtTSU9DU0lXU0NBTgktIFNJT0NJV0ZJUlNUXSA9IHsKLQkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfUE9JTlQsCi0JCS50b2tlbl9zaXplCT0gMSwKLQkJLm1pbl90b2tlbnMJPSAwLAotCQkubWF4X3Rva2Vucwk9IHNpemVvZihzdHJ1Y3QgaXdfc2Nhbl9yZXEpLAotCX0sCi0JW1NJT0NHSVdTQ0FOCS0gU0lPQ0lXRklSU1RdID0gewotCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9QT0lOVCwKLQkJLnRva2VuX3NpemUJPSAxLAotCQkubWF4X3Rva2Vucwk9IElXX1NDQU5fTUFYX0RBVEEsCi0JCS5mbGFncwkJPSBJV19ERVNDUl9GTEFHX05PTUFYLAotCX0sCi0JW1NJT0NTSVdFU1NJRAktIFNJT0NJV0ZJUlNUXSA9IHsKLQkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfUE9JTlQsCi0JCS50b2tlbl9zaXplCT0gMSwKLQkJLm1heF90b2tlbnMJPSBJV19FU1NJRF9NQVhfU0laRSwKLQkJLmZsYWdzCQk9IElXX0RFU0NSX0ZMQUdfRVZFTlQsCi0JfSwKLQlbU0lPQ0dJV0VTU0lECS0gU0lPQ0lXRklSU1RdID0gewotCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9QT0lOVCwKLQkJLnRva2VuX3NpemUJPSAxLAotCQkubWF4X3Rva2Vucwk9IElXX0VTU0lEX01BWF9TSVpFLAotCQkuZmxhZ3MJCT0gSVdfREVTQ1JfRkxBR19EVU1QLAotCX0sCi0JW1NJT0NTSVdOSUNLTgktIFNJT0NJV0ZJUlNUXSA9IHsKLQkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfUE9JTlQsCi0JCS50b2tlbl9zaXplCT0gMSwKLQkJLm1heF90b2tlbnMJPSBJV19FU1NJRF9NQVhfU0laRSwKLQl9LAotCVtTSU9DR0lXTklDS04JLSBTSU9DSVdGSVJTVF0gPSB7Ci0JCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1BPSU5ULAotCQkudG9rZW5fc2l6ZQk9IDEsCi0JCS5tYXhfdG9rZW5zCT0gSVdfRVNTSURfTUFYX1NJWkUsCi0JfSwKLQlbU0lPQ1NJV1JBVEUJLSBTSU9DSVdGSVJTVF0gPSB7Ci0JCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1BBUkFNLAotCX0sCi0JW1NJT0NHSVdSQVRFCS0gU0lPQ0lXRklSU1RdID0gewotCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9QQVJBTSwKLQl9LAotCVtTSU9DU0lXUlRTCS0gU0lPQ0lXRklSU1RdID0gewotCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9QQVJBTSwKLQl9LAotCVtTSU9DR0lXUlRTCS0gU0lPQ0lXRklSU1RdID0gewotCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9QQVJBTSwKLQl9LAotCVtTSU9DU0lXRlJBRwktIFNJT0NJV0ZJUlNUXSA9IHsKLQkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfUEFSQU0sCi0JfSwKLQlbU0lPQ0dJV0ZSQUcJLSBTSU9DSVdGSVJTVF0gPSB7Ci0JCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1BBUkFNLAotCX0sCi0JW1NJT0NTSVdUWFBPVwktIFNJT0NJV0ZJUlNUXSA9IHsKLQkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfUEFSQU0sCi0JfSwKLQlbU0lPQ0dJV1RYUE9XCS0gU0lPQ0lXRklSU1RdID0gewotCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9QQVJBTSwKLQl9LAotCVtTSU9DU0lXUkVUUlkJLSBTSU9DSVdGSVJTVF0gPSB7Ci0JCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1BBUkFNLAotCX0sCi0JW1NJT0NHSVdSRVRSWQktIFNJT0NJV0ZJUlNUXSA9IHsKLQkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfUEFSQU0sCi0JfSwKLQlbU0lPQ1NJV0VOQ09ERQktIFNJT0NJV0ZJUlNUXSA9IHsKLQkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfUE9JTlQsCi0JCS50b2tlbl9zaXplCT0gMSwKLQkJLm1heF90b2tlbnMJPSBJV19FTkNPRElOR19UT0tFTl9NQVgsCi0JCS5mbGFncwkJPSBJV19ERVNDUl9GTEFHX0VWRU5UIHwgSVdfREVTQ1JfRkxBR19SRVNUUklDVCwKLQl9LAotCVtTSU9DR0lXRU5DT0RFCS0gU0lPQ0lXRklSU1RdID0gewotCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9QT0lOVCwKLQkJLnRva2VuX3NpemUJPSAxLAotCQkubWF4X3Rva2Vucwk9IElXX0VOQ09ESU5HX1RPS0VOX01BWCwKLQkJLmZsYWdzCQk9IElXX0RFU0NSX0ZMQUdfRFVNUCB8IElXX0RFU0NSX0ZMQUdfUkVTVFJJQ1QsCi0JfSwKLQlbU0lPQ1NJV1BPV0VSCS0gU0lPQ0lXRklSU1RdID0gewotCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9QQVJBTSwKLQl9LAotCVtTSU9DR0lXUE9XRVIJLSBTSU9DSVdGSVJTVF0gPSB7Ci0JCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1BBUkFNLAotCX0sCi0JW1NJT0NTSVdHRU5JRQktIFNJT0NJV0ZJUlNUXSA9IHsKLQkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfUE9JTlQsCi0JCS50b2tlbl9zaXplCT0gMSwKLQkJLm1heF90b2tlbnMJPSBJV19HRU5FUklDX0lFX01BWCwKLQl9LAotCVtTSU9DR0lXR0VOSUUJLSBTSU9DSVdGSVJTVF0gPSB7Ci0JCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1BPSU5ULAotCQkudG9rZW5fc2l6ZQk9IDEsCi0JCS5tYXhfdG9rZW5zCT0gSVdfR0VORVJJQ19JRV9NQVgsCi0JfSwKLQlbU0lPQ1NJV0FVVEgJLSBTSU9DSVdGSVJTVF0gPSB7Ci0JCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1BBUkFNLAotCX0sCi0JW1NJT0NHSVdBVVRICS0gU0lPQ0lXRklSU1RdID0gewotCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9QQVJBTSwKLQl9LAotCVtTSU9DU0lXRU5DT0RFRVhUIC0gU0lPQ0lXRklSU1RdID0gewotCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9QT0lOVCwKLQkJLnRva2VuX3NpemUJPSAxLAotCQkubWluX3Rva2Vucwk9IHNpemVvZihzdHJ1Y3QgaXdfZW5jb2RlX2V4dCksCi0JCS5tYXhfdG9rZW5zCT0gc2l6ZW9mKHN0cnVjdCBpd19lbmNvZGVfZXh0KSArCi0JCQkJICBJV19FTkNPRElOR19UT0tFTl9NQVgsCi0JfSwKLQlbU0lPQ0dJV0VOQ09ERUVYVCAtIFNJT0NJV0ZJUlNUXSA9IHsKLQkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfUE9JTlQsCi0JCS50b2tlbl9zaXplCT0gMSwKLQkJLm1pbl90b2tlbnMJPSBzaXplb2Yoc3RydWN0IGl3X2VuY29kZV9leHQpLAotCQkubWF4X3Rva2Vucwk9IHNpemVvZihzdHJ1Y3QgaXdfZW5jb2RlX2V4dCkgKwotCQkJCSAgSVdfRU5DT0RJTkdfVE9LRU5fTUFYLAotCX0sCi0JW1NJT0NTSVdQTUtTQSAtIFNJT0NJV0ZJUlNUXSA9IHsKLQkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfUE9JTlQsCi0JCS50b2tlbl9zaXplCT0gMSwKLQkJLm1pbl90b2tlbnMJPSBzaXplb2Yoc3RydWN0IGl3X3Bta3NhKSwKLQkJLm1heF90b2tlbnMJPSBzaXplb2Yoc3RydWN0IGl3X3Bta3NhKSwKLQl9LAotfTsKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBzdGFuZGFyZF9pb2N0bF9udW0gPSAoc2l6ZW9mKHN0YW5kYXJkX2lvY3RsKSAvCi0JCQkJCSAgICBzaXplb2Yoc3RydWN0IGl3X2lvY3RsX2Rlc2NyaXB0aW9uKSk7Ci0KLS8qCi0gKiBNZXRhLWRhdGEgYWJvdXQgYWxsIHRoZSBhZGRpdGlvbmFsIHN0YW5kYXJkIFdpcmVsZXNzIEV4dGVuc2lvbiBldmVudHMKLSAqIHdlIGtub3cgYWJvdXQuCi0gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaXdfaW9jdGxfZGVzY3JpcHRpb24gc3RhbmRhcmRfZXZlbnRbXSA9IHsKLQlbSVdFVlRYRFJPUAktIElXRVZGSVJTVF0gPSB7Ci0JCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX0FERFIsCi0JfSwKLQlbSVdFVlFVQUwJLSBJV0VWRklSU1RdID0gewotCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9RVUFMLAotCX0sCi0JW0lXRVZDVVNUT00JLSBJV0VWRklSU1RdID0gewotCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9QT0lOVCwKLQkJLnRva2VuX3NpemUJPSAxLAotCQkubWF4X3Rva2Vucwk9IElXX0NVU1RPTV9NQVgsCi0JfSwKLQlbSVdFVlJFR0lTVEVSRUQJLSBJV0VWRklSU1RdID0gewotCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9BRERSLAotCX0sCi0JW0lXRVZFWFBJUkVECS0gSVdFVkZJUlNUXSA9IHsKLQkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfQUREUiwKLQl9LAotCVtJV0VWR0VOSUUJLSBJV0VWRklSU1RdID0gewotCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9QT0lOVCwKLQkJLnRva2VuX3NpemUJPSAxLAotCQkubWF4X3Rva2Vucwk9IElXX0dFTkVSSUNfSUVfTUFYLAotCX0sCi0JW0lXRVZNSUNIQUVMTUlDRkFJTFVSRQktIElXRVZGSVJTVF0gPSB7Ci0JCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1BPSU5ULAotCQkudG9rZW5fc2l6ZQk9IDEsCi0JCS5tYXhfdG9rZW5zCT0gc2l6ZW9mKHN0cnVjdCBpd19taWNoYWVsbWljZmFpbHVyZSksCi0JfSwKLQlbSVdFVkFTU09DUkVRSUUJLSBJV0VWRklSU1RdID0gewotCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9QT0lOVCwKLQkJLnRva2VuX3NpemUJPSAxLAotCQkubWF4X3Rva2Vucwk9IElXX0dFTkVSSUNfSUVfTUFYLAotCX0sCi0JW0lXRVZBU1NPQ1JFU1BJRQktIElXRVZGSVJTVF0gPSB7Ci0JCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1BPSU5ULAotCQkudG9rZW5fc2l6ZQk9IDEsCi0JCS5tYXhfdG9rZW5zCT0gSVdfR0VORVJJQ19JRV9NQVgsCi0JfSwKLQlbSVdFVlBNS0lEQ0FORAktIElXRVZGSVJTVF0gPSB7Ci0JCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1BPSU5ULAotCQkudG9rZW5fc2l6ZQk9IDEsCi0JCS5tYXhfdG9rZW5zCT0gc2l6ZW9mKHN0cnVjdCBpd19wbWtpZF9jYW5kKSwKLQl9LAotfTsKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBzdGFuZGFyZF9ldmVudF9udW0gPSAoc2l6ZW9mKHN0YW5kYXJkX2V2ZW50KSAvCi0JCQkJCSAgICBzaXplb2Yoc3RydWN0IGl3X2lvY3RsX2Rlc2NyaXB0aW9uKSk7Ci0KLS8qIFNpemUgKGluIGJ5dGVzKSBvZiB0aGUgdmFyaW91cyBwcml2YXRlIGRhdGEgdHlwZXMgKi8KLXN0YXRpYyBjb25zdCBjaGFyIGl3X3ByaXZfdHlwZV9zaXplW10gPSB7Ci0JMCwJCQkJLyogSVdfUFJJVl9UWVBFX05PTkUgKi8KLQkxLAkJCQkvKiBJV19QUklWX1RZUEVfQllURSAqLwotCTEsCQkJCS8qIElXX1BSSVZfVFlQRV9DSEFSICovCi0JMCwJCQkJLyogTm90IGRlZmluZWQgKi8KLQlzaXplb2YoX191MzIpLAkJCS8qIElXX1BSSVZfVFlQRV9JTlQgKi8KLQlzaXplb2Yoc3RydWN0IGl3X2ZyZXEpLAkJLyogSVdfUFJJVl9UWVBFX0ZMT0FUICovCi0Jc2l6ZW9mKHN0cnVjdCBzb2NrYWRkciksCS8qIElXX1BSSVZfVFlQRV9BRERSICovCi0JMCwJCQkJLyogTm90IGRlZmluZWQgKi8KLX07Ci0KLS8qIFNpemUgKGluIGJ5dGVzKSBvZiB2YXJpb3VzIGV2ZW50cyAqLwotc3RhdGljIGNvbnN0IGludCBldmVudF90eXBlX3NpemVbXSA9IHsKLQlJV19FVl9MQ1BfTEVOLAkJCS8qIElXX0hFQURFUl9UWVBFX05VTEwgKi8KLQkwLAotCUlXX0VWX0NIQVJfTEVOLAkJCS8qIElXX0hFQURFUl9UWVBFX0NIQVIgKi8KLQkwLAotCUlXX0VWX1VJTlRfTEVOLAkJCS8qIElXX0hFQURFUl9UWVBFX1VJTlQgKi8KLQlJV19FVl9GUkVRX0xFTiwJCQkvKiBJV19IRUFERVJfVFlQRV9GUkVRICovCi0JSVdfRVZfQUREUl9MRU4sCQkJLyogSVdfSEVBREVSX1RZUEVfQUREUiAqLwotCTAsCi0JSVdfRVZfUE9JTlRfTEVOLAkJLyogV2l0aG91dCB2YXJpYWJsZSBwYXlsb2FkICovCi0JSVdfRVZfUEFSQU1fTEVOLAkJLyogSVdfSEVBREVSX1RZUEVfUEFSQU0gKi8KLQlJV19FVl9RVUFMX0xFTiwJCQkvKiBJV19IRUFERVJfVFlQRV9RVUFMICovCi19OwotCi0vKiBTaXplIChpbiBieXRlcykgb2YgdmFyaW91cyBldmVudHMsIGFzIHBhY2tlZCAqLwotc3RhdGljIGNvbnN0IGludCBldmVudF90eXBlX3BrX3NpemVbXSA9IHsKLQlJV19FVl9MQ1BfUEtfTEVOLAkJLyogSVdfSEVBREVSX1RZUEVfTlVMTCAqLwotCTAsCi0JSVdfRVZfQ0hBUl9QS19MRU4sCQkvKiBJV19IRUFERVJfVFlQRV9DSEFSICovCi0JMCwKLQlJV19FVl9VSU5UX1BLX0xFTiwJCS8qIElXX0hFQURFUl9UWVBFX1VJTlQgKi8KLQlJV19FVl9GUkVRX1BLX0xFTiwJCS8qIElXX0hFQURFUl9UWVBFX0ZSRVEgKi8KLQlJV19FVl9BRERSX1BLX0xFTiwJCS8qIElXX0hFQURFUl9UWVBFX0FERFIgKi8KLQkwLAotCUlXX0VWX1BPSU5UX1BLX0xFTiwJCS8qIFdpdGhvdXQgdmFyaWFibGUgcGF5bG9hZCAqLwotCUlXX0VWX1BBUkFNX1BLX0xFTiwJCS8qIElXX0hFQURFUl9UWVBFX1BBUkFNICovCi0JSVdfRVZfUVVBTF9QS19MRU4sCQkvKiBJV19IRUFERVJfVFlQRV9RVUFMICovCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqIENPTU1PTiBTVUJST1VUSU5FUyAqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogU3R1ZmYgdGhhdCBtYXkgYmUgdXNlZCBpbiB2YXJpb3VzIHBsYWNlIG9yIGRvZXNuJ3QgZml0IGluIG9uZQotICogb2YgdGhlIHNlY3Rpb24gYmVsb3cuCi0gKi8KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyoKLSAqIFJldHVybiB0aGUgZHJpdmVyIGhhbmRsZXIgYXNzb2NpYXRlZCB3aXRoIGEgc3BlY2lmaWMgV2lyZWxlc3MgRXh0ZW5zaW9uLgotICogQ2FsbGVkIGZyb20gdmFyaW91cyBwbGFjZSwgc28gbWFrZSBzdXJlIGl0IHJlbWFpbnMgZWZmaWNpZW50LgotICovCi1zdGF0aWMgaW5saW5lIGl3X2hhbmRsZXIgZ2V0X2hhbmRsZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCQkgICAgIHVuc2lnbmVkIGludCBjbWQpCi17Ci0JLyogRG9uJ3QgIm9wdGltaXNlIiB0aGUgZm9sbG93aW5nIHZhcmlhYmxlLCBpdCB3aWxsIGNyYXNoICovCi0JdW5zaWduZWQgaW50CWluZGV4OwkJLyogKk1VU1QqIGJlIHVuc2lnbmVkICovCi0KLQkvKiBDaGVjayBpZiB3ZSBoYXZlIHNvbWUgd2lyZWxlc3MgaGFuZGxlcnMgZGVmaW5lZCAqLwotCWlmKGRldi0+d2lyZWxlc3NfaGFuZGxlcnMgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQkvKiBUcnkgYXMgYSBzdGFuZGFyZCBjb21tYW5kICovCi0JaW5kZXggPSBjbWQgLSBTSU9DSVdGSVJTVDsKLQlpZihpbmRleCA8IGRldi0+d2lyZWxlc3NfaGFuZGxlcnMtPm51bV9zdGFuZGFyZCkKLQkJcmV0dXJuIGRldi0+d2lyZWxlc3NfaGFuZGxlcnMtPnN0YW5kYXJkW2luZGV4XTsKLQotCS8qIFRyeSBhcyBhIHByaXZhdGUgY29tbWFuZCAqLwotCWluZGV4ID0gY21kIC0gU0lPQ0lXRklSU1RQUklWOwotCWlmKGluZGV4IDwgZGV2LT53aXJlbGVzc19oYW5kbGVycy0+bnVtX3ByaXZhdGUpCi0JCXJldHVybiBkZXYtPndpcmVsZXNzX2hhbmRsZXJzLT5wcml2YXRlW2luZGV4XTsKLQotCS8qIE5vdCBmb3VuZCAqLwotCXJldHVybiBOVUxMOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKgotICogR2V0IHN0YXRpc3RpY3Mgb3V0IG9mIHRoZSBkcml2ZXIKLSAqLwotc3RhdGljIGlubGluZSBzdHJ1Y3QgaXdfc3RhdGlzdGljcyAqZ2V0X3dpcmVsZXNzX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0JLyogTmV3IGxvY2F0aW9uICovCi0JaWYoKGRldi0+d2lyZWxlc3NfaGFuZGxlcnMgIT0gTlVMTCkgJiYKLQkgICAoZGV2LT53aXJlbGVzc19oYW5kbGVycy0+Z2V0X3dpcmVsZXNzX3N0YXRzICE9IE5VTEwpKQotCQlyZXR1cm4gZGV2LT53aXJlbGVzc19oYW5kbGVycy0+Z2V0X3dpcmVsZXNzX3N0YXRzKGRldik7Ci0KLQkvKiBOb3QgZm91bmQgKi8KLQlyZXR1cm4gKHN0cnVjdCBpd19zdGF0aXN0aWNzICopIE5VTEw7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qCi0gKiBDYWxsIHRoZSBjb21taXQgaGFuZGxlciBpbiB0aGUgZHJpdmVyCi0gKiAoaWYgZXhpc3QgYW5kIGlmIGNvbmRpdGlvbnMgYXJlIHJpZ2h0KQotICoKLSAqIE5vdGUgOiBvdXIgY3VycmVudCBjb21taXQgc3RyYXRlZ3kgaXMgY3VycmVudGx5IHByZXR0eSBkdW1iLAotICogYnV0IHdlIHdpbGwgYmUgYWJsZSB0byBpbXByb3ZlIG9uIHRoYXQuLi4KLSAqIFRoZSBnb2FsIGlzIHRvIHRyeSB0byBhZ3JlYWdhdGUgYXMgbWFueSBjaGFuZ2VzIGFzIHBvc3NpYmxlCi0gKiBiZWZvcmUgZG9pbmcgdGhlIGNvbW1pdC4gRHJpdmVycyB0aGF0IHdpbGwgZGVmaW5lIGEgY29tbWl0IGhhbmRsZXIKLSAqIGFyZSB1c3VhbGx5IHRob3NlIHRoYXQgbmVlZCBhIHJlc2V0IGFmdGVyIGNoYW5naW5nIHBhcmFtZXRlcnMsIHNvCi0gKiB3ZSB3YW50IHRvIG1pbmltaXNlIHRoZSBudW1iZXIgb2YgcmVzZXQuCi0gKiBBIGNvb2wgaWRlYSBpcyB0byB1c2UgYSB0aW1lciA6IGF0IGVhY2ggInNldCIgY29tbWFuZCwgd2UgcmUtc2V0IHRoZQotICogdGltZXIsIHdoZW4gdGhlIHRpbWVyIGV2ZW50dWFsbHkgZmlyZXMsIHdlIGNhbGwgdGhlIGRyaXZlci4KLSAqIEhvcGVmdWxseSwgbW9yZSBvbiB0aGF0IGxhdGVyLgotICoKLSAqIEFsc28sIEknbSB3YWl0aW5nIHRvIHNlZSBob3cgbWFueSBwZW9wbGUgd2lsbCBjb21wbGFpbiBhYm91dCB0aGUKLSAqIG5ldGlmX3J1bm5pbmcoZGV2KSB0ZXN0LiBJJ20gb3BlbiBvbiB0aGF0IG9uZS4uLgotICogSG9wZWZ1bGx5LCB0aGUgZHJpdmVyIHdpbGwgcmVtZW1iZXIgdG8gZG8gYSBjb21taXQgaW4gIm9wZW4oKSIgOy0pCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IGNhbGxfY29tbWl0X2hhbmRsZXIoc3RydWN0IG5ldF9kZXZpY2UgKglkZXYpCi17Ci0JaWYoKG5ldGlmX3J1bm5pbmcoZGV2KSkgJiYKLQkgICAoZGV2LT53aXJlbGVzc19oYW5kbGVycy0+c3RhbmRhcmRbMF0gIT0gTlVMTCkpIHsKLQkJLyogQ2FsbCB0aGUgY29tbWl0IGhhbmRsZXIgb24gdGhlIGRyaXZlciAqLwotCQlyZXR1cm4gZGV2LT53aXJlbGVzc19oYW5kbGVycy0+c3RhbmRhcmRbMF0oZGV2LCBOVUxMLAotCQkJCQkJCSAgIE5VTEwsIE5VTEwpOwotCX0gZWxzZQotCQlyZXR1cm4gMDsJCS8qIENvbW1hbmQgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSAqLwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKgotICogQ2FsY3VsYXRlIHNpemUgb2YgcHJpdmF0ZSBhcmd1bWVudHMKLSAqLwotc3RhdGljIGlubGluZSBpbnQgZ2V0X3ByaXZfc2l6ZShfX3UxNglhcmdzKQotewotCWludAludW0gPSBhcmdzICYgSVdfUFJJVl9TSVpFX01BU0s7Ci0JaW50CXR5cGUgPSAoYXJncyAmIElXX1BSSVZfVFlQRV9NQVNLKSA+PiAxMjsKLQotCXJldHVybiBudW0gKiBpd19wcml2X3R5cGVfc2l6ZVt0eXBlXTsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyoKLSAqIFJlLWNhbGN1bGF0ZSB0aGUgc2l6ZSBvZiBwcml2YXRlIGFyZ3VtZW50cwotICovCi1zdGF0aWMgaW5saW5lIGludCBhZGp1c3RfcHJpdl9zaXplKF9fdTE2CQlhcmdzLAotCQkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKgl3cnF1KQotewotCWludAludW0gPSB3cnF1LT5kYXRhLmxlbmd0aDsKLQlpbnQJbWF4ID0gYXJncyAmIElXX1BSSVZfU0laRV9NQVNLOwotCWludAl0eXBlID0gKGFyZ3MgJiBJV19QUklWX1RZUEVfTUFTSykgPj4gMTI7Ci0KLQkvKiBNYWtlIHN1cmUgdGhlIGRyaXZlciBkb2Vzbid0IGdvb2YgdXAgKi8KLQlpZiAobWF4IDwgbnVtKQotCQludW0gPSBtYXg7Ci0KLQlyZXR1cm4gbnVtICogaXdfcHJpdl90eXBlX3NpemVbdHlwZV07Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qCi0gKiBTdGFuZGFyZCBXaXJlbGVzcyBIYW5kbGVyIDogZ2V0IHdpcmVsZXNzIHN0YXRzCi0gKglBbGxvdyBwcm9ncmFtYXRpYyBhY2Nlc3MgdG8gL3Byb2MvbmV0L3dpcmVsZXNzIGV2ZW4gaWYgL3Byb2MKLSAqCWRvZXNuJ3QgZXhpc3QuLi4gQWxzbyBtb3JlIGVmZmljaWVudC4uLgotICovCi1zdGF0aWMgaW50IGl3X2hhbmRsZXJfZ2V0X2l3c3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKgkJZGV2LAotCQkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqCWluZm8sCi0JCQkJICB1bmlvbiBpd3JlcV9kYXRhICoJCXdycXUsCi0JCQkJICBjaGFyICoJCQlleHRyYSkKLXsKLQkvKiBHZXQgc3RhdHMgZnJvbSB0aGUgZHJpdmVyICovCi0Jc3RydWN0IGl3X3N0YXRpc3RpY3MgKnN0YXRzOwotCi0Jc3RhdHMgPSBnZXRfd2lyZWxlc3Nfc3RhdHMoZGV2KTsKLQlpZiAoc3RhdHMgIT0gKHN0cnVjdCBpd19zdGF0aXN0aWNzICopIE5VTEwpIHsKLQotCQkvKiBDb3B5IHN0YXRpc3RpY3MgdG8gZXh0cmEgKi8KLQkJbWVtY3B5KGV4dHJhLCBzdGF0cywgc2l6ZW9mKHN0cnVjdCBpd19zdGF0aXN0aWNzKSk7Ci0JCXdycXUtPmRhdGEubGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBpd19zdGF0aXN0aWNzKTsKLQotCQkvKiBDaGVjayBpZiB3ZSBuZWVkIHRvIGNsZWFyIHRoZSB1cGRhdGVkIGZsYWcgKi8KLQkJaWYod3JxdS0+ZGF0YS5mbGFncyAhPSAwKQotCQkJc3RhdHMtPnF1YWwudXBkYXRlZCAmPSB+SVdfUVVBTF9BTExfVVBEQVRFRDsKLQkJcmV0dXJuIDA7Ci0JfSBlbHNlCi0JCXJldHVybiAtRU9QTk9UU1VQUDsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyoKLSAqIFN0YW5kYXJkIFdpcmVsZXNzIEhhbmRsZXIgOiBnZXQgaXdwcml2IGRlZmluaXRpb25zCi0gKiBFeHBvcnQgdGhlIGRyaXZlciBwcml2YXRlIGhhbmRsZXIgZGVmaW5pdGlvbgotICogVGhleSB3aWxsIGJlIHBpY2tlZCB1cCBieSB0b29scyBsaWtlIGl3cHJpdi4uLgotICovCi1zdGF0aWMgaW50IGl3X2hhbmRsZXJfZ2V0X3ByaXZhdGUoc3RydWN0IG5ldF9kZXZpY2UgKgkJZGV2LAotCQkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqCWluZm8sCi0JCQkJICB1bmlvbiBpd3JlcV9kYXRhICoJCXdycXUsCi0JCQkJICBjaGFyICoJCQlleHRyYSkKLXsKLQkvKiBDaGVjayBpZiB0aGUgZHJpdmVyIGhhcyBzb21ldGhpbmcgdG8gZXhwb3J0ICovCi0JaWYoKGRldi0+d2lyZWxlc3NfaGFuZGxlcnMtPm51bV9wcml2YXRlX2FyZ3MgPT0gMCkgfHwKLQkgICAoZGV2LT53aXJlbGVzc19oYW5kbGVycy0+cHJpdmF0ZV9hcmdzID09IE5VTEwpKQotCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0KLQkvKiBDaGVjayBpZiB0aGVyZSBpcyBlbm91Z2ggYnVmZmVyIHVwIHRoZXJlICovCi0JaWYod3JxdS0+ZGF0YS5sZW5ndGggPCBkZXYtPndpcmVsZXNzX2hhbmRsZXJzLT5udW1fcHJpdmF0ZV9hcmdzKSB7Ci0JCS8qIFVzZXIgc3BhY2UgY2FuJ3Qga25vdyBpbiBhZHZhbmNlIGhvdyBsYXJnZSB0aGUgYnVmZmVyCi0JCSAqIG5lZWRzIHRvIGJlLiBHaXZlIGl0IGEgaGludCwgc28gdGhhdCB3ZSBjYW4gc3VwcG9ydAotCQkgKiBhbnkgc2l6ZSBidWZmZXIgd2Ugd2FudCBzb21ld2hhdCBlZmZpY2llbnRseS4uLiAqLwotCQl3cnF1LT5kYXRhLmxlbmd0aCA9IGRldi0+d2lyZWxlc3NfaGFuZGxlcnMtPm51bV9wcml2YXRlX2FyZ3M7Ci0JCXJldHVybiAtRTJCSUc7Ci0JfQotCi0JLyogU2V0IHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIGlvY3Rscy4gKi8KLQl3cnF1LT5kYXRhLmxlbmd0aCA9IGRldi0+d2lyZWxlc3NfaGFuZGxlcnMtPm51bV9wcml2YXRlX2FyZ3M7Ci0KLQkvKiBDb3B5IHN0cnVjdHVyZSB0byB0aGUgdXNlciBidWZmZXIuICovCi0JbWVtY3B5KGV4dHJhLCBkZXYtPndpcmVsZXNzX2hhbmRsZXJzLT5wcml2YXRlX2FyZ3MsCi0JICAgICAgIHNpemVvZihzdHJ1Y3QgaXdfcHJpdl9hcmdzKSAqIHdycXUtPmRhdGEubGVuZ3RoKTsKLQotCXJldHVybiAwOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKiAvcHJvYy9uZXQvd2lyZWxlc3MgU1VQUE9SVCAqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBUaGUgL3Byb2MvbmV0L3dpcmVsZXNzIGZpbGUgaXMgYSBodW1hbiByZWFkYWJsZSB1c2VyLXNwYWNlIGludGVyZmFjZQotICogZXhwb3J0aW5nIHZhcmlvdXMgd2lyZWxlc3Mgc3BlY2lmaWMgc3RhdGlzdGljcyBmcm9tIHRoZSB3aXJlbGVzcyBkZXZpY2VzLgotICogVGhpcyBpcyB0aGUgbW9zdCBwb3B1bGFyIHBhcnQgb2YgdGhlIFdpcmVsZXNzIEV4dGVuc2lvbnMgOy0pCi0gKgotICogVGhpcyBpbnRlcmZhY2UgaXMgYSBwdXJlIGNsb25lIG9mIC9wcm9jL25ldC9kZXYgKGluIG5ldC9jb3JlL2Rldi5jKS4KLSAqIFRoZSBjb250ZW50IG9mIHRoZSBmaWxlIGlzIGJhc2ljYWxseSB0aGUgY29udGVudCBvZiAic3RydWN0IGl3X3N0YXRpc3RpY3MiLgotICovCi0KLSNpZmRlZiBDT05GSUdfUFJPQ19GUwotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKgotICogUHJpbnQgb25lIGVudHJ5IChsaW5lKSBvZiAvcHJvYy9uZXQvd2lyZWxlc3MKLSAqLwotc3RhdGljIF9faW5saW5lX18gdm9pZCB3aXJlbGVzc19zZXFfcHJpbnRmX3N0YXRzKHN0cnVjdCBzZXFfZmlsZSAqc2VxLAotCQkJCQkJIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0JLyogR2V0IHN0YXRzIGZyb20gdGhlIGRyaXZlciAqLwotCXN0cnVjdCBpd19zdGF0aXN0aWNzICpzdGF0cyA9IGdldF93aXJlbGVzc19zdGF0cyhkZXYpOwotCi0JaWYgKHN0YXRzKSB7Ci0JCXNlcV9wcmludGYoc2VxLCAiJTZzOiAlMDR4ICAlM2QlYyAgJTNkJWMgICUzZCVjICAlNmQgJTZkICU2ZCAiCi0JCQkJIiU2ZCAlNmQgICAlNmRcbiIsCi0JCQkgICBkZXYtPm5hbWUsIHN0YXRzLT5zdGF0dXMsIHN0YXRzLT5xdWFsLnF1YWwsCi0JCQkgICBzdGF0cy0+cXVhbC51cGRhdGVkICYgSVdfUVVBTF9RVUFMX1VQREFURUQKLQkJCSAgID8gJy4nIDogJyAnLAotCQkJICAgKChfX3MzMikgc3RhdHMtPnF1YWwubGV2ZWwpIC0KLQkJCSAgICgoc3RhdHMtPnF1YWwudXBkYXRlZCAmIElXX1FVQUxfREJNKSA/IDB4MTAwIDogMCksCi0JCQkgICBzdGF0cy0+cXVhbC51cGRhdGVkICYgSVdfUVVBTF9MRVZFTF9VUERBVEVECi0JCQkgICA/ICcuJyA6ICcgJywKLQkJCSAgICgoX19zMzIpIHN0YXRzLT5xdWFsLm5vaXNlKSAtCi0JCQkgICAoKHN0YXRzLT5xdWFsLnVwZGF0ZWQgJiBJV19RVUFMX0RCTSkgPyAweDEwMCA6IDApLAotCQkJICAgc3RhdHMtPnF1YWwudXBkYXRlZCAmIElXX1FVQUxfTk9JU0VfVVBEQVRFRAotCQkJICAgPyAnLicgOiAnICcsCi0JCQkgICBzdGF0cy0+ZGlzY2FyZC5ud2lkLCBzdGF0cy0+ZGlzY2FyZC5jb2RlLAotCQkJICAgc3RhdHMtPmRpc2NhcmQuZnJhZ21lbnQsIHN0YXRzLT5kaXNjYXJkLnJldHJpZXMsCi0JCQkgICBzdGF0cy0+ZGlzY2FyZC5taXNjLCBzdGF0cy0+bWlzcy5iZWFjb24pOwotCQlzdGF0cy0+cXVhbC51cGRhdGVkICY9IH5JV19RVUFMX0FMTF9VUERBVEVEOwotCX0KLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyoKLSAqIFByaW50IGluZm8gZm9yIC9wcm9jL25ldC93aXJlbGVzcyAocHJpbnQgYWxsIGVudHJpZXMpCi0gKi8KLXN0YXRpYyBpbnQgd2lyZWxlc3Nfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCi17Ci0JaWYgKHYgPT0gU0VRX1NUQVJUX1RPS0VOKQotCQlzZXFfcHJpbnRmKHNlcSwgIkludGVyLXwgc3RhLXwgICBRdWFsaXR5ICAgICAgICB8ICAgRGlzY2FyZGVkICIKLQkJCQkicGFja2V0cyAgICAgICAgICAgICAgIHwgTWlzc2VkIHwgV0VcbiIKLQkJCQkiIGZhY2UgfCB0dXMgfCBsaW5rIGxldmVsIG5vaXNlIHwgIG53aWQgICIKLQkJCQkiY3J5cHQgICBmcmFnICByZXRyeSAgIG1pc2MgfCBiZWFjb24gfCAlZFxuIiwKLQkJCSAgIFdJUkVMRVNTX0VYVCk7Ci0JZWxzZQotCQl3aXJlbGVzc19zZXFfcHJpbnRmX3N0YXRzKHNlcSwgdik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgd2lyZWxlc3Nfc2VxX29wcyA9IHsKLQkuc3RhcnQgPSBkZXZfc2VxX3N0YXJ0LAotCS5uZXh0ICA9IGRldl9zZXFfbmV4dCwKLQkuc3RvcCAgPSBkZXZfc2VxX3N0b3AsCi0JLnNob3cgID0gd2lyZWxlc3Nfc2VxX3Nob3csCi19OwotCi1zdGF0aWMgaW50IHdpcmVsZXNzX3NlcV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXJldHVybiBzZXFfb3BlbihmaWxlLCAmd2lyZWxlc3Nfc2VxX29wcyk7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHdpcmVsZXNzX3NlcV9mb3BzID0gewotCS5vd25lcgkgPSBUSElTX01PRFVMRSwKLQkub3BlbiAgICA9IHdpcmVsZXNzX3NlcV9vcGVuLAotCS5yZWFkICAgID0gc2VxX3JlYWQsCi0JLmxsc2VlayAgPSBzZXFfbHNlZWssCi0JLnJlbGVhc2UgPSBzZXFfcmVsZWFzZSwKLX07Ci0KLWludCBfX2luaXQgd2lyZWxlc3NfcHJvY19pbml0KHZvaWQpCi17Ci0JLyogQ3JlYXRlIC9wcm9jL25ldC93aXJlbGVzcyBlbnRyeSAqLwotCWlmICghcHJvY19uZXRfZm9wc19jcmVhdGUoIndpcmVsZXNzIiwgU19JUlVHTywgJndpcmVsZXNzX3NlcV9mb3BzKSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlyZXR1cm4gMDsKLX0KLSNlbmRpZgkvKiBDT05GSUdfUFJPQ19GUyAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKiogSU9DVEwgU1VQUE9SVCAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBUaGUgb3JpZ2luYWwgdXNlciBzcGFjZSBBUEkgdG8gY29uZmlndXJlIGFsbCB0aG9zZSBXaXJlbGVzcyBFeHRlbnNpb25zCi0gKiBpcyB0aHJvdWdoIElPQ1RMcy4KLSAqIEluIHRoZXJlLCB3ZSBjaGVjayBpZiB3ZSBuZWVkIHRvIGNhbGwgdGhlIG5ldyBkcml2ZXIgQVBJIChpd19oYW5kbGVyKQotICogb3IganVzdCBjYWxsIHRoZSBkcml2ZXIgaW9jdGwgaGFuZGxlci4KLSAqLwotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKgotICogV3JhcHBlciB0byBjYWxsIGEgc3RhbmRhcmQgV2lyZWxlc3MgRXh0ZW5zaW9uIGhhbmRsZXIuCi0gKiBXZSBkbyB2YXJpb3VzIGNoZWNrcyBhbmQgYWxzbyB0YWtlIGNhcmUgb2YgbW92aW5nIGRhdGEgYmV0d2VlbgotICogdXNlciBzcGFjZSBhbmQga2VybmVsIHNwYWNlLgotICovCi1zdGF0aWMgaW50IGlvY3RsX3N0YW5kYXJkX2NhbGwoc3RydWN0IG5ldF9kZXZpY2UgKglkZXYsCi0JCQkgICAgICAgc3RydWN0IGlmcmVxICoJCWlmciwKLQkJCSAgICAgICB1bnNpZ25lZCBpbnQJCWNtZCwKLQkJCSAgICAgICBpd19oYW5kbGVyCQloYW5kbGVyKQotewotCXN0cnVjdCBpd3JlcSAqCQkJCWl3ciA9IChzdHJ1Y3QgaXdyZXEgKikgaWZyOwotCWNvbnN0IHN0cnVjdCBpd19pb2N0bF9kZXNjcmlwdGlvbiAqCWRlc2NyOwotCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8JCQlpbmZvOwotCWludAkJCQkJcmV0ID0gLUVJTlZBTDsKLQotCS8qIEdldCB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIElPQ1RMICovCi0JaWYoKGNtZCAtIFNJT0NJV0ZJUlNUKSA+PSBzdGFuZGFyZF9pb2N0bF9udW0pCi0JCXJldHVybiAtRU9QTk9UU1VQUDsKLQlkZXNjciA9ICYoc3RhbmRhcmRfaW9jdGxbY21kIC0gU0lPQ0lXRklSU1RdKTsKLQotI2lmZGVmIFdFX0lPQ1RMX0RFQlVHCi0JcHJpbnRrKEtFUk5fREVCVUcgIiVzIChXRSkgOiBGb3VuZCBzdGFuZGFyZCBoYW5kbGVyIGZvciAweCUwNFhcbiIsCi0JICAgICAgIGlmci0+aWZyX25hbWUsIGNtZCk7Ci0JcHJpbnRrKEtFUk5fREVCVUcgIiVzIChXRSkgOiBIZWFkZXIgdHlwZSA6ICVkLCBUb2tlbiB0eXBlIDogJWQsIHNpemUgOiAlZCwgdG9rZW4gOiAlZFxuIiwgZGV2LT5uYW1lLCBkZXNjci0+aGVhZGVyX3R5cGUsIGRlc2NyLT50b2tlbl90eXBlLCBkZXNjci0+dG9rZW5fc2l6ZSwgZGVzY3ItPm1heF90b2tlbnMpOwotI2VuZGlmCS8qIFdFX0lPQ1RMX0RFQlVHICovCi0KLQkvKiBQcmVwYXJlIHRoZSBjYWxsICovCi0JaW5mby5jbWQgPSBjbWQ7Ci0JaW5mby5mbGFncyA9IDA7Ci0KLQkvKiBDaGVjayBpZiB3ZSBoYXZlIGEgcG9pbnRlciB0byB1c2VyIHNwYWNlIGRhdGEgb3Igbm90ICovCi0JaWYoZGVzY3ItPmhlYWRlcl90eXBlICE9IElXX0hFQURFUl9UWVBFX1BPSU5UKSB7Ci0KLQkJLyogTm8gZXh0cmEgYXJndW1lbnRzLiBUcml2aWFsIHRvIGhhbmRsZSAqLwotCQlyZXQgPSBoYW5kbGVyKGRldiwgJmluZm8sICYoaXdyLT51KSwgTlVMTCk7Ci0KLSNpZmRlZiBXRV9TRVRfRVZFTlQKLQkJLyogR2VuZXJhdGUgYW4gZXZlbnQgdG8gbm90aWZ5IGxpc3RlbmVycyBvZiB0aGUgY2hhbmdlICovCi0JCWlmKChkZXNjci0+ZmxhZ3MgJiBJV19ERVNDUl9GTEFHX0VWRU5UKSAmJgotCQkgICAoKHJldCA9PSAwKSB8fCAocmV0ID09IC1FSVdDT01NSVQpKSkKLQkJCXdpcmVsZXNzX3NlbmRfZXZlbnQoZGV2LCBjbWQsICYoaXdyLT51KSwgTlVMTCk7Ci0jZW5kaWYJLyogV0VfU0VUX0VWRU5UICovCi0JfSBlbHNlIHsKLQkJY2hhciAqCWV4dHJhOwotCQlpbnQJZXh0cmFfc2l6ZTsKLQkJaW50CXVzZXJfbGVuZ3RoID0gMDsKLQkJaW50CWVycjsKLQkJaW50CWVzc2lkX2NvbXBhdCA9IDA7Ci0KLQkJLyogQ2FsY3VsYXRlIHNwYWNlIG5lZWRlZCBieSBhcmd1bWVudHMuIEFsd2F5cyBhbGxvY2F0ZQotCQkgKiBmb3IgbWF4IHNwYWNlLiBFYXNpZXIsIGFuZCB3b24ndCBsYXN0IGxvbmcuLi4gKi8KLQkJZXh0cmFfc2l6ZSA9IGRlc2NyLT5tYXhfdG9rZW5zICogZGVzY3ItPnRva2VuX3NpemU7Ci0KLQkJLyogQ2hlY2sgbmVlZCBmb3IgRVNTSUQgY29tcGF0aWJpbGl0eSBmb3IgV0UgPCAyMSAqLwotCQlzd2l0Y2ggKGNtZCkgewotCQljYXNlIFNJT0NTSVdFU1NJRDoKLQkJY2FzZSBTSU9DR0lXRVNTSUQ6Ci0JCWNhc2UgU0lPQ1NJV05JQ0tOOgotCQljYXNlIFNJT0NHSVdOSUNLTjoKLQkJCWlmIChpd3ItPnUuZGF0YS5sZW5ndGggPT0gZGVzY3ItPm1heF90b2tlbnMgKyAxKQotCQkJCWVzc2lkX2NvbXBhdCA9IDE7Ci0JCQllbHNlIGlmIChJV19JU19TRVQoY21kKSAmJiAoaXdyLT51LmRhdGEubGVuZ3RoICE9IDApKSB7Ci0JCQkJY2hhciBlc3NpZFtJV19FU1NJRF9NQVhfU0laRSArIDFdOwotCi0JCQkJZXJyID0gY29weV9mcm9tX3VzZXIoZXNzaWQsIGl3ci0+dS5kYXRhLnBvaW50ZXIsCi0JCQkJCQkgICAgIGl3ci0+dS5kYXRhLmxlbmd0aCAqCi0JCQkJCQkgICAgIGRlc2NyLT50b2tlbl9zaXplKTsKLQkJCQlpZiAoZXJyKQotCQkJCQlyZXR1cm4gLUVGQVVMVDsKLQotCQkJCWlmIChlc3NpZFtpd3ItPnUuZGF0YS5sZW5ndGggLSAxXSA9PSAnXDAnKQotCQkJCQllc3NpZF9jb21wYXQgPSAxOwotCQkJfQotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCi0JCWl3ci0+dS5kYXRhLmxlbmd0aCAtPSBlc3NpZF9jb21wYXQ7Ci0KLQkJLyogQ2hlY2sgd2hhdCB1c2VyIHNwYWNlIGlzIGdpdmluZyB1cyAqLwotCQlpZihJV19JU19TRVQoY21kKSkgewotCQkJLyogQ2hlY2sgTlVMTCBwb2ludGVyICovCi0JCQlpZigoaXdyLT51LmRhdGEucG9pbnRlciA9PSBOVUxMKSAmJgotCQkJICAgKGl3ci0+dS5kYXRhLmxlbmd0aCAhPSAwKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCS8qIENoZWNrIGlmIG51bWJlciBvZiB0b2tlbiBmaXRzIHdpdGhpbiBib3VuZHMgKi8KLQkJCWlmKGl3ci0+dS5kYXRhLmxlbmd0aCA+IGRlc2NyLT5tYXhfdG9rZW5zKQotCQkJCXJldHVybiAtRTJCSUc7Ci0JCQlpZihpd3ItPnUuZGF0YS5sZW5ndGggPCBkZXNjci0+bWluX3Rva2VucykKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJfSBlbHNlIHsKLQkJCS8qIENoZWNrIE5VTEwgcG9pbnRlciAqLwotCQkJaWYoaXdyLT51LmRhdGEucG9pbnRlciA9PSBOVUxMKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJLyogU2F2ZSB1c2VyIHNwYWNlIGJ1ZmZlciBzaXplIGZvciBjaGVja2luZyAqLwotCQkJdXNlcl9sZW5ndGggPSBpd3ItPnUuZGF0YS5sZW5ndGg7Ci0KLQkJCS8qIERvbid0IGNoZWNrIGlmIHVzZXJfbGVuZ3RoID4gbWF4IHRvIGFsbG93IGZvcndhcmQKLQkJCSAqIGNvbXBhdGliaWxpdHkuIFRoZSB0ZXN0IHVzZXJfbGVuZ3RoIDwgbWluIGlzCi0JCQkgKiBpbXBsaWVkIGJ5IHRoZSB0ZXN0IGF0IHRoZSBlbmQuICovCi0KLQkJCS8qIFN1cHBvcnQgZm9yIHZlcnkgbGFyZ2UgcmVxdWVzdHMgKi8KLQkJCWlmKChkZXNjci0+ZmxhZ3MgJiBJV19ERVNDUl9GTEFHX05PTUFYKSAmJgotCQkJICAgKHVzZXJfbGVuZ3RoID4gZGVzY3ItPm1heF90b2tlbnMpKSB7Ci0JCQkJLyogQWxsb3cgdXNlcnNwYWNlIHRvIEdFVCBtb3JlIHRoYW4gbWF4IHNvCi0JCQkJICogd2UgY2FuIHN1cHBvcnQgYW55IHNpemUgR0VUIHJlcXVlc3RzLgotCQkJCSAqIFRoZXJlIGlzIHN0aWxsIGEgbGltaXQgOiAtRU5PTUVNLiAqLwotCQkJCWV4dHJhX3NpemUgPSB1c2VyX2xlbmd0aCAqIGRlc2NyLT50b2tlbl9zaXplOwotCQkJCS8qIE5vdGUgOiB1c2VyX2xlbmd0aCBpcyBvcmlnaW5hbGx5IGEgX191MTYsCi0JCQkJICogYW5kIHRva2VuX3NpemUgaXMgY29udHJvbGxlZCBieSB1cywKLQkJCQkgKiBzbyBleHRyYV9zaXplIHdvbid0IGdldCBuZWdhdGl2ZSBhbmQKLQkJCQkgKiB3b24ndCBvdmVyZmxvdy4uLiAqLwotCQkJfQotCQl9Ci0KLSNpZmRlZiBXRV9JT0NUTF9ERUJVRwotCQlwcmludGsoS0VSTl9ERUJVRyAiJXMgKFdFKSA6IE1hbGxvYyAlZCBieXRlc1xuIiwKLQkJICAgICAgIGRldi0+bmFtZSwgZXh0cmFfc2l6ZSk7Ci0jZW5kaWYJLyogV0VfSU9DVExfREVCVUcgKi8KLQotCQkvKiBDcmVhdGUgdGhlIGtlcm5lbCBidWZmZXIgKi8KLQkJLyogICAga3phbGxvYyBlbnN1cmVzIE5VTEwtdGVybWluYXRpb24gZm9yIGVzc2lkX2NvbXBhdCAqLwotCQlleHRyYSA9IGt6YWxsb2MoZXh0cmFfc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JCWlmIChleHRyYSA9PSBOVUxMKSB7Ci0JCQlyZXR1cm4gLUVOT01FTTsKLQkJfQotCi0JCS8qIElmIGl0IGlzIGEgU0VULCBnZXQgYWxsIHRoZSBleHRyYSBkYXRhIGluIGhlcmUgKi8KLQkJaWYoSVdfSVNfU0VUKGNtZCkgJiYgKGl3ci0+dS5kYXRhLmxlbmd0aCAhPSAwKSkgewotCQkJZXJyID0gY29weV9mcm9tX3VzZXIoZXh0cmEsIGl3ci0+dS5kYXRhLnBvaW50ZXIsCi0JCQkJCSAgICAgaXdyLT51LmRhdGEubGVuZ3RoICoKLQkJCQkJICAgICBkZXNjci0+dG9rZW5fc2l6ZSk7Ci0JCQlpZiAoZXJyKSB7Ci0JCQkJa2ZyZWUoZXh0cmEpOwotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJfQotI2lmZGVmIFdFX0lPQ1RMX0RFQlVHCi0JCQlwcmludGsoS0VSTl9ERUJVRyAiJXMgKFdFKSA6IEdvdCAlZCBieXRlc1xuIiwKLQkJCSAgICAgICBkZXYtPm5hbWUsCi0JCQkgICAgICAgaXdyLT51LmRhdGEubGVuZ3RoICogZGVzY3ItPnRva2VuX3NpemUpOwotI2VuZGlmCS8qIFdFX0lPQ1RMX0RFQlVHICovCi0JCX0KLQotCQkvKiBDYWxsIHRoZSBoYW5kbGVyICovCi0JCXJldCA9IGhhbmRsZXIoZGV2LCAmaW5mbywgJihpd3ItPnUpLCBleHRyYSk7Ci0KLQkJaXdyLT51LmRhdGEubGVuZ3RoICs9IGVzc2lkX2NvbXBhdDsKLQotCQkvKiBJZiB3ZSBoYXZlIHNvbWV0aGluZyB0byByZXR1cm4gdG8gdGhlIHVzZXIgKi8KLQkJaWYgKCFyZXQgJiYgSVdfSVNfR0VUKGNtZCkpIHsKLQkJCS8qIENoZWNrIGlmIHRoZXJlIGlzIGVub3VnaCBidWZmZXIgdXAgdGhlcmUgKi8KLQkJCWlmKHVzZXJfbGVuZ3RoIDwgaXdyLT51LmRhdGEubGVuZ3RoKSB7Ci0JCQkJa2ZyZWUoZXh0cmEpOwotCQkJCXJldHVybiAtRTJCSUc7Ci0JCQl9Ci0KLQkJCWVyciA9IGNvcHlfdG9fdXNlcihpd3ItPnUuZGF0YS5wb2ludGVyLCBleHRyYSwKLQkJCQkJICAgaXdyLT51LmRhdGEubGVuZ3RoICoKLQkJCQkJICAgZGVzY3ItPnRva2VuX3NpemUpOwotCQkJaWYgKGVycikKLQkJCQlyZXQgPSAgLUVGQVVMVDsKLSNpZmRlZiBXRV9JT0NUTF9ERUJVRwotCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzIChXRSkgOiBXcm90ZSAlZCBieXRlc1xuIiwKLQkJCSAgICAgICBkZXYtPm5hbWUsCi0JCQkgICAgICAgaXdyLT51LmRhdGEubGVuZ3RoICogZGVzY3ItPnRva2VuX3NpemUpOwotI2VuZGlmCS8qIFdFX0lPQ1RMX0RFQlVHICovCi0JCX0KLQotI2lmZGVmIFdFX1NFVF9FVkVOVAotCQkvKiBHZW5lcmF0ZSBhbiBldmVudCB0byBub3RpZnkgbGlzdGVuZXJzIG9mIHRoZSBjaGFuZ2UgKi8KLQkJaWYoKGRlc2NyLT5mbGFncyAmIElXX0RFU0NSX0ZMQUdfRVZFTlQpICYmCi0JCSAgICgocmV0ID09IDApIHx8IChyZXQgPT0gLUVJV0NPTU1JVCkpKSB7Ci0JCQlpZihkZXNjci0+ZmxhZ3MgJiBJV19ERVNDUl9GTEFHX1JFU1RSSUNUKQotCQkJCS8qIElmIHRoZSBldmVudCBpcyByZXN0cmljdGVkLCBkb24ndAotCQkJCSAqIGV4cG9ydCB0aGUgcGF5bG9hZCAqLwotCQkJCXdpcmVsZXNzX3NlbmRfZXZlbnQoZGV2LCBjbWQsICYoaXdyLT51KSwgTlVMTCk7Ci0JCQllbHNlCi0JCQkJd2lyZWxlc3Nfc2VuZF9ldmVudChkZXYsIGNtZCwgJihpd3ItPnUpLAotCQkJCQkJICAgIGV4dHJhKTsKLQkJfQotI2VuZGlmCS8qIFdFX1NFVF9FVkVOVCAqLwotCi0JCS8qIENsZWFudXAgLSBJIHRvbGQgeW91IGl0IHdhc24ndCB0aGF0IGxvbmcgOy0pICovCi0JCWtmcmVlKGV4dHJhKTsKLQl9Ci0KLQkvKiBDYWxsIGNvbW1pdCBoYW5kbGVyIGlmIG5lZWRlZCBhbmQgZGVmaW5lZCAqLwotCWlmKHJldCA9PSAtRUlXQ09NTUlUKQotCQlyZXQgPSBjYWxsX2NvbW1pdF9oYW5kbGVyKGRldik7Ci0KLQkvKiBIZXJlLCB3ZSB3aWxsIGdlbmVyYXRlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWVkZWQgKi8KLQotCXJldHVybiByZXQ7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qCi0gKiBXcmFwcGVyIHRvIGNhbGwgYSBwcml2YXRlIFdpcmVsZXNzIEV4dGVuc2lvbiBoYW5kbGVyLgotICogV2UgZG8gdmFyaW91cyBjaGVja3MgYW5kIGFsc28gdGFrZSBjYXJlIG9mIG1vdmluZyBkYXRhIGJldHdlZW4KLSAqIHVzZXIgc3BhY2UgYW5kIGtlcm5lbCBzcGFjZS4KLSAqIEl0J3Mgbm90IGFzIG5pY2UgYW5kIHNsaW1saW5lIGFzIHRoZSBzdGFuZGFyZCB3cmFwcGVyLiBUaGUgY2F1c2UKLSAqIGlzIHN0cnVjdCBpd19wcml2X2FyZ3MsIHdoaWNoIHdhcyBub3QgcmVhbGx5IGRlc2lnbmVkIGZvciB0aGUKLSAqIGpvYiB3ZSBhcmUgZ29pbmcgaGVyZS4KLSAqCi0gKiBJTVBPUlRBTlQgOiBUaGlzIGZ1bmN0aW9uIHByZXZlbnQgdG8gc2V0IGFuZCBnZXQgZGF0YSBvbiB0aGUgc2FtZQotICogSU9DVEwgYW5kIGVuZm9yY2UgdGhlIFNFVC9HRVQgY29udmVudGlvbi4gTm90IGRvaW5nIGl0IHdvdWxkIGJlCi0gKiBmYXIgdG9vIGhhaXJ5Li4uCi0gKiBJZiB5b3UgbmVlZCB0byBzZXQgYW5kIGdldCBkYXRhIGF0IHRoZSBzYW1lIHRpbWUsIHBsZWFzZSBkb24ndCB1c2UKLSAqIGEgaXdfaGFuZGxlciBidXQgcHJvY2VzcyBpdCBpbiB5b3VyIGlvY3RsIGhhbmRsZXIgKGkuZS4gdXNlIHRoZQotICogb2xkIGRyaXZlciBBUEkpLgotICovCi1zdGF0aWMgaW5saW5lIGludCBpb2N0bF9wcml2YXRlX2NhbGwoc3RydWN0IG5ldF9kZXZpY2UgKglkZXYsCi0JCQkJICAgICBzdHJ1Y3QgaWZyZXEgKgkJaWZyLAotCQkJCSAgICAgdW5zaWduZWQgaW50CQljbWQsCi0JCQkJICAgICBpd19oYW5kbGVyCQloYW5kbGVyKQotewotCXN0cnVjdCBpd3JlcSAqCQkJaXdyID0gKHN0cnVjdCBpd3JlcSAqKSBpZnI7Ci0JY29uc3Qgc3RydWN0IGl3X3ByaXZfYXJncyAqCWRlc2NyID0gTlVMTDsKLQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvCQlpbmZvOwotCWludAkJCQlleHRyYV9zaXplID0gMDsKLQlpbnQJCQkJaTsKLQlpbnQJCQkJcmV0ID0gLUVJTlZBTDsKLQotCS8qIEdldCB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIElPQ1RMICovCi0JZm9yKGkgPSAwOyBpIDwgZGV2LT53aXJlbGVzc19oYW5kbGVycy0+bnVtX3ByaXZhdGVfYXJnczsgaSsrKQotCQlpZihjbWQgPT0gZGV2LT53aXJlbGVzc19oYW5kbGVycy0+cHJpdmF0ZV9hcmdzW2ldLmNtZCkgewotCQkJZGVzY3IgPSAmKGRldi0+d2lyZWxlc3NfaGFuZGxlcnMtPnByaXZhdGVfYXJnc1tpXSk7Ci0JCQlicmVhazsKLQkJfQotCi0jaWZkZWYgV0VfSU9DVExfREVCVUcKLQlwcmludGsoS0VSTl9ERUJVRyAiJXMgKFdFKSA6IEZvdW5kIHByaXZhdGUgaGFuZGxlciBmb3IgMHglMDRYXG4iLAotCSAgICAgICBpZnItPmlmcl9uYW1lLCBjbWQpOwotCWlmKGRlc2NyKSB7Ci0JCXByaW50ayhLRVJOX0RFQlVHICIlcyAoV0UpIDogTmFtZSAlcywgc2V0ICVYLCBnZXQgJVhcbiIsCi0JCSAgICAgICBkZXYtPm5hbWUsIGRlc2NyLT5uYW1lLAotCQkgICAgICAgZGVzY3ItPnNldF9hcmdzLCBkZXNjci0+Z2V0X2FyZ3MpOwotCX0KLSNlbmRpZgkvKiBXRV9JT0NUTF9ERUJVRyAqLwotCi0JLyogQ29tcHV0ZSB0aGUgc2l6ZSBvZiB0aGUgc2V0L2dldCBhcmd1bWVudHMgKi8KLQlpZihkZXNjciAhPSBOVUxMKSB7Ci0JCWlmKElXX0lTX1NFVChjbWQpKSB7Ci0JCQlpbnQJb2Zmc2V0ID0gMDsJLyogRm9yIHN1Yi1pb2N0bHMgKi8KLQkJCS8qIENoZWNrIGZvciBzdWItaW9jdGwgaGFuZGxlciAqLwotCQkJaWYoZGVzY3ItPm5hbWVbMF0gPT0gJ1wwJykKLQkJCQkvKiBSZXNlcnZlIG9uZSBpbnQgZm9yIHN1Yi1pb2N0bCBpbmRleCAqLwotCQkJCW9mZnNldCA9IHNpemVvZihfX3UzMik7Ci0KLQkJCS8qIFNpemUgb2Ygc2V0IGFyZ3VtZW50cyAqLwotCQkJZXh0cmFfc2l6ZSA9IGdldF9wcml2X3NpemUoZGVzY3ItPnNldF9hcmdzKTsKLQotCQkJLyogRG9lcyBpdCBmaXRzIGluIGl3ciA/ICovCi0JCQlpZigoZGVzY3ItPnNldF9hcmdzICYgSVdfUFJJVl9TSVpFX0ZJWEVEKSAmJgotCQkJICAgKChleHRyYV9zaXplICsgb2Zmc2V0KSA8PSBJRk5BTVNJWikpCi0JCQkJZXh0cmFfc2l6ZSA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBTaXplIG9mIGdldCBhcmd1bWVudHMgKi8KLQkJCWV4dHJhX3NpemUgPSBnZXRfcHJpdl9zaXplKGRlc2NyLT5nZXRfYXJncyk7Ci0KLQkJCS8qIERvZXMgaXQgZml0cyBpbiBpd3IgPyAqLwotCQkJaWYoKGRlc2NyLT5nZXRfYXJncyAmIElXX1BSSVZfU0laRV9GSVhFRCkgJiYKLQkJCSAgIChleHRyYV9zaXplIDw9IElGTkFNU0laKSkKLQkJCQlleHRyYV9zaXplID0gMDsKLQkJfQotCX0KLQotCS8qIFByZXBhcmUgdGhlIGNhbGwgKi8KLQlpbmZvLmNtZCA9IGNtZDsKLQlpbmZvLmZsYWdzID0gMDsKLQotCS8qIENoZWNrIGlmIHdlIGhhdmUgYSBwb2ludGVyIHRvIHVzZXIgc3BhY2UgZGF0YSBvciBub3QuICovCi0JaWYoZXh0cmFfc2l6ZSA9PSAwKSB7Ci0JCS8qIE5vIGV4dHJhIGFyZ3VtZW50cy4gVHJpdmlhbCB0byBoYW5kbGUgKi8KLQkJcmV0ID0gaGFuZGxlcihkZXYsICZpbmZvLCAmKGl3ci0+dSksIChjaGFyICopICYoaXdyLT51KSk7Ci0JfSBlbHNlIHsKLQkJY2hhciAqCWV4dHJhOwotCQlpbnQJZXJyOwotCi0JCS8qIENoZWNrIHdoYXQgdXNlciBzcGFjZSBpcyBnaXZpbmcgdXMgKi8KLQkJaWYoSVdfSVNfU0VUKGNtZCkpIHsKLQkJCS8qIENoZWNrIE5VTEwgcG9pbnRlciAqLwotCQkJaWYoKGl3ci0+dS5kYXRhLnBvaW50ZXIgPT0gTlVMTCkgJiYKLQkJCSAgIChpd3ItPnUuZGF0YS5sZW5ndGggIT0gMCkpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJCS8qIERvZXMgaXQgZml0cyB3aXRoaW4gYm91bmRzID8gKi8KLQkJCWlmKGl3ci0+dS5kYXRhLmxlbmd0aCA+IChkZXNjci0+c2V0X2FyZ3MgJgotCQkJCQkJIElXX1BSSVZfU0laRV9NQVNLKSkKLQkJCQlyZXR1cm4gLUUyQklHOwotCQl9IGVsc2UgewotCQkJLyogQ2hlY2sgTlVMTCBwb2ludGVyICovCi0JCQlpZihpd3ItPnUuZGF0YS5wb2ludGVyID09IE5VTEwpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQotI2lmZGVmIFdFX0lPQ1RMX0RFQlVHCi0JCXByaW50ayhLRVJOX0RFQlVHICIlcyAoV0UpIDogTWFsbG9jICVkIGJ5dGVzXG4iLAotCQkgICAgICAgZGV2LT5uYW1lLCBleHRyYV9zaXplKTsKLSNlbmRpZgkvKiBXRV9JT0NUTF9ERUJVRyAqLwotCi0JCS8qIEFsd2F5cyBhbGxvY2F0ZSBmb3IgbWF4IHNwYWNlLiBFYXNpZXIsIGFuZCB3b24ndCBsYXN0Ci0JCSAqIGxvbmcuLi4gKi8KLQkJZXh0cmEgPSBrbWFsbG9jKGV4dHJhX3NpemUsIEdGUF9LRVJORUwpOwotCQlpZiAoZXh0cmEgPT0gTlVMTCkgewotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KLQotCQkvKiBJZiBpdCBpcyBhIFNFVCwgZ2V0IGFsbCB0aGUgZXh0cmEgZGF0YSBpbiBoZXJlICovCi0JCWlmKElXX0lTX1NFVChjbWQpICYmIChpd3ItPnUuZGF0YS5sZW5ndGggIT0gMCkpIHsKLQkJCWVyciA9IGNvcHlfZnJvbV91c2VyKGV4dHJhLCBpd3ItPnUuZGF0YS5wb2ludGVyLAotCQkJCQkgICAgIGV4dHJhX3NpemUpOwotCQkJaWYgKGVycikgewotCQkJCWtmcmVlKGV4dHJhKTsKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCX0KLSNpZmRlZiBXRV9JT0NUTF9ERUJVRwotCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzIChXRSkgOiBHb3QgJWQgZWxlbVxuIiwKLQkJCSAgICAgICBkZXYtPm5hbWUsIGl3ci0+dS5kYXRhLmxlbmd0aCk7Ci0jZW5kaWYJLyogV0VfSU9DVExfREVCVUcgKi8KLQkJfQotCi0JCS8qIENhbGwgdGhlIGhhbmRsZXIgKi8KLQkJcmV0ID0gaGFuZGxlcihkZXYsICZpbmZvLCAmKGl3ci0+dSksIGV4dHJhKTsKLQotCQkvKiBJZiB3ZSBoYXZlIHNvbWV0aGluZyB0byByZXR1cm4gdG8gdGhlIHVzZXIgKi8KLQkJaWYgKCFyZXQgJiYgSVdfSVNfR0VUKGNtZCkpIHsKLQotCQkJLyogQWRqdXN0IGZvciB0aGUgYWN0dWFsIGxlbmd0aCBpZiBpdCdzIHZhcmlhYmxlLAotCQkJICogYXZvaWQgbGVha2luZyBrZXJuZWwgYml0cyBvdXRzaWRlLiAqLwotCQkJaWYgKCEoZGVzY3ItPmdldF9hcmdzICYgSVdfUFJJVl9TSVpFX0ZJWEVEKSkgewotCQkJCWV4dHJhX3NpemUgPSBhZGp1c3RfcHJpdl9zaXplKGRlc2NyLT5nZXRfYXJncywKLQkJCQkJCQkgICAgICAmKGl3ci0+dSkpOwotCQkJfQotCi0JCQllcnIgPSBjb3B5X3RvX3VzZXIoaXdyLT51LmRhdGEucG9pbnRlciwgZXh0cmEsCi0JCQkJCSAgIGV4dHJhX3NpemUpOwotCQkJaWYgKGVycikKLQkJCQlyZXQgPSAgLUVGQVVMVDsKLSNpZmRlZiBXRV9JT0NUTF9ERUJVRwotCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzIChXRSkgOiBXcm90ZSAlZCBlbGVtXG4iLAotCQkJICAgICAgIGRldi0+bmFtZSwgaXdyLT51LmRhdGEubGVuZ3RoKTsKLSNlbmRpZgkvKiBXRV9JT0NUTF9ERUJVRyAqLwotCQl9Ci0KLQkJLyogQ2xlYW51cCAtIEkgdG9sZCB5b3UgaXQgd2Fzbid0IHRoYXQgbG9uZyA7LSkgKi8KLQkJa2ZyZWUoZXh0cmEpOwotCX0KLQotCi0JLyogQ2FsbCBjb21taXQgaGFuZGxlciBpZiBuZWVkZWQgYW5kIGRlZmluZWQgKi8KLQlpZihyZXQgPT0gLUVJV0NPTU1JVCkKLQkJcmV0ID0gY2FsbF9jb21taXRfaGFuZGxlcihkZXYpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyoKLSAqIE1haW4gSU9DVGwgZGlzcGF0Y2hlci4gQ2FsbGVkIGZyb20gdGhlIG1haW4gbmV0d29ya2luZyBjb2RlCi0gKiAoZGV2X2lvY3RsKCkgaW4gbmV0L2NvcmUvZGV2LmMpLgotICogQ2hlY2sgdGhlIHR5cGUgb2YgSU9DVEwgYW5kIGNhbGwgdGhlIGFwcHJvcHJpYXRlIHdyYXBwZXIuLi4KLSAqLwotaW50IHdpcmVsZXNzX3Byb2Nlc3NfaW9jdGwoc3RydWN0IGlmcmVxICppZnIsIHVuc2lnbmVkIGludCBjbWQpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKLQlpd19oYW5kbGVyCWhhbmRsZXI7Ci0KLQkvKiBQZXJtaXNzaW9ucyBhcmUgYWxyZWFkeSBjaGVja2VkIGluIGRldl9pb2N0bCgpIGJlZm9yZSBjYWxsaW5nIHVzLgotCSAqIFRoZSBjb3B5X3RvL2Zyb21fdXNlcigpIG9mIGlmciBpcyBhbHNvIGRlYWx0IHdpdGggaW4gdGhlcmUgKi8KLQotCS8qIE1ha2Ugc3VyZSB0aGUgZGV2aWNlIGV4aXN0ICovCi0JaWYgKChkZXYgPSBfX2Rldl9nZXRfYnlfbmFtZShpZnItPmlmcl9uYW1lKSkgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQkvKiBBIGJ1bmNoIG9mIHNwZWNpYWwgY2FzZXMsIHRoZW4gdGhlIGdlbmVyaWMgY2FzZS4uLgotCSAqIE5vdGUgdGhhdCAnY21kJyBpcyBhbHJlYWR5IGZpbHRlcmVkIGluIGRldl9pb2N0bCgpIHdpdGgKLQkgKiAoY21kID49IFNJT0NJV0ZJUlNUICYmIGNtZCA8PSBTSU9DSVdMQVNUKSAqLwotCXN3aXRjaChjbWQpCi0JewotCQljYXNlIFNJT0NHSVdTVEFUUzoKLQkJCS8qIEdldCBXaXJlbGVzcyBTdGF0cyAqLwotCQkJcmV0dXJuIGlvY3RsX3N0YW5kYXJkX2NhbGwoZGV2LAotCQkJCQkJICAgaWZyLAotCQkJCQkJICAgY21kLAotCQkJCQkJICAgJml3X2hhbmRsZXJfZ2V0X2l3c3RhdHMpOwotCi0JCWNhc2UgU0lPQ0dJV1BSSVY6Ci0JCQkvKiBDaGVjayBpZiB3ZSBoYXZlIHNvbWUgd2lyZWxlc3MgaGFuZGxlcnMgZGVmaW5lZCAqLwotCQkJaWYoZGV2LT53aXJlbGVzc19oYW5kbGVycyAhPSBOVUxMKSB7Ci0JCQkJLyogV2UgZXhwb3J0IHRvIHVzZXIgc3BhY2UgdGhlIGRlZmluaXRpb24gb2YKLQkJCQkgKiB0aGUgcHJpdmF0ZSBoYW5kbGVyIG91cnNlbHZlcyAqLwotCQkJCXJldHVybiBpb2N0bF9zdGFuZGFyZF9jYWxsKGRldiwKLQkJCQkJCQkgICBpZnIsCi0JCQkJCQkJICAgY21kLAotCQkJCQkJCSAgICZpd19oYW5kbGVyX2dldF9wcml2YXRlKTsKLQkJCX0KLQkJCS8vICMjIEZhbGwtdGhyb3VnaCBmb3Igb2xkIEFQSSAjIwotCQlkZWZhdWx0OgotCQkJLyogR2VuZXJpYyBJT0NUTCAqLwotCQkJLyogQmFzaWMgY2hlY2sgKi8KLQkJCWlmICghbmV0aWZfZGV2aWNlX3ByZXNlbnQoZGV2KSkKLQkJCQlyZXR1cm4gLUVOT0RFVjsKLQkJCS8qIE5ldyBkcml2ZXIgQVBJIDogdHJ5IHRvIGZpbmQgdGhlIGhhbmRsZXIgKi8KLQkJCWhhbmRsZXIgPSBnZXRfaGFuZGxlcihkZXYsIGNtZCk7Ci0JCQlpZihoYW5kbGVyICE9IE5VTEwpIHsKLQkJCQkvKiBTdGFuZGFyZCBhbmQgcHJpdmF0ZSBhcmUgbm90IHRoZSBzYW1lICovCi0JCQkJaWYoY21kIDwgU0lPQ0lXRklSU1RQUklWKQotCQkJCQlyZXR1cm4gaW9jdGxfc3RhbmRhcmRfY2FsbChkZXYsCi0JCQkJCQkJCSAgIGlmciwKLQkJCQkJCQkJICAgY21kLAotCQkJCQkJCQkgICBoYW5kbGVyKTsKLQkJCQllbHNlCi0JCQkJCXJldHVybiBpb2N0bF9wcml2YXRlX2NhbGwoZGV2LAotCQkJCQkJCQkgIGlmciwKLQkJCQkJCQkJICBjbWQsCi0JCQkJCQkJCSAgaGFuZGxlcik7Ci0JCQl9Ci0JCQkvKiBPbGQgZHJpdmVyIEFQSSA6IGNhbGwgZHJpdmVyIGlvY3RsIGhhbmRsZXIgKi8KLQkJCWlmIChkZXYtPmRvX2lvY3RsKSB7Ci0JCQkJcmV0dXJuIGRldi0+ZG9faW9jdGwoZGV2LCBpZnIsIGNtZCk7Ci0JCQl9Ci0JCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0JfQotCS8qIE5vdCByZWFjaGVkICovCi0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqIFJUTkVUTElOSyBSRVFVRVNUIEFQSSAqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIFRoZSBhbHRlcm5hdGUgdXNlciBzcGFjZSBBUEkgdG8gY29uZmlndXJlIGFsbCB0aG9zZSBXaXJlbGVzcyBFeHRlbnNpb25zCi0gKiBpcyB0aHJvdWdoIFJ0TmV0bGluay4KLSAqIFRoaXMgQVBJIHN1cHBvcnQgb25seSB0aGUgbmV3IGRyaXZlciBBUEkgKGl3X2hhbmRsZXIpLgotICoKLSAqIFRoaXMgUnROZXRsaW5rIEFQSSB1c2UgdGhlIHNhbWUgcXVlcnkvcmVwbHkgbW9kZWwgYXMgdGhlIGlvY3RsIEFQSS4KLSAqIE1heGltdW0gZWZmb3J0IGhhcyBiZWVuIGRvbmUgdG8gZml0IGluIHRoZSBSdE5ldGxpbmsgbW9kZWwsIGFuZAotICogd2Ugc3VwcG9ydCBib3RoIFJ0TmV0bGluayBTZXQgYW5kIFJ0TmVsaW5rIEdldCBvcGVyYXRpb25zLgotICogT24gdGhlIG90aGVyIGhhbmQsIHdlIGRvbid0IG9mZmVyIER1bXAgb3BlcmF0aW9ucyBiZWNhdXNlIG9mIHRoZQotICogZm9sbG93aW5nIHJlYXNvbnMgOgotICoJbyBMYXJnZSBudW1iZXIgb2YgcGFyYW1ldGVycywgbW9zdCBvcHRpb25hbAotICoJbyBMYXJnZSBzaXplIG9mIHNvbWUgcGFyYW1ldGVycyAoPiAxMDAgYnl0ZXMpCi0gKglvIEVhY2ggcGFyYW1ldGVycyBuZWVkIHRvIGJlIGV4dHJhY3RlZCBmcm9tIGhhcmR3YXJlCi0gKglvIFNjYW4gcmVxdWVzdHMgY2FuIHRha2Ugc2Vjb25kcyBhbmQgZGlzYWJsZSBuZXR3b3JrIGFjdGl2aXR5LgotICogQmVjYXVzZSBvZiB0aGlzIGhpZ2ggY29zdC9vdmVyaGVhZCwgd2Ugd2FudCB0byByZXR1cm4gb25seSB0aGUKLSAqIHBhcmFtZXRlcnMgdGhlIHVzZXIgYXBwbGljYXRpb24gaXMgcmVhbGx5IGludGVyZXN0ZWQgaW4uCi0gKiBXZSBjb3VsZCBvZmZlciBwYXJ0aWFsIER1bXAgdXNpbmcgdGhlIElXX0RFU0NSX0ZMQUdfRFVNUCBmbGFnLgotICoKLSAqIFRoZSBBUEkgdXNlcyB0aGUgc3RhbmRhcmQgUnROZXRsaW5rIHNvY2tldC4gV2hlbiB0aGUgUnROZXRsaW5rIGNvZGUKLSAqIGZpbmQgYSBJRkxBX1dJUkVMRVNTIGZpZWxkIGluIGEgUnROZXRsaW5rIFNFVF9MSU5LIHJlcXVlc3QsCi0gKiBpdCBjYWxscyBoZXJlLgotICovCi0KLSNpZmRlZiBDT05GSUdfTkVUX1dJUkVMRVNTX1JUTkVUTElOSwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyoKLSAqIFdyYXBwZXIgdG8gY2FsbCBhIHN0YW5kYXJkIFdpcmVsZXNzIEV4dGVuc2lvbiBHRVQgaGFuZGxlci4KLSAqIFdlIGRvIHZhcmlvdXMgY2hlY2tzIGFuZCBjYWxsIHRoZSBoYW5kbGVyIHdpdGggdGhlIHByb3BlciBhcmdzLgotICovCi1zdGF0aWMgaW50IHJ0bmV0bGlua19zdGFuZGFyZF9nZXQoc3RydWN0IG5ldF9kZXZpY2UgKglkZXYsCi0JCQkJICBzdHJ1Y3QgaXdfZXZlbnQgKglyZXF1ZXN0LAotCQkJCSAgaW50CQkJcmVxdWVzdF9sZW4sCi0JCQkJICBpd19oYW5kbGVyCQloYW5kbGVyLAotCQkJCSAgY2hhciAqKgkJcF9idWYsCi0JCQkJICBpbnQgKgkJCXBfbGVuKQotewotCWNvbnN0IHN0cnVjdCBpd19pb2N0bF9kZXNjcmlwdGlvbiAqCWRlc2NyID0gTlVMTDsKLQl1bnNpZ25lZCBpbnQJCQkJY21kOwotCXVuaW9uIGl3cmVxX2RhdGEgKgkJCXdycXU7Ci0JaW50CQkJCQloZHJfbGVuOwotCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8JCQlpbmZvOwotCWNoYXIgKgkJCQkJYnVmZmVyID0gTlVMTDsKLQlpbnQJCQkJCWJ1ZmZlcl9zaXplID0gMDsKLQlpbnQJCQkJCXJldCA9IC1FSU5WQUw7Ci0KLQkvKiBHZXQgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBSZXF1ZXN0ICovCi0JY21kID0gcmVxdWVzdC0+Y21kOwotCWlmKChjbWQgLSBTSU9DSVdGSVJTVCkgPj0gc3RhbmRhcmRfaW9jdGxfbnVtKQotCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0JZGVzY3IgPSAmKHN0YW5kYXJkX2lvY3RsW2NtZCAtIFNJT0NJV0ZJUlNUXSk7Ci0KLSNpZmRlZiBXRV9SVE5FVExJTktfREVCVUcKLQlwcmludGsoS0VSTl9ERUJVRyAiJXMgKFdFLnIpIDogRm91bmQgc3RhbmRhcmQgaGFuZGxlciBmb3IgMHglMDRYXG4iLAotCSAgICAgICBkZXYtPm5hbWUsIGNtZCk7Ci0JcHJpbnRrKEtFUk5fREVCVUcgIiVzIChXRS5yKSA6IEhlYWRlciB0eXBlIDogJWQsIFRva2VuIHR5cGUgOiAlZCwgc2l6ZSA6ICVkLCB0b2tlbiA6ICVkXG4iLCBkZXYtPm5hbWUsIGRlc2NyLT5oZWFkZXJfdHlwZSwgZGVzY3ItPnRva2VuX3R5cGUsIGRlc2NyLT50b2tlbl9zaXplLCBkZXNjci0+bWF4X3Rva2Vucyk7Ci0jZW5kaWYJLyogV0VfUlRORVRMSU5LX0RFQlVHICovCi0KLQkvKiBDaGVjayBpZiB3cnF1IGlzIGNvbXBsZXRlICovCi0JaGRyX2xlbiA9IGV2ZW50X3R5cGVfc2l6ZVtkZXNjci0+aGVhZGVyX3R5cGVdOwotCWlmKHJlcXVlc3RfbGVuIDwgaGRyX2xlbikgewotI2lmZGVmIFdFX1JUTkVUTElOS19ERUJVRwotCQlwcmludGsoS0VSTl9ERUJVRwotCQkgICAgICAgIiVzIChXRS5yKSA6IFdpcmVsZXNzIHJlcXVlc3QgdG9vIHNob3J0ICglZClcbiIsCi0JCSAgICAgICBkZXYtPm5hbWUsIHJlcXVlc3RfbGVuKTsKLSNlbmRpZgkvKiBXRV9SVE5FVExJTktfREVCVUcgKi8KLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JLyogUHJlcGFyZSB0aGUgY2FsbCAqLwotCWluZm8uY21kID0gY21kOwotCWluZm8uZmxhZ3MgPSAwOwotCi0JLyogQ2hlY2sgaWYgd2UgaGF2ZSBleHRyYSBkYXRhIGluIHRoZSByZXBseSBvciBub3QgKi8KLQlpZihkZXNjci0+aGVhZGVyX3R5cGUgIT0gSVdfSEVBREVSX1RZUEVfUE9JTlQpIHsKLQotCQkvKiBDcmVhdGUgdGhlIGtlcm5lbCBidWZmZXIgdGhhdCB3ZSB3aWxsIHJldHVybi4KLQkJICogSXQncyBhdCBhbiBvZmZzZXQgdG8gbWF0Y2ggdGhlIFRZUEVfUE9JTlQgY2FzZS4uLiAqLwotCQlidWZmZXJfc2l6ZSA9IHJlcXVlc3RfbGVuICsgSVdfRVZfUE9JTlRfT0ZGOwotCQlidWZmZXIgPSBrbWFsbG9jKGJ1ZmZlcl9zaXplLCBHRlBfS0VSTkVMKTsKLQkJaWYgKGJ1ZmZlciA9PSBOVUxMKSB7Ci0JCQlyZXR1cm4gLUVOT01FTTsKLQkJfQotCQkvKiBDb3B5IGV2ZW50IGRhdGEgKi8KLQkJbWVtY3B5KGJ1ZmZlciArIElXX0VWX1BPSU5UX09GRiwgcmVxdWVzdCwgcmVxdWVzdF9sZW4pOwotCQkvKiBVc2Ugb3VyIG93biBjb3B5IG9mIHdycXUgKi8KLQkJd3JxdSA9ICh1bmlvbiBpd3JlcV9kYXRhICopIChidWZmZXIgKyBJV19FVl9QT0lOVF9PRkYKLQkJCQkJICAgICArIElXX0VWX0xDUF9QS19MRU4pOwotCi0JCS8qIE5vIGV4dHJhIGFyZ3VtZW50cy4gVHJpdmlhbCB0byBoYW5kbGUgKi8KLQkJcmV0ID0gaGFuZGxlcihkZXYsICZpbmZvLCB3cnF1LCBOVUxMKTsKLQotCX0gZWxzZSB7Ci0JCXVuaW9uIGl3cmVxX2RhdGEJd3JxdV9wb2ludDsKLQkJY2hhciAqCQkJZXh0cmEgPSBOVUxMOwotCQlpbnQJCQlleHRyYV9zaXplID0gMDsKLQotCQkvKiBHZXQgYSB0ZW1wIGNvcHkgb2Ygd3JxdSAoc2tpcCBwb2ludGVyKSAqLwotCQltZW1jcHkoKChjaGFyICopICZ3cnF1X3BvaW50KSArIElXX0VWX1BPSU5UX09GRiwKLQkJICAgICAgICgoY2hhciAqKSByZXF1ZXN0KSArIElXX0VWX0xDUF9QS19MRU4sCi0JCSAgICAgICBJV19FVl9QT0lOVF9MRU4gLSBJV19FVl9MQ1BfUEtfTEVOKTsKLQotCQkvKiBDYWxjdWxhdGUgc3BhY2UgbmVlZGVkIGJ5IGFyZ3VtZW50cy4gQWx3YXlzIGFsbG9jYXRlCi0JCSAqIGZvciBtYXggc3BhY2UuIEVhc2llciwgYW5kIHdvbid0IGxhc3QgbG9uZy4uLiAqLwotCQlleHRyYV9zaXplID0gZGVzY3ItPm1heF90b2tlbnMgKiBkZXNjci0+dG9rZW5fc2l6ZTsKLQkJLyogU3VwcG9ydCBmb3IgdmVyeSBsYXJnZSByZXF1ZXN0cyAqLwotCQlpZigoZGVzY3ItPmZsYWdzICYgSVdfREVTQ1JfRkxBR19OT01BWCkgJiYKLQkJICAgKHdycXVfcG9pbnQuZGF0YS5sZW5ndGggPiBkZXNjci0+bWF4X3Rva2VucykpCi0JCQlleHRyYV9zaXplID0gKHdycXVfcG9pbnQuZGF0YS5sZW5ndGgKLQkJCQkgICAgICAqIGRlc2NyLT50b2tlbl9zaXplKTsKLQkJYnVmZmVyX3NpemUgPSBleHRyYV9zaXplICsgSVdfRVZfUE9JTlRfUEtfTEVOICsgSVdfRVZfUE9JTlRfT0ZGOwotI2lmZGVmIFdFX1JUTkVUTElOS19ERUJVRwotCQlwcmludGsoS0VSTl9ERUJVRyAiJXMgKFdFLnIpIDogTWFsbG9jICVkIGJ5dGVzICglZCBieXRlcylcbiIsCi0JCSAgICAgICBkZXYtPm5hbWUsIGV4dHJhX3NpemUsIGJ1ZmZlcl9zaXplKTsKLSNlbmRpZgkvKiBXRV9SVE5FVExJTktfREVCVUcgKi8KLQotCQkvKiBDcmVhdGUgdGhlIGtlcm5lbCBidWZmZXIgdGhhdCB3ZSB3aWxsIHJldHVybiAqLwotCQlidWZmZXIgPSBrbWFsbG9jKGJ1ZmZlcl9zaXplLCBHRlBfS0VSTkVMKTsKLQkJaWYgKGJ1ZmZlciA9PSBOVUxMKSB7Ci0JCQlyZXR1cm4gLUVOT01FTTsKLQkJfQotCi0JCS8qIFB1dCB3cnF1IGluIHRoZSByaWdodCBwbGFjZSAoanVzdCBiZWZvcmUgZXh0cmEpLgotCQkgKiBMZWF2ZSBzcGFjZSBmb3IgSVdFIGhlYWRlciBhbmQgZHVtbXkgcG9pbnRlci4uLgotCQkgKiBOb3RlIHRoYXQgSVdfRVZfTENQX1BLX0xFTj09NCBieXRlcywgc28gaXQncyBzdGlsbCBhbGlnbmVkLgotCQkgKi8KLQkJbWVtY3B5KGJ1ZmZlciArIElXX0VWX0xDUF9QS19MRU4gKyBJV19FVl9QT0lOVF9PRkYsCi0JCSAgICAgICAoKGNoYXIgKikgJndycXVfcG9pbnQpICsgSVdfRVZfUE9JTlRfT0ZGLAotCQkgICAgICAgSVdfRVZfUE9JTlRfUEtfTEVOIC0gSVdfRVZfTENQX1BLX0xFTik7Ci0JCXdycXUgPSAodW5pb24gaXdyZXFfZGF0YSAqKSAoYnVmZmVyICsgSVdfRVZfTENQX1BLX0xFTik7Ci0KLQkJLyogRXh0cmEgY29tZXMgbG9naWNhbGx5IGFmdGVyIHRoYXQuIE9mZnNldCArMTIgYnl0ZXMuICovCi0JCWV4dHJhID0gYnVmZmVyICsgSVdfRVZfUE9JTlRfT0ZGICsgSVdfRVZfUE9JTlRfUEtfTEVOOwotCi0JCS8qIENhbGwgdGhlIGhhbmRsZXIgKi8KLQkJcmV0ID0gaGFuZGxlcihkZXYsICZpbmZvLCB3cnF1LCBleHRyYSk7Ci0KLQkJLyogQ2FsY3VsYXRlIHJlYWwgcmV0dXJuZWQgbGVuZ3RoICovCi0JCWV4dHJhX3NpemUgPSAod3JxdS0+ZGF0YS5sZW5ndGggKiBkZXNjci0+dG9rZW5fc2l6ZSk7Ci0JCS8qIFJlLWFkanVzdCByZXBseSBzaXplICovCi0JCXJlcXVlc3QtPmxlbiA9IGV4dHJhX3NpemUgKyBJV19FVl9QT0lOVF9QS19MRU47Ci0KLQkJLyogUHV0IHRoZSBpd2UgaGVhZGVyIHdoZXJlIGl0IHNob3VsZCwgaS5lLiBzY3JhcCB0aGUKLQkJICogZHVtbXkgcG9pbnRlci4gKi8KLQkJbWVtY3B5KGJ1ZmZlciArIElXX0VWX1BPSU5UX09GRiwgcmVxdWVzdCwgSVdfRVZfTENQX1BLX0xFTik7Ci0KLSNpZmRlZiBXRV9SVE5FVExJTktfREVCVUcKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzIChXRS5yKSA6IFJlcGx5IDB4JTA0WCwgaGRyX2xlbiAlZCwgdG9rZW5zICVkLCBleHRyYV9zaXplICVkLCBidWZmZXJfc2l6ZSAlZFxuIiwgZGV2LT5uYW1lLCBjbWQsIGhkcl9sZW4sIHdycXUtPmRhdGEubGVuZ3RoLCBleHRyYV9zaXplLCBidWZmZXJfc2l6ZSk7Ci0jZW5kaWYJLyogV0VfUlRORVRMSU5LX0RFQlVHICovCi0KLQkJLyogQ2hlY2sgaWYgdGhlcmUgaXMgZW5vdWdoIGJ1ZmZlciB1cCB0aGVyZSAqLwotCQlpZih3cnF1X3BvaW50LmRhdGEubGVuZ3RoIDwgd3JxdS0+ZGF0YS5sZW5ndGgpCi0JCQlyZXQgPSAtRTJCSUc7Ci0JfQotCi0JLyogUmV0dXJuIHRoZSBidWZmZXIgdG8gdGhlIGNhbGxlciAqLwotCWlmICghcmV0KSB7Ci0JCSpwX2J1ZiA9IGJ1ZmZlcjsKLQkJKnBfbGVuID0gcmVxdWVzdC0+bGVuOwotCX0gZWxzZSB7Ci0JCS8qIENsZWFudXAgKi8KLQkJaWYoYnVmZmVyKQotCQkJa2ZyZWUoYnVmZmVyKTsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKgotICogV3JhcHBlciB0byBjYWxsIGEgc3RhbmRhcmQgV2lyZWxlc3MgRXh0ZW5zaW9uIFNFVCBoYW5kbGVyLgotICogV2UgZG8gdmFyaW91cyBjaGVja3MgYW5kIGNhbGwgdGhlIGhhbmRsZXIgd2l0aCB0aGUgcHJvcGVyIGFyZ3MuCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IHJ0bmV0bGlua19zdGFuZGFyZF9zZXQoc3RydWN0IG5ldF9kZXZpY2UgKglkZXYsCi0JCQkJCSBzdHJ1Y3QgaXdfZXZlbnQgKglyZXF1ZXN0LAotCQkJCQkgaW50CQkJcmVxdWVzdF9sZW4sCi0JCQkJCSBpd19oYW5kbGVyCQloYW5kbGVyKQotewotCWNvbnN0IHN0cnVjdCBpd19pb2N0bF9kZXNjcmlwdGlvbiAqCWRlc2NyID0gTlVMTDsKLQl1bnNpZ25lZCBpbnQJCQkJY21kOwotCXVuaW9uIGl3cmVxX2RhdGEgKgkJCXdycXU7Ci0JdW5pb24gaXdyZXFfZGF0YQkJCXdycXVfcG9pbnQ7Ci0JaW50CQkJCQloZHJfbGVuOwotCWNoYXIgKgkJCQkJZXh0cmEgPSBOVUxMOwotCWludAkJCQkJZXh0cmFfc2l6ZSA9IDA7Ci0Jc3RydWN0IGl3X3JlcXVlc3RfaW5mbwkJCWluZm87Ci0JaW50CQkJCQlyZXQgPSAtRUlOVkFMOwotCi0JLyogR2V0IHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgUmVxdWVzdCAqLwotCWNtZCA9IHJlcXVlc3QtPmNtZDsKLQlpZigoY21kIC0gU0lPQ0lXRklSU1QpID49IHN0YW5kYXJkX2lvY3RsX251bSkKLQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCWRlc2NyID0gJihzdGFuZGFyZF9pb2N0bFtjbWQgLSBTSU9DSVdGSVJTVF0pOwotCi0jaWZkZWYgV0VfUlRORVRMSU5LX0RFQlVHCi0JcHJpbnRrKEtFUk5fREVCVUcgIiVzIChXRS5yKSA6IEZvdW5kIHN0YW5kYXJkIFNFVCBoYW5kbGVyIGZvciAweCUwNFhcbiIsCi0JICAgICAgIGRldi0+bmFtZSwgY21kKTsKLQlwcmludGsoS0VSTl9ERUJVRyAiJXMgKFdFLnIpIDogSGVhZGVyIHR5cGUgOiAlZCwgVG9rZW4gdHlwZSA6ICVkLCBzaXplIDogJWQsIHRva2VuIDogJWRcbiIsIGRldi0+bmFtZSwgZGVzY3ItPmhlYWRlcl90eXBlLCBkZXNjci0+dG9rZW5fdHlwZSwgZGVzY3ItPnRva2VuX3NpemUsIGRlc2NyLT5tYXhfdG9rZW5zKTsKLSNlbmRpZgkvKiBXRV9SVE5FVExJTktfREVCVUcgKi8KLQotCS8qIEV4dHJhY3QgZml4ZWQgaGVhZGVyIGZyb20gcmVxdWVzdC4gVGhpcyBpcyBwcm9wZXJseSBhbGlnbmVkLiAqLwotCXdycXUgPSAodW5pb24gaXdyZXFfZGF0YSAqKSAoKChjaGFyICopIHJlcXVlc3QpICsgSVdfRVZfTENQX1BLX0xFTik7Ci0KLQkvKiBDaGVjayBpZiB3cnF1IGlzIGNvbXBsZXRlICovCi0JaGRyX2xlbiA9IGV2ZW50X3R5cGVfcGtfc2l6ZVtkZXNjci0+aGVhZGVyX3R5cGVdOwotCWlmKHJlcXVlc3RfbGVuIDwgaGRyX2xlbikgewotI2lmZGVmIFdFX1JUTkVUTElOS19ERUJVRwotCQlwcmludGsoS0VSTl9ERUJVRwotCQkgICAgICAgIiVzIChXRS5yKSA6IFdpcmVsZXNzIHJlcXVlc3QgdG9vIHNob3J0ICglZClcbiIsCi0JCSAgICAgICBkZXYtPm5hbWUsIHJlcXVlc3RfbGVuKTsKLSNlbmRpZgkvKiBXRV9SVE5FVExJTktfREVCVUcgKi8KLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JLyogUHJlcGFyZSB0aGUgY2FsbCAqLwotCWluZm8uY21kID0gY21kOwotCWluZm8uZmxhZ3MgPSAwOwotCi0JLyogQ2hlY2sgaWYgd2UgaGF2ZSBleHRyYSBkYXRhIGluIHRoZSByZXF1ZXN0IG9yIG5vdCAqLwotCWlmKGRlc2NyLT5oZWFkZXJfdHlwZSAhPSBJV19IRUFERVJfVFlQRV9QT0lOVCkgewotCi0JCS8qIE5vIGV4dHJhIGFyZ3VtZW50cy4gVHJpdmlhbCB0byBoYW5kbGUgKi8KLQkJcmV0ID0gaGFuZGxlcihkZXYsICZpbmZvLCB3cnF1LCBOVUxMKTsKLQotCX0gZWxzZSB7Ci0JCWludAlleHRyYV9sZW47Ci0KLQkJLyogUHV0IHdycXUgaW4gdGhlIHJpZ2h0IHBsYWNlIChza2lwIHBvaW50ZXIpICovCi0JCW1lbWNweSgoKGNoYXIgKikgJndycXVfcG9pbnQpICsgSVdfRVZfUE9JTlRfT0ZGLAotCQkgICAgICAgd3JxdSwgSVdfRVZfUE9JTlRfUEtfTEVOIC0gSVdfRVZfTENQX1BLX0xFTik7Ci0JCS8qIERvbid0IGZvcmdldCBhYm91dCB0aGUgZXZlbnQgY29kZS4uLiAqLwotCQl3cnF1ID0gJndycXVfcG9pbnQ7Ci0KLQkJLyogQ2hlY2sgaWYgbnVtYmVyIG9mIHRva2VuIGZpdHMgd2l0aGluIGJvdW5kcyAqLwotCQlpZih3cnF1X3BvaW50LmRhdGEubGVuZ3RoID4gZGVzY3ItPm1heF90b2tlbnMpCi0JCQlyZXR1cm4gLUUyQklHOwotCQlpZih3cnF1X3BvaW50LmRhdGEubGVuZ3RoIDwgZGVzY3ItPm1pbl90b2tlbnMpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQotCQkvKiBSZWFsIGxlbmd0aCBvZiBwYXlsb2FkICovCi0JCWV4dHJhX2xlbiA9IHdycXVfcG9pbnQuZGF0YS5sZW5ndGggKiBkZXNjci0+dG9rZW5fc2l6ZTsKLQotCQkvKiBDaGVjayBpZiByZXF1ZXN0IGlzIHNlbGYgY29uc2lzdGVudCAqLwotCQlpZigocmVxdWVzdF9sZW4gLSBoZHJfbGVuKSA8IGV4dHJhX2xlbikgewotI2lmZGVmIFdFX1JUTkVUTElOS19ERUJVRwotCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzIChXRS5yKSA6IFdpcmVsZXNzIHJlcXVlc3QgZGF0YSB0b28gc2hvcnQgKCVkKVxuIiwKLQkJCSAgICAgICBkZXYtPm5hbWUsIGV4dHJhX3NpemUpOwotI2VuZGlmCS8qIFdFX1JUTkVUTElOS19ERUJVRyAqLwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotI2lmZGVmIFdFX1JUTkVUTElOS19ERUJVRwotCQlwcmludGsoS0VSTl9ERUJVRyAiJXMgKFdFLnIpIDogTWFsbG9jICVkIGJ5dGVzXG4iLAotCQkgICAgICAgZGV2LT5uYW1lLCBleHRyYV9zaXplKTsKLSNlbmRpZgkvKiBXRV9SVE5FVExJTktfREVCVUcgKi8KLQotCQkvKiBBbHdheXMgYWxsb2NhdGUgZm9yIG1heCBzcGFjZS4gRWFzaWVyLCBhbmQgd29uJ3QgbGFzdAotCQkgKiBsb25nLi4uICovCi0JCWV4dHJhX3NpemUgPSBkZXNjci0+bWF4X3Rva2VucyAqIGRlc2NyLT50b2tlbl9zaXplOwotCQlleHRyYSA9IGttYWxsb2MoZXh0cmFfc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JCWlmIChleHRyYSA9PSBOVUxMKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0KLQkJLyogQ29weSBleHRyYSBpbiBhbGlnbmVkIGJ1ZmZlciAqLwotCQltZW1jcHkoZXh0cmEsICgoY2hhciAqKSByZXF1ZXN0KSArIGhkcl9sZW4sIGV4dHJhX2xlbik7Ci0KLQkJLyogQ2FsbCB0aGUgaGFuZGxlciAqLwotCQlyZXQgPSBoYW5kbGVyKGRldiwgJmluZm8sICZ3cnF1X3BvaW50LCBleHRyYSk7Ci0JfQotCi0jaWZkZWYgV0VfU0VUX0VWRU5UCi0JLyogR2VuZXJhdGUgYW4gZXZlbnQgdG8gbm90aWZ5IGxpc3RlbmVycyBvZiB0aGUgY2hhbmdlICovCi0JaWYoKGRlc2NyLT5mbGFncyAmIElXX0RFU0NSX0ZMQUdfRVZFTlQpICYmCi0JICAgKChyZXQgPT0gMCkgfHwgKHJldCA9PSAtRUlXQ09NTUlUKSkpIHsKLQkJaWYoZGVzY3ItPmZsYWdzICYgSVdfREVTQ1JfRkxBR19SRVNUUklDVCkKLQkJCS8qIElmIHRoZSBldmVudCBpcyByZXN0cmljdGVkLCBkb24ndAotCQkJICogZXhwb3J0IHRoZSBwYXlsb2FkICovCi0JCQl3aXJlbGVzc19zZW5kX2V2ZW50KGRldiwgY21kLCB3cnF1LCBOVUxMKTsKLQkJZWxzZQotCQkJd2lyZWxlc3Nfc2VuZF9ldmVudChkZXYsIGNtZCwgd3JxdSwgZXh0cmEpOwotCX0KLSNlbmRpZgkvKiBXRV9TRVRfRVZFTlQgKi8KLQotCS8qIENsZWFudXAgLSBJIHRvbGQgeW91IGl0IHdhc24ndCB0aGF0IGxvbmcgOy0pICovCi0JaWYoZXh0cmEpCi0JCWtmcmVlKGV4dHJhKTsKLQotCS8qIENhbGwgY29tbWl0IGhhbmRsZXIgaWYgbmVlZGVkIGFuZCBkZWZpbmVkICovCi0JaWYocmV0ID09IC1FSVdDT01NSVQpCi0JCXJldCA9IGNhbGxfY29tbWl0X2hhbmRsZXIoZGV2KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qCi0gKiBXcmFwcGVyIHRvIGNhbGwgYSBwcml2YXRlIFdpcmVsZXNzIEV4dGVuc2lvbiBHRVQgaGFuZGxlci4KLSAqIFNhbWUgYXMgYWJvdmUuLi4KLSAqIEl0J3Mgbm90IGFzIG5pY2UgYW5kIHNsaW1saW5lIGFzIHRoZSBzdGFuZGFyZCB3cmFwcGVyLiBUaGUgY2F1c2UKLSAqIGlzIHN0cnVjdCBpd19wcml2X2FyZ3MsIHdoaWNoIHdhcyBub3QgcmVhbGx5IGRlc2lnbmVkIGZvciB0aGUKLSAqIGpvYiB3ZSBhcmUgZ29pbmcgaGVyZS4KLSAqCi0gKiBJTVBPUlRBTlQgOiBUaGlzIGZ1bmN0aW9uIHByZXZlbnQgdG8gc2V0IGFuZCBnZXQgZGF0YSBvbiB0aGUgc2FtZQotICogSU9DVEwgYW5kIGVuZm9yY2UgdGhlIFNFVC9HRVQgY29udmVudGlvbi4gTm90IGRvaW5nIGl0IHdvdWxkIGJlCi0gKiBmYXIgdG9vIGhhaXJ5Li4uCi0gKiBJZiB5b3UgbmVlZCB0byBzZXQgYW5kIGdldCBkYXRhIGF0IHRoZSBzYW1lIHRpbWUsIHBsZWFzZSBkb24ndCB1c2UKLSAqIGEgaXdfaGFuZGxlciBidXQgcHJvY2VzcyBpdCBpbiB5b3VyIGlvY3RsIGhhbmRsZXIgKGkuZS4gdXNlIHRoZQotICogb2xkIGRyaXZlciBBUEkpLgotICovCi1zdGF0aWMgaW5saW5lIGludCBydG5ldGxpbmtfcHJpdmF0ZV9nZXQoc3RydWN0IG5ldF9kZXZpY2UgKglkZXYsCi0JCQkJCXN0cnVjdCBpd19ldmVudCAqCXJlcXVlc3QsCi0JCQkJCWludAkJCXJlcXVlc3RfbGVuLAotCQkJCQlpd19oYW5kbGVyCQloYW5kbGVyLAotCQkJCQljaGFyICoqCQkJcF9idWYsCi0JCQkJCWludCAqCQkJcF9sZW4pCi17Ci0JY29uc3Qgc3RydWN0IGl3X3ByaXZfYXJncyAqCWRlc2NyID0gTlVMTDsKLQl1bnNpZ25lZCBpbnQJCQljbWQ7Ci0JdW5pb24gaXdyZXFfZGF0YSAqCQl3cnF1OwotCWludAkJCQloZHJfbGVuOwotCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8JCWluZm87Ci0JaW50CQkJCWV4dHJhX3NpemUgPSAwOwotCWludAkJCQlpOwotCWNoYXIgKgkJCQlidWZmZXIgPSBOVUxMOwotCWludAkJCQlidWZmZXJfc2l6ZSA9IDA7Ci0JaW50CQkJCXJldCA9IC1FSU5WQUw7Ci0KLQkvKiBHZXQgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBSZXF1ZXN0ICovCi0JY21kID0gcmVxdWVzdC0+Y21kOwotCWZvcihpID0gMDsgaSA8IGRldi0+d2lyZWxlc3NfaGFuZGxlcnMtPm51bV9wcml2YXRlX2FyZ3M7IGkrKykKLQkJaWYoY21kID09IGRldi0+d2lyZWxlc3NfaGFuZGxlcnMtPnByaXZhdGVfYXJnc1tpXS5jbWQpIHsKLQkJCWRlc2NyID0gJihkZXYtPndpcmVsZXNzX2hhbmRsZXJzLT5wcml2YXRlX2FyZ3NbaV0pOwotCQkJYnJlYWs7Ci0JCX0KLQlpZihkZXNjciA9PSBOVUxMKQotCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0KLSNpZmRlZiBXRV9SVE5FVExJTktfREVCVUcKLQlwcmludGsoS0VSTl9ERUJVRyAiJXMgKFdFLnIpIDogRm91bmQgcHJpdmF0ZSBoYW5kbGVyIGZvciAweCUwNFhcbiIsCi0JICAgICAgIGRldi0+bmFtZSwgY21kKTsKLQlwcmludGsoS0VSTl9ERUJVRyAiJXMgKFdFLnIpIDogTmFtZSAlcywgc2V0ICVYLCBnZXQgJVhcbiIsCi0JICAgICAgIGRldi0+bmFtZSwgZGVzY3ItPm5hbWUsIGRlc2NyLT5zZXRfYXJncywgZGVzY3ItPmdldF9hcmdzKTsKLSNlbmRpZgkvKiBXRV9SVE5FVExJTktfREVCVUcgKi8KLQotCS8qIENvbXB1dGUgdGhlIG1heCBzaXplIG9mIHRoZSBnZXQgYXJndW1lbnRzICovCi0JZXh0cmFfc2l6ZSA9IGdldF9wcml2X3NpemUoZGVzY3ItPmdldF9hcmdzKTsKLQotCS8qIERvZXMgaXQgZml0cyBpbiB3cnF1ID8gKi8KLQlpZigoZGVzY3ItPmdldF9hcmdzICYgSVdfUFJJVl9TSVpFX0ZJWEVEKSAmJgotCSAgIChleHRyYV9zaXplIDw9IElGTkFNU0laKSkgewotCQloZHJfbGVuID0gZXh0cmFfc2l6ZTsKLQkJZXh0cmFfc2l6ZSA9IDA7Ci0JfSBlbHNlIHsKLQkJaGRyX2xlbiA9IElXX0VWX1BPSU5UX1BLX0xFTjsKLQl9Ci0KLQkvKiBDaGVjayBpZiB3cnF1IGlzIGNvbXBsZXRlICovCi0JaWYocmVxdWVzdF9sZW4gPCBoZHJfbGVuKSB7Ci0jaWZkZWYgV0VfUlRORVRMSU5LX0RFQlVHCi0JCXByaW50ayhLRVJOX0RFQlVHCi0JCSAgICAgICAiJXMgKFdFLnIpIDogV2lyZWxlc3MgcmVxdWVzdCB0b28gc2hvcnQgKCVkKVxuIiwKLQkJICAgICAgIGRldi0+bmFtZSwgcmVxdWVzdF9sZW4pOwotI2VuZGlmCS8qIFdFX1JUTkVUTElOS19ERUJVRyAqLwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQkvKiBQcmVwYXJlIHRoZSBjYWxsICovCi0JaW5mby5jbWQgPSBjbWQ7Ci0JaW5mby5mbGFncyA9IDA7Ci0KLQkvKiBDaGVjayBpZiB3ZSBoYXZlIGEgcG9pbnRlciB0byB1c2VyIHNwYWNlIGRhdGEgb3Igbm90LiAqLwotCWlmKGV4dHJhX3NpemUgPT0gMCkgewotCi0JCS8qIENyZWF0ZSB0aGUga2VybmVsIGJ1ZmZlciB0aGF0IHdlIHdpbGwgcmV0dXJuLgotCQkgKiBJdCdzIGF0IGFuIG9mZnNldCB0byBtYXRjaCB0aGUgVFlQRV9QT0lOVCBjYXNlLi4uICovCi0JCWJ1ZmZlcl9zaXplID0gcmVxdWVzdF9sZW4gKyBJV19FVl9QT0lOVF9PRkY7Ci0JCWJ1ZmZlciA9IGttYWxsb2MoYnVmZmVyX3NpemUsIEdGUF9LRVJORUwpOwotCQlpZiAoYnVmZmVyID09IE5VTEwpIHsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0JCS8qIENvcHkgZXZlbnQgZGF0YSAqLwotCQltZW1jcHkoYnVmZmVyICsgSVdfRVZfUE9JTlRfT0ZGLCByZXF1ZXN0LCByZXF1ZXN0X2xlbik7Ci0JCS8qIFVzZSBvdXIgb3duIGNvcHkgb2Ygd3JxdSAqLwotCQl3cnF1ID0gKHVuaW9uIGl3cmVxX2RhdGEgKikgKGJ1ZmZlciArIElXX0VWX1BPSU5UX09GRgotCQkJCQkgICAgICsgSVdfRVZfTENQX1BLX0xFTik7Ci0KLQkJLyogTm8gZXh0cmEgYXJndW1lbnRzLiBUcml2aWFsIHRvIGhhbmRsZSAqLwotCQlyZXQgPSBoYW5kbGVyKGRldiwgJmluZm8sIHdycXUsIChjaGFyICopIHdycXUpOwotCi0JfSBlbHNlIHsKLQkJY2hhciAqCWV4dHJhOwotCi0JCS8qIEJ1ZmZlciBmb3IgZnVsbCByZXBseSAqLwotCQlidWZmZXJfc2l6ZSA9IGV4dHJhX3NpemUgKyBJV19FVl9QT0lOVF9QS19MRU4gKyBJV19FVl9QT0lOVF9PRkY7Ci0KLSNpZmRlZiBXRV9SVE5FVExJTktfREVCVUcKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzIChXRS5yKSA6IE1hbGxvYyAlZCBieXRlcyAoJWQgYnl0ZXMpXG4iLAotCQkgICAgICAgZGV2LT5uYW1lLCBleHRyYV9zaXplLCBidWZmZXJfc2l6ZSk7Ci0jZW5kaWYJLyogV0VfUlRORVRMSU5LX0RFQlVHICovCi0KLQkJLyogQ3JlYXRlIHRoZSBrZXJuZWwgYnVmZmVyIHRoYXQgd2Ugd2lsbCByZXR1cm4gKi8KLQkJYnVmZmVyID0ga21hbGxvYyhidWZmZXJfc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JCWlmIChidWZmZXIgPT0gTlVMTCkgewotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KLQotCQkvKiBQdXQgd3JxdSBpbiB0aGUgcmlnaHQgcGxhY2UgKGp1c3QgYmVmb3JlIGV4dHJhKS4KLQkJICogTGVhdmUgc3BhY2UgZm9yIElXRSBoZWFkZXIgYW5kIGR1bW15IHBvaW50ZXIuLi4KLQkJICogTm90ZSB0aGF0IElXX0VWX0xDUF9QS19MRU49PTQgYnl0ZXMsIHNvIGl0J3Mgc3RpbGwgYWxpZ25lZC4KLQkJICovCi0JCW1lbWNweShidWZmZXIgKyBJV19FVl9MQ1BfUEtfTEVOICsgSVdfRVZfUE9JTlRfT0ZGLAotCQkgICAgICAgKChjaGFyICopIHJlcXVlc3QpICsgSVdfRVZfTENQX1BLX0xFTiwKLQkJICAgICAgIElXX0VWX1BPSU5UX1BLX0xFTiAtIElXX0VWX0xDUF9QS19MRU4pOwotCQl3cnF1ID0gKHVuaW9uIGl3cmVxX2RhdGEgKikgKGJ1ZmZlciArIElXX0VWX0xDUF9QS19MRU4pOwotCi0JCS8qIEV4dHJhIGNvbWVzIGxvZ2ljYWxseSBhZnRlciB0aGF0LiBPZmZzZXQgKzEyIGJ5dGVzLiAqLwotCQlleHRyYSA9IGJ1ZmZlciArIElXX0VWX1BPSU5UX09GRiArIElXX0VWX1BPSU5UX1BLX0xFTjsKLQotCQkvKiBDYWxsIHRoZSBoYW5kbGVyICovCi0JCXJldCA9IGhhbmRsZXIoZGV2LCAmaW5mbywgd3JxdSwgZXh0cmEpOwotCi0JCS8qIEFkanVzdCBmb3IgdGhlIGFjdHVhbCBsZW5ndGggaWYgaXQncyB2YXJpYWJsZSwKLQkJICogYXZvaWQgbGVha2luZyBrZXJuZWwgYml0cyBvdXRzaWRlLiAqLwotCQlpZiAoIShkZXNjci0+Z2V0X2FyZ3MgJiBJV19QUklWX1NJWkVfRklYRUQpKQotCQkJZXh0cmFfc2l6ZSA9IGFkanVzdF9wcml2X3NpemUoZGVzY3ItPmdldF9hcmdzLCB3cnF1KTsKLQkJLyogUmUtYWRqdXN0IHJlcGx5IHNpemUgKi8KLQkJcmVxdWVzdC0+bGVuID0gZXh0cmFfc2l6ZSArIElXX0VWX1BPSU5UX1BLX0xFTjsKLQotCQkvKiBQdXQgdGhlIGl3ZSBoZWFkZXIgd2hlcmUgaXQgc2hvdWxkLCBpLmUuIHNjcmFwIHRoZQotCQkgKiBkdW1teSBwb2ludGVyLiAqLwotCQltZW1jcHkoYnVmZmVyICsgSVdfRVZfUE9JTlRfT0ZGLCByZXF1ZXN0LCBJV19FVl9MQ1BfUEtfTEVOKTsKLQotI2lmZGVmIFdFX1JUTkVUTElOS19ERUJVRwotCQlwcmludGsoS0VSTl9ERUJVRyAiJXMgKFdFLnIpIDogUmVwbHkgMHglMDRYLCBoZHJfbGVuICVkLCB0b2tlbnMgJWQsIGV4dHJhX3NpemUgJWQsIGJ1ZmZlcl9zaXplICVkXG4iLCBkZXYtPm5hbWUsIGNtZCwgaGRyX2xlbiwgd3JxdS0+ZGF0YS5sZW5ndGgsIGV4dHJhX3NpemUsIGJ1ZmZlcl9zaXplKTsKLSNlbmRpZgkvKiBXRV9SVE5FVExJTktfREVCVUcgKi8KLQl9Ci0KLQkvKiBSZXR1cm4gdGhlIGJ1ZmZlciB0byB0aGUgY2FsbGVyICovCi0JaWYgKCFyZXQpIHsKLQkJKnBfYnVmID0gYnVmZmVyOwotCQkqcF9sZW4gPSByZXF1ZXN0LT5sZW47Ci0JfSBlbHNlIHsKLQkJLyogQ2xlYW51cCAqLwotCQlpZihidWZmZXIpCi0JCQlrZnJlZShidWZmZXIpOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qCi0gKiBXcmFwcGVyIHRvIGNhbGwgYSBwcml2YXRlIFdpcmVsZXNzIEV4dGVuc2lvbiBTRVQgaGFuZGxlci4KLSAqIFNhbWUgYXMgYWJvdmUuLi4KLSAqIEl0J3Mgbm90IGFzIG5pY2UgYW5kIHNsaW1saW5lIGFzIHRoZSBzdGFuZGFyZCB3cmFwcGVyLiBUaGUgY2F1c2UKLSAqIGlzIHN0cnVjdCBpd19wcml2X2FyZ3MsIHdoaWNoIHdhcyBub3QgcmVhbGx5IGRlc2lnbmVkIGZvciB0aGUKLSAqIGpvYiB3ZSBhcmUgZ29pbmcgaGVyZS4KLSAqCi0gKiBJTVBPUlRBTlQgOiBUaGlzIGZ1bmN0aW9uIHByZXZlbnQgdG8gc2V0IGFuZCBnZXQgZGF0YSBvbiB0aGUgc2FtZQotICogSU9DVEwgYW5kIGVuZm9yY2UgdGhlIFNFVC9HRVQgY29udmVudGlvbi4gTm90IGRvaW5nIGl0IHdvdWxkIGJlCi0gKiBmYXIgdG9vIGhhaXJ5Li4uCi0gKiBJZiB5b3UgbmVlZCB0byBzZXQgYW5kIGdldCBkYXRhIGF0IHRoZSBzYW1lIHRpbWUsIHBsZWFzZSBkb24ndCB1c2UKLSAqIGEgaXdfaGFuZGxlciBidXQgcHJvY2VzcyBpdCBpbiB5b3VyIGlvY3RsIGhhbmRsZXIgKGkuZS4gdXNlIHRoZQotICogb2xkIGRyaXZlciBBUEkpLgotICovCi1zdGF0aWMgaW5saW5lIGludCBydG5ldGxpbmtfcHJpdmF0ZV9zZXQoc3RydWN0IG5ldF9kZXZpY2UgKglkZXYsCi0JCQkJCXN0cnVjdCBpd19ldmVudCAqCXJlcXVlc3QsCi0JCQkJCWludAkJCXJlcXVlc3RfbGVuLAotCQkJCQlpd19oYW5kbGVyCQloYW5kbGVyKQotewotCWNvbnN0IHN0cnVjdCBpd19wcml2X2FyZ3MgKglkZXNjciA9IE5VTEw7Ci0JdW5zaWduZWQgaW50CQkJY21kOwotCXVuaW9uIGl3cmVxX2RhdGEgKgkJd3JxdTsKLQl1bmlvbiBpd3JlcV9kYXRhCQl3cnF1X3BvaW50OwotCWludAkJCQloZHJfbGVuOwotCWNoYXIgKgkJCQlleHRyYSA9IE5VTEw7Ci0JaW50CQkJCWV4dHJhX3NpemUgPSAwOwotCWludAkJCQlvZmZzZXQgPSAwOwkvKiBGb3Igc3ViLWlvY3RscyAqLwotCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8JCWluZm87Ci0JaW50CQkJCWk7Ci0JaW50CQkJCXJldCA9IC1FSU5WQUw7Ci0KLQkvKiBHZXQgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBSZXF1ZXN0ICovCi0JY21kID0gcmVxdWVzdC0+Y21kOwotCWZvcihpID0gMDsgaSA8IGRldi0+d2lyZWxlc3NfaGFuZGxlcnMtPm51bV9wcml2YXRlX2FyZ3M7IGkrKykKLQkJaWYoY21kID09IGRldi0+d2lyZWxlc3NfaGFuZGxlcnMtPnByaXZhdGVfYXJnc1tpXS5jbWQpIHsKLQkJCWRlc2NyID0gJihkZXYtPndpcmVsZXNzX2hhbmRsZXJzLT5wcml2YXRlX2FyZ3NbaV0pOwotCQkJYnJlYWs7Ci0JCX0KLQlpZihkZXNjciA9PSBOVUxMKQotCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0KLSNpZmRlZiBXRV9SVE5FVExJTktfREVCVUcKLQlwcmludGsoS0VSTl9ERUJVRyAiJXMgKFdFLnIpIDogRm91bmQgcHJpdmF0ZSBoYW5kbGVyIGZvciAweCUwNFhcbiIsCi0JICAgICAgIGlmci0+aWZyX25hbWUsIGNtZCk7Ci0JcHJpbnRrKEtFUk5fREVCVUcgIiVzIChXRS5yKSA6IE5hbWUgJXMsIHNldCAlWCwgZ2V0ICVYXG4iLAotCSAgICAgICBkZXYtPm5hbWUsIGRlc2NyLT5uYW1lLCBkZXNjci0+c2V0X2FyZ3MsIGRlc2NyLT5nZXRfYXJncyk7Ci0jZW5kaWYJLyogV0VfUlRORVRMSU5LX0RFQlVHICovCi0KLQkvKiBDb21wdXRlIHRoZSBzaXplIG9mIHRoZSBzZXQgYXJndW1lbnRzICovCi0JLyogQ2hlY2sgZm9yIHN1Yi1pb2N0bCBoYW5kbGVyICovCi0JaWYoZGVzY3ItPm5hbWVbMF0gPT0gJ1wwJykKLQkJLyogUmVzZXJ2ZSBvbmUgaW50IGZvciBzdWItaW9jdGwgaW5kZXggKi8KLQkJb2Zmc2V0ID0gc2l6ZW9mKF9fdTMyKTsKLQotCS8qIFNpemUgb2Ygc2V0IGFyZ3VtZW50cyAqLwotCWV4dHJhX3NpemUgPSBnZXRfcHJpdl9zaXplKGRlc2NyLT5zZXRfYXJncyk7Ci0KLQkvKiBEb2VzIGl0IGZpdHMgaW4gd3JxdSA/ICovCi0JaWYoKGRlc2NyLT5zZXRfYXJncyAmIElXX1BSSVZfU0laRV9GSVhFRCkgJiYKLQkgICAoZXh0cmFfc2l6ZSA8PSBJRk5BTVNJWikpIHsKLQkJaGRyX2xlbiA9IElXX0VWX0xDUF9QS19MRU4gKyBleHRyYV9zaXplOwotCQlleHRyYV9zaXplID0gMDsKLQl9IGVsc2UgewotCQloZHJfbGVuID0gSVdfRVZfUE9JTlRfUEtfTEVOOwotCX0KLQotCS8qIEV4dHJhY3QgZml4ZWQgaGVhZGVyIGZyb20gcmVxdWVzdC4gVGhpcyBpcyBwcm9wZXJseSBhbGlnbmVkLiAqLwotCXdycXUgPSAodW5pb24gaXdyZXFfZGF0YSAqKSAoKChjaGFyICopIHJlcXVlc3QpICsgSVdfRVZfTENQX1BLX0xFTik7Ci0KLQkvKiBDaGVjayBpZiB3cnF1IGlzIGNvbXBsZXRlICovCi0JaWYocmVxdWVzdF9sZW4gPCBoZHJfbGVuKSB7Ci0jaWZkZWYgV0VfUlRORVRMSU5LX0RFQlVHCi0JCXByaW50ayhLRVJOX0RFQlVHCi0JCSAgICAgICAiJXMgKFdFLnIpIDogV2lyZWxlc3MgcmVxdWVzdCB0b28gc2hvcnQgKCVkKVxuIiwKLQkJICAgICAgIGRldi0+bmFtZSwgcmVxdWVzdF9sZW4pOwotI2VuZGlmCS8qIFdFX1JUTkVUTElOS19ERUJVRyAqLwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQkvKiBQcmVwYXJlIHRoZSBjYWxsICovCi0JaW5mby5jbWQgPSBjbWQ7Ci0JaW5mby5mbGFncyA9IDA7Ci0KLQkvKiBDaGVjayBpZiB3ZSBoYXZlIGEgcG9pbnRlciB0byB1c2VyIHNwYWNlIGRhdGEgb3Igbm90LiAqLwotCWlmKGV4dHJhX3NpemUgPT0gMCkgewotCi0JCS8qIE5vIGV4dHJhIGFyZ3VtZW50cy4gVHJpdmlhbCB0byBoYW5kbGUgKi8KLQkJcmV0ID0gaGFuZGxlcihkZXYsICZpbmZvLCB3cnF1LCAoY2hhciAqKSB3cnF1KTsKLQotCX0gZWxzZSB7Ci0JCWludAlleHRyYV9sZW47Ci0KLQkJLyogUHV0IHdycXUgaW4gdGhlIHJpZ2h0IHBsYWNlIChza2lwIHBvaW50ZXIpICovCi0JCW1lbWNweSgoKGNoYXIgKikgJndycXVfcG9pbnQpICsgSVdfRVZfUE9JTlRfT0ZGLAotCQkgICAgICAgd3JxdSwgSVdfRVZfUE9JTlRfUEtfTEVOIC0gSVdfRVZfTENQX1BLX0xFTik7Ci0KLQkJLyogRG9lcyBpdCBmaXRzIHdpdGhpbiBib3VuZHMgPyAqLwotCQlpZih3cnF1X3BvaW50LmRhdGEubGVuZ3RoID4gKGRlc2NyLT5zZXRfYXJncyAmCi0JCQkJCSAgICAgSVdfUFJJVl9TSVpFX01BU0spKQotCQkJcmV0dXJuIC1FMkJJRzsKLQotCQkvKiBSZWFsIGxlbmd0aCBvZiBwYXlsb2FkICovCi0JCWV4dHJhX2xlbiA9IGFkanVzdF9wcml2X3NpemUoZGVzY3ItPnNldF9hcmdzLCAmd3JxdV9wb2ludCk7Ci0KLQkJLyogQ2hlY2sgaWYgcmVxdWVzdCBpcyBzZWxmIGNvbnNpc3RlbnQgKi8KLQkJaWYoKHJlcXVlc3RfbGVuIC0gaGRyX2xlbikgPCBleHRyYV9sZW4pIHsKLSNpZmRlZiBXRV9SVE5FVExJTktfREVCVUcKLQkJCXByaW50ayhLRVJOX0RFQlVHICIlcyAoV0UucikgOiBXaXJlbGVzcyByZXF1ZXN0IGRhdGEgdG9vIHNob3J0ICglZClcbiIsCi0JCQkgICAgICAgZGV2LT5uYW1lLCBleHRyYV9zaXplKTsKLSNlbmRpZgkvKiBXRV9SVE5FVExJTktfREVCVUcgKi8KLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0KLSNpZmRlZiBXRV9SVE5FVExJTktfREVCVUcKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzIChXRS5yKSA6IE1hbGxvYyAlZCBieXRlc1xuIiwKLQkJICAgICAgIGRldi0+bmFtZSwgZXh0cmFfc2l6ZSk7Ci0jZW5kaWYJLyogV0VfUlRORVRMSU5LX0RFQlVHICovCi0KLQkJLyogQWx3YXlzIGFsbG9jYXRlIGZvciBtYXggc3BhY2UuIEVhc2llciwgYW5kIHdvbid0IGxhc3QKLQkJICogbG9uZy4uLiAqLwotCQlleHRyYSA9IGttYWxsb2MoZXh0cmFfc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JCWlmIChleHRyYSA9PSBOVUxMKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0KLQkJLyogQ29weSBleHRyYSBpbiBhbGlnbmVkIGJ1ZmZlciAqLwotCQltZW1jcHkoZXh0cmEsICgoY2hhciAqKSByZXF1ZXN0KSArIGhkcl9sZW4sIGV4dHJhX2xlbik7Ci0KLQkJLyogQ2FsbCB0aGUgaGFuZGxlciAqLwotCQlyZXQgPSBoYW5kbGVyKGRldiwgJmluZm8sICZ3cnF1X3BvaW50LCBleHRyYSk7Ci0KLQkJLyogQ2xlYW51cCAtIEkgdG9sZCB5b3UgaXQgd2Fzbid0IHRoYXQgbG9uZyA7LSkgKi8KLQkJa2ZyZWUoZXh0cmEpOwotCX0KLQotCS8qIENhbGwgY29tbWl0IGhhbmRsZXIgaWYgbmVlZGVkIGFuZCBkZWZpbmVkICovCi0JaWYocmV0ID09IC1FSVdDT01NSVQpCi0JCXJldCA9IGNhbGxfY29tbWl0X2hhbmRsZXIoZGV2KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qCi0gKiBNYWluIFJ0TmV0bGluayBkaXNwYXRjaGVyLiBDYWxsZWQgZnJvbSB0aGUgbWFpbiBuZXR3b3JraW5nIGNvZGUKLSAqIChkb19nZXRsaW5rKCkgaW4gbmV0L2NvcmUvcnRuZXRsaW5rLmMpLgotICogQ2hlY2sgdGhlIHR5cGUgb2YgUmVxdWVzdCBhbmQgY2FsbCB0aGUgYXBwcm9wcmlhdGUgd3JhcHBlci4uLgotICovCi1pbnQgd2lyZWxlc3NfcnRuZXRsaW5rX2dldChzdHJ1Y3QgbmV0X2RldmljZSAqCWRldiwKLQkJCSAgIGNoYXIgKgkJZGF0YSwKLQkJCSAgIGludAkJCWxlbiwKLQkJCSAgIGNoYXIgKioJCXBfYnVmLAotCQkJICAgaW50ICoJCXBfbGVuKQotewotCXN0cnVjdCBpd19ldmVudCAqCXJlcXVlc3QgPSAoc3RydWN0IGl3X2V2ZW50ICopIGRhdGE7Ci0JaXdfaGFuZGxlcgkJaGFuZGxlcjsKLQotCS8qIENoZWNrIGxlbmd0aCAqLwotCWlmKGxlbiA8IElXX0VWX0xDUF9QS19MRU4pIHsKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzIChXRS5yKSA6IFJ0TmV0bGluayByZXF1ZXN0IHRvbyBzaG9ydCAoJWQpXG4iLAotCQkgICAgICAgZGV2LT5uYW1lLCBsZW4pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQkvKiBSZUNoZWNrIGxlbmd0aCAobGVuIG1heSBoYXZlIHBhZGRpbmcpICovCi0JaWYocmVxdWVzdC0+bGVuID4gbGVuKSB7Ci0JCXByaW50ayhLRVJOX0RFQlVHICIlcyAoV0UucikgOiBSdE5ldGxpbmsgcmVxdWVzdCBsZW4gaW52YWxpZCAoJWQtJWQpXG4iLAotCQkgICAgICAgZGV2LT5uYW1lLCByZXF1ZXN0LT5sZW4sIGxlbik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCS8qIE9ubHkgYWNjZXB0IEdFVCByZXF1ZXN0cyBpbiBoZXJlICovCi0JaWYoIUlXX0lTX0dFVChyZXF1ZXN0LT5jbWQpKQotCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0KLQkvKiBJZiBjb21tYW5kIGlzIGBnZXQgdGhlIGVuY29kaW5nIHBhcmFtZXRlcnMnLCBjaGVjayBpZgotCSAqIHRoZSB1c2VyIGhhcyB0aGUgcmlnaHQgdG8gZG8gaXQgKi8KLQlpZiAocmVxdWVzdC0+Y21kID09IFNJT0NHSVdFTkNPREUgfHwKLQkgICAgcmVxdWVzdC0+Y21kID09IFNJT0NHSVdFTkNPREVFWFQpIHsKLQkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQotCQkJcmV0dXJuIC1FUEVSTTsKLQl9Ci0KLQkvKiBTcGVjaWFsIGNhc2VzICovCi0JaWYocmVxdWVzdC0+Y21kID09IFNJT0NHSVdTVEFUUykKLQkJLyogR2V0IFdpcmVsZXNzIFN0YXRzICovCi0JCXJldHVybiBydG5ldGxpbmtfc3RhbmRhcmRfZ2V0KGRldiwKLQkJCQkJICAgICAgcmVxdWVzdCwKLQkJCQkJICAgICAgcmVxdWVzdC0+bGVuLAotCQkJCQkgICAgICAmaXdfaGFuZGxlcl9nZXRfaXdzdGF0cywKLQkJCQkJICAgICAgcF9idWYsIHBfbGVuKTsKLQlpZihyZXF1ZXN0LT5jbWQgPT0gU0lPQ0dJV1BSSVYpIHsKLQkJLyogQ2hlY2sgaWYgd2UgaGF2ZSBzb21lIHdpcmVsZXNzIGhhbmRsZXJzIGRlZmluZWQgKi8KLQkJaWYoZGV2LT53aXJlbGVzc19oYW5kbGVycyA9PSBOVUxMKQotCQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCQkvKiBHZXQgV2lyZWxlc3MgU3RhdHMgKi8KLQkJcmV0dXJuIHJ0bmV0bGlua19zdGFuZGFyZF9nZXQoZGV2LAotCQkJCQkgICAgICByZXF1ZXN0LAotCQkJCQkgICAgICByZXF1ZXN0LT5sZW4sCi0JCQkJCSAgICAgICZpd19oYW5kbGVyX2dldF9wcml2YXRlLAotCQkJCQkgICAgICBwX2J1ZiwgcF9sZW4pOwotCX0KLQotCS8qIEJhc2ljIGNoZWNrICovCi0JaWYgKCFuZXRpZl9kZXZpY2VfcHJlc2VudChkZXYpKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCS8qIFRyeSB0byBmaW5kIHRoZSBoYW5kbGVyICovCi0JaGFuZGxlciA9IGdldF9oYW5kbGVyKGRldiwgcmVxdWVzdC0+Y21kKTsKLQlpZihoYW5kbGVyICE9IE5VTEwpIHsKLQkJLyogU3RhbmRhcmQgYW5kIHByaXZhdGUgYXJlIG5vdCB0aGUgc2FtZSAqLwotCQlpZihyZXF1ZXN0LT5jbWQgPCBTSU9DSVdGSVJTVFBSSVYpCi0JCQlyZXR1cm4gcnRuZXRsaW5rX3N0YW5kYXJkX2dldChkZXYsCi0JCQkJCQkgICAgICByZXF1ZXN0LAotCQkJCQkJICAgICAgcmVxdWVzdC0+bGVuLAotCQkJCQkJICAgICAgaGFuZGxlciwKLQkJCQkJCSAgICAgIHBfYnVmLCBwX2xlbik7Ci0JCWVsc2UKLQkJCXJldHVybiBydG5ldGxpbmtfcHJpdmF0ZV9nZXQoZGV2LAotCQkJCQkJICAgICByZXF1ZXN0LAotCQkJCQkJICAgICByZXF1ZXN0LT5sZW4sCi0JCQkJCQkgICAgIGhhbmRsZXIsCi0JCQkJCQkgICAgIHBfYnVmLCBwX2xlbik7Ci0JfQotCi0JcmV0dXJuIC1FT1BOT1RTVVBQOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKgotICogTWFpbiBSdE5ldGxpbmsgZGlzcGF0Y2hlci4gQ2FsbGVkIGZyb20gdGhlIG1haW4gbmV0d29ya2luZyBjb2RlCi0gKiAoZG9fc2V0bGluaygpIGluIG5ldC9jb3JlL3J0bmV0bGluay5jKS4KLSAqIENoZWNrIHRoZSB0eXBlIG9mIFJlcXVlc3QgYW5kIGNhbGwgdGhlIGFwcHJvcHJpYXRlIHdyYXBwZXIuLi4KLSAqLwotaW50IHdpcmVsZXNzX3J0bmV0bGlua19zZXQoc3RydWN0IG5ldF9kZXZpY2UgKglkZXYsCi0JCQkgICBjaGFyICoJCWRhdGEsCi0JCQkgICBpbnQJCQlsZW4pCi17Ci0Jc3RydWN0IGl3X2V2ZW50ICoJcmVxdWVzdCA9IChzdHJ1Y3QgaXdfZXZlbnQgKikgZGF0YTsKLQlpd19oYW5kbGVyCQloYW5kbGVyOwotCi0JLyogQ2hlY2sgbGVuZ3RoICovCi0JaWYobGVuIDwgSVdfRVZfTENQX1BLX0xFTikgewotCQlwcmludGsoS0VSTl9ERUJVRyAiJXMgKFdFLnIpIDogUnROZXRsaW5rIHJlcXVlc3QgdG9vIHNob3J0ICglZClcbiIsCi0JCSAgICAgICBkZXYtPm5hbWUsIGxlbik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCS8qIFJlQ2hlY2sgbGVuZ3RoIChsZW4gbWF5IGhhdmUgcGFkZGluZykgKi8KLQlpZihyZXF1ZXN0LT5sZW4gPiBsZW4pIHsKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzIChXRS5yKSA6IFJ0TmV0bGluayByZXF1ZXN0IGxlbiBpbnZhbGlkICglZC0lZClcbiIsCi0JCSAgICAgICBkZXYtPm5hbWUsIHJlcXVlc3QtPmxlbiwgbGVuKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JLyogT25seSBhY2NlcHQgU0VUIHJlcXVlc3RzIGluIGhlcmUgKi8KLQlpZighSVdfSVNfU0VUKHJlcXVlc3QtPmNtZCkpCi0JCXJldHVybiAtRU9QTk9UU1VQUDsKLQotCS8qIEJhc2ljIGNoZWNrICovCi0JaWYgKCFuZXRpZl9kZXZpY2VfcHJlc2VudChkZXYpKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCS8qIE5ldyBkcml2ZXIgQVBJIDogdHJ5IHRvIGZpbmQgdGhlIGhhbmRsZXIgKi8KLQloYW5kbGVyID0gZ2V0X2hhbmRsZXIoZGV2LCByZXF1ZXN0LT5jbWQpOwotCWlmKGhhbmRsZXIgIT0gTlVMTCkgewotCQkvKiBTdGFuZGFyZCBhbmQgcHJpdmF0ZSBhcmUgbm90IHRoZSBzYW1lICovCi0JCWlmKHJlcXVlc3QtPmNtZCA8IFNJT0NJV0ZJUlNUUFJJVikKLQkJCXJldHVybiBydG5ldGxpbmtfc3RhbmRhcmRfc2V0KGRldiwKLQkJCQkJCSAgICAgIHJlcXVlc3QsCi0JCQkJCQkgICAgICByZXF1ZXN0LT5sZW4sCi0JCQkJCQkgICAgICBoYW5kbGVyKTsKLQkJZWxzZQotCQkJcmV0dXJuIHJ0bmV0bGlua19wcml2YXRlX3NldChkZXYsCi0JCQkJCQkgICAgIHJlcXVlc3QsCi0JCQkJCQkgICAgIHJlcXVlc3QtPmxlbiwKLQkJCQkJCSAgICAgaGFuZGxlcik7Ci0JfQotCi0JcmV0dXJuIC1FT1BOT1RTVVBQOwotfQotI2VuZGlmCS8qIENPTkZJR19ORVRfV0lSRUxFU1NfUlRORVRMSU5LICovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKiogRVZFTlQgUFJPQ0VTU0lORyAqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIFByb2Nlc3MgZXZlbnRzIGdlbmVyYXRlZCBieSB0aGUgd2lyZWxlc3MgbGF5ZXIgb3IgdGhlIGRyaXZlci4KLSAqIE1vc3Qgb2Z0ZW4sIHRoZSBldmVudCB3aWxsIGJlIHByb3BhZ2F0ZWQgdGhyb3VnaCBydG5ldGxpbmsKLSAqLwotCi0jaWZkZWYgV0VfRVZFTlRfUlRORVRMSU5LCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKgotICogTG9ja2luZy4uLgotICogLS0tLS0tLS0tLQotICoKLSAqIFRoYW5rcyB0byBIZXJiZXJ0IFh1IDxoZXJiZXJ0QGdvbmRvci5hcGFuYS5vcmcuYXU+IGZvciBmaXhpbmcKLSAqIHRoZSBsb2NraW5nIGlzc3VlIGluIGhlcmUgYW5kIGltcGxlbWVudGluZyB0aGlzIGNvZGUgIQotICoKLSAqIFRoZSBpc3N1ZSA6IHdpcmVsZXNzX3NlbmRfZXZlbnQoKSBpcyBvZnRlbiBjYWxsZWQgaW4gaW50ZXJydXB0IGNvbnRleHQsCi0gKiB3aGlsZSB0aGUgTmV0bGluayBsYXllciBjYW4gbmV2ZXIgYmUgY2FsbGVkIGluIGludGVycnVwdCBjb250ZXh0LgotICogVGhlIGZ1bGx5IGZvcm1lZCBSdE5ldGxpbmsgZXZlbnRzIGFyZSBxdWV1ZWQsIGFuZCB0aGVuIGEgdGFza2xldCBpcyBydW4KLSAqIHRvIGZlZWQgdGhvc2UgdG8gTmV0bGluay4KLSAqIFRoZSBza2JfcXVldWUgaXMgaW50ZXJydXB0IHNhZmUsIGFuZCBpdHMgbG9jayBpcyBub3QgaGVsZCB3aGlsZSBjYWxsaW5nCi0gKiBOZXRsaW5rLCBzbyB0aGVyZSBpcyBubyBwb3NzaWJpbGl0eSBvZiBkZWFsb2NrLgotICogSmVhbiBJSQotICovCi0KLXN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHdpcmVsZXNzX25sZXZlbnRfcXVldWU7Ci0KLXN0YXRpYyBpbnQgX19pbml0IHdpcmVsZXNzX25sZXZlbnRfaW5pdCh2b2lkKQotewotCXNrYl9xdWV1ZV9oZWFkX2luaXQoJndpcmVsZXNzX25sZXZlbnRfcXVldWUpOwotCXJldHVybiAwOwotfQotCi1zdWJzeXNfaW5pdGNhbGwod2lyZWxlc3NfbmxldmVudF9pbml0KTsKLQotc3RhdGljIHZvaWQgd2lyZWxlc3NfbmxldmVudF9wcm9jZXNzKHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCi0Jd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZSgmd2lyZWxlc3NfbmxldmVudF9xdWV1ZSkpKQotCQlydG5sX25vdGlmeShza2IsIDAsIFJUTkxHUlBfTElOSywgTlVMTCwgR0ZQX0FUT01JQyk7Ci19Ci0KLXN0YXRpYyBERUNMQVJFX1RBU0tMRVQod2lyZWxlc3NfbmxldmVudF90YXNrbGV0LCB3aXJlbGVzc19ubGV2ZW50X3Byb2Nlc3MsIDApOwotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKgotICogRmlsbCBhIHJ0bmV0bGluayBtZXNzYWdlIHdpdGggb3VyIGV2ZW50IGRhdGEuCi0gKiBOb3RlIHRoYXQgd2UgcHJvcGFnZSBvbmx5IHRoZSBzcGVjaWZpZWQgZXZlbnQgYW5kIGRvbid0IGR1bXAgdGhlCi0gKiBjdXJyZW50IHdpcmVsZXNzIGNvbmZpZy4gRHVtcGluZyB0aGUgd2lyZWxlc3MgY29uZmlnIGlzIGZhciB0b28KLSAqIGV4cGVuc2l2ZSAoZm9yIGVhY2ggcGFyYW1ldGVyLCB0aGUgZHJpdmVyIG5lZWQgdG8gcXVlcnkgdGhlIGhhcmR3YXJlKS4KLSAqLwotc3RhdGljIGlubGluZSBpbnQgcnRuZXRsaW5rX2ZpbGxfaXdpbmZvKHN0cnVjdCBza19idWZmICoJc2tiLAotCQkJCQlzdHJ1Y3QgbmV0X2RldmljZSAqCWRldiwKLQkJCQkJaW50CQkJdHlwZSwKLQkJCQkJY2hhciAqCQkJZXZlbnQsCi0JCQkJCWludAkJCWV2ZW50X2xlbikKLXsKLQlzdHJ1Y3QgaWZpbmZvbXNnICpyOwotCXN0cnVjdCBubG1zZ2hkciAgKm5saDsKLQl1bnNpZ25lZCBjaGFyCSAqYiA9IHNrYi0+dGFpbDsKLQotCW5saCA9IE5MTVNHX1BVVChza2IsIDAsIDAsIHR5cGUsIHNpemVvZigqcikpOwotCXIgPSBOTE1TR19EQVRBKG5saCk7Ci0Jci0+aWZpX2ZhbWlseSA9IEFGX1VOU1BFQzsKLQlyLT5fX2lmaV9wYWQgPSAwOwotCXItPmlmaV90eXBlID0gZGV2LT50eXBlOwotCXItPmlmaV9pbmRleCA9IGRldi0+aWZpbmRleDsKLQlyLT5pZmlfZmxhZ3MgPSBkZXZfZ2V0X2ZsYWdzKGRldik7Ci0Jci0+aWZpX2NoYW5nZSA9IDA7CS8qIFdpcmVsZXNzIGNoYW5nZXMgZG9uJ3QgYWZmZWN0IHRob3NlIGZsYWdzICovCi0KLQkvKiBBZGQgdGhlIHdpcmVsZXNzIGV2ZW50cyBpbiB0aGUgbmV0bGluayBwYWNrZXQgKi8KLQlSVEFfUFVUKHNrYiwgSUZMQV9XSVJFTEVTUywgZXZlbnRfbGVuLCBldmVudCk7Ci0KLQlubGgtPm5sbXNnX2xlbiA9IHNrYi0+dGFpbCAtIGI7Ci0JcmV0dXJuIHNrYi0+bGVuOwotCi1ubG1zZ19mYWlsdXJlOgotcnRhdHRyX2ZhaWx1cmU6Ci0Jc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKLQlyZXR1cm4gLTE7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qCi0gKiBDcmVhdGUgYW5kIGJyb2FkY2FzdCBhbmQgc2VuZCBpdCBvbiB0aGUgc3RhbmRhcmQgcnRuZXRsaW5rIHNvY2tldAotICogVGhpcyBpcyBhIHB1cmUgY2xvbmUgcnRtc2dfaWZpbmZvKCkgaW4gbmV0L2NvcmUvcnRuZXRsaW5rLmMKLSAqIEFuZHJ6ZWogS3J6eXN6dG9mb3dpY3ogbWFuZGF0ZWQgdGhhdCBJIHVzZWQgYSBJRkxBX1hYWCBmaWVsZAotICogd2l0aGluIGEgUlRNX05FV0xJTksgZXZlbnQuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBydG1zZ19pd2luZm8oc3RydWN0IG5ldF9kZXZpY2UgKglkZXYsCi0JCQkJY2hhciAqCQkJZXZlbnQsCi0JCQkJaW50CQkJZXZlbnRfbGVuKQotewotCXN0cnVjdCBza19idWZmICpza2I7Ci0JaW50IHNpemUgPSBOTE1TR19HT09EU0laRTsKLQotCXNrYiA9IGFsbG9jX3NrYihzaXplLCBHRlBfQVRPTUlDKTsKLQlpZiAoIXNrYikKLQkJcmV0dXJuOwotCi0JaWYgKHJ0bmV0bGlua19maWxsX2l3aW5mbyhza2IsIGRldiwgUlRNX05FV0xJTkssCi0JCQkJICBldmVudCwgZXZlbnRfbGVuKSA8IDApIHsKLQkJa2ZyZWVfc2tiKHNrYik7Ci0JCXJldHVybjsKLQl9Ci0JTkVUTElOS19DQihza2IpLmRzdF9ncm91cCA9IFJUTkxHUlBfTElOSzsKLQlza2JfcXVldWVfdGFpbCgmd2lyZWxlc3NfbmxldmVudF9xdWV1ZSwgc2tiKTsKLQl0YXNrbGV0X3NjaGVkdWxlKCZ3aXJlbGVzc19ubGV2ZW50X3Rhc2tsZXQpOwotfQotCi0jZW5kaWYJLyogV0VfRVZFTlRfUlRORVRMSU5LICovCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qCi0gKiBNYWluIGV2ZW50IGRpc3BhdGNoZXIuIENhbGxlZCBmcm9tIG90aGVyIHBhcnRzIGFuZCBkcml2ZXJzLgotICogU2VuZCB0aGUgZXZlbnQgb24gdGhlIGFwcHJvcHJpYXRlIGNoYW5uZWxzLgotICogTWF5IGJlIGNhbGxlZCBmcm9tIGludGVycnVwdCBjb250ZXh0LgotICovCi12b2lkIHdpcmVsZXNzX3NlbmRfZXZlbnQoc3RydWN0IG5ldF9kZXZpY2UgKglkZXYsCi0JCQkgdW5zaWduZWQgaW50CQljbWQsCi0JCQkgdW5pb24gaXdyZXFfZGF0YSAqCXdycXUsCi0JCQkgY2hhciAqCQkJZXh0cmEpCi17Ci0JY29uc3Qgc3RydWN0IGl3X2lvY3RsX2Rlc2NyaXB0aW9uICoJZGVzY3IgPSBOVUxMOwotCWludCBleHRyYV9sZW4gPSAwOwotCXN0cnVjdCBpd19ldmVudCAgKmV2ZW50OwkJLyogTWFsbG9jYXRlZCB3aG9sZSBldmVudCAqLwotCWludCBldmVudF9sZW47CQkJCS8qIEl0cyBzaXplICovCi0JaW50IGhkcl9sZW47CQkJCS8qIFNpemUgb2YgdGhlIGV2ZW50IGhlYWRlciAqLwotCWludCB3cnF1X29mZiA9IDA7CQkJLyogT2Zmc2V0IGluIHdycXUgKi8KLQkvKiBEb24ndCAib3B0aW1pc2UiIHRoZSBmb2xsb3dpbmcgdmFyaWFibGUsIGl0IHdpbGwgY3Jhc2ggKi8KLQl1bnNpZ25lZAljbWRfaW5kZXg7CQkvKiAqTVVTVCogYmUgdW5zaWduZWQgKi8KLQotCS8qIEdldCB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIEV2ZW50ICovCi0JaWYoY21kIDw9IFNJT0NJV0xBU1QpIHsKLQkJY21kX2luZGV4ID0gY21kIC0gU0lPQ0lXRklSU1Q7Ci0JCWlmKGNtZF9pbmRleCA8IHN0YW5kYXJkX2lvY3RsX251bSkKLQkJCWRlc2NyID0gJihzdGFuZGFyZF9pb2N0bFtjbWRfaW5kZXhdKTsKLQl9IGVsc2UgewotCQljbWRfaW5kZXggPSBjbWQgLSBJV0VWRklSU1Q7Ci0JCWlmKGNtZF9pbmRleCA8IHN0YW5kYXJkX2V2ZW50X251bSkKLQkJCWRlc2NyID0gJihzdGFuZGFyZF9ldmVudFtjbWRfaW5kZXhdKTsKLQl9Ci0JLyogRG9uJ3QgYWNjZXB0IHVua25vd24gZXZlbnRzICovCi0JaWYoZGVzY3IgPT0gTlVMTCkgewotCQkvKiBOb3RlIDogd2UgZG9uJ3QgcmV0dXJuIGFuIGVycm9yIHRvIHRoZSBkcml2ZXIsIGJlY2F1c2UKLQkJICogdGhlIGRyaXZlciB3b3VsZCBub3Qga25vdyB3aGF0IHRvIGRvIGFib3V0IGl0LiBJdCBjYW4ndAotCQkgKiByZXR1cm4gYW4gZXJyb3IgdG8gdGhlIHVzZXIsIGJlY2F1c2UgdGhlIGV2ZW50IGlzIG5vdAotCQkgKiBpbml0aWF0ZWQgYnkgYSB1c2VyIHJlcXVlc3QuCi0JCSAqIFRoZSBiZXN0IHRoZSBkcml2ZXIgY291bGQgZG8gaXMgdG8gbG9nIGFuIGVycm9yIG1lc3NhZ2UuCi0JCSAqIFdlIHdpbGwgZG8gaXQgb3Vyc2VsdmVzIGluc3RlYWQuLi4KLQkJICovCi0JCXByaW50ayhLRVJOX0VSUiAiJXMgKFdFKSA6IEludmFsaWQvVW5rbm93biBXaXJlbGVzcyBFdmVudCAoMHglMDRYKVxuIiwKLQkJICAgICAgIGRldi0+bmFtZSwgY21kKTsKLQkJcmV0dXJuOwotCX0KLSNpZmRlZiBXRV9FVkVOVF9ERUJVRwotCXByaW50ayhLRVJOX0RFQlVHICIlcyAoV0UpIDogR290IGV2ZW50IDB4JTA0WFxuIiwKLQkgICAgICAgZGV2LT5uYW1lLCBjbWQpOwotCXByaW50ayhLRVJOX0RFQlVHICIlcyAoV0UpIDogSGVhZGVyIHR5cGUgOiAlZCwgVG9rZW4gdHlwZSA6ICVkLCBzaXplIDogJWQsIHRva2VuIDogJWRcbiIsIGRldi0+bmFtZSwgZGVzY3ItPmhlYWRlcl90eXBlLCBkZXNjci0+dG9rZW5fdHlwZSwgZGVzY3ItPnRva2VuX3NpemUsIGRlc2NyLT5tYXhfdG9rZW5zKTsKLSNlbmRpZgkvKiBXRV9FVkVOVF9ERUJVRyAqLwotCi0JLyogQ2hlY2sgZXh0cmEgcGFyYW1ldGVycyBhbmQgc2V0IGV4dHJhX2xlbiAqLwotCWlmKGRlc2NyLT5oZWFkZXJfdHlwZSA9PSBJV19IRUFERVJfVFlQRV9QT0lOVCkgewotCQkvKiBDaGVjayBpZiBudW1iZXIgb2YgdG9rZW4gZml0cyB3aXRoaW4gYm91bmRzICovCi0JCWlmKHdycXUtPmRhdGEubGVuZ3RoID4gZGVzY3ItPm1heF90b2tlbnMpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiJXMgKFdFKSA6IFdpcmVsZXNzIEV2ZW50IHRvbyBiaWcgKCVkKVxuIiwgZGV2LT5uYW1lLCB3cnF1LT5kYXRhLmxlbmd0aCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYod3JxdS0+ZGF0YS5sZW5ndGggPCBkZXNjci0+bWluX3Rva2VucykgewotCQkJcHJpbnRrKEtFUk5fRVJSICIlcyAoV0UpIDogV2lyZWxlc3MgRXZlbnQgdG9vIHNtYWxsICglZClcbiIsIGRldi0+bmFtZSwgd3JxdS0+ZGF0YS5sZW5ndGgpOwotCQkJcmV0dXJuOwotCQl9Ci0JCS8qIENhbGN1bGF0ZSBleHRyYV9sZW4gLSBleHRyYSBpcyBOVUxMIGZvciByZXN0cmljdGVkIGV2ZW50cyAqLwotCQlpZihleHRyYSAhPSBOVUxMKQotCQkJZXh0cmFfbGVuID0gd3JxdS0+ZGF0YS5sZW5ndGggKiBkZXNjci0+dG9rZW5fc2l6ZTsKLQkJLyogQWx3YXlzIGF0IGFuIG9mZnNldCBpbiB3cnF1ICovCi0JCXdycXVfb2ZmID0gSVdfRVZfUE9JTlRfT0ZGOwotI2lmZGVmIFdFX0VWRU5UX0RFQlVHCi0JCXByaW50ayhLRVJOX0RFQlVHICIlcyAoV0UpIDogRXZlbnQgMHglMDRYLCB0b2tlbnMgJWQsIGV4dHJhX2xlbiAlZFxuIiwgZGV2LT5uYW1lLCBjbWQsIHdycXUtPmRhdGEubGVuZ3RoLCBleHRyYV9sZW4pOwotI2VuZGlmCS8qIFdFX0VWRU5UX0RFQlVHICovCi0JfQotCi0JLyogVG90YWwgbGVuZ3RoIG9mIHRoZSBldmVudCAqLwotCWhkcl9sZW4gPSBldmVudF90eXBlX3NpemVbZGVzY3ItPmhlYWRlcl90eXBlXTsKLQlldmVudF9sZW4gPSBoZHJfbGVuICsgZXh0cmFfbGVuOwotCi0jaWZkZWYgV0VfRVZFTlRfREVCVUcKLQlwcmludGsoS0VSTl9ERUJVRyAiJXMgKFdFKSA6IEV2ZW50IDB4JTA0WCwgaGRyX2xlbiAlZCwgd3JxdV9vZmYgJWQsIGV2ZW50X2xlbiAlZFxuIiwgZGV2LT5uYW1lLCBjbWQsIGhkcl9sZW4sIHdycXVfb2ZmLCBldmVudF9sZW4pOwotI2VuZGlmCS8qIFdFX0VWRU5UX0RFQlVHICovCi0KLQkvKiBDcmVhdGUgdGVtcG9yYXJ5IGJ1ZmZlciB0byBob2xkIHRoZSBldmVudCAqLwotCWV2ZW50ID0ga21hbGxvYyhldmVudF9sZW4sIEdGUF9BVE9NSUMpOwotCWlmKGV2ZW50ID09IE5VTEwpCi0JCXJldHVybjsKLQotCS8qIEZpbGwgZXZlbnQgKi8KLQlldmVudC0+bGVuID0gZXZlbnRfbGVuOwotCWV2ZW50LT5jbWQgPSBjbWQ7Ci0JbWVtY3B5KCZldmVudC0+dSwgKChjaGFyICopIHdycXUpICsgd3JxdV9vZmYsIGhkcl9sZW4gLSBJV19FVl9MQ1BfTEVOKTsKLQlpZihleHRyYSAhPSBOVUxMKQotCQltZW1jcHkoKChjaGFyICopIGV2ZW50KSArIGhkcl9sZW4sIGV4dHJhLCBleHRyYV9sZW4pOwotCi0jaWZkZWYgV0VfRVZFTlRfUlRORVRMSU5LCi0JLyogU2VuZCB2aWEgdGhlIFJ0TmV0bGluayBldmVudCBjaGFubmVsICovCi0JcnRtc2dfaXdpbmZvKGRldiwgKGNoYXIgKikgZXZlbnQsIGV2ZW50X2xlbik7Ci0jZW5kaWYJLyogV0VfRVZFTlRfUlRORVRMSU5LICovCi0KLQkvKiBDbGVhbnVwICovCi0Ja2ZyZWUoZXZlbnQpOwotCi0JcmV0dXJuOwkJLyogQWx3YXlzIHN1Y2Nlc3MsIEkgZ3Vlc3MgOy0pICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqIEVOSEFOQ0VEIElXU1BZIFNVUFBPUlQgKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBJbiB0aGUgb2xkIGRheXMsIHRoZSBkcml2ZXIgd2FzIGhhbmRsaW5nIHNweSBzdXBwb3J0IGFsbCBieSBpdHNlbGYuCi0gKiBOb3csIHRoZSBkcml2ZXIgY2FuIGRlbGVnYXRlIHRoaXMgdGFzayB0byBXaXJlbGVzcyBFeHRlbnNpb25zLgotICogSXQgbmVlZHMgdG8gdXNlIHRob3NlIHN0YW5kYXJkIHNweSBpd19oYW5kbGVyIGluIHN0cnVjdCBpd19oYW5kbGVyX2RlZiwKLSAqIHB1c2ggZGF0YSB0byB1cyB2aWEgd2lyZWxlc3Nfc3B5X3VwZGF0ZSgpIGFuZCBpbmNsdWRlIHN0cnVjdCBpd19zcHlfZGF0YQotICogaW4gaXRzIHByaXZhdGUgcGFydCAoYW5kIGV4cG9ydCBpdCBpbiBuZXRfZGV2aWNlLT53aXJlbGVzc19kYXRhLT5zcHlfZGF0YSkuCi0gKiBPbmUgb2YgdGhlIG1haW4gYWR2YW50YWdlIG9mIGNlbnRyYWxpc2luZyBzcHkgc3VwcG9ydCBoZXJlIGlzIHRoYXQKLSAqIGl0IGJlY29tZXMgbXVjaCBlYXNpZXIgdG8gaW1wcm92ZSBhbmQgZXh0ZW5kIGl0IHdpdGhvdXQgaGF2aW5nIHRvIHRvdWNoCi0gKiB0aGUgZHJpdmVycy4gT25lIGV4YW1wbGUgaXMgdGhlIGFkZGl0aW9uIG9mIHRoZSBTcHktVGhyZXNob2xkIGV2ZW50cy4KLSAqLwotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKgotICogUmV0dXJuIHRoZSBwb2ludGVyIHRvIHRoZSBzcHkgZGF0YSBpbiB0aGUgZHJpdmVyLgotICogQmVjYXVzZSB0aGlzIGlzIGNhbGxlZCBvbiB0aGUgUnggcGF0aCB2aWEgd2lyZWxlc3Nfc3B5X3VwZGF0ZSgpLAotICogd2Ugd2FudCBpdCB0byBiZSBlZmZpY2llbnQuLi4KLSAqLwotc3RhdGljIGlubGluZSBzdHJ1Y3QgaXdfc3B5X2RhdGEgKiBnZXRfc3B5ZGF0YShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCS8qIFRoaXMgaXMgdGhlIG5ldyB3YXkgKi8KLQlpZihkZXYtPndpcmVsZXNzX2RhdGEpCi0JCXJldHVybihkZXYtPndpcmVsZXNzX2RhdGEtPnNweV9kYXRhKTsKLQlyZXR1cm4gTlVMTDsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyoKLSAqIFN0YW5kYXJkIFdpcmVsZXNzIEhhbmRsZXIgOiBzZXQgU3B5IExpc3QKLSAqLwotaW50IGl3X2hhbmRsZXJfc2V0X3NweShzdHJ1Y3QgbmV0X2RldmljZSAqCWRldiwKLQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKglpbmZvLAotCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqCXdycXUsCi0JCSAgICAgICBjaGFyICoJCQlleHRyYSkKLXsKLQlzdHJ1Y3QgaXdfc3B5X2RhdGEgKglzcHlkYXRhID0gZ2V0X3NweWRhdGEoZGV2KTsKLQlzdHJ1Y3Qgc29ja2FkZHIgKglhZGRyZXNzID0gKHN0cnVjdCBzb2NrYWRkciAqKSBleHRyYTsKLQotCS8qIE1ha2Ugc3VyZSBkcml2ZXIgaXMgbm90IGJ1Z2d5IG9yIHVzaW5nIHRoZSBvbGQgQVBJICovCi0JaWYoIXNweWRhdGEpCi0JCXJldHVybiAtRU9QTk9UU1VQUDsKLQotCS8qIERpc2FibGUgc3B5IGNvbGxlY3Rpb24gd2hpbGUgd2UgY29weSB0aGUgYWRkcmVzc2VzLgotCSAqIFdoaWxlIHdlIGNvcHkgYWRkcmVzc2VzLCBhbnkgY2FsbCB0byB3aXJlbGVzc19zcHlfdXBkYXRlKCkKLQkgKiB3aWxsIE5PUC4gVGhpcyBpcyBPSywgYXMgYW55d2F5IHRoZSBhZGRyZXNzZXMgYXJlIGNoYW5naW5nLiAqLwotCXNweWRhdGEtPnNweV9udW1iZXIgPSAwOwotCi0JLyogV2Ugd2FudCB0byBvcGVyYXRlIHdpdGhvdXQgbG9ja2luZywgYmVjYXVzZSB3aXJlbGVzc19zcHlfdXBkYXRlKCkKLQkgKiBtb3N0IGxpa2VseSB3aWxsIGhhcHBlbiBpbiB0aGUgaW50ZXJydXB0IGhhbmRsZXIsIGFuZCB0aGVyZWZvcmUKLQkgKiBoYXZlIGl0cyBvd24gbG9ja2luZyBjb25zdHJhaW50cyBhbmQgbmVlZHMgcGVyZm9ybWFuY2UuCi0JICogVGhlIHJ0bmxfbG9jaygpIG1ha2Ugc3VyZSB3ZSBkb24ndCByYWNlIHdpdGggdGhlIG90aGVyIGl3X2hhbmRsZXJzLgotCSAqIFRoaXMgbWFrZSBzdXJlIHdpcmVsZXNzX3NweV91cGRhdGUoKSAic2VlIiB0aGF0IHRoZSBzcHkgbGlzdAotCSAqIGlzIHRlbXBvcmFyaWx5IGRpc2FibGVkLiAqLwotCXNtcF93bWIoKTsKLQotCS8qIEFyZSB0aGVyZSBhcmUgYWRkcmVzc2VzIHRvIGNvcHk/ICovCi0JaWYod3JxdS0+ZGF0YS5sZW5ndGggPiAwKSB7Ci0JCWludCBpOwotCi0JCS8qIENvcHkgYWRkcmVzc2VzICovCi0JCWZvcihpID0gMDsgaSA8IHdycXUtPmRhdGEubGVuZ3RoOyBpKyspCi0JCQltZW1jcHkoc3B5ZGF0YS0+c3B5X2FkZHJlc3NbaV0sIGFkZHJlc3NbaV0uc2FfZGF0YSwKLQkJCSAgICAgICBFVEhfQUxFTik7Ci0JCS8qIFJlc2V0IHN0YXRzICovCi0JCW1lbXNldChzcHlkYXRhLT5zcHlfc3RhdCwgMCwKLQkJICAgICAgIHNpemVvZihzdHJ1Y3QgaXdfcXVhbGl0eSkgKiBJV19NQVhfU1BZKTsKLQotI2lmZGVmIFdFX1NQWV9ERUJVRwotCQlwcmludGsoS0VSTl9ERUJVRyAiaXdfaGFuZGxlcl9zZXRfc3B5KCkgOiAgd2lyZWxlc3NfZGF0YSAlcCwgc3B5ZGF0YSAlcCwgbnVtICVkXG4iLCBkZXYtPndpcmVsZXNzX2RhdGEsIHNweWRhdGEsIHdycXUtPmRhdGEubGVuZ3RoKTsKLQkJZm9yIChpID0gMDsgaSA8IHdycXUtPmRhdGEubGVuZ3RoOyBpKyspCi0JCQlwcmludGsoS0VSTl9ERUJVRwotCQkJICAgICAgICIlMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWCBcbiIsCi0JCQkgICAgICAgc3B5ZGF0YS0+c3B5X2FkZHJlc3NbaV1bMF0sCi0JCQkgICAgICAgc3B5ZGF0YS0+c3B5X2FkZHJlc3NbaV1bMV0sCi0JCQkgICAgICAgc3B5ZGF0YS0+c3B5X2FkZHJlc3NbaV1bMl0sCi0JCQkgICAgICAgc3B5ZGF0YS0+c3B5X2FkZHJlc3NbaV1bM10sCi0JCQkgICAgICAgc3B5ZGF0YS0+c3B5X2FkZHJlc3NbaV1bNF0sCi0JCQkgICAgICAgc3B5ZGF0YS0+c3B5X2FkZHJlc3NbaV1bNV0pOwotI2VuZGlmCS8qIFdFX1NQWV9ERUJVRyAqLwotCX0KLQotCS8qIE1ha2Ugc3VyZSBhYm92ZSBpcyB1cGRhdGVkIGJlZm9yZSByZS1lbmFibGluZyAqLwotCXNtcF93bWIoKTsKLQotCS8qIEVuYWJsZSBhZGRyZXNzZXMgKi8KLQlzcHlkYXRhLT5zcHlfbnVtYmVyID0gd3JxdS0+ZGF0YS5sZW5ndGg7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyoKLSAqIFN0YW5kYXJkIFdpcmVsZXNzIEhhbmRsZXIgOiBnZXQgU3B5IExpc3QKLSAqLwotaW50IGl3X2hhbmRsZXJfZ2V0X3NweShzdHJ1Y3QgbmV0X2RldmljZSAqCWRldiwKLQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKglpbmZvLAotCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqCXdycXUsCi0JCSAgICAgICBjaGFyICoJCQlleHRyYSkKLXsKLQlzdHJ1Y3QgaXdfc3B5X2RhdGEgKglzcHlkYXRhID0gZ2V0X3NweWRhdGEoZGV2KTsKLQlzdHJ1Y3Qgc29ja2FkZHIgKglhZGRyZXNzID0gKHN0cnVjdCBzb2NrYWRkciAqKSBleHRyYTsKLQlpbnQJCQlpOwotCi0JLyogTWFrZSBzdXJlIGRyaXZlciBpcyBub3QgYnVnZ3kgb3IgdXNpbmcgdGhlIG9sZCBBUEkgKi8KLQlpZighc3B5ZGF0YSkKLQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCi0Jd3JxdS0+ZGF0YS5sZW5ndGggPSBzcHlkYXRhLT5zcHlfbnVtYmVyOwotCi0JLyogQ29weSBhZGRyZXNzZXMuICovCi0JZm9yKGkgPSAwOyBpIDwgc3B5ZGF0YS0+c3B5X251bWJlcjsgaSsrKSAJewotCQltZW1jcHkoYWRkcmVzc1tpXS5zYV9kYXRhLCBzcHlkYXRhLT5zcHlfYWRkcmVzc1tpXSwgRVRIX0FMRU4pOwotCQlhZGRyZXNzW2ldLnNhX2ZhbWlseSA9IEFGX1VOSVg7Ci0JfQotCS8qIENvcHkgc3RhdHMgdG8gdGhlIHVzZXIgYnVmZmVyIChqdXN0IGFmdGVyKS4gKi8KLQlpZihzcHlkYXRhLT5zcHlfbnVtYmVyID4gMCkKLQkJbWVtY3B5KGV4dHJhICArIChzaXplb2Yoc3RydWN0IHNvY2thZGRyKSAqc3B5ZGF0YS0+c3B5X251bWJlciksCi0JCSAgICAgICBzcHlkYXRhLT5zcHlfc3RhdCwKLQkJICAgICAgIHNpemVvZihzdHJ1Y3QgaXdfcXVhbGl0eSkgKiBzcHlkYXRhLT5zcHlfbnVtYmVyKTsKLQkvKiBSZXNldCB1cGRhdGVkIGZsYWdzLiAqLwotCWZvcihpID0gMDsgaSA8IHNweWRhdGEtPnNweV9udW1iZXI7IGkrKykKLQkJc3B5ZGF0YS0+c3B5X3N0YXRbaV0udXBkYXRlZCAmPSB+SVdfUVVBTF9BTExfVVBEQVRFRDsKLQlyZXR1cm4gMDsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyoKLSAqIFN0YW5kYXJkIFdpcmVsZXNzIEhhbmRsZXIgOiBzZXQgc3B5IHRocmVzaG9sZAotICovCi1pbnQgaXdfaGFuZGxlcl9zZXRfdGhyc3B5KHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2LAotCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJICB1bmlvbiBpd3JlcV9kYXRhICoJd3JxdSwKLQkJCSAgY2hhciAqCQlleHRyYSkKLXsKLQlzdHJ1Y3QgaXdfc3B5X2RhdGEgKglzcHlkYXRhID0gZ2V0X3NweWRhdGEoZGV2KTsKLQlzdHJ1Y3QgaXdfdGhyc3B5ICoJdGhyZXNob2xkID0gKHN0cnVjdCBpd190aHJzcHkgKikgZXh0cmE7Ci0KLQkvKiBNYWtlIHN1cmUgZHJpdmVyIGlzIG5vdCBidWdneSBvciB1c2luZyB0aGUgb2xkIEFQSSAqLwotCWlmKCFzcHlkYXRhKQotCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0KLQkvKiBKdXN0IGRvIGl0ICovCi0JbWVtY3B5KCYoc3B5ZGF0YS0+c3B5X3Rocl9sb3cpLCAmKHRocmVzaG9sZC0+bG93KSwKLQkgICAgICAgMiAqIHNpemVvZihzdHJ1Y3QgaXdfcXVhbGl0eSkpOwotCi0JLyogQ2xlYXIgZmxhZyAqLwotCW1lbXNldChzcHlkYXRhLT5zcHlfdGhyX3VuZGVyLCAnXDAnLCBzaXplb2Yoc3B5ZGF0YS0+c3B5X3Rocl91bmRlcikpOwotCi0jaWZkZWYgV0VfU1BZX0RFQlVHCi0JcHJpbnRrKEtFUk5fREVCVUcgIml3X2hhbmRsZXJfc2V0X3RocnNweSgpIDogIGxvdyAlZCA7IGhpZ2ggJWRcbiIsIHNweWRhdGEtPnNweV90aHJfbG93LmxldmVsLCBzcHlkYXRhLT5zcHlfdGhyX2hpZ2gubGV2ZWwpOwotI2VuZGlmCS8qIFdFX1NQWV9ERUJVRyAqLwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qCi0gKiBTdGFuZGFyZCBXaXJlbGVzcyBIYW5kbGVyIDogZ2V0IHNweSB0aHJlc2hvbGQKLSAqLwotaW50IGl3X2hhbmRsZXJfZ2V0X3RocnNweShzdHJ1Y3QgbmV0X2RldmljZSAqCWRldiwKLQkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCSAgdW5pb24gaXdyZXFfZGF0YSAqCXdycXUsCi0JCQkgIGNoYXIgKgkJZXh0cmEpCi17Ci0Jc3RydWN0IGl3X3NweV9kYXRhICoJc3B5ZGF0YSA9IGdldF9zcHlkYXRhKGRldik7Ci0Jc3RydWN0IGl3X3RocnNweSAqCXRocmVzaG9sZCA9IChzdHJ1Y3QgaXdfdGhyc3B5ICopIGV4dHJhOwotCi0JLyogTWFrZSBzdXJlIGRyaXZlciBpcyBub3QgYnVnZ3kgb3IgdXNpbmcgdGhlIG9sZCBBUEkgKi8KLQlpZighc3B5ZGF0YSkKLQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCi0JLyogSnVzdCBkbyBpdCAqLwotCW1lbWNweSgmKHRocmVzaG9sZC0+bG93KSwgJihzcHlkYXRhLT5zcHlfdGhyX2xvdyksCi0JICAgICAgIDIgKiBzaXplb2Yoc3RydWN0IGl3X3F1YWxpdHkpKTsKLQotCXJldHVybiAwOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKgotICogUHJlcGFyZSBhbmQgc2VuZCBhIFNweSBUaHJlc2hvbGQgZXZlbnQKLSAqLwotc3RhdGljIHZvaWQgaXdfc2VuZF90aHJzcHlfZXZlbnQoc3RydWN0IG5ldF9kZXZpY2UgKglkZXYsCi0JCQkJIHN0cnVjdCBpd19zcHlfZGF0YSAqCXNweWRhdGEsCi0JCQkJIHVuc2lnbmVkIGNoYXIgKglhZGRyZXNzLAotCQkJCSBzdHJ1Y3QgaXdfcXVhbGl0eSAqCXdzdGF0cykKLXsKLQl1bmlvbiBpd3JlcV9kYXRhCXdycXU7Ci0Jc3RydWN0IGl3X3RocnNweQl0aHJlc2hvbGQ7Ci0KLQkvKiBJbml0ICovCi0Jd3JxdS5kYXRhLmxlbmd0aCA9IDE7Ci0Jd3JxdS5kYXRhLmZsYWdzID0gMDsKLQkvKiBDb3B5IGFkZHJlc3MgKi8KLQltZW1jcHkodGhyZXNob2xkLmFkZHIuc2FfZGF0YSwgYWRkcmVzcywgRVRIX0FMRU4pOwotCXRocmVzaG9sZC5hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKLQkvKiBDb3B5IHN0YXRzICovCi0JbWVtY3B5KCYodGhyZXNob2xkLnF1YWwpLCB3c3RhdHMsIHNpemVvZihzdHJ1Y3QgaXdfcXVhbGl0eSkpOwotCS8qIENvcHkgYWxzbyB0aHJlc2hvbGRzICovCi0JbWVtY3B5KCYodGhyZXNob2xkLmxvdyksICYoc3B5ZGF0YS0+c3B5X3Rocl9sb3cpLAotCSAgICAgICAyICogc2l6ZW9mKHN0cnVjdCBpd19xdWFsaXR5KSk7Ci0KLSNpZmRlZiBXRV9TUFlfREVCVUcKLQlwcmludGsoS0VSTl9ERUJVRyAiaXdfc2VuZF90aHJzcHlfZXZlbnQoKSA6IGFkZHJlc3MgJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlgsIGxldmVsICVkLCB1cCA9ICVkXG4iLAotCSAgICAgICB0aHJlc2hvbGQuYWRkci5zYV9kYXRhWzBdLAotCSAgICAgICB0aHJlc2hvbGQuYWRkci5zYV9kYXRhWzFdLAotCSAgICAgICB0aHJlc2hvbGQuYWRkci5zYV9kYXRhWzJdLAotCSAgICAgICB0aHJlc2hvbGQuYWRkci5zYV9kYXRhWzNdLAotCSAgICAgICB0aHJlc2hvbGQuYWRkci5zYV9kYXRhWzRdLAotCSAgICAgICB0aHJlc2hvbGQuYWRkci5zYV9kYXRhWzVdLCB0aHJlc2hvbGQucXVhbC5sZXZlbCk7Ci0jZW5kaWYJLyogV0VfU1BZX0RFQlVHICovCi0KLQkvKiBTZW5kIGV2ZW50IHRvIHVzZXIgc3BhY2UgKi8KLQl3aXJlbGVzc19zZW5kX2V2ZW50KGRldiwgU0lPQ0dJV1RIUlNQWSwgJndycXUsIChjaGFyICopICZ0aHJlc2hvbGQpOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKgotICogQ2FsbCBmb3IgdGhlIGRyaXZlciB0byB1cGRhdGUgdGhlIHNweSBkYXRhLgotICogRm9yIG5vdywgdGhlIHNweSBkYXRhIGlzIGEgc2ltcGxlIGFycmF5LiBBcyB0aGUgc2l6ZSBvZiB0aGUgYXJyYXkgaXMKLSAqIHNtYWxsLCB0aGlzIGlzIGdvb2QgZW5vdWdoLiBJZiB3ZSB3YW50ZWQgdG8gc3VwcG9ydCBsYXJnZXIgbnVtYmVyIG9mCi0gKiBzcHkgYWRkcmVzc2VzLCB3ZSBzaG91bGQgdXNlIHNvbWV0aGluZyBtb3JlIGVmZmljaWVudC4uLgotICovCi12b2lkIHdpcmVsZXNzX3NweV91cGRhdGUoc3RydWN0IG5ldF9kZXZpY2UgKglkZXYsCi0JCQkgdW5zaWduZWQgY2hhciAqCWFkZHJlc3MsCi0JCQkgc3RydWN0IGl3X3F1YWxpdHkgKgl3c3RhdHMpCi17Ci0Jc3RydWN0IGl3X3NweV9kYXRhICoJc3B5ZGF0YSA9IGdldF9zcHlkYXRhKGRldik7Ci0JaW50CQkJaTsKLQlpbnQJCQltYXRjaCA9IC0xOwotCi0JLyogTWFrZSBzdXJlIGRyaXZlciBpcyBub3QgYnVnZ3kgb3IgdXNpbmcgdGhlIG9sZCBBUEkgKi8KLQlpZighc3B5ZGF0YSkKLQkJcmV0dXJuOwotCi0jaWZkZWYgV0VfU1BZX0RFQlVHCi0JcHJpbnRrKEtFUk5fREVCVUcgIndpcmVsZXNzX3NweV91cGRhdGUoKSA6ICB3aXJlbGVzc19kYXRhICVwLCBzcHlkYXRhICVwLCBhZGRyZXNzICUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYXG4iLCBkZXYtPndpcmVsZXNzX2RhdGEsIHNweWRhdGEsIGFkZHJlc3NbMF0sIGFkZHJlc3NbMV0sIGFkZHJlc3NbMl0sIGFkZHJlc3NbM10sIGFkZHJlc3NbNF0sIGFkZHJlc3NbNV0pOwotI2VuZGlmCS8qIFdFX1NQWV9ERUJVRyAqLwotCi0JLyogVXBkYXRlIGFsbCByZWNvcmRzIHRoYXQgbWF0Y2ggKi8KLQlmb3IoaSA9IDA7IGkgPCBzcHlkYXRhLT5zcHlfbnVtYmVyOyBpKyspCi0JCWlmKCFjb21wYXJlX2V0aGVyX2FkZHIoYWRkcmVzcywgc3B5ZGF0YS0+c3B5X2FkZHJlc3NbaV0pKSB7Ci0JCQltZW1jcHkoJihzcHlkYXRhLT5zcHlfc3RhdFtpXSksIHdzdGF0cywKLQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGl3X3F1YWxpdHkpKTsKLQkJCW1hdGNoID0gaTsKLQkJfQotCi0JLyogR2VuZXJhdGUgYW4gZXZlbnQgaWYgd2UgY3Jvc3MgdGhlIHNweSB0aHJlc2hvbGQuCi0JICogVG8gYXZvaWQgZXZlbnQgc3Rvcm1zLCB3ZSBoYXZlIGEgc2ltcGxlIGh5c3RlcmVzaXMgOiB3ZSBnZW5lcmF0ZQotCSAqIGV2ZW50IG9ubHkgd2hlbiB3ZSBnbyB1bmRlciB0aGUgbG93IHRocmVzaG9sZCBvciBhYm92ZSB0aGUKLQkgKiBoaWdoIHRocmVzaG9sZC4gKi8KLQlpZihtYXRjaCA+PSAwKSB7Ci0JCWlmKHNweWRhdGEtPnNweV90aHJfdW5kZXJbbWF0Y2hdKSB7Ci0JCQlpZih3c3RhdHMtPmxldmVsID4gc3B5ZGF0YS0+c3B5X3Rocl9oaWdoLmxldmVsKSB7Ci0JCQkJc3B5ZGF0YS0+c3B5X3Rocl91bmRlclttYXRjaF0gPSAwOwotCQkJCWl3X3NlbmRfdGhyc3B5X2V2ZW50KGRldiwgc3B5ZGF0YSwKLQkJCQkJCSAgICAgYWRkcmVzcywgd3N0YXRzKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmKHdzdGF0cy0+bGV2ZWwgPCBzcHlkYXRhLT5zcHlfdGhyX2xvdy5sZXZlbCkgewotCQkJCXNweWRhdGEtPnNweV90aHJfdW5kZXJbbWF0Y2hdID0gMTsKLQkJCQlpd19zZW5kX3RocnNweV9ldmVudChkZXYsIHNweWRhdGEsCi0JCQkJCQkgICAgIGFkZHJlc3MsIHdzdGF0cyk7Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KLUVYUE9SVF9TWU1CT0woaXdfaGFuZGxlcl9nZXRfc3B5KTsKLUVYUE9SVF9TWU1CT0woaXdfaGFuZGxlcl9nZXRfdGhyc3B5KTsKLUVYUE9SVF9TWU1CT0woaXdfaGFuZGxlcl9zZXRfc3B5KTsKLUVYUE9SVF9TWU1CT0woaXdfaGFuZGxlcl9zZXRfdGhyc3B5KTsKLUVYUE9SVF9TWU1CT0wod2lyZWxlc3Nfc2VuZF9ldmVudCk7Ci1FWFBPUlRfU1lNQk9MKHdpcmVsZXNzX3NweV91cGRhdGUpOwpkaWZmIC0tZ2l0IGEvbmV0L2RjY3AvYWNrdmVjLmMgYi9uZXQvZGNjcC9hY2t2ZWMuYwppbmRleCBhMDg2YzYzLi4wMTAzMGYzIDEwMDY0NAotLS0gYS9uZXQvZGNjcC9hY2t2ZWMuYworKysgYi9uZXQvZGNjcC9hY2t2ZWMuYwpAQCAtMTU3LDcgKzE1Nyw3IEBACiAKIAlpZiAoYXYgIT0gTlVMTCkgewogCQlhdi0+ZGNjcGF2X2J1Zl9oZWFkCT0gRENDUF9NQVhfQUNLVkVDX0xFTiAtIDE7Ci0JCWF2LT5kY2NwYXZfYnVmX2Fja25vCT0gRENDUF9NQVhfU0VRTk8gKyAxOworCQlhdi0+ZGNjcGF2X2J1Zl9hY2tubwk9IFVJTlQ0OF9NQVggKyAxOwogCQlhdi0+ZGNjcGF2X2J1Zl9ub25jZSA9IGF2LT5kY2NwYXZfYnVmX25vbmNlID0gMDsKIAkJYXYtPmRjY3Bhdl90aW1lLnR2X3NlYwk9IDA7CiAJCWF2LT5kY2NwYXZfdGltZS50dl91c2VjCT0gMDsKZGlmZiAtLWdpdCBhL25ldC9kY2NwL2NjaWRzL2NjaWQzLmMgYi9uZXQvZGNjcC9jY2lkcy9jY2lkMy5jCmluZGV4IDc0NmY3OWQuLmQ3ZDljZTcgMTAwNjQ0Ci0tLSBhL25ldC9kY2NwL2NjaWRzL2NjaWQzLmMKKysrIGIvbmV0L2RjY3AvY2NpZHMvY2NpZDMuYwpAQCAtMzMsNyArMzMsNiBAQAogICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiAgKi8KLQogI2luY2x1ZGUgIi4uL2NjaWQuaCIKICNpbmNsdWRlICIuLi9kY2NwLmgiCiAjaW5jbHVkZSAibGliL3BhY2tldF9oaXN0b3J5LmgiCkBAIC01Miw2ICs1MSw5IEBACiBzdGF0aWMgc3RydWN0IGRjY3BfcnhfaGlzdCAqY2NpZDNfcnhfaGlzdDsKIHN0YXRpYyBzdHJ1Y3QgZGNjcF9saV9oaXN0ICpjY2lkM19saV9oaXN0OwogCisvKgorICoJVHJhbnNtaXR0ZXIgSGFsZi1Db25uZWN0aW9uIFJvdXRpbmVzCisgKi8KICNpZmRlZiBDT05GSUdfSVBfRENDUF9DQ0lEM19ERUJVRwogc3RhdGljIGNvbnN0IGNoYXIgKmNjaWQzX3R4X3N0YXRlX25hbWUoZW51bSBjY2lkM19oY190eF9zdGF0ZXMgc3RhdGUpCiB7CkBAIC04MCwyMyArODIsMzcgQEAKIH0KIAogLyoKLSAqIFJlY2FsY3VsYXRlIHNjaGVkdWxlZCBub21pbmFsIHNlbmQgdGltZSB0X25vbSwgaW50ZXItcGFja2V0IGludGVydmFsCi0gKiB0X2lwaSwgYW5kIGRlbHRhIHZhbHVlLiBTaG91bGQgYmUgY2FsbGVkIGFmdGVyIGVhY2ggY2hhbmdlIHRvIFguCisgKiBDb21wdXRlIHRoZSBpbml0aWFsIHNlbmRpbmcgcmF0ZSBYX2luaXQgYWNjb3JkaW5nIHRvIFJGQyAzMzkwOgorICoJd19pbml0ICAgPSAgICBtaW4oNCAqIE1TUywgbWF4KDIgKiBNU1MsIDQzODAgYnl0ZXMpKQorICoJWF9pbml0ICAgPSAgICB3X2luaXQgLyBSVFQKKyAqIEZvciBjb25zaXN0ZW5jeSB3aXRoIG90aGVyIHBhcnRzIG9mIHRoZSBjb2RlLCBYX2luaXQgaXMgc2NhbGVkIGJ5IDJeNi4KICAqLwotc3RhdGljIGlubGluZSB2b2lkIGNjaWQzX3VwZGF0ZV9zZW5kX3RpbWUoc3RydWN0IGNjaWQzX2hjX3R4X3NvY2sgKmhjdHgpCitzdGF0aWMgaW5saW5lIHU2NCByZmMzMzkwX2luaXRpYWxfcmF0ZShzdHJ1Y3Qgc29jayAqc2spCiB7Ci0JdGltZXZhbF9zdWJfdXNlY3MoJmhjdHgtPmNjaWQzaGN0eF90X25vbSwgaGN0eC0+Y2NpZDNoY3R4X3RfaXBpKTsKKwljb25zdCBzdHJ1Y3QgZGNjcF9zb2NrICpkcCA9IGRjY3Bfc2soc2spOworCWNvbnN0IF9fdTMyIHdfaW5pdCA9IG1pbig0ICogZHAtPmRjY3BzX21zc19jYWNoZSwKKwkJCQkgbWF4KDIgKiBkcC0+ZGNjcHNfbXNzX2NhY2hlLCA0MzgwVSkpOwogCisJcmV0dXJuIHNjYWxlZF9kaXYod19pbml0IDw8IDYsIGNjaWQzX2hjX3R4X3NrKHNrKS0+Y2NpZDNoY3R4X3J0dCk7Cit9CisKKy8qCisgKiBSZWNhbGN1bGF0ZSB0X2lwaSBhbmQgZGVsdGEgKHNob3VsZCBiZSBjYWxsZWQgd2hlbmV2ZXIgWCBjaGFuZ2VzKQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgY2NpZDNfdXBkYXRlX3NlbmRfaW50ZXJ2YWwoc3RydWN0IGNjaWQzX2hjX3R4X3NvY2sgKmhjdHgpCit7CiAJLyogQ2FsY3VsYXRlIG5ldyB0X2lwaSA9IHMgLyBYX2luc3QgKFhfaW5zdCBpcyBpbiA2NCAqIGJ5dGVzL3NlY29uZCkgKi8KLQloY3R4LT5jY2lkM2hjdHhfdF9pcGkgPSBzY2FsZWRfZGl2KGhjdHgtPmNjaWQzaGN0eF9zLAotCQkJCQkgICBoY3R4LT5jY2lkM2hjdHhfeCA+PiA2KTsKLQotCS8qIFVwZGF0ZSBub21pbmFsIHNlbmQgdGltZSB3aXRoIHJlZ2FyZCB0byB0aGUgbmV3IHRfaXBpICovCi0JdGltZXZhbF9hZGRfdXNlY3MoJmhjdHgtPmNjaWQzaGN0eF90X25vbSwgaGN0eC0+Y2NpZDNoY3R4X3RfaXBpKTsKKwloY3R4LT5jY2lkM2hjdHhfdF9pcGkgPSBzY2FsZWRfZGl2MzIoKCh1NjQpaGN0eC0+Y2NpZDNoY3R4X3MpIDw8IDYsCisJCQkJCSAgICAgaGN0eC0+Y2NpZDNoY3R4X3gpOwogCiAJLyogQ2FsY3VsYXRlIG5ldyBkZWx0YSBieSBkZWx0YSA9IG1pbih0X2lwaSAvIDIsIHRfZ3JhbiAvIDIpICovCiAJaGN0eC0+Y2NpZDNoY3R4X2RlbHRhID0gbWluX3QodTMyLCBoY3R4LT5jY2lkM2hjdHhfdF9pcGkgLyAyLAogCQkJCQkgICBURlJDX09QU1lTX0hBTEZfVElNRV9HUkFOKTsKKworCWNjaWQzX3ByX2RlYnVnKCJ0X2lwaT0ldSwgZGVsdGE9JXUsIHM9JXUsIFg9JXVcbiIsCisJCSAgICAgICBoY3R4LT5jY2lkM2hjdHhfdF9pcGksIGhjdHgtPmNjaWQzaGN0eF9kZWx0YSwKKwkJICAgICAgIGhjdHgtPmNjaWQzaGN0eF9zLCAodW5zaWduZWQpKGhjdHgtPmNjaWQzaGN0eF94ID4+IDYpKTsKKwogfQogLyoKICAqIFVwZGF0ZSBYIGJ5CkBAIC0xMTIsMTkgKzEyOCwyOCBAQAogICogICAgICAgZmluZS1ncmFpbmVkIHJlc29sdXRpb24gb2Ygc2VuZGluZyByYXRlcy4gVGhpcyByZXF1aXJlcyBzY2FsaW5nIGJ5IDJeNgogICogICAgICAgdGhyb3VnaG91dCB0aGUgY29kZS4gT25seSBYX2NhbGMgaXMgdW5zY2FsZWQgKGluIGJ5dGVzL3NlY29uZCkuCiAgKgotICogSWYgWCBoYXMgY2hhbmdlZCwgd2UgYWxzbyB1cGRhdGUgdGhlIHNjaGVkdWxlZCBzZW5kIHRpbWUgdF9ub3csCi0gKiB0aGUgaW50ZXItcGFja2V0IGludGVydmFsIHRfaXBpLCBhbmQgdGhlIGRlbHRhIHZhbHVlLgogICovCiBzdGF0aWMgdm9pZCBjY2lkM19oY190eF91cGRhdGVfeChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCB0aW1ldmFsICpub3cpCiAKIHsKIAlzdHJ1Y3QgY2NpZDNfaGNfdHhfc29jayAqaGN0eCA9IGNjaWQzX2hjX3R4X3NrKHNrKTsKKwlfX3U2NCBtaW5fcmF0ZSA9IDIgKiBoY3R4LT5jY2lkM2hjdHhfeF9yZWN2OwogCWNvbnN0ICBfX3U2NCBvbGRfeCA9IGhjdHgtPmNjaWQzaGN0eF94OwogCisJLyoKKwkgKiBIYW5kbGUgSURMRSBwZXJpb2RzOiBkbyBub3QgcmVkdWNlIGJlbG93IFJGQzMzOTAgaW5pdGlhbCBzZW5kaW5nIHJhdGUKKwkgKiB3aGVuIGlkbGluZyBbUkZDIDQzNDIsIDUuMV0uIFNlZSBhbHNvIGRyYWZ0LWlldGYtZGNjcC1yZmMzNDQ4YmlzLgorCSAqIEZvciBjb25zaXN0ZW5jeSB3aXRoIFggYW5kIFhfcmVjdiwgbWluX3JhdGUgaXMgYWxzbyBzY2FsZWQgYnkgMl42LgorCSAqLworCWlmICh1bmxpa2VseShoY3R4LT5jY2lkM2hjdHhfaWRsZSkpIHsKKwkJbWluX3JhdGUgPSByZmMzMzkwX2luaXRpYWxfcmF0ZShzayk7CisJCW1pbl9yYXRlID0gbWF4KG1pbl9yYXRlLCAyICogaGN0eC0+Y2NpZDNoY3R4X3hfcmVjdik7CisJfQorCiAJaWYgKGhjdHgtPmNjaWQzaGN0eF9wID4gMCkgewogCiAJCWhjdHgtPmNjaWQzaGN0eF94ID0gbWluKCgoX191NjQpaGN0eC0+Y2NpZDNoY3R4X3hfY2FsYykgPDwgNiwKLQkJCQkJaGN0eC0+Y2NpZDNoY3R4X3hfcmVjdiAqIDIpOworCQkJCQltaW5fcmF0ZSk7CiAJCWhjdHgtPmNjaWQzaGN0eF94ID0gbWF4KGhjdHgtPmNjaWQzaGN0eF94LAogCQkJCQkoKChfX3U2NCloY3R4LT5jY2lkM2hjdHhfcykgPDwgNikgLwogCQkJCQkJCQlURlJDX1RfTUJJKTsKQEAgLTEzMywxNCArMTU4LDIxIEBACiAJCQkoc3VzZWNvbmRzX3QpaGN0eC0+Y2NpZDNoY3R4X3J0dCA+PSAwKSB7CiAKIAkJaGN0eC0+Y2NpZDNoY3R4X3ggPQotCQkJbWF4KDIgKiBtaW4oaGN0eC0+Y2NpZDNoY3R4X3gsIGhjdHgtPmNjaWQzaGN0eF94X3JlY3YpLAorCQkJbWF4KG1pbigyICogaGN0eC0+Y2NpZDNoY3R4X3gsIG1pbl9yYXRlKSwKIAkJCSAgICBzY2FsZWRfZGl2KCgoX191NjQpaGN0eC0+Y2NpZDNoY3R4X3MpIDw8IDYsCiAJCQkJICAgICAgIGhjdHgtPmNjaWQzaGN0eF9ydHQpKTsKIAkJaGN0eC0+Y2NpZDNoY3R4X3RfbGQgPSAqbm93OwogCX0KIAotCWlmIChoY3R4LT5jY2lkM2hjdHhfeCAhPSBvbGRfeCkKLQkJY2NpZDNfdXBkYXRlX3NlbmRfdGltZShoY3R4KTsKKwlpZiAoaGN0eC0+Y2NpZDNoY3R4X3ggIT0gb2xkX3gpIHsKKwkJY2NpZDNfcHJfZGVidWcoIlhfcHJldj0ldSwgWF9ub3c9JXUsIFhfY2FsYz0ldSwgIgorCQkJICAgICAgICJYX3JlY3Y9JXVcbiIsICh1bnNpZ25lZCkob2xkX3ggPj4gNiksCisJCQkgICAgICAgKHVuc2lnbmVkKShoY3R4LT5jY2lkM2hjdHhfeCA+PiA2KSwKKwkJCSAgICAgICBoY3R4LT5jY2lkM2hjdHhfeF9jYWxjLAorCQkJICAgICAgICh1bnNpZ25lZCkoaGN0eC0+Y2NpZDNoY3R4X3hfcmVjdiA+PiA2KSk7CisKKwkJY2NpZDNfdXBkYXRlX3NlbmRfaW50ZXJ2YWwoaGN0eCk7CisJfQogfQogCiAvKgpAQCAtMTQ5LDE3ICsxODEsMTIgQEAKICAqLwogc3RhdGljIGlubGluZSB2b2lkIGNjaWQzX2hjX3R4X3VwZGF0ZV9zKHN0cnVjdCBjY2lkM19oY190eF9zb2NrICpoY3R4LCBpbnQgbGVuKQogewotCWlmICh1bmxpa2VseShsZW4gPT0gMCkpCi0JCWNjaWQzX3ByX2RlYnVnKCJQYWNrZXQgcGF5bG9hZCBsZW5ndGggaXMgMCAtIG5vdCB1cGRhdGluZ1xuIik7Ci0JZWxzZQotCQloY3R4LT5jY2lkM2hjdHhfcyA9IGhjdHgtPmNjaWQzaGN0eF9zID09IDAgPyBsZW4gOgotCQkJCSAgICAoOSAqIGhjdHgtPmNjaWQzaGN0eF9zICsgbGVuKSAvIDEwOwotCS8qCi0JICogTm90ZTogV2UgY291bGQgZG8gYSBwb3RlbnRpYWwgb3B0aW1pc2F0aW9uIGhlcmUgLSB3aGVuIGBzJyBjaGFuZ2VzLAotCSAqCSByZWNhbGN1bGF0ZSBzZW5kaW5nIHJhdGUgYW5kIGNvbnNlcXVlbnRseSB0X2lwaSwgdF9kZWx0YSwgYW5kCi0JICoJIHRfbm93LiBUaGlzIGlzIGhvd2V2ZXIgbm9uLXN0YW5kYXJkLCBhbmQgdGhlIGJlbmVmaXRzIGFyZSBub3QKLQkgKgkgY2xlYXIsIHNvIGl0IGlzIGN1cnJlbnRseSBsZWZ0IG91dC4KLQkgKi8KKwljb25zdCB1MTYgb2xkX3MgPSBoY3R4LT5jY2lkM2hjdHhfczsKKworCWhjdHgtPmNjaWQzaGN0eF9zID0gb2xkX3MgPT0gMCA/IGxlbiA6ICg5ICogb2xkX3MgKyBsZW4pIC8gMTA7CisKKwlpZiAoaGN0eC0+Y2NpZDNoY3R4X3MgIT0gb2xkX3MpCisJCWNjaWQzX3VwZGF0ZV9zZW5kX2ludGVydmFsKGhjdHgpOwogfQogCiAvKgpAQCAtMTkzLDYgKzIyMCw3IEBACiB7CiAJc3RydWN0IHNvY2sgKnNrID0gKHN0cnVjdCBzb2NrICopZGF0YTsKIAlzdHJ1Y3QgY2NpZDNfaGNfdHhfc29jayAqaGN0eCA9IGNjaWQzX2hjX3R4X3NrKHNrKTsKKwlzdHJ1Y3QgdGltZXZhbCBub3c7CiAJdW5zaWduZWQgbG9uZyB0X25mYiA9IFVTRUNfUEVSX1NFQyAvIDU7CiAKIAliaF9sb2NrX3NvY2soc2spOwpAQCAtMjA1LDYgKzIzMyw4IEBACiAJY2NpZDNfcHJfZGVidWcoIiVzKCVwLCBzdGF0ZT0lcykgLSBlbnRyeSBcbiIsIGRjY3Bfcm9sZShzayksIHNrLAogCQkgICAgICAgY2NpZDNfdHhfc3RhdGVfbmFtZShoY3R4LT5jY2lkM2hjdHhfc3RhdGUpKTsKIAorCWhjdHgtPmNjaWQzaGN0eF9pZGxlID0gMTsKKwogCXN3aXRjaCAoaGN0eC0+Y2NpZDNoY3R4X3N0YXRlKSB7CiAJY2FzZSBURlJDX1NTVEFURV9OT19GQkFDSzoKIAkJLyogUkZDIDM0NDgsIDQuNDogSGFsdmUgc2VuZCByYXRlIGRpcmVjdGx5ICovCkBAIC0yMTksNTMgKzI0OSwzNyBAQAogCQkvKiBUaGUgdmFsdWUgb2YgUiBpcyBzdGlsbCB1bmRlZmluZWQgYW5kIHNvIHdlIGNhbiBub3QgcmVjb21wdXRlCiAJCSAqIHRoZSB0aW1vdXQgdmFsdWUuIEtlZXAgaW5pdGlhbCB2YWx1ZSBhcyBwZXIgW1JGQyA0MzQyLCA1XS4gKi8KIAkJdF9uZmIgPSBURlJDX0lOSVRJQUxfVElNRU9VVDsKLQkJY2NpZDNfdXBkYXRlX3NlbmRfdGltZShoY3R4KTsKKwkJY2NpZDNfdXBkYXRlX3NlbmRfaW50ZXJ2YWwoaGN0eCk7CiAJCWJyZWFrOwogCWNhc2UgVEZSQ19TU1RBVEVfRkJBQ0s6CiAJCS8qCi0JCSAqIENoZWNrIGlmIElETEUgc2luY2UgbGFzdCB0aW1lb3V0IGFuZCByZWN2IHJhdGUgaXMgbGVzcyB0aGFuCi0JCSAqIDQgcGFja2V0cyAoaW4gdW5pdHMgb2YgNjQqYnl0ZXMvc2VjKSBwZXIgUlRUCisJCSAqICBNb2RpZnkgdGhlIGNhY2hlZCB2YWx1ZSBvZiBYX3JlY3YgW1JGQyAzNDQ4LCA0LjRdCisJCSAqCisJCSAqICBJZiAocCA9PSAwIHx8IFhfY2FsYyA+IDIgKiBYX3JlY3YpCisJCSAqICAgIFhfcmVjdiA9IG1heChYX3JlY3YgLyAyLCBzIC8gKDIgKiB0X21iaSkpOworCQkgKiAgRWxzZQorCQkgKiAgICBYX3JlY3YgPSBYX2NhbGMgLyA0OworCQkgKgorCQkgKiAgTm90ZSB0aGF0IFhfcmVjdiBpcyBzY2FsZWQgYnkgMl42IHdoaWxlIFhfY2FsYyBpcyBub3QKIAkJICovCi0JCWlmICghaGN0eC0+Y2NpZDNoY3R4X2lkbGUgfHwKLQkJICAgIChoY3R4LT5jY2lkM2hjdHhfeF9yZWN2ID49IDQgKgotCQkgICAgIHNjYWxlZF9kaXYoKChfX3U2NCloY3R4LT5jY2lkM2hjdHhfcykgPDwgNiwKLQkJCQloY3R4LT5jY2lkM2hjdHhfcnR0KSkpIHsKLQkJCXN0cnVjdCB0aW1ldmFsIG5vdzsKKwkJQlVHX09OKGhjdHgtPmNjaWQzaGN0eF9wICYmICFoY3R4LT5jY2lkM2hjdHhfeF9jYWxjKTsKIAotCQkJY2NpZDNfcHJfZGVidWcoIiVzKCVwLCBzdGF0ZT0lcyksIG5vdCBpZGxlXG4iLAotCQkJCSAgICAgICBkY2NwX3JvbGUoc2spLCBzaywKLQkJCQkgICBjY2lkM190eF9zdGF0ZV9uYW1lKGhjdHgtPmNjaWQzaGN0eF9zdGF0ZSkpOworCQlpZiAoaGN0eC0+Y2NpZDNoY3R4X3AgPT0gMCB8fAorCQkgICAgKGhjdHgtPmNjaWQzaGN0eF94X2NhbGMgPiAoaGN0eC0+Y2NpZDNoY3R4X3hfcmVjdiA+PiA1KSkpIHsKIAotCQkJLyoKLQkJCSAqICBNb2RpZnkgdGhlIGNhY2hlZCB2YWx1ZSBvZiBYX3JlY3YgW1JGQyAzNDQ4LCA0LjRdCi0JCQkgKgotCQkJICogIElmIChwID09IDAgfHwgWF9jYWxjID4gMiAqIFhfcmVjdikKLQkJCSAqICAgIFhfcmVjdiA9IG1heChYX3JlY3YgLyAyLCBzIC8gKDIgKiB0X21iaSkpOwotCQkJICogIEVsc2UKLQkJCSAqICAgIFhfcmVjdiA9IFhfY2FsYyAvIDQ7Ci0JCQkgKgotCQkJICogIE5vdGUgdGhhdCBYX3JlY3YgaXMgc2NhbGVkIGJ5IDJeNiB3aGlsZSBYX2NhbGMgaXMgbm90Ci0JCQkgKi8KLQkJCUJVR19PTihoY3R4LT5jY2lkM2hjdHhfcCAmJiAhaGN0eC0+Y2NpZDNoY3R4X3hfY2FsYyk7CisJCQloY3R4LT5jY2lkM2hjdHhfeF9yZWN2ID0KKwkJCQltYXgoaGN0eC0+Y2NpZDNoY3R4X3hfcmVjdiAvIDIsCisJCQkJICAgICgoKF9fdTY0KWhjdHgtPmNjaWQzaGN0eF9zKSA8PCA2KSAvCisJCQkJCQkJICAgICAgKDIgKiBURlJDX1RfTUJJKSk7CiAKLQkJCWlmIChoY3R4LT5jY2lkM2hjdHhfcCAgPT0gMCB8fAotCQkJICAgIChoY3R4LT5jY2lkM2hjdHhfeF9jYWxjID4KLQkJCSAgICAgKGhjdHgtPmNjaWQzaGN0eF94X3JlY3YgPj4gNSkpKSB7Ci0KLQkJCQloY3R4LT5jY2lkM2hjdHhfeF9yZWN2ID0KLQkJCQkJbWF4KGhjdHgtPmNjaWQzaGN0eF94X3JlY3YgLyAyLAotCQkJCQkgICAgKCgoX191NjQpaGN0eC0+Y2NpZDNoY3R4X3MpIDw8IDYpIC8KLQkJCQkJCQkgICgyICogVEZSQ19UX01CSSkpOwotCi0JCQkJaWYgKGhjdHgtPmNjaWQzaGN0eF9wID09IDApCi0JCQkJCWRjY3BfdGltZXN0YW1wKHNrLCAmbm93KTsKLQkJCX0gZWxzZSB7Ci0JCQkJaGN0eC0+Y2NpZDNoY3R4X3hfcmVjdiA9IGhjdHgtPmNjaWQzaGN0eF94X2NhbGM7Ci0JCQkJaGN0eC0+Y2NpZDNoY3R4X3hfcmVjdiA8PD0gNDsKLQkJCX0KLQkJCS8qIE5vdyByZWNhbGN1bGF0ZSBYIFtSRkMgMzQ0OCwgNC4zLCBzdGVwICg0KV0gKi8KLQkJCWNjaWQzX2hjX3R4X3VwZGF0ZV94KHNrLCAmbm93KTsKKwkJCWlmIChoY3R4LT5jY2lkM2hjdHhfcCA9PSAwKQorCQkJCWRjY3BfdGltZXN0YW1wKHNrLCAmbm93KTsKKwkJfSBlbHNlIHsKKwkJCWhjdHgtPmNjaWQzaGN0eF94X3JlY3YgPSBoY3R4LT5jY2lkM2hjdHhfeF9jYWxjOworCQkJaGN0eC0+Y2NpZDNoY3R4X3hfcmVjdiA8PD0gNDsKIAkJfQorCQkvKiBOb3cgcmVjYWxjdWxhdGUgWCBbUkZDIDM0NDgsIDQuMywgc3RlcCAoNCldICovCisJCWNjaWQzX2hjX3R4X3VwZGF0ZV94KHNrLCAmbm93KTsKIAkJLyoKIAkJICogU2NoZWR1bGUgbm8gZmVlZGJhY2sgdGltZXIgdG8gZXhwaXJlIGluCiAJCSAqIG1heCh0X1JUTywgMiAqIHMvWCkgID0gIG1heCh0X1JUTywgMiAqIHRfaXBpKQpAQCAtMjgwLDggKzI5NCw2IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCWhjdHgtPmNjaWQzaGN0eF9pZGxlID0gMTsKLQogcmVzdGFydF90aW1lcjoKIAlza19yZXNldF90aW1lcihzaywgJmhjdHgtPmNjaWQzaGN0eF9ub19mZWVkYmFja190aW1lciwKIAkJCSAgIGppZmZpZXMgKyB1c2Vjc190b19qaWZmaWVzKHRfbmZiKSk7CkBAIC0zMjIsMjQgKzMzNCwzNSBAQAogCQkJCXVzZWNzX3RvX2ppZmZpZXMoVEZSQ19JTklUSUFMX1RJTUVPVVQpKSk7CiAJCWhjdHgtPmNjaWQzaGN0eF9sYXN0X3dpbl9jb3VudAkgPSAwOwogCQloY3R4LT5jY2lkM2hjdHhfdF9sYXN0X3dpbl9jb3VudCA9IG5vdzsKLQkJY2NpZDNfaGNfdHhfc2V0X3N0YXRlKHNrLCBURlJDX1NTVEFURV9OT19GQkFDSyk7Ci0KLQkJLyogU2V0IGluaXRpYWwgc2VuZGluZyByYXRlIFgvcyB0byAxcHBzIChYIGlzIHNjYWxlZCBieSAyXjYpICovCi0JCWNjaWQzX2hjX3R4X3VwZGF0ZV9zKGhjdHgsIHNrYi0+bGVuKTsKLQkJaGN0eC0+Y2NpZDNoY3R4X3ggPSBoY3R4LT5jY2lkM2hjdHhfczsKLQkJaGN0eC0+Y2NpZDNoY3R4X3ggPDw9IDY7Ci0KLQkJLyogRmlyc3QgdGltZW91dCwgYWNjb3JkaW5nIHRvIFtSRkMgMzQ0OCwgNC4yXSwgaXMgMSBzZWNvbmQgKi8KLQkJaGN0eC0+Y2NpZDNoY3R4X3RfaXBpID0gVVNFQ19QRVJfU0VDOwotCQkvKiBJbml0aWFsIGRlbHRhOiBtaW5pbXVtIG9mIDAuNSBzZWMgYW5kIHRfZ3Jhbi8yICovCi0JCWhjdHgtPmNjaWQzaGN0eF9kZWx0YSA9IFRGUkNfT1BTWVNfSEFMRl9USU1FX0dSQU47CiAKIAkJLyogU2V0IHRfMCBmb3IgaW5pdGlhbCBwYWNrZXQgKi8KIAkJaGN0eC0+Y2NpZDNoY3R4X3Rfbm9tID0gbm93OworCisJCWhjdHgtPmNjaWQzaGN0eF9zID0gc2tiLT5sZW47CisKKwkJLyoKKwkJICogVXNlIGluaXRpYWwgUlRUIHNhbXBsZSB3aGVuIGF2YWlsYWJsZTogcmVjb21tZW5kZWQgYnkgZXJyYXR1bQorCQkgKiB0byBSRkMgNDM0Mi4gVGhpcyBpbXBsZW1lbnRzIHRoZSBpbml0aWFsaXNhdGlvbiBwcm9jZWR1cmUgb2YKKwkJICogZHJhZnQgcmZjMzQ0OGJpcywgc2VjdGlvbiA0LjIuIFJlbWVtYmVyLCBYIGlzIHNjYWxlZCBieSAyXjYuCisJCSAqLworCQlpZiAoZHAtPmRjY3BzX3N5bl9ydHQpIHsKKwkJCWNjaWQzX3ByX2RlYnVnKCJTWU4gUlRUID0gJXV1c1xuIiwgZHAtPmRjY3BzX3N5bl9ydHQpOworCQkJaGN0eC0+Y2NpZDNoY3R4X3J0dCAgPSBkcC0+ZGNjcHNfc3luX3J0dDsKKwkJCWhjdHgtPmNjaWQzaGN0eF94ICAgID0gcmZjMzM5MF9pbml0aWFsX3JhdGUoc2spOworCQkJaGN0eC0+Y2NpZDNoY3R4X3RfbGQgPSBub3c7CisJCX0gZWxzZSB7CisJCQkvKiBTZW5kZXIgZG9lcyBub3QgaGF2ZSBSVFQgc2FtcGxlOiBYID0gTVNTL3NlY29uZCAqLworCQkJaGN0eC0+Y2NpZDNoY3R4X3ggPSBkcC0+ZGNjcHNfbXNzX2NhY2hlOworCQkJaGN0eC0+Y2NpZDNoY3R4X3ggPDw9IDY7CisJCX0KKwkJY2NpZDNfdXBkYXRlX3NlbmRfaW50ZXJ2YWwoaGN0eCk7CisKKwkJY2NpZDNfaGNfdHhfc2V0X3N0YXRlKHNrLCBURlJDX1NTVEFURV9OT19GQkFDSyk7CiAJCWJyZWFrOwogCWNhc2UgVEZSQ19TU1RBVEVfTk9fRkJBQ0s6CiAJY2FzZSBURlJDX1NTVEFURV9GQkFDSzoKIAkJZGVsYXkgPSB0aW1ldmFsX2RlbHRhKCZoY3R4LT5jY2lkM2hjdHhfdF9ub20sICZub3cpOworCQljY2lkM19wcl9kZWJ1ZygiZGVsYXk9JWxkXG4iLCAobG9uZylkZWxheSk7CiAJCS8qCiAJCSAqCVNjaGVkdWxpbmcgb2YgcGFja2V0IHRyYW5zbWlzc2lvbnMgW1JGQyAzNDQ4LCA0LjZdCiAJCSAqCkBAIC0zNjEsNiArMzg0LDcgQEAKIAkvKiBwcmVwYXJlIHRvIHNlbmQgbm93IChhZGQgb3B0aW9ucyBldGMuKSAqLwogCWRwLT5kY2Nwc19oY190eF9pbnNlcnRfb3B0aW9ucyA9IDE7CiAJRENDUF9TS0JfQ0Ioc2tiKS0+ZGNjcGRfY2N2YWwgPSBoY3R4LT5jY2lkM2hjdHhfbGFzdF93aW5fY291bnQ7CisJaGN0eC0+Y2NpZDNoY3R4X2lkbGUgPSAwOwogCiAJLyogc2V0IHRoZSBub21pbmFsIHNlbmQgdGltZSBmb3IgdGhlIG5leHQgZm9sbG93aW5nIHBhY2tldCAqLwogCXRpbWV2YWxfYWRkX3VzZWNzKCZoY3R4LT5jY2lkM2hjdHhfdF9ub20sIGhjdHgtPmNjaWQzaGN0eF90X2lwaSk7CkBAIC0zOTEsNyArNDE1LDYgQEAKIAlwYWNrZXQtPmRjY3BodHhfc2Vxbm8gID0gZGNjcF9zayhzayktPmRjY3BzX2dzczsKIAlwYWNrZXQtPmRjY3BodHhfcnR0ICAgID0gaGN0eC0+Y2NpZDNoY3R4X3J0dDsKIAlwYWNrZXQtPmRjY3BodHhfc2VudCAgID0gMTsKLQloY3R4LT5jY2lkM2hjdHhfaWRsZSAgID0gMDsKIH0KIAogc3RhdGljIHZvaWQgY2NpZDNfaGNfdHhfcGFja2V0X3JlY3Yoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQpAQCAtNDAyLDggKzQyNSw3IEBACiAJc3RydWN0IGRjY3BfdHhfaGlzdF9lbnRyeSAqcGFja2V0OwogCXN0cnVjdCB0aW1ldmFsIG5vdzsKIAl1bnNpZ25lZCBsb25nIHRfbmZiOwotCXUzMiBwaW52OwotCXN1c2Vjb25kc190IHJfc2FtcGxlLCB0X2VsYXBzZWQ7CisJdTMyIHBpbnYsIHJfc2FtcGxlOwogCiAJQlVHX09OKGhjdHggPT0gTlVMTCk7CiAKQEAgLTQ0NSwxOCArNDY3LDEwIEBACiAJCSAqIENhbGN1bGF0ZSBuZXcgcm91bmQgdHJpcCBzYW1wbGUgYXMgcGVyIFtSRkMgMzQ0OCwgNC4zXSBieQogCQkgKglSX3NhbXBsZSAgPSAgKG5vdyAtIHRfcmVjdmRhdGEpIC0gdF9lbGFwc2VkCiAJCSAqLwotCQlyX3NhbXBsZSAgPSB0aW1ldmFsX2RlbHRhKCZub3csICZwYWNrZXQtPmRjY3BodHhfdHN0YW1wKTsKLQkJdF9lbGFwc2VkID0gZHAtPmRjY3BzX29wdGlvbnNfcmVjZWl2ZWQuZGNjcG9yX2VsYXBzZWRfdGltZSAqIDEwOworCQlyX3NhbXBsZSA9IGRjY3Bfc2FtcGxlX3J0dChzaywgJm5vdywgJnBhY2tldC0+ZGNjcGh0eF90c3RhbXApOwogCi0JCURDQ1BfQlVHX09OKHJfc2FtcGxlIDwgMCk7Ci0JCWlmICh1bmxpa2VseShyX3NhbXBsZSA8PSB0X2VsYXBzZWQpKQotCQkJRENDUF9XQVJOKCJXQVJOSU5HOiByX3NhbXBsZT0lZHVzIDw9IHRfZWxhcHNlZD0lZHVzXG4iLAotCQkJCSAgKGludClyX3NhbXBsZSwgKGludCl0X2VsYXBzZWQpOwotCQllbHNlCi0JCQlyX3NhbXBsZSAtPSB0X2VsYXBzZWQ7Ci0JCUNDSUQzX1JUVF9TQU5JVFlfQ0hFQ0socl9zYW1wbGUpOwotCi0JCS8qIFVwZGF0ZSBSVFQgZXN0aW1hdGUgYnkKKwkJLyoKKwkJICogVXBkYXRlIFJUVCBlc3RpbWF0ZSBieQogCQkgKiBJZiAoTm8gZmVlZGJhY2sgcmVjdikKIAkJICogICAgUiA9IFJfc2FtcGxlOwogCQkgKiBFbHNlCkBAIC00NjcsMjcgKzQ4MSwyMyBAQAogCQlpZiAoaGN0eC0+Y2NpZDNoY3R4X3N0YXRlID09IFRGUkNfU1NUQVRFX05PX0ZCQUNLKSB7CiAJCQkvKgogCQkJICogTGFyZ2VyIEluaXRpYWwgV2luZG93cyBbUkZDIDQzNDIsIHNlYy4gNV0KLQkJCSAqIFdlIGRldmlhdGUgaW4gdGhhdCB3ZSB1c2UgYHMnIGluc3RlYWQgb2YgYE1TUycuCiAJCQkgKi8KLQkJCV9fdTY0IHdfaW5pdCA9IG1pbig0ICogaGN0eC0+Y2NpZDNoY3R4X3MsCi0JCQkJCSAgIG1heCgyICogaGN0eC0+Y2NpZDNoY3R4X3MsIDQzODApKTsKIAkJCWhjdHgtPmNjaWQzaGN0eF9ydHQgID0gcl9zYW1wbGU7Ci0JCQloY3R4LT5jY2lkM2hjdHhfeCAgICA9IHNjYWxlZF9kaXYod19pbml0IDw8IDYsIHJfc2FtcGxlKTsKKwkJCWhjdHgtPmNjaWQzaGN0eF94ICAgID0gcmZjMzM5MF9pbml0aWFsX3JhdGUoc2spOwogCQkJaGN0eC0+Y2NpZDNoY3R4X3RfbGQgPSBub3c7CiAKLQkJCWNjaWQzX3VwZGF0ZV9zZW5kX3RpbWUoaGN0eCk7CisJCQljY2lkM191cGRhdGVfc2VuZF9pbnRlcnZhbChoY3R4KTsKIAotCQkJY2NpZDNfcHJfZGVidWcoIiVzKCVwKSwgcz0ldSwgd19pbml0PSVsbHUsICIKLQkJCQkgICAgICAgIlJfc2FtcGxlPSVkdXMsIFg9JXVcbiIsIGRjY3Bfcm9sZShzayksCisJCQljY2lkM19wcl9kZWJ1ZygiJXMoJXApLCBzPSV1LCBNU1M9JXUsICIKKwkJCQkgICAgICAgIlJfc2FtcGxlPSV1dXMsIFg9JXVcbiIsIGRjY3Bfcm9sZShzayksCiAJCQkJICAgICAgIHNrLCBoY3R4LT5jY2lkM2hjdHhfcywKLQkJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyl3X2luaXQsCi0JCQkJICAgICAgIChpbnQpcl9zYW1wbGUsCisJCQkJICAgICAgIGRwLT5kY2Nwc19tc3NfY2FjaGUsIHJfc2FtcGxlLAogCQkJCSAgICAgICAodW5zaWduZWQpKGhjdHgtPmNjaWQzaGN0eF94ID4+IDYpKTsKIAogCQkJY2NpZDNfaGNfdHhfc2V0X3N0YXRlKHNrLCBURlJDX1NTVEFURV9GQkFDSyk7CiAJCX0gZWxzZSB7CiAJCQloY3R4LT5jY2lkM2hjdHhfcnR0ID0gKDkgKiBoY3R4LT5jY2lkM2hjdHhfcnR0ICsKLQkJCQkJCSAgICh1MzIpcl9zYW1wbGUpIC8gMTA7CisJCQkJCQkgICByX3NhbXBsZSkgLyAxMDsKIAogCQkJLyogVXBkYXRlIHNlbmRpbmcgcmF0ZSAoc3RlcCA0IG9mIFtSRkMgMzQ0OCwgNC4zXSkgKi8KIAkJCWlmIChoY3R4LT5jY2lkM2hjdHhfcCA+IDApCkBAIC00OTcsMTAgKzUwNywxMCBAQAogCQkJCQkJICAgIGhjdHgtPmNjaWQzaGN0eF9wKTsKIAkJCWNjaWQzX2hjX3R4X3VwZGF0ZV94KHNrLCAmbm93KTsKIAotCQkJY2NpZDNfcHJfZGVidWcoIiVzKCVwKSwgUlRUPSV1dXMgKHNhbXBsZT0lZHVzKSwgcz0ldSwgIgorCQkJY2NpZDNfcHJfZGVidWcoIiVzKCVwKSwgUlRUPSV1dXMgKHNhbXBsZT0ldXVzKSwgcz0ldSwgIgogCQkJCSAgICAgICAicD0ldSwgWF9jYWxjPSV1LCBYX3JlY3Y9JXUsIFg9JXVcbiIsCiAJCQkJICAgICAgIGRjY3Bfcm9sZShzayksCi0JCQkJICAgICAgIHNrLCBoY3R4LT5jY2lkM2hjdHhfcnR0LCAoaW50KXJfc2FtcGxlLAorCQkJCSAgICAgICBzaywgaGN0eC0+Y2NpZDNoY3R4X3J0dCwgcl9zYW1wbGUsCiAJCQkJICAgICAgIGhjdHgtPmNjaWQzaGN0eF9zLCBoY3R4LT5jY2lkM2hjdHhfcCwKIAkJCQkgICAgICAgaGN0eC0+Y2NpZDNoY3R4X3hfY2FsYywKIAkJCQkgICAgICAgKHVuc2lnbmVkKShoY3R4LT5jY2lkM2hjdHhfeF9yZWN2ID4+IDYpLApAQCAtNjQ0LDEwICs2NTQsNTAgQEAKIAlkY2NwX3R4X2hpc3RfcHVyZ2UoY2NpZDNfdHhfaGlzdCwgJmhjdHgtPmNjaWQzaGN0eF9oaXN0KTsKIH0KIAotLyoKLSAqIFJYIEhhbGYgQ29ubmVjdGlvbiBtZXRob2RzCi0gKi8KK3N0YXRpYyB2b2lkIGNjaWQzX2hjX3R4X2dldF9pbmZvKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHRjcF9pbmZvICppbmZvKQoreworCWNvbnN0IHN0cnVjdCBjY2lkM19oY190eF9zb2NrICpoY3R4ID0gY2NpZDNfaGNfdHhfc2soc2spOwogCisJLyogTGlzdGVuIHNvY2tzIGRvZXNuJ3QgaGF2ZSBhIHByaXZhdGUgQ0NJRCBibG9jayAqLworCWlmIChzay0+c2tfc3RhdGUgPT0gRENDUF9MSVNURU4pCisJCXJldHVybjsKKworCUJVR19PTihoY3R4ID09IE5VTEwpOworCisJaW5mby0+dGNwaV9ydG8gPSBoY3R4LT5jY2lkM2hjdHhfdF9ydG87CisJaW5mby0+dGNwaV9ydHQgPSBoY3R4LT5jY2lkM2hjdHhfcnR0OworfQorCitzdGF0aWMgaW50IGNjaWQzX2hjX3R4X2dldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBjb25zdCBpbnQgb3B0bmFtZSwgaW50IGxlbiwKKwkJCQkgIHUzMiBfX3VzZXIgKm9wdHZhbCwgaW50IF9fdXNlciAqb3B0bGVuKQoreworCWNvbnN0IHN0cnVjdCBjY2lkM19oY190eF9zb2NrICpoY3R4ID0gY2NpZDNfaGNfdHhfc2soc2spOworCWNvbnN0IHZvaWQgKnZhbDsKKworCS8qIExpc3RlbiBzb2NrcyBkb2Vzbid0IGhhdmUgYSBwcml2YXRlIENDSUQgYmxvY2sgKi8KKwlpZiAoc2stPnNrX3N0YXRlID09IERDQ1BfTElTVEVOKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaCAob3B0bmFtZSkgeworCWNhc2UgRENDUF9TT0NLT1BUX0NDSURfVFhfSU5GTzoKKwkJaWYgKGxlbiA8IHNpemVvZihoY3R4LT5jY2lkM2hjdHhfdGZyYykpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJbGVuID0gc2l6ZW9mKGhjdHgtPmNjaWQzaGN0eF90ZnJjKTsKKwkJdmFsID0gJmhjdHgtPmNjaWQzaGN0eF90ZnJjOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT1BST1RPT1BUOworCX0KKworCWlmIChwdXRfdXNlcihsZW4sIG9wdGxlbikgfHwgY29weV90b191c2VyKG9wdHZhbCwgdmFsLCBsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiAwOworfQorCisvKgorICoJUmVjZWl2ZXIgSGFsZi1Db25uZWN0aW9uIFJvdXRpbmVzCisgKi8KICNpZmRlZiBDT05GSUdfSVBfRENDUF9DQ0lEM19ERUJVRwogc3RhdGljIGNvbnN0IGNoYXIgKmNjaWQzX3J4X3N0YXRlX25hbWUoZW51bSBjY2lkM19oY19yeF9zdGF0ZXMgc3RhdGUpCiB7CkBAIC05NzcsOCArMTAyNyw3IEBACiAJY29uc3Qgc3RydWN0IGRjY3Bfb3B0aW9uc19yZWNlaXZlZCAqb3B0X3JlY3Y7CiAJc3RydWN0IGRjY3BfcnhfaGlzdF9lbnRyeSAqcGFja2V0OwogCXN0cnVjdCB0aW1ldmFsIG5vdzsKLQl1MzIgcF9wcmV2LCBydHRfcHJldjsKLQlzdXNlY29uZHNfdCByX3NhbXBsZSwgdF9lbGFwc2VkOworCXUzMiBwX3ByZXYsIHJfc2FtcGxlLCBydHRfcHJldjsKIAlpbnQgbG9zcywgcGF5bG9hZF9zaXplOwogCiAJQlVHX09OKGhjcnggPT0gTlVMTCk7CkBAIC05OTQsMTcgKzEwNDMsNyBAQAogCQkJYnJlYWs7CiAJCXJ0dF9wcmV2ID0gaGNyeC0+Y2NpZDNoY3J4X3J0dDsKIAkJZGNjcF90aW1lc3RhbXAoc2ssICZub3cpOwotCQl0aW1ldmFsX3N1Yl91c2Vjcygmbm93LCBvcHRfcmVjdi0+ZGNjcG9yX3RpbWVzdGFtcF9lY2hvICogMTApOwotCQlyX3NhbXBsZSA9IHRpbWV2YWxfdXNlY3MoJm5vdyk7Ci0JCXRfZWxhcHNlZCA9IG9wdF9yZWN2LT5kY2Nwb3JfZWxhcHNlZF90aW1lICogMTA7Ci0KLQkJRENDUF9CVUdfT04ocl9zYW1wbGUgPCAwKTsKLQkJaWYgKHVubGlrZWx5KHJfc2FtcGxlIDw9IHRfZWxhcHNlZCkpCi0JCQlEQ0NQX1dBUk4oInJfc2FtcGxlPSVsZHVzLCB0X2VsYXBzZWQ9JWxkdXNcbiIsCi0JCQkJICAobG9uZylyX3NhbXBsZSwgKGxvbmcpdF9lbGFwc2VkKTsKLQkJZWxzZQotCQkJcl9zYW1wbGUgLT0gdF9lbGFwc2VkOwotCQlDQ0lEM19SVFRfU0FOSVRZX0NIRUNLKHJfc2FtcGxlKTsKKwkJcl9zYW1wbGUgPSBkY2NwX3NhbXBsZV9ydHQoc2ssICZub3csIE5VTEwpOwogCiAJCWlmIChoY3J4LT5jY2lkM2hjcnhfc3RhdGUgPT0gVEZSQ19SU1RBVEVfTk9fREFUQSkKIAkJCWhjcngtPmNjaWQzaGNyeF9ydHQgPSByX3NhbXBsZTsKQEAgLTExMzIsMjAgKzExNzEsNiBAQAogCWluZm8tPnRjcGlfcmN2X3J0dCAgPSBoY3J4LT5jY2lkM2hjcnhfcnR0OwogfQogCi1zdGF0aWMgdm9pZCBjY2lkM19oY190eF9nZXRfaW5mbyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCB0Y3BfaW5mbyAqaW5mbykKLXsKLQljb25zdCBzdHJ1Y3QgY2NpZDNfaGNfdHhfc29jayAqaGN0eCA9IGNjaWQzX2hjX3R4X3NrKHNrKTsKLQotCS8qIExpc3RlbiBzb2NrcyBkb2Vzbid0IGhhdmUgYSBwcml2YXRlIENDSUQgYmxvY2sgKi8KLQlpZiAoc2stPnNrX3N0YXRlID09IERDQ1BfTElTVEVOKQotCQlyZXR1cm47Ci0KLQlCVUdfT04oaGN0eCA9PSBOVUxMKTsKLQotCWluZm8tPnRjcGlfcnRvID0gaGN0eC0+Y2NpZDNoY3R4X3RfcnRvOwotCWluZm8tPnRjcGlfcnR0ID0gaGN0eC0+Y2NpZDNoY3R4X3J0dDsKLX0KLQogc3RhdGljIGludCBjY2lkM19oY19yeF9nZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgY29uc3QgaW50IG9wdG5hbWUsIGludCBsZW4sCiAJCQkJICB1MzIgX191c2VyICpvcHR2YWwsIGludCBfX3VzZXIgKm9wdGxlbikKIHsKQEAgLTExNzMsMzMgKzExOTgsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGNjaWQzX2hjX3R4X2dldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBjb25zdCBpbnQgb3B0bmFtZSwgaW50IGxlbiwKLQkJCQkgIHUzMiBfX3VzZXIgKm9wdHZhbCwgaW50IF9fdXNlciAqb3B0bGVuKQotewotCWNvbnN0IHN0cnVjdCBjY2lkM19oY190eF9zb2NrICpoY3R4ID0gY2NpZDNfaGNfdHhfc2soc2spOwotCWNvbnN0IHZvaWQgKnZhbDsKLQotCS8qIExpc3RlbiBzb2NrcyBkb2Vzbid0IGhhdmUgYSBwcml2YXRlIENDSUQgYmxvY2sgKi8KLQlpZiAoc2stPnNrX3N0YXRlID09IERDQ1BfTElTVEVOKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXN3aXRjaCAob3B0bmFtZSkgewotCWNhc2UgRENDUF9TT0NLT1BUX0NDSURfVFhfSU5GTzoKLQkJaWYgKGxlbiA8IHNpemVvZihoY3R4LT5jY2lkM2hjdHhfdGZyYykpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJbGVuID0gc2l6ZW9mKGhjdHgtPmNjaWQzaGN0eF90ZnJjKTsKLQkJdmFsID0gJmhjdHgtPmNjaWQzaGN0eF90ZnJjOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVOT1BST1RPT1BUOwotCX0KLQotCWlmIChwdXRfdXNlcihsZW4sIG9wdGxlbikgfHwgY29weV90b191c2VyKG9wdHZhbCwgdmFsLCBsZW4pKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgc3RydWN0IGNjaWRfb3BlcmF0aW9ucyBjY2lkMyA9IHsKIAkuY2NpZF9pZAkJICAgPSBEQ0NQQ19DQ0lEMywKIAkuY2NpZF9uYW1lCQkgICA9ICJjY2lkMyIsCmRpZmYgLS1naXQgYS9uZXQvZGNjcC9jY2lkcy9jY2lkMy5oIGIvbmV0L2RjY3AvY2NpZHMvY2NpZDMuaAppbmRleCAxNTc3NmE4Li44ZDMxYjM4IDEwMDY0NAotLS0gYS9uZXQvZGNjcC9jY2lkcy9jY2lkMy5oCisrKyBiL25ldC9kY2NwL2NjaWRzL2NjaWQzLmgKQEAgLTUxLDE2ICs1MSw2IEBACiAvKiBQYXJhbWV0ZXIgdF9tYmkgZnJvbSBbUkZDIDM0NDgsIDQuM106IGJhY2tvZmYgaW50ZXJ2YWwgaW4gc2Vjb25kcyAqLwogI2RlZmluZSBURlJDX1RfTUJJCQkgICA2NAogCi0vKiBXaGF0IHdlIHRoaW5rIGlzIGEgcmVhc29uYWJsZSB1cHBlciBsaW1pdCBvbiBSVFQgdmFsdWVzICovCi0jZGVmaW5lIENDSUQzX1NBTkVfUlRUX01BWAkgICAoKHN1c2Vjb25kc190KSg0ICogVVNFQ19QRVJfU0VDKSkKLQotI2RlZmluZSBDQ0lEM19SVFRfU0FOSVRZX0NIRUNLKHJ0dCkgCQkJZG8gewkJICAgXAotCQlpZiAocnR0ID4gQ0NJRDNfU0FORV9SVFRfTUFYKSB7CQkJCSAgIFwKLQkJCURDQ1BfQ1JJVCgiUlRUICglZCkgdG9vIGxhcmdlLCBzdWJzdGl0dXRpbmcgJWQiLCAgIFwKLQkJCQkgIChpbnQpcnR0LCAoaW50KUNDSUQzX1NBTkVfUlRUX01BWCk7CSAgIFwKLQkJCXJ0dCA9IENDSUQzX1NBTkVfUlRUX01BWDsJCQkgICBcCi0JCX0gCQkJCQl9IHdoaWxlICgwKQotCiBlbnVtIGNjaWQzX29wdGlvbnMgewogCVRGUkNfT1BUX0xPU1NfRVZFTlRfUkFURSA9IDE5MiwKIAlURlJDX09QVF9MT1NTX0lOVEVSVkFMUwkgPSAxOTMsCmRpZmYgLS1naXQgYS9uZXQvZGNjcC9jY2lkcy9saWIvbG9zc19pbnRlcnZhbC5jIGIvbmV0L2RjY3AvY2NpZHMvbGliL2xvc3NfaW50ZXJ2YWwuYwppbmRleCAwYTBiYWVmLi4zNzJkN2U3IDEwMDY0NAotLS0gYS9uZXQvZGNjcC9jY2lkcy9saWIvbG9zc19pbnRlcnZhbC5jCisrKyBiL25ldC9kY2NwL2NjaWRzL2xpYi9sb3NzX2ludGVydmFsLmMKQEAgLTkxLDcgKzkxLDcgQEAKIAl1MzIgd190b3QgID0gMDsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShsaV9lbnRyeSwgbGlfbmV4dCwgbGlzdCwgZGNjcGxpaF9ub2RlKSB7Ci0JCWlmIChsaV9lbnRyeS0+ZGNjcGxpaF9pbnRlcnZhbCAhPSB+MCkgeworCQlpZiAobGlfZW50cnktPmRjY3BsaWhfaW50ZXJ2YWwgIT0gfjBVKSB7CiAJCQlpX3RvdDAgKz0gbGlfZW50cnktPmRjY3BsaWhfaW50ZXJ2YWwgKiBkY2NwX2xpX2hpc3Rfd1tpXTsKIAkJCXdfdG90ICArPSBkY2NwX2xpX2hpc3Rfd1tpXTsKIAkJCWlmIChpICE9IDApCmRpZmYgLS1naXQgYS9uZXQvZGNjcC9kY2NwLmggYi9uZXQvZGNjcC9kY2NwLmgKaW5kZXggZTMzYTllZC4uZDhhZDI3YiAxMDA2NDQKLS0tIGEvbmV0L2RjY3AvZGNjcC5oCisrKyBiL25ldC9kY2NwL2RjY3AuaApAQCAtMzEsMTMgKzMxLDkgQEAKIAkJCQkJICAgICAgX19zdHJpbmdpZnkoY29uZCkpOyAgICAgICAgICBcCiAJCQkgICAgIH0gd2hpbGUgKDApCiAKLSNpZmRlZiBNT0RVTEUKICNkZWZpbmUgRENDUF9QUklOVEsoZW5hYmxlLCBmbXQsIGFyZ3MuLi4pCWRvIHsgaWYgKGVuYWJsZSkJICAgICBcCiAJCQkJCQkJcHJpbnRrKGZtdCwgIyNhcmdzKTsgXAogCQkJCQkJfSB3aGlsZSgwKQotI2Vsc2UKLSNkZWZpbmUgRENDUF9QUklOVEsoZW5hYmxlLCBmbXQsIGFyZ3MuLi4pCXByaW50ayhmbXQsICMjYXJncykKLSNlbmRpZgogI2RlZmluZSBEQ0NQX1BSX0RFQlVHKGVuYWJsZSwgZm10LCBhLi4uKQlEQ0NQX1BSSU5USyhlbmFibGUsIEtFUk5fREVCVUcgXAogCQkJCQkJICAiJXM6ICIgZm10LCBfX0ZVTkNUSU9OX18sICMjYSkKIApAQCAtNzUsMTEgKzcxLDE1IEBACiAvKiBSRkMgMTEyMiwgNC4yLjMuMSBpbml0aWFsIFJUTyB2YWx1ZSAqLwogI2RlZmluZSBEQ0NQX1RJTUVPVVRfSU5JVCAoKHVuc2lnbmVkKSgzICogSFopKQogCisjZGVmaW5lIERDQ1BfUlRPX01BWCAoKHVuc2lnbmVkKSgxMjAgKiBIWikpIC8qIEZJWE1FOiB1c2luZyBUQ1AgdmFsdWUgKi8KKworLyogYm91bmRzIGZvciBzYW1wbGVkIFJUVCB2YWx1ZXMgZnJvbSBwYWNrZXQgZXhjaGFuZ2VzIChpbiB1c2VjKSAqLworI2RlZmluZSBEQ0NQX1NBTkVfUlRUX01JTgkxMDAKKyNkZWZpbmUgRENDUF9TQU5FX1JUVF9NQVgJKDQgKiBVU0VDX1BFUl9TRUMpCisKIC8qIE1heGltYWwgaW50ZXJ2YWwgYmV0d2VlbiBwcm9iZXMgZm9yIGxvY2FsIHJlc291cmNlcy4gICovCiAjZGVmaW5lIERDQ1BfUkVTT1VSQ0VfUFJPQkVfSU5URVJWQUwgKCh1bnNpZ25lZCkoSFogLyAyVSkpCiAKLSNkZWZpbmUgRENDUF9SVE9fTUFYICgodW5zaWduZWQpKDEyMCAqIEhaKSkgLyogRklYTUU6IHVzaW5nIFRDUCB2YWx1ZSAqLwotCiAvKiBzeXNjdGwgdmFyaWFibGVzIGZvciBEQ0NQICovCiBleHRlcm4gaW50ICBzeXNjdGxfZGNjcF9yZXF1ZXN0X3JldHJpZXM7CiBleHRlcm4gaW50ICBzeXNjdGxfZGNjcF9yZXRyaWVzMTsKQEAgLTkyLDE3ICs5Miw0MyBAQAogZXh0ZXJuIGludCAgc3lzY3RsX2RjY3BfZmVhdF9zZW5kX25kcF9jb3VudDsKIGV4dGVybiBpbnQgIHN5c2N0bF9kY2NwX3R4X3FsZW47CiAKKy8qCisgKgk0OC1iaXQgc2VxdWVuY2UgbnVtYmVyIGFyaXRobWV0aWMgKHNpZ25lZCBhbmQgdW5zaWduZWQpCisgKi8KKyNkZWZpbmUgSU5UNDhfTUlOCSAgMHg4MDAwMDAwMDAwMDBMTAkJLyogMl40NwkgICAgKi8KKyNkZWZpbmUgVUlOVDQ4X01BWAkgIDB4RkZGRkZGRkZGRkZGTEwJCS8qIDJeNDggLSAxICovCisjZGVmaW5lIENPTVBMRU1FTlQ0OCh4KQkgKDB4MTAwMDAwMDAwMDAwMExMIC0gKHgpKQkvKiAyXjQ4IC0geCAqLworI2RlZmluZSBUT19TSUdORUQ0OCh4KQkgKCgoeCkgPCBJTlQ0OF9NSU4pPyAoeCkgOiAtQ09NUExFTUVOVDQ4KCAoeCkpKQorI2RlZmluZSBUT19VTlNJR05FRDQ4KHgpICgoKHgpID49IDApPwkgICAgICh4KSA6ICBDT01QTEVNRU5UNDgoLSh4KSkpCisjZGVmaW5lIEFERDQ4KGEsIGIpCSAoKChhKSArIChiKSkgJiBVSU5UNDhfTUFYKQorI2RlZmluZSBTVUI0OChhLCBiKQkgQURENDgoKGEpLCBDT01QTEVNRU5UNDgoYikpCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkY2NwX3NldF9zZXFubyh1NjQgKnNlcW5vLCB1NjQgdmFsdWUpCit7CisJKnNlcW5vID0gdmFsdWUgJiBVSU5UNDhfTUFYOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZGNjcF9pbmNfc2Vxbm8odTY0ICpzZXFubykKK3sKKwkqc2Vxbm8gPSBBREQ0OCgqc2Vxbm8sIDEpOworfQorCisvKiBzaWduZWQgbW9kLTJeNDggZGlzdGFuY2U6IHBvcy4gaWYgc2Vxbm8xIDwgc2Vxbm8yLCBuZWcuIGlmIHNlcW5vMSA+IHNlcW5vMiAqLworc3RhdGljIGlubGluZSBzNjQgZGNjcF9kZWx0YV9zZXFubyhjb25zdCB1NjQgc2Vxbm8xLCBjb25zdCB1NjQgc2Vxbm8yKQoreworCXU2NCBkZWx0YSA9IFNVQjQ4KHNlcW5vMiwgc2Vxbm8xKTsKKworCXJldHVybiBUT19TSUdORUQ0OChkZWx0YSk7Cit9CisKIC8qIGlzIHNlcTEgPCBzZXEyID8gKi8KIHN0YXRpYyBpbmxpbmUgaW50IGJlZm9yZTQ4KGNvbnN0IHU2NCBzZXExLCBjb25zdCB1NjQgc2VxMikKIHsKLQlyZXR1cm4gKHM2NCkoKHNlcTEgPDwgMTYpIC0gKHNlcTIgPDwgMTYpKSA8IDA7CisJcmV0dXJuIChzNjQpKChzZXEyIDw8IDE2KSAtIChzZXExIDw8IDE2KSkgPiAwOwogfQogCiAvKiBpcyBzZXExID4gc2VxMiA/ICovCi1zdGF0aWMgaW5saW5lIGludCBhZnRlcjQ4KGNvbnN0IHU2NCBzZXExLCBjb25zdCB1NjQgc2VxMikKLXsKLQlyZXR1cm4gKHM2NCkoKHNlcTIgPDwgMTYpIC0gKHNlcTEgPDwgMTYpKSA8IDA7Ci19CisjZGVmaW5lIGFmdGVyNDgoc2VxMSwgc2VxMikJYmVmb3JlNDgoc2VxMiwgc2VxMSkKIAogLyogaXMgc2VxMiA8PSBzZXExIDw9IHNlcTMgPyAqLwogc3RhdGljIGlubGluZSBpbnQgYmV0d2VlbjQ4KGNvbnN0IHU2NCBzZXExLCBjb25zdCB1NjQgc2VxMiwgY29uc3QgdTY0IHNlcTMpCkBAIC0xMTgsOSArMTQ0LDcgQEAKIC8qIGlzIHNlcTEgbmV4dCBzZXFubyBhZnRlciBzZXEyICovCiBzdGF0aWMgaW5saW5lIGludCBmb2xsb3dzNDgoY29uc3QgdTY0IHNlcTEsIGNvbnN0IHU2NCBzZXEyKQogewotCWludCBkaWZmID0gKHNlcTEgJiAweEZGRkYpIC0gKHNlcTIgJiAweEZGRkYpOwotCi0JcmV0dXJuIGRpZmY9PTE7CisJcmV0dXJuIGRjY3BfZGVsdGFfc2Vxbm8oc2VxMiwgc2VxMSkgPT0gMTsKIH0KIAogZW51bSB7CkBAIC0yNzIsNiArMjk2LDggQEAKIGV4dGVybiBpbnQJICAgZGNjcF9zZW5kX3Jlc2V0KHN0cnVjdCBzb2NrICpzaywgZW51bSBkY2NwX3Jlc2V0X2NvZGVzIGNvZGUpOwogZXh0ZXJuIHZvaWQJICAgZGNjcF9zZW5kX2Nsb3NlKHN0cnVjdCBzb2NrICpzaywgY29uc3QgaW50IGFjdGl2ZSk7CiBleHRlcm4gaW50CSAgIGRjY3BfaW52YWxpZF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYik7CitleHRlcm4gdTMyCSAgIGRjY3Bfc2FtcGxlX3J0dChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCB0aW1ldmFsICp0X3JlY3YsCisJCQkJCQkgICAgc3RydWN0IHRpbWV2YWwgKnRfaGlzdG9yeSk7CiAKIHN0YXRpYyBpbmxpbmUgaW50IGRjY3BfYmFkX3NlcnZpY2VfY29kZShjb25zdCBzdHJ1Y3Qgc29jayAqc2ssCiAJCQkJCWNvbnN0IF9fYmUzMiBzZXJ2aWNlKQpAQCAtMzEzLDI2ICszMzksNyBAQAogCXJldHVybiB0eXBlID09IERDQ1BfUEtUX0RBVEEgfHwgdHlwZSA9PSBEQ0NQX1BLVF9SRVFVRVNUOwogfQogCi0jZGVmaW5lIERDQ1BfTUFYX1NFUU5PICgoKCh1NjQpMSkgPDwgNDgpIC0gMSkKLSNkZWZpbmUgRENDUF9QS1RfV0lUSE9VVF9BQ0tfU0VRIChEQ0NQX01BWF9TRVFOTyA8PCAyKQotCi1zdGF0aWMgaW5saW5lIHZvaWQgZGNjcF9zZXRfc2Vxbm8odTY0ICpzZXFubywgdTY0IHZhbHVlKQotewotCWlmICh2YWx1ZSA+IERDQ1BfTUFYX1NFUU5PKQotCQl2YWx1ZSAtPSBEQ0NQX01BWF9TRVFOTyArIDE7Ci0JKnNlcW5vID0gdmFsdWU7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdTY0IGRjY3BfZGVsdGFfc2Vxbm8odTY0IHNlcW5vMSwgdTY0IHNlcW5vMikKLXsKLQlyZXR1cm4gKChzZXFubzIgPDwgMTYpIC0gKHNlcW5vMSA8PCAxNikpID4+IDE2OwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgZGNjcF9pbmNfc2Vxbm8odTY0ICpzZXFubykKLXsKLQlpZiAoKysqc2Vxbm8gPiBEQ0NQX01BWF9TRVFOTykKLQkJKnNlcW5vID0gMDsKLX0KKyNkZWZpbmUgRENDUF9QS1RfV0lUSE9VVF9BQ0tfU0VRIChVSU5UNDhfTUFYIDw8IDIpCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBkY2NwX2hkcl9zZXRfc2VxKHN0cnVjdCBkY2NwX2hkciAqZGgsIGNvbnN0IHU2NCBnc3MpCiB7CmRpZmYgLS1naXQgYS9uZXQvZGNjcC9pbnB1dC5jIGIvbmV0L2RjY3AvaW5wdXQuYwppbmRleCA3OGIwNDNjLi5kYTZlYzE4IDEwMDY0NAotLS0gYS9uZXQvZGNjcC9pbnB1dC5jCisrKyBiL25ldC9kY2NwL2lucHV0LmMKQEAgLTg2LDcgKzg2LDggQEAKIAkgICAgZGgtPmRjY3BoX3R5cGUgPT0gRENDUF9QS1RfU1lOQ0FDSykgewogCQlpZiAoYmV0d2VlbjQ4KERDQ1BfU0tCX0NCKHNrYiktPmRjY3BkX2Fja19zZXEsCiAJCQkgICAgICBkcC0+ZGNjcHNfYXdsLCBkcC0+ZGNjcHNfYXdoKSAmJgotCQkgICAgIWJlZm9yZTQ4KERDQ1BfU0tCX0NCKHNrYiktPmRjY3BkX3NlcSwgZHAtPmRjY3BzX3N3bCkpCisJCSAgICBkY2NwX2RlbHRhX3NlcW5vKGRwLT5kY2Nwc19zd2wsCisJCQkJICAgICBEQ0NQX1NLQl9DQihza2IpLT5kY2NwZF9zZXEpID49IDApCiAJCQlkY2NwX3VwZGF0ZV9nc3Ioc2ssIERDQ1BfU0tCX0NCKHNrYiktPmRjY3BkX3NlcSk7CiAJCWVsc2UKIAkJCXJldHVybiAtMTsKQEAgLTIwMyw3ICsyMDQsOCBAQAogCQlpZiAoZHAtPmRjY3BzX3JvbGUgIT0gRENDUF9ST0xFX0NMSUVOVCkKIAkJCWdvdG8gc2VuZF9zeW5jOwogY2hlY2tfc2VxOgotCQlpZiAoIWJlZm9yZTQ4KERDQ1BfU0tCX0NCKHNrYiktPmRjY3BkX3NlcSwgZHAtPmRjY3BzX29zcikpIHsKKwkJaWYgKGRjY3BfZGVsdGFfc2Vxbm8oZHAtPmRjY3BzX29zciwKKwkJCQkgICAgIERDQ1BfU0tCX0NCKHNrYiktPmRjY3BkX3NlcSkgPj0gMCkgewogc2VuZF9zeW5jOgogCQkJZGNjcF9zZW5kX3N5bmMoc2ssIERDQ1BfU0tCX0NCKHNrYiktPmRjY3BkX3NlcSwKIAkJCQkgICAgICAgRENDUF9QS1RfU1lOQyk7CkBAIC0yOTgsNiArMzAwLDE0IEBACiAJCWlmIChkY2NwX3BhcnNlX29wdGlvbnMoc2ssIHNrYikpCiAJCQlnb3RvIG91dF9pbnZhbGlkX3BhY2tldDsKIAorCQkvKiBPYnRhaW4gUlRUIHNhbXBsZSBmcm9tIFNZTiBleGNoYW5nZSAodXNlZCBieSBDQ0lEIDMpICovCisJCWlmIChkcC0+ZGNjcHNfb3B0aW9uc19yZWNlaXZlZC5kY2Nwb3JfdGltZXN0YW1wX2VjaG8pIHsKKwkJCXN0cnVjdCB0aW1ldmFsIG5vdzsKKworCQkJZGNjcF90aW1lc3RhbXAoc2ssICZub3cpOworCQkJZHAtPmRjY3BzX3N5bl9ydHQgPSBkY2NwX3NhbXBsZV9ydHQoc2ssICZub3csIE5VTEwpOworCQl9CisKIAkJaWYgKGRjY3BfbXNrKHNrKS0+ZGNjcG1zX3NlbmRfYWNrX3ZlY3RvciAmJgogCQkgICAgZGNjcF9hY2t2ZWNfYWRkKGRwLT5kY2Nwc19oY19yeF9hY2t2ZWMsIHNrLAogCQkJCSAgICBEQ0NQX1NLQl9DQihza2IpLT5kY2NwZF9zZXEsCkBAIC01NzUsMyArNTg1LDQzIEBACiB9CiAKIEVYUE9SVF9TWU1CT0xfR1BMKGRjY3BfcmN2X3N0YXRlX3Byb2Nlc3MpOworCisvKioKKyAqIGRjY3Bfc2FtcGxlX3J0dCAgLSAgU2FtcGxlIFJUVCBmcm9tIHBhY2tldCBleGNoYW5nZQorICoKKyAqIEBzazogICAgIGNvbm5lY3RlZCBkY2NwX3NvY2sKKyAqIEB0X3JlY3Y6IHJlY2VpdmUgdGltZXN0YW1wIG9mIHBhY2tldCB3aXRoIHRpbWVzdGFtcCBlY2hvCisgKiBAdF9oaXN0OiBwYWNrZXQgaGlzdG9yeSB0aW1lc3RhbXAgb3IgTlVMTAorICovCit1MzIgZGNjcF9zYW1wbGVfcnR0KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHRpbWV2YWwgKnRfcmVjdiwKKwkJCQkgICAgIHN0cnVjdCB0aW1ldmFsICp0X2hpc3QpCit7CisJc3RydWN0IGRjY3Bfc29jayAqZHAgPSBkY2NwX3NrKHNrKTsKKwlzdHJ1Y3QgZGNjcF9vcHRpb25zX3JlY2VpdmVkICpvciA9ICZkcC0+ZGNjcHNfb3B0aW9uc19yZWNlaXZlZDsKKwlzdXNlY29uZHNfdCBkZWx0YTsKKworCWlmICh0X2hpc3QgPT0gTlVMTCkgeworCQlpZiAoIW9yLT5kY2Nwb3JfdGltZXN0YW1wX2VjaG8pIHsKKwkJCURDQ1BfV0FSTigicGFja2V0IHdpdGhvdXQgdGltZXN0YW1wIGVjaG9cbiIpOworCQkJcmV0dXJuIERDQ1BfU0FORV9SVFRfTUFYOworCQl9CisJCXRpbWV2YWxfc3ViX3VzZWNzKHRfcmVjdiwgb3ItPmRjY3Bvcl90aW1lc3RhbXBfZWNobyAqIDEwKTsKKwkJZGVsdGEgPSB0aW1ldmFsX3VzZWNzKHRfcmVjdik7CisJfSBlbHNlCisJCWRlbHRhID0gdGltZXZhbF9kZWx0YSh0X3JlY3YsIHRfaGlzdCk7CisKKwlkZWx0YSAtPSBvci0+ZGNjcG9yX2VsYXBzZWRfdGltZSAqIDEwOwkJLyogZWl0aGVyIHNldCBvciAwICovCisKKwlpZiAodW5saWtlbHkoZGVsdGEgPD0gMCkpIHsKKwkJRENDUF9XQVJOKCJ1bnVzYWJsZSBSVFQgc2FtcGxlICVsZCwgdXNpbmcgbWluXG4iLCAobG9uZylkZWx0YSk7CisJCXJldHVybiBEQ0NQX1NBTkVfUlRUX01JTjsKKwl9CisJaWYgKHVubGlrZWx5KGRlbHRhIC0gKHN1c2Vjb25kc190KURDQ1BfU0FORV9SVFRfTUFYID4gMCkpIHsKKwkJRENDUF9XQVJOKCJSVFQgc2FtcGxlICVsZCB0b28gbGFyZ2UsIHVzaW5nIG1heFxuIiwgKGxvbmcpZGVsdGEpOworCQlyZXR1cm4gRENDUF9TQU5FX1JUVF9NQVg7CisJfQorCisJcmV0dXJuIGRlbHRhOworfQorCitFWFBPUlRfU1lNQk9MX0dQTChkY2NwX3NhbXBsZV9ydHQpOwpkaWZmIC0tZ2l0IGEvbmV0L2RjY3AvaXB2NC5jIGIvbmV0L2RjY3AvaXB2NC5jCmluZGV4IDRhODM5NzguLjcxOGYyZmEgMTAwNjQ0Ci0tLSBhL25ldC9kY2NwL2lwdjQuYworKysgYi9uZXQvZGNjcC9pcHY0LmMKQEAgLTIwNyw4ICsyMDcsOCBAQAogCQkJCQkJCShpcGgtPmlobCA8PCAyKSk7CiAJc3RydWN0IGRjY3Bfc29jayAqZHA7CiAJc3RydWN0IGluZXRfc29jayAqaW5ldDsKLQljb25zdCBpbnQgdHlwZSA9IHNrYi0+aC5pY21waC0+dHlwZTsKLQljb25zdCBpbnQgY29kZSA9IHNrYi0+aC5pY21waC0+Y29kZTsKKwljb25zdCBpbnQgdHlwZSA9IGljbXBfaGRyKHNrYiktPnR5cGU7CisJY29uc3QgaW50IGNvZGUgPSBpY21wX2hkcihza2IpLT5jb2RlOwogCXN0cnVjdCBzb2NrICpzazsKIAlfX3U2NCBzZXE7CiAJaW50IGVycjsKQEAgLTM2Myw4ICszNjMsOCBAQAogCiBzdGF0aWMgaW5saW5lIHU2NCBkY2NwX3Y0X2luaXRfc2VxdWVuY2UoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlyZXR1cm4gc2VjdXJlX2RjY3Bfc2VxdWVuY2VfbnVtYmVyKHNrYi0+bmguaXBoLT5kYWRkciwKLQkJCQkJICAgc2tiLT5uaC5pcGgtPnNhZGRyLAorCXJldHVybiBzZWN1cmVfZGNjcF9zZXF1ZW5jZV9udW1iZXIoaXBfaGRyKHNrYiktPmRhZGRyLAorCQkJCQkgICBpcF9oZHIoc2tiKS0+c2FkZHIsCiAJCQkJCSAgIGRjY3BfaGRyKHNrYiktPmRjY3BoX2Rwb3J0LAogCQkJCQkgICBkY2NwX2hkcihza2IpLT5kY2NwaF9zcG9ydCk7CiB9CkBAIC00MDUsNyArNDA1LDcgQEAKIAluZXdpbmV0LT5vcHQJICAgPSBpcmVxLT5vcHQ7CiAJaXJlcS0+b3B0CSAgID0gTlVMTDsKIAluZXdpbmV0LT5tY19pbmRleCAgPSBpbmV0X2lpZihza2IpOwotCW5ld2luZXQtPm1jX3R0bAkgICA9IHNrYi0+bmguaXBoLT50dGw7CisJbmV3aW5ldC0+bWNfdHRsCSAgID0gaXBfaGRyKHNrYiktPnR0bDsKIAluZXdpbmV0LT5pZAkgICA9IGppZmZpZXM7CiAKIAlkY2NwX3N5bmNfbXNzKG5ld3NrLCBkc3RfbXR1KGRzdCkpOwpAQCAtNDI4LDcgKzQyOCw3IEBACiBzdGF0aWMgc3RydWN0IHNvY2sgKmRjY3BfdjRfaG5kX3JlcShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJY29uc3Qgc3RydWN0IGRjY3BfaGRyICpkaCA9IGRjY3BfaGRyKHNrYik7Ci0JY29uc3Qgc3RydWN0IGlwaGRyICppcGggPSBza2ItPm5oLmlwaDsKKwljb25zdCBzdHJ1Y3QgaXBoZHIgKmlwaCA9IGlwX2hkcihza2IpOwogCXN0cnVjdCBzb2NrICpuc2s7CiAJc3RydWN0IHJlcXVlc3Rfc29jayAqKnByZXY7CiAJLyogRmluZCBwb3NzaWJsZSBjb25uZWN0aW9uIHJlcXVlc3RzLiAqLwpAQCAtNDYwLDggKzQ2MCw4IEBACiAJc3RydWN0IHJ0YWJsZSAqcnQ7CiAJc3RydWN0IGZsb3dpIGZsID0geyAub2lmID0gKChzdHJ1Y3QgcnRhYmxlICopc2tiLT5kc3QpLT5ydF9paWYsCiAJCQkgICAgLm5sX3UgPSB7IC5pcDRfdSA9Ci0JCQkJICAgICAgeyAuZGFkZHIgPSBza2ItPm5oLmlwaC0+c2FkZHIsCi0JCQkJCS5zYWRkciA9IHNrYi0+bmguaXBoLT5kYWRkciwKKwkJCQkgICAgICB7IC5kYWRkciA9IGlwX2hkcihza2IpLT5zYWRkciwKKwkJCQkJLnNhZGRyID0gaXBfaGRyKHNrYiktPmRhZGRyLAogCQkJCQkudG9zID0gUlRfQ09OTl9GTEFHUyhzaykgfSB9LAogCQkJICAgIC5wcm90byA9IHNrLT5za19wcm90b2NvbCwKIAkJCSAgICAudWxpX3UgPSB7IC5wb3J0cyA9CkBAIC01MTMsNiArNTEzLDcgQEAKIHsKIAlpbnQgZXJyOwogCXN0cnVjdCBkY2NwX2hkciAqcnhkaCA9IGRjY3BfaGRyKHJ4c2tiKSwgKmRoOworCWNvbnN0IHN0cnVjdCBpcGhkciAqcnhpcGg7CiAJY29uc3QgaW50IGRjY3BfaGRyX3Jlc2V0X2xlbiA9IHNpemVvZihzdHJ1Y3QgZGNjcF9oZHIpICsKIAkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBkY2NwX2hkcl9leHQpICsKIAkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBkY2NwX2hkcl9yZXNldCk7CkBAIC01NTksMTMgKzU2MCwxMyBAQAogCWRjY3BfaGRyX3NldF9hY2soZGNjcF9oZHJfYWNrX2JpdHMoc2tiKSwgRENDUF9TS0JfQ0Iocnhza2IpLT5kY2NwZF9zZXEpOwogCiAJZGNjcF9jc3VtX291dGdvaW5nKHNrYik7Ci0JZGgtPmRjY3BoX2NoZWNrc3VtID0gZGNjcF92NF9jc3VtX2ZpbmlzaChza2IsIHJ4c2tiLT5uaC5pcGgtPnNhZGRyLAotCQkJCQkJICAgICAgcnhza2ItPm5oLmlwaC0+ZGFkZHIpOworCXJ4aXBoID0gaXBfaGRyKHJ4c2tiKTsKKwlkaC0+ZGNjcGhfY2hlY2tzdW0gPSBkY2NwX3Y0X2NzdW1fZmluaXNoKHNrYiwgcnhpcGgtPnNhZGRyLAorCQkJCQkJIHJ4aXBoLT5kYWRkcik7CiAKIAliaF9sb2NrX3NvY2soZGNjcF92NF9jdGxfc29ja2V0LT5zayk7CiAJZXJyID0gaXBfYnVpbGRfYW5kX3NlbmRfcGt0KHNrYiwgZGNjcF92NF9jdGxfc29ja2V0LT5zaywKLQkJCQkgICAgcnhza2ItPm5oLmlwaC0+ZGFkZHIsCi0JCQkJICAgIHJ4c2tiLT5uaC5pcGgtPnNhZGRyLCBOVUxMKTsKKwkJCQkgICAgcnhpcGgtPmRhZGRyLCByeGlwaC0+c2FkZHIsIE5VTEwpOwogCWJoX3VubG9ja19zb2NrKGRjY3BfdjRfY3RsX3NvY2tldC0+c2spOwogCiAJaWYgKG5ldF94bWl0X2V2YWwoZXJyKSA9PSAwKSB7CkBAIC02NDAsOCArNjQxLDggQEAKIAkJZ290byBkcm9wX2FuZF9mcmVlOwogCiAJaXJlcSA9IGluZXRfcnNrKHJlcSk7Ci0JaXJlcS0+bG9jX2FkZHIgPSBza2ItPm5oLmlwaC0+ZGFkZHI7Ci0JaXJlcS0+cm10X2FkZHIgPSBza2ItPm5oLmlwaC0+c2FkZHI7CisJaXJlcS0+bG9jX2FkZHIgPSBpcF9oZHIoc2tiKS0+ZGFkZHI7CisJaXJlcS0+cm10X2FkZHIgPSBpcF9oZHIoc2tiKS0+c2FkZHI7CiAJaXJlcS0+b3B0CT0gTlVMTDsKIAogCS8qCkBAIC04MDksNiArODEwLDcgQEAKIHN0YXRpYyBpbnQgZGNjcF92NF9yY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAljb25zdCBzdHJ1Y3QgZGNjcF9oZHIgKmRoOworCWNvbnN0IHN0cnVjdCBpcGhkciAqaXBoOwogCXN0cnVjdCBzb2NrICpzazsKIAlpbnQgbWluX2NvdjsKIApAQCAtODE3LDggKzgxOSw5IEBACiAJaWYgKGRjY3BfaW52YWxpZF9wYWNrZXQoc2tiKSkKIAkJZ290byBkaXNjYXJkX2l0OwogCisJaXBoID0gaXBfaGRyKHNrYik7CiAJLyogU3RlcCAxOiBJZiBoZWFkZXIgY2hlY2tzdW0gaXMgaW5jb3JyZWN0LCBkcm9wIHBhY2tldCBhbmQgcmV0dXJuICovCi0JaWYgKGRjY3BfdjRfY3N1bV9maW5pc2goc2tiLCBza2ItPm5oLmlwaC0+c2FkZHIsIHNrYi0+bmguaXBoLT5kYWRkcikpIHsKKwlpZiAoZGNjcF92NF9jc3VtX2ZpbmlzaChza2IsIGlwaC0+c2FkZHIsIGlwaC0+ZGFkZHIpKSB7CiAJCURDQ1BfV0FSTigiZHJvcHBlZCBwYWNrZXQgd2l0aCBpbnZhbGlkIGNoZWNrc3VtXG4iKTsKIAkJZ290byBkaXNjYXJkX2l0OwogCX0KQEAgLTgzMiw4ICs4MzUsOCBAQAogCQkgICAgICAic3JjPSV1LiV1LiV1LiV1QCUtNWQgIgogCQkgICAgICAiZHN0PSV1LiV1LiV1LiV1QCUtNWQgc2VxPSVsbHUiLAogCQkgICAgICBkY2NwX3BhY2tldF9uYW1lKGRoLT5kY2NwaF90eXBlKSwKLQkJICAgICAgTklQUVVBRChza2ItPm5oLmlwaC0+c2FkZHIpLCBudG9ocyhkaC0+ZGNjcGhfc3BvcnQpLAotCQkgICAgICBOSVBRVUFEKHNrYi0+bmguaXBoLT5kYWRkciksIG50b2hzKGRoLT5kY2NwaF9kcG9ydCksCisJCSAgICAgIE5JUFFVQUQoaXBoLT5zYWRkciksIG50b2hzKGRoLT5kY2NwaF9zcG9ydCksCisJCSAgICAgIE5JUFFVQUQoaXBoLT5kYWRkciksIG50b2hzKGRoLT5kY2NwaF9kcG9ydCksCiAJCSAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIERDQ1BfU0tCX0NCKHNrYiktPmRjY3BkX3NlcSk7CiAKIAlpZiAoZGNjcF9wYWNrZXRfd2l0aG91dF9hY2soc2tiKSkgewpAQCAtODQ4LDEwICs4NTEsOCBAQAogCS8qIFN0ZXAgMjoKIAkgKglMb29rIHVwIGZsb3cgSUQgaW4gdGFibGUgYW5kIGdldCBjb3JyZXNwb25kaW5nIHNvY2tldCAqLwogCXNrID0gX19pbmV0X2xvb2t1cCgmZGNjcF9oYXNoaW5mbywKLQkJCSAgIHNrYi0+bmguaXBoLT5zYWRkciwgZGgtPmRjY3BoX3Nwb3J0LAotCQkJICAgc2tiLT5uaC5pcGgtPmRhZGRyLCBkaC0+ZGNjcGhfZHBvcnQsCi0JCQkgICBpbmV0X2lpZihza2IpKTsKLQorCQkJICAgaXBoLT5zYWRkciwgZGgtPmRjY3BoX3Nwb3J0LAorCQkJICAgaXBoLT5kYWRkciwgZGgtPmRjY3BoX2Rwb3J0LCBpbmV0X2lpZihza2IpKTsKIAkvKgogCSAqIFN0ZXAgMjoKIAkgKglJZiBubyBzb2NrZXQgLi4uCmRpZmYgLS1naXQgYS9uZXQvZGNjcC9pcHY2LmMgYi9uZXQvZGNjcC9pcHY2LmMKaW5kZXggN2Y1MWU4ZC4uNjRlYWMyNSAxMDA2NDQKLS0tIGEvbmV0L2RjY3AvaXB2Ni5jCisrKyBiL25ldC9kY2NwL2lwdjYuYwpAQCAtODQsOCArODQsOCBAQAogCiBzdGF0aWMgaW5saW5lIF9fdTMyIGRjY3BfdjZfaW5pdF9zZXF1ZW5jZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXJldHVybiBzZWN1cmVfZGNjcHY2X3NlcXVlbmNlX251bWJlcihza2ItPm5oLmlwdjZoLT5kYWRkci5zNl9hZGRyMzIsCi0JCQkJCSAgICAgc2tiLT5uaC5pcHY2aC0+c2FkZHIuczZfYWRkcjMyLAorCXJldHVybiBzZWN1cmVfZGNjcHY2X3NlcXVlbmNlX251bWJlcihpcHY2X2hkcihza2IpLT5kYWRkci5zNl9hZGRyMzIsCisJCQkJCSAgICAgaXB2Nl9oZHIoc2tiKS0+c2FkZHIuczZfYWRkcjMyLAogCQkJCQkgICAgIGRjY3BfaGRyKHNrYiktPmRjY3BoX2Rwb3J0LAogCQkJCQkgICAgIGRjY3BfaGRyKHNrYiktPmRjY3BoX3Nwb3J0ICAgICApOwogCkBAIC0yNjEsOCArMjYxLDggQEAKIAogCQkJaWYgKHJ4b3B0LT5zcmNydCkKIAkJCQlvcHQgPSBpcHY2X2ludmVydF9ydGhkcihzaywKLQkJCQkJKHN0cnVjdCBpcHY2X3J0X2hkciAqKShwa3RvcHRzLT5uaC5yYXcgKwotCQkJCQkJCSAgICAgICByeG9wdC0+c3JjcnQpKTsKKwkJCSAgKHN0cnVjdCBpcHY2X3J0X2hkciAqKShza2JfbmV0d29ya19oZWFkZXIocGt0b3B0cykgKworCQkJCQkJIHJ4b3B0LT5zcmNydCkpOwogCQl9CiAKIAkJaWYgKG9wdCAhPSBOVUxMICYmIG9wdC0+c3JjcnQgIT0gTlVMTCkgewpAQCAtMzEzLDYgKzMxMyw3IEBACiBzdGF0aWMgdm9pZCBkY2NwX3Y2X2N0bF9zZW5kX3Jlc2V0KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnJ4c2tiKQogewogCXN0cnVjdCBkY2NwX2hkciAqcnhkaCA9IGRjY3BfaGRyKHJ4c2tiKSwgKmRoOworCXN0cnVjdCBpcHY2aGRyICpyeGlwNmg7CiAJY29uc3QgdTMyIGRjY3BfaGRyX3Jlc2V0X2xlbiA9IHNpemVvZihzdHJ1Y3QgZGNjcF9oZHIpICsKIAkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBkY2NwX2hkcl9leHQpICsKIAkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBkY2NwX2hkcl9yZXNldCk7CkBAIC0zNTIsMTIgKzM1MywxMyBAQAogCWRjY3BfaGRyX3NldF9hY2soZGNjcF9oZHJfYWNrX2JpdHMoc2tiKSwgRENDUF9TS0JfQ0Iocnhza2IpLT5kY2NwZF9zZXEpOwogCiAJZGNjcF9jc3VtX291dGdvaW5nKHNrYik7Ci0JZGgtPmRjY3BoX2NoZWNrc3VtID0gZGNjcF92Nl9jc3VtX2ZpbmlzaChza2IsICZyeHNrYi0+bmguaXB2NmgtPnNhZGRyLAotCQkJCQkJICAgICAgJnJ4c2tiLT5uaC5pcHY2aC0+ZGFkZHIpOworCXJ4aXA2aCA9IGlwdjZfaGRyKHJ4c2tiKTsKKwlkaC0+ZGNjcGhfY2hlY2tzdW0gPSBkY2NwX3Y2X2NzdW1fZmluaXNoKHNrYiwgJnJ4aXA2aC0+c2FkZHIsCisJCQkJCQkgICAgICAmcnhpcDZoLT5kYWRkcik7CiAKIAltZW1zZXQoJmZsLCAwLCBzaXplb2YoZmwpKTsKLQlpcHY2X2FkZHJfY29weSgmZmwuZmw2X2RzdCwgJnJ4c2tiLT5uaC5pcHY2aC0+c2FkZHIpOwotCWlwdjZfYWRkcl9jb3B5KCZmbC5mbDZfc3JjLCAmcnhza2ItPm5oLmlwdjZoLT5kYWRkcik7CisJaXB2Nl9hZGRyX2NvcHkoJmZsLmZsNl9kc3QsICZyeGlwNmgtPnNhZGRyKTsKKwlpcHY2X2FkZHJfY29weSgmZmwuZmw2X3NyYywgJnJ4aXA2aC0+ZGFkZHIpOwogCiAJZmwucHJvdG8gPSBJUFBST1RPX0RDQ1A7CiAJZmwub2lmID0gaW5ldDZfaWlmKHJ4c2tiKTsKQEAgLTM5MCw3ICszOTIsNyBAQAogc3RhdGljIHN0cnVjdCBzb2NrICpkY2NwX3Y2X2huZF9yZXEoc3RydWN0IHNvY2sgKnNrLHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJY29uc3Qgc3RydWN0IGRjY3BfaGRyICpkaCA9IGRjY3BfaGRyKHNrYik7Ci0JY29uc3Qgc3RydWN0IGlwdjZoZHIgKmlwaCA9IHNrYi0+bmguaXB2Nmg7CisJY29uc3Qgc3RydWN0IGlwdjZoZHIgKmlwaCA9IGlwdjZfaGRyKHNrYik7CiAJc3RydWN0IHNvY2sgKm5zazsKIAlzdHJ1Y3QgcmVxdWVzdF9zb2NrICoqcHJldjsKIAkvKiBGaW5kIHBvc3NpYmxlIGNvbm5lY3Rpb24gcmVxdWVzdHMuICovCkBAIC00NjAsOCArNDYyLDggQEAKIAkJZ290byBkcm9wX2FuZF9mcmVlOwogCiAJaXJlcTYgPSBpbmV0Nl9yc2socmVxKTsKLQlpcHY2X2FkZHJfY29weSgmaXJlcTYtPnJtdF9hZGRyLCAmc2tiLT5uaC5pcHY2aC0+c2FkZHIpOwotCWlwdjZfYWRkcl9jb3B5KCZpcmVxNi0+bG9jX2FkZHIsICZza2ItPm5oLmlwdjZoLT5kYWRkcik7CisJaXB2Nl9hZGRyX2NvcHkoJmlyZXE2LT5ybXRfYWRkciwgJmlwdjZfaGRyKHNrYiktPnNhZGRyKTsKKwlpcHY2X2FkZHJfY29weSgmaXJlcTYtPmxvY19hZGRyLCAmaXB2Nl9oZHIoc2tiKS0+ZGFkZHIpOwogCWlyZXE2LT5wa3RvcHRzCT0gTlVMTDsKIAogCWlmIChpcHY2X29wdF9hY2NlcHRlZChzaywgc2tiKSB8fApAQCAtNTQ2LDcgKzU0OCw3IEBACiAJCW5ld25wLT5wa3RvcHRpb25zICA9IE5VTEw7CiAJCW5ld25wLT5vcHQJICAgPSBOVUxMOwogCQluZXducC0+bWNhc3Rfb2lmICAgPSBpbmV0Nl9paWYoc2tiKTsKLQkJbmV3bnAtPm1jYXN0X2hvcHMgID0gc2tiLT5uaC5pcHY2aC0+aG9wX2xpbWl0OworCQluZXducC0+bWNhc3RfaG9wcyAgPSBpcHY2X2hkcihza2IpLT5ob3BfbGltaXQ7CiAKIAkJLyoKIAkJICogTm8gbmVlZCB0byBjaGFyZ2UgdGhpcyBzb2NrIHRvIHRoZSByZWxldmFudCBJUHY2IHJlZmNudCBkZWJ1ZyBzb2NrcyBjb3VudApAQCAtNTczLDggKzU3NSw4IEBACiAKIAkJaWYgKHJ4b3B0LT5zcmNydCkKIAkJCW9wdCA9IGlwdjZfaW52ZXJ0X3J0aGRyKHNrLAotCQkJCShzdHJ1Y3QgaXB2Nl9ydF9oZHIgKikoaXJlcTYtPnBrdG9wdHMtPm5oLnJhdyArCi0JCQkJCQkgICAgICAgcnhvcHQtPnNyY3J0KSk7CisJCSAgIChzdHJ1Y3QgaXB2Nl9ydF9oZHIgKikoc2tiX25ldHdvcmtfaGVhZGVyKGlyZXE2LT5wa3RvcHRzKSArCisJCQkJCSAgcnhvcHQtPnNyY3J0KSk7CiAJfQogCiAJaWYgKGRzdCA9PSBOVUxMKSB7CkBAIC02NTMsNyArNjU1LDcgQEAKIAl9CiAJbmV3bnAtPm9wdAkgID0gTlVMTDsKIAluZXducC0+bWNhc3Rfb2lmICA9IGluZXQ2X2lpZihza2IpOwotCW5ld25wLT5tY2FzdF9ob3BzID0gc2tiLT5uaC5pcHY2aC0+aG9wX2xpbWl0OworCW5ld25wLT5tY2FzdF9ob3BzID0gaXB2Nl9oZHIoc2tiKS0+aG9wX2xpbWl0OwogCiAJLyoKIAkgKiBDbG9uZSBuYXRpdmUgSVB2NiBvcHRpb25zIGZyb20gbGlzdGVuaW5nIHNvY2tldCAoaWYgYW55KQpAQCAtODI2LDggKzgyOCw4IEBACiAJCWdvdG8gZGlzY2FyZF9pdDsKIAogCS8qIFN0ZXAgMTogSWYgaGVhZGVyIGNoZWNrc3VtIGlzIGluY29ycmVjdCwgZHJvcCBwYWNrZXQgYW5kIHJldHVybi4gKi8KLQlpZiAoZGNjcF92Nl9jc3VtX2ZpbmlzaChza2IsICZza2ItPm5oLmlwdjZoLT5zYWRkciwKLQkJCQkgICAgICZza2ItPm5oLmlwdjZoLT5kYWRkcikpIHsKKwlpZiAoZGNjcF92Nl9jc3VtX2ZpbmlzaChza2IsICZpcHY2X2hkcihza2IpLT5zYWRkciwKKwkJCQkgICAgICZpcHY2X2hkcihza2IpLT5kYWRkcikpIHsKIAkJRENDUF9XQVJOKCJkcm9wcGVkIHBhY2tldCB3aXRoIGludmFsaWQgY2hlY2tzdW1cbiIpOwogCQlnb3RvIGRpc2NhcmRfaXQ7CiAJfQpAQCAtODQ0LDkgKzg0Niw5IEBACiAKIAkvKiBTdGVwIDI6CiAJICoJTG9vayB1cCBmbG93IElEIGluIHRhYmxlIGFuZCBnZXQgY29ycmVzcG9uZGluZyBzb2NrZXQgKi8KLQlzayA9IF9faW5ldDZfbG9va3VwKCZkY2NwX2hhc2hpbmZvLCAmc2tiLT5uaC5pcHY2aC0+c2FkZHIsCisJc2sgPSBfX2luZXQ2X2xvb2t1cCgmZGNjcF9oYXNoaW5mbywgJmlwdjZfaGRyKHNrYiktPnNhZGRyLAogCQkJICAgIGRoLT5kY2NwaF9zcG9ydCwKLQkJCSAgICAmc2tiLT5uaC5pcHY2aC0+ZGFkZHIsIG50b2hzKGRoLT5kY2NwaF9kcG9ydCksCisJCQkgICAgJmlwdjZfaGRyKHNrYiktPmRhZGRyLCBudG9ocyhkaC0+ZGNjcGhfZHBvcnQpLAogCQkJICAgIGluZXQ2X2lpZihza2IpKTsKIAkvKgogCSAqIFN0ZXAgMjoKZGlmZiAtLWdpdCBhL25ldC9kY2NwL21pbmlzb2Nrcy5jIGIvbmV0L2RjY3AvbWluaXNvY2tzLmMKaW5kZXggNmQyMzViMy4uZTE4ZTI0OSAxMDA2NDQKLS0tIGEvbmV0L2RjY3AvbWluaXNvY2tzLmMKKysrIGIvbmV0L2RjY3AvbWluaXNvY2tzLmMKQEAgLTI3LDcgKzI3LDcgQEAKIHN0cnVjdCBpbmV0X3RpbWV3YWl0X2RlYXRoX3JvdyBkY2NwX2RlYXRoX3JvdyA9IHsKIAkuc3lzY3RsX21heF90d19idWNrZXRzID0gTlJfRklMRSAqIDIsCiAJLnBlcmlvZAkJPSBEQ0NQX1RJTUVXQUlUX0xFTiAvIElORVRfVFdEUl9UV0tJTExfU0xPVFMsCi0JLmRlYXRoX2xvY2sJPSBTUElOX0xPQ0tfVU5MT0NLRUQsCisJLmRlYXRoX2xvY2sJPSBfX1NQSU5fTE9DS19VTkxPQ0tFRChkY2NwX2RlYXRoX3Jvdy5kZWF0aF9sb2NrKSwKIAkuaGFzaGluZm8JPSAmZGNjcF9oYXNoaW5mbywKIAkudHdfdGltZXIJPSBUSU1FUl9JTklUSUFMSVpFUihpbmV0X3R3ZHJfaGFuZ21hbiwgMCwKIAkJCQkJICAgICh1bnNpZ25lZCBsb25nKSZkY2NwX2RlYXRoX3JvdyksCmRpZmYgLS1naXQgYS9uZXQvZGNjcC9vcHRpb25zLmMgYi9uZXQvZGNjcC9vcHRpb25zLmMKaW5kZXggY2ExM2Y3Ny4uMzRkNTM2ZCAxMDA2NDQKLS0tIGEvbmV0L2RjY3Avb3B0aW9ucy5jCisrKyBiL25ldC9kY2NwL29wdGlvbnMuYwpAQCAtMjksOCArMjksNiBAQAogaW50IHN5c2N0bF9kY2NwX2ZlYXRfc2VuZF9hY2tfdmVjdG9yID0gRENDUEZfSU5JVElBTF9TRU5EX0FDS19WRUNUT1I7CiBpbnQgc3lzY3RsX2RjY3BfZmVhdF9zZW5kX25kcF9jb3VudCAgPSBEQ0NQRl9JTklUSUFMX1NFTkRfTkRQX0NPVU5UOwogCi1FWFBPUlRfU1lNQk9MX0dQTChzeXNjdGxfZGNjcF9mZWF0X3NlcXVlbmNlX3dpbmRvdyk7Ci0KIHZvaWQgZGNjcF9taW5pc29ja19pbml0KHN0cnVjdCBkY2NwX21pbmlzb2NrICpkbXNrKQogewogCWRtc2stPmRjY3Btc19zZXF1ZW5jZV93aW5kb3cgPSBzeXNjdGxfZGNjcF9mZWF0X3NlcXVlbmNlX3dpbmRvdzsKQEAgLTE3NCwyMSArMTcyLDI1IEBACiAJCQlvcHRfcmVjdi0+ZGNjcG9yX3RpbWVzdGFtcF9lY2hvID0gbnRvaGwoKihfX2JlMzIgKil2YWx1ZSk7CiAKIAkJCWRjY3BfcHJfZGVidWcoIiVzIHJ4IG9wdDogVElNRVNUQU1QX0VDSE89JXUsIGxlbj0lZCwgIgotCQkJCSAgICAgICJhY2tubz0lbGx1LCAiLCAgZGNjcF9yb2xlKHNrKSwKKwkJCQkgICAgICAiYWNrbm89JWxsdSIsIGRjY3Bfcm9sZShzayksCiAJCQkJICAgICAgb3B0X3JlY3YtPmRjY3Bvcl90aW1lc3RhbXBfZWNobywKIAkJCQkgICAgICBsZW4gKyAyLAogCQkJCSAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpCiAJCQkJICAgICAgRENDUF9TS0JfQ0Ioc2tiKS0+ZGNjcGRfYWNrX3NlcSk7CiAKIAotCQkJaWYgKGxlbiA9PSA0KQorCQkJaWYgKGxlbiA9PSA0KSB7CisJCQkJZGNjcF9wcl9kZWJ1Z19jYXQoIlxuIik7CiAJCQkJYnJlYWs7CisJCQl9CiAKIAkJCWlmIChsZW4gPT0gNikKIAkJCQllbGFwc2VkX3RpbWUgPSBudG9ocygqKF9fYmUxNiAqKSh2YWx1ZSArIDQpKTsKIAkJCWVsc2UKIAkJCQllbGFwc2VkX3RpbWUgPSBudG9obCgqKF9fYmUzMiAqKSh2YWx1ZSArIDQpKTsKIAorCQkJZGNjcF9wcl9kZWJ1Z19jYXQoIiwgRUxBUFNFRF9USU1FPSVkXG4iLCBlbGFwc2VkX3RpbWUpOworCiAJCQkvKiBHaXZlIHByZWNlZGVuY2UgdG8gdGhlIGJpZ2dlc3QgRUxBUFNFRF9USU1FICovCiAJCQlpZiAoZWxhcHNlZF90aW1lID4gb3B0X3JlY3YtPmRjY3Bvcl9lbGFwc2VkX3RpbWUpCiAJCQkJb3B0X3JlY3YtPmRjY3Bvcl9lbGFwc2VkX3RpbWUgPSBlbGFwc2VkX3RpbWU7CkBAIC01NjUsNiArNTY3LDE0IEBACiAJICAgIGRjY3BfaW5zZXJ0X29wdGlvbnNfZmVhdChzaywgc2tiKSkKIAkJcmV0dXJuIC0xOwogCisJLyoKKwkgKiBPYnRhaW4gUlRUIHNhbXBsZSBmcm9tIFJlcXVlc3QvUmVzcG9uc2UgZXhjaGFuZ2UuCisJICogVGhpcyBpcyBjdXJyZW50bHkgdXNlZCBpbiBDQ0lEIDMgaW5pdGlhbGlzYXRpb24uCisJICovCisJaWYgKERDQ1BfU0tCX0NCKHNrYiktPmRjY3BkX3R5cGUgPT0gRENDUF9QS1RfUkVRVUVTVCAmJgorCSAgICBkY2NwX2luc2VydF9vcHRpb25fdGltZXN0YW1wKHNrLCBza2IpKQorCQlyZXR1cm4gLTE7CisKIAkvKiBYWFg6IGluc2VydCBvdGhlciBvcHRpb25zIHdoZW4gYXBwcm9wcmlhdGUgKi8KIAogCWlmIChEQ0NQX1NLQl9DQihza2IpLT5kY2NwZF9vcHRfbGVuICE9IDApIHsKZGlmZiAtLWdpdCBhL25ldC9kY2NwL291dHB1dC5jIGIvbmV0L2RjY3Avb3V0cHV0LmMKaW5kZXggYWEyMWNjNC4uYzhkODQzZSAxMDA2NDQKLS0tIGEvbmV0L2RjY3Avb3V0cHV0LmMKKysrIGIvbmV0L2RjY3Avb3V0cHV0LmMKQEAgLTE5NCw2ICsxOTQsNyBAQAogCQlyYyA9IGNjaWRfaGNfdHhfc2VuZF9wYWNrZXQoZHAtPmRjY3BzX2hjX3R4X2NjaWQsIHNrLCBza2IpOwogCQlpZiAocmMgPD0gMCkKIAkJCWJyZWFrOworCQlkY2NwX3ByX2RlYnVnKCJkZWxheWVkIHNlbmQgYnkgJWQgbXNlY1xuIiwgcmMpOwogCQlkZWxheSA9IG1zZWNzX3RvX2ppZmZpZXMocmMpOwogCQlzay0+c2tfd3JpdGVfcGVuZGluZysrOwogCQlyZWxlYXNlX3NvY2soc2spOwpAQCAtMjU1LDcgKzI1Niw3IEBACiAJCQkJRENDUF9CVUcoImVycj0lZCBhZnRlciBjY2lkX2hjX3R4X3BhY2tldF9zZW50IiwKIAkJCQkJIGVycik7CiAJCX0gZWxzZSB7Ci0JCQlkY2NwX3ByX2RlYnVnKCJwYWNrZXQgZGlzY2FyZGVkXG4iKTsKKwkJCWRjY3BfcHJfZGVidWcoInBhY2tldCBkaXNjYXJkZWQgZHVlIHRvIGVycj0lZFxuIiwgZXJyKTsKIAkJCWtmcmVlX3NrYihza2IpOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvbmV0L2RjY3AvcHJvYmUuYyBiL25ldC9kY2NwL3Byb2JlLmMKaW5kZXggM2IxZjUwOS4uMWY1ZTNiYSAxMDA2NDQKLS0tIGEvbmV0L2RjY3AvcHJvYmUuYworKysgYi9uZXQvZGNjcC9wcm9iZS5jCkBAIC05MCwxNSArOTAsMTggQEAKIAlpZiAocG9ydCA9PSAwIHx8IG50b2hzKGluZXQtPmRwb3J0KSA9PSBwb3J0IHx8CiAJICAgIG50b2hzKGluZXQtPnNwb3J0KSA9PSBwb3J0KSB7CiAJCWlmIChoY3R4KQotCQkJcHJpbnRsKCIlZC4lZC4lZC4lZDoldSAlZC4lZC4lZC4lZDoldSAlZCAlZCAlZCAlZCAlZFxuIiwKLQkJCSAgIE5JUFFVQUQoaW5ldC0+c2FkZHIpLCBudG9ocyhpbmV0LT5zcG9ydCksCi0JCQkgICBOSVBRVUFEKGluZXQtPmRhZGRyKSwgbnRvaHMoaW5ldC0+ZHBvcnQpLCBzaXplLAotCQkJICAgaGN0eC0+Y2NpZDNoY3R4X3MsIGhjdHgtPmNjaWQzaGN0eF9ydHQsCi0JCQkgICBoY3R4LT5jY2lkM2hjdHhfcCwgaGN0eC0+Y2NpZDNoY3R4X3RfaXBpKTsKKwkJCXByaW50bCgiJWQuJWQuJWQuJWQ6JXUgJWQuJWQuJWQuJWQ6JXUgJWQgJWQgJWQgJWQgJXUgIgorCQkJICAgICAgICIlbGx1ICVsbHUgJWRcbiIsCisJCQkgICAgICAgTklQUVVBRChpbmV0LT5zYWRkciksIG50b2hzKGluZXQtPnNwb3J0KSwKKwkJCSAgICAgICBOSVBRVUFEKGluZXQtPmRhZGRyKSwgbnRvaHMoaW5ldC0+ZHBvcnQpLCBzaXplLAorCQkJICAgICAgIGhjdHgtPmNjaWQzaGN0eF9zLCBoY3R4LT5jY2lkM2hjdHhfcnR0LAorCQkJICAgICAgIGhjdHgtPmNjaWQzaGN0eF9wLCBoY3R4LT5jY2lkM2hjdHhfeF9jYWxjLAorCQkJICAgICAgIGhjdHgtPmNjaWQzaGN0eF94X3JlY3YgPj4gNiwKKwkJCSAgICAgICBoY3R4LT5jY2lkM2hjdHhfeCA+PiA2LCBoY3R4LT5jY2lkM2hjdHhfdF9pcGkpOwogCQllbHNlCiAJCQlwcmludGwoIiVkLiVkLiVkLiVkOiV1ICVkLiVkLiVkLiVkOiV1ICVkXG4iLAotCQkJICAgTklQUVVBRChpbmV0LT5zYWRkciksIG50b2hzKGluZXQtPnNwb3J0KSwKLQkJCSAgIE5JUFFVQUQoaW5ldC0+ZGFkZHIpLCBudG9ocyhpbmV0LT5kcG9ydCksIHNpemUpOworCQkJICAgICAgIE5JUFFVQUQoaW5ldC0+c2FkZHIpLCBudG9ocyhpbmV0LT5zcG9ydCksCisJCQkgICAgICAgTklQUVVBRChpbmV0LT5kYWRkciksIG50b2hzKGluZXQtPmRwb3J0KSwgc2l6ZSk7CiAJfQogCiAJanByb2JlX3JldHVybigpOwpkaWZmIC0tZ2l0IGEvbmV0L2RlY25ldC9hZl9kZWNuZXQuYyBiL25ldC9kZWNuZXQvYWZfZGVjbmV0LmMKaW5kZXggYzY1NjhkNi4uYTIwNWVhYSAxMDA2NDQKLS0tIGEvbmV0L2RlY25ldC9hZl9kZWNuZXQuYworKysgYi9uZXQvZGVjbmV0L2FmX2RlY25ldC5jCkBAIC0yNDEzLDYgKzI0MTMsNyBAQAogc3RhdGljIHZvaWQgX19leGl0IGRlY25ldF9leGl0KHZvaWQpCiB7CiAJc29ja191bnJlZ2lzdGVyKEFGX0RFQ25ldCk7CisJcnRubF91bnJlZ2lzdGVyX2FsbChQRl9ERUNuZXQpOwogCWRldl9yZW1vdmVfcGFjaygmZG5fZGl4X3BhY2tldF90eXBlKTsKIAogCWRuX3VucmVnaXN0ZXJfc3lzY3RsKCk7CmRpZmYgLS1naXQgYS9uZXQvZGVjbmV0L2RuX2Rldi5jIGIvbmV0L2RlY25ldC9kbl9kZXYuYwppbmRleCAwNjBkNzI1Li41YzJhOTk1IDEwMDY0NAotLS0gYS9uZXQvZGVjbmV0L2RuX2Rldi5jCisrKyBiL25ldC9kZWNuZXQvZG5fZGV2LmMKQEAgLTc5OSw3ICs3OTksNiBAQAogCXNraXBfbmRldnMgPSBjYi0+YXJnc1swXTsKIAlza2lwX25hZGRyID0gY2ItPmFyZ3NbMV07CiAKLQlyZWFkX2xvY2soJmRldl9iYXNlX2xvY2spOwogCWZvciAoZGV2ID0gZGV2X2Jhc2UsIGlkeCA9IDA7IGRldjsgZGV2ID0gZGV2LT5uZXh0LCBpZHgrKykgewogCQlpZiAoaWR4IDwgc2tpcF9uZGV2cykKIAkJCWNvbnRpbnVlOwpAQCAtODI0LDggKzgyMyw2IEBACiAJCX0KIAl9CiBkb25lOgotCXJlYWRfdW5sb2NrKCZkZXZfYmFzZV9sb2NrKTsKLQogCWNiLT5hcmdzWzBdID0gaWR4OwogCWNiLT5hcmdzWzFdID0gZG5faWR4OwogCkBAIC05MTMsNyArOTEwLDcgQEAKIAlwa3RsZW4gPSAoX19sZTE2ICopc2tiX3B1c2goc2tiLDIpOwogCSpwa3RsZW4gPSBkbl9odG9ucyhza2ItPmxlbiAtIDIpOwogCi0Jc2tiLT5uaC5yYXcgPSBza2ItPmRhdGE7CisJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CiAKIAlkbl9ydF9maW5pc2hfb3V0cHV0KHNrYiwgZG5fcnRfYWxsX3J0X21jYXN0LCBtc2ctPmlkKTsKIH0KQEAgLTEwMDUsNyArMTAwMiw3IEBACiAJcGt0bGVuID0gKF9fbGUxNiAqKXNrYl9wdXNoKHNrYiwgMik7CiAJKnBrdGxlbiA9IGRuX2h0b25zKHNrYi0+bGVuIC0gMik7CiAKLQlza2ItPm5oLnJhdyA9IHNrYi0+ZGF0YTsKKwlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiKTsKIAogCWlmIChkbl9hbV9pX2Ffcm91dGVyKGRuLCBkbl9kYiwgaWZhKSkgewogCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiMiA9IHNrYl9jb3B5KHNrYiwgR0ZQX0FUT01JQyk7CkBAIC0xNDQ3LDI0ICsxNDQ0LDYgQEAKIAogI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCiAKLXN0YXRpYyBzdHJ1Y3QgcnRuZXRsaW5rX2xpbmsgZG5ldF9ydG5ldGxpbmtfdGFibGVbUlRNX05SX01TR1RZUEVTXSA9Ci17Ci0JW1JUTV9ORVdBRERSICAtIFJUTV9CQVNFXSA9IHsgLmRvaXQJPSBkbl9ubF9uZXdhZGRyLAl9LAotCVtSVE1fREVMQUREUiAgLSBSVE1fQkFTRV0gPSB7IC5kb2l0CT0gZG5fbmxfZGVsYWRkciwJfSwKLQlbUlRNX0dFVEFERFIgIC0gUlRNX0JBU0VdID0geyAuZHVtcGl0CT0gZG5fbmxfZHVtcF9pZmFkZHIsCX0sCi0jaWZkZWYgQ09ORklHX0RFQ05FVF9ST1VURVIKLQlbUlRNX05FV1JPVVRFIC0gUlRNX0JBU0VdID0geyAuZG9pdAk9IGRuX2ZpYl9ydG1fbmV3cm91dGUsCX0sCi0JW1JUTV9ERUxST1VURSAtIFJUTV9CQVNFXSA9IHsgLmRvaXQJPSBkbl9maWJfcnRtX2RlbHJvdXRlLAl9LAotCVtSVE1fR0VUUk9VVEUgLSBSVE1fQkFTRV0gPSB7IC5kb2l0CT0gZG5fY2FjaGVfZ2V0cm91dGUsCi0JCQkJICAgICAgLmR1bXBpdAk9IGRuX2ZpYl9kdW1wLAkJfSwKLQlbUlRNX0dFVFJVTEUgIC0gUlRNX0JBU0VdID0geyAuZHVtcGl0CT0gZG5fZmliX2R1bXBfcnVsZXMsCX0sCi0jZWxzZQotCVtSVE1fR0VUUk9VVEUgLSBSVE1fQkFTRV0gPSB7IC5kb2l0CT0gZG5fY2FjaGVfZ2V0cm91dGUsCi0JCQkJICAgICAgLmR1bXBpdAk9IGRuX2NhY2hlX2R1bXAsCX0sCi0jZW5kaWYKLQotfTsKLQogc3RhdGljIGludCBfX2luaXRkYXRhIGFkZHJbMl07CiBtb2R1bGVfcGFyYW1fYXJyYXkoYWRkciwgaW50LCBOVUxMLCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoYWRkciwgIlRoZSBERUNuZXQgYWRkcmVzcyBvZiB0aGlzIG1hY2hpbmU6IGFyZWEsbm9kZSIpOwpAQCAtMTQ4NSw3ICsxNDY0LDkgQEAKIAogCWRuX2Rldl9kZXZpY2VzX29uKCk7CiAKLQlydG5ldGxpbmtfbGlua3NbUEZfREVDbmV0XSA9IGRuZXRfcnRuZXRsaW5rX3RhYmxlOworCXJ0bmxfcmVnaXN0ZXIoUEZfREVDbmV0LCBSVE1fTkVXQUREUiwgZG5fbmxfbmV3YWRkciwgTlVMTCk7CisJcnRubF9yZWdpc3RlcihQRl9ERUNuZXQsIFJUTV9ERUxBRERSLCBkbl9ubF9kZWxhZGRyLCBOVUxMKTsKKwlydG5sX3JlZ2lzdGVyKFBGX0RFQ25ldCwgUlRNX0dFVEFERFIsIE5VTEwsIGRuX25sX2R1bXBfaWZhZGRyKTsKIAogCXByb2NfbmV0X2ZvcHNfY3JlYXRlKCJkZWNuZXRfZGV2IiwgU19JUlVHTywgJmRuX2Rldl9zZXFfZm9wcyk7CiAKQEAgLTE1MDAsOCArMTQ4MSw2IEBACiAKIHZvaWQgX19leGl0IGRuX2Rldl9jbGVhbnVwKHZvaWQpCiB7Ci0JcnRuZXRsaW5rX2xpbmtzW1BGX0RFQ25ldF0gPSBOVUxMOwotCiAjaWZkZWYgQ09ORklHX1NZU0NUTAogCXsKIAkJaW50IGk7CmRpZmYgLS1naXQgYS9uZXQvZGVjbmV0L2RuX2ZpYi5jIGIvbmV0L2RlY25ldC9kbl9maWIuYwppbmRleCA4MmQ1OGE5Li4zMTBhODYyIDEwMDY0NAotLS0gYS9uZXQvZGVjbmV0L2RuX2ZpYi5jCisrKyBiL25ldC9kZWNuZXQvZG5fZmliLmMKQEAgLTUwNCw3ICs1MDQsNyBAQAogCXJldHVybiAwOwogfQogCi1pbnQgZG5fZmliX3J0bV9kZWxyb3V0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgdm9pZCAqYXJnKQorc3RhdGljIGludCBkbl9maWJfcnRtX2RlbHJvdXRlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBubG1zZ2hkciAqbmxoLCB2b2lkICphcmcpCiB7CiAJc3RydWN0IGRuX2ZpYl90YWJsZSAqdGI7CiAJc3RydWN0IHJ0YXR0ciAqKnJ0YSA9IGFyZzsKQEAgLTUyMCw3ICs1MjAsNyBAQAogCXJldHVybiAtRVNSQ0g7CiB9CiAKLWludCBkbl9maWJfcnRtX25ld3JvdXRlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBubG1zZ2hkciAqbmxoLCB2b2lkICphcmcpCitzdGF0aWMgaW50IGRuX2ZpYl9ydG1fbmV3cm91dGUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5sbXNnaGRyICpubGgsIHZvaWQgKmFyZykKIHsKIAlzdHJ1Y3QgZG5fZmliX3RhYmxlICp0YjsKIAlzdHJ1Y3QgcnRhdHRyICoqcnRhID0gYXJnOwpAQCAtNzQ4LDExICs3NDgsMTMgQEAKIAogdm9pZCBfX2luaXQgZG5fZmliX2luaXQodm9pZCkKIHsKLQogCWRuX2ZpYl90YWJsZV9pbml0KCk7CiAJZG5fZmliX3J1bGVzX2luaXQoKTsKIAogCXJlZ2lzdGVyX2RuYWRkcl9ub3RpZmllcigmZG5fZmliX2RuYWRkcl9ub3RpZmllcik7CisKKwlydG5sX3JlZ2lzdGVyKFBGX0RFQ25ldCwgUlRNX05FV1JPVVRFLCBkbl9maWJfcnRtX25ld3JvdXRlLCBOVUxMKTsKKwlydG5sX3JlZ2lzdGVyKFBGX0RFQ25ldCwgUlRNX0RFTFJPVVRFLCBkbl9maWJfcnRtX2RlbHJvdXRlLCBOVUxMKTsKIH0KIAogCmRpZmYgLS1naXQgYS9uZXQvZGVjbmV0L2RuX25laWdoLmMgYi9uZXQvZGVjbmV0L2RuX25laWdoLmMKaW5kZXggYmY3MDFjZi4uNGJmMDY2YyAxMDA2NDQKLS0tIGEvbmV0L2RlY25ldC9kbl9uZWlnaC5jCisrKyBiL25ldC9kZWNuZXQvZG5fbmVpZ2guYwpAQCAtMjYxLDcgKzI2MSw3IEBACiAJbHAtPnNfY2xhc3MgID0gMDsKIAlscC0+cHQgICAgICAgPSAwOwogCi0Jc2tiLT5uaC5yYXcgPSBza2ItPmRhdGE7CisJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CiAKIAlyZXR1cm4gTkZfSE9PSyhQRl9ERUNuZXQsIE5GX0ROX1BPU1RfUk9VVElORywgc2tiLCBOVUxMLCBuZWlnaC0+ZGV2LCBkbl9uZWlnaF9vdXRwdXRfcGFja2V0KTsKIH0KQEAgLTMwMCw3ICszMDAsNyBAQAogCXNwLT5zcmNub2RlICAgID0gY2ItPnNyYzsKIAlzcC0+Zm9yd2FyZCAgICA9IGNiLT5ob3BzICYgMHgzZjsKIAotCXNrYi0+bmgucmF3ID0gc2tiLT5kYXRhOworCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOwogCiAJcmV0dXJuIE5GX0hPT0soUEZfREVDbmV0LCBORl9ETl9QT1NUX1JPVVRJTkcsIHNrYiwgTlVMTCwgbmVpZ2gtPmRldiwgZG5fbmVpZ2hfb3V0cHV0X3BhY2tldCk7CiB9CkBAIC0zNDIsNyArMzQyLDcgQEAKIAlzcC0+c3Jjbm9kZSAgPSBjYi0+c3JjICYgZG5faHRvbnMoMHgwM2ZmKTsKIAlzcC0+Zm9yd2FyZCAgPSBjYi0+aG9wcyAmIDB4M2Y7CiAKLQlza2ItPm5oLnJhdyA9IHNrYi0+ZGF0YTsKKwlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiKTsKIAogCXJldHVybiBORl9IT09LKFBGX0RFQ25ldCwgTkZfRE5fUE9TVF9ST1VUSU5HLCBza2IsIE5VTEwsIG5laWdoLT5kZXYsIGRuX25laWdoX291dHB1dF9wYWNrZXQpOwogfQpkaWZmIC0tZ2l0IGEvbmV0L2RlY25ldC9kbl9uc3BfaW4uYyBiL25ldC9kZWNuZXQvZG5fbnNwX2luLmMKaW5kZXggOWQyMDkwNC4uNDA3NGE2ZSAxMDA2NDQKLS0tIGEvbmV0L2RlY25ldC9kbl9uc3BfaW4uYworKysgYi9uZXQvZGVjbmV0L2RuX25zcF9pbi5jCkBAIC0zNjIsNyArMzYyLDggQEAKIAkJCXUxNiBkbGVuID0gKnNrYi0+ZGF0YTsKIAkJCWlmICgoZGxlbiA8PSAxNikgJiYgKGRsZW4gPD0gc2tiLT5sZW4pKSB7CiAJCQkJc2NwLT5jb25uZGF0YV9pbi5vcHRfb3B0bCA9IGRuX2h0b25zKGRsZW4pOwotCQkJCW1lbWNweShzY3AtPmNvbm5kYXRhX2luLm9wdF9kYXRhLCBza2ItPmRhdGEgKyAxLCBkbGVuKTsKKwkJCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhX29mZnNldChza2IsIDEsCisJCQkJCSAgICAgIHNjcC0+Y29ubmRhdGFfaW4ub3B0X2RhdGEsIGRsZW4pOwogCQkJfQogCQl9CiAJCWRuX25zcF9zZW5kX2xpbmsoc2ssIEROX05PQ0hBTkdFLCAwKTsKQEAgLTQwNiw3ICs0MDcsNyBAQAogCQl1MTYgZGxlbiA9ICpza2ItPmRhdGE7CiAJCWlmICgoZGxlbiA8PSAxNikgJiYgKGRsZW4gPD0gc2tiLT5sZW4pKSB7CiAJCQlzY3AtPmRpc2NkYXRhX2luLm9wdF9vcHRsID0gZG5faHRvbnMoZGxlbik7Ci0JCQltZW1jcHkoc2NwLT5kaXNjZGF0YV9pbi5vcHRfZGF0YSwgc2tiLT5kYXRhICsgMSwgZGxlbik7CisJCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhX29mZnNldChza2IsIDEsIHNjcC0+ZGlzY2RhdGFfaW4ub3B0X2RhdGEsIGRsZW4pOwogCQl9CiAJfQogCkBAIC03MjUsNyArNzI2LDcgQEAKIAlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCAyKSkKIAkJZ290byBmcmVlX291dDsKIAotCXNrYi0+aC5yYXcgICAgPSBza2ItPmRhdGE7CisJc2tiX3Jlc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKIAljYi0+bnNwX2ZsYWdzID0gKnB0cisrOwogCiAJaWYgKGRlY25ldF9kZWJ1Z19sZXZlbCAmIDIpCmRpZmYgLS1naXQgYS9uZXQvZGVjbmV0L2RuX25zcF9vdXQuYyBiL25ldC9kZWNuZXQvZG5fbnNwX291dC5jCmluZGV4IDJkMmNkYTguLjc0MDQ2NTMgMTAwNjQ0Ci0tLSBhL25ldC9kZWNuZXQvZG5fbnNwX291dC5jCisrKyBiL25ldC9kZWNuZXQvZG5fbnNwX291dC5jCkBAIC03OSw3ICs3OSw3IEBACiAJc3RydWN0IGRzdF9lbnRyeSAqZHN0OwogCXN0cnVjdCBmbG93aSBmbDsKIAotCXNrYi0+aC5yYXcgPSBza2ItPmRhdGE7CisJc2tiX3Jlc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKIAlzY3AtPnN0YW1wID0gamlmZmllczsKIAogCWRzdCA9IHNrX2RzdF9jaGVjayhzaywgMCk7CkBAIC02ODEsOCArNjgxLDEwIEBACiAJaWYgKHNjcC0+cGVlci5zZG5fb2JqbnVtKQogCQl0eXBlID0gMDsKIAotCXNrYl9wdXQoc2tiLCBkbl9zb2NrYWRkcjJ1c2VybmFtZSgmc2NwLT5wZWVyLCBza2ItPnRhaWwsIHR5cGUpKTsKLQlza2JfcHV0KHNrYiwgZG5fc29ja2FkZHIydXNlcm5hbWUoJnNjcC0+YWRkciwgc2tiLT50YWlsLCAyKSk7CisJc2tiX3B1dChza2IsIGRuX3NvY2thZGRyMnVzZXJuYW1lKCZzY3AtPnBlZXIsCisJCQkJCSAgc2tiX3RhaWxfcG9pbnRlcihza2IpLCB0eXBlKSk7CisJc2tiX3B1dChza2IsIGRuX3NvY2thZGRyMnVzZXJuYW1lKCZzY3AtPmFkZHIsCisJCQkJCSAgc2tiX3RhaWxfcG9pbnRlcihza2IpLCAyKSk7CiAKIAltZW51dmVyID0gRE5fTUVOVVZFUl9BQ0MgfCBETl9NRU5VVkVSX1VTUjsKIAlpZiAoc2NwLT5wZWVyLnNkbl9mbGFncyAmIFNERl9QUk9YWSkKZGlmZiAtLWdpdCBhL25ldC9kZWNuZXQvZG5fcm91dGUuYyBiL25ldC9kZWNuZXQvZG5fcm91dGUuYwppbmRleCBjMWI1NTAyLi41ZDczMzdiIDEwMDY0NAotLS0gYS9uZXQvZGVjbmV0L2RuX3JvdXRlLmMKKysrIGIvbmV0L2RlY25ldC9kbl9yb3V0ZS5jCkBAIC03Nyw2ICs3Nyw3IEBACiAjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lcy5oPgogI2luY2x1ZGUgPGFzbS9lcnJuby5oPgorI2luY2x1ZGUgPG5ldC9uZXRsaW5rLmg+CiAjaW5jbHVkZSA8bmV0L25laWdoYm91ci5oPgogI2luY2x1ZGUgPG5ldC9kc3QuaD4KICNpbmNsdWRlIDxuZXQvZmxvdy5oPgpAQCAtMzg2LDcgKzM4Nyw3IEBACiAJX19sZTE2IHRtcDsKIAogCS8qIEFkZCBiYWNrIGhlYWRlcnMgKi8KLQlza2JfcHVzaChza2IsIHNrYi0+ZGF0YSAtIHNrYi0+bmgucmF3KTsKKwlza2JfcHVzaChza2IsIHNrYi0+ZGF0YSAtIHNrYl9uZXR3b3JrX2hlYWRlcihza2IpKTsKIAogCWlmICgoc2tiID0gc2tiX3Vuc2hhcmUoc2tiLCBHRlBfQVRPTUlDKSkgPT0gTlVMTCkKIAkJcmV0dXJuIE5FVF9SWF9EUk9QOwpAQCAtNDI1LDcgKzQyNiw3IEBACiAJdW5zaWduZWQgY2hhciB0bXBbRVRIX0FMRU5dOwogCiAJLyogQWRkIGJhY2sgYWxsIGhlYWRlcnMgKi8KLQlza2JfcHVzaChza2IsIHNrYi0+ZGF0YSAtIHNrYi0+bmgucmF3KTsKKwlza2JfcHVzaChza2IsIHNrYi0+ZGF0YSAtIHNrYl9uZXR3b3JrX2hlYWRlcihza2IpKTsKIAogCWlmICgoc2tiID0gc2tiX3Vuc2hhcmUoc2tiLCBHRlBfQVRPTUlDKSkgPT0gTlVMTCkKIAkJcmV0dXJuIE5FVF9SWF9EUk9QOwpAQCAtNTA0LDcgKzUwNSw3IEBACiAJCWdvdG8gZHJvcF9pdDsKIAogCXNrYl9wdWxsKHNrYiwgMjApOwotCXNrYi0+aC5yYXcgPSBza2ItPmRhdGE7CisJc2tiX3Jlc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKIAogCS8qIERlc3RpbmF0aW9uIGluZm8gKi8KIAlwdHIgKz0gMjsKQEAgLTU0Miw3ICs1NDMsNyBAQAogCQlnb3RvIGRyb3BfaXQ7CiAKIAlza2JfcHVsbChza2IsIDUpOwotCXNrYi0+aC5yYXcgPSBza2ItPmRhdGE7CisJc2tiX3Jlc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKIAogCWNiLT5kc3QgPSAqKF9fbGUxNiAqKXB0cjsKIAlwdHIgKz0gMjsKQEAgLTYxNSw3ICs2MTYsNyBAQAogCQlmbGFncyA9ICpza2ItPmRhdGE7CiAJfQogCi0Jc2tiLT5uaC5yYXcgPSBza2ItPmRhdGE7CisJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CiAKIAkvKgogCSAqIFdlZWQgb3V0IGZ1dHVyZSB2ZXJzaW9uIERFQ25ldApAQCAtMTQ2OCw3ICsxNDY5LDcgQEAKIAlzdHJ1Y3QgZG5fcm91dGUgKnJ0ID0gKHN0cnVjdCBkbl9yb3V0ZSAqKXNrYi0+ZHN0OwogCXN0cnVjdCBydG1zZyAqcjsKIAlzdHJ1Y3Qgbmxtc2doZHIgKm5saDsKLQl1bnNpZ25lZCBjaGFyICpiID0gc2tiLT50YWlsOworCXVuc2lnbmVkIGNoYXIgKmIgPSBza2JfdGFpbF9wb2ludGVyKHNrYik7CiAJbG9uZyBleHBpcmVzOwogCiAJbmxoID0gTkxNU0dfTkVXKHNrYiwgcGlkLCBzZXEsIGV2ZW50LCBzaXplb2YoKnIpLCBmbGFncyk7CkBAIC0xNTA5LDE5ICsxNTEwLDE5IEBACiAJaWYgKHJ0LT5mbC5paWYpCiAJCVJUQV9QVVQoc2tiLCBSVEFfSUlGLCBzaXplb2YoaW50KSwgJnJ0LT5mbC5paWYpOwogCi0JbmxoLT5ubG1zZ19sZW4gPSBza2ItPnRhaWwgLSBiOworCW5saC0+bmxtc2dfbGVuID0gc2tiX3RhaWxfcG9pbnRlcihza2IpIC0gYjsKIAlyZXR1cm4gc2tiLT5sZW47CiAKIG5sbXNnX2ZhaWx1cmU6CiBydGF0dHJfZmFpbHVyZToKLQlza2JfdHJpbShza2IsIGIgLSBza2ItPmRhdGEpOworCW5sbXNnX3RyaW0oc2tiLCBiKTsKIAlyZXR1cm4gLTE7CiB9CiAKIC8qCiAgKiBUaGlzIGlzIGNhbGxlZCBieSBib3RoIGVuZG5vZGVzIGFuZCByb3V0ZXJzIG5vdy4KICAqLwotaW50IGRuX2NhY2hlX2dldHJvdXRlKHN0cnVjdCBza19idWZmICppbl9za2IsIHN0cnVjdCBubG1zZ2hkciAqbmxoLCB2b2lkICphcmcpCitzdGF0aWMgaW50IGRuX2NhY2hlX2dldHJvdXRlKHN0cnVjdCBza19idWZmICppbl9za2IsIHN0cnVjdCBubG1zZ2hkciAqbmxoLCB2b2lkICphcmcpCiB7CiAJc3RydWN0IHJ0YXR0ciAqKnJ0YSA9IGFyZzsKIAlzdHJ1Y3QgcnRtc2cgKnJ0bSA9IE5MTVNHX0RBVEEobmxoKTsKQEAgLTE1MzcsNyArMTUzOCw3IEBACiAJc2tiID0gYWxsb2Nfc2tiKE5MTVNHX0dPT0RTSVpFLCBHRlBfS0VSTkVMKTsKIAlpZiAoc2tiID09IE5VTEwpCiAJCXJldHVybiAtRU5PQlVGUzsKLQlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKIAljYiA9IEROX1NLQl9DQihza2IpOwogCiAJaWYgKHJ0YVtSVEFfU1JDLTFdKQpAQCAtMTgxMiw2ICsxODEzLDEzIEBACiAJZG5fZHN0X29wcy5nY190aHJlc2ggPSAoZG5fcnRfaGFzaF9tYXNrICsgMSk7CiAKIAlwcm9jX25ldF9mb3BzX2NyZWF0ZSgiZGVjbmV0X2NhY2hlIiwgU19JUlVHTywgJmRuX3J0X2NhY2hlX3NlcV9mb3BzKTsKKworI2lmZGVmIENPTkZJR19ERUNORVRfUk9VVEVSCisJcnRubF9yZWdpc3RlcihQRl9ERUNuZXQsIFJUTV9HRVRST1VURSwgZG5fY2FjaGVfZ2V0cm91dGUsIGRuX2ZpYl9kdW1wKTsKKyNlbHNlCisJcnRubF9yZWdpc3RlcihQRl9ERUNuZXQsIFJUTV9HRVRST1VURSwgZG5fY2FjaGVfZ2V0cm91dGUsCisJCSAgICAgIGRuX2NhY2hlX2R1bXApOworI2VuZGlmCiB9CiAKIHZvaWQgX19leGl0IGRuX3JvdXRlX2NsZWFudXAodm9pZCkKZGlmZiAtLWdpdCBhL25ldC9kZWNuZXQvZG5fcnVsZXMuYyBiL25ldC9kZWNuZXQvZG5fcnVsZXMuYwppbmRleCA1ZTg2ZGQ1Li4xN2ExOTMyIDEwMDY0NAotLS0gYS9uZXQvZGVjbmV0L2RuX3J1bGVzLmMKKysrIGIvbmV0L2RlY25ldC9kbl9ydWxlcy5jCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSA8bmV0L2RuX2ZpYi5oPgogI2luY2x1ZGUgPG5ldC9kbl9uZWlnaC5oPgogI2luY2x1ZGUgPG5ldC9kbl9kZXYuaD4KKyNpbmNsdWRlIDxuZXQvZG5fcm91dGUuaD4KIAogc3RhdGljIHN0cnVjdCBmaWJfcnVsZXNfb3BzIGRuX2ZpYl9ydWxlc19vcHM7CiAKQEAgLTIzOSw5ICsyNDAsOSBAQAogCXJldHVybiAwOwogfQogCi1pbnQgZG5fZmliX2R1bXBfcnVsZXMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKQorc3RhdGljIHZvaWQgZG5fZmliX3J1bGVfZmx1c2hfY2FjaGUodm9pZCkKIHsKLQlyZXR1cm4gZmliX3J1bGVzX2R1bXAoc2tiLCBjYiwgQUZfREVDbmV0KTsKKwlkbl9ydF9jYWNoZV9mbHVzaCgtMSk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZmliX3J1bGVzX29wcyBkbl9maWJfcnVsZXNfb3BzID0gewpAQCAtMjU0LDYgKzI1NSw3IEBACiAJLmNvbXBhcmUJPSBkbl9maWJfcnVsZV9jb21wYXJlLAogCS5maWxsCQk9IGRuX2ZpYl9ydWxlX2ZpbGwsCiAJLmRlZmF1bHRfcHJlZgk9IGRuX2ZpYl9ydWxlX2RlZmF1bHRfcHJlZiwKKwkuZmx1c2hfY2FjaGUJPSBkbl9maWJfcnVsZV9mbHVzaF9jYWNoZSwKIAkubmxncm91cAk9IFJUTkxHUlBfREVDbmV0X1JVTEUsCiAJLnBvbGljeQkJPSBkbl9maWJfcnVsZV9wb2xpY3ksCiAJLnJ1bGVzX2xpc3QJPSAmZG5fZmliX3J1bGVzLApkaWZmIC0tZ2l0IGEvbmV0L2RlY25ldC9kbl90YWJsZS5jIGIvbmV0L2RlY25ldC9kbl90YWJsZS5jCmluZGV4IDc4MGExNDFmLi5kNjYxNWM5IDEwMDY0NAotLS0gYS9uZXQvZGVjbmV0L2RuX3RhYmxlLmMKKysrIGIvbmV0L2RlY25ldC9kbl90YWJsZS5jCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9yb3V0ZS5oPiAvKiBSVEZfeHh4ICovCiAjaW5jbHVkZSA8bmV0L25laWdoYm91ci5oPgorI2luY2x1ZGUgPG5ldC9uZXRsaW5rLmg+CiAjaW5jbHVkZSA8bmV0L2RzdC5oPgogI2luY2x1ZGUgPG5ldC9mbG93Lmg+CiAjaW5jbHVkZSA8bmV0L2ZpYl9ydWxlcy5oPgpAQCAtMjk1LDcgKzI5Niw3IEBACiB7CiAJc3RydWN0IHJ0bXNnICpydG07CiAJc3RydWN0IG5sbXNnaGRyICpubGg7Ci0JdW5zaWduZWQgY2hhciAqYiA9IHNrYi0+dGFpbDsKKwl1bnNpZ25lZCBjaGFyICpiID0gc2tiX3RhaWxfcG9pbnRlcihza2IpOwogCiAJbmxoID0gTkxNU0dfTkVXKHNrYiwgcGlkLCBzZXEsIGV2ZW50LCBzaXplb2YoKnJ0bSksIGZsYWdzKTsKIAlydG0gPSBOTE1TR19EQVRBKG5saCk7CkBAIC0zMzcsMTkgKzMzOCwxOSBAQAogCQkJbmhwLT5ydG5oX2lmaW5kZXggPSBuaC0+bmhfb2lmOwogCQkJaWYgKG5oLT5uaF9ndykKIAkJCQlSVEFfUFVUKHNrYiwgUlRBX0dBVEVXQVksIDIsICZuaC0+bmhfZ3cpOwotCQkJbmhwLT5ydG5oX2xlbiA9IHNrYi0+dGFpbCAtICh1bnNpZ25lZCBjaGFyICopbmhwOworCQkJbmhwLT5ydG5oX2xlbiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKSAtICh1bnNpZ25lZCBjaGFyICopbmhwOwogCQl9IGVuZGZvcl9uZXh0aG9wcyhmaSk7CiAJCW1wX2hlYWQtPnJ0YV90eXBlID0gUlRBX01VTFRJUEFUSDsKLQkJbXBfaGVhZC0+cnRhX2xlbiA9IHNrYi0+dGFpbCAtICh1OCopbXBfaGVhZDsKKwkJbXBfaGVhZC0+cnRhX2xlbiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKSAtICh1OCAqKW1wX2hlYWQ7CiAJfQogCi0JbmxoLT5ubG1zZ19sZW4gPSBza2ItPnRhaWwgLSBiOworCW5saC0+bmxtc2dfbGVuID0gc2tiX3RhaWxfcG9pbnRlcihza2IpIC0gYjsKIAlyZXR1cm4gc2tiLT5sZW47CiAKIAogbmxtc2dfZmFpbHVyZToKIHJ0YXR0cl9mYWlsdXJlOgotCXNrYl90cmltKHNrYiwgYiAtIHNrYi0+ZGF0YSk7CisJbmxtc2dfdHJpbShza2IsIGIpOwogCXJldHVybiAtRU1TR1NJWkU7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9kZWNuZXQvbmV0ZmlsdGVyL2RuX3J0bXNnLmMgYi9uZXQvZGVjbmV0L25ldGZpbHRlci9kbl9ydG1zZy5jCmluZGV4IDBlNjJkZWYuLjY5NjIzNDYgMTAwNjQ0Ci0tLSBhL25ldC9kZWNuZXQvbmV0ZmlsdGVyL2RuX3J0bXNnLmMKKysrIGIvbmV0L2RlY25ldC9uZXRmaWx0ZXIvZG5fcnRtc2cuYwpAQCAtMzMsNyArMzMsNyBAQAogewogCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOwogCXNpemVfdCBzaXplOwotCXVuc2lnbmVkIGNoYXIgKm9sZF90YWlsOworCXNrX2J1ZmZfZGF0YV90IG9sZF90YWlsOwogCXN0cnVjdCBubG1zZ2hkciAqbmxoOwogCXVuc2lnbmVkIGNoYXIgKnB0cjsKIAlzdHJ1Y3QgbmZfZG5fcnRtc2cgKnJ0bTsKQEAgLTQ4LDcgKzQ4LDcgQEAKIAlydG0gPSAoc3RydWN0IG5mX2RuX3J0bXNnICopTkxNU0dfREFUQShubGgpOwogCXJ0bS0+bmZkbl9pZmluZGV4ID0gcnRfc2tiLT5kZXYtPmlmaW5kZXg7CiAJcHRyID0gTkZETl9SVE1TRyhydG0pOwotCW1lbWNweShwdHIsIHJ0X3NrYi0+ZGF0YSwgcnRfc2tiLT5sZW4pOworCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEocnRfc2tiLCBwdHIsIHJ0X3NrYi0+bGVuKTsKIAlubGgtPm5sbXNnX2xlbiA9IHNrYi0+dGFpbCAtIG9sZF90YWlsOwogCXJldHVybiBza2I7CiAKQEAgLTEwMiw3ICsxMDIsNyBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgZG5ybWdfcmVjZWl2ZV91c2VyX3NrYihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXN0cnVjdCBubG1zZ2hkciAqbmxoID0gKHN0cnVjdCBubG1zZ2hkciAqKXNrYi0+ZGF0YTsKKwlzdHJ1Y3Qgbmxtc2doZHIgKm5saCA9IG5sbXNnX2hkcihza2IpOwogCiAJaWYgKG5saC0+bmxtc2dfbGVuIDwgc2l6ZW9mKCpubGgpIHx8IHNrYi0+bGVuIDwgbmxoLT5ubG1zZ19sZW4pCiAJCXJldHVybjsKQEAgLTEzOCw3ICsxMzgsNyBAQAogCWludCBydiA9IDA7CiAKIAlkbnJtZyA9IG5ldGxpbmtfa2VybmVsX2NyZWF0ZShORVRMSU5LX0ROUlRNU0csIEROUk5HX05MR1JQX01BWCwKLQkJCQkgICAgICBkbnJtZ19yZWNlaXZlX3VzZXJfc2ssIFRISVNfTU9EVUxFKTsKKwkJCQkgICAgICBkbnJtZ19yZWNlaXZlX3VzZXJfc2ssIE5VTEwsIFRISVNfTU9EVUxFKTsKIAlpZiAoZG5ybWcgPT0gTlVMTCkgewogCQlwcmludGsoS0VSTl9FUlIgImRuX3J0bXNnOiBDYW5ub3QgY3JlYXRlIG5ldGxpbmsgc29ja2V0Iik7CiAJCXJldHVybiAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvbmV0L2Vjb25ldC9hZl9lY29uZXQuYyBiL25ldC9lY29uZXQvYWZfZWNvbmV0LmMKaW5kZXggYmMxMmUzNi4uYjU1MjRmMyAxMDA2NDQKLS0tIGEvbmV0L2Vjb25ldC9hZl9lY29uZXQuYworKysgYi9uZXQvZWNvbmV0L2FmX2Vjb25ldC5jCkBAIC0xNjIsNyArMTYyLDcgQEAKIAllcnIgPSBtZW1jcHlfdG9pb3ZlYyhtc2ctPm1zZ19pb3YsIHNrYi0+ZGF0YSwgY29waWVkKTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dF9mcmVlOwotCXNrYl9nZXRfdGltZXN0YW1wKHNrYiwgJnNrLT5za19zdGFtcCk7CisJc2stPnNrX3N0YW1wID0gc2tiLT50c3RhbXA7CiAKIAlpZiAobXNnLT5tc2dfbmFtZSkKIAkJbWVtY3B5KG1zZy0+bXNnX25hbWUsIHNrYi0+Y2IsIG1zZy0+bXNnX25hbWVsZW4pOwpAQCAtMzQ1LDcgKzM0NSw3IEBACiAJCQlnb3RvIG91dF91bmxvY2s7CiAKIAkJc2tiX3Jlc2VydmUoc2tiLCBMTF9SRVNFUlZFRF9TUEFDRShkZXYpKTsKLQkJc2tiLT5uaC5yYXcgPSBza2ItPmRhdGE7CisJCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOwogCiAJCWViID0gKHN0cnVjdCBlY19jYiAqKSZza2ItPmNiOwogCkBAIC0zNjYsNyArMzY2LDcgQEAKIAkJCWZoLT5jYiA9IGNiOwogCQkJZmgtPnBvcnQgPSBwb3J0OwogCQkJaWYgKHNvY2stPnR5cGUgIT0gU09DS19ER1JBTSkgewotCQkJCXNrYi0+dGFpbCA9IHNrYi0+ZGF0YTsKKwkJCQlza2JfcmVzZXRfdGFpbF9wb2ludGVyKHNrYik7CiAJCQkJc2tiLT5sZW4gPSAwOwogCQkJfSBlbHNlIGlmIChyZXMgPCAwKQogCQkJCWdvdG8gb3V0X2ZyZWU7CkBAIC03MjcsNiArNzI3LDkgQEAKIAkJY2FzZSBTSU9DR1NUQU1QOgogCQkJcmV0dXJuIHNvY2tfZ2V0X3RpbWVzdGFtcChzaywgYXJncCk7CiAKKwkJY2FzZSBTSU9DR1NUQU1QTlM6CisJCQlyZXR1cm4gc29ja19nZXRfdGltZXN0YW1wbnMoc2ssIGFyZ3ApOworCiAJCWNhc2UgU0lPQ1NJRkFERFI6CiAJCWNhc2UgU0lPQ0dJRkFERFI6CiAJCQlyZXR1cm4gZWNfZGV2X2lvY3RsKHNvY2ssIGNtZCwgYXJncCk7CkBAIC04NDUsNyArODQ4LDcgQEAKIAogc3RhdGljIHZvaWQgYXVuX2luY29taW5nKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBhdW5oZHIgKmFoLCBzaXplX3QgbGVuKQogewotCXN0cnVjdCBpcGhkciAqaXAgPSBza2ItPm5oLmlwaDsKKwlzdHJ1Y3QgaXBoZHIgKmlwID0gaXBfaGRyKHNrYik7CiAJdW5zaWduZWQgY2hhciBzdG4gPSBudG9obChpcC0+c2FkZHIpICYgMHhmZjsKIAlzdHJ1Y3Qgc29jayAqc2s7CiAJc3RydWN0IHNrX2J1ZmYgKm5ld3NrYjsKQEAgLTk0MCwxMCArOTQzLDEwIEBACiAJCXByaW50ayhLRVJOX0RFQlVHICJBVU46IHJlY3Zmcm9tKCkgZXJyb3IgJWRcbiIsIC1lcnIpOwogCX0KIAotCWRhdGEgPSBza2ItPmgucmF3ICsgc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpOworCWRhdGEgPSBza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpICsgc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpOwogCWFoID0gKHN0cnVjdCBhdW5oZHIgKilkYXRhOwogCWxlbiA9IHNrYi0+bGVuIC0gc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpOwotCWlwID0gc2tiLT5uaC5pcGg7CisJaXAgPSBpcF9oZHIoc2tiKTsKIAogCXN3aXRjaCAoYWgtPmNvZGUpCiAJewpkaWZmIC0tZ2l0IGEvbmV0L2V0aGVybmV0L2V0aC5jIGIvbmV0L2V0aGVybmV0L2V0aC5jCmluZGV4IDczOTFmNTUuLjBhYzI1MjQgMTAwNjQ0Ci0tLSBhL25ldC9ldGhlcm5ldC9ldGguYworKysgYi9uZXQvZXRoZXJuZXQvZXRoLmMKQEAgLTE1Niw3ICsxNTYsOCBAQAogCXN0cnVjdCBldGhoZHIgKmV0aDsKIAl1bnNpZ25lZCBjaGFyICpyYXdwOwogCi0Jc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOworCXNrYi0+ZGV2ID0gZGV2OworCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CiAJc2tiX3B1bGwoc2tiLCBFVEhfSExFTik7CiAJZXRoID0gZXRoX2hkcihza2IpOwogCkBAIC0yMjgsNyArMjI5LDcgQEAKIAlldGggPSAoc3RydWN0IGV0aGhkciAqKQogCSAgICAoKCh1OCAqKSBoaC0+aGhfZGF0YSkgKyAoSEhfREFUQV9PRkYoc2l6ZW9mKCpldGgpKSkpOwogCi0JaWYgKHR5cGUgPT0gX19jb25zdGFudF9odG9ucyhFVEhfUF84MDJfMykpCisJaWYgKHR5cGUgPT0gaHRvbnMoRVRIX1BfODAyXzMpKQogCQlyZXR1cm4gLTE7CiAKIAlldGgtPmhfcHJvdG8gPSB0eXBlOwpkaWZmIC0tZ2l0IGEvbmV0L2llZWU4MDIxMS9LY29uZmlnIGIvbmV0L2llZWU4MDIxMS9LY29uZmlnCmluZGV4IDZlZjc2NmUuLjE0MzhhZGVkIDEwMDY0NAotLS0gYS9uZXQvaWVlZTgwMjExL0tjb25maWcKKysrIGIvbmV0L2llZWU4MDIxMS9LY29uZmlnCkBAIC01Niw3ICs1Niw4IEBACiAKIGNvbmZpZyBJRUVFODAyMTFfQ1JZUFRfVEtJUAogCXRyaXN0YXRlICJJRUVFIDgwMi4xMWkgVEtJUCBlbmNyeXB0aW9uIgotCWRlcGVuZHMgb24gSUVFRTgwMjExICYmIE5FVF9SQURJTworCWRlcGVuZHMgb24gSUVFRTgwMjExCisJc2VsZWN0IFdJUkVMRVNTX0VYVAogCXNlbGVjdCBDUllQVE8KIAlzZWxlY3QgQ1JZUFRPX01JQ0hBRUxfTUlDCiAJc2VsZWN0IENSWVBUT19FQ0IKZGlmZiAtLWdpdCBhL25ldC9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0LmMgYi9uZXQvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdC5jCmluZGV4IDVlZDBhOTguLmRmNTU5MmMgMTAwNjQ0Ci0tLSBhL25ldC9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0LmMKKysrIGIvbmV0L2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHQuYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBIb3N0IEFQIGNyeXB0byByb3V0aW5lcwogICoKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDAzLCBKb3VuaSBNYWxpbmVuIDxqa21hbGluZUBjYy5odXQuZmk+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwMywgSm91bmkgTWFsaW5lbiA8akB3MS5maT4KICAqIFBvcnRpb25zIENvcHlyaWdodCAoQykgMjAwNCwgSW50ZWwgQ29ycG9yYXRpb24gPGprZXRyZW5vQGxpbnV4LmludGVsLmNvbT4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQpkaWZmIC0tZ2l0IGEvbmV0L2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHRfY2NtcC5jIGIvbmV0L2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHRfY2NtcC5jCmluZGV4IDM1YWEzNDIuLmIwMTZiNDEgMTAwNjQ0Ci0tLSBhL25ldC9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X2NjbXAuYworKysgYi9uZXQvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF9jY21wLmMKQEAgLTEsNyArMSw3IEBACiAvKgogICogSG9zdCBBUCBjcnlwdDogaG9zdC1iYXNlZCBDQ01QIGVuY3J5cHRpb24gaW1wbGVtZW50YXRpb24gZm9yIEhvc3QgQVAgZHJpdmVyCiAgKgotICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDQsIEpvdW5pIE1hbGluZW4gPGprbWFsaW5lQGNjLmh1dC5maT4KKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA0LCBKb3VuaSBNYWxpbmVuIDxqQHcxLmZpPgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwpAQCAtMzM4LDcgKzMzOCw3IEBACiAKIAlpZiAoY2NtcF9yZXBsYXlfY2hlY2socG4sIGtleS0+cnhfcG4pKSB7CiAJCWlmIChuZXRfcmF0ZWxpbWl0KCkpIHsKLQkJCXByaW50ayhLRVJOX0RFQlVHICJDQ01QOiByZXBsYXkgZGV0ZWN0ZWQ6IFNUQT0iIE1BQ19GTVQKKwkJCUlFRUU4MDIxMV9ERUJVR19EUk9QKCJDQ01QOiByZXBsYXkgZGV0ZWN0ZWQ6IFNUQT0iIE1BQ19GTVQKIAkJCSAgICAgICAiIHByZXZpb3VzIFBOICUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCAiCiAJCQkgICAgICAgInJlY2VpdmVkIFBOICUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeFxuIiwKIAkJCSAgICAgICBNQUNfQVJHKGhkci0+YWRkcjIpLCBNQUNfQVJHKGtleS0+cnhfcG4pLApkaWZmIC0tZ2l0IGEvbmV0L2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHRfdGtpcC5jIGIvbmV0L2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHRfdGtpcC5jCmluZGV4IGZjMWY5OWEuLjVhNDhkOGUgMTAwNjQ0Ci0tLSBhL25ldC9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X3RraXAuYworKysgYi9uZXQvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF90a2lwLmMKQEAgLTEsNyArMSw3IEBACiAvKgogICogSG9zdCBBUCBjcnlwdDogaG9zdC1iYXNlZCBUS0lQIGVuY3J5cHRpb24gaW1wbGVtZW50YXRpb24gZm9yIEhvc3QgQVAgZHJpdmVyCiAgKgotICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDQsIEpvdW5pIE1hbGluZW4gPGprbWFsaW5lQGNjLmh1dC5maT4KKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA0LCBKb3VuaSBNYWxpbmVuIDxqQHcxLmZpPgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwpAQCAtNDY1LDcgKzQ2NSw3IEBACiAKIAlpZiAodGtpcF9yZXBsYXlfY2hlY2soaXYzMiwgaXYxNiwgdGtleS0+cnhfaXYzMiwgdGtleS0+cnhfaXYxNikpIHsKIAkJaWYgKG5ldF9yYXRlbGltaXQoKSkgewotCQkJcHJpbnRrKEtFUk5fREVCVUcgIlRLSVA6IHJlcGxheSBkZXRlY3RlZDogU1RBPSIgTUFDX0ZNVAorCQkJSUVFRTgwMjExX0RFQlVHX0RST1AoIlRLSVA6IHJlcGxheSBkZXRlY3RlZDogU1RBPSIgTUFDX0ZNVAogCQkJICAgICAgICIgcHJldmlvdXMgVFNDICUwOHglMDR4IHJlY2VpdmVkIFRTQyAiCiAJCQkgICAgICAgIiUwOHglMDR4XG4iLCBNQUNfQVJHKGhkci0+YWRkcjIpLAogCQkJICAgICAgIHRrZXktPnJ4X2l2MzIsIHRrZXktPnJ4X2l2MTYsIGl2MzIsIGl2MTYpOwpAQCAtNTA3LDcgKzUwNyw3IEBACiAJCQl0a2V5LT5yeF9waGFzZTFfZG9uZSA9IDA7CiAJCX0KIAkJaWYgKG5ldF9yYXRlbGltaXQoKSkgewotCQkJcHJpbnRrKEtFUk5fREVCVUcgIlRLSVA6IElDViBlcnJvciBkZXRlY3RlZDogU1RBPSIKKwkJCUlFRUU4MDIxMV9ERUJVR19EUk9QKCJUS0lQOiBJQ1YgZXJyb3IgZGV0ZWN0ZWQ6IFNUQT0iCiAJCQkgICAgICAgTUFDX0ZNVCAiXG4iLCBNQUNfQVJHKGhkci0+YWRkcjIpKTsKIAkJfQogCQl0a2V5LT5kb3QxMVJTTkFTdGF0c1RLSVBJQ1ZFcnJvcnMrKzsKZGlmZiAtLWdpdCBhL25ldC9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X3dlcC5jIGIvbmV0L2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHRfd2VwLmMKaW5kZXggZWM2ZDg4NS4uOGQxODI0NSAxMDA2NDQKLS0tIGEvbmV0L2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHRfd2VwLmMKKysrIGIvbmV0L2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHRfd2VwLmMKQEAgLTEsNyArMSw3IEBACiAvKgogICogSG9zdCBBUCBjcnlwdDogaG9zdC1iYXNlZCBXRVAgZW5jcnlwdGlvbiBpbXBsZW1lbnRhdGlvbiBmb3IgSG9zdCBBUCBkcml2ZXIKICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNCwgSm91bmkgTWFsaW5lbiA8amttYWxpbmVAY2MuaHV0LmZpPgorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDQsIEpvdW5pIE1hbGluZW4gPGpAdzEuZmk+CiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCkBAIC0xNTIsNyArMTUyLDcgQEAKIAkJcmV0dXJuIC0xOwogCiAJLyogQ29weSB0aGUgSVYgaW50byB0aGUgZmlyc3QgMyBieXRlcyBvZiB0aGUga2V5ICovCi0JbWVtY3B5KGtleSwgc2tiLT5kYXRhICsgaGRyX2xlbiwgMyk7CisJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YV9vZmZzZXQoc2tiLCBoZHJfbGVuLCBrZXksIDMpOwogCiAJLyogQ29weSByZXN0IG9mIHRoZSBXRVAga2V5ICh0aGUgc2VjcmV0IHBhcnQpICovCiAJbWVtY3B5KGtleSArIDMsIHdlcC0+a2V5LCB3ZXAtPmtleV9sZW4pOwpkaWZmIC0tZ2l0IGEvbmV0L2llZWU4MDIxMS9pZWVlODAyMTFfbW9kdWxlLmMgYi9uZXQvaWVlZTgwMjExL2llZWU4MDIxMV9tb2R1bGUuYwppbmRleCBiMWM2ZDFmLi43ZWM2NjEwIDEwMDY0NAotLS0gYS9uZXQvaWVlZTgwMjExL2llZWU4MDIxMV9tb2R1bGUuYworKysgYi9uZXQvaWVlZTgwMjExL2llZWU4MDIxMV9tb2R1bGUuYwpAQCAtNSw4ICs1LDggQEAKICAgUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBiYXNlZCBvbiB0aGUgV0VQIGVuYWJsZW1lbnQgY29kZSBwcm92aWRlZCBieSB0aGUKICAgSG9zdCBBUCBwcm9qZWN0IGhvc3RhcC1kcml2ZXJzIHYwLjEuMwogICBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMiwgU1NIIENvbW11bmljYXRpb25zIFNlY3VyaXR5IENvcnAgYW5kIEpvdW5pIE1hbGluZW4KLSAgPGprbWFsaW5lQGNjLmh1dC5maT4KLSAgQ29weXJpZ2h0IChjKSAyMDAyLTIwMDMsIEpvdW5pIE1hbGluZW4gPGprbWFsaW5lQGNjLmh1dC5maT4KKyAgPGpAdzEuZmk+CisgIENvcHlyaWdodCAoYykgMjAwMi0yMDAzLCBKb3VuaSBNYWxpbmVuIDxqQHcxLmZpPgogCiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCkBAIC0yMjksNiArMjI5LDcgQEAKIAogc3RhdGljIGludCBkZWJ1ZyA9IDA7CiB1MzIgaWVlZTgwMjExX2RlYnVnX2xldmVsID0gMDsKK0VYUE9SVF9TWU1CT0xfR1BMKGllZWU4MDIxMV9kZWJ1Z19sZXZlbCk7CiBzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICppZWVlODAyMTFfcHJvYyA9IE5VTEw7CiAKIHN0YXRpYyBpbnQgc2hvd19kZWJ1Z19sZXZlbChjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwKZGlmZiAtLWdpdCBhL25ldC9pZWVlODAyMTEvaWVlZTgwMjExX3J4LmMgYi9uZXQvaWVlZTgwMjExL2llZWU4MDIxMV9yeC5jCmluZGV4IDQwODQ5MDkuLmYyZGUyZTQgMTAwNjQ0Ci0tLSBhL25ldC9pZWVlODAyMTEvaWVlZTgwMjExX3J4LmMKKysrIGIvbmV0L2llZWU4MDIxMS9pZWVlODAyMTFfcnguYwpAQCAtMyw4ICszLDggQEAKICAqIGZvciBJbnRlcnNpbCBQcmlzbTIvMi41LzMgLSBob3N0YXAubyBtb2R1bGUsIGNvbW1vbiByb3V0aW5lcwogICoKICAqIENvcHlyaWdodCAoYykgMjAwMS0yMDAyLCBTU0ggQ29tbXVuaWNhdGlvbnMgU2VjdXJpdHkgQ29ycCBhbmQgSm91bmkgTWFsaW5lbgotICogPGprbWFsaW5lQGNjLmh1dC5maT4KLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDAzLCBKb3VuaSBNYWxpbmVuIDxqa21hbGluZUBjYy5odXQuZmk+CisgKiA8akB3MS5maT4KKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDAzLCBKb3VuaSBNYWxpbmVuIDxqQHcxLmZpPgogICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUsIEludGVsIENvcnBvcmF0aW9uCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKQEAgLTQyLDcgKzQyLDcgQEAKIAl1MTYgZmMgPSBsZTE2X3RvX2NwdShoZHItPmZyYW1lX2N0bCk7CiAKIAlza2ItPmRldiA9IGllZWUtPmRldjsKLQlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKIAlza2JfcHVsbChza2IsIGllZWU4MDIxMV9nZXRfaGRybGVuKGZjKSk7CiAJc2tiLT5wa3RfdHlwZSA9IFBBQ0tFVF9PVEhFUkhPU1Q7CiAJc2tiLT5wcm90b2NvbCA9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfODAyMTFfUkFXKTsKQEAgLTYwNiwxMiArNjA2LDEyIEBACiAJCWlmIChmcmFnID09IDApIHsKIAkJCS8qIGNvcHkgZmlyc3QgZnJhZ21lbnQgKGluY2x1ZGluZyBmdWxsIGhlYWRlcnMpIGludG8KIAkJCSAqIGJlZ2lubmluZyBvZiB0aGUgZnJhZ21lbnQgY2FjaGUgc2tiICovCi0JCQltZW1jcHkoc2tiX3B1dChmcmFnX3NrYiwgZmxlbiksIHNrYi0+ZGF0YSwgZmxlbik7CisJCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgc2tiX3B1dChmcmFnX3NrYiwgZmxlbiksIGZsZW4pOwogCQl9IGVsc2UgewogCQkJLyogYXBwZW5kIGZyYW1lIHBheWxvYWQgdG8gdGhlIGVuZCBvZiB0aGUgZnJhZ21lbnQKIAkJCSAqIGNhY2hlIHNrYiAqLwotCQkJbWVtY3B5KHNrYl9wdXQoZnJhZ19za2IsIGZsZW4pLCBza2ItPmRhdGEgKyBoZHJsZW4sCi0JCQkgICAgICAgZmxlbik7CisJCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhX29mZnNldChza2IsIGhkcmxlbiwKKwkJCQkgICAgICBza2JfcHV0KGZyYWdfc2tiLCBmbGVuKSwgZmxlbik7CiAJCX0KIAkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKIAkJc2tiID0gTlVMTDsKQEAgLTc1OSw4ICs3NTksOSBAQAogCQkgICAgSUVFRTgwMjExX0ZDVExfVE9EUykgJiYgc2tiLT5sZW4gPj0gRVRIX0hMRU4gKyBFVEhfQUxFTikgewogCQkvKiBOb24tc3RhbmRhcmQgZnJhbWU6IGdldCBhZGRyNCBmcm9tIGl0cyBib2d1cyBsb2NhdGlvbiBhZnRlcgogCQkgKiB0aGUgcGF5bG9hZCAqLwotCQltZW1jcHkoc2tiLT5kYXRhICsgRVRIX0FMRU4sCi0JCSAgICAgICBza2ItPmRhdGEgKyBza2ItPmxlbiAtIEVUSF9BTEVOLCBFVEhfQUxFTik7CisJCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhX29mZnNldChza2IsIEVUSF9BTEVOLAorCQkJCQkgICAgICAgc2tiLT5kYXRhICsgc2tiLT5sZW4gLSBFVEhfQUxFTiwKKwkJCQkJICAgICAgIEVUSF9BTEVOKTsKIAkJc2tiX3RyaW0oc2tiLCBza2ItPmxlbiAtIEVUSF9BTEVOKTsKIAl9CiAjZW5kaWYKQEAgLTc4OSwxMCArNzkwLDExIEBACiAKIAlpZiAoc2tiMiAhPSBOVUxMKSB7CiAJCS8qIHNlbmQgdG8gd2lyZWxlc3MgbWVkaWEgKi8KLQkJc2tiMi0+cHJvdG9jb2wgPSBfX2NvbnN0YW50X2h0b25zKEVUSF9QXzgwMl8zKTsKLQkJc2tiMi0+bWFjLnJhdyA9IHNrYjItPm5oLnJhdyA9IHNrYjItPmRhdGE7Ci0JCS8qIHNrYjItPm5oLnJhdyA9IHNrYjItPmRhdGEgKyBFVEhfSExFTjsgKi8KIAkJc2tiMi0+ZGV2ID0gZGV2OworCQlza2IyLT5wcm90b2NvbCA9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfODAyXzMpOworCQlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IyKTsKKwkJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYjIpOworCQkvKiBza2IyLT5uZXR3b3JrX2hlYWRlciArPSBFVEhfSExFTjsgKi8KIAkJZGV2X3F1ZXVlX3htaXQoc2tiMik7CiAJfQogI2VuZGlmCkBAIC04MDAsNyArODAyLDYgQEAKIAlpZiAoc2tiKSB7CiAJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CiAJCW1lbXNldChza2ItPmNiLCAwLCBzaXplb2Yoc2tiLT5jYikpOwotCQlza2ItPmRldiA9IGRldjsKIAkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOwkvKiA4MDIuMTEgY3JjIG5vdCBzdWZmaWNpZW50ICovCiAJCWlmIChuZXRpZl9yeChza2IpID09IE5FVF9SWF9EUk9QKSB7CiAJCQkvKiBuZXRpZl9yeCBhbHdheXMgc3VjY2VlZHMsIGJ1dCBpdCBtaWdodCBkcm9wCmRpZmYgLS1naXQgYS9uZXQvaWVlZTgwMjExL2llZWU4MDIxMV90eC5jIGIvbmV0L2llZWU4MDIxMS9pZWVlODAyMTFfdHguYwppbmRleCAwMjkyZDYzLi5hNGMzYzUxIDEwMDY0NAotLS0gYS9uZXQvaWVlZTgwMjExL2llZWU4MDIxMV90eC5jCisrKyBiL25ldC9pZWVlODAyMTEvaWVlZTgwMjExX3R4LmMKQEAgLTIyNSwxMCArMjI1LDEwIEBACiAJc3RydWN0IGlwaGRyICppcDsKIAogCWV0aCA9IChzdHJ1Y3QgZXRoaGRyICopc2tiLT5kYXRhOwotCWlmIChldGgtPmhfcHJvdG8gIT0gX19jb25zdGFudF9odG9ucyhFVEhfUF9JUCkpCisJaWYgKGV0aC0+aF9wcm90byAhPSBodG9ucyhFVEhfUF9JUCkpCiAJCXJldHVybiAwOwogCi0JaXAgPSBza2ItPm5oLmlwaDsKKwlpcCA9IGlwX2hkcihza2IpOwogCXN3aXRjaCAoaXAtPnRvcyAmIDB4ZmMpIHsKIAljYXNlIDB4MjA6CiAJCXJldHVybiAyOwpAQCAtMzA5LDggKzMwOSw4IEBACiAJfQogCiAJLyogU2F2ZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGFkZHJlc3NlcyAqLwotCW1lbWNweShkZXN0LCBza2ItPmRhdGEsIEVUSF9BTEVOKTsKLQltZW1jcHkoc3JjLCBza2ItPmRhdGEgKyBFVEhfQUxFTiwgRVRIX0FMRU4pOworCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCBkZXN0LCBFVEhfQUxFTik7CisJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YV9vZmZzZXQoc2tiLCBFVEhfQUxFTiwgc3JjLCBFVEhfQUxFTik7CiAKIAlpZiAoaG9zdF9lbmNyeXB0IHx8IGhvc3RfYnVpbGRfaXYpCiAJCWZjID0gSUVFRTgwMjExX0ZUWVBFX0RBVEEgfCBJRUVFODAyMTFfU1RZUEVfREFUQSB8CkBAIC0zNjMsNyArMzYzLDcgQEAKIAkJc25hcHBlZCA9IDE7CiAJCWllZWU4MDIxMV9jb3B5X3NuYXAoc2tiX3B1dChza2JfbmV3LCBTTkFQX1NJWkUgKyBzaXplb2YodTE2KSksCiAJCQkJICAgIGV0aGVyX3R5cGUpOwotCQltZW1jcHkoc2tiX3B1dChza2JfbmV3LCBza2ItPmxlbiksIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgc2tiX3B1dChza2JfbmV3LCBza2ItPmxlbiksIHNrYi0+bGVuKTsKIAkJcmVzID0gY3J5cHQtPm9wcy0+ZW5jcnlwdF9tc2R1KHNrYl9uZXcsIGhkcl9sZW4sIGNyeXB0LT5wcml2KTsKIAkJaWYgKHJlcyA8IDApIHsKIAkJCUlFRUU4MDIxMV9FUlJPUigibXNkdSBlbmNyeXB0aW9uIGZhaWxlZFxuIik7CkBAIC00OTIsNyArNDkyLDcgQEAKIAkJCWJ5dGVzIC09IFNOQVBfU0laRSArIHNpemVvZih1MTYpOwogCQl9CiAKLQkJbWVtY3B5KHNrYl9wdXQoc2tiX2ZyYWcsIGJ5dGVzKSwgc2tiLT5kYXRhLCBieXRlcyk7CisJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCBza2JfcHV0KHNrYl9mcmFnLCBieXRlcyksIGJ5dGVzKTsKIAogCQkvKiBBZHZhbmNlIHRoZSBTS0IuLi4gKi8KIAkJc2tiX3B1bGwoc2tiLCBieXRlcyk7CmRpZmYgLS1naXQgYS9uZXQvaWVlZTgwMjExL2llZWU4MDIxMV93eC5jIGIvbmV0L2llZWU4MDIxMS9pZWVlODAyMTFfd3guYwppbmRleCA0MGQ3YTU1Li5jZWU1ZTEzIDEwMDY0NAotLS0gYS9uZXQvaWVlZTgwMjExL2llZWU4MDIxMV93eC5jCisrKyBiL25ldC9pZWVlODAyMTEvaWVlZTgwMjExX3d4LmMKQEAgLTUsOCArNSw4IEBACiAgIFBvcnRpb25zIG9mIHRoaXMgZmlsZSBhcmUgYmFzZWQgb24gdGhlIFdFUCBlbmFibGVtZW50IGNvZGUgcHJvdmlkZWQgYnkgdGhlCiAgIEhvc3QgQVAgcHJvamVjdCBob3N0YXAtZHJpdmVycyB2MC4xLjMKICAgQ29weXJpZ2h0IChjKSAyMDAxLTIwMDIsIFNTSCBDb21tdW5pY2F0aW9ucyBTZWN1cml0eSBDb3JwIGFuZCBKb3VuaSBNYWxpbmVuCi0gIDxqa21hbGluZUBjYy5odXQuZmk+Ci0gIENvcHlyaWdodCAoYykgMjAwMi0yMDAzLCBKb3VuaSBNYWxpbmVuIDxqa21hbGluZUBjYy5odXQuZmk+CisgIDxqQHcxLmZpPgorICBDb3B5cmlnaHQgKGMpIDIwMDItMjAwMywgSm91bmkgTWFsaW5lbiA8akB3MS5maT4KIAogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogICB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvS2NvbmZpZyBiL25ldC9pcHY0L0tjb25maWcKaW5kZXggOWU4ZWY1MC4uZTYyYWVlMCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvS2NvbmZpZworKysgYi9uZXQvaXB2NC9LY29uZmlnCkBAIC01NzQsNiArNTc0LDMzIEBACiAJbG9zcyBwYWNrZXRzLgogCVNlZSBodHRwOi8vd3d3Lm50dS5lZHUuc2cvaG9tZTUvWkhPVTAwMjIvcGFwZXJzL0NQRnUwM2EucGRmCiAKK2NvbmZpZyBUQ1BfQ09OR19ZRUFICisJdHJpc3RhdGUgIlllQUggVENQIgorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCisJZGVmYXVsdCBuCisJLS0taGVscC0tLQorCVllQUgtVENQIGlzIGEgc2VuZGVyLXNpZGUgaGlnaC1zcGVlZCBlbmFibGVkIFRDUCBjb25nZXN0aW9uIGNvbnRyb2wKKwlhbGdvcml0aG0sIHdoaWNoIHVzZXMgYSBtaXhlZCBsb3NzL2RlbGF5IGFwcHJvYWNoIHRvIGNvbXB1dGUgdGhlCisJY29uZ2VzdGlvbiB3aW5kb3cuIEl0J3MgZGVzaWduIGdvYWxzIHRhcmdldCBoaWdoIGVmZmljaWVuY3ksCisJaW50ZXJuYWwsIFJUVCBhbmQgUmVubyBmYWlybmVzcywgcmVzaWxpZW5jZSB0byBsaW5rIGxvc3Mgd2hpbGUKKwlrZWVwaW5nIG5ldHdvcmsgZWxlbWVudHMgbG9hZCBhcyBsb3cgYXMgcG9zc2libGUuCisKKwlGb3IgZnVydGhlciBkZXRhaWxzIGxvb2sgaGVyZToKKwkgIGh0dHA6Ly93aWwuY3MuY2FsdGVjaC5lZHUvcGZsZG5ldDIwMDcvcGFwZXIvWWVBSF9UQ1AucGRmCisKK2NvbmZpZyBUQ1BfQ09OR19JTExJTk9JUworCXRyaXN0YXRlICJUQ1AgSWxsaW5vaXMiCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKKwlkZWZhdWx0IG4KKwktLS1oZWxwLS0tCisJVENQLUlsbGlub2lzIGlzIGEgc2VuZGVyLXNpZGUgbW9kaWZpY2F0aW8gb2YgVENQIFJlbm8gZm9yCisJaGlnaCBzcGVlZCBsb25nIGRlbGF5IGxpbmtzLiBJdCB1c2VzIHJvdW5kLXRyaXAtdGltZSB0bworCWFkanVzdCB0aGUgYWxwaGEgYW5kIGJldGEgcGFyYW1ldGVycyB0byBhY2hpZXZlIGEgaGlnaGVyIGF2ZXJhZ2UKKwl0aHJvdWdocHV0IGFuZCBtYWludGFpbiBmYWlybmVzcy4KKworCUZvciBmdXJ0aGVyIGRldGFpbHMgc2VlOgorCSAgaHR0cDovL3d3dy5ld3MudWl1Yy5lZHUvfnNoYW9saXUvdGNwaWxsaW5vaXMvaW5kZXguaHRtbAorCiBjaG9pY2UKIAlwcm9tcHQgIkRlZmF1bHQgVENQIGNvbmdlc3Rpb24gY29udHJvbCIKIAlkZWZhdWx0IERFRkFVTFRfQ1VCSUMKZGlmZiAtLWdpdCBhL25ldC9pcHY0L01ha2VmaWxlIGIvbmV0L2lwdjQvTWFrZWZpbGUKaW5kZXggN2EwNjg2Mi4uNGZmNmMxNSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvTWFrZWZpbGUKKysrIGIvbmV0L2lwdjQvTWFrZWZpbGUKQEAgLTQ5LDYgKzQ5LDggQEAKIG9iai0kKENPTkZJR19UQ1BfQ09OR19WRU5PKSArPSB0Y3BfdmVuby5vCiBvYmotJChDT05GSUdfVENQX0NPTkdfU0NBTEFCTEUpICs9IHRjcF9zY2FsYWJsZS5vCiBvYmotJChDT05GSUdfVENQX0NPTkdfTFApICs9IHRjcF9scC5vCitvYmotJChDT05GSUdfVENQX0NPTkdfWUVBSCkgKz0gdGNwX3llYWgubworb2JqLSQoQ09ORklHX1RDUF9DT05HX0lMTElOT0lTKSArPSB0Y3BfaWxsaW5vaXMubwogb2JqLSQoQ09ORklHX05FVExBQkVMKSArPSBjaXBzb19pcHY0Lm8KIAogb2JqLSQoQ09ORklHX1hGUk0pICs9IHhmcm00X3BvbGljeS5vIHhmcm00X3N0YXRlLm8geGZybTRfaW5wdXQubyBcCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9hZl9pbmV0LmMgYi9uZXQvaXB2NC9hZl9pbmV0LmMKaW5kZXggY2YzNThjOC4uMTZhYWU4ZSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvYWZfaW5ldC5jCisrKyBiL25ldC9pcHY0L2FmX2luZXQuYwpAQCAtODcsNiArODcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgpAQCAtMjE3LDYgKzIxOCwyNiBAQAogCXJldHVybiBlcnI7CiB9CiAKK3UzMiBpbmV0X2VoYXNoX3NlY3JldCBfX3JlYWRfbW9zdGx5OworRVhQT1JUX1NZTUJPTChpbmV0X2VoYXNoX3NlY3JldCk7CisKKy8qCisgKiBpbmV0X2VoYXNoX3NlY3JldCBtdXN0IGJlIHNldCBleGFjdGx5IG9uY2UKKyAqIEluc3RlYWQgb2YgdXNpbmcgYSBkZWRpY2F0ZWQgc3BpbmxvY2ssIHdlIChhYil1c2UgaW5ldHN3X2xvY2sKKyAqLwordm9pZCBidWlsZF9laGFzaF9zZWNyZXQodm9pZCkKK3sKKwl1MzIgcm5kOworCWRvIHsKKwkJZ2V0X3JhbmRvbV9ieXRlcygmcm5kLCBzaXplb2Yocm5kKSk7CisJfSB3aGlsZSAocm5kID09IDApOworCXNwaW5fbG9ja19iaCgmaW5ldHN3X2xvY2spOworCWlmICghaW5ldF9laGFzaF9zZWNyZXQpCisJCWluZXRfZWhhc2hfc2VjcmV0ID0gcm5kOworCXNwaW5fdW5sb2NrX2JoKCZpbmV0c3dfbG9jayk7Cit9CitFWFBPUlRfU1lNQk9MKGJ1aWxkX2VoYXNoX3NlY3JldCk7CisKIC8qCiAgKglDcmVhdGUgYW4gaW5ldCBzb2NrZXQuCiAgKi8KQEAgLTIzMyw2ICsyNTQsMTEgQEAKIAlpbnQgdHJ5X2xvYWRpbmdfbW9kdWxlID0gMDsKIAlpbnQgZXJyOwogCisJaWYgKHNvY2stPnR5cGUgIT0gU09DS19SQVcgJiYKKwkgICAgc29jay0+dHlwZSAhPSBTT0NLX0RHUkFNICYmCisJICAgICFpbmV0X2VoYXNoX3NlY3JldCkKKwkJYnVpbGRfZWhhc2hfc2VjcmV0KCk7CisKIAlzb2NrLT5zdGF0ZSA9IFNTX1VOQ09OTkVDVEVEOwogCiAJLyogTG9vayBmb3IgdGhlIHJlcXVlc3RlZCB0eXBlL3Byb3RvY29sIHBhaXIuICovCkBAIC03NTUsNiArNzgxLDkgQEAKIAkJY2FzZSBTSU9DR1NUQU1QOgogCQkJZXJyID0gc29ja19nZXRfdGltZXN0YW1wKHNrLCAoc3RydWN0IHRpbWV2YWwgX191c2VyICopYXJnKTsKIAkJCWJyZWFrOworCQljYXNlIFNJT0NHU1RBTVBOUzoKKwkJCWVyciA9IHNvY2tfZ2V0X3RpbWVzdGFtcG5zKHNrLCAoc3RydWN0IHRpbWVzcGVjIF9fdXNlciAqKWFyZyk7CisJCQlicmVhazsKIAkJY2FzZSBTSU9DQUREUlQ6CiAJCWNhc2UgU0lPQ0RFTFJUOgogCQljYXNlIFNJT0NSVE1TRzoKQEAgLTExMDksNyArMTEzOCw3IEBACiAJaWYgKHVubGlrZWx5KCFwc2tiX21heV9wdWxsKHNrYiwgc2l6ZW9mKCppcGgpKSkpCiAJCWdvdG8gb3V0OwogCi0JaXBoID0gc2tiLT5uaC5pcGg7CisJaXBoID0gaXBfaGRyKHNrYik7CiAJaWhsID0gaXBoLT5paGwgKiA0OwogCWlmIChpaGwgPCBzaXplb2YoKmlwaCkpCiAJCWdvdG8gb3V0OwpAQCAtMTExNyw4ICsxMTQ2LDkgQEAKIAlpZiAodW5saWtlbHkoIXBza2JfbWF5X3B1bGwoc2tiLCBpaGwpKSkKIAkJZ290byBvdXQ7CiAKLQlza2ItPmgucmF3ID0gX19za2JfcHVsbChza2IsIGlobCk7Ci0JaXBoID0gc2tiLT5uaC5pcGg7CisJX19za2JfcHVsbChza2IsIGlobCk7CisJc2tiX3Jlc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKKwlpcGggPSBpcF9oZHIoc2tiKTsKIAlwcm90byA9IGlwaC0+cHJvdG9jb2wgJiAoTUFYX0lORVRfUFJPVE9TIC0gMSk7CiAJZXJyID0gLUVQUk9UT05PU1VQUE9SVDsKIApAQCAtMTE1Miw3ICsxMTgyLDcgQEAKIAlpZiAodW5saWtlbHkoIXBza2JfbWF5X3B1bGwoc2tiLCBzaXplb2YoKmlwaCkpKSkKIAkJZ290byBvdXQ7CiAKLQlpcGggPSBza2ItPm5oLmlwaDsKKwlpcGggPSBpcF9oZHIoc2tiKTsKIAlpaGwgPSBpcGgtPmlobCAqIDQ7CiAJaWYgKGlobCA8IHNpemVvZigqaXBoKSkKIAkJZ290byBvdXQ7CkBAIC0xMTYwLDggKzExOTAsOSBAQAogCWlmICh1bmxpa2VseSghcHNrYl9tYXlfcHVsbChza2IsIGlobCkpKQogCQlnb3RvIG91dDsKIAotCXNrYi0+aC5yYXcgPSBfX3NrYl9wdWxsKHNrYiwgaWhsKTsKLQlpcGggPSBza2ItPm5oLmlwaDsKKwlfX3NrYl9wdWxsKHNrYiwgaWhsKTsKKwlza2JfcmVzZXRfdHJhbnNwb3J0X2hlYWRlcihza2IpOworCWlwaCA9IGlwX2hkcihza2IpOwogCWlkID0gbnRvaHMoaXBoLT5pZCk7CiAJcHJvdG8gPSBpcGgtPnByb3RvY29sICYgKE1BWF9JTkVUX1BST1RPUyAtIDEpOwogCXNlZ3MgPSBFUlJfUFRSKC1FUFJPVE9OT1NVUFBPUlQpOwpAQCAtMTE3NywxNyArMTIwOCw1NyBAQAogCiAJc2tiID0gc2VnczsKIAlkbyB7Ci0JCWlwaCA9IHNrYi0+bmguaXBoOworCQlpcGggPSBpcF9oZHIoc2tiKTsKIAkJaXBoLT5pZCA9IGh0b25zKGlkKyspOwogCQlpcGgtPnRvdF9sZW4gPSBodG9ucyhza2ItPmxlbiAtIHNrYi0+bWFjX2xlbik7CiAJCWlwaC0+Y2hlY2sgPSAwOwotCQlpcGgtPmNoZWNrID0gaXBfZmFzdF9jc3VtKHNrYi0+bmgucmF3LCBpcGgtPmlobCk7CisJCWlwaC0+Y2hlY2sgPSBpcF9mYXN0X2NzdW0oc2tiX25ldHdvcmtfaGVhZGVyKHNrYiksIGlwaC0+aWhsKTsKIAl9IHdoaWxlICgoc2tiID0gc2tiLT5uZXh0KSk7CiAKIG91dDoKIAlyZXR1cm4gc2VnczsKIH0KIAordW5zaWduZWQgbG9uZyBzbm1wX2ZvbGRfZmllbGQodm9pZCAqbWliW10sIGludCBvZmZ0KQoreworCXVuc2lnbmVkIGxvbmcgcmVzID0gMDsKKwlpbnQgaTsKKworCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKSB7CisJCXJlcyArPSAqKCgodW5zaWduZWQgbG9uZyAqKSBwZXJfY3B1X3B0cihtaWJbMF0sIGkpKSArIG9mZnQpOworCQlyZXMgKz0gKigoKHVuc2lnbmVkIGxvbmcgKikgcGVyX2NwdV9wdHIobWliWzFdLCBpKSkgKyBvZmZ0KTsKKwl9CisJcmV0dXJuIHJlczsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNubXBfZm9sZF9maWVsZCk7CisKK2ludCBzbm1wX21pYl9pbml0KHZvaWQgKnB0clsyXSwgc2l6ZV90IG1pYnNpemUsIHNpemVfdCBtaWJhbGlnbikKK3sKKwlCVUdfT04ocHRyID09IE5VTEwpOworCXB0clswXSA9IF9fYWxsb2NfcGVyY3B1KG1pYnNpemUpOworCWlmICghcHRyWzBdKQorCQlnb3RvIGVycjA7CisJcHRyWzFdID0gX19hbGxvY19wZXJjcHUobWlic2l6ZSk7CisJaWYgKCFwdHJbMV0pCisJCWdvdG8gZXJyMTsKKwlyZXR1cm4gMDsKK2VycjE6CisJZnJlZV9wZXJjcHUocHRyWzBdKTsKKwlwdHJbMF0gPSBOVUxMOworZXJyMDoKKwlyZXR1cm4gLUVOT01FTTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNubXBfbWliX2luaXQpOworCit2b2lkIHNubXBfbWliX2ZyZWUodm9pZCAqcHRyWzJdKQoreworCUJVR19PTihwdHIgPT0gTlVMTCk7CisJZnJlZV9wZXJjcHUocHRyWzBdKTsKKwlmcmVlX3BlcmNwdShwdHJbMV0pOworCXB0clswXSA9IHB0clsxXSA9IE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzbm1wX21pYl9mcmVlKTsKKwogI2lmZGVmIENPTkZJR19JUF9NVUxUSUNBU1QKIHN0YXRpYyBzdHJ1Y3QgbmV0X3Byb3RvY29sIGlnbXBfcHJvdG9jb2wgPSB7CiAJLmhhbmRsZXIgPQlpZ21wX3JjdiwKQEAgLTEyMTQsMjggKzEyODUsNDcgQEAKIAogc3RhdGljIGludCBfX2luaXQgaW5pdF9pcHY0X21pYnModm9pZCkKIHsKLQluZXRfc3RhdGlzdGljc1swXSA9IGFsbG9jX3BlcmNwdShzdHJ1Y3QgbGludXhfbWliKTsKLQluZXRfc3RhdGlzdGljc1sxXSA9IGFsbG9jX3BlcmNwdShzdHJ1Y3QgbGludXhfbWliKTsKLQlpcF9zdGF0aXN0aWNzWzBdID0gYWxsb2NfcGVyY3B1KHN0cnVjdCBpcHN0YXRzX21pYik7Ci0JaXBfc3RhdGlzdGljc1sxXSA9IGFsbG9jX3BlcmNwdShzdHJ1Y3QgaXBzdGF0c19taWIpOwotCWljbXBfc3RhdGlzdGljc1swXSA9IGFsbG9jX3BlcmNwdShzdHJ1Y3QgaWNtcF9taWIpOwotCWljbXBfc3RhdGlzdGljc1sxXSA9IGFsbG9jX3BlcmNwdShzdHJ1Y3QgaWNtcF9taWIpOwotCXRjcF9zdGF0aXN0aWNzWzBdID0gYWxsb2NfcGVyY3B1KHN0cnVjdCB0Y3BfbWliKTsKLQl0Y3Bfc3RhdGlzdGljc1sxXSA9IGFsbG9jX3BlcmNwdShzdHJ1Y3QgdGNwX21pYik7Ci0JdWRwX3N0YXRpc3RpY3NbMF0gPSBhbGxvY19wZXJjcHUoc3RydWN0IHVkcF9taWIpOwotCXVkcF9zdGF0aXN0aWNzWzFdID0gYWxsb2NfcGVyY3B1KHN0cnVjdCB1ZHBfbWliKTsKLQl1ZHBsaXRlX3N0YXRpc3RpY3NbMF0gPSBhbGxvY19wZXJjcHUoc3RydWN0IHVkcF9taWIpOwotCXVkcGxpdGVfc3RhdGlzdGljc1sxXSA9IGFsbG9jX3BlcmNwdShzdHJ1Y3QgdWRwX21pYik7Ci0JaWYgKCEKLQkgICAgKG5ldF9zdGF0aXN0aWNzWzBdICYmIG5ldF9zdGF0aXN0aWNzWzFdICYmIGlwX3N0YXRpc3RpY3NbMF0KLQkgICAgICYmIGlwX3N0YXRpc3RpY3NbMV0gJiYgdGNwX3N0YXRpc3RpY3NbMF0gJiYgdGNwX3N0YXRpc3RpY3NbMV0KLQkgICAgICYmIHVkcF9zdGF0aXN0aWNzWzBdICYmIHVkcF9zdGF0aXN0aWNzWzFdCi0JICAgICAmJiB1ZHBsaXRlX3N0YXRpc3RpY3NbMF0gJiYgdWRwbGl0ZV9zdGF0aXN0aWNzWzFdICAgICAgICAgICAgICkgKQotCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAoc25tcF9taWJfaW5pdCgodm9pZCAqKiluZXRfc3RhdGlzdGljcywKKwkJCSAgc2l6ZW9mKHN0cnVjdCBsaW51eF9taWIpLAorCQkJICBfX2FsaWdub2ZfXyhzdHJ1Y3QgbGludXhfbWliKSkgPCAwKQorCQlnb3RvIGVycl9uZXRfbWliOworCWlmIChzbm1wX21pYl9pbml0KCh2b2lkICoqKWlwX3N0YXRpc3RpY3MsCisJCQkgIHNpemVvZihzdHJ1Y3QgaXBzdGF0c19taWIpLAorCQkJICBfX2FsaWdub2ZfXyhzdHJ1Y3QgaXBzdGF0c19taWIpKSA8IDApCisJCWdvdG8gZXJyX2lwX21pYjsKKwlpZiAoc25tcF9taWJfaW5pdCgodm9pZCAqKilpY21wX3N0YXRpc3RpY3MsCisJCQkgIHNpemVvZihzdHJ1Y3QgaWNtcF9taWIpLAorCQkJICBfX2FsaWdub2ZfXyhzdHJ1Y3QgaWNtcF9taWIpKSA8IDApCisJCWdvdG8gZXJyX2ljbXBfbWliOworCWlmIChzbm1wX21pYl9pbml0KCh2b2lkICoqKXRjcF9zdGF0aXN0aWNzLAorCQkJICBzaXplb2Yoc3RydWN0IHRjcF9taWIpLAorCQkJICBfX2FsaWdub2ZfXyhzdHJ1Y3QgdGNwX21pYikpIDwgMCkKKwkJZ290byBlcnJfdGNwX21pYjsKKwlpZiAoc25tcF9taWJfaW5pdCgodm9pZCAqKil1ZHBfc3RhdGlzdGljcywKKwkJCSAgc2l6ZW9mKHN0cnVjdCB1ZHBfbWliKSwKKwkJCSAgX19hbGlnbm9mX18oc3RydWN0IHVkcF9taWIpKSA8IDApCisJCWdvdG8gZXJyX3VkcF9taWI7CisJaWYgKHNubXBfbWliX2luaXQoKHZvaWQgKiopdWRwbGl0ZV9zdGF0aXN0aWNzLAorCQkJICBzaXplb2Yoc3RydWN0IHVkcF9taWIpLAorCQkJICBfX2FsaWdub2ZfXyhzdHJ1Y3QgdWRwX21pYikpIDwgMCkKKwkJZ290byBlcnJfdWRwbGl0ZV9taWI7CiAKLQkodm9pZCkgdGNwX21pYl9pbml0KCk7CisJdGNwX21pYl9pbml0KCk7CiAKIAlyZXR1cm4gMDsKKworZXJyX3VkcGxpdGVfbWliOgorCXNubXBfbWliX2ZyZWUoKHZvaWQgKiopdWRwX3N0YXRpc3RpY3MpOworZXJyX3VkcF9taWI6CisJc25tcF9taWJfZnJlZSgodm9pZCAqKil0Y3Bfc3RhdGlzdGljcyk7CitlcnJfdGNwX21pYjoKKwlzbm1wX21pYl9mcmVlKCh2b2lkICoqKWljbXBfc3RhdGlzdGljcyk7CitlcnJfaWNtcF9taWI6CisJc25tcF9taWJfZnJlZSgodm9pZCAqKilpcF9zdGF0aXN0aWNzKTsKK2Vycl9pcF9taWI6CisJc25tcF9taWJfZnJlZSgodm9pZCAqKiluZXRfc3RhdGlzdGljcyk7CitlcnJfbmV0X21pYjoKKwlyZXR1cm4gLUVOT01FTTsKIH0KIAogc3RhdGljIGludCBpcHY0X3Byb2NfaW5pdCh2b2lkKTsKQEAgLTEzMzYsNyArMTQyNiw3IEBACiAJICoJSW5pdGlhbGlzZSBwZXItY3B1IGlwdjQgbWlicwogCSAqLwogCi0JaWYoaW5pdF9pcHY0X21pYnMoKSkKKwlpZiAoaW5pdF9pcHY0X21pYnMoKSkKIAkJcHJpbnRrKEtFUk5fQ1JJVCAiaW5ldF9pbml0OiBDYW5ub3QgaW5pdCBpcHY0IG1pYnNcbiIpOyA7CiAKIAlpcHY0X3Byb2NfaW5pdCgpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvYWg0LmMgYi9uZXQvaXB2NC9haDQuYwppbmRleCA3MTk0ZWI0Li42ZGE4ZmY1IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9haDQuYworKysgYi9uZXQvaXB2NC9haDQuYwpAQCAtNjUsNyArNjUsNyBAQAogCQljaGFyIAkJYnVmWzYwXTsKIAl9IHRtcF9pcGg7CiAKLQl0b3BfaXBoID0gc2tiLT5uaC5pcGg7CisJdG9wX2lwaCA9IGlwX2hkcihza2IpOwogCWlwaCA9ICZ0bXBfaXBoLmlwaDsKIAogCWlwaC0+dG9zID0gdG9wX2lwaC0+dG9zOwpAQCAtMTUyLDkgKzE1Miw5IEBACiAJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOwogCiAJYWggPSAoc3RydWN0IGlwX2F1dGhfaGRyKilza2ItPmRhdGE7Ci0JaXBoID0gc2tiLT5uaC5pcGg7CisJaXBoID0gaXBfaGRyKHNrYik7CiAKLQlpaGwgPSBza2ItPmRhdGEgLSBza2ItPm5oLnJhdzsKKwlpaGwgPSBza2ItPmRhdGEgLSBza2JfbmV0d29ya19oZWFkZXIoc2tiKTsKIAltZW1jcHkod29ya19idWYsIGlwaCwgaWhsKTsKIAogCWlwaC0+dHRsID0gMDsKQEAgLTE4MSw3ICsxODEsOSBAQAogCQl9CiAJfQogCSgoc3RydWN0IGlwaGRyKil3b3JrX2J1ZiktPnByb3RvY29sID0gYWgtPm5leHRoZHI7Ci0Jc2tiLT5oLnJhdyA9IG1lbWNweShza2ItPm5oLnJhdyArPSBhaF9obGVuLCB3b3JrX2J1ZiwgaWhsKTsKKwlza2ItPm5ldHdvcmtfaGVhZGVyICs9IGFoX2hsZW47CisJbWVtY3B5KHNrYl9uZXR3b3JrX2hlYWRlcihza2IpLCB3b3JrX2J1ZiwgaWhsKTsKKwlza2ItPnRyYW5zcG9ydF9oZWFkZXIgPSBza2ItPm5ldHdvcmtfaGVhZGVyOwogCV9fc2tiX3B1bGwoc2tiLCBhaF9obGVuICsgaWhsKTsKIAogCXJldHVybiAwOwpAQCAtMTk2LDggKzE5OCw4IEBACiAJc3RydWN0IGlwX2F1dGhfaGRyICphaCA9IChzdHJ1Y3QgaXBfYXV0aF9oZHIqKShza2ItPmRhdGErKGlwaC0+aWhsPDwyKSk7CiAJc3RydWN0IHhmcm1fc3RhdGUgKng7CiAKLQlpZiAoc2tiLT5oLmljbXBoLT50eXBlICE9IElDTVBfREVTVF9VTlJFQUNIIHx8Ci0JICAgIHNrYi0+aC5pY21waC0+Y29kZSAhPSBJQ01QX0ZSQUdfTkVFREVEKQorCWlmIChpY21wX2hkcihza2IpLT50eXBlICE9IElDTVBfREVTVF9VTlJFQUNIIHx8CisJICAgIGljbXBfaGRyKHNrYiktPmNvZGUgIT0gSUNNUF9GUkFHX05FRURFRCkKIAkJcmV0dXJuOwogCiAJeCA9IHhmcm1fc3RhdGVfbG9va3VwKCh4ZnJtX2FkZHJlc3NfdCAqKSZpcGgtPmRhZGRyLCBhaC0+c3BpLCBJUFBST1RPX0FILCBBRl9JTkVUKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2FycC5jIGIvbmV0L2lwdjQvYXJwLmMKaW5kZXggMWEzNDg4YS4uNzExMDc3OSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvYXJwLmMKKysrIGIvbmV0L2lwdjQvYXJwLmMKQEAgLTM0MiwxMyArMzQyLDEzIEBACiAJc3dpdGNoIChJTl9ERVZfQVJQX0FOTk9VTkNFKGluX2RldikpIHsKIAlkZWZhdWx0OgogCWNhc2UgMDoJCS8qIEJ5IGRlZmF1bHQgYW5ub3VuY2UgYW55IGxvY2FsIElQICovCi0JCWlmIChza2IgJiYgaW5ldF9hZGRyX3R5cGUoc2tiLT5uaC5pcGgtPnNhZGRyKSA9PSBSVE5fTE9DQUwpCi0JCQlzYWRkciA9IHNrYi0+bmguaXBoLT5zYWRkcjsKKwkJaWYgKHNrYiAmJiBpbmV0X2FkZHJfdHlwZShpcF9oZHIoc2tiKS0+c2FkZHIpID09IFJUTl9MT0NBTCkKKwkJCXNhZGRyID0gaXBfaGRyKHNrYiktPnNhZGRyOwogCQlicmVhazsKIAljYXNlIDE6CQkvKiBSZXN0cmljdCBhbm5vdW5jZW1lbnRzIG9mIHNhZGRyIGluIHNhbWUgc3VibmV0ICovCiAJCWlmICghc2tiKQogCQkJYnJlYWs7Ci0JCXNhZGRyID0gc2tiLT5uaC5pcGgtPnNhZGRyOworCQlzYWRkciA9IGlwX2hkcihza2IpLT5zYWRkcjsKIAkJaWYgKGluZXRfYWRkcl90eXBlKHNhZGRyKSA9PSBSVE5fTE9DQUwpIHsKIAkJCS8qIHNhZGRyIHNob3VsZCBiZSBrbm93biB0byB0YXJnZXQgKi8KIAkJCWlmIChpbmV0X2FkZHJfb25saW5rKGluX2RldiwgdGFyZ2V0LCBzYWRkcikpCkBAIC01NzgsNyArNTc4LDcgQEAKIAkJcmV0dXJuIE5VTEw7CiAKIAlza2JfcmVzZXJ2ZShza2IsIExMX1JFU0VSVkVEX1NQQUNFKGRldikpOwotCXNrYi0+bmgucmF3ID0gc2tiLT5kYXRhOworCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOwogCWFycCA9IChzdHJ1Y3QgYXJwaGRyICopIHNrYl9wdXQoc2tiLHNpemVvZihzdHJ1Y3QgYXJwaGRyKSArIDIqKGRldi0+YWRkcl9sZW4rNCkpOwogCXNrYi0+ZGV2ID0gZGV2OwogCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9BUlApOwpAQCAtNzIxLDcgKzcyMSw3IEBACiAJaWYgKGluX2RldiA9PSBOVUxMKQogCQlnb3RvIG91dDsKIAotCWFycCA9IHNrYi0+bmguYXJwaDsKKwlhcnAgPSBhcnBfaGRyKHNrYik7CiAKIAlzd2l0Y2ggKGRldl90eXBlKSB7CiAJZGVmYXVsdDoKQEAgLTkzNyw3ICs5MzcsNyBAQAogCQkJCSAoMiAqIHNpemVvZih1MzIpKSkpKQogCQlnb3RvIGZyZWVza2I7CiAKLQlhcnAgPSBza2ItPm5oLmFycGg7CisJYXJwID0gYXJwX2hkcihza2IpOwogCWlmIChhcnAtPmFyX2hsbiAhPSBkZXYtPmFkZHJfbGVuIHx8CiAJICAgIGRldi0+ZmxhZ3MgJiBJRkZfTk9BUlAgfHwKIAkgICAgc2tiLT5wa3RfdHlwZSA9PSBQQUNLRVRfT1RIRVJIT1NUIHx8CkBAIC0xMTc4LDcgKzExNzgsNyBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlzd2l0Y2goY21kKSB7CisJc3dpdGNoIChjbWQpIHsKIAljYXNlIFNJT0NEQVJQOgogCQllcnIgPSBhcnBfcmVxX2RlbGV0ZSgmciwgZGV2KTsKIAkJYnJlYWs7CkBAIC0xMzYwLDcgKzEzNjAsNyBAQAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBhcnBfc2VxX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgYXJwX3NlcV9vcHMgPSB7CiAJLnN0YXJ0ICA9IGFycF9zZXFfc3RhcnQsCiAJLm5leHQgICA9IG5laWdoX3NlcV9uZXh0LAogCS5zdG9wICAgPSBuZWlnaF9zZXFfc3RvcCwKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2NpcHNvX2lwdjQuYyBiL25ldC9pcHY0L2NpcHNvX2lwdjQuYwppbmRleCAyY2U1YjY5Li5lMWYxODQ4IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9jaXBzb19pcHY0LmMKKysrIGIvbmV0L2lwdjQvY2lwc29faXB2NC5jCkBAIC05Miw2ICs5MiwzMyBAQAogaW50IGNpcHNvX3Y0X3JibV9zdHJpY3R2YWxpZCA9IDE7CiAKIC8qCisgKiBQcm90b2NvbCBDb25zdGFudHMKKyAqLworCisvKiBNYXhpbXVtIHNpemUgb2YgdGhlIENJUFNPIElQIG9wdGlvbiwgZGVyaXZlZCBmcm9tIHRoZSBmYWN0IHRoYXQgdGhlIG1heGltdW0KKyAqIElQdjQgaGVhZGVyIHNpemUgaXMgNjAgYnl0ZXMgYW5kIHRoZSBiYXNlIElQdjQgaGVhZGVyIGlzIDIwIGJ5dGVzIGxvbmcuICovCisjZGVmaW5lIENJUFNPX1Y0X09QVF9MRU5fTUFYICAgICAgICAgIDQwCisKKy8qIExlbmd0aCBvZiB0aGUgYmFzZSBDSVBTTyBvcHRpb24sIHRoaXMgaW5jbHVkZXMgdGhlIG9wdGlvbiB0eXBlICgxIGJ5dGUpLCB0aGUKKyAqIG9wdGlvbiBsZW5ndGggKDEgYnl0ZSksIGFuZCB0aGUgRE9JICg0IGJ5dGVzKS4gKi8KKyNkZWZpbmUgQ0lQU09fVjRfSERSX0xFTiAgICAgICAgICAgICAgNgorCisvKiBCYXNlIGxlbmd0aCBvZiB0aGUgcmVzdHJpY3RpdmUgY2F0ZWdvcnkgYml0bWFwIHRhZyAodGFnICMxKS4gKi8KKyNkZWZpbmUgQ0lQU09fVjRfVEFHX1JCTV9CTEVOICAgICAgICAgNAorCisvKiBCYXNlIGxlbmd0aCBvZiB0aGUgZW51bWVyYXRlZCBjYXRlZ29yeSB0YWcgKHRhZyAjMikuICovCisjZGVmaW5lIENJUFNPX1Y0X1RBR19FTlVNX0JMRU4gICAgICAgIDQKKworLyogQmFzZSBsZW5ndGggb2YgdGhlIHJhbmdlZCBjYXRlZ29yaWVzIGJpdG1hcCB0YWcgKHRhZyAjNSkuICovCisjZGVmaW5lIENJUFNPX1Y0X1RBR19STkdfQkxFTiAgICAgICAgIDQKKy8qIFRoZSBtYXhpbXVtIG51bWJlciBvZiBjYXRlZ29yeSByYW5nZXMgcGVybWl0dGVkIGluIHRoZSByYW5nZWQgY2F0ZWdvcnkgdGFnCisgKiAodGFnICM1KS4gIFlvdSBtYXkgbm90ZSB0aGF0IHRoZSBJRVRGIGRyYWZ0IHN0YXRlcyB0aGF0IHRoZSBtYXhpbXVtIG51bWJlcgorICogb2YgY2F0ZWdvcnkgcmFuZ2VzIGlzIDcsIGJ1dCBpZiB0aGUgbG93IGVuZCBvZiB0aGUgbGFzdCBjYXRlZ29yeSByYW5nZSBpcworICogemVybyB0aGVuIGl0IGlzIHBvc3NpYmlsZSB0byBmaXQgOCBjYXRlZ29yeSByYW5nZXMgYmVjYXVzZSB0aGUgemVybyBzaG91bGQKKyAqIGJlIG9taXR0ZWQuICovCisjZGVmaW5lIENJUFNPX1Y0X1RBR19STkdfQ0FUX01BWCAgICAgIDgKKworLyoKICAqIEhlbHBlciBGdW5jdGlvbnMKICAqLwogCkBAIC0xMTA5LDE2ICsxMTM2LDE1IEBACiAJCQkJICAgICB1bnNpZ25lZCBjaGFyICpuZXRfY2F0LAogCQkJCSAgICAgdTMyIG5ldF9jYXRfbGVuKQogewotCS8qIFRoZSBjb25zdGFudCAnMTYnIGlzIG5vdCByYW5kb20sIGl0IGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZgotCSAqIGhpZ2gvbG93IGNhdGVnb3J5IHJhbmdlIHBhaXJzIGFzIHBlcm1pdHRlZCBieSB0aGUgQ0lQU08gZHJhZnQgYmFzZWQKLQkgKiBvbiBhIG1heGltdW0gSVB2NCBoZWFkZXIgbGVuZ3RoIG9mIDYwIGJ5dGVzIC0gdGhlIEJVR19PTigpIGFzc2VydGlvbgotCSAqIGRvZXMgYSBzYW5pdHkgY2hlY2sgdG8gbWFrZSBzdXJlIHdlIGRvbid0IG92ZXJmbG93IHRoZSBhcnJheS4gKi8KIAlpbnQgaXRlciA9IC0xOwotCXUxNiBhcnJheVsxNl07CisJdTE2IGFycmF5W0NJUFNPX1Y0X1RBR19STkdfQ0FUX01BWCAqIDJdOwogCXUzMiBhcnJheV9jbnQgPSAwOwogCXUzMiBjYXRfc2l6ZSA9IDA7CiAKLQlCVUdfT04obmV0X2NhdF9sZW4gPiAzMCk7CisJLyogbWFrZSBzdXJlIHdlIGRvbid0IG92ZXJmbG93IHRoZSAnYXJyYXlbXScgdmFyaWFibGUgKi8KKwlpZiAobmV0X2NhdF9sZW4gPgorCSAgICAoQ0lQU09fVjRfT1BUX0xFTl9NQVggLSBDSVBTT19WNF9IRFJfTEVOIC0gQ0lQU09fVjRfVEFHX1JOR19CTEVOKSkKKwkJcmV0dXJuIC1FTk9TUEM7CiAKIAlmb3IgKDs7KSB7CiAJCWl0ZXIgPSBuZXRsYmxfc2VjYXR0cl9jYXRtYXBfd2FsayhzZWNhdHRyLT5tbHNfY2F0LCBpdGVyICsgMSk7CkBAIC0xMTc0LDcgKzEyMDAsNyBAQAogCXUxNiBjYXRfbG93OwogCXUxNiBjYXRfaGlnaDsKIAotCWZvcihuZXRfaXRlciA9IDA7IG5ldF9pdGVyIDwgbmV0X2NhdF9sZW47IG5ldF9pdGVyICs9IDQpIHsKKwlmb3IgKG5ldF9pdGVyID0gMDsgbmV0X2l0ZXIgPCBuZXRfY2F0X2xlbjsgbmV0X2l0ZXIgKz0gNCkgewogCQljYXRfaGlnaCA9IG50b2hzKCooKF9fYmUxNiAqKSZuZXRfY2F0W25ldF9pdGVyXSkpOwogCQlpZiAoKG5ldF9pdGVyICsgNCkgPD0gbmV0X2NhdF9sZW4pCiAJCQljYXRfbG93ID0gbnRvaHMoKigoX19iZTE2ICopJm5ldF9jYXRbbmV0X2l0ZXIgKyAyXSkpOwpAQCAtMTE5Niw5ICsxMjIyLDYgQEAKICAqIFByb3RvY29sIEhhbmRsaW5nIEZ1bmN0aW9ucwogICovCiAKLSNkZWZpbmUgQ0lQU09fVjRfT1BUX0xFTl9NQVggICAgICAgICAgNDAKLSNkZWZpbmUgQ0lQU09fVjRfSERSX0xFTiAgICAgICAgICAgICAgNgotCiAvKioKICAqIGNpcHNvX3Y0X2dlbnRhZ19oZHIgLSBHZW5lcmF0ZSBhIENJUFNPIG9wdGlvbiBoZWFkZXIKICAqIEBkb2lfZGVmOiB0aGUgRE9JIGRlZmluaXRpb24KQEAgLTE2NzYsNyArMTY5OSw3IEBACiAgKi8KIHZvaWQgY2lwc29fdjRfZXJyb3Ioc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGVycm9yLCB1MzIgZ2F0ZXdheSkKIHsKLQlpZiAoc2tiLT5uaC5pcGgtPnByb3RvY29sID09IElQUFJPVE9fSUNNUCB8fCBlcnJvciAhPSAtRUFDQ0VTKQorCWlmIChpcF9oZHIoc2tiKS0+cHJvdG9jb2wgPT0gSVBQUk9UT19JQ01QIHx8IGVycm9yICE9IC1FQUNDRVMpCiAJCXJldHVybjsKIAogCWlmIChnYXRld2F5KQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvZGV2aW5ldC5jIGIvbmV0L2lwdjQvZGV2aW5ldC5jCmluZGV4IDk4YTAwZDAuLjA4ODg4OGQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2RldmluZXQuYworKysgYi9uZXQvaXB2NC9kZXZpbmV0LmMKQEAgLTQ4LDcgKzQ4LDYgQEAKICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgogI2luY2x1ZGUgPGxpbnV4L2luZXRkZXZpY2UuaD4KQEAgLTYyLDcgKzYxLDcgQEAKICNpbmNsdWRlIDxuZXQvaXAuaD4KICNpbmNsdWRlIDxuZXQvcm91dGUuaD4KICNpbmNsdWRlIDxuZXQvaXBfZmliLmg+Ci0jaW5jbHVkZSA8bmV0L25ldGxpbmsuaD4KKyNpbmNsdWRlIDxuZXQvcnRuZXRsaW5rLmg+CiAKIHN0cnVjdCBpcHY0X2RldmNvbmYgaXB2NF9kZXZjb25mID0gewogCS5hY2NlcHRfcmVkaXJlY3RzID0gMSwKQEAgLTYzMyw3ICs2MzIsNyBAQAogCWRldl9sb2FkKGlmci5pZnJfbmFtZSk7CiAjZW5kaWYKIAotCXN3aXRjaChjbWQpIHsKKwlzd2l0Y2ggKGNtZCkgewogCWNhc2UgU0lPQ0dJRkFERFI6CS8qIEdldCBpbnRlcmZhY2UgYWRkcmVzcyAqLwogCWNhc2UgU0lPQ0dJRkJSREFERFI6CS8qIEdldCB0aGUgYnJvYWRjYXN0IGFkZHJlc3MgKi8KIAljYXNlIFNJT0NHSUZEU1RBRERSOgkvKiBHZXQgdGhlIGRlc3RpbmF0aW9uIGFkZHJlc3MgKi8KQEAgLTcwOCw3ICs3MDcsNyBAQAogCWlmICghaWZhICYmIGNtZCAhPSBTSU9DU0lGQUREUiAmJiBjbWQgIT0gU0lPQ1NJRkZMQUdTKQogCQlnb3RvIGRvbmU7CiAKLQlzd2l0Y2goY21kKSB7CisJc3dpdGNoIChjbWQpIHsKIAljYXNlIFNJT0NHSUZBRERSOgkvKiBHZXQgaW50ZXJmYWNlIGFkZHJlc3MgKi8KIAkJc2luLT5zaW5fYWRkci5zX2FkZHIgPSBpZmEtPmlmYV9sb2NhbDsKIAkJZ290byByYXJvazsKQEAgLTExODMsMTcgKzExODIsMTMgQEAKIAlpbnQgc19pcF9pZHgsIHNfaWR4ID0gY2ItPmFyZ3NbMF07CiAKIAlzX2lwX2lkeCA9IGlwX2lkeCA9IGNiLT5hcmdzWzFdOwotCXJlYWRfbG9jaygmZGV2X2Jhc2VfbG9jayk7CiAJZm9yIChkZXYgPSBkZXZfYmFzZSwgaWR4ID0gMDsgZGV2OyBkZXYgPSBkZXYtPm5leHQsIGlkeCsrKSB7CiAJCWlmIChpZHggPCBzX2lkeCkKIAkJCWNvbnRpbnVlOwogCQlpZiAoaWR4ID4gc19pZHgpCiAJCQlzX2lwX2lkeCA9IDA7Ci0JCXJjdV9yZWFkX2xvY2soKTsKLQkJaWYgKChpbl9kZXYgPSBfX2luX2Rldl9nZXRfcmN1KGRldikpID09IE5VTEwpIHsKLQkJCXJjdV9yZWFkX3VubG9jaygpOworCQlpZiAoKGluX2RldiA9IF9faW5fZGV2X2dldF9ydG5sKGRldikpID09IE5VTEwpCiAJCQljb250aW51ZTsKLQkJfQogCiAJCWZvciAoaWZhID0gaW5fZGV2LT5pZmFfbGlzdCwgaXBfaWR4ID0gMDsgaWZhOwogCQkgICAgIGlmYSA9IGlmYS0+aWZhX25leHQsIGlwX2lkeCsrKSB7CkBAIC0xMjAxLDE2ICsxMTk2LDEyIEBACiAJCQkJY29udGludWU7CiAJCQlpZiAoaW5ldF9maWxsX2lmYWRkcihza2IsIGlmYSwgTkVUTElOS19DQihjYi0+c2tiKS5waWQsCiAJCQkJCSAgICAgY2ItPm5saC0+bmxtc2dfc2VxLAotCQkJCQkgICAgIFJUTV9ORVdBRERSLCBOTE1fRl9NVUxUSSkgPD0gMCkgewotCQkJCXJjdV9yZWFkX3VubG9jaygpOworCQkJCQkgICAgIFJUTV9ORVdBRERSLCBOTE1fRl9NVUxUSSkgPD0gMCkKIAkJCQlnb3RvIGRvbmU7Ci0JCQl9CiAJCX0KLQkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJfQogCiBkb25lOgotCXJlYWRfdW5sb2NrKCZkZXZfYmFzZV9sb2NrKTsKIAljYi0+YXJnc1swXSA9IGlkeDsKIAljYi0+YXJnc1sxXSA9IGlwX2lkeDsKIApAQCAtMTI0MSwxOSArMTIzMiw2IEBACiAJCXJ0bmxfc2V0X3NrX2VycihSVE5MR1JQX0lQVjRfSUZBRERSLCBlcnIpOwogfQogCi1zdGF0aWMgc3RydWN0IHJ0bmV0bGlua19saW5rIGluZXRfcnRuZXRsaW5rX3RhYmxlW1JUTV9OUl9NU0dUWVBFU10gPSB7Ci0JW1JUTV9ORVdBRERSICAtIFJUTV9CQVNFXSA9IHsgLmRvaXQJPSBpbmV0X3J0bV9uZXdhZGRyLAl9LAotCVtSVE1fREVMQUREUiAgLSBSVE1fQkFTRV0gPSB7IC5kb2l0CT0gaW5ldF9ydG1fZGVsYWRkciwJfSwKLQlbUlRNX0dFVEFERFIgIC0gUlRNX0JBU0VdID0geyAuZHVtcGl0CT0gaW5ldF9kdW1wX2lmYWRkciwJfSwKLQlbUlRNX05FV1JPVVRFIC0gUlRNX0JBU0VdID0geyAuZG9pdAk9IGluZXRfcnRtX25ld3JvdXRlLAl9LAotCVtSVE1fREVMUk9VVEUgLSBSVE1fQkFTRV0gPSB7IC5kb2l0CT0gaW5ldF9ydG1fZGVscm91dGUsCX0sCi0JW1JUTV9HRVRST1VURSAtIFJUTV9CQVNFXSA9IHsgLmRvaXQJPSBpbmV0X3J0bV9nZXRyb3V0ZSwKLQkJCQkgICAgICAuZHVtcGl0CT0gaW5ldF9kdW1wX2ZpYiwJfSwKLSNpZmRlZiBDT05GSUdfSVBfTVVMVElQTEVfVEFCTEVTCi0JW1JUTV9HRVRSVUxFICAtIFJUTV9CQVNFXSA9IHsgLmR1bXBpdAk9IGZpYjRfcnVsZXNfZHVtcCwJfSwKLSNlbmRpZgotfTsKLQogI2lmZGVmIENPTkZJR19TWVNDVEwKIAogdm9pZCBpbmV0X2ZvcndhcmRfY2hhbmdlKHZvaWQpCkBAIC0xNjM2LDcgKzE2MTQsMTAgQEAKIHsKIAlyZWdpc3Rlcl9naWZjb25mKFBGX0lORVQsIGluZXRfZ2lmY29uZik7CiAJcmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZpcF9uZXRkZXZfbm90aWZpZXIpOwotCXJ0bmV0bGlua19saW5rc1tQRl9JTkVUXSA9IGluZXRfcnRuZXRsaW5rX3RhYmxlOworCisJcnRubF9yZWdpc3RlcihQRl9JTkVULCBSVE1fTkVXQUREUiwgaW5ldF9ydG1fbmV3YWRkciwgTlVMTCk7CisJcnRubF9yZWdpc3RlcihQRl9JTkVULCBSVE1fREVMQUREUiwgaW5ldF9ydG1fZGVsYWRkciwgTlVMTCk7CisJcnRubF9yZWdpc3RlcihQRl9JTkVULCBSVE1fR0VUQUREUiwgTlVMTCwgaW5ldF9kdW1wX2lmYWRkcik7CiAjaWZkZWYgQ09ORklHX1NZU0NUTAogCWRldmluZXRfc3lzY3RsLnN5c2N0bF9oZWFkZXIgPQogCQlyZWdpc3Rlcl9zeXNjdGxfdGFibGUoZGV2aW5ldF9zeXNjdGwuZGV2aW5ldF9yb290X2Rpcik7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9lc3A0LmMgYi9uZXQvaXB2NC9lc3A0LmMKaW5kZXggMzEwNDExMi4uNDdjOTVlOCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvZXNwNC5jCisrKyBiL25ldC9pcHY0L2VzcDQuYwpAQCAtMjEsMTMgKzIxLDE0IEBACiAJc3RydWN0IGJsa2NpcGhlcl9kZXNjIGRlc2M7CiAJc3RydWN0IGVzcF9kYXRhICplc3A7CiAJc3RydWN0IHNrX2J1ZmYgKnRyYWlsZXI7CisJdTggKnRhaWw7CiAJaW50IGJsa3NpemU7CiAJaW50IGNsZW47CiAJaW50IGFsZW47CiAJaW50IG5mcmFnczsKIAogCS8qIFN0cmlwIElQK0VTUCBoZWFkZXIuICovCi0JX19za2JfcHVsbChza2IsIHNrYi0+aC5yYXcgLSBza2ItPmRhdGEpOworCV9fc2tiX3B1bGwoc2tiLCBza2JfdHJhbnNwb3J0X29mZnNldChza2IpKTsKIAkvKiBOb3cgc2tiIGlzIHB1cmUgcGF5bG9hZCB0byBlbmNyeXB0ICovCiAKIAllcnIgPSAtRU5PTUVNOwpAQCAtNDksMTkgKzUwLDIxIEBACiAJCWdvdG8gZXJyb3I7CiAKIAkvKiBGaWxsIHBhZGRpbmcuLi4gKi8KKwl0YWlsID0gc2tiX3RhaWxfcG9pbnRlcih0cmFpbGVyKTsKIAlkbyB7CiAJCWludCBpOwogCQlmb3IgKGk9MDsgaTxjbGVuLXNrYi0+bGVuIC0gMjsgaSsrKQotCQkJKih1OCopKHRyYWlsZXItPnRhaWwgKyBpKSA9IGkrMTsKKwkJCXRhaWxbaV0gPSBpICsgMTsKIAl9IHdoaWxlICgwKTsKLQkqKHU4KikodHJhaWxlci0+dGFpbCArIGNsZW4tc2tiLT5sZW4gLSAyKSA9IChjbGVuIC0gc2tiLT5sZW4pLTI7CisJdGFpbFtjbGVuIC0gc2tiLT5sZW4gLSAyXSA9IChjbGVuIC0gc2tiLT5sZW4pIC0gMjsKIAlwc2tiX3B1dChza2IsIHRyYWlsZXIsIGNsZW4gLSBza2ItPmxlbik7CiAKLQlfX3NrYl9wdXNoKHNrYiwgc2tiLT5kYXRhIC0gc2tiLT5uaC5yYXcpOwotCXRvcF9pcGggPSBza2ItPm5oLmlwaDsKLQllc3BoID0gKHN0cnVjdCBpcF9lc3BfaGRyICopKHNrYi0+bmgucmF3ICsgdG9wX2lwaC0+aWhsKjQpOworCV9fc2tiX3B1c2goc2tiLCBza2ItPmRhdGEgLSBza2JfbmV0d29ya19oZWFkZXIoc2tiKSk7CisJdG9wX2lwaCA9IGlwX2hkcihza2IpOworCWVzcGggPSAoc3RydWN0IGlwX2VzcF9oZHIgKikoc2tiX25ldHdvcmtfaGVhZGVyKHNrYikgKworCQkJCSAgICAgdG9wX2lwaC0+aWhsICogNCk7CiAJdG9wX2lwaC0+dG90X2xlbiA9IGh0b25zKHNrYi0+bGVuICsgYWxlbik7Ci0JKih1OCopKHRyYWlsZXItPnRhaWwgLSAxKSA9IHRvcF9pcGgtPnByb3RvY29sOworCSooc2tiX3RhaWxfcG9pbnRlcih0cmFpbGVyKSAtIDEpID0gdG9wX2lwaC0+cHJvdG9jb2w7CiAKIAkvKiB0aGlzIGlzIG5vbi1OVUxMIG9ubHkgd2l0aCBVRFAgRW5jYXBzdWxhdGlvbiAqLwogCWlmICh4LT5lbmNhcCkgewpAQCAtMjE3LDEyICsyMjAsMTIgQEAKIAogCS8qIC4uLiBjaGVjayBwYWRkaW5nIGJpdHMgaGVyZS4gU2lsbHkuIDotKSAqLwogCi0JaXBoID0gc2tiLT5uaC5pcGg7CisJaXBoID0gaXBfaGRyKHNrYik7CiAJaWhsID0gaXBoLT5paGwgKiA0OwogCiAJaWYgKHgtPmVuY2FwKSB7CiAJCXN0cnVjdCB4ZnJtX2VuY2FwX3RtcGwgKmVuY2FwID0geC0+ZW5jYXA7Ci0JCXN0cnVjdCB1ZHBoZHIgKnVoID0gKHZvaWQgKikoc2tiLT5uaC5yYXcgKyBpaGwpOworCQlzdHJ1Y3QgdWRwaGRyICp1aCA9ICh2b2lkICopKHNrYl9uZXR3b3JrX2hlYWRlcihza2IpICsgaWhsKTsKIAogCQkvKgogCQkgKiAxKSBpZiB0aGUgTkFULVQgcGVlcidzIElQIG9yIHBvcnQgY2hhbmdlZCB0aGVuCkBAIC0yNjAsNyArMjYzLDggQEAKIAogCWlwaC0+cHJvdG9jb2wgPSBuZXh0aGRyWzFdOwogCXBza2JfdHJpbShza2IsIHNrYi0+bGVuIC0gYWxlbiAtIHBhZGxlbiAtIDIpOwotCXNrYi0+aC5yYXcgPSBfX3NrYl9wdWxsKHNrYiwgc2l6ZW9mKCplc3BoKSArIGVzcC0+Y29uZi5pdmxlbikgLSBpaGw7CisJX19za2JfcHVsbChza2IsIHNpemVvZigqZXNwaCkgKyBlc3AtPmNvbmYuaXZsZW4pOworCXNrYl9zZXRfdHJhbnNwb3J0X2hlYWRlcihza2IsIC1paGwpOwogCiAJcmV0dXJuIDA7CiAKQEAgLTI2OCwzMiArMjcyLDMzIEBACiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKLXN0YXRpYyB1MzIgZXNwNF9nZXRfbWF4X3NpemUoc3RydWN0IHhmcm1fc3RhdGUgKngsIGludCBtdHUpCitzdGF0aWMgdTMyIGVzcDRfZ2V0X210dShzdHJ1Y3QgeGZybV9zdGF0ZSAqeCwgaW50IG10dSkKIHsKIAlzdHJ1Y3QgZXNwX2RhdGEgKmVzcCA9IHgtPmRhdGE7CiAJdTMyIGJsa3NpemUgPSBBTElHTihjcnlwdG9fYmxrY2lwaGVyX2Jsb2Nrc2l6ZShlc3AtPmNvbmYudGZtKSwgNCk7Ci0JaW50IGVuY2xlbiA9IDA7CisJdTMyIGFsaWduID0gbWF4X3QodTMyLCBibGtzaXplLCBlc3AtPmNvbmYucGFkbGVuKTsKKwl1MzIgcmVtOworCisJbXR1IC09IHgtPnByb3BzLmhlYWRlcl9sZW4gKyBlc3AtPmF1dGguaWN2X3RydW5jX2xlbjsKKwlyZW0gPSBtdHUgJiAoYWxpZ24gLSAxKTsKKwltdHUgJj0gfihhbGlnbiAtIDEpOwogCiAJc3dpdGNoICh4LT5wcm9wcy5tb2RlKSB7CiAJY2FzZSBYRlJNX01PREVfVFVOTkVMOgotCQltdHUgPSBBTElHTihtdHUgKzIsIGJsa3NpemUpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCWNhc2UgWEZSTV9NT0RFX1RSQU5TUE9SVDoKIAkJLyogVGhlIHdvcnN0IGNhc2UgKi8KLQkJbXR1ID0gQUxJR04obXR1ICsgMiwgNCkgKyBibGtzaXplIC0gNDsKKwkJbXR1IC09IGJsa3NpemUgLSA0OworCQltdHUgKz0gbWluX3QodTMyLCBibGtzaXplIC0gNCwgcmVtKTsKIAkJYnJlYWs7CiAJY2FzZSBYRlJNX01PREVfQkVFVDoKIAkJLyogVGhlIHdvcnN0IGNhc2UuICovCi0JCWVuY2xlbiA9IElQVjRfQkVFVF9QSE1BWExFTjsKLQkJbXR1ID0gQUxJR04obXR1ICsgZW5jbGVuICsgMiwgYmxrc2l6ZSk7CisJCW10dSArPSBtaW5fdCh1MzIsIElQVjRfQkVFVF9QSE1BWExFTiwgcmVtKTsKIAkJYnJlYWs7CiAJfQogCi0JaWYgKGVzcC0+Y29uZi5wYWRsZW4pCi0JCW10dSA9IEFMSUdOKG10dSwgZXNwLT5jb25mLnBhZGxlbik7Ci0KLQlyZXR1cm4gbXR1ICsgeC0+cHJvcHMuaGVhZGVyX2xlbiArIGVzcC0+YXV0aC5pY3ZfdHJ1bmNfbGVuIC0gZW5jbGVuOworCXJldHVybiBtdHUgLSAyOwogfQogCiBzdGF0aWMgdm9pZCBlc3A0X2VycihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgaW5mbykKQEAgLTMwMiw4ICszMDcsOCBAQAogCXN0cnVjdCBpcF9lc3BfaGRyICplc3BoID0gKHN0cnVjdCBpcF9lc3BfaGRyKikoc2tiLT5kYXRhKyhpcGgtPmlobDw8MikpOwogCXN0cnVjdCB4ZnJtX3N0YXRlICp4OwogCi0JaWYgKHNrYi0+aC5pY21waC0+dHlwZSAhPSBJQ01QX0RFU1RfVU5SRUFDSCB8fAotCSAgICBza2ItPmguaWNtcGgtPmNvZGUgIT0gSUNNUF9GUkFHX05FRURFRCkKKwlpZiAoaWNtcF9oZHIoc2tiKS0+dHlwZSAhPSBJQ01QX0RFU1RfVU5SRUFDSCB8fAorCSAgICBpY21wX2hkcihza2IpLT5jb2RlICE9IElDTVBfRlJBR19ORUVERUQpCiAJCXJldHVybjsKIAogCXggPSB4ZnJtX3N0YXRlX2xvb2t1cCgoeGZybV9hZGRyZXNzX3QgKikmaXBoLT5kYWRkciwgZXNwaC0+c3BpLCBJUFBST1RPX0VTUCwgQUZfSU5FVCk7CkBAIC0zMzYsNiArMzQxLDcgQEAKIHsKIAlzdHJ1Y3QgZXNwX2RhdGEgKmVzcCA9IE5VTEw7CiAJc3RydWN0IGNyeXB0b19ibGtjaXBoZXIgKnRmbTsKKwl1MzIgYWxpZ247CiAKIAkvKiBudWxsIGF1dGggYW5kIGVuY3J5cHRpb24gY2FuIGhhdmUgemVybyBsZW5ndGgga2V5cyAqLwogCWlmICh4LT5hYWxnKSB7CkBAIC00MDIsNiArNDA4LDggQEAKIAl4LT5wcm9wcy5oZWFkZXJfbGVuID0gc2l6ZW9mKHN0cnVjdCBpcF9lc3BfaGRyKSArIGVzcC0+Y29uZi5pdmxlbjsKIAlpZiAoeC0+cHJvcHMubW9kZSA9PSBYRlJNX01PREVfVFVOTkVMKQogCQl4LT5wcm9wcy5oZWFkZXJfbGVuICs9IHNpemVvZihzdHJ1Y3QgaXBoZHIpOworCWVsc2UgaWYgKHgtPnByb3BzLm1vZGUgPT0gWEZSTV9NT0RFX0JFRVQpCisJCXgtPnByb3BzLmhlYWRlcl9sZW4gKz0gSVBWNF9CRUVUX1BITUFYTEVOOwogCWlmICh4LT5lbmNhcCkgewogCQlzdHJ1Y3QgeGZybV9lbmNhcF90bXBsICplbmNhcCA9IHgtPmVuY2FwOwogCkBAIC00MTcsNyArNDI1LDEwIEBACiAJCX0KIAl9CiAJeC0+ZGF0YSA9IGVzcDsKLQl4LT5wcm9wcy50cmFpbGVyX2xlbiA9IGVzcDRfZ2V0X21heF9zaXplKHgsIDApIC0geC0+cHJvcHMuaGVhZGVyX2xlbjsKKwlhbGlnbiA9IEFMSUdOKGNyeXB0b19ibGtjaXBoZXJfYmxvY2tzaXplKGVzcC0+Y29uZi50Zm0pLCA0KTsKKwlpZiAoZXNwLT5jb25mLnBhZGxlbikKKwkJYWxpZ24gPSBtYXhfdCh1MzIsIGFsaWduLCBlc3AtPmNvbmYucGFkbGVuKTsKKwl4LT5wcm9wcy50cmFpbGVyX2xlbiA9IGFsaWduICsgMSArIGVzcC0+YXV0aC5pY3ZfdHJ1bmNfbGVuOwogCXJldHVybiAwOwogCiBlcnJvcjoKQEAgLTQzNCw3ICs0NDUsNyBAQAogCS5wcm90bwkgICAgIAk9IElQUFJPVE9fRVNQLAogCS5pbml0X3N0YXRlCT0gZXNwX2luaXRfc3RhdGUsCiAJLmRlc3RydWN0b3IJPSBlc3BfZGVzdHJveSwKLQkuZ2V0X21heF9zaXplCT0gZXNwNF9nZXRfbWF4X3NpemUsCisJLmdldF9tdHUJPSBlc3A0X2dldF9tdHUsCiAJLmlucHV0CQk9IGVzcF9pbnB1dCwKIAkub3V0cHV0CQk9IGVzcF9vdXRwdXQKIH07CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9maWJfZnJvbnRlbmQuYyBiL25ldC9pcHY0L2ZpYl9mcm9udGVuZC5jCmluZGV4IGNhYzA2YzQuLjgzN2YyOTUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2ZpYl9mcm9udGVuZC5jCisrKyBiL25ldC9pcHY0L2ZpYl9mcm9udGVuZC5jCkBAIC0zNCw3ICszNCw2IEBACiAjaW5jbHVkZSA8bGludXgvaWZfYWRkci5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogCkBAIC00Niw2ICs0NSw3IEBACiAjaW5jbHVkZSA8bmV0L2ljbXAuaD4KICNpbmNsdWRlIDxuZXQvYXJwLmg+CiAjaW5jbHVkZSA8bmV0L2lwX2ZpYi5oPgorI2luY2x1ZGUgPG5ldC9ydG5ldGxpbmsuaD4KIAogI2RlZmluZSBGRnByaW50KGEuLi4pIHByaW50ayhLRVJOX0RFQlVHIGEpCiAKQEAgLTU0MCw3ICs1NDAsNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLWludCBpbmV0X3J0bV9kZWxyb3V0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgbmxtc2doZHIqIG5saCwgdm9pZCAqYXJnKQorc3RhdGljIGludCBpbmV0X3J0bV9kZWxyb3V0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgbmxtc2doZHIqIG5saCwgdm9pZCAqYXJnKQogewogCXN0cnVjdCBmaWJfY29uZmlnIGNmZzsKIAlzdHJ1Y3QgZmliX3RhYmxlICp0YjsKQEAgLTU2MSw3ICs1NjEsNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLWludCBpbmV0X3J0bV9uZXdyb3V0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgbmxtc2doZHIqIG5saCwgdm9pZCAqYXJnKQorc3RhdGljIGludCBpbmV0X3J0bV9uZXdyb3V0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgbmxtc2doZHIqIG5saCwgdm9pZCAqYXJnKQogewogCXN0cnVjdCBmaWJfY29uZmlnIGNmZzsKIAlzdHJ1Y3QgZmliX3RhYmxlICp0YjsKQEAgLTU4Miw3ICs1ODIsNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLWludCBpbmV0X2R1bXBfZmliKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYikKK3N0YXRpYyBpbnQgaW5ldF9kdW1wX2ZpYihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpCiB7CiAJdW5zaWduZWQgaW50IGgsIHNfaDsKIAl1bnNpZ25lZCBpbnQgZSA9IDAsIHNfZTsKQEAgLTc3Nyw2ICs3NzcsMTAgQEAKIAkJCQkJCQkgICAgLnRvcyA9IGZybi0+ZmxfdG9zLAogCQkJCQkJCSAgICAuc2NvcGUgPSBmcm4tPmZsX3Njb3BlIH0gfSB9OwogCisjaWZkZWYgQ09ORklHX0lQX01VTFRJUExFX1RBQkxFUworCXJlcy5yID0gTlVMTDsKKyNlbmRpZgorCiAJZnJuLT5lcnIgPSAtRU5PRU5UOwogCWlmICh0YikgewogCQlsb2NhbF9iaF9kaXNhYmxlKCk7CkBAIC04MDcsNyArODExLDcgQEAKIAlpZiAoc2tiID09IE5VTEwpCiAJCXJldHVybjsKIAotCW5saCA9IChzdHJ1Y3Qgbmxtc2doZHIgKilza2ItPmRhdGE7CisJbmxoID0gbmxtc2dfaGRyKHNrYik7CiAJaWYgKHNrYi0+bGVuIDwgTkxNU0dfU1BBQ0UoMCkgfHwgc2tiLT5sZW4gPCBubGgtPm5sbXNnX2xlbiB8fAogCSAgICBubGgtPm5sbXNnX2xlbiA8IE5MTVNHX0xFTkdUSChzaXplb2YoKmZybikpKSB7CiAJCWtmcmVlX3NrYihza2IpOwpAQCAtODI3LDcgKzgzMSw4IEBACiAKIHN0YXRpYyB2b2lkIG5sX2ZpYl9sb29rdXBfaW5pdCh2b2lkKQogewotICAgICAgbmV0bGlua19rZXJuZWxfY3JlYXRlKE5FVExJTktfRklCX0xPT0tVUCwgMCwgbmxfZmliX2lucHV0LCBUSElTX01PRFVMRSk7CisgICAgICBuZXRsaW5rX2tlcm5lbF9jcmVhdGUoTkVUTElOS19GSUJfTE9PS1VQLCAwLCBubF9maWJfaW5wdXQsIE5VTEwsCisgICAgICAJCQkgICAgVEhJU19NT0RVTEUpOwogfQogCiBzdGF0aWMgdm9pZCBmaWJfZGlzYWJsZV9pcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgZm9yY2UpCkBAIC05MjUsNiArOTMwLDEwIEBACiAJcmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZmaWJfbmV0ZGV2X25vdGlmaWVyKTsKIAlyZWdpc3Rlcl9pbmV0YWRkcl9ub3RpZmllcigmZmliX2luZXRhZGRyX25vdGlmaWVyKTsKIAlubF9maWJfbG9va3VwX2luaXQoKTsKKworCXJ0bmxfcmVnaXN0ZXIoUEZfSU5FVCwgUlRNX05FV1JPVVRFLCBpbmV0X3J0bV9uZXdyb3V0ZSwgTlVMTCk7CisJcnRubF9yZWdpc3RlcihQRl9JTkVULCBSVE1fREVMUk9VVEUsIGluZXRfcnRtX2RlbHJvdXRlLCBOVUxMKTsKKwlydG5sX3JlZ2lzdGVyKFBGX0lORVQsIFJUTV9HRVRST1VURSwgTlVMTCwgaW5ldF9kdW1wX2ZpYik7CiB9CiAKIEVYUE9SVF9TWU1CT0woaW5ldF9hZGRyX3R5cGUpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvZmliX2hhc2guYyBiL25ldC9pcHY0L2ZpYl9oYXNoLmMKaW5kZXggYTQ5NDlmOS4uOWNmZWNmMSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvZmliX2hhc2guYworKysgYi9uZXQvaXB2NC9maWJfaGFzaC5jCkBAIC0xMDI3LDcgKzEwMjcsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIGZpYl9zZXFfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBmaWJfc2VxX29wcyA9IHsKIAkuc3RhcnQgID0gZmliX3NlcV9zdGFydCwKIAkubmV4dCAgID0gZmliX3NlcV9uZXh0LAogCS5zdG9wICAgPSBmaWJfc2VxX3N0b3AsCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9maWJfcnVsZXMuYyBiL25ldC9pcHY0L2ZpYl9ydWxlcy5jCmluZGV4IGM2NjBjMDcuLjMzMDgzYWQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2ZpYl9ydWxlcy5jCisrKyBiL25ldC9pcHY0L2ZpYl9ydWxlcy5jCkBAIC0yNzQsMTEgKzI3NCw2IEBACiAJcmV0dXJuIC1FTk9CVUZTOwogfQogCi1pbnQgZmliNF9ydWxlc19kdW1wKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYikKLXsKLQlyZXR1cm4gZmliX3J1bGVzX2R1bXAoc2tiLCBjYiwgQUZfSU5FVCk7Ci19Ci0KIHN0YXRpYyB1MzIgZmliNF9ydWxlX2RlZmF1bHRfcHJlZih2b2lkKQogewogCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsKQEAgLTMwMyw2ICsyOTgsMTEgQEAKIAkgICAgICAgKyBubGFfdG90YWxfc2l6ZSg0KTsgLyogZmxvdyAqLwogfQogCitzdGF0aWMgdm9pZCBmaWI0X3J1bGVfZmx1c2hfY2FjaGUodm9pZCkKK3sKKwlydF9jYWNoZV9mbHVzaCgtMSk7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgZmliX3J1bGVzX29wcyBmaWI0X3J1bGVzX29wcyA9IHsKIAkuZmFtaWx5CQk9IEFGX0lORVQsCiAJLnJ1bGVfc2l6ZQk9IHNpemVvZihzdHJ1Y3QgZmliNF9ydWxlKSwKQEAgLTMxNCw2ICszMTQsNyBAQAogCS5maWxsCQk9IGZpYjRfcnVsZV9maWxsLAogCS5kZWZhdWx0X3ByZWYJPSBmaWI0X3J1bGVfZGVmYXVsdF9wcmVmLAogCS5ubG1zZ19wYXlsb2FkCT0gZmliNF9ydWxlX25sbXNnX3BheWxvYWQsCisJLmZsdXNoX2NhY2hlCT0gZmliNF9ydWxlX2ZsdXNoX2NhY2hlLAogCS5ubGdyb3VwCT0gUlROTEdSUF9JUFY0X1JVTEUsCiAJLnBvbGljeQkJPSBmaWI0X3J1bGVfcG9saWN5LAogCS5ydWxlc19saXN0CT0gJmZpYjRfcnVsZXMsCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9maWJfc2VtYW50aWNzLmMgYi9uZXQvaXB2NC9maWJfc2VtYW50aWNzLmMKaW5kZXggM2RhZDEyZS4uNDA2ZWE3MCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvZmliX3NlbWFudGljcy5jCisrKyBiL25ldC9pcHY0L2ZpYl9zZW1hbnRpY3MuYwpAQCAtOTI3LDcgKzkyNyw3IEBACiAJCQlkZWZhdWx0OgogCQkJCXByaW50ayhLRVJOX0RFQlVHICJpbXBvc3NpYmxlIDEwMlxuIik7CiAJCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl9OworCQkJfQogCQl9CiAJCXJldHVybiBlcnI7CiAJfQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvZmliX3RyaWUuYyBiL25ldC9pcHY0L2ZpYl90cmllLmMKaW5kZXggMjE0YzM0Ny4uOWJlN2RhNyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvZmliX3RyaWUuYworKysgYi9uZXQvaXB2NC9maWJfdHJpZS5jCkBAIC01MCw3ICs1MCw3IEBACiAgKgkJUGF0cmljayBNY0hhcmR5IDxrYWJlckB0cmFzaC5uZXQ+CiAgKi8KIAotI2RlZmluZSBWRVJTSU9OICIwLjQwNyIKKyNkZWZpbmUgVkVSU0lPTiAiMC40MDgiCiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KQEAgLTI5Miw4ICsyOTIsOCBAQAogCiBzdGF0aWMgaW50IGhhbHZlX3RocmVzaG9sZCA9IDI1Owogc3RhdGljIGludCBpbmZsYXRlX3RocmVzaG9sZCA9IDUwOwotc3RhdGljIGludCBoYWx2ZV90aHJlc2hvbGRfcm9vdCA9IDE1Owotc3RhdGljIGludCBpbmZsYXRlX3RocmVzaG9sZF9yb290ID0gMjU7CitzdGF0aWMgaW50IGhhbHZlX3RocmVzaG9sZF9yb290ID0gODsKK3N0YXRpYyBpbnQgaW5mbGF0ZV90aHJlc2hvbGRfcm9vdCA9IDE1OwogCiAKIHN0YXRpYyB2b2lkIF9fYWxpYXNfZnJlZV9tZW0oc3RydWN0IHJjdV9oZWFkICpoZWFkKQpAQCAtMzUwLDExICszNTAsMTAgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIHRub2RlX2ZyZWUoc3RydWN0IHRub2RlICp0bikKIHsKLQlpZihJU19MRUFGKHRuKSkgeworCWlmIChJU19MRUFGKHRuKSkgewogCQlzdHJ1Y3QgbGVhZiAqbCA9IChzdHJ1Y3QgbGVhZiAqKSB0bjsKIAkJY2FsbF9yY3VfYmgoJmwtPnJjdSwgX19sZWFmX2ZyZWVfcmN1KTsKLQl9Ci0JZWxzZQorCX0gZWxzZQogCQljYWxsX3JjdSgmdG4tPnJjdSwgX190bm9kZV9mcmVlX3JjdSk7CiB9CiAKQEAgLTQ1OSw2ICs0NTgsNyBAQAogCXN0cnVjdCB0bm9kZSAqb2xkX3RuOwogCWludCBpbmZsYXRlX3RocmVzaG9sZF91c2U7CiAJaW50IGhhbHZlX3RocmVzaG9sZF91c2U7CisJaW50IG1heF9yZXNpemU7CiAKIAlpZiAoIXRuKQogCQlyZXR1cm4gTlVMTDsKQEAgLTU1MywxMyArNTUzLDE0IEBACiAKIAkvKiBLZWVwIHJvb3Qgbm9kZSBsYXJnZXIgICovCiAKLQlpZighdG4tPnBhcmVudCkKKwlpZiAoIXRuLT5wYXJlbnQpCiAJCWluZmxhdGVfdGhyZXNob2xkX3VzZSA9IGluZmxhdGVfdGhyZXNob2xkX3Jvb3Q7CiAJZWxzZQogCQlpbmZsYXRlX3RocmVzaG9sZF91c2UgPSBpbmZsYXRlX3RocmVzaG9sZDsKIAogCWVyciA9IDA7Ci0Jd2hpbGUgKCh0bi0+ZnVsbF9jaGlsZHJlbiA+IDAgJiYKKwltYXhfcmVzaXplID0gMTA7CisJd2hpbGUgKCh0bi0+ZnVsbF9jaGlsZHJlbiA+IDAgJiYgIG1heF9yZXNpemUtLSAmJgogCSAgICAgICA1MCAqICh0bi0+ZnVsbF9jaGlsZHJlbiArIHRub2RlX2NoaWxkX2xlbmd0aCh0bikgLSB0bi0+ZW1wdHlfY2hpbGRyZW4pID49CiAJCQkJaW5mbGF0ZV90aHJlc2hvbGRfdXNlICogdG5vZGVfY2hpbGRfbGVuZ3RoKHRuKSkpIHsKIApAQCAtNTc0LDYgKzU3NSwxNSBAQAogCQl9CiAJfQogCisJaWYgKG1heF9yZXNpemUgPCAwKSB7CisJCWlmICghdG4tPnBhcmVudCkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkZpeCBpbmZsYXRlX3RocmVzaG9sZF9yb290LiBOb3c9JWQgc2l6ZT0lZCBiaXRzXG4iLAorCQkJICAgICAgIGluZmxhdGVfdGhyZXNob2xkX3Jvb3QsIHRuLT5iaXRzKTsKKwkJZWxzZQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiRml4IGluZmxhdGVfdGhyZXNob2xkLiBOb3c9JWQgc2l6ZT0lZCBiaXRzXG4iLAorCQkJICAgICAgIGluZmxhdGVfdGhyZXNob2xkLCB0bi0+Yml0cyk7CisJfQorCiAJY2hlY2tfdG5vZGUodG4pOwogCiAJLyoKQEAgLTU4NCwxMyArNTk0LDE0IEBACiAKIAkvKiBLZWVwIHJvb3Qgbm9kZSBsYXJnZXIgICovCiAKLQlpZighdG4tPnBhcmVudCkKKwlpZiAoIXRuLT5wYXJlbnQpCiAJCWhhbHZlX3RocmVzaG9sZF91c2UgPSBoYWx2ZV90aHJlc2hvbGRfcm9vdDsKIAllbHNlCiAJCWhhbHZlX3RocmVzaG9sZF91c2UgPSBoYWx2ZV90aHJlc2hvbGQ7CiAKIAllcnIgPSAwOwotCXdoaWxlICh0bi0+Yml0cyA+IDEgJiYKKwltYXhfcmVzaXplID0gMTA7CisJd2hpbGUgKHRuLT5iaXRzID4gMSAmJiAgbWF4X3Jlc2l6ZS0tICYmCiAJICAgICAgIDEwMCAqICh0bm9kZV9jaGlsZF9sZW5ndGgodG4pIC0gdG4tPmVtcHR5X2NoaWxkcmVuKSA8CiAJICAgICAgIGhhbHZlX3RocmVzaG9sZF91c2UgKiB0bm9kZV9jaGlsZF9sZW5ndGgodG4pKSB7CiAKQEAgLTYwNSw2ICs2MTYsMTQgQEAKIAkJfQogCX0KIAorCWlmIChtYXhfcmVzaXplIDwgMCkgeworCQlpZiAoIXRuLT5wYXJlbnQpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJGaXggaGFsdmVfdGhyZXNob2xkX3Jvb3QuIE5vdz0lZCBzaXplPSVkIGJpdHNcbiIsCisJCQkgICAgICAgaGFsdmVfdGhyZXNob2xkX3Jvb3QsIHRuLT5iaXRzKTsKKwkJZWxzZQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiRml4IGhhbHZlX3RocmVzaG9sZC4gTm93PSVkIHNpemU9JWQgYml0c1xuIiwKKwkJCSAgICAgICBoYWx2ZV90aHJlc2hvbGQsIHRuLT5iaXRzKTsKKwl9CiAKIAkvKiBPbmx5IG9uZSBjaGlsZCByZW1haW5zICovCiAJaWYgKHRuLT5lbXB0eV9jaGlsZHJlbiA9PSB0bm9kZV9jaGlsZF9sZW5ndGgodG4pIC0gMSkKQEAgLTIwMzksMTIgKzIwNTgsMTIgQEAKIHsKIAlzdHJ1Y3Qgbm9kZSAqbiA7CiAKLQlpZighdCkKKwlpZiAoIXQpCiAJCXJldHVybiBOVUxMOwogCiAJbiA9IHJjdV9kZXJlZmVyZW5jZSh0LT50cmllKTsKIAotCWlmKCFpdGVyKQorCWlmICghaXRlcikKIAkJcmV0dXJuIE5VTEw7CiAKIAlpZiAobikgewpAQCAtMjA4NCw3ICsyMTAzLDcgQEAKIAkJCWludCBpOwogCiAJCQlzLT50bm9kZXMrKzsKLQkJCWlmKHRuLT5iaXRzIDwgTUFYX1NUQVRfREVQVEgpCisJCQlpZiAodG4tPmJpdHMgPCBNQVhfU1RBVF9ERVBUSCkKIAkJCQlzLT5ub2Rlc2l6ZXNbdG4tPmJpdHNdKys7CiAKIAkJCWZvciAoaSA9IDA7IGkgPCAoMTw8dG4tPmJpdHMpOyBpKyspCkBAIC0yMjUwLDcgKzIyNjksNyBAQAogewogCXN0YXRpYyBjaGFyIGJ1ZlszMl07CiAKLQlzd2l0Y2gocykgeworCXN3aXRjaCAocykgewogCWNhc2UgUlRfU0NPUEVfVU5JVkVSU0U6IHJldHVybiAidW5pdmVyc2UiOwogCWNhc2UgUlRfU0NPUEVfU0lURToJcmV0dXJuICJzaXRlIjsKIAljYXNlIFJUX1NDT1BFX0xJTks6CXJldHVybiAibGluayI7CkBAIC0yMzQwLDcgKzIzNTksNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIGZpYl90cmllX3NlcV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNlcV9vcGVyYXRpb25zIGZpYl90cmllX3NlcV9vcHMgPSB7CiAJLnN0YXJ0ICA9IGZpYl90cmllX3NlcV9zdGFydCwKIAkubmV4dCAgID0gZmliX3RyaWVfc2VxX25leHQsCiAJLnN0b3AgICA9IGZpYl90cmllX3NlcV9zdG9wLApAQCAtMjQ2MSw3ICsyNDgwLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBmaWJfcm91dGVfc2VxX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgZmliX3JvdXRlX3NlcV9vcHMgPSB7CiAJLnN0YXJ0ICA9IGZpYl90cmllX3NlcV9zdGFydCwKIAkubmV4dCAgID0gZmliX3RyaWVfc2VxX25leHQsCiAJLnN0b3AgICA9IGZpYl90cmllX3NlcV9zdG9wLApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaWNtcC5jIGIvbmV0L2lwdjQvaWNtcC5jCmluZGV4IDRiN2EwZDkuLmQzOGNiYmEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2ljbXAuYworKysgYi9uZXQvaXB2NC9pY21wLmMKQEAgLTM1NSw3ICszNTUsNyBAQAogCQkJICAgaXBjLCBydCwgTVNHX0RPTlRXQUlUKSA8IDApCiAJCWlwX2ZsdXNoX3BlbmRpbmdfZnJhbWVzKGljbXBfc29ja2V0LT5zayk7CiAJZWxzZSBpZiAoKHNrYiA9IHNrYl9wZWVrKCZpY21wX3NvY2tldC0+c2stPnNrX3dyaXRlX3F1ZXVlKSkgIT0gTlVMTCkgewotCQlzdHJ1Y3QgaWNtcGhkciAqaWNtcGggPSBza2ItPmguaWNtcGg7CisJCXN0cnVjdCBpY21waGRyICppY21waCA9IGljbXBfaGRyKHNrYik7CiAJCV9fd3N1bSBjc3VtID0gMDsKIAkJc3RydWN0IHNrX2J1ZmYgKnNrYjE7CiAKQEAgLTM5Miw3ICszOTIsNyBAQAogCWljbXBfcGFyYW0tPmRhdGEuaWNtcGguY2hlY2tzdW0gPSAwOwogCWljbXBfb3V0X2NvdW50KGljbXBfcGFyYW0tPmRhdGEuaWNtcGgudHlwZSk7CiAKLQlpbmV0LT50b3MgPSBza2ItPm5oLmlwaC0+dG9zOworCWluZXQtPnRvcyA9IGlwX2hkcihza2IpLT50b3M7CiAJZGFkZHIgPSBpcGMuYWRkciA9IHJ0LT5ydF9zcmM7CiAJaXBjLm9wdCA9IE5VTEw7CiAJaWYgKGljbXBfcGFyYW0tPnJlcGx5b3B0cy5vcHRsZW4pIHsKQEAgLTQwNCw3ICs0MDQsNyBAQAogCQlzdHJ1Y3QgZmxvd2kgZmwgPSB7IC5ubF91ID0geyAuaXA0X3UgPQogCQkJCQkgICAgICB7IC5kYWRkciA9IGRhZGRyLAogCQkJCQkJLnNhZGRyID0gcnQtPnJ0X3NwZWNfZHN0LAotCQkJCQkJLnRvcyA9IFJUX1RPUyhza2ItPm5oLmlwaC0+dG9zKSB9IH0sCisJCQkJCQkudG9zID0gUlRfVE9TKGlwX2hkcihza2IpLT50b3MpIH0gfSwKIAkJCQkgICAgLnByb3RvID0gSVBQUk9UT19JQ01QIH07CiAJCXNlY3VyaXR5X3NrYl9jbGFzc2lmeV9mbG93KHNrYiwgJmZsKTsKIAkJaWYgKGlwX3JvdXRlX291dHB1dF9rZXkoJnJ0LCAmZmwpKQpAQCAtNDQ4LDkgKzQ0OCwxMCBAQAogCSAqCUNoZWNrIHRoaXMsIGljbXBfc2VuZCBpcyBjYWxsZWQgZnJvbSB0aGUgbW9zdCBvYnNjdXJlIGRldmljZXMKIAkgKglzb21ldGltZXMuCiAJICovCi0JaXBoID0gc2tiX2luLT5uaC5pcGg7CisJaXBoID0gaXBfaGRyKHNrYl9pbik7CiAKLQlpZiAoKHU4ICopaXBoIDwgc2tiX2luLT5oZWFkIHx8ICh1OCAqKShpcGggKyAxKSA+IHNrYl9pbi0+dGFpbCkKKwlpZiAoKHU4ICopaXBoIDwgc2tiX2luLT5oZWFkIHx8CisJICAgIChza2JfaW4tPm5ldHdvcmtfaGVhZGVyICsgc2l6ZW9mKCppcGgpKSA+IHNrYl9pbi0+dGFpbCkKIAkJZ290byBvdXQ7CiAKIAkvKgpAQCAtNDg0LDcgKzQ4NSw3IEBACiAJCQl1OCBfaW5uZXJfdHlwZSwgKml0cDsKIAogCQkJaXRwID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYl9pbiwKLQkJCQkJCSBza2JfaW4tPm5oLnJhdyArCisJCQkJCQkgc2tiX25ldHdvcmtfaGVhZGVyKHNrYl9pbikgKwogCQkJCQkJIChpcGgtPmlobCA8PCAyKSArCiAJCQkJCQkgb2Zmc2V0b2Yoc3RydWN0IGljbXBoZHIsCiAJCQkJCQkJICB0eXBlKSAtCkBAIC01MzYsNyArNTM3LDcgQEAKIAlpY21wX3BhcmFtLmRhdGEuaWNtcGgudW4uZ2F0ZXdheSA9IGluZm87CiAJaWNtcF9wYXJhbS5kYXRhLmljbXBoLmNoZWNrc3VtCSA9IDA7CiAJaWNtcF9wYXJhbS5za2IJICA9IHNrYl9pbjsKLQlpY21wX3BhcmFtLm9mZnNldCA9IHNrYl9pbi0+bmgucmF3IC0gc2tiX2luLT5kYXRhOworCWljbXBfcGFyYW0ub2Zmc2V0ID0gc2tiX25ldHdvcmtfb2Zmc2V0KHNrYl9pbik7CiAJaWNtcF9vdXRfY291bnQoaWNtcF9wYXJhbS5kYXRhLmljbXBoLnR5cGUpOwogCWluZXRfc2soaWNtcF9zb2NrZXQtPnNrKS0+dG9zID0gdG9zOwogCWlwYy5hZGRyID0gaXBoLT5zYWRkcjsKQEAgLTYxMyw3ICs2MTQsNyBAQAogCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgaXBoZHIpKSkKIAkJZ290byBvdXRfZXJyOwogCi0JaWNtcGggPSBza2ItPmguaWNtcGg7CisJaWNtcGggPSBpY21wX2hkcihza2IpOwogCWlwaCAgID0gKHN0cnVjdCBpcGhkciAqKXNrYi0+ZGF0YTsKIAogCWlmIChpcGgtPmlobCA8IDUpIC8qIE1hbmdsZWQgaGVhZGVyLCBkcm9wLiAqLwpAQCAtNjc2LDcgKzY3Nyw3IEBACiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICIldS4ldS4ldS4ldSBzZW50IGFuIGludmFsaWQgSUNNUCAiCiAJCQkJCSAgICAidHlwZSAldSwgY29kZSAldSAiCiAJCQkJCSAgICAiZXJyb3IgdG8gYSBicm9hZGNhc3Q6ICV1LiV1LiV1LiV1IG9uICVzXG4iLAotCQkJICAgICAgIE5JUFFVQUQoc2tiLT5uaC5pcGgtPnNhZGRyKSwKKwkJCSAgICAgICBOSVBRVUFEKGlwX2hkcihza2IpLT5zYWRkciksCiAJCQkgICAgICAgaWNtcGgtPnR5cGUsIGljbXBoLT5jb2RlLAogCQkJICAgICAgIE5JUFFVQUQoaXBoLT5kYWRkciksCiAJCQkgICAgICAgc2tiLT5kZXYtPm5hbWUpOwpAQCAtNzQzLDcgKzc0NCw3IEBACiAKIAlpcGggPSAoc3RydWN0IGlwaGRyICopc2tiLT5kYXRhOwogCi0Jc3dpdGNoIChza2ItPmguaWNtcGgtPmNvZGUgJiA3KSB7CisJc3dpdGNoIChpY21wX2hkcihza2IpLT5jb2RlICYgNykgewogCWNhc2UgSUNNUF9SRURJUl9ORVQ6CiAJY2FzZSBJQ01QX1JFRElSX05FVFRPUzoKIAkJLyoKQEAgLTc1MSw4ICs3NTIsOCBAQAogCQkgKi8KIAljYXNlIElDTVBfUkVESVJfSE9TVDoKIAljYXNlIElDTVBfUkVESVJfSE9TVFRPUzoKLQkJaXBfcnRfcmVkaXJlY3Qoc2tiLT5uaC5pcGgtPnNhZGRyLCBpcGgtPmRhZGRyLAotCQkJICAgICAgIHNrYi0+aC5pY21waC0+dW4uZ2F0ZXdheSwKKwkJaXBfcnRfcmVkaXJlY3QoaXBfaGRyKHNrYiktPnNhZGRyLCBpcGgtPmRhZGRyLAorCQkJICAgICAgIGljbXBfaGRyKHNrYiktPnVuLmdhdGV3YXksCiAJCQkgICAgICAgaXBoLT5zYWRkciwgc2tiLT5kZXYpOwogCQlicmVhazsKIAl9CkBAIC03ODAsNyArNzgxLDcgQEAKIAlpZiAoIXN5c2N0bF9pY21wX2VjaG9faWdub3JlX2FsbCkgewogCQlzdHJ1Y3QgaWNtcF9ieG0gaWNtcF9wYXJhbTsKIAotCQlpY21wX3BhcmFtLmRhdGEuaWNtcGgJICAgPSAqc2tiLT5oLmljbXBoOworCQlpY21wX3BhcmFtLmRhdGEuaWNtcGgJICAgPSAqaWNtcF9oZHIoc2tiKTsKIAkJaWNtcF9wYXJhbS5kYXRhLmljbXBoLnR5cGUgPSBJQ01QX0VDSE9SRVBMWTsKIAkJaWNtcF9wYXJhbS5za2IJCSAgID0gc2tiOwogCQlpY21wX3BhcmFtLm9mZnNldAkgICA9IDA7CkBAIC04MTYsNyArODE3LDcgQEAKIAlpY21wX3BhcmFtLmRhdGEudGltZXNbMl0gPSBpY21wX3BhcmFtLmRhdGEudGltZXNbMV07CiAJaWYgKHNrYl9jb3B5X2JpdHMoc2tiLCAwLCAmaWNtcF9wYXJhbS5kYXRhLnRpbWVzWzBdLCA0KSkKIAkJQlVHKCk7Ci0JaWNtcF9wYXJhbS5kYXRhLmljbXBoCSAgID0gKnNrYi0+aC5pY21waDsKKwlpY21wX3BhcmFtLmRhdGEuaWNtcGgJICAgPSAqaWNtcF9oZHIoc2tiKTsKIAlpY21wX3BhcmFtLmRhdGEuaWNtcGgudHlwZSA9IElDTVBfVElNRVNUQU1QUkVQTFk7CiAJaWNtcF9wYXJhbS5kYXRhLmljbXBoLmNvZGUgPSAwOwogCWljbXBfcGFyYW0uc2tiCQkgICA9IHNrYjsKQEAgLTk0Myw3ICs5NDQsNyBAQAogCWlmICghcHNrYl9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCBpY21waGRyKSkpCiAJCWdvdG8gZXJyb3I7CiAKLQlpY21waCA9IHNrYi0+aC5pY21waDsKKwlpY21waCA9IGljbXBfaGRyKHNrYik7CiAKIAkvKgogCSAqCTE4IGlzIHRoZSBoaWdoZXN0ICdrbm93bicgSUNNUCB0eXBlLiBBbnl0aGluZyBlbHNlIGlzIGEgbXlzdGVyeQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaWdtcC5jIGIvbmV0L2lwdjQvaWdtcC5jCmluZGV4IDhjZWRiMmEuLjI1MDYwMjEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lnbXAuYworKysgYi9uZXQvaXB2NC9pZ21wLmMKQEAgLTMxNCw3ICszMTQsOSBAQAogCiAJc2tiX3Jlc2VydmUoc2tiLCBMTF9SRVNFUlZFRF9TUEFDRShkZXYpKTsKIAotCXNrYi0+bmguaXBoID0gcGlwID0oc3RydWN0IGlwaGRyICopc2tiX3B1dChza2IsIHNpemVvZihzdHJ1Y3QgaXBoZHIpKzQpOworCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOworCXBpcCA9IGlwX2hkcihza2IpOworCXNrYl9wdXQoc2tiLCBzaXplb2Yoc3RydWN0IGlwaGRyKSArIDQpOwogCiAJcGlwLT52ZXJzaW9uICA9IDQ7CiAJcGlwLT5paGwgICAgICA9IChzaXplb2Yoc3RydWN0IGlwaGRyKSs0KT4+MjsKQEAgLTMzMSw4ICszMzMsOSBAQAogCSgodTgqKSZwaXBbMV0pWzJdID0gMDsKIAkoKHU4KikmcGlwWzFdKVszXSA9IDA7CiAKLQlwaWcgPShzdHJ1Y3QgaWdtcHYzX3JlcG9ydCAqKXNrYl9wdXQoc2tiLCBzaXplb2YoKnBpZykpOwotCXNrYi0+aC5pZ21waCA9IChzdHJ1Y3QgaWdtcGhkciAqKXBpZzsKKwlza2ItPnRyYW5zcG9ydF9oZWFkZXIgPSBza2ItPm5ldHdvcmtfaGVhZGVyICsgc2l6ZW9mKHN0cnVjdCBpcGhkcikgKyA0OworCXNrYl9wdXQoc2tiLCBzaXplb2YoKnBpZykpOworCXBpZyA9IGlnbXB2M19yZXBvcnRfaGRyKHNrYik7CiAJcGlnLT50eXBlID0gSUdNUFYzX0hPU1RfTUVNQkVSU0hJUF9SRVBPUlQ7CiAJcGlnLT5yZXN2MSA9IDA7CiAJcGlnLT5jc3VtID0gMDsKQEAgLTM0MywxNiArMzQ2LDE0IEBACiAKIHN0YXRpYyBpbnQgaWdtcHYzX3NlbmRwYWNrKHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0Jc3RydWN0IGlwaGRyICpwaXAgPSBza2ItPm5oLmlwaDsKLQlzdHJ1Y3QgaWdtcGhkciAqcGlnID0gc2tiLT5oLmlnbXBoOwotCWludCBpcGxlbiwgaWdtcGxlbjsKKwlzdHJ1Y3QgaXBoZHIgKnBpcCA9IGlwX2hkcihza2IpOworCXN0cnVjdCBpZ21waGRyICpwaWcgPSBpZ21wX2hkcihza2IpOworCWNvbnN0IGludCBpcGxlbiA9IHNrYi0+dGFpbCAtIHNrYi0+bmV0d29ya19oZWFkZXI7CisJY29uc3QgaW50IGlnbXBsZW4gPSBza2ItPnRhaWwgLSBza2ItPnRyYW5zcG9ydF9oZWFkZXI7CiAKLQlpcGxlbiA9IHNrYi0+dGFpbCAtICh1bnNpZ25lZCBjaGFyICopc2tiLT5uaC5pcGg7CiAJcGlwLT50b3RfbGVuID0gaHRvbnMoaXBsZW4pOwogCWlwX3NlbmRfY2hlY2socGlwKTsKLQotCWlnbXBsZW4gPSBza2ItPnRhaWwgLSAodW5zaWduZWQgY2hhciAqKXNrYi0+aC5pZ21waDsKLQlwaWctPmNzdW0gPSBpcF9jb21wdXRlX2NzdW0oKHZvaWQgKilza2ItPmguaWdtcGgsIGlnbXBsZW4pOworCXBpZy0+Y3N1bSA9IGlwX2NvbXB1dGVfY3N1bShpZ21wX2hkcihza2IpLCBpZ21wbGVuKTsKIAogCXJldHVybiBORl9IT09LKFBGX0lORVQsIE5GX0lQX0xPQ0FMX09VVCwgc2tiLCBOVUxMLCBza2ItPmRldiwKIAkJICAgICAgIGRzdF9vdXRwdXQpOwpAQCAtMzc5LDcgKzM4MCw3IEBACiAJcGdyLT5ncmVjX2F1eHdvcmRzID0gMDsKIAlwZ3ItPmdyZWNfbnNyY3MgPSAwOwogCXBnci0+Z3JlY19tY2EgPSBwbWMtPm11bHRpYWRkcjsKLQlwaWggPSAoc3RydWN0IGlnbXB2M19yZXBvcnQgKilza2ItPmguaWdtcGg7CisJcGloID0gaWdtcHYzX3JlcG9ydF9oZHIoc2tiKTsKIAlwaWgtPm5ncmVjID0gaHRvbnMobnRvaHMocGloLT5uZ3JlYykrMSk7CiAJKnBwZ3IgPSBwZ3I7CiAJcmV0dXJuIHNrYjsKQEAgLTQxMiw3ICs0MTMsNyBAQAogCWlmICghKnBzZl9saXN0KQogCQlnb3RvIGVtcHR5X3NvdXJjZTsKIAotCXBpaCA9IHNrYiA/IChzdHJ1Y3QgaWdtcHYzX3JlcG9ydCAqKXNrYi0+aC5pZ21waCA6IE5VTEw7CisJcGloID0gc2tiID8gaWdtcHYzX3JlcG9ydF9oZHIoc2tiKSA6IE5VTEw7CiAKIAkvKiBFWCBhbmQgVE9fRVggZ2V0IGEgZnJlc2ggcGFja2V0LCBpZiBuZWVkZWQgKi8KIAlpZiAodHJ1bmNhdGUpIHsKQEAgLTY2NCw3ICs2NjUsOSBAQAogCiAJc2tiX3Jlc2VydmUoc2tiLCBMTF9SRVNFUlZFRF9TUEFDRShkZXYpKTsKIAotCXNrYi0+bmguaXBoID0gaXBoID0gKHN0cnVjdCBpcGhkciAqKXNrYl9wdXQoc2tiLCBzaXplb2Yoc3RydWN0IGlwaGRyKSs0KTsKKwlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiKTsKKwlpcGggPSBpcF9oZHIoc2tiKTsKKwlza2JfcHV0KHNrYiwgc2l6ZW9mKHN0cnVjdCBpcGhkcikgKyA0KTsKIAogCWlwaC0+dmVyc2lvbiAgPSA0OwogCWlwaC0+aWhsICAgICAgPSAoc2l6ZW9mKHN0cnVjdCBpcGhkcikrNCk+PjI7CkBAIC04MjcsOCArODMwLDggQEAKIHN0YXRpYyB2b2lkIGlnbXBfaGVhcmRfcXVlcnkoc3RydWN0IGluX2RldmljZSAqaW5fZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCWludCBsZW4pCiB7Ci0Jc3RydWN0IGlnbXBoZHIgCQkqaWggPSBza2ItPmguaWdtcGg7Ci0Jc3RydWN0IGlnbXB2M19xdWVyeSAqaWgzID0gKHN0cnVjdCBpZ21wdjNfcXVlcnkgKilpaDsKKwlzdHJ1Y3QgaWdtcGhkciAJCSppaCA9IGlnbXBfaGRyKHNrYik7CisJc3RydWN0IGlnbXB2M19xdWVyeSAqaWgzID0gaWdtcHYzX3F1ZXJ5X2hkcihza2IpOwogCXN0cnVjdCBpcF9tY19saXN0CSppbTsKIAlfX2JlMzIJCQlncm91cCA9IGloLT5ncm91cDsKIAlpbnQJCQltYXhfZGVsYXk7CkBAIC04NjEsMTIgKzg2NCwxMiBAQAogCQlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IGlnbXB2M19xdWVyeSkpKQogCQkJcmV0dXJuOwogCi0JCWloMyA9IChzdHJ1Y3QgaWdtcHYzX3F1ZXJ5ICopIHNrYi0+aC5yYXc7CisJCWloMyA9IGlnbXB2M19xdWVyeV9oZHIoc2tiKTsKIAkJaWYgKGloMy0+bnNyY3MpIHsKIAkJCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgaWdtcHYzX3F1ZXJ5KQogCQkJCQkgICArIG50b2hzKGloMy0+bnNyY3MpKnNpemVvZihfX2JlMzIpKSkKIAkJCQlyZXR1cm47Ci0JCQlpaDMgPSAoc3RydWN0IGlnbXB2M19xdWVyeSAqKSBza2ItPmgucmF3OworCQkJaWgzID0gaWdtcHYzX3F1ZXJ5X2hkcihza2IpOwogCQl9CiAKIAkJbWF4X2RlbGF5ID0gSUdNUFYzX01SQyhpaDMtPmNvZGUpKihIWi9JR01QX1RJTUVSX1NDQUxFKTsKQEAgLTk0Myw3ICs5NDYsNyBAQAogCQkJZ290byBkcm9wOwogCX0KIAotCWloID0gc2tiLT5oLmlnbXBoOworCWloID0gaWdtcF9oZHIoc2tiKTsKIAlzd2l0Y2ggKGloLT50eXBlKSB7CiAJY2FzZSBJR01QX0hPU1RfTUVNQkVSU0hJUF9RVUVSWToKIAkJaWdtcF9oZWFyZF9xdWVyeShpbl9kZXYsIHNrYiwgbGVuKTsKQEAgLTIzOTcsNyArMjQwMCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgaWdtcF9tY19zZXFfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBpZ21wX21jX3NlcV9vcHMgPSB7CiAJLnN0YXJ0CT0JaWdtcF9tY19zZXFfc3RhcnQsCiAJLm5leHQJPQlpZ21wX21jX3NlcV9uZXh0LAogCS5zdG9wCT0JaWdtcF9tY19zZXFfc3RvcCwKQEAgLTI1NzEsNyArMjU3NCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgaWdtcF9tY2Zfc2VxX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgaWdtcF9tY2Zfc2VxX29wcyA9IHsKIAkuc3RhcnQJPQlpZ21wX21jZl9zZXFfc3RhcnQsCiAJLm5leHQJPQlpZ21wX21jZl9zZXFfbmV4dCwKIAkuc3RvcAk9CWlnbXBfbWNmX3NlcV9zdG9wLApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaW5ldF9kaWFnLmMgYi9uZXQvaXB2NC9pbmV0X2RpYWcuYwppbmRleCA1ZGY3MWNkLi5kYmVhY2Q4IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pbmV0X2RpYWcuYworKysgYi9uZXQvaXB2NC9pbmV0X2RpYWcuYwpAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgPG5ldC9pbmV0X2hhc2h0YWJsZXMuaD4KICNpbmNsdWRlIDxuZXQvaW5ldF90aW1ld2FpdF9zb2NrLmg+CiAjaW5jbHVkZSA8bmV0L2luZXQ2X2hhc2h0YWJsZXMuaD4KKyNpbmNsdWRlIDxuZXQvbmV0bGluay5oPgogCiAjaW5jbHVkZSA8bGludXgvaW5ldC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgpAQCAtNjAsNyArNjEsNyBAQAogCXN0cnVjdCBubG1zZ2hkciAgKm5saDsKIAl2b2lkICppbmZvID0gTlVMTDsKIAlzdHJ1Y3QgaW5ldF9kaWFnX21lbWluZm8gICptaW5mbyA9IE5VTEw7Ci0JdW5zaWduZWQgY2hhcgkgKmIgPSBza2ItPnRhaWw7CisJdW5zaWduZWQgY2hhcgkgKmIgPSBza2JfdGFpbF9wb2ludGVyKHNrYik7CiAJY29uc3Qgc3RydWN0IGluZXRfZGlhZ19oYW5kbGVyICpoYW5kbGVyOwogCiAJaGFuZGxlciA9IGluZXRfZGlhZ190YWJsZVt1bmxoLT5ubG1zZ190eXBlXTsKQEAgLTE0NywxMiArMTQ4LDEyIEBACiAJICAgIGljc2stPmljc2tfY2Ffb3BzICYmIGljc2stPmljc2tfY2Ffb3BzLT5nZXRfaW5mbykKIAkJaWNzay0+aWNza19jYV9vcHMtPmdldF9pbmZvKHNrLCBleHQsIHNrYik7CiAKLQlubGgtPm5sbXNnX2xlbiA9IHNrYi0+dGFpbCAtIGI7CisJbmxoLT5ubG1zZ19sZW4gPSBza2JfdGFpbF9wb2ludGVyKHNrYikgLSBiOwogCXJldHVybiBza2ItPmxlbjsKIAogcnRhdHRyX2ZhaWx1cmU6CiBubG1zZ19mYWlsdXJlOgotCXNrYl90cmltKHNrYiwgYiAtIHNrYi0+ZGF0YSk7CisJbmxtc2dfdHJpbShza2IsIGIpOwogCXJldHVybiAtRU1TR1NJWkU7CiB9CiAKQEAgLTE2Myw3ICsxNjQsNyBAQAogewogCWxvbmcgdG1vOwogCXN0cnVjdCBpbmV0X2RpYWdfbXNnICpyOwotCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnByZXZpb3VzX3RhaWwgPSBza2ItPnRhaWw7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcHJldmlvdXNfdGFpbCA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKTsKIAlzdHJ1Y3Qgbmxtc2doZHIgKm5saCA9IE5MTVNHX1BVVChza2IsIHBpZCwgc2VxLAogCQkJCQkgdW5saC0+bmxtc2dfdHlwZSwgc2l6ZW9mKCpyKSk7CiAKQEAgLTIwNSwxMCArMjA2LDEwIEBACiAJCQkgICAgICAgJnR3Ni0+dHdfdjZfZGFkZHIpOwogCX0KICNlbmRpZgotCW5saC0+bmxtc2dfbGVuID0gc2tiLT50YWlsIC0gcHJldmlvdXNfdGFpbDsKKwlubGgtPm5sbXNnX2xlbiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKSAtIHByZXZpb3VzX3RhaWw7CiAJcmV0dXJuIHNrYi0+bGVuOwogbmxtc2dfZmFpbHVyZToKLQlza2JfdHJpbShza2IsIHByZXZpb3VzX3RhaWwgLSBza2ItPmRhdGEpOworCW5sbXNnX3RyaW0oc2tiLCBwcmV2aW91c190YWlsKTsKIAlyZXR1cm4gLUVNU0dTSVpFOwogfQogCkBAIC01MzUsNyArNTM2LDcgQEAKIHsKIAljb25zdCBzdHJ1Y3QgaW5ldF9yZXF1ZXN0X3NvY2sgKmlyZXEgPSBpbmV0X3JzayhyZXEpOwogCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKLQl1bnNpZ25lZCBjaGFyICpiID0gc2tiLT50YWlsOworCXVuc2lnbmVkIGNoYXIgKmIgPSBza2JfdGFpbF9wb2ludGVyKHNrYik7CiAJc3RydWN0IGluZXRfZGlhZ19tc2cgKnI7CiAJc3RydWN0IG5sbXNnaGRyICpubGg7CiAJbG9uZyB0bW87CkBAIC01NzQsMTIgKzU3NSwxMiBAQAogCQkJICAgICAgICZpbmV0Nl9yc2socmVxKS0+cm10X2FkZHIpOwogCX0KICNlbmRpZgotCW5saC0+bmxtc2dfbGVuID0gc2tiLT50YWlsIC0gYjsKKwlubGgtPm5sbXNnX2xlbiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKSAtIGI7CiAKIAlyZXR1cm4gc2tiLT5sZW47CiAKIG5sbXNnX2ZhaWx1cmU6Ci0Jc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKKwlubG1zZ190cmltKHNrYiwgYik7CiAJcmV0dXJuIC0xOwogfQogCkBAIC04MDUsNjggKzgwNiw0MyBAQAogCXJldHVybiBza2ItPmxlbjsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgaW5ldF9kaWFnX3Jjdl9tc2coc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5sbXNnaGRyICpubGgpCitzdGF0aWMgaW50IGluZXRfZGlhZ19yY3ZfbXNnKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBubG1zZ2hkciAqbmxoKQogewotCWlmICghKG5saC0+bmxtc2dfZmxhZ3MmTkxNX0ZfUkVRVUVTVCkpCi0JCXJldHVybiAwOworCWludCBoZHJsZW4gPSBzaXplb2Yoc3RydWN0IGluZXRfZGlhZ19yZXEpOwogCi0JaWYgKG5saC0+bmxtc2dfdHlwZSA+PSBJTkVUX0RJQUdfR0VUU09DS19NQVgpCi0JCWdvdG8gZXJyX2ludmFsOworCWlmIChubGgtPm5sbXNnX3R5cGUgPj0gSU5FVF9ESUFHX0dFVFNPQ0tfTUFYIHx8CisJICAgIG5sbXNnX2xlbihubGgpIDwgaGRybGVuKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmIChpbmV0X2RpYWdfdGFibGVbbmxoLT5ubG1zZ190eXBlXSA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT0VOVDsKIAotCWlmIChOTE1TR19MRU5HVEgoc2l6ZW9mKHN0cnVjdCBpbmV0X2RpYWdfcmVxKSkgPiBza2ItPmxlbikKLQkJZ290byBlcnJfaW52YWw7CisJaWYgKG5saC0+bmxtc2dfZmxhZ3MgJiBOTE1fRl9EVU1QKSB7CisJCWlmIChubG1zZ19hdHRybGVuKG5saCwgaGRybGVuKSkgeworCQkJc3RydWN0IG5sYXR0ciAqYXR0cjsKIAotCWlmIChubGgtPm5sbXNnX2ZsYWdzJk5MTV9GX0RVTVApIHsKLQkJaWYgKG5saC0+bmxtc2dfbGVuID4KLQkJICAgICg0ICsgTkxNU0dfU1BBQ0Uoc2l6ZW9mKHN0cnVjdCBpbmV0X2RpYWdfcmVxKSkpKSB7Ci0JCQlzdHJ1Y3QgcnRhdHRyICpydGEgPSAodm9pZCAqKShOTE1TR19EQVRBKG5saCkgKwotCQkJCQkJIHNpemVvZihzdHJ1Y3QgaW5ldF9kaWFnX3JlcSkpOwotCQkJaWYgKHJ0YS0+cnRhX3R5cGUgIT0gSU5FVF9ESUFHX1JFUV9CWVRFQ09ERSB8fAotCQkJICAgIHJ0YS0+cnRhX2xlbiA8IDggfHwKLQkJCSAgICBydGEtPnJ0YV9sZW4gPgotCQkJICAgIChubGgtPm5sbXNnX2xlbiAtCi0JCQkgICAgIE5MTVNHX1NQQUNFKHNpemVvZihzdHJ1Y3QgaW5ldF9kaWFnX3JlcSkpKSkKLQkJCQlnb3RvIGVycl9pbnZhbDsKLQkJCWlmIChpbmV0X2RpYWdfYmNfYXVkaXQoUlRBX0RBVEEocnRhKSwgUlRBX1BBWUxPQUQocnRhKSkpCi0JCQkJZ290byBlcnJfaW52YWw7CisJCQlhdHRyID0gbmxtc2dfZmluZF9hdHRyKG5saCwgaGRybGVuLAorCQkJCQkgICAgICAgSU5FVF9ESUFHX1JFUV9CWVRFQ09ERSk7CisJCQlpZiAoYXR0ciA9PSBOVUxMIHx8CisJCQkgICAgbmxhX2xlbihhdHRyKSA8IHNpemVvZihzdHJ1Y3QgaW5ldF9kaWFnX2JjX29wKSB8fAorCQkJICAgIGluZXRfZGlhZ19iY19hdWRpdChubGFfZGF0YShhdHRyKSwgbmxhX2xlbihhdHRyKSkpCisJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KKwogCQlyZXR1cm4gbmV0bGlua19kdW1wX3N0YXJ0KGlkaWFnbmwsIHNrYiwgbmxoLAogCQkJCQkgIGluZXRfZGlhZ19kdW1wLCBOVUxMKTsKLQl9IGVsc2UKLQkJcmV0dXJuIGluZXRfZGlhZ19nZXRfZXhhY3Qoc2tiLCBubGgpOwotCi1lcnJfaW52YWw6Ci0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLQotc3RhdGljIGlubGluZSB2b2lkIGluZXRfZGlhZ19yY3Zfc2tiKHN0cnVjdCBza19idWZmICpza2IpCi17Ci0JaWYgKHNrYi0+bGVuID49IE5MTVNHX1NQQUNFKDApKSB7Ci0JCWludCBlcnI7Ci0JCXN0cnVjdCBubG1zZ2hkciAqbmxoID0gKHN0cnVjdCBubG1zZ2hkciAqKXNrYi0+ZGF0YTsKLQotCQlpZiAobmxoLT5ubG1zZ19sZW4gPCBzaXplb2YoKm5saCkgfHwKLQkJICAgIHNrYi0+bGVuIDwgbmxoLT5ubG1zZ19sZW4pCi0JCQlyZXR1cm47Ci0JCWVyciA9IGluZXRfZGlhZ19yY3ZfbXNnKHNrYiwgbmxoKTsKLQkJaWYgKGVyciB8fCBubGgtPm5sbXNnX2ZsYWdzICYgTkxNX0ZfQUNLKQotCQkJbmV0bGlua19hY2soc2tiLCBubGgsIGVycik7CiAJfQorCisJcmV0dXJuIGluZXRfZGlhZ19nZXRfZXhhY3Qoc2tiLCBubGgpOwogfQogCiBzdGF0aWMgdm9pZCBpbmV0X2RpYWdfcmN2KHN0cnVjdCBzb2NrICpzaywgaW50IGxlbikKIHsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCXVuc2lnbmVkIGludCBxbGVuID0gc2tiX3F1ZXVlX2xlbigmc2stPnNrX3JlY2VpdmVfcXVldWUpOworCXVuc2lnbmVkIGludCBxbGVuID0gMDsKIAotCXdoaWxlIChxbGVuLS0gJiYgKHNrYiA9IHNrYl9kZXF1ZXVlKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSkpKSB7Ci0JCWluZXRfZGlhZ19yY3Zfc2tiKHNrYik7Ci0JCWtmcmVlX3NrYihza2IpOwotCX0KKwlkbyB7CisJCW5ldGxpbmtfcnVuX3F1ZXVlKHNrLCAmcWxlbiwgJmluZXRfZGlhZ19yY3ZfbXNnKTsKKwl9IHdoaWxlIChxbGVuKTsKIH0KIAogc3RhdGljIERFRklORV9TUElOTE9DSyhpbmV0X2RpYWdfcmVnaXN0ZXJfbG9jayk7CkBAIC05MTcsNyArODkzLDcgQEAKIAkJZ290byBvdXQ7CiAKIAlpZGlhZ25sID0gbmV0bGlua19rZXJuZWxfY3JlYXRlKE5FVExJTktfSU5FVF9ESUFHLCAwLCBpbmV0X2RpYWdfcmN2LAotCQkJCQlUSElTX01PRFVMRSk7CisJCQkJCU5VTEwsIFRISVNfTU9EVUxFKTsKIAlpZiAoaWRpYWdubCA9PSBOVUxMKQogCQlnb3RvIG91dF9mcmVlX3RhYmxlOwogCWVyciA9IDA7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pbmV0cGVlci5jIGIvbmV0L2lwdjQvaW5ldHBlZXIuYwppbmRleCBkYjNlZjk2Li4yZjQ0ZTYxIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pbmV0cGVlci5jCisrKyBiL25ldC9pcHY0L2luZXRwZWVyLmMKQEAgLTg3LDEwICs4NywxMiBAQAogCiBzdGF0aWMgaW50IHBlZXJfdG90YWw7CiAvKiBFeHBvcnRlZCBmb3Igc3lzY3RsX25ldF9pcHY0LiAgKi8KLWludCBpbmV0X3BlZXJfdGhyZXNob2xkID0gNjU1MzYgKyAxMjg7CS8qIHN0YXJ0IHRvIHRocm93IGVudHJpZXMgbW9yZQoraW50IGluZXRfcGVlcl90aHJlc2hvbGQgX19yZWFkX21vc3RseSA9IDY1NTM2ICsgMTI4OwkvKiBzdGFydCB0byB0aHJvdyBlbnRyaWVzIG1vcmUKIAkJCQkJICogYWdncmVzc2l2ZWx5IGF0IHRoaXMgc3RhZ2UgKi8KLWludCBpbmV0X3BlZXJfbWludHRsID0gMTIwICogSFo7CS8qIFRUTCB1bmRlciBoaWdoIGxvYWQ6IDEyMCBzZWMgKi8KLWludCBpbmV0X3BlZXJfbWF4dHRsID0gMTAgKiA2MCAqIEhaOwkvKiB1c3VhbCB0aW1lIHRvIGxpdmU6IDEwIG1pbiAqLworaW50IGluZXRfcGVlcl9taW50dGwgX19yZWFkX21vc3RseSA9IDEyMCAqIEhaOwkvKiBUVEwgdW5kZXIgaGlnaCBsb2FkOiAxMjAgc2VjICovCitpbnQgaW5ldF9wZWVyX21heHR0bCBfX3JlYWRfbW9zdGx5ID0gMTAgKiA2MCAqIEhaOwkvKiB1c3VhbCB0aW1lIHRvIGxpdmU6IDEwIG1pbiAqLworaW50IGluZXRfcGVlcl9nY19taW50aW1lIF9fcmVhZF9tb3N0bHkgPSAxMCAqIEhaOworaW50IGluZXRfcGVlcl9nY19tYXh0aW1lIF9fcmVhZF9tb3N0bHkgPSAxMjAgKiBIWjsKIAogc3RhdGljIHN0cnVjdCBpbmV0X3BlZXIgKmluZXRfcGVlcl91bnVzZWRfaGVhZDsKIHN0YXRpYyBzdHJ1Y3QgaW5ldF9wZWVyICoqaW5ldF9wZWVyX3VudXNlZF90YWlscCA9ICZpbmV0X3BlZXJfdW51c2VkX2hlYWQ7CkBAIC05OSw5ICsxMDEsNiBAQAogc3RhdGljIHZvaWQgcGVlcl9jaGVja19leHBpcmUodW5zaWduZWQgbG9uZyBkdW1teSk7CiBzdGF0aWMgREVGSU5FX1RJTUVSKHBlZXJfcGVyaW9kaWNfdGltZXIsIHBlZXJfY2hlY2tfZXhwaXJlLCAwLCAwKTsKIAotLyogRXhwb3J0ZWQgZm9yIHN5c2N0bF9uZXRfaXB2NC4gICovCi1pbnQgaW5ldF9wZWVyX2djX21pbnRpbWUgPSAxMCAqIEhaLAotICAgIGluZXRfcGVlcl9nY19tYXh0aW1lID0gMTIwICogSFo7CiAKIC8qIENhbGxlZCBmcm9tIGlwX291dHB1dC5jOmlwX2luaXQgICovCiB2b2lkIF9faW5pdCBpbmV0X2luaXRwZWVycyh2b2lkKQpAQCAtMTUxLDIwICsxNTAsMjcgQEAKIAlzcGluX3VubG9ja19iaCgmaW5ldF9wZWVyX3VudXNlZF9sb2NrKTsKIH0KIAotLyogQ2FsbGVkIHdpdGggbG9jYWwgQkggZGlzYWJsZWQgYW5kIHRoZSBwb29sIGxvY2sgaGVsZC4gKi8KLSNkZWZpbmUgbG9va3VwKGRhZGRyKSAJCQkJCQlcCisvKgorICogQ2FsbGVkIHdpdGggbG9jYWwgQkggZGlzYWJsZWQgYW5kIHRoZSBwb29sIGxvY2sgaGVsZC4KKyAqIF9zdGFjayBpcyBrbm93biB0byBiZSBOVUxMIG9yIG5vdCBhdCBjb21waWxlIHRpbWUsCisgKiBzbyBjb21waWxlciB3aWxsIG9wdGltaXplIHRoZSBpZiAoX3N0YWNrKSB0ZXN0cy4KKyAqLworI2RlZmluZSBsb29rdXAoX2RhZGRyLF9zdGFjaykgCQkJCQlcCiAoewkJCQkJCQkJXAogCXN0cnVjdCBpbmV0X3BlZXIgKnUsICoqdjsJCQkJXAotCXN0YWNrcHRyID0gc3RhY2s7CQkJCQlcCi0JKnN0YWNrcHRyKysgPSAmcGVlcl9yb290OwkJCQlcCisJaWYgKF9zdGFjaykgewkJCQkJCVwKKwkJc3RhY2twdHIgPSBfc3RhY2s7CQkJCVwKKwkJKnN0YWNrcHRyKysgPSAmcGVlcl9yb290OwkJCVwKKwl9CQkJCQkJCVwKIAlmb3IgKHUgPSBwZWVyX3Jvb3Q7IHUgIT0gcGVlcl9hdmxfZW1wdHk7ICkgewkJXAotCQlpZiAoZGFkZHIgPT0gdS0+djRkYWRkcikJCQlcCisJCWlmIChfZGFkZHIgPT0gdS0+djRkYWRkcikJCQlcCiAJCQlicmVhazsJCQkJCVwKLQkJaWYgKChfX2ZvcmNlIF9fdTMyKWRhZGRyIDwgKF9fZm9yY2UgX191MzIpdS0+djRkYWRkcikJXAorCQlpZiAoKF9fZm9yY2UgX191MzIpX2RhZGRyIDwgKF9fZm9yY2UgX191MzIpdS0+djRkYWRkcikJXAogCQkJdiA9ICZ1LT5hdmxfbGVmdDsJCQlcCiAJCWVsc2UJCQkJCQlcCiAJCQl2ID0gJnUtPmF2bF9yaWdodDsJCQlcCi0JCSpzdGFja3B0cisrID0gdjsJCQkJXAorCQlpZiAoX3N0YWNrKQkJCQkJXAorCQkJKnN0YWNrcHRyKysgPSB2OwkJCVwKIAkJdSA9ICp2OwkJCQkJCVwKIAl9CQkJCQkJCVwKIAl1OwkJCQkJCQlcCkBAIC0yODgsNyArMjk0LDcgQEAKIAlpZiAoYXRvbWljX3JlYWQoJnAtPnJlZmNudCkgPT0gMSkgewogCQlzdHJ1Y3QgaW5ldF9wZWVyICoqc3RhY2tbUEVFUl9NQVhERVBUSF07CiAJCXN0cnVjdCBpbmV0X3BlZXIgKioqc3RhY2twdHIsICoqKmRlbHA7Ci0JCWlmIChsb29rdXAocC0+djRkYWRkcikgIT0gcCkKKwkJaWYgKGxvb2t1cChwLT52NGRhZGRyLCBzdGFjaykgIT0gcCkKIAkJCUJVRygpOwogCQlkZWxwID0gc3RhY2twdHIgLSAxOyAvKiAqZGVscFswXSA9PSBwICovCiAJCWlmIChwLT5hdmxfbGVmdCA9PSBwZWVyX2F2bF9lbXB0eSkgewpAQCAtMzczLDcgKzM3OSw3IEBACiAKIAkvKiBMb29rIHVwIGZvciB0aGUgYWRkcmVzcyBxdWlja2x5LiAqLwogCXJlYWRfbG9ja19iaCgmcGVlcl9wb29sX2xvY2spOwotCXAgPSBsb29rdXAoZGFkZHIpOworCXAgPSBsb29rdXAoZGFkZHIsIE5VTEwpOwogCWlmIChwICE9IHBlZXJfYXZsX2VtcHR5KQogCQlhdG9taWNfaW5jKCZwLT5yZWZjbnQpOwogCXJlYWRfdW5sb2NrX2JoKCZwZWVyX3Bvb2xfbG9jayk7CkBAIC00MDAsNyArNDA2LDcgQEAKIAogCXdyaXRlX2xvY2tfYmgoJnBlZXJfcG9vbF9sb2NrKTsKIAkvKiBDaGVjayBpZiBhbiBlbnRyeSBoYXMgc3VkZGVubHkgYXBwZWFyZWQuICovCi0JcCA9IGxvb2t1cChkYWRkcik7CisJcCA9IGxvb2t1cChkYWRkciwgc3RhY2spOwogCWlmIChwICE9IHBlZXJfYXZsX2VtcHR5KQogCQlnb3RvIG91dF9mcmVlOwogCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcF9mb3J3YXJkLmMgYi9uZXQvaXB2NC9pcF9mb3J3YXJkLmMKaW5kZXggMzY5ZTcyMS4uOWNiMDRkZiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaXBfZm9yd2FyZC5jCisrKyBiL25ldC9pcHY0L2lwX2ZvcndhcmQuYwpAQCAtNjcsMTQgKzY3LDE0IEBACiAJaWYgKHNrYi0+cGt0X3R5cGUgIT0gUEFDS0VUX0hPU1QpCiAJCWdvdG8gZHJvcDsKIAotCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKKwlza2JfZm9yd2FyZF9jc3VtKHNrYik7CiAKIAkvKgogCSAqCUFjY29yZGluZyB0byB0aGUgUkZDLCB3ZSBtdXN0IGZpcnN0IGRlY3JlYXNlIHRoZSBUVEwgZmllbGQuIElmCiAJICoJdGhhdCByZWFjaGVzIHplcm8sIHdlIG11c3QgcmVwbHkgYW4gSUNNUCBjb250cm9sIG1lc3NhZ2UgdGVsbGluZwogCSAqCXRoYXQgdGhlIHBhY2tldCdzIGxpZmV0aW1lIGV4cGlyZWQuCiAJICovCi0JaWYgKHNrYi0+bmguaXBoLT50dGwgPD0gMSkKKwlpZiAoaXBfaGRyKHNrYiktPnR0bCA8PSAxKQogCQlnb3RvIHRvb19tYW55X2hvcHM7CiAKIAlpZiAoIXhmcm00X3JvdXRlX2ZvcndhcmQoc2tiKSkKQEAgLTg1LDEwICs4NSwxOCBAQAogCWlmIChvcHQtPmlzX3N0cmljdHJvdXRlICYmIHJ0LT5ydF9kc3QgIT0gcnQtPnJ0X2dhdGV3YXkpCiAJCWdvdG8gc3JfZmFpbGVkOwogCisJaWYgKHVubGlrZWx5KHNrYi0+bGVuID4gZHN0X210dSgmcnQtPnUuZHN0KSAmJgorCSAgICAgICAgICAgICAoaXBfaGRyKHNrYiktPmZyYWdfb2ZmICYgaHRvbnMoSVBfREYpKSkgJiYgIXNrYi0+bG9jYWxfZGYpIHsKKwkJSVBfSU5DX1NUQVRTKElQU1RBVFNfTUlCX0ZSQUdGQUlMUyk7CisJCWljbXBfc2VuZChza2IsIElDTVBfREVTVF9VTlJFQUNILCBJQ01QX0ZSQUdfTkVFREVELAorCQkJICBodG9ubChkc3RfbXR1KCZydC0+dS5kc3QpKSk7CisJCWdvdG8gZHJvcDsKKwl9CisKIAkvKiBXZSBhcmUgYWJvdXQgdG8gbWFuZ2xlIHBhY2tldC4gQ29weSBpdCEgKi8KIAlpZiAoc2tiX2Nvdyhza2IsIExMX1JFU0VSVkVEX1NQQUNFKHJ0LT51LmRzdC5kZXYpK3J0LT51LmRzdC5oZWFkZXJfbGVuKSkKIAkJZ290byBkcm9wOwotCWlwaCA9IHNrYi0+bmguaXBoOworCWlwaCA9IGlwX2hkcihza2IpOwogCiAJLyogRGVjcmVhc2UgdHRsIGFmdGVyIHNrYiBjb3cgZG9uZSAqLwogCWlwX2RlY3JlYXNlX3R0bChpcGgpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXBfZnJhZ21lbnQuYyBiL25ldC9pcHY0L2lwX2ZyYWdtZW50LmMKaW5kZXggYjZmMDU1My4uMDIzMWJkYyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaXBfZnJhZ21lbnQuYworKysgYi9uZXQvaXB2NC9pcF9mcmFnbWVudC5jCkBAIC05Miw3ICs5Miw3IEBACiAJc3BpbmxvY2tfdAlsb2NrOwogCWF0b21pY190CXJlZmNudDsKIAlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsJLyogd2hlbiB3aWxsIHRoaXMgcXVldWUgZXhwaXJlPwkJKi8KLQlzdHJ1Y3QgdGltZXZhbAlzdGFtcDsKKwlrdGltZV90CQlzdGFtcDsKIAlpbnQgICAgICAgICAgICAgaWlmOwogCXVuc2lnbmVkIGludCAgICByaWQ7CiAJc3RydWN0IGluZXRfcGVlciAqcGVlcjsKQEAgLTE4NCw3ICsxODQsNyBAQAogewogCXN0cnVjdCBpcHEgKnFwID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGlwcSksIEdGUF9BVE9NSUMpOwogCi0JaWYoIXFwKQorCWlmICghcXApCiAJCXJldHVybiBOVUxMOwogCWF0b21pY19hZGQoc2l6ZW9mKHN0cnVjdCBpcHEpLCAmaXBfZnJhZ19tZW0pOwogCXJldHVybiBxcDsKQEAgLTMyMSwxMSArMzIxLDExIEBACiAJICogcHJvbW90ZWQgcmVhZCBsb2NrIHRvIHdyaXRlIGxvY2suCiAJICovCiAJaGxpc3RfZm9yX2VhY2hfZW50cnkocXAsIG4sICZpcHFfaGFzaFtoYXNoXSwgbGlzdCkgewotCQlpZihxcC0+aWQgPT0gcXBfaW4tPmlkCQkmJgotCQkgICBxcC0+c2FkZHIgPT0gcXBfaW4tPnNhZGRyCSYmCi0JCSAgIHFwLT5kYWRkciA9PSBxcF9pbi0+ZGFkZHIJJiYKLQkJICAgcXAtPnByb3RvY29sID09IHFwX2luLT5wcm90b2NvbCAmJgotCQkgICBxcC0+dXNlciA9PSBxcF9pbi0+dXNlcikgeworCQlpZiAocXAtPmlkID09IHFwX2luLT5pZAkJJiYKKwkJICAgIHFwLT5zYWRkciA9PSBxcF9pbi0+c2FkZHIJJiYKKwkJICAgIHFwLT5kYWRkciA9PSBxcF9pbi0+ZGFkZHIJJiYKKwkJICAgIHFwLT5wcm90b2NvbCA9PSBxcF9pbi0+cHJvdG9jb2wgJiYKKwkJICAgIHFwLT51c2VyID09IHFwX2luLT51c2VyKSB7CiAJCQlhdG9taWNfaW5jKCZxcC0+cmVmY250KTsKIAkJCXdyaXRlX3VubG9jaygmaXBmcmFnX2xvY2spOwogCQkJcXBfaW4tPmxhc3RfaW4gfD0gQ09NUExFVEU7CkBAIC0zOTgsMTEgKzM5OCwxMSBAQAogCXJlYWRfbG9jaygmaXBmcmFnX2xvY2spOwogCWhhc2ggPSBpcHFoYXNoZm4oaWQsIHNhZGRyLCBkYWRkciwgcHJvdG9jb2wpOwogCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KHFwLCBuLCAmaXBxX2hhc2hbaGFzaF0sIGxpc3QpIHsKLQkJaWYocXAtPmlkID09IGlkCQkmJgotCQkgICBxcC0+c2FkZHIgPT0gc2FkZHIJJiYKLQkJICAgcXAtPmRhZGRyID09IGRhZGRyCSYmCi0JCSAgIHFwLT5wcm90b2NvbCA9PSBwcm90b2NvbCAmJgotCQkgICBxcC0+dXNlciA9PSB1c2VyKSB7CisJCWlmIChxcC0+aWQgPT0gaWQJCSYmCisJCSAgICBxcC0+c2FkZHIgPT0gc2FkZHIJJiYKKwkJICAgIHFwLT5kYWRkciA9PSBkYWRkcgkmJgorCQkgICAgcXAtPnByb3RvY29sID09IHByb3RvY29sICYmCisJCSAgICBxcC0+dXNlciA9PSB1c2VyKSB7CiAJCQlhdG9taWNfaW5jKCZxcC0+cmVmY250KTsKIAkJCXJlYWRfdW5sb2NrKCZpcGZyYWdfbG9jayk7CiAJCQlyZXR1cm4gcXA7CkBAIC00NzksMTEgKzQ3OSwxMSBAQAogCQlnb3RvIGVycjsKIAl9CiAKLQlvZmZzZXQgPSBudG9ocyhza2ItPm5oLmlwaC0+ZnJhZ19vZmYpOworCW9mZnNldCA9IG50b2hzKGlwX2hkcihza2IpLT5mcmFnX29mZik7CiAJZmxhZ3MgPSBvZmZzZXQgJiB+SVBfT0ZGU0VUOwogCW9mZnNldCAmPSBJUF9PRkZTRVQ7CiAJb2Zmc2V0IDw8PSAzOwkJLyogb2Zmc2V0IGlzIGluIDgtYnl0ZSBjaHVua3MgKi8KLQlpaGwgPSBza2ItPm5oLmlwaC0+aWhsICogNDsKKwlpaGwgPSBpcF9oZHJsZW4oc2tiKTsKIAogCS8qIERldGVybWluZSB0aGUgcG9zaXRpb24gb2YgdGhpcyBmcmFnbWVudC4gKi8KIAllbmQgPSBvZmZzZXQgKyBza2ItPmxlbiAtIGlobDsKQEAgLTUyNCw3ICs1MjQsNyBAQAogCSAqIHRoaXMgZnJhZ21lbnQsIHJpZ2h0PwogCSAqLwogCXByZXYgPSBOVUxMOwotCWZvcihuZXh0ID0gcXAtPmZyYWdtZW50czsgbmV4dCAhPSBOVUxMOyBuZXh0ID0gbmV4dC0+bmV4dCkgeworCWZvciAobmV4dCA9IHFwLT5mcmFnbWVudHM7IG5leHQgIT0gTlVMTDsgbmV4dCA9IG5leHQtPm5leHQpIHsKIAkJaWYgKEZSQUdfQ0IobmV4dCktPm9mZnNldCA+PSBvZmZzZXQpCiAJCQlicmVhazsJLyogYmluZ28hICovCiAJCXByZXYgPSBuZXh0OwpAQCAtNTkyLDcgKzU5Miw3IEBACiAJaWYgKHNrYi0+ZGV2KQogCQlxcC0+aWlmID0gc2tiLT5kZXYtPmlmaW5kZXg7CiAJc2tiLT5kZXYgPSBOVUxMOwotCXNrYl9nZXRfdGltZXN0YW1wKHNrYiwgJnFwLT5zdGFtcCk7CisJcXAtPnN0YW1wID0gc2tiLT50c3RhbXA7CiAJcXAtPm1lYXQgKz0gc2tiLT5sZW47CiAJYXRvbWljX2FkZChza2ItPnRydWVzaXplLCAmaXBfZnJhZ19tZW0pOwogCWlmIChvZmZzZXQgPT0gMCkKQEAgLTYyNCwxMCArNjI0LDEwIEBACiAJQlVHX1RSQVAoRlJBR19DQihoZWFkKS0+b2Zmc2V0ID09IDApOwogCiAJLyogQWxsb2NhdGUgYSBuZXcgYnVmZmVyIGZvciB0aGUgZGF0YWdyYW0uICovCi0JaWhsZW4gPSBoZWFkLT5uaC5pcGgtPmlobCo0OworCWlobGVuID0gaXBfaGRybGVuKGhlYWQpOwogCWxlbiA9IGlobGVuICsgcXAtPmxlbjsKIAotCWlmKGxlbiA+IDY1NTM1KQorCWlmIChsZW4gPiA2NTUzNSkKIAkJZ290byBvdXRfb3ZlcnNpemU7CiAKIAkvKiBIZWFkIG9mIGxpc3QgbXVzdCBub3QgYmUgY2xvbmVkLiAqLwpAQCAtNjU4LDcgKzY1OCw3IEBACiAJfQogCiAJc2tiX3NoaW5mbyhoZWFkKS0+ZnJhZ19saXN0ID0gaGVhZC0+bmV4dDsKLQlza2JfcHVzaChoZWFkLCBoZWFkLT5kYXRhIC0gaGVhZC0+bmgucmF3KTsKKwlza2JfcHVzaChoZWFkLCBoZWFkLT5kYXRhIC0gc2tiX25ldHdvcmtfaGVhZGVyKGhlYWQpKTsKIAlhdG9taWNfc3ViKGhlYWQtPnRydWVzaXplLCAmaXBfZnJhZ19tZW0pOwogCiAJZm9yIChmcD1oZWFkLT5uZXh0OyBmcDsgZnAgPSBmcC0+bmV4dCkgewpAQCAtNjc0LDkgKzY3NCw5IEBACiAKIAloZWFkLT5uZXh0ID0gTlVMTDsKIAloZWFkLT5kZXYgPSBkZXY7Ci0Jc2tiX3NldF90aW1lc3RhbXAoaGVhZCwgJnFwLT5zdGFtcCk7CisJaGVhZC0+dHN0YW1wID0gcXAtPnN0YW1wOwogCi0JaXBoID0gaGVhZC0+bmguaXBoOworCWlwaCA9IGlwX2hkcihoZWFkKTsKIAlpcGgtPmZyYWdfb2ZmID0gMDsKIAlpcGgtPnRvdF9sZW4gPSBodG9ucyhsZW4pOwogCUlQX0lOQ19TVEFUU19CSChJUFNUQVRTX01JQl9SRUFTTU9LUyk7CkBAIC03MDAsNyArNzAwLDYgQEAKIC8qIFByb2Nlc3MgYW4gaW5jb21pbmcgSVAgZGF0YWdyYW0gZnJhZ21lbnQuICovCiBzdHJ1Y3Qgc2tfYnVmZiAqaXBfZGVmcmFnKHN0cnVjdCBza19idWZmICpza2IsIHUzMiB1c2VyKQogewotCXN0cnVjdCBpcGhkciAqaXBoID0gc2tiLT5uaC5pcGg7CiAJc3RydWN0IGlwcSAqcXA7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIApAQCAtNzEzLDcgKzcxMiw3IEBACiAJZGV2ID0gc2tiLT5kZXY7CiAKIAkvKiBMb29rdXAgKG9yIGNyZWF0ZSkgcXVldWUgaGVhZGVyICovCi0JaWYgKChxcCA9IGlwX2ZpbmQoaXBoLCB1c2VyKSkgIT0gTlVMTCkgeworCWlmICgocXAgPSBpcF9maW5kKGlwX2hkcihza2IpLCB1c2VyKSkgIT0gTlVMTCkgewogCQlzdHJ1Y3Qgc2tfYnVmZiAqcmV0ID0gTlVMTDsKIAogCQlzcGluX2xvY2soJnFwLT5sb2NrKTsKQEAgLTczNCw3ICs3MzMsNyBAQAogCXJldHVybiBOVUxMOwogfQogCi12b2lkIGlwZnJhZ19pbml0KHZvaWQpCit2b2lkIF9faW5pdCBpcGZyYWdfaW5pdCh2b2lkKQogewogCWlwZnJhZ19oYXNoX3JuZCA9ICh1MzIpICgobnVtX3BoeXNwYWdlcyBeIChudW1fcGh5c3BhZ2VzPj43KSkgXgogCQkJCSAoamlmZmllcyBeIChqaWZmaWVzID4+IDYpKSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcF9ncmUuYyBiL25ldC9pcHY0L2lwX2dyZS5jCmluZGV4IDkxNTFkYTYuLjYzMjgyOTMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwX2dyZS5jCisrKyBiL25ldC9pcHY0L2lwX2dyZS5jCkBAIC0xOTEsMTEgKzE5MSwxMSBAQAogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgc3RydWN0IGlwX3R1bm5lbCAqKmlwZ3JlX2J1Y2tldChzdHJ1Y3QgaXBfdHVubmVsICp0KQorc3RhdGljIHN0cnVjdCBpcF90dW5uZWwgKipfX2lwZ3JlX2J1Y2tldChzdHJ1Y3QgaXBfdHVubmVsX3Bhcm0gKnBhcm1zKQogewotCV9fYmUzMiByZW1vdGUgPSB0LT5wYXJtcy5pcGguZGFkZHI7Ci0JX19iZTMyIGxvY2FsID0gdC0+cGFybXMuaXBoLnNhZGRyOwotCV9fYmUzMiBrZXkgPSB0LT5wYXJtcy5pX2tleTsKKwlfX2JlMzIgcmVtb3RlID0gcGFybXMtPmlwaC5kYWRkcjsKKwlfX2JlMzIgbG9jYWwgPSBwYXJtcy0+aXBoLnNhZGRyOworCV9fYmUzMiBrZXkgPSBwYXJtcy0+aV9rZXk7CiAJdW5zaWduZWQgaCA9IEhBU0goa2V5KTsKIAlpbnQgcHJpbyA9IDA7CiAKQEAgLTIwOSw2ICsyMDksMTEgQEAKIAlyZXR1cm4gJnR1bm5lbHNbcHJpb11baF07CiB9CiAKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGlwX3R1bm5lbCAqKmlwZ3JlX2J1Y2tldChzdHJ1Y3QgaXBfdHVubmVsICp0KQoreworCXJldHVybiBfX2lwZ3JlX2J1Y2tldCgmdC0+cGFybXMpOworfQorCiBzdGF0aWMgdm9pZCBpcGdyZV90dW5uZWxfbGluayhzdHJ1Y3QgaXBfdHVubmVsICp0KQogewogCXN0cnVjdCBpcF90dW5uZWwgKip0cCA9IGlwZ3JlX2J1Y2tldCh0KTsKQEAgLTI0MCwxNyArMjQ1LDkgQEAKIAlfX2JlMzIga2V5ID0gcGFybXMtPmlfa2V5OwogCXN0cnVjdCBpcF90dW5uZWwgKnQsICoqdHAsICpudDsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwotCXVuc2lnbmVkIGggPSBIQVNIKGtleSk7Ci0JaW50IHByaW8gPSAwOwogCWNoYXIgbmFtZVtJRk5BTVNJWl07CiAKLQlpZiAobG9jYWwpCi0JCXByaW8gfD0gMTsKLQlpZiAocmVtb3RlICYmICFNVUxUSUNBU1QocmVtb3RlKSkgewotCQlwcmlvIHw9IDI7Ci0JCWggXj0gSEFTSChyZW1vdGUpOwotCX0KLQlmb3IgKHRwID0gJnR1bm5lbHNbcHJpb11baF07ICh0ID0gKnRwKSAhPSBOVUxMOyB0cCA9ICZ0LT5uZXh0KSB7CisJZm9yICh0cCA9IF9faXBncmVfYnVja2V0KHBhcm1zKTsgKHQgPSAqdHApICE9IE5VTEw7IHRwID0gJnQtPm5leHQpIHsKIAkJaWYgKGxvY2FsID09IHQtPnBhcm1zLmlwaC5zYWRkciAmJiByZW1vdGUgPT0gdC0+cGFybXMuaXBoLmRhZGRyKSB7CiAJCQlpZiAoa2V5ID09IHQtPnBhcm1zLmlfa2V5KQogCQkJCXJldHVybiB0OwpAQCAtMzIwLDggKzMxNyw4IEBACiAJc3RydWN0IGlwaGRyICppcGggPSAoc3RydWN0IGlwaGRyKilza2ItPmRhdGE7CiAJX19iZTE2CSAgICAgKnAgPSAoX19iZTE2Kikoc2tiLT5kYXRhKyhpcGgtPmlobDw8MikpOwogCWludCBncmVobGVuID0gKGlwaC0+aWhsPDwyKSArIDQ7Ci0JaW50IHR5cGUgPSBza2ItPmguaWNtcGgtPnR5cGU7Ci0JaW50IGNvZGUgPSBza2ItPmguaWNtcGgtPmNvZGU7CisJY29uc3QgaW50IHR5cGUgPSBpY21wX2hkcihza2IpLT50eXBlOworCWNvbnN0IGludCBjb2RlID0gaWNtcF9oZHIoc2tiKS0+Y29kZTsKIAlzdHJ1Y3QgaXBfdHVubmVsICp0OwogCV9fYmUxNiBmbGFnczsKIApAQCAtMzg4LDggKzM4NSw4IEBACiAJc3RydWN0IGlwaGRyICppcGggPSAoc3RydWN0IGlwaGRyKilkcDsKIAlzdHJ1Y3QgaXBoZHIgKmVpcGg7CiAJX19iZTE2CSAgICAgKnAgPSAoX19iZTE2KikoZHArKGlwaC0+aWhsPDwyKSk7Ci0JaW50IHR5cGUgPSBza2ItPmguaWNtcGgtPnR5cGU7Ci0JaW50IGNvZGUgPSBza2ItPmguaWNtcGgtPmNvZGU7CisJY29uc3QgaW50IHR5cGUgPSBpY21wX2hkcihza2IpLT50eXBlOworCWNvbnN0IGludCBjb2RlID0gaWNtcF9oZHIoc2tiKS0+Y29kZTsKIAlpbnQgcmVsX3R5cGUgPSAwOwogCWludCByZWxfY29kZSA9IDA7CiAJX19iZTMyIHJlbF9pbmZvID0gMDsKQEAgLTQyMiw3ICs0MTksNyBAQAogCWRlZmF1bHQ6CiAJCXJldHVybjsKIAljYXNlIElDTVBfUEFSQU1FVEVSUFJPQjoKLQkJbiA9IG50b2hsKHNrYi0+aC5pY21waC0+dW4uZ2F0ZXdheSkgPj4gMjQ7CisJCW4gPSBudG9obChpY21wX2hkcihza2IpLT51bi5nYXRld2F5KSA+PiAyNDsKIAkJaWYgKG4gPCAoaXBoLT5paGw8PDIpKQogCQkJcmV0dXJuOwogCkBAIC00NDIsNyArNDM5LDcgQEAKIAkJCXJldHVybjsKIAkJY2FzZSBJQ01QX0ZSQUdfTkVFREVEOgogCQkJLyogQW5kIGl0IGlzIHRoZSBvbmx5IHJlYWxseSBuZWNlc3NhcnkgdGhpbmcgOi0pICovCi0JCQluID0gbnRvaHMoc2tiLT5oLmljbXBoLT51bi5mcmFnLm10dSk7CisJCQluID0gbnRvaHMoaWNtcF9oZHIoc2tiKS0+dW4uZnJhZy5tdHUpOwogCQkJaWYgKG4gPCBncmVobGVuKzY4KQogCQkJCXJldHVybjsKIAkJCW4gLT0gZ3JlaGxlbjsKQEAgLTQ3NCw3ICs0NzEsNyBAQAogCWRzdF9yZWxlYXNlKHNrYjItPmRzdCk7CiAJc2tiMi0+ZHN0ID0gTlVMTDsKIAlza2JfcHVsbChza2IyLCBza2ItPmRhdGEgLSAodTgqKWVpcGgpOwotCXNrYjItPm5oLnJhdyA9IHNrYjItPmRhdGE7CisJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYjIpOwogCiAJLyogVHJ5IHRvIGd1ZXNzIGluY29taW5nIGludGVyZmFjZSAqLwogCW1lbXNldCgmZmwsIDAsIHNpemVvZihmbCkpOwpAQCAtNTMzLDkgKzUzMCw5IEBACiB7CiAJaWYgKElORVRfRUNOX2lzX2NlKGlwaC0+dG9zKSkgewogCQlpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9JUCkpIHsKLQkJCUlQX0VDTl9zZXRfY2Uoc2tiLT5uaC5pcGgpOworCQkJSVBfRUNOX3NldF9jZShpcF9oZHIoc2tiKSk7CiAJCX0gZWxzZSBpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9JUFY2KSkgewotCQkJSVA2X0VDTl9zZXRfY2Uoc2tiLT5uaC5pcHY2aCk7CisJCQlJUDZfRUNOX3NldF9jZShpcHY2X2hkcihza2IpKTsKIAkJfQogCX0KIH0KQEAgLTU2NSw3ICs1NjIsNyBAQAogCWlmICghcHNrYl9tYXlfcHVsbChza2IsIDE2KSkKIAkJZ290byBkcm9wX25vbG9jazsKIAotCWlwaCA9IHNrYi0+bmguaXBoOworCWlwaCA9IGlwX2hkcihza2IpOwogCWggPSBza2ItPmRhdGE7CiAJZmxhZ3MgPSAqKF9fYmUxNiopaDsKIApAQCAtNjE2LDkgKzYxMywxMCBAQAogCQkJCW9mZnNldCArPSA0OwogCQl9CiAKLQkJc2tiLT5tYWMucmF3ID0gc2tiLT5uaC5yYXc7Ci0JCXNrYi0+bmgucmF3ID0gX19wc2tiX3B1bGwoc2tiLCBvZmZzZXQpOwotCQlza2JfcG9zdHB1bGxfcmNzdW0oc2tiLCBza2ItPmgucmF3LCBvZmZzZXQpOworCQlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOworCQlfX3Bza2JfcHVsbChza2IsIG9mZnNldCk7CisJCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOworCQlza2JfcG9zdHB1bGxfcmNzdW0oc2tiLCBza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpLCBvZmZzZXQpOwogCQlza2ItPnBrdF90eXBlID0gUEFDS0VUX0hPU1Q7CiAjaWZkZWYgQ09ORklHX05FVF9JUEdSRV9CUk9BRENBU1QKIAkJaWYgKE1VTFRJQ0FTVChpcGgtPmRhZGRyKSkgewpAQCAtNjY5LDcgKzY2Nyw3IEBACiB7CiAJc3RydWN0IGlwX3R1bm5lbCAqdHVubmVsID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmdHVubmVsLT5zdGF0OwotCXN0cnVjdCBpcGhkciAgKm9sZF9pcGggPSBza2ItPm5oLmlwaDsKKwlzdHJ1Y3QgaXBoZHIgICpvbGRfaXBoID0gaXBfaGRyKHNrYik7CiAJc3RydWN0IGlwaGRyICAqdGlwaDsKIAl1OCAgICAgdG9zOwogCV9fYmUxNiBkZjsKQEAgLTcyMCw3ICs3MTgsNyBAQAogCQkJYWRkcl90eXBlID0gaXB2Nl9hZGRyX3R5cGUoYWRkcjYpOwogCiAJCQlpZiAoYWRkcl90eXBlID09IElQVjZfQUREUl9BTlkpIHsKLQkJCQlhZGRyNiA9ICZza2ItPm5oLmlwdjZoLT5kYWRkcjsKKwkJCQlhZGRyNiA9ICZpcHY2X2hkcihza2IpLT5kYWRkcjsKIAkJCQlhZGRyX3R5cGUgPSBpcHY2X2FkZHJfdHlwZShhZGRyNik7CiAJCQl9CiAKQEAgLTgyNCwxMSArODIyLDEyIEBACiAJCQlza2Jfc2V0X293bmVyX3cobmV3X3NrYiwgc2tiLT5zayk7CiAJCWRldl9rZnJlZV9za2Ioc2tiKTsKIAkJc2tiID0gbmV3X3NrYjsKLQkJb2xkX2lwaCA9IHNrYi0+bmguaXBoOworCQlvbGRfaXBoID0gaXBfaGRyKHNrYik7CiAJfQogCi0Jc2tiLT5oLnJhdyA9IHNrYi0+bmgucmF3OwotCXNrYi0+bmgucmF3ID0gc2tiX3B1c2goc2tiLCBncmVfaGxlbik7CisJc2tiLT50cmFuc3BvcnRfaGVhZGVyID0gc2tiLT5uZXR3b3JrX2hlYWRlcjsKKwlza2JfcHVzaChza2IsIGdyZV9obGVuKTsKKwlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiKTsKIAltZW1zZXQoJihJUENCKHNrYiktPm9wdCksIDAsIHNpemVvZihJUENCKHNrYiktPm9wdCkpOwogCUlQQ0Ioc2tiKS0+ZmxhZ3MgJj0gfihJUFNLQl9YRlJNX1RVTk5FTF9TSVpFIHwgSVBTS0JfWEZSTV9UUkFOU0ZPUk1FRCB8CiAJCQkgICAgICBJUFNLQl9SRVJPVVRFRCk7CkBAIC04MzksNyArODM4LDcgQEAKIAkgKglQdXNoIGRvd24gYW5kIGluc3RhbGwgdGhlIElQSVAgaGVhZGVyLgogCSAqLwogCi0JaXBoIAkJCT0Jc2tiLT5uaC5pcGg7CisJaXBoIAkJCT0JaXBfaGRyKHNrYik7CiAJaXBoLT52ZXJzaW9uCQk9CTQ7CiAJaXBoLT5paGwJCT0Jc2l6ZW9mKHN0cnVjdCBpcGhkcikgPj4gMjsKIAlpcGgtPmZyYWdfb2ZmCQk9CWRmOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXBfaW5wdXQuYyBiL25ldC9pcHY0L2lwX2lucHV0LmMKaW5kZXggZjM4ZTk3Ni4uOTcwNjkzOSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaXBfaW5wdXQuYworKysgYi9uZXQvaXB2NC9pcF9pbnB1dC5jCkBAIC0xNTgsNyArMTU4LDcgQEAKIGludCBpcF9jYWxsX3JhX2NoYWluKHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IGlwX3JhX2NoYWluICpyYTsKLQl1OCBwcm90b2NvbCA9IHNrYi0+bmguaXBoLT5wcm90b2NvbDsKKwl1OCBwcm90b2NvbCA9IGlwX2hkcihza2IpLT5wcm90b2NvbDsKIAlzdHJ1Y3Qgc29jayAqbGFzdCA9IE5VTEw7CiAKIAlyZWFkX2xvY2soJmlwX3JhX2xvY2spOwpAQCAtMTcxLDcgKzE3MSw3IEBACiAJCWlmIChzayAmJiBpbmV0X3NrKHNrKS0+bnVtID09IHByb3RvY29sICYmCiAJCSAgICAoIXNrLT5za19ib3VuZF9kZXZfaWYgfHwKIAkJICAgICBzay0+c2tfYm91bmRfZGV2X2lmID09IHNrYi0+ZGV2LT5pZmluZGV4KSkgewotCQkJaWYgKHNrYi0+bmguaXBoLT5mcmFnX29mZiAmIGh0b25zKElQX01GfElQX09GRlNFVCkpIHsKKwkJCWlmIChpcF9oZHIoc2tiKS0+ZnJhZ19vZmYgJiBodG9ucyhJUF9NRiB8IElQX09GRlNFVCkpIHsKIAkJCQlza2IgPSBpcF9kZWZyYWcoc2tiLCBJUF9ERUZSQUdfQ0FMTF9SQV9DSEFJTik7CiAJCQkJaWYgKHNrYiA9PSBOVUxMKSB7CiAJCQkJCXJlYWRfdW5sb2NrKCZpcF9yYV9sb2NrKTsKQEAgLTE5OCwxNyArMTk4LDE1IEBACiAKIHN0YXRpYyBpbmxpbmUgaW50IGlwX2xvY2FsX2RlbGl2ZXJfZmluaXNoKHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JaW50IGlobCA9IHNrYi0+bmguaXBoLT5paGwqNDsKLQotCV9fc2tiX3B1bGwoc2tiLCBpaGwpOworCV9fc2tiX3B1bGwoc2tiLCBpcF9oZHJsZW4oc2tiKSk7CiAKIAkvKiBQb2ludCBpbnRvIHRoZSBJUCBkYXRhZ3JhbSwganVzdCBwYXN0IHRoZSBoZWFkZXIuICovCi0Jc2tiLT5oLnJhdyA9IHNrYi0+ZGF0YTsKKwlza2JfcmVzZXRfdHJhbnNwb3J0X2hlYWRlcihza2IpOwogCiAJcmN1X3JlYWRfbG9jaygpOwogCXsKIAkJLyogTm90ZTogU2VlIHJhdy5jIGFuZCBuZXQvcmF3LmgsIFJBV1Y0X0hUQUJMRV9TSVpFPT1NQVhfSU5FVF9QUk9UT1MgKi8KLQkJaW50IHByb3RvY29sID0gc2tiLT5uaC5pcGgtPnByb3RvY29sOworCQlpbnQgcHJvdG9jb2wgPSBpcF9oZHIoc2tiKS0+cHJvdG9jb2w7CiAJCWludCBoYXNoOwogCQlzdHJ1Y3Qgc29jayAqcmF3X3NrOwogCQlzdHJ1Y3QgbmV0X3Byb3RvY29sICppcHByb3Q7CkBAIC0yMjAsNyArMjE4LDcgQEAKIAkJLyogSWYgdGhlcmUgbWF5YmUgYSByYXcgc29ja2V0IHdlIG11c3QgY2hlY2sgLSBpZiBub3Qgd2UKIAkJICogZG9uJ3QgY2FyZSBsZXNzCiAJCSAqLwotCQlpZiAocmF3X3NrICYmICFyYXdfdjRfaW5wdXQoc2tiLCBza2ItPm5oLmlwaCwgaGFzaCkpCisJCWlmIChyYXdfc2sgJiYgIXJhd192NF9pbnB1dChza2IsIGlwX2hkcihza2IpLCBoYXNoKSkKIAkJCXJhd19zayA9IE5VTEw7CiAKIAkJaWYgKChpcHByb3QgPSByY3VfZGVyZWZlcmVuY2UoaW5ldF9wcm90b3NbaGFzaF0pKSAhPSBOVUxMKSB7CkBAIC0yNjYsNyArMjY0LDcgQEAKIAkgKglSZWFzc2VtYmxlIElQIGZyYWdtZW50cy4KIAkgKi8KIAotCWlmIChza2ItPm5oLmlwaC0+ZnJhZ19vZmYgJiBodG9ucyhJUF9NRnxJUF9PRkZTRVQpKSB7CisJaWYgKGlwX2hkcihza2IpLT5mcmFnX29mZiAmIGh0b25zKElQX01GIHwgSVBfT0ZGU0VUKSkgewogCQlza2IgPSBpcF9kZWZyYWcoc2tiLCBJUF9ERUZSQUdfTE9DQUxfREVMSVZFUik7CiAJCWlmICghc2tiKQogCQkJcmV0dXJuIDA7CkBAIC0yOTQsNyArMjkyLDcgQEAKIAkJZ290byBkcm9wOwogCX0KIAotCWlwaCA9IHNrYi0+bmguaXBoOworCWlwaCA9IGlwX2hkcihza2IpOwogCiAJaWYgKGlwX29wdGlvbnNfY29tcGlsZShOVUxMLCBza2IpKSB7CiAJCUlQX0lOQ19TVEFUU19CSChJUFNUQVRTX01JQl9JTkhEUkVSUk9SUyk7CkBAIC0zMzAsNyArMzI4LDggQEAKIAogc3RhdGljIGlubGluZSBpbnQgaXBfcmN2X2ZpbmlzaChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXN0cnVjdCBpcGhkciAqaXBoID0gc2tiLT5uaC5pcGg7CisJY29uc3Qgc3RydWN0IGlwaGRyICppcGggPSBpcF9oZHIoc2tiKTsKKwlzdHJ1Y3QgcnRhYmxlICpydDsKIAogCS8qCiAJICoJSW5pdGlhbGlzZSB0aGUgdmlydHVhbCBwYXRoIGNhY2hlIGZvciB0aGUgcGFja2V0LiBJdCBkZXNjcmliZXMKQEAgLTM0Miw2ICszNDEsOCBAQAogCQlpZiAodW5saWtlbHkoZXJyKSkgewogCQkJaWYgKGVyciA9PSAtRUhPU1RVTlJFQUNIKQogCQkJCUlQX0lOQ19TVEFUU19CSChJUFNUQVRTX01JQl9JTkFERFJFUlJPUlMpOworCQkJZWxzZSBpZiAoZXJyID09IC1FTkVUVU5SRUFDSCkKKwkJCQlJUF9JTkNfU1RBVFNfQkgoSVBTVEFUU19NSUJfSU5OT1JPVVRFUyk7CiAJCQlnb3RvIGRyb3A7CiAJCX0KIAl9CkBAIC0zNjAsNiArMzYxLDEyIEBACiAJaWYgKGlwaC0+aWhsID4gNSAmJiBpcF9yY3Zfb3B0aW9ucyhza2IpKQogCQlnb3RvIGRyb3A7CiAKKwlydCA9IChzdHJ1Y3QgcnRhYmxlKilza2ItPmRzdDsKKwlpZiAocnQtPnJ0X3R5cGUgPT0gUlROX01VTFRJQ0FTVCkKKwkJSVBfSU5DX1NUQVRTX0JIKElQU1RBVFNfTUlCX0lOTUNBU1RQS1RTKTsKKwllbHNlIGlmIChydC0+cnRfdHlwZSA9PSBSVE5fQlJPQURDQVNUKQorCQlJUF9JTkNfU1RBVFNfQkgoSVBTVEFUU19NSUJfSU5CQ0FTVFBLVFMpOworCiAJcmV0dXJuIGRzdF9pbnB1dChza2IpOwogCiBkcm9wOgpAQCAtMzkxLDcgKzM5OCw3IEBACiAJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCBpcGhkcikpKQogCQlnb3RvIGluaGRyX2Vycm9yOwogCi0JaXBoID0gc2tiLT5uaC5pcGg7CisJaXBoID0gaXBfaGRyKHNrYik7CiAKIAkvKgogCSAqCVJGQzExMjI6IDMuMS4yLjIgTVVTVCBzaWxlbnRseSBkaXNjYXJkIGFueSBJUCBmcmFtZSB0aGF0IGZhaWxzIHRoZSBjaGVja3N1bS4KQEAgLTQxMCwxMyArNDE3LDE2IEBACiAJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgaXBoLT5paGwqNCkpCiAJCWdvdG8gaW5oZHJfZXJyb3I7CiAKLQlpcGggPSBza2ItPm5oLmlwaDsKKwlpcGggPSBpcF9oZHIoc2tiKTsKIAogCWlmICh1bmxpa2VseShpcF9mYXN0X2NzdW0oKHU4ICopaXBoLCBpcGgtPmlobCkpKQogCQlnb3RvIGluaGRyX2Vycm9yOwogCiAJbGVuID0gbnRvaHMoaXBoLT50b3RfbGVuKTsKLQlpZiAoc2tiLT5sZW4gPCBsZW4gfHwgbGVuIDwgKGlwaC0+aWhsKjQpKQorCWlmIChza2ItPmxlbiA8IGxlbikgeworCQlJUF9JTkNfU1RBVFNfQkgoSVBTVEFUU19NSUJfSU5UUlVOQ0FURURQS1RTKTsKKwkJZ290byBkcm9wOworCX0gZWxzZSBpZiAobGVuIDwgKGlwaC0+aWhsKjQpKQogCQlnb3RvIGluaGRyX2Vycm9yOwogCiAJLyogT3VyIHRyYW5zcG9ydCBtZWRpdW0gbWF5IGhhdmUgcGFkZGVkIHRoZSBidWZmZXIgb3V0LiBOb3cgd2Uga25vdyBpdApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXBfb3B0aW9ucy5jIGIvbmV0L2lwdjQvaXBfb3B0aW9ucy5jCmluZGV4IGY5MDZhODAuLjI1MTM0NjgyIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcF9vcHRpb25zLmMKKysrIGIvbmV0L2lwdjQvaXBfb3B0aW9ucy5jCkBAIC00MCw3ICs0MCw3IEBACiB2b2lkIGlwX29wdGlvbnNfYnVpbGQoc3RydWN0IHNrX2J1ZmYgKiBza2IsIHN0cnVjdCBpcF9vcHRpb25zICogb3B0LAogCQkJICAgIF9fYmUzMiBkYWRkciwgc3RydWN0IHJ0YWJsZSAqcnQsIGludCBpc19mcmFnKQogewotCXVuc2lnbmVkIGNoYXIgKiBpcGggPSBza2ItPm5oLnJhdzsKKwl1bnNpZ25lZCBjaGFyICppcGggPSBza2JfbmV0d29ya19oZWFkZXIoc2tiKTsKIAogCW1lbWNweSgmKElQQ0Ioc2tiKS0+b3B0KSwgb3B0LCBzaXplb2Yoc3RydWN0IGlwX29wdGlvbnMpKTsKIAltZW1jcHkoaXBoK3NpemVvZihzdHJ1Y3QgaXBoZHIpLCBvcHQtPl9fZGF0YSwgb3B0LT5vcHRsZW4pOwpAQCAtMTA0LDEzICsxMDQsMTMgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0Jc3B0ciA9IHNrYi0+bmgucmF3OworCXNwdHIgPSBza2JfbmV0d29ya19oZWFkZXIoc2tiKTsKIAlkcHRyID0gZG9wdC0+X19kYXRhOwogCiAJaWYgKHNrYi0+ZHN0KQogCQlkYWRkciA9ICgoc3RydWN0IHJ0YWJsZSopc2tiLT5kc3QpLT5ydF9zcGVjX2RzdDsKIAllbHNlCi0JCWRhZGRyID0gc2tiLT5uaC5pcGgtPmRhZGRyOworCQlkYWRkciA9IGlwX2hkcihza2IpLT5kYWRkcjsKIAogCWlmIChzb3B0LT5ycikgewogCQlvcHRsZW4gID0gc3B0cltzb3B0LT5ycisxXTsKQEAgLTE4MCw3ICsxODAsOCBAQAogCQkJLyoKIAkJCSAqIFJGQzE4MTIgcmVxdWlyZXMgdG8gZml4IGlsbGVnYWwgc291cmNlIHJvdXRlcy4KIAkJCSAqLwotCQkJaWYgKG1lbWNtcCgmc2tiLT5uaC5pcGgtPnNhZGRyLCAmc3RhcnRbc29mZnNldCszXSwgNCkgPT0gMCkKKwkJCWlmIChtZW1jbXAoJmlwX2hkcihza2IpLT5zYWRkciwKKwkJCQkgICAmc3RhcnRbc29mZnNldCArIDNdLCA0KSA9PSAwKQogCQkJCWRvZmZzZXQgLT0gNDsKIAkJfQogCQlpZiAoZG9mZnNldCA+IDMpIHsKQEAgLTIxNyw3ICsyMTgsNyBAQAogCiB2b2lkIGlwX29wdGlvbnNfZnJhZ21lbnQoc3RydWN0IHNrX2J1ZmYgKiBza2IpCiB7Ci0JdW5zaWduZWQgY2hhciAqIG9wdHB0ciA9IHNrYi0+bmgucmF3ICsgc2l6ZW9mKHN0cnVjdCBpcGhkcik7CisJdW5zaWduZWQgY2hhciAqb3B0cHRyID0gc2tiX25ldHdvcmtfaGVhZGVyKHNrYikgKyBzaXplb2Yoc3RydWN0IGlwaGRyKTsKIAlzdHJ1Y3QgaXBfb3B0aW9ucyAqIG9wdCA9ICYoSVBDQihza2IpLT5vcHQpOwogCWludCAgbCA9IG9wdC0+b3B0bGVuOwogCWludCAgb3B0bGVuOwpAQCAtMjY0LDEyICsyNjUsMTMgQEAKIAogCWlmICghb3B0KSB7CiAJCW9wdCA9ICYoSVBDQihza2IpLT5vcHQpOwotCQlpcGggPSBza2ItPm5oLnJhdzsKKwkJaXBoID0gc2tiX25ldHdvcmtfaGVhZGVyKHNrYik7CiAJCW9wdC0+b3B0bGVuID0gKChzdHJ1Y3QgaXBoZHIgKilpcGgpLT5paGwqNCAtIHNpemVvZihzdHJ1Y3QgaXBoZHIpOwogCQlvcHRwdHIgPSBpcGggKyBzaXplb2Yoc3RydWN0IGlwaGRyKTsKIAkJb3B0LT5pc19kYXRhID0gMDsKIAl9IGVsc2UgewotCQlvcHRwdHIgPSBvcHQtPmlzX2RhdGEgPyBvcHQtPl9fZGF0YSA6ICh1bnNpZ25lZCBjaGFyKikmKHNrYi0+bmguaXBoWzFdKTsKKwkJb3B0cHRyID0gb3B0LT5pc19kYXRhID8gb3B0LT5fX2RhdGEgOgorCQkJCQkodW5zaWduZWQgY2hhciAqKSYoaXBfaGRyKHNrYilbMV0pOwogCQlpcGggPSBvcHRwdHIgLSBzaXplb2Yoc3RydWN0IGlwaGRyKTsKIAl9CiAKQEAgLTU2Myw3ICs1NjUsNyBAQAogCXN0cnVjdCAgIGlwX29wdGlvbnMgKiBvcHQJPSAmKElQQ0Ioc2tiKS0+b3B0KTsKIAl1bnNpZ25lZCBjaGFyICogb3B0cHRyOwogCXN0cnVjdCBydGFibGUgKnJ0ID0gKHN0cnVjdCBydGFibGUqKXNrYi0+ZHN0OwotCXVuc2lnbmVkIGNoYXIgKnJhdyA9IHNrYi0+bmgucmF3OworCXVuc2lnbmVkIGNoYXIgKnJhdyA9IHNrYl9uZXR3b3JrX2hlYWRlcihza2IpOwogCiAJaWYgKG9wdC0+cnJfbmVlZGFkZHIpIHsKIAkJb3B0cHRyID0gKHVuc2lnbmVkIGNoYXIgKilyYXcgKyBvcHQtPnJyOwpAQCAtNTg3LDcgKzU4OSw3IEBACiAJCWlmIChzcnJwdHIgKyAzIDw9IHNycnNwYWNlKSB7CiAJCQlvcHQtPmlzX2NoYW5nZWQgPSAxOwogCQkJaXBfcnRfZ2V0X3NvdXJjZSgmb3B0cHRyW3NycnB0ci0xXSwgcnQpOwotCQkJc2tiLT5uaC5pcGgtPmRhZGRyID0gcnQtPnJ0X2RzdDsKKwkJCWlwX2hkcihza2IpLT5kYWRkciA9IHJ0LT5ydF9kc3Q7CiAJCQlvcHRwdHJbMl0gPSBzcnJwdHIrNDsKIAkJfSBlbHNlIGlmIChuZXRfcmF0ZWxpbWl0KCkpCiAJCQlwcmludGsoS0VSTl9DUklUICJpcF9mb3J3YXJkKCk6IEFyZ2ghIERlc3RpbmF0aW9uIGxvc3QhXG4iKTsKQEAgLTU5OSw3ICs2MDEsNyBAQAogCX0KIAlpZiAob3B0LT5pc19jaGFuZ2VkKSB7CiAJCW9wdC0+aXNfY2hhbmdlZCA9IDA7Ci0JCWlwX3NlbmRfY2hlY2soc2tiLT5uaC5pcGgpOworCQlpcF9zZW5kX2NoZWNrKGlwX2hkcihza2IpKTsKIAl9CiB9CiAKQEAgLTYwOCw4ICs2MTAsOCBAQAogCXN0cnVjdCBpcF9vcHRpb25zICpvcHQgPSAmKElQQ0Ioc2tiKS0+b3B0KTsKIAlpbnQgc3Jyc3BhY2UsIHNycnB0cjsKIAlfX2JlMzIgbmV4dGhvcDsKLQlzdHJ1Y3QgaXBoZHIgKmlwaCA9IHNrYi0+bmguaXBoOwotCXVuc2lnbmVkIGNoYXIgKiBvcHRwdHIgPSBza2ItPm5oLnJhdyArIG9wdC0+c3JyOworCXN0cnVjdCBpcGhkciAqaXBoID0gaXBfaGRyKHNrYik7CisJdW5zaWduZWQgY2hhciAqb3B0cHRyID0gc2tiX25ldHdvcmtfaGVhZGVyKHNrYikgKyBvcHQtPnNycjsKIAlzdHJ1Y3QgcnRhYmxlICpydCA9IChzdHJ1Y3QgcnRhYmxlKilza2ItPmRzdDsKIAlzdHJ1Y3QgcnRhYmxlICpydDI7CiAJaW50IGVycjsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwX291dHB1dC5jIGIvbmV0L2lwdjQvaXBfb3V0cHV0LmMKaW5kZXggZDA5NjMzMi4uZDY0MjdkOSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaXBfb3V0cHV0LmMKKysrIGIvbmV0L2lwdjQvaXBfb3V0cHV0LmMKQEAgLTk1LDggKzk1LDggQEAKIC8qIGRldl9sb29wYmFja194bWl0IGZvciB1c2Ugd2l0aCBuZXRmaWx0ZXIuICovCiBzdGF0aWMgaW50IGlwX2Rldl9sb29wYmFja194bWl0KHN0cnVjdCBza19idWZmICpuZXdza2IpCiB7Ci0JbmV3c2tiLT5tYWMucmF3ID0gbmV3c2tiLT5kYXRhOwotCV9fc2tiX3B1bGwobmV3c2tiLCBuZXdza2ItPm5oLnJhdyAtIG5ld3NrYi0+ZGF0YSk7CisJc2tiX3Jlc2V0X21hY19oZWFkZXIobmV3c2tiKTsKKwlfX3NrYl9wdWxsKG5ld3NrYiwgc2tiX25ldHdvcmtfb2Zmc2V0KG5ld3NrYikpOwogCW5ld3NrYi0+cGt0X3R5cGUgPSBQQUNLRVRfTE9PUEJBQ0s7CiAJbmV3c2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKIAlCVUdfVFJBUChuZXdza2ItPmRzdCk7CkBAIC0xMjUsMTEgKzEyNSw5IEBACiAJc3RydWN0IGlwaGRyICppcGg7CiAKIAkvKiBCdWlsZCB0aGUgSVAgaGVhZGVyLiAqLwotCWlmIChvcHQpCi0JCWlwaD0oc3RydWN0IGlwaGRyICopc2tiX3B1c2goc2tiLHNpemVvZihzdHJ1Y3QgaXBoZHIpICsgb3B0LT5vcHRsZW4pOwotCWVsc2UKLQkJaXBoPShzdHJ1Y3QgaXBoZHIgKilza2JfcHVzaChza2Isc2l6ZW9mKHN0cnVjdCBpcGhkcikpOwotCisJc2tiX3B1c2goc2tiLCBzaXplb2Yoc3RydWN0IGlwaGRyKSArIChvcHQgPyBvcHQtPm9wdGxlbiA6IDApKTsKKwlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiKTsKKwlpcGggPSBpcF9oZHIoc2tiKTsKIAlpcGgtPnZlcnNpb24gID0gNDsKIAlpcGgtPmlobCAgICAgID0gNTsKIAlpcGgtPnRvcyAgICAgID0gaW5ldC0+dG9zOwpAQCAtMTQzLDcgKzE0MSw2IEBACiAJaXBoLT5wcm90b2NvbCA9IHNrLT5za19wcm90b2NvbDsKIAlpcGgtPnRvdF9sZW4gID0gaHRvbnMoc2tiLT5sZW4pOwogCWlwX3NlbGVjdF9pZGVudChpcGgsICZydC0+dS5kc3QsIHNrKTsKLQlza2ItPm5oLmlwaCAgID0gaXBoOwogCiAJaWYgKG9wdCAmJiBvcHQtPm9wdGxlbikgewogCQlpcGgtPmlobCArPSBvcHQtPm9wdGxlbj4+MjsKQEAgLTE2Myw5ICsxNjAsMTUgQEAKIHN0YXRpYyBpbmxpbmUgaW50IGlwX2ZpbmlzaF9vdXRwdXQyKHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IGRzdF9lbnRyeSAqZHN0ID0gc2tiLT5kc3Q7CisJc3RydWN0IHJ0YWJsZSAqcnQgPSAoc3RydWN0IHJ0YWJsZSAqKWRzdDsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZHN0LT5kZXY7CiAJaW50IGhoX2xlbiA9IExMX1JFU0VSVkVEX1NQQUNFKGRldik7CiAKKwlpZiAocnQtPnJ0X3R5cGUgPT0gUlROX01VTFRJQ0FTVCkKKwkJSVBfSU5DX1NUQVRTKElQU1RBVFNfTUlCX09VVE1DQVNUUEtUUyk7CisJZWxzZSBpZiAocnQtPnJ0X3R5cGUgPT0gUlROX0JST0FEQ0FTVCkKKwkJSVBfSU5DX1NUQVRTKElQU1RBVFNfTUlCX09VVEJDQVNUUEtUUyk7CisKIAkvKiBCZSBwYXJhbm9pZCwgcmF0aGVyIHRoYW4gdG9vIGNsZXZlci4gKi8KIAlpZiAodW5saWtlbHkoc2tiX2hlYWRyb29tKHNrYikgPCBoaF9sZW4gJiYgZGV2LT5oYXJkX2hlYWRlcikpIHsKIAkJc3RydWN0IHNrX2J1ZmYgKnNrYjI7CkBAIC0xOTIsNiArMTk1LDE0IEBACiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IGlwX3NrYl9kc3RfbXR1KHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGluZXRfc29jayAqaW5ldCA9IHNrYi0+c2sgPyBpbmV0X3NrKHNrYi0+c2spIDogTlVMTDsKKworCXJldHVybiAoaW5ldCAmJiBpbmV0LT5wbXR1ZGlzYyA9PSBJUF9QTVRVRElTQ19QUk9CRSkgPworCSAgICAgICBza2ItPmRzdC0+ZGV2LT5tdHUgOiBkc3RfbXR1KHNrYi0+ZHN0KTsKK30KKwogc3RhdGljIGlubGluZSBpbnQgaXBfZmluaXNoX291dHB1dChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogI2lmIGRlZmluZWQoQ09ORklHX05FVEZJTFRFUikgJiYgZGVmaW5lZChDT05GSUdfWEZSTSkKQEAgLTIwMSw3ICsyMTIsNyBAQAogCQlyZXR1cm4gZHN0X291dHB1dChza2IpOwogCX0KICNlbmRpZgotCWlmIChza2ItPmxlbiA+IGRzdF9tdHUoc2tiLT5kc3QpICYmICFza2JfaXNfZ3NvKHNrYikpCisJaWYgKHNrYi0+bGVuID4gaXBfc2tiX2RzdF9tdHUoc2tiKSAmJiAhc2tiX2lzX2dzbyhza2IpKQogCQlyZXR1cm4gaXBfZnJhZ21lbnQoc2tiLCBpcF9maW5pc2hfb3V0cHV0Mik7CiAJZWxzZQogCQlyZXR1cm4gaXBfZmluaXNoX291dHB1dDIoc2tiKTsKQEAgLTI0OCw3ICsyNTksNyBAQAogCiAJCS8qIE11bHRpY2FzdHMgd2l0aCB0dGwgMCBtdXN0IG5vdCBnbyBiZXlvbmQgdGhlIGhvc3QgKi8KIAotCQlpZiAoc2tiLT5uaC5pcGgtPnR0bCA9PSAwKSB7CisJCWlmIChpcF9oZHIoc2tiKS0+dHRsID09IDApIHsKIAkJCWtmcmVlX3NrYihza2IpOwogCQkJcmV0dXJuIDA7CiAJCX0KQEAgLTMzMyw3ICszNDQsOSBAQAogCQlnb3RvIG5vX3JvdXRlOwogCiAJLyogT0ssIHdlIGtub3cgd2hlcmUgdG8gc2VuZCBpdCwgYWxsb2NhdGUgYW5kIGJ1aWxkIElQIGhlYWRlci4gKi8KLQlpcGggPSAoc3RydWN0IGlwaGRyICopIHNrYl9wdXNoKHNrYiwgc2l6ZW9mKHN0cnVjdCBpcGhkcikgKyAob3B0ID8gb3B0LT5vcHRsZW4gOiAwKSk7CisJc2tiX3B1c2goc2tiLCBzaXplb2Yoc3RydWN0IGlwaGRyKSArIChvcHQgPyBvcHQtPm9wdGxlbiA6IDApKTsKKwlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiKTsKKwlpcGggPSBpcF9oZHIoc2tiKTsKIAkqKChfX2JlMTYgKilpcGgpID0gaHRvbnMoKDQgPDwgMTIpIHwgKDUgPDwgOCkgfCAoaW5ldC0+dG9zICYgMHhmZikpOwogCWlwaC0+dG90X2xlbiA9IGh0b25zKHNrYi0+bGVuKTsKIAlpZiAoaXBfZG9udF9mcmFnbWVudChzaywgJnJ0LT51LmRzdCkgJiYgIWlwZnJhZ29rKQpAQCAtMzQ0LDcgKzM1Nyw2IEBACiAJaXBoLT5wcm90b2NvbCA9IHNrLT5za19wcm90b2NvbDsKIAlpcGgtPnNhZGRyICAgID0gcnQtPnJ0X3NyYzsKIAlpcGgtPmRhZGRyICAgID0gcnQtPnJ0X2RzdDsKLQlza2ItPm5oLmlwaCAgID0gaXBoOwogCS8qIFRyYW5zcG9ydCBsYXllciBzZXQgc2tiLT5oLmZvbyBpdHNlbGYuICovCiAKIAlpZiAob3B0ICYmIG9wdC0+b3B0bGVuKSB7CkBAIC0zODYsMjEgKzM5OCwxMCBAQAogI2lmZGVmIENPTkZJR19ORVRfU0NIRUQKIAl0by0+dGNfaW5kZXggPSBmcm9tLT50Y19pbmRleDsKICNlbmRpZgotI2lmZGVmIENPTkZJR19ORVRGSUxURVIKLQkvKiBDb25uZWN0aW9uIGFzc29jaWF0aW9uIGlzIHNhbWUgYXMgcHJlLWZyYWcgcGFja2V0ICovCi0JbmZfY29ubnRyYWNrX3B1dCh0by0+bmZjdCk7Ci0JdG8tPm5mY3QgPSBmcm9tLT5uZmN0OwotCW5mX2Nvbm50cmFja19nZXQodG8tPm5mY3QpOwotCXRvLT5uZmN0aW5mbyA9IGZyb20tPm5mY3RpbmZvOworCW5mX2NvcHkodG8sIGZyb20pOwogI2lmIGRlZmluZWQoQ09ORklHX0lQX1ZTKSB8fCBkZWZpbmVkKENPTkZJR19JUF9WU19NT0RVTEUpCiAJdG8tPmlwdnNfcHJvcGVydHkgPSBmcm9tLT5pcHZzX3Byb3BlcnR5OwogI2VuZGlmCi0jaWZkZWYgQ09ORklHX0JSSURHRV9ORVRGSUxURVIKLQluZl9icmlkZ2VfcHV0KHRvLT5uZl9icmlkZ2UpOwotCXRvLT5uZl9icmlkZ2UgPSBmcm9tLT5uZl9icmlkZ2U7Ci0JbmZfYnJpZGdlX2dldCh0by0+bmZfYnJpZGdlKTsKLSNlbmRpZgotI2VuZGlmCiAJc2tiX2NvcHlfc2VjbWFyayh0bywgZnJvbSk7CiB9CiAKQEAgLTQzMCwxMiArNDMxLDEyIEBACiAJICoJUG9pbnQgaW50byB0aGUgSVAgZGF0YWdyYW0gaGVhZGVyLgogCSAqLwogCi0JaXBoID0gc2tiLT5uaC5pcGg7CisJaXBoID0gaXBfaGRyKHNrYik7CiAKIAlpZiAodW5saWtlbHkoKGlwaC0+ZnJhZ19vZmYgJiBodG9ucyhJUF9ERikpICYmICFza2ItPmxvY2FsX2RmKSkgewogCQlJUF9JTkNfU1RBVFMoSVBTVEFUU19NSUJfRlJBR0ZBSUxTKTsKIAkJaWNtcF9zZW5kKHNrYiwgSUNNUF9ERVNUX1VOUkVBQ0gsIElDTVBfRlJBR19ORUVERUQsCi0JCQkgIGh0b25sKGRzdF9tdHUoJnJ0LT51LmRzdCkpKTsKKwkJCSAgaHRvbmwoaXBfc2tiX2RzdF9tdHUoc2tiKSkpOwogCQlrZnJlZV9za2Ioc2tiKTsKIAkJcmV0dXJuIC1FTVNHU0laRTsKIAl9CkBAIC01MDIsMTAgKzUwMywxMSBAQAogCQkJICogYmVmb3JlIHByZXZpb3VzIG9uZSB3ZW50IGRvd24uICovCiAJCQlpZiAoZnJhZykgewogCQkJCWZyYWctPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7Ci0JCQkJZnJhZy0+aC5yYXcgPSBmcmFnLT5kYXRhOwotCQkJCWZyYWctPm5oLnJhdyA9IF9fc2tiX3B1c2goZnJhZywgaGxlbik7Ci0JCQkJbWVtY3B5KGZyYWctPm5oLnJhdywgaXBoLCBobGVuKTsKLQkJCQlpcGggPSBmcmFnLT5uaC5pcGg7CisJCQkJc2tiX3Jlc2V0X3RyYW5zcG9ydF9oZWFkZXIoZnJhZyk7CisJCQkJX19za2JfcHVzaChmcmFnLCBobGVuKTsKKwkJCQlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoZnJhZyk7CisJCQkJbWVtY3B5KHNrYl9uZXR3b3JrX2hlYWRlcihmcmFnKSwgaXBoLCBobGVuKTsKKwkJCQlpcGggPSBpcF9oZHIoZnJhZyk7CiAJCQkJaXBoLT50b3RfbGVuID0gaHRvbnMoZnJhZy0+bGVuKTsKIAkJCQlpcF9jb3B5X21ldGFkYXRhKGZyYWcsIHNrYik7CiAJCQkJaWYgKG9mZnNldCA9PSAwKQpAQCAtNTY2LDcgKzU2OCw3IEBACiAJICoJS2VlcCBjb3B5aW5nIGRhdGEgdW50aWwgd2UgcnVuIG91dC4KIAkgKi8KIAotCXdoaWxlKGxlZnQgPiAwKQl7CisJd2hpbGUgKGxlZnQgPiAwKSB7CiAJCWxlbiA9IGxlZnQ7CiAJCS8qIElGOiBpdCBkb2Vzbid0IGZpdCwgdXNlICdtdHUnIC0gdGhlIGRhdGEgc3BhY2UgbGVmdCAqLwogCQlpZiAobGVuID4gbXR1KQpAQCAtNTkzLDggKzU5NSw4IEBACiAJCWlwX2NvcHlfbWV0YWRhdGEoc2tiMiwgc2tiKTsKIAkJc2tiX3Jlc2VydmUoc2tiMiwgbGxfcnMpOwogCQlza2JfcHV0KHNrYjIsIGxlbiArIGhsZW4pOwotCQlza2IyLT5uaC5yYXcgPSBza2IyLT5kYXRhOwotCQlza2IyLT5oLnJhdyA9IHNrYjItPmRhdGEgKyBobGVuOworCQlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiMik7CisJCXNrYjItPnRyYW5zcG9ydF9oZWFkZXIgPSBza2IyLT5uZXR3b3JrX2hlYWRlciArIGhsZW47CiAKIAkJLyoKIAkJICoJQ2hhcmdlIHRoZSBtZW1vcnkgZm9yIHRoZSBmcmFnbWVudCB0byBhbnkgb3duZXIKQEAgLTYwOCwxOSArNjEwLDE5IEBACiAJCSAqCUNvcHkgdGhlIHBhY2tldCBoZWFkZXIgaW50byB0aGUgbmV3IGJ1ZmZlci4KIAkJICovCiAKLQkJbWVtY3B5KHNrYjItPm5oLnJhdywgc2tiLT5kYXRhLCBobGVuKTsKKwkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIHNrYl9uZXR3b3JrX2hlYWRlcihza2IyKSwgaGxlbik7CiAKIAkJLyoKIAkJICoJQ29weSBhIGJsb2NrIG9mIHRoZSBJUCBkYXRhZ3JhbS4KIAkJICovCi0JCWlmIChza2JfY29weV9iaXRzKHNrYiwgcHRyLCBza2IyLT5oLnJhdywgbGVuKSkKKwkJaWYgKHNrYl9jb3B5X2JpdHMoc2tiLCBwdHIsIHNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYjIpLCBsZW4pKQogCQkJQlVHKCk7CiAJCWxlZnQgLT0gbGVuOwogCiAJCS8qCiAJCSAqCUZpbGwgaW4gdGhlIG5ldyBoZWFkZXIgZmllbGRzLgogCQkgKi8KLQkJaXBoID0gc2tiMi0+bmguaXBoOworCQlpcGggPSBpcF9oZHIoc2tiMik7CiAJCWlwaC0+ZnJhZ19vZmYgPSBodG9ucygob2Zmc2V0ID4+IDMpKTsKIAogCQkvKiBBTks6IGRpcnR5LCBidXQgZWZmZWN0aXZlIHRyaWNrLiBVcGdyYWRlIG9wdGlvbnMgb25seSBpZgpAQCAtNzIyLDEwICs3MjQsMTAgQEAKIAkJc2tiX3B1dChza2IsZnJhZ2hlYWRlcmxlbiArIHRyYW5zaGRybGVuKTsKIAogCQkvKiBpbml0aWFsaXplIG5ldHdvcmsgaGVhZGVyIHBvaW50ZXIgKi8KLQkJc2tiLT5uaC5yYXcgPSBza2ItPmRhdGE7CisJCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOwogCiAJCS8qIGluaXRpYWxpemUgcHJvdG9jb2wgaGVhZGVyIHBvaW50ZXIgKi8KLQkJc2tiLT5oLnJhdyA9IHNrYi0+ZGF0YSArIGZyYWdoZWFkZXJsZW47CisJCXNrYi0+dHJhbnNwb3J0X2hlYWRlciA9IHNrYi0+bmV0d29ya19oZWFkZXIgKyBmcmFnaGVhZGVybGVuOwogCiAJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fUEFSVElBTDsKIAkJc2tiLT5jc3VtID0gMDsKQEAgLTc5OSw3ICs4MDEsOSBAQAogCQkJaW5ldC0+Y29yay5hZGRyID0gaXBjLT5hZGRyOwogCQl9CiAJCWRzdF9ob2xkKCZydC0+dS5kc3QpOwotCQlpbmV0LT5jb3JrLmZyYWdzaXplID0gbXR1ID0gZHN0X210dShydC0+dS5kc3QucGF0aCk7CisJCWluZXQtPmNvcmsuZnJhZ3NpemUgPSBtdHUgPSBpbmV0LT5wbXR1ZGlzYyA9PSBJUF9QTVRVRElTQ19QUk9CRSA/CisJCQkJCSAgICBydC0+dS5kc3QuZGV2LT5tdHUgOgorCQkJCQkgICAgZHN0X210dShydC0+dS5kc3QucGF0aCk7CiAJCWluZXQtPmNvcmsucnQgPSBydDsKIAkJaW5ldC0+Y29yay5sZW5ndGggPSAwOwogCQlzay0+c2tfc25kbXNnX3BhZ2UgPSBOVUxMOwpAQCAtOTI5LDkgKzkzMywxMCBAQAogCQkJICoJRmluZCB3aGVyZSB0byBzdGFydCBwdXR0aW5nIGJ5dGVzLgogCQkJICovCiAJCQlkYXRhID0gc2tiX3B1dChza2IsIGZyYWdsZW4pOwotCQkJc2tiLT5uaC5yYXcgPSBkYXRhICsgZXh0aGRybGVuOworCQkJc2tiX3NldF9uZXR3b3JrX2hlYWRlcihza2IsIGV4dGhkcmxlbik7CisJCQlza2ItPnRyYW5zcG9ydF9oZWFkZXIgPSAoc2tiLT5uZXR3b3JrX2hlYWRlciArCisJCQkJCQkgZnJhZ2hlYWRlcmxlbik7CiAJCQlkYXRhICs9IGZyYWdoZWFkZXJsZW47Ci0JCQlza2ItPmgucmF3ID0gZGF0YSArIGV4dGhkcmxlbjsKIAogCQkJaWYgKGZyYWdnYXApIHsKIAkJCQlza2ItPmNzdW0gPSBza2JfY29weV9hbmRfY3N1bV9iaXRzKApAQCAtMTEwMCw4ICsxMTA1LDYgQEAKIAkJfQogCQlpZiAobGVuIDw9IDApIHsKIAkJCXN0cnVjdCBza19idWZmICpza2JfcHJldjsKLQkJCWNoYXIgKmRhdGE7Ci0JCQlzdHJ1Y3QgaXBoZHIgKmlwaDsKIAkJCWludCBhbGxvY2xlbjsKIAogCQkJc2tiX3ByZXYgPSBza2I7CkBAIC0xMTI0LDE1ICsxMTI3LDE1IEBACiAJCQkvKgogCQkJICoJRmluZCB3aGVyZSB0byBzdGFydCBwdXR0aW5nIGJ5dGVzLgogCQkJICovCi0JCQlkYXRhID0gc2tiX3B1dChza2IsIGZyYWdoZWFkZXJsZW4gKyBmcmFnZ2FwKTsKLQkJCXNrYi0+bmguaXBoID0gaXBoID0gKHN0cnVjdCBpcGhkciAqKWRhdGE7Ci0JCQlkYXRhICs9IGZyYWdoZWFkZXJsZW47Ci0JCQlza2ItPmgucmF3ID0gZGF0YTsKLQorCQkJc2tiX3B1dChza2IsIGZyYWdoZWFkZXJsZW4gKyBmcmFnZ2FwKTsKKwkJCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOworCQkJc2tiLT50cmFuc3BvcnRfaGVhZGVyID0gKHNrYi0+bmV0d29ya19oZWFkZXIgKworCQkJCQkJIGZyYWdoZWFkZXJsZW4pOwogCQkJaWYgKGZyYWdnYXApIHsKLQkJCQlza2ItPmNzdW0gPSBza2JfY29weV9hbmRfY3N1bV9iaXRzKAotCQkJCQlza2JfcHJldiwgbWF4ZnJhZ2xlbiwKLQkJCQkJZGF0YSwgZnJhZ2dhcCwgMCk7CisJCQkJc2tiLT5jc3VtID0gc2tiX2NvcHlfYW5kX2NzdW1fYml0cyhza2JfcHJldiwKKwkJCQkJCQkJICAgbWF4ZnJhZ2xlbiwKKwkJCQkJCSAgICBza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpLAorCQkJCQkJCQkgICBmcmFnZ2FwLCAwKTsKIAkJCQlza2JfcHJldi0+Y3N1bSA9IGNzdW1fc3ViKHNrYl9wcmV2LT5jc3VtLAogCQkJCQkJCSAgc2tiLT5jc3VtKTsKIAkJCQlwc2tiX3RyaW1fdW5pcXVlKHNrYl9wcmV2LCBtYXhmcmFnbGVuKTsKQEAgLTExOTgsMTAgKzEyMDEsMTAgQEAKIAl0YWlsX3NrYiA9ICYoc2tiX3NoaW5mbyhza2IpLT5mcmFnX2xpc3QpOwogCiAJLyogbW92ZSBza2ItPmRhdGEgdG8gaXAgaGVhZGVyIGZyb20gZXh0IGhlYWRlciAqLwotCWlmIChza2ItPmRhdGEgPCBza2ItPm5oLnJhdykKLQkJX19za2JfcHVsbChza2IsIHNrYi0+bmgucmF3IC0gc2tiLT5kYXRhKTsKKwlpZiAoc2tiLT5kYXRhIDwgc2tiX25ldHdvcmtfaGVhZGVyKHNrYikpCisJCV9fc2tiX3B1bGwoc2tiLCBza2JfbmV0d29ya19vZmZzZXQoc2tiKSk7CiAJd2hpbGUgKCh0bXBfc2tiID0gX19za2JfZGVxdWV1ZSgmc2stPnNrX3dyaXRlX3F1ZXVlKSkgIT0gTlVMTCkgewotCQlfX3NrYl9wdWxsKHRtcF9za2IsIHNrYi0+aC5yYXcgLSBza2ItPm5oLnJhdyk7CisJCV9fc2tiX3B1bGwodG1wX3NrYiwgc2tiX25ldHdvcmtfaGVhZGVyX2xlbihza2IpKTsKIAkJKnRhaWxfc2tiID0gdG1wX3NrYjsKIAkJdGFpbF9za2IgPSAmKHRtcF9za2ItPm5leHQpOwogCQlza2ItPmxlbiArPSB0bXBfc2tiLT5sZW47CkBAIC0xMjE2LDEzICsxMjE5LDEzIEBACiAJICogdG8gZnJhZ21lbnQgdGhlIGZyYW1lIGdlbmVyYXRlZCBoZXJlLiBObyBtYXR0ZXIsIHdoYXQgdHJhbnNmb3JtcwogCSAqIGhvdyB0cmFuc2Zvcm1zIGNoYW5nZSBzaXplIG9mIHRoZSBwYWNrZXQsIGl0IHdpbGwgY29tZSBvdXQuCiAJICovCi0JaWYgKGluZXQtPnBtdHVkaXNjICE9IElQX1BNVFVESVNDX0RPKQorCWlmIChpbmV0LT5wbXR1ZGlzYyA8IElQX1BNVFVESVNDX0RPKQogCQlza2ItPmxvY2FsX2RmID0gMTsKIAogCS8qIERGIGJpdCBpcyBzZXQgd2hlbiB3ZSB3YW50IHRvIHNlZSBERiBvbiBvdXRnb2luZyBmcmFtZXMuCiAJICogSWYgbG9jYWxfZGYgaXMgc2V0IHRvbywgd2Ugc3RpbGwgYWxsb3cgdG8gZnJhZ21lbnQgdGhpcyBmcmFtZQogCSAqIGxvY2FsbHkuICovCi0JaWYgKGluZXQtPnBtdHVkaXNjID09IElQX1BNVFVESVNDX0RPIHx8CisJaWYgKGluZXQtPnBtdHVkaXNjID49IElQX1BNVFVESVNDX0RPIHx8CiAJICAgIChza2ItPmxlbiA8PSBkc3RfbXR1KCZydC0+dS5kc3QpICYmCiAJICAgICBpcF9kb250X2ZyYWdtZW50KHNrLCAmcnQtPnUuZHN0KSkpCiAJCWRmID0gaHRvbnMoSVBfREYpOwpAQCAtMTM1MiwxMSArMTM1NSwxMSBAQAogCQlzdHJ1Y3QgZmxvd2kgZmwgPSB7IC5ubF91ID0geyAuaXA0X3UgPQogCQkJCQkgICAgICB7IC5kYWRkciA9IGRhZGRyLAogCQkJCQkJLnNhZGRyID0gcnQtPnJ0X3NwZWNfZHN0LAotCQkJCQkJLnRvcyA9IFJUX1RPUyhza2ItPm5oLmlwaC0+dG9zKSB9IH0sCisJCQkJCQkudG9zID0gUlRfVE9TKGlwX2hkcihza2IpLT50b3MpIH0gfSwKIAkJCQkgICAgLyogTm90IHF1aXRlIGNsZWFuLCBidXQgcmlnaHQuICovCiAJCQkJICAgIC51bGlfdSA9IHsgLnBvcnRzID0KLQkJCQkJICAgICAgIHsgLnNwb3J0ID0gc2tiLT5oLnRoLT5kZXN0LAotCQkJCQkJIC5kcG9ydCA9IHNrYi0+aC50aC0+c291cmNlIH0gfSwKKwkJCQkJICAgICAgIHsgLnNwb3J0ID0gdGNwX2hkcihza2IpLT5kZXN0LAorCQkJCQkJIC5kcG9ydCA9IHRjcF9oZHIoc2tiKS0+c291cmNlIH0gfSwKIAkJCQkgICAgLnByb3RvID0gc2stPnNrX3Byb3RvY29sIH07CiAJCXNlY3VyaXR5X3NrYl9jbGFzc2lmeV9mbG93KHNrYiwgJmZsKTsKIAkJaWYgKGlwX3JvdXRlX291dHB1dF9rZXkoJnJ0LCAmZmwpKQpAQCAtMTM3MCwxNCArMTM3MywxNiBAQAogCSAgIHdpdGggbG9jYWxseSBkaXNhYmxlZCBCSCBhbmQgdGhhdCBzayBjYW5ub3QgYmUgYWxyZWFkeSBzcGlubG9ja2VkLgogCSAqLwogCWJoX2xvY2tfc29jayhzayk7Ci0JaW5ldC0+dG9zID0gc2tiLT5uaC5pcGgtPnRvczsKKwlpbmV0LT50b3MgPSBpcF9oZHIoc2tiKS0+dG9zOwogCXNrLT5za19wcmlvcml0eSA9IHNrYi0+cHJpb3JpdHk7Ci0Jc2stPnNrX3Byb3RvY29sID0gc2tiLT5uaC5pcGgtPnByb3RvY29sOworCXNrLT5za19wcm90b2NvbCA9IGlwX2hkcihza2IpLT5wcm90b2NvbDsKIAlpcF9hcHBlbmRfZGF0YShzaywgaXBfcmVwbHlfZ2x1ZV9iaXRzLCBhcmctPmlvdi0+aW92X2Jhc2UsIGxlbiwgMCwKIAkJICAgICAgICZpcGMsIHJ0LCBNU0dfRE9OVFdBSVQpOwogCWlmICgoc2tiID0gc2tiX3BlZWsoJnNrLT5za193cml0ZV9xdWV1ZSkpICE9IE5VTEwpIHsKIAkJaWYgKGFyZy0+Y3N1bW9mZnNldCA+PSAwKQotCQkJKigoX19zdW0xNiAqKXNrYi0+aC5yYXcgKyBhcmctPmNzdW1vZmZzZXQpID0gY3N1bV9mb2xkKGNzdW1fYWRkKHNrYi0+Y3N1bSwgYXJnLT5jc3VtKSk7CisJCQkqKChfX3N1bTE2ICopc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKSArCisJCQkgIGFyZy0+Y3N1bW9mZnNldCkgPSBjc3VtX2ZvbGQoY3N1bV9hZGQoc2tiLT5jc3VtLAorCQkJCQkJCQlhcmctPmNzdW0pKTsKIAkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOwogCQlpcF9wdXNoX3BlbmRpbmdfZnJhbWVzKHNrKTsKIAl9CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcF9zb2NrZ2x1ZS5jIGIvbmV0L2lwdjQvaXBfc29ja2dsdWUuYwppbmRleCAyMzA0OGQ5Li40ZDU0NDU3IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcF9zb2NrZ2x1ZS5jCisrKyBiL25ldC9pcHY0L2lwX3NvY2tnbHVlLmMKQEAgLTU5LDcgKzU5LDcgQEAKIAlzdHJ1Y3QgaW5fcGt0aW5mbyBpbmZvOwogCXN0cnVjdCBydGFibGUgKnJ0ID0gKHN0cnVjdCBydGFibGUgKilza2ItPmRzdDsKIAotCWluZm8uaXBpX2FkZHIuc19hZGRyID0gc2tiLT5uaC5pcGgtPmRhZGRyOworCWluZm8uaXBpX2FkZHIuc19hZGRyID0gaXBfaGRyKHNrYiktPmRhZGRyOwogCWlmIChydCkgewogCQlpbmZvLmlwaV9pZmluZGV4ID0gcnQtPnJ0X2lpZjsKIAkJaW5mby5pcGlfc3BlY19kc3Quc19hZGRyID0gcnQtPnJ0X3NwZWNfZHN0OwpAQCAtNzMsMTMgKzczLDEzIEBACiAKIHN0YXRpYyB2b2lkIGlwX2Ntc2dfcmVjdl90dGwoc3RydWN0IG1zZ2hkciAqbXNnLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCWludCB0dGwgPSBza2ItPm5oLmlwaC0+dHRsOworCWludCB0dGwgPSBpcF9oZHIoc2tiKS0+dHRsOwogCXB1dF9jbXNnKG1zZywgU09MX0lQLCBJUF9UVEwsIHNpemVvZihpbnQpLCAmdHRsKTsKIH0KIAogc3RhdGljIHZvaWQgaXBfY21zZ19yZWN2X3RvcyhzdHJ1Y3QgbXNnaGRyICptc2csIHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JcHV0X2Ntc2cobXNnLCBTT0xfSVAsIElQX1RPUywgMSwgJnNrYi0+bmguaXBoLT50b3MpOworCXB1dF9jbXNnKG1zZywgU09MX0lQLCBJUF9UT1MsIDEsICZpcF9oZHIoc2tiKS0+dG9zKTsKIH0KIAogc3RhdGljIHZvaWQgaXBfY21zZ19yZWN2X29wdHMoc3RydWN0IG1zZ2hkciAqbXNnLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQpAQCAtODcsNyArODcsOCBAQAogCWlmIChJUENCKHNrYiktPm9wdC5vcHRsZW4gPT0gMCkKIAkJcmV0dXJuOwogCi0JcHV0X2Ntc2cobXNnLCBTT0xfSVAsIElQX1JFQ1ZPUFRTLCBJUENCKHNrYiktPm9wdC5vcHRsZW4sIHNrYi0+bmguaXBoKzEpOworCXB1dF9jbXNnKG1zZywgU09MX0lQLCBJUF9SRUNWT1BUUywgSVBDQihza2IpLT5vcHQub3B0bGVuLAorCQkgaXBfaGRyKHNrYikgKyAxKTsKIH0KIAogCkBAIC0yNjgsMTggKzI2OSwyMSBAQAogCXNlcnIgPSBTS0JfRVhUX0VSUihza2IpOwogCXNlcnItPmVlLmVlX2Vycm5vID0gZXJyOwogCXNlcnItPmVlLmVlX29yaWdpbiA9IFNPX0VFX09SSUdJTl9JQ01QOwotCXNlcnItPmVlLmVlX3R5cGUgPSBza2ItPmguaWNtcGgtPnR5cGU7Ci0Jc2Vyci0+ZWUuZWVfY29kZSA9IHNrYi0+aC5pY21waC0+Y29kZTsKKwlzZXJyLT5lZS5lZV90eXBlID0gaWNtcF9oZHIoc2tiKS0+dHlwZTsKKwlzZXJyLT5lZS5lZV9jb2RlID0gaWNtcF9oZHIoc2tiKS0+Y29kZTsKIAlzZXJyLT5lZS5lZV9wYWQgPSAwOwogCXNlcnItPmVlLmVlX2luZm8gPSBpbmZvOwogCXNlcnItPmVlLmVlX2RhdGEgPSAwOwotCXNlcnItPmFkZHJfb2Zmc2V0ID0gKHU4KikmKCgoc3RydWN0IGlwaGRyKikoc2tiLT5oLmljbXBoKzEpKS0+ZGFkZHIpIC0gc2tiLT5uaC5yYXc7CisJc2Vyci0+YWRkcl9vZmZzZXQgPSAodTggKikmKCgoc3RydWN0IGlwaGRyICopKGljbXBfaGRyKHNrYikgKyAxKSktPmRhZGRyKSAtCisJCQkJICAgc2tiX25ldHdvcmtfaGVhZGVyKHNrYik7CiAJc2Vyci0+cG9ydCA9IHBvcnQ7CiAKLQlza2ItPmgucmF3ID0gcGF5bG9hZDsKLQlpZiAoIXNrYl9wdWxsKHNrYiwgcGF5bG9hZCAtIHNrYi0+ZGF0YSkgfHwKLQkgICAgc29ja19xdWV1ZV9lcnJfc2tiKHNrLCBza2IpKQotCQlrZnJlZV9za2Ioc2tiKTsKKwlpZiAoc2tiX3B1bGwoc2tiLCBwYXlsb2FkIC0gc2tiLT5kYXRhKSAhPSBOVUxMKSB7CisJCXNrYl9yZXNldF90cmFuc3BvcnRfaGVhZGVyKHNrYik7CisJCWlmIChzb2NrX3F1ZXVlX2Vycl9za2Ioc2ssIHNrYikgPT0gMCkKKwkJCXJldHVybjsKKwl9CisJa2ZyZWVfc2tiKHNrYik7CiB9CiAKIHZvaWQgaXBfbG9jYWxfZXJyb3Ioc3RydWN0IHNvY2sgKnNrLCBpbnQgZXJyLCBfX2JlMzIgZGFkZHIsIF9fYmUxNiBwb3J0LCB1MzIgaW5mbykKQEAgLTI5Niw4ICszMDAsOSBAQAogCWlmICghc2tiKQogCQlyZXR1cm47CiAKLQlpcGggPSAoc3RydWN0IGlwaGRyKilza2JfcHV0KHNrYiwgc2l6ZW9mKHN0cnVjdCBpcGhkcikpOwotCXNrYi0+bmguaXBoID0gaXBoOworCXNrYl9wdXQoc2tiLCBzaXplb2Yoc3RydWN0IGlwaGRyKSk7CisJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CisJaXBoID0gaXBfaGRyKHNrYik7CiAJaXBoLT5kYWRkciA9IGRhZGRyOwogCiAJc2VyciA9IFNLQl9FWFRfRVJSKHNrYik7CkBAIC0zMDgsMTEgKzMxMywxMSBAQAogCXNlcnItPmVlLmVlX3BhZCA9IDA7CiAJc2Vyci0+ZWUuZWVfaW5mbyA9IGluZm87CiAJc2Vyci0+ZWUuZWVfZGF0YSA9IDA7Ci0Jc2Vyci0+YWRkcl9vZmZzZXQgPSAodTgqKSZpcGgtPmRhZGRyIC0gc2tiLT5uaC5yYXc7CisJc2Vyci0+YWRkcl9vZmZzZXQgPSAodTggKikmaXBoLT5kYWRkciAtIHNrYl9uZXR3b3JrX2hlYWRlcihza2IpOwogCXNlcnItPnBvcnQgPSBwb3J0OwogCi0Jc2tiLT5oLnJhdyA9IHNrYi0+dGFpbDsKLQlfX3NrYl9wdWxsKHNrYiwgc2tiLT50YWlsIC0gc2tiLT5kYXRhKTsKKwlfX3NrYl9wdWxsKHNrYiwgc2tiX3RhaWxfcG9pbnRlcihza2IpIC0gc2tiLT5kYXRhKTsKKwlza2JfcmVzZXRfdHJhbnNwb3J0X2hlYWRlcihza2IpOwogCiAJaWYgKHNvY2tfcXVldWVfZXJyX3NrYihzaywgc2tiKSkKIAkJa2ZyZWVfc2tiKHNrYik7CkBAIC0zNTQsNyArMzU5LDggQEAKIAlzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luICopbXNnLT5tc2dfbmFtZTsKIAlpZiAoc2luKSB7CiAJCXNpbi0+c2luX2ZhbWlseSA9IEFGX0lORVQ7Ci0JCXNpbi0+c2luX2FkZHIuc19hZGRyID0gKihfX2JlMzIqKShza2ItPm5oLnJhdyArIHNlcnItPmFkZHJfb2Zmc2V0KTsKKwkJc2luLT5zaW5fYWRkci5zX2FkZHIgPSAqKF9fYmUzMiAqKShza2JfbmV0d29ya19oZWFkZXIoc2tiKSArCisJCQkJCQkgICBzZXJyLT5hZGRyX29mZnNldCk7CiAJCXNpbi0+c2luX3BvcnQgPSBzZXJyLT5wb3J0OwogCQltZW1zZXQoJnNpbi0+c2luX3plcm8sIDAsIHNpemVvZihzaW4tPnNpbl96ZXJvKSk7CiAJfQpAQCAtMzY2LDcgKzM3Miw3IEBACiAJCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKIAogCQlzaW4tPnNpbl9mYW1pbHkgPSBBRl9JTkVUOwotCQlzaW4tPnNpbl9hZGRyLnNfYWRkciA9IHNrYi0+bmguaXBoLT5zYWRkcjsKKwkJc2luLT5zaW5fYWRkci5zX2FkZHIgPSBpcF9oZHIoc2tiKS0+c2FkZHI7CiAJCXNpbi0+c2luX3BvcnQgPSAwOwogCQltZW1zZXQoJnNpbi0+c2luX3plcm8sIDAsIHNpemVvZihzaW4tPnNpbl96ZXJvKSk7CiAJCWlmIChpbmV0LT5jbXNnX2ZsYWdzKQpAQCAtNDAzLDIwICs0MDksMjAgQEAKICAqLwogCiBzdGF0aWMgaW50IGRvX2lwX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsCi0JCWludCBvcHRuYW1lLCBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgb3B0bGVuKQorCQkJICAgIGludCBvcHRuYW1lLCBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgb3B0bGVuKQogewogCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKIAlpbnQgdmFsPTAsZXJyOwogCiAJaWYgKCgoMTw8b3B0bmFtZSkgJiAoKDE8PElQX1BLVElORk8pIHwgKDE8PElQX1JFQ1ZUVEwpIHwKLQkJCSAgICAoMTw8SVBfUkVDVk9QVFMpIHwgKDE8PElQX1JFQ1ZUT1MpIHwKLQkJCSAgICAoMTw8SVBfUkVUT1BUUykgfCAoMTw8SVBfVE9TKSB8Ci0JCQkgICAgKDE8PElQX1RUTCkgfCAoMTw8SVBfSERSSU5DTCkgfAotCQkJICAgICgxPDxJUF9NVFVfRElTQ09WRVIpIHwgKDE8PElQX1JFQ1ZFUlIpIHwKLQkJCSAgICAoMTw8SVBfUk9VVEVSX0FMRVJUKSB8ICgxPDxJUF9GUkVFQklORCkgfAotCQkJICAgICgxPDxJUF9QQVNTU0VDKSkpIHx8Ci0JCQkJb3B0bmFtZSA9PSBJUF9NVUxUSUNBU1RfVFRMIHx8Ci0JCQkJb3B0bmFtZSA9PSBJUF9NVUxUSUNBU1RfTE9PUCkgeworCQkJICAgICAoMTw8SVBfUkVDVk9QVFMpIHwgKDE8PElQX1JFQ1ZUT1MpIHwKKwkJCSAgICAgKDE8PElQX1JFVE9QVFMpIHwgKDE8PElQX1RPUykgfAorCQkJICAgICAoMTw8SVBfVFRMKSB8ICgxPDxJUF9IRFJJTkNMKSB8CisJCQkgICAgICgxPDxJUF9NVFVfRElTQ09WRVIpIHwgKDE8PElQX1JFQ1ZFUlIpIHwKKwkJCSAgICAgKDE8PElQX1JPVVRFUl9BTEVSVCkgfCAoMTw8SVBfRlJFRUJJTkQpIHwKKwkJCSAgICAgKDE8PElQX1BBU1NTRUMpKSkgfHwKKwkgICAgb3B0bmFtZSA9PSBJUF9NVUxUSUNBU1RfVFRMIHx8CisJICAgIG9wdG5hbWUgPT0gSVBfTVVMVElDQVNUX0xPT1ApIHsKIAkJaWYgKG9wdGxlbiA+PSBzaXplb2YoaW50KSkgewogCQkJaWYgKGdldF91c2VyKHZhbCwgKGludCBfX3VzZXIgKikgb3B0dmFsKSkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKQEAgLTQ0MCw0NDQgKzQ0Niw0NDQgQEAKIAlsb2NrX3NvY2soc2spOwogCiAJc3dpdGNoIChvcHRuYW1lKSB7Ci0JCWNhc2UgSVBfT1BUSU9OUzoKLQkJewotCQkJc3RydWN0IGlwX29wdGlvbnMgKiBvcHQgPSBOVUxMOwotCQkJaWYgKG9wdGxlbiA+IDQwIHx8IG9wdGxlbiA8IDApCi0JCQkJZ290byBlX2ludmFsOwotCQkJZXJyID0gaXBfb3B0aW9uc19nZXRfZnJvbV91c2VyKCZvcHQsIG9wdHZhbCwgb3B0bGVuKTsKLQkJCWlmIChlcnIpCi0JCQkJYnJlYWs7Ci0JCQlpZiAoaW5ldC0+aXNfaWNzaykgewotCQkJCXN0cnVjdCBpbmV0X2Nvbm5lY3Rpb25fc29jayAqaWNzayA9IGluZXRfY3NrKHNrKTsKKwljYXNlIElQX09QVElPTlM6CisJeworCQlzdHJ1Y3QgaXBfb3B0aW9ucyAqIG9wdCA9IE5VTEw7CisJCWlmIChvcHRsZW4gPiA0MCB8fCBvcHRsZW4gPCAwKQorCQkJZ290byBlX2ludmFsOworCQllcnIgPSBpcF9vcHRpb25zX2dldF9mcm9tX3VzZXIoJm9wdCwgb3B0dmFsLCBvcHRsZW4pOworCQlpZiAoZXJyKQorCQkJYnJlYWs7CisJCWlmIChpbmV0LT5pc19pY3NrKSB7CisJCQlzdHJ1Y3QgaW5ldF9jb25uZWN0aW9uX3NvY2sgKmljc2sgPSBpbmV0X2Nzayhzayk7CiAjaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCi0JCQkJaWYgKHNrLT5za19mYW1pbHkgPT0gUEZfSU5FVCB8fAotCQkJCSAgICAoISgoMSA8PCBzay0+c2tfc3RhdGUpICYKLQkJCQkgICAgICAgKFRDUEZfTElTVEVOIHwgVENQRl9DTE9TRSkpICYmCi0JCQkJICAgICBpbmV0LT5kYWRkciAhPSBMT09QQkFDSzRfSVBWNikpIHsKKwkJCWlmIChzay0+c2tfZmFtaWx5ID09IFBGX0lORVQgfHwKKwkJCSAgICAoISgoMSA8PCBzay0+c2tfc3RhdGUpICYKKwkJCSAgICAgICAoVENQRl9MSVNURU4gfCBUQ1BGX0NMT1NFKSkgJiYKKwkJCSAgICAgaW5ldC0+ZGFkZHIgIT0gTE9PUEJBQ0s0X0lQVjYpKSB7CiAjZW5kaWYKLQkJCQkJaWYgKGluZXQtPm9wdCkKLQkJCQkJCWljc2stPmljc2tfZXh0X2hkcl9sZW4gLT0gaW5ldC0+b3B0LT5vcHRsZW47Ci0JCQkJCWlmIChvcHQpCi0JCQkJCQlpY3NrLT5pY3NrX2V4dF9oZHJfbGVuICs9IG9wdC0+b3B0bGVuOwotCQkJCQlpY3NrLT5pY3NrX3N5bmNfbXNzKHNrLCBpY3NrLT5pY3NrX3BtdHVfY29va2llKTsKKwkJCQlpZiAoaW5ldC0+b3B0KQorCQkJCQlpY3NrLT5pY3NrX2V4dF9oZHJfbGVuIC09IGluZXQtPm9wdC0+b3B0bGVuOworCQkJCWlmIChvcHQpCisJCQkJCWljc2stPmljc2tfZXh0X2hkcl9sZW4gKz0gb3B0LT5vcHRsZW47CisJCQkJaWNzay0+aWNza19zeW5jX21zcyhzaywgaWNzay0+aWNza19wbXR1X2Nvb2tpZSk7CiAjaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCi0JCQkJfQorCQkJfQogI2VuZGlmCi0JCQl9Ci0JCQlvcHQgPSB4Y2hnKCZpbmV0LT5vcHQsIG9wdCk7Ci0JCQlrZnJlZShvcHQpOwotCQkJYnJlYWs7CiAJCX0KLQkJY2FzZSBJUF9QS1RJTkZPOgotCQkJaWYgKHZhbCkKLQkJCQlpbmV0LT5jbXNnX2ZsYWdzIHw9IElQX0NNU0dfUEtUSU5GTzsKLQkJCWVsc2UKLQkJCQlpbmV0LT5jbXNnX2ZsYWdzICY9IH5JUF9DTVNHX1BLVElORk87Ci0JCQlicmVhazsKLQkJY2FzZSBJUF9SRUNWVFRMOgotCQkJaWYgKHZhbCkKLQkJCQlpbmV0LT5jbXNnX2ZsYWdzIHw9ICBJUF9DTVNHX1RUTDsKLQkJCWVsc2UKLQkJCQlpbmV0LT5jbXNnX2ZsYWdzICY9IH5JUF9DTVNHX1RUTDsKLQkJCWJyZWFrOwotCQljYXNlIElQX1JFQ1ZUT1M6Ci0JCQlpZiAodmFsKQotCQkJCWluZXQtPmNtc2dfZmxhZ3MgfD0gIElQX0NNU0dfVE9TOwotCQkJZWxzZQotCQkJCWluZXQtPmNtc2dfZmxhZ3MgJj0gfklQX0NNU0dfVE9TOwotCQkJYnJlYWs7Ci0JCWNhc2UgSVBfUkVDVk9QVFM6Ci0JCQlpZiAodmFsKQotCQkJCWluZXQtPmNtc2dfZmxhZ3MgfD0gIElQX0NNU0dfUkVDVk9QVFM7Ci0JCQllbHNlCi0JCQkJaW5ldC0+Y21zZ19mbGFncyAmPSB+SVBfQ01TR19SRUNWT1BUUzsKLQkJCWJyZWFrOwotCQljYXNlIElQX1JFVE9QVFM6Ci0JCQlpZiAodmFsKQotCQkJCWluZXQtPmNtc2dfZmxhZ3MgfD0gSVBfQ01TR19SRVRPUFRTOwotCQkJZWxzZQotCQkJCWluZXQtPmNtc2dfZmxhZ3MgJj0gfklQX0NNU0dfUkVUT1BUUzsKLQkJCWJyZWFrOwotCQljYXNlIElQX1BBU1NTRUM6Ci0JCQlpZiAodmFsKQotCQkJCWluZXQtPmNtc2dfZmxhZ3MgfD0gSVBfQ01TR19QQVNTU0VDOwotCQkJZWxzZQotCQkJCWluZXQtPmNtc2dfZmxhZ3MgJj0gfklQX0NNU0dfUEFTU1NFQzsKLQkJCWJyZWFrOwotCQljYXNlIElQX1RPUzoJLyogVGhpcyBzZXRzIGJvdGggVE9TIGFuZCBQcmVjZWRlbmNlICovCi0JCQlpZiAoc2stPnNrX3R5cGUgPT0gU09DS19TVFJFQU0pIHsKLQkJCQl2YWwgJj0gfjM7Ci0JCQkJdmFsIHw9IGluZXQtPnRvcyAmIDM7Ci0JCQl9Ci0JCQlpZiAoSVBUT1NfUFJFQyh2YWwpID49IElQVE9TX1BSRUNfQ1JJVElDX0VDUCAmJgotCQkJICAgICFjYXBhYmxlKENBUF9ORVRfQURNSU4pKSB7Ci0JCQkJZXJyID0gLUVQRVJNOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKGluZXQtPnRvcyAhPSB2YWwpIHsKLQkJCQlpbmV0LT50b3MgPSB2YWw7Ci0JCQkJc2stPnNrX3ByaW9yaXR5ID0gcnRfdG9zMnByaW9yaXR5KHZhbCk7Ci0JCQkJc2tfZHN0X3Jlc2V0KHNrKTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIElQX1RUTDoKLQkJCWlmIChvcHRsZW48MSkKLQkJCQlnb3RvIGVfaW52YWw7Ci0JCQlpZiAodmFsICE9IC0xICYmICh2YWwgPCAxIHx8IHZhbD4yNTUpKQotCQkJCWdvdG8gZV9pbnZhbDsKLQkJCWluZXQtPnVjX3R0bCA9IHZhbDsKLQkJCWJyZWFrOwotCQljYXNlIElQX0hEUklOQ0w6Ci0JCQlpZiAoc2stPnNrX3R5cGUgIT0gU09DS19SQVcpIHsKLQkJCQllcnIgPSAtRU5PUFJPVE9PUFQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpbmV0LT5oZHJpbmNsID0gdmFsID8gMSA6IDA7Ci0JCQlicmVhazsKLQkJY2FzZSBJUF9NVFVfRElTQ09WRVI6Ci0JCQlpZiAodmFsPDAgfHwgdmFsPjIpCi0JCQkJZ290byBlX2ludmFsOwotCQkJaW5ldC0+cG10dWRpc2MgPSB2YWw7Ci0JCQlicmVhazsKLQkJY2FzZSBJUF9SRUNWRVJSOgotCQkJaW5ldC0+cmVjdmVyciA9ICEhdmFsOwotCQkJaWYgKCF2YWwpCi0JCQkJc2tiX3F1ZXVlX3B1cmdlKCZzay0+c2tfZXJyb3JfcXVldWUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgSVBfTVVMVElDQVNUX1RUTDoKLQkJCWlmIChzay0+c2tfdHlwZSA9PSBTT0NLX1NUUkVBTSkKLQkJCQlnb3RvIGVfaW52YWw7Ci0JCQlpZiAob3B0bGVuPDEpCi0JCQkJZ290byBlX2ludmFsOwotCQkJaWYgKHZhbD09LTEpCi0JCQkJdmFsID0gMTsKLQkJCWlmICh2YWwgPCAwIHx8IHZhbCA+IDI1NSkKLQkJCQlnb3RvIGVfaW52YWw7Ci0JCQlpbmV0LT5tY190dGwgPSB2YWw7Ci0JCQlicmVhazsKLQkJY2FzZSBJUF9NVUxUSUNBU1RfTE9PUDoKLQkJCWlmIChvcHRsZW48MSkKLQkJCQlnb3RvIGVfaW52YWw7Ci0JCQlpbmV0LT5tY19sb29wID0gISF2YWw7Ci0JCQlicmVhazsKLQkJY2FzZSBJUF9NVUxUSUNBU1RfSUY6Ci0JCXsKLQkJCXN0cnVjdCBpcF9tcmVxbiBtcmVxOwotCQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IE5VTEw7Ci0KLQkJCWlmIChzay0+c2tfdHlwZSA9PSBTT0NLX1NUUkVBTSkKLQkJCQlnb3RvIGVfaW52YWw7Ci0JCQkvKgotCQkJICoJQ2hlY2sgdGhlIGFyZ3VtZW50cyBhcmUgYWxsb3dhYmxlCi0JCQkgKi8KLQotCQkJZXJyID0gLUVGQVVMVDsKLQkJCWlmIChvcHRsZW4gPj0gc2l6ZW9mKHN0cnVjdCBpcF9tcmVxbikpIHsKLQkJCQlpZiAoY29weV9mcm9tX3VzZXIoJm1yZXEsb3B0dmFsLHNpemVvZihtcmVxKSkpCi0JCQkJCWJyZWFrOwotCQkJfSBlbHNlIHsKLQkJCQltZW1zZXQoJm1yZXEsIDAsIHNpemVvZihtcmVxKSk7Ci0JCQkJaWYgKG9wdGxlbiA+PSBzaXplb2Yoc3RydWN0IGluX2FkZHIpICYmCi0JCQkJICAgIGNvcHlfZnJvbV91c2VyKCZtcmVxLmltcl9hZGRyZXNzLG9wdHZhbCxzaXplb2Yoc3RydWN0IGluX2FkZHIpKSkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWlmICghbXJlcS5pbXJfaWZpbmRleCkgewotCQkJCWlmIChtcmVxLmltcl9hZGRyZXNzLnNfYWRkciA9PSBJTkFERFJfQU5ZKSB7Ci0JCQkJCWluZXQtPm1jX2luZGV4ID0gMDsKLQkJCQkJaW5ldC0+bWNfYWRkciAgPSAwOwotCQkJCQllcnIgPSAwOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJZGV2ID0gaXBfZGV2X2ZpbmQobXJlcS5pbXJfYWRkcmVzcy5zX2FkZHIpOwotCQkJCWlmIChkZXYpIHsKLQkJCQkJbXJlcS5pbXJfaWZpbmRleCA9IGRldi0+aWZpbmRleDsKLQkJCQkJZGV2X3B1dChkZXYpOwotCQkJCX0KLQkJCX0gZWxzZQotCQkJCWRldiA9IF9fZGV2X2dldF9ieV9pbmRleChtcmVxLmltcl9pZmluZGV4KTsKLQotCi0JCQllcnIgPSAtRUFERFJOT1RBVkFJTDsKLQkJCWlmICghZGV2KQotCQkJCWJyZWFrOwotCi0JCQllcnIgPSAtRUlOVkFMOwotCQkJaWYgKHNrLT5za19ib3VuZF9kZXZfaWYgJiYKLQkJCSAgICBtcmVxLmltcl9pZmluZGV4ICE9IHNrLT5za19ib3VuZF9kZXZfaWYpCi0JCQkJYnJlYWs7Ci0KLQkJCWluZXQtPm1jX2luZGV4ID0gbXJlcS5pbXJfaWZpbmRleDsKLQkJCWluZXQtPm1jX2FkZHIgID0gbXJlcS5pbXJfYWRkcmVzcy5zX2FkZHI7Ci0JCQllcnIgPSAwOwotCQkJYnJlYWs7CisJCW9wdCA9IHhjaGcoJmluZXQtPm9wdCwgb3B0KTsKKwkJa2ZyZWUob3B0KTsKKwkJYnJlYWs7CisJfQorCWNhc2UgSVBfUEtUSU5GTzoKKwkJaWYgKHZhbCkKKwkJCWluZXQtPmNtc2dfZmxhZ3MgfD0gSVBfQ01TR19QS1RJTkZPOworCQllbHNlCisJCQlpbmV0LT5jbXNnX2ZsYWdzICY9IH5JUF9DTVNHX1BLVElORk87CisJCWJyZWFrOworCWNhc2UgSVBfUkVDVlRUTDoKKwkJaWYgKHZhbCkKKwkJCWluZXQtPmNtc2dfZmxhZ3MgfD0gIElQX0NNU0dfVFRMOworCQllbHNlCisJCQlpbmV0LT5jbXNnX2ZsYWdzICY9IH5JUF9DTVNHX1RUTDsKKwkJYnJlYWs7CisJY2FzZSBJUF9SRUNWVE9TOgorCQlpZiAodmFsKQorCQkJaW5ldC0+Y21zZ19mbGFncyB8PSAgSVBfQ01TR19UT1M7CisJCWVsc2UKKwkJCWluZXQtPmNtc2dfZmxhZ3MgJj0gfklQX0NNU0dfVE9TOworCQlicmVhazsKKwljYXNlIElQX1JFQ1ZPUFRTOgorCQlpZiAodmFsKQorCQkJaW5ldC0+Y21zZ19mbGFncyB8PSAgSVBfQ01TR19SRUNWT1BUUzsKKwkJZWxzZQorCQkJaW5ldC0+Y21zZ19mbGFncyAmPSB+SVBfQ01TR19SRUNWT1BUUzsKKwkJYnJlYWs7CisJY2FzZSBJUF9SRVRPUFRTOgorCQlpZiAodmFsKQorCQkJaW5ldC0+Y21zZ19mbGFncyB8PSBJUF9DTVNHX1JFVE9QVFM7CisJCWVsc2UKKwkJCWluZXQtPmNtc2dfZmxhZ3MgJj0gfklQX0NNU0dfUkVUT1BUUzsKKwkJYnJlYWs7CisJY2FzZSBJUF9QQVNTU0VDOgorCQlpZiAodmFsKQorCQkJaW5ldC0+Y21zZ19mbGFncyB8PSBJUF9DTVNHX1BBU1NTRUM7CisJCWVsc2UKKwkJCWluZXQtPmNtc2dfZmxhZ3MgJj0gfklQX0NNU0dfUEFTU1NFQzsKKwkJYnJlYWs7CisJY2FzZSBJUF9UT1M6CS8qIFRoaXMgc2V0cyBib3RoIFRPUyBhbmQgUHJlY2VkZW5jZSAqLworCQlpZiAoc2stPnNrX3R5cGUgPT0gU09DS19TVFJFQU0pIHsKKwkJCXZhbCAmPSB+MzsKKwkJCXZhbCB8PSBpbmV0LT50b3MgJiAzOwogCQl9Ci0KLQkJY2FzZSBJUF9BRERfTUVNQkVSU0hJUDoKLQkJY2FzZSBJUF9EUk9QX01FTUJFUlNISVA6Ci0JCXsKLQkJCXN0cnVjdCBpcF9tcmVxbiBtcmVxOwotCi0JCQlpZiAob3B0bGVuIDwgc2l6ZW9mKHN0cnVjdCBpcF9tcmVxKSkKLQkJCQlnb3RvIGVfaW52YWw7Ci0JCQllcnIgPSAtRUZBVUxUOwotCQkJaWYgKG9wdGxlbiA+PSBzaXplb2Yoc3RydWN0IGlwX21yZXFuKSkgewotCQkJCWlmKGNvcHlfZnJvbV91c2VyKCZtcmVxLG9wdHZhbCxzaXplb2YobXJlcSkpKQotCQkJCQlicmVhazsKLQkJCX0gZWxzZSB7Ci0JCQkJbWVtc2V0KCZtcmVxLCAwLCBzaXplb2YobXJlcSkpOwotCQkJCWlmIChjb3B5X2Zyb21fdXNlcigmbXJlcSxvcHR2YWwsc2l6ZW9mKHN0cnVjdCBpcF9tcmVxKSkpCi0JCQkJCWJyZWFrOwotCQkJfQotCi0JCQlpZiAob3B0bmFtZSA9PSBJUF9BRERfTUVNQkVSU0hJUCkKLQkJCQllcnIgPSBpcF9tY19qb2luX2dyb3VwKHNrLCAmbXJlcSk7Ci0JCQllbHNlCi0JCQkJZXJyID0gaXBfbWNfbGVhdmVfZ3JvdXAoc2ssICZtcmVxKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgSVBfTVNGSUxURVI6Ci0JCXsKLQkJCWV4dGVybiBpbnQgc3lzY3RsX2lnbXBfbWF4X21zZjsKLQkJCXN0cnVjdCBpcF9tc2ZpbHRlciAqbXNmOwotCi0JCQlpZiAob3B0bGVuIDwgSVBfTVNGSUxURVJfU0laRSgwKSkKLQkJCQlnb3RvIGVfaW52YWw7Ci0JCQlpZiAob3B0bGVuID4gc3lzY3RsX29wdG1lbV9tYXgpIHsKLQkJCQllcnIgPSAtRU5PQlVGUzsKLQkJCQlicmVhazsKLQkJCX0KLQkJCW1zZiA9IGttYWxsb2Mob3B0bGVuLCBHRlBfS0VSTkVMKTsKLQkJCWlmIChtc2YgPT0gMCkgewotCQkJCWVyciA9IC1FTk9CVUZTOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZXJyID0gLUVGQVVMVDsKLQkJCWlmIChjb3B5X2Zyb21fdXNlcihtc2YsIG9wdHZhbCwgb3B0bGVuKSkgewotCQkJCWtmcmVlKG1zZik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQkvKiBudW1zcmMgPj0gKDFHLTQpIG92ZXJmbG93IGluIDMyIGJpdHMgKi8KLQkJCWlmIChtc2YtPmltc2ZfbnVtc3JjID49IDB4M2ZmZmZmZmNVIHx8Ci0JCQkgICAgbXNmLT5pbXNmX251bXNyYyA+IHN5c2N0bF9pZ21wX21heF9tc2YpIHsKLQkJCQlrZnJlZShtc2YpOwotCQkJCWVyciA9IC1FTk9CVUZTOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKElQX01TRklMVEVSX1NJWkUobXNmLT5pbXNmX251bXNyYykgPiBvcHRsZW4pIHsKLQkJCQlrZnJlZShtc2YpOwotCQkJCWVyciA9IC1FSU5WQUw7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQllcnIgPSBpcF9tY19tc2ZpbHRlcihzaywgbXNmLCAwKTsKLQkJCWtmcmVlKG1zZik7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIElQX0JMT0NLX1NPVVJDRToKLQkJY2FzZSBJUF9VTkJMT0NLX1NPVVJDRToKLQkJY2FzZSBJUF9BRERfU09VUkNFX01FTUJFUlNISVA6Ci0JCWNhc2UgSVBfRFJPUF9TT1VSQ0VfTUVNQkVSU0hJUDoKLQkJewotCQkJc3RydWN0IGlwX21yZXFfc291cmNlIG1yZXFzOwotCQkJaW50IG9tb2RlLCBhZGQ7Ci0KLQkJCWlmIChvcHRsZW4gIT0gc2l6ZW9mKHN0cnVjdCBpcF9tcmVxX3NvdXJjZSkpCi0JCQkJZ290byBlX2ludmFsOwotCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZtcmVxcywgb3B0dmFsLCBzaXplb2YobXJlcXMpKSkgewotCQkJCWVyciA9IC1FRkFVTFQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAob3B0bmFtZSA9PSBJUF9CTE9DS19TT1VSQ0UpIHsKLQkJCQlvbW9kZSA9IE1DQVNUX0VYQ0xVREU7Ci0JCQkJYWRkID0gMTsKLQkJCX0gZWxzZSBpZiAob3B0bmFtZSA9PSBJUF9VTkJMT0NLX1NPVVJDRSkgewotCQkJCW9tb2RlID0gTUNBU1RfRVhDTFVERTsKLQkJCQlhZGQgPSAwOwotCQkJfSBlbHNlIGlmIChvcHRuYW1lID09IElQX0FERF9TT1VSQ0VfTUVNQkVSU0hJUCkgewotCQkJCXN0cnVjdCBpcF9tcmVxbiBtcmVxOwotCi0JCQkJbXJlcS5pbXJfbXVsdGlhZGRyLnNfYWRkciA9IG1yZXFzLmltcl9tdWx0aWFkZHI7Ci0JCQkJbXJlcS5pbXJfYWRkcmVzcy5zX2FkZHIgPSBtcmVxcy5pbXJfaW50ZXJmYWNlOwotCQkJCW1yZXEuaW1yX2lmaW5kZXggPSAwOwotCQkJCWVyciA9IGlwX21jX2pvaW5fZ3JvdXAoc2ssICZtcmVxKTsKLQkJCQlpZiAoZXJyICYmIGVyciAhPSAtRUFERFJJTlVTRSkKLQkJCQkJYnJlYWs7Ci0JCQkJb21vZGUgPSBNQ0FTVF9JTkNMVURFOwotCQkJCWFkZCA9IDE7Ci0JCQl9IGVsc2UgLyogSVBfRFJPUF9TT1VSQ0VfTUVNQkVSU0hJUCAqLyB7Ci0JCQkJb21vZGUgPSBNQ0FTVF9JTkNMVURFOwotCQkJCWFkZCA9IDA7Ci0JCQl9Ci0JCQllcnIgPSBpcF9tY19zb3VyY2UoYWRkLCBvbW9kZSwgc2ssICZtcmVxcywgMCk7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIE1DQVNUX0pPSU5fR1JPVVA6Ci0JCWNhc2UgTUNBU1RfTEVBVkVfR1JPVVA6Ci0JCXsKLQkJCXN0cnVjdCBncm91cF9yZXEgZ3JlcTsKLQkJCXN0cnVjdCBzb2NrYWRkcl9pbiAqcHNpbjsKLQkJCXN0cnVjdCBpcF9tcmVxbiBtcmVxOwotCi0JCQlpZiAob3B0bGVuIDwgc2l6ZW9mKHN0cnVjdCBncm91cF9yZXEpKQotCQkJCWdvdG8gZV9pbnZhbDsKLQkJCWVyciA9IC1FRkFVTFQ7Ci0JCQlpZihjb3B5X2Zyb21fdXNlcigmZ3JlcSwgb3B0dmFsLCBzaXplb2YoZ3JlcSkpKQotCQkJCWJyZWFrOwotCQkJcHNpbiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmZ3JlcS5ncl9ncm91cDsKLQkJCWlmIChwc2luLT5zaW5fZmFtaWx5ICE9IEFGX0lORVQpCi0JCQkJZ290byBlX2ludmFsOwotCQkJbWVtc2V0KCZtcmVxLCAwLCBzaXplb2YobXJlcSkpOwotCQkJbXJlcS5pbXJfbXVsdGlhZGRyID0gcHNpbi0+c2luX2FkZHI7Ci0JCQltcmVxLmltcl9pZmluZGV4ID0gZ3JlcS5ncl9pbnRlcmZhY2U7Ci0KLQkJCWlmIChvcHRuYW1lID09IE1DQVNUX0pPSU5fR1JPVVApCi0JCQkJZXJyID0gaXBfbWNfam9pbl9ncm91cChzaywgJm1yZXEpOwotCQkJZWxzZQotCQkJCWVyciA9IGlwX21jX2xlYXZlX2dyb3VwKHNrLCAmbXJlcSk7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIE1DQVNUX0pPSU5fU09VUkNFX0dST1VQOgotCQljYXNlIE1DQVNUX0xFQVZFX1NPVVJDRV9HUk9VUDoKLQkJY2FzZSBNQ0FTVF9CTE9DS19TT1VSQ0U6Ci0JCWNhc2UgTUNBU1RfVU5CTE9DS19TT1VSQ0U6Ci0JCXsKLQkJCXN0cnVjdCBncm91cF9zb3VyY2VfcmVxIGdyZXFzOwotCQkJc3RydWN0IGlwX21yZXFfc291cmNlIG1yZXFzOwotCQkJc3RydWN0IHNvY2thZGRyX2luICpwc2luOwotCQkJaW50IG9tb2RlLCBhZGQ7Ci0KLQkJCWlmIChvcHRsZW4gIT0gc2l6ZW9mKHN0cnVjdCBncm91cF9zb3VyY2VfcmVxKSkKLQkJCQlnb3RvIGVfaW52YWw7Ci0JCQlpZiAoY29weV9mcm9tX3VzZXIoJmdyZXFzLCBvcHR2YWwsIHNpemVvZihncmVxcykpKSB7Ci0JCQkJZXJyID0gLUVGQVVMVDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChncmVxcy5nc3JfZ3JvdXAuc3NfZmFtaWx5ICE9IEFGX0lORVQgfHwKLQkJCSAgICBncmVxcy5nc3Jfc291cmNlLnNzX2ZhbWlseSAhPSBBRl9JTkVUKSB7Ci0JCQkJZXJyID0gLUVBRERSTk9UQVZBSUw7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlwc2luID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSZncmVxcy5nc3JfZ3JvdXA7Ci0JCQltcmVxcy5pbXJfbXVsdGlhZGRyID0gcHNpbi0+c2luX2FkZHIuc19hZGRyOwotCQkJcHNpbiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmZ3JlcXMuZ3NyX3NvdXJjZTsKLQkJCW1yZXFzLmltcl9zb3VyY2VhZGRyID0gcHNpbi0+c2luX2FkZHIuc19hZGRyOwotCQkJbXJlcXMuaW1yX2ludGVyZmFjZSA9IDA7IC8qIHVzZSBpbmRleCBmb3IgbWNfc291cmNlICovCi0KLQkJCWlmIChvcHRuYW1lID09IE1DQVNUX0JMT0NLX1NPVVJDRSkgewotCQkJCW9tb2RlID0gTUNBU1RfRVhDTFVERTsKLQkJCQlhZGQgPSAxOwotCQkJfSBlbHNlIGlmIChvcHRuYW1lID09IE1DQVNUX1VOQkxPQ0tfU09VUkNFKSB7Ci0JCQkJb21vZGUgPSBNQ0FTVF9FWENMVURFOwotCQkJCWFkZCA9IDA7Ci0JCQl9IGVsc2UgaWYgKG9wdG5hbWUgPT0gTUNBU1RfSk9JTl9TT1VSQ0VfR1JPVVApIHsKLQkJCQlzdHJ1Y3QgaXBfbXJlcW4gbXJlcTsKLQotCQkJCXBzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luICopJmdyZXFzLmdzcl9ncm91cDsKLQkJCQltcmVxLmltcl9tdWx0aWFkZHIgPSBwc2luLT5zaW5fYWRkcjsKLQkJCQltcmVxLmltcl9hZGRyZXNzLnNfYWRkciA9IDA7Ci0JCQkJbXJlcS5pbXJfaWZpbmRleCA9IGdyZXFzLmdzcl9pbnRlcmZhY2U7Ci0JCQkJZXJyID0gaXBfbWNfam9pbl9ncm91cChzaywgJm1yZXEpOwotCQkJCWlmIChlcnIgJiYgZXJyICE9IC1FQUREUklOVVNFKQotCQkJCQlicmVhazsKLQkJCQlncmVxcy5nc3JfaW50ZXJmYWNlID0gbXJlcS5pbXJfaWZpbmRleDsKLQkJCQlvbW9kZSA9IE1DQVNUX0lOQ0xVREU7Ci0JCQkJYWRkID0gMTsKLQkJCX0gZWxzZSAvKiBNQ0FTVF9MRUFWRV9TT1VSQ0VfR1JPVVAgKi8gewotCQkJCW9tb2RlID0gTUNBU1RfSU5DTFVERTsKLQkJCQlhZGQgPSAwOwotCQkJfQotCQkJZXJyID0gaXBfbWNfc291cmNlKGFkZCwgb21vZGUsIHNrLCAmbXJlcXMsCi0JCQkJZ3JlcXMuZ3NyX2ludGVyZmFjZSk7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIE1DQVNUX01TRklMVEVSOgotCQl7Ci0JCQlleHRlcm4gaW50IHN5c2N0bF9pZ21wX21heF9tc2Y7Ci0JCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gKnBzaW47Ci0JCQlzdHJ1Y3QgaXBfbXNmaWx0ZXIgKm1zZiA9IE5VTEw7Ci0JCQlzdHJ1Y3QgZ3JvdXBfZmlsdGVyICpnc2YgPSBOVUxMOwotCQkJaW50IG1zaXplLCBpLCBpZmluZGV4OwotCi0JCQlpZiAob3B0bGVuIDwgR1JPVVBfRklMVEVSX1NJWkUoMCkpCi0JCQkJZ290byBlX2ludmFsOwotCQkJaWYgKG9wdGxlbiA+IHN5c2N0bF9vcHRtZW1fbWF4KSB7Ci0JCQkJZXJyID0gLUVOT0JVRlM7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlnc2YgPSBrbWFsbG9jKG9wdGxlbixHRlBfS0VSTkVMKTsKLQkJCWlmIChnc2YgPT0gMCkgewotCQkJCWVyciA9IC1FTk9CVUZTOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZXJyID0gLUVGQVVMVDsKLQkJCWlmIChjb3B5X2Zyb21fdXNlcihnc2YsIG9wdHZhbCwgb3B0bGVuKSkgewotCQkJCWdvdG8gbWNfbXNmX291dDsKLQkJCX0KLQkJCS8qIG51bXNyYyA+PSAoNEctMTQwKS8xMjggb3ZlcmZsb3cgaW4gMzIgYml0cyAqLwotCQkJaWYgKGdzZi0+Z2ZfbnVtc3JjID49IDB4MWZmZmZmZiB8fAotCQkJICAgIGdzZi0+Z2ZfbnVtc3JjID4gc3lzY3RsX2lnbXBfbWF4X21zZikgewotCQkJCWVyciA9IC1FTk9CVUZTOwotCQkJCWdvdG8gbWNfbXNmX291dDsKLQkJCX0KLQkJCWlmIChHUk9VUF9GSUxURVJfU0laRShnc2YtPmdmX251bXNyYykgPiBvcHRsZW4pIHsKLQkJCQllcnIgPSAtRUlOVkFMOwotCQkJCWdvdG8gbWNfbXNmX291dDsKLQkJCX0KLQkJCW1zaXplID0gSVBfTVNGSUxURVJfU0laRShnc2YtPmdmX251bXNyYyk7Ci0JCQltc2YgPSBrbWFsbG9jKG1zaXplLEdGUF9LRVJORUwpOwotCQkJaWYgKG1zZiA9PSAwKSB7Ci0JCQkJZXJyID0gLUVOT0JVRlM7Ci0JCQkJZ290byBtY19tc2Zfb3V0OwotCQkJfQotCQkJaWZpbmRleCA9IGdzZi0+Z2ZfaW50ZXJmYWNlOwotCQkJcHNpbiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmZ3NmLT5nZl9ncm91cDsKLQkJCWlmIChwc2luLT5zaW5fZmFtaWx5ICE9IEFGX0lORVQpIHsKLQkJCQllcnIgPSAtRUFERFJOT1RBVkFJTDsKLQkJCQlnb3RvIG1jX21zZl9vdXQ7Ci0JCQl9Ci0JCQltc2YtPmltc2ZfbXVsdGlhZGRyID0gcHNpbi0+c2luX2FkZHIuc19hZGRyOwotCQkJbXNmLT5pbXNmX2ludGVyZmFjZSA9IDA7Ci0JCQltc2YtPmltc2ZfZm1vZGUgPSBnc2YtPmdmX2Ztb2RlOwotCQkJbXNmLT5pbXNmX251bXNyYyA9IGdzZi0+Z2ZfbnVtc3JjOwotCQkJZXJyID0gLUVBRERSTk9UQVZBSUw7Ci0JCQlmb3IgKGk9MDsgaTxnc2YtPmdmX251bXNyYzsgKytpKSB7Ci0JCQkJcHNpbiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmZ3NmLT5nZl9zbGlzdFtpXTsKLQotCQkJCWlmIChwc2luLT5zaW5fZmFtaWx5ICE9IEFGX0lORVQpCi0JCQkJCWdvdG8gbWNfbXNmX291dDsKLQkJCQltc2YtPmltc2Zfc2xpc3RbaV0gPSBwc2luLT5zaW5fYWRkci5zX2FkZHI7Ci0JCQl9Ci0JCQlrZnJlZShnc2YpOwotCQkJZ3NmID0gTlVMTDsKLQotCQkJZXJyID0gaXBfbWNfbXNmaWx0ZXIoc2ssIG1zZiwgaWZpbmRleCk7Ci1tY19tc2Zfb3V0OgotCQkJa2ZyZWUobXNmKTsKLQkJCWtmcmVlKGdzZik7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIElQX1JPVVRFUl9BTEVSVDoKLQkJCWVyciA9IGlwX3JhX2NvbnRyb2woc2ssIHZhbCA/IDEgOiAwLCBOVUxMKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgSVBfRlJFRUJJTkQ6Ci0JCQlpZiAob3B0bGVuPDEpCi0JCQkJZ290byBlX2ludmFsOwotCQkJaW5ldC0+ZnJlZWJpbmQgPSAhIXZhbDsKLQkJCWJyZWFrOwotCi0JCWNhc2UgSVBfSVBTRUNfUE9MSUNZOgotCQljYXNlIElQX1hGUk1fUE9MSUNZOgorCQlpZiAoSVBUT1NfUFJFQyh2YWwpID49IElQVE9TX1BSRUNfQ1JJVElDX0VDUCAmJgorCQkgICAgIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpIHsKIAkJCWVyciA9IC1FUEVSTTsKLQkJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKLQkJCQlicmVhazsKLQkJCWVyciA9IHhmcm1fdXNlcl9wb2xpY3koc2ssIG9wdG5hbWUsIG9wdHZhbCwgb3B0bGVuKTsKIAkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6CisJCX0KKwkJaWYgKGluZXQtPnRvcyAhPSB2YWwpIHsKKwkJCWluZXQtPnRvcyA9IHZhbDsKKwkJCXNrLT5za19wcmlvcml0eSA9IHJ0X3RvczJwcmlvcml0eSh2YWwpOworCQkJc2tfZHN0X3Jlc2V0KHNrKTsKKwkJfQorCQlicmVhazsKKwljYXNlIElQX1RUTDoKKwkJaWYgKG9wdGxlbjwxKQorCQkJZ290byBlX2ludmFsOworCQlpZiAodmFsICE9IC0xICYmICh2YWwgPCAxIHx8IHZhbD4yNTUpKQorCQkJZ290byBlX2ludmFsOworCQlpbmV0LT51Y190dGwgPSB2YWw7CisJCWJyZWFrOworCWNhc2UgSVBfSERSSU5DTDoKKwkJaWYgKHNrLT5za190eXBlICE9IFNPQ0tfUkFXKSB7CiAJCQllcnIgPSAtRU5PUFJPVE9PUFQ7CiAJCQlicmVhazsKKwkJfQorCQlpbmV0LT5oZHJpbmNsID0gdmFsID8gMSA6IDA7CisJCWJyZWFrOworCWNhc2UgSVBfTVRVX0RJU0NPVkVSOgorCQlpZiAodmFsPDAgfHwgdmFsPjMpCisJCQlnb3RvIGVfaW52YWw7CisJCWluZXQtPnBtdHVkaXNjID0gdmFsOworCQlicmVhazsKKwljYXNlIElQX1JFQ1ZFUlI6CisJCWluZXQtPnJlY3ZlcnIgPSAhIXZhbDsKKwkJaWYgKCF2YWwpCisJCQlza2JfcXVldWVfcHVyZ2UoJnNrLT5za19lcnJvcl9xdWV1ZSk7CisJCWJyZWFrOworCWNhc2UgSVBfTVVMVElDQVNUX1RUTDoKKwkJaWYgKHNrLT5za190eXBlID09IFNPQ0tfU1RSRUFNKQorCQkJZ290byBlX2ludmFsOworCQlpZiAob3B0bGVuPDEpCisJCQlnb3RvIGVfaW52YWw7CisJCWlmICh2YWw9PS0xKQorCQkJdmFsID0gMTsKKwkJaWYgKHZhbCA8IDAgfHwgdmFsID4gMjU1KQorCQkJZ290byBlX2ludmFsOworCQlpbmV0LT5tY190dGwgPSB2YWw7CisJCWJyZWFrOworCWNhc2UgSVBfTVVMVElDQVNUX0xPT1A6CisJCWlmIChvcHRsZW48MSkKKwkJCWdvdG8gZV9pbnZhbDsKKwkJaW5ldC0+bWNfbG9vcCA9ICEhdmFsOworCQlicmVhazsKKwljYXNlIElQX01VTFRJQ0FTVF9JRjoKKwl7CisJCXN0cnVjdCBpcF9tcmVxbiBtcmVxOworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gTlVMTDsKKworCQlpZiAoc2stPnNrX3R5cGUgPT0gU09DS19TVFJFQU0pCisJCQlnb3RvIGVfaW52YWw7CisJCS8qCisJCSAqCUNoZWNrIHRoZSBhcmd1bWVudHMgYXJlIGFsbG93YWJsZQorCQkgKi8KKworCQllcnIgPSAtRUZBVUxUOworCQlpZiAob3B0bGVuID49IHNpemVvZihzdHJ1Y3QgaXBfbXJlcW4pKSB7CisJCQlpZiAoY29weV9mcm9tX3VzZXIoJm1yZXEsb3B0dmFsLHNpemVvZihtcmVxKSkpCisJCQkJYnJlYWs7CisJCX0gZWxzZSB7CisJCQltZW1zZXQoJm1yZXEsIDAsIHNpemVvZihtcmVxKSk7CisJCQlpZiAob3B0bGVuID49IHNpemVvZihzdHJ1Y3QgaW5fYWRkcikgJiYKKwkJCSAgICBjb3B5X2Zyb21fdXNlcigmbXJlcS5pbXJfYWRkcmVzcyxvcHR2YWwsc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSkpCisJCQkJYnJlYWs7CisJCX0KKworCQlpZiAoIW1yZXEuaW1yX2lmaW5kZXgpIHsKKwkJCWlmIChtcmVxLmltcl9hZGRyZXNzLnNfYWRkciA9PSBJTkFERFJfQU5ZKSB7CisJCQkJaW5ldC0+bWNfaW5kZXggPSAwOworCQkJCWluZXQtPm1jX2FkZHIgID0gMDsKKwkJCQllcnIgPSAwOworCQkJCWJyZWFrOworCQkJfQorCQkJZGV2ID0gaXBfZGV2X2ZpbmQobXJlcS5pbXJfYWRkcmVzcy5zX2FkZHIpOworCQkJaWYgKGRldikgeworCQkJCW1yZXEuaW1yX2lmaW5kZXggPSBkZXYtPmlmaW5kZXg7CisJCQkJZGV2X3B1dChkZXYpOworCQkJfQorCQl9IGVsc2UKKwkJCWRldiA9IF9fZGV2X2dldF9ieV9pbmRleChtcmVxLmltcl9pZmluZGV4KTsKKworCisJCWVyciA9IC1FQUREUk5PVEFWQUlMOworCQlpZiAoIWRldikKKwkJCWJyZWFrOworCisJCWVyciA9IC1FSU5WQUw7CisJCWlmIChzay0+c2tfYm91bmRfZGV2X2lmICYmCisJCSAgICBtcmVxLmltcl9pZmluZGV4ICE9IHNrLT5za19ib3VuZF9kZXZfaWYpCisJCQlicmVhazsKKworCQlpbmV0LT5tY19pbmRleCA9IG1yZXEuaW1yX2lmaW5kZXg7CisJCWluZXQtPm1jX2FkZHIgID0gbXJlcS5pbXJfYWRkcmVzcy5zX2FkZHI7CisJCWVyciA9IDA7CisJCWJyZWFrOworCX0KKworCWNhc2UgSVBfQUREX01FTUJFUlNISVA6CisJY2FzZSBJUF9EUk9QX01FTUJFUlNISVA6CisJeworCQlzdHJ1Y3QgaXBfbXJlcW4gbXJlcTsKKworCQlpZiAob3B0bGVuIDwgc2l6ZW9mKHN0cnVjdCBpcF9tcmVxKSkKKwkJCWdvdG8gZV9pbnZhbDsKKwkJZXJyID0gLUVGQVVMVDsKKwkJaWYgKG9wdGxlbiA+PSBzaXplb2Yoc3RydWN0IGlwX21yZXFuKSkgeworCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZtcmVxLG9wdHZhbCxzaXplb2YobXJlcSkpKQorCQkJCWJyZWFrOworCQl9IGVsc2UgeworCQkJbWVtc2V0KCZtcmVxLCAwLCBzaXplb2YobXJlcSkpOworCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZtcmVxLG9wdHZhbCxzaXplb2Yoc3RydWN0IGlwX21yZXEpKSkKKwkJCQlicmVhazsKKwkJfQorCisJCWlmIChvcHRuYW1lID09IElQX0FERF9NRU1CRVJTSElQKQorCQkJZXJyID0gaXBfbWNfam9pbl9ncm91cChzaywgJm1yZXEpOworCQllbHNlCisJCQllcnIgPSBpcF9tY19sZWF2ZV9ncm91cChzaywgJm1yZXEpOworCQlicmVhazsKKwl9CisJY2FzZSBJUF9NU0ZJTFRFUjoKKwl7CisJCWV4dGVybiBpbnQgc3lzY3RsX2lnbXBfbWF4X21zZjsKKwkJc3RydWN0IGlwX21zZmlsdGVyICptc2Y7CisKKwkJaWYgKG9wdGxlbiA8IElQX01TRklMVEVSX1NJWkUoMCkpCisJCQlnb3RvIGVfaW52YWw7CisJCWlmIChvcHRsZW4gPiBzeXNjdGxfb3B0bWVtX21heCkgeworCQkJZXJyID0gLUVOT0JVRlM7CisJCQlicmVhazsKKwkJfQorCQltc2YgPSBrbWFsbG9jKG9wdGxlbiwgR0ZQX0tFUk5FTCk7CisJCWlmIChtc2YgPT0gMCkgeworCQkJZXJyID0gLUVOT0JVRlM7CisJCQlicmVhazsKKwkJfQorCQllcnIgPSAtRUZBVUxUOworCQlpZiAoY29weV9mcm9tX3VzZXIobXNmLCBvcHR2YWwsIG9wdGxlbikpIHsKKwkJCWtmcmVlKG1zZik7CisJCQlicmVhazsKKwkJfQorCQkvKiBudW1zcmMgPj0gKDFHLTQpIG92ZXJmbG93IGluIDMyIGJpdHMgKi8KKwkJaWYgKG1zZi0+aW1zZl9udW1zcmMgPj0gMHgzZmZmZmZmY1UgfHwKKwkJICAgIG1zZi0+aW1zZl9udW1zcmMgPiBzeXNjdGxfaWdtcF9tYXhfbXNmKSB7CisJCQlrZnJlZShtc2YpOworCQkJZXJyID0gLUVOT0JVRlM7CisJCQlicmVhazsKKwkJfQorCQlpZiAoSVBfTVNGSUxURVJfU0laRShtc2YtPmltc2ZfbnVtc3JjKSA+IG9wdGxlbikgeworCQkJa2ZyZWUobXNmKTsKKwkJCWVyciA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCQllcnIgPSBpcF9tY19tc2ZpbHRlcihzaywgbXNmLCAwKTsKKwkJa2ZyZWUobXNmKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgSVBfQkxPQ0tfU09VUkNFOgorCWNhc2UgSVBfVU5CTE9DS19TT1VSQ0U6CisJY2FzZSBJUF9BRERfU09VUkNFX01FTUJFUlNISVA6CisJY2FzZSBJUF9EUk9QX1NPVVJDRV9NRU1CRVJTSElQOgorCXsKKwkJc3RydWN0IGlwX21yZXFfc291cmNlIG1yZXFzOworCQlpbnQgb21vZGUsIGFkZDsKKworCQlpZiAob3B0bGVuICE9IHNpemVvZihzdHJ1Y3QgaXBfbXJlcV9zb3VyY2UpKQorCQkJZ290byBlX2ludmFsOworCQlpZiAoY29weV9mcm9tX3VzZXIoJm1yZXFzLCBvcHR2YWwsIHNpemVvZihtcmVxcykpKSB7CisJCQllcnIgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKG9wdG5hbWUgPT0gSVBfQkxPQ0tfU09VUkNFKSB7CisJCQlvbW9kZSA9IE1DQVNUX0VYQ0xVREU7CisJCQlhZGQgPSAxOworCQl9IGVsc2UgaWYgKG9wdG5hbWUgPT0gSVBfVU5CTE9DS19TT1VSQ0UpIHsKKwkJCW9tb2RlID0gTUNBU1RfRVhDTFVERTsKKwkJCWFkZCA9IDA7CisJCX0gZWxzZSBpZiAob3B0bmFtZSA9PSBJUF9BRERfU09VUkNFX01FTUJFUlNISVApIHsKKwkJCXN0cnVjdCBpcF9tcmVxbiBtcmVxOworCisJCQltcmVxLmltcl9tdWx0aWFkZHIuc19hZGRyID0gbXJlcXMuaW1yX211bHRpYWRkcjsKKwkJCW1yZXEuaW1yX2FkZHJlc3Muc19hZGRyID0gbXJlcXMuaW1yX2ludGVyZmFjZTsKKwkJCW1yZXEuaW1yX2lmaW5kZXggPSAwOworCQkJZXJyID0gaXBfbWNfam9pbl9ncm91cChzaywgJm1yZXEpOworCQkJaWYgKGVyciAmJiBlcnIgIT0gLUVBRERSSU5VU0UpCisJCQkJYnJlYWs7CisJCQlvbW9kZSA9IE1DQVNUX0lOQ0xVREU7CisJCQlhZGQgPSAxOworCQl9IGVsc2UgLyogSVBfRFJPUF9TT1VSQ0VfTUVNQkVSU0hJUCAqLyB7CisJCQlvbW9kZSA9IE1DQVNUX0lOQ0xVREU7CisJCQlhZGQgPSAwOworCQl9CisJCWVyciA9IGlwX21jX3NvdXJjZShhZGQsIG9tb2RlLCBzaywgJm1yZXFzLCAwKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgTUNBU1RfSk9JTl9HUk9VUDoKKwljYXNlIE1DQVNUX0xFQVZFX0dST1VQOgorCXsKKwkJc3RydWN0IGdyb3VwX3JlcSBncmVxOworCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gKnBzaW47CisJCXN0cnVjdCBpcF9tcmVxbiBtcmVxOworCisJCWlmIChvcHRsZW4gPCBzaXplb2Yoc3RydWN0IGdyb3VwX3JlcSkpCisJCQlnb3RvIGVfaW52YWw7CisJCWVyciA9IC1FRkFVTFQ7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmZ3JlcSwgb3B0dmFsLCBzaXplb2YoZ3JlcSkpKQorCQkJYnJlYWs7CisJCXBzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luICopJmdyZXEuZ3JfZ3JvdXA7CisJCWlmIChwc2luLT5zaW5fZmFtaWx5ICE9IEFGX0lORVQpCisJCQlnb3RvIGVfaW52YWw7CisJCW1lbXNldCgmbXJlcSwgMCwgc2l6ZW9mKG1yZXEpKTsKKwkJbXJlcS5pbXJfbXVsdGlhZGRyID0gcHNpbi0+c2luX2FkZHI7CisJCW1yZXEuaW1yX2lmaW5kZXggPSBncmVxLmdyX2ludGVyZmFjZTsKKworCQlpZiAob3B0bmFtZSA9PSBNQ0FTVF9KT0lOX0dST1VQKQorCQkJZXJyID0gaXBfbWNfam9pbl9ncm91cChzaywgJm1yZXEpOworCQllbHNlCisJCQllcnIgPSBpcF9tY19sZWF2ZV9ncm91cChzaywgJm1yZXEpOworCQlicmVhazsKKwl9CisJY2FzZSBNQ0FTVF9KT0lOX1NPVVJDRV9HUk9VUDoKKwljYXNlIE1DQVNUX0xFQVZFX1NPVVJDRV9HUk9VUDoKKwljYXNlIE1DQVNUX0JMT0NLX1NPVVJDRToKKwljYXNlIE1DQVNUX1VOQkxPQ0tfU09VUkNFOgorCXsKKwkJc3RydWN0IGdyb3VwX3NvdXJjZV9yZXEgZ3JlcXM7CisJCXN0cnVjdCBpcF9tcmVxX3NvdXJjZSBtcmVxczsKKwkJc3RydWN0IHNvY2thZGRyX2luICpwc2luOworCQlpbnQgb21vZGUsIGFkZDsKKworCQlpZiAob3B0bGVuICE9IHNpemVvZihzdHJ1Y3QgZ3JvdXBfc291cmNlX3JlcSkpCisJCQlnb3RvIGVfaW52YWw7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmZ3JlcXMsIG9wdHZhbCwgc2l6ZW9mKGdyZXFzKSkpIHsKKwkJCWVyciA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCQlpZiAoZ3JlcXMuZ3NyX2dyb3VwLnNzX2ZhbWlseSAhPSBBRl9JTkVUIHx8CisJCSAgICBncmVxcy5nc3Jfc291cmNlLnNzX2ZhbWlseSAhPSBBRl9JTkVUKSB7CisJCQllcnIgPSAtRUFERFJOT1RBVkFJTDsKKwkJCWJyZWFrOworCQl9CisJCXBzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luICopJmdyZXFzLmdzcl9ncm91cDsKKwkJbXJlcXMuaW1yX211bHRpYWRkciA9IHBzaW4tPnNpbl9hZGRyLnNfYWRkcjsKKwkJcHNpbiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmZ3JlcXMuZ3NyX3NvdXJjZTsKKwkJbXJlcXMuaW1yX3NvdXJjZWFkZHIgPSBwc2luLT5zaW5fYWRkci5zX2FkZHI7CisJCW1yZXFzLmltcl9pbnRlcmZhY2UgPSAwOyAvKiB1c2UgaW5kZXggZm9yIG1jX3NvdXJjZSAqLworCisJCWlmIChvcHRuYW1lID09IE1DQVNUX0JMT0NLX1NPVVJDRSkgeworCQkJb21vZGUgPSBNQ0FTVF9FWENMVURFOworCQkJYWRkID0gMTsKKwkJfSBlbHNlIGlmIChvcHRuYW1lID09IE1DQVNUX1VOQkxPQ0tfU09VUkNFKSB7CisJCQlvbW9kZSA9IE1DQVNUX0VYQ0xVREU7CisJCQlhZGQgPSAwOworCQl9IGVsc2UgaWYgKG9wdG5hbWUgPT0gTUNBU1RfSk9JTl9TT1VSQ0VfR1JPVVApIHsKKwkJCXN0cnVjdCBpcF9tcmVxbiBtcmVxOworCisJCQlwc2luID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSZncmVxcy5nc3JfZ3JvdXA7CisJCQltcmVxLmltcl9tdWx0aWFkZHIgPSBwc2luLT5zaW5fYWRkcjsKKwkJCW1yZXEuaW1yX2FkZHJlc3Muc19hZGRyID0gMDsKKwkJCW1yZXEuaW1yX2lmaW5kZXggPSBncmVxcy5nc3JfaW50ZXJmYWNlOworCQkJZXJyID0gaXBfbWNfam9pbl9ncm91cChzaywgJm1yZXEpOworCQkJaWYgKGVyciAmJiBlcnIgIT0gLUVBRERSSU5VU0UpCisJCQkJYnJlYWs7CisJCQlncmVxcy5nc3JfaW50ZXJmYWNlID0gbXJlcS5pbXJfaWZpbmRleDsKKwkJCW9tb2RlID0gTUNBU1RfSU5DTFVERTsKKwkJCWFkZCA9IDE7CisJCX0gZWxzZSAvKiBNQ0FTVF9MRUFWRV9TT1VSQ0VfR1JPVVAgKi8geworCQkJb21vZGUgPSBNQ0FTVF9JTkNMVURFOworCQkJYWRkID0gMDsKKwkJfQorCQllcnIgPSBpcF9tY19zb3VyY2UoYWRkLCBvbW9kZSwgc2ssICZtcmVxcywKKwkJCQkgICBncmVxcy5nc3JfaW50ZXJmYWNlKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgTUNBU1RfTVNGSUxURVI6CisJeworCQlleHRlcm4gaW50IHN5c2N0bF9pZ21wX21heF9tc2Y7CisJCXN0cnVjdCBzb2NrYWRkcl9pbiAqcHNpbjsKKwkJc3RydWN0IGlwX21zZmlsdGVyICptc2YgPSBOVUxMOworCQlzdHJ1Y3QgZ3JvdXBfZmlsdGVyICpnc2YgPSBOVUxMOworCQlpbnQgbXNpemUsIGksIGlmaW5kZXg7CisKKwkJaWYgKG9wdGxlbiA8IEdST1VQX0ZJTFRFUl9TSVpFKDApKQorCQkJZ290byBlX2ludmFsOworCQlpZiAob3B0bGVuID4gc3lzY3RsX29wdG1lbV9tYXgpIHsKKwkJCWVyciA9IC1FTk9CVUZTOworCQkJYnJlYWs7CisJCX0KKwkJZ3NmID0ga21hbGxvYyhvcHRsZW4sR0ZQX0tFUk5FTCk7CisJCWlmIChnc2YgPT0gMCkgeworCQkJZXJyID0gLUVOT0JVRlM7CisJCQlicmVhazsKKwkJfQorCQllcnIgPSAtRUZBVUxUOworCQlpZiAoY29weV9mcm9tX3VzZXIoZ3NmLCBvcHR2YWwsIG9wdGxlbikpIHsKKwkJCWdvdG8gbWNfbXNmX291dDsKKwkJfQorCQkvKiBudW1zcmMgPj0gKDRHLTE0MCkvMTI4IG92ZXJmbG93IGluIDMyIGJpdHMgKi8KKwkJaWYgKGdzZi0+Z2ZfbnVtc3JjID49IDB4MWZmZmZmZiB8fAorCQkgICAgZ3NmLT5nZl9udW1zcmMgPiBzeXNjdGxfaWdtcF9tYXhfbXNmKSB7CisJCQllcnIgPSAtRU5PQlVGUzsKKwkJCWdvdG8gbWNfbXNmX291dDsKKwkJfQorCQlpZiAoR1JPVVBfRklMVEVSX1NJWkUoZ3NmLT5nZl9udW1zcmMpID4gb3B0bGVuKSB7CisJCQllcnIgPSAtRUlOVkFMOworCQkJZ290byBtY19tc2Zfb3V0OworCQl9CisJCW1zaXplID0gSVBfTVNGSUxURVJfU0laRShnc2YtPmdmX251bXNyYyk7CisJCW1zZiA9IGttYWxsb2MobXNpemUsR0ZQX0tFUk5FTCk7CisJCWlmIChtc2YgPT0gMCkgeworCQkJZXJyID0gLUVOT0JVRlM7CisJCQlnb3RvIG1jX21zZl9vdXQ7CisJCX0KKwkJaWZpbmRleCA9IGdzZi0+Z2ZfaW50ZXJmYWNlOworCQlwc2luID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSZnc2YtPmdmX2dyb3VwOworCQlpZiAocHNpbi0+c2luX2ZhbWlseSAhPSBBRl9JTkVUKSB7CisJCQllcnIgPSAtRUFERFJOT1RBVkFJTDsKKwkJCWdvdG8gbWNfbXNmX291dDsKKwkJfQorCQltc2YtPmltc2ZfbXVsdGlhZGRyID0gcHNpbi0+c2luX2FkZHIuc19hZGRyOworCQltc2YtPmltc2ZfaW50ZXJmYWNlID0gMDsKKwkJbXNmLT5pbXNmX2Ztb2RlID0gZ3NmLT5nZl9mbW9kZTsKKwkJbXNmLT5pbXNmX251bXNyYyA9IGdzZi0+Z2ZfbnVtc3JjOworCQllcnIgPSAtRUFERFJOT1RBVkFJTDsKKwkJZm9yIChpPTA7IGk8Z3NmLT5nZl9udW1zcmM7ICsraSkgeworCQkJcHNpbiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmZ3NmLT5nZl9zbGlzdFtpXTsKKworCQkJaWYgKHBzaW4tPnNpbl9mYW1pbHkgIT0gQUZfSU5FVCkKKwkJCQlnb3RvIG1jX21zZl9vdXQ7CisJCQltc2YtPmltc2Zfc2xpc3RbaV0gPSBwc2luLT5zaW5fYWRkci5zX2FkZHI7CisJCX0KKwkJa2ZyZWUoZ3NmKTsKKwkJZ3NmID0gTlVMTDsKKworCQllcnIgPSBpcF9tY19tc2ZpbHRlcihzaywgbXNmLCBpZmluZGV4KTsKKwltY19tc2Zfb3V0OgorCQlrZnJlZShtc2YpOworCQlrZnJlZShnc2YpOworCQlicmVhazsKKwl9CisJY2FzZSBJUF9ST1VURVJfQUxFUlQ6CisJCWVyciA9IGlwX3JhX2NvbnRyb2woc2ssIHZhbCA/IDEgOiAwLCBOVUxMKTsKKwkJYnJlYWs7CisKKwljYXNlIElQX0ZSRUVCSU5EOgorCQlpZiAob3B0bGVuPDEpCisJCQlnb3RvIGVfaW52YWw7CisJCWluZXQtPmZyZWViaW5kID0gISF2YWw7CisJCWJyZWFrOworCisJY2FzZSBJUF9JUFNFQ19QT0xJQ1k6CisJY2FzZSBJUF9YRlJNX1BPTElDWToKKwkJZXJyID0gLUVQRVJNOworCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlicmVhazsKKwkJZXJyID0geGZybV91c2VyX3BvbGljeShzaywgb3B0bmFtZSwgb3B0dmFsLCBvcHRsZW4pOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWVyciA9IC1FTk9QUk9UT09QVDsKKwkJYnJlYWs7CiAJfQogCXJlbGVhc2Vfc29jayhzayk7CiAJcmV0dXJuIGVycjsKQEAgLTk0OCwyMTQgKzk1NCwyMTMgQEAKICAqLwogCiBzdGF0aWMgaW50IGRvX2lwX2dldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAotCQljaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgX191c2VyICpvcHRsZW4pCisJCQkgICAgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IF9fdXNlciAqb3B0bGVuKQogewogCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKIAlpbnQgdmFsOwogCWludCBsZW47CiAKLQlpZihsZXZlbCE9U09MX0lQKQorCWlmIChsZXZlbCAhPSBTT0xfSVApCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAogI2lmZGVmIENPTkZJR19JUF9NUk9VVEUKLQlpZihvcHRuYW1lPj1NUlRfQkFTRSAmJiBvcHRuYW1lIDw9TVJUX0JBU0UrMTApCi0JeworCWlmIChvcHRuYW1lID49IE1SVF9CQVNFICYmIG9wdG5hbWUgPD0gTVJUX0JBU0UrMTApIHsKIAkJcmV0dXJuIGlwX21yb3V0ZV9nZXRzb2Nrb3B0KHNrLG9wdG5hbWUsb3B0dmFsLG9wdGxlbik7CiAJfQogI2VuZGlmCiAKLQlpZihnZXRfdXNlcihsZW4sb3B0bGVuKSkKKwlpZiAoZ2V0X3VzZXIobGVuLG9wdGxlbikpCiAJCXJldHVybiAtRUZBVUxUOwotCWlmKGxlbiA8IDApCisJaWYgKGxlbiA8IDApCiAJCXJldHVybiAtRUlOVkFMOwogCiAJbG9ja19zb2NrKHNrKTsKIAotCXN3aXRjaChvcHRuYW1lKQl7Ci0JCWNhc2UgSVBfT1BUSU9OUzoKLQkJCXsKLQkJCQl1bnNpZ25lZCBjaGFyIG9wdGJ1ZltzaXplb2Yoc3RydWN0IGlwX29wdGlvbnMpKzQwXTsKLQkJCQlzdHJ1Y3QgaXBfb3B0aW9ucyAqIG9wdCA9IChzdHJ1Y3QgaXBfb3B0aW9ucyopb3B0YnVmOwotCQkJCW9wdC0+b3B0bGVuID0gMDsKLQkJCQlpZiAoaW5ldC0+b3B0KQotCQkJCQltZW1jcHkob3B0YnVmLCBpbmV0LT5vcHQsCi0JCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGlwX29wdGlvbnMpKwotCQkJCQkgICAgICAgaW5ldC0+b3B0LT5vcHRsZW4pOwotCQkJCXJlbGVhc2Vfc29jayhzayk7CisJc3dpdGNoIChvcHRuYW1lKSB7CisJY2FzZSBJUF9PUFRJT05TOgorCXsKKwkJdW5zaWduZWQgY2hhciBvcHRidWZbc2l6ZW9mKHN0cnVjdCBpcF9vcHRpb25zKSs0MF07CisJCXN0cnVjdCBpcF9vcHRpb25zICogb3B0ID0gKHN0cnVjdCBpcF9vcHRpb25zKilvcHRidWY7CisJCW9wdC0+b3B0bGVuID0gMDsKKwkJaWYgKGluZXQtPm9wdCkKKwkJCW1lbWNweShvcHRidWYsIGluZXQtPm9wdCwKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IGlwX29wdGlvbnMpKworCQkJICAgICAgIGluZXQtPm9wdC0+b3B0bGVuKTsKKwkJcmVsZWFzZV9zb2NrKHNrKTsKIAotCQkJCWlmIChvcHQtPm9wdGxlbiA9PSAwKQotCQkJCQlyZXR1cm4gcHV0X3VzZXIoMCwgb3B0bGVuKTsKKwkJaWYgKG9wdC0+b3B0bGVuID09IDApCisJCQlyZXR1cm4gcHV0X3VzZXIoMCwgb3B0bGVuKTsKIAotCQkJCWlwX29wdGlvbnNfdW5kbyhvcHQpOworCQlpcF9vcHRpb25zX3VuZG8ob3B0KTsKIAotCQkJCWxlbiA9IG1pbl90KHVuc2lnbmVkIGludCwgbGVuLCBvcHQtPm9wdGxlbik7Ci0JCQkJaWYocHV0X3VzZXIobGVuLCBvcHRsZW4pKQotCQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCQlpZihjb3B5X3RvX3VzZXIob3B0dmFsLCBvcHQtPl9fZGF0YSwgbGVuKSkKLQkJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCWNhc2UgSVBfUEtUSU5GTzoKLQkJCXZhbCA9IChpbmV0LT5jbXNnX2ZsYWdzICYgSVBfQ01TR19QS1RJTkZPKSAhPSAwOwotCQkJYnJlYWs7Ci0JCWNhc2UgSVBfUkVDVlRUTDoKLQkJCXZhbCA9IChpbmV0LT5jbXNnX2ZsYWdzICYgSVBfQ01TR19UVEwpICE9IDA7Ci0JCQlicmVhazsKLQkJY2FzZSBJUF9SRUNWVE9TOgotCQkJdmFsID0gKGluZXQtPmNtc2dfZmxhZ3MgJiBJUF9DTVNHX1RPUykgIT0gMDsKLQkJCWJyZWFrOwotCQljYXNlIElQX1JFQ1ZPUFRTOgotCQkJdmFsID0gKGluZXQtPmNtc2dfZmxhZ3MgJiBJUF9DTVNHX1JFQ1ZPUFRTKSAhPSAwOwotCQkJYnJlYWs7Ci0JCWNhc2UgSVBfUkVUT1BUUzoKLQkJCXZhbCA9IChpbmV0LT5jbXNnX2ZsYWdzICYgSVBfQ01TR19SRVRPUFRTKSAhPSAwOwotCQkJYnJlYWs7Ci0JCWNhc2UgSVBfUEFTU1NFQzoKLQkJCXZhbCA9IChpbmV0LT5jbXNnX2ZsYWdzICYgSVBfQ01TR19QQVNTU0VDKSAhPSAwOwotCQkJYnJlYWs7Ci0JCWNhc2UgSVBfVE9TOgotCQkJdmFsID0gaW5ldC0+dG9zOwotCQkJYnJlYWs7Ci0JCWNhc2UgSVBfVFRMOgotCQkJdmFsID0gKGluZXQtPnVjX3R0bCA9PSAtMSA/Ci0JCQkgICAgICAgc3lzY3RsX2lwX2RlZmF1bHRfdHRsIDoKLQkJCSAgICAgICBpbmV0LT51Y190dGwpOwotCQkJYnJlYWs7Ci0JCWNhc2UgSVBfSERSSU5DTDoKLQkJCXZhbCA9IGluZXQtPmhkcmluY2w7Ci0JCQlicmVhazsKLQkJY2FzZSBJUF9NVFVfRElTQ09WRVI6Ci0JCQl2YWwgPSBpbmV0LT5wbXR1ZGlzYzsKLQkJCWJyZWFrOwotCQljYXNlIElQX01UVToKLQkJewotCQkJc3RydWN0IGRzdF9lbnRyeSAqZHN0OwotCQkJdmFsID0gMDsKLQkJCWRzdCA9IHNrX2RzdF9nZXQoc2spOwotCQkJaWYgKGRzdCkgewotCQkJCXZhbCA9IGRzdF9tdHUoZHN0KTsKLQkJCQlkc3RfcmVsZWFzZShkc3QpOwotCQkJfQotCQkJaWYgKCF2YWwpIHsKLQkJCQlyZWxlYXNlX3NvY2soc2spOwotCQkJCXJldHVybiAtRU5PVENPTk47Ci0JCQl9Ci0JCQlicmVhazsKKwkJbGVuID0gbWluX3QodW5zaWduZWQgaW50LCBsZW4sIG9wdC0+b3B0bGVuKTsKKwkJaWYgKHB1dF91c2VyKGxlbiwgb3B0bGVuKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoY29weV90b191c2VyKG9wdHZhbCwgb3B0LT5fX2RhdGEsIGxlbikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgSVBfUEtUSU5GTzoKKwkJdmFsID0gKGluZXQtPmNtc2dfZmxhZ3MgJiBJUF9DTVNHX1BLVElORk8pICE9IDA7CisJCWJyZWFrOworCWNhc2UgSVBfUkVDVlRUTDoKKwkJdmFsID0gKGluZXQtPmNtc2dfZmxhZ3MgJiBJUF9DTVNHX1RUTCkgIT0gMDsKKwkJYnJlYWs7CisJY2FzZSBJUF9SRUNWVE9TOgorCQl2YWwgPSAoaW5ldC0+Y21zZ19mbGFncyAmIElQX0NNU0dfVE9TKSAhPSAwOworCQlicmVhazsKKwljYXNlIElQX1JFQ1ZPUFRTOgorCQl2YWwgPSAoaW5ldC0+Y21zZ19mbGFncyAmIElQX0NNU0dfUkVDVk9QVFMpICE9IDA7CisJCWJyZWFrOworCWNhc2UgSVBfUkVUT1BUUzoKKwkJdmFsID0gKGluZXQtPmNtc2dfZmxhZ3MgJiBJUF9DTVNHX1JFVE9QVFMpICE9IDA7CisJCWJyZWFrOworCWNhc2UgSVBfUEFTU1NFQzoKKwkJdmFsID0gKGluZXQtPmNtc2dfZmxhZ3MgJiBJUF9DTVNHX1BBU1NTRUMpICE9IDA7CisJCWJyZWFrOworCWNhc2UgSVBfVE9TOgorCQl2YWwgPSBpbmV0LT50b3M7CisJCWJyZWFrOworCWNhc2UgSVBfVFRMOgorCQl2YWwgPSAoaW5ldC0+dWNfdHRsID09IC0xID8KKwkJICAgICAgIHN5c2N0bF9pcF9kZWZhdWx0X3R0bCA6CisJCSAgICAgICBpbmV0LT51Y190dGwpOworCQlicmVhazsKKwljYXNlIElQX0hEUklOQ0w6CisJCXZhbCA9IGluZXQtPmhkcmluY2w7CisJCWJyZWFrOworCWNhc2UgSVBfTVRVX0RJU0NPVkVSOgorCQl2YWwgPSBpbmV0LT5wbXR1ZGlzYzsKKwkJYnJlYWs7CisJY2FzZSBJUF9NVFU6CisJeworCQlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3Q7CisJCXZhbCA9IDA7CisJCWRzdCA9IHNrX2RzdF9nZXQoc2spOworCQlpZiAoZHN0KSB7CisJCQl2YWwgPSBkc3RfbXR1KGRzdCk7CisJCQlkc3RfcmVsZWFzZShkc3QpOwogCQl9Ci0JCWNhc2UgSVBfUkVDVkVSUjoKLQkJCXZhbCA9IGluZXQtPnJlY3ZlcnI7Ci0JCQlicmVhazsKLQkJY2FzZSBJUF9NVUxUSUNBU1RfVFRMOgotCQkJdmFsID0gaW5ldC0+bWNfdHRsOwotCQkJYnJlYWs7Ci0JCWNhc2UgSVBfTVVMVElDQVNUX0xPT1A6Ci0JCQl2YWwgPSBpbmV0LT5tY19sb29wOwotCQkJYnJlYWs7Ci0JCWNhc2UgSVBfTVVMVElDQVNUX0lGOgotCQl7Ci0JCQlzdHJ1Y3QgaW5fYWRkciBhZGRyOwotCQkJbGVuID0gbWluX3QodW5zaWduZWQgaW50LCBsZW4sIHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpOwotCQkJYWRkci5zX2FkZHIgPSBpbmV0LT5tY19hZGRyOworCQlpZiAoIXZhbCkgewogCQkJcmVsZWFzZV9zb2NrKHNrKTsKLQotCQkJaWYocHV0X3VzZXIobGVuLCBvcHRsZW4pKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJaWYoY29weV90b191c2VyKG9wdHZhbCwgJmFkZHIsIGxlbikpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQlyZXR1cm4gMDsKKwkJCXJldHVybiAtRU5PVENPTk47CiAJCX0KLQkJY2FzZSBJUF9NU0ZJTFRFUjoKLQkJewotCQkJc3RydWN0IGlwX21zZmlsdGVyIG1zZjsKLQkJCWludCBlcnI7CisJCWJyZWFrOworCX0KKwljYXNlIElQX1JFQ1ZFUlI6CisJCXZhbCA9IGluZXQtPnJlY3ZlcnI7CisJCWJyZWFrOworCWNhc2UgSVBfTVVMVElDQVNUX1RUTDoKKwkJdmFsID0gaW5ldC0+bWNfdHRsOworCQlicmVhazsKKwljYXNlIElQX01VTFRJQ0FTVF9MT09QOgorCQl2YWwgPSBpbmV0LT5tY19sb29wOworCQlicmVhazsKKwljYXNlIElQX01VTFRJQ0FTVF9JRjoKKwl7CisJCXN0cnVjdCBpbl9hZGRyIGFkZHI7CisJCWxlbiA9IG1pbl90KHVuc2lnbmVkIGludCwgbGVuLCBzaXplb2Yoc3RydWN0IGluX2FkZHIpKTsKKwkJYWRkci5zX2FkZHIgPSBpbmV0LT5tY19hZGRyOworCQlyZWxlYXNlX3NvY2soc2spOwogCi0JCQlpZiAobGVuIDwgSVBfTVNGSUxURVJfU0laRSgwKSkgewotCQkJCXJlbGVhc2Vfc29jayhzayk7Ci0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl9Ci0JCQlpZiAoY29weV9mcm9tX3VzZXIoJm1zZiwgb3B0dmFsLCBJUF9NU0ZJTFRFUl9TSVpFKDApKSkgewotCQkJCXJlbGVhc2Vfc29jayhzayk7Ci0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQl9Ci0JCQllcnIgPSBpcF9tY19tc2ZnZXQoc2ssICZtc2YsCi0JCQkJKHN0cnVjdCBpcF9tc2ZpbHRlciBfX3VzZXIgKilvcHR2YWwsIG9wdGxlbik7CisJCWlmIChwdXRfdXNlcihsZW4sIG9wdGxlbikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKGNvcHlfdG9fdXNlcihvcHR2YWwsICZhZGRyLCBsZW4pKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCX0KKwljYXNlIElQX01TRklMVEVSOgorCXsKKwkJc3RydWN0IGlwX21zZmlsdGVyIG1zZjsKKwkJaW50IGVycjsKKworCQlpZiAobGVuIDwgSVBfTVNGSUxURVJfU0laRSgwKSkgewogCQkJcmVsZWFzZV9zb2NrKHNrKTsKLQkJCXJldHVybiBlcnI7CisJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQotCQljYXNlIE1DQVNUX01TRklMVEVSOgotCQl7Ci0JCQlzdHJ1Y3QgZ3JvdXBfZmlsdGVyIGdzZjsKLQkJCWludCBlcnI7Ci0KLQkJCWlmIChsZW4gPCBHUk9VUF9GSUxURVJfU0laRSgwKSkgewotCQkJCXJlbGVhc2Vfc29jayhzayk7Ci0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl9Ci0JCQlpZiAoY29weV9mcm9tX3VzZXIoJmdzZiwgb3B0dmFsLCBHUk9VUF9GSUxURVJfU0laRSgwKSkpIHsKLQkJCQlyZWxlYXNlX3NvY2soc2spOwotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJfQotCQkJZXJyID0gaXBfbWNfZ3NmZ2V0KHNrLCAmZ3NmLAotCQkJCShzdHJ1Y3QgZ3JvdXBfZmlsdGVyIF9fdXNlciAqKW9wdHZhbCwgb3B0bGVuKTsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZtc2YsIG9wdHZhbCwgSVBfTVNGSUxURVJfU0laRSgwKSkpIHsKIAkJCXJlbGVhc2Vfc29jayhzayk7Ci0JCQlyZXR1cm4gZXJyOworCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCX0KLQkJY2FzZSBJUF9QS1RPUFRJT05TOgotCQl7Ci0JCQlzdHJ1Y3QgbXNnaGRyIG1zZzsKKwkJZXJyID0gaXBfbWNfbXNmZ2V0KHNrLCAmbXNmLAorCQkJCSAgIChzdHJ1Y3QgaXBfbXNmaWx0ZXIgX191c2VyICopb3B0dmFsLCBvcHRsZW4pOworCQlyZWxlYXNlX3NvY2soc2spOworCQlyZXR1cm4gZXJyOworCX0KKwljYXNlIE1DQVNUX01TRklMVEVSOgorCXsKKwkJc3RydWN0IGdyb3VwX2ZpbHRlciBnc2Y7CisJCWludCBlcnI7CiAKKwkJaWYgKGxlbiA8IEdST1VQX0ZJTFRFUl9TSVpFKDApKSB7CiAJCQlyZWxlYXNlX3NvY2soc2spOwotCi0JCQlpZiAoc2stPnNrX3R5cGUgIT0gU09DS19TVFJFQU0pCi0JCQkJcmV0dXJuIC1FTk9QUk9UT09QVDsKLQotCQkJbXNnLm1zZ19jb250cm9sID0gb3B0dmFsOwotCQkJbXNnLm1zZ19jb250cm9sbGVuID0gbGVuOwotCQkJbXNnLm1zZ19mbGFncyA9IDA7Ci0KLQkJCWlmIChpbmV0LT5jbXNnX2ZsYWdzICYgSVBfQ01TR19QS1RJTkZPKSB7Ci0JCQkJc3RydWN0IGluX3BrdGluZm8gaW5mbzsKLQotCQkJCWluZm8uaXBpX2FkZHIuc19hZGRyID0gaW5ldC0+cmN2X3NhZGRyOwotCQkJCWluZm8uaXBpX3NwZWNfZHN0LnNfYWRkciA9IGluZXQtPnJjdl9zYWRkcjsKLQkJCQlpbmZvLmlwaV9pZmluZGV4ID0gaW5ldC0+bWNfaW5kZXg7Ci0JCQkJcHV0X2Ntc2coJm1zZywgU09MX0lQLCBJUF9QS1RJTkZPLCBzaXplb2YoaW5mbyksICZpbmZvKTsKLQkJCX0KLQkJCWlmIChpbmV0LT5jbXNnX2ZsYWdzICYgSVBfQ01TR19UVEwpIHsKLQkJCQlpbnQgaGxpbSA9IGluZXQtPm1jX3R0bDsKLQkJCQlwdXRfY21zZygmbXNnLCBTT0xfSVAsIElQX1RUTCwgc2l6ZW9mKGhsaW0pLCAmaGxpbSk7Ci0JCQl9Ci0JCQlsZW4gLT0gbXNnLm1zZ19jb250cm9sbGVuOwotCQkJcmV0dXJuIHB1dF91c2VyKGxlbiwgb3B0bGVuKTsKKwkJCXJldHVybiAtRUlOVkFMOwogCQl9Ci0JCWNhc2UgSVBfRlJFRUJJTkQ6Ci0JCQl2YWwgPSBpbmV0LT5mcmVlYmluZDsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgorCQlpZiAoY29weV9mcm9tX3VzZXIoJmdzZiwgb3B0dmFsLCBHUk9VUF9GSUxURVJfU0laRSgwKSkpIHsKIAkJCXJlbGVhc2Vfc29jayhzayk7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQllcnIgPSBpcF9tY19nc2ZnZXQoc2ssICZnc2YsCisJCQkJICAgKHN0cnVjdCBncm91cF9maWx0ZXIgX191c2VyICopb3B0dmFsLCBvcHRsZW4pOworCQlyZWxlYXNlX3NvY2soc2spOworCQlyZXR1cm4gZXJyOworCX0KKwljYXNlIElQX1BLVE9QVElPTlM6CisJeworCQlzdHJ1Y3QgbXNnaGRyIG1zZzsKKworCQlyZWxlYXNlX3NvY2soc2spOworCisJCWlmIChzay0+c2tfdHlwZSAhPSBTT0NLX1NUUkVBTSkKIAkJCXJldHVybiAtRU5PUFJPVE9PUFQ7CisKKwkJbXNnLm1zZ19jb250cm9sID0gb3B0dmFsOworCQltc2cubXNnX2NvbnRyb2xsZW4gPSBsZW47CisJCW1zZy5tc2dfZmxhZ3MgPSAwOworCisJCWlmIChpbmV0LT5jbXNnX2ZsYWdzICYgSVBfQ01TR19QS1RJTkZPKSB7CisJCQlzdHJ1Y3QgaW5fcGt0aW5mbyBpbmZvOworCisJCQlpbmZvLmlwaV9hZGRyLnNfYWRkciA9IGluZXQtPnJjdl9zYWRkcjsKKwkJCWluZm8uaXBpX3NwZWNfZHN0LnNfYWRkciA9IGluZXQtPnJjdl9zYWRkcjsKKwkJCWluZm8uaXBpX2lmaW5kZXggPSBpbmV0LT5tY19pbmRleDsKKwkJCXB1dF9jbXNnKCZtc2csIFNPTF9JUCwgSVBfUEtUSU5GTywgc2l6ZW9mKGluZm8pLCAmaW5mbyk7CisJCX0KKwkJaWYgKGluZXQtPmNtc2dfZmxhZ3MgJiBJUF9DTVNHX1RUTCkgeworCQkJaW50IGhsaW0gPSBpbmV0LT5tY190dGw7CisJCQlwdXRfY21zZygmbXNnLCBTT0xfSVAsIElQX1RUTCwgc2l6ZW9mKGhsaW0pLCAmaGxpbSk7CisJCX0KKwkJbGVuIC09IG1zZy5tc2dfY29udHJvbGxlbjsKKwkJcmV0dXJuIHB1dF91c2VyKGxlbiwgb3B0bGVuKTsKKwl9CisJY2FzZSBJUF9GUkVFQklORDoKKwkJdmFsID0gaW5ldC0+ZnJlZWJpbmQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJlbGVhc2Vfc29jayhzayk7CisJCXJldHVybiAtRU5PUFJPVE9PUFQ7CiAJfQogCXJlbGVhc2Vfc29jayhzayk7CiAKIAlpZiAobGVuIDwgc2l6ZW9mKGludCkgJiYgbGVuID4gMCAmJiB2YWw+PTAgJiYgdmFsPDI1NSkgewogCQl1bnNpZ25lZCBjaGFyIHVjdmFsID0gKHVuc2lnbmVkIGNoYXIpdmFsOwogCQlsZW4gPSAxOwotCQlpZihwdXRfdXNlcihsZW4sIG9wdGxlbikpCisJCWlmIChwdXRfdXNlcihsZW4sIG9wdGxlbikpCiAJCQlyZXR1cm4gLUVGQVVMVDsKLQkJaWYoY29weV90b191c2VyKG9wdHZhbCwmdWN2YWwsMSkpCisJCWlmIChjb3B5X3RvX3VzZXIob3B0dmFsLCZ1Y3ZhbCwxKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCX0gZWxzZSB7CiAJCWxlbiA9IG1pbl90KHVuc2lnbmVkIGludCwgc2l6ZW9mKGludCksIGxlbik7Ci0JCWlmKHB1dF91c2VyKGxlbiwgb3B0bGVuKSkKKwkJaWYgKHB1dF91c2VyKGxlbiwgb3B0bGVuKSkKIAkJCXJldHVybiAtRUZBVUxUOwotCQlpZihjb3B5X3RvX3VzZXIob3B0dmFsLCZ2YWwsbGVuKSkKKwkJaWYgKGNvcHlfdG9fdXNlcihvcHR2YWwsJnZhbCxsZW4pKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCXJldHVybiAwOwogfQogCiBpbnQgaXBfZ2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBsZXZlbCwKLQkJaW50IG9wdG5hbWUsIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBfX3VzZXIgKm9wdGxlbikKKwkJICBpbnQgb3B0bmFtZSwgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IF9fdXNlciAqb3B0bGVuKQogewogCWludCBlcnI7CiAKQEAgLTExNjksNyArMTE3NCw3IEBACiAJICAgKSB7CiAJCWludCBsZW47CiAKLQkJaWYoZ2V0X3VzZXIobGVuLG9wdGxlbikpCisJCWlmIChnZXRfdXNlcihsZW4sb3B0bGVuKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCiAJCWxvY2tfc29jayhzayk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcGNvbXAuYyBiL25ldC9pcHY0L2lwY29tcC5jCmluZGV4IGFhNzA0YjguLmFiODYxMzcgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwY29tcC5jCisrKyBiL25ldC9pcHY0L2lwY29tcC5jCkBAIC00MywyMSArNDMsMTUgQEAKIAogc3RhdGljIGludCBpcGNvbXBfZGVjb21wcmVzcyhzdHJ1Y3QgeGZybV9zdGF0ZSAqeCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlpbnQgZXJyLCBwbGVuLCBkbGVuOwogCXN0cnVjdCBpcGNvbXBfZGF0YSAqaXBjZCA9IHgtPmRhdGE7Ci0JdTggKnN0YXJ0LCAqc2NyYXRjaDsKLQlzdHJ1Y3QgY3J5cHRvX2NvbXAgKnRmbTsKLQlpbnQgY3B1OworCWNvbnN0IGludCBwbGVuID0gc2tiLT5sZW47CisJaW50IGRsZW4gPSBJUENPTVBfU0NSQVRDSF9TSVpFOworCWNvbnN0IHU4ICpzdGFydCA9IHNrYi0+ZGF0YTsKKwljb25zdCBpbnQgY3B1ID0gZ2V0X2NwdSgpOworCXU4ICpzY3JhdGNoID0gKnBlcl9jcHVfcHRyKGlwY29tcF9zY3JhdGNoZXMsIGNwdSk7CisJc3RydWN0IGNyeXB0b19jb21wICp0Zm0gPSAqcGVyX2NwdV9wdHIoaXBjZC0+dGZtcywgY3B1KTsKKwlpbnQgZXJyID0gY3J5cHRvX2NvbXBfZGVjb21wcmVzcyh0Zm0sIHN0YXJ0LCBwbGVuLCBzY3JhdGNoLCAmZGxlbik7CiAKLQlwbGVuID0gc2tiLT5sZW47Ci0JZGxlbiA9IElQQ09NUF9TQ1JBVENIX1NJWkU7Ci0Jc3RhcnQgPSBza2ItPmRhdGE7Ci0KLQljcHUgPSBnZXRfY3B1KCk7Ci0Jc2NyYXRjaCA9ICpwZXJfY3B1X3B0cihpcGNvbXBfc2NyYXRjaGVzLCBjcHUpOwotCXRmbSA9ICpwZXJfY3B1X3B0cihpcGNkLT50Zm1zLCBjcHUpOwotCi0JZXJyID0gY3J5cHRvX2NvbXBfZGVjb21wcmVzcyh0Zm0sIHN0YXJ0LCBwbGVuLCBzY3JhdGNoLCAmZGxlbik7CiAJaWYgKGVycikKIAkJZ290byBvdXQ7CiAKQEAgLTcyLDcgKzY2LDcgQEAKIAogCXNrYi0+dHJ1ZXNpemUgKz0gZGxlbiAtIHBsZW47CiAJX19za2JfcHV0KHNrYiwgZGxlbiAtIHBsZW4pOwotCW1lbWNweShza2ItPmRhdGEsIHNjcmF0Y2gsIGRsZW4pOworCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhKHNrYiwgc2NyYXRjaCwgZGxlbik7CiBvdXQ6CiAJcHV0X2NwdSgpOwogCXJldHVybiBlcnI7CkBAIC05MCwxMCArODQsMTAgQEAKIAlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CiAKIAkvKiBSZW1vdmUgaXBjb21wIGhlYWRlciBhbmQgZGVjb21wcmVzcyBvcmlnaW5hbCBwYXlsb2FkICovCi0JaXBoID0gc2tiLT5uaC5pcGg7CisJaXBoID0gaXBfaGRyKHNrYik7CiAJaXBjaCA9ICh2b2lkICopc2tiLT5kYXRhOwogCWlwaC0+cHJvdG9jb2wgPSBpcGNoLT5uZXh0aGRyOwotCXNrYi0+aC5yYXcgPSBza2ItPm5oLnJhdyArIHNpemVvZigqaXBjaCk7CisJc2tiLT50cmFuc3BvcnRfaGVhZGVyID0gc2tiLT5uZXR3b3JrX2hlYWRlciArIHNpemVvZigqaXBjaCk7CiAJX19za2JfcHVsbChza2IsIHNpemVvZigqaXBjaCkpOwogCWVyciA9IGlwY29tcF9kZWNvbXByZXNzKHgsIHNrYik7CiAKQEAgLTEwMywyMyArOTcsMTYgQEAKIAogc3RhdGljIGludCBpcGNvbXBfY29tcHJlc3Moc3RydWN0IHhmcm1fc3RhdGUgKngsIHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JaW50IGVyciwgcGxlbiwgZGxlbiwgaWhsZW47Ci0Jc3RydWN0IGlwaGRyICppcGggPSBza2ItPm5oLmlwaDsKIAlzdHJ1Y3QgaXBjb21wX2RhdGEgKmlwY2QgPSB4LT5kYXRhOwotCXU4ICpzdGFydCwgKnNjcmF0Y2g7Ci0Jc3RydWN0IGNyeXB0b19jb21wICp0Zm07Ci0JaW50IGNwdTsKKwljb25zdCBpbnQgaWhsZW4gPSBpcF9oZHJsZW4oc2tiKTsKKwljb25zdCBpbnQgcGxlbiA9IHNrYi0+bGVuIC0gaWhsZW47CisJaW50IGRsZW4gPSBJUENPTVBfU0NSQVRDSF9TSVpFOworCXU4ICpzdGFydCA9IHNrYi0+ZGF0YSArIGlobGVuOworCWNvbnN0IGludCBjcHUgPSBnZXRfY3B1KCk7CisJdTggKnNjcmF0Y2ggPSAqcGVyX2NwdV9wdHIoaXBjb21wX3NjcmF0Y2hlcywgY3B1KTsKKwlzdHJ1Y3QgY3J5cHRvX2NvbXAgKnRmbSA9ICpwZXJfY3B1X3B0cihpcGNkLT50Zm1zLCBjcHUpOworCWludCBlcnIgPSBjcnlwdG9fY29tcF9jb21wcmVzcyh0Zm0sIHN0YXJ0LCBwbGVuLCBzY3JhdGNoLCAmZGxlbik7CiAKLQlpaGxlbiA9IGlwaC0+aWhsICogNDsKLQlwbGVuID0gc2tiLT5sZW4gLSBpaGxlbjsKLQlkbGVuID0gSVBDT01QX1NDUkFUQ0hfU0laRTsKLQlzdGFydCA9IHNrYi0+ZGF0YSArIGlobGVuOwotCi0JY3B1ID0gZ2V0X2NwdSgpOwotCXNjcmF0Y2ggPSAqcGVyX2NwdV9wdHIoaXBjb21wX3NjcmF0Y2hlcywgY3B1KTsKLQl0Zm0gPSAqcGVyX2NwdV9wdHIoaXBjZC0+dGZtcywgY3B1KTsKLQotCWVyciA9IGNyeXB0b19jb21wX2NvbXByZXNzKHRmbSwgc3RhcnQsIHBsZW4sIHNjcmF0Y2gsICZkbGVuKTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dDsKIApAQCAtMTQyLDEyICsxMjksMTEgQEAKIHN0YXRpYyBpbnQgaXBjb21wX291dHB1dChzdHJ1Y3QgeGZybV9zdGF0ZSAqeCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlpbnQgZXJyOwotCXN0cnVjdCBpcGhkciAqaXBoOwogCXN0cnVjdCBpcF9jb21wX2hkciAqaXBjaDsKIAlzdHJ1Y3QgaXBjb21wX2RhdGEgKmlwY2QgPSB4LT5kYXRhOwogCWludCBoZHJfbGVuID0gMDsKKwlzdHJ1Y3QgaXBoZHIgKmlwaCA9IGlwX2hkcihza2IpOwogCi0JaXBoID0gc2tiLT5uaC5pcGg7CiAJaXBoLT50b3RfbGVuID0gaHRvbnMoc2tiLT5sZW4pOwogCWhkcl9sZW4gPSBpcGgtPmlobCAqIDQ7CiAJaWYgKChza2ItPmxlbiAtIGhkcl9sZW4pIDwgaXBjZC0+dGhyZXNob2xkKSB7CkBAIC0xNTksNyArMTQ1LDcgQEAKIAkJZ290byBvdXRfb2s7CiAKIAllcnIgPSBpcGNvbXBfY29tcHJlc3MoeCwgc2tiKTsKLQlpcGggPSBza2ItPm5oLmlwaDsKKwlpcGggPSBpcF9oZHIoc2tiKTsKIAogCWlmIChlcnIpIHsKIAkJZ290byBvdXRfb2s7CkBAIC0xODgsOCArMTc0LDggQEAKIAlzdHJ1Y3QgaXBfY29tcF9oZHIgKmlwY2ggPSAoc3RydWN0IGlwX2NvbXBfaGRyICopKHNrYi0+ZGF0YSsoaXBoLT5paGw8PDIpKTsKIAlzdHJ1Y3QgeGZybV9zdGF0ZSAqeDsKIAotCWlmIChza2ItPmguaWNtcGgtPnR5cGUgIT0gSUNNUF9ERVNUX1VOUkVBQ0ggfHwKLQkgICAgc2tiLT5oLmljbXBoLT5jb2RlICE9IElDTVBfRlJBR19ORUVERUQpCisJaWYgKGljbXBfaGRyKHNrYiktPnR5cGUgIT0gSUNNUF9ERVNUX1VOUkVBQ0ggfHwKKwkgICAgaWNtcF9oZHIoc2tiKS0+Y29kZSAhPSBJQ01QX0ZSQUdfTkVFREVEKQogCQlyZXR1cm47CiAKIAlzcGkgPSBodG9ubChudG9ocyhpcGNoLT5jcGkpKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwY29uZmlnLmMgYi9uZXQvaXB2NC9pcGNvbmZpZy5jCmluZGV4IGNmNDlkZTEuLjU5N2M4MDAgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwY29uZmlnLmMKKysrIGIvbmV0L2lwdjQvaXBjb25maWcuYwpAQCAtNDMyLDcgKzQzMiw3IEBACiAJCWdvdG8gZHJvcDsKIAogCS8qIEJhc2ljIHNhbml0eSBjaGVja3MgY2FuIGJlIGRvbmUgd2l0aG91dCB0aGUgbG9jay4gICovCi0JcmFycCA9IChzdHJ1Y3QgYXJwaGRyICopc2tiLT5oLnJhdzsKKwlyYXJwID0gKHN0cnVjdCBhcnBoZHIgKilza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpOwogCiAJLyogSWYgdGhpcyB0ZXN0IGRvZXNuJ3QgcGFzcywgaXQncyBub3QgSVAsIG9yIHdlIHNob3VsZAogCSAqIGlnbm9yZSBpdCBhbnl3YXkuCkBAIC00NTUsNyArNDU1LDcgQEAKIAkJZ290byBkcm9wOwogCiAJLyogT0ssIGl0IGlzIGFsbCB0aGVyZSBhbmQgbG9va3MgdmFsaWQsIHByb2Nlc3MuLi4gKi8KLQlyYXJwID0gKHN0cnVjdCBhcnBoZHIgKilza2ItPmgucmF3OworCXJhcnAgPSAoc3RydWN0IGFycGhkciAqKXNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYik7CiAJcmFycF9wdHIgPSAodW5zaWduZWQgY2hhciAqKSAocmFycCArIDEpOwogCiAJLyogT25lIHJlcGx5IGF0IGEgdGltZSwgcGxlYXNlLiAqLwpAQCAtNzAyLDcgKzcwMiw4IEBACiAJbWVtc2V0KGIsIDAsIHNpemVvZihzdHJ1Y3QgYm9vdHBfcGt0KSk7CiAKIAkvKiBDb25zdHJ1Y3QgSVAgaGVhZGVyICovCi0Jc2tiLT5uaC5pcGggPSBoID0gJmItPmlwaDsKKwlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiKTsKKwloID0gaXBfaGRyKHNrYik7CiAJaC0+dmVyc2lvbiA9IDQ7CiAJaC0+aWhsID0gNTsKIAloLT50b3RfbGVuID0gaHRvbnMoc2l6ZW9mKHN0cnVjdCBib290cF9wa3QpKTsKQEAgLTc4Miw3ICs3ODMsNyBAQAogCXU4ICpjOwogCiAJcHJpbnRrKCJESENQL0JPT1RQOiBHb3QgZXh0ZW5zaW9uICVkOiIsKmV4dCk7Ci0JZm9yKGM9ZXh0KzI7IGM8ZXh0KzIrZXh0WzFdOyBjKyspCisJZm9yIChjPWV4dCsyOyBjPGV4dCsyK2V4dFsxXTsgYysrKQogCQlwcmludGsoIiAlMDJ4IiwgKmMpOwogCXByaW50aygiXG4iKTsKICNlbmRpZgpAQCAtODQ1LDcgKzg0Niw3IEBACiAJCQkgICBzaXplb2Yoc3RydWN0IHVkcGhkcikpKQogCQlnb3RvIGRyb3A7CiAKLQliID0gKHN0cnVjdCBib290cF9wa3QgKikgc2tiLT5uaC5pcGg7CisJYiA9IChzdHJ1Y3QgYm9vdHBfcGt0ICopc2tiX25ldHdvcmtfaGVhZGVyKHNrYik7CiAJaCA9ICZiLT5pcGg7CiAKIAlpZiAoaC0+aWhsICE9IDUgfHwgaC0+dmVyc2lvbiAhPSA0IHx8IGgtPnByb3RvY29sICE9IElQUFJPVE9fVURQKQpAQCAtODgzLDcgKzg4NCw3IEBACiAJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgc2tiLT5sZW4pKQogCQlnb3RvIGRyb3A7CiAKLQliID0gKHN0cnVjdCBib290cF9wa3QgKikgc2tiLT5uaC5pcGg7CisJYiA9IChzdHJ1Y3QgYm9vdHBfcGt0ICopc2tiX25ldHdvcmtfaGVhZGVyKHNrYik7CiAJaCA9ICZiLT5pcGg7CiAKIAkvKiBPbmUgcmVwbHkgYXQgYSB0aW1lLCBwbGVhc2UuICovCkBAIC05MzgsNyArOTM5LDcgQEAKIAkJCQkJaWYgKG9wdFsxXSA+PSA0KQogCQkJCQkJbWVtY3B5KCZzZXJ2ZXJfaWQsIG9wdCArIDIsIDQpOwogCQkJCQlicmVhazsKLQkJCQl9OworCQkJCX0KIAkJCX0KIAogI2lmZGVmIElQQ09ORklHX0RFQlVHCkBAIC05ODMsNyArOTg0LDcgQEAKIAkJCQlpY19teWFkZHIgPSBOT05FOwogCQkJCWljX3NlcnZhZGRyID0gTk9ORTsKIAkJCQlnb3RvIGRyb3BfdW5sb2NrOwotCQkJfTsKKwkJCX0KIAogCQkJaWNfZGhjcF9tc2d0eXBlID0gbXQ7CiAKQEAgLTEwOTQsNyArMTA5NSw3IEBACiAJcmV0cmllcyA9IENPTkZfU0VORF9SRVRSSUVTOwogCWdldF9yYW5kb21fYnl0ZXMoJnRpbWVvdXQsIHNpemVvZih0aW1lb3V0KSk7CiAJdGltZW91dCA9IENPTkZfQkFTRV9USU1FT1VUICsgKHRpbWVvdXQgJSAodW5zaWduZWQpIENPTkZfVElNRU9VVF9SQU5ET00pOwotCWZvcig7OykgeworCWZvciAoOzspIHsKICNpZmRlZiBJUENPTkZJR19CT09UUAogCQlpZiAoZG9fYm9vdHAgJiYgKGQtPmFibGUgJiBJQ19CT09UUCkpCiAJCQlpY19ib290cF9zZW5kX2lmKGQsIGppZmZpZXMgLSBzdGFydF9qaWZmaWVzKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwaXAuYyBiL25ldC9pcHY0L2lwaXAuYwppbmRleCAzZWM1Y2UwLi5lYmQyZjJkIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcGlwLmMKKysrIGIvbmV0L2lwdjQvaXBpcC5jCkBAIC0xNTcsMTAgKzE1NywxMCBAQAogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgc3RydWN0IGlwX3R1bm5lbCAqKmlwaXBfYnVja2V0KHN0cnVjdCBpcF90dW5uZWwgKnQpCitzdGF0aWMgc3RydWN0IGlwX3R1bm5lbCAqKl9faXBpcF9idWNrZXQoc3RydWN0IGlwX3R1bm5lbF9wYXJtICpwYXJtcykKIHsKLQlfX2JlMzIgcmVtb3RlID0gdC0+cGFybXMuaXBoLmRhZGRyOwotCV9fYmUzMiBsb2NhbCA9IHQtPnBhcm1zLmlwaC5zYWRkcjsKKwlfX2JlMzIgcmVtb3RlID0gcGFybXMtPmlwaC5kYWRkcjsKKwlfX2JlMzIgbG9jYWwgPSBwYXJtcy0+aXBoLnNhZGRyOwogCXVuc2lnbmVkIGggPSAwOwogCWludCBwcmlvID0gMDsKIApAQCAtMTc1LDYgKzE3NSwxMCBAQAogCXJldHVybiAmdHVubmVsc1twcmlvXVtoXTsKIH0KIAorc3RhdGljIGlubGluZSBzdHJ1Y3QgaXBfdHVubmVsICoqaXBpcF9idWNrZXQoc3RydWN0IGlwX3R1bm5lbCAqdCkKK3sKKwlyZXR1cm4gX19pcGlwX2J1Y2tldCgmdC0+cGFybXMpOworfQogCiBzdGF0aWMgdm9pZCBpcGlwX3R1bm5lbF91bmxpbmsoc3RydWN0IGlwX3R1bm5lbCAqdCkKIHsKQEAgLTIwNiwxOSArMjEwLDkgQEAKIAlfX2JlMzIgbG9jYWwgPSBwYXJtcy0+aXBoLnNhZGRyOwogCXN0cnVjdCBpcF90dW5uZWwgKnQsICoqdHAsICpudDsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwotCXVuc2lnbmVkIGggPSAwOwotCWludCBwcmlvID0gMDsKIAljaGFyIG5hbWVbSUZOQU1TSVpdOwogCi0JaWYgKHJlbW90ZSkgewotCQlwcmlvIHw9IDI7Ci0JCWggXj0gSEFTSChyZW1vdGUpOwotCX0KLQlpZiAobG9jYWwpIHsKLQkJcHJpbyB8PSAxOwotCQloIF49IEhBU0gobG9jYWwpOwotCX0KLQlmb3IgKHRwID0gJnR1bm5lbHNbcHJpb11baF07ICh0ID0gKnRwKSAhPSBOVUxMOyB0cCA9ICZ0LT5uZXh0KSB7CisJZm9yICh0cCA9IF9faXBpcF9idWNrZXQocGFybXMpOyAodCA9ICp0cCkgIT0gTlVMTDsgdHAgPSAmdC0+bmV4dCkgewogCQlpZiAobG9jYWwgPT0gdC0+cGFybXMuaXBoLnNhZGRyICYmIHJlbW90ZSA9PSB0LT5wYXJtcy5pcGguZGFkZHIpCiAJCQlyZXR1cm4gdDsKIAl9CkBAIC0yODAsOCArMjc0LDggQEAKICAgIElDTVAgaW4gdGhlIHJlYWwgSW50ZXJuZXQgaXMgYWJzb2x1dGVseSBpbmZlYXNpYmxlLgogICovCiAJc3RydWN0IGlwaGRyICppcGggPSAoc3RydWN0IGlwaGRyKilza2ItPmRhdGE7Ci0JaW50IHR5cGUgPSBza2ItPmguaWNtcGgtPnR5cGU7Ci0JaW50IGNvZGUgPSBza2ItPmguaWNtcGgtPmNvZGU7CisJY29uc3QgaW50IHR5cGUgPSBpY21wX2hkcihza2IpLT50eXBlOworCWNvbnN0IGludCBjb2RlID0gaWNtcF9oZHIoc2tiKS0+Y29kZTsKIAlzdHJ1Y3QgaXBfdHVubmVsICp0OwogCWludCBlcnI7CiAKQEAgLTMzNiw4ICszMzAsOCBAQAogCXN0cnVjdCBpcGhkciAqaXBoID0gKHN0cnVjdCBpcGhkciopZHA7CiAJaW50IGhsZW4gPSBpcGgtPmlobDw8MjsKIAlzdHJ1Y3QgaXBoZHIgKmVpcGg7Ci0JaW50IHR5cGUgPSBza2ItPmguaWNtcGgtPnR5cGU7Ci0JaW50IGNvZGUgPSBza2ItPmguaWNtcGgtPmNvZGU7CisJY29uc3QgaW50IHR5cGUgPSBpY21wX2hkcihza2IpLT50eXBlOworCWNvbnN0IGludCBjb2RlID0gaWNtcF9oZHIoc2tiKS0+Y29kZTsKIAlpbnQgcmVsX3R5cGUgPSAwOwogCWludCByZWxfY29kZSA9IDA7CiAJX19iZTMyIHJlbF9pbmZvID0gMDsKQEAgLTM1NCw3ICszNDgsNyBAQAogCWRlZmF1bHQ6CiAJCXJldHVybiAwOwogCWNhc2UgSUNNUF9QQVJBTUVURVJQUk9COgotCQluID0gbnRvaGwoc2tiLT5oLmljbXBoLT51bi5nYXRld2F5KSA+PiAyNDsKKwkJbiA9IG50b2hsKGljbXBfaGRyKHNrYiktPnVuLmdhdGV3YXkpID4+IDI0OwogCQlpZiAobiA8IGhsZW4pCiAJCQlyZXR1cm4gMDsKIApAQCAtMzczLDcgKzM2Nyw3IEBACiAJCQlyZXR1cm4gMDsKIAkJY2FzZSBJQ01QX0ZSQUdfTkVFREVEOgogCQkJLyogQW5kIGl0IGlzIHRoZSBvbmx5IHJlYWxseSBuZWNlc3NhcnkgdGhpbmcgOi0pICovCi0JCQluID0gbnRvaHMoc2tiLT5oLmljbXBoLT51bi5mcmFnLm10dSk7CisJCQluID0gbnRvaHMoaWNtcF9oZHIoc2tiKS0+dW4uZnJhZy5tdHUpOwogCQkJaWYgKG4gPCBobGVuKzY4KQogCQkJCXJldHVybiAwOwogCQkJbiAtPSBobGVuOwpAQCAtNDA1LDcgKzM5OSw3IEBACiAJZHN0X3JlbGVhc2Uoc2tiMi0+ZHN0KTsKIAlza2IyLT5kc3QgPSBOVUxMOwogCXNrYl9wdWxsKHNrYjIsIHNrYi0+ZGF0YSAtICh1OCopZWlwaCk7Ci0Jc2tiMi0+bmgucmF3ID0gc2tiMi0+ZGF0YTsKKwlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiMik7CiAKIAkvKiBUcnkgdG8gZ3Vlc3MgaW5jb21pbmcgaW50ZXJmYWNlICovCiAJbWVtc2V0KCZmbCwgMCwgc2l6ZW9mKGZsKSk7CkBAIC00NjEsOSArNDU1LDEwIEBACiAjZW5kaWYKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGlwaXBfZWNuX2RlY2Fwc3VsYXRlKHN0cnVjdCBpcGhkciAqb3V0ZXJfaXBoLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorc3RhdGljIGlubGluZSB2b2lkIGlwaXBfZWNuX2RlY2Fwc3VsYXRlKGNvbnN0IHN0cnVjdCBpcGhkciAqb3V0ZXJfaXBoLAorCQkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXN0cnVjdCBpcGhkciAqaW5uZXJfaXBoID0gc2tiLT5uaC5pcGg7CisJc3RydWN0IGlwaGRyICppbm5lcl9pcGggPSBpcF9oZHIoc2tiKTsKIAogCWlmIChJTkVUX0VDTl9pc19jZShvdXRlcl9pcGgtPnRvcykpCiAJCUlQX0VDTl9zZXRfY2UoaW5uZXJfaXBoKTsKQEAgLTQ3MSwxMCArNDY2LDggQEAKIAogc3RhdGljIGludCBpcGlwX3JjdihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXN0cnVjdCBpcGhkciAqaXBoOwogCXN0cnVjdCBpcF90dW5uZWwgKnR1bm5lbDsKLQotCWlwaCA9IHNrYi0+bmguaXBoOworCWNvbnN0IHN0cnVjdCBpcGhkciAqaXBoID0gaXBfaGRyKHNrYik7CiAKIAlyZWFkX2xvY2soJmlwaXBfbG9jayk7CiAJaWYgKCh0dW5uZWwgPSBpcGlwX3R1bm5lbF9sb29rdXAoaXBoLT5zYWRkciwgaXBoLT5kYWRkcikpICE9IE5VTEwpIHsKQEAgLTQ4Niw4ICs0NzksOCBAQAogCiAJCXNlY3BhdGhfcmVzZXQoc2tiKTsKIAotCQlza2ItPm1hYy5yYXcgPSBza2ItPm5oLnJhdzsKLQkJc2tiLT5uaC5yYXcgPSBza2ItPmRhdGE7CisJCXNrYi0+bWFjX2hlYWRlciA9IHNrYi0+bmV0d29ya19oZWFkZXI7CisJCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOwogCQlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfSVApOwogCQlza2ItPnBrdF90eXBlID0gUEFDS0VUX0hPU1Q7CiAKQEAgLTUyMSw3ICs1MTQsNyBAQAogCV9fYmUxNiBkZiA9IHRpcGgtPmZyYWdfb2ZmOwogCXN0cnVjdCBydGFibGUgKnJ0OyAgICAgCQkJLyogUm91dGUgdG8gdGhlIG90aGVyIGhvc3QgKi8KIAlzdHJ1Y3QgbmV0X2RldmljZSAqdGRldjsJCQkvKiBEZXZpY2UgdG8gb3RoZXIgaG9zdCAqLwotCXN0cnVjdCBpcGhkciAgKm9sZF9pcGggPSBza2ItPm5oLmlwaDsKKwlzdHJ1Y3QgaXBoZHIgICpvbGRfaXBoID0gaXBfaGRyKHNrYik7CiAJc3RydWN0IGlwaGRyICAqaXBoOwkJCS8qIE91ciBuZXcgSVAgaGVhZGVyICovCiAJaW50ICAgIG1heF9oZWFkcm9vbTsJCQkvKiBUaGUgZXh0cmEgaGVhZGVyIHNwYWNlIG5lZWRlZCAqLwogCV9fYmUzMiBkc3QgPSB0aXBoLT5kYWRkcjsKQEAgLTYxNSwxMSArNjA4LDEyIEBACiAJCQlza2Jfc2V0X293bmVyX3cobmV3X3NrYiwgc2tiLT5zayk7CiAJCWRldl9rZnJlZV9za2Ioc2tiKTsKIAkJc2tiID0gbmV3X3NrYjsKLQkJb2xkX2lwaCA9IHNrYi0+bmguaXBoOworCQlvbGRfaXBoID0gaXBfaGRyKHNrYik7CiAJfQogCi0Jc2tiLT5oLnJhdyA9IHNrYi0+bmgucmF3OwotCXNrYi0+bmgucmF3ID0gc2tiX3B1c2goc2tiLCBzaXplb2Yoc3RydWN0IGlwaGRyKSk7CisJc2tiLT50cmFuc3BvcnRfaGVhZGVyID0gc2tiLT5uZXR3b3JrX2hlYWRlcjsKKwlza2JfcHVzaChza2IsIHNpemVvZihzdHJ1Y3QgaXBoZHIpKTsKKwlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiKTsKIAltZW1zZXQoJihJUENCKHNrYiktPm9wdCksIDAsIHNpemVvZihJUENCKHNrYiktPm9wdCkpOwogCUlQQ0Ioc2tiKS0+ZmxhZ3MgJj0gfihJUFNLQl9YRlJNX1RVTk5FTF9TSVpFIHwgSVBTS0JfWEZSTV9UUkFOU0ZPUk1FRCB8CiAJCQkgICAgICBJUFNLQl9SRVJPVVRFRCk7CkBAIC02MzAsNyArNjI0LDcgQEAKIAkgKglQdXNoIGRvd24gYW5kIGluc3RhbGwgdGhlIElQSVAgaGVhZGVyLgogCSAqLwogCi0JaXBoIAkJCT0Jc2tiLT5uaC5pcGg7CisJaXBoIAkJCT0JaXBfaGRyKHNrYik7CiAJaXBoLT52ZXJzaW9uCQk9CTQ7CiAJaXBoLT5paGwJCT0Jc2l6ZW9mKHN0cnVjdCBpcGhkcik+PjI7CiAJaXBoLT5mcmFnX29mZgkJPQlkZjsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwbXIuYyBiL25ldC9pcHY0L2lwbXIuYwppbmRleCA2MDFlM2RmLi4wZWJhZTQxIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcG1yLmMKKysrIGIvbmV0L2lwdjQvaXBtci5jCkBAIC02Miw2ICs2Miw3IEBACiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQuaD4KICNpbmNsdWRlIDxuZXQvaXBpcC5oPgogI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgorI2luY2x1ZGUgPG5ldC9uZXRsaW5rLmg+CiAKICNpZiBkZWZpbmVkKENPTkZJR19JUF9QSU1TTV9WMSkgfHwgZGVmaW5lZChDT05GSUdfSVBfUElNU01fVjIpCiAjZGVmaW5lIENPTkZJR19JUF9QSU1TTQkxCkBAIC0zMDIsOCArMzAzLDggQEAKIAogCWF0b21pY19kZWMoJmNhY2hlX3Jlc29sdmVfcXVldWVfbGVuKTsKIAotCXdoaWxlKChza2I9c2tiX2RlcXVldWUoJmMtPm1mY191bi51bnJlcy51bnJlc29sdmVkKSkpIHsKLQkJaWYgKHNrYi0+bmguaXBoLT52ZXJzaW9uID09IDApIHsKKwl3aGlsZSAoKHNrYj1za2JfZGVxdWV1ZSgmYy0+bWZjX3VuLnVucmVzLnVucmVzb2x2ZWQpKSkgeworCQlpZiAoaXBfaGRyKHNrYiktPnZlcnNpb24gPT0gMCkgewogCQkJc3RydWN0IG5sbXNnaGRyICpubGggPSAoc3RydWN0IG5sbXNnaGRyICopc2tiX3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IGlwaGRyKSk7CiAJCQlubGgtPm5sbXNnX3R5cGUgPSBOTE1TR19FUlJPUjsKIAkJCW5saC0+bmxtc2dfbGVuID0gTkxNU0dfTEVOR1RIKHNpemVvZihzdHJ1Y3Qgbmxtc2dlcnIpKTsKQEAgLTQ3OSw3ICs0ODAsNyBAQAogc3RhdGljIHN0cnVjdCBtZmNfY2FjaGUgKmlwbXJfY2FjaGVfYWxsb2Modm9pZCkKIHsKIAlzdHJ1Y3QgbWZjX2NhY2hlICpjPWttZW1fY2FjaGVfemFsbG9jKG1ydF9jYWNoZXAsIEdGUF9LRVJORUwpOwotCWlmKGM9PU5VTEwpCisJaWYgKGM9PU5VTEwpCiAJCXJldHVybiBOVUxMOwogCWMtPm1mY191bi5yZXMubWludmlmID0gTUFYVklGUzsKIAlyZXR1cm4gYzsKQEAgLTQ4OCw3ICs0ODksNyBAQAogc3RhdGljIHN0cnVjdCBtZmNfY2FjaGUgKmlwbXJfY2FjaGVfYWxsb2NfdW5yZXModm9pZCkKIHsKIAlzdHJ1Y3QgbWZjX2NhY2hlICpjPWttZW1fY2FjaGVfemFsbG9jKG1ydF9jYWNoZXAsIEdGUF9BVE9NSUMpOwotCWlmKGM9PU5VTEwpCisJaWYgKGM9PU5VTEwpCiAJCXJldHVybiBOVUxMOwogCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmMtPm1mY191bi51bnJlcy51bnJlc29sdmVkKTsKIAljLT5tZmNfdW4udW5yZXMuZXhwaXJlcyA9IGppZmZpZXMgKyAxMCpIWjsKQEAgLTUwOCwxMiArNTA5LDEzIEBACiAJICoJUGxheSB0aGUgcGVuZGluZyBlbnRyaWVzIHRocm91Z2ggb3VyIHJvdXRlcgogCSAqLwogCi0Jd2hpbGUoKHNrYj1fX3NrYl9kZXF1ZXVlKCZ1Yy0+bWZjX3VuLnVucmVzLnVucmVzb2x2ZWQpKSkgewotCQlpZiAoc2tiLT5uaC5pcGgtPnZlcnNpb24gPT0gMCkgeworCXdoaWxlICgoc2tiPV9fc2tiX2RlcXVldWUoJnVjLT5tZmNfdW4udW5yZXMudW5yZXNvbHZlZCkpKSB7CisJCWlmIChpcF9oZHIoc2tiKS0+dmVyc2lvbiA9PSAwKSB7CiAJCQlzdHJ1Y3Qgbmxtc2doZHIgKm5saCA9IChzdHJ1Y3Qgbmxtc2doZHIgKilza2JfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgaXBoZHIpKTsKIAogCQkJaWYgKGlwbXJfZmlsbF9tcm91dGUoc2tiLCBjLCBOTE1TR19EQVRBKG5saCkpID4gMCkgewotCQkJCW5saC0+bmxtc2dfbGVuID0gc2tiLT50YWlsIC0gKHU4KilubGg7CisJCQkJbmxoLT5ubG1zZ19sZW4gPSAoc2tiX3RhaWxfcG9pbnRlcihza2IpIC0KKwkJCQkJCSAgKHU4ICopbmxoKTsKIAkJCX0gZWxzZSB7CiAJCQkJbmxoLT5ubG1zZ190eXBlID0gTkxNU0dfRVJST1I7CiAJCQkJbmxoLT5ubG1zZ19sZW4gPSBOTE1TR19MRU5HVEgoc2l6ZW9mKHN0cnVjdCBubG1zZ2VycikpOwpAQCAtNTM5LDcgKzU0MSw3IEBACiBzdGF0aWMgaW50IGlwbXJfY2FjaGVfcmVwb3J0KHN0cnVjdCBza19idWZmICpwa3QsIHZpZmlfdCB2aWZpLCBpbnQgYXNzZXJ0KQogewogCXN0cnVjdCBza19idWZmICpza2I7Ci0JaW50IGlobCA9IHBrdC0+bmguaXBoLT5paGw8PDI7CisJY29uc3QgaW50IGlobCA9IGlwX2hkcmxlbihwa3QpOwogCXN0cnVjdCBpZ21waGRyICppZ21wOwogCXN0cnVjdCBpZ21wbXNnICptc2c7CiAJaW50IHJldDsKQEAgLTU1MSw3ICs1NTMsNyBAQAogI2VuZGlmCiAJCXNrYiA9IGFsbG9jX3NrYigxMjgsIEdGUF9BVE9NSUMpOwogCi0JaWYoIXNrYikKKwlpZiAoIXNrYikKIAkJcmV0dXJuIC1FTk9CVUZTOwogCiAjaWZkZWYgQ09ORklHX0lQX1BJTVNNCkBAIC01NjEsMTQgKzU2MywxNyBAQAogCQkgICBBbmQgYWxsIHRoaXMgb25seSB0byBtYW5nbGUgbXNnLT5pbV9tc2d0eXBlIGFuZAogCQkgICB0byBzZXQgbXNnLT5pbV9tYnogdG8gIm1ieiIgOi0pCiAJCSAqLwotCQltc2cgPSAoc3RydWN0IGlnbXBtc2cqKXNrYl9wdXNoKHNrYiwgc2l6ZW9mKHN0cnVjdCBpcGhkcikpOwotCQlza2ItPm5oLnJhdyA9IHNrYi0+aC5yYXcgPSAodTgqKW1zZzsKLQkJbWVtY3B5KG1zZywgcGt0LT5uaC5yYXcsIHNpemVvZihzdHJ1Y3QgaXBoZHIpKTsKKwkJc2tiX3B1c2goc2tiLCBzaXplb2Yoc3RydWN0IGlwaGRyKSk7CisJCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOworCQlza2JfcmVzZXRfdHJhbnNwb3J0X2hlYWRlcihza2IpOworCQltc2cgPSAoc3RydWN0IGlnbXBtc2cgKilza2JfbmV0d29ya19oZWFkZXIoc2tiKTsKKwkJbWVtY3B5KG1zZywgc2tiX25ldHdvcmtfaGVhZGVyKHBrdCksIHNpemVvZihzdHJ1Y3QgaXBoZHIpKTsKIAkJbXNnLT5pbV9tc2d0eXBlID0gSUdNUE1TR19XSE9MRVBLVDsKIAkJbXNnLT5pbV9tYnogPSAwOwogCQltc2ctPmltX3ZpZiA9IHJlZ192aWZfbnVtOwotCQlza2ItPm5oLmlwaC0+aWhsID0gc2l6ZW9mKHN0cnVjdCBpcGhkcikgPj4gMjsKLQkJc2tiLT5uaC5pcGgtPnRvdF9sZW4gPSBodG9ucyhudG9ocyhwa3QtPm5oLmlwaC0+dG90X2xlbikgKyBzaXplb2Yoc3RydWN0IGlwaGRyKSk7CisJCWlwX2hkcihza2IpLT5paGwgPSBzaXplb2Yoc3RydWN0IGlwaGRyKSA+PiAyOworCQlpcF9oZHIoc2tiKS0+dG90X2xlbiA9IGh0b25zKG50b2hzKGlwX2hkcihwa3QpLT50b3RfbGVuKSArCisJCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBpcGhkcikpOwogCX0gZWxzZQogI2VuZGlmCiAJewpAQCAtNTc3LDEwICs1ODIsMTEgQEAKIAkgKglDb3B5IHRoZSBJUCBoZWFkZXIKIAkgKi8KIAotCXNrYi0+bmguaXBoID0gKHN0cnVjdCBpcGhkciAqKXNrYl9wdXQoc2tiLCBpaGwpOwotCW1lbWNweShza2ItPmRhdGEscGt0LT5kYXRhLGlobCk7Ci0Jc2tiLT5uaC5pcGgtPnByb3RvY29sID0gMDsJCQkvKiBGbGFnIHRvIHRoZSBrZXJuZWwgdGhpcyBpcyBhIHJvdXRlIGFkZCAqLwotCW1zZyA9IChzdHJ1Y3QgaWdtcG1zZyopc2tiLT5uaC5pcGg7CisJc2tiLT5uZXR3b3JrX2hlYWRlciA9IHNrYi0+dGFpbDsKKwlza2JfcHV0KHNrYiwgaWhsKTsKKwlza2JfY29weV90b19saW5lYXJfZGF0YShza2IsIHBrdC0+ZGF0YSwgaWhsKTsKKwlpcF9oZHIoc2tiKS0+cHJvdG9jb2wgPSAwOwkJCS8qIEZsYWcgdG8gdGhlIGtlcm5lbCB0aGlzIGlzIGEgcm91dGUgYWRkICovCisJbXNnID0gKHN0cnVjdCBpZ21wbXNnICopc2tiX25ldHdvcmtfaGVhZGVyKHNrYik7CiAJbXNnLT5pbV92aWYgPSB2aWZpOwogCXNrYi0+ZHN0ID0gZHN0X2Nsb25lKHBrdC0+ZHN0KTsKIApAQCAtNTkyLDggKzU5OCw4IEBACiAJaWdtcC0+dHlwZQk9CiAJbXNnLT5pbV9tc2d0eXBlID0gYXNzZXJ0OwogCWlnbXAtPmNvZGUgCT0JMDsKLQlza2ItPm5oLmlwaC0+dG90X2xlbj1odG9ucyhza2ItPmxlbik7CQkJLyogRml4IHRoZSBsZW5ndGggKi8KLQlza2ItPmgucmF3ID0gc2tiLT5uaC5yYXc7CisJaXBfaGRyKHNrYiktPnRvdF9sZW4gPSBodG9ucyhza2ItPmxlbik7CQkJLyogRml4IHRoZSBsZW5ndGggKi8KKwlza2ItPnRyYW5zcG9ydF9oZWFkZXIgPSBza2ItPm5ldHdvcmtfaGVhZGVyOwogCX0KIAogCWlmIChtcm91dGVfc29ja2V0ID09IE5VTEwpIHsKQEAgLTYyMiwxMSArNjI4LDEyIEBACiB7CiAJaW50IGVycjsKIAlzdHJ1Y3QgbWZjX2NhY2hlICpjOworCWNvbnN0IHN0cnVjdCBpcGhkciAqaXBoID0gaXBfaGRyKHNrYik7CiAKIAlzcGluX2xvY2tfYmgoJm1mY191bnJlc19sb2NrKTsKIAlmb3IgKGM9bWZjX3VucmVzX3F1ZXVlOyBjOyBjPWMtPm5leHQpIHsKLQkJaWYgKGMtPm1mY19tY2FzdGdycCA9PSBza2ItPm5oLmlwaC0+ZGFkZHIgJiYKLQkJICAgIGMtPm1mY19vcmlnaW4gPT0gc2tiLT5uaC5pcGgtPnNhZGRyKQorCQlpZiAoYy0+bWZjX21jYXN0Z3JwID09IGlwaC0+ZGFkZHIgJiYKKwkJICAgIGMtPm1mY19vcmlnaW4gPT0gaXBoLT5zYWRkcikKIAkJCWJyZWFrOwogCX0KIApAQCAtNjQ2LDkgKzY1Myw5IEBACiAJCS8qCiAJCSAqCUZpbGwgaW4gdGhlIG5ldyBjYWNoZSBlbnRyeQogCQkgKi8KLQkJYy0+bWZjX3BhcmVudD0tMTsKLQkJYy0+bWZjX29yaWdpbj1za2ItPm5oLmlwaC0+c2FkZHI7Ci0JCWMtPm1mY19tY2FzdGdycD1za2ItPm5oLmlwaC0+ZGFkZHI7CisJCWMtPm1mY19wYXJlbnQJPSAtMTsKKwkJYy0+bWZjX29yaWdpbgk9IGlwaC0+c2FkZHI7CisJCWMtPm1mY19tY2FzdGdycAk9IGlwaC0+ZGFkZHI7CiAKIAkJLyoKIAkJICoJUmVmbGVjdCBmaXJzdCBxdWVyeSBhdCBtcm91dGVkLgpAQCAtNzM0LDcgKzc0MSw3IEBACiAJCXJldHVybiAwOwogCX0KIAotCWlmKCFNVUxUSUNBU1QobWZjLT5tZmNjX21jYXN0Z3JwLnNfYWRkcikpCisJaWYgKCFNVUxUSUNBU1QobWZjLT5tZmNjX21jYXN0Z3JwLnNfYWRkcikpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJYz1pcG1yX2NhY2hlX2FsbG9jKCk7CkBAIC03ODgsNyArNzk1LDcgQEAKIAkvKgogCSAqCVNodXQgZG93biBhbGwgYWN0aXZlIHZpZiBlbnRyaWVzCiAJICovCi0JZm9yKGk9MDsgaTxtYXh2aWY7IGkrKykgeworCWZvciAoaT0wOyBpPG1heHZpZjsgaSsrKSB7CiAJCWlmICghKHZpZl90YWJsZVtpXS5mbGFncyZWSUZGX1NUQVRJQykpCiAJCQl2aWZfZGVsZXRlKGkpOwogCX0KQEAgLTg1OCwxMTkgKzg2NSwxMTcgQEAKIAlzdHJ1Y3QgdmlmY3RsIHZpZjsKIAlzdHJ1Y3QgbWZjY3RsIG1mYzsKIAotCWlmKG9wdG5hbWUhPU1SVF9JTklUKQotCXsKLQkJaWYoc2shPW1yb3V0ZV9zb2NrZXQgJiYgIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJaWYgKG9wdG5hbWUgIT0gTVJUX0lOSVQpIHsKKwkJaWYgKHNrICE9IG1yb3V0ZV9zb2NrZXQgJiYgIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCiAJCQlyZXR1cm4gLUVBQ0NFUzsKIAl9CiAKLQlzd2l0Y2gob3B0bmFtZSkKLQl7Ci0JCWNhc2UgTVJUX0lOSVQ6Ci0JCQlpZiAoc2stPnNrX3R5cGUgIT0gU09DS19SQVcgfHwKLQkJCSAgICBpbmV0X3NrKHNrKS0+bnVtICE9IElQUFJPVE9fSUdNUCkKLQkJCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0JCQlpZihvcHRsZW4hPXNpemVvZihpbnQpKQotCQkJCXJldHVybiAtRU5PUFJPVE9PUFQ7CisJc3dpdGNoIChvcHRuYW1lKSB7CisJY2FzZSBNUlRfSU5JVDoKKwkJaWYgKHNrLT5za190eXBlICE9IFNPQ0tfUkFXIHx8CisJCSAgICBpbmV0X3NrKHNrKS0+bnVtICE9IElQUFJPVE9fSUdNUCkKKwkJCXJldHVybiAtRU9QTk9UU1VQUDsKKwkJaWYgKG9wdGxlbiE9c2l6ZW9mKGludCkpCisJCQlyZXR1cm4gLUVOT1BST1RPT1BUOwogCi0JCQlydG5sX2xvY2soKTsKLQkJCWlmIChtcm91dGVfc29ja2V0KSB7Ci0JCQkJcnRubF91bmxvY2soKTsKLQkJCQlyZXR1cm4gLUVBRERSSU5VU0U7Ci0JCQl9Ci0KLQkJCXJldCA9IGlwX3JhX2NvbnRyb2woc2ssIDEsIG1ydHNvY2tfZGVzdHJ1Y3QpOwotCQkJaWYgKHJldCA9PSAwKSB7Ci0JCQkJd3JpdGVfbG9ja19iaCgmbXJ0X2xvY2spOwotCQkJCW1yb3V0ZV9zb2NrZXQ9c2s7Ci0JCQkJd3JpdGVfdW5sb2NrX2JoKCZtcnRfbG9jayk7Ci0KLQkJCQlpcHY0X2RldmNvbmYubWNfZm9yd2FyZGluZysrOwotCQkJfQorCQlydG5sX2xvY2soKTsKKwkJaWYgKG1yb3V0ZV9zb2NrZXQpIHsKIAkJCXJ0bmxfdW5sb2NrKCk7Ci0JCQlyZXR1cm4gcmV0OwotCQljYXNlIE1SVF9ET05FOgotCQkJaWYgKHNrIT1tcm91dGVfc29ja2V0KQotCQkJCXJldHVybiAtRUFDQ0VTOwotCQkJcmV0dXJuIGlwX3JhX2NvbnRyb2woc2ssIDAsIE5VTEwpOwotCQljYXNlIE1SVF9BRERfVklGOgotCQljYXNlIE1SVF9ERUxfVklGOgotCQkJaWYob3B0bGVuIT1zaXplb2YodmlmKSkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCWlmIChjb3B5X2Zyb21fdXNlcigmdmlmLG9wdHZhbCxzaXplb2YodmlmKSkpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQlpZih2aWYudmlmY192aWZpID49IE1BWFZJRlMpCi0JCQkJcmV0dXJuIC1FTkZJTEU7Ci0JCQlydG5sX2xvY2soKTsKLQkJCWlmIChvcHRuYW1lPT1NUlRfQUREX1ZJRikgewotCQkJCXJldCA9IHZpZl9hZGQoJnZpZiwgc2s9PW1yb3V0ZV9zb2NrZXQpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXQgPSB2aWZfZGVsZXRlKHZpZi52aWZjX3ZpZmkpOwotCQkJfQotCQkJcnRubF91bmxvY2soKTsKLQkJCXJldHVybiByZXQ7CisJCQlyZXR1cm4gLUVBRERSSU5VU0U7CisJCX0KKworCQlyZXQgPSBpcF9yYV9jb250cm9sKHNrLCAxLCBtcnRzb2NrX2Rlc3RydWN0KTsKKwkJaWYgKHJldCA9PSAwKSB7CisJCQl3cml0ZV9sb2NrX2JoKCZtcnRfbG9jayk7CisJCQltcm91dGVfc29ja2V0PXNrOworCQkJd3JpdGVfdW5sb2NrX2JoKCZtcnRfbG9jayk7CisKKwkJCWlwdjRfZGV2Y29uZi5tY19mb3J3YXJkaW5nKys7CisJCX0KKwkJcnRubF91bmxvY2soKTsKKwkJcmV0dXJuIHJldDsKKwljYXNlIE1SVF9ET05FOgorCQlpZiAoc2shPW1yb3V0ZV9zb2NrZXQpCisJCQlyZXR1cm4gLUVBQ0NFUzsKKwkJcmV0dXJuIGlwX3JhX2NvbnRyb2woc2ssIDAsIE5VTEwpOworCWNhc2UgTVJUX0FERF9WSUY6CisJY2FzZSBNUlRfREVMX1ZJRjoKKwkJaWYgKG9wdGxlbiE9c2l6ZW9mKHZpZikpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZ2aWYsb3B0dmFsLHNpemVvZih2aWYpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAodmlmLnZpZmNfdmlmaSA+PSBNQVhWSUZTKQorCQkJcmV0dXJuIC1FTkZJTEU7CisJCXJ0bmxfbG9jaygpOworCQlpZiAob3B0bmFtZT09TVJUX0FERF9WSUYpIHsKKwkJCXJldCA9IHZpZl9hZGQoJnZpZiwgc2s9PW1yb3V0ZV9zb2NrZXQpOworCQl9IGVsc2UgeworCQkJcmV0ID0gdmlmX2RlbGV0ZSh2aWYudmlmY192aWZpKTsKKwkJfQorCQlydG5sX3VubG9jaygpOworCQlyZXR1cm4gcmV0OwogCiAJCS8qCiAJCSAqCU1hbmlwdWxhdGUgdGhlIGZvcndhcmRpbmcgY2FjaGVzLiBUaGVzZSBsaXZlCiAJCSAqCWluIGEgc29ydCBvZiBrZXJuZWwvdXNlciBzeW1iaW9zaXMuCiAJCSAqLwotCQljYXNlIE1SVF9BRERfTUZDOgotCQljYXNlIE1SVF9ERUxfTUZDOgotCQkJaWYob3B0bGVuIT1zaXplb2YobWZjKSkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCWlmIChjb3B5X2Zyb21fdXNlcigmbWZjLG9wdHZhbCwgc2l6ZW9mKG1mYykpKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJcnRubF9sb2NrKCk7Ci0JCQlpZiAob3B0bmFtZT09TVJUX0RFTF9NRkMpCi0JCQkJcmV0ID0gaXBtcl9tZmNfZGVsZXRlKCZtZmMpOwotCQkJZWxzZQotCQkJCXJldCA9IGlwbXJfbWZjX2FkZCgmbWZjLCBzaz09bXJvdXRlX3NvY2tldCk7Ci0JCQlydG5sX3VubG9jaygpOwotCQkJcmV0dXJuIHJldDsKKwljYXNlIE1SVF9BRERfTUZDOgorCWNhc2UgTVJUX0RFTF9NRkM6CisJCWlmIChvcHRsZW4hPXNpemVvZihtZmMpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmbWZjLG9wdHZhbCwgc2l6ZW9mKG1mYykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJ0bmxfbG9jaygpOworCQlpZiAob3B0bmFtZT09TVJUX0RFTF9NRkMpCisJCQlyZXQgPSBpcG1yX21mY19kZWxldGUoJm1mYyk7CisJCWVsc2UKKwkJCXJldCA9IGlwbXJfbWZjX2FkZCgmbWZjLCBzaz09bXJvdXRlX3NvY2tldCk7CisJCXJ0bmxfdW5sb2NrKCk7CisJCXJldHVybiByZXQ7CiAJCS8qCiAJCSAqCUNvbnRyb2wgUElNIGFzc2VydC4KIAkJICovCi0JCWNhc2UgTVJUX0FTU0VSVDoKLQkJewotCQkJaW50IHY7Ci0JCQlpZihnZXRfdXNlcih2LChpbnQgX191c2VyICopb3B0dmFsKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCW1yb3V0ZV9kb19hc3NlcnQ9KHYpPzE6MDsKLQkJCXJldHVybiAwOwotCQl9CisJY2FzZSBNUlRfQVNTRVJUOgorCXsKKwkJaW50IHY7CisJCWlmIChnZXRfdXNlcih2LChpbnQgX191c2VyICopb3B0dmFsKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQltcm91dGVfZG9fYXNzZXJ0PSh2KT8xOjA7CisJCXJldHVybiAwOworCX0KICNpZmRlZiBDT05GSUdfSVBfUElNU00KLQkJY2FzZSBNUlRfUElNOgotCQl7Ci0JCQlpbnQgdiwgcmV0OwotCQkJaWYoZ2V0X3VzZXIodiwoaW50IF9fdXNlciAqKW9wdHZhbCkpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQl2ID0gKHYpPzE6MDsKLQkJCXJ0bmxfbG9jaygpOwotCQkJcmV0ID0gMDsKLQkJCWlmICh2ICE9IG1yb3V0ZV9kb19waW0pIHsKLQkJCQltcm91dGVfZG9fcGltID0gdjsKLQkJCQltcm91dGVfZG9fYXNzZXJ0ID0gdjsKKwljYXNlIE1SVF9QSU06CisJeworCQlpbnQgdiwgcmV0OworCQlpZiAoZ2V0X3VzZXIodiwoaW50IF9fdXNlciAqKW9wdHZhbCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJdiA9ICh2KT8xOjA7CisJCXJ0bmxfbG9jaygpOworCQlyZXQgPSAwOworCQlpZiAodiAhPSBtcm91dGVfZG9fcGltKSB7CisJCQltcm91dGVfZG9fcGltID0gdjsKKwkJCW1yb3V0ZV9kb19hc3NlcnQgPSB2OwogI2lmZGVmIENPTkZJR19JUF9QSU1TTV9WMgotCQkJCWlmIChtcm91dGVfZG9fcGltKQotCQkJCQlyZXQgPSBpbmV0X2FkZF9wcm90b2NvbCgmcGltX3Byb3RvY29sLAotCQkJCQkJCQlJUFBST1RPX1BJTSk7Ci0JCQkJZWxzZQotCQkJCQlyZXQgPSBpbmV0X2RlbF9wcm90b2NvbCgmcGltX3Byb3RvY29sLAotCQkJCQkJCQlJUFBST1RPX1BJTSk7Ci0JCQkJaWYgKHJldCA8IDApCi0JCQkJCXJldCA9IC1FQUdBSU47CisJCQlpZiAobXJvdXRlX2RvX3BpbSkKKwkJCQlyZXQgPSBpbmV0X2FkZF9wcm90b2NvbCgmcGltX3Byb3RvY29sLAorCQkJCQkJCUlQUFJPVE9fUElNKTsKKwkJCWVsc2UKKwkJCQlyZXQgPSBpbmV0X2RlbF9wcm90b2NvbCgmcGltX3Byb3RvY29sLAorCQkJCQkJCUlQUFJPVE9fUElNKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCXJldCA9IC1FQUdBSU47CiAjZW5kaWYKLQkJCX0KLQkJCXJ0bmxfdW5sb2NrKCk7Ci0JCQlyZXR1cm4gcmV0OwogCQl9CisJCXJ0bmxfdW5sb2NrKCk7CisJCXJldHVybiByZXQ7CisJfQogI2VuZGlmCi0JCS8qCi0JCSAqCVNwdXJpb3VzIGNvbW1hbmQsIG9yIE1SVF9WRVJTSU9OIHdoaWNoIHlvdSBjYW5ub3QKLQkJICoJc2V0LgotCQkgKi8KLQkJZGVmYXVsdDoKLQkJCXJldHVybiAtRU5PUFJPVE9PUFQ7CisJLyoKKwkgKglTcHVyaW91cyBjb21tYW5kLCBvciBNUlRfVkVSU0lPTiB3aGljaCB5b3UgY2Fubm90CisJICoJc2V0LgorCSAqLworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PUFJPVE9PUFQ7CiAJfQogfQogCkBAIC05ODMsNyArOTg4LDcgQEAKIAlpbnQgb2xyOwogCWludCB2YWw7CiAKLQlpZihvcHRuYW1lIT1NUlRfVkVSU0lPTiAmJgorCWlmIChvcHRuYW1lIT1NUlRfVkVSU0lPTiAmJgogI2lmZGVmIENPTkZJR19JUF9QSU1TTQogCSAgIG9wdG5hbWUhPU1SVF9QSU0gJiYKICNlbmRpZgpAQCAtOTk3LDE3ICsxMDAyLDE3IEBACiAJaWYgKG9sciA8IDApCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYocHV0X3VzZXIob2xyLG9wdGxlbikpCisJaWYgKHB1dF91c2VyKG9scixvcHRsZW4pKQogCQlyZXR1cm4gLUVGQVVMVDsKLQlpZihvcHRuYW1lPT1NUlRfVkVSU0lPTikKKwlpZiAob3B0bmFtZT09TVJUX1ZFUlNJT04pCiAJCXZhbD0weDAzMDU7CiAjaWZkZWYgQ09ORklHX0lQX1BJTVNNCi0JZWxzZSBpZihvcHRuYW1lPT1NUlRfUElNKQorCWVsc2UgaWYgKG9wdG5hbWU9PU1SVF9QSU0pCiAJCXZhbD1tcm91dGVfZG9fcGltOwogI2VuZGlmCiAJZWxzZQogCQl2YWw9bXJvdXRlX2RvX2Fzc2VydDsKLQlpZihjb3B5X3RvX3VzZXIob3B0dmFsLCZ2YWwsb2xyKSkKKwlpZiAoY29weV90b191c2VyKG9wdHZhbCwmdmFsLG9scikpCiAJCXJldHVybiAtRUZBVUxUOwogCXJldHVybiAwOwogfQpAQCAtMTAyMyw0OCArMTAyOCw0NyBAQAogCXN0cnVjdCB2aWZfZGV2aWNlICp2aWY7CiAJc3RydWN0IG1mY19jYWNoZSAqYzsKIAotCXN3aXRjaChjbWQpCi0JewotCQljYXNlIFNJT0NHRVRWSUZDTlQ6Ci0JCQlpZiAoY29weV9mcm9tX3VzZXIoJnZyLGFyZyxzaXplb2YodnIpKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCWlmKHZyLnZpZmk+PW1heHZpZikKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCXJlYWRfbG9jaygmbXJ0X2xvY2spOwotCQkJdmlmPSZ2aWZfdGFibGVbdnIudmlmaV07Ci0JCQlpZihWSUZfRVhJU1RTKHZyLnZpZmkpKQl7Ci0JCQkJdnIuaWNvdW50PXZpZi0+cGt0X2luOwotCQkJCXZyLm9jb3VudD12aWYtPnBrdF9vdXQ7Ci0JCQkJdnIuaWJ5dGVzPXZpZi0+Ynl0ZXNfaW47Ci0JCQkJdnIub2J5dGVzPXZpZi0+Ynl0ZXNfb3V0OwotCQkJCXJlYWRfdW5sb2NrKCZtcnRfbG9jayk7Ci0KLQkJCQlpZiAoY29weV90b191c2VyKGFyZywmdnIsc2l6ZW9mKHZyKSkpCi0JCQkJCXJldHVybiAtRUZBVUxUOwotCQkJCXJldHVybiAwOwotCQkJfQorCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTSU9DR0VUVklGQ05UOgorCQlpZiAoY29weV9mcm9tX3VzZXIoJnZyLGFyZyxzaXplb2YodnIpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAodnIudmlmaT49bWF4dmlmKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXJlYWRfbG9jaygmbXJ0X2xvY2spOworCQl2aWY9JnZpZl90YWJsZVt2ci52aWZpXTsKKwkJaWYgKFZJRl9FWElTVFModnIudmlmaSkpCXsKKwkJCXZyLmljb3VudD12aWYtPnBrdF9pbjsKKwkJCXZyLm9jb3VudD12aWYtPnBrdF9vdXQ7CisJCQl2ci5pYnl0ZXM9dmlmLT5ieXRlc19pbjsKKwkJCXZyLm9ieXRlcz12aWYtPmJ5dGVzX291dDsKIAkJCXJlYWRfdW5sb2NrKCZtcnRfbG9jayk7Ci0JCQlyZXR1cm4gLUVBRERSTk9UQVZBSUw7Ci0JCWNhc2UgU0lPQ0dFVFNHQ05UOgotCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZzcixhcmcsc2l6ZW9mKHNyKSkpCisKKwkJCWlmIChjb3B5X3RvX3VzZXIoYXJnLCZ2cixzaXplb2YodnIpKSkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXJldHVybiAwOworCQl9CisJCXJlYWRfdW5sb2NrKCZtcnRfbG9jayk7CisJCXJldHVybiAtRUFERFJOT1RBVkFJTDsKKwljYXNlIFNJT0NHRVRTR0NOVDoKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZzcixhcmcsc2l6ZW9mKHNyKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKIAotCQkJcmVhZF9sb2NrKCZtcnRfbG9jayk7Ci0JCQljID0gaXBtcl9jYWNoZV9maW5kKHNyLnNyYy5zX2FkZHIsIHNyLmdycC5zX2FkZHIpOwotCQkJaWYgKGMpIHsKLQkJCQlzci5wa3RjbnQgPSBjLT5tZmNfdW4ucmVzLnBrdDsKLQkJCQlzci5ieXRlY250ID0gYy0+bWZjX3VuLnJlcy5ieXRlczsKLQkJCQlzci53cm9uZ19pZiA9IGMtPm1mY191bi5yZXMud3JvbmdfaWY7Ci0JCQkJcmVhZF91bmxvY2soJm1ydF9sb2NrKTsKLQotCQkJCWlmIChjb3B5X3RvX3VzZXIoYXJnLCZzcixzaXplb2Yoc3IpKSkKLQkJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9CisJCXJlYWRfbG9jaygmbXJ0X2xvY2spOworCQljID0gaXBtcl9jYWNoZV9maW5kKHNyLnNyYy5zX2FkZHIsIHNyLmdycC5zX2FkZHIpOworCQlpZiAoYykgeworCQkJc3IucGt0Y250ID0gYy0+bWZjX3VuLnJlcy5wa3Q7CisJCQlzci5ieXRlY250ID0gYy0+bWZjX3VuLnJlcy5ieXRlczsKKwkJCXNyLndyb25nX2lmID0gYy0+bWZjX3VuLnJlcy53cm9uZ19pZjsKIAkJCXJlYWRfdW5sb2NrKCZtcnRfbG9jayk7Ci0JCQlyZXR1cm4gLUVBRERSTk9UQVZBSUw7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCisJCQlpZiAoY29weV90b191c2VyKGFyZywmc3Isc2l6ZW9mKHNyKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlyZWFkX3VubG9jaygmbXJ0X2xvY2spOworCQlyZXR1cm4gLUVBRERSTk9UQVZBSUw7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9JT0NUTENNRDsKIAl9CiB9CiAKQEAgLTEwNzYsNyArMTA4MCw3IEBACiAJaWYgKGV2ZW50ICE9IE5FVERFVl9VTlJFR0lTVEVSKQogCQlyZXR1cm4gTk9USUZZX0RPTkU7CiAJdj0mdmlmX3RhYmxlWzBdOwotCWZvcihjdD0wO2N0PG1heHZpZjtjdCsrLHYrKykgeworCWZvciAoY3Q9MDtjdDxtYXh2aWY7Y3QrKyx2KyspIHsKIAkJaWYgKHYtPmRldj09cHRyKQogCQkJdmlmX2RlbGV0ZShjdCk7CiAJfQpAQCAtMTA5NiwxMSArMTEwMCwxNyBAQAogCiBzdGF0aWMgdm9pZCBpcF9lbmNhcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBfX2JlMzIgc2FkZHIsIF9fYmUzMiBkYWRkcikKIHsKLQlzdHJ1Y3QgaXBoZHIgKmlwaCA9IChzdHJ1Y3QgaXBoZHIgKilza2JfcHVzaChza2Isc2l6ZW9mKHN0cnVjdCBpcGhkcikpOworCXN0cnVjdCBpcGhkciAqaXBoOworCXN0cnVjdCBpcGhkciAqb2xkX2lwaCA9IGlwX2hkcihza2IpOworCisJc2tiX3B1c2goc2tiLCBzaXplb2Yoc3RydWN0IGlwaGRyKSk7CisJc2tiLT50cmFuc3BvcnRfaGVhZGVyID0gc2tiLT5uZXR3b3JrX2hlYWRlcjsKKwlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiKTsKKwlpcGggPSBpcF9oZHIoc2tiKTsKIAogCWlwaC0+dmVyc2lvbgk9IAk0OwotCWlwaC0+dG9zCT0Jc2tiLT5uaC5pcGgtPnRvczsKLQlpcGgtPnR0bAk9CXNrYi0+bmguaXBoLT50dGw7CisJaXBoLT50b3MJPQlvbGRfaXBoLT50b3M7CisJaXBoLT50dGwJPQlvbGRfaXBoLT50dGw7CiAJaXBoLT5mcmFnX29mZgk9CTA7CiAJaXBoLT5kYWRkcgk9CWRhZGRyOwogCWlwaC0+c2FkZHIJPQlzYWRkcjsKQEAgLTExMTAsOCArMTEyMCw2IEBACiAJaXBfc2VsZWN0X2lkZW50KGlwaCwgc2tiLT5kc3QsIE5VTEwpOwogCWlwX3NlbmRfY2hlY2soaXBoKTsKIAotCXNrYi0+aC5pcGlwaCA9IHNrYi0+bmguaXBoOwotCXNrYi0+bmguaXBoID0gaXBoOwogCW1lbXNldCgmKElQQ0Ioc2tiKS0+b3B0KSwgMCwgc2l6ZW9mKElQQ0Ioc2tiKS0+b3B0KSk7CiAJbmZfcmVzZXQoc2tiKTsKIH0KQEAgLTExMzQsNyArMTE0Miw3IEBACiAKIHN0YXRpYyB2b2lkIGlwbXJfcXVldWVfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbWZjX2NhY2hlICpjLCBpbnQgdmlmaSkKIHsKLQlzdHJ1Y3QgaXBoZHIgKmlwaCA9IHNrYi0+bmguaXBoOworCWNvbnN0IHN0cnVjdCBpcGhkciAqaXBoID0gaXBfaGRyKHNrYik7CiAJc3RydWN0IHZpZl9kZXZpY2UgKnZpZiA9ICZ2aWZfdGFibGVbdmlmaV07CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIAlzdHJ1Y3QgcnRhYmxlICpydDsKQEAgLTEyMDAsOCArMTIwOCw3IEBACiAKIAlkc3RfcmVsZWFzZShza2ItPmRzdCk7CiAJc2tiLT5kc3QgPSAmcnQtPnUuZHN0OwotCWlwaCA9IHNrYi0+bmguaXBoOwotCWlwX2RlY3JlYXNlX3R0bChpcGgpOworCWlwX2RlY3JlYXNlX3R0bChpcF9oZHIoc2tiKSk7CiAKIAkvKiBGSVhNRTogZm9yd2FyZCBhbmQgb3V0cHV0IGZpcmV3YWxscyB1c2VkIHRvIGJlIGNhbGxlZCBoZXJlLgogCSAqIFdoYXQgZG8gd2UgZG8gd2l0aCBuZXRmaWx0ZXI/IC0tIFJSICovCkBAIC0xMzAxLDcgKzEzMDgsNyBAQAogCSAqCUZvcndhcmQgdGhlIGZyYW1lCiAJICovCiAJZm9yIChjdCA9IGNhY2hlLT5tZmNfdW4ucmVzLm1heHZpZi0xOyBjdCA+PSBjYWNoZS0+bWZjX3VuLnJlcy5taW52aWY7IGN0LS0pIHsKLQkJaWYgKHNrYi0+bmguaXBoLT50dGwgPiBjYWNoZS0+bWZjX3VuLnJlcy50dGxzW2N0XSkgeworCQlpZiAoaXBfaGRyKHNrYiktPnR0bCA+IGNhY2hlLT5tZmNfdW4ucmVzLnR0bHNbY3RdKSB7CiAJCQlpZiAocHNlbmQgIT0gLTEpIHsKIAkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiMiA9IHNrYl9jbG9uZShza2IsIEdGUF9BVE9NSUMpOwogCQkJCWlmIChza2IyKQpAQCAtMTM0Nyw3ICsxMzU0LDcgQEAKIAkJICAgIGlmIChJUENCKHNrYiktPm9wdC5yb3V0ZXJfYWxlcnQpIHsKIAkJCSAgICBpZiAoaXBfY2FsbF9yYV9jaGFpbihza2IpKQogCQkJCSAgICByZXR1cm4gMDsKLQkJICAgIH0gZWxzZSBpZiAoc2tiLT5uaC5pcGgtPnByb3RvY29sID09IElQUFJPVE9fSUdNUCl7CisJCSAgICB9IGVsc2UgaWYgKGlwX2hkcihza2IpLT5wcm90b2NvbCA9PSBJUFBST1RPX0lHTVApewogCQkJICAgIC8qIElHTVB2MSAoYW5kIGJyb2tlbiBJR01QdjIgaW1wbGVtZW50YXRpb25zIHNvcnQgb2YKIAkJCSAgICAgICBDaXNjbyBJT1MgPD0gMTEuMig4KSkgZG8gbm90IHB1dCByb3V0ZXIgYWxlcnQKIAkJCSAgICAgICBvcHRpb24gdG8gSUdNUCBwYWNrZXRzIGRlc3RpbmVkIHRvIHJvdXRhYmxlCkBAIC0xMzY2LDcgKzEzNzMsNyBAQAogCX0KIAogCXJlYWRfbG9jaygmbXJ0X2xvY2spOwotCWNhY2hlID0gaXBtcl9jYWNoZV9maW5kKHNrYi0+bmguaXBoLT5zYWRkciwgc2tiLT5uaC5pcGgtPmRhZGRyKTsKKwljYWNoZSA9IGlwbXJfY2FjaGVfZmluZChpcF9oZHIoc2tiKS0+c2FkZHIsIGlwX2hkcihza2IpLT5kYWRkcik7CiAKIAkvKgogCSAqCU5vIHVzYWJsZSBjYWNoZSBlbnRyeQpAQCAtMTQyNiwxNCArMTQzMywxNSBAQAogCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZigqcGltKSArIHNpemVvZigqZW5jYXApKSkKIAkJZ290byBkcm9wOwogCi0JcGltID0gKHN0cnVjdCBpZ21waGRyKilza2ItPmgucmF3OworCXBpbSA9IGlnbXBfaGRyKHNrYik7CiAKIAlpZiAoIW1yb3V0ZV9kb19waW0gfHwKIAkgICAgc2tiLT5sZW4gPCBzaXplb2YoKnBpbSkgKyBzaXplb2YoKmVuY2FwKSB8fAogCSAgICBwaW0tPmdyb3VwICE9IFBJTV9WMV9WRVJTSU9OIHx8IHBpbS0+Y29kZSAhPSBQSU1fVjFfUkVHSVNURVIpCiAJCWdvdG8gZHJvcDsKIAotCWVuY2FwID0gKHN0cnVjdCBpcGhkciopKHNrYi0+aC5yYXcgKyBzaXplb2Yoc3RydWN0IGlnbXBoZHIpKTsKKwllbmNhcCA9IChzdHJ1Y3QgaXBoZHIgKikoc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKSArCisJCQkJIHNpemVvZihzdHJ1Y3QgaWdtcGhkcikpOwogCS8qCiAJICAgQ2hlY2sgdGhhdDoKIAkgICBhLiBwYWNrZXQgaXMgcmVhbGx5IGRlc3RpbnRlZCB0byBhIG11bHRpY2FzdCBncm91cApAQCAtMTQ1NSw5ICsxNDYzLDkgQEAKIAlpZiAocmVnX2RldiA9PSBOVUxMKQogCQlnb3RvIGRyb3A7CiAKLQlza2ItPm1hYy5yYXcgPSBza2ItPm5oLnJhdzsKKwlza2ItPm1hY19oZWFkZXIgPSBza2ItPm5ldHdvcmtfaGVhZGVyOwogCXNrYl9wdWxsKHNrYiwgKHU4KillbmNhcCAtIHNrYi0+ZGF0YSk7Ci0Jc2tiLT5uaC5pcGggPSAoc3RydWN0IGlwaGRyICopc2tiLT5kYXRhOworCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOwogCXNrYi0+ZGV2ID0gcmVnX2RldjsKIAlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfSVApOwogCXNrYi0+aXBfc3VtbWVkID0gMDsKQEAgLTE0ODYsNyArMTQ5NCw3IEBACiAJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgc2l6ZW9mKCpwaW0pICsgc2l6ZW9mKCplbmNhcCkpKQogCQlnb3RvIGRyb3A7CiAKLQlwaW0gPSAoc3RydWN0IHBpbXJlZ2hkciopc2tiLT5oLnJhdzsKKwlwaW0gPSAoc3RydWN0IHBpbXJlZ2hkciAqKXNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYik7CiAJaWYgKHBpbS0+dHlwZSAhPSAoKFBJTV9WRVJTSU9OPDw0KXwoUElNX1JFR0lTVEVSKSkgfHwKIAkgICAgKHBpbS0+ZmxhZ3MmUElNX05VTExfUkVHSVNURVIpIHx8CiAJICAgIChpcF9jb21wdXRlX2NzdW0oKHZvaWQgKilwaW0sIHNpemVvZigqcGltKSkgIT0gMCAmJgpAQCAtMTQ5NCw3ICsxNTAyLDggQEAKIAkJZ290byBkcm9wOwogCiAJLyogY2hlY2sgaWYgdGhlIGlubmVyIHBhY2tldCBpcyBkZXN0aW5lZCB0byBtY2FzdCBncm91cCAqLwotCWVuY2FwID0gKHN0cnVjdCBpcGhkciopKHNrYi0+aC5yYXcgKyBzaXplb2Yoc3RydWN0IHBpbXJlZ2hkcikpOworCWVuY2FwID0gKHN0cnVjdCBpcGhkciAqKShza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpICsKKwkJCQkgc2l6ZW9mKHN0cnVjdCBwaW1yZWdoZHIpKTsKIAlpZiAoIU1VTFRJQ0FTVChlbmNhcC0+ZGFkZHIpIHx8CiAJICAgIGVuY2FwLT50b3RfbGVuID09IDAgfHwKIAkgICAgbnRvaHMoZW5jYXAtPnRvdF9sZW4pICsgc2l6ZW9mKCpwaW0pID4gc2tiLT5sZW4pCkBAIC0xNTEwLDkgKzE1MTksOSBAQAogCWlmIChyZWdfZGV2ID09IE5VTEwpCiAJCWdvdG8gZHJvcDsKIAotCXNrYi0+bWFjLnJhdyA9IHNrYi0+bmgucmF3OworCXNrYi0+bWFjX2hlYWRlciA9IHNrYi0+bmV0d29ya19oZWFkZXI7CiAJc2tiX3B1bGwoc2tiLCAodTgqKWVuY2FwIC0gc2tiLT5kYXRhKTsKLQlza2ItPm5oLmlwaCA9IChzdHJ1Y3QgaXBoZHIgKilza2ItPmRhdGE7CisJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CiAJc2tiLT5kZXYgPSByZWdfZGV2OwogCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUCk7CiAJc2tiLT5pcF9zdW1tZWQgPSAwOwpAQCAtMTUzNyw3ICsxNTQ2LDcgQEAKIAlpbnQgY3Q7CiAJc3RydWN0IHJ0bmV4dGhvcCAqbmhwOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSB2aWZfdGFibGVbYy0+bWZjX3BhcmVudF0uZGV2OwotCXU4ICpiID0gc2tiLT50YWlsOworCXU4ICpiID0gc2tiX3RhaWxfcG9pbnRlcihza2IpOwogCXN0cnVjdCBydGF0dHIgKm1wX2hlYWQ7CiAKIAlpZiAoZGV2KQpAQCAtMTU1NywxMiArMTU2NiwxMiBAQAogCQl9CiAJfQogCW1wX2hlYWQtPnJ0YV90eXBlID0gUlRBX01VTFRJUEFUSDsKLQltcF9oZWFkLT5ydGFfbGVuID0gc2tiLT50YWlsIC0gKHU4KiltcF9oZWFkOworCW1wX2hlYWQtPnJ0YV9sZW4gPSBza2JfdGFpbF9wb2ludGVyKHNrYikgLSAodTggKiltcF9oZWFkOwogCXJ0bS0+cnRtX3R5cGUgPSBSVE5fTVVMVElDQVNUOwogCXJldHVybiAxOwogCiBydGF0dHJfZmFpbHVyZToKLQlza2JfdHJpbShza2IsIGIgLSBza2ItPmRhdGEpOworCW5sbXNnX3RyaW0oc2tiLCBiKTsKIAlyZXR1cm4gLUVNU0dTSVpFOwogfQogCkBAIC0xNTc3LDYgKzE1ODYsNyBAQAogCiAJaWYgKGNhY2hlPT1OVUxMKSB7CiAJCXN0cnVjdCBza19idWZmICpza2IyOworCQlzdHJ1Y3QgaXBoZHIgKmlwaDsKIAkJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIAkJaW50IHZpZjsKIApAQCAtMTU5NiwxMSArMTYwNiwxMyBAQAogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KIAotCQlza2IyLT5uaC5yYXcgPSBza2JfcHVzaChza2IyLCBzaXplb2Yoc3RydWN0IGlwaGRyKSk7Ci0JCXNrYjItPm5oLmlwaC0+aWhsID0gc2l6ZW9mKHN0cnVjdCBpcGhkcik+PjI7Ci0JCXNrYjItPm5oLmlwaC0+c2FkZHIgPSBydC0+cnRfc3JjOwotCQlza2IyLT5uaC5pcGgtPmRhZGRyID0gcnQtPnJ0X2RzdDsKLQkJc2tiMi0+bmguaXBoLT52ZXJzaW9uID0gMDsKKwkJc2tiX3B1c2goc2tiMiwgc2l6ZW9mKHN0cnVjdCBpcGhkcikpOworCQlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiMik7CisJCWlwaCA9IGlwX2hkcihza2IyKTsKKwkJaXBoLT5paGwgPSBzaXplb2Yoc3RydWN0IGlwaGRyKSA+PiAyOworCQlpcGgtPnNhZGRyID0gcnQtPnJ0X3NyYzsKKwkJaXBoLT5kYWRkciA9IHJ0LT5ydF9kc3Q7CisJCWlwaC0+dmVyc2lvbiA9IDA7CiAJCWVyciA9IGlwbXJfY2FjaGVfdW5yZXNvbHZlZCh2aWYsIHNrYjIpOwogCQlyZWFkX3VubG9jaygmbXJ0X2xvY2spOwogCQlyZXR1cm4gZXJyOwpAQCAtMTYyNSw3ICsxNjM3LDcgQEAKIAkJCQkJICAgbG9mZl90IHBvcykKIHsKIAlmb3IgKGl0ZXItPmN0ID0gMDsgaXRlci0+Y3QgPCBtYXh2aWY7ICsraXRlci0+Y3QpIHsKLQkJaWYoIVZJRl9FWElTVFMoaXRlci0+Y3QpKQorCQlpZiAoIVZJRl9FWElTVFMoaXRlci0+Y3QpKQogCQkJY29udGludWU7CiAJCWlmIChwb3MtLSA9PSAwKQogCQkJcmV0dXJuICZ2aWZfdGFibGVbaXRlci0+Y3RdOwpAQCAtMTY0OSw3ICsxNjYxLDcgQEAKIAkJcmV0dXJuIGlwbXJfdmlmX3NlcV9pZHgoaXRlciwgMCk7CiAKIAl3aGlsZSAoKytpdGVyLT5jdCA8IG1heHZpZikgewotCQlpZighVklGX0VYSVNUUyhpdGVyLT5jdCkpCisJCWlmICghVklGX0VYSVNUUyhpdGVyLT5jdCkpCiAJCQljb250aW51ZTsKIAkJcmV0dXJuICZ2aWZfdGFibGVbaXRlci0+Y3RdOwogCX0KQEAgLTE2ODAsNyArMTY5Miw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgaXBtcl92aWZfc2VxX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgaXBtcl92aWZfc2VxX29wcyA9IHsKIAkuc3RhcnQgPSBpcG1yX3ZpZl9zZXFfc3RhcnQsCiAJLm5leHQgID0gaXBtcl92aWZfc2VxX25leHQsCiAJLnN0b3AgID0gaXBtcl92aWZfc2VxX3N0b3AsCkBAIC0xNzMyLDE0ICsxNzQ0LDE0IEBACiAJaXQtPmNhY2hlID0gbWZjX2NhY2hlX2FycmF5OwogCXJlYWRfbG9jaygmbXJ0X2xvY2spOwogCWZvciAoaXQtPmN0ID0gMDsgaXQtPmN0IDwgTUZDX0xJTkVTOyBpdC0+Y3QrKykKLQkJZm9yKG1mYyA9IG1mY19jYWNoZV9hcnJheVtpdC0+Y3RdOyBtZmM7IG1mYyA9IG1mYy0+bmV4dCkKKwkJZm9yIChtZmMgPSBtZmNfY2FjaGVfYXJyYXlbaXQtPmN0XTsgbWZjOyBtZmMgPSBtZmMtPm5leHQpCiAJCQlpZiAocG9zLS0gPT0gMCkKIAkJCQlyZXR1cm4gbWZjOwogCXJlYWRfdW5sb2NrKCZtcnRfbG9jayk7CiAKIAlpdC0+Y2FjaGUgPSAmbWZjX3VucmVzX3F1ZXVlOwogCXNwaW5fbG9ja19iaCgmbWZjX3VucmVzX2xvY2spOwotCWZvcihtZmMgPSBtZmNfdW5yZXNfcXVldWU7IG1mYzsgbWZjID0gbWZjLT5uZXh0KQorCWZvciAobWZjID0gbWZjX3VucmVzX3F1ZXVlOyBtZmM7IG1mYyA9IG1mYy0+bmV4dCkKIAkJaWYgKHBvcy0tID09IDApCiAJCQlyZXR1cm4gbWZjOwogCXNwaW5fdW5sb2NrX2JoKCZtZmNfdW5yZXNfbG9jayk7CkBAIC0xODI5LDkgKzE4NDEsOSBAQAogCQkJICAgbWZjLT5tZmNfdW4ucmVzLndyb25nX2lmKTsKIAogCQlpZiAoaXQtPmNhY2hlICE9ICZtZmNfdW5yZXNfcXVldWUpIHsKLQkJCWZvcihuID0gbWZjLT5tZmNfdW4ucmVzLm1pbnZpZjsKLQkJCSAgICBuIDwgbWZjLT5tZmNfdW4ucmVzLm1heHZpZjsgbisrICkgewotCQkJCWlmKFZJRl9FWElTVFMobikKKwkJCWZvciAobiA9IG1mYy0+bWZjX3VuLnJlcy5taW52aWY7CisJCQkgICAgIG4gPCBtZmMtPm1mY191bi5yZXMubWF4dmlmOyBuKysgKSB7CisJCQkJaWYgKFZJRl9FWElTVFMobikKIAkJCQkgICAmJiBtZmMtPm1mY191bi5yZXMudHRsc1tuXSA8IDI1NSkKIAkJCQlzZXFfcHJpbnRmKHNlcSwKIAkJCQkJICAgIiAlMmQ6JS0zZCIsCkBAIC0xODQzLDcgKzE4NTUsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIGlwbXJfbWZjX3NlcV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNlcV9vcGVyYXRpb25zIGlwbXJfbWZjX3NlcV9vcHMgPSB7CiAJLnN0YXJ0ID0gaXBtcl9tZmNfc2VxX3N0YXJ0LAogCS5uZXh0ICA9IGlwbXJfbWZjX3NlcV9uZXh0LAogCS5zdG9wICA9IGlwbXJfbWZjX3NlcV9zdG9wLApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXB2cy9pcF92c19hcHAuYyBiL25ldC9pcHY0L2lwdnMvaXBfdnNfYXBwLmMKaW5kZXggMjJlMTA0Yy4uMTVhZDVkZCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaXB2cy9pcF92c19hcHAuYworKysgYi9uZXQvaXB2NC9pcHZzL2lwX3ZzX2FwcC5jCkBAIC0zMzEsMTQgKzMzMSwxNCBAQAogCQkJCSAgc3RydWN0IGlwX3ZzX2FwcCAqYXBwKQogewogCWludCBkaWZmOwotCXVuc2lnbmVkIGludCB0Y3Bfb2Zmc2V0ID0gKCpwc2tiKS0+bmguaXBoLT5paGwqNDsKKwljb25zdCB1bnNpZ25lZCBpbnQgdGNwX29mZnNldCA9IGlwX2hkcmxlbigqcHNrYik7CiAJc3RydWN0IHRjcGhkciAqdGg7CiAJX191MzIgc2VxOwogCiAJaWYgKCFpcF92c19tYWtlX3NrYl93cml0YWJsZShwc2tiLCB0Y3Bfb2Zmc2V0ICsgc2l6ZW9mKCp0aCkpKQogCQlyZXR1cm4gMDsKIAotCXRoID0gKHN0cnVjdCB0Y3BoZHIgKikoKCpwc2tiKS0+bmgucmF3ICsgdGNwX29mZnNldCk7CisJdGggPSAoc3RydWN0IHRjcGhkciAqKShza2JfbmV0d29ya19oZWFkZXIoKnBza2IpICsgdGNwX29mZnNldCk7CiAKIAkvKgogCSAqCVJlbWVtYmVyIHNlcSBudW1iZXIgaW4gY2FzZSB0aGlzIHBrdCBnZXRzIHJlc2l6ZWQKQEAgLTQwNiwxNCArNDA2LDE0IEBACiAJCQkJIHN0cnVjdCBpcF92c19hcHAgKmFwcCkKIHsKIAlpbnQgZGlmZjsKLQl1bnNpZ25lZCBpbnQgdGNwX29mZnNldCA9ICgqcHNrYiktPm5oLmlwaC0+aWhsKjQ7CisJY29uc3QgdW5zaWduZWQgaW50IHRjcF9vZmZzZXQgPSBpcF9oZHJsZW4oKnBza2IpOwogCXN0cnVjdCB0Y3BoZHIgKnRoOwogCV9fdTMyIHNlcTsKIAogCWlmICghaXBfdnNfbWFrZV9za2Jfd3JpdGFibGUocHNrYiwgdGNwX29mZnNldCArIHNpemVvZigqdGgpKSkKIAkJcmV0dXJuIDA7CiAKLQl0aCA9IChzdHJ1Y3QgdGNwaGRyICopKCgqcHNrYiktPm5oLnJhdyArIHRjcF9vZmZzZXQpOworCXRoID0gKHN0cnVjdCB0Y3BoZHIgKikoc2tiX25ldHdvcmtfaGVhZGVyKCpwc2tiKSArIHRjcF9vZmZzZXQpOwogCiAJLyoKIAkgKglSZW1lbWJlciBzZXEgbnVtYmVyIGluIGNhc2UgdGhpcyBwa3QgZ2V0cyByZXNpemVkCkBAIC01NzcsNyArNTc3LDYgQEAKIGludCBpcF92c19za2JfcmVwbGFjZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBnZnBfdCBwcmksCiAJCSAgICAgIGNoYXIgKm9fYnVmLCBpbnQgb19sZW4sIGNoYXIgKm5fYnVmLCBpbnQgbl9sZW4pCiB7Ci0Jc3RydWN0IGlwaGRyICppcGg7CiAJaW50IGRpZmY7CiAJaW50IG9fb2Zmc2V0OwogCWludCBvX2xlZnQ7CkBAIC02MDMsMTIgKzYwMiwxMSBAQAogCQlza2JfcHV0KHNrYiwgZGlmZik7CiAJCW1lbW1vdmUoc2tiLT5kYXRhICsgb19vZmZzZXQgKyBuX2xlbiwKIAkJCXNrYi0+ZGF0YSArIG9fb2Zmc2V0ICsgb19sZW4sIG9fbGVmdCk7Ci0JCW1lbWNweShza2ItPmRhdGEgKyBvX29mZnNldCwgbl9idWYsIG5fbGVuKTsKKwkJc2tiX2NvcHlfdG9fbGluZWFyX2RhdGFfb2Zmc2V0KHNrYiwgb19vZmZzZXQsIG5fYnVmLCBuX2xlbik7CiAJfQogCiAJLyogbXVzdCB1cGRhdGUgdGhlIGlwaCB0b3RhbCBsZW5ndGggaGVyZSAqLwotCWlwaCA9IHNrYi0+bmguaXBoOwotCWlwaC0+dG90X2xlbiA9IGh0b25zKHNrYi0+bGVuKTsKKwlpcF9oZHIoc2tiKS0+dG90X2xlbiA9IGh0b25zKHNrYi0+bGVuKTsKIAogCUxlYXZlRnVuY3Rpb24oOSk7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcHZzL2lwX3ZzX2NvcmUuYyBiL25ldC9pcHY0L2lwdnMvaXBfdnNfY29yZS5jCmluZGV4IDI0ZDdiNjYuLmYwMDVhMmYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwdnMvaXBfdnNfY29yZS5jCisrKyBiL25ldC9pcHY0L2lwdnMvaXBfdnNfY29yZS5jCkBAIC0yMTIsNyArMjEyLDcgQEAKIAkJICAgIF9fYmUxNiBwb3J0c1syXSkKIHsKIAlzdHJ1Y3QgaXBfdnNfY29ubiAqY3AgPSBOVUxMOwotCXN0cnVjdCBpcGhkciAqaXBoID0gc2tiLT5uaC5pcGg7CisJc3RydWN0IGlwaGRyICppcGggPSBpcF9oZHIoc2tiKTsKIAlzdHJ1Y3QgaXBfdnNfZGVzdCAqZGVzdDsKIAlzdHJ1Y3QgaXBfdnNfY29ubiAqY3Q7CiAJX19iZTE2ICBkcG9ydDsJIC8qIGRlc3RpbmF0aW9uIHBvcnQgdG8gZm9yd2FyZCAqLwpAQCAtMzgxLDcgKzM4MSw3IEBACiBpcF92c19zY2hlZHVsZShzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjLCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCBpcF92c19jb25uICpjcCA9IE5VTEw7Ci0Jc3RydWN0IGlwaGRyICppcGggPSBza2ItPm5oLmlwaDsKKwlzdHJ1Y3QgaXBoZHIgKmlwaCA9IGlwX2hkcihza2IpOwogCXN0cnVjdCBpcF92c19kZXN0ICpkZXN0OwogCV9fYmUxNiBfcG9ydHNbMl0sICpwcHRyOwogCkBAIC00NDcsNyArNDQ3LDcgQEAKIAkJc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcCkKIHsKIAlfX2JlMTYgX3BvcnRzWzJdLCAqcHB0cjsKLQlzdHJ1Y3QgaXBoZHIgKmlwaCA9IHNrYi0+bmguaXBoOworCXN0cnVjdCBpcGhkciAqaXBoID0gaXBfaGRyKHNrYik7CiAKIAlwcHRyID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgaXBoLT5paGwqNCwKIAkJCQkgIHNpemVvZihfcG9ydHMpLCBfcG9ydHMpOwpAQCAtNTQ2LDcgKzU0Niw3IEBACiB7CiAJc2tiID0gaXBfZGVmcmFnKHNrYiwgdXNlcik7CiAJaWYgKHNrYikKLQkJaXBfc2VuZF9jaGVjayhza2ItPm5oLmlwaCk7CisJCWlwX3NlbmRfY2hlY2soaXBfaGRyKHNrYikpOwogCXJldHVybiBza2I7CiB9CiAKQEAgLTU1Nyw5ICs1NTcsMTAgQEAKIHZvaWQgaXBfdnNfbmF0X2ljbXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGlwX3ZzX3Byb3RvY29sICpwcCwKIAkJICAgIHN0cnVjdCBpcF92c19jb25uICpjcCwgaW50IGlub3V0KQogewotCXN0cnVjdCBpcGhkciAqaXBoCSA9IHNrYi0+bmguaXBoOworCXN0cnVjdCBpcGhkciAqaXBoCSA9IGlwX2hkcihza2IpOwogCXVuc2lnbmVkIGludCBpY21wX29mZnNldCA9IGlwaC0+aWhsKjQ7Ci0Jc3RydWN0IGljbXBoZHIgKmljbXBoCSA9IChzdHJ1Y3QgaWNtcGhkciAqKShza2ItPm5oLnJhdyArIGljbXBfb2Zmc2V0KTsKKwlzdHJ1Y3QgaWNtcGhkciAqaWNtcGgJID0gKHN0cnVjdCBpY21waGRyICopKHNrYl9uZXR3b3JrX2hlYWRlcihza2IpICsKKwkJCQkJCSAgICAgIGljbXBfb2Zmc2V0KTsKIAlzdHJ1Y3QgaXBoZHIgKmNpcGgJID0gKHN0cnVjdCBpcGhkciAqKShpY21waCArIDEpOwogCiAJaWYgKGlub3V0KSB7CkBAIC02MTcsMTQgKzYxOCwxNCBAQAogCSpyZWxhdGVkID0gMTsKIAogCS8qIHJlYXNzZW1ibGUgSVAgZnJhZ21lbnRzICovCi0JaWYgKHNrYi0+bmguaXBoLT5mcmFnX29mZiAmIF9fY29uc3RhbnRfaHRvbnMoSVBfTUZ8SVBfT0ZGU0VUKSkgeworCWlmIChpcF9oZHIoc2tiKS0+ZnJhZ19vZmYgJiBodG9ucyhJUF9NRiB8IElQX09GRlNFVCkpIHsKIAkJc2tiID0gaXBfdnNfZ2F0aGVyX2ZyYWdzKHNrYiwgSVBfREVGUkFHX1ZTX09VVCk7CiAJCWlmICghc2tiKQogCQkJcmV0dXJuIE5GX1NUT0xFTjsKIAkJKnBza2IgPSBza2I7CiAJfQogCi0JaXBoID0gc2tiLT5uaC5pcGg7CisJaXBoID0gaXBfaGRyKHNrYik7CiAJb2Zmc2V0ID0gaWhsID0gaXBoLT5paGwgKiA0OwogCWljID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgb2Zmc2V0LCBzaXplb2YoX2ljbXBoKSwgJl9pY21waCk7CiAJaWYgKGljID09IE5VTEwpCkBAIC02NTksNyArNjYwLDcgQEAKIAkJcmV0dXJuIE5GX0FDQ0VQVDsKIAogCS8qIElzIHRoZSBlbWJlZGRlZCBwcm90b2NvbCBoZWFkZXIgcHJlc2VudD8gKi8KLQlpZiAodW5saWtlbHkoY2loLT5mcmFnX29mZiAmIF9fY29uc3RhbnRfaHRvbnMoSVBfT0ZGU0VUKSAmJgorCWlmICh1bmxpa2VseShjaWgtPmZyYWdfb2ZmICYgaHRvbnMoSVBfT0ZGU0VUKSAmJgogCQkgICAgIHBwLT5kb250X2RlZnJhZykpCiAJCXJldHVybiBORl9BQ0NFUFQ7CiAKQEAgLTY4MCw4ICs2ODEsNyBAQAogCX0KIAogCS8qIEVuc3VyZSB0aGUgY2hlY2tzdW0gaXMgY29ycmVjdCAqLwotCWlmIChza2ItPmlwX3N1bW1lZCAhPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWSAmJgotCSAgICBpcF92c19jaGVja3N1bV9jb21wbGV0ZShza2IsIGlobCkpIHsKKwlpZiAoIXNrYl9jc3VtX3VubmVjZXNzYXJ5KHNrYikgJiYgaXBfdnNfY2hlY2tzdW1fY29tcGxldGUoc2tiLCBpaGwpKSB7CiAJCS8qIEZhaWxlZCBjaGVja3N1bSEgKi8KIAkJSVBfVlNfREJHKDEsICJGb3J3YXJkIElDTVA6IGZhaWxlZCBjaGVja3N1bSBmcm9tICVkLiVkLiVkLiVkIVxuIiwKIAkJCSAgTklQUVVBRChpcGgtPnNhZGRyKSk7CkBAIC03MTIsOCArNzEyLDcgQEAKIHsKIAlzdHJ1Y3QgdGNwaGRyIF90Y3BoLCAqdGg7CiAKLQl0aCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHNrYi0+bmguaXBoLT5paGwgKiA0LAotCQkJCXNpemVvZihfdGNwaCksICZfdGNwaCk7CisJdGggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBpcF9oZHJsZW4oc2tiKSwgc2l6ZW9mKF90Y3BoKSwgJl90Y3BoKTsKIAlpZiAodGggPT0gTlVMTCkKIAkJcmV0dXJuIDA7CiAJcmV0dXJuIHRoLT5yc3Q7CkBAIC03NDAsMTQgKzczOSwxNCBAQAogCWlmIChza2ItPmlwdnNfcHJvcGVydHkpCiAJCXJldHVybiBORl9BQ0NFUFQ7CiAKLQlpcGggPSBza2ItPm5oLmlwaDsKKwlpcGggPSBpcF9oZHIoc2tiKTsKIAlpZiAodW5saWtlbHkoaXBoLT5wcm90b2NvbCA9PSBJUFBST1RPX0lDTVApKSB7CiAJCWludCByZWxhdGVkLCB2ZXJkaWN0ID0gaXBfdnNfb3V0X2ljbXAocHNrYiwgJnJlbGF0ZWQpOwogCiAJCWlmIChyZWxhdGVkKQogCQkJcmV0dXJuIHZlcmRpY3Q7CiAJCXNrYiA9ICpwc2tiOwotCQlpcGggPSBza2ItPm5oLmlwaDsKKwkJaXBoID0gaXBfaGRyKHNrYik7CiAJfQogCiAJcHAgPSBpcF92c19wcm90b19nZXQoaXBoLT5wcm90b2NvbCk7CkBAIC03NTUsMTIgKzc1NCwxMiBAQAogCQlyZXR1cm4gTkZfQUNDRVBUOwogCiAJLyogcmVhc3NlbWJsZSBJUCBmcmFnbWVudHMgKi8KLQlpZiAodW5saWtlbHkoaXBoLT5mcmFnX29mZiAmIF9fY29uc3RhbnRfaHRvbnMoSVBfTUZ8SVBfT0ZGU0VUKSAmJgorCWlmICh1bmxpa2VseShpcGgtPmZyYWdfb2ZmICYgaHRvbnMoSVBfTUZ8SVBfT0ZGU0VUKSAmJgogCQkgICAgICFwcC0+ZG9udF9kZWZyYWcpKSB7CiAJCXNrYiA9IGlwX3ZzX2dhdGhlcl9mcmFncyhza2IsIElQX0RFRlJBR19WU19PVVQpOwogCQlpZiAoIXNrYikKIAkJCXJldHVybiBORl9TVE9MRU47Ci0JCWlwaCA9IHNrYi0+bmguaXBoOworCQlpcGggPSBpcF9oZHIoc2tiKTsKIAkJKnBza2IgPSBza2I7CiAJfQogCkBAIC04MTAsOCArODA5LDggQEAKIAlpZiAocHAtPnNuYXRfaGFuZGxlciAmJiAhcHAtPnNuYXRfaGFuZGxlcihwc2tiLCBwcCwgY3ApKQogCQlnb3RvIGRyb3A7CiAJc2tiID0gKnBza2I7Ci0Jc2tiLT5uaC5pcGgtPnNhZGRyID0gY3AtPnZhZGRyOwotCWlwX3NlbmRfY2hlY2soc2tiLT5uaC5pcGgpOworCWlwX2hkcihza2IpLT5zYWRkciA9IGNwLT52YWRkcjsKKwlpcF9zZW5kX2NoZWNrKGlwX2hkcihza2IpKTsKIAogCS8qIEZvciBwb2xpY3kgcm91dGluZywgcGFja2V0cyBvcmlnaW5hdGluZyBmcm9tIHRoaXMKIAkgKiBtYWNoaW5lIGl0c2VsZiBtYXkgYmUgcm91dGVkIGRpZmZlcmVudGx5IHRvIHBhY2tldHMKQEAgLTg2MSw3ICs4NjAsNyBAQAogCSpyZWxhdGVkID0gMTsKIAogCS8qIHJlYXNzZW1ibGUgSVAgZnJhZ21lbnRzICovCi0JaWYgKHNrYi0+bmguaXBoLT5mcmFnX29mZiAmIF9fY29uc3RhbnRfaHRvbnMoSVBfTUZ8SVBfT0ZGU0VUKSkgeworCWlmIChpcF9oZHIoc2tiKS0+ZnJhZ19vZmYgJiBodG9ucyhJUF9NRiB8IElQX09GRlNFVCkpIHsKIAkJc2tiID0gaXBfdnNfZ2F0aGVyX2ZyYWdzKHNrYiwKIAkJCQkJIGhvb2tudW0gPT0gTkZfSVBfTE9DQUxfSU4gPwogCQkJCQkgSVBfREVGUkFHX1ZTX0lOIDogSVBfREVGUkFHX1ZTX0ZXRCk7CkBAIC04NzAsNyArODY5LDcgQEAKIAkJKnBza2IgPSBza2I7CiAJfQogCi0JaXBoID0gc2tiLT5uaC5pcGg7CisJaXBoID0gaXBfaGRyKHNrYik7CiAJb2Zmc2V0ID0gaWhsID0gaXBoLT5paGwgKiA0OwogCWljID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgb2Zmc2V0LCBzaXplb2YoX2ljbXBoKSwgJl9pY21waCk7CiAJaWYgKGljID09IE5VTEwpCkBAIC05MDUsNyArOTA0LDcgQEAKIAkJcmV0dXJuIE5GX0FDQ0VQVDsKIAogCS8qIElzIHRoZSBlbWJlZGRlZCBwcm90b2NvbCBoZWFkZXIgcHJlc2VudD8gKi8KLQlpZiAodW5saWtlbHkoY2loLT5mcmFnX29mZiAmIF9fY29uc3RhbnRfaHRvbnMoSVBfT0ZGU0VUKSAmJgorCWlmICh1bmxpa2VseShjaWgtPmZyYWdfb2ZmICYgaHRvbnMoSVBfT0ZGU0VUKSAmJgogCQkgICAgIHBwLT5kb250X2RlZnJhZykpCiAJCXJldHVybiBORl9BQ0NFUFQ7CiAKQEAgLTkyMSw4ICs5MjAsNyBAQAogCXZlcmRpY3QgPSBORl9EUk9QOwogCiAJLyogRW5zdXJlIHRoZSBjaGVja3N1bSBpcyBjb3JyZWN0ICovCi0JaWYgKHNrYi0+aXBfc3VtbWVkICE9IENIRUNLU1VNX1VOTkVDRVNTQVJZICYmCi0JICAgIGlwX3ZzX2NoZWNrc3VtX2NvbXBsZXRlKHNrYiwgaWhsKSkgeworCWlmICghc2tiX2NzdW1fdW5uZWNlc3Nhcnkoc2tiKSAmJiBpcF92c19jaGVja3N1bV9jb21wbGV0ZShza2IsIGlobCkpIHsKIAkJLyogRmFpbGVkIGNoZWNrc3VtISAqLwogCQlJUF9WU19EQkcoMSwgIkluY29taW5nIElDTVA6IGZhaWxlZCBjaGVja3N1bSBmcm9tICVkLiVkLiVkLiVkIVxuIiwKIAkJCSAgTklQUVVBRChpcGgtPnNhZGRyKSk7CkBAIC05NjYsMTkgKzk2NCwxOSBAQAogCQkgICAgIHx8IHNrYi0+ZGV2ID09ICZsb29wYmFja19kZXYgfHwgc2tiLT5zaykpIHsKIAkJSVBfVlNfREJHKDEyLCAicGFja2V0IHR5cGU9JWQgcHJvdG89JWQgZGFkZHI9JWQuJWQuJWQuJWQgaWdub3JlZFxuIiwKIAkJCSAgc2tiLT5wa3RfdHlwZSwKLQkJCSAgc2tiLT5uaC5pcGgtPnByb3RvY29sLAotCQkJICBOSVBRVUFEKHNrYi0+bmguaXBoLT5kYWRkcikpOworCQkJICBpcF9oZHIoc2tiKS0+cHJvdG9jb2wsCisJCQkgIE5JUFFVQUQoaXBfaGRyKHNrYiktPmRhZGRyKSk7CiAJCXJldHVybiBORl9BQ0NFUFQ7CiAJfQogCi0JaXBoID0gc2tiLT5uaC5pcGg7CisJaXBoID0gaXBfaGRyKHNrYik7CiAJaWYgKHVubGlrZWx5KGlwaC0+cHJvdG9jb2wgPT0gSVBQUk9UT19JQ01QKSkgewogCQlpbnQgcmVsYXRlZCwgdmVyZGljdCA9IGlwX3ZzX2luX2ljbXAocHNrYiwgJnJlbGF0ZWQsIGhvb2tudW0pOwogCiAJCWlmIChyZWxhdGVkKQogCQkJcmV0dXJuIHZlcmRpY3Q7CiAJCXNrYiA9ICpwc2tiOwotCQlpcGggPSBza2ItPm5oLmlwaDsKKwkJaXBoID0gaXBfaGRyKHNrYik7CiAJfQogCiAJLyogUHJvdG9jb2wgc3VwcG9ydGVkPyAqLwpAQCAtMTA2NCw3ICsxMDYyLDcgQEAKIHsKIAlpbnQgcjsKIAotCWlmICgoKnBza2IpLT5uaC5pcGgtPnByb3RvY29sICE9IElQUFJPVE9fSUNNUCkKKwlpZiAoaXBfaGRyKCpwc2tiKS0+cHJvdG9jb2wgIT0gSVBQUk9UT19JQ01QKQogCQlyZXR1cm4gTkZfQUNDRVBUOwogCiAJcmV0dXJuIGlwX3ZzX2luX2ljbXAocHNrYiwgJnIsIGhvb2tudW0pOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXB2cy9pcF92c19kaC5jIGIvbmV0L2lwdjQvaXB2cy9pcF92c19kaC5jCmluZGV4IDUwMjExMWYuLmRjZjVkNDYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwdnMvaXBfdnNfZGguYworKysgYi9uZXQvaXB2NC9pcHZzL2lwX3ZzX2RoLmMKQEAgLTIwNCw3ICsyMDQsNyBAQAogewogCXN0cnVjdCBpcF92c19kZXN0ICpkZXN0OwogCXN0cnVjdCBpcF92c19kaF9idWNrZXQgKnRibDsKLQlzdHJ1Y3QgaXBoZHIgKmlwaCA9IHNrYi0+bmguaXBoOworCXN0cnVjdCBpcGhkciAqaXBoID0gaXBfaGRyKHNrYik7CiAKIAlJUF9WU19EQkcoNiwgImlwX3ZzX2RoX3NjaGVkdWxlKCk6IFNjaGVkdWxpbmcuLi5cbiIpOwogCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcHZzL2lwX3ZzX2Z0cC5jIGIvbmV0L2lwdjQvaXB2cy9pcF92c19mdHAuYwppbmRleCA4NDdjNDdhLi4zNDRkZGJiIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcHZzL2lwX3ZzX2Z0cC5jCisrKyBiL25ldC9pcHY0L2lwdnMvaXBfdnNfZnRwLmMKQEAgLTE1OSwxMCArMTU5LDEwIEBACiAJCXJldHVybiAwOwogCiAJaWYgKGNwLT5hcHBfZGF0YSA9PSAmaXBfdnNfZnRwX3Bhc3YpIHsKLQkJaXBoID0gKCpwc2tiKS0+bmguaXBoOworCQlpcGggPSBpcF9oZHIoKnBza2IpOwogCQl0aCA9IChzdHJ1Y3QgdGNwaGRyICopJigoKGNoYXIgKilpcGgpW2lwaC0+aWhsKjRdKTsKIAkJZGF0YSA9IChjaGFyICopdGggKyAodGgtPmRvZmYgPDwgMik7Ci0JCWRhdGFfbGltaXQgPSAoKnBza2IpLT50YWlsOworCQlkYXRhX2xpbWl0ID0gc2tiX3RhaWxfcG9pbnRlcigqcHNrYik7CiAKIAkJaWYgKGlwX3ZzX2Z0cF9nZXRfYWRkcnBvcnQoZGF0YSwgZGF0YV9saW1pdCwKIAkJCQkJICAgU0VSVkVSX1NUUklORywKQEAgLTI2MiwxNCArMjYyLDE0IEBACiAJLyoKIAkgKiBEZXRlY3Rpbmcgd2hldGhlciBpdCBpcyBwYXNzaXZlCiAJICovCi0JaXBoID0gKCpwc2tiKS0+bmguaXBoOworCWlwaCA9IGlwX2hkcigqcHNrYik7CiAJdGggPSAoc3RydWN0IHRjcGhkciAqKSYoKChjaGFyICopaXBoKVtpcGgtPmlobCo0XSk7CiAKIAkvKiBTaW5jZSB0aGVyZSBtYXkgYmUgT1BUSU9OUyBpbiB0aGUgVENQIHBhY2tldCBhbmQgdGhlIEhMRU4gaXMKIAkgICB0aGUgbGVuZ3RoIG9mIHRoZSBoZWFkZXIgaW4gMzItYml0IG11bHRpcGxlcywgaXQgaXMgYWNjdXJhdGUKIAkgICB0byBjYWxjdWxhdGUgZGF0YSBhZGRyZXNzIGJ5IHRoK0hMRU4qNCAqLwogCWRhdGEgPSBkYXRhX3N0YXJ0ID0gKGNoYXIgKil0aCArICh0aC0+ZG9mZiA8PCAyKTsKLQlkYXRhX2xpbWl0ID0gKCpwc2tiKS0+dGFpbDsKKwlkYXRhX2xpbWl0ID0gc2tiX3RhaWxfcG9pbnRlcigqcHNrYik7CiAKIAl3aGlsZSAoZGF0YSA8PSBkYXRhX2xpbWl0IC0gNikgewogCQlpZiAoc3RybmljbXAoZGF0YSwgIlBBU1ZcclxuIiwgNikgPT0gMCkgewpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXB2cy9pcF92c19sYmxjLmMgYi9uZXQvaXB2NC9pcHZzL2lwX3ZzX2xibGMuYwppbmRleCBjODAxMjczLi4wNTJmNGVkIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcHZzL2lwX3ZzX2xibGMuYworKysgYi9uZXQvaXB2NC9pcHZzL2lwX3ZzX2xibGMuYwpAQCAtNTIxLDcgKzUyMSw3IEBACiAJc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3Q7CiAJc3RydWN0IGlwX3ZzX2xibGNfdGFibGUgKnRibDsKIAlzdHJ1Y3QgaXBfdnNfbGJsY19lbnRyeSAqZW47Ci0Jc3RydWN0IGlwaGRyICppcGggPSBza2ItPm5oLmlwaDsKKwlzdHJ1Y3QgaXBoZHIgKmlwaCA9IGlwX2hkcihza2IpOwogCiAJSVBfVlNfREJHKDYsICJpcF92c19sYmxjX3NjaGVkdWxlKCk6IFNjaGVkdWxpbmcuLi5cbiIpOwogCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcHZzL2lwX3ZzX2xibGNyLmMgYi9uZXQvaXB2NC9pcHZzL2lwX3ZzX2xibGNyLmMKaW5kZXggMjNmOWI5ZS4uNjIyNWFjYSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaXB2cy9pcF92c19sYmxjci5jCisrKyBiL25ldC9pcHY0L2lwdnMvaXBfdnNfbGJsY3IuYwpAQCAtNzc1LDcgKzc3NSw3IEBACiAJc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3Q7CiAJc3RydWN0IGlwX3ZzX2xibGNyX3RhYmxlICp0Ymw7CiAJc3RydWN0IGlwX3ZzX2xibGNyX2VudHJ5ICplbjsKLQlzdHJ1Y3QgaXBoZHIgKmlwaCA9IHNrYi0+bmguaXBoOworCXN0cnVjdCBpcGhkciAqaXBoID0gaXBfaGRyKHNrYik7CiAKIAlJUF9WU19EQkcoNiwgImlwX3ZzX2xibGNyX3NjaGVkdWxlKCk6IFNjaGVkdWxpbmcuLi5cbiIpOwogCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcHZzL2lwX3ZzX3Byb3RvX2FoLmMgYi9uZXQvaXB2NC9pcHZzL2lwX3ZzX3Byb3RvX2FoLmMKaW5kZXggOGIwNTA1Yi4uYTg0MjY3NiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaXB2cy9pcF92c19wcm90b19haC5jCisrKyBiL25ldC9pcHY0L2lwdnMvaXBfdnNfcHJvdG9fYWguYwpAQCAtNTIsMTUgKzUyLDE1IEBACiAJaWYgKGxpa2VseSghaW52ZXJzZSkpIHsKIAkJY3AgPSBpcF92c19jb25uX2luX2dldChJUFBST1RPX1VEUCwKIAkJCQkgICAgICAgaXBoLT5zYWRkciwKLQkJCQkgICAgICAgX19jb25zdGFudF9odG9ucyhQT1JUX0lTQUtNUCksCisJCQkJICAgICAgIGh0b25zKFBPUlRfSVNBS01QKSwKIAkJCQkgICAgICAgaXBoLT5kYWRkciwKLQkJCQkgICAgICAgX19jb25zdGFudF9odG9ucyhQT1JUX0lTQUtNUCkpOworCQkJCSAgICAgICBodG9ucyhQT1JUX0lTQUtNUCkpOwogCX0gZWxzZSB7CiAJCWNwID0gaXBfdnNfY29ubl9pbl9nZXQoSVBQUk9UT19VRFAsCiAJCQkJICAgICAgIGlwaC0+ZGFkZHIsCi0JCQkJICAgICAgIF9fY29uc3RhbnRfaHRvbnMoUE9SVF9JU0FLTVApLAorCQkJCSAgICAgICBodG9ucyhQT1JUX0lTQUtNUCksCiAJCQkJICAgICAgIGlwaC0+c2FkZHIsCi0JCQkJICAgICAgIF9fY29uc3RhbnRfaHRvbnMoUE9SVF9JU0FLTVApKTsKKwkJCQkgICAgICAgaHRvbnMoUE9SVF9JU0FLTVApKTsKIAl9CiAKIAlpZiAoIWNwKSB7CkBAIC04OSwxNSArODksMTUgQEAKIAlpZiAobGlrZWx5KCFpbnZlcnNlKSkgewogCQljcCA9IGlwX3ZzX2Nvbm5fb3V0X2dldChJUFBST1RPX1VEUCwKIAkJCQkJaXBoLT5zYWRkciwKLQkJCQkJX19jb25zdGFudF9odG9ucyhQT1JUX0lTQUtNUCksCisJCQkJCWh0b25zKFBPUlRfSVNBS01QKSwKIAkJCQkJaXBoLT5kYWRkciwKLQkJCQkJX19jb25zdGFudF9odG9ucyhQT1JUX0lTQUtNUCkpOworCQkJCQlodG9ucyhQT1JUX0lTQUtNUCkpOwogCX0gZWxzZSB7CiAJCWNwID0gaXBfdnNfY29ubl9vdXRfZ2V0KElQUFJPVE9fVURQLAogCQkJCQlpcGgtPmRhZGRyLAotCQkJCQlfX2NvbnN0YW50X2h0b25zKFBPUlRfSVNBS01QKSwKKwkJCQkJaHRvbnMoUE9SVF9JU0FLTVApLAogCQkJCQlpcGgtPnNhZGRyLAotCQkJCQlfX2NvbnN0YW50X2h0b25zKFBPUlRfSVNBS01QKSk7CisJCQkJCWh0b25zKFBPUlRfSVNBS01QKSk7CiAJfQogCiAJaWYgKCFjcCkgewpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXB2cy9pcF92c19wcm90b190Y3AuYyBiL25ldC9pcHY0L2lwdnMvaXBfdnNfcHJvdG9fdGNwLmMKaW5kZXggMTZhOWViZS4uZTY1NTc3YSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaXB2cy9pcF92c19wcm90b190Y3AuYworKysgYi9uZXQvaXB2NC9pcHZzL2lwX3ZzX3Byb3RvX3RjcC5jCkBAIC03NiwxNiArNzYsMTUgQEAKIAlzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3ZjOwogCXN0cnVjdCB0Y3BoZHIgX3RjcGgsICp0aDsKIAotCXRoID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgc2tiLT5uaC5pcGgtPmlobCo0LAotCQkJCXNpemVvZihfdGNwaCksICZfdGNwaCk7CisJdGggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBpcF9oZHJsZW4oc2tiKSwgc2l6ZW9mKF90Y3BoKSwgJl90Y3BoKTsKIAlpZiAodGggPT0gTlVMTCkgewogCQkqdmVyZGljdCA9IE5GX0RST1A7CiAJCXJldHVybiAwOwogCX0KIAogCWlmICh0aC0+c3luICYmCi0JICAgIChzdmMgPSBpcF92c19zZXJ2aWNlX2dldChza2ItPm1hcmssIHNrYi0+bmguaXBoLT5wcm90b2NvbCwKLQkJCQkgICAgIHNrYi0+bmguaXBoLT5kYWRkciwgdGgtPmRlc3QpKSkgeworCSAgICAoc3ZjID0gaXBfdnNfc2VydmljZV9nZXQoc2tiLT5tYXJrLCBpcF9oZHIoc2tiKS0+cHJvdG9jb2wsCisJCQkJICAgICBpcF9oZHIoc2tiKS0+ZGFkZHIsIHRoLT5kZXN0KSkpIHsKIAkJaWYgKGlwX3ZzX3RvZHJvcCgpKSB7CiAJCQkvKgogCQkJICogSXQgc2VlbXMgdGhhdCB3ZSBhcmUgdmVyeSBsb2FkZWQuCkBAIC0xMjcsNyArMTI2LDcgQEAKIAkJIHN0cnVjdCBpcF92c19wcm90b2NvbCAqcHAsIHN0cnVjdCBpcF92c19jb25uICpjcCkKIHsKIAlzdHJ1Y3QgdGNwaGRyICp0Y3BoOwotCXVuc2lnbmVkIGludCB0Y3Bob2ZmID0gKCpwc2tiKS0+bmguaXBoLT5paGwgKiA0OworCWNvbnN0IHVuc2lnbmVkIGludCB0Y3Bob2ZmID0gaXBfaGRybGVuKCpwc2tiKTsKIAogCS8qIGNzdW1fY2hlY2sgcmVxdWlyZXMgdW5zaGFyZWQgc2tiICovCiAJaWYgKCFpcF92c19tYWtlX3NrYl93cml0YWJsZShwc2tiLCB0Y3Bob2ZmK3NpemVvZigqdGNwaCkpKQpAQCAtMTQzLDcgKzE0Miw3IEBACiAJCQlyZXR1cm4gMDsKIAl9CiAKLQl0Y3BoID0gKHZvaWQgKikoKnBza2IpLT5uaC5pcGggKyB0Y3Bob2ZmOworCXRjcGggPSAodm9pZCAqKWlwX2hkcigqcHNrYikgKyB0Y3Bob2ZmOwogCXRjcGgtPnNvdXJjZSA9IGNwLT52cG9ydDsKIAogCS8qIEFkanVzdCBUQ1AgY2hlY2tzdW1zICovCkBAIC0xNzUsNyArMTc0LDcgQEAKIAkJIHN0cnVjdCBpcF92c19wcm90b2NvbCAqcHAsIHN0cnVjdCBpcF92c19jb25uICpjcCkKIHsKIAlzdHJ1Y3QgdGNwaGRyICp0Y3BoOwotCXVuc2lnbmVkIGludCB0Y3Bob2ZmID0gKCpwc2tiKS0+bmguaXBoLT5paGwgKiA0OworCWNvbnN0IHVuc2lnbmVkIGludCB0Y3Bob2ZmID0gaXBfaGRybGVuKCpwc2tiKTsKIAogCS8qIGNzdW1fY2hlY2sgcmVxdWlyZXMgdW5zaGFyZWQgc2tiICovCiAJaWYgKCFpcF92c19tYWtlX3NrYl93cml0YWJsZShwc2tiLCB0Y3Bob2ZmK3NpemVvZigqdGNwaCkpKQpAQCAtMTk0LDcgKzE5Myw3IEBACiAJCQlyZXR1cm4gMDsKIAl9CiAKLQl0Y3BoID0gKHZvaWQgKikoKnBza2IpLT5uaC5pcGggKyB0Y3Bob2ZmOworCXRjcGggPSAodm9pZCAqKWlwX2hkcigqcHNrYikgKyB0Y3Bob2ZmOwogCXRjcGgtPmRlc3QgPSBjcC0+ZHBvcnQ7CiAKIAkvKgpAQCAtMjI0LDE1ICsyMjMsMTUgQEAKIHN0YXRpYyBpbnQKIHRjcF9jc3VtX2NoZWNrKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpcF92c19wcm90b2NvbCAqcHApCiB7Ci0JdW5zaWduZWQgaW50IHRjcGhvZmYgPSBza2ItPm5oLmlwaC0+aWhsKjQ7CisJY29uc3QgdW5zaWduZWQgaW50IHRjcGhvZmYgPSBpcF9oZHJsZW4oc2tiKTsKIAogCXN3aXRjaCAoc2tiLT5pcF9zdW1tZWQpIHsKIAljYXNlIENIRUNLU1VNX05PTkU6CiAJCXNrYi0+Y3N1bSA9IHNrYl9jaGVja3N1bShza2IsIHRjcGhvZmYsIHNrYi0+bGVuIC0gdGNwaG9mZiwgMCk7CiAJY2FzZSBDSEVDS1NVTV9DT01QTEVURToKLQkJaWYgKGNzdW1fdGNwdWRwX21hZ2ljKHNrYi0+bmguaXBoLT5zYWRkciwgc2tiLT5uaC5pcGgtPmRhZGRyLAorCQlpZiAoY3N1bV90Y3B1ZHBfbWFnaWMoaXBfaGRyKHNrYiktPnNhZGRyLCBpcF9oZHIoc2tiKS0+ZGFkZHIsCiAJCQkJICAgICAgc2tiLT5sZW4gLSB0Y3Bob2ZmLAotCQkJCSAgICAgIHNrYi0+bmguaXBoLT5wcm90b2NvbCwgc2tiLT5jc3VtKSkgeworCQkJCSAgICAgIGlwX2hkcihza2IpLT5wcm90b2NvbCwgc2tiLT5jc3VtKSkgewogCQkJSVBfVlNfREJHX1JMX1BLVCgwLCBwcCwgc2tiLCAwLAogCQkJCQkgIkZhaWxlZCBjaGVja3N1bSBmb3IiKTsKIAkJCXJldHVybiAwOwpAQCAtNDY3LDggKzQ2Niw3IEBACiB7CiAJc3RydWN0IHRjcGhkciBfdGNwaCwgKnRoOwogCi0JdGggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBza2ItPm5oLmlwaC0+aWhsKjQsCi0JCQkJc2l6ZW9mKF90Y3BoKSwgJl90Y3BoKTsKKwl0aCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIGlwX2hkcmxlbihza2IpLCBzaXplb2YoX3RjcGgpLCAmX3RjcGgpOwogCWlmICh0aCA9PSBOVUxMKQogCQlyZXR1cm4gMDsKIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXB2cy9pcF92c19wcm90b191ZHAuYyBiL25ldC9pcHY0L2lwdnMvaXBfdnNfcHJvdG9fdWRwLmMKaW5kZXggMDNmMGE0MS4uOGVlNWZlNiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaXB2cy9pcF92c19wcm90b191ZHAuYworKysgYi9uZXQvaXB2NC9pcHZzL2lwX3ZzX3Byb3RvX3VkcC5jCkBAIC0yMiw3ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgvdWRwLmg+CiAKICNpbmNsdWRlIDxuZXQvaXBfdnMuaD4KLQorI2luY2x1ZGUgPG5ldC9pcC5oPgogCiBzdGF0aWMgc3RydWN0IGlwX3ZzX2Nvbm4gKgogdWRwX2Nvbm5faW5fZ2V0KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpcF92c19wcm90b2NvbCAqcHAsCkBAIC01Niw3ICs1Niw3IEBACiAJc3RydWN0IGlwX3ZzX2Nvbm4gKmNwOwogCV9fYmUxNiBfcG9ydHNbMl0sICpwcHRyOwogCi0JcHB0ciA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHNrYi0+bmguaXBoLT5paGwqNCwKKwlwcHRyID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgaXBfaGRybGVuKHNrYiksCiAJCQkJICBzaXplb2YoX3BvcnRzKSwgX3BvcnRzKTsKIAlpZiAocHB0ciA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKQEAgLTgyLDE1ICs4MiwxNSBAQAogCXN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmM7CiAJc3RydWN0IHVkcGhkciBfdWRwaCwgKnVoOwogCi0JdWggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBza2ItPm5oLmlwaC0+aWhsKjQsCisJdWggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBpcF9oZHJsZW4oc2tiKSwKIAkJCQlzaXplb2YoX3VkcGgpLCAmX3VkcGgpOwogCWlmICh1aCA9PSBOVUxMKSB7CiAJCSp2ZXJkaWN0ID0gTkZfRFJPUDsKIAkJcmV0dXJuIDA7CiAJfQogCi0JaWYgKChzdmMgPSBpcF92c19zZXJ2aWNlX2dldChza2ItPm1hcmssIHNrYi0+bmguaXBoLT5wcm90b2NvbCwKLQkJCQkgICAgIHNrYi0+bmguaXBoLT5kYWRkciwgdWgtPmRlc3QpKSkgeworCWlmICgoc3ZjID0gaXBfdnNfc2VydmljZV9nZXQoc2tiLT5tYXJrLCBpcF9oZHIoc2tiKS0+cHJvdG9jb2wsCisJCQkJICAgICBpcF9oZHIoc2tiKS0+ZGFkZHIsIHVoLT5kZXN0KSkpIHsKIAkJaWYgKGlwX3ZzX3RvZHJvcCgpKSB7CiAJCQkvKgogCQkJICogSXQgc2VlbXMgdGhhdCB3ZSBhcmUgdmVyeSBsb2FkZWQuCkBAIC0xMzMsNyArMTMzLDcgQEAKIAkJIHN0cnVjdCBpcF92c19wcm90b2NvbCAqcHAsIHN0cnVjdCBpcF92c19jb25uICpjcCkKIHsKIAlzdHJ1Y3QgdWRwaGRyICp1ZHBoOwotCXVuc2lnbmVkIGludCB1ZHBob2ZmID0gKCpwc2tiKS0+bmguaXBoLT5paGwgKiA0OworCWNvbnN0IHVuc2lnbmVkIGludCB1ZHBob2ZmID0gaXBfaGRybGVuKCpwc2tiKTsKIAogCS8qIGNzdW1fY2hlY2sgcmVxdWlyZXMgdW5zaGFyZWQgc2tiICovCiAJaWYgKCFpcF92c19tYWtlX3NrYl93cml0YWJsZShwc2tiLCB1ZHBob2ZmK3NpemVvZigqdWRwaCkpKQpAQCAtMTUxLDcgKzE1MSw3IEBACiAJCQlyZXR1cm4gMDsKIAl9CiAKLQl1ZHBoID0gKHZvaWQgKikoKnBza2IpLT5uaC5pcGggKyB1ZHBob2ZmOworCXVkcGggPSAodm9pZCAqKWlwX2hkcigqcHNrYikgKyB1ZHBob2ZmOwogCXVkcGgtPnNvdXJjZSA9IGNwLT52cG9ydDsKIAogCS8qCkBAIC0xODcsNyArMTg3LDcgQEAKIAkJIHN0cnVjdCBpcF92c19wcm90b2NvbCAqcHAsIHN0cnVjdCBpcF92c19jb25uICpjcCkKIHsKIAlzdHJ1Y3QgdWRwaGRyICp1ZHBoOwotCXVuc2lnbmVkIGludCB1ZHBob2ZmID0gKCpwc2tiKS0+bmguaXBoLT5paGwgKiA0OworCXVuc2lnbmVkIGludCB1ZHBob2ZmID0gaXBfaGRybGVuKCpwc2tiKTsKIAogCS8qIGNzdW1fY2hlY2sgcmVxdWlyZXMgdW5zaGFyZWQgc2tiICovCiAJaWYgKCFpcF92c19tYWtlX3NrYl93cml0YWJsZShwc2tiLCB1ZHBob2ZmK3NpemVvZigqdWRwaCkpKQpAQCAtMjA2LDcgKzIwNiw3IEBACiAJCQlyZXR1cm4gMDsKIAl9CiAKLQl1ZHBoID0gKHZvaWQgKikoKnBza2IpLT5uaC5pcGggKyB1ZHBob2ZmOworCXVkcGggPSAodm9pZCAqKWlwX2hkcigqcHNrYikgKyB1ZHBob2ZmOwogCXVkcGgtPmRlc3QgPSBjcC0+ZHBvcnQ7CiAKIAkvKgpAQCAtMjM5LDcgKzIzOSw3IEBACiB1ZHBfY3N1bV9jaGVjayhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwKQogewogCXN0cnVjdCB1ZHBoZHIgX3VkcGgsICp1aDsKLQl1bnNpZ25lZCBpbnQgdWRwaG9mZiA9IHNrYi0+bmguaXBoLT5paGwqNDsKKwljb25zdCB1bnNpZ25lZCBpbnQgdWRwaG9mZiA9IGlwX2hkcmxlbihza2IpOwogCiAJdWggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCB1ZHBob2ZmLCBzaXplb2YoX3VkcGgpLCAmX3VkcGgpOwogCWlmICh1aCA9PSBOVUxMKQpAQCAtMjUxLDEwICsyNTEsMTAgQEAKIAkJCXNrYi0+Y3N1bSA9IHNrYl9jaGVja3N1bShza2IsIHVkcGhvZmYsCiAJCQkJCQkgc2tiLT5sZW4gLSB1ZHBob2ZmLCAwKTsKIAkJY2FzZSBDSEVDS1NVTV9DT01QTEVURToKLQkJCWlmIChjc3VtX3RjcHVkcF9tYWdpYyhza2ItPm5oLmlwaC0+c2FkZHIsCi0JCQkJCSAgICAgIHNrYi0+bmguaXBoLT5kYWRkciwKKwkJCWlmIChjc3VtX3RjcHVkcF9tYWdpYyhpcF9oZHIoc2tiKS0+c2FkZHIsCisJCQkJCSAgICAgIGlwX2hkcihza2IpLT5kYWRkciwKIAkJCQkJICAgICAgc2tiLT5sZW4gLSB1ZHBob2ZmLAotCQkJCQkgICAgICBza2ItPm5oLmlwaC0+cHJvdG9jb2wsCisJCQkJCSAgICAgIGlwX2hkcihza2IpLT5wcm90b2NvbCwKIAkJCQkJICAgICAgc2tiLT5jc3VtKSkgewogCQkJCUlQX1ZTX0RCR19STF9QS1QoMCwgcHAsIHNrYiwgMCwKIAkJCQkJCSAiRmFpbGVkIGNoZWNrc3VtIGZvciIpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXB2cy9pcF92c19zaC5jIGIvbmV0L2lwdjQvaXB2cy9pcF92c19zaC5jCmluZGV4IDMzODY2OGYuLjFiMjViMDAgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwdnMvaXBfdnNfc2guYworKysgYi9uZXQvaXB2NC9pcHZzL2lwX3ZzX3NoLmMKQEAgLTIwMSw3ICsyMDEsNyBAQAogewogCXN0cnVjdCBpcF92c19kZXN0ICpkZXN0OwogCXN0cnVjdCBpcF92c19zaF9idWNrZXQgKnRibDsKLQlzdHJ1Y3QgaXBoZHIgKmlwaCA9IHNrYi0+bmguaXBoOworCXN0cnVjdCBpcGhkciAqaXBoID0gaXBfaGRyKHNrYik7CiAKIAlJUF9WU19EQkcoNiwgImlwX3ZzX3NoX3NjaGVkdWxlKCk6IFNjaGVkdWxpbmcuLi5cbiIpOwogCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcHZzL2lwX3ZzX3htaXQuYyBiL25ldC9pcHY0L2lwdnMvaXBfdnNfeG1pdC5jCmluZGV4IGUxZjc3YmQuLjkwMGNlMjkgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwdnMvaXBfdnNfeG1pdC5jCisrKyBiL25ldC9pcHY0L2lwdnMvaXBfdnNfeG1pdC5jCkBAIC0xNTYsNyArMTU2LDcgQEAKIAkJICBzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwKQogewogCXN0cnVjdCBydGFibGUgKnJ0OwkJCS8qIFJvdXRlIHRvIHRoZSBvdGhlciBob3N0ICovCi0Jc3RydWN0IGlwaGRyICAqaXBoID0gc2tiLT5uaC5pcGg7CisJc3RydWN0IGlwaGRyICAqaXBoID0gaXBfaGRyKHNrYik7CiAJdTggICAgIHRvcyA9IGlwaC0+dG9zOwogCWludCAgICBtdHU7CiAJc3RydWN0IGZsb3dpIGZsID0gewpAQCAtMTc4LDcgKzE3OCw3IEBACiAKIAkvKiBNVFUgY2hlY2tpbmcgKi8KIAltdHUgPSBkc3RfbXR1KCZydC0+dS5kc3QpOwotCWlmICgoc2tiLT5sZW4gPiBtdHUpICYmIChpcGgtPmZyYWdfb2ZmJl9fY29uc3RhbnRfaHRvbnMoSVBfREYpKSkgeworCWlmICgoc2tiLT5sZW4gPiBtdHUpICYmIChpcGgtPmZyYWdfb2ZmICYgaHRvbnMoSVBfREYpKSkgewogCQlpcF9ydF9wdXQocnQpOwogCQlpY21wX3NlbmQoc2tiLCBJQ01QX0RFU1RfVU5SRUFDSCxJQ01QX0ZSQUdfTkVFREVELCBodG9ubChtdHUpKTsKIAkJSVBfVlNfREJHX1JMKCJpcF92c19ieXBhc3NfeG1pdCgpOiBmcmFnIG5lZWRlZFxuIik7CkBAIC0xOTMsNyArMTkzLDcgQEAKIAkJaXBfcnRfcHV0KHJ0KTsKIAkJcmV0dXJuIE5GX1NUT0xFTjsKIAl9Ci0JaXBfc2VuZF9jaGVjayhza2ItPm5oLmlwaCk7CisJaXBfc2VuZF9jaGVjayhpcF9oZHIoc2tiKSk7CiAKIAkvKiBkcm9wIG9sZCByb3V0ZSAqLwogCWRzdF9yZWxlYXNlKHNrYi0+ZHN0KTsKQEAgLTIyNiw3ICsyMjYsNyBAQAogewogCXN0cnVjdCBydGFibGUgKnJ0OwkJLyogUm91dGUgdG8gdGhlIG90aGVyIGhvc3QgKi8KIAlpbnQgbXR1OwotCXN0cnVjdCBpcGhkciAqaXBoID0gc2tiLT5uaC5pcGg7CisJc3RydWN0IGlwaGRyICppcGggPSBpcF9oZHIoc2tiKTsKIAogCUVudGVyRnVuY3Rpb24oMTApOwogCkBAIC0yNDUsNyArMjQ1LDcgQEAKIAogCS8qIE1UVSBjaGVja2luZyAqLwogCW10dSA9IGRzdF9tdHUoJnJ0LT51LmRzdCk7Ci0JaWYgKChza2ItPmxlbiA+IG10dSkgJiYgKGlwaC0+ZnJhZ19vZmYmX19jb25zdGFudF9odG9ucyhJUF9ERikpKSB7CisJaWYgKChza2ItPmxlbiA+IG10dSkgJiYgKGlwaC0+ZnJhZ19vZmYgJiBodG9ucyhJUF9ERikpKSB7CiAJCWlwX3J0X3B1dChydCk7CiAJCWljbXBfc2VuZChza2IsIElDTVBfREVTVF9VTlJFQUNILElDTVBfRlJBR19ORUVERUQsIGh0b25sKG10dSkpOwogCQlJUF9WU19EQkdfUkxfUEtUKDAsIHBwLCBza2IsIDAsICJpcF92c19uYXRfeG1pdCgpOiBmcmFnIG5lZWRlZCBmb3IiKTsKQEAgLTI2Niw4ICsyNjYsOCBAQAogCS8qIG1hbmdsZSB0aGUgcGFja2V0ICovCiAJaWYgKHBwLT5kbmF0X2hhbmRsZXIgJiYgIXBwLT5kbmF0X2hhbmRsZXIoJnNrYiwgcHAsIGNwKSkKIAkJZ290byB0eF9lcnJvcjsKLQlza2ItPm5oLmlwaC0+ZGFkZHIgPSBjcC0+ZGFkZHI7Ci0JaXBfc2VuZF9jaGVjayhza2ItPm5oLmlwaCk7CisJaXBfaGRyKHNrYiktPmRhZGRyID0gY3AtPmRhZGRyOworCWlwX3NlbmRfY2hlY2soaXBfaGRyKHNrYikpOwogCiAJSVBfVlNfREJHX1BLVCgxMCwgcHAsIHNrYiwgMCwgIkFmdGVyIEROQVQiKTsKIApAQCAtMzIwLDE5ICszMjAsMjAgQEAKIHsKIAlzdHJ1Y3QgcnRhYmxlICpydDsJCQkvKiBSb3V0ZSB0byB0aGUgb3RoZXIgaG9zdCAqLwogCXN0cnVjdCBuZXRfZGV2aWNlICp0ZGV2OwkJLyogRGV2aWNlIHRvIG90aGVyIGhvc3QgKi8KLQlzdHJ1Y3QgaXBoZHIgICpvbGRfaXBoID0gc2tiLT5uaC5pcGg7CisJc3RydWN0IGlwaGRyICAqb2xkX2lwaCA9IGlwX2hkcihza2IpOwogCXU4ICAgICB0b3MgPSBvbGRfaXBoLT50b3M7CiAJX19iZTE2IGRmID0gb2xkX2lwaC0+ZnJhZ19vZmY7CisJc2tfYnVmZl9kYXRhX3Qgb2xkX3RyYW5zcG9ydF9oZWFkZXIgPSBza2ItPnRyYW5zcG9ydF9oZWFkZXI7CiAJc3RydWN0IGlwaGRyICAqaXBoOwkJCS8qIE91ciBuZXcgSVAgaGVhZGVyICovCiAJaW50ICAgIG1heF9oZWFkcm9vbTsJCQkvKiBUaGUgZXh0cmEgaGVhZGVyIHNwYWNlIG5lZWRlZCAqLwogCWludCAgICBtdHU7CiAKIAlFbnRlckZ1bmN0aW9uKDEwKTsKIAotCWlmIChza2ItPnByb3RvY29sICE9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfSVApKSB7CisJaWYgKHNrYi0+cHJvdG9jb2wgIT0gaHRvbnMoRVRIX1BfSVApKSB7CiAJCUlQX1ZTX0RCR19STCgiaXBfdnNfdHVubmVsX3htaXQoKTogcHJvdG9jb2wgZXJyb3IsICIKIAkJCSAgICAgIkVUSF9QX0lQOiAlZCwgc2tiIHByb3RvY29sOiAlZFxuIiwKLQkJCSAgICAgX19jb25zdGFudF9odG9ucyhFVEhfUF9JUCksIHNrYi0+cHJvdG9jb2wpOworCQkJICAgICBodG9ucyhFVEhfUF9JUCksIHNrYi0+cHJvdG9jb2wpOwogCQlnb3RvIHR4X2Vycm9yOwogCX0KIApAQCAtMzUwLDkgKzM1MSw5IEBACiAJaWYgKHNrYi0+ZHN0KQogCQlza2ItPmRzdC0+b3BzLT51cGRhdGVfcG10dShza2ItPmRzdCwgbXR1KTsKIAotCWRmIHw9IChvbGRfaXBoLT5mcmFnX29mZiZfX2NvbnN0YW50X2h0b25zKElQX0RGKSk7CisJZGYgfD0gKG9sZF9pcGgtPmZyYWdfb2ZmICYgaHRvbnMoSVBfREYpKTsKIAotCWlmICgob2xkX2lwaC0+ZnJhZ19vZmYmX19jb25zdGFudF9odG9ucyhJUF9ERikpCisJaWYgKChvbGRfaXBoLT5mcmFnX29mZiAmIGh0b25zKElQX0RGKSkKIAkgICAgJiYgbXR1IDwgbnRvaHMob2xkX2lwaC0+dG90X2xlbikpIHsKIAkJaWNtcF9zZW5kKHNrYiwgSUNNUF9ERVNUX1VOUkVBQ0gsSUNNUF9GUkFHX05FRURFRCwgaHRvbmwobXR1KSk7CiAJCWlwX3J0X3B1dChydCk7CkBAIC0zNzcsMTUgKzM3OCwxNiBAQAogCQl9CiAJCWtmcmVlX3NrYihza2IpOwogCQlza2IgPSBuZXdfc2tiOwotCQlvbGRfaXBoID0gc2tiLT5uaC5pcGg7CisJCW9sZF9pcGggPSBpcF9oZHIoc2tiKTsKIAl9CiAKLQlza2ItPmgucmF3ID0gKHZvaWQgKikgb2xkX2lwaDsKKwlza2ItPnRyYW5zcG9ydF9oZWFkZXIgPSBvbGRfdHJhbnNwb3J0X2hlYWRlcjsKIAogCS8qIGZpeCBvbGQgSVAgaGVhZGVyIGNoZWNrc3VtICovCiAJaXBfc2VuZF9jaGVjayhvbGRfaXBoKTsKIAotCXNrYi0+bmgucmF3ID0gc2tiX3B1c2goc2tiLCBzaXplb2Yoc3RydWN0IGlwaGRyKSk7CisJc2tiX3B1c2goc2tiLCBzaXplb2Yoc3RydWN0IGlwaGRyKSk7CisJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CiAJbWVtc2V0KCYoSVBDQihza2IpLT5vcHQpLCAwLCBzaXplb2YoSVBDQihza2IpLT5vcHQpKTsKIAogCS8qIGRyb3Agb2xkIHJvdXRlICovCkBAIC0zOTUsNyArMzk3LDcgQEAKIAkvKgogCSAqCVB1c2ggZG93biBhbmQgaW5zdGFsbCB0aGUgSVBJUCBoZWFkZXIuCiAJICovCi0JaXBoCQkJPQlza2ItPm5oLmlwaDsKKwlpcGgJCQk9CWlwX2hkcihza2IpOwogCWlwaC0+dmVyc2lvbgkJPQk0OwogCWlwaC0+aWhsCQk9CXNpemVvZihzdHJ1Y3QgaXBoZHIpPj4yOwogCWlwaC0+ZnJhZ19vZmYJCT0JZGY7CkBAIC00MzUsNyArNDM3LDcgQEAKIAkgICAgICBzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwKQogewogCXN0cnVjdCBydGFibGUgKnJ0OwkJCS8qIFJvdXRlIHRvIHRoZSBvdGhlciBob3N0ICovCi0Jc3RydWN0IGlwaGRyICAqaXBoID0gc2tiLT5uaC5pcGg7CisJc3RydWN0IGlwaGRyICAqaXBoID0gaXBfaGRyKHNrYik7CiAJaW50ICAgIG10dTsKIAogCUVudGVyRnVuY3Rpb24oMTApOwpAQCAtNDQ1LDcgKzQ0Nyw3IEBACiAKIAkvKiBNVFUgY2hlY2tpbmcgKi8KIAltdHUgPSBkc3RfbXR1KCZydC0+dS5kc3QpOwotCWlmICgoaXBoLT5mcmFnX29mZiZfX2NvbnN0YW50X2h0b25zKElQX0RGKSkgJiYgc2tiLT5sZW4gPiBtdHUpIHsKKwlpZiAoKGlwaC0+ZnJhZ19vZmYgJiBodG9ucyhJUF9ERikpICYmIHNrYi0+bGVuID4gbXR1KSB7CiAJCWljbXBfc2VuZChza2IsIElDTVBfREVTVF9VTlJFQUNILElDTVBfRlJBR19ORUVERUQsIGh0b25sKG10dSkpOwogCQlpcF9ydF9wdXQocnQpOwogCQlJUF9WU19EQkdfUkwoImlwX3ZzX2RyX3htaXQoKTogZnJhZyBuZWVkZWRcbiIpOwpAQCAtNDYwLDcgKzQ2Miw3IEBACiAJCWlwX3J0X3B1dChydCk7CiAJCXJldHVybiBORl9TVE9MRU47CiAJfQotCWlwX3NlbmRfY2hlY2soc2tiLT5uaC5pcGgpOworCWlwX3NlbmRfY2hlY2soaXBfaGRyKHNrYikpOwogCiAJLyogZHJvcCBvbGQgcm91dGUgKi8KIAlkc3RfcmVsZWFzZShza2ItPmRzdCk7CkBAIC01MTQsMTIgKzUxNiwxMiBAQAogCSAqIG1hbmdsZSBhbmQgc2VuZCB0aGUgcGFja2V0IGhlcmUgKG9ubHkgZm9yIFZTL05BVCkKIAkgKi8KIAotCWlmICghKHJ0ID0gX19pcF92c19nZXRfb3V0X3J0KGNwLCBSVF9UT1Moc2tiLT5uaC5pcGgtPnRvcykpKSkKKwlpZiAoIShydCA9IF9faXBfdnNfZ2V0X291dF9ydChjcCwgUlRfVE9TKGlwX2hkcihza2IpLT50b3MpKSkpCiAJCWdvdG8gdHhfZXJyb3JfaWNtcDsKIAogCS8qIE1UVSBjaGVja2luZyAqLwogCW10dSA9IGRzdF9tdHUoJnJ0LT51LmRzdCk7Ci0JaWYgKChza2ItPmxlbiA+IG10dSkgJiYgKHNrYi0+bmguaXBoLT5mcmFnX29mZiZfX2NvbnN0YW50X2h0b25zKElQX0RGKSkpIHsKKwlpZiAoKHNrYi0+bGVuID4gbXR1KSAmJiAoaXBfaGRyKHNrYiktPmZyYWdfb2ZmICYgaHRvbnMoSVBfREYpKSkgewogCQlpcF9ydF9wdXQocnQpOwogCQlpY21wX3NlbmQoc2tiLCBJQ01QX0RFU1RfVU5SRUFDSCwgSUNNUF9GUkFHX05FRURFRCwgaHRvbmwobXR1KSk7CiAJCUlQX1ZTX0RCR19STCgiaXBfdnNfaW5faWNtcCgpOiBmcmFnIG5lZWRlZFxuIik7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9tdWx0aXBhdGhfZHJyLmMgYi9uZXQvaXB2NC9tdWx0aXBhdGhfZHJyLmMKaW5kZXggNTc0YzczNS4uYjAzYzVjYSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbXVsdGlwYXRoX2Ryci5jCisrKyBiL25ldC9pcHY0L211bHRpcGF0aF9kcnIuYwpAQCAtMTAwLDcgKzEwMCw3IEBACiAKIAkJc3Bpbl91bmxvY2tfYmgoJnN0YXRlX2xvY2spOwogCQlicmVhazsKLQl9OworCX0KIAogCXJldHVybiBOT1RJRllfRE9ORTsKIH0KZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyLmMKaW5kZXggNjA2OWExMS4uYjQ0MTkyOSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyLmMKQEAgLTEwLDcgKzEwLDcgQEAKIC8qIHJvdXRlX21lX2hhcmRlciBmdW5jdGlvbiwgdXNlZCBieSBpcHRhYmxlX25hdCwgaXB0YWJsZV9tYW5nbGUgKyBpcF9xdWV1ZSAqLwogaW50IGlwX3JvdXRlX21lX2hhcmRlcihzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIHVuc2lnbmVkIGFkZHJfdHlwZSkKIHsKLQlzdHJ1Y3QgaXBoZHIgKmlwaCA9ICgqcHNrYiktPm5oLmlwaDsKKwljb25zdCBzdHJ1Y3QgaXBoZHIgKmlwaCA9IGlwX2hkcigqcHNrYik7CiAJc3RydWN0IHJ0YWJsZSAqcnQ7CiAJc3RydWN0IGZsb3dpIGZsID0ge307CiAJc3RydWN0IGRzdF9lbnRyeSAqb2RzdDsKQEAgLTE0Miw3ICsxNDIsNyBAQAogCXN0cnVjdCBpcF9ydF9pbmZvICpydF9pbmZvID0gbmZfaW5mb19yZXJvdXRlKGluZm8pOwogCiAJaWYgKGluZm8tPmhvb2sgPT0gTkZfSVBfTE9DQUxfT1VUKSB7Ci0JCWNvbnN0IHN0cnVjdCBpcGhkciAqaXBoID0gc2tiLT5uaC5pcGg7CisJCWNvbnN0IHN0cnVjdCBpcGhkciAqaXBoID0gaXBfaGRyKHNrYik7CiAKIAkJcnRfaW5mby0+dG9zID0gaXBoLT50b3M7CiAJCXJ0X2luZm8tPmRhZGRyID0gaXBoLT5kYWRkcjsKQEAgLTE1NSw3ICsxNTUsNyBAQAogCWNvbnN0IHN0cnVjdCBpcF9ydF9pbmZvICpydF9pbmZvID0gbmZfaW5mb19yZXJvdXRlKGluZm8pOwogCiAJaWYgKGluZm8tPmhvb2sgPT0gTkZfSVBfTE9DQUxfT1VUKSB7Ci0JCXN0cnVjdCBpcGhkciAqaXBoID0gKCpwc2tiKS0+bmguaXBoOworCQljb25zdCBzdHJ1Y3QgaXBoZHIgKmlwaCA9IGlwX2hkcigqcHNrYik7CiAKIAkJaWYgKCEoaXBoLT50b3MgPT0gcnRfaW5mby0+dG9zCiAJCSAgICAgICYmIGlwaC0+ZGFkZHIgPT0gcnRfaW5mby0+ZGFkZHIKQEAgLTE2OCw3ICsxNjgsNyBAQAogX19zdW0xNiBuZl9pcF9jaGVja3N1bShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgaG9vaywKIAkJCSAgICB1bnNpZ25lZCBpbnQgZGF0YW9mZiwgdV9pbnQ4X3QgcHJvdG9jb2wpCiB7Ci0Jc3RydWN0IGlwaGRyICppcGggPSBza2ItPm5oLmlwaDsKKwljb25zdCBzdHJ1Y3QgaXBoZHIgKmlwaCA9IGlwX2hkcihza2IpOwogCV9fc3VtMTYgY3N1bSA9IDA7CiAKIAlzd2l0Y2ggKHNrYi0+aXBfc3VtbWVkKSB7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvS2NvbmZpZyBiL25ldC9pcHY0L25ldGZpbHRlci9LY29uZmlnCmluZGV4IDYwMTgwOGMuLjQ2NTA5ZmEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9LY29uZmlnCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9LY29uZmlnCkBAIC0zMCwxODggKzMwLDYgQEAKIAogCSAgSWYgdW5zdXJlLCBzYXkgWS4KIAotIyBjb25uZWN0aW9uIHRyYWNraW5nLCBoZWxwZXJzIGFuZCBwcm90b2NvbHMKLWNvbmZpZyBJUF9ORl9DVF9BQ0NUCi0JYm9vbCAiQ29ubmVjdGlvbiB0cmFja2luZyBmbG93IGFjY291bnRpbmciCi0JZGVwZW5kcyBvbiBJUF9ORl9DT05OVFJBQ0sKLQloZWxwCi0JICBJZiB0aGlzIG9wdGlvbiBpcyBlbmFibGVkLCB0aGUgY29ubmVjdGlvbiB0cmFja2luZyBjb2RlIHdpbGwKLQkgIGtlZXAgcGVyLWZsb3cgcGFja2V0IGFuZCBieXRlIGNvdW50ZXJzLgotCi0JICBUaG9zZSBjb3VudGVycyBjYW4gYmUgdXNlZCBmb3IgZmxvdy1iYXNlZCBhY2NvdW50aW5nIG9yIHRoZQotCSAgYGNvbm5ieXRlcycgbWF0Y2guCi0KLQkgIElmIHVuc3VyZSwgc2F5IGBOJy4KLQotY29uZmlnIElQX05GX0NPTk5UUkFDS19NQVJLCi0JYm9vbCAgJ0Nvbm5lY3Rpb24gbWFyayB0cmFja2luZyBzdXBwb3J0JwotCWRlcGVuZHMgb24gSVBfTkZfQ09OTlRSQUNLCi0JaGVscAotCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciBjb25uZWN0aW9uIG1hcmtzLCB1c2VkIGJ5IHRoZQotCSAgYENPTk5NQVJLJyB0YXJnZXQgYW5kIGBjb25ubWFyaycgbWF0Y2guIFNpbWlsYXIgdG8gdGhlIG1hcmsgdmFsdWUKLQkgIG9mIHBhY2tldHMsIGJ1dCB0aGlzIG1hcmsgdmFsdWUgaXMga2VwdCBpbiB0aGUgY29ubnRyYWNrIHNlc3Npb24KLQkgIGluc3RlYWQgb2YgdGhlIGluZGl2aWR1YWwgcGFja2V0cy4KLQkKLWNvbmZpZyBJUF9ORl9DT05OVFJBQ0tfU0VDTUFSSwotCWJvb2wgICdDb25uZWN0aW9uIHRyYWNraW5nIHNlY3VyaXR5IG1hcmsgc3VwcG9ydCcKLQlkZXBlbmRzIG9uIElQX05GX0NPTk5UUkFDSyAmJiBORVRXT1JLX1NFQ01BUksKLQloZWxwCi0JICBUaGlzIG9wdGlvbiBlbmFibGVzIHNlY3VyaXR5IG1hcmtpbmdzIHRvIGJlIGFwcGxpZWQgdG8KLQkgIGNvbm5lY3Rpb25zLiAgVHlwaWNhbGx5IHRoZXkgYXJlIGNvcGllZCB0byBjb25uZWN0aW9ucyBmcm9tCi0JICBwYWNrZXRzIHVzaW5nIHRoZSBDT05OU0VDTUFSSyB0YXJnZXQgYW5kIGNvcGllZCBiYWNrIGZyb20KLQkgIGNvbm5lY3Rpb25zIHRvIHBhY2tldHMgd2l0aCB0aGUgc2FtZSB0YXJnZXQsIHdpdGggdGhlIHBhY2tldHMKLQkgIGJlaW5nIG9yaWdpbmFsbHkgbGFiZWxlZCB2aWEgU0VDTUFSSy4KLQotCSAgSWYgdW5zdXJlLCBzYXkgJ04nLgotCi1jb25maWcgSVBfTkZfQ09OTlRSQUNLX0VWRU5UUwotCWJvb2wgIkNvbm5lY3Rpb24gdHJhY2tpbmcgZXZlbnRzIChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMICYmIElQX05GX0NPTk5UUkFDSwotCWhlbHAKLQkgIElmIHRoaXMgb3B0aW9uIGlzIGVuYWJsZWQsIHRoZSBjb25uZWN0aW9uIHRyYWNraW5nIGNvZGUgd2lsbAotCSAgcHJvdmlkZSBhIG5vdGlmaWVyIGNoYWluIHRoYXQgY2FuIGJlIHVzZWQgYnkgb3RoZXIga2VybmVsIGNvZGUKLQkgIHRvIGdldCBub3RpZmllZCBhYm91dCBjaGFuZ2VzIGluIHRoZSBjb25uZWN0aW9uIHRyYWNraW5nIHN0YXRlLgotCSAgCi0JICBJRiB1bnN1cmUsIHNheSBgTicuCi0KLWNvbmZpZyBJUF9ORl9DT05OVFJBQ0tfTkVUTElOSwotCXRyaXN0YXRlICdDb25uZWN0aW9uIHRyYWNraW5nIG5ldGxpbmsgaW50ZXJmYWNlIChFWFBFUklNRU5UQUwpJwotCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMICYmIElQX05GX0NPTk5UUkFDSyAmJiBORVRGSUxURVJfTkVUTElOSwotCWRlcGVuZHMgb24gSVBfTkZfQ09OTlRSQUNLIT15IHx8IE5FVEZJTFRFUl9ORVRMSU5LIT1tCi0JZGVwZW5kcyBvbiBJUF9ORl9OQVQ9biB8fCBJUF9ORl9OQVQKLQloZWxwCi0JICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIGEgbmV0bGluay1iYXNlZCB1c2Vyc3BhY2UgaW50ZXJmYWNlCi0KLQotY29uZmlnIElQX05GX0NUX1BST1RPX1NDVFAKLQl0cmlzdGF0ZSAgJ1NDVFAgcHJvdG9jb2wgY29ubmVjdGlvbiB0cmFja2luZyBzdXBwb3J0IChFWFBFUklNRU5UQUwpJwotCWRlcGVuZHMgb24gSVBfTkZfQ09OTlRSQUNLICYmIEVYUEVSSU1FTlRBTAotCWhlbHAKLQkgIFdpdGggdGhpcyBvcHRpb24gZW5hYmxlZCwgdGhlIGNvbm5lY3Rpb24gdHJhY2tpbmcgY29kZSB3aWxsCi0JICBiZSBhYmxlIHRvIGRvIHN0YXRlIHRyYWNraW5nIG9uIFNDVFAgY29ubmVjdGlvbnMuCi0KLQkgIElmIHlvdSB3YW50IHRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIHNheSBNIGhlcmUgYW5kIHJlYWQKLQkgIDxmaWxlOkRvY3VtZW50YXRpb24vbW9kdWxlcy50eHQ+LiAgSWYgdW5zdXJlLCBzYXkgYE4nLgotCi1jb25maWcgSVBfTkZfRlRQCi0JdHJpc3RhdGUgIkZUUCBwcm90b2NvbCBzdXBwb3J0IgotCWRlcGVuZHMgb24gSVBfTkZfQ09OTlRSQUNLCi0JaGVscAotCSAgVHJhY2tpbmcgRlRQIGNvbm5lY3Rpb25zIGlzIHByb2JsZW1hdGljOiBzcGVjaWFsIGhlbHBlcnMgYXJlCi0JICByZXF1aXJlZCBmb3IgdHJhY2tpbmcgdGhlbSwgYW5kIGRvaW5nIG1hc3F1ZXJhZGluZyBhbmQgb3RoZXIgZm9ybXMKLQkgIG9mIE5ldHdvcmsgQWRkcmVzcyBUcmFuc2xhdGlvbiBvbiB0aGVtLgotCi0JICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgWS4KLQotY29uZmlnIElQX05GX0lSQwotCXRyaXN0YXRlICJJUkMgcHJvdG9jb2wgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIElQX05GX0NPTk5UUkFDSwotCS0tLWhlbHAtLS0KLQkgIFRoZXJlIGlzIGEgY29tbW9ubHktdXNlZCBleHRlbnNpb24gdG8gSVJDIGNhbGxlZAotCSAgRGlyZWN0IENsaWVudC10by1DbGllbnQgUHJvdG9jb2wgKERDQykuICBUaGlzIGVuYWJsZXMgdXNlcnMgdG8gc2VuZAotCSAgZmlsZXMgdG8gZWFjaCBvdGhlciwgYW5kIGFsc28gY2hhdCB0byBlYWNoIG90aGVyIHdpdGhvdXQgdGhlIG5lZWQKLQkgIG9mIGEgc2VydmVyLiAgRENDIFNlbmRpbmcgaXMgdXNlZCBhbnl3aGVyZSB5b3Ugc2VuZCBmaWxlcyBvdmVyIElSQywKLQkgIGFuZCBEQ0MgQ2hhdCBpcyBtb3N0IGNvbW1vbmx5IHVzZWQgYnkgRWdnZHJvcCBib3RzLiAgSWYgeW91IGFyZQotCSAgdXNpbmcgTkFULCB0aGlzIGV4dGVuc2lvbiB3aWxsIGVuYWJsZSB5b3UgdG8gc2VuZCBmaWxlcyBhbmQgaW5pdGlhdGUKLQkgIGNoYXRzLiAgTm90ZSB0aGF0IHlvdSBkbyBOT1QgbmVlZCB0aGlzIGV4dGVuc2lvbiB0byBnZXQgZmlsZXMgb3IKLQkgIGhhdmUgb3RoZXJzIGluaXRpYXRlIGNoYXRzLCBvciBldmVyeXRoaW5nIGVsc2UgaW4gSVJDLgotCi0JICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgWS4KLQotY29uZmlnIElQX05GX05FVEJJT1NfTlMKLQl0cmlzdGF0ZSAiTmV0QklPUyBuYW1lIHNlcnZpY2UgcHJvdG9jb2wgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKLQlkZXBlbmRzIG9uIElQX05GX0NPTk5UUkFDSyAmJiBFWFBFUklNRU5UQUwKLQloZWxwCi0JICBOZXRCSU9TIG5hbWUgc2VydmljZSByZXF1ZXN0cyBhcmUgc2VudCBhcyBicm9hZGNhc3QgbWVzc2FnZXMgZnJvbSBhbgotCSAgdW5wcml2aWxlZ2VkIHBvcnQgYW5kIHJlc3BvbmRlZCB0byB3aXRoIHVuaWNhc3QgbWVzc2FnZXMgdG8gdGhlCi0JICBzYW1lIHBvcnQuIFRoaXMgbWFrZSB0aGVtIGhhcmQgdG8gZmlyZXdhbGwgcHJvcGVybHkgYmVjYXVzZSBjb25uZWN0aW9uCi0JICB0cmFja2luZyBkb2Vzbid0IGRlYWwgd2l0aCBicm9hZGNhc3RzLiBUaGlzIGhlbHBlciB0cmFja3MgbG9jYWxseQotCSAgb3JpZ2luYXRpbmcgTmV0QklPUyBuYW1lIHNlcnZpY2UgcmVxdWVzdHMgYW5kIHRoZSBjb3JyZXNwb25kaW5nCi0JICByZXNwb25zZXMuIEl0IHJlbGllcyBvbiBjb3JyZWN0IElQIGFkZHJlc3MgY29uZmlndXJhdGlvbiwgc3BlY2lmaWNhbGx5Ci0JICBuZXRtYXNrIGFuZCBicm9hZGNhc3QgYWRkcmVzcy4gV2hlbiBwcm9wZXJseSBjb25maWd1cmVkLCB0aGUgb3V0cHV0Ci0JICBvZiAiaXAgYWRkcmVzcyBzaG93IiBzaG91bGQgbG9vayBzaW1pbGFyIHRvIHRoaXM6Ci0KLQkgICQgaXAgLTQgYWRkcmVzcyBzaG93IGV0aDAKLQkgIDQ6IGV0aDA6IDxCUk9BRENBU1QsTVVMVElDQVNULFVQPiBtdHUgMTUwMCBxZGlzYyBwZmlmb19mYXN0IHFsZW4gMTAwMAotCSAgICAgIGluZXQgMTcyLjE2LjIuMjUyLzI0IGJyZCAxNzIuMTYuMi4yNTUgc2NvcGUgZ2xvYmFsIGV0aDAKLQkgIAotCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCi0KLWNvbmZpZyBJUF9ORl9URlRQCi0JdHJpc3RhdGUgIlRGVFAgcHJvdG9jb2wgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIElQX05GX0NPTk5UUkFDSwotCWhlbHAKLQkgIFRGVFAgY29ubmVjdGlvbiB0cmFja2luZyBoZWxwZXIsIHRoaXMgaXMgcmVxdWlyZWQgZGVwZW5kaW5nCi0JICBvbiBob3cgcmVzdHJpY3RpdmUgeW91ciBydWxlc2V0IGlzLgotCSAgSWYgeW91IGFyZSB1c2luZyBhIHRmdHAgY2xpZW50IGJlaGluZCAtaiBTTkFUIG9yIC1qIE1BU1FVRVJBRElORwotCSAgeW91IHdpbGwgbmVlZCB0aGlzLgotCi0JICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgWS4KLQotY29uZmlnIElQX05GX0FNQU5EQQotCXRyaXN0YXRlICJBbWFuZGEgYmFja3VwIHByb3RvY29sIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBJUF9ORl9DT05OVFJBQ0sKLQlzZWxlY3QgVEVYVFNFQVJDSAotCXNlbGVjdCBURVhUU0VBUkNIX0tNUAotCWhlbHAKLQkgIElmIHlvdSBhcmUgcnVubmluZyB0aGUgQW1hbmRhIGJhY2t1cCBwYWNrYWdlIDxodHRwOi8vd3d3LmFtYW5kYS5vcmcvPgotCSAgb24gdGhpcyBtYWNoaW5lIG9yIG1hY2hpbmVzIHRoYXQgd2lsbCBiZSBNQVNRVUVSQURFRCB0aHJvdWdoIHRoaXMKLQkgIG1hY2hpbmUsIHRoZW4geW91IG1heSB3YW50IHRvIGVuYWJsZSB0aGlzIGZlYXR1cmUuICBUaGlzIGFsbG93cyB0aGUKLQkgIGNvbm5lY3Rpb24gdHJhY2tpbmcgYW5kIG5hdHRpbmcgY29kZSB0byBhbGxvdyB0aGUgc3ViLWNoYW5uZWxzIHRoYXQKLQkgIEFtYW5kYSByZXF1aXJlcyBmb3IgY29tbXVuaWNhdGlvbiBvZiB0aGUgYmFja3VwIGRhdGEsIG1lc3NhZ2VzIGFuZAotCSAgaW5kZXguCi0KLQkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBZLgotCi1jb25maWcgSVBfTkZfUFBUUAotCXRyaXN0YXRlICAnUFBUUCBwcm90b2NvbCBzdXBwb3J0JwotCWRlcGVuZHMgb24gSVBfTkZfQ09OTlRSQUNLCi0JaGVscAotCSAgVGhpcyBtb2R1bGUgYWRkcyBzdXBwb3J0IGZvciBQUFRQIChQb2ludCB0byBQb2ludCBUdW5uZWxsaW5nCi0JICBQcm90b2NvbCwgUkZDMjYzNykgY29ubmVjdGlvbiB0cmFja2luZyBhbmQgTkFULiAKLQkKLQkgIElmIHlvdSBhcmUgcnVubmluZyBQUFRQIHNlc3Npb25zIG92ZXIgYSBzdGF0ZWZ1bCBmaXJld2FsbCBvciBOQVQKLQkgIGJveCwgeW91IG1heSB3YW50IHRvIGVuYWJsZSB0aGlzIGZlYXR1cmUuICAKLQkKLQkgIFBsZWFzZSBub3RlIHRoYXQgbm90IGFsbCBQUFRQIG1vZGVzIG9mIG9wZXJhdGlvbiBhcmUgc3VwcG9ydGVkIHlldC4KLQkgIEZvciBtb3JlIGluZm8sIHJlYWQgdG9wIG9mIHRoZSBmaWxlCi0JICBuZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX3BwdHAuYwotCQotCSAgSWYgeW91IHdhbnQgdG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgc2F5IE0gaGVyZSBhbmQgcmVhZAotCSAgRG9jdW1lbnRhdGlvbi9tb2R1bGVzLnR4dC4gIElmIHVuc3VyZSwgc2F5IGBOJy4KLQotY29uZmlnIElQX05GX0gzMjMKLQl0cmlzdGF0ZSAgJ0guMzIzIHByb3RvY29sIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCknCi0JZGVwZW5kcyBvbiBJUF9ORl9DT05OVFJBQ0sgJiYgRVhQRVJJTUVOVEFMCi0JaGVscAotCSAgSC4zMjMgaXMgYSBWb0lQIHNpZ25hbGxpbmcgcHJvdG9jb2wgZnJvbSBJVFUtVC4gQXMgb25lIG9mIHRoZSBtb3N0Ci0JICBpbXBvcnRhbnQgVm9JUCBwcm90b2NvbHMsIGl0IGlzIHdpZGVseSB1c2VkIGJ5IHZvaWNlIGhhcmR3YXJlIGFuZAotCSAgc29mdHdhcmUgaW5jbHVkaW5nIHZvaWNlIGdhdGV3YXlzLCBJUCBwaG9uZXMsIE5ldG1lZXRpbmcsIE9wZW5QaG9uZSwKLQkgIEdub21lbWVldGluZywgZXRjLgotCi0JICBXaXRoIHRoaXMgbW9kdWxlIHlvdSBjYW4gc3VwcG9ydCBILjMyMyBvbiBhIGNvbm5lY3Rpb24gdHJhY2tpbmcvTkFUCi0JICBmaXJld2FsbC4KLQotCSAgVGhpcyBtb2R1bGUgc3VwcG9ydHMgUkFTLCBGYXN0IFN0YXJ0LCBILjI0NSBUdW5uZWxsaW5nLCBDYWxsCi0JICBGb3J3YXJkaW5nLCBSVFAvUlRDUCBhbmQgVC4xMjAgYmFzZWQgYXVkaW8sIHZpZGVvLCBmYXgsIGNoYXQsCi0JICB3aGl0ZWJvYXJkLCBmaWxlIHRyYW5zZmVyLCBldGMuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBwbGVhc2UKLQkgIHZpc2l0IGh0dHA6Ly9uYXRoMzIzLnNvdXJjZWZvcmdlLm5ldC8uCi0KLQkgIElmIHlvdSB3YW50IHRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIHNheSAnTScgaGVyZSBhbmQgcmVhZAotCSAgRG9jdW1lbnRhdGlvbi9tb2R1bGVzLnR4dC4gIElmIHVuc3VyZSwgc2F5ICdOJy4KLQotY29uZmlnIElQX05GX1NJUAotCXRyaXN0YXRlICJTSVAgcHJvdG9jb2wgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKLQlkZXBlbmRzIG9uIElQX05GX0NPTk5UUkFDSyAmJiBFWFBFUklNRU5UQUwKLQloZWxwCi0JICBTSVAgaXMgYW4gYXBwbGljYXRpb24tbGF5ZXIgY29udHJvbCBwcm90b2NvbCB0aGF0IGNhbiBlc3RhYmxpc2gsCi0JICBtb2RpZnksIGFuZCB0ZXJtaW5hdGUgbXVsdGltZWRpYSBzZXNzaW9ucyAoY29uZmVyZW5jZXMpIHN1Y2ggYXMKLQkgIEludGVybmV0IHRlbGVwaG9ueSBjYWxscy4gV2l0aCB0aGUgaXBfY29ubnRyYWNrX3NpcCBhbmQKLQkgIHRoZSBpcF9uYXRfc2lwIG1vZHVsZXMgeW91IGNhbiBzdXBwb3J0IHRoZSBwcm90b2NvbCBvbiBhIGNvbm5lY3Rpb24KLQkgIHRyYWNraW5nL05BVGluZyBmaXJld2FsbC4KLQotCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IFkuCi0KIGNvbmZpZyBJUF9ORl9RVUVVRQogCXRyaXN0YXRlICJJUCBVc2Vyc3BhY2UgcXVldWVpbmcgdmlhIE5FVExJTksgKE9CU09MRVRFKSIKIAloZWxwCkBAIC0zNjEsMTcgKzE3OSw2IEBACiAKIAkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgogCi0jIE5BVCArIHNwZWNpZmljIHRhcmdldHM6IGlwX2Nvbm50cmFjawotY29uZmlnIElQX05GX05BVAotCXRyaXN0YXRlICJGdWxsIE5BVCIKLQlkZXBlbmRzIG9uIElQX05GX0lQVEFCTEVTICYmIElQX05GX0NPTk5UUkFDSwotCWhlbHAKLQkgIFRoZSBGdWxsIE5BVCBvcHRpb24gYWxsb3dzIG1hc3F1ZXJhZGluZywgcG9ydCBmb3J3YXJkaW5nIGFuZCBvdGhlcgotCSAgZm9ybXMgb2YgZnVsbCBOZXR3b3JrIEFkZHJlc3MgUG9ydCBUcmFuc2xhdGlvbi4gIEl0IGlzIGNvbnRyb2xsZWQgYnkKLQkgIHRoZSBgbmF0JyB0YWJsZSBpbiBpcHRhYmxlczogc2VlIHRoZSBtYW4gcGFnZSBmb3IgaXB0YWJsZXMoOCkuCi0KLQkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgotCiAjIE5BVCArIHNwZWNpZmljIHRhcmdldHM6IG5mX2Nvbm50cmFjawogY29uZmlnIE5GX05BVAogCXRyaXN0YXRlICJGdWxsIE5BVCIKQEAgLTM4MywxMSArMTkwLDYgQEAKIAogCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCiAKLWNvbmZpZyBJUF9ORl9OQVRfTkVFREVECi0JYm9vbAotCWRlcGVuZHMgb24gSVBfTkZfTkFUCi0JZGVmYXVsdCB5Ci0KIGNvbmZpZyBORl9OQVRfTkVFREVECiAJYm9vbAogCWRlcGVuZHMgb24gTkZfTkFUCkBAIC0zOTUsNyArMTk3LDcgQEAKIAogY29uZmlnIElQX05GX1RBUkdFVF9NQVNRVUVSQURFCiAJdHJpc3RhdGUgIk1BU1FVRVJBREUgdGFyZ2V0IHN1cHBvcnQiCi0JZGVwZW5kcyBvbiAoTkZfTkFUIHx8IElQX05GX05BVCkKKwlkZXBlbmRzIG9uIE5GX05BVAogCWhlbHAKIAkgIE1hc3F1ZXJhZGluZyBpcyBhIHNwZWNpYWwgY2FzZSBvZiBOQVQ6IGFsbCBvdXRnb2luZyBjb25uZWN0aW9ucyBhcmUKIAkgIGNoYW5nZWQgdG8gc2VlbSB0byBjb21lIGZyb20gYSBwYXJ0aWN1bGFyIGludGVyZmFjZSdzIGFkZHJlc3MsIGFuZApAQCAtNDA3LDcgKzIwOSw3IEBACiAKIGNvbmZpZyBJUF9ORl9UQVJHRVRfUkVESVJFQ1QKIAl0cmlzdGF0ZSAiUkVESVJFQ1QgdGFyZ2V0IHN1cHBvcnQiCi0JZGVwZW5kcyBvbiAoTkZfTkFUIHx8IElQX05GX05BVCkKKwlkZXBlbmRzIG9uIE5GX05BVAogCWhlbHAKIAkgIFJFRElSRUNUIGlzIGEgc3BlY2lhbCBjYXNlIG9mIE5BVDogYWxsIGluY29taW5nIGNvbm5lY3Rpb25zIGFyZQogCSAgbWFwcGVkIG9udG8gdGhlIGluY29taW5nIGludGVyZmFjZSdzIGFkZHJlc3MsIGNhdXNpbmcgdGhlIHBhY2tldHMgdG8KQEAgLTQxOCw3ICsyMjAsNyBAQAogCiBjb25maWcgSVBfTkZfVEFSR0VUX05FVE1BUAogCXRyaXN0YXRlICJORVRNQVAgdGFyZ2V0IHN1cHBvcnQiCi0JZGVwZW5kcyBvbiAoTkZfTkFUIHx8IElQX05GX05BVCkKKwlkZXBlbmRzIG9uIE5GX05BVAogCWhlbHAKIAkgIE5FVE1BUCBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBzdGF0aWMgMToxIE5BVCBtYXBwaW5nIG9mIG5ldHdvcmsKIAkgIGFkZHJlc3Nlcy4gSXQgbWFwcyB0aGUgbmV0d29yayBhZGRyZXNzIHBhcnQsIHdoaWxlIGtlZXBpbmcgdGhlIGhvc3QKQEAgLTQyOSwyOCArMjMxLDEzIEBACiAKIGNvbmZpZyBJUF9ORl9UQVJHRVRfU0FNRQogCXRyaXN0YXRlICJTQU1FIHRhcmdldCBzdXBwb3J0IgotCWRlcGVuZHMgb24gKE5GX05BVCB8fCBJUF9ORl9OQVQpCisJZGVwZW5kcyBvbiBORl9OQVQKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBhZGRzIGEgYFNBTUUnIHRhcmdldCwgd2hpY2ggd29ya3MgbGlrZSB0aGUgc3RhbmRhcmQgU05BVAogCSAgdGFyZ2V0LCBidXQgYXR0ZW1wdHMgdG8gZ2l2ZSBjbGllbnRzIHRoZSBzYW1lIElQIGZvciBhbGwgY29ubmVjdGlvbnMuCiAKIAkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgogCi1jb25maWcgSVBfTkZfTkFUX1NOTVBfQkFTSUMKLQl0cmlzdGF0ZSAiQmFzaWMgU05NUC1BTEcgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKLQlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTCAmJiBJUF9ORl9OQVQKLQktLS1oZWxwLS0tCi0KLQkgIFRoaXMgbW9kdWxlIGltcGxlbWVudHMgYW4gQXBwbGljYXRpb24gTGF5ZXIgR2F0ZXdheSAoQUxHKSBmb3IKLQkgIFNOTVAgcGF5bG9hZHMuICBJbiBjb25qdW5jdGlvbiB3aXRoIE5BVCwgaXQgYWxsb3dzIGEgbmV0d29yawotCSAgbWFuYWdlbWVudCBzeXN0ZW0gdG8gYWNjZXNzIG11bHRpcGxlIHByaXZhdGUgbmV0d29ya3Mgd2l0aAotCSAgY29uZmxpY3RpbmcgYWRkcmVzc2VzLiAgSXQgd29ya3MgYnkgbW9kaWZ5aW5nIElQIGFkZHJlc3NlcwotCSAgaW5zaWRlIFNOTVAgcGF5bG9hZHMgdG8gbWF0Y2ggSVAtbGF5ZXIgTkFUIG1hcHBpbmcuCi0KLQkgIFRoaXMgaXMgdGhlICJiYXNpYyIgZm9ybSBvZiBTTk1QLUFMRywgYXMgZGVzY3JpYmVkIGluIFJGQyAyOTYyCi0KLQkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgotCiBjb25maWcgTkZfTkFUX1NOTVBfQkFTSUMKIAl0cmlzdGF0ZSAiQmFzaWMgU05NUC1BTEcgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKIAlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTCAmJiBORl9OQVQKQEAgLTQ3Nyw3OCArMjY0LDM3IEBACiAJdHJpc3RhdGUKIAlkZXBlbmRzIG9uIE5GX05BVCAmJiBORl9DVF9QUk9UT19HUkUKIAotY29uZmlnIElQX05GX05BVF9GVFAKLQl0cmlzdGF0ZQotCWRlcGVuZHMgb24gSVBfTkZfSVBUQUJMRVMgJiYgSVBfTkZfQ09OTlRSQUNLICYmIElQX05GX05BVAotCWRlZmF1bHQgSVBfTkZfTkFUICYmIElQX05GX0ZUUAotCiBjb25maWcgTkZfTkFUX0ZUUAogCXRyaXN0YXRlCiAJZGVwZW5kcyBvbiBJUF9ORl9JUFRBQkxFUyAmJiBORl9DT05OVFJBQ0sgJiYgTkZfTkFUCiAJZGVmYXVsdCBORl9OQVQgJiYgTkZfQ09OTlRSQUNLX0ZUUAogCi1jb25maWcgSVBfTkZfTkFUX0lSQwotCXRyaXN0YXRlCi0JZGVwZW5kcyBvbiBJUF9ORl9JUFRBQkxFUyE9biAmJiBJUF9ORl9DT05OVFJBQ0shPW4gJiYgSVBfTkZfTkFUIT1uCi0JZGVmYXVsdCBJUF9ORl9OQVQgaWYgSVBfTkZfSVJDPXkKLQlkZWZhdWx0IG0gaWYgSVBfTkZfSVJDPW0KLQogY29uZmlnIE5GX05BVF9JUkMKIAl0cmlzdGF0ZQogCWRlcGVuZHMgb24gSVBfTkZfSVBUQUJMRVMgJiYgTkZfQ09OTlRSQUNLICYmIE5GX05BVAogCWRlZmF1bHQgTkZfTkFUICYmIE5GX0NPTk5UUkFDS19JUkMKIAotY29uZmlnIElQX05GX05BVF9URlRQCi0JdHJpc3RhdGUKLQlkZXBlbmRzIG9uIElQX05GX0lQVEFCTEVTIT1uICYmIElQX05GX0NPTk5UUkFDSyE9biAmJiBJUF9ORl9OQVQhPW4KLQlkZWZhdWx0IElQX05GX05BVCBpZiBJUF9ORl9URlRQPXkKLQlkZWZhdWx0IG0gaWYgSVBfTkZfVEZUUD1tCi0KIGNvbmZpZyBORl9OQVRfVEZUUAogCXRyaXN0YXRlCiAJZGVwZW5kcyBvbiBJUF9ORl9JUFRBQkxFUyAmJiBORl9DT05OVFJBQ0sgJiYgTkZfTkFUCiAJZGVmYXVsdCBORl9OQVQgJiYgTkZfQ09OTlRSQUNLX1RGVFAKIAotY29uZmlnIElQX05GX05BVF9BTUFOREEKLQl0cmlzdGF0ZQotCWRlcGVuZHMgb24gSVBfTkZfSVBUQUJMRVMhPW4gJiYgSVBfTkZfQ09OTlRSQUNLIT1uICYmIElQX05GX05BVCE9bgotCWRlZmF1bHQgSVBfTkZfTkFUIGlmIElQX05GX0FNQU5EQT15Ci0JZGVmYXVsdCBtIGlmIElQX05GX0FNQU5EQT1tCi0KIGNvbmZpZyBORl9OQVRfQU1BTkRBCiAJdHJpc3RhdGUKIAlkZXBlbmRzIG9uIElQX05GX0lQVEFCTEVTICYmIE5GX0NPTk5UUkFDSyAmJiBORl9OQVQKIAlkZWZhdWx0IE5GX05BVCAmJiBORl9DT05OVFJBQ0tfQU1BTkRBCiAKLWNvbmZpZyBJUF9ORl9OQVRfUFBUUAotCXRyaXN0YXRlCi0JZGVwZW5kcyBvbiBJUF9ORl9OQVQhPW4gJiYgSVBfTkZfUFBUUCE9bgotCWRlZmF1bHQgSVBfTkZfTkFUIGlmIElQX05GX1BQVFA9eQotCWRlZmF1bHQgbSBpZiBJUF9ORl9QUFRQPW0KLQogY29uZmlnIE5GX05BVF9QUFRQCiAJdHJpc3RhdGUKIAlkZXBlbmRzIG9uIElQX05GX0lQVEFCTEVTICYmIE5GX0NPTk5UUkFDSyAmJiBORl9OQVQKIAlkZWZhdWx0IE5GX05BVCAmJiBORl9DT05OVFJBQ0tfUFBUUAogCXNlbGVjdCBORl9OQVRfUFJPVE9fR1JFCiAKLWNvbmZpZyBJUF9ORl9OQVRfSDMyMwotCXRyaXN0YXRlCi0JZGVwZW5kcyBvbiBJUF9ORl9JUFRBQkxFUyE9biAmJiBJUF9ORl9DT05OVFJBQ0shPW4gJiYgSVBfTkZfTkFUIT1uCi0JZGVmYXVsdCBJUF9ORl9OQVQgaWYgSVBfTkZfSDMyMz15Ci0JZGVmYXVsdCBtIGlmIElQX05GX0gzMjM9bQotCiBjb25maWcgTkZfTkFUX0gzMjMKIAl0cmlzdGF0ZQogCWRlcGVuZHMgb24gSVBfTkZfSVBUQUJMRVMgJiYgTkZfQ09OTlRSQUNLICYmIE5GX05BVAogCWRlZmF1bHQgTkZfTkFUICYmIE5GX0NPTk5UUkFDS19IMzIzCiAKLWNvbmZpZyBJUF9ORl9OQVRfU0lQCi0JdHJpc3RhdGUKLQlkZXBlbmRzIG9uIElQX05GX0lQVEFCTEVTIT1uICYmIElQX05GX0NPTk5UUkFDSyE9biAmJiBJUF9ORl9OQVQhPW4KLQlkZWZhdWx0IElQX05GX05BVCBpZiBJUF9ORl9TSVA9eQotCWRlZmF1bHQgbSBpZiBJUF9ORl9TSVA9bQotCiBjb25maWcgTkZfTkFUX1NJUAogCXRyaXN0YXRlCiAJZGVwZW5kcyBvbiBJUF9ORl9JUFRBQkxFUyAmJiBORl9DT05OVFJBQ0sgJiYgTkZfTkFUCkBAIC02MDYsOSArMzUyLDggQEAKIGNvbmZpZyBJUF9ORl9UQVJHRVRfQ0xVU1RFUklQCiAJdHJpc3RhdGUgIkNMVVNURVJJUCB0YXJnZXQgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKIAlkZXBlbmRzIG9uIElQX05GX01BTkdMRSAmJiBFWFBFUklNRU5UQUwKLQlkZXBlbmRzIG9uIElQX05GX0NPTk5UUkFDSyB8fCBORl9DT05OVFJBQ0tfSVBWNAotCXNlbGVjdCBJUF9ORl9DT05OVFJBQ0tfTUFSSyBpZiBJUF9ORl9DT05OVFJBQ0sKLQlzZWxlY3QgTkZfQ09OTlRSQUNLX01BUksgaWYgTkZfQ09OTlRSQUNLX0lQVjQKKwlkZXBlbmRzIG9uIE5GX0NPTk5UUkFDS19JUFY0CisJc2VsZWN0IE5GX0NPTk5UUkFDS19NQVJLCiAJaGVscAogCSAgVGhlIENMVVNURVJJUCB0YXJnZXQgYWxsb3dzIHlvdSB0byBidWlsZCBsb2FkLWJhbGFuY2luZyBjbHVzdGVycyBvZgogCSAgbmV0d29yayBzZXJ2ZXJzIHdpdGhvdXQgaGF2aW5nIGEgZGVkaWNhdGVkIGxvYWQtYmFsYW5jaW5nCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvTWFrZWZpbGUgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvTWFrZWZpbGUKaW5kZXggNjYyNWVjNi4uNDA5ZDI3MyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL01ha2VmaWxlCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9NYWtlZmlsZQpAQCAtMiw4ICsyLDYgQEAKICMgTWFrZWZpbGUgZm9yIHRoZSBuZXRmaWx0ZXIgbW9kdWxlcyBvbiB0b3Agb2YgSVB2NC4KICMKIAotIyBvYmplY3RzIGZvciB0aGUgc3RhbmRhbG9uZSAtIGNvbm5lY3Rpb24gdHJhY2tpbmcgLyBOQVQKLWlwX2Nvbm50cmFjay1vYmpzCTo9IGlwX2Nvbm50cmFja19zdGFuZGFsb25lLm8gaXBfY29ubnRyYWNrX2NvcmUubyBpcF9jb25udHJhY2tfcHJvdG9fZ2VuZXJpYy5vIGlwX2Nvbm50cmFja19wcm90b190Y3AubyBpcF9jb25udHJhY2tfcHJvdG9fdWRwLm8gaXBfY29ubnRyYWNrX3Byb3RvX2ljbXAubwogIyBvYmplY3RzIGZvciBsMyBpbmRlcGVuZGVudCBjb25udHJhY2sKIG5mX2Nvbm50cmFja19pcHY0LW9ianMgIDo9ICBuZl9jb25udHJhY2tfbDNwcm90b19pcHY0Lm8gbmZfY29ubnRyYWNrX3Byb3RvX2ljbXAubwogaWZlcSAoJChDT05GSUdfTkZfQ09OTlRSQUNLX1BST0NfQ09NUEFUKSx5KQpAQCAtMTIsNTMgKzEwLDE0IEBACiBlbmRpZgogZW5kaWYKIAotaXBfbmF0LW9ianMJOj0gaXBfbmF0X2NvcmUubyBpcF9uYXRfaGVscGVyLm8gaXBfbmF0X3Byb3RvX3Vua25vd24ubyBpcF9uYXRfcHJvdG9fdGNwLm8gaXBfbmF0X3Byb3RvX3VkcC5vIGlwX25hdF9wcm90b19pY21wLm8KLW5mX25hdC1vYmpzCTo9IG5mX25hdF9jb3JlLm8gbmZfbmF0X2hlbHBlci5vIG5mX25hdF9wcm90b191bmtub3duLm8gbmZfbmF0X3Byb3RvX3RjcC5vIG5mX25hdF9wcm90b191ZHAubyBuZl9uYXRfcHJvdG9faWNtcC5vCi1pZm5lcSAoJChDT05GSUdfTkZfTkFUKSwpCituZl9uYXQtb2JqcwkJOj0gbmZfbmF0X2NvcmUubyBuZl9uYXRfaGVscGVyLm8gbmZfbmF0X3Byb3RvX3Vua25vd24ubyBuZl9uYXRfcHJvdG9fdGNwLm8gbmZfbmF0X3Byb3RvX3VkcC5vIG5mX25hdF9wcm90b19pY21wLm8KIGlwdGFibGVfbmF0LW9ianMJOj0gbmZfbmF0X3J1bGUubyBuZl9uYXRfc3RhbmRhbG9uZS5vCi1lbHNlCi1pcHRhYmxlX25hdC1vYmpzCTo9IGlwX25hdF9ydWxlLm8gaXBfbmF0X3N0YW5kYWxvbmUubwotZW5kaWYKLQotaXBfY29ubnRyYWNrX3BwdHAtb2Jqcwk6PSBpcF9jb25udHJhY2tfaGVscGVyX3BwdHAubyBpcF9jb25udHJhY2tfcHJvdG9fZ3JlLm8KLWlwX25hdF9wcHRwLW9ianMJOj0gaXBfbmF0X2hlbHBlcl9wcHRwLm8gaXBfbmF0X3Byb3RvX2dyZS5vCi0KLWlwX2Nvbm50cmFja19oMzIzLW9ianMgOj0gaXBfY29ubnRyYWNrX2hlbHBlcl9oMzIzLm8gLi4vLi4vbmV0ZmlsdGVyL25mX2Nvbm50cmFja19oMzIzX2FzbjEubwotaXBfbmF0X2gzMjMtb2JqcyA6PSBpcF9uYXRfaGVscGVyX2gzMjMubwogCiAjIGNvbm5lY3Rpb24gdHJhY2tpbmcKLW9iai0kKENPTkZJR19JUF9ORl9DT05OVFJBQ0spICs9IGlwX2Nvbm50cmFjay5vCiBvYmotJChDT05GSUdfTkZfQ09OTlRSQUNLX0lQVjQpICs9IG5mX2Nvbm50cmFja19pcHY0Lm8KIAotb2JqLSQoQ09ORklHX0lQX05GX05BVCkgKz0gaXBfbmF0Lm8KIG9iai0kKENPTkZJR19ORl9OQVQpICs9IG5mX25hdC5vCiAKLSMgY29ubnRyYWNrIG5ldGxpbmsgaW50ZXJmYWNlCi1vYmotJChDT05GSUdfSVBfTkZfQ09OTlRSQUNLX05FVExJTkspICs9IGlwX2Nvbm50cmFja19uZXRsaW5rLm8KLQotCi0jIFNDVFAgcHJvdG9jb2wgY29ubmVjdGlvbiB0cmFja2luZwotb2JqLSQoQ09ORklHX0lQX05GX0NUX1BST1RPX1NDVFApICs9IGlwX2Nvbm50cmFja19wcm90b19zY3RwLm8KLQotIyBjb25uZWN0aW9uIHRyYWNraW5nIGhlbHBlcnMKLW9iai0kKENPTkZJR19JUF9ORl9IMzIzKSArPSBpcF9jb25udHJhY2tfaDMyMy5vCi1vYmotJChDT05GSUdfSVBfTkZfUFBUUCkgKz0gaXBfY29ubnRyYWNrX3BwdHAubwotb2JqLSQoQ09ORklHX0lQX05GX0FNQU5EQSkgKz0gaXBfY29ubnRyYWNrX2FtYW5kYS5vCi1vYmotJChDT05GSUdfSVBfTkZfVEZUUCkgKz0gaXBfY29ubnRyYWNrX3RmdHAubwotb2JqLSQoQ09ORklHX0lQX05GX0ZUUCkgKz0gaXBfY29ubnRyYWNrX2Z0cC5vCi1vYmotJChDT05GSUdfSVBfTkZfSVJDKSArPSBpcF9jb25udHJhY2tfaXJjLm8KLW9iai0kKENPTkZJR19JUF9ORl9TSVApICs9IGlwX2Nvbm50cmFja19zaXAubwotb2JqLSQoQ09ORklHX0lQX05GX05FVEJJT1NfTlMpICs9IGlwX2Nvbm50cmFja19uZXRiaW9zX25zLm8KLQotIyBOQVQgaGVscGVycyAoaXBfY29ubnRyYWNrKQotb2JqLSQoQ09ORklHX0lQX05GX05BVF9IMzIzKSArPSBpcF9uYXRfaDMyMy5vCi1vYmotJChDT05GSUdfSVBfTkZfTkFUX1BQVFApICs9IGlwX25hdF9wcHRwLm8KLW9iai0kKENPTkZJR19JUF9ORl9OQVRfQU1BTkRBKSArPSBpcF9uYXRfYW1hbmRhLm8KLW9iai0kKENPTkZJR19JUF9ORl9OQVRfVEZUUCkgKz0gaXBfbmF0X3RmdHAubwotb2JqLSQoQ09ORklHX0lQX05GX05BVF9GVFApICs9IGlwX25hdF9mdHAubwotb2JqLSQoQ09ORklHX0lQX05GX05BVF9JUkMpICs9IGlwX25hdF9pcmMubwotb2JqLSQoQ09ORklHX0lQX05GX05BVF9TSVApICs9IGlwX25hdF9zaXAubwotCiAjIE5BVCBoZWxwZXJzIChuZl9jb25udHJhY2spCiBvYmotJChDT05GSUdfTkZfTkFUX0FNQU5EQSkgKz0gbmZfbmF0X2FtYW5kYS5vCiBvYmotJChDT05GSUdfTkZfTkFUX0ZUUCkgKz0gbmZfbmF0X2Z0cC5vCkBAIC03OCw3ICszNyw2IEBACiAjIHRoZSB0aHJlZSBpbnN0YW5jZXMgb2YgaXBfdGFibGVzCiBvYmotJChDT05GSUdfSVBfTkZfRklMVEVSKSArPSBpcHRhYmxlX2ZpbHRlci5vCiBvYmotJChDT05GSUdfSVBfTkZfTUFOR0xFKSArPSBpcHRhYmxlX21hbmdsZS5vCi1vYmotJChDT05GSUdfSVBfTkZfTkFUKSArPSBpcHRhYmxlX25hdC5vCiBvYmotJChDT05GSUdfTkZfTkFUKSArPSBpcHRhYmxlX25hdC5vCiBvYmotJChDT05GSUdfSVBfTkZfUkFXKSArPSBpcHRhYmxlX3Jhdy5vCiAKQEAgLTEwMCw3ICs1OCw2IEBACiBvYmotJChDT05GSUdfSVBfTkZfVEFSR0VUX1JFRElSRUNUKSArPSBpcHRfUkVESVJFQ1Qubwogb2JqLSQoQ09ORklHX0lQX05GX1RBUkdFVF9ORVRNQVApICs9IGlwdF9ORVRNQVAubwogb2JqLSQoQ09ORklHX0lQX05GX1RBUkdFVF9TQU1FKSArPSBpcHRfU0FNRS5vCi1vYmotJChDT05GSUdfSVBfTkZfTkFUX1NOTVBfQkFTSUMpICs9IGlwX25hdF9zbm1wX2Jhc2ljLm8KIG9iai0kKENPTkZJR19JUF9ORl9UQVJHRVRfTE9HKSArPSBpcHRfTE9HLm8KIG9iai0kKENPTkZJR19JUF9ORl9UQVJHRVRfVUxPRykgKz0gaXB0X1VMT0cubwogb2JqLSQoQ09ORklHX0lQX05GX1RBUkdFVF9DTFVTVEVSSVApICs9IGlwdF9DTFVTVEVSSVAubwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2FycF90YWJsZXMuYyBiL25ldC9pcHY0L25ldGZpbHRlci9hcnBfdGFibGVzLmMKaW5kZXggNTdiMDIyMS4uY2FlNDEyMSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2FycF90YWJsZXMuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvYXJwX3RhYmxlcy5jCkBAIC0yNDUsNyArMjQ1LDcgQEAKIAllID0gZ2V0X2VudHJ5KHRhYmxlX2Jhc2UsIHByaXZhdGUtPmhvb2tfZW50cnlbaG9va10pOwogCWJhY2sgPSBnZXRfZW50cnkodGFibGVfYmFzZSwgcHJpdmF0ZS0+dW5kZXJmbG93W2hvb2tdKTsKIAotCWFycCA9ICgqcHNrYiktPm5oLmFycGg7CisJYXJwID0gYXJwX2hkcigqcHNrYik7CiAJZG8gewogCQlpZiAoYXJwX3BhY2tldF9tYXRjaChhcnAsICgqcHNrYiktPmRldiwgaW5kZXYsIG91dGRldiwgJmUtPmFycCkpIHsKIAkJCXN0cnVjdCBhcnB0X2VudHJ5X3RhcmdldCAqdDsKQEAgLTI5Nyw3ICsyOTcsNyBAQAogCQkJCQkJCQkgICAgIHQtPmRhdGEpOwogCiAJCQkJLyogVGFyZ2V0IG1pZ2h0IGhhdmUgY2hhbmdlZCBzdHVmZi4gKi8KLQkJCQlhcnAgPSAoKnBza2IpLT5uaC5hcnBoOworCQkJCWFycCA9IGFycF9oZHIoKnBza2IpOwogCiAJCQkJaWYgKHZlcmRpY3QgPT0gQVJQVF9DT05USU5VRSkKIAkJCQkJZSA9ICh2b2lkICopZSArIGUtPm5leHRfb2Zmc2V0OwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2FycHRfbWFuZ2xlLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvYXJwdF9tYW5nbGUuYwppbmRleCA3MDlkYjRkLi42Mjk4ZDQwIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvYXJwdF9tYW5nbGUuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvYXJwdF9tYW5nbGUuYwpAQCAtMzAsMzUgKzMwLDM1IEBACiAJCSpwc2tiID0gbnNrYjsKIAl9CiAKLQlhcnAgPSAoKnBza2IpLT5uaC5hcnBoOwotCWFycHB0ciA9ICgqcHNrYiktPm5oLnJhdyArIHNpemVvZigqYXJwKTsKKwlhcnAgPSBhcnBfaGRyKCpwc2tiKTsKKwlhcnBwdHIgPSBza2JfbmV0d29ya19oZWFkZXIoKnBza2IpICsgc2l6ZW9mKCphcnApOwogCXBsbiA9IGFycC0+YXJfcGxuOwogCWhsbiA9IGFycC0+YXJfaGxuOwogCS8qIFdlIGFzc3VtZSB0aGF0IHBsbiBhbmQgaGxuIHdlcmUgY2hlY2tlZCBpbiB0aGUgbWF0Y2ggKi8KIAlpZiAobWFuZ2xlLT5mbGFncyAmIEFSUFRfTUFOR0xFX1NERVYpIHsKIAkJaWYgKEFSUFRfREVWX0FERFJfTEVOX01BWCA8IGhsbiB8fAotCQkgICAoYXJwcHRyICsgaGxuID4gKCoqcHNrYikudGFpbCkpCisJCSAgIChhcnBwdHIgKyBobG4gPiBza2JfdGFpbF9wb2ludGVyKCpwc2tiKSkpCiAJCQlyZXR1cm4gTkZfRFJPUDsKIAkJbWVtY3B5KGFycHB0ciwgbWFuZ2xlLT5zcmNfZGV2YWRkciwgaGxuKTsKIAl9CiAJYXJwcHRyICs9IGhsbjsKIAlpZiAobWFuZ2xlLT5mbGFncyAmIEFSUFRfTUFOR0xFX1NJUCkgewogCQlpZiAoQVJQVF9NQU5HTEVfQUREUl9MRU5fTUFYIDwgcGxuIHx8Ci0JCSAgIChhcnBwdHIgKyBwbG4gPiAoKipwc2tiKS50YWlsKSkKKwkJICAgKGFycHB0ciArIHBsbiA+IHNrYl90YWlsX3BvaW50ZXIoKnBza2IpKSkKIAkJCXJldHVybiBORl9EUk9QOwogCQltZW1jcHkoYXJwcHRyLCAmbWFuZ2xlLT51X3Muc3JjX2lwLCBwbG4pOwogCX0KIAlhcnBwdHIgKz0gcGxuOwogCWlmIChtYW5nbGUtPmZsYWdzICYgQVJQVF9NQU5HTEVfVERFVikgewogCQlpZiAoQVJQVF9ERVZfQUREUl9MRU5fTUFYIDwgaGxuIHx8Ci0JCSAgIChhcnBwdHIgKyBobG4gPiAoKipwc2tiKS50YWlsKSkKKwkJICAgKGFycHB0ciArIGhsbiA+IHNrYl90YWlsX3BvaW50ZXIoKnBza2IpKSkKIAkJCXJldHVybiBORl9EUk9QOwogCQltZW1jcHkoYXJwcHRyLCBtYW5nbGUtPnRndF9kZXZhZGRyLCBobG4pOwogCX0KIAlhcnBwdHIgKz0gaGxuOwogCWlmIChtYW5nbGUtPmZsYWdzICYgQVJQVF9NQU5HTEVfVElQKSB7CiAJCWlmIChBUlBUX01BTkdMRV9BRERSX0xFTl9NQVggPCBwbG4gfHwKLQkJICAgKGFycHB0ciArIHBsbiA+ICgqKnBza2IpLnRhaWwpKQorCQkgICAoYXJwcHRyICsgcGxuID4gc2tiX3RhaWxfcG9pbnRlcigqcHNrYikpKQogCQkJcmV0dXJuIE5GX0RST1A7CiAJCW1lbWNweShhcnBwdHIsICZtYW5nbGUtPnVfdC50Z3RfaXAsIHBsbik7CiAJfQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19hbWFuZGEuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfYW1hbmRhLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmNTYxZjUuLjAwMDAwMDAKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19hbWFuZGEuYworKysgL2Rldi9udWxsCkBAIC0xLDIyOSArMCwwIEBACi0vKiBBbWFuZGEgZXh0ZW5zaW9uIGZvciBJUCBjb25uZWN0aW9uIHRyYWNraW5nLCBWZXJzaW9uIDAuMgotICogKEMpIDIwMDIgYnkgQnJpYW4gSi4gTXVycmVsbCA8bmV0ZmlsdGVyQGludGVybGlueC5iYy5jYT4KLSAqIGJhc2VkIG9uIEhXJ3MgaXBfY29ubnRyYWNrX2lyYy5jIGFzIHdlbGwgYXMgb3RoZXIgbW9kdWxlcwotICoKLSAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqICAgICAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKglNb2R1bGUgbG9hZCBzeW50YXg6Ci0gKiAJaW5zbW9kIGlwX2Nvbm50cmFja19hbWFuZGEubyBbbWFzdGVyX3RpbWVvdXQ9bl0KLSAqCi0gKglXaGVyZSBtYXN0ZXJfdGltZW91dCBpcyB0aGUgdGltZW91dCAoaW4gc2Vjb25kcykgb2YgdGhlIG1hc3RlcgotICoJY29ubmVjdGlvbiAocG9ydCAxMDA4MCkuICBUaGlzIGRlZmF1bHRzIHRvIDUgbWludXRlcyBidXQgaWYKLSAqCXlvdXIgY2xpZW50cyB0YWtlIGxvbmdlciB0aGFuIDUgbWludXRlcyB0byBkbyB0aGVpciB3b3JrCi0gKgliZWZvcmUgZ2V0dGluZyBiYWNrIHRvIHRoZSBBbWFuZGEgc2VydmVyLCB5b3UgY2FuIGluY3JlYXNlCi0gKgl0aGlzIHZhbHVlLgotICoKLSAqLwotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+Ci0jaW5jbHVkZSA8bGludXgvdGV4dHNlYXJjaC5oPgotI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotI2luY2x1ZGUgPGxpbnV4L2luLmg+Ci0jaW5jbHVkZSA8bGludXgvaXAuaD4KLSNpbmNsdWRlIDxsaW51eC91ZHAuaD4KLQotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19oZWxwZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfYW1hbmRhLmg+Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgbWFzdGVyX3RpbWVvdXQgPSAzMDA7Ci1zdGF0aWMgY2hhciAqdHNfYWxnbyA9ICJrbXAiOwotCi1NT0RVTEVfQVVUSE9SKCJCcmlhbiBKLiBNdXJyZWxsIDxuZXRmaWx0ZXJAaW50ZXJsaW54LmJjLmNhPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJBbWFuZGEgY29ubmVjdGlvbiB0cmFja2luZyBtb2R1bGUiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLW1vZHVsZV9wYXJhbShtYXN0ZXJfdGltZW91dCwgdWludCwgMDYwMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKG1hc3Rlcl90aW1lb3V0LCAidGltZW91dCBmb3IgdGhlIG1hc3RlciBjb25uZWN0aW9uIik7Ci1tb2R1bGVfcGFyYW0odHNfYWxnbywgY2hhcnAsIDA0MDApOwotTU9EVUxFX1BBUk1fREVTQyh0c19hbGdvLCAidGV4dHNlYXJjaCBhbGdvcml0aG0gdG8gdXNlIChkZWZhdWx0IGttcCkiKTsKLQotdW5zaWduZWQgaW50ICgqaXBfbmF0X2FtYW5kYV9ob29rKShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCi0JCQkJICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCi0JCQkJICAgdW5zaWduZWQgaW50IG1hdGNob2ZmLAotCQkJCSAgIHVuc2lnbmVkIGludCBtYXRjaGxlbiwKLQkJCQkgICBzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqZXhwKTsKLUVYUE9SVF9TWU1CT0xfR1BMKGlwX25hdF9hbWFuZGFfaG9vayk7Ci0KLWVudW0gYW1hbmRhX3N0cmluZ3MgewotCVNFQVJDSF9DT05ORUNULAotCVNFQVJDSF9ORVdMSU5FLAotCVNFQVJDSF9EQVRBLAotCVNFQVJDSF9NRVNHLAotCVNFQVJDSF9JTkRFWCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgewotCWNoYXIJCQkqc3RyaW5nOwotCXNpemVfdAkJCWxlbjsKLQlzdHJ1Y3QgdHNfY29uZmlnCSp0czsKLX0gc2VhcmNoW10gPSB7Ci0JW1NFQVJDSF9DT05ORUNUXSA9IHsKLQkJLnN0cmluZwk9ICJDT05ORUNUICIsCi0JCS5sZW4JPSA4LAotCX0sCi0JW1NFQVJDSF9ORVdMSU5FXSA9IHsKLQkJLnN0cmluZwk9ICJcbiIsCi0JCS5sZW4JPSAxLAotCX0sCi0JW1NFQVJDSF9EQVRBXSA9IHsKLQkJLnN0cmluZwk9ICJEQVRBICIsCi0JCS5sZW4JPSA1LAotCX0sCi0JW1NFQVJDSF9NRVNHXSA9IHsKLQkJLnN0cmluZwk9ICJNRVNHICIsCi0JCS5sZW4JPSA1LAotCX0sCi0JW1NFQVJDSF9JTkRFWF0gPSB7Ci0JCS5zdHJpbmcgPSAiSU5ERVggIiwKLQkJLmxlbgk9IDYsCi0JfSwKLX07Ci0KLXN0YXRpYyBpbnQgaGVscChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCi0JCXN0cnVjdCBpcF9jb25udHJhY2sgKmN0LCBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbykKLXsKLQlzdHJ1Y3QgdHNfc3RhdGUgdHM7Ci0Jc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmV4cDsKLQl1bnNpZ25lZCBpbnQgZGF0YW9mZiwgc3RhcnQsIHN0b3AsIG9mZiwgaTsKLQljaGFyIHBidWZbc2l6ZW9mKCI2NTUzNSIpXSwgKnRtcDsKLQl1X2ludDE2X3QgcG9ydCwgbGVuOwotCWludCByZXQgPSBORl9BQ0NFUFQ7Ci0JdHlwZW9mKGlwX25hdF9hbWFuZGFfaG9vaykgaXBfbmF0X2FtYW5kYTsKLQotCS8qIE9ubHkgbG9vayBhdCBwYWNrZXRzIGZyb20gdGhlIEFtYW5kYSBzZXJ2ZXIgKi8KLQlpZiAoQ1RJTkZPMkRJUihjdGluZm8pID09IElQX0NUX0RJUl9PUklHSU5BTCkKLQkJcmV0dXJuIE5GX0FDQ0VQVDsKLQotCS8qIGluY3JlYXNlIHRoZSBVRFAgdGltZW91dCBvZiB0aGUgbWFzdGVyIGNvbm5lY3Rpb24gYXMgcmVwbGllcyBmcm9tCi0JICogQW1hbmRhIGNsaWVudHMgdG8gdGhlIHNlcnZlciBjYW4gYmUgcXVpdGUgZGVsYXllZCAqLwotCWlwX2N0X3JlZnJlc2goY3QsICpwc2tiLCBtYXN0ZXJfdGltZW91dCAqIEhaKTsKLQotCS8qIE5vIGRhdGE/ICovCi0JZGF0YW9mZiA9ICgqcHNrYiktPm5oLmlwaC0+aWhsKjQgKyBzaXplb2Yoc3RydWN0IHVkcGhkcik7Ci0JaWYgKGRhdGFvZmYgPj0gKCpwc2tiKS0+bGVuKSB7Ci0JCWlmIChuZXRfcmF0ZWxpbWl0KCkpCi0JCQlwcmludGsoImFtYW5kYV9oZWxwOiBza2JsZW4gPSAldVxuIiwgKCpwc2tiKS0+bGVuKTsKLQkJcmV0dXJuIE5GX0FDQ0VQVDsKLQl9Ci0KLQltZW1zZXQoJnRzLCAwLCBzaXplb2YodHMpKTsKLQlzdGFydCA9IHNrYl9maW5kX3RleHQoKnBza2IsIGRhdGFvZmYsICgqcHNrYiktPmxlbiwKLQkJCSAgICAgIHNlYXJjaFtTRUFSQ0hfQ09OTkVDVF0udHMsICZ0cyk7Ci0JaWYgKHN0YXJ0ID09IFVJTlRfTUFYKQotCQlnb3RvIG91dDsKLQlzdGFydCArPSBkYXRhb2ZmICsgc2VhcmNoW1NFQVJDSF9DT05ORUNUXS5sZW47Ci0KLQltZW1zZXQoJnRzLCAwLCBzaXplb2YodHMpKTsKLQlzdG9wID0gc2tiX2ZpbmRfdGV4dCgqcHNrYiwgc3RhcnQsICgqcHNrYiktPmxlbiwKLQkJCSAgICAgc2VhcmNoW1NFQVJDSF9ORVdMSU5FXS50cywgJnRzKTsKLQlpZiAoc3RvcCA9PSBVSU5UX01BWCkKLQkJZ290byBvdXQ7Ci0Jc3RvcCArPSBzdGFydDsKLQotCWZvciAoaSA9IFNFQVJDSF9EQVRBOyBpIDw9IFNFQVJDSF9JTkRFWDsgaSsrKSB7Ci0JCW1lbXNldCgmdHMsIDAsIHNpemVvZih0cykpOwotCQlvZmYgPSBza2JfZmluZF90ZXh0KCpwc2tiLCBzdGFydCwgc3RvcCwgc2VhcmNoW2ldLnRzLCAmdHMpOwotCQlpZiAob2ZmID09IFVJTlRfTUFYKQotCQkJY29udGludWU7Ci0JCW9mZiArPSBzdGFydCArIHNlYXJjaFtpXS5sZW47Ci0KLQkJbGVuID0gbWluX3QodW5zaWduZWQgaW50LCBzaXplb2YocGJ1ZikgLSAxLCBzdG9wIC0gb2ZmKTsKLQkJaWYgKHNrYl9jb3B5X2JpdHMoKnBza2IsIG9mZiwgcGJ1ZiwgbGVuKSkKLQkJCWJyZWFrOwotCQlwYnVmW2xlbl0gPSAnXDAnOwotCi0JCXBvcnQgPSBzaW1wbGVfc3RydG91bChwYnVmLCAmdG1wLCAxMCk7Ci0JCWxlbiA9IHRtcCAtIHBidWY7Ci0JCWlmIChwb3J0ID09IDAgfHwgbGVuID4gNSkKLQkJCWJyZWFrOwotCi0JCWV4cCA9IGlwX2Nvbm50cmFja19leHBlY3RfYWxsb2MoY3QpOwotCQlpZiAoZXhwID09IE5VTEwpIHsKLQkJCXJldCA9IE5GX0RST1A7Ci0JCQlnb3RvIG91dDsKLQkJfQotCi0JCWV4cC0+ZXhwZWN0Zm4gPSBOVUxMOwotCQlleHAtPmZsYWdzID0gMDsKLQotCQlleHAtPnR1cGxlLnNyYy5pcCA9IGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZS5zcmMuaXA7Ci0JCWV4cC0+dHVwbGUuc3JjLnUudGNwLnBvcnQgPSAwOwotCQlleHAtPnR1cGxlLmRzdC5pcCA9IGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZS5kc3QuaXA7Ci0JCWV4cC0+dHVwbGUuZHN0LnByb3RvbnVtID0gSVBQUk9UT19UQ1A7Ci0JCWV4cC0+dHVwbGUuZHN0LnUudGNwLnBvcnQgPSBodG9ucyhwb3J0KTsKLQotCQlleHAtPm1hc2suc3JjLmlwID0gaHRvbmwoMHhGRkZGRkZGRik7Ci0JCWV4cC0+bWFzay5zcmMudS50Y3AucG9ydCA9IDA7Ci0JCWV4cC0+bWFzay5kc3QuaXAgPSBodG9ubCgweEZGRkZGRkZGKTsKLQkJZXhwLT5tYXNrLmRzdC5wcm90b251bSA9IDB4RkY7Ci0JCWV4cC0+bWFzay5kc3QudS50Y3AucG9ydCA9IGh0b25zKDB4RkZGRik7Ci0KLQkJLyogUkNVIHJlYWQgbG9ja2VkIGJ5IG5mX2hvb2tfc2xvdyAqLwotCQlpcF9uYXRfYW1hbmRhID0gcmN1X2RlcmVmZXJlbmNlKGlwX25hdF9hbWFuZGFfaG9vayk7Ci0JCWlmIChpcF9uYXRfYW1hbmRhKQotCQkJcmV0ID0gaXBfbmF0X2FtYW5kYShwc2tiLCBjdGluZm8sIG9mZiAtIGRhdGFvZmYsCi0JCQkJCSAgICBsZW4sIGV4cCk7Ci0JCWVsc2UgaWYgKGlwX2Nvbm50cmFja19leHBlY3RfcmVsYXRlZChleHApICE9IDApCi0JCQlyZXQgPSBORl9EUk9QOwotCQlpcF9jb25udHJhY2tfZXhwZWN0X3B1dChleHApOwotCX0KLQotb3V0OgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXBfY29ubnRyYWNrX2hlbHBlciBhbWFuZGFfaGVscGVyID0gewotCS5tYXhfZXhwZWN0ZWQgPSAzLAotCS50aW1lb3V0ID0gMTgwLAotCS5tZSA9IFRISVNfTU9EVUxFLAotCS5oZWxwID0gaGVscCwKLQkubmFtZSA9ICJhbWFuZGEiLAotCi0JLnR1cGxlID0geyAuc3JjID0geyAudSA9IHsgLnVkcCA9IHsucG9ydCA9IF9fY29uc3RhbnRfaHRvbnMoMTAwODApIH0gfSB9LAotCQkgICAuZHN0ID0geyAucHJvdG9udW0gPSBJUFBST1RPX1VEUCB9LAotCX0sCi0JLm1hc2sgPSB7IC5zcmMgPSB7IC51ID0geyAweEZGRkYgfSB9LAotCQkgLmRzdCA9IHsgLnByb3RvbnVtID0gMHhGRiB9LAotCX0sCi19OwotCi1zdGF0aWMgdm9pZCBfX2V4aXQgaXBfY29ubnRyYWNrX2FtYW5kYV9maW5pKHZvaWQpCi17Ci0JaW50IGk7Ci0KLQlpcF9jb25udHJhY2tfaGVscGVyX3VucmVnaXN0ZXIoJmFtYW5kYV9oZWxwZXIpOwotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNlYXJjaCk7IGkrKykKLQkJdGV4dHNlYXJjaF9kZXN0cm95KHNlYXJjaFtpXS50cyk7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IGlwX2Nvbm50cmFja19hbWFuZGFfaW5pdCh2b2lkKQotewotCWludCByZXQsIGk7Ci0KLQlyZXQgPSAtRU5PTUVNOwotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNlYXJjaCk7IGkrKykgewotCQlzZWFyY2hbaV0udHMgPSB0ZXh0c2VhcmNoX3ByZXBhcmUodHNfYWxnbywgc2VhcmNoW2ldLnN0cmluZywKLQkJCQkJCSAgc2VhcmNoW2ldLmxlbiwKLQkJCQkJCSAgR0ZQX0tFUk5FTCwgVFNfQVVUT0xPQUQpOwotCQlpZiAoc2VhcmNoW2ldLnRzID09IE5VTEwpCi0JCQlnb3RvIGVycjsKLQl9Ci0JcmV0ID0gaXBfY29ubnRyYWNrX2hlbHBlcl9yZWdpc3RlcigmYW1hbmRhX2hlbHBlcik7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gZXJyOwotCXJldHVybiAwOwotCi1lcnI6Ci0JZm9yICg7IGkgPj0gMDsgaS0tKSB7Ci0JCWlmIChzZWFyY2hbaV0udHMpCi0JCQl0ZXh0c2VhcmNoX2Rlc3Ryb3koc2VhcmNoW2ldLnRzKTsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotbW9kdWxlX2luaXQoaXBfY29ubnRyYWNrX2FtYW5kYV9pbml0KTsKLW1vZHVsZV9leGl0KGlwX2Nvbm50cmFja19hbWFuZGFfZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX2NvcmUuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfY29yZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2I5OWFlLi4wMDAwMDAwCi0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfY29yZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTU1MCArMCwwIEBACi0vKiBDb25uZWN0aW9uIHN0YXRlIHRyYWNraW5nIGZvciBuZXRmaWx0ZXIuICBUaGlzIGlzIHNlcGFyYXRlZCBmcm9tLAotICAgYnV0IHJlcXVpcmVkIGJ5LCB0aGUgTkFUIGxheWVyOyBpdCBjYW4gYWxzbyBiZSB1c2VkIGJ5IGFuIGlwdGFibGVzCi0gICBleHRlbnNpb24uICovCi0KLS8qIChDKSAxOTk5LTIwMDEgUGF1bCBgUnVzdHknIFJ1c3NlbGwKLSAqIChDKSAyMDAyLTIwMDQgTmV0ZmlsdGVyIENvcmUgVGVhbSA8Y29yZXRlYW1AbmV0ZmlsdGVyLm9yZz4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIDIzIEFwciAyMDAxOiBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgotICogCS0gbmV3IEFQSSBhbmQgaGFuZGxpbmcgb2YgY29ubnRyYWNrL25hdCBoZWxwZXJzCi0gKiAJLSBub3cgY2FwYWJsZSBvZiBtdWx0aXBsZSBleHBlY3RhdGlvbnMgZm9yIG9uZSBtYXN0ZXIKLSAqIDE2IEp1bCAyMDAyOiBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgotICogCS0gYWRkIHVzYWdlL3JlZmVyZW5jZSBjb3VudHMgdG8gaXBfY29ubnRyYWNrX2V4cGVjdAotICoJLSBleHBvcnQgaXBfY29ubnRyYWNrW19leHBlY3RdX3tmaW5kX2dldCxwdXR9IGZ1bmN0aW9ucwotICogKi8KLQotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvaWNtcC5oPgotI2luY2x1ZGUgPGxpbnV4L2lwLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLSNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgotI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgotI2luY2x1ZGUgPG5ldC9pcC5oPgotI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgotI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KLSNpbmNsdWRlIDxsaW51eC9qaGFzaC5oPgotI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+Ci0jaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KLQotLyogaXBfY29ubnRyYWNrX2xvY2sgcHJvdGVjdHMgdGhlIG1haW4gaGFzaCB0YWJsZSwgcHJvdG9jb2wvaGVscGVyL2V4cGVjdGVkCi0gICByZWdpc3RyYXRpb25zLCBjb25udHJhY2sgdGltZXJzKi8KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2suaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfcHJvdG9jb2wuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfaGVscGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2NvcmUuaD4KLQotI2RlZmluZSBJUF9DT05OVFJBQ0tfVkVSU0lPTgkiMi40IgotCi0jaWYgMAotI2RlZmluZSBERUJVR1AgcHJpbnRrCi0jZWxzZQotI2RlZmluZSBERUJVR1AoZm9ybWF0LCBhcmdzLi4uKQotI2VuZGlmCi0KLURFRklORV9SV0xPQ0soaXBfY29ubnRyYWNrX2xvY2spOwotCi0vKiBpcF9jb25udHJhY2tfc3RhbmRhbG9uZSBuZWVkcyB0aGlzICovCi1hdG9taWNfdCBpcF9jb25udHJhY2tfY291bnQgPSBBVE9NSUNfSU5JVCgwKTsKLQotdm9pZCAoKmlwX2Nvbm50cmFja19kZXN0cm95ZWQpKHN0cnVjdCBpcF9jb25udHJhY2sgKmNvbm50cmFjaykgPSBOVUxMOwotTElTVF9IRUFEKGlwX2Nvbm50cmFja19leHBlY3RfbGlzdCk7Ci1zdHJ1Y3QgaXBfY29ubnRyYWNrX3Byb3RvY29sICppcF9jdF9wcm90b3NbTUFYX0lQX0NUX1BST1RPXSBfX3JlYWRfbW9zdGx5Owotc3RhdGljIExJU1RfSEVBRChoZWxwZXJzKTsKLXVuc2lnbmVkIGludCBpcF9jb25udHJhY2tfaHRhYmxlX3NpemUgX19yZWFkX21vc3RseSA9IDA7Ci1pbnQgaXBfY29ubnRyYWNrX21heCBfX3JlYWRfbW9zdGx5Owotc3RydWN0IGxpc3RfaGVhZCAqaXBfY29ubnRyYWNrX2hhc2ggX19yZWFkX21vc3RseTsKLXN0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqaXBfY29ubnRyYWNrX2NhY2hlcCBfX3JlYWRfbW9zdGx5Owotc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICppcF9jb25udHJhY2tfZXhwZWN0X2NhY2hlcCBfX3JlYWRfbW9zdGx5Owotc3RydWN0IGlwX2Nvbm50cmFjayBpcF9jb25udHJhY2tfdW50cmFja2VkOwotdW5zaWduZWQgaW50IGlwX2N0X2xvZ19pbnZhbGlkIF9fcmVhZF9tb3N0bHk7Ci1zdGF0aWMgTElTVF9IRUFEKHVuY29uZmlybWVkKTsKLXN0YXRpYyBpbnQgaXBfY29ubnRyYWNrX3ZtYWxsb2MgX19yZWFkX21vc3RseTsKLQotc3RhdGljIHVuc2lnbmVkIGludCBpcF9jb25udHJhY2tfbmV4dF9pZDsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgaXBfY29ubnRyYWNrX2V4cGVjdF9uZXh0X2lkOwotI2lmZGVmIENPTkZJR19JUF9ORl9DT05OVFJBQ0tfRVZFTlRTCi1BVE9NSUNfTk9USUZJRVJfSEVBRChpcF9jb25udHJhY2tfY2hhaW4pOwotQVRPTUlDX05PVElGSUVSX0hFQUQoaXBfY29ubnRyYWNrX2V4cGVjdF9jaGFpbik7Ci0KLURFRklORV9QRVJfQ1BVKHN0cnVjdCBpcF9jb25udHJhY2tfZWNhY2hlLCBpcF9jb25udHJhY2tfZWNhY2hlKTsKLQotLyogZGVsaXZlciBjYWNoZWQgZXZlbnRzIGFuZCBjbGVhciBjYWNoZSBlbnRyeSAtIG11c3QgYmUgY2FsbGVkIHdpdGggbG9jYWxseQotICogZGlzYWJsZWQgc29mdGlycXMgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZAotX19pcF9jdF9kZWxpdmVyX2NhY2hlZF9ldmVudHMoc3RydWN0IGlwX2Nvbm50cmFja19lY2FjaGUgKmVjYWNoZSkKLXsKLQlERUJVR1AoImVjYWNoZTogZGVsaXZlcmluZyBldmVudHMgZm9yICVwXG4iLCBlY2FjaGUtPmN0KTsKLQlpZiAoaXNfY29uZmlybWVkKGVjYWNoZS0+Y3QpICYmICFpc19keWluZyhlY2FjaGUtPmN0KSAmJiBlY2FjaGUtPmV2ZW50cykKLQkJYXRvbWljX25vdGlmaWVyX2NhbGxfY2hhaW4oJmlwX2Nvbm50cmFja19jaGFpbiwgZWNhY2hlLT5ldmVudHMsCi0JCQkJICAgIGVjYWNoZS0+Y3QpOwotCWVjYWNoZS0+ZXZlbnRzID0gMDsKLQlpcF9jb25udHJhY2tfcHV0KGVjYWNoZS0+Y3QpOwotCWVjYWNoZS0+Y3QgPSBOVUxMOwotfQotCi0vKiBEZWxpdmVyIGFsbCBjYWNoZWQgZXZlbnRzIGZvciBhIHBhcnRpY3VsYXIgY29ubnRyYWNrLiBUaGlzIGlzIGNhbGxlZAotICogYnkgY29kZSBwcmlvciB0byBhc3luYyBwYWNrZXQgaGFuZGxpbmcgb3IgZnJlZWluZyB0aGUgc2tiICovCi12b2lkIGlwX2N0X2RlbGl2ZXJfY2FjaGVkX2V2ZW50cyhjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCkKLXsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrX2VjYWNoZSAqZWNhY2hlOwotCi0JbG9jYWxfYmhfZGlzYWJsZSgpOwotCWVjYWNoZSA9ICZfX2dldF9jcHVfdmFyKGlwX2Nvbm50cmFja19lY2FjaGUpOwotCWlmIChlY2FjaGUtPmN0ID09IGN0KQotCQlfX2lwX2N0X2RlbGl2ZXJfY2FjaGVkX2V2ZW50cyhlY2FjaGUpOwotCWxvY2FsX2JoX2VuYWJsZSgpOwotfQotCi12b2lkIF9faXBfY3RfZXZlbnRfY2FjaGVfaW5pdChzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCkKLXsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrX2VjYWNoZSAqZWNhY2hlOwotCi0JLyogdGFrZSBjYXJlIG9mIGRlbGl2ZXJpbmcgcG90ZW50aWFsbHkgb2xkIGV2ZW50cyAqLwotCWVjYWNoZSA9ICZfX2dldF9jcHVfdmFyKGlwX2Nvbm50cmFja19lY2FjaGUpOwotCUJVR19PTihlY2FjaGUtPmN0ID09IGN0KTsKLQlpZiAoZWNhY2hlLT5jdCkKLQkJX19pcF9jdF9kZWxpdmVyX2NhY2hlZF9ldmVudHMoZWNhY2hlKTsKLQkvKiBpbml0aWFsaXplIGZvciB0aGlzIGNvbm50cmFjay9wYWNrZXQgKi8KLQllY2FjaGUtPmN0ID0gY3Q7Ci0JbmZfY29ubnRyYWNrX2dldCgmY3QtPmN0X2dlbmVyYWwpOwotfQotCi0vKiBmbHVzaCB0aGUgZXZlbnQgY2FjaGUgLSB0b3VjaGVzIG90aGVyIENQVSdzIGRhdGEgYW5kIG11c3Qgbm90IGJlIGNhbGxlZCB3aGlsZQotICogcGFja2V0cyBhcmUgc3RpbGwgcGFzc2luZyB0aHJvdWdoIHRoZSBjb2RlICovCi1zdGF0aWMgdm9pZCBpcF9jdF9ldmVudF9jYWNoZV9mbHVzaCh2b2lkKQotewotCXN0cnVjdCBpcF9jb25udHJhY2tfZWNhY2hlICplY2FjaGU7Ci0JaW50IGNwdTsKLQotCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKLQkJZWNhY2hlID0gJnBlcl9jcHUoaXBfY29ubnRyYWNrX2VjYWNoZSwgY3B1KTsKLQkJaWYgKGVjYWNoZS0+Y3QpCi0JCQlpcF9jb25udHJhY2tfcHV0KGVjYWNoZS0+Y3QpOwotCX0KLX0KLSNlbHNlCi1zdGF0aWMgaW5saW5lIHZvaWQgaXBfY3RfZXZlbnRfY2FjaGVfZmx1c2godm9pZCkge30KLSNlbmRpZiAvKiBDT05GSUdfSVBfTkZfQ09OTlRSQUNLX0VWRU5UUyAqLwotCi1ERUZJTkVfUEVSX0NQVShzdHJ1Y3QgaXBfY29ubnRyYWNrX3N0YXQsIGlwX2Nvbm50cmFja19zdGF0KTsKLQotc3RhdGljIGludCBpcF9jb25udHJhY2tfaGFzaF9ybmRfaW5pdHRlZDsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgaXBfY29ubnRyYWNrX2hhc2hfcm5kOwotCi1zdGF0aWMgdV9pbnQzMl90IF9faGFzaF9jb25udHJhY2soY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUsCi0JCQkgICAgdW5zaWduZWQgaW50IHNpemUsIHVuc2lnbmVkIGludCBybmQpCi17Ci0JcmV0dXJuIChqaGFzaF8zd29yZHMoKF9fZm9yY2UgdTMyKXR1cGxlLT5zcmMuaXAsCi0JCQkgICAgICgoX19mb3JjZSB1MzIpdHVwbGUtPmRzdC5pcCBeIHR1cGxlLT5kc3QucHJvdG9udW0pLAotCQkJICAgICAodHVwbGUtPnNyYy51LmFsbCB8ICh0dXBsZS0+ZHN0LnUuYWxsIDw8IDE2KSksCi0JCQkgICAgIHJuZCkgJSBzaXplKTsKLX0KLQotc3RhdGljIHVfaW50MzJfdAotaGFzaF9jb25udHJhY2soY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUpCi17Ci0JcmV0dXJuIF9faGFzaF9jb25udHJhY2sodHVwbGUsIGlwX2Nvbm50cmFja19odGFibGVfc2l6ZSwKLQkJCQlpcF9jb25udHJhY2tfaGFzaF9ybmQpOwotfQotCi1pbnQKLWlwX2N0X2dldF90dXBsZShjb25zdCBzdHJ1Y3QgaXBoZHIgKmlwaCwKLQkJY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJdW5zaWduZWQgaW50IGRhdGFvZmYsCi0JCXN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnR1cGxlLAotCQljb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3Byb3RvY29sICpwcm90b2NvbCkKLXsKLQkvKiBOZXZlciBoYXBwZW4gKi8KLQlpZiAoaXBoLT5mcmFnX29mZiAmIGh0b25zKElQX09GRlNFVCkpIHsKLQkJcHJpbnRrKCJpcF9jb25udHJhY2tfY29yZTogRnJhZyBvZiBwcm90byAldS5cbiIsCi0JCSAgICAgICBpcGgtPnByb3RvY29sKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JdHVwbGUtPnNyYy5pcCA9IGlwaC0+c2FkZHI7Ci0JdHVwbGUtPmRzdC5pcCA9IGlwaC0+ZGFkZHI7Ci0JdHVwbGUtPmRzdC5wcm90b251bSA9IGlwaC0+cHJvdG9jb2w7Ci0JdHVwbGUtPmRzdC5kaXIgPSBJUF9DVF9ESVJfT1JJR0lOQUw7Ci0KLQlyZXR1cm4gcHJvdG9jb2wtPnBrdF90b190dXBsZShza2IsIGRhdGFvZmYsIHR1cGxlKTsKLX0KLQotaW50Ci1pcF9jdF9pbnZlcnRfdHVwbGUoc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqaW52ZXJzZSwKLQkJICAgY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqb3JpZywKLQkJICAgY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja19wcm90b2NvbCAqcHJvdG9jb2wpCi17Ci0JaW52ZXJzZS0+c3JjLmlwID0gb3JpZy0+ZHN0LmlwOwotCWludmVyc2UtPmRzdC5pcCA9IG9yaWctPnNyYy5pcDsKLQlpbnZlcnNlLT5kc3QucHJvdG9udW0gPSBvcmlnLT5kc3QucHJvdG9udW07Ci0JaW52ZXJzZS0+ZHN0LmRpciA9ICFvcmlnLT5kc3QuZGlyOwotCi0JcmV0dXJuIHByb3RvY29sLT5pbnZlcnRfdHVwbGUoaW52ZXJzZSwgb3JpZyk7Ci19Ci0KLQotLyogaXBfY29ubnRyYWNrX2V4cGVjdCBoZWxwZXIgZnVuY3Rpb25zICovCi12b2lkIGlwX2N0X3VubGlua19leHBlY3Qoc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmV4cCkKLXsKLQlJUF9ORl9BU1NFUlQoIXRpbWVyX3BlbmRpbmcoJmV4cC0+dGltZW91dCkpOwotCWxpc3RfZGVsKCZleHAtPmxpc3QpOwotCUNPTk5UUkFDS19TVEFUX0lOQyhleHBlY3RfZGVsZXRlKTsKLQlleHAtPm1hc3Rlci0+ZXhwZWN0aW5nLS07Ci0JaXBfY29ubnRyYWNrX2V4cGVjdF9wdXQoZXhwKTsKLX0KLQotc3RhdGljIHZvaWQgZXhwZWN0YXRpb25fdGltZWRfb3V0KHVuc2lnbmVkIGxvbmcgdWxfZXhwZWN0KQotewotCXN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpleHAgPSAodm9pZCAqKXVsX2V4cGVjdDsKLQotCXdyaXRlX2xvY2tfYmgoJmlwX2Nvbm50cmFja19sb2NrKTsKLQlpcF9jdF91bmxpbmtfZXhwZWN0KGV4cCk7Ci0Jd3JpdGVfdW5sb2NrX2JoKCZpcF9jb25udHJhY2tfbG9jayk7Ci0JaXBfY29ubnRyYWNrX2V4cGVjdF9wdXQoZXhwKTsKLX0KLQotc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKgotX19pcF9jb25udHJhY2tfZXhwZWN0X2ZpbmQoY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUpCi17Ci0Jc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmk7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGksICZpcF9jb25udHJhY2tfZXhwZWN0X2xpc3QsIGxpc3QpIHsKLQkJaWYgKGlwX2N0X3R1cGxlX21hc2tfY21wKHR1cGxlLCAmaS0+dHVwbGUsICZpLT5tYXNrKSkKLQkJCXJldHVybiBpOwotCX0KLQlyZXR1cm4gTlVMTDsKLX0KLQotLyogSnVzdCBmaW5kIGEgZXhwZWN0YXRpb24gY29ycmVzcG9uZGluZyB0byBhIHR1cGxlLiAqLwotc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKgotaXBfY29ubnRyYWNrX2V4cGVjdF9maW5kX2dldChjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0dXBsZSkKLXsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqaTsKLQotCXJlYWRfbG9ja19iaCgmaXBfY29ubnRyYWNrX2xvY2spOwotCWkgPSBfX2lwX2Nvbm50cmFja19leHBlY3RfZmluZCh0dXBsZSk7Ci0JaWYgKGkpCi0JCWF0b21pY19pbmMoJmktPnVzZSk7Ci0JcmVhZF91bmxvY2tfYmgoJmlwX2Nvbm50cmFja19sb2NrKTsKLQotCXJldHVybiBpOwotfQotCi0vKiBJZiBhbiBleHBlY3RhdGlvbiBmb3IgdGhpcyBjb25uZWN0aW9uIGlzIGZvdW5kLCBpdCBnZXRzIGRlbGV0ZSBmcm9tCi0gKiBnbG9iYWwgbGlzdCB0aGVuIHJldHVybmVkLiAqLwotc3RhdGljIHN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICoKLWZpbmRfZXhwZWN0YXRpb24oY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUpCi17Ci0Jc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmk7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGksICZpcF9jb25udHJhY2tfZXhwZWN0X2xpc3QsIGxpc3QpIHsKLQkJLyogSWYgbWFzdGVyIGlzIG5vdCBpbiBoYXNoIHRhYmxlIHlldCAoaWUuIHBhY2tldCBoYXNuJ3QgbGVmdAotCQkgICB0aGlzIG1hY2hpbmUgeWV0KSwgaG93IGNhbiBvdGhlciBlbmQga25vdyBhYm91dCBleHBlY3RlZD8KLQkJICAgSGVuY2UgdGhlc2UgYXJlIG5vdCB0aGUgZHJvaWRzIHlvdSBhcmUgbG9va2luZyBmb3IgKGlmCi0JCSAgIG1hc3RlciBjdCBuZXZlciBnb3QgY29uZmlybWVkLCB3ZSdkIGhvbGQgYSByZWZlcmVuY2UgdG8gaXQKLQkJICAgYW5kIHdlaXJkIHRoaW5ncyB3b3VsZCBoYXBwZW4gdG8gZnV0dXJlIHBhY2tldHMpLiAqLwotCQlpZiAoaXBfY3RfdHVwbGVfbWFza19jbXAodHVwbGUsICZpLT50dXBsZSwgJmktPm1hc2spCi0JCSAgICAmJiBpc19jb25maXJtZWQoaS0+bWFzdGVyKSkgewotCQkJaWYgKGktPmZsYWdzICYgSVBfQ1RfRVhQRUNUX1BFUk1BTkVOVCkgewotCQkJCWF0b21pY19pbmMoJmktPnVzZSk7Ci0JCQkJcmV0dXJuIGk7Ci0JCQl9IGVsc2UgaWYgKGRlbF90aW1lcigmaS0+dGltZW91dCkpIHsKLQkJCQlpcF9jdF91bmxpbmtfZXhwZWN0KGkpOwotCQkJCXJldHVybiBpOwotCQkJfQotCQl9Ci0JfQotCXJldHVybiBOVUxMOwotfQotCi0vKiBkZWxldGUgYWxsIGV4cGVjdGF0aW9ucyBmb3IgdGhpcyBjb25udHJhY2sgKi8KLXZvaWQgaXBfY3RfcmVtb3ZlX2V4cGVjdGF0aW9ucyhzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCkKLXsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqaSwgKnRtcDsKLQotCS8qIE9wdGltaXphdGlvbjogbW9zdCBjb25uZWN0aW9uIG5ldmVyIGV4cGVjdCBhbnkgb3RoZXJzLiAqLwotCWlmIChjdC0+ZXhwZWN0aW5nID09IDApCi0JCXJldHVybjsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShpLCB0bXAsICZpcF9jb25udHJhY2tfZXhwZWN0X2xpc3QsIGxpc3QpIHsKLQkJaWYgKGktPm1hc3RlciA9PSBjdCAmJiBkZWxfdGltZXIoJmktPnRpbWVvdXQpKSB7Ci0JCQlpcF9jdF91bmxpbmtfZXhwZWN0KGkpOwotCQkJaXBfY29ubnRyYWNrX2V4cGVjdF9wdXQoaSk7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyB2b2lkCi1jbGVhbl9mcm9tX2xpc3RzKHN0cnVjdCBpcF9jb25udHJhY2sgKmN0KQotewotCURFQlVHUCgiY2xlYW5fZnJvbV9saXN0cyglcClcbiIsIGN0KTsKLQlsaXN0X2RlbCgmY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLmxpc3QpOwotCWxpc3RfZGVsKCZjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0ubGlzdCk7Ci0KLQkvKiBEZXN0cm95IGFsbCBwZW5kaW5nIGV4cGVjdGF0aW9ucyAqLwotCWlwX2N0X3JlbW92ZV9leHBlY3RhdGlvbnMoY3QpOwotfQotCi1zdGF0aWMgdm9pZAotZGVzdHJveV9jb25udHJhY2soc3RydWN0IG5mX2Nvbm50cmFjayAqbmZjdCkKLXsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCA9IChzdHJ1Y3QgaXBfY29ubnRyYWNrICopbmZjdDsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrX3Byb3RvY29sICpwcm90bzsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrX2hlbHBlciAqaGVscGVyOwotCXR5cGVvZihpcF9jb25udHJhY2tfZGVzdHJveWVkKSBkZXN0cm95ZWQ7Ci0KLQlERUJVR1AoImRlc3Ryb3lfY29ubnRyYWNrKCVwKVxuIiwgY3QpOwotCUlQX05GX0FTU0VSVChhdG9taWNfcmVhZCgmbmZjdC0+dXNlKSA9PSAwKTsKLQlJUF9ORl9BU1NFUlQoIXRpbWVyX3BlbmRpbmcoJmN0LT50aW1lb3V0KSk7Ci0KLQlpcF9jb25udHJhY2tfZXZlbnQoSVBDVF9ERVNUUk9ZLCBjdCk7Ci0Jc2V0X2JpdChJUFNfRFlJTkdfQklULCAmY3QtPnN0YXR1cyk7Ci0KLQloZWxwZXIgPSBjdC0+aGVscGVyOwotCWlmIChoZWxwZXIgJiYgaGVscGVyLT5kZXN0cm95KQotCQloZWxwZXItPmRlc3Ryb3koY3QpOwotCi0JLyogVG8gbWFrZSBzdXJlIHdlIGRvbid0IGdldCBhbnkgd2VpcmQgbG9ja2luZyBpc3N1ZXMgaGVyZToKLQkgKiBkZXN0cm95X2Nvbm50cmFjaygpIE1VU1QgTk9UIGJlIGNhbGxlZCB3aXRoIGEgd3JpdGUgbG9jawotCSAqIHRvIGlwX2Nvbm50cmFja19sb2NrISEhIC1IVyAqLwotCXJjdV9yZWFkX2xvY2soKTsKLQlwcm90byA9IF9faXBfY29ubnRyYWNrX3Byb3RvX2ZpbmQoY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlLmRzdC5wcm90b251bSk7Ci0JaWYgKHByb3RvICYmIHByb3RvLT5kZXN0cm95KQotCQlwcm90by0+ZGVzdHJveShjdCk7Ci0KLQlkZXN0cm95ZWQgPSByY3VfZGVyZWZlcmVuY2UoaXBfY29ubnRyYWNrX2Rlc3Ryb3llZCk7Ci0JaWYgKGRlc3Ryb3llZCkKLQkJZGVzdHJveWVkKGN0KTsKLQotCXJjdV9yZWFkX3VubG9jaygpOwotCi0Jd3JpdGVfbG9ja19iaCgmaXBfY29ubnRyYWNrX2xvY2spOwotCS8qIEV4cGVjdGF0aW9ucyB3aWxsIGhhdmUgYmVlbiByZW1vdmVkIGluIGNsZWFuX2Zyb21fbGlzdHMsCi0JICogZXhjZXB0IFRGVFAgY2FuIGNyZWF0ZSBhbiBleHBlY3RhdGlvbiBvbiB0aGUgZmlyc3QgcGFja2V0LAotCSAqIGJlZm9yZSBjb25uZWN0aW9uIGlzIGluIHRoZSBsaXN0LCBzbyB3ZSBuZWVkIHRvIGNsZWFuIGhlcmUsCi0JICogdG9vLiAqLwotCWlwX2N0X3JlbW92ZV9leHBlY3RhdGlvbnMoY3QpOwotCi0JLyogV2Ugb3ZlcmxvYWQgZmlyc3QgdHVwbGUgdG8gbGluayBpbnRvIHVuY29uZmlybWVkIGxpc3QuICovCi0JaWYgKCFpc19jb25maXJtZWQoY3QpKSB7Ci0JCUJVR19PTihsaXN0X2VtcHR5KCZjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0ubGlzdCkpOwotCQlsaXN0X2RlbCgmY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLmxpc3QpOwotCX0KLQotCUNPTk5UUkFDS19TVEFUX0lOQyhkZWxldGUpOwotCXdyaXRlX3VubG9ja19iaCgmaXBfY29ubnRyYWNrX2xvY2spOwotCi0JaWYgKGN0LT5tYXN0ZXIpCi0JCWlwX2Nvbm50cmFja19wdXQoY3QtPm1hc3Rlcik7Ci0KLQlERUJVR1AoImRlc3Ryb3lfY29ubnRyYWNrOiByZXR1cm5pbmcgY3Q9JXAgdG8gc2xhYlxuIiwgY3QpOwotCWlwX2Nvbm50cmFja19mcmVlKGN0KTsKLX0KLQotc3RhdGljIHZvaWQgZGVhdGhfYnlfdGltZW91dCh1bnNpZ25lZCBsb25nIHVsX2Nvbm50cmFjaykKLXsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCA9ICh2b2lkICopdWxfY29ubnRyYWNrOwotCi0Jd3JpdGVfbG9ja19iaCgmaXBfY29ubnRyYWNrX2xvY2spOwotCS8qIEluc2lkZSBsb2NrIHNvIHByZWVtcHQgaXMgZGlzYWJsZWQgb24gbW9kdWxlIHJlbW92YWwgcGF0aC4KLQkgKiBPdGhlcndpc2Ugd2UgY2FuIGdldCBzcHVyaW91cyB3YXJuaW5ncy4gKi8KLQlDT05OVFJBQ0tfU1RBVF9JTkMoZGVsZXRlX2xpc3QpOwotCWNsZWFuX2Zyb21fbGlzdHMoY3QpOwotCXdyaXRlX3VubG9ja19iaCgmaXBfY29ubnRyYWNrX2xvY2spOwotCWlwX2Nvbm50cmFja19wdXQoY3QpOwotfQotCi1zdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlX2hhc2ggKgotX19pcF9jb25udHJhY2tfZmluZChjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0dXBsZSwKLQkJICAgIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2sgKmlnbm9yZWRfY29ubnRyYWNrKQotewotCXN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGVfaGFzaCAqaDsKLQl1bnNpZ25lZCBpbnQgaGFzaCA9IGhhc2hfY29ubnRyYWNrKHR1cGxlKTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoaCwgJmlwX2Nvbm50cmFja19oYXNoW2hhc2hdLCBsaXN0KSB7Ci0JCWlmICh0dXBsZWhhc2hfdG9fY3RyYWNrKGgpICE9IGlnbm9yZWRfY29ubnRyYWNrICYmCi0JCSAgICBpcF9jdF90dXBsZV9lcXVhbCh0dXBsZSwgJmgtPnR1cGxlKSkgewotCQkJQ09OTlRSQUNLX1NUQVRfSU5DKGZvdW5kKTsKLQkJCXJldHVybiBoOwotCQl9Ci0JCUNPTk5UUkFDS19TVEFUX0lOQyhzZWFyY2hlZCk7Ci0JfQotCi0JcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIEZpbmQgYSBjb25uZWN0aW9uIGNvcnJlc3BvbmRpbmcgdG8gYSB0dXBsZS4gKi8KLXN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGVfaGFzaCAqCi1pcF9jb25udHJhY2tfZmluZF9nZXQoY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUsCi0JCSAgICAgIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2sgKmlnbm9yZWRfY29ubnRyYWNrKQotewotCXN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGVfaGFzaCAqaDsKLQotCXJlYWRfbG9ja19iaCgmaXBfY29ubnRyYWNrX2xvY2spOwotCWggPSBfX2lwX2Nvbm50cmFja19maW5kKHR1cGxlLCBpZ25vcmVkX2Nvbm50cmFjayk7Ci0JaWYgKGgpCi0JCWF0b21pY19pbmMoJnR1cGxlaGFzaF90b19jdHJhY2soaCktPmN0X2dlbmVyYWwudXNlKTsKLQlyZWFkX3VubG9ja19iaCgmaXBfY29ubnRyYWNrX2xvY2spOwotCi0JcmV0dXJuIGg7Ci19Ci0KLXN0YXRpYyB2b2lkIF9faXBfY29ubnRyYWNrX2hhc2hfaW5zZXJ0KHN0cnVjdCBpcF9jb25udHJhY2sgKmN0LAotCQkJCQl1bnNpZ25lZCBpbnQgaGFzaCwKLQkJCQkJdW5zaWduZWQgaW50IHJlcGxfaGFzaCkKLXsKLQljdC0+aWQgPSArK2lwX2Nvbm50cmFja19uZXh0X2lkOwotCWxpc3RfYWRkKCZjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0ubGlzdCwKLQkJICZpcF9jb25udHJhY2tfaGFzaFtoYXNoXSk7Ci0JbGlzdF9hZGQoJmN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX1JFUExZXS5saXN0LAotCQkgJmlwX2Nvbm50cmFja19oYXNoW3JlcGxfaGFzaF0pOwotfQotCi12b2lkIGlwX2Nvbm50cmFja19oYXNoX2luc2VydChzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCkKLXsKLQl1bnNpZ25lZCBpbnQgaGFzaCwgcmVwbF9oYXNoOwotCi0JaGFzaCA9IGhhc2hfY29ubnRyYWNrKCZjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUpOwotCXJlcGxfaGFzaCA9IGhhc2hfY29ubnRyYWNrKCZjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0udHVwbGUpOwotCi0Jd3JpdGVfbG9ja19iaCgmaXBfY29ubnRyYWNrX2xvY2spOwotCV9faXBfY29ubnRyYWNrX2hhc2hfaW5zZXJ0KGN0LCBoYXNoLCByZXBsX2hhc2gpOwotCXdyaXRlX3VubG9ja19iaCgmaXBfY29ubnRyYWNrX2xvY2spOwotfQotCi0vKiBDb25maXJtIGEgY29ubmVjdGlvbiBnaXZlbiBza2I7IHBsYWNlcyBpdCBpbiBoYXNoIHRhYmxlICovCi1pbnQKLV9faXBfY29ubnRyYWNrX2NvbmZpcm0oc3RydWN0IHNrX2J1ZmYgKipwc2tiKQotewotCXVuc2lnbmVkIGludCBoYXNoLCByZXBsX2hhc2g7Ci0Jc3RydWN0IGlwX2Nvbm50cmFja190dXBsZV9oYXNoICpoOwotCXN0cnVjdCBpcF9jb25udHJhY2sgKmN0OwotCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvOwotCi0JY3QgPSBpcF9jb25udHJhY2tfZ2V0KCpwc2tiLCAmY3RpbmZvKTsKLQotCS8qIGlwdF9SRUpFQ1QgdXNlcyBpcF9jb25udHJhY2tfYXR0YWNoIHRvIGF0dGFjaCByZWxhdGVkCi0JICAgSUNNUC9UQ1AgUlNUIHBhY2tldHMgaW4gb3RoZXIgZGlyZWN0aW9uLiAgQWN0dWFsIHBhY2tldAotCSAgIHdoaWNoIGNyZWF0ZWQgY29ubmVjdGlvbiB3aWxsIGJlIElQX0NUX05FVyBvciBmb3IgYW4KLQkgICBleHBlY3RlZCBjb25uZWN0aW9uLCBJUF9DVF9SRUxBVEVELiAqLwotCWlmIChDVElORk8yRElSKGN0aW5mbykgIT0gSVBfQ1RfRElSX09SSUdJTkFMKQotCQlyZXR1cm4gTkZfQUNDRVBUOwotCi0JaGFzaCA9IGhhc2hfY29ubnRyYWNrKCZjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUpOwotCXJlcGxfaGFzaCA9IGhhc2hfY29ubnRyYWNrKCZjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0udHVwbGUpOwotCi0JLyogV2UncmUgbm90IGluIGhhc2ggdGFibGUsIGFuZCB3ZSByZWZ1c2UgdG8gc2V0IHVwIHJlbGF0ZWQKLQkgICBjb25uZWN0aW9ucyBmb3IgdW5jb25maXJtZWQgY29ubnMuICBCdXQgcGFja2V0IGNvcGllcyBhbmQKLQkgICBSRUpFQ1Qgd2lsbCBnaXZlIHNwdXJpb3VzIHdhcm5pbmdzIGhlcmUuICovCi0JLyogSVBfTkZfQVNTRVJUKGF0b21pY19yZWFkKCZjdC0+Y3RfZ2VuZXJhbC51c2UpID09IDEpOyAqLwotCi0JLyogTm8gZXh0ZXJuYWwgcmVmZXJlbmNlcyBtZWFucyBub29uZSBlbHNlIGNvdWxkIGhhdmUKLQkgICBjb25maXJtZWQgdXMuICovCi0JSVBfTkZfQVNTRVJUKCFpc19jb25maXJtZWQoY3QpKTsKLQlERUJVR1AoIkNvbmZpcm1pbmcgY29ubnRyYWNrICVwXG4iLCBjdCk7Ci0KLQl3cml0ZV9sb2NrX2JoKCZpcF9jb25udHJhY2tfbG9jayk7Ci0KLQkvKiBTZWUgaWYgdGhlcmUncyBvbmUgaW4gdGhlIGxpc3QgYWxyZWFkeSwgaW5jbHVkaW5nIHJldmVyc2U6Ci0JICAgTkFUIGNvdWxkIGhhdmUgZ3JhYmJlZCBpdCB3aXRob3V0IHJlYWxpemluZywgc2luY2Ugd2UncmUKLQkgICBub3QgaW4gdGhlIGhhc2guICBJZiB0aGVyZSBpcywgd2UgbG9zdCByYWNlLiAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnkoaCwgJmlwX2Nvbm50cmFja19oYXNoW2hhc2hdLCBsaXN0KQotCQlpZiAoaXBfY3RfdHVwbGVfZXF1YWwoJmN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZSwKLQkJCQkgICAgICAmaC0+dHVwbGUpKQotCQkJZ290byBvdXQ7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShoLCAmaXBfY29ubnRyYWNrX2hhc2hbcmVwbF9oYXNoXSwgbGlzdCkKLQkJaWYgKGlwX2N0X3R1cGxlX2VxdWFsKCZjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0udHVwbGUsCi0JCQkJICAgICAgJmgtPnR1cGxlKSkKLQkJCWdvdG8gb3V0OwotCi0JLyogUmVtb3ZlIGZyb20gdW5jb25maXJtZWQgbGlzdCAqLwotCWxpc3RfZGVsKCZjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0ubGlzdCk7Ci0KLQlfX2lwX2Nvbm50cmFja19oYXNoX2luc2VydChjdCwgaGFzaCwgcmVwbF9oYXNoKTsKLQkvKiBUaW1lciByZWxhdGl2ZSB0byBjb25maXJtYXRpb24gdGltZSwgbm90IG9yaWdpbmFsCi0JICAgc2V0dGluZyB0aW1lLCBvdGhlcndpc2Ugd2UnZCBnZXQgdGltZXIgd3JhcCBpbgotCSAgIHdlaXJkIGRlbGF5IGNhc2VzLiAqLwotCWN0LT50aW1lb3V0LmV4cGlyZXMgKz0gamlmZmllczsKLQlhZGRfdGltZXIoJmN0LT50aW1lb3V0KTsKLQlhdG9taWNfaW5jKCZjdC0+Y3RfZ2VuZXJhbC51c2UpOwotCXNldF9iaXQoSVBTX0NPTkZJUk1FRF9CSVQsICZjdC0+c3RhdHVzKTsKLQlDT05OVFJBQ0tfU1RBVF9JTkMoaW5zZXJ0KTsKLQl3cml0ZV91bmxvY2tfYmgoJmlwX2Nvbm50cmFja19sb2NrKTsKLQlpZiAoY3QtPmhlbHBlcikKLQkJaXBfY29ubnRyYWNrX2V2ZW50X2NhY2hlKElQQ1RfSEVMUEVSLCAqcHNrYik7Ci0jaWZkZWYgQ09ORklHX0lQX05GX05BVF9ORUVERUQKLQlpZiAodGVzdF9iaXQoSVBTX1NSQ19OQVRfRE9ORV9CSVQsICZjdC0+c3RhdHVzKSB8fAotCSAgICB0ZXN0X2JpdChJUFNfRFNUX05BVF9ET05FX0JJVCwgJmN0LT5zdGF0dXMpKQotCQlpcF9jb25udHJhY2tfZXZlbnRfY2FjaGUoSVBDVF9OQVRJTkZPLCAqcHNrYik7Ci0jZW5kaWYKLQlpcF9jb25udHJhY2tfZXZlbnRfY2FjaGUobWFzdGVyX2N0KGN0KSA/Ci0JCQkJIElQQ1RfUkVMQVRFRCA6IElQQ1RfTkVXLCAqcHNrYik7Ci0KLQlyZXR1cm4gTkZfQUNDRVBUOwotCi1vdXQ6Ci0JQ09OTlRSQUNLX1NUQVRfSU5DKGluc2VydF9mYWlsZWQpOwotCXdyaXRlX3VubG9ja19iaCgmaXBfY29ubnRyYWNrX2xvY2spOwotCXJldHVybiBORl9EUk9QOwotfQotCi0vKiBSZXR1cm5zIHRydWUgaWYgYSBjb25uZWN0aW9uIGNvcnJlc3BvbmRpbmdzIHRvIHRoZSB0dXBsZSAocmVxdWlyZWQKLSAgIGZvciBOQVQpLiAqLwotaW50Ci1pcF9jb25udHJhY2tfdHVwbGVfdGFrZW4oY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUsCi0JCQkgY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFjayAqaWdub3JlZF9jb25udHJhY2spCi17Ci0Jc3RydWN0IGlwX2Nvbm50cmFja190dXBsZV9oYXNoICpoOwotCi0JcmVhZF9sb2NrX2JoKCZpcF9jb25udHJhY2tfbG9jayk7Ci0JaCA9IF9faXBfY29ubnRyYWNrX2ZpbmQodHVwbGUsIGlnbm9yZWRfY29ubnRyYWNrKTsKLQlyZWFkX3VubG9ja19iaCgmaXBfY29ubnRyYWNrX2xvY2spOwotCi0JcmV0dXJuIGggIT0gTlVMTDsKLX0KLQotLyogVGhlcmUncyBhIHNtYWxsIHJhY2UgaGVyZSB3aGVyZSB3ZSBtYXkgZnJlZSBhIGp1c3QtYXNzdXJlZAotICAgY29ubmVjdGlvbi4gIFRvbyBiYWQ6IHdlJ3JlIGluIHRyb3VibGUgYW55d2F5LiAqLwotc3RhdGljIGludCBlYXJseV9kcm9wKHN0cnVjdCBsaXN0X2hlYWQgKmNoYWluKQotewotCS8qIFRyYXZlcnNlIGJhY2t3YXJkczogZ2l2ZXMgdXMgb2xkZXN0LCB3aGljaCBpcyByb3VnaGx5IExSVSAqLwotCXN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGVfaGFzaCAqaDsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCA9IE5VTEwsICp0bXA7Ci0JaW50IGRyb3BwZWQgPSAwOwotCi0JcmVhZF9sb2NrX2JoKCZpcF9jb25udHJhY2tfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9yZXZlcnNlKGgsIGNoYWluLCBsaXN0KSB7Ci0JCXRtcCA9IHR1cGxlaGFzaF90b19jdHJhY2soaCk7Ci0JCWlmICghdGVzdF9iaXQoSVBTX0FTU1VSRURfQklULCAmdG1wLT5zdGF0dXMpKSB7Ci0JCQljdCA9IHRtcDsKLQkJCWF0b21pY19pbmMoJmN0LT5jdF9nZW5lcmFsLnVzZSk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlyZWFkX3VubG9ja19iaCgmaXBfY29ubnRyYWNrX2xvY2spOwotCi0JaWYgKCFjdCkKLQkJcmV0dXJuIGRyb3BwZWQ7Ci0KLQlpZiAoZGVsX3RpbWVyKCZjdC0+dGltZW91dCkpIHsKLQkJZGVhdGhfYnlfdGltZW91dCgodW5zaWduZWQgbG9uZyljdCk7Ci0JCWRyb3BwZWQgPSAxOwotCQlDT05OVFJBQ0tfU1RBVF9JTkNfQVRPTUlDKGVhcmx5X2Ryb3ApOwotCX0KLQlpcF9jb25udHJhY2tfcHV0KGN0KTsKLQlyZXR1cm4gZHJvcHBlZDsKLX0KLQotc3RhdGljIHN0cnVjdCBpcF9jb25udHJhY2tfaGVscGVyICoKLV9faXBfY29ubnRyYWNrX2hlbHBlcl9maW5kKCBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0dXBsZSkKLXsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrX2hlbHBlciAqaDsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoaCwgJmhlbHBlcnMsIGxpc3QpIHsKLQkJaWYgKGlwX2N0X3R1cGxlX21hc2tfY21wKHR1cGxlLCAmaC0+dHVwbGUsICZoLT5tYXNrKSkKLQkJCXJldHVybiBoOwotCX0KLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RydWN0IGlwX2Nvbm50cmFja19oZWxwZXIgKgotaXBfY29ubnRyYWNrX2hlbHBlcl9maW5kX2dldCggY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUpCi17Ci0Jc3RydWN0IGlwX2Nvbm50cmFja19oZWxwZXIgKmhlbHBlcjsKLQotCS8qIG5lZWQgaXBfY29ubnRyYWNrX2xvY2sgdG8gYXNzdXJlIHRoYXQgaGVscGVyIGV4aXN0cyB1bnRpbAotCSAqIHRyeV9tb2R1bGVfZ2V0KCkgaXMgY2FsbGVkICovCi0JcmVhZF9sb2NrX2JoKCZpcF9jb25udHJhY2tfbG9jayk7Ci0KLQloZWxwZXIgPSBfX2lwX2Nvbm50cmFja19oZWxwZXJfZmluZCh0dXBsZSk7Ci0JaWYgKGhlbHBlcikgewotCQkvKiBuZWVkIHRvIGluY3JlYXNlIG1vZHVsZSB1c2FnZSBjb3VudCB0byBhc3N1cmUgaGVscGVyIHdpbGwKLQkJICogbm90IGdvIGF3YXkgd2hpbGUgdGhlIGNhbGxlciBpcyBlLmcuIGJ1c3kgcHV0dGluZyBhCi0JCSAqIGNvbm50cmFjayBpbiB0aGUgaGFzaCB0aGF0IHVzZXMgdGhlIGhlbHBlciAqLwotCQlpZiAoIXRyeV9tb2R1bGVfZ2V0KGhlbHBlci0+bWUpKQotCQkJaGVscGVyID0gTlVMTDsKLQl9Ci0KLQlyZWFkX3VubG9ja19iaCgmaXBfY29ubnRyYWNrX2xvY2spOwotCi0JcmV0dXJuIGhlbHBlcjsKLX0KLQotdm9pZCBpcF9jb25udHJhY2tfaGVscGVyX3B1dChzdHJ1Y3QgaXBfY29ubnRyYWNrX2hlbHBlciAqaGVscGVyKQotewotCW1vZHVsZV9wdXQoaGVscGVyLT5tZSk7Ci19Ci0KLXN0cnVjdCBpcF9jb25udHJhY2tfcHJvdG9jb2wgKgotX19pcF9jb25udHJhY2tfcHJvdG9fZmluZCh1X2ludDhfdCBwcm90b2NvbCkKLXsKLQlyZXR1cm4gaXBfY3RfcHJvdG9zW3Byb3RvY29sXTsKLX0KLQotLyogdGhpcyBpcyBndWFyYW50ZWVkIHRvIGFsd2F5cyByZXR1cm4gYSB2YWxpZCBwcm90b2NvbCBoZWxwZXIsIHNpbmNlCi0gKiBpdCBmYWxscyBiYWNrIHRvIGdlbmVyaWNfcHJvdG9jb2wgKi8KLXN0cnVjdCBpcF9jb25udHJhY2tfcHJvdG9jb2wgKgotaXBfY29ubnRyYWNrX3Byb3RvX2ZpbmRfZ2V0KHVfaW50OF90IHByb3RvY29sKQotewotCXN0cnVjdCBpcF9jb25udHJhY2tfcHJvdG9jb2wgKnA7Ci0KLQlyY3VfcmVhZF9sb2NrKCk7Ci0JcCA9IF9faXBfY29ubnRyYWNrX3Byb3RvX2ZpbmQocHJvdG9jb2wpOwotCWlmIChwKSB7Ci0JCWlmICghdHJ5X21vZHVsZV9nZXQocC0+bWUpKQotCQkJcCA9ICZpcF9jb25udHJhY2tfZ2VuZXJpY19wcm90b2NvbDsKLQl9Ci0JcmN1X3JlYWRfdW5sb2NrKCk7Ci0KLQlyZXR1cm4gcDsKLX0KLQotdm9pZCBpcF9jb25udHJhY2tfcHJvdG9fcHV0KHN0cnVjdCBpcF9jb25udHJhY2tfcHJvdG9jb2wgKnApCi17Ci0JbW9kdWxlX3B1dChwLT5tZSk7Ci19Ci0KLXN0cnVjdCBpcF9jb25udHJhY2sgKmlwX2Nvbm50cmFja19hbGxvYyhzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICpvcmlnLAotCQkJCQlzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICpyZXBsKQotewotCXN0cnVjdCBpcF9jb25udHJhY2sgKmNvbm50cmFjazsKLQotCWlmICghaXBfY29ubnRyYWNrX2hhc2hfcm5kX2luaXR0ZWQpIHsKLQkJZ2V0X3JhbmRvbV9ieXRlcygmaXBfY29ubnRyYWNrX2hhc2hfcm5kLCA0KTsKLQkJaXBfY29ubnRyYWNrX2hhc2hfcm5kX2luaXR0ZWQgPSAxOwotCX0KLQotCS8qIFdlIGRvbid0IHdhbnQgYW55IHJhY2UgY29uZGl0aW9uIGF0IGVhcmx5IGRyb3Agc3RhZ2UgKi8KLQlhdG9taWNfaW5jKCZpcF9jb25udHJhY2tfY291bnQpOwotCi0JaWYgKGlwX2Nvbm50cmFja19tYXgKLQkgICAgJiYgYXRvbWljX3JlYWQoJmlwX2Nvbm50cmFja19jb3VudCkgPiBpcF9jb25udHJhY2tfbWF4KSB7Ci0JCXVuc2lnbmVkIGludCBoYXNoID0gaGFzaF9jb25udHJhY2sob3JpZyk7Ci0JCS8qIFRyeSBkcm9wcGluZyBmcm9tIHRoaXMgaGFzaCBjaGFpbi4gKi8KLQkJaWYgKCFlYXJseV9kcm9wKCZpcF9jb25udHJhY2tfaGFzaFtoYXNoXSkpIHsKLQkJCWF0b21pY19kZWMoJmlwX2Nvbm50cmFja19jb3VudCk7Ci0JCQlpZiAobmV0X3JhdGVsaW1pdCgpKQotCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJCQkgICAgICAgImlwX2Nvbm50cmFjazogdGFibGUgZnVsbCwgZHJvcHBpbmciCi0JCQkJICAgICAgICIgcGFja2V0LlxuIik7Ci0JCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKLQkJfQotCX0KLQotCWNvbm50cmFjayA9IGttZW1fY2FjaGVfemFsbG9jKGlwX2Nvbm50cmFja19jYWNoZXAsIEdGUF9BVE9NSUMpOwotCWlmICghY29ubnRyYWNrKSB7Ci0JCURFQlVHUCgiQ2FuJ3QgYWxsb2NhdGUgY29ubnRyYWNrLlxuIik7Ci0JCWF0b21pY19kZWMoJmlwX2Nvbm50cmFja19jb3VudCk7Ci0JCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwotCX0KLQotCWF0b21pY19zZXQoJmNvbm50cmFjay0+Y3RfZ2VuZXJhbC51c2UsIDEpOwotCWNvbm50cmFjay0+Y3RfZ2VuZXJhbC5kZXN0cm95ID0gZGVzdHJveV9jb25udHJhY2s7Ci0JY29ubnRyYWNrLT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZSA9ICpvcmlnOwotCWNvbm50cmFjay0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0udHVwbGUgPSAqcmVwbDsKLQkvKiBEb24ndCBzZXQgdGltZXIgeWV0OiB3YWl0IGZvciBjb25maXJtYXRpb24gKi8KLQlpbml0X3RpbWVyKCZjb25udHJhY2stPnRpbWVvdXQpOwotCWNvbm50cmFjay0+dGltZW91dC5kYXRhID0gKHVuc2lnbmVkIGxvbmcpY29ubnRyYWNrOwotCWNvbm50cmFjay0+dGltZW91dC5mdW5jdGlvbiA9IGRlYXRoX2J5X3RpbWVvdXQ7Ci0KLQlyZXR1cm4gY29ubnRyYWNrOwotfQotCi12b2lkCi1pcF9jb25udHJhY2tfZnJlZShzdHJ1Y3QgaXBfY29ubnRyYWNrICpjb25udHJhY2spCi17Ci0JYXRvbWljX2RlYygmaXBfY29ubnRyYWNrX2NvdW50KTsKLQlrbWVtX2NhY2hlX2ZyZWUoaXBfY29ubnRyYWNrX2NhY2hlcCwgY29ubnRyYWNrKTsKLX0KLQotLyogQWxsb2NhdGUgYSBuZXcgY29ubnRyYWNrOiB3ZSByZXR1cm4gLUVOT01FTSBpZiBjbGFzc2lmaWNhdGlvbgotICogZmFpbGVkIGR1ZSB0byBzdHJlc3MuICAgT3RoZXJ3aXNlIGl0IHJlYWxseSBpcyB1bmNsYXNzaWZpYWJsZSAqLwotc3RhdGljIHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGVfaGFzaCAqCi1pbml0X2Nvbm50cmFjayhzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0dXBsZSwKLQkgICAgICAgc3RydWN0IGlwX2Nvbm50cmFja19wcm90b2NvbCAqcHJvdG9jb2wsCi0JICAgICAgIHN0cnVjdCBza19idWZmICpza2IpCi17Ci0Jc3RydWN0IGlwX2Nvbm50cmFjayAqY29ubnRyYWNrOwotCXN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgcmVwbF90dXBsZTsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqZXhwOwotCi0JaWYgKCFpcF9jdF9pbnZlcnRfdHVwbGUoJnJlcGxfdHVwbGUsIHR1cGxlLCBwcm90b2NvbCkpIHsKLQkJREVCVUdQKCJDYW4ndCBpbnZlcnQgdHVwbGUuXG4iKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JY29ubnRyYWNrID0gaXBfY29ubnRyYWNrX2FsbG9jKHR1cGxlLCAmcmVwbF90dXBsZSk7Ci0JaWYgKGNvbm50cmFjayA9PSBOVUxMIHx8IElTX0VSUihjb25udHJhY2spKQotCQlyZXR1cm4gKHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGVfaGFzaCAqKWNvbm50cmFjazsKLQotCWlmICghcHJvdG9jb2wtPm5ldyhjb25udHJhY2ssIHNrYikpIHsKLQkJaXBfY29ubnRyYWNrX2ZyZWUoY29ubnRyYWNrKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0Jd3JpdGVfbG9ja19iaCgmaXBfY29ubnRyYWNrX2xvY2spOwotCWV4cCA9IGZpbmRfZXhwZWN0YXRpb24odHVwbGUpOwotCi0JaWYgKGV4cCkgewotCQlERUJVR1AoImNvbm50cmFjazogZXhwZWN0YXRpb24gYXJyaXZlcyBjdD0lcCBleHA9JXBcbiIsCi0JCQljb25udHJhY2ssIGV4cCk7Ci0JCS8qIFdlbGNvbWUsIE1yLiBCb25kLiAgV2UndmUgYmVlbiBleHBlY3RpbmcgeW91Li4uICovCi0JCV9fc2V0X2JpdChJUFNfRVhQRUNURURfQklULCAmY29ubnRyYWNrLT5zdGF0dXMpOwotCQljb25udHJhY2stPm1hc3RlciA9IGV4cC0+bWFzdGVyOwotI2lmZGVmIENPTkZJR19JUF9ORl9DT05OVFJBQ0tfTUFSSwotCQljb25udHJhY2stPm1hcmsgPSBleHAtPm1hc3Rlci0+bWFyazsKLSNlbmRpZgotI2lmIGRlZmluZWQoQ09ORklHX0lQX05GX1RBUkdFVF9NQVNRVUVSQURFKSB8fCBcCi0gICAgZGVmaW5lZChDT05GSUdfSVBfTkZfVEFSR0VUX01BU1FVRVJBREVfTU9EVUxFKQotCQkvKiB0aGlzIGlzIHVnbHksIGJ1dCB0aGVyZSBpcyBubyBvdGhlciBwbGFjZSB3aGVyZSB0byBwdXQgaXQgKi8KLQkJY29ubnRyYWNrLT5uYXQubWFzcV9pbmRleCA9IGV4cC0+bWFzdGVyLT5uYXQubWFzcV9pbmRleDsKLSNlbmRpZgotI2lmZGVmIENPTkZJR19JUF9ORl9DT05OVFJBQ0tfU0VDTUFSSwotCQljb25udHJhY2stPnNlY21hcmsgPSBleHAtPm1hc3Rlci0+c2VjbWFyazsKLSNlbmRpZgotCQluZl9jb25udHJhY2tfZ2V0KCZjb25udHJhY2stPm1hc3Rlci0+Y3RfZ2VuZXJhbCk7Ci0JCUNPTk5UUkFDS19TVEFUX0lOQyhleHBlY3RfbmV3KTsKLQl9IGVsc2UgewotCQljb25udHJhY2stPmhlbHBlciA9IF9faXBfY29ubnRyYWNrX2hlbHBlcl9maW5kKCZyZXBsX3R1cGxlKTsKLQotCQlDT05OVFJBQ0tfU1RBVF9JTkMobmV3KTsKLQl9Ci0KLQkvKiBPdmVybG9hZCB0dXBsZSBsaW5rZWQgbGlzdCB0byBwdXQgdXMgaW4gdW5jb25maXJtZWQgbGlzdC4gKi8KLQlsaXN0X2FkZCgmY29ubnRyYWNrLT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS5saXN0LCAmdW5jb25maXJtZWQpOwotCi0Jd3JpdGVfdW5sb2NrX2JoKCZpcF9jb25udHJhY2tfbG9jayk7Ci0KLQlpZiAoZXhwKSB7Ci0JCWlmIChleHAtPmV4cGVjdGZuKQotCQkJZXhwLT5leHBlY3Rmbihjb25udHJhY2ssIGV4cCk7Ci0JCWlwX2Nvbm50cmFja19leHBlY3RfcHV0KGV4cCk7Ci0JfQotCi0JcmV0dXJuICZjb25udHJhY2stPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdOwotfQotCi0vKiBPbiBzdWNjZXNzLCByZXR1cm5zIGNvbm50cmFjayBwdHIsIHNldHMgc2tiLT5uZmN0IGFuZCBjdGluZm8gKi8KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGlwX2Nvbm50cmFjayAqCi1yZXNvbHZlX25vcm1hbF9jdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkgIHN0cnVjdCBpcF9jb25udHJhY2tfcHJvdG9jb2wgKnByb3RvLAotCQkgIGludCAqc2V0X3JlcGx5LAotCQkgIHVuc2lnbmVkIGludCBob29rbnVtLAotCQkgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gKmN0aW5mbykKLXsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlIHR1cGxlOwotCXN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGVfaGFzaCAqaDsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdDsKLQotCUlQX05GX0FTU0VSVCgoc2tiLT5uaC5pcGgtPmZyYWdfb2ZmICYgaHRvbnMoSVBfT0ZGU0VUKSkgPT0gMCk7Ci0KLQlpZiAoIWlwX2N0X2dldF90dXBsZShza2ItPm5oLmlwaCwgc2tiLCBza2ItPm5oLmlwaC0+aWhsKjQsCi0JCQkJJnR1cGxlLHByb3RvKSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQkvKiBsb29rIGZvciB0dXBsZSBtYXRjaCAqLwotCWggPSBpcF9jb25udHJhY2tfZmluZF9nZXQoJnR1cGxlLCBOVUxMKTsKLQlpZiAoIWgpIHsKLQkJaCA9IGluaXRfY29ubnRyYWNrKCZ0dXBsZSwgcHJvdG8sIHNrYik7Ci0JCWlmICghaCkKLQkJCXJldHVybiBOVUxMOwotCQlpZiAoSVNfRVJSKGgpKQotCQkJcmV0dXJuICh2b2lkICopaDsKLQl9Ci0JY3QgPSB0dXBsZWhhc2hfdG9fY3RyYWNrKGgpOwotCi0JLyogSXQgZXhpc3RzOyB3ZSBoYXZlIChub24tZXhjbHVzaXZlKSByZWZlcmVuY2UuICovCi0JaWYgKERJUkVDVElPTihoKSA9PSBJUF9DVF9ESVJfUkVQTFkpIHsKLQkJKmN0aW5mbyA9IElQX0NUX0VTVEFCTElTSEVEICsgSVBfQ1RfSVNfUkVQTFk7Ci0JCS8qIFBsZWFzZSBzZXQgcmVwbHkgYml0IGlmIHRoaXMgcGFja2V0IE9LICovCi0JCSpzZXRfcmVwbHkgPSAxOwotCX0gZWxzZSB7Ci0JCS8qIE9uY2Ugd2UndmUgaGFkIHR3byB3YXkgY29tbXMsIGFsd2F5cyBFU1RBQkxJU0hFRC4gKi8KLQkJaWYgKHRlc3RfYml0KElQU19TRUVOX1JFUExZX0JJVCwgJmN0LT5zdGF0dXMpKSB7Ci0JCQlERUJVR1AoImlwX2Nvbm50cmFja19pbjogbm9ybWFsIHBhY2tldCBmb3IgJXBcbiIsCi0JCQkgICAgICAgY3QpOwotCQkJKmN0aW5mbyA9IElQX0NUX0VTVEFCTElTSEVEOwotCQl9IGVsc2UgaWYgKHRlc3RfYml0KElQU19FWFBFQ1RFRF9CSVQsICZjdC0+c3RhdHVzKSkgewotCQkJREVCVUdQKCJpcF9jb25udHJhY2tfaW46IHJlbGF0ZWQgcGFja2V0IGZvciAlcFxuIiwKLQkJCSAgICAgICBjdCk7Ci0JCQkqY3RpbmZvID0gSVBfQ1RfUkVMQVRFRDsKLQkJfSBlbHNlIHsKLQkJCURFQlVHUCgiaXBfY29ubnRyYWNrX2luOiBuZXcgcGFja2V0IGZvciAlcFxuIiwKLQkJCSAgICAgICBjdCk7Ci0JCQkqY3RpbmZvID0gSVBfQ1RfTkVXOwotCQl9Ci0JCSpzZXRfcmVwbHkgPSAwOwotCX0KLQlza2ItPm5mY3QgPSAmY3QtPmN0X2dlbmVyYWw7Ci0Jc2tiLT5uZmN0aW5mbyA9ICpjdGluZm87Ci0JcmV0dXJuIGN0OwotfQotCi0vKiBOZXRmaWx0ZXIgaG9vayBpdHNlbGYuICovCi11bnNpZ25lZCBpbnQgaXBfY29ubnRyYWNrX2luKHVuc2lnbmVkIGludCBob29rbnVtLAotCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCi0JCQkgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLQkJCSAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLQkJCSAgICAgaW50ICgqb2tmbikoc3RydWN0IHNrX2J1ZmYgKikpCi17Ci0Jc3RydWN0IGlwX2Nvbm50cmFjayAqY3Q7Ci0JZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm87Ci0Jc3RydWN0IGlwX2Nvbm50cmFja19wcm90b2NvbCAqcHJvdG87Ci0JaW50IHNldF9yZXBseSA9IDA7Ci0JaW50IHJldDsKLQotCS8qIFByZXZpb3VzbHkgc2VlbiAobG9vcGJhY2sgb3IgdW50cmFja2VkKT8gIElnbm9yZS4gKi8KLQlpZiAoKCpwc2tiKS0+bmZjdCkgewotCQlDT05OVFJBQ0tfU1RBVF9JTkNfQVRPTUlDKGlnbm9yZSk7Ci0JCXJldHVybiBORl9BQ0NFUFQ7Ci0JfQotCi0JLyogTmV2ZXIgaGFwcGVuICovCi0JaWYgKCgqcHNrYiktPm5oLmlwaC0+ZnJhZ19vZmYgJiBodG9ucyhJUF9PRkZTRVQpKSB7Ci0JCWlmIChuZXRfcmF0ZWxpbWl0KCkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJpcF9jb25udHJhY2tfaW46IEZyYWcgb2YgcHJvdG8gJXUgKGhvb2s9JXUpXG4iLAotCQkgICAgICAgKCpwc2tiKS0+bmguaXBoLT5wcm90b2NvbCwgaG9va251bSk7Ci0JCX0KLQkJcmV0dXJuIE5GX0RST1A7Ci0JfQotCi0vKiBEb2Vzbid0IGNvdmVyIGxvY2FsbHktZ2VuZXJhdGVkIGJyb2FkY2FzdCwgc28gbm90IHdvcnRoIGl0LiAqLwotI2lmIDAKLQkvKiBJZ25vcmUgYnJvYWRjYXN0OiBubyBgY29ubmVjdGlvbicuICovCi0JaWYgKCgqcHNrYiktPnBrdF90eXBlID09IFBBQ0tFVF9CUk9BRENBU1QpIHsKLQkJcHJpbnRrKCJCcm9hZGNhc3QgcGFja2V0IVxuIik7Ci0JCXJldHVybiBORl9BQ0NFUFQ7Ci0JfSBlbHNlIGlmICgoKCpwc2tiKS0+bmguaXBoLT5kYWRkciAmIGh0b25sKDB4MDAwMDAwRkYpKQotCQkgICA9PSBodG9ubCgweDAwMDAwMEZGKSkgewotCQlwcmludGsoIlNob3VsZCBiY2FzdDogJXUuJXUuJXUuJXUtPiV1LiV1LiV1LiV1IChzaz0lcCwgcHR5cGU9JXUpXG4iLAotCQkgICAgICAgTklQUVVBRCgoKnBza2IpLT5uaC5pcGgtPnNhZGRyKSwKLQkJICAgICAgIE5JUFFVQUQoKCpwc2tiKS0+bmguaXBoLT5kYWRkciksCi0JCSAgICAgICAoKnBza2IpLT5zaywgKCpwc2tiKS0+cGt0X3R5cGUpOwotCX0KLSNlbmRpZgotCi0JLyogcmN1X3JlYWRfbG9jaygpZWQgYnkgbmZfaG9va19zbG93ICovCi0JcHJvdG8gPSBfX2lwX2Nvbm50cmFja19wcm90b19maW5kKCgqcHNrYiktPm5oLmlwaC0+cHJvdG9jb2wpOwotCi0JLyogSXQgbWF5IGJlIGFuIHNwZWNpYWwgcGFja2V0LCBlcnJvciwgdW5jbGVhbi4uLgotCSAqIGludmVyc2Ugb2YgdGhlIHJldHVybiBjb2RlIHRlbGxzIHRvIHRoZSBuZXRmaWx0ZXIKLQkgKiBjb3JlIHdoYXQgdG8gZG8gd2l0aCB0aGUgcGFja2V0LiAqLwotCWlmIChwcm90by0+ZXJyb3IgIT0gTlVMTAotCSAgICAmJiAocmV0ID0gcHJvdG8tPmVycm9yKCpwc2tiLCAmY3RpbmZvLCBob29rbnVtKSkgPD0gMCkgewotCQlDT05OVFJBQ0tfU1RBVF9JTkNfQVRPTUlDKGVycm9yKTsKLQkJQ09OTlRSQUNLX1NUQVRfSU5DX0FUT01JQyhpbnZhbGlkKTsKLQkJcmV0dXJuIC1yZXQ7Ci0JfQotCi0JaWYgKCEoY3QgPSByZXNvbHZlX25vcm1hbF9jdCgqcHNrYiwgcHJvdG8sJnNldF9yZXBseSxob29rbnVtLCZjdGluZm8pKSkgewotCQkvKiBOb3QgdmFsaWQgcGFydCBvZiBhIGNvbm5lY3Rpb24gKi8KLQkJQ09OTlRSQUNLX1NUQVRfSU5DX0FUT01JQyhpbnZhbGlkKTsKLQkJcmV0dXJuIE5GX0FDQ0VQVDsKLQl9Ci0KLQlpZiAoSVNfRVJSKGN0KSkgewotCQkvKiBUb28gc3RyZXNzZWQgdG8gZGVhbC4gKi8KLQkJQ09OTlRSQUNLX1NUQVRfSU5DX0FUT01JQyhkcm9wKTsKLQkJcmV0dXJuIE5GX0RST1A7Ci0JfQotCi0JSVBfTkZfQVNTRVJUKCgqcHNrYiktPm5mY3QpOwotCi0JcmV0ID0gcHJvdG8tPnBhY2tldChjdCwgKnBza2IsIGN0aW5mbyk7Ci0JaWYgKHJldCA8IDApIHsKLQkJLyogSW52YWxpZDogaW52ZXJzZSBvZiB0aGUgcmV0dXJuIGNvZGUgdGVsbHMKLQkJICogdGhlIG5ldGZpbHRlciBjb3JlIHdoYXQgdG8gZG8qLwotCQluZl9jb25udHJhY2tfcHV0KCgqcHNrYiktPm5mY3QpOwotCQkoKnBza2IpLT5uZmN0ID0gTlVMTDsKLQkJQ09OTlRSQUNLX1NUQVRfSU5DX0FUT01JQyhpbnZhbGlkKTsKLQkJcmV0dXJuIC1yZXQ7Ci0JfQotCi0JaWYgKHNldF9yZXBseSAmJiAhdGVzdF9hbmRfc2V0X2JpdChJUFNfU0VFTl9SRVBMWV9CSVQsICZjdC0+c3RhdHVzKSkKLQkJaXBfY29ubnRyYWNrX2V2ZW50X2NhY2hlKElQQ1RfU1RBVFVTLCAqcHNrYik7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgaW52ZXJ0X3R1cGxlcHIoc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqaW52ZXJzZSwKLQkJICAgY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqb3JpZykKLXsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrX3Byb3RvY29sICpwcm90bzsKLQlpbnQgcmV0OwotCi0JcmN1X3JlYWRfbG9jaygpOwotCXByb3RvID0gX19pcF9jb25udHJhY2tfcHJvdG9fZmluZChvcmlnLT5kc3QucHJvdG9udW0pOwotCXJldCA9IGlwX2N0X2ludmVydF90dXBsZShpbnZlcnNlLCBvcmlnLCBwcm90byk7Ci0JcmN1X3JlYWRfdW5sb2NrKCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0vKiBXb3VsZCB0d28gZXhwZWN0ZWQgdGhpbmdzIGNsYXNoPyAqLwotc3RhdGljIGlubGluZSBpbnQgZXhwZWN0X2NsYXNoKGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICphLAotCQkJICAgICAgIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpiKQotewotCS8qIFBhcnQgY292ZXJlZCBieSBpbnRlcnNlY3Rpb24gb2YgbWFza3MgbXVzdCBiZSB1bmVxdWFsLAotCSAgIG90aGVyd2lzZSB0aGV5IGNsYXNoICovCi0Jc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSBpbnRlcnNlY3RfbWFzawotCQk9IHsgeyBhLT5tYXNrLnNyYy5pcCAmIGItPm1hc2suc3JjLmlwLAotCQkgICAgICB7IGEtPm1hc2suc3JjLnUuYWxsICYgYi0+bWFzay5zcmMudS5hbGwgfSB9LAotCQkgICAgeyBhLT5tYXNrLmRzdC5pcCAmIGItPm1hc2suZHN0LmlwLAotCQkgICAgICB7IGEtPm1hc2suZHN0LnUuYWxsICYgYi0+bWFzay5kc3QudS5hbGwgfSwKLQkJICAgICAgYS0+bWFzay5kc3QucHJvdG9udW0gJiBiLT5tYXNrLmRzdC5wcm90b251bSB9IH07Ci0KLQlyZXR1cm4gaXBfY3RfdHVwbGVfbWFza19jbXAoJmEtPnR1cGxlLCAmYi0+dHVwbGUsICZpbnRlcnNlY3RfbWFzayk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGV4cGVjdF9tYXRjaGVzKGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICphLAotCQkJCSBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqYikKLXsKLQlyZXR1cm4gYS0+bWFzdGVyID09IGItPm1hc3RlcgotCQkmJiBpcF9jdF90dXBsZV9lcXVhbCgmYS0+dHVwbGUsICZiLT50dXBsZSkKLQkJJiYgaXBfY3RfdHVwbGVfZXF1YWwoJmEtPm1hc2ssICZiLT5tYXNrKTsKLX0KLQotLyogR2VuZXJhbGx5IGEgYmFkIGlkZWEgdG8gY2FsbCB0aGlzOiBjb3VsZCBoYXZlIG1hdGNoZWQgYWxyZWFkeS4gKi8KLXZvaWQgaXBfY29ubnRyYWNrX3VuZXhwZWN0X3JlbGF0ZWQoc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmV4cCkKLXsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqaTsKLQotCXdyaXRlX2xvY2tfYmgoJmlwX2Nvbm50cmFja19sb2NrKTsKLQkvKiBjaG9vc2UgdGhlIHRoZSBvbGRlc3QgZXhwZWN0YXRpb24gdG8gZXZpY3QgKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JldmVyc2UoaSwgJmlwX2Nvbm50cmFja19leHBlY3RfbGlzdCwgbGlzdCkgewotCQlpZiAoZXhwZWN0X21hdGNoZXMoaSwgZXhwKSAmJiBkZWxfdGltZXIoJmktPnRpbWVvdXQpKSB7Ci0JCQlpcF9jdF91bmxpbmtfZXhwZWN0KGkpOwotCQkJd3JpdGVfdW5sb2NrX2JoKCZpcF9jb25udHJhY2tfbG9jayk7Ci0JCQlpcF9jb25udHJhY2tfZXhwZWN0X3B1dChpKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQl3cml0ZV91bmxvY2tfYmgoJmlwX2Nvbm50cmFja19sb2NrKTsKLX0KLQotLyogV2UgZG9uJ3QgaW5jcmVhc2UgdGhlIG1hc3RlciBjb25udHJhY2sgcmVmY291bnQgZm9yIG5vbi1mdWxmaWxsZWQKLSAqIGNvbm50cmFja3MuIER1cmluZyB0aGUgY29ubnRyYWNrIGRlc3RydWN0aW9uLCB0aGUgZXhwZWN0YXRpb25zIGFyZQotICogYWx3YXlzIGtpbGxlZCBiZWZvcmUgdGhlIGNvbm50cmFjayBpdHNlbGYgKi8KLXN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICppcF9jb25udHJhY2tfZXhwZWN0X2FsbG9jKHN0cnVjdCBpcF9jb25udHJhY2sgKm1lKQotewotCXN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpuZXc7Ci0KLQluZXcgPSBrbWVtX2NhY2hlX2FsbG9jKGlwX2Nvbm50cmFja19leHBlY3RfY2FjaGVwLCBHRlBfQVRPTUlDKTsKLQlpZiAoIW5ldykgewotCQlERUJVR1AoImV4cGVjdF9yZWxhdGVkOiBPT00gYWxsb2NhdGluZyBleHBlY3RcbiIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JbmV3LT5tYXN0ZXIgPSBtZTsKLQlhdG9taWNfc2V0KCZuZXctPnVzZSwgMSk7Ci0JcmV0dXJuIG5ldzsKLX0KLQotdm9pZCBpcF9jb25udHJhY2tfZXhwZWN0X3B1dChzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqZXhwKQotewotCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZleHAtPnVzZSkpCi0JCWttZW1fY2FjaGVfZnJlZShpcF9jb25udHJhY2tfZXhwZWN0X2NhY2hlcCwgZXhwKTsKLX0KLQotc3RhdGljIHZvaWQgaXBfY29ubnRyYWNrX2V4cGVjdF9pbnNlcnQoc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmV4cCkKLXsKLQlhdG9taWNfaW5jKCZleHAtPnVzZSk7Ci0JZXhwLT5tYXN0ZXItPmV4cGVjdGluZysrOwotCWxpc3RfYWRkKCZleHAtPmxpc3QsICZpcF9jb25udHJhY2tfZXhwZWN0X2xpc3QpOwotCi0JaW5pdF90aW1lcigmZXhwLT50aW1lb3V0KTsKLQlleHAtPnRpbWVvdXQuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWV4cDsKLQlleHAtPnRpbWVvdXQuZnVuY3Rpb24gPSBleHBlY3RhdGlvbl90aW1lZF9vdXQ7Ci0JZXhwLT50aW1lb3V0LmV4cGlyZXMgPSBqaWZmaWVzICsgZXhwLT5tYXN0ZXItPmhlbHBlci0+dGltZW91dCAqIEhaOwotCWFkZF90aW1lcigmZXhwLT50aW1lb3V0KTsKLQotCWV4cC0+aWQgPSArK2lwX2Nvbm50cmFja19leHBlY3RfbmV4dF9pZDsKLQlhdG9taWNfaW5jKCZleHAtPnVzZSk7Ci0JQ09OTlRSQUNLX1NUQVRfSU5DKGV4cGVjdF9jcmVhdGUpOwotfQotCi0vKiBSYWNlIHdpdGggZXhwZWN0YXRpb25zIGJlaW5nIHVzZWQgbWVhbnMgd2UgY291bGQgaGF2ZSBub25lIHRvIGZpbmQ7IE9LLiAqLwotc3RhdGljIHZvaWQgZXZpY3Rfb2xkZXN0X2V4cGVjdChzdHJ1Y3QgaXBfY29ubnRyYWNrICptYXN0ZXIpCi17Ci0Jc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmk7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JldmVyc2UoaSwgJmlwX2Nvbm50cmFja19leHBlY3RfbGlzdCwgbGlzdCkgewotCQlpZiAoaS0+bWFzdGVyID09IG1hc3RlcikgewotCQkJaWYgKGRlbF90aW1lcigmaS0+dGltZW91dCkpIHsKLQkJCQlpcF9jdF91bmxpbmtfZXhwZWN0KGkpOwotCQkJCWlwX2Nvbm50cmFja19leHBlY3RfcHV0KGkpOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHJlZnJlc2hfdGltZXIoc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmkpCi17Ci0JaWYgKCFkZWxfdGltZXIoJmktPnRpbWVvdXQpKQotCQlyZXR1cm4gMDsKLQotCWktPnRpbWVvdXQuZXhwaXJlcyA9IGppZmZpZXMgKyBpLT5tYXN0ZXItPmhlbHBlci0+dGltZW91dCpIWjsKLQlhZGRfdGltZXIoJmktPnRpbWVvdXQpOwotCXJldHVybiAxOwotfQotCi1pbnQgaXBfY29ubnRyYWNrX2V4cGVjdF9yZWxhdGVkKHN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpleHBlY3QpCi17Ci0Jc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmk7Ci0JaW50IHJldDsKLQotCURFQlVHUCgiaXBfY29ubnRyYWNrX2V4cGVjdF9yZWxhdGVkICVwXG4iLCByZWxhdGVkX3RvKTsKLQlERUJVR1AoInR1cGxlOiAiKTsgRFVNUF9UVVBMRSgmZXhwZWN0LT50dXBsZSk7Ci0JREVCVUdQKCJtYXNrOiAgIik7IERVTVBfVFVQTEUoJmV4cGVjdC0+bWFzayk7Ci0KLQl3cml0ZV9sb2NrX2JoKCZpcF9jb25udHJhY2tfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShpLCAmaXBfY29ubnRyYWNrX2V4cGVjdF9saXN0LCBsaXN0KSB7Ci0JCWlmIChleHBlY3RfbWF0Y2hlcyhpLCBleHBlY3QpKSB7Ci0JCQkvKiBSZWZyZXNoIHRpbWVyOiBpZiBpdCdzIGR5aW5nLCBpZ25vcmUuLiAqLwotCQkJaWYgKHJlZnJlc2hfdGltZXIoaSkpIHsKLQkJCQlyZXQgPSAwOwotCQkJCWdvdG8gb3V0OwotCQkJfQotCQl9IGVsc2UgaWYgKGV4cGVjdF9jbGFzaChpLCBleHBlY3QpKSB7Ci0JCQlyZXQgPSAtRUJVU1k7Ci0JCQlnb3RvIG91dDsKLQkJfQotCX0KLQotCS8qIFdpbGwgYmUgb3ZlciBsaW1pdD8gKi8KLQlpZiAoZXhwZWN0LT5tYXN0ZXItPmhlbHBlci0+bWF4X2V4cGVjdGVkICYmCi0JICAgIGV4cGVjdC0+bWFzdGVyLT5leHBlY3RpbmcgPj0gZXhwZWN0LT5tYXN0ZXItPmhlbHBlci0+bWF4X2V4cGVjdGVkKQotCQlldmljdF9vbGRlc3RfZXhwZWN0KGV4cGVjdC0+bWFzdGVyKTsKLQotCWlwX2Nvbm50cmFja19leHBlY3RfaW5zZXJ0KGV4cGVjdCk7Ci0JaXBfY29ubnRyYWNrX2V4cGVjdF9ldmVudChJUEVYUF9ORVcsIGV4cGVjdCk7Ci0JcmV0ID0gMDsKLW91dDoKLQl3cml0ZV91bmxvY2tfYmgoJmlwX2Nvbm50cmFja19sb2NrKTsKLQlyZXR1cm4gcmV0OwotfQotCi0vKiBBbHRlciByZXBseSB0dXBsZSAobWF5YmUgYWx0ZXIgaGVscGVyKS4gIFRoaXMgaXMgZm9yIE5BVCwgYW5kIGlzCi0gICBpbXBsaWNpdGx5IHJhY3k6IHNlZSBfX2lwX2Nvbm50cmFja19jb25maXJtICovCi12b2lkIGlwX2Nvbm50cmFja19hbHRlcl9yZXBseShzdHJ1Y3QgaXBfY29ubnRyYWNrICpjb25udHJhY2ssCi0JCQkgICAgICBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICpuZXdyZXBseSkKLXsKLQl3cml0ZV9sb2NrX2JoKCZpcF9jb25udHJhY2tfbG9jayk7Ci0JLyogU2hvdWxkIGJlIHVuY29uZmlybWVkLCBzbyBub3QgaW4gaGFzaCB0YWJsZSB5ZXQgKi8KLQlJUF9ORl9BU1NFUlQoIWlzX2NvbmZpcm1lZChjb25udHJhY2spKTsKLQotCURFQlVHUCgiQWx0ZXJpbmcgcmVwbHkgdHVwbGUgb2YgJXAgdG8gIiwgY29ubnRyYWNrKTsKLQlEVU1QX1RVUExFKG5ld3JlcGx5KTsKLQotCWNvbm50cmFjay0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0udHVwbGUgPSAqbmV3cmVwbHk7Ci0JaWYgKCFjb25udHJhY2stPm1hc3RlciAmJiBjb25udHJhY2stPmV4cGVjdGluZyA9PSAwKQotCQljb25udHJhY2stPmhlbHBlciA9IF9faXBfY29ubnRyYWNrX2hlbHBlcl9maW5kKG5ld3JlcGx5KTsKLQl3cml0ZV91bmxvY2tfYmgoJmlwX2Nvbm50cmFja19sb2NrKTsKLX0KLQotaW50IGlwX2Nvbm50cmFja19oZWxwZXJfcmVnaXN0ZXIoc3RydWN0IGlwX2Nvbm50cmFja19oZWxwZXIgKm1lKQotewotCUJVR19PTihtZS0+dGltZW91dCA9PSAwKTsKLQl3cml0ZV9sb2NrX2JoKCZpcF9jb25udHJhY2tfbG9jayk7Ci0JbGlzdF9hZGQoJm1lLT5saXN0LCAmaGVscGVycyk7Ci0Jd3JpdGVfdW5sb2NrX2JoKCZpcF9jb25udHJhY2tfbG9jayk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RydWN0IGlwX2Nvbm50cmFja19oZWxwZXIgKgotX19pcF9jb25udHJhY2tfaGVscGVyX2ZpbmRfYnluYW1lKGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0Jc3RydWN0IGlwX2Nvbm50cmFja19oZWxwZXIgKmg7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGgsICZoZWxwZXJzLCBsaXN0KSB7Ci0JCWlmICghc3RyY21wKGgtPm5hbWUsIG5hbWUpKQotCQkJcmV0dXJuIGg7Ci0JfQotCi0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCB1bmhlbHAoc3RydWN0IGlwX2Nvbm50cmFja190dXBsZV9oYXNoICppLAotCQkJICBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX2hlbHBlciAqbWUpCi17Ci0JaWYgKHR1cGxlaGFzaF90b19jdHJhY2soaSktPmhlbHBlciA9PSBtZSkgewotCQlpcF9jb25udHJhY2tfZXZlbnQoSVBDVF9IRUxQRVIsIHR1cGxlaGFzaF90b19jdHJhY2soaSkpOwotCQl0dXBsZWhhc2hfdG9fY3RyYWNrKGkpLT5oZWxwZXIgPSBOVUxMOwotCX0KLX0KLQotdm9pZCBpcF9jb25udHJhY2tfaGVscGVyX3VucmVnaXN0ZXIoc3RydWN0IGlwX2Nvbm50cmFja19oZWxwZXIgKm1lKQotewotCXVuc2lnbmVkIGludCBpOwotCXN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGVfaGFzaCAqaDsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqZXhwLCAqdG1wOwotCi0JLyogTmVlZCB3cml0ZSBsb2NrIGhlcmUsIHRvIGRlbGV0ZSBoZWxwZXIuICovCi0Jd3JpdGVfbG9ja19iaCgmaXBfY29ubnRyYWNrX2xvY2spOwotCWxpc3RfZGVsKCZtZS0+bGlzdCk7Ci0KLQkvKiBHZXQgcmlkIG9mIGV4cGVjdGF0aW9ucyAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShleHAsIHRtcCwgJmlwX2Nvbm50cmFja19leHBlY3RfbGlzdCwgbGlzdCkgewotCQlpZiAoZXhwLT5tYXN0ZXItPmhlbHBlciA9PSBtZSAmJiBkZWxfdGltZXIoJmV4cC0+dGltZW91dCkpIHsKLQkJCWlwX2N0X3VubGlua19leHBlY3QoZXhwKTsKLQkJCWlwX2Nvbm50cmFja19leHBlY3RfcHV0KGV4cCk7Ci0JCX0KLQl9Ci0JLyogR2V0IHJpZCBvZiBleHBlY3RlZHMsIHNldCBoZWxwZXJzIHRvIE5VTEwuICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShoLCAmdW5jb25maXJtZWQsIGxpc3QpCi0JCXVuaGVscChoLCBtZSk7Ci0JZm9yIChpID0gMDsgaSA8IGlwX2Nvbm50cmFja19odGFibGVfc2l6ZTsgaSsrKSB7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnkoaCwgJmlwX2Nvbm50cmFja19oYXNoW2ldLCBsaXN0KQotCQkJdW5oZWxwKGgsIG1lKTsKLQl9Ci0Jd3JpdGVfdW5sb2NrX2JoKCZpcF9jb25udHJhY2tfbG9jayk7Ci0KLQkvKiBTb21lb25lIGNvdWxkIGJlIHN0aWxsIGxvb2tpbmcgYXQgdGhlIGhlbHBlciBpbiBhIGJoLiAqLwotCXN5bmNocm9uaXplX25ldCgpOwotfQotCi0vKiBSZWZyZXNoIGNvbm50cmFjayBmb3IgdGhpcyBtYW55IGppZmZpZXMgYW5kIGRvIGFjY291bnRpbmcgaWYgZG9fYWNjdCBpcyAxICovCi12b2lkIF9faXBfY3RfcmVmcmVzaF9hY2N0KHN0cnVjdCBpcF9jb25udHJhY2sgKmN0LAotCQkJZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCi0JCQljb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJdW5zaWduZWQgbG9uZyBleHRyYV9qaWZmaWVzLAotCQkJaW50IGRvX2FjY3QpCi17Ci0JaW50IGV2ZW50ID0gMDsKLQotCUlQX05GX0FTU0VSVChjdC0+dGltZW91dC5kYXRhID09ICh1bnNpZ25lZCBsb25nKWN0KTsKLQlJUF9ORl9BU1NFUlQoc2tiKTsKLQotCXdyaXRlX2xvY2tfYmgoJmlwX2Nvbm50cmFja19sb2NrKTsKLQotCS8qIE9ubHkgdXBkYXRlIGlmIHRoaXMgaXMgbm90IGEgZml4ZWQgdGltZW91dCAqLwotCWlmICh0ZXN0X2JpdChJUFNfRklYRURfVElNRU9VVF9CSVQsICZjdC0+c3RhdHVzKSkgewotCQl3cml0ZV91bmxvY2tfYmgoJmlwX2Nvbm50cmFja19sb2NrKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIElmIG5vdCBpbiBoYXNoIHRhYmxlLCB0aW1lciB3aWxsIG5vdCBiZSBhY3RpdmUgeWV0ICovCi0JaWYgKCFpc19jb25maXJtZWQoY3QpKSB7Ci0JCWN0LT50aW1lb3V0LmV4cGlyZXMgPSBleHRyYV9qaWZmaWVzOwotCQlldmVudCA9IElQQ1RfUkVGUkVTSDsKLQl9IGVsc2UgewotCQkvKiBOZWVkIGRlbF90aW1lciBmb3IgcmFjZSBhdm9pZGFuY2UgKG1heSBhbHJlYWR5IGJlIGR5aW5nKS4gKi8KLQkJaWYgKGRlbF90aW1lcigmY3QtPnRpbWVvdXQpKSB7Ci0JCQljdC0+dGltZW91dC5leHBpcmVzID0gamlmZmllcyArIGV4dHJhX2ppZmZpZXM7Ci0JCQlhZGRfdGltZXIoJmN0LT50aW1lb3V0KTsKLQkJCWV2ZW50ID0gSVBDVF9SRUZSRVNIOwotCQl9Ci0JfQotCi0jaWZkZWYgQ09ORklHX0lQX05GX0NUX0FDQ1QKLQlpZiAoZG9fYWNjdCkgewotCQljdC0+Y291bnRlcnNbQ1RJTkZPMkRJUihjdGluZm8pXS5wYWNrZXRzKys7Ci0JCWN0LT5jb3VudGVyc1tDVElORk8yRElSKGN0aW5mbyldLmJ5dGVzICs9Ci0JCQkJCQludG9ocyhza2ItPm5oLmlwaC0+dG90X2xlbik7Ci0JCWlmICgoY3QtPmNvdW50ZXJzW0NUSU5GTzJESVIoY3RpbmZvKV0ucGFja2V0cyAmIDB4ODAwMDAwMDApCi0JCSAgICB8fCAoY3QtPmNvdW50ZXJzW0NUSU5GTzJESVIoY3RpbmZvKV0uYnl0ZXMgJiAweDgwMDAwMDAwKSkKLQkJCWV2ZW50IHw9IElQQ1RfQ09VTlRFUl9GSUxMSU5HOwotCX0KLSNlbmRpZgotCi0Jd3JpdGVfdW5sb2NrX2JoKCZpcF9jb25udHJhY2tfbG9jayk7Ci0KLQkvKiBtdXN0IGJlIHVubG9ja2VkIHdoZW4gY2FsbGluZyBldmVudCBjYWNoZSAqLwotCWlmIChldmVudCkKLQkJaXBfY29ubnRyYWNrX2V2ZW50X2NhY2hlKGV2ZW50LCBza2IpOwotfQotCi0jaWYgZGVmaW5lZChDT05GSUdfSVBfTkZfQ09OTlRSQUNLX05FVExJTkspIHx8IFwKLSAgICBkZWZpbmVkKENPTkZJR19JUF9ORl9DT05OVFJBQ0tfTkVUTElOS19NT0RVTEUpCi0vKiBHZW5lcmljIGZ1bmN0aW9uIGZvciB0Y3AvdWRwL3NjdHAvZGNjcCBhbmQgYWxpa2UuIFRoaXMgbmVlZHMgdG8gYmUKLSAqIGluIGlwX2Nvbm50cmFja19jb3JlLCBzaW5jZSB3ZSBkb24ndCB3YW50IHRoZSBwcm90b2NvbHMgdG8gYXV0b2xvYWQKLSAqIG9yIGRlcGVuZCBvbiBjdG5ldGxpbmsgKi8KLWludCBpcF9jdF9wb3J0X3R1cGxlX3RvX25mYXR0cihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJICAgICAgIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnR1cGxlKQotewotCU5GQV9QVVQoc2tiLCBDVEFfUFJPVE9fU1JDX1BPUlQsIHNpemVvZihfX2JlMTYpLAotCQkmdHVwbGUtPnNyYy51LnRjcC5wb3J0KTsKLQlORkFfUFVUKHNrYiwgQ1RBX1BST1RPX0RTVF9QT1JULCBzaXplb2YoX19iZTE2KSwKLQkJJnR1cGxlLT5kc3QudS50Y3AucG9ydCk7Ci0JcmV0dXJuIDA7Ci0KLW5mYXR0cl9mYWlsdXJlOgotCXJldHVybiAtMTsKLX0KLQotaW50IGlwX2N0X3BvcnRfbmZhdHRyX3RvX3R1cGxlKHN0cnVjdCBuZmF0dHIgKnRiW10sCi0JCQkgICAgICAgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdCkKLXsKLQlpZiAoIXRiW0NUQV9QUk9UT19TUkNfUE9SVC0xXSB8fCAhdGJbQ1RBX1BST1RPX0RTVF9QT1JULTFdKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXQtPnNyYy51LnRjcC5wb3J0ID0KLQkJKihfX2JlMTYgKilORkFfREFUQSh0YltDVEFfUFJPVE9fU1JDX1BPUlQtMV0pOwotCXQtPmRzdC51LnRjcC5wb3J0ID0KLQkJKihfX2JlMTYgKilORkFfREFUQSh0YltDVEFfUFJPVE9fRFNUX1BPUlQtMV0pOwotCi0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQotLyogUmV0dXJucyBuZXcgc2tfYnVmZiwgb3IgTlVMTCAqLwotc3RydWN0IHNrX2J1ZmYgKgotaXBfY3RfZ2F0aGVyX2ZyYWdzKHN0cnVjdCBza19idWZmICpza2IsIHVfaW50MzJfdCB1c2VyKQotewotCXNrYl9vcnBoYW4oc2tiKTsKLQotCWxvY2FsX2JoX2Rpc2FibGUoKTsKLQlza2IgPSBpcF9kZWZyYWcoc2tiLCB1c2VyKTsKLQlsb2NhbF9iaF9lbmFibGUoKTsKLQotCWlmIChza2IpCi0JCWlwX3NlbmRfY2hlY2soc2tiLT5uaC5pcGgpOwotCXJldHVybiBza2I7Ci19Ci0KLS8qIFVzZWQgYnkgaXB0X1JFSkVDVC4gKi8KLXN0YXRpYyB2b2lkIGlwX2Nvbm50cmFja19hdHRhY2goc3RydWN0IHNrX2J1ZmYgKm5za2IsIHN0cnVjdCBza19idWZmICpza2IpCi17Ci0Jc3RydWN0IGlwX2Nvbm50cmFjayAqY3Q7Ci0JZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm87Ci0KLQkvKiBUaGlzIElDTVAgaXMgaW4gcmV2ZXJzZSBkaXJlY3Rpb24gdG8gdGhlIHBhY2tldCB3aGljaCBjYXVzZWQgaXQgKi8KLQljdCA9IGlwX2Nvbm50cmFja19nZXQoc2tiLCAmY3RpbmZvKTsKLQotCWlmIChDVElORk8yRElSKGN0aW5mbykgPT0gSVBfQ1RfRElSX09SSUdJTkFMKQotCQljdGluZm8gPSBJUF9DVF9SRUxBVEVEICsgSVBfQ1RfSVNfUkVQTFk7Ci0JZWxzZQotCQljdGluZm8gPSBJUF9DVF9SRUxBVEVEOwotCi0JLyogQXR0YWNoIHRvIG5ldyBza2J1ZmYsIGFuZCBpbmNyZW1lbnQgY291bnQgKi8KLQluc2tiLT5uZmN0ID0gJmN0LT5jdF9nZW5lcmFsOwotCW5za2ItPm5mY3RpbmZvID0gY3RpbmZvOwotCW5mX2Nvbm50cmFja19nZXQobnNrYi0+bmZjdCk7Ci19Ci0KLS8qIEJyaW5nIG91dCB5YSBkZWFkISAqLwotc3RhdGljIHN0cnVjdCBpcF9jb25udHJhY2sgKgotZ2V0X25leHRfY29ycHNlKGludCAoKml0ZXIpKHN0cnVjdCBpcF9jb25udHJhY2sgKmksIHZvaWQgKmRhdGEpLAotCQl2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgKmJ1Y2tldCkKLXsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlX2hhc2ggKmg7Ci0Jc3RydWN0IGlwX2Nvbm50cmFjayAqY3Q7Ci0KLQl3cml0ZV9sb2NrX2JoKCZpcF9jb25udHJhY2tfbG9jayk7Ci0JZm9yICg7ICpidWNrZXQgPCBpcF9jb25udHJhY2tfaHRhYmxlX3NpemU7ICgqYnVja2V0KSsrKSB7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnkoaCwgJmlwX2Nvbm50cmFja19oYXNoWypidWNrZXRdLCBsaXN0KSB7Ci0JCQljdCA9IHR1cGxlaGFzaF90b19jdHJhY2soaCk7Ci0JCQlpZiAoaXRlcihjdCwgZGF0YSkpCi0JCQkJZ290byBmb3VuZDsKLQkJfQotCX0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGgsICZ1bmNvbmZpcm1lZCwgbGlzdCkgewotCQljdCA9IHR1cGxlaGFzaF90b19jdHJhY2soaCk7Ci0JCWlmIChpdGVyKGN0LCBkYXRhKSkKLQkJCXNldF9iaXQoSVBTX0RZSU5HX0JJVCwgJmN0LT5zdGF0dXMpOwotCX0KLQl3cml0ZV91bmxvY2tfYmgoJmlwX2Nvbm50cmFja19sb2NrKTsKLQlyZXR1cm4gTlVMTDsKLQotZm91bmQ6Ci0JYXRvbWljX2luYygmY3QtPmN0X2dlbmVyYWwudXNlKTsKLQl3cml0ZV91bmxvY2tfYmgoJmlwX2Nvbm50cmFja19sb2NrKTsKLQlyZXR1cm4gY3Q7Ci19Ci0KLXZvaWQKLWlwX2N0X2l0ZXJhdGVfY2xlYW51cChpbnQgKCppdGVyKShzdHJ1Y3QgaXBfY29ubnRyYWNrICppLCB2b2lkICopLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBpcF9jb25udHJhY2sgKmN0OwotCXVuc2lnbmVkIGludCBidWNrZXQgPSAwOwotCi0Jd2hpbGUgKChjdCA9IGdldF9uZXh0X2NvcnBzZShpdGVyLCBkYXRhLCAmYnVja2V0KSkgIT0gTlVMTCkgewotCQkvKiBUaW1lIHRvIHB1c2ggdXAgZGFpc2VzLi4uICovCi0JCWlmIChkZWxfdGltZXIoJmN0LT50aW1lb3V0KSkKLQkJCWRlYXRoX2J5X3RpbWVvdXQoKHVuc2lnbmVkIGxvbmcpY3QpOwotCQkvKiAuLi4gZWxzZSB0aGUgdGltZXIgd2lsbCBnZXQgaGltIHNvb24uICovCi0KLQkJaXBfY29ubnRyYWNrX3B1dChjdCk7Ci0JfQotfQotCi0vKiBGYXN0IGZ1bmN0aW9uIGZvciB0aG9zZSB3aG8gZG9uJ3Qgd2FudCB0byBwYXJzZSAvcHJvYyAoYW5kIEkgZG9uJ3QKLSAgIGJsYW1lIHRoZW0pLiAqLwotLyogUmV2ZXJzaW5nIHRoZSBzb2NrZXQncyBkc3Qvc3JjIHBvaW50IG9mIHZpZXcgZ2l2ZXMgdXMgdGhlIHJlcGx5Ci0gICBtYXBwaW5nLiAqLwotc3RhdGljIGludAotZ2V0b3JpZ2RzdChzdHJ1Y3Qgc29jayAqc2ssIGludCBvcHR2YWwsIHZvaWQgX191c2VyICp1c2VyLCBpbnQgKmxlbikKLXsKLQlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0ID0gaW5ldF9zayhzayk7Ci0Jc3RydWN0IGlwX2Nvbm50cmFja190dXBsZV9oYXNoICpoOwotCXN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgdHVwbGU7Ci0KLQlJUF9DVF9UVVBMRV9VX0JMQU5LKCZ0dXBsZSk7Ci0JdHVwbGUuc3JjLmlwID0gaW5ldC0+cmN2X3NhZGRyOwotCXR1cGxlLnNyYy51LnRjcC5wb3J0ID0gaW5ldC0+c3BvcnQ7Ci0JdHVwbGUuZHN0LmlwID0gaW5ldC0+ZGFkZHI7Ci0JdHVwbGUuZHN0LnUudGNwLnBvcnQgPSBpbmV0LT5kcG9ydDsKLQl0dXBsZS5kc3QucHJvdG9udW0gPSBJUFBST1RPX1RDUDsKLQotCS8qIFdlIG9ubHkgZG8gVENQIGF0IHRoZSBtb21lbnQ6IGlzIHRoZXJlIGEgYmV0dGVyIHdheT8gKi8KLQlpZiAoc3RyY21wKHNrLT5za19wcm90LT5uYW1lLCAiVENQIikpIHsKLQkJREVCVUdQKCJTT19PUklHSU5BTF9EU1Q6IE5vdCBhIFRDUCBzb2NrZXRcbiIpOwotCQlyZXR1cm4gLUVOT1BST1RPT1BUOwotCX0KLQotCWlmICgodW5zaWduZWQgaW50KSAqbGVuIDwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikpIHsKLQkJREVCVUdQKCJTT19PUklHSU5BTF9EU1Q6IGxlbiAldSBub3QgJXVcbiIsCi0JCSAgICAgICAqbGVuLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWggPSBpcF9jb25udHJhY2tfZmluZF9nZXQoJnR1cGxlLCBOVUxMKTsKLQlpZiAoaCkgewotCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2luOwotCQlzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCA9IHR1cGxlaGFzaF90b19jdHJhY2soaCk7Ci0KLQkJc2luLnNpbl9mYW1pbHkgPSBBRl9JTkVUOwotCQlzaW4uc2luX3BvcnQgPSBjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0KLQkJCS50dXBsZS5kc3QudS50Y3AucG9ydDsKLQkJc2luLnNpbl9hZGRyLnNfYWRkciA9IGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXQotCQkJLnR1cGxlLmRzdC5pcDsKLQkJbWVtc2V0KHNpbi5zaW5femVybywgMCwgc2l6ZW9mKHNpbi5zaW5femVybykpOwotCi0JCURFQlVHUCgiU09fT1JJR0lOQUxfRFNUOiAldS4ldS4ldS4ldSAldVxuIiwKLQkJICAgICAgIE5JUFFVQUQoc2luLnNpbl9hZGRyLnNfYWRkciksIG50b2hzKHNpbi5zaW5fcG9ydCkpOwotCQlpcF9jb25udHJhY2tfcHV0KGN0KTsKLQkJaWYgKGNvcHlfdG9fdXNlcih1c2VyLCAmc2luLCBzaXplb2Yoc2luKSkgIT0gMCkKLQkJCXJldHVybiAtRUZBVUxUOwotCQllbHNlCi0JCQlyZXR1cm4gMDsKLQl9Ci0JREVCVUdQKCJTT19PUklHSU5BTF9EU1Q6IENhbid0IGZpbmQgJXUuJXUuJXUuJXUvJXUtJXUuJXUuJXUuJXUvJXUuXG4iLAotCSAgICAgICBOSVBRVUFEKHR1cGxlLnNyYy5pcCksIG50b2hzKHR1cGxlLnNyYy51LnRjcC5wb3J0KSwKLQkgICAgICAgTklQUVVBRCh0dXBsZS5kc3QuaXApLCBudG9ocyh0dXBsZS5kc3QudS50Y3AucG9ydCkpOwotCXJldHVybiAtRU5PRU5UOwotfQotCi1zdGF0aWMgc3RydWN0IG5mX3NvY2tvcHRfb3BzIHNvX2dldG9yaWdkc3QgPSB7Ci0JLnBmCQk9IFBGX0lORVQsCi0JLmdldF9vcHRtaW4JPSBTT19PUklHSU5BTF9EU1QsCi0JLmdldF9vcHRtYXgJPSBTT19PUklHSU5BTF9EU1QrMSwKLQkuZ2V0CQk9ICZnZXRvcmlnZHN0LAotfTsKLQotc3RhdGljIGludCBraWxsX2FsbChzdHJ1Y3QgaXBfY29ubnRyYWNrICppLCB2b2lkICpkYXRhKQotewotCXJldHVybiAxOwotfQotCi12b2lkIGlwX2Nvbm50cmFja19mbHVzaCh2b2lkKQotewotCWlwX2N0X2l0ZXJhdGVfY2xlYW51cChraWxsX2FsbCwgTlVMTCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGZyZWVfY29ubnRyYWNrX2hhc2goc3RydWN0IGxpc3RfaGVhZCAqaGFzaCwgaW50IHZtYWxsb2NlZCxpbnQgc2l6ZSkKLXsKLQlpZiAodm1hbGxvY2VkKQotCQl2ZnJlZShoYXNoKTsKLQllbHNlCi0JCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpaGFzaCwKLQkJCSAgIGdldF9vcmRlcihzaXplb2Yoc3RydWN0IGxpc3RfaGVhZCkgKiBzaXplKSk7Ci19Ci0KLS8qIE1pc2hlYXJpbmcgdGhlIHZvaWNlcyBpbiBoaXMgaGVhZCwgb3VyIGhlcm8gd29uZGVycyBob3cgaGUncwotICAgc3VwcG9zZWQgdG8ga2lsbCB0aGUgbWFsbC4gKi8KLXZvaWQgaXBfY29ubnRyYWNrX2NsZWFudXAodm9pZCkKLXsKLQlyY3VfYXNzaWduX3BvaW50ZXIoaXBfY3RfYXR0YWNoLCBOVUxMKTsKLQotCS8qIFRoaXMgbWFrZXMgc3VyZSBhbGwgY3VycmVudCBwYWNrZXRzIGhhdmUgcGFzc2VkIHRocm91Z2gKLQkgICBuZXRmaWx0ZXIgZnJhbWV3b3JrLiAgUm9sbCBvbiwgdHdvLXN0YWdlIG1vZHVsZQotCSAgIGRlbGV0ZS4uLiAqLwotCXN5bmNocm9uaXplX25ldCgpOwotCi0JaXBfY3RfZXZlbnRfY2FjaGVfZmx1c2goKTsKLSBpX3NlZV9kZWFkX3Blb3BsZToKLQlpcF9jb25udHJhY2tfZmx1c2goKTsKLQlpZiAoYXRvbWljX3JlYWQoJmlwX2Nvbm50cmFja19jb3VudCkgIT0gMCkgewotCQlzY2hlZHVsZSgpOwotCQlnb3RvIGlfc2VlX2RlYWRfcGVvcGxlOwotCX0KLQkvKiB3YWl0IHVudGlsIGFsbCByZWZlcmVuY2VzIHRvIGlwX2Nvbm50cmFja191bnRyYWNrZWQgYXJlIGRyb3BwZWQgKi8KLQl3aGlsZSAoYXRvbWljX3JlYWQoJmlwX2Nvbm50cmFja191bnRyYWNrZWQuY3RfZ2VuZXJhbC51c2UpID4gMSkKLQkJc2NoZWR1bGUoKTsKLQotCWttZW1fY2FjaGVfZGVzdHJveShpcF9jb25udHJhY2tfY2FjaGVwKTsKLQlrbWVtX2NhY2hlX2Rlc3Ryb3koaXBfY29ubnRyYWNrX2V4cGVjdF9jYWNoZXApOwotCWZyZWVfY29ubnRyYWNrX2hhc2goaXBfY29ubnRyYWNrX2hhc2gsIGlwX2Nvbm50cmFja192bWFsbG9jLAotCQkJICAgIGlwX2Nvbm50cmFja19odGFibGVfc2l6ZSk7Ci0JbmZfdW5yZWdpc3Rlcl9zb2Nrb3B0KCZzb19nZXRvcmlnZHN0KTsKLX0KLQotc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgKmFsbG9jX2hhc2h0YWJsZShpbnQgc2l6ZSwgaW50ICp2bWFsbG9jZWQpCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCAqaGFzaDsKLQl1bnNpZ25lZCBpbnQgaTsKLQotCSp2bWFsbG9jZWQgPSAwOwotCWhhc2ggPSAodm9pZCopX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLAotCQkJCSAgICAgICBnZXRfb3JkZXIoc2l6ZW9mKHN0cnVjdCBsaXN0X2hlYWQpCi0JCQkJCQkgKiBzaXplKSk7Ci0JaWYgKCFoYXNoKSB7Ci0JCSp2bWFsbG9jZWQgPSAxOwotCQlwcmludGsoS0VSTl9XQVJOSU5HImlwX2Nvbm50cmFjazogZmFsbGluZyBiYWNrIHRvIHZtYWxsb2MuXG4iKTsKLQkJaGFzaCA9IHZtYWxsb2Moc2l6ZW9mKHN0cnVjdCBsaXN0X2hlYWQpICogc2l6ZSk7Ci0JfQotCi0JaWYgKGhhc2gpCi0JCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCi0JCQlJTklUX0xJU1RfSEVBRCgmaGFzaFtpXSk7Ci0KLQlyZXR1cm4gaGFzaDsKLX0KLQotc3RhdGljIGludCBzZXRfaGFzaHNpemUoY29uc3QgY2hhciAqdmFsLCBzdHJ1Y3Qga2VybmVsX3BhcmFtICprcCkKLXsKLQlpbnQgaSwgYnVja2V0LCBoYXNoc2l6ZSwgdm1hbGxvY2VkOwotCWludCBvbGRfdm1hbGxvY2VkLCBvbGRfc2l6ZTsKLQlpbnQgcm5kOwotCXN0cnVjdCBsaXN0X2hlYWQgKmhhc2gsICpvbGRfaGFzaDsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlX2hhc2ggKmg7Ci0KLQkvKiBPbiBib290LCB3ZSBjYW4gc2V0IHRoaXMgd2l0aG91dCBhbnkgZmFuY3kgbG9ja2luZy4gKi8KLQlpZiAoIWlwX2Nvbm50cmFja19odGFibGVfc2l6ZSkKLQkJcmV0dXJuIHBhcmFtX3NldF9pbnQodmFsLCBrcCk7Ci0KLQloYXNoc2l6ZSA9IHNpbXBsZV9zdHJ0b2wodmFsLCBOVUxMLCAwKTsKLQlpZiAoIWhhc2hzaXplKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWhhc2ggPSBhbGxvY19oYXNodGFibGUoaGFzaHNpemUsICZ2bWFsbG9jZWQpOwotCWlmICghaGFzaCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQkvKiBXZSBoYXZlIHRvIHJlaGFzaCBmb3IgdGhlIG5ldyB0YWJsZSBhbnl3YXksIHNvIHdlIGFsc28gY2FuCi0JICogdXNlIGEgbmV3IHJhbmRvbSBzZWVkICovCi0JZ2V0X3JhbmRvbV9ieXRlcygmcm5kLCA0KTsKLQotCXdyaXRlX2xvY2tfYmgoJmlwX2Nvbm50cmFja19sb2NrKTsKLQlmb3IgKGkgPSAwOyBpIDwgaXBfY29ubnRyYWNrX2h0YWJsZV9zaXplOyBpKyspIHsKLQkJd2hpbGUgKCFsaXN0X2VtcHR5KCZpcF9jb25udHJhY2tfaGFzaFtpXSkpIHsKLQkJCWggPSBsaXN0X2VudHJ5KGlwX2Nvbm50cmFja19oYXNoW2ldLm5leHQsCi0JCQkJICAgICAgIHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGVfaGFzaCwgbGlzdCk7Ci0JCQlsaXN0X2RlbCgmaC0+bGlzdCk7Ci0JCQlidWNrZXQgPSBfX2hhc2hfY29ubnRyYWNrKCZoLT50dXBsZSwgaGFzaHNpemUsIHJuZCk7Ci0JCQlsaXN0X2FkZF90YWlsKCZoLT5saXN0LCAmaGFzaFtidWNrZXRdKTsKLQkJfQotCX0KLQlvbGRfc2l6ZSA9IGlwX2Nvbm50cmFja19odGFibGVfc2l6ZTsKLQlvbGRfdm1hbGxvY2VkID0gaXBfY29ubnRyYWNrX3ZtYWxsb2M7Ci0Jb2xkX2hhc2ggPSBpcF9jb25udHJhY2tfaGFzaDsKLQotCWlwX2Nvbm50cmFja19odGFibGVfc2l6ZSA9IGhhc2hzaXplOwotCWlwX2Nvbm50cmFja192bWFsbG9jID0gdm1hbGxvY2VkOwotCWlwX2Nvbm50cmFja19oYXNoID0gaGFzaDsKLQlpcF9jb25udHJhY2tfaGFzaF9ybmQgPSBybmQ7Ci0Jd3JpdGVfdW5sb2NrX2JoKCZpcF9jb25udHJhY2tfbG9jayk7Ci0KLQlmcmVlX2Nvbm50cmFja19oYXNoKG9sZF9oYXNoLCBvbGRfdm1hbGxvY2VkLCBvbGRfc2l6ZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLW1vZHVsZV9wYXJhbV9jYWxsKGhhc2hzaXplLCBzZXRfaGFzaHNpemUsIHBhcmFtX2dldF91aW50LAotCQkgICZpcF9jb25udHJhY2tfaHRhYmxlX3NpemUsIDA2MDApOwotCi1pbnQgX19pbml0IGlwX2Nvbm50cmFja19pbml0KHZvaWQpCi17Ci0JdW5zaWduZWQgaW50IGk7Ci0JaW50IHJldDsKLQotCS8qIElkZWEgZnJvbSB0Y3AuYzogdXNlIDEvMTYzODQgb2YgbWVtb3J5LiAgT24gaTM4NjogMzJNQgotCSAqIG1hY2hpbmUgaGFzIDI1NiBidWNrZXRzLiAgPj0gMUdCIG1hY2hpbmVzIGhhdmUgODE5MiBidWNrZXRzLiAqLwotCWlmICghaXBfY29ubnRyYWNrX2h0YWJsZV9zaXplKSB7Ci0JCWlwX2Nvbm50cmFja19odGFibGVfc2l6ZQotCQkJPSAoKChudW1fcGh5c3BhZ2VzIDw8IFBBR0VfU0hJRlQpIC8gMTYzODQpCi0JCQkgICAvIHNpemVvZihzdHJ1Y3QgbGlzdF9oZWFkKSk7Ci0JCWlmIChudW1fcGh5c3BhZ2VzID4gKDEwMjQgKiAxMDI0ICogMTAyNCAvIFBBR0VfU0laRSkpCi0JCQlpcF9jb25udHJhY2tfaHRhYmxlX3NpemUgPSA4MTkyOwotCQlpZiAoaXBfY29ubnRyYWNrX2h0YWJsZV9zaXplIDwgMTYpCi0JCQlpcF9jb25udHJhY2tfaHRhYmxlX3NpemUgPSAxNjsKLQl9Ci0JaXBfY29ubnRyYWNrX21heCA9IDggKiBpcF9jb25udHJhY2tfaHRhYmxlX3NpemU7Ci0KLQlwcmludGsoImlwX2Nvbm50cmFjayB2ZXJzaW9uICVzICgldSBidWNrZXRzLCAlZCBtYXgpIgotCSAgICAgICAiIC0gJVpkIGJ5dGVzIHBlciBjb25udHJhY2tcbiIsIElQX0NPTk5UUkFDS19WRVJTSU9OLAotCSAgICAgICBpcF9jb25udHJhY2tfaHRhYmxlX3NpemUsIGlwX2Nvbm50cmFja19tYXgsCi0JICAgICAgIHNpemVvZihzdHJ1Y3QgaXBfY29ubnRyYWNrKSk7Ci0KLQlyZXQgPSBuZl9yZWdpc3Rlcl9zb2Nrb3B0KCZzb19nZXRvcmlnZHN0KTsKLQlpZiAocmV0ICE9IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gcmVnaXN0ZXIgbmV0ZmlsdGVyIHNvY2tldCBvcHRpb25cbiIpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCWlwX2Nvbm50cmFja19oYXNoID0gYWxsb2NfaGFzaHRhYmxlKGlwX2Nvbm50cmFja19odGFibGVfc2l6ZSwKLQkJCQkJICAgICZpcF9jb25udHJhY2tfdm1hbGxvYyk7Ci0JaWYgKCFpcF9jb25udHJhY2tfaGFzaCkgewotCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBjcmVhdGUgaXBfY29ubnRyYWNrX2hhc2hcbiIpOwotCQlnb3RvIGVycl91bnJlZ19zb2Nrb3B0OwotCX0KLQotCWlwX2Nvbm50cmFja19jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiaXBfY29ubnRyYWNrIiwKLQkJCQkJCXNpemVvZihzdHJ1Y3QgaXBfY29ubnRyYWNrKSwgMCwKLQkJCQkJCTAsIE5VTEwsIE5VTEwpOwotCWlmICghaXBfY29ubnRyYWNrX2NhY2hlcCkgewotCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBjcmVhdGUgaXBfY29ubnRyYWNrIHNsYWIgY2FjaGVcbiIpOwotCQlnb3RvIGVycl9mcmVlX2hhc2g7Ci0JfQotCi0JaXBfY29ubnRyYWNrX2V4cGVjdF9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiaXBfY29ubnRyYWNrX2V4cGVjdCIsCi0JCQkJCXNpemVvZihzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCksCi0JCQkJCTAsIDAsIE5VTEwsIE5VTEwpOwotCWlmICghaXBfY29ubnRyYWNrX2V4cGVjdF9jYWNoZXApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gY3JlYXRlIGlwX2V4cGVjdCBzbGFiIGNhY2hlXG4iKTsKLQkJZ290byBlcnJfZnJlZV9jb25udHJhY2tfc2xhYjsKLQl9Ci0KLQkvKiBEb24ndCBORUVEIGxvY2sgaGVyZSwgYnV0IGdvb2QgZm9ybSBhbnl3YXkuICovCi0Jd3JpdGVfbG9ja19iaCgmaXBfY29ubnRyYWNrX2xvY2spOwotCWZvciAoaSA9IDA7IGkgPCBNQVhfSVBfQ1RfUFJPVE87IGkrKykKLQkJcmN1X2Fzc2lnbl9wb2ludGVyKGlwX2N0X3Byb3Rvc1tpXSwgJmlwX2Nvbm50cmFja19nZW5lcmljX3Byb3RvY29sKTsKLQkvKiBTZXcgaW4gYnVpbHRpbiBwcm90b2NvbHMuICovCi0JcmN1X2Fzc2lnbl9wb2ludGVyKGlwX2N0X3Byb3Rvc1tJUFBST1RPX1RDUF0sICZpcF9jb25udHJhY2tfcHJvdG9jb2xfdGNwKTsKLQlyY3VfYXNzaWduX3BvaW50ZXIoaXBfY3RfcHJvdG9zW0lQUFJPVE9fVURQXSwgJmlwX2Nvbm50cmFja19wcm90b2NvbF91ZHApOwotCXJjdV9hc3NpZ25fcG9pbnRlcihpcF9jdF9wcm90b3NbSVBQUk9UT19JQ01QXSwgJmlwX2Nvbm50cmFja19wcm90b2NvbF9pY21wKTsKLQl3cml0ZV91bmxvY2tfYmgoJmlwX2Nvbm50cmFja19sb2NrKTsKLQotCS8qIEZvciB1c2UgYnkgaXB0X1JFSkVDVCAqLwotCXJjdV9hc3NpZ25fcG9pbnRlcihpcF9jdF9hdHRhY2gsIGlwX2Nvbm50cmFja19hdHRhY2gpOwotCi0JLyogU2V0IHVwIGZha2UgY29ubnRyYWNrOgotCSAgICAtIHRvIG5ldmVyIGJlIGRlbGV0ZWQsIG5vdCBpbiBhbnkgaGFzaGVzICovCi0JYXRvbWljX3NldCgmaXBfY29ubnRyYWNrX3VudHJhY2tlZC5jdF9nZW5lcmFsLnVzZSwgMSk7Ci0JLyogIC0gYW5kIGxvb2sgaXQgbGlrZSBhcyBhIGNvbmZpcm1lZCBjb25uZWN0aW9uICovCi0Jc2V0X2JpdChJUFNfQ09ORklSTUVEX0JJVCwgJmlwX2Nvbm50cmFja191bnRyYWNrZWQuc3RhdHVzKTsKLQotCXJldHVybiByZXQ7Ci0KLWVycl9mcmVlX2Nvbm50cmFja19zbGFiOgotCWttZW1fY2FjaGVfZGVzdHJveShpcF9jb25udHJhY2tfY2FjaGVwKTsKLWVycl9mcmVlX2hhc2g6Ci0JZnJlZV9jb25udHJhY2tfaGFzaChpcF9jb25udHJhY2tfaGFzaCwgaXBfY29ubnRyYWNrX3ZtYWxsb2MsCi0JCQkgICAgaXBfY29ubnRyYWNrX2h0YWJsZV9zaXplKTsKLWVycl91bnJlZ19zb2Nrb3B0OgotCW5mX3VucmVnaXN0ZXJfc29ja29wdCgmc29fZ2V0b3JpZ2RzdCk7Ci0KLQlyZXR1cm4gLUVOT01FTTsKLX0KZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfZnRwLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX2Z0cC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmFhNjhhLi4wMDAwMDAwCi0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfZnRwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MjAgKzAsMCBAQAotLyogRlRQIGV4dGVuc2lvbiBmb3IgSVAgY29ubmVjdGlvbiB0cmFja2luZy4gKi8KLQotLyogKEMpIDE5OTktMjAwMSBQYXVsIGBSdXN0eScgUnVzc2VsbAotICogKEMpIDIwMDItMjAwNCBOZXRmaWx0ZXIgQ29yZSBUZWFtIDxjb3JldGVhbUBuZXRmaWx0ZXIub3JnPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgotI2luY2x1ZGUgPGxpbnV4L2lwLmg+Ci0jaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KLSNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KLSNpbmNsdWRlIDxuZXQvdGNwLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfaGVscGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2Z0cC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+Ci0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9BVVRIT1IoIlJ1c3R5IFJ1c3NlbGwgPHJ1c3R5QHJ1c3Rjb3JwLmNvbS5hdT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiZnRwIGNvbm5lY3Rpb24gdHJhY2tpbmcgaGVscGVyIik7Ci0KLS8qIFRoaXMgaXMgc2xvdywgYnV0IGl0J3Mgc2ltcGxlLiAtLVJSICovCi1zdGF0aWMgY2hhciAqZnRwX2J1ZmZlcjsKLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soaXBfZnRwX2xvY2spOwotCi0jZGVmaW5lIE1BWF9QT1JUUyA4Ci1zdGF0aWMgdW5zaWduZWQgc2hvcnQgcG9ydHNbTUFYX1BPUlRTXTsKLXN0YXRpYyBpbnQgcG9ydHNfYzsKLW1vZHVsZV9wYXJhbV9hcnJheShwb3J0cywgdXNob3J0LCAmcG9ydHNfYywgMDQwMCk7Ci0KLXN0YXRpYyBpbnQgbG9vc2U7Ci1tb2R1bGVfcGFyYW0obG9vc2UsIGJvb2wsIDA2MDApOwotCi11bnNpZ25lZCBpbnQgKCppcF9uYXRfZnRwX2hvb2spKHN0cnVjdCBza19idWZmICoqcHNrYiwKLQkJCQllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKLQkJCQllbnVtIGlwX2N0X2Z0cF90eXBlIHR5cGUsCi0JCQkJdW5zaWduZWQgaW50IG1hdGNob2ZmLAotCQkJCXVuc2lnbmVkIGludCBtYXRjaGxlbiwKLQkJCQlzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqZXhwLAotCQkJCXUzMiAqc2VxKTsKLUVYUE9SVF9TWU1CT0xfR1BMKGlwX25hdF9mdHBfaG9vayk7Ci0KLSNpZiAwCi0jZGVmaW5lIERFQlVHUCBwcmludGsKLSNlbHNlCi0jZGVmaW5lIERFQlVHUChmb3JtYXQsIGFyZ3MuLi4pCi0jZW5kaWYKLQotc3RhdGljIGludCB0cnlfcmZjOTU5KGNvbnN0IGNoYXIgKiwgc2l6ZV90LCB1X2ludDMyX3QgW10sIGNoYXIpOwotc3RhdGljIGludCB0cnlfZXBydChjb25zdCBjaGFyICosIHNpemVfdCwgdV9pbnQzMl90IFtdLCBjaGFyKTsKLXN0YXRpYyBpbnQgdHJ5X2Vwc3ZfcmVzcG9uc2UoY29uc3QgY2hhciAqLCBzaXplX3QsIHVfaW50MzJfdCBbXSwgY2hhcik7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZnRwX3NlYXJjaCB7Ci0JY29uc3QgY2hhciAqcGF0dGVybjsKLQlzaXplX3QgcGxlbjsKLQljaGFyIHNraXA7Ci0JY2hhciB0ZXJtOwotCWVudW0gaXBfY3RfZnRwX3R5cGUgZnRwdHlwZTsKLQlpbnQgKCpnZXRudW0pKGNvbnN0IGNoYXIgKiwgc2l6ZV90LCB1X2ludDMyX3RbXSwgY2hhcik7Ci19IHNlYXJjaFtJUF9DVF9ESVJfTUFYXVsyXSA9IHsKLQlbSVBfQ1RfRElSX09SSUdJTkFMXSA9IHsKLQkJewotCQkJLnBhdHRlcm4JPSAgIlBPUlQiLAotCQkJLnBsZW4JCT0gc2l6ZW9mKCJQT1JUIikgLSAxLAotCQkJLnNraXAJCT0gJyAnLAotCQkJLnRlcm0JCT0gJ1xyJywKLQkJCS5mdHB0eXBlCT0gSVBfQ1RfRlRQX1BPUlQsCi0JCQkuZ2V0bnVtCQk9IHRyeV9yZmM5NTksCi0JCX0sCi0JCXsKLQkJCS5wYXR0ZXJuCT0gIkVQUlQiLAotCQkJLnBsZW4JCT0gc2l6ZW9mKCJFUFJUIikgLSAxLAotCQkJLnNraXAJCT0gJyAnLAotCQkJLnRlcm0JCT0gJ1xyJywKLQkJCS5mdHB0eXBlCT0gSVBfQ1RfRlRQX0VQUlQsCi0JCQkuZ2V0bnVtCQk9IHRyeV9lcHJ0LAotCQl9LAotCX0sCi0JW0lQX0NUX0RJUl9SRVBMWV0gPSB7Ci0JCXsKLQkJCS5wYXR0ZXJuCT0gIjIyNyAiLAotCQkJLnBsZW4JCT0gc2l6ZW9mKCIyMjcgIikgLSAxLAotCQkJLnNraXAJCT0gJygnLAotCQkJLnRlcm0JCT0gJyknLAotCQkJLmZ0cHR5cGUJPSBJUF9DVF9GVFBfUEFTViwKLQkJCS5nZXRudW0JCT0gdHJ5X3JmYzk1OSwKLQkJfSwKLQkJewotCQkJLnBhdHRlcm4JPSAiMjI5ICIsCi0JCQkucGxlbgkJPSBzaXplb2YoIjIyOSAiKSAtIDEsCi0JCQkuc2tpcAkJPSAnKCcsCi0JCQkudGVybQkJPSAnKScsCi0JCQkuZnRwdHlwZQk9IElQX0NUX0ZUUF9FUFNWLAotCQkJLmdldG51bQkJPSB0cnlfZXBzdl9yZXNwb25zZSwKLQkJfSwKLQl9LAotfTsKLQotc3RhdGljIGludCB0cnlfbnVtYmVyKGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBkbGVuLCB1X2ludDMyX3QgYXJyYXlbXSwKLQkJICAgICAgaW50IGFycmF5X3NpemUsIGNoYXIgc2VwLCBjaGFyIHRlcm0pCi17Ci0JdV9pbnQzMl90IGksIGxlbjsKLQotCW1lbXNldChhcnJheSwgMCwgc2l6ZW9mKGFycmF5WzBdKSphcnJheV9zaXplKTsKLQotCS8qIEtlZXAgZGF0YSBwb2ludGluZyBhdCBuZXh0IGNoYXIuICovCi0JZm9yIChpID0gMCwgbGVuID0gMDsgbGVuIDwgZGxlbiAmJiBpIDwgYXJyYXlfc2l6ZTsgbGVuKyssIGRhdGErKykgewotCQlpZiAoKmRhdGEgPj0gJzAnICYmICpkYXRhIDw9ICc5JykgewotCQkJYXJyYXlbaV0gPSBhcnJheVtpXSoxMCArICpkYXRhIC0gJzAnOwotCQl9Ci0JCWVsc2UgaWYgKCpkYXRhID09IHNlcCkKLQkJCWkrKzsKLQkJZWxzZSB7Ci0JCQkvKiBVbmV4cGVjdGVkIGNoYXJhY3RlcjsgdHJ1ZSBpZiBpdCdzIHRoZQotCQkJICAgdGVybWluYXRvciBhbmQgd2UncmUgZmluaXNoZWQuICovCi0JCQlpZiAoKmRhdGEgPT0gdGVybSAmJiBpID09IGFycmF5X3NpemUgLSAxKQotCQkJCXJldHVybiBsZW47Ci0KLQkJCURFQlVHUCgiQ2hhciAldSAoZ290ICV1IG51bXMpIGAldScgdW5leHBlY3RlZFxuIiwKLQkJCSAgICAgICBsZW4sIGksICpkYXRhKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCURFQlVHUCgiRmFpbGVkIHRvIGZpbGwgJXUgbnVtYmVycyBzZXBhcmF0ZWQgYnkgJWNcbiIsIGFycmF5X3NpemUsIHNlcCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogUmV0dXJucyAwLCBvciBsZW5ndGggb2YgbnVtYmVyczogMTkyLDE2OCwxLDEsNSw2ICovCi1zdGF0aWMgaW50IHRyeV9yZmM5NTkoY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IGRsZW4sIHVfaW50MzJfdCBhcnJheVs2XSwKLQkJICAgICAgIGNoYXIgdGVybSkKLXsKLQlyZXR1cm4gdHJ5X251bWJlcihkYXRhLCBkbGVuLCBhcnJheSwgNiwgJywnLCB0ZXJtKTsKLX0KLQotLyogR3JhYiBwb3J0OiBudW1iZXIgdXAgdG8gZGVsaW1pdGVyICovCi1zdGF0aWMgaW50IGdldF9wb3J0KGNvbnN0IGNoYXIgKmRhdGEsIGludCBzdGFydCwgc2l6ZV90IGRsZW4sIGNoYXIgZGVsaW0sCi0JCSAgICB1X2ludDMyX3QgYXJyYXlbMl0pCi17Ci0JdV9pbnQxNl90IHBvcnQgPSAwOwotCWludCBpOwotCi0JZm9yIChpID0gc3RhcnQ7IGkgPCBkbGVuOyBpKyspIHsKLQkJLyogRmluaXNoZWQ/ICovCi0JCWlmIChkYXRhW2ldID09IGRlbGltKSB7Ci0JCQlpZiAocG9ydCA9PSAwKQotCQkJCWJyZWFrOwotCQkJYXJyYXlbMF0gPSBwb3J0ID4+IDg7Ci0JCQlhcnJheVsxXSA9IHBvcnQ7Ci0JCQlyZXR1cm4gaSArIDE7Ci0JCX0KLQkJZWxzZSBpZiAoZGF0YVtpXSA+PSAnMCcgJiYgZGF0YVtpXSA8PSAnOScpCi0JCQlwb3J0ID0gcG9ydCoxMCArIGRhdGFbaV0gLSAnMCc7Ci0JCWVsc2UgLyogU29tZSBvdGhlciBjcmFwICovCi0JCQlicmVhazsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIFJldHVybnMgMCwgb3IgbGVuZ3RoIG9mIG51bWJlcnM6IHwxfDEzMi4yMzUuMS4yfDYyNzV8ICovCi1zdGF0aWMgaW50IHRyeV9lcHJ0KGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBkbGVuLCB1X2ludDMyX3QgYXJyYXlbNl0sCi0JCSAgICBjaGFyIHRlcm0pCi17Ci0JY2hhciBkZWxpbTsKLQlpbnQgbGVuZ3RoOwotCi0JLyogRmlyc3QgY2hhcmFjdGVyIGlzIGRlbGltaXRlciwgdGhlbiAiMSIgZm9yIElQdjQsIHRoZW4KLQkgICBkZWxpbWl0ZXIgYWdhaW4uICovCi0JaWYgKGRsZW4gPD0gMykgcmV0dXJuIDA7Ci0JZGVsaW0gPSBkYXRhWzBdOwotCWlmIChpc2RpZ2l0KGRlbGltKSB8fCBkZWxpbSA8IDMzIHx8IGRlbGltID4gMTI2Ci0JICAgIHx8IGRhdGFbMV0gIT0gJzEnIHx8IGRhdGFbMl0gIT0gZGVsaW0pCi0JCXJldHVybiAwOwotCi0JREVCVUdQKCJFUFJUOiBHb3QgfDF8IVxuIik7Ci0JLyogTm93IHdlIGhhdmUgSVAgYWRkcmVzcy4gKi8KLQlsZW5ndGggPSB0cnlfbnVtYmVyKGRhdGEgKyAzLCBkbGVuIC0gMywgYXJyYXksIDQsICcuJywgZGVsaW0pOwotCWlmIChsZW5ndGggPT0gMCkKLQkJcmV0dXJuIDA7Ci0KLQlERUJVR1AoIkVQUlQ6IEdvdCBJUCBhZGRyZXNzIVxuIik7Ci0JLyogU3RhcnQgb2Zmc2V0IGluY2x1ZGVzIGluaXRpYWwgInwxfCIsIGFuZCB0cmFpbGluZyBkZWxpbWl0ZXIgKi8KLQlyZXR1cm4gZ2V0X3BvcnQoZGF0YSwgMyArIGxlbmd0aCArIDEsIGRsZW4sIGRlbGltLCBhcnJheSs0KTsKLX0KLQotLyogUmV0dXJucyAwLCBvciBsZW5ndGggb2YgbnVtYmVyczogfHx8NjQ0NnwgKi8KLXN0YXRpYyBpbnQgdHJ5X2Vwc3ZfcmVzcG9uc2UoY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IGRsZW4sIHVfaW50MzJfdCBhcnJheVs2XSwKLQkJCSAgICAgY2hhciB0ZXJtKQotewotCWNoYXIgZGVsaW07Ci0KLQkvKiBUaHJlZSBkZWxpbWl0ZXJzLiAqLwotCWlmIChkbGVuIDw9IDMpIHJldHVybiAwOwotCWRlbGltID0gZGF0YVswXTsKLQlpZiAoaXNkaWdpdChkZWxpbSkgfHwgZGVsaW0gPCAzMyB8fCBkZWxpbSA+IDEyNgotCSAgICB8fCBkYXRhWzFdICE9IGRlbGltIHx8IGRhdGFbMl0gIT0gZGVsaW0pCi0JCXJldHVybiAwOwotCi0JcmV0dXJuIGdldF9wb3J0KGRhdGEsIDMsIGRsZW4sIGRlbGltLCBhcnJheSs0KTsKLX0KLQotLyogUmV0dXJuIDEgZm9yIG1hdGNoLCAwIGZvciBhY2NlcHQsIC0xIGZvciBwYXJ0aWFsLiAqLwotc3RhdGljIGludCBmaW5kX3BhdHRlcm4oY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IGRsZW4sCi0JCQljb25zdCBjaGFyICpwYXR0ZXJuLCBzaXplX3QgcGxlbiwKLQkJCWNoYXIgc2tpcCwgY2hhciB0ZXJtLAotCQkJdW5zaWduZWQgaW50ICpudW1vZmYsCi0JCQl1bnNpZ25lZCBpbnQgKm51bWxlbiwKLQkJCXVfaW50MzJfdCBhcnJheVs2XSwKLQkJCWludCAoKmdldG51bSkoY29uc3QgY2hhciAqLCBzaXplX3QsIHVfaW50MzJfdFtdLCBjaGFyKSkKLXsKLQlzaXplX3QgaTsKLQotCURFQlVHUCgiZmluZF9wYXR0ZXJuIGAlcyc6IGRsZW4gPSAldVxuIiwgcGF0dGVybiwgZGxlbik7Ci0JaWYgKGRsZW4gPT0gMCkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoZGxlbiA8PSBwbGVuKSB7Ci0JCS8qIFNob3J0IHBhY2tldDogdHJ5IGZvciBwYXJ0aWFsPyAqLwotCQlpZiAoc3RybmljbXAoZGF0YSwgcGF0dGVybiwgZGxlbikgPT0gMCkKLQkJCXJldHVybiAtMTsKLQkJZWxzZSByZXR1cm4gMDsKLQl9Ci0KLQlpZiAoc3RybmljbXAoZGF0YSwgcGF0dGVybiwgcGxlbikgIT0gMCkgewotI2lmIDAKLQkJc2l6ZV90IGk7Ci0KLQkJREVCVUdQKCJmdHA6IHN0cmluZyBtaXNtYXRjaFxuIik7Ci0JCWZvciAoaSA9IDA7IGkgPCBwbGVuOyBpKyspIHsKLQkJCURFQlVHUCgiZnRwOmNoYXIgJXUgYCVjJygldSkgdnMgYCVjJygldSlcbiIsCi0JCQkJaSwgZGF0YVtpXSwgZGF0YVtpXSwKLQkJCQlwYXR0ZXJuW2ldLCBwYXR0ZXJuW2ldKTsKLQkJfQotI2VuZGlmCi0JCXJldHVybiAwOwotCX0KLQotCURFQlVHUCgiUGF0dGVybiBtYXRjaGVzIVxuIik7Ci0JLyogTm93IHdlJ3ZlIGZvdW5kIHRoZSBjb25zdGFudCBzdHJpbmcsIHRyeSB0byBza2lwCi0JICAgdG8gdGhlICdza2lwJyBjaGFyYWN0ZXIgKi8KLQlmb3IgKGkgPSBwbGVuOyBkYXRhW2ldICE9IHNraXA7IGkrKykKLQkJaWYgKGkgPT0gZGxlbiAtIDEpIHJldHVybiAtMTsKLQotCS8qIFNraXAgb3ZlciB0aGUgbGFzdCBjaGFyYWN0ZXIgKi8KLQlpKys7Ci0KLQlERUJVR1AoIlNraXBwZWQgdXAgdG8gYCVjJyFcbiIsIHNraXApOwotCi0JKm51bW9mZiA9IGk7Ci0JKm51bWxlbiA9IGdldG51bShkYXRhICsgaSwgZGxlbiAtIGksIGFycmF5LCB0ZXJtKTsKLQlpZiAoISpudW1sZW4pCi0JCXJldHVybiAtMTsKLQotCURFQlVHUCgiTWF0Y2ggc3VjY2VlZGVkIVxuIik7Ci0JcmV0dXJuIDE7Ci19Ci0KLS8qIExvb2sgdXAgdG8gc2VlIGlmIHdlJ3JlIGp1c3QgYWZ0ZXIgYSBcbi4gKi8KLXN0YXRpYyBpbnQgZmluZF9ubF9zZXEodTMyIHNlcSwgY29uc3Qgc3RydWN0IGlwX2N0X2Z0cF9tYXN0ZXIgKmluZm8sIGludCBkaXIpCi17Ci0JdW5zaWduZWQgaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgaW5mby0+c2VxX2FmdF9ubF9udW1bZGlyXTsgaSsrKQotCQlpZiAoaW5mby0+c2VxX2FmdF9ubFtkaXJdW2ldID09IHNlcSkKLQkJCXJldHVybiAxOwotCXJldHVybiAwOwotfQotCi0vKiBXZSBkb24ndCB1cGRhdGUgaWYgaXQncyBvbGRlciB0aGFuIHdoYXQgd2UgaGF2ZS4gKi8KLXN0YXRpYyB2b2lkIHVwZGF0ZV9ubF9zZXEodTMyIG5sX3NlcSwgc3RydWN0IGlwX2N0X2Z0cF9tYXN0ZXIgKmluZm8sIGludCBkaXIsCi0JCQkgIHN0cnVjdCBza19idWZmICpza2IpCi17Ci0JdW5zaWduZWQgaW50IGksIG9sZGVzdCA9IE5VTV9TRVFfVE9fUkVNRU1CRVI7Ci0KLQkvKiBMb29rIGZvciBvbGRlc3Q6IGlmIHdlIGZpbmQgZXhhY3QgbWF0Y2gsIHdlJ3JlIGRvbmUuICovCi0JZm9yIChpID0gMDsgaSA8IGluZm8tPnNlcV9hZnRfbmxfbnVtW2Rpcl07IGkrKykgewotCQlpZiAoaW5mby0+c2VxX2FmdF9ubFtkaXJdW2ldID09IG5sX3NlcSkKLQkJCXJldHVybjsKLQotCQlpZiAob2xkZXN0ID09IGluZm8tPnNlcV9hZnRfbmxfbnVtW2Rpcl0KLQkJICAgIHx8IGJlZm9yZShpbmZvLT5zZXFfYWZ0X25sW2Rpcl1baV0sIG9sZGVzdCkpCi0JCQlvbGRlc3QgPSBpOwotCX0KLQotCWlmIChpbmZvLT5zZXFfYWZ0X25sX251bVtkaXJdIDwgTlVNX1NFUV9UT19SRU1FTUJFUikgewotCQlpbmZvLT5zZXFfYWZ0X25sW2Rpcl1baW5mby0+c2VxX2FmdF9ubF9udW1bZGlyXSsrXSA9IG5sX3NlcTsKLQkJaXBfY29ubnRyYWNrX2V2ZW50X2NhY2hlKElQQ1RfSEVMUElORk9fVk9MQVRJTEUsIHNrYik7Ci0JfSBlbHNlIGlmIChvbGRlc3QgIT0gTlVNX1NFUV9UT19SRU1FTUJFUikgewotCQlpbmZvLT5zZXFfYWZ0X25sW2Rpcl1bb2xkZXN0XSA9IG5sX3NlcTsKLQkJaXBfY29ubnRyYWNrX2V2ZW50X2NhY2hlKElQQ1RfSEVMUElORk9fVk9MQVRJTEUsIHNrYik7Ci0JfQotfQotCi1zdGF0aWMgaW50IGhlbHAoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAotCQlzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKLQkJZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8pCi17Ci0JdW5zaWduZWQgaW50IGRhdGFvZmYsIGRhdGFsZW47Ci0Jc3RydWN0IHRjcGhkciBfdGNwaCwgKnRoOwotCWNoYXIgKmZiX3B0cjsKLQlpbnQgcmV0OwotCXUzMiBzZXEsIGFycmF5WzZdID0geyAwIH07Ci0JaW50IGRpciA9IENUSU5GTzJESVIoY3RpbmZvKTsKLQl1bnNpZ25lZCBpbnQgbWF0Y2hsZW4sIG1hdGNob2ZmOwotCXN0cnVjdCBpcF9jdF9mdHBfbWFzdGVyICpjdF9mdHBfaW5mbyA9ICZjdC0+aGVscC5jdF9mdHBfaW5mbzsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqZXhwOwotCXVuc2lnbmVkIGludCBpOwotCWludCBmb3VuZCA9IDAsIGVuZHNfaW5fbmw7Ci0JdHlwZW9mKGlwX25hdF9mdHBfaG9vaykgaXBfbmF0X2Z0cDsKLQotCS8qIFVudGlsIHRoZXJlJ3MgYmVlbiB0cmFmZmljIGJvdGggd2F5cywgZG9uJ3QgbG9vayBpbiBwYWNrZXRzLiAqLwotCWlmIChjdGluZm8gIT0gSVBfQ1RfRVNUQUJMSVNIRUQKLQkgICAgJiYgY3RpbmZvICE9IElQX0NUX0VTVEFCTElTSEVEK0lQX0NUX0lTX1JFUExZKSB7Ci0JCURFQlVHUCgiZnRwOiBDb25udHJhY2tpbmZvID0gJXVcbiIsIGN0aW5mbyk7Ci0JCXJldHVybiBORl9BQ0NFUFQ7Ci0JfQotCi0JdGggPSBza2JfaGVhZGVyX3BvaW50ZXIoKnBza2IsICgqcHNrYiktPm5oLmlwaC0+aWhsKjQsCi0JCQkJc2l6ZW9mKF90Y3BoKSwgJl90Y3BoKTsKLQlpZiAodGggPT0gTlVMTCkKLQkJcmV0dXJuIE5GX0FDQ0VQVDsKLQotCWRhdGFvZmYgPSAoKnBza2IpLT5uaC5pcGgtPmlobCo0ICsgdGgtPmRvZmYqNDsKLQkvKiBObyBkYXRhPyAqLwotCWlmIChkYXRhb2ZmID49ICgqcHNrYiktPmxlbikgewotCQlERUJVR1AoImZ0cDogcHNrYmxlbiA9ICV1XG4iLCAoKnBza2IpLT5sZW4pOwotCQlyZXR1cm4gTkZfQUNDRVBUOwotCX0KLQlkYXRhbGVuID0gKCpwc2tiKS0+bGVuIC0gZGF0YW9mZjsKLQotCXNwaW5fbG9ja19iaCgmaXBfZnRwX2xvY2spOwotCWZiX3B0ciA9IHNrYl9oZWFkZXJfcG9pbnRlcigqcHNrYiwgZGF0YW9mZiwKLQkJCQkgICAgKCpwc2tiKS0+bGVuIC0gZGF0YW9mZiwgZnRwX2J1ZmZlcik7Ci0JQlVHX09OKGZiX3B0ciA9PSBOVUxMKTsKLQotCWVuZHNfaW5fbmwgPSAoZmJfcHRyW2RhdGFsZW4gLSAxXSA9PSAnXG4nKTsKLQlzZXEgPSBudG9obCh0aC0+c2VxKSArIGRhdGFsZW47Ci0KLQkvKiBMb29rIHVwIHRvIHNlZSBpZiB3ZSdyZSBqdXN0IGFmdGVyIGEgXG4uICovCi0JaWYgKCFmaW5kX25sX3NlcShudG9obCh0aC0+c2VxKSwgY3RfZnRwX2luZm8sIGRpcikpIHsKLQkJLyogTm93IGlmIHRoaXMgZW5kcyBpbiBcbiwgdXBkYXRlIGZ0cCBpbmZvLiAqLwotCQlERUJVR1AoImlwX2Nvbm50cmFja19mdHBfaGVscDogd3Jvbmcgc2VxIHBvcyAlcygldSkgb3IgJXMoJXUpXG4iLAotCQkgICAgICAgY3RfZnRwX2luZm8tPnNlcV9hZnRfbmxbMF1bZGlyXQotCQkgICAgICAgb2xkX3NlcV9hZnRfbmxfc2V0ID8gIiI6IihVTlNFVCkgIiwgb2xkX3NlcV9hZnRfbmwpOwotCQlyZXQgPSBORl9BQ0NFUFQ7Ci0JCWdvdG8gb3V0X3VwZGF0ZV9ubDsKLQl9Ci0KLQkvKiBJbml0aWFsaXplIElQIGFycmF5IHRvIGV4cGVjdGVkIGFkZHJlc3MgKGl0J3Mgbm90IG1lbnRpb25lZAotCSAgIGluIEVQU1YgcmVzcG9uc2VzKSAqLwotCWFycmF5WzBdID0gKG50b2hsKGN0LT50dXBsZWhhc2hbZGlyXS50dXBsZS5zcmMuaXApID4+IDI0KSAmIDB4RkY7Ci0JYXJyYXlbMV0gPSAobnRvaGwoY3QtPnR1cGxlaGFzaFtkaXJdLnR1cGxlLnNyYy5pcCkgPj4gMTYpICYgMHhGRjsKLQlhcnJheVsyXSA9IChudG9obChjdC0+dHVwbGVoYXNoW2Rpcl0udHVwbGUuc3JjLmlwKSA+PiA4KSAmIDB4RkY7Ci0JYXJyYXlbM10gPSBudG9obChjdC0+dHVwbGVoYXNoW2Rpcl0udHVwbGUuc3JjLmlwKSAmIDB4RkY7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzZWFyY2hbZGlyXSk7IGkrKykgewotCQlmb3VuZCA9IGZpbmRfcGF0dGVybihmYl9wdHIsICgqcHNrYiktPmxlbiAtIGRhdGFvZmYsCi0JCQkJICAgICBzZWFyY2hbZGlyXVtpXS5wYXR0ZXJuLAotCQkJCSAgICAgc2VhcmNoW2Rpcl1baV0ucGxlbiwKLQkJCQkgICAgIHNlYXJjaFtkaXJdW2ldLnNraXAsCi0JCQkJICAgICBzZWFyY2hbZGlyXVtpXS50ZXJtLAotCQkJCSAgICAgJm1hdGNob2ZmLCAmbWF0Y2hsZW4sCi0JCQkJICAgICBhcnJheSwKLQkJCQkgICAgIHNlYXJjaFtkaXJdW2ldLmdldG51bSk7Ci0JCWlmIChmb3VuZCkgYnJlYWs7Ci0JfQotCWlmIChmb3VuZCA9PSAtMSkgewotCQkvKiBXZSBkb24ndCB1c3VhbGx5IGRyb3AgcGFja2V0cy4gIEFmdGVyIGFsbCwgdGhpcyBpcwotCQkgICBjb25uZWN0aW9uIHRyYWNraW5nLCBub3QgcGFja2V0IGZpbHRlcmluZy4KLQkJICAgSG93ZXZlciwgaXQgaXMgbmVjZXNzYXJ5IGZvciBhY2N1cmF0ZSB0cmFja2luZyBpbgotCQkgICB0aGlzIGNhc2UuICovCi0JCWlmIChuZXRfcmF0ZWxpbWl0KCkpCi0JCQlwcmludGsoImNvbm50cmFja19mdHA6IHBhcnRpYWwgJXMgJXUrJXVcbiIsCi0JCQkgICAgICAgc2VhcmNoW2Rpcl1baV0ucGF0dGVybiwKLQkJCSAgICAgICBudG9obCh0aC0+c2VxKSwgZGF0YWxlbik7Ci0JCXJldCA9IE5GX0RST1A7Ci0JCWdvdG8gb3V0OwotCX0gZWxzZSBpZiAoZm91bmQgPT0gMCkgeyAvKiBObyBtYXRjaCAqLwotCQlyZXQgPSBORl9BQ0NFUFQ7Ci0JCWdvdG8gb3V0X3VwZGF0ZV9ubDsKLQl9Ci0KLQlERUJVR1AoImNvbm50cmFja19mdHA6IG1hdGNoIGAlcycgKCV1IGJ5dGVzIGF0ICV1KVxuIiwKLQkgICAgICAgZmJfcHRyICsgbWF0Y2hvZmYsIG1hdGNobGVuLCBudG9obCh0aC0+c2VxKSArIG1hdGNob2ZmKTsKLQotCS8qIEFsbG9jYXRlIGV4cGVjdGF0aW9uIHdoaWNoIHdpbGwgYmUgaW5zZXJ0ZWQgKi8KLQlleHAgPSBpcF9jb25udHJhY2tfZXhwZWN0X2FsbG9jKGN0KTsKLQlpZiAoZXhwID09IE5VTEwpIHsKLQkJcmV0ID0gTkZfRFJPUDsKLQkJZ290byBvdXQ7Ci0JfQotCi0JLyogV2UgcmVmZXIgdG8gdGhlIHJldmVyc2UgZGlyZWN0aW9uICgiIWRpciIpIHR1cGxlcyBoZXJlLAotCSAqIGJlY2F1c2Ugd2UncmUgZXhwZWN0aW5nIHNvbWV0aGluZyBpbiB0aGUgb3RoZXIgZGlyZWN0aW9uLgotCSAqIERvZXNuJ3QgbWF0dGVyIHVubGVzcyBOQVQgaXMgaGFwcGVuaW5nLiAgKi8KLQlleHAtPnR1cGxlLmRzdC5pcCA9IGN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuZHN0LmlwOwotCi0JaWYgKGh0b25sKChhcnJheVswXSA8PCAyNCkgfCAoYXJyYXlbMV0gPDwgMTYpIHwgKGFycmF5WzJdIDw8IDgpIHwgYXJyYXlbM10pCi0JICAgICE9IGN0LT50dXBsZWhhc2hbZGlyXS50dXBsZS5zcmMuaXApIHsKLQkJLyogRW5yaWNvIFNjaG9seidzIHBhc3NpdmUgRlRQIHRvIHBhcnRpYWxseSBSTkFUJ2QgZnRwCi0JCSAgIHNlcnZlcjogaXQgcmVhbGx5IHdhbnRzIHVzIHRvIGNvbm5lY3QgdG8gYQotCQkgICBkaWZmZXJlbnQgSVAgYWRkcmVzcy4gIFNpbXBseSBkb24ndCByZWNvcmQgaXQgZm9yCi0JCSAgIE5BVC4gKi8KLQkJREVCVUdQKCJjb25udHJhY2tfZnRwOiBOT1QgUkVDT1JESU5HOiAldSwldSwldSwldSAhPSAldS4ldS4ldS4ldVxuIiwKLQkJICAgICAgIGFycmF5WzBdLCBhcnJheVsxXSwgYXJyYXlbMl0sIGFycmF5WzNdLAotCQkgICAgICAgTklQUVVBRChjdC0+dHVwbGVoYXNoW2Rpcl0udHVwbGUuc3JjLmlwKSk7Ci0KLQkJLyogVGhhbmtzIHRvIENyaXN0aWFubyBMaW5jb2xuIE1hdHRvcwotCQkgICA8bGluY29sbkBjZXNhci5vcmcuYnI+IGZvciByZXBvcnRpbmcgdGhpcyBwb3RlbnRpYWwKLQkJICAgcHJvYmxlbSAoRE1aIG1hY2hpbmVzIG9wZW5pbmcgaG9sZXMgdG8gaW50ZXJuYWwKLQkJICAgbmV0d29ya3MsIG9yIHRoZSBwYWNrZXQgZmlsdGVyIGl0c2VsZikuICovCi0JCWlmICghbG9vc2UpIHsKLQkJCXJldCA9IE5GX0FDQ0VQVDsKLQkJCWdvdG8gb3V0X3B1dF9leHBlY3Q7Ci0JCX0KLQkJZXhwLT50dXBsZS5kc3QuaXAgPSBodG9ubCgoYXJyYXlbMF0gPDwgMjQpIHwgKGFycmF5WzFdIDw8IDE2KQotCQkJCQkgfCAoYXJyYXlbMl0gPDwgOCkgfCBhcnJheVszXSk7Ci0JfQotCi0JZXhwLT50dXBsZS5zcmMuaXAgPSBjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLnNyYy5pcDsKLQlleHAtPnR1cGxlLmRzdC51LnRjcC5wb3J0ID0gaHRvbnMoYXJyYXlbNF0gPDwgOCB8IGFycmF5WzVdKTsKLQlleHAtPnR1cGxlLnNyYy51LnRjcC5wb3J0ID0gMDsgLyogRG9uJ3QgY2FyZS4gKi8KLQlleHAtPnR1cGxlLmRzdC5wcm90b251bSA9IElQUFJPVE9fVENQOwotCWV4cC0+bWFzayA9ICgoc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSkKLQkJeyB7IGh0b25sKDB4RkZGRkZGRkYpLCB7IDAgfSB9LAotCQkgIHsgaHRvbmwoMHhGRkZGRkZGRiksIHsgLnRjcCA9IHsgaHRvbnMoMHhGRkZGKSB9IH0sIDB4RkYgfX0pOwotCi0JZXhwLT5leHBlY3RmbiA9IE5VTEw7Ci0JZXhwLT5mbGFncyA9IDA7Ci0KLQkvKiBOb3csIE5BVCBtaWdodCB3YW50IHRvIG1hbmdsZSB0aGUgcGFja2V0LCBhbmQgcmVnaXN0ZXIgdGhlCi0JICogKHBvc3NpYmx5IGNoYW5nZWQpIGV4cGVjdGF0aW9uIGl0c2VsZi4gKi8KLQlpcF9uYXRfZnRwID0gcmN1X2RlcmVmZXJlbmNlKGlwX25hdF9mdHBfaG9vayk7Ci0JaWYgKGlwX25hdF9mdHApCi0JCXJldCA9IGlwX25hdF9mdHAocHNrYiwgY3RpbmZvLCBzZWFyY2hbZGlyXVtpXS5mdHB0eXBlLAotCQkJCSBtYXRjaG9mZiwgbWF0Y2hsZW4sIGV4cCwgJnNlcSk7Ci0JZWxzZSB7Ci0JCS8qIENhbid0IGV4cGVjdCB0aGlzPyAgQmVzdCB0byBkcm9wIHBhY2tldCBub3cuICovCi0JCWlmIChpcF9jb25udHJhY2tfZXhwZWN0X3JlbGF0ZWQoZXhwKSAhPSAwKQotCQkJcmV0ID0gTkZfRFJPUDsKLQkJZWxzZQotCQkJcmV0ID0gTkZfQUNDRVBUOwotCX0KLQotb3V0X3B1dF9leHBlY3Q6Ci0JaXBfY29ubnRyYWNrX2V4cGVjdF9wdXQoZXhwKTsKLQotb3V0X3VwZGF0ZV9ubDoKLQkvKiBOb3cgaWYgdGhpcyBlbmRzIGluIFxuLCB1cGRhdGUgZnRwIGluZm8uICBTZXEgbWF5IGhhdmUgYmVlbgotCSAqIGFkanVzdGVkIGJ5IE5BVCBjb2RlLiAqLwotCWlmIChlbmRzX2luX25sKQotCQl1cGRhdGVfbmxfc2VxKHNlcSwgY3RfZnRwX2luZm8sZGlyLCAqcHNrYik7Ci0gb3V0OgotCXNwaW5fdW5sb2NrX2JoKCZpcF9mdHBfbG9jayk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHN0cnVjdCBpcF9jb25udHJhY2tfaGVscGVyIGZ0cFtNQVhfUE9SVFNdOwotc3RhdGljIGNoYXIgZnRwX25hbWVzW01BWF9QT1JUU11bc2l6ZW9mKCJmdHAtNjU1MzUiKV07Ci0KLS8qIE5vdCBfX2V4aXQ6IGNhbGxlZCBmcm9tIGluaXQoKSAqLwotc3RhdGljIHZvaWQgaXBfY29ubnRyYWNrX2Z0cF9maW5pKHZvaWQpCi17Ci0JaW50IGk7Ci0JZm9yIChpID0gMDsgaSA8IHBvcnRzX2M7IGkrKykgewotCQlERUJVR1AoImlwX2N0X2Z0cDogdW5yZWdpc3RlcmluZyBoZWxwZXIgZm9yIHBvcnQgJWRcbiIsCi0JCQkJcG9ydHNbaV0pOwotCQlpcF9jb25udHJhY2tfaGVscGVyX3VucmVnaXN0ZXIoJmZ0cFtpXSk7Ci0JfQotCi0Ja2ZyZWUoZnRwX2J1ZmZlcik7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IGlwX2Nvbm50cmFja19mdHBfaW5pdCh2b2lkKQotewotCWludCBpLCByZXQ7Ci0JY2hhciAqdG1wbmFtZTsKLQotCWZ0cF9idWZmZXIgPSBrbWFsbG9jKDY1NTM2LCBHRlBfS0VSTkVMKTsKLQlpZiAoIWZ0cF9idWZmZXIpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JaWYgKHBvcnRzX2MgPT0gMCkKLQkJcG9ydHNbcG9ydHNfYysrXSA9IEZUUF9QT1JUOwotCi0JZm9yIChpID0gMDsgaSA8IHBvcnRzX2M7IGkrKykgewotCQlmdHBbaV0udHVwbGUuc3JjLnUudGNwLnBvcnQgPSBodG9ucyhwb3J0c1tpXSk7Ci0JCWZ0cFtpXS50dXBsZS5kc3QucHJvdG9udW0gPSBJUFBST1RPX1RDUDsKLQkJZnRwW2ldLm1hc2suc3JjLnUudGNwLnBvcnQgPSBodG9ucygweEZGRkYpOwotCQlmdHBbaV0ubWFzay5kc3QucHJvdG9udW0gPSAweEZGOwotCQlmdHBbaV0ubWF4X2V4cGVjdGVkID0gMTsKLQkJZnRwW2ldLnRpbWVvdXQgPSA1ICogNjA7IC8qIDUgbWludXRlcyAqLwotCQlmdHBbaV0ubWUgPSBUSElTX01PRFVMRTsKLQkJZnRwW2ldLmhlbHAgPSBoZWxwOwotCi0JCXRtcG5hbWUgPSAmZnRwX25hbWVzW2ldWzBdOwotCQlpZiAocG9ydHNbaV0gPT0gRlRQX1BPUlQpCi0JCQlzcHJpbnRmKHRtcG5hbWUsICJmdHAiKTsKLQkJZWxzZQotCQkJc3ByaW50Zih0bXBuYW1lLCAiZnRwLSVkIiwgcG9ydHNbaV0pOwotCQlmdHBbaV0ubmFtZSA9IHRtcG5hbWU7Ci0KLQkJREVCVUdQKCJpcF9jdF9mdHA6IHJlZ2lzdGVyaW5nIGhlbHBlciBmb3IgcG9ydCAlZFxuIiwKLQkJCQlwb3J0c1tpXSk7Ci0JCXJldCA9IGlwX2Nvbm50cmFja19oZWxwZXJfcmVnaXN0ZXIoJmZ0cFtpXSk7Ci0KLQkJaWYgKHJldCkgewotCQkJaXBfY29ubnRyYWNrX2Z0cF9maW5pKCk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JfQotCXJldHVybiAwOwotfQotCi1tb2R1bGVfaW5pdChpcF9jb25udHJhY2tfZnRwX2luaXQpOwotbW9kdWxlX2V4aXQoaXBfY29ubnRyYWNrX2Z0cF9maW5pKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfaGVscGVyX2gzMjMuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfaGVscGVyX2gzMjMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNlYjM2NS4uMDAwMDAwMAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX2hlbHBlcl9oMzIzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxODQxICswLDAgQEAKLS8qCi0gKiBILjMyMyBjb25uZWN0aW9uIHRyYWNraW5nIGhlbHBlcgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNiBKaW5nIE1pbiBaaGFvIDx6aGFvamluZ21pbkB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+Ci0gKgotICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4KLSAqCi0gKiBCYXNlZCBvbiB0aGUgJ2JydXRlIGZvcmNlJyBILjMyMyBjb25uZWN0aW9uIHRyYWNraW5nIG1vZHVsZSBieQotICogSm96c2VmIEthZGxlY3NpayA8a2FkbGVjQGJsYWNraG9sZS5rZmtpLmh1PgotICoKLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBwbGVhc2Ugc2VlIGh0dHA6Ly9uYXRoMzIzLnNvdXJjZWZvcmdlLm5ldC8KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvaXAuaD4KLSNpbmNsdWRlIDxuZXQvdGNwLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2NvcmUuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfaGVscGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX3R1cGxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2gzMjMuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgotI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5ldC5oPgotCi0jaWYgMAotI2RlZmluZSBERUJVR1AgcHJpbnRrCi0jZWxzZQotI2RlZmluZSBERUJVR1AoZm9ybWF0LCBhcmdzLi4uKQotI2VuZGlmCi0KLS8qIFBhcmFtZXRlcnMgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgZGVmYXVsdF9ycnFfdHRsID0gMzAwOwotbW9kdWxlX3BhcmFtKGRlZmF1bHRfcnJxX3R0bCwgdWludCwgMDYwMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGRlZmF1bHRfcnJxX3R0bCwgInVzZSB0aGlzIFRUTCBpZiBpdCdzIG1pc3NpbmcgaW4gUlJRIik7Ci0KLXN0YXRpYyBpbnQgZ2tyb3V0ZWRfb25seSA9IDE7Ci1tb2R1bGVfcGFyYW0oZ2tyb3V0ZWRfb25seSwgaW50LCAwNjAwKTsKLU1PRFVMRV9QQVJNX0RFU0MoZ2tyb3V0ZWRfb25seSwgIm9ubHkgYWNjZXB0IGNhbGxzIGZyb20gZ2F0ZWtlZXBlciIpOwotCi1zdGF0aWMgaW50IGNhbGxmb3J3YXJkX2ZpbHRlciA9IDE7Ci1tb2R1bGVfcGFyYW0oY2FsbGZvcndhcmRfZmlsdGVyLCBib29sLCAwNjAwKTsKLU1PRFVMRV9QQVJNX0RFU0MoY2FsbGZvcndhcmRfZmlsdGVyLCAib25seSBjcmVhdGUgY2FsbCBmb3J3YXJkaW5nIGV4cGVjdGF0aW9ucyAiCi0JCQkJICAgICAiaWYgYm90aCBlbmRwb2ludHMgYXJlIG9uIGRpZmZlcmVudCBzaWRlcyAiCi0JCQkJICAgICAiKGRldGVybWluZWQgYnkgcm91dGluZyBpbmZvcm1hdGlvbikiKTsKLQotLyogSG9va3MgZm9yIE5BVCAqLwotaW50ICgqc2V0X2gyNDVfYWRkcl9ob29rKSAoc3RydWN0IHNrX2J1ZmYgKiogcHNrYiwKLQkJCSAgIHVuc2lnbmVkIGNoYXIgKipkYXRhLCBpbnQgZGF0YW9mZiwKLQkJCSAgIEgyNDVfVHJhbnNwb3J0QWRkcmVzcyAqIGFkZHIsCi0JCQkgICBfX2JlMzIgaXAsIHVfaW50MTZfdCBwb3J0KTsKLWludCAoKnNldF9oMjI1X2FkZHJfaG9vaykgKHN0cnVjdCBza19idWZmICoqIHBza2IsCi0JCQkgICB1bnNpZ25lZCBjaGFyICoqZGF0YSwgaW50IGRhdGFvZmYsCi0JCQkgICBUcmFuc3BvcnRBZGRyZXNzICogYWRkciwKLQkJCSAgIF9fYmUzMiBpcCwgdV9pbnQxNl90IHBvcnQpOwotaW50ICgqc2V0X3NpZ19hZGRyX2hvb2spIChzdHJ1Y3Qgc2tfYnVmZiAqKiBwc2tiLAotCQkJICBzdHJ1Y3QgaXBfY29ubnRyYWNrICogY3QsCi0JCQkgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAotCQkJICB1bnNpZ25lZCBjaGFyICoqZGF0YSwKLQkJCSAgVHJhbnNwb3J0QWRkcmVzcyAqIGFkZHIsIGludCBjb3VudCk7Ci1pbnQgKCpzZXRfcmFzX2FkZHJfaG9vaykgKHN0cnVjdCBza19idWZmICoqIHBza2IsCi0JCQkgIHN0cnVjdCBpcF9jb25udHJhY2sgKiBjdCwKLQkJCSAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCi0JCQkgIHVuc2lnbmVkIGNoYXIgKipkYXRhLAotCQkJICBUcmFuc3BvcnRBZGRyZXNzICogYWRkciwgaW50IGNvdW50KTsKLWludCAoKm5hdF9ydHBfcnRjcF9ob29rKSAoc3RydWN0IHNrX2J1ZmYgKiogcHNrYiwKLQkJCSAgc3RydWN0IGlwX2Nvbm50cmFjayAqIGN0LAotCQkJICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKLQkJCSAgdW5zaWduZWQgY2hhciAqKmRhdGEsIGludCBkYXRhb2ZmLAotCQkJICBIMjQ1X1RyYW5zcG9ydEFkZHJlc3MgKiBhZGRyLAotCQkJICB1X2ludDE2X3QgcG9ydCwgdV9pbnQxNl90IHJ0cF9wb3J0LAotCQkJICBzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqIHJ0cF9leHAsCi0JCQkgIHN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICogcnRjcF9leHApOwotaW50ICgqbmF0X3QxMjBfaG9vaykgKHN0cnVjdCBza19idWZmICoqIHBza2IsCi0JCSAgICAgIHN0cnVjdCBpcF9jb25udHJhY2sgKiBjdCwKLQkJICAgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCi0JCSAgICAgIHVuc2lnbmVkIGNoYXIgKipkYXRhLCBpbnQgZGF0YW9mZiwKLQkJICAgICAgSDI0NV9UcmFuc3BvcnRBZGRyZXNzICogYWRkciwgdV9pbnQxNl90IHBvcnQsCi0JCSAgICAgIHN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICogZXhwKTsKLWludCAoKm5hdF9oMjQ1X2hvb2spIChzdHJ1Y3Qgc2tfYnVmZiAqKiBwc2tiLAotCQkgICAgICBzdHJ1Y3QgaXBfY29ubnRyYWNrICogY3QsCi0JCSAgICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAotCQkgICAgICB1bnNpZ25lZCBjaGFyICoqZGF0YSwgaW50IGRhdGFvZmYsCi0JCSAgICAgIFRyYW5zcG9ydEFkZHJlc3MgKiBhZGRyLCB1X2ludDE2X3QgcG9ydCwKLQkJICAgICAgc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKiBleHApOwotaW50ICgqbmF0X2NhbGxmb3J3YXJkaW5nX2hvb2spIChzdHJ1Y3Qgc2tfYnVmZiAqKiBwc2tiLAotCQkJCXN0cnVjdCBpcF9jb25udHJhY2sgKiBjdCwKLQkJCQllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKLQkJCQl1bnNpZ25lZCBjaGFyICoqZGF0YSwgaW50IGRhdGFvZmYsCi0JCQkJVHJhbnNwb3J0QWRkcmVzcyAqIGFkZHIsIHVfaW50MTZfdCBwb3J0LAotCQkJCXN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICogZXhwKTsKLWludCAoKm5hdF9xOTMxX2hvb2spIChzdHJ1Y3Qgc2tfYnVmZiAqKiBwc2tiLAotCQkgICAgICBzdHJ1Y3QgaXBfY29ubnRyYWNrICogY3QsCi0JCSAgICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAotCQkgICAgICB1bnNpZ25lZCBjaGFyICoqZGF0YSwgVHJhbnNwb3J0QWRkcmVzcyAqIGFkZHIsIGludCBpZHgsCi0JCSAgICAgIHVfaW50MTZfdCBwb3J0LCBzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqIGV4cCk7Ci0KLQotc3RhdGljIERFRklORV9TUElOTE9DSyhpcF9oMzIzX2xvY2spOwotc3RhdGljIGNoYXIgKmgzMjNfYnVmZmVyOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgZ2V0X3Rwa3RfZGF0YShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIHN0cnVjdCBpcF9jb25udHJhY2sgKmN0LAotCQkJIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAotCQkJIHVuc2lnbmVkIGNoYXIgKipkYXRhLCBpbnQgKmRhdGFsZW4sIGludCAqZGF0YW9mZikKLXsKLQlzdHJ1Y3QgaXBfY3RfaDMyM19tYXN0ZXIgKmluZm8gPSAmY3QtPmhlbHAuY3RfaDMyM19pbmZvOwotCWludCBkaXIgPSBDVElORk8yRElSKGN0aW5mbyk7Ci0Jc3RydWN0IHRjcGhkciBfdGNwaCwgKnRoOwotCWludCB0Y3BkYXRhbGVuOwotCWludCB0Y3BkYXRhb2ZmOwotCXVuc2lnbmVkIGNoYXIgKnRwa3Q7Ci0JaW50IHRwa3RsZW47Ci0JaW50IHRwa3RvZmY7Ci0KLQkvKiBHZXQgVENQIGhlYWRlciAqLwotCXRoID0gc2tiX2hlYWRlcl9wb2ludGVyKCpwc2tiLCAoKnBza2IpLT5uaC5pcGgtPmlobCAqIDQsCi0JCQkJc2l6ZW9mKF90Y3BoKSwgJl90Y3BoKTsKLQlpZiAodGggPT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0KLQkvKiBHZXQgVENQIGRhdGEgb2Zmc2V0ICovCi0JdGNwZGF0YW9mZiA9ICgqcHNrYiktPm5oLmlwaC0+aWhsICogNCArIHRoLT5kb2ZmICogNDsKLQotCS8qIEdldCBUQ1AgZGF0YSBsZW5ndGggKi8KLQl0Y3BkYXRhbGVuID0gKCpwc2tiKS0+bGVuIC0gdGNwZGF0YW9mZjsKLQlpZiAodGNwZGF0YWxlbiA8PSAwKQkvKiBObyBUQ1AgZGF0YSAqLwotCQlnb3RvIGNsZWFyX291dDsKLQotCWlmICgqZGF0YSA9PSBOVUxMKSB7CS8qIGZpcnN0IFRQS1QgKi8KLQkJLyogR2V0IGZpcnN0IFRQS1QgcG9pbnRlciAqLwotCQl0cGt0ID0gc2tiX2hlYWRlcl9wb2ludGVyKCpwc2tiLCB0Y3BkYXRhb2ZmLCB0Y3BkYXRhbGVuLAotCQkJCQkgIGgzMjNfYnVmZmVyKTsKLQkJQlVHX09OKHRwa3QgPT0gTlVMTCk7Ci0KLQkJLyogVmFsaWRhdGUgVFBLVCBpZGVudGlmaWVyICovCi0JCWlmICh0Y3BkYXRhbGVuIDwgNCB8fCB0cGt0WzBdICE9IDB4MDMgfHwgdHBrdFsxXSAhPSAwKSB7Ci0JCQkvKiBOZXRtZWV0aW5nIHNlbmRzIFRQS1QgaGVhZGVyIGFuZCBkYXRhIHNlcGFyYXRlbHkgKi8KLQkJCWlmIChpbmZvLT50cGt0X2xlbltkaXJdID4gMCkgewotCQkJCURFQlVHUCgiaXBfY3RfaDMyMzogcHJldmlvdXMgcGFja2V0ICIKLQkJCQkgICAgICAgImluZGljYXRlZCBzZXBhcmF0ZSBUUEtUIGRhdGEgb2YgJWh1ICIKLQkJCQkgICAgICAgImJ5dGVzXG4iLCBpbmZvLT50cGt0X2xlbltkaXJdKTsKLQkJCQlpZiAoaW5mby0+dHBrdF9sZW5bZGlyXSA8PSB0Y3BkYXRhbGVuKSB7Ci0JCQkJCS8qIFllcywgdGhlcmUgd2FzIGEgVFBLVCBoZWFkZXIKLQkJCQkJICogcmVjZWl2ZWQgKi8KLQkJCQkJKmRhdGEgPSB0cGt0OwotCQkJCQkqZGF0YWxlbiA9IGluZm8tPnRwa3RfbGVuW2Rpcl07Ci0JCQkJCSpkYXRhb2ZmID0gMDsKLQkJCQkJZ290byBvdXQ7Ci0JCQkJfQotCi0JCQkJLyogRnJhZ21lbnRlZCBUUEtUICovCi0JCQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKLQkJCQkJcHJpbnRrKCJpcF9jdF9oMzIzOiAiCi0JCQkJCSAgICAgICAiZnJhZ21lbnRlZCBUUEtUXG4iKTsKLQkJCQlnb3RvIGNsZWFyX291dDsKLQkJCX0KLQotCQkJLyogSXQgaXMgbm90IGV2ZW4gYSBUUEtUICovCi0JCQlyZXR1cm4gMDsKLQkJfQotCQl0cGt0b2ZmID0gMDsKLQl9IGVsc2UgewkJLyogTmV4dCBUUEtUICovCi0JCXRwa3RvZmYgPSAqZGF0YW9mZiArICpkYXRhbGVuOwotCQl0Y3BkYXRhbGVuIC09IHRwa3RvZmY7Ci0JCWlmICh0Y3BkYXRhbGVuIDw9IDQpCS8qIE5vIG1vcmUgVFBLVCAqLwotCQkJZ290byBjbGVhcl9vdXQ7Ci0JCXRwa3QgPSAqZGF0YSArICpkYXRhbGVuOwotCi0JCS8qIFZhbGlkYXRlIFRQS1QgaWRlbnRpZmllciAqLwotCQlpZiAodHBrdFswXSAhPSAweDAzIHx8IHRwa3RbMV0gIT0gMCkKLQkJCWdvdG8gY2xlYXJfb3V0OwotCX0KLQotCS8qIFZhbGlkYXRlIFRQS1QgbGVuZ3RoICovCi0JdHBrdGxlbiA9IHRwa3RbMl0gKiAyNTYgKyB0cGt0WzNdOwotCWlmICh0cGt0bGVuIDwgNCkKLQkJZ290byBjbGVhcl9vdXQ7Ci0JaWYgKHRwa3RsZW4gPiB0Y3BkYXRhbGVuKSB7Ci0JCWlmICh0Y3BkYXRhbGVuID09IDQpIHsJLyogU2VwYXJhdGUgVFBLVCBoZWFkZXIgKi8KLQkJCS8qIE5ldG1lZXRpbmcgc2VuZHMgVFBLVCBoZWFkZXIgYW5kIGRhdGEgc2VwYXJhdGVseSAqLwotCQkJREVCVUdQKCJpcF9jdF9oMzIzOiBzZXBhcmF0ZSBUUEtUIGhlYWRlciBpbmRpY2F0ZXMgIgotCQkJICAgICAgICJ0aGVyZSB3aWxsIGJlIFRQS1QgZGF0YSBvZiAlaHUgYnl0ZXNcbiIsCi0JCQkgICAgICAgdHBrdGxlbiAtIDQpOwotCQkJaW5mby0+dHBrdF9sZW5bZGlyXSA9IHRwa3RsZW4gLSA0OwotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQlpZiAobmV0X3JhdGVsaW1pdCgpKQotCQkJcHJpbnRrKCJpcF9jdF9oMzIzOiBpbmNvbXBsZXRlIFRQS1QgKGZyYWdtZW50ZWQ/KVxuIik7Ci0JCWdvdG8gY2xlYXJfb3V0OwotCX0KLQotCS8qIFRoaXMgaXMgdGhlIGVuY2Fwc3VsYXRlZCBkYXRhICovCi0JKmRhdGEgPSB0cGt0ICsgNDsKLQkqZGF0YWxlbiA9IHRwa3RsZW4gLSA0OwotCSpkYXRhb2ZmID0gdHBrdG9mZiArIDQ7Ci0KLSAgICAgIG91dDoKLQkvKiBDbGVhciBUUEtUIGxlbmd0aCAqLwotCWluZm8tPnRwa3RfbGVuW2Rpcl0gPSAwOwotCXJldHVybiAxOwotCi0gICAgICBjbGVhcl9vdXQ6Ci0JaW5mby0+dHBrdF9sZW5bZGlyXSA9IDA7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBnZXRfaDI0NV9hZGRyKHVuc2lnbmVkIGNoYXIgKmRhdGEsIEgyNDVfVHJhbnNwb3J0QWRkcmVzcyAqIGFkZHIsCi0JCQkgX19iZTMyICogaXAsIHVfaW50MTZfdCAqIHBvcnQpCi17Ci0JdW5zaWduZWQgY2hhciAqcDsKLQotCWlmIChhZGRyLT5jaG9pY2UgIT0gZUgyNDVfVHJhbnNwb3J0QWRkcmVzc191bmljYXN0QWRkcmVzcyB8fAotCSAgICBhZGRyLT51bmljYXN0QWRkcmVzcy5jaG9pY2UgIT0gZVVuaWNhc3RBZGRyZXNzX2lQQWRkcmVzcykKLQkJcmV0dXJuIDA7Ci0KLQlwID0gZGF0YSArIGFkZHItPnVuaWNhc3RBZGRyZXNzLmlQQWRkcmVzcy5uZXR3b3JrOwotCSppcCA9IGh0b25sKChwWzBdIDw8IDI0KSB8IChwWzFdIDw8IDE2KSB8IChwWzJdIDw8IDgpIHwgKHBbM10pKTsKLQkqcG9ydCA9IChwWzRdIDw8IDgpIHwgKHBbNV0pOwotCi0JcmV0dXJuIDE7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBleHBlY3RfcnRwX3J0Y3Aoc3RydWN0IHNrX2J1ZmYgKipwc2tiLCBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKLQkJCSAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAotCQkJICAgdW5zaWduZWQgY2hhciAqKmRhdGEsIGludCBkYXRhb2ZmLAotCQkJICAgSDI0NV9UcmFuc3BvcnRBZGRyZXNzICogYWRkcikKLXsKLQlpbnQgZGlyID0gQ1RJTkZPMkRJUihjdGluZm8pOwotCWludCByZXQgPSAwOwotCV9fYmUzMiBpcDsKLQl1X2ludDE2X3QgcG9ydDsKLQl1X2ludDE2X3QgcnRwX3BvcnQ7Ci0Jc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKnJ0cF9leHA7Ci0Jc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKnJ0Y3BfZXhwOwotCXR5cGVvZihuYXRfcnRwX3J0Y3BfaG9vaykgbmF0X3J0cF9ydGNwOwotCi0JLyogUmVhZCBSVFAgb3IgUlRDUCBhZGRyZXNzICovCi0JaWYgKCFnZXRfaDI0NV9hZGRyKCpkYXRhLCBhZGRyLCAmaXAsICZwb3J0KSB8fAotCSAgICBpcCAhPSBjdC0+dHVwbGVoYXNoW2Rpcl0udHVwbGUuc3JjLmlwIHx8IHBvcnQgPT0gMCkKLQkJcmV0dXJuIDA7Ci0KLQkvKiBSVFAgcG9ydCBpcyBldmVuICovCi0JcnRwX3BvcnQgPSBwb3J0ICYgKH4xKTsKLQotCS8qIENyZWF0ZSBleHBlY3QgZm9yIFJUUCAqLwotCWlmICgocnRwX2V4cCA9IGlwX2Nvbm50cmFja19leHBlY3RfYWxsb2MoY3QpKSA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JcnRwX2V4cC0+dHVwbGUuc3JjLmlwID0gY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5zcmMuaXA7Ci0JcnRwX2V4cC0+dHVwbGUuc3JjLnUudWRwLnBvcnQgPSAwOwotCXJ0cF9leHAtPnR1cGxlLmRzdC5pcCA9IGN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuZHN0LmlwOwotCXJ0cF9leHAtPnR1cGxlLmRzdC51LnVkcC5wb3J0ID0gaHRvbnMocnRwX3BvcnQpOwotCXJ0cF9leHAtPnR1cGxlLmRzdC5wcm90b251bSA9IElQUFJPVE9fVURQOwotCXJ0cF9leHAtPm1hc2suc3JjLmlwID0gaHRvbmwoMHhGRkZGRkZGRik7Ci0JcnRwX2V4cC0+bWFzay5zcmMudS51ZHAucG9ydCA9IDA7Ci0JcnRwX2V4cC0+bWFzay5kc3QuaXAgPSBodG9ubCgweEZGRkZGRkZGKTsKLQlydHBfZXhwLT5tYXNrLmRzdC51LnVkcC5wb3J0ID0gaHRvbnMoMHhGRkZGKTsKLQlydHBfZXhwLT5tYXNrLmRzdC5wcm90b251bSA9IDB4RkY7Ci0JcnRwX2V4cC0+ZmxhZ3MgPSAwOwotCi0JLyogQ3JlYXRlIGV4cGVjdCBmb3IgUlRDUCAqLwotCWlmICgocnRjcF9leHAgPSBpcF9jb25udHJhY2tfZXhwZWN0X2FsbG9jKGN0KSkgPT0gTlVMTCkgewotCQlpcF9jb25udHJhY2tfZXhwZWN0X3B1dChydHBfZXhwKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlydGNwX2V4cC0+dHVwbGUuc3JjLmlwID0gY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5zcmMuaXA7Ci0JcnRjcF9leHAtPnR1cGxlLnNyYy51LnVkcC5wb3J0ID0gMDsKLQlydGNwX2V4cC0+dHVwbGUuZHN0LmlwID0gY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5kc3QuaXA7Ci0JcnRjcF9leHAtPnR1cGxlLmRzdC51LnVkcC5wb3J0ID0gaHRvbnMocnRwX3BvcnQgKyAxKTsKLQlydGNwX2V4cC0+dHVwbGUuZHN0LnByb3RvbnVtID0gSVBQUk9UT19VRFA7Ci0JcnRjcF9leHAtPm1hc2suc3JjLmlwID0gaHRvbmwoMHhGRkZGRkZGRik7Ci0JcnRjcF9leHAtPm1hc2suc3JjLnUudWRwLnBvcnQgPSAwOwotCXJ0Y3BfZXhwLT5tYXNrLmRzdC5pcCA9IGh0b25sKDB4RkZGRkZGRkYpOwotCXJ0Y3BfZXhwLT5tYXNrLmRzdC51LnVkcC5wb3J0ID0gaHRvbnMoMHhGRkZGKTsKLQlydGNwX2V4cC0+bWFzay5kc3QucHJvdG9udW0gPSAweEZGOwotCXJ0Y3BfZXhwLT5mbGFncyA9IDA7Ci0KLQlpZiAoY3QtPnR1cGxlaGFzaFtkaXJdLnR1cGxlLnNyYy5pcCAhPQotCSAgICBjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLmRzdC5pcCAmJgotCSAgICAobmF0X3J0cF9ydGNwID0gcmN1X2RlcmVmZXJlbmNlKG5hdF9ydHBfcnRjcF9ob29rKSkpIHsKLQkJLyogTkFUIG5lZWRlZCAqLwotCQlyZXQgPSBuYXRfcnRwX3J0Y3AocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwgZGF0YW9mZiwKLQkJCQkgICBhZGRyLCBwb3J0LCBydHBfcG9ydCwgcnRwX2V4cCwgcnRjcF9leHApOwotCX0gZWxzZSB7CQkvKiBDb25udHJhY2sgb25seSAqLwotCQlydHBfZXhwLT5leHBlY3RmbiA9IE5VTEw7Ci0JCXJ0Y3BfZXhwLT5leHBlY3RmbiA9IE5VTEw7Ci0KLQkJaWYgKGlwX2Nvbm50cmFja19leHBlY3RfcmVsYXRlZChydHBfZXhwKSA9PSAwKSB7Ci0JCQlpZiAoaXBfY29ubnRyYWNrX2V4cGVjdF9yZWxhdGVkKHJ0Y3BfZXhwKSA9PSAwKSB7Ci0JCQkJREVCVUdQKCJpcF9jdF9oMzIzOiBleHBlY3QgUlRQICIKLQkJCQkgICAgICAgIiV1LiV1LiV1LiV1OiVodS0+JXUuJXUuJXUuJXU6JWh1XG4iLAotCQkJCSAgICAgICBOSVBRVUFEKHJ0cF9leHAtPnR1cGxlLnNyYy5pcCksCi0JCQkJICAgICAgIG50b2hzKHJ0cF9leHAtPnR1cGxlLnNyYy51LnVkcC5wb3J0KSwKLQkJCQkgICAgICAgTklQUVVBRChydHBfZXhwLT50dXBsZS5kc3QuaXApLAotCQkJCSAgICAgICBudG9ocyhydHBfZXhwLT50dXBsZS5kc3QudS51ZHAucG9ydCkpOwotCQkJCURFQlVHUCgiaXBfY3RfaDMyMzogZXhwZWN0IFJUQ1AgIgotCQkJCSAgICAgICAiJXUuJXUuJXUuJXU6JWh1LT4ldS4ldS4ldS4ldTolaHVcbiIsCi0JCQkJICAgICAgIE5JUFFVQUQocnRjcF9leHAtPnR1cGxlLnNyYy5pcCksCi0JCQkJICAgICAgIG50b2hzKHJ0Y3BfZXhwLT50dXBsZS5zcmMudS51ZHAucG9ydCksCi0JCQkJICAgICAgIE5JUFFVQUQocnRjcF9leHAtPnR1cGxlLmRzdC5pcCksCi0JCQkJICAgICAgIG50b2hzKHJ0Y3BfZXhwLT50dXBsZS5kc3QudS51ZHAucG9ydCkpOwotCQkJfSBlbHNlIHsKLQkJCQlpcF9jb25udHJhY2tfdW5leHBlY3RfcmVsYXRlZChydHBfZXhwKTsKLQkJCQlyZXQgPSAtMTsKLQkJCX0KLQkJfSBlbHNlCi0JCQlyZXQgPSAtMTsKLQl9Ci0KLQlpcF9jb25udHJhY2tfZXhwZWN0X3B1dChydHBfZXhwKTsKLQlpcF9jb25udHJhY2tfZXhwZWN0X3B1dChydGNwX2V4cCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgZXhwZWN0X3QxMjAoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAotCQkgICAgICAgc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsCi0JCSAgICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKLQkJICAgICAgIHVuc2lnbmVkIGNoYXIgKipkYXRhLCBpbnQgZGF0YW9mZiwKLQkJICAgICAgIEgyNDVfVHJhbnNwb3J0QWRkcmVzcyAqIGFkZHIpCi17Ci0JaW50IGRpciA9IENUSU5GTzJESVIoY3RpbmZvKTsKLQlpbnQgcmV0ID0gMDsKLQlfX2JlMzIgaXA7Ci0JdV9pbnQxNl90IHBvcnQ7Ci0Jc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmV4cCA9IE5VTEw7Ci0JdHlwZW9mKG5hdF90MTIwX2hvb2spIG5hdF90MTIwOwotCi0JLyogUmVhZCBULjEyMCBhZGRyZXNzICovCi0JaWYgKCFnZXRfaDI0NV9hZGRyKCpkYXRhLCBhZGRyLCAmaXAsICZwb3J0KSB8fAotCSAgICBpcCAhPSBjdC0+dHVwbGVoYXNoW2Rpcl0udHVwbGUuc3JjLmlwIHx8IHBvcnQgPT0gMCkKLQkJcmV0dXJuIDA7Ci0KLQkvKiBDcmVhdGUgZXhwZWN0IGZvciBULjEyMCBjb25uZWN0aW9ucyAqLwotCWlmICgoZXhwID0gaXBfY29ubnRyYWNrX2V4cGVjdF9hbGxvYyhjdCkpID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlleHAtPnR1cGxlLnNyYy5pcCA9IGN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuc3JjLmlwOwotCWV4cC0+dHVwbGUuc3JjLnUudGNwLnBvcnQgPSAwOwotCWV4cC0+dHVwbGUuZHN0LmlwID0gY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5kc3QuaXA7Ci0JZXhwLT50dXBsZS5kc3QudS50Y3AucG9ydCA9IGh0b25zKHBvcnQpOwotCWV4cC0+dHVwbGUuZHN0LnByb3RvbnVtID0gSVBQUk9UT19UQ1A7Ci0JZXhwLT5tYXNrLnNyYy5pcCA9IGh0b25sKDB4RkZGRkZGRkYpOwotCWV4cC0+bWFzay5zcmMudS50Y3AucG9ydCA9IDA7Ci0JZXhwLT5tYXNrLmRzdC5pcCA9IGh0b25sKDB4RkZGRkZGRkYpOwotCWV4cC0+bWFzay5kc3QudS50Y3AucG9ydCA9IGh0b25zKDB4RkZGRik7Ci0JZXhwLT5tYXNrLmRzdC5wcm90b251bSA9IDB4RkY7Ci0JZXhwLT5mbGFncyA9IElQX0NUX0VYUEVDVF9QRVJNQU5FTlQ7CS8qIEFjY2VwdCBtdWx0aXBsZSBjaGFubmVscyAqLwotCi0JaWYgKGN0LT50dXBsZWhhc2hbZGlyXS50dXBsZS5zcmMuaXAgIT0KLQkgICAgY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5kc3QuaXAgJiYKLQkgICAgKG5hdF90MTIwID0gcmN1X2RlcmVmZXJlbmNlKG5hdF90MTIwX2hvb2spKSkgewotCQkvKiBOQVQgbmVlZGVkICovCi0JCXJldCA9IG5hdF90MTIwKHBza2IsIGN0LCBjdGluZm8sIGRhdGEsIGRhdGFvZmYsIGFkZHIsCi0JCQkgICAgICAgcG9ydCwgZXhwKTsKLQl9IGVsc2UgewkJLyogQ29ubnRyYWNrIG9ubHkgKi8KLQkJZXhwLT5leHBlY3RmbiA9IE5VTEw7Ci0JCWlmIChpcF9jb25udHJhY2tfZXhwZWN0X3JlbGF0ZWQoZXhwKSA9PSAwKSB7Ci0JCQlERUJVR1AoImlwX2N0X2gzMjM6IGV4cGVjdCBULjEyMCAiCi0JCQkgICAgICAgIiV1LiV1LiV1LiV1OiVodS0+JXUuJXUuJXUuJXU6JWh1XG4iLAotCQkJICAgICAgIE5JUFFVQUQoZXhwLT50dXBsZS5zcmMuaXApLAotCQkJICAgICAgIG50b2hzKGV4cC0+dHVwbGUuc3JjLnUudGNwLnBvcnQpLAotCQkJICAgICAgIE5JUFFVQUQoZXhwLT50dXBsZS5kc3QuaXApLAotCQkJICAgICAgIG50b2hzKGV4cC0+dHVwbGUuZHN0LnUudGNwLnBvcnQpKTsKLQkJfSBlbHNlCi0JCQlyZXQgPSAtMTsKLQl9Ci0KLQlpcF9jb25udHJhY2tfZXhwZWN0X3B1dChleHApOwotCi0JcmV0dXJuIHJldDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IHByb2Nlc3NfaDI0NV9jaGFubmVsKHN0cnVjdCBza19idWZmICoqcHNrYiwKLQkJCQlzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKLQkJCQllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKLQkJCQl1bnNpZ25lZCBjaGFyICoqZGF0YSwgaW50IGRhdGFvZmYsCi0JCQkJSDIyNTBMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnMgKiBjaGFubmVsKQotewotCWludCByZXQ7Ci0KLQlpZiAoY2hhbm5lbC0+b3B0aW9ucyAmIGVIMjI1MExvZ2ljYWxDaGFubmVsUGFyYW1ldGVyc19tZWRpYUNoYW5uZWwpIHsKLQkJLyogUlRQICovCi0JCXJldCA9IGV4cGVjdF9ydHBfcnRjcChwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLCBkYXRhb2ZmLAotCQkJCSAgICAgICZjaGFubmVsLT5tZWRpYUNoYW5uZWwpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiAtMTsKLQl9Ci0KLQlpZiAoY2hhbm5lbC0+Ci0JICAgIG9wdGlvbnMgJiBlSDIyNTBMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnNfbWVkaWFDb250cm9sQ2hhbm5lbCkgewotCQkvKiBSVENQICovCi0JCXJldCA9IGV4cGVjdF9ydHBfcnRjcChwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLCBkYXRhb2ZmLAotCQkJCSAgICAgICZjaGFubmVsLT5tZWRpYUNvbnRyb2xDaGFubmVsKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gLTE7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBwcm9jZXNzX29sYyhzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIHN0cnVjdCBpcF9jb25udHJhY2sgKmN0LAotCQkgICAgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCi0JCSAgICAgICB1bnNpZ25lZCBjaGFyICoqZGF0YSwgaW50IGRhdGFvZmYsCi0JCSAgICAgICBPcGVuTG9naWNhbENoYW5uZWwgKiBvbGMpCi17Ci0JaW50IHJldDsKLQotCURFQlVHUCgiaXBfY3RfaDMyMzogT3BlbkxvZ2ljYWxDaGFubmVsXG4iKTsKLQotCWlmIChvbGMtPmZvcndhcmRMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnMubXVsdGlwbGV4UGFyYW1ldGVycy5jaG9pY2UgPT0KLQkgICAgZU9wZW5Mb2dpY2FsQ2hhbm5lbF9mb3J3YXJkTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzX211bHRpcGxleFBhcmFtZXRlcnNfaDIyNTBMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnMpCi0JewotCQlyZXQgPSBwcm9jZXNzX2gyNDVfY2hhbm5lbChwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLCBkYXRhb2ZmLAotCQkJCQkgICAmb2xjLT4KLQkJCQkJICAgZm9yd2FyZExvZ2ljYWxDaGFubmVsUGFyYW1ldGVycy4KLQkJCQkJICAgbXVsdGlwbGV4UGFyYW1ldGVycy4KLQkJCQkJICAgaDIyNTBMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnMpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiAtMTsKLQl9Ci0KLQlpZiAoKG9sYy0+b3B0aW9ucyAmCi0JICAgICBlT3BlbkxvZ2ljYWxDaGFubmVsX3JldmVyc2VMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnMpICYmCi0JICAgIChvbGMtPnJldmVyc2VMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnMub3B0aW9ucyAmCi0JICAgICBlT3BlbkxvZ2ljYWxDaGFubmVsX3JldmVyc2VMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnNfbXVsdGlwbGV4UGFyYW1ldGVycykKLQkgICAgJiYgKG9sYy0+cmV2ZXJzZUxvZ2ljYWxDaGFubmVsUGFyYW1ldGVycy5tdWx0aXBsZXhQYXJhbWV0ZXJzLgotCQljaG9pY2UgPT0KLQkJZU9wZW5Mb2dpY2FsQ2hhbm5lbF9yZXZlcnNlTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzX211bHRpcGxleFBhcmFtZXRlcnNfaDIyNTBMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnMpKQotCXsKLQkJcmV0ID0KLQkJICAgIHByb2Nlc3NfaDI0NV9jaGFubmVsKHBza2IsIGN0LCBjdGluZm8sIGRhdGEsIGRhdGFvZmYsCi0JCQkJCSAmb2xjLT4KLQkJCQkJIHJldmVyc2VMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnMuCi0JCQkJCSBtdWx0aXBsZXhQYXJhbWV0ZXJzLgotCQkJCQkgaDIyNTBMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnMpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiAtMTsKLQl9Ci0KLQlpZiAoKG9sYy0+b3B0aW9ucyAmIGVPcGVuTG9naWNhbENoYW5uZWxfc2VwYXJhdGVTdGFjaykgJiYKLQkgICAgb2xjLT5mb3J3YXJkTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzLmRhdGFUeXBlLmNob2ljZSA9PQotCSAgICBlRGF0YVR5cGVfZGF0YSAmJgotCSAgICBvbGMtPmZvcndhcmRMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnMuZGF0YVR5cGUuZGF0YS5hcHBsaWNhdGlvbi4KLQkgICAgY2hvaWNlID09IGVEYXRhQXBwbGljYXRpb25DYXBhYmlsaXR5X2FwcGxpY2F0aW9uX3QxMjAgJiYKLQkgICAgb2xjLT5mb3J3YXJkTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzLmRhdGFUeXBlLmRhdGEuYXBwbGljYXRpb24uCi0JICAgIHQxMjAuY2hvaWNlID09IGVEYXRhUHJvdG9jb2xDYXBhYmlsaXR5X3NlcGFyYXRlTEFOU3RhY2sgJiYKLQkgICAgb2xjLT5zZXBhcmF0ZVN0YWNrLm5ldHdvcmtBZGRyZXNzLmNob2ljZSA9PQotCSAgICBlTmV0d29ya0FjY2Vzc1BhcmFtZXRlcnNfbmV0d29ya0FkZHJlc3NfbG9jYWxBcmVhQWRkcmVzcykgewotCQlyZXQgPSBleHBlY3RfdDEyMChwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLCBkYXRhb2ZmLAotCQkJCSAgJm9sYy0+c2VwYXJhdGVTdGFjay5uZXR3b3JrQWRkcmVzcy4KLQkJCQkgIGxvY2FsQXJlYUFkZHJlc3MpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiAtMTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IHByb2Nlc3Nfb2xjYShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIHN0cnVjdCBpcF9jb25udHJhY2sgKmN0LAotCQkJZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCi0JCQl1bnNpZ25lZCBjaGFyICoqZGF0YSwgaW50IGRhdGFvZmYsCi0JCQlPcGVuTG9naWNhbENoYW5uZWxBY2sgKiBvbGNhKQotewotCUgyMjUwTG9naWNhbENoYW5uZWxBY2tQYXJhbWV0ZXJzICphY2s7Ci0JaW50IHJldDsKLQotCURFQlVHUCgiaXBfY3RfaDMyMzogT3BlbkxvZ2ljYWxDaGFubmVsQWNrXG4iKTsKLQotCWlmICgob2xjYS0+b3B0aW9ucyAmCi0JICAgICBlT3BlbkxvZ2ljYWxDaGFubmVsQWNrX3JldmVyc2VMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnMpICYmCi0JICAgIChvbGNhLT5yZXZlcnNlTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzLm9wdGlvbnMgJgotCSAgICAgZU9wZW5Mb2dpY2FsQ2hhbm5lbEFja19yZXZlcnNlTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzX211bHRpcGxleFBhcmFtZXRlcnMpCi0JICAgICYmIChvbGNhLT5yZXZlcnNlTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzLm11bHRpcGxleFBhcmFtZXRlcnMuCi0JCWNob2ljZSA9PQotCQllT3BlbkxvZ2ljYWxDaGFubmVsQWNrX3JldmVyc2VMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnNfbXVsdGlwbGV4UGFyYW1ldGVyc19oMjI1MExvZ2ljYWxDaGFubmVsUGFyYW1ldGVycykpCi0JewotCQlyZXQgPSBwcm9jZXNzX2gyNDVfY2hhbm5lbChwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLCBkYXRhb2ZmLAotCQkJCQkgICAmb2xjYS0+Ci0JCQkJCSAgIHJldmVyc2VMb2dpY2FsQ2hhbm5lbFBhcmFtZXRlcnMuCi0JCQkJCSAgIG11bHRpcGxleFBhcmFtZXRlcnMuCi0JCQkJCSAgIGgyMjUwTG9naWNhbENoYW5uZWxQYXJhbWV0ZXJzKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gLTE7Ci0JfQotCi0JaWYgKChvbGNhLT5vcHRpb25zICYKLQkgICAgIGVPcGVuTG9naWNhbENoYW5uZWxBY2tfZm9yd2FyZE11bHRpcGxleEFja1BhcmFtZXRlcnMpICYmCi0JICAgIChvbGNhLT5mb3J3YXJkTXVsdGlwbGV4QWNrUGFyYW1ldGVycy5jaG9pY2UgPT0KLQkgICAgIGVPcGVuTG9naWNhbENoYW5uZWxBY2tfZm9yd2FyZE11bHRpcGxleEFja1BhcmFtZXRlcnNfaDIyNTBMb2dpY2FsQ2hhbm5lbEFja1BhcmFtZXRlcnMpKQotCXsKLQkJYWNrID0gJm9sY2EtPmZvcndhcmRNdWx0aXBsZXhBY2tQYXJhbWV0ZXJzLgotCQkgICAgaDIyNTBMb2dpY2FsQ2hhbm5lbEFja1BhcmFtZXRlcnM7Ci0JCWlmIChhY2stPm9wdGlvbnMgJgotCQkgICAgZUgyMjUwTG9naWNhbENoYW5uZWxBY2tQYXJhbWV0ZXJzX21lZGlhQ2hhbm5lbCkgewotCQkJLyogUlRQICovCi0JCQlyZXQgPSBleHBlY3RfcnRwX3J0Y3AocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwgZGF0YW9mZiwKLQkJCQkJICAgICAgJmFjay0+bWVkaWFDaGFubmVsKTsKLQkJCWlmIChyZXQgPCAwKQotCQkJCXJldHVybiAtMTsKLQkJfQotCi0JCWlmIChhY2stPm9wdGlvbnMgJgotCQkgICAgZUgyMjUwTG9naWNhbENoYW5uZWxBY2tQYXJhbWV0ZXJzX21lZGlhQ29udHJvbENoYW5uZWwpIHsKLQkJCS8qIFJUQ1AgKi8KLQkJCXJldCA9IGV4cGVjdF9ydHBfcnRjcChwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLCBkYXRhb2ZmLAotCQkJCQkgICAgICAmYWNrLT5tZWRpYUNvbnRyb2xDaGFubmVsKTsKLQkJCWlmIChyZXQgPCAwKQotCQkJCXJldHVybiAtMTsKLQkJfQotCX0KLQotCXJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgcHJvY2Vzc19oMjQ1KHN0cnVjdCBza19idWZmICoqcHNrYiwgc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsCi0JCQllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKLQkJCXVuc2lnbmVkIGNoYXIgKipkYXRhLCBpbnQgZGF0YW9mZiwKLQkJCU11bHRpbWVkaWFTeXN0ZW1Db250cm9sTWVzc2FnZSAqIG1zY20pCi17Ci0Jc3dpdGNoIChtc2NtLT5jaG9pY2UpIHsKLQljYXNlIGVNdWx0aW1lZGlhU3lzdGVtQ29udHJvbE1lc3NhZ2VfcmVxdWVzdDoKLQkJaWYgKG1zY20tPnJlcXVlc3QuY2hvaWNlID09Ci0JCSAgICBlUmVxdWVzdE1lc3NhZ2Vfb3BlbkxvZ2ljYWxDaGFubmVsKSB7Ci0JCQlyZXR1cm4gcHJvY2Vzc19vbGMocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwgZGF0YW9mZiwKLQkJCQkJICAgJm1zY20tPnJlcXVlc3Qub3BlbkxvZ2ljYWxDaGFubmVsKTsKLQkJfQotCQlERUJVR1AoImlwX2N0X2gzMjM6IEguMjQ1IFJlcXVlc3QgJWRcbiIsCi0JCSAgICAgICBtc2NtLT5yZXF1ZXN0LmNob2ljZSk7Ci0JCWJyZWFrOwotCWNhc2UgZU11bHRpbWVkaWFTeXN0ZW1Db250cm9sTWVzc2FnZV9yZXNwb25zZToKLQkJaWYgKG1zY20tPnJlc3BvbnNlLmNob2ljZSA9PQotCQkgICAgZVJlc3BvbnNlTWVzc2FnZV9vcGVuTG9naWNhbENoYW5uZWxBY2spIHsKLQkJCXJldHVybiBwcm9jZXNzX29sY2EocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwgZGF0YW9mZiwKLQkJCQkJICAgICZtc2NtLT5yZXNwb25zZS4KLQkJCQkJICAgIG9wZW5Mb2dpY2FsQ2hhbm5lbEFjayk7Ci0JCX0KLQkJREVCVUdQKCJpcF9jdF9oMzIzOiBILjI0NSBSZXNwb25zZSAlZFxuIiwKLQkJICAgICAgIG1zY20tPnJlc3BvbnNlLmNob2ljZSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCURFQlVHUCgiaXBfY3RfaDMyMzogSC4yNDUgc2lnbmFsICVkXG4iLCBtc2NtLT5jaG9pY2UpOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IGgyNDVfaGVscChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIHN0cnVjdCBpcF9jb25udHJhY2sgKmN0LAotCQkgICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvKQotewotCXN0YXRpYyBNdWx0aW1lZGlhU3lzdGVtQ29udHJvbE1lc3NhZ2UgbXNjbTsKLQl1bnNpZ25lZCBjaGFyICpkYXRhID0gTlVMTDsKLQlpbnQgZGF0YWxlbjsKLQlpbnQgZGF0YW9mZjsKLQlpbnQgcmV0OwotCi0JLyogVW50aWwgdGhlcmUncyBiZWVuIHRyYWZmaWMgYm90aCB3YXlzLCBkb24ndCBsb29rIGluIHBhY2tldHMuICovCi0JaWYgKGN0aW5mbyAhPSBJUF9DVF9FU1RBQkxJU0hFRAotCSAgICAmJiBjdGluZm8gIT0gSVBfQ1RfRVNUQUJMSVNIRUQgKyBJUF9DVF9JU19SRVBMWSkgewotCQlyZXR1cm4gTkZfQUNDRVBUOwotCX0KLQlERUJVR1AoImlwX2N0X2gyNDU6IHNrYmxlbiA9ICV1XG4iLCAoKnBza2IpLT5sZW4pOwotCi0Jc3Bpbl9sb2NrX2JoKCZpcF9oMzIzX2xvY2spOwotCi0JLyogUHJvY2VzcyBlYWNoIFRQS1QgKi8KLQl3aGlsZSAoZ2V0X3Rwa3RfZGF0YShwc2tiLCBjdCwgY3RpbmZvLCAmZGF0YSwgJmRhdGFsZW4sICZkYXRhb2ZmKSkgewotCQlERUJVR1AoImlwX2N0X2gyNDU6IFRQS1QgJXUuJXUuJXUuJXUtPiV1LiV1LiV1LiV1LCBsZW49JWRcbiIsCi0JCSAgICAgICBOSVBRVUFEKCgqcHNrYiktPm5oLmlwaC0+c2FkZHIpLAotCQkgICAgICAgTklQUVVBRCgoKnBza2IpLT5uaC5pcGgtPmRhZGRyKSwgZGF0YWxlbik7Ci0KLQkJLyogRGVjb2RlIEguMjQ1IHNpZ25hbCAqLwotCQlyZXQgPSBEZWNvZGVNdWx0aW1lZGlhU3lzdGVtQ29udHJvbE1lc3NhZ2UoZGF0YSwgZGF0YWxlbiwKLQkJCQkJCQkgICAmbXNjbSk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlpZiAobmV0X3JhdGVsaW1pdCgpKQotCQkJCXByaW50aygiaXBfY3RfaDI0NTogZGVjb2RpbmcgZXJyb3I6ICVzXG4iLAotCQkJCSAgICAgICByZXQgPT0gSDMyM19FUlJPUl9CT1VORCA/Ci0JCQkJICAgICAgICJvdXQgb2YgYm91bmQiIDogIm91dCBvZiByYW5nZSIpOwotCQkJLyogV2UgZG9uJ3QgZHJvcCB3aGVuIGRlY29kaW5nIGVycm9yICovCi0JCQlicmVhazsKLQkJfQotCi0JCS8qIFByb2Nlc3MgSC4yNDUgc2lnbmFsICovCi0JCWlmIChwcm9jZXNzX2gyNDUocHNrYiwgY3QsIGN0aW5mbywgJmRhdGEsIGRhdGFvZmYsICZtc2NtKSA8IDApCi0JCQlnb3RvIGRyb3A7Ci0JfQotCi0Jc3Bpbl91bmxvY2tfYmgoJmlwX2gzMjNfbG9jayk7Ci0JcmV0dXJuIE5GX0FDQ0VQVDsKLQotICAgICAgZHJvcDoKLQlzcGluX3VubG9ja19iaCgmaXBfaDMyM19sb2NrKTsKLQlpZiAobmV0X3JhdGVsaW1pdCgpKQotCQlwcmludGsoImlwX2N0X2gyNDU6IHBhY2tldCBkcm9wcGVkXG4iKTsKLQlyZXR1cm4gTkZfRFJPUDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgc3RydWN0IGlwX2Nvbm50cmFja19oZWxwZXIgaXBfY29ubnRyYWNrX2hlbHBlcl9oMjQ1ID0gewotCS5uYW1lID0gIkguMjQ1IiwKLQkubWUgPSBUSElTX01PRFVMRSwKLQkubWF4X2V4cGVjdGVkID0gSDMyM19SVFBfQ0hBTk5FTF9NQVggKiA0ICsgMiAvKiBULjEyMCAqLyAsCi0JLnRpbWVvdXQgPSAyNDAsCi0JLnR1cGxlID0gey5kc3QgPSB7LnByb3RvbnVtID0gSVBQUk9UT19UQ1B9fSwKLQkubWFzayA9IHsuc3JjID0gey51ID0gezB4RkZGRn19LAotCQkgLmRzdCA9IHsucHJvdG9udW0gPSAweEZGfX0sCi0JLmhlbHAgPSBoMjQ1X2hlbHAKLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBpcF9jb25udHJhY2tfaDI0NV9leHBlY3Qoc3RydWN0IGlwX2Nvbm50cmFjayAqbmV3LAotCQkJICAgICAgc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKnRoaXMpCi17Ci0Jd3JpdGVfbG9ja19iaCgmaXBfY29ubnRyYWNrX2xvY2spOwotCW5ldy0+aGVscGVyID0gJmlwX2Nvbm50cmFja19oZWxwZXJfaDI0NTsKLQl3cml0ZV91bmxvY2tfYmgoJmlwX2Nvbm50cmFja19sb2NrKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgZ2V0X2gyMjVfYWRkcih1bnNpZ25lZCBjaGFyICpkYXRhLCBUcmFuc3BvcnRBZGRyZXNzICogYWRkciwKLQkJICBfX2JlMzIgKiBpcCwgdV9pbnQxNl90ICogcG9ydCkKLXsKLQl1bnNpZ25lZCBjaGFyICpwOwotCi0JaWYgKGFkZHItPmNob2ljZSAhPSBlVHJhbnNwb3J0QWRkcmVzc19pcEFkZHJlc3MpCi0JCXJldHVybiAwOwotCi0JcCA9IGRhdGEgKyBhZGRyLT5pcEFkZHJlc3MuaXA7Ci0JKmlwID0gaHRvbmwoKHBbMF0gPDwgMjQpIHwgKHBbMV0gPDwgMTYpIHwgKHBbMl0gPDwgOCkgfCAocFszXSkpOwotCSpwb3J0ID0gKHBbNF0gPDwgOCkgfCAocFs1XSk7Ci0KLQlyZXR1cm4gMTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IGV4cGVjdF9oMjQ1KHN0cnVjdCBza19idWZmICoqcHNrYiwgc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsCi0JCSAgICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKLQkJICAgICAgIHVuc2lnbmVkIGNoYXIgKipkYXRhLCBpbnQgZGF0YW9mZiwKLQkJICAgICAgIFRyYW5zcG9ydEFkZHJlc3MgKiBhZGRyKQotewotCWludCBkaXIgPSBDVElORk8yRElSKGN0aW5mbyk7Ci0JaW50IHJldCA9IDA7Ci0JX19iZTMyIGlwOwotCXVfaW50MTZfdCBwb3J0OwotCXN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpleHAgPSBOVUxMOwotCXR5cGVvZihuYXRfaDI0NV9ob29rKSBuYXRfaDI0NTsKLQotCS8qIFJlYWQgaDI0NUFkZHJlc3MgKi8KLQlpZiAoIWdldF9oMjI1X2FkZHIoKmRhdGEsIGFkZHIsICZpcCwgJnBvcnQpIHx8Ci0JICAgIGlwICE9IGN0LT50dXBsZWhhc2hbZGlyXS50dXBsZS5zcmMuaXAgfHwgcG9ydCA9PSAwKQotCQlyZXR1cm4gMDsKLQotCS8qIENyZWF0ZSBleHBlY3QgZm9yIGgyNDUgY29ubmVjdGlvbiAqLwotCWlmICgoZXhwID0gaXBfY29ubnRyYWNrX2V4cGVjdF9hbGxvYyhjdCkpID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlleHAtPnR1cGxlLnNyYy5pcCA9IGN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuc3JjLmlwOwotCWV4cC0+dHVwbGUuc3JjLnUudGNwLnBvcnQgPSAwOwotCWV4cC0+dHVwbGUuZHN0LmlwID0gY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5kc3QuaXA7Ci0JZXhwLT50dXBsZS5kc3QudS50Y3AucG9ydCA9IGh0b25zKHBvcnQpOwotCWV4cC0+dHVwbGUuZHN0LnByb3RvbnVtID0gSVBQUk9UT19UQ1A7Ci0JZXhwLT5tYXNrLnNyYy5pcCA9IGh0b25sKDB4RkZGRkZGRkYpOwotCWV4cC0+bWFzay5zcmMudS50Y3AucG9ydCA9IDA7Ci0JZXhwLT5tYXNrLmRzdC5pcCA9IGh0b25sKDB4RkZGRkZGRkYpOwotCWV4cC0+bWFzay5kc3QudS50Y3AucG9ydCA9IGh0b25zKDB4RkZGRik7Ci0JZXhwLT5tYXNrLmRzdC5wcm90b251bSA9IDB4RkY7Ci0JZXhwLT5mbGFncyA9IDA7Ci0KLQlpZiAoY3QtPnR1cGxlaGFzaFtkaXJdLnR1cGxlLnNyYy5pcCAhPQotCSAgICBjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLmRzdC5pcCAmJgotCSAgICAobmF0X2gyNDUgPSByY3VfZGVyZWZlcmVuY2UobmF0X2gyNDVfaG9vaykpKSB7Ci0JCS8qIE5BVCBuZWVkZWQgKi8KLQkJcmV0ID0gbmF0X2gyNDUocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwgZGF0YW9mZiwgYWRkciwKLQkJCSAgICAgICBwb3J0LCBleHApOwotCX0gZWxzZSB7CQkvKiBDb25udHJhY2sgb25seSAqLwotCQlleHAtPmV4cGVjdGZuID0gaXBfY29ubnRyYWNrX2gyNDVfZXhwZWN0OwotCi0JCWlmIChpcF9jb25udHJhY2tfZXhwZWN0X3JlbGF0ZWQoZXhwKSA9PSAwKSB7Ci0JCQlERUJVR1AoImlwX2N0X3E5MzE6IGV4cGVjdCBILjI0NSAiCi0JCQkgICAgICAgIiV1LiV1LiV1LiV1OiVodS0+JXUuJXUuJXUuJXU6JWh1XG4iLAotCQkJICAgICAgIE5JUFFVQUQoZXhwLT50dXBsZS5zcmMuaXApLAotCQkJICAgICAgIG50b2hzKGV4cC0+dHVwbGUuc3JjLnUudGNwLnBvcnQpLAotCQkJICAgICAgIE5JUFFVQUQoZXhwLT50dXBsZS5kc3QuaXApLAotCQkJICAgICAgIG50b2hzKGV4cC0+dHVwbGUuZHN0LnUudGNwLnBvcnQpKTsKLQkJfSBlbHNlCi0JCQlyZXQgPSAtMTsKLQl9Ci0KLQlpcF9jb25udHJhY2tfZXhwZWN0X3B1dChleHApOwotCi0JcmV0dXJuIHJldDsKLX0KLQotLyogRm9yd2FyZGluZyBkZWNsYXJhdGlvbiAqLwotdm9pZCBpcF9jb25udHJhY2tfcTkzMV9leHBlY3Qoc3RydWN0IGlwX2Nvbm50cmFjayAqbmV3LAotCQkJICAgICAgc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKnRoaXMpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgZXhwZWN0X2NhbGxmb3J3YXJkaW5nKHN0cnVjdCBza19idWZmICoqcHNrYiwKLQkJCQkgc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsCi0JCQkJIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAotCQkJCSB1bnNpZ25lZCBjaGFyICoqZGF0YSwgaW50IGRhdGFvZmYsCi0JCQkJIFRyYW5zcG9ydEFkZHJlc3MgKiBhZGRyKQotewotCWludCBkaXIgPSBDVElORk8yRElSKGN0aW5mbyk7Ci0JaW50IHJldCA9IDA7Ci0JX19iZTMyIGlwOwotCXVfaW50MTZfdCBwb3J0OwotCXN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpleHAgPSBOVUxMOwotCXR5cGVvZihuYXRfY2FsbGZvcndhcmRpbmdfaG9vaykgbmF0X2NhbGxmb3J3YXJkaW5nOwotCi0JLyogUmVhZCBhbHRlcm5hdGl2ZUFkZHJlc3MgKi8KLQlpZiAoIWdldF9oMjI1X2FkZHIoKmRhdGEsIGFkZHIsICZpcCwgJnBvcnQpIHx8IHBvcnQgPT0gMCkKLQkJcmV0dXJuIDA7Ci0KLQkvKiBJZiB0aGUgY2FsbGluZyBwYXJ0eSBpcyBvbiB0aGUgc2FtZSBzaWRlIG9mIHRoZSBmb3J3YXJkLXRvIHBhcnR5LAotCSAqIHdlIGRvbid0IG5lZWQgdG8gdHJhY2sgdGhlIHNlY29uZCBjYWxsICovCi0JaWYgKGNhbGxmb3J3YXJkX2ZpbHRlcikgewotCQlzdHJ1Y3QgcnRhYmxlICpydDEsICpydDI7Ci0JCXN0cnVjdCBmbG93aSBmbDEgPSB7Ci0JCQkuZmw0X2RzdCA9IGlwLAotCQl9OwotCQlzdHJ1Y3QgZmxvd2kgZmwyID0gewotCQkJLmZsNF9kc3QgPSBjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLnNyYy5pcCwKLQkJfTsKLQotCQlpZiAoaXBfcm91dGVfb3V0cHV0X2tleSgmcnQxLCAmZmwxKSA9PSAwKSB7Ci0JCQlpZiAoaXBfcm91dGVfb3V0cHV0X2tleSgmcnQyLCAmZmwyKSA9PSAwKSB7Ci0JCQkJaWYgKHJ0MS0+cnRfZ2F0ZXdheSA9PSBydDItPnJ0X2dhdGV3YXkgJiYKLQkJCQkgICAgcnQxLT51LmRzdC5kZXYgID09IHJ0Mi0+dS5kc3QuZGV2KQotCQkJCQlyZXQgPSAxOwotCQkJCWRzdF9yZWxlYXNlKCZydDItPnUuZHN0KTsKLQkJCX0KLQkJCWRzdF9yZWxlYXNlKCZydDEtPnUuZHN0KTsKLQkJfQotCQlpZiAocmV0KSB7Ci0JCQlERUJVR1AoImlwX2N0X3E5MzE6IENhbGwgRm9yd2FyZGluZyBub3QgdHJhY2tlZFxuIik7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQotCS8qIENyZWF0ZSBleHBlY3QgZm9yIHRoZSBzZWNvbmQgY2FsbCBsZWcgKi8KLQlpZiAoKGV4cCA9IGlwX2Nvbm50cmFja19leHBlY3RfYWxsb2MoY3QpKSA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JZXhwLT50dXBsZS5zcmMuaXAgPSBjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLnNyYy5pcDsKLQlleHAtPnR1cGxlLnNyYy51LnRjcC5wb3J0ID0gMDsKLQlleHAtPnR1cGxlLmRzdC5pcCA9IGlwOwotCWV4cC0+dHVwbGUuZHN0LnUudGNwLnBvcnQgPSBodG9ucyhwb3J0KTsKLQlleHAtPnR1cGxlLmRzdC5wcm90b251bSA9IElQUFJPVE9fVENQOwotCWV4cC0+bWFzay5zcmMuaXAgPSBodG9ubCgweEZGRkZGRkZGKTsKLQlleHAtPm1hc2suc3JjLnUudGNwLnBvcnQgPSAwOwotCWV4cC0+bWFzay5kc3QuaXAgPSBodG9ubCgweEZGRkZGRkZGKTsKLQlleHAtPm1hc2suZHN0LnUudGNwLnBvcnQgPSBodG9ucygweEZGRkYpOwotCWV4cC0+bWFzay5kc3QucHJvdG9udW0gPSAweEZGOwotCWV4cC0+ZmxhZ3MgPSAwOwotCi0JaWYgKGN0LT50dXBsZWhhc2hbZGlyXS50dXBsZS5zcmMuaXAgIT0KLQkgICAgY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5kc3QuaXAgJiYKLQkgICAgKG5hdF9jYWxsZm9yd2FyZGluZyA9IHJjdV9kZXJlZmVyZW5jZShuYXRfY2FsbGZvcndhcmRpbmdfaG9vaykpKSB7Ci0JCS8qIE5lZWQgTkFUICovCi0JCXJldCA9IG5hdF9jYWxsZm9yd2FyZGluZyhwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLCBkYXRhb2ZmLAotCQkJCQkgYWRkciwgcG9ydCwgZXhwKTsKLQl9IGVsc2UgewkJLyogQ29ubnRyYWNrIG9ubHkgKi8KLQkJZXhwLT5leHBlY3RmbiA9IGlwX2Nvbm50cmFja19xOTMxX2V4cGVjdDsKLQotCQlpZiAoaXBfY29ubnRyYWNrX2V4cGVjdF9yZWxhdGVkKGV4cCkgPT0gMCkgewotCQkJREVCVUdQKCJpcF9jdF9xOTMxOiBleHBlY3QgQ2FsbCBGb3J3YXJkaW5nICIKLQkJCSAgICAgICAiJXUuJXUuJXUuJXU6JWh1LT4ldS4ldS4ldS4ldTolaHVcbiIsCi0JCQkgICAgICAgTklQUVVBRChleHAtPnR1cGxlLnNyYy5pcCksCi0JCQkgICAgICAgbnRvaHMoZXhwLT50dXBsZS5zcmMudS50Y3AucG9ydCksCi0JCQkgICAgICAgTklQUVVBRChleHAtPnR1cGxlLmRzdC5pcCksCi0JCQkgICAgICAgbnRvaHMoZXhwLT50dXBsZS5kc3QudS50Y3AucG9ydCkpOwotCQl9IGVsc2UKLQkJCXJldCA9IC0xOwotCX0KLQotCWlwX2Nvbm50cmFja19leHBlY3RfcHV0KGV4cCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgcHJvY2Vzc19zZXR1cChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIHN0cnVjdCBpcF9jb25udHJhY2sgKmN0LAotCQkJIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAotCQkJIHVuc2lnbmVkIGNoYXIgKipkYXRhLCBpbnQgZGF0YW9mZiwKLQkJCSBTZXR1cF9VVUlFICogc2V0dXApCi17Ci0JaW50IGRpciA9IENUSU5GTzJESVIoY3RpbmZvKTsKLQlpbnQgcmV0OwotCWludCBpOwotCV9fYmUzMiBpcDsKLQl1X2ludDE2X3QgcG9ydDsKLQl0eXBlb2Yoc2V0X2gyMjVfYWRkcl9ob29rKSBzZXRfaDIyNV9hZGRyOwotCi0JREVCVUdQKCJpcF9jdF9xOTMxOiBTZXR1cFxuIik7Ci0KLQlpZiAoc2V0dXAtPm9wdGlvbnMgJiBlU2V0dXBfVVVJRV9oMjQ1QWRkcmVzcykgewotCQlyZXQgPSBleHBlY3RfaDI0NShwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLCBkYXRhb2ZmLAotCQkJCSAgJnNldHVwLT5oMjQ1QWRkcmVzcyk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIC0xOwotCX0KLQotCXNldF9oMjI1X2FkZHIgPSByY3VfZGVyZWZlcmVuY2Uoc2V0X2gyMjVfYWRkcl9ob29rKTsKLQotCWlmICgoc2V0dXAtPm9wdGlvbnMgJiBlU2V0dXBfVVVJRV9kZXN0Q2FsbFNpZ25hbEFkZHJlc3MpICYmCi0JICAgIChzZXRfaDIyNV9hZGRyKSAmJgotCSAgICBnZXRfaDIyNV9hZGRyKCpkYXRhLCAmc2V0dXAtPmRlc3RDYWxsU2lnbmFsQWRkcmVzcywgJmlwLCAmcG9ydCkgJiYKLQkgICAgaXAgIT0gY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5zcmMuaXApIHsKLQkJREVCVUdQKCJpcF9jdF9xOTMxOiBzZXQgZGVzdENhbGxTaWduYWxBZGRyZXNzICIKLQkJICAgICAgICIldS4ldS4ldS4ldTolaHUtPiV1LiV1LiV1LiV1OiVodVxuIiwKLQkJICAgICAgIE5JUFFVQUQoaXApLCBwb3J0LAotCQkgICAgICAgTklQUVVBRChjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLnNyYy5pcCksCi0JCSAgICAgICBudG9ocyhjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLnNyYy51LnRjcC5wb3J0KSk7Ci0JCXJldCA9IHNldF9oMjI1X2FkZHIocHNrYiwgZGF0YSwgZGF0YW9mZiwKLQkJCQkgICAgJnNldHVwLT5kZXN0Q2FsbFNpZ25hbEFkZHJlc3MsCi0JCQkJICAgIGN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuc3JjLmlwLAotCQkJCSAgICBudG9ocyhjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLnNyYy4KLQkJCQkJICB1LnRjcC5wb3J0KSk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIC0xOwotCX0KLQotCWlmICgoc2V0dXAtPm9wdGlvbnMgJiBlU2V0dXBfVVVJRV9zb3VyY2VDYWxsU2lnbmFsQWRkcmVzcykgJiYKLQkgICAgKHNldF9oMjI1X2FkZHIpICYmCi0JICAgIGdldF9oMjI1X2FkZHIoKmRhdGEsICZzZXR1cC0+c291cmNlQ2FsbFNpZ25hbEFkZHJlc3MsICZpcCwgJnBvcnQpCi0JICAgICYmIGlwICE9IGN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuZHN0LmlwKSB7Ci0JCURFQlVHUCgiaXBfY3RfcTkzMTogc2V0IHNvdXJjZUNhbGxTaWduYWxBZGRyZXNzICIKLQkJICAgICAgICIldS4ldS4ldS4ldTolaHUtPiV1LiV1LiV1LiV1OiVodVxuIiwKLQkJICAgICAgIE5JUFFVQUQoaXApLCBwb3J0LAotCQkgICAgICAgTklQUVVBRChjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLmRzdC5pcCksCi0JCSAgICAgICBudG9ocyhjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLmRzdC51LnRjcC5wb3J0KSk7Ci0JCXJldCA9IHNldF9oMjI1X2FkZHIocHNrYiwgZGF0YSwgZGF0YW9mZiwKLQkJCQkgICAgJnNldHVwLT5zb3VyY2VDYWxsU2lnbmFsQWRkcmVzcywKLQkJCQkgICAgY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5kc3QuaXAsCi0JCQkJICAgIG50b2hzKGN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuZHN0LgotCQkJCQkgIHUudGNwLnBvcnQpKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gLTE7Ci0JfQotCi0JaWYgKHNldHVwLT5vcHRpb25zICYgZVNldHVwX1VVSUVfZmFzdFN0YXJ0KSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBzZXR1cC0+ZmFzdFN0YXJ0LmNvdW50OyBpKyspIHsKLQkJCXJldCA9IHByb2Nlc3Nfb2xjKHBza2IsIGN0LCBjdGluZm8sIGRhdGEsIGRhdGFvZmYsCi0JCQkJCSAgJnNldHVwLT5mYXN0U3RhcnQuaXRlbVtpXSk7Ci0JCQlpZiAocmV0IDwgMCkKLQkJCQlyZXR1cm4gLTE7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IHByb2Nlc3NfY2FsbHByb2NlZWRpbmcoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAotCQkJCSAgc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsCi0JCQkJICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKLQkJCQkgIHVuc2lnbmVkIGNoYXIgKipkYXRhLCBpbnQgZGF0YW9mZiwKLQkJCQkgIENhbGxQcm9jZWVkaW5nX1VVSUUgKiBjYWxscHJvYykKLXsKLQlpbnQgcmV0OwotCWludCBpOwotCi0JREVCVUdQKCJpcF9jdF9xOTMxOiBDYWxsUHJvY2VlZGluZ1xuIik7Ci0KLQlpZiAoY2FsbHByb2MtPm9wdGlvbnMgJiBlQ2FsbFByb2NlZWRpbmdfVVVJRV9oMjQ1QWRkcmVzcykgewotCQlyZXQgPSBleHBlY3RfaDI0NShwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLCBkYXRhb2ZmLAotCQkJCSAgJmNhbGxwcm9jLT5oMjQ1QWRkcmVzcyk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIC0xOwotCX0KLQotCWlmIChjYWxscHJvYy0+b3B0aW9ucyAmIGVDYWxsUHJvY2VlZGluZ19VVUlFX2Zhc3RTdGFydCkgewotCQlmb3IgKGkgPSAwOyBpIDwgY2FsbHByb2MtPmZhc3RTdGFydC5jb3VudDsgaSsrKSB7Ci0JCQlyZXQgPSBwcm9jZXNzX29sYyhwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLCBkYXRhb2ZmLAotCQkJCQkgICZjYWxscHJvYy0+ZmFzdFN0YXJ0Lml0ZW1baV0pOwotCQkJaWYgKHJldCA8IDApCi0JCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBwcm9jZXNzX2Nvbm5lY3Qoc3RydWN0IHNrX2J1ZmYgKipwc2tiLCBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKLQkJCSAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAotCQkJICAgdW5zaWduZWQgY2hhciAqKmRhdGEsIGludCBkYXRhb2ZmLAotCQkJICAgQ29ubmVjdF9VVUlFICogY29ubmVjdCkKLXsKLQlpbnQgcmV0OwotCWludCBpOwotCi0JREVCVUdQKCJpcF9jdF9xOTMxOiBDb25uZWN0XG4iKTsKLQotCWlmIChjb25uZWN0LT5vcHRpb25zICYgZUNvbm5lY3RfVVVJRV9oMjQ1QWRkcmVzcykgewotCQlyZXQgPSBleHBlY3RfaDI0NShwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLCBkYXRhb2ZmLAotCQkJCSAgJmNvbm5lY3QtPmgyNDVBZGRyZXNzKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gLTE7Ci0JfQotCi0JaWYgKGNvbm5lY3QtPm9wdGlvbnMgJiBlQ29ubmVjdF9VVUlFX2Zhc3RTdGFydCkgewotCQlmb3IgKGkgPSAwOyBpIDwgY29ubmVjdC0+ZmFzdFN0YXJ0LmNvdW50OyBpKyspIHsKLQkJCXJldCA9IHByb2Nlc3Nfb2xjKHBza2IsIGN0LCBjdGluZm8sIGRhdGEsIGRhdGFvZmYsCi0JCQkJCSAgJmNvbm5lY3QtPmZhc3RTdGFydC5pdGVtW2ldKTsKLQkJCWlmIChyZXQgPCAwKQotCQkJCXJldHVybiAtMTsKLQkJfQotCX0KLQotCXJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgcHJvY2Vzc19hbGVydGluZyhzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIHN0cnVjdCBpcF9jb25udHJhY2sgKmN0LAotCQkJICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAotCQkJICAgIHVuc2lnbmVkIGNoYXIgKipkYXRhLCBpbnQgZGF0YW9mZiwKLQkJCSAgICBBbGVydGluZ19VVUlFICogYWxlcnQpCi17Ci0JaW50IHJldDsKLQlpbnQgaTsKLQotCURFQlVHUCgiaXBfY3RfcTkzMTogQWxlcnRpbmdcbiIpOwotCi0JaWYgKGFsZXJ0LT5vcHRpb25zICYgZUFsZXJ0aW5nX1VVSUVfaDI0NUFkZHJlc3MpIHsKLQkJcmV0ID0gZXhwZWN0X2gyNDUocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwgZGF0YW9mZiwKLQkJCQkgICZhbGVydC0+aDI0NUFkZHJlc3MpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiAtMTsKLQl9Ci0KLQlpZiAoYWxlcnQtPm9wdGlvbnMgJiBlQWxlcnRpbmdfVVVJRV9mYXN0U3RhcnQpIHsKLQkJZm9yIChpID0gMDsgaSA8IGFsZXJ0LT5mYXN0U3RhcnQuY291bnQ7IGkrKykgewotCQkJcmV0ID0gcHJvY2Vzc19vbGMocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwgZGF0YW9mZiwKLQkJCQkJICAmYWxlcnQtPmZhc3RTdGFydC5pdGVtW2ldKTsKLQkJCWlmIChyZXQgPCAwKQotCQkJCXJldHVybiAtMTsKLQkJfQotCX0KLQotCXJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgcHJvY2Vzc19pbmZvcm1hdGlvbihzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCi0JCQkgICAgICAgc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsCi0JCQkgICAgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCi0JCQkgICAgICAgdW5zaWduZWQgY2hhciAqKmRhdGEsIGludCBkYXRhb2ZmLAotCQkJICAgICAgIEluZm9ybWF0aW9uX1VVSUUgKiBpbmZvKQotewotCWludCByZXQ7Ci0JaW50IGk7Ci0KLQlERUJVR1AoImlwX2N0X3E5MzE6IEluZm9ybWF0aW9uXG4iKTsKLQotCWlmIChpbmZvLT5vcHRpb25zICYgZUluZm9ybWF0aW9uX1VVSUVfZmFzdFN0YXJ0KSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBpbmZvLT5mYXN0U3RhcnQuY291bnQ7IGkrKykgewotCQkJcmV0ID0gcHJvY2Vzc19vbGMocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwgZGF0YW9mZiwKLQkJCQkJICAmaW5mby0+ZmFzdFN0YXJ0Lml0ZW1baV0pOwotCQkJaWYgKHJldCA8IDApCi0JCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBwcm9jZXNzX2ZhY2lsaXR5KHN0cnVjdCBza19idWZmICoqcHNrYiwgc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsCi0JCQkgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCi0JCQkgICAgdW5zaWduZWQgY2hhciAqKmRhdGEsIGludCBkYXRhb2ZmLAotCQkJICAgIEZhY2lsaXR5X1VVSUUgKiBmYWNpbGl0eSkKLXsKLQlpbnQgcmV0OwotCWludCBpOwotCi0JREVCVUdQKCJpcF9jdF9xOTMxOiBGYWNpbGl0eVxuIik7Ci0KLQlpZiAoZmFjaWxpdHktPnJlYXNvbi5jaG9pY2UgPT0gZUZhY2lsaXR5UmVhc29uX2NhbGxGb3J3YXJkZWQpIHsKLQkJaWYgKGZhY2lsaXR5LT5vcHRpb25zICYgZUZhY2lsaXR5X1VVSUVfYWx0ZXJuYXRpdmVBZGRyZXNzKQotCQkJcmV0dXJuIGV4cGVjdF9jYWxsZm9yd2FyZGluZyhwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLAotCQkJCQkJICAgICBkYXRhb2ZmLAotCQkJCQkJICAgICAmZmFjaWxpdHktPgotCQkJCQkJICAgICBhbHRlcm5hdGl2ZUFkZHJlc3MpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAoZmFjaWxpdHktPm9wdGlvbnMgJiBlRmFjaWxpdHlfVVVJRV9oMjQ1QWRkcmVzcykgewotCQlyZXQgPSBleHBlY3RfaDI0NShwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLCBkYXRhb2ZmLAotCQkJCSAgJmZhY2lsaXR5LT5oMjQ1QWRkcmVzcyk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIC0xOwotCX0KLQotCWlmIChmYWNpbGl0eS0+b3B0aW9ucyAmIGVGYWNpbGl0eV9VVUlFX2Zhc3RTdGFydCkgewotCQlmb3IgKGkgPSAwOyBpIDwgZmFjaWxpdHktPmZhc3RTdGFydC5jb3VudDsgaSsrKSB7Ci0JCQlyZXQgPSBwcm9jZXNzX29sYyhwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLCBkYXRhb2ZmLAotCQkJCQkgICZmYWNpbGl0eS0+ZmFzdFN0YXJ0Lml0ZW1baV0pOwotCQkJaWYgKHJldCA8IDApCi0JCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBwcm9jZXNzX3Byb2dyZXNzKHN0cnVjdCBza19idWZmICoqcHNrYiwgc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsCi0JCQkgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCi0JCQkgICAgdW5zaWduZWQgY2hhciAqKmRhdGEsIGludCBkYXRhb2ZmLAotCQkJICAgIFByb2dyZXNzX1VVSUUgKiBwcm9ncmVzcykKLXsKLQlpbnQgcmV0OwotCWludCBpOwotCi0JREVCVUdQKCJpcF9jdF9xOTMxOiBQcm9ncmVzc1xuIik7Ci0KLQlpZiAocHJvZ3Jlc3MtPm9wdGlvbnMgJiBlUHJvZ3Jlc3NfVVVJRV9oMjQ1QWRkcmVzcykgewotCQlyZXQgPSBleHBlY3RfaDI0NShwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLCBkYXRhb2ZmLAotCQkJCSAgJnByb2dyZXNzLT5oMjQ1QWRkcmVzcyk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIC0xOwotCX0KLQotCWlmIChwcm9ncmVzcy0+b3B0aW9ucyAmIGVQcm9ncmVzc19VVUlFX2Zhc3RTdGFydCkgewotCQlmb3IgKGkgPSAwOyBpIDwgcHJvZ3Jlc3MtPmZhc3RTdGFydC5jb3VudDsgaSsrKSB7Ci0JCQlyZXQgPSBwcm9jZXNzX29sYyhwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLCBkYXRhb2ZmLAotCQkJCQkgICZwcm9ncmVzcy0+ZmFzdFN0YXJ0Lml0ZW1baV0pOwotCQkJaWYgKHJldCA8IDApCi0JCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBwcm9jZXNzX3E5MzEoc3RydWN0IHNrX2J1ZmYgKipwc2tiLCBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKLQkJCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAotCQkJdW5zaWduZWQgY2hhciAqKmRhdGEsIGludCBkYXRhb2ZmLCBROTMxICogcTkzMSkKLXsKLQlIMzIzX1VVX1BEVSAqcGR1ID0gJnE5MzEtPlVVSUUuaDMyM191dV9wZHU7Ci0JaW50IGk7Ci0JaW50IHJldCA9IDA7Ci0KLQlzd2l0Y2ggKHBkdS0+aDMyM19tZXNzYWdlX2JvZHkuY2hvaWNlKSB7Ci0JY2FzZSBlSDMyM19VVV9QRFVfaDMyM19tZXNzYWdlX2JvZHlfc2V0dXA6Ci0JCXJldCA9IHByb2Nlc3Nfc2V0dXAocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwgZGF0YW9mZiwKLQkJCQkgICAgJnBkdS0+aDMyM19tZXNzYWdlX2JvZHkuc2V0dXApOwotCQlicmVhazsKLQljYXNlIGVIMzIzX1VVX1BEVV9oMzIzX21lc3NhZ2VfYm9keV9jYWxsUHJvY2VlZGluZzoKLQkJcmV0ID0gcHJvY2Vzc19jYWxscHJvY2VlZGluZyhwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLCBkYXRhb2ZmLAotCQkJCQkgICAgICZwZHUtPmgzMjNfbWVzc2FnZV9ib2R5LgotCQkJCQkgICAgIGNhbGxQcm9jZWVkaW5nKTsKLQkJYnJlYWs7Ci0JY2FzZSBlSDMyM19VVV9QRFVfaDMyM19tZXNzYWdlX2JvZHlfY29ubmVjdDoKLQkJcmV0ID0gcHJvY2Vzc19jb25uZWN0KHBza2IsIGN0LCBjdGluZm8sIGRhdGEsIGRhdGFvZmYsCi0JCQkJICAgICAgJnBkdS0+aDMyM19tZXNzYWdlX2JvZHkuY29ubmVjdCk7Ci0JCWJyZWFrOwotCWNhc2UgZUgzMjNfVVVfUERVX2gzMjNfbWVzc2FnZV9ib2R5X2FsZXJ0aW5nOgotCQlyZXQgPSBwcm9jZXNzX2FsZXJ0aW5nKHBza2IsIGN0LCBjdGluZm8sIGRhdGEsIGRhdGFvZmYsCi0JCQkJICAgICAgICZwZHUtPmgzMjNfbWVzc2FnZV9ib2R5LmFsZXJ0aW5nKTsKLQkJYnJlYWs7Ci0JY2FzZSBlSDMyM19VVV9QRFVfaDMyM19tZXNzYWdlX2JvZHlfaW5mb3JtYXRpb246Ci0JCXJldCA9IHByb2Nlc3NfaW5mb3JtYXRpb24ocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwgZGF0YW9mZiwKLQkJCQkJICAmcGR1LT5oMzIzX21lc3NhZ2VfYm9keS4KLQkJCQkJICBpbmZvcm1hdGlvbik7Ci0JCWJyZWFrOwotCWNhc2UgZUgzMjNfVVVfUERVX2gzMjNfbWVzc2FnZV9ib2R5X2ZhY2lsaXR5OgotCQlyZXQgPSBwcm9jZXNzX2ZhY2lsaXR5KHBza2IsIGN0LCBjdGluZm8sIGRhdGEsIGRhdGFvZmYsCi0JCQkJICAgICAgICZwZHUtPmgzMjNfbWVzc2FnZV9ib2R5LmZhY2lsaXR5KTsKLQkJYnJlYWs7Ci0JY2FzZSBlSDMyM19VVV9QRFVfaDMyM19tZXNzYWdlX2JvZHlfcHJvZ3Jlc3M6Ci0JCXJldCA9IHByb2Nlc3NfcHJvZ3Jlc3MocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwgZGF0YW9mZiwKLQkJCQkgICAgICAgJnBkdS0+aDMyM19tZXNzYWdlX2JvZHkucHJvZ3Jlc3MpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlERUJVR1AoImlwX2N0X3E5MzE6IFEuOTMxIHNpZ25hbCAlZFxuIiwKLQkJICAgICAgIHBkdS0+aDMyM19tZXNzYWdlX2JvZHkuY2hvaWNlKTsKLQkJYnJlYWs7Ci0JfQotCi0JaWYgKHJldCA8IDApCi0JCXJldHVybiAtMTsKLQotCWlmIChwZHUtPm9wdGlvbnMgJiBlSDMyM19VVV9QRFVfaDI0NUNvbnRyb2wpIHsKLQkJZm9yIChpID0gMDsgaSA8IHBkdS0+aDI0NUNvbnRyb2wuY291bnQ7IGkrKykgewotCQkJcmV0ID0gcHJvY2Vzc19oMjQ1KHBza2IsIGN0LCBjdGluZm8sIGRhdGEsIGRhdGFvZmYsCi0JCQkJCSAgICZwZHUtPmgyNDVDb250cm9sLml0ZW1baV0pOwotCQkJaWYgKHJldCA8IDApCi0JCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBxOTMxX2hlbHAoc3RydWN0IHNrX2J1ZmYgKipwc2tiLCBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKLQkJICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbykKLXsKLQlzdGF0aWMgUTkzMSBxOTMxOwotCXVuc2lnbmVkIGNoYXIgKmRhdGEgPSBOVUxMOwotCWludCBkYXRhbGVuOwotCWludCBkYXRhb2ZmOwotCWludCByZXQ7Ci0KLQkvKiBVbnRpbCB0aGVyZSdzIGJlZW4gdHJhZmZpYyBib3RoIHdheXMsIGRvbid0IGxvb2sgaW4gcGFja2V0cy4gKi8KLQlpZiAoY3RpbmZvICE9IElQX0NUX0VTVEFCTElTSEVECi0JICAgICYmIGN0aW5mbyAhPSBJUF9DVF9FU1RBQkxJU0hFRCArIElQX0NUX0lTX1JFUExZKSB7Ci0JCXJldHVybiBORl9BQ0NFUFQ7Ci0JfQotCURFQlVHUCgiaXBfY3RfcTkzMTogc2tibGVuID0gJXVcbiIsICgqcHNrYiktPmxlbik7Ci0KLQlzcGluX2xvY2tfYmgoJmlwX2gzMjNfbG9jayk7Ci0KLQkvKiBQcm9jZXNzIGVhY2ggVFBLVCAqLwotCXdoaWxlIChnZXRfdHBrdF9kYXRhKHBza2IsIGN0LCBjdGluZm8sICZkYXRhLCAmZGF0YWxlbiwgJmRhdGFvZmYpKSB7Ci0JCURFQlVHUCgiaXBfY3RfcTkzMTogVFBLVCAldS4ldS4ldS4ldS0+JXUuJXUuJXUuJXUsIGxlbj0lZFxuIiwKLQkJICAgICAgIE5JUFFVQUQoKCpwc2tiKS0+bmguaXBoLT5zYWRkciksCi0JCSAgICAgICBOSVBRVUFEKCgqcHNrYiktPm5oLmlwaC0+ZGFkZHIpLCBkYXRhbGVuKTsKLQotCQkvKiBEZWNvZGUgUS45MzEgc2lnbmFsICovCi0JCXJldCA9IERlY29kZVE5MzEoZGF0YSwgZGF0YWxlbiwgJnE5MzEpOwotCQlpZiAocmV0IDwgMCkgewotCQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKLQkJCQlwcmludGsoImlwX2N0X3E5MzE6IGRlY29kaW5nIGVycm9yOiAlc1xuIiwKLQkJCQkgICAgICAgcmV0ID09IEgzMjNfRVJST1JfQk9VTkQgPwotCQkJCSAgICAgICAib3V0IG9mIGJvdW5kIiA6ICJvdXQgb2YgcmFuZ2UiKTsKLQkJCS8qIFdlIGRvbid0IGRyb3Agd2hlbiBkZWNvZGluZyBlcnJvciAqLwotCQkJYnJlYWs7Ci0JCX0KLQotCQkvKiBQcm9jZXNzIFEuOTMxIHNpZ25hbCAqLwotCQlpZiAocHJvY2Vzc19xOTMxKHBza2IsIGN0LCBjdGluZm8sICZkYXRhLCBkYXRhb2ZmLCAmcTkzMSkgPCAwKQotCQkJZ290byBkcm9wOwotCX0KLQotCXNwaW5fdW5sb2NrX2JoKCZpcF9oMzIzX2xvY2spOwotCXJldHVybiBORl9BQ0NFUFQ7Ci0KLSAgICAgIGRyb3A6Ci0Jc3Bpbl91bmxvY2tfYmgoJmlwX2gzMjNfbG9jayk7Ci0JaWYgKG5ldF9yYXRlbGltaXQoKSkKLQkJcHJpbnRrKCJpcF9jdF9xOTMxOiBwYWNrZXQgZHJvcHBlZFxuIik7Ci0JcmV0dXJuIE5GX0RST1A7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHN0cnVjdCBpcF9jb25udHJhY2tfaGVscGVyIGlwX2Nvbm50cmFja19oZWxwZXJfcTkzMSA9IHsKLQkubmFtZSA9ICJRLjkzMSIsCi0JLm1lID0gVEhJU19NT0RVTEUsCi0JLm1heF9leHBlY3RlZCA9IEgzMjNfUlRQX0NIQU5ORUxfTUFYICogNCArIDQgLyogVC4xMjAgYW5kIEguMjQ1ICovICwKLQkudGltZW91dCA9IDI0MCwKLQkudHVwbGUgPSB7LnNyYyA9IHsudSA9IHsudGNwID0gey5wb3J0ID0gX19jb25zdGFudF9odG9ucyhROTMxX1BPUlQpfX19LAotCQkgIC5kc3QgPSB7LnByb3RvbnVtID0gSVBQUk9UT19UQ1B9fSwKLQkubWFzayA9IHsuc3JjID0gey51ID0gezB4RkZGRn19LAotCQkgLmRzdCA9IHsucHJvdG9udW0gPSAweEZGfX0sCi0JLmhlbHAgPSBxOTMxX2hlbHAKLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBpcF9jb25udHJhY2tfcTkzMV9leHBlY3Qoc3RydWN0IGlwX2Nvbm50cmFjayAqbmV3LAotCQkJICAgICAgc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKnRoaXMpCi17Ci0Jd3JpdGVfbG9ja19iaCgmaXBfY29ubnRyYWNrX2xvY2spOwotCW5ldy0+aGVscGVyID0gJmlwX2Nvbm50cmFja19oZWxwZXJfcTkzMTsKLQl3cml0ZV91bmxvY2tfYmgoJmlwX2Nvbm50cmFja19sb2NrKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdW5zaWduZWQgY2hhciAqZ2V0X3VkcF9kYXRhKHN0cnVjdCBza19idWZmICoqcHNrYiwgaW50ICpkYXRhbGVuKQotewotCXN0cnVjdCB1ZHBoZHIgX3VoLCAqdWg7Ci0JaW50IGRhdGFvZmY7Ci0KLQl1aCA9IHNrYl9oZWFkZXJfcG9pbnRlcigqcHNrYiwgKCpwc2tiKS0+bmguaXBoLT5paGwgKiA0LCBzaXplb2YoX3VoKSwKLQkJCQkmX3VoKTsKLQlpZiAodWggPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JZGF0YW9mZiA9ICgqcHNrYiktPm5oLmlwaC0+aWhsICogNCArIHNpemVvZihfdWgpOwotCWlmIChkYXRhb2ZmID49ICgqcHNrYiktPmxlbikKLQkJcmV0dXJuIE5VTEw7Ci0JKmRhdGFsZW4gPSAoKnBza2IpLT5sZW4gLSBkYXRhb2ZmOwotCXJldHVybiBza2JfaGVhZGVyX3BvaW50ZXIoKnBza2IsIGRhdGFvZmYsICpkYXRhbGVuLCBoMzIzX2J1ZmZlcik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpmaW5kX2V4cGVjdChzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKLQkJCQkJICAgICAgIF9fYmUzMiBpcCwgdV9pbnQxNl90IHBvcnQpCi17Ci0Jc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmV4cDsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlIHR1cGxlOwotCi0JdHVwbGUuc3JjLmlwID0gMDsKLQl0dXBsZS5zcmMudS50Y3AucG9ydCA9IDA7Ci0JdHVwbGUuZHN0LmlwID0gaXA7Ci0JdHVwbGUuZHN0LnUudGNwLnBvcnQgPSBodG9ucyhwb3J0KTsKLQl0dXBsZS5kc3QucHJvdG9udW0gPSBJUFBST1RPX1RDUDsKLQotCWV4cCA9IF9faXBfY29ubnRyYWNrX2V4cGVjdF9maW5kKCZ0dXBsZSk7Ci0JaWYgKGV4cCAmJiBleHAtPm1hc3RlciA9PSBjdCkKLQkJcmV0dXJuIGV4cDsKLQlyZXR1cm4gTlVMTDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IHNldF9leHBlY3RfdGltZW91dChzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqZXhwLAotCQkJICAgICAgdW5zaWduZWQgdGltZW91dCkKLXsKLQlpZiAoIWV4cCB8fCAhZGVsX3RpbWVyKCZleHAtPnRpbWVvdXQpKQotCQlyZXR1cm4gMDsKLQotCWV4cC0+dGltZW91dC5leHBpcmVzID0gamlmZmllcyArIHRpbWVvdXQgKiBIWjsKLQlhZGRfdGltZXIoJmV4cC0+dGltZW91dCk7Ci0KLQlyZXR1cm4gMTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IGV4cGVjdF9xOTMxKHN0cnVjdCBza19idWZmICoqcHNrYiwgc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsCi0JCSAgICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKLQkJICAgICAgIHVuc2lnbmVkIGNoYXIgKipkYXRhLAotCQkgICAgICAgVHJhbnNwb3J0QWRkcmVzcyAqIGFkZHIsIGludCBjb3VudCkKLXsKLQlzdHJ1Y3QgaXBfY3RfaDMyM19tYXN0ZXIgKmluZm8gPSAmY3QtPmhlbHAuY3RfaDMyM19pbmZvOwotCWludCBkaXIgPSBDVElORk8yRElSKGN0aW5mbyk7Ci0JaW50IHJldCA9IDA7Ci0JaW50IGk7Ci0JX19iZTMyIGlwOwotCXVfaW50MTZfdCBwb3J0OwotCXN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpleHA7Ci0JdHlwZW9mKG5hdF9xOTMxX2hvb2spIG5hdF9xOTMxOwotCi0JLyogTG9vayBmb3IgdGhlIGZpcnN0IHJlbGF0ZWQgYWRkcmVzcyAqLwotCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCWlmIChnZXRfaDIyNV9hZGRyKCpkYXRhLCAmYWRkcltpXSwgJmlwLCAmcG9ydCkgJiYKLQkJICAgIGlwID09IGN0LT50dXBsZWhhc2hbZGlyXS50dXBsZS5zcmMuaXAgJiYgcG9ydCAhPSAwKQotCQkJYnJlYWs7Ci0JfQotCi0JaWYgKGkgPj0gY291bnQpCQkvKiBOb3QgZm91bmQgKi8KLQkJcmV0dXJuIDA7Ci0KLQkvKiBDcmVhdGUgZXhwZWN0IGZvciBRLjkzMSAqLwotCWlmICgoZXhwID0gaXBfY29ubnRyYWNrX2V4cGVjdF9hbGxvYyhjdCkpID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlleHAtPnR1cGxlLnNyYy5pcCA9IGdrcm91dGVkX29ubHkgPwkvKiBvbmx5IGFjY2VwdCBjYWxscyBmcm9tIEdLPyAqLwotCSAgICBjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLnNyYy5pcCA6IDA7Ci0JZXhwLT50dXBsZS5zcmMudS50Y3AucG9ydCA9IDA7Ci0JZXhwLT50dXBsZS5kc3QuaXAgPSBjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLmRzdC5pcDsKLQlleHAtPnR1cGxlLmRzdC51LnRjcC5wb3J0ID0gaHRvbnMocG9ydCk7Ci0JZXhwLT50dXBsZS5kc3QucHJvdG9udW0gPSBJUFBST1RPX1RDUDsKLQlleHAtPm1hc2suc3JjLmlwID0gZ2tyb3V0ZWRfb25seSA/IGh0b25sKDB4RkZGRkZGRkYpIDogMDsKLQlleHAtPm1hc2suc3JjLnUudGNwLnBvcnQgPSAwOwotCWV4cC0+bWFzay5kc3QuaXAgPSBodG9ubCgweEZGRkZGRkZGKTsKLQlleHAtPm1hc2suZHN0LnUudGNwLnBvcnQgPSBodG9ucygweEZGRkYpOwotCWV4cC0+bWFzay5kc3QucHJvdG9udW0gPSAweEZGOwotCWV4cC0+ZmxhZ3MgPSBJUF9DVF9FWFBFQ1RfUEVSTUFORU5UOwkvKiBBY2NlcHQgbXVsdGlwbGUgY2FsbHMgKi8KLQotCW5hdF9xOTMxID0gcmN1X2RlcmVmZXJlbmNlKG5hdF9xOTMxX2hvb2spOwotCWlmIChuYXRfcTkzMSkgewkvKiBOZWVkIE5BVCAqLwotCQlyZXQgPSBuYXRfcTkzMShwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLCBhZGRyLCBpLCBwb3J0LCBleHApOwotCX0gZWxzZSB7CQkvKiBDb25udHJhY2sgb25seSAqLwotCQlleHAtPmV4cGVjdGZuID0gaXBfY29ubnRyYWNrX3E5MzFfZXhwZWN0OwotCi0JCWlmIChpcF9jb25udHJhY2tfZXhwZWN0X3JlbGF0ZWQoZXhwKSA9PSAwKSB7Ci0JCQlERUJVR1AoImlwX2N0X3JhczogZXhwZWN0IFEuOTMxICIKLQkJCSAgICAgICAiJXUuJXUuJXUuJXU6JWh1LT4ldS4ldS4ldS4ldTolaHVcbiIsCi0JCQkgICAgICAgTklQUVVBRChleHAtPnR1cGxlLnNyYy5pcCksCi0JCQkgICAgICAgbnRvaHMoZXhwLT50dXBsZS5zcmMudS50Y3AucG9ydCksCi0JCQkgICAgICAgTklQUVVBRChleHAtPnR1cGxlLmRzdC5pcCksCi0JCQkgICAgICAgbnRvaHMoZXhwLT50dXBsZS5kc3QudS50Y3AucG9ydCkpOwotCi0JCQkvKiBTYXZlIHBvcnQgZm9yIGxvb2tpbmcgdXAgZXhwZWN0IGluIHByb2Nlc3NpbmcgUkNGICovCi0JCQlpbmZvLT5zaWdfcG9ydFtkaXJdID0gcG9ydDsKLQkJfSBlbHNlCi0JCQlyZXQgPSAtMTsKLQl9Ci0KLQlpcF9jb25udHJhY2tfZXhwZWN0X3B1dChleHApOwotCi0JcmV0dXJuIHJldDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IHByb2Nlc3NfZ3JxKHN0cnVjdCBza19idWZmICoqcHNrYiwgc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsCi0JCSAgICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKLQkJICAgICAgIHVuc2lnbmVkIGNoYXIgKipkYXRhLCBHYXRla2VlcGVyUmVxdWVzdCAqIGdycSkKLXsKLQl0eXBlb2Yoc2V0X3Jhc19hZGRyX2hvb2spIHNldF9yYXNfYWRkcjsKLQotCURFQlVHUCgiaXBfY3RfcmFzOiBHUlFcbiIpOwotCi0Jc2V0X3Jhc19hZGRyID0gcmN1X2RlcmVmZXJlbmNlKHNldF9yYXNfYWRkcl9ob29rKTsKLQlpZiAoc2V0X3Jhc19hZGRyKQkvKiBOQVRlZCAqLwotCQlyZXR1cm4gc2V0X3Jhc19hZGRyKHBza2IsIGN0LCBjdGluZm8sIGRhdGEsCi0JCQkJICAgICZncnEtPnJhc0FkZHJlc3MsIDEpOwotCXJldHVybiAwOwotfQotCi0vKiBEZWNsYXJlIGJlZm9yZSB1c2luZyAqLwotc3RhdGljIHZvaWQgaXBfY29ubnRyYWNrX3Jhc19leHBlY3Qoc3RydWN0IGlwX2Nvbm50cmFjayAqbmV3LAotCQkJCSAgICBzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqdGhpcyk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBwcm9jZXNzX2djZihzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIHN0cnVjdCBpcF9jb25udHJhY2sgKmN0LAotCQkgICAgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCi0JCSAgICAgICB1bnNpZ25lZCBjaGFyICoqZGF0YSwgR2F0ZWtlZXBlckNvbmZpcm0gKiBnY2YpCi17Ci0JaW50IGRpciA9IENUSU5GTzJESVIoY3RpbmZvKTsKLQlpbnQgcmV0ID0gMDsKLQlfX2JlMzIgaXA7Ci0JdV9pbnQxNl90IHBvcnQ7Ci0Jc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmV4cDsKLQotCURFQlVHUCgiaXBfY3RfcmFzOiBHQ0ZcbiIpOwotCi0JaWYgKCFnZXRfaDIyNV9hZGRyKCpkYXRhLCAmZ2NmLT5yYXNBZGRyZXNzLCAmaXAsICZwb3J0KSkKLQkJcmV0dXJuIDA7Ci0KLQkvKiBSZWdpc3RyYXRpb24gcG9ydCBpcyB0aGUgc2FtZSBhcyBkaXNjb3ZlcnkgcG9ydCAqLwotCWlmIChpcCA9PSBjdC0+dHVwbGVoYXNoW2Rpcl0udHVwbGUuc3JjLmlwICYmCi0JICAgIHBvcnQgPT0gbnRvaHMoY3QtPnR1cGxlaGFzaFtkaXJdLnR1cGxlLnNyYy51LnVkcC5wb3J0KSkKLQkJcmV0dXJuIDA7Ci0KLQkvKiBBdm9pZCBSQVMgZXhwZWN0YXRpb24gbG9vcHMuIEEgR0NGIGlzIG5ldmVyIGV4cGVjdGVkLiAqLwotCWlmICh0ZXN0X2JpdChJUFNfRVhQRUNURURfQklULCAmY3QtPnN0YXR1cykpCi0JCXJldHVybiAwOwotCi0JLyogTmVlZCBuZXcgZXhwZWN0ICovCi0JaWYgKChleHAgPSBpcF9jb25udHJhY2tfZXhwZWN0X2FsbG9jKGN0KSkgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCWV4cC0+dHVwbGUuc3JjLmlwID0gY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5zcmMuaXA7Ci0JZXhwLT50dXBsZS5zcmMudS50Y3AucG9ydCA9IDA7Ci0JZXhwLT50dXBsZS5kc3QuaXAgPSBpcDsKLQlleHAtPnR1cGxlLmRzdC51LnRjcC5wb3J0ID0gaHRvbnMocG9ydCk7Ci0JZXhwLT50dXBsZS5kc3QucHJvdG9udW0gPSBJUFBST1RPX1VEUDsKLQlleHAtPm1hc2suc3JjLmlwID0gaHRvbmwoMHhGRkZGRkZGRik7Ci0JZXhwLT5tYXNrLnNyYy51LnRjcC5wb3J0ID0gMDsKLQlleHAtPm1hc2suZHN0LmlwID0gaHRvbmwoMHhGRkZGRkZGRik7Ci0JZXhwLT5tYXNrLmRzdC51LnRjcC5wb3J0ID0gaHRvbnMoMHhGRkZGKTsKLQlleHAtPm1hc2suZHN0LnByb3RvbnVtID0gMHhGRjsKLQlleHAtPmZsYWdzID0gMDsKLQlleHAtPmV4cGVjdGZuID0gaXBfY29ubnRyYWNrX3Jhc19leHBlY3Q7Ci0JaWYgKGlwX2Nvbm50cmFja19leHBlY3RfcmVsYXRlZChleHApID09IDApIHsKLQkJREVCVUdQKCJpcF9jdF9yYXM6IGV4cGVjdCBSQVMgIgotCQkgICAgICAgIiV1LiV1LiV1LiV1OiVodS0+JXUuJXUuJXUuJXU6JWh1XG4iLAotCQkgICAgICAgTklQUVVBRChleHAtPnR1cGxlLnNyYy5pcCksCi0JCSAgICAgICBudG9ocyhleHAtPnR1cGxlLnNyYy51LnRjcC5wb3J0KSwKLQkJICAgICAgIE5JUFFVQUQoZXhwLT50dXBsZS5kc3QuaXApLAotCQkgICAgICAgbnRvaHMoZXhwLT50dXBsZS5kc3QudS50Y3AucG9ydCkpOwotCX0gZWxzZQotCQlyZXQgPSAtMTsKLQotCWlwX2Nvbm50cmFja19leHBlY3RfcHV0KGV4cCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgcHJvY2Vzc19ycnEoc3RydWN0IHNrX2J1ZmYgKipwc2tiLCBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKLQkJICAgICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAotCQkgICAgICAgdW5zaWduZWQgY2hhciAqKmRhdGEsIFJlZ2lzdHJhdGlvblJlcXVlc3QgKiBycnEpCi17Ci0Jc3RydWN0IGlwX2N0X2gzMjNfbWFzdGVyICppbmZvID0gJmN0LT5oZWxwLmN0X2gzMjNfaW5mbzsKLQlpbnQgcmV0OwotCXR5cGVvZihzZXRfcmFzX2FkZHJfaG9vaykgc2V0X3Jhc19hZGRyOwotCi0JREVCVUdQKCJpcF9jdF9yYXM6IFJSUVxuIik7Ci0KLQlyZXQgPSBleHBlY3RfcTkzMShwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLAotCQkJICBycnEtPmNhbGxTaWduYWxBZGRyZXNzLml0ZW0sCi0JCQkgIHJycS0+Y2FsbFNpZ25hbEFkZHJlc3MuY291bnQpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gLTE7Ci0KLQlzZXRfcmFzX2FkZHIgPSByY3VfZGVyZWZlcmVuY2Uoc2V0X3Jhc19hZGRyX2hvb2spOwotCWlmIChzZXRfcmFzX2FkZHIpIHsKLQkJcmV0ID0gc2V0X3Jhc19hZGRyKHBza2IsIGN0LCBjdGluZm8sIGRhdGEsCi0JCQkJICAgcnJxLT5yYXNBZGRyZXNzLml0ZW0sCi0JCQkJICAgcnJxLT5yYXNBZGRyZXNzLmNvdW50KTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gLTE7Ci0JfQotCi0JaWYgKHJycS0+b3B0aW9ucyAmIGVSZWdpc3RyYXRpb25SZXF1ZXN0X3RpbWVUb0xpdmUpIHsKLQkJREVCVUdQKCJpcF9jdF9yYXM6IFJSUSBUVEwgPSAldSBzZWNvbmRzXG4iLCBycnEtPnRpbWVUb0xpdmUpOwotCQlpbmZvLT50aW1lb3V0ID0gcnJxLT50aW1lVG9MaXZlOwotCX0gZWxzZQotCQlpbmZvLT50aW1lb3V0ID0gZGVmYXVsdF9ycnFfdHRsOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBwcm9jZXNzX3JjZihzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIHN0cnVjdCBpcF9jb25udHJhY2sgKmN0LAotCQkgICAgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCi0JCSAgICAgICB1bnNpZ25lZCBjaGFyICoqZGF0YSwgUmVnaXN0cmF0aW9uQ29uZmlybSAqIHJjZikKLXsKLQlzdHJ1Y3QgaXBfY3RfaDMyM19tYXN0ZXIgKmluZm8gPSAmY3QtPmhlbHAuY3RfaDMyM19pbmZvOwotCWludCBkaXIgPSBDVElORk8yRElSKGN0aW5mbyk7Ci0JaW50IHJldDsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqZXhwOwotCXR5cGVvZihzZXRfc2lnX2FkZHJfaG9vaykgc2V0X3NpZ19hZGRyOwotCi0JREVCVUdQKCJpcF9jdF9yYXM6IFJDRlxuIik7Ci0KLQlzZXRfc2lnX2FkZHIgPSByY3VfZGVyZWZlcmVuY2Uoc2V0X3NpZ19hZGRyX2hvb2spOwotCWlmIChzZXRfc2lnX2FkZHIpIHsKLQkJcmV0ID0gc2V0X3NpZ19hZGRyKHBza2IsIGN0LCBjdGluZm8sIGRhdGEsCi0JCQkJICAgcmNmLT5jYWxsU2lnbmFsQWRkcmVzcy5pdGVtLAotCQkJCSAgIHJjZi0+Y2FsbFNpZ25hbEFkZHJlc3MuY291bnQpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiAtMTsKLQl9Ci0KLQlpZiAocmNmLT5vcHRpb25zICYgZVJlZ2lzdHJhdGlvbkNvbmZpcm1fdGltZVRvTGl2ZSkgewotCQlERUJVR1AoImlwX2N0X3JhczogUkNGIFRUTCA9ICV1IHNlY29uZHNcbiIsIHJjZi0+dGltZVRvTGl2ZSk7Ci0JCWluZm8tPnRpbWVvdXQgPSByY2YtPnRpbWVUb0xpdmU7Ci0JfQotCi0JaWYgKGluZm8tPnRpbWVvdXQgPiAwKSB7Ci0JCURFQlVHUAotCQkgICAgKCJpcF9jdF9yYXM6IHNldCBSQVMgY29ubmVjdGlvbiB0aW1lb3V0IHRvICV1IHNlY29uZHNcbiIsCi0JCSAgICAgaW5mby0+dGltZW91dCk7Ci0JCWlwX2N0X3JlZnJlc2goY3QsICpwc2tiLCBpbmZvLT50aW1lb3V0ICogSFopOwotCi0JCS8qIFNldCBleHBlY3QgdGltZW91dCAqLwotCQlyZWFkX2xvY2tfYmgoJmlwX2Nvbm50cmFja19sb2NrKTsKLQkJZXhwID0gZmluZF9leHBlY3QoY3QsIGN0LT50dXBsZWhhc2hbZGlyXS50dXBsZS5kc3QuaXAsCi0JCQkJICBpbmZvLT5zaWdfcG9ydFshZGlyXSk7Ci0JCWlmIChleHApIHsKLQkJCURFQlVHUCgiaXBfY3RfcmFzOiBzZXQgUS45MzEgZXhwZWN0ICIKLQkJCSAgICAgICAiKCV1LiV1LiV1LiV1OiVodS0+JXUuJXUuJXUuJXU6JWh1KSAiCi0JCQkgICAgICAgInRpbWVvdXQgdG8gJXUgc2Vjb25kc1xuIiwKLQkJCSAgICAgICBOSVBRVUFEKGV4cC0+dHVwbGUuc3JjLmlwKSwKLQkJCSAgICAgICBudG9ocyhleHAtPnR1cGxlLnNyYy51LnRjcC5wb3J0KSwKLQkJCSAgICAgICBOSVBRVUFEKGV4cC0+dHVwbGUuZHN0LmlwKSwKLQkJCSAgICAgICBudG9ocyhleHAtPnR1cGxlLmRzdC51LnRjcC5wb3J0KSwKLQkJCSAgICAgICBpbmZvLT50aW1lb3V0KTsKLQkJCXNldF9leHBlY3RfdGltZW91dChleHAsIGluZm8tPnRpbWVvdXQpOwotCQl9Ci0JCXJlYWRfdW5sb2NrX2JoKCZpcF9jb25udHJhY2tfbG9jayk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBwcm9jZXNzX3VycShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIHN0cnVjdCBpcF9jb25udHJhY2sgKmN0LAotCQkgICAgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCi0JCSAgICAgICB1bnNpZ25lZCBjaGFyICoqZGF0YSwgVW5yZWdpc3RyYXRpb25SZXF1ZXN0ICogdXJxKQotewotCXN0cnVjdCBpcF9jdF9oMzIzX21hc3RlciAqaW5mbyA9ICZjdC0+aGVscC5jdF9oMzIzX2luZm87Ci0JaW50IGRpciA9IENUSU5GTzJESVIoY3RpbmZvKTsKLQlpbnQgcmV0OwotCXR5cGVvZihzZXRfc2lnX2FkZHJfaG9vaykgc2V0X3NpZ19hZGRyOwotCi0JREVCVUdQKCJpcF9jdF9yYXM6IFVSUVxuIik7Ci0KLQlzZXRfc2lnX2FkZHIgPSByY3VfZGVyZWZlcmVuY2Uoc2V0X3NpZ19hZGRyX2hvb2spOwotCWlmIChzZXRfc2lnX2FkZHIpIHsKLQkJcmV0ID0gc2V0X3NpZ19hZGRyKHBza2IsIGN0LCBjdGluZm8sIGRhdGEsCi0JCQkJICAgdXJxLT5jYWxsU2lnbmFsQWRkcmVzcy5pdGVtLAotCQkJCSAgIHVycS0+Y2FsbFNpZ25hbEFkZHJlc3MuY291bnQpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiAtMTsKLQl9Ci0KLQkvKiBDbGVhciBvbGQgZXhwZWN0ICovCi0JaXBfY3RfcmVtb3ZlX2V4cGVjdGF0aW9ucyhjdCk7Ci0JaW5mby0+c2lnX3BvcnRbZGlyXSA9IDA7Ci0JaW5mby0+c2lnX3BvcnRbIWRpcl0gPSAwOwotCi0JLyogR2l2ZSBpdCAzMCBzZWNvbmRzIGZvciBVQ0Ygb3IgVVJKICovCi0JaXBfY3RfcmVmcmVzaChjdCwgKnBza2IsIDMwICogSFopOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBwcm9jZXNzX2FycShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIHN0cnVjdCBpcF9jb25udHJhY2sgKmN0LAotCQkgICAgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCi0JCSAgICAgICB1bnNpZ25lZCBjaGFyICoqZGF0YSwgQWRtaXNzaW9uUmVxdWVzdCAqIGFycSkKLXsKLQlzdHJ1Y3QgaXBfY3RfaDMyM19tYXN0ZXIgKmluZm8gPSAmY3QtPmhlbHAuY3RfaDMyM19pbmZvOwotCWludCBkaXIgPSBDVElORk8yRElSKGN0aW5mbyk7Ci0JX19iZTMyIGlwOwotCXVfaW50MTZfdCBwb3J0OwotCXR5cGVvZihzZXRfaDIyNV9hZGRyX2hvb2spIHNldF9oMjI1X2FkZHI7Ci0KLQlERUJVR1AoImlwX2N0X3JhczogQVJRXG4iKTsKLQotCXNldF9oMjI1X2FkZHIgPSByY3VfZGVyZWZlcmVuY2Uoc2V0X2gyMjVfYWRkcl9ob29rKTsKLQlpZiAoKGFycS0+b3B0aW9ucyAmIGVBZG1pc3Npb25SZXF1ZXN0X2Rlc3RDYWxsU2lnbmFsQWRkcmVzcykgJiYKLQkgICAgZ2V0X2gyMjVfYWRkcigqZGF0YSwgJmFycS0+ZGVzdENhbGxTaWduYWxBZGRyZXNzLCAmaXAsICZwb3J0KSAmJgotCSAgICBpcCA9PSBjdC0+dHVwbGVoYXNoW2Rpcl0udHVwbGUuc3JjLmlwICYmCi0JICAgIHBvcnQgPT0gaW5mby0+c2lnX3BvcnRbZGlyXSAmJiBzZXRfaDIyNV9hZGRyKSB7Ci0JCS8qIEFuc3dlcmluZyBBUlEgKi8KLQkJcmV0dXJuIHNldF9oMjI1X2FkZHIocHNrYiwgZGF0YSwgMCwKLQkJCQkgICAgICZhcnEtPmRlc3RDYWxsU2lnbmFsQWRkcmVzcywKLQkJCQkgICAgIGN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuZHN0LmlwLAotCQkJCSAgICAgaW5mby0+c2lnX3BvcnRbIWRpcl0pOwotCX0KLQotCWlmICgoYXJxLT5vcHRpb25zICYgZUFkbWlzc2lvblJlcXVlc3Rfc3JjQ2FsbFNpZ25hbEFkZHJlc3MpICYmCi0JICAgIGdldF9oMjI1X2FkZHIoKmRhdGEsICZhcnEtPnNyY0NhbGxTaWduYWxBZGRyZXNzLCAmaXAsICZwb3J0KSAmJgotCSAgICBpcCA9PSBjdC0+dHVwbGVoYXNoW2Rpcl0udHVwbGUuc3JjLmlwICYmIHNldF9oMjI1X2FkZHIpIHsKLQkJLyogQ2FsbGluZyBBUlEgKi8KLQkJcmV0dXJuIHNldF9oMjI1X2FkZHIocHNrYiwgZGF0YSwgMCwKLQkJCQkgICAgICZhcnEtPnNyY0NhbGxTaWduYWxBZGRyZXNzLAotCQkJCSAgICAgY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5kc3QuaXAsCi0JCQkJICAgICBwb3J0KTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IHByb2Nlc3NfYWNmKHN0cnVjdCBza19idWZmICoqcHNrYiwgc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsCi0JCSAgICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKLQkJICAgICAgIHVuc2lnbmVkIGNoYXIgKipkYXRhLCBBZG1pc3Npb25Db25maXJtICogYWNmKQotewotCWludCBkaXIgPSBDVElORk8yRElSKGN0aW5mbyk7Ci0JaW50IHJldCA9IDA7Ci0JX19iZTMyIGlwOwotCXVfaW50MTZfdCBwb3J0OwotCXN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpleHA7Ci0JdHlwZW9mKHNldF9zaWdfYWRkcl9ob29rKSBzZXRfc2lnX2FkZHI7Ci0KLQlERUJVR1AoImlwX2N0X3JhczogQUNGXG4iKTsKLQotCWlmICghZ2V0X2gyMjVfYWRkcigqZGF0YSwgJmFjZi0+ZGVzdENhbGxTaWduYWxBZGRyZXNzLCAmaXAsICZwb3J0KSkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoaXAgPT0gY3QtPnR1cGxlaGFzaFtkaXJdLnR1cGxlLmRzdC5pcCkgewkvKiBBbnN3ZXJpbmcgQUNGICovCi0JCXNldF9zaWdfYWRkciA9IHJjdV9kZXJlZmVyZW5jZShzZXRfc2lnX2FkZHJfaG9vayk7Ci0JCWlmIChzZXRfc2lnX2FkZHIpCi0JCQlyZXR1cm4gc2V0X3NpZ19hZGRyKHBza2IsIGN0LCBjdGluZm8sIGRhdGEsCi0JCQkJCSAgICAmYWNmLT5kZXN0Q2FsbFNpZ25hbEFkZHJlc3MsIDEpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKiBOZWVkIG5ldyBleHBlY3QgKi8KLQlpZiAoKGV4cCA9IGlwX2Nvbm50cmFja19leHBlY3RfYWxsb2MoY3QpKSA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JZXhwLT50dXBsZS5zcmMuaXAgPSBjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLnNyYy5pcDsKLQlleHAtPnR1cGxlLnNyYy51LnRjcC5wb3J0ID0gMDsKLQlleHAtPnR1cGxlLmRzdC5pcCA9IGlwOwotCWV4cC0+dHVwbGUuZHN0LnUudGNwLnBvcnQgPSBodG9ucyhwb3J0KTsKLQlleHAtPnR1cGxlLmRzdC5wcm90b251bSA9IElQUFJPVE9fVENQOwotCWV4cC0+bWFzay5zcmMuaXAgPSBodG9ubCgweEZGRkZGRkZGKTsKLQlleHAtPm1hc2suc3JjLnUudGNwLnBvcnQgPSAwOwotCWV4cC0+bWFzay5kc3QuaXAgPSBodG9ubCgweEZGRkZGRkZGKTsKLQlleHAtPm1hc2suZHN0LnUudGNwLnBvcnQgPSBodG9ucygweEZGRkYpOwotCWV4cC0+bWFzay5kc3QucHJvdG9udW0gPSAweEZGOwotCWV4cC0+ZmxhZ3MgPSBJUF9DVF9FWFBFQ1RfUEVSTUFORU5UOwotCWV4cC0+ZXhwZWN0Zm4gPSBpcF9jb25udHJhY2tfcTkzMV9leHBlY3Q7Ci0KLQlpZiAoaXBfY29ubnRyYWNrX2V4cGVjdF9yZWxhdGVkKGV4cCkgPT0gMCkgewotCQlERUJVR1AoImlwX2N0X3JhczogZXhwZWN0IFEuOTMxICIKLQkJICAgICAgICIldS4ldS4ldS4ldTolaHUtPiV1LiV1LiV1LiV1OiVodVxuIiwKLQkJICAgICAgIE5JUFFVQUQoZXhwLT50dXBsZS5zcmMuaXApLAotCQkgICAgICAgbnRvaHMoZXhwLT50dXBsZS5zcmMudS50Y3AucG9ydCksCi0JCSAgICAgICBOSVBRVUFEKGV4cC0+dHVwbGUuZHN0LmlwKSwKLQkJICAgICAgIG50b2hzKGV4cC0+dHVwbGUuZHN0LnUudGNwLnBvcnQpKTsKLQl9IGVsc2UKLQkJcmV0ID0gLTE7Ci0KLQlpcF9jb25udHJhY2tfZXhwZWN0X3B1dChleHApOwotCi0JcmV0dXJuIHJldDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IHByb2Nlc3NfbHJxKHN0cnVjdCBza19idWZmICoqcHNrYiwgc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsCi0JCSAgICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKLQkJICAgICAgIHVuc2lnbmVkIGNoYXIgKipkYXRhLCBMb2NhdGlvblJlcXVlc3QgKiBscnEpCi17Ci0JdHlwZW9mKHNldF9yYXNfYWRkcl9ob29rKSBzZXRfcmFzX2FkZHI7Ci0KLQlERUJVR1AoImlwX2N0X3JhczogTFJRXG4iKTsKLQotCXNldF9yYXNfYWRkciA9IHJjdV9kZXJlZmVyZW5jZShzZXRfcmFzX2FkZHJfaG9vayk7Ci0JaWYgKHNldF9yYXNfYWRkcikKLQkJcmV0dXJuIHNldF9yYXNfYWRkcihwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLAotCQkJCSAgICAmbHJxLT5yZXBseUFkZHJlc3MsIDEpOwotCXJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgcHJvY2Vzc19sY2Yoc3RydWN0IHNrX2J1ZmYgKipwc2tiLCBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKLQkJICAgICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAotCQkgICAgICAgdW5zaWduZWQgY2hhciAqKmRhdGEsIExvY2F0aW9uQ29uZmlybSAqIGxjZikKLXsKLQlpbnQgZGlyID0gQ1RJTkZPMkRJUihjdGluZm8pOwotCWludCByZXQgPSAwOwotCV9fYmUzMiBpcDsKLQl1X2ludDE2X3QgcG9ydDsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqZXhwID0gTlVMTDsKLQotCURFQlVHUCgiaXBfY3RfcmFzOiBMQ0ZcbiIpOwotCi0JaWYgKCFnZXRfaDIyNV9hZGRyKCpkYXRhLCAmbGNmLT5jYWxsU2lnbmFsQWRkcmVzcywgJmlwLCAmcG9ydCkpCi0JCXJldHVybiAwOwotCi0JLyogTmVlZCBuZXcgZXhwZWN0IGZvciBjYWxsIHNpZ25hbCAqLwotCWlmICgoZXhwID0gaXBfY29ubnRyYWNrX2V4cGVjdF9hbGxvYyhjdCkpID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlleHAtPnR1cGxlLnNyYy5pcCA9IGN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuc3JjLmlwOwotCWV4cC0+dHVwbGUuc3JjLnUudGNwLnBvcnQgPSAwOwotCWV4cC0+dHVwbGUuZHN0LmlwID0gaXA7Ci0JZXhwLT50dXBsZS5kc3QudS50Y3AucG9ydCA9IGh0b25zKHBvcnQpOwotCWV4cC0+dHVwbGUuZHN0LnByb3RvbnVtID0gSVBQUk9UT19UQ1A7Ci0JZXhwLT5tYXNrLnNyYy5pcCA9IGh0b25sKDB4RkZGRkZGRkYpOwotCWV4cC0+bWFzay5zcmMudS50Y3AucG9ydCA9IDA7Ci0JZXhwLT5tYXNrLmRzdC5pcCA9IGh0b25sKDB4RkZGRkZGRkYpOwotCWV4cC0+bWFzay5kc3QudS50Y3AucG9ydCA9IGh0b25zKDB4RkZGRik7Ci0JZXhwLT5tYXNrLmRzdC5wcm90b251bSA9IDB4RkY7Ci0JZXhwLT5mbGFncyA9IElQX0NUX0VYUEVDVF9QRVJNQU5FTlQ7Ci0JZXhwLT5leHBlY3RmbiA9IGlwX2Nvbm50cmFja19xOTMxX2V4cGVjdDsKLQotCWlmIChpcF9jb25udHJhY2tfZXhwZWN0X3JlbGF0ZWQoZXhwKSA9PSAwKSB7Ci0JCURFQlVHUCgiaXBfY3RfcmFzOiBleHBlY3QgUS45MzEgIgotCQkgICAgICAgIiV1LiV1LiV1LiV1OiVodS0+JXUuJXUuJXUuJXU6JWh1XG4iLAotCQkgICAgICAgTklQUVVBRChleHAtPnR1cGxlLnNyYy5pcCksCi0JCSAgICAgICBudG9ocyhleHAtPnR1cGxlLnNyYy51LnRjcC5wb3J0KSwKLQkJICAgICAgIE5JUFFVQUQoZXhwLT50dXBsZS5kc3QuaXApLAotCQkgICAgICAgbnRvaHMoZXhwLT50dXBsZS5kc3QudS50Y3AucG9ydCkpOwotCX0gZWxzZQotCQlyZXQgPSAtMTsKLQotCWlwX2Nvbm50cmFja19leHBlY3RfcHV0KGV4cCk7Ci0KLQkvKiBJZ25vcmUgcmFzQWRkcmVzcyAqLwotCi0JcmV0dXJuIHJldDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IHByb2Nlc3NfaXJyKHN0cnVjdCBza19idWZmICoqcHNrYiwgc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsCi0JCSAgICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKLQkJICAgICAgIHVuc2lnbmVkIGNoYXIgKipkYXRhLCBJbmZvUmVxdWVzdFJlc3BvbnNlICogaXJyKQotewotCWludCByZXQ7Ci0JdHlwZW9mKHNldF9yYXNfYWRkcl9ob29rKSBzZXRfcmFzX2FkZHI7Ci0JdHlwZW9mKHNldF9zaWdfYWRkcl9ob29rKSBzZXRfc2lnX2FkZHI7Ci0KLQlERUJVR1AoImlwX2N0X3JhczogSVJSXG4iKTsKLQotCXNldF9yYXNfYWRkciA9IHJjdV9kZXJlZmVyZW5jZShzZXRfcmFzX2FkZHJfaG9vayk7Ci0JaWYgKHNldF9yYXNfYWRkcikgewotCQlyZXQgPSBzZXRfcmFzX2FkZHIocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwKLQkJCQkgICAmaXJyLT5yYXNBZGRyZXNzLCAxKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gLTE7Ci0JfQotCi0Jc2V0X3NpZ19hZGRyID0gcmN1X2RlcmVmZXJlbmNlKHNldF9zaWdfYWRkcl9ob29rKTsKLQlpZiAoc2V0X3NpZ19hZGRyKSB7Ci0JCXJldCA9IHNldF9zaWdfYWRkcihwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLAotCQkJCSAgIGlyci0+Y2FsbFNpZ25hbEFkZHJlc3MuaXRlbSwKLQkJCQkgICBpcnItPmNhbGxTaWduYWxBZGRyZXNzLmNvdW50KTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gLTE7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBwcm9jZXNzX3JhcyhzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIHN0cnVjdCBpcF9jb25udHJhY2sgKmN0LAotCQkgICAgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCi0JCSAgICAgICB1bnNpZ25lZCBjaGFyICoqZGF0YSwgUmFzTWVzc2FnZSAqIHJhcykKLXsKLQlzd2l0Y2ggKHJhcy0+Y2hvaWNlKSB7Ci0JY2FzZSBlUmFzTWVzc2FnZV9nYXRla2VlcGVyUmVxdWVzdDoKLQkJcmV0dXJuIHByb2Nlc3NfZ3JxKHBza2IsIGN0LCBjdGluZm8sIGRhdGEsCi0JCQkJICAgJnJhcy0+Z2F0ZWtlZXBlclJlcXVlc3QpOwotCWNhc2UgZVJhc01lc3NhZ2VfZ2F0ZWtlZXBlckNvbmZpcm06Ci0JCXJldHVybiBwcm9jZXNzX2djZihwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLAotCQkJCSAgICZyYXMtPmdhdGVrZWVwZXJDb25maXJtKTsKLQljYXNlIGVSYXNNZXNzYWdlX3JlZ2lzdHJhdGlvblJlcXVlc3Q6Ci0JCXJldHVybiBwcm9jZXNzX3JycShwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLAotCQkJCSAgICZyYXMtPnJlZ2lzdHJhdGlvblJlcXVlc3QpOwotCWNhc2UgZVJhc01lc3NhZ2VfcmVnaXN0cmF0aW9uQ29uZmlybToKLQkJcmV0dXJuIHByb2Nlc3NfcmNmKHBza2IsIGN0LCBjdGluZm8sIGRhdGEsCi0JCQkJICAgJnJhcy0+cmVnaXN0cmF0aW9uQ29uZmlybSk7Ci0JY2FzZSBlUmFzTWVzc2FnZV91bnJlZ2lzdHJhdGlvblJlcXVlc3Q6Ci0JCXJldHVybiBwcm9jZXNzX3VycShwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLAotCQkJCSAgICZyYXMtPnVucmVnaXN0cmF0aW9uUmVxdWVzdCk7Ci0JY2FzZSBlUmFzTWVzc2FnZV9hZG1pc3Npb25SZXF1ZXN0OgotCQlyZXR1cm4gcHJvY2Vzc19hcnEocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwKLQkJCQkgICAmcmFzLT5hZG1pc3Npb25SZXF1ZXN0KTsKLQljYXNlIGVSYXNNZXNzYWdlX2FkbWlzc2lvbkNvbmZpcm06Ci0JCXJldHVybiBwcm9jZXNzX2FjZihwc2tiLCBjdCwgY3RpbmZvLCBkYXRhLAotCQkJCSAgICZyYXMtPmFkbWlzc2lvbkNvbmZpcm0pOwotCWNhc2UgZVJhc01lc3NhZ2VfbG9jYXRpb25SZXF1ZXN0OgotCQlyZXR1cm4gcHJvY2Vzc19scnEocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwKLQkJCQkgICAmcmFzLT5sb2NhdGlvblJlcXVlc3QpOwotCWNhc2UgZVJhc01lc3NhZ2VfbG9jYXRpb25Db25maXJtOgotCQlyZXR1cm4gcHJvY2Vzc19sY2YocHNrYiwgY3QsIGN0aW5mbywgZGF0YSwKLQkJCQkgICAmcmFzLT5sb2NhdGlvbkNvbmZpcm0pOwotCWNhc2UgZVJhc01lc3NhZ2VfaW5mb1JlcXVlc3RSZXNwb25zZToKLQkJcmV0dXJuIHByb2Nlc3NfaXJyKHBza2IsIGN0LCBjdGluZm8sIGRhdGEsCi0JCQkJICAgJnJhcy0+aW5mb1JlcXVlc3RSZXNwb25zZSk7Ci0JZGVmYXVsdDoKLQkJREVCVUdQKCJpcF9jdF9yYXM6IFJBUyBtZXNzYWdlICVkXG4iLCByYXMtPmNob2ljZSk7Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgcmFzX2hlbHAoc3RydWN0IHNrX2J1ZmYgKipwc2tiLCBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKLQkJICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvKQotewotCXN0YXRpYyBSYXNNZXNzYWdlIHJhczsKLQl1bnNpZ25lZCBjaGFyICpkYXRhOwotCWludCBkYXRhbGVuID0gMDsKLQlpbnQgcmV0OwotCi0JREVCVUdQKCJpcF9jdF9yYXM6IHNrYmxlbiA9ICV1XG4iLCAoKnBza2IpLT5sZW4pOwotCi0Jc3Bpbl9sb2NrX2JoKCZpcF9oMzIzX2xvY2spOwotCi0JLyogR2V0IFVEUCBkYXRhICovCi0JZGF0YSA9IGdldF91ZHBfZGF0YShwc2tiLCAmZGF0YWxlbik7Ci0JaWYgKGRhdGEgPT0gTlVMTCkKLQkJZ290byBhY2NlcHQ7Ci0JREVCVUdQKCJpcF9jdF9yYXM6IFJBUyBtZXNzYWdlICV1LiV1LiV1LiV1LT4ldS4ldS4ldS4ldSwgbGVuPSVkXG4iLAotCSAgICAgICBOSVBRVUFEKCgqcHNrYiktPm5oLmlwaC0+c2FkZHIpLAotCSAgICAgICBOSVBRVUFEKCgqcHNrYiktPm5oLmlwaC0+ZGFkZHIpLCBkYXRhbGVuKTsKLQotCS8qIERlY29kZSBSQVMgbWVzc2FnZSAqLwotCXJldCA9IERlY29kZVJhc01lc3NhZ2UoZGF0YSwgZGF0YWxlbiwgJnJhcyk7Ci0JaWYgKHJldCA8IDApIHsKLQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKLQkJCXByaW50aygiaXBfY3RfcmFzOiBkZWNvZGluZyBlcnJvcjogJXNcbiIsCi0JCQkgICAgICAgcmV0ID09IEgzMjNfRVJST1JfQk9VTkQgPwotCQkJICAgICAgICJvdXQgb2YgYm91bmQiIDogIm91dCBvZiByYW5nZSIpOwotCQlnb3RvIGFjY2VwdDsKLQl9Ci0KLQkvKiBQcm9jZXNzIFJBUyBtZXNzYWdlICovCi0JaWYgKHByb2Nlc3NfcmFzKHBza2IsIGN0LCBjdGluZm8sICZkYXRhLCAmcmFzKSA8IDApCi0JCWdvdG8gZHJvcDsKLQotICAgICAgYWNjZXB0OgotCXNwaW5fdW5sb2NrX2JoKCZpcF9oMzIzX2xvY2spOwotCXJldHVybiBORl9BQ0NFUFQ7Ci0KLSAgICAgIGRyb3A6Ci0Jc3Bpbl91bmxvY2tfYmgoJmlwX2gzMjNfbG9jayk7Ci0JaWYgKG5ldF9yYXRlbGltaXQoKSkKLQkJcHJpbnRrKCJpcF9jdF9yYXM6IHBhY2tldCBkcm9wcGVkXG4iKTsKLQlyZXR1cm4gTkZfRFJPUDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgc3RydWN0IGlwX2Nvbm50cmFja19oZWxwZXIgaXBfY29ubnRyYWNrX2hlbHBlcl9yYXMgPSB7Ci0JLm5hbWUgPSAiUkFTIiwKLQkubWUgPSBUSElTX01PRFVMRSwKLQkubWF4X2V4cGVjdGVkID0gMzIsCi0JLnRpbWVvdXQgPSAyNDAsCi0JLnR1cGxlID0gey5zcmMgPSB7LnUgPSB7LnRjcCA9IHsucG9ydCA9IF9fY29uc3RhbnRfaHRvbnMoUkFTX1BPUlQpfX19LAotCQkgIC5kc3QgPSB7LnByb3RvbnVtID0gSVBQUk9UT19VRFB9fSwKLQkubWFzayA9IHsuc3JjID0gey51ID0gezB4RkZGRX19LAotCQkgLmRzdCA9IHsucHJvdG9udW0gPSAweEZGfX0sCi0JLmhlbHAgPSByYXNfaGVscCwKLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgaXBfY29ubnRyYWNrX3Jhc19leHBlY3Qoc3RydWN0IGlwX2Nvbm50cmFjayAqbmV3LAotCQkJCSAgICBzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqdGhpcykKLXsKLQl3cml0ZV9sb2NrX2JoKCZpcF9jb25udHJhY2tfbG9jayk7Ci0JbmV3LT5oZWxwZXIgPSAmaXBfY29ubnRyYWNrX2hlbHBlcl9yYXM7Ci0Jd3JpdGVfdW5sb2NrX2JoKCZpcF9jb25udHJhY2tfbG9jayk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogTm90IF9fZXhpdCAtIGNhbGxlZCBmcm9tIGluaXQoKSAqLwotc3RhdGljIHZvaWQgZmluaSh2b2lkKQotewotCWlwX2Nvbm50cmFja19oZWxwZXJfdW5yZWdpc3RlcigmaXBfY29ubnRyYWNrX2hlbHBlcl9yYXMpOwotCWlwX2Nvbm50cmFja19oZWxwZXJfdW5yZWdpc3RlcigmaXBfY29ubnRyYWNrX2hlbHBlcl9xOTMxKTsKLQlrZnJlZShoMzIzX2J1ZmZlcik7Ci0JREVCVUdQKCJpcF9jdF9oMzIzOiBmaW5pXG4iKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCi17Ci0JaW50IHJldDsKLQotCWgzMjNfYnVmZmVyID0ga21hbGxvYyg2NTUzNiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFoMzIzX2J1ZmZlcikKLQkJcmV0dXJuIC1FTk9NRU07Ci0JaWYgKChyZXQgPSBpcF9jb25udHJhY2tfaGVscGVyX3JlZ2lzdGVyKCZpcF9jb25udHJhY2tfaGVscGVyX3E5MzEpKSB8fAotCSAgICAocmV0ID0gaXBfY29ubnRyYWNrX2hlbHBlcl9yZWdpc3RlcigmaXBfY29ubnRyYWNrX2hlbHBlcl9yYXMpKSkgewotCQlmaW5pKCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCURFQlVHUCgiaXBfY3RfaDMyMzogaW5pdCBzdWNjZXNzXG4iKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1tb2R1bGVfaW5pdChpbml0KTsKLW1vZHVsZV9leGl0KGZpbmkpOwotCi1FWFBPUlRfU1lNQk9MX0dQTChnZXRfaDIyNV9hZGRyKTsKLUVYUE9SVF9TWU1CT0xfR1BMKGlwX2Nvbm50cmFja19oMjQ1X2V4cGVjdCk7Ci1FWFBPUlRfU1lNQk9MX0dQTChpcF9jb25udHJhY2tfcTkzMV9leHBlY3QpOwotRVhQT1JUX1NZTUJPTF9HUEwoc2V0X2gyNDVfYWRkcl9ob29rKTsKLUVYUE9SVF9TWU1CT0xfR1BMKHNldF9oMjI1X2FkZHJfaG9vayk7Ci1FWFBPUlRfU1lNQk9MX0dQTChzZXRfc2lnX2FkZHJfaG9vayk7Ci1FWFBPUlRfU1lNQk9MX0dQTChzZXRfcmFzX2FkZHJfaG9vayk7Ci1FWFBPUlRfU1lNQk9MX0dQTChuYXRfcnRwX3J0Y3BfaG9vayk7Ci1FWFBPUlRfU1lNQk9MX0dQTChuYXRfdDEyMF9ob29rKTsKLUVYUE9SVF9TWU1CT0xfR1BMKG5hdF9oMjQ1X2hvb2spOwotRVhQT1JUX1NZTUJPTF9HUEwobmF0X2NhbGxmb3J3YXJkaW5nX2hvb2spOwotRVhQT1JUX1NZTUJPTF9HUEwobmF0X3E5MzFfaG9vayk7Ci0KLU1PRFVMRV9BVVRIT1IoIkppbmcgTWluIFpoYW8gPHpoYW9qaW5nbWluQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiSC4zMjMgY29ubmVjdGlvbiB0cmFja2luZyBoZWxwZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfaGVscGVyX3BwdHAuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfaGVscGVyX3BwdHAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI3NjBjNS4uMDAwMDAwMAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX2hlbHBlcl9wcHRwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2ODQgKzAsMCBAQAotLyoKLSAqIGlwX2Nvbm50cmFja19wcHRwLmMJLSBWZXJzaW9uIDMuMAotICoKLSAqIENvbm5lY3Rpb24gdHJhY2tpbmcgc3VwcG9ydCBmb3IgUFBUUCAoUG9pbnQgdG8gUG9pbnQgVHVubmVsaW5nIFByb3RvY29sKS4KLSAqIFBQVFAgaXMgYSBhIHByb3RvY29sIGZvciBjcmVhdGluZyB2aXJ0dWFsIHByaXZhdGUgbmV0d29ya3MuCi0gKiBJdCBpcyBhIHNwZWNpZmljYXRpb24gZGVmaW5lZCBieSBNaWNyb3NvZnQgYW5kIHNvbWUgdmVuZG9ycwotICogd29ya2luZyB3aXRoIE1pY3Jvc29mdC4gIFBQVFAgaXMgYnVpbHQgb24gdG9wIG9mIGEgbW9kaWZpZWQKLSAqIHZlcnNpb24gb2YgdGhlIEludGVybmV0IEdlbmVyaWMgUm91dGluZyBFbmNhcHN1bGF0aW9uIFByb3RvY29sLgotICogR1JFIGlzIGRlZmluZWQgaW4gUkZDIDE3MDEgYW5kIFJGQyAxNzAyLiAgRG9jdW1lbnRhdGlvbiBvZgotICogUFBUUCBjYW4gYmUgZm91bmQgaW4gUkZDIDI2MzcKLSAqCi0gKiAoQykgMjAwMC0yMDA1IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+Ci0gKgotICogRGV2ZWxvcG1lbnQgb2YgdGhpcyBjb2RlIGZ1bmRlZCBieSBBc3Rhcm8gQUcgKGh0dHA6Ly93d3cuYXN0YXJvLmNvbS8pCi0gKgotICogTGltaXRhdGlvbnM6Ci0gKiAJIC0gV2UgYmxpbmRseSBhc3N1bWUgdGhhdCBjb250cm9sIGNvbm5lY3Rpb25zIGFyZSBhbHdheXMKLSAqIAkgICBlc3RhYmxpc2hlZCBpbiBQTlMtPlBBQyBkaXJlY3Rpb24uICBUaGlzIGlzIGEgdmlvbGF0aW9uCi0gKiAJICAgb2YgUkZGQzI2NzMKLSAqIAkgLSBXZSBjYW4gb25seSBzdXBwb3J0IG9uZSBzaW5nbGUgY2FsbCB3aXRoaW4gZWFjaCBzZXNzaW9uCi0gKgotICogVE9ETzoKLSAqCSAtIHRlc3Rpbmcgb2YgaW5jb21pbmcgUFBUUCBjYWxscwotICoKLSAqIENoYW5nZXM6Ci0gKiAJMjAwMi0wMi0wNSAtIFZlcnNpb24gMS4zCi0gKiAJICAtIENhbGwgaXBfY29ubnRyYWNrX3VuZXhwZWN0X3JlbGF0ZWQoKSBmcm9tCi0gKiAJICAgIHBwdHBfZGVzdHJveV9zaWJsaW5ncygpIHRvIGRlc3Ryb3kgZXhwZWN0YXRpb25zIGluIGNhc2UKLSAqIAkgICAgQ0FMTF9ESVNDT05ORUNUX05PVElGWSBvciB0Y3AgZmluIHBhY2tldCB3YXMgc2VlbgotICogCSAgICAoUGhpbGlwIENyYWlnIDxwaGlsaXBjQHNuYXBnZWFyLmNvbT4pCi0gKiAJICAtIEFkZCBWZXJzaW9uIGluZm9ybWF0aW9uIGF0IG1vZHVsZSBsb2FkdGltZQotICogCTIwMDItMDItMTAgLSBWZXJzaW9uIDEuNgotICogCSAgLSBtb3ZlIHRvIEM5OSBzdHlsZSBpbml0aWFsaXplcnMKLSAqIAkgIC0gcmVtb3ZlIHNlY29uZCBleHBlY3RhdGlvbiBpZiBmaXJzdCBhcnJpdmVzCi0gKiAJMjAwNC0xMC0yMiAtIFZlcnNpb24gMi4wCi0gKiAJICAtIG1lcmdlIE1hbmRyYWtlJ3MgMi42LnggcG9ydCB3aXRoIHJlY2VudCAyLjYueCBBUEkgY2hhbmdlcwotICogCSAgLSBmaXggbG90cyBvZiBsaW5lYXIgc2tiIGFzc3VtcHRpb25zIGZyb20gTWFuZHJha2UncyBwb3J0Ci0gKiAJMjAwNS0wNi0xMCAtIFZlcnNpb24gMi4xCi0gKiAJICAtIHVzZSBpcF9jb25udHJhY2tfZXhwZWN0X2ZyZWUoKSBpbnN0ZWFkIG9mIGtmcmVlKCkgb24gdGhlCi0gKiAJICAgIGV4cGVjdCdzICh3aGljaCBhcmUgZnJvbSB0aGUgc2xhYiBmb3IgcXVpdGUgc29tZSB0aW1lKQotICogCTIwMDUtMDYtMTAgLSBWZXJzaW9uIDMuMAotICogCSAgLSBwb3J0IGhlbHBlciB0byBwb3N0LTIuNi4xMSBBUEkgY2hhbmdlcywKLSAqIAkgICAgZnVuZGVkIGJ5IE94Y29kYSBOZXRCb3ggQmx1ZSAoaHR0cDovL3d3dy5uZXRib3hibHVlLmNvbS8pCi0gKiAJMjAwNS0wNy0zMCAtIFZlcnNpb24gMy4xCi0gKiAJICAtIHBvcnQgaGVscGVyIHRvIDIuNi4xMyBBUEkgY2hhbmdlcwotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvaXAuaD4KLSNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KLSNpbmNsdWRlIDxuZXQvdGNwLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2suaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfY29yZS5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19oZWxwZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfcHJvdG9fZ3JlLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX3BwdHAuaD4KLQotI2RlZmluZSBJUF9DVF9QUFRQX1ZFUlNJT04gIjMuMSIKLQotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX0FVVEhPUigiSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiTmV0ZmlsdGVyIGNvbm5lY3Rpb24gdHJhY2tpbmcgaGVscGVyIG1vZHVsZSBmb3IgUFBUUCIpOwotCi1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKGlwX3BwdHBfbG9jayk7Ci0KLWludAotKCppcF9uYXRfcHB0cF9ob29rX291dGJvdW5kKShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCi0JCQkgIHN0cnVjdCBpcF9jb25udHJhY2sgKmN0LAotCQkJICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKLQkJCSAgc3RydWN0IFBwdHBDb250cm9sSGVhZGVyICpjdGxoLAotCQkJICB1bmlvbiBwcHRwX2N0cmxfdW5pb24gKnBwdHBSZXEpOwotCi1pbnQKLSgqaXBfbmF0X3BwdHBfaG9va19pbmJvdW5kKShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCi0JCQkgIHN0cnVjdCBpcF9jb25udHJhY2sgKmN0LAotCQkJICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKLQkJCSAgc3RydWN0IFBwdHBDb250cm9sSGVhZGVyICpjdGxoLAotCQkJICB1bmlvbiBwcHRwX2N0cmxfdW5pb24gKnBwdHBSZXEpOwotCi12b2lkCi0oKmlwX25hdF9wcHRwX2hvb2tfZXhwX2dyZSkoc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmV4cGVjdF9vcmlnLAotCQkJICAgIHN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpleHBlY3RfcmVwbHkpOwotCi12b2lkCi0oKmlwX25hdF9wcHRwX2hvb2tfZXhwZWN0Zm4pKHN0cnVjdCBpcF9jb25udHJhY2sgKmN0LAotCQkJICAgICBzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqZXhwKTsKLQotI2lmIDAKLS8qIFBwdHBDb250cm9sTWVzc2FnZVR5cGUgbmFtZXMgKi8KLWNvbnN0IGNoYXIgKnBwdHBfbXNnX25hbWVbXSA9IHsKLQkiVU5LTk9XTl9NRVNTQUdFIiwKLQkiU1RBUlRfU0VTU0lPTl9SRVFVRVNUIiwKLQkiU1RBUlRfU0VTU0lPTl9SRVBMWSIsCi0JIlNUT1BfU0VTU0lPTl9SRVFVRVNUIiwKLQkiU1RPUF9TRVNTSU9OX1JFUExZIiwKLQkiRUNIT19SRVFVRVNUIiwKLQkiRUNIT19SRVBMWSIsCi0JIk9VVF9DQUxMX1JFUVVFU1QiLAotCSJPVVRfQ0FMTF9SRVBMWSIsCi0JIklOX0NBTExfUkVRVUVTVCIsCi0JIklOX0NBTExfUkVQTFkiLAotCSJJTl9DQUxMX0NPTk5FQ1QiLAotCSJDQUxMX0NMRUFSX1JFUVVFU1QiLAotCSJDQUxMX0RJU0NPTk5FQ1RfTk9USUZZIiwKLQkiV0FOX0VSUk9SX05PVElGWSIsCi0JIlNFVF9MSU5LX0lORk8iCi19OwotRVhQT1JUX1NZTUJPTChwcHRwX21zZ19uYW1lKTsKLSNkZWZpbmUgREVCVUdQKGZvcm1hdCwgYXJncy4uLikJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiVzOiAiIGZvcm1hdCwgX19GSUxFX18sIF9fRlVOQ1RJT05fXywgIyMgYXJncykKLSNlbHNlCi0jZGVmaW5lIERFQlVHUChmb3JtYXQsIGFyZ3MuLi4pCi0jZW5kaWYKLQotI2RlZmluZSBTRUNTICpIWgotI2RlZmluZSBNSU5TICogNjAgU0VDUwotI2RlZmluZSBIT1VSUyAqIDYwIE1JTlMKLQotI2RlZmluZSBQUFRQX0dSRV9USU1FT1VUIAkJKDEwIE1JTlMpCi0jZGVmaW5lIFBQVFBfR1JFX1NUUkVBTV9USU1FT1VUIAkoNSBIT1VSUykKLQotc3RhdGljIHZvaWQgcHB0cF9leHBlY3RmbihzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKLQkJCSBzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqZXhwKQotewotCXR5cGVvZihpcF9uYXRfcHB0cF9ob29rX2V4cGVjdGZuKSBpcF9uYXRfcHB0cF9leHBlY3RmbjsKLQotCURFQlVHUCgiaW5jcmVhc2luZyB0aW1lb3V0c1xuIik7Ci0KLQkvKiBpbmNyZWFzZSB0aW1lb3V0IG9mIEdSRSBkYXRhIGNoYW5uZWwgY29ubnRyYWNrIGVudHJ5ICovCi0JY3QtPnByb3RvLmdyZS50aW1lb3V0ID0gUFBUUF9HUkVfVElNRU9VVDsKLQljdC0+cHJvdG8uZ3JlLnN0cmVhbV90aW1lb3V0ID0gUFBUUF9HUkVfU1RSRUFNX1RJTUVPVVQ7Ci0KLQkvKiBDYW4geW91IHNlZSBob3cgcnVzdHkgdGhpcyBjb2RlIGlzLCBjb21wYXJlZCB3aXRoIHRoZSBwcmUtMi42LjExCi0JICogb25lPyBUaGF0J3Mgd2hhdCBoYXBwZW5lZCB0byBteSBzaGlueSBuZXduYXQgb2YgMjAwMiA7KCAtSFcgKi8KLQotCXJjdV9yZWFkX2xvY2soKTsKLQlpcF9uYXRfcHB0cF9leHBlY3RmbiA9IHJjdV9kZXJlZmVyZW5jZShpcF9uYXRfcHB0cF9ob29rX2V4cGVjdGZuKTsKLQlpZiAoIWlwX25hdF9wcHRwX2V4cGVjdGZuKSB7Ci0JCXN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgaW52X3Q7Ci0JCXN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpleHBfb3RoZXI7Ci0KLQkJLyogb2J2aW91c2x5IHRoaXMgdHVwbGUgaW52ZXJzaW9uIG9ubHkgd29ya3MgdW50aWwgeW91IGRvIE5BVCAqLwotCQlpbnZlcnRfdHVwbGVwcigmaW52X3QsICZleHAtPnR1cGxlKTsKLQkJREVCVUdQKCJ0cnlpbmcgdG8gdW5leHBlY3Qgb3RoZXIgZGlyOiAiKTsKLQkJRFVNUF9UVVBMRSgmaW52X3QpOwotCi0JCWV4cF9vdGhlciA9IGlwX2Nvbm50cmFja19leHBlY3RfZmluZF9nZXQoJmludl90KTsKLQkJaWYgKGV4cF9vdGhlcikgewotCQkJLyogZGVsZXRlIG90aGVyIGV4cGVjdGF0aW9uLiAgKi8KLQkJCURFQlVHUCgiZm91bmRcbiIpOwotCQkJaXBfY29ubnRyYWNrX3VuZXhwZWN0X3JlbGF0ZWQoZXhwX290aGVyKTsKLQkJCWlwX2Nvbm50cmFja19leHBlY3RfcHV0KGV4cF9vdGhlcik7Ci0JCX0gZWxzZSB7Ci0JCQlERUJVR1AoIm5vdCBmb3VuZFxuIik7Ci0JCX0KLQl9IGVsc2UgewotCQkvKiB3ZSBuZWVkIG1vcmUgdGhhbiBzaW1wbGUgaW52ZXJzaW9uICovCi0JCWlwX25hdF9wcHRwX2V4cGVjdGZuKGN0LCBleHApOwotCX0KLQlyY3VfcmVhZF91bmxvY2soKTsKLX0KLQotc3RhdGljIGludCBkZXN0cm95X3NpYmxpbmdfb3JfZXhwKGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnQpCi17Ci0Jc3RydWN0IGlwX2Nvbm50cmFja190dXBsZV9oYXNoICpoOwotCXN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpleHA7Ci0KLQlERUJVR1AoInRyeWluZyB0byB0aW1lb3V0IGN0IG9yIGV4cCBmb3IgdHVwbGUgIik7Ci0JRFVNUF9UVVBMRSh0KTsKLQotCWggPSBpcF9jb25udHJhY2tfZmluZF9nZXQodCwgTlVMTCk7Ci0JaWYgKGgpICB7Ci0JCXN0cnVjdCBpcF9jb25udHJhY2sgKnNpYmxpbmcgPSB0dXBsZWhhc2hfdG9fY3RyYWNrKGgpOwotCQlERUJVR1AoInNldHRpbmcgdGltZW91dCBvZiBjb25udHJhY2sgJXAgdG8gMFxuIiwgc2libGluZyk7Ci0JCXNpYmxpbmctPnByb3RvLmdyZS50aW1lb3V0ID0gMDsKLQkJc2libGluZy0+cHJvdG8uZ3JlLnN0cmVhbV90aW1lb3V0ID0gMDsKLQkJaWYgKGRlbF90aW1lcigmc2libGluZy0+dGltZW91dCkpCi0JCQlzaWJsaW5nLT50aW1lb3V0LmZ1bmN0aW9uKCh1bnNpZ25lZCBsb25nKXNpYmxpbmcpOwotCQlpcF9jb25udHJhY2tfcHV0KHNpYmxpbmcpOwotCQlyZXR1cm4gMTsKLQl9IGVsc2UgewotCQlleHAgPSBpcF9jb25udHJhY2tfZXhwZWN0X2ZpbmRfZ2V0KHQpOwotCQlpZiAoZXhwKSB7Ci0JCQlERUJVR1AoInVuZXhwZWN0X3JlbGF0ZWQgb2YgZXhwZWN0ICVwXG4iLCBleHApOwotCQkJaXBfY29ubnRyYWNrX3VuZXhwZWN0X3JlbGF0ZWQoZXhwKTsKLQkJCWlwX2Nvbm50cmFja19leHBlY3RfcHV0KGV4cCk7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCX0KLQotCXJldHVybiAwOwotfQotCi0KLS8qIHRpbWVvdXQgR1JFIGRhdGEgY29ubmVjdGlvbnMgKi8KLXN0YXRpYyB2b2lkIHBwdHBfZGVzdHJveV9zaWJsaW5ncyhzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCkKLXsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlIHQ7Ci0KLQlpcF9jdF9ncmVfa2V5bWFwX2Rlc3Ryb3koY3QpOwotCS8qIFNpbmNlIGN0LT5zaWJsaW5nX2xpc3QgaGFzIGxpdGVyYWxseSBydXN0ZWQgYXdheSBpbiAyLjYuMTEsCi0JICogd2Ugbm93IG5lZWQgYW5vdGhlciB3YXkgdG8gZmluZCBvdXQgYWJvdXQgb3VyIHNpYmxpbmcKLQkgKiBjb250cmFjayBhbmQgZXhwZWN0cy4uLiAtSFcgKi8KLQotCS8qIHRyeSBvcmlnaW5hbCAocG5zLT5wYWMpIHR1cGxlICovCi0JbWVtY3B5KCZ0LCAmY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLCBzaXplb2YodCkpOwotCXQuZHN0LnByb3RvbnVtID0gSVBQUk9UT19HUkU7Ci0JdC5zcmMudS5ncmUua2V5ID0gY3QtPmhlbHAuY3RfcHB0cF9pbmZvLnBuc19jYWxsX2lkOwotCXQuZHN0LnUuZ3JlLmtleSA9IGN0LT5oZWxwLmN0X3BwdHBfaW5mby5wYWNfY2FsbF9pZDsKLQotCWlmICghZGVzdHJveV9zaWJsaW5nX29yX2V4cCgmdCkpCi0JCURFQlVHUCgiZmFpbGVkIHRvIHRpbWVvdXQgb3JpZ2luYWwgcG5zLT5wYWMgY3QvZXhwXG4iKTsKLQotCS8qIHRyeSByZXBseSAocGFjLT5wbnMpIHR1cGxlICovCi0JbWVtY3B5KCZ0LCAmY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlLCBzaXplb2YodCkpOwotCXQuZHN0LnByb3RvbnVtID0gSVBQUk9UT19HUkU7Ci0JdC5zcmMudS5ncmUua2V5ID0gY3QtPmhlbHAuY3RfcHB0cF9pbmZvLnBhY19jYWxsX2lkOwotCXQuZHN0LnUuZ3JlLmtleSA9IGN0LT5oZWxwLmN0X3BwdHBfaW5mby5wbnNfY2FsbF9pZDsKLQotCWlmICghZGVzdHJveV9zaWJsaW5nX29yX2V4cCgmdCkpCi0JCURFQlVHUCgiZmFpbGVkIHRvIHRpbWVvdXQgcmVwbHkgcGFjLT5wbnMgY3QvZXhwXG4iKTsKLX0KLQotLyogZXhwZWN0IEdSRSBjb25uZWN0aW9ucyAoUE5TLT5QQUMgYW5kIFBBQy0+UE5TIGRpcmVjdGlvbikgKi8KLXN0YXRpYyBpbmxpbmUgaW50Ci1leHBfZ3JlKHN0cnVjdCBpcF9jb25udHJhY2sgKmN0LAotCV9fYmUxNiBjYWxsaWQsCi0JX19iZTE2IHBlZXJfY2FsbGlkKQotewotCXN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpleHBfb3JpZywgKmV4cF9yZXBseTsKLQlpbnQgcmV0ID0gMTsKLQl0eXBlb2YoaXBfbmF0X3BwdHBfaG9va19leHBfZ3JlKSBpcF9uYXRfcHB0cF9leHBfZ3JlOwotCi0JZXhwX29yaWcgPSBpcF9jb25udHJhY2tfZXhwZWN0X2FsbG9jKGN0KTsKLQlpZiAoZXhwX29yaWcgPT0gTlVMTCkKLQkJZ290byBvdXQ7Ci0KLQlleHBfcmVwbHkgPSBpcF9jb25udHJhY2tfZXhwZWN0X2FsbG9jKGN0KTsKLQlpZiAoZXhwX3JlcGx5ID09IE5VTEwpCi0JCWdvdG8gb3V0X3B1dF9vcmlnOwotCi0JLyogb3JpZ2luYWwgZGlyZWN0aW9uLCBQTlMtPlBBQyAqLwotCWV4cF9vcmlnLT50dXBsZS5zcmMuaXAgPSBjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUuc3JjLmlwOwotCWV4cF9vcmlnLT50dXBsZS5zcmMudS5ncmUua2V5ID0gcGVlcl9jYWxsaWQ7Ci0JZXhwX29yaWctPnR1cGxlLmRzdC5pcCA9IGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZS5kc3QuaXA7Ci0JZXhwX29yaWctPnR1cGxlLmRzdC51LmdyZS5rZXkgPSBjYWxsaWQ7Ci0JZXhwX29yaWctPnR1cGxlLmRzdC5wcm90b251bSA9IElQUFJPVE9fR1JFOwotCi0JZXhwX29yaWctPm1hc2suc3JjLmlwID0gaHRvbmwoMHhmZmZmZmZmZik7Ci0JZXhwX29yaWctPm1hc2suc3JjLnUuYWxsID0gMDsKLQlleHBfb3JpZy0+bWFzay5kc3QudS5ncmUua2V5ID0gaHRvbnMoMHhmZmZmKTsKLQlleHBfb3JpZy0+bWFzay5kc3QuaXAgPSBodG9ubCgweGZmZmZmZmZmKTsKLQlleHBfb3JpZy0+bWFzay5kc3QucHJvdG9udW0gPSAweGZmOwotCi0JZXhwX29yaWctPm1hc3RlciA9IGN0OwotCWV4cF9vcmlnLT5leHBlY3RmbiA9IHBwdHBfZXhwZWN0Zm47Ci0JZXhwX29yaWctPmZsYWdzID0gMDsKLQotCS8qIGJvdGggZXhwZWN0YXRpb25zIGFyZSBpZGVudGljYWwgYXBhcnQgZnJvbSB0dXBsZSAqLwotCW1lbWNweShleHBfcmVwbHksIGV4cF9vcmlnLCBzaXplb2YoKmV4cF9yZXBseSkpOwotCi0JLyogcmVwbHkgZGlyZWN0aW9uLCBQQUMtPlBOUyAqLwotCWV4cF9yZXBseS0+dHVwbGUuc3JjLmlwID0gY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlLnNyYy5pcDsKLQlleHBfcmVwbHktPnR1cGxlLnNyYy51LmdyZS5rZXkgPSBjYWxsaWQ7Ci0JZXhwX3JlcGx5LT50dXBsZS5kc3QuaXAgPSBjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0udHVwbGUuZHN0LmlwOwotCWV4cF9yZXBseS0+dHVwbGUuZHN0LnUuZ3JlLmtleSA9IHBlZXJfY2FsbGlkOwotCWV4cF9yZXBseS0+dHVwbGUuZHN0LnByb3RvbnVtID0gSVBQUk9UT19HUkU7Ci0KLQlpcF9uYXRfcHB0cF9leHBfZ3JlID0gcmN1X2RlcmVmZXJlbmNlKGlwX25hdF9wcHRwX2hvb2tfZXhwX2dyZSk7Ci0JaWYgKGlwX25hdF9wcHRwX2V4cF9ncmUpCi0JCWlwX25hdF9wcHRwX2V4cF9ncmUoZXhwX29yaWcsIGV4cF9yZXBseSk7Ci0JaWYgKGlwX2Nvbm50cmFja19leHBlY3RfcmVsYXRlZChleHBfb3JpZykgIT0gMCkKLQkJZ290byBvdXRfcHV0X2JvdGg7Ci0JaWYgKGlwX2Nvbm50cmFja19leHBlY3RfcmVsYXRlZChleHBfcmVwbHkpICE9IDApCi0JCWdvdG8gb3V0X3VuZXhwZWN0X29yaWc7Ci0KLQkvKiBBZGQgR1JFIGtleW1hcCBlbnRyaWVzICovCi0JaWYgKGlwX2N0X2dyZV9rZXltYXBfYWRkKGN0LCAmZXhwX29yaWctPnR1cGxlLCAwKSAhPSAwKQotCQlnb3RvIG91dF91bmV4cGVjdF9ib3RoOwotCWlmIChpcF9jdF9ncmVfa2V5bWFwX2FkZChjdCwgJmV4cF9yZXBseS0+dHVwbGUsIDEpICE9IDApIHsKLQkJaXBfY3RfZ3JlX2tleW1hcF9kZXN0cm95KGN0KTsKLQkJZ290byBvdXRfdW5leHBlY3RfYm90aDsKLQl9Ci0JcmV0ID0gMDsKLQotb3V0X3B1dF9ib3RoOgotCWlwX2Nvbm50cmFja19leHBlY3RfcHV0KGV4cF9yZXBseSk7Ci1vdXRfcHV0X29yaWc6Ci0JaXBfY29ubnRyYWNrX2V4cGVjdF9wdXQoZXhwX29yaWcpOwotb3V0OgotCXJldHVybiByZXQ7Ci0KLW91dF91bmV4cGVjdF9ib3RoOgotCWlwX2Nvbm50cmFja191bmV4cGVjdF9yZWxhdGVkKGV4cF9yZXBseSk7Ci1vdXRfdW5leHBlY3Rfb3JpZzoKLQlpcF9jb25udHJhY2tfdW5leHBlY3RfcmVsYXRlZChleHBfb3JpZyk7Ci0JZ290byBvdXRfcHV0X2JvdGg7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1wcHRwX2luYm91bmRfcGt0KHN0cnVjdCBza19idWZmICoqcHNrYiwKLQkJIHN0cnVjdCBQcHRwQ29udHJvbEhlYWRlciAqY3RsaCwKLQkJIHVuaW9uIHBwdHBfY3RybF91bmlvbiAqcHB0cFJlcSwKLQkJIHVuc2lnbmVkIGludCByZXFsZW4sCi0JCSBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKLQkJIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvKQotewotCXN0cnVjdCBpcF9jdF9wcHRwX21hc3RlciAqaW5mbyA9ICZjdC0+aGVscC5jdF9wcHRwX2luZm87Ci0JdV9pbnQxNl90IG1zZzsKLQlfX2JlMTYgY2lkID0gMCwgcGNpZCA9IDA7Ci0JdHlwZW9mKGlwX25hdF9wcHRwX2hvb2tfaW5ib3VuZCkgaXBfbmF0X3BwdHBfaW5ib3VuZDsKLQotCW1zZyA9IG50b2hzKGN0bGgtPm1lc3NhZ2VUeXBlKTsKLQlERUJVR1AoImluYm91bmQgY29udHJvbCBtZXNzYWdlICVzXG4iLCBwcHRwX21zZ19uYW1lW21zZ10pOwotCi0Jc3dpdGNoIChtc2cpIHsKLQljYXNlIFBQVFBfU1RBUlRfU0VTU0lPTl9SRVBMWToKLQkJLyogc2VydmVyIGNvbmZpcm1zIG5ldyBjb250cm9sIHNlc3Npb24gKi8KLQkJaWYgKGluZm8tPnNzdGF0ZSA8IFBQVFBfU0VTU0lPTl9SRVFVRVNURUQpCi0JCQlnb3RvIGludmFsaWQ7Ci0JCWlmIChwcHRwUmVxLT5zcmVwLnJlc3VsdENvZGUgPT0gUFBUUF9TVEFSVF9PSykKLQkJCWluZm8tPnNzdGF0ZSA9IFBQVFBfU0VTU0lPTl9DT05GSVJNRUQ7Ci0JCWVsc2UKLQkJCWluZm8tPnNzdGF0ZSA9IFBQVFBfU0VTU0lPTl9FUlJPUjsKLQkJYnJlYWs7Ci0KLQljYXNlIFBQVFBfU1RPUF9TRVNTSU9OX1JFUExZOgotCQkvKiBzZXJ2ZXIgY29uZmlybXMgZW5kIG9mIGNvbnRyb2wgc2Vzc2lvbiAqLwotCQlpZiAoaW5mby0+c3N0YXRlID4gUFBUUF9TRVNTSU9OX1NUT1BSRVEpCi0JCQlnb3RvIGludmFsaWQ7Ci0JCWlmIChwcHRwUmVxLT5zdHJlcC5yZXN1bHRDb2RlID09IFBQVFBfU1RPUF9PSykKLQkJCWluZm8tPnNzdGF0ZSA9IFBQVFBfU0VTU0lPTl9OT05FOwotCQllbHNlCi0JCQlpbmZvLT5zc3RhdGUgPSBQUFRQX1NFU1NJT05fRVJST1I7Ci0JCWJyZWFrOwotCi0JY2FzZSBQUFRQX09VVF9DQUxMX1JFUExZOgotCQkvKiBzZXJ2ZXIgYWNjZXB0ZWQgY2FsbCwgd2Ugbm93IGV4cGVjdCBHUkUgZnJhbWVzICovCi0JCWlmIChpbmZvLT5zc3RhdGUgIT0gUFBUUF9TRVNTSU9OX0NPTkZJUk1FRCkKLQkJCWdvdG8gaW52YWxpZDsKLQkJaWYgKGluZm8tPmNzdGF0ZSAhPSBQUFRQX0NBTExfT1VUX1JFUSAmJgotCQkgICAgaW5mby0+Y3N0YXRlICE9IFBQVFBfQ0FMTF9PVVRfQ09ORikKLQkJCWdvdG8gaW52YWxpZDsKLQotCQljaWQgPSBwcHRwUmVxLT5vY2Fjay5jYWxsSUQ7Ci0JCXBjaWQgPSBwcHRwUmVxLT5vY2Fjay5wZWVyc0NhbGxJRDsKLQkJaWYgKGluZm8tPnBuc19jYWxsX2lkICE9IHBjaWQpCi0JCQlnb3RvIGludmFsaWQ7Ci0JCURFQlVHUCgiJXMsIENJRD0lWCwgUENJRD0lWFxuIiwgcHB0cF9tc2dfbmFtZVttc2ddLAotCQkJbnRvaHMoY2lkKSwgbnRvaHMocGNpZCkpOwotCi0JCWlmIChwcHRwUmVxLT5vY2Fjay5yZXN1bHRDb2RlID09IFBQVFBfT1VUQ0FMTF9DT05ORUNUKSB7Ci0JCQlpbmZvLT5jc3RhdGUgPSBQUFRQX0NBTExfT1VUX0NPTkY7Ci0JCQlpbmZvLT5wYWNfY2FsbF9pZCA9IGNpZDsKLQkJCWV4cF9ncmUoY3QsIGNpZCwgcGNpZCk7Ci0JCX0gZWxzZQotCQkJaW5mby0+Y3N0YXRlID0gUFBUUF9DQUxMX05PTkU7Ci0JCWJyZWFrOwotCi0JY2FzZSBQUFRQX0lOX0NBTExfUkVRVUVTVDoKLQkJLyogc2VydmVyIHRlbGxzIHVzIGFib3V0IGluY29taW5nIGNhbGwgcmVxdWVzdCAqLwotCQlpZiAoaW5mby0+c3N0YXRlICE9IFBQVFBfU0VTU0lPTl9DT05GSVJNRUQpCi0JCQlnb3RvIGludmFsaWQ7Ci0KLQkJY2lkID0gcHB0cFJlcS0+aWNyZXEuY2FsbElEOwotCQlERUJVR1AoIiVzLCBDSUQ9JVhcbiIsIHBwdHBfbXNnX25hbWVbbXNnXSwgbnRvaHMoY2lkKSk7Ci0JCWluZm8tPmNzdGF0ZSA9IFBQVFBfQ0FMTF9JTl9SRVE7Ci0JCWluZm8tPnBhY19jYWxsX2lkID0gY2lkOwotCQlicmVhazsKLQotCWNhc2UgUFBUUF9JTl9DQUxMX0NPTk5FQ1Q6Ci0JCS8qIHNlcnZlciB0ZWxscyB1cyBhYm91dCBpbmNvbWluZyBjYWxsIGVzdGFibGlzaGVkICovCi0JCWlmIChpbmZvLT5zc3RhdGUgIT0gUFBUUF9TRVNTSU9OX0NPTkZJUk1FRCkKLQkJCWdvdG8gaW52YWxpZDsKLQkJaWYgKGluZm8tPmNzdGF0ZSAhPSBQUFRQX0NBTExfSU5fUkVQICYmCi0JCSAgICBpbmZvLT5jc3RhdGUgIT0gUFBUUF9DQUxMX0lOX0NPTkYpCi0JCQlnb3RvIGludmFsaWQ7Ci0KLQkJcGNpZCA9IHBwdHBSZXEtPmljY29uLnBlZXJzQ2FsbElEOwotCQljaWQgPSBpbmZvLT5wYWNfY2FsbF9pZDsKLQotCQlpZiAoaW5mby0+cG5zX2NhbGxfaWQgIT0gcGNpZCkKLQkJCWdvdG8gaW52YWxpZDsKLQotCQlERUJVR1AoIiVzLCBQQ0lEPSVYXG4iLCBwcHRwX21zZ19uYW1lW21zZ10sIG50b2hzKHBjaWQpKTsKLQkJaW5mby0+Y3N0YXRlID0gUFBUUF9DQUxMX0lOX0NPTkY7Ci0KLQkJLyogd2UgZXhwZWN0IGEgR1JFIGNvbm5lY3Rpb24gZnJvbSBQQUMgdG8gUE5TICovCi0JCWV4cF9ncmUoY3QsIGNpZCwgcGNpZCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBQUFRQX0NBTExfRElTQ09OTkVDVF9OT1RJRlk6Ci0JCS8qIHNlcnZlciBjb25maXJtcyBkaXNjb25uZWN0ICovCi0JCWNpZCA9IHBwdHBSZXEtPmRpc2MuY2FsbElEOwotCQlERUJVR1AoIiVzLCBDSUQ9JVhcbiIsIHBwdHBfbXNnX25hbWVbbXNnXSwgbnRvaHMoY2lkKSk7Ci0JCWluZm8tPmNzdGF0ZSA9IFBQVFBfQ0FMTF9OT05FOwotCi0JCS8qIHVudHJhY2sgdGhpcyBjYWxsIGlkLCB1bmV4cGVjdCBHUkUgcGFja2V0cyAqLwotCQlwcHRwX2Rlc3Ryb3lfc2libGluZ3MoY3QpOwotCQlicmVhazsKLQotCWNhc2UgUFBUUF9XQU5fRVJST1JfTk9USUZZOgotCWNhc2UgUFBUUF9FQ0hPX1JFUVVFU1Q6Ci0JY2FzZSBQUFRQX0VDSE9fUkVQTFk6Ci0JCS8qIEkgZG9uJ3QgaGF2ZSB0byBleHBsYWluIHRoZXNlIDspICovCi0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWdvdG8gaW52YWxpZDsKLQl9Ci0KLQlpcF9uYXRfcHB0cF9pbmJvdW5kID0gcmN1X2RlcmVmZXJlbmNlKGlwX25hdF9wcHRwX2hvb2tfaW5ib3VuZCk7Ci0JaWYgKGlwX25hdF9wcHRwX2luYm91bmQpCi0JCXJldHVybiBpcF9uYXRfcHB0cF9pbmJvdW5kKHBza2IsIGN0LCBjdGluZm8sIGN0bGgsIHBwdHBSZXEpOwotCXJldHVybiBORl9BQ0NFUFQ7Ci0KLWludmFsaWQ6Ci0JREVCVUdQKCJpbnZhbGlkICVzOiB0eXBlPSVkIGNpZD0ldSBwY2lkPSV1ICIKLQkgICAgICAgImNzdGF0ZT0lZCBzc3RhdGU9JWQgcG5zX2NpZD0ldSBwYWNfY2lkPSV1XG4iLAotCSAgICAgICBtc2cgPD0gUFBUUF9NU0dfTUFYID8gcHB0cF9tc2dfbmFtZVttc2ddIDogcHB0cF9tc2dfbmFtZVswXSwKLQkgICAgICAgbXNnLCBudG9ocyhjaWQpLCBudG9ocyhwY2lkKSwgIGluZm8tPmNzdGF0ZSwgaW5mby0+c3N0YXRlLAotCSAgICAgICBudG9ocyhpbmZvLT5wbnNfY2FsbF9pZCksIG50b2hzKGluZm8tPnBhY19jYWxsX2lkKSk7Ci0JcmV0dXJuIE5GX0FDQ0VQVDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQKLXBwdHBfb3V0Ym91bmRfcGt0KHN0cnVjdCBza19idWZmICoqcHNrYiwKLQkJICBzdHJ1Y3QgUHB0cENvbnRyb2xIZWFkZXIgKmN0bGgsCi0JCSAgdW5pb24gcHB0cF9jdHJsX3VuaW9uICpwcHRwUmVxLAotCQkgIHVuc2lnbmVkIGludCByZXFsZW4sCi0JCSAgc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsCi0JCSAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8pCi17Ci0Jc3RydWN0IGlwX2N0X3BwdHBfbWFzdGVyICppbmZvID0gJmN0LT5oZWxwLmN0X3BwdHBfaW5mbzsKLQl1X2ludDE2X3QgbXNnOwotCV9fYmUxNiBjaWQgPSAwLCBwY2lkID0gMDsKLQl0eXBlb2YoaXBfbmF0X3BwdHBfaG9va19vdXRib3VuZCkgaXBfbmF0X3BwdHBfb3V0Ym91bmQ7Ci0KLQltc2cgPSBudG9ocyhjdGxoLT5tZXNzYWdlVHlwZSk7Ci0JREVCVUdQKCJvdXRib3VuZCBjb250cm9sIG1lc3NhZ2UgJXNcbiIsIHBwdHBfbXNnX25hbWVbbXNnXSk7Ci0KLQlzd2l0Y2ggKG1zZykgewotCWNhc2UgUFBUUF9TVEFSVF9TRVNTSU9OX1JFUVVFU1Q6Ci0JCS8qIGNsaWVudCByZXF1ZXN0cyBmb3IgbmV3IGNvbnRyb2wgc2Vzc2lvbiAqLwotCQlpZiAoaW5mby0+c3N0YXRlICE9IFBQVFBfU0VTU0lPTl9OT05FKQotCQkJZ290byBpbnZhbGlkOwotCQlpbmZvLT5zc3RhdGUgPSBQUFRQX1NFU1NJT05fUkVRVUVTVEVEOwotCQlicmVhazsKLQljYXNlIFBQVFBfU1RPUF9TRVNTSU9OX1JFUVVFU1Q6Ci0JCS8qIGNsaWVudCByZXF1ZXN0cyBlbmQgb2YgY29udHJvbCBzZXNzaW9uICovCi0JCWluZm8tPnNzdGF0ZSA9IFBQVFBfU0VTU0lPTl9TVE9QUkVROwotCQlicmVhazsKLQotCWNhc2UgUFBUUF9PVVRfQ0FMTF9SRVFVRVNUOgotCQkvKiBjbGllbnQgaW5pdGlhdGluZyBjb25uZWN0aW9uIHRvIHNlcnZlciAqLwotCQlpZiAoaW5mby0+c3N0YXRlICE9IFBQVFBfU0VTU0lPTl9DT05GSVJNRUQpCi0JCQlnb3RvIGludmFsaWQ7Ci0JCWluZm8tPmNzdGF0ZSA9IFBQVFBfQ0FMTF9PVVRfUkVROwotCQkvKiB0cmFjayBQTlMgY2FsbCBpZCAqLwotCQljaWQgPSBwcHRwUmVxLT5vY3JlcS5jYWxsSUQ7Ci0JCURFQlVHUCgiJXMsIENJRD0lWFxuIiwgcHB0cF9tc2dfbmFtZVttc2ddLCBudG9ocyhjaWQpKTsKLQkJaW5mby0+cG5zX2NhbGxfaWQgPSBjaWQ7Ci0JCWJyZWFrOwotCWNhc2UgUFBUUF9JTl9DQUxMX1JFUExZOgotCQkvKiBjbGllbnQgYW5zd2VycyBpbmNvbWluZyBjYWxsICovCi0JCWlmIChpbmZvLT5jc3RhdGUgIT0gUFBUUF9DQUxMX0lOX1JFUSAmJgotCQkgICAgaW5mby0+Y3N0YXRlICE9IFBQVFBfQ0FMTF9JTl9SRVApCi0JCQlnb3RvIGludmFsaWQ7Ci0KLQkJY2lkID0gcHB0cFJlcS0+aWNhY2suY2FsbElEOwotCQlwY2lkID0gcHB0cFJlcS0+aWNhY2sucGVlcnNDYWxsSUQ7Ci0JCWlmIChpbmZvLT5wYWNfY2FsbF9pZCAhPSBwY2lkKQotCQkJZ290byBpbnZhbGlkOwotCQlERUJVR1AoIiVzLCBDSUQ9JVggUENJRD0lWFxuIiwgcHB0cF9tc2dfbmFtZVttc2ddLAotCQkgICAgICAgbnRvaHMoY2lkKSwgbnRvaHMocGNpZCkpOwotCi0JCWlmIChwcHRwUmVxLT5pY2Fjay5yZXN1bHRDb2RlID09IFBQVFBfSU5DQUxMX0FDQ0VQVCkgewotCQkJLyogcGFydCB0d28gb2YgdGhlIHRocmVlLXdheSBoYW5kc2hha2UgKi8KLQkJCWluZm8tPmNzdGF0ZSA9IFBQVFBfQ0FMTF9JTl9SRVA7Ci0JCQlpbmZvLT5wbnNfY2FsbF9pZCA9IGNpZDsKLQkJfSBlbHNlCi0JCQlpbmZvLT5jc3RhdGUgPSBQUFRQX0NBTExfTk9ORTsKLQkJYnJlYWs7Ci0KLQljYXNlIFBQVFBfQ0FMTF9DTEVBUl9SRVFVRVNUOgotCQkvKiBjbGllbnQgcmVxdWVzdHMgaGFuZ3VwIG9mIGNhbGwgKi8KLQkJaWYgKGluZm8tPnNzdGF0ZSAhPSBQUFRQX1NFU1NJT05fQ09ORklSTUVEKQotCQkJZ290byBpbnZhbGlkOwotCQkvKiBGVVRVUkU6IGl0ZXJhdGUgb3ZlciBhbGwgY2FsbHMgYW5kIGNoZWNrIGlmCi0JCSAqIGNhbGwgSUQgaXMgdmFsaWQuICBXZSBkb24ndCBkbyB0aGlzIHdpdGhvdXQgbmV3bmF0LAotCQkgKiBiZWNhdXNlIHdlIG9ubHkga25vdyBhYm91dCBsYXN0IGNhbGwgKi8KLQkJaW5mby0+Y3N0YXRlID0gUFBUUF9DQUxMX0NMRUFSX1JFUTsKLQkJYnJlYWs7Ci0JY2FzZSBQUFRQX1NFVF9MSU5LX0lORk86Ci0JY2FzZSBQUFRQX0VDSE9fUkVRVUVTVDoKLQljYXNlIFBQVFBfRUNIT19SRVBMWToKLQkJLyogSSBkb24ndCBoYXZlIHRvIGV4cGxhaW4gdGhlc2UgOykgKi8KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZ290byBpbnZhbGlkOwotCX0KLQotCWlwX25hdF9wcHRwX291dGJvdW5kID0gcmN1X2RlcmVmZXJlbmNlKGlwX25hdF9wcHRwX2hvb2tfb3V0Ym91bmQpOwotCWlmIChpcF9uYXRfcHB0cF9vdXRib3VuZCkKLQkJcmV0dXJuIGlwX25hdF9wcHRwX291dGJvdW5kKHBza2IsIGN0LCBjdGluZm8sIGN0bGgsIHBwdHBSZXEpOwotCXJldHVybiBORl9BQ0NFUFQ7Ci0KLWludmFsaWQ6Ci0JREVCVUdQKCJpbnZhbGlkICVzOiB0eXBlPSVkIGNpZD0ldSBwY2lkPSV1ICIKLQkgICAgICAgImNzdGF0ZT0lZCBzc3RhdGU9JWQgcG5zX2NpZD0ldSBwYWNfY2lkPSV1XG4iLAotCSAgICAgICBtc2cgPD0gUFBUUF9NU0dfTUFYID8gcHB0cF9tc2dfbmFtZVttc2ddIDogcHB0cF9tc2dfbmFtZVswXSwKLQkgICAgICAgbXNnLCBudG9ocyhjaWQpLCBudG9ocyhwY2lkKSwgIGluZm8tPmNzdGF0ZSwgaW5mby0+c3N0YXRlLAotCSAgICAgICBudG9ocyhpbmZvLT5wbnNfY2FsbF9pZCksIG50b2hzKGluZm8tPnBhY19jYWxsX2lkKSk7Ci0JcmV0dXJuIE5GX0FDQ0VQVDsKLX0KLQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBwcHRwX21zZ19zaXplW10gPSB7Ci0JW1BQVFBfU1RBUlRfU0VTU0lPTl9SRVFVRVNUXSAgPSBzaXplb2Yoc3RydWN0IFBwdHBTdGFydFNlc3Npb25SZXF1ZXN0KSwKLQlbUFBUUF9TVEFSVF9TRVNTSU9OX1JFUExZXSAgICA9IHNpemVvZihzdHJ1Y3QgUHB0cFN0YXJ0U2Vzc2lvblJlcGx5KSwKLQlbUFBUUF9TVE9QX1NFU1NJT05fUkVRVUVTVF0gICA9IHNpemVvZihzdHJ1Y3QgUHB0cFN0b3BTZXNzaW9uUmVxdWVzdCksCi0JW1BQVFBfU1RPUF9TRVNTSU9OX1JFUExZXSAgICAgPSBzaXplb2Yoc3RydWN0IFBwdHBTdG9wU2Vzc2lvblJlcGx5KSwKLQlbUFBUUF9PVVRfQ0FMTF9SRVFVRVNUXSAgICAgICA9IHNpemVvZihzdHJ1Y3QgUHB0cE91dENhbGxSZXF1ZXN0KSwKLQlbUFBUUF9PVVRfQ0FMTF9SRVBMWV0JICAgICAgPSBzaXplb2Yoc3RydWN0IFBwdHBPdXRDYWxsUmVwbHkpLAotCVtQUFRQX0lOX0NBTExfUkVRVUVTVF0JICAgICAgPSBzaXplb2Yoc3RydWN0IFBwdHBJbkNhbGxSZXF1ZXN0KSwKLQlbUFBUUF9JTl9DQUxMX1JFUExZXQkgICAgICA9IHNpemVvZihzdHJ1Y3QgUHB0cEluQ2FsbFJlcGx5KSwKLQlbUFBUUF9JTl9DQUxMX0NPTk5FQ1RdCSAgICAgID0gc2l6ZW9mKHN0cnVjdCBQcHRwSW5DYWxsQ29ubmVjdGVkKSwKLQlbUFBUUF9DQUxMX0NMRUFSX1JFUVVFU1RdICAgICA9IHNpemVvZihzdHJ1Y3QgUHB0cENsZWFyQ2FsbFJlcXVlc3QpLAotCVtQUFRQX0NBTExfRElTQ09OTkVDVF9OT1RJRlldID0gc2l6ZW9mKHN0cnVjdCBQcHRwQ2FsbERpc2Nvbm5lY3ROb3RpZnkpLAotCVtQUFRQX1dBTl9FUlJPUl9OT1RJRlldCSAgICAgID0gc2l6ZW9mKHN0cnVjdCBQcHRwV2FuRXJyb3JOb3RpZnkpLAotCVtQUFRQX1NFVF9MSU5LX0lORk9dCSAgICAgID0gc2l6ZW9mKHN0cnVjdCBQcHRwU2V0TGlua0luZm8pLAotfTsKLQotLyogdHJhY2sgY2FsbGVyIGlkIGluc2lkZSBjb250cm9sIGNvbm5lY3Rpb24sIGNhbGwgZXhwZWN0X3JlbGF0ZWQgKi8KLXN0YXRpYyBpbnQKLWNvbm50cmFja19wcHRwX2hlbHAoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAotCQkgICAgc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvKQotCi17Ci0JaW50IGRpciA9IENUSU5GTzJESVIoY3RpbmZvKTsKLQlzdHJ1Y3QgaXBfY3RfcHB0cF9tYXN0ZXIgKmluZm8gPSAmY3QtPmhlbHAuY3RfcHB0cF9pbmZvOwotCXN0cnVjdCB0Y3BoZHIgX3RjcGgsICp0Y3BoOwotCXN0cnVjdCBwcHRwX3BrdF9oZHIgX3BwdHBoLCAqcHB0cGg7Ci0Jc3RydWN0IFBwdHBDb250cm9sSGVhZGVyIF9jdGxoLCAqY3RsaDsKLQl1bmlvbiBwcHRwX2N0cmxfdW5pb24gX3BwdHBSZXEsICpwcHRwUmVxOwotCXVuc2lnbmVkIGludCB0Y3BsZW4gPSAoKnBza2IpLT5sZW4gLSAoKnBza2IpLT5uaC5pcGgtPmlobCAqIDQ7Ci0JdW5zaWduZWQgaW50IGRhdGFsZW4sIHJlcWxlbiwgbmV4dGhkcl9vZmY7Ci0JaW50IG9sZHNzdGF0ZSwgb2xkY3N0YXRlOwotCWludCByZXQ7Ci0JdV9pbnQxNl90IG1zZzsKLQotCS8qIGRvbid0IGRvIGFueSB0cmFja2luZyBiZWZvcmUgdGNwIGhhbmRzaGFrZSBjb21wbGV0ZSAqLwotCWlmIChjdGluZm8gIT0gSVBfQ1RfRVNUQUJMSVNIRUQKLQkgICAgJiYgY3RpbmZvICE9IElQX0NUX0VTVEFCTElTSEVEK0lQX0NUX0lTX1JFUExZKSB7Ci0JCURFQlVHUCgiY3RpbmZvID0gJXUsIHNraXBwaW5nXG4iLCBjdGluZm8pOwotCQlyZXR1cm4gTkZfQUNDRVBUOwotCX0KLQotCW5leHRoZHJfb2ZmID0gKCpwc2tiKS0+bmguaXBoLT5paGwqNDsKLQl0Y3BoID0gc2tiX2hlYWRlcl9wb2ludGVyKCpwc2tiLCBuZXh0aGRyX29mZiwgc2l6ZW9mKF90Y3BoKSwgJl90Y3BoKTsKLQlCVUdfT04oIXRjcGgpOwotCW5leHRoZHJfb2ZmICs9IHRjcGgtPmRvZmYgKiA0OwotCWRhdGFsZW4gPSB0Y3BsZW4gLSB0Y3BoLT5kb2ZmICogNDsKLQotCXBwdHBoID0gc2tiX2hlYWRlcl9wb2ludGVyKCpwc2tiLCBuZXh0aGRyX29mZiwgc2l6ZW9mKF9wcHRwaCksICZfcHB0cGgpOwotCWlmICghcHB0cGgpIHsKLQkJREVCVUdQKCJubyBmdWxsIFBQVFAgaGVhZGVyLCBjYW4ndCB0cmFja1xuIik7Ci0JCXJldHVybiBORl9BQ0NFUFQ7Ci0JfQotCW5leHRoZHJfb2ZmICs9IHNpemVvZihfcHB0cGgpOwotCWRhdGFsZW4gLT0gc2l6ZW9mKF9wcHRwaCk7Ci0KLQkvKiBpZiBpdCdzIG5vdCBhIGNvbnRyb2wgbWVzc2FnZSB3ZSBjYW4ndCBkbyBhbnl0aGluZyB3aXRoIGl0ICovCi0JaWYgKG50b2hzKHBwdHBoLT5wYWNrZXRUeXBlKSAhPSBQUFRQX1BBQ0tFVF9DT05UUk9MIHx8Ci0JICAgIG50b2hsKHBwdHBoLT5tYWdpY0Nvb2tpZSkgIT0gUFBUUF9NQUdJQ19DT09LSUUpIHsKLQkJREVCVUdQKCJub3QgYSBjb250cm9sIHBhY2tldFxuIik7Ci0JCXJldHVybiBORl9BQ0NFUFQ7Ci0JfQotCi0JY3RsaCA9IHNrYl9oZWFkZXJfcG9pbnRlcigqcHNrYiwgbmV4dGhkcl9vZmYsIHNpemVvZihfY3RsaCksICZfY3RsaCk7Ci0JaWYgKCFjdGxoKQotCQlyZXR1cm4gTkZfQUNDRVBUOwotCW5leHRoZHJfb2ZmICs9IHNpemVvZihfY3RsaCk7Ci0JZGF0YWxlbiAtPSBzaXplb2YoX2N0bGgpOwotCi0JcmVxbGVuID0gZGF0YWxlbjsKLQltc2cgPSBudG9ocyhjdGxoLT5tZXNzYWdlVHlwZSk7Ci0JaWYgKG1zZyA+IDAgJiYgbXNnIDw9IFBQVFBfTVNHX01BWCAmJiByZXFsZW4gPCBwcHRwX21zZ19zaXplW21zZ10pCi0JCXJldHVybiBORl9BQ0NFUFQ7Ci0JaWYgKHJlcWxlbiA+IHNpemVvZigqcHB0cFJlcSkpCi0JCXJlcWxlbiA9IHNpemVvZigqcHB0cFJlcSk7Ci0KLQlwcHRwUmVxID0gc2tiX2hlYWRlcl9wb2ludGVyKCpwc2tiLCBuZXh0aGRyX29mZiwgcmVxbGVuLCAmX3BwdHBSZXEpOwotCWlmICghcHB0cFJlcSkKLQkJcmV0dXJuIE5GX0FDQ0VQVDsKLQotCW9sZHNzdGF0ZSA9IGluZm8tPnNzdGF0ZTsKLQlvbGRjc3RhdGUgPSBpbmZvLT5jc3RhdGU7Ci0KLQlzcGluX2xvY2tfYmgoJmlwX3BwdHBfbG9jayk7Ci0KLQkvKiBGSVhNRTogV2UganVzdCBibGluZGx5IGFzc3VtZSB0aGF0IHRoZSBjb250cm9sIGNvbm5lY3Rpb24gaXMgYWx3YXlzCi0JICogZXN0YWJsaXNoZWQgZnJvbSBQTlMtPlBBQy4gIEhvd2V2ZXIsIFJGQyBtYWtlcyBubyBndWFyYW50ZWUgKi8KLQlpZiAoZGlyID09IElQX0NUX0RJUl9PUklHSU5BTCkKLQkJLyogY2xpZW50IC0+IHNlcnZlciAoUE5TIC0+IFBBQykgKi8KLQkJcmV0ID0gcHB0cF9vdXRib3VuZF9wa3QocHNrYiwgY3RsaCwgcHB0cFJlcSwgcmVxbGVuLCBjdCwKLQkJCQkJY3RpbmZvKTsKLQllbHNlCi0JCS8qIHNlcnZlciAtPiBjbGllbnQgKFBBQyAtPiBQTlMpICovCi0JCXJldCA9IHBwdHBfaW5ib3VuZF9wa3QocHNrYiwgY3RsaCwgcHB0cFJlcSwgcmVxbGVuLCBjdCwKLQkJCQkgICAgICAgY3RpbmZvKTsKLQlERUJVR1AoInNzdGF0ZTogJWQtPiVkLCBjc3RhdGU6ICVkLT4lZFxuIiwKLQkJb2xkc3N0YXRlLCBpbmZvLT5zc3RhdGUsIG9sZGNzdGF0ZSwgaW5mby0+Y3N0YXRlKTsKLQlzcGluX3VubG9ja19iaCgmaXBfcHB0cF9sb2NrKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLS8qIGNvbnRyb2wgcHJvdG9jb2wgaGVscGVyICovCi1zdGF0aWMgc3RydWN0IGlwX2Nvbm50cmFja19oZWxwZXIgcHB0cCA9IHsKLQkubGlzdCA9IHsgTlVMTCwgTlVMTCB9LAotCS5uYW1lID0gInBwdHAiLAotCS5tZSA9IFRISVNfTU9EVUxFLAotCS5tYXhfZXhwZWN0ZWQgPSAyLAotCS50aW1lb3V0ID0gNSAqIDYwLAotCS50dXBsZSA9IHsgLnNyYyA9IHsgLmlwID0gMCwKLQkJCSAgICAudSA9IHsgLnRjcCA9IHsgLnBvcnQgPQotCQkJCSAgICBfX2NvbnN0YW50X2h0b25zKFBQVFBfQ09OVFJPTF9QT1JUKSB9IH0KLQkJCSAgfSwKLQkJICAgLmRzdCA9IHsgLmlwID0gMCwKLQkJCSAgICAudSA9IHsgLmFsbCA9IDAgfSwKLQkJCSAgICAucHJvdG9udW0gPSBJUFBST1RPX1RDUAotCQkJICB9Ci0JCSB9LAotCS5tYXNrID0geyAuc3JjID0geyAuaXAgPSAwLAotCQkJICAgLnUgPSB7IC50Y3AgPSB7IC5wb3J0ID0gX19jb25zdGFudF9odG9ucygweGZmZmYpIH0gfQotCQkJIH0sCi0JCSAgLmRzdCA9IHsgLmlwID0gMCwKLQkJCSAgIC51ID0geyAuYWxsID0gMCB9LAotCQkJICAgLnByb3RvbnVtID0gMHhmZgotCQkJIH0KLQkJfSwKLQkuaGVscCA9IGNvbm50cmFja19wcHRwX2hlbHAsCi0JLmRlc3Ryb3kgPSBwcHRwX2Rlc3Ryb3lfc2libGluZ3MsCi19OwotCi1leHRlcm4gdm9pZCBpcF9jdF9wcm90b19ncmVfZmluaSh2b2lkKTsKLWV4dGVybiBpbnQgX19pbml0IGlwX2N0X3Byb3RvX2dyZV9pbml0KHZvaWQpOwotCi0vKiBpcF9jb25udHJhY2tfcHB0cCBpbml0aWFsaXphdGlvbiAqLwotc3RhdGljIGludCBfX2luaXQgaXBfY29ubnRyYWNrX2hlbHBlcl9wcHRwX2luaXQodm9pZCkKLXsKLQlpbnQgcmV0Y29kZTsKLQotCXJldGNvZGUgPSBpcF9jdF9wcm90b19ncmVfaW5pdCgpOwotCWlmIChyZXRjb2RlIDwgMCkKLQkJcmV0dXJuIHJldGNvZGU7Ci0KLQlERUJVR1AoIiByZWdpc3RlcmluZyBoZWxwZXJcbiIpOwotCWlmICgocmV0Y29kZSA9IGlwX2Nvbm50cmFja19oZWxwZXJfcmVnaXN0ZXIoJnBwdHApKSkgewotCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byByZWdpc3RlciBjb25udHJhY2sgYXBwbGljYXRpb24gIgotCQkJCSJoZWxwZXIgZm9yIHBwdHA6ICVkXG4iLCByZXRjb2RlKTsKLQkJaXBfY3RfcHJvdG9fZ3JlX2ZpbmkoKTsKLQkJcmV0dXJuIHJldGNvZGU7Ci0JfQotCi0JcHJpbnRrKCJpcF9jb25udHJhY2tfcHB0cCB2ZXJzaW9uICVzIGxvYWRlZFxuIiwgSVBfQ1RfUFBUUF9WRVJTSU9OKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGlwX2Nvbm50cmFja19oZWxwZXJfcHB0cF9maW5pKHZvaWQpCi17Ci0JaXBfY29ubnRyYWNrX2hlbHBlcl91bnJlZ2lzdGVyKCZwcHRwKTsKLQlpcF9jdF9wcm90b19ncmVfZmluaSgpOwotCXByaW50aygiaXBfY29ubnRyYWNrX3BwdHAgdmVyc2lvbiAlcyB1bmxvYWRlZFxuIiwgSVBfQ1RfUFBUUF9WRVJTSU9OKTsKLX0KLQotbW9kdWxlX2luaXQoaXBfY29ubnRyYWNrX2hlbHBlcl9wcHRwX2luaXQpOwotbW9kdWxlX2V4aXQoaXBfY29ubnRyYWNrX2hlbHBlcl9wcHRwX2ZpbmkpOwotCi1FWFBPUlRfU1lNQk9MKGlwX25hdF9wcHRwX2hvb2tfb3V0Ym91bmQpOwotRVhQT1JUX1NZTUJPTChpcF9uYXRfcHB0cF9ob29rX2luYm91bmQpOwotRVhQT1JUX1NZTUJPTChpcF9uYXRfcHB0cF9ob29rX2V4cF9ncmUpOwotRVhQT1JUX1NZTUJPTChpcF9uYXRfcHB0cF9ob29rX2V4cGVjdGZuKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfaXJjLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX2lyYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTNlNTkxLi4wMDAwMDAwCi0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfaXJjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMTQgKzAsMCBAQAotLyogSVJDIGV4dGVuc2lvbiBmb3IgSVAgY29ubmVjdGlvbiB0cmFja2luZywgVmVyc2lvbiAxLjIxCi0gKiAoQykgMjAwMC0yMDAyIGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+Ci0gKiBiYXNlZCBvbiBSUidzIGlwX2Nvbm50cmFja19mdHAuYwotICoKLSAqIGlwX2Nvbm50cmFja19pcmMuYyx2IDEuMjEgMjAwMi8wMi8wNSAxNDo0OToyNiBsYWZvcmdlIEV4cAotICoKLSAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqICAgICAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqKgotICoJTW9kdWxlIGxvYWQgc3ludGF4OgotICogCWluc21vZCBpcF9jb25udHJhY2tfaXJjLm8gcG9ydHM9cG9ydDEscG9ydDIsLi4ucG9ydDxNQVhfUE9SVFM+Ci0gKgkJCSAgICBtYXhfZGNjX2NoYW5uZWxzPW4gZGNjX3RpbWVvdXQ9c2VjcwotICoKLSAqIAlwbGVhc2UgZ2l2ZSB0aGUgcG9ydHMgb2YgYWxsIElSQyBzZXJ2ZXJzIFlvdSB3aXNoIHRvIGNvbm5lY3QgdG8uCi0gKglJZiBZb3UgZG9uJ3Qgc3BlY2lmeSBwb3J0cywgdGhlIGRlZmF1bHQgd2lsbCBiZSBwb3J0IDY2NjcuCi0gKglXaXRoIG1heF9kY2NfY2hhbm5lbHMgeW91IGNhbiBkZWZpbmUgdGhlIG1heGltdW0gbnVtYmVyIG9mIG5vdAotICoJeWV0IGFuc3dlcmVkIERDQyBjaGFubmVscyBwZXIgSVJDIHNlc3Npb24gKGRlZmF1bHQgOCkuCi0gKglXaXRoIGRjY190aW1lb3V0IHlvdSBjYW4gc3BlY2lmeSBob3cgbG9uZyB0aGUgc3lzdGVtIHdhaXRzIGZvcgotICoJYW4gZXhwZWN0ZWQgRENDIGNoYW5uZWwgKGRlZmF1bHQgMzAwIHNlY29uZHMpLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvaXAuaD4KLSNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KLSNpbmNsdWRlIDxuZXQvdGNwLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfaGVscGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2lyYy5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+Ci0KLSNkZWZpbmUgTUFYX1BPUlRTIDgKLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCBwb3J0c1tNQVhfUE9SVFNdOwotc3RhdGljIGludCBwb3J0c19jOwotc3RhdGljIHVuc2lnbmVkIGludCBtYXhfZGNjX2NoYW5uZWxzID0gODsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgZGNjX3RpbWVvdXQgPSAzMDA7Ci0vKiBUaGlzIGlzIHNsb3csIGJ1dCBpdCdzIHNpbXBsZS4gLS1SUiAqLwotc3RhdGljIGNoYXIgKmlyY19idWZmZXI7Ci1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKGlyY19idWZmZXJfbG9jayk7Ci0KLXVuc2lnbmVkIGludCAoKmlwX25hdF9pcmNfaG9vaykoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAotCQkJCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAotCQkJCXVuc2lnbmVkIGludCBtYXRjaG9mZiwKLQkJCQl1bnNpZ25lZCBpbnQgbWF0Y2hsZW4sCi0JCQkJc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmV4cCk7Ci1FWFBPUlRfU1lNQk9MX0dQTChpcF9uYXRfaXJjX2hvb2spOwotCi1NT0RVTEVfQVVUSE9SKCJIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAbmV0ZmlsdGVyLm9yZz4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiSVJDIChEQ0MpIGNvbm5lY3Rpb24gdHJhY2tpbmcgaGVscGVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1tb2R1bGVfcGFyYW1fYXJyYXkocG9ydHMsIHVzaG9ydCwgJnBvcnRzX2MsIDA0MDApOwotTU9EVUxFX1BBUk1fREVTQyhwb3J0cywgInBvcnQgbnVtYmVycyBvZiBJUkMgc2VydmVycyIpOwotbW9kdWxlX3BhcmFtKG1heF9kY2NfY2hhbm5lbHMsIHVpbnQsIDA0MDApOwotTU9EVUxFX1BBUk1fREVTQyhtYXhfZGNjX2NoYW5uZWxzLCAibWF4IG51bWJlciBvZiBleHBlY3RlZCBEQ0MgY2hhbm5lbHMgcGVyIElSQyBzZXNzaW9uIik7Ci1tb2R1bGVfcGFyYW0oZGNjX3RpbWVvdXQsIHVpbnQsIDA0MDApOwotTU9EVUxFX1BBUk1fREVTQyhkY2NfdGltZW91dCwgInRpbWVvdXQgb24gZm9yIHVuZXN0YWJsaXNoZWQgRENDIGNoYW5uZWxzIik7Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpkY2Nwcm90b3NbXSA9IHsgIlNFTkQgIiwgIkNIQVQgIiwgIk1PVkUgIiwgIlRTRU5EICIsICJTQ0hBVCAiIH07Ci0jZGVmaW5lIE1JTk1BVENITEVOCTUKLQotI2lmIDAKLSNkZWZpbmUgREVCVUdQKGZvcm1hdCwgYXJncy4uLikgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiVzOiIgZm9ybWF0LCBcCi0JCQkJICAgICAgIF9fRklMRV9fLCBfX0ZVTkNUSU9OX18gLCAjIyBhcmdzKQotI2Vsc2UKLSNkZWZpbmUgREVCVUdQKGZvcm1hdCwgYXJncy4uLikKLSNlbmRpZgotCi1zdGF0aWMgaW50IHBhcnNlX2RjYyhjaGFyICpkYXRhLCBjaGFyICpkYXRhX2VuZCwgdV9pbnQzMl90ICppcCwKLQkJICAgICB1X2ludDE2X3QgKnBvcnQsIGNoYXIgKiphZF9iZWdfcCwgY2hhciAqKmFkX2VuZF9wKQotLyogdHJpZXMgdG8gZ2V0IHRoZSBpcF9hZGRyIGFuZCBwb3J0IG91dCBvZiBhIGRjYyBjb21tYW5kCi0gICByZXR1cm4gdmFsdWU6IC0xIG9uIGZhaWx1cmUsIDAgb24gc3VjY2VzcwotCWRhdGEJCXBvaW50ZXIgdG8gZmlyc3QgYnl0ZSBvZiBEQ0MgY29tbWFuZCBkYXRhCi0JZGF0YV9lbmQJcG9pbnRlciB0byBsYXN0IGJ5dGUgb2YgZGNjIGNvbW1hbmQgZGF0YQotCWlwCQlyZXR1cm5zIHBhcnNlZCBpcCBvZiBkY2MgY29tbWFuZAotCXBvcnQJCXJldHVybnMgcGFyc2VkIHBvcnQgb2YgZGNjIGNvbW1hbmQKLQlhZF9iZWdfcAlyZXR1cm5zIHBvaW50ZXIgdG8gZmlyc3QgYnl0ZSBvZiBhZGRyIGRhdGEKLQlhZF9lbmRfcAlyZXR1cm5zIHBvaW50ZXIgdG8gbGFzdCBieXRlIG9mIGFkZHIgZGF0YSAqLwotewotCi0JLyogYXQgbGVhc3QgMTI6ICJBQUFBQUFBQSBQXDFcbiIgKi8KLQl3aGlsZSAoKmRhdGErKyAhPSAnICcpCi0JCWlmIChkYXRhID4gZGF0YV9lbmQgLSAxMikKLQkJCXJldHVybiAtMTsKLQotCSphZF9iZWdfcCA9IGRhdGE7Ci0JKmlwID0gc2ltcGxlX3N0cnRvdWwoZGF0YSwgJmRhdGEsIDEwKTsKLQotCS8qIHNraXAgYmxhbmtzIGJldHdlZW4gaXAgYW5kIHBvcnQgKi8KLQl3aGlsZSAoKmRhdGEgPT0gJyAnKSB7Ci0JCWlmIChkYXRhID49IGRhdGFfZW5kKQotCQkJcmV0dXJuIC0xOwotCQlkYXRhKys7Ci0JfQotCi0JKnBvcnQgPSBzaW1wbGVfc3RydG91bChkYXRhLCAmZGF0YSwgMTApOwotCSphZF9lbmRfcCA9IGRhdGE7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBoZWxwKHN0cnVjdCBza19idWZmICoqcHNrYiwKLQkJc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvKQotewotCXVuc2lnbmVkIGludCBkYXRhb2ZmOwotCXN0cnVjdCB0Y3BoZHIgX3RjcGgsICp0aDsKLQljaGFyICpkYXRhLCAqZGF0YV9saW1pdCwgKmliX3B0cjsKLQlpbnQgZGlyID0gQ1RJTkZPMkRJUihjdGluZm8pOwotCXN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpleHA7Ci0JdTMyIHNlcTsKLQl1X2ludDMyX3QgZGNjX2lwOwotCXVfaW50MTZfdCBkY2NfcG9ydDsKLQlpbnQgaSwgcmV0ID0gTkZfQUNDRVBUOwotCWNoYXIgKmFkZHJfYmVnX3AsICphZGRyX2VuZF9wOwotCXR5cGVvZihpcF9uYXRfaXJjX2hvb2spIGlwX25hdF9pcmM7Ci0KLQlERUJVR1AoImVudGVyZWRcbiIpOwotCi0JLyogSWYgcGFja2V0IGlzIGNvbWluZyBmcm9tIElSQyBzZXJ2ZXIgKi8KLQlpZiAoZGlyID09IElQX0NUX0RJUl9SRVBMWSkKLQkJcmV0dXJuIE5GX0FDQ0VQVDsKLQotCS8qIFVudGlsIHRoZXJlJ3MgYmVlbiB0cmFmZmljIGJvdGggd2F5cywgZG9uJ3QgbG9vayBpbiBwYWNrZXRzLiAqLwotCWlmIChjdGluZm8gIT0gSVBfQ1RfRVNUQUJMSVNIRUQKLQkgICAgJiYgY3RpbmZvICE9IElQX0NUX0VTVEFCTElTSEVEICsgSVBfQ1RfSVNfUkVQTFkpIHsKLQkJREVCVUdQKCJDb25udHJhY2tpbmZvID0gJXVcbiIsIGN0aW5mbyk7Ci0JCXJldHVybiBORl9BQ0NFUFQ7Ci0JfQotCi0JLyogTm90IGEgZnVsbCB0Y3AgaGVhZGVyPyAqLwotCXRoID0gc2tiX2hlYWRlcl9wb2ludGVyKCpwc2tiLCAoKnBza2IpLT5uaC5pcGgtPmlobCo0LAotCQkJCXNpemVvZihfdGNwaCksICZfdGNwaCk7Ci0JaWYgKHRoID09IE5VTEwpCi0JCXJldHVybiBORl9BQ0NFUFQ7Ci0KLQkvKiBObyBkYXRhPyAqLwotCWRhdGFvZmYgPSAoKnBza2IpLT5uaC5pcGgtPmlobCo0ICsgdGgtPmRvZmYqNDsKLQlpZiAoZGF0YW9mZiA+PSAoKnBza2IpLT5sZW4pCi0JCXJldHVybiBORl9BQ0NFUFQ7Ci0KLQlzcGluX2xvY2tfYmgoJmlyY19idWZmZXJfbG9jayk7Ci0JaWJfcHRyID0gc2tiX2hlYWRlcl9wb2ludGVyKCpwc2tiLCBkYXRhb2ZmLAotCQkJCSAgICAoKnBza2IpLT5sZW4gLSBkYXRhb2ZmLCBpcmNfYnVmZmVyKTsKLQlCVUdfT04oaWJfcHRyID09IE5VTEwpOwotCi0JZGF0YSA9IGliX3B0cjsKLQlkYXRhX2xpbWl0ID0gaWJfcHRyICsgKCpwc2tiKS0+bGVuIC0gZGF0YW9mZjsKLQotCS8qIHN0cmxlbigiXDFEQ0MgU0VOVCB0IEFBQUFBQUFBIFBcMVxuIik9MjQKLQkgKiA1K01JTk1BVENITEVOK3N0cmxlbigidCBBQUFBQUFBQSBQXDFcbiIpPTE0ICovCi0Jd2hpbGUgKGRhdGEgPCAoZGF0YV9saW1pdCAtICgxOSArIE1JTk1BVENITEVOKSkpIHsKLQkJaWYgKG1lbWNtcChkYXRhLCAiXDFEQ0MgIiwgNSkpIHsKLQkJCWRhdGErKzsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJZGF0YSArPSA1OwotCQkvKiB3ZSBoYXZlIGF0IGxlYXN0ICgxOStNSU5NQVRDSExFTiktNSBieXRlcyB2YWxpZCBkYXRhIGxlZnQgKi8KLQotCQlERUJVR1AoIkRDQyBmb3VuZCBpbiBtYXN0ZXIgJXUuJXUuJXUuJXU6JXUgJXUuJXUuJXUuJXU6JXUuLi5cbiIsCi0JCQlOSVBRVUFEKGlwaC0+c2FkZHIpLCBudG9ocyh0aC0+c291cmNlKSwKLQkJCU5JUFFVQUQoaXBoLT5kYWRkciksIG50b2hzKHRoLT5kZXN0KSk7Ci0KLQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZGNjcHJvdG9zKTsgaSsrKSB7Ci0JCQlpZiAobWVtY21wKGRhdGEsIGRjY3Byb3Rvc1tpXSwgc3RybGVuKGRjY3Byb3Rvc1tpXSkpKSB7Ci0JCQkJLyogbm8gbWF0Y2ggKi8KLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJREVCVUdQKCJEQ0MgJXMgZGV0ZWN0ZWRcbiIsIGRjY3Byb3Rvc1tpXSk7Ci0JCQlkYXRhICs9IHN0cmxlbihkY2Nwcm90b3NbaV0pOwotCQkJLyogd2UgaGF2ZSBhdCBsZWFzdAotCQkJICogKDE5K01JTk1BVENITEVOKS01LWRjY3Byb3Rvc1tpXS5tYXRjaGxlbiBieXRlcyB2YWxpZAotCQkJICogZGF0YSBsZWZ0ICg9PSAxNC8xMyBieXRlcykgKi8KLQkJCWlmIChwYXJzZV9kY2MoKGNoYXIgKilkYXRhLCBkYXRhX2xpbWl0LCAmZGNjX2lwLAotCQkJCSAgICAgICAmZGNjX3BvcnQsICZhZGRyX2JlZ19wLCAmYWRkcl9lbmRfcCkpIHsKLQkJCQkvKiB1bmFibGUgdG8gcGFyc2UgKi8KLQkJCQlERUJVR1AoInVuYWJsZSB0byBwYXJzZSBkY2MgY29tbWFuZFxuIik7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlERUJVR1AoIkRDQyBib3VuZCBpcC9wb3J0OiAldS4ldS4ldS4ldToldVxuIiwKLQkJCQlISVBRVUFEKGRjY19pcCksIGRjY19wb3J0KTsKLQotCQkJLyogZGNjX2lwIGNhbiBiZSB0aGUgaW50ZXJuYWwgT1IgZXh0ZXJuYWwgKE5BVCdlZCkgSVAKLQkJCSAqIFRpYWdvIFNvdXNhIDxtaXJhZ2VAa2FvdGlrLm9yZz4gKi8KLQkJCWlmIChjdC0+dHVwbGVoYXNoW2Rpcl0udHVwbGUuc3JjLmlwICE9IGh0b25sKGRjY19pcCkKLQkJCSAgICAmJiBjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0udHVwbGUuZHN0LmlwICE9IGh0b25sKGRjY19pcCkpIHsKLQkJCQlpZiAobmV0X3JhdGVsaW1pdCgpKQotCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCQkJCQkiRm9yZ2VkIERDQyBjb21tYW5kIGZyb20gIgotCQkJCQkJIiV1LiV1LiV1LiV1OiAldS4ldS4ldS4ldToldVxuIiwKLQkJCQlOSVBRVUFEKGN0LT50dXBsZWhhc2hbZGlyXS50dXBsZS5zcmMuaXApLAotCQkJCQkJSElQUVVBRChkY2NfaXApLCBkY2NfcG9ydCk7Ci0KLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJZXhwID0gaXBfY29ubnRyYWNrX2V4cGVjdF9hbGxvYyhjdCk7Ci0JCQlpZiAoZXhwID09IE5VTEwpIHsKLQkJCQlyZXQgPSBORl9EUk9QOwotCQkJCWdvdG8gb3V0OwotCQkJfQotCi0JCQkvKiBzYXZlIHBvc2l0aW9uIG9mIGFkZHJlc3MgaW4gZGNjIHN0cmluZywKLQkJCSAqIG5lY2Vzc2FyeSBmb3IgTkFUICovCi0JCQlERUJVR1AoInRjcGgtPnNlcSA9ICV1XG4iLCB0aC0+c2VxKTsKLQkJCXNlcSA9IG50b2hsKHRoLT5zZXEpICsgKGFkZHJfYmVnX3AgLSBpYl9wdHIpOwotCi0JCQkvKiBXZSByZWZlciB0byB0aGUgcmV2ZXJzZSBkaXJlY3Rpb24gKCIhZGlyIikKLQkJCSAqIHR1cGxlcyBoZXJlLCBiZWNhdXNlIHdlJ3JlIGV4cGVjdGluZwotCQkJICogc29tZXRoaW5nIGluIHRoZSBvdGhlciAqIGRpcmVjdGlvbi4KLQkJCSAqIERvZXNuJ3QgbWF0dGVyIHVubGVzcyBOQVQgaXMgaGFwcGVuaW5nLiAgKi8KLQkJCWV4cC0+dHVwbGUgPSAoKHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUpCi0JCQkJeyB7IDAsIHsgMCB9IH0sCi0JCQkJICB7IGN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuZHN0LmlwLAotCQkJCSAgICB7IC50Y3AgPSB7IGh0b25zKGRjY19wb3J0KSB9IH0sCi0JCQkJICAgIElQUFJPVE9fVENQIH19KTsKLQkJCWV4cC0+bWFzayA9ICgoc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSkKLQkJCQl7IHsgMCwgeyAwIH0gfSwKLQkJCQkgIHsgaHRvbmwoMHhGRkZGRkZGRiksCi0JCQkJCXsgLnRjcCA9IHsgaHRvbnMoMHhGRkZGKSB9IH0sIDB4RkYgfX0pOwotCQkJZXhwLT5leHBlY3RmbiA9IE5VTEw7Ci0JCQlleHAtPmZsYWdzID0gMDsKLQkJCWlwX25hdF9pcmMgPSByY3VfZGVyZWZlcmVuY2UoaXBfbmF0X2lyY19ob29rKTsKLQkJCWlmIChpcF9uYXRfaXJjKQotCQkJCXJldCA9IGlwX25hdF9pcmMocHNrYiwgY3RpbmZvLAotCQkJCQkJIGFkZHJfYmVnX3AgLSBpYl9wdHIsCi0JCQkJCQkgYWRkcl9lbmRfcCAtIGFkZHJfYmVnX3AsCi0JCQkJCQkgZXhwKTsKLQkJCWVsc2UgaWYgKGlwX2Nvbm50cmFja19leHBlY3RfcmVsYXRlZChleHApICE9IDApCi0JCQkJcmV0ID0gTkZfRFJPUDsKLQkJCWlwX2Nvbm50cmFja19leHBlY3RfcHV0KGV4cCk7Ci0JCQlnb3RvIG91dDsKLQkJfSAvKiBmb3IgLi4gTlVNX0RDQ1BST1RPICovCi0JfSAvKiB3aGlsZSBkYXRhIDwgLi4uICovCi0KLSBvdXQ6Ci0Jc3Bpbl91bmxvY2tfYmgoJmlyY19idWZmZXJfbG9jayk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHN0cnVjdCBpcF9jb25udHJhY2tfaGVscGVyIGlyY19oZWxwZXJzW01BWF9QT1JUU107Ci1zdGF0aWMgY2hhciBpcmNfbmFtZXNbTUFYX1BPUlRTXVtzaXplb2YoImlyYy02NTUzNSIpXTsKLQotc3RhdGljIHZvaWQgaXBfY29ubnRyYWNrX2lyY19maW5pKHZvaWQpOwotCi1zdGF0aWMgaW50IF9faW5pdCBpcF9jb25udHJhY2tfaXJjX2luaXQodm9pZCkKLXsKLQlpbnQgaSwgcmV0OwotCXN0cnVjdCBpcF9jb25udHJhY2tfaGVscGVyICpobHByOwotCWNoYXIgKnRtcG5hbWU7Ci0KLQlpZiAobWF4X2RjY19jaGFubmVscyA8IDEpIHsKLQkJcHJpbnRrKCJpcF9jb25udHJhY2tfaXJjOiBtYXhfZGNjX2NoYW5uZWxzIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyXG4iKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0KLQlpcmNfYnVmZmVyID0ga21hbGxvYyg2NTUzNiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFpcmNfYnVmZmVyKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCS8qIElmIG5vIHBvcnQgZ2l2ZW4sIGRlZmF1bHQgdG8gc3RhbmRhcmQgaXJjIHBvcnQgKi8KLQlpZiAocG9ydHNfYyA9PSAwKQotCQlwb3J0c1twb3J0c19jKytdID0gSVJDX1BPUlQ7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgcG9ydHNfYzsgaSsrKSB7Ci0JCWhscHIgPSAmaXJjX2hlbHBlcnNbaV07Ci0JCWhscHItPnR1cGxlLnNyYy51LnRjcC5wb3J0ID0gaHRvbnMocG9ydHNbaV0pOwotCQlobHByLT50dXBsZS5kc3QucHJvdG9udW0gPSBJUFBST1RPX1RDUDsKLQkJaGxwci0+bWFzay5zcmMudS50Y3AucG9ydCA9IGh0b25zKDB4RkZGRik7Ci0JCWhscHItPm1hc2suZHN0LnByb3RvbnVtID0gMHhGRjsKLQkJaGxwci0+bWF4X2V4cGVjdGVkID0gbWF4X2RjY19jaGFubmVsczsKLQkJaGxwci0+dGltZW91dCA9IGRjY190aW1lb3V0OwotCQlobHByLT5tZSA9IFRISVNfTU9EVUxFOwotCQlobHByLT5oZWxwID0gaGVscDsKLQotCQl0bXBuYW1lID0gJmlyY19uYW1lc1tpXVswXTsKLQkJaWYgKHBvcnRzW2ldID09IElSQ19QT1JUKQotCQkJc3ByaW50Zih0bXBuYW1lLCAiaXJjIik7Ci0JCWVsc2UKLQkJCXNwcmludGYodG1wbmFtZSwgImlyYy0lZCIsIGkpOwotCQlobHByLT5uYW1lID0gdG1wbmFtZTsKLQotCQlERUJVR1AoInBvcnQgIyVkOiAlZFxuIiwgaSwgcG9ydHNbaV0pOwotCi0JCXJldCA9IGlwX2Nvbm50cmFja19oZWxwZXJfcmVnaXN0ZXIoaGxwcik7Ci0KLQkJaWYgKHJldCkgewotCQkJcHJpbnRrKCJpcF9jb25udHJhY2tfaXJjOiBFUlJPUiByZWdpc3RlcmluZyBwb3J0ICVkXG4iLAotCQkJCXBvcnRzW2ldKTsKLQkJCWlwX2Nvbm50cmFja19pcmNfZmluaSgpOwotCQkJcmV0dXJuIC1FQlVTWTsKLQkJfQotCX0KLQlyZXR1cm4gMDsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBpbnRlbnRpb25hbGx5IF9OT1RfIGRlZmluZWQgYXMgX19leGl0LCBiZWNhdXNlCi0gKiBpdCBpcyBuZWVkZWQgYnkgdGhlIGluaXQgZnVuY3Rpb24gKi8KLXN0YXRpYyB2b2lkIGlwX2Nvbm50cmFja19pcmNfZmluaSh2b2lkKQotewotCWludCBpOwotCWZvciAoaSA9IDA7IGkgPCBwb3J0c19jOyBpKyspIHsKLQkJREVCVUdQKCJ1bnJlZ2lzdGVyaW5nIHBvcnQgJWRcbiIsCi0JCSAgICAgICBwb3J0c1tpXSk7Ci0JCWlwX2Nvbm50cmFja19oZWxwZXJfdW5yZWdpc3RlcigmaXJjX2hlbHBlcnNbaV0pOwotCX0KLQlrZnJlZShpcmNfYnVmZmVyKTsKLX0KLQotbW9kdWxlX2luaXQoaXBfY29ubnRyYWNrX2lyY19pbml0KTsKLW1vZHVsZV9leGl0KGlwX2Nvbm50cmFja19pcmNfZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX25ldGJpb3NfbnMuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfbmV0Ymlvc19ucy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzZkZDQ5Li4wMDAwMDAwCi0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfbmV0Ymlvc19ucy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qCi0gKiAgICAgIE5ldEJJT1MgbmFtZSBzZXJ2aWNlIGJyb2FkY2FzdCBjb25uZWN0aW9uIHRyYWNraW5nIGhlbHBlcgotICoKLSAqICAgICAgKGMpIDIwMDUgUGF0cmljayBNY0hhcmR5IDxrYWJlckB0cmFzaC5uZXQ+Ci0gKgotICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiAgICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiAgICAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotICogICAgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi0vKgotICogICAgICBUaGlzIGhlbHBlciB0cmFja3MgbG9jYWxseSBvcmlnaW5hdGluZyBOZXRCSU9TIG5hbWUgc2VydmljZQotICogICAgICByZXF1ZXN0cyBieSBpc3N1aW5nIHBlcm1hbmVudCBleHBlY3RhdGlvbnMgKHZhbGlkIHVudGlsCi0gKiAgICAgIHRpbWluZyBvdXQpIG1hdGNoaW5nIGFsbCByZXBseSBjb25uZWN0aW9ucyBmcm9tIHRoZQotICogICAgICBkZXN0aW5hdGlvbiBuZXR3b3JrLiBUaGUgb25seSBOZXRCSU9TIHNwZWNpZmljIHRoaW5nIGlzCi0gKiAgICAgIGFjdHVhbGx5IHRoZSBwb3J0IG51bWJlci4KLSAqLwotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9pbmV0ZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvaWZfYWRkci5oPgotI2luY2x1ZGUgPGxpbnV4L2luLmg+Ci0jaW5jbHVkZSA8bGludXgvaXAuaD4KLSNpbmNsdWRlIDxuZXQvcm91dGUuaD4KLQotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2hlbHBlci5oPgotCi0jZGVmaW5lIE5NQkRfUE9SVAkxMzcKLQotTU9EVUxFX0FVVEhPUigiUGF0cmljayBNY0hhcmR5IDxrYWJlckB0cmFzaC5uZXQ+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIk5ldEJJT1MgbmFtZSBzZXJ2aWNlIGJyb2FkY2FzdCBjb25uZWN0aW9uIHRyYWNraW5nIGhlbHBlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi1zdGF0aWMgdW5zaWduZWQgaW50IHRpbWVvdXQgPSAzOwotbW9kdWxlX3BhcmFtKHRpbWVvdXQsIHVpbnQsIDA0MDApOwotTU9EVUxFX1BBUk1fREVTQyh0aW1lb3V0LCAidGltZW91dCBmb3IgbWFzdGVyIGNvbm5lY3Rpb24vcmVwbGllcyBpbiBzZWNvbmRzIik7Ci0KLXN0YXRpYyBpbnQgaGVscChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCi0JCXN0cnVjdCBpcF9jb25udHJhY2sgKmN0LCBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbykKLXsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqZXhwOwotCXN0cnVjdCBpcGhkciAqaXBoID0gKCpwc2tiKS0+bmguaXBoOwotCXN0cnVjdCBydGFibGUgKnJ0ID0gKHN0cnVjdCBydGFibGUgKikoKnBza2IpLT5kc3Q7Ci0Jc3RydWN0IGluX2RldmljZSAqaW5fZGV2OwotCV9fYmUzMiBtYXNrID0gMDsKLQotCS8qIHdlJ3JlIG9ubHkgaW50ZXJlc3RlZCBpbiBsb2NhbGx5IGdlbmVyYXRlZCBwYWNrZXRzICovCi0JaWYgKCgqcHNrYiktPnNrID09IE5VTEwpCi0JCWdvdG8gb3V0OwotCWlmIChydCA9PSBOVUxMIHx8ICEocnQtPnJ0X2ZsYWdzICYgUlRDRl9CUk9BRENBU1QpKQotCQlnb3RvIG91dDsKLQlpZiAoQ1RJTkZPMkRJUihjdGluZm8pICE9IElQX0NUX0RJUl9PUklHSU5BTCkKLQkJZ290byBvdXQ7Ci0KLQlyY3VfcmVhZF9sb2NrKCk7Ci0JaW5fZGV2ID0gX19pbl9kZXZfZ2V0X3JjdShydC0+dS5kc3QuZGV2KTsKLQlpZiAoaW5fZGV2ICE9IE5VTEwpIHsKLQkJZm9yX3ByaW1hcnlfaWZhKGluX2RldikgewotCQkJaWYgKGlmYS0+aWZhX2Jyb2FkY2FzdCA9PSBpcGgtPmRhZGRyKSB7Ci0JCQkJbWFzayA9IGlmYS0+aWZhX21hc2s7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0gZW5kZm9yX2lmYShpbl9kZXYpOwotCX0KLQlyY3VfcmVhZF91bmxvY2soKTsKLQotCWlmIChtYXNrID09IDApCi0JCWdvdG8gb3V0OwotCi0JZXhwID0gaXBfY29ubnRyYWNrX2V4cGVjdF9hbGxvYyhjdCk7Ci0JaWYgKGV4cCA9PSBOVUxMKQotCQlnb3RvIG91dDsKLQotCWV4cC0+dHVwbGUgICAgICAgICAgICAgICAgPSBjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0udHVwbGU7Ci0JZXhwLT50dXBsZS5zcmMudS51ZHAucG9ydCA9IGh0b25zKE5NQkRfUE9SVCk7Ci0KLQlleHAtPm1hc2suc3JjLmlwICAgICAgICAgID0gbWFzazsKLQlleHAtPm1hc2suc3JjLnUudWRwLnBvcnQgID0gaHRvbnMoMHhGRkZGKTsKLQlleHAtPm1hc2suZHN0LmlwICAgICAgICAgID0gaHRvbmwoMHhGRkZGRkZGRik7Ci0JZXhwLT5tYXNrLmRzdC51LnVkcC5wb3J0ICA9IGh0b25zKDB4RkZGRik7Ci0JZXhwLT5tYXNrLmRzdC5wcm90b251bSAgICA9IDB4RkY7Ci0KLQlleHAtPmV4cGVjdGZuICAgICAgICAgICAgID0gTlVMTDsKLQlleHAtPmZsYWdzICAgICAgICAgICAgICAgID0gSVBfQ1RfRVhQRUNUX1BFUk1BTkVOVDsKLQotCWlwX2Nvbm50cmFja19leHBlY3RfcmVsYXRlZChleHApOwotCWlwX2Nvbm50cmFja19leHBlY3RfcHV0KGV4cCk7Ci0KLQlpcF9jdF9yZWZyZXNoKGN0LCAqcHNrYiwgdGltZW91dCAqIEhaKTsKLW91dDoKLQlyZXR1cm4gTkZfQUNDRVBUOwotfQotCi1zdGF0aWMgc3RydWN0IGlwX2Nvbm50cmFja19oZWxwZXIgaGVscGVyID0gewotCS5uYW1lCQkJPSAibmV0Ymlvcy1ucyIsCi0JLnR1cGxlID0gewotCQkuc3JjID0gewotCQkJLnUgPSB7Ci0JCQkJLnVkcCA9IHsKLQkJCQkJLnBvcnQJPSBfX2NvbnN0YW50X2h0b25zKE5NQkRfUE9SVCksCi0JCQkJfQotCQkJfQotCQl9LAotCQkuZHN0ID0gewotCQkJLnByb3RvbnVtCT0gSVBQUk9UT19VRFAsCi0JCX0sCi0JfSwKLQkubWFzayA9IHsKLQkJLnNyYyA9IHsKLQkJCS51ID0gewotCQkJCS51ZHAgPSB7Ci0JCQkJCS5wb3J0CT0gX19jb25zdGFudF9odG9ucygweEZGRkYpLAotCQkJCX0KLQkJCX0KLQkJfSwKLQkJLmRzdCA9IHsKLQkJCS5wcm90b251bQk9IDB4RkYsCi0JCX0sCi0JfSwKLQkubWF4X2V4cGVjdGVkCQk9IDEsCi0JLm1lCQkJPSBUSElTX01PRFVMRSwKLQkuaGVscAkJCT0gaGVscCwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGlwX2Nvbm50cmFja19uZXRiaW9zX25zX2luaXQodm9pZCkKLXsKLQloZWxwZXIudGltZW91dCA9IHRpbWVvdXQ7Ci0JcmV0dXJuIGlwX2Nvbm50cmFja19oZWxwZXJfcmVnaXN0ZXIoJmhlbHBlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBpcF9jb25udHJhY2tfbmV0Ymlvc19uc19maW5pKHZvaWQpCi17Ci0JaXBfY29ubnRyYWNrX2hlbHBlcl91bnJlZ2lzdGVyKCZoZWxwZXIpOwotfQotCi1tb2R1bGVfaW5pdChpcF9jb25udHJhY2tfbmV0Ymlvc19uc19pbml0KTsKLW1vZHVsZV9leGl0KGlwX2Nvbm50cmFja19uZXRiaW9zX25zX2ZpbmkpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19uZXRsaW5rLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX25ldGxpbmsuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTIyOGI3NmMuLjAwMDAwMDAKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19uZXRsaW5rLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTc3ICswLDAgQEAKLS8qIENvbm5lY3Rpb24gdHJhY2tpbmcgdmlhIG5ldGxpbmsgc29ja2V0LiBBbGxvd3MgZm9yIHVzZXIgc3BhY2UKLSAqIHByb3RvY29sIGhlbHBlcnMgYW5kIGdlbmVyYWwgdHJvdWJsZSBtYWtpbmcgZnJvbSB1c2Vyc3BhY2UuCi0gKgotICogKEMpIDIwMDEgYnkgSmF5IFNjaHVsaXN0IDxqc2NobHN0QHNhbWJhLm9yZz4KLSAqIChDKSAyMDAyLTIwMDUgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KLSAqIChDKSAyMDAzIGJ5IFBhdHJpY2sgTWNoYXJkeSA8a2FiZXJAdHJhc2gubmV0PgotICogKEMpIDIwMDUtMjAwNiBieSBQYWJsbyBOZWlyYSBBeXVzbyA8cGFibG9AZXVyb2Rldi5uZXQ+Ci0gKgotICogSSd2ZSByZXdvcmtlZCB0aGlzIHN0dWZmIHRvIHVzZSBhdHRyaWJ1dGVzIGluc3RlYWQgb2YgY29ubnRyYWNrCi0gKiBzdHJ1Y3R1cmVzLiA1LjQ0IGFtLiBJIG5lZWQgbW9yZSB0ZWEuIC0tcGFibG8gMDUvMDcvMTEuCi0gKgotICogSW5pdGlhbCBjb25uZWN0aW9uIHRyYWNraW5nIHZpYSBuZXRsaW5rIGRldmVsb3BtZW50IGZ1bmRlZCBhbmQKLSAqIGdlbmVyYWxseSBtYWRlIHBvc3NpYmxlIGJ5IE5ldHdvcmsgUm9ib3RzLCBJbmMuICh3d3cubmV0d29ya3JvYm90cy5jb20pCi0gKgotICogRnVydGhlciBkZXZlbG9wbWVudCBvZiB0aGlzIGNvZGUgZnVuZGVkIGJ5IEFzdGFybyBBRyAoaHR0cDovL3d3dy5hc3Rhcm8uY29tKQotICoKLSAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKLSAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+Ci0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgotCi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2NvcmUuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfaGVscGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX3Byb3RvY29sLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0X3Byb3RvY29sLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIvbmZuZXRsaW5rLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL25mbmV0bGlua19jb25udHJhY2suaD4KLQotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi1zdGF0aWMgY2hhciBfX2luaXRkYXRhIHZlcnNpb25bXSA9ICIwLjkwIjsKLQotc3RhdGljIGlubGluZSBpbnQKLWN0bmV0bGlua19kdW1wX3R1cGxlc19wcm90byhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJICAgIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnR1cGxlLAotCQkJICAgIHN0cnVjdCBpcF9jb25udHJhY2tfcHJvdG9jb2wgKnByb3RvKQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBuZmF0dHIgKm5lc3RfcGFybXMgPSBORkFfTkVTVChza2IsIENUQV9UVVBMRV9QUk9UTyk7Ci0KLQlORkFfUFVUKHNrYiwgQ1RBX1BST1RPX05VTSwgc2l6ZW9mKHVfaW50OF90KSwgJnR1cGxlLT5kc3QucHJvdG9udW0pOwotCi0JaWYgKGxpa2VseShwcm90by0+dHVwbGVfdG9fbmZhdHRyKSkKLQkJcmV0ID0gcHJvdG8tPnR1cGxlX3RvX25mYXR0cihza2IsIHR1cGxlKTsKLQotCU5GQV9ORVNUX0VORChza2IsIG5lc3RfcGFybXMpOwotCi0JcmV0dXJuIHJldDsKLQotbmZhdHRyX2ZhaWx1cmU6Ci0JcmV0dXJuIC0xOwotfQotCi1zdGF0aWMgaW5saW5lIGludAotY3RuZXRsaW5rX2R1bXBfdHVwbGVzX2lwKHN0cnVjdCBza19idWZmICpza2IsCi0JCQkgY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUpCi17Ci0Jc3RydWN0IG5mYXR0ciAqbmVzdF9wYXJtcyA9IE5GQV9ORVNUKHNrYiwgQ1RBX1RVUExFX0lQKTsKLQotCU5GQV9QVVQoc2tiLCBDVEFfSVBfVjRfU1JDLCBzaXplb2YoX19iZTMyKSwgJnR1cGxlLT5zcmMuaXApOwotCU5GQV9QVVQoc2tiLCBDVEFfSVBfVjRfRFNULCBzaXplb2YoX19iZTMyKSwgJnR1cGxlLT5kc3QuaXApOwotCi0JTkZBX05FU1RfRU5EKHNrYiwgbmVzdF9wYXJtcyk7Ci0KLQlyZXR1cm4gMDsKLQotbmZhdHRyX2ZhaWx1cmU6Ci0JcmV0dXJuIC0xOwotfQotCi1zdGF0aWMgaW5saW5lIGludAotY3RuZXRsaW5rX2R1bXBfdHVwbGVzKHN0cnVjdCBza19idWZmICpza2IsCi0JCSAgICAgIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnR1cGxlKQotewotCWludCByZXQ7Ci0Jc3RydWN0IGlwX2Nvbm50cmFja19wcm90b2NvbCAqcHJvdG87Ci0KLQlyZXQgPSBjdG5ldGxpbmtfZHVtcF90dXBsZXNfaXAoc2tiLCB0dXBsZSk7Ci0JaWYgKHVubGlrZWx5KHJldCA8IDApKQotCQlyZXR1cm4gcmV0OwotCi0JcHJvdG8gPSBpcF9jb25udHJhY2tfcHJvdG9fZmluZF9nZXQodHVwbGUtPmRzdC5wcm90b251bSk7Ci0JcmV0ID0gY3RuZXRsaW5rX2R1bXBfdHVwbGVzX3Byb3RvKHNrYiwgdHVwbGUsIHByb3RvKTsKLQlpcF9jb25udHJhY2tfcHJvdG9fcHV0KHByb3RvKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1jdG5ldGxpbmtfZHVtcF9zdGF0dXMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFjayAqY3QpCi17Ci0JX19iZTMyIHN0YXR1cyA9IGh0b25sKCh1X2ludDMyX3QpIGN0LT5zdGF0dXMpOwotCU5GQV9QVVQoc2tiLCBDVEFfU1RBVFVTLCBzaXplb2Yoc3RhdHVzKSwgJnN0YXR1cyk7Ci0JcmV0dXJuIDA7Ci0KLW5mYXR0cl9mYWlsdXJlOgotCXJldHVybiAtMTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQKLWN0bmV0bGlua19kdW1wX3RpbWVvdXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFjayAqY3QpCi17Ci0JbG9uZyB0aW1lb3V0X2wgPSBjdC0+dGltZW91dC5leHBpcmVzIC0gamlmZmllczsKLQlfX2JlMzIgdGltZW91dDsKLQotCWlmICh0aW1lb3V0X2wgPCAwKQotCQl0aW1lb3V0ID0gMDsKLQllbHNlCi0JCXRpbWVvdXQgPSBodG9ubCh0aW1lb3V0X2wgLyBIWik7Ci0KLQlORkFfUFVUKHNrYiwgQ1RBX1RJTUVPVVQsIHNpemVvZih0aW1lb3V0KSwgJnRpbWVvdXQpOwotCXJldHVybiAwOwotCi1uZmF0dHJfZmFpbHVyZToKLQlyZXR1cm4gLTE7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1jdG5ldGxpbmtfZHVtcF9wcm90b2luZm8oc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFjayAqY3QpCi17Ci0Jc3RydWN0IGlwX2Nvbm50cmFja19wcm90b2NvbCAqcHJvdG8gPSBpcF9jb25udHJhY2tfcHJvdG9fZmluZF9nZXQoY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLmRzdC5wcm90b251bSk7Ci0KLQlzdHJ1Y3QgbmZhdHRyICpuZXN0X3Byb3RvOwotCWludCByZXQ7Ci0KLQlpZiAoIXByb3RvLT50b19uZmF0dHIpIHsKLQkJaXBfY29ubnRyYWNrX3Byb3RvX3B1dChwcm90byk7Ci0JCXJldHVybiAwOwotCX0KLQotCW5lc3RfcHJvdG8gPSBORkFfTkVTVChza2IsIENUQV9QUk9UT0lORk8pOwotCi0JcmV0ID0gcHJvdG8tPnRvX25mYXR0cihza2IsIG5lc3RfcHJvdG8sIGN0KTsKLQotCWlwX2Nvbm50cmFja19wcm90b19wdXQocHJvdG8pOwotCi0JTkZBX05FU1RfRU5EKHNrYiwgbmVzdF9wcm90byk7Ci0KLQlyZXR1cm4gcmV0OwotCi1uZmF0dHJfZmFpbHVyZToKLQlpcF9jb25udHJhY2tfcHJvdG9fcHV0KHByb3RvKTsKLQlyZXR1cm4gLTE7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1jdG5ldGxpbmtfZHVtcF9oZWxwaW5mbyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCkKLXsKLQlzdHJ1Y3QgbmZhdHRyICpuZXN0X2hlbHBlcjsKLQotCWlmICghY3QtPmhlbHBlcikKLQkJcmV0dXJuIDA7Ci0KLQluZXN0X2hlbHBlciA9IE5GQV9ORVNUKHNrYiwgQ1RBX0hFTFApOwotCU5GQV9QVVQoc2tiLCBDVEFfSEVMUF9OQU1FLCBzdHJsZW4oY3QtPmhlbHBlci0+bmFtZSksIGN0LT5oZWxwZXItPm5hbWUpOwotCi0JaWYgKGN0LT5oZWxwZXItPnRvX25mYXR0cikKLQkJY3QtPmhlbHBlci0+dG9fbmZhdHRyKHNrYiwgY3QpOwotCi0JTkZBX05FU1RfRU5EKHNrYiwgbmVzdF9oZWxwZXIpOwotCi0JcmV0dXJuIDA7Ci0KLW5mYXR0cl9mYWlsdXJlOgotCXJldHVybiAtMTsKLX0KLQotI2lmZGVmIENPTkZJR19JUF9ORl9DVF9BQ0NUCi1zdGF0aWMgaW5saW5lIGludAotY3RuZXRsaW5rX2R1bXBfY291bnRlcnMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsCi0JCQllbnVtIGlwX2Nvbm50cmFja19kaXIgZGlyKQotewotCWVudW0gY3RhdHRyX3R5cGUgdHlwZSA9IGRpciA/IENUQV9DT1VOVEVSU19SRVBMWTogQ1RBX0NPVU5URVJTX09SSUc7Ci0Jc3RydWN0IG5mYXR0ciAqbmVzdF9jb3VudCA9IE5GQV9ORVNUKHNrYiwgdHlwZSk7Ci0JX19iZTMyIHRtcDsKLQotCXRtcCA9IGh0b25sKGN0LT5jb3VudGVyc1tkaXJdLnBhY2tldHMpOwotCU5GQV9QVVQoc2tiLCBDVEFfQ09VTlRFUlMzMl9QQUNLRVRTLCBzaXplb2YoX19iZTMyKSwgJnRtcCk7Ci0KLQl0bXAgPSBodG9ubChjdC0+Y291bnRlcnNbZGlyXS5ieXRlcyk7Ci0JTkZBX1BVVChza2IsIENUQV9DT1VOVEVSUzMyX0JZVEVTLCBzaXplb2YoX19iZTMyKSwgJnRtcCk7Ci0KLQlORkFfTkVTVF9FTkQoc2tiLCBuZXN0X2NvdW50KTsKLQotCXJldHVybiAwOwotCi1uZmF0dHJfZmFpbHVyZToKLQlyZXR1cm4gLTE7Ci19Ci0jZWxzZQotI2RlZmluZSBjdG5ldGxpbmtfZHVtcF9jb3VudGVycyhhLCBiLCBjKSAoMCkKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX0lQX05GX0NPTk5UUkFDS19NQVJLCi1zdGF0aWMgaW5saW5lIGludAotY3RuZXRsaW5rX2R1bXBfbWFyayhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCkKLXsKLQlfX2JlMzIgbWFyayA9IGh0b25sKGN0LT5tYXJrKTsKLQotCU5GQV9QVVQoc2tiLCBDVEFfTUFSSywgc2l6ZW9mKF9fYmUzMiksICZtYXJrKTsKLQlyZXR1cm4gMDsKLQotbmZhdHRyX2ZhaWx1cmU6Ci0JcmV0dXJuIC0xOwotfQotI2Vsc2UKLSNkZWZpbmUgY3RuZXRsaW5rX2R1bXBfbWFyayhhLCBiKSAoMCkKLSNlbmRpZgotCi1zdGF0aWMgaW5saW5lIGludAotY3RuZXRsaW5rX2R1bXBfaWQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFjayAqY3QpCi17Ci0JX19iZTMyIGlkID0gaHRvbmwoY3QtPmlkKTsKLQlORkFfUFVUKHNrYiwgQ1RBX0lELCBzaXplb2YoX19iZTMyKSwgJmlkKTsKLQlyZXR1cm4gMDsKLQotbmZhdHRyX2ZhaWx1cmU6Ci0JcmV0dXJuIC0xOwotfQotCi1zdGF0aWMgaW5saW5lIGludAotY3RuZXRsaW5rX2R1bXBfdXNlKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2sgKmN0KQotewotCV9fYmUzMiB1c2UgPSBodG9ubChhdG9taWNfcmVhZCgmY3QtPmN0X2dlbmVyYWwudXNlKSk7Ci0KLQlORkFfUFVUKHNrYiwgQ1RBX1VTRSwgc2l6ZW9mKF9fYmUzMiksICZ1c2UpOwotCXJldHVybiAwOwotCi1uZmF0dHJfZmFpbHVyZToKLQlyZXR1cm4gLTE7Ci19Ci0KLSNkZWZpbmUgdHVwbGUoY3QsIGRpcikgKCYoY3QpLT50dXBsZWhhc2hbZGlyXS50dXBsZSkKLQotc3RhdGljIGludAotY3RuZXRsaW5rX2ZpbGxfaW5mbyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgcGlkLCB1MzIgc2VxLAotCQkgICAgaW50IGV2ZW50LCBpbnQgbm93YWl0LAotCQkgICAgY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFjayAqY3QpCi17Ci0Jc3RydWN0IG5sbXNnaGRyICpubGg7Ci0Jc3RydWN0IG5mZ2VubXNnICpuZm1zZzsKLQlzdHJ1Y3QgbmZhdHRyICpuZXN0X3Bhcm1zOwotCXVuc2lnbmVkIGNoYXIgKmI7Ci0KLQliID0gc2tiLT50YWlsOwotCi0JZXZlbnQgfD0gTkZOTF9TVUJTWVNfQ1RORVRMSU5LIDw8IDg7Ci0JbmxoICAgID0gTkxNU0dfUFVUKHNrYiwgcGlkLCBzZXEsIGV2ZW50LCBzaXplb2Yoc3RydWN0IG5mZ2VubXNnKSk7Ci0JbmZtc2cgID0gTkxNU0dfREFUQShubGgpOwotCi0JbmxoLT5ubG1zZ19mbGFncyAgICA9IChub3dhaXQgJiYgcGlkKSA/IE5MTV9GX01VTFRJIDogMDsKLQluZm1zZy0+bmZnZW5fZmFtaWx5ID0gQUZfSU5FVDsKLQluZm1zZy0+dmVyc2lvbiAgICAgID0gTkZORVRMSU5LX1YwOwotCW5mbXNnLT5yZXNfaWQJICAgID0gMDsKLQotCW5lc3RfcGFybXMgPSBORkFfTkVTVChza2IsIENUQV9UVVBMRV9PUklHKTsKLQlpZiAoY3RuZXRsaW5rX2R1bXBfdHVwbGVzKHNrYiwgdHVwbGUoY3QsIElQX0NUX0RJUl9PUklHSU5BTCkpIDwgMCkKLQkJZ290byBuZmF0dHJfZmFpbHVyZTsKLQlORkFfTkVTVF9FTkQoc2tiLCBuZXN0X3Bhcm1zKTsKLQotCW5lc3RfcGFybXMgPSBORkFfTkVTVChza2IsIENUQV9UVVBMRV9SRVBMWSk7Ci0JaWYgKGN0bmV0bGlua19kdW1wX3R1cGxlcyhza2IsIHR1cGxlKGN0LCBJUF9DVF9ESVJfUkVQTFkpKSA8IDApCi0JCWdvdG8gbmZhdHRyX2ZhaWx1cmU7Ci0JTkZBX05FU1RfRU5EKHNrYiwgbmVzdF9wYXJtcyk7Ci0KLQlpZiAoY3RuZXRsaW5rX2R1bXBfc3RhdHVzKHNrYiwgY3QpIDwgMCB8fAotCSAgICBjdG5ldGxpbmtfZHVtcF90aW1lb3V0KHNrYiwgY3QpIDwgMCB8fAotCSAgICBjdG5ldGxpbmtfZHVtcF9jb3VudGVycyhza2IsIGN0LCBJUF9DVF9ESVJfT1JJR0lOQUwpIDwgMCB8fAotCSAgICBjdG5ldGxpbmtfZHVtcF9jb3VudGVycyhza2IsIGN0LCBJUF9DVF9ESVJfUkVQTFkpIDwgMCB8fAotCSAgICBjdG5ldGxpbmtfZHVtcF9wcm90b2luZm8oc2tiLCBjdCkgPCAwIHx8Ci0JICAgIGN0bmV0bGlua19kdW1wX2hlbHBpbmZvKHNrYiwgY3QpIDwgMCB8fAotCSAgICBjdG5ldGxpbmtfZHVtcF9tYXJrKHNrYiwgY3QpIDwgMCB8fAotCSAgICBjdG5ldGxpbmtfZHVtcF9pZChza2IsIGN0KSA8IDAgfHwKLQkgICAgY3RuZXRsaW5rX2R1bXBfdXNlKHNrYiwgY3QpIDwgMCkKLQkJZ290byBuZmF0dHJfZmFpbHVyZTsKLQotCW5saC0+bmxtc2dfbGVuID0gc2tiLT50YWlsIC0gYjsKLQlyZXR1cm4gc2tiLT5sZW47Ci0KLW5sbXNnX2ZhaWx1cmU6Ci1uZmF0dHJfZmFpbHVyZToKLQlza2JfdHJpbShza2IsIGIgLSBza2ItPmRhdGEpOwotCXJldHVybiAtMTsKLX0KLQotI2lmZGVmIENPTkZJR19JUF9ORl9DT05OVFJBQ0tfRVZFTlRTCi1zdGF0aWMgaW50IGN0bmV0bGlua19jb25udHJhY2tfZXZlbnQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLAotCQkJCSAgICAgdW5zaWduZWQgbG9uZyBldmVudHMsIHZvaWQgKnB0cikKLXsKLQlzdHJ1Y3Qgbmxtc2doZHIgKm5saDsKLQlzdHJ1Y3QgbmZnZW5tc2cgKm5mbXNnOwotCXN0cnVjdCBuZmF0dHIgKm5lc3RfcGFybXM7Ci0Jc3RydWN0IGlwX2Nvbm50cmFjayAqY3QgPSAoc3RydWN0IGlwX2Nvbm50cmFjayAqKXB0cjsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCXVuc2lnbmVkIGludCB0eXBlOwotCXVuc2lnbmVkIGNoYXIgKmI7Ci0JdW5zaWduZWQgaW50IGZsYWdzID0gMCwgZ3JvdXA7Ci0KLQkvKiBpZ25vcmUgb3VyIGZha2UgY29ubnRyYWNrIGVudHJ5ICovCi0JaWYgKGN0ID09ICZpcF9jb25udHJhY2tfdW50cmFja2VkKQotCQlyZXR1cm4gTk9USUZZX0RPTkU7Ci0KLQlpZiAoZXZlbnRzICYgSVBDVF9ERVNUUk9ZKSB7Ci0JCXR5cGUgPSBJUENUTkxfTVNHX0NUX0RFTEVURTsKLQkJZ3JvdXAgPSBORk5MR1JQX0NPTk5UUkFDS19ERVNUUk9ZOwotCX0gZWxzZSBpZiAoZXZlbnRzICYgKElQQ1RfTkVXIHwgSVBDVF9SRUxBVEVEKSkgewotCQl0eXBlID0gSVBDVE5MX01TR19DVF9ORVc7Ci0JCWZsYWdzID0gTkxNX0ZfQ1JFQVRFfE5MTV9GX0VYQ0w7Ci0JCWdyb3VwID0gTkZOTEdSUF9DT05OVFJBQ0tfTkVXOwotCX0gZWxzZSBpZiAoZXZlbnRzICYgKElQQ1RfU1RBVFVTIHwgSVBDVF9QUk9UT0lORk8pKSB7Ci0JCXR5cGUgPSBJUENUTkxfTVNHX0NUX05FVzsKLQkJZ3JvdXAgPSBORk5MR1JQX0NPTk5UUkFDS19VUERBVEU7Ci0JfSBlbHNlCi0JCXJldHVybiBOT1RJRllfRE9ORTsKLQotCWlmICghbmZuZXRsaW5rX2hhc19saXN0ZW5lcnMoZ3JvdXApKQotCQlyZXR1cm4gTk9USUZZX0RPTkU7Ci0KLQlza2IgPSBhbGxvY19za2IoTkxNU0dfR09PRFNJWkUsIEdGUF9BVE9NSUMpOwotCWlmICghc2tiKQotCQlyZXR1cm4gTk9USUZZX0RPTkU7Ci0KLQliID0gc2tiLT50YWlsOwotCi0JdHlwZSB8PSBORk5MX1NVQlNZU19DVE5FVExJTksgPDwgODsKLQlubGggICA9IE5MTVNHX1BVVChza2IsIDAsIDAsIHR5cGUsIHNpemVvZihzdHJ1Y3QgbmZnZW5tc2cpKTsKLQluZm1zZyA9IE5MTVNHX0RBVEEobmxoKTsKLQotCW5saC0+bmxtc2dfZmxhZ3MgICAgPSBmbGFnczsKLQluZm1zZy0+bmZnZW5fZmFtaWx5ID0gQUZfSU5FVDsKLQluZm1zZy0+dmVyc2lvbgk9IE5GTkVUTElOS19WMDsKLQluZm1zZy0+cmVzX2lkCT0gMDsKLQotCW5lc3RfcGFybXMgPSBORkFfTkVTVChza2IsIENUQV9UVVBMRV9PUklHKTsKLQlpZiAoY3RuZXRsaW5rX2R1bXBfdHVwbGVzKHNrYiwgdHVwbGUoY3QsIElQX0NUX0RJUl9PUklHSU5BTCkpIDwgMCkKLQkJZ290byBuZmF0dHJfZmFpbHVyZTsKLQlORkFfTkVTVF9FTkQoc2tiLCBuZXN0X3Bhcm1zKTsKLQotCW5lc3RfcGFybXMgPSBORkFfTkVTVChza2IsIENUQV9UVVBMRV9SRVBMWSk7Ci0JaWYgKGN0bmV0bGlua19kdW1wX3R1cGxlcyhza2IsIHR1cGxlKGN0LCBJUF9DVF9ESVJfUkVQTFkpKSA8IDApCi0JCWdvdG8gbmZhdHRyX2ZhaWx1cmU7Ci0JTkZBX05FU1RfRU5EKHNrYiwgbmVzdF9wYXJtcyk7Ci0KLQlpZiAoZXZlbnRzICYgSVBDVF9ERVNUUk9ZKSB7Ci0JCWlmIChjdG5ldGxpbmtfZHVtcF9jb3VudGVycyhza2IsIGN0LCBJUF9DVF9ESVJfT1JJR0lOQUwpIDwgMCB8fAotCQkgICAgY3RuZXRsaW5rX2R1bXBfY291bnRlcnMoc2tiLCBjdCwgSVBfQ1RfRElSX1JFUExZKSA8IDApCi0JCQlnb3RvIG5mYXR0cl9mYWlsdXJlOwotCX0gZWxzZSB7Ci0JCWlmIChjdG5ldGxpbmtfZHVtcF9zdGF0dXMoc2tiLCBjdCkgPCAwKQotCQkJZ290byBuZmF0dHJfZmFpbHVyZTsKLQotCQlpZiAoY3RuZXRsaW5rX2R1bXBfdGltZW91dChza2IsIGN0KSA8IDApCi0JCQlnb3RvIG5mYXR0cl9mYWlsdXJlOwotCi0JCWlmIChldmVudHMgJiBJUENUX1BST1RPSU5GTwotCQkgICAgJiYgY3RuZXRsaW5rX2R1bXBfcHJvdG9pbmZvKHNrYiwgY3QpIDwgMCkKLQkJCWdvdG8gbmZhdHRyX2ZhaWx1cmU7Ci0KLQkJaWYgKChldmVudHMgJiBJUENUX0hFTFBFUiB8fCBjdC0+aGVscGVyKQotCQkgICAgJiYgY3RuZXRsaW5rX2R1bXBfaGVscGluZm8oc2tiLCBjdCkgPCAwKQotCQkJZ290byBuZmF0dHJfZmFpbHVyZTsKLQotI2lmZGVmIENPTkZJR19JUF9ORl9DT05OVFJBQ0tfTUFSSwotCQlpZiAoKGV2ZW50cyAmIElQQ1RfTUFSSyB8fCBjdC0+bWFyaykKLQkJICAgICYmIGN0bmV0bGlua19kdW1wX21hcmsoc2tiLCBjdCkgPCAwKQotCQkJZ290byBuZmF0dHJfZmFpbHVyZTsKLSNlbmRpZgotCi0JCWlmIChldmVudHMgJiBJUENUX0NPVU5URVJfRklMTElORyAmJgotCQkgICAgKGN0bmV0bGlua19kdW1wX2NvdW50ZXJzKHNrYiwgY3QsIElQX0NUX0RJUl9PUklHSU5BTCkgPCAwIHx8Ci0JCSAgICAgY3RuZXRsaW5rX2R1bXBfY291bnRlcnMoc2tiLCBjdCwgSVBfQ1RfRElSX1JFUExZKSA8IDApKQotCQkJZ290byBuZmF0dHJfZmFpbHVyZTsKLQl9Ci0KLQlubGgtPm5sbXNnX2xlbiA9IHNrYi0+dGFpbCAtIGI7Ci0JbmZuZXRsaW5rX3NlbmQoc2tiLCAwLCBncm91cCwgMCk7Ci0JcmV0dXJuIE5PVElGWV9ET05FOwotCi1ubG1zZ19mYWlsdXJlOgotbmZhdHRyX2ZhaWx1cmU6Ci0Ja2ZyZWVfc2tiKHNrYik7Ci0JcmV0dXJuIE5PVElGWV9ET05FOwotfQotI2VuZGlmIC8qIENPTkZJR19JUF9ORl9DT05OVFJBQ0tfRVZFTlRTICovCi0KLXN0YXRpYyBpbnQgY3RuZXRsaW5rX2RvbmUoc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKQotewotCWlmIChjYi0+YXJnc1sxXSkKLQkJaXBfY29ubnRyYWNrX3B1dCgoc3RydWN0IGlwX2Nvbm50cmFjayAqKWNiLT5hcmdzWzFdKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotY3RuZXRsaW5rX2R1bXBfdGFibGUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKQotewotCXN0cnVjdCBpcF9jb25udHJhY2sgKmN0LCAqbGFzdDsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlX2hhc2ggKmg7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqaTsKLQotCXJlYWRfbG9ja19iaCgmaXBfY29ubnRyYWNrX2xvY2spOwotCWxhc3QgPSAoc3RydWN0IGlwX2Nvbm50cmFjayAqKWNiLT5hcmdzWzFdOwotCWZvciAoOyBjYi0+YXJnc1swXSA8IGlwX2Nvbm50cmFja19odGFibGVfc2l6ZTsgY2ItPmFyZ3NbMF0rKykgewotcmVzdGFydDoKLQkJbGlzdF9mb3JfZWFjaF9wcmV2KGksICZpcF9jb25udHJhY2tfaGFzaFtjYi0+YXJnc1swXV0pIHsKLQkJCWggPSAoc3RydWN0IGlwX2Nvbm50cmFja190dXBsZV9oYXNoICopIGk7Ci0JCQlpZiAoRElSRUNUSU9OKGgpICE9IElQX0NUX0RJUl9PUklHSU5BTCkKLQkJCQljb250aW51ZTsKLQkJCWN0ID0gdHVwbGVoYXNoX3RvX2N0cmFjayhoKTsKLQkJCWlmIChjYi0+YXJnc1sxXSkgewotCQkJCWlmIChjdCAhPSBsYXN0KQotCQkJCQljb250aW51ZTsKLQkJCQljYi0+YXJnc1sxXSA9IDA7Ci0JCQl9Ci0JCQlpZiAoY3RuZXRsaW5rX2ZpbGxfaW5mbyhza2IsIE5FVExJTktfQ0IoY2ItPnNrYikucGlkLAotCQkJCQkJY2ItPm5saC0+bmxtc2dfc2VxLAotCQkJCQkJSVBDVE5MX01TR19DVF9ORVcsCi0JCQkJCQkxLCBjdCkgPCAwKSB7Ci0JCQkJbmZfY29ubnRyYWNrX2dldCgmY3QtPmN0X2dlbmVyYWwpOwotCQkJCWNiLT5hcmdzWzFdID0gKHVuc2lnbmVkIGxvbmcpY3Q7Ci0JCQkJZ290byBvdXQ7Ci0JCQl9Ci0jaWZkZWYgQ09ORklHX05GX0NUX0FDQ1QKLQkJCWlmIChORk5MX01TR19UWVBFKGNiLT5ubGgtPm5sbXNnX3R5cGUpID09Ci0JCQkJCQlJUENUTkxfTVNHX0NUX0dFVF9DVFJaRVJPKQotCQkJCW1lbXNldCgmY3QtPmNvdW50ZXJzLCAwLCBzaXplb2YoY3QtPmNvdW50ZXJzKSk7Ci0jZW5kaWYKLQkJfQotCQlpZiAoY2ItPmFyZ3NbMV0pIHsKLQkJCWNiLT5hcmdzWzFdID0gMDsKLQkJCWdvdG8gcmVzdGFydDsKLQkJfQotCX0KLW91dDoKLQlyZWFkX3VubG9ja19iaCgmaXBfY29ubnRyYWNrX2xvY2spOwotCWlmIChsYXN0KQotCQlpcF9jb25udHJhY2tfcHV0KGxhc3QpOwotCi0JcmV0dXJuIHNrYi0+bGVuOwotfQotCi1zdGF0aWMgY29uc3Qgc2l6ZV90IGN0YV9taW5faXBbQ1RBX0lQX01BWF0gPSB7Ci0JW0NUQV9JUF9WNF9TUkMtMV0JPSBzaXplb2YoX19iZTMyKSwKLQlbQ1RBX0lQX1Y0X0RTVC0xXQk9IHNpemVvZihfX2JlMzIpLAotfTsKLQotc3RhdGljIGlubGluZSBpbnQKLWN0bmV0bGlua19wYXJzZV90dXBsZV9pcChzdHJ1Y3QgbmZhdHRyICphdHRyLCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0dXBsZSkKLXsKLQlzdHJ1Y3QgbmZhdHRyICp0YltDVEFfSVBfTUFYXTsKLQotCW5mYXR0cl9wYXJzZV9uZXN0ZWQodGIsIENUQV9JUF9NQVgsIGF0dHIpOwotCi0JaWYgKG5mYXR0cl9iYWRfc2l6ZSh0YiwgQ1RBX0lQX01BWCwgY3RhX21pbl9pcCkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKCF0YltDVEFfSVBfVjRfU1JDLTFdKQotCQlyZXR1cm4gLUVJTlZBTDsKLQl0dXBsZS0+c3JjLmlwID0gKihfX2JlMzIgKilORkFfREFUQSh0YltDVEFfSVBfVjRfU1JDLTFdKTsKLQotCWlmICghdGJbQ1RBX0lQX1Y0X0RTVC0xXSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JdHVwbGUtPmRzdC5pcCA9ICooX19iZTMyICopTkZBX0RBVEEodGJbQ1RBX0lQX1Y0X0RTVC0xXSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHNpemVfdCBjdGFfbWluX3Byb3RvW0NUQV9QUk9UT19NQVhdID0gewotCVtDVEFfUFJPVE9fTlVNLTFdCT0gc2l6ZW9mKHVfaW50OF90KSwKLQlbQ1RBX1BST1RPX1NSQ19QT1JULTFdCT0gc2l6ZW9mKHVfaW50MTZfdCksCi0JW0NUQV9QUk9UT19EU1RfUE9SVC0xXQk9IHNpemVvZih1X2ludDE2X3QpLAotCVtDVEFfUFJPVE9fSUNNUF9UWVBFLTFdCT0gc2l6ZW9mKHVfaW50OF90KSwKLQlbQ1RBX1BST1RPX0lDTVBfQ09ERS0xXQk9IHNpemVvZih1X2ludDhfdCksCi0JW0NUQV9QUk9UT19JQ01QX0lELTFdCT0gc2l6ZW9mKHVfaW50MTZfdCksCi19OwotCi1zdGF0aWMgaW5saW5lIGludAotY3RuZXRsaW5rX3BhcnNlX3R1cGxlX3Byb3RvKHN0cnVjdCBuZmF0dHIgKmF0dHIsCi0JCQkgICAgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUpCi17Ci0Jc3RydWN0IG5mYXR0ciAqdGJbQ1RBX1BST1RPX01BWF07Ci0Jc3RydWN0IGlwX2Nvbm50cmFja19wcm90b2NvbCAqcHJvdG87Ci0JaW50IHJldCA9IDA7Ci0KLQluZmF0dHJfcGFyc2VfbmVzdGVkKHRiLCBDVEFfUFJPVE9fTUFYLCBhdHRyKTsKLQotCWlmIChuZmF0dHJfYmFkX3NpemUodGIsIENUQV9QUk9UT19NQVgsIGN0YV9taW5fcHJvdG8pKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmICghdGJbQ1RBX1BST1RPX05VTS0xXSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JdHVwbGUtPmRzdC5wcm90b251bSA9ICoodV9pbnQ4X3QgKilORkFfREFUQSh0YltDVEFfUFJPVE9fTlVNLTFdKTsKLQotCXByb3RvID0gaXBfY29ubnRyYWNrX3Byb3RvX2ZpbmRfZ2V0KHR1cGxlLT5kc3QucHJvdG9udW0pOwotCi0JaWYgKGxpa2VseShwcm90by0+bmZhdHRyX3RvX3R1cGxlKSkKLQkJcmV0ID0gcHJvdG8tPm5mYXR0cl90b190dXBsZSh0YiwgdHVwbGUpOwotCi0JaXBfY29ubnRyYWNrX3Byb3RvX3B1dChwcm90byk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW5saW5lIGludAotY3RuZXRsaW5rX3BhcnNlX3R1cGxlKHN0cnVjdCBuZmF0dHIgKmNkYVtdLCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0dXBsZSwKLQkJICAgICAgZW51bSBjdGF0dHJfdHVwbGUgdHlwZSkKLXsKLQlzdHJ1Y3QgbmZhdHRyICp0YltDVEFfVFVQTEVfTUFYXTsKLQlpbnQgZXJyOwotCi0JbWVtc2V0KHR1cGxlLCAwLCBzaXplb2YoKnR1cGxlKSk7Ci0KLQluZmF0dHJfcGFyc2VfbmVzdGVkKHRiLCBDVEFfVFVQTEVfTUFYLCBjZGFbdHlwZS0xXSk7Ci0KLQlpZiAoIXRiW0NUQV9UVVBMRV9JUC0xXSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQllcnIgPSBjdG5ldGxpbmtfcGFyc2VfdHVwbGVfaXAodGJbQ1RBX1RVUExFX0lQLTFdLCB0dXBsZSk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0KLQlpZiAoIXRiW0NUQV9UVVBMRV9QUk9UTy0xXSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQllcnIgPSBjdG5ldGxpbmtfcGFyc2VfdHVwbGVfcHJvdG8odGJbQ1RBX1RVUExFX1BST1RPLTFdLCB0dXBsZSk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0KLQkvKiBvcmlnIGFuZCBleHBlY3QgdHVwbGVzIGdldCBESVJfT1JJR0lOQUwgKi8KLQlpZiAodHlwZSA9PSBDVEFfVFVQTEVfUkVQTFkpCi0JCXR1cGxlLT5kc3QuZGlyID0gSVBfQ1RfRElSX1JFUExZOwotCWVsc2UKLQkJdHVwbGUtPmRzdC5kaXIgPSBJUF9DVF9ESVJfT1JJR0lOQUw7Ci0KLQlyZXR1cm4gMDsKLX0KLQotI2lmZGVmIENPTkZJR19JUF9ORl9OQVRfTkVFREVECi1zdGF0aWMgY29uc3Qgc2l6ZV90IGN0YV9taW5fcHJvdG9uYXRbQ1RBX1BST1RPTkFUX01BWF0gPSB7Ci0JW0NUQV9QUk9UT05BVF9QT1JUX01JTi0xXQk9IHNpemVvZih1X2ludDE2X3QpLAotCVtDVEFfUFJPVE9OQVRfUE9SVF9NQVgtMV0JPSBzaXplb2YodV9pbnQxNl90KSwKLX07Ci0KLXN0YXRpYyBpbnQgY3RuZXRsaW5rX3BhcnNlX25hdF9wcm90byhzdHJ1Y3QgbmZhdHRyICphdHRyLAotCQkJCSAgICAgY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsCi0JCQkJICAgICBzdHJ1Y3QgaXBfbmF0X3JhbmdlICpyYW5nZSkKLXsKLQlzdHJ1Y3QgbmZhdHRyICp0YltDVEFfUFJPVE9OQVRfTUFYXTsKLQlzdHJ1Y3QgaXBfbmF0X3Byb3RvY29sICpucHQ7Ci0KLQluZmF0dHJfcGFyc2VfbmVzdGVkKHRiLCBDVEFfUFJPVE9OQVRfTUFYLCBhdHRyKTsKLQotCWlmIChuZmF0dHJfYmFkX3NpemUodGIsIENUQV9QUk9UT05BVF9NQVgsIGN0YV9taW5fcHJvdG9uYXQpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCW5wdCA9IGlwX25hdF9wcm90b19maW5kX2dldChjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUuZHN0LnByb3RvbnVtKTsKLQotCWlmICghbnB0LT5uZmF0dHJfdG9fcmFuZ2UpIHsKLQkJaXBfbmF0X3Byb3RvX3B1dChucHQpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKiBuZmF0dHJfdG9fcmFuZ2UgcmV0dXJucyAxIGlmIGl0IHBhcnNlZCwgMCBpZiBub3QsIG5lZy4gb24gZXJyb3IgKi8KLQlpZiAobnB0LT5uZmF0dHJfdG9fcmFuZ2UodGIsIHJhbmdlKSA+IDApCi0JCXJhbmdlLT5mbGFncyB8PSBJUF9OQVRfUkFOR0VfUFJPVE9fU1BFQ0lGSUVEOwotCi0JaXBfbmF0X3Byb3RvX3B1dChucHQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzaXplX3QgY3RhX21pbl9uYXRbQ1RBX05BVF9NQVhdID0gewotCVtDVEFfTkFUX01JTklQLTFdICAgICAgID0gc2l6ZW9mKF9fYmUzMiksCi0JW0NUQV9OQVRfTUFYSVAtMV0gICAgICAgPSBzaXplb2YoX19iZTMyKSwKLX07Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1jdG5ldGxpbmtfcGFyc2VfbmF0KHN0cnVjdCBuZmF0dHIgKm5hdCwKLQkJICAgIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2sgKmN0LCBzdHJ1Y3QgaXBfbmF0X3JhbmdlICpyYW5nZSkKLXsKLQlzdHJ1Y3QgbmZhdHRyICp0YltDVEFfTkFUX01BWF07Ci0JaW50IGVycjsKLQotCW1lbXNldChyYW5nZSwgMCwgc2l6ZW9mKCpyYW5nZSkpOwotCi0JbmZhdHRyX3BhcnNlX25lc3RlZCh0YiwgQ1RBX05BVF9NQVgsIG5hdCk7Ci0KLQlpZiAobmZhdHRyX2JhZF9zaXplKHRiLCBDVEFfTkFUX01BWCwgY3RhX21pbl9uYXQpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmICh0YltDVEFfTkFUX01JTklQLTFdKQotCQlyYW5nZS0+bWluX2lwID0gKihfX2JlMzIgKilORkFfREFUQSh0YltDVEFfTkFUX01JTklQLTFdKTsKLQotCWlmICghdGJbQ1RBX05BVF9NQVhJUC0xXSkKLQkJcmFuZ2UtPm1heF9pcCA9IHJhbmdlLT5taW5faXA7Ci0JZWxzZQotCQlyYW5nZS0+bWF4X2lwID0gKihfX2JlMzIgKilORkFfREFUQSh0YltDVEFfTkFUX01BWElQLTFdKTsKLQotCWlmIChyYW5nZS0+bWluX2lwKQotCQlyYW5nZS0+ZmxhZ3MgfD0gSVBfTkFUX1JBTkdFX01BUF9JUFM7Ci0KLQlpZiAoIXRiW0NUQV9OQVRfUFJPVE8tMV0pCi0JCXJldHVybiAwOwotCi0JZXJyID0gY3RuZXRsaW5rX3BhcnNlX25hdF9wcm90byh0YltDVEFfTkFUX1BST1RPLTFdLCBjdCwgcmFuZ2UpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCi0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQotc3RhdGljIGlubGluZSBpbnQKLWN0bmV0bGlua19wYXJzZV9oZWxwKHN0cnVjdCBuZmF0dHIgKmF0dHIsIGNoYXIgKipoZWxwZXJfbmFtZSkKLXsKLQlzdHJ1Y3QgbmZhdHRyICp0YltDVEFfSEVMUF9NQVhdOwotCi0JbmZhdHRyX3BhcnNlX25lc3RlZCh0YiwgQ1RBX0hFTFBfTUFYLCBhdHRyKTsKLQotCWlmICghdGJbQ1RBX0hFTFBfTkFNRS0xXSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkqaGVscGVyX25hbWUgPSBORkFfREFUQSh0YltDVEFfSEVMUF9OQU1FLTFdKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc2l6ZV90IGN0YV9taW5bQ1RBX01BWF0gPSB7Ci0JW0NUQV9TVEFUVVMtMV0gCQk9IHNpemVvZihfX2JlMzIpLAotCVtDVEFfVElNRU9VVC0xXSAJPSBzaXplb2YoX19iZTMyKSwKLQlbQ1RBX01BUkstMV0JCT0gc2l6ZW9mKF9fYmUzMiksCi0JW0NUQV9VU0UtMV0JCT0gc2l6ZW9mKF9fYmUzMiksCi0JW0NUQV9JRC0xXQkJPSBzaXplb2YoX19iZTMyKQotfTsKLQotc3RhdGljIGludAotY3RuZXRsaW5rX2RlbF9jb25udHJhY2soc3RydWN0IHNvY2sgKmN0bmwsIHN0cnVjdCBza19idWZmICpza2IsCi0JCQlzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgc3RydWN0IG5mYXR0ciAqY2RhW10sIGludCAqZXJycCkKLXsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlX2hhc2ggKmg7Ci0Jc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSB0dXBsZTsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdDsKLQlpbnQgZXJyID0gMDsKLQotCWlmIChuZmF0dHJfYmFkX3NpemUoY2RhLCBDVEFfTUFYLCBjdGFfbWluKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoY2RhW0NUQV9UVVBMRV9PUklHLTFdKQotCQllcnIgPSBjdG5ldGxpbmtfcGFyc2VfdHVwbGUoY2RhLCAmdHVwbGUsIENUQV9UVVBMRV9PUklHKTsKLQllbHNlIGlmIChjZGFbQ1RBX1RVUExFX1JFUExZLTFdKQotCQllcnIgPSBjdG5ldGxpbmtfcGFyc2VfdHVwbGUoY2RhLCAmdHVwbGUsIENUQV9UVVBMRV9SRVBMWSk7Ci0JZWxzZSB7Ci0JCS8qIEZsdXNoIHRoZSB3aG9sZSB0YWJsZSAqLwotCQlpcF9jb25udHJhY2tfZmx1c2goKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0KLQloID0gaXBfY29ubnRyYWNrX2ZpbmRfZ2V0KCZ0dXBsZSwgTlVMTCk7Ci0JaWYgKCFoKQotCQlyZXR1cm4gLUVOT0VOVDsKLQotCWN0ID0gdHVwbGVoYXNoX3RvX2N0cmFjayhoKTsKLQotCWlmIChjZGFbQ1RBX0lELTFdKSB7Ci0JCXVfaW50MzJfdCBpZCA9IG50b2hsKCooX19iZTMyICopTkZBX0RBVEEoY2RhW0NUQV9JRC0xXSkpOwotCQlpZiAoY3QtPmlkICE9IGlkKSB7Ci0JCQlpcF9jb25udHJhY2tfcHV0KGN0KTsKLQkJCXJldHVybiAtRU5PRU5UOwotCQl9Ci0JfQotCWlmIChkZWxfdGltZXIoJmN0LT50aW1lb3V0KSkKLQkJY3QtPnRpbWVvdXQuZnVuY3Rpb24oKHVuc2lnbmVkIGxvbmcpY3QpOwotCi0JaXBfY29ubnRyYWNrX3B1dChjdCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotY3RuZXRsaW5rX2dldF9jb25udHJhY2soc3RydWN0IHNvY2sgKmN0bmwsIHN0cnVjdCBza19idWZmICpza2IsCi0JCQlzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgc3RydWN0IG5mYXR0ciAqY2RhW10sIGludCAqZXJycCkKLXsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlX2hhc2ggKmg7Ci0Jc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSB0dXBsZTsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdDsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiMiA9IE5VTEw7Ci0JaW50IGVyciA9IDA7Ci0KLQlpZiAobmxoLT5ubG1zZ19mbGFncyAmIE5MTV9GX0RVTVApIHsKLQkJc3RydWN0IG5mZ2VubXNnICptc2cgPSBOTE1TR19EQVRBKG5saCk7Ci0JCXUzMiBybGVuOwotCi0JCWlmIChtc2ctPm5mZ2VuX2ZhbWlseSAhPSBBRl9JTkVUKQotCQkJcmV0dXJuIC1FQUZOT1NVUFBPUlQ7Ci0KLSNpZm5kZWYgQ09ORklHX0lQX05GX0NUX0FDQ1QKLQkJaWYgKE5GTkxfTVNHX1RZUEUobmxoLT5ubG1zZ190eXBlKSA9PSBJUENUTkxfTVNHX0NUX0dFVF9DVFJaRVJPKQotCQkJcmV0dXJuIC1FTk9UU1VQUDsKLSNlbmRpZgotCQlpZiAoKCplcnJwID0gbmV0bGlua19kdW1wX3N0YXJ0KGN0bmwsIHNrYiwgbmxoLAotCQkJCQkJY3RuZXRsaW5rX2R1bXBfdGFibGUsCi0JCQkJCQljdG5ldGxpbmtfZG9uZSkpICE9IDApCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQotCQlybGVuID0gTkxNU0dfQUxJR04obmxoLT5ubG1zZ19sZW4pOwotCQlpZiAocmxlbiA+IHNrYi0+bGVuKQotCQkJcmxlbiA9IHNrYi0+bGVuOwotCQlza2JfcHVsbChza2IsIHJsZW4pOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAobmZhdHRyX2JhZF9zaXplKGNkYSwgQ1RBX01BWCwgY3RhX21pbikpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKGNkYVtDVEFfVFVQTEVfT1JJRy0xXSkKLQkJZXJyID0gY3RuZXRsaW5rX3BhcnNlX3R1cGxlKGNkYSwgJnR1cGxlLCBDVEFfVFVQTEVfT1JJRyk7Ci0JZWxzZSBpZiAoY2RhW0NUQV9UVVBMRV9SRVBMWS0xXSkKLQkJZXJyID0gY3RuZXRsaW5rX3BhcnNlX3R1cGxlKGNkYSwgJnR1cGxlLCBDVEFfVFVQTEVfUkVQTFkpOwotCWVsc2UKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQotCWggPSBpcF9jb25udHJhY2tfZmluZF9nZXQoJnR1cGxlLCBOVUxMKTsKLQlpZiAoIWgpCi0JCXJldHVybiAtRU5PRU5UOwotCi0JY3QgPSB0dXBsZWhhc2hfdG9fY3RyYWNrKGgpOwotCi0JZXJyID0gLUVOT01FTTsKLQlza2IyID0gYWxsb2Nfc2tiKE5MTVNHX0dPT0RTSVpFLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXNrYjIpIHsKLQkJaXBfY29ubnRyYWNrX3B1dChjdCk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCWVyciA9IGN0bmV0bGlua19maWxsX2luZm8oc2tiMiwgTkVUTElOS19DQihza2IpLnBpZCwgbmxoLT5ubG1zZ19zZXEsCi0JCQkJICBJUENUTkxfTVNHX0NUX05FVywgMSwgY3QpOwotCWlwX2Nvbm50cmFja19wdXQoY3QpOwotCWlmIChlcnIgPD0gMCkKLQkJZ290byBmcmVlOwotCi0JZXJyID0gbmV0bGlua191bmljYXN0KGN0bmwsIHNrYjIsIE5FVExJTktfQ0Ioc2tiKS5waWQsIE1TR19ET05UV0FJVCk7Ci0JaWYgKGVyciA8IDApCi0JCWdvdG8gb3V0OwotCi0JcmV0dXJuIDA7Ci0KLWZyZWU6Ci0Ja2ZyZWVfc2tiKHNrYjIpOwotb3V0OgotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1jdG5ldGxpbmtfY2hhbmdlX3N0YXR1cyhzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwgc3RydWN0IG5mYXR0ciAqY2RhW10pCi17Ci0JdW5zaWduZWQgbG9uZyBkOwotCXVuc2lnbmVkIHN0YXR1cyA9IG50b2hsKCooX19iZTMyICopTkZBX0RBVEEoY2RhW0NUQV9TVEFUVVMtMV0pKTsKLQlkID0gY3QtPnN0YXR1cyBeIHN0YXR1czsKLQotCWlmIChkICYgKElQU19FWFBFQ1RFRHxJUFNfQ09ORklSTUVEfElQU19EWUlORykpCi0JCS8qIHVuY2hhbmdlYWJsZSAqLwotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChkICYgSVBTX1NFRU5fUkVQTFkgJiYgIShzdGF0dXMgJiBJUFNfU0VFTl9SRVBMWSkpCi0JCS8qIFNFRU5fUkVQTFkgYml0IGNhbiBvbmx5IGJlIHNldCAqLwotCQlyZXR1cm4gLUVJTlZBTDsKLQotCi0JaWYgKGQgJiBJUFNfQVNTVVJFRCAmJiAhKHN0YXR1cyAmIElQU19BU1NVUkVEKSkKLQkJLyogQVNTVVJFRCBiaXQgY2FuIG9ubHkgYmUgc2V0ICovCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKGNkYVtDVEFfTkFUX1NSQy0xXSB8fCBjZGFbQ1RBX05BVF9EU1QtMV0pIHsKLSNpZm5kZWYgQ09ORklHX0lQX05GX05BVF9ORUVERUQKLQkJcmV0dXJuIC1FSU5WQUw7Ci0jZWxzZQotCQlzdHJ1Y3QgaXBfbmF0X3JhbmdlIHJhbmdlOwotCi0JCWlmIChjZGFbQ1RBX05BVF9EU1QtMV0pIHsKLQkJCWlmIChjdG5ldGxpbmtfcGFyc2VfbmF0KGNkYVtDVEFfTkFUX0RTVC0xXSwgY3QsCi0JCQkJCQkmcmFuZ2UpIDwgMCkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCWlmIChpcF9uYXRfaW5pdGlhbGl6ZWQoY3QsCi0JCQkJCSAgICAgICBIT09LMk1BTklQKE5GX0lQX1BSRV9ST1VUSU5HKSkpCi0JCQkJcmV0dXJuIC1FRVhJU1Q7Ci0JCQlpcF9uYXRfc2V0dXBfaW5mbyhjdCwgJnJhbmdlLCBORl9JUF9QUkVfUk9VVElORyk7Ci0JCX0KLQkJaWYgKGNkYVtDVEFfTkFUX1NSQy0xXSkgewotCQkJaWYgKGN0bmV0bGlua19wYXJzZV9uYXQoY2RhW0NUQV9OQVRfU1JDLTFdLCBjdCwKLQkJCQkJCSZyYW5nZSkgPCAwKQotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJaWYgKGlwX25hdF9pbml0aWFsaXplZChjdCwKLQkJCQkJICAgICAgIEhPT0syTUFOSVAoTkZfSVBfUE9TVF9ST1VUSU5HKSkpCi0JCQkJcmV0dXJuIC1FRVhJU1Q7Ci0JCQlpcF9uYXRfc2V0dXBfaW5mbyhjdCwgJnJhbmdlLCBORl9JUF9QT1NUX1JPVVRJTkcpOwotCQl9Ci0jZW5kaWYKLQl9Ci0KLQkvKiBCZSBjYXJlZnVsIGhlcmUsIG1vZGlmeWluZyBOQVQgYml0cyBjYW4gc2NyZXcgdXAgdGhpbmdzLAotCSAqIHNvIGRvbid0IGxldCB1c2VycyBtb2RpZnkgdGhlbSBkaXJlY3RseSBpZiB0aGV5IGRvbid0IHBhc3MKLQkgKiBpcF9uYXRfcmFuZ2UuICovCi0JY3QtPnN0YXR1cyB8PSBzdGF0dXMgJiB+KElQU19OQVRfRE9ORV9NQVNLIHwgSVBTX05BVF9NQVNLKTsKLQlyZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgaW5saW5lIGludAotY3RuZXRsaW5rX2NoYW5nZV9oZWxwZXIoc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsIHN0cnVjdCBuZmF0dHIgKmNkYVtdKQotewotCXN0cnVjdCBpcF9jb25udHJhY2tfaGVscGVyICpoZWxwZXI7Ci0JY2hhciAqaGVscG5hbWU7Ci0JaW50IGVycjsKLQotCS8qIGRvbid0IGNoYW5nZSBoZWxwZXIgb2Ygc2libGluZyBjb25uZWN0aW9ucyAqLwotCWlmIChjdC0+bWFzdGVyKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWVyciA9IGN0bmV0bGlua19wYXJzZV9oZWxwKGNkYVtDVEFfSEVMUC0xXSwgJmhlbHBuYW1lKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQotCWhlbHBlciA9IF9faXBfY29ubnRyYWNrX2hlbHBlcl9maW5kX2J5bmFtZShoZWxwbmFtZSk7Ci0JaWYgKCFoZWxwZXIpIHsKLQkJaWYgKCFzdHJjbXAoaGVscG5hbWUsICIiKSkKLQkJCWhlbHBlciA9IE5VTEw7Ci0JCWVsc2UKLQkJCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChjdC0+aGVscGVyKSB7Ci0JCWlmICghaGVscGVyKSB7Ci0JCQkvKiB3ZSBoYWQgYSBoZWxwZXIgYmVmb3JlIC4uLiAqLwotCQkJaXBfY3RfcmVtb3ZlX2V4cGVjdGF0aW9ucyhjdCk7Ci0JCQljdC0+aGVscGVyID0gTlVMTDsKLQkJfSBlbHNlIHsKLQkJCS8qIG5lZWQgdG8gemVybyBkYXRhIG9mIG9sZCBoZWxwZXIgKi8KLQkJCW1lbXNldCgmY3QtPmhlbHAsIDAsIHNpemVvZihjdC0+aGVscCkpOwotCQl9Ci0JfQotCi0JY3QtPmhlbHBlciA9IGhlbHBlcjsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIGludAotY3RuZXRsaW5rX2NoYW5nZV90aW1lb3V0KHN0cnVjdCBpcF9jb25udHJhY2sgKmN0LCBzdHJ1Y3QgbmZhdHRyICpjZGFbXSkKLXsKLQl1X2ludDMyX3QgdGltZW91dCA9IG50b2hsKCooX19iZTMyICopTkZBX0RBVEEoY2RhW0NUQV9USU1FT1VULTFdKSk7Ci0KLQlpZiAoIWRlbF90aW1lcigmY3QtPnRpbWVvdXQpKQotCQlyZXR1cm4gLUVUSU1FOwotCi0JY3QtPnRpbWVvdXQuZXhwaXJlcyA9IGppZmZpZXMgKyB0aW1lb3V0ICogSFo7Ci0JYWRkX3RpbWVyKCZjdC0+dGltZW91dCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQKLWN0bmV0bGlua19jaGFuZ2VfcHJvdG9pbmZvKHN0cnVjdCBpcF9jb25udHJhY2sgKmN0LCBzdHJ1Y3QgbmZhdHRyICpjZGFbXSkKLXsKLQlzdHJ1Y3QgbmZhdHRyICp0YltDVEFfUFJPVE9JTkZPX01BWF0sICphdHRyID0gY2RhW0NUQV9QUk9UT0lORk8tMV07Ci0Jc3RydWN0IGlwX2Nvbm50cmFja19wcm90b2NvbCAqcHJvdG87Ci0JdV9pbnQxNl90IG5wdCA9IGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZS5kc3QucHJvdG9udW07Ci0JaW50IGVyciA9IDA7Ci0KLQluZmF0dHJfcGFyc2VfbmVzdGVkKHRiLCBDVEFfUFJPVE9JTkZPX01BWCwgYXR0cik7Ci0KLQlwcm90byA9IGlwX2Nvbm50cmFja19wcm90b19maW5kX2dldChucHQpOwotCi0JaWYgKHByb3RvLT5mcm9tX25mYXR0cikKLQkJZXJyID0gcHJvdG8tPmZyb21fbmZhdHRyKHRiLCBjdCk7Ci0JaXBfY29ubnRyYWNrX3Byb3RvX3B1dChwcm90byk7Ci0KLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgaW50Ci1jdG5ldGxpbmtfY2hhbmdlX2Nvbm50cmFjayhzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwgc3RydWN0IG5mYXR0ciAqY2RhW10pCi17Ci0JaW50IGVycjsKLQotCWlmIChjZGFbQ1RBX0hFTFAtMV0pIHsKLQkJZXJyID0gY3RuZXRsaW5rX2NoYW5nZV9oZWxwZXIoY3QsIGNkYSk7Ci0JCWlmIChlcnIgPCAwKQotCQkJcmV0dXJuIGVycjsKLQl9Ci0KLQlpZiAoY2RhW0NUQV9USU1FT1VULTFdKSB7Ci0JCWVyciA9IGN0bmV0bGlua19jaGFuZ2VfdGltZW91dChjdCwgY2RhKTsKLQkJaWYgKGVyciA8IDApCi0JCQlyZXR1cm4gZXJyOwotCX0KLQotCWlmIChjZGFbQ1RBX1NUQVRVUy0xXSkgewotCQllcnIgPSBjdG5ldGxpbmtfY2hhbmdlX3N0YXR1cyhjdCwgY2RhKTsKLQkJaWYgKGVyciA8IDApCi0JCQlyZXR1cm4gZXJyOwotCX0KLQotCWlmIChjZGFbQ1RBX1BST1RPSU5GTy0xXSkgewotCQllcnIgPSBjdG5ldGxpbmtfY2hhbmdlX3Byb3RvaW5mbyhjdCwgY2RhKTsKLQkJaWYgKGVyciA8IDApCi0JCQlyZXR1cm4gZXJyOwotCX0KLQotI2lmIGRlZmluZWQoQ09ORklHX0lQX05GX0NPTk5UUkFDS19NQVJLKQotCWlmIChjZGFbQ1RBX01BUkstMV0pCi0JCWN0LT5tYXJrID0gbnRvaGwoKihfX2JlMzIgKilORkFfREFUQShjZGFbQ1RBX01BUkstMV0pKTsKLSNlbmRpZgotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLWN0bmV0bGlua19jcmVhdGVfY29ubnRyYWNrKHN0cnVjdCBuZmF0dHIgKmNkYVtdLAotCQkJICAgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqb3R1cGxlLAotCQkJICAgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqcnR1cGxlKQotewotCXN0cnVjdCBpcF9jb25udHJhY2sgKmN0OwotCWludCBlcnIgPSAtRUlOVkFMOwotCi0JY3QgPSBpcF9jb25udHJhY2tfYWxsb2Mob3R1cGxlLCBydHVwbGUpOwotCWlmIChjdCA9PSBOVUxMIHx8IElTX0VSUihjdCkpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JaWYgKCFjZGFbQ1RBX1RJTUVPVVQtMV0pCi0JCWdvdG8gZXJyOwotCWN0LT50aW1lb3V0LmV4cGlyZXMgPSBudG9obCgqKF9fYmUzMiAqKU5GQV9EQVRBKGNkYVtDVEFfVElNRU9VVC0xXSkpOwotCi0JY3QtPnRpbWVvdXQuZXhwaXJlcyA9IGppZmZpZXMgKyBjdC0+dGltZW91dC5leHBpcmVzICogSFo7Ci0JY3QtPnN0YXR1cyB8PSBJUFNfQ09ORklSTUVEOwotCi0JaWYgKGNkYVtDVEFfU1RBVFVTLTFdKSB7Ci0JCWVyciA9IGN0bmV0bGlua19jaGFuZ2Vfc3RhdHVzKGN0LCBjZGEpOwotCQlpZiAoZXJyIDwgMCkKLQkJCWdvdG8gZXJyOwotCX0KLQotCWlmIChjZGFbQ1RBX1BST1RPSU5GTy0xXSkgewotCQllcnIgPSBjdG5ldGxpbmtfY2hhbmdlX3Byb3RvaW5mbyhjdCwgY2RhKTsKLQkJaWYgKGVyciA8IDApCi0JCQlnb3RvIGVycjsKLQl9Ci0KLSNpZiBkZWZpbmVkKENPTkZJR19JUF9ORl9DT05OVFJBQ0tfTUFSSykKLQlpZiAoY2RhW0NUQV9NQVJLLTFdKQotCQljdC0+bWFyayA9IG50b2hsKCooX19iZTMyICopTkZBX0RBVEEoY2RhW0NUQV9NQVJLLTFdKSk7Ci0jZW5kaWYKLQotCWN0LT5oZWxwZXIgPSBpcF9jb25udHJhY2tfaGVscGVyX2ZpbmRfZ2V0KHJ0dXBsZSk7Ci0KLQlhZGRfdGltZXIoJmN0LT50aW1lb3V0KTsKLQlpcF9jb25udHJhY2tfaGFzaF9pbnNlcnQoY3QpOwotCi0JaWYgKGN0LT5oZWxwZXIpCi0JCWlwX2Nvbm50cmFja19oZWxwZXJfcHV0KGN0LT5oZWxwZXIpOwotCi0JcmV0dXJuIDA7Ci0KLWVycjoKLQlpcF9jb25udHJhY2tfZnJlZShjdCk7Ci0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIGludAotY3RuZXRsaW5rX25ld19jb25udHJhY2soc3RydWN0IHNvY2sgKmN0bmwsIHN0cnVjdCBza19idWZmICpza2IsCi0JCQlzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgc3RydWN0IG5mYXR0ciAqY2RhW10sIGludCAqZXJycCkKLXsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlIG90dXBsZSwgcnR1cGxlOwotCXN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGVfaGFzaCAqaCA9IE5VTEw7Ci0JaW50IGVyciA9IDA7Ci0KLQlpZiAobmZhdHRyX2JhZF9zaXplKGNkYSwgQ1RBX01BWCwgY3RhX21pbikpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKGNkYVtDVEFfVFVQTEVfT1JJRy0xXSkgewotCQllcnIgPSBjdG5ldGxpbmtfcGFyc2VfdHVwbGUoY2RhLCAmb3R1cGxlLCBDVEFfVFVQTEVfT1JJRyk7Ci0JCWlmIChlcnIgPCAwKQotCQkJcmV0dXJuIGVycjsKLQl9Ci0KLQlpZiAoY2RhW0NUQV9UVVBMRV9SRVBMWS0xXSkgewotCQllcnIgPSBjdG5ldGxpbmtfcGFyc2VfdHVwbGUoY2RhLCAmcnR1cGxlLCBDVEFfVFVQTEVfUkVQTFkpOwotCQlpZiAoZXJyIDwgMCkKLQkJCXJldHVybiBlcnI7Ci0JfQotCi0Jd3JpdGVfbG9ja19iaCgmaXBfY29ubnRyYWNrX2xvY2spOwotCWlmIChjZGFbQ1RBX1RVUExFX09SSUctMV0pCi0JCWggPSBfX2lwX2Nvbm50cmFja19maW5kKCZvdHVwbGUsIE5VTEwpOwotCWVsc2UgaWYgKGNkYVtDVEFfVFVQTEVfUkVQTFktMV0pCi0JCWggPSBfX2lwX2Nvbm50cmFja19maW5kKCZydHVwbGUsIE5VTEwpOwotCi0JaWYgKGggPT0gTlVMTCkgewotCQl3cml0ZV91bmxvY2tfYmgoJmlwX2Nvbm50cmFja19sb2NrKTsKLQkJZXJyID0gLUVOT0VOVDsKLQkJaWYgKG5saC0+bmxtc2dfZmxhZ3MgJiBOTE1fRl9DUkVBVEUpCi0JCQllcnIgPSBjdG5ldGxpbmtfY3JlYXRlX2Nvbm50cmFjayhjZGEsICZvdHVwbGUsICZydHVwbGUpOwotCQlyZXR1cm4gZXJyOwotCX0KLQkvKiBpbXBsaWNpdCAnZWxzZScgKi8KLQotCS8qIHdlIG9ubHkgYWxsb3cgbmF0IGNvbmZpZyBmb3IgbmV3IGNvbm50cmFja3MgKi8KLQlpZiAoY2RhW0NUQV9OQVRfU1JDLTFdIHx8IGNkYVtDVEFfTkFUX0RTVC0xXSkgewotCQllcnIgPSAtRUlOVkFMOwotCQlnb3RvIG91dF91bmxvY2s7Ci0JfQotCi0JLyogV2UgbWFuaXB1bGF0ZSB0aGUgY29ubnRyYWNrIGluc2lkZSB0aGUgZ2xvYmFsIGNvbm50cmFjayB0YWJsZSBsb2NrLAotCSAqIHNvIHRoZXJlJ3Mgbm8gbmVlZCB0byBpbmNyZWFzZSB0aGUgcmVmY291bnQgKi8KLQllcnIgPSAtRUVYSVNUOwotCWlmICghKG5saC0+bmxtc2dfZmxhZ3MgJiBOTE1fRl9FWENMKSkKLQkJZXJyID0gY3RuZXRsaW5rX2NoYW5nZV9jb25udHJhY2sodHVwbGVoYXNoX3RvX2N0cmFjayhoKSwgY2RhKTsKLQotb3V0X3VubG9jazoKLQl3cml0ZV91bmxvY2tfYmgoJmlwX2Nvbm50cmFja19sb2NrKTsKLQlyZXR1cm4gZXJyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEVYUEVDVAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgaW5saW5lIGludAotY3RuZXRsaW5rX2V4cF9kdW1wX3R1cGxlKHN0cnVjdCBza19idWZmICpza2IsCi0JCQkgY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUsCi0JCQkgZW51bSBjdGF0dHJfZXhwZWN0IHR5cGUpCi17Ci0Jc3RydWN0IG5mYXR0ciAqbmVzdF9wYXJtcyA9IE5GQV9ORVNUKHNrYiwgdHlwZSk7Ci0KLQlpZiAoY3RuZXRsaW5rX2R1bXBfdHVwbGVzKHNrYiwgdHVwbGUpIDwgMCkKLQkJZ290byBuZmF0dHJfZmFpbHVyZTsKLQotCU5GQV9ORVNUX0VORChza2IsIG5lc3RfcGFybXMpOwotCi0JcmV0dXJuIDA7Ci0KLW5mYXR0cl9mYWlsdXJlOgotCXJldHVybiAtMTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQKLWN0bmV0bGlua19leHBfZHVtcF9tYXNrKHN0cnVjdCBza19idWZmICpza2IsCi0JCQljb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0dXBsZSwKLQkJCWNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKm1hc2spCi17Ci0JaW50IHJldDsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrX3Byb3RvY29sICpwcm90bzsKLQlzdHJ1Y3QgbmZhdHRyICpuZXN0X3Bhcm1zID0gTkZBX05FU1Qoc2tiLCBDVEFfRVhQRUNUX01BU0spOwotCi0JcmV0ID0gY3RuZXRsaW5rX2R1bXBfdHVwbGVzX2lwKHNrYiwgbWFzayk7Ci0JaWYgKHVubGlrZWx5KHJldCA8IDApKQotCQlnb3RvIG5mYXR0cl9mYWlsdXJlOwotCi0JcHJvdG8gPSBpcF9jb25udHJhY2tfcHJvdG9fZmluZF9nZXQodHVwbGUtPmRzdC5wcm90b251bSk7Ci0JcmV0ID0gY3RuZXRsaW5rX2R1bXBfdHVwbGVzX3Byb3RvKHNrYiwgbWFzaywgcHJvdG8pOwotCWlwX2Nvbm50cmFja19wcm90b19wdXQocHJvdG8pOwotCWlmICh1bmxpa2VseShyZXQgPCAwKSkKLQkJZ290byBuZmF0dHJfZmFpbHVyZTsKLQotCU5GQV9ORVNUX0VORChza2IsIG5lc3RfcGFybXMpOwotCi0JcmV0dXJuIDA7Ci0KLW5mYXR0cl9mYWlsdXJlOgotCXJldHVybiAtMTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQKLWN0bmV0bGlua19leHBfZHVtcF9leHBlY3Qoc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCSAgY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmV4cCkKLXsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrICptYXN0ZXIgPSBleHAtPm1hc3RlcjsKLQlfX2JlMzIgdGltZW91dCA9IGh0b25sKChleHAtPnRpbWVvdXQuZXhwaXJlcyAtIGppZmZpZXMpIC8gSFopOwotCV9fYmUzMiBpZCA9IGh0b25sKGV4cC0+aWQpOwotCi0JaWYgKGN0bmV0bGlua19leHBfZHVtcF90dXBsZShza2IsICZleHAtPnR1cGxlLCBDVEFfRVhQRUNUX1RVUExFKSA8IDApCi0JCWdvdG8gbmZhdHRyX2ZhaWx1cmU7Ci0JaWYgKGN0bmV0bGlua19leHBfZHVtcF9tYXNrKHNrYiwgJmV4cC0+dHVwbGUsICZleHAtPm1hc2spIDwgMCkKLQkJZ290byBuZmF0dHJfZmFpbHVyZTsKLQlpZiAoY3RuZXRsaW5rX2V4cF9kdW1wX3R1cGxlKHNrYiwKLQkJCQkgJm1hc3Rlci0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUsCi0JCQkJIENUQV9FWFBFQ1RfTUFTVEVSKSA8IDApCi0JCWdvdG8gbmZhdHRyX2ZhaWx1cmU7Ci0KLQlORkFfUFVUKHNrYiwgQ1RBX0VYUEVDVF9USU1FT1VULCBzaXplb2YoX19iZTMyKSwgJnRpbWVvdXQpOwotCU5GQV9QVVQoc2tiLCBDVEFfRVhQRUNUX0lELCBzaXplb2YoX19iZTMyKSwgJmlkKTsKLQotCXJldHVybiAwOwotCi1uZmF0dHJfZmFpbHVyZToKLQlyZXR1cm4gLTE7Ci19Ci0KLXN0YXRpYyBpbnQKLWN0bmV0bGlua19leHBfZmlsbF9pbmZvKHN0cnVjdCBza19idWZmICpza2IsIHUzMiBwaWQsIHUzMiBzZXEsCi0JCSAgICBpbnQgZXZlbnQsCi0JCSAgICBpbnQgbm93YWl0LAotCQkgICAgY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmV4cCkKLXsKLQlzdHJ1Y3Qgbmxtc2doZHIgKm5saDsKLQlzdHJ1Y3QgbmZnZW5tc2cgKm5mbXNnOwotCXVuc2lnbmVkIGNoYXIgKmI7Ci0KLQliID0gc2tiLT50YWlsOwotCi0JZXZlbnQgfD0gTkZOTF9TVUJTWVNfQ1RORVRMSU5LX0VYUCA8PCA4OwotCW5saCAgICA9IE5MTVNHX1BVVChza2IsIHBpZCwgc2VxLCBldmVudCwgc2l6ZW9mKHN0cnVjdCBuZmdlbm1zZykpOwotCW5mbXNnICA9IE5MTVNHX0RBVEEobmxoKTsKLQotCW5saC0+bmxtc2dfZmxhZ3MgICAgPSAobm93YWl0ICYmIHBpZCkgPyBOTE1fRl9NVUxUSSA6IDA7Ci0JbmZtc2ctPm5mZ2VuX2ZhbWlseSA9IEFGX0lORVQ7Ci0JbmZtc2ctPnZlcnNpb24JICAgID0gTkZORVRMSU5LX1YwOwotCW5mbXNnLT5yZXNfaWQJICAgID0gMDsKLQotCWlmIChjdG5ldGxpbmtfZXhwX2R1bXBfZXhwZWN0KHNrYiwgZXhwKSA8IDApCi0JCWdvdG8gbmZhdHRyX2ZhaWx1cmU7Ci0KLQlubGgtPm5sbXNnX2xlbiA9IHNrYi0+dGFpbCAtIGI7Ci0JcmV0dXJuIHNrYi0+bGVuOwotCi1ubG1zZ19mYWlsdXJlOgotbmZhdHRyX2ZhaWx1cmU6Ci0Jc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKLQlyZXR1cm4gLTE7Ci19Ci0KLSNpZmRlZiBDT05GSUdfSVBfTkZfQ09OTlRSQUNLX0VWRU5UUwotc3RhdGljIGludCBjdG5ldGxpbmtfZXhwZWN0X2V2ZW50KHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcywKLQkJCQkgIHVuc2lnbmVkIGxvbmcgZXZlbnRzLCB2b2lkICpwdHIpCi17Ci0Jc3RydWN0IG5sbXNnaGRyICpubGg7Ci0Jc3RydWN0IG5mZ2VubXNnICpuZm1zZzsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqZXhwID0gKHN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICopcHRyOwotCXN0cnVjdCBza19idWZmICpza2I7Ci0JdW5zaWduZWQgaW50IHR5cGU7Ci0JdW5zaWduZWQgY2hhciAqYjsKLQlpbnQgZmxhZ3MgPSAwOwotCi0JaWYgKGV2ZW50cyAmIElQRVhQX05FVykgewotCQl0eXBlID0gSVBDVE5MX01TR19FWFBfTkVXOwotCQlmbGFncyA9IE5MTV9GX0NSRUFURXxOTE1fRl9FWENMOwotCX0gZWxzZQotCQlyZXR1cm4gTk9USUZZX0RPTkU7Ci0KLQlpZiAoIW5mbmV0bGlua19oYXNfbGlzdGVuZXJzKE5GTkxHUlBfQ09OTlRSQUNLX0VYUF9ORVcpKQotCQlyZXR1cm4gTk9USUZZX0RPTkU7Ci0KLQlza2IgPSBhbGxvY19za2IoTkxNU0dfR09PRFNJWkUsIEdGUF9BVE9NSUMpOwotCWlmICghc2tiKQotCQlyZXR1cm4gTk9USUZZX0RPTkU7Ci0KLQliID0gc2tiLT50YWlsOwotCi0JdHlwZSB8PSBORk5MX1NVQlNZU19DVE5FVExJTktfRVhQIDw8IDg7Ci0JbmxoICAgPSBOTE1TR19QVVQoc2tiLCAwLCAwLCB0eXBlLCBzaXplb2Yoc3RydWN0IG5mZ2VubXNnKSk7Ci0JbmZtc2cgPSBOTE1TR19EQVRBKG5saCk7Ci0KLQlubGgtPm5sbXNnX2ZsYWdzICAgID0gZmxhZ3M7Ci0JbmZtc2ctPm5mZ2VuX2ZhbWlseSA9IEFGX0lORVQ7Ci0JbmZtc2ctPnZlcnNpb24JICAgID0gTkZORVRMSU5LX1YwOwotCW5mbXNnLT5yZXNfaWQJICAgID0gMDsKLQotCWlmIChjdG5ldGxpbmtfZXhwX2R1bXBfZXhwZWN0KHNrYiwgZXhwKSA8IDApCi0JCWdvdG8gbmZhdHRyX2ZhaWx1cmU7Ci0KLQlubGgtPm5sbXNnX2xlbiA9IHNrYi0+dGFpbCAtIGI7Ci0JbmZuZXRsaW5rX3NlbmQoc2tiLCAwLCBORk5MR1JQX0NPTk5UUkFDS19FWFBfTkVXLCAwKTsKLQlyZXR1cm4gTk9USUZZX0RPTkU7Ci0KLW5sbXNnX2ZhaWx1cmU6Ci1uZmF0dHJfZmFpbHVyZToKLQlrZnJlZV9za2Ioc2tiKTsKLQlyZXR1cm4gTk9USUZZX0RPTkU7Ci19Ci0jZW5kaWYKLQotc3RhdGljIGludAotY3RuZXRsaW5rX2V4cF9kdW1wX3RhYmxlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYikKLXsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqZXhwID0gTlVMTDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICppOwotCXVfaW50MzJfdCAqaWQgPSAodV9pbnQzMl90ICopICZjYi0+YXJnc1swXTsKLQotCXJlYWRfbG9ja19iaCgmaXBfY29ubnRyYWNrX2xvY2spOwotCWxpc3RfZm9yX2VhY2hfcHJldihpLCAmaXBfY29ubnRyYWNrX2V4cGVjdF9saXN0KSB7Ci0JCWV4cCA9IChzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqKSBpOwotCQlpZiAoZXhwLT5pZCA8PSAqaWQpCi0JCQljb250aW51ZTsKLQkJaWYgKGN0bmV0bGlua19leHBfZmlsbF9pbmZvKHNrYiwgTkVUTElOS19DQihjYi0+c2tiKS5waWQsCi0JCQkJCSAgICBjYi0+bmxoLT5ubG1zZ19zZXEsCi0JCQkJCSAgICBJUENUTkxfTVNHX0VYUF9ORVcsCi0JCQkJCSAgICAxLCBleHApIDwgMCkKLQkJCWdvdG8gb3V0OwotCQkqaWQgPSBleHAtPmlkOwotCX0KLW91dDoKLQlyZWFkX3VubG9ja19iaCgmaXBfY29ubnRyYWNrX2xvY2spOwotCi0JcmV0dXJuIHNrYi0+bGVuOwotfQotCi1zdGF0aWMgY29uc3Qgc2l6ZV90IGN0YV9taW5fZXhwW0NUQV9FWFBFQ1RfTUFYXSA9IHsKLQlbQ1RBX0VYUEVDVF9USU1FT1VULTFdICAgICAgICAgID0gc2l6ZW9mKF9fYmUzMiksCi0JW0NUQV9FWFBFQ1RfSUQtMV0gICAgICAgICAgICAgICA9IHNpemVvZihfX2JlMzIpCi19OwotCi1zdGF0aWMgaW50Ci1jdG5ldGxpbmtfZ2V0X2V4cGVjdChzdHJ1Y3Qgc29jayAqY3RubCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJICAgICBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgc3RydWN0IG5mYXR0ciAqY2RhW10sIGludCAqZXJycCkKLXsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlIHR1cGxlOwotCXN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpleHA7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjI7Ci0JaW50IGVyciA9IDA7Ci0KLQlpZiAobmZhdHRyX2JhZF9zaXplKGNkYSwgQ1RBX0VYUEVDVF9NQVgsIGN0YV9taW5fZXhwKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAobmxoLT5ubG1zZ19mbGFncyAmIE5MTV9GX0RVTVApIHsKLQkJc3RydWN0IG5mZ2VubXNnICptc2cgPSBOTE1TR19EQVRBKG5saCk7Ci0JCXUzMiBybGVuOwotCi0JCWlmIChtc2ctPm5mZ2VuX2ZhbWlseSAhPSBBRl9JTkVUKQotCQkJcmV0dXJuIC1FQUZOT1NVUFBPUlQ7Ci0KLQkJaWYgKCgqZXJycCA9IG5ldGxpbmtfZHVtcF9zdGFydChjdG5sLCBza2IsIG5saCwKLQkJCQkJCWN0bmV0bGlua19leHBfZHVtcF90YWJsZSwKLQkJCQkJCWN0bmV0bGlua19kb25lKSkgIT0gMCkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlybGVuID0gTkxNU0dfQUxJR04obmxoLT5ubG1zZ19sZW4pOwotCQlpZiAocmxlbiA+IHNrYi0+bGVuKQotCQkJcmxlbiA9IHNrYi0+bGVuOwotCQlza2JfcHVsbChza2IsIHJsZW4pOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAoY2RhW0NUQV9FWFBFQ1RfTUFTVEVSLTFdKQotCQllcnIgPSBjdG5ldGxpbmtfcGFyc2VfdHVwbGUoY2RhLCAmdHVwbGUsIENUQV9FWFBFQ1RfTUFTVEVSKTsKLQllbHNlCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0KLQlleHAgPSBpcF9jb25udHJhY2tfZXhwZWN0X2ZpbmRfZ2V0KCZ0dXBsZSk7Ci0JaWYgKCFleHApCi0JCXJldHVybiAtRU5PRU5UOwotCi0JaWYgKGNkYVtDVEFfRVhQRUNUX0lELTFdKSB7Ci0JCV9fYmUzMiBpZCA9ICooX19iZTMyICopTkZBX0RBVEEoY2RhW0NUQV9FWFBFQ1RfSUQtMV0pOwotCQlpZiAoZXhwLT5pZCAhPSBudG9obChpZCkpIHsKLQkJCWlwX2Nvbm50cmFja19leHBlY3RfcHV0KGV4cCk7Ci0JCQlyZXR1cm4gLUVOT0VOVDsKLQkJfQotCX0KLQotCWVyciA9IC1FTk9NRU07Ci0Jc2tiMiA9IGFsbG9jX3NrYihOTE1TR19HT09EU0laRSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFza2IyKQotCQlnb3RvIG91dDsKLQotCWVyciA9IGN0bmV0bGlua19leHBfZmlsbF9pbmZvKHNrYjIsIE5FVExJTktfQ0Ioc2tiKS5waWQsCi0JCQkJICAgICAgbmxoLT5ubG1zZ19zZXEsIElQQ1ROTF9NU0dfRVhQX05FVywKLQkJCQkgICAgICAxLCBleHApOwotCWlmIChlcnIgPD0gMCkKLQkJZ290byBmcmVlOwotCi0JaXBfY29ubnRyYWNrX2V4cGVjdF9wdXQoZXhwKTsKLQotCXJldHVybiBuZXRsaW5rX3VuaWNhc3QoY3RubCwgc2tiMiwgTkVUTElOS19DQihza2IpLnBpZCwgTVNHX0RPTlRXQUlUKTsKLQotZnJlZToKLQlrZnJlZV9za2Ioc2tiMik7Ci1vdXQ6Ci0JaXBfY29ubnRyYWNrX2V4cGVjdF9wdXQoZXhwKTsKLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgaW50Ci1jdG5ldGxpbmtfZGVsX2V4cGVjdChzdHJ1Y3Qgc29jayAqY3RubCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJICAgICBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgc3RydWN0IG5mYXR0ciAqY2RhW10sIGludCAqZXJycCkKLXsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqZXhwLCAqdG1wOwotCXN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgdHVwbGU7Ci0Jc3RydWN0IGlwX2Nvbm50cmFja19oZWxwZXIgKmg7Ci0JaW50IGVycjsKLQotCWlmIChuZmF0dHJfYmFkX3NpemUoY2RhLCBDVEFfRVhQRUNUX01BWCwgY3RhX21pbl9leHApKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChjZGFbQ1RBX0VYUEVDVF9UVVBMRS0xXSkgewotCQkvKiBkZWxldGUgYSBzaW5nbGUgZXhwZWN0IGJ5IHR1cGxlICovCi0JCWVyciA9IGN0bmV0bGlua19wYXJzZV90dXBsZShjZGEsICZ0dXBsZSwgQ1RBX0VYUEVDVF9UVVBMRSk7Ci0JCWlmIChlcnIgPCAwKQotCQkJcmV0dXJuIGVycjsKLQotCQkvKiBidW1wIHVzYWdlIGNvdW50IHRvIDIgKi8KLQkJZXhwID0gaXBfY29ubnRyYWNrX2V4cGVjdF9maW5kX2dldCgmdHVwbGUpOwotCQlpZiAoIWV4cCkKLQkJCXJldHVybiAtRU5PRU5UOwotCi0JCWlmIChjZGFbQ1RBX0VYUEVDVF9JRC0xXSkgewotCQkJX19iZTMyIGlkID0KLQkJCQkqKF9fYmUzMiAqKU5GQV9EQVRBKGNkYVtDVEFfRVhQRUNUX0lELTFdKTsKLQkJCWlmIChleHAtPmlkICE9IG50b2hsKGlkKSkgewotCQkJCWlwX2Nvbm50cmFja19leHBlY3RfcHV0KGV4cCk7Ci0JCQkJcmV0dXJuIC1FTk9FTlQ7Ci0JCQl9Ci0JCX0KLQotCQkvKiBhZnRlciBsaXN0IHJlbW92YWwsIHVzYWdlIGNvdW50ID09IDEgKi8KLQkJaXBfY29ubnRyYWNrX3VuZXhwZWN0X3JlbGF0ZWQoZXhwKTsKLQkJLyogaGF2ZSB0byBwdXQgd2hhdCB3ZSAnZ2V0JyBhYm92ZS4KLQkJICogYWZ0ZXIgdGhpcyBsaW5lIHVzYWdlIGNvdW50ID09IDAgKi8KLQkJaXBfY29ubnRyYWNrX2V4cGVjdF9wdXQoZXhwKTsKLQl9IGVsc2UgaWYgKGNkYVtDVEFfRVhQRUNUX0hFTFBfTkFNRS0xXSkgewotCQljaGFyICpuYW1lID0gTkZBX0RBVEEoY2RhW0NUQV9FWFBFQ1RfSEVMUF9OQU1FLTFdKTsKLQotCQkvKiBkZWxldGUgYWxsIGV4cGVjdGF0aW9ucyBmb3IgdGhpcyBoZWxwZXIgKi8KLQkJd3JpdGVfbG9ja19iaCgmaXBfY29ubnRyYWNrX2xvY2spOwotCQloID0gX19pcF9jb25udHJhY2tfaGVscGVyX2ZpbmRfYnluYW1lKG5hbWUpOwotCQlpZiAoIWgpIHsKLQkJCXdyaXRlX3VubG9ja19iaCgmaXBfY29ubnRyYWNrX2xvY2spOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGV4cCwgdG1wLCAmaXBfY29ubnRyYWNrX2V4cGVjdF9saXN0LAotCQkJCQkgbGlzdCkgewotCQkJaWYgKGV4cC0+bWFzdGVyLT5oZWxwZXIgPT0gaAotCQkJICAgICYmIGRlbF90aW1lcigmZXhwLT50aW1lb3V0KSkgewotCQkJCWlwX2N0X3VubGlua19leHBlY3QoZXhwKTsKLQkJCQlpcF9jb25udHJhY2tfZXhwZWN0X3B1dChleHApOwotCQkJfQotCQl9Ci0JCXdyaXRlX3VubG9ja19iaCgmaXBfY29ubnRyYWNrX2xvY2spOwotCX0gZWxzZSB7Ci0JCS8qIFRoaXMgYmFzaWNhbGx5IG1lYW5zIHdlIGhhdmUgdG8gZmx1c2ggZXZlcnl0aGluZyovCi0JCXdyaXRlX2xvY2tfYmgoJmlwX2Nvbm50cmFja19sb2NrKTsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGV4cCwgdG1wLCAmaXBfY29ubnRyYWNrX2V4cGVjdF9saXN0LAotCQkJCQkgbGlzdCkgewotCQkJaWYgKGRlbF90aW1lcigmZXhwLT50aW1lb3V0KSkgewotCQkJCWlwX2N0X3VubGlua19leHBlY3QoZXhwKTsKLQkJCQlpcF9jb25udHJhY2tfZXhwZWN0X3B1dChleHApOwotCQkJfQotCQl9Ci0JCXdyaXRlX3VubG9ja19iaCgmaXBfY29ubnRyYWNrX2xvY2spOwotCX0KLQotCXJldHVybiAwOwotfQotc3RhdGljIGludAotY3RuZXRsaW5rX2NoYW5nZV9leHBlY3Qoc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKngsIHN0cnVjdCBuZmF0dHIgKmNkYVtdKQotewotCXJldHVybiAtRU9QTk9UU1VQUDsKLX0KLQotc3RhdGljIGludAotY3RuZXRsaW5rX2NyZWF0ZV9leHBlY3Qoc3RydWN0IG5mYXR0ciAqY2RhW10pCi17Ci0Jc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSB0dXBsZSwgbWFzaywgbWFzdGVyX3R1cGxlOwotCXN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGVfaGFzaCAqaCA9IE5VTEw7Ci0Jc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmV4cDsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdDsKLQlpbnQgZXJyID0gMDsKLQotCS8qIGNhbGxlciBndWFyYW50ZWVzIHRoYXQgdGhvc2UgdGhyZWUgQ1RBX0VYUEVDVF8qIGV4aXN0ICovCi0JZXJyID0gY3RuZXRsaW5rX3BhcnNlX3R1cGxlKGNkYSwgJnR1cGxlLCBDVEFfRVhQRUNUX1RVUExFKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQllcnIgPSBjdG5ldGxpbmtfcGFyc2VfdHVwbGUoY2RhLCAmbWFzaywgQ1RBX0VYUEVDVF9NQVNLKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQllcnIgPSBjdG5ldGxpbmtfcGFyc2VfdHVwbGUoY2RhLCAmbWFzdGVyX3R1cGxlLCBDVEFfRVhQRUNUX01BU1RFUik7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0KLQkvKiBMb29rIGZvciBtYXN0ZXIgY29ubnRyYWNrIG9mIHRoaXMgZXhwZWN0YXRpb24gKi8KLQloID0gaXBfY29ubnRyYWNrX2ZpbmRfZ2V0KCZtYXN0ZXJfdHVwbGUsIE5VTEwpOwotCWlmICghaCkKLQkJcmV0dXJuIC1FTk9FTlQ7Ci0JY3QgPSB0dXBsZWhhc2hfdG9fY3RyYWNrKGgpOwotCi0JaWYgKCFjdC0+aGVscGVyKSB7Ci0JCS8qIHN1Y2ggY29ubnRyYWNrIGhhc24ndCBnb3QgYW55IGhlbHBlciwgYWJvcnQgKi8KLQkJZXJyID0gLUVJTlZBTDsKLQkJZ290byBvdXQ7Ci0JfQotCi0JZXhwID0gaXBfY29ubnRyYWNrX2V4cGVjdF9hbGxvYyhjdCk7Ci0JaWYgKCFleHApIHsKLQkJZXJyID0gLUVOT01FTTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JZXhwLT5leHBlY3RmbiA9IE5VTEw7Ci0JZXhwLT5mbGFncyA9IDA7Ci0JZXhwLT5tYXN0ZXIgPSBjdDsKLQltZW1jcHkoJmV4cC0+dHVwbGUsICZ0dXBsZSwgc2l6ZW9mKHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUpKTsKLQltZW1jcHkoJmV4cC0+bWFzaywgJm1hc2ssIHNpemVvZihzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlKSk7Ci0KLQllcnIgPSBpcF9jb25udHJhY2tfZXhwZWN0X3JlbGF0ZWQoZXhwKTsKLQlpcF9jb25udHJhY2tfZXhwZWN0X3B1dChleHApOwotCi1vdXQ6Ci0JaXBfY29ubnRyYWNrX3B1dCh0dXBsZWhhc2hfdG9fY3RyYWNrKGgpKTsKLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgaW50Ci1jdG5ldGxpbmtfbmV3X2V4cGVjdChzdHJ1Y3Qgc29jayAqY3RubCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJICAgICBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgc3RydWN0IG5mYXR0ciAqY2RhW10sIGludCAqZXJycCkKLXsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlIHR1cGxlOwotCXN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpleHA7Ci0JaW50IGVyciA9IDA7Ci0KLQlpZiAobmZhdHRyX2JhZF9zaXplKGNkYSwgQ1RBX0VYUEVDVF9NQVgsIGN0YV9taW5fZXhwKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoIWNkYVtDVEFfRVhQRUNUX1RVUExFLTFdCi0JICAgIHx8ICFjZGFbQ1RBX0VYUEVDVF9NQVNLLTFdCi0JICAgIHx8ICFjZGFbQ1RBX0VYUEVDVF9NQVNURVItMV0pCi0JCXJldHVybiAtRUlOVkFMOwotCi0JZXJyID0gY3RuZXRsaW5rX3BhcnNlX3R1cGxlKGNkYSwgJnR1cGxlLCBDVEFfRVhQRUNUX1RVUExFKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQotCXdyaXRlX2xvY2tfYmgoJmlwX2Nvbm50cmFja19sb2NrKTsKLQlleHAgPSBfX2lwX2Nvbm50cmFja19leHBlY3RfZmluZCgmdHVwbGUpOwotCi0JaWYgKCFleHApIHsKLQkJd3JpdGVfdW5sb2NrX2JoKCZpcF9jb25udHJhY2tfbG9jayk7Ci0JCWVyciA9IC1FTk9FTlQ7Ci0JCWlmIChubGgtPm5sbXNnX2ZsYWdzICYgTkxNX0ZfQ1JFQVRFKQotCQkJZXJyID0gY3RuZXRsaW5rX2NyZWF0ZV9leHBlY3QoY2RhKTsKLQkJcmV0dXJuIGVycjsKLQl9Ci0KLQllcnIgPSAtRUVYSVNUOwotCWlmICghKG5saC0+bmxtc2dfZmxhZ3MgJiBOTE1fRl9FWENMKSkKLQkJZXJyID0gY3RuZXRsaW5rX2NoYW5nZV9leHBlY3QoZXhwLCBjZGEpOwotCXdyaXRlX3VubG9ja19iaCgmaXBfY29ubnRyYWNrX2xvY2spOwotCi0JcmV0dXJuIGVycjsKLX0KLQotI2lmZGVmIENPTkZJR19JUF9ORl9DT05OVFJBQ0tfRVZFTlRTCi1zdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGN0bmxfbm90aWZpZXIgPSB7Ci0JLm5vdGlmaWVyX2NhbGwJPSBjdG5ldGxpbmtfY29ubnRyYWNrX2V2ZW50LAotfTsKLQotc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBjdG5sX25vdGlmaWVyX2V4cCA9IHsKLQkubm90aWZpZXJfY2FsbAk9IGN0bmV0bGlua19leHBlY3RfZXZlbnQsCi19OwotI2VuZGlmCi0KLXN0YXRpYyBzdHJ1Y3QgbmZubF9jYWxsYmFjayBjdG5sX2NiW0lQQ1ROTF9NU0dfTUFYXSA9IHsKLQlbSVBDVE5MX01TR19DVF9ORVddCQk9IHsgLmNhbGwgPSBjdG5ldGxpbmtfbmV3X2Nvbm50cmFjaywKLQkJCQkJICAgIC5hdHRyX2NvdW50ID0gQ1RBX01BWCwgfSwKLQlbSVBDVE5MX01TR19DVF9HRVRdIAkJPSB7IC5jYWxsID0gY3RuZXRsaW5rX2dldF9jb25udHJhY2ssCi0JCQkJCSAgICAuYXR0cl9jb3VudCA9IENUQV9NQVgsIH0sCi0JW0lQQ1ROTF9NU0dfQ1RfREVMRVRFXSAgCT0geyAuY2FsbCA9IGN0bmV0bGlua19kZWxfY29ubnRyYWNrLAotCQkJCQkgICAgLmF0dHJfY291bnQgPSBDVEFfTUFYLCB9LAotCVtJUENUTkxfTVNHX0NUX0dFVF9DVFJaRVJPXSAJPSB7IC5jYWxsID0gY3RuZXRsaW5rX2dldF9jb25udHJhY2ssCi0JCQkJCSAgICAuYXR0cl9jb3VudCA9IENUQV9NQVgsIH0sCi19OwotCi1zdGF0aWMgc3RydWN0IG5mbmxfY2FsbGJhY2sgY3RubF9leHBfY2JbSVBDVE5MX01TR19FWFBfTUFYXSA9IHsKLQlbSVBDVE5MX01TR19FWFBfR0VUXQkJPSB7IC5jYWxsID0gY3RuZXRsaW5rX2dldF9leHBlY3QsCi0JCQkJCSAgICAuYXR0cl9jb3VudCA9IENUQV9FWFBFQ1RfTUFYLCB9LAotCVtJUENUTkxfTVNHX0VYUF9ORVddCQk9IHsgLmNhbGwgPSBjdG5ldGxpbmtfbmV3X2V4cGVjdCwKLQkJCQkJICAgIC5hdHRyX2NvdW50ID0gQ1RBX0VYUEVDVF9NQVgsIH0sCi0JW0lQQ1ROTF9NU0dfRVhQX0RFTEVURV0JCT0geyAuY2FsbCA9IGN0bmV0bGlua19kZWxfZXhwZWN0LAotCQkJCQkgICAgLmF0dHJfY291bnQgPSBDVEFfRVhQRUNUX01BWCwgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbmZuZXRsaW5rX3N1YnN5c3RlbSBjdG5sX3N1YnN5cyA9IHsKLQkubmFtZQkJCQk9ICJjb25udHJhY2siLAotCS5zdWJzeXNfaWQJCQk9IE5GTkxfU1VCU1lTX0NUTkVUTElOSywKLQkuY2JfY291bnQJCQk9IElQQ1ROTF9NU0dfTUFYLAotCS5jYgkJCQk9IGN0bmxfY2IsCi19OwotCi1zdGF0aWMgc3RydWN0IG5mbmV0bGlua19zdWJzeXN0ZW0gY3RubF9leHBfc3Vic3lzID0gewotCS5uYW1lCQkJCT0gImNvbm50cmFja19leHBlY3QiLAotCS5zdWJzeXNfaWQJCQk9IE5GTkxfU1VCU1lTX0NUTkVUTElOS19FWFAsCi0JLmNiX2NvdW50CQkJPSBJUENUTkxfTVNHX0VYUF9NQVgsCi0JLmNiCQkJCT0gY3RubF9leHBfY2IsCi19OwotCi1NT0RVTEVfQUxJQVNfTkZOTF9TVUJTWVMoTkZOTF9TVUJTWVNfQ1RORVRMSU5LKTsKLU1PRFVMRV9BTElBU19ORk5MX1NVQlNZUyhORk5MX1NVQlNZU19DVE5FVExJTktfRVhQKTsKLQotc3RhdGljIGludCBfX2luaXQgY3RuZXRsaW5rX2luaXQodm9pZCkKLXsKLQlpbnQgcmV0OwotCi0JcHJpbnRrKCJjdG5ldGxpbmsgdiVzOiByZWdpc3RlcmluZyB3aXRoIG5mbmV0bGluay5cbiIsIHZlcnNpb24pOwotCXJldCA9IG5mbmV0bGlua19zdWJzeXNfcmVnaXN0ZXIoJmN0bmxfc3Vic3lzKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcmludGsoImN0bmV0bGlua19pbml0OiBjYW5ub3QgcmVnaXN0ZXIgd2l0aCBuZm5ldGxpbmsuXG4iKTsKLQkJZ290byBlcnJfb3V0OwotCX0KLQotCXJldCA9IG5mbmV0bGlua19zdWJzeXNfcmVnaXN0ZXIoJmN0bmxfZXhwX3N1YnN5cyk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJpbnRrKCJjdG5ldGxpbmtfaW5pdDogY2Fubm90IHJlZ2lzdGVyIGV4cCB3aXRoIG5mbmV0bGluay5cbiIpOwotCQlnb3RvIGVycl91bnJlZ19zdWJzeXM7Ci0JfQotCi0jaWZkZWYgQ09ORklHX0lQX05GX0NPTk5UUkFDS19FVkVOVFMKLQlyZXQgPSBpcF9jb25udHJhY2tfcmVnaXN0ZXJfbm90aWZpZXIoJmN0bmxfbm90aWZpZXIpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50aygiY3RuZXRsaW5rX2luaXQ6IGNhbm5vdCByZWdpc3RlciBub3RpZmllci5cbiIpOwotCQlnb3RvIGVycl91bnJlZ19leHBfc3Vic3lzOwotCX0KLQotCXJldCA9IGlwX2Nvbm50cmFja19leHBlY3RfcmVnaXN0ZXJfbm90aWZpZXIoJmN0bmxfbm90aWZpZXJfZXhwKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcmludGsoImN0bmV0bGlua19pbml0OiBjYW5ub3QgZXhwZWN0IHJlZ2lzdGVyIG5vdGlmaWVyLlxuIik7Ci0JCWdvdG8gZXJyX3VucmVnX25vdGlmaWVyOwotCX0KLSNlbmRpZgotCi0JcmV0dXJuIDA7Ci0KLSNpZmRlZiBDT05GSUdfSVBfTkZfQ09OTlRSQUNLX0VWRU5UUwotZXJyX3VucmVnX25vdGlmaWVyOgotCWlwX2Nvbm50cmFja191bnJlZ2lzdGVyX25vdGlmaWVyKCZjdG5sX25vdGlmaWVyKTsKLWVycl91bnJlZ19leHBfc3Vic3lzOgotCW5mbmV0bGlua19zdWJzeXNfdW5yZWdpc3RlcigmY3RubF9leHBfc3Vic3lzKTsKLSNlbmRpZgotZXJyX3VucmVnX3N1YnN5czoKLQluZm5ldGxpbmtfc3Vic3lzX3VucmVnaXN0ZXIoJmN0bmxfc3Vic3lzKTsKLWVycl9vdXQ6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGN0bmV0bGlua19leGl0KHZvaWQpCi17Ci0JcHJpbnRrKCJjdG5ldGxpbms6IHVucmVnaXN0ZXJpbmcgZnJvbSBuZm5ldGxpbmsuXG4iKTsKLQotI2lmZGVmIENPTkZJR19JUF9ORl9DT05OVFJBQ0tfRVZFTlRTCi0JaXBfY29ubnRyYWNrX2V4cGVjdF91bnJlZ2lzdGVyX25vdGlmaWVyKCZjdG5sX25vdGlmaWVyX2V4cCk7Ci0JaXBfY29ubnRyYWNrX3VucmVnaXN0ZXJfbm90aWZpZXIoJmN0bmxfbm90aWZpZXIpOwotI2VuZGlmCi0KLQluZm5ldGxpbmtfc3Vic3lzX3VucmVnaXN0ZXIoJmN0bmxfZXhwX3N1YnN5cyk7Ci0JbmZuZXRsaW5rX3N1YnN5c191bnJlZ2lzdGVyKCZjdG5sX3N1YnN5cyk7Ci0JcmV0dXJuOwotfQotCi1tb2R1bGVfaW5pdChjdG5ldGxpbmtfaW5pdCk7Ci1tb2R1bGVfZXhpdChjdG5ldGxpbmtfZXhpdCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX3Byb3RvX2dlbmVyaWMuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfcHJvdG9fZ2VuZXJpYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGFmODJlLi4wMDAwMDAwCi0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfcHJvdG9fZ2VuZXJpYy5jCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyogKEMpIDE5OTktMjAwMSBQYXVsIGBSdXN0eScgUnVzc2VsbAotICogKEMpIDIwMDItMjAwNCBOZXRmaWx0ZXIgQ29yZSBUZWFtIDxjb3JldGVhbUBuZXRmaWx0ZXIub3JnPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvdGltZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfcHJvdG9jb2wuaD4KLQotdW5zaWduZWQgaW50IGlwX2N0X2dlbmVyaWNfdGltZW91dCBfX3JlYWRfbW9zdGx5ID0gNjAwKkhaOwotCi1zdGF0aWMgaW50IGdlbmVyaWNfcGt0X3RvX3R1cGxlKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJdW5zaWduZWQgaW50IGRhdGFvZmYsCi0JCQkJc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUpCi17Ci0JdHVwbGUtPnNyYy51LmFsbCA9IDA7Ci0JdHVwbGUtPmRzdC51LmFsbCA9IDA7Ci0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBnZW5lcmljX2ludmVydF90dXBsZShzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0dXBsZSwKLQkJCQljb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICpvcmlnKQotewotCXR1cGxlLT5zcmMudS5hbGwgPSAwOwotCXR1cGxlLT5kc3QudS5hbGwgPSAwOwotCi0JcmV0dXJuIDE7Ci19Ci0KLS8qIFByaW50IG91dCB0aGUgcGVyLXByb3RvY29sIHBhcnQgb2YgdGhlIHR1cGxlLiAqLwotc3RhdGljIGludCBnZW5lcmljX3ByaW50X3R1cGxlKHN0cnVjdCBzZXFfZmlsZSAqcywKLQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0dXBsZSkKLXsKLQlyZXR1cm4gMDsKLX0KLQotLyogUHJpbnQgb3V0IHRoZSBwcml2YXRlIHBhcnQgb2YgdGhlIGNvbm50cmFjay4gKi8KLXN0YXRpYyBpbnQgZ2VuZXJpY19wcmludF9jb25udHJhY2soc3RydWN0IHNlcV9maWxlICpzLAotCQkJCSAgIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2sgKnN0YXRlKQotewotCXJldHVybiAwOwotfQotCi0vKiBSZXR1cm5zIHZlcmRpY3QgZm9yIHBhY2tldCwgb3IgLTEgZm9yIGludmFsaWQuICovCi1zdGF0aWMgaW50IHBhY2tldChzdHJ1Y3QgaXBfY29ubnRyYWNrICpjb25udHJhY2ssCi0JCSAgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbykKLXsKLQlpcF9jdF9yZWZyZXNoX2FjY3QoY29ubnRyYWNrLCBjdGluZm8sIHNrYiwgaXBfY3RfZ2VuZXJpY190aW1lb3V0KTsKLQlyZXR1cm4gTkZfQUNDRVBUOwotfQotCi0vKiBDYWxsZWQgd2hlbiBhIG5ldyBjb25uZWN0aW9uIGZvciB0aGlzIHByb3RvY29sIGZvdW5kLiAqLwotc3RhdGljIGludCBuZXcoc3RydWN0IGlwX2Nvbm50cmFjayAqY29ubnRyYWNrLCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCXJldHVybiAxOwotfQotCi1zdHJ1Y3QgaXBfY29ubnRyYWNrX3Byb3RvY29sIGlwX2Nvbm50cmFja19nZW5lcmljX3Byb3RvY29sID0KLXsKLQkucHJvdG8JCQk9IDAsCi0JLm5hbWUJCQk9ICJ1bmtub3duIiwKLQkucGt0X3RvX3R1cGxlCQk9IGdlbmVyaWNfcGt0X3RvX3R1cGxlLAotCS5pbnZlcnRfdHVwbGUJCT0gZ2VuZXJpY19pbnZlcnRfdHVwbGUsCi0JLnByaW50X3R1cGxlCQk9IGdlbmVyaWNfcHJpbnRfdHVwbGUsCi0JLnByaW50X2Nvbm50cmFjawk9IGdlbmVyaWNfcHJpbnRfY29ubnRyYWNrLAotCS5wYWNrZXQJCQk9IHBhY2tldCwKLQkubmV3CQkJPSBuZXcsCi19OwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19wcm90b19ncmUuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfcHJvdG9fZ3JlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjMWM0OWUuLjAwMDAwMDAKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19wcm90b19ncmUuYworKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi0vKgotICogaXBfY29ubnRyYWNrX3Byb3RvX2dyZS5jIC0gVmVyc2lvbiAzLjAKLSAqCi0gKiBDb25uZWN0aW9uIHRyYWNraW5nIHByb3RvY29sIGhlbHBlciBtb2R1bGUgZm9yIEdSRS4KLSAqCi0gKiBHUkUgaXMgYSBnZW5lcmljIGVuY2Fwc3VsYXRpb24gcHJvdG9jb2wsIHdoaWNoIGlzIGdlbmVyYWxseSBub3QgdmVyeQotICogc3VpdGVkIGZvciBOQVQsIGFzIGl0IGhhcyBubyBwcm90b2NvbC1zcGVjaWZpYyBwYXJ0IGFzIHBvcnQgbnVtYmVycy4KLSAqCi0gKiBJdCBoYXMgYW4gb3B0aW9uYWwga2V5IGZpZWxkLCB3aGljaCBtYXkgaGVscCB1cyBkaXN0aW5ndWlzaGluZyB0d28KLSAqIGNvbm5lY3Rpb25zIGJldHdlZW4gdGhlIHNhbWUgdHdvIGhvc3RzLgotICoKLSAqIEdSRSBpcyBkZWZpbmVkIGluIFJGQyAxNzAxIGFuZCBSRkMgMTcwMiwgYXMgd2VsbCBhcyBSRkMgMjc4NAotICoKLSAqIFBQVFAgaXMgYnVpbHQgb24gdG9wIG9mIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiBHUkUsIGFuZCBoYXMgYSBtYW5kYXRvcnkKLSAqIGZpZWxkIGNhbGxlZCAiQ2FsbElEIiwgd2hpY2ggc2VydmVzIHVzIGZvciB0aGUgc2FtZSBwdXJwb3NlIGFzIHRoZSBrZXkKLSAqIGZpZWxkIGluIHBsYWluIEdSRS4KLSAqCi0gKiBEb2N1bWVudGF0aW9uIGFib3V0IFBQVFAgY2FuIGJlIGZvdW5kIGluIFJGQyAyNjM3Ci0gKgotICogKEMpIDIwMDAtMjAwNSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgotICoKLSAqIERldmVsb3BtZW50IG9mIHRoaXMgY29kZSBmdW5kZWQgYnkgQXN0YXJvIEFHIChodHRwOi8vd3d3LmFzdGFyby5jb20vKQotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC90aW1lci5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgotI2luY2x1ZGUgPGxpbnV4L2lwLmg+Ci0jaW5jbHVkZSA8bGludXgvaW4uaD4KLSNpbmNsdWRlIDxsaW51eC9saXN0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLQotc3RhdGljIERFRklORV9SV0xPQ0soaXBfY3RfZ3JlX2xvY2spOwotCi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX3Byb3RvY29sLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2hlbHBlci5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19jb3JlLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfcHJvdG9fZ3JlLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX3BwdHAuaD4KLQotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX0FVVEhPUigiSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigibmV0ZmlsdGVyIGNvbm5lY3Rpb24gdHJhY2tpbmcgcHJvdG9jb2wgaGVscGVyIGZvciBHUkUiKTsKLQotLyogc2hhbWVsZXNzbHkgc3RvbGVuIGZyb20gaXBfY29ubnRyYWNrX3Byb3RvX3VkcC5jICovCi0jZGVmaW5lIEdSRV9USU1FT1VUCQkoMzAqSFopCi0jZGVmaW5lIEdSRV9TVFJFQU1fVElNRU9VVAkoMTgwKkhaKQotCi0jaWYgMAotI2RlZmluZSBERUJVR1AoZm9ybWF0LCBhcmdzLi4uKQlwcmludGsoS0VSTl9ERUJVRyAiJXM6JXM6ICIgZm9ybWF0LCBfX0ZJTEVfXywgX19GVU5DVElPTl9fLCAjIyBhcmdzKQotI2RlZmluZSBEVU1QX1RVUExFX0dSRSh4KSBwcmludGsoIiV1LiV1LiV1LiV1OjB4JXggLT4gJXUuJXUuJXUuJXU6MHgleFxuIiwgXAotCQkJTklQUVVBRCgoeCktPnNyYy5pcCksIG50b2hzKCh4KS0+c3JjLnUuZ3JlLmtleSksIFwKLQkJCU5JUFFVQUQoKHgpLT5kc3QuaXApLCBudG9ocygoeCktPmRzdC51LmdyZS5rZXkpKQotI2Vsc2UKLSNkZWZpbmUgREVCVUdQKHgsIGFyZ3MuLi4pCi0jZGVmaW5lIERVTVBfVFVQTEVfR1JFKHgpCi0jZW5kaWYKLQotLyogR1JFIEtFWU1BUCBIQU5ETElORyBGVU5DVElPTlMgKi8KLXN0YXRpYyBMSVNUX0hFQUQoZ3JlX2tleW1hcF9saXN0KTsKLQotc3RhdGljIGlubGluZSBpbnQgZ3JlX2tleV9jbXBmbihjb25zdCBzdHJ1Y3QgaXBfY3RfZ3JlX2tleW1hcCAqa20sCi0JCQkJY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdCkKLXsKLQlyZXR1cm4gKChrbS0+dHVwbGUuc3JjLmlwID09IHQtPnNyYy5pcCkgJiYKLQkJKGttLT50dXBsZS5kc3QuaXAgPT0gdC0+ZHN0LmlwKSAmJgotCQkoa20tPnR1cGxlLmRzdC5wcm90b251bSA9PSB0LT5kc3QucHJvdG9udW0pICYmCi0JCShrbS0+dHVwbGUuZHN0LnUuYWxsID09IHQtPmRzdC51LmFsbCkpOwotfQotCi0vKiBsb29rIHVwIHRoZSBzb3VyY2Uga2V5IGZvciBhIGdpdmVuIHR1cGxlICovCi1zdGF0aWMgX19iZTE2IGdyZV9rZXltYXBfbG9va3VwKHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnQpCi17Ci0Jc3RydWN0IGlwX2N0X2dyZV9rZXltYXAgKmttOwotCV9fYmUxNiBrZXkgPSAwOwotCi0JcmVhZF9sb2NrX2JoKCZpcF9jdF9ncmVfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShrbSwgJmdyZV9rZXltYXBfbGlzdCwgbGlzdCkgewotCQlpZiAoZ3JlX2tleV9jbXBmbihrbSwgdCkpIHsKLQkJCWtleSA9IGttLT50dXBsZS5zcmMudS5ncmUua2V5OwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JcmVhZF91bmxvY2tfYmgoJmlwX2N0X2dyZV9sb2NrKTsKLQotCURFQlVHUCgibG9va3VwIHNyYyBrZXkgMHgleCB1cCBrZXkgZm9yICIsIGtleSk7Ci0JRFVNUF9UVVBMRV9HUkUodCk7Ci0KLQlyZXR1cm4ga2V5OwotfQotCi0vKiBhZGQgYSBzaW5nbGUga2V5bWFwIGVudHJ5LCBhc3NvY2lhdGUgd2l0aCBzcGVjaWZpZWQgbWFzdGVyIGN0ICovCi1pbnQKLWlwX2N0X2dyZV9rZXltYXBfYWRkKHN0cnVjdCBpcF9jb25udHJhY2sgKmN0LAotCQkgICAgIHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnQsIGludCByZXBseSkKLXsKLQlzdHJ1Y3QgaXBfY3RfZ3JlX2tleW1hcCAqKmV4aXN0X2ttLCAqa207Ci0KLQlpZiAoIWN0LT5oZWxwZXIgfHwgc3RyY21wKGN0LT5oZWxwZXItPm5hbWUsICJwcHRwIikpIHsKLQkJREVCVUdQKCJyZWZ1c2luZyB0byBhZGQgR1JFIGtleW1hcCB0byBub24tcHB0cCBzZXNzaW9uXG4iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCWlmICghcmVwbHkpCi0JCWV4aXN0X2ttID0gJmN0LT5oZWxwLmN0X3BwdHBfaW5mby5rZXltYXBfb3JpZzsKLQllbHNlCi0JCWV4aXN0X2ttID0gJmN0LT5oZWxwLmN0X3BwdHBfaW5mby5rZXltYXBfcmVwbHk7Ci0KLQlpZiAoKmV4aXN0X2ttKSB7Ci0JCS8qIGNoZWNrIHdoZXRoZXIgaXQncyBhIHJldHJhbnNtaXNzaW9uICovCi0JCWxpc3RfZm9yX2VhY2hfZW50cnkoa20sICZncmVfa2V5bWFwX2xpc3QsIGxpc3QpIHsKLQkJCWlmIChncmVfa2V5X2NtcGZuKGttLCB0KSAmJiBrbSA9PSAqZXhpc3Rfa20pCi0JCQkJcmV0dXJuIDA7Ci0JCX0KLQkJREVCVUdQKCJ0cnlpbmcgdG8gb3ZlcnJpZGUga2V5bWFwXyVzIGZvciBjdCAlcFxuIiwKLQkJCXJlcGx5PyAicmVwbHkiOiJvcmlnIiwgY3QpOwotCQlyZXR1cm4gLUVFWElTVDsKLQl9Ci0KLQlrbSA9IGttYWxsb2Moc2l6ZW9mKCprbSksIEdGUF9BVE9NSUMpOwotCWlmICgha20pCi0JCXJldHVybiAtRU5PTUVNOwotCi0JbWVtY3B5KCZrbS0+dHVwbGUsIHQsIHNpemVvZigqdCkpOwotCSpleGlzdF9rbSA9IGttOwotCi0JREVCVUdQKCJhZGRpbmcgbmV3IGVudHJ5ICVwOiAiLCBrbSk7Ci0JRFVNUF9UVVBMRV9HUkUoJmttLT50dXBsZSk7Ci0KLQl3cml0ZV9sb2NrX2JoKCZpcF9jdF9ncmVfbG9jayk7Ci0JbGlzdF9hZGRfdGFpbCgma20tPmxpc3QsICZncmVfa2V5bWFwX2xpc3QpOwotCXdyaXRlX3VubG9ja19iaCgmaXBfY3RfZ3JlX2xvY2spOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIGRlc3Ryb3kgdGhlIGtleW1hcCBlbnRyaWVzIGFzc29jaWF0ZWQgd2l0aCBzcGVjaWZpZWQgbWFzdGVyIGN0ICovCi12b2lkIGlwX2N0X2dyZV9rZXltYXBfZGVzdHJveShzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCkKLXsKLQlERUJVR1AoImVudGVyaW5nIGZvciBjdCAlcFxuIiwgY3QpOwotCi0JaWYgKCFjdC0+aGVscGVyIHx8IHN0cmNtcChjdC0+aGVscGVyLT5uYW1lLCAicHB0cCIpKSB7Ci0JCURFQlVHUCgicmVmdXNpbmcgdG8gZGVzdHJveSBHUkUga2V5bWFwIHRvIG5vbi1wcHRwIHNlc3Npb25cbiIpOwotCQlyZXR1cm47Ci0JfQotCi0Jd3JpdGVfbG9ja19iaCgmaXBfY3RfZ3JlX2xvY2spOwotCWlmIChjdC0+aGVscC5jdF9wcHRwX2luZm8ua2V5bWFwX29yaWcpIHsKLQkJREVCVUdQKCJyZW1vdmluZyAlcCBmcm9tIGxpc3RcbiIsCi0JCQljdC0+aGVscC5jdF9wcHRwX2luZm8ua2V5bWFwX29yaWcpOwotCQlsaXN0X2RlbCgmY3QtPmhlbHAuY3RfcHB0cF9pbmZvLmtleW1hcF9vcmlnLT5saXN0KTsKLQkJa2ZyZWUoY3QtPmhlbHAuY3RfcHB0cF9pbmZvLmtleW1hcF9vcmlnKTsKLQkJY3QtPmhlbHAuY3RfcHB0cF9pbmZvLmtleW1hcF9vcmlnID0gTlVMTDsKLQl9Ci0JaWYgKGN0LT5oZWxwLmN0X3BwdHBfaW5mby5rZXltYXBfcmVwbHkpIHsKLQkJREVCVUdQKCJyZW1vdmluZyAlcCBmcm9tIGxpc3RcbiIsCi0JCQljdC0+aGVscC5jdF9wcHRwX2luZm8ua2V5bWFwX3JlcGx5KTsKLQkJbGlzdF9kZWwoJmN0LT5oZWxwLmN0X3BwdHBfaW5mby5rZXltYXBfcmVwbHktPmxpc3QpOwotCQlrZnJlZShjdC0+aGVscC5jdF9wcHRwX2luZm8ua2V5bWFwX3JlcGx5KTsKLQkJY3QtPmhlbHAuY3RfcHB0cF9pbmZvLmtleW1hcF9yZXBseSA9IE5VTEw7Ci0JfQotCXdyaXRlX3VubG9ja19iaCgmaXBfY3RfZ3JlX2xvY2spOwotfQotCi0KLS8qIFBVQkxJQyBDT05OVFJBQ0sgUFJPVE8gSEVMUEVSIEZVTkNUSU9OUyAqLwotCi0vKiBpbnZlcnQgZ3JlIHBhcnQgb2YgdHVwbGUgKi8KLXN0YXRpYyBpbnQgZ3JlX2ludmVydF90dXBsZShzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0dXBsZSwKLQkJCSAgICBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICpvcmlnKQotewotCXR1cGxlLT5kc3QudS5ncmUua2V5ID0gb3JpZy0+c3JjLnUuZ3JlLmtleTsKLQl0dXBsZS0+c3JjLnUuZ3JlLmtleSA9IG9yaWctPmRzdC51LmdyZS5rZXk7Ci0KLQlyZXR1cm4gMTsKLX0KLQotLyogZ3JlIGhkciBpbmZvIHRvIHR1cGxlICovCi1zdGF0aWMgaW50IGdyZV9wa3RfdG9fdHVwbGUoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCSAgIHVuc2lnbmVkIGludCBkYXRhb2ZmLAotCQkJICAgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUpCi17Ci0Jc3RydWN0IGdyZV9oZHJfcHB0cCBfcGdyZWhkciwgKnBncmVoZHI7Ci0JX19iZTE2IHNyY2tleTsKLQlzdHJ1Y3QgZ3JlX2hkciBfZ3JlaGRyLCAqZ3JlaGRyOwotCi0JLyogZmlyc3Qgb25seSBkZWxpbmVhcml6ZSBvbGQgUkZDMTcwMSBHUkUgaGVhZGVyICovCi0JZ3JlaGRyID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgZGF0YW9mZiwgc2l6ZW9mKF9ncmVoZHIpLCAmX2dyZWhkcik7Ci0JaWYgKCFncmVoZHIgfHwgZ3JlaGRyLT52ZXJzaW9uICE9IEdSRV9WRVJTSU9OX1BQVFApIHsKLQkJLyogdHJ5IHRvIGJlaGF2ZSBsaWtlICJpcF9jb25udHJhY2tfcHJvdG9fZ2VuZXJpYyIgKi8KLQkJdHVwbGUtPnNyYy51LmFsbCA9IDA7Ci0JCXR1cGxlLT5kc3QudS5hbGwgPSAwOwotCQlyZXR1cm4gMTsKLQl9Ci0KLQkvKiBQUFRQIGhlYWRlciBpcyB2YXJpYWJsZSBsZW5ndGgsIG9ubHkgbmVlZCB1cCB0byB0aGUgY2FsbF9pZCBmaWVsZCAqLwotCXBncmVoZHIgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBkYXRhb2ZmLCA4LCAmX3BncmVoZHIpOwotCWlmICghcGdyZWhkcikKLQkJcmV0dXJuIDE7Ci0KLQlpZiAobnRvaHMoZ3JlaGRyLT5wcm90b2NvbCkgIT0gR1JFX1BST1RPQ09MX1BQVFApIHsKLQkJREVCVUdQKCJHUkVfVkVSU0lPTl9QUFRQIGJ1dCB1bmtub3duIHByb3RvXG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JdHVwbGUtPmRzdC51LmdyZS5rZXkgPSBwZ3JlaGRyLT5jYWxsX2lkOwotCXNyY2tleSA9IGdyZV9rZXltYXBfbG9va3VwKHR1cGxlKTsKLQl0dXBsZS0+c3JjLnUuZ3JlLmtleSA9IHNyY2tleTsKLQotCXJldHVybiAxOwotfQotCi0vKiBwcmludCBncmUgcGFydCBvZiB0dXBsZSAqLwotc3RhdGljIGludCBncmVfcHJpbnRfdHVwbGUoc3RydWN0IHNlcV9maWxlICpzLAotCQkJICAgY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUpCi17Ci0JcmV0dXJuIHNlcV9wcmludGYocywgInNyY2tleT0weCV4IGRzdGtleT0weCV4ICIsCi0JCQkgIG50b2hzKHR1cGxlLT5zcmMudS5ncmUua2V5KSwKLQkJCSAgbnRvaHModHVwbGUtPmRzdC51LmdyZS5rZXkpKTsKLX0KLQotLyogcHJpbnQgcHJpdmF0ZSBkYXRhIGZvciBjb25udHJhY2sgKi8KLXN0YXRpYyBpbnQgZ3JlX3ByaW50X2Nvbm50cmFjayhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsCi0JCQkgICAgICAgY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFjayAqY3QpCi17Ci0JcmV0dXJuIHNlcV9wcmludGYocywgInRpbWVvdXQ9JXUsIHN0cmVhbV90aW1lb3V0PSV1ICIsCi0JCQkgIChjdC0+cHJvdG8uZ3JlLnRpbWVvdXQgLyBIWiksCi0JCQkgIChjdC0+cHJvdG8uZ3JlLnN0cmVhbV90aW1lb3V0IC8gSFopKTsKLX0KLQotLyogUmV0dXJucyB2ZXJkaWN0IGZvciBwYWNrZXQsIGFuZCBtYXkgbW9kaWZ5IGNvbm50cmFjayAqLwotc3RhdGljIGludCBncmVfcGFja2V0KHN0cnVjdCBpcF9jb25udHJhY2sgKmN0LAotCQkgICAgICBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkgICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGNvbm50cmFja2luZm8pCi17Ci0JLyogSWYgd2UndmUgc2VlbiB0cmFmZmljIGJvdGggd2F5cywgdGhpcyBpcyBhIEdSRSBjb25uZWN0aW9uLgotCSAqIEV4dGVuZCB0aW1lb3V0LiAqLwotCWlmIChjdC0+c3RhdHVzICYgSVBTX1NFRU5fUkVQTFkpIHsKLQkJaXBfY3RfcmVmcmVzaF9hY2N0KGN0LCBjb25udHJhY2tpbmZvLCBza2IsCi0JCQkJICAgY3QtPnByb3RvLmdyZS5zdHJlYW1fdGltZW91dCk7Ci0JCS8qIEFsc28sIG1vcmUgbGlrZWx5IHRvIGJlIGltcG9ydGFudCwgYW5kIG5vdCBhIHByb2JlLiAqLwotCQlzZXRfYml0KElQU19BU1NVUkVEX0JJVCwgJmN0LT5zdGF0dXMpOwotCQlpcF9jb25udHJhY2tfZXZlbnRfY2FjaGUoSVBDVF9TVEFUVVMsIHNrYik7Ci0JfSBlbHNlCi0JCWlwX2N0X3JlZnJlc2hfYWNjdChjdCwgY29ubnRyYWNraW5mbywgc2tiLAotCQkJCSAgIGN0LT5wcm90by5ncmUudGltZW91dCk7Ci0KLQlyZXR1cm4gTkZfQUNDRVBUOwotfQotCi0vKiBDYWxsZWQgd2hlbiBhIG5ldyBjb25uZWN0aW9uIGZvciB0aGlzIHByb3RvY29sIGZvdW5kLiAqLwotc3RhdGljIGludCBncmVfbmV3KHN0cnVjdCBpcF9jb25udHJhY2sgKmN0LAotCQkgICBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCURFQlVHUCgiOiAiKTsKLQlEVU1QX1RVUExFX0dSRSgmY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlKTsKLQotCS8qIGluaXRpYWxpemUgdG8gc2FuZSB2YWx1ZS4gIElkZWFsbHkgYSBjb25udHJhY2sgaGVscGVyCi0JICogKGUuZy4gaW4gY2FzZSBvZiBwcHRwKSBpcyBpbmNyZWFzaW5nIHRoZW0gKi8KLQljdC0+cHJvdG8uZ3JlLnN0cmVhbV90aW1lb3V0ID0gR1JFX1NUUkVBTV9USU1FT1VUOwotCWN0LT5wcm90by5ncmUudGltZW91dCA9IEdSRV9USU1FT1VUOwotCi0JcmV0dXJuIDE7Ci19Ci0KLS8qIENhbGxlZCB3aGVuIGEgY29ubnRyYWNrIGVudHJ5IGhhcyBhbHJlYWR5IGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBoYXNoZXMKLSAqIGFuZCBpcyBhYm91dCB0byBiZSBkZWxldGVkIGZyb20gbWVtb3J5ICovCi1zdGF0aWMgdm9pZCBncmVfZGVzdHJveShzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCkKLXsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrICptYXN0ZXIgPSBjdC0+bWFzdGVyOwotCURFQlVHUCgiIGVudGVyaW5nXG4iKTsKLQotCWlmICghbWFzdGVyKQotCQlERUJVR1AoIm5vIG1hc3RlciAhPyFcbiIpOwotCWVsc2UKLQkJaXBfY3RfZ3JlX2tleW1hcF9kZXN0cm95KG1hc3Rlcik7Ci19Ci0KLS8qIHByb3RvY29sIGhlbHBlciBzdHJ1Y3QgKi8KLXN0YXRpYyBzdHJ1Y3QgaXBfY29ubnRyYWNrX3Byb3RvY29sIGdyZSA9IHsKLQkucHJvdG8JCSA9IElQUFJPVE9fR1JFLAotCS5uYW1lCQkgPSAiZ3JlIiwKLQkucGt0X3RvX3R1cGxlCSA9IGdyZV9wa3RfdG9fdHVwbGUsCi0JLmludmVydF90dXBsZQkgPSBncmVfaW52ZXJ0X3R1cGxlLAotCS5wcmludF90dXBsZQkgPSBncmVfcHJpbnRfdHVwbGUsCi0JLnByaW50X2Nvbm50cmFjayA9IGdyZV9wcmludF9jb25udHJhY2ssCi0JLnBhY2tldAkJID0gZ3JlX3BhY2tldCwKLQkubmV3CQkgPSBncmVfbmV3LAotCS5kZXN0cm95CSA9IGdyZV9kZXN0cm95LAotCS5tZSAJCSA9IFRISVNfTU9EVUxFLAotI2lmIGRlZmluZWQoQ09ORklHX0lQX05GX0NPTk5UUkFDS19ORVRMSU5LKSB8fCBcCi0gICAgZGVmaW5lZChDT05GSUdfSVBfTkZfQ09OTlRSQUNLX05FVExJTktfTU9EVUxFKQotCS50dXBsZV90b19uZmF0dHIgPSBpcF9jdF9wb3J0X3R1cGxlX3RvX25mYXR0ciwKLQkubmZhdHRyX3RvX3R1cGxlID0gaXBfY3RfcG9ydF9uZmF0dHJfdG9fdHVwbGUsCi0jZW5kaWYKLX07Ci0KLS8qIGlwX2Nvbm50cmFja19wcm90b19ncmUgaW5pdGlhbGl6YXRpb24gKi8KLWludCBfX2luaXQgaXBfY3RfcHJvdG9fZ3JlX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gaXBfY29ubnRyYWNrX3Byb3RvY29sX3JlZ2lzdGVyKCZncmUpOwotfQotCi0vKiBUaGlzIGNhbm5vdCBiZSBfX2V4aXQsIGFzIGl0IGlzIGludm9rZWQgZnJvbSBpcF9jb25udHJhY2tfaGVscGVyX3BwdHAuYydzCi0gKiBpbml0KCkgY29kZSBvbiBlcnJvcnMuCi0gKi8KLXZvaWQgaXBfY3RfcHJvdG9fZ3JlX2Zpbmkodm9pZCkKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwb3MsICpuOwotCi0JLyogZGVsZXRlIGFsbCBrZXltYXAgZW50cmllcyAqLwotCXdyaXRlX2xvY2tfYmgoJmlwX2N0X2dyZV9sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoX3NhZmUocG9zLCBuLCAmZ3JlX2tleW1hcF9saXN0KSB7Ci0JCURFQlVHUCgiZGVsZXRpbmcga2V5bWFwICVwIGF0IG1vZHVsZSB1bmxvYWQgdGltZVxuIiwgcG9zKTsKLQkJbGlzdF9kZWwocG9zKTsKLQkJa2ZyZWUocG9zKTsKLQl9Ci0Jd3JpdGVfdW5sb2NrX2JoKCZpcF9jdF9ncmVfbG9jayk7Ci0KLQlpcF9jb25udHJhY2tfcHJvdG9jb2xfdW5yZWdpc3RlcigmZ3JlKTsKLX0KLQotRVhQT1JUX1NZTUJPTChpcF9jdF9ncmVfa2V5bWFwX2FkZCk7Ci1FWFBPUlRfU1lNQk9MKGlwX2N0X2dyZV9rZXltYXBfZGVzdHJveSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX3Byb3RvX2ljbXAuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfcHJvdG9faWNtcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDcwYzgxLi4wMDAwMDAwCi0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfcHJvdG9faWNtcC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzE1ICswLDAgQEAKLS8qIChDKSAxOTk5LTIwMDEgUGF1bCBgUnVzdHknIFJ1c3NlbGwKLSAqIChDKSAyMDAyLTIwMDQgTmV0ZmlsdGVyIENvcmUgVGVhbSA8Y29yZXRlYW1AbmV0ZmlsdGVyLm9yZz4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvaW4uaD4KLSNpbmNsdWRlIDxsaW51eC9pY21wLmg+Ci0jaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KLSNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLSNpbmNsdWRlIDxuZXQvaXAuaD4KLSNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFjay5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19jb3JlLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX3Byb3RvY29sLmg+Ci0KLXVuc2lnbmVkIGludCBpcF9jdF9pY21wX3RpbWVvdXQgX19yZWFkX21vc3RseSA9IDMwKkhaOwotCi0jaWYgMAotI2RlZmluZSBERUJVR1AgcHJpbnRrCi0jZWxzZQotI2RlZmluZSBERUJVR1AoZm9ybWF0LCBhcmdzLi4uKQotI2VuZGlmCi0KLXN0YXRpYyBpbnQgaWNtcF9wa3RfdG9fdHVwbGUoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCSAgICAgdW5zaWduZWQgaW50IGRhdGFvZmYsCi0JCQkgICAgIHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnR1cGxlKQotewotCXN0cnVjdCBpY21waGRyIF9oZHIsICpocDsKLQotCWhwID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgZGF0YW9mZiwgc2l6ZW9mKF9oZHIpLCAmX2hkcik7Ci0JaWYgKGhwID09IE5VTEwpCi0JCXJldHVybiAwOwotCi0JdHVwbGUtPmRzdC51LmljbXAudHlwZSA9IGhwLT50eXBlOwotCXR1cGxlLT5zcmMudS5pY21wLmlkID0gaHAtPnVuLmVjaG8uaWQ7Ci0JdHVwbGUtPmRzdC51LmljbXAuY29kZSA9IGhwLT5jb2RlOwotCi0JcmV0dXJuIDE7Ci19Ci0KLS8qIEFkZCAxOyBzcGFjZXMgZmlsbGVkIHdpdGggMC4gKi8KLXN0YXRpYyBjb25zdCB1X2ludDhfdCBpbnZtYXBbXSA9IHsKLQlbSUNNUF9FQ0hPXSA9IElDTVBfRUNIT1JFUExZICsgMSwKLQlbSUNNUF9FQ0hPUkVQTFldID0gSUNNUF9FQ0hPICsgMSwKLQlbSUNNUF9USU1FU1RBTVBdID0gSUNNUF9USU1FU1RBTVBSRVBMWSArIDEsCi0JW0lDTVBfVElNRVNUQU1QUkVQTFldID0gSUNNUF9USU1FU1RBTVAgKyAxLAotCVtJQ01QX0lORk9fUkVRVUVTVF0gPSBJQ01QX0lORk9fUkVQTFkgKyAxLAotCVtJQ01QX0lORk9fUkVQTFldID0gSUNNUF9JTkZPX1JFUVVFU1QgKyAxLAotCVtJQ01QX0FERFJFU1NdID0gSUNNUF9BRERSRVNTUkVQTFkgKyAxLAotCVtJQ01QX0FERFJFU1NSRVBMWV0gPSBJQ01QX0FERFJFU1MgKyAxCi19OwotCi1zdGF0aWMgaW50IGljbXBfaW52ZXJ0X3R1cGxlKHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnR1cGxlLAotCQkJICAgICBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICpvcmlnKQotewotCWlmIChvcmlnLT5kc3QudS5pY21wLnR5cGUgPj0gc2l6ZW9mKGludm1hcCkKLQkgICAgfHwgIWludm1hcFtvcmlnLT5kc3QudS5pY21wLnR5cGVdKQotCQlyZXR1cm4gMDsKLQotCXR1cGxlLT5zcmMudS5pY21wLmlkID0gb3JpZy0+c3JjLnUuaWNtcC5pZDsKLQl0dXBsZS0+ZHN0LnUuaWNtcC50eXBlID0gaW52bWFwW29yaWctPmRzdC51LmljbXAudHlwZV0gLSAxOwotCXR1cGxlLT5kc3QudS5pY21wLmNvZGUgPSBvcmlnLT5kc3QudS5pY21wLmNvZGU7Ci0JcmV0dXJuIDE7Ci19Ci0KLS8qIFByaW50IG91dCB0aGUgcGVyLXByb3RvY29sIHBhcnQgb2YgdGhlIHR1cGxlLiAqLwotc3RhdGljIGludCBpY21wX3ByaW50X3R1cGxlKHN0cnVjdCBzZXFfZmlsZSAqcywKLQkJCSAgICBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0dXBsZSkKLXsKLQlyZXR1cm4gc2VxX3ByaW50ZihzLCAidHlwZT0ldSBjb2RlPSV1IGlkPSV1ICIsCi0JCQkgIHR1cGxlLT5kc3QudS5pY21wLnR5cGUsCi0JCQkgIHR1cGxlLT5kc3QudS5pY21wLmNvZGUsCi0JCQkgIG50b2hzKHR1cGxlLT5zcmMudS5pY21wLmlkKSk7Ci19Ci0KLS8qIFByaW50IG91dCB0aGUgcHJpdmF0ZSBwYXJ0IG9mIHRoZSBjb25udHJhY2suICovCi1zdGF0aWMgaW50IGljbXBfcHJpbnRfY29ubnRyYWNrKHN0cnVjdCBzZXFfZmlsZSAqcywKLQkJCQljb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjb25udHJhY2spCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIFJldHVybnMgdmVyZGljdCBmb3IgcGFja2V0LCBvciAtMSBmb3IgaW52YWxpZC4gKi8KLXN0YXRpYyBpbnQgaWNtcF9wYWNrZXQoc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsCi0JCSAgICAgICBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkgICAgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8pCi17Ci0JLyogVHJ5IHRvIGRlbGV0ZSBjb25uZWN0aW9uIGltbWVkaWF0ZWx5IGFmdGVyIGFsbCByZXBsaWVzOgotCSAgIHdvbid0IGFjdHVhbGx5IHZhbmlzaCBhcyB3ZSBzdGlsbCBoYXZlIHNrYiwgYW5kIGRlbF90aW1lcgotCSAgIG1lYW5zIHRoaXMgd2lsbCBvbmx5IHJ1biBvbmNlIGV2ZW4gaWYgY291bnQgaGl0cyB6ZXJvIHR3aWNlCi0JICAgKHRoZW9yZXRpY2FsbHkgcG9zc2libGUgd2l0aCBTTVApICovCi0JaWYgKENUSU5GTzJESVIoY3RpbmZvKSA9PSBJUF9DVF9ESVJfUkVQTFkpIHsKLQkJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmN0LT5wcm90by5pY21wLmNvdW50KQotCQkgICAgJiYgZGVsX3RpbWVyKCZjdC0+dGltZW91dCkpCi0JCQljdC0+dGltZW91dC5mdW5jdGlvbigodW5zaWduZWQgbG9uZyljdCk7Ci0JfSBlbHNlIHsKLQkJYXRvbWljX2luYygmY3QtPnByb3RvLmljbXAuY291bnQpOwotCQlpcF9jb25udHJhY2tfZXZlbnRfY2FjaGUoSVBDVF9QUk9UT0lORk9fVk9MQVRJTEUsIHNrYik7Ci0JCWlwX2N0X3JlZnJlc2hfYWNjdChjdCwgY3RpbmZvLCBza2IsIGlwX2N0X2ljbXBfdGltZW91dCk7Ci0JfQotCi0JcmV0dXJuIE5GX0FDQ0VQVDsKLX0KLQotLyogQ2FsbGVkIHdoZW4gYSBuZXcgY29ubmVjdGlvbiBmb3IgdGhpcyBwcm90b2NvbCBmb3VuZC4gKi8KLXN0YXRpYyBpbnQgaWNtcF9uZXcoc3RydWN0IGlwX2Nvbm50cmFjayAqY29ubnRyYWNrLAotCQkgICAgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlzdGF0aWMgY29uc3QgdV9pbnQ4X3QgdmFsaWRfbmV3W10gPSB7Ci0JCVtJQ01QX0VDSE9dID0gMSwKLQkJW0lDTVBfVElNRVNUQU1QXSA9IDEsCi0JCVtJQ01QX0lORk9fUkVRVUVTVF0gPSAxLAotCQlbSUNNUF9BRERSRVNTXSA9IDEKLQl9OwotCi0JaWYgKGNvbm50cmFjay0+dHVwbGVoYXNoWzBdLnR1cGxlLmRzdC51LmljbXAudHlwZSA+PSBzaXplb2YodmFsaWRfbmV3KQotCSAgICB8fCAhdmFsaWRfbmV3W2Nvbm50cmFjay0+dHVwbGVoYXNoWzBdLnR1cGxlLmRzdC51LmljbXAudHlwZV0pIHsKLQkJLyogQ2FuJ3QgY3JlYXRlIGEgbmV3IElDTVAgYGNvbm4nIHdpdGggdGhpcy4gKi8KLQkJREVCVUdQKCJpY21wOiBjYW4ndCBjcmVhdGUgbmV3IGNvbm4gd2l0aCB0eXBlICV1XG4iLAotCQkgICAgICAgY29ubnRyYWNrLT50dXBsZWhhc2hbMF0udHVwbGUuZHN0LnUuaWNtcC50eXBlKTsKLQkJRFVNUF9UVVBMRSgmY29ubnRyYWNrLT50dXBsZWhhc2hbMF0udHVwbGUpOwotCQlyZXR1cm4gMDsKLQl9Ci0JYXRvbWljX3NldCgmY29ubnRyYWNrLT5wcm90by5pY21wLmNvdW50LCAwKTsKLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGludAotaWNtcF9lcnJvcl9tZXNzYWdlKHN0cnVjdCBza19idWZmICpza2IsCi0JCSAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gKmN0aW5mbywKLQkJICAgdW5zaWduZWQgaW50IGhvb2tudW0pCi17Ci0Jc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSBpbm5lcnR1cGxlLCBvcmlndHVwbGU7Ci0Jc3RydWN0IHsKLQkJc3RydWN0IGljbXBoZHIgaWNtcDsKLQkJc3RydWN0IGlwaGRyIGlwOwotCX0gX2luLCAqaW5zaWRlOwotCXN0cnVjdCBpcF9jb25udHJhY2tfcHJvdG9jb2wgKmlubmVycHJvdG87Ci0Jc3RydWN0IGlwX2Nvbm50cmFja190dXBsZV9oYXNoICpoOwotCWludCBkYXRhb2ZmOwotCi0JSVBfTkZfQVNTRVJUKHNrYi0+bmZjdCA9PSBOVUxMKTsKLQotCS8qIE5vdCBlbm91Z2ggaGVhZGVyPyAqLwotCWluc2lkZSA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHNrYi0+bmguaXBoLT5paGwqNCwgc2l6ZW9mKF9pbiksICZfaW4pOwotCWlmIChpbnNpZGUgPT0gTlVMTCkKLQkJcmV0dXJuIC1ORl9BQ0NFUFQ7Ci0KLQkvKiBJZ25vcmUgSUNNUCdzIGNvbnRhaW5pbmcgZnJhZ21lbnRzIChzaG91bGRuJ3QgaGFwcGVuKSAqLwotCWlmIChpbnNpZGUtPmlwLmZyYWdfb2ZmICYgaHRvbnMoSVBfT0ZGU0VUKSkgewotCQlERUJVR1AoImljbXBfZXJyb3JfdHJhY2s6IGZyYWdtZW50IG9mIHByb3RvICV1XG4iLAotCQkgICAgICAgaW5zaWRlLT5pcC5wcm90b2NvbCk7Ci0JCXJldHVybiAtTkZfQUNDRVBUOwotCX0KLQotCWlubmVycHJvdG8gPSBpcF9jb25udHJhY2tfcHJvdG9fZmluZF9nZXQoaW5zaWRlLT5pcC5wcm90b2NvbCk7Ci0JZGF0YW9mZiA9IHNrYi0+bmguaXBoLT5paGwqNCArIHNpemVvZihpbnNpZGUtPmljbXApICsgaW5zaWRlLT5pcC5paGwqNDsKLQkvKiBBcmUgdGhleSB0YWxraW5nIGFib3V0IG9uZSBvZiBvdXIgY29ubmVjdGlvbnM/ICovCi0JaWYgKCFpcF9jdF9nZXRfdHVwbGUoJmluc2lkZS0+aXAsIHNrYiwgZGF0YW9mZiwgJm9yaWd0dXBsZSwgaW5uZXJwcm90bykpIHsKLQkJREVCVUdQKCJpY21wX2Vycm9yOiAhIGdldF90dXBsZSBwPSV1IiwgaW5zaWRlLT5pcC5wcm90b2NvbCk7Ci0JCWlwX2Nvbm50cmFja19wcm90b19wdXQoaW5uZXJwcm90byk7Ci0JCXJldHVybiAtTkZfQUNDRVBUOwotCX0KLQotCS8qIE9yZGluYXJpbHksIHdlJ2QgZXhwZWN0IHRoZSBpbnZlcnRlZCB0dXBsZXByb3RvLCBidXQgaXQncwotCSAgIGJlZW4gcHJlc2VydmVkIGluc2lkZSB0aGUgSUNNUC4gKi8KLQlpZiAoIWlwX2N0X2ludmVydF90dXBsZSgmaW5uZXJ0dXBsZSwgJm9yaWd0dXBsZSwgaW5uZXJwcm90bykpIHsKLQkJREVCVUdQKCJpY21wX2Vycm9yX3RyYWNrOiBDYW4ndCBpbnZlcnQgdHVwbGVcbiIpOwotCQlpcF9jb25udHJhY2tfcHJvdG9fcHV0KGlubmVycHJvdG8pOwotCQlyZXR1cm4gLU5GX0FDQ0VQVDsKLQl9Ci0JaXBfY29ubnRyYWNrX3Byb3RvX3B1dChpbm5lcnByb3RvKTsKLQotCSpjdGluZm8gPSBJUF9DVF9SRUxBVEVEOwotCi0JaCA9IGlwX2Nvbm50cmFja19maW5kX2dldCgmaW5uZXJ0dXBsZSwgTlVMTCk7Ci0JaWYgKCFoKSB7Ci0JCS8qIExvY2FsbHkgZ2VuZXJhdGVkIElDTVBzIHdpbGwgbWF0Y2ggaW52ZXJ0ZWQgaWYgdGhleQotCQkgICBoYXZlbid0IGJlZW4gU05BVCdlZCB5ZXQgKi8KLQkJLyogRklYTUU6IE5BVCBjb2RlIGhhcyB0byBoYW5kbGUgaGFsZi1kb25lIGRvdWJsZSBOQVQgLS1SUiAqLwotCQlpZiAoaG9va251bSA9PSBORl9JUF9MT0NBTF9PVVQpCi0JCQloID0gaXBfY29ubnRyYWNrX2ZpbmRfZ2V0KCZvcmlndHVwbGUsIE5VTEwpOwotCi0JCWlmICghaCkgewotCQkJREVCVUdQKCJpY21wX2Vycm9yX3RyYWNrOiBubyBtYXRjaFxuIik7Ci0JCQlyZXR1cm4gLU5GX0FDQ0VQVDsKLQkJfQotCQkvKiBSZXZlcnNlIGRpcmVjdGlvbiBmcm9tIHRoYXQgZm91bmQgKi8KLQkJaWYgKERJUkVDVElPTihoKSAhPSBJUF9DVF9ESVJfUkVQTFkpCi0JCQkqY3RpbmZvICs9IElQX0NUX0lTX1JFUExZOwotCX0gZWxzZSB7Ci0JCWlmIChESVJFQ1RJT04oaCkgPT0gSVBfQ1RfRElSX1JFUExZKQotCQkJKmN0aW5mbyArPSBJUF9DVF9JU19SRVBMWTsKLQl9Ci0KLQkvKiBVcGRhdGUgc2tiIHRvIHJlZmVyIHRvIHRoaXMgY29ubmVjdGlvbiAqLwotCXNrYi0+bmZjdCA9ICZ0dXBsZWhhc2hfdG9fY3RyYWNrKGgpLT5jdF9nZW5lcmFsOwotCXNrYi0+bmZjdGluZm8gPSAqY3RpbmZvOwotCXJldHVybiAtTkZfQUNDRVBUOwotfQotCi0vKiBTbWFsbCBhbmQgbW9kaWZpZWQgdmVyc2lvbiBvZiBpY21wX3JjdiAqLwotc3RhdGljIGludAotaWNtcF9lcnJvcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBlbnVtIGlwX2Nvbm50cmFja19pbmZvICpjdGluZm8sCi0JICAgdW5zaWduZWQgaW50IGhvb2tudW0pCi17Ci0Jc3RydWN0IGljbXBoZHIgX2loLCAqaWNtcGg7Ci0KLQkvKiBOb3QgZW5vdWdoIGhlYWRlcj8gKi8KLQlpY21waCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHNrYi0+bmguaXBoLT5paGwqNCwgc2l6ZW9mKF9paCksICZfaWgpOwotCWlmIChpY21waCA9PSBOVUxMKSB7Ci0JCWlmIChMT0dfSU5WQUxJRChJUFBST1RPX0lDTVApKQotCQkJbmZfbG9nX3BhY2tldChQRl9JTkVULCAwLCBza2IsIE5VTEwsIE5VTEwsIE5VTEwsCi0JCQkJICAgICAgImlwX2N0X2ljbXA6IHNob3J0IHBhY2tldCAiKTsKLQkJcmV0dXJuIC1ORl9BQ0NFUFQ7Ci0JfQotCi0JLyogU2VlIGlwX2Nvbm50cmFja19wcm90b190Y3AuYyAqLwotCWlmIChpcF9jb25udHJhY2tfY2hlY2tzdW0gJiYgaG9va251bSA9PSBORl9JUF9QUkVfUk9VVElORyAmJgotCSAgICBuZl9pcF9jaGVja3N1bShza2IsIGhvb2tudW0sIHNrYi0+bmguaXBoLT5paGwgKiA0LCAwKSkgewotCQlpZiAoTE9HX0lOVkFMSUQoSVBQUk9UT19JQ01QKSkKLQkJCW5mX2xvZ19wYWNrZXQoUEZfSU5FVCwgMCwgc2tiLCBOVUxMLCBOVUxMLCBOVUxMLAotCQkJCSAgICAgICJpcF9jdF9pY21wOiBiYWQgSUNNUCBjaGVja3N1bSAiKTsKLQkJcmV0dXJuIC1ORl9BQ0NFUFQ7Ci0JfQotCi0JLyoKLQkgKgkxOCBpcyB0aGUgaGlnaGVzdCAna25vd24nIElDTVAgdHlwZS4gQW55dGhpbmcgZWxzZSBpcyBhIG15c3RlcnkKLQkgKgotCSAqCVJGQyAxMTIyOiAzLjIuMiAgVW5rbm93biBJQ01QIG1lc3NhZ2VzIHR5cGVzIE1VU1QgYmUgc2lsZW50bHkKLQkgKgkJICBkaXNjYXJkZWQuCi0JICovCi0JaWYgKGljbXBoLT50eXBlID4gTlJfSUNNUF9UWVBFUykgewotCQlpZiAoTE9HX0lOVkFMSUQoSVBQUk9UT19JQ01QKSkKLQkJCW5mX2xvZ19wYWNrZXQoUEZfSU5FVCwgMCwgc2tiLCBOVUxMLCBOVUxMLCBOVUxMLAotCQkJCSAgICAgICJpcF9jdF9pY21wOiBpbnZhbGlkIElDTVAgdHlwZSAiKTsKLQkJcmV0dXJuIC1ORl9BQ0NFUFQ7Ci0JfQotCi0JLyogTmVlZCB0byB0cmFjayBpY21wIGVycm9yIG1lc3NhZ2U/ICovCi0JaWYgKGljbXBoLT50eXBlICE9IElDTVBfREVTVF9VTlJFQUNICi0JICAgICYmIGljbXBoLT50eXBlICE9IElDTVBfU09VUkNFX1FVRU5DSAotCSAgICAmJiBpY21waC0+dHlwZSAhPSBJQ01QX1RJTUVfRVhDRUVERUQKLQkgICAgJiYgaWNtcGgtPnR5cGUgIT0gSUNNUF9QQVJBTUVURVJQUk9CCi0JICAgICYmIGljbXBoLT50eXBlICE9IElDTVBfUkVESVJFQ1QpCi0JCXJldHVybiBORl9BQ0NFUFQ7Ci0KLQlyZXR1cm4gaWNtcF9lcnJvcl9tZXNzYWdlKHNrYiwgY3RpbmZvLCBob29rbnVtKTsKLX0KLQotI2lmIGRlZmluZWQoQ09ORklHX0lQX05GX0NPTk5UUkFDS19ORVRMSU5LKSB8fCBcCi0gICAgZGVmaW5lZChDT05GSUdfSVBfTkZfQ09OTlRSQUNLX05FVExJTktfTU9EVUxFKQotc3RhdGljIGludCBpY21wX3R1cGxlX3RvX25mYXR0cihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCWNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnQpCi17Ci0JTkZBX1BVVChza2IsIENUQV9QUk9UT19JQ01QX0lELCBzaXplb2YoX19iZTE2KSwKLQkJJnQtPnNyYy51LmljbXAuaWQpOwotCU5GQV9QVVQoc2tiLCBDVEFfUFJPVE9fSUNNUF9UWVBFLCBzaXplb2YodV9pbnQ4X3QpLAotCQkmdC0+ZHN0LnUuaWNtcC50eXBlKTsKLQlORkFfUFVUKHNrYiwgQ1RBX1BST1RPX0lDTVBfQ09ERSwgc2l6ZW9mKHVfaW50OF90KSwKLQkJJnQtPmRzdC51LmljbXAuY29kZSk7Ci0KLQlyZXR1cm4gMDsKLQotbmZhdHRyX2ZhaWx1cmU6Ci0JcmV0dXJuIC0xOwotfQotCi1zdGF0aWMgaW50IGljbXBfbmZhdHRyX3RvX3R1cGxlKHN0cnVjdCBuZmF0dHIgKnRiW10sCi0JCQkJc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUpCi17Ci0JaWYgKCF0YltDVEFfUFJPVE9fSUNNUF9UWVBFLTFdCi0JICAgIHx8ICF0YltDVEFfUFJPVE9fSUNNUF9DT0RFLTFdCi0JICAgIHx8ICF0YltDVEFfUFJPVE9fSUNNUF9JRC0xXSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQl0dXBsZS0+ZHN0LnUuaWNtcC50eXBlID0KLQkJCSoodV9pbnQ4X3QgKilORkFfREFUQSh0YltDVEFfUFJPVE9fSUNNUF9UWVBFLTFdKTsKLQl0dXBsZS0+ZHN0LnUuaWNtcC5jb2RlID0KLQkJCSoodV9pbnQ4X3QgKilORkFfREFUQSh0YltDVEFfUFJPVE9fSUNNUF9DT0RFLTFdKTsKLQl0dXBsZS0+c3JjLnUuaWNtcC5pZCA9Ci0JCQkqKF9fYmUxNiAqKU5GQV9EQVRBKHRiW0NUQV9QUk9UT19JQ01QX0lELTFdKTsKLQotCWlmICh0dXBsZS0+ZHN0LnUuaWNtcC50eXBlID49IHNpemVvZihpbnZtYXApCi0JICAgIHx8ICFpbnZtYXBbdHVwbGUtPmRzdC51LmljbXAudHlwZV0pCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQotc3RydWN0IGlwX2Nvbm50cmFja19wcm90b2NvbCBpcF9jb25udHJhY2tfcHJvdG9jb2xfaWNtcCA9Ci17Ci0JLnByb3RvIAkJCT0gSVBQUk9UT19JQ01QLAotCS5uYW1lIAkJCT0gImljbXAiLAotCS5wa3RfdG9fdHVwbGUJCT0gaWNtcF9wa3RfdG9fdHVwbGUsCi0JLmludmVydF90dXBsZQkJPSBpY21wX2ludmVydF90dXBsZSwKLQkucHJpbnRfdHVwbGUJCT0gaWNtcF9wcmludF90dXBsZSwKLQkucHJpbnRfY29ubnRyYWNrCT0gaWNtcF9wcmludF9jb25udHJhY2ssCi0JLnBhY2tldAkJCT0gaWNtcF9wYWNrZXQsCi0JLm5ldwkJCT0gaWNtcF9uZXcsCi0JLmVycm9yCQkJPSBpY21wX2Vycm9yLAotI2lmIGRlZmluZWQoQ09ORklHX0lQX05GX0NPTk5UUkFDS19ORVRMSU5LKSB8fCBcCi0gICAgZGVmaW5lZChDT05GSUdfSVBfTkZfQ09OTlRSQUNLX05FVExJTktfTU9EVUxFKQotCS50dXBsZV90b19uZmF0dHIJPSBpY21wX3R1cGxlX3RvX25mYXR0ciwKLQkubmZhdHRyX3RvX3R1cGxlCT0gaWNtcF9uZmF0dHJfdG9fdHVwbGUsCi0jZW5kaWYKLX07CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX3Byb3RvX3NjdHAuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfcHJvdG9fc2N0cC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjk0Mjk5Li4wMDAwMDAwCi0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfcHJvdG9fc2N0cC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjU5ICswLDAgQEAKLS8qCi0gKiBDb25uZWN0aW9uIHRyYWNraW5nIHByb3RvY29sIGhlbHBlciBtb2R1bGUgZm9yIFNDVFAuCi0gKgotICogU0NUUCBpcyBkZWZpbmVkIGluIFJGQyAyOTYwLiBSZWZlcmVuY2VzIHRvIHZhcmlvdXMgc2VjdGlvbnMgaW4gdGhpcyBjb2RlCi0gKiBhcmUgdG8gdGhpcyBSRkMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotCi0vKgotICogQWRkZWQgc3VwcG9ydCBmb3IgcHJvYyBtYW5pcHVsYXRpb24gb2YgdGltZW91dHMuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvdGltZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbi5oPgotI2luY2x1ZGUgPGxpbnV4L2lwLmg+Ci0jaW5jbHVkZSA8bGludXgvc2N0cC5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2suaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfcHJvdG9jb2wuaD4KLQotI2lmIDAKLSNkZWZpbmUgREVCVUdQKGZvcm1hdCwgLi4uKSBwcmludGsoZm9ybWF0LCAjIyBfX1ZBX0FSR1NfXykKLSNlbHNlCi0jZGVmaW5lIERFQlVHUChmb3JtYXQsIGFyZ3MuLi4pCi0jZW5kaWYKLQotLyogUHJvdGVjdHMgY29ubnRyYWNrLT5wcm90by5zY3RwICovCi1zdGF0aWMgREVGSU5FX1JXTE9DSyhzY3RwX2xvY2spOwotCi0vKiBGSVhNRTogRXhhbWluZSBpcGZpbHRlcidzIHRpbWVvdXRzIGFuZCBjb25udHJhY2sgdHJhbnNpdGlvbnMgbW9yZQotICAgY2xvc2VseS4gIFRoZXkncmUgbW9yZSBjb21wbGV4LiAtLVJSCi0KLSAgIEFuZCBzbyBmb3IgbWUgZm9yIFNDVFAgOkQgLUtpcmFuICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICpzY3RwX2Nvbm50cmFja19uYW1lc1tdID0gewotCSJOT05FIiwKLQkiQ0xPU0VEIiwKLQkiQ09PS0lFX1dBSVQiLAotCSJDT09LSUVfRUNIT0VEIiwKLQkiRVNUQUJMSVNIRUQiLAotCSJTSFVURE9XTl9TRU5UIiwKLQkiU0hVVERPV05fUkVDRCIsCi0JIlNIVVRET1dOX0FDS19TRU5UIiwKLX07Ci0KLSNkZWZpbmUgU0VDUyAgKiBIWgotI2RlZmluZSBNSU5TICAqIDYwIFNFQ1MKLSNkZWZpbmUgSE9VUlMgKiA2MCBNSU5TCi0jZGVmaW5lIERBWVMgICogMjQgSE9VUlMKLQotc3RhdGljIHVuc2lnbmVkIGludCBpcF9jdF9zY3RwX3RpbWVvdXRfY2xvc2VkIF9fcmVhZF9tb3N0bHkgICAgICAgICAgID0gMTAgU0VDUzsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgaXBfY3Rfc2N0cF90aW1lb3V0X2Nvb2tpZV93YWl0IF9fcmVhZF9tb3N0bHkgICAgICA9ICAzIFNFQ1M7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGlwX2N0X3NjdHBfdGltZW91dF9jb29raWVfZWNob2VkIF9fcmVhZF9tb3N0bHkgICAgPSAgMyBTRUNTOwotc3RhdGljIHVuc2lnbmVkIGludCBpcF9jdF9zY3RwX3RpbWVvdXRfZXN0YWJsaXNoZWQgX19yZWFkX21vc3RseSAgICAgID0gIDUgREFZUzsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgaXBfY3Rfc2N0cF90aW1lb3V0X3NodXRkb3duX3NlbnQgX19yZWFkX21vc3RseSAgICA9IDMwMCBTRUNTIC8gMTAwMDsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgaXBfY3Rfc2N0cF90aW1lb3V0X3NodXRkb3duX3JlY2QgX19yZWFkX21vc3RseSAgICA9IDMwMCBTRUNTIC8gMTAwMDsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgaXBfY3Rfc2N0cF90aW1lb3V0X3NodXRkb3duX2Fja19zZW50IF9fcmVhZF9tb3N0bHkgPSAzIFNFQ1M7Ci0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgKiBzY3RwX3RpbWVvdXRzW10KLT0geyBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTQ1RQX0NPTk5UUkFDS19OT05FICAqLwotICAgICZpcF9jdF9zY3RwX3RpbWVvdXRfY2xvc2VkLAkgICAgICAgICAgIC8qIFNDVFBfQ09OTlRSQUNLX0NMT1NFRCAqLwotICAgICZpcF9jdF9zY3RwX3RpbWVvdXRfY29va2llX3dhaXQsICAgICAgIC8qIFNDVFBfQ09OTlRSQUNLX0NPT0tJRV9XQUlUICovCi0gICAgJmlwX2N0X3NjdHBfdGltZW91dF9jb29raWVfZWNob2VkLCAgICAgLyogU0NUUF9DT05OVFJBQ0tfQ09PS0lFX0VDSE9FRCAqLwotICAgICZpcF9jdF9zY3RwX3RpbWVvdXRfZXN0YWJsaXNoZWQsICAgICAgIC8qIFNDVFBfQ09OTlRSQUNLX0VTVEFCTElTSEVEICovCi0gICAgJmlwX2N0X3NjdHBfdGltZW91dF9zaHV0ZG93bl9zZW50LCAgICAgLyogU0NUUF9DT05OVFJBQ0tfU0hVVERPV05fU0VOVCAqLwotICAgICZpcF9jdF9zY3RwX3RpbWVvdXRfc2h1dGRvd25fcmVjZCwgICAgIC8qIFNDVFBfQ09OTlRSQUNLX1NIVVRET1dOX1JFQ0QgKi8KLSAgICAmaXBfY3Rfc2N0cF90aW1lb3V0X3NodXRkb3duX2Fja19zZW50ICAvKiBTQ1RQX0NPTk5UUkFDS19TSFVURE9XTl9BQ0tfU0VOVCAqLwotIH07Ci0KLSNkZWZpbmUgc05PIFNDVFBfQ09OTlRSQUNLX05PTkUKLSNkZWZpbmUJc0NMIFNDVFBfQ09OTlRSQUNLX0NMT1NFRAotI2RlZmluZQlzQ1cgU0NUUF9DT05OVFJBQ0tfQ09PS0lFX1dBSVQKLSNkZWZpbmUJc0NFIFNDVFBfQ09OTlRSQUNLX0NPT0tJRV9FQ0hPRUQKLSNkZWZpbmUJc0VTIFNDVFBfQ09OTlRSQUNLX0VTVEFCTElTSEVECi0jZGVmaW5lCXNTUyBTQ1RQX0NPTk5UUkFDS19TSFVURE9XTl9TRU5UCi0jZGVmaW5lCXNTUiBTQ1RQX0NPTk5UUkFDS19TSFVURE9XTl9SRUNECi0jZGVmaW5lCXNTQSBTQ1RQX0NPTk5UUkFDS19TSFVURE9XTl9BQ0tfU0VOVAotI2RlZmluZQlzSVYgU0NUUF9DT05OVFJBQ0tfTUFYCi0KLS8qCi0JVGhlc2UgYXJlIHRoZSBkZXNjcmlwdGlvbnMgb2YgdGhlIHN0YXRlczoKLQotTk9URTogVGhlc2Ugc3RhdGUgbmFtZXMgYXJlIHRhbnRhbGl6aW5nbHkgc2ltaWxhciB0byB0aGUgc3RhdGVzIG9mIGFuCi1TQ1RQIGVuZHBvaW50LiBCdXQgdGhlIGludGVycHJldGF0aW9uIG9mIHRoZSBzdGF0ZXMgaXMgYSBsaXR0bGUgZGlmZmVyZW50LAotY29uc2lkZXJpbmcgdGhhdCB0aGVzZSBhcmUgdGhlIHN0YXRlcyBvZiB0aGUgY29ubmVjdGlvbiBhbmQgbm90IG9mIGFuIGVuZAotcG9pbnQuIFBsZWFzZSBub3RlIHRoZSBzdWJ0bGV0aWVzLiAtS2lyYW4KLQotTk9ORSAgICAgICAgICAgICAgLSBOb3RoaW5nIHNvIGZhci4KLUNPT0tJRSBXQUlUICAgICAgIC0gV2UgaGF2ZSBzZWVuIGFuIElOSVQgY2h1bmsgaW4gdGhlIG9yaWdpbmFsIGRpcmVjdGlvbiwgb3IgYWxzbwotCQkgICAgYW4gSU5JVF9BQ0sgY2h1bmsgaW4gdGhlIHJlcGx5IGRpcmVjdGlvbi4KLUNPT0tJRSBFQ0hPRUQgICAgIC0gV2UgaGF2ZSBzZWVuIGEgQ09PS0lFX0VDSE8gY2h1bmsgaW4gdGhlIG9yaWdpbmFsIGRpcmVjdGlvbi4KLUVTVEFCTElTSEVEICAgICAgIC0gV2UgaGF2ZSBzZWVuIGEgQ09PS0lFX0FDSyBpbiB0aGUgcmVwbHkgZGlyZWN0aW9uLgotU0hVVERPV05fU0VOVCAgICAgLSBXZSBoYXZlIHNlZW4gYSBTSFVURE9XTiBjaHVuayBpbiB0aGUgb3JpZ2luYWwgZGlyZWN0aW9uLgotU0hVVERPV05fUkVDRCAgICAgLSBXZSBoYXZlIHNlZW4gYSBTSFVURE9XTiBjaHVuayBpbiB0aGUgcmVwbHkgZGlyZWN0b2luLgotU0hVVERPV05fQUNLX1NFTlQgLSBXZSBoYXZlIHNlZW4gYSBTSFVURE9XTl9BQ0sgY2h1bmsgaW4gdGhlIGRpcmVjdGlvbiBvcHBvc2l0ZQotCQkgICAgdG8gdGhhdCBvZiB0aGUgU0hVVERPV04gY2h1bmsuCi1DTE9TRUQgICAgICAgICAgICAtIFdlIGhhdmUgc2VlbiBhIFNIVVRET1dOX0NPTVBMRVRFIGNodW5rIGluIHRoZSBkaXJlY3Rpb24gb2YKLQkJICAgIHRoZSBTSFVURE9XTiBjaHVuay4gQ29ubmVjdGlvbiBpcyBjbG9zZWQuCi0qLwotCi0vKiBUT0RPCi0gLSBJIGhhdmUgYXNzdW1lZCB0aGF0IHRoZSBmaXJzdCBJTklUIGlzIGluIHRoZSBvcmlnaW5hbCBkaXJlY3Rpb24uCi0gVGhpcyBtZXNzZXMgdGhpbmdzIHdoZW4gYW4gSU5JVCBjb21lcyBpbiB0aGUgcmVwbHkgZGlyZWN0aW9uIGluIENMT1NFRAotIHN0YXRlLgotIC0gQ2hlY2sgdGhlIGVycm9yIHR5cGUgaW4gdGhlIHJlcGx5IGRpciBiZWZvcmUgdHJhbnNpdGlvbmluZyBmcm9tCi1jb29raWUgZWNob2VkIHRvIGNsb3NlZC4KLSAtIFNlYyA1LjIuNCBvZiBSRkMgMjk2MAotIC0gTXVsdGkgSG9taW5nIHN1cHBvcnQuCi0qLwotCi0vKiBTQ1RQIGNvbm50cmFjayBzdGF0ZSB0cmFuc2l0aW9ucyAqLwotc3RhdGljIGNvbnN0IGVudW0gc2N0cF9jb25udHJhY2sgc2N0cF9jb25udHJhY2tzWzJdWzldW1NDVFBfQ09OTlRSQUNLX01BWF0gPSB7Ci0JewotLyoJT1JJR0lOQUwJKi8KLS8qICAgICAgICAgICAgICAgICAgc05PLCBzQ0wsIHNDVywgc0NFLCBzRVMsIHNTUywgc1NSLCBzU0EgKi8KLS8qIGluaXQgICAgICAgICAqLyB7c0NXLCBzQ1csIHNDVywgc0NFLCBzRVMsIHNTUywgc1NSLCBzU0F9LAotLyogaW5pdF9hY2sgICAgICovIHtzQ0wsIHNDTCwgc0NXLCBzQ0UsIHNFUywgc1NTLCBzU1IsIHNTQX0sCi0vKiBhYm9ydCAgICAgICAgKi8ge3NDTCwgc0NMLCBzQ0wsIHNDTCwgc0NMLCBzQ0wsIHNDTCwgc0NMfSwKLS8qIHNodXRkb3duICAgICAqLyB7c0NMLCBzQ0wsIHNDVywgc0NFLCBzU1MsIHNTUywgc1NSLCBzU0F9LAotLyogc2h1dGRvd25fYWNrICovIHtzU0EsIHNDTCwgc0NXLCBzQ0UsIHNFUywgc1NBLCBzU0EsIHNTQX0sCi0vKiBlcnJvciAgICAgICAgKi8ge3NDTCwgc0NMLCBzQ1csIHNDRSwgc0VTLCBzU1MsIHNTUiwgc1NBfSwvKiBDYW50IGhhdmUgU3RhbGUgY29va2llKi8KLS8qIGNvb2tpZV9lY2hvICAqLyB7c0NMLCBzQ0wsIHNDRSwgc0NFLCBzRVMsIHNTUywgc1NSLCBzU0F9LC8qIDUuMi40IC0gQmlnIFRPRE8gKi8KLS8qIGNvb2tpZV9hY2sgICAqLyB7c0NMLCBzQ0wsIHNDVywgc0NFLCBzRVMsIHNTUywgc1NSLCBzU0F9LC8qIENhbnQgY29tZSBpbiBvcmlnIGRpciAqLwotLyogc2h1dGRvd25fY29tcCovIHtzQ0wsIHNDTCwgc0NXLCBzQ0UsIHNFUywgc1NTLCBzU1IsIHNDTH0KLQl9LAotCXsKLS8qCVJFUExZCSovCi0vKiAgICAgICAgICAgICAgICAgIHNOTywgc0NMLCBzQ1csIHNDRSwgc0VTLCBzU1MsIHNTUiwgc1NBICovCi0vKiBpbml0ICAgICAgICAgKi8ge3NJViwgc0NMLCBzQ1csIHNDRSwgc0VTLCBzU1MsIHNTUiwgc1NBfSwvKiBJTklUIGluIHNDTCBCaWcgVE9ETyAqLwotLyogaW5pdF9hY2sgICAgICovIHtzSVYsIHNDTCwgc0NXLCBzQ0UsIHNFUywgc1NTLCBzU1IsIHNTQX0sCi0vKiBhYm9ydCAgICAgICAgKi8ge3NJViwgc0NMLCBzQ0wsIHNDTCwgc0NMLCBzQ0wsIHNDTCwgc0NMfSwKLS8qIHNodXRkb3duICAgICAqLyB7c0lWLCBzQ0wsIHNDVywgc0NFLCBzU1IsIHNTUywgc1NSLCBzU0F9LAotLyogc2h1dGRvd25fYWNrICovIHtzSVYsIHNDTCwgc0NXLCBzQ0UsIHNFUywgc1NBLCBzU0EsIHNTQX0sCi0vKiBlcnJvciAgICAgICAgKi8ge3NJViwgc0NMLCBzQ1csIHNDTCwgc0VTLCBzU1MsIHNTUiwgc1NBfSwKLS8qIGNvb2tpZV9lY2hvICAqLyB7c0lWLCBzQ0wsIHNDVywgc0NFLCBzRVMsIHNTUywgc1NSLCBzU0F9LC8qIENhbnQgY29tZSBpbiByZXBseSBkaXIgKi8KLS8qIGNvb2tpZV9hY2sgICAqLyB7c0lWLCBzQ0wsIHNDVywgc0VTLCBzRVMsIHNTUywgc1NSLCBzU0F9LAotLyogc2h1dGRvd25fY29tcCovIHtzSVYsIHNDTCwgc0NXLCBzQ0UsIHNFUywgc1NTLCBzU1IsIHNDTH0KLQl9Ci19OwotCi1zdGF0aWMgaW50IHNjdHBfcGt0X3RvX3R1cGxlKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0JCQkgICAgIHVuc2lnbmVkIGludCBkYXRhb2ZmLAotCQkJICAgICBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0dXBsZSkKLXsKLQlzY3RwX3NjdHBoZHJfdCBfaGRyLCAqaHA7Ci0KLQlERUJVR1AoX19GVU5DVElPTl9fKTsKLQlERUJVR1AoIlxuIik7Ci0KLQkvKiBBY3R1YWxseSBvbmx5IG5lZWQgZmlyc3QgOCBieXRlcy4gKi8KLQlocCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIGRhdGFvZmYsIDgsICZfaGRyKTsKLQlpZiAoaHAgPT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0KLQl0dXBsZS0+c3JjLnUuc2N0cC5wb3J0ID0gaHAtPnNvdXJjZTsKLQl0dXBsZS0+ZHN0LnUuc2N0cC5wb3J0ID0gaHAtPmRlc3Q7Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgc2N0cF9pbnZlcnRfdHVwbGUoc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUsCi0JCQkgICAgIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKm9yaWcpCi17Ci0JREVCVUdQKF9fRlVOQ1RJT05fXyk7Ci0JREVCVUdQKCJcbiIpOwotCi0JdHVwbGUtPnNyYy51LnNjdHAucG9ydCA9IG9yaWctPmRzdC51LnNjdHAucG9ydDsKLQl0dXBsZS0+ZHN0LnUuc2N0cC5wb3J0ID0gb3JpZy0+c3JjLnUuc2N0cC5wb3J0OwotCXJldHVybiAxOwotfQotCi0vKiBQcmludCBvdXQgdGhlIHBlci1wcm90b2NvbCBwYXJ0IG9mIHRoZSB0dXBsZS4gKi8KLXN0YXRpYyBpbnQgc2N0cF9wcmludF90dXBsZShzdHJ1Y3Qgc2VxX2ZpbGUgKnMsCi0JCQkgICAgY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUpCi17Ci0JREVCVUdQKF9fRlVOQ1RJT05fXyk7Ci0JREVCVUdQKCJcbiIpOwotCi0JcmV0dXJuIHNlcV9wcmludGYocywgInNwb3J0PSVodSBkcG9ydD0laHUgIiwKLQkJCSAgbnRvaHModHVwbGUtPnNyYy51LnNjdHAucG9ydCksCi0JCQkgIG50b2hzKHR1cGxlLT5kc3QudS5zY3RwLnBvcnQpKTsKLX0KLQotLyogUHJpbnQgb3V0IHRoZSBwcml2YXRlIHBhcnQgb2YgdGhlIGNvbm50cmFjay4gKi8KLXN0YXRpYyBpbnQgc2N0cF9wcmludF9jb25udHJhY2soc3RydWN0IHNlcV9maWxlICpzLAotCQkJCWNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2sgKmNvbm50cmFjaykKLXsKLQllbnVtIHNjdHBfY29ubnRyYWNrIHN0YXRlOwotCi0JREVCVUdQKF9fRlVOQ1RJT05fXyk7Ci0JREVCVUdQKCJcbiIpOwotCi0JcmVhZF9sb2NrX2JoKCZzY3RwX2xvY2spOwotCXN0YXRlID0gY29ubnRyYWNrLT5wcm90by5zY3RwLnN0YXRlOwotCXJlYWRfdW5sb2NrX2JoKCZzY3RwX2xvY2spOwotCi0JcmV0dXJuIHNlcV9wcmludGYocywgIiVzICIsIHNjdHBfY29ubnRyYWNrX25hbWVzW3N0YXRlXSk7Ci19Ci0KLSNkZWZpbmUgZm9yX2VhY2hfc2N0cF9jaHVuayhza2IsIHNjaCwgX3NjaCwgb2Zmc2V0LCBjb3VudCkJCVwKLWZvciAob2Zmc2V0ID0gc2tiLT5uaC5pcGgtPmlobCAqIDQgKyBzaXplb2Yoc2N0cF9zY3RwaGRyX3QpLCBjb3VudCA9IDA7CVwKLQlvZmZzZXQgPCBza2ItPmxlbiAmJgkJCQkJCVwKLQkoc2NoID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgb2Zmc2V0LCBzaXplb2YoX3NjaCksICZfc2NoKSk7CVwKLQlvZmZzZXQgKz0gKG50b2hzKHNjaC0+bGVuZ3RoKSArIDMpICYgfjMsIGNvdW50KyspCi0KLS8qIFNvbWUgdmFsaWRpdHkgY2hlY2tzIHRvIG1ha2Ugc3VyZSB0aGUgY2h1bmtzIGFyZSBmaW5lICovCi1zdGF0aWMgaW50IGRvX2Jhc2ljX2NoZWNrcyhzdHJ1Y3QgaXBfY29ubnRyYWNrICpjb25udHJhY2ssCi0JCQkgICBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJICAgY2hhciAqbWFwKQotewotCXVfaW50MzJfdCBvZmZzZXQsIGNvdW50OwotCXNjdHBfY2h1bmtoZHJfdCBfc2NoLCAqc2NoOwotCWludCBmbGFnOwotCi0JREVCVUdQKF9fRlVOQ1RJT05fXyk7Ci0JREVCVUdQKCJcbiIpOwotCi0JZmxhZyA9IDA7Ci0KLQlmb3JfZWFjaF9zY3RwX2NodW5rIChza2IsIHNjaCwgX3NjaCwgb2Zmc2V0LCBjb3VudCkgewotCQlERUJVR1AoIkNodW5rIE51bTogJWQgIFR5cGU6ICVkXG4iLCBjb3VudCwgc2NoLT50eXBlKTsKLQotCQlpZiAoc2NoLT50eXBlID09IFNDVFBfQ0lEX0lOSVQKLQkJCXx8IHNjaC0+dHlwZSA9PSBTQ1RQX0NJRF9JTklUX0FDSwotCQkJfHwgc2NoLT50eXBlID09IFNDVFBfQ0lEX1NIVVRET1dOX0NPTVBMRVRFKSB7Ci0JCQlmbGFnID0gMTsKLQkJfQotCi0JCS8qCi0JCSAqIENvb2tpZSBBY2svRWNobyBjaHVua3Mgbm90IHRoZSBmaXJzdCBPUgotCQkgKiBJbml0IC8gSW5pdCBBY2sgLyBTaHV0ZG93biBjb21wbCBjaHVua3Mgbm90IHRoZSBvbmx5IGNodW5rcwotCQkgKiBPUiB6ZXJvLWxlbmd0aC4KLQkJICovCi0JCWlmICgoKHNjaC0+dHlwZSA9PSBTQ1RQX0NJRF9DT09LSUVfQUNLCi0JCQl8fCBzY2gtPnR5cGUgPT0gU0NUUF9DSURfQ09PS0lFX0VDSE8KLQkJCXx8IGZsYWcpCi0JCSAgICAgICYmIGNvdW50ICE9MCkgfHwgIXNjaC0+bGVuZ3RoKSB7Ci0JCQlERUJVR1AoIkJhc2ljIGNoZWNrcyBmYWlsZWRcbiIpOwotCQkJcmV0dXJuIDE7Ci0JCX0KLQotCQlpZiAobWFwKSB7Ci0JCQlzZXRfYml0KHNjaC0+dHlwZSwgKHZvaWQgKiltYXApOwotCQl9Ci0JfQotCi0JREVCVUdQKCJCYXNpYyBjaGVja3MgcGFzc2VkXG4iKTsKLQlyZXR1cm4gY291bnQgPT0gMDsKLX0KLQotc3RhdGljIGludCBuZXdfc3RhdGUoZW51bSBpcF9jb25udHJhY2tfZGlyIGRpciwKLQkJICAgICBlbnVtIHNjdHBfY29ubnRyYWNrIGN1cl9zdGF0ZSwKLQkJICAgICBpbnQgY2h1bmtfdHlwZSkKLXsKLQlpbnQgaTsKLQotCURFQlVHUChfX0ZVTkNUSU9OX18pOwotCURFQlVHUCgiXG4iKTsKLQotCURFQlVHUCgiQ2h1bmsgdHlwZTogJWRcbiIsIGNodW5rX3R5cGUpOwotCi0Jc3dpdGNoIChjaHVua190eXBlKSB7Ci0JCWNhc2UgU0NUUF9DSURfSU5JVDoKLQkJCURFQlVHUCgiU0NUUF9DSURfSU5JVFxuIik7Ci0JCQlpID0gMDsgYnJlYWs7Ci0JCWNhc2UgU0NUUF9DSURfSU5JVF9BQ0s6Ci0JCQlERUJVR1AoIlNDVFBfQ0lEX0lOSVRfQUNLXG4iKTsKLQkJCWkgPSAxOyBicmVhazsKLQkJY2FzZSBTQ1RQX0NJRF9BQk9SVDoKLQkJCURFQlVHUCgiU0NUUF9DSURfQUJPUlRcbiIpOwotCQkJaSA9IDI7IGJyZWFrOwotCQljYXNlIFNDVFBfQ0lEX1NIVVRET1dOOgotCQkJREVCVUdQKCJTQ1RQX0NJRF9TSFVURE9XTlxuIik7Ci0JCQlpID0gMzsgYnJlYWs7Ci0JCWNhc2UgU0NUUF9DSURfU0hVVERPV05fQUNLOgotCQkJREVCVUdQKCJTQ1RQX0NJRF9TSFVURE9XTl9BQ0tcbiIpOwotCQkJaSA9IDQ7IGJyZWFrOwotCQljYXNlIFNDVFBfQ0lEX0VSUk9SOgotCQkJREVCVUdQKCJTQ1RQX0NJRF9FUlJPUlxuIik7Ci0JCQlpID0gNTsgYnJlYWs7Ci0JCWNhc2UgU0NUUF9DSURfQ09PS0lFX0VDSE86Ci0JCQlERUJVR1AoIlNDVFBfQ0lEX0NPT0tJRV9FQ0hPXG4iKTsKLQkJCWkgPSA2OyBicmVhazsKLQkJY2FzZSBTQ1RQX0NJRF9DT09LSUVfQUNLOgotCQkJREVCVUdQKCJTQ1RQX0NJRF9DT09LSUVfQUNLXG4iKTsKLQkJCWkgPSA3OyBicmVhazsKLQkJY2FzZSBTQ1RQX0NJRF9TSFVURE9XTl9DT01QTEVURToKLQkJCURFQlVHUCgiU0NUUF9DSURfU0hVVERPV05fQ09NUExFVEVcbiIpOwotCQkJaSA9IDg7IGJyZWFrOwotCQlkZWZhdWx0OgotCQkJLyogT3RoZXIgY2h1bmtzIGxpa2UgREFUQSwgU0FDSywgSEVBUlRCRUFUIGFuZAotCQkJaXRzIEFDSyBkbyBub3QgY2F1c2UgYSBjaGFuZ2UgaW4gc3RhdGUgKi8KLQkJCURFQlVHUCgiVW5rbm93biBjaHVuayB0eXBlLCBXaWxsIHN0YXkgaW4gJXNcbiIsCi0JCQkJCQlzY3RwX2Nvbm50cmFja19uYW1lc1tjdXJfc3RhdGVdKTsKLQkJCXJldHVybiBjdXJfc3RhdGU7Ci0JfQotCi0JREVCVUdQKCJkaXI6ICVkICAgY3VyX3N0YXRlOiAlcyAgY2h1bmtfdHlwZTogJWQgIG5ld19zdGF0ZTogJXNcbiIsCi0JCQlkaXIsIHNjdHBfY29ubnRyYWNrX25hbWVzW2N1cl9zdGF0ZV0sIGNodW5rX3R5cGUsCi0JCQlzY3RwX2Nvbm50cmFja19uYW1lc1tzY3RwX2Nvbm50cmFja3NbZGlyXVtpXVtjdXJfc3RhdGVdXSk7Ci0KLQlyZXR1cm4gc2N0cF9jb25udHJhY2tzW2Rpcl1baV1bY3VyX3N0YXRlXTsKLX0KLQotLyogUmV0dXJucyB2ZXJkaWN0IGZvciBwYWNrZXQsIG9yIC0xIGZvciBpbnZhbGlkLiAqLwotc3RhdGljIGludCBzY3RwX3BhY2tldChzdHJ1Y3QgaXBfY29ubnRyYWNrICpjb25udHJhY2ssCi0JCSAgICAgICBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkgICAgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8pCi17Ci0JZW51bSBzY3RwX2Nvbm50cmFjayBuZXdjb25udHJhY2ssIG9sZHNjdHBzdGF0ZTsKLQlzdHJ1Y3QgaXBoZHIgKmlwaCA9IHNrYi0+bmguaXBoOwotCXNjdHBfc2N0cGhkcl90IF9zY3RwaCwgKnNoOwotCXNjdHBfY2h1bmtoZHJfdCBfc2NoLCAqc2NoOwotCXVfaW50MzJfdCBvZmZzZXQsIGNvdW50OwotCWNoYXIgbWFwWzI1NiAvIHNpemVvZiAoY2hhcildID0gezB9OwotCi0JREVCVUdQKF9fRlVOQ1RJT05fXyk7Ci0JREVCVUdQKCJcbiIpOwotCi0Jc2ggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBpcGgtPmlobCAqIDQsIHNpemVvZihfc2N0cGgpLCAmX3NjdHBoKTsKLQlpZiAoc2ggPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCi0JaWYgKGRvX2Jhc2ljX2NoZWNrcyhjb25udHJhY2ssIHNrYiwgbWFwKSAhPSAwKQotCQlyZXR1cm4gLTE7Ci0KLQkvKiBDaGVjayB0aGUgdmVyaWZpY2F0aW9uIHRhZyAoU2VjIDguNSkgKi8KLQlpZiAoIXRlc3RfYml0KFNDVFBfQ0lEX0lOSVQsICh2b2lkICopbWFwKQotCQkmJiAhdGVzdF9iaXQoU0NUUF9DSURfU0hVVERPV05fQ09NUExFVEUsICh2b2lkICopbWFwKQotCQkmJiAhdGVzdF9iaXQoU0NUUF9DSURfQ09PS0lFX0VDSE8sICh2b2lkICopbWFwKQotCQkmJiAhdGVzdF9iaXQoU0NUUF9DSURfQUJPUlQsICh2b2lkICopbWFwKQotCQkmJiAhdGVzdF9iaXQoU0NUUF9DSURfU0hVVERPV05fQUNLLCAodm9pZCAqKW1hcCkKLQkJJiYgKHNoLT52dGFnICE9IGNvbm50cmFjay0+cHJvdG8uc2N0cC52dGFnW0NUSU5GTzJESVIoY3RpbmZvKV0pKSB7Ci0JCURFQlVHUCgiVmVyaWZpY2F0aW9uIHRhZyBjaGVjayBmYWlsZWRcbiIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0Jb2xkc2N0cHN0YXRlID0gbmV3Y29ubnRyYWNrID0gU0NUUF9DT05OVFJBQ0tfTUFYOwotCWZvcl9lYWNoX3NjdHBfY2h1bmsgKHNrYiwgc2NoLCBfc2NoLCBvZmZzZXQsIGNvdW50KSB7Ci0JCXdyaXRlX2xvY2tfYmgoJnNjdHBfbG9jayk7Ci0KLQkJLyogU3BlY2lhbCBjYXNlcyBvZiBWZXJpZmljYXRpb24gdGFnIGNoZWNrIChTZWMgOC41LjEpICovCi0JCWlmIChzY2gtPnR5cGUgPT0gU0NUUF9DSURfSU5JVCkgewotCQkJLyogU2VjIDguNS4xIChBKSAqLwotCQkJaWYgKHNoLT52dGFnICE9IDApIHsKLQkJCQl3cml0ZV91bmxvY2tfYmgoJnNjdHBfbG9jayk7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9IGVsc2UgaWYgKHNjaC0+dHlwZSA9PSBTQ1RQX0NJRF9BQk9SVCkgewotCQkJLyogU2VjIDguNS4xIChCKSAqLwotCQkJaWYgKCEoc2gtPnZ0YWcgPT0gY29ubnRyYWNrLT5wcm90by5zY3RwLnZ0YWdbQ1RJTkZPMkRJUihjdGluZm8pXSkKLQkJCQkmJiAhKHNoLT52dGFnID09IGNvbm50cmFjay0+cHJvdG8uc2N0cC52dGFnCi0JCQkJCQkJWzEgLSBDVElORk8yRElSKGN0aW5mbyldKSkgewotCQkJCXdyaXRlX3VubG9ja19iaCgmc2N0cF9sb2NrKTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoc2NoLT50eXBlID09IFNDVFBfQ0lEX1NIVVRET1dOX0NPTVBMRVRFKSB7Ci0JCQkvKiBTZWMgOC41LjEgKEMpICovCi0JCQlpZiAoIShzaC0+dnRhZyA9PSBjb25udHJhY2stPnByb3RvLnNjdHAudnRhZ1tDVElORk8yRElSKGN0aW5mbyldKQotCQkJCSYmICEoc2gtPnZ0YWcgPT0gY29ubnRyYWNrLT5wcm90by5zY3RwLnZ0YWcKLQkJCQkJCQlbMSAtIENUSU5GTzJESVIoY3RpbmZvKV0KLQkJCQkJJiYgKHNjaC0+ZmxhZ3MgJiAxKSkpIHsKLQkJCQl3cml0ZV91bmxvY2tfYmgoJnNjdHBfbG9jayk7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9IGVsc2UgaWYgKHNjaC0+dHlwZSA9PSBTQ1RQX0NJRF9DT09LSUVfRUNITykgewotCQkJLyogU2VjIDguNS4xIChEKSAqLwotCQkJaWYgKCEoc2gtPnZ0YWcgPT0gY29ubnRyYWNrLT5wcm90by5zY3RwLnZ0YWdbQ1RJTkZPMkRJUihjdGluZm8pXSkpIHsKLQkJCQl3cml0ZV91bmxvY2tfYmgoJnNjdHBfbG9jayk7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0KLQkJb2xkc2N0cHN0YXRlID0gY29ubnRyYWNrLT5wcm90by5zY3RwLnN0YXRlOwotCQluZXdjb25udHJhY2sgPSBuZXdfc3RhdGUoQ1RJTkZPMkRJUihjdGluZm8pLCBvbGRzY3Rwc3RhdGUsIHNjaC0+dHlwZSk7Ci0KLQkJLyogSW52YWxpZCAqLwotCQlpZiAobmV3Y29ubnRyYWNrID09IFNDVFBfQ09OTlRSQUNLX01BWCkgewotCQkJREVCVUdQKCJpcF9jb25udHJhY2tfc2N0cDogSW52YWxpZCBkaXI9JWkgY3R5cGU9JXUgY29ubnRyYWNrPSV1XG4iLAotCQkJICAgICAgIENUSU5GTzJESVIoY3RpbmZvKSwgc2NoLT50eXBlLCBvbGRzY3Rwc3RhdGUpOwotCQkJd3JpdGVfdW5sb2NrX2JoKCZzY3RwX2xvY2spOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0KLQkJLyogSWYgaXQgaXMgYW4gSU5JVCBvciBhbiBJTklUIEFDSyBub3RlIGRvd24gdGhlIHZ0YWcgKi8KLQkJaWYgKHNjaC0+dHlwZSA9PSBTQ1RQX0NJRF9JTklUCi0JCQl8fCBzY2gtPnR5cGUgPT0gU0NUUF9DSURfSU5JVF9BQ0spIHsKLQkJCXNjdHBfaW5pdGhkcl90IF9pbml0aGRyLCAqaWg7Ci0KLQkJCWloID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgb2Zmc2V0ICsgc2l6ZW9mKHNjdHBfY2h1bmtoZHJfdCksCi0JCQkJCQlzaXplb2YoX2luaXRoZHIpLCAmX2luaXRoZHIpOwotCQkJaWYgKGloID09IE5VTEwpIHsKLQkJCQkJd3JpdGVfdW5sb2NrX2JoKCZzY3RwX2xvY2spOwotCQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCQlERUJVR1AoIlNldHRpbmcgdnRhZyAleCBmb3IgZGlyICVkXG4iLAotCQkJCQlpaC0+aW5pdF90YWcsICFDVElORk8yRElSKGN0aW5mbykpOwotCQkJY29ubnRyYWNrLT5wcm90by5zY3RwLnZ0YWdbIUNUSU5GTzJESVIoY3RpbmZvKV0gPSBpaC0+aW5pdF90YWc7Ci0JCX0KLQotCQljb25udHJhY2stPnByb3RvLnNjdHAuc3RhdGUgPSBuZXdjb25udHJhY2s7Ci0JCWlmIChvbGRzY3Rwc3RhdGUgIT0gbmV3Y29ubnRyYWNrKQotCQkJaXBfY29ubnRyYWNrX2V2ZW50X2NhY2hlKElQQ1RfUFJPVE9JTkZPLCBza2IpOwotCQl3cml0ZV91bmxvY2tfYmgoJnNjdHBfbG9jayk7Ci0JfQotCi0JaXBfY3RfcmVmcmVzaF9hY2N0KGNvbm50cmFjaywgY3RpbmZvLCBza2IsICpzY3RwX3RpbWVvdXRzW25ld2Nvbm50cmFja10pOwotCi0JaWYgKG9sZHNjdHBzdGF0ZSA9PSBTQ1RQX0NPTk5UUkFDS19DT09LSUVfRUNIT0VECi0JCSYmIENUSU5GTzJESVIoY3RpbmZvKSA9PSBJUF9DVF9ESVJfUkVQTFkKLQkJJiYgbmV3Y29ubnRyYWNrID09IFNDVFBfQ09OTlRSQUNLX0VTVEFCTElTSEVEKSB7Ci0JCURFQlVHUCgiU2V0dGluZyBhc3N1cmVkIGJpdFxuIik7Ci0JCXNldF9iaXQoSVBTX0FTU1VSRURfQklULCAmY29ubnRyYWNrLT5zdGF0dXMpOwotCQlpcF9jb25udHJhY2tfZXZlbnRfY2FjaGUoSVBDVF9TVEFUVVMsIHNrYik7Ci0JfQotCi0JcmV0dXJuIE5GX0FDQ0VQVDsKLX0KLQotLyogQ2FsbGVkIHdoZW4gYSBuZXcgY29ubmVjdGlvbiBmb3IgdGhpcyBwcm90b2NvbCBmb3VuZC4gKi8KLXN0YXRpYyBpbnQgc2N0cF9uZXcoc3RydWN0IGlwX2Nvbm50cmFjayAqY29ubnRyYWNrLAotCQkgICAgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQllbnVtIHNjdHBfY29ubnRyYWNrIG5ld2Nvbm50cmFjazsKLQlzdHJ1Y3QgaXBoZHIgKmlwaCA9IHNrYi0+bmguaXBoOwotCXNjdHBfc2N0cGhkcl90IF9zY3RwaCwgKnNoOwotCXNjdHBfY2h1bmtoZHJfdCBfc2NoLCAqc2NoOwotCXVfaW50MzJfdCBvZmZzZXQsIGNvdW50OwotCWNoYXIgbWFwWzI1NiAvIHNpemVvZiAoY2hhcildID0gezB9OwotCi0JREVCVUdQKF9fRlVOQ1RJT05fXyk7Ci0JREVCVUdQKCJcbiIpOwotCi0Jc2ggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBpcGgtPmlobCAqIDQsIHNpemVvZihfc2N0cGgpLCAmX3NjdHBoKTsKLQlpZiAoc2ggPT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoZG9fYmFzaWNfY2hlY2tzKGNvbm50cmFjaywgc2tiLCBtYXApICE9IDApCi0JCXJldHVybiAwOwotCi0JLyogSWYgYW4gT09UQiBwYWNrZXQgaGFzIGFueSBvZiB0aGVzZSBjaHVua3MgZGlzY2FyZCAoU2VjIDguNCkgKi8KLQlpZiAoKHRlc3RfYml0IChTQ1RQX0NJRF9BQk9SVCwgKHZvaWQgKiltYXApKQotCQl8fCAodGVzdF9iaXQgKFNDVFBfQ0lEX1NIVVRET1dOX0NPTVBMRVRFLCAodm9pZCAqKW1hcCkpCi0JCXx8ICh0ZXN0X2JpdCAoU0NUUF9DSURfQ09PS0lFX0FDSywgKHZvaWQgKiltYXApKSkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQluZXdjb25udHJhY2sgPSBTQ1RQX0NPTk5UUkFDS19NQVg7Ci0JZm9yX2VhY2hfc2N0cF9jaHVuayAoc2tiLCBzY2gsIF9zY2gsIG9mZnNldCwgY291bnQpIHsKLQkJLyogRG9uJ3QgbmVlZCBsb2NrIGhlcmU6IHRoaXMgY29ubnRyYWNrIG5vdCBpbiBjaXJjdWxhdGlvbiB5ZXQgKi8KLQkJbmV3Y29ubnRyYWNrID0gbmV3X3N0YXRlIChJUF9DVF9ESVJfT1JJR0lOQUwsCi0JCQkJCQlTQ1RQX0NPTk5UUkFDS19OT05FLCBzY2gtPnR5cGUpOwotCi0JCS8qIEludmFsaWQ6IGRlbGV0ZSBjb25udHJhY2sgKi8KLQkJaWYgKG5ld2Nvbm50cmFjayA9PSBTQ1RQX0NPTk5UUkFDS19NQVgpIHsKLQkJCURFQlVHUCgiaXBfY29ubnRyYWNrX3NjdHA6IGludmFsaWQgbmV3IGRlbGV0aW5nLlxuIik7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCS8qIENvcHkgdGhlIHZ0YWcgaW50byB0aGUgc3RhdGUgaW5mbyAqLwotCQlpZiAoc2NoLT50eXBlID09IFNDVFBfQ0lEX0lOSVQpIHsKLQkJCWlmIChzaC0+dnRhZyA9PSAwKSB7Ci0JCQkJc2N0cF9pbml0aGRyX3QgX2luaXRoZHIsICppaDsKLQotCQkJCWloID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgb2Zmc2V0ICsgc2l6ZW9mKHNjdHBfY2h1bmtoZHJfdCksCi0JCQkJCQkJc2l6ZW9mKF9pbml0aGRyKSwgJl9pbml0aGRyKTsKLQkJCQlpZiAoaWggPT0gTlVMTCkKLQkJCQkJcmV0dXJuIDA7Ci0KLQkJCQlERUJVR1AoIlNldHRpbmcgdnRhZyAleCBmb3IgbmV3IGNvbm5cbiIsCi0JCQkJCWloLT5pbml0X3RhZyk7Ci0KLQkJCQljb25udHJhY2stPnByb3RvLnNjdHAudnRhZ1tJUF9DVF9ESVJfUkVQTFldID0KLQkJCQkJCQkJaWgtPmluaXRfdGFnOwotCQkJfSBlbHNlIHsKLQkJCQkvKiBTZWMgOC41LjEgKEEpICovCi0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCX0KLQkJLyogSWYgaXQgaXMgYSBzaHV0ZG93biBhY2sgT09UQiBwYWNrZXQsIHdlIGV4cGVjdCBhIHJldHVybgotCQkgICBzaHV0ZG93biBjb21wbGV0ZSwgb3RoZXJ3aXNlIGFuIEFCT1JUIFNlYyA4LjQgKDUpIGFuZCAoOCkgKi8KLQkJZWxzZSB7Ci0JCQlERUJVR1AoIlNldHRpbmcgdnRhZyAleCBmb3IgbmV3IGNvbm4gT09UQlxuIiwKLQkJCQlzaC0+dnRhZyk7Ci0JCQljb25udHJhY2stPnByb3RvLnNjdHAudnRhZ1tJUF9DVF9ESVJfUkVQTFldID0gc2gtPnZ0YWc7Ci0JCX0KLQotCQljb25udHJhY2stPnByb3RvLnNjdHAuc3RhdGUgPSBuZXdjb25udHJhY2s7Ci0JfQotCi0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXBfY29ubnRyYWNrX3Byb3RvY29sIGlwX2Nvbm50cmFja19wcm90b2NvbF9zY3RwID0gewotCS5wcm90byAJCSA9IElQUFJPVE9fU0NUUCwKLQkubmFtZSAJCSA9ICJzY3RwIiwKLQkucGt0X3RvX3R1cGxlIAkgPSBzY3RwX3BrdF90b190dXBsZSwKLQkuaW52ZXJ0X3R1cGxlIAkgPSBzY3RwX2ludmVydF90dXBsZSwKLQkucHJpbnRfdHVwbGUgCSA9IHNjdHBfcHJpbnRfdHVwbGUsCi0JLnByaW50X2Nvbm50cmFjayA9IHNjdHBfcHJpbnRfY29ubnRyYWNrLAotCS5wYWNrZXQgCSA9IHNjdHBfcGFja2V0LAotCS5uZXcgCQkgPSBzY3RwX25ldywKLQkuZGVzdHJveSAJID0gTlVMTCwKLQkubWUgCQkgPSBUSElTX01PRFVMRSwKLSNpZiBkZWZpbmVkKENPTkZJR19JUF9ORl9DT05OVFJBQ0tfTkVUTElOSykgfHwgXAotICAgIGRlZmluZWQoQ09ORklHX0lQX05GX0NPTk5UUkFDS19ORVRMSU5LX01PRFVMRSkKLQkudHVwbGVfdG9fbmZhdHRyID0gaXBfY3RfcG9ydF90dXBsZV90b19uZmF0dHIsCi0JLm5mYXR0cl90b190dXBsZSA9IGlwX2N0X3BvcnRfbmZhdHRyX3RvX3R1cGxlLAotI2VuZGlmCi19OwotCi0jaWZkZWYgQ09ORklHX1NZU0NUTAotc3RhdGljIGN0bF90YWJsZSBpcF9jdF9zeXNjdGxfdGFibGVbXSA9IHsKLQl7Ci0JCS5jdGxfbmFtZQk9IE5FVF9JUFY0X05GX0NPTk5UUkFDS19TQ1RQX1RJTUVPVVRfQ0xPU0VELAotCQkucHJvY25hbWUJPSAiaXBfY29ubnRyYWNrX3NjdHBfdGltZW91dF9jbG9zZWQiLAotCQkuZGF0YQkJPSAmaXBfY3Rfc2N0cF90aW1lb3V0X2Nsb3NlZCwKLQkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX2ppZmZpZXMsCi0JfSwKLQl7Ci0JCS5jdGxfbmFtZQk9IE5FVF9JUFY0X05GX0NPTk5UUkFDS19TQ1RQX1RJTUVPVVRfQ09PS0lFX1dBSVQsCi0JCS5wcm9jbmFtZQk9ICJpcF9jb25udHJhY2tfc2N0cF90aW1lb3V0X2Nvb2tpZV93YWl0IiwKLQkJLmRhdGEJCT0gJmlwX2N0X3NjdHBfdGltZW91dF9jb29raWVfd2FpdCwKLQkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX2ppZmZpZXMsCi0JfSwKLQl7Ci0JCS5jdGxfbmFtZQk9IE5FVF9JUFY0X05GX0NPTk5UUkFDS19TQ1RQX1RJTUVPVVRfQ09PS0lFX0VDSE9FRCwKLQkJLnByb2NuYW1lCT0gImlwX2Nvbm50cmFja19zY3RwX3RpbWVvdXRfY29va2llX2VjaG9lZCIsCi0JCS5kYXRhCQk9ICZpcF9jdF9zY3RwX3RpbWVvdXRfY29va2llX2VjaG9lZCwKLQkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX2ppZmZpZXMsCi0JfSwKLQl7Ci0JCS5jdGxfbmFtZQk9IE5FVF9JUFY0X05GX0NPTk5UUkFDS19TQ1RQX1RJTUVPVVRfRVNUQUJMSVNIRUQsCi0JCS5wcm9jbmFtZQk9ICJpcF9jb25udHJhY2tfc2N0cF90aW1lb3V0X2VzdGFibGlzaGVkIiwKLQkJLmRhdGEJCT0gJmlwX2N0X3NjdHBfdGltZW91dF9lc3RhYmxpc2hlZCwKLQkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX2ppZmZpZXMsCi0JfSwKLQl7Ci0JCS5jdGxfbmFtZQk9IE5FVF9JUFY0X05GX0NPTk5UUkFDS19TQ1RQX1RJTUVPVVRfU0hVVERPV05fU0VOVCwKLQkJLnByb2NuYW1lCT0gImlwX2Nvbm50cmFja19zY3RwX3RpbWVvdXRfc2h1dGRvd25fc2VudCIsCi0JCS5kYXRhCQk9ICZpcF9jdF9zY3RwX3RpbWVvdXRfc2h1dGRvd25fc2VudCwKLQkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX2ppZmZpZXMsCi0JfSwKLQl7Ci0JCS5jdGxfbmFtZQk9IE5FVF9JUFY0X05GX0NPTk5UUkFDS19TQ1RQX1RJTUVPVVRfU0hVVERPV05fUkVDRCwKLQkJLnByb2NuYW1lCT0gImlwX2Nvbm50cmFja19zY3RwX3RpbWVvdXRfc2h1dGRvd25fcmVjZCIsCi0JCS5kYXRhCQk9ICZpcF9jdF9zY3RwX3RpbWVvdXRfc2h1dGRvd25fcmVjZCwKLQkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX2ppZmZpZXMsCi0JfSwKLQl7Ci0JCS5jdGxfbmFtZQk9IE5FVF9JUFY0X05GX0NPTk5UUkFDS19TQ1RQX1RJTUVPVVRfU0hVVERPV05fQUNLX1NFTlQsCi0JCS5wcm9jbmFtZQk9ICJpcF9jb25udHJhY2tfc2N0cF90aW1lb3V0X3NodXRkb3duX2Fja19zZW50IiwKLQkJLmRhdGEJCT0gJmlwX2N0X3NjdHBfdGltZW91dF9zaHV0ZG93bl9hY2tfc2VudCwKLQkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX2ppZmZpZXMsCi0JfSwKLQl7IC5jdGxfbmFtZSA9IDAgfQotfTsKLQotc3RhdGljIGN0bF90YWJsZSBpcF9jdF9uZXRmaWx0ZXJfdGFibGVbXSA9IHsKLQl7Ci0JCS5jdGxfbmFtZQk9IE5FVF9JUFY0X05FVEZJTFRFUiwKLQkJLnByb2NuYW1lCT0gIm5ldGZpbHRlciIsCi0JCS5tb2RlCQk9IDA1NTUsCi0JCS5jaGlsZAkJPSBpcF9jdF9zeXNjdGxfdGFibGUsCi0JfSwKLQl7IC5jdGxfbmFtZSA9IDAgfQotfTsKLQotc3RhdGljIGN0bF90YWJsZSBpcF9jdF9pcHY0X3RhYmxlW10gPSB7Ci0JewotCQkuY3RsX25hbWUJPSBORVRfSVBWNCwKLQkJLnByb2NuYW1lCT0gImlwdjQiLAotCQkubW9kZQkJPSAwNTU1LAotCQkuY2hpbGQJCT0gaXBfY3RfbmV0ZmlsdGVyX3RhYmxlLAotCX0sCi0JeyAuY3RsX25hbWUgPSAwIH0KLX07Ci0KLXN0YXRpYyBjdGxfdGFibGUgaXBfY3RfbmV0X3RhYmxlW10gPSB7Ci0JewotCQkuY3RsX25hbWUJPSBDVExfTkVULAotCQkucHJvY25hbWUJPSAibmV0IiwKLQkJLm1vZGUJCT0gMDU1NSwKLQkJLmNoaWxkCQk9IGlwX2N0X2lwdjRfdGFibGUsCi0JfSwKLQl7IC5jdGxfbmFtZSA9IDAgfQotfTsKLQotc3RhdGljIHN0cnVjdCBjdGxfdGFibGVfaGVhZGVyICppcF9jdF9zeXNjdGxfaGVhZGVyOwotI2VuZGlmCi0KLXN0YXRpYyBpbnQgX19pbml0IGlwX2Nvbm50cmFja19wcm90b19zY3RwX2luaXQodm9pZCkKLXsKLQlpbnQgcmV0OwotCi0JcmV0ID0gaXBfY29ubnRyYWNrX3Byb3RvY29sX3JlZ2lzdGVyKCZpcF9jb25udHJhY2tfcHJvdG9jb2xfc2N0cCk7Ci0JaWYgKHJldCkgewotCQlwcmludGsoImlwX2Nvbm50cmFja19wcm90b19zY3RwOiBwcm90b2NvbCByZWdpc3RlciBmYWlsZWRcbiIpOwotCQlnb3RvIG91dDsKLQl9Ci0KLSNpZmRlZiBDT05GSUdfU1lTQ1RMCi0JaXBfY3Rfc3lzY3RsX2hlYWRlciA9IHJlZ2lzdGVyX3N5c2N0bF90YWJsZShpcF9jdF9uZXRfdGFibGUpOwotCWlmIChpcF9jdF9zeXNjdGxfaGVhZGVyID09IE5VTEwpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJcHJpbnRrKCJpcF9jb25udHJhY2tfcHJvdG9fc2N0cDogY2FuJ3QgcmVnaXN0ZXIgdG8gc3lzY3RsLlxuIik7Ci0JCWdvdG8gY2xlYW51cDsKLQl9Ci0jZW5kaWYKLQotCXJldHVybiByZXQ7Ci0KLSNpZmRlZiBDT05GSUdfU1lTQ1RMCi0gY2xlYW51cDoKLQlpcF9jb25udHJhY2tfcHJvdG9jb2xfdW5yZWdpc3RlcigmaXBfY29ubnRyYWNrX3Byb3RvY29sX3NjdHApOwotI2VuZGlmCi0gb3V0OgotCURFQlVHUCgiU0NUUCBjb25udHJhY2sgbW9kdWxlIGxvYWRpbmcgJXNcbiIsCi0JCQkJCXJldCA/ICJmYWlsZWQiOiAic3VjY2VlZGVkIik7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGlwX2Nvbm50cmFja19wcm90b19zY3RwX2Zpbmkodm9pZCkKLXsKLQlpcF9jb25udHJhY2tfcHJvdG9jb2xfdW5yZWdpc3RlcigmaXBfY29ubnRyYWNrX3Byb3RvY29sX3NjdHApOwotI2lmZGVmIENPTkZJR19TWVNDVEwKLQl1bnJlZ2lzdGVyX3N5c2N0bF90YWJsZShpcF9jdF9zeXNjdGxfaGVhZGVyKTsKLSNlbmRpZgotCURFQlVHUCgiU0NUUCBjb25udHJhY2sgbW9kdWxlIHVubG9hZGVkXG4iKTsKLX0KLQotbW9kdWxlX2luaXQoaXBfY29ubnRyYWNrX3Byb3RvX3NjdHBfaW5pdCk7Ci1tb2R1bGVfZXhpdChpcF9jb25udHJhY2tfcHJvdG9fc2N0cF9maW5pKTsKLQotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX0FVVEhPUigiS2lyYW4gS3VtYXIgSW1taWRpIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIk5ldGZpbHRlciBjb25uZWN0aW9uIHRyYWNraW5nIHByb3RvY29sIGhlbHBlciBmb3IgU0NUUCIpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19wcm90b190Y3AuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfcHJvdG9fdGNwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhNzJlYWIuLjAwMDAwMDAKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19wcm90b190Y3AuYworKysgL2Rldi9udWxsCkBAIC0xLDExNjQgKzAsMCBAQAotLyogKEMpIDE5OTktMjAwMSBQYXVsIGBSdXN0eScgUnVzc2VsbAotICogKEMpIDIwMDItMjAwNCBOZXRmaWx0ZXIgQ29yZSBUZWFtIDxjb3JldGVhbUBuZXRmaWx0ZXIub3JnPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogSm96c2VmIEthZGxlY3NpayA8a2FkbGVjQGJsYWNraG9sZS5rZmtpLmh1PjoKLSAqCS0gUmVhbCBzdGF0ZWZ1bCBjb25uZWN0aW9uIHRyYWNraW5nCi0gKgktIE1vZGlmaWVkIHN0YXRlIHRyYW5zaXRpb25zIHRhYmxlCi0gKgktIFdpbmRvdyBzY2FsaW5nIHN1cHBvcnQgYWRkZWQKLSAqCS0gU0FDSyBzdXBwb3J0IGFkZGVkCi0gKgotICogV2lsbHkgVGFycmVhdToKLSAqCS0gU3RhdGUgdGFibGUgYnVnZml4ZXMKLSAqCS0gTW9yZSByb2J1c3Qgc3RhdGUgY2hhbmdlcwotICoJLSBUdW5pbmcgdGltZXIgcGFyYW1ldGVycwotICoKLSAqIHZlcnNpb24gMi4yCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvdGltZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbi5oPgotI2luY2x1ZGUgPGxpbnV4L2lwLmg+Ci0jaW5jbHVkZSA8bGludXgvdGNwLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLQotI2luY2x1ZGUgPG5ldC90Y3AuaD4KLQotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX3Byb3RvY29sLmg+Ci0KLSNpZiAwCi0jZGVmaW5lIERFQlVHUCBwcmludGsKLSNkZWZpbmUgREVCVUdQX1ZBUlMKLSNlbHNlCi0jZGVmaW5lIERFQlVHUChmb3JtYXQsIGFyZ3MuLi4pCi0jZW5kaWYKLQotLyogUHJvdGVjdHMgY29ubnRyYWNrLT5wcm90by50Y3AgKi8KLXN0YXRpYyBERUZJTkVfUldMT0NLKHRjcF9sb2NrKTsKLQotLyogIkJlIGNvbnNlcnZhdGl2ZSBpbiB3aGF0IHlvdSBkbywKLSAgICBiZSBsaWJlcmFsIGluIHdoYXQgeW91IGFjY2VwdCBmcm9tIG90aGVycy4iCi0gICAgSWYgaXQncyBub24temVybywgd2UgbWFyayBvbmx5IG91dCBvZiB3aW5kb3cgUlNUIHNlZ21lbnRzIGFzIElOVkFMSUQuICovCi1pbnQgaXBfY3RfdGNwX2JlX2xpYmVyYWwgX19yZWFkX21vc3RseSA9IDA7Ci0KLS8qIElmIGl0IGlzIHNldCB0byB6ZXJvLCB3ZSBkaXNhYmxlIHBpY2tpbmcgdXAgYWxyZWFkeSBlc3RhYmxpc2hlZAotICAgY29ubmVjdGlvbnMuICovCi1pbnQgaXBfY3RfdGNwX2xvb3NlIF9fcmVhZF9tb3N0bHkgPSAxOwotCi0vKiBNYXggbnVtYmVyIG9mIHRoZSByZXRyYW5zbWl0dGVkIHBhY2tldHMgd2l0aG91dCByZWNlaXZpbmcgYW4gKGFjY2VwdGFibGUpCi0gICBBQ0sgZnJvbSB0aGUgZGVzdGluYXRpb24uIElmIHRoaXMgbnVtYmVyIGlzIHJlYWNoZWQsIGEgc2hvcnRlciB0aW1lcgotICAgd2lsbCBiZSBzdGFydGVkLiAqLwotaW50IGlwX2N0X3RjcF9tYXhfcmV0cmFucyBfX3JlYWRfbW9zdGx5ID0gMzsKLQotICAvKiBGSVhNRTogRXhhbWluZSBpcGZpbHRlcidzIHRpbWVvdXRzIGFuZCBjb25udHJhY2sgdHJhbnNpdGlvbnMgbW9yZQotICAgICBjbG9zZWx5LiAgVGhleSdyZSBtb3JlIGNvbXBsZXguIC0tUlIgKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKnRjcF9jb25udHJhY2tfbmFtZXNbXSA9IHsKLQkiTk9ORSIsCi0JIlNZTl9TRU5UIiwKLQkiU1lOX1JFQ1YiLAotCSJFU1RBQkxJU0hFRCIsCi0JIkZJTl9XQUlUIiwKLQkiQ0xPU0VfV0FJVCIsCi0JIkxBU1RfQUNLIiwKLQkiVElNRV9XQUlUIiwKLQkiQ0xPU0UiLAotCSJMSVNURU4iCi19OwotCi0jZGVmaW5lIFNFQ1MgKiBIWgotI2RlZmluZSBNSU5TICogNjAgU0VDUwotI2RlZmluZSBIT1VSUyAqIDYwIE1JTlMKLSNkZWZpbmUgREFZUyAqIDI0IEhPVVJTCi0KLXVuc2lnbmVkIGludCBpcF9jdF90Y3BfdGltZW91dF9zeW5fc2VudCBfX3JlYWRfbW9zdGx5ID0gICAgICAyIE1JTlM7Ci11bnNpZ25lZCBpbnQgaXBfY3RfdGNwX3RpbWVvdXRfc3luX3JlY3YgX19yZWFkX21vc3RseSA9ICAgICA2MCBTRUNTOwotdW5zaWduZWQgaW50IGlwX2N0X3RjcF90aW1lb3V0X2VzdGFibGlzaGVkIF9fcmVhZF9tb3N0bHkgPSAgIDUgREFZUzsKLXVuc2lnbmVkIGludCBpcF9jdF90Y3BfdGltZW91dF9maW5fd2FpdCBfX3JlYWRfbW9zdGx5ID0gICAgICAyIE1JTlM7Ci11bnNpZ25lZCBpbnQgaXBfY3RfdGNwX3RpbWVvdXRfY2xvc2Vfd2FpdCBfX3JlYWRfbW9zdGx5ID0gICA2MCBTRUNTOwotdW5zaWduZWQgaW50IGlwX2N0X3RjcF90aW1lb3V0X2xhc3RfYWNrIF9fcmVhZF9tb3N0bHkgPSAgICAgMzAgU0VDUzsKLXVuc2lnbmVkIGludCBpcF9jdF90Y3BfdGltZW91dF90aW1lX3dhaXQgX19yZWFkX21vc3RseSA9ICAgICAyIE1JTlM7Ci11bnNpZ25lZCBpbnQgaXBfY3RfdGNwX3RpbWVvdXRfY2xvc2UgX19yZWFkX21vc3RseSA9ICAgICAgICAxMCBTRUNTOwotCi0vKiBSRkMxMTIyIHNheXMgdGhlIFIyIGxpbWl0IHNob3VsZCBiZSBhdCBsZWFzdCAxMDAgc2Vjb25kcy4KLSAgIExpbnV4IHVzZXMgMTUgcGFja2V0cyBhcyBsaW1pdCwgd2hpY2ggY29ycmVzcG9uZHMKLSAgIHRvIH4xMy0zMG1pbiBkZXBlbmRpbmcgb24gUlRPLiAqLwotdW5zaWduZWQgaW50IGlwX2N0X3RjcF90aW1lb3V0X21heF9yZXRyYW5zIF9fcmVhZF9tb3N0bHkgPSAgIDUgTUlOUzsKLQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCAqIHRjcF90aW1lb3V0c1tdCi09IHsgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAgIFRDUF9DT05OVFJBQ0tfTk9ORSAqLwotICAgICZpcF9jdF90Y3BfdGltZW91dF9zeW5fc2VudCwgICAgICAgLyogICAgICBUQ1BfQ09OTlRSQUNLX1NZTl9TRU5ULCAqLwotICAgICZpcF9jdF90Y3BfdGltZW91dF9zeW5fcmVjdiwgICAgICAgLyogICAgICBUQ1BfQ09OTlRSQUNLX1NZTl9SRUNWLCAqLwotICAgICZpcF9jdF90Y3BfdGltZW91dF9lc3RhYmxpc2hlZCwgICAgLyogICAgICBUQ1BfQ09OTlRSQUNLX0VTVEFCTElTSEVELCAgICAgICovCi0gICAgJmlwX2N0X3RjcF90aW1lb3V0X2Zpbl93YWl0LCAgICAgICAvKiAgICAgIFRDUF9DT05OVFJBQ0tfRklOX1dBSVQsICovCi0gICAgJmlwX2N0X3RjcF90aW1lb3V0X2Nsb3NlX3dhaXQsICAgICAvKiAgICAgIFRDUF9DT05OVFJBQ0tfQ0xPU0VfV0FJVCwgICAgICAgKi8KLSAgICAmaXBfY3RfdGNwX3RpbWVvdXRfbGFzdF9hY2ssICAgICAgIC8qICAgICAgVENQX0NPTk5UUkFDS19MQVNUX0FDSywgKi8KLSAgICAmaXBfY3RfdGNwX3RpbWVvdXRfdGltZV93YWl0LCAgICAgIC8qICAgICAgVENQX0NPTk5UUkFDS19USU1FX1dBSVQsICAgICAgICAqLwotICAgICZpcF9jdF90Y3BfdGltZW91dF9jbG9zZSwgICAgICAgICAgLyogICAgICBUQ1BfQ09OTlRSQUNLX0NMT1NFLCAgICAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgICBUQ1BfQ09OTlRSQUNLX0xJU1RFTiAqLwotIH07Ci0KLSNkZWZpbmUgc05PIFRDUF9DT05OVFJBQ0tfTk9ORQotI2RlZmluZSBzU1MgVENQX0NPTk5UUkFDS19TWU5fU0VOVAotI2RlZmluZSBzU1IgVENQX0NPTk5UUkFDS19TWU5fUkVDVgotI2RlZmluZSBzRVMgVENQX0NPTk5UUkFDS19FU1RBQkxJU0hFRAotI2RlZmluZSBzRlcgVENQX0NPTk5UUkFDS19GSU5fV0FJVAotI2RlZmluZSBzQ1cgVENQX0NPTk5UUkFDS19DTE9TRV9XQUlUCi0jZGVmaW5lIHNMQSBUQ1BfQ09OTlRSQUNLX0xBU1RfQUNLCi0jZGVmaW5lIHNUVyBUQ1BfQ09OTlRSQUNLX1RJTUVfV0FJVAotI2RlZmluZSBzQ0wgVENQX0NPTk5UUkFDS19DTE9TRQotI2RlZmluZSBzTEkgVENQX0NPTk5UUkFDS19MSVNURU4KLSNkZWZpbmUgc0lWIFRDUF9DT05OVFJBQ0tfTUFYCi0jZGVmaW5lIHNJRyBUQ1BfQ09OTlRSQUNLX0lHTk9SRQotCi0vKiBXaGF0IFRDUCBmbGFncyBhcmUgc2V0IGZyb20gUlNUL1NZTi9GSU4vQUNLLiAqLwotZW51bSB0Y3BfYml0X3NldCB7Ci0JVENQX1NZTl9TRVQsCi0JVENQX1NZTkFDS19TRVQsCi0JVENQX0ZJTl9TRVQsCi0JVENQX0FDS19TRVQsCi0JVENQX1JTVF9TRVQsCi0JVENQX05PTkVfU0VULAotfTsKLQotLyoKLSAqIFRoZSBUQ1Agc3RhdGUgdHJhbnNpdGlvbiB0YWJsZSBuZWVkcyBhIGZldyB3b3Jkcy4uLgotICoKLSAqIFdlIGFyZSB0aGUgbWFuIGluIHRoZSBtaWRkbGUuIEFsbCB0aGUgcGFja2V0cyBnbyB0aHJvdWdoIHVzCi0gKiBidXQgbWlnaHQgZ2V0IGxvc3QgaW4gdHJhbnNpdCB0byB0aGUgZGVzdGluYXRpb24uCi0gKiBJdCBpcyBhc3N1bWVkIHRoYXQgdGhlIGRlc3RpbmF0aW9ucyBjYW4ndCByZWNlaXZlIHNlZ21lbnRzCi0gKiB3ZSBoYXZlbid0IHNlZW4uCi0gKgotICogVGhlIGNoZWNrZWQgc2VnbWVudCBpcyBpbiB3aW5kb3csIGJ1dCBvdXIgd2luZG93cyBhcmUgKm5vdCoKLSAqIGVxdWl2YWxlbnQgd2l0aCB0aGUgb25lcyBvZiB0aGUgc2VuZGVyL3JlY2VpdmVyLiBXZSBhbHdheXMKLSAqIHRyeSB0byBndWVzcyB0aGUgc3RhdGUgb2YgdGhlIGN1cnJlbnQgc2VuZGVyLgotICoKLSAqIFRoZSBtZWFuaW5nIG9mIHRoZSBzdGF0ZXMgYXJlOgotICoKLSAqIE5PTkU6CWluaXRpYWwgc3RhdGUKLSAqIFNZTl9TRU5UOglTWU4tb25seSBwYWNrZXQgc2VlbgotICogU1lOX1JFQ1Y6CVNZTi1BQ0sgcGFja2V0IHNlZW4KLSAqIEVTVEFCTElTSEVEOglBQ0sgcGFja2V0IHNlZW4KLSAqIEZJTl9XQUlUOglGSU4gcGFja2V0IHNlZW4KLSAqIENMT1NFX1dBSVQ6CUFDSyBzZWVuIChhZnRlciBGSU4pCi0gKiBMQVNUX0FDSzoJRklOIHNlZW4gKGFmdGVyIEZJTikKLSAqIFRJTUVfV0FJVDoJbGFzdCBBQ0sgc2VlbgotICogQ0xPU0U6CWNsb3NlZCBjb25uZWN0aW9uCi0gKgotICogTElTVEVOIHN0YXRlIGlzIG5vdCB1c2VkLgotICoKLSAqIFBhY2tldHMgbWFya2VkIGFzIElHTk9SRUQgKHNJRyk6Ci0gKglpZiB0aGV5IG1heSBiZSBlaXRoZXIgaW52YWxpZCBvciB2YWxpZAotICoJYW5kIHRoZSByZWNlaXZlciBtYXkgc2VuZCBiYWNrIGEgY29ubmVjdGlvbgotICoJY2xvc2luZyBSU1Qgb3IgYSBTWU4vQUNLLgotICoKLSAqIFBhY2tldHMgbWFya2VkIGFzIElOVkFMSUQgKHNJVik6Ci0gKglpZiB0aGV5IGFyZSBpbnZhbGlkCi0gKglvciB3ZSBkbyBub3Qgc3VwcG9ydCB0aGUgcmVxdWVzdCAoc2ltdWx0YW5lb3VzIG9wZW4pCi0gKi8KLXN0YXRpYyBjb25zdCBlbnVtIHRjcF9jb25udHJhY2sgdGNwX2Nvbm50cmFja3NbMl1bNl1bVENQX0NPTk5UUkFDS19NQVhdID0gewotCXsKLS8qIE9SSUdJTkFMICovCi0vKiAJICAgICBzTk8sIHNTUywgc1NSLCBzRVMsIHNGVywgc0NXLCBzTEEsIHNUVywgc0NMLCBzTEkJKi8KLS8qc3luKi8JICAgeyBzU1MsIHNTUywgc0lHLCBzSUcsIHNJRywgc0lHLCBzSUcsIHNTUywgc1NTLCBzSVYgfSwKLS8qCi0gKglzTk8gLT4gc1NTCUluaXRpYWxpemUgYSBuZXcgY29ubmVjdGlvbgotICoJc1NTIC0+IHNTUwlSZXRyYW5zbWl0dGVkIFNZTgotICoJc1NSIC0+IHNJRwlMYXRlIHJldHJhbnNtaXR0ZWQgU1lOPwotICoJc0VTIC0+IHNJRwlFcnJvcjogU1lOcyBpbiB3aW5kb3cgb3V0c2lkZSB0aGUgU1lOX1NFTlQgc3RhdGUKLSAqCQkJYXJlIGVycm9ycy4gUmVjZWl2ZXIgd2lsbCByZXBseSB3aXRoIFJTVAotICoJCQlhbmQgY2xvc2UgdGhlIGNvbm5lY3Rpb24uCi0gKgkJCU9yIHdlIGFyZSBub3QgaW4gc3luYyBhbmQgaG9sZCBhIGRlYWQgY29ubmVjdGlvbi4KLSAqCXNGVyAtPiBzSUcKLSAqCXNDVyAtPiBzSUcKLSAqCXNMQSAtPiBzSUcKLSAqCXNUVyAtPiBzU1MJUmVvcGVuZWQgY29ubmVjdGlvbiAoUkZDIDExMjIpLgotICoJc0NMIC0+IHNTUwotICovCi0vKiAJICAgICBzTk8sIHNTUywgc1NSLCBzRVMsIHNGVywgc0NXLCBzTEEsIHNUVywgc0NMLCBzTEkJKi8KLS8qc3luYWNrKi8geyBzSVYsIHNJViwgc0lWLCBzSVYsIHNJViwgc0lWLCBzSVYsIHNJViwgc0lWLCBzSVYgfSwKLS8qCi0gKiBBIFNZTi9BQ0sgZnJvbSB0aGUgY2xpZW50IGlzIGFsd2F5cyBpbnZhbGlkOgotICoJLSBlaXRoZXIgaXQgdHJpZXMgdG8gc2V0IHVwIGEgc2ltdWx0YW5lb3VzIG9wZW4sIHdoaWNoIGlzCi0gKgkgIG5vdCBzdXBwb3J0ZWQ7Ci0gKgktIG9yIHRoZSBmaXJld2FsbCBoYXMganVzdCBiZWVuIGluc2VydGVkIGJldHdlZW4gdGhlIHR3byBob3N0cwotICoJICBkdXJpbmcgdGhlIHNlc3Npb24gc2V0LXVwLiBUaGUgU1lOIHdpbGwgYmUgcmV0cmFuc21pdHRlZAotICoJICBieSB0aGUgdHJ1ZSBjbGllbnQgKG9yIGl0J2xsIHRpbWUgb3V0KS4KLSAqLwotLyogCSAgICAgc05PLCBzU1MsIHNTUiwgc0VTLCBzRlcsIHNDVywgc0xBLCBzVFcsIHNDTCwgc0xJCSovCi0vKmZpbiovICAgIHsgc0lWLCBzSVYsIHNGVywgc0ZXLCBzTEEsIHNMQSwgc0xBLCBzVFcsIHNDTCwgc0lWIH0sCi0vKgotICoJc05PIC0+IHNJVglUb28gbGF0ZSBhbmQgbm8gcmVhc29uIHRvIGRvIGFueXRoaW5nLi4uCi0gKglzU1MgLT4gc0lWCUNsaWVudCBtaWd0aCBub3Qgc2VuZCBGSU4gaW4gdGhpcyBzdGF0ZToKLSAqCQkJd2UgZW5mb3JjZSB3YWl0aW5nIGZvciBhIFNZTi9BQ0sgcmVwbHkgZmlyc3QuCi0gKglzU1IgLT4gc0ZXCUNsb3NlIHN0YXJ0ZWQuCi0gKglzRVMgLT4gc0ZXCi0gKglzRlcgLT4gc0xBCUZJTiBzZWVuIGluIGJvdGggZGlyZWN0aW9ucywgd2FpdGluZyBmb3IKLSAqCQkJdGhlIGxhc3QgQUNLLgotICoJCQlNaWd0aCBiZSBhIHJldHJhbnNtaXR0ZWQgRklOIGFzIHdlbGwuLi4KLSAqCXNDVyAtPiBzTEEKLSAqCXNMQSAtPiBzTEEJUmV0cmFuc21pdHRlZCBGSU4uIFJlbWFpbiBpbiB0aGUgc2FtZSBzdGF0ZS4KLSAqCXNUVyAtPiBzVFcKLSAqCXNDTCAtPiBzQ0wKLSAqLwotLyogCSAgICAgc05PLCBzU1MsIHNTUiwgc0VTLCBzRlcsIHNDVywgc0xBLCBzVFcsIHNDTCwgc0xJCSovCi0vKmFjayovCSAgIHsgc0VTLCBzSVYsIHNFUywgc0VTLCBzQ1csIHNDVywgc1RXLCBzVFcsIHNDTCwgc0lWIH0sCi0vKgotICoJc05PIC0+IHNFUwlBc3N1bWVkLgotICoJc1NTIC0+IHNJVglBQ0sgaXMgaW52YWxpZDogd2UgaGF2ZW4ndCBzZWVuIGEgU1lOL0FDSyB5ZXQuCi0gKglzU1IgLT4gc0VTCUVzdGFibGlzaGVkIHN0YXRlIGlzIHJlYWNoZWQuCi0gKglzRVMgLT4gc0VTCTotKQotICoJc0ZXIC0+IHNDVwlOb3JtYWwgY2xvc2UgcmVxdWVzdCBhbnN3ZXJlZCBieSBBQ0suCi0gKglzQ1cgLT4gc0NXCi0gKglzTEEgLT4gc1RXCUxhc3QgQUNLIGRldGVjdGVkLgotICoJc1RXIC0+IHNUVwlSZXRyYW5zbWl0dGVkIGxhc3QgQUNLLiBSZW1haW4gaW4gdGhlIHNhbWUgc3RhdGUuCi0gKglzQ0wgLT4gc0NMCi0gKi8KLS8qIAkgICAgIHNOTywgc1NTLCBzU1IsIHNFUywgc0ZXLCBzQ1csIHNMQSwgc1RXLCBzQ0wsIHNMSQkqLwotLypyc3QqLyAgICB7IHNJViwgc0NMLCBzQ0wsIHNDTCwgc0NMLCBzQ0wsIHNDTCwgc0NMLCBzQ0wsIHNJViB9LAotLypub25lKi8gICB7IHNJViwgc0lWLCBzSVYsIHNJViwgc0lWLCBzSVYsIHNJViwgc0lWLCBzSVYsIHNJViB9Ci0JfSwKLQl7Ci0vKiBSRVBMWSAqLwotLyogCSAgICAgc05PLCBzU1MsIHNTUiwgc0VTLCBzRlcsIHNDVywgc0xBLCBzVFcsIHNDTCwgc0xJCSovCi0vKnN5biovCSAgIHsgc0lWLCBzSVYsIHNJViwgc0lWLCBzSVYsIHNJViwgc0lWLCBzSVYsIHNJViwgc0lWIH0sCi0vKgotICoJc05PIC0+IHNJVglOZXZlciByZWFjaGVkLgotICoJc1NTIC0+IHNJVglTaW11bHRhbmVvdXMgb3Blbiwgbm90IHN1cHBvcnRlZAotICoJc1NSIC0+IHNJVglTaW11bHRhbmVvdXMgb3Blbiwgbm90IHN1cHBvcnRlZC4KLSAqCXNFUyAtPiBzSVYJU2VydmVyIG1heSBub3QgaW5pdGlhdGUgYSBjb25uZWN0aW9uLgotICoJc0ZXIC0+IHNJVgotICoJc0NXIC0+IHNJVgotICoJc0xBIC0+IHNJVgotICoJc1RXIC0+IHNJVglSZW9wZW5lZCBjb25uZWN0aW9uLCBidXQgc2VydmVyIG1heSBub3QgZG8gaXQuCi0gKglzQ0wgLT4gc0lWCi0gKi8KLS8qIAkgICAgIHNOTywgc1NTLCBzU1IsIHNFUywgc0ZXLCBzQ1csIHNMQSwgc1RXLCBzQ0wsIHNMSQkqLwotLypzeW5hY2sqLyB7IHNJViwgc1NSLCBzU1IsIHNJRywgc0lHLCBzSUcsIHNJRywgc0lHLCBzSUcsIHNJViB9LAotLyoKLSAqCXNTUyAtPiBzU1IJU3RhbmRhcmQgb3Blbi4KLSAqCXNTUiAtPiBzU1IJUmV0cmFuc21pdHRlZCBTWU4vQUNLLgotICoJc0VTIC0+IHNJRwlMYXRlIHJldHJhbnNtaXR0ZWQgU1lOL0FDSz8KLSAqCXNGVyAtPiBzSUcJTWlnaHQgYmUgU1lOL0FDSyBhbnN3ZXJpbmcgaWdub3JlZCBTWU4KLSAqCXNDVyAtPiBzSUcKLSAqCXNMQSAtPiBzSUcKLSAqCXNUVyAtPiBzSUcKLSAqCXNDTCAtPiBzSUcKLSAqLwotLyogCSAgICAgc05PLCBzU1MsIHNTUiwgc0VTLCBzRlcsIHNDVywgc0xBLCBzVFcsIHNDTCwgc0xJCSovCi0vKmZpbiovICAgIHsgc0lWLCBzSVYsIHNGVywgc0ZXLCBzTEEsIHNMQSwgc0xBLCBzVFcsIHNDTCwgc0lWIH0sCi0vKgotICoJc1NTIC0+IHNJVglTZXJ2ZXIgbWlnaHQgbm90IHNlbmQgRklOIGluIHRoaXMgc3RhdGUuCi0gKglzU1IgLT4gc0ZXCUNsb3NlIHN0YXJ0ZWQuCi0gKglzRVMgLT4gc0ZXCi0gKglzRlcgLT4gc0xBCUZJTiBzZWVuIGluIGJvdGggZGlyZWN0aW9ucy4KLSAqCXNDVyAtPiBzTEEKLSAqCXNMQSAtPiBzTEEJUmV0cmFuc21pdHRlZCBGSU4uCi0gKglzVFcgLT4gc1RXCi0gKglzQ0wgLT4gc0NMCi0gKi8KLS8qIAkgICAgIHNOTywgc1NTLCBzU1IsIHNFUywgc0ZXLCBzQ1csIHNMQSwgc1RXLCBzQ0wsIHNMSQkqLwotLyphY2sqLwkgICB7IHNJViwgc0lHLCBzU1IsIHNFUywgc0NXLCBzQ1csIHNUVywgc1RXLCBzQ0wsIHNJViB9LAotLyoKLSAqCXNTUyAtPiBzSUcJTWlnaHQgYmUgYSBoYWxmLW9wZW4gY29ubmVjdGlvbi4KLSAqCXNTUiAtPiBzU1IJTWlnaHQgYW5zd2VyIGxhdGUgcmVzZW50IFNZTi4KLSAqCXNFUyAtPiBzRVMJOi0pCi0gKglzRlcgLT4gc0NXCU5vcm1hbCBjbG9zZSByZXF1ZXN0IGFuc3dlcmVkIGJ5IEFDSy4KLSAqCXNDVyAtPiBzQ1cKLSAqCXNMQSAtPiBzVFcJTGFzdCBBQ0sgZGV0ZWN0ZWQuCi0gKglzVFcgLT4gc1RXCVJldHJhbnNtaXR0ZWQgbGFzdCBBQ0suCi0gKglzQ0wgLT4gc0NMCi0gKi8KLS8qIAkgICAgIHNOTywgc1NTLCBzU1IsIHNFUywgc0ZXLCBzQ1csIHNMQSwgc1RXLCBzQ0wsIHNMSQkqLwotLypyc3QqLyAgICB7IHNJViwgc0NMLCBzQ0wsIHNDTCwgc0NMLCBzQ0wsIHNDTCwgc0NMLCBzQ0wsIHNJViB9LAotLypub25lKi8gICB7IHNJViwgc0lWLCBzSVYsIHNJViwgc0lWLCBzSVYsIHNJViwgc0lWLCBzSVYsIHNJViB9Ci0JfQotfTsKLQotc3RhdGljIGludCB0Y3BfcGt0X3RvX3R1cGxlKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0JCQkgICAgdW5zaWduZWQgaW50IGRhdGFvZmYsCi0JCQkgICAgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUpCi17Ci0Jc3RydWN0IHRjcGhkciBfaGRyLCAqaHA7Ci0KLQkvKiBBY3R1YWxseSBvbmx5IG5lZWQgZmlyc3QgOCBieXRlcy4gKi8KLQlocCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIGRhdGFvZmYsIDgsICZfaGRyKTsKLQlpZiAoaHAgPT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0KLQl0dXBsZS0+c3JjLnUudGNwLnBvcnQgPSBocC0+c291cmNlOwotCXR1cGxlLT5kc3QudS50Y3AucG9ydCA9IGhwLT5kZXN0OwotCi0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgdGNwX2ludmVydF90dXBsZShzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0dXBsZSwKLQkJCSAgICBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICpvcmlnKQotewotCXR1cGxlLT5zcmMudS50Y3AucG9ydCA9IG9yaWctPmRzdC51LnRjcC5wb3J0OwotCXR1cGxlLT5kc3QudS50Y3AucG9ydCA9IG9yaWctPnNyYy51LnRjcC5wb3J0OwotCXJldHVybiAxOwotfQotCi0vKiBQcmludCBvdXQgdGhlIHBlci1wcm90b2NvbCBwYXJ0IG9mIHRoZSB0dXBsZS4gKi8KLXN0YXRpYyBpbnQgdGNwX3ByaW50X3R1cGxlKHN0cnVjdCBzZXFfZmlsZSAqcywKLQkJCSAgIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnR1cGxlKQotewotCXJldHVybiBzZXFfcHJpbnRmKHMsICJzcG9ydD0laHUgZHBvcnQ9JWh1ICIsCi0JCQkgIG50b2hzKHR1cGxlLT5zcmMudS50Y3AucG9ydCksCi0JCQkgIG50b2hzKHR1cGxlLT5kc3QudS50Y3AucG9ydCkpOwotfQotCi0vKiBQcmludCBvdXQgdGhlIHByaXZhdGUgcGFydCBvZiB0aGUgY29ubnRyYWNrLiAqLwotc3RhdGljIGludCB0Y3BfcHJpbnRfY29ubnRyYWNrKHN0cnVjdCBzZXFfZmlsZSAqcywKLQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjb25udHJhY2spCi17Ci0JZW51bSB0Y3BfY29ubnRyYWNrIHN0YXRlOwotCi0JcmVhZF9sb2NrX2JoKCZ0Y3BfbG9jayk7Ci0Jc3RhdGUgPSBjb25udHJhY2stPnByb3RvLnRjcC5zdGF0ZTsKLQlyZWFkX3VubG9ja19iaCgmdGNwX2xvY2spOwotCi0JcmV0dXJuIHNlcV9wcmludGYocywgIiVzICIsIHRjcF9jb25udHJhY2tfbmFtZXNbc3RhdGVdKTsKLX0KLQotI2lmIGRlZmluZWQoQ09ORklHX0lQX05GX0NPTk5UUkFDS19ORVRMSU5LKSB8fCBcCi0gICAgZGVmaW5lZChDT05GSUdfSVBfTkZfQ09OTlRSQUNLX05FVExJTktfTU9EVUxFKQotc3RhdGljIGludCB0Y3BfdG9fbmZhdHRyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZmF0dHIgKm5mYSwKLQkJCSBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCkKLXsKLQlzdHJ1Y3QgbmZhdHRyICpuZXN0X3Bhcm1zOwotCi0JcmVhZF9sb2NrX2JoKCZ0Y3BfbG9jayk7Ci0JbmVzdF9wYXJtcyA9IE5GQV9ORVNUKHNrYiwgQ1RBX1BST1RPSU5GT19UQ1ApOwotCU5GQV9QVVQoc2tiLCBDVEFfUFJPVE9JTkZPX1RDUF9TVEFURSwgc2l6ZW9mKHVfaW50OF90KSwKLQkJJmN0LT5wcm90by50Y3Auc3RhdGUpOwotCXJlYWRfdW5sb2NrX2JoKCZ0Y3BfbG9jayk7Ci0KLQlORkFfTkVTVF9FTkQoc2tiLCBuZXN0X3Bhcm1zKTsKLQotCXJldHVybiAwOwotCi1uZmF0dHJfZmFpbHVyZToKLQlyZWFkX3VubG9ja19iaCgmdGNwX2xvY2spOwotCXJldHVybiAtMTsKLX0KLQotc3RhdGljIGNvbnN0IHNpemVfdCBjdGFfbWluX3RjcFtDVEFfUFJPVE9JTkZPX1RDUF9NQVhdID0gewotCVtDVEFfUFJPVE9JTkZPX1RDUF9TVEFURS0xXQk9IHNpemVvZih1X2ludDhfdCksCi19OwotCi1zdGF0aWMgaW50IG5mYXR0cl90b190Y3Aoc3RydWN0IG5mYXR0ciAqY2RhW10sIHN0cnVjdCBpcF9jb25udHJhY2sgKmN0KQotewotCXN0cnVjdCBuZmF0dHIgKmF0dHIgPSBjZGFbQ1RBX1BST1RPSU5GT19UQ1AtMV07Ci0Jc3RydWN0IG5mYXR0ciAqdGJbQ1RBX1BST1RPSU5GT19UQ1BfTUFYXTsKLQotCS8qIHVwZGF0ZXMgY291bGQgbm90IGNvbnRhaW4gYW55dGhpbmcgYWJvdXQgdGhlIHByaXZhdGUKLQkgKiBwcm90b2NvbCBpbmZvLCBpbiB0aGF0IGNhc2Ugc2tpcCB0aGUgcGFyc2luZyAqLwotCWlmICghYXR0cikKLQkJcmV0dXJuIDA7Ci0KLQluZmF0dHJfcGFyc2VfbmVzdGVkKHRiLCBDVEFfUFJPVE9JTkZPX1RDUF9NQVgsIGF0dHIpOwotCi0JaWYgKG5mYXR0cl9iYWRfc2l6ZSh0YiwgQ1RBX1BST1RPSU5GT19UQ1BfTUFYLCBjdGFfbWluX3RjcCkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKCF0YltDVEFfUFJPVE9JTkZPX1RDUF9TVEFURS0xXSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQl3cml0ZV9sb2NrX2JoKCZ0Y3BfbG9jayk7Ci0JY3QtPnByb3RvLnRjcC5zdGF0ZSA9Ci0JCSoodV9pbnQ4X3QgKilORkFfREFUQSh0YltDVEFfUFJPVE9JTkZPX1RDUF9TVEFURS0xXSk7Ci0Jd3JpdGVfdW5sb2NrX2JoKCZ0Y3BfbG9jayk7Ci0KLQlyZXR1cm4gMDsKLX0KLSNlbmRpZgotCi1zdGF0aWMgdW5zaWduZWQgaW50IGdldF9jb25udHJhY2tfaW5kZXgoY29uc3Qgc3RydWN0IHRjcGhkciAqdGNwaCkKLXsKLQlpZiAodGNwaC0+cnN0KSByZXR1cm4gVENQX1JTVF9TRVQ7Ci0JZWxzZSBpZiAodGNwaC0+c3luKSByZXR1cm4gKHRjcGgtPmFjayA/IFRDUF9TWU5BQ0tfU0VUIDogVENQX1NZTl9TRVQpOwotCWVsc2UgaWYgKHRjcGgtPmZpbikgcmV0dXJuIFRDUF9GSU5fU0VUOwotCWVsc2UgaWYgKHRjcGgtPmFjaykgcmV0dXJuIFRDUF9BQ0tfU0VUOwotCWVsc2UgcmV0dXJuIFRDUF9OT05FX1NFVDsKLX0KLQotLyogVENQIGNvbm5lY3Rpb24gdHJhY2tpbmcgYmFzZWQgb24gJ1JlYWwgU3RhdGVmdWwgVENQIFBhY2tldCBGaWx0ZXJpbmcKLSAgIGluIElQIEZpbHRlcicgYnkgR3VpZG8gdmFuIFJvb2lqLgotCi0gICBodHRwOi8vd3d3Lm5sdXVnLm5sL2V2ZW50cy9zYW5lMjAwMC9wYXBlcnMuaHRtbAotICAgaHR0cDovL3d3dy5pYWUubmwvdXNlcnMvZ3VpZG8vcGFwZXJzL3RjcF9maWx0ZXJpbmcucHMuZ3oKLQotICAgVGhlIGJvdW5kYXJpZXMgYW5kIHRoZSBjb25kaXRpb25zIGFyZSBjaGFuZ2VkIGFjY29yZGluZyB0byBSRkM3OTM6Ci0gICB0aGUgcGFja2V0IG11c3QgaW50ZXJzZWN0IHRoZSB3aW5kb3cgKGkuZS4gc2VnbWVudHMgbWF5IGJlCi0gICBhZnRlciB0aGUgcmlnaHQgb3IgYmVmb3JlIHRoZSBsZWZ0IGVkZ2UpIGFuZCB0aHVzIHJlY2VpdmVycyBtYXkgQUNLCi0gICBzZWdtZW50cyBhZnRlciB0aGUgcmlnaHQgZWRnZSBvZiB0aGUgd2luZG93LgotCi0JdGRfbWF4ZW5kID0gbWF4KHNhY2sgKyBtYXgod2luLDEpKSBzZWVuIGluIHJlcGx5IHBhY2tldHMKLQl0ZF9tYXh3aW4gPSBtYXgobWF4KHdpbiwgMSkpICsgKHNhY2sgLSBhY2spIHNlZW4gaW4gc2VudCBwYWNrZXRzCi0JdGRfbWF4d2luICs9IHNlcSArIGxlbiAtIHNlbmRlci50ZF9tYXhlbmQKLQkJCWlmIHNlcSArIGxlbiA+IHNlbmRlci50ZF9tYXhlbmQKLQl0ZF9lbmQgICAgPSBtYXgoc2VxICsgbGVuKSBzZWVuIGluIHNlbnQgcGFja2V0cwotCi0gICBJLiAgIFVwcGVyIGJvdW5kIGZvciB2YWxpZCBkYXRhOglzZXEgPD0gc2VuZGVyLnRkX21heGVuZAotICAgSUkuICBMb3dlciBib3VuZCBmb3IgdmFsaWQgZGF0YToJc2VxICsgbGVuID49IHNlbmRlci50ZF9lbmQgLSByZWNlaXZlci50ZF9tYXh3aW4KLSAgIElJSS4JVXBwZXIgYm91bmQgZm9yIHZhbGlkIGFjazogICAgICBzYWNrIDw9IHJlY2VpdmVyLnRkX2VuZAotICAgSVYuCUxvd2VyIGJvdW5kIGZvciB2YWxpZCBhY2s6CWFjayA+PSByZWNlaXZlci50ZF9lbmQgLSBNQVhBQ0tXSU5ET1cKLQotICAgd2hlcmUgc2FjayBpcyB0aGUgaGlnaGVzdCByaWdodCBlZGdlIG9mIHNhY2sgYmxvY2sgZm91bmQgaW4gdGhlIHBhY2tldC4KLQotICAgVGhlIHVwcGVyIGJvdW5kIGxpbWl0IGZvciBhIHZhbGlkIGFjayBpcyBub3QgaWdub3JlZCAtCi0gICB3ZSBkb2Vzbid0IGhhdmUgdG8gZGVhbCB3aXRoIGZyYWdtZW50cy4KLSovCi0KLXN0YXRpYyBpbmxpbmUgX191MzIgc2VnbWVudF9zZXFfcGx1c19sZW4oX191MzIgc2VxLAotCQkJCQkgc2l6ZV90IGxlbiwKLQkJCQkJIHN0cnVjdCBpcGhkciAqaXBoLAotCQkJCQkgc3RydWN0IHRjcGhkciAqdGNwaCkKLXsKLQlyZXR1cm4gKHNlcSArIGxlbiAtIChpcGgtPmlobCArIHRjcGgtPmRvZmYpKjQKLQkJKyAodGNwaC0+c3luID8gMSA6IDApICsgKHRjcGgtPmZpbiA/IDEgOiAwKSk7Ci19Ci0KLS8qIEZpeG1lOiB3aGF0IGFib3V0IGJpZyBwYWNrZXRzPyAqLwotI2RlZmluZSBNQVhBQ0tXSU5DT05TVAkJCTY2MDAwCi0jZGVmaW5lIE1BWEFDS1dJTkRPVyhzZW5kZXIpCQkJCQkJXAotCSgoc2VuZGVyKS0+dGRfbWF4d2luID4gTUFYQUNLV0lOQ09OU1QgPyAoc2VuZGVyKS0+dGRfbWF4d2luCVwKLQkJCQkJICAgICAgOiBNQVhBQ0tXSU5DT05TVCkKLQotLyoKLSAqIFNpbXBsaWZpZWQgdGNwX3BhcnNlX29wdGlvbnMgcm91dGluZSBmcm9tIHRjcF9pbnB1dC5jCi0gKi8KLXN0YXRpYyB2b2lkIHRjcF9vcHRpb25zKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0JCQlzdHJ1Y3QgaXBoZHIgKmlwaCwKLQkJCXN0cnVjdCB0Y3BoZHIgKnRjcGgsCi0JCQlzdHJ1Y3QgaXBfY3RfdGNwX3N0YXRlICpzdGF0ZSkKLXsKLQl1bnNpZ25lZCBjaGFyIGJ1ZmZbKDE1ICogNCkgLSBzaXplb2Yoc3RydWN0IHRjcGhkcildOwotCXVuc2lnbmVkIGNoYXIgKnB0cjsKLQlpbnQgbGVuZ3RoID0gKHRjcGgtPmRvZmYqNCkgLSBzaXplb2Yoc3RydWN0IHRjcGhkcik7Ci0KLQlpZiAoIWxlbmd0aCkKLQkJcmV0dXJuOwotCi0JcHRyID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwKLQkJCQkgKGlwaC0+aWhsICogNCkgKyBzaXplb2Yoc3RydWN0IHRjcGhkciksCi0JCQkJIGxlbmd0aCwgYnVmZik7Ci0JQlVHX09OKHB0ciA9PSBOVUxMKTsKLQotCXN0YXRlLT50ZF9zY2FsZSA9Ci0Jc3RhdGUtPmZsYWdzID0gMDsKLQotCXdoaWxlIChsZW5ndGggPiAwKSB7Ci0JCWludCBvcGNvZGU9KnB0cisrOwotCQlpbnQgb3BzaXplOwotCi0JCXN3aXRjaCAob3Bjb2RlKSB7Ci0JCWNhc2UgVENQT1BUX0VPTDoKLQkJCXJldHVybjsKLQkJY2FzZSBUQ1BPUFRfTk9QOgkvKiBSZWY6IFJGQyA3OTMgc2VjdGlvbiAzLjEgKi8KLQkJCWxlbmd0aC0tOwotCQkJY29udGludWU7Ci0JCWRlZmF1bHQ6Ci0JCQlvcHNpemU9KnB0cisrOwotCQkJaWYgKG9wc2l6ZSA8IDIpIC8qICJzaWxseSBvcHRpb25zIiAqLwotCQkJCXJldHVybjsKLQkJCWlmIChvcHNpemUgPiBsZW5ndGgpCi0JCQkJYnJlYWs7CS8qIGRvbid0IHBhcnNlIHBhcnRpYWwgb3B0aW9ucyAqLwotCi0JCQlpZiAob3Bjb2RlID09IFRDUE9QVF9TQUNLX1BFUk0KLQkJCSAgICAmJiBvcHNpemUgPT0gVENQT0xFTl9TQUNLX1BFUk0pCi0JCQkJc3RhdGUtPmZsYWdzIHw9IElQX0NUX1RDUF9GTEFHX1NBQ0tfUEVSTTsKLQkJCWVsc2UgaWYgKG9wY29kZSA9PSBUQ1BPUFRfV0lORE9XCi0JCQkJICYmIG9wc2l6ZSA9PSBUQ1BPTEVOX1dJTkRPVykgewotCQkJCXN0YXRlLT50ZF9zY2FsZSA9ICoodV9pbnQ4X3QgKilwdHI7Ci0KLQkJCQlpZiAoc3RhdGUtPnRkX3NjYWxlID4gMTQpIHsKLQkJCQkJLyogU2VlIFJGQzEzMjMgKi8KLQkJCQkJc3RhdGUtPnRkX3NjYWxlID0gMTQ7Ci0JCQkJfQotCQkJCXN0YXRlLT5mbGFncyB8PQotCQkJCQlJUF9DVF9UQ1BfRkxBR19XSU5ET1dfU0NBTEU7Ci0JCQl9Ci0JCQlwdHIgKz0gb3BzaXplIC0gMjsKLQkJCWxlbmd0aCAtPSBvcHNpemU7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHRjcF9zYWNrKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0JCSAgICAgc3RydWN0IGlwaGRyICppcGgsCi0JCSAgICAgc3RydWN0IHRjcGhkciAqdGNwaCwKLQkJICAgICBfX3UzMiAqc2FjaykKLXsKLQl1bnNpZ25lZCBjaGFyIGJ1ZmZbKDE1ICogNCkgLSBzaXplb2Yoc3RydWN0IHRjcGhkcildOwotCXVuc2lnbmVkIGNoYXIgKnB0cjsKLQlpbnQgbGVuZ3RoID0gKHRjcGgtPmRvZmYqNCkgLSBzaXplb2Yoc3RydWN0IHRjcGhkcik7Ci0JX191MzIgdG1wOwotCi0JaWYgKCFsZW5ndGgpCi0JCXJldHVybjsKLQotCXB0ciA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsCi0JCQkJIChpcGgtPmlobCAqIDQpICsgc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpLAotCQkJCSBsZW5ndGgsIGJ1ZmYpOwotCUJVR19PTihwdHIgPT0gTlVMTCk7Ci0KLQkvKiBGYXN0IHBhdGggZm9yIHRpbWVzdGFtcC1vbmx5IG9wdGlvbiAqLwotCWlmIChsZW5ndGggPT0gVENQT0xFTl9UU1RBTVBfQUxJR05FRCo0Ci0JICAgICYmICooX19iZTMyICopcHRyID09Ci0JCV9fY29uc3RhbnRfaHRvbmwoKFRDUE9QVF9OT1AgPDwgMjQpCi0JCQkJIHwgKFRDUE9QVF9OT1AgPDwgMTYpCi0JCQkJIHwgKFRDUE9QVF9USU1FU1RBTVAgPDwgOCkKLQkJCQkgfCBUQ1BPTEVOX1RJTUVTVEFNUCkpCi0JCXJldHVybjsKLQotCXdoaWxlIChsZW5ndGggPiAwKSB7Ci0JCWludCBvcGNvZGU9KnB0cisrOwotCQlpbnQgb3BzaXplLCBpOwotCi0JCXN3aXRjaCAob3Bjb2RlKSB7Ci0JCWNhc2UgVENQT1BUX0VPTDoKLQkJCXJldHVybjsKLQkJY2FzZSBUQ1BPUFRfTk9QOgkvKiBSZWY6IFJGQyA3OTMgc2VjdGlvbiAzLjEgKi8KLQkJCWxlbmd0aC0tOwotCQkJY29udGludWU7Ci0JCWRlZmF1bHQ6Ci0JCQlvcHNpemU9KnB0cisrOwotCQkJaWYgKG9wc2l6ZSA8IDIpIC8qICJzaWxseSBvcHRpb25zIiAqLwotCQkJCXJldHVybjsKLQkJCWlmIChvcHNpemUgPiBsZW5ndGgpCi0JCQkJYnJlYWs7CS8qIGRvbid0IHBhcnNlIHBhcnRpYWwgb3B0aW9ucyAqLwotCi0JCQlpZiAob3Bjb2RlID09IFRDUE9QVF9TQUNLCi0JCQkgICAgJiYgb3BzaXplID49IChUQ1BPTEVOX1NBQ0tfQkFTRQotCQkJCQkgICsgVENQT0xFTl9TQUNLX1BFUkJMT0NLKQotCQkJICAgICYmICEoKG9wc2l6ZSAtIFRDUE9MRU5fU0FDS19CQVNFKQotCQkJCSAlIFRDUE9MRU5fU0FDS19QRVJCTE9DSykpIHsKLQkJCQlmb3IgKGkgPSAwOwotCQkJCSAgICAgaSA8IChvcHNpemUgLSBUQ1BPTEVOX1NBQ0tfQkFTRSk7Ci0JCQkJICAgICBpICs9IFRDUE9MRU5fU0FDS19QRVJCTE9DSykgewotCQkJCQl0bXAgPSBudG9obCgqKChfX2JlMzIgKikocHRyK2kpKzEpKTsKLQotCQkJCQlpZiAoYWZ0ZXIodG1wLCAqc2FjaykpCi0JCQkJCQkqc2FjayA9IHRtcDsKLQkJCQl9Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJcHRyICs9IG9wc2l6ZSAtIDI7Ci0JCQlsZW5ndGggLT0gb3BzaXplOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgaW50IHRjcF9pbl93aW5kb3coc3RydWN0IGlwX2N0X3RjcCAqc3RhdGUsCi0JCQkgZW51bSBpcF9jb25udHJhY2tfZGlyIGRpciwKLQkJCSB1bnNpZ25lZCBpbnQgaW5kZXgsCi0JCQkgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCSBzdHJ1Y3QgaXBoZHIgKmlwaCwKLQkJCSBzdHJ1Y3QgdGNwaGRyICp0Y3BoKQotewotCXN0cnVjdCBpcF9jdF90Y3Bfc3RhdGUgKnNlbmRlciA9ICZzdGF0ZS0+c2VlbltkaXJdOwotCXN0cnVjdCBpcF9jdF90Y3Bfc3RhdGUgKnJlY2VpdmVyID0gJnN0YXRlLT5zZWVuWyFkaXJdOwotCV9fdTMyIHNlcSwgYWNrLCBzYWNrLCBlbmQsIHdpbiwgc3dpbjsKLQlpbnQgcmVzOwotCi0JLyoKLQkgKiBHZXQgdGhlIHJlcXVpcmVkIGRhdGEgZnJvbSB0aGUgcGFja2V0LgotCSAqLwotCXNlcSA9IG50b2hsKHRjcGgtPnNlcSk7Ci0JYWNrID0gc2FjayA9IG50b2hsKHRjcGgtPmFja19zZXEpOwotCXdpbiA9IG50b2hzKHRjcGgtPndpbmRvdyk7Ci0JZW5kID0gc2VnbWVudF9zZXFfcGx1c19sZW4oc2VxLCBza2ItPmxlbiwgaXBoLCB0Y3BoKTsKLQotCWlmIChyZWNlaXZlci0+ZmxhZ3MgJiBJUF9DVF9UQ1BfRkxBR19TQUNLX1BFUk0pCi0JCXRjcF9zYWNrKHNrYiwgaXBoLCB0Y3BoLCAmc2Fjayk7Ci0KLQlERUJVR1AoInRjcF9pbl93aW5kb3c6IFNUQVJUXG4iKTsKLQlERUJVR1AoInRjcF9pbl93aW5kb3c6IHNyYz0ldS4ldS4ldS4ldTolaHUgZHN0PSV1LiV1LiV1LiV1OiVodSAiCi0JICAgICAgICJzZXE9JXUgYWNrPSV1IHNhY2s9JXUgd2luPSV1IGVuZD0ldVxuIiwKLQkJTklQUVVBRChpcGgtPnNhZGRyKSwgbnRvaHModGNwaC0+c291cmNlKSwKLQkJTklQUVVBRChpcGgtPmRhZGRyKSwgbnRvaHModGNwaC0+ZGVzdCksCi0JCXNlcSwgYWNrLCBzYWNrLCB3aW4sIGVuZCk7Ci0JREVCVUdQKCJ0Y3BfaW5fd2luZG93OiBzZW5kZXIgZW5kPSV1IG1heGVuZD0ldSBtYXh3aW49JXUgc2NhbGU9JWkgIgotCSAgICAgICAicmVjZWl2ZXIgZW5kPSV1IG1heGVuZD0ldSBtYXh3aW49JXUgc2NhbGU9JWlcbiIsCi0JCXNlbmRlci0+dGRfZW5kLCBzZW5kZXItPnRkX21heGVuZCwgc2VuZGVyLT50ZF9tYXh3aW4sCi0JCXNlbmRlci0+dGRfc2NhbGUsCi0JCXJlY2VpdmVyLT50ZF9lbmQsIHJlY2VpdmVyLT50ZF9tYXhlbmQsIHJlY2VpdmVyLT50ZF9tYXh3aW4sCi0JCXJlY2VpdmVyLT50ZF9zY2FsZSk7Ci0KLQlpZiAoc2VuZGVyLT50ZF9lbmQgPT0gMCkgewotCQkvKgotCQkgKiBJbml0aWFsaXplIHNlbmRlciBkYXRhLgotCQkgKi8KLQkJaWYgKHRjcGgtPnN5biAmJiB0Y3BoLT5hY2spIHsKLQkJCS8qCi0JCQkgKiBPdXRnb2luZyBTWU4tQUNLIGluIHJlcGx5IHRvIGEgU1lOLgotCQkJICovCi0JCQlzZW5kZXItPnRkX2VuZCA9Ci0JCQlzZW5kZXItPnRkX21heGVuZCA9IGVuZDsKLQkJCXNlbmRlci0+dGRfbWF4d2luID0gKHdpbiA9PSAwID8gMSA6IHdpbik7Ci0KLQkJCXRjcF9vcHRpb25zKHNrYiwgaXBoLCB0Y3BoLCBzZW5kZXIpOwotCQkJLyoKLQkJCSAqIFJGQyAxMzIzOgotCQkJICogQm90aCBzaWRlcyBtdXN0IHNlbmQgdGhlIFdpbmRvdyBTY2FsZSBvcHRpb24KLQkJCSAqIHRvIGVuYWJsZSB3aW5kb3cgc2NhbGluZyBpbiBlaXRoZXIgZGlyZWN0aW9uLgotCQkJICovCi0JCQlpZiAoIShzZW5kZXItPmZsYWdzICYgSVBfQ1RfVENQX0ZMQUdfV0lORE9XX1NDQUxFCi0JCQkgICAgICAmJiByZWNlaXZlci0+ZmxhZ3MgJiBJUF9DVF9UQ1BfRkxBR19XSU5ET1dfU0NBTEUpKQotCQkJCXNlbmRlci0+dGRfc2NhbGUgPQotCQkJCXJlY2VpdmVyLT50ZF9zY2FsZSA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQkvKgotCQkJICogV2UgYXJlIGluIHRoZSBtaWRkbGUgb2YgYSBjb25uZWN0aW9uLAotCQkJICogaXRzIGhpc3RvcnkgaXMgbG9zdCBmb3IgdXMuCi0JCQkgKiBMZXQncyB0cnkgdG8gdXNlIHRoZSBkYXRhIGZyb20gdGhlIHBhY2tldC4KLQkJCSAqLwotCQkJc2VuZGVyLT50ZF9lbmQgPSBlbmQ7Ci0JCQlzZW5kZXItPnRkX21heHdpbiA9ICh3aW4gPT0gMCA/IDEgOiB3aW4pOwotCQkJc2VuZGVyLT50ZF9tYXhlbmQgPSBlbmQgKyBzZW5kZXItPnRkX21heHdpbjsKLQkJfQotCX0gZWxzZSBpZiAoKChzdGF0ZS0+c3RhdGUgPT0gVENQX0NPTk5UUkFDS19TWU5fU0VOVAotCQkgICAgICYmIGRpciA9PSBJUF9DVF9ESVJfT1JJR0lOQUwpCi0JCSAgICB8fCAoc3RhdGUtPnN0YXRlID09IFRDUF9DT05OVFJBQ0tfU1lOX1JFQ1YKLQkJCSYmIGRpciA9PSBJUF9DVF9ESVJfUkVQTFkpKQotCQkgICAgJiYgYWZ0ZXIoZW5kLCBzZW5kZXItPnRkX2VuZCkpIHsKLQkJLyoKLQkJICogUkZDIDc5MzogImlmIGEgVENQIGlzIHJlaW5pdGlhbGl6ZWQgLi4uIHRoZW4gaXQgbmVlZAotCQkgKiBub3Qgd2FpdCBhdCBhbGw7IGl0IG11c3Qgb25seSBiZSBzdXJlIHRvIHVzZSBzZXF1ZW5jZQotCQkgKiBudW1iZXJzIGxhcmdlciB0aGFuIHRob3NlIHJlY2VudGx5IHVzZWQuIgotCQkgKi8KLQkJc2VuZGVyLT50ZF9lbmQgPQotCQlzZW5kZXItPnRkX21heGVuZCA9IGVuZDsKLQkJc2VuZGVyLT50ZF9tYXh3aW4gPSAod2luID09IDAgPyAxIDogd2luKTsKLQotCQl0Y3Bfb3B0aW9ucyhza2IsIGlwaCwgdGNwaCwgc2VuZGVyKTsKLQl9Ci0KLQlpZiAoISh0Y3BoLT5hY2spKSB7Ci0JCS8qCi0JCSAqIElmIHRoZXJlIGlzIG5vIEFDSywganVzdCBwcmV0ZW5kIGl0IHdhcyBzZXQgYW5kIE9LLgotCQkgKi8KLQkJYWNrID0gc2FjayA9IHJlY2VpdmVyLT50ZF9lbmQ7Ci0JfSBlbHNlIGlmICgoKHRjcF9mbGFnX3dvcmQodGNwaCkgJiAoVENQX0ZMQUdfQUNLfFRDUF9GTEFHX1JTVCkpID09Ci0JCSAgICAoVENQX0ZMQUdfQUNLfFRDUF9GTEFHX1JTVCkpCi0JCSAgICYmIChhY2sgPT0gMCkpIHsKLQkJLyoKLQkJICogQnJva2VuIFRDUCBzdGFja3MsIHRoYXQgc2V0IEFDSyBpbiBSU1QgcGFja2V0cyBhcyB3ZWxsCi0JCSAqIHdpdGggemVybyBhY2sgdmFsdWUuCi0JCSAqLwotCQlhY2sgPSBzYWNrID0gcmVjZWl2ZXItPnRkX2VuZDsKLQl9Ci0KLQlpZiAoc2VxID09IGVuZAotCSAgICAmJiAoIXRjcGgtPnJzdAotCQl8fCAoc2VxID09IDAgJiYgc3RhdGUtPnN0YXRlID09IFRDUF9DT05OVFJBQ0tfU1lOX1NFTlQpKSkKLQkJLyoKLQkJICogUGFja2V0cyBjb250YWlucyBubyBkYXRhOiB3ZSBhc3N1bWUgaXQgaXMgdmFsaWQKLQkJICogYW5kIGNoZWNrIHRoZSBhY2sgdmFsdWUgb25seS4KLQkJICogSG93ZXZlciBSU1Qgc2VnbWVudHMgYXJlIGFsd2F5cyB2YWxpZGF0ZWQgYnkgdGhlaXIKLQkJICogU0VRIG51bWJlciwgZXhjZXB0IHdoZW4gc2VxID09IDAgKHJlc2V0IHNlbnQgYW5zd2VyaW5nCi0JCSAqIFNZTi4KLQkJICovCi0JCXNlcSA9IGVuZCA9IHNlbmRlci0+dGRfZW5kOwotCi0JREVCVUdQKCJ0Y3BfaW5fd2luZG93OiBzcmM9JXUuJXUuJXUuJXU6JWh1IGRzdD0ldS4ldS4ldS4ldTolaHUgIgotCSAgICAgICAic2VxPSV1IGFjaz0ldSBzYWNrID0ldSB3aW49JXUgZW5kPSV1XG4iLAotCQlOSVBRVUFEKGlwaC0+c2FkZHIpLCBudG9ocyh0Y3BoLT5zb3VyY2UpLAotCQlOSVBRVUFEKGlwaC0+ZGFkZHIpLCBudG9ocyh0Y3BoLT5kZXN0KSwKLQkJc2VxLCBhY2ssIHNhY2ssIHdpbiwgZW5kKTsKLQlERUJVR1AoInRjcF9pbl93aW5kb3c6IHNlbmRlciBlbmQ9JXUgbWF4ZW5kPSV1IG1heHdpbj0ldSBzY2FsZT0laSAiCi0JICAgICAgICJyZWNlaXZlciBlbmQ9JXUgbWF4ZW5kPSV1IG1heHdpbj0ldSBzY2FsZT0laVxuIiwKLQkJc2VuZGVyLT50ZF9lbmQsIHNlbmRlci0+dGRfbWF4ZW5kLCBzZW5kZXItPnRkX21heHdpbiwKLQkJc2VuZGVyLT50ZF9zY2FsZSwKLQkJcmVjZWl2ZXItPnRkX2VuZCwgcmVjZWl2ZXItPnRkX21heGVuZCwgcmVjZWl2ZXItPnRkX21heHdpbiwKLQkJcmVjZWl2ZXItPnRkX3NjYWxlKTsKLQotCURFQlVHUCgidGNwX2luX3dpbmRvdzogST0laSBJST0laSBJSUk9JWkgSVY9JWlcbiIsCi0JCWJlZm9yZShzZXEsIHNlbmRlci0+dGRfbWF4ZW5kICsgMSksCi0JCWFmdGVyKGVuZCwgc2VuZGVyLT50ZF9lbmQgLSByZWNlaXZlci0+dGRfbWF4d2luIC0gMSksCi0JCWJlZm9yZShzYWNrLCByZWNlaXZlci0+dGRfZW5kICsgMSksCi0JCWFmdGVyKGFjaywgcmVjZWl2ZXItPnRkX2VuZCAtIE1BWEFDS1dJTkRPVyhzZW5kZXIpKSk7Ci0KLQlpZiAoYmVmb3JlKHNlcSwgc2VuZGVyLT50ZF9tYXhlbmQgKyAxKSAmJgotCSAgICBhZnRlcihlbmQsIHNlbmRlci0+dGRfZW5kIC0gcmVjZWl2ZXItPnRkX21heHdpbiAtIDEpICYmCi0JICAgIGJlZm9yZShzYWNrLCByZWNlaXZlci0+dGRfZW5kICsgMSkgJiYKLQkgICAgYWZ0ZXIoYWNrLCByZWNlaXZlci0+dGRfZW5kIC0gTUFYQUNLV0lORE9XKHNlbmRlcikpKSB7Ci0JCS8qCi0JCSAqIFRha2UgaW50byBhY2NvdW50IHdpbmRvdyBzY2FsaW5nIChSRkMgMTMyMykuCi0JCSAqLwotCQlpZiAoIXRjcGgtPnN5bikKLQkJCXdpbiA8PD0gc2VuZGVyLT50ZF9zY2FsZTsKLQotCQkvKgotCQkgKiBVcGRhdGUgc2VuZGVyIGRhdGEuCi0JCSAqLwotCQlzd2luID0gd2luICsgKHNhY2sgLSBhY2spOwotCQlpZiAoc2VuZGVyLT50ZF9tYXh3aW4gPCBzd2luKQotCQkJc2VuZGVyLT50ZF9tYXh3aW4gPSBzd2luOwotCQlpZiAoYWZ0ZXIoZW5kLCBzZW5kZXItPnRkX2VuZCkpCi0JCQlzZW5kZXItPnRkX2VuZCA9IGVuZDsKLQkJLyoKLQkJICogVXBkYXRlIHJlY2VpdmVyIGRhdGEuCi0JCSAqLwotCQlpZiAoYWZ0ZXIoZW5kLCBzZW5kZXItPnRkX21heGVuZCkpCi0JCQlyZWNlaXZlci0+dGRfbWF4d2luICs9IGVuZCAtIHNlbmRlci0+dGRfbWF4ZW5kOwotCQlpZiAoYWZ0ZXIoc2FjayArIHdpbiwgcmVjZWl2ZXItPnRkX21heGVuZCAtIDEpKSB7Ci0JCQlyZWNlaXZlci0+dGRfbWF4ZW5kID0gc2FjayArIHdpbjsKLQkJCWlmICh3aW4gPT0gMCkKLQkJCQlyZWNlaXZlci0+dGRfbWF4ZW5kKys7Ci0JCX0KLQotCQkvKgotCQkgKiBDaGVjayByZXRyYW5zbWlzc2lvbnMuCi0JCSAqLwotCQlpZiAoaW5kZXggPT0gVENQX0FDS19TRVQpIHsKLQkJCWlmIChzdGF0ZS0+bGFzdF9kaXIgPT0gZGlyCi0JCQkgICAgJiYgc3RhdGUtPmxhc3Rfc2VxID09IHNlcQotCQkJICAgICYmIHN0YXRlLT5sYXN0X2FjayA9PSBhY2sKLQkJCSAgICAmJiBzdGF0ZS0+bGFzdF9lbmQgPT0gZW5kCi0JCQkgICAgJiYgc3RhdGUtPmxhc3Rfd2luID09IHdpbikKLQkJCQlzdGF0ZS0+cmV0cmFucysrOwotCQkJZWxzZSB7Ci0JCQkJc3RhdGUtPmxhc3RfZGlyID0gZGlyOwotCQkJCXN0YXRlLT5sYXN0X3NlcSA9IHNlcTsKLQkJCQlzdGF0ZS0+bGFzdF9hY2sgPSBhY2s7Ci0JCQkJc3RhdGUtPmxhc3RfZW5kID0gZW5kOwotCQkJCXN0YXRlLT5sYXN0X3dpbiA9IHdpbjsKLQkJCQlzdGF0ZS0+cmV0cmFucyA9IDA7Ci0JCQl9Ci0JCX0KLQkJcmVzID0gMTsKLQl9IGVsc2UgewotCQlyZXMgPSAwOwotCQlpZiAoc2VuZGVyLT5mbGFncyAmIElQX0NUX1RDUF9GTEFHX0JFX0xJQkVSQUwgfHwKLQkJICAgIGlwX2N0X3RjcF9iZV9saWJlcmFsKQotCQkJcmVzID0gMTsKLQkJaWYgKCFyZXMgJiYgTE9HX0lOVkFMSUQoSVBQUk9UT19UQ1ApKQotCQkJbmZfbG9nX3BhY2tldChQRl9JTkVULCAwLCBza2IsIE5VTEwsIE5VTEwsIE5VTEwsCi0JCQkiaXBfY3RfdGNwOiAlcyAiLAotCQkJYmVmb3JlKHNlcSwgc2VuZGVyLT50ZF9tYXhlbmQgKyAxKSA/Ci0JCQlhZnRlcihlbmQsIHNlbmRlci0+dGRfZW5kIC0gcmVjZWl2ZXItPnRkX21heHdpbiAtIDEpID8KLQkJCWJlZm9yZShzYWNrLCByZWNlaXZlci0+dGRfZW5kICsgMSkgPwotCQkJYWZ0ZXIoYWNrLCByZWNlaXZlci0+dGRfZW5kIC0gTUFYQUNLV0lORE9XKHNlbmRlcikpID8gIkJVRyIKLQkJCTogIkFDSyBpcyB1bmRlciB0aGUgbG93ZXIgYm91bmQgKHBvc3NpYmxlIG92ZXJseSBkZWxheWVkIEFDSykiCi0JCQk6ICJBQ0sgaXMgb3ZlciB0aGUgdXBwZXIgYm91bmQgKEFDS2VkIGRhdGEgbm90IHNlZW4geWV0KSIKLQkJCTogIlNFUSBpcyB1bmRlciB0aGUgbG93ZXIgYm91bmQgKGFscmVhZHkgQUNLZWQgZGF0YSByZXRyYW5zbWl0dGVkKSIKLQkJCTogIlNFUSBpcyBvdmVyIHRoZSB1cHBlciBib3VuZCAob3ZlciB0aGUgd2luZG93IG9mIHRoZSByZWNlaXZlcikiKTsKLQl9Ci0KLQlERUJVR1AoInRjcF9pbl93aW5kb3c6IHJlcz0laSBzZW5kZXIgZW5kPSV1IG1heGVuZD0ldSBtYXh3aW49JXUgIgotCSAgICAgICAicmVjZWl2ZXIgZW5kPSV1IG1heGVuZD0ldSBtYXh3aW49JXVcbiIsCi0JCXJlcywgc2VuZGVyLT50ZF9lbmQsIHNlbmRlci0+dGRfbWF4ZW5kLCBzZW5kZXItPnRkX21heHdpbiwKLQkJcmVjZWl2ZXItPnRkX2VuZCwgcmVjZWl2ZXItPnRkX21heGVuZCwgcmVjZWl2ZXItPnRkX21heHdpbik7Ci0KLQlyZXR1cm4gcmVzOwotfQotCi0jaWZkZWYgQ09ORklHX0lQX05GX05BVF9ORUVERUQKLS8qIFVwZGF0ZSBzZW5kZXItPnRkX2VuZCBhZnRlciBOQVQgc3VjY2Vzc2Z1bGx5IG1hbmdsZWQgdGhlIHBhY2tldCAqLwotdm9pZCBpcF9jb25udHJhY2tfdGNwX3VwZGF0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJICAgICBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjb25udHJhY2ssCi0JCQkgICAgIGVudW0gaXBfY29ubnRyYWNrX2RpciBkaXIpCi17Ci0Jc3RydWN0IGlwaGRyICppcGggPSBza2ItPm5oLmlwaDsKLQlzdHJ1Y3QgdGNwaGRyICp0Y3BoID0gKHZvaWQgKilza2ItPm5oLmlwaCArIHNrYi0+bmguaXBoLT5paGwqNDsKLQlfX3UzMiBlbmQ7Ci0jaWZkZWYgREVCVUdQX1ZBUlMKLQlzdHJ1Y3QgaXBfY3RfdGNwX3N0YXRlICpzZW5kZXIgPSAmY29ubnRyYWNrLT5wcm90by50Y3Auc2VlbltkaXJdOwotCXN0cnVjdCBpcF9jdF90Y3Bfc3RhdGUgKnJlY2VpdmVyID0gJmNvbm50cmFjay0+cHJvdG8udGNwLnNlZW5bIWRpcl07Ci0jZW5kaWYKLQotCWVuZCA9IHNlZ21lbnRfc2VxX3BsdXNfbGVuKG50b2hsKHRjcGgtPnNlcSksIHNrYi0+bGVuLCBpcGgsIHRjcGgpOwotCi0Jd3JpdGVfbG9ja19iaCgmdGNwX2xvY2spOwotCS8qCi0JICogV2UgaGF2ZSB0byB3b3JyeSBmb3IgdGhlIGFjayBpbiB0aGUgcmVwbHkgcGFja2V0IG9ubHkuLi4KLQkgKi8KLQlpZiAoYWZ0ZXIoZW5kLCBjb25udHJhY2stPnByb3RvLnRjcC5zZWVuW2Rpcl0udGRfZW5kKSkKLQkJY29ubnRyYWNrLT5wcm90by50Y3Auc2VlbltkaXJdLnRkX2VuZCA9IGVuZDsKLQljb25udHJhY2stPnByb3RvLnRjcC5sYXN0X2VuZCA9IGVuZDsKLQl3cml0ZV91bmxvY2tfYmgoJnRjcF9sb2NrKTsKLQlERUJVR1AoInRjcF91cGRhdGU6IHNlbmRlciBlbmQ9JXUgbWF4ZW5kPSV1IG1heHdpbj0ldSBzY2FsZT0laSAiCi0JICAgICAgICJyZWNlaXZlciBlbmQ9JXUgbWF4ZW5kPSV1IG1heHdpbj0ldSBzY2FsZT0laVxuIiwKLQkJc2VuZGVyLT50ZF9lbmQsIHNlbmRlci0+dGRfbWF4ZW5kLCBzZW5kZXItPnRkX21heHdpbiwKLQkJc2VuZGVyLT50ZF9zY2FsZSwKLQkJcmVjZWl2ZXItPnRkX2VuZCwgcmVjZWl2ZXItPnRkX21heGVuZCwgcmVjZWl2ZXItPnRkX21heHdpbiwKLQkJcmVjZWl2ZXItPnRkX3NjYWxlKTsKLX0KLQotI2VuZGlmCi0KLSNkZWZpbmUJVEhfRklOCTB4MDEKLSNkZWZpbmUJVEhfU1lOCTB4MDIKLSNkZWZpbmUJVEhfUlNUCTB4MDQKLSNkZWZpbmUJVEhfUFVTSAkweDA4Ci0jZGVmaW5lCVRIX0FDSwkweDEwCi0jZGVmaW5lCVRIX1VSRwkweDIwCi0jZGVmaW5lCVRIX0VDRQkweDQwCi0jZGVmaW5lCVRIX0NXUgkweDgwCi0KLS8qIHRhYmxlIG9mIHZhbGlkIGZsYWcgY29tYmluYXRpb25zIC0gRUNFIGFuZCBDV1IgYXJlIGFsd2F5cyB2YWxpZCAqLwotc3RhdGljIGNvbnN0IHU4IHRjcF92YWxpZF9mbGFnc1soVEhfRklOfFRIX1NZTnxUSF9SU1R8VEhfUFVTSHxUSF9BQ0t8VEhfVVJHKSArIDFdID0KLXsKLQlbVEhfU1lOXQkJCT0gMSwKLQlbVEhfU1lOfFRIX1BVU0hdCQk9IDEsCi0JW1RIX1NZTnxUSF9VUkddCQkJPSAxLAotCVtUSF9TWU58VEhfUFVTSHxUSF9VUkddCQk9IDEsCi0JW1RIX1NZTnxUSF9BQ0tdCQkJPSAxLAotCVtUSF9TWU58VEhfQUNLfFRIX1BVU0hdCQk9IDEsCi0JW1RIX1JTVF0JCQk9IDEsCi0JW1RIX1JTVHxUSF9BQ0tdCQkJPSAxLAotCVtUSF9SU1R8VEhfQUNLfFRIX1BVU0hdCQk9IDEsCi0JW1RIX0ZJTnxUSF9BQ0tdCQkJPSAxLAotCVtUSF9BQ0tdCQkJPSAxLAotCVtUSF9BQ0t8VEhfUFVTSF0JCT0gMSwKLQlbVEhfQUNLfFRIX1VSR10JCQk9IDEsCi0JW1RIX0FDS3xUSF9VUkd8VEhfUFVTSF0JCT0gMSwKLQlbVEhfRklOfFRIX0FDS3xUSF9QVVNIXQkJPSAxLAotCVtUSF9GSU58VEhfQUNLfFRIX1VSR10JCT0gMSwKLQlbVEhfRklOfFRIX0FDS3xUSF9VUkd8VEhfUFVTSF0JPSAxLAotfTsKLQotLyogUHJvdGVjdCBjb25udHJhY2sgYWdhaXN0IGJyb2tlbiBwYWNrZXRzLiBDb2RlIHRha2VuIGZyb20gaXB0X3VuY2xlYW4uYy4gICovCi1zdGF0aWMgaW50IHRjcF9lcnJvcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkgICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gKmN0aW5mbywKLQkJICAgICB1bnNpZ25lZCBpbnQgaG9va251bSkKLXsKLQlzdHJ1Y3QgaXBoZHIgKmlwaCA9IHNrYi0+bmguaXBoOwotCXN0cnVjdCB0Y3BoZHIgX3RjcGgsICp0aDsKLQl1bnNpZ25lZCBpbnQgdGNwbGVuID0gc2tiLT5sZW4gLSBpcGgtPmlobCAqIDQ7Ci0JdV9pbnQ4X3QgdGNwZmxhZ3M7Ci0KLQkvKiBTbWFsbGVyIHRoYXQgbWluaW1hbCBUQ1AgaGVhZGVyPyAqLwotCXRoID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgaXBoLT5paGwgKiA0LAotCQkJCXNpemVvZihfdGNwaCksICZfdGNwaCk7Ci0JaWYgKHRoID09IE5VTEwpIHsKLQkJaWYgKExPR19JTlZBTElEKElQUFJPVE9fVENQKSkKLQkJCW5mX2xvZ19wYWNrZXQoUEZfSU5FVCwgMCwgc2tiLCBOVUxMLCBOVUxMLCBOVUxMLAotCQkJCSJpcF9jdF90Y3A6IHNob3J0IHBhY2tldCAiKTsKLQkJcmV0dXJuIC1ORl9BQ0NFUFQ7Ci0JfQotCi0JLyogTm90IHdob2xlIFRDUCBoZWFkZXIgb3IgbWFsZm9ybWVkIHBhY2tldCAqLwotCWlmICh0aC0+ZG9mZio0IDwgc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpIHx8IHRjcGxlbiA8IHRoLT5kb2ZmKjQpIHsKLQkJaWYgKExPR19JTlZBTElEKElQUFJPVE9fVENQKSkKLQkJCW5mX2xvZ19wYWNrZXQoUEZfSU5FVCwgMCwgc2tiLCBOVUxMLCBOVUxMLCBOVUxMLAotCQkJCSJpcF9jdF90Y3A6IHRydW5jYXRlZC9tYWxmb3JtZWQgcGFja2V0ICIpOwotCQlyZXR1cm4gLU5GX0FDQ0VQVDsKLQl9Ci0KLQkvKiBDaGVja3N1bSBpbnZhbGlkPyBJZ25vcmUuCi0JICogV2Ugc2tpcCBjaGVja2luZyBwYWNrZXRzIG9uIHRoZSBvdXRnb2luZyBwYXRoCi0JICogYmVjYXVzZSBpdCBpcyBhc3N1bWVkIHRvIGJlIGNvcnJlY3QuCi0JICovCi0JLyogRklYTUU6IFNvdXJjZSByb3V0ZSBJUCBvcHRpb24gcGFja2V0cyAtLVJSICovCi0JaWYgKGlwX2Nvbm50cmFja19jaGVja3N1bSAmJiBob29rbnVtID09IE5GX0lQX1BSRV9ST1VUSU5HICYmCi0JICAgIG5mX2lwX2NoZWNrc3VtKHNrYiwgaG9va251bSwgaXBoLT5paGwgKiA0LCBJUFBST1RPX1RDUCkpIHsKLQkJaWYgKExPR19JTlZBTElEKElQUFJPVE9fVENQKSkKLQkJCW5mX2xvZ19wYWNrZXQoUEZfSU5FVCwgMCwgc2tiLCBOVUxMLCBOVUxMLCBOVUxMLAotCQkJCSAgImlwX2N0X3RjcDogYmFkIFRDUCBjaGVja3N1bSAiKTsKLQkJcmV0dXJuIC1ORl9BQ0NFUFQ7Ci0JfQotCi0JLyogQ2hlY2sgVENQIGZsYWdzLiAqLwotCXRjcGZsYWdzID0gKCgodV9pbnQ4X3QgKil0aClbMTNdICYgfihUSF9FQ0V8VEhfQ1dSKSk7Ci0JaWYgKCF0Y3BfdmFsaWRfZmxhZ3NbdGNwZmxhZ3NdKSB7Ci0JCWlmIChMT0dfSU5WQUxJRChJUFBST1RPX1RDUCkpCi0JCQluZl9sb2dfcGFja2V0KFBGX0lORVQsIDAsIHNrYiwgTlVMTCwgTlVMTCwgTlVMTCwKLQkJCQkgICJpcF9jdF90Y3A6IGludmFsaWQgVENQIGZsYWcgY29tYmluYXRpb24gIik7Ci0JCXJldHVybiAtTkZfQUNDRVBUOwotCX0KLQotCXJldHVybiBORl9BQ0NFUFQ7Ci19Ci0KLS8qIFJldHVybnMgdmVyZGljdCBmb3IgcGFja2V0LCBvciAtMSBmb3IgaW52YWxpZC4gKi8KLXN0YXRpYyBpbnQgdGNwX3BhY2tldChzdHJ1Y3QgaXBfY29ubnRyYWNrICpjb25udHJhY2ssCi0JCSAgICAgIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0JCSAgICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvKQotewotCWVudW0gdGNwX2Nvbm50cmFjayBuZXdfc3RhdGUsIG9sZF9zdGF0ZTsKLQllbnVtIGlwX2Nvbm50cmFja19kaXIgZGlyOwotCXN0cnVjdCBpcGhkciAqaXBoID0gc2tiLT5uaC5pcGg7Ci0Jc3RydWN0IHRjcGhkciAqdGgsIF90Y3BoOwotCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKLQl1bnNpZ25lZCBpbnQgaW5kZXg7Ci0KLQl0aCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIGlwaC0+aWhsICogNCwKLQkJCQlzaXplb2YoX3RjcGgpLCAmX3RjcGgpOwotCUJVR19PTih0aCA9PSBOVUxMKTsKLQotCXdyaXRlX2xvY2tfYmgoJnRjcF9sb2NrKTsKLQlvbGRfc3RhdGUgPSBjb25udHJhY2stPnByb3RvLnRjcC5zdGF0ZTsKLQlkaXIgPSBDVElORk8yRElSKGN0aW5mbyk7Ci0JaW5kZXggPSBnZXRfY29ubnRyYWNrX2luZGV4KHRoKTsKLQluZXdfc3RhdGUgPSB0Y3BfY29ubnRyYWNrc1tkaXJdW2luZGV4XVtvbGRfc3RhdGVdOwotCi0Jc3dpdGNoIChuZXdfc3RhdGUpIHsKLQljYXNlIFRDUF9DT05OVFJBQ0tfSUdOT1JFOgotCQkvKiBJZ25vcmVkIHBhY2tldHM6Ci0JCSAqCi0JCSAqIGEpIFNZTiBpbiBPUklHSU5BTAotCQkgKiBiKSBTWU4vQUNLIGluIFJFUExZCi0JCSAqIGMpIEFDSyBpbiByZXBseSBkaXJlY3Rpb24gYWZ0ZXIgaW5pdGlhbCBTWU4gaW4gb3JpZ2luYWwuCi0JCSAqLwotCQlpZiAoaW5kZXggPT0gVENQX1NZTkFDS19TRVQKLQkJICAgICYmIGNvbm50cmFjay0+cHJvdG8udGNwLmxhc3RfaW5kZXggPT0gVENQX1NZTl9TRVQKLQkJICAgICYmIGNvbm50cmFjay0+cHJvdG8udGNwLmxhc3RfZGlyICE9IGRpcgotCQkgICAgJiYgbnRvaGwodGgtPmFja19zZXEpID09Ci0JCQkgICAgIGNvbm50cmFjay0+cHJvdG8udGNwLmxhc3RfZW5kKSB7Ci0JCQkvKiBUaGlzIFNZTi9BQ0sgYWNrbm93bGVkZ2VzIGEgU1lOIHRoYXQgd2UgZWFybGllcgotCQkJICogaWdub3JlZCBhcyBpbnZhbGlkLiBUaGlzIG1lYW5zIHRoYXQgdGhlIGNsaWVudCBhbmQKLQkJCSAqIHRoZSBzZXJ2ZXIgYXJlIGJvdGggaW4gc3luYywgd2hpbGUgdGhlIGZpcmV3YWxsIGlzCi0JCQkgKiBub3QuIFdlIGtpbGwgdGhpcyBzZXNzaW9uIGFuZCBibG9jayB0aGUgU1lOL0FDSyBzbwotCQkJICogdGhhdCB0aGUgY2xpZW50IGNhbm5vdCBidXQgcmV0cmFuc21pdCBpdHMgU1lOIGFuZAotCQkJICogdGh1cyBpbml0aWF0ZSBhIGNsZWFuIG5ldyBzZXNzaW9uLgotCQkJICovCi0JCQl3cml0ZV91bmxvY2tfYmgoJnRjcF9sb2NrKTsKLQkJCWlmIChMT0dfSU5WQUxJRChJUFBST1RPX1RDUCkpCi0JCQkJbmZfbG9nX3BhY2tldChQRl9JTkVULCAwLCBza2IsIE5VTEwsIE5VTEwsCi0JCQkJCSAgICAgIE5VTEwsICJpcF9jdF90Y3A6ICIKLQkJCQkJICAgICAgImtpbGxpbmcgb3V0IG9mIHN5bmMgc2Vzc2lvbiAiKTsKLQkJCWlmIChkZWxfdGltZXIoJmNvbm50cmFjay0+dGltZW91dCkpCi0JCQkJY29ubnRyYWNrLT50aW1lb3V0LmZ1bmN0aW9uKCh1bnNpZ25lZCBsb25nKQotCQkJCQkJCSAgICBjb25udHJhY2spOwotCQkJcmV0dXJuIC1ORl9EUk9QOwotCQl9Ci0JCWNvbm50cmFjay0+cHJvdG8udGNwLmxhc3RfaW5kZXggPSBpbmRleDsKLQkJY29ubnRyYWNrLT5wcm90by50Y3AubGFzdF9kaXIgPSBkaXI7Ci0JCWNvbm50cmFjay0+cHJvdG8udGNwLmxhc3Rfc2VxID0gbnRvaGwodGgtPnNlcSk7Ci0JCWNvbm50cmFjay0+cHJvdG8udGNwLmxhc3RfZW5kID0KLQkJICAgIHNlZ21lbnRfc2VxX3BsdXNfbGVuKG50b2hsKHRoLT5zZXEpLCBza2ItPmxlbiwgaXBoLCB0aCk7Ci0KLQkJd3JpdGVfdW5sb2NrX2JoKCZ0Y3BfbG9jayk7Ci0JCWlmIChMT0dfSU5WQUxJRChJUFBST1RPX1RDUCkpCi0JCQluZl9sb2dfcGFja2V0KFBGX0lORVQsIDAsIHNrYiwgTlVMTCwgTlVMTCwgTlVMTCwKLQkJCQkgICJpcF9jdF90Y3A6IGludmFsaWQgcGFja2V0IGlnbm9yZWQgIik7Ci0JCXJldHVybiBORl9BQ0NFUFQ7Ci0JY2FzZSBUQ1BfQ09OTlRSQUNLX01BWDoKLQkJLyogSW52YWxpZCBwYWNrZXQgKi8KLQkJREVCVUdQKCJpcF9jdF90Y3A6IEludmFsaWQgZGlyPSVpIGluZGV4PSV1IG9zdGF0ZT0ldVxuIiwKLQkJICAgICAgIGRpciwgZ2V0X2Nvbm50cmFja19pbmRleCh0aCksCi0JCSAgICAgICBvbGRfc3RhdGUpOwotCQl3cml0ZV91bmxvY2tfYmgoJnRjcF9sb2NrKTsKLQkJaWYgKExPR19JTlZBTElEKElQUFJPVE9fVENQKSkKLQkJCW5mX2xvZ19wYWNrZXQoUEZfSU5FVCwgMCwgc2tiLCBOVUxMLCBOVUxMLCBOVUxMLAotCQkJCSAgImlwX2N0X3RjcDogaW52YWxpZCBzdGF0ZSAiKTsKLQkJcmV0dXJuIC1ORl9BQ0NFUFQ7Ci0JY2FzZSBUQ1BfQ09OTlRSQUNLX1NZTl9TRU5UOgotCQlpZiAob2xkX3N0YXRlIDwgVENQX0NPTk5UUkFDS19USU1FX1dBSVQpCi0JCQlicmVhazsKLQkJaWYgKChjb25udHJhY2stPnByb3RvLnRjcC5zZWVuW2Rpcl0uZmxhZ3MgJgotCQkJIElQX0NUX1RDUF9GTEFHX0NMT1NFX0lOSVQpCi0JCSAgICB8fCBhZnRlcihudG9obCh0aC0+c2VxKSwKLQkJCSAgICAgY29ubnRyYWNrLT5wcm90by50Y3Auc2VlbltkaXJdLnRkX2VuZCkpIHsKLQkJCS8qIEF0dGVtcHQgdG8gcmVvcGVuIGEgY2xvc2VkIGNvbm5lY3Rpb24uCi0JCQkqIERlbGV0ZSB0aGlzIGNvbm5lY3Rpb24gYW5kIGxvb2sgdXAgYWdhaW4uICovCi0JCQl3cml0ZV91bmxvY2tfYmgoJnRjcF9sb2NrKTsKLQkJCWlmIChkZWxfdGltZXIoJmNvbm50cmFjay0+dGltZW91dCkpCi0JCQkJY29ubnRyYWNrLT50aW1lb3V0LmZ1bmN0aW9uKCh1bnNpZ25lZCBsb25nKQotCQkJCQkJCSAgICBjb25udHJhY2spOwotCQkJcmV0dXJuIC1ORl9SRVBFQVQ7Ci0JCX0gZWxzZSB7Ci0JCQl3cml0ZV91bmxvY2tfYmgoJnRjcF9sb2NrKTsKLQkJCWlmIChMT0dfSU5WQUxJRChJUFBST1RPX1RDUCkpCi0JCQkJbmZfbG9nX3BhY2tldChQRl9JTkVULCAwLCBza2IsIE5VTEwsIE5VTEwsCi0JCQkJCSAgICAgIE5VTEwsICJpcF9jdF90Y3A6IGludmFsaWQgU1lOIik7Ci0JCQlyZXR1cm4gLU5GX0FDQ0VQVDsKLQkJfQotCWNhc2UgVENQX0NPTk5UUkFDS19DTE9TRToKLQkJaWYgKGluZGV4ID09IFRDUF9SU1RfU0VUCi0JCSAgICAmJiAoKHRlc3RfYml0KElQU19TRUVOX1JFUExZX0JJVCwgJmNvbm50cmFjay0+c3RhdHVzKQotCQkJICYmIGNvbm50cmFjay0+cHJvdG8udGNwLmxhc3RfaW5kZXggPT0gVENQX1NZTl9TRVQpCi0JCQl8fCAoIXRlc3RfYml0KElQU19BU1NVUkVEX0JJVCwgJmNvbm50cmFjay0+c3RhdHVzKQotCQkJICAgICYmIGNvbm50cmFjay0+cHJvdG8udGNwLmxhc3RfaW5kZXggPT0gVENQX0FDS19TRVQpKQotCQkgICAgJiYgbnRvaGwodGgtPmFja19zZXEpID09IGNvbm50cmFjay0+cHJvdG8udGNwLmxhc3RfZW5kKSB7Ci0JCQkvKiBSU1Qgc2VudCB0byBpbnZhbGlkIFNZTiBvciBBQ0sgd2UgaGFkIGxldCB0aHJvdWdoCi0JCQkgKiBhdCBhKSBhbmQgYykgYWJvdmU6Ci0JCQkgKgotCQkJICogYSkgU1lOIHdhcyBpbiB3aW5kb3cgdGhlbgotCQkJICogYykgd2UgaG9sZCBhIGhhbGYtb3BlbiBjb25uZWN0aW9uLgotCQkJICoKLQkJCSAqIERlbGV0ZSBvdXIgY29ubmVjdGlvbiBlbnRyeS4KLQkJCSAqIFdlIHNraXAgd2luZG93IGNoZWNraW5nLCBiZWNhdXNlIHBhY2tldCBtaWdodCBBQ0sKLQkJCSAqIHNlZ21lbnRzIHdlIGlnbm9yZWQuICovCi0JCQlnb3RvIGluX3dpbmRvdzsKLQkJfQotCQkvKiBKdXN0IGZhbGwgdGhyb3VnaCAqLwotCWRlZmF1bHQ6Ci0JCS8qIEtlZXAgY29tcGlsZXJzIGhhcHB5LiAqLwotCQlicmVhazsKLQl9Ci0KLQlpZiAoIXRjcF9pbl93aW5kb3coJmNvbm50cmFjay0+cHJvdG8udGNwLCBkaXIsIGluZGV4LAotCQkJICAgc2tiLCBpcGgsIHRoKSkgewotCQl3cml0ZV91bmxvY2tfYmgoJnRjcF9sb2NrKTsKLQkJcmV0dXJuIC1ORl9BQ0NFUFQ7Ci0JfQotICAgIGluX3dpbmRvdzoKLQkvKiBGcm9tIG5vdyBvbiB3ZSBoYXZlIGdvdCBpbi13aW5kb3cgcGFja2V0cyAqLwotCWNvbm50cmFjay0+cHJvdG8udGNwLmxhc3RfaW5kZXggPSBpbmRleDsKLQotCURFQlVHUCgidGNwX2Nvbm50cmFja3M6IHNyYz0ldS4ldS4ldS4ldTolaHUgZHN0PSV1LiV1LiV1LiV1OiVodSAiCi0JICAgICAgICJzeW49JWkgYWNrPSVpIGZpbj0laSByc3Q9JWkgb2xkPSVpIG5ldz0laVxuIiwKLQkJTklQUVVBRChpcGgtPnNhZGRyKSwgbnRvaHModGgtPnNvdXJjZSksCi0JCU5JUFFVQUQoaXBoLT5kYWRkciksIG50b2hzKHRoLT5kZXN0KSwKLQkJKHRoLT5zeW4gPyAxIDogMCksICh0aC0+YWNrID8gMSA6IDApLAotCQkodGgtPmZpbiA/IDEgOiAwKSwgKHRoLT5yc3QgPyAxIDogMCksCi0JCW9sZF9zdGF0ZSwgbmV3X3N0YXRlKTsKLQotCWNvbm50cmFjay0+cHJvdG8udGNwLnN0YXRlID0gbmV3X3N0YXRlOwotCWlmIChvbGRfc3RhdGUgIT0gbmV3X3N0YXRlCi0JICAgICYmIChuZXdfc3RhdGUgPT0gVENQX0NPTk5UUkFDS19GSU5fV0FJVAotCQl8fCBuZXdfc3RhdGUgPT0gVENQX0NPTk5UUkFDS19DTE9TRSkpCi0JCWNvbm50cmFjay0+cHJvdG8udGNwLnNlZW5bZGlyXS5mbGFncyB8PSBJUF9DVF9UQ1BfRkxBR19DTE9TRV9JTklUOwotCXRpbWVvdXQgPSBjb25udHJhY2stPnByb3RvLnRjcC5yZXRyYW5zID49IGlwX2N0X3RjcF9tYXhfcmV0cmFucwotCQkgICYmICp0Y3BfdGltZW91dHNbbmV3X3N0YXRlXSA+IGlwX2N0X3RjcF90aW1lb3V0X21heF9yZXRyYW5zCi0JCSAgPyBpcF9jdF90Y3BfdGltZW91dF9tYXhfcmV0cmFucyA6ICp0Y3BfdGltZW91dHNbbmV3X3N0YXRlXTsKLQl3cml0ZV91bmxvY2tfYmgoJnRjcF9sb2NrKTsKLQotCWlwX2Nvbm50cmFja19ldmVudF9jYWNoZShJUENUX1BST1RPSU5GT19WT0xBVElMRSwgc2tiKTsKLQlpZiAobmV3X3N0YXRlICE9IG9sZF9zdGF0ZSkKLQkJaXBfY29ubnRyYWNrX2V2ZW50X2NhY2hlKElQQ1RfUFJPVE9JTkZPLCBza2IpOwotCi0JaWYgKCF0ZXN0X2JpdChJUFNfU0VFTl9SRVBMWV9CSVQsICZjb25udHJhY2stPnN0YXR1cykpIHsKLQkJLyogSWYgb25seSByZXBseSBpcyBhIFJTVCwgd2UgY2FuIGNvbnNpZGVyIG91cnNlbHZlcyBub3QgdG8KLQkJICAgaGF2ZSBhbiBlc3RhYmxpc2hlZCBjb25uZWN0aW9uOiB0aGlzIGlzIGEgZmFpcmx5IGNvbW1vbgotCQkgICBwcm9ibGVtIGNhc2UsIHNvIHdlIGNhbiBkZWxldGUgdGhlIGNvbm50cmFjawotCQkgICBpbW1lZGlhdGVseS4gIC0tUlIgKi8KLQkJaWYgKHRoLT5yc3QpIHsKLQkJCWlmIChkZWxfdGltZXIoJmNvbm50cmFjay0+dGltZW91dCkpCi0JCQkJY29ubnRyYWNrLT50aW1lb3V0LmZ1bmN0aW9uKCh1bnNpZ25lZCBsb25nKQotCQkJCQkJCSAgICBjb25udHJhY2spOwotCQkJcmV0dXJuIE5GX0FDQ0VQVDsKLQkJfQotCX0gZWxzZSBpZiAoIXRlc3RfYml0KElQU19BU1NVUkVEX0JJVCwgJmNvbm50cmFjay0+c3RhdHVzKQotCQkgICAmJiAob2xkX3N0YXRlID09IFRDUF9DT05OVFJBQ0tfU1lOX1JFQ1YKLQkJICAgICAgIHx8IG9sZF9zdGF0ZSA9PSBUQ1BfQ09OTlRSQUNLX0VTVEFCTElTSEVEKQotCQkgICAmJiBuZXdfc3RhdGUgPT0gVENQX0NPTk5UUkFDS19FU1RBQkxJU0hFRCkgewotCQkvKiBTZXQgQVNTVVJFRCBpZiB3ZSBzZWUgc2VlIHZhbGlkIGFjayBpbiBFU1RBQkxJU0hFRAotCQkgICBhZnRlciBTWU5fUkVDViBvciBhIHZhbGlkIGFuc3dlciBmb3IgYSBwaWNrZWQgdXAKLQkJICAgY29ubmVjdGlvbi4gKi8KLQkJc2V0X2JpdChJUFNfQVNTVVJFRF9CSVQsICZjb25udHJhY2stPnN0YXR1cyk7Ci0JCWlwX2Nvbm50cmFja19ldmVudF9jYWNoZShJUENUX1NUQVRVUywgc2tiKTsKLQl9Ci0JaXBfY3RfcmVmcmVzaF9hY2N0KGNvbm50cmFjaywgY3RpbmZvLCBza2IsIHRpbWVvdXQpOwotCi0JcmV0dXJuIE5GX0FDQ0VQVDsKLX0KLQotLyogQ2FsbGVkIHdoZW4gYSBuZXcgY29ubmVjdGlvbiBmb3IgdGhpcyBwcm90b2NvbCBmb3VuZC4gKi8KLXN0YXRpYyBpbnQgdGNwX25ldyhzdHJ1Y3QgaXBfY29ubnRyYWNrICpjb25udHJhY2ssCi0JCSAgIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCi17Ci0JZW51bSB0Y3BfY29ubnRyYWNrIG5ld19zdGF0ZTsKLQlzdHJ1Y3QgaXBoZHIgKmlwaCA9IHNrYi0+bmguaXBoOwotCXN0cnVjdCB0Y3BoZHIgKnRoLCBfdGNwaDsKLSNpZmRlZiBERUJVR1BfVkFSUwotCXN0cnVjdCBpcF9jdF90Y3Bfc3RhdGUgKnNlbmRlciA9ICZjb25udHJhY2stPnByb3RvLnRjcC5zZWVuWzBdOwotCXN0cnVjdCBpcF9jdF90Y3Bfc3RhdGUgKnJlY2VpdmVyID0gJmNvbm50cmFjay0+cHJvdG8udGNwLnNlZW5bMV07Ci0jZW5kaWYKLQotCXRoID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgaXBoLT5paGwgKiA0LAotCQkJCXNpemVvZihfdGNwaCksICZfdGNwaCk7Ci0JQlVHX09OKHRoID09IE5VTEwpOwotCi0JLyogRG9uJ3QgbmVlZCBsb2NrIGhlcmU6IHRoaXMgY29ubnRyYWNrIG5vdCBpbiBjaXJjdWxhdGlvbiB5ZXQgKi8KLQluZXdfc3RhdGUKLQkJPSB0Y3BfY29ubnRyYWNrc1swXVtnZXRfY29ubnRyYWNrX2luZGV4KHRoKV0KLQkJW1RDUF9DT05OVFJBQ0tfTk9ORV07Ci0KLQkvKiBJbnZhbGlkOiBkZWxldGUgY29ubnRyYWNrICovCi0JaWYgKG5ld19zdGF0ZSA+PSBUQ1BfQ09OTlRSQUNLX01BWCkgewotCQlERUJVR1AoImlwX2N0X3RjcDogaW52YWxpZCBuZXcgZGVsZXRpbmcuXG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKG5ld19zdGF0ZSA9PSBUQ1BfQ09OTlRSQUNLX1NZTl9TRU5UKSB7Ci0JCS8qIFNZTiBwYWNrZXQgKi8KLQkJY29ubnRyYWNrLT5wcm90by50Y3Auc2VlblswXS50ZF9lbmQgPQotCQkJc2VnbWVudF9zZXFfcGx1c19sZW4obnRvaGwodGgtPnNlcSksIHNrYi0+bGVuLAotCQkJCQkgICAgIGlwaCwgdGgpOwotCQljb25udHJhY2stPnByb3RvLnRjcC5zZWVuWzBdLnRkX21heHdpbiA9IG50b2hzKHRoLT53aW5kb3cpOwotCQlpZiAoY29ubnRyYWNrLT5wcm90by50Y3Auc2VlblswXS50ZF9tYXh3aW4gPT0gMCkKLQkJCWNvbm50cmFjay0+cHJvdG8udGNwLnNlZW5bMF0udGRfbWF4d2luID0gMTsKLQkJY29ubnRyYWNrLT5wcm90by50Y3Auc2VlblswXS50ZF9tYXhlbmQgPQotCQkJY29ubnRyYWNrLT5wcm90by50Y3Auc2VlblswXS50ZF9lbmQ7Ci0KLQkJdGNwX29wdGlvbnMoc2tiLCBpcGgsIHRoLCAmY29ubnRyYWNrLT5wcm90by50Y3Auc2VlblswXSk7Ci0JCWNvbm50cmFjay0+cHJvdG8udGNwLnNlZW5bMV0uZmxhZ3MgPSAwOwotCX0gZWxzZSBpZiAoaXBfY3RfdGNwX2xvb3NlID09IDApIHsKLQkJLyogRG9uJ3QgdHJ5IHRvIHBpY2sgdXAgY29ubmVjdGlvbnMuICovCi0JCXJldHVybiAwOwotCX0gZWxzZSB7Ci0JCS8qCi0JCSAqIFdlIGFyZSBpbiB0aGUgbWlkZGxlIG9mIGEgY29ubmVjdGlvbiwKLQkJICogaXRzIGhpc3RvcnkgaXMgbG9zdCBmb3IgdXMuCi0JCSAqIExldCdzIHRyeSB0byB1c2UgdGhlIGRhdGEgZnJvbSB0aGUgcGFja2V0LgotCQkgKi8KLQkJY29ubnRyYWNrLT5wcm90by50Y3Auc2VlblswXS50ZF9lbmQgPQotCQkJc2VnbWVudF9zZXFfcGx1c19sZW4obnRvaGwodGgtPnNlcSksIHNrYi0+bGVuLAotCQkJCQkgICAgIGlwaCwgdGgpOwotCQljb25udHJhY2stPnByb3RvLnRjcC5zZWVuWzBdLnRkX21heHdpbiA9IG50b2hzKHRoLT53aW5kb3cpOwotCQlpZiAoY29ubnRyYWNrLT5wcm90by50Y3Auc2VlblswXS50ZF9tYXh3aW4gPT0gMCkKLQkJCWNvbm50cmFjay0+cHJvdG8udGNwLnNlZW5bMF0udGRfbWF4d2luID0gMTsKLQkJY29ubnRyYWNrLT5wcm90by50Y3Auc2VlblswXS50ZF9tYXhlbmQgPQotCQkJY29ubnRyYWNrLT5wcm90by50Y3Auc2VlblswXS50ZF9lbmQgKwotCQkJY29ubnRyYWNrLT5wcm90by50Y3Auc2VlblswXS50ZF9tYXh3aW47Ci0JCWNvbm50cmFjay0+cHJvdG8udGNwLnNlZW5bMF0udGRfc2NhbGUgPSAwOwotCi0JCS8qIFdlIGFzc3VtZSBTQUNLIGFuZCBsaWJlcmFsIHdpbmRvdyBjaGVja2luZyB0byBoYW5kbGUKLQkJICogd2luZG93IHNjYWxpbmcgKi8KLQkJY29ubnRyYWNrLT5wcm90by50Y3Auc2VlblswXS5mbGFncyA9Ci0JCWNvbm50cmFjay0+cHJvdG8udGNwLnNlZW5bMV0uZmxhZ3MgPSBJUF9DVF9UQ1BfRkxBR19TQUNLX1BFUk0gfAotCQkJCQkJICAgICBJUF9DVF9UQ1BfRkxBR19CRV9MSUJFUkFMOwotCX0KLQotCWNvbm50cmFjay0+cHJvdG8udGNwLnNlZW5bMV0udGRfZW5kID0gMDsKLQljb25udHJhY2stPnByb3RvLnRjcC5zZWVuWzFdLnRkX21heGVuZCA9IDA7Ci0JY29ubnRyYWNrLT5wcm90by50Y3Auc2VlblsxXS50ZF9tYXh3aW4gPSAxOwotCWNvbm50cmFjay0+cHJvdG8udGNwLnNlZW5bMV0udGRfc2NhbGUgPSAwOwotCi0JLyogdGNwX3BhY2tldCB3aWxsIHNldCB0aGVtICovCi0JY29ubnRyYWNrLT5wcm90by50Y3Auc3RhdGUgPSBUQ1BfQ09OTlRSQUNLX05PTkU7Ci0JY29ubnRyYWNrLT5wcm90by50Y3AubGFzdF9pbmRleCA9IFRDUF9OT05FX1NFVDsKLQotCURFQlVHUCgidGNwX25ldzogc2VuZGVyIGVuZD0ldSBtYXhlbmQ9JXUgbWF4d2luPSV1IHNjYWxlPSVpICIKLQkgICAgICAgInJlY2VpdmVyIGVuZD0ldSBtYXhlbmQ9JXUgbWF4d2luPSV1IHNjYWxlPSVpXG4iLAotCQlzZW5kZXItPnRkX2VuZCwgc2VuZGVyLT50ZF9tYXhlbmQsIHNlbmRlci0+dGRfbWF4d2luLAotCQlzZW5kZXItPnRkX3NjYWxlLAotCQlyZWNlaXZlci0+dGRfZW5kLCByZWNlaXZlci0+dGRfbWF4ZW5kLCByZWNlaXZlci0+dGRfbWF4d2luLAotCQlyZWNlaXZlci0+dGRfc2NhbGUpOwotCXJldHVybiAxOwotfQotCi1zdHJ1Y3QgaXBfY29ubnRyYWNrX3Byb3RvY29sIGlwX2Nvbm50cmFja19wcm90b2NvbF90Y3AgPQotewotCS5wcm90byAJCQk9IElQUFJPVE9fVENQLAotCS5uYW1lIAkJCT0gInRjcCIsCi0JLnBrdF90b190dXBsZSAJCT0gdGNwX3BrdF90b190dXBsZSwKLQkuaW52ZXJ0X3R1cGxlIAkJPSB0Y3BfaW52ZXJ0X3R1cGxlLAotCS5wcmludF90dXBsZSAJCT0gdGNwX3ByaW50X3R1cGxlLAotCS5wcmludF9jb25udHJhY2sgCT0gdGNwX3ByaW50X2Nvbm50cmFjaywKLQkucGFja2V0IAkJPSB0Y3BfcGFja2V0LAotCS5uZXcgCQkJPSB0Y3BfbmV3LAotCS5lcnJvcgkJCT0gdGNwX2Vycm9yLAotI2lmIGRlZmluZWQoQ09ORklHX0lQX05GX0NPTk5UUkFDS19ORVRMSU5LKSB8fCBcCi0gICAgZGVmaW5lZChDT05GSUdfSVBfTkZfQ09OTlRSQUNLX05FVExJTktfTU9EVUxFKQotCS50b19uZmF0dHIJCT0gdGNwX3RvX25mYXR0ciwKLQkuZnJvbV9uZmF0dHIJCT0gbmZhdHRyX3RvX3RjcCwKLQkudHVwbGVfdG9fbmZhdHRyCT0gaXBfY3RfcG9ydF90dXBsZV90b19uZmF0dHIsCi0JLm5mYXR0cl90b190dXBsZQk9IGlwX2N0X3BvcnRfbmZhdHRyX3RvX3R1cGxlLAotI2VuZGlmCi19OwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19wcm90b191ZHAuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfcHJvdG9fdWRwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0YzMwYzYuLjAwMDAwMDAKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19wcm90b191ZHAuYworKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKiAoQykgMTk5OS0yMDAxIFBhdWwgYFJ1c3R5JyBSdXNzZWxsCi0gKiAoQykgMjAwMi0yMDA0IE5ldGZpbHRlciBDb3JlIFRlYW0gPGNvcmV0ZWFtQG5ldGZpbHRlci5vcmc+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC90aW1lci5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgotI2luY2x1ZGUgPGxpbnV4L2luLmg+Ci0jaW5jbHVkZSA8bGludXgvaXAuaD4KLSNpbmNsdWRlIDxsaW51eC91ZHAuaD4KLSNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgotI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX3Byb3RvY29sLmg+Ci0KLXVuc2lnbmVkIGludCBpcF9jdF91ZHBfdGltZW91dCBfX3JlYWRfbW9zdGx5ID0gMzAqSFo7Ci11bnNpZ25lZCBpbnQgaXBfY3RfdWRwX3RpbWVvdXRfc3RyZWFtIF9fcmVhZF9tb3N0bHkgPSAxODAqSFo7Ci0KLXN0YXRpYyBpbnQgdWRwX3BrdF90b190dXBsZShjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJICAgICB1bnNpZ25lZCBpbnQgZGF0YW9mZiwKLQkJCSAgICAgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUpCi17Ci0Jc3RydWN0IHVkcGhkciBfaGRyLCAqaHA7Ci0KLQkvKiBBY3R1YWxseSBvbmx5IG5lZWQgZmlyc3QgOCBieXRlcy4gKi8KLQlocCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIGRhdGFvZmYsIHNpemVvZihfaGRyKSwgJl9oZHIpOwotCWlmIChocCA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLQotCXR1cGxlLT5zcmMudS51ZHAucG9ydCA9IGhwLT5zb3VyY2U7Ci0JdHVwbGUtPmRzdC51LnVkcC5wb3J0ID0gaHAtPmRlc3Q7Ci0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCB1ZHBfaW52ZXJ0X3R1cGxlKHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnR1cGxlLAotCQkJICAgIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKm9yaWcpCi17Ci0JdHVwbGUtPnNyYy51LnVkcC5wb3J0ID0gb3JpZy0+ZHN0LnUudWRwLnBvcnQ7Ci0JdHVwbGUtPmRzdC51LnVkcC5wb3J0ID0gb3JpZy0+c3JjLnUudWRwLnBvcnQ7Ci0JcmV0dXJuIDE7Ci19Ci0KLS8qIFByaW50IG91dCB0aGUgcGVyLXByb3RvY29sIHBhcnQgb2YgdGhlIHR1cGxlLiAqLwotc3RhdGljIGludCB1ZHBfcHJpbnRfdHVwbGUoc3RydWN0IHNlcV9maWxlICpzLAotCQkJICAgY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUpCi17Ci0JcmV0dXJuIHNlcV9wcmludGYocywgInNwb3J0PSVodSBkcG9ydD0laHUgIiwKLQkJCSAgbnRvaHModHVwbGUtPnNyYy51LnVkcC5wb3J0KSwKLQkJCSAgbnRvaHModHVwbGUtPmRzdC51LnVkcC5wb3J0KSk7Ci19Ci0KLS8qIFByaW50IG91dCB0aGUgcHJpdmF0ZSBwYXJ0IG9mIHRoZSBjb25udHJhY2suICovCi1zdGF0aWMgaW50IHVkcF9wcmludF9jb25udHJhY2soc3RydWN0IHNlcV9maWxlICpzLAotCQkJICAgICAgIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2sgKmNvbm50cmFjaykKLXsKLQlyZXR1cm4gMDsKLX0KLQotLyogUmV0dXJucyB2ZXJkaWN0IGZvciBwYWNrZXQsIGFuZCBtYXkgbW9kaWZ5IGNvbm50cmFja3R5cGUgKi8KLXN0YXRpYyBpbnQgdWRwX3BhY2tldChzdHJ1Y3QgaXBfY29ubnRyYWNrICpjb25udHJhY2ssCi0JCSAgICAgIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0JCSAgICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvKQotewotCS8qIElmIHdlJ3ZlIHNlZW4gdHJhZmZpYyBib3RoIHdheXMsIHRoaXMgaXMgc29tZSBraW5kIG9mIFVEUAotCSAgIHN0cmVhbS4gIEV4dGVuZCB0aW1lb3V0LiAqLwotCWlmICh0ZXN0X2JpdChJUFNfU0VFTl9SRVBMWV9CSVQsICZjb25udHJhY2stPnN0YXR1cykpIHsKLQkJaXBfY3RfcmVmcmVzaF9hY2N0KGNvbm50cmFjaywgY3RpbmZvLCBza2IsCi0JCQkJICAgaXBfY3RfdWRwX3RpbWVvdXRfc3RyZWFtKTsKLQkJLyogQWxzbywgbW9yZSBsaWtlbHkgdG8gYmUgaW1wb3J0YW50LCBhbmQgbm90IGEgcHJvYmUgKi8KLQkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KElQU19BU1NVUkVEX0JJVCwgJmNvbm50cmFjay0+c3RhdHVzKSkKLQkJCWlwX2Nvbm50cmFja19ldmVudF9jYWNoZShJUENUX1NUQVRVUywgc2tiKTsKLQl9IGVsc2UKLQkJaXBfY3RfcmVmcmVzaF9hY2N0KGNvbm50cmFjaywgY3RpbmZvLCBza2IsIGlwX2N0X3VkcF90aW1lb3V0KTsKLQotCXJldHVybiBORl9BQ0NFUFQ7Ci19Ci0KLS8qIENhbGxlZCB3aGVuIGEgbmV3IGNvbm5lY3Rpb24gZm9yIHRoaXMgcHJvdG9jb2wgZm91bmQuICovCi1zdGF0aWMgaW50IHVkcF9uZXcoc3RydWN0IGlwX2Nvbm50cmFjayAqY29ubnRyYWNrLCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCXJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IHVkcF9lcnJvcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBlbnVtIGlwX2Nvbm50cmFja19pbmZvICpjdGluZm8sCi0JCSAgICAgdW5zaWduZWQgaW50IGhvb2tudW0pCi17Ci0Jc3RydWN0IGlwaGRyICppcGggPSBza2ItPm5oLmlwaDsKLQl1bnNpZ25lZCBpbnQgdWRwbGVuID0gc2tiLT5sZW4gLSBpcGgtPmlobCAqIDQ7Ci0Jc3RydWN0IHVkcGhkciBfaGRyLCAqaGRyOwotCi0JLyogSGVhZGVyIGlzIHRvbyBzbWFsbD8gKi8KLQloZHIgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBpcGgtPmlobCo0LCBzaXplb2YoX2hkciksICZfaGRyKTsKLQlpZiAoaGRyID09IE5VTEwpIHsKLQkJaWYgKExPR19JTlZBTElEKElQUFJPVE9fVURQKSkKLQkJCW5mX2xvZ19wYWNrZXQoUEZfSU5FVCwgMCwgc2tiLCBOVUxMLCBOVUxMLCBOVUxMLAotCQkJCSAgImlwX2N0X3VkcDogc2hvcnQgcGFja2V0ICIpOwotCQlyZXR1cm4gLU5GX0FDQ0VQVDsKLQl9Ci0KLQkvKiBUcnVuY2F0ZWQvbWFsZm9ybWVkIHBhY2tldHMgKi8KLQlpZiAobnRvaHMoaGRyLT5sZW4pID4gdWRwbGVuIHx8IG50b2hzKGhkci0+bGVuKSA8IHNpemVvZigqaGRyKSkgewotCQlpZiAoTE9HX0lOVkFMSUQoSVBQUk9UT19VRFApKQotCQkJbmZfbG9nX3BhY2tldChQRl9JTkVULCAwLCBza2IsIE5VTEwsIE5VTEwsIE5VTEwsCi0JCQkJICAiaXBfY3RfdWRwOiB0cnVuY2F0ZWQvbWFsZm9ybWVkIHBhY2tldCAiKTsKLQkJcmV0dXJuIC1ORl9BQ0NFUFQ7Ci0JfQotCi0JLyogUGFja2V0IHdpdGggbm8gY2hlY2tzdW0gKi8KLQlpZiAoIWhkci0+Y2hlY2spCi0JCXJldHVybiBORl9BQ0NFUFQ7Ci0KLQkvKiBDaGVja3N1bSBpbnZhbGlkPyBJZ25vcmUuCi0JICogV2Ugc2tpcCBjaGVja2luZyBwYWNrZXRzIG9uIHRoZSBvdXRnb2luZyBwYXRoCi0JICogYmVjYXVzZSB0aGUgY2hlY2tzdW0gaXMgYXNzdW1lZCB0byBiZSBjb3JyZWN0LgotCSAqIEZJWE1FOiBTb3VyY2Ugcm91dGUgSVAgb3B0aW9uIHBhY2tldHMgLS1SUiAqLwotCWlmIChpcF9jb25udHJhY2tfY2hlY2tzdW0gJiYgaG9va251bSA9PSBORl9JUF9QUkVfUk9VVElORyAmJgotCSAgICBuZl9pcF9jaGVja3N1bShza2IsIGhvb2tudW0sIGlwaC0+aWhsICogNCwgSVBQUk9UT19VRFApKSB7Ci0JCWlmIChMT0dfSU5WQUxJRChJUFBST1RPX1VEUCkpCi0JCQluZl9sb2dfcGFja2V0KFBGX0lORVQsIDAsIHNrYiwgTlVMTCwgTlVMTCwgTlVMTCwKLQkJCQkgICJpcF9jdF91ZHA6IGJhZCBVRFAgY2hlY2tzdW0gIik7Ci0JCXJldHVybiAtTkZfQUNDRVBUOwotCX0KLQotCXJldHVybiBORl9BQ0NFUFQ7Ci19Ci0KLXN0cnVjdCBpcF9jb25udHJhY2tfcHJvdG9jb2wgaXBfY29ubnRyYWNrX3Byb3RvY29sX3VkcCA9Ci17Ci0JLnByb3RvIAkJCT0gSVBQUk9UT19VRFAsCi0JLm5hbWUJCQk9ICJ1ZHAiLAotCS5wa3RfdG9fdHVwbGUJCT0gdWRwX3BrdF90b190dXBsZSwKLQkuaW52ZXJ0X3R1cGxlCQk9IHVkcF9pbnZlcnRfdHVwbGUsCi0JLnByaW50X3R1cGxlCQk9IHVkcF9wcmludF90dXBsZSwKLQkucHJpbnRfY29ubnRyYWNrCT0gdWRwX3ByaW50X2Nvbm50cmFjaywKLQkucGFja2V0CQkJPSB1ZHBfcGFja2V0LAotCS5uZXcJCQk9IHVkcF9uZXcsCi0JLmVycm9yCQkJPSB1ZHBfZXJyb3IsCi0jaWYgZGVmaW5lZChDT05GSUdfSVBfTkZfQ09OTlRSQUNLX05FVExJTkspIHx8IFwKLSAgICBkZWZpbmVkKENPTkZJR19JUF9ORl9DT05OVFJBQ0tfTkVUTElOS19NT0RVTEUpCi0JLnR1cGxlX3RvX25mYXR0cgk9IGlwX2N0X3BvcnRfdHVwbGVfdG9fbmZhdHRyLAotCS5uZmF0dHJfdG9fdHVwbGUJPSBpcF9jdF9wb3J0X25mYXR0cl90b190dXBsZSwKLSNlbmRpZgotfTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfc2lwLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX3NpcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTlhOTYyLi4wMDAwMDAwCi0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfc2lwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MjAgKzAsMCBAQAotLyogU0lQIGV4dGVuc2lvbiBmb3IgSVAgY29ubmVjdGlvbiB0cmFja2luZy4KLSAqCi0gKiAoQykgMjAwNSBieSBDaHJpc3RpYW4gSGVudHNjaGVsIDxjaGVudHNjaGVsQGFybmV0LmNvbS5hcj4KLSAqIGJhc2VkIG9uIFJSJ3MgaXBfY29ubnRyYWNrX2Z0cC5jIGFuZCBvdGhlciBtb2R1bGVzLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0jaW5jbHVkZSA8bGludXgvaW4uaD4KLSNpbmNsdWRlIDxsaW51eC9pcC5oPgotI2luY2x1ZGUgPGxpbnV4L3VkcC5oPgotCi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfaGVscGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX3NpcC5oPgotCi0jaWYgMAotI2RlZmluZSBERUJVR1AgcHJpbnRrCi0jZWxzZQotI2RlZmluZSBERUJVR1AoZm9ybWF0LCBhcmdzLi4uKQotI2VuZGlmCi0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9BVVRIT1IoIkNocmlzdGlhbiBIZW50c2NoZWwgPGNoZW50c2NoZWxAYXJuZXQuY29tLmFyPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJTSVAgY29ubmVjdGlvbiB0cmFja2luZyBoZWxwZXIiKTsKLQotI2RlZmluZSBNQVhfUE9SVFMJOAotc3RhdGljIHVuc2lnbmVkIHNob3J0IHBvcnRzW01BWF9QT1JUU107Ci1zdGF0aWMgaW50IHBvcnRzX2M7Ci1tb2R1bGVfcGFyYW1fYXJyYXkocG9ydHMsIHVzaG9ydCwgJnBvcnRzX2MsIDA0MDApOwotTU9EVUxFX1BBUk1fREVTQyhwb3J0cywgInBvcnQgbnVtYmVycyBvZiBzaXAgc2VydmVycyIpOwotCi1zdGF0aWMgdW5zaWduZWQgaW50IHNpcF90aW1lb3V0ID0gU0lQX1RJTUVPVVQ7Ci1tb2R1bGVfcGFyYW0oc2lwX3RpbWVvdXQsIHVpbnQsIDA2MDApOwotTU9EVUxFX1BBUk1fREVTQyhzaXBfdGltZW91dCwgInRpbWVvdXQgZm9yIHRoZSBtYXN0ZXIgU0lQIHNlc3Npb24iKTsKLQotdW5zaWduZWQgaW50ICgqaXBfbmF0X3NpcF9ob29rKShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCi0JCQkJZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCi0JCQkJc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsCi0JCQkJY29uc3QgY2hhciAqKmRwdHIpOwotRVhQT1JUX1NZTUJPTF9HUEwoaXBfbmF0X3NpcF9ob29rKTsKLQotdW5zaWduZWQgaW50ICgqaXBfbmF0X3NkcF9ob29rKShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCi0JCQkJZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCi0JCQkJc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmV4cCwKLQkJCQljb25zdCBjaGFyICpkcHRyKTsKLUVYUE9SVF9TWU1CT0xfR1BMKGlwX25hdF9zZHBfaG9vayk7Ci0KLXN0YXRpYyBpbnQgZGlnaXRzX2xlbihjb25zdCBjaGFyICpkcHRyLCBjb25zdCBjaGFyICpsaW1pdCwgaW50ICpzaGlmdCk7Ci1zdGF0aWMgaW50IGVwYWRkcl9sZW4oY29uc3QgY2hhciAqZHB0ciwgY29uc3QgY2hhciAqbGltaXQsIGludCAqc2hpZnQpOwotc3RhdGljIGludCBza3BfZGlnaXRzX2xlbihjb25zdCBjaGFyICpkcHRyLCBjb25zdCBjaGFyICpsaW1pdCwgaW50ICpzaGlmdCk7Ci1zdGF0aWMgaW50IHNrcF9lcGFkZHJfbGVuKGNvbnN0IGNoYXIgKmRwdHIsIGNvbnN0IGNoYXIgKmxpbWl0LCBpbnQgKnNoaWZ0KTsKLQotc3RydWN0IHNpcF9oZWFkZXJfbmZvIHsKLQljb25zdCBjaGFyCSpsbmFtZTsKLQljb25zdCBjaGFyCSpzbmFtZTsKLQljb25zdCBjaGFyCSpsbl9zdHI7Ci0Jc2l6ZV90CQlsbmxlbjsKLQlzaXplX3QJCXNubGVuOwotCXNpemVfdAkJbG5fc3RybGVuOwotCWludAkJY2FzZV9zZW5zaXRpdmU7Ci0JaW50CQkoKm1hdGNoX2xlbikoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGludCAqKTsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc2lwX2hlYWRlcl9uZm8gY3Rfc2lwX2hkcnNbXSA9IHsKLQlbUE9TX1JFR19SRVFfVVJJXSA9IHsgCS8qIFNJUCBSRUdJU1RFUiByZXF1ZXN0IFVSSSAqLwotCQkubG5hbWUJCT0gInNpcDoiLAotCQkubG5sZW4JCT0gc2l6ZW9mKCJzaXA6IikgLSAxLAotCQkubG5fc3RyCQk9ICI6IiwKLQkJLmxuX3N0cmxlbgk9IHNpemVvZigiOiIpIC0gMSwKLQkJLm1hdGNoX2xlbgk9IGVwYWRkcl9sZW4KLQl9LAotCVtQT1NfUkVRX1VSSV0gPSB7IAkvKiBTSVAgcmVxdWVzdCBVUkkgKi8KLQkJLmxuYW1lCQk9ICJzaXA6IiwKLQkJLmxubGVuCQk9IHNpemVvZigic2lwOiIpIC0gMSwKLQkJLmxuX3N0cgkJPSAiQCIsCi0JCS5sbl9zdHJsZW4JPSBzaXplb2YoIkAiKSAtIDEsCi0JCS5tYXRjaF9sZW4JPSBlcGFkZHJfbGVuCi0JfSwKLQlbUE9TX0ZST01dID0gewkJLyogU0lQIEZyb20gaGVhZGVyICovCi0JCS5sbmFtZQkJPSAiRnJvbToiLAotCQkubG5sZW4JCT0gc2l6ZW9mKCJGcm9tOiIpIC0gMSwKLQkJLnNuYW1lCQk9ICJcclxuZjoiLAotCQkuc25sZW4JCT0gc2l6ZW9mKCJcclxuZjoiKSAtIDEsCi0JCS5sbl9zdHIJCT0gInNpcDoiLAotCQkubG5fc3RybGVuCT0gc2l6ZW9mKCJzaXA6IikgLSAxLAotCQkubWF0Y2hfbGVuCT0gc2twX2VwYWRkcl9sZW4sCi0JfSwKLQlbUE9TX1RPXSA9IHsJCS8qIFNJUCBUbyBoZWFkZXIgKi8KLQkJLmxuYW1lCQk9ICJUbzoiLAotCQkubG5sZW4JCT0gc2l6ZW9mKCJUbzoiKSAtIDEsCi0JCS5zbmFtZQkJPSAiXHJcbnQ6IiwKLQkJLnNubGVuCQk9IHNpemVvZigiXHJcbnQ6IikgLSAxLAotCQkubG5fc3RyCQk9ICJzaXA6IiwKLQkJLmxuX3N0cmxlbgk9IHNpemVvZigic2lwOiIpIC0gMSwKLQkJLm1hdGNoX2xlbgk9IHNrcF9lcGFkZHJfbGVuLAotCX0sCi0JW1BPU19WSUFdID0geyAJCS8qIFNJUCBWaWEgaGVhZGVyICovCi0JCS5sbmFtZQkJPSAiVmlhOiIsCi0JCS5sbmxlbgkJPSBzaXplb2YoIlZpYToiKSAtIDEsCi0JCS5zbmFtZQkJPSAiXHJcbnY6IiwKLQkJLnNubGVuCQk9IHNpemVvZigiXHJcbnY6IikgLSAxLCAvKiByZmMzMjYxICJcclxuIiAqLwotCQkubG5fc3RyCQk9ICJVRFAgIiwKLQkJLmxuX3N0cmxlbgk9IHNpemVvZigiVURQICIpIC0gMSwKLQkJLm1hdGNoX2xlbgk9IGVwYWRkcl9sZW4sCi0JfSwKLQlbUE9TX0NPTlRBQ1RdID0geyAJLyogU0lQIENvbnRhY3QgaGVhZGVyICovCi0JCS5sbmFtZQkJPSAiQ29udGFjdDoiLAotCQkubG5sZW4JCT0gc2l6ZW9mKCJDb250YWN0OiIpIC0gMSwKLQkJLnNuYW1lCQk9ICJcclxubToiLAotCQkuc25sZW4JCT0gc2l6ZW9mKCJcclxubToiKSAtIDEsCi0JCS5sbl9zdHIJCT0gInNpcDoiLAotCQkubG5fc3RybGVuCT0gc2l6ZW9mKCJzaXA6IikgLSAxLAotCQkubWF0Y2hfbGVuCT0gc2twX2VwYWRkcl9sZW4KLQl9LAotCVtQT1NfQ09OVEVOVF0gPSB7IAkvKiBTSVAgQ29udGVudCBsZW5ndGggaGVhZGVyICovCi0JCS5sbmFtZQkJPSAiQ29udGVudC1MZW5ndGg6IiwKLQkJLmxubGVuCQk9IHNpemVvZigiQ29udGVudC1MZW5ndGg6IikgLSAxLAotCQkuc25hbWUJCT0gIlxyXG5sOiIsCi0JCS5zbmxlbgkJPSBzaXplb2YoIlxyXG5sOiIpIC0gMSwKLQkJLmxuX3N0cgkJPSAiOiIsCi0JCS5sbl9zdHJsZW4JPSBzaXplb2YoIjoiKSAtIDEsCi0JCS5tYXRjaF9sZW4JPSBza3BfZGlnaXRzX2xlbgotCX0sCi0JW1BPU19NRURJQV0gPSB7CQkvKiBTRFAgbWVkaWEgaW5mbyAqLwotCQkuY2FzZV9zZW5zaXRpdmUJPSAxLAotCQkubG5hbWUJCT0gIlxubT0iLAotCQkubG5sZW4JCT0gc2l6ZW9mKCJcbm09IikgLSAxLAotCQkuc25hbWUJCT0gIlxybT0iLAotCQkuc25sZW4JCT0gc2l6ZW9mKCJccm09IikgLSAxLAotCQkubG5fc3RyCQk9ICJhdWRpbyAiLAotCQkubG5fc3RybGVuCT0gc2l6ZW9mKCJhdWRpbyAiKSAtIDEsCi0JCS5tYXRjaF9sZW4JPSBkaWdpdHNfbGVuCi0JfSwKLQlbUE9TX09XTkVSXSA9IHsgCS8qIFNEUCBvd25lciBhZGRyZXNzKi8KLQkJLmNhc2Vfc2Vuc2l0aXZlCT0gMSwKLQkJLmxuYW1lCQk9ICJcbm89IiwKLQkJLmxubGVuCQk9IHNpemVvZigiXG5vPSIpIC0gMSwKLQkJLnNuYW1lCQk9ICJccm89IiwKLQkJLnNubGVuCQk9IHNpemVvZigiXHJvPSIpIC0gMSwKLQkJLmxuX3N0cgkJPSAiSU4gSVA0ICIsCi0JCS5sbl9zdHJsZW4JPSBzaXplb2YoIklOIElQNCAiKSAtIDEsCi0JCS5tYXRjaF9sZW4JPSBlcGFkZHJfbGVuCi0JfSwKLQlbUE9TX0NPTk5FQ1RJT05dID0geyAJLyogU0RQIGNvbm5lY3Rpb24gaW5mbyAqLwotCQkuY2FzZV9zZW5zaXRpdmUJPSAxLAotCQkubG5hbWUJCT0gIlxuYz0iLAotCQkubG5sZW4JCT0gc2l6ZW9mKCJcbmM9IikgLSAxLAotCQkuc25hbWUJCT0gIlxyYz0iLAotCQkuc25sZW4JCT0gc2l6ZW9mKCJccmM9IikgLSAxLAotCQkubG5fc3RyCQk9ICJJTiBJUDQgIiwKLQkJLmxuX3N0cmxlbgk9IHNpemVvZigiSU4gSVA0ICIpIC0gMSwKLQkJLm1hdGNoX2xlbgk9IGVwYWRkcl9sZW4KLQl9LAotCVtQT1NfU0RQX0hFQURFUl0gPSB7IAkvKiBTRFAgdmVyc2lvbiBoZWFkZXIgKi8KLQkJLmNhc2Vfc2Vuc2l0aXZlCT0gMSwKLQkJLmxuYW1lCQk9ICJcbnY9IiwKLQkJLmxubGVuCQk9IHNpemVvZigiXG52PSIpIC0gMSwKLQkJLnNuYW1lCQk9ICJccnY9IiwKLQkJLnNubGVuCQk9IHNpemVvZigiXHJ2PSIpIC0gMSwKLQkJLmxuX3N0cgkJPSAiPSIsCi0JCS5sbl9zdHJsZW4JPSBzaXplb2YoIj0iKSAtIDEsCi0JCS5tYXRjaF9sZW4JPSBkaWdpdHNfbGVuCi0JfQotfTsKLQotLyogZ2V0IGxpbmUgbGVuZ2h0IHVudGlsIGZpcnN0IENSIG9yIExGIHNlZW4uICovCi1pbnQgY3Rfc2lwX2xubGVuKGNvbnN0IGNoYXIgKmxpbmUsIGNvbnN0IGNoYXIgKmxpbWl0KQotewotCWNvbnN0IGNoYXIgKmsgPSBsaW5lOwotCi0Jd2hpbGUgKChsaW5lIDw9IGxpbWl0KSAmJiAoKmxpbmUgPT0gJ1xyJyB8fCAqbGluZSA9PSAnXG4nKSkKLQkJbGluZSsrOwotCi0Jd2hpbGUgKGxpbmUgPD0gbGltaXQpIHsKLQkJaWYgKCpsaW5lID09ICdccicgfHwgKmxpbmUgPT0gJ1xuJykKLQkJCWJyZWFrOwotCQlsaW5lKys7Ci0JfQotCXJldHVybiBsaW5lIC0gazsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGN0X3NpcF9sbmxlbik7Ci0KLS8qIExpbmVhciBzdHJpbmcgc2VhcmNoLCBjYXNlIHNlbnNpdGl2ZS4gKi8KLWNvbnN0IGNoYXIgKmN0X3NpcF9zZWFyY2goY29uc3QgY2hhciAqbmVlZGxlLCBjb25zdCBjaGFyICpoYXlzdGFjaywKLQkJCSAgc2l6ZV90IG5lZWRsZV9sZW4sIHNpemVfdCBoYXlzdGFja19sZW4sCi0JCQkgIGludCBjYXNlX3NlbnNpdGl2ZSkKLXsKLQljb25zdCBjaGFyICpsaW1pdCA9IGhheXN0YWNrICsgKGhheXN0YWNrX2xlbiAtIG5lZWRsZV9sZW4pOwotCi0Jd2hpbGUgKGhheXN0YWNrIDw9IGxpbWl0KSB7Ci0JCWlmIChjYXNlX3NlbnNpdGl2ZSkgewotCQkJaWYgKHN0cm5jbXAoaGF5c3RhY2ssIG5lZWRsZSwgbmVlZGxlX2xlbikgPT0gMCkKLQkJCQlyZXR1cm4gaGF5c3RhY2s7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoc3RybmljbXAoaGF5c3RhY2ssIG5lZWRsZSwgbmVlZGxlX2xlbikgPT0gMCkKLQkJCQlyZXR1cm4gaGF5c3RhY2s7Ci0JCX0KLQkJaGF5c3RhY2srKzsKLQl9Ci0JcmV0dXJuIE5VTEw7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChjdF9zaXBfc2VhcmNoKTsKLQotc3RhdGljIGludCBkaWdpdHNfbGVuKGNvbnN0IGNoYXIgKmRwdHIsIGNvbnN0IGNoYXIgKmxpbWl0LCBpbnQgKnNoaWZ0KQotewotCWludCBsZW4gPSAwOwotCXdoaWxlIChkcHRyIDw9IGxpbWl0ICYmIGlzZGlnaXQoKmRwdHIpKSB7Ci0JCWRwdHIrKzsKLQkJbGVuKys7Ci0JfQotCXJldHVybiBsZW47Ci19Ci0KLS8qIGdldCBkaWdpdHMgbGVuZ2h0LCBza2lwaW5nIGJsYW5rIHNwYWNlcy4gKi8KLXN0YXRpYyBpbnQgc2twX2RpZ2l0c19sZW4oY29uc3QgY2hhciAqZHB0ciwgY29uc3QgY2hhciAqbGltaXQsIGludCAqc2hpZnQpCi17Ci0JZm9yICg7IGRwdHIgPD0gbGltaXQgJiYgKmRwdHIgPT0gJyAnOyBkcHRyKyspCi0JCSgqc2hpZnQpKys7Ci0KLQlyZXR1cm4gZGlnaXRzX2xlbihkcHRyLCBsaW1pdCwgc2hpZnQpOwotfQotCi0vKiBTaW1wbGUgaXBhZGRyIHBhcnNlci4uICovCi1zdGF0aWMgaW50IHBhcnNlX2lwYWRkcihjb25zdCBjaGFyICpjcCwJY29uc3QgY2hhciAqKmVuZHAsCi0JCQlfX2JlMzIgKmlwYWRkciwgY29uc3QgY2hhciAqbGltaXQpCi17Ci0JdW5zaWduZWQgbG9uZyBpbnQgdmFsOwotCWludCBpLCBkaWdpdCA9IDA7Ci0KLQlmb3IgKGkgPSAwLCAqaXBhZGRyID0gMDsgY3AgPD0gbGltaXQgJiYgaSA8IDQ7IGkrKykgewotCQlkaWdpdCA9IDA7Ci0JCWlmICghaXNkaWdpdCgqY3ApKQotCQkJYnJlYWs7Ci0KLQkJdmFsID0gc2ltcGxlX3N0cnRvdWwoY3AsIChjaGFyICoqKSZjcCwgMTApOwotCQlpZiAodmFsID4gMHhGRikKLQkJCXJldHVybiAtMTsKLQotCQkoKHVfaW50OF90ICopaXBhZGRyKVtpXSA9IHZhbDsKLQkJZGlnaXQgPSAxOwotCi0JCWlmICgqY3AgIT0gJy4nKQotCQkJYnJlYWs7Ci0JCWNwKys7Ci0JfQotCWlmICghZGlnaXQpCi0JCXJldHVybiAtMTsKLQotCWlmIChlbmRwKQotCQkqZW5kcCA9IGNwOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIHNraXAgaXAgYWRkcmVzcy4gcmV0dXJucyBpdCBsZW5naHQuICovCi1zdGF0aWMgaW50IGVwYWRkcl9sZW4oY29uc3QgY2hhciAqZHB0ciwgY29uc3QgY2hhciAqbGltaXQsIGludCAqc2hpZnQpCi17Ci0JY29uc3QgY2hhciAqYXV4ID0gZHB0cjsKLQlfX2JlMzIgaXA7Ci0KLQlpZiAocGFyc2VfaXBhZGRyKGRwdHIsICZkcHRyLCAmaXAsIGxpbWl0KSA8IDApIHsKLQkJREVCVUdQKCJpcDogJXMgcGFyc2UgZmFpbGVkLiFcbiIsIGRwdHIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKiBQb3J0IG51bWJlciAqLwotCWlmICgqZHB0ciA9PSAnOicpIHsKLQkJZHB0cisrOwotCQlkcHRyICs9IGRpZ2l0c19sZW4oZHB0ciwgbGltaXQsIHNoaWZ0KTsKLQl9Ci0JcmV0dXJuIGRwdHIgLSBhdXg7Ci19Ci0KLS8qIGdldCBhZGRyZXNzIGxlbmd0aCwgc2tpcGluZyB1c2VyIGluZm8uICovCi1zdGF0aWMgaW50IHNrcF9lcGFkZHJfbGVuKGNvbnN0IGNoYXIgKmRwdHIsIGNvbnN0IGNoYXIgKmxpbWl0LCBpbnQgKnNoaWZ0KQotewotCWludCBzID0gKnNoaWZ0OwotCi0JLyogU2VhcmNoIGZvciBALCBidXQgc3RvcCBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lLgotCSAqIFdlIGFyZSBpbnNpZGUgYSBzaXA6IFVSSSwgc28gd2UgZG9uJ3QgbmVlZCB0byB3b3JyeSBhYm91dAotCSAqIGNvbnRpbnVhdGlvbiBsaW5lcy4gKi8KLQl3aGlsZSAoZHB0ciA8PSBsaW1pdCAmJgotCSAgICAgICAqZHB0ciAhPSAnQCcgJiYgKmRwdHIgIT0gJ1xyJyAmJiAqZHB0ciAhPSAnXG4nKSB7Ci0JCSgqc2hpZnQpKys7Ci0JCWRwdHIrKzsKLQl9Ci0KLQlpZiAoZHB0ciA8PSBsaW1pdCAmJiAqZHB0ciA9PSAnQCcpIHsKLQkJZHB0cisrOwotCQkoKnNoaWZ0KSsrOwotCX0gZWxzZQotCQkqc2hpZnQgPSBzOwotCi0JcmV0dXJuIGVwYWRkcl9sZW4oZHB0ciwgbGltaXQsIHNoaWZ0KTsKLX0KLQotLyogUmV0dXJucyAwIGlmIG5vdCBmb3VuZCwgLTEgZXJyb3IgcGFyc2luZy4gKi8KLWludCBjdF9zaXBfZ2V0X2luZm8oY29uc3QgY2hhciAqZHB0ciwgc2l6ZV90IGRsZW4sCi0JCSAgICB1bnNpZ25lZCBpbnQgKm1hdGNob2ZmLAotCQkgICAgdW5zaWduZWQgaW50ICptYXRjaGxlbiwKLQkJICAgIGVudW0gc2lwX2hlYWRlcl9wb3MgcG9zKQotewotCXN0cnVjdCBzaXBfaGVhZGVyX25mbyAqaG5mbyA9ICZjdF9zaXBfaGRyc1twb3NdOwotCWNvbnN0IGNoYXIgKmxpbWl0LCAqYXV4LCAqayA9IGRwdHI7Ci0JaW50IHNoaWZ0ID0gMDsKLQotCWxpbWl0ID0gZHB0ciArIChkbGVuIC0gaG5mby0+bG5sZW4pOwotCi0Jd2hpbGUgKGRwdHIgPD0gbGltaXQpIHsKLQkJaWYgKChzdHJuY21wKGRwdHIsIGhuZm8tPmxuYW1lLCBobmZvLT5sbmxlbikgIT0gMCkgJiYKLQkJICAgIChobmZvLT5zbmFtZSA9PSBOVUxMIHx8Ci0JCSAgICAgc3RybmNtcChkcHRyLCBobmZvLT5zbmFtZSwgaG5mby0+c25sZW4pICE9IDApKSB7Ci0JCQlkcHRyKys7Ci0JCQljb250aW51ZTsKLQkJfQotCQlhdXggPSBjdF9zaXBfc2VhcmNoKGhuZm8tPmxuX3N0ciwgZHB0ciwgaG5mby0+bG5fc3RybGVuLAotCQkJCSAgICBjdF9zaXBfbG5sZW4oZHB0ciwgbGltaXQpLAotCQkJCSAgICBobmZvLT5jYXNlX3NlbnNpdGl2ZSk7Ci0JCWlmICghYXV4KSB7Ci0JCQlERUJVR1AoIiclcycgbm90IGZvdW5kIGluICclcycuXG4iLCBobmZvLT5sbl9zdHIsCi0JCQkgICAgICAgaG5mby0+bG5hbWUpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWF1eCArPSBobmZvLT5sbl9zdHJsZW47Ci0KLQkJKm1hdGNobGVuID0gaG5mby0+bWF0Y2hfbGVuKGF1eCwgbGltaXQsICZzaGlmdCk7Ci0JCWlmICghKm1hdGNobGVuKQotCQkJcmV0dXJuIC0xOwotCi0JCSptYXRjaG9mZiA9IChhdXggLSBrKSArIHNoaWZ0OwotCi0JCURFQlVHUCgiJXMgbWF0Y2ggc3VjY2VlZGVkISAtIGxlbjogJXVcbiIsIGhuZm8tPmxuYW1lLAotCQkgICAgICAgKm1hdGNobGVuKTsKLQkJcmV0dXJuIDE7Ci0JfQotCURFQlVHUCgiJXMgaGVhZGVyIG5vdCBmb3VuZC5cbiIsIGhuZm8tPmxuYW1lKTsKLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGN0X3NpcF9nZXRfaW5mbyk7Ci0KLXN0YXRpYyBpbnQgc2V0X2V4cGVjdGVkX3J0cChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCi0JCQkgICAgc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsCi0JCQkgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCi0JCQkgICAgX19iZTMyIGlwYWRkciwgdV9pbnQxNl90IHBvcnQsCi0JCQkgICAgY29uc3QgY2hhciAqZHB0cikKLXsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqZXhwOwotCWVudW0gaXBfY29ubnRyYWNrX2RpciBkaXIgPSBDVElORk8yRElSKGN0aW5mbyk7Ci0JaW50IHJldDsKLQl0eXBlb2YoaXBfbmF0X3NkcF9ob29rKSBpcF9uYXRfc2RwOwotCi0JZXhwID0gaXBfY29ubnRyYWNrX2V4cGVjdF9hbGxvYyhjdCk7Ci0JaWYgKGV4cCA9PSBOVUxMKQotCQlyZXR1cm4gTkZfRFJPUDsKLQotCWV4cC0+dHVwbGUuc3JjLmlwID0gY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5zcmMuaXA7Ci0JZXhwLT50dXBsZS5zcmMudS51ZHAucG9ydCA9IDA7Ci0JZXhwLT50dXBsZS5kc3QuaXAgPSBpcGFkZHI7Ci0JZXhwLT50dXBsZS5kc3QudS51ZHAucG9ydCA9IGh0b25zKHBvcnQpOwotCWV4cC0+dHVwbGUuZHN0LnByb3RvbnVtID0gSVBQUk9UT19VRFA7Ci0KLQlleHAtPm1hc2suc3JjLmlwID0gaHRvbmwoMHhGRkZGRkZGRik7Ci0JZXhwLT5tYXNrLnNyYy51LnVkcC5wb3J0ID0gMDsKLQlleHAtPm1hc2suZHN0LmlwID0gaHRvbmwoMHhGRkZGRkZGRik7Ci0JZXhwLT5tYXNrLmRzdC51LnVkcC5wb3J0ID0gaHRvbnMoMHhGRkZGKTsKLQlleHAtPm1hc2suZHN0LnByb3RvbnVtID0gMHhGRjsKLQotCWV4cC0+ZXhwZWN0Zm4gPSBOVUxMOwotCWV4cC0+ZmxhZ3MgPSAwOwotCi0JaXBfbmF0X3NkcCA9IHJjdV9kZXJlZmVyZW5jZShpcF9uYXRfc2RwX2hvb2spOwotCWlmIChpcF9uYXRfc2RwKQotCQlyZXQgPSBpcF9uYXRfc2RwKHBza2IsIGN0aW5mbywgZXhwLCBkcHRyKTsKLQllbHNlIHsKLQkJaWYgKGlwX2Nvbm50cmFja19leHBlY3RfcmVsYXRlZChleHApICE9IDApCi0JCQlyZXQgPSBORl9EUk9QOwotCQllbHNlCi0JCQlyZXQgPSBORl9BQ0NFUFQ7Ci0JfQotCWlwX2Nvbm50cmFja19leHBlY3RfcHV0KGV4cCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHNpcF9oZWxwKHN0cnVjdCBza19idWZmICoqcHNrYiwKLQkJICAgIHN0cnVjdCBpcF9jb25udHJhY2sgKmN0LAotCQkgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8pCi17Ci0JdW5zaWduZWQgaW50IGRhdGFvZmYsIGRhdGFsZW47Ci0JY29uc3QgY2hhciAqZHB0cjsKLQlpbnQgcmV0ID0gTkZfQUNDRVBUOwotCWludCBtYXRjaG9mZiwgbWF0Y2hsZW47Ci0JX19iZTMyIGlwYWRkcjsKLQl1X2ludDE2X3QgcG9ydDsKLQl0eXBlb2YoaXBfbmF0X3NpcF9ob29rKSBpcF9uYXRfc2lwOwotCi0JLyogTm8gRGF0YSA/ICovCi0JZGF0YW9mZiA9ICgqcHNrYiktPm5oLmlwaC0+aWhsKjQgKyBzaXplb2Yoc3RydWN0IHVkcGhkcik7Ci0JaWYgKGRhdGFvZmYgPj0gKCpwc2tiKS0+bGVuKSB7Ci0JCURFQlVHUCgic2tiLT5sZW4gPSAldVxuIiwgKCpwc2tiKS0+bGVuKTsKLQkJcmV0dXJuIE5GX0FDQ0VQVDsKLQl9Ci0KLQlpcF9jdF9yZWZyZXNoKGN0LCAqcHNrYiwgc2lwX3RpbWVvdXQgKiBIWik7Ci0KLQlpZiAoIXNrYl9pc19ub25saW5lYXIoKnBza2IpKQotCQlkcHRyID0gKCpwc2tiKS0+ZGF0YSArIGRhdGFvZmY7Ci0JZWxzZSB7Ci0JCURFQlVHUCgiQ29weSBvZiBza2J1ZmYgbm90IHN1cHBvcnRlZCB5ZXQuXG4iKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JaXBfbmF0X3NpcCA9IHJjdV9kZXJlZmVyZW5jZShpcF9uYXRfc2lwX2hvb2spOwotCWlmIChpcF9uYXRfc2lwKSB7Ci0JCWlmICghaXBfbmF0X3NpcChwc2tiLCBjdGluZm8sIGN0LCAmZHB0cikpIHsKLQkJCXJldCA9IE5GX0RST1A7Ci0JCQlnb3RvIG91dDsKLQkJfQotCX0KLQotCS8qIEFmdGVyIHRoaXMgcG9pbnQgTkFULCBjb3VsZCBoYXZlIG1hbmdsZWQgc2tiLCBzbwotCSAgIHdlIG5lZWQgdG8gcmVjYWxjdWxhdGUgcGF5bG9hZCBsZW5naHQuICovCi0JZGF0YWxlbiA9ICgqcHNrYiktPmxlbiAtIGRhdGFvZmY7Ci0KLQlpZiAoZGF0YWxlbiA8IChzaXplb2YoIlNJUC8yLjAgMjAwIikgLSAxKSkKLQkJZ290byBvdXQ7Ci0KLQkvKiBSVFAgaW5mbyBvbmx5IGluIHNvbWUgU0RQIHBrdHMgKi8KLQlpZiAobWVtY21wKGRwdHIsICJJTlZJVEUiLCBzaXplb2YoIklOVklURSIpIC0gMSkgIT0gMCAmJgotCSAgICBtZW1jbXAoZHB0ciwgIlNJUC8yLjAgMjAwIiwgc2l6ZW9mKCJTSVAvMi4wIDIwMCIpIC0gMSkgIT0gMCkgewotCQlnb3RvIG91dDsKLQl9Ci0JLyogR2V0IGlwIGFuZCBwb3J0IGFkZHJlc3MgZnJvbSBTRFAgcGFja2V0LiAqLwotCWlmIChjdF9zaXBfZ2V0X2luZm8oZHB0ciwgZGF0YWxlbiwgJm1hdGNob2ZmLCAmbWF0Y2hsZW4sCi0JCQkgICAgUE9TX0NPTk5FQ1RJT04pID4gMCkgewotCi0JCS8qIFdlJ2xsIGRyb3Agb25seSBpZiB0aGVyZSBhcmUgcGFyc2UgcHJvYmxlbXMuICovCi0JCWlmIChwYXJzZV9pcGFkZHIoZHB0ciArIG1hdGNob2ZmLCBOVUxMLCAmaXBhZGRyLAotCQkJCSBkcHRyICsgZGF0YWxlbikgPCAwKSB7Ci0JCQlyZXQgPSBORl9EUk9QOwotCQkJZ290byBvdXQ7Ci0JCX0KLQkJaWYgKGN0X3NpcF9nZXRfaW5mbyhkcHRyLCBkYXRhbGVuLCAmbWF0Y2hvZmYsICZtYXRjaGxlbiwKLQkJCQkgICAgUE9TX01FRElBKSA+IDApIHsKLQotCQkJcG9ydCA9IHNpbXBsZV9zdHJ0b3VsKGRwdHIgKyBtYXRjaG9mZiwgTlVMTCwgMTApOwotCQkJaWYgKHBvcnQgPCAxMDI0KSB7Ci0JCQkJcmV0ID0gTkZfRFJPUDsKLQkJCQlnb3RvIG91dDsKLQkJCX0KLQkJCXJldCA9IHNldF9leHBlY3RlZF9ydHAocHNrYiwgY3QsIGN0aW5mbywKLQkJCQkJICAgICAgIGlwYWRkciwgcG9ydCwgZHB0cik7Ci0JCX0KLQl9Ci1vdXQ6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHN0cnVjdCBpcF9jb25udHJhY2tfaGVscGVyIHNpcFtNQVhfUE9SVFNdOwotc3RhdGljIGNoYXIgc2lwX25hbWVzW01BWF9QT1JUU11bMTBdOwotCi1zdGF0aWMgdm9pZCBmaW5pKHZvaWQpCi17Ci0JaW50IGk7Ci0JZm9yIChpID0gMDsgaSA8IHBvcnRzX2M7IGkrKykgewotCQlERUJVR1AoInVucmVnaXN0ZXJpbmcgaGVscGVyIGZvciBwb3J0ICVkXG4iLCBwb3J0c1tpXSk7Ci0JCWlwX2Nvbm50cmFja19oZWxwZXJfdW5yZWdpc3Rlcigmc2lwW2ldKTsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKLXsKLQlpbnQgaSwgcmV0OwotCWNoYXIgKnRtcG5hbWU7Ci0KLQlpZiAocG9ydHNfYyA9PSAwKQotCQlwb3J0c1twb3J0c19jKytdID0gU0lQX1BPUlQ7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgcG9ydHNfYzsgaSsrKSB7Ci0JCS8qIENyZWF0ZSBoZWxwZXIgc3RydWN0dXJlICovCi0JCW1lbXNldCgmc2lwW2ldLCAwLCBzaXplb2Yoc3RydWN0IGlwX2Nvbm50cmFja19oZWxwZXIpKTsKLQotCQlzaXBbaV0udHVwbGUuZHN0LnByb3RvbnVtID0gSVBQUk9UT19VRFA7Ci0JCXNpcFtpXS50dXBsZS5zcmMudS51ZHAucG9ydCA9IGh0b25zKHBvcnRzW2ldKTsKLQkJc2lwW2ldLm1hc2suc3JjLnUudWRwLnBvcnQgPSBodG9ucygweEZGRkYpOwotCQlzaXBbaV0ubWFzay5kc3QucHJvdG9udW0gPSAweEZGOwotCQlzaXBbaV0ubWF4X2V4cGVjdGVkID0gMjsKLQkJc2lwW2ldLnRpbWVvdXQgPSAzICogNjA7IC8qIDMgbWludXRlcyAqLwotCQlzaXBbaV0ubWUgPSBUSElTX01PRFVMRTsKLQkJc2lwW2ldLmhlbHAgPSBzaXBfaGVscDsKLQotCQl0bXBuYW1lID0gJnNpcF9uYW1lc1tpXVswXTsKLQkJaWYgKHBvcnRzW2ldID09IFNJUF9QT1JUKQotCQkJc3ByaW50Zih0bXBuYW1lLCAic2lwIik7Ci0JCWVsc2UKLQkJCXNwcmludGYodG1wbmFtZSwgInNpcC0lZCIsIGkpOwotCQlzaXBbaV0ubmFtZSA9IHRtcG5hbWU7Ci0KLQkJREVCVUdQKCJwb3J0ICMlZDogJWRcbiIsIGksIHBvcnRzW2ldKTsKLQotCQlyZXQgPSBpcF9jb25udHJhY2tfaGVscGVyX3JlZ2lzdGVyKCZzaXBbaV0pOwotCQlpZiAocmV0KSB7Ci0JCQlwcmludGsoIkVSUk9SIHJlZ2lzdGVyaW5nIGhlbHBlciBmb3IgcG9ydCAlZFxuIiwKLQkJCQlwb3J0c1tpXSk7Ci0JCQlmaW5pKCk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JfQotCXJldHVybiAwOwotfQotCi1tb2R1bGVfaW5pdChpbml0KTsKLW1vZHVsZV9leGl0KGZpbmkpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19zdGFuZGFsb25lLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX3N0YW5kYWxvbmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZiMmY3NS4uMDAwMDAwMAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX3N0YW5kYWxvbmUuYworKysgL2Rldi9udWxsCkBAIC0xLDk2MiArMCwwIEBACi0vKiBUaGlzIGZpbGUgY29udGFpbnMgYWxsIHRoZSBmdW5jdGlvbnMgcmVxdWlyZWQgZm9yIHRoZSBzdGFuZGFsb25lCi0gICBpcF9jb25udHJhY2sgbW9kdWxlLgotCi0gICBUaGVzZSBhcmUgbm90IHJlcXVpcmVkIGJ5IHRoZSBjb21wYXRpYmlsaXR5IGxheWVyLgotKi8KLQotLyogKEMpIDE5OTktMjAwMSBQYXVsIGBSdXN0eScgUnVzc2VsbAotICogKEMpIDIwMDItMjAwNSBOZXRmaWx0ZXIgQ29yZSBUZWFtIDxjb3JldGVhbUBuZXRmaWx0ZXIub3JnPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvaXAuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgotI2lmZGVmIENPTkZJR19TWVNDVEwKLSNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KLSNlbmRpZgotI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgotI2luY2x1ZGUgPG5ldC9pcC5oPgotI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPgotCi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX3Byb3RvY29sLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2NvcmUuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfaGVscGVyLmg+Ci0KLSNpZiAwCi0jZGVmaW5lIERFQlVHUCBwcmludGsKLSNlbHNlCi0jZGVmaW5lIERFQlVHUChmb3JtYXQsIGFyZ3MuLi4pCi0jZW5kaWYKLQotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi1leHRlcm4gYXRvbWljX3QgaXBfY29ubnRyYWNrX2NvdW50OwotREVDTEFSRV9QRVJfQ1BVKHN0cnVjdCBpcF9jb25udHJhY2tfc3RhdCwgaXBfY29ubnRyYWNrX3N0YXQpOwotCi1zdGF0aWMgaW50IGtpbGxfcHJvdG8oc3RydWN0IGlwX2Nvbm50cmFjayAqaSwgdm9pZCAqZGF0YSkKLXsKLQlyZXR1cm4gKGktPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLmRzdC5wcm90b251bSA9PQotCQkJKigodV9pbnQ4X3QgKikgZGF0YSkpOwotfQotCi0jaWZkZWYgQ09ORklHX1BST0NfRlMKLXN0YXRpYyBpbnQKLXByaW50X3R1cGxlKHN0cnVjdCBzZXFfZmlsZSAqcywgY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUsCi0JICAgIHN0cnVjdCBpcF9jb25udHJhY2tfcHJvdG9jb2wgKnByb3RvKQotewotCXNlcV9wcmludGYocywgInNyYz0ldS4ldS4ldS4ldSBkc3Q9JXUuJXUuJXUuJXUgIiwKLQkJICAgTklQUVVBRCh0dXBsZS0+c3JjLmlwKSwgTklQUVVBRCh0dXBsZS0+ZHN0LmlwKSk7Ci0JcmV0dXJuIHByb3RvLT5wcmludF90dXBsZShzLCB0dXBsZSk7Ci19Ci0KLSNpZmRlZiBDT05GSUdfSVBfTkZfQ1RfQUNDVAotc3RhdGljIHVuc2lnbmVkIGludAotc2VxX3ByaW50X2NvdW50ZXJzKHN0cnVjdCBzZXFfZmlsZSAqcywKLQkJICAgY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja19jb3VudGVyICpjb3VudGVyKQotewotCXJldHVybiBzZXFfcHJpbnRmKHMsICJwYWNrZXRzPSVsbHUgYnl0ZXM9JWxsdSAiLAotCQkJICAodW5zaWduZWQgbG9uZyBsb25nKWNvdW50ZXItPnBhY2tldHMsCi0JCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpY291bnRlci0+Ynl0ZXMpOwotfQotI2Vsc2UKLSNkZWZpbmUgc2VxX3ByaW50X2NvdW50ZXJzKHgsIHkpCTAKLSNlbmRpZgotCi1zdHJ1Y3QgY3RfaXRlcl9zdGF0ZSB7Ci0JdW5zaWduZWQgaW50IGJ1Y2tldDsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkICpjdF9nZXRfZmlyc3Qoc3RydWN0IHNlcV9maWxlICpzZXEpCi17Ci0Jc3RydWN0IGN0X2l0ZXJfc3RhdGUgKnN0ID0gc2VxLT5wcml2YXRlOwotCi0JZm9yIChzdC0+YnVja2V0ID0gMDsKLQkgICAgIHN0LT5idWNrZXQgPCBpcF9jb25udHJhY2tfaHRhYmxlX3NpemU7Ci0JICAgICBzdC0+YnVja2V0KyspIHsKLQkJaWYgKCFsaXN0X2VtcHR5KCZpcF9jb25udHJhY2tfaGFzaFtzdC0+YnVja2V0XSkpCi0JCQlyZXR1cm4gaXBfY29ubnRyYWNrX2hhc2hbc3QtPmJ1Y2tldF0ubmV4dDsKLQl9Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkICpjdF9nZXRfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKLXsKLQlzdHJ1Y3QgY3RfaXRlcl9zdGF0ZSAqc3QgPSBzZXEtPnByaXZhdGU7Ci0KLQloZWFkID0gaGVhZC0+bmV4dDsKLQl3aGlsZSAoaGVhZCA9PSAmaXBfY29ubnRyYWNrX2hhc2hbc3QtPmJ1Y2tldF0pIHsKLQkJaWYgKCsrc3QtPmJ1Y2tldCA+PSBpcF9jb25udHJhY2tfaHRhYmxlX3NpemUpCi0JCQlyZXR1cm4gTlVMTDsKLQkJaGVhZCA9IGlwX2Nvbm50cmFja19oYXNoW3N0LT5idWNrZXRdLm5leHQ7Ci0JfQotCXJldHVybiBoZWFkOwotfQotCi1zdGF0aWMgc3RydWN0IGxpc3RfaGVhZCAqY3RfZ2V0X2lkeChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90IHBvcykKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkID0gY3RfZ2V0X2ZpcnN0KHNlcSk7Ci0KLQlpZiAoaGVhZCkKLQkJd2hpbGUgKHBvcyAmJiAoaGVhZCA9IGN0X2dldF9uZXh0KHNlcSwgaGVhZCkpKQotCQkJcG9zLS07Ci0JcmV0dXJuIHBvcyA/IE5VTEwgOiBoZWFkOwotfQotCi1zdGF0aWMgdm9pZCAqY3Rfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgKnBvcykKLXsKLQlyZWFkX2xvY2tfYmgoJmlwX2Nvbm50cmFja19sb2NrKTsKLQlyZXR1cm4gY3RfZ2V0X2lkeChzZXEsICpwb3MpOwotfQotCi1zdGF0aWMgdm9pZCAqY3Rfc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKLXsKLQkoKnBvcykrKzsKLQlyZXR1cm4gY3RfZ2V0X25leHQocywgdik7Ci19Ci0KLXN0YXRpYyB2b2lkIGN0X3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdikKLXsKLQlyZWFkX3VubG9ja19iaCgmaXBfY29ubnRyYWNrX2xvY2spOwotfQotCi1zdGF0aWMgaW50IGN0X3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdikKLXsKLQljb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlX2hhc2ggKmhhc2ggPSB2OwotCWNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2sgKmNvbm50cmFjayA9IHR1cGxlaGFzaF90b19jdHJhY2soaGFzaCk7Ci0Jc3RydWN0IGlwX2Nvbm50cmFja19wcm90b2NvbCAqcHJvdG87Ci0KLQlJUF9ORl9BU1NFUlQoY29ubnRyYWNrKTsKLQotCS8qIHdlIG9ubHkgd2FudCB0byBwcmludCBESVJfT1JJR0lOQUwgKi8KLQlpZiAoRElSRUNUSU9OKGhhc2gpKQotCQlyZXR1cm4gMDsKLQotCXByb3RvID0gX19pcF9jb25udHJhY2tfcHJvdG9fZmluZChjb25udHJhY2stPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLmRzdC5wcm90b251bSk7Ci0JSVBfTkZfQVNTRVJUKHByb3RvKTsKLQotCWlmIChzZXFfcHJpbnRmKHMsICIlLThzICV1ICVsZCAiLAotCQkgICAgICBwcm90by0+bmFtZSwKLQkJICAgICAgY29ubnRyYWNrLT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZS5kc3QucHJvdG9udW0sCi0JCSAgICAgIHRpbWVyX3BlbmRpbmcoJmNvbm50cmFjay0+dGltZW91dCkKLQkJICAgICAgPyAobG9uZykoY29ubnRyYWNrLT50aW1lb3V0LmV4cGlyZXMgLSBqaWZmaWVzKS9IWgotCQkgICAgICA6IDApICE9IDApCi0JCXJldHVybiAtRU5PU1BDOwotCi0JaWYgKHByb3RvLT5wcmludF9jb25udHJhY2socywgY29ubnRyYWNrKSkKLQkJcmV0dXJuIC1FTk9TUEM7Ci0KLQlpZiAocHJpbnRfdHVwbGUocywgJmNvbm50cmFjay0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUsCi0JCQlwcm90bykpCi0JCXJldHVybiAtRU5PU1BDOwotCi0JaWYgKHNlcV9wcmludF9jb3VudGVycyhzLCAmY29ubnRyYWNrLT5jb3VudGVyc1tJUF9DVF9ESVJfT1JJR0lOQUxdKSkKLQkJcmV0dXJuIC1FTk9TUEM7Ci0KLQlpZiAoISh0ZXN0X2JpdChJUFNfU0VFTl9SRVBMWV9CSVQsICZjb25udHJhY2stPnN0YXR1cykpKQotCQlpZiAoc2VxX3ByaW50ZihzLCAiW1VOUkVQTElFRF0gIikpCi0JCQlyZXR1cm4gLUVOT1NQQzsKLQotCWlmIChwcmludF90dXBsZShzLCAmY29ubnRyYWNrLT50dXBsZWhhc2hbSVBfQ1RfRElSX1JFUExZXS50dXBsZSwKLQkJCXByb3RvKSkKLQkJcmV0dXJuIC1FTk9TUEM7Ci0KLQlpZiAoc2VxX3ByaW50X2NvdW50ZXJzKHMsICZjb25udHJhY2stPmNvdW50ZXJzW0lQX0NUX0RJUl9SRVBMWV0pKQotCQlyZXR1cm4gLUVOT1NQQzsKLQotCWlmICh0ZXN0X2JpdChJUFNfQVNTVVJFRF9CSVQsICZjb25udHJhY2stPnN0YXR1cykpCi0JCWlmIChzZXFfcHJpbnRmKHMsICJbQVNTVVJFRF0gIikpCi0JCQlyZXR1cm4gLUVOT1NQQzsKLQotI2lmIGRlZmluZWQoQ09ORklHX0lQX05GX0NPTk5UUkFDS19NQVJLKQotCWlmIChzZXFfcHJpbnRmKHMsICJtYXJrPSV1ICIsIGNvbm50cmFjay0+bWFyaykpCi0JCXJldHVybiAtRU5PU1BDOwotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfSVBfTkZfQ09OTlRSQUNLX1NFQ01BUksKLQlpZiAoc2VxX3ByaW50ZihzLCAic2VjbWFyaz0ldSAiLCBjb25udHJhY2stPnNlY21hcmspKQotCQlyZXR1cm4gLUVOT1NQQzsKLSNlbmRpZgotCi0JaWYgKHNlcV9wcmludGYocywgInVzZT0ldVxuIiwgYXRvbWljX3JlYWQoJmNvbm50cmFjay0+Y3RfZ2VuZXJhbC51c2UpKSkKLQkJcmV0dXJuIC1FTk9TUEM7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBjdF9zZXFfb3BzID0gewotCS5zdGFydCA9IGN0X3NlcV9zdGFydCwKLQkubmV4dCAgPSBjdF9zZXFfbmV4dCwKLQkuc3RvcCAgPSBjdF9zZXFfc3RvcCwKLQkuc2hvdyAgPSBjdF9zZXFfc2hvdwotfTsKLQotc3RhdGljIGludCBjdF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCBzZXFfZmlsZSAqc2VxOwotCXN0cnVjdCBjdF9pdGVyX3N0YXRlICpzdDsKLQlpbnQgcmV0OwotCi0Jc3QgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgY3RfaXRlcl9zdGF0ZSksIEdGUF9LRVJORUwpOwotCWlmIChzdCA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQlyZXQgPSBzZXFfb3BlbihmaWxlLCAmY3Rfc2VxX29wcyk7Ci0JaWYgKHJldCkKLQkJZ290byBvdXRfZnJlZTsKLQlzZXEgICAgICAgICAgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc2VxLT5wcml2YXRlID0gc3Q7Ci0JbWVtc2V0KHN0LCAwLCBzaXplb2Yoc3RydWN0IGN0X2l0ZXJfc3RhdGUpKTsKLQlyZXR1cm4gcmV0Owotb3V0X2ZyZWU6Ci0Ja2ZyZWUoc3QpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGN0X2ZpbGVfb3BzID0gewotCS5vd25lciAgID0gVEhJU19NT0RVTEUsCi0JLm9wZW4gICAgPSBjdF9vcGVuLAotCS5yZWFkICAgID0gc2VxX3JlYWQsCi0JLmxsc2VlayAgPSBzZXFfbHNlZWssCi0JLnJlbGVhc2UgPSBzZXFfcmVsZWFzZV9wcml2YXRlLAotfTsKLQotLyogZXhwZWN0cyAqLwotc3RhdGljIHZvaWQgKmV4cF9zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzLCBsb2ZmX3QgKnBvcykKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICplID0gJmlwX2Nvbm50cmFja19leHBlY3RfbGlzdDsKLQlsb2ZmX3QgaTsKLQotCS8qIHN0cmFuZ2Ugc2VxX2ZpbGUgYXBpIGNhbGxzIHN0b3AgZXZlbiBpZiB3ZSBmYWlsLAotCSAqIHRodXMgd2UgbmVlZCB0byBncmFiIGxvY2sgc2luY2Ugc3RvcCB1bmxvY2tzICovCi0JcmVhZF9sb2NrX2JoKCZpcF9jb25udHJhY2tfbG9jayk7Ci0KLQlpZiAobGlzdF9lbXB0eShlKSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlmb3IgKGkgPSAwOyBpIDw9ICpwb3M7IGkrKykgewotCQllID0gZS0+bmV4dDsKLQkJaWYgKGUgPT0gJmlwX2Nvbm50cmFja19leHBlY3RfbGlzdCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gZTsKLX0KLQotc3RhdGljIHZvaWQgKmV4cF9zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQotewotCXN0cnVjdCBsaXN0X2hlYWQgKmUgPSB2OwotCi0JKysqcG9zOwotCWUgPSBlLT5uZXh0OwotCi0JaWYgKGUgPT0gJmlwX2Nvbm50cmFja19leHBlY3RfbGlzdCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlyZXR1cm4gZTsKLX0KLQotc3RhdGljIHZvaWQgZXhwX3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdikKLXsKLQlyZWFkX3VubG9ja19iaCgmaXBfY29ubnRyYWNrX2xvY2spOwotfQotCi1zdGF0aWMgaW50IGV4cF9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnYpCi17Ci0Jc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmV4cGVjdCA9IHY7Ci0KLQlpZiAoZXhwZWN0LT50aW1lb3V0LmZ1bmN0aW9uKQotCQlzZXFfcHJpbnRmKHMsICIlbGQgIiwgdGltZXJfcGVuZGluZygmZXhwZWN0LT50aW1lb3V0KQotCQkJICAgPyAobG9uZykoZXhwZWN0LT50aW1lb3V0LmV4cGlyZXMgLSBqaWZmaWVzKS9IWiA6IDApOwotCWVsc2UKLQkJc2VxX3ByaW50ZihzLCAiLSAiKTsKLQotCXNlcV9wcmludGYocywgInByb3RvPSV1ICIsIGV4cGVjdC0+dHVwbGUuZHN0LnByb3RvbnVtKTsKLQotCXByaW50X3R1cGxlKHMsICZleHBlY3QtPnR1cGxlLAotCQkgICAgX19pcF9jb25udHJhY2tfcHJvdG9fZmluZChleHBlY3QtPnR1cGxlLmRzdC5wcm90b251bSkpOwotCXJldHVybiBzZXFfcHV0YyhzLCAnXG4nKTsKLX0KLQotc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBleHBfc2VxX29wcyA9IHsKLQkuc3RhcnQgPSBleHBfc2VxX3N0YXJ0LAotCS5uZXh0ID0gZXhwX3NlcV9uZXh0LAotCS5zdG9wID0gZXhwX3NlcV9zdG9wLAotCS5zaG93ID0gZXhwX3NlcV9zaG93Ci19OwotCi1zdGF0aWMgaW50IGV4cF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXJldHVybiBzZXFfb3BlbihmaWxlLCAmZXhwX3NlcV9vcHMpOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBleHBfZmlsZV9vcHMgPSB7Ci0JLm93bmVyICAgPSBUSElTX01PRFVMRSwKLQkub3BlbiAgICA9IGV4cF9vcGVuLAotCS5yZWFkICAgID0gc2VxX3JlYWQsCi0JLmxsc2VlayAgPSBzZXFfbHNlZWssCi0JLnJlbGVhc2UgPSBzZXFfcmVsZWFzZQotfTsKLQotc3RhdGljIHZvaWQgKmN0X2NwdV9zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKQotewotCWludCBjcHU7Ci0KLQlpZiAoKnBvcyA9PSAwKQotCQlyZXR1cm4gU0VRX1NUQVJUX1RPS0VOOwotCi0JZm9yIChjcHUgPSAqcG9zLTE7IGNwdSA8IE5SX0NQVVM7ICsrY3B1KSB7Ci0JCWlmICghY3B1X3Bvc3NpYmxlKGNwdSkpCi0JCQljb250aW51ZTsKLQkJKnBvcyA9IGNwdSsxOwotCQlyZXR1cm4gJnBlcl9jcHUoaXBfY29ubnRyYWNrX3N0YXQsIGNwdSk7Ci0JfQotCi0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkICpjdF9jcHVfc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQotewotCWludCBjcHU7Ci0KLQlmb3IgKGNwdSA9ICpwb3M7IGNwdSA8IE5SX0NQVVM7ICsrY3B1KSB7Ci0JCWlmICghY3B1X3Bvc3NpYmxlKGNwdSkpCi0JCQljb250aW51ZTsKLQkJKnBvcyA9IGNwdSsxOwotCQlyZXR1cm4gJnBlcl9jcHUoaXBfY29ubnRyYWNrX3N0YXQsIGNwdSk7Ci0JfQotCi0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkIGN0X2NwdV9zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKLXsKLX0KLQotc3RhdGljIGludCBjdF9jcHVfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCi17Ci0JdW5zaWduZWQgaW50IG5yX2Nvbm50cmFja3MgPSBhdG9taWNfcmVhZCgmaXBfY29ubnRyYWNrX2NvdW50KTsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrX3N0YXQgKnN0ID0gdjsKLQotCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikgewotCQlzZXFfcHJpbnRmKHNlcSwgImVudHJpZXMgIHNlYXJjaGVkIGZvdW5kIG5ldyBpbnZhbGlkIGlnbm9yZSBkZWxldGUgZGVsZXRlX2xpc3QgaW5zZXJ0IGluc2VydF9mYWlsZWQgZHJvcCBlYXJseV9kcm9wIGljbXBfZXJyb3IgIGV4cGVjdF9uZXcgZXhwZWN0X2NyZWF0ZSBleHBlY3RfZGVsZXRlXG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0Jc2VxX3ByaW50ZihzZXEsICIlMDh4ICAlMDh4ICUwOHggJTA4eCAlMDh4ICUwOHggJTA4eCAlMDh4ICIKLQkJCSIlMDh4ICUwOHggJTA4eCAlMDh4ICUwOHggICUwOHggJTA4eCAlMDh4IFxuIiwKLQkJICAgbnJfY29ubnRyYWNrcywKLQkJICAgc3QtPnNlYXJjaGVkLAotCQkgICBzdC0+Zm91bmQsCi0JCSAgIHN0LT5uZXcsCi0JCSAgIHN0LT5pbnZhbGlkLAotCQkgICBzdC0+aWdub3JlLAotCQkgICBzdC0+ZGVsZXRlLAotCQkgICBzdC0+ZGVsZXRlX2xpc3QsCi0JCSAgIHN0LT5pbnNlcnQsCi0JCSAgIHN0LT5pbnNlcnRfZmFpbGVkLAotCQkgICBzdC0+ZHJvcCwKLQkJICAgc3QtPmVhcmx5X2Ryb3AsCi0JCSAgIHN0LT5lcnJvciwKLQotCQkgICBzdC0+ZXhwZWN0X25ldywKLQkJICAgc3QtPmV4cGVjdF9jcmVhdGUsCi0JCSAgIHN0LT5leHBlY3RfZGVsZXRlCi0JCSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgY3RfY3B1X3NlcV9vcHMgPSB7Ci0JLnN0YXJ0ICA9IGN0X2NwdV9zZXFfc3RhcnQsCi0JLm5leHQgICA9IGN0X2NwdV9zZXFfbmV4dCwKLQkuc3RvcCAgID0gY3RfY3B1X3NlcV9zdG9wLAotCS5zaG93ICAgPSBjdF9jcHVfc2VxX3Nob3csCi19OwotCi1zdGF0aWMgaW50IGN0X2NwdV9zZXFfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlyZXR1cm4gc2VxX29wZW4oZmlsZSwgJmN0X2NwdV9zZXFfb3BzKTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgY3RfY3B1X3NlcV9mb3BzID0gewotCS5vd25lciAgID0gVEhJU19NT0RVTEUsCi0JLm9wZW4gICAgPSBjdF9jcHVfc2VxX29wZW4sCi0JLnJlYWQgICAgPSBzZXFfcmVhZCwKLQkubGxzZWVrICA9IHNlcV9sc2VlaywKLQkucmVsZWFzZSA9IHNlcV9yZWxlYXNlX3ByaXZhdGUsCi19OwotI2VuZGlmCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgaXBfY29uZmlybSh1bnNpZ25lZCBpbnQgaG9va251bSwKLQkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCi0JCQkgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotCQkJICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0JCQkgICAgICAgaW50ICgqb2tmbikoc3RydWN0IHNrX2J1ZmYgKikpCi17Ci0JLyogV2UndmUgc2VlbiBpdCBjb21pbmcgb3V0IHRoZSBvdGhlciBzaWRlOiBjb25maXJtIGl0ICovCi0JcmV0dXJuIGlwX2Nvbm50cmFja19jb25maXJtKHBza2IpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IGlwX2Nvbm50cmFja19oZWxwKHVuc2lnbmVkIGludCBob29rbnVtLAotCQkJCSAgICAgIHN0cnVjdCBza19idWZmICoqcHNrYiwKLQkJCQkgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0JCQkJICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLQkJCQkgICAgICBpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSkKLXsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdDsKLQllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbzsKLQotCS8qIFRoaXMgaXMgd2hlcmUgd2UgY2FsbCB0aGUgaGVscGVyOiBhcyB0aGUgcGFja2V0IGdvZXMgb3V0LiAqLwotCWN0ID0gaXBfY29ubnRyYWNrX2dldCgqcHNrYiwgJmN0aW5mbyk7Ci0JaWYgKGN0ICYmIGN0LT5oZWxwZXIgJiYgY3RpbmZvICE9IElQX0NUX1JFTEFURUQgKyBJUF9DVF9JU19SRVBMWSkgewotCQl1bnNpZ25lZCBpbnQgcmV0OwotCQlyZXQgPSBjdC0+aGVscGVyLT5oZWxwKHBza2IsIGN0LCBjdGluZm8pOwotCQlpZiAocmV0ICE9IE5GX0FDQ0VQVCkKLQkJCXJldHVybiByZXQ7Ci0JfQotCXJldHVybiBORl9BQ0NFUFQ7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgaXBfY29ubnRyYWNrX2RlZnJhZyh1bnNpZ25lZCBpbnQgaG9va251bSwKLQkJCQkJc3RydWN0IHNrX2J1ZmYgKipwc2tiLAotCQkJCQljb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0JCQkJCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0JCQkJCWludCAoKm9rZm4pKHN0cnVjdCBza19idWZmICopKQotewotI2lmICFkZWZpbmVkKENPTkZJR19JUF9ORl9OQVQpICYmICFkZWZpbmVkKENPTkZJR19JUF9ORl9OQVRfTU9EVUxFKQotCS8qIFByZXZpb3VzbHkgc2VlbiAobG9vcGJhY2spPyAgSWdub3JlLiAgRG8gdGhpcyBiZWZvcmUKLQkgICBmcmFnbWVudCBjaGVjay4gKi8KLQlpZiAoKCpwc2tiKS0+bmZjdCkKLQkJcmV0dXJuIE5GX0FDQ0VQVDsKLSNlbmRpZgotCi0JLyogR2F0aGVyIGZyYWdtZW50cy4gKi8KLQlpZiAoKCpwc2tiKS0+bmguaXBoLT5mcmFnX29mZiAmIGh0b25zKElQX01GfElQX09GRlNFVCkpIHsKLQkJKnBza2IgPSBpcF9jdF9nYXRoZXJfZnJhZ3MoKnBza2IsCi0JCQkJCSAgIGhvb2tudW0gPT0gTkZfSVBfUFJFX1JPVVRJTkcgPwotCQkJCQkgICBJUF9ERUZSQUdfQ09OTlRSQUNLX0lOIDoKLQkJCQkJICAgSVBfREVGUkFHX0NPTk5UUkFDS19PVVQpOwotCQlpZiAoISpwc2tiKQotCQkJcmV0dXJuIE5GX1NUT0xFTjsKLQl9Ci0JcmV0dXJuIE5GX0FDQ0VQVDsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBpcF9jb25udHJhY2tfbG9jYWwodW5zaWduZWQgaW50IGhvb2tudW0sCi0JCQkJICAgICAgIHN0cnVjdCBza19idWZmICoqcHNrYiwKLQkJCQkgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotCQkJCSAgICAgICBpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSkKLXsKLQkvKiByb290IGlzIHBsYXlpbmcgd2l0aCByYXcgc29ja2V0cy4gKi8KLQlpZiAoKCpwc2tiKS0+bGVuIDwgc2l6ZW9mKHN0cnVjdCBpcGhkcikKLQkgICAgfHwgKCpwc2tiKS0+bmguaXBoLT5paGwgKiA0IDwgc2l6ZW9mKHN0cnVjdCBpcGhkcikpIHsKLQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKLQkJCXByaW50aygiaXB0X2hvb2s6IGhhcHB5IGNyYWNraW5nLlxuIik7Ci0JCXJldHVybiBORl9BQ0NFUFQ7Ci0JfQotCXJldHVybiBpcF9jb25udHJhY2tfaW4oaG9va251bSwgcHNrYiwgaW4sIG91dCwgb2tmbik7Ci19Ci0KLS8qIENvbm5lY3Rpb24gdHJhY2tpbmcgbWF5IGRyb3AgcGFja2V0cywgYnV0IG5ldmVyIGFsdGVycyB0aGVtLCBzbwotICAgbWFrZSBpdCB0aGUgZmlyc3QgaG9vay4gKi8KLXN0YXRpYyBzdHJ1Y3QgbmZfaG9va19vcHMgaXBfY29ubnRyYWNrX29wc1tdID0gewotCXsKLQkJLmhvb2sJCT0gaXBfY29ubnRyYWNrX2RlZnJhZywKLQkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCQkucGYJCT0gUEZfSU5FVCwKLQkJLmhvb2tudW0JPSBORl9JUF9QUkVfUk9VVElORywKLQkJLnByaW9yaXR5CT0gTkZfSVBfUFJJX0NPTk5UUkFDS19ERUZSQUcsCi0JfSwKLQl7Ci0JCS5ob29rCQk9IGlwX2Nvbm50cmFja19pbiwKLQkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCQkucGYJCT0gUEZfSU5FVCwKLQkJLmhvb2tudW0JPSBORl9JUF9QUkVfUk9VVElORywKLQkJLnByaW9yaXR5CT0gTkZfSVBfUFJJX0NPTk5UUkFDSywKLQl9LAotCXsKLQkJLmhvb2sJCT0gaXBfY29ubnRyYWNrX2RlZnJhZywKLQkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCQkucGYJCT0gUEZfSU5FVCwKLQkJLmhvb2tudW0JPSBORl9JUF9MT0NBTF9PVVQsCi0JCS5wcmlvcml0eQk9IE5GX0lQX1BSSV9DT05OVFJBQ0tfREVGUkFHLAotCX0sCi0JewotCQkuaG9vawkJPSBpcF9jb25udHJhY2tfbG9jYWwsCi0JCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkJLnBmCQk9IFBGX0lORVQsCi0JCS5ob29rbnVtCT0gTkZfSVBfTE9DQUxfT1VULAotCQkucHJpb3JpdHkJPSBORl9JUF9QUklfQ09OTlRSQUNLLAotCX0sCi0JewotCQkuaG9vawkJPSBpcF9jb25udHJhY2tfaGVscCwKLQkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCQkucGYJCT0gUEZfSU5FVCwKLQkJLmhvb2tudW0JPSBORl9JUF9QT1NUX1JPVVRJTkcsCi0JCS5wcmlvcml0eQk9IE5GX0lQX1BSSV9DT05OVFJBQ0tfSEVMUEVSLAotCX0sCi0JewotCQkuaG9vawkJPSBpcF9jb25udHJhY2tfaGVscCwKLQkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCQkucGYJCT0gUEZfSU5FVCwKLQkJLmhvb2tudW0JPSBORl9JUF9MT0NBTF9JTiwKLQkJLnByaW9yaXR5CT0gTkZfSVBfUFJJX0NPTk5UUkFDS19IRUxQRVIsCi0JfSwKLQl7Ci0JCS5ob29rCQk9IGlwX2NvbmZpcm0sCi0JCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkJLnBmCQk9IFBGX0lORVQsCi0JCS5ob29rbnVtCT0gTkZfSVBfUE9TVF9ST1VUSU5HLAotCQkucHJpb3JpdHkJPSBORl9JUF9QUklfQ09OTlRSQUNLX0NPTkZJUk0sCi0JfSwKLQl7Ci0JCS5ob29rCQk9IGlwX2NvbmZpcm0sCi0JCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkJLnBmCQk9IFBGX0lORVQsCi0JCS5ob29rbnVtCT0gTkZfSVBfTE9DQUxfSU4sCi0JCS5wcmlvcml0eQk9IE5GX0lQX1BSSV9DT05OVFJBQ0tfQ09ORklSTSwKLQl9LAotfTsKLQotLyogU3lzY3RsIHN1cHBvcnQgKi8KLQotaW50IGlwX2Nvbm50cmFja19jaGVja3N1bSBfX3JlYWRfbW9zdGx5ID0gMTsKLQotI2lmZGVmIENPTkZJR19TWVNDVEwKLQotLyogRnJvbSBpcF9jb25udHJhY2tfY29yZS5jICovCi1leHRlcm4gaW50IGlwX2Nvbm50cmFja19tYXg7Ci1leHRlcm4gdW5zaWduZWQgaW50IGlwX2Nvbm50cmFja19odGFibGVfc2l6ZTsKLQotLyogRnJvbSBpcF9jb25udHJhY2tfcHJvdG9fdGNwLmMgKi8KLWV4dGVybiB1bnNpZ25lZCBpbnQgaXBfY3RfdGNwX3RpbWVvdXRfc3luX3NlbnQ7Ci1leHRlcm4gdW5zaWduZWQgaW50IGlwX2N0X3RjcF90aW1lb3V0X3N5bl9yZWN2OwotZXh0ZXJuIHVuc2lnbmVkIGludCBpcF9jdF90Y3BfdGltZW91dF9lc3RhYmxpc2hlZDsKLWV4dGVybiB1bnNpZ25lZCBpbnQgaXBfY3RfdGNwX3RpbWVvdXRfZmluX3dhaXQ7Ci1leHRlcm4gdW5zaWduZWQgaW50IGlwX2N0X3RjcF90aW1lb3V0X2Nsb3NlX3dhaXQ7Ci1leHRlcm4gdW5zaWduZWQgaW50IGlwX2N0X3RjcF90aW1lb3V0X2xhc3RfYWNrOwotZXh0ZXJuIHVuc2lnbmVkIGludCBpcF9jdF90Y3BfdGltZW91dF90aW1lX3dhaXQ7Ci1leHRlcm4gdW5zaWduZWQgaW50IGlwX2N0X3RjcF90aW1lb3V0X2Nsb3NlOwotZXh0ZXJuIHVuc2lnbmVkIGludCBpcF9jdF90Y3BfdGltZW91dF9tYXhfcmV0cmFuczsKLWV4dGVybiBpbnQgaXBfY3RfdGNwX2xvb3NlOwotZXh0ZXJuIGludCBpcF9jdF90Y3BfYmVfbGliZXJhbDsKLWV4dGVybiBpbnQgaXBfY3RfdGNwX21heF9yZXRyYW5zOwotCi0vKiBGcm9tIGlwX2Nvbm50cmFja19wcm90b191ZHAuYyAqLwotZXh0ZXJuIHVuc2lnbmVkIGludCBpcF9jdF91ZHBfdGltZW91dDsKLWV4dGVybiB1bnNpZ25lZCBpbnQgaXBfY3RfdWRwX3RpbWVvdXRfc3RyZWFtOwotCi0vKiBGcm9tIGlwX2Nvbm50cmFja19wcm90b19pY21wLmMgKi8KLWV4dGVybiB1bnNpZ25lZCBpbnQgaXBfY3RfaWNtcF90aW1lb3V0OwotCi0vKiBGcm9tIGlwX2Nvbm50cmFja19wcm90b19nZW5lcmljLmMgKi8KLWV4dGVybiB1bnNpZ25lZCBpbnQgaXBfY3RfZ2VuZXJpY190aW1lb3V0OwotCi0vKiBMb2cgaW52YWxpZCBwYWNrZXRzIG9mIGEgZ2l2ZW4gcHJvdG9jb2wgKi8KLXN0YXRpYyBpbnQgbG9nX2ludmFsaWRfcHJvdG9fbWluID0gMDsKLXN0YXRpYyBpbnQgbG9nX2ludmFsaWRfcHJvdG9fbWF4ID0gMjU1OwotCi1zdGF0aWMgc3RydWN0IGN0bF90YWJsZV9oZWFkZXIgKmlwX2N0X3N5c2N0bF9oZWFkZXI7Ci0KLXN0YXRpYyBjdGxfdGFibGUgaXBfY3Rfc3lzY3RsX3RhYmxlW10gPSB7Ci0JewotCQkuY3RsX25hbWUJPSBORVRfSVBWNF9ORl9DT05OVFJBQ0tfTUFYLAotCQkucHJvY25hbWUJPSAiaXBfY29ubnRyYWNrX21heCIsCi0JCS5kYXRhCQk9ICZpcF9jb25udHJhY2tfbWF4LAotCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAotCQkubW9kZQkJPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMsCi0JfSwKLQl7Ci0JCS5jdGxfbmFtZQk9IE5FVF9JUFY0X05GX0NPTk5UUkFDS19DT1VOVCwKLQkJLnByb2NuYW1lCT0gImlwX2Nvbm50cmFja19jb3VudCIsCi0JCS5kYXRhCQk9ICZpcF9jb25udHJhY2tfY291bnQsCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCi0JCS5tb2RlCQk9IDA0NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKLQl9LAotCXsKLQkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfTkZfQ09OTlRSQUNLX0JVQ0tFVFMsCi0JCS5wcm9jbmFtZQk9ICJpcF9jb25udHJhY2tfYnVja2V0cyIsCi0JCS5kYXRhCQk9ICZpcF9jb25udHJhY2tfaHRhYmxlX3NpemUsCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCi0JCS5tb2RlCQk9IDA0NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKLQl9LAotCXsKLQkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfTkZfQ09OTlRSQUNLX0NIRUNLU1VNLAotCQkucHJvY25hbWUJPSAiaXBfY29ubnRyYWNrX2NoZWNrc3VtIiwKLQkJLmRhdGEJCT0gJmlwX2Nvbm50cmFja19jaGVja3N1bSwKLQkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjLAotCX0sCi0JewotCQkuY3RsX25hbWUJPSBORVRfSVBWNF9ORl9DT05OVFJBQ0tfVENQX1RJTUVPVVRfU1lOX1NFTlQsCi0JCS5wcm9jbmFtZQk9ICJpcF9jb25udHJhY2tfdGNwX3RpbWVvdXRfc3luX3NlbnQiLAotCQkuZGF0YQkJPSAmaXBfY3RfdGNwX3RpbWVvdXRfc3luX3NlbnQsCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCi0JCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19qaWZmaWVzLAotCX0sCi0JewotCQkuY3RsX25hbWUJPSBORVRfSVBWNF9ORl9DT05OVFJBQ0tfVENQX1RJTUVPVVRfU1lOX1JFQ1YsCi0JCS5wcm9jbmFtZQk9ICJpcF9jb25udHJhY2tfdGNwX3RpbWVvdXRfc3luX3JlY3YiLAotCQkuZGF0YQkJPSAmaXBfY3RfdGNwX3RpbWVvdXRfc3luX3JlY3YsCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCi0JCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19qaWZmaWVzLAotCX0sCi0JewotCQkuY3RsX25hbWUJPSBORVRfSVBWNF9ORl9DT05OVFJBQ0tfVENQX1RJTUVPVVRfRVNUQUJMSVNIRUQsCi0JCS5wcm9jbmFtZQk9ICJpcF9jb25udHJhY2tfdGNwX3RpbWVvdXRfZXN0YWJsaXNoZWQiLAotCQkuZGF0YQkJPSAmaXBfY3RfdGNwX3RpbWVvdXRfZXN0YWJsaXNoZWQsCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCi0JCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19qaWZmaWVzLAotCX0sCi0JewotCQkuY3RsX25hbWUJPSBORVRfSVBWNF9ORl9DT05OVFJBQ0tfVENQX1RJTUVPVVRfRklOX1dBSVQsCi0JCS5wcm9jbmFtZQk9ICJpcF9jb25udHJhY2tfdGNwX3RpbWVvdXRfZmluX3dhaXQiLAotCQkuZGF0YQkJPSAmaXBfY3RfdGNwX3RpbWVvdXRfZmluX3dhaXQsCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCi0JCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19qaWZmaWVzLAotCX0sCi0JewotCQkuY3RsX25hbWUJPSBORVRfSVBWNF9ORl9DT05OVFJBQ0tfVENQX1RJTUVPVVRfQ0xPU0VfV0FJVCwKLQkJLnByb2NuYW1lCT0gImlwX2Nvbm50cmFja190Y3BfdGltZW91dF9jbG9zZV93YWl0IiwKLQkJLmRhdGEJCT0gJmlwX2N0X3RjcF90aW1lb3V0X2Nsb3NlX3dhaXQsCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCi0JCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19qaWZmaWVzLAotCX0sCi0JewotCQkuY3RsX25hbWUJPSBORVRfSVBWNF9ORl9DT05OVFJBQ0tfVENQX1RJTUVPVVRfTEFTVF9BQ0ssCi0JCS5wcm9jbmFtZQk9ICJpcF9jb25udHJhY2tfdGNwX3RpbWVvdXRfbGFzdF9hY2siLAotCQkuZGF0YQkJPSAmaXBfY3RfdGNwX3RpbWVvdXRfbGFzdF9hY2ssCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCi0JCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19qaWZmaWVzLAotCX0sCi0JewotCQkuY3RsX25hbWUJPSBORVRfSVBWNF9ORl9DT05OVFJBQ0tfVENQX1RJTUVPVVRfVElNRV9XQUlULAotCQkucHJvY25hbWUJPSAiaXBfY29ubnRyYWNrX3RjcF90aW1lb3V0X3RpbWVfd2FpdCIsCi0JCS5kYXRhCQk9ICZpcF9jdF90Y3BfdGltZW91dF90aW1lX3dhaXQsCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCi0JCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19qaWZmaWVzLAotCX0sCi0JewotCQkuY3RsX25hbWUJPSBORVRfSVBWNF9ORl9DT05OVFJBQ0tfVENQX1RJTUVPVVRfQ0xPU0UsCi0JCS5wcm9jbmFtZQk9ICJpcF9jb25udHJhY2tfdGNwX3RpbWVvdXRfY2xvc2UiLAotCQkuZGF0YQkJPSAmaXBfY3RfdGNwX3RpbWVvdXRfY2xvc2UsCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCi0JCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19qaWZmaWVzLAotCX0sCi0JewotCQkuY3RsX25hbWUJPSBORVRfSVBWNF9ORl9DT05OVFJBQ0tfVURQX1RJTUVPVVQsCi0JCS5wcm9jbmFtZQk9ICJpcF9jb25udHJhY2tfdWRwX3RpbWVvdXQiLAotCQkuZGF0YQkJPSAmaXBfY3RfdWRwX3RpbWVvdXQsCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCi0JCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19qaWZmaWVzLAotCX0sCi0JewotCQkuY3RsX25hbWUJPSBORVRfSVBWNF9ORl9DT05OVFJBQ0tfVURQX1RJTUVPVVRfU1RSRUFNLAotCQkucHJvY25hbWUJPSAiaXBfY29ubnRyYWNrX3VkcF90aW1lb3V0X3N0cmVhbSIsCi0JCS5kYXRhCQk9ICZpcF9jdF91ZHBfdGltZW91dF9zdHJlYW0sCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCi0JCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19qaWZmaWVzLAotCX0sCi0JewotCQkuY3RsX25hbWUJPSBORVRfSVBWNF9ORl9DT05OVFJBQ0tfSUNNUF9USU1FT1VULAotCQkucHJvY25hbWUJPSAiaXBfY29ubnRyYWNrX2ljbXBfdGltZW91dCIsCi0JCS5kYXRhCQk9ICZpcF9jdF9pY21wX3RpbWVvdXQsCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCi0JCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19qaWZmaWVzLAotCX0sCi0JewotCQkuY3RsX25hbWUJPSBORVRfSVBWNF9ORl9DT05OVFJBQ0tfR0VORVJJQ19USU1FT1VULAotCQkucHJvY25hbWUJPSAiaXBfY29ubnRyYWNrX2dlbmVyaWNfdGltZW91dCIsCi0JCS5kYXRhCQk9ICZpcF9jdF9nZW5lcmljX3RpbWVvdXQsCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCi0JCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19qaWZmaWVzLAotCX0sCi0JewotCQkuY3RsX25hbWUJPSBORVRfSVBWNF9ORl9DT05OVFJBQ0tfTE9HX0lOVkFMSUQsCi0JCS5wcm9jbmFtZQk9ICJpcF9jb25udHJhY2tfbG9nX2ludmFsaWQiLAotCQkuZGF0YQkJPSAmaXBfY3RfbG9nX2ludmFsaWQsCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCi0JCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19taW5tYXgsCi0JCS5zdHJhdGVneQk9ICZzeXNjdGxfaW50dmVjLAotCQkuZXh0cmExCQk9ICZsb2dfaW52YWxpZF9wcm90b19taW4sCi0JCS5leHRyYTIJCT0gJmxvZ19pbnZhbGlkX3Byb3RvX21heCwKLQl9LAotCXsKLQkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfTkZfQ09OTlRSQUNLX1RDUF9USU1FT1VUX01BWF9SRVRSQU5TLAotCQkucHJvY25hbWUJPSAiaXBfY29ubnRyYWNrX3RjcF90aW1lb3V0X21heF9yZXRyYW5zIiwKLQkJLmRhdGEJCT0gJmlwX2N0X3RjcF90aW1lb3V0X21heF9yZXRyYW5zLAotCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAotCQkubW9kZQkJPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKLQl9LAotCXsKLQkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfTkZfQ09OTlRSQUNLX1RDUF9MT09TRSwKLQkJLnByb2NuYW1lCT0gImlwX2Nvbm50cmFja190Y3BfbG9vc2UiLAotCQkuZGF0YQkJPSAmaXBfY3RfdGNwX2xvb3NlLAotCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAotCQkubW9kZQkJPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMsCi0JfSwKLQl7Ci0JCS5jdGxfbmFtZQk9IE5FVF9JUFY0X05GX0NPTk5UUkFDS19UQ1BfQkVfTElCRVJBTCwKLQkJLnByb2NuYW1lCT0gImlwX2Nvbm50cmFja190Y3BfYmVfbGliZXJhbCIsCi0JCS5kYXRhCQk9ICZpcF9jdF90Y3BfYmVfbGliZXJhbCwKLQkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjLAotCX0sCi0JewotCQkuY3RsX25hbWUJPSBORVRfSVBWNF9ORl9DT05OVFJBQ0tfVENQX01BWF9SRVRSQU5TLAotCQkucHJvY25hbWUJPSAiaXBfY29ubnRyYWNrX3RjcF9tYXhfcmV0cmFucyIsCi0JCS5kYXRhCQk9ICZpcF9jdF90Y3BfbWF4X3JldHJhbnMsCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCi0JCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKLQl9LAotCXsgLmN0bF9uYW1lID0gMCB9Ci19OwotCi0jZGVmaW5lIE5FVF9JUF9DT05OVFJBQ0tfTUFYIDIwODkKLQotc3RhdGljIGN0bF90YWJsZSBpcF9jdF9uZXRmaWx0ZXJfdGFibGVbXSA9IHsKLQl7Ci0JCS5jdGxfbmFtZQk9IE5FVF9JUFY0X05FVEZJTFRFUiwKLQkJLnByb2NuYW1lCT0gIm5ldGZpbHRlciIsCi0JCS5tb2RlCQk9IDA1NTUsCi0JCS5jaGlsZAkJPSBpcF9jdF9zeXNjdGxfdGFibGUsCi0JfSwKLQl7Ci0JCS5jdGxfbmFtZQk9IE5FVF9JUF9DT05OVFJBQ0tfTUFYLAotCQkucHJvY25hbWUJPSAiaXBfY29ubnRyYWNrX21heCIsCi0JCS5kYXRhCQk9ICZpcF9jb25udHJhY2tfbWF4LAotCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAotCQkubW9kZQkJPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMKLQl9LAotCXsgLmN0bF9uYW1lID0gMCB9Ci19OwotCi1zdGF0aWMgY3RsX3RhYmxlIGlwX2N0X2lwdjRfdGFibGVbXSA9IHsKLQl7Ci0JCS5jdGxfbmFtZQk9IE5FVF9JUFY0LAotCQkucHJvY25hbWUJPSAiaXB2NCIsCi0JCS5tb2RlCQk9IDA1NTUsCi0JCS5jaGlsZAkJPSBpcF9jdF9uZXRmaWx0ZXJfdGFibGUsCi0JfSwKLQl7IC5jdGxfbmFtZSA9IDAgfQotfTsKLQotc3RhdGljIGN0bF90YWJsZSBpcF9jdF9uZXRfdGFibGVbXSA9IHsKLQl7Ci0JCS5jdGxfbmFtZQk9IENUTF9ORVQsCi0JCS5wcm9jbmFtZQk9ICJuZXQiLAotCQkubW9kZQkJPSAwNTU1LAotCQkuY2hpbGQJCT0gaXBfY3RfaXB2NF90YWJsZSwKLQl9LAotCXsgLmN0bF9uYW1lID0gMCB9Ci19OwotCi1FWFBPUlRfU1lNQk9MKGlwX2N0X2xvZ19pbnZhbGlkKTsKLSNlbmRpZiAvKiBDT05GSUdfU1lTQ1RMICovCi0KLS8qIEZJWE1FOiBBbGxvdyBOVUxMIGZ1bmN0aW9ucyBhbmQgc3ViIGluIHBvaW50ZXJzIHRvIGdlbmVyaWMgZm9yCi0gICB0aGVtLiAtLVJSICovCi1pbnQgaXBfY29ubnRyYWNrX3Byb3RvY29sX3JlZ2lzdGVyKHN0cnVjdCBpcF9jb25udHJhY2tfcHJvdG9jb2wgKnByb3RvKQotewotCWludCByZXQgPSAwOwotCi0Jd3JpdGVfbG9ja19iaCgmaXBfY29ubnRyYWNrX2xvY2spOwotCWlmIChpcF9jdF9wcm90b3NbcHJvdG8tPnByb3RvXSAhPSAmaXBfY29ubnRyYWNrX2dlbmVyaWNfcHJvdG9jb2wpIHsKLQkJcmV0ID0gLUVCVVNZOwotCQlnb3RvIG91dDsKLQl9Ci0JcmN1X2Fzc2lnbl9wb2ludGVyKGlwX2N0X3Byb3Rvc1twcm90by0+cHJvdG9dLCBwcm90byk7Ci0gb3V0OgotCXdyaXRlX3VubG9ja19iaCgmaXBfY29ubnRyYWNrX2xvY2spOwotCXJldHVybiByZXQ7Ci19Ci0KLXZvaWQgaXBfY29ubnRyYWNrX3Byb3RvY29sX3VucmVnaXN0ZXIoc3RydWN0IGlwX2Nvbm50cmFja19wcm90b2NvbCAqcHJvdG8pCi17Ci0Jd3JpdGVfbG9ja19iaCgmaXBfY29ubnRyYWNrX2xvY2spOwotCXJjdV9hc3NpZ25fcG9pbnRlcihpcF9jdF9wcm90b3NbcHJvdG8tPnByb3RvXSwKLQkJCSAgICZpcF9jb25udHJhY2tfZ2VuZXJpY19wcm90b2NvbCk7Ci0Jd3JpdGVfdW5sb2NrX2JoKCZpcF9jb25udHJhY2tfbG9jayk7Ci0Jc3luY2hyb25pemVfcmN1KCk7Ci0KLQkvKiBSZW1vdmUgYWxsIGNvbnRyYWNrIGVudHJpZXMgZm9yIHRoaXMgcHJvdG9jb2wgKi8KLQlpcF9jdF9pdGVyYXRlX2NsZWFudXAoa2lsbF9wcm90bywgJnByb3RvLT5wcm90byk7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IGlwX2Nvbm50cmFja19zdGFuZGFsb25lX2luaXQodm9pZCkKLXsKLSNpZmRlZiBDT05GSUdfUFJPQ19GUwotCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvYywgKnByb2NfZXhwLCAqcHJvY19zdGF0OwotI2VuZGlmCi0JaW50IHJldCA9IDA7Ci0KLQlyZXQgPSBpcF9jb25udHJhY2tfaW5pdCgpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0jaWZkZWYgQ09ORklHX1BST0NfRlMKLQlyZXQgPSAtRU5PTUVNOwotCXByb2MgPSBwcm9jX25ldF9mb3BzX2NyZWF0ZSgiaXBfY29ubnRyYWNrIiwgMDQ0MCwgJmN0X2ZpbGVfb3BzKTsKLQlpZiAoIXByb2MpIGdvdG8gY2xlYW51cF9pbml0OwotCi0JcHJvY19leHAgPSBwcm9jX25ldF9mb3BzX2NyZWF0ZSgiaXBfY29ubnRyYWNrX2V4cGVjdCIsIDA0NDAsCi0JCQkJCSZleHBfZmlsZV9vcHMpOwotCWlmICghcHJvY19leHApIGdvdG8gY2xlYW51cF9wcm9jOwotCi0JcHJvY19zdGF0ID0gY3JlYXRlX3Byb2NfZW50cnkoImlwX2Nvbm50cmFjayIsIFNfSVJVR08sIHByb2NfbmV0X3N0YXQpOwotCWlmICghcHJvY19zdGF0KQotCQlnb3RvIGNsZWFudXBfcHJvY19leHA7Ci0KLQlwcm9jX3N0YXQtPnByb2NfZm9wcyA9ICZjdF9jcHVfc2VxX2ZvcHM7Ci0JcHJvY19zdGF0LT5vd25lciA9IFRISVNfTU9EVUxFOwotI2VuZGlmCi0KLQlyZXQgPSBuZl9yZWdpc3Rlcl9ob29rcyhpcF9jb25udHJhY2tfb3BzLCBBUlJBWV9TSVpFKGlwX2Nvbm50cmFja19vcHMpKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcmludGsoImlwX2Nvbm50cmFjazogY2FuJ3QgcmVnaXN0ZXIgaG9va3MuXG4iKTsKLQkJZ290byBjbGVhbnVwX3Byb2Nfc3RhdDsKLQl9Ci0jaWZkZWYgQ09ORklHX1NZU0NUTAotCWlwX2N0X3N5c2N0bF9oZWFkZXIgPSByZWdpc3Rlcl9zeXNjdGxfdGFibGUoaXBfY3RfbmV0X3RhYmxlKTsKLQlpZiAoaXBfY3Rfc3lzY3RsX2hlYWRlciA9PSBOVUxMKSB7Ci0JCXByaW50aygiaXBfY29ubnRyYWNrOiBjYW4ndCByZWdpc3RlciB0byBzeXNjdGwuXG4iKTsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBjbGVhbnVwX2hvb2tzOwotCX0KLSNlbmRpZgotCXJldHVybiByZXQ7Ci0KLSNpZmRlZiBDT05GSUdfU1lTQ1RMCi0gY2xlYW51cF9ob29rczoKLQluZl91bnJlZ2lzdGVyX2hvb2tzKGlwX2Nvbm50cmFja19vcHMsIEFSUkFZX1NJWkUoaXBfY29ubnRyYWNrX29wcykpOwotI2VuZGlmCi0gY2xlYW51cF9wcm9jX3N0YXQ6Ci0jaWZkZWYgQ09ORklHX1BST0NfRlMKLQlyZW1vdmVfcHJvY19lbnRyeSgiaXBfY29ubnRyYWNrIiwgcHJvY19uZXRfc3RhdCk7Ci0gY2xlYW51cF9wcm9jX2V4cDoKLQlwcm9jX25ldF9yZW1vdmUoImlwX2Nvbm50cmFja19leHBlY3QiKTsKLSBjbGVhbnVwX3Byb2M6Ci0JcHJvY19uZXRfcmVtb3ZlKCJpcF9jb25udHJhY2siKTsKLSBjbGVhbnVwX2luaXQ6Ci0jZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KLQlpcF9jb25udHJhY2tfY2xlYW51cCgpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBpcF9jb25udHJhY2tfc3RhbmRhbG9uZV9maW5pKHZvaWQpCi17Ci0Jc3luY2hyb25pemVfbmV0KCk7Ci0jaWZkZWYgQ09ORklHX1NZU0NUTAotCXVucmVnaXN0ZXJfc3lzY3RsX3RhYmxlKGlwX2N0X3N5c2N0bF9oZWFkZXIpOwotI2VuZGlmCi0JbmZfdW5yZWdpc3Rlcl9ob29rcyhpcF9jb25udHJhY2tfb3BzLCBBUlJBWV9TSVpFKGlwX2Nvbm50cmFja19vcHMpKTsKLSNpZmRlZiBDT05GSUdfUFJPQ19GUwotCXJlbW92ZV9wcm9jX2VudHJ5KCJpcF9jb25udHJhY2siLCBwcm9jX25ldF9zdGF0KTsKLQlwcm9jX25ldF9yZW1vdmUoImlwX2Nvbm50cmFja19leHBlY3QiKTsKLQlwcm9jX25ldF9yZW1vdmUoImlwX2Nvbm50cmFjayIpOwotI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCi0JaXBfY29ubnRyYWNrX2NsZWFudXAoKTsKLX0KLQotbW9kdWxlX2luaXQoaXBfY29ubnRyYWNrX3N0YW5kYWxvbmVfaW5pdCk7Ci1tb2R1bGVfZXhpdChpcF9jb25udHJhY2tfc3RhbmRhbG9uZV9maW5pKTsKLQotLyogU29tZSBtb2R1bGVzIG5lZWQgdXMsIGJ1dCBkb24ndCBkZXBlbmQgZGlyZWN0bHkgb24gYW55IHN5bWJvbC4KLSAgIFRoZXkgc2hvdWxkIGNhbGwgdGhpcy4gKi8KLXZvaWQgbmVlZF9jb25udHJhY2sodm9pZCkKLXsKLX0KLQotI2lmZGVmIENPTkZJR19JUF9ORl9DT05OVFJBQ0tfRVZFTlRTCi1FWFBPUlRfU1lNQk9MX0dQTChpcF9jb25udHJhY2tfY2hhaW4pOwotRVhQT1JUX1NZTUJPTF9HUEwoaXBfY29ubnRyYWNrX2V4cGVjdF9jaGFpbik7Ci1FWFBPUlRfU1lNQk9MX0dQTChpcF9jb25udHJhY2tfcmVnaXN0ZXJfbm90aWZpZXIpOwotRVhQT1JUX1NZTUJPTF9HUEwoaXBfY29ubnRyYWNrX3VucmVnaXN0ZXJfbm90aWZpZXIpOwotRVhQT1JUX1NZTUJPTF9HUEwoX19pcF9jdF9ldmVudF9jYWNoZV9pbml0KTsKLUVYUE9SVF9QRVJfQ1BVX1NZTUJPTF9HUEwoaXBfY29ubnRyYWNrX2VjYWNoZSk7Ci0jZW5kaWYKLUVYUE9SVF9TWU1CT0woaXBfY29ubnRyYWNrX3Byb3RvY29sX3JlZ2lzdGVyKTsKLUVYUE9SVF9TWU1CT0woaXBfY29ubnRyYWNrX3Byb3RvY29sX3VucmVnaXN0ZXIpOwotRVhQT1JUX1NZTUJPTChpcF9jdF9nZXRfdHVwbGUpOwotRVhQT1JUX1NZTUJPTChpbnZlcnRfdHVwbGVwcik7Ci1FWFBPUlRfU1lNQk9MKGlwX2Nvbm50cmFja19hbHRlcl9yZXBseSk7Ci1FWFBPUlRfU1lNQk9MKGlwX2Nvbm50cmFja19kZXN0cm95ZWQpOwotRVhQT1JUX1NZTUJPTChuZWVkX2Nvbm50cmFjayk7Ci1FWFBPUlRfU1lNQk9MKGlwX2Nvbm50cmFja19oZWxwZXJfcmVnaXN0ZXIpOwotRVhQT1JUX1NZTUJPTChpcF9jb25udHJhY2tfaGVscGVyX3VucmVnaXN0ZXIpOwotRVhQT1JUX1NZTUJPTChpcF9jdF9pdGVyYXRlX2NsZWFudXApOwotRVhQT1JUX1NZTUJPTChfX2lwX2N0X3JlZnJlc2hfYWNjdCk7Ci0KLUVYUE9SVF9TWU1CT0woaXBfY29ubnRyYWNrX2V4cGVjdF9hbGxvYyk7Ci1FWFBPUlRfU1lNQk9MKGlwX2Nvbm50cmFja19leHBlY3RfcHV0KTsKLUVYUE9SVF9TWU1CT0xfR1BMKF9faXBfY29ubnRyYWNrX2V4cGVjdF9maW5kKTsKLUVYUE9SVF9TWU1CT0xfR1BMKGlwX2Nvbm50cmFja19leHBlY3RfZmluZF9nZXQpOwotRVhQT1JUX1NZTUJPTChpcF9jb25udHJhY2tfZXhwZWN0X3JlbGF0ZWQpOwotRVhQT1JUX1NZTUJPTChpcF9jb25udHJhY2tfdW5leHBlY3RfcmVsYXRlZCk7Ci1FWFBPUlRfU1lNQk9MX0dQTChpcF9jb25udHJhY2tfZXhwZWN0X2xpc3QpOwotRVhQT1JUX1NZTUJPTF9HUEwoaXBfY3RfdW5saW5rX2V4cGVjdCk7Ci0KLUVYUE9SVF9TWU1CT0woaXBfY29ubnRyYWNrX3R1cGxlX3Rha2VuKTsKLUVYUE9SVF9TWU1CT0woaXBfY3RfZ2F0aGVyX2ZyYWdzKTsKLUVYUE9SVF9TWU1CT0woaXBfY29ubnRyYWNrX2h0YWJsZV9zaXplKTsKLUVYUE9SVF9TWU1CT0woaXBfY29ubnRyYWNrX2xvY2spOwotRVhQT1JUX1NZTUJPTChpcF9jb25udHJhY2tfaGFzaCk7Ci1FWFBPUlRfU1lNQk9MKGlwX2Nvbm50cmFja191bnRyYWNrZWQpOwotRVhQT1JUX1NZTUJPTF9HUEwoaXBfY29ubnRyYWNrX2ZpbmRfZ2V0KTsKLSNpZmRlZiBDT05GSUdfSVBfTkZfTkFUX05FRURFRAotRVhQT1JUX1NZTUJPTChpcF9jb25udHJhY2tfdGNwX3VwZGF0ZSk7Ci0jZW5kaWYKLQotRVhQT1JUX1NZTUJPTF9HUEwoaXBfY29ubnRyYWNrX2ZsdXNoKTsKLUVYUE9SVF9TWU1CT0xfR1BMKF9faXBfY29ubnRyYWNrX2ZpbmQpOwotCi1FWFBPUlRfU1lNQk9MX0dQTChpcF9jb25udHJhY2tfYWxsb2MpOwotRVhQT1JUX1NZTUJPTF9HUEwoaXBfY29ubnRyYWNrX2ZyZWUpOwotRVhQT1JUX1NZTUJPTF9HUEwoaXBfY29ubnRyYWNrX2hhc2hfaW5zZXJ0KTsKLQotRVhQT1JUX1NZTUJPTF9HUEwoaXBfY3RfcmVtb3ZlX2V4cGVjdGF0aW9ucyk7Ci0KLUVYUE9SVF9TWU1CT0xfR1BMKGlwX2Nvbm50cmFja19oZWxwZXJfZmluZF9nZXQpOwotRVhQT1JUX1NZTUJPTF9HUEwoaXBfY29ubnRyYWNrX2hlbHBlcl9wdXQpOwotRVhQT1JUX1NZTUJPTF9HUEwoX19pcF9jb25udHJhY2tfaGVscGVyX2ZpbmRfYnluYW1lKTsKLQotRVhQT1JUX1NZTUJPTF9HUEwoaXBfY29ubnRyYWNrX3Byb3RvX2ZpbmRfZ2V0KTsKLUVYUE9SVF9TWU1CT0xfR1BMKGlwX2Nvbm50cmFja19wcm90b19wdXQpOwotRVhQT1JUX1NZTUJPTF9HUEwoX19pcF9jb25udHJhY2tfcHJvdG9fZmluZCk7Ci1FWFBPUlRfU1lNQk9MX0dQTChpcF9jb25udHJhY2tfY2hlY2tzdW0pOwotI2lmIGRlZmluZWQoQ09ORklHX0lQX05GX0NPTk5UUkFDS19ORVRMSU5LKSB8fCBcCi0gICAgZGVmaW5lZChDT05GSUdfSVBfTkZfQ09OTlRSQUNLX05FVExJTktfTU9EVUxFKQotRVhQT1JUX1NZTUJPTF9HUEwoaXBfY3RfcG9ydF90dXBsZV90b19uZmF0dHIpOwotRVhQT1JUX1NZTUJPTF9HUEwoaXBfY3RfcG9ydF9uZmF0dHJfdG9fdHVwbGUpOwotI2VuZGlmCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX3RmdHAuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfdGZ0cC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmUxNzVlLi4wMDAwMDAwCi0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfdGZ0cC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qIChDKSAyMDAxLTIwMDIgTWFnbnVzIEJvZGVuIDxtYkBvemFiYS5taW5lLm51PgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVmVyc2lvbjogMC4wLjcKLSAqCi0gKiBUaHUgMjEgTWFyIDIwMDIgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KLSAqIAktIHBvcnQgdG8gbmV3bmF0IEFQSQotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaXAuaD4KLSNpbmNsdWRlIDxsaW51eC91ZHAuaD4KLQotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19oZWxwZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfdGZ0cC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+Ci0KLU1PRFVMRV9BVVRIT1IoIk1hZ251cyBCb2RlbiA8bWJAb3phYmEubWluZS5udT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigidGZ0cCBjb25uZWN0aW9uIHRyYWNraW5nIGhlbHBlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi0jZGVmaW5lIE1BWF9QT1JUUyA4Ci1zdGF0aWMgdW5zaWduZWQgc2hvcnQgcG9ydHNbTUFYX1BPUlRTXTsKLXN0YXRpYyBpbnQgcG9ydHNfYzsKLW1vZHVsZV9wYXJhbV9hcnJheShwb3J0cywgdXNob3J0LCAmcG9ydHNfYywgMDQwMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKHBvcnRzLCAicG9ydCBudW1iZXJzIG9mIHRmdHAgc2VydmVycyIpOwotCi0jaWYgMAotI2RlZmluZSBERUJVR1AoZm9ybWF0LCBhcmdzLi4uKSBwcmludGsoIiVzOiVzOiIgZm9ybWF0LCBcCi0JCQkJICAgICAgIF9fRklMRV9fLCBfX0ZVTkNUSU9OX18gLCAjIyBhcmdzKQotI2Vsc2UKLSNkZWZpbmUgREVCVUdQKGZvcm1hdCwgYXJncy4uLikKLSNlbmRpZgotCi11bnNpZ25lZCBpbnQgKCppcF9uYXRfdGZ0cF9ob29rKShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCi0JCQkJIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAotCQkJCSBzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqZXhwKTsKLUVYUE9SVF9TWU1CT0xfR1BMKGlwX25hdF90ZnRwX2hvb2spOwotCi1zdGF0aWMgaW50IHRmdHBfaGVscChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCi0JCSAgICAgc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsCi0JCSAgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8pCi17Ci0Jc3RydWN0IHRmdHBoZHIgX3RmdHBoLCAqdGZoOwotCXN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpleHA7Ci0JdW5zaWduZWQgaW50IHJldCA9IE5GX0FDQ0VQVDsKLQl0eXBlb2YoaXBfbmF0X3RmdHBfaG9vaykgaXBfbmF0X3RmdHA7Ci0KLQl0ZmggPSBza2JfaGVhZGVyX3BvaW50ZXIoKnBza2IsCi0JCQkJICgqcHNrYiktPm5oLmlwaC0+aWhsKjQrc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpLAotCQkJCSBzaXplb2YoX3RmdHBoKSwgJl90ZnRwaCk7Ci0JaWYgKHRmaCA9PSBOVUxMKQotCQlyZXR1cm4gTkZfQUNDRVBUOwotCi0Jc3dpdGNoIChudG9ocyh0ZmgtPm9wY29kZSkpIHsKLQkvKiBSUlEgYW5kIFdSUSB3b3JrcyB0aGUgc2FtZSB3YXkgKi8KLQljYXNlIFRGVFBfT1BDT0RFX1JFQUQ6Ci0JY2FzZSBURlRQX09QQ09ERV9XUklURToKLQkJREVCVUdQKCIiKTsKLQkJRFVNUF9UVVBMRSgmY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlKTsKLQkJRFVNUF9UVVBMRSgmY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlKTsKLQotCQlleHAgPSBpcF9jb25udHJhY2tfZXhwZWN0X2FsbG9jKGN0KTsKLQkJaWYgKGV4cCA9PSBOVUxMKQotCQkJcmV0dXJuIE5GX0RST1A7Ci0KLQkJZXhwLT50dXBsZSA9IGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX1JFUExZXS50dXBsZTsKLQkJZXhwLT5tYXNrLnNyYy5pcCA9IGh0b25sKDB4ZmZmZmZmZmYpOwotCQlleHAtPm1hc2suc3JjLnUudWRwLnBvcnQgPSAwOwotCQlleHAtPm1hc2suZHN0LmlwID0gaHRvbmwoMHhmZmZmZmZmZik7Ci0JCWV4cC0+bWFzay5kc3QudS51ZHAucG9ydCA9IGh0b25zKDB4ZmZmZik7Ci0JCWV4cC0+bWFzay5kc3QucHJvdG9udW0gPSAweGZmOwotCQlleHAtPmV4cGVjdGZuID0gTlVMTDsKLQkJZXhwLT5mbGFncyA9IDA7Ci0KLQkJREVCVUdQKCJleHBlY3Q6ICIpOwotCQlEVU1QX1RVUExFKCZleHAtPnR1cGxlKTsKLQkJRFVNUF9UVVBMRSgmZXhwLT5tYXNrKTsKLQkJaXBfbmF0X3RmdHAgPSByY3VfZGVyZWZlcmVuY2UoaXBfbmF0X3RmdHBfaG9vayk7Ci0JCWlmIChpcF9uYXRfdGZ0cCkKLQkJCXJldCA9IGlwX25hdF90ZnRwKHBza2IsIGN0aW5mbywgZXhwKTsKLQkJZWxzZSBpZiAoaXBfY29ubnRyYWNrX2V4cGVjdF9yZWxhdGVkKGV4cCkgIT0gMCkKLQkJCXJldCA9IE5GX0RST1A7Ci0JCWlwX2Nvbm50cmFja19leHBlY3RfcHV0KGV4cCk7Ci0JCWJyZWFrOwotCWNhc2UgVEZUUF9PUENPREVfREFUQToKLQljYXNlIFRGVFBfT1BDT0RFX0FDSzoKLQkJREVCVUdQKCJEYXRhL0FDSyBvcGNvZGVcbiIpOwotCQlicmVhazsKLQljYXNlIFRGVFBfT1BDT0RFX0VSUk9SOgotCQlERUJVR1AoIkVycm9yIG9wY29kZVxuIik7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCURFQlVHUCgiVW5rbm93biBvcGNvZGVcbiIpOwotCX0KLQlyZXR1cm4gTkZfQUNDRVBUOwotfQotCi1zdGF0aWMgc3RydWN0IGlwX2Nvbm50cmFja19oZWxwZXIgdGZ0cFtNQVhfUE9SVFNdOwotc3RhdGljIGNoYXIgdGZ0cF9uYW1lc1tNQVhfUE9SVFNdW3NpemVvZigidGZ0cC02NTUzNSIpXTsKLQotc3RhdGljIHZvaWQgaXBfY29ubnRyYWNrX3RmdHBfZmluaSh2b2lkKQotewotCWludCBpOwotCi0JZm9yIChpID0gMCA7IGkgPCBwb3J0c19jOyBpKyspIHsKLQkJREVCVUdQKCJ1bnJlZ2lzdGVyaW5nIGhlbHBlciBmb3IgcG9ydCAlZFxuIiwKLQkJCXBvcnRzW2ldKTsKLQkJaXBfY29ubnRyYWNrX2hlbHBlcl91bnJlZ2lzdGVyKCZ0ZnRwW2ldKTsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IGlwX2Nvbm50cmFja190ZnRwX2luaXQodm9pZCkKLXsKLQlpbnQgaSwgcmV0OwotCWNoYXIgKnRtcG5hbWU7Ci0KLQlpZiAocG9ydHNfYyA9PSAwKQotCQlwb3J0c1twb3J0c19jKytdID0gVEZUUF9QT1JUOwotCi0JZm9yIChpID0gMDsgaSA8IHBvcnRzX2M7IGkrKykgewotCQkvKiBDcmVhdGUgaGVscGVyIHN0cnVjdHVyZSAqLwotCQltZW1zZXQoJnRmdHBbaV0sIDAsIHNpemVvZihzdHJ1Y3QgaXBfY29ubnRyYWNrX2hlbHBlcikpOwotCi0JCXRmdHBbaV0udHVwbGUuZHN0LnByb3RvbnVtID0gSVBQUk9UT19VRFA7Ci0JCXRmdHBbaV0udHVwbGUuc3JjLnUudWRwLnBvcnQgPSBodG9ucyhwb3J0c1tpXSk7Ci0JCXRmdHBbaV0ubWFzay5kc3QucHJvdG9udW0gPSAweEZGOwotCQl0ZnRwW2ldLm1hc2suc3JjLnUudWRwLnBvcnQgPSBodG9ucygweEZGRkYpOwotCQl0ZnRwW2ldLm1heF9leHBlY3RlZCA9IDE7Ci0JCXRmdHBbaV0udGltZW91dCA9IDUgKiA2MDsgLyogNSBtaW51dGVzICovCi0JCXRmdHBbaV0ubWUgPSBUSElTX01PRFVMRTsKLQkJdGZ0cFtpXS5oZWxwID0gdGZ0cF9oZWxwOwotCi0JCXRtcG5hbWUgPSAmdGZ0cF9uYW1lc1tpXVswXTsKLQkJaWYgKHBvcnRzW2ldID09IFRGVFBfUE9SVCkKLQkJCXNwcmludGYodG1wbmFtZSwgInRmdHAiKTsKLQkJZWxzZQotCQkJc3ByaW50Zih0bXBuYW1lLCAidGZ0cC0lZCIsIGkpOwotCQl0ZnRwW2ldLm5hbWUgPSB0bXBuYW1lOwotCi0JCURFQlVHUCgicG9ydCAjJWQ6ICVkXG4iLCBpLCBwb3J0c1tpXSk7Ci0KLQkJcmV0PWlwX2Nvbm50cmFja19oZWxwZXJfcmVnaXN0ZXIoJnRmdHBbaV0pOwotCQlpZiAocmV0KSB7Ci0JCQlwcmludGsoIkVSUk9SIHJlZ2lzdGVyaW5nIGhlbHBlciBmb3IgcG9ydCAlZFxuIiwKLQkJCQlwb3J0c1tpXSk7Ci0JCQlpcF9jb25udHJhY2tfdGZ0cF9maW5pKCk7Ci0JCQlyZXR1cm4ocmV0KTsKLQkJfQotCX0KLQlyZXR1cm4oMCk7Ci19Ci0KLW1vZHVsZV9pbml0KGlwX2Nvbm50cmFja190ZnRwX2luaXQpOwotbW9kdWxlX2V4aXQoaXBfY29ubnRyYWNrX3RmdHBfZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X2FtYW5kYS5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9hbWFuZGEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVkZjFhOS4uMDAwMDAwMAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X2FtYW5kYS5jCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyogQW1hbmRhIGV4dGVuc2lvbiBmb3IgVENQIE5BVCBhbHRlcmF0aW9uLgotICogKEMpIDIwMDIgYnkgQnJpYW4gSi4gTXVycmVsbCA8bmV0ZmlsdGVyQGludGVybGlueC5iYy5jYT4KLSAqIGJhc2VkIG9uIGEgY29weSBvZiBIVydzIGlwX25hdF9pcmMuYyBhcyB3ZWxsIGFzIG90aGVyIG1vZHVsZXMKLSAqCi0gKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqICAgICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gKiAgICAgIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICoJTW9kdWxlIGxvYWQgc3ludGF4OgotICogCWluc21vZCBpcF9uYXRfYW1hbmRhLm8KLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0jaW5jbHVkZSA8bGludXgvaXAuaD4KLSNpbmNsdWRlIDxsaW51eC91ZHAuaD4KLSNpbmNsdWRlIDxuZXQvdGNwLmg+Ci0jaW5jbHVkZSA8bmV0L3VkcC5oPgotCi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9uYXQuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9uYXRfaGVscGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2hlbHBlci5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19hbWFuZGEuaD4KLQotCi1NT0RVTEVfQVVUSE9SKCJCcmlhbiBKLiBNdXJyZWxsIDxuZXRmaWx0ZXJAaW50ZXJsaW54LmJjLmNhPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJBbWFuZGEgTkFUIGhlbHBlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi1zdGF0aWMgdW5zaWduZWQgaW50IGhlbHAoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAotCQkJIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAotCQkJIHVuc2lnbmVkIGludCBtYXRjaG9mZiwKLQkJCSB1bnNpZ25lZCBpbnQgbWF0Y2hsZW4sCi0JCQkgc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmV4cCkKLXsKLQljaGFyIGJ1ZmZlcltzaXplb2YoIjY1NTM1IildOwotCXVfaW50MTZfdCBwb3J0OwotCXVuc2lnbmVkIGludCByZXQ7Ci0KLQkvKiBDb25uZWN0aW9uIGNvbWVzIGZyb20gY2xpZW50LiAqLwotCWV4cC0+c2F2ZWRfcHJvdG8udGNwLnBvcnQgPSBleHAtPnR1cGxlLmRzdC51LnRjcC5wb3J0OwotCWV4cC0+ZGlyID0gSVBfQ1RfRElSX09SSUdJTkFMOwotCi0JLyogV2hlbiB5b3Ugc2VlIHRoZSBwYWNrZXQsIHdlIG5lZWQgdG8gTkFUIGl0IHRoZSBzYW1lIGFzIHRoZQotCSAqIHRoaXMgb25lIChpZS4gc2FtZSBJUDogaXQgd2lsbCBiZSBUQ1AgYW5kIG1hc3RlciBpcyBVRFApLiAqLwotCWV4cC0+ZXhwZWN0Zm4gPSBpcF9uYXRfZm9sbG93X21hc3RlcjsKLQotCS8qIFRyeSB0byBnZXQgc2FtZSBwb3J0OiBpZiBub3QsIHRyeSB0byBjaGFuZ2UgaXQuICovCi0JZm9yIChwb3J0ID0gbnRvaHMoZXhwLT5zYXZlZF9wcm90by50Y3AucG9ydCk7IHBvcnQgIT0gMDsgcG9ydCsrKSB7Ci0JCWV4cC0+dHVwbGUuZHN0LnUudGNwLnBvcnQgPSBodG9ucyhwb3J0KTsKLQkJaWYgKGlwX2Nvbm50cmFja19leHBlY3RfcmVsYXRlZChleHApID09IDApCi0JCQlicmVhazsKLQl9Ci0KLQlpZiAocG9ydCA9PSAwKQotCQlyZXR1cm4gTkZfRFJPUDsKLQotCXNwcmludGYoYnVmZmVyLCAiJXUiLCBwb3J0KTsKLQlyZXQgPSBpcF9uYXRfbWFuZ2xlX3VkcF9wYWNrZXQocHNrYiwgZXhwLT5tYXN0ZXIsIGN0aW5mbywKLQkJCQkgICAgICAgbWF0Y2hvZmYsIG1hdGNobGVuLAotCQkJCSAgICAgICBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLQlpZiAocmV0ICE9IE5GX0FDQ0VQVCkKLQkJaXBfY29ubnRyYWNrX3VuZXhwZWN0X3JlbGF0ZWQoZXhwKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgaXBfbmF0X2FtYW5kYV9maW5pKHZvaWQpCi17Ci0JcmN1X2Fzc2lnbl9wb2ludGVyKGlwX25hdF9hbWFuZGFfaG9vaywgTlVMTCk7Ci0Jc3luY2hyb25pemVfcmN1KCk7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IGlwX25hdF9hbWFuZGFfaW5pdCh2b2lkKQotewotCUJVR19PTihyY3VfZGVyZWZlcmVuY2UoaXBfbmF0X2FtYW5kYV9ob29rKSk7Ci0JcmN1X2Fzc2lnbl9wb2ludGVyKGlwX25hdF9hbWFuZGFfaG9vaywgaGVscCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLW1vZHVsZV9pbml0KGlwX25hdF9hbWFuZGFfaW5pdCk7Ci1tb2R1bGVfZXhpdChpcF9uYXRfYW1hbmRhX2ZpbmkpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9jb3JlLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X2NvcmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA3MzdmZC4uMDAwMDAwMAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X2NvcmUuYworKysgL2Rldi9udWxsCkBAIC0xLDYzNCArMCwwIEBACi0vKiBOQVQgZm9yIG5ldGZpbHRlcjsgc2hhcmVkIHdpdGggY29tcGF0aWJpbGl0eSBsYXllci4gKi8KLQotLyogKEMpIDE5OTktMjAwMSBQYXVsIGBSdXN0eScgUnVzc2VsbAotICogKEMpIDIwMDItMjAwNCBOZXRmaWx0ZXIgQ29yZSBUZWFtIDxjb3JldGVhbUBuZXRmaWx0ZXIub3JnPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvdGltZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC5oPgotI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KLSNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KLSNpbmNsdWRlIDxuZXQvaWNtcC5oPgotI2luY2x1ZGUgPG5ldC9pcC5oPgotI2luY2x1ZGUgPG5ldC90Y3AuaD4gIC8qIEZvciB0Y3BfcHJvdCBpbiBnZXRvcmlnZHN0ICovCi0jaW5jbHVkZSA8bGludXgvaWNtcC5oPgotI2luY2x1ZGUgPGxpbnV4L3VkcC5oPgotI2luY2x1ZGUgPGxpbnV4L2poYXNoLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2suaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfY29yZS5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19wcm90b2NvbC5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdC5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdF9wcm90b2NvbC5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdF9jb3JlLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0X2hlbHBlci5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19oZWxwZXIuaD4KLQotI2lmIDAKLSNkZWZpbmUgREVCVUdQIHByaW50awotI2Vsc2UKLSNkZWZpbmUgREVCVUdQKGZvcm1hdCwgYXJncy4uLikKLSNlbmRpZgotCi1ERUZJTkVfUldMT0NLKGlwX25hdF9sb2NrKTsKLQotLyogQ2FsY3VsYXRlZCBhdCBpbml0IGJhc2VkIG9uIG1lbW9yeSBzaXplICovCi1zdGF0aWMgdW5zaWduZWQgaW50IGlwX25hdF9odGFibGVfc2l6ZTsKLQotc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgKmJ5c291cmNlOwotCi0jZGVmaW5lIE1BWF9JUF9OQVRfUFJPVE8gMjU2Ci1zdGF0aWMgc3RydWN0IGlwX25hdF9wcm90b2NvbCAqaXBfbmF0X3Byb3Rvc1tNQVhfSVBfTkFUX1BST1RPXTsKLQotc3RhdGljIGlubGluZSBzdHJ1Y3QgaXBfbmF0X3Byb3RvY29sICoKLV9faXBfbmF0X3Byb3RvX2ZpbmQodV9pbnQ4X3QgcHJvdG9udW0pCi17Ci0JcmV0dXJuIHJjdV9kZXJlZmVyZW5jZShpcF9uYXRfcHJvdG9zW3Byb3RvbnVtXSk7Ci19Ci0KLXN0cnVjdCBpcF9uYXRfcHJvdG9jb2wgKgotaXBfbmF0X3Byb3RvX2ZpbmRfZ2V0KHVfaW50OF90IHByb3RvbnVtKQotewotCXN0cnVjdCBpcF9uYXRfcHJvdG9jb2wgKnA7Ci0KLQlyY3VfcmVhZF9sb2NrKCk7Ci0JcCA9IF9faXBfbmF0X3Byb3RvX2ZpbmQocHJvdG9udW0pOwotCWlmICghdHJ5X21vZHVsZV9nZXQocC0+bWUpKQotCQlwID0gJmlwX25hdF91bmtub3duX3Byb3RvY29sOwotCXJjdV9yZWFkX3VubG9jaygpOwotCi0JcmV0dXJuIHA7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChpcF9uYXRfcHJvdG9fZmluZF9nZXQpOwotCi12b2lkCi1pcF9uYXRfcHJvdG9fcHV0KHN0cnVjdCBpcF9uYXRfcHJvdG9jb2wgKnApCi17Ci0JbW9kdWxlX3B1dChwLT5tZSk7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChpcF9uYXRfcHJvdG9fcHV0KTsKLQotLyogV2Uga2VlcCBhbiBleHRyYSBoYXNoIGZvciBlYWNoIGNvbm50cmFjaywgZm9yIGZhc3Qgc2VhcmNoaW5nLiAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQKLWhhc2hfYnlfc3JjKGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnR1cGxlKQotewotCS8qIE9yaWdpbmFsIHNyYywgdG8gZW5zdXJlIHdlIG1hcCBpdCBjb25zaXN0ZW50bHkgaWYgcG9zcy4gKi8KLQlyZXR1cm4gamhhc2hfM3dvcmRzKChfX2ZvcmNlIHUzMil0dXBsZS0+c3JjLmlwLCB0dXBsZS0+c3JjLnUuYWxsLAotCQkJICAgIHR1cGxlLT5kc3QucHJvdG9udW0sIDApICUgaXBfbmF0X2h0YWJsZV9zaXplOwotfQotCi0vKiBOb29uZSB1c2luZyBjb25udHJhY2sgYnkgdGhlIHRpbWUgdGhpcyBjYWxsZWQuICovCi1zdGF0aWMgdm9pZCBpcF9uYXRfY2xlYW51cF9jb25udHJhY2soc3RydWN0IGlwX2Nvbm50cmFjayAqY29ubikKLXsKLQlpZiAoIShjb25uLT5zdGF0dXMgJiBJUFNfTkFUX0RPTkVfTUFTSykpCi0JCXJldHVybjsKLQotCXdyaXRlX2xvY2tfYmgoJmlwX25hdF9sb2NrKTsKLQlsaXN0X2RlbCgmY29ubi0+bmF0LmluZm8uYnlzb3VyY2UpOwotCXdyaXRlX3VubG9ja19iaCgmaXBfbmF0X2xvY2spOwotfQotCi0vKiBJcyB0aGlzIHR1cGxlIGFscmVhZHkgdGFrZW4/IChub3QgYnkgdXMpICovCi1pbnQKLWlwX25hdF91c2VkX3R1cGxlKGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnR1cGxlLAotCQkgIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2sgKmlnbm9yZWRfY29ubnRyYWNrKQotewotCS8qIENvbm50cmFjayB0cmFja2luZyBkb2Vzbid0IGtlZXAgdHJhY2sgb2Ygb3V0Z29pbmcgdHVwbGVzOyBvbmx5Ci0JICAgaW5jb21pbmcgb25lcy4gIE5BVCBtZWFucyB0aGV5IGRvbid0IGhhdmUgYSBmaXhlZCBtYXBwaW5nLAotCSAgIHNvIHdlIGludmVydCB0aGUgdHVwbGUgYW5kIGxvb2sgZm9yIHRoZSBpbmNvbWluZyByZXBseS4KLQotCSAgIFdlIGNvdWxkIGtlZXAgYSBzZXBhcmF0ZSBoYXNoIGlmIHRoaXMgcHJvdmVzIHRvbyBzbG93LiAqLwotCXN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgcmVwbHk7Ci0KLQlpbnZlcnRfdHVwbGVwcigmcmVwbHksIHR1cGxlKTsKLQlyZXR1cm4gaXBfY29ubnRyYWNrX3R1cGxlX3Rha2VuKCZyZXBseSwgaWdub3JlZF9jb25udHJhY2spOwotfQotRVhQT1JUX1NZTUJPTChpcF9uYXRfdXNlZF90dXBsZSk7Ci0KLS8qIElmIHdlIHNvdXJjZSBtYXAgdGhpcyB0dXBsZSBzbyByZXBseSBsb29rcyBsaWtlIHJlcGx5X3R1cGxlLCB3aWxsCi0gKiB0aGF0IG1lZXQgdGhlIGNvbnN0cmFpbnRzIG9mIHJhbmdlLiAqLwotc3RhdGljIGludAotaW5fcmFuZ2UoY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUsCi0JIGNvbnN0IHN0cnVjdCBpcF9uYXRfcmFuZ2UgKnJhbmdlKQotewotCXN0cnVjdCBpcF9uYXRfcHJvdG9jb2wgKnByb3RvOwotCWludCByZXQgPSAwOwotCi0JLyogSWYgd2UgYXJlIHN1cHBvc2VkIHRvIG1hcCBJUHMsIHRoZW4gd2UgbXVzdCBiZSBpbiB0aGUKLQkgICByYW5nZSBzcGVjaWZpZWQsIG90aGVyd2lzZSBsZXQgdGhpcyBkcmFnIHVzIG9udG8gYSBuZXcgc3JjIElQLiAqLwotCWlmIChyYW5nZS0+ZmxhZ3MgJiBJUF9OQVRfUkFOR0VfTUFQX0lQUykgewotCQlpZiAobnRvaGwodHVwbGUtPnNyYy5pcCkgPCBudG9obChyYW5nZS0+bWluX2lwKQotCQkgICAgfHwgbnRvaGwodHVwbGUtPnNyYy5pcCkgPiBudG9obChyYW5nZS0+bWF4X2lwKSkKLQkJCXJldHVybiAwOwotCX0KLQotCXJjdV9yZWFkX2xvY2soKTsKLQlwcm90byA9IF9faXBfbmF0X3Byb3RvX2ZpbmQodHVwbGUtPmRzdC5wcm90b251bSk7Ci0JaWYgKCEocmFuZ2UtPmZsYWdzICYgSVBfTkFUX1JBTkdFX1BST1RPX1NQRUNJRklFRCkKLQkgICAgfHwgcHJvdG8tPmluX3JhbmdlKHR1cGxlLCBJUF9OQVRfTUFOSVBfU1JDLAotCQkJICAgICAgICZyYW5nZS0+bWluLCAmcmFuZ2UtPm1heCkpCi0JCXJldCA9IDE7Ci0JcmN1X3JlYWRfdW5sb2NrKCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW5saW5lIGludAotc2FtZV9zcmMoY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsCi0JIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnR1cGxlKQotewotCXJldHVybiAoY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLmRzdC5wcm90b251bQotCQk9PSB0dXBsZS0+ZHN0LnByb3RvbnVtCi0JCSYmIGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZS5zcmMuaXAKLQkJPT0gdHVwbGUtPnNyYy5pcAotCQkmJiBjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUuc3JjLnUuYWxsCi0JCT09IHR1cGxlLT5zcmMudS5hbGwpOwotfQotCi0vKiBPbmx5IGNhbGxlZCBmb3IgU1JDIG1hbmlwICovCi1zdGF0aWMgaW50Ci1maW5kX2FwcHJvcHJpYXRlX3NyYyhjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0dXBsZSwKLQkJICAgICBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICpyZXN1bHQsCi0JCSAgICAgY29uc3Qgc3RydWN0IGlwX25hdF9yYW5nZSAqcmFuZ2UpCi17Ci0JdW5zaWduZWQgaW50IGggPSBoYXNoX2J5X3NyYyh0dXBsZSk7Ci0Jc3RydWN0IGlwX2Nvbm50cmFjayAqY3Q7Ci0KLQlyZWFkX2xvY2tfYmgoJmlwX25hdF9sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGN0LCAmYnlzb3VyY2VbaF0sIG5hdC5pbmZvLmJ5c291cmNlKSB7Ci0JCWlmIChzYW1lX3NyYyhjdCwgdHVwbGUpKSB7Ci0JCQkvKiBDb3B5IHNvdXJjZSBwYXJ0IGZyb20gcmVwbHkgdHVwbGUuICovCi0JCQlpbnZlcnRfdHVwbGVwcihyZXN1bHQsCi0JCQkJICAgICAgICZjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0udHVwbGUpOwotCQkJcmVzdWx0LT5kc3QgPSB0dXBsZS0+ZHN0OwotCi0JCQlpZiAoaW5fcmFuZ2UocmVzdWx0LCByYW5nZSkpIHsKLQkJCQlyZWFkX3VubG9ja19iaCgmaXBfbmF0X2xvY2spOwotCQkJCXJldHVybiAxOwotCQkJfQotCQl9Ci0JfQotCXJlYWRfdW5sb2NrX2JoKCZpcF9uYXRfbG9jayk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIEZvciBbRlVUVVJFXSBmcmFnbWVudGF0aW9uIGhhbmRsaW5nLCB3ZSB3YW50IHRoZSBsZWFzdC11c2VkCi0gICBzcmMtaXAvZHN0LWlwL3Byb3RvIHRyaXBsZS4gIEZhaXJuZXNzIGRvZXNuJ3QgY29tZSBpbnRvIGl0LiAgVGh1cwotICAgaWYgdGhlIHJhbmdlIHNwZWNpZmllcyAxLjIuMy40IHBvcnRzIDEwMDAwLTEwMDA1IGFuZCAxLjIuMy41IHBvcnRzCi0gICAxLTY1NTM1LCB3ZSBkb24ndCBkbyBwcm8tcmF0YSBhbGxvY2F0aW9uIGJhc2VkIG9uIHBvcnRzOyB3ZSBjaG9vc2UKLSAgIHRoZSBpcCB3aXRoIHRoZSBsb3dlc3Qgc3JjLWlwL2RzdC1pcC9wcm90byB1c2FnZS4KLSovCi1zdGF0aWMgdm9pZAotZmluZF9iZXN0X2lwc19wcm90byhzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0dXBsZSwKLQkJICAgIGNvbnN0IHN0cnVjdCBpcF9uYXRfcmFuZ2UgKnJhbmdlLAotCQkgICAgY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFjayAqY29ubnRyYWNrLAotCQkgICAgZW51bSBpcF9uYXRfbWFuaXBfdHlwZSBtYW5pcHR5cGUpCi17Ci0JX19iZTMyICp2YXJfaXBwOwotCS8qIEhvc3Qgb3JkZXIgKi8KLQl1X2ludDMyX3QgbWluaXAsIG1heGlwLCBqOwotCi0JLyogTm8gSVAgbWFwcGluZz8gIERvIG5vdGhpbmcuICovCi0JaWYgKCEocmFuZ2UtPmZsYWdzICYgSVBfTkFUX1JBTkdFX01BUF9JUFMpKQotCQlyZXR1cm47Ci0KLQlpZiAobWFuaXB0eXBlID09IElQX05BVF9NQU5JUF9TUkMpCi0JCXZhcl9pcHAgPSAmdHVwbGUtPnNyYy5pcDsKLQllbHNlCi0JCXZhcl9pcHAgPSAmdHVwbGUtPmRzdC5pcDsKLQotCS8qIEZhc3QgcGF0aDogb25seSBvbmUgY2hvaWNlLiAqLwotCWlmIChyYW5nZS0+bWluX2lwID09IHJhbmdlLT5tYXhfaXApIHsKLQkJKnZhcl9pcHAgPSByYW5nZS0+bWluX2lwOwotCQlyZXR1cm47Ci0JfQotCi0JLyogSGFzaGluZyBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIElQcyBnaXZlcyBhIGZhaXJseSBldmVuCi0JICogc3ByZWFkIGluIHByYWN0aWNlIChpZiB0aGVyZSBhcmUgYSBzbWFsbCBudW1iZXIgb2YgSVBzCi0JICogaW52b2x2ZWQsIHRoZXJlIHVzdWFsbHkgYXJlbid0IHRoYXQgbWFueSBjb25uZWN0aW9ucwotCSAqIGFueXdheSkuICBUaGUgY29uc2lzdGVuY3kgbWVhbnMgdGhhdCBzZXJ2ZXJzIHNlZSB0aGUgc2FtZQotCSAqIGNsaWVudCBjb21pbmcgZnJvbSB0aGUgc2FtZSBJUCAoc29tZSBJbnRlcm5ldCBCYW5raW5nIHNpdGVzCi0JICogbGlrZSB0aGlzKSwgZXZlbiBhY3Jvc3MgcmVib290cy4gKi8KLQltaW5pcCA9IG50b2hsKHJhbmdlLT5taW5faXApOwotCW1heGlwID0gbnRvaGwocmFuZ2UtPm1heF9pcCk7Ci0JaiA9IGpoYXNoXzJ3b3JkcygoX19mb3JjZSB1MzIpdHVwbGUtPnNyYy5pcCwgKF9fZm9yY2UgdTMyKXR1cGxlLT5kc3QuaXAsIDApOwotCSp2YXJfaXBwID0gaHRvbmwobWluaXAgKyBqICUgKG1heGlwIC0gbWluaXAgKyAxKSk7Ci19Ci0KLS8qIE1hbmlwdWxhdGUgdGhlIHR1cGxlIGludG8gdGhlIHJhbmdlIGdpdmVuLiAgRm9yIE5GX0lQX1BPU1RfUk9VVElORywKLSAqIHdlIGNoYW5nZSB0aGUgc291cmNlIHRvIG1hcCBpbnRvIHRoZSByYW5nZS4gIEZvciBORl9JUF9QUkVfUk9VVElORwotICogYW5kIE5GX0lQX0xPQ0FMX09VVCwgd2UgY2hhbmdlIHRoZSBkZXN0aW5hdGlvbiB0byBtYXAgaW50byB0aGUKLSAqIHJhbmdlLiAgSXQgbWlnaHQgbm90IGJlIHBvc3NpYmxlIHRvIGdldCBhIHVuaXF1ZSB0dXBsZSwgYnV0IHdlIHRyeS4KLSAqIEF0IHdvcnN0IChvciBpZiB3ZSByYWNlKSwgd2Ugd2lsbCBlbmQgdXAgd2l0aCBhIGZpbmFsIGR1cGxpY2F0ZSBpbgotICogX19pcF9jb25udHJhY2tfY29uZmlybSBhbmQgZHJvcCB0aGUgcGFja2V0LiAqLwotc3RhdGljIHZvaWQKLWdldF91bmlxdWVfdHVwbGUoc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUsCi0JCSBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICpvcmlnX3R1cGxlLAotCQkgY29uc3Qgc3RydWN0IGlwX25hdF9yYW5nZSAqcmFuZ2UsCi0JCSBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjb25udHJhY2ssCi0JCSBlbnVtIGlwX25hdF9tYW5pcF90eXBlIG1hbmlwdHlwZSkKLXsKLQlzdHJ1Y3QgaXBfbmF0X3Byb3RvY29sICpwcm90bzsKLQotCS8qIDEpIElmIHRoaXMgc3JjaXAvcHJvdG8vc3JjLXByb3RvLXBhcnQgaXMgY3VycmVudGx5IG1hcHBlZCwKLQkgICBhbmQgdGhhdCBzYW1lIG1hcHBpbmcgZ2l2ZXMgYSB1bmlxdWUgdHVwbGUgd2l0aGluIHRoZSBnaXZlbgotCSAgIHJhbmdlLCB1c2UgdGhhdC4KLQotCSAgIFRoaXMgaXMgb25seSByZXF1aXJlZCBmb3Igc291cmNlIChpZS4gTkFUL21hc3EpIG1hcHBpbmdzLgotCSAgIFNvIGZhciwgd2UgZG9uJ3QgZG8gbG9jYWwgc291cmNlIG1hcHBpbmdzLCBzbyBtdWx0aXBsZQotCSAgIG1hbmlwcyBub3QgYW4gaXNzdWUuICAqLwotCWlmIChtYW5pcHR5cGUgPT0gSVBfTkFUX01BTklQX1NSQykgewotCQlpZiAoZmluZF9hcHByb3ByaWF0ZV9zcmMob3JpZ190dXBsZSwgdHVwbGUsIHJhbmdlKSkgewotCQkJREVCVUdQKCJnZXRfdW5pcXVlX3R1cGxlOiBGb3VuZCBjdXJyZW50IHNyYyBtYXBcbiIpOwotCQkJaWYgKCEocmFuZ2UtPmZsYWdzICYgSVBfTkFUX1JBTkdFX1BST1RPX1JBTkRPTSkpCi0JCQkJaWYgKCFpcF9uYXRfdXNlZF90dXBsZSh0dXBsZSwgY29ubnRyYWNrKSkKLQkJCQkJcmV0dXJuOwotCQl9Ci0JfQotCi0JLyogMikgU2VsZWN0IHRoZSBsZWFzdC11c2VkIElQL3Byb3RvIGNvbWJpbmF0aW9uIGluIHRoZSBnaXZlbgotCSAgIHJhbmdlLiAqLwotCSp0dXBsZSA9ICpvcmlnX3R1cGxlOwotCWZpbmRfYmVzdF9pcHNfcHJvdG8odHVwbGUsIHJhbmdlLCBjb25udHJhY2ssIG1hbmlwdHlwZSk7Ci0KLQkvKiAzKSBUaGUgcGVyLXByb3RvY29sIHBhcnQgb2YgdGhlIG1hbmlwIGlzIG1hZGUgdG8gbWFwIGludG8KLQkgICB0aGUgcmFuZ2UgdG8gbWFrZSBhIHVuaXF1ZSB0dXBsZS4gKi8KLQotCXJjdV9yZWFkX2xvY2soKTsKLQlwcm90byA9IF9faXBfbmF0X3Byb3RvX2ZpbmQob3JpZ190dXBsZS0+ZHN0LnByb3RvbnVtKTsKLQotCS8qIENoYW5nZSBwcm90b2NvbCBpbmZvIHRvIGhhdmUgc29tZSByYW5kb21pemF0aW9uICovCi0JaWYgKHJhbmdlLT5mbGFncyAmIElQX05BVF9SQU5HRV9QUk9UT19SQU5ET00pIHsKLQkJcHJvdG8tPnVuaXF1ZV90dXBsZSh0dXBsZSwgcmFuZ2UsIG1hbmlwdHlwZSwgY29ubnRyYWNrKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JLyogT25seSBib3RoZXIgbWFwcGluZyBpZiBpdCdzIG5vdCBhbHJlYWR5IGluIHJhbmdlIGFuZCB1bmlxdWUgKi8KLQlpZiAoKCEocmFuZ2UtPmZsYWdzICYgSVBfTkFUX1JBTkdFX1BST1RPX1NQRUNJRklFRCkKLQkgICAgIHx8IHByb3RvLT5pbl9yYW5nZSh0dXBsZSwgbWFuaXB0eXBlLCAmcmFuZ2UtPm1pbiwgJnJhbmdlLT5tYXgpKQotCSAgICAmJiAhaXBfbmF0X3VzZWRfdHVwbGUodHVwbGUsIGNvbm50cmFjaykpCi0JCWdvdG8gb3V0OwotCi0JLyogTGFzdCBjaGFuZ2U6IGdldCBwcm90b2NvbCB0byB0cnkgdG8gb2J0YWluIHVuaXF1ZSB0dXBsZS4gKi8KLQlwcm90by0+dW5pcXVlX3R1cGxlKHR1cGxlLCByYW5nZSwgbWFuaXB0eXBlLCBjb25udHJhY2spOwotb3V0OgotCXJjdV9yZWFkX3VubG9jaygpOwotfQotCi11bnNpZ25lZCBpbnQKLWlwX25hdF9zZXR1cF9pbmZvKHN0cnVjdCBpcF9jb25udHJhY2sgKmNvbm50cmFjaywKLQkJICBjb25zdCBzdHJ1Y3QgaXBfbmF0X3JhbmdlICpyYW5nZSwKLQkJICB1bnNpZ25lZCBpbnQgaG9va251bSkKLXsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlIGN1cnJfdHVwbGUsIG5ld190dXBsZTsKLQlzdHJ1Y3QgaXBfbmF0X2luZm8gKmluZm8gPSAmY29ubnRyYWNrLT5uYXQuaW5mbzsKLQlpbnQgaGF2ZV90b19oYXNoID0gIShjb25udHJhY2stPnN0YXR1cyAmIElQU19OQVRfRE9ORV9NQVNLKTsKLQllbnVtIGlwX25hdF9tYW5pcF90eXBlIG1hbmlwdHlwZSA9IEhPT0syTUFOSVAoaG9va251bSk7Ci0KLQlJUF9ORl9BU1NFUlQoaG9va251bSA9PSBORl9JUF9QUkVfUk9VVElORwotCQkgICAgIHx8IGhvb2tudW0gPT0gTkZfSVBfUE9TVF9ST1VUSU5HCi0JCSAgICAgfHwgaG9va251bSA9PSBORl9JUF9MT0NBTF9JTgotCQkgICAgIHx8IGhvb2tudW0gPT0gTkZfSVBfTE9DQUxfT1VUKTsKLQlCVUdfT04oaXBfbmF0X2luaXRpYWxpemVkKGNvbm50cmFjaywgbWFuaXB0eXBlKSk7Ci0KLQkvKiBXaGF0IHdlJ3ZlIGdvdCB3aWxsIGxvb2sgbGlrZSBpbnZlcnNlIG9mIHJlcGx5LiBOb3JtYWxseQotCSAgIHRoaXMgaXMgd2hhdCBpcyBpbiB0aGUgY29ubnRyYWNrLCBleGNlcHQgZm9yIHByaW9yCi0JICAgbWFuaXB1bGF0aW9ucyAoZnV0dXJlIG9wdGltaXphdGlvbjogaWYgbnVtX21hbmlwcyA9PSAwLAotCSAgIG9yaWdfdHAgPQotCSAgIGNvbm50cmFjay0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUpICovCi0JaW52ZXJ0X3R1cGxlcHIoJmN1cnJfdHVwbGUsCi0JCSAgICAgICAmY29ubnRyYWNrLT50dXBsZWhhc2hbSVBfQ1RfRElSX1JFUExZXS50dXBsZSk7Ci0KLQlnZXRfdW5pcXVlX3R1cGxlKCZuZXdfdHVwbGUsICZjdXJyX3R1cGxlLCByYW5nZSwgY29ubnRyYWNrLCBtYW5pcHR5cGUpOwotCi0JaWYgKCFpcF9jdF90dXBsZV9lcXVhbCgmbmV3X3R1cGxlLCAmY3Vycl90dXBsZSkpIHsKLQkJc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSByZXBseTsKLQotCQkvKiBBbHRlciBjb25udHJhY2sgdGFibGUgc28gd2lsbCByZWNvZ25pemUgcmVwbGllcy4gKi8KLQkJaW52ZXJ0X3R1cGxlcHIoJnJlcGx5LCAmbmV3X3R1cGxlKTsKLQkJaXBfY29ubnRyYWNrX2FsdGVyX3JlcGx5KGNvbm50cmFjaywgJnJlcGx5KTsKLQotCQkvKiBOb24tYXRvbWljOiB3ZSBvd24gdGhpcyBhdCB0aGUgbW9tZW50LiAqLwotCQlpZiAobWFuaXB0eXBlID09IElQX05BVF9NQU5JUF9TUkMpCi0JCQljb25udHJhY2stPnN0YXR1cyB8PSBJUFNfU1JDX05BVDsKLQkJZWxzZQotCQkJY29ubnRyYWNrLT5zdGF0dXMgfD0gSVBTX0RTVF9OQVQ7Ci0JfQotCi0JLyogUGxhY2UgaW4gc291cmNlIGhhc2ggaWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZS4gKi8KLQlpZiAoaGF2ZV90b19oYXNoKSB7Ci0JCXVuc2lnbmVkIGludCBzcmNoYXNoCi0JCQk9IGhhc2hfYnlfc3JjKCZjb25udHJhY2stPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdCi0JCQkJICAgICAgLnR1cGxlKTsKLQkJd3JpdGVfbG9ja19iaCgmaXBfbmF0X2xvY2spOwotCQlsaXN0X2FkZCgmaW5mby0+Ynlzb3VyY2UsICZieXNvdXJjZVtzcmNoYXNoXSk7Ci0JCXdyaXRlX3VubG9ja19iaCgmaXBfbmF0X2xvY2spOwotCX0KLQotCS8qIEl0J3MgZG9uZS4gKi8KLQlpZiAobWFuaXB0eXBlID09IElQX05BVF9NQU5JUF9EU1QpCi0JCXNldF9iaXQoSVBTX0RTVF9OQVRfRE9ORV9CSVQsICZjb25udHJhY2stPnN0YXR1cyk7Ci0JZWxzZQotCQlzZXRfYml0KElQU19TUkNfTkFUX0RPTkVfQklULCAmY29ubnRyYWNrLT5zdGF0dXMpOwotCi0JcmV0dXJuIE5GX0FDQ0VQVDsKLX0KLUVYUE9SVF9TWU1CT0woaXBfbmF0X3NldHVwX2luZm8pOwotCi0vKiBSZXR1cm5zIHRydWUgaWYgc3VjY2VlZGVkLiAqLwotc3RhdGljIGludAotbWFuaXBfcGt0KHVfaW50MTZfdCBwcm90bywKLQkgIHN0cnVjdCBza19idWZmICoqcHNrYiwKLQkgIHVuc2lnbmVkIGludCBpcGhkcm9mZiwKLQkgIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnRhcmdldCwKLQkgIGVudW0gaXBfbmF0X21hbmlwX3R5cGUgbWFuaXB0eXBlKQotewotCXN0cnVjdCBpcGhkciAqaXBoOwotCXN0cnVjdCBpcF9uYXRfcHJvdG9jb2wgKnA7Ci0KLQlpZiAoIXNrYl9tYWtlX3dyaXRhYmxlKHBza2IsIGlwaGRyb2ZmICsgc2l6ZW9mKCppcGgpKSkKLQkJcmV0dXJuIDA7Ci0KLQlpcGggPSAodm9pZCAqKSgqcHNrYiktPmRhdGEgKyBpcGhkcm9mZjsKLQotCS8qIE1hbmlwdWxhdGUgcHJvdGNvbCBwYXJ0LiAqLwotCi0JLyogcmN1X3JlYWRfbG9jaygpZWQgYnkgbmZfaG9va19zbG93ICovCi0JcCA9IF9faXBfbmF0X3Byb3RvX2ZpbmQocHJvdG8pOwotCWlmICghcC0+bWFuaXBfcGt0KHBza2IsIGlwaGRyb2ZmLCB0YXJnZXQsIG1hbmlwdHlwZSkpCi0JCXJldHVybiAwOwotCi0JaXBoID0gKHZvaWQgKikoKnBza2IpLT5kYXRhICsgaXBoZHJvZmY7Ci0KLQlpZiAobWFuaXB0eXBlID09IElQX05BVF9NQU5JUF9TUkMpIHsKLQkJbmZfY3N1bV9yZXBsYWNlNCgmaXBoLT5jaGVjaywgaXBoLT5zYWRkciwgdGFyZ2V0LT5zcmMuaXApOwotCQlpcGgtPnNhZGRyID0gdGFyZ2V0LT5zcmMuaXA7Ci0JfSBlbHNlIHsKLQkJbmZfY3N1bV9yZXBsYWNlNCgmaXBoLT5jaGVjaywgaXBoLT5kYWRkciwgdGFyZ2V0LT5kc3QuaXApOwotCQlpcGgtPmRhZGRyID0gdGFyZ2V0LT5kc3QuaXA7Ci0JfQotCXJldHVybiAxOwotfQotCi0vKiBEbyBwYWNrZXQgbWFuaXB1bGF0aW9ucyBhY2NvcmRpbmcgdG8gaXBfbmF0X3NldHVwX2luZm8uICovCi11bnNpZ25lZCBpbnQgaXBfbmF0X3BhY2tldChzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKLQkJCSAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAotCQkJICAgdW5zaWduZWQgaW50IGhvb2tudW0sCi0JCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IpCi17Ci0JZW51bSBpcF9jb25udHJhY2tfZGlyIGRpciA9IENUSU5GTzJESVIoY3RpbmZvKTsKLQl1bnNpZ25lZCBsb25nIHN0YXR1c2JpdDsKLQllbnVtIGlwX25hdF9tYW5pcF90eXBlIG10eXBlID0gSE9PSzJNQU5JUChob29rbnVtKTsKLQotCWlmIChtdHlwZSA9PSBJUF9OQVRfTUFOSVBfU1JDKQotCQlzdGF0dXNiaXQgPSBJUFNfU1JDX05BVDsKLQllbHNlCi0JCXN0YXR1c2JpdCA9IElQU19EU1RfTkFUOwotCi0JLyogSW52ZXJ0IGlmIHRoaXMgaXMgcmVwbHkgZGlyLiAqLwotCWlmIChkaXIgPT0gSVBfQ1RfRElSX1JFUExZKQotCQlzdGF0dXNiaXQgXj0gSVBTX05BVF9NQVNLOwotCi0JLyogTm9uLWF0b21pYzogdGhlc2UgYml0cyBkb24ndCBjaGFuZ2UuICovCi0JaWYgKGN0LT5zdGF0dXMgJiBzdGF0dXNiaXQpIHsKLQkJc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSB0YXJnZXQ7Ci0KLQkJLyogV2UgYXJlIGFpbWluZyB0byBsb29rIGxpa2UgaW52ZXJzZSBvZiBvdGhlciBkaXJlY3Rpb24uICovCi0JCWludmVydF90dXBsZXByKCZ0YXJnZXQsICZjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlKTsKLQotCQlpZiAoIW1hbmlwX3BrdCh0YXJnZXQuZHN0LnByb3RvbnVtLCBwc2tiLCAwLCAmdGFyZ2V0LCBtdHlwZSkpCi0JCQlyZXR1cm4gTkZfRFJPUDsKLQl9Ci0JcmV0dXJuIE5GX0FDQ0VQVDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGlwX25hdF9wYWNrZXQpOwotCi0vKiBEaXIgaXMgZGlyZWN0aW9uIElDTVAgaXMgY29taW5nIGZyb20gKG9wcG9zaXRlIHRvIHBhY2tldCBpdCBjb250YWlucykgKi8KLWludCBpcF9uYXRfaWNtcF9yZXBseV90cmFuc2xhdGlvbihzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKLQkJCQkgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAotCQkJCSAgdW5zaWduZWQgaW50IGhvb2tudW0sCi0JCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IpCi17Ci0Jc3RydWN0IHsKLQkJc3RydWN0IGljbXBoZHIgaWNtcDsKLQkJc3RydWN0IGlwaGRyIGlwOwotCX0gKmluc2lkZTsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrX3Byb3RvY29sICpwcm90bzsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlIGlubmVyLCB0YXJnZXQ7Ci0JaW50IGhkcmxlbiA9ICgqcHNrYiktPm5oLmlwaC0+aWhsICogNDsKLQllbnVtIGlwX2Nvbm50cmFja19kaXIgZGlyID0gQ1RJTkZPMkRJUihjdGluZm8pOwotCXVuc2lnbmVkIGxvbmcgc3RhdHVzYml0OwotCWVudW0gaXBfbmF0X21hbmlwX3R5cGUgbWFuaXAgPSBIT09LMk1BTklQKGhvb2tudW0pOwotCi0JaWYgKCFza2JfbWFrZV93cml0YWJsZShwc2tiLCBoZHJsZW4gKyBzaXplb2YoKmluc2lkZSkpKQotCQlyZXR1cm4gMDsKLQotCWluc2lkZSA9ICh2b2lkICopKCpwc2tiKS0+ZGF0YSArICgqcHNrYiktPm5oLmlwaC0+aWhsKjQ7Ci0KLQkvKiBXZSdyZSBhY3R1YWxseSBnb2luZyB0byBtYW5nbGUgaXQgYmV5b25kIHRyaXZpYWwgY2hlY2tzdW0KLQkgICBhZGp1c3RtZW50LCBzbyBtYWtlIHN1cmUgdGhlIGN1cnJlbnQgY2hlY2tzdW0gaXMgY29ycmVjdC4gKi8KLQlpZiAobmZfaXBfY2hlY2tzdW0oKnBza2IsIGhvb2tudW0sIGhkcmxlbiwgMCkpCi0JCXJldHVybiAwOwotCi0JLyogTXVzdCBiZSBSRUxBVEVEICovCi0JSVBfTkZfQVNTRVJUKCgqcHNrYiktPm5mY3RpbmZvID09IElQX0NUX1JFTEFURUQgfHwKLQkJICAgICAoKnBza2IpLT5uZmN0aW5mbyA9PSBJUF9DVF9SRUxBVEVEK0lQX0NUX0lTX1JFUExZKTsKLQotCS8qIFJlZGlyZWN0cyBvbiBub24tbnVsbCBuYXRzIG11c3QgYmUgZHJvcHBlZCwgZWxzZSB0aGV5J2xsCi0JICAgc3RhcnQgdGFsa2luZyB0byBlYWNoIG90aGVyIHdpdGhvdXQgb3VyIHRyYW5zbGF0aW9uLCBhbmQgYmUKLQkgICBjb25mdXNlZC4uLiAtLVJSICovCi0JaWYgKGluc2lkZS0+aWNtcC50eXBlID09IElDTVBfUkVESVJFQ1QpIHsKLQkJLyogSWYgTkFUIGlzbid0IGZpbmlzaGVkLCBhc3N1bWUgaXQgYW5kIGRyb3AuICovCi0JCWlmICgoY3QtPnN0YXR1cyAmIElQU19OQVRfRE9ORV9NQVNLKSAhPSBJUFNfTkFUX0RPTkVfTUFTSykKLQkJCXJldHVybiAwOwotCi0JCWlmIChjdC0+c3RhdHVzICYgSVBTX05BVF9NQVNLKQotCQkJcmV0dXJuIDA7Ci0JfQotCi0JREVCVUdQKCJpY21wX3JlcGx5X3RyYW5zbGF0aW9uOiB0cmFuc2xhdGluZyBlcnJvciAlcCBtYW5wICV1IGRpciAlc1xuIiwKLQkgICAgICAgKnBza2IsIG1hbmlwLCBkaXIgPT0gSVBfQ1RfRElSX09SSUdJTkFMID8gIk9SSUciIDogIlJFUExZIik7Ci0KLQkvKiByY3VfcmVhZF9sb2NrKCllZCBieSBuZl9ob29rX3Nsb3cgKi8KLQlwcm90byA9IF9faXBfY29ubnRyYWNrX3Byb3RvX2ZpbmQoaW5zaWRlLT5pcC5wcm90b2NvbCk7Ci0JaWYgKCFpcF9jdF9nZXRfdHVwbGUoJmluc2lkZS0+aXAsICpwc2tiLCAoKnBza2IpLT5uaC5pcGgtPmlobCo0ICsKLQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBpY21waGRyKSArIGluc2lkZS0+aXAuaWhsKjQsCi0JCQkgICAgICZpbm5lciwgcHJvdG8pKQotCQlyZXR1cm4gMDsKLQotCS8qIENoYW5nZSBpbm5lciBiYWNrIHRvIGxvb2sgbGlrZSBpbmNvbWluZyBwYWNrZXQuICBXZSBkbyB0aGUKLQkgICBvcHBvc2l0ZSBtYW5pcCBvbiB0aGlzIGhvb2sgdG8gbm9ybWFsLCBiZWNhdXNlIGl0IG1pZ2h0IG5vdAotCSAgIHBhc3MgYWxsIGhvb2tzIChsb2NhbGx5LWdlbmVyYXRlZCBJQ01QKS4gIENvbnNpZGVyIGluY29taW5nCi0JICAgcGFja2V0OiBQUkVST1VUSU5HIChEU1QgbWFuaXApLCByb3V0aW5nIHByb2R1Y2VzIElDTVAsIGdvZXMKLQkgICB0aHJvdWdoIFBPU1RST1VUSU5HICh3aGljaCBtdXN0IGNvcnJlY3QgdGhlIERTVCBtYW5pcCkuICovCi0JaWYgKCFtYW5pcF9wa3QoaW5zaWRlLT5pcC5wcm90b2NvbCwgcHNrYiwKLQkJICAgICAgICgqcHNrYiktPm5oLmlwaC0+aWhsKjQKLQkJICAgICAgICsgc2l6ZW9mKGluc2lkZS0+aWNtcCksCi0JCSAgICAgICAmY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZSwKLQkJICAgICAgICFtYW5pcCkpCi0JCXJldHVybiAwOwotCi0JaWYgKCgqcHNrYiktPmlwX3N1bW1lZCAhPSBDSEVDS1NVTV9QQVJUSUFMKSB7Ci0JCS8qIFJlbG9hZGluZyAiaW5zaWRlIiBoZXJlIHNpbmNlIG1hbmlwX3BrdCBpbm5lci4gKi8KLQkJaW5zaWRlID0gKHZvaWQgKikoKnBza2IpLT5kYXRhICsgKCpwc2tiKS0+bmguaXBoLT5paGwqNDsKLQkJaW5zaWRlLT5pY21wLmNoZWNrc3VtID0gMDsKLQkJaW5zaWRlLT5pY21wLmNoZWNrc3VtID0gY3N1bV9mb2xkKHNrYl9jaGVja3N1bSgqcHNrYiwgaGRybGVuLAotCQkJCQkJCSAgICAgICAoKnBza2IpLT5sZW4gLSBoZHJsZW4sCi0JCQkJCQkJICAgICAgIDApKTsKLQl9Ci0KLQkvKiBDaGFuZ2Ugb3V0ZXIgdG8gbG9vayB0aGUgcmVwbHkgdG8gYW4gaW5jb21pbmcgcGFja2V0Ci0JICogKHByb3RvIDAgbWVhbnMgZG9uJ3QgaW52ZXJ0IHBlci1wcm90byBwYXJ0KS4gKi8KLQlpZiAobWFuaXAgPT0gSVBfTkFUX01BTklQX1NSQykKLQkJc3RhdHVzYml0ID0gSVBTX1NSQ19OQVQ7Ci0JZWxzZQotCQlzdGF0dXNiaXQgPSBJUFNfRFNUX05BVDsKLQotCS8qIEludmVydCBpZiB0aGlzIGlzIHJlcGx5IGRpci4gKi8KLQlpZiAoZGlyID09IElQX0NUX0RJUl9SRVBMWSkKLQkJc3RhdHVzYml0IF49IElQU19OQVRfTUFTSzsKLQotCWlmIChjdC0+c3RhdHVzICYgc3RhdHVzYml0KSB7Ci0JCWludmVydF90dXBsZXByKCZ0YXJnZXQsICZjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlKTsKLQkJaWYgKCFtYW5pcF9wa3QoMCwgcHNrYiwgMCwgJnRhcmdldCwgbWFuaXApKQotCQkJcmV0dXJuIDA7Ci0JfQotCi0JcmV0dXJuIDE7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChpcF9uYXRfaWNtcF9yZXBseV90cmFuc2xhdGlvbik7Ci0KLS8qIFByb3RvY29sIHJlZ2lzdHJhdGlvbi4gKi8KLWludCBpcF9uYXRfcHJvdG9jb2xfcmVnaXN0ZXIoc3RydWN0IGlwX25hdF9wcm90b2NvbCAqcHJvdG8pCi17Ci0JaW50IHJldCA9IDA7Ci0KLQl3cml0ZV9sb2NrX2JoKCZpcF9uYXRfbG9jayk7Ci0JaWYgKGlwX25hdF9wcm90b3NbcHJvdG8tPnByb3RvbnVtXSAhPSAmaXBfbmF0X3Vua25vd25fcHJvdG9jb2wpIHsKLQkJcmV0ID0gLUVCVVNZOwotCQlnb3RvIG91dDsKLQl9Ci0JcmN1X2Fzc2lnbl9wb2ludGVyKGlwX25hdF9wcm90b3NbcHJvdG8tPnByb3RvbnVtXSwgcHJvdG8pOwotIG91dDoKLQl3cml0ZV91bmxvY2tfYmgoJmlwX25hdF9sb2NrKTsKLQlyZXR1cm4gcmV0OwotfQotRVhQT1JUX1NZTUJPTChpcF9uYXRfcHJvdG9jb2xfcmVnaXN0ZXIpOwotCi0vKiBOb29uZSBzdG9yZXMgdGhlIHByb3RvY29sIGFueXdoZXJlOyBzaW1wbHkgZGVsZXRlIGl0LiAqLwotdm9pZCBpcF9uYXRfcHJvdG9jb2xfdW5yZWdpc3RlcihzdHJ1Y3QgaXBfbmF0X3Byb3RvY29sICpwcm90bykKLXsKLQl3cml0ZV9sb2NrX2JoKCZpcF9uYXRfbG9jayk7Ci0JcmN1X2Fzc2lnbl9wb2ludGVyKGlwX25hdF9wcm90b3NbcHJvdG8tPnByb3RvbnVtXSwKLQkJCSAgICZpcF9uYXRfdW5rbm93bl9wcm90b2NvbCk7Ci0Jd3JpdGVfdW5sb2NrX2JoKCZpcF9uYXRfbG9jayk7Ci0Jc3luY2hyb25pemVfcmN1KCk7Ci19Ci1FWFBPUlRfU1lNQk9MKGlwX25hdF9wcm90b2NvbF91bnJlZ2lzdGVyKTsKLQotI2lmIGRlZmluZWQoQ09ORklHX0lQX05GX0NPTk5UUkFDS19ORVRMSU5LKSB8fCBcCi0gICAgZGVmaW5lZChDT05GSUdfSVBfTkZfQ09OTlRSQUNLX05FVExJTktfTU9EVUxFKQotaW50Ci1pcF9uYXRfcG9ydF9yYW5nZV90b19uZmF0dHIoc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCSAgICBjb25zdCBzdHJ1Y3QgaXBfbmF0X3JhbmdlICpyYW5nZSkKLXsKLQlORkFfUFVUKHNrYiwgQ1RBX1BST1RPTkFUX1BPUlRfTUlOLCBzaXplb2YoX19iZTE2KSwKLQkJJnJhbmdlLT5taW4udGNwLnBvcnQpOwotCU5GQV9QVVQoc2tiLCBDVEFfUFJPVE9OQVRfUE9SVF9NQVgsIHNpemVvZihfX2JlMTYpLAotCQkmcmFuZ2UtPm1heC50Y3AucG9ydCk7Ci0KLQlyZXR1cm4gMDsKLQotbmZhdHRyX2ZhaWx1cmU6Ci0JcmV0dXJuIC0xOwotfQotCi1pbnQKLWlwX25hdF9wb3J0X25mYXR0cl90b19yYW5nZShzdHJ1Y3QgbmZhdHRyICp0YltdLCBzdHJ1Y3QgaXBfbmF0X3JhbmdlICpyYW5nZSkKLXsKLQlpbnQgcmV0ID0gMDsKLQotCS8qIHdlIGhhdmUgdG8gcmV0dXJuIHdoZXRoZXIgd2UgYWN0dWFsbHkgcGFyc2VkIHNvbWV0aGluZyBvciBub3QgKi8KLQotCWlmICh0YltDVEFfUFJPVE9OQVRfUE9SVF9NSU4tMV0pIHsKLQkJcmV0ID0gMTsKLQkJcmFuZ2UtPm1pbi50Y3AucG9ydCA9Ci0JCQkqKF9fYmUxNiAqKU5GQV9EQVRBKHRiW0NUQV9QUk9UT05BVF9QT1JUX01JTi0xXSk7Ci0JfQotCi0JaWYgKCF0YltDVEFfUFJPVE9OQVRfUE9SVF9NQVgtMV0pIHsKLQkJaWYgKHJldCkKLQkJCXJhbmdlLT5tYXgudGNwLnBvcnQgPSByYW5nZS0+bWluLnRjcC5wb3J0OwotCX0gZWxzZSB7Ci0JCXJldCA9IDE7Ci0JCXJhbmdlLT5tYXgudGNwLnBvcnQgPQotCQkJKihfX2JlMTYgKilORkFfREFUQSh0YltDVEFfUFJPVE9OQVRfUE9SVF9NQVgtMV0pOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChpcF9uYXRfcG9ydF9uZmF0dHJfdG9fcmFuZ2UpOwotRVhQT1JUX1NZTUJPTF9HUEwoaXBfbmF0X3BvcnRfcmFuZ2VfdG9fbmZhdHRyKTsKLSNlbmRpZgotCi1zdGF0aWMgaW50IF9faW5pdCBpcF9uYXRfaW5pdCh2b2lkKQotewotCXNpemVfdCBpOwotCi0JLyogTGVhdmUgdGhlbSB0aGUgc2FtZSBmb3IgdGhlIG1vbWVudC4gKi8KLQlpcF9uYXRfaHRhYmxlX3NpemUgPSBpcF9jb25udHJhY2tfaHRhYmxlX3NpemU7Ci0KLQkvKiBPbmUgdm1hbGxvYyBmb3IgYm90aCBoYXNoIHRhYmxlcyAqLwotCWJ5c291cmNlID0gdm1hbGxvYyhzaXplb2Yoc3RydWN0IGxpc3RfaGVhZCkgKiBpcF9uYXRfaHRhYmxlX3NpemUpOwotCWlmICghYnlzb3VyY2UpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JLyogU2V3IGluIGJ1aWx0aW4gcHJvdG9jb2xzLiAqLwotCXdyaXRlX2xvY2tfYmgoJmlwX25hdF9sb2NrKTsKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0lQX05BVF9QUk9UTzsgaSsrKQotCQlyY3VfYXNzaWduX3BvaW50ZXIoaXBfbmF0X3Byb3Rvc1tpXSwgJmlwX25hdF91bmtub3duX3Byb3RvY29sKTsKLQlyY3VfYXNzaWduX3BvaW50ZXIoaXBfbmF0X3Byb3Rvc1tJUFBST1RPX1RDUF0sICZpcF9uYXRfcHJvdG9jb2xfdGNwKTsKLQlyY3VfYXNzaWduX3BvaW50ZXIoaXBfbmF0X3Byb3Rvc1tJUFBST1RPX1VEUF0sICZpcF9uYXRfcHJvdG9jb2xfdWRwKTsKLQlyY3VfYXNzaWduX3BvaW50ZXIoaXBfbmF0X3Byb3Rvc1tJUFBST1RPX0lDTVBdLCAmaXBfbmF0X3Byb3RvY29sX2ljbXApOwotCXdyaXRlX3VubG9ja19iaCgmaXBfbmF0X2xvY2spOwotCi0JZm9yIChpID0gMDsgaSA8IGlwX25hdF9odGFibGVfc2l6ZTsgaSsrKSB7Ci0JCUlOSVRfTElTVF9IRUFEKCZieXNvdXJjZVtpXSk7Ci0JfQotCi0JLyogRklYTUU6IE1hbiwgdGhpcyBpcyBhIGhhY2suICA8U0lHSD4gKi8KLQlJUF9ORl9BU1NFUlQocmN1X2RlcmVmZXJlbmNlKGlwX2Nvbm50cmFja19kZXN0cm95ZWQpID09IE5VTEwpOwotCXJjdV9hc3NpZ25fcG9pbnRlcihpcF9jb25udHJhY2tfZGVzdHJveWVkLCBpcF9uYXRfY2xlYW51cF9jb25udHJhY2spOwotCi0JLyogSW5pdGlhbGl6ZSBmYWtlIGNvbm50cmFjayBzbyB0aGF0IE5BVCB3aWxsIHNraXAgaXQgKi8KLQlpcF9jb25udHJhY2tfdW50cmFja2VkLnN0YXR1cyB8PSBJUFNfTkFUX0RPTkVfTUFTSzsKLQlyZXR1cm4gMDsKLX0KLQotLyogQ2xlYXIgTkFUIHNlY3Rpb24gb2YgYWxsIGNvbm50cmFja3MsIGluIGNhc2Ugd2UncmUgbG9hZGVkIGFnYWluLiAqLwotc3RhdGljIGludCBjbGVhbl9uYXQoc3RydWN0IGlwX2Nvbm50cmFjayAqaSwgdm9pZCAqZGF0YSkKLXsKLQltZW1zZXQoJmktPm5hdCwgMCwgc2l6ZW9mKGktPm5hdCkpOwotCWktPnN0YXR1cyAmPSB+KElQU19OQVRfTUFTSyB8IElQU19OQVRfRE9ORV9NQVNLIHwgSVBTX1NFUV9BREpVU1QpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgaXBfbmF0X2NsZWFudXAodm9pZCkKLXsKLQlpcF9jdF9pdGVyYXRlX2NsZWFudXAoJmNsZWFuX25hdCwgTlVMTCk7Ci0JcmN1X2Fzc2lnbl9wb2ludGVyKGlwX2Nvbm50cmFja19kZXN0cm95ZWQsIE5VTEwpOwotCXN5bmNocm9uaXplX3JjdSgpOwotCXZmcmVlKGJ5c291cmNlKTsKLX0KLQotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi1tb2R1bGVfaW5pdChpcF9uYXRfaW5pdCk7Ci1tb2R1bGVfZXhpdChpcF9uYXRfY2xlYW51cCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X2Z0cC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9mdHAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJlMDFkOC4uMDAwMDAwMAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X2Z0cC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLS8qIEZUUCBleHRlbnNpb24gZm9yIFRDUCBOQVQgYWx0ZXJhdGlvbi4gKi8KLQotLyogKEMpIDE5OTktMjAwMSBQYXVsIGBSdXN0eScgUnVzc2VsbAotICogKEMpIDIwMDItMjAwNCBOZXRmaWx0ZXIgQ29yZSBUZWFtIDxjb3JldGVhbUBuZXRmaWx0ZXIub3JnPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaXAuaD4KLSNpbmNsdWRlIDxsaW51eC90Y3AuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgotI2luY2x1ZGUgPG5ldC90Y3AuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9uYXQuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9uYXRfaGVscGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0X3J1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfZnRwLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2hlbHBlci5oPgotCi1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfQVVUSE9SKCJSdXN0eSBSdXNzZWxsIDxydXN0eUBydXN0Y29ycC5jb20uYXU+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oImZ0cCBOQVQgaGVscGVyIik7Ci0KLSNpZiAwCi0jZGVmaW5lIERFQlVHUCBwcmludGsKLSNlbHNlCi0jZGVmaW5lIERFQlVHUChmb3JtYXQsIGFyZ3MuLi4pCi0jZW5kaWYKLQotLyogRklYTUU6IFRpbWUgb3V0PyAtLVJSICovCi0KLXN0YXRpYyBpbnQKLW1hbmdsZV9yZmM5NTlfcGFja2V0KHN0cnVjdCBza19idWZmICoqcHNrYiwKLQkJICAgICBfX2JlMzIgbmV3aXAsCi0JCSAgICAgdV9pbnQxNl90IHBvcnQsCi0JCSAgICAgdW5zaWduZWQgaW50IG1hdGNob2ZmLAotCQkgICAgIHVuc2lnbmVkIGludCBtYXRjaGxlbiwKLQkJICAgICBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKLQkJICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKLQkJICAgICB1MzIgKnNlcSkKLXsKLQljaGFyIGJ1ZmZlcltzaXplb2YoIm5ubixubm4sbm5uLG5ubixubm4sbm5uIildOwotCi0Jc3ByaW50ZihidWZmZXIsICIldSwldSwldSwldSwldSwldSIsCi0JCU5JUFFVQUQobmV3aXApLCBwb3J0Pj44LCBwb3J0JjB4RkYpOwotCi0JREVCVUdQKCJjYWxsaW5nIGlwX25hdF9tYW5nbGVfdGNwX3BhY2tldFxuIik7Ci0KLQkqc2VxICs9IHN0cmxlbihidWZmZXIpIC0gbWF0Y2hsZW47Ci0JcmV0dXJuIGlwX25hdF9tYW5nbGVfdGNwX3BhY2tldChwc2tiLCBjdCwgY3RpbmZvLCBtYXRjaG9mZiwKLQkJCQkJbWF0Y2hsZW4sIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotfQotCi0vKiB8MXwxMzIuMjM1LjEuMnw2Mjc1fCAqLwotc3RhdGljIGludAotbWFuZ2xlX2VwcnRfcGFja2V0KHN0cnVjdCBza19idWZmICoqcHNrYiwKLQkJICAgX19iZTMyIG5ld2lwLAotCQkgICB1X2ludDE2X3QgcG9ydCwKLQkJICAgdW5zaWduZWQgaW50IG1hdGNob2ZmLAotCQkgICB1bnNpZ25lZCBpbnQgbWF0Y2hsZW4sCi0JCSAgIHN0cnVjdCBpcF9jb25udHJhY2sgKmN0LAotCQkgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKLQkJICAgdTMyICpzZXEpCi17Ci0JY2hhciBidWZmZXJbc2l6ZW9mKCJ8MXwyNTUuMjU1LjI1NS4yNTV8NjU1MzV8IildOwotCi0Jc3ByaW50ZihidWZmZXIsICJ8MXwldS4ldS4ldS4ldXwldXwiLCBOSVBRVUFEKG5ld2lwKSwgcG9ydCk7Ci0KLQlERUJVR1AoImNhbGxpbmcgaXBfbmF0X21hbmdsZV90Y3BfcGFja2V0XG4iKTsKLQotCSpzZXEgKz0gc3RybGVuKGJ1ZmZlcikgLSBtYXRjaGxlbjsKLQlyZXR1cm4gaXBfbmF0X21hbmdsZV90Y3BfcGFja2V0KHBza2IsIGN0LCBjdGluZm8sIG1hdGNob2ZmLAotCQkJCQltYXRjaGxlbiwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci19Ci0KLS8qIHwxfDEzMi4yMzUuMS4yfDYyNzV8ICovCi1zdGF0aWMgaW50Ci1tYW5nbGVfZXBzdl9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAotCQkgICBfX2JlMzIgbmV3aXAsCi0JCSAgIHVfaW50MTZfdCBwb3J0LAotCQkgICB1bnNpZ25lZCBpbnQgbWF0Y2hvZmYsCi0JCSAgIHVuc2lnbmVkIGludCBtYXRjaGxlbiwKLQkJICAgc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsCi0JCSAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAotCQkgICB1MzIgKnNlcSkKLXsKLQljaGFyIGJ1ZmZlcltzaXplb2YoInx8fDY1NTM1fCIpXTsKLQotCXNwcmludGYoYnVmZmVyLCAifHx8JXV8IiwgcG9ydCk7Ci0KLQlERUJVR1AoImNhbGxpbmcgaXBfbmF0X21hbmdsZV90Y3BfcGFja2V0XG4iKTsKLQotCSpzZXEgKz0gc3RybGVuKGJ1ZmZlcikgLSBtYXRjaGxlbjsKLQlyZXR1cm4gaXBfbmF0X21hbmdsZV90Y3BfcGFja2V0KHBza2IsIGN0LCBjdGluZm8sIG1hdGNob2ZmLAotCQkJCQltYXRjaGxlbiwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci19Ci0KLXN0YXRpYyBpbnQgKCptYW5nbGVbXSkoc3RydWN0IHNrX2J1ZmYgKiosIF9fYmUzMiwgdV9pbnQxNl90LAotCQkgICAgIHVuc2lnbmVkIGludCwKLQkJICAgICB1bnNpZ25lZCBpbnQsCi0JCSAgICAgc3RydWN0IGlwX2Nvbm50cmFjayAqLAotCQkgICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8sCi0JCSAgICAgdTMyICpzZXEpCi09IHsgW0lQX0NUX0ZUUF9QT1JUXSA9IG1hbmdsZV9yZmM5NTlfcGFja2V0LAotICAgIFtJUF9DVF9GVFBfUEFTVl0gPSBtYW5nbGVfcmZjOTU5X3BhY2tldCwKLSAgICBbSVBfQ1RfRlRQX0VQUlRdID0gbWFuZ2xlX2VwcnRfcGFja2V0LAotICAgIFtJUF9DVF9GVFBfRVBTVl0gPSBtYW5nbGVfZXBzdl9wYWNrZXQKLX07Ci0KLS8qIFNvLCB0aGlzIHBhY2tldCBoYXMgaGl0IHRoZSBjb25uZWN0aW9uIHRyYWNraW5nIG1hdGNoaW5nIGNvZGUuCi0gICBNYW5nbGUgaXQsIGFuZCBjaGFuZ2UgdGhlIGV4cGVjdGF0aW9uIHRvIG1hdGNoIHRoZSBuZXcgdmVyc2lvbi4gKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgaXBfbmF0X2Z0cChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCi0JCQkgICAgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCi0JCQkgICAgICAgZW51bSBpcF9jdF9mdHBfdHlwZSB0eXBlLAotCQkJICAgICAgIHVuc2lnbmVkIGludCBtYXRjaG9mZiwKLQkJCSAgICAgICB1bnNpZ25lZCBpbnQgbWF0Y2hsZW4sCi0JCQkgICAgICAgc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmV4cCwKLQkJCSAgICAgICB1MzIgKnNlcSkKLXsKLQlfX2JlMzIgbmV3aXA7Ci0JdV9pbnQxNl90IHBvcnQ7Ci0JaW50IGRpciA9IENUSU5GTzJESVIoY3RpbmZvKTsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCA9IGV4cC0+bWFzdGVyOwotCi0JREVCVUdQKCJGVFBfTkFUOiB0eXBlICVpLCBvZmYgJXUgbGVuICV1XG4iLCB0eXBlLCBtYXRjaG9mZiwgbWF0Y2hsZW4pOwotCi0JLyogQ29ubmVjdGlvbiB3aWxsIGNvbWUgZnJvbSB3aGVyZXZlciB0aGlzIHBhY2tldCBnb2VzLCBoZW5jZSAhZGlyICovCi0JbmV3aXAgPSBjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLmRzdC5pcDsKLQlleHAtPnNhdmVkX3Byb3RvLnRjcC5wb3J0ID0gZXhwLT50dXBsZS5kc3QudS50Y3AucG9ydDsKLQlleHAtPmRpciA9ICFkaXI7Ci0KLQkvKiBXaGVuIHlvdSBzZWUgdGhlIHBhY2tldCwgd2UgbmVlZCB0byBOQVQgaXQgdGhlIHNhbWUgYXMgdGhlCi0JICogdGhpcyBvbmUuICovCi0JZXhwLT5leHBlY3RmbiA9IGlwX25hdF9mb2xsb3dfbWFzdGVyOwotCi0JLyogVHJ5IHRvIGdldCBzYW1lIHBvcnQ6IGlmIG5vdCwgdHJ5IHRvIGNoYW5nZSBpdC4gKi8KLQlmb3IgKHBvcnQgPSBudG9ocyhleHAtPnNhdmVkX3Byb3RvLnRjcC5wb3J0KTsgcG9ydCAhPSAwOyBwb3J0KyspIHsKLQkJZXhwLT50dXBsZS5kc3QudS50Y3AucG9ydCA9IGh0b25zKHBvcnQpOwotCQlpZiAoaXBfY29ubnRyYWNrX2V4cGVjdF9yZWxhdGVkKGV4cCkgPT0gMCkKLQkJCWJyZWFrOwotCX0KLQotCWlmIChwb3J0ID09IDApCi0JCXJldHVybiBORl9EUk9QOwotCi0JaWYgKCFtYW5nbGVbdHlwZV0ocHNrYiwgbmV3aXAsIHBvcnQsIG1hdGNob2ZmLCBtYXRjaGxlbiwgY3QsIGN0aW5mbywKLQkJCSAgc2VxKSkgewotCQlpcF9jb25udHJhY2tfdW5leHBlY3RfcmVsYXRlZChleHApOwotCQlyZXR1cm4gTkZfRFJPUDsKLQl9Ci0JcmV0dXJuIE5GX0FDQ0VQVDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGlwX25hdF9mdHBfZmluaSh2b2lkKQotewotCXJjdV9hc3NpZ25fcG9pbnRlcihpcF9uYXRfZnRwX2hvb2ssIE5VTEwpOwotCXN5bmNocm9uaXplX3JjdSgpOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBpcF9uYXRfZnRwX2luaXQodm9pZCkKLXsKLQlCVUdfT04ocmN1X2RlcmVmZXJlbmNlKGlwX25hdF9mdHBfaG9vaykpOwotCXJjdV9hc3NpZ25fcG9pbnRlcihpcF9uYXRfZnRwX2hvb2ssIGlwX25hdF9mdHApOwotCXJldHVybiAwOwotfQotCi0vKiBQcmlvciB0byAyLjYuMTEsIHdlIGhhZCBhIHBvcnRzIHBhcmFtLiAgTm8gbG9uZ2VyLCBidXQgZG9uJ3QgYnJlYWsgdXNlcnMuICovCi1zdGF0aWMgaW50IHdhcm5fc2V0KGNvbnN0IGNoYXIgKnZhbCwgc3RydWN0IGtlcm5lbF9wYXJhbSAqa3ApCi17Ci0JcHJpbnRrKEtFUk5fSU5GTyBLQlVJTERfTU9ETkFNRQotCSAgICAgICAiOiBrZXJuZWwgPj0gMi42LjEwIG9ubHkgdXNlcyAncG9ydHMnIGZvciBjb25udHJhY2sgbW9kdWxlc1xuIik7Ci0JcmV0dXJuIDA7Ci19Ci1tb2R1bGVfcGFyYW1fY2FsbChwb3J0cywgd2Fybl9zZXQsIE5VTEwsIE5VTEwsIDApOwotCi1tb2R1bGVfaW5pdChpcF9uYXRfZnRwX2luaXQpOwotbW9kdWxlX2V4aXQoaXBfbmF0X2Z0cF9maW5pKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfaGVscGVyLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X2hlbHBlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzc3OGNmLi4wMDAwMDAwCi0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfaGVscGVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MzYgKzAsMCBAQAotLyogaXBfbmF0X2hlbHBlci5jIC0gZ2VuZXJpYyBzdXBwb3J0IGZ1bmN0aW9ucyBmb3IgTkFUIGhlbHBlcnMKLSAqCi0gKiAoQykgMjAwMC0yMDAyIEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBuZXRmaWx0ZXIub3JnPgotICogKEMpIDIwMDMtMjAwNCBOZXRmaWx0ZXIgQ29yZSBUZWFtIDxjb3JldGVhbUBuZXRmaWx0ZXIub3JnPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogCTE0IEphbiAyMDAyIEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+OgotICoJCS0gYWRkIHN1cHBvcnQgZm9yIFNBQ0sgYWRqdXN0bWVudAotICoJMTQgTWFyIDIwMDIgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz46Ci0gKgkJLSBtZXJnZSBTQUNLIHN1cHBvcnQgaW50byBuZXduYXQgQVBJCi0gKgkxNiBBdWcgMjAwMiBCcmlhbiBKLiBNdXJyZWxsIDxuZXRmaWx0ZXJAaW50ZXJsaW54LmJjLmNhPjoKLSAqCQktIG1ha2UgaXBfbmF0X3Jlc2l6ZV9wYWNrZXQgbW9yZSBnZW5lcmljIChUQ1AgYW5kIFVEUCkKLSAqCQktIGFkZCBpcF9uYXRfbWFuZ2xlX3VkcF9wYWNrZXQKLSAqLwotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+Ci0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQuaD4KLSNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KLSNpbmNsdWRlIDxuZXQvaWNtcC5oPgotI2luY2x1ZGUgPG5ldC9pcC5oPgotI2luY2x1ZGUgPG5ldC90Y3AuaD4KLSNpbmNsdWRlIDxuZXQvdWRwLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2suaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfaGVscGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0X3Byb3RvY29sLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0X2NvcmUuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9uYXRfaGVscGVyLmg+Ci0KLSNpZiAwCi0jZGVmaW5lIERFQlVHUCBwcmludGsKLSNkZWZpbmUgRFVNUF9PRkZTRVQoeCkJcHJpbnRrKCJvZmZzZXRfYmVmb3JlPSVkLCBvZmZzZXRfYWZ0ZXI9JWQsIGNvcnJlY3Rpb25fcG9zPSV1XG4iLCB4LT5vZmZzZXRfYmVmb3JlLCB4LT5vZmZzZXRfYWZ0ZXIsIHgtPmNvcnJlY3Rpb25fcG9zKTsKLSNlbHNlCi0jZGVmaW5lIERFQlVHUChmb3JtYXQsIGFyZ3MuLi4pCi0jZGVmaW5lIERVTVBfT0ZGU0VUKHgpCi0jZW5kaWYKLQotc3RhdGljIERFRklORV9TUElOTE9DSyhpcF9uYXRfc2Vxb2ZzX2xvY2spOwotCi0vKiBTZXR1cCBUQ1Agc2VxdWVuY2UgY29ycmVjdGlvbiBnaXZlbiB0aGlzIGNoYW5nZSBhdCB0aGlzIHNlcXVlbmNlICovCi1zdGF0aWMgaW5saW5lIHZvaWQKLWFkanVzdF90Y3Bfc2VxdWVuY2UodTMyIHNlcSwKLQkJICAgIGludCBzaXplZGlmZiwKLQkJICAgIHN0cnVjdCBpcF9jb25udHJhY2sgKmN0LAotCQkgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8pCi17Ci0JaW50IGRpcjsKLQlzdHJ1Y3QgaXBfbmF0X3NlcSAqdGhpc193YXksICpvdGhlcl93YXk7Ci0KLQlERUJVR1AoImlwX25hdF9yZXNpemVfcGFja2V0OiBvbGRfc2l6ZSA9ICV1LCBuZXdfc2l6ZSA9ICV1XG4iLAotCQkoKnNrYiktPmxlbiwgbmV3X3NpemUpOwotCi0JZGlyID0gQ1RJTkZPMkRJUihjdGluZm8pOwotCi0JdGhpc193YXkgPSAmY3QtPm5hdC5pbmZvLnNlcVtkaXJdOwotCW90aGVyX3dheSA9ICZjdC0+bmF0LmluZm8uc2VxWyFkaXJdOwotCi0JREVCVUdQKCJpcF9uYXRfcmVzaXplX3BhY2tldDogU2VxX29mZnNldCBiZWZvcmU6ICIpOwotCURVTVBfT0ZGU0VUKHRoaXNfd2F5KTsKLQotCXNwaW5fbG9ja19iaCgmaXBfbmF0X3NlcW9mc19sb2NrKTsKLQotCS8qIFNZTiBhZGp1c3QuIElmIGl0J3MgdW5pbml0aWFsaXplZCwgb3IgdGhpcyBpcyBhZnRlciBsYXN0Ci0JICogY29ycmVjdGlvbiwgcmVjb3JkIGl0OiB3ZSBkb24ndCBoYW5kbGUgbW9yZSB0aGFuIG9uZQotCSAqIGFkanVzdG1lbnQgaW4gdGhlIHdpbmRvdywgYnV0IGRvIGRlYWwgd2l0aCBjb21tb24gY2FzZSBvZiBhCi0JICogcmV0cmFuc21pdCAqLwotCWlmICh0aGlzX3dheS0+b2Zmc2V0X2JlZm9yZSA9PSB0aGlzX3dheS0+b2Zmc2V0X2FmdGVyCi0JICAgIHx8IGJlZm9yZSh0aGlzX3dheS0+Y29ycmVjdGlvbl9wb3MsIHNlcSkpIHsKLQkJICAgIHRoaXNfd2F5LT5jb3JyZWN0aW9uX3BvcyA9IHNlcTsKLQkJICAgIHRoaXNfd2F5LT5vZmZzZXRfYmVmb3JlID0gdGhpc193YXktPm9mZnNldF9hZnRlcjsKLQkJICAgIHRoaXNfd2F5LT5vZmZzZXRfYWZ0ZXIgKz0gc2l6ZWRpZmY7Ci0JfQotCXNwaW5fdW5sb2NrX2JoKCZpcF9uYXRfc2Vxb2ZzX2xvY2spOwotCi0JREVCVUdQKCJpcF9uYXRfcmVzaXplX3BhY2tldDogU2VxX29mZnNldCBhZnRlcjogIik7Ci0JRFVNUF9PRkZTRVQodGhpc193YXkpOwotfQotCi0vKiBGcm9icyBkYXRhIGluc2lkZSB0aGlzIHBhY2tldCwgd2hpY2ggaXMgbGluZWFyLiAqLwotc3RhdGljIHZvaWQgbWFuZ2xlX2NvbnRlbnRzKHN0cnVjdCBza19idWZmICpza2IsCi0JCQkgICAgdW5zaWduZWQgaW50IGRhdGFvZmYsCi0JCQkgICAgdW5zaWduZWQgaW50IG1hdGNoX29mZnNldCwKLQkJCSAgICB1bnNpZ25lZCBpbnQgbWF0Y2hfbGVuLAotCQkJICAgIGNvbnN0IGNoYXIgKnJlcF9idWZmZXIsCi0JCQkgICAgdW5zaWduZWQgaW50IHJlcF9sZW4pCi17Ci0JdW5zaWduZWQgY2hhciAqZGF0YTsKLQotCUJVR19PTihza2JfaXNfbm9ubGluZWFyKHNrYikpOwotCWRhdGEgPSAodW5zaWduZWQgY2hhciAqKXNrYi0+bmguaXBoICsgZGF0YW9mZjsKLQotCS8qIG1vdmUgcG9zdC1yZXBsYWNlbWVudCAqLwotCW1lbW1vdmUoZGF0YSArIG1hdGNoX29mZnNldCArIHJlcF9sZW4sCi0JCWRhdGEgKyBtYXRjaF9vZmZzZXQgKyBtYXRjaF9sZW4sCi0JCXNrYi0+dGFpbCAtIChkYXRhICsgbWF0Y2hfb2Zmc2V0ICsgbWF0Y2hfbGVuKSk7Ci0KLQkvKiBpbnNlcnQgZGF0YSBmcm9tIGJ1ZmZlciAqLwotCW1lbWNweShkYXRhICsgbWF0Y2hfb2Zmc2V0LCByZXBfYnVmZmVyLCByZXBfbGVuKTsKLQotCS8qIHVwZGF0ZSBza2IgaW5mbyAqLwotCWlmIChyZXBfbGVuID4gbWF0Y2hfbGVuKSB7Ci0JCURFQlVHUCgiaXBfbmF0X21hbmdsZV9wYWNrZXQ6IEV4dGVuZGluZyBwYWNrZXQgYnkgIgotCQkJIiV1IGZyb20gJXUgYnl0ZXNcbiIsIHJlcF9sZW4gLSBtYXRjaF9sZW4sCi0JCSAgICAgICBza2ItPmxlbik7Ci0JCXNrYl9wdXQoc2tiLCByZXBfbGVuIC0gbWF0Y2hfbGVuKTsKLQl9IGVsc2UgewotCQlERUJVR1AoImlwX25hdF9tYW5nbGVfcGFja2V0OiBTaHJpbmtpbmcgcGFja2V0IGZyb20gIgotCQkJIiV1IGZyb20gJXUgYnl0ZXNcbiIsIG1hdGNoX2xlbiAtIHJlcF9sZW4sCi0JCSAgICAgICBza2ItPmxlbik7Ci0JCV9fc2tiX3RyaW0oc2tiLCBza2ItPmxlbiArIHJlcF9sZW4gLSBtYXRjaF9sZW4pOwotCX0KLQotCS8qIGZpeCBJUCBoZHIgY2hlY2tzdW0gaW5mb3JtYXRpb24gKi8KLQlza2ItPm5oLmlwaC0+dG90X2xlbiA9IGh0b25zKHNrYi0+bGVuKTsKLQlpcF9zZW5kX2NoZWNrKHNrYi0+bmguaXBoKTsKLX0KLQotLyogVW51c3VhbCwgYnV0IHBvc3NpYmxlIGNhc2UuICovCi1zdGF0aWMgaW50IGVubGFyZ2Vfc2tiKHN0cnVjdCBza19idWZmICoqcHNrYiwgdW5zaWduZWQgaW50IGV4dHJhKQotewotCXN0cnVjdCBza19idWZmICpuc2tiOwotCi0JaWYgKCgqcHNrYiktPmxlbiArIGV4dHJhID4gNjU1MzUpCi0JCXJldHVybiAwOwotCi0JbnNrYiA9IHNrYl9jb3B5X2V4cGFuZCgqcHNrYiwgc2tiX2hlYWRyb29tKCpwc2tiKSwgZXh0cmEsIEdGUF9BVE9NSUMpOwotCWlmICghbnNrYikKLQkJcmV0dXJuIDA7Ci0KLQkvKiBUcmFuc2ZlciBzb2NrZXQgdG8gbmV3IHNrYi4gKi8KLQlpZiAoKCpwc2tiKS0+c2spCi0JCXNrYl9zZXRfb3duZXJfdyhuc2tiLCAoKnBza2IpLT5zayk7Ci0Ja2ZyZWVfc2tiKCpwc2tiKTsKLQkqcHNrYiA9IG5za2I7Ci0JcmV0dXJuIDE7Ci19Ci0KLS8qIEdlbmVyaWMgZnVuY3Rpb24gZm9yIG1hbmdsaW5nIHZhcmlhYmxlLWxlbmd0aCBhZGRyZXNzIGNoYW5nZXMgaW5zaWRlCi0gKiBOQVRlZCBUQ1AgY29ubmVjdGlvbnMgKGxpa2UgdGhlIFBPUlQgWFhYLFhYWCxYWFgsWFhYLFhYWCxYWFgKLSAqIGNvbW1hbmQgaW4gRlRQKS4KLSAqCi0gKiBUYWtlcyBjYXJlIGFib3V0IGFsbCB0aGUgbmFzdHkgc2VxdWVuY2UgbnVtYmVyIGNoYW5nZXMsIGNoZWNrc3VtbWluZywKLSAqIHNrYiBlbmxhcmdlbWVudCwgLi4uCi0gKgotICogKi8KLWludAotaXBfbmF0X21hbmdsZV90Y3BfcGFja2V0KHN0cnVjdCBza19idWZmICoqcHNrYiwKLQkJCSBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKLQkJCSBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKLQkJCSB1bnNpZ25lZCBpbnQgbWF0Y2hfb2Zmc2V0LAotCQkJIHVuc2lnbmVkIGludCBtYXRjaF9sZW4sCi0JCQkgY29uc3QgY2hhciAqcmVwX2J1ZmZlciwKLQkJCSB1bnNpZ25lZCBpbnQgcmVwX2xlbikKLXsKLQlzdHJ1Y3QgaXBoZHIgKmlwaDsKLQlzdHJ1Y3QgdGNwaGRyICp0Y3BoOwotCWludCBvbGRsZW4sIGRhdGFsZW47Ci0KLQlpZiAoIXNrYl9tYWtlX3dyaXRhYmxlKHBza2IsICgqcHNrYiktPmxlbikpCi0JCXJldHVybiAwOwotCi0JaWYgKHJlcF9sZW4gPiBtYXRjaF9sZW4KLQkgICAgJiYgcmVwX2xlbiAtIG1hdGNoX2xlbiA+IHNrYl90YWlscm9vbSgqcHNrYikKLQkgICAgJiYgIWVubGFyZ2Vfc2tiKHBza2IsIHJlcF9sZW4gLSBtYXRjaF9sZW4pKQotCQlyZXR1cm4gMDsKLQotCVNLQl9MSU5FQVJfQVNTRVJUKCpwc2tiKTsKLQotCWlwaCA9ICgqcHNrYiktPm5oLmlwaDsKLQl0Y3BoID0gKHZvaWQgKilpcGggKyBpcGgtPmlobCo0OwotCi0Jb2xkbGVuID0gKCpwc2tiKS0+bGVuIC0gaXBoLT5paGwqNDsKLQltYW5nbGVfY29udGVudHMoKnBza2IsIGlwaC0+aWhsKjQgKyB0Y3BoLT5kb2ZmKjQsCi0JCQltYXRjaF9vZmZzZXQsIG1hdGNoX2xlbiwgcmVwX2J1ZmZlciwgcmVwX2xlbik7Ci0KLQlkYXRhbGVuID0gKCpwc2tiKS0+bGVuIC0gaXBoLT5paGwqNDsKLQlpZiAoKCpwc2tiKS0+aXBfc3VtbWVkICE9IENIRUNLU1VNX1BBUlRJQUwpIHsKLQkJdGNwaC0+Y2hlY2sgPSAwOwotCQl0Y3BoLT5jaGVjayA9IHRjcF92NF9jaGVjayhkYXRhbGVuLAotCQkJCQkgICBpcGgtPnNhZGRyLCBpcGgtPmRhZGRyLAotCQkJCQkgICBjc3VtX3BhcnRpYWwoKGNoYXIgKil0Y3BoLAotCQkJCQkJCWRhdGFsZW4sIDApKTsKLQl9IGVsc2UKLQkJbmZfcHJvdG9fY3N1bV9yZXBsYWNlMigmdGNwaC0+Y2hlY2ssICpwc2tiLAotCQkJCQlodG9ucyhvbGRsZW4pLCBodG9ucyhkYXRhbGVuKSwgMSk7Ci0KLQlpZiAocmVwX2xlbiAhPSBtYXRjaF9sZW4pIHsKLQkJc2V0X2JpdChJUFNfU0VRX0FESlVTVF9CSVQsICZjdC0+c3RhdHVzKTsKLQkJYWRqdXN0X3RjcF9zZXF1ZW5jZShudG9obCh0Y3BoLT5zZXEpLAotCQkJCSAgICAoaW50KXJlcF9sZW4gLSAoaW50KW1hdGNoX2xlbiwKLQkJCQkgICAgY3QsIGN0aW5mbyk7Ci0JCS8qIFRlbGwgVENQIHdpbmRvdyB0cmFja2luZyBhYm91dCBzZXEgY2hhbmdlICovCi0JCWlwX2Nvbm50cmFja190Y3BfdXBkYXRlKCpwc2tiLCBjdCwgQ1RJTkZPMkRJUihjdGluZm8pKTsKLQl9Ci0JcmV0dXJuIDE7Ci19Ci1FWFBPUlRfU1lNQk9MKGlwX25hdF9tYW5nbGVfdGNwX3BhY2tldCk7Ci0KLS8qIEdlbmVyaWMgZnVuY3Rpb24gZm9yIG1hbmdsaW5nIHZhcmlhYmxlLWxlbmd0aCBhZGRyZXNzIGNoYW5nZXMgaW5zaWRlCi0gKiBOQVRlZCBVRFAgY29ubmVjdGlvbnMgKGxpa2UgdGhlIENPTk5FQ1QgREFUQSBYWFhYWCBNRVNHIFhYWFhYIElOREVYIFhYWFhYCi0gKiBjb21tYW5kIGluIHRoZSBBbWFuZGEgcHJvdG9jb2wpCi0gKgotICogVGFrZXMgY2FyZSBhYm91dCBhbGwgdGhlIG5hc3R5IHNlcXVlbmNlIG51bWJlciBjaGFuZ2VzLCBjaGVja3N1bW1pbmcsCi0gKiBza2IgZW5sYXJnZW1lbnQsIC4uLgotICoKLSAqIFhYWCAtIFRoaXMgZnVuY3Rpb24gY291bGQgYmUgbWVyZ2VkIHdpdGggaXBfbmF0X21hbmdsZV90Y3BfcGFja2V0IHdoaWNoCi0gKiAgICAgICBzaG91bGQgYmUgZmFpcmx5IGVhc3kgdG8gZG8uCi0gKi8KLWludAotaXBfbmF0X21hbmdsZV91ZHBfcGFja2V0KHN0cnVjdCBza19idWZmICoqcHNrYiwKLQkJCSBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKLQkJCSBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKLQkJCSB1bnNpZ25lZCBpbnQgbWF0Y2hfb2Zmc2V0LAotCQkJIHVuc2lnbmVkIGludCBtYXRjaF9sZW4sCi0JCQkgY29uc3QgY2hhciAqcmVwX2J1ZmZlciwKLQkJCSB1bnNpZ25lZCBpbnQgcmVwX2xlbikKLXsKLQlzdHJ1Y3QgaXBoZHIgKmlwaDsKLQlzdHJ1Y3QgdWRwaGRyICp1ZHBoOwotCWludCBkYXRhbGVuLCBvbGRsZW47Ci0KLQkvKiBVRFAgaGVscGVycyBtaWdodCBhY2NpZGVudGFsbHkgbWFuZ2xlIHRoZSB3cm9uZyBwYWNrZXQgKi8KLQlpcGggPSAoKnBza2IpLT5uaC5pcGg7Ci0JaWYgKCgqcHNrYiktPmxlbiA8IGlwaC0+aWhsKjQgKyBzaXplb2YoKnVkcGgpICsKLQkJCSAgICAgICBtYXRjaF9vZmZzZXQgKyBtYXRjaF9sZW4pCi0JCXJldHVybiAwOwotCi0JaWYgKCFza2JfbWFrZV93cml0YWJsZShwc2tiLCAoKnBza2IpLT5sZW4pKQotCQlyZXR1cm4gMDsKLQotCWlmIChyZXBfbGVuID4gbWF0Y2hfbGVuCi0JICAgICYmIHJlcF9sZW4gLSBtYXRjaF9sZW4gPiBza2JfdGFpbHJvb20oKnBza2IpCi0JICAgICYmICFlbmxhcmdlX3NrYihwc2tiLCByZXBfbGVuIC0gbWF0Y2hfbGVuKSkKLQkJcmV0dXJuIDA7Ci0KLQlpcGggPSAoKnBza2IpLT5uaC5pcGg7Ci0JdWRwaCA9ICh2b2lkICopaXBoICsgaXBoLT5paGwqNDsKLQotCW9sZGxlbiA9ICgqcHNrYiktPmxlbiAtIGlwaC0+aWhsKjQ7Ci0JbWFuZ2xlX2NvbnRlbnRzKCpwc2tiLCBpcGgtPmlobCo0ICsgc2l6ZW9mKCp1ZHBoKSwKLQkJCW1hdGNoX29mZnNldCwgbWF0Y2hfbGVuLCByZXBfYnVmZmVyLCByZXBfbGVuKTsKLQotCS8qIHVwZGF0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBVRFAgcGFja2V0ICovCi0JZGF0YWxlbiA9ICgqcHNrYiktPmxlbiAtIGlwaC0+aWhsKjQ7Ci0JdWRwaC0+bGVuID0gaHRvbnMoZGF0YWxlbik7Ci0KLQkvKiBmaXggdWRwIGNoZWNrc3VtIGlmIHVkcCBjaGVja3N1bSB3YXMgcHJldmlvdXNseSBjYWxjdWxhdGVkICovCi0JaWYgKCF1ZHBoLT5jaGVjayAmJiAoKnBza2IpLT5pcF9zdW1tZWQgIT0gQ0hFQ0tTVU1fUEFSVElBTCkKLQkJcmV0dXJuIDE7Ci0KLQlpZiAoKCpwc2tiKS0+aXBfc3VtbWVkICE9IENIRUNLU1VNX1BBUlRJQUwpIHsKLQkJdWRwaC0+Y2hlY2sgPSAwOwotCQl1ZHBoLT5jaGVjayA9IGNzdW1fdGNwdWRwX21hZ2ljKGlwaC0+c2FkZHIsIGlwaC0+ZGFkZHIsCi0JCQkJCQlkYXRhbGVuLCBJUFBST1RPX1VEUCwKLQkJCQkJCWNzdW1fcGFydGlhbCgoY2hhciAqKXVkcGgsCi0JCQkJCQkJICAgICBkYXRhbGVuLCAwKSk7Ci0JCWlmICghdWRwaC0+Y2hlY2spCi0JCQl1ZHBoLT5jaGVjayA9IENTVU1fTUFOR0xFRF8wOwotCX0gZWxzZQotCQluZl9wcm90b19jc3VtX3JlcGxhY2UyKCZ1ZHBoLT5jaGVjaywgKnBza2IsCi0JCQkJCWh0b25zKG9sZGxlbiksIGh0b25zKGRhdGFsZW4pLCAxKTsKLQlyZXR1cm4gMTsKLX0KLUVYUE9SVF9TWU1CT0woaXBfbmF0X21hbmdsZV91ZHBfcGFja2V0KTsKLQotLyogQWRqdXN0IG9uZSBmb3VuZCBTQUNLIG9wdGlvbiBpbmNsdWRpbmcgY2hlY2tzdW0gY29ycmVjdGlvbiAqLwotc3RhdGljIHZvaWQKLXNhY2tfYWRqdXN0KHN0cnVjdCBza19idWZmICpza2IsCi0JICAgIHN0cnVjdCB0Y3BoZHIgKnRjcGgsCi0JICAgIHVuc2lnbmVkIGludCBzYWNrb2ZmLAotCSAgICB1bnNpZ25lZCBpbnQgc2Fja2VuZCwKLQkgICAgc3RydWN0IGlwX25hdF9zZXEgKm5hdHNlcSkKLXsKLQl3aGlsZSAoc2Fja29mZiA8IHNhY2tlbmQpIHsKLQkJc3RydWN0IHRjcF9zYWNrX2Jsb2NrX3dpcmUgKnNhY2s7Ci0JCV9fYmUzMiBuZXdfc3RhcnRfc2VxLCBuZXdfZW5kX3NlcTsKLQotCQlzYWNrID0gKHZvaWQgKilza2ItPmRhdGEgKyBzYWNrb2ZmOwotCQlpZiAoYWZ0ZXIobnRvaGwoc2Fjay0+c3RhcnRfc2VxKSAtIG5hdHNlcS0+b2Zmc2V0X2JlZm9yZSwKLQkJCSAgbmF0c2VxLT5jb3JyZWN0aW9uX3BvcykpCi0JCQluZXdfc3RhcnRfc2VxID0gaHRvbmwobnRvaGwoc2Fjay0+c3RhcnRfc2VxKQotCQkJCQktIG5hdHNlcS0+b2Zmc2V0X2FmdGVyKTsKLQkJZWxzZQotCQkJbmV3X3N0YXJ0X3NlcSA9IGh0b25sKG50b2hsKHNhY2stPnN0YXJ0X3NlcSkKLQkJCQkJLSBuYXRzZXEtPm9mZnNldF9iZWZvcmUpOwotCi0JCWlmIChhZnRlcihudG9obChzYWNrLT5lbmRfc2VxKSAtIG5hdHNlcS0+b2Zmc2V0X2JlZm9yZSwKLQkJCSAgbmF0c2VxLT5jb3JyZWN0aW9uX3BvcykpCi0JCQluZXdfZW5kX3NlcSA9IGh0b25sKG50b2hsKHNhY2stPmVuZF9zZXEpCi0JCQkJICAgICAgLSBuYXRzZXEtPm9mZnNldF9hZnRlcik7Ci0JCWVsc2UKLQkJCW5ld19lbmRfc2VxID0gaHRvbmwobnRvaGwoc2Fjay0+ZW5kX3NlcSkKLQkJCQkgICAgICAtIG5hdHNlcS0+b2Zmc2V0X2JlZm9yZSk7Ci0KLQkJREVCVUdQKCJzYWNrX2FkanVzdDogc3RhcnRfc2VxOiAlZC0+JWQsIGVuZF9zZXE6ICVkLT4lZFxuIiwKLQkJCW50b2hsKHNhY2stPnN0YXJ0X3NlcSksIG5ld19zdGFydF9zZXEsCi0JCQludG9obChzYWNrLT5lbmRfc2VxKSwgbmV3X2VuZF9zZXEpOwotCi0JCW5mX3Byb3RvX2NzdW1fcmVwbGFjZTQoJnRjcGgtPmNoZWNrLCBza2IsCi0JCQkJCXNhY2stPnN0YXJ0X3NlcSwgbmV3X3N0YXJ0X3NlcSwgMCk7Ci0JCW5mX3Byb3RvX2NzdW1fcmVwbGFjZTQoJnRjcGgtPmNoZWNrLCBza2IsCi0JCQkJCXNhY2stPmVuZF9zZXEsIG5ld19lbmRfc2VxLCAwKTsKLQkJc2Fjay0+c3RhcnRfc2VxID0gbmV3X3N0YXJ0X3NlcTsKLQkJc2Fjay0+ZW5kX3NlcSA9IG5ld19lbmRfc2VxOwotCQlzYWNrb2ZmICs9IHNpemVvZigqc2Fjayk7Ci0JfQotfQotCi0vKiBUQ1AgU0FDSyBzZXF1ZW5jZSBudW1iZXIgYWRqdXN0bWVudCAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQKLWlwX25hdF9zYWNrX2FkanVzdChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCi0JCSAgIHN0cnVjdCB0Y3BoZHIgKnRjcGgsCi0JCSAgIHN0cnVjdCBpcF9jb25udHJhY2sgKmN0LAotCQkgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbykKLXsKLQl1bnNpZ25lZCBpbnQgZGlyLCBvcHRvZmYsIG9wdGVuZDsKLQotCW9wdG9mZiA9ICgqcHNrYiktPm5oLmlwaC0+aWhsKjQgKyBzaXplb2Yoc3RydWN0IHRjcGhkcik7Ci0Jb3B0ZW5kID0gKCpwc2tiKS0+bmguaXBoLT5paGwqNCArIHRjcGgtPmRvZmYqNDsKLQotCWlmICghc2tiX21ha2Vfd3JpdGFibGUocHNrYiwgb3B0ZW5kKSkKLQkJcmV0dXJuIDA7Ci0KLQlkaXIgPSBDVElORk8yRElSKGN0aW5mbyk7Ci0KLQl3aGlsZSAob3B0b2ZmIDwgb3B0ZW5kKSB7Ci0JCS8qIFVzdWFsbHk6IG9wdGlvbiwgbGVuZ3RoLiAqLwotCQl1bnNpZ25lZCBjaGFyICpvcCA9ICgqcHNrYiktPmRhdGEgKyBvcHRvZmY7Ci0KLQkJc3dpdGNoIChvcFswXSkgewotCQljYXNlIFRDUE9QVF9FT0w6Ci0JCQlyZXR1cm4gMTsKLQkJY2FzZSBUQ1BPUFRfTk9QOgotCQkJb3B0b2ZmKys7Ci0JCQljb250aW51ZTsKLQkJZGVmYXVsdDoKLQkJCS8qIG5vIHBhcnRpYWwgb3B0aW9ucyAqLwotCQkJaWYgKG9wdG9mZiArIDEgPT0gb3B0ZW5kCi0JCQkgICAgfHwgb3B0b2ZmICsgb3BbMV0gPiBvcHRlbmQKLQkJCSAgICB8fCBvcFsxXSA8IDIpCi0JCQkJcmV0dXJuIDA7Ci0JCQlpZiAob3BbMF0gPT0gVENQT1BUX1NBQ0sKLQkJCSAgICAmJiBvcFsxXSA+PSAyK1RDUE9MRU5fU0FDS19QRVJCTE9DSwotCQkJICAgICYmICgob3BbMV0gLSAyKSAlIFRDUE9MRU5fU0FDS19QRVJCTE9DSykgPT0gMCkKLQkJCQlzYWNrX2FkanVzdCgqcHNrYiwgdGNwaCwgb3B0b2ZmKzIsCi0JCQkJCSAgICBvcHRvZmYrb3BbMV0sCi0JCQkJCSAgICAmY3QtPm5hdC5pbmZvLnNlcVshZGlyXSk7Ci0JCQlvcHRvZmYgKz0gb3BbMV07Ci0JCX0KLQl9Ci0JcmV0dXJuIDE7Ci19Ci0KLS8qIFRDUCBzZXF1ZW5jZSBudW1iZXIgYWRqdXN0bWVudC4gIFJldHVybnMgMSBvbiBzdWNjZXNzLCAwIG9uIGZhaWx1cmUgKi8KLWludAotaXBfbmF0X3NlcV9hZGp1c3Qoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAotCQkgIHN0cnVjdCBpcF9jb25udHJhY2sgKmN0LAotCQkgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvKQotewotCXN0cnVjdCB0Y3BoZHIgKnRjcGg7Ci0JaW50IGRpcjsKLQlfX2JlMzIgbmV3c2VxLCBuZXdhY2s7Ci0Jc3RydWN0IGlwX25hdF9zZXEgKnRoaXNfd2F5LCAqb3RoZXJfd2F5OwotCi0JZGlyID0gQ1RJTkZPMkRJUihjdGluZm8pOwotCi0JdGhpc193YXkgPSAmY3QtPm5hdC5pbmZvLnNlcVtkaXJdOwotCW90aGVyX3dheSA9ICZjdC0+bmF0LmluZm8uc2VxWyFkaXJdOwotCi0JaWYgKCFza2JfbWFrZV93cml0YWJsZShwc2tiLCAoKnBza2IpLT5uaC5pcGgtPmlobCo0K3NpemVvZigqdGNwaCkpKQotCQlyZXR1cm4gMDsKLQotCXRjcGggPSAodm9pZCAqKSgqcHNrYiktPmRhdGEgKyAoKnBza2IpLT5uaC5pcGgtPmlobCo0OwotCWlmIChhZnRlcihudG9obCh0Y3BoLT5zZXEpLCB0aGlzX3dheS0+Y29ycmVjdGlvbl9wb3MpKQotCQluZXdzZXEgPSBodG9ubChudG9obCh0Y3BoLT5zZXEpICsgdGhpc193YXktPm9mZnNldF9hZnRlcik7Ci0JZWxzZQotCQluZXdzZXEgPSBodG9ubChudG9obCh0Y3BoLT5zZXEpICsgdGhpc193YXktPm9mZnNldF9iZWZvcmUpOwotCi0JaWYgKGFmdGVyKG50b2hsKHRjcGgtPmFja19zZXEpIC0gb3RoZXJfd2F5LT5vZmZzZXRfYmVmb3JlLAotCQkgIG90aGVyX3dheS0+Y29ycmVjdGlvbl9wb3MpKQotCQluZXdhY2sgPSBodG9ubChudG9obCh0Y3BoLT5hY2tfc2VxKSAtIG90aGVyX3dheS0+b2Zmc2V0X2FmdGVyKTsKLQllbHNlCi0JCW5ld2FjayA9IGh0b25sKG50b2hsKHRjcGgtPmFja19zZXEpIC0gb3RoZXJfd2F5LT5vZmZzZXRfYmVmb3JlKTsKLQotCW5mX3Byb3RvX2NzdW1fcmVwbGFjZTQoJnRjcGgtPmNoZWNrLCAqcHNrYiwgdGNwaC0+c2VxLCBuZXdzZXEsIDApOwotCW5mX3Byb3RvX2NzdW1fcmVwbGFjZTQoJnRjcGgtPmNoZWNrLCAqcHNrYiwgdGNwaC0+YWNrX3NlcSwgbmV3YWNrLCAwKTsKLQotCURFQlVHUCgiQWRqdXN0aW5nIHNlcXVlbmNlIG51bWJlciBmcm9tICV1LT4ldSwgYWNrIGZyb20gJXUtPiV1XG4iLAotCQludG9obCh0Y3BoLT5zZXEpLCBudG9obChuZXdzZXEpLCBudG9obCh0Y3BoLT5hY2tfc2VxKSwKLQkJbnRvaGwobmV3YWNrKSk7Ci0KLQl0Y3BoLT5zZXEgPSBuZXdzZXE7Ci0JdGNwaC0+YWNrX3NlcSA9IG5ld2FjazsKLQotCWlmICghaXBfbmF0X3NhY2tfYWRqdXN0KHBza2IsIHRjcGgsIGN0LCBjdGluZm8pKQotCQlyZXR1cm4gMDsKLQotCWlwX2Nvbm50cmFja190Y3BfdXBkYXRlKCpwc2tiLCBjdCwgZGlyKTsKLQotCXJldHVybiAxOwotfQotRVhQT1JUX1NZTUJPTChpcF9uYXRfc2VxX2FkanVzdCk7Ci0KLS8qIFNldHVwIE5BVCBvbiB0aGlzIGV4cGVjdGVkIGNvbm50cmFjayBzbyBpdCBmb2xsb3dzIG1hc3Rlci4gKi8KLS8qIElmIHdlIGZhaWwgdG8gZ2V0IGEgZnJlZSBOQVQgc2xvdCwgd2UnbGwgZ2V0IGRyb3BwZWQgb24gY29uZmlybSAqLwotdm9pZCBpcF9uYXRfZm9sbG93X21hc3RlcihzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKLQkJCSAgc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmV4cCkKLXsKLQlzdHJ1Y3QgaXBfbmF0X3JhbmdlIHJhbmdlOwotCi0JLyogVGhpcyBtdXN0IGJlIGEgZnJlc2ggb25lLiAqLwotCUJVR19PTihjdC0+c3RhdHVzICYgSVBTX05BVF9ET05FX01BU0spOwotCi0JLyogQ2hhbmdlIHNyYyB0byB3aGVyZSBtYXN0ZXIgc2VuZHMgdG8gKi8KLQlyYW5nZS5mbGFncyA9IElQX05BVF9SQU5HRV9NQVBfSVBTOwotCXJhbmdlLm1pbl9pcCA9IHJhbmdlLm1heF9pcAotCQk9IGN0LT5tYXN0ZXItPnR1cGxlaGFzaFshZXhwLT5kaXJdLnR1cGxlLmRzdC5pcDsKLQkvKiBob29rIGRvZXNuJ3QgbWF0dGVyLCBidXQgaXQgaGFzIHRvIGRvIHNvdXJjZSBtYW5pcCAqLwotCWlwX25hdF9zZXR1cF9pbmZvKGN0LCAmcmFuZ2UsIE5GX0lQX1BPU1RfUk9VVElORyk7Ci0KLQkvKiBGb3IgRFNUIG1hbmlwLCBtYXAgcG9ydCBoZXJlIHRvIHdoZXJlIGl0J3MgZXhwZWN0ZWQuICovCi0JcmFuZ2UuZmxhZ3MgPSAoSVBfTkFUX1JBTkdFX01BUF9JUFMgfCBJUF9OQVRfUkFOR0VfUFJPVE9fU1BFQ0lGSUVEKTsKLQlyYW5nZS5taW4gPSByYW5nZS5tYXggPSBleHAtPnNhdmVkX3Byb3RvOwotCXJhbmdlLm1pbl9pcCA9IHJhbmdlLm1heF9pcAotCQk9IGN0LT5tYXN0ZXItPnR1cGxlaGFzaFshZXhwLT5kaXJdLnR1cGxlLnNyYy5pcDsKLQkvKiBob29rIGRvZXNuJ3QgbWF0dGVyLCBidXQgaXQgaGFzIHRvIGRvIGRlc3RpbmF0aW9uIG1hbmlwICovCi0JaXBfbmF0X3NldHVwX2luZm8oY3QsICZyYW5nZSwgTkZfSVBfUFJFX1JPVVRJTkcpOwotfQotRVhQT1JUX1NZTUJPTChpcF9uYXRfZm9sbG93X21hc3Rlcik7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X2hlbHBlcl9oMzIzLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X2hlbHBlcl9oMzIzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkYzk5ZWYuLjAwMDAwMDAKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9oZWxwZXJfaDMyMy5jCisrKyAvZGV2L251bGwKQEAgLTEsNjExICswLDAgQEAKLS8qCi0gKiBILjMyMyBleHRlbnNpb24gZm9yIE5BVCBhbHRlcmF0aW9uLgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNiBKaW5nIE1pbiBaaGFvIDx6aGFvamluZ21pbkB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+Ci0gKgotICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4KLSAqCi0gKiBCYXNlZCBvbiB0aGUgJ2JydXRlIGZvcmNlJyBILjMyMyBOQVQgbW9kdWxlIGJ5Ci0gKiBKb3pzZWYgS2FkbGVjc2lrIDxrYWRsZWNAYmxhY2tob2xlLmtma2kuaHU+Ci0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvaXAuaD4KLSNpbmNsdWRlIDxsaW51eC90Y3AuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgotI2luY2x1ZGUgPG5ldC90Y3AuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9uYXQuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9uYXRfaGVscGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0X3J1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfdHVwbGUuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfaDMyMy5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19oZWxwZXIuaD4KLQotI2lmIDAKLSNkZWZpbmUgREVCVUdQIHByaW50awotI2Vsc2UKLSNkZWZpbmUgREVCVUdQKGZvcm1hdCwgYXJncy4uLikKLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgc2V0X2FkZHIoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAotCQkgICAgdW5zaWduZWQgY2hhciAqKmRhdGEsIGludCBkYXRhb2ZmLAotCQkgICAgdW5zaWduZWQgaW50IGFkZHJvZmYsIF9fYmUzMiBpcCwgdV9pbnQxNl90IHBvcnQpCi17Ci0JZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm87Ci0Jc3RydWN0IGlwX2Nvbm50cmFjayAqY3QgPSBpcF9jb25udHJhY2tfZ2V0KCpwc2tiLCAmY3RpbmZvKTsKLQlzdHJ1Y3QgewotCQlfX2JlMzIgaXA7Ci0JCV9fYmUxNiBwb3J0OwotCX0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBidWY7Ci0Jc3RydWN0IHRjcGhkciBfdGNwaCwgKnRoOwotCi0JYnVmLmlwID0gaXA7Ci0JYnVmLnBvcnQgPSBodG9ucyhwb3J0KTsKLQlhZGRyb2ZmICs9IGRhdGFvZmY7Ci0KLQlpZiAoKCpwc2tiKS0+bmguaXBoLT5wcm90b2NvbCA9PSBJUFBST1RPX1RDUCkgewotCQlpZiAoIWlwX25hdF9tYW5nbGVfdGNwX3BhY2tldChwc2tiLCBjdCwgY3RpbmZvLAotCQkJCQkgICAgICBhZGRyb2ZmLCBzaXplb2YoYnVmKSwKLQkJCQkJICAgICAgKGNoYXIgKikgJmJ1Ziwgc2l6ZW9mKGJ1ZikpKSB7Ci0JCQlpZiAobmV0X3JhdGVsaW1pdCgpKQotCQkJCXByaW50aygiaXBfbmF0X2gzMjM6IGlwX25hdF9tYW5nbGVfdGNwX3BhY2tldCIKLQkJCQkgICAgICAgIiBlcnJvclxuIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQotCQkvKiBSZWxvY2F0ZSBkYXRhIHBvaW50ZXIgKi8KLQkJdGggPSBza2JfaGVhZGVyX3BvaW50ZXIoKnBza2IsICgqcHNrYiktPm5oLmlwaC0+aWhsICogNCwKLQkJCQkJc2l6ZW9mKF90Y3BoKSwgJl90Y3BoKTsKLQkJaWYgKHRoID09IE5VTEwpCi0JCQlyZXR1cm4gLTE7Ci0JCSpkYXRhID0gKCpwc2tiKS0+ZGF0YSArICgqcHNrYiktPm5oLmlwaC0+aWhsICogNCArCi0JCSAgICB0aC0+ZG9mZiAqIDQgKyBkYXRhb2ZmOwotCX0gZWxzZSB7Ci0JCWlmICghaXBfbmF0X21hbmdsZV91ZHBfcGFja2V0KHBza2IsIGN0LCBjdGluZm8sCi0JCQkJCSAgICAgIGFkZHJvZmYsIHNpemVvZihidWYpLAotCQkJCQkgICAgICAoY2hhciAqKSAmYnVmLCBzaXplb2YoYnVmKSkpIHsKLQkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCi0JCQkJcHJpbnRrKCJpcF9uYXRfaDMyMzogaXBfbmF0X21hbmdsZV91ZHBfcGFja2V0IgotCQkJCSAgICAgICAiIGVycm9yXG4iKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQkvKiBpcF9uYXRfbWFuZ2xlX3VkcF9wYWNrZXQgdXNlcyBza2JfbWFrZV93cml0YWJsZSgpIHRvIGNvcHkKLQkJICogb3IgcHVsbCBldmVyeXRoaW5nIGluIGEgbGluZWFyIGJ1ZmZlciwgc28gd2UgY2FuIHNhZmVseQotCQkgKiB1c2UgdGhlIHNrYiBwb2ludGVycyBub3cgKi8KLQkJKmRhdGEgPSAoKnBza2IpLT5kYXRhICsgKCpwc2tiKS0+bmguaXBoLT5paGwgKiA0ICsKLQkJICAgIHNpemVvZihzdHJ1Y3QgdWRwaGRyKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IHNldF9oMjI1X2FkZHIoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAotCQkJIHVuc2lnbmVkIGNoYXIgKipkYXRhLCBpbnQgZGF0YW9mZiwKLQkJCSBUcmFuc3BvcnRBZGRyZXNzICogYWRkciwKLQkJCSBfX2JlMzIgaXAsIHVfaW50MTZfdCBwb3J0KQotewotCXJldHVybiBzZXRfYWRkcihwc2tiLCBkYXRhLCBkYXRhb2ZmLCBhZGRyLT5pcEFkZHJlc3MuaXAsIGlwLCBwb3J0KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IHNldF9oMjQ1X2FkZHIoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAotCQkJIHVuc2lnbmVkIGNoYXIgKipkYXRhLCBpbnQgZGF0YW9mZiwKLQkJCSBIMjQ1X1RyYW5zcG9ydEFkZHJlc3MgKiBhZGRyLAotCQkJIF9fYmUzMiBpcCwgdV9pbnQxNl90IHBvcnQpCi17Ci0JcmV0dXJuIHNldF9hZGRyKHBza2IsIGRhdGEsIGRhdGFvZmYsCi0JCQlhZGRyLT51bmljYXN0QWRkcmVzcy5pUEFkZHJlc3MubmV0d29yaywgaXAsIHBvcnQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgc2V0X3NpZ19hZGRyKHN0cnVjdCBza19idWZmICoqcHNrYiwgc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsCi0JCQllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKLQkJCXVuc2lnbmVkIGNoYXIgKipkYXRhLAotCQkJVHJhbnNwb3J0QWRkcmVzcyAqIGFkZHIsIGludCBjb3VudCkKLXsKLQlzdHJ1Y3QgaXBfY3RfaDMyM19tYXN0ZXIgKmluZm8gPSAmY3QtPmhlbHAuY3RfaDMyM19pbmZvOwotCWludCBkaXIgPSBDVElORk8yRElSKGN0aW5mbyk7Ci0JaW50IGk7Ci0JX19iZTMyIGlwOwotCXVfaW50MTZfdCBwb3J0OwotCi0JZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJaWYgKGdldF9oMjI1X2FkZHIoKmRhdGEsICZhZGRyW2ldLCAmaXAsICZwb3J0KSkgewotCQkJaWYgKGlwID09IGN0LT50dXBsZWhhc2hbZGlyXS50dXBsZS5zcmMuaXAgJiYKLQkJCSAgICBwb3J0ID09IGluZm8tPnNpZ19wb3J0W2Rpcl0pIHsKLQkJCQkvKiBHVy0+R0sgKi8KLQotCQkJCS8qIEZpeCBmb3IgR25vbWVtZWV0aW5nICovCi0JCQkJaWYgKGkgPiAwICYmCi0JCQkJICAgIGdldF9oMjI1X2FkZHIoKmRhdGEsICZhZGRyWzBdLAotCQkJCQkJICAmaXAsICZwb3J0KSAmJgotCQkJCSAgICAobnRvaGwoaXApICYgMHhmZjAwMDAwMCkgPT0gMHg3ZjAwMDAwMCkKLQkJCQkJaSA9IDA7Ci0KLQkJCQlERUJVR1AKLQkJCQkgICAgKCJpcF9uYXRfcmFzOiBzZXQgc2lnbmFsIGFkZHJlc3MgIgotCQkJCSAgICAgIiV1LiV1LiV1LiV1OiVodS0+JXUuJXUuJXUuJXU6JWh1XG4iLAotCQkJCSAgICAgTklQUVVBRChpcCksIHBvcnQsCi0JCQkJICAgICBOSVBRVUFEKGN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuZHN0LgotCQkJCQkgICAgIGlwKSwgaW5mby0+c2lnX3BvcnRbIWRpcl0pOwotCQkJCXJldHVybiBzZXRfaDIyNV9hZGRyKHBza2IsIGRhdGEsIDAsICZhZGRyW2ldLAotCQkJCQkJICAgICBjdC0+dHVwbGVoYXNoWyFkaXJdLgotCQkJCQkJICAgICB0dXBsZS5kc3QuaXAsCi0JCQkJCQkgICAgIGluZm8tPnNpZ19wb3J0WyFkaXJdKTsKLQkJCX0gZWxzZSBpZiAoaXAgPT0gY3QtPnR1cGxlaGFzaFtkaXJdLnR1cGxlLmRzdC5pcCAmJgotCQkJCSAgIHBvcnQgPT0gaW5mby0+c2lnX3BvcnRbZGlyXSkgewotCQkJCS8qIEdLLT5HVyAqLwotCQkJCURFQlVHUAotCQkJCSAgICAoImlwX25hdF9yYXM6IHNldCBzaWduYWwgYWRkcmVzcyAiCi0JCQkJICAgICAiJXUuJXUuJXUuJXU6JWh1LT4ldS4ldS4ldS4ldTolaHVcbiIsCi0JCQkJICAgICBOSVBRVUFEKGlwKSwgcG9ydCwKLQkJCQkgICAgIE5JUFFVQUQoY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5zcmMuCi0JCQkJCSAgICAgaXApLCBpbmZvLT5zaWdfcG9ydFshZGlyXSk7Ci0JCQkJcmV0dXJuIHNldF9oMjI1X2FkZHIocHNrYiwgZGF0YSwgMCwgJmFkZHJbaV0sCi0JCQkJCQkgICAgIGN0LT50dXBsZWhhc2hbIWRpcl0uCi0JCQkJCQkgICAgIHR1cGxlLnNyYy5pcCwKLQkJCQkJCSAgICAgaW5mby0+c2lnX3BvcnRbIWRpcl0pOwotCQkJfQotCQl9Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBzZXRfcmFzX2FkZHIoc3RydWN0IHNrX2J1ZmYgKipwc2tiLCBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKLQkJCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAotCQkJdW5zaWduZWQgY2hhciAqKmRhdGEsCi0JCQlUcmFuc3BvcnRBZGRyZXNzICogYWRkciwgaW50IGNvdW50KQotewotCWludCBkaXIgPSBDVElORk8yRElSKGN0aW5mbyk7Ci0JaW50IGk7Ci0JX19iZTMyIGlwOwotCXVfaW50MTZfdCBwb3J0OwotCi0JZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJaWYgKGdldF9oMjI1X2FkZHIoKmRhdGEsICZhZGRyW2ldLCAmaXAsICZwb3J0KSAmJgotCQkgICAgaXAgPT0gY3QtPnR1cGxlaGFzaFtkaXJdLnR1cGxlLnNyYy5pcCAmJgotCQkgICAgcG9ydCA9PSBudG9ocyhjdC0+dHVwbGVoYXNoW2Rpcl0udHVwbGUuc3JjLnUudWRwLnBvcnQpKSB7Ci0JCQlERUJVR1AoImlwX25hdF9yYXM6IHNldCByYXNBZGRyZXNzICIKLQkJCSAgICAgICAiJXUuJXUuJXUuJXU6JWh1LT4ldS4ldS4ldS4ldTolaHVcbiIsCi0JCQkgICAgICAgTklQUVVBRChpcCksIHBvcnQsCi0JCQkgICAgICAgTklQUVVBRChjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLmRzdC5pcCksCi0JCQkgICAgICAgbnRvaHMoY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5kc3QudS51ZHAuCi0JCQkJICAgICBwb3J0KSk7Ci0JCQlyZXR1cm4gc2V0X2gyMjVfYWRkcihwc2tiLCBkYXRhLCAwLCAmYWRkcltpXSwKLQkJCQkJICAgICBjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLmRzdC5pcCwKLQkJCQkJICAgICBudG9ocyhjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLgotCQkJCQkJICAgZHN0LnUudWRwLnBvcnQpKTsKLQkJfQotCX0KLQotCXJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgbmF0X3J0cF9ydGNwKHN0cnVjdCBza19idWZmICoqcHNrYiwgc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsCi0JCQllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKLQkJCXVuc2lnbmVkIGNoYXIgKipkYXRhLCBpbnQgZGF0YW9mZiwKLQkJCUgyNDVfVHJhbnNwb3J0QWRkcmVzcyAqIGFkZHIsCi0JCQl1X2ludDE2X3QgcG9ydCwgdV9pbnQxNl90IHJ0cF9wb3J0LAotCQkJc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKnJ0cF9leHAsCi0JCQlzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqcnRjcF9leHApCi17Ci0Jc3RydWN0IGlwX2N0X2gzMjNfbWFzdGVyICppbmZvID0gJmN0LT5oZWxwLmN0X2gzMjNfaW5mbzsKLQlpbnQgZGlyID0gQ1RJTkZPMkRJUihjdGluZm8pOwotCWludCBpOwotCXVfaW50MTZfdCBuYXRlZF9wb3J0OwotCi0JLyogU2V0IGV4cGVjdGF0aW9ucyBmb3IgTkFUICovCi0JcnRwX2V4cC0+c2F2ZWRfcHJvdG8udWRwLnBvcnQgPSBydHBfZXhwLT50dXBsZS5kc3QudS51ZHAucG9ydDsKLQlydHBfZXhwLT5leHBlY3RmbiA9IGlwX25hdF9mb2xsb3dfbWFzdGVyOwotCXJ0cF9leHAtPmRpciA9ICFkaXI7Ci0JcnRjcF9leHAtPnNhdmVkX3Byb3RvLnVkcC5wb3J0ID0gcnRjcF9leHAtPnR1cGxlLmRzdC51LnVkcC5wb3J0OwotCXJ0Y3BfZXhwLT5leHBlY3RmbiA9IGlwX25hdF9mb2xsb3dfbWFzdGVyOwotCXJ0Y3BfZXhwLT5kaXIgPSAhZGlyOwotCi0JLyogTG9va3VwIGV4aXN0aW5nIGV4cGVjdHMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgSDMyM19SVFBfQ0hBTk5FTF9NQVg7IGkrKykgewotCQlpZiAoaW5mby0+cnRwX3BvcnRbaV1bZGlyXSA9PSBydHBfcG9ydCkgewotCQkJLyogRXhwZWN0ZWQgKi8KLQotCQkJLyogVXNlIGFsbG9jYXRlZCBwb3J0cyBmaXJzdC4gVGhpcyB3aWxsIHJlZnJlc2gKLQkJCSAqIHRoZSBleHBlY3RzICovCi0JCQlydHBfZXhwLT50dXBsZS5kc3QudS51ZHAucG9ydCA9Ci0JCQkgICAgaHRvbnMoaW5mby0+cnRwX3BvcnRbaV1bZGlyXSk7Ci0JCQlydGNwX2V4cC0+dHVwbGUuZHN0LnUudWRwLnBvcnQgPQotCQkJICAgIGh0b25zKGluZm8tPnJ0cF9wb3J0W2ldW2Rpcl0gKyAxKTsKLQkJCWJyZWFrOwotCQl9IGVsc2UgaWYgKGluZm8tPnJ0cF9wb3J0W2ldW2Rpcl0gPT0gMCkgewotCQkJLyogTm90IGV4cGVjdGVkICovCi0JCQlicmVhazsKLQkJfQotCX0KLQotCS8qIFJ1biBvdXQgb2YgZXhwZWN0YXRpb25zICovCi0JaWYgKGkgPj0gSDMyM19SVFBfQ0hBTk5FTF9NQVgpIHsKLQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKLQkJCXByaW50aygiaXBfbmF0X2gzMjM6IG91dCBvZiBleHBlY3RhdGlvbnNcbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKiBUcnkgdG8gZ2V0IGEgcGFpciBvZiBwb3J0cy4gKi8KLQlmb3IgKG5hdGVkX3BvcnQgPSBudG9ocyhydHBfZXhwLT50dXBsZS5kc3QudS51ZHAucG9ydCk7Ci0JICAgICBuYXRlZF9wb3J0ICE9IDA7IG5hdGVkX3BvcnQgKz0gMikgewotCQlydHBfZXhwLT50dXBsZS5kc3QudS51ZHAucG9ydCA9IGh0b25zKG5hdGVkX3BvcnQpOwotCQlpZiAoaXBfY29ubnRyYWNrX2V4cGVjdF9yZWxhdGVkKHJ0cF9leHApID09IDApIHsKLQkJCXJ0Y3BfZXhwLT50dXBsZS5kc3QudS51ZHAucG9ydCA9Ci0JCQkgICAgaHRvbnMobmF0ZWRfcG9ydCArIDEpOwotCQkJaWYgKGlwX2Nvbm50cmFja19leHBlY3RfcmVsYXRlZChydGNwX2V4cCkgPT0gMCkKLQkJCQlicmVhazsKLQkJCWlwX2Nvbm50cmFja191bmV4cGVjdF9yZWxhdGVkKHJ0cF9leHApOwotCQl9Ci0JfQotCi0JaWYgKG5hdGVkX3BvcnQgPT0gMCkgewkvKiBObyBwb3J0IGF2YWlsYWJsZSAqLwotCQlpZiAobmV0X3JhdGVsaW1pdCgpKQotCQkJcHJpbnRrKCJpcF9uYXRfaDMyMzogb3V0IG9mIFJUUCBwb3J0c1xuIik7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qIE1vZGlmeSBzaWduYWwgKi8KLQlpZiAoc2V0X2gyNDVfYWRkcihwc2tiLCBkYXRhLCBkYXRhb2ZmLCBhZGRyLAotCQkJICBjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLmRzdC5pcCwKLQkJCSAgKHBvcnQgJiAxKSA/IG5hdGVkX3BvcnQgKyAxIDogbmF0ZWRfcG9ydCkgPT0gMCkgewotCQkvKiBTYXZlIHBvcnRzICovCi0JCWluZm8tPnJ0cF9wb3J0W2ldW2Rpcl0gPSBydHBfcG9ydDsKLQkJaW5mby0+cnRwX3BvcnRbaV1bIWRpcl0gPSBuYXRlZF9wb3J0OwotCX0gZWxzZSB7Ci0JCWlwX2Nvbm50cmFja191bmV4cGVjdF9yZWxhdGVkKHJ0cF9leHApOwotCQlpcF9jb25udHJhY2tfdW5leHBlY3RfcmVsYXRlZChydGNwX2V4cCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKiBTdWNjZXNzICovCi0JREVCVUdQKCJpcF9uYXRfaDMyMzogZXhwZWN0IFJUUCAldS4ldS4ldS4ldTolaHUtPiV1LiV1LiV1LiV1OiVodVxuIiwKLQkgICAgICAgTklQUVVBRChydHBfZXhwLT50dXBsZS5zcmMuaXApLAotCSAgICAgICBudG9ocyhydHBfZXhwLT50dXBsZS5zcmMudS51ZHAucG9ydCksCi0JICAgICAgIE5JUFFVQUQocnRwX2V4cC0+dHVwbGUuZHN0LmlwKSwKLQkgICAgICAgbnRvaHMocnRwX2V4cC0+dHVwbGUuZHN0LnUudWRwLnBvcnQpKTsKLQlERUJVR1AoImlwX25hdF9oMzIzOiBleHBlY3QgUlRDUCAldS4ldS4ldS4ldTolaHUtPiV1LiV1LiV1LiV1OiVodVxuIiwKLQkgICAgICAgTklQUVVBRChydGNwX2V4cC0+dHVwbGUuc3JjLmlwKSwKLQkgICAgICAgbnRvaHMocnRjcF9leHAtPnR1cGxlLnNyYy51LnVkcC5wb3J0KSwKLQkgICAgICAgTklQUVVBRChydGNwX2V4cC0+dHVwbGUuZHN0LmlwKSwKLQkgICAgICAgbnRvaHMocnRjcF9leHAtPnR1cGxlLmRzdC51LnVkcC5wb3J0KSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IG5hdF90MTIwKHN0cnVjdCBza19idWZmICoqcHNrYiwgc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsCi0JCSAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKLQkJICAgIHVuc2lnbmVkIGNoYXIgKipkYXRhLCBpbnQgZGF0YW9mZiwKLQkJICAgIEgyNDVfVHJhbnNwb3J0QWRkcmVzcyAqIGFkZHIsIHVfaW50MTZfdCBwb3J0LAotCQkgICAgc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmV4cCkKLXsKLQlpbnQgZGlyID0gQ1RJTkZPMkRJUihjdGluZm8pOwotCXVfaW50MTZfdCBuYXRlZF9wb3J0ID0gcG9ydDsKLQotCS8qIFNldCBleHBlY3RhdGlvbnMgZm9yIE5BVCAqLwotCWV4cC0+c2F2ZWRfcHJvdG8udGNwLnBvcnQgPSBleHAtPnR1cGxlLmRzdC51LnRjcC5wb3J0OwotCWV4cC0+ZXhwZWN0Zm4gPSBpcF9uYXRfZm9sbG93X21hc3RlcjsKLQlleHAtPmRpciA9ICFkaXI7Ci0KLQkvKiBUcnkgdG8gZ2V0IHNhbWUgcG9ydDogaWYgbm90LCB0cnkgdG8gY2hhbmdlIGl0LiAqLwotCWZvciAoOyBuYXRlZF9wb3J0ICE9IDA7IG5hdGVkX3BvcnQrKykgewotCQlleHAtPnR1cGxlLmRzdC51LnRjcC5wb3J0ID0gaHRvbnMobmF0ZWRfcG9ydCk7Ci0JCWlmIChpcF9jb25udHJhY2tfZXhwZWN0X3JlbGF0ZWQoZXhwKSA9PSAwKQotCQkJYnJlYWs7Ci0JfQotCi0JaWYgKG5hdGVkX3BvcnQgPT0gMCkgewkvKiBObyBwb3J0IGF2YWlsYWJsZSAqLwotCQlpZiAobmV0X3JhdGVsaW1pdCgpKQotCQkJcHJpbnRrKCJpcF9uYXRfaDMyMzogb3V0IG9mIFRDUCBwb3J0c1xuIik7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qIE1vZGlmeSBzaWduYWwgKi8KLQlpZiAoc2V0X2gyNDVfYWRkcihwc2tiLCBkYXRhLCBkYXRhb2ZmLCBhZGRyLAotCQkJICBjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLmRzdC5pcCwgbmF0ZWRfcG9ydCkgPCAwKSB7Ci0JCWlwX2Nvbm50cmFja191bmV4cGVjdF9yZWxhdGVkKGV4cCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlERUJVR1AoImlwX25hdF9oMzIzOiBleHBlY3QgVC4xMjAgJXUuJXUuJXUuJXU6JWh1LT4ldS4ldS4ldS4ldTolaHVcbiIsCi0JICAgICAgIE5JUFFVQUQoZXhwLT50dXBsZS5zcmMuaXApLCBudG9ocyhleHAtPnR1cGxlLnNyYy51LnRjcC5wb3J0KSwKLQkgICAgICAgTklQUVVBRChleHAtPnR1cGxlLmRzdC5pcCksIG50b2hzKGV4cC0+dHVwbGUuZHN0LnUudGNwLnBvcnQpKTsKLQotCXJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogVGhpcyBjb25udHJhY2sgZXhwZWN0IGZ1bmN0aW9uIHJlcGxhY2VzIGlwX2Nvbm50cmFja19oMjQ1X2V4cGVjdCgpCi0gKiB3aGljaCB3YXMgc2V0IGJ5IGlwX2Nvbm50cmFja19oZWxwZXJfaDMyMy5jLiBJdCBjYWxscyBib3RoCi0gKiBpcF9uYXRfZm9sbG93X21hc3RlcigpIGFuZCBpcF9jb25udHJhY2tfaDI0NV9leHBlY3QoKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBpcF9uYXRfaDI0NV9leHBlY3Qoc3RydWN0IGlwX2Nvbm50cmFjayAqbmV3LAotCQkJICAgICAgIHN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICp0aGlzKQotewotCWlwX25hdF9mb2xsb3dfbWFzdGVyKG5ldywgdGhpcyk7Ci0JaXBfY29ubnRyYWNrX2gyNDVfZXhwZWN0KG5ldywgdGhpcyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBuYXRfaDI0NShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIHN0cnVjdCBpcF9jb25udHJhY2sgKmN0LAotCQkgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCi0JCSAgICB1bnNpZ25lZCBjaGFyICoqZGF0YSwgaW50IGRhdGFvZmYsCi0JCSAgICBUcmFuc3BvcnRBZGRyZXNzICogYWRkciwgdV9pbnQxNl90IHBvcnQsCi0JCSAgICBzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqZXhwKQotewotCXN0cnVjdCBpcF9jdF9oMzIzX21hc3RlciAqaW5mbyA9ICZjdC0+aGVscC5jdF9oMzIzX2luZm87Ci0JaW50IGRpciA9IENUSU5GTzJESVIoY3RpbmZvKTsKLQl1X2ludDE2X3QgbmF0ZWRfcG9ydCA9IHBvcnQ7Ci0KLQkvKiBTZXQgZXhwZWN0YXRpb25zIGZvciBOQVQgKi8KLQlleHAtPnNhdmVkX3Byb3RvLnRjcC5wb3J0ID0gZXhwLT50dXBsZS5kc3QudS50Y3AucG9ydDsKLQlleHAtPmV4cGVjdGZuID0gaXBfbmF0X2gyNDVfZXhwZWN0OwotCWV4cC0+ZGlyID0gIWRpcjsKLQotCS8qIENoZWNrIGV4aXN0aW5nIGV4cGVjdHMgKi8KLQlpZiAoaW5mby0+c2lnX3BvcnRbZGlyXSA9PSBwb3J0KQotCQluYXRlZF9wb3J0ID0gaW5mby0+c2lnX3BvcnRbIWRpcl07Ci0KLQkvKiBUcnkgdG8gZ2V0IHNhbWUgcG9ydDogaWYgbm90LCB0cnkgdG8gY2hhbmdlIGl0LiAqLwotCWZvciAoOyBuYXRlZF9wb3J0ICE9IDA7IG5hdGVkX3BvcnQrKykgewotCQlleHAtPnR1cGxlLmRzdC51LnRjcC5wb3J0ID0gaHRvbnMobmF0ZWRfcG9ydCk7Ci0JCWlmIChpcF9jb25udHJhY2tfZXhwZWN0X3JlbGF0ZWQoZXhwKSA9PSAwKQotCQkJYnJlYWs7Ci0JfQotCi0JaWYgKG5hdGVkX3BvcnQgPT0gMCkgewkvKiBObyBwb3J0IGF2YWlsYWJsZSAqLwotCQlpZiAobmV0X3JhdGVsaW1pdCgpKQotCQkJcHJpbnRrKCJpcF9uYXRfcTkzMTogb3V0IG9mIFRDUCBwb3J0c1xuIik7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qIE1vZGlmeSBzaWduYWwgKi8KLQlpZiAoc2V0X2gyMjVfYWRkcihwc2tiLCBkYXRhLCBkYXRhb2ZmLCBhZGRyLAotCQkJICBjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLmRzdC5pcCwKLQkJCSAgbmF0ZWRfcG9ydCkgPT0gMCkgewotCQkvKiBTYXZlIHBvcnRzICovCi0JCWluZm8tPnNpZ19wb3J0W2Rpcl0gPSBwb3J0OwotCQlpbmZvLT5zaWdfcG9ydFshZGlyXSA9IG5hdGVkX3BvcnQ7Ci0JfSBlbHNlIHsKLQkJaXBfY29ubnRyYWNrX3VuZXhwZWN0X3JlbGF0ZWQoZXhwKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCURFQlVHUCgiaXBfbmF0X3E5MzE6IGV4cGVjdCBILjI0NSAldS4ldS4ldS4ldTolaHUtPiV1LiV1LiV1LiV1OiVodVxuIiwKLQkgICAgICAgTklQUVVBRChleHAtPnR1cGxlLnNyYy5pcCksIG50b2hzKGV4cC0+dHVwbGUuc3JjLnUudGNwLnBvcnQpLAotCSAgICAgICBOSVBRVUFEKGV4cC0+dHVwbGUuZHN0LmlwKSwgbnRvaHMoZXhwLT50dXBsZS5kc3QudS50Y3AucG9ydCkpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBUaGlzIGNvbm50cmFjayBleHBlY3QgZnVuY3Rpb24gcmVwbGFjZXMgaXBfY29ubnRyYWNrX3E5MzFfZXhwZWN0KCkKLSAqIHdoaWNoIHdhcyBzZXQgYnkgaXBfY29ubnRyYWNrX2hlbHBlcl9oMzIzLmMuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGlwX25hdF9xOTMxX2V4cGVjdChzdHJ1Y3QgaXBfY29ubnRyYWNrICpuZXcsCi0JCQkgICAgICAgc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKnRoaXMpCi17Ci0Jc3RydWN0IGlwX25hdF9yYW5nZSByYW5nZTsKLQotCWlmICh0aGlzLT50dXBsZS5zcmMuaXAgIT0gMCkgewkvKiBPbmx5IGFjY2VwdCBjYWxscyBmcm9tIEdLICovCi0JCWlwX25hdF9mb2xsb3dfbWFzdGVyKG5ldywgdGhpcyk7Ci0JCWdvdG8gb3V0OwotCX0KLQotCS8qIFRoaXMgbXVzdCBiZSBhIGZyZXNoIG9uZS4gKi8KLQlCVUdfT04obmV3LT5zdGF0dXMgJiBJUFNfTkFUX0RPTkVfTUFTSyk7Ci0KLQkvKiBDaGFuZ2Ugc3JjIHRvIHdoZXJlIG1hc3RlciBzZW5kcyB0byAqLwotCXJhbmdlLmZsYWdzID0gSVBfTkFUX1JBTkdFX01BUF9JUFM7Ci0JcmFuZ2UubWluX2lwID0gcmFuZ2UubWF4X2lwID0gbmV3LT50dXBsZWhhc2hbIXRoaXMtPmRpcl0udHVwbGUuc3JjLmlwOwotCi0JLyogaG9vayBkb2Vzbid0IG1hdHRlciwgYnV0IGl0IGhhcyB0byBkbyBzb3VyY2UgbWFuaXAgKi8KLQlpcF9uYXRfc2V0dXBfaW5mbyhuZXcsICZyYW5nZSwgTkZfSVBfUE9TVF9ST1VUSU5HKTsKLQotCS8qIEZvciBEU1QgbWFuaXAsIG1hcCBwb3J0IGhlcmUgdG8gd2hlcmUgaXQncyBleHBlY3RlZC4gKi8KLQlyYW5nZS5mbGFncyA9IChJUF9OQVRfUkFOR0VfTUFQX0lQUyB8IElQX05BVF9SQU5HRV9QUk9UT19TUEVDSUZJRUQpOwotCXJhbmdlLm1pbiA9IHJhbmdlLm1heCA9IHRoaXMtPnNhdmVkX3Byb3RvOwotCXJhbmdlLm1pbl9pcCA9IHJhbmdlLm1heF9pcCA9Ci0JICAgIG5ldy0+bWFzdGVyLT50dXBsZWhhc2hbIXRoaXMtPmRpcl0udHVwbGUuc3JjLmlwOwotCi0JLyogaG9vayBkb2Vzbid0IG1hdHRlciwgYnV0IGl0IGhhcyB0byBkbyBkZXN0aW5hdGlvbiBtYW5pcCAqLwotCWlwX25hdF9zZXR1cF9pbmZvKG5ldywgJnJhbmdlLCBORl9JUF9QUkVfUk9VVElORyk7Ci0KLSAgICAgIG91dDoKLQlpcF9jb25udHJhY2tfcTkzMV9leHBlY3QobmV3LCB0aGlzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IG5hdF9xOTMxKHN0cnVjdCBza19idWZmICoqcHNrYiwgc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsCi0JCSAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKLQkJICAgIHVuc2lnbmVkIGNoYXIgKipkYXRhLCBUcmFuc3BvcnRBZGRyZXNzICogYWRkciwgaW50IGlkeCwKLQkJICAgIHVfaW50MTZfdCBwb3J0LCBzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqZXhwKQotewotCXN0cnVjdCBpcF9jdF9oMzIzX21hc3RlciAqaW5mbyA9ICZjdC0+aGVscC5jdF9oMzIzX2luZm87Ci0JaW50IGRpciA9IENUSU5GTzJESVIoY3RpbmZvKTsKLQl1X2ludDE2X3QgbmF0ZWRfcG9ydCA9IHBvcnQ7Ci0JX19iZTMyIGlwOwotCi0JLyogU2V0IGV4cGVjdGF0aW9ucyBmb3IgTkFUICovCi0JZXhwLT5zYXZlZF9wcm90by50Y3AucG9ydCA9IGV4cC0+dHVwbGUuZHN0LnUudGNwLnBvcnQ7Ci0JZXhwLT5leHBlY3RmbiA9IGlwX25hdF9xOTMxX2V4cGVjdDsKLQlleHAtPmRpciA9ICFkaXI7Ci0KLQkvKiBDaGVjayBleGlzdGluZyBleHBlY3RzICovCi0JaWYgKGluZm8tPnNpZ19wb3J0W2Rpcl0gPT0gcG9ydCkKLQkJbmF0ZWRfcG9ydCA9IGluZm8tPnNpZ19wb3J0WyFkaXJdOwotCi0JLyogVHJ5IHRvIGdldCBzYW1lIHBvcnQ6IGlmIG5vdCwgdHJ5IHRvIGNoYW5nZSBpdC4gKi8KLQlmb3IgKDsgbmF0ZWRfcG9ydCAhPSAwOyBuYXRlZF9wb3J0KyspIHsKLQkJZXhwLT50dXBsZS5kc3QudS50Y3AucG9ydCA9IGh0b25zKG5hdGVkX3BvcnQpOwotCQlpZiAoaXBfY29ubnRyYWNrX2V4cGVjdF9yZWxhdGVkKGV4cCkgPT0gMCkKLQkJCWJyZWFrOwotCX0KLQotCWlmIChuYXRlZF9wb3J0ID09IDApIHsJLyogTm8gcG9ydCBhdmFpbGFibGUgKi8KLQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKLQkJCXByaW50aygiaXBfbmF0X3Jhczogb3V0IG9mIFRDUCBwb3J0c1xuIik7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qIE1vZGlmeSBzaWduYWwgKi8KLQlpZiAoc2V0X2gyMjVfYWRkcihwc2tiLCBkYXRhLCAwLCAmYWRkcltpZHhdLAotCQkJICBjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLmRzdC5pcCwKLQkJCSAgbmF0ZWRfcG9ydCkgPT0gMCkgewotCQkvKiBTYXZlIHBvcnRzICovCi0JCWluZm8tPnNpZ19wb3J0W2Rpcl0gPSBwb3J0OwotCQlpbmZvLT5zaWdfcG9ydFshZGlyXSA9IG5hdGVkX3BvcnQ7Ci0KLQkJLyogRml4IGZvciBHbm9tZW1lZXRpbmcgKi8KLQkJaWYgKGlkeCA+IDAgJiYKLQkJICAgIGdldF9oMjI1X2FkZHIoKmRhdGEsICZhZGRyWzBdLCAmaXAsICZwb3J0KSAmJgotCQkgICAgKG50b2hsKGlwKSAmIDB4ZmYwMDAwMDApID09IDB4N2YwMDAwMDApIHsKLQkJCXNldF9oMjI1X2FkZHJfaG9vayhwc2tiLCBkYXRhLCAwLCAmYWRkclswXSwKLQkJCQkJICAgY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5kc3QuaXAsCi0JCQkJCSAgIGluZm8tPnNpZ19wb3J0WyFkaXJdKTsKLQkJfQotCX0gZWxzZSB7Ci0JCWlwX2Nvbm50cmFja191bmV4cGVjdF9yZWxhdGVkKGV4cCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKiBTdWNjZXNzICovCi0JREVCVUdQKCJpcF9uYXRfcmFzOiBleHBlY3QgUS45MzEgJXUuJXUuJXUuJXU6JWh1LT4ldS4ldS4ldS4ldTolaHVcbiIsCi0JICAgICAgIE5JUFFVQUQoZXhwLT50dXBsZS5zcmMuaXApLCBudG9ocyhleHAtPnR1cGxlLnNyYy51LnRjcC5wb3J0KSwKLQkgICAgICAgTklQUVVBRChleHAtPnR1cGxlLmRzdC5pcCksIG50b2hzKGV4cC0+dHVwbGUuZHN0LnUudGNwLnBvcnQpKTsKLQotCXJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGlwX25hdF9jYWxsZm9yd2FyZGluZ19leHBlY3Qoc3RydWN0IGlwX2Nvbm50cmFjayAqbmV3LAotCQkJCQkgc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKnRoaXMpCi17Ci0Jc3RydWN0IGlwX25hdF9yYW5nZSByYW5nZTsKLQotCS8qIFRoaXMgbXVzdCBiZSBhIGZyZXNoIG9uZS4gKi8KLQlCVUdfT04obmV3LT5zdGF0dXMgJiBJUFNfTkFUX0RPTkVfTUFTSyk7Ci0KLQkvKiBDaGFuZ2Ugc3JjIHRvIHdoZXJlIG1hc3RlciBzZW5kcyB0byAqLwotCXJhbmdlLmZsYWdzID0gSVBfTkFUX1JBTkdFX01BUF9JUFM7Ci0JcmFuZ2UubWluX2lwID0gcmFuZ2UubWF4X2lwID0gbmV3LT50dXBsZWhhc2hbIXRoaXMtPmRpcl0udHVwbGUuc3JjLmlwOwotCi0JLyogaG9vayBkb2Vzbid0IG1hdHRlciwgYnV0IGl0IGhhcyB0byBkbyBzb3VyY2UgbWFuaXAgKi8KLQlpcF9uYXRfc2V0dXBfaW5mbyhuZXcsICZyYW5nZSwgTkZfSVBfUE9TVF9ST1VUSU5HKTsKLQotCS8qIEZvciBEU1QgbWFuaXAsIG1hcCBwb3J0IGhlcmUgdG8gd2hlcmUgaXQncyBleHBlY3RlZC4gKi8KLQlyYW5nZS5mbGFncyA9IChJUF9OQVRfUkFOR0VfTUFQX0lQUyB8IElQX05BVF9SQU5HRV9QUk9UT19TUEVDSUZJRUQpOwotCXJhbmdlLm1pbiA9IHJhbmdlLm1heCA9IHRoaXMtPnNhdmVkX3Byb3RvOwotCXJhbmdlLm1pbl9pcCA9IHJhbmdlLm1heF9pcCA9IHRoaXMtPnNhdmVkX2lwOwotCi0JLyogaG9vayBkb2Vzbid0IG1hdHRlciwgYnV0IGl0IGhhcyB0byBkbyBkZXN0aW5hdGlvbiBtYW5pcCAqLwotCWlwX25hdF9zZXR1cF9pbmZvKG5ldywgJnJhbmdlLCBORl9JUF9QUkVfUk9VVElORyk7Ci0KLQlpcF9jb25udHJhY2tfcTkzMV9leHBlY3QobmV3LCB0aGlzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IG5hdF9jYWxsZm9yd2FyZGluZyhzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIHN0cnVjdCBpcF9jb25udHJhY2sgKmN0LAotCQkJICAgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCi0JCQkgICAgICB1bnNpZ25lZCBjaGFyICoqZGF0YSwgaW50IGRhdGFvZmYsCi0JCQkgICAgICBUcmFuc3BvcnRBZGRyZXNzICogYWRkciwgdV9pbnQxNl90IHBvcnQsCi0JCQkgICAgICBzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqZXhwKQotewotCWludCBkaXIgPSBDVElORk8yRElSKGN0aW5mbyk7Ci0JdV9pbnQxNl90IG5hdGVkX3BvcnQ7Ci0KLQkvKiBTZXQgZXhwZWN0YXRpb25zIGZvciBOQVQgKi8KLQlleHAtPnNhdmVkX2lwID0gZXhwLT50dXBsZS5kc3QuaXA7Ci0JZXhwLT50dXBsZS5kc3QuaXAgPSBjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLmRzdC5pcDsKLQlleHAtPnNhdmVkX3Byb3RvLnRjcC5wb3J0ID0gZXhwLT50dXBsZS5kc3QudS50Y3AucG9ydDsKLQlleHAtPmV4cGVjdGZuID0gaXBfbmF0X2NhbGxmb3J3YXJkaW5nX2V4cGVjdDsKLQlleHAtPmRpciA9ICFkaXI7Ci0KLQkvKiBUcnkgdG8gZ2V0IHNhbWUgcG9ydDogaWYgbm90LCB0cnkgdG8gY2hhbmdlIGl0LiAqLwotCWZvciAobmF0ZWRfcG9ydCA9IHBvcnQ7IG5hdGVkX3BvcnQgIT0gMDsgbmF0ZWRfcG9ydCsrKSB7Ci0JCWV4cC0+dHVwbGUuZHN0LnUudGNwLnBvcnQgPSBodG9ucyhuYXRlZF9wb3J0KTsKLQkJaWYgKGlwX2Nvbm50cmFja19leHBlY3RfcmVsYXRlZChleHApID09IDApCi0JCQlicmVhazsKLQl9Ci0KLQlpZiAobmF0ZWRfcG9ydCA9PSAwKSB7CS8qIE5vIHBvcnQgYXZhaWxhYmxlICovCi0JCWlmIChuZXRfcmF0ZWxpbWl0KCkpCi0JCQlwcmludGsoImlwX25hdF9xOTMxOiBvdXQgb2YgVENQIHBvcnRzXG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyogTW9kaWZ5IHNpZ25hbCAqLwotCWlmICghc2V0X2gyMjVfYWRkcihwc2tiLCBkYXRhLCBkYXRhb2ZmLCBhZGRyLAotCQkJICAgY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5kc3QuaXAsCi0JCQkgICBuYXRlZF9wb3J0KSA9PSAwKSB7Ci0JCWlwX2Nvbm50cmFja191bmV4cGVjdF9yZWxhdGVkKGV4cCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKiBTdWNjZXNzICovCi0JREVCVUdQKCJpcF9uYXRfcTkzMTogZXhwZWN0IENhbGwgRm9yd2FyZGluZyAiCi0JICAgICAgICIldS4ldS4ldS4ldTolaHUtPiV1LiV1LiV1LiV1OiVodVxuIiwKLQkgICAgICAgTklQUVVBRChleHAtPnR1cGxlLnNyYy5pcCksIG50b2hzKGV4cC0+dHVwbGUuc3JjLnUudGNwLnBvcnQpLAotCSAgICAgICBOSVBRVUFEKGV4cC0+dHVwbGUuZHN0LmlwKSwgbnRvaHMoZXhwLT50dXBsZS5kc3QudS50Y3AucG9ydCkpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQotewotCUJVR19PTihyY3VfZGVyZWZlcmVuY2Uoc2V0X2gyNDVfYWRkcl9ob29rKSAhPSBOVUxMKTsKLQlCVUdfT04ocmN1X2RlcmVmZXJlbmNlKHNldF9oMjI1X2FkZHJfaG9vaykgIT0gTlVMTCk7Ci0JQlVHX09OKHJjdV9kZXJlZmVyZW5jZShzZXRfc2lnX2FkZHJfaG9vaykgIT0gTlVMTCk7Ci0JQlVHX09OKHJjdV9kZXJlZmVyZW5jZShzZXRfcmFzX2FkZHJfaG9vaykgIT0gTlVMTCk7Ci0JQlVHX09OKHJjdV9kZXJlZmVyZW5jZShuYXRfcnRwX3J0Y3BfaG9vaykgIT0gTlVMTCk7Ci0JQlVHX09OKHJjdV9kZXJlZmVyZW5jZShuYXRfdDEyMF9ob29rKSAhPSBOVUxMKTsKLQlCVUdfT04ocmN1X2RlcmVmZXJlbmNlKG5hdF9oMjQ1X2hvb2spICE9IE5VTEwpOwotCUJVR19PTihyY3VfZGVyZWZlcmVuY2UobmF0X2NhbGxmb3J3YXJkaW5nX2hvb2spICE9IE5VTEwpOwotCUJVR19PTihyY3VfZGVyZWZlcmVuY2UobmF0X3E5MzFfaG9vaykgIT0gTlVMTCk7Ci0KLQlyY3VfYXNzaWduX3BvaW50ZXIoc2V0X2gyNDVfYWRkcl9ob29rLCBzZXRfaDI0NV9hZGRyKTsKLQlyY3VfYXNzaWduX3BvaW50ZXIoc2V0X2gyMjVfYWRkcl9ob29rLCBzZXRfaDIyNV9hZGRyKTsKLQlyY3VfYXNzaWduX3BvaW50ZXIoc2V0X3NpZ19hZGRyX2hvb2ssIHNldF9zaWdfYWRkcik7Ci0JcmN1X2Fzc2lnbl9wb2ludGVyKHNldF9yYXNfYWRkcl9ob29rLCBzZXRfcmFzX2FkZHIpOwotCXJjdV9hc3NpZ25fcG9pbnRlcihuYXRfcnRwX3J0Y3BfaG9vaywgbmF0X3J0cF9ydGNwKTsKLQlyY3VfYXNzaWduX3BvaW50ZXIobmF0X3QxMjBfaG9vaywgbmF0X3QxMjApOwotCXJjdV9hc3NpZ25fcG9pbnRlcihuYXRfaDI0NV9ob29rLCBuYXRfaDI0NSk7Ci0JcmN1X2Fzc2lnbl9wb2ludGVyKG5hdF9jYWxsZm9yd2FyZGluZ19ob29rLCBuYXRfY2FsbGZvcndhcmRpbmcpOwotCXJjdV9hc3NpZ25fcG9pbnRlcihuYXRfcTkzMV9ob29rLCBuYXRfcTkzMSk7Ci0KLQlERUJVR1AoImlwX25hdF9oMzIzOiBpbml0IHN1Y2Nlc3NcbiIpOwotCXJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCi17Ci0JcmN1X2Fzc2lnbl9wb2ludGVyKHNldF9oMjQ1X2FkZHJfaG9vaywgTlVMTCk7Ci0JcmN1X2Fzc2lnbl9wb2ludGVyKHNldF9oMjI1X2FkZHJfaG9vaywgTlVMTCk7Ci0JcmN1X2Fzc2lnbl9wb2ludGVyKHNldF9zaWdfYWRkcl9ob29rLCBOVUxMKTsKLQlyY3VfYXNzaWduX3BvaW50ZXIoc2V0X3Jhc19hZGRyX2hvb2ssIE5VTEwpOwotCXJjdV9hc3NpZ25fcG9pbnRlcihuYXRfcnRwX3J0Y3BfaG9vaywgTlVMTCk7Ci0JcmN1X2Fzc2lnbl9wb2ludGVyKG5hdF90MTIwX2hvb2ssIE5VTEwpOwotCXJjdV9hc3NpZ25fcG9pbnRlcihuYXRfaDI0NV9ob29rLCBOVUxMKTsKLQlyY3VfYXNzaWduX3BvaW50ZXIobmF0X2NhbGxmb3J3YXJkaW5nX2hvb2ssIE5VTEwpOwotCXJjdV9hc3NpZ25fcG9pbnRlcihuYXRfcTkzMV9ob29rLCBOVUxMKTsKLQlzeW5jaHJvbml6ZV9yY3UoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1tb2R1bGVfaW5pdChpbml0KTsKLW1vZHVsZV9leGl0KGZpbmkpOwotCi1NT0RVTEVfQVVUSE9SKCJKaW5nIE1pbiBaaGFvIDx6aGFvamluZ21pbkB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkguMzIzIE5BVCBoZWxwZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfaGVscGVyX3BwdHAuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfaGVscGVyX3BwdHAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRjZTRhNS4uMDAwMDAwMAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X2hlbHBlcl9wcHRwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNTAgKzAsMCBAQAotLyoKLSAqIGlwX25hdF9wcHRwLmMJLSBWZXJzaW9uIDMuMAotICoKLSAqIE5BVCBzdXBwb3J0IGZvciBQUFRQIChQb2ludCB0byBQb2ludCBUdW5uZWxpbmcgUHJvdG9jb2wpLgotICogUFBUUCBpcyBhIGEgcHJvdG9jb2wgZm9yIGNyZWF0aW5nIHZpcnR1YWwgcHJpdmF0ZSBuZXR3b3Jrcy4KLSAqIEl0IGlzIGEgc3BlY2lmaWNhdGlvbiBkZWZpbmVkIGJ5IE1pY3Jvc29mdCBhbmQgc29tZSB2ZW5kb3JzCi0gKiB3b3JraW5nIHdpdGggTWljcm9zb2Z0LiAgUFBUUCBpcyBidWlsdCBvbiB0b3Agb2YgYSBtb2RpZmllZAotICogdmVyc2lvbiBvZiB0aGUgSW50ZXJuZXQgR2VuZXJpYyBSb3V0aW5nIEVuY2Fwc3VsYXRpb24gUHJvdG9jb2wuCi0gKiBHUkUgaXMgZGVmaW5lZCBpbiBSRkMgMTcwMSBhbmQgUkZDIDE3MDIuICBEb2N1bWVudGF0aW9uIG9mCi0gKiBQUFRQIGNhbiBiZSBmb3VuZCBpbiBSRkMgMjYzNwotICoKLSAqIChDKSAyMDAwLTIwMDUgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KLSAqCi0gKiBEZXZlbG9wbWVudCBvZiB0aGlzIGNvZGUgZnVuZGVkIGJ5IEFzdGFybyBBRyAoaHR0cDovL3d3dy5hc3Rhcm8uY29tLykKLSAqCi0gKiBUT0RPOiAtIE5BVCB0byBhIHVuaXF1ZSB0dXBsZSwgbm90IHRvIFRDUCBzb3VyY2UgcG9ydAotICogCSAgIChuZWVkcyBuZXRmaWx0ZXIgdHVwbGUgcmVzZXJ2YXRpb24pCi0gKgotICogQ2hhbmdlczoKLSAqICAgICAyMDAyLTAyLTEwIC0gVmVyc2lvbiAxLjMKLSAqICAgICAgIC0gVXNlIGlwX25hdF9tYW5nbGVfdGNwX3BhY2tldCgpIGJlY2F1c2Ugb2YgY2xvbmVkIHNrYidzCi0gKgkgICBpbiBsb2NhbCBjb25uZWN0aW9ucyAoUGhpbGlwIENyYWlnIDxwaGlsaXBjQHNuYXBnZWFyLmNvbT4pCi0gKiAgICAgICAtIGFkZCBjaGVja3MgZm9yIG1hZ2ljQ29va2llIGFuZCBwcHRwIHZlcnNpb24KLSAqICAgICAgIC0gbWFrZSBhcmd1bWVudCBsaXN0IG9mIHBwdHBfe291dCxpbn1ib3VuZF9wYWNrZXQoKSBzaG9ydGVyCi0gKiAgICAgICAtIG1vdmUgdG8gQzk5IHN0eWxlIGluaXRpYWxpemVycwotICogICAgICAgLSBwcmludCB2ZXJzaW9uIG51bWJlciBhdCBtb2R1bGUgbG9hZHRpbWUKLSAqICAgICAyMDAzLTA5LTIyIC0gVmVyc2lvbiAxLjUKLSAqICAgICAgIC0gdXNlIFNOQVRlZCB0Y3Agc291cmNlcG9ydCBhcyBjYWxsaWQsIHNpbmNlIHdlIGdldCBjYWxsZWQgYmVmb3JlCi0gKgkgICBUQ1AgaGVhZGVyIGlzIG1hbmdsZWQgKFBoaWxpcCBDcmFpZyA8cGhpbGlwY0BzbmFwZ2Vhci5jb20+KQotICogICAgIDIwMDQtMTAtMjIgLSBWZXJzaW9uIDIuMAotICogICAgICAgLSBrZXJuZWwgMi42LnggdmVyc2lvbgotICogICAgIDIwMDUtMDYtMTAgLSBWZXJzaW9uIDMuMAotICogICAgICAgLSBrZXJuZWwgPj0gMi42LjExIHZlcnNpb24sCi0gKgkgICBmdW5kZWQgYnkgT3hjb2RhIE5ldEJveCBCbHVlIChodHRwOi8vd3d3Lm5ldGJveGJsdWUuY29tLykKLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2lwLmg+Ci0jaW5jbHVkZSA8bGludXgvdGNwLmg+Ci0jaW5jbHVkZSA8bmV0L3RjcC5oPgotCi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0X3J1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9uYXRfaGVscGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0X3BwdHAuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfY29yZS5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19oZWxwZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfcHJvdG9fZ3JlLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX3BwdHAuaD4KLQotI2RlZmluZSBJUF9OQVRfUFBUUF9WRVJTSU9OICIzLjAiCi0KLSNkZWZpbmUgUkVRX0NJRChyZXEsIG9mZikJCSgqKF9fYmUxNiAqKSgoY2hhciAqKShyZXEpICsgKG9mZikpKQotCi1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfQVVUSE9SKCJIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJOZXRmaWx0ZXIgTkFUIGhlbHBlciBtb2R1bGUgZm9yIFBQVFAiKTsKLQotCi0jaWYgMAotZXh0ZXJuIGNvbnN0IGNoYXIgKnBwdHBfbXNnX25hbWVbXTsKLSNkZWZpbmUgREVCVUdQKGZvcm1hdCwgYXJncy4uLikgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiVzOiAiIGZvcm1hdCwgX19GSUxFX18sIFwKLQkJCQkgICAgICAgX19GVU5DVElPTl9fLCAjIyBhcmdzKQotI2Vsc2UKLSNkZWZpbmUgREVCVUdQKGZvcm1hdCwgYXJncy4uLikKLSNlbmRpZgotCi1zdGF0aWMgdm9pZCBwcHRwX25hdF9leHBlY3RlZChzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKLQkJCSAgICAgIHN0cnVjdCBpcF9jb25udHJhY2tfZXhwZWN0ICpleHApCi17Ci0Jc3RydWN0IGlwX2Nvbm50cmFjayAqbWFzdGVyID0gY3QtPm1hc3RlcjsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqb3RoZXJfZXhwOwotCXN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgdDsKLQlzdHJ1Y3QgaXBfY3RfcHB0cF9tYXN0ZXIgKmN0X3BwdHBfaW5mbzsKLQlzdHJ1Y3QgaXBfbmF0X3BwdHAgKm5hdF9wcHRwX2luZm87Ci0Jc3RydWN0IGlwX25hdF9yYW5nZSByYW5nZTsKLQotCWN0X3BwdHBfaW5mbyA9ICZtYXN0ZXItPmhlbHAuY3RfcHB0cF9pbmZvOwotCW5hdF9wcHRwX2luZm8gPSAmbWFzdGVyLT5uYXQuaGVscC5uYXRfcHB0cF9pbmZvOwotCi0JLyogQW5kIGhlcmUgZ29lcyB0aGUgZ3JhbmQgZmluYWxlIG9mIGNvcnJvc2lvbi4uLiAqLwotCi0JaWYgKGV4cC0+ZGlyID09IElQX0NUX0RJUl9PUklHSU5BTCkgewotCQlERUJVR1AoIndlIGFyZSBQTlMtPlBBQ1xuIik7Ci0JCS8qIHRoZXJlZm9yZSwgYnVpbGQgdHVwbGUgZm9yIFBBQy0+UE5TICovCi0JCXQuc3JjLmlwID0gbWFzdGVyLT50dXBsZWhhc2hbSVBfQ1RfRElSX1JFUExZXS50dXBsZS5zcmMuaXA7Ci0JCXQuc3JjLnUuZ3JlLmtleSA9IG1hc3Rlci0+aGVscC5jdF9wcHRwX2luZm8ucGFjX2NhbGxfaWQ7Ci0JCXQuZHN0LmlwID0gbWFzdGVyLT50dXBsZWhhc2hbSVBfQ1RfRElSX1JFUExZXS50dXBsZS5kc3QuaXA7Ci0JCXQuZHN0LnUuZ3JlLmtleSA9IG1hc3Rlci0+aGVscC5jdF9wcHRwX2luZm8ucG5zX2NhbGxfaWQ7Ci0JCXQuZHN0LnByb3RvbnVtID0gSVBQUk9UT19HUkU7Ci0JfSBlbHNlIHsKLQkJREVCVUdQKCJ3ZSBhcmUgUEFDLT5QTlNcbiIpOwotCQkvKiBidWlsZCB0dXBsZSBmb3IgUE5TLT5QQUMgKi8KLQkJdC5zcmMuaXAgPSBtYXN0ZXItPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLnNyYy5pcDsKLQkJdC5zcmMudS5ncmUua2V5ID0gbWFzdGVyLT5uYXQuaGVscC5uYXRfcHB0cF9pbmZvLnBuc19jYWxsX2lkOwotCQl0LmRzdC5pcCA9IG1hc3Rlci0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUuZHN0LmlwOwotCQl0LmRzdC51LmdyZS5rZXkgPSBtYXN0ZXItPm5hdC5oZWxwLm5hdF9wcHRwX2luZm8ucGFjX2NhbGxfaWQ7Ci0JCXQuZHN0LnByb3RvbnVtID0gSVBQUk9UT19HUkU7Ci0JfQotCi0JREVCVUdQKCJ0cnlpbmcgdG8gdW5leHBlY3Qgb3RoZXIgZGlyOiAiKTsKLQlEVU1QX1RVUExFKCZ0KTsKLQlvdGhlcl9leHAgPSBpcF9jb25udHJhY2tfZXhwZWN0X2ZpbmRfZ2V0KCZ0KTsKLQlpZiAob3RoZXJfZXhwKSB7Ci0JCWlwX2Nvbm50cmFja191bmV4cGVjdF9yZWxhdGVkKG90aGVyX2V4cCk7Ci0JCWlwX2Nvbm50cmFja19leHBlY3RfcHV0KG90aGVyX2V4cCk7Ci0JCURFQlVHUCgic3VjY2Vzc1xuIik7Ci0JfSBlbHNlIHsKLQkJREVCVUdQKCJub3QgZm91bmQhXG4iKTsKLQl9Ci0KLQkvKiBUaGlzIG11c3QgYmUgYSBmcmVzaCBvbmUuICovCi0JQlVHX09OKGN0LT5zdGF0dXMgJiBJUFNfTkFUX0RPTkVfTUFTSyk7Ci0KLQkvKiBDaGFuZ2Ugc3JjIHRvIHdoZXJlIG1hc3RlciBzZW5kcyB0byAqLwotCXJhbmdlLmZsYWdzID0gSVBfTkFUX1JBTkdFX01BUF9JUFM7Ci0JcmFuZ2UubWluX2lwID0gcmFuZ2UubWF4X2lwCi0JCT0gY3QtPm1hc3Rlci0+dHVwbGVoYXNoWyFleHAtPmRpcl0udHVwbGUuZHN0LmlwOwotCWlmIChleHAtPmRpciA9PSBJUF9DVF9ESVJfT1JJR0lOQUwpIHsKLQkJcmFuZ2UuZmxhZ3MgfD0gSVBfTkFUX1JBTkdFX1BST1RPX1NQRUNJRklFRDsKLQkJcmFuZ2UubWluID0gcmFuZ2UubWF4ID0gZXhwLT5zYXZlZF9wcm90bzsKLQl9Ci0JLyogaG9vayBkb2Vzbid0IG1hdHRlciwgYnV0IGl0IGhhcyB0byBkbyBzb3VyY2UgbWFuaXAgKi8KLQlpcF9uYXRfc2V0dXBfaW5mbyhjdCwgJnJhbmdlLCBORl9JUF9QT1NUX1JPVVRJTkcpOwotCi0JLyogRm9yIERTVCBtYW5pcCwgbWFwIHBvcnQgaGVyZSB0byB3aGVyZSBpdCdzIGV4cGVjdGVkLiAqLwotCXJhbmdlLmZsYWdzID0gSVBfTkFUX1JBTkdFX01BUF9JUFM7Ci0JcmFuZ2UubWluX2lwID0gcmFuZ2UubWF4X2lwCi0JCT0gY3QtPm1hc3Rlci0+dHVwbGVoYXNoWyFleHAtPmRpcl0udHVwbGUuc3JjLmlwOwotCWlmIChleHAtPmRpciA9PSBJUF9DVF9ESVJfUkVQTFkpIHsKLQkJcmFuZ2UuZmxhZ3MgfD0gSVBfTkFUX1JBTkdFX1BST1RPX1NQRUNJRklFRDsKLQkJcmFuZ2UubWluID0gcmFuZ2UubWF4ID0gZXhwLT5zYXZlZF9wcm90bzsKLQl9Ci0JLyogaG9vayBkb2Vzbid0IG1hdHRlciwgYnV0IGl0IGhhcyB0byBkbyBkZXN0aW5hdGlvbiBtYW5pcCAqLwotCWlwX25hdF9zZXR1cF9pbmZvKGN0LCAmcmFuZ2UsIE5GX0lQX1BSRV9ST1VUSU5HKTsKLX0KLQotLyogb3V0Ym91bmQgcGFja2V0cyA9PSBmcm9tIFBOUyB0byBQQUMgKi8KLXN0YXRpYyBpbnQKLXBwdHBfb3V0Ym91bmRfcGt0KHN0cnVjdCBza19idWZmICoqcHNrYiwKLQkJICBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKLQkJICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKLQkJICBzdHJ1Y3QgUHB0cENvbnRyb2xIZWFkZXIgKmN0bGgsCi0JCSAgdW5pb24gcHB0cF9jdHJsX3VuaW9uICpwcHRwUmVxKQotCi17Ci0Jc3RydWN0IGlwX2N0X3BwdHBfbWFzdGVyICpjdF9wcHRwX2luZm8gPSAmY3QtPmhlbHAuY3RfcHB0cF9pbmZvOwotCXN0cnVjdCBpcF9uYXRfcHB0cCAqbmF0X3BwdHBfaW5mbyA9ICZjdC0+bmF0LmhlbHAubmF0X3BwdHBfaW5mbzsKLQl1X2ludDE2X3QgbXNnOwotCV9fYmUxNiBuZXdfY2FsbGlkOwotCXVuc2lnbmVkIGludCBjaWRfb2ZmOwotCi0JbmV3X2NhbGxpZCA9IGN0X3BwdHBfaW5mby0+cG5zX2NhbGxfaWQ7Ci0KLQlzd2l0Y2ggKG1zZyA9IG50b2hzKGN0bGgtPm1lc3NhZ2VUeXBlKSkgewotCWNhc2UgUFBUUF9PVVRfQ0FMTF9SRVFVRVNUOgotCQljaWRfb2ZmID0gb2Zmc2V0b2YodW5pb24gcHB0cF9jdHJsX3VuaW9uLCBvY3JlcS5jYWxsSUQpOwotCQkvKiBGSVhNRTogaWRlYWxseSB3ZSB3b3VsZCB3YW50IHRvIHJlc2VydmUgYSBjYWxsIElECi0JCSAqIGhlcmUuICBjdXJyZW50IG5ldGZpbHRlciBOQVQgY29yZSBpcyBub3QgYWJsZSB0byBkbwotCQkgKiB0aGlzIDooIEZvciBub3cgd2UgdXNlIFRDUCBzb3VyY2UgcG9ydC4gVGhpcyBicmVha3MKLQkJICogbXVsdGlwbGUgY2FsbHMgd2l0aGluIG9uZSBjb250cm9sIHNlc3Npb24gKi8KLQotCQkvKiBzYXZlIG9yaWdpbmFsIGNhbGwgSUQgaW4gbmF0X2luZm8gKi8KLQkJbmF0X3BwdHBfaW5mby0+cG5zX2NhbGxfaWQgPSBjdF9wcHRwX2luZm8tPnBuc19jYWxsX2lkOwotCi0JCS8qIGRvbid0IHVzZSB0Y3BoLT5zb3VyY2Ugc2luY2Ugd2UgYXJlIGF0IGEgRFNUbWFuaXAKLQkJICogaG9vayAoZS5nLiBQUkVST1VUSU5HKSBhbmQgcGt0IGlzIG5vdCBtYW5nbGVkIHlldCAqLwotCQluZXdfY2FsbGlkID0gY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlLmRzdC51LnRjcC5wb3J0OwotCi0JCS8qIHNhdmUgbmV3IGNhbGwgSUQgaW4gY3QgaW5mbyAqLwotCQljdF9wcHRwX2luZm8tPnBuc19jYWxsX2lkID0gbmV3X2NhbGxpZDsKLQkJYnJlYWs7Ci0JY2FzZSBQUFRQX0lOX0NBTExfUkVQTFk6Ci0JCWNpZF9vZmYgPSBvZmZzZXRvZih1bmlvbiBwcHRwX2N0cmxfdW5pb24sIGljYWNrLmNhbGxJRCk7Ci0JCWJyZWFrOwotCWNhc2UgUFBUUF9DQUxMX0NMRUFSX1JFUVVFU1Q6Ci0JCWNpZF9vZmYgPSBvZmZzZXRvZih1bmlvbiBwcHRwX2N0cmxfdW5pb24sIGNscnJlcS5jYWxsSUQpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlERUJVR1AoInVua25vd24gb3V0Ym91bmQgcGFja2V0IDB4JTA0eDolc1xuIiwgbXNnLAotCQkgICAgICAobXNnIDw9IFBQVFBfTVNHX01BWCk/Ci0JCSAgICAgIHBwdHBfbXNnX25hbWVbbXNnXTpwcHRwX21zZ19uYW1lWzBdKTsKLQkJLyogZmFsbCB0aHJvdWdoICovCi0KLQljYXNlIFBQVFBfU0VUX0xJTktfSU5GTzoKLQkJLyogb25seSBuZWVkIHRvIE5BVCBpbiBjYXNlIFBBQyBpcyBiZWhpbmQgTkFUIGJveCAqLwotCWNhc2UgUFBUUF9TVEFSVF9TRVNTSU9OX1JFUVVFU1Q6Ci0JY2FzZSBQUFRQX1NUQVJUX1NFU1NJT05fUkVQTFk6Ci0JY2FzZSBQUFRQX1NUT1BfU0VTU0lPTl9SRVFVRVNUOgotCWNhc2UgUFBUUF9TVE9QX1NFU1NJT05fUkVQTFk6Ci0JY2FzZSBQUFRQX0VDSE9fUkVRVUVTVDoKLQljYXNlIFBQVFBfRUNIT19SRVBMWToKLQkJLyogbm8gbmVlZCB0byBhbHRlciBwYWNrZXQgKi8KLQkJcmV0dXJuIE5GX0FDQ0VQVDsKLQl9Ci0KLQkvKiBvbmx5IE9VVF9DQUxMX1JFUVVFU1QsIElOX0NBTExfUkVQTFksIENBTExfQ0xFQVJfUkVRVUVTVCBwYXNzCi0JICogZG93biB0byBoZXJlICovCi0JREVCVUdQKCJhbHRlcmluZyBjYWxsIGlkIGZyb20gMHglMDR4IHRvIDB4JTA0eFxuIiwKLQkJbnRvaHMoUkVRX0NJRChwcHRwUmVxLCBjaWRfb2ZmKSksIG50b2hzKG5ld19jYWxsaWQpKTsKLQotCS8qIG1hbmdsZSBwYWNrZXQgKi8KLQlpZiAoaXBfbmF0X21hbmdsZV90Y3BfcGFja2V0KHBza2IsIGN0LCBjdGluZm8sCi0JCQkJICAgICBjaWRfb2ZmICsgc2l6ZW9mKHN0cnVjdCBwcHRwX3BrdF9oZHIpICsKLQkJCQkgICAgIHNpemVvZihzdHJ1Y3QgUHB0cENvbnRyb2xIZWFkZXIpLAotCQkJCSAgICAgc2l6ZW9mKG5ld19jYWxsaWQpLCAoY2hhciAqKSZuZXdfY2FsbGlkLAotCQkJCSAgICAgc2l6ZW9mKG5ld19jYWxsaWQpKSA9PSAwKQotCQlyZXR1cm4gTkZfRFJPUDsKLQotCXJldHVybiBORl9BQ0NFUFQ7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcHRwX2V4cF9ncmUoc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmV4cGVjdF9vcmlnLAotCSAgICAgc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmV4cGVjdF9yZXBseSkKLXsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCA9IGV4cGVjdF9vcmlnLT5tYXN0ZXI7Ci0Jc3RydWN0IGlwX2N0X3BwdHBfbWFzdGVyICpjdF9wcHRwX2luZm8gPSAmY3QtPmhlbHAuY3RfcHB0cF9pbmZvOwotCXN0cnVjdCBpcF9uYXRfcHB0cCAqbmF0X3BwdHBfaW5mbyA9ICZjdC0+bmF0LmhlbHAubmF0X3BwdHBfaW5mbzsKLQotCS8qIHNhdmUgb3JpZ2luYWwgUEFDIGNhbGwgSUQgaW4gbmF0X2luZm8gKi8KLQluYXRfcHB0cF9pbmZvLT5wYWNfY2FsbF9pZCA9IGN0X3BwdHBfaW5mby0+cGFjX2NhbGxfaWQ7Ci0KLQkvKiBhbHRlciBleHBlY3RhdGlvbiBmb3IgUE5TLT5QQUMgZGlyZWN0aW9uICovCi0JZXhwZWN0X29yaWctPnNhdmVkX3Byb3RvLmdyZS5rZXkgPSBjdF9wcHRwX2luZm8tPnBuc19jYWxsX2lkOwotCWV4cGVjdF9vcmlnLT50dXBsZS5zcmMudS5ncmUua2V5ID0gbmF0X3BwdHBfaW5mby0+cG5zX2NhbGxfaWQ7Ci0JZXhwZWN0X29yaWctPnR1cGxlLmRzdC51LmdyZS5rZXkgPSBjdF9wcHRwX2luZm8tPnBhY19jYWxsX2lkOwotCWV4cGVjdF9vcmlnLT5kaXIgPSBJUF9DVF9ESVJfT1JJR0lOQUw7Ci0KLQkvKiBhbHRlciBleHBlY3RhdGlvbiBmb3IgUEFDLT5QTlMgZGlyZWN0aW9uICovCi0JZXhwZWN0X3JlcGx5LT5zYXZlZF9wcm90by5ncmUua2V5ID0gbmF0X3BwdHBfaW5mby0+cG5zX2NhbGxfaWQ7Ci0JZXhwZWN0X3JlcGx5LT50dXBsZS5zcmMudS5ncmUua2V5ID0gbmF0X3BwdHBfaW5mby0+cGFjX2NhbGxfaWQ7Ci0JZXhwZWN0X3JlcGx5LT50dXBsZS5kc3QudS5ncmUua2V5ID0gY3RfcHB0cF9pbmZvLT5wbnNfY2FsbF9pZDsKLQlleHBlY3RfcmVwbHktPmRpciA9IElQX0NUX0RJUl9SRVBMWTsKLX0KLQotLyogaW5ib3VuZCBwYWNrZXRzID09IGZyb20gUEFDIHRvIFBOUyAqLwotc3RhdGljIGludAotcHB0cF9pbmJvdW5kX3BrdChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCi0JCSBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKLQkJIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAotCQkgc3RydWN0IFBwdHBDb250cm9sSGVhZGVyICpjdGxoLAotCQkgdW5pb24gcHB0cF9jdHJsX3VuaW9uICpwcHRwUmVxKQotewotCXN0cnVjdCBpcF9uYXRfcHB0cCAqbmF0X3BwdHBfaW5mbyA9ICZjdC0+bmF0LmhlbHAubmF0X3BwdHBfaW5mbzsKLQl1X2ludDE2X3QgbXNnOwotCV9fYmUxNiBuZXdfcGNpZDsKLQl1bnNpZ25lZCBpbnQgcGNpZF9vZmY7Ci0KLQluZXdfcGNpZCA9IG5hdF9wcHRwX2luZm8tPnBuc19jYWxsX2lkOwotCi0Jc3dpdGNoIChtc2cgPSBudG9ocyhjdGxoLT5tZXNzYWdlVHlwZSkpIHsKLQljYXNlIFBQVFBfT1VUX0NBTExfUkVQTFk6Ci0JCXBjaWRfb2ZmID0gb2Zmc2V0b2YodW5pb24gcHB0cF9jdHJsX3VuaW9uLCBvY2Fjay5wZWVyc0NhbGxJRCk7Ci0JCWJyZWFrOwotCWNhc2UgUFBUUF9JTl9DQUxMX0NPTk5FQ1Q6Ci0JCXBjaWRfb2ZmID0gb2Zmc2V0b2YodW5pb24gcHB0cF9jdHJsX3VuaW9uLCBpY2Nvbi5wZWVyc0NhbGxJRCk7Ci0JCWJyZWFrOwotCWNhc2UgUFBUUF9JTl9DQUxMX1JFUVVFU1Q6Ci0JCS8qIG9ubHkgbmVlZCB0byBuYXQgaW4gY2FzZSBQQUMgaXMgYmVoaW5kIE5BVCBib3ggKi8KLQkJcmV0dXJuIE5GX0FDQ0VQVDsKLQljYXNlIFBQVFBfV0FOX0VSUk9SX05PVElGWToKLQkJcGNpZF9vZmYgPSBvZmZzZXRvZih1bmlvbiBwcHRwX2N0cmxfdW5pb24sIHdhbmVyci5wZWVyc0NhbGxJRCk7Ci0JCWJyZWFrOwotCWNhc2UgUFBUUF9DQUxMX0RJU0NPTk5FQ1RfTk9USUZZOgotCQlwY2lkX29mZiA9IG9mZnNldG9mKHVuaW9uIHBwdHBfY3RybF91bmlvbiwgZGlzYy5jYWxsSUQpOwotCQlicmVhazsKLQljYXNlIFBQVFBfU0VUX0xJTktfSU5GTzoKLQkJcGNpZF9vZmYgPSBvZmZzZXRvZih1bmlvbiBwcHRwX2N0cmxfdW5pb24sIHNldGxpbmsucGVlcnNDYWxsSUQpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCURFQlVHUCgidW5rbm93biBpbmJvdW5kIHBhY2tldCAlc1xuIiwgKG1zZyA8PSBQUFRQX01TR19NQVgpPwotCQkJcHB0cF9tc2dfbmFtZVttc2ddOnBwdHBfbXNnX25hbWVbMF0pOwotCQkvKiBmYWxsIHRocm91Z2ggKi8KLQotCWNhc2UgUFBUUF9TVEFSVF9TRVNTSU9OX1JFUVVFU1Q6Ci0JY2FzZSBQUFRQX1NUQVJUX1NFU1NJT05fUkVQTFk6Ci0JY2FzZSBQUFRQX1NUT1BfU0VTU0lPTl9SRVFVRVNUOgotCWNhc2UgUFBUUF9TVE9QX1NFU1NJT05fUkVQTFk6Ci0JY2FzZSBQUFRQX0VDSE9fUkVRVUVTVDoKLQljYXNlIFBQVFBfRUNIT19SRVBMWToKLQkJLyogbm8gbmVlZCB0byBhbHRlciBwYWNrZXQgKi8KLQkJcmV0dXJuIE5GX0FDQ0VQVDsKLQl9Ci0KLQkvKiBvbmx5IE9VVF9DQUxMX1JFUExZLCBJTl9DQUxMX0NPTk5FQ1QsIElOX0NBTExfUkVRVUVTVCwKLQkgKiBXQU5fRVJST1JfTk9USUZZLCBDQUxMX0RJU0NPTk5FQ1RfTk9USUZZIHBhc3MgZG93biBoZXJlICovCi0KLQkvKiBtYW5nbGUgcGFja2V0ICovCi0JREVCVUdQKCJhbHRlcmluZyBwZWVyIGNhbGwgaWQgZnJvbSAweCUwNHggdG8gMHglMDR4XG4iLAotCQludG9ocyhSRVFfQ0lEKHBwdHBSZXEsIHBjaWRfb2ZmKSksIG50b2hzKG5ld19wY2lkKSk7Ci0KLQlpZiAoaXBfbmF0X21hbmdsZV90Y3BfcGFja2V0KHBza2IsIGN0LCBjdGluZm8sCi0JCQkJICAgICBwY2lkX29mZiArIHNpemVvZihzdHJ1Y3QgcHB0cF9wa3RfaGRyKSArCi0JCQkJICAgICBzaXplb2Yoc3RydWN0IFBwdHBDb250cm9sSGVhZGVyKSwKLQkJCQkgICAgIHNpemVvZihuZXdfcGNpZCksIChjaGFyICopJm5ld19wY2lkLAotCQkJCSAgICAgc2l6ZW9mKG5ld19wY2lkKSkgPT0gMCkKLQkJcmV0dXJuIE5GX0RST1A7Ci0JcmV0dXJuIE5GX0FDQ0VQVDsKLX0KLQotCi1leHRlcm4gaW50IF9faW5pdCBpcF9uYXRfcHJvdG9fZ3JlX2luaXQodm9pZCk7Ci1leHRlcm4gdm9pZCBfX2V4aXQgaXBfbmF0X3Byb3RvX2dyZV9maW5pKHZvaWQpOwotCi1zdGF0aWMgaW50IF9faW5pdCBpcF9uYXRfaGVscGVyX3BwdHBfaW5pdCh2b2lkKQotewotCWludCByZXQ7Ci0KLQlERUJVR1AoIiVzOiByZWdpc3RlcmluZyBOQVQgaGVscGVyXG4iLCBfX0ZJTEVfXyk7Ci0KLQlyZXQgPSBpcF9uYXRfcHJvdG9fZ3JlX2luaXQoKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCUJVR19PTihyY3VfZGVyZWZlcmVuY2UoaXBfbmF0X3BwdHBfaG9va19vdXRib3VuZCkpOwotCXJjdV9hc3NpZ25fcG9pbnRlcihpcF9uYXRfcHB0cF9ob29rX291dGJvdW5kLCBwcHRwX291dGJvdW5kX3BrdCk7Ci0KLQlCVUdfT04ocmN1X2RlcmVmZXJlbmNlKGlwX25hdF9wcHRwX2hvb2tfaW5ib3VuZCkpOwotCXJjdV9hc3NpZ25fcG9pbnRlcihpcF9uYXRfcHB0cF9ob29rX2luYm91bmQsIHBwdHBfaW5ib3VuZF9wa3QpOwotCi0JQlVHX09OKHJjdV9kZXJlZmVyZW5jZShpcF9uYXRfcHB0cF9ob29rX2V4cF9ncmUpKTsKLQlyY3VfYXNzaWduX3BvaW50ZXIoaXBfbmF0X3BwdHBfaG9va19leHBfZ3JlLCBwcHRwX2V4cF9ncmUpOwotCi0JQlVHX09OKHJjdV9kZXJlZmVyZW5jZShpcF9uYXRfcHB0cF9ob29rX2V4cGVjdGZuKSk7Ci0JcmN1X2Fzc2lnbl9wb2ludGVyKGlwX25hdF9wcHRwX2hvb2tfZXhwZWN0Zm4sIHBwdHBfbmF0X2V4cGVjdGVkKTsKLQotCXByaW50aygiaXBfbmF0X3BwdHAgdmVyc2lvbiAlcyBsb2FkZWRcbiIsIElQX05BVF9QUFRQX1ZFUlNJT04pOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgaXBfbmF0X2hlbHBlcl9wcHRwX2Zpbmkodm9pZCkKLXsKLQlERUJVR1AoImNsZWFudXBfbW9kdWxlXG4iICk7Ci0KLQlyY3VfYXNzaWduX3BvaW50ZXIoaXBfbmF0X3BwdHBfaG9va19leHBlY3RmbiwgTlVMTCk7Ci0JcmN1X2Fzc2lnbl9wb2ludGVyKGlwX25hdF9wcHRwX2hvb2tfZXhwX2dyZSwgTlVMTCk7Ci0JcmN1X2Fzc2lnbl9wb2ludGVyKGlwX25hdF9wcHRwX2hvb2tfaW5ib3VuZCwgTlVMTCk7Ci0JcmN1X2Fzc2lnbl9wb2ludGVyKGlwX25hdF9wcHRwX2hvb2tfb3V0Ym91bmQsIE5VTEwpOwotCXN5bmNocm9uaXplX3JjdSgpOwotCi0JaXBfbmF0X3Byb3RvX2dyZV9maW5pKCk7Ci0KLQlwcmludGsoImlwX25hdF9wcHRwIHZlcnNpb24gJXMgdW5sb2FkZWRcbiIsIElQX05BVF9QUFRQX1ZFUlNJT04pOwotfQotCi1tb2R1bGVfaW5pdChpcF9uYXRfaGVscGVyX3BwdHBfaW5pdCk7Ci1tb2R1bGVfZXhpdChpcF9uYXRfaGVscGVyX3BwdHBfZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X2lyYy5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9pcmMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZhZWVhMy4uMDAwMDAwMAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X2lyYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qIElSQyBleHRlbnNpb24gZm9yIFRDUCBOQVQgYWx0ZXJhdGlvbi4KLSAqIChDKSAyMDAwLTIwMDEgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KLSAqIChDKSAyMDA0IFJ1c3R5IFJ1c3NlbGwgPHJ1c3R5QHJ1c3Rjb3JwLmNvbS5hdT4gSUJNIENvcnBvcmF0aW9uCi0gKiBiYXNlZCBvbiBhIGNvcHkgb2YgUlIncyBpcF9uYXRfZnRwLmMKLSAqCi0gKiBpcF9uYXRfaXJjLmMsdiAxLjE2IDIwMDEvMTIvMDYgMDc6NDI6MTAgbGFmb3JnZSBFeHAKLSAqCi0gKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqICAgICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gKiAgICAgIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaXAuaD4KLSNpbmNsdWRlIDxsaW51eC90Y3AuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxuZXQvdGNwLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0X2hlbHBlci5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdF9ydWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2lyYy5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19oZWxwZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgotCi0jaWYgMAotI2RlZmluZSBERUJVR1AgcHJpbnRrCi0jZWxzZQotI2RlZmluZSBERUJVR1AoZm9ybWF0LCBhcmdzLi4uKQotI2VuZGlmCi0KLU1PRFVMRV9BVVRIT1IoIkhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIklSQyAoRENDKSBOQVQgaGVscGVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgaGVscChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCi0JCQkgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCi0JCQkgdW5zaWduZWQgaW50IG1hdGNob2ZmLAotCQkJIHVuc2lnbmVkIGludCBtYXRjaGxlbiwKLQkJCSBzdHJ1Y3QgaXBfY29ubnRyYWNrX2V4cGVjdCAqZXhwKQotewotCXVfaW50MTZfdCBwb3J0OwotCXVuc2lnbmVkIGludCByZXQ7Ci0KLQkvKiAiNDI5NDk2NzI5NiA2NTYzNSAiICovCi0JY2hhciBidWZmZXJbMThdOwotCi0JREVCVUdQKCJJUkNfTkFUOiBpbmZvIChzZXEgJXUgKyAldSkgaW4gJXVcbiIsCi0JICAgICAgIGV4cGVjdC0+c2VxLCBleHBfaXJjX2luZm8tPmxlbiwKLQkgICAgICAgbnRvaGwodGNwaC0+c2VxKSk7Ci0KLQkvKiBSZXBseSBjb21lcyBmcm9tIHNlcnZlci4gKi8KLQlleHAtPnNhdmVkX3Byb3RvLnRjcC5wb3J0ID0gZXhwLT50dXBsZS5kc3QudS50Y3AucG9ydDsKLQlleHAtPmRpciA9IElQX0NUX0RJUl9SRVBMWTsKLQotCS8qIFdoZW4geW91IHNlZSB0aGUgcGFja2V0LCB3ZSBuZWVkIHRvIE5BVCBpdCB0aGUgc2FtZSBhcyB0aGUKLQkgKiB0aGlzIG9uZS4gKi8KLQlleHAtPmV4cGVjdGZuID0gaXBfbmF0X2ZvbGxvd19tYXN0ZXI7Ci0KLQkvKiBUcnkgdG8gZ2V0IHNhbWUgcG9ydDogaWYgbm90LCB0cnkgdG8gY2hhbmdlIGl0LiAqLwotCWZvciAocG9ydCA9IG50b2hzKGV4cC0+c2F2ZWRfcHJvdG8udGNwLnBvcnQpOyBwb3J0ICE9IDA7IHBvcnQrKykgewotCQlleHAtPnR1cGxlLmRzdC51LnRjcC5wb3J0ID0gaHRvbnMocG9ydCk7Ci0JCWlmIChpcF9jb25udHJhY2tfZXhwZWN0X3JlbGF0ZWQoZXhwKSA9PSAwKQotCQkJYnJlYWs7Ci0JfQotCi0JaWYgKHBvcnQgPT0gMCkKLQkJcmV0dXJuIE5GX0RST1A7Ci0KLQkvKiAgICAgIHN0cmxlbigiXDFEQ0MgQ0hBVCBjaGF0IEFBQUFBQUFBIFBcMVxuIik9MjcKLQkgKiAgICAgIHN0cmxlbigiXDFEQ0MgU0NIQVQgY2hhdCBBQUFBQUFBQSBQXDFcbiIpPTI4Ci0JICogICAgICBzdHJsZW4oIlwxRENDIFNFTkQgRiBBQUFBQUFBQSBQIFNcMVxuIik9MjYKLQkgKiAgICAgIHN0cmxlbigiXDFEQ0MgTU9WRSBGIEFBQUFBQUFBIFAgU1wxXG4iKT0yNgotCSAqICAgICAgc3RybGVuKCJcMURDQyBUU0VORCBGIEFBQUFBQUFBIFAgU1wxXG4iKT0yNwotCSAqICAgICAgICAgICAgICBBQUFBQUFBQUE6IGJvdW5kIGFkZHIgKDEuMC4wLjA9PTE2Nzc3MjE2LCBtaW4gOCBkaWdpdHMsCi0JICogICAgICAgICAgICAgICAgICAgICAgMjU1LjI1NS4yNTUuMjU1PT00Mjk0OTY3Mjk2LCAxMCBkaWdpdHMpCi0JICogICAgICAgICAgICAgIFA6ICAgICAgICAgYm91bmQgcG9ydCAobWluIDEgZCwgbWF4IDVkICg2NTYzNSkpCi0JICogICAgICAgICAgICAgIEY6ICAgICAgICAgZmlsZW5hbWUgICAobWluIDEgZCApCi0JICogICAgICAgICAgICAgIFM6ICAgICAgICAgc2l6ZSAgICAgICAobWluIDEgZCApCi0JICogICAgICAgICAgICAgIDB4MDEsIFxuOiAgdGVybWluYXRvcnMKLQkgKi8KLQotCS8qIEFBQSA9ICJ1cyIsIGllLiB3aGVyZSBzZXJ2ZXIgbm9ybWFsbHkgdGFsa3MgdG8uICovCi0Jc3ByaW50ZihidWZmZXIsICIldSAldSIsCi0JCW50b2hsKGV4cC0+bWFzdGVyLT50dXBsZWhhc2hbSVBfQ1RfRElSX1JFUExZXS50dXBsZS5kc3QuaXApLAotCQlwb3J0KTsKLQlERUJVR1AoImlwX25hdF9pcmM6IEluc2VydGluZyAnJXMnID09ICV1LiV1LiV1LiV1LCBwb3J0ICV1XG4iLAotCSAgICAgICBidWZmZXIsIE5JUFFVQUQoZXhwLT50dXBsZS5zcmMuaXApLCBwb3J0KTsKLQotCXJldCA9IGlwX25hdF9tYW5nbGVfdGNwX3BhY2tldChwc2tiLCBleHAtPm1hc3RlciwgY3RpbmZvLAotCQkJCSAgICAgICBtYXRjaG9mZiwgbWF0Y2hsZW4sIGJ1ZmZlciwKLQkJCQkgICAgICAgc3RybGVuKGJ1ZmZlcikpOwotCWlmIChyZXQgIT0gTkZfQUNDRVBUKQotCQlpcF9jb25udHJhY2tfdW5leHBlY3RfcmVsYXRlZChleHApOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBpcF9uYXRfaXJjX2Zpbmkodm9pZCkKLXsKLQlyY3VfYXNzaWduX3BvaW50ZXIoaXBfbmF0X2lyY19ob29rLCBOVUxMKTsKLQlzeW5jaHJvbml6ZV9yY3UoKTsKLX0KLQotc3RhdGljIGludCBfX2luaXQgaXBfbmF0X2lyY19pbml0KHZvaWQpCi17Ci0JQlVHX09OKHJjdV9kZXJlZmVyZW5jZShpcF9uYXRfaXJjX2hvb2spKTsKLQlyY3VfYXNzaWduX3BvaW50ZXIoaXBfbmF0X2lyY19ob29rLCBoZWxwKTsKLQlyZXR1cm4gMDsKLX0KLQotLyogUHJpb3IgdG8gMi42LjExLCB3ZSBoYWQgYSBwb3J0cyBwYXJhbS4gIE5vIGxvbmdlciwgYnV0IGRvbid0IGJyZWFrIHVzZXJzLiAqLwotc3RhdGljIGludCB3YXJuX3NldChjb25zdCBjaGFyICp2YWwsIHN0cnVjdCBrZXJuZWxfcGFyYW0gKmtwKQotewotCXByaW50ayhLRVJOX0lORk8gS0JVSUxEX01PRE5BTUUKLQkgICAgICAgIjoga2VybmVsID49IDIuNi4xMCBvbmx5IHVzZXMgJ3BvcnRzJyBmb3IgY29ubnRyYWNrIG1vZHVsZXNcbiIpOwotCXJldHVybiAwOwotfQotbW9kdWxlX3BhcmFtX2NhbGwocG9ydHMsIHdhcm5fc2V0LCBOVUxMLCBOVUxMLCAwKTsKLQotbW9kdWxlX2luaXQoaXBfbmF0X2lyY19pbml0KTsKLW1vZHVsZV9leGl0KGlwX25hdF9pcmNfZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3Byb3RvX2dyZS5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9wcm90b19ncmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU4MTAyMC4uMDAwMDAwMAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3Byb3RvX2dyZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS8qCi0gKiBpcF9uYXRfcHJvdG9fZ3JlLmMgLSBWZXJzaW9uIDIuMAotICoKLSAqIE5BVCBwcm90b2NvbCBoZWxwZXIgbW9kdWxlIGZvciBHUkUuCi0gKgotICogR1JFIGlzIGEgZ2VuZXJpYyBlbmNhcHN1bGF0aW9uIHByb3RvY29sLCB3aGljaCBpcyBnZW5lcmFsbHkgbm90IHZlcnkKLSAqIHN1aXRlZCBmb3IgTkFULCBhcyBpdCBoYXMgbm8gcHJvdG9jb2wtc3BlY2lmaWMgcGFydCBhcyBwb3J0IG51bWJlcnMuCi0gKgotICogSXQgaGFzIGFuIG9wdGlvbmFsIGtleSBmaWVsZCwgd2hpY2ggbWF5IGhlbHAgdXMgZGlzdGluZ3Vpc2hpbmcgdHdvCi0gKiBjb25uZWN0aW9ucyBiZXR3ZWVuIHRoZSBzYW1lIHR3byBob3N0cy4KLSAqCi0gKiBHUkUgaXMgZGVmaW5lZCBpbiBSRkMgMTcwMSBhbmQgUkZDIDE3MDIsIGFzIHdlbGwgYXMgUkZDIDI3ODQKLSAqCi0gKiBQUFRQIGlzIGJ1aWx0IG9uIHRvcCBvZiBhIG1vZGlmaWVkIHZlcnNpb24gb2YgR1JFLCBhbmQgaGFzIGEgbWFuZGF0b3J5Ci0gKiBmaWVsZCBjYWxsZWQgIkNhbGxJRCIsIHdoaWNoIHNlcnZlcyB1cyBmb3IgdGhlIHNhbWUgcHVycG9zZSBhcyB0aGUga2V5Ci0gKiBmaWVsZCBpbiBwbGFpbiBHUkUuCi0gKgotICogRG9jdW1lbnRhdGlvbiBhYm91dCBQUFRQIGNhbiBiZSBmb3VuZCBpbiBSRkMgMjYzNwotICoKLSAqIChDKSAyMDAwLTIwMDUgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KLSAqCi0gKiBEZXZlbG9wbWVudCBvZiB0aGlzIGNvZGUgZnVuZGVkIGJ5IEFzdGFybyBBRyAoaHR0cDovL3d3dy5hc3Rhcm8uY29tLykKLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2lwLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0X3J1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9uYXRfcHJvdG9jb2wuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfcHJvdG9fZ3JlLmg+Ci0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9BVVRIT1IoIkhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIk5ldGZpbHRlciBOQVQgcHJvdG9jb2wgaGVscGVyIG1vZHVsZSBmb3IgR1JFIik7Ci0KLSNpZiAwCi0jZGVmaW5lIERFQlVHUChmb3JtYXQsIGFyZ3MuLi4pIHByaW50ayhLRVJOX0RFQlVHICIlczolczogIiBmb3JtYXQsIF9fRklMRV9fLCBcCi0JCQkJICAgICAgIF9fRlVOQ1RJT05fXywgIyMgYXJncykKLSNlbHNlCi0jZGVmaW5lIERFQlVHUCh4LCBhcmdzLi4uKQotI2VuZGlmCi0KLS8qIGlzIGtleSBpbiBnaXZlbiByYW5nZSBiZXR3ZWVuIG1pbiBhbmQgbWF4ICovCi1zdGF0aWMgaW50Ci1ncmVfaW5fcmFuZ2UoY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUsCi0JICAgICBlbnVtIGlwX25hdF9tYW5pcF90eXBlIG1hbmlwdHlwZSwKLQkgICAgIGNvbnN0IHVuaW9uIGlwX2Nvbm50cmFja19tYW5pcF9wcm90byAqbWluLAotCSAgICAgY29uc3QgdW5pb24gaXBfY29ubnRyYWNrX21hbmlwX3Byb3RvICptYXgpCi17Ci0JX19iZTE2IGtleTsKLQotCWlmIChtYW5pcHR5cGUgPT0gSVBfTkFUX01BTklQX1NSQykKLQkJa2V5ID0gdHVwbGUtPnNyYy51LmdyZS5rZXk7Ci0JZWxzZQotCQlrZXkgPSB0dXBsZS0+ZHN0LnUuZ3JlLmtleTsKLQotCXJldHVybiBudG9ocyhrZXkpID49IG50b2hzKG1pbi0+Z3JlLmtleSkKLQkJJiYgbnRvaHMoa2V5KSA8PSBudG9ocyhtYXgtPmdyZS5rZXkpOwotfQotCi0vKiBnZW5lcmF0ZSB1bmlxdWUgdHVwbGUgLi4uICovCi1zdGF0aWMgaW50Ci1ncmVfdW5pcXVlX3R1cGxlKHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnR1cGxlLAotCQkgY29uc3Qgc3RydWN0IGlwX25hdF9yYW5nZSAqcmFuZ2UsCi0JCSBlbnVtIGlwX25hdF9tYW5pcF90eXBlIG1hbmlwdHlwZSwKLQkJIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2sgKmNvbm50cmFjaykKLXsKLQlzdGF0aWMgdV9pbnQxNl90IGtleTsKLQlfX2JlMTYgKmtleXB0cjsKLQl1bnNpZ25lZCBpbnQgbWluLCBpLCByYW5nZV9zaXplOwotCi0JaWYgKG1hbmlwdHlwZSA9PSBJUF9OQVRfTUFOSVBfU1JDKQotCQlrZXlwdHIgPSAmdHVwbGUtPnNyYy51LmdyZS5rZXk7Ci0JZWxzZQotCQlrZXlwdHIgPSAmdHVwbGUtPmRzdC51LmdyZS5rZXk7Ci0KLQlpZiAoIShyYW5nZS0+ZmxhZ3MgJiBJUF9OQVRfUkFOR0VfUFJPVE9fU1BFQ0lGSUVEKSkgewotCQlERUJVR1AoIiVwOiBOQVRpbmcgR1JFIFBQVFBcbiIsIGNvbm50cmFjayk7Ci0JCW1pbiA9IDE7Ci0JCXJhbmdlX3NpemUgPSAweGZmZmY7Ci0JfSBlbHNlIHsKLQkJbWluID0gbnRvaHMocmFuZ2UtPm1pbi5ncmUua2V5KTsKLQkJcmFuZ2Vfc2l6ZSA9IG50b2hzKHJhbmdlLT5tYXguZ3JlLmtleSkgLSBtaW4gKyAxOwotCX0KLQotCURFQlVHUCgibWluID0gJXUsIHJhbmdlX3NpemUgPSAldVxuIiwgbWluLCByYW5nZV9zaXplKTsKLQotCWZvciAoaSA9IDA7IGkgPCByYW5nZV9zaXplOyBpKyssIGtleSsrKSB7Ci0JCSprZXlwdHIgPSBodG9ucyhtaW4gKyBrZXkgJSByYW5nZV9zaXplKTsKLQkJaWYgKCFpcF9uYXRfdXNlZF90dXBsZSh0dXBsZSwgY29ubnRyYWNrKSkKLQkJCXJldHVybiAxOwotCX0KLQotCURFQlVHUCgiJXA6IG5vIE5BVCBtYXBwaW5nXG4iLCBjb25udHJhY2spOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIG1hbmlwdWxhdGUgYSBHUkUgcGFja2V0IGFjY29yZGluZyB0byBtYW5pcHR5cGUgKi8KLXN0YXRpYyBpbnQKLWdyZV9tYW5pcF9wa3Qoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAotCSAgICAgIHVuc2lnbmVkIGludCBpcGhkcm9mZiwKLQkgICAgICBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0dXBsZSwKLQkgICAgICBlbnVtIGlwX25hdF9tYW5pcF90eXBlIG1hbmlwdHlwZSkKLXsKLQlzdHJ1Y3QgZ3JlX2hkciAqZ3JlaDsKLQlzdHJ1Y3QgZ3JlX2hkcl9wcHRwICpwZ3JlaDsKLQlzdHJ1Y3QgaXBoZHIgKmlwaCA9IChzdHJ1Y3QgaXBoZHIgKikoKCpwc2tiKS0+ZGF0YSArIGlwaGRyb2ZmKTsKLQl1bnNpZ25lZCBpbnQgaGRyb2ZmID0gaXBoZHJvZmYgKyBpcGgtPmlobCo0OwotCi0JLyogcGdyZWggaW5jbHVkZXMgdHdvIG9wdGlvbmFsIDMyYml0IGZpZWxkcyB3aGljaCBhcmUgbm90IHJlcXVpcmVkCi0JICogdG8gYmUgdGhlcmUuICBUaGF0J3Mgd2hlcmUgdGhlIG1hZ2ljICc4JyBjb21lcyBmcm9tICovCi0JaWYgKCFza2JfbWFrZV93cml0YWJsZShwc2tiLCBoZHJvZmYgKyBzaXplb2YoKnBncmVoKS04KSkKLQkJcmV0dXJuIDA7Ci0KLQlncmVoID0gKHZvaWQgKikoKnBza2IpLT5kYXRhICsgaGRyb2ZmOwotCXBncmVoID0gKHN0cnVjdCBncmVfaGRyX3BwdHAgKikgZ3JlaDsKLQotCS8qIHdlIG9ubHkgaGF2ZSBkZXN0aW5hdGlvbiBtYW5pcCBvZiBhIHBhY2tldCwgc2luY2UgJ3NvdXJjZSBrZXknCi0JICogaXMgbm90IHByZXNlbnQgaW4gdGhlIHBhY2tldCBpdHNlbGYgKi8KLQlpZiAobWFuaXB0eXBlID09IElQX05BVF9NQU5JUF9EU1QpIHsKLQkJLyoga2V5IG1hbmlwdWxhdGlvbiBpcyBhbHdheXMgZGVzdCAqLwotCQlzd2l0Y2ggKGdyZWgtPnZlcnNpb24pIHsKLQkJY2FzZSAwOgotCQkJaWYgKCFncmVoLT5rZXkpIHsKLQkJCQlERUJVR1AoImNhbid0IG5hdCBHUkUgdy9vIGtleVxuIik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoZ3JlaC0+Y3N1bSkgewotCQkJCS8qIEZJWE1FOiBOZXZlciB0ZXN0ZWQgdGhpcyBjb2RlLi4uICovCi0JCQkJbmZfcHJvdG9fY3N1bV9yZXBsYWNlNChncmVfY3N1bShncmVoKSwgKnBza2IsCi0JCQkJCQkJKihncmVfa2V5KGdyZWgpKSwKLQkJCQkJCQl0dXBsZS0+ZHN0LnUuZ3JlLmtleSwgMCk7Ci0JCQl9Ci0JCQkqKGdyZV9rZXkoZ3JlaCkpID0gdHVwbGUtPmRzdC51LmdyZS5rZXk7Ci0JCQlicmVhazsKLQkJY2FzZSBHUkVfVkVSU0lPTl9QUFRQOgotCQkJREVCVUdQKCJjYWxsX2lkIC0+IDB4JTA0eFxuIiwKLQkJCQludG9ocyh0dXBsZS0+ZHN0LnUuZ3JlLmtleSkpOwotCQkJcGdyZWgtPmNhbGxfaWQgPSB0dXBsZS0+ZHN0LnUuZ3JlLmtleTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJREVCVUdQKCJjYW4ndCBuYXQgdW5rbm93biBHUkUgdmVyc2lvblxuIik7Ci0JCQlyZXR1cm4gMDsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCXJldHVybiAxOwotfQotCi0vKiBuYXQgaGVscGVyIHN0cnVjdCAqLwotc3RhdGljIHN0cnVjdCBpcF9uYXRfcHJvdG9jb2wgZ3JlID0gewotCS5uYW1lCQk9ICJHUkUiLAotCS5wcm90b251bQk9IElQUFJPVE9fR1JFLAotCS5tYW5pcF9wa3QJPSBncmVfbWFuaXBfcGt0LAotCS5pbl9yYW5nZQk9IGdyZV9pbl9yYW5nZSwKLQkudW5pcXVlX3R1cGxlCT0gZ3JlX3VuaXF1ZV90dXBsZSwKLSNpZiBkZWZpbmVkKENPTkZJR19JUF9ORl9DT05OVFJBQ0tfTkVUTElOSykgfHwgXAotICAgIGRlZmluZWQoQ09ORklHX0lQX05GX0NPTk5UUkFDS19ORVRMSU5LX01PRFVMRSkKLQkucmFuZ2VfdG9fbmZhdHRyCT0gaXBfbmF0X3BvcnRfcmFuZ2VfdG9fbmZhdHRyLAotCS5uZmF0dHJfdG9fcmFuZ2UJPSBpcF9uYXRfcG9ydF9uZmF0dHJfdG9fcmFuZ2UsCi0jZW5kaWYKLX07Ci0KLWludCBfX2luaXQgaXBfbmF0X3Byb3RvX2dyZV9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIGlwX25hdF9wcm90b2NvbF9yZWdpc3RlcigmZ3JlKTsKLX0KLQotdm9pZCBfX2V4aXQgaXBfbmF0X3Byb3RvX2dyZV9maW5pKHZvaWQpCi17Ci0JaXBfbmF0X3Byb3RvY29sX3VucmVnaXN0ZXIoJmdyZSk7Ci19CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3Byb3RvX2ljbXAuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfcHJvdG9faWNtcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmE1MjhhLi4wMDAwMDAwCi0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfcHJvdG9faWNtcC5jCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyogKEMpIDE5OTktMjAwMSBQYXVsIGBSdXN0eScgUnVzc2VsbAotICogKEMpIDIwMDItMjAwNCBOZXRmaWx0ZXIgQ29yZSBUZWFtIDxjb3JldGVhbUBuZXRmaWx0ZXIub3JnPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgotI2luY2x1ZGUgPGxpbnV4L2lwLmg+Ci0jaW5jbHVkZSA8bGludXgvaWNtcC5oPgotI2luY2x1ZGUgPGxpbnV4L2lmLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9uYXQuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9uYXRfY29yZS5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdF9ydWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0X3Byb3RvY29sLmg+Ci0KLXN0YXRpYyBpbnQKLWljbXBfaW5fcmFuZ2UoY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUsCi0JICAgICAgZW51bSBpcF9uYXRfbWFuaXBfdHlwZSBtYW5pcHR5cGUsCi0JICAgICAgY29uc3QgdW5pb24gaXBfY29ubnRyYWNrX21hbmlwX3Byb3RvICptaW4sCi0JICAgICAgY29uc3QgdW5pb24gaXBfY29ubnRyYWNrX21hbmlwX3Byb3RvICptYXgpCi17Ci0JcmV0dXJuIG50b2hzKHR1cGxlLT5zcmMudS5pY21wLmlkKSA+PSBudG9ocyhtaW4tPmljbXAuaWQpICYmCi0JICAgICAgIG50b2hzKHR1cGxlLT5zcmMudS5pY21wLmlkKSA8PSBudG9ocyhtYXgtPmljbXAuaWQpOwotfQotCi1zdGF0aWMgaW50Ci1pY21wX3VuaXF1ZV90dXBsZShzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0dXBsZSwKLQkJICBjb25zdCBzdHJ1Y3QgaXBfbmF0X3JhbmdlICpyYW5nZSwKLQkJICBlbnVtIGlwX25hdF9tYW5pcF90eXBlIG1hbmlwdHlwZSwKLQkJICBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjb25udHJhY2spCi17Ci0Jc3RhdGljIHVfaW50MTZfdCBpZDsKLQl1bnNpZ25lZCBpbnQgcmFuZ2Vfc2l6ZTsKLQl1bnNpZ25lZCBpbnQgaTsKLQotCXJhbmdlX3NpemUgPSBudG9ocyhyYW5nZS0+bWF4LmljbXAuaWQpIC0gbnRvaHMocmFuZ2UtPm1pbi5pY21wLmlkKSArIDE7Ci0JLyogSWYgbm8gcmFuZ2Ugc3BlY2lmaWVkLi4uICovCi0JaWYgKCEocmFuZ2UtPmZsYWdzICYgSVBfTkFUX1JBTkdFX1BST1RPX1NQRUNJRklFRCkpCi0JCXJhbmdlX3NpemUgPSAweEZGRkY7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgcmFuZ2Vfc2l6ZTsgaSsrLCBpZCsrKSB7Ci0JCXR1cGxlLT5zcmMudS5pY21wLmlkID0gaHRvbnMobnRvaHMocmFuZ2UtPm1pbi5pY21wLmlkKSArCi0JCQkJCSAgICAgKGlkICUgcmFuZ2Vfc2l6ZSkpOwotCQlpZiAoIWlwX25hdF91c2VkX3R1cGxlKHR1cGxlLCBjb25udHJhY2spKQotCQkJcmV0dXJuIDE7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1pY21wX21hbmlwX3BrdChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCi0JICAgICAgIHVuc2lnbmVkIGludCBpcGhkcm9mZiwKLQkgICAgICAgY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUsCi0JICAgICAgIGVudW0gaXBfbmF0X21hbmlwX3R5cGUgbWFuaXB0eXBlKQotewotCXN0cnVjdCBpcGhkciAqaXBoID0gKHN0cnVjdCBpcGhkciAqKSgoKnBza2IpLT5kYXRhICsgaXBoZHJvZmYpOwotCXN0cnVjdCBpY21waGRyICpoZHI7Ci0JdW5zaWduZWQgaW50IGhkcm9mZiA9IGlwaGRyb2ZmICsgaXBoLT5paGwqNDsKLQotCWlmICghc2tiX21ha2Vfd3JpdGFibGUocHNrYiwgaGRyb2ZmICsgc2l6ZW9mKCpoZHIpKSkKLQkJcmV0dXJuIDA7Ci0KLQloZHIgPSAoc3RydWN0IGljbXBoZHIgKikoKCpwc2tiKS0+ZGF0YSArIGhkcm9mZik7Ci0JbmZfcHJvdG9fY3N1bV9yZXBsYWNlMigmaGRyLT5jaGVja3N1bSwgKnBza2IsCi0JCQkgICAgICAgaGRyLT51bi5lY2hvLmlkLCB0dXBsZS0+c3JjLnUuaWNtcC5pZCwgMCk7Ci0JaGRyLT51bi5lY2hvLmlkID0gdHVwbGUtPnNyYy51LmljbXAuaWQ7Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0cnVjdCBpcF9uYXRfcHJvdG9jb2wgaXBfbmF0X3Byb3RvY29sX2ljbXAgPSB7Ci0JLm5hbWUJCQk9ICJJQ01QIiwKLQkucHJvdG9udW0JCT0gSVBQUk9UT19JQ01QLAotCS5tZQkJCT0gVEhJU19NT0RVTEUsCi0JLm1hbmlwX3BrdAkJPSBpY21wX21hbmlwX3BrdCwKLQkuaW5fcmFuZ2UJCT0gaWNtcF9pbl9yYW5nZSwKLQkudW5pcXVlX3R1cGxlCQk9IGljbXBfdW5pcXVlX3R1cGxlLAotI2lmIGRlZmluZWQoQ09ORklHX0lQX05GX0NPTk5UUkFDS19ORVRMSU5LKSB8fCBcCi0gICAgZGVmaW5lZChDT05GSUdfSVBfTkZfQ09OTlRSQUNLX05FVExJTktfTU9EVUxFKQotCS5yYW5nZV90b19uZmF0dHIJPSBpcF9uYXRfcG9ydF9yYW5nZV90b19uZmF0dHIsCi0JLm5mYXR0cl90b19yYW5nZQk9IGlwX25hdF9wb3J0X25mYXR0cl90b19yYW5nZSwKLSNlbmRpZgotfTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfcHJvdG9fdGNwLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3Byb3RvX3RjcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGZmMjRmLi4wMDAwMDAwCi0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfcHJvdG9fdGNwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyogKEMpIDE5OTktMjAwMSBQYXVsIGBSdXN0eScgUnVzc2VsbAotICogKEMpIDIwMDItMjAwNCBOZXRmaWx0ZXIgQ29yZSBUZWFtIDxjb3JldGVhbUBuZXRmaWx0ZXIub3JnPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgotI2luY2x1ZGUgPGxpbnV4L2lwLmg+Ci0jaW5jbHVkZSA8bGludXgvdGNwLmg+Ci0jaW5jbHVkZSA8bGludXgvaWYuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIvbmZuZXRsaW5rX2Nvbm50cmFjay5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdC5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdF9ydWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0X3Byb3RvY29sLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0X2NvcmUuaD4KLQotc3RhdGljIGludAotdGNwX2luX3JhbmdlKGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnR1cGxlLAotCSAgICAgZW51bSBpcF9uYXRfbWFuaXBfdHlwZSBtYW5pcHR5cGUsCi0JICAgICBjb25zdCB1bmlvbiBpcF9jb25udHJhY2tfbWFuaXBfcHJvdG8gKm1pbiwKLQkgICAgIGNvbnN0IHVuaW9uIGlwX2Nvbm50cmFja19tYW5pcF9wcm90byAqbWF4KQotewotCV9fYmUxNiBwb3J0OwotCi0JaWYgKG1hbmlwdHlwZSA9PSBJUF9OQVRfTUFOSVBfU1JDKQotCQlwb3J0ID0gdHVwbGUtPnNyYy51LnRjcC5wb3J0OwotCWVsc2UKLQkJcG9ydCA9IHR1cGxlLT5kc3QudS50Y3AucG9ydDsKLQotCXJldHVybiBudG9ocyhwb3J0KSA+PSBudG9ocyhtaW4tPnRjcC5wb3J0KQotCQkmJiBudG9ocyhwb3J0KSA8PSBudG9ocyhtYXgtPnRjcC5wb3J0KTsKLX0KLQotc3RhdGljIGludAotdGNwX3VuaXF1ZV90dXBsZShzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0dXBsZSwKLQkJIGNvbnN0IHN0cnVjdCBpcF9uYXRfcmFuZ2UgKnJhbmdlLAotCQkgZW51bSBpcF9uYXRfbWFuaXBfdHlwZSBtYW5pcHR5cGUsCi0JCSBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjb25udHJhY2spCi17Ci0Jc3RhdGljIHVfaW50MTZfdCBwb3J0OwotCV9fYmUxNiAqcG9ydHB0cjsKLQl1bnNpZ25lZCBpbnQgcmFuZ2Vfc2l6ZSwgbWluLCBpOwotCi0JaWYgKG1hbmlwdHlwZSA9PSBJUF9OQVRfTUFOSVBfU1JDKQotCQlwb3J0cHRyID0gJnR1cGxlLT5zcmMudS50Y3AucG9ydDsKLQllbHNlCi0JCXBvcnRwdHIgPSAmdHVwbGUtPmRzdC51LnRjcC5wb3J0OwotCi0JLyogSWYgbm8gcmFuZ2Ugc3BlY2lmaWVkLi4uICovCi0JaWYgKCEocmFuZ2UtPmZsYWdzICYgSVBfTkFUX1JBTkdFX1BST1RPX1NQRUNJRklFRCkpIHsKLQkJLyogSWYgaXQncyBkc3QgcmV3cml0ZSwgY2FuJ3QgY2hhbmdlIHBvcnQgKi8KLQkJaWYgKG1hbmlwdHlwZSA9PSBJUF9OQVRfTUFOSVBfRFNUKQotCQkJcmV0dXJuIDA7Ci0KLQkJLyogTWFwIHByaXZpbGVnZWQgb250byBwcml2aWxlZ2VkLiAqLwotCQlpZiAobnRvaHMoKnBvcnRwdHIpIDwgMTAyNCkgewotCQkJLyogTG9vc2UgY29udmVudGlvbjogPj4gNTEyIGlzIGNyZWRlbnRpYWwgcGFzc2luZyAqLwotCQkJaWYgKG50b2hzKCpwb3J0cHRyKTw1MTIpIHsKLQkJCQltaW4gPSAxOwotCQkJCXJhbmdlX3NpemUgPSA1MTEgLSBtaW4gKyAxOwotCQkJfSBlbHNlIHsKLQkJCQltaW4gPSA2MDA7Ci0JCQkJcmFuZ2Vfc2l6ZSA9IDEwMjMgLSBtaW4gKyAxOwotCQkJfQotCQl9IGVsc2UgewotCQkJbWluID0gMTAyNDsKLQkJCXJhbmdlX3NpemUgPSA2NTUzNSAtIDEwMjQgKyAxOwotCQl9Ci0JfSBlbHNlIHsKLQkJbWluID0gbnRvaHMocmFuZ2UtPm1pbi50Y3AucG9ydCk7Ci0JCXJhbmdlX3NpemUgPSBudG9ocyhyYW5nZS0+bWF4LnRjcC5wb3J0KSAtIG1pbiArIDE7Ci0JfQotCi0JLyogU3RhcnQgZnJvbSByYW5kb20gcG9ydCB0byBhdm9pZCBwcmVkaWN0aW9uICovCi0JaWYgKHJhbmdlLT5mbGFncyAmIElQX05BVF9SQU5HRV9QUk9UT19SQU5ET00pCi0JCXBvcnQgPSAgbmV0X3JhbmRvbSgpOwotCi0JZm9yIChpID0gMDsgaSA8IHJhbmdlX3NpemU7IGkrKywgcG9ydCsrKSB7Ci0JCSpwb3J0cHRyID0gaHRvbnMobWluICsgcG9ydCAlIHJhbmdlX3NpemUpOwotCQlpZiAoIWlwX25hdF91c2VkX3R1cGxlKHR1cGxlLCBjb25udHJhY2spKSB7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotdGNwX21hbmlwX3BrdChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCi0JICAgICAgdW5zaWduZWQgaW50IGlwaGRyb2ZmLAotCSAgICAgIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnR1cGxlLAotCSAgICAgIGVudW0gaXBfbmF0X21hbmlwX3R5cGUgbWFuaXB0eXBlKQotewotCXN0cnVjdCBpcGhkciAqaXBoID0gKHN0cnVjdCBpcGhkciAqKSgoKnBza2IpLT5kYXRhICsgaXBoZHJvZmYpOwotCXN0cnVjdCB0Y3BoZHIgKmhkcjsKLQl1bnNpZ25lZCBpbnQgaGRyb2ZmID0gaXBoZHJvZmYgKyBpcGgtPmlobCo0OwotCV9fYmUzMiBvbGRpcCwgbmV3aXA7Ci0JX19iZTE2ICpwb3J0cHRyLCBuZXdwb3J0LCBvbGRwb3J0OwotCWludCBoZHJzaXplID0gODsgLyogVENQIGNvbm5lY3Rpb24gdHJhY2tpbmcgZ3VhcmFudGVlcyB0aGlzIG11Y2ggKi8KLQotCS8qIHRoaXMgY291bGQgYmUgYSBpbm5lciBoZWFkZXIgcmV0dXJuZWQgaW4gaWNtcCBwYWNrZXQ7IGluIHN1Y2gKLQkgICBjYXNlcyB3ZSBjYW5ub3QgdXBkYXRlIHRoZSBjaGVja3N1bSBmaWVsZCBzaW5jZSBpdCBpcyBvdXRzaWRlIG9mCi0JICAgdGhlIDggYnl0ZXMgb2YgdHJhbnNwb3J0IGxheWVyIGhlYWRlcnMgd2UgYXJlIGd1YXJhbnRlZWQgKi8KLQlpZiAoKCpwc2tiKS0+bGVuID49IGhkcm9mZiArIHNpemVvZihzdHJ1Y3QgdGNwaGRyKSkKLQkJaGRyc2l6ZSA9IHNpemVvZihzdHJ1Y3QgdGNwaGRyKTsKLQotCWlmICghc2tiX21ha2Vfd3JpdGFibGUocHNrYiwgaGRyb2ZmICsgaGRyc2l6ZSkpCi0JCXJldHVybiAwOwotCi0JaXBoID0gKHN0cnVjdCBpcGhkciAqKSgoKnBza2IpLT5kYXRhICsgaXBoZHJvZmYpOwotCWhkciA9IChzdHJ1Y3QgdGNwaGRyICopKCgqcHNrYiktPmRhdGEgKyBoZHJvZmYpOwotCi0JaWYgKG1hbmlwdHlwZSA9PSBJUF9OQVRfTUFOSVBfU1JDKSB7Ci0JCS8qIEdldCByaWQgb2Ygc3JjIGlwIGFuZCBzcmMgcHQgKi8KLQkJb2xkaXAgPSBpcGgtPnNhZGRyOwotCQluZXdpcCA9IHR1cGxlLT5zcmMuaXA7Ci0JCW5ld3BvcnQgPSB0dXBsZS0+c3JjLnUudGNwLnBvcnQ7Ci0JCXBvcnRwdHIgPSAmaGRyLT5zb3VyY2U7Ci0JfSBlbHNlIHsKLQkJLyogR2V0IHJpZCBvZiBkc3QgaXAgYW5kIGRzdCBwdCAqLwotCQlvbGRpcCA9IGlwaC0+ZGFkZHI7Ci0JCW5ld2lwID0gdHVwbGUtPmRzdC5pcDsKLQkJbmV3cG9ydCA9IHR1cGxlLT5kc3QudS50Y3AucG9ydDsKLQkJcG9ydHB0ciA9ICZoZHItPmRlc3Q7Ci0JfQotCi0Jb2xkcG9ydCA9ICpwb3J0cHRyOwotCSpwb3J0cHRyID0gbmV3cG9ydDsKLQotCWlmIChoZHJzaXplIDwgc2l6ZW9mKCpoZHIpKQotCQlyZXR1cm4gMTsKLQotCW5mX3Byb3RvX2NzdW1fcmVwbGFjZTQoJmhkci0+Y2hlY2ssICpwc2tiLCBvbGRpcCwgbmV3aXAsIDEpOwotCW5mX3Byb3RvX2NzdW1fcmVwbGFjZTIoJmhkci0+Y2hlY2ssICpwc2tiLCBvbGRwb3J0LCBuZXdwb3J0LCAwKTsKLQlyZXR1cm4gMTsKLX0KLQotc3RydWN0IGlwX25hdF9wcm90b2NvbCBpcF9uYXRfcHJvdG9jb2xfdGNwID0gewotCS5uYW1lCQkJPSAiVENQIiwKLQkucHJvdG9udW0JCT0gSVBQUk9UT19UQ1AsCi0JLm1lCQkJPSBUSElTX01PRFVMRSwKLQkubWFuaXBfcGt0CQk9IHRjcF9tYW5pcF9wa3QsCi0JLmluX3JhbmdlCQk9IHRjcF9pbl9yYW5nZSwKLQkudW5pcXVlX3R1cGxlCQk9IHRjcF91bmlxdWVfdHVwbGUsCi0jaWYgZGVmaW5lZChDT05GSUdfSVBfTkZfQ09OTlRSQUNLX05FVExJTkspIHx8IFwKLSAgICBkZWZpbmVkKENPTkZJR19JUF9ORl9DT05OVFJBQ0tfTkVUTElOS19NT0RVTEUpCi0JLnJhbmdlX3RvX25mYXR0cgk9IGlwX25hdF9wb3J0X3JhbmdlX3RvX25mYXR0ciwKLQkubmZhdHRyX3RvX3JhbmdlCT0gaXBfbmF0X3BvcnRfbmZhdHRyX3RvX3JhbmdlLAotI2VuZGlmCi19OwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9wcm90b191ZHAuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfcHJvdG9fdWRwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmZDUyMTYuLjAwMDAwMDAKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9wcm90b191ZHAuYworKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKiAoQykgMTk5OS0yMDAxIFBhdWwgYFJ1c3R5JyBSdXNzZWxsCi0gKiAoQykgMjAwMi0yMDA0IE5ldGZpbHRlciBDb3JlIFRlYW0gPGNvcmV0ZWFtQG5ldGZpbHRlci5vcmc+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvaXAuaD4KLSNpbmNsdWRlIDxsaW51eC91ZHAuaD4KLSNpbmNsdWRlIDxsaW51eC9pZi5oPgotCi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0X2NvcmUuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9uYXRfcnVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdF9wcm90b2NvbC5oPgotCi1zdGF0aWMgaW50Ci11ZHBfaW5fcmFuZ2UoY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja190dXBsZSAqdHVwbGUsCi0JICAgICBlbnVtIGlwX25hdF9tYW5pcF90eXBlIG1hbmlwdHlwZSwKLQkgICAgIGNvbnN0IHVuaW9uIGlwX2Nvbm50cmFja19tYW5pcF9wcm90byAqbWluLAotCSAgICAgY29uc3QgdW5pb24gaXBfY29ubnRyYWNrX21hbmlwX3Byb3RvICptYXgpCi17Ci0JX19iZTE2IHBvcnQ7Ci0KLQlpZiAobWFuaXB0eXBlID09IElQX05BVF9NQU5JUF9TUkMpCi0JCXBvcnQgPSB0dXBsZS0+c3JjLnUudWRwLnBvcnQ7Ci0JZWxzZQotCQlwb3J0ID0gdHVwbGUtPmRzdC51LnVkcC5wb3J0OwotCi0JcmV0dXJuIG50b2hzKHBvcnQpID49IG50b2hzKG1pbi0+dWRwLnBvcnQpCi0JCSYmIG50b2hzKHBvcnQpIDw9IG50b2hzKG1heC0+dWRwLnBvcnQpOwotfQotCi1zdGF0aWMgaW50Ci11ZHBfdW5pcXVlX3R1cGxlKHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnR1cGxlLAotCQkgY29uc3Qgc3RydWN0IGlwX25hdF9yYW5nZSAqcmFuZ2UsCi0JCSBlbnVtIGlwX25hdF9tYW5pcF90eXBlIG1hbmlwdHlwZSwKLQkJIGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2sgKmNvbm50cmFjaykKLXsKLQlzdGF0aWMgdV9pbnQxNl90IHBvcnQ7Ci0JX19iZTE2ICpwb3J0cHRyOwotCXVuc2lnbmVkIGludCByYW5nZV9zaXplLCBtaW4sIGk7Ci0KLQlpZiAobWFuaXB0eXBlID09IElQX05BVF9NQU5JUF9TUkMpCi0JCXBvcnRwdHIgPSAmdHVwbGUtPnNyYy51LnVkcC5wb3J0OwotCWVsc2UKLQkJcG9ydHB0ciA9ICZ0dXBsZS0+ZHN0LnUudWRwLnBvcnQ7Ci0KLQkvKiBJZiBubyByYW5nZSBzcGVjaWZpZWQuLi4gKi8KLQlpZiAoIShyYW5nZS0+ZmxhZ3MgJiBJUF9OQVRfUkFOR0VfUFJPVE9fU1BFQ0lGSUVEKSkgewotCQkvKiBJZiBpdCdzIGRzdCByZXdyaXRlLCBjYW4ndCBjaGFuZ2UgcG9ydCAqLwotCQlpZiAobWFuaXB0eXBlID09IElQX05BVF9NQU5JUF9EU1QpCi0JCQlyZXR1cm4gMDsKLQotCQlpZiAobnRvaHMoKnBvcnRwdHIpIDwgMTAyNCkgewotCQkJLyogTG9vc2UgY29udmVudGlvbjogPj4gNTEyIGlzIGNyZWRlbnRpYWwgcGFzc2luZyAqLwotCQkJaWYgKG50b2hzKCpwb3J0cHRyKTw1MTIpIHsKLQkJCQltaW4gPSAxOwotCQkJCXJhbmdlX3NpemUgPSA1MTEgLSBtaW4gKyAxOwotCQkJfSBlbHNlIHsKLQkJCQltaW4gPSA2MDA7Ci0JCQkJcmFuZ2Vfc2l6ZSA9IDEwMjMgLSBtaW4gKyAxOwotCQkJfQotCQl9IGVsc2UgewotCQkJbWluID0gMTAyNDsKLQkJCXJhbmdlX3NpemUgPSA2NTUzNSAtIDEwMjQgKyAxOwotCQl9Ci0JfSBlbHNlIHsKLQkJbWluID0gbnRvaHMocmFuZ2UtPm1pbi51ZHAucG9ydCk7Ci0JCXJhbmdlX3NpemUgPSBudG9ocyhyYW5nZS0+bWF4LnVkcC5wb3J0KSAtIG1pbiArIDE7Ci0JfQotCi0JLyogU3RhcnQgZnJvbSByYW5kb20gcG9ydCB0byBhdm9pZCBwcmVkaWN0aW9uICovCi0JaWYgKHJhbmdlLT5mbGFncyAmIElQX05BVF9SQU5HRV9QUk9UT19SQU5ET00pCi0JCXBvcnQgPSBuZXRfcmFuZG9tKCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgcmFuZ2Vfc2l6ZTsgaSsrLCBwb3J0KyspIHsKLQkJKnBvcnRwdHIgPSBodG9ucyhtaW4gKyBwb3J0ICUgcmFuZ2Vfc2l6ZSk7Ci0JCWlmICghaXBfbmF0X3VzZWRfdHVwbGUodHVwbGUsIGNvbm50cmFjaykpCi0JCQlyZXR1cm4gMTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLXVkcF9tYW5pcF9wa3Qoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAotCSAgICAgIHVuc2lnbmVkIGludCBpcGhkcm9mZiwKLQkgICAgICBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0dXBsZSwKLQkgICAgICBlbnVtIGlwX25hdF9tYW5pcF90eXBlIG1hbmlwdHlwZSkKLXsKLQlzdHJ1Y3QgaXBoZHIgKmlwaCA9IChzdHJ1Y3QgaXBoZHIgKikoKCpwc2tiKS0+ZGF0YSArIGlwaGRyb2ZmKTsKLQlzdHJ1Y3QgdWRwaGRyICpoZHI7Ci0JdW5zaWduZWQgaW50IGhkcm9mZiA9IGlwaGRyb2ZmICsgaXBoLT5paGwqNDsKLQlfX2JlMzIgb2xkaXAsIG5ld2lwOwotCV9fYmUxNiAqcG9ydHB0ciwgbmV3cG9ydDsKLQotCWlmICghc2tiX21ha2Vfd3JpdGFibGUocHNrYiwgaGRyb2ZmICsgc2l6ZW9mKCpoZHIpKSkKLQkJcmV0dXJuIDA7Ci0KLQlpcGggPSAoc3RydWN0IGlwaGRyICopKCgqcHNrYiktPmRhdGEgKyBpcGhkcm9mZik7Ci0JaGRyID0gKHN0cnVjdCB1ZHBoZHIgKikoKCpwc2tiKS0+ZGF0YSArIGhkcm9mZik7Ci0KLQlpZiAobWFuaXB0eXBlID09IElQX05BVF9NQU5JUF9TUkMpIHsKLQkJLyogR2V0IHJpZCBvZiBzcmMgaXAgYW5kIHNyYyBwdCAqLwotCQlvbGRpcCA9IGlwaC0+c2FkZHI7Ci0JCW5ld2lwID0gdHVwbGUtPnNyYy5pcDsKLQkJbmV3cG9ydCA9IHR1cGxlLT5zcmMudS51ZHAucG9ydDsKLQkJcG9ydHB0ciA9ICZoZHItPnNvdXJjZTsKLQl9IGVsc2UgewotCQkvKiBHZXQgcmlkIG9mIGRzdCBpcCBhbmQgZHN0IHB0ICovCi0JCW9sZGlwID0gaXBoLT5kYWRkcjsKLQkJbmV3aXAgPSB0dXBsZS0+ZHN0LmlwOwotCQluZXdwb3J0ID0gdHVwbGUtPmRzdC51LnVkcC5wb3J0OwotCQlwb3J0cHRyID0gJmhkci0+ZGVzdDsKLQl9Ci0KLQlpZiAoaGRyLT5jaGVjayB8fCAoKnBza2IpLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCkgewotCQluZl9wcm90b19jc3VtX3JlcGxhY2U0KCZoZHItPmNoZWNrLCAqcHNrYiwgb2xkaXAsIG5ld2lwLCAxKTsKLQkJbmZfcHJvdG9fY3N1bV9yZXBsYWNlMigmaGRyLT5jaGVjaywgKnBza2IsICpwb3J0cHRyLCBuZXdwb3J0LCAwKTsKLQkJaWYgKCFoZHItPmNoZWNrKQotCQkJaGRyLT5jaGVjayA9IENTVU1fTUFOR0xFRF8wOwotCX0KLQkqcG9ydHB0ciA9IG5ld3BvcnQ7Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0cnVjdCBpcF9uYXRfcHJvdG9jb2wgaXBfbmF0X3Byb3RvY29sX3VkcCA9IHsKLQkubmFtZQkJCT0gIlVEUCIsCi0JLnByb3RvbnVtCQk9IElQUFJPVE9fVURQLAotCS5tZQkJCT0gVEhJU19NT0RVTEUsCi0JLm1hbmlwX3BrdAkJPSB1ZHBfbWFuaXBfcGt0LAotCS5pbl9yYW5nZQkJPSB1ZHBfaW5fcmFuZ2UsCi0JLnVuaXF1ZV90dXBsZQkJPSB1ZHBfdW5pcXVlX3R1cGxlLAotI2lmIGRlZmluZWQoQ09ORklHX0lQX05GX0NPTk5UUkFDS19ORVRMSU5LKSB8fCBcCi0gICAgZGVmaW5lZChDT05GSUdfSVBfTkZfQ09OTlRSQUNLX05FVExJTktfTU9EVUxFKQotCS5yYW5nZV90b19uZmF0dHIJPSBpcF9uYXRfcG9ydF9yYW5nZV90b19uZmF0dHIsCi0JLm5mYXR0cl90b19yYW5nZQk9IGlwX25hdF9wb3J0X25mYXR0cl90b19yYW5nZSwKLSNlbmRpZgotfTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfcHJvdG9fdW5rbm93bi5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9wcm90b191bmtub3duLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiZjA0OTUuLjAwMDAwMDAKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9wcm90b191bmtub3duLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKiBUaGUgInVua25vd24iIHByb3RvY29sLiAgVGhpcyBpcyB3aGF0IGlzIHVzZWQgZm9yIHByb3RvY29scyB3ZQotICogZG9uJ3QgdW5kZXJzdGFuZC4gIEl0J3MgcmV0dXJuZWQgYnkgaXBfY3RfZmluZF9wcm90bygpLgotICovCi0KLS8qIChDKSAxOTk5LTIwMDEgUGF1bCBgUnVzdHknIFJ1c3NlbGwKLSAqIChDKSAyMDAyLTIwMDQgTmV0ZmlsdGVyIENvcmUgVGVhbSA8Y29yZXRlYW1AbmV0ZmlsdGVyLm9yZz4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9pZi5oPgotCi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0X3J1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9uYXRfcHJvdG9jb2wuaD4KLQotc3RhdGljIGludCB1bmtub3duX2luX3JhbmdlKGNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnR1cGxlLAotCQkJICAgIGVudW0gaXBfbmF0X21hbmlwX3R5cGUgbWFuaXBfdHlwZSwKLQkJCSAgICBjb25zdCB1bmlvbiBpcF9jb25udHJhY2tfbWFuaXBfcHJvdG8gKm1pbiwKLQkJCSAgICBjb25zdCB1bmlvbiBpcF9jb25udHJhY2tfbWFuaXBfcHJvdG8gKm1heCkKLXsKLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCB1bmtub3duX3VuaXF1ZV90dXBsZShzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0dXBsZSwKLQkJCQljb25zdCBzdHJ1Y3QgaXBfbmF0X3JhbmdlICpyYW5nZSwKLQkJCQllbnVtIGlwX25hdF9tYW5pcF90eXBlIG1hbmlwdHlwZSwKLQkJCQljb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjb25udHJhY2spCi17Ci0JLyogU29ycnk6IHdlIGNhbid0IGhlbHAgeW91OyBpZiBpdCdzIG5vdCB1bmlxdWUsIHdlIGNhbid0IGZyb2IKLQkgICBhbnl0aGluZy4gKi8KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotdW5rbm93bl9tYW5pcF9wa3Qoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAotCQkgIHVuc2lnbmVkIGludCBpcGhkcm9mZiwKLQkJICBjb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0dXBsZSwKLQkJICBlbnVtIGlwX25hdF9tYW5pcF90eXBlIG1hbmlwdHlwZSkKLXsKLQlyZXR1cm4gMTsKLX0KLQotc3RydWN0IGlwX25hdF9wcm90b2NvbCBpcF9uYXRfdW5rbm93bl9wcm90b2NvbCA9IHsKLQkubmFtZQkJCT0gInVua25vd24iLAotCS8qIC5tZSBpc24ndCBzZXQ6IGdldHRpbmcgYSByZWYgdG8gdGhpcyBjYW5ub3QgZmFpbC4gKi8KLQkubWFuaXBfcGt0CQk9IHVua25vd25fbWFuaXBfcGt0LAotCS5pbl9yYW5nZQkJPSB1bmtub3duX2luX3JhbmdlLAotCS51bmlxdWVfdHVwbGUJCT0gdW5rbm93bl91bmlxdWVfdHVwbGUsCi19OwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9ydWxlLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3J1bGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDgwZWIxZC4uMDAwMDAwMAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3J1bGUuYworKysgL2Rldi9udWxsCkBAIC0xLDMxNCArMCwwIEBACi0vKiAoQykgMTk5OS0yMDAxIFBhdWwgYFJ1c3R5JyBSdXNzZWxsCi0gKiAoQykgMjAwMi0yMDA0IE5ldGZpbHRlciBDb3JlIFRlYW0gPGNvcmV0ZWFtQG5ldGZpbHRlci5vcmc+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotCi0vKiBFdmVyeXRoaW5nIGFib3V0IHRoZSBydWxlcyBmb3IgTkFULiAqLwotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvaXAuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KLSNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLSNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+Ci0jaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+Ci0jaW5jbHVkZSA8bmV0L3JvdXRlLmg+Ci0jaW5jbHVkZSA8bGludXgvYml0b3BzLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9uYXQuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9uYXRfY29yZS5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdF9ydWxlLmg+Ci0KLSNpZiAwCi0jZGVmaW5lIERFQlVHUCBwcmludGsKLSNlbHNlCi0jZGVmaW5lIERFQlVHUChmb3JtYXQsIGFyZ3MuLi4pCi0jZW5kaWYKLQotI2RlZmluZSBOQVRfVkFMSURfSE9PS1MgKCgxPDxORl9JUF9QUkVfUk9VVElORykgfCAoMTw8TkZfSVBfUE9TVF9ST1VUSU5HKSB8ICgxPDxORl9JUF9MT0NBTF9PVVQpKQotCi1zdGF0aWMgc3RydWN0Ci17Ci0Jc3RydWN0IGlwdF9yZXBsYWNlIHJlcGw7Ci0Jc3RydWN0IGlwdF9zdGFuZGFyZCBlbnRyaWVzWzNdOwotCXN0cnVjdCBpcHRfZXJyb3IgdGVybTsKLX0gbmF0X2luaXRpYWxfdGFibGUgX19pbml0ZGF0YQotPSB7IHsgIm5hdCIsIE5BVF9WQUxJRF9IT09LUywgNCwKLSAgICAgIHNpemVvZihzdHJ1Y3QgaXB0X3N0YW5kYXJkKSAqIDMgKyBzaXplb2Yoc3RydWN0IGlwdF9lcnJvciksCi0gICAgICB7IFtORl9JUF9QUkVfUk9VVElOR10gPSAwLAotCVtORl9JUF9QT1NUX1JPVVRJTkddID0gc2l6ZW9mKHN0cnVjdCBpcHRfc3RhbmRhcmQpLAotCVtORl9JUF9MT0NBTF9PVVRdID0gc2l6ZW9mKHN0cnVjdCBpcHRfc3RhbmRhcmQpICogMiB9LAotICAgICAgeyBbTkZfSVBfUFJFX1JPVVRJTkddID0gMCwKLQlbTkZfSVBfUE9TVF9ST1VUSU5HXSA9IHNpemVvZihzdHJ1Y3QgaXB0X3N0YW5kYXJkKSwKLQlbTkZfSVBfTE9DQUxfT1VUXSA9IHNpemVvZihzdHJ1Y3QgaXB0X3N0YW5kYXJkKSAqIDIgfSwKLSAgICAgIDAsIE5VTEwsIHsgfSB9LAotICAgIHsKLQkgICAgLyogUFJFX1JPVVRJTkcgKi8KLQkgICAgeyB7IHsgeyAwIH0sIHsgMCB9LCB7IDAgfSwgeyAwIH0sICIiLCAiIiwgeyAwIH0sIHsgMCB9LCAwLCAwLCAwIH0sCi0JCTAsCi0JCXNpemVvZihzdHJ1Y3QgaXB0X2VudHJ5KSwKLQkJc2l6ZW9mKHN0cnVjdCBpcHRfc3RhbmRhcmQpLAotCQkwLCB7IDAsIDAgfSwgeyB9IH0sCi0JICAgICAgeyB7IHsgeyBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfc3RhbmRhcmRfdGFyZ2V0KSksICIiIH0gfSwgeyB9IH0sCi0JCS1ORl9BQ0NFUFQgLSAxIH0gfSwKLQkgICAgLyogUE9TVF9ST1VUSU5HICovCi0JICAgIHsgeyB7IHsgMCB9LCB7IDAgfSwgeyAwIH0sIHsgMCB9LCAiIiwgIiIsIHsgMCB9LCB7IDAgfSwgMCwgMCwgMCB9LAotCQkwLAotCQlzaXplb2Yoc3RydWN0IGlwdF9lbnRyeSksCi0JCXNpemVvZihzdHJ1Y3QgaXB0X3N0YW5kYXJkKSwKLQkJMCwgeyAwLCAwIH0sIHsgfSB9LAotCSAgICAgIHsgeyB7IHsgSVBUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXB0X3N0YW5kYXJkX3RhcmdldCkpLCAiIiB9IH0sIHsgfSB9LAotCQktTkZfQUNDRVBUIC0gMSB9IH0sCi0JICAgIC8qIExPQ0FMX09VVCAqLwotCSAgICB7IHsgeyB7IDAgfSwgeyAwIH0sIHsgMCB9LCB7IDAgfSwgIiIsICIiLCB7IDAgfSwgeyAwIH0sIDAsIDAsIDAgfSwKLQkJMCwKLQkJc2l6ZW9mKHN0cnVjdCBpcHRfZW50cnkpLAotCQlzaXplb2Yoc3RydWN0IGlwdF9zdGFuZGFyZCksCi0JCTAsIHsgMCwgMCB9LCB7IH0gfSwKLQkgICAgICB7IHsgeyB7IElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF9zdGFuZGFyZF90YXJnZXQpKSwgIiIgfSB9LCB7IH0gfSwKLQkJLU5GX0FDQ0VQVCAtIDEgfSB9Ci0gICAgfSwKLSAgICAvKiBFUlJPUiAqLwotICAgIHsgeyB7IHsgMCB9LCB7IDAgfSwgeyAwIH0sIHsgMCB9LCAiIiwgIiIsIHsgMCB9LCB7IDAgfSwgMCwgMCwgMCB9LAotCTAsCi0Jc2l6ZW9mKHN0cnVjdCBpcHRfZW50cnkpLAotCXNpemVvZihzdHJ1Y3QgaXB0X2Vycm9yKSwKLQkwLCB7IDAsIDAgfSwgeyB9IH0sCi0gICAgICB7IHsgeyB7IElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF9lcnJvcl90YXJnZXQpKSwgSVBUX0VSUk9SX1RBUkdFVCB9IH0sCi0JICB7IH0gfSwKLQkiRVJST1IiCi0gICAgICB9Ci0gICAgfQotfTsKLQotc3RhdGljIHN0cnVjdCB4dF90YWJsZSBuYXRfdGFibGUgPSB7Ci0JLm5hbWUJCT0gIm5hdCIsCi0JLnZhbGlkX2hvb2tzCT0gTkFUX1ZBTElEX0hPT0tTLAotCS5sb2NrCQk9IFJXX0xPQ0tfVU5MT0NLRUQsCi0JLm1lCQk9IFRISVNfTU9EVUxFLAotCS5hZgkJPSBBRl9JTkVULAotfTsKLQotLyogU291cmNlIE5BVCAqLwotc3RhdGljIHVuc2lnbmVkIGludCBpcHRfc25hdF90YXJnZXQoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAotCQkJCSAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0JCQkJICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0JCQkJICAgIHVuc2lnbmVkIGludCBob29rbnVtLAotCQkJCSAgICBjb25zdCBzdHJ1Y3QgeHRfdGFyZ2V0ICp0YXJnZXQsCi0JCQkJICAgIGNvbnN0IHZvaWQgKnRhcmdpbmZvKQotewotCXN0cnVjdCBpcF9jb25udHJhY2sgKmN0OwotCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvOwotCWNvbnN0IHN0cnVjdCBpcF9uYXRfbXVsdGlfcmFuZ2VfY29tcGF0ICptciA9IHRhcmdpbmZvOwotCi0JSVBfTkZfQVNTRVJUKGhvb2tudW0gPT0gTkZfSVBfUE9TVF9ST1VUSU5HKTsKLQotCWN0ID0gaXBfY29ubnRyYWNrX2dldCgqcHNrYiwgJmN0aW5mbyk7Ci0KLQkvKiBDb25uZWN0aW9uIG11c3QgYmUgdmFsaWQgYW5kIG5ldy4gKi8KLQlJUF9ORl9BU1NFUlQoY3QgJiYgKGN0aW5mbyA9PSBJUF9DVF9ORVcgfHwgY3RpbmZvID09IElQX0NUX1JFTEFURUQKLQkJCSAgICB8fCBjdGluZm8gPT0gSVBfQ1RfUkVMQVRFRCArIElQX0NUX0lTX1JFUExZKSk7Ci0JSVBfTkZfQVNTRVJUKG91dCk7Ci0KLQlyZXR1cm4gaXBfbmF0X3NldHVwX2luZm8oY3QsICZtci0+cmFuZ2VbMF0sIGhvb2tudW0pOwotfQotCi0vKiBCZWZvcmUgMi42LjExIHdlIGRpZCBpbXBsaWNpdCBzb3VyY2UgTkFUIGlmIHJlcXVpcmVkLiBXYXJuIGFib3V0IGNoYW5nZS4gKi8KLXN0YXRpYyB2b2lkIHdhcm5faWZfZXh0cmFfbWFuZ2xlKF9fYmUzMiBkc3RpcCwgX19iZTMyIHNyY2lwKQotewotCXN0YXRpYyBpbnQgd2FybmVkID0gMDsKLQlzdHJ1Y3QgZmxvd2kgZmwgPSB7IC5ubF91ID0geyAuaXA0X3UgPSB7IC5kYWRkciA9IGRzdGlwIH0gfSB9OwotCXN0cnVjdCBydGFibGUgKnJ0OwotCi0JaWYgKGlwX3JvdXRlX291dHB1dF9rZXkoJnJ0LCAmZmwpICE9IDApCi0JCXJldHVybjsKLQotCWlmIChydC0+cnRfc3JjICE9IHNyY2lwICYmICF3YXJuZWQpIHsKLQkJcHJpbnRrKCJOQVQ6IG5vIGxvbmdlciBzdXBwb3J0IGltcGxpY2l0IHNvdXJjZSBsb2NhbCBOQVRcbiIpOwotCQlwcmludGsoIk5BVDogcGFja2V0IHNyYyAldS4ldS4ldS4ldSAtPiBkc3QgJXUuJXUuJXUuJXVcbiIsCi0JCSAgICAgICBOSVBRVUFEKHNyY2lwKSwgTklQUVVBRChkc3RpcCkpOwotCQl3YXJuZWQgPSAxOwotCX0KLQlpcF9ydF9wdXQocnQpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IGlwdF9kbmF0X3RhcmdldChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCi0JCQkJICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLQkJCQkgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLQkJCQkgICAgdW5zaWduZWQgaW50IGhvb2tudW0sCi0JCQkJICAgIGNvbnN0IHN0cnVjdCB4dF90YXJnZXQgKnRhcmdldCwKLQkJCQkgICAgY29uc3Qgdm9pZCAqdGFyZ2luZm8pCi17Ci0Jc3RydWN0IGlwX2Nvbm50cmFjayAqY3Q7Ci0JZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm87Ci0JY29uc3Qgc3RydWN0IGlwX25hdF9tdWx0aV9yYW5nZV9jb21wYXQgKm1yID0gdGFyZ2luZm87Ci0KLQlJUF9ORl9BU1NFUlQoaG9va251bSA9PSBORl9JUF9QUkVfUk9VVElORwotCQkgICAgIHx8IGhvb2tudW0gPT0gTkZfSVBfTE9DQUxfT1VUKTsKLQotCWN0ID0gaXBfY29ubnRyYWNrX2dldCgqcHNrYiwgJmN0aW5mbyk7Ci0KLQkvKiBDb25uZWN0aW9uIG11c3QgYmUgdmFsaWQgYW5kIG5ldy4gKi8KLQlJUF9ORl9BU1NFUlQoY3QgJiYgKGN0aW5mbyA9PSBJUF9DVF9ORVcgfHwgY3RpbmZvID09IElQX0NUX1JFTEFURUQpKTsKLQotCWlmIChob29rbnVtID09IE5GX0lQX0xPQ0FMX09VVAotCSAgICAmJiBtci0+cmFuZ2VbMF0uZmxhZ3MgJiBJUF9OQVRfUkFOR0VfTUFQX0lQUykKLQkJd2Fybl9pZl9leHRyYV9tYW5nbGUoKCpwc2tiKS0+bmguaXBoLT5kYWRkciwKLQkJCQkgICAgIG1yLT5yYW5nZVswXS5taW5faXApOwotCi0JcmV0dXJuIGlwX25hdF9zZXR1cF9pbmZvKGN0LCAmbXItPnJhbmdlWzBdLCBob29rbnVtKTsKLX0KLQotc3RhdGljIGludCBpcHRfc25hdF9jaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLQkJCSAgICAgICBjb25zdCB2b2lkICplbnRyeSwKLQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgeHRfdGFyZ2V0ICp0YXJnZXQsCi0JCQkgICAgICAgdm9pZCAqdGFyZ2luZm8sCi0JCQkgICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKLXsKLQlzdHJ1Y3QgaXBfbmF0X211bHRpX3JhbmdlX2NvbXBhdCAqbXIgPSB0YXJnaW5mbzsKLQotCS8qIE11c3QgYmUgYSB2YWxpZCByYW5nZSAqLwotCWlmIChtci0+cmFuZ2VzaXplICE9IDEpIHsKLQkJcHJpbnRrKCJTTkFUOiBtdWx0aXBsZSByYW5nZXMgbm8gbG9uZ2VyIHN1cHBvcnRlZFxuIik7Ci0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBpcHRfZG5hdF9jaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLQkJCSAgICAgICBjb25zdCB2b2lkICplbnRyeSwKLQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgeHRfdGFyZ2V0ICp0YXJnZXQsCi0JCQkgICAgICAgdm9pZCAqdGFyZ2luZm8sCi0JCQkgICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKLXsKLQlzdHJ1Y3QgaXBfbmF0X211bHRpX3JhbmdlX2NvbXBhdCAqbXIgPSB0YXJnaW5mbzsKLQotCS8qIE11c3QgYmUgYSB2YWxpZCByYW5nZSAqLwotCWlmIChtci0+cmFuZ2VzaXplICE9IDEpIHsKLQkJcHJpbnRrKCJETkFUOiBtdWx0aXBsZSByYW5nZXMgbm8gbG9uZ2VyIHN1cHBvcnRlZFxuIik7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAobXItPnJhbmdlWzBdLmZsYWdzICYgSVBfTkFUX1JBTkdFX1BST1RPX1JBTkRPTSkgewotCQlwcmludGsoIkROQVQ6IHBvcnQgcmFuZG9taXphdGlvbiBub3Qgc3VwcG9ydGVkXG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAxOwotfQotCi1pbmxpbmUgdW5zaWduZWQgaW50Ci1hbGxvY19udWxsX2JpbmRpbmcoc3RydWN0IGlwX2Nvbm50cmFjayAqY29ubnRyYWNrLAotCQkgICBzdHJ1Y3QgaXBfbmF0X2luZm8gKmluZm8sCi0JCSAgIHVuc2lnbmVkIGludCBob29rbnVtKQotewotCS8qIEZvcmNlIHJhbmdlIHRvIHRoaXMgSVA7IGxldCBwcm90byBkZWNpZGUgbWFwcGluZyBmb3IKLQkgICBwZXItcHJvdG8gcGFydHMgKGhlbmNlIG5vdCBJUF9OQVRfUkFOR0VfUFJPVE9fU1BFQ0lGSUVEKS4KLQkgICBVc2UgcmVwbHkgaW4gY2FzZSBpdCdzIGFscmVhZHkgYmVlbiBtYW5nbGVkIChlZyBsb2NhbCBwYWNrZXQpLgotCSovCi0JX19iZTMyIGlwCi0JCT0gKEhPT0syTUFOSVAoaG9va251bSkgPT0gSVBfTkFUX01BTklQX1NSQwotCQkgICA/IGNvbm50cmFjay0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0udHVwbGUuZHN0LmlwCi0JCSAgIDogY29ubnRyYWNrLT50dXBsZWhhc2hbSVBfQ1RfRElSX1JFUExZXS50dXBsZS5zcmMuaXApOwotCXN0cnVjdCBpcF9uYXRfcmFuZ2UgcmFuZ2UKLQkJPSB7IElQX05BVF9SQU5HRV9NQVBfSVBTLCBpcCwgaXAsIHsgMCB9LCB7IDAgfSB9OwotCi0JREVCVUdQKCJBbGxvY2F0aW5nIE5VTEwgYmluZGluZyBmb3IgJXAgKCV1LiV1LiV1LiV1KVxuIiwgY29ubnRyYWNrLAotCSAgICAgICBOSVBRVUFEKGlwKSk7Ci0JcmV0dXJuIGlwX25hdF9zZXR1cF9pbmZvKGNvbm50cmFjaywgJnJhbmdlLCBob29rbnVtKTsKLX0KLQotdW5zaWduZWQgaW50Ci1hbGxvY19udWxsX2JpbmRpbmdfY29uZmlybWVkKHN0cnVjdCBpcF9jb25udHJhY2sgKmNvbm50cmFjaywKLQkJCSAgICAgc3RydWN0IGlwX25hdF9pbmZvICppbmZvLAotCQkJICAgICB1bnNpZ25lZCBpbnQgaG9va251bSkKLXsKLQlfX2JlMzIgaXAKLQkJPSAoSE9PSzJNQU5JUChob29rbnVtKSA9PSBJUF9OQVRfTUFOSVBfU1JDCi0JCSAgID8gY29ubnRyYWNrLT50dXBsZWhhc2hbSVBfQ1RfRElSX1JFUExZXS50dXBsZS5kc3QuaXAKLQkJICAgOiBjb25udHJhY2stPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlLnNyYy5pcCk7Ci0JdV9pbnQxNl90IGFsbAotCQk9IChIT09LMk1BTklQKGhvb2tudW0pID09IElQX05BVF9NQU5JUF9TUkMKLQkJICAgPyBjb25udHJhY2stPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlLmRzdC51LmFsbAotCQkgICA6IGNvbm50cmFjay0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0udHVwbGUuc3JjLnUuYWxsKTsKLQlzdHJ1Y3QgaXBfbmF0X3JhbmdlIHJhbmdlCi0JCT0geyBJUF9OQVRfUkFOR0VfTUFQX0lQUywgaXAsIGlwLCB7IGFsbCB9LCB7IGFsbCB9IH07Ci0KLQlERUJVR1AoIkFsbG9jYXRpbmcgTlVMTCBiaW5kaW5nIGZvciBjb25maXJtZWQgJXAgKCV1LiV1LiV1LiV1KVxuIiwKLQkgICAgICAgY29ubnRyYWNrLCBOSVBRVUFEKGlwKSk7Ci0JcmV0dXJuIGlwX25hdF9zZXR1cF9pbmZvKGNvbm50cmFjaywgJnJhbmdlLCBob29rbnVtKTsKLX0KLQotaW50IGlwX25hdF9ydWxlX2ZpbmQoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAotCQkgICAgIHVuc2lnbmVkIGludCBob29rbnVtLAotCQkgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLQkJICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotCQkgICAgIHN0cnVjdCBpcF9jb25udHJhY2sgKmN0LAotCQkgICAgIHN0cnVjdCBpcF9uYXRfaW5mbyAqaW5mbykKLXsKLQlpbnQgcmV0OwotCi0JcmV0ID0gaXB0X2RvX3RhYmxlKHBza2IsIGhvb2tudW0sIGluLCBvdXQsICZuYXRfdGFibGUpOwotCi0JaWYgKHJldCA9PSBORl9BQ0NFUFQpIHsKLQkJaWYgKCFpcF9uYXRfaW5pdGlhbGl6ZWQoY3QsIEhPT0syTUFOSVAoaG9va251bSkpKQotCQkJLyogTlVMIG1hcHBpbmcgKi8KLQkJCXJldCA9IGFsbG9jX251bGxfYmluZGluZyhjdCwgaW5mbywgaG9va251bSk7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgeHRfdGFyZ2V0IGlwdF9zbmF0X3JlZyA9IHsKLQkubmFtZQkJPSAiU05BVCIsCi0JLmZhbWlseQkJPSBBRl9JTkVULAotCS50YXJnZXQJCT0gaXB0X3NuYXRfdGFyZ2V0LAotCS50YXJnZXRzaXplCT0gc2l6ZW9mKHN0cnVjdCBpcF9uYXRfbXVsdGlfcmFuZ2VfY29tcGF0KSwKLQkudGFibGUJCT0gIm5hdCIsCi0JLmhvb2tzCQk9IDEgPDwgTkZfSVBfUE9TVF9ST1VUSU5HLAotCS5jaGVja2VudHJ5CT0gaXB0X3NuYXRfY2hlY2tlbnRyeSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgeHRfdGFyZ2V0IGlwdF9kbmF0X3JlZyA9IHsKLQkubmFtZQkJPSAiRE5BVCIsCi0JLmZhbWlseQkJPSBBRl9JTkVULAotCS50YXJnZXQJCT0gaXB0X2RuYXRfdGFyZ2V0LAotCS50YXJnZXRzaXplCT0gc2l6ZW9mKHN0cnVjdCBpcF9uYXRfbXVsdGlfcmFuZ2VfY29tcGF0KSwKLQkudGFibGUJCT0gIm5hdCIsCi0JLmhvb2tzCQk9ICgxIDw8IE5GX0lQX1BSRV9ST1VUSU5HKSB8ICgxIDw8IE5GX0lQX0xPQ0FMX09VVCksCi0JLmNoZWNrZW50cnkJPSBpcHRfZG5hdF9jaGVja2VudHJ5LAotfTsKLQotaW50IF9faW5pdCBpcF9uYXRfcnVsZV9pbml0KHZvaWQpCi17Ci0JaW50IHJldDsKLQotCXJldCA9IGlwdF9yZWdpc3Rlcl90YWJsZSgmbmF0X3RhYmxlLCAmbmF0X2luaXRpYWxfdGFibGUucmVwbCk7Ci0JaWYgKHJldCAhPSAwKQotCQlyZXR1cm4gcmV0OwotCXJldCA9IHh0X3JlZ2lzdGVyX3RhcmdldCgmaXB0X3NuYXRfcmVnKTsKLQlpZiAocmV0ICE9IDApCi0JCWdvdG8gdW5yZWdpc3Rlcl90YWJsZTsKLQotCXJldCA9IHh0X3JlZ2lzdGVyX3RhcmdldCgmaXB0X2RuYXRfcmVnKTsKLQlpZiAocmV0ICE9IDApCi0JCWdvdG8gdW5yZWdpc3Rlcl9zbmF0OwotCi0JcmV0dXJuIHJldDsKLQotIHVucmVnaXN0ZXJfc25hdDoKLQl4dF91bnJlZ2lzdGVyX3RhcmdldCgmaXB0X3NuYXRfcmVnKTsKLSB1bnJlZ2lzdGVyX3RhYmxlOgotCXh0X3VucmVnaXN0ZXJfdGFibGUoJm5hdF90YWJsZSk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi12b2lkIGlwX25hdF9ydWxlX2NsZWFudXAodm9pZCkKLXsKLQl4dF91bnJlZ2lzdGVyX3RhcmdldCgmaXB0X2RuYXRfcmVnKTsKLQl4dF91bnJlZ2lzdGVyX3RhcmdldCgmaXB0X3NuYXRfcmVnKTsKLQlpcHRfdW5yZWdpc3Rlcl90YWJsZSgmbmF0X3RhYmxlKTsKLX0KZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfc2lwLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3NpcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjVjNWE5Li4wMDAwMDAwCi0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfc2lwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyODIgKzAsMCBAQAotLyogU0lQIGV4dGVuc2lvbiBmb3IgVURQIE5BVCBhbHRlcmF0aW9uLgotICoKLSAqIChDKSAyMDA1IGJ5IENocmlzdGlhbiBIZW50c2NoZWwgPGNoZW50c2NoZWxAYXJuZXQuY29tLmFyPgotICogYmFzZWQgb24gUlIncyBpcF9uYXRfZnRwLmMgYW5kIG90aGVyIG1vZHVsZXMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0jaW5jbHVkZSA8bGludXgvaXAuaD4KLSNpbmNsdWRlIDxsaW51eC91ZHAuaD4KLQotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0X2hlbHBlci5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19oZWxwZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfc2lwLmg+Ci0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9BVVRIT1IoIkNocmlzdGlhbiBIZW50c2NoZWwgPGNoZW50c2NoZWxAYXJuZXQuY29tLmFyPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJTSVAgTkFUIGhlbHBlciIpOwotCi0jaWYgMAotI2RlZmluZSBERUJVR1AgcHJpbnRrCi0jZWxzZQotI2RlZmluZSBERUJVR1AoZm9ybWF0LCBhcmdzLi4uKQotI2VuZGlmCi0KLXN0cnVjdCBhZGRyX21hcCB7Ci0Jc3RydWN0IHsKLQkJY2hhcgkJc3JjW3NpemVvZigibm5uLm5ubi5ubm4ubm5uOm5ubm5uIildOwotCQljaGFyCQlkc3Rbc2l6ZW9mKCJubm4ubm5uLm5ubi5ubm46bm5ubm4iKV07Ci0JCXVuc2lnbmVkIGludAlzcmNsZW4sIHNyY2lwbGVuOwotCQl1bnNpZ25lZCBpbnQJZHN0bGVuLCBkc3RpcGxlbjsKLQl9IGFkZHJbSVBfQ1RfRElSX01BWF07Ci19OwotCi1zdGF0aWMgdm9pZCBhZGRyX21hcF9pbml0KHN0cnVjdCBpcF9jb25udHJhY2sgKmN0LCBzdHJ1Y3QgYWRkcl9tYXAgKm1hcCkKLXsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0OwotCWVudW0gaXBfY29ubnRyYWNrX2RpciBkaXI7Ci0JdW5zaWduZWQgaW50IG47Ci0KLQlmb3IgKGRpciA9IDA7IGRpciA8IElQX0NUX0RJUl9NQVg7IGRpcisrKSB7Ci0JCXQgPSAmY3QtPnR1cGxlaGFzaFtkaXJdLnR1cGxlOwotCi0JCW4gPSBzcHJpbnRmKG1hcC0+YWRkcltkaXJdLnNyYywgIiV1LiV1LiV1LiV1IiwKLQkJCSAgICBOSVBRVUFEKHQtPnNyYy5pcCkpOwotCQltYXAtPmFkZHJbZGlyXS5zcmNpcGxlbiA9IG47Ci0JCW4gKz0gc3ByaW50ZihtYXAtPmFkZHJbZGlyXS5zcmMgKyBuLCAiOiV1IiwKLQkJCSAgICAgbnRvaHModC0+c3JjLnUudWRwLnBvcnQpKTsKLQkJbWFwLT5hZGRyW2Rpcl0uc3JjbGVuID0gbjsKLQotCQluID0gc3ByaW50ZihtYXAtPmFkZHJbZGlyXS5kc3QsICIldS4ldS4ldS4ldSIsCi0JCQkgICAgTklQUVVBRCh0LT5kc3QuaXApKTsKLQkJbWFwLT5hZGRyW2Rpcl0uZHN0aXBsZW4gPSBuOwotCQluICs9IHNwcmludGYobWFwLT5hZGRyW2Rpcl0uZHN0ICsgbiwgIjoldSIsCi0JCQkgICAgIG50b2hzKHQtPmRzdC51LnVkcC5wb3J0KSk7Ci0JCW1hcC0+YWRkcltkaXJdLmRzdGxlbiA9IG47Ci0JfQotfQotCi1zdGF0aWMgaW50IG1hcF9zaXBfYWRkcihzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAotCQkJc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsIGNvbnN0IGNoYXIgKipkcHRyLCBzaXplX3QgZGxlbiwKLQkJCWVudW0gc2lwX2hlYWRlcl9wb3MgcG9zLCBzdHJ1Y3QgYWRkcl9tYXAgKm1hcCkKLXsKLQllbnVtIGlwX2Nvbm50cmFja19kaXIgZGlyID0gQ1RJTkZPMkRJUihjdGluZm8pOwotCXVuc2lnbmVkIGludCBtYXRjaGxlbiwgbWF0Y2hvZmYsIGFkZHJsZW47Ci0JY2hhciAqYWRkcjsKLQotCWlmIChjdF9zaXBfZ2V0X2luZm8oKmRwdHIsIGRsZW4sICZtYXRjaG9mZiwgJm1hdGNobGVuLCBwb3MpIDw9IDApCi0JCXJldHVybiAxOwotCi0JaWYgKChtYXRjaGxlbiA9PSBtYXAtPmFkZHJbZGlyXS5zcmNpcGxlbiB8fAotCSAgICAgbWF0Y2hsZW4gPT0gbWFwLT5hZGRyW2Rpcl0uc3JjbGVuKSAmJgotCSAgICBtZW1jbXAoKmRwdHIgKyBtYXRjaG9mZiwgbWFwLT5hZGRyW2Rpcl0uc3JjLCBtYXRjaGxlbikgPT0gMCkgewotCQlhZGRyICAgID0gbWFwLT5hZGRyWyFkaXJdLmRzdDsKLQkJYWRkcmxlbiA9IG1hcC0+YWRkclshZGlyXS5kc3RsZW47Ci0JfSBlbHNlIGlmICgobWF0Y2hsZW4gPT0gbWFwLT5hZGRyW2Rpcl0uZHN0aXBsZW4gfHwKLQkJICAgIG1hdGNobGVuID09IG1hcC0+YWRkcltkaXJdLmRzdGxlbikgJiYKLQkJICAgbWVtY21wKCpkcHRyICsgbWF0Y2hvZmYsIG1hcC0+YWRkcltkaXJdLmRzdCwgbWF0Y2hsZW4pID09IDApIHsKLQkJYWRkciAgICA9IG1hcC0+YWRkclshZGlyXS5zcmM7Ci0JCWFkZHJsZW4gPSBtYXAtPmFkZHJbIWRpcl0uc3JjbGVuOwotCX0gZWxzZQotCQlyZXR1cm4gMTsKLQotCWlmICghaXBfbmF0X21hbmdsZV91ZHBfcGFja2V0KHBza2IsIGN0LCBjdGluZm8sCi0JCQkJICAgICAgbWF0Y2hvZmYsIG1hdGNobGVuLCBhZGRyLCBhZGRybGVuKSkKLQkJcmV0dXJuIDA7Ci0JKmRwdHIgPSAoKnBza2IpLT5kYXRhICsgKCpwc2tiKS0+bmguaXBoLT5paGwqNCArIHNpemVvZihzdHJ1Y3QgdWRwaGRyKTsKLQlyZXR1cm4gMTsKLQotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IGlwX25hdF9zaXAoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAotCQkJICAgICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAotCQkJICAgICAgIHN0cnVjdCBpcF9jb25udHJhY2sgKmN0LAotCQkJICAgICAgIGNvbnN0IGNoYXIgKipkcHRyKQotewotCWVudW0gc2lwX2hlYWRlcl9wb3MgcG9zOwotCXN0cnVjdCBhZGRyX21hcCBtYXA7Ci0JaW50IGRhdGFvZmYsIGRhdGFsZW47Ci0KLQlkYXRhb2ZmID0gKCpwc2tiKS0+bmguaXBoLT5paGwqNCArIHNpemVvZihzdHJ1Y3QgdWRwaGRyKTsKLQlkYXRhbGVuID0gKCpwc2tiKS0+bGVuIC0gZGF0YW9mZjsKLQlpZiAoZGF0YWxlbiA8IHNpemVvZigiU0lQLzIuMCIpIC0gMSkKLQkJcmV0dXJuIE5GX0RST1A7Ci0KLQlhZGRyX21hcF9pbml0KGN0LCAmbWFwKTsKLQotCS8qIEJhc2ljIHJ1bGVzOiByZXF1ZXN0cyBhbmQgcmVzcG9uc2VzLiAqLwotCWlmIChzdHJuY21wKCpkcHRyLCAiU0lQLzIuMCIsIHNpemVvZigiU0lQLzIuMCIpIC0gMSkgIT0gMCkgewotCQkvKiAxMC4yOiBDb25zdHJ1Y3RpbmcgdGhlIFJFR0lTVEVSIFJlcXVlc3Q6Ci0JCSAqCi0JCSAqIFRoZSAidXNlcmluZm8iIGFuZCAiQCIgY29tcG9uZW50cyBvZiB0aGUgU0lQIFVSSSBNVVNUIE5PVAotCQkgKiBiZSBwcmVzZW50LgotCQkgKi8KLQkJaWYgKGRhdGFsZW4gPj0gc2l6ZW9mKCJSRUdJU1RFUiIpIC0gMSAmJgotCQkgICAgc3RybmNtcCgqZHB0ciwgIlJFR0lTVEVSIiwgc2l6ZW9mKCJSRUdJU1RFUiIpIC0gMSkgPT0gMCkKLQkJCXBvcyA9IFBPU19SRUdfUkVRX1VSSTsKLQkJZWxzZQotCQkJcG9zID0gUE9TX1JFUV9VUkk7Ci0KLQkJaWYgKCFtYXBfc2lwX2FkZHIocHNrYiwgY3RpbmZvLCBjdCwgZHB0ciwgZGF0YWxlbiwgcG9zLCAmbWFwKSkKLQkJCXJldHVybiBORl9EUk9QOwotCX0KLQotCWlmICghbWFwX3NpcF9hZGRyKHBza2IsIGN0aW5mbywgY3QsIGRwdHIsIGRhdGFsZW4sIFBPU19GUk9NLCAmbWFwKSB8fAotCSAgICAhbWFwX3NpcF9hZGRyKHBza2IsIGN0aW5mbywgY3QsIGRwdHIsIGRhdGFsZW4sIFBPU19UTywgJm1hcCkgfHwKLQkgICAgIW1hcF9zaXBfYWRkcihwc2tiLCBjdGluZm8sIGN0LCBkcHRyLCBkYXRhbGVuLCBQT1NfVklBLCAmbWFwKSB8fAotCSAgICAhbWFwX3NpcF9hZGRyKHBza2IsIGN0aW5mbywgY3QsIGRwdHIsIGRhdGFsZW4sIFBPU19DT05UQUNULCAmbWFwKSkKLQkJcmV0dXJuIE5GX0RST1A7Ci0JcmV0dXJuIE5GX0FDQ0VQVDsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBtYW5nbGVfc2lwX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCi0JCQkJICAgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCi0JCQkJICAgICAgc3RydWN0IGlwX2Nvbm50cmFjayAqY3QsCi0JCQkJICAgICAgY29uc3QgY2hhciAqKmRwdHIsIHNpemVfdCBkbGVuLAotCQkJCSAgICAgIGNoYXIgKmJ1ZmZlciwgaW50IGJ1ZmZsZW4sCi0JCQkJICAgICAgZW51bSBzaXBfaGVhZGVyX3BvcyBwb3MpCi17Ci0JdW5zaWduZWQgaW50IG1hdGNobGVuLCBtYXRjaG9mZjsKLQotCWlmIChjdF9zaXBfZ2V0X2luZm8oKmRwdHIsIGRsZW4sICZtYXRjaG9mZiwgJm1hdGNobGVuLCBwb3MpIDw9IDApCi0JCXJldHVybiAwOwotCi0JaWYgKCFpcF9uYXRfbWFuZ2xlX3VkcF9wYWNrZXQocHNrYiwgY3QsIGN0aW5mbywKLQkJCQkgICAgICBtYXRjaG9mZiwgbWF0Y2hsZW4sIGJ1ZmZlciwgYnVmZmxlbikpCi0JCXJldHVybiAwOwotCi0JLyogV2UgbmVlZCB0byByZWxvYWQgdGhpcy4gVGhhbmtzIFBhdHJpY2suICovCi0JKmRwdHIgPSAoKnBza2IpLT5kYXRhICsgKCpwc2tiKS0+bmguaXBoLT5paGwqNCArIHNpemVvZihzdHJ1Y3QgdWRwaGRyKTsKLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBtYW5nbGVfY29udGVudF9sZW4oc3RydWN0IHNrX2J1ZmYgKipwc2tiLAotCQkJICAgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCi0JCQkgICAgICBzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKLQkJCSAgICAgIGNvbnN0IGNoYXIgKmRwdHIpCi17Ci0JdW5zaWduZWQgaW50IGRhdGFvZmYsIG1hdGNob2ZmLCBtYXRjaGxlbjsKLQljaGFyIGJ1ZmZlcltzaXplb2YoIjY1NTM2IildOwotCWludCBidWZmbGVuOwotCi0JZGF0YW9mZiA9ICgqcHNrYiktPm5oLmlwaC0+aWhsKjQgKyBzaXplb2Yoc3RydWN0IHVkcGhkcik7Ci0KLQkvKiBHZXQgYWN0dWFsIFNEUCBsZW5naHQgKi8KLQlpZiAoY3Rfc2lwX2dldF9pbmZvKGRwdHIsICgqcHNrYiktPmxlbiAtIGRhdGFvZmYsICZtYXRjaG9mZiwKLQkJCSAgICAmbWF0Y2hsZW4sIFBPU19TRFBfSEVBREVSKSA+IDApIHsKLQotCQkvKiBzaW5jZSBjdF9zaXBfZ2V0X2luZm8oKSBnaXZlIHVzIGEgcG9pbnRlciBwYXNzaW5nICd2PScKLQkJICAgd2UgbmVlZCB0byBhZGQgMiBieXRlcyBpbiB0aGlzIGNvdW50LiAqLwotCQlpbnQgY19sZW4gPSAoKnBza2IpLT5sZW4gLSBkYXRhb2ZmIC0gbWF0Y2hvZmYgKyAyOwotCi0JCS8qIE5vdywgdXBkYXRlIFNEUCBsZW5naHQgKi8KLQkJaWYgKGN0X3NpcF9nZXRfaW5mbyhkcHRyLCAoKnBza2IpLT5sZW4gLSBkYXRhb2ZmLCAmbWF0Y2hvZmYsCi0JCQkJICAgICZtYXRjaGxlbiwgUE9TX0NPTlRFTlQpID4gMCkgewotCi0JCQlidWZmbGVuID0gc3ByaW50ZihidWZmZXIsICIldSIsIGNfbGVuKTsKLQotCQkJcmV0dXJuIGlwX25hdF9tYW5nbGVfdWRwX3BhY2tldChwc2tiLCBjdCwgY3RpbmZvLAotCQkJCQkJCW1hdGNob2ZmLCBtYXRjaGxlbiwKLQkJCQkJCQlidWZmZXIsIGJ1ZmZsZW4pOwotCQl9Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IG1hbmdsZV9zZHAoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAotCQkJICAgICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAotCQkJICAgICAgIHN0cnVjdCBpcF9jb25udHJhY2sgKmN0LAotCQkJICAgICAgIF9fYmUzMiBuZXdpcCwgdV9pbnQxNl90IHBvcnQsCi0JCQkgICAgICAgY29uc3QgY2hhciAqZHB0cikKLXsKLQljaGFyIGJ1ZmZlcltzaXplb2YoIm5ubi5ubm4ubm5uLm5ubiIpXTsKLQl1bnNpZ25lZCBpbnQgZGF0YW9mZiwgYnVmZmxlbjsKLQotCWRhdGFvZmYgPSAoKnBza2IpLT5uaC5pcGgtPmlobCo0ICsgc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpOwotCi0JLyogTWFuZ2xlIG93bmVyIGFuZCBjb250YWN0IGluZm8uICovCi0JYnVmZmxlbiA9IHNwcmludGYoYnVmZmVyLCAiJXUuJXUuJXUuJXUiLCBOSVBRVUFEKG5ld2lwKSk7Ci0JaWYgKCFtYW5nbGVfc2lwX3BhY2tldChwc2tiLCBjdGluZm8sIGN0LCAmZHB0ciwgKCpwc2tiKS0+bGVuIC0gZGF0YW9mZiwKLQkJCSAgICAgICBidWZmZXIsIGJ1ZmZsZW4sIFBPU19PV05FUikpCi0JCXJldHVybiAwOwotCi0JaWYgKCFtYW5nbGVfc2lwX3BhY2tldChwc2tiLCBjdGluZm8sIGN0LCAmZHB0ciwgKCpwc2tiKS0+bGVuIC0gZGF0YW9mZiwKLQkJCSAgICAgICBidWZmZXIsIGJ1ZmZsZW4sIFBPU19DT05ORUNUSU9OKSkKLQkJcmV0dXJuIDA7Ci0KLQkvKiBNYW5nbGUgbWVkaWEgcG9ydC4gKi8KLQlidWZmbGVuID0gc3ByaW50ZihidWZmZXIsICIldSIsIHBvcnQpOwotCWlmICghbWFuZ2xlX3NpcF9wYWNrZXQocHNrYiwgY3RpbmZvLCBjdCwgJmRwdHIsICgqcHNrYiktPmxlbiAtIGRhdGFvZmYsCi0JCQkgICAgICAgYnVmZmVyLCBidWZmbGVuLCBQT1NfTUVESUEpKQotCQlyZXR1cm4gMDsKLQotCXJldHVybiBtYW5nbGVfY29udGVudF9sZW4ocHNrYiwgY3RpbmZvLCBjdCwgZHB0cik7Ci19Ci0KLS8qIFNvLCB0aGlzIHBhY2tldCBoYXMgaGl0IHRoZSBjb25uZWN0aW9uIHRyYWNraW5nIG1hdGNoaW5nIGNvZGUuCi0gICBNYW5nbGUgaXQsIGFuZCBjaGFuZ2UgdGhlIGV4cGVjdGF0aW9uIHRvIG1hdGNoIHRoZSBuZXcgdmVyc2lvbi4gKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgaXBfbmF0X3NkcChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCi0JCQkgICAgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCi0JCQkgICAgICAgc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmV4cCwKLQkJCSAgICAgICBjb25zdCBjaGFyICpkcHRyKQotewotCXN0cnVjdCBpcF9jb25udHJhY2sgKmN0ID0gZXhwLT5tYXN0ZXI7Ci0JZW51bSBpcF9jb25udHJhY2tfZGlyIGRpciA9IENUSU5GTzJESVIoY3RpbmZvKTsKLQlfX2JlMzIgbmV3aXA7Ci0JdV9pbnQxNl90IHBvcnQ7Ci0KLQlERUJVR1AoImlwX25hdF9zZHAoKTpcbiIpOwotCi0JLyogQ29ubmVjdGlvbiB3aWxsIGNvbWUgZnJvbSByZXBseSAqLwotCW5ld2lwID0gY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5kc3QuaXA7Ci0KLQlleHAtPnR1cGxlLmRzdC5pcCA9IG5ld2lwOwotCWV4cC0+c2F2ZWRfcHJvdG8udWRwLnBvcnQgPSBleHAtPnR1cGxlLmRzdC51LnVkcC5wb3J0OwotCWV4cC0+ZGlyID0gIWRpcjsKLQotCS8qIFdoZW4geW91IHNlZSB0aGUgcGFja2V0LCB3ZSBuZWVkIHRvIE5BVCBpdCB0aGUgc2FtZSBhcyB0aGUKLQkgICB0aGlzIG9uZS4gKi8KLQlleHAtPmV4cGVjdGZuID0gaXBfbmF0X2ZvbGxvd19tYXN0ZXI7Ci0KLQkvKiBUcnkgdG8gZ2V0IHNhbWUgcG9ydDogaWYgbm90LCB0cnkgdG8gY2hhbmdlIGl0LiAqLwotCWZvciAocG9ydCA9IG50b2hzKGV4cC0+c2F2ZWRfcHJvdG8udWRwLnBvcnQpOyBwb3J0ICE9IDA7IHBvcnQrKykgewotCQlleHAtPnR1cGxlLmRzdC51LnVkcC5wb3J0ID0gaHRvbnMocG9ydCk7Ci0JCWlmIChpcF9jb25udHJhY2tfZXhwZWN0X3JlbGF0ZWQoZXhwKSA9PSAwKQotCQkJYnJlYWs7Ci0JfQotCi0JaWYgKHBvcnQgPT0gMCkKLQkJcmV0dXJuIE5GX0RST1A7Ci0KLQlpZiAoIW1hbmdsZV9zZHAocHNrYiwgY3RpbmZvLCBjdCwgbmV3aXAsIHBvcnQsIGRwdHIpKSB7Ci0JCWlwX2Nvbm50cmFja191bmV4cGVjdF9yZWxhdGVkKGV4cCk7Ci0JCXJldHVybiBORl9EUk9QOwotCX0KLQlyZXR1cm4gTkZfQUNDRVBUOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQotewotCXJjdV9hc3NpZ25fcG9pbnRlcihpcF9uYXRfc2lwX2hvb2ssIE5VTEwpOwotCXJjdV9hc3NpZ25fcG9pbnRlcihpcF9uYXRfc2RwX2hvb2ssIE5VTEwpOwotCXN5bmNocm9uaXplX3JjdSgpOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCi17Ci0JQlVHX09OKHJjdV9kZXJlZmVyZW5jZShpcF9uYXRfc2lwX2hvb2spKTsKLQlCVUdfT04ocmN1X2RlcmVmZXJlbmNlKGlwX25hdF9zZHBfaG9vaykpOwotCXJjdV9hc3NpZ25fcG9pbnRlcihpcF9uYXRfc2lwX2hvb2ssIGlwX25hdF9zaXApOwotCXJjdV9hc3NpZ25fcG9pbnRlcihpcF9uYXRfc2RwX2hvb2ssIGlwX25hdF9zZHApOwotCXJldHVybiAwOwotfQotCi1tb2R1bGVfaW5pdChpbml0KTsKLW1vZHVsZV9leGl0KGZpbmkpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9zbm1wX2Jhc2ljLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3NubXBfYmFzaWMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQxZDBlZi4uMDAwMDAwMAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3NubXBfYmFzaWMuYworKysgL2Rldi9udWxsCkBAIC0xLDEzMzMgKzAsMCBAQAotLyoKLSAqIGlwX25hdF9zbm1wX2Jhc2ljLmMKLSAqCi0gKiBCYXNpYyBTTk1QIEFwcGxpY2F0aW9uIExheWVyIEdhdGV3YXkKLSAqCi0gKiBUaGlzIElQIE5BVCBtb2R1bGUgaXMgaW50ZW5kZWQgZm9yIHVzZSB3aXRoIFNOTVAgbmV0d29yawotICogZGlzY292ZXJ5IGFuZCBtb25pdG9yaW5nIGFwcGxpY2F0aW9ucyB3aGVyZSB0YXJnZXQgbmV0d29ya3MgdXNlCi0gKiBjb25mbGljdGluZyBwcml2YXRlIGFkZHJlc3MgcmVhbG1zLgotICoKLSAqIFN0YXRpYyBOQVQgaXMgdXNlZCB0byByZW1hcCB0aGUgbmV0d29ya3MgZnJvbSB0aGUgdmlldyBvZiB0aGUgbmV0d29yawotICogbWFuYWdlbWVudCBzeXN0ZW0gYXQgdGhlIElQIGxheWVyLCBhbmQgdGhpcyBtb2R1bGUgcmVtYXBzIHNvbWUgYXBwbGljYXRpb24KLSAqIGxheWVyIGFkZHJlc3NlcyB0byBtYXRjaC4KLSAqCi0gKiBUaGUgc2ltcGxlc3QgZm9ybSBvZiBBTEcgaXMgcGVyZm9ybWVkLCB3aGVyZSBvbmx5IHRhZ2dlZCBJUCBhZGRyZXNzZXMKLSAqIGFyZSBtb2RpZmllZC4gIFRoZSBtb2R1bGUgZG9lcyBub3QgbmVlZCB0byBiZSBNSUIgYXdhcmUgYW5kIG9ubHkgc2NhbnMKLSAqIG1lc3NhZ2VzIGF0IHRoZSBBU04uMS9CRVIgbGV2ZWwuCi0gKgotICogQ3VycmVudGx5LCBvbmx5IFNOTVB2MSBhbmQgU05NUHYyIGFyZSBzdXBwb3J0ZWQuCi0gKgotICogTW9yZSBpbmZvcm1hdGlvbiBvbiBBTEcgYW5kIGFzc29jaWF0ZWQgaXNzdWVzIGNhbiBiZSBmb3VuZCBpbgotICogUkZDIDI5NjIKLSAqCi0gKiBUaGUgQVNCLjEvQkVSIHBhcnNpbmcgY29kZSBpcyBkZXJpdmVkIGZyb20gdGhlIGd4c25tcCBwYWNrYWdlIGJ5IEdyZWdvcnkKLSAqIE1jTGVhbiAmIEpvY2hlbiBGcmllZHJpY2gsIHN0cmlwcGVkIGRvd24gZm9yIHVzZSBpbiB0aGUga2VybmVsLgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBSUCBJbnRlcm5ldCAod3d3LnJwaS5uZXQuYXUpLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKLSAqCi0gKiBBdXRob3I6IEphbWVzIE1vcnJpcyA8am1vcnJpc0BpbnRlcmNvZGUuY29tLmF1PgotICoKLSAqIFVwZGF0ZXM6Ci0gKiAyMDAwLTA4LTA2OiBDb252ZXJ0IHRvIG5ldyBoZWxwZXIgQVBJIChIYXJhbGQgV2VsdGUpLgotICoKLSAqLwotI2luY2x1ZGUgPGxpbnV4L2luLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2hlbHBlci5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdF9oZWxwZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9pcC5oPgotI2luY2x1ZGUgPGxpbnV4L3VkcC5oPgotI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgotI2luY2x1ZGUgPG5ldC91ZHAuaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotCi1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfQVVUSE9SKCJKYW1lcyBNb3JyaXMgPGptb3JyaXNAaW50ZXJjb2RlLmNvbS5hdT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiQmFzaWMgU05NUCBBcHBsaWNhdGlvbiBMYXllciBHYXRld2F5Iik7Ci0KLSNkZWZpbmUgU05NUF9QT1JUIDE2MQotI2RlZmluZSBTTk1QX1RSQVBfUE9SVCAxNjIKLSNkZWZpbmUgTk9DVDEobikgKCoodTggKiluKQotCi1zdGF0aWMgaW50IGRlYnVnOwotc3RhdGljIERFRklORV9TUElOTE9DSyhzbm1wX2xvY2spOwotCi0vKgotICogQXBwbGljYXRpb24gbGF5ZXIgYWRkcmVzcyBtYXBwaW5nIG1pbWljcyB0aGUgTkFUIG1hcHBpbmcsIGJ1dAotICogb25seSBmb3IgdGhlIGZpcnN0IG9jdGV0IGluIHRoaXMgY2FzZSAoYSBtb3JlIGZsZXhpYmxlIHN5c3RlbQotICogY2FuIGJlIGltcGxlbWVudGVkIGlmIG5lZWRlZCkuCi0gKi8KLXN0cnVjdCBvY3QxX21hcAotewotCXVfaW50OF90IGZyb207Ci0JdV9pbnQ4X3QgdG87Ci19OwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEJhc2ljIEFTTi4xIGRlY29kaW5nIHJvdXRpbmVzIChneHNubXAgYXV0aG9yIERpcmsgV2lzc2UpCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBDbGFzcyAqLwotI2RlZmluZSBBU04xX1VOSQkwCS8qIFVuaXZlcnNhbCAqLwotI2RlZmluZSBBU04xX0FQTAkxCS8qIEFwcGxpY2F0aW9uICovCi0jZGVmaW5lIEFTTjFfQ1RYCTIJLyogQ29udGV4dCAqLwotI2RlZmluZSBBU04xX1BSVgkzCS8qIFByaXZhdGUgKi8KLQotLyogVGFnICovCi0jZGVmaW5lIEFTTjFfRU9DCTAJLyogRW5kIE9mIENvbnRlbnRzICovCi0jZGVmaW5lIEFTTjFfQk9MCTEJLyogQm9vbGVhbiAqLwotI2RlZmluZSBBU04xX0lOVAkyCS8qIEludGVnZXIgKi8KLSNkZWZpbmUgQVNOMV9CVFMJMwkvKiBCaXQgU3RyaW5nICovCi0jZGVmaW5lIEFTTjFfT1RTCTQJLyogT2N0ZXQgU3RyaW5nICovCi0jZGVmaW5lIEFTTjFfTlVMCTUJLyogTnVsbCAqLwotI2RlZmluZSBBU04xX09KSQk2CS8qIE9iamVjdCBJZGVudGlmaWVyICAqLwotI2RlZmluZSBBU04xX09KRAk3CS8qIE9iamVjdCBEZXNjcmlwdGlvbiAqLwotI2RlZmluZSBBU04xX0VYVAk4CS8qIEV4dGVybmFsICovCi0jZGVmaW5lIEFTTjFfU0VRCTE2CS8qIFNlcXVlbmNlICovCi0jZGVmaW5lIEFTTjFfU0VUCTE3CS8qIFNldCAqLwotI2RlZmluZSBBU04xX05VTVNUUgkxOAkvKiBOdW1lcmljYWwgU3RyaW5nICovCi0jZGVmaW5lIEFTTjFfUFJOU1RSCTE5CS8qIFByaW50YWJsZSBTdHJpbmcgKi8KLSNkZWZpbmUgQVNOMV9URVhTVFIJMjAJLyogVGVsZXRleHQgU3RyaW5nICovCi0jZGVmaW5lIEFTTjFfVklEU1RSCTIxCS8qIFZpZGVvIFN0cmluZyAqLwotI2RlZmluZSBBU04xX0lBNVNUUgkyMgkvKiBJQTUgU3RyaW5nICovCi0jZGVmaW5lIEFTTjFfVU5JVElNCTIzCS8qIFVuaXZlcnNhbCBUaW1lICovCi0jZGVmaW5lIEFTTjFfR0VOVElNCTI0CS8qIEdlbmVyYWwgVGltZSAqLwotI2RlZmluZSBBU04xX0dSQVNUUgkyNQkvKiBHcmFwaGljYWwgU3RyaW5nICovCi0jZGVmaW5lIEFTTjFfVklTU1RSCTI2CS8qIFZpc2libGUgU3RyaW5nICovCi0jZGVmaW5lIEFTTjFfR0VOU1RSCTI3CS8qIEdlbmVyYWwgU3RyaW5nICovCi0KLS8qIFByaW1pdGl2ZSAvIENvbnN0cnVjdGVkIG1ldGhvZHMqLwotI2RlZmluZSBBU04xX1BSSQkwCS8qIFByaW1pdGl2ZSAqLwotI2RlZmluZSBBU04xX0NPTgkxCS8qIENvbnN0cnVjdGVkICovCi0KLS8qCi0gKiBFcnJvciBjb2Rlcy4KLSAqLwotI2RlZmluZSBBU04xX0VSUl9OT0VSUk9SCQkwCi0jZGVmaW5lIEFTTjFfRVJSX0RFQ19FTVBUWQkJMgotI2RlZmluZSBBU04xX0VSUl9ERUNfRU9DX01JU01BVENICTMKLSNkZWZpbmUgQVNOMV9FUlJfREVDX0xFTkdUSF9NSVNNQVRDSAk0Ci0jZGVmaW5lIEFTTjFfRVJSX0RFQ19CQURWQUxVRQkJNQotCi0vKgotICogQVNOLjEgY29udGV4dC4KLSAqLwotc3RydWN0IGFzbjFfY3R4Ci17Ci0JaW50IGVycm9yOwkJCS8qIEVycm9yIGNvbmRpdGlvbiAqLwotCXVuc2lnbmVkIGNoYXIgKnBvaW50ZXI7CQkvKiBPY3RldCBqdXN0IHRvIGJlIGRlY29kZWQgKi8KLQl1bnNpZ25lZCBjaGFyICpiZWdpbjsJCS8qIEZpcnN0IG9jdGV0ICovCi0JdW5zaWduZWQgY2hhciAqZW5kOwkJLyogT2N0ZXQgYWZ0ZXIgbGFzdCBvY3RldCAqLwotfTsKLQotLyoKLSAqIE9jdGV0IHN0cmluZyAobm90IG51bGwgdGVybWluYXRlZCkKLSAqLwotc3RydWN0IGFzbjFfb2N0c3RyCi17Ci0JdW5zaWduZWQgY2hhciAqZGF0YTsKLQl1bnNpZ25lZCBpbnQgbGVuOwotfTsKLQotc3RhdGljIHZvaWQgYXNuMV9vcGVuKHN0cnVjdCBhc24xX2N0eCAqY3R4LAotCQkgICAgICB1bnNpZ25lZCBjaGFyICpidWYsCi0JCSAgICAgIHVuc2lnbmVkIGludCBsZW4pCi17Ci0JY3R4LT5iZWdpbiA9IGJ1ZjsKLQljdHgtPmVuZCA9IGJ1ZiArIGxlbjsKLQljdHgtPnBvaW50ZXIgPSBidWY7Ci0JY3R4LT5lcnJvciA9IEFTTjFfRVJSX05PRVJST1I7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIGFzbjFfb2N0ZXRfZGVjb2RlKHN0cnVjdCBhc24xX2N0eCAqY3R4LCB1bnNpZ25lZCBjaGFyICpjaCkKLXsKLQlpZiAoY3R4LT5wb2ludGVyID49IGN0eC0+ZW5kKSB7Ci0JCWN0eC0+ZXJyb3IgPSBBU04xX0VSUl9ERUNfRU1QVFk7Ci0JCXJldHVybiAwOwotCX0KLQkqY2ggPSAqKGN0eC0+cG9pbnRlcikrKzsKLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgYXNuMV90YWdfZGVjb2RlKHN0cnVjdCBhc24xX2N0eCAqY3R4LCB1bnNpZ25lZCBpbnQgKnRhZykKLXsKLQl1bnNpZ25lZCBjaGFyIGNoOwotCi0JKnRhZyA9IDA7Ci0KLQlkbwotCXsKLQkJaWYgKCFhc24xX29jdGV0X2RlY29kZShjdHgsICZjaCkpCi0JCQlyZXR1cm4gMDsKLQkJKnRhZyA8PD0gNzsKLQkJKnRhZyB8PSBjaCAmIDB4N0Y7Ci0JfSB3aGlsZSAoKGNoICYgMHg4MCkgPT0gMHg4MCk7Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIGFzbjFfaWRfZGVjb2RlKHN0cnVjdCBhc24xX2N0eCAqY3R4LAotCQkJCSAgICB1bnNpZ25lZCBpbnQgKmNscywKLQkJCQkgICAgdW5zaWduZWQgaW50ICpjb24sCi0JCQkJICAgIHVuc2lnbmVkIGludCAqdGFnKQotewotCXVuc2lnbmVkIGNoYXIgY2g7Ci0KLQlpZiAoIWFzbjFfb2N0ZXRfZGVjb2RlKGN0eCwgJmNoKSkKLQkJcmV0dXJuIDA7Ci0KLQkqY2xzID0gKGNoICYgMHhDMCkgPj4gNjsKLQkqY29uID0gKGNoICYgMHgyMCkgPj4gNTsKLQkqdGFnID0gKGNoICYgMHgxRik7Ci0KLQlpZiAoKnRhZyA9PSAweDFGKSB7Ci0JCWlmICghYXNuMV90YWdfZGVjb2RlKGN0eCwgdGFnKSkKLQkJCXJldHVybiAwOwotCX0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgYXNuMV9sZW5ndGhfZGVjb2RlKHN0cnVjdCBhc24xX2N0eCAqY3R4LAotCQkJCQl1bnNpZ25lZCBpbnQgKmRlZiwKLQkJCQkJdW5zaWduZWQgaW50ICpsZW4pCi17Ci0JdW5zaWduZWQgY2hhciBjaCwgY250OwotCi0JaWYgKCFhc24xX29jdGV0X2RlY29kZShjdHgsICZjaCkpCi0JCXJldHVybiAwOwotCi0JaWYgKGNoID09IDB4ODApCi0JCSpkZWYgPSAwOwotCWVsc2UgewotCQkqZGVmID0gMTsKLQotCQlpZiAoY2ggPCAweDgwKQotCQkJKmxlbiA9IGNoOwotCQllbHNlIHsKLQkJCWNudCA9ICh1bnNpZ25lZCBjaGFyKSAoY2ggJiAweDdGKTsKLQkJCSpsZW4gPSAwOwotCi0JCQl3aGlsZSAoY250ID4gMCkgewotCQkJCWlmICghYXNuMV9vY3RldF9kZWNvZGUoY3R4LCAmY2gpKQotCQkJCQlyZXR1cm4gMDsKLQkJCQkqbGVuIDw8PSA4OwotCQkJCSpsZW4gfD0gY2g7Ci0JCQkJY250LS07Ci0JCQl9Ci0JCX0KLQl9Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIGFzbjFfaGVhZGVyX2RlY29kZShzdHJ1Y3QgYXNuMV9jdHggKmN0eCwKLQkJCQkJdW5zaWduZWQgY2hhciAqKmVvYywKLQkJCQkJdW5zaWduZWQgaW50ICpjbHMsCi0JCQkJCXVuc2lnbmVkIGludCAqY29uLAotCQkJCQl1bnNpZ25lZCBpbnQgKnRhZykKLXsKLQl1bnNpZ25lZCBpbnQgZGVmLCBsZW47Ci0KLQlpZiAoIWFzbjFfaWRfZGVjb2RlKGN0eCwgY2xzLCBjb24sIHRhZykpCi0JCXJldHVybiAwOwotCi0JZGVmID0gbGVuID0gMDsKLQlpZiAoIWFzbjFfbGVuZ3RoX2RlY29kZShjdHgsICZkZWYsICZsZW4pKQotCQlyZXR1cm4gMDsKLQotCWlmIChkZWYpCi0JCSplb2MgPSBjdHgtPnBvaW50ZXIgKyBsZW47Ci0JZWxzZQotCQkqZW9jID0gTlVMTDsKLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgYXNuMV9lb2NfZGVjb2RlKHN0cnVjdCBhc24xX2N0eCAqY3R4LCB1bnNpZ25lZCBjaGFyICplb2MpCi17Ci0JdW5zaWduZWQgY2hhciBjaDsKLQotCWlmIChlb2MgPT0gMCkgewotCQlpZiAoIWFzbjFfb2N0ZXRfZGVjb2RlKGN0eCwgJmNoKSkKLQkJCXJldHVybiAwOwotCi0JCWlmIChjaCAhPSAweDAwKSB7Ci0JCQljdHgtPmVycm9yID0gQVNOMV9FUlJfREVDX0VPQ19NSVNNQVRDSDsKLQkJCXJldHVybiAwOwotCQl9Ci0KLQkJaWYgKCFhc24xX29jdGV0X2RlY29kZShjdHgsICZjaCkpCi0JCQlyZXR1cm4gMDsKLQotCQlpZiAoY2ggIT0gMHgwMCkgewotCQkJY3R4LT5lcnJvciA9IEFTTjFfRVJSX0RFQ19FT0NfTUlTTUFUQ0g7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlyZXR1cm4gMTsKLQl9IGVsc2UgewotCQlpZiAoY3R4LT5wb2ludGVyICE9IGVvYykgewotCQkJY3R4LT5lcnJvciA9IEFTTjFfRVJSX0RFQ19MRU5HVEhfTUlTTUFUQ0g7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlyZXR1cm4gMTsKLQl9Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIGFzbjFfbnVsbF9kZWNvZGUoc3RydWN0IGFzbjFfY3R4ICpjdHgsIHVuc2lnbmVkIGNoYXIgKmVvYykKLXsKLQljdHgtPnBvaW50ZXIgPSBlb2M7Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIGFzbjFfbG9uZ19kZWNvZGUoc3RydWN0IGFzbjFfY3R4ICpjdHgsCi0JCQkJICAgICAgdW5zaWduZWQgY2hhciAqZW9jLAotCQkJCSAgICAgIGxvbmcgKmludGVnZXIpCi17Ci0JdW5zaWduZWQgY2hhciBjaDsKLQl1bnNpZ25lZCBpbnQgIGxlbjsKLQotCWlmICghYXNuMV9vY3RldF9kZWNvZGUoY3R4LCAmY2gpKQotCQlyZXR1cm4gMDsKLQotCSppbnRlZ2VyID0gKHNpZ25lZCBjaGFyKSBjaDsKLQlsZW4gPSAxOwotCi0Jd2hpbGUgKGN0eC0+cG9pbnRlciA8IGVvYykgewotCQlpZiAoKytsZW4gPiBzaXplb2YgKGxvbmcpKSB7Ci0JCQljdHgtPmVycm9yID0gQVNOMV9FUlJfREVDX0JBRFZBTFVFOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQlpZiAoIWFzbjFfb2N0ZXRfZGVjb2RlKGN0eCwgJmNoKSkKLQkJCXJldHVybiAwOwotCi0JCSppbnRlZ2VyIDw8PSA4OwotCQkqaW50ZWdlciB8PSBjaDsKLQl9Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIGFzbjFfdWludF9kZWNvZGUoc3RydWN0IGFzbjFfY3R4ICpjdHgsCi0JCQkJICAgICAgdW5zaWduZWQgY2hhciAqZW9jLAotCQkJCSAgICAgIHVuc2lnbmVkIGludCAqaW50ZWdlcikKLXsKLQl1bnNpZ25lZCBjaGFyIGNoOwotCXVuc2lnbmVkIGludCAgbGVuOwotCi0JaWYgKCFhc24xX29jdGV0X2RlY29kZShjdHgsICZjaCkpCi0JCXJldHVybiAwOwotCi0JKmludGVnZXIgPSBjaDsKLQlpZiAoY2ggPT0gMCkgbGVuID0gMDsKLQllbHNlIGxlbiA9IDE7Ci0KLQl3aGlsZSAoY3R4LT5wb2ludGVyIDwgZW9jKSB7Ci0JCWlmICgrK2xlbiA+IHNpemVvZiAodW5zaWduZWQgaW50KSkgewotCQkJY3R4LT5lcnJvciA9IEFTTjFfRVJSX0RFQ19CQURWQUxVRTsKLQkJCXJldHVybiAwOwotCQl9Ci0KLQkJaWYgKCFhc24xX29jdGV0X2RlY29kZShjdHgsICZjaCkpCi0JCQlyZXR1cm4gMDsKLQotCQkqaW50ZWdlciA8PD0gODsKLQkJKmludGVnZXIgfD0gY2g7Ci0JfQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgdW5zaWduZWQgY2hhciBhc24xX3Vsb25nX2RlY29kZShzdHJ1Y3QgYXNuMV9jdHggKmN0eCwKLQkJCQkgICAgICAgdW5zaWduZWQgY2hhciAqZW9jLAotCQkJCSAgICAgICB1bnNpZ25lZCBsb25nICppbnRlZ2VyKQotewotCXVuc2lnbmVkIGNoYXIgY2g7Ci0JdW5zaWduZWQgaW50ICBsZW47Ci0KLQlpZiAoIWFzbjFfb2N0ZXRfZGVjb2RlKGN0eCwgJmNoKSkKLQkJcmV0dXJuIDA7Ci0KLQkqaW50ZWdlciA9IGNoOwotCWlmIChjaCA9PSAwKSBsZW4gPSAwOwotCWVsc2UgbGVuID0gMTsKLQotCXdoaWxlIChjdHgtPnBvaW50ZXIgPCBlb2MpIHsKLQkJaWYgKCsrbGVuID4gc2l6ZW9mICh1bnNpZ25lZCBsb25nKSkgewotCQkJY3R4LT5lcnJvciA9IEFTTjFfRVJSX0RFQ19CQURWQUxVRTsKLQkJCXJldHVybiAwOwotCQl9Ci0KLQkJaWYgKCFhc24xX29jdGV0X2RlY29kZShjdHgsICZjaCkpCi0JCQlyZXR1cm4gMDsKLQotCQkqaW50ZWdlciA8PD0gODsKLQkJKmludGVnZXIgfD0gY2g7Ci0JfQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgdW5zaWduZWQgY2hhciBhc24xX29jdGV0c19kZWNvZGUoc3RydWN0IGFzbjFfY3R4ICpjdHgsCi0JCQkJCXVuc2lnbmVkIGNoYXIgKmVvYywKLQkJCQkJdW5zaWduZWQgY2hhciAqKm9jdGV0cywKLQkJCQkJdW5zaWduZWQgaW50ICpsZW4pCi17Ci0JdW5zaWduZWQgY2hhciAqcHRyOwotCi0JKmxlbiA9IDA7Ci0KLQkqb2N0ZXRzID0ga21hbGxvYyhlb2MgLSBjdHgtPnBvaW50ZXIsIEdGUF9BVE9NSUMpOwotCWlmICgqb2N0ZXRzID09IE5VTEwpIHsKLQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKLQkJCXByaW50aygiT09NIGluIGJzYWxnICglZClcbiIsIF9fTElORV9fKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcHRyID0gKm9jdGV0czsKLQl3aGlsZSAoY3R4LT5wb2ludGVyIDwgZW9jKSB7Ci0JCWlmICghYXNuMV9vY3RldF9kZWNvZGUoY3R4LCAodW5zaWduZWQgY2hhciAqKXB0cisrKSkgewotCQkJa2ZyZWUoKm9jdGV0cyk7Ci0JCQkqb2N0ZXRzID0gTlVMTDsKLQkJCXJldHVybiAwOwotCQl9Ci0JCSgqbGVuKSsrOwotCX0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgYXNuMV9zdWJpZF9kZWNvZGUoc3RydWN0IGFzbjFfY3R4ICpjdHgsCi0JCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgKnN1YmlkKQotewotCXVuc2lnbmVkIGNoYXIgY2g7Ci0KLQkqc3ViaWQgPSAwOwotCi0JZG8gewotCQlpZiAoIWFzbjFfb2N0ZXRfZGVjb2RlKGN0eCwgJmNoKSkKLQkJCXJldHVybiAwOwotCi0JCSpzdWJpZCA8PD0gNzsKLQkJKnN1YmlkIHw9IGNoICYgMHg3RjsKLQl9IHdoaWxlICgoY2ggJiAweDgwKSA9PSAweDgwKTsKLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgYXNuMV9vaWRfZGVjb2RlKHN0cnVjdCBhc24xX2N0eCAqY3R4LAotCQkJCSAgICAgdW5zaWduZWQgY2hhciAqZW9jLAotCQkJCSAgICAgdW5zaWduZWQgbG9uZyAqKm9pZCwKLQkJCQkgICAgIHVuc2lnbmVkIGludCAqbGVuKQotewotCXVuc2lnbmVkIGxvbmcgc3ViaWQ7Ci0JdW5zaWduZWQgaW50ICBzaXplOwotCXVuc2lnbmVkIGxvbmcgKm9wdHI7Ci0KLQlzaXplID0gZW9jIC0gY3R4LT5wb2ludGVyICsgMTsKLQkqb2lkID0ga21hbGxvYyhzaXplICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpLCBHRlBfQVRPTUlDKTsKLQlpZiAoKm9pZCA9PSBOVUxMKSB7Ci0JCWlmIChuZXRfcmF0ZWxpbWl0KCkpCi0JCQlwcmludGsoIk9PTSBpbiBic2FsZyAoJWQpXG4iLCBfX0xJTkVfXyk7Ci0JCXJldHVybiAwOwotCX0KLQotCW9wdHIgPSAqb2lkOwotCi0JaWYgKCFhc24xX3N1YmlkX2RlY29kZShjdHgsICZzdWJpZCkpIHsKLQkJa2ZyZWUoKm9pZCk7Ci0JCSpvaWQgPSBOVUxMOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAoc3ViaWQgPCA0MCkgewotCQlvcHRyIFswXSA9IDA7Ci0JCW9wdHIgWzFdID0gc3ViaWQ7Ci0JfSBlbHNlIGlmIChzdWJpZCA8IDgwKSB7Ci0JCW9wdHIgWzBdID0gMTsKLQkJb3B0ciBbMV0gPSBzdWJpZCAtIDQwOwotCX0gZWxzZSB7Ci0JCW9wdHIgWzBdID0gMjsKLQkJb3B0ciBbMV0gPSBzdWJpZCAtIDgwOwotCX0KLQotCSpsZW4gPSAyOwotCW9wdHIgKz0gMjsKLQotCXdoaWxlIChjdHgtPnBvaW50ZXIgPCBlb2MpIHsKLQkJaWYgKCsrKCpsZW4pID4gc2l6ZSkgewotCQkJY3R4LT5lcnJvciA9IEFTTjFfRVJSX0RFQ19CQURWQUxVRTsKLQkJCWtmcmVlKCpvaWQpOwotCQkJKm9pZCA9IE5VTEw7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCWlmICghYXNuMV9zdWJpZF9kZWNvZGUoY3R4LCBvcHRyKyspKSB7Ci0JCQlrZnJlZSgqb2lkKTsKLQkJCSpvaWQgPSBOVUxMOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0JcmV0dXJuIDE7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIFNOTVAgZGVjb2Rpbmcgcm91dGluZXMgKGd4c25tcCBhdXRob3IgRGlyayBXaXNzZSkKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFNOTVAgVmVyc2lvbnMgKi8KLSNkZWZpbmUgU05NUF9WMQkJCQkwCi0jZGVmaW5lIFNOTVBfVjJDCQkJMQotI2RlZmluZSBTTk1QX1YyCQkJCTIKLSNkZWZpbmUgU05NUF9WMwkJCQkzCi0KLS8qIERlZmF1bHQgU2l6ZXMgKi8KLSNkZWZpbmUgU05NUF9TSVpFX0NPTU0JCQkyNTYKLSNkZWZpbmUgU05NUF9TSVpFX09CSkVDVElECQkxMjgKLSNkZWZpbmUgU05NUF9TSVpFX0JVRkNIUgkJMjU2Ci0jZGVmaW5lIFNOTVBfU0laRV9CVUZJTlQJCTEyOAotI2RlZmluZSBTTk1QX1NJWkVfU01BTExPQkpFQ1RJRAkJMTYKLQotLyogUmVxdWVzdHMgKi8KLSNkZWZpbmUgU05NUF9QRFVfR0VUCQkJMAotI2RlZmluZSBTTk1QX1BEVV9ORVhUCQkJMQotI2RlZmluZSBTTk1QX1BEVV9SRVNQT05TRQkJMgotI2RlZmluZSBTTk1QX1BEVV9TRVQJCQkzCi0jZGVmaW5lIFNOTVBfUERVX1RSQVAxCQkJNAotI2RlZmluZSBTTk1QX1BEVV9CVUxLCQkJNQotI2RlZmluZSBTTk1QX1BEVV9JTkZPUk0JCQk2Ci0jZGVmaW5lIFNOTVBfUERVX1RSQVAyCQkJNwotCi0vKiBFcnJvcnMgKi8KLSNkZWZpbmUgU05NUF9OT0VSUk9SCQkJMAotI2RlZmluZSBTTk1QX1RPT0JJRwkJCTEKLSNkZWZpbmUgU05NUF9OT1NVQ0hOQU1FCQkJMgotI2RlZmluZSBTTk1QX0JBRFZBTFVFCQkJMwotI2RlZmluZSBTTk1QX1JFQURPTkxZCQkJNAotI2RlZmluZSBTTk1QX0dFTkVSUk9SCQkJNQotI2RlZmluZSBTTk1QX05PQUNDRVNTCQkJNgotI2RlZmluZSBTTk1QX1dST05HVFlQRQkJCTcKLSNkZWZpbmUgU05NUF9XUk9OR0xFTkdUSAkJOAotI2RlZmluZSBTTk1QX1dST05HRU5DT0RJTkcJCTkKLSNkZWZpbmUgU05NUF9XUk9OR1ZBTFVFCQkJMTAKLSNkZWZpbmUgU05NUF9OT0NSRUFUSU9OCQkJMTEKLSNkZWZpbmUgU05NUF9JTkNPTlNJU1RFTlRWQUxVRQkJMTIKLSNkZWZpbmUgU05NUF9SRVNPVVJDRVVOQVZBSUxBQkxFCTEzCi0jZGVmaW5lIFNOTVBfQ09NTUlURkFJTEVECQkxNAotI2RlZmluZSBTTk1QX1VORE9GQUlMRUQJCQkxNQotI2RlZmluZSBTTk1QX0FVVEhPUklaQVRJT05FUlJPUgkJMTYKLSNkZWZpbmUgU05NUF9OT1RXUklUQUJMRQkJMTcKLSNkZWZpbmUgU05NUF9JTkNPTlNJU1RFTlROQU1FCQkxOAotCi0vKiBHZW5lcmFsIFNOTVAgVjEgVHJhcHMgKi8KLSNkZWZpbmUgU05NUF9UUkFQX0NPTERTVEFSVAkJMAotI2RlZmluZSBTTk1QX1RSQVBfV0FSTVNUQVJUCQkxCi0jZGVmaW5lIFNOTVBfVFJBUF9MSU5LRE9XTgkJMgotI2RlZmluZSBTTk1QX1RSQVBfTElOS1VQCQkzCi0jZGVmaW5lIFNOTVBfVFJBUF9BVVRGQUlMVVJFCQk0Ci0jZGVmaW5lIFNOTVBfVFJBUF9FUVBORUlHSEJPUkxPU1MJNQotI2RlZmluZSBTTk1QX1RSQVBfRU5UU1BFQ0lGSUMJCTYKLQotLyogU05NUHYxIFR5cGVzICovCi0jZGVmaW5lIFNOTVBfTlVMTCAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIFNOTVBfSU5URUdFUiAgICAgICAgICAgICAxICAgIC8qIGwgICovCi0jZGVmaW5lIFNOTVBfT0NURVRTVFIgICAgICAgICAgICAyICAgIC8qIGMgICovCi0jZGVmaW5lIFNOTVBfRElTUExBWVNUUiAgICAgICAgICAyICAgIC8qIGMgICovCi0jZGVmaW5lIFNOTVBfT0JKRUNUSUQgICAgICAgICAgICAzICAgIC8qIHVsICovCi0jZGVmaW5lIFNOTVBfSVBBRERSICAgICAgICAgICAgICA0ICAgIC8qIHVjICovCi0jZGVmaW5lIFNOTVBfQ09VTlRFUiAgICAgICAgICAgICA1ICAgIC8qIHVsICovCi0jZGVmaW5lIFNOTVBfR0FVR0UgICAgICAgICAgICAgICA2ICAgIC8qIHVsICovCi0jZGVmaW5lIFNOTVBfVElNRVRJQ0tTICAgICAgICAgICA3ICAgIC8qIHVsICovCi0jZGVmaW5lIFNOTVBfT1BBUVVFICAgICAgICAgICAgICA4ICAgIC8qIGMgICovCi0KLS8qIEFkZGl0aW9uYWwgU05NUHYyIFR5cGVzICovCi0jZGVmaW5lIFNOTVBfVUlOVEVHRVIgICAgICAgICAgICA1ICAgIC8qIHVsICovCi0jZGVmaW5lIFNOTVBfQklUU1RSICAgICAgICAgICAgICA5ICAgIC8qIHVjICovCi0jZGVmaW5lIFNOTVBfTlNBUCAgICAgICAgICAgICAgIDEwICAgIC8qIHVjICovCi0jZGVmaW5lIFNOTVBfQ09VTlRFUjY0ICAgICAgICAgIDExICAgIC8qIHVsICovCi0jZGVmaW5lIFNOTVBfTk9TVUNIT0JKRUNUICAgICAgIDEyCi0jZGVmaW5lIFNOTVBfTk9TVUNISU5TVEFOQ0UgICAgIDEzCi0jZGVmaW5lIFNOTVBfRU5ET0ZNSUJWSUVXICAgICAgIDE0Ci0KLXVuaW9uIHNubXBfc3ludGF4Ci17Ci0JdW5zaWduZWQgY2hhciB1Y1swXTsJLyogOCBiaXQgdW5zaWduZWQgKi8KLQljaGFyIGNbMF07CQkvKiA4IGJpdCBzaWduZWQgKi8KLQl1bnNpZ25lZCBsb25nIHVsWzBdOwkvKiAzMiBiaXQgdW5zaWduZWQgKi8KLQlsb25nIGxbMF07CQkvKiAzMiBiaXQgc2lnbmVkICovCi19OwotCi1zdHJ1Y3Qgc25tcF9vYmplY3QKLXsKLQl1bnNpZ25lZCBsb25nICppZDsKLQl1bnNpZ25lZCBpbnQgaWRfbGVuOwotCXVuc2lnbmVkIHNob3J0IHR5cGU7Ci0JdW5zaWduZWQgaW50IHN5bnRheF9sZW47Ci0JdW5pb24gc25tcF9zeW50YXggc3ludGF4OwotfTsKLQotc3RydWN0IHNubXBfcmVxdWVzdAotewotCXVuc2lnbmVkIGxvbmcgaWQ7Ci0JdW5zaWduZWQgaW50IGVycm9yX3N0YXR1czsKLQl1bnNpZ25lZCBpbnQgZXJyb3JfaW5kZXg7Ci19OwotCi1zdHJ1Y3Qgc25tcF92MV90cmFwCi17Ci0JdW5zaWduZWQgbG9uZyAqaWQ7Ci0JdW5zaWduZWQgaW50IGlkX2xlbjsKLQl1bnNpZ25lZCBsb25nIGlwX2FkZHJlc3M7CS8qIHBvaW50ZXIgICovCi0JdW5zaWduZWQgaW50IGdlbmVyYWw7Ci0JdW5zaWduZWQgaW50IHNwZWNpZmljOwotCXVuc2lnbmVkIGxvbmcgdGltZTsKLX07Ci0KLS8qIFNOTVAgdHlwZXMgKi8KLSNkZWZpbmUgU05NUF9JUEEgICAgMAotI2RlZmluZSBTTk1QX0NOVCAgICAxCi0jZGVmaW5lIFNOTVBfR0dFICAgIDIKLSNkZWZpbmUgU05NUF9USVQgICAgMwotI2RlZmluZSBTTk1QX09QUSAgICA0Ci0jZGVmaW5lIFNOTVBfQzY0ICAgIDYKLQotLyogU05NUCBlcnJvcnMgKi8KLSNkZWZpbmUgU0VSUl9OU08gICAgMAotI2RlZmluZSBTRVJSX05TSSAgICAxCi0jZGVmaW5lIFNFUlJfRU9NICAgIDIKLQotc3RhdGljIGlubGluZSB2b2lkIG1hbmdsZV9hZGRyZXNzKHVuc2lnbmVkIGNoYXIgKmJlZ2luLAotCQkJCSAgdW5zaWduZWQgY2hhciAqYWRkciwKLQkJCQkgIGNvbnN0IHN0cnVjdCBvY3QxX21hcCAqbWFwLAotCQkJCSAgX19zdW0xNiAqY2hlY2spOwotc3RydWN0IHNubXBfY252Ci17Ci0JdW5zaWduZWQgaW50IGNsYXNzOwotCXVuc2lnbmVkIGludCB0YWc7Ci0JaW50IHN5bnRheDsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25tcF9jbnYgc25tcF9jb252IFtdID0KLXsKLQl7QVNOMV9VTkksIEFTTjFfTlVMLCBTTk1QX05VTEx9LAotCXtBU04xX1VOSSwgQVNOMV9JTlQsIFNOTVBfSU5URUdFUn0sCi0Je0FTTjFfVU5JLCBBU04xX09UUywgU05NUF9PQ1RFVFNUUn0sCi0Je0FTTjFfVU5JLCBBU04xX09UUywgU05NUF9ESVNQTEFZU1RSfSwKLQl7QVNOMV9VTkksIEFTTjFfT0pJLCBTTk1QX09CSkVDVElEfSwKLQl7QVNOMV9BUEwsIFNOTVBfSVBBLCBTTk1QX0lQQUREUn0sCi0Je0FTTjFfQVBMLCBTTk1QX0NOVCwgU05NUF9DT1VOVEVSfSwJLyogQ291bnRlcjMyICovCi0Je0FTTjFfQVBMLCBTTk1QX0dHRSwgU05NUF9HQVVHRX0sCS8qIEdhdWdlMzIgPT0gVW5zaWduZWQzMiAgKi8KLQl7QVNOMV9BUEwsIFNOTVBfVElULCBTTk1QX1RJTUVUSUNLU30sCi0Je0FTTjFfQVBMLCBTTk1QX09QUSwgU05NUF9PUEFRVUV9LAotCi0JLyogU05NUHYyIGRhdGEgdHlwZXMgYW5kIGVycm9ycyAqLwotCXtBU04xX1VOSSwgQVNOMV9CVFMsIFNOTVBfQklUU1RSfSwKLQl7QVNOMV9BUEwsIFNOTVBfQzY0LCBTTk1QX0NPVU5URVI2NH0sCi0Je0FTTjFfQ1RYLCBTRVJSX05TTywgU05NUF9OT1NVQ0hPQkpFQ1R9LAotCXtBU04xX0NUWCwgU0VSUl9OU0ksIFNOTVBfTk9TVUNISU5TVEFOQ0V9LAotCXtBU04xX0NUWCwgU0VSUl9FT00sIFNOTVBfRU5ET0ZNSUJWSUVXfSwKLQl7MCwgICAgICAgMCwgICAgICAgLTF9Ci19OwotCi1zdGF0aWMgdW5zaWduZWQgY2hhciBzbm1wX3RhZ19jbHMyc3ludGF4KHVuc2lnbmVkIGludCB0YWcsCi0JCQkJCSB1bnNpZ25lZCBpbnQgY2xzLAotCQkJCQkgdW5zaWduZWQgc2hvcnQgKnN5bnRheCkKLXsKLQlzdHJ1Y3Qgc25tcF9jbnYgKmNudjsKLQotCWNudiA9IHNubXBfY29udjsKLQotCXdoaWxlIChjbnYtPnN5bnRheCAhPSAtMSkgewotCQlpZiAoY252LT50YWcgPT0gdGFnICYmIGNudi0+Y2xhc3MgPT0gY2xzKSB7Ci0JCQkqc3ludGF4ID0gY252LT5zeW50YXg7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCQljbnYrKzsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIHNubXBfb2JqZWN0X2RlY29kZShzdHJ1Y3QgYXNuMV9jdHggKmN0eCwKLQkJCQkJc3RydWN0IHNubXBfb2JqZWN0ICoqb2JqKQotewotCXVuc2lnbmVkIGludCBjbHMsIGNvbiwgdGFnLCBsZW4sIGlkbGVuOwotCXVuc2lnbmVkIHNob3J0IHR5cGU7Ci0JdW5zaWduZWQgY2hhciAqZW9jLCAqZW5kLCAqcDsKLQl1bnNpZ25lZCBsb25nICpscCwgKmlkOwotCXVuc2lnbmVkIGxvbmcgdWw7Ci0JbG9uZyBsOwotCi0JKm9iaiA9IE5VTEw7Ci0JaWQgPSBOVUxMOwotCi0JaWYgKCFhc24xX2hlYWRlcl9kZWNvZGUoY3R4LCAmZW9jLCAmY2xzLCAmY29uLCAmdGFnKSkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoY2xzICE9IEFTTjFfVU5JIHx8IGNvbiAhPSBBU04xX0NPTiB8fCB0YWcgIT0gQVNOMV9TRVEpCi0JCXJldHVybiAwOwotCi0JaWYgKCFhc24xX2hlYWRlcl9kZWNvZGUoY3R4LCAmZW5kLCAmY2xzLCAmY29uLCAmdGFnKSkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoY2xzICE9IEFTTjFfVU5JIHx8IGNvbiAhPSBBU04xX1BSSSB8fCB0YWcgIT0gQVNOMV9PSkkpCi0JCXJldHVybiAwOwotCi0JaWYgKCFhc24xX29pZF9kZWNvZGUoY3R4LCBlbmQsICZpZCwgJmlkbGVuKSkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoIWFzbjFfaGVhZGVyX2RlY29kZShjdHgsICZlbmQsICZjbHMsICZjb24sICZ0YWcpKSB7Ci0JCWtmcmVlKGlkKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKGNvbiAhPSBBU04xX1BSSSkgewotCQlrZnJlZShpZCk7Ci0JCXJldHVybiAwOwotCX0KLQotCXR5cGUgPSAwOwotCWlmICghc25tcF90YWdfY2xzMnN5bnRheCh0YWcsIGNscywgJnR5cGUpKSB7Ci0JCWtmcmVlKGlkKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JbCA9IDA7Ci0Jc3dpdGNoICh0eXBlKSB7Ci0JCWNhc2UgU05NUF9JTlRFR0VSOgotCQkJbGVuID0gc2l6ZW9mKGxvbmcpOwotCQkJaWYgKCFhc24xX2xvbmdfZGVjb2RlKGN0eCwgZW5kLCAmbCkpIHsKLQkJCQlrZnJlZShpZCk7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQkqb2JqID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNubXBfb2JqZWN0KSArIGxlbiwKLQkJCQkgICAgICAgR0ZQX0FUT01JQyk7Ci0JCQlpZiAoKm9iaiA9PSBOVUxMKSB7Ci0JCQkJa2ZyZWUoaWQpOwotCQkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCi0JCQkJCXByaW50aygiT09NIGluIGJzYWxnICglZClcbiIsIF9fTElORV9fKTsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCSgqb2JqKS0+c3ludGF4LmxbMF0gPSBsOwotCQkJYnJlYWs7Ci0JCWNhc2UgU05NUF9PQ1RFVFNUUjoKLQkJY2FzZSBTTk1QX09QQVFVRToKLQkJCWlmICghYXNuMV9vY3RldHNfZGVjb2RlKGN0eCwgZW5kLCAmcCwgJmxlbikpIHsKLQkJCQlrZnJlZShpZCk7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQkqb2JqID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNubXBfb2JqZWN0KSArIGxlbiwKLQkJCQkgICAgICAgR0ZQX0FUT01JQyk7Ci0JCQlpZiAoKm9iaiA9PSBOVUxMKSB7Ci0JCQkJa2ZyZWUoaWQpOwotCQkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCi0JCQkJCXByaW50aygiT09NIGluIGJzYWxnICglZClcbiIsIF9fTElORV9fKTsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCW1lbWNweSgoKm9iaiktPnN5bnRheC5jLCBwLCBsZW4pOwotCQkJa2ZyZWUocCk7Ci0JCQlicmVhazsKLQkJY2FzZSBTTk1QX05VTEw6Ci0JCWNhc2UgU05NUF9OT1NVQ0hPQkpFQ1Q6Ci0JCWNhc2UgU05NUF9OT1NVQ0hJTlNUQU5DRToKLQkJY2FzZSBTTk1QX0VORE9GTUlCVklFVzoKLQkJCWxlbiA9IDA7Ci0JCQkqb2JqID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNubXBfb2JqZWN0KSwgR0ZQX0FUT01JQyk7Ci0JCQlpZiAoKm9iaiA9PSBOVUxMKSB7Ci0JCQkJa2ZyZWUoaWQpOwotCQkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCi0JCQkJCXByaW50aygiT09NIGluIGJzYWxnICglZClcbiIsIF9fTElORV9fKTsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCWlmICghYXNuMV9udWxsX2RlY29kZShjdHgsIGVuZCkpIHsKLQkJCQlrZnJlZShpZCk7Ci0JCQkJa2ZyZWUoKm9iaik7Ci0JCQkJKm9iaiA9IE5VTEw7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBTTk1QX09CSkVDVElEOgotCQkJaWYgKCFhc24xX29pZF9kZWNvZGUoY3R4LCBlbmQsICh1bnNpZ25lZCBsb25nICoqKSZscCwgJmxlbikpIHsKLQkJCQlrZnJlZShpZCk7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQlsZW4gKj0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOwotCQkJKm9iaiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzbm1wX29iamVjdCkgKyBsZW4sIEdGUF9BVE9NSUMpOwotCQkJaWYgKCpvYmogPT0gTlVMTCkgewotCQkJCWtmcmVlKGxwKTsKLQkJCQlrZnJlZShpZCk7Ci0JCQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKLQkJCQkJcHJpbnRrKCJPT00gaW4gYnNhbGcgKCVkKVxuIiwgX19MSU5FX18pOwotCQkJCXJldHVybiAwOwotCQkJfQotCQkJbWVtY3B5KCgqb2JqKS0+c3ludGF4LnVsLCBscCwgbGVuKTsKLQkJCWtmcmVlKGxwKTsKLQkJCWJyZWFrOwotCQljYXNlIFNOTVBfSVBBRERSOgotCQkJaWYgKCFhc24xX29jdGV0c19kZWNvZGUoY3R4LCBlbmQsICZwLCAmbGVuKSkgewotCQkJCWtmcmVlKGlkKTsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCWlmIChsZW4gIT0gNCkgewotCQkJCWtmcmVlKHApOwotCQkJCWtmcmVlKGlkKTsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCSpvYmogPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc25tcF9vYmplY3QpICsgbGVuLCBHRlBfQVRPTUlDKTsKLQkJCWlmICgqb2JqID09IE5VTEwpIHsKLQkJCQlrZnJlZShwKTsKLQkJCQlrZnJlZShpZCk7Ci0JCQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKLQkJCQkJcHJpbnRrKCJPT00gaW4gYnNhbGcgKCVkKVxuIiwgX19MSU5FX18pOwotCQkJCXJldHVybiAwOwotCQkJfQotCQkJbWVtY3B5KCgqb2JqKS0+c3ludGF4LnVjLCBwLCBsZW4pOwotCQkJa2ZyZWUocCk7Ci0JCQlicmVhazsKLQkJY2FzZSBTTk1QX0NPVU5URVI6Ci0JCWNhc2UgU05NUF9HQVVHRToKLQkJY2FzZSBTTk1QX1RJTUVUSUNLUzoKLQkJCWxlbiA9IHNpemVvZih1bnNpZ25lZCBsb25nKTsKLQkJCWlmICghYXNuMV91bG9uZ19kZWNvZGUoY3R4LCBlbmQsICZ1bCkpIHsKLQkJCQlrZnJlZShpZCk7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQkqb2JqID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNubXBfb2JqZWN0KSArIGxlbiwgR0ZQX0FUT01JQyk7Ci0JCQlpZiAoKm9iaiA9PSBOVUxMKSB7Ci0JCQkJa2ZyZWUoaWQpOwotCQkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCi0JCQkJCXByaW50aygiT09NIGluIGJzYWxnICglZClcbiIsIF9fTElORV9fKTsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCSgqb2JqKS0+c3ludGF4LnVsWzBdID0gdWw7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWtmcmVlKGlkKTsKLQkJCXJldHVybiAwOwotCX0KLQotCSgqb2JqKS0+c3ludGF4X2xlbiA9IGxlbjsKLQkoKm9iaiktPnR5cGUgPSB0eXBlOwotCSgqb2JqKS0+aWQgPSBpZDsKLQkoKm9iaiktPmlkX2xlbiA9IGlkbGVuOwotCi0JaWYgKCFhc24xX2VvY19kZWNvZGUoY3R4LCBlb2MpKSB7Ci0JCWtmcmVlKGlkKTsKLQkJa2ZyZWUoKm9iaik7Ci0JCSpvYmogPSBOVUxMOwotCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIHNubXBfcmVxdWVzdF9kZWNvZGUoc3RydWN0IGFzbjFfY3R4ICpjdHgsCi0JCQkJCSBzdHJ1Y3Qgc25tcF9yZXF1ZXN0ICpyZXF1ZXN0KQotewotCXVuc2lnbmVkIGludCBjbHMsIGNvbiwgdGFnOwotCXVuc2lnbmVkIGNoYXIgKmVuZDsKLQotCWlmICghYXNuMV9oZWFkZXJfZGVjb2RlKGN0eCwgJmVuZCwgJmNscywgJmNvbiwgJnRhZykpCi0JCXJldHVybiAwOwotCi0JaWYgKGNscyAhPSBBU04xX1VOSSB8fCBjb24gIT0gQVNOMV9QUkkgfHwgdGFnICE9IEFTTjFfSU5UKQotCQlyZXR1cm4gMDsKLQotCWlmICghYXNuMV91bG9uZ19kZWNvZGUoY3R4LCBlbmQsICZyZXF1ZXN0LT5pZCkpCi0JCXJldHVybiAwOwotCi0JaWYgKCFhc24xX2hlYWRlcl9kZWNvZGUoY3R4LCAmZW5kLCAmY2xzLCAmY29uLCAmdGFnKSkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoY2xzICE9IEFTTjFfVU5JIHx8IGNvbiAhPSBBU04xX1BSSSB8fCB0YWcgIT0gQVNOMV9JTlQpCi0JCXJldHVybiAwOwotCi0JaWYgKCFhc24xX3VpbnRfZGVjb2RlKGN0eCwgZW5kLCAmcmVxdWVzdC0+ZXJyb3Jfc3RhdHVzKSkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoIWFzbjFfaGVhZGVyX2RlY29kZShjdHgsICZlbmQsICZjbHMsICZjb24sICZ0YWcpKQotCQlyZXR1cm4gMDsKLQotCWlmIChjbHMgIT0gQVNOMV9VTkkgfHwgY29uICE9IEFTTjFfUFJJIHx8IHRhZyAhPSBBU04xX0lOVCkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoIWFzbjFfdWludF9kZWNvZGUoY3R4LCBlbmQsICZyZXF1ZXN0LT5lcnJvcl9pbmRleCkpCi0JCXJldHVybiAwOwotCi0JcmV0dXJuIDE7Ci19Ci0KLS8qCi0gKiBGYXN0IGNoZWNrc3VtIHVwZGF0ZSBmb3IgcG9zc2libHkgb2RkbHktYWxpZ25lZCBVRFAgYnl0ZSwgZnJvbSB0aGUKLSAqIGNvZGUgZXhhbXBsZSBpbiB0aGUgZHJhZnQuCi0gKi8KLXN0YXRpYyB2b2lkIGZhc3RfY3N1bShfX3N1bTE2ICpjc3VtLAotCQkgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpvcHRyLAotCQkgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpucHRyLAotCQkgICAgICBpbnQgb2Zmc2V0KQotewotCXVuc2lnbmVkIGNoYXIgc1s0XTsKLQotCWlmIChvZmZzZXQgJiAxKSB7Ci0JCXNbMF0gPSBzWzJdID0gMDsKLQkJc1sxXSA9IH4qb3B0cjsKLQkJc1szXSA9ICpucHRyOwotCX0gZWxzZSB7Ci0JCXNbMV0gPSBzWzNdID0gMDsKLQkJc1swXSA9IH4qb3B0cjsKLQkJc1syXSA9ICpucHRyOwotCX0KLQotCSpjc3VtID0gY3N1bV9mb2xkKGNzdW1fcGFydGlhbChzLCA0LCB+Y3N1bV91bmZvbGQoKmNzdW0pKSk7Ci19Ci0KLS8qCi0gKiBNYW5nbGUgSVAgYWRkcmVzcy4KLSAqIAktIGJlZ2luIHBvaW50cyB0byB0aGUgc3RhcnQgb2YgdGhlIHNubXAgbWVzc2dhZQotICogICAgICAtIGFkZHIgcG9pbnRzIHRvIHRoZSBzdGFydCBvZiB0aGUgYWRkcmVzcwotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgbWFuZ2xlX2FkZHJlc3ModW5zaWduZWQgY2hhciAqYmVnaW4sCi0JCQkJICB1bnNpZ25lZCBjaGFyICphZGRyLAotCQkJCSAgY29uc3Qgc3RydWN0IG9jdDFfbWFwICptYXAsCi0JCQkJICBfX3N1bTE2ICpjaGVjaykKLXsKLQlpZiAobWFwLT5mcm9tID09IE5PQ1QxKGFkZHIpKSB7Ci0JCXVfaW50MzJfdCBvbGQ7Ci0KLQkJaWYgKGRlYnVnKQotCQkJbWVtY3B5KCZvbGQsICh1bnNpZ25lZCBjaGFyICopYWRkciwgc2l6ZW9mKG9sZCkpOwotCi0JCSphZGRyID0gbWFwLT50bzsKLQotCQkvKiBVcGRhdGUgVURQIGNoZWNrc3VtIGlmIGJlaW5nIHVzZWQgKi8KLQkJaWYgKCpjaGVjaykgewotCQkJZmFzdF9jc3VtKGNoZWNrLAotCQkJCSAgJm1hcC0+ZnJvbSwgJm1hcC0+dG8sIGFkZHIgLSBiZWdpbik7Ci0JCX0KLQotCQlpZiAoZGVidWcpCi0JCQlwcmludGsoS0VSTl9ERUJVRyAiYnNhbGc6IG1hcHBlZCAldS4ldS4ldS4ldSB0byAiCi0JCQkgICAgICAgIiV1LiV1LiV1LiV1XG4iLCBOSVBRVUFEKG9sZCksIE5JUFFVQUQoKmFkZHIpKTsKLQl9Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIHNubXBfdHJhcF9kZWNvZGUoc3RydWN0IGFzbjFfY3R4ICpjdHgsCi0JCQkJICAgICAgc3RydWN0IHNubXBfdjFfdHJhcCAqdHJhcCwKLQkJCQkgICAgICBjb25zdCBzdHJ1Y3Qgb2N0MV9tYXAgKm1hcCwKLQkJCQkgICAgICBfX3N1bTE2ICpjaGVjaykKLXsKLQl1bnNpZ25lZCBpbnQgY2xzLCBjb24sIHRhZywgbGVuOwotCXVuc2lnbmVkIGNoYXIgKmVuZDsKLQotCWlmICghYXNuMV9oZWFkZXJfZGVjb2RlKGN0eCwgJmVuZCwgJmNscywgJmNvbiwgJnRhZykpCi0JCXJldHVybiAwOwotCi0JaWYgKGNscyAhPSBBU04xX1VOSSB8fCBjb24gIT0gQVNOMV9QUkkgfHwgdGFnICE9IEFTTjFfT0pJKQotCQlyZXR1cm4gMDsKLQotCWlmICghYXNuMV9vaWRfZGVjb2RlKGN0eCwgZW5kLCAmdHJhcC0+aWQsICZ0cmFwLT5pZF9sZW4pKQotCQlyZXR1cm4gMDsKLQotCWlmICghYXNuMV9oZWFkZXJfZGVjb2RlKGN0eCwgJmVuZCwgJmNscywgJmNvbiwgJnRhZykpCi0JCWdvdG8gZXJyX2lkX2ZyZWU7Ci0KLQlpZiAoISgoY2xzID09IEFTTjFfQVBMICYmIGNvbiA9PSBBU04xX1BSSSAmJiB0YWcgPT0gU05NUF9JUEEpIHx8Ci0JICAgICAgKGNscyA9PSBBU04xX1VOSSAmJiBjb24gPT0gQVNOMV9QUkkgJiYgdGFnID09IEFTTjFfT1RTKSkpCi0JCWdvdG8gZXJyX2lkX2ZyZWU7Ci0KLQlpZiAoIWFzbjFfb2N0ZXRzX2RlY29kZShjdHgsIGVuZCwgKHVuc2lnbmVkIGNoYXIgKiopJnRyYXAtPmlwX2FkZHJlc3MsICZsZW4pKQotCQlnb3RvIGVycl9pZF9mcmVlOwotCi0JLyogSVB2NCBvbmx5ICovCi0JaWYgKGxlbiAhPSA0KQotCQlnb3RvIGVycl9hZGRyX2ZyZWU7Ci0KLQltYW5nbGVfYWRkcmVzcyhjdHgtPmJlZ2luLCBjdHgtPnBvaW50ZXIgLSA0LCBtYXAsIGNoZWNrKTsKLQotCWlmICghYXNuMV9oZWFkZXJfZGVjb2RlKGN0eCwgJmVuZCwgJmNscywgJmNvbiwgJnRhZykpCi0JCWdvdG8gZXJyX2FkZHJfZnJlZTsKLQotCWlmIChjbHMgIT0gQVNOMV9VTkkgfHwgY29uICE9IEFTTjFfUFJJIHx8IHRhZyAhPSBBU04xX0lOVCkKLQkJZ290byBlcnJfYWRkcl9mcmVlOwotCi0JaWYgKCFhc24xX3VpbnRfZGVjb2RlKGN0eCwgZW5kLCAmdHJhcC0+Z2VuZXJhbCkpCi0JCWdvdG8gZXJyX2FkZHJfZnJlZTsKLQotCWlmICghYXNuMV9oZWFkZXJfZGVjb2RlKGN0eCwgJmVuZCwgJmNscywgJmNvbiwgJnRhZykpCi0JCWdvdG8gZXJyX2FkZHJfZnJlZTsKLQotCWlmIChjbHMgIT0gQVNOMV9VTkkgfHwgY29uICE9IEFTTjFfUFJJIHx8IHRhZyAhPSBBU04xX0lOVCkKLQkJZ290byBlcnJfYWRkcl9mcmVlOwotCi0JaWYgKCFhc24xX3VpbnRfZGVjb2RlKGN0eCwgZW5kLCAmdHJhcC0+c3BlY2lmaWMpKQotCQlnb3RvIGVycl9hZGRyX2ZyZWU7Ci0KLQlpZiAoIWFzbjFfaGVhZGVyX2RlY29kZShjdHgsICZlbmQsICZjbHMsICZjb24sICZ0YWcpKQotCQlnb3RvIGVycl9hZGRyX2ZyZWU7Ci0KLQlpZiAoISgoY2xzID09IEFTTjFfQVBMICYmIGNvbiA9PSBBU04xX1BSSSAmJiB0YWcgPT0gU05NUF9USVQpIHx8Ci0JICAgICAgKGNscyA9PSBBU04xX1VOSSAmJiBjb24gPT0gQVNOMV9QUkkgJiYgdGFnID09IEFTTjFfSU5UKSkpCi0JCWdvdG8gZXJyX2FkZHJfZnJlZTsKLQotCWlmICghYXNuMV91bG9uZ19kZWNvZGUoY3R4LCBlbmQsICZ0cmFwLT50aW1lKSkKLQkJZ290byBlcnJfYWRkcl9mcmVlOwotCi0JcmV0dXJuIDE7Ci0KLWVycl9hZGRyX2ZyZWU6Ci0Ja2ZyZWUoKHVuc2lnbmVkIGxvbmcgKil0cmFwLT5pcF9hZGRyZXNzKTsKLQotZXJyX2lkX2ZyZWU6Ci0Ja2ZyZWUodHJhcC0+aWQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIE1pc2MuIHJvdXRpbmVzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdm9pZCBoZXhfZHVtcCh1bnNpZ25lZCBjaGFyICpidWYsIHNpemVfdCBsZW4pCi17Ci0Jc2l6ZV90IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJaWYgKGkgJiYgIShpICUgMTYpKQotCQkJcHJpbnRrKCJcbiIpOwotCQlwcmludGsoIiUwMnggIiwgKihidWYgKyBpKSk7Ci0JfQotCXByaW50aygiXG4iKTsKLX0KLQotLyoKLSAqIFBhcnNlIGFuZCBtYW5nbGUgU05NUCBtZXNzYWdlIGFjY29yZGluZyB0byBtYXBwaW5nLgotICogKEFuZCB0aGlzIGlzIHRoZSBmdWNraW5nICdiYXNpYycgbWV0aG9kKS4KLSAqLwotc3RhdGljIGludCBzbm1wX3BhcnNlX21hbmdsZSh1bnNpZ25lZCBjaGFyICptc2csCi0JCQkgICAgIHVfaW50MTZfdCBsZW4sCi0JCQkgICAgIGNvbnN0IHN0cnVjdCBvY3QxX21hcCAqbWFwLAotCQkJICAgICBfX3N1bTE2ICpjaGVjaykKLXsKLQl1bnNpZ25lZCBjaGFyICplb2MsICplbmQ7Ci0JdW5zaWduZWQgaW50IGNscywgY29uLCB0YWcsIHZlcnMsIHBkdXR5cGU7Ci0Jc3RydWN0IGFzbjFfY3R4IGN0eDsKLQlzdHJ1Y3QgYXNuMV9vY3RzdHIgY29tbTsKLQlzdHJ1Y3Qgc25tcF9vYmplY3QgKipvYmo7Ci0KLQlpZiAoZGVidWcgPiAxKQotCQloZXhfZHVtcChtc2csIGxlbik7Ci0KLQlhc24xX29wZW4oJmN0eCwgbXNnLCBsZW4pOwotCi0JLyoKLQkgKiBTdGFydCBvZiBTTk1QIG1lc3NhZ2UuCi0JICovCi0JaWYgKCFhc24xX2hlYWRlcl9kZWNvZGUoJmN0eCwgJmVvYywgJmNscywgJmNvbiwgJnRhZykpCi0JCXJldHVybiAwOwotCWlmIChjbHMgIT0gQVNOMV9VTkkgfHwgY29uICE9IEFTTjFfQ09OIHx8IHRhZyAhPSBBU04xX1NFUSkKLQkJcmV0dXJuIDA7Ci0KLQkvKgotCSAqIFZlcnNpb24gMSBvciAyIGhhbmRsZWQuCi0JICovCi0JaWYgKCFhc24xX2hlYWRlcl9kZWNvZGUoJmN0eCwgJmVuZCwgJmNscywgJmNvbiwgJnRhZykpCi0JCXJldHVybiAwOwotCWlmIChjbHMgIT0gQVNOMV9VTkkgfHwgY29uICE9IEFTTjFfUFJJIHx8IHRhZyAhPSBBU04xX0lOVCkKLQkJcmV0dXJuIDA7Ci0JaWYgKCFhc24xX3VpbnRfZGVjb2RlICgmY3R4LCBlbmQsICZ2ZXJzKSkKLQkJcmV0dXJuIDA7Ci0JaWYgKGRlYnVnID4gMSkKLQkJcHJpbnRrKEtFUk5fREVCVUcgImJzYWxnOiBzbm1wIHZlcnNpb246ICV1XG4iLCB2ZXJzICsgMSk7Ci0JaWYgKHZlcnMgPiAxKQotCQlyZXR1cm4gMTsKLQotCS8qCi0JICogQ29tbXVuaXR5LgotCSAqLwotCWlmICghYXNuMV9oZWFkZXJfZGVjb2RlICgmY3R4LCAmZW5kLCAmY2xzLCAmY29uLCAmdGFnKSkKLQkJcmV0dXJuIDA7Ci0JaWYgKGNscyAhPSBBU04xX1VOSSB8fCBjb24gIT0gQVNOMV9QUkkgfHwgdGFnICE9IEFTTjFfT1RTKQotCQlyZXR1cm4gMDsKLQlpZiAoIWFzbjFfb2N0ZXRzX2RlY29kZSgmY3R4LCBlbmQsICZjb21tLmRhdGEsICZjb21tLmxlbikpCi0JCXJldHVybiAwOwotCWlmIChkZWJ1ZyA+IDEpIHsKLQkJdW5zaWduZWQgaW50IGk7Ci0KLQkJcHJpbnRrKEtFUk5fREVCVUcgImJzYWxnOiBjb21tdW5pdHk6ICIpOwotCQlmb3IgKGkgPSAwOyBpIDwgY29tbS5sZW47IGkrKykKLQkJCXByaW50aygiJWMiLCBjb21tLmRhdGFbaV0pOwotCQlwcmludGsoIlxuIik7Ci0JfQotCWtmcmVlKGNvbW0uZGF0YSk7Ci0KLQkvKgotCSAqIFBEVSB0eXBlCi0JICovCi0JaWYgKCFhc24xX2hlYWRlcl9kZWNvZGUoJmN0eCwgJmVvYywgJmNscywgJmNvbiwgJnBkdXR5cGUpKQotCQlyZXR1cm4gMDsKLQlpZiAoY2xzICE9IEFTTjFfQ1RYIHx8IGNvbiAhPSBBU04xX0NPTikKLQkJcmV0dXJuIDA7Ci0JaWYgKGRlYnVnID4gMSkgewotCQl1bnNpZ25lZCBjaGFyICpwZHVzW10gPSB7Ci0JCQlbU05NUF9QRFVfR0VUXSA9ICJnZXQiLAotCQkJW1NOTVBfUERVX05FWFRdID0gImdldC1uZXh0IiwKLQkJCVtTTk1QX1BEVV9SRVNQT05TRV0gPSAicmVzcG9uc2UiLAotCQkJW1NOTVBfUERVX1NFVF0gPSAic2V0IiwKLQkJCVtTTk1QX1BEVV9UUkFQMV0gPSAidHJhcHYxIiwKLQkJCVtTTk1QX1BEVV9CVUxLXSA9ICJidWxrIiwKLQkJCVtTTk1QX1BEVV9JTkZPUk1dID0gImluZm9ybSIsCi0JCQlbU05NUF9QRFVfVFJBUDJdID0gInRyYXB2MiIKLQkJfTsKLQotCQlpZiAocGR1dHlwZSA+IFNOTVBfUERVX1RSQVAyKQotCQkJcHJpbnRrKEtFUk5fREVCVUcgImJzYWxnOiBiYWQgcGR1IHR5cGUgJXVcbiIsIHBkdXR5cGUpOwotCQllbHNlCi0JCQlwcmludGsoS0VSTl9ERUJVRyAiYnNhbGc6IHBkdTogJXNcbiIsIHBkdXNbcGR1dHlwZV0pOwotCX0KLQlpZiAocGR1dHlwZSAhPSBTTk1QX1BEVV9SRVNQT05TRSAmJgotCSAgICBwZHV0eXBlICE9IFNOTVBfUERVX1RSQVAxICYmIHBkdXR5cGUgIT0gU05NUF9QRFVfVFJBUDIpCi0JCXJldHVybiAxOwotCi0JLyoKLQkgKiBSZXF1ZXN0IGhlYWRlciBvciB2MSB0cmFwCi0JICovCi0JaWYgKHBkdXR5cGUgPT0gU05NUF9QRFVfVFJBUDEpIHsKLQkJc3RydWN0IHNubXBfdjFfdHJhcCB0cmFwOwotCQl1bnNpZ25lZCBjaGFyIHJldCA9IHNubXBfdHJhcF9kZWNvZGUoJmN0eCwgJnRyYXAsIG1hcCwgY2hlY2spOwotCi0JCWlmIChyZXQpIHsKLQkJCWtmcmVlKHRyYXAuaWQpOwotCQkJa2ZyZWUoKHVuc2lnbmVkIGxvbmcgKil0cmFwLmlwX2FkZHJlc3MpOwotCQl9IGVsc2UKLQkJCXJldHVybiByZXQ7Ci0KLQl9IGVsc2UgewotCQlzdHJ1Y3Qgc25tcF9yZXF1ZXN0IHJlcTsKLQotCQlpZiAoIXNubXBfcmVxdWVzdF9kZWNvZGUoJmN0eCwgJnJlcSkpCi0JCQlyZXR1cm4gMDsKLQotCQlpZiAoZGVidWcgPiAxKQotCQkJcHJpbnRrKEtFUk5fREVCVUcgImJzYWxnOiByZXF1ZXN0OiBpZD0weCVseCBlcnJvcl9zdGF0dXM9JXUgIgotCQkJImVycm9yX2luZGV4PSV1XG4iLCByZXEuaWQsIHJlcS5lcnJvcl9zdGF0dXMsCi0JCQlyZXEuZXJyb3JfaW5kZXgpOwotCX0KLQotCS8qCi0JICogTG9vcCB0aHJvdWdoIG9iamVjdHMsIGxvb2sgZm9yIElQIGFkZHJlc3NlcyB0byBtYW5nbGUuCi0JICovCi0JaWYgKCFhc24xX2hlYWRlcl9kZWNvZGUoJmN0eCwgJmVvYywgJmNscywgJmNvbiwgJnRhZykpCi0JCXJldHVybiAwOwotCi0JaWYgKGNscyAhPSBBU04xX1VOSSB8fCBjb24gIT0gQVNOMV9DT04gfHwgdGFnICE9IEFTTjFfU0VRKQotCQlyZXR1cm4gMDsKLQotCW9iaiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzbm1wX29iamVjdCksIEdGUF9BVE9NSUMpOwotCWlmIChvYmogPT0gTlVMTCkgewotCQlpZiAobmV0X3JhdGVsaW1pdCgpKQotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiT09NIGluIGJzYWxnKCVkKVxuIiwgX19MSU5FX18pOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQl3aGlsZSAoIWFzbjFfZW9jX2RlY29kZSgmY3R4LCBlb2MpKSB7Ci0JCXVuc2lnbmVkIGludCBpOwotCi0JCWlmICghc25tcF9vYmplY3RfZGVjb2RlKCZjdHgsIG9iaikpIHsKLQkJCWlmICgqb2JqKSB7Ci0JCQkJa2ZyZWUoKCpvYmopLT5pZCk7Ci0JCQkJa2ZyZWUoKm9iaik7Ci0JCQl9Ci0JCQlrZnJlZShvYmopOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQlpZiAoZGVidWcgPiAxKSB7Ci0JCQlwcmludGsoS0VSTl9ERUJVRyAiYnNhbGc6IG9iamVjdDogIik7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgKCpvYmopLT5pZF9sZW47IGkrKykgewotCQkJCWlmIChpID4gMCkKLQkJCQkJcHJpbnRrKCIuIik7Ci0JCQkJcHJpbnRrKCIlbHUiLCAoKm9iaiktPmlkW2ldKTsKLQkJCX0KLQkJCXByaW50aygiOiB0eXBlPSV1XG4iLCAoKm9iaiktPnR5cGUpOwotCi0JCX0KLQotCQlpZiAoKCpvYmopLT50eXBlID09IFNOTVBfSVBBRERSKQotCQkJbWFuZ2xlX2FkZHJlc3MoY3R4LmJlZ2luLCBjdHgucG9pbnRlciAtIDQgLCBtYXAsIGNoZWNrKTsKLQotCQlrZnJlZSgoKm9iaiktPmlkKTsKLQkJa2ZyZWUoKm9iaik7Ci0JfQotCWtmcmVlKG9iaik7Ci0KLQlpZiAoIWFzbjFfZW9jX2RlY29kZSgmY3R4LCBlb2MpKQotCQlyZXR1cm4gMDsKLQotCXJldHVybiAxOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBOQVQgcm91dGluZXMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICogU05NUCB0cmFuc2xhdGlvbiByb3V0aW5lLgotICovCi1zdGF0aWMgaW50IHNubXBfdHJhbnNsYXRlKHN0cnVjdCBpcF9jb25udHJhY2sgKmN0LAotCQkJICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKLQkJCSAgc3RydWN0IHNrX2J1ZmYgKipwc2tiKQotewotCXN0cnVjdCBpcGhkciAqaXBoID0gKCpwc2tiKS0+bmguaXBoOwotCXN0cnVjdCB1ZHBoZHIgKnVkcGggPSAoc3RydWN0IHVkcGhkciAqKSgoX19iZTMyICopaXBoICsgaXBoLT5paGwpOwotCXVfaW50MTZfdCB1ZHBsZW4gPSBudG9ocyh1ZHBoLT5sZW4pOwotCXVfaW50MTZfdCBwYXlsZW4gPSB1ZHBsZW4gLSBzaXplb2Yoc3RydWN0IHVkcGhkcik7Ci0JaW50IGRpciA9IENUSU5GTzJESVIoY3RpbmZvKTsKLQlzdHJ1Y3Qgb2N0MV9tYXAgbWFwOwotCi0JLyoKLQkgKiBEZXRlcm1pbmUgbWFwcHBpbmcgZm9yIGFwcGxpY2F0aW9uIGxheWVyIGFkZHJlc3NlcyBiYXNlZAotCSAqIG9uIE5BVCBtYW5pcHVsYXRpb25zIGZvciB0aGUgcGFja2V0LgotCSAqLwotCWlmIChkaXIgPT0gSVBfQ1RfRElSX09SSUdJTkFMKSB7Ci0JCS8qIFNOQVQgdHJhcHMgKi8KLQkJbWFwLmZyb20gPSBOT0NUMSgmY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLnNyYy5pcCk7Ci0JCW1hcC50byA9IE5PQ1QxKCZjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0udHVwbGUuZHN0LmlwKTsKLQl9IGVsc2UgewotCQkvKiBETkFUIHJlcGxpZXMgKi8KLQkJbWFwLmZyb20gPSBOT0NUMSgmY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlLnNyYy5pcCk7Ci0JCW1hcC50byA9IE5PQ1QxKCZjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUuZHN0LmlwKTsKLQl9Ci0KLQlpZiAobWFwLmZyb20gPT0gbWFwLnRvKQotCQlyZXR1cm4gTkZfQUNDRVBUOwotCi0JaWYgKCFzbm1wX3BhcnNlX21hbmdsZSgodW5zaWduZWQgY2hhciAqKXVkcGggKyBzaXplb2Yoc3RydWN0IHVkcGhkciksCi0JCQkgICAgICAgcGF5bGVuLCAmbWFwLCAmdWRwaC0+Y2hlY2spKSB7Ci0JCWlmIChuZXRfcmF0ZWxpbWl0KCkpCi0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJic2FsZzogcGFyc2VyIGZhaWxlZFxuIik7Ci0JCXJldHVybiBORl9EUk9QOwotCX0KLQlyZXR1cm4gTkZfQUNDRVBUOwotfQotCi0vKiBXZSBkb24ndCBhY3R1YWxseSBzZXQgdXAgZXhwZWN0YXRpb25zLCBqdXN0IGFkanVzdCBpbnRlcm5hbCBJUAotICogYWRkcmVzc2VzIGlmIHRoaXMgaXMgYmVpbmcgTkFUdGVkICovCi1zdGF0aWMgaW50IGhlbHAoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAotCQlzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCwKLQkJZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8pCi17Ci0JaW50IGRpciA9IENUSU5GTzJESVIoY3RpbmZvKTsKLQl1bnNpZ25lZCBpbnQgcmV0OwotCXN0cnVjdCBpcGhkciAqaXBoID0gKCpwc2tiKS0+bmguaXBoOwotCXN0cnVjdCB1ZHBoZHIgKnVkcGggPSAoc3RydWN0IHVkcGhkciAqKSgodV9pbnQzMl90ICopaXBoICsgaXBoLT5paGwpOwotCi0JLyogU05NUCByZXBsaWVzIGFuZCBvcmlnaW5hdGluZyBTTk1QIHRyYXBzIGdldCBtYW5nbGVkICovCi0JaWYgKHVkcGgtPnNvdXJjZSA9PSBodG9ucyhTTk1QX1BPUlQpICYmIGRpciAhPSBJUF9DVF9ESVJfUkVQTFkpCi0JCXJldHVybiBORl9BQ0NFUFQ7Ci0JaWYgKHVkcGgtPmRlc3QgPT0gaHRvbnMoU05NUF9UUkFQX1BPUlQpICYmIGRpciAhPSBJUF9DVF9ESVJfT1JJR0lOQUwpCi0JCXJldHVybiBORl9BQ0NFUFQ7Ci0KLQkvKiBObyBOQVQ/ICovCi0JaWYgKCEoY3QtPnN0YXR1cyAmIElQU19OQVRfTUFTSykpCi0JCXJldHVybiBORl9BQ0NFUFQ7Ci0KLQkvKgotCSAqIE1ha2Ugc3VyZSB0aGUgcGFja2V0IGxlbmd0aCBpcyBvay4gIFNvIGZhciwgd2Ugd2VyZSBvbmx5IGd1YXJhbnRlZWQKLQkgKiB0byBoYXZlIGEgdmFsaWQgbGVuZ3RoIElQIGhlYWRlciBwbHVzIDggYnl0ZXMsIHdoaWNoIG1lYW5zIHdlIGhhdmUKLQkgKiBlbm91Z2ggcm9vbSBmb3IgYSBVRFAgaGVhZGVyLiAgSnVzdCB2ZXJpZnkgdGhlIFVEUCBsZW5ndGggZmllbGQgc28gd2UKLQkgKiBjYW4gbWVzcyBhcm91bmQgd2l0aCB0aGUgcGF5bG9hZC4KLQkgKi8KLQlpZiAobnRvaHModWRwaC0+bGVuKSAhPSAoKnBza2IpLT5sZW4gLSAoaXBoLT5paGwgPDwgMikpIHsKLQkJIGlmIChuZXRfcmF0ZWxpbWl0KCkpCi0JCQkgcHJpbnRrKEtFUk5fV0FSTklORyAiU05NUDogZHJvcHBpbmcgbWFsZm9ybWVkIHBhY2tldCAiCi0JCQkJInNyYz0ldS4ldS4ldS4ldSBkc3Q9JXUuJXUuJXUuJXVcbiIsCi0JCQkJTklQUVVBRChpcGgtPnNhZGRyKSwgTklQUVVBRChpcGgtPmRhZGRyKSk7Ci0JCSByZXR1cm4gTkZfRFJPUDsKLQl9Ci0KLQlpZiAoIXNrYl9tYWtlX3dyaXRhYmxlKHBza2IsICgqcHNrYiktPmxlbikpCi0JCXJldHVybiBORl9EUk9QOwotCi0Jc3Bpbl9sb2NrX2JoKCZzbm1wX2xvY2spOwotCXJldCA9IHNubXBfdHJhbnNsYXRlKGN0LCBjdGluZm8sIHBza2IpOwotCXNwaW5fdW5sb2NrX2JoKCZzbm1wX2xvY2spOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXBfY29ubnRyYWNrX2hlbHBlciBzbm1wX2hlbHBlciA9IHsKLQkubWF4X2V4cGVjdGVkID0gMCwKLQkudGltZW91dCA9IDE4MCwKLQkubWUgPSBUSElTX01PRFVMRSwKLQkuaGVscCA9IGhlbHAsCi0JLm5hbWUgPSAic25tcCIsCi0KLQkudHVwbGUgPSB7LnNyYyA9IHsudSA9IHsudWRwID0gey5wb3J0ID0gX19jb25zdGFudF9odG9ucyhTTk1QX1BPUlQpfX19LAotCQkgIC5kc3QgPSB7LnByb3RvbnVtID0gSVBQUk9UT19VRFB9LAotCX0sCi0JLm1hc2sgPSB7LnNyYyA9IHsudSA9IHsweEZGRkZ9fSwKLQkJIC5kc3QgPSB7LnByb3RvbnVtID0gMHhGRn0sCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaXBfY29ubnRyYWNrX2hlbHBlciBzbm1wX3RyYXBfaGVscGVyID0gewotCS5tYXhfZXhwZWN0ZWQgPSAwLAotCS50aW1lb3V0ID0gMTgwLAotCS5tZSA9IFRISVNfTU9EVUxFLAotCS5oZWxwID0gaGVscCwKLQkubmFtZSA9ICJzbm1wX3RyYXAiLAotCi0JLnR1cGxlID0gey5zcmMgPSB7LnUgPSB7LnVkcCA9IHsucG9ydCA9IF9fY29uc3RhbnRfaHRvbnMoU05NUF9UUkFQX1BPUlQpfX19LAotCQkgIC5kc3QgPSB7LnByb3RvbnVtID0gSVBQUk9UT19VRFB9LAotCX0sCi0JLm1hc2sgPSB7LnNyYyA9IHsudSA9IHsweEZGRkZ9fSwKLQkJIC5kc3QgPSB7LnByb3RvbnVtID0gMHhGRn0sCi0JfSwKLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIE1vZHVsZSBzdHVmZi4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBpbnQgX19pbml0IGlwX25hdF9zbm1wX2Jhc2ljX2luaXQodm9pZCkKLXsKLQlpbnQgcmV0ID0gMDsKLQotCXJldCA9IGlwX2Nvbm50cmFja19oZWxwZXJfcmVnaXN0ZXIoJnNubXBfaGVscGVyKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQlyZXQgPSBpcF9jb25udHJhY2tfaGVscGVyX3JlZ2lzdGVyKCZzbm1wX3RyYXBfaGVscGVyKTsKLQlpZiAocmV0IDwgMCkgewotCQlpcF9jb25udHJhY2tfaGVscGVyX3VucmVnaXN0ZXIoJnNubXBfaGVscGVyKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGlwX25hdF9zbm1wX2Jhc2ljX2Zpbmkodm9pZCkKLXsKLQlpcF9jb25udHJhY2tfaGVscGVyX3VucmVnaXN0ZXIoJnNubXBfaGVscGVyKTsKLQlpcF9jb25udHJhY2tfaGVscGVyX3VucmVnaXN0ZXIoJnNubXBfdHJhcF9oZWxwZXIpOwotfQotCi1tb2R1bGVfaW5pdChpcF9uYXRfc25tcF9iYXNpY19pbml0KTsKLW1vZHVsZV9leGl0KGlwX25hdF9zbm1wX2Jhc2ljX2ZpbmkpOwotCi1tb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMDYwMCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3N0YW5kYWxvbmUuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfc3RhbmRhbG9uZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmNmZGY2Li4wMDAwMDAwCi0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfc3RhbmRhbG9uZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzg4ICswLDAgQEAKLS8qIFRoaXMgZmlsZSBjb250YWlucyBhbGwgdGhlIGZ1bmN0aW9ucyByZXF1aXJlZCBmb3IgdGhlIHN0YW5kYWxvbmUKLSAgIGlwX25hdCBtb2R1bGUuCi0KLSAgIFRoZXNlIGFyZSBub3QgcmVxdWlyZWQgYnkgdGhlIGNvbXBhdGliaWxpdHkgbGF5ZXIuCi0qLwotCi0vKiAoQykgMTk5OS0yMDAxIFBhdWwgYFJ1c3R5JyBSdXNzZWxsCi0gKiAoQykgMjAwMi0yMDA0IE5ldGZpbHRlciBDb3JlIFRlYW0gPGNvcmV0ZWFtQG5ldGZpbHRlci5vcmc+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotCi0vKgotICogMjMgQXByIDIwMDE6IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+Ci0gKiAJLSBuZXcgQVBJIGFuZCBoYW5kbGluZyBvZiBjb25udHJhY2svbmF0IGhlbHBlcnMKLSAqIAktIG5vdyBjYXBhYmxlIG9mIG11bHRpcGxlIGV4cGVjdGF0aW9ucyBmb3Igb25lIG1hc3RlcgotICogKi8KLQotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvaWNtcC5oPgotI2luY2x1ZGUgPGxpbnV4L2lwLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLSNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+Ci0jaW5jbHVkZSA8bmV0L2lwLmg+Ci0jaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLQotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdC5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdF9ydWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0X3Byb3RvY29sLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0X2NvcmUuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9uYXRfaGVscGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX2NvcmUuaD4KLQotI2lmIDAKLSNkZWZpbmUgREVCVUdQIHByaW50awotI2Vsc2UKLSNkZWZpbmUgREVCVUdQKGZvcm1hdCwgYXJncy4uLikKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX1hGUk0KLXN0YXRpYyB2b2lkIG5hdF9kZWNvZGVfc2Vzc2lvbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZmxvd2kgKmZsKQotewotCXN0cnVjdCBpcF9jb25udHJhY2sgKmN0OwotCXN0cnVjdCBpcF9jb25udHJhY2tfdHVwbGUgKnQ7Ci0JZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm87Ci0JZW51bSBpcF9jb25udHJhY2tfZGlyIGRpcjsKLQl1bnNpZ25lZCBsb25nIHN0YXR1c2JpdDsKLQotCWN0ID0gaXBfY29ubnRyYWNrX2dldChza2IsICZjdGluZm8pOwotCWlmIChjdCA9PSBOVUxMKQotCQlyZXR1cm47Ci0JZGlyID0gQ1RJTkZPMkRJUihjdGluZm8pOwotCXQgPSAmY3QtPnR1cGxlaGFzaFtkaXJdLnR1cGxlOwotCi0JaWYgKGRpciA9PSBJUF9DVF9ESVJfT1JJR0lOQUwpCi0JCXN0YXR1c2JpdCA9IElQU19EU1RfTkFUOwotCWVsc2UKLQkJc3RhdHVzYml0ID0gSVBTX1NSQ19OQVQ7Ci0KLQlpZiAoY3QtPnN0YXR1cyAmIHN0YXR1c2JpdCkgewotCQlmbC0+Zmw0X2RzdCA9IHQtPmRzdC5pcDsKLQkJaWYgKHQtPmRzdC5wcm90b251bSA9PSBJUFBST1RPX1RDUCB8fAotCQkgICAgdC0+ZHN0LnByb3RvbnVtID09IElQUFJPVE9fVURQKQotCQkJZmwtPmZsX2lwX2Rwb3J0ID0gdC0+ZHN0LnUudGNwLnBvcnQ7Ci0JfQotCi0Jc3RhdHVzYml0IF49IElQU19OQVRfTUFTSzsKLQotCWlmIChjdC0+c3RhdHVzICYgc3RhdHVzYml0KSB7Ci0JCWZsLT5mbDRfc3JjID0gdC0+c3JjLmlwOwotCQlpZiAodC0+ZHN0LnByb3RvbnVtID09IElQUFJPVE9fVENQIHx8Ci0JCSAgICB0LT5kc3QucHJvdG9udW0gPT0gSVBQUk9UT19VRFApCi0JCQlmbC0+ZmxfaXBfc3BvcnQgPSB0LT5zcmMudS50Y3AucG9ydDsKLQl9Ci19Ci0jZW5kaWYKLQotc3RhdGljIHVuc2lnbmVkIGludAotaXBfbmF0X2ZuKHVuc2lnbmVkIGludCBob29rbnVtLAotCSAgc3RydWN0IHNrX2J1ZmYgKipwc2tiLAotCSAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotCSAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLQkgIGludCAoKm9rZm4pKHN0cnVjdCBza19idWZmICopKQotewotCXN0cnVjdCBpcF9jb25udHJhY2sgKmN0OwotCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvOwotCXN0cnVjdCBpcF9uYXRfaW5mbyAqaW5mbzsKLQkvKiBtYW5pcHR5cGUgPT0gU1JDIGZvciBwb3N0cm91dGluZy4gKi8KLQllbnVtIGlwX25hdF9tYW5pcF90eXBlIG1hbmlwdHlwZSA9IEhPT0syTUFOSVAoaG9va251bSk7Ci0KLQkvKiBXZSBuZXZlciBzZWUgZnJhZ21lbnRzOiBjb25udHJhY2sgZGVmcmFncyBvbiBwcmUtcm91dGluZwotCSAgIGFuZCBsb2NhbC1vdXQsIGFuZCBpcF9uYXRfb3V0IHByb3RlY3RzIHBvc3Qtcm91dGluZy4gKi8KLQlJUF9ORl9BU1NFUlQoISgoKnBza2IpLT5uaC5pcGgtPmZyYWdfb2ZmCi0JCSAgICAgICAmIGh0b25zKElQX01GfElQX09GRlNFVCkpKTsKLQotCWN0ID0gaXBfY29ubnRyYWNrX2dldCgqcHNrYiwgJmN0aW5mbyk7Ci0JLyogQ2FuJ3QgdHJhY2s/ICBJdCdzIG5vdCBkdWUgdG8gc3RyZXNzLCBvciBjb25udHJhY2sgd291bGQKLQkgICBoYXZlIGRyb3BwZWQgaXQuICBIZW5jZSBpdCdzIHRoZSB1c2VyJ3MgcmVzcG9uc2liaWx0eSB0bwotCSAgIHBhY2tldCBmaWx0ZXIgaXQgb3V0LCBvciBpbXBsZW1lbnQgY29ubnRyYWNrL05BVCBmb3IgdGhhdAotCSAgIHByb3RvY29sLiA4KSAtLVJSICovCi0JaWYgKCFjdCkgewotCQkvKiBFeGNlcHRpb246IElDTVAgcmVkaXJlY3QgdG8gbmV3IGNvbm5lY3Rpb24gKG5vdCBpbgotCQkgICBoYXNoIHRhYmxlIHlldCkuICBXZSBtdXN0IG5vdCBsZXQgdGhpcyB0aHJvdWdoLCBpbgotCQkgICBjYXNlIHdlJ3JlIGRvaW5nIE5BVCB0byB0aGUgc2FtZSBuZXR3b3JrLiAqLwotCQlpZiAoKCpwc2tiKS0+bmguaXBoLT5wcm90b2NvbCA9PSBJUFBST1RPX0lDTVApIHsKLQkJCXN0cnVjdCBpY21waGRyIF9oZHIsICpocDsKLQotCQkJaHAgPSBza2JfaGVhZGVyX3BvaW50ZXIoKnBza2IsCi0JCQkJCQkoKnBza2IpLT5uaC5pcGgtPmlobCo0LAotCQkJCQkJc2l6ZW9mKF9oZHIpLCAmX2hkcik7Ci0JCQlpZiAoaHAgIT0gTlVMTCAmJgotCQkJICAgIGhwLT50eXBlID09IElDTVBfUkVESVJFQ1QpCi0JCQkJcmV0dXJuIE5GX0RST1A7Ci0JCX0KLQkJcmV0dXJuIE5GX0FDQ0VQVDsKLQl9Ci0KLQkvKiBEb24ndCB0cnkgdG8gTkFUIGlmIHRoaXMgcGFja2V0IGlzIG5vdCBjb25udHJhY2tlZCAqLwotCWlmIChjdCA9PSAmaXBfY29ubnRyYWNrX3VudHJhY2tlZCkKLQkJcmV0dXJuIE5GX0FDQ0VQVDsKLQotCXN3aXRjaCAoY3RpbmZvKSB7Ci0JY2FzZSBJUF9DVF9SRUxBVEVEOgotCWNhc2UgSVBfQ1RfUkVMQVRFRCtJUF9DVF9JU19SRVBMWToKLQkJaWYgKCgqcHNrYiktPm5oLmlwaC0+cHJvdG9jb2wgPT0gSVBQUk9UT19JQ01QKSB7Ci0JCQlpZiAoIWlwX25hdF9pY21wX3JlcGx5X3RyYW5zbGF0aW9uKGN0LCBjdGluZm8sCi0JCQkJCQkJICAgaG9va251bSwgcHNrYikpCi0JCQkJcmV0dXJuIE5GX0RST1A7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIE5GX0FDQ0VQVDsKLQkJfQotCQkvKiBGYWxsIHRocnUuLi4gKE9ubHkgSUNNUHMgY2FuIGJlIElQX0NUX0lTX1JFUExZKSAqLwotCWNhc2UgSVBfQ1RfTkVXOgotCQlpbmZvID0gJmN0LT5uYXQuaW5mbzsKLQotCQkvKiBTZWVuIGl0IGJlZm9yZT8gIFRoaXMgY2FuIGhhcHBlbiBmb3IgbG9vcGJhY2ssIHJldHJhbnMsCi0JCSAgIG9yIGxvY2FsIHBhY2tldHMuLiAqLwotCQlpZiAoIWlwX25hdF9pbml0aWFsaXplZChjdCwgbWFuaXB0eXBlKSkgewotCQkJdW5zaWduZWQgaW50IHJldDsKLQotCQkJaWYgKHVubGlrZWx5KGlzX2NvbmZpcm1lZChjdCkpKQotCQkJCS8qIE5BVCBtb2R1bGUgd2FzIGxvYWRlZCBsYXRlICovCi0JCQkJcmV0ID0gYWxsb2NfbnVsbF9iaW5kaW5nX2NvbmZpcm1lZChjdCwgaW5mbywKLQkJCQkJCQkJICAgaG9va251bSk7Ci0JCQllbHNlIGlmIChob29rbnVtID09IE5GX0lQX0xPQ0FMX0lOKQotCQkJCS8qIExPQ0FMX0lOIGhvb2sgZG9lc24ndCBoYXZlIGEgY2hhaW4hICAqLwotCQkJCXJldCA9IGFsbG9jX251bGxfYmluZGluZyhjdCwgaW5mbywgaG9va251bSk7Ci0JCQllbHNlCi0JCQkJcmV0ID0gaXBfbmF0X3J1bGVfZmluZChwc2tiLCBob29rbnVtLAotCQkJCQkJICAgICAgIGluLCBvdXQsIGN0LAotCQkJCQkJICAgICAgIGluZm8pOwotCi0JCQlpZiAocmV0ICE9IE5GX0FDQ0VQVCkgewotCQkJCXJldHVybiByZXQ7Ci0JCQl9Ci0JCX0gZWxzZQotCQkJREVCVUdQKCJBbHJlYWR5IHNldHVwIG1hbmlwICVzIGZvciBjdCAlcFxuIiwKLQkJCSAgICAgICBtYW5pcHR5cGUgPT0gSVBfTkFUX01BTklQX1NSQyA/ICJTUkMiIDogIkRTVCIsCi0JCQkgICAgICAgY3QpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCS8qIEVTVEFCTElTSEVEICovCi0JCUlQX05GX0FTU0VSVChjdGluZm8gPT0gSVBfQ1RfRVNUQUJMSVNIRUQKLQkJCSAgICAgfHwgY3RpbmZvID09IChJUF9DVF9FU1RBQkxJU0hFRCtJUF9DVF9JU19SRVBMWSkpOwotCQlpbmZvID0gJmN0LT5uYXQuaW5mbzsKLQl9Ci0KLQlJUF9ORl9BU1NFUlQoaW5mbyk7Ci0JcmV0dXJuIGlwX25hdF9wYWNrZXQoY3QsIGN0aW5mbywgaG9va251bSwgcHNrYik7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLWlwX25hdF9pbih1bnNpZ25lZCBpbnQgaG9va251bSwKLQkgIHN0cnVjdCBza19idWZmICoqcHNrYiwKLQkgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLQkgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0JICBpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSkKLXsKLQl1bnNpZ25lZCBpbnQgcmV0OwotCV9fYmUzMiBkYWRkciA9ICgqcHNrYiktPm5oLmlwaC0+ZGFkZHI7Ci0KLQlyZXQgPSBpcF9uYXRfZm4oaG9va251bSwgcHNrYiwgaW4sIG91dCwgb2tmbik7Ci0JaWYgKHJldCAhPSBORl9EUk9QICYmIHJldCAhPSBORl9TVE9MRU4KLQkgICAgJiYgZGFkZHIgIT0gKCpwc2tiKS0+bmguaXBoLT5kYWRkcikgewotCQlkc3RfcmVsZWFzZSgoKnBza2IpLT5kc3QpOwotCQkoKnBza2IpLT5kc3QgPSBOVUxMOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1pcF9uYXRfb3V0KHVuc2lnbmVkIGludCBob29rbnVtLAotCSAgIHN0cnVjdCBza19idWZmICoqcHNrYiwKLQkgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0JICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLQkgICBpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSkKLXsKLSNpZmRlZiBDT05GSUdfWEZSTQotCXN0cnVjdCBpcF9jb25udHJhY2sgKmN0OwotCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvOwotI2VuZGlmCi0JdW5zaWduZWQgaW50IHJldDsKLQotCS8qIHJvb3QgaXMgcGxheWluZyB3aXRoIHJhdyBzb2NrZXRzLiAqLwotCWlmICgoKnBza2IpLT5sZW4gPCBzaXplb2Yoc3RydWN0IGlwaGRyKQotCSAgICB8fCAoKnBza2IpLT5uaC5pcGgtPmlobCAqIDQgPCBzaXplb2Yoc3RydWN0IGlwaGRyKSkKLQkJcmV0dXJuIE5GX0FDQ0VQVDsKLQotCXJldCA9IGlwX25hdF9mbihob29rbnVtLCBwc2tiLCBpbiwgb3V0LCBva2ZuKTsKLSNpZmRlZiBDT05GSUdfWEZSTQotCWlmIChyZXQgIT0gTkZfRFJPUCAmJiByZXQgIT0gTkZfU1RPTEVOCi0JICAgICYmIChjdCA9IGlwX2Nvbm50cmFja19nZXQoKnBza2IsICZjdGluZm8pKSAhPSBOVUxMKSB7Ci0JCWVudW0gaXBfY29ubnRyYWNrX2RpciBkaXIgPSBDVElORk8yRElSKGN0aW5mbyk7Ci0KLQkJaWYgKGN0LT50dXBsZWhhc2hbZGlyXS50dXBsZS5zcmMuaXAgIT0KLQkJICAgIGN0LT50dXBsZWhhc2hbIWRpcl0udHVwbGUuZHN0LmlwCi0JCSAgICB8fCBjdC0+dHVwbGVoYXNoW2Rpcl0udHVwbGUuc3JjLnUuYWxsICE9Ci0JCSAgICAgICBjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLmRzdC51LmFsbAotCQkgICAgKQotCQkJcmV0dXJuIGlwX3hmcm1fbWVfaGFyZGVyKHBza2IpID09IDAgPyByZXQgOiBORl9EUk9QOwotCX0KLSNlbmRpZgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLWlwX25hdF9sb2NhbF9mbih1bnNpZ25lZCBpbnQgaG9va251bSwKLQkJc3RydWN0IHNrX2J1ZmYgKipwc2tiLAotCQljb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0JCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0JCWludCAoKm9rZm4pKHN0cnVjdCBza19idWZmICopKQotewotCXN0cnVjdCBpcF9jb25udHJhY2sgKmN0OwotCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvOwotCXVuc2lnbmVkIGludCByZXQ7Ci0KLQkvKiByb290IGlzIHBsYXlpbmcgd2l0aCByYXcgc29ja2V0cy4gKi8KLQlpZiAoKCpwc2tiKS0+bGVuIDwgc2l6ZW9mKHN0cnVjdCBpcGhkcikKLQkgICAgfHwgKCpwc2tiKS0+bmguaXBoLT5paGwgKiA0IDwgc2l6ZW9mKHN0cnVjdCBpcGhkcikpCi0JCXJldHVybiBORl9BQ0NFUFQ7Ci0KLQlyZXQgPSBpcF9uYXRfZm4oaG9va251bSwgcHNrYiwgaW4sIG91dCwgb2tmbik7Ci0JaWYgKHJldCAhPSBORl9EUk9QICYmIHJldCAhPSBORl9TVE9MRU4KLQkgICAgJiYgKGN0ID0gaXBfY29ubnRyYWNrX2dldCgqcHNrYiwgJmN0aW5mbykpICE9IE5VTEwpIHsKLQkJZW51bSBpcF9jb25udHJhY2tfZGlyIGRpciA9IENUSU5GTzJESVIoY3RpbmZvKTsKLQotCQlpZiAoY3QtPnR1cGxlaGFzaFtkaXJdLnR1cGxlLmRzdC5pcCAhPQotCQkgICAgY3QtPnR1cGxlaGFzaFshZGlyXS50dXBsZS5zcmMuaXApIHsKLQkJCWlmIChpcF9yb3V0ZV9tZV9oYXJkZXIocHNrYiwgUlROX1VOU1BFQykpCi0JCQkJcmV0ID0gTkZfRFJPUDsKLQkJfQotI2lmZGVmIENPTkZJR19YRlJNCi0JCWVsc2UgaWYgKGN0LT50dXBsZWhhc2hbZGlyXS50dXBsZS5kc3QudS5hbGwgIT0KLQkJCSBjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLnNyYy51LmFsbCkKLQkJCWlmIChpcF94ZnJtX21lX2hhcmRlcihwc2tiKSkKLQkJCQlyZXQgPSBORl9EUk9QOwotI2VuZGlmCi0KLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludAotaXBfbmF0X2FkanVzdCh1bnNpZ25lZCBpbnQgaG9va251bSwKLQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCi0JICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotCSAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0JICAgICAgaW50ICgqb2tmbikoc3RydWN0IHNrX2J1ZmYgKikpCi17Ci0Jc3RydWN0IGlwX2Nvbm50cmFjayAqY3Q7Ci0JZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm87Ci0KLQljdCA9IGlwX2Nvbm50cmFja19nZXQoKnBza2IsICZjdGluZm8pOwotCWlmIChjdCAmJiB0ZXN0X2JpdChJUFNfU0VRX0FESlVTVF9CSVQsICZjdC0+c3RhdHVzKSkgewotCQlERUJVR1AoImlwX25hdF9zdGFuZGFsb25lOiBhZGp1c3Rpbmcgc2VxdWVuY2UgbnVtYmVyXG4iKTsKLQkJaWYgKCFpcF9uYXRfc2VxX2FkanVzdChwc2tiLCBjdCwgY3RpbmZvKSkKLQkJCXJldHVybiBORl9EUk9QOwotCX0KLQlyZXR1cm4gTkZfQUNDRVBUOwotfQotCi0vKiBXZSBtdXN0IGJlIGFmdGVyIGNvbm5lY3Rpb24gdHJhY2tpbmcgYW5kIGJlZm9yZSBwYWNrZXQgZmlsdGVyaW5nLiAqLwotCi1zdGF0aWMgc3RydWN0IG5mX2hvb2tfb3BzIGlwX25hdF9vcHNbXSA9IHsKLQkvKiBCZWZvcmUgcGFja2V0IGZpbHRlcmluZywgY2hhbmdlIGRlc3RpbmF0aW9uICovCi0JewotCQkuaG9vawkJPSBpcF9uYXRfaW4sCi0JCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkJLnBmCQk9IFBGX0lORVQsCi0JCS5ob29rbnVtCT0gTkZfSVBfUFJFX1JPVVRJTkcsCi0JCS5wcmlvcml0eQk9IE5GX0lQX1BSSV9OQVRfRFNULAotCX0sCi0JLyogQWZ0ZXIgcGFja2V0IGZpbHRlcmluZywgY2hhbmdlIHNvdXJjZSAqLwotCXsKLQkJLmhvb2sJCT0gaXBfbmF0X291dCwKLQkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCQkucGYJCT0gUEZfSU5FVCwKLQkJLmhvb2tudW0JPSBORl9JUF9QT1NUX1JPVVRJTkcsCi0JCS5wcmlvcml0eQk9IE5GX0lQX1BSSV9OQVRfU1JDLAotCX0sCi0JLyogQWZ0ZXIgY29ubnRyYWNrLCBhZGp1c3Qgc2VxdWVuY2UgbnVtYmVyICovCi0JewotCQkuaG9vawkJPSBpcF9uYXRfYWRqdXN0LAotCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JCS5wZgkJPSBQRl9JTkVULAotCQkuaG9va251bQk9IE5GX0lQX1BPU1RfUk9VVElORywKLQkJLnByaW9yaXR5CT0gTkZfSVBfUFJJX05BVF9TRVFfQURKVVNULAotCX0sCi0JLyogQmVmb3JlIHBhY2tldCBmaWx0ZXJpbmcsIGNoYW5nZSBkZXN0aW5hdGlvbiAqLwotCXsKLQkJLmhvb2sJCT0gaXBfbmF0X2xvY2FsX2ZuLAotCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JCS5wZgkJPSBQRl9JTkVULAotCQkuaG9va251bQk9IE5GX0lQX0xPQ0FMX09VVCwKLQkJLnByaW9yaXR5CT0gTkZfSVBfUFJJX05BVF9EU1QsCi0JfSwKLQkvKiBBZnRlciBwYWNrZXQgZmlsdGVyaW5nLCBjaGFuZ2Ugc291cmNlICovCi0JewotCQkuaG9vawkJPSBpcF9uYXRfZm4sCi0JCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkJLnBmCQk9IFBGX0lORVQsCi0JCS5ob29rbnVtCT0gTkZfSVBfTE9DQUxfSU4sCi0JCS5wcmlvcml0eQk9IE5GX0lQX1BSSV9OQVRfU1JDLAotCX0sCi0JLyogQWZ0ZXIgY29ubnRyYWNrLCBhZGp1c3Qgc2VxdWVuY2UgbnVtYmVyICovCi0JewotCQkuaG9vawkJPSBpcF9uYXRfYWRqdXN0LAotCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JCS5wZgkJPSBQRl9JTkVULAotCQkuaG9va251bQk9IE5GX0lQX0xPQ0FMX0lOLAotCQkucHJpb3JpdHkJPSBORl9JUF9QUklfTkFUX1NFUV9BREpVU1QsCi0JfSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGlwX25hdF9zdGFuZGFsb25lX2luaXQodm9pZCkKLXsKLQlpbnQgcmV0ID0gMDsKLQotCW5lZWRfY29ubnRyYWNrKCk7Ci0KLSNpZmRlZiBDT05GSUdfWEZSTQotCUJVR19PTihpcF9uYXRfZGVjb2RlX3Nlc3Npb24gIT0gTlVMTCk7Ci0JaXBfbmF0X2RlY29kZV9zZXNzaW9uID0gbmF0X2RlY29kZV9zZXNzaW9uOwotI2VuZGlmCi0JcmV0ID0gaXBfbmF0X3J1bGVfaW5pdCgpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50aygiaXBfbmF0X2luaXQ6IGNhbid0IHNldHVwIHJ1bGVzLlxuIik7Ci0JCWdvdG8gY2xlYW51cF9kZWNvZGVfc2Vzc2lvbjsKLQl9Ci0JcmV0ID0gbmZfcmVnaXN0ZXJfaG9va3MoaXBfbmF0X29wcywgQVJSQVlfU0laRShpcF9uYXRfb3BzKSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJpbnRrKCJpcF9uYXRfaW5pdDogY2FuJ3QgcmVnaXN0ZXIgaG9va3MuXG4iKTsKLQkJZ290byBjbGVhbnVwX3J1bGVfaW5pdDsKLQl9Ci0JcmV0dXJuIHJldDsKLQotIGNsZWFudXBfcnVsZV9pbml0OgotCWlwX25hdF9ydWxlX2NsZWFudXAoKTsKLSBjbGVhbnVwX2RlY29kZV9zZXNzaW9uOgotI2lmZGVmIENPTkZJR19YRlJNCi0JaXBfbmF0X2RlY29kZV9zZXNzaW9uID0gTlVMTDsKLQlzeW5jaHJvbml6ZV9uZXQoKTsKLSNlbmRpZgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBpcF9uYXRfc3RhbmRhbG9uZV9maW5pKHZvaWQpCi17Ci0JbmZfdW5yZWdpc3Rlcl9ob29rcyhpcF9uYXRfb3BzLCBBUlJBWV9TSVpFKGlwX25hdF9vcHMpKTsKLQlpcF9uYXRfcnVsZV9jbGVhbnVwKCk7Ci0jaWZkZWYgQ09ORklHX1hGUk0KLQlpcF9uYXRfZGVjb2RlX3Nlc3Npb24gPSBOVUxMOwotCXN5bmNocm9uaXplX25ldCgpOwotI2VuZGlmCi19Ci0KLW1vZHVsZV9pbml0KGlwX25hdF9zdGFuZGFsb25lX2luaXQpOwotbW9kdWxlX2V4aXQoaXBfbmF0X3N0YW5kYWxvbmVfZmluaSk7Ci0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfdGZ0cC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF90ZnRwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNDc5MzUuLjAwMDAwMDAKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF90ZnRwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKiAoQykgMjAwMS0yMDAyIE1hZ251cyBCb2RlbiA8bWJAb3phYmEubWluZS5udT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFZlcnNpb246IDAuMC43Ci0gKgotICogVGh1IDIxIE1hciAyMDAyIEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+Ci0gKiAJLSBQb3J0IHRvIG5ld25hdCBBUEkKLSAqCi0gKiBUaGlzIG1vZHVsZSBjdXJyZW50bHkgc3VwcG9ydHMgRE5BVDoKLSAqIGlwdGFibGVzIC10IG5hdCAtQSBQUkVST1VUSU5HIC1kIHgueC54LnggLWogRE5BVCAtLXRvLWRlc3QgeC54LngueQotICoKLSAqIGFuZCBTTkFUOgotICogaXB0YWJsZXMgLXQgbmF0IC1BIFBPU1RST1VUSU5HIHsgLWogTUFTUVVFUkFERSAsIC1qIFNOQVQgLS10by1zb3VyY2UgeC54LngueCB9Ci0gKgotICogSXQgaGFzIG5vdCBiZWVuIHRlc3RlZCB3aXRoCi0gKiAtaiBTTkFUIC0tdG8tc291cmNlIHgueC54LngteC54LngueSBzaW5jZSBJIG9ubHkgaGF2ZSBvbmUgZXh0ZXJuYWwgaXAKLSAqIElmIHlvdSBkbyB0ZXN0IHRoaXMgcGxlYXNlIGxldCBtZSBrbm93IGlmIGl0IHdvcmtzIG9yIG5vdC4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaXAuaD4KLSNpbmNsdWRlIDxsaW51eC91ZHAuaD4KLQotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19oZWxwZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfdGZ0cC5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdF9oZWxwZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9uYXRfcnVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+Ci0KLU1PRFVMRV9BVVRIT1IoIk1hZ251cyBCb2RlbiA8bWJAb3phYmEubWluZS5udT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigidGZ0cCBOQVQgaGVscGVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgaGVscChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCi0JCQkgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCi0JCQkgc3RydWN0IGlwX2Nvbm50cmFja19leHBlY3QgKmV4cCkKLXsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdCA9IGV4cC0+bWFzdGVyOwotCi0JZXhwLT5zYXZlZF9wcm90by51ZHAucG9ydAotCQk9IGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZS5zcmMudS51ZHAucG9ydDsKLQlleHAtPmRpciA9IElQX0NUX0RJUl9SRVBMWTsKLQlleHAtPmV4cGVjdGZuID0gaXBfbmF0X2ZvbGxvd19tYXN0ZXI7Ci0JaWYgKGlwX2Nvbm50cmFja19leHBlY3RfcmVsYXRlZChleHApICE9IDApCi0JCXJldHVybiBORl9EUk9QOwotCXJldHVybiBORl9BQ0NFUFQ7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBpcF9uYXRfdGZ0cF9maW5pKHZvaWQpCi17Ci0JcmN1X2Fzc2lnbl9wb2ludGVyKGlwX25hdF90ZnRwX2hvb2ssIE5VTEwpOwotCXN5bmNocm9uaXplX3JjdSgpOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBpcF9uYXRfdGZ0cF9pbml0KHZvaWQpCi17Ci0JQlVHX09OKHJjdV9kZXJlZmVyZW5jZShpcF9uYXRfdGZ0cF9ob29rKSk7Ci0JcmN1X2Fzc2lnbl9wb2ludGVyKGlwX25hdF90ZnRwX2hvb2ssIGhlbHApOwotCXJldHVybiAwOwotfQotCi1tb2R1bGVfaW5pdChpcF9uYXRfdGZ0cF9pbml0KTsKLW1vZHVsZV9leGl0KGlwX25hdF90ZnRwX2ZpbmkpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX3F1ZXVlLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfcXVldWUuYwppbmRleCBhMTQ3OThhLi43MDJkOTRkIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfcXVldWUuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfcXVldWUuYwpAQCAtOCwxOCArOCw2IEBACiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIDIwMDAtMDMtMjc6IFNpbXBsaWZpZWQgY29kZSAodGhhbmtzIHRvIEFuZGkgS2xlZW4gZm9yIGNsdWVzKS4KLSAqIDIwMDAtMDUtMjA6IEZpeGVkIG5vdGlmaWVyIHByb2JsZW1zIChmb2xsb3dpbmcgTWlndWVsIEZyZWl0YXMnIHJlcG9ydCkuCi0gKiAyMDAwLTA2LTE5OiBGaXhlZCBzbyBuZm1hcmsgaXMgY29waWVkIHRvIG1ldGFkYXRhIChyZXBvcnRlZCBieSBTZWJhc3RpYW4KLSAqICAgICAgICAgICAgIFphbmRlcikuCi0gKiAyMDAwLTA4LTAxOiBBZGRlZCBOaWNrIFdpbGxpYW1zJyBNQUMgc3VwcG9ydC4KLSAqIDIwMDItMDYtMjU6IENvZGUgY2xlYW51cC4KLSAqIDIwMDUtMDEtMTA6IEFkZGVkIC9wcm9jIGNvdW50ZXIgZm9yIGRyb3BwZWQgcGFja2V0czsgZml4ZWQgc28KLSAqICAgICAgICAgICAgIHBhY2tldHMgYXJlbid0IGRlbGl2ZXJlZCB0byB1c2VyIHNwYWNlIGlmIHRoZXkncmUgZ29pbmcKLSAqICAgICAgICAgICAgIHRvIGJlIGRyb3BwZWQuCi0gKiAyMDA1LTA1LTI2OiBsb2NhbF9iaF97ZGlzYWJsZSxlbmFibGV9IGFyb3VuZCBuZl9yZWluamVjdCAoSGFyYWxkIFdlbHRlKQotICoKICAqLwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgpAQCAtMTkxLDEyICsxNzksMTMgQEAKIHN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqCiBpcHFfYnVpbGRfcGFja2V0X21lc3NhZ2Uoc3RydWN0IGlwcV9xdWV1ZV9lbnRyeSAqZW50cnksIGludCAqZXJycCkKIHsKLQl1bnNpZ25lZCBjaGFyICpvbGRfdGFpbDsKKwlza19idWZmX2RhdGFfdCBvbGRfdGFpbDsKIAlzaXplX3Qgc2l6ZSA9IDA7CiAJc2l6ZV90IGRhdGFfbGVuID0gMDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCBpcHFfcGFja2V0X21zZyAqcG1zZzsKIAlzdHJ1Y3Qgbmxtc2doZHIgKm5saDsKKwlzdHJ1Y3QgdGltZXZhbCB0djsKIAogCXJlYWRfbG9ja19iaCgmcXVldWVfbG9jayk7CiAKQEAgLTIzNCwxNSArMjIzLDE2IEBACiAJaWYgKCFza2IpCiAJCWdvdG8gbmxtc2dfZmFpbHVyZTsKIAotCW9sZF90YWlsPSBza2ItPnRhaWw7CisJb2xkX3RhaWwgPSBza2ItPnRhaWw7CiAJbmxoID0gTkxNU0dfUFVUKHNrYiwgMCwgMCwgSVBRTV9QQUNLRVQsIHNpemUgLSBzaXplb2YoKm5saCkpOwogCXBtc2cgPSBOTE1TR19EQVRBKG5saCk7CiAJbWVtc2V0KHBtc2csIDAsIHNpemVvZigqcG1zZykpOwogCiAJcG1zZy0+cGFja2V0X2lkICAgICAgID0gKHVuc2lnbmVkIGxvbmcgKWVudHJ5OwogCXBtc2ctPmRhdGFfbGVuICAgICAgICA9IGRhdGFfbGVuOwotCXBtc2ctPnRpbWVzdGFtcF9zZWMgICA9IGVudHJ5LT5za2ItPnRzdGFtcC5vZmZfc2VjOwotCXBtc2ctPnRpbWVzdGFtcF91c2VjICA9IGVudHJ5LT5za2ItPnRzdGFtcC5vZmZfdXNlYzsKKwl0diA9IGt0aW1lX3RvX3RpbWV2YWwoZW50cnktPnNrYi0+dHN0YW1wKTsKKwlwbXNnLT50aW1lc3RhbXBfc2VjICAgPSB0di50dl9zZWM7CisJcG1zZy0+dGltZXN0YW1wX3VzZWMgID0gdHYudHZfdXNlYzsKIAlwbXNnLT5tYXJrICAgICAgICAgICAgPSBlbnRyeS0+c2tiLT5tYXJrOwogCXBtc2ctPmhvb2sgICAgICAgICAgICA9IGVudHJ5LT5pbmZvLT5ob29rOwogCXBtc2ctPmh3X3Byb3RvY29sICAgICA9IGVudHJ5LT5za2ItPnByb3RvY29sOwpAQCAtMzc4LDcgKzM2OCw3IEBACiAJfQogCWlmICghc2tiX21ha2Vfd3JpdGFibGUoJmUtPnNrYiwgdi0+ZGF0YV9sZW4pKQogCQlyZXR1cm4gLUVOT01FTTsKLQltZW1jcHkoZS0+c2tiLT5kYXRhLCB2LT5wYXlsb2FkLCB2LT5kYXRhX2xlbik7CisJc2tiX2NvcHlfdG9fbGluZWFyX2RhdGEoZS0+c2tiLCB2LT5wYXlsb2FkLCB2LT5kYXRhX2xlbik7CiAJZS0+c2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOwogCiAJcmV0dXJuIDA7CkBAIC00OTUsNyArNDg1LDcgQEAKIAlpZiAoc2tibGVuIDwgc2l6ZW9mKCpubGgpKQogCQlyZXR1cm47CiAKLQlubGggPSAoc3RydWN0IG5sbXNnaGRyICopc2tiLT5kYXRhOworCW5saCA9IG5sbXNnX2hkcihza2IpOwogCW5sbXNnbGVuID0gbmxoLT5ubG1zZ19sZW47CiAJaWYgKG5sbXNnbGVuIDwgc2l6ZW9mKCpubGgpIHx8IHNrYmxlbiA8IG5sbXNnbGVuKQogCQlyZXR1cm47CkBAIC02NzgsNyArNjY4LDcgQEAKIAogCW5ldGxpbmtfcmVnaXN0ZXJfbm90aWZpZXIoJmlwcV9ubF9ub3RpZmllcik7CiAJaXBxbmwgPSBuZXRsaW5rX2tlcm5lbF9jcmVhdGUoTkVUTElOS19GSVJFV0FMTCwgMCwgaXBxX3Jjdl9zaywKLQkJCQkgICAgICBUSElTX01PRFVMRSk7CisJCQkJICAgICAgTlVMTCwgVEhJU19NT0RVTEUpOwogCWlmIChpcHFubCA9PSBOVUxMKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiaXBfcXVldWU6IGZhaWxlZCB0byBjcmVhdGUgbmV0bGluayBzb2NrZXRcbiIpOwogCQlnb3RvIGNsZWFudXBfbmV0bGlua19ub3RpZmllcjsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF90YWJsZXMuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF90YWJsZXMuYwppbmRleCA1MGNjNGI5Li5lM2Y4M2JmIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfdGFibGVzLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX3RhYmxlcy5jCkBAIC03LDEyICs3LDYgQEAKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogMTkgSmFuIDIwMDIgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KLSAqIAktIGluY3JlYXNlIG1vZHVsZSB1c2FnZSBjb3VudCBhcyBzb29uIGFzIHdlIGhhdmUgcnVsZXMgaW5zaWRlCi0gKiAJICBhIHRhYmxlCi0gKiAwOCBPY3QgMjAwNSBIYXJhbGQgV2VsdGUgPGxhZm9yZUBuZXRmaWx0ZXIub3JnPgotICogCS0gR2VuZXJhbGl6ZSBpbnRvICJ4X3RhYmxlcyIgbGF5ZXIgYW5kICJ7aXAsaXA2LGFycH1fdGFibGVzIgogICovCiAjaW5jbHVkZSA8bGludXgvY2FjaGUuaD4KICNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CkBAIC0xOTgsNyArMTkyLDcgQEAKIHsKIAkvKiBTdG9wIGl0ZXJhdGlvbiBpZiBpdCBkb2Vzbid0IG1hdGNoICovCiAJaWYgKCFtLT51Lmtlcm5lbC5tYXRjaC0+bWF0Y2goc2tiLCBpbiwgb3V0LCBtLT51Lmtlcm5lbC5tYXRjaCwgbS0+ZGF0YSwKLQkJCQkgICAgICBvZmZzZXQsIHNrYi0+bmguaXBoLT5paGwqNCwgaG90ZHJvcCkpCisJCQkJICAgICAgb2Zmc2V0LCBpcF9oZHJsZW4oc2tiKSwgaG90ZHJvcCkpCiAJCXJldHVybiAxOwogCWVsc2UKIAkJcmV0dXJuIDA7CkBAIC0yMzEsNyArMjI1LDcgQEAKIAlzdHJ1Y3QgeHRfdGFibGVfaW5mbyAqcHJpdmF0ZTsKIAogCS8qIEluaXRpYWxpemF0aW9uICovCi0JaXAgPSAoKnBza2IpLT5uaC5pcGg7CisJaXAgPSBpcF9oZHIoKnBza2IpOwogCWRhdGFsZW4gPSAoKnBza2IpLT5sZW4gLSBpcC0+aWhsICogNDsKIAlpbmRldiA9IGluID8gaW4tPm5hbWUgOiBudWxsZGV2bmFtZTsKIAlvdXRkZXYgPSBvdXQgPyBvdXQtPm5hbWUgOiBudWxsZGV2bmFtZTsKQEAgLTMyMCw3ICszMTQsNyBAQAogCQkJCQk9IDB4NTdhY2MwMDE7CiAjZW5kaWYKIAkJCQkvKiBUYXJnZXQgbWlnaHQgaGF2ZSBjaGFuZ2VkIHN0dWZmLiAqLwotCQkJCWlwID0gKCpwc2tiKS0+bmguaXBoOworCQkJCWlwID0gaXBfaGRyKCpwc2tiKTsKIAkJCQlkYXRhbGVuID0gKCpwc2tiKS0+bGVuIC0gaXAtPmlobCAqIDQ7CiAKIAkJCQlpZiAodmVyZGljdCA9PSBJUFRfQ09OVElOVUUpCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X0NMVVNURVJJUC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9DTFVTVEVSSVAuYwppbmRleCA0MmIwODAyLi40MGUyNzM0IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X0NMVVNURVJJUC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfQ0xVU1RFUklQLmMKQEAgLTIxLDE1ICsyMSwxMiBAQAogI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgotCi0jaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+Ci0KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfYXJwLmg+Ci0KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfQ0xVU1RFUklQLmg+Ci0jaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29tcGF0Lmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2suaD4KKyNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KIAogI2RlZmluZSBDTFVTVEVSSVBfVkVSU0lPTiAiMC44IgogCkBAIC0yNDAsNyArMjM3LDcgQEAKIHN0YXRpYyBpbmxpbmUgdV9pbnQzMl90CiBjbHVzdGVyaXBfaGFzaGZuKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBjbHVzdGVyaXBfY29uZmlnICpjb25maWcpCiB7Ci0Jc3RydWN0IGlwaGRyICppcGggPSBza2ItPm5oLmlwaDsKKwlzdHJ1Y3QgaXBoZHIgKmlwaCA9IGlwX2hkcihza2IpOwogCXVuc2lnbmVkIGxvbmcgaGFzaHZhbDsKIAl1X2ludDE2X3Qgc3BvcnQsIGRwb3J0OwogCXVfaW50MTZfdCAqcG9ydHM7CkBAIC0zMTAsMTUgKzMwNywxNiBAQAogICAgICAgIGNvbnN0IHZvaWQgKnRhcmdpbmZvKQogewogCWNvbnN0IHN0cnVjdCBpcHRfY2x1c3RlcmlwX3RndF9pbmZvICpjaXBpbmZvID0gdGFyZ2luZm87CisJc3RydWN0IG5mX2Nvbm4gKmN0OwogCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvOwotCXVfaW50MzJfdCAqbWFyaywgaGFzaDsKKwl1X2ludDMyX3QgaGFzaDsKIAogCS8qIGRvbid0IG5lZWQgdG8gY2x1c3RlcmlwX2NvbmZpZ19nZXQoKSBoZXJlLCBzaW5jZSByZWZjb3VudAogCSAqIGlzIG9ubHkgZGVjcmVtZW50ZWQgYnkgZGVzdHJveSgpIC0gYW5kIGlwX3RhYmxlcyBndWFyYW50ZWVzCiAJICogdGhhdCB0aGUgLT50YXJnZXQoKSBmdW5jdGlvbiBpc24ndCBjYWxsZWQgYWZ0ZXIgLT5kZXN0cm95KCkgKi8KIAotCW1hcmsgPSBuZl9jdF9nZXRfbWFyaygoKnBza2IpLCAmY3RpbmZvKTsKLQlpZiAobWFyayA9PSBOVUxMKSB7CisJY3QgPSBuZl9jdF9nZXQoKnBza2IsICZjdGluZm8pOworCWlmIChjdCA9PSBOVUxMKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiQ0xVU1RFUklQOiBubyBjb25udHJhY2shXG4iKTsKIAkJCS8qIEZJWE1FOiBuZWVkIHRvIGRyb3AgaW52YWxpZCBvbmVzLCBzaW5jZSByZXBsaWVzCiAJCQkgKiB0byBvdXRnb2luZyBjb25uZWN0aW9ucyBvZiBvdGhlciBub2RlcyB3aWxsIGJlCkBAIC0zMjgsNyArMzI2LDcgQEAKIAogCS8qIHNwZWNpYWwgY2FzZTogSUNNUCBlcnJvciBoYW5kbGluZy4gY29ubnRyYWNrIGRpc3Rpbmd1aXNoZXMgYmV0d2VlbgogCSAqIGVycm9yIG1lc3NhZ2VzIChSRUxBVEVEKSBhbmQgaW5mb3JtYXRpb24gcmVxdWVzdHMgKHNlZSBiZWxvdykgKi8KLQlpZiAoKCpwc2tiKS0+bmguaXBoLT5wcm90b2NvbCA9PSBJUFBST1RPX0lDTVAKKwlpZiAoaXBfaGRyKCpwc2tiKS0+cHJvdG9jb2wgPT0gSVBQUk9UT19JQ01QCiAJICAgICYmIChjdGluZm8gPT0gSVBfQ1RfUkVMQVRFRAogCQl8fCBjdGluZm8gPT0gSVBfQ1RfUkVMQVRFRCtJUF9DVF9JU19SRVBMWSkpCiAJCXJldHVybiBYVF9DT05USU5VRTsKQEAgLTM0MSw3ICszMzksNyBAQAogCiAJc3dpdGNoIChjdGluZm8pIHsKIAkJY2FzZSBJUF9DVF9ORVc6Ci0JCQkqbWFyayA9IGhhc2g7CisJCQljdC0+bWFyayA9IGhhc2g7CiAJCQlicmVhazsKIAkJY2FzZSBJUF9DVF9SRUxBVEVEOgogCQljYXNlIElQX0NUX1JFTEFURUQrSVBfQ1RfSVNfUkVQTFk6CkBAIC0zNTgsNyArMzU2LDcgQEAKICNpZmRlZiBERUJVR19DTFVTVEVSUAogCURVTVBfVFVQTEUoJmN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZSk7CiAjZW5kaWYKLQlERUJVR1AoImhhc2g9JXUgY3RfaGFzaD0ldSAiLCBoYXNoLCAqbWFyayk7CisJREVCVUdQKCJoYXNoPSV1IGN0X2hhc2g9JXUgIiwgaGFzaCwgY3QtPm1hcmspOwogCWlmICghY2x1c3RlcmlwX3Jlc3BvbnNpYmxlKGNpcGluZm8tPmNvbmZpZywgaGFzaCkpIHsKIAkJREVCVUdQKCJub3QgcmVzcG9uc2libGVcbiIpOwogCQlyZXR1cm4gTkZfRFJPUDsKQEAgLTUyMSw3ICs1MTksNyBAQAogCSAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCiAJICAgaW50ICgqb2tmbikoc3RydWN0IHNrX2J1ZmYgKikpCiB7Ci0Jc3RydWN0IGFycGhkciAqYXJwID0gKCpwc2tiKS0+bmguYXJwaDsKKwlzdHJ1Y3QgYXJwaGRyICphcnAgPSBhcnBfaGRyKCpwc2tiKTsKIAlzdHJ1Y3QgYXJwX3BheWxvYWQgKnBheWxvYWQ7CiAJc3RydWN0IGNsdXN0ZXJpcF9jb25maWcgKmM7CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfRUNOLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X0VDTi5jCmluZGV4IDRmNTY1NjMuLjkxOGNhOTIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfRUNOLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9FQ04uYwpAQCAtNSwxNCArNSwxMyBAQAogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBpcHRfRUNOLmMsdiAxLjUgMjAwMi8wOC8xOCAxOTozNjo1MSBsYWZvcmdlIEV4cAogKi8KIAogI2luY2x1ZGUgPGxpbnV4L2luLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxuZXQvaXAuaD4KICNpbmNsdWRlIDxsaW51eC90Y3AuaD4KICNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KIApAQCAtMjksMTMgKzI4LDEzIEBACiBzdGF0aWMgaW5saW5lIGludAogc2V0X2VjdF9pcChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsIGNvbnN0IHN0cnVjdCBpcHRfRUNOX2luZm8gKmVpbmZvKQogewotCXN0cnVjdCBpcGhkciAqaXBoID0gKCpwc2tiKS0+bmguaXBoOworCXN0cnVjdCBpcGhkciAqaXBoID0gaXBfaGRyKCpwc2tiKTsKIAogCWlmICgoaXBoLT50b3MgJiBJUFRfRUNOX0lQX01BU0spICE9IChlaW5mby0+aXBfZWN0ICYgSVBUX0VDTl9JUF9NQVNLKSkgewogCQlfX3U4IG9sZHRvczsKIAkJaWYgKCFza2JfbWFrZV93cml0YWJsZShwc2tiLCBzaXplb2Yoc3RydWN0IGlwaGRyKSkpCiAJCQlyZXR1cm4gMDsKLQkJaXBoID0gKCpwc2tiKS0+bmguaXBoOworCQlpcGggPSBpcF9oZHIoKnBza2IpOwogCQlvbGR0b3MgPSBpcGgtPnRvczsKIAkJaXBoLT50b3MgJj0gfklQVF9FQ05fSVBfTUFTSzsKIAkJaXBoLT50b3MgfD0gKGVpbmZvLT5pcF9lY3QgJiBJUFRfRUNOX0lQX01BU0spOwpAQCAtNTIsNyArNTEsNyBAQAogCV9fYmUxNiBvbGR2YWw7CiAKIAkvKiBOb3QgZW5vdWdodCBoZWFkZXI/ICovCi0JdGNwaCA9IHNrYl9oZWFkZXJfcG9pbnRlcigqcHNrYiwgKCpwc2tiKS0+bmguaXBoLT5paGwqNCwKKwl0Y3BoID0gc2tiX2hlYWRlcl9wb2ludGVyKCpwc2tiLCBpcF9oZHJsZW4oKnBza2IpLAogCQkJCSAgc2l6ZW9mKF90Y3BoKSwgJl90Y3BoKTsKIAlpZiAoIXRjcGgpCiAJCXJldHVybiAwOwpAQCAtNjMsOSArNjIsOSBAQAogCSAgICAgdGNwaC0+Y3dyID09IGVpbmZvLT5wcm90by50Y3AuY3dyKSkpCiAJCXJldHVybiAxOwogCi0JaWYgKCFza2JfbWFrZV93cml0YWJsZShwc2tiLCAoKnBza2IpLT5uaC5pcGgtPmlobCo0K3NpemVvZigqdGNwaCkpKQorCWlmICghc2tiX21ha2Vfd3JpdGFibGUocHNrYiwgaXBfaGRybGVuKCpwc2tiKSArIHNpemVvZigqdGNwaCkpKQogCQlyZXR1cm4gMDsKLQl0Y3BoID0gKHZvaWQgKikoKnBza2IpLT5uaC5pcGggKyAoKnBza2IpLT5uaC5pcGgtPmlobCo0OworCXRjcGggPSAodm9pZCAqKWlwX2hkcigqcHNrYikgKyBpcF9oZHJsZW4oKnBza2IpOwogCiAJb2xkdmFsID0gKChfX2JlMTYgKil0Y3BoKVs2XTsKIAlpZiAoZWluZm8tPm9wZXJhdGlvbiAmIElQVF9FQ05fT1BfU0VUX0VDRSkKQEAgLTkzLDcgKzkyLDcgQEAKIAkJCXJldHVybiBORl9EUk9QOwogCiAJaWYgKGVpbmZvLT5vcGVyYXRpb24gJiAoSVBUX0VDTl9PUF9TRVRfRUNFIHwgSVBUX0VDTl9PUF9TRVRfQ1dSKQotCSAgICAmJiAoKnBza2IpLT5uaC5pcGgtPnByb3RvY29sID09IElQUFJPVE9fVENQKQorCSAgICAmJiBpcF9oZHIoKnBza2IpLT5wcm90b2NvbCA9PSBJUFBST1RPX1RDUCkKIAkJaWYgKCFzZXRfZWN0X3RjcChwc2tiLCBlaW5mbykpCiAJCQlyZXR1cm4gTkZfRFJPUDsKIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9MT0cuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfTE9HLmMKaW5kZXggZDljMzdmZC4uYTQyYzVjZCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9MT0cuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X0xPRy5jCkBAIC0zOTksOSArMzk5LDkgQEAKIAkJLyogTUFDIGxvZ2dpbmcgZm9yIGlucHV0IGNoYWluIG9ubHkuICovCiAJCXByaW50aygiTUFDPSIpOwogCQlpZiAoc2tiLT5kZXYgJiYgc2tiLT5kZXYtPmhhcmRfaGVhZGVyX2xlbgotCQkgICAgJiYgc2tiLT5tYWMucmF3ICE9ICh2b2lkKilza2ItPm5oLmlwaCkgeworCQkgICAgJiYgc2tiLT5tYWNfaGVhZGVyICE9IHNrYi0+bmV0d29ya19oZWFkZXIpIHsKIAkJCWludCBpOwotCQkJdW5zaWduZWQgY2hhciAqcCA9IHNrYi0+bWFjLnJhdzsKKwkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnAgPSBza2JfbWFjX2hlYWRlcihza2IpOwogCQkJZm9yIChpID0gMDsgaSA8IHNrYi0+ZGV2LT5oYXJkX2hlYWRlcl9sZW47IGkrKyxwKyspCiAJCQkJcHJpbnRrKCIlMDJ4JWMiLCAqcCwKIAkJCQkgICAgICAgaT09c2tiLT5kZXYtPmhhcmRfaGVhZGVyX2xlbiAtIDEKQEAgLTQ3NywxNCArNDc3LDEwIEBACiAJcmV0ID0geHRfcmVnaXN0ZXJfdGFyZ2V0KCZpcHRfbG9nX3JlZyk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7Ci0JaWYgKG5mX2xvZ19yZWdpc3RlcihQRl9JTkVULCAmaXB0X2xvZ19sb2dnZXIpIDwgMCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJpcHRfTE9HOiBub3QgbG9nZ2luZyB2aWEgc3lzdGVtIGNvbnNvbGUgIgotCQkgICAgICAgInNpbmNlIHNvbWVib2R5IGVsc2UgYWxyZWFkeSByZWdpc3RlcmVkIGZvciBQRl9JTkVUXG4iKTsKLQkJLyogd2UgY2Fubm90IG1ha2UgbW9kdWxlIGxvYWQgZmFpbCBoZXJlLCBzaW5jZSBvdGhlcndpc2UKLQkJICogaXB0YWJsZXMgdXNlcnNwYWNlIHdvdWxkIGFib3J0ICovCi0JfQotCi0JcmV0dXJuIDA7CisJcmV0ID0gbmZfbG9nX3JlZ2lzdGVyKFBGX0lORVQsICZpcHRfbG9nX2xvZ2dlcik7CisJaWYgKHJldCA8IDAgJiYgcmV0ICE9IC1FRVhJU1QpCisJCXh0X3VucmVnaXN0ZXJfdGFyZ2V0KCZpcHRfbG9nX3JlZyk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGlwdF9sb2dfZmluaSh2b2lkKQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9NQVNRVUVSQURFLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X01BU1FVRVJBREUuYwppbmRleCBiNTk1NWYzLi5kNGYyZDc3IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X01BU1FVRVJBREUuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X01BU1FVRVJBREUuYwpAQCAtMTksMTIgKzE5LDggQEAKICNpbmNsdWRlIDxuZXQvaXAuaD4KICNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KICNpbmNsdWRlIDxuZXQvcm91dGUuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC5oPgotI2lmZGVmIENPTkZJR19ORl9OQVRfTkVFREVECiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9uYXRfcnVsZS5oPgotI2Vsc2UKLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9uYXRfcnVsZS5oPgotI2VuZGlmCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpAQCAtNDgsNyArNDQsNyBAQAogCQkgdm9pZCAqdGFyZ2luZm8sCiAJCSB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQogewotCWNvbnN0IHN0cnVjdCBpcF9uYXRfbXVsdGlfcmFuZ2VfY29tcGF0ICptciA9IHRhcmdpbmZvOworCWNvbnN0IHN0cnVjdCBuZl9uYXRfbXVsdGlfcmFuZ2VfY29tcGF0ICptciA9IHRhcmdpbmZvOwogCiAJaWYgKG1yLT5yYW5nZVswXS5mbGFncyAmIElQX05BVF9SQU5HRV9NQVBfSVBTKSB7CiAJCURFQlVHUCgibWFzcXVlcmFkZV9jaGVjazogYmFkIE1BUF9JUFMuXG4iKTsKQEAgLTY5LDMzICs2NSwyNiBAQAogCQkgIGNvbnN0IHN0cnVjdCB4dF90YXJnZXQgKnRhcmdldCwKIAkJICBjb25zdCB2b2lkICp0YXJnaW5mbykKIHsKLSNpZmRlZiBDT05GSUdfTkZfTkFUX05FRURFRAorCXN0cnVjdCBuZl9jb25uICpjdDsKIAlzdHJ1Y3QgbmZfY29ubl9uYXQgKm5hdDsKLSNlbmRpZgotCXN0cnVjdCBpcF9jb25udHJhY2sgKmN0OwogCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvOwotCXN0cnVjdCBpcF9uYXRfcmFuZ2UgbmV3cmFuZ2U7Ci0JY29uc3Qgc3RydWN0IGlwX25hdF9tdWx0aV9yYW5nZV9jb21wYXQgKm1yOworCXN0cnVjdCBuZl9uYXRfcmFuZ2UgbmV3cmFuZ2U7CisJY29uc3Qgc3RydWN0IG5mX25hdF9tdWx0aV9yYW5nZV9jb21wYXQgKm1yOwogCXN0cnVjdCBydGFibGUgKnJ0OwogCV9fYmUzMiBuZXdzcmM7CiAKLQlJUF9ORl9BU1NFUlQoaG9va251bSA9PSBORl9JUF9QT1NUX1JPVVRJTkcpOworCU5GX0NUX0FTU0VSVChob29rbnVtID09IE5GX0lQX1BPU1RfUk9VVElORyk7CiAKLQljdCA9IGlwX2Nvbm50cmFja19nZXQoKnBza2IsICZjdGluZm8pOwotI2lmZGVmIENPTkZJR19ORl9OQVRfTkVFREVECisJY3QgPSBuZl9jdF9nZXQoKnBza2IsICZjdGluZm8pOwogCW5hdCA9IG5mY3RfbmF0KGN0KTsKLSNlbmRpZgotCUlQX05GX0FTU0VSVChjdCAmJiAoY3RpbmZvID09IElQX0NUX05FVyB8fCBjdGluZm8gPT0gSVBfQ1RfUkVMQVRFRAorCisJTkZfQ1RfQVNTRVJUKGN0ICYmIChjdGluZm8gPT0gSVBfQ1RfTkVXIHx8IGN0aW5mbyA9PSBJUF9DVF9SRUxBVEVECiAJCQkgICAgfHwgY3RpbmZvID09IElQX0NUX1JFTEFURUQgKyBJUF9DVF9JU19SRVBMWSkpOwogCiAJLyogU291cmNlIGFkZHJlc3MgaXMgMC4wLjAuMCAtIGxvY2FsbHkgZ2VuZXJhdGVkIHBhY2tldCB0aGF0IGlzCiAJICogcHJvYmFibHkgbm90IHN1cHBvc2VkIHRvIGJlIG1hc3F1ZXJhZGVkLgogCSAqLwotI2lmZGVmIENPTkZJR19ORl9OQVRfTkVFREVECiAJaWYgKGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZS5zcmMudTMuaXAgPT0gMCkKLSNlbHNlCi0JaWYgKGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZS5zcmMuaXAgPT0gMCkKLSNlbmRpZgogCQlyZXR1cm4gTkZfQUNDRVBUOwogCiAJbXIgPSB0YXJnaW5mbzsKQEAgLTEwNyw0MCArOTYsMzAgQEAKIAl9CiAKIAl3cml0ZV9sb2NrX2JoKCZtYXNxX2xvY2spOwotI2lmZGVmIENPTkZJR19ORl9OQVRfTkVFREVECiAJbmF0LT5tYXNxX2luZGV4ID0gb3V0LT5pZmluZGV4OwotI2Vsc2UKLQljdC0+bmF0Lm1hc3FfaW5kZXggPSBvdXQtPmlmaW5kZXg7Ci0jZW5kaWYKIAl3cml0ZV91bmxvY2tfYmgoJm1hc3FfbG9jayk7CiAKIAkvKiBUcmFuc2ZlciBmcm9tIG9yaWdpbmFsIHJhbmdlLiAqLwotCW5ld3JhbmdlID0gKChzdHJ1Y3QgaXBfbmF0X3JhbmdlKQorCW5ld3JhbmdlID0gKChzdHJ1Y3QgbmZfbmF0X3JhbmdlKQogCQl7IG1yLT5yYW5nZVswXS5mbGFncyB8IElQX05BVF9SQU5HRV9NQVBfSVBTLAogCQkgIG5ld3NyYywgbmV3c3JjLAogCQkgIG1yLT5yYW5nZVswXS5taW4sIG1yLT5yYW5nZVswXS5tYXggfSk7CiAKIAkvKiBIYW5kIG1vZGlmaWVkIHJhbmdlIHRvIGdlbmVyaWMgc2V0dXAuICovCi0JcmV0dXJuIGlwX25hdF9zZXR1cF9pbmZvKGN0LCAmbmV3cmFuZ2UsIGhvb2tudW0pOworCXJldHVybiBuZl9uYXRfc2V0dXBfaW5mbyhjdCwgJm5ld3JhbmdlLCBob29rbnVtKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQKLWRldmljZV9jbXAoc3RydWN0IGlwX2Nvbm50cmFjayAqaSwgdm9pZCAqaWZpbmRleCkKK2RldmljZV9jbXAoc3RydWN0IG5mX2Nvbm4gKmksIHZvaWQgKmlmaW5kZXgpCiB7Ci0JaW50IHJldDsKLSNpZmRlZiBDT05GSUdfTkZfTkFUX05FRURFRAogCXN0cnVjdCBuZl9jb25uX25hdCAqbmF0ID0gbmZjdF9uYXQoaSk7CisJaW50IHJldDsKIAogCWlmICghbmF0KQogCQlyZXR1cm4gMDsKLSNlbmRpZgogCiAJcmVhZF9sb2NrX2JoKCZtYXNxX2xvY2spOwotI2lmZGVmIENPTkZJR19ORl9OQVRfTkVFREVECiAJcmV0ID0gKG5hdC0+bWFzcV9pbmRleCA9PSAoaW50KShsb25nKWlmaW5kZXgpOwotI2Vsc2UKLQlyZXQgPSAoaS0+bmF0Lm1hc3FfaW5kZXggPT0gKGludCkobG9uZylpZmluZGV4KTsKLSNlbmRpZgogCXJlYWRfdW5sb2NrX2JoKCZtYXNxX2xvY2spOwogCiAJcmV0dXJuIHJldDsKQEAgLTE1Niw5ICsxMzUsOSBAQAogCQkvKiBEZXZpY2Ugd2FzIGRvd25lZC4gIFNlYXJjaCBlbnRpcmUgdGFibGUgZm9yCiAJCSAgIGNvbm50cmFja3Mgd2hpY2ggd2VyZSBhc3NvY2lhdGVkIHdpdGggdGhhdCBkZXZpY2UsCiAJCSAgIGFuZCBmb3JnZXQgdGhlbS4gKi8KLQkJSVBfTkZfQVNTRVJUKGRldi0+aWZpbmRleCAhPSAwKTsKKwkJTkZfQ1RfQVNTRVJUKGRldi0+aWZpbmRleCAhPSAwKTsKIAotCQlpcF9jdF9pdGVyYXRlX2NsZWFudXAoZGV2aWNlX2NtcCwgKHZvaWQgKikobG9uZylkZXYtPmlmaW5kZXgpOworCQluZl9jdF9pdGVyYXRlX2NsZWFudXAoZGV2aWNlX2NtcCwgKHZvaWQgKikobG9uZylkZXYtPmlmaW5kZXgpOwogCX0KIAogCXJldHVybiBOT1RJRllfRE9ORTsKQEAgLTE3NCw5ICsxNTMsOSBAQAogCQkvKiBJUCBhZGRyZXNzIHdhcyBkZWxldGVkLiAgU2VhcmNoIGVudGlyZSB0YWJsZSBmb3IKIAkJICAgY29ubnRyYWNrcyB3aGljaCB3ZXJlIGFzc29jaWF0ZWQgd2l0aCB0aGF0IGRldmljZSwKIAkJICAgYW5kIGZvcmdldCB0aGVtLiAqLwotCQlJUF9ORl9BU1NFUlQoZGV2LT5pZmluZGV4ICE9IDApOworCQlORl9DVF9BU1NFUlQoZGV2LT5pZmluZGV4ICE9IDApOwogCi0JCWlwX2N0X2l0ZXJhdGVfY2xlYW51cChkZXZpY2VfY21wLCAodm9pZCAqKShsb25nKWRldi0+aWZpbmRleCk7CisJCW5mX2N0X2l0ZXJhdGVfY2xlYW51cChkZXZpY2VfY21wLCAodm9pZCAqKShsb25nKWRldi0+aWZpbmRleCk7CiAJfQogCiAJcmV0dXJuIE5PVElGWV9ET05FOwpAQCAtMTk0LDcgKzE3Myw3IEBACiAJLm5hbWUJCT0gIk1BU1FVRVJBREUiLAogCS5mYW1pbHkJCT0gQUZfSU5FVCwKIAkudGFyZ2V0CQk9IG1hc3F1ZXJhZGVfdGFyZ2V0LAotCS50YXJnZXRzaXplCT0gc2l6ZW9mKHN0cnVjdCBpcF9uYXRfbXVsdGlfcmFuZ2VfY29tcGF0KSwKKwkudGFyZ2V0c2l6ZQk9IHNpemVvZihzdHJ1Y3QgbmZfbmF0X211bHRpX3JhbmdlX2NvbXBhdCksCiAJLnRhYmxlCQk9ICJuYXQiLAogCS5ob29rcwkJPSAxIDw8IE5GX0lQX1BPU1RfUk9VVElORywKIAkuY2hlY2tlbnRyeQk9IG1hc3F1ZXJhZGVfY2hlY2ssCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X05FVE1BUC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9ORVRNQVAuYwppbmRleCBmZDdhYWEzLi4wNjhjNjliIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X05FVE1BUC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfTkVUTUFQLmMKQEAgLTE2LDExICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KLSNpZmRlZiBDT05GSUdfTkZfTkFUX05FRURFRAogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfbmF0X3J1bGUuaD4KLSNlbHNlCi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfbmF0X3J1bGUuaD4KLSNlbmRpZgogCiAjZGVmaW5lIE1PRFVMRU5BTUUgIk5FVE1BUCIKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKQEAgLTQwLDcgKzM2LDcgQEAKICAgICAgIHZvaWQgKnRhcmdpbmZvLAogICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKIHsKLQljb25zdCBzdHJ1Y3QgaXBfbmF0X211bHRpX3JhbmdlX2NvbXBhdCAqbXIgPSB0YXJnaW5mbzsKKwljb25zdCBzdHJ1Y3QgbmZfbmF0X211bHRpX3JhbmdlX2NvbXBhdCAqbXIgPSB0YXJnaW5mbzsKIAogCWlmICghKG1yLT5yYW5nZVswXS5mbGFncyAmIElQX05BVF9SQU5HRV9NQVBfSVBTKSkgewogCQlERUJVR1AoTU9EVUxFTkFNRSI6Y2hlY2s6IGJhZCBNQVBfSVBTLlxuIik7CkBAIC02MSwzOSArNTcsMzkgQEAKICAgICAgICBjb25zdCBzdHJ1Y3QgeHRfdGFyZ2V0ICp0YXJnZXQsCiAgICAgICAgY29uc3Qgdm9pZCAqdGFyZ2luZm8pCiB7Ci0Jc3RydWN0IGlwX2Nvbm50cmFjayAqY3Q7CisJc3RydWN0IG5mX2Nvbm4gKmN0OwogCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvOwogCV9fYmUzMiBuZXdfaXAsIG5ldG1hc2s7Ci0JY29uc3Qgc3RydWN0IGlwX25hdF9tdWx0aV9yYW5nZV9jb21wYXQgKm1yID0gdGFyZ2luZm87Ci0Jc3RydWN0IGlwX25hdF9yYW5nZSBuZXdyYW5nZTsKKwljb25zdCBzdHJ1Y3QgbmZfbmF0X211bHRpX3JhbmdlX2NvbXBhdCAqbXIgPSB0YXJnaW5mbzsKKwlzdHJ1Y3QgbmZfbmF0X3JhbmdlIG5ld3JhbmdlOwogCi0JSVBfTkZfQVNTRVJUKGhvb2tudW0gPT0gTkZfSVBfUFJFX1JPVVRJTkcKKwlORl9DVF9BU1NFUlQoaG9va251bSA9PSBORl9JUF9QUkVfUk9VVElORwogCQkgICAgIHx8IGhvb2tudW0gPT0gTkZfSVBfUE9TVF9ST1VUSU5HCiAJCSAgICAgfHwgaG9va251bSA9PSBORl9JUF9MT0NBTF9PVVQpOwotCWN0ID0gaXBfY29ubnRyYWNrX2dldCgqcHNrYiwgJmN0aW5mbyk7CisJY3QgPSBuZl9jdF9nZXQoKnBza2IsICZjdGluZm8pOwogCiAJbmV0bWFzayA9IH4obXItPnJhbmdlWzBdLm1pbl9pcCBeIG1yLT5yYW5nZVswXS5tYXhfaXApOwogCiAJaWYgKGhvb2tudW0gPT0gTkZfSVBfUFJFX1JPVVRJTkcgfHwgaG9va251bSA9PSBORl9JUF9MT0NBTF9PVVQpCi0JCW5ld19pcCA9ICgqcHNrYiktPm5oLmlwaC0+ZGFkZHIgJiB+bmV0bWFzazsKKwkJbmV3X2lwID0gaXBfaGRyKCpwc2tiKS0+ZGFkZHIgJiB+bmV0bWFzazsKIAllbHNlCi0JCW5ld19pcCA9ICgqcHNrYiktPm5oLmlwaC0+c2FkZHIgJiB+bmV0bWFzazsKKwkJbmV3X2lwID0gaXBfaGRyKCpwc2tiKS0+c2FkZHIgJiB+bmV0bWFzazsKIAluZXdfaXAgfD0gbXItPnJhbmdlWzBdLm1pbl9pcCAmIG5ldG1hc2s7CiAKLQluZXdyYW5nZSA9ICgoc3RydWN0IGlwX25hdF9yYW5nZSkKKwluZXdyYW5nZSA9ICgoc3RydWN0IG5mX25hdF9yYW5nZSkKIAkJeyBtci0+cmFuZ2VbMF0uZmxhZ3MgfCBJUF9OQVRfUkFOR0VfTUFQX0lQUywKIAkJICBuZXdfaXAsIG5ld19pcCwKIAkJICBtci0+cmFuZ2VbMF0ubWluLCBtci0+cmFuZ2VbMF0ubWF4IH0pOwogCiAJLyogSGFuZCBtb2RpZmllZCByYW5nZSB0byBnZW5lcmljIHNldHVwLiAqLwotCXJldHVybiBpcF9uYXRfc2V0dXBfaW5mbyhjdCwgJm5ld3JhbmdlLCBob29rbnVtKTsKKwlyZXR1cm4gbmZfbmF0X3NldHVwX2luZm8oY3QsICZuZXdyYW5nZSwgaG9va251bSk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgeHRfdGFyZ2V0IHRhcmdldF9tb2R1bGUgPSB7CiAJLm5hbWUgCQk9IE1PRFVMRU5BTUUsCiAJLmZhbWlseQkJPSBBRl9JTkVULAogCS50YXJnZXQgCT0gdGFyZ2V0LAotCS50YXJnZXRzaXplCT0gc2l6ZW9mKHN0cnVjdCBpcF9uYXRfbXVsdGlfcmFuZ2VfY29tcGF0KSwKKwkudGFyZ2V0c2l6ZQk9IHNpemVvZihzdHJ1Y3QgbmZfbmF0X211bHRpX3JhbmdlX2NvbXBhdCksCiAJLnRhYmxlCQk9ICJuYXQiLAogCS5ob29rcwkJPSAoMSA8PCBORl9JUF9QUkVfUk9VVElORykgfCAoMSA8PCBORl9JUF9QT1NUX1JPVVRJTkcpIHwKIAkJCSAgKDEgPDwgTkZfSVBfTE9DQUxfT1VUKSwKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfUkVESVJFQ1QuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfUkVESVJFQ1QuYwppbmRleCBjMmI2YjgwLi42OGNjNzZhMSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9SRURJUkVDVC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfUkVESVJFQ1QuYwpAQCAtMTksMTEgKzE5LDcgQEAKICNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgotI2lmZGVmIENPTkZJR19ORl9OQVRfTkVFREVECiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9uYXRfcnVsZS5oPgotI2Vsc2UKLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9uYXRfcnVsZS5oPgotI2VuZGlmCiAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9BVVRIT1IoIk5ldGZpbHRlciBDb3JlIFRlYW0gPGNvcmV0ZWFtQG5ldGZpbHRlci5vcmc+Iik7CkBAIC00Myw3ICszOSw3IEBACiAJICAgICAgIHZvaWQgKnRhcmdpbmZvLAogCSAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQogewotCWNvbnN0IHN0cnVjdCBpcF9uYXRfbXVsdGlfcmFuZ2VfY29tcGF0ICptciA9IHRhcmdpbmZvOworCWNvbnN0IHN0cnVjdCBuZl9uYXRfbXVsdGlfcmFuZ2VfY29tcGF0ICptciA9IHRhcmdpbmZvOwogCiAJaWYgKG1yLT5yYW5nZVswXS5mbGFncyAmIElQX05BVF9SQU5HRV9NQVBfSVBTKSB7CiAJCURFQlVHUCgicmVkaXJlY3RfY2hlY2s6IGJhZCBNQVBfSVBTLlxuIik7CkBAIC02NCwxNyArNjAsMTcgQEAKIAkJY29uc3Qgc3RydWN0IHh0X3RhcmdldCAqdGFyZ2V0LAogCQljb25zdCB2b2lkICp0YXJnaW5mbykKIHsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdDsKKwlzdHJ1Y3QgbmZfY29ubiAqY3Q7CiAJZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm87CiAJX19iZTMyIG5ld2RzdDsKLQljb25zdCBzdHJ1Y3QgaXBfbmF0X211bHRpX3JhbmdlX2NvbXBhdCAqbXIgPSB0YXJnaW5mbzsKLQlzdHJ1Y3QgaXBfbmF0X3JhbmdlIG5ld3JhbmdlOworCWNvbnN0IHN0cnVjdCBuZl9uYXRfbXVsdGlfcmFuZ2VfY29tcGF0ICptciA9IHRhcmdpbmZvOworCXN0cnVjdCBuZl9uYXRfcmFuZ2UgbmV3cmFuZ2U7CiAKLQlJUF9ORl9BU1NFUlQoaG9va251bSA9PSBORl9JUF9QUkVfUk9VVElORworCU5GX0NUX0FTU0VSVChob29rbnVtID09IE5GX0lQX1BSRV9ST1VUSU5HCiAJCSAgICAgfHwgaG9va251bSA9PSBORl9JUF9MT0NBTF9PVVQpOwogCi0JY3QgPSBpcF9jb25udHJhY2tfZ2V0KCpwc2tiLCAmY3RpbmZvKTsKLQlJUF9ORl9BU1NFUlQoY3QgJiYgKGN0aW5mbyA9PSBJUF9DVF9ORVcgfHwgY3RpbmZvID09IElQX0NUX1JFTEFURUQpKTsKKwljdCA9IG5mX2N0X2dldCgqcHNrYiwgJmN0aW5mbyk7CisJTkZfQ1RfQVNTRVJUKGN0ICYmIChjdGluZm8gPT0gSVBfQ1RfTkVXIHx8IGN0aW5mbyA9PSBJUF9DVF9SRUxBVEVEKSk7CiAKIAkvKiBMb2NhbCBwYWNrZXRzOiBtYWtlIHRoZW0gZ28gdG8gbG9vcGJhY2sgKi8KIAlpZiAoaG9va251bSA9PSBORl9JUF9MT0NBTF9PVVQpCkBAIC05NiwyMCArOTIsMjAgQEAKIAl9CiAKIAkvKiBUcmFuc2ZlciBmcm9tIG9yaWdpbmFsIHJhbmdlLiAqLwotCW5ld3JhbmdlID0gKChzdHJ1Y3QgaXBfbmF0X3JhbmdlKQorCW5ld3JhbmdlID0gKChzdHJ1Y3QgbmZfbmF0X3JhbmdlKQogCQl7IG1yLT5yYW5nZVswXS5mbGFncyB8IElQX05BVF9SQU5HRV9NQVBfSVBTLAogCQkgIG5ld2RzdCwgbmV3ZHN0LAogCQkgIG1yLT5yYW5nZVswXS5taW4sIG1yLT5yYW5nZVswXS5tYXggfSk7CiAKIAkvKiBIYW5kIG1vZGlmaWVkIHJhbmdlIHRvIGdlbmVyaWMgc2V0dXAuICovCi0JcmV0dXJuIGlwX25hdF9zZXR1cF9pbmZvKGN0LCAmbmV3cmFuZ2UsIGhvb2tudW0pOworCXJldHVybiBuZl9uYXRfc2V0dXBfaW5mbyhjdCwgJm5ld3JhbmdlLCBob29rbnVtKTsKIH0KIAogc3RhdGljIHN0cnVjdCB4dF90YXJnZXQgcmVkaXJlY3RfcmVnID0gewogCS5uYW1lCQk9ICJSRURJUkVDVCIsCiAJLmZhbWlseQkJPSBBRl9JTkVULAogCS50YXJnZXQJCT0gcmVkaXJlY3RfdGFyZ2V0LAotCS50YXJnZXRzaXplCT0gc2l6ZW9mKHN0cnVjdCBpcF9uYXRfbXVsdGlfcmFuZ2VfY29tcGF0KSwKKwkudGFyZ2V0c2l6ZQk9IHNpemVvZihzdHJ1Y3QgbmZfbmF0X211bHRpX3JhbmdlX2NvbXBhdCksCiAJLnRhYmxlCQk9ICJuYXQiLAogCS5ob29rcwkJPSAoMSA8PCBORl9JUF9QUkVfUk9VVElORykgfCAoMSA8PCBORl9JUF9MT0NBTF9PVVQpLAogCS5jaGVja2VudHJ5CT0gcmVkaXJlY3RfY2hlY2ssCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1JFSkVDVC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9SRUpFQ1QuYwppbmRleCA4MGY3MzllLi45MDQxZTA3IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1JFSkVDVC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfUkVKRUNULmMKQEAgLTEsNyArMSw1IEBACiAvKgogICogVGhpcyBpcyBhIG1vZHVsZSB3aGljaCBpcyB1c2VkIGZvciByZWplY3RpbmcgcGFja2V0cy4KLSAqIEFkZGVkIHN1cHBvcnQgZm9yIGN1c3RvbWl6ZWQgcmVqZWN0IHBhY2tldHMgKEpvenNlZiBLYWRsZWNzaWspLgotICogQWRkZWQgc3VwcG9ydCBmb3IgSUNNUCB0eXBlLTMtY29kZS0xMyAoTWFjaWVqIFNvbHR5c2lhaykuIFtSRkMgMTgxMl0KICAqLwogCiAvKiAoQykgMTk5OS0yMDAxIFBhdWwgYFJ1c3R5JyBSdXNzZWxsCkBAIC00Myw3ICs0MSw3IEBACiBzdGF0aWMgdm9pZCBzZW5kX3Jlc2V0KHN0cnVjdCBza19idWZmICpvbGRza2IsIGludCBob29rKQogewogCXN0cnVjdCBza19idWZmICpuc2tiOwotCXN0cnVjdCBpcGhkciAqaXBoID0gb2xkc2tiLT5uaC5pcGg7CisJc3RydWN0IGlwaGRyICpuaXBoOwogCXN0cnVjdCB0Y3BoZHIgX290Y3BoLCAqb3RoLCAqdGNwaDsKIAlfX2JlMTYgdG1wX3BvcnQ7CiAJX19iZTMyIHRtcF9hZGRyOwpAQCAtNTEsMTAgKzQ5LDEwIEBACiAJdW5zaWduZWQgaW50IGFkZHJfdHlwZTsKIAogCS8qIElQIGhlYWRlciBjaGVja3M6IGZyYWdtZW50LiAqLwotCWlmIChvbGRza2ItPm5oLmlwaC0+ZnJhZ19vZmYgJiBodG9ucyhJUF9PRkZTRVQpKQorCWlmIChpcF9oZHIob2xkc2tiKS0+ZnJhZ19vZmYgJiBodG9ucyhJUF9PRkZTRVQpKQogCQlyZXR1cm47CiAKLQlvdGggPSBza2JfaGVhZGVyX3BvaW50ZXIob2xkc2tiLCBvbGRza2ItPm5oLmlwaC0+aWhsICogNCwKKwlvdGggPSBza2JfaGVhZGVyX3BvaW50ZXIob2xkc2tiLCBpcF9oZHJsZW4ob2xkc2tiKSwKIAkJCQkgc2l6ZW9mKF9vdGNwaCksICZfb3RjcGgpOwogCWlmIChvdGggPT0gTlVMTCkKIAkJcmV0dXJuOwpAQCAtNjQsNyArNjIsNyBAQAogCQlyZXR1cm47CiAKIAkvKiBDaGVjayBjaGVja3N1bSAqLwotCWlmIChuZl9pcF9jaGVja3N1bShvbGRza2IsIGhvb2ssIGlwaC0+aWhsICogNCwgSVBQUk9UT19UQ1ApKQorCWlmIChuZl9pcF9jaGVja3N1bShvbGRza2IsIGhvb2ssIGlwX2hkcmxlbihvbGRza2IpLCBJUFBST1RPX1RDUCkpCiAJCXJldHVybjsKIAogCS8qIFdlIG5lZWQgYSBsaW5lYXIsIHdyaXRlYWJsZSBza2IuICBXZSBhbHNvIG5lZWQgdG8gZXhwYW5kCkBAIC04NCwyMCArODIsMjEgQEAKIAlza2Jfc2hpbmZvKG5za2IpLT5nc29fc2VncyA9IDA7CiAJc2tiX3NoaW5mbyhuc2tiKS0+Z3NvX3R5cGUgPSAwOwogCi0JdGNwaCA9IChzdHJ1Y3QgdGNwaGRyICopKCh1X2ludDMyX3QqKW5za2ItPm5oLmlwaCArIG5za2ItPm5oLmlwaC0+aWhsKTsKKwl0Y3BoID0gKHN0cnVjdCB0Y3BoZHIgKikoc2tiX25ldHdvcmtfaGVhZGVyKG5za2IpICsgaXBfaGRybGVuKG5za2IpKTsKIAogCS8qIFN3YXAgc291cmNlIGFuZCBkZXN0ICovCi0JdG1wX2FkZHIgPSBuc2tiLT5uaC5pcGgtPnNhZGRyOwotCW5za2ItPm5oLmlwaC0+c2FkZHIgPSBuc2tiLT5uaC5pcGgtPmRhZGRyOwotCW5za2ItPm5oLmlwaC0+ZGFkZHIgPSB0bXBfYWRkcjsKKwluaXBoID0gaXBfaGRyKG5za2IpOworCXRtcF9hZGRyID0gbmlwaC0+c2FkZHI7CisJbmlwaC0+c2FkZHIgPSBuaXBoLT5kYWRkcjsKKwluaXBoLT5kYWRkciA9IHRtcF9hZGRyOwogCXRtcF9wb3J0ID0gdGNwaC0+c291cmNlOwogCXRjcGgtPnNvdXJjZSA9IHRjcGgtPmRlc3Q7CiAJdGNwaC0+ZGVzdCA9IHRtcF9wb3J0OwogCiAJLyogVHJ1bmNhdGUgdG8gbGVuZ3RoIChubyBkYXRhKSAqLwogCXRjcGgtPmRvZmYgPSBzaXplb2Yoc3RydWN0IHRjcGhkcikvNDsKLQlza2JfdHJpbShuc2tiLCBuc2tiLT5uaC5pcGgtPmlobCo0ICsgc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpKTsKLQluc2tiLT5uaC5pcGgtPnRvdF9sZW4gPSBodG9ucyhuc2tiLT5sZW4pOworCXNrYl90cmltKG5za2IsIGlwX2hkcmxlbihuc2tiKSArIHNpemVvZihzdHJ1Y3QgdGNwaGRyKSk7CisJbmlwaC0+dG90X2xlbiA9IGh0b25zKG5za2ItPmxlbik7CiAKIAlpZiAodGNwaC0+YWNrKSB7CiAJCW5lZWRzX2FjayA9IDA7CkBAIC0xMDUsOSArMTA0LDkgQEAKIAkJdGNwaC0+YWNrX3NlcSA9IDA7CiAJfSBlbHNlIHsKIAkJbmVlZHNfYWNrID0gMTsKLQkJdGNwaC0+YWNrX3NlcSA9IGh0b25sKG50b2hsKG90aC0+c2VxKSArIG90aC0+c3luICsgb3RoLT5maW4KLQkJCQkgICAgICArIG9sZHNrYi0+bGVuIC0gb2xkc2tiLT5uaC5pcGgtPmlobCo0Ci0JCQkJICAgICAgLSAob3RoLT5kb2ZmPDwyKSk7CisJCXRjcGgtPmFja19zZXEgPSBodG9ubChudG9obChvdGgtPnNlcSkgKyBvdGgtPnN5biArIG90aC0+ZmluICsKKwkJCQkgICAgICBvbGRza2ItPmxlbiAtIGlwX2hkcmxlbihvbGRza2IpIC0KKwkJCQkgICAgICAob3RoLT5kb2ZmIDw8IDIpKTsKIAkJdGNwaC0+c2VxID0gMDsKIAl9CiAKQEAgLTEyMiwxNCArMTIxLDEzIEBACiAJLyogQWRqdXN0IFRDUCBjaGVja3N1bSAqLwogCXRjcGgtPmNoZWNrID0gMDsKIAl0Y3BoLT5jaGVjayA9IHRjcF92NF9jaGVjayhzaXplb2Yoc3RydWN0IHRjcGhkciksCi0JCQkJICAgbnNrYi0+bmguaXBoLT5zYWRkciwKLQkJCQkgICBuc2tiLT5uaC5pcGgtPmRhZGRyLAorCQkJCSAgIG5pcGgtPnNhZGRyLCBuaXBoLT5kYWRkciwKIAkJCQkgICBjc3VtX3BhcnRpYWwoKGNoYXIgKil0Y3BoLAogCQkJCQkJc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpLCAwKSk7CiAKIAkvKiBTZXQgREYsIGlkID0gMCAqLwotCW5za2ItPm5oLmlwaC0+ZnJhZ19vZmYgPSBodG9ucyhJUF9ERik7Ci0JbnNrYi0+bmguaXBoLT5pZCA9IDA7CisJbmlwaC0+ZnJhZ19vZmYgPSBodG9ucyhJUF9ERik7CisJbmlwaC0+aWQgPSAwOwogCiAJYWRkcl90eXBlID0gUlROX1VOU1BFQzsKIAlpZiAoaG9vayAhPSBORl9JUF9GT1JXQVJECkBAIC0xNDUsMTIgKzE0MywxMSBAQAogCW5za2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CiAKIAkvKiBBZGp1c3QgSVAgVFRMICovCi0JbnNrYi0+bmguaXBoLT50dGwgPSBkc3RfbWV0cmljKG5za2ItPmRzdCwgUlRBWF9IT1BMSU1JVCk7CisJbmlwaC0+dHRsID0gZHN0X21ldHJpYyhuc2tiLT5kc3QsIFJUQVhfSE9QTElNSVQpOwogCiAJLyogQWRqdXN0IElQIGNoZWNrc3VtICovCi0JbnNrYi0+bmguaXBoLT5jaGVjayA9IDA7Ci0JbnNrYi0+bmguaXBoLT5jaGVjayA9IGlwX2Zhc3RfY3N1bSgodW5zaWduZWQgY2hhciAqKW5za2ItPm5oLmlwaCwKLQkJCQkJICAgbnNrYi0+bmguaXBoLT5paGwpOworCW5pcGgtPmNoZWNrID0gMDsKKwluaXBoLT5jaGVjayA9IGlwX2Zhc3RfY3N1bShza2JfbmV0d29ya19oZWFkZXIobnNrYiksIG5pcGgtPmlobCk7CiAKIAkvKiAiTmV2ZXIgaGFwcGVucyIgKi8KIAlpZiAobnNrYi0+bGVuID4gZHN0X210dShuc2tiLT5kc3QpKQpAQCAtMTgyLDcgKzE3OSw3IEBACiAKIAkvKiBPdXIgbmFpdmUgcmVzcG9uc2UgY29uc3RydWN0aW9uIGRvZXNuJ3QgZGVhbCB3aXRoIElQCiAJICAgb3B0aW9ucywgYW5kIHByb2JhYmx5IHNob3VsZG4ndCB0cnkuICovCi0JaWYgKCgqcHNrYiktPm5oLmlwaC0+aWhsPDwyICE9IHNpemVvZihzdHJ1Y3QgaXBoZHIpKQorCWlmIChpcF9oZHJsZW4oKnBza2IpICE9IHNpemVvZihzdHJ1Y3QgaXBoZHIpKQogCQlyZXR1cm4gTkZfRFJPUDsKIAogCS8qIFdBUk5JTkc6IFRoaXMgY29kZSBjYXVzZXMgcmVlbnRyeSB3aXRoaW4gaXB0YWJsZXMuCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1NBTUUuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfU0FNRS5jCmluZGV4IGJkNDQwNGUuLjUxMWU1ZmYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfU0FNRS5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfU0FNRS5jCkBAIC03LDIxICs3LDYgQEAKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogMDEwMzIwIE1hcnRpbiBKb3NlZnNzb24gPGdhbmRhbGZAd2x1Zy53ZXN0Ym8uc2U+Ci0gKiAJKiBjb3BpZWQgaXB0X0JBTEFOQ0UuYyB0byBpcHRfU0FNRS5jIGFuZCBjaGFuZ2VkIGEgZmV3IHRoaW5ncy4KLSAqIDAxMDcyOCBNYXJ0aW4gSm9zZWZzc29uIDxnYW5kYWxmQHdsdWcud2VzdGJvLnNlPgotICogCSogYWRkZWQgLS1ub2RzdCB0byBub3QgaW5jbHVkZSBkZXN0aW5hdGlvbi1pcCBpbiBuZXcgc291cmNlCi0gKiAJICBjYWxjdWxhdGlvbnMuCi0gKgkqIGFkZGVkIHNvbWUgbW9yZSBzYW5pdHktY2hlY2tzLgotICogMDEwNzI5IE1hcnRpbiBKb3NlZnNzb24gPGdhbmRhbGZAd2x1Zy53ZXN0Ym8uc2U+Ci0gKiAJKiBmaXhlZCBhIGJ1Z2d5IGlmLXN0YXRlbWVudCBpbiBzYW1lX2NoZWNrKCksIHNob3VsZCBoYXZlCi0gKiAJICB1c2VkIG50b2hsKCkgYnV0IGRpZG4ndC4KLSAqIAkqIGFkZGVkIHN1cHBvcnQgZm9yIG11bHRpcGxlIHJhbmdlcy4gSVBUX1NBTUVfTUFYX1JBTkdFIGlzCi0gKiAJICBkZWZpbmVkIGluIGxpbnV4L2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X1NBTUUuaAotICogCSAgYW5kIGlzIGN1cnJlbnRseSBzZXQgdG8gMTAuCi0gKiAJKiBhZGRlZCBzdXBwb3J0IGZvciAxLWFkZHJlc3MgcmFuZ2UsIG5pY2UgdG8gaGF2ZSBub3cgdGhhdAotICogCSAgd2UgaGF2ZSBtdWx0aXBsZSByYW5nZXMuCiAgKi8KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2lwLmg+CkBAIC0zNSwxMSArMjAsNyBAQAogI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0Lmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+Ci0jaWZkZWYgQ09ORklHX05GX05BVF9ORUVERUQKICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX25hdF9ydWxlLmg+Ci0jZWxzZQotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX25hdF9ydWxlLmg+Ci0jZW5kaWYKICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfU0FNRS5oPgogCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CkBAIC0xMzgsMTcgKzExOSwxNyBAQAogCQljb25zdCBzdHJ1Y3QgeHRfdGFyZ2V0ICp0YXJnZXQsCiAJCWNvbnN0IHZvaWQgKnRhcmdpbmZvKQogewotCXN0cnVjdCBpcF9jb25udHJhY2sgKmN0OworCXN0cnVjdCBuZl9jb25uICpjdDsKIAllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbzsKIAl1X2ludDMyX3QgdG1waXAsIGFpbmRleDsKIAlfX2JlMzIgbmV3X2lwOwogCWNvbnN0IHN0cnVjdCBpcHRfc2FtZV9pbmZvICpzYW1lID0gdGFyZ2luZm87Ci0Jc3RydWN0IGlwX25hdF9yYW5nZSBuZXdyYW5nZTsKLQljb25zdCBzdHJ1Y3QgaXBfY29ubnRyYWNrX3R1cGxlICp0OworCXN0cnVjdCBuZl9uYXRfcmFuZ2UgbmV3cmFuZ2U7CisJY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdDsKIAotCUlQX05GX0FTU0VSVChob29rbnVtID09IE5GX0lQX1BSRV9ST1VUSU5HIHx8CisJTkZfQ1RfQVNTRVJUKGhvb2tudW0gPT0gTkZfSVBfUFJFX1JPVVRJTkcgfHwKIAkJCWhvb2tudW0gPT0gTkZfSVBfUE9TVF9ST1VUSU5HKTsKLQljdCA9IGlwX2Nvbm50cmFja19nZXQoKnBza2IsICZjdGluZm8pOworCWN0ID0gbmZfY3RfZ2V0KCpwc2tiLCAmY3RpbmZvKTsKIAogCXQgPSAmY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlOwogCkBAIC0xNTcsMTcgKzEzOCwxMCBAQAogCSAgIEhlcmUgd2UgY2FsY3VsYXRlIHRoZSBpbmRleCBpbiBzYW1lLT5pcGFycmF5IHdoaWNoCiAJICAgaG9sZHMgdGhlIGlwYWRkcmVzcyB3ZSBzaG91bGQgdXNlICovCiAKLSNpZmRlZiBDT05GSUdfTkZfTkFUX05FRURFRAogCXRtcGlwID0gbnRvaGwodC0+c3JjLnUzLmlwKTsKIAogCWlmICghKHNhbWUtPmluZm8gJiBJUFRfU0FNRV9OT0RTVCkpCiAJCXRtcGlwICs9IG50b2hsKHQtPmRzdC51My5pcCk7Ci0jZWxzZQotCXRtcGlwID0gbnRvaGwodC0+c3JjLmlwKTsKLQotCWlmICghKHNhbWUtPmluZm8gJiBJUFRfU0FNRV9OT0RTVCkpCi0JCXRtcGlwICs9IG50b2hsKHQtPmRzdC5pcCk7Ci0jZW5kaWYKIAlhaW5kZXggPSB0bXBpcCAlIHNhbWUtPmlwbnVtOwogCiAJbmV3X2lwID0gaHRvbmwoc2FtZS0+aXBhcnJheVthaW5kZXhdKTsKQEAgLTE3OCwxMyArMTUyLDEzIEBACiAJCQlOSVBRVUFEKG5ld19pcCkpOwogCiAJLyogVHJhbnNmZXIgZnJvbSBvcmlnaW5hbCByYW5nZS4gKi8KLQluZXdyYW5nZSA9ICgoc3RydWN0IGlwX25hdF9yYW5nZSkKKwluZXdyYW5nZSA9ICgoc3RydWN0IG5mX25hdF9yYW5nZSkKIAkJeyBzYW1lLT5yYW5nZVswXS5mbGFncywgbmV3X2lwLCBuZXdfaXAsCiAJCSAgLyogRklYTUU6IFVzZSBwb3J0cyBmcm9tIGNvcnJlY3QgcmFuZ2UhICovCiAJCSAgc2FtZS0+cmFuZ2VbMF0ubWluLCBzYW1lLT5yYW5nZVswXS5tYXggfSk7CiAKIAkvKiBIYW5kIG1vZGlmaWVkIHJhbmdlIHRvIGdlbmVyaWMgc2V0dXAuICovCi0JcmV0dXJuIGlwX25hdF9zZXR1cF9pbmZvKGN0LCAmbmV3cmFuZ2UsIGhvb2tudW0pOworCXJldHVybiBuZl9uYXRfc2V0dXBfaW5mbyhjdCwgJm5ld3JhbmdlLCBob29rbnVtKTsKIH0KIAogc3RhdGljIHN0cnVjdCB4dF90YXJnZXQgc2FtZV9yZWcgPSB7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1RPUy5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9UT1MuYwppbmRleCBjZWRmOWY3Li4wYWQwMmYyIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1RPUy5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfVE9TLmMKQEAgLTI5LDEzICsyOSwxMyBAQAogICAgICAgIGNvbnN0IHZvaWQgKnRhcmdpbmZvKQogewogCWNvbnN0IHN0cnVjdCBpcHRfdG9zX3RhcmdldF9pbmZvICp0b3NpbmZvID0gdGFyZ2luZm87Ci0Jc3RydWN0IGlwaGRyICppcGggPSAoKnBza2IpLT5uaC5pcGg7CisJc3RydWN0IGlwaGRyICppcGggPSBpcF9oZHIoKnBza2IpOwogCiAJaWYgKChpcGgtPnRvcyAmIElQVE9TX1RPU19NQVNLKSAhPSB0b3NpbmZvLT50b3MpIHsKIAkJX191OCBvbGR0b3M7CiAJCWlmICghc2tiX21ha2Vfd3JpdGFibGUocHNrYiwgc2l6ZW9mKHN0cnVjdCBpcGhkcikpKQogCQkJcmV0dXJuIE5GX0RST1A7Ci0JCWlwaCA9ICgqcHNrYiktPm5oLmlwaDsKKwkJaXBoID0gaXBfaGRyKCpwc2tiKTsKIAkJb2xkdG9zID0gaXBoLT50b3M7CiAJCWlwaC0+dG9zID0gKGlwaC0+dG9zICYgSVBUT1NfUFJFQ19NQVNLKSB8IHRvc2luZm8tPnRvczsKIAkJbmZfY3N1bV9yZXBsYWNlMigmaXBoLT5jaGVjaywgaHRvbnMob2xkdG9zKSwgaHRvbnMoaXBoLT50b3MpKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfVFRMLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1RUTC5jCmluZGV4IDY0YmUzMWMuLmE5OTFlYzcgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfVFRMLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9UVEwuYwpAQCAtMzIsNyArMzIsNyBAQAogCWlmICghc2tiX21ha2Vfd3JpdGFibGUocHNrYiwgKCpwc2tiKS0+bGVuKSkKIAkJcmV0dXJuIE5GX0RST1A7CiAKLQlpcGggPSAoKnBza2IpLT5uaC5pcGg7CisJaXBoID0gaXBfaGRyKCpwc2tiKTsKIAogCXN3aXRjaCAoaW5mby0+bW9kZSkgewogCQljYXNlIElQVF9UVExfU0VUOgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9VTE9HLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1VMT0cuYwppbmRleCA5YWNjMDE4Li4yM2I2MDdiIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1VMT0cuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1VMT0cuYwpAQCAtMiwyMCArMiw2IEBACiAgKiBuZXRmaWx0ZXIgbW9kdWxlIGZvciB1c2Vyc3BhY2UgcGFja2V0IGxvZ2dpbmcgZGFlbW9ucwogICoKICAqIChDKSAyMDAwLTIwMDQgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQG5ldGZpbHRlci5vcmc+Ci0gKgotICogMjAwMC8wOS8yMiB1bG9nLWNwcmFuZ2UgZmVhdHVyZSBhZGRlZAotICogMjAwMS8wMS8wNCBpbi1rZXJuZWwgcXVldWUgYXMgcHJvcG9zZWQgYnkgU2ViYXN0aWFuIFphbmRlcgotICogCQkJCQkJPHphbmRlckBmb2t1cy5nbWQuZGU+Ci0gKiAyMDAxLzAxLzMwIHBlci1ydWxlIG5sZ3JvdXAgY29uZmxpY3RzIHdpdGggZ2xvYmFsIHF1ZXVlLgotICogICAgICAgICAgICBubGdyb3VwIG5vdyBnbG9iYWwgKHN5c2N0bCkKLSAqIDIwMDEvMDQvMTkgdWxvZy1xdWV1ZSByZXdvcmtlZCwgbm93IGZpeGVkIGJ1ZmZlciBzaXplIHNwZWNpZmllZCBhdAotICogCSAgICAgIG1vZHVsZSBsb2FkdGltZSAtSFcKLSAqIDIwMDIvMDcvMDcgcmVtb3ZlIGJyb2tlbiBuZmxvZ19yY3YoKSBmdW5jdGlvbiAtSFcKLSAqIDIwMDIvMDgvMjkgZml4IHNoaWZ0ZWQvdW5zaGlmdGVkIG5sZ3JvdXAgYnVnIC1IVwotICogMjAwMi8xMC8zMCBmaXggdW5pbml0aWFsaXplZCBtYWNfbGVuIGZpZWxkIC0gPEFuZGVycyBLLiBQZWRlcnNlbj4KLSAqIDIwMDQvMTAvMjUgZml4IGVycm9uZW91cyBjYWxjdWxhdGlvbiBvZiAnbGVuJyBwYXJhbWV0ZXIgdG8gTkxNU0dfUFVUCi0gKgkgICAgICByZXN1bHRpbmcgaW4gYm9ndXMgJ2Vycm9yIGR1cmluZyBOTE1TR19QVVQnIG1lc3NhZ2VzLgotICoKICAqIChDKSAxOTk5LTIwMDEgUGF1bCBgUnVzdHknIFJ1c3NlbGwKICAqIChDKSAyMDAyLTIwMDQgTmV0ZmlsdGVyIENvcmUgVGVhbSA8Y29yZXRlYW1AbmV0ZmlsdGVyLm9yZz4KICAqCkBAIC00Miw4ICsyOCw2IEBACiAgKiBmbHVzaHRpbWVvdXQ6CiAgKiAgIFNwZWNpZnksIGFmdGVyIGhvdyBtYW55IGh1bmRyZWR0aHMgb2YgYSBzZWNvbmQgdGhlIHF1ZXVlIHNob3VsZCBiZQogICogICBmbHVzaGVkIGV2ZW4gaWYgaXQgaXMgbm90IGZ1bGwgeWV0LgotICoKLSAqIGlwdF9VTE9HLmMsdiAxLjIyIDIwMDIvMTAvMzAgMDk6MDc6MzEgbGFmb3JnZSBFeHAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC0xODcsNiArMTcxLDcgQEAKIAl1bG9nX3BhY2tldF9tc2dfdCAqcG07CiAJc2l6ZV90IHNpemUsIGNvcHlfbGVuOwogCXN0cnVjdCBubG1zZ2hkciAqbmxoOworCXN0cnVjdCB0aW1ldmFsIHR2OwogCiAJLyogZmZzID09IGZpbmQgZmlyc3QgYml0IHNldCwgbmVjZXNzYXJ5IGJlY2F1c2UgdXNlcnNwYWNlCiAJICogaXMgYWxyZWFkeSBzaGlmdGluZyBncm91cG51bWJlciwgYnV0IHdlIG5lZWQgdW5zaGlmdGVkLgpAQCAtMjMyLDEzICsyMTcsMTQgQEAKIAlwbSA9IE5MTVNHX0RBVEEobmxoKTsKIAogCS8qIFdlIG1pZ2h0IG5vdCBoYXZlIGEgdGltZXN0YW1wLCBnZXQgb25lICovCi0JaWYgKHNrYi0+dHN0YW1wLm9mZl9zZWMgPT0gMCkKKwlpZiAoc2tiLT50c3RhbXAudHY2NCA9PSAwKQogCQlfX25ldF90aW1lc3RhbXAoKHN0cnVjdCBza19idWZmICopc2tiKTsKIAogCS8qIGNvcHkgaG9vaywgcHJlZml4LCB0aW1lc3RhbXAsIHBheWxvYWQsIGV0Yy4gKi8KIAlwbS0+ZGF0YV9sZW4gPSBjb3B5X2xlbjsKLQlwdXRfdW5hbGlnbmVkKHNrYi0+dHN0YW1wLm9mZl9zZWMsICZwbS0+dGltZXN0YW1wX3NlYyk7Ci0JcHV0X3VuYWxpZ25lZChza2ItPnRzdGFtcC5vZmZfdXNlYywgJnBtLT50aW1lc3RhbXBfdXNlYyk7CisJdHYgPSBrdGltZV90b190aW1ldmFsKHNrYi0+dHN0YW1wKTsKKwlwdXRfdW5hbGlnbmVkKHR2LnR2X3NlYywgJnBtLT50aW1lc3RhbXBfc2VjKTsKKwlwdXRfdW5hbGlnbmVkKHR2LnR2X3VzZWMsICZwbS0+dGltZXN0YW1wX3VzZWMpOwogCXB1dF91bmFsaWduZWQoc2tiLT5tYXJrLCAmcG0tPm1hcmspOwogCXBtLT5ob29rID0gaG9va251bTsKIAlpZiAocHJlZml4ICE9IE5VTEwpCkBAIC0yNDksOSArMjM1LDkgQEAKIAkJKihwbS0+cHJlZml4KSA9ICdcMCc7CiAKIAlpZiAoaW4gJiYgaW4tPmhhcmRfaGVhZGVyX2xlbiA+IDAKLQkgICAgJiYgc2tiLT5tYWMucmF3ICE9ICh2b2lkICopIHNrYi0+bmguaXBoCisJICAgICYmIHNrYi0+bWFjX2hlYWRlciAhPSBza2ItPm5ldHdvcmtfaGVhZGVyCiAJICAgICYmIGluLT5oYXJkX2hlYWRlcl9sZW4gPD0gVUxPR19NQUNfTEVOKSB7Ci0JCW1lbWNweShwbS0+bWFjLCBza2ItPm1hYy5yYXcsIGluLT5oYXJkX2hlYWRlcl9sZW4pOworCQltZW1jcHkocG0tPm1hYywgc2tiX21hY19oZWFkZXIoc2tiKSwgaW4tPmhhcmRfaGVhZGVyX2xlbik7CiAJCXBtLT5tYWNfbGVuID0gaW4tPmhhcmRfaGVhZGVyX2xlbjsKIAl9IGVsc2UKIAkJcG0tPm1hY19sZW4gPSAwOwpAQCAtMzYzLDEyICszNDksNTIgQEAKIAlyZXR1cm4gMTsKIH0KIAorI2lmZGVmIENPTkZJR19DT01QQVQKK3N0cnVjdCBjb21wYXRfaXB0X3Vsb2dfaW5mbyB7CisJY29tcGF0X3VpbnRfdAlubF9ncm91cDsKKwljb21wYXRfc2l6ZV90CWNvcHlfcmFuZ2U7CisJY29tcGF0X3NpemVfdAlxdGhyZXNob2xkOworCWNoYXIJCXByZWZpeFtVTE9HX1BSRUZJWF9MRU5dOworfTsKKworc3RhdGljIHZvaWQgY29tcGF0X2Zyb21fdXNlcih2b2lkICpkc3QsIHZvaWQgKnNyYykKK3sKKwlzdHJ1Y3QgY29tcGF0X2lwdF91bG9nX2luZm8gKmNsID0gc3JjOworCXN0cnVjdCBpcHRfdWxvZ19pbmZvIGwgPSB7CisJCS5ubF9ncm91cAk9IGNsLT5ubF9ncm91cCwKKwkJLmNvcHlfcmFuZ2UJPSBjbC0+Y29weV9yYW5nZSwKKwkJLnF0aHJlc2hvbGQJPSBjbC0+cXRocmVzaG9sZCwKKwl9OworCisJbWVtY3B5KGwucHJlZml4LCBjbC0+cHJlZml4LCBzaXplb2YobC5wcmVmaXgpKTsKKwltZW1jcHkoZHN0LCAmbCwgc2l6ZW9mKGwpKTsKK30KKworc3RhdGljIGludCBjb21wYXRfdG9fdXNlcih2b2lkIF9fdXNlciAqZHN0LCB2b2lkICpzcmMpCit7CisJc3RydWN0IGlwdF91bG9nX2luZm8gKmwgPSBzcmM7CisJc3RydWN0IGNvbXBhdF9pcHRfdWxvZ19pbmZvIGNsID0geworCQkubmxfZ3JvdXAJPSBsLT5ubF9ncm91cCwKKwkJLmNvcHlfcmFuZ2UJPSBsLT5jb3B5X3JhbmdlLAorCQkucXRocmVzaG9sZAk9IGwtPnF0aHJlc2hvbGQsCisJfTsKKworCW1lbWNweShjbC5wcmVmaXgsIGwtPnByZWZpeCwgc2l6ZW9mKGNsLnByZWZpeCkpOworCXJldHVybiBjb3B5X3RvX3VzZXIoZHN0LCAmY2wsIHNpemVvZihjbCkpID8gLUVGQVVMVCA6IDA7Cit9CisjZW5kaWYgLyogQ09ORklHX0NPTVBBVCAqLworCiBzdGF0aWMgc3RydWN0IHh0X3RhcmdldCBpcHRfdWxvZ19yZWcgPSB7CiAJLm5hbWUJCT0gIlVMT0ciLAogCS5mYW1pbHkJCT0gQUZfSU5FVCwKIAkudGFyZ2V0CQk9IGlwdF91bG9nX3RhcmdldCwKIAkudGFyZ2V0c2l6ZQk9IHNpemVvZihzdHJ1Y3QgaXB0X3Vsb2dfaW5mbyksCiAJLmNoZWNrZW50cnkJPSBpcHRfdWxvZ19jaGVja2VudHJ5LAorI2lmZGVmIENPTkZJR19DT01QQVQKKwkuY29tcGF0c2l6ZQk9IHNpemVvZihzdHJ1Y3QgY29tcGF0X2lwdF91bG9nX2luZm8pLAorCS5jb21wYXRfZnJvbV91c2VyID0gY29tcGF0X2Zyb21fdXNlciwKKwkuY29tcGF0X3RvX3VzZXIJPSBjb21wYXRfdG9fdXNlciwKKyNlbmRpZgogCS5tZQkJPSBUSElTX01PRFVMRSwKIH07CiAKQEAgLTM5MCwxNCArNDE2LDExIEBACiAJfQogCiAJLyogaW5pdGlhbGl6ZSB1bG9nX2J1ZmZlcnMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgVUxPR19NQVhOTEdST1VQUzsgaSsrKSB7Ci0JCWluaXRfdGltZXIoJnVsb2dfYnVmZmVyc1tpXS50aW1lcik7Ci0JCXVsb2dfYnVmZmVyc1tpXS50aW1lci5mdW5jdGlvbiA9IHVsb2dfdGltZXI7Ci0JCXVsb2dfYnVmZmVyc1tpXS50aW1lci5kYXRhID0gaTsKLQl9CisJZm9yIChpID0gMDsgaSA8IFVMT0dfTUFYTkxHUk9VUFM7IGkrKykKKwkJc2V0dXBfdGltZXIoJnVsb2dfYnVmZmVyc1tpXS50aW1lciwgdWxvZ190aW1lciwgaSk7CiAKIAluZmxvZ25sID0gbmV0bGlua19rZXJuZWxfY3JlYXRlKE5FVExJTktfTkZMT0csIFVMT0dfTUFYTkxHUk9VUFMsIE5VTEwsCi0JCQkJCVRISVNfTU9EVUxFKTsKKwkJCQkJTlVMTCwgVEhJU19NT0RVTEUpOwogCWlmICghbmZsb2dubCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfYWRkcnR5cGUuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfYWRkcnR5cGUuYwppbmRleCBjZmEwNDcyLi5hNjUyYTE0IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2FkZHJ0eXBlLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9hZGRydHlwZS5jCkBAIC0zMyw3ICszMyw3IEBACiAJCSBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgcHJvdG9mZiwgaW50ICpob3Rkcm9wKQogewogCWNvbnN0IHN0cnVjdCBpcHRfYWRkcnR5cGVfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKLQljb25zdCBzdHJ1Y3QgaXBoZHIgKmlwaCA9IHNrYi0+bmguaXBoOworCWNvbnN0IHN0cnVjdCBpcGhkciAqaXBoID0gaXBfaGRyKHNrYik7CiAJaW50IHJldCA9IDE7CiAKIAlpZiAoaW5mby0+c291cmNlKQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9lY24uYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfZWNuLmMKaW5kZXggMzc1MDhiMi4uMjYyMTgxMiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9lY24uYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2Vjbi5jCkBAIC0xLDcgKzEsNSBAQAogLyogSVAgdGFibGVzIG1vZHVsZSBmb3IgbWF0Y2hpbmcgdGhlIHZhbHVlIG9mIHRoZSBJUHY0IGFuZCBUQ1AgRUNOIGJpdHMKICAqCi0gKiBpcHRfZWNuLmMsdiAxLjMgMjAwMi8wNS8yOSAxNTowOTowMCBsYWZvcmdlIEV4cAotICoKICAqIChDKSAyMDAyIGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKQEAgLTExLDYgKzksNyBAQAogCiAjaW5jbHVkZSA8bGludXgvaW4uaD4KICNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPG5ldC9pcC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgpAQCAtMjYsNyArMjUsNyBAQAogc3RhdGljIGlubGluZSBpbnQgbWF0Y2hfaXAoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCSAgIGNvbnN0IHN0cnVjdCBpcHRfZWNuX2luZm8gKmVpbmZvKQogewotCXJldHVybiAoKHNrYi0+bmguaXBoLT50b3MmSVBUX0VDTl9JUF9NQVNLKSA9PSBlaW5mby0+aXBfZWN0KTsKKwlyZXR1cm4gKGlwX2hkcihza2IpLT50b3MgJiBJUFRfRUNOX0lQX01BU0spID09IGVpbmZvLT5pcF9lY3Q7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IG1hdGNoX3RjcChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLApAQCAtMzgsOCArMzcsNyBAQAogCS8qIEluIHByYWN0aWNlLCBUQ1AgbWF0Y2ggZG9lcyB0aGlzLCBzbyBjYW4ndCBmYWlsLiAgQnV0IGxldCdzCiAJICogYmUgZ29vZCBjaXRpemVucy4KIAkgKi8KLQl0aCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHNrYi0+bmguaXBoLT5paGwgKiA0LAotCQkJCXNpemVvZihfdGNwaCksICZfdGNwaCk7CisJdGggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBpcF9oZHJsZW4oc2tiKSwgc2l6ZW9mKF90Y3BoKSwgJl90Y3BoKTsKIAlpZiAodGggPT0gTlVMTCkgewogCQkqaG90ZHJvcCA9IDA7CiAJCXJldHVybiAwOwpAQCAtODAsNyArNzgsNyBAQAogCQkJcmV0dXJuIDA7CiAKIAlpZiAoaW5mby0+b3BlcmF0aW9uICYgKElQVF9FQ05fT1BfTUFUQ0hfRUNFfElQVF9FQ05fT1BfTUFUQ0hfQ1dSKSkgewotCQlpZiAoc2tiLT5uaC5pcGgtPnByb3RvY29sICE9IElQUFJPVE9fVENQKQorCQlpZiAoaXBfaGRyKHNrYiktPnByb3RvY29sICE9IElQUFJPVE9fVENQKQogCQkJcmV0dXJuIDA7CiAJCWlmICghbWF0Y2hfdGNwKHNrYiwgaW5mbywgaG90ZHJvcCkpCiAJCQlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfaXByYW5nZS5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9pcHJhbmdlLmMKaW5kZXggYmM1ZDVlNi4uMzNhZjllOSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9pcHJhbmdlLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9pcHJhbmdlLmMKQEAgLTMyLDcgKzMyLDcgQEAKICAgICAgIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBwcm90b2ZmLCBpbnQgKmhvdGRyb3ApCiB7CiAJY29uc3Qgc3RydWN0IGlwdF9pcHJhbmdlX2luZm8gKmluZm8gPSBtYXRjaGluZm87Ci0JY29uc3Qgc3RydWN0IGlwaGRyICppcGggPSBza2ItPm5oLmlwaDsKKwljb25zdCBzdHJ1Y3QgaXBoZHIgKmlwaCA9IGlwX2hkcihza2IpOwogCiAJaWYgKGluZm8tPmZsYWdzICYgSVBSQU5HRV9TUkMpIHsKIAkJaWYgKCgobnRvaGwoaXBoLT5zYWRkcikgPCBudG9obChpbmZvLT5zcmMubWluX2lwKSkKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfcmVjZW50LmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X3JlY2VudC5jCmluZGV4IGFlY2I5YzQuLjE1YTllOGIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfcmVjZW50LmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9yZWNlbnQuYwpAQCAtMTgzLDExICsxODMsMTEgQEAKIAlpbnQgcmV0ID0gaW5mby0+aW52ZXJ0OwogCiAJaWYgKGluZm8tPnNpZGUgPT0gSVBUX1JFQ0VOVF9ERVNUKQotCQlhZGRyID0gc2tiLT5uaC5pcGgtPmRhZGRyOworCQlhZGRyID0gaXBfaGRyKHNrYiktPmRhZGRyOwogCWVsc2UKLQkJYWRkciA9IHNrYi0+bmguaXBoLT5zYWRkcjsKKwkJYWRkciA9IGlwX2hkcihza2IpLT5zYWRkcjsKIAotCXR0bCA9IHNrYi0+bmguaXBoLT50dGw7CisJdHRsID0gaXBfaGRyKHNrYiktPnR0bDsKIAkvKiB1c2UgVFRMIGFzIHNlZW4gYmVmb3JlIGZvcndhcmRpbmcgKi8KIAlpZiAob3V0ICYmICFza2ItPnNrKQogCQl0dGwrKzsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfdG9zLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X3Rvcy5jCmluZGV4IDVkMzNiNTEuLmQzMTQ4NDQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfdG9zLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF90b3MuYwpAQCAtMzAsNyArMzAsNyBAQAogewogCWNvbnN0IHN0cnVjdCBpcHRfdG9zX2luZm8gKmluZm8gPSBtYXRjaGluZm87CiAKLQlyZXR1cm4gKHNrYi0+bmguaXBoLT50b3MgPT0gaW5mby0+dG9zKSBeIGluZm8tPmludmVydDsKKwlyZXR1cm4gKGlwX2hkcihza2IpLT50b3MgPT0gaW5mby0+dG9zKSBeIGluZm8tPmludmVydDsKIH0KIAogc3RhdGljIHN0cnVjdCB4dF9tYXRjaCB0b3NfbWF0Y2ggPSB7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X3R0bC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF90dGwuYwppbmRleCAxZWNhOWY0Li5hYjAyZDllIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X3R0bC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfdHRsLmMKQEAgLTEsNyArMSw1IEBACiAvKiBJUCB0YWJsZXMgbW9kdWxlIGZvciBtYXRjaGluZyB0aGUgdmFsdWUgb2YgdGhlIFRUTAogICoKLSAqIGlwdF90dGwuYyx2IDEuNSAyMDAwLzExLzEzIDExOjE2OjA4IGxhZm9yZ2UgRXhwCi0gKgogICogKEMpIDIwMDAsMjAwMSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAbmV0ZmlsdGVyLm9yZz4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQpAQCAtMjYsMTkgKzI0LDIwIEBACiAJCSBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgcHJvdG9mZiwgaW50ICpob3Rkcm9wKQogewogCWNvbnN0IHN0cnVjdCBpcHRfdHRsX2luZm8gKmluZm8gPSBtYXRjaGluZm87CisJY29uc3QgdTggdHRsID0gaXBfaGRyKHNrYiktPnR0bDsKIAogCXN3aXRjaCAoaW5mby0+bW9kZSkgewogCQljYXNlIElQVF9UVExfRVE6Ci0JCQlyZXR1cm4gKHNrYi0+bmguaXBoLT50dGwgPT0gaW5mby0+dHRsKTsKKwkJCXJldHVybiAodHRsID09IGluZm8tPnR0bCk7CiAJCQlicmVhazsKIAkJY2FzZSBJUFRfVFRMX05FOgotCQkJcmV0dXJuICghKHNrYi0+bmguaXBoLT50dGwgPT0gaW5mby0+dHRsKSk7CisJCQlyZXR1cm4gKCEodHRsID09IGluZm8tPnR0bCkpOwogCQkJYnJlYWs7CiAJCWNhc2UgSVBUX1RUTF9MVDoKLQkJCXJldHVybiAoc2tiLT5uaC5pcGgtPnR0bCA8IGluZm8tPnR0bCk7CisJCQlyZXR1cm4gKHR0bCA8IGluZm8tPnR0bCk7CiAJCQlicmVhazsKIAkJY2FzZSBJUFRfVFRMX0dUOgotCQkJcmV0dXJuIChza2ItPm5oLmlwaC0+dHRsID4gaW5mby0+dHRsKTsKKwkJCXJldHVybiAodHRsID4gaW5mby0+dHRsKTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiaXB0X3R0bDogdW5rbm93biBtb2RlICVkXG4iLApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdGFibGVfZmlsdGVyLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0YWJsZV9maWx0ZXIuYwppbmRleCBkMWQ2MWU5Li40MjcyODkwIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0YWJsZV9maWx0ZXIuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0YWJsZV9maWx0ZXIuYwpAQCAtMTMsNiArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+CisjaW5jbHVkZSA8bmV0L2lwLmg+CiAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9BVVRIT1IoIk5ldGZpbHRlciBDb3JlIFRlYW0gPGNvcmV0ZWFtQG5ldGZpbHRlci5vcmc+Iik7CkBAIC0xMDIsNyArMTAzLDcgQEAKIHsKIAkvKiByb290IGlzIHBsYXlpbmcgd2l0aCByYXcgc29ja2V0cy4gKi8KIAlpZiAoKCpwc2tiKS0+bGVuIDwgc2l6ZW9mKHN0cnVjdCBpcGhkcikKLQkgICAgfHwgKCpwc2tiKS0+bmguaXBoLT5paGwgKiA0IDwgc2l6ZW9mKHN0cnVjdCBpcGhkcikpIHsKKwkgICAgfHwgaXBfaGRybGVuKCpwc2tiKSA8IHNpemVvZihzdHJ1Y3QgaXBoZHIpKSB7CiAJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCiAJCQlwcmludGsoImlwdF9ob29rOiBoYXBweSBjcmFja2luZy5cbiIpOwogCQlyZXR1cm4gTkZfQUNDRVBUOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdGFibGVfbWFuZ2xlLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0YWJsZV9tYW5nbGUuYwppbmRleCA5OGI2NmVmLi45Mjc4ODAyIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0YWJsZV9tYW5nbGUuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0YWJsZV9tYW5nbGUuYwpAQCAtNyw4ICs3LDYgQEAKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogRXh0ZW5kZWQgdG8gYWxsIGZpdmUgbmV0ZmlsdGVyIGhvb2tzIGJ5IEJyYWQgQ2hhcG1hbiAmIEhhcmFsZCBXZWx0ZQogICovCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+CkBAIC0xNyw2ICsxNSw3IEBACiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KICNpbmNsdWRlIDxuZXQvcm91dGUuaD4KICNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPG5ldC9pcC5oPgogCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfQVVUSE9SKCJOZXRmaWx0ZXIgQ29yZSBUZWFtIDxjb3JldGVhbUBuZXRmaWx0ZXIub3JnPiIpOwpAQCAtMTMwLDEzICsxMjksMTQgQEAKIAkJICAgaW50ICgqb2tmbikoc3RydWN0IHNrX2J1ZmYgKikpCiB7CiAJdW5zaWduZWQgaW50IHJldDsKKwljb25zdCBzdHJ1Y3QgaXBoZHIgKmlwaDsKIAl1X2ludDhfdCB0b3M7CiAJX19iZTMyIHNhZGRyLCBkYWRkcjsKIAl1X2ludDMyX3QgbWFyazsKIAogCS8qIHJvb3QgaXMgcGxheWluZyB3aXRoIHJhdyBzb2NrZXRzLiAqLwogCWlmICgoKnBza2IpLT5sZW4gPCBzaXplb2Yoc3RydWN0IGlwaGRyKQotCSAgICB8fCAoKnBza2IpLT5uaC5pcGgtPmlobCAqIDQgPCBzaXplb2Yoc3RydWN0IGlwaGRyKSkgeworCSAgICB8fCBpcF9oZHJsZW4oKnBza2IpIDwgc2l6ZW9mKHN0cnVjdCBpcGhkcikpIHsKIAkJaWYgKG5ldF9yYXRlbGltaXQoKSkKIAkJCXByaW50aygiaXB0X2hvb2s6IGhhcHB5IGNyYWNraW5nLlxuIik7CiAJCXJldHVybiBORl9BQ0NFUFQ7CkBAIC0xNDQsMTkgKzE0NCwyMyBAQAogCiAJLyogU2F2ZSB0aGluZ3Mgd2hpY2ggY291bGQgYWZmZWN0IHJvdXRlICovCiAJbWFyayA9ICgqcHNrYiktPm1hcms7Ci0Jc2FkZHIgPSAoKnBza2IpLT5uaC5pcGgtPnNhZGRyOwotCWRhZGRyID0gKCpwc2tiKS0+bmguaXBoLT5kYWRkcjsKLQl0b3MgPSAoKnBza2IpLT5uaC5pcGgtPnRvczsKKwlpcGggPSBpcF9oZHIoKnBza2IpOworCXNhZGRyID0gaXBoLT5zYWRkcjsKKwlkYWRkciA9IGlwaC0+ZGFkZHI7CisJdG9zID0gaXBoLT50b3M7CiAKIAlyZXQgPSBpcHRfZG9fdGFibGUocHNrYiwgaG9vaywgaW4sIG91dCwgJnBhY2tldF9tYW5nbGVyKTsKIAkvKiBSZXJvdXRlIGZvciBBTlkgY2hhbmdlLiAqLwotCWlmIChyZXQgIT0gTkZfRFJPUCAmJiByZXQgIT0gTkZfU1RPTEVOICYmIHJldCAhPSBORl9RVUVVRQotCSAgICAmJiAoKCpwc2tiKS0+bmguaXBoLT5zYWRkciAhPSBzYWRkcgotCQl8fCAoKnBza2IpLT5uaC5pcGgtPmRhZGRyICE9IGRhZGRyCi0JCXx8ICgqcHNrYiktPm1hcmsgIT0gbWFyawotCQl8fCAoKnBza2IpLT5uaC5pcGgtPnRvcyAhPSB0b3MpKQotCQlpZiAoaXBfcm91dGVfbWVfaGFyZGVyKHBza2IsIFJUTl9VTlNQRUMpKQotCQkJcmV0ID0gTkZfRFJPUDsKKwlpZiAocmV0ICE9IE5GX0RST1AgJiYgcmV0ICE9IE5GX1NUT0xFTiAmJiByZXQgIT0gTkZfUVVFVUUpIHsKKwkJaXBoID0gaXBfaGRyKCpwc2tiKTsKKworCQlpZiAoaXBoLT5zYWRkciAhPSBzYWRkciB8fAorCQkgICAgaXBoLT5kYWRkciAhPSBkYWRkciB8fAorCQkgICAgKCpwc2tiKS0+bWFyayAhPSBtYXJrIHx8CisJCSAgICBpcGgtPnRvcyAhPSB0b3MpCisJCQlpZiAoaXBfcm91dGVfbWVfaGFyZGVyKHBza2IsIFJUTl9VTlNQRUMpKQorCQkJCXJldCA9IE5GX0RST1A7CisJfQogCiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDNwcm90b19pcHY0LmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2wzcHJvdG9faXB2NC5jCmluZGV4IDhmM2U5MmQuLjA2NTRlYWEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDNwcm90b19pcHY0LmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sM3Byb3RvX2lwdjQuYwpAQCAtNCwxNCArNCw2IEBACiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIDE2IERlYyAyMDAzOiBZYXN1eXVraSBLb3pha2FpIEBVU0FHSSA8eWFzdXl1a2kua296YWthaUB0b3NoaWJhLmNvLmpwPgotICoJLSBtb3ZlIEwzIHByb3RvY29sIGRlcGVuZGVudCBwYXJ0IHRvIHRoaXMgZmlsZS4KLSAqIDIzIE1hciAyMDA0OiBZYXN1eXVraSBLb3pha2FpIEBVU0FHSSA8eWFzdXl1a2kua296YWthaUB0b3NoaWJhLmNvLmpwPgotICoJLSBhZGQgZ2V0X2ZlYXR1cmVzKCkgdG8gc3VwcG9ydCB2YXJpb3VzIHNpemUgb2YgY29ubnRyYWNrCi0gKgkgIHN0cnVjdHVyZXMuCi0gKgotICogRGVyaXZlZCBmcm9tIG5ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfc3RhbmRhbG9uZS5jCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CkBAIC04Nyw3ICs3OSw3IEBACiAJbG9jYWxfYmhfZW5hYmxlKCk7CiAKIAlpZiAoc2tiKQotCQlpcF9zZW5kX2NoZWNrKHNrYi0+bmguaXBoKTsKKwkJaXBfc2VuZF9jaGVjayhpcF9oZHIoc2tiKSk7CiAKIAlyZXR1cm4gc2tiOwogfQpAQCAtOTcsMTYgKzg5LDE2IEBACiAJICAgICB1X2ludDhfdCAqcHJvdG9udW0pCiB7CiAJLyogTmV2ZXIgaGFwcGVuICovCi0JaWYgKCgqcHNrYiktPm5oLmlwaC0+ZnJhZ19vZmYgJiBodG9ucyhJUF9PRkZTRVQpKSB7CisJaWYgKGlwX2hkcigqcHNrYiktPmZyYWdfb2ZmICYgaHRvbnMoSVBfT0ZGU0VUKSkgewogCQlpZiAobmV0X3JhdGVsaW1pdCgpKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgImlwdjRfcHJlcGFyZTogRnJhZyBvZiBwcm90byAldSAoaG9vaz0ldSlcbiIsCi0JCQkoKnBza2IpLT5uaC5pcGgtPnByb3RvY29sLCBob29rbnVtKTsKKwkJCWlwX2hkcigqcHNrYiktPnByb3RvY29sLCBob29rbnVtKTsKIAkJfQogCQlyZXR1cm4gLU5GX0RST1A7CiAJfQogCi0JKmRhdGFvZmYgPSAoKnBza2IpLT5uaC5yYXcgLSAoKnBza2IpLT5kYXRhICsgKCpwc2tiKS0+bmguaXBoLT5paGwqNDsKLQkqcHJvdG9udW0gPSAoKnBza2IpLT5uaC5pcGgtPnByb3RvY29sOworCSpkYXRhb2ZmID0gc2tiX25ldHdvcmtfb2Zmc2V0KCpwc2tiKSArIGlwX2hkcmxlbigqcHNrYik7CisJKnByb3RvbnVtID0gaXBfaGRyKCpwc2tiKS0+cHJvdG9jb2w7CiAKIAlyZXR1cm4gTkZfQUNDRVBUOwogfQpAQCAtMTUyLDkgKzE0NCw4IEBACiAJCXJldHVybiBORl9BQ0NFUFQ7CiAKIAlyZXR1cm4gaGVscC0+aGVscGVyLT5oZWxwKHBza2IsCi0JCQkgICAgICAgKCpwc2tiKS0+bmgucmF3IC0gKCpwc2tiKS0+ZGF0YQotCQkJCQkgICAgICAgKyAoKnBza2IpLT5uaC5pcGgtPmlobCo0LAotCQkJICAgICAgIGN0LCBjdGluZm8pOworCQkJCSAgc2tiX25ldHdvcmtfb2Zmc2V0KCpwc2tiKSArIGlwX2hkcmxlbigqcHNrYiksCisJCQkJICBjdCwgY3RpbmZvKTsKIH0KIAogc3RhdGljIHVuc2lnbmVkIGludCBpcHY0X2Nvbm50cmFja19kZWZyYWcodW5zaWduZWQgaW50IGhvb2tudW0sCkBAIC0xNzEsNyArMTYyLDcgQEAKICNlbmRpZgogCiAJLyogR2F0aGVyIGZyYWdtZW50cy4gKi8KLQlpZiAoKCpwc2tiKS0+bmguaXBoLT5mcmFnX29mZiAmIGh0b25zKElQX01GfElQX09GRlNFVCkpIHsKKwlpZiAoaXBfaGRyKCpwc2tiKS0+ZnJhZ19vZmYgJiBodG9ucyhJUF9NRiB8IElQX09GRlNFVCkpIHsKIAkJKnBza2IgPSBuZl9jdF9pcHY0X2dhdGhlcl9mcmFncygqcHNrYiwKIAkJCQkJCWhvb2tudW0gPT0gTkZfSVBfUFJFX1JPVVRJTkcgPwogCQkJCQkJSVBfREVGUkFHX0NPTk5UUkFDS19JTiA6CkBAIC0xOTksNyArMTkwLDcgQEAKIHsKIAkvKiByb290IGlzIHBsYXlpbmcgd2l0aCByYXcgc29ja2V0cy4gKi8KIAlpZiAoKCpwc2tiKS0+bGVuIDwgc2l6ZW9mKHN0cnVjdCBpcGhkcikKLQkgICAgfHwgKCpwc2tiKS0+bmguaXBoLT5paGwgKiA0IDwgc2l6ZW9mKHN0cnVjdCBpcGhkcikpIHsKKwkgICAgfHwgaXBfaGRybGVuKCpwc2tiKSA8IHNpemVvZihzdHJ1Y3QgaXBoZHIpKSB7CiAJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCiAJCQlwcmludGsoImlwdF9ob29rOiBoYXBweSBjcmFja2luZy5cbiIpOwogCQlyZXR1cm4gTkZfQUNDRVBUOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b19pY21wLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX2ljbXAuYwppbmRleCA1ZmQxZTUzLi5mNGZjNjU3IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX2ljbXAuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX2ljbXAuYwpAQCAtNCwxMSArNCw2IEBACiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIDE2IERlYyAyMDAzOiBZYXN1eXVraSBLb3pha2FpIEBVU0FHSSA8eWFzdXl1a2kua296YWthaUB0b3NoaWJhLmNvLmpwPgotICoJLSBlbmFibGUgd29ya2luZyB3aXRoIExheWVyIDMgcHJvdG9jb2wgaW5kZXBlbmRlbnQgY29ubmVjdGlvbiB0cmFja2luZy4KLSAqCi0gKiBEZXJpdmVkIGZyb20gbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19wcm90b19pY21wLmMKICAqLwogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KQEAgLTE1OCw3ICsxNTMsNyBAQAogCU5GX0NUX0FTU0VSVChza2ItPm5mY3QgPT0gTlVMTCk7CiAKIAkvKiBOb3QgZW5vdWdoIGhlYWRlcj8gKi8KLQlpbnNpZGUgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBza2ItPm5oLmlwaC0+aWhsKjQsIHNpemVvZihfaW4pLCAmX2luKTsKKwlpbnNpZGUgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBpcF9oZHJsZW4oc2tiKSwgc2l6ZW9mKF9pbiksICZfaW4pOwogCWlmIChpbnNpZGUgPT0gTlVMTCkKIAkJcmV0dXJuIC1ORl9BQ0NFUFQ7CiAKQEAgLTE3Miw3ICsxNjcsNyBAQAogCS8qIHJjdV9yZWFkX2xvY2soKWVkIGJ5IG5mX2hvb2tfc2xvdyAqLwogCWlubmVycHJvdG8gPSBfX25mX2N0X2w0cHJvdG9fZmluZChQRl9JTkVULCBpbnNpZGUtPmlwLnByb3RvY29sKTsKIAotCWRhdGFvZmYgPSBza2ItPm5oLmlwaC0+aWhsKjQgKyBzaXplb2YoaW5zaWRlLT5pY21wKTsKKwlkYXRhb2ZmID0gaXBfaGRybGVuKHNrYikgKyBzaXplb2YoaW5zaWRlLT5pY21wKTsKIAkvKiBBcmUgdGhleSB0YWxraW5nIGFib3V0IG9uZSBvZiBvdXIgY29ubmVjdGlvbnM/ICovCiAJaWYgKCFuZl9jdF9nZXRfdHVwbGUoc2tiLCBkYXRhb2ZmLCBkYXRhb2ZmICsgaW5zaWRlLT5pcC5paGwqNCwgUEZfSU5FVCwKIAkJCSAgICAgaW5zaWRlLT5pcC5wcm90b2NvbCwgJm9yaWd0dXBsZSwKQEAgLTIyNyw3ICsyMjIsNyBAQAogCXN0cnVjdCBpY21waGRyIF9paCwgKmljbXBoOwogCiAJLyogTm90IGVub3VnaCBoZWFkZXI/ICovCi0JaWNtcGggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBza2ItPm5oLmlwaC0+aWhsKjQsIHNpemVvZihfaWgpLCAmX2loKTsKKwlpY21waCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIGlwX2hkcmxlbihza2IpLCBzaXplb2YoX2loKSwgJl9paCk7CiAJaWYgKGljbXBoID09IE5VTEwpIHsKIAkJaWYgKExPR19JTlZBTElEKElQUFJPVE9fSUNNUCkpCiAJCQluZl9sb2dfcGFja2V0KFBGX0lORVQsIDAsIHNrYiwgTlVMTCwgTlVMTCwgTlVMTCwKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfY29yZS5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9jb3JlLmMKaW5kZXggNDUyZTlkMy4uZWEwMmYwMCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9jb3JlLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9jb3JlLmMKQEAgLTQzMSw3ICs0MzEsNyBAQAogCX0gKmluc2lkZTsKIAlzdHJ1Y3QgbmZfY29ubnRyYWNrX2w0cHJvdG8gKmw0cHJvdG87CiAJc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSBpbm5lciwgdGFyZ2V0OwotCWludCBoZHJsZW4gPSAoKnBza2IpLT5uaC5pcGgtPmlobCAqIDQ7CisJaW50IGhkcmxlbiA9IGlwX2hkcmxlbigqcHNrYik7CiAJZW51bSBpcF9jb25udHJhY2tfZGlyIGRpciA9IENUSU5GTzJESVIoY3RpbmZvKTsKIAl1bnNpZ25lZCBsb25nIHN0YXR1c2JpdDsKIAllbnVtIG5mX25hdF9tYW5pcF90eXBlIG1hbmlwID0gSE9PSzJNQU5JUChob29rbnVtKTsKQEAgLTQzOSw3ICs0MzksNyBAQAogCWlmICghc2tiX21ha2Vfd3JpdGFibGUocHNrYiwgaGRybGVuICsgc2l6ZW9mKCppbnNpZGUpKSkKIAkJcmV0dXJuIDA7CiAKLQlpbnNpZGUgPSAodm9pZCAqKSgqcHNrYiktPmRhdGEgKyAoKnBza2IpLT5uaC5pcGgtPmlobCo0OworCWluc2lkZSA9ICh2b2lkICopKCpwc2tiKS0+ZGF0YSArIGlwX2hkcmxlbigqcHNrYik7CiAKIAkvKiBXZSdyZSBhY3R1YWxseSBnb2luZyB0byBtYW5nbGUgaXQgYmV5b25kIHRyaXZpYWwgY2hlY2tzdW0KIAkgICBhZGp1c3RtZW50LCBzbyBtYWtlIHN1cmUgdGhlIGN1cnJlbnQgY2hlY2tzdW0gaXMgY29ycmVjdC4gKi8KQEAgLTQ2OSw5ICs0NjksOSBAQAogCWw0cHJvdG8gPSBfX25mX2N0X2w0cHJvdG9fZmluZChQRl9JTkVULCBpbnNpZGUtPmlwLnByb3RvY29sKTsKIAogCWlmICghbmZfY3RfZ2V0X3R1cGxlKCpwc2tiLAotCQkJICAgICAoKnBza2IpLT5uaC5pcGgtPmlobCo0ICsgc2l6ZW9mKHN0cnVjdCBpY21waGRyKSwKLQkJCSAgICAgKCpwc2tiKS0+bmguaXBoLT5paGwqNCArCi0JCQkgICAgIHNpemVvZihzdHJ1Y3QgaWNtcGhkcikgKyBpbnNpZGUtPmlwLmlobCo0LAorCQkJICAgICBpcF9oZHJsZW4oKnBza2IpICsgc2l6ZW9mKHN0cnVjdCBpY21waGRyKSwKKwkJCSAgICAgKGlwX2hkcmxlbigqcHNrYikgKworCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBpY21waGRyKSArIGluc2lkZS0+aXAuaWhsICogNCksCiAJCQkgICAgICh1X2ludDE2X3QpQUZfSU5FVCwKIAkJCSAgICAgaW5zaWRlLT5pcC5wcm90b2NvbCwKIAkJCSAgICAgJmlubmVyLCBsM3Byb3RvLCBsNHByb3RvKSkKQEAgLTQ4MywxNCArNDgzLDE0IEBACiAJICAgcGFja2V0OiBQUkVST1VUSU5HIChEU1QgbWFuaXApLCByb3V0aW5nIHByb2R1Y2VzIElDTVAsIGdvZXMKIAkgICB0aHJvdWdoIFBPU1RST1VUSU5HICh3aGljaCBtdXN0IGNvcnJlY3QgdGhlIERTVCBtYW5pcCkuICovCiAJaWYgKCFtYW5pcF9wa3QoaW5zaWRlLT5pcC5wcm90b2NvbCwgcHNrYiwKLQkJICAgICAgICgqcHNrYiktPm5oLmlwaC0+aWhsKjQgKyBzaXplb2YoaW5zaWRlLT5pY21wKSwKKwkJICAgICAgIGlwX2hkcmxlbigqcHNrYikgKyBzaXplb2YoaW5zaWRlLT5pY21wKSwKIAkJICAgICAgICZjdC0+dHVwbGVoYXNoWyFkaXJdLnR1cGxlLAogCQkgICAgICAgIW1hbmlwKSkKIAkJcmV0dXJuIDA7CiAKIAlpZiAoKCpwc2tiKS0+aXBfc3VtbWVkICE9IENIRUNLU1VNX1BBUlRJQUwpIHsKIAkJLyogUmVsb2FkaW5nICJpbnNpZGUiIGhlcmUgc2luY2UgbWFuaXBfcGt0IGlubmVyLiAqLwotCQlpbnNpZGUgPSAodm9pZCAqKSgqcHNrYiktPmRhdGEgKyAoKnBza2IpLT5uaC5pcGgtPmlobCo0OworCQlpbnNpZGUgPSAodm9pZCAqKSgqcHNrYiktPmRhdGEgKyBpcF9oZHJsZW4oKnBza2IpOwogCQlpbnNpZGUtPmljbXAuY2hlY2tzdW0gPSAwOwogCQlpbnNpZGUtPmljbXAuY2hlY2tzdW0gPQogCQkJY3N1bV9mb2xkKHNrYl9jaGVja3N1bSgqcHNrYiwgaGRybGVuLApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9oMzIzLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X2gzMjMuYwppbmRleCA5Y2JmM2Y5Li5mY2ViYzk2IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X2gzMjMuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X2gzMjMuYwpAQCAtMzMsNyArMzMsNyBAQAogCQkgICAgdW5zaWduZWQgaW50IGFkZHJvZmYsIF9fYmUzMiBpcCwgX19iZTE2IHBvcnQpCiB7CiAJZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm87Ci0Jc3RydWN0IG5mX2Nvbm4gKmN0ID0gaXBfY29ubnRyYWNrX2dldCgqcHNrYiwgJmN0aW5mbyk7CisJc3RydWN0IG5mX2Nvbm4gKmN0ID0gbmZfY3RfZ2V0KCpwc2tiLCAmY3RpbmZvKTsKIAlzdHJ1Y3QgewogCQlfX2JlMzIgaXA7CiAJCV9fYmUxNiBwb3J0OwpAQCAtNDQsNyArNDQsNyBAQAogCWJ1Zi5wb3J0ID0gcG9ydDsKIAlhZGRyb2ZmICs9IGRhdGFvZmY7CiAKLQlpZiAoKCpwc2tiKS0+bmguaXBoLT5wcm90b2NvbCA9PSBJUFBST1RPX1RDUCkgeworCWlmIChpcF9oZHIoKnBza2IpLT5wcm90b2NvbCA9PSBJUFBST1RPX1RDUCkgewogCQlpZiAoIW5mX25hdF9tYW5nbGVfdGNwX3BhY2tldChwc2tiLCBjdCwgY3RpbmZvLAogCQkJCQkgICAgICBhZGRyb2ZmLCBzaXplb2YoYnVmKSwKIAkJCQkJICAgICAgKGNoYXIgKikgJmJ1Ziwgc2l6ZW9mKGJ1ZikpKSB7CkBAIC01NSwxMSArNTUsMTEgQEAKIAkJfQogCiAJCS8qIFJlbG9jYXRlIGRhdGEgcG9pbnRlciAqLwotCQl0aCA9IHNrYl9oZWFkZXJfcG9pbnRlcigqcHNrYiwgKCpwc2tiKS0+bmguaXBoLT5paGwgKiA0LAorCQl0aCA9IHNrYl9oZWFkZXJfcG9pbnRlcigqcHNrYiwgaXBfaGRybGVuKCpwc2tiKSwKIAkJCQkJc2l6ZW9mKF90Y3BoKSwgJl90Y3BoKTsKIAkJaWYgKHRoID09IE5VTEwpCiAJCQlyZXR1cm4gLTE7Ci0JCSpkYXRhID0gKCpwc2tiKS0+ZGF0YSArICgqcHNrYiktPm5oLmlwaC0+aWhsICogNCArCisJCSpkYXRhID0gKCpwc2tiKS0+ZGF0YSArIGlwX2hkcmxlbigqcHNrYikgKwogCQkgICAgdGgtPmRvZmYgKiA0ICsgZGF0YW9mZjsKIAl9IGVsc2UgewogCQlpZiAoIW5mX25hdF9tYW5nbGVfdWRwX3BhY2tldChwc2tiLCBjdCwgY3RpbmZvLApAQCAtNzMsOCArNzMsOCBAQAogCQkvKiBuZl9uYXRfbWFuZ2xlX3VkcF9wYWNrZXQgdXNlcyBza2JfbWFrZV93cml0YWJsZSgpIHRvIGNvcHkKIAkJICogb3IgcHVsbCBldmVyeXRoaW5nIGluIGEgbGluZWFyIGJ1ZmZlciwgc28gd2UgY2FuIHNhZmVseQogCQkgKiB1c2UgdGhlIHNrYiBwb2ludGVycyBub3cgKi8KLQkJKmRhdGEgPSAoKnBza2IpLT5kYXRhICsgKCpwc2tiKS0+bmguaXBoLT5paGwgKiA0ICsKLQkJICAgIHNpemVvZihzdHJ1Y3QgdWRwaGRyKTsKKwkJKmRhdGEgPSAoKCpwc2tiKS0+ZGF0YSArIGlwX2hkcmxlbigqcHNrYikgKworCQkJIHNpemVvZihzdHJ1Y3QgdWRwaGRyKSk7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0zODMsNyArMzgzLDcgQEAKIHN0YXRpYyB2b2lkIGlwX25hdF9xOTMxX2V4cGVjdChzdHJ1Y3QgbmZfY29ubiAqbmV3LAogCQkJICAgICAgIHN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICp0aGlzKQogewotCXN0cnVjdCBpcF9uYXRfcmFuZ2UgcmFuZ2U7CisJc3RydWN0IG5mX25hdF9yYW5nZSByYW5nZTsKIAogCWlmICh0aGlzLT50dXBsZS5zcmMudTMuaXAgIT0gMCkgewkvKiBPbmx5IGFjY2VwdCBjYWxscyBmcm9tIEdLICovCiAJCW5mX25hdF9mb2xsb3dfbWFzdGVyKG5ldywgdGhpcyk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X2hlbHBlci5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9oZWxwZXIuYwppbmRleCA0OWE5MGMzLi4xNWI2ZTVjIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X2hlbHBlci5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfaGVscGVyLmMKQEAgLTg3LDEyICs4NywxMyBAQAogCXVuc2lnbmVkIGNoYXIgKmRhdGE7CiAKIAlCVUdfT04oc2tiX2lzX25vbmxpbmVhcihza2IpKTsKLQlkYXRhID0gKHVuc2lnbmVkIGNoYXIgKilza2ItPm5oLmlwaCArIGRhdGFvZmY7CisJZGF0YSA9IHNrYl9uZXR3b3JrX2hlYWRlcihza2IpICsgZGF0YW9mZjsKIAogCS8qIG1vdmUgcG9zdC1yZXBsYWNlbWVudCAqLwogCW1lbW1vdmUoZGF0YSArIG1hdGNoX29mZnNldCArIHJlcF9sZW4sCiAJCWRhdGEgKyBtYXRjaF9vZmZzZXQgKyBtYXRjaF9sZW4sCi0JCXNrYi0+dGFpbCAtIChkYXRhICsgbWF0Y2hfb2Zmc2V0ICsgbWF0Y2hfbGVuKSk7CisJCXNrYi0+dGFpbCAtIChza2ItPm5ldHdvcmtfaGVhZGVyICsgZGF0YW9mZiArCisJCQkgICAgIG1hdGNoX29mZnNldCArIG1hdGNoX2xlbikpOwogCiAJLyogaW5zZXJ0IGRhdGEgZnJvbSBidWZmZXIgKi8KIAltZW1jcHkoZGF0YSArIG1hdGNoX29mZnNldCwgcmVwX2J1ZmZlciwgcmVwX2xlbik7CkBAIC0xMTEsOCArMTEyLDggQEAKIAl9CiAKIAkvKiBmaXggSVAgaGRyIGNoZWNrc3VtIGluZm9ybWF0aW9uICovCi0Jc2tiLT5uaC5pcGgtPnRvdF9sZW4gPSBodG9ucyhza2ItPmxlbik7Ci0JaXBfc2VuZF9jaGVjayhza2ItPm5oLmlwaCk7CisJaXBfaGRyKHNrYiktPnRvdF9sZW4gPSBodG9ucyhza2ItPmxlbik7CisJaXBfc2VuZF9jaGVjayhpcF9oZHIoc2tiKSk7CiB9CiAKIC8qIFVudXN1YWwsIGJ1dCBwb3NzaWJsZSBjYXNlLiAqLwpAQCAtMTUyLDYgKzE1Myw3IEBACiAJCQkgY29uc3QgY2hhciAqcmVwX2J1ZmZlciwKIAkJCSB1bnNpZ25lZCBpbnQgcmVwX2xlbikKIHsKKwlzdHJ1Y3QgcnRhYmxlICpydCA9IChzdHJ1Y3QgcnRhYmxlICopKCpwc2tiKS0+ZHN0OwogCXN0cnVjdCBpcGhkciAqaXBoOwogCXN0cnVjdCB0Y3BoZHIgKnRjcGg7CiAJaW50IG9sZGxlbiwgZGF0YWxlbjsKQEAgLTE2Niw3ICsxNjgsNyBAQAogCiAJU0tCX0xJTkVBUl9BU1NFUlQoKnBza2IpOwogCi0JaXBoID0gKCpwc2tiKS0+bmguaXBoOworCWlwaCA9IGlwX2hkcigqcHNrYik7CiAJdGNwaCA9ICh2b2lkICopaXBoICsgaXBoLT5paGwqNDsKIAogCW9sZGxlbiA9ICgqcHNrYiktPmxlbiAtIGlwaC0+aWhsKjQ7CkBAIC0xNzUsMTEgKzE3NywyMiBAQAogCiAJZGF0YWxlbiA9ICgqcHNrYiktPmxlbiAtIGlwaC0+aWhsKjQ7CiAJaWYgKCgqcHNrYiktPmlwX3N1bW1lZCAhPSBDSEVDS1NVTV9QQVJUSUFMKSB7Ci0JCXRjcGgtPmNoZWNrID0gMDsKLQkJdGNwaC0+Y2hlY2sgPSB0Y3BfdjRfY2hlY2soZGF0YWxlbiwKLQkJCQkJICAgaXBoLT5zYWRkciwgaXBoLT5kYWRkciwKLQkJCQkJICAgY3N1bV9wYXJ0aWFsKChjaGFyICopdGNwaCwKLQkJCQkJCQlkYXRhbGVuLCAwKSk7CisJCWlmICghKHJ0LT5ydF9mbGFncyAmIFJUQ0ZfTE9DQUwpICYmCisJCSAgICAoKnBza2IpLT5kZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9BTExfQ1NVTSkgeworCQkJKCpwc2tiKS0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fUEFSVElBTDsKKwkJCSgqcHNrYiktPmNzdW1fc3RhcnQgPSBza2JfaGVhZHJvb20oKnBza2IpICsKKwkJCQkJICAgICAgc2tiX25ldHdvcmtfb2Zmc2V0KCpwc2tiKSArCisJCQkJCSAgICAgIGlwaC0+aWhsICogNDsKKwkJCSgqcHNrYiktPmNzdW1fb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IHRjcGhkciwgY2hlY2spOworCQkJdGNwaC0+Y2hlY2sgPSB+dGNwX3Y0X2NoZWNrKGRhdGFsZW4sCisJCQkJCQkgICAgaXBoLT5zYWRkciwgaXBoLT5kYWRkciwgMCk7CisJCX0gZWxzZSB7CisJCQl0Y3BoLT5jaGVjayA9IDA7CisJCQl0Y3BoLT5jaGVjayA9IHRjcF92NF9jaGVjayhkYXRhbGVuLAorCQkJCQkJICAgaXBoLT5zYWRkciwgaXBoLT5kYWRkciwKKwkJCQkJCSAgIGNzdW1fcGFydGlhbCgoY2hhciAqKXRjcGgsCisJCQkJCQkJCWRhdGFsZW4sIDApKTsKKwkJfQogCX0gZWxzZQogCQluZl9wcm90b19jc3VtX3JlcGxhY2UyKCZ0Y3BoLT5jaGVjaywgKnBza2IsCiAJCQkJICAgICAgIGh0b25zKG9sZGxlbiksIGh0b25zKGRhdGFsZW4pLCAxKTsKQEAgLTE5MCw3ICsyMDMsNyBAQAogCQkJCSAgICAoaW50KXJlcF9sZW4gLSAoaW50KW1hdGNoX2xlbiwKIAkJCQkgICAgY3QsIGN0aW5mbyk7CiAJCS8qIFRlbGwgVENQIHdpbmRvdyB0cmFja2luZyBhYm91dCBzZXEgY2hhbmdlICovCi0JCW5mX2Nvbm50cmFja190Y3BfdXBkYXRlKCpwc2tiLCAoKnBza2IpLT5uaC5pcGgtPmlobCo0LAorCQluZl9jb25udHJhY2tfdGNwX3VwZGF0ZSgqcHNrYiwgaXBfaGRybGVuKCpwc2tiKSwKIAkJCQkJY3QsIENUSU5GTzJESVIoY3RpbmZvKSk7CiAJfQogCXJldHVybiAxOwpAQCAtMjE2LDEyICsyMjksMTMgQEAKIAkJCSBjb25zdCBjaGFyICpyZXBfYnVmZmVyLAogCQkJIHVuc2lnbmVkIGludCByZXBfbGVuKQogeworCXN0cnVjdCBydGFibGUgKnJ0ID0gKHN0cnVjdCBydGFibGUgKikoKnBza2IpLT5kc3Q7CiAJc3RydWN0IGlwaGRyICppcGg7CiAJc3RydWN0IHVkcGhkciAqdWRwaDsKIAlpbnQgZGF0YWxlbiwgb2xkbGVuOwogCiAJLyogVURQIGhlbHBlcnMgbWlnaHQgYWNjaWRlbnRhbGx5IG1hbmdsZSB0aGUgd3JvbmcgcGFja2V0ICovCi0JaXBoID0gKCpwc2tiKS0+bmguaXBoOworCWlwaCA9IGlwX2hkcigqcHNrYik7CiAJaWYgKCgqcHNrYiktPmxlbiA8IGlwaC0+aWhsKjQgKyBzaXplb2YoKnVkcGgpICsKIAkJCSAgICAgICBtYXRjaF9vZmZzZXQgKyBtYXRjaF9sZW4pCiAJCXJldHVybiAwOwpAQCAtMjM0LDcgKzI0OCw3IEBACiAJICAgICFlbmxhcmdlX3NrYihwc2tiLCByZXBfbGVuIC0gbWF0Y2hfbGVuKSkKIAkJcmV0dXJuIDA7CiAKLQlpcGggPSAoKnBza2IpLT5uaC5pcGg7CisJaXBoID0gaXBfaGRyKCpwc2tiKTsKIAl1ZHBoID0gKHZvaWQgKilpcGggKyBpcGgtPmlobCo0OwogCiAJb2xkbGVuID0gKCpwc2tiKS0+bGVuIC0gaXBoLT5paGwqNDsKQEAgLTI1MCwxMyArMjY0LDI1IEBACiAJCXJldHVybiAxOwogCiAJaWYgKCgqcHNrYiktPmlwX3N1bW1lZCAhPSBDSEVDS1NVTV9QQVJUSUFMKSB7Ci0JCXVkcGgtPmNoZWNrID0gMDsKLQkJdWRwaC0+Y2hlY2sgPSBjc3VtX3RjcHVkcF9tYWdpYyhpcGgtPnNhZGRyLCBpcGgtPmRhZGRyLAotCQkJCQkJZGF0YWxlbiwgSVBQUk9UT19VRFAsCi0JCQkJCQljc3VtX3BhcnRpYWwoKGNoYXIgKil1ZHBoLAotCQkJCQkJCSAgICAgZGF0YWxlbiwgMCkpOwotCQlpZiAoIXVkcGgtPmNoZWNrKQotCQkJdWRwaC0+Y2hlY2sgPSBDU1VNX01BTkdMRURfMDsKKwkJaWYgKCEocnQtPnJ0X2ZsYWdzICYgUlRDRl9MT0NBTCkgJiYKKwkJICAgICgqcHNrYiktPmRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0FMTF9DU1VNKSB7CisJCQkoKnBza2IpLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9QQVJUSUFMOworCQkJKCpwc2tiKS0+Y3N1bV9zdGFydCA9IHNrYl9oZWFkcm9vbSgqcHNrYikgKworCQkJCQkgICAgICBza2JfbmV0d29ya19vZmZzZXQoKnBza2IpICsKKwkJCQkJICAgICAgaXBoLT5paGwgKiA0OworCQkJKCpwc2tiKS0+Y3N1bV9vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3QgdWRwaGRyLCBjaGVjayk7CisJCQl1ZHBoLT5jaGVjayA9IH5jc3VtX3RjcHVkcF9tYWdpYyhpcGgtPnNhZGRyLCBpcGgtPmRhZGRyLAorCQkJCQkJCSBkYXRhbGVuLCBJUFBST1RPX1VEUCwKKwkJCQkJCQkgMCk7CisJCX0gZWxzZSB7CisJCQl1ZHBoLT5jaGVjayA9IDA7CisJCQl1ZHBoLT5jaGVjayA9IGNzdW1fdGNwdWRwX21hZ2ljKGlwaC0+c2FkZHIsIGlwaC0+ZGFkZHIsCisJCQkJCQkJZGF0YWxlbiwgSVBQUk9UT19VRFAsCisJCQkJCQkJY3N1bV9wYXJ0aWFsKChjaGFyICopdWRwaCwKKwkJCQkJCQkJICAgICBkYXRhbGVuLCAwKSk7CisJCQlpZiAoIXVkcGgtPmNoZWNrKQorCQkJCXVkcGgtPmNoZWNrID0gQ1NVTV9NQU5HTEVEXzA7CisJCX0KIAl9IGVsc2UKIAkJbmZfcHJvdG9fY3N1bV9yZXBsYWNlMigmdWRwaC0+Y2hlY2ssICpwc2tiLAogCQkJCSAgICAgICBodG9ucyhvbGRsZW4pLCBodG9ucyhkYXRhbGVuKSwgMSk7CkBAIC0zMTgsOCArMzQ0LDggQEAKIAl1bnNpZ25lZCBpbnQgZGlyLCBvcHRvZmYsIG9wdGVuZDsKIAlzdHJ1Y3QgbmZfY29ubl9uYXQgKm5hdCA9IG5mY3RfbmF0KGN0KTsKIAotCW9wdG9mZiA9ICgqcHNrYiktPm5oLmlwaC0+aWhsKjQgKyBzaXplb2Yoc3RydWN0IHRjcGhkcik7Ci0Jb3B0ZW5kID0gKCpwc2tiKS0+bmguaXBoLT5paGwqNCArIHRjcGgtPmRvZmYqNDsKKwlvcHRvZmYgPSBpcF9oZHJsZW4oKnBza2IpICsgc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpOworCW9wdGVuZCA9IGlwX2hkcmxlbigqcHNrYikgKyB0Y3BoLT5kb2ZmICogNDsKIAogCWlmICghc2tiX21ha2Vfd3JpdGFibGUocHNrYiwgb3B0ZW5kKSkKIAkJcmV0dXJuIDA7CkBAIC0zNzEsMTAgKzM5NywxMCBAQAogCXRoaXNfd2F5ID0gJm5hdC0+aW5mby5zZXFbZGlyXTsKIAlvdGhlcl93YXkgPSAmbmF0LT5pbmZvLnNlcVshZGlyXTsKIAotCWlmICghc2tiX21ha2Vfd3JpdGFibGUocHNrYiwgKCpwc2tiKS0+bmguaXBoLT5paGwqNCtzaXplb2YoKnRjcGgpKSkKKwlpZiAoIXNrYl9tYWtlX3dyaXRhYmxlKHBza2IsIGlwX2hkcmxlbigqcHNrYikgKyBzaXplb2YoKnRjcGgpKSkKIAkJcmV0dXJuIDA7CiAKLQl0Y3BoID0gKHZvaWQgKikoKnBza2IpLT5kYXRhICsgKCpwc2tiKS0+bmguaXBoLT5paGwqNDsKKwl0Y3BoID0gKHZvaWQgKikoKnBza2IpLT5kYXRhICsgaXBfaGRybGVuKCpwc2tiKTsKIAlpZiAoYWZ0ZXIobnRvaGwodGNwaC0+c2VxKSwgdGhpc193YXktPmNvcnJlY3Rpb25fcG9zKSkKIAkJbmV3c2VxID0gaHRvbmwobnRvaGwodGNwaC0+c2VxKSArIHRoaXNfd2F5LT5vZmZzZXRfYWZ0ZXIpOwogCWVsc2UKQEAgLTM5OSw3ICs0MjUsNyBAQAogCWlmICghbmZfbmF0X3NhY2tfYWRqdXN0KHBza2IsIHRjcGgsIGN0LCBjdGluZm8pKQogCQlyZXR1cm4gMDsKIAotCW5mX2Nvbm50cmFja190Y3BfdXBkYXRlKCpwc2tiLCAoKnBza2IpLT5uaC5pcGgtPmlobCo0LCBjdCwgZGlyKTsKKwluZl9jb25udHJhY2tfdGNwX3VwZGF0ZSgqcHNrYiwgaXBfaGRybGVuKCpwc2tiKSwgY3QsIGRpcik7CiAKIAlyZXR1cm4gMTsKIH0KZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcHB0cC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9wcHRwLmMKaW5kZXggN2JhMzQxYy4uYTY2ODg4NyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9wcHRwLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9wcHRwLmMKQEAgLTUzLDcgKzUzLDcgQEAKIAlzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlIHQ7CiAJc3RydWN0IG5mX2N0X3BwdHBfbWFzdGVyICpjdF9wcHRwX2luZm87CiAJc3RydWN0IG5mX25hdF9wcHRwICpuYXRfcHB0cF9pbmZvOwotCXN0cnVjdCBpcF9uYXRfcmFuZ2UgcmFuZ2U7CisJc3RydWN0IG5mX25hdF9yYW5nZSByYW5nZTsKIAogCWN0X3BwdHBfaW5mbyA9ICZuZmN0X2hlbHAobWFzdGVyKS0+aGVscC5jdF9wcHRwX2luZm87CiAJbmF0X3BwdHBfaW5mbyA9ICZuZmN0X25hdChtYXN0ZXIpLT5oZWxwLm5hdF9wcHRwX2luZm87CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3J1bGUuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcnVsZS5jCmluZGV4IDE0N2E0MzcuLjJhMjgzMzkgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcnVsZS5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcnVsZS5jCkBAIC0xOTEsNyArMTkxLDcgQEAKIAogCWlmIChob29rbnVtID09IE5GX0lQX0xPQ0FMX09VVCAmJgogCSAgICBtci0+cmFuZ2VbMF0uZmxhZ3MgJiBJUF9OQVRfUkFOR0VfTUFQX0lQUykKLQkJd2Fybl9pZl9leHRyYV9tYW5nbGUoKCpwc2tiKS0+bmguaXBoLT5kYWRkciwKKwkJd2Fybl9pZl9leHRyYV9tYW5nbGUoaXBfaGRyKCpwc2tiKS0+ZGFkZHIsCiAJCQkJICAgICBtci0+cmFuZ2VbMF0ubWluX2lwKTsKIAogCXJldHVybiBuZl9uYXRfc2V0dXBfaW5mbyhjdCwgJm1yLT5yYW5nZVswXSwgaG9va251bSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3NpcC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9zaXAuYwppbmRleCBiMTJjZDdjLi5iZmQ4OGU0IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3NpcC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfc2lwLmMKQEAgLTExLDYgKzExLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPG5ldC9pcC5oPgogI2luY2x1ZGUgPGxpbnV4L3VkcC5oPgogCiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9uYXQuaD4KQEAgLTkyLDcgKzkzLDcgQEAKIAlpZiAoIW5mX25hdF9tYW5nbGVfdWRwX3BhY2tldChwc2tiLCBjdCwgY3RpbmZvLAogCQkJCSAgICAgIG1hdGNob2ZmLCBtYXRjaGxlbiwgYWRkciwgYWRkcmxlbikpCiAJCXJldHVybiAwOwotCSpkcHRyID0gKCpwc2tiKS0+ZGF0YSArICgqcHNrYiktPm5oLmlwaC0+aWhsKjQgKyBzaXplb2Yoc3RydWN0IHVkcGhkcik7CisJKmRwdHIgPSAoKnBza2IpLT5kYXRhICsgaXBfaGRybGVuKCpwc2tiKSArIHNpemVvZihzdHJ1Y3QgdWRwaGRyKTsKIAlyZXR1cm4gMTsKIAogfQpAQCAtMTA2LDcgKzEwNyw3IEBACiAJc3RydWN0IGFkZHJfbWFwIG1hcDsKIAlpbnQgZGF0YW9mZiwgZGF0YWxlbjsKIAotCWRhdGFvZmYgPSAoKnBza2IpLT5uaC5pcGgtPmlobCo0ICsgc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpOworCWRhdGFvZmYgPSBpcF9oZHJsZW4oKnBza2IpICsgc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpOwogCWRhdGFsZW4gPSAoKnBza2IpLT5sZW4gLSBkYXRhb2ZmOwogCWlmIChkYXRhbGVuIDwgc2l6ZW9mKCJTSVAvMi4wIikgLSAxKQogCQlyZXR1cm4gTkZfRFJPUDsKQEAgLTE1NSw3ICsxNTYsNyBAQAogCQlyZXR1cm4gMDsKIAogCS8qIFdlIG5lZWQgdG8gcmVsb2FkIHRoaXMuIFRoYW5rcyBQYXRyaWNrLiAqLwotCSpkcHRyID0gKCpwc2tiKS0+ZGF0YSArICgqcHNrYiktPm5oLmlwaC0+aWhsKjQgKyBzaXplb2Yoc3RydWN0IHVkcGhkcik7CisJKmRwdHIgPSAoKnBza2IpLT5kYXRhICsgaXBfaGRybGVuKCpwc2tiKSArIHNpemVvZihzdHJ1Y3QgdWRwaGRyKTsKIAlyZXR1cm4gMTsKIH0KIApAQCAtMTY4LDcgKzE2OSw3IEBACiAJY2hhciBidWZmZXJbc2l6ZW9mKCI2NTUzNiIpXTsKIAlpbnQgYnVmZmxlbjsKIAotCWRhdGFvZmYgPSAoKnBza2IpLT5uaC5pcGgtPmlobCo0ICsgc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpOworCWRhdGFvZmYgPSBpcF9oZHJsZW4oKnBza2IpICsgc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpOwogCiAJLyogR2V0IGFjdHVhbCBTRFAgbGVuZ2h0ICovCiAJaWYgKGN0X3NpcF9nZXRfaW5mbyhjdCwgZHB0ciwgKCpwc2tiKS0+bGVuIC0gZGF0YW9mZiwgJm1hdGNob2ZmLApAQCAtMjAwLDcgKzIwMSw3IEBACiAJY2hhciBidWZmZXJbc2l6ZW9mKCJubm4ubm5uLm5ubi5ubm4iKV07CiAJdW5zaWduZWQgaW50IGRhdGFvZmYsIGJ1ZmZsZW47CiAKLQlkYXRhb2ZmID0gKCpwc2tiKS0+bmguaXBoLT5paGwqNCArIHNpemVvZihzdHJ1Y3QgdWRwaGRyKTsKKwlkYXRhb2ZmID0gaXBfaGRybGVuKCpwc2tiKSArIHNpemVvZihzdHJ1Y3QgdWRwaGRyKTsKIAogCS8qIE1hbmdsZSBvd25lciBhbmQgY29udGFjdCBpbmZvLiAqLwogCWJ1ZmZsZW4gPSBzcHJpbnRmKGJ1ZmZlciwgIiV1LiV1LiV1LiV1IiwgTklQUVVBRChuZXdpcCkpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9zbm1wX2Jhc2ljLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3NubXBfYmFzaWMuYwppbmRleCBjZTVjNDkzLi42ZTg4NTA1IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3NubXBfYmFzaWMuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3NubXBfYmFzaWMuYwpAQCAtMzgsMTAgKzM4LDYgQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQogICoKICAqIEF1dGhvcjogSmFtZXMgTW9ycmlzIDxqbW9ycmlzQGludGVyY29kZS5jb20uYXU+Ci0gKgotICogVXBkYXRlczoKLSAqIDIwMDAtMDgtMDY6IENvbnZlcnQgdG8gbmV3IGhlbHBlciBBUEkgKEhhcmFsZCBXZWx0ZSkuCi0gKgogICovCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KQEAgLTExOTQsNyArMTE5MCw3IEBACiAJCQkgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAogCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IpCiB7Ci0Jc3RydWN0IGlwaGRyICppcGggPSAoKnBza2IpLT5uaC5pcGg7CisJc3RydWN0IGlwaGRyICppcGggPSBpcF9oZHIoKnBza2IpOwogCXN0cnVjdCB1ZHBoZHIgKnVkcGggPSAoc3RydWN0IHVkcGhkciAqKSgoX19iZTMyICopaXBoICsgaXBoLT5paGwpOwogCXVfaW50MTZfdCB1ZHBsZW4gPSBudG9ocyh1ZHBoLT5sZW4pOwogCXVfaW50MTZfdCBwYXlsZW4gPSB1ZHBsZW4gLSBzaXplb2Yoc3RydWN0IHVkcGhkcik7CkBAIC0xMjM1LDcgKzEyMzEsNyBAQAogewogCWludCBkaXIgPSBDVElORk8yRElSKGN0aW5mbyk7CiAJdW5zaWduZWQgaW50IHJldDsKLQlzdHJ1Y3QgaXBoZHIgKmlwaCA9ICgqcHNrYiktPm5oLmlwaDsKKwlzdHJ1Y3QgaXBoZHIgKmlwaCA9IGlwX2hkcigqcHNrYik7CiAJc3RydWN0IHVkcGhkciAqdWRwaCA9IChzdHJ1Y3QgdWRwaGRyICopKCh1X2ludDMyX3QgKilpcGggKyBpcGgtPmlobCk7CiAKIAkvKiBTTk1QIHJlcGxpZXMgYW5kIG9yaWdpbmF0aW5nIFNOTVAgdHJhcHMgZ2V0IG1hbmdsZWQgKi8KZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfc3RhbmRhbG9uZS5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9zdGFuZGFsb25lLmMKaW5kZXggMTVhYTNkYi4uNjRiYmVkMiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9zdGFuZGFsb25lLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9zdGFuZGFsb25lLmMKQEAgLTg2LDggKzg2LDcgQEAKIAogCS8qIFdlIG5ldmVyIHNlZSBmcmFnbWVudHM6IGNvbm50cmFjayBkZWZyYWdzIG9uIHByZS1yb3V0aW5nCiAJICAgYW5kIGxvY2FsLW91dCwgYW5kIG5mX25hdF9vdXQgcHJvdGVjdHMgcG9zdC1yb3V0aW5nLiAqLwotCU5GX0NUX0FTU0VSVCghKCgqcHNrYiktPm5oLmlwaC0+ZnJhZ19vZmYKLQkJICAgICAgICYgaHRvbnMoSVBfTUZ8SVBfT0ZGU0VUKSkpOworCU5GX0NUX0FTU0VSVCghKGlwX2hkcigqcHNrYiktPmZyYWdfb2ZmICYgaHRvbnMoSVBfTUYgfCBJUF9PRkZTRVQpKSk7CiAKIAljdCA9IG5mX2N0X2dldCgqcHNrYiwgJmN0aW5mbyk7CiAJLyogQ2FuJ3QgdHJhY2s/ICBJdCdzIG5vdCBkdWUgdG8gc3RyZXNzLCBvciBjb25udHJhY2sgd291bGQKQEAgLTk4LDExICs5NywxMCBAQAogCQkvKiBFeGNlcHRpb246IElDTVAgcmVkaXJlY3QgdG8gbmV3IGNvbm5lY3Rpb24gKG5vdCBpbgogCQkgICBoYXNoIHRhYmxlIHlldCkuICBXZSBtdXN0IG5vdCBsZXQgdGhpcyB0aHJvdWdoLCBpbgogCQkgICBjYXNlIHdlJ3JlIGRvaW5nIE5BVCB0byB0aGUgc2FtZSBuZXR3b3JrLiAqLwotCQlpZiAoKCpwc2tiKS0+bmguaXBoLT5wcm90b2NvbCA9PSBJUFBST1RPX0lDTVApIHsKKwkJaWYgKGlwX2hkcigqcHNrYiktPnByb3RvY29sID09IElQUFJPVE9fSUNNUCkgewogCQkJc3RydWN0IGljbXBoZHIgX2hkciwgKmhwOwogCi0JCQlocCA9IHNrYl9oZWFkZXJfcG9pbnRlcigqcHNrYiwKLQkJCQkJCSgqcHNrYiktPm5oLmlwaC0+aWhsKjQsCisJCQlocCA9IHNrYl9oZWFkZXJfcG9pbnRlcigqcHNrYiwgaXBfaGRybGVuKCpwc2tiKSwKIAkJCQkJCXNpemVvZihfaGRyKSwgJl9oZHIpOwogCQkJaWYgKGhwICE9IE5VTEwgJiYKIAkJCSAgICBocC0+dHlwZSA9PSBJQ01QX1JFRElSRUNUKQpAQCAtMTIyLDcgKzEyMCw3IEBACiAJc3dpdGNoIChjdGluZm8pIHsKIAljYXNlIElQX0NUX1JFTEFURUQ6CiAJY2FzZSBJUF9DVF9SRUxBVEVEK0lQX0NUX0lTX1JFUExZOgotCQlpZiAoKCpwc2tiKS0+bmguaXBoLT5wcm90b2NvbCA9PSBJUFBST1RPX0lDTVApIHsKKwkJaWYgKGlwX2hkcigqcHNrYiktPnByb3RvY29sID09IElQUFJPVE9fSUNNUCkgewogCQkJaWYgKCFuZl9uYXRfaWNtcF9yZXBseV90cmFuc2xhdGlvbihjdCwgY3RpbmZvLAogCQkJCQkJCSAgIGhvb2tudW0sIHBza2IpKQogCQkJCXJldHVybiBORl9EUk9QOwpAQCAtMTc3LDExICsxNzUsMTEgQEAKIAkgIGludCAoKm9rZm4pKHN0cnVjdCBza19idWZmICopKQogewogCXVuc2lnbmVkIGludCByZXQ7Ci0JX19iZTMyIGRhZGRyID0gKCpwc2tiKS0+bmguaXBoLT5kYWRkcjsKKwlfX2JlMzIgZGFkZHIgPSBpcF9oZHIoKnBza2IpLT5kYWRkcjsKIAogCXJldCA9IG5mX25hdF9mbihob29rbnVtLCBwc2tiLCBpbiwgb3V0LCBva2ZuKTsKIAlpZiAocmV0ICE9IE5GX0RST1AgJiYgcmV0ICE9IE5GX1NUT0xFTiAmJgotCSAgICBkYWRkciAhPSAoKnBza2IpLT5uaC5pcGgtPmRhZGRyKSB7CisJICAgIGRhZGRyICE9IGlwX2hkcigqcHNrYiktPmRhZGRyKSB7CiAJCWRzdF9yZWxlYXNlKCgqcHNrYiktPmRzdCk7CiAJCSgqcHNrYiktPmRzdCA9IE5VTEw7CiAJfQpAQCAtMjAzLDcgKzIwMSw3IEBACiAKIAkvKiByb290IGlzIHBsYXlpbmcgd2l0aCByYXcgc29ja2V0cy4gKi8KIAlpZiAoKCpwc2tiKS0+bGVuIDwgc2l6ZW9mKHN0cnVjdCBpcGhkcikgfHwKLQkgICAgKCpwc2tiKS0+bmguaXBoLT5paGwgKiA0IDwgc2l6ZW9mKHN0cnVjdCBpcGhkcikpCisJICAgIGlwX2hkcmxlbigqcHNrYikgPCBzaXplb2Yoc3RydWN0IGlwaGRyKSkKIAkJcmV0dXJuIE5GX0FDQ0VQVDsKIAogCXJldCA9IG5mX25hdF9mbihob29rbnVtLCBwc2tiLCBpbiwgb3V0LCBva2ZuKTsKQEAgLTIzNiw3ICsyMzQsNyBAQAogCiAJLyogcm9vdCBpcyBwbGF5aW5nIHdpdGggcmF3IHNvY2tldHMuICovCiAJaWYgKCgqcHNrYiktPmxlbiA8IHNpemVvZihzdHJ1Y3QgaXBoZHIpIHx8Ci0JICAgICgqcHNrYiktPm5oLmlwaC0+aWhsICogNCA8IHNpemVvZihzdHJ1Y3QgaXBoZHIpKQorCSAgICBpcF9oZHJsZW4oKnBza2IpIDwgc2l6ZW9mKHN0cnVjdCBpcGhkcikpCiAJCXJldHVybiBORl9BQ0NFUFQ7CiAKIAlyZXQgPSBuZl9uYXRfZm4oaG9va251bSwgcHNrYiwgaW4sIG91dCwgb2tmbik7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9wcm9jLmMgYi9uZXQvaXB2NC9wcm9jLmMKaW5kZXggYWU2OGE2OS4uMzdhYjU4MCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvcHJvYy5jCisrKyBiL25ldC9pcHY0L3Byb2MuYwpAQCAtODcsMTkgKzg3LDYgQEAKIAkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAogfTsKIAotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWZvbGRfZmllbGQodm9pZCAqbWliW10sIGludCBvZmZ0KQotewotCXVuc2lnbmVkIGxvbmcgcmVzID0gMDsKLQlpbnQgaTsKLQotCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKSB7Ci0JCXJlcyArPSAqKCgodW5zaWduZWQgbG9uZyAqKSBwZXJfY3B1X3B0cihtaWJbMF0sIGkpKSArIG9mZnQpOwotCQlyZXMgKz0gKigoKHVuc2lnbmVkIGxvbmcgKikgcGVyX2NwdV9wdHIobWliWzFdLCBpKSkgKyBvZmZ0KTsKLQl9Ci0JcmV0dXJuIHJlczsKLX0KLQogLyogc25tcCBpdGVtcyAqLwogc3RhdGljIGNvbnN0IHN0cnVjdCBzbm1wX21pYiBzbm1wNF9pcHN0YXRzX2xpc3RbXSA9IHsKIAlTTk1QX01JQl9JVEVNKCJJblJlY2VpdmVzIiwgSVBTVEFUU19NSUJfSU5SRUNFSVZFUyksCkBAIC0yNjYsOCArMjUzLDggQEAKIAogCWZvciAoaSA9IDA7IHNubXA0X2lwc3RhdHNfbGlzdFtpXS5uYW1lICE9IE5VTEw7IGkrKykKIAkJc2VxX3ByaW50ZihzZXEsICIgJWx1IiwKLQkJCSAgIGZvbGRfZmllbGQoKHZvaWQgKiopIGlwX3N0YXRpc3RpY3MsCi0JCQkJICAgICAgc25tcDRfaXBzdGF0c19saXN0W2ldLmVudHJ5KSk7CisJCQkgICBzbm1wX2ZvbGRfZmllbGQoKHZvaWQgKiopaXBfc3RhdGlzdGljcywKKwkJCQkJICAgc25tcDRfaXBzdGF0c19saXN0W2ldLmVudHJ5KSk7CiAKIAlzZXFfcHV0cyhzZXEsICJcbkljbXA6Iik7CiAJZm9yIChpID0gMDsgc25tcDRfaWNtcF9saXN0W2ldLm5hbWUgIT0gTlVMTDsgaSsrKQpAQCAtMjc2LDggKzI2Myw4IEBACiAJc2VxX3B1dHMoc2VxLCAiXG5JY21wOiIpOwogCWZvciAoaSA9IDA7IHNubXA0X2ljbXBfbGlzdFtpXS5uYW1lICE9IE5VTEw7IGkrKykKIAkJc2VxX3ByaW50ZihzZXEsICIgJWx1IiwKLQkJCSAgIGZvbGRfZmllbGQoKHZvaWQgKiopIGljbXBfc3RhdGlzdGljcywKLQkJCQkgICAgICBzbm1wNF9pY21wX2xpc3RbaV0uZW50cnkpKTsKKwkJCSAgIHNubXBfZm9sZF9maWVsZCgodm9pZCAqKilpY21wX3N0YXRpc3RpY3MsCisJCQkJCSAgIHNubXA0X2ljbXBfbGlzdFtpXS5lbnRyeSkpOwogCiAJc2VxX3B1dHMoc2VxLCAiXG5UY3A6Iik7CiAJZm9yIChpID0gMDsgc25tcDRfdGNwX2xpc3RbaV0ubmFtZSAhPSBOVUxMOyBpKyspCkBAIC0yODgsMTIgKzI3NSwxMiBAQAogCQkvKiBNYXhDb25uIGZpZWxkIGlzIHNpZ25lZCwgUkZDIDIwMTIgKi8KIAkJaWYgKHNubXA0X3RjcF9saXN0W2ldLmVudHJ5ID09IFRDUF9NSUJfTUFYQ09OTikKIAkJCXNlcV9wcmludGYoc2VxLCAiICVsZCIsCi0JCQkJICAgZm9sZF9maWVsZCgodm9pZCAqKikgdGNwX3N0YXRpc3RpY3MsCi0JCQkJCSAgICAgIHNubXA0X3RjcF9saXN0W2ldLmVudHJ5KSk7CisJCQkJICAgc25tcF9mb2xkX2ZpZWxkKCh2b2lkICoqKXRjcF9zdGF0aXN0aWNzLAorCQkJCQkJICAgc25tcDRfdGNwX2xpc3RbaV0uZW50cnkpKTsKIAkJZWxzZQogCQkJc2VxX3ByaW50ZihzZXEsICIgJWx1IiwKLQkJCQkgICBmb2xkX2ZpZWxkKCh2b2lkICoqKSB0Y3Bfc3RhdGlzdGljcywKLQkJCQkJICAgICAgc25tcDRfdGNwX2xpc3RbaV0uZW50cnkpKTsKKwkJCQkgICBzbm1wX2ZvbGRfZmllbGQoKHZvaWQgKiopdGNwX3N0YXRpc3RpY3MsCisJCQkJCQkgICBzbm1wNF90Y3BfbGlzdFtpXS5lbnRyeSkpOwogCX0KIAogCXNlcV9wdXRzKHNlcSwgIlxuVWRwOiIpOwpAQCAtMzAzLDggKzI5MCw4IEBACiAJc2VxX3B1dHMoc2VxLCAiXG5VZHA6Iik7CiAJZm9yIChpID0gMDsgc25tcDRfdWRwX2xpc3RbaV0ubmFtZSAhPSBOVUxMOyBpKyspCiAJCXNlcV9wcmludGYoc2VxLCAiICVsdSIsCi0JCQkgICBmb2xkX2ZpZWxkKCh2b2lkICoqKSB1ZHBfc3RhdGlzdGljcywKLQkJCQkgICAgICBzbm1wNF91ZHBfbGlzdFtpXS5lbnRyeSkpOworCQkJICAgc25tcF9mb2xkX2ZpZWxkKCh2b2lkICoqKXVkcF9zdGF0aXN0aWNzLAorCQkJCQkgICBzbm1wNF91ZHBfbGlzdFtpXS5lbnRyeSkpOwogCiAJLyogdGhlIFVEUCBhbmQgVURQLUxpdGUgTUlCcyBhcmUgdGhlIHNhbWUgKi8KIAlzZXFfcHV0cyhzZXEsICJcblVkcExpdGU6Iik7CkBAIC0zMTQsOCArMzAxLDggQEAKIAlzZXFfcHV0cyhzZXEsICJcblVkcExpdGU6Iik7CiAJZm9yIChpID0gMDsgc25tcDRfdWRwX2xpc3RbaV0ubmFtZSAhPSBOVUxMOyBpKyspCiAJCXNlcV9wcmludGYoc2VxLCAiICVsdSIsCi0JCQkgICBmb2xkX2ZpZWxkKCh2b2lkICoqKSB1ZHBsaXRlX3N0YXRpc3RpY3MsCi0JCQkJICAgICAgc25tcDRfdWRwX2xpc3RbaV0uZW50cnkpICAgICApOworCQkJICAgc25tcF9mb2xkX2ZpZWxkKCh2b2lkICoqKXVkcGxpdGVfc3RhdGlzdGljcywKKwkJCQkJICAgc25tcDRfdWRwX2xpc3RbaV0uZW50cnkpKTsKIAogCXNlcV9wdXRjKHNlcSwgJ1xuJyk7CiAJcmV0dXJuIDA7CkBAIC0zNDgsOCArMzM1LDggQEAKIAlzZXFfcHV0cyhzZXEsICJcblRjcEV4dDoiKTsKIAlmb3IgKGkgPSAwOyBzbm1wNF9uZXRfbGlzdFtpXS5uYW1lICE9IE5VTEw7IGkrKykKIAkJc2VxX3ByaW50ZihzZXEsICIgJWx1IiwKLQkJCSAgIGZvbGRfZmllbGQoKHZvaWQgKiopIG5ldF9zdGF0aXN0aWNzLAotCQkJCSAgICAgIHNubXA0X25ldF9saXN0W2ldLmVudHJ5KSk7CisJCQkgICBzbm1wX2ZvbGRfZmllbGQoKHZvaWQgKiopbmV0X3N0YXRpc3RpY3MsCisJCQkJCSAgIHNubXA0X25ldF9saXN0W2ldLmVudHJ5KSk7CiAKIAlzZXFfcHV0YyhzZXEsICdcbicpOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvcHJvdG9jb2wuYyBiL25ldC9pcHY0L3Byb3RvY29sLmMKaW5kZXggZGE3MGZlZi4uOTcxYWI5MyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvcHJvdG9jb2wuYworKysgYi9uZXQvaXB2NC9wcm90b2NvbC5jCkBAIC00NSw3ICs0NSw3IEBACiAjaW5jbHVkZSA8bmV0L2lwaXAuaD4KICNpbmNsdWRlIDxsaW51eC9pZ21wLmg+CiAKLXN0cnVjdCBuZXRfcHJvdG9jb2wgKmluZXRfcHJvdG9zW01BWF9JTkVUX1BST1RPU107CitzdHJ1Y3QgbmV0X3Byb3RvY29sICppbmV0X3Byb3Rvc1tNQVhfSU5FVF9QUk9UT1NdIF9fX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXA7CiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGluZXRfcHJvdG9fbG9jayk7CiAKIC8qCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9yYXcuYyBiL25ldC9pcHY0L3Jhdy5jCmluZGV4IDg3ZTljMTYuLjI0ZDdjOWYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3Jhdy5jCisrKyBiL25ldC9pcHY0L3Jhdy5jCkBAIC0xMzIsNyArMTMyLDcgQEAKIAlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IGljbXBoZHIpKSkKIAkJcmV0dXJuIDE7CiAKLQl0eXBlID0gc2tiLT5oLmljbXBoLT50eXBlOworCXR5cGUgPSBpY21wX2hkcihza2IpLT50eXBlOwogCWlmICh0eXBlIDwgMzIpIHsKIAkJX191MzIgZGF0YSA9IHJhd19zayhzayktPmZpbHRlci5kYXRhOwogCkBAIC0xODQsOCArMTg0LDggQEAKIHZvaWQgcmF3X2VyciAoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgaW5mbykKIHsKIAlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0ID0gaW5ldF9zayhzayk7Ci0JaW50IHR5cGUgPSBza2ItPmguaWNtcGgtPnR5cGU7Ci0JaW50IGNvZGUgPSBza2ItPmguaWNtcGgtPmNvZGU7CisJY29uc3QgaW50IHR5cGUgPSBpY21wX2hkcihza2IpLT50eXBlOworCWNvbnN0IGludCBjb2RlID0gaWNtcF9oZHIoc2tiKS0+Y29kZTsKIAlpbnQgZXJyID0gMDsKIAlpbnQgaGFyZGVyciA9IDA7CiAKQEAgLTI1Niw3ICsyNTYsNyBAQAogCX0KIAluZl9yZXNldChza2IpOwogCi0Jc2tiX3B1c2goc2tiLCBza2ItPmRhdGEgLSBza2ItPm5oLnJhdyk7CisJc2tiX3B1c2goc2tiLCBza2ItPmRhdGEgLSBza2JfbmV0d29ya19oZWFkZXIoc2tiKSk7CiAKIAlyYXdfcmN2X3NrYihzaywgc2tiKTsKIAlyZXR1cm4gMDsKQEAgLTI5MSwxMSArMjkxLDEzIEBACiAJc2tiLT5wcmlvcml0eSA9IHNrLT5za19wcmlvcml0eTsKIAlza2ItPmRzdCA9IGRzdF9jbG9uZSgmcnQtPnUuZHN0KTsKIAotCXNrYi0+bmguaXBoID0gaXBoID0gKHN0cnVjdCBpcGhkciAqKXNrYl9wdXQoc2tiLCBsZW5ndGgpOworCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOworCWlwaCA9IGlwX2hkcihza2IpOworCXNrYl9wdXQoc2tiLCBsZW5ndGgpOwogCiAJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOwogCi0Jc2tiLT5oLnJhdyA9IHNrYi0+bmgucmF3OworCXNrYi0+dHJhbnNwb3J0X2hlYWRlciA9IHNrYi0+bmV0d29ya19oZWFkZXI7CiAJZXJyID0gbWVtY3B5X2Zyb21pb3ZlY2VuZCgodm9pZCAqKWlwaCwgZnJvbSwgMCwgbGVuZ3RoKTsKIAlpZiAoZXJyKQogCQlnb3RvIGVycm9yX2ZhdWx0OwpAQCAtNjEzLDcgKzYxNSw3IEBACiAJLyogQ29weSB0aGUgYWRkcmVzcy4gKi8KIAlpZiAoc2luKSB7CiAJCXNpbi0+c2luX2ZhbWlseSA9IEFGX0lORVQ7Ci0JCXNpbi0+c2luX2FkZHIuc19hZGRyID0gc2tiLT5uaC5pcGgtPnNhZGRyOworCQlzaW4tPnNpbl9hZGRyLnNfYWRkciA9IGlwX2hkcihza2IpLT5zYWRkcjsKIAkJc2luLT5zaW5fcG9ydCA9IDA7CiAJCW1lbXNldCgmc2luLT5zaW5femVybywgMCwgc2l6ZW9mKHNpbi0+c2luX3plcm8pKTsKIAl9CkBAIC04ODcsNyArODg5LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyByYXdfc2VxX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgcmF3X3NlcV9vcHMgPSB7CiAJLnN0YXJ0ID0gcmF3X3NlcV9zdGFydCwKIAkubmV4dCAgPSByYXdfc2VxX25leHQsCiAJLnN0b3AgID0gcmF3X3NlcV9zdG9wLApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvcm91dGUuYyBiL25ldC9pcHY0L3JvdXRlLmMKaW5kZXggMzdlMGQ0ZC4uY2I3NmUzYyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvcm91dGUuYworKysgYi9uZXQvaXB2NC9yb3V0ZS5jCkBAIC04Miw3ICs4Miw2IEBACiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLSNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KICNpbmNsdWRlIDxsaW51eC9pbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaWdtcC5oPgogI2luY2x1ZGUgPGxpbnV4L3BrdF9zY2hlZC5oPgpAQCAtMTA0LDYgKzEwMyw3IEBACiAjaW5jbHVkZSA8bmV0L3hmcm0uaD4KICNpbmNsdWRlIDxuZXQvaXBfbXBfYWxnLmg+CiAjaW5jbHVkZSA8bmV0L25ldGV2ZW50Lmg+CisjaW5jbHVkZSA8bmV0L3J0bmV0bGluay5oPgogI2lmZGVmIENPTkZJR19TWVNDVEwKICNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KICNlbmRpZgpAQCAtMzY0LDcgKzM2NCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgcnRfY2FjaGVfc2VxX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgcnRfY2FjaGVfc2VxX29wcyA9IHsKIAkuc3RhcnQgID0gcnRfY2FjaGVfc2VxX3N0YXJ0LAogCS5uZXh0ICAgPSBydF9jYWNoZV9zZXFfbmV4dCwKIAkuc3RvcCAgID0gcnRfY2FjaGVfc2VxX3N0b3AsCkBAIC00NzAsNyArNDcwLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBydF9jcHVfc2VxX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgcnRfY3B1X3NlcV9vcHMgPSB7CiAJLnN0YXJ0ICA9IHJ0X2NwdV9zZXFfc3RhcnQsCiAJLm5leHQgICA9IHJ0X2NwdV9zZXFfbmV4dCwKIAkuc3RvcCAgID0gcnRfY3B1X3NlcV9zdG9wLApAQCAtMTUxOSw3ICsxNTE5LDcgQEAKIHN0YXRpYyBpbnQgaXBfcnRfYnVnKHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJcHJpbnRrKEtFUk5fREVCVUcgImlwX3J0X2J1ZzogJXUuJXUuJXUuJXUgLT4gJXUuJXUuJXUuJXUsICVzXG4iLAotCQlOSVBRVUFEKHNrYi0+bmguaXBoLT5zYWRkciksIE5JUFFVQUQoc2tiLT5uaC5pcGgtPmRhZGRyKSwKKwkJTklQUVVBRChpcF9oZHIoc2tiKS0+c2FkZHIpLCBOSVBRVUFEKGlwX2hkcihza2IpLT5kYWRkciksCiAJCXNrYi0+ZGV2ID8gc2tiLT5kZXYtPm5hbWUgOiAiPyIpOwogCWtmcmVlX3NrYihza2IpOwogCXJldHVybiAwOwpAQCAtMTY5OCw5ICsxNjk4LDkgQEAKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAibWFydGlhbiBzb3VyY2UgJXUuJXUuJXUuJXUgZnJvbSAiCiAJCQkiJXUuJXUuJXUuJXUsIG9uIGRldiAlc1xuIiwKIAkJCU5JUFFVQUQoZGFkZHIpLCBOSVBRVUFEKHNhZGRyKSwgZGV2LT5uYW1lKTsKLQkJaWYgKGRldi0+aGFyZF9oZWFkZXJfbGVuICYmIHNrYi0+bWFjLnJhdykgeworCQlpZiAoZGV2LT5oYXJkX2hlYWRlcl9sZW4gJiYgc2tiX21hY19oZWFkZXJfd2FzX3NldChza2IpKSB7CiAJCQlpbnQgaTsKLQkJCXVuc2lnbmVkIGNoYXIgKnAgPSBza2ItPm1hYy5yYXc7CisJCQljb25zdCB1bnNpZ25lZCBjaGFyICpwID0gc2tiX21hY19oZWFkZXIoc2tiKTsKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgImxsIGhlYWRlcjogIik7CiAJCQlmb3IgKGkgPSAwOyBpIDwgZGV2LT5oYXJkX2hlYWRlcl9sZW47IGkrKywgcCsrKSB7CiAJCQkJcHJpbnRrKCIlMDJ4IiwgKnApOwpAQCAtMjEzNCw3ICsyMTM0LDcgQEAKIAkJcmN1X3JlYWRfbG9jaygpOwogCQlpZiAoKGluX2RldiA9IF9faW5fZGV2X2dldF9yY3UoZGV2KSkgIT0gTlVMTCkgewogCQkJaW50IG91ciA9IGlwX2NoZWNrX21jKGluX2RldiwgZGFkZHIsIHNhZGRyLAotCQkJCXNrYi0+bmguaXBoLT5wcm90b2NvbCk7CisJCQkJaXBfaGRyKHNrYiktPnByb3RvY29sKTsKIAkJCWlmIChvdXIKICNpZmRlZiBDT05GSUdfSVBfTVJPVVRFCiAJCQkgICAgfHwgKCFMT0NBTF9NQ0FTVChkYWRkcikgJiYgSU5fREVWX01GT1JXQVJEKGluX2RldikpCkBAIC0yMzk2LDcgKzIzOTYsNyBAQAogCiAJCS8qIEl0IGlzIGVxdWl2YWxlbnQgdG8gaW5ldF9hZGRyX3R5cGUoc2FkZHIpID09IFJUTl9MT0NBTCAqLwogCQlkZXZfb3V0ID0gaXBfZGV2X2ZpbmQob2xkZmxwLT5mbDRfc3JjKTsKLQkJaWYgKGRldl9vdXQgPT0gTlVMTCkKKwkJaWYgKChkZXZfb3V0ID09IE5VTEwpICYmICEoc3lzY3RsX2lwX25vbmxvY2FsX2JpbmQpKQogCQkJZ290byBvdXQ7CiAKIAkJLyogSSByZW1vdmVkIGNoZWNrIGZvciBvaWYgPT0gZGV2X291dC0+b2lmIGhlcmUuCkBAIC0yNDA3LDcgKzI0MDcsNyBAQAogCQkgICAgICBvZiBhbm90aGVyIGlmYWNlLiAtLUFOSwogCQkgKi8KIAotCQlpZiAob2xkZmxwLT5vaWYgPT0gMAorCQlpZiAoZGV2X291dCAmJiBvbGRmbHAtPm9pZiA9PSAwCiAJCSAgICAmJiAoTVVMVElDQVNUKG9sZGZscC0+Zmw0X2RzdCkgfHwgb2xkZmxwLT5mbDRfZHN0ID09IGh0b25sKDB4RkZGRkZGRkYpKSkgewogCQkJLyogU3BlY2lhbCBoYWNrOiB1c2VyIGNhbiBkaXJlY3QgbXVsdGljYXN0cwogCQkJICAgYW5kIGxpbWl0ZWQgYnJvYWRjYXN0IHZpYSBuZWNlc3NhcnkgaW50ZXJmYWNlCkBAIC0yNjgzLDcgKzI2ODMsNyBAQAogCQlpZCA9IHJ0LT5wZWVyLT5pcF9pZF9jb3VudDsKIAkJaWYgKHJ0LT5wZWVyLT50Y3BfdHNfc3RhbXApIHsKIAkJCXRzID0gcnQtPnBlZXItPnRjcF90czsKLQkJCXRzYWdlID0geHRpbWUudHZfc2VjIC0gcnQtPnBlZXItPnRjcF90c19zdGFtcDsKKwkJCXRzYWdlID0gZ2V0X3NlY29uZHMoKSAtIHJ0LT5wZWVyLT50Y3BfdHNfc3RhbXA7CiAJCX0KIAl9CiAKQEAgLTI3MjEsNyArMjcyMSw3IEBACiAJcmV0dXJuIC1FTVNHU0laRTsKIH0KIAotaW50IGluZXRfcnRtX2dldHJvdXRlKHN0cnVjdCBza19idWZmICppbl9za2IsIHN0cnVjdCBubG1zZ2hkciogbmxoLCB2b2lkICphcmcpCitzdGF0aWMgaW50IGluZXRfcnRtX2dldHJvdXRlKHN0cnVjdCBza19idWZmICppbl9za2IsIHN0cnVjdCBubG1zZ2hkciogbmxoLCB2b2lkICphcmcpCiB7CiAJc3RydWN0IHJ0bXNnICpydG07CiAJc3RydWN0IG5sYXR0ciAqdGJbUlRBX01BWCsxXTsKQEAgLTI3NDcsMTAgKzI3NDcsMTEgQEAKIAkvKiBSZXNlcnZlIHJvb20gZm9yIGR1bW15IGhlYWRlcnMsIHRoaXMgc2tiIGNhbiBwYXNzCiAJICAgdGhyb3VnaCBnb29kIGNodW5rIG9mIHJvdXRpbmcgZW5naW5lLgogCSAqLwotCXNrYi0+bWFjLnJhdyA9IHNrYi0+bmgucmF3ID0gc2tiLT5kYXRhOworCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CisJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CiAKIAkvKiBCdWdmaXg6IG5lZWQgdG8gZ2l2ZSBpcF9yb3V0ZV9pbnB1dCBlbm91Z2ggb2YgYW4gSVAgaGVhZGVyIHRvIG5vdCBnYWcuICovCi0Jc2tiLT5uaC5pcGgtPnByb3RvY29sID0gSVBQUk9UT19JQ01QOworCWlwX2hkcihza2IpLT5wcm90b2NvbCA9IElQUFJPVE9fSUNNUDsKIAlza2JfcmVzZXJ2ZShza2IsIE1BWF9IRUFERVIgKyBzaXplb2Yoc3RydWN0IGlwaGRyKSk7CiAKIAlzcmMgPSB0YltSVEFfU1JDXSA/IG5sYV9nZXRfYmUzMih0YltSVEFfU1JDXSkgOiAwOwpAQCAtMzE5Myw2ICszMTk0LDggQEAKIAl4ZnJtX2luaXQoKTsKIAl4ZnJtNF9pbml0KCk7CiAjZW5kaWYKKwlydG5sX3JlZ2lzdGVyKFBGX0lORVQsIFJUTV9HRVRST1VURSwgaW5ldF9ydG1fZ2V0cm91dGUsIE5VTEwpOworCiAJcmV0dXJuIHJjOwogfQogCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9zeW5jb29raWVzLmMgYi9uZXQvaXB2NC9zeW5jb29raWVzLmMKaW5kZXggMzMwMTZjYy4uMmRhMWJlMCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvc3luY29va2llcy5jCisrKyBiL25ldC9pcHY0L3N5bmNvb2tpZXMuYwpAQCAtMTI1LDEwICsxMjUsMTEgQEAKIF9fdTMyIGNvb2tpZV92NF9pbml0X3NlcXVlbmNlKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwgX191MTYgKm1zc3ApCiB7CiAJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisJY29uc3Qgc3RydWN0IGlwaGRyICppcGggPSBpcF9oZHIoc2tiKTsKKwljb25zdCBzdHJ1Y3QgdGNwaGRyICp0aCA9IHRjcF9oZHIoc2tiKTsKIAlpbnQgbXNzaW5kOwogCWNvbnN0IF9fdTE2IG1zcyA9ICptc3NwOwogCi0KIAl0cC0+bGFzdF9zeW5xX292ZXJmbG93ID0gamlmZmllczsKIAogCS8qIFhYWCBzb3J0IG1zc3RhYltdIGJ5IHByb2JhYmlsaXR5PyAgQmluYXJ5IHNlYXJjaD8gKi8KQEAgLTEzOCw5ICsxMzksOCBAQAogCiAJTkVUX0lOQ19TVEFUU19CSChMSU5VWF9NSUJfU1lOQ09PS0lFU1NFTlQpOwogCi0JcmV0dXJuIHNlY3VyZV90Y3Bfc3luX2Nvb2tpZShza2ItPm5oLmlwaC0+c2FkZHIsIHNrYi0+bmguaXBoLT5kYWRkciwKLQkJCQkgICAgIHNrYi0+aC50aC0+c291cmNlLCBza2ItPmgudGgtPmRlc3QsCi0JCQkJICAgICBudG9obChza2ItPmgudGgtPnNlcSksCisJcmV0dXJuIHNlY3VyZV90Y3Bfc3luX2Nvb2tpZShpcGgtPnNhZGRyLCBpcGgtPmRhZGRyLAorCQkJCSAgICAgdGgtPnNvdXJjZSwgdGgtPmRlc3QsIG50b2hsKHRoLT5zZXEpLAogCQkJCSAgICAgamlmZmllcyAvIChIWiAqIDYwKSwgbXNzaW5kKTsKIH0KIApAQCAtMTU3LDE0ICsxNTcsMTMgQEAKICAqLwogc3RhdGljIGlubGluZSBpbnQgY29va2llX2NoZWNrKHN0cnVjdCBza19idWZmICpza2IsIF9fdTMyIGNvb2tpZSkKIHsKLQlfX3UzMiBzZXE7Ci0JX191MzIgbXNzaW5kOwotCi0Jc2VxID0gbnRvaGwoc2tiLT5oLnRoLT5zZXEpLTE7Ci0JbXNzaW5kID0gY2hlY2tfdGNwX3N5bl9jb29raWUoY29va2llLAotCQkJCSAgICAgIHNrYi0+bmguaXBoLT5zYWRkciwgc2tiLT5uaC5pcGgtPmRhZGRyLAotCQkJCSAgICAgIHNrYi0+aC50aC0+c291cmNlLCBza2ItPmgudGgtPmRlc3QsCi0JCQkJICAgICAgc2VxLCBqaWZmaWVzIC8gKEhaICogNjApLCBDT1VOVEVSX1RSSUVTKTsKKwljb25zdCBzdHJ1Y3QgaXBoZHIgKmlwaCA9IGlwX2hkcihza2IpOworCWNvbnN0IHN0cnVjdCB0Y3BoZHIgKnRoID0gdGNwX2hkcihza2IpOworCV9fdTMyIHNlcSA9IG50b2hsKHRoLT5zZXEpIC0gMTsKKwlfX3UzMiBtc3NpbmQgPSBjaGVja190Y3Bfc3luX2Nvb2tpZShjb29raWUsIGlwaC0+c2FkZHIsIGlwaC0+ZGFkZHIsCisJCQkJCSAgICB0aC0+c291cmNlLCB0aC0+ZGVzdCwgc2VxLAorCQkJCQkgICAgamlmZmllcyAvIChIWiAqIDYwKSwKKwkJCQkJICAgIENPVU5URVJfVFJJRVMpOwogCiAJcmV0dXJuIG1zc2luZCA8IE5VTV9NU1MgPyBtc3N0YWJbbXNzaW5kXSArIDEgOiAwOwogfQpAQCAtMTkxLDE0ICsxOTAsMTUgQEAKIAlzdHJ1Y3QgaW5ldF9yZXF1ZXN0X3NvY2sgKmlyZXE7CiAJc3RydWN0IHRjcF9yZXF1ZXN0X3NvY2sgKnRyZXE7CiAJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7Ci0JX191MzIgY29va2llID0gbnRvaGwoc2tiLT5oLnRoLT5hY2tfc2VxKSAtIDE7CisJY29uc3Qgc3RydWN0IHRjcGhkciAqdGggPSB0Y3BfaGRyKHNrYik7CisJX191MzIgY29va2llID0gbnRvaGwodGgtPmFja19zZXEpIC0gMTsKIAlzdHJ1Y3Qgc29jayAqcmV0ID0gc2s7CiAJc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxOwogCWludCBtc3M7CiAJc3RydWN0IHJ0YWJsZSAqcnQ7CiAJX191OCByY3Zfd3NjYWxlOwogCi0JaWYgKCFzeXNjdGxfdGNwX3N5bmNvb2tpZXMgfHwgIXNrYi0+aC50aC0+YWNrKQorCWlmICghc3lzY3RsX3RjcF9zeW5jb29raWVzIHx8ICF0aC0+YWNrKQogCQlnb3RvIG91dDsKIAogCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRwLT5sYXN0X3N5bnFfb3ZlcmZsb3cgKyBUQ1BfVElNRU9VVF9JTklUKSB8fApAQCAtMjIwLDEyICsyMjAsMTIgQEAKIAl9CiAJaXJlcSA9IGluZXRfcnNrKHJlcSk7CiAJdHJlcSA9IHRjcF9yc2socmVxKTsKLQl0cmVxLT5yY3ZfaXNuCQk9IG50b2hsKHNrYi0+aC50aC0+c2VxKSAtIDE7CisJdHJlcS0+cmN2X2lzbgkJPSBudG9obCh0aC0+c2VxKSAtIDE7CiAJdHJlcS0+c250X2lzbgkJPSBjb29raWU7CiAJcmVxLT5tc3MJCT0gbXNzOwotCWlyZXEtPnJtdF9wb3J0CQk9IHNrYi0+aC50aC0+c291cmNlOwotCWlyZXEtPmxvY19hZGRyCQk9IHNrYi0+bmguaXBoLT5kYWRkcjsKLQlpcmVxLT5ybXRfYWRkcgkJPSBza2ItPm5oLmlwaC0+c2FkZHI7CisJaXJlcS0+cm10X3BvcnQJCT0gdGgtPnNvdXJjZTsKKwlpcmVxLT5sb2NfYWRkcgkJPSBpcF9oZHIoc2tiKS0+ZGFkZHI7CisJaXJlcS0+cm10X2FkZHIJCT0gaXBfaGRyKHNrYiktPnNhZGRyOwogCWlyZXEtPm9wdAkJPSBOVUxMOwogCiAJLyogV2UgdGhyb3dlZCB0aGUgb3B0aW9ucyBvZiB0aGUgaW5pdGlhbCBTWU4gYXdheSwgc28gd2UgaG9wZQpAQCAtMjYxLDggKzI2MSw4IEBACiAJCQkJCQkudG9zID0gUlRfQ09OTl9GTEFHUyhzaykgfSB9LAogCQkJCSAgICAucHJvdG8gPSBJUFBST1RPX1RDUCwKIAkJCQkgICAgLnVsaV91ID0geyAucG9ydHMgPQotCQkJCQkgICAgICAgeyAuc3BvcnQgPSBza2ItPmgudGgtPmRlc3QsCi0JCQkJCQkgLmRwb3J0ID0gc2tiLT5oLnRoLT5zb3VyY2UgfSB9IH07CisJCQkJCSAgICAgICB7IC5zcG9ydCA9IHRoLT5kZXN0LAorCQkJCQkJIC5kcG9ydCA9IHRoLT5zb3VyY2UgfSB9IH07CiAJCXNlY3VyaXR5X3JlcV9jbGFzc2lmeV9mbG93KHJlcSwgJmZsKTsKIAkJaWYgKGlwX3JvdXRlX291dHB1dF9rZXkoJnJ0LCAmZmwpKSB7CiAJCQlyZXFza19mcmVlKHJlcSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9zeXNjdGxfbmV0X2lwdjQuYyBiL25ldC9pcHY0L3N5c2N0bF9uZXRfaXB2NC5jCmluZGV4IDBhYTMwNDcuLjY4MTdkNjQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3N5c2N0bF9uZXRfaXB2NC5jCisrKyBiL25ldC9pcHY0L3N5c2N0bF9uZXRfaXB2NC5jCkBAIC02NDcsNiArNjQ3LDE0IEBACiAJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYwogCX0sCiAJeworCQkuY3RsX25hbWUJPSBORVRfVENQX0ZSVE9fUkVTUE9OU0UsCisJCS5wcm9jbmFtZQk9ICJ0Y3BfZnJ0b19yZXNwb25zZSIsCisJCS5kYXRhCQk9ICZzeXNjdGxfdGNwX2ZydG9fcmVzcG9uc2UsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYworCX0sCisJewogCQkuY3RsX25hbWUJPSBORVRfVENQX0xPV19MQVRFTkNZLAogCQkucHJvY25hbWUJPSAidGNwX2xvd19sYXRlbmN5IiwKIAkJLmRhdGEJCT0gJnN5c2N0bF90Y3BfbG93X2xhdGVuY3ksCkBAIC04MDMsNiArODExLDE0IEBACiAJCS5wcm9jX2hhbmRsZXIgICA9ICZwcm9jX2FsbG93ZWRfY29uZ2VzdGlvbl9jb250cm9sLAogCQkuc3RyYXRlZ3kJPSAmc3RyYXRlZ3lfYWxsb3dlZF9jb25nZXN0aW9uX2NvbnRyb2wsCiAJfSwKKwl7CisJCS5jdGxfbmFtZQk9IE5FVF9UQ1BfTUFYX1NTVEhSRVNILAorCQkucHJvY25hbWUJPSAidGNwX21heF9zc3RocmVzaCIsCisJCS5kYXRhCQk9ICZzeXNjdGxfdGNwX21heF9zc3RocmVzaCwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjLAorCX0sCiAJeyAuY3RsX25hbWUgPSAwIH0KIH07CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3RjcC5jIGIvbmV0L2lwdjQvdGNwLmMKaW5kZXggMzgzNGIxMC4uZDZlNDg4NiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwLmMKKysrIGIvbmV0L2lwdjQvdGNwLmMKQEAgLTI5Nyw3ICsyOTcsNyBAQAogICogQWxsIHRoZSBza19zdHJlYW1fbWVtX3NjaGVkdWxlKCkgaXMgb2YgdGhpcyBuYXR1cmU6IGFjY291bnRpbmcKICAqIGlzIHN0cmljdCwgYWN0aW9ucyBhcmUgYWR2aXNvcnkgYW5kIGhhdmUgc29tZSBsYXRlbmN5LgogICovCi1pbnQgdGNwX21lbW9yeV9wcmVzc3VyZTsKK2ludCB0Y3BfbWVtb3J5X3ByZXNzdXJlIF9fcmVhZF9tb3N0bHk7CiAKIEVYUE9SVF9TWU1CT0wodGNwX21lbW9yeV9wcmVzc3VyZSk7CiAKQEAgLTQyNSw3ICs0MjUsNyBAQAogCQkJLyogU3VidHJhY3QgMSwgaWYgRklOIGlzIGluIHF1ZXVlLiAqLwogCQkJaWYgKGFuc3cgJiYgIXNrYl9xdWV1ZV9lbXB0eSgmc2stPnNrX3JlY2VpdmVfcXVldWUpKQogCQkJCWFuc3cgLT0KLQkJICAgICAgICgoc3RydWN0IHNrX2J1ZmYgKilzay0+c2tfcmVjZWl2ZV9xdWV1ZS5wcmV2KS0+aC50aC0+ZmluOworCQkgICAgICAgdGNwX2hkcigoc3RydWN0IHNrX2J1ZmYgKilzay0+c2tfcmVjZWl2ZV9xdWV1ZS5wcmV2KS0+ZmluOwogCQl9IGVsc2UKIAkJCWFuc3cgPSB0cC0+dXJnX3NlcSAtIHRwLT5jb3BpZWRfc2VxOwogCQlyZWxlYXNlX3NvY2soc2spOwpAQCAtNDQ0LDcgKzQ0NCw3IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRU5PSU9DVExDTUQ7Ci0JfTsKKwl9CiAKIAlyZXR1cm4gcHV0X3VzZXIoYW5zdywgKGludCBfX3VzZXIgKilhcmcpOwogfQpAQCAtNDYwLDkgKzQ2MCw5IEBACiAJcmV0dXJuIGFmdGVyKHRwLT53cml0ZV9zZXEsIHRwLT5wdXNoZWRfc2VxICsgKHRwLT5tYXhfd2luZG93ID4+IDEpKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHNrYl9lbnRhaWwoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgdGNwX3NvY2sgKnRwLAotCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3N0YXRpYyBpbmxpbmUgdm9pZCBza2JfZW50YWlsKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKKwlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKIAlzdHJ1Y3QgdGNwX3NrYl9jYiAqdGNiID0gVENQX1NLQl9DQihza2IpOwogCiAJc2tiLT5jc3VtICAgID0gMDsKQEAgLTQ3MCwxMCArNDcwLDggQEAKIAl0Y2ItPmZsYWdzICAgPSBUQ1BDQl9GTEFHX0FDSzsKIAl0Y2ItPnNhY2tlZCAgPSAwOwogCXNrYl9oZWFkZXJfcmVsZWFzZShza2IpOwotCV9fc2tiX3F1ZXVlX3RhaWwoJnNrLT5za193cml0ZV9xdWV1ZSwgc2tiKTsKKwl0Y3BfYWRkX3dyaXRlX3F1ZXVlX3RhaWwoc2ssIHNrYik7CiAJc2tfY2hhcmdlX3NrYihzaywgc2tiKTsKLQlpZiAoIXNrLT5za19zZW5kX2hlYWQpCi0JCXNrLT5za19zZW5kX2hlYWQgPSBza2I7CiAJaWYgKHRwLT5ub25hZ2xlICYgVENQX05BR0xFX1BVU0gpCiAJCXRwLT5ub25hZ2xlICY9IH5UQ1BfTkFHTEVfUFVTSDsKIH0KQEAgLTQ4OCwxNSArNDg2LDE3IEBACiAJfQogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgdGNwX3B1c2goc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgdGNwX3NvY2sgKnRwLCBpbnQgZmxhZ3MsCi0JCQkgICAgaW50IG1zc19ub3csIGludCBub25hZ2xlKQorc3RhdGljIGlubGluZSB2b2lkIHRjcF9wdXNoKHN0cnVjdCBzb2NrICpzaywgaW50IGZsYWdzLCBpbnQgbXNzX25vdywKKwkJCSAgICBpbnQgbm9uYWdsZSkKIHsKLQlpZiAoc2stPnNrX3NlbmRfaGVhZCkgewotCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gc2stPnNrX3dyaXRlX3F1ZXVlLnByZXY7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisKKwlpZiAodGNwX3NlbmRfaGVhZChzaykpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHRjcF93cml0ZV9xdWV1ZV90YWlsKHNrKTsKIAkJaWYgKCEoZmxhZ3MgJiBNU0dfTU9SRSkgfHwgZm9yY2VkX3B1c2godHApKQogCQkJdGNwX21hcmtfcHVzaCh0cCwgc2tiKTsKIAkJdGNwX21hcmtfdXJnKHRwLCBmbGFncywgc2tiKTsKLQkJX190Y3BfcHVzaF9wZW5kaW5nX2ZyYW1lcyhzaywgdHAsIG1zc19ub3csCisJCV9fdGNwX3B1c2hfcGVuZGluZ19mcmFtZXMoc2ssIG1zc19ub3csCiAJCQkJCSAgKGZsYWdzICYgTVNHX01PUkUpID8gVENQX05BR0xFX0NPUksgOiBub25hZ2xlKTsKIAl9CiB9CkBAIC01MjYsMTMgKzUyNiwxMyBAQAogCQlnb3RvIGRvX2Vycm9yOwogCiAJd2hpbGUgKHBzaXplID4gMCkgewotCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gc2stPnNrX3dyaXRlX3F1ZXVlLnByZXY7CisJCXN0cnVjdCBza19idWZmICpza2IgPSB0Y3Bfd3JpdGVfcXVldWVfdGFpbChzayk7CiAJCXN0cnVjdCBwYWdlICpwYWdlID0gcGFnZXNbcG9mZnNldCAvIFBBR0VfU0laRV07CiAJCWludCBjb3B5LCBpLCBjYW5fY29hbGVzY2U7CiAJCWludCBvZmZzZXQgPSBwb2Zmc2V0ICUgUEFHRV9TSVpFOwogCQlpbnQgc2l6ZSA9IG1pbl90KHNpemVfdCwgcHNpemUsIFBBR0VfU0laRSAtIG9mZnNldCk7CiAKLQkJaWYgKCFzay0+c2tfc2VuZF9oZWFkIHx8IChjb3B5ID0gc2l6ZV9nb2FsIC0gc2tiLT5sZW4pIDw9IDApIHsKKwkJaWYgKCF0Y3Bfc2VuZF9oZWFkKHNrKSB8fCAoY29weSA9IHNpemVfZ29hbCAtIHNrYi0+bGVuKSA8PSAwKSB7CiBuZXdfc2VnbWVudDoKIAkJCWlmICghc2tfc3RyZWFtX21lbW9yeV9mcmVlKHNrKSkKIAkJCQlnb3RvIHdhaXRfZm9yX3NuZGJ1ZjsKQEAgLTU0Miw3ICs1NDIsNyBAQAogCQkJaWYgKCFza2IpCiAJCQkJZ290byB3YWl0X2Zvcl9tZW1vcnk7CiAKLQkJCXNrYl9lbnRhaWwoc2ssIHRwLCBza2IpOworCQkJc2tiX2VudGFpbChzaywgc2tiKTsKIAkJCWNvcHkgPSBzaXplX2dvYWw7CiAJCX0KIApAQCAtNTg4LDggKzU4OCw4IEBACiAKIAkJaWYgKGZvcmNlZF9wdXNoKHRwKSkgewogCQkJdGNwX21hcmtfcHVzaCh0cCwgc2tiKTsKLQkJCV9fdGNwX3B1c2hfcGVuZGluZ19mcmFtZXMoc2ssIHRwLCBtc3Nfbm93LCBUQ1BfTkFHTEVfUFVTSCk7Ci0JCX0gZWxzZSBpZiAoc2tiID09IHNrLT5za19zZW5kX2hlYWQpCisJCQlfX3RjcF9wdXNoX3BlbmRpbmdfZnJhbWVzKHNrLCBtc3Nfbm93LCBUQ1BfTkFHTEVfUFVTSCk7CisJCX0gZWxzZSBpZiAoc2tiID09IHRjcF9zZW5kX2hlYWQoc2spKQogCQkJdGNwX3B1c2hfb25lKHNrLCBtc3Nfbm93KTsKIAkJY29udGludWU7CiAKQEAgLTU5Nyw3ICs1OTcsNyBAQAogCQlzZXRfYml0KFNPQ0tfTk9TUEFDRSwgJnNrLT5za19zb2NrZXQtPmZsYWdzKTsKIHdhaXRfZm9yX21lbW9yeToKIAkJaWYgKGNvcGllZCkKLQkJCXRjcF9wdXNoKHNrLCB0cCwgZmxhZ3MgJiB+TVNHX01PUkUsIG1zc19ub3csIFRDUF9OQUdMRV9QVVNIKTsKKwkJCXRjcF9wdXNoKHNrLCBmbGFncyAmIH5NU0dfTU9SRSwgbXNzX25vdywgVENQX05BR0xFX1BVU0gpOwogCiAJCWlmICgoZXJyID0gc2tfc3RyZWFtX3dhaXRfbWVtb3J5KHNrLCAmdGltZW8pKSAhPSAwKQogCQkJZ290byBkb19lcnJvcjsKQEAgLTYwOCw3ICs2MDgsNyBAQAogCiBvdXQ6CiAJaWYgKGNvcGllZCkKLQkJdGNwX3B1c2goc2ssIHRwLCBmbGFncywgbXNzX25vdywgdHAtPm5vbmFnbGUpOworCQl0Y3BfcHVzaChzaywgZmxhZ3MsIG1zc19ub3csIHRwLT5ub25hZ2xlKTsKIAlyZXR1cm4gY29waWVkOwogCiBkb19lcnJvcjoKQEAgLTYzOSw4ICs2MzksOSBAQAogI2RlZmluZSBUQ1BfUEFHRShzaykJKHNrLT5za19zbmRtc2dfcGFnZSkKICNkZWZpbmUgVENQX09GRihzaykJKHNrLT5za19zbmRtc2dfb2ZmKQogCi1zdGF0aWMgaW5saW5lIGludCBzZWxlY3Rfc2l6ZShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCB0Y3Bfc29jayAqdHApCitzdGF0aWMgaW5saW5lIGludCBzZWxlY3Rfc2l6ZShzdHJ1Y3Qgc29jayAqc2spCiB7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CiAJaW50IHRtcCA9IHRwLT5tc3NfY2FjaGU7CiAKIAlpZiAoc2stPnNrX3JvdXRlX2NhcHMgJiBORVRJRl9GX1NHKSB7CkBAIC03MDQsOSArNzA1LDkgQEAKIAkJd2hpbGUgKHNlZ2xlbiA+IDApIHsKIAkJCWludCBjb3B5OwogCi0JCQlza2IgPSBzay0+c2tfd3JpdGVfcXVldWUucHJldjsKKwkJCXNrYiA9IHRjcF93cml0ZV9xdWV1ZV90YWlsKHNrKTsKIAotCQkJaWYgKCFzay0+c2tfc2VuZF9oZWFkIHx8CisJCQlpZiAoIXRjcF9zZW5kX2hlYWQoc2spIHx8CiAJCQkgICAgKGNvcHkgPSBzaXplX2dvYWwgLSBza2ItPmxlbikgPD0gMCkgewogCiBuZXdfc2VnbWVudDoKQEAgLTcxNiw3ICs3MTcsNyBAQAogCQkJCWlmICghc2tfc3RyZWFtX21lbW9yeV9mcmVlKHNrKSkKIAkJCQkJZ290byB3YWl0X2Zvcl9zbmRidWY7CiAKLQkJCQlza2IgPSBza19zdHJlYW1fYWxsb2NfcHNrYihzaywgc2VsZWN0X3NpemUoc2ssIHRwKSwKKwkJCQlza2IgPSBza19zdHJlYW1fYWxsb2NfcHNrYihzaywgc2VsZWN0X3NpemUoc2spLAogCQkJCQkJCSAgIDAsIHNrLT5za19hbGxvY2F0aW9uKTsKIAkJCQlpZiAoIXNrYikKIAkJCQkJZ290byB3YWl0X2Zvcl9tZW1vcnk7CkBAIC03MjcsNyArNzI4LDcgQEAKIAkJCQlpZiAoc2stPnNrX3JvdXRlX2NhcHMgJiBORVRJRl9GX0FMTF9DU1VNKQogCQkJCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1BBUlRJQUw7CiAKLQkJCQlza2JfZW50YWlsKHNrLCB0cCwgc2tiKTsKKwkJCQlza2JfZW50YWlsKHNrLCBza2IpOwogCQkJCWNvcHkgPSBzaXplX2dvYWw7CiAJCQl9CiAKQEAgLTgzMiw4ICs4MzMsOCBAQAogCiAJCQlpZiAoZm9yY2VkX3B1c2godHApKSB7CiAJCQkJdGNwX21hcmtfcHVzaCh0cCwgc2tiKTsKLQkJCQlfX3RjcF9wdXNoX3BlbmRpbmdfZnJhbWVzKHNrLCB0cCwgbXNzX25vdywgVENQX05BR0xFX1BVU0gpOwotCQkJfSBlbHNlIGlmIChza2IgPT0gc2stPnNrX3NlbmRfaGVhZCkKKwkJCQlfX3RjcF9wdXNoX3BlbmRpbmdfZnJhbWVzKHNrLCBtc3Nfbm93LCBUQ1BfTkFHTEVfUFVTSCk7CisJCQl9IGVsc2UgaWYgKHNrYiA9PSB0Y3Bfc2VuZF9oZWFkKHNrKSkKIAkJCQl0Y3BfcHVzaF9vbmUoc2ssIG1zc19ub3cpOwogCQkJY29udGludWU7CiAKQEAgLTg0MSw3ICs4NDIsNyBAQAogCQkJc2V0X2JpdChTT0NLX05PU1BBQ0UsICZzay0+c2tfc29ja2V0LT5mbGFncyk7CiB3YWl0X2Zvcl9tZW1vcnk6CiAJCQlpZiAoY29waWVkKQotCQkJCXRjcF9wdXNoKHNrLCB0cCwgZmxhZ3MgJiB+TVNHX01PUkUsIG1zc19ub3csIFRDUF9OQUdMRV9QVVNIKTsKKwkJCQl0Y3BfcHVzaChzaywgZmxhZ3MgJiB+TVNHX01PUkUsIG1zc19ub3csIFRDUF9OQUdMRV9QVVNIKTsKIAogCQkJaWYgKChlcnIgPSBza19zdHJlYW1fd2FpdF9tZW1vcnkoc2ssICZ0aW1lbykpICE9IDApCiAJCQkJZ290byBkb19lcnJvcjsKQEAgLTg1MywxNiArODU0LDE4IEBACiAKIG91dDoKIAlpZiAoY29waWVkKQotCQl0Y3BfcHVzaChzaywgdHAsIGZsYWdzLCBtc3Nfbm93LCB0cC0+bm9uYWdsZSk7CisJCXRjcF9wdXNoKHNrLCBmbGFncywgbXNzX25vdywgdHAtPm5vbmFnbGUpOwogCVRDUF9DSEVDS19USU1FUihzayk7CiAJcmVsZWFzZV9zb2NrKHNrKTsKIAlyZXR1cm4gY29waWVkOwogCiBkb19mYXVsdDoKIAlpZiAoIXNrYi0+bGVuKSB7Ci0JCWlmIChzay0+c2tfc2VuZF9oZWFkID09IHNrYikKLQkJCXNrLT5za19zZW5kX2hlYWQgPSBOVUxMOwotCQlfX3NrYl91bmxpbmsoc2tiLCAmc2stPnNrX3dyaXRlX3F1ZXVlKTsKKwkJdGNwX3VubGlua193cml0ZV9xdWV1ZShza2IsIHNrKTsKKwkJLyogSXQgaXMgdGhlIG9uZSBwbGFjZSBpbiBhbGwgb2YgVENQLCBleGNlcHQgY29ubmVjdGlvbgorCQkgKiByZXNldCwgd2hlcmUgd2UgY2FuIGJlIHVubGlua2luZyB0aGUgc2VuZF9oZWFkLgorCQkgKi8KKwkJdGNwX2NoZWNrX3NlbmRfaGVhZChzaywgc2tiKTsKIAkJc2tfc3RyZWFtX2ZyZWVfc2tiKHNrLCBza2IpOwogCX0KIApAQCAtMTAxNiw5ICsxMDE5LDkgQEAKIAogCXNrYl9xdWV1ZV93YWxrKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSwgc2tiKSB7CiAJCW9mZnNldCA9IHNlcSAtIFRDUF9TS0JfQ0Ioc2tiKS0+c2VxOwotCQlpZiAoc2tiLT5oLnRoLT5zeW4pCisJCWlmICh0Y3BfaGRyKHNrYiktPnN5bikKIAkJCW9mZnNldC0tOwotCQlpZiAob2Zmc2V0IDwgc2tiLT5sZW4gfHwgc2tiLT5oLnRoLT5maW4pIHsKKwkJaWYgKG9mZnNldCA8IHNrYi0+bGVuIHx8IHRjcF9oZHIoc2tiKS0+ZmluKSB7CiAJCQkqb2ZmID0gb2Zmc2V0OwogCQkJcmV0dXJuIHNrYjsKIAkJfQpAQCAtMTA3MCw3ICsxMDczLDcgQEAKIAkJCWlmIChvZmZzZXQgIT0gc2tiLT5sZW4pCiAJCQkJYnJlYWs7CiAJCX0KLQkJaWYgKHNrYi0+aC50aC0+ZmluKSB7CisJCWlmICh0Y3BfaGRyKHNrYiktPmZpbikgewogCQkJc2tfZWF0X3NrYihzaywgc2tiLCAwKTsKIAkJCSsrc2VxOwogCQkJYnJlYWs7CkBAIC0xMTc0LDExICsxMTc3LDExIEBACiAJCQkJYnJlYWs7CiAJCQl9CiAJCQlvZmZzZXQgPSAqc2VxIC0gVENQX1NLQl9DQihza2IpLT5zZXE7Ci0JCQlpZiAoc2tiLT5oLnRoLT5zeW4pCisJCQlpZiAodGNwX2hkcihza2IpLT5zeW4pCiAJCQkJb2Zmc2V0LS07CiAJCQlpZiAob2Zmc2V0IDwgc2tiLT5sZW4pCiAJCQkJZ290byBmb3VuZF9va19za2I7Ci0JCQlpZiAoc2tiLT5oLnRoLT5maW4pCisJCQlpZiAodGNwX2hkcihza2IpLT5maW4pCiAJCQkJZ290byBmb3VuZF9maW5fb2s7CiAJCQlCVUdfVFJBUChmbGFncyAmIE1TR19QRUVLKTsKIAkJCXNrYiA9IHNrYi0+bmV4dDsKQEAgLTEzODksMTIgKzEzOTIsMTIgQEAKIHNraXBfY29weToKIAkJaWYgKHRwLT51cmdfZGF0YSAmJiBhZnRlcih0cC0+Y29waWVkX3NlcSwgdHAtPnVyZ19zZXEpKSB7CiAJCQl0cC0+dXJnX2RhdGEgPSAwOwotCQkJdGNwX2Zhc3RfcGF0aF9jaGVjayhzaywgdHApOworCQkJdGNwX2Zhc3RfcGF0aF9jaGVjayhzayk7CiAJCX0KIAkJaWYgKHVzZWQgKyBvZmZzZXQgPCBza2ItPmxlbikKIAkJCWNvbnRpbnVlOwogCi0JCWlmIChza2ItPmgudGgtPmZpbikKKwkJaWYgKHRjcF9oZHIoc2tiKS0+ZmluKQogCQkJZ290byBmb3VuZF9maW5fb2s7CiAJCWlmICghKGZsYWdzICYgTVNHX1BFRUspKSB7CiAJCQlza19lYXRfc2tiKHNrLCBza2IsIGNvcGllZF9lYXJseSk7CkBAIC0xNTYzLDIxICsxNTY2LDE5IEBACiAJICovCiAJd2hpbGUgKChza2IgPSBfX3NrYl9kZXF1ZXVlKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSkpICE9IE5VTEwpIHsKIAkJdTMyIGxlbiA9IFRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcSAtIFRDUF9TS0JfQ0Ioc2tiKS0+c2VxIC0KLQkJCSAgc2tiLT5oLnRoLT5maW47CisJCQkgIHRjcF9oZHIoc2tiKS0+ZmluOwogCQlkYXRhX3dhc191bnJlYWQgKz0gbGVuOwogCQlfX2tmcmVlX3NrYihza2IpOwogCX0KIAogCXNrX3N0cmVhbV9tZW1fcmVjbGFpbShzayk7CiAKLQkvKiBBcyBvdXRsaW5lZCBpbiBkcmFmdC1pZXRmLXRjcGltcGwtcHJvYi0wMy50eHQsIHNlY3Rpb24KLQkgKiAzLjEwLCB3ZSBzZW5kIGEgUlNUIGhlcmUgYmVjYXVzZSBkYXRhIHdhcyBsb3N0LiAgVG8KLQkgKiB3aXRuZXNzIHRoZSBhd2Z1bCBlZmZlY3RzIG9mIHRoZSBvbGQgYmVoYXZpb3Igb2YgYWx3YXlzCi0JICogZG9pbmcgYSBGSU4sIHJ1biBhbiBvbGRlciAyLjEueCBrZXJuZWwgb3IgMi4wLngsIHN0YXJ0Ci0JICogYSBidWxrIEdFVCBpbiBhbiBGVFAgY2xpZW50LCBzdXNwZW5kIHRoZSBwcm9jZXNzLCB3YWl0Ci0JICogZm9yIHRoZSBjbGllbnQgdG8gYWR2ZXJ0aXNlIGEgemVybyB3aW5kb3csIHRoZW4ga2lsbCAtOQotCSAqIHRoZSBGVFAgY2xpZW50LCB3aGVlZS4uLiAgTm90ZTogdGltZW91dCBpcyBhbHdheXMgemVybwotCSAqIGluIHN1Y2ggYSBjYXNlLgorCS8qIEFzIG91dGxpbmVkIGluIFJGQyAyNTI1LCBzZWN0aW9uIDIuMTcsIHdlIHNlbmQgYSBSU1QgaGVyZSBiZWNhdXNlCisJICogZGF0YSB3YXMgbG9zdC4gVG8gd2l0bmVzcyB0aGUgYXdmdWwgZWZmZWN0cyBvZiB0aGUgb2xkIGJlaGF2aW9yIG9mCisJICogYWx3YXlzIGRvaW5nIGEgRklOLCBydW4gYW4gb2xkZXIgMi4xLngga2VybmVsIG9yIDIuMC54LCBzdGFydCBhIGJ1bGsKKwkgKiBHRVQgaW4gYW4gRlRQIGNsaWVudCwgc3VzcGVuZCB0aGUgcHJvY2Vzcywgd2FpdCBmb3IgdGhlIGNsaWVudCB0bworCSAqIGFkdmVydGlzZSBhIHplcm8gd2luZG93LCB0aGVuIGtpbGwgLTkgdGhlIEZUUCBjbGllbnQsIHdoZWVlLi4uCisJICogTm90ZTogdGltZW91dCBpcyBhbHdheXMgemVybyBpbiBzdWNoIGEgY2FzZS4KIAkgKi8KIAlpZiAoZGF0YV93YXNfdW5yZWFkKSB7CiAJCS8qIFVucmVhZCBkYXRhIHdhcyB0b3NzZWQsIHphcCB0aGUgY29ubmVjdGlvbi4gKi8KQEAgLTE3MzIsNyArMTczMyw3IEBACiAKIAl0Y3BfY2xlYXJfeG1pdF90aW1lcnMoc2spOwogCV9fc2tiX3F1ZXVlX3B1cmdlKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSk7Ci0Jc2tfc3RyZWFtX3dyaXRlcXVldWVfcHVyZ2Uoc2spOworCXRjcF93cml0ZV9xdWV1ZV9wdXJnZShzayk7CiAJX19za2JfcXVldWVfcHVyZ2UoJnRwLT5vdXRfb2Zfb3JkZXJfcXVldWUpOwogI2lmZGVmIENPTkZJR19ORVRfRE1BCiAJX19za2JfcXVldWVfcHVyZ2UoJnNrLT5za19hc3luY193YWl0X3F1ZXVlKTsKQEAgLTE3NTgsNyArMTc1OSw3IEBACiAJdGNwX3NldF9jYV9zdGF0ZShzaywgVENQX0NBX09wZW4pOwogCXRjcF9jbGVhcl9yZXRyYW5zKHRwKTsKIAlpbmV0X2Nza19kZWxhY2tfaW5pdChzayk7Ci0Jc2stPnNrX3NlbmRfaGVhZCA9IE5VTEw7CisJdGNwX2luaXRfc2VuZF9oZWFkKHNrKTsKIAl0cC0+cnhfb3B0LnNhd190c3RhbXAgPSAwOwogCXRjcF9zYWNrX3Jlc2V0KCZ0cC0+cnhfb3B0KTsKIAlfX3NrX2RzdF9yZXNldChzayk7CkBAIC0xODMwLDcgKzE4MzEsNyBAQAogCQkJICogZm9yIGN1cnJlbnRseSBxdWV1ZWQgc2VnbWVudHMuCiAJCQkgKi8KIAkJCXRwLT5ub25hZ2xlIHw9IFRDUF9OQUdMRV9PRkZ8VENQX05BR0xFX1BVU0g7Ci0JCQl0Y3BfcHVzaF9wZW5kaW5nX2ZyYW1lcyhzaywgdHApOworCQkJdGNwX3B1c2hfcGVuZGluZ19mcmFtZXMoc2spOwogCQl9IGVsc2UgewogCQkJdHAtPm5vbmFnbGUgJj0gflRDUF9OQUdMRV9PRkY7CiAJCX0KQEAgLTE4NTQsNyArMTg1NSw3IEBACiAJCQl0cC0+bm9uYWdsZSAmPSB+VENQX05BR0xFX0NPUks7CiAJCQlpZiAodHAtPm5vbmFnbGUmVENQX05BR0xFX09GRikKIAkJCQl0cC0+bm9uYWdsZSB8PSBUQ1BfTkFHTEVfUFVTSDsKLQkJCXRjcF9wdXNoX3BlbmRpbmdfZnJhbWVzKHNrLCB0cCk7CisJCQl0Y3BfcHVzaF9wZW5kaW5nX2ZyYW1lcyhzayk7CiAJCX0KIAkJYnJlYWs7CiAKQEAgLTE5NTQsNyArMTk1NSw4IEBACiAJZGVmYXVsdDoKIAkJZXJyID0gLUVOT1BST1RPT1BUOwogCQlicmVhazsKLQl9OworCX0KKwogCXJlbGVhc2Vfc29jayhzayk7CiAJcmV0dXJuIGVycjsKIH0KQEAgLTIxMjQsNyArMjEyNiw3IEBACiAJCXJldHVybiAwOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRU5PUFJPVE9PUFQ7Ci0JfTsKKwl9CiAKIAlpZiAocHV0X3VzZXIobGVuLCBvcHRsZW4pKQogCQlyZXR1cm4gLUVGQVVMVDsKQEAgLTIxNzAsNyArMjE3Miw3IEBACiAJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgc2l6ZW9mKCp0aCkpKQogCQlnb3RvIG91dDsKIAotCXRoID0gc2tiLT5oLnRoOworCXRoID0gdGNwX2hkcihza2IpOwogCXRobGVuID0gdGgtPmRvZmYgKiA0OwogCWlmICh0aGxlbiA8IHNpemVvZigqdGgpKQogCQlnb3RvIG91dDsKQEAgLTIyMTAsNyArMjIxMiw3IEBACiAJZGVsdGEgPSBodG9ubChvbGRsZW4gKyAodGhsZW4gKyBsZW4pKTsKIAogCXNrYiA9IHNlZ3M7Ci0JdGggPSBza2ItPmgudGg7CisJdGggPSB0Y3BfaGRyKHNrYik7CiAJc2VxID0gbnRvaGwodGgtPnNlcSk7CiAKIAlkbyB7CkBAIC0yMjE5LDIzICsyMjIxLDI1IEBACiAJCXRoLT5jaGVjayA9IH5jc3VtX2ZvbGQoKF9fZm9yY2UgX193c3VtKSgoX19mb3JjZSB1MzIpdGgtPmNoZWNrICsKIAkJCQkgICAgICAgKF9fZm9yY2UgdTMyKWRlbHRhKSk7CiAJCWlmIChza2ItPmlwX3N1bW1lZCAhPSBDSEVDS1NVTV9QQVJUSUFMKQotCQkJdGgtPmNoZWNrID0gY3N1bV9mb2xkKGNzdW1fcGFydGlhbChza2ItPmgucmF3LCB0aGxlbiwKLQkJCQkJCQkgICBza2ItPmNzdW0pKTsKKwkJCXRoLT5jaGVjayA9CisJCQkgICAgIGNzdW1fZm9sZChjc3VtX3BhcnRpYWwoc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKSwKKwkJCQkJCSAgICB0aGxlbiwgc2tiLT5jc3VtKSk7CiAKIAkJc2VxICs9IGxlbjsKIAkJc2tiID0gc2tiLT5uZXh0OwotCQl0aCA9IHNrYi0+aC50aDsKKwkJdGggPSB0Y3BfaGRyKHNrYik7CiAKIAkJdGgtPnNlcSA9IGh0b25sKHNlcSk7CiAJCXRoLT5jd3IgPSAwOwogCX0gd2hpbGUgKHNrYi0+bmV4dCk7CiAKLQlkZWx0YSA9IGh0b25sKG9sZGxlbiArIChza2ItPnRhaWwgLSBza2ItPmgucmF3KSArIHNrYi0+ZGF0YV9sZW4pOworCWRlbHRhID0gaHRvbmwob2xkbGVuICsgKHNrYi0+dGFpbCAtIHNrYi0+dHJhbnNwb3J0X2hlYWRlcikgKworCQkgICAgICBza2ItPmRhdGFfbGVuKTsKIAl0aC0+Y2hlY2sgPSB+Y3N1bV9mb2xkKChfX2ZvcmNlIF9fd3N1bSkoKF9fZm9yY2UgdTMyKXRoLT5jaGVjayArCiAJCQkJKF9fZm9yY2UgdTMyKWRlbHRhKSk7CiAJaWYgKHNrYi0+aXBfc3VtbWVkICE9IENIRUNLU1VNX1BBUlRJQUwpCi0JCXRoLT5jaGVjayA9IGNzdW1fZm9sZChjc3VtX3BhcnRpYWwoc2tiLT5oLnJhdywgdGhsZW4sCi0JCQkJCQkgICBza2ItPmNzdW0pKTsKKwkJdGgtPmNoZWNrID0gY3N1bV9mb2xkKGNzdW1fcGFydGlhbChza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpLAorCQkJCQkJICAgdGhsZW4sIHNrYi0+Y3N1bSkpOwogCiBvdXQ6CiAJcmV0dXJuIHNlZ3M7CkBAIC0yMzcyLDYgKzIzNzYsMjMgQEAKIEVYUE9SVF9TWU1CT0woX190Y3BfcHV0X21kNXNpZ19wb29sKTsKICNlbmRpZgogCit2b2lkIHRjcF9kb25lKHN0cnVjdCBzb2NrICpzaykKK3sKKwlpZihzay0+c2tfc3RhdGUgPT0gVENQX1NZTl9TRU5UIHx8IHNrLT5za19zdGF0ZSA9PSBUQ1BfU1lOX1JFQ1YpCisJCVRDUF9JTkNfU1RBVFNfQkgoVENQX01JQl9BVFRFTVBURkFJTFMpOworCisJdGNwX3NldF9zdGF0ZShzaywgVENQX0NMT1NFKTsKKwl0Y3BfY2xlYXJfeG1pdF90aW1lcnMoc2spOworCisJc2stPnNrX3NodXRkb3duID0gU0hVVERPV05fTUFTSzsKKworCWlmICghc29ja19mbGFnKHNrLCBTT0NLX0RFQUQpKQorCQlzay0+c2tfc3RhdGVfY2hhbmdlKHNrKTsKKwllbHNlCisJCWluZXRfY3NrX2Rlc3Ryb3lfc29jayhzayk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh0Y3BfZG9uZSk7CisKIGV4dGVybiB2b2lkIF9fc2tiX2NiX3Rvb19zbWFsbF9mb3JfdGNwKGludCwgaW50KTsKIGV4dGVybiBzdHJ1Y3QgdGNwX2Nvbmdlc3Rpb25fb3BzIHRjcF9yZW5vOwogCmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3BfYmljLmMgYi9uZXQvaXB2NC90Y3BfYmljLmMKaW5kZXggNTczMDMzMy4uMjgxYzlmOSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwX2JpYy5jCisrKyBiL25ldC9pcHY0L3RjcF9iaWMuYwpAQCAtMjA2LDcgKzIwNiw3IEBACiAvKiBUcmFjayBkZWxheWVkIGFja25vd2xlZGdtZW50IHJhdGlvIHVzaW5nIHNsaWRpbmcgd2luZG93CiAgKiByYXRpbyA9ICgxNSpyYXRpbyArIHNhbXBsZSkgLyAxNgogICovCi1zdGF0aWMgdm9pZCBiaWN0Y3BfYWNrZWQoc3RydWN0IHNvY2sgKnNrLCB1MzIgY250KQorc3RhdGljIHZvaWQgYmljdGNwX2Fja2VkKHN0cnVjdCBzb2NrICpzaywgdTMyIGNudCwga3RpbWVfdCBsYXN0KQogewogCWNvbnN0IHN0cnVjdCBpbmV0X2Nvbm5lY3Rpb25fc29jayAqaWNzayA9IGluZXRfY3NrKHNrKTsKIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwX2NvbmcuYyBiL25ldC9pcHY0L3RjcF9jb25nLmMKaW5kZXggMzRhZTNmMS4uODZiMjY1MyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwX2NvbmcuYworKysgYi9uZXQvaXB2NC90Y3BfY29uZy5jCkBAIC0xMiw2ICsxMiw4IEBACiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPG5ldC90Y3AuaD4KIAoraW50IHN5c2N0bF90Y3BfbWF4X3NzdGhyZXNoID0gMDsKKwogc3RhdGljIERFRklORV9TUElOTE9DSyh0Y3BfY29uZ19saXN0X2xvY2spOwogc3RhdGljIExJU1RfSEVBRCh0Y3BfY29uZ19saXN0KTsKIApAQCAtMTI0LDcgKzEyNiw3IEBACiAjZW5kaWYKIAogCWlmIChjYSkgewotCQljYS0+bm9uX3Jlc3RyaWN0ZWQgPSAxOwkvKiBkZWZhdWx0IGlzIGFsd2F5cyBhbGxvd2VkICovCisJCWNhLT5mbGFncyB8PSBUQ1BfQ09OR19OT05fUkVTVFJJQ1RFRDsJLyogZGVmYXVsdCBpcyBhbHdheXMgYWxsb3dlZCAqLwogCQlsaXN0X21vdmUoJmNhLT5saXN0LCAmdGNwX2NvbmdfbGlzdCk7CiAJCXJldCA9IDA7CiAJfQpAQCAtMTc5LDcgKzE4MSw3IEBACiAJKmJ1ZiA9ICdcMCc7CiAJcmN1X3JlYWRfbG9jaygpOwogCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGNhLCAmdGNwX2NvbmdfbGlzdCwgbGlzdCkgewotCQlpZiAoIWNhLT5ub25fcmVzdHJpY3RlZCkKKwkJaWYgKCEoY2EtPmZsYWdzICYgVENQX0NPTkdfTk9OX1JFU1RSSUNURUQpKQogCQkJY29udGludWU7CiAJCW9mZnMgKz0gc25wcmludGYoYnVmICsgb2ZmcywgbWF4bGVuIC0gb2ZmcywKIAkJCQkgIiVzJXMiLApAQCAtMjEwLDE2ICsyMTIsMTYgQEAKIAkJfQogCX0KIAotCS8qIHBhc3MgMiBjbGVhciAqLworCS8qIHBhc3MgMiBjbGVhciBvbGQgdmFsdWVzICovCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoY2EsICZ0Y3BfY29uZ19saXN0LCBsaXN0KQotCQljYS0+bm9uX3Jlc3RyaWN0ZWQgPSAwOworCQljYS0+ZmxhZ3MgJj0gflRDUF9DT05HX05PTl9SRVNUUklDVEVEOwogCiAJLyogcGFzcyAzIG1hcmsgYXMgYWxsb3dlZCAqLwogCXdoaWxlICgobmFtZSA9IHN0cnNlcCgmdmFsLCAiICIpKSAmJiAqbmFtZSkgewogCQljYSA9IHRjcF9jYV9maW5kKG5hbWUpOwogCQlXQVJOX09OKCFjYSk7CiAJCWlmIChjYSkKLQkJCWNhLT5ub25fcmVzdHJpY3RlZCA9IDE7CisJCQljYS0+ZmxhZ3MgfD0gVENQX0NPTkdfTk9OX1JFU1RSSUNURUQ7CiAJfQogb3V0OgogCXNwaW5fdW5sb2NrKCZ0Y3BfY29uZ19saXN0X2xvY2spOwpAQCAtMjU0LDcgKzI1Niw3IEBACiAJaWYgKCFjYSkKIAkJZXJyID0gLUVOT0VOVDsKIAotCWVsc2UgaWYgKCEoY2EtPm5vbl9yZXN0cmljdGVkIHx8IGNhcGFibGUoQ0FQX05FVF9BRE1JTikpKQorCWVsc2UgaWYgKCEoKGNhLT5mbGFncyAmIFRDUF9DT05HX05PTl9SRVNUUklDVEVEKSB8fCBjYXBhYmxlKENBUF9ORVRfQURNSU4pKSkKIAkJZXJyID0gLUVQRVJNOwogCiAJZWxzZSBpZiAoIXRyeV9tb2R1bGVfZ2V0KGNhLT5vd25lcikpCkBAIC0yNzQsMTAgKzI3NiwxMyBAQAogCiAKIC8qCi0gKiBMaW5lYXIgaW5jcmVhc2UgZHVyaW5nIHNsb3cgc3RhcnQKKyAqIFNsb3cgc3RhcnQgKGV4cG9uZW50aWFsIGluY3JlYXNlKSB3aXRoCisgKiBSRkMzNzQyIExpbWl0ZWQgU2xvdyBTdGFydCAoZmFzdCBsaW5lYXIgaW5jcmVhc2UpIHN1cHBvcnQuCiAgKi8KIHZvaWQgdGNwX3Nsb3dfc3RhcnQoc3RydWN0IHRjcF9zb2NrICp0cCkKIHsKKwlpbnQgY250ID0gMDsKKwogCWlmIChzeXNjdGxfdGNwX2FiYykgewogCQkvKiBSRkMzNDY1OiBTbG93IFN0YXJ0CiAJCSAqIFRDUCBzZW5kZXIgU0hPVUxEIGluY3JlYXNlIGN3bmQgYnkgdGhlIG51bWJlciBvZgpAQCAtMjg2LDE3ICsyOTEsMjUgQEAKIAkJICovCiAJCWlmICh0cC0+Ynl0ZXNfYWNrZWQgPCB0cC0+bXNzX2NhY2hlKQogCQkJcmV0dXJuOwotCi0JCS8qIFdlIE1BWSBpbmNyZWFzZSBieSAyIGlmIGRpc2NvdmVyZWQgZGVsYXllZCBhY2sgKi8KLQkJaWYgKHN5c2N0bF90Y3BfYWJjID4gMSAmJiB0cC0+Ynl0ZXNfYWNrZWQgPj0gMip0cC0+bXNzX2NhY2hlKSB7Ci0JCQlpZiAodHAtPnNuZF9jd25kIDwgdHAtPnNuZF9jd25kX2NsYW1wKQotCQkJCXRwLT5zbmRfY3duZCsrOwotCQl9CiAJfQorCisJaWYgKHN5c2N0bF90Y3BfbWF4X3NzdGhyZXNoID4gMCAmJgorCSAgICB0cC0+c25kX2N3bmQgPiBzeXNjdGxfdGNwX21heF9zc3RocmVzaCkKKwkJY250ICs9IHN5c2N0bF90Y3BfbWF4X3NzdGhyZXNoPj4xOworCWVsc2UKKwkJY250ICs9IHRwLT5zbmRfY3duZDsKKworCS8qIFJGQzM0NjU6IFdlIE1BWSBpbmNyZWFzZSBieSAyIGlmIGRpc2NvdmVyZWQgZGVsYXllZCBhY2sgKi8KKwlpZiAoc3lzY3RsX3RjcF9hYmMgPiAxICYmIHRwLT5ieXRlc19hY2tlZCA+PSAyKnRwLT5tc3NfY2FjaGUpCisJCWNudCA8PD0gMTsKIAl0cC0+Ynl0ZXNfYWNrZWQgPSAwOwogCi0JaWYgKHRwLT5zbmRfY3duZCA8IHRwLT5zbmRfY3duZF9jbGFtcCkKLQkJdHAtPnNuZF9jd25kKys7CisJdHAtPnNuZF9jd25kX2NudCArPSBjbnQ7CisJd2hpbGUgKHRwLT5zbmRfY3duZF9jbnQgPj0gdHAtPnNuZF9jd25kKSB7CisJCXRwLT5zbmRfY3duZF9jbnQgLT0gdHAtPnNuZF9jd25kOworCQlpZiAodHAtPnNuZF9jd25kIDwgdHAtPnNuZF9jd25kX2NsYW1wKQorCQkJdHAtPnNuZF9jd25kKys7CisJfQogfQogRVhQT1JUX1NZTUJPTF9HUEwodGNwX3Nsb3dfc3RhcnQpOwogCkBAIC0zNTgsOCArMzcxLDggQEAKIEVYUE9SVF9TWU1CT0xfR1BMKHRjcF9yZW5vX21pbl9jd25kKTsKIAogc3RydWN0IHRjcF9jb25nZXN0aW9uX29wcyB0Y3BfcmVubyA9IHsKKwkuZmxhZ3MJCT0gVENQX0NPTkdfTk9OX1JFU1RSSUNURUQsCiAJLm5hbWUJCT0gInJlbm8iLAotCS5ub25fcmVzdHJpY3RlZCA9IDEsCiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCS5zc3RocmVzaAk9IHRjcF9yZW5vX3NzdGhyZXNoLAogCS5jb25nX2F2b2lkCT0gdGNwX3Jlbm9fY29uZ19hdm9pZCwKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3RjcF9jdWJpYy5jIGIvbmV0L2lwdjQvdGNwX2N1YmljLmMKaW5kZXggOWE1ODJmYi4uMTQyMjQ0OCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwX2N1YmljLmMKKysrIGIvbmV0L2lwdjQvdGNwX2N1YmljLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogVENQIENVQklDOiBCaW5hcnkgSW5jcmVhc2UgQ29uZ2VzdGlvbiBjb250cm9sIGZvciBUQ1AgdjIuMAorICogVENQIENVQklDOiBCaW5hcnkgSW5jcmVhc2UgQ29uZ2VzdGlvbiBjb250cm9sIGZvciBUQ1AgdjIuMQogICoKICAqIFRoaXMgaXMgZnJvbSB0aGUgaW1wbGVtZW50YXRpb24gb2YgQ1VCSUMgVENQIGluCiAgKiBJbmpvbmcgUmhlZSwgTGlzb25nIFh1LgpAQCAtNTEsOCArNTEsNiBAQAogbW9kdWxlX3BhcmFtKHRjcF9mcmllbmRsaW5lc3MsIGludCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKHRjcF9mcmllbmRsaW5lc3MsICJ0dXJuIG9uL29mZiB0Y3AgZnJpZW5kbGluZXNzIik7CiAKLSNpbmNsdWRlIDxhc20vZGl2NjQuaD4KLQogLyogQklDIFRDUCBQYXJhbWV0ZXJzICovCiBzdHJ1Y3QgYmljdGNwIHsKIAl1MzIJY250OwkJLyogaW5jcmVhc2UgY3duZCBieSAxIGFmdGVyIEFDS3MgKi8KQEAgLTkzLDUwICs5MSw1MSBAQAogCQl0Y3Bfc2soc2spLT5zbmRfc3N0aHJlc2ggPSBpbml0aWFsX3NzdGhyZXNoOwogfQogCi0vKiA2NGJpdCBkaXZpc29yLCBkaXZpZGVuZCBhbmQgcmVzdWx0LiBkeW5hbWljIHByZWNpc2lvbiAqLwotc3RhdGljIGlubGluZSB1X2ludDY0X3QgZGl2NjRfNjQodV9pbnQ2NF90IGRpdmlkZW5kLCB1X2ludDY0X3QgZGl2aXNvcikKLXsKLQl1X2ludDMyX3QgZCA9IGRpdmlzb3I7Ci0KLQlpZiAoZGl2aXNvciA+IDB4ZmZmZmZmZmZVTEwpIHsKLQkJdW5zaWduZWQgaW50IHNoaWZ0ID0gZmxzKGRpdmlzb3IgPj4gMzIpOwotCi0JCWQgPSBkaXZpc29yID4+IHNoaWZ0OwotCQlkaXZpZGVuZCA+Pj0gc2hpZnQ7Ci0JfQotCi0JLyogYXZvaWQgNjQgYml0IGRpdmlzaW9uIGlmIHBvc3NpYmxlICovCi0JaWYgKGRpdmlkZW5kID4+IDMyKQotCQlkb19kaXYoZGl2aWRlbmQsIGQpOwotCWVsc2UKLQkJZGl2aWRlbmQgPSAodWludDMyX3QpIGRpdmlkZW5kIC8gZDsKLQotCXJldHVybiBkaXZpZGVuZDsKLX0KLQotLyoKLSAqIGNhbGN1bGF0ZSB0aGUgY3ViaWMgcm9vdCBvZiB4IHVzaW5nIE5ld3Rvbi1SYXBoc29uCisvKiBjYWxjdWxhdGUgdGhlIGN1YmljIHJvb3Qgb2YgeCB1c2luZyBhIHRhYmxlIGxvb2t1cCBmb2xsb3dlZCBieSBvbmUKKyAqIE5ld3Rvbi1SYXBoc29uIGl0ZXJhdGlvbi4KKyAqIEF2ZyBlcnIgfj0gMC4xOTUlCiAgKi8KIHN0YXRpYyB1MzIgY3ViaWNfcm9vdCh1NjQgYSkKIHsKLQl1MzIgeCwgeDE7Ci0KLQkvKiBJbml0aWFsIGVzdGltYXRlIGlzIGJhc2VkIG9uOgotCSAqIGNicnQoeCkgPSBleHAobG9nKHgpIC8gMykKKwl1MzIgeCwgYiwgc2hpZnQ7CisJLyoKKwkgKiBjYnJ0KHgpIE1TQiB2YWx1ZXMgZm9yIHggTVNCIHZhbHVlcyBpbiBbMC4uNjNdLgorCSAqIFByZWNvbXB1dGVkIHRoZW4gcmVmaW5lZCBieSBoYW5kIC0gV2lsbHkgVGFycmVhdQorCSAqCisJICogRm9yIHggaW4gWzAuLjYzXSwKKwkgKiAgIHYgPSBjYnJ0KHggPDwgMTgpIC0gMQorCSAqICAgY2JydCh4KSA9ICh2W3hdICsgMTApID4+IDYKIAkgKi8KLQl4ID0gMXUgPDwgKGZsczY0KGEpLzMpOworCXN0YXRpYyBjb25zdCB1OCB2W10gPSB7CisJCS8qIDB4MDAgKi8gICAgMCwgICA1NCwgICA1NCwgICA1NCwgIDExOCwgIDExOCwgIDExOCwgIDExOCwKKwkJLyogMHgwOCAqLyAgMTIzLCAgMTI5LCAgMTM0LCAgMTM4LCAgMTQzLCAgMTQ3LCAgMTUxLCAgMTU2LAorCQkvKiAweDEwICovICAxNTcsICAxNjEsICAxNjQsICAxNjgsICAxNzAsICAxNzMsICAxNzYsICAxNzksCisJCS8qIDB4MTggKi8gIDE4MSwgIDE4NSwgIDE4NywgIDE5MCwgIDE5MiwgIDE5NCwgIDE5NywgIDE5OSwKKwkJLyogMHgyMCAqLyAgMjAwLCAgMjAyLCAgMjA0LCAgMjA2LCAgMjA5LCAgMjExLCAgMjEzLCAgMjE1LAorCQkvKiAweDI4ICovICAyMTcsICAyMTksICAyMjEsICAyMjIsICAyMjQsICAyMjUsICAyMjcsICAyMjksCisJCS8qIDB4MzAgKi8gIDIzMSwgIDIzMiwgIDIzNCwgIDIzNiwgIDIzNywgIDIzOSwgIDI0MCwgIDI0MiwKKwkJLyogMHgzOCAqLyAgMjQ0LCAgMjQ1LCAgMjQ2LCAgMjQ4LCAgMjUwLCAgMjUxLCAgMjUyLCAgMjU0LAorCX07CisKKwliID0gZmxzNjQoYSk7CisJaWYgKGIgPCA3KSB7CisJCS8qIGEgaW4gWzAuLjYzXSAqLworCQlyZXR1cm4gKCh1MzIpdlsodTMyKWFdICsgMzUpID4+IDY7CisJfQorCisJYiA9ICgoYiAqIDg0KSA+PiA4KSAtIDE7CisJc2hpZnQgPSAoYSA+PiAoYiAqIDMpKTsKKworCXggPSAoKHUzMikoKCh1MzIpdltzaGlmdF0gKyAxMCkgPDwgYikpID4+IDY7CiAKIAkvKgotCSAqIEl0ZXJhdGlvbiBiYXNlZCBvbjoKKwkgKiBOZXd0b24tUmFwaHNvbiBpdGVyYXRpb24KIAkgKiAgICAgICAgICAgICAgICAgICAgICAgICAyCiAJICogeCAgICA9ICggMiAqIHggICsgIGEgLyB4ICApIC8gMwogCSAqICBrKzEgICAgICAgICAgayAgICAgICAgIGsKIAkgKi8KLQlkbyB7Ci0JCXgxID0geDsKLQkJeCA9ICgyICogeCArICh1aW50MzJfdCkgZGl2NjRfNjQoYSwgeCp4KSkgLyAzOwotCX0gd2hpbGUgKGFicyh4MSAtIHgpID4gMSk7Ci0KKwl4ID0gKDIgKiB4ICsgKHUzMilkaXY2NF82NChhLCAodTY0KXggKiAodTY0KSh4IC0gMSkpKTsKKwl4ID0gKCh4ICogMzQxKSA+PiAxMCk7CiAJcmV0dXJuIHg7CiB9CiAKQEAgLTIxNSw3ICsyMTQsOSBAQAogCWlmIChjYS0+ZGVsYXlfbWluID4gMCkgewogCQkvKiBtYXggaW5jcmVtZW50ID0gU21heCAqIHJ0dCAvIDAuMSAgKi8KIAkJbWluX2NudCA9IChjd25kICogSFogKiA4KS8oMTAgKiBtYXhfaW5jcmVtZW50ICogY2EtPmRlbGF5X21pbik7Ci0JCWlmIChjYS0+Y250IDwgbWluX2NudCkKKworCQkvKiB1c2UgY29uY2F2ZSBncm93dGggd2hlbiB0aGUgdGFyZ2V0IGlzIGFib3ZlIHRoZSBvcmlnaW4gKi8KKwkJaWYgKGNhLT5jbnQgPCBtaW5fY250ICYmIHQgPj0gY2EtPmJpY19LKQogCQkJY2EtPmNudCA9IG1pbl9jbnQ7CiAJfQogCkBAIC0zMzMsNyArMzM0LDcgQEAKIC8qIFRyYWNrIGRlbGF5ZWQgYWNrbm93bGVkZ21lbnQgcmF0aW8gdXNpbmcgc2xpZGluZyB3aW5kb3cKICAqIHJhdGlvID0gKDE1KnJhdGlvICsgc2FtcGxlKSAvIDE2CiAgKi8KLXN0YXRpYyB2b2lkIGJpY3RjcF9hY2tlZChzdHJ1Y3Qgc29jayAqc2ssIHUzMiBjbnQpCitzdGF0aWMgdm9pZCBiaWN0Y3BfYWNrZWQoc3RydWN0IHNvY2sgKnNrLCB1MzIgY250LCBrdGltZV90IGxhc3QpCiB7CiAJY29uc3Qgc3RydWN0IGluZXRfY29ubmVjdGlvbl9zb2NrICppY3NrID0gaW5ldF9jc2soc2spOwogCkBAIC00MDEsNCArNDAyLDQgQEAKIE1PRFVMRV9BVVRIT1IoIlNhbmd0YWUgSGEsIFN0ZXBoZW4gSGVtbWluZ2VyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkNVQklDIFRDUCIpOwotTU9EVUxFX1ZFUlNJT04oIjIuMCIpOworTU9EVUxFX1ZFUlNJT04oIjIuMSIpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwX2h0Y3AuYyBiL25ldC9pcHY0L3RjcF9odGNwLmMKaW5kZXggMTAyMGViNC4uNGJhNGE3YSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwX2h0Y3AuYworKysgYi9uZXQvaXB2NC90Y3BfaHRjcC5jCkBAIC05OCw3ICs5OCw3IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBtZWFzdXJlX2FjaGlldmVkX3Rocm91Z2hwdXQoc3RydWN0IHNvY2sgKnNrLCB1MzIgcGt0c19hY2tlZCkKK3N0YXRpYyB2b2lkIG1lYXN1cmVfYWNoaWV2ZWRfdGhyb3VnaHB1dChzdHJ1Y3Qgc29jayAqc2ssIHUzMiBwa3RzX2Fja2VkLCBrdGltZV90IGxhc3QpCiB7CiAJY29uc3Qgc3RydWN0IGluZXRfY29ubmVjdGlvbl9zb2NrICppY3NrID0gaW5ldF9jc2soc2spOwogCWNvbnN0IHN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwX2h5YmxhLmMgYi9uZXQvaXB2NC90Y3BfaHlibGEuYwppbmRleCA1OWU2OTFkLi5lNWJlMzUxIDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3BfaHlibGEuYworKysgYi9uZXQvaXB2NC90Y3BfaHlibGEuYwpAQCAtMTQ0LDcgKzE0NCw3IEBACiAJY2EtPnNuZF9jd25kX2NlbnRzICs9IG9kZDsKIAogCS8qIGNoZWNrIHdoZW4gZnJhY3Rpb25zIGdvZXMgPj0xMjggYW5kIGluY3JlYXNlIGN3bmQgYnkgMS4gKi8KLQl3aGlsZShjYS0+c25kX2N3bmRfY2VudHMgPj0gMTI4KSB7CisJd2hpbGUgKGNhLT5zbmRfY3duZF9jZW50cyA+PSAxMjgpIHsKIAkJdHAtPnNuZF9jd25kKys7CiAJCWNhLT5zbmRfY3duZF9jZW50cyAtPSAxMjg7CiAJCXRwLT5zbmRfY3duZF9jbnQgPSAwOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwX2lsbGlub2lzLmMgYi9uZXQvaXB2NC90Y3BfaWxsaW5vaXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWRjNDdjCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjQvdGNwX2lsbGlub2lzLmMKQEAgLTAsMCArMSwzNTYgQEAKKy8qCisgKiBUQ1AgSWxsaW5vaXMgY29uZ2VzdGlvbiBjb250cm9sLgorICogSG9tZSBwYWdlOgorICoJaHR0cDovL3d3dy5ld3MudWl1Yy5lZHUvfnNoYW9saXUvdGNwaWxsaW5vaXMvaW5kZXguaHRtbAorICoKKyAqIFRoZSBhbGdvcml0aG0gaXMgZGVzY3JpYmVkIGluOgorICogIlRDUC1JbGxpbm9pczogQSBMb3NzIGFuZCBEZWxheS1CYXNlZCBDb25nZXN0aW9uIENvbnRyb2wgQWxnb3JpdGhtCisgKiAgZm9yIEhpZ2gtU3BlZWQgTmV0d29ya3MiCisgKiBodHRwOi8vd3d3LmV3cy51aXVjLmVkdS9+c2hhb2xpdS9wYXBlcnNhbmRzbGlkZXMvbGl1YmFzc3JpMDZwZXJmLnBkZgorICoKKyAqIEltcGxlbWVudGVkIGZyb20gZGVzY3JpcHRpb24gaW4gcGFwZXIgYW5kIG5zLTIgc2ltdWxhdGlvbi4KKyAqIENvcHlyaWdodCAoQykgMjAwNyBTdGVwaGVuIEhlbW1pbmdlciA8c2hlbW1pbmdlckBsaW51eC1mb3VuZGF0aW9uLm9yZz4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaW5ldF9kaWFnLmg+CisjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CisjaW5jbHVkZSA8bmV0L3RjcC5oPgorCisjZGVmaW5lIEFMUEhBX1NISUZUCTcKKyNkZWZpbmUgQUxQSEFfU0NBTEUJKDF1PDxBTFBIQV9TSElGVCkKKyNkZWZpbmUgQUxQSEFfTUlOCSgoMypBTFBIQV9TQ0FMRSkvMTApCS8qIH4wLjMgKi8KKyNkZWZpbmUgQUxQSEFfTUFYCSgxMCpBTFBIQV9TQ0FMRSkJLyogMTAuMCAqLworI2RlZmluZSBBTFBIQV9CQVNFCUFMUEhBX1NDQUxFCQkvKiAxLjAgKi8KKyNkZWZpbmUgVTMyX01BWAkJKCh1MzIpfjBVKQorI2RlZmluZSBSVFRfTUFYCQkoVTMyX01BWCAvIEFMUEhBX01BWCkJLyogMy4zIHNlY3MgKi8KKworI2RlZmluZSBCRVRBX1NISUZUCTYKKyNkZWZpbmUgQkVUQV9TQ0FMRQkoMXU8PEJFVEFfU0hJRlQpCisjZGVmaW5lIEJFVEFfTUlOCShCRVRBX1NDQUxFLzgpCQkvKiAwLjEyNSAqLworI2RlZmluZSBCRVRBX01BWAkoQkVUQV9TQ0FMRS8yKQkJLyogMC41ICovCisjZGVmaW5lIEJFVEFfQkFTRQlCRVRBX01BWAorCitzdGF0aWMgaW50IHdpbl90aHJlc2ggX19yZWFkX21vc3RseSA9IDE1OworbW9kdWxlX3BhcmFtKHdpbl90aHJlc2gsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHdpbl90aHJlc2gsICJXaW5kb3cgdGhyZXNob2xkIGZvciBzdGFydGluZyBhZGFwdGl2ZSBzaXppbmciKTsKKworc3RhdGljIGludCB0aGV0YSBfX3JlYWRfbW9zdGx5ID0gNTsKK21vZHVsZV9wYXJhbSh0aGV0YSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0ModGhldGEsICIjIG9mIGZhc3QgUlRUJ3MgYmVmb3JlIGZ1bGwgZ3Jvd3RoIik7CisKKy8qIFRDUCBJbGxpbm9pcyBQYXJhbWV0ZXJzICovCitzdHJ1Y3QgaWxsaW5vaXMgeworCXU2NAlzdW1fcnR0OwkvKiBzdW0gb2YgcnR0J3MgbWVhc3VyZWQgd2l0aGluIGxhc3QgcnR0ICovCisJdTE2CWNudF9ydHQ7CS8qICMgb2YgcnR0cyBtZWFzdXJlZCB3aXRoaW4gbGFzdCBydHQgKi8KKwl1MzIJYmFzZV9ydHQ7CS8qIG1pbiBvZiBhbGwgcnR0IGluIHVzZWMgKi8KKwl1MzIJbWF4X3J0dDsJLyogbWF4IG9mIGFsbCBydHQgaW4gdXNlYyAqLworCXUzMgllbmRfc2VxOwkvKiByaWdodCBlZGdlIG9mIGN1cnJlbnQgUlRUICovCisJdTMyCWFscGhhOwkJLyogQWRkaXRpdmUgaW5jcmVhc2UgKi8KKwl1MzIJYmV0YTsJCS8qIE11bGlwbGljYXRpdmUgZGVjcmVhc2UgKi8KKwl1MTYJYWNrZWQ7CQkvKiAjIHBhY2tldHMgYWNrZWQgYnkgY3VycmVudCBBQ0sgKi8KKwl1OAlydHRfYWJvdmU7CS8qIGF2ZXJhZ2UgcnR0IGhhcyBnb25lIGFib3ZlIHRocmVzaG9sZCAqLworCXU4CXJ0dF9sb3c7CS8qICMgb2YgcnR0cyBtZWFzdXJlbWVudHMgYmVsb3cgdGhyZXNob2xkICovCit9OworCitzdGF0aWMgdm9pZCBydHRfcmVzZXQoc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCXN0cnVjdCBpbGxpbm9pcyAqY2EgPSBpbmV0X2Nza19jYShzayk7CisKKwljYS0+ZW5kX3NlcSA9IHRwLT5zbmRfbnh0OworCWNhLT5jbnRfcnR0ID0gMDsKKwljYS0+c3VtX3J0dCA9IDA7CisKKwkvKiBUT0RPOiBhZ2UgbWF4X3J0dD8gKi8KK30KKworc3RhdGljIHZvaWQgdGNwX2lsbGlub2lzX2luaXQoc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCBpbGxpbm9pcyAqY2EgPSBpbmV0X2Nza19jYShzayk7CisKKwljYS0+YWxwaGEgPSBBTFBIQV9NQVg7CisJY2EtPmJldGEgPSBCRVRBX0JBU0U7CisJY2EtPmJhc2VfcnR0ID0gMHg3ZmZmZmZmZjsKKwljYS0+bWF4X3J0dCA9IDA7CisKKwljYS0+YWNrZWQgPSAwOworCWNhLT5ydHRfbG93ID0gMDsKKwljYS0+cnR0X2Fib3ZlID0gMDsKKworCXJ0dF9yZXNldChzayk7Cit9CisKKy8qIE1lYXN1cmUgUlRUIGZvciBlYWNoIGFjay4gKi8KK3N0YXRpYyB2b2lkIHRjcF9pbGxpbm9pc19hY2tlZChzdHJ1Y3Qgc29jayAqc2ssIHUzMiBwa3RzX2Fja2VkLCBrdGltZV90IGxhc3QpCit7CisJc3RydWN0IGlsbGlub2lzICpjYSA9IGluZXRfY3NrX2NhKHNrKTsKKwl1MzIgcnR0OworCisJY2EtPmFja2VkID0gcGt0c19hY2tlZDsKKworCXJ0dCA9IGt0aW1lX3RvX3VzKG5ldF90aW1lZGVsdGEobGFzdCkpOworCisJLyogaWdub3JlIGJvZ3VzIHZhbHVlcywgdGhpcyBwcmV2ZW50cyB3cmFwYXJvdW5kIGluIGFscGhhIG1hdGggKi8KKwlpZiAocnR0ID4gUlRUX01BWCkKKwkJcnR0ID0gUlRUX01BWDsKKworCS8qIGtlZXAgdHJhY2sgb2YgbWluaW11bSBSVFQgc2VlbiBzbyBmYXIgKi8KKwlpZiAoY2EtPmJhc2VfcnR0ID4gcnR0KQorCQljYS0+YmFzZV9ydHQgPSBydHQ7CisKKwkvKiBhbmQgbWF4ICovCisJaWYgKGNhLT5tYXhfcnR0IDwgcnR0KQorCQljYS0+bWF4X3J0dCA9IHJ0dDsKKworCSsrY2EtPmNudF9ydHQ7CisJY2EtPnN1bV9ydHQgKz0gcnR0OworfQorCisvKiBNYXhpbXVtIHF1ZXVpbmcgZGVsYXkgKi8KK3N0YXRpYyBpbmxpbmUgdTMyIG1heF9kZWxheShjb25zdCBzdHJ1Y3QgaWxsaW5vaXMgKmNhKQoreworCXJldHVybiBjYS0+bWF4X3J0dCAtIGNhLT5iYXNlX3J0dDsKK30KKworLyogQXZlcmFnZSBxdWV1aW5nIGRlbGF5ICovCitzdGF0aWMgaW5saW5lIHUzMiBhdmdfZGVsYXkoY29uc3Qgc3RydWN0IGlsbGlub2lzICpjYSkKK3sKKwl1NjQgdCA9IGNhLT5zdW1fcnR0OworCisJZG9fZGl2KHQsIGNhLT5jbnRfcnR0KTsKKwlyZXR1cm4gdCAtIGNhLT5iYXNlX3J0dDsKK30KKworLyoKKyAqIENvbXB1dGUgdmFsdWUgb2YgYWxwaGEgdXNlZCBmb3IgYWRkaXRpdmUgaW5jcmVhc2UuCisgKiBJZiBzbWFsbCB3aW5kb3cgdGhlbiB1c2UgMS4wLCBlcXVpdmFsZW50IHRvIFJlbm8uCisgKgorICogRm9yIGxhcmdlciB3aW5kb3dzLCBhZGp1c3QgYmFzZWQgb24gYXZlcmFnZSBkZWxheS4KKyAqIEEuIElmIGF2ZXJhZ2UgZGVsYXkgaXMgYXQgbWluaW11bSAod2UgYXJlIHVuY29uZ2VzdGVkKSwKKyAqICAgIHRoZW4gdXNlIGxhcmdlIGFscGhhICgxMC4wKSB0byBpbmNyZWFzZSBmYXN0ZXIuCisgKiBCLiBJZiBhdmVyYWdlIGRlbGF5IGlzIGF0IG1heGltdW0gKGdldHRpbmcgY29uZ2VzdGVkKQorICogICAgdGhlbiB1c2Ugc21hbGwgYWxwaGEgKDAuMykKKyAqCisgKiBUaGUgcmVzdWx0IGlzIGEgY29udmV4IHdpbmRvdyBncm93dGggY3VydmUuCisgKi8KK3N0YXRpYyB1MzIgYWxwaGEoc3RydWN0IGlsbGlub2lzICpjYSwgdTMyIGRhLCB1MzIgZG0pCit7CisJdTMyIGQxID0gZG0gLyAxMDA7CS8qIExvdyB0aHJlc2hvbGQgKi8KKworCWlmIChkYSA8PSBkMSkgeworCQkvKiBJZiBuZXZlciBnb3Qgb3V0IG9mIGxvdyBkZWxheSB6b25lLCB0aGVuIHVzZSBtYXggKi8KKwkJaWYgKCFjYS0+cnR0X2Fib3ZlKQorCQkJcmV0dXJuIEFMUEhBX01BWDsKKworCQkvKiBXYWl0IGZvciA1IGdvb2QgUlRUJ3MgYmVmb3JlIGFsbG93aW5nIGFscGhhIHRvIGdvIGFscGhhIG1heC4KKwkJICogVGhpcyBwcmV2ZW50cyBvbmUgZ29vZCBSVFQgZnJvbSBjYXVzaW5nIHN1ZGRlbiB3aW5kb3cgaW5jcmVhc2UuCisJCSAqLworCQlpZiAoKytjYS0+cnR0X2xvdyA8IHRoZXRhKQorCQkJcmV0dXJuIGNhLT5hbHBoYTsKKworCQljYS0+cnR0X2xvdyA9IDA7CisJCWNhLT5ydHRfYWJvdmUgPSAwOworCQlyZXR1cm4gQUxQSEFfTUFYOworCX0KKworCWNhLT5ydHRfYWJvdmUgPSAxOworCisJLyoKKwkgKiBCYXNlZCBvbjoKKwkgKgorCSAqICAgICAgKGRtIC0gZDEpIGFtaW4gYW1heAorCSAqIGsxID0gLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAqICAgICAgICAgYW1heCAtIGFtaW4KKwkgKgorCSAqICAgICAgIChkbSAtIGQxKSBhbWluCisJICogazIgPSAtLS0tLS0tLS0tLS0tLS0tICAtIGQxCisJICogICAgICAgIGFtYXggLSBhbWluCisJICoKKwkgKiAgICAgICAgICAgICBrMQorCSAqIGFscGhhID0gLS0tLS0tLS0tLQorCSAqICAgICAgICAgIGsyICsgZGEKKwkgKi8KKworCWRtIC09IGQxOworCWRhIC09IGQxOworCXJldHVybiAoZG0gKiBBTFBIQV9NQVgpIC8KKwkJKGRtICsgKGRhICAqIChBTFBIQV9NQVggLSBBTFBIQV9NSU4pKSAvIEFMUEhBX01JTik7Cit9CisKKy8qCisgKiBCZXRhIHVzZWQgZm9yIG11bHRpcGxpY2F0aXZlIGRlY3JlYXNlLgorICogRm9yIHNtYWxsIHdpbmRvdyBzaXplcyByZXR1cm5zIHNhbWUgdmFsdWUgYXMgUmVubyAoMC41KQorICoKKyAqIElmIGRlbGF5IGlzIHNtYWxsICgxMCUgb2YgbWF4KSB0aGVuIGJldGEgPSAxLzgKKyAqIElmIGRlbGF5IGlzIHVwIHRvIDgwJSBvZiBtYXggdGhlbiBiZXRhID0gMS8yCisgKiBJbiBiZXR3ZWVuIGlzIGEgbGluZWFyIGZ1bmN0aW9uCisgKi8KK3N0YXRpYyB1MzIgYmV0YSh1MzIgZGEsIHUzMiBkbSkKK3sKKwl1MzIgZDIsIGQzOworCisJZDIgPSBkbSAvIDEwOworCWlmIChkYSA8PSBkMikKKwkJcmV0dXJuIEJFVEFfTUlOOworCisJZDMgPSAoOCAqIGRtKSAvIDEwOworCWlmIChkYSA+PSBkMyB8fCBkMyA8PSBkMikKKwkJcmV0dXJuIEJFVEFfTUFYOworCisJLyoKKwkgKiBCYXNlZCBvbjoKKwkgKgorCSAqICAgICAgIGJtaW4gZDMgLSBibWF4IGQyCisJICogazMgPSAtLS0tLS0tLS0tLS0tLS0tLS0tCisJICogICAgICAgICBkMyAtIGQyCisJICoKKwkgKiAgICAgICBibWF4IC0gYm1pbgorCSAqIGs0ID0gLS0tLS0tLS0tLS0tLQorCSAqICAgICAgICAgZDMgLSBkMgorCSAqCisJICogYiA9IGszICsgazQgZGEKKwkgKi8KKwlyZXR1cm4gKEJFVEFfTUlOICogZDMgLSBCRVRBX01BWCAqIGQyICsgKEJFVEFfTUFYIC0gQkVUQV9NSU4pICogZGEpCisJCS8gKGQzIC0gZDIpOworfQorCisvKiBVcGRhdGUgYWxwaGEgYW5kIGJldGEgdmFsdWVzIG9uY2UgcGVyIFJUVCAqLworc3RhdGljIHZvaWQgdXBkYXRlX3BhcmFtcyhzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisJc3RydWN0IGlsbGlub2lzICpjYSA9IGluZXRfY3NrX2NhKHNrKTsKKworCWlmICh0cC0+c25kX2N3bmQgPCB3aW5fdGhyZXNoKSB7CisJCWNhLT5hbHBoYSA9IEFMUEhBX0JBU0U7CisJCWNhLT5iZXRhID0gQkVUQV9CQVNFOworCX0gZWxzZSBpZiAoY2EtPmNudF9ydHQgPiAwKSB7CisJCXUzMiBkbSA9IG1heF9kZWxheShjYSk7CisJCXUzMiBkYSA9IGF2Z19kZWxheShjYSk7CisKKwkJY2EtPmFscGhhID0gYWxwaGEoY2EsIGRhLCBkbSk7CisJCWNhLT5iZXRhID0gYmV0YShkYSwgZG0pOworCX0KKworCXJ0dF9yZXNldChzayk7Cit9CisKKy8qCisgKiBJbiBjYXNlIG9mIGxvc3MsIHJlc2V0IHRvIGRlZmF1bHQgdmFsdWVzCisgKi8KK3N0YXRpYyB2b2lkIHRjcF9pbGxpbm9pc19zdGF0ZShzdHJ1Y3Qgc29jayAqc2ssIHU4IG5ld19zdGF0ZSkKK3sKKwlzdHJ1Y3QgaWxsaW5vaXMgKmNhID0gaW5ldF9jc2tfY2Eoc2spOworCisJaWYgKG5ld19zdGF0ZSA9PSBUQ1BfQ0FfTG9zcykgeworCQljYS0+YWxwaGEgPSBBTFBIQV9CQVNFOworCQljYS0+YmV0YSA9IEJFVEFfQkFTRTsKKwkJY2EtPnJ0dF9sb3cgPSAwOworCQljYS0+cnR0X2Fib3ZlID0gMDsKKwkJcnR0X3Jlc2V0KHNrKTsKKwl9Cit9CisKKy8qCisgKiBJbmNyZWFzZSB3aW5kb3cgaW4gcmVzcG9uc2UgdG8gc3VjY2Vzc2Z1bCBhY2tub3dsZWRnbWVudC4KKyAqLworc3RhdGljIHZvaWQgdGNwX2lsbGlub2lzX2NvbmdfYXZvaWQoc3RydWN0IHNvY2sgKnNrLCB1MzIgYWNrLCB1MzIgcnR0LAorCQkJCSAgICB1MzIgaW5fZmxpZ2h0LCBpbnQgZmxhZykKK3sKKwlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKwlzdHJ1Y3QgaWxsaW5vaXMgKmNhID0gaW5ldF9jc2tfY2Eoc2spOworCisJaWYgKGFmdGVyKGFjaywgY2EtPmVuZF9zZXEpKQorCQl1cGRhdGVfcGFyYW1zKHNrKTsKKworCS8qIFJGQzI4NjEgb25seSBpbmNyZWFzZSBjd25kIGlmIGZ1bGx5IHV0aWxpemVkICovCisJaWYgKCF0Y3BfaXNfY3duZF9saW1pdGVkKHNrLCBpbl9mbGlnaHQpKQorCQlyZXR1cm47CisKKwkvKiBJbiBzbG93IHN0YXJ0ICovCisJaWYgKHRwLT5zbmRfY3duZCA8PSB0cC0+c25kX3NzdGhyZXNoKQorCQl0Y3Bfc2xvd19zdGFydCh0cCk7CisKKwllbHNlIHsKKwkJdTMyIGRlbHRhOworCisJCS8qIHNuZF9jd25kX2NudCBpcyAjIG9mIHBhY2tldHMgc2luY2UgbGFzdCBjd25kIGluY3JlbWVudCAqLworCQl0cC0+c25kX2N3bmRfY250ICs9IGNhLT5hY2tlZDsKKwkJY2EtPmFja2VkID0gMTsKKworCQkvKiBUaGlzIGlzIGNsb3NlIGFwcHJveGltYXRpb24gb2Y6CisJCSAqIHRwLT5zbmRfY3duZCArPSBhbHBoYS90cC0+c25kX2N3bmQKKwkJKi8KKwkJZGVsdGEgPSAodHAtPnNuZF9jd25kX2NudCAqIGNhLT5hbHBoYSkgPj4gQUxQSEFfU0hJRlQ7CisJCWlmIChkZWx0YSA+PSB0cC0+c25kX2N3bmQpIHsKKwkJCXRwLT5zbmRfY3duZCA9IG1pbih0cC0+c25kX2N3bmQgKyBkZWx0YSAvIHRwLT5zbmRfY3duZCwKKwkJCQkJICAgKHUzMikgdHAtPnNuZF9jd25kX2NsYW1wKTsKKwkJCXRwLT5zbmRfY3duZF9jbnQgPSAwOworCQl9CisJfQorfQorCitzdGF0aWMgdTMyIHRjcF9pbGxpbm9pc19zc3RocmVzaChzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisJc3RydWN0IGlsbGlub2lzICpjYSA9IGluZXRfY3NrX2NhKHNrKTsKKworCS8qIE11bHRpcGxpY2F0aXZlIGRlY3JlYXNlICovCisJcmV0dXJuIG1heCgodHAtPnNuZF9jd25kICogY2EtPmJldGEpID4+IEJFVEFfU0hJRlQsIDJVKTsKK30KKworCisvKiBFeHRyYWN0IGluZm8gZm9yIFRjcCBzb2NrZXQgaW5mbyBwcm92aWRlZCB2aWEgbmV0bGluay4gKi8KK3N0YXRpYyB2b2lkIHRjcF9pbGxpbm9pc19pbmZvKHN0cnVjdCBzb2NrICpzaywgdTMyIGV4dCwKKwkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJY29uc3Qgc3RydWN0IGlsbGlub2lzICpjYSA9IGluZXRfY3NrX2NhKHNrKTsKKworCWlmIChleHQgJiAoMSA8PCAoSU5FVF9ESUFHX1ZFR0FTSU5GTyAtIDEpKSkgeworCQlzdHJ1Y3QgdGNwdmVnYXNfaW5mbyBpbmZvID0geworCQkJLnRjcHZfZW5hYmxlZCA9IDEsCisJCQkudGNwdl9ydHRjbnQgPSBjYS0+Y250X3J0dCwKKwkJCS50Y3B2X21pbnJ0dCA9IGNhLT5iYXNlX3J0dCwKKwkJfTsKKwkJdTY0IHQgPSBjYS0+c3VtX3J0dDsKKworCQlkb19kaXYodCwgY2EtPmNudF9ydHQpOworCQlpbmZvLnRjcHZfcnR0ID0gdDsKKworCQlubGFfcHV0KHNrYiwgSU5FVF9ESUFHX1ZFR0FTSU5GTywgc2l6ZW9mKGluZm8pLCAmaW5mbyk7CisJfQorfQorCitzdGF0aWMgc3RydWN0IHRjcF9jb25nZXN0aW9uX29wcyB0Y3BfaWxsaW5vaXMgPSB7CisJLmZsYWdzCQk9IFRDUF9DT05HX1JUVF9TVEFNUCwKKwkuaW5pdAkJPSB0Y3BfaWxsaW5vaXNfaW5pdCwKKwkuc3N0aHJlc2gJPSB0Y3BfaWxsaW5vaXNfc3N0aHJlc2gsCisJLm1pbl9jd25kCT0gdGNwX3Jlbm9fbWluX2N3bmQsCisJLmNvbmdfYXZvaWQJPSB0Y3BfaWxsaW5vaXNfY29uZ19hdm9pZCwKKwkuc2V0X3N0YXRlCT0gdGNwX2lsbGlub2lzX3N0YXRlLAorCS5nZXRfaW5mbwk9IHRjcF9pbGxpbm9pc19pbmZvLAorCS5wa3RzX2Fja2VkCT0gdGNwX2lsbGlub2lzX2Fja2VkLAorCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJpbGxpbm9pcyIsCit9OworCitzdGF0aWMgaW50IF9faW5pdCB0Y3BfaWxsaW5vaXNfcmVnaXN0ZXIodm9pZCkKK3sKKwlCVUlMRF9CVUdfT04oc2l6ZW9mKHN0cnVjdCBpbGxpbm9pcykgPiBJQ1NLX0NBX1BSSVZfU0laRSk7CisJcmV0dXJuIHRjcF9yZWdpc3Rlcl9jb25nZXN0aW9uX2NvbnRyb2woJnRjcF9pbGxpbm9pcyk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB0Y3BfaWxsaW5vaXNfdW5yZWdpc3Rlcih2b2lkKQoreworCXRjcF91bnJlZ2lzdGVyX2Nvbmdlc3Rpb25fY29udHJvbCgmdGNwX2lsbGlub2lzKTsKK30KKworbW9kdWxlX2luaXQodGNwX2lsbGlub2lzX3JlZ2lzdGVyKTsKK21vZHVsZV9leGl0KHRjcF9pbGxpbm9pc191bnJlZ2lzdGVyKTsKKworTU9EVUxFX0FVVEhPUigiU3RlcGhlbiBIZW1taW5nZXIsIFNoYW8gTGl1Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlRDUCBJbGxpbm9pcyIpOworTU9EVUxFX1ZFUlNJT04oIjEuMCIpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwX2lucHV0LmMgYi9uZXQvaXB2NC90Y3BfaW5wdXQuYwppbmRleCAxYTE0MTkxLi43NjQxYjI3IDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3BfaW5wdXQuYworKysgYi9uZXQvaXB2NC90Y3BfaW5wdXQuYwpAQCAtODYsNiArODYsNyBAQAogaW50IHN5c2N0bF90Y3BfcmZjMTMzNyBfX3JlYWRfbW9zdGx5OwogaW50IHN5c2N0bF90Y3BfbWF4X29ycGhhbnMgX19yZWFkX21vc3RseSA9IE5SX0ZJTEU7CiBpbnQgc3lzY3RsX3RjcF9mcnRvIF9fcmVhZF9tb3N0bHk7CitpbnQgc3lzY3RsX3RjcF9mcnRvX3Jlc3BvbnNlIF9fcmVhZF9tb3N0bHk7CiBpbnQgc3lzY3RsX3RjcF9ub21ldHJpY3Nfc2F2ZSBfX3JlYWRfbW9zdGx5OwogCiBpbnQgc3lzY3RsX3RjcF9tb2RlcmF0ZV9yY3ZidWYgX19yZWFkX21vc3RseSA9IDE7CkBAIC0xMDAsNiArMTAxLDcgQEAKICNkZWZpbmUgRkxBR19FQ0UJCTB4NDAgLyogRUNFIGluIHRoaXMgQUNLCQkJCSovCiAjZGVmaW5lIEZMQUdfREFUQV9MT1NUCQkweDgwIC8qIFNBQ0sgZGV0ZWN0ZWQgZGF0YSBsb3NzYWdlLgkJKi8KICNkZWZpbmUgRkxBR19TTE9XUEFUSAkJMHgxMDAgLyogRG8gbm90IHNraXAgUkZDIGNoZWNrcyBmb3Igd2luZG93IHVwZGF0ZS4qLworI2RlZmluZSBGTEFHX09OTFlfT1JJR19TQUNLRUQJMHgyMDAgLyogU0FDS3Mgb25seSBub24tcmV4bWl0IHNlbnQgYmVmb3JlIFJUTyAqLwogCiAjZGVmaW5lIEZMQUdfQUNLRUQJCShGTEFHX0RBVEFfQUNLRUR8RkxBR19TWU5fQUNLRUQpCiAjZGVmaW5lIEZMQUdfTk9UX0RVUAkJKEZMQUdfREFUQXxGTEFHX1dJTl9VUERBVEV8RkxBR19BQ0tFRCkKQEAgLTExMCw2ICsxMTIsOCBAQAogI2RlZmluZSBJc0ZhY2sodHApICgodHApLT5yeF9vcHQuc2Fja19vayAmIDIpCiAjZGVmaW5lIElzRFNhY2sodHApICgodHApLT5yeF9vcHQuc2Fja19vayAmIDQpCiAKKyNkZWZpbmUgSXNTYWNrRnJ0bygpIChzeXNjdGxfdGNwX2ZydG8gPT0gMHgyKQorCiAjZGVmaW5lIFRDUF9SRU1OQU5UIChUQ1BfRkxBR19GSU58VENQX0ZMQUdfVVJHfFRDUF9GTEFHX1NZTnxUQ1BfRkxBR19QU0gpCiAKIC8qIEFkYXB0IHRoZSBNU1MgdmFsdWUgdXNlZCB0byBtYWtlIGRlbGF5ZWQgYWNrIGRlY2lzaW9uIHRvIHRoZQpAQCAtMTM2LDcgKzE0MCw3IEBACiAJCSAqCiAJCSAqICJsZW4iIGlzIGludmFyaWFudCBzZWdtZW50IGxlbmd0aCwgaW5jbHVkaW5nIFRDUCBoZWFkZXIuCiAJCSAqLwotCQlsZW4gKz0gc2tiLT5kYXRhIC0gc2tiLT5oLnJhdzsKKwkJbGVuICs9IHNrYi0+ZGF0YSAtIHNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYik7CiAJCWlmIChsZW4gPj0gVENQX01JTl9SQ1ZNU1MgKyBzaXplb2Yoc3RydWN0IHRjcGhkcikgfHwKIAkJICAgIC8qIElmIFBTSCBpcyBub3Qgc2V0LCBwYWNrZXQgc2hvdWxkIGJlCiAJCSAgICAgKiBmdWxsIHNpemVkLCBwcm92aWRlZCBwZWVyIFRDUCBpcyBub3QgYmFkbHkgYnJva2VuLgpAQCAtMTQ0LDcgKzE0OCw3IEBACiAJCSAgICAgKiB0byBoYW5kbGUgc3VwZXItbG93IG10dSBsaW5rcyBmYWlybHkuCiAJCSAgICAgKi8KIAkJICAgIChsZW4gPj0gVENQX01JTl9NU1MgKyBzaXplb2Yoc3RydWN0IHRjcGhkcikgJiYKLQkJICAgICAhKHRjcF9mbGFnX3dvcmQoc2tiLT5oLnRoKSZUQ1BfUkVNTkFOVCkpKSB7CisJCSAgICAgISh0Y3BfZmxhZ193b3JkKHRjcF9oZHIoc2tiKSkgJiBUQ1BfUkVNTkFOVCkpKSB7CiAJCQkvKiBTdWJ0cmFjdCBhbHNvIGludmFyaWFudCAoaWYgcGVlciBpcyBSRkMgY29tcGxpYW50KSwKIAkJCSAqIHRjcCBoZWFkZXIgcGx1cyBmaXhlZCB0aW1lc3RhbXAgb3B0aW9uIGxlbmd0aC4KIAkJCSAqIFJlc3VsdGluZyAibGVuIiBpcyBNU1MgZnJlZSBvZiBTQUNLIGppdHRlci4KQEAgLTIzMSw5ICsyMzUsOSBAQAogICovCiAKIC8qIFNsb3cgcGFydCBvZiBjaGVjayMyLiAqLwotc3RhdGljIGludCBfX3RjcF9ncm93X3dpbmRvdyhjb25zdCBzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCB0Y3Bfc29jayAqdHAsCi0JCQkgICAgIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCitzdGF0aWMgaW50IF9fdGNwX2dyb3dfd2luZG93KGNvbnN0IHN0cnVjdCBzb2NrICpzaywgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKKwlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKIAkvKiBPcHRpbWl6ZSB0aGlzISAqLwogCWludCB0cnVlc2l6ZSA9IHRjcF93aW5fZnJvbV9zcGFjZShza2ItPnRydWVzaXplKS8yOwogCWludCB3aW5kb3cgPSB0Y3Bfd2luX2Zyb21fc3BhY2Uoc3lzY3RsX3RjcF9ybWVtWzJdKS8yOwpAQCAtMjQ4LDkgKzI1MiwxMSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCB0Y3BfZ3Jvd193aW5kb3coc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgdGNwX3NvY2sgKnRwLAorc3RhdGljIHZvaWQgdGNwX2dyb3dfd2luZG93KHN0cnVjdCBzb2NrICpzaywKIAkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogeworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCiAJLyogQ2hlY2sgIzEgKi8KIAlpZiAodHAtPnJjdl9zc3RocmVzaCA8IHRwLT53aW5kb3dfY2xhbXAgJiYKIAkgICAgKGludCl0cC0+cmN2X3NzdGhyZXNoIDwgdGNwX3NwYWNlKHNrKSAmJgpAQCAtMjYzLDcgKzI2OSw3IEBACiAJCWlmICh0Y3Bfd2luX2Zyb21fc3BhY2Uoc2tiLT50cnVlc2l6ZSkgPD0gc2tiLT5sZW4pCiAJCQlpbmNyID0gMip0cC0+YWR2bXNzOwogCQllbHNlCi0JCQlpbmNyID0gX190Y3BfZ3Jvd193aW5kb3coc2ssIHRwLCBza2IpOworCQkJaW5jciA9IF9fdGNwX2dyb3dfd2luZG93KHNrLCBza2IpOwogCiAJCWlmIChpbmNyKSB7CiAJCQl0cC0+cmN2X3NzdGhyZXNoID0gbWluKHRwLT5yY3Zfc3N0aHJlc2ggKyBpbmNyLCB0cC0+d2luZG93X2NsYW1wKTsKQEAgLTMyNiw4ICszMzIsOSBAQAogfQogCiAvKiA1LiBSZWNhbGN1bGF0ZSB3aW5kb3cgY2xhbXAgYWZ0ZXIgc29ja2V0IGhpdCBpdHMgbWVtb3J5IGJvdW5kcy4gKi8KLXN0YXRpYyB2b2lkIHRjcF9jbGFtcF93aW5kb3coc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgdGNwX3NvY2sgKnRwKQorc3RhdGljIHZvaWQgdGNwX2NsYW1wX3dpbmRvdyhzdHJ1Y3Qgc29jayAqc2spCiB7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CiAJc3RydWN0IGluZXRfY29ubmVjdGlvbl9zb2NrICppY3NrID0gaW5ldF9jc2soc2spOwogCiAJaWNzay0+aWNza19hY2sucXVpY2sgPSAwOwpAQCAtNDk5LDggKzUwNiw5IEBACiAgKiBlYWNoIEFDSyB3ZSBzZW5kLCBoZSBpbmNyZW1lbnRzIHNuZF9jd25kIGFuZCB0cmFuc21pdHMgbW9yZSBvZiBoaXMKICAqIHF1ZXVlLiAgLURhdmVNCiAgKi8KLXN0YXRpYyB2b2lkIHRjcF9ldmVudF9kYXRhX3JlY3Yoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgdGNwX3NvY2sgKnRwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorc3RhdGljIHZvaWQgdGNwX2V2ZW50X2RhdGFfcmVjdihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCiB7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CiAJc3RydWN0IGluZXRfY29ubmVjdGlvbl9zb2NrICppY3NrID0gaW5ldF9jc2soc2spOwogCXUzMiBub3c7CiAKQEAgLTU0MSw3ICs1NDksNyBAQAogCVRDUF9FQ05fY2hlY2tfY2UodHAsIHNrYik7CiAKIAlpZiAoc2tiLT5sZW4gPj0gMTI4KQotCQl0Y3BfZ3Jvd193aW5kb3coc2ssIHRwLCBza2IpOworCQl0Y3BfZ3Jvd193aW5kb3coc2ssIHNrYik7CiB9CiAKIC8qIENhbGxlZCB0byBjb21wdXRlIGEgc21vb3RoZWQgcnR0IGVzdGltYXRlLiBUaGUgZGF0YSBmZWQgdG8gdGhpcwpAQCAtNTc0LDcgKzU4Miw3IEBACiAJICogZG9lcyBub3QgbWF0dGVyIGhvdyB0byBfY2FsY3VsYXRlXyBpdC4gU2VlbXMsIGl0IHdhcyB0cmFwCiAJICogdGhhdCBWSiBmYWlsZWQgdG8gYXZvaWQuIDgpCiAJICovCi0JaWYobSA9PSAwKQorCWlmIChtID09IDApCiAJCW0gPSAxOwogCWlmICh0cC0+c3J0dCAhPSAwKSB7CiAJCW0gLT0gKHRwLT5zcnR0ID4+IDMpOwkvKiBtIGlzIG5vdyBlcnJvciBpbiBydHQgZXN0ICovCkBAIC03NTksMTUgKzc2NywxNyBAQAogfQogCiAvKiBTZXQgc2xvdyBzdGFydCB0aHJlc2hvbGQgYW5kIGN3bmQgbm90IGZhbGxpbmcgdG8gc2xvdyBzdGFydCAqLwotdm9pZCB0Y3BfZW50ZXJfY3dyKHN0cnVjdCBzb2NrICpzaykKK3ZvaWQgdGNwX2VudGVyX2N3cihzdHJ1Y3Qgc29jayAqc2ssIGNvbnN0IGludCBzZXRfc3N0aHJlc2gpCiB7CiAJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisJY29uc3Qgc3RydWN0IGluZXRfY29ubmVjdGlvbl9zb2NrICppY3NrID0gaW5ldF9jc2soc2spOwogCiAJdHAtPnByaW9yX3NzdGhyZXNoID0gMDsKIAl0cC0+Ynl0ZXNfYWNrZWQgPSAwOwotCWlmIChpbmV0X2NzayhzayktPmljc2tfY2Ffc3RhdGUgPCBUQ1BfQ0FfQ1dSKSB7CisJaWYgKGljc2stPmljc2tfY2Ffc3RhdGUgPCBUQ1BfQ0FfQ1dSKSB7CiAJCXRwLT51bmRvX21hcmtlciA9IDA7Ci0JCXRwLT5zbmRfc3N0aHJlc2ggPSBpbmV0X2NzayhzayktPmljc2tfY2Ffb3BzLT5zc3RocmVzaChzayk7CisJCWlmIChzZXRfc3N0aHJlc2gpCisJCQl0cC0+c25kX3NzdGhyZXNoID0gaWNzay0+aWNza19jYV9vcHMtPnNzdGhyZXNoKHNrKTsKIAkJdHAtPnNuZF9jd25kID0gbWluKHRwLT5zbmRfY3duZCwKIAkJCQkgICB0Y3BfcGFja2V0c19pbl9mbGlnaHQodHApICsgMVUpOwogCQl0cC0+c25kX2N3bmRfY250ID0gMDsKQEAgLTkzNCw3ICs5NDQsOCBAQAogewogCWNvbnN0IHN0cnVjdCBpbmV0X2Nvbm5lY3Rpb25fc29jayAqaWNzayA9IGluZXRfY3NrKHNrKTsKIAlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKLQl1bnNpZ25lZCBjaGFyICpwdHIgPSBhY2tfc2tiLT5oLnJhdyArIFRDUF9TS0JfQ0IoYWNrX3NrYiktPnNhY2tlZDsKKwl1bnNpZ25lZCBjaGFyICpwdHIgPSAoc2tiX3RyYW5zcG9ydF9oZWFkZXIoYWNrX3NrYikgKworCQkJICAgICAgVENQX1NLQl9DQihhY2tfc2tiKS0+c2Fja2VkKTsKIAlzdHJ1Y3QgdGNwX3NhY2tfYmxvY2tfd2lyZSAqc3AgPSAoc3RydWN0IHRjcF9zYWNrX2Jsb2NrX3dpcmUgKikocHRyKzIpOwogCXN0cnVjdCBza19idWZmICpjYWNoZWRfc2tiOwogCWludCBudW1fc2Fja3MgPSAocHRyWzFdIC0gVENQT0xFTl9TQUNLX0JBU0UpPj4zOwpAQCAtMTAzOCw3ICsxMDQ5LDcgQEAKIAljYWNoZWRfc2tiID0gdHAtPmZhc3RwYXRoX3NrYl9oaW50OwogCWNhY2hlZF9mYWNrX2NvdW50ID0gdHAtPmZhc3RwYXRoX2NudF9oaW50OwogCWlmICghY2FjaGVkX3NrYikgewotCQljYWNoZWRfc2tiID0gc2stPnNrX3dyaXRlX3F1ZXVlLm5leHQ7CisJCWNhY2hlZF9za2IgPSB0Y3Bfd3JpdGVfcXVldWVfaGVhZChzayk7CiAJCWNhY2hlZF9mYWNrX2NvdW50ID0gMDsKIAl9CiAKQEAgLTEwNTUsMTAgKzEwNjYsMTMgQEAKIAkJaWYgKGFmdGVyKGVuZF9zZXEsIHRwLT5oaWdoX3NlcSkpCiAJCQlmbGFnIHw9IEZMQUdfREFUQV9MT1NUOwogCi0JCXNrX3N0cmVhbV9mb3JfcmV0cmFuc19xdWV1ZV9mcm9tKHNrYiwgc2spIHsKKwkJdGNwX2Zvcl93cml0ZV9xdWV1ZV9mcm9tKHNrYiwgc2spIHsKIAkJCWludCBpbl9zYWNrLCBwY291bnQ7CiAJCQl1OCBzYWNrZWQ7CiAKKwkJCWlmIChza2IgPT0gdGNwX3NlbmRfaGVhZChzaykpCisJCQkJYnJlYWs7CisKIAkJCWNhY2hlZF9za2IgPSBza2I7CiAJCQljYWNoZWRfZmFja19jb3VudCA9IGZhY2tfY291bnQ7CiAJCQlpZiAoaSA9PSBmaXJzdF9zYWNrX2luZGV4KSB7CkBAIC0xMTU5LDYgKzExNzMsMTggQEAKIAkJCQkJCS8qIGNsZWFyIGxvc3QgaGludCAqLwogCQkJCQkJdHAtPnJldHJhbnNtaXRfc2tiX2hpbnQgPSBOVUxMOwogCQkJCQl9CisJCQkJCS8qIFNBQ0sgZW5oYW5jZWQgRi1SVE8gZGV0ZWN0aW9uLgorCQkJCQkgKiBTZXQgZmxhZyBpZiBhbmQgb25seSBpZiBub24tcmV4bWl0dGVkCisJCQkJCSAqIHNlZ21lbnRzIGJlbG93IGZydG9faGlnaG1hcmsgYXJlCisJCQkJCSAqIFNBQ0tlZCAoUkZDNDEzODsgQXBwZW5kaXggQikuCisJCQkJCSAqIENsZWFyaW5nIGNvcnJlY3QgZHVlIHRvIGluLW9yZGVyIHdhbGsKKwkJCQkJICovCisJCQkJCWlmIChhZnRlcihlbmRfc2VxLCB0cC0+ZnJ0b19oaWdobWFyaykpIHsKKwkJCQkJCWZsYWcgJj0gfkZMQUdfT05MWV9PUklHX1NBQ0tFRDsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWlmICghKHNhY2tlZCAmIFRDUENCX1JFVFJBTlMpKQorCQkJCQkJCWZsYWcgfD0gRkxBR19PTkxZX09SSUdfU0FDS0VEOworCQkJCQl9CiAJCQkJfQogCiAJCQkJVENQX1NLQl9DQihza2IpLT5zYWNrZWQgfD0gVENQQ0JfU0FDS0VEX0FDS0VEOwpAQCAtMTE5NSw3ICsxMjIxLDkgQEAKIAlpZiAobG9zdF9yZXRyYW5zICYmIGljc2stPmljc2tfY2Ffc3RhdGUgPT0gVENQX0NBX1JlY292ZXJ5KSB7CiAJCXN0cnVjdCBza19idWZmICpza2I7CiAKLQkJc2tfc3RyZWFtX2Zvcl9yZXRyYW5zX3F1ZXVlKHNrYiwgc2spIHsKKwkJdGNwX2Zvcl93cml0ZV9xdWV1ZShza2IsIHNrKSB7CisJCQlpZiAoc2tiID09IHRjcF9zZW5kX2hlYWQoc2spKQorCQkJCWJyZWFrOwogCQkJaWYgKGFmdGVyKFRDUF9TS0JfQ0Ioc2tiKS0+c2VxLCBsb3N0X3JldHJhbnMpKQogCQkJCWJyZWFrOwogCQkJaWYgKCFhZnRlcihUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXEsIHRwLT5zbmRfdW5hKSkKQEAgLTEyMjQsNyArMTI1Miw4IEBACiAKIAl0cC0+bGVmdF9vdXQgPSB0cC0+c2Fja2VkX291dCArIHRwLT5sb3N0X291dDsKIAotCWlmICgocmVvcmQgPCB0cC0+ZmFja2V0c19vdXQpICYmIGljc2stPmljc2tfY2Ffc3RhdGUgIT0gVENQX0NBX0xvc3MpCisJaWYgKChyZW9yZCA8IHRwLT5mYWNrZXRzX291dCkgJiYgaWNzay0+aWNza19jYV9zdGF0ZSAhPSBUQ1BfQ0FfTG9zcyAmJgorCSAgICAoIXRwLT5mcnRvX2hpZ2htYXJrIHx8IGFmdGVyKHRwLT5zbmRfdW5hLCB0cC0+ZnJ0b19oaWdobWFyaykpKQogCQl0Y3BfdXBkYXRlX3Jlb3JkZXJpbmcoc2ssICgodHAtPmZhY2tldHNfb3V0ICsgMSkgLSByZW9yZCksIDApOwogCiAjaWYgRkFTVFJFVFJBTlNfREVCVUcgPiAwCkBAIC0xMjM2LDkgKzEyNjUsNDkgQEAKIAlyZXR1cm4gZmxhZzsKIH0KIAotLyogUlRPIG9jY3VycmVkLCBidXQgZG8gbm90IHlldCBlbnRlciBsb3NzIHN0YXRlLiBJbnN0ZWFkLCB0cmFuc21pdCB0d28gbmV3Ci0gKiBzZWdtZW50cyB0byBzZWUgZnJvbSB0aGUgbmV4dCBBQ0tzIHdoZXRoZXIgYW55IGRhdGEgd2FzIHJlYWxseSBtaXNzaW5nLgotICogSWYgdGhlIFJUTyB3YXMgc3B1cmlvdXMsIG5ldyBBQ0tzIHNob3VsZCBhcnJpdmUuCisvKiBGLVJUTyBjYW4gb25seSBiZSB1c2VkIGlmIFRDUCBoYXMgbmV2ZXIgcmV0cmFuc21pdHRlZCBhbnl0aGluZyBvdGhlciB0aGFuCisgKiBoZWFkIChTQUNLIGVuaGFuY2VkIHZhcmlhbnQgZnJvbSBBcHBlbmRpeCBCIG9mIFJGQzQxMzggaXMgbW9yZSByb2J1c3QgaGVyZSkKKyAqLworaW50IHRjcF91c2VfZnJ0byhzdHJ1Y3Qgc29jayAqc2spCit7CisJY29uc3Qgc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCWlmICghc3lzY3RsX3RjcF9mcnRvKQorCQlyZXR1cm4gMDsKKworCWlmIChJc1NhY2tGcnRvKCkpCisJCXJldHVybiAxOworCisJLyogQXZvaWQgZXhwZW5zaXZlIHdhbGtpbmcgb2YgcmV4bWl0IHF1ZXVlIGlmIHBvc3NpYmxlICovCisJaWYgKHRwLT5yZXRyYW5zX291dCA+IDEpCisJCXJldHVybiAwOworCisJc2tiID0gdGNwX3dyaXRlX3F1ZXVlX2hlYWQoc2spOworCXNrYiA9IHRjcF93cml0ZV9xdWV1ZV9uZXh0KHNrLCBza2IpOwkvKiBTa2lwcyBoZWFkICovCisJdGNwX2Zvcl93cml0ZV9xdWV1ZV9mcm9tKHNrYiwgc2spIHsKKwkJaWYgKHNrYiA9PSB0Y3Bfc2VuZF9oZWFkKHNrKSkKKwkJCWJyZWFrOworCQlpZiAoVENQX1NLQl9DQihza2IpLT5zYWNrZWQmVENQQ0JfUkVUUkFOUykKKwkJCXJldHVybiAwOworCQkvKiBTaG9ydC1jaXJjdWl0IHdoZW4gZmlyc3Qgbm9uLVNBQ0tlZCBza2IgaGFzIGJlZW4gY2hlY2tlZCAqLworCQlpZiAoIShUQ1BfU0tCX0NCKHNrYiktPnNhY2tlZCZUQ1BDQl9TQUNLRURfQUNLRUQpKQorCQkJYnJlYWs7CisJfQorCXJldHVybiAxOworfQorCisvKiBSVE8gb2NjdXJyZWQsIGJ1dCBkbyBub3QgeWV0IGVudGVyIExvc3Mgc3RhdGUuIEluc3RlYWQsIGRlZmVyIFJUTworICogcmVjb3ZlcnkgYSBiaXQgYW5kIHVzZSBoZXVyaXN0aWNzIGluIHRjcF9wcm9jZXNzX2ZydG8oKSB0byBkZXRlY3QgaWYKKyAqIHRoZSBSVE8gd2FzIHNwdXJpb3VzLiBPbmx5IGNsZWFyIFNBQ0tFRF9SRVRSQU5TIG9mIHRoZSBoZWFkIGhlcmUgdG8KKyAqIGtlZXAgcmV0cmFuc19vdXQgY291bnRpbmcgYWNjdXJhdGUgKHdpdGggU0FDSyBGLVJUTywgb3RoZXIgdGhhbiBoZWFkCisgKiBtYXkgc3RpbGwgaGF2ZSB0aGF0IGJpdCBzZXQpOyBUQ1BDQl9MT1NUIGFuZCByZW1haW5pbmcgU0FDS0VEX1JFVFJBTlMKKyAqIGJpdHMgYXJlIGhhbmRsZWQgaWYgdGhlIExvc3Mgc3RhdGUgaXMgcmVhbGx5IHRvIGJlIGVudGVyZWQgKGluCisgKiB0Y3BfZW50ZXJfZnJ0b19sb3NzKS4KKyAqCisgKiBEbyBsaWtlIHRjcF9lbnRlcl9sb3NzKCkgd291bGQ7IHdoZW4gUlRPIGV4cGlyZXMgdGhlIHNlY29uZCB0aW1lIGl0CisgKiBkb2VzOgorICogICJSZWR1Y2Ugc3N0aHJlc2ggaWYgaXQgaGFzIG5vdCB5ZXQgYmVlbiBtYWRlIGluc2lkZSB0aGlzIHdpbmRvdy4iCiAgKi8KIHZvaWQgdGNwX2VudGVyX2ZydG8oc3RydWN0IHNvY2sgKnNrKQogewpAQCAtMTI0NiwzOSArMTMxNSw2OSBAQAogCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOwogCXN0cnVjdCBza19idWZmICpza2I7CiAKLQl0cC0+ZnJ0b19jb3VudGVyID0gMTsKLQotCWlmIChpY3NrLT5pY3NrX2NhX3N0YXRlIDw9IFRDUF9DQV9EaXNvcmRlciB8fAorCWlmICgoIXRwLT5mcnRvX2NvdW50ZXIgJiYgaWNzay0+aWNza19jYV9zdGF0ZSA8PSBUQ1BfQ0FfRGlzb3JkZXIpIHx8CiAJICAgIHRwLT5zbmRfdW5hID09IHRwLT5oaWdoX3NlcSB8fAotCSAgICAoaWNzay0+aWNza19jYV9zdGF0ZSA9PSBUQ1BfQ0FfTG9zcyAmJiAhaWNzay0+aWNza19yZXRyYW5zbWl0cykpIHsKKwkgICAgKChpY3NrLT5pY3NrX2NhX3N0YXRlID09IFRDUF9DQV9Mb3NzIHx8IHRwLT5mcnRvX2NvdW50ZXIpICYmCisJICAgICAhaWNzay0+aWNza19yZXRyYW5zbWl0cykpIHsKIAkJdHAtPnByaW9yX3NzdGhyZXNoID0gdGNwX2N1cnJlbnRfc3N0aHJlc2goc2spOwotCQl0cC0+c25kX3NzdGhyZXNoID0gaWNzay0+aWNza19jYV9vcHMtPnNzdGhyZXNoKHNrKTsKKwkJLyogT3VyIHN0YXRlIGlzIHRvbyBvcHRpbWlzdGljIGluIHNzdGhyZXNoKCkgY2FsbCBiZWNhdXNlIGN3bmQKKwkJICogaXMgbm90IHJlZHVjZWQgdW50aWwgdGNwX2VudGVyX2ZydG9fbG9zcygpIHdoZW4gcHJldmlvdXMgRlJUTworCQkgKiByZWNvdmVyeSBoYXMgbm90IHlldCBjb21wbGV0ZWQuIFBhdHRlcm4gd291bGQgYmUgdGhpczogUlRPLAorCQkgKiBDdW11bGF0aXZlIEFDSywgUlRPICgyeFJUTyBmb3IgdGhlIHNhbWUgc2VnbWVudCBkb2VzIG5vdCBlbmQKKwkJICogdXAgaGVyZSB0d2ljZSkuCisJCSAqIFJGQzQxMzggc2hvdWxkIGJlIG1vcmUgc3BlY2lmaWMgb24gd2hhdCB0byBkbywgZXZlbiB0aG91Z2gKKwkJICogUlRPIGlzIHF1aXRlIHVubGlrZWx5IHRvIG9jY3VyIGFmdGVyIHRoZSBmaXJzdCBDdW11bGF0aXZlIEFDSworCQkgKiBkdWUgdG8gYmFjay1vZmYgYW5kIGNvbXBsZXhpdHkgb2YgdHJpZ2dlcmluZyBldmVudHMgLi4uCisJCSAqLworCQlpZiAodHAtPmZydG9fY291bnRlcikgeworCQkJdTMyIHN0b3JlZF9jd25kOworCQkJc3RvcmVkX2N3bmQgPSB0cC0+c25kX2N3bmQ7CisJCQl0cC0+c25kX2N3bmQgPSAyOworCQkJdHAtPnNuZF9zc3RocmVzaCA9IGljc2stPmljc2tfY2Ffb3BzLT5zc3RocmVzaChzayk7CisJCQl0cC0+c25kX2N3bmQgPSBzdG9yZWRfY3duZDsKKwkJfSBlbHNlIHsKKwkJCXRwLT5zbmRfc3N0aHJlc2ggPSBpY3NrLT5pY3NrX2NhX29wcy0+c3N0aHJlc2goc2spOworCQl9CisJCS8qIC4uLiBpbiB0aGVvcnksIGNvbmcuY29udHJvbCBtb2R1bGUgY291bGQgZG8gImFueSB0cmlja3MiIGluCisJCSAqIHNzdGhyZXNoKCksIHdoaWNoIG1lYW5zIHRoYXQgY2Ffc3RhdGUsIGxvc3QgYml0cyBhbmQgbG9zdF9vdXQKKwkJICogY291bnRlciB3b3VsZCBoYXZlIHRvIGJlIGZha2VkIGJlZm9yZSB0aGUgY2FsbCBvY2N1cnMuIFdlCisJCSAqIGNvbnNpZGVyIHRoYXQgdG9vIGV4cGVuc2l2ZSwgdW5saWtlbHkgYW5kIGhhY2t5LCBzbyBtb2R1bGVzCisJCSAqIHVzaW5nIHRoZXNlIGluIHNzdGhyZXNoKCkgbXVzdCBkZWFsIHRoZXNlIGluY29tcGF0aWJpbGl0eQorCQkgKiBpc3N1ZXMgaWYgdGhleSByZWNlaXZlcyBDQV9FVkVOVF9GUlRPIGFuZCBmcnRvX2NvdW50ZXIgIT0gMAorCQkgKi8KIAkJdGNwX2NhX2V2ZW50KHNrLCBDQV9FVkVOVF9GUlRPKTsKIAl9CiAKLQkvKiBIYXZlIHRvIGNsZWFyIHJldHJhbnNtaXNzaW9uIG1hcmtlcnMgaGVyZSB0byBrZWVwIHRoZSBib29ra2VlcGluZwotCSAqIGluIHNoYXBlLCBldmVuIHRob3VnaCB3ZSBhcmUgbm90IHlldCBpbiBMb3NzIHN0YXRlLgotCSAqIElmIHNvbWV0aGluZyB3YXMgcmVhbGx5IGxvc3QsIGl0IGlzIGV2ZW50dWFsbHkgY2F1Z2h0IHVwCi0JICogaW4gdGNwX2VudGVyX2ZydG9fbG9zcy4KLQkgKi8KLQl0cC0+cmV0cmFuc19vdXQgPSAwOwogCXRwLT51bmRvX21hcmtlciA9IHRwLT5zbmRfdW5hOwogCXRwLT51bmRvX3JldHJhbnMgPSAwOwogCi0Jc2tfc3RyZWFtX2Zvcl9yZXRyYW5zX3F1ZXVlKHNrYiwgc2spIHsKLQkJVENQX1NLQl9DQihza2IpLT5zYWNrZWQgJj0gflRDUENCX1JFVFJBTlM7CisJc2tiID0gdGNwX3dyaXRlX3F1ZXVlX2hlYWQoc2spOworCWlmIChUQ1BfU0tCX0NCKHNrYiktPnNhY2tlZCAmIFRDUENCX1NBQ0tFRF9SRVRSQU5TKSB7CisJCVRDUF9TS0JfQ0Ioc2tiKS0+c2Fja2VkICY9IH5UQ1BDQl9TQUNLRURfUkVUUkFOUzsKKwkJdHAtPnJldHJhbnNfb3V0IC09IHRjcF9za2JfcGNvdW50KHNrYik7CiAJfQogCXRjcF9zeW5jX2xlZnRfb3V0KHRwKTsKIAotCXRjcF9zZXRfY2Ffc3RhdGUoc2ssIFRDUF9DQV9PcGVuKTsKLQl0cC0+ZnJ0b19oaWdobWFyayA9IHRwLT5zbmRfbnh0OworCS8qIEVhcmxpZXIgbG9zcyByZWNvdmVyeSB1bmRlcndheSAoc2VlIFJGQzQxMzg7IEFwcGVuZGl4IEIpLgorCSAqIFRoZSBsYXN0IGNvbmRpdGlvbiBpcyBuZWNlc3NhcnkgYXQgbGVhc3QgaW4gdHAtPmZydG9fY291bnRlciBjYXNlLgorCSAqLworCWlmIChJc1NhY2tGcnRvKCkgJiYgKHRwLT5mcnRvX2NvdW50ZXIgfHwKKwkgICAgKCgxIDw8IGljc2stPmljc2tfY2Ffc3RhdGUpICYgKFRDUEZfQ0FfUmVjb3Zlcnl8VENQRl9DQV9Mb3NzKSkpICYmCisJICAgIGFmdGVyKHRwLT5oaWdoX3NlcSwgdHAtPnNuZF91bmEpKSB7CisJCXRwLT5mcnRvX2hpZ2htYXJrID0gdHAtPmhpZ2hfc2VxOworCX0gZWxzZSB7CisJCXRwLT5mcnRvX2hpZ2htYXJrID0gdHAtPnNuZF9ueHQ7CisJfQorCXRjcF9zZXRfY2Ffc3RhdGUoc2ssIFRDUF9DQV9EaXNvcmRlcik7CisJdHAtPmhpZ2hfc2VxID0gdHAtPnNuZF9ueHQ7CisJdHAtPmZydG9fY291bnRlciA9IDE7CiB9CiAKIC8qIEVudGVyIExvc3Mgc3RhdGUgYWZ0ZXIgRi1SVE8gd2FzIGFwcGxpZWQuIER1cGFjayBhcnJpdmVkIGFmdGVyIFJUTywKICAqIHdoaWNoIGluZGljYXRlcyB0aGF0IHdlIHNob3VsZCBmb2xsb3cgdGhlIHRyYWRpdGlvbmFsIFJUTyByZWNvdmVyeSwKICAqIGkuZS4gbWFyayBldmVyeXRoaW5nIGxvc3QgYW5kIGRvIGdvLWJhY2stTiByZXRyYW5zbWlzc2lvbi4KICAqLwotc3RhdGljIHZvaWQgdGNwX2VudGVyX2ZydG9fbG9zcyhzdHJ1Y3Qgc29jayAqc2spCitzdGF0aWMgdm9pZCB0Y3BfZW50ZXJfZnJ0b19sb3NzKHN0cnVjdCBzb2NrICpzaywgaW50IGFsbG93ZWRfc2VnbWVudHMsIGludCBmbGFnKQogewogCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOwogCXN0cnVjdCBza19idWZmICpza2I7CkBAIC0xMjg3LDEwICsxMzg2LDIzIEBACiAJdHAtPnNhY2tlZF9vdXQgPSAwOwogCXRwLT5sb3N0X291dCA9IDA7CiAJdHAtPmZhY2tldHNfb3V0ID0gMDsKKwl0cC0+cmV0cmFuc19vdXQgPSAwOwogCi0Jc2tfc3RyZWFtX2Zvcl9yZXRyYW5zX3F1ZXVlKHNrYiwgc2spIHsKKwl0Y3BfZm9yX3dyaXRlX3F1ZXVlKHNrYiwgc2spIHsKKwkJaWYgKHNrYiA9PSB0Y3Bfc2VuZF9oZWFkKHNrKSkKKwkJCWJyZWFrOwogCQljbnQgKz0gdGNwX3NrYl9wY291bnQoc2tiKTsKLQkJVENQX1NLQl9DQihza2IpLT5zYWNrZWQgJj0gflRDUENCX0xPU1Q7CisJCS8qCisJCSAqIENvdW50IHRoZSByZXRyYW5zbWlzc2lvbiBtYWRlIG9uIFJUTyBjb3JyZWN0bHkgKG9ubHkgd2hlbgorCQkgKiB3YWl0aW5nIGZvciB0aGUgZmlyc3QgQUNLIGFuZCBkaWQgbm90IGdldCBpdCkuLi4KKwkJICovCisJCWlmICgodHAtPmZydG9fY291bnRlciA9PSAxKSAmJiAhKGZsYWcmRkxBR19EQVRBX0FDS0VEKSkgeworCQkJdHAtPnJldHJhbnNfb3V0ICs9IHRjcF9za2JfcGNvdW50KHNrYik7CisJCQkvKiAuLi5lbnRlciB0aGlzIGlmIGJyYW5jaCBqdXN0IGZvciB0aGUgZmlyc3Qgc2VnbWVudCAqLworCQkJZmxhZyB8PSBGTEFHX0RBVEFfQUNLRUQ7CisJCX0gZWxzZSB7CisJCQlUQ1BfU0tCX0NCKHNrYiktPnNhY2tlZCAmPSB+KFRDUENCX0xPU1R8VENQQ0JfU0FDS0VEX1JFVFJBTlMpOworCQl9CiAJCWlmICghKFRDUF9TS0JfQ0Ioc2tiKS0+c2Fja2VkJlRDUENCX1NBQ0tFRF9BQ0tFRCkpIHsKIAogCQkJLyogRG8gbm90IG1hcmsgdGhvc2Ugc2VnbWVudHMgbG9zdCB0aGF0IHdlcmUKQEAgLTEzMDgsNyArMTQyMCw3IEBACiAJfQogCXRjcF9zeW5jX2xlZnRfb3V0KHRwKTsKIAotCXRwLT5zbmRfY3duZCA9IHRwLT5mcnRvX2NvdW50ZXIgKyB0Y3BfcGFja2V0c19pbl9mbGlnaHQodHApKzE7CisJdHAtPnNuZF9jd25kID0gdGNwX3BhY2tldHNfaW5fZmxpZ2h0KHRwKSArIGFsbG93ZWRfc2VnbWVudHM7CiAJdHAtPnNuZF9jd25kX2NudCA9IDA7CiAJdHAtPnNuZF9jd25kX3N0YW1wID0gdGNwX3RpbWVfc3RhbXA7CiAJdHAtPnVuZG9fbWFya2VyID0gMDsKQEAgLTEzNjYsNyArMTQ3OCw5IEBACiAJaWYgKCFob3cpCiAJCXRwLT51bmRvX21hcmtlciA9IHRwLT5zbmRfdW5hOwogCi0Jc2tfc3RyZWFtX2Zvcl9yZXRyYW5zX3F1ZXVlKHNrYiwgc2spIHsKKwl0Y3BfZm9yX3dyaXRlX3F1ZXVlKHNrYiwgc2spIHsKKwkJaWYgKHNrYiA9PSB0Y3Bfc2VuZF9oZWFkKHNrKSkKKwkJCWJyZWFrOwogCQljbnQgKz0gdGNwX3NrYl9wY291bnQoc2tiKTsKIAkJaWYgKFRDUF9TS0JfQ0Ioc2tiKS0+c2Fja2VkJlRDUENCX1JFVFJBTlMpCiAJCQl0cC0+dW5kb19tYXJrZXIgPSAwOwpAQCAtMTQwMSwxNCArMTUxNSwxNCBAQAogCSAqIHJlY2VpdmVyIF9ob3N0XyBpcyBoZWF2aWx5IGNvbmdlc3RlZCAob3IgYnVnZ3kpLgogCSAqIERvIHByb2Nlc3Npbmcgc2ltaWxhciB0byBSVE8gdGltZW91dC4KIAkgKi8KLQlpZiAoKHNrYiA9IHNrYl9wZWVrKCZzay0+c2tfd3JpdGVfcXVldWUpKSAhPSBOVUxMICYmCisJaWYgKChza2IgPSB0Y3Bfd3JpdGVfcXVldWVfaGVhZChzaykpICE9IE5VTEwgJiYKIAkgICAgKFRDUF9TS0JfQ0Ioc2tiKS0+c2Fja2VkICYgVENQQ0JfU0FDS0VEX0FDS0VEKSkgewogCQlzdHJ1Y3QgaW5ldF9jb25uZWN0aW9uX3NvY2sgKmljc2sgPSBpbmV0X2Nzayhzayk7CiAJCU5FVF9JTkNfU1RBVFNfQkgoTElOVVhfTUlCX1RDUFNBQ0tSRU5FR0lORyk7CiAKIAkJdGNwX2VudGVyX2xvc3Moc2ssIDEpOwogCQlpY3NrLT5pY3NrX3JldHJhbnNtaXRzKys7Ci0JCXRjcF9yZXRyYW5zbWl0X3NrYihzaywgc2tiX3BlZWsoJnNrLT5za193cml0ZV9xdWV1ZSkpOworCQl0Y3BfcmV0cmFuc21pdF9za2Ioc2ssIHRjcF93cml0ZV9xdWV1ZV9oZWFkKHNrKSk7CiAJCWluZXRfY3NrX3Jlc2V0X3htaXRfdGltZXIoc2ssIElDU0tfVElNRV9SRVRSQU5TLAogCQkJCQkgIGljc2stPmljc2tfcnRvLCBUQ1BfUlRPX01BWCk7CiAJCXJldHVybiAxOwpAQCAtMTQyNiwxMCArMTU0MCwxMiBAQAogCXJldHVybiAodGNwX3RpbWVfc3RhbXAgLSBUQ1BfU0tCX0NCKHNrYiktPndoZW4gPiBpbmV0X2NzayhzayktPmljc2tfcnRvKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgdGNwX2hlYWRfdGltZWRvdXQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgdGNwX3NvY2sgKnRwKQorc3RhdGljIGlubGluZSBpbnQgdGNwX2hlYWRfdGltZWRvdXQoc3RydWN0IHNvY2sgKnNrKQogeworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCiAJcmV0dXJuIHRwLT5wYWNrZXRzX291dCAmJgotCSAgICAgICB0Y3Bfc2tiX3RpbWVkb3V0KHNrLCBza2JfcGVlaygmc2stPnNrX3dyaXRlX3F1ZXVlKSk7CisJICAgICAgIHRjcF9za2JfdGltZWRvdXQoc2ssIHRjcF93cml0ZV9xdWV1ZV9oZWFkKHNrKSk7CiB9CiAKIC8qIExpbnV4IE5ld1Jlbm8vU0FDSy9GQUNLL0VDTiBzdGF0ZSBtYWNoaW5lLgpAQCAtMTUyNSwxMCArMTY0MSwxNSBAQAogICogTWFpbiBxdWVzdGlvbjogbWF5IHdlIGZ1cnRoZXIgY29udGludWUgZm9yd2FyZCB0cmFuc21pc3Npb24KICAqIHdpdGggdGhlIHNhbWUgY3duZD8KICAqLwotc3RhdGljIGludCB0Y3BfdGltZV90b19yZWNvdmVyKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHRjcF9zb2NrICp0cCkKK3N0YXRpYyBpbnQgdGNwX3RpbWVfdG9fcmVjb3ZlcihzdHJ1Y3Qgc29jayAqc2spCiB7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CiAJX191MzIgcGFja2V0c19vdXQ7CiAKKwkvKiBEbyBub3QgcGVyZm9ybSBhbnkgcmVjb3ZlcnkgZHVyaW5nIEZSVE8gYWxnb3JpdGhtICovCisJaWYgKHRwLT5mcnRvX2NvdW50ZXIpCisJCXJldHVybiAwOworCiAJLyogVHJpY2sjMTogVGhlIGxvc3MgaXMgcHJvdmVuLiAqLwogCWlmICh0cC0+bG9zdF9vdXQpCiAJCXJldHVybiAxOwpAQCAtMTU0MCw3ICsxNjYxLDcgQEAKIAkvKiBUcmljayMzIDogd2hlbiB3ZSB1c2UgUkZDMjk4OCB0aW1lciByZXN0YXJ0LCBmYXN0CiAJICogcmV0cmFuc21pdCBjYW4gYmUgdHJpZ2dlcmVkIGJ5IHRpbWVvdXQgb2YgcXVldWUgaGVhZC4KIAkgKi8KLQlpZiAodGNwX2hlYWRfdGltZWRvdXQoc2ssIHRwKSkKKwlpZiAodGNwX2hlYWRfdGltZWRvdXQoc2spKQogCQlyZXR1cm4gMTsKIAogCS8qIFRyaWNrIzQ6IEl0IGlzIHN0aWxsIG5vdCBPSy4uLiBCdXQgd2lsbCBpdCBiZSB1c2VmdWwgdG8gZGVsYXkKQEAgLTE1NDksNyArMTY3MCw3IEBACiAJcGFja2V0c19vdXQgPSB0cC0+cGFja2V0c19vdXQ7CiAJaWYgKHBhY2tldHNfb3V0IDw9IHRwLT5yZW9yZGVyaW5nICYmCiAJICAgIHRwLT5zYWNrZWRfb3V0ID49IG1heF90KF9fdTMyLCBwYWNrZXRzX291dC8yLCBzeXNjdGxfdGNwX3Jlb3JkZXJpbmcpICYmCi0JICAgICF0Y3BfbWF5X3NlbmRfbm93KHNrLCB0cCkpIHsKKwkgICAgIXRjcF9tYXlfc2VuZF9ub3coc2spKSB7CiAJCS8qIFdlIGhhdmUgbm90aGluZyB0byBzZW5kLiBUaGlzIGNvbm5lY3Rpb24gaXMgbGltaXRlZAogCQkgKiBlaXRoZXIgYnkgcmVjZWl2ZXIgd2luZG93IG9yIGJ5IGFwcGxpY2F0aW9uLgogCQkgKi8KQEAgLTE1ODksOCArMTcxMCwxMCBAQAogCiAvKiBBY2NvdW50IGZvciBBQ0ssIEFDS2luZyBzb21lIGRhdGEgaW4gUmVubyBSZWNvdmVyeSBwaGFzZS4gKi8KIAotc3RhdGljIHZvaWQgdGNwX3JlbW92ZV9yZW5vX3NhY2tzKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHRjcF9zb2NrICp0cCwgaW50IGFja2VkKQorc3RhdGljIHZvaWQgdGNwX3JlbW92ZV9yZW5vX3NhY2tzKHN0cnVjdCBzb2NrICpzaywgaW50IGFja2VkKQogeworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCiAJaWYgKGFja2VkID4gMCkgewogCQkvKiBPbmUgQUNLIGFja2VkIGhvbGUuIFRoZSByZXN0IGVhdCBkdXBsaWNhdGUgQUNLcy4gKi8KIAkJaWYgKGFja2VkLTEgPj0gdHAtPnNhY2tlZF9vdXQpCkBAIC0xNjA5LDkgKzE3MzIsMTAgQEAKIH0KIAogLyogTWFyayBoZWFkIG9mIHF1ZXVlIHVwIGFzIGxvc3QuICovCi1zdGF0aWMgdm9pZCB0Y3BfbWFya19oZWFkX2xvc3Qoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgdGNwX3NvY2sgKnRwLAorc3RhdGljIHZvaWQgdGNwX21hcmtfaGVhZF9sb3N0KHN0cnVjdCBzb2NrICpzaywKIAkJCSAgICAgICBpbnQgcGFja2V0cywgdTMyIGhpZ2hfc2VxKQogeworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOwogCXN0cnVjdCBza19idWZmICpza2I7CiAJaW50IGNudDsKIApAQCAtMTYyMCwxMSArMTc0NCwxMyBAQAogCQlza2IgPSB0cC0+bG9zdF9za2JfaGludDsKIAkJY250ID0gdHAtPmxvc3RfY250X2hpbnQ7CiAJfSBlbHNlIHsKLQkJc2tiID0gc2stPnNrX3dyaXRlX3F1ZXVlLm5leHQ7CisJCXNrYiA9IHRjcF93cml0ZV9xdWV1ZV9oZWFkKHNrKTsKIAkJY250ID0gMDsKIAl9CiAKLQlza19zdHJlYW1fZm9yX3JldHJhbnNfcXVldWVfZnJvbShza2IsIHNrKSB7CisJdGNwX2Zvcl93cml0ZV9xdWV1ZV9mcm9tKHNrYiwgc2spIHsKKwkJaWYgKHNrYiA9PSB0Y3Bfc2VuZF9oZWFkKHNrKSkKKwkJCWJyZWFrOwogCQkvKiBUT0RPOiBkbyB0aGlzIGJldHRlciAqLwogCQkvKiB0aGlzIGlzIG5vdCB0aGUgbW9zdCBlZmZpY2llbnQgd2F5IHRvIGRvIHRoaXMuLi4gKi8KIAkJdHAtPmxvc3Rfc2tiX2hpbnQgPSBza2I7CkBAIC0xNjM4LDEyICsxNzY0LDExIEBACiAKIAkJCS8qIGNsZWFyIHhtaXRfcmV0cmFuc21pdF9xdWV1ZSBoaW50cwogCQkJICogIGlmIHRoaXMgaXMgYmV5b25kIGhpbnQgKi8KLQkJCWlmKHRwLT5yZXRyYW5zbWl0X3NrYl9oaW50ICE9IE5VTEwgJiYKLQkJCSAgIGJlZm9yZShUQ1BfU0tCX0NCKHNrYiktPnNlcSwKLQkJCQkgIFRDUF9TS0JfQ0IodHAtPnJldHJhbnNtaXRfc2tiX2hpbnQpLT5zZXEpKSB7Ci0KKwkJCWlmICh0cC0+cmV0cmFuc21pdF9za2JfaGludCAhPSBOVUxMICYmCisJCQkgICAgYmVmb3JlKFRDUF9TS0JfQ0Ioc2tiKS0+c2VxLAorCQkJCSAgIFRDUF9TS0JfQ0IodHAtPnJldHJhbnNtaXRfc2tiX2hpbnQpLT5zZXEpKQogCQkJCXRwLT5yZXRyYW5zbWl0X3NrYl9oaW50ID0gTlVMTDsKLQkJCX0KKwogCQl9CiAJfQogCXRjcF9zeW5jX2xlZnRfb3V0KHRwKTsKQEAgLTE2NTEsMTUgKzE3NzYsMTcgQEAKIAogLyogQWNjb3VudCBuZXdseSBkZXRlY3RlZCBsb3N0IHBhY2tldChzKSAqLwogCi1zdGF0aWMgdm9pZCB0Y3BfdXBkYXRlX3Njb3JlYm9hcmQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgdGNwX3NvY2sgKnRwKQorc3RhdGljIHZvaWQgdGNwX3VwZGF0ZV9zY29yZWJvYXJkKHN0cnVjdCBzb2NrICpzaykKIHsKKwlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKwogCWlmIChJc0ZhY2sodHApKSB7CiAJCWludCBsb3N0ID0gdHAtPmZhY2tldHNfb3V0IC0gdHAtPnJlb3JkZXJpbmc7CiAJCWlmIChsb3N0IDw9IDApCiAJCQlsb3N0ID0gMTsKLQkJdGNwX21hcmtfaGVhZF9sb3N0KHNrLCB0cCwgbG9zdCwgdHAtPmhpZ2hfc2VxKTsKKwkJdGNwX21hcmtfaGVhZF9sb3N0KHNrLCBsb3N0LCB0cC0+aGlnaF9zZXEpOwogCX0gZWxzZSB7Ci0JCXRjcF9tYXJrX2hlYWRfbG9zdChzaywgdHAsIDEsIHRwLT5oaWdoX3NlcSk7CisJCXRjcF9tYXJrX2hlYWRfbG9zdChzaywgMSwgdHAtPmhpZ2hfc2VxKTsKIAl9CiAKIAkvKiBOZXcgaGV1cmlzdGljczogaXQgaXMgcG9zc2libGUgb25seSBhZnRlciB3ZSBzd2l0Y2hlZApAQCAtMTY2NywxMyArMTc5NCwxNSBAQAogCSAqIEhlbmNlLCB3ZSBjYW4gZGV0ZWN0IHRpbWVkIG91dCBwYWNrZXRzIGR1cmluZyBmYXN0CiAJICogcmV0cmFuc21pdCB3aXRob3V0IGZhbGxpbmcgdG8gc2xvdyBzdGFydC4KIAkgKi8KLQlpZiAoIUlzUmVubyh0cCkgJiYgdGNwX2hlYWRfdGltZWRvdXQoc2ssIHRwKSkgeworCWlmICghSXNSZW5vKHRwKSAmJiB0Y3BfaGVhZF90aW1lZG91dChzaykpIHsKIAkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAogCQlza2IgPSB0cC0+c2NvcmVib2FyZF9za2JfaGludCA/IHRwLT5zY29yZWJvYXJkX3NrYl9oaW50Ci0JCQk6IHNrLT5za193cml0ZV9xdWV1ZS5uZXh0OworCQkJOiB0Y3Bfd3JpdGVfcXVldWVfaGVhZChzayk7CiAKLQkJc2tfc3RyZWFtX2Zvcl9yZXRyYW5zX3F1ZXVlX2Zyb20oc2tiLCBzaykgeworCQl0Y3BfZm9yX3dyaXRlX3F1ZXVlX2Zyb20oc2tiLCBzaykgeworCQkJaWYgKHNrYiA9PSB0Y3Bfc2VuZF9oZWFkKHNrKSkKKwkJCQlicmVhazsKIAkJCWlmICghdGNwX3NrYl90aW1lZG91dChzaywgc2tiKSkKIAkJCQlicmVhazsKIApAQCAtMTc0NSw5ICsxODc0LDExIEBACiAvKiBVbmRvIHByb2NlZHVyZXMuICovCiAKICNpZiBGQVNUUkVUUkFOU19ERUJVRyA+IDEKLXN0YXRpYyB2b2lkIERCR1VORE8oc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgdGNwX3NvY2sgKnRwLCBjb25zdCBjaGFyICptc2cpCitzdGF0aWMgdm9pZCBEQkdVTkRPKHN0cnVjdCBzb2NrICpzaywgY29uc3QgY2hhciAqbXNnKQogeworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOwogCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKKwogCXByaW50ayhLRVJOX0RFQlVHICJVbmRvICVzICV1LiV1LiV1LiV1LyV1IGMldSBsJXUgc3MldS8ldSBwJXVcbiIsCiAJICAgICAgIG1zZywKIAkgICAgICAgTklQUVVBRChpbmV0LT5kYWRkciksIG50b2hzKGluZXQtPmRwb3J0KSwKQEAgLTE3OTMsMTMgKzE5MjQsMTUgQEAKIH0KIAogLyogUGVvcGxlIGNlbGVicmF0ZTogIldlIGxvdmUgb3VyIFByZXNpZGVudCEiICovCi1zdGF0aWMgaW50IHRjcF90cnlfdW5kb19yZWNvdmVyeShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCB0Y3Bfc29jayAqdHApCitzdGF0aWMgaW50IHRjcF90cnlfdW5kb19yZWNvdmVyeShzdHJ1Y3Qgc29jayAqc2spCiB7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisKIAlpZiAodGNwX21heV91bmRvKHRwKSkgewogCQkvKiBIYXBweSBlbmQhIFdlIGRpZCBub3QgcmV0cmFuc21pdCBhbnl0aGluZwogCQkgKiBvciBvdXIgb3JpZ2luYWwgdHJhbnNtaXNzaW9uIHN1Y2NlZWRlZC4KIAkJICovCi0JCURCR1VORE8oc2ssIHRwLCBpbmV0X2NzayhzayktPmljc2tfY2Ffc3RhdGUgPT0gVENQX0NBX0xvc3MgPyAibG9zcyIgOiAicmV0cmFucyIpOworCQlEQkdVTkRPKHNrLCBpbmV0X2NzayhzayktPmljc2tfY2Ffc3RhdGUgPT0gVENQX0NBX0xvc3MgPyAibG9zcyIgOiAicmV0cmFucyIpOwogCQl0Y3BfdW5kb19jd3Ioc2ssIDEpOwogCQlpZiAoaW5ldF9jc2soc2spLT5pY3NrX2NhX3N0YXRlID09IFRDUF9DQV9Mb3NzKQogCQkJTkVUX0lOQ19TVEFUU19CSChMSU5VWF9NSUJfVENQTE9TU1VORE8pOwpAQCAtMTgxOSwxMCArMTk1MiwxMiBAQAogfQogCiAvKiBUcnkgdG8gdW5kbyBjd25kIHJlZHVjdGlvbiwgYmVjYXVzZSBELVNBQ0tzIGFja2VkIGFsbCByZXRyYW5zbWl0dGVkIGRhdGEgKi8KLXN0YXRpYyB2b2lkIHRjcF90cnlfdW5kb19kc2FjayhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCB0Y3Bfc29jayAqdHApCitzdGF0aWMgdm9pZCB0Y3BfdHJ5X3VuZG9fZHNhY2soc3RydWN0IHNvY2sgKnNrKQogeworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCiAJaWYgKHRwLT51bmRvX21hcmtlciAmJiAhdHAtPnVuZG9fcmV0cmFucykgewotCQlEQkdVTkRPKHNrLCB0cCwgIkQtU0FDSyIpOworCQlEQkdVTkRPKHNrLCAiRC1TQUNLIik7CiAJCXRjcF91bmRvX2N3cihzaywgMSk7CiAJCXRwLT51bmRvX21hcmtlciA9IDA7CiAJCU5FVF9JTkNfU1RBVFNfQkgoTElOVVhfTUlCX1RDUERTQUNLVU5ETyk7CkBAIC0xODMxLDkgKzE5NjYsOSBAQAogCiAvKiBVbmRvIGR1cmluZyBmYXN0IHJlY292ZXJ5IGFmdGVyIHBhcnRpYWwgQUNLLiAqLwogCi1zdGF0aWMgaW50IHRjcF90cnlfdW5kb19wYXJ0aWFsKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHRjcF9zb2NrICp0cCwKLQkJCQlpbnQgYWNrZWQpCitzdGF0aWMgaW50IHRjcF90cnlfdW5kb19wYXJ0aWFsKHN0cnVjdCBzb2NrICpzaywgaW50IGFja2VkKQogeworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOwogCS8qIFBhcnRpYWwgQUNLIGFycml2ZWQuIEZvcmNlIEhvZSdzIHJldHJhbnNtaXQuICovCiAJaW50IGZhaWxlZCA9IElzUmVubyh0cCkgfHwgdHAtPmZhY2tldHNfb3V0PnRwLT5yZW9yZGVyaW5nOwogCkBAIC0xODQ2LDcgKzE5ODEsNyBAQAogCiAJCXRjcF91cGRhdGVfcmVvcmRlcmluZyhzaywgdGNwX2ZhY2tldHNfb3V0KHRwKSArIGFja2VkLCAxKTsKIAotCQlEQkdVTkRPKHNrLCB0cCwgIkhvZSIpOworCQlEQkdVTkRPKHNrLCAiSG9lIik7CiAJCXRjcF91bmRvX2N3cihzaywgMCk7CiAJCU5FVF9JTkNfU1RBVFNfQkgoTElOVVhfTUlCX1RDUFBBUlRJQUxVTkRPKTsKIApAQCAtMTg2MCwxNyArMTk5NSwyMSBAQAogfQogCiAvKiBVbmRvIGR1cmluZyBsb3NzIHJlY292ZXJ5IGFmdGVyIHBhcnRpYWwgQUNLLiAqLwotc3RhdGljIGludCB0Y3BfdHJ5X3VuZG9fbG9zcyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCB0Y3Bfc29jayAqdHApCitzdGF0aWMgaW50IHRjcF90cnlfdW5kb19sb3NzKHN0cnVjdCBzb2NrICpzaykKIHsKKwlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKwogCWlmICh0Y3BfbWF5X3VuZG8odHApKSB7CiAJCXN0cnVjdCBza19idWZmICpza2I7Ci0JCXNrX3N0cmVhbV9mb3JfcmV0cmFuc19xdWV1ZShza2IsIHNrKSB7CisJCXRjcF9mb3Jfd3JpdGVfcXVldWUoc2tiLCBzaykgeworCQkJaWYgKHNrYiA9PSB0Y3Bfc2VuZF9oZWFkKHNrKSkKKwkJCQlicmVhazsKIAkJCVRDUF9TS0JfQ0Ioc2tiKS0+c2Fja2VkICY9IH5UQ1BDQl9MT1NUOwogCQl9CiAKIAkJY2xlYXJfYWxsX3JldHJhbnNfaGludHModHApOwogCi0JCURCR1VORE8oc2ssIHRwLCAicGFydGlhbCBsb3NzIik7CisJCURCR1VORE8oc2ssICJwYXJ0aWFsIGxvc3MiKTsKIAkJdHAtPmxvc3Rfb3V0ID0gMDsKIAkJdHAtPmxlZnRfb3V0ID0gdHAtPnNhY2tlZF9vdXQ7CiAJCXRjcF91bmRvX2N3cihzaywgMSk7CkBAIC0xODkyLDE1ICsyMDMxLDE3IEBACiAJdGNwX2NhX2V2ZW50KHNrLCBDQV9FVkVOVF9DT01QTEVURV9DV1IpOwogfQogCi1zdGF0aWMgdm9pZCB0Y3BfdHJ5X3RvX29wZW4oc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgdGNwX3NvY2sgKnRwLCBpbnQgZmxhZykKK3N0YXRpYyB2b2lkIHRjcF90cnlfdG9fb3BlbihzdHJ1Y3Qgc29jayAqc2ssIGludCBmbGFnKQogeworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCiAJdHAtPmxlZnRfb3V0ID0gdHAtPnNhY2tlZF9vdXQ7CiAKIAlpZiAodHAtPnJldHJhbnNfb3V0ID09IDApCiAJCXRwLT5yZXRyYW5zX3N0YW1wID0gMDsKIAogCWlmIChmbGFnJkZMQUdfRUNFKQotCQl0Y3BfZW50ZXJfY3dyKHNrKTsKKwkJdGNwX2VudGVyX2N3cihzaywgMSk7CiAKIAlpZiAoaW5ldF9jc2soc2spLT5pY3NrX2NhX3N0YXRlICE9IFRDUF9DQV9DV1IpIHsKIAkJaW50IHN0YXRlID0gVENQX0NBX09wZW47CkBAIC0xOTg3LDcgKzIxMjgsNyBAQAogCSAgICBiZWZvcmUodHAtPnNuZF91bmEsIHRwLT5oaWdoX3NlcSkgJiYKIAkgICAgaWNzay0+aWNza19jYV9zdGF0ZSAhPSBUQ1BfQ0FfT3BlbiAmJgogCSAgICB0cC0+ZmFja2V0c19vdXQgPiB0cC0+cmVvcmRlcmluZykgewotCQl0Y3BfbWFya19oZWFkX2xvc3Qoc2ssIHRwLCB0cC0+ZmFja2V0c19vdXQtdHAtPnJlb3JkZXJpbmcsIHRwLT5oaWdoX3NlcSk7CisJCXRjcF9tYXJrX2hlYWRfbG9zdChzaywgdHAtPmZhY2tldHNfb3V0LXRwLT5yZW9yZGVyaW5nLCB0cC0+aGlnaF9zZXEpOwogCQlORVRfSU5DX1NUQVRTX0JIKExJTlVYX01JQl9UQ1BMT1NTKTsKIAl9CiAKQEAgLTE5OTcsMTQgKzIxMzgsMTMgQEAKIAkvKiBFLiBDaGVjayBzdGF0ZSBleGl0IGNvbmRpdGlvbnMuIFN0YXRlIGNhbiBiZSB0ZXJtaW5hdGVkCiAJICogICAgd2hlbiBoaWdoX3NlcSBpcyBBQ0tlZC4gKi8KIAlpZiAoaWNzay0+aWNza19jYV9zdGF0ZSA9PSBUQ1BfQ0FfT3BlbikgewotCQlpZiAoIXN5c2N0bF90Y3BfZnJ0bykKLQkJCUJVR19UUkFQKHRwLT5yZXRyYW5zX291dCA9PSAwKTsKKwkJQlVHX1RSQVAodHAtPnJldHJhbnNfb3V0ID09IDApOwogCQl0cC0+cmV0cmFuc19zdGFtcCA9IDA7CiAJfSBlbHNlIGlmICghYmVmb3JlKHRwLT5zbmRfdW5hLCB0cC0+aGlnaF9zZXEpKSB7CiAJCXN3aXRjaCAoaWNzay0+aWNza19jYV9zdGF0ZSkgewogCQljYXNlIFRDUF9DQV9Mb3NzOgogCQkJaWNzay0+aWNza19yZXRyYW5zbWl0cyA9IDA7Ci0JCQlpZiAodGNwX3RyeV91bmRvX3JlY292ZXJ5KHNrLCB0cCkpCisJCQlpZiAodGNwX3RyeV91bmRvX3JlY292ZXJ5KHNrKSkKIAkJCQlyZXR1cm47CiAJCQlicmVhazsKIApAQCAtMjAxOCw3ICsyMTU4LDcgQEAKIAkJCWJyZWFrOwogCiAJCWNhc2UgVENQX0NBX0Rpc29yZGVyOgotCQkJdGNwX3RyeV91bmRvX2RzYWNrKHNrLCB0cCk7CisJCQl0Y3BfdHJ5X3VuZG9fZHNhY2soc2spOwogCQkJaWYgKCF0cC0+dW5kb19tYXJrZXIgfHwKIAkJCSAgICAvKiBGb3IgU0FDSyBjYXNlIGRvIG5vdCBPcGVuIHRvIGFsbG93IHRvIHVuZG8KIAkJCSAgICAgKiBjYXRjaGluZyBmb3IgYWxsIGR1cGxpY2F0ZSBBQ0tzLiAqLwpAQCAtMjAzMSw3ICsyMTcxLDcgQEAKIAkJY2FzZSBUQ1BfQ0FfUmVjb3Zlcnk6CiAJCQlpZiAoSXNSZW5vKHRwKSkKIAkJCQl0Y3BfcmVzZXRfcmVub19zYWNrKHRwKTsKLQkJCWlmICh0Y3BfdHJ5X3VuZG9fcmVjb3Zlcnkoc2ssIHRwKSkKKwkJCWlmICh0Y3BfdHJ5X3VuZG9fcmVjb3Zlcnkoc2spKQogCQkJCXJldHVybjsKIAkJCXRjcF9jb21wbGV0ZV9jd3Ioc2spOwogCQkJYnJlYWs7CkBAIC0yMDQ3LDE0ICsyMTg3LDE0IEBACiAJCX0gZWxzZSB7CiAJCQlpbnQgYWNrZWQgPSBwcmlvcl9wYWNrZXRzIC0gdHAtPnBhY2tldHNfb3V0OwogCQkJaWYgKElzUmVubyh0cCkpCi0JCQkJdGNwX3JlbW92ZV9yZW5vX3NhY2tzKHNrLCB0cCwgYWNrZWQpOwotCQkJaXNfZHVwYWNrID0gdGNwX3RyeV91bmRvX3BhcnRpYWwoc2ssIHRwLCBhY2tlZCk7CisJCQkJdGNwX3JlbW92ZV9yZW5vX3NhY2tzKHNrLCBhY2tlZCk7CisJCQlpc19kdXBhY2sgPSB0Y3BfdHJ5X3VuZG9fcGFydGlhbChzaywgYWNrZWQpOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgVENQX0NBX0xvc3M6CiAJCWlmIChmbGFnJkZMQUdfREFUQV9BQ0tFRCkKIAkJCWljc2stPmljc2tfcmV0cmFuc21pdHMgPSAwOwotCQlpZiAoIXRjcF90cnlfdW5kb19sb3NzKHNrLCB0cCkpIHsKKwkJaWYgKCF0Y3BfdHJ5X3VuZG9fbG9zcyhzaykpIHsKIAkJCXRjcF9tb2RlcmF0ZV9jd25kKHRwKTsKIAkJCXRjcF94bWl0X3JldHJhbnNtaXRfcXVldWUoc2spOwogCQkJcmV0dXJuOwpAQCAtMjA3MSwxMCArMjIxMSwxMCBAQAogCQl9CiAKIAkJaWYgKGljc2stPmljc2tfY2Ffc3RhdGUgPT0gVENQX0NBX0Rpc29yZGVyKQotCQkJdGNwX3RyeV91bmRvX2RzYWNrKHNrLCB0cCk7CisJCQl0Y3BfdHJ5X3VuZG9fZHNhY2soc2spOwogCi0JCWlmICghdGNwX3RpbWVfdG9fcmVjb3ZlcihzaywgdHApKSB7Ci0JCQl0Y3BfdHJ5X3RvX29wZW4oc2ssIHRwLCBmbGFnKTsKKwkJaWYgKCF0Y3BfdGltZV90b19yZWNvdmVyKHNrKSkgeworCQkJdGNwX3RyeV90b19vcGVuKHNrLCBmbGFnKTsKIAkJCXJldHVybjsKIAkJfQogCkBAIC0yMTEzLDggKzIyNTMsOCBAQAogCQl0Y3Bfc2V0X2NhX3N0YXRlKHNrLCBUQ1BfQ0FfUmVjb3ZlcnkpOwogCX0KIAotCWlmIChpc19kdXBhY2sgfHwgdGNwX2hlYWRfdGltZWRvdXQoc2ssIHRwKSkKLQkJdGNwX3VwZGF0ZV9zY29yZWJvYXJkKHNrLCB0cCk7CisJaWYgKGlzX2R1cGFjayB8fCB0Y3BfaGVhZF90aW1lZG91dChzaykpCisJCXRjcF91cGRhdGVfc2NvcmVib2FyZChzayk7CiAJdGNwX2N3bmRfZG93bihzayk7CiAJdGNwX3htaXRfcmV0cmFuc21pdF9xdWV1ZShzayk7CiB9CkBAIC0yMTkwLDggKzIzMzAsMTAgQEAKICAqIFJGQzI5ODggcmVjb21tZW5kcyB0byByZXN0YXJ0IHRpbWVyIHRvIG5vdytydG8uCiAgKi8KIAotc3RhdGljIHZvaWQgdGNwX2Fja19wYWNrZXRzX291dChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCB0Y3Bfc29jayAqdHApCitzdGF0aWMgdm9pZCB0Y3BfYWNrX3BhY2tldHNfb3V0KHN0cnVjdCBzb2NrICpzaykKIHsKKwlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKwogCWlmICghdHAtPnBhY2tldHNfb3V0KSB7CiAJCWluZXRfY3NrX2NsZWFyX3htaXRfdGltZXIoc2ssIElDU0tfVElNRV9SRVRSQU5TKTsKIAl9IGVsc2UgewpAQCAtMjI1NSwxNCArMjM5Nyw2IEBACiAJcmV0dXJuIGFja2VkOwogfQogCi1zdGF0aWMgdTMyIHRjcF91c3J0dChzdHJ1Y3QgdGltZXZhbCAqdHYpCi17Ci0Jc3RydWN0IHRpbWV2YWwgbm93OwotCi0JZG9fZ2V0dGltZW9mZGF5KCZub3cpOwotCXJldHVybiAobm93LnR2X3NlYyAtIHR2LT50dl9zZWMpICogMTAwMDAwMCArIChub3cudHZfdXNlYyAtIHR2LT50dl91c2VjKTsKLX0KLQogLyogUmVtb3ZlIGFja25vd2xlZGdlZCBmcmFtZXMgZnJvbSB0aGUgcmV0cmFuc21pc3Npb24gcXVldWUuICovCiBzdGF0aWMgaW50IHRjcF9jbGVhbl9ydHhfcXVldWUoc3RydWN0IHNvY2sgKnNrLCBfX3MzMiAqc2VxX3J0dF9wKQogewpAQCAtMjI3MywxMiArMjQwNywxMCBAQAogCWludCBhY2tlZCA9IDA7CiAJX19zMzIgc2VxX3J0dCA9IC0xOwogCXUzMiBwa3RzX2Fja2VkID0gMDsKLQl2b2lkICgqcnR0X3NhbXBsZSkoc3RydWN0IHNvY2sgKnNrLCB1MzIgdXNydHQpCi0JCT0gaWNzay0+aWNza19jYV9vcHMtPnJ0dF9zYW1wbGU7Ci0Jc3RydWN0IHRpbWV2YWwgdHYgPSB7IC50dl9zZWMgPSAwLCAudHZfdXNlYyA9IDAgfTsKKwlrdGltZV90IGxhc3RfYWNrdCA9IGt0aW1lX3NldCgwLDApOwogCi0Jd2hpbGUgKChza2IgPSBza2JfcGVlaygmc2stPnNrX3dyaXRlX3F1ZXVlKSkgJiYKLQkgICAgICAgc2tiICE9IHNrLT5za19zZW5kX2hlYWQpIHsKKwl3aGlsZSAoKHNrYiA9IHRjcF93cml0ZV9xdWV1ZV9oZWFkKHNrKSkgJiYKKwkgICAgICAgc2tiICE9IHRjcF9zZW5kX2hlYWQoc2spKSB7CiAJCXN0cnVjdCB0Y3Bfc2tiX2NiICpzY2IgPSBUQ1BfU0tCX0NCKHNrYik7CiAJCV9fdTggc2Fja2VkID0gc2NiLT5zYWNrZWQ7CiAKQEAgLTIzMTgsMTMgKzI0NTAsMTMgQEAKIAogCQlpZiAoc2Fja2VkKSB7CiAJCQlpZiAoc2Fja2VkICYgVENQQ0JfUkVUUkFOUykgewotCQkJCWlmKHNhY2tlZCAmIFRDUENCX1NBQ0tFRF9SRVRSQU5TKQorCQkJCWlmIChzYWNrZWQgJiBUQ1BDQl9TQUNLRURfUkVUUkFOUykKIAkJCQkJdHAtPnJldHJhbnNfb3V0IC09IHRjcF9za2JfcGNvdW50KHNrYik7CiAJCQkJYWNrZWQgfD0gRkxBR19SRVRSQU5TX0RBVEFfQUNLRUQ7CiAJCQkJc2VxX3J0dCA9IC0xOwogCQkJfSBlbHNlIGlmIChzZXFfcnR0IDwgMCkgewogCQkJCXNlcV9ydHQgPSBub3cgLSBzY2ItPndoZW47Ci0JCQkJc2tiX2dldF90aW1lc3RhbXAoc2tiLCAmdHYpOworCQkJCWxhc3RfYWNrdCA9IHNrYi0+dHN0YW1wOwogCQkJfQogCQkJaWYgKHNhY2tlZCAmIFRDUENCX1NBQ0tFRF9BQ0tFRCkKIAkJCQl0cC0+c2Fja2VkX291dCAtPSB0Y3Bfc2tiX3Bjb3VudChza2IpOwpAQCAtMjMzNywyMyArMjQ2OSwyNCBAQAogCQkJfQogCQl9IGVsc2UgaWYgKHNlcV9ydHQgPCAwKSB7CiAJCQlzZXFfcnR0ID0gbm93IC0gc2NiLT53aGVuOwotCQkJc2tiX2dldF90aW1lc3RhbXAoc2tiLCAmdHYpOworCQkJbGFzdF9hY2t0ID0gc2tiLT50c3RhbXA7CiAJCX0KIAkJdGNwX2RlY19wY291bnRfYXBwcm94KCZ0cC0+ZmFja2V0c19vdXQsIHNrYik7CiAJCXRjcF9wYWNrZXRzX291dF9kZWModHAsIHNrYik7Ci0JCV9fc2tiX3VubGluayhza2IsICZzay0+c2tfd3JpdGVfcXVldWUpOworCQl0Y3BfdW5saW5rX3dyaXRlX3F1ZXVlKHNrYiwgc2spOwogCQlza19zdHJlYW1fZnJlZV9za2Ioc2ssIHNrYik7CiAJCWNsZWFyX2FsbF9yZXRyYW5zX2hpbnRzKHRwKTsKIAl9CiAKIAlpZiAoYWNrZWQmRkxBR19BQ0tFRCkgewotCQl0Y3BfYWNrX3VwZGF0ZV9ydHQoc2ssIGFja2VkLCBzZXFfcnR0KTsKLQkJdGNwX2Fja19wYWNrZXRzX291dChzaywgdHApOwotCQlpZiAocnR0X3NhbXBsZSAmJiAhKGFja2VkICYgRkxBR19SRVRSQU5TX0RBVEFfQUNLRUQpKQotCQkJKCpydHRfc2FtcGxlKShzaywgdGNwX3VzcnR0KCZ0dikpOworCQljb25zdCBzdHJ1Y3QgdGNwX2Nvbmdlc3Rpb25fb3BzICpjYV9vcHMKKwkJCT0gaW5ldF9jc2soc2spLT5pY3NrX2NhX29wczsKIAotCQlpZiAoaWNzay0+aWNza19jYV9vcHMtPnBrdHNfYWNrZWQpCi0JCQlpY3NrLT5pY3NrX2NhX29wcy0+cGt0c19hY2tlZChzaywgcGt0c19hY2tlZCk7CisJCXRjcF9hY2tfdXBkYXRlX3J0dChzaywgYWNrZWQsIHNlcV9ydHQpOworCQl0Y3BfYWNrX3BhY2tldHNfb3V0KHNrKTsKKworCQlpZiAoY2Ffb3BzLT5wa3RzX2Fja2VkKQorCQkJY2Ffb3BzLT5wa3RzX2Fja2VkKHNrLCBwa3RzX2Fja2VkLCBsYXN0X2Fja3QpOwogCX0KIAogI2lmIEZBU1RSRVRSQU5TX0RFQlVHID4gMApAQCAtMjM5MCw3ICsyNTIzLDcgQEAKIAogCS8qIFdhcyBpdCBhIHVzYWJsZSB3aW5kb3cgb3Blbj8gKi8KIAotCWlmICghYWZ0ZXIoVENQX1NLQl9DQihzay0+c2tfc2VuZF9oZWFkKS0+ZW5kX3NlcSwKKwlpZiAoIWFmdGVyKFRDUF9TS0JfQ0IodGNwX3NlbmRfaGVhZChzaykpLT5lbmRfc2VxLAogCQkgICB0cC0+c25kX3VuYSArIHRwLT5zbmRfd25kKSkgewogCQlpY3NrLT5pY3NrX2JhY2tvZmYgPSAwOwogCQlpbmV0X2Nza19jbGVhcl94bWl0X3RpbWVyKHNrLCBJQ1NLX1RJTUVfUFJPQkUwKTsKQEAgLTI0MzMsMTMgKzI1NjYsMTQgQEAKICAqIFdpbmRvdyB1cGRhdGUgYWxnb3JpdGhtLCBkZXNjcmliZWQgaW4gUkZDNzkzL1JGQzExMjIgKHVzZWQgaW4gbGludXgtMi4yCiAgKiBhbmQgaW4gRnJlZUJTRC4gTmV0QlNEJ3Mgb25lIGlzIGV2ZW4gd29yc2UuKSBpcyB3cm9uZy4KICAqLwotc3RhdGljIGludCB0Y3BfYWNrX3VwZGF0ZV93aW5kb3coc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgdGNwX3NvY2sgKnRwLAotCQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgYWNrLCB1MzIgYWNrX3NlcSkKK3N0YXRpYyBpbnQgdGNwX2Fja191cGRhdGVfd2luZG93KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIGFjaywKKwkJCQkgdTMyIGFja19zZXEpCiB7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CiAJaW50IGZsYWcgPSAwOwotCXUzMiBud2luID0gbnRvaHMoc2tiLT5oLnRoLT53aW5kb3cpOworCXUzMiBud2luID0gbnRvaHModGNwX2hkcihza2IpLT53aW5kb3cpOwogCi0JaWYgKGxpa2VseSghc2tiLT5oLnRoLT5zeW4pKQorCWlmIChsaWtlbHkoIXRjcF9oZHIoc2tiKS0+c3luKSkKIAkJbndpbiA8PD0gdHAtPnJ4X29wdC5zbmRfd3NjYWxlOwogCiAJaWYgKHRjcF9tYXlfdXBkYXRlX3dpbmRvdyh0cCwgYWNrLCBhY2tfc2VxLCBud2luKSkgewpAQCAtMjQ1Myw3ICsyNTg3LDcgQEAKIAkJCSAqIGZhc3QgcGF0aCBpcyByZWNvdmVyZWQgZm9yIHNlbmRpbmcgVENQLgogCQkJICovCiAJCQl0cC0+cHJlZF9mbGFncyA9IDA7Ci0JCQl0Y3BfZmFzdF9wYXRoX2NoZWNrKHNrLCB0cCk7CisJCQl0Y3BfZmFzdF9wYXRoX2NoZWNrKHNrKTsKIAogCQkJaWYgKG53aW4gPiB0cC0+bWF4X3dpbmRvdykgewogCQkJCXRwLT5tYXhfd2luZG93ID0gbndpbjsKQEAgLTI0NjcsMzkgKzI2MDEsMTM5IEBACiAJcmV0dXJuIGZsYWc7CiB9CiAKLXN0YXRpYyB2b2lkIHRjcF9wcm9jZXNzX2ZydG8oc3RydWN0IHNvY2sgKnNrLCB1MzIgcHJpb3Jfc25kX3VuYSkKKy8qIEEgdmVyeSBjb25zZXJ2YXRpdmUgc3B1cmlvdXMgUlRPIHJlc3BvbnNlIGFsZ29yaXRobTogcmVkdWNlIGN3bmQgYW5kCisgKiBjb250aW51ZSBpbiBjb25nZXN0aW9uIGF2b2lkYW5jZS4KKyAqLworc3RhdGljIHZvaWQgdGNwX2NvbnNlcnZhdGl2ZV9zcHVyX3RvX3Jlc3BvbnNlKHN0cnVjdCB0Y3Bfc29jayAqdHApCit7CisJdHAtPnNuZF9jd25kID0gbWluKHRwLT5zbmRfY3duZCwgdHAtPnNuZF9zc3RocmVzaCk7CisJdHAtPnNuZF9jd25kX2NudCA9IDA7CisJdGNwX21vZGVyYXRlX2N3bmQodHApOworfQorCisvKiBBIGNvbnNlcnZhdGl2ZSBzcHVyaW91cyBSVE8gcmVzcG9uc2UgYWxnb3JpdGhtOiByZWR1Y2UgY3duZCB1c2luZworICogcmF0ZSBoYWx2aW5nIGFuZCBjb250aW51ZSBpbiBjb25nZXN0aW9uIGF2b2lkYW5jZS4KKyAqLworc3RhdGljIHZvaWQgdGNwX3JhdGVoYWx2aW5nX3NwdXJfdG9fcmVzcG9uc2Uoc3RydWN0IHNvY2sgKnNrKQoreworCXRjcF9lbnRlcl9jd3Ioc2ssIDApOworfQorCitzdGF0aWMgdm9pZCB0Y3BfdW5kb19zcHVyX3RvX3Jlc3BvbnNlKHN0cnVjdCBzb2NrICpzaywgaW50IGZsYWcpCit7CisJaWYgKGZsYWcmRkxBR19FQ0UpCisJCXRjcF9yYXRlaGFsdmluZ19zcHVyX3RvX3Jlc3BvbnNlKHNrKTsKKwllbHNlCisJCXRjcF91bmRvX2N3cihzaywgMSk7Cit9CisKKy8qIEYtUlRPIHNwdXJpb3VzIFJUTyBkZXRlY3Rpb24gYWxnb3JpdGhtIChSRkM0MTM4KQorICoKKyAqIEYtUlRPIGFmZmVjdHMgZHVyaW5nIHR3byBuZXcgQUNLcyBmb2xsb3dpbmcgUlRPICh3ZWxsLCBhbG1vc3QsIHNlZSBpbmxpbmUKKyAqIGNvbW1lbnRzKS4gU3RhdGUgKEFDSyBudW1iZXIpIGlzIGtlcHQgaW4gZnJ0b19jb3VudGVyLiBXaGVuIEFDSyBhZHZhbmNlcworICogd2luZG93IChidXQgbm90IHRvIG9yIGJleW9uZCBoaWdoZXN0IHNlcXVlbmNlIHNlbnQgYmVmb3JlIFJUTyk6CisgKiAgIE9uIEZpcnN0IEFDSywgIHNlbmQgdHdvIG5ldyBzZWdtZW50cyBvdXQuCisgKiAgIE9uIFNlY29uZCBBQ0ssIFJUTyB3YXMgbGlrZWx5IHNwdXJpb3VzLiBEbyBzcHVyaW91cyByZXNwb25zZSAocmVzcG9uc2UKKyAqICAgICAgICAgICAgICAgICAgYWxnb3JpdGhtIGlzIG5vdCBwYXJ0IG9mIHRoZSBGLVJUTyBkZXRlY3Rpb24gYWxnb3JpdGhtCisgKiAgICAgICAgICAgICAgICAgIGdpdmVuIGluIFJGQzQxMzggYnV0IGNhbiBiZSBzZWxlY3RlZCBzZXBhcmF0ZWx5KS4KKyAqIE90aGVyd2lzZSAoYmFzaWNhbGx5IG9uIGR1cGxpY2F0ZSBBQ0spLCBSVE8gd2FzIChsaWtlbHkpIGNhdXNlZCBieSBhIGxvc3MKKyAqIGFuZCBUQ1AgZmFsbHMgYmFjayB0byBjb252ZW50aW9uYWwgUlRPIHJlY292ZXJ5LiBGLVJUTyBhbGxvd3Mgb3ZlcnJpZGluZworICogb2YgTmFnbGUsIHRoaXMgaXMgZG9uZSB1c2luZyBmcnRvX2NvdW50ZXIgc3RhdGVzIDIgYW5kIDMsIHdoZW4gYSBuZXcgZGF0YQorICogc2VnbWVudCBvZiBhbnkgc2l6ZSBzZW50IGR1cmluZyBGLVJUTywgc3RhdGUgMiBpcyB1cGdyYWRlZCB0byAzLgorICoKKyAqIFJhdGlvbmFsZTogaWYgdGhlIFJUTyB3YXMgc3B1cmlvdXMsIG5ldyBBQ0tzIHNob3VsZCBhcnJpdmUgZnJvbSB0aGUKKyAqIG9yaWdpbmFsIHdpbmRvdyBldmVuIGFmdGVyIHdlIHRyYW5zbWl0IHR3byBuZXcgZGF0YSBzZWdtZW50cy4KKyAqCisgKiBTQUNLIHZlcnNpb246CisgKiAgIG9uIGZpcnN0IHN0ZXAsIHdhaXQgdW50aWwgZmlyc3QgY3VtdWxhdGl2ZSBBQ0sgYXJyaXZlcywgdGhlbiBtb3ZlIHRvCisgKiAgIHRoZSBzZWNvbmQgc3RlcC4gSW4gc2Vjb25kIHN0ZXAsIHRoZSBuZXh0IEFDSyBkZWNpZGVzLgorICoKKyAqIEYtUlRPIGlzIGltcGxlbWVudGVkIChtYWlubHkpIGluIGZvdXIgZnVuY3Rpb25zOgorICogICAtIHRjcF91c2VfZnJ0bygpIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIFRDUCBpcyBjYW4gdXNlIEYtUlRPCisgKiAgIC0gdGNwX2VudGVyX2ZydG8oKSBwcmVwYXJlcyBUQ1Agc3RhdGUgb24gUlRPIGlmIEYtUlRPIGlzIHVzZWQsIGl0IGlzCisgKiAgICAgY2FsbGVkIHdoZW4gdGNwX3VzZV9mcnRvKCkgc2hvd2VkIGdyZWVuIGxpZ2h0CisgKiAgIC0gdGNwX3Byb2Nlc3NfZnJ0bygpIGhhbmRsZXMgaW5jb21pbmcgQUNLcyBkdXJpbmcgRi1SVE8gYWxnb3JpdGhtCisgKiAgIC0gdGNwX2VudGVyX2ZydG9fbG9zcygpIGlzIGNhbGxlZCBpZiB0aGVyZSBpcyBub3QgZW5vdWdoIGV2aWRlbmNlCisgKiAgICAgdG8gcHJvdmUgdGhhdCB0aGUgUlRPIGlzIGluZGVlZCBzcHVyaW91cy4gSXQgdHJhbnNmZXJzIHRoZSBjb250cm9sCisgKiAgICAgZnJvbSBGLVJUTyB0byB0aGUgY29udmVudGlvbmFsIFJUTyByZWNvdmVyeQorICovCitzdGF0aWMgaW50IHRjcF9wcm9jZXNzX2ZydG8oc3RydWN0IHNvY2sgKnNrLCB1MzIgcHJpb3Jfc25kX3VuYSwgaW50IGZsYWcpCiB7CiAJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CiAKIAl0Y3Bfc3luY19sZWZ0X291dCh0cCk7CiAKLQlpZiAodHAtPnNuZF91bmEgPT0gcHJpb3Jfc25kX3VuYSB8fAotCSAgICAhYmVmb3JlKHRwLT5zbmRfdW5hLCB0cC0+ZnJ0b19oaWdobWFyaykpIHsKLQkJLyogUlRPIHdhcyBjYXVzZWQgYnkgbG9zcywgc3RhcnQgcmV0cmFuc21pdHRpbmcgaW4KLQkJICogZ28tYmFjay1OIHNsb3cgc3RhcnQKKwkvKiBEdXBsaWNhdGUgdGhlIGJlaGF2aW9yIGZyb20gTG9zcyBzdGF0ZSAoZmFzdHJldHJhbnNfYWxlcnQpICovCisJaWYgKGZsYWcmRkxBR19EQVRBX0FDS0VEKQorCQlpbmV0X2NzayhzayktPmljc2tfcmV0cmFuc21pdHMgPSAwOworCisJaWYgKCFiZWZvcmUodHAtPnNuZF91bmEsIHRwLT5mcnRvX2hpZ2htYXJrKSkgeworCQl0Y3BfZW50ZXJfZnJ0b19sb3NzKHNrLCAodHAtPmZydG9fY291bnRlciA9PSAxID8gMiA6IDMpLCBmbGFnKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKCFJc1NhY2tGcnRvKCkgfHwgSXNSZW5vKHRwKSkgeworCQkvKiBSRkM0MTM4IHNob3J0Y29taW5nIGluIHN0ZXAgMjsgc2hvdWxkIGFsc28gaGF2ZSBjYXNlIGMpOgorCQkgKiBBQ0sgaXNuJ3QgZHVwbGljYXRlIG5vciBhZHZhbmNlcyB3aW5kb3csIGUuZy4sIG9wcG9zaXRlIGRpcgorCQkgKiBkYXRhLCB3aW51cGRhdGUKIAkJICovCi0JCXRjcF9lbnRlcl9mcnRvX2xvc3Moc2spOwotCQlyZXR1cm47CisJCWlmICgodHAtPnNuZF91bmEgPT0gcHJpb3Jfc25kX3VuYSkgJiYgKGZsYWcmRkxBR19OT1RfRFVQKSAmJgorCQkgICAgIShmbGFnJkZMQUdfRk9SV0FSRF9QUk9HUkVTUykpCisJCQlyZXR1cm4gMTsKKworCQlpZiAoIShmbGFnJkZMQUdfREFUQV9BQ0tFRCkpIHsKKwkJCXRjcF9lbnRlcl9mcnRvX2xvc3Moc2ssICh0cC0+ZnJ0b19jb3VudGVyID09IDEgPyAwIDogMyksCisJCQkJCSAgICBmbGFnKTsKKwkJCXJldHVybiAxOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKCEoZmxhZyZGTEFHX0RBVEFfQUNLRUQpICYmICh0cC0+ZnJ0b19jb3VudGVyID09IDEpKSB7CisJCQkvKiBQcmV2ZW50IHNlbmRpbmcgb2YgbmV3IGRhdGEuICovCisJCQl0cC0+c25kX2N3bmQgPSBtaW4odHAtPnNuZF9jd25kLAorCQkJCQkgICB0Y3BfcGFja2V0c19pbl9mbGlnaHQodHApKTsKKwkJCXJldHVybiAxOworCQl9CisKKwkJaWYgKCh0cC0+ZnJ0b19jb3VudGVyID49IDIpICYmCisJCSAgICAoIShmbGFnJkZMQUdfRk9SV0FSRF9QUk9HUkVTUykgfHwKKwkJICAgICAoKGZsYWcmRkxBR19EQVRBX1NBQ0tFRCkgJiYgIShmbGFnJkZMQUdfT05MWV9PUklHX1NBQ0tFRCkpKSkgeworCQkJLyogUkZDNDEzOCBzaG9ydGNvbWluZyAoc2VlIGNvbW1lbnQgYWJvdmUpICovCisJCQlpZiAoIShmbGFnJkZMQUdfRk9SV0FSRF9QUk9HUkVTUykgJiYgKGZsYWcmRkxBR19OT1RfRFVQKSkKKwkJCQlyZXR1cm4gMTsKKworCQkJdGNwX2VudGVyX2ZydG9fbG9zcyhzaywgMywgZmxhZyk7CisJCQlyZXR1cm4gMTsKKwkJfQogCX0KIAogCWlmICh0cC0+ZnJ0b19jb3VudGVyID09IDEpIHsKLQkJLyogRmlyc3QgQUNLIGFmdGVyIFJUTyBhZHZhbmNlcyB0aGUgd2luZG93OiBhbGxvdyB0d28gbmV3Ci0JCSAqIHNlZ21lbnRzIG91dC4KLQkJICovCi0JCXRwLT5zbmRfY3duZCA9IHRjcF9wYWNrZXRzX2luX2ZsaWdodCh0cCkgKyAyOwotCX0gZWxzZSB7Ci0JCS8qIEFsc28gdGhlIHNlY29uZCBBQ0sgYWZ0ZXIgUlRPIGFkdmFuY2VzIHRoZSB3aW5kb3cuCi0JCSAqIFRoZSBSVE8gd2FzIGxpa2VseSBzcHVyaW91cy4gUmVkdWNlIGN3bmQgYW5kIGNvbnRpbnVlCi0JCSAqIGluIGNvbmdlc3Rpb24gYXZvaWRhbmNlCi0JCSAqLwotCQl0cC0+c25kX2N3bmQgPSBtaW4odHAtPnNuZF9jd25kLCB0cC0+c25kX3NzdGhyZXNoKTsKLQkJdGNwX21vZGVyYXRlX2N3bmQodHApOwotCX0KKwkJLyogU2VuZGluZyBvZiB0aGUgbmV4dCBza2IgbXVzdCBiZSBhbGxvd2VkIG9yIG5vIEZSVE8gKi8KKwkJaWYgKCF0Y3Bfc2VuZF9oZWFkKHNrKSB8fAorCQkgICAgYWZ0ZXIoVENQX1NLQl9DQih0Y3Bfc2VuZF9oZWFkKHNrKSktPmVuZF9zZXEsCisJCQkJICAgICB0cC0+c25kX3VuYSArIHRwLT5zbmRfd25kKSkgeworCQkJdGNwX2VudGVyX2ZydG9fbG9zcyhzaywgKHRwLT5mcnRvX2NvdW50ZXIgPT0gMSA/IDIgOiAzKSwKKwkJCQkJICAgIGZsYWcpOworCQkJcmV0dXJuIDE7CisJCX0KIAotCS8qIEYtUlRPIGFmZmVjdHMgb24gdHdvIG5ldyBBQ0tzIGZvbGxvd2luZyBSVE8uCi0JICogQXQgbGF0ZXN0IG9uIHRoaXJkIEFDSyB0aGUgVENQIGJlaGF2aW9yIGlzIGJhY2sgdG8gbm9ybWFsLgotCSAqLwotCXRwLT5mcnRvX2NvdW50ZXIgPSAodHAtPmZydG9fY291bnRlciArIDEpICUgMzsKKwkJdHAtPnNuZF9jd25kID0gdGNwX3BhY2tldHNfaW5fZmxpZ2h0KHRwKSArIDI7CisJCXRwLT5mcnRvX2NvdW50ZXIgPSAyOworCQlyZXR1cm4gMTsKKwl9IGVsc2UgeworCQlzd2l0Y2ggKHN5c2N0bF90Y3BfZnJ0b19yZXNwb25zZSkgeworCQljYXNlIDI6CisJCQl0Y3BfdW5kb19zcHVyX3RvX3Jlc3BvbnNlKHNrLCBmbGFnKTsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQl0Y3BfY29uc2VydmF0aXZlX3NwdXJfdG9fcmVzcG9uc2UodHApOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl0Y3BfcmF0ZWhhbHZpbmdfc3B1cl90b19yZXNwb25zZShzayk7CisJCQlicmVhazsKKwkJfQorCQl0cC0+ZnJ0b19jb3VudGVyID0gMDsKKwl9CisJcmV0dXJuIDA7CiB9CiAKIC8qIFRoaXMgcm91dGluZSBkZWFscyB3aXRoIGluY29taW5nIGFja3MsIGJ1dCBub3Qgb3V0Z29pbmcgb25lcy4gKi8KQEAgLTI1MTMsNiArMjc0Nyw3IEBACiAJdTMyIHByaW9yX2luX2ZsaWdodDsKIAlzMzIgc2VxX3J0dDsKIAlpbnQgcHJpb3JfcGFja2V0czsKKwlpbnQgZnJ0b19jd25kID0gMDsKIAogCS8qIElmIHRoZSBhY2sgaXMgbmV3ZXIgdGhhbiBzZW50IG9yIG9sZGVyIHRoYW4gcHJldmlvdXMgYWNrcwogCSAqIHRoZW4gd2UgY2FuIHByb2JhYmx5IGlnbm9yZSBpdC4KQEAgLTI1NDksMTIgKzI3ODQsMTIgQEAKIAkJZWxzZQogCQkJTkVUX0lOQ19TVEFUU19CSChMSU5VWF9NSUJfVENQUFVSRUFDS1MpOwogCi0JCWZsYWcgfD0gdGNwX2Fja191cGRhdGVfd2luZG93KHNrLCB0cCwgc2tiLCBhY2ssIGFja19zZXEpOworCQlmbGFnIHw9IHRjcF9hY2tfdXBkYXRlX3dpbmRvdyhzaywgc2tiLCBhY2ssIGFja19zZXEpOwogCiAJCWlmIChUQ1BfU0tCX0NCKHNrYiktPnNhY2tlZCkKIAkJCWZsYWcgfD0gdGNwX3NhY2t0YWdfd3JpdGVfcXVldWUoc2ssIHNrYiwgcHJpb3Jfc25kX3VuYSk7CiAKLQkJaWYgKFRDUF9FQ05fcmN2X2Vjbl9lY2hvKHRwLCBza2ItPmgudGgpKQorCQlpZiAoVENQX0VDTl9yY3ZfZWNuX2VjaG8odHAsIHRjcF9oZHIoc2tiKSkpCiAJCQlmbGFnIHw9IEZMQUdfRUNFOwogCiAJCXRjcF9jYV9ldmVudChzaywgQ0FfRVZFTlRfU0xPV19BQ0spOwpAQCAtMjU3NSwxNSArMjgxMCwxNiBAQAogCWZsYWcgfD0gdGNwX2NsZWFuX3J0eF9xdWV1ZShzaywgJnNlcV9ydHQpOwogCiAJaWYgKHRwLT5mcnRvX2NvdW50ZXIpCi0JCXRjcF9wcm9jZXNzX2ZydG8oc2ssIHByaW9yX3NuZF91bmEpOworCQlmcnRvX2N3bmQgPSB0Y3BfcHJvY2Vzc19mcnRvKHNrLCBwcmlvcl9zbmRfdW5hLCBmbGFnKTsKIAogCWlmICh0Y3BfYWNrX2lzX2R1YmlvdXMoc2ssIGZsYWcpKSB7CiAJCS8qIEFkdmFuY2UgQ1dORCwgaWYgc3RhdGUgYWxsb3dzIHRoaXMuICovCi0JCWlmICgoZmxhZyAmIEZMQUdfREFUQV9BQ0tFRCkgJiYgdGNwX21heV9yYWlzZV9jd25kKHNrLCBmbGFnKSkKKwkJaWYgKChmbGFnICYgRkxBR19EQVRBX0FDS0VEKSAmJiAhZnJ0b19jd25kICYmCisJCSAgICB0Y3BfbWF5X3JhaXNlX2N3bmQoc2ssIGZsYWcpKQogCQkJdGNwX2NvbmdfYXZvaWQoc2ssIGFjaywgIHNlcV9ydHQsIHByaW9yX2luX2ZsaWdodCwgMCk7CiAJCXRjcF9mYXN0cmV0cmFuc19hbGVydChzaywgcHJpb3Jfc25kX3VuYSwgcHJpb3JfcGFja2V0cywgZmxhZyk7CiAJfSBlbHNlIHsKLQkJaWYgKChmbGFnICYgRkxBR19EQVRBX0FDS0VEKSkKKwkJaWYgKChmbGFnICYgRkxBR19EQVRBX0FDS0VEKSAmJiAhZnJ0b19jd25kKQogCQkJdGNwX2NvbmdfYXZvaWQoc2ssIGFjaywgc2VxX3J0dCwgcHJpb3JfaW5fZmxpZ2h0LCAxKTsKIAl9CiAKQEAgLTI1OTksNyArMjgzNSw3IEBACiAJICogYmVpbmcgdXNlZCB0byB0aW1lIHRoZSBwcm9iZXMsIGFuZCBpcyBwcm9iYWJseSBmYXIgaGlnaGVyIHRoYW4KIAkgKiBpdCBuZWVkcyB0byBiZSBmb3Igbm9ybWFsIHJldHJhbnNtaXNzaW9uLgogCSAqLwotCWlmIChzay0+c2tfc2VuZF9oZWFkKQorCWlmICh0Y3Bfc2VuZF9oZWFkKHNrKSkKIAkJdGNwX2Fja19wcm9iZShzayk7CiAJcmV0dXJuIDE7CiAKQEAgLTI2MjAsMTMgKzI4NTYsMTMgQEAKIHZvaWQgdGNwX3BhcnNlX29wdGlvbnMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHRjcF9vcHRpb25zX3JlY2VpdmVkICpvcHRfcngsIGludCBlc3RhYikKIHsKIAl1bnNpZ25lZCBjaGFyICpwdHI7Ci0Jc3RydWN0IHRjcGhkciAqdGggPSBza2ItPmgudGg7CisJc3RydWN0IHRjcGhkciAqdGggPSB0Y3BfaGRyKHNrYik7CiAJaW50IGxlbmd0aD0odGgtPmRvZmYqNCktc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpOwogCiAJcHRyID0gKHVuc2lnbmVkIGNoYXIgKikodGggKyAxKTsKIAlvcHRfcngtPnNhd190c3RhbXAgPSAwOwogCi0Jd2hpbGUobGVuZ3RoPjApIHsKKwl3aGlsZSAobGVuZ3RoID4gMCkgewogCQlpbnQgb3Bjb2RlPSpwdHIrKzsKIAkJaW50IG9wc2l6ZTsKIApAQCAtMjY0Miw5ICsyODc4LDkgQEAKIAkJCQkJcmV0dXJuOwogCQkJCWlmIChvcHNpemUgPiBsZW5ndGgpCiAJCQkJCXJldHVybjsJLyogZG9uJ3QgcGFyc2UgcGFydGlhbCBvcHRpb25zICovCi0JCQkJc3dpdGNoKG9wY29kZSkgeworCQkJCXN3aXRjaCAob3Bjb2RlKSB7CiAJCQkJY2FzZSBUQ1BPUFRfTVNTOgotCQkJCQlpZihvcHNpemU9PVRDUE9MRU5fTVNTICYmIHRoLT5zeW4gJiYgIWVzdGFiKSB7CisJCQkJCWlmIChvcHNpemU9PVRDUE9MRU5fTVNTICYmIHRoLT5zeW4gJiYgIWVzdGFiKSB7CiAJCQkJCQl1MTYgaW5fbXNzID0gbnRvaHMoZ2V0X3VuYWxpZ25lZCgoX19iZTE2ICopcHRyKSk7CiAJCQkJCQlpZiAoaW5fbXNzKSB7CiAJCQkJCQkJaWYgKG9wdF9yeC0+dXNlcl9tc3MgJiYgb3B0X3J4LT51c2VyX21zcyA8IGluX21zcykKQEAgLTI2NTQsMTIgKzI4OTAsMTIgQEAKIAkJCQkJfQogCQkJCQlicmVhazsKIAkJCQljYXNlIFRDUE9QVF9XSU5ET1c6Ci0JCQkJCWlmKG9wc2l6ZT09VENQT0xFTl9XSU5ET1cgJiYgdGgtPnN5biAmJiAhZXN0YWIpCisJCQkJCWlmIChvcHNpemU9PVRDUE9MRU5fV0lORE9XICYmIHRoLT5zeW4gJiYgIWVzdGFiKQogCQkJCQkJaWYgKHN5c2N0bF90Y3Bfd2luZG93X3NjYWxpbmcpIHsKIAkJCQkJCQlfX3U4IHNuZF93c2NhbGUgPSAqKF9fdTggKikgcHRyOwogCQkJCQkJCW9wdF9yeC0+d3NjYWxlX29rID0gMTsKIAkJCQkJCQlpZiAoc25kX3dzY2FsZSA+IDE0KSB7Ci0JCQkJCQkJCWlmKG5ldF9yYXRlbGltaXQoKSkKKwkJCQkJCQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKIAkJCQkJCQkJCXByaW50ayhLRVJOX0lORk8gInRjcF9wYXJzZV9vcHRpb25zOiBJbGxlZ2FsIHdpbmRvdyAiCiAJCQkJCQkJCQkgICAgICAgInNjYWxpbmcgdmFsdWUgJWQgPjE0IHJlY2VpdmVkLlxuIiwKIAkJCQkJCQkJCSAgICAgICBzbmRfd3NjYWxlKTsKQEAgLTI2NjksNyArMjkwNSw3IEBACiAJCQkJCQl9CiAJCQkJCWJyZWFrOwogCQkJCWNhc2UgVENQT1BUX1RJTUVTVEFNUDoKLQkJCQkJaWYob3BzaXplPT1UQ1BPTEVOX1RJTUVTVEFNUCkgeworCQkJCQlpZiAob3BzaXplPT1UQ1BPTEVOX1RJTUVTVEFNUCkgewogCQkJCQkJaWYgKChlc3RhYiAmJiBvcHRfcngtPnRzdGFtcF9vaykgfHwKIAkJCQkJCSAgICAoIWVzdGFiICYmIHN5c2N0bF90Y3BfdGltZXN0YW1wcykpIHsKIAkJCQkJCQlvcHRfcngtPnNhd190c3RhbXAgPSAxOwpAQCAtMjY3OSw3ICsyOTE1LDcgQEAKIAkJCQkJfQogCQkJCQlicmVhazsKIAkJCQljYXNlIFRDUE9QVF9TQUNLX1BFUk06Ci0JCQkJCWlmKG9wc2l6ZT09VENQT0xFTl9TQUNLX1BFUk0gJiYgdGgtPnN5biAmJiAhZXN0YWIpIHsKKwkJCQkJaWYgKG9wc2l6ZT09VENQT0xFTl9TQUNLX1BFUk0gJiYgdGgtPnN5biAmJiAhZXN0YWIpIHsKIAkJCQkJCWlmIChzeXNjdGxfdGNwX3NhY2spIHsKIAkJCQkJCQlvcHRfcngtPnNhY2tfb2sgPSAxOwogCQkJCQkJCXRjcF9zYWNrX3Jlc2V0KG9wdF9yeCk7CkBAIC0yNjg4LDcgKzI5MjQsNyBAQAogCQkJCQlicmVhazsKIAogCQkJCWNhc2UgVENQT1BUX1NBQ0s6Ci0JCQkJCWlmKChvcHNpemUgPj0gKFRDUE9MRU5fU0FDS19CQVNFICsgVENQT0xFTl9TQUNLX1BFUkJMT0NLKSkgJiYKKwkJCQkJaWYgKChvcHNpemUgPj0gKFRDUE9MRU5fU0FDS19CQVNFICsgVENQT0xFTl9TQUNLX1BFUkJMT0NLKSkgJiYKIAkJCQkJICAgISgob3BzaXplIC0gVENQT0xFTl9TQUNLX0JBU0UpICUgVENQT0xFTl9TQUNLX1BFUkJMT0NLKSAmJgogCQkJCQkgICBvcHRfcngtPnNhY2tfb2spIHsKIAkJCQkJCVRDUF9TS0JfQ0Ioc2tiKS0+c2Fja2VkID0gKHB0ciAtIDIpIC0gKHVuc2lnbmVkIGNoYXIgKil0aDsKQEAgLTI3MDEsMTAgKzI5MzcsMTEgQEAKIAkJCQkJICovCiAJCQkJCWJyZWFrOwogI2VuZGlmCi0JCQkJfTsKKwkJCQl9CisKIAkJCQlwdHIrPW9wc2l6ZS0yOwogCQkJCWxlbmd0aC09b3BzaXplOwotCQl9OworCQl9CiAJfQogfQogCkBAIC0yNzM3LDcgKzI5NzQsNyBAQAogc3RhdGljIGlubGluZSB2b2lkIHRjcF9zdG9yZV90c19yZWNlbnQoc3RydWN0IHRjcF9zb2NrICp0cCkKIHsKIAl0cC0+cnhfb3B0LnRzX3JlY2VudCA9IHRwLT5yeF9vcHQucmN2X3RzdmFsOwotCXRwLT5yeF9vcHQudHNfcmVjZW50X3N0YW1wID0geHRpbWUudHZfc2VjOworCXRwLT5yeF9vcHQudHNfcmVjZW50X3N0YW1wID0gZ2V0X3NlY29uZHMoKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHRjcF9yZXBsYWNlX3RzX3JlY2VudChzdHJ1Y3QgdGNwX3NvY2sgKnRwLCB1MzIgc2VxKQpAQCAtMjc1MCw4ICsyOTg3LDggQEAKIAkJICogTm90IG9ubHksIGFsc28gaXQgb2NjdXJzIGZvciBleHBpcmVkIHRpbWVzdGFtcHMuCiAJCSAqLwogCi0JCWlmKChzMzIpKHRwLT5yeF9vcHQucmN2X3RzdmFsIC0gdHAtPnJ4X29wdC50c19yZWNlbnQpID49IDAgfHwKLQkJICAgeHRpbWUudHZfc2VjID49IHRwLT5yeF9vcHQudHNfcmVjZW50X3N0YW1wICsgVENQX1BBV1NfMjREQVlTKQorCQlpZiAoKHMzMikodHAtPnJ4X29wdC5yY3ZfdHN2YWwgLSB0cC0+cnhfb3B0LnRzX3JlY2VudCkgPj0gMCB8fAorCQkgICBnZXRfc2Vjb25kcygpID49IHRwLT5yeF9vcHQudHNfcmVjZW50X3N0YW1wICsgVENQX1BBV1NfMjREQVlTKQogCQkJdGNwX3N0b3JlX3RzX3JlY2VudCh0cCk7CiAJfQogfQpAQCAtMjc4Miw3ICszMDE5LDcgQEAKIHN0YXRpYyBpbnQgdGNwX2Rpc29yZGVyZWRfYWNrKGNvbnN0IHN0cnVjdCBzb2NrICpzaywgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKLQlzdHJ1Y3QgdGNwaGRyICp0aCA9IHNrYi0+aC50aDsKKwlzdHJ1Y3QgdGNwaGRyICp0aCA9IHRjcF9oZHIoc2tiKTsKIAl1MzIgc2VxID0gVENQX1NLQl9DQihza2IpLT5zZXE7CiAJdTMyIGFjayA9IFRDUF9TS0JfQ0Ioc2tiKS0+YWNrX3NlcTsKIApAQCAtMjgwMyw3ICszMDQwLDcgQEAKIHsKIAljb25zdCBzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKIAlyZXR1cm4gKChzMzIpKHRwLT5yeF9vcHQudHNfcmVjZW50IC0gdHAtPnJ4X29wdC5yY3ZfdHN2YWwpID4gVENQX1BBV1NfV0lORE9XICYmCi0JCXh0aW1lLnR2X3NlYyA8IHRwLT5yeF9vcHQudHNfcmVjZW50X3N0YW1wICsgVENQX1BBV1NfMjREQVlTICYmCisJCWdldF9zZWNvbmRzKCkgPCB0cC0+cnhfb3B0LnRzX3JlY2VudF9zdGFtcCArIFRDUF9QQVdTXzI0REFZUyAmJgogCQkhdGNwX2Rpc29yZGVyZWRfYWNrKHNrLCBza2IpKTsKIH0KIApAQCAtMjkxMCw3ICszMTQ3LDcgQEAKIAkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEltcG9zc2libGUsIHNrLT5za19zdGF0ZT0lZFxuIiwKIAkJCSAgICAgICBfX0ZVTkNUSU9OX18sIHNrLT5za19zdGF0ZSk7CiAJCQlicmVhazsKLQl9OworCX0KIAogCS8qIEl0IF9pc18gcG9zc2libGUsIHRoYXQgd2UgaGF2ZSBzb21ldGhpbmcgb3V0LW9mLW9yZGVyIF9hZnRlcl8gRklOLgogCSAqIFByb2JhYmx5LCB3ZSBzaG91bGQgcmVzZXQgaW4gdGhpcyBjYXNlLiBGb3Igbm93IGRyb3AgdGhlbS4KQEAgLTMwMDksNyArMzI0Niw3IEBACiAJCQkgKi8KIAkJCXRwLT5yeF9vcHQubnVtX3NhY2tzLS07CiAJCQl0cC0+cnhfb3B0LmVmZl9zYWNrcyA9IG1pbih0cC0+cnhfb3B0Lm51bV9zYWNrcyArIHRwLT5yeF9vcHQuZHNhY2ssIDQgLSB0cC0+cnhfb3B0LnRzdGFtcF9vayk7Ci0JCQlmb3IoaT10aGlzX3NhY2s7IGkgPCB0cC0+cnhfb3B0Lm51bV9zYWNrczsgaSsrKQorCQkJZm9yIChpPXRoaXNfc2FjazsgaSA8IHRwLT5yeF9vcHQubnVtX3NhY2tzOyBpKyspCiAJCQkJc3BbaV0gPSBzcFtpKzFdOwogCQkJY29udGludWU7CiAJCX0KQEAgLTMwNjIsNyArMzI5OSw3IEBACiAJCXRwLT5yeF9vcHQubnVtX3NhY2tzLS07CiAJCXNwLS07CiAJfQotCWZvcig7IHRoaXNfc2FjayA+IDA7IHRoaXNfc2Fjay0tLCBzcC0tKQorCWZvciAoOyB0aGlzX3NhY2sgPiAwOyB0aGlzX3NhY2stLSwgc3AtLSkKIAkJKnNwID0gKihzcC0xKTsKIAogbmV3X3NhY2s6CkBAIC0zMDg4LDcgKzMzMjUsNyBAQAogCQlyZXR1cm47CiAJfQogCi0JZm9yKHRoaXNfc2FjayA9IDA7IHRoaXNfc2FjayA8IG51bV9zYWNrczsgKSB7CisJZm9yICh0aGlzX3NhY2sgPSAwOyB0aGlzX3NhY2sgPCBudW1fc2Fja3M7ICkgewogCQkvKiBDaGVjayBpZiB0aGUgc3RhcnQgb2YgdGhlIHNhY2sgaXMgY292ZXJlZCBieSBSQ1YuTlhULiAqLwogCQlpZiAoIWJlZm9yZSh0cC0+cmN2X254dCwgc3AtPnN0YXJ0X3NlcSkpIHsKIAkJCWludCBpOwpAQCAtMzE0NCw4ICszMzgxLDggQEAKIAkJX19za2JfdW5saW5rKHNrYiwgJnRwLT5vdXRfb2Zfb3JkZXJfcXVldWUpOwogCQlfX3NrYl9xdWV1ZV90YWlsKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSwgc2tiKTsKIAkJdHAtPnJjdl9ueHQgPSBUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXE7Ci0JCWlmKHNrYi0+aC50aC0+ZmluKQotCQkJdGNwX2Zpbihza2IsIHNrLCBza2ItPmgudGgpOworCQlpZiAodGNwX2hkcihza2IpLT5maW4pCisJCQl0Y3BfZmluKHNrYiwgc2ssIHRjcF9oZHIoc2tiKSk7CiAJfQogfQogCkBAIC0zMTUzLDcgKzMzOTAsNyBAQAogCiBzdGF0aWMgdm9pZCB0Y3BfZGF0YV9xdWV1ZShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0Jc3RydWN0IHRjcGhkciAqdGggPSBza2ItPmgudGg7CisJc3RydWN0IHRjcGhkciAqdGggPSB0Y3BfaGRyKHNrYik7CiAJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CiAJaW50IGVhdGVuID0gLTE7CiAKQEAgLTMyMTAsOSArMzQ0Nyw5IEBACiAJCQlfX3NrYl9xdWV1ZV90YWlsKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSwgc2tiKTsKIAkJfQogCQl0cC0+cmN2X254dCA9IFRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcTsKLQkJaWYoc2tiLT5sZW4pCi0JCQl0Y3BfZXZlbnRfZGF0YV9yZWN2KHNrLCB0cCwgc2tiKTsKLQkJaWYodGgtPmZpbikKKwkJaWYgKHNrYi0+bGVuKQorCQkJdGNwX2V2ZW50X2RhdGFfcmVjdihzaywgc2tiKTsKKwkJaWYgKHRoLT5maW4pCiAJCQl0Y3BfZmluKHNrYiwgc2ssIHRoKTsKIAogCQlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmdHAtPm91dF9vZl9vcmRlcl9xdWV1ZSkpIHsKQEAgLTMyMjgsNyArMzQ2NSw3IEBACiAJCWlmICh0cC0+cnhfb3B0Lm51bV9zYWNrcykKIAkJCXRjcF9zYWNrX3JlbW92ZSh0cCk7CiAKLQkJdGNwX2Zhc3RfcGF0aF9jaGVjayhzaywgdHApOworCQl0Y3BfZmFzdF9wYXRoX2NoZWNrKHNrKTsKIAogCQlpZiAoZWF0ZW4gPiAwKQogCQkJX19rZnJlZV9za2Ioc2tiKTsKQEAgLTMzOTIsNyArMzYyOSw3IEBACiAJCSAqIC0gYmxvYXRlZCBvciBjb250YWlucyBkYXRhIGJlZm9yZSAic3RhcnQiIG9yCiAJCSAqICAgb3ZlcmxhcHMgdG8gdGhlIG5leHQgb25lLgogCQkgKi8KLQkJaWYgKCFza2ItPmgudGgtPnN5biAmJiAhc2tiLT5oLnRoLT5maW4gJiYKKwkJaWYgKCF0Y3BfaGRyKHNrYiktPnN5biAmJiAhdGNwX2hkcihza2IpLT5maW4gJiYKIAkJICAgICh0Y3Bfd2luX2Zyb21fc3BhY2Uoc2tiLT50cnVlc2l6ZSkgPiBza2ItPmxlbiB8fAogCQkgICAgIGJlZm9yZShUQ1BfU0tCX0NCKHNrYiktPnNlcSwgc3RhcnQpIHx8CiAJCSAgICAgKHNrYi0+bmV4dCAhPSB0YWlsICYmCkBAIC0zNDAzLDcgKzM2NDAsNyBAQAogCQlzdGFydCA9IFRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcTsKIAkJc2tiID0gc2tiLT5uZXh0OwogCX0KLQlpZiAoc2tiID09IHRhaWwgfHwgc2tiLT5oLnRoLT5zeW4gfHwgc2tiLT5oLnRoLT5maW4pCisJaWYgKHNrYiA9PSB0YWlsIHx8IHRjcF9oZHIoc2tiKS0+c3luIHx8IHRjcF9oZHIoc2tiKS0+ZmluKQogCQlyZXR1cm47CiAKIAl3aGlsZSAoYmVmb3JlKHN0YXJ0LCBlbmQpKSB7CkBAIC0zNDE5LDExICszNjU2LDE0IEBACiAJCW5za2IgPSBhbGxvY19za2IoY29weStoZWFkZXIsIEdGUF9BVE9NSUMpOwogCQlpZiAoIW5za2IpCiAJCQlyZXR1cm47CisKKwkJc2tiX3NldF9tYWNfaGVhZGVyKG5za2IsIHNrYl9tYWNfaGVhZGVyKHNrYikgLSBza2ItPmhlYWQpOworCQlza2Jfc2V0X25ldHdvcmtfaGVhZGVyKG5za2IsIChza2JfbmV0d29ya19oZWFkZXIoc2tiKSAtCisJCQkJCSAgICAgIHNrYi0+aGVhZCkpOworCQlza2Jfc2V0X3RyYW5zcG9ydF9oZWFkZXIobnNrYiwgKHNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYikgLQorCQkJCQkJc2tiLT5oZWFkKSk7CiAJCXNrYl9yZXNlcnZlKG5za2IsIGhlYWRlcik7CiAJCW1lbWNweShuc2tiLT5oZWFkLCBza2ItPmhlYWQsIGhlYWRlcik7Ci0JCW5za2ItPm5oLnJhdyA9IG5za2ItPmhlYWQgKyAoc2tiLT5uaC5yYXctc2tiLT5oZWFkKTsKLQkJbnNrYi0+aC5yYXcgPSBuc2tiLT5oZWFkICsgKHNrYi0+aC5yYXctc2tiLT5oZWFkKTsKLQkJbnNrYi0+bWFjLnJhdyA9IG5za2ItPmhlYWQgKyAoc2tiLT5tYWMucmF3LXNrYi0+aGVhZCk7CiAJCW1lbWNweShuc2tiLT5jYiwgc2tiLT5jYiwgc2l6ZW9mKHNrYi0+Y2IpKTsKIAkJVENQX1NLQl9DQihuc2tiKS0+c2VxID0gVENQX1NLQl9DQihuc2tiKS0+ZW5kX3NlcSA9IHN0YXJ0OwogCQlfX3NrYl9pbnNlcnQobnNrYiwgc2tiLT5wcmV2LCBza2IsIGxpc3QpOwpAQCAtMzQ0OSw3ICszNjg5LDkgQEAKIAkJCQlfX2tmcmVlX3NrYihza2IpOwogCQkJCU5FVF9JTkNfU1RBVFNfQkgoTElOVVhfTUlCX1RDUFJDVkNPTExBUFNFRCk7CiAJCQkJc2tiID0gbmV4dDsKLQkJCQlpZiAoc2tiID09IHRhaWwgfHwgc2tiLT5oLnRoLT5zeW4gfHwgc2tiLT5oLnRoLT5maW4pCisJCQkJaWYgKHNrYiA9PSB0YWlsIHx8CisJCQkJICAgIHRjcF9oZHIoc2tiKS0+c3luIHx8CisJCQkJICAgIHRjcF9oZHIoc2tiKS0+ZmluKQogCQkJCQlyZXR1cm47CiAJCQl9CiAJCX0KQEAgLTM1MTQsNyArMzc1Niw3IEBACiAJTkVUX0lOQ19TVEFUU19CSChMSU5VWF9NSUJfUFJVTkVDQUxMRUQpOwogCiAJaWYgKGF0b21pY19yZWFkKCZzay0+c2tfcm1lbV9hbGxvYykgPj0gc2stPnNrX3JjdmJ1ZikKLQkJdGNwX2NsYW1wX3dpbmRvdyhzaywgdHApOworCQl0Y3BfY2xhbXBfd2luZG93KHNrKTsKIAllbHNlIGlmICh0Y3BfbWVtb3J5X3ByZXNzdXJlKQogCQl0cC0+cmN2X3NzdGhyZXNoID0gbWluKHRwLT5yY3Zfc3N0aHJlc2gsIDRVICogdHAtPmFkdm1zcyk7CiAKQEAgLTM1ODMsOCArMzgyNSwxMCBAQAogCXRwLT5zbmRfY3duZF9zdGFtcCA9IHRjcF90aW1lX3N0YW1wOwogfQogCi1zdGF0aWMgaW50IHRjcF9zaG91bGRfZXhwYW5kX3NuZGJ1ZihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCB0Y3Bfc29jayAqdHApCitzdGF0aWMgaW50IHRjcF9zaG91bGRfZXhwYW5kX3NuZGJ1ZihzdHJ1Y3Qgc29jayAqc2spCiB7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisKIAkvKiBJZiB0aGUgdXNlciBzcGVjaWZpZWQgYSBzcGVjaWZpYyBzZW5kIGJ1ZmZlciBzZXR0aW5nLCBkbwogCSAqIG5vdCBtb2RpZnkgaXQuCiAJICovCkBAIC0zNjE2LDcgKzM4NjAsNyBAQAogewogCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOwogCi0JaWYgKHRjcF9zaG91bGRfZXhwYW5kX3NuZGJ1ZihzaywgdHApKSB7CisJaWYgKHRjcF9zaG91bGRfZXhwYW5kX3NuZGJ1ZihzaykpIHsKIAkJaW50IHNuZG1lbSA9IG1heF90KHUzMiwgdHAtPnJ4X29wdC5tc3NfY2xhbXAsIHRwLT5tc3NfY2FjaGUpICsKIAkJCU1BWF9UQ1BfSEVBREVSICsgMTYgKyBzaXplb2Yoc3RydWN0IHNrX2J1ZmYpLAogCQkgICAgZGVtYW5kZWQgPSBtYXhfdCh1bnNpZ25lZCBpbnQsIHRwLT5zbmRfY3duZCwKQEAgLTM2NDAsOSArMzg4NCw5IEBACiAJfQogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgdGNwX2RhdGFfc25kX2NoZWNrKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHRjcF9zb2NrICp0cCkKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y3BfZGF0YV9zbmRfY2hlY2soc3RydWN0IHNvY2sgKnNrKQogewotCXRjcF9wdXNoX3BlbmRpbmdfZnJhbWVzKHNrLCB0cCk7CisJdGNwX3B1c2hfcGVuZGluZ19mcmFtZXMoc2spOwogCXRjcF9jaGVja19zcGFjZShzayk7CiB9CiAKQEAgLTM3OTAsNyArNDAzNCw3IEBACiAJaW50IGVycjsKIAogCWxvY2FsX2JoX2VuYWJsZSgpOwotCWlmIChza2ItPmlwX3N1bW1lZD09Q0hFQ0tTVU1fVU5ORUNFU1NBUlkpCisJaWYgKHNrYl9jc3VtX3VubmVjZXNzYXJ5KHNrYikpCiAJCWVyciA9IHNrYl9jb3B5X2RhdGFncmFtX2lvdmVjKHNrYiwgaGxlbiwgdHAtPnVjb3B5LmlvdiwgY2h1bmspOwogCWVsc2UKIAkJZXJyID0gc2tiX2NvcHlfYW5kX2NzdW1fZGF0YWdyYW1faW92ZWMoc2tiLCBobGVuLApAQCAtMzgyMiw3ICs0MDY2LDcgQEAKIAogc3RhdGljIGlubGluZSBpbnQgdGNwX2NoZWNrc3VtX2NvbXBsZXRlX3VzZXIoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXJldHVybiBza2ItPmlwX3N1bW1lZCAhPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWSAmJgorCXJldHVybiAhc2tiX2NzdW1fdW5uZWNlc3Nhcnkoc2tiKSAmJgogCQlfX3RjcF9jaGVja3N1bV9jb21wbGV0ZV91c2VyKHNrLCBza2IpOwogfQogCkBAIC0zODQwLDcgKzQwODQsNyBAQAogCWlmICghdHAtPnVjb3B5LmRtYV9jaGFuICYmIHRwLT51Y29weS5waW5uZWRfbGlzdCkKIAkJdHAtPnVjb3B5LmRtYV9jaGFuID0gZ2V0X3NvZnRuZXRfZG1hKCk7CiAKLQlpZiAodHAtPnVjb3B5LmRtYV9jaGFuICYmIHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1VOTkVDRVNTQVJZKSB7CisJaWYgKHRwLT51Y29weS5kbWFfY2hhbiAmJiBza2JfY3N1bV91bm5lY2Vzc2FyeShza2IpKSB7CiAKIAkJZG1hX2Nvb2tpZSA9IGRtYV9za2JfY29weV9kYXRhZ3JhbV9pb3ZlYyh0cC0+dWNvcHkuZG1hX2NoYW4sCiAJCQlza2IsIGhsZW4sIHRwLT51Y29weS5pb3YsIGNodW5rLCB0cC0+dWNvcHkucGlubmVkX2xpc3QpOwpAQCAtMzg1Niw3ICs0MTAwLDcgQEAKIAkJdGNwX3Jjdl9zcGFjZV9hZGp1c3Qoc2spOwogCiAJCWlmICgodHAtPnVjb3B5LmxlbiA9PSAwKSB8fAotCQkgICAgKHRjcF9mbGFnX3dvcmQoc2tiLT5oLnRoKSAmIFRDUF9GTEFHX1BTSCkgfHwKKwkJICAgICh0Y3BfZmxhZ193b3JkKHRjcF9oZHIoc2tiKSkgJiBUQ1BfRkxBR19QU0gpIHx8CiAJCSAgICAoYXRvbWljX3JlYWQoJnNrLT5za19ybWVtX2FsbG9jKSA+IChzay0+c2tfcmN2YnVmID4+IDEpKSkgewogCQkJdHAtPnVjb3B5Lndha2V1cCA9IDE7CiAJCQlzay0+c2tfZGF0YV9yZWFkeShzaywgMCk7CkBAIC0zOTc2LDcgKzQyMjAsNyBAQAogCQkJCSAqLwogCQkJCXRjcF9hY2soc2ssIHNrYiwgMCk7CiAJCQkJX19rZnJlZV9za2Ioc2tiKTsKLQkJCQl0Y3BfZGF0YV9zbmRfY2hlY2soc2ssIHRwKTsKKwkJCQl0Y3BfZGF0YV9zbmRfY2hlY2soc2spOwogCQkJCXJldHVybiAwOwogCQkJfSBlbHNlIHsgLyogSGVhZGVyIHRvbyBzbWFsbCAqLwogCQkJCVRDUF9JTkNfU1RBVFNfQkgoVENQX01JQl9JTkVSUlMpOwpAQCAtNDA0NywxMiArNDI5MSwxMiBAQAogCQkJCXRwLT5yY3Zfbnh0ID0gVENQX1NLQl9DQihza2IpLT5lbmRfc2VxOwogCQkJfQogCi0JCQl0Y3BfZXZlbnRfZGF0YV9yZWN2KHNrLCB0cCwgc2tiKTsKKwkJCXRjcF9ldmVudF9kYXRhX3JlY3Yoc2ssIHNrYik7CiAKIAkJCWlmIChUQ1BfU0tCX0NCKHNrYiktPmFja19zZXEgIT0gdHAtPnNuZF91bmEpIHsKIAkJCQkvKiBXZWxsLCBvbmx5IG9uZSBzbWFsbCBqdW1wbGV0IGluIGZhc3QgcGF0aC4uLiAqLwogCQkJCXRjcF9hY2soc2ssIHNrYiwgRkxBR19EQVRBKTsKLQkJCQl0Y3BfZGF0YV9zbmRfY2hlY2soc2ssIHRwKTsKKwkJCQl0Y3BfZGF0YV9zbmRfY2hlY2soc2spOwogCQkJCWlmICghaW5ldF9jc2tfYWNrX3NjaGVkdWxlZChzaykpCiAJCQkJCWdvdG8gbm9fYWNrOwogCQkJfQpAQCAtNDEwOSw3ICs0MzUzLDcgQEAKIAkJZ290byBkaXNjYXJkOwogCX0KIAotCWlmKHRoLT5yc3QpIHsKKwlpZiAodGgtPnJzdCkgewogCQl0Y3BfcmVzZXQoc2spOwogCQlnb3RvIGRpc2NhcmQ7CiAJfQpAQCAtNDEyNCw3ICs0MzY4LDcgQEAKIAl9CiAKIHN0ZXA1OgotCWlmKHRoLT5hY2spCisJaWYgKHRoLT5hY2spCiAJCXRjcF9hY2soc2ssIHNrYiwgRkxBR19TTE9XUEFUSCk7CiAKIAl0Y3BfcmN2X3J0dF9tZWFzdXJlX3RzKHNrLCBza2IpOwpAQCAtNDEzNSw3ICs0Mzc5LDcgQEAKIAkvKiBzdGVwIDc6IHByb2Nlc3MgdGhlIHNlZ21lbnQgdGV4dCAqLwogCXRjcF9kYXRhX3F1ZXVlKHNrLCBza2IpOwogCi0JdGNwX2RhdGFfc25kX2NoZWNrKHNrLCB0cCk7CisJdGNwX2RhdGFfc25kX2NoZWNrKHNrKTsKIAl0Y3BfYWNrX3NuZF9jaGVjayhzayk7CiAJcmV0dXJuIDA7CiAKQEAgLTQ0MTIsMTMgKzQ2NTYsMTMgQEAKIAkJZ290byBkaXNjYXJkOwogCiAJY2FzZSBUQ1BfTElTVEVOOgotCQlpZih0aC0+YWNrKQorCQlpZiAodGgtPmFjaykKIAkJCXJldHVybiAxOwogCi0JCWlmKHRoLT5yc3QpCisJCWlmICh0aC0+cnN0KQogCQkJZ290byBkaXNjYXJkOwogCi0JCWlmKHRoLT5zeW4pIHsKKwkJaWYgKHRoLT5zeW4pIHsKIAkJCWlmIChpY3NrLT5pY3NrX2FmX29wcy0+Y29ubl9yZXF1ZXN0KHNrLCBza2IpIDwgMCkKIAkJCQlyZXR1cm4gMTsKIApAQCAtNDQ1Miw3ICs0Njk2LDcgQEAKIAkJLyogRG8gc3RlcDYgb253YXJkIGJ5IGhhbmQuICovCiAJCXRjcF91cmcoc2ssIHNrYiwgdGgpOwogCQlfX2tmcmVlX3NrYihza2IpOwotCQl0Y3BfZGF0YV9zbmRfY2hlY2soc2ssIHRwKTsKKwkJdGNwX2RhdGFfc25kX2NoZWNrKHNrKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC00NDc0LDcgKzQ3MTgsNyBAQAogCX0KIAogCS8qIHN0ZXAgMjogY2hlY2sgUlNUIGJpdCAqLwotCWlmKHRoLT5yc3QpIHsKKwlpZiAodGgtPnJzdCkgewogCQl0Y3BfcmVzZXQoc2spOwogCQlnb3RvIGRpc2NhcmQ7CiAJfQpAQCAtNDQ5Nyw3ICs0NzQxLDcgQEAKIAlpZiAodGgtPmFjaykgewogCQlpbnQgYWNjZXB0YWJsZSA9IHRjcF9hY2soc2ssIHNrYiwgRkxBR19TTE9XUEFUSCk7CiAKLQkJc3dpdGNoKHNrLT5za19zdGF0ZSkgeworCQlzd2l0Y2ggKHNrLT5za19zdGF0ZSkgewogCQljYXNlIFRDUF9TWU5fUkVDVjoKIAkJCWlmIChhY2NlcHRhYmxlKSB7CiAJCQkJdHAtPmNvcGllZF9zZXEgPSB0cC0+cmN2X254dDsKQEAgLTQ2NDQsNyArNDg4OCw3IEBACiAKIAkvKiB0Y3BfZGF0YSBjb3VsZCBtb3ZlIHNvY2tldCB0byBUSU1FLVdBSVQgKi8KIAlpZiAoc2stPnNrX3N0YXRlICE9IFRDUF9DTE9TRSkgewotCQl0Y3BfZGF0YV9zbmRfY2hlY2soc2ssIHRwKTsKKwkJdGNwX2RhdGFfc25kX2NoZWNrKHNrKTsKIAkJdGNwX2Fja19zbmRfY2hlY2soc2spOwogCX0KIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwX2lwdjQuYyBiL25ldC9pcHY0L3RjcF9pcHY0LmMKaW5kZXggMGJhNzRiYi4uNWEzZTdmOCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwX2lwdjQuYworKysgYi9uZXQvaXB2NC90Y3BfaXB2NC5jCkBAIC04OCw3ICs4OCw3IEBACiAjZGVmaW5lIElDTVBfTUlOX0xFTkdUSCA4CiAKIC8qIFNvY2tldCB1c2VkIGZvciBzZW5kaW5nIFJTVHMgKi8KLXN0YXRpYyBzdHJ1Y3Qgc29ja2V0ICp0Y3Bfc29ja2V0Oworc3RhdGljIHN0cnVjdCBzb2NrZXQgKnRjcF9zb2NrZXQgX19yZWFkX21vc3RseTsKIAogdm9pZCB0Y3BfdjRfc2VuZF9jaGVjayhzdHJ1Y3Qgc29jayAqc2ssIGludCBsZW4sIHN0cnVjdCBza19idWZmICpza2IpOwogCkBAIC0xMjUsMTAgKzEyNSwxMCBAQAogCiBzdGF0aWMgaW5saW5lIF9fdTMyIHRjcF92NF9pbml0X3NlcXVlbmNlKHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JcmV0dXJuIHNlY3VyZV90Y3Bfc2VxdWVuY2VfbnVtYmVyKHNrYi0+bmguaXBoLT5kYWRkciwKLQkJCQkJICBza2ItPm5oLmlwaC0+c2FkZHIsCi0JCQkJCSAgc2tiLT5oLnRoLT5kZXN0LAotCQkJCQkgIHNrYi0+aC50aC0+c291cmNlKTsKKwlyZXR1cm4gc2VjdXJlX3RjcF9zZXF1ZW5jZV9udW1iZXIoaXBfaGRyKHNrYiktPmRhZGRyLAorCQkJCQkgIGlwX2hkcihza2IpLT5zYWRkciwKKwkJCQkJICB0Y3BfaGRyKHNrYiktPmRlc3QsCisJCQkJCSAgdGNwX2hkcihza2IpLT5zb3VyY2UpOwogfQogCiBpbnQgdGNwX3R3c2tfdW5pcXVlKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNvY2sgKnNrdHcsIHZvaWQgKnR3cCkKQEAgLTE0OSw3ICsxNDksNyBAQAogCSAqLwogCWlmICh0Y3B0dy0+dHdfdHNfcmVjZW50X3N0YW1wICYmCiAJICAgICh0d3AgPT0gTlVMTCB8fCAoc3lzY3RsX3RjcF90d19yZXVzZSAmJgotCQkJICAgICB4dGltZS50dl9zZWMgLSB0Y3B0dy0+dHdfdHNfcmVjZW50X3N0YW1wID4gMSkpKSB7CisJCQkgICAgIGdldF9zZWNvbmRzKCkgLSB0Y3B0dy0+dHdfdHNfcmVjZW50X3N0YW1wID4gMSkpKSB7CiAJCXRwLT53cml0ZV9zZXEgPSB0Y3B0dy0+dHdfc25kX254dCArIDY1NTM1ICsgMjsKIAkJaWYgKHRwLT53cml0ZV9zZXEgPT0gMCkKIAkJCXRwLT53cml0ZV9zZXEgPSAxOwpAQCAtMjI0LDcgKzIyNCw3IEBACiAJCSAqIHdoZW4gdHJ5aW5nIG5ldyBjb25uZWN0aW9uLgogCQkgKi8KIAkJaWYgKHBlZXIgIT0gTlVMTCAmJgotCQkgICAgcGVlci0+dGNwX3RzX3N0YW1wICsgVENQX1BBV1NfTVNMID49IHh0aW1lLnR2X3NlYykgeworCQkgICAgcGVlci0+dGNwX3RzX3N0YW1wICsgVENQX1BBV1NfTVNMID49IGdldF9zZWNvbmRzKCkpIHsKIAkJCXRwLT5yeF9vcHQudHNfcmVjZW50X3N0YW1wID0gcGVlci0+dGNwX3RzX3N0YW1wOwogCQkJdHAtPnJ4X29wdC50c19yZWNlbnQgPSBwZWVyLT50Y3BfdHM7CiAJCX0KQEAgLTM1NCw4ICszNTQsOCBAQAogCXN0cnVjdCB0Y3BoZHIgKnRoID0gKHN0cnVjdCB0Y3BoZHIgKikoc2tiLT5kYXRhICsgKGlwaC0+aWhsIDw8IDIpKTsKIAlzdHJ1Y3QgdGNwX3NvY2sgKnRwOwogCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQ7Ci0JaW50IHR5cGUgPSBza2ItPmguaWNtcGgtPnR5cGU7Ci0JaW50IGNvZGUgPSBza2ItPmguaWNtcGgtPmNvZGU7CisJY29uc3QgaW50IHR5cGUgPSBpY21wX2hkcihza2IpLT50eXBlOworCWNvbnN0IGludCBjb2RlID0gaWNtcF9oZHIoc2tiKS0+Y29kZTsKIAlzdHJ1Y3Qgc29jayAqc2s7CiAJX191MzIgc2VxOwogCWludCBlcnI7CkBAIC00OTksMTEgKzQ5OSwxMiBAQAogdm9pZCB0Y3BfdjRfc2VuZF9jaGVjayhzdHJ1Y3Qgc29jayAqc2ssIGludCBsZW4sIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IGluZXRfc29jayAqaW5ldCA9IGluZXRfc2soc2spOwotCXN0cnVjdCB0Y3BoZHIgKnRoID0gc2tiLT5oLnRoOworCXN0cnVjdCB0Y3BoZHIgKnRoID0gdGNwX2hkcihza2IpOwogCiAJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1BBUlRJQUwpIHsKIAkJdGgtPmNoZWNrID0gfnRjcF92NF9jaGVjayhsZW4sIGluZXQtPnNhZGRyLAogCQkJCQkgIGluZXQtPmRhZGRyLCAwKTsKKwkJc2tiLT5jc3VtX3N0YXJ0ID0gc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKSAtIHNrYi0+aGVhZDsKIAkJc2tiLT5jc3VtX29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCB0Y3BoZHIsIGNoZWNrKTsKIAl9IGVsc2UgewogCQl0aC0+Y2hlY2sgPSB0Y3BfdjRfY2hlY2sobGVuLCBpbmV0LT5zYWRkciwgaW5ldC0+ZGFkZHIsCkBAIC01MTUsMTcgKzUxNiwxOCBAQAogCiBpbnQgdGNwX3Y0X2dzb19zZW5kX2NoZWNrKHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0Jc3RydWN0IGlwaGRyICppcGg7CisJY29uc3Qgc3RydWN0IGlwaGRyICppcGg7CiAJc3RydWN0IHRjcGhkciAqdGg7CiAKIAlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCBzaXplb2YoKnRoKSkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaXBoID0gc2tiLT5uaC5pcGg7Ci0JdGggPSBza2ItPmgudGg7CisJaXBoID0gaXBfaGRyKHNrYik7CisJdGggPSB0Y3BfaGRyKHNrYik7CiAKIAl0aC0+Y2hlY2sgPSAwOwogCXRoLT5jaGVjayA9IH50Y3BfdjRfY2hlY2soc2tiLT5sZW4sIGlwaC0+c2FkZHIsIGlwaC0+ZGFkZHIsIDApOworCXNrYi0+Y3N1bV9zdGFydCA9IHNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYikgLSBza2ItPmhlYWQ7CiAJc2tiLT5jc3VtX29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCB0Y3BoZHIsIGNoZWNrKTsKIAlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1BBUlRJQUw7CiAJcmV0dXJuIDA7CkBAIC01NDYsNyArNTQ4LDcgQEAKIAogc3RhdGljIHZvaWQgdGNwX3Y0X3NlbmRfcmVzZXQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXN0cnVjdCB0Y3BoZHIgKnRoID0gc2tiLT5oLnRoOworCXN0cnVjdCB0Y3BoZHIgKnRoID0gdGNwX2hkcihza2IpOwogCXN0cnVjdCB7CiAJCXN0cnVjdCB0Y3BoZHIgdGg7CiAjaWZkZWYgQ09ORklHX1RDUF9NRDVTSUcKQEAgLTU4NSw3ICs1ODcsNyBAQAogCWFyZy5pb3ZbMF0uaW92X2xlbiAgPSBzaXplb2YocmVwLnRoKTsKIAogI2lmZGVmIENPTkZJR19UQ1BfTUQ1U0lHCi0Ja2V5ID0gc2sgPyB0Y3BfdjRfbWQ1X2RvX2xvb2t1cChzaywgc2tiLT5uaC5pcGgtPmRhZGRyKSA6IE5VTEw7CisJa2V5ID0gc2sgPyB0Y3BfdjRfbWQ1X2RvX2xvb2t1cChzaywgaXBfaGRyKHNrYiktPmRhZGRyKSA6IE5VTEw7CiAJaWYgKGtleSkgewogCQlyZXAub3B0WzBdID0gaHRvbmwoKFRDUE9QVF9OT1AgPDwgMjQpIHwKIAkJCQkgICAoVENQT1BUX05PUCA8PCAxNikgfApAQCAtNTk3LDE0ICs1OTksMTQgQEAKIAogCQl0Y3BfdjRfZG9fY2FsY19tZDVfaGFzaCgoX191OCAqKSZyZXAub3B0WzFdLAogCQkJCQlrZXksCi0JCQkJCXNrYi0+bmguaXBoLT5kYWRkciwKLQkJCQkJc2tiLT5uaC5pcGgtPnNhZGRyLAorCQkJCQlpcF9oZHIoc2tiKS0+ZGFkZHIsCisJCQkJCWlwX2hkcihza2IpLT5zYWRkciwKIAkJCQkJJnJlcC50aCwgSVBQUk9UT19UQ1AsCiAJCQkJCWFyZy5pb3ZbMF0uaW92X2xlbik7CiAJfQogI2VuZGlmCi0JYXJnLmNzdW0gPSBjc3VtX3RjcHVkcF9ub2ZvbGQoc2tiLT5uaC5pcGgtPmRhZGRyLAotCQkJCSAgICAgIHNrYi0+bmguaXBoLT5zYWRkciwgLyogWFhYICovCisJYXJnLmNzdW0gPSBjc3VtX3RjcHVkcF9ub2ZvbGQoaXBfaGRyKHNrYiktPmRhZGRyLAorCQkJCSAgICAgIGlwX2hkcihza2IpLT5zYWRkciwgLyogWFhYICovCiAJCQkJICAgICAgc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpLCBJUFBST1RPX1RDUCwgMCk7CiAJYXJnLmNzdW1vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3QgdGNwaGRyLCBjaGVjaykgLyAyOwogCkBAIC02MjIsNyArNjI0LDcgQEAKIAkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgc2VxLCB1MzIgYWNrLAogCQkJICAgIHUzMiB3aW4sIHUzMiB0cykKIHsKLQlzdHJ1Y3QgdGNwaGRyICp0aCA9IHNrYi0+aC50aDsKKwlzdHJ1Y3QgdGNwaGRyICp0aCA9IHRjcF9oZHIoc2tiKTsKIAlzdHJ1Y3QgewogCQlzdHJ1Y3QgdGNwaGRyIHRoOwogCQlfX2JlMzIgb3B0WyhUQ1BPTEVOX1RTVEFNUF9BTElHTkVEID4+IDIpCkBAIC02NzAsNyArNjcyLDcgQEAKIAkgKiBza2ItPnNrKSBob2xkcyB0cnVlLCBidXQgd2UgcHJvZ3JhbSBkZWZlbnNpdmVseS4KIAkgKi8KIAlpZiAoIXR3c2sgJiYgc2tiLT5zaykgewotCQlrZXkgPSB0Y3BfdjRfbWQ1X2RvX2xvb2t1cChza2ItPnNrLCBza2ItPm5oLmlwaC0+ZGFkZHIpOworCQlrZXkgPSB0Y3BfdjRfbWQ1X2RvX2xvb2t1cChza2ItPnNrLCBpcF9oZHIoc2tiKS0+ZGFkZHIpOwogCX0gZWxzZSBpZiAodHdzayAmJiB0d3NrLT50d19tZDVfa2V5bGVuKSB7CiAJCXR3X2tleS5rZXkgPSB0d3NrLT50d19tZDVfa2V5OwogCQl0d19rZXkua2V5bGVuID0gdHdzay0+dHdfbWQ1X2tleWxlbjsKQEAgLTY5MCwxNCArNjkyLDE0IEBACiAKIAkJdGNwX3Y0X2RvX2NhbGNfbWQ1X2hhc2goKF9fdTggKikmcmVwLm9wdFtvZmZzZXRdLAogCQkJCQlrZXksCi0JCQkJCXNrYi0+bmguaXBoLT5kYWRkciwKLQkJCQkJc2tiLT5uaC5pcGgtPnNhZGRyLAorCQkJCQlpcF9oZHIoc2tiKS0+ZGFkZHIsCisJCQkJCWlwX2hkcihza2IpLT5zYWRkciwKIAkJCQkJJnJlcC50aCwgSVBQUk9UT19UQ1AsCiAJCQkJCWFyZy5pb3ZbMF0uaW92X2xlbik7CiAJfQogI2VuZGlmCi0JYXJnLmNzdW0gPSBjc3VtX3RjcHVkcF9ub2ZvbGQoc2tiLT5uaC5pcGgtPmRhZGRyLAotCQkJCSAgICAgIHNrYi0+bmguaXBoLT5zYWRkciwgLyogWFhYICovCisJYXJnLmNzdW0gPSBjc3VtX3RjcHVkcF9ub2ZvbGQoaXBfaGRyKHNrYiktPmRhZGRyLAorCQkJCSAgICAgIGlwX2hkcihza2IpLT5zYWRkciwgLyogWFhYICovCiAJCQkJICAgICAgYXJnLmlvdlswXS5pb3ZfbGVuLCBJUFBST1RPX1RDUCwgMCk7CiAJYXJnLmNzdW1vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3QgdGNwaGRyLCBjaGVjaykgLyAyOwogCkBAIC03NDUsNyArNzQ3LDcgQEAKIAlza2IgPSB0Y3BfbWFrZV9zeW5hY2soc2ssIGRzdCwgcmVxKTsKIAogCWlmIChza2IpIHsKLQkJc3RydWN0IHRjcGhkciAqdGggPSBza2ItPmgudGg7CisJCXN0cnVjdCB0Y3BoZHIgKnRoID0gdGNwX2hkcihza2IpOwogCiAJCXRoLT5jaGVjayA9IHRjcF92NF9jaGVjayhza2ItPmxlbiwKIAkJCQkJIGlyZXEtPmxvY19hZGRyLApAQCAtNzgxLDcgKzc4Myw3IEBACiAJCXdhcm50aW1lID0gamlmZmllczsKIAkJcHJpbnRrKEtFUk5fSU5GTwogCQkgICAgICAgInBvc3NpYmxlIFNZTiBmbG9vZGluZyBvbiBwb3J0ICVkLiBTZW5kaW5nIGNvb2tpZXMuXG4iLAotCQkgICAgICAgbnRvaHMoc2tiLT5oLnRoLT5kZXN0KSk7CisJCSAgICAgICBudG9ocyh0Y3BfaGRyKHNrYiktPmRlc3QpKTsKIAl9CiB9CiAjZW5kaWYKQEAgLTExMzMsOCArMTEzNSw4IEBACiAJICovCiAJX191OCAqaGFzaF9sb2NhdGlvbiA9IE5VTEw7CiAJc3RydWN0IHRjcF9tZDVzaWdfa2V5ICpoYXNoX2V4cGVjdGVkOwotCXN0cnVjdCBpcGhkciAqaXBoID0gc2tiLT5uaC5pcGg7Ci0Jc3RydWN0IHRjcGhkciAqdGggPSBza2ItPmgudGg7CisJY29uc3Qgc3RydWN0IGlwaGRyICppcGggPSBpcF9oZHIoc2tiKTsKKwlzdHJ1Y3QgdGNwaGRyICp0aCA9IHRjcF9oZHIoc2tiKTsKIAlpbnQgbGVuZ3RoID0gKHRoLT5kb2ZmIDw8IDIpIC0gc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpOwogCWludCBnZW5oYXNoOwogCXVuc2lnbmVkIGNoYXIgKnB0cjsKQEAgLTEyNTEsOCArMTI1Myw4IEBACiAJc3RydWN0IGluZXRfcmVxdWVzdF9zb2NrICppcmVxOwogCXN0cnVjdCB0Y3Bfb3B0aW9uc19yZWNlaXZlZCB0bXBfb3B0OwogCXN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcTsKLQlfX2JlMzIgc2FkZHIgPSBza2ItPm5oLmlwaC0+c2FkZHI7Ci0JX19iZTMyIGRhZGRyID0gc2tiLT5uaC5pcGgtPmRhZGRyOworCV9fYmUzMiBzYWRkciA9IGlwX2hkcihza2IpLT5zYWRkcjsKKwlfX2JlMzIgZGFkZHIgPSBpcF9oZHIoc2tiKS0+ZGFkZHI7CiAJX191MzIgaXNuID0gVENQX1NLQl9DQihza2IpLT53aGVuOwogCXN0cnVjdCBkc3RfZW50cnkgKmRzdCA9IE5VTEw7CiAjaWZkZWYgQ09ORklHX1NZTl9DT09LSUVTCkBAIC0xMzI3LDcgKzEzMjksNyBAQAogCWlyZXEtPnJtdF9hZGRyID0gc2FkZHI7CiAJaXJlcS0+b3B0ID0gdGNwX3Y0X3NhdmVfb3B0aW9ucyhzaywgc2tiKTsKIAlpZiAoIXdhbnRfY29va2llKQotCQlUQ1BfRUNOX2NyZWF0ZV9yZXF1ZXN0KHJlcSwgc2tiLT5oLnRoKTsKKwkJVENQX0VDTl9jcmVhdGVfcmVxdWVzdChyZXEsIHRjcF9oZHIoc2tiKSk7CiAKIAlpZiAod2FudF9jb29raWUpIHsKICNpZmRlZiBDT05GSUdfU1lOX0NPT0tJRVMKQEAgLTEzNTEsNyArMTM1Myw3IEBACiAJCSAgICAoZHN0ID0gaW5ldF9jc2tfcm91dGVfcmVxKHNrLCByZXEpKSAhPSBOVUxMICYmCiAJCSAgICAocGVlciA9IHJ0X2dldF9wZWVyKChzdHJ1Y3QgcnRhYmxlICopZHN0KSkgIT0gTlVMTCAmJgogCQkgICAgcGVlci0+djRkYWRkciA9PSBzYWRkcikgewotCQkJaWYgKHh0aW1lLnR2X3NlYyA8IHBlZXItPnRjcF90c19zdGFtcCArIFRDUF9QQVdTX01TTCAmJgorCQkJaWYgKGdldF9zZWNvbmRzKCkgPCBwZWVyLT50Y3BfdHNfc3RhbXAgKyBUQ1BfUEFXU19NU0wgJiYKIAkJCSAgICAoczMyKShwZWVyLT50Y3BfdHMgLSByZXEtPnRzX3JlY2VudCkgPgogCQkJCQkJCVRDUF9QQVdTX1dJTkRPVykgewogCQkJCU5FVF9JTkNfU1RBVFNfQkgoTElOVVhfTUlCX1BBV1NQQVNTSVZFUkVKRUNURUQpOwpAQCAtMTM3NSw3ICsxMzc3LDcgQEAKIAkJCUxJTUlUX05FVERFQlVHKEtFUk5fREVCVUcgIlRDUDogZHJvcCBvcGVuICIKIAkJCQkgICAgICAgInJlcXVlc3QgZnJvbSAldS4ldS4ldS4ldS8ldVxuIiwKIAkJCQkgICAgICAgTklQUVVBRChzYWRkciksCi0JCQkJICAgICAgIG50b2hzKHNrYi0+aC50aC0+c291cmNlKSk7CisJCQkJICAgICAgIG50b2hzKHRjcF9oZHIoc2tiKS0+c291cmNlKSk7CiAJCQlkc3RfcmVsZWFzZShkc3QpOwogCQkJZ290byBkcm9wX2FuZF9mcmVlOwogCQl9CkBAIC0xNDM5LDcgKzE0NDEsNyBAQAogCW5ld2luZXQtPm9wdAkgICAgICA9IGlyZXEtPm9wdDsKIAlpcmVxLT5vcHQJICAgICAgPSBOVUxMOwogCW5ld2luZXQtPm1jX2luZGV4ICAgICA9IGluZXRfaWlmKHNrYik7Ci0JbmV3aW5ldC0+bWNfdHRsCSAgICAgID0gc2tiLT5uaC5pcGgtPnR0bDsKKwluZXdpbmV0LT5tY190dGwJICAgICAgPSBpcF9oZHIoc2tiKS0+dHRsOwogCWluZXRfY3NrKG5ld3NrKS0+aWNza19leHRfaGRyX2xlbiA9IDA7CiAJaWYgKG5ld2luZXQtPm9wdCkKIAkJaW5ldF9jc2sobmV3c2spLT5pY3NrX2V4dF9oZHJfbGVuID0gbmV3aW5ldC0+b3B0LT5vcHRsZW47CkBAIC0xNDgxLDggKzE0ODMsOCBAQAogCiBzdGF0aWMgc3RydWN0IHNvY2sgKnRjcF92NF9obmRfcmVxKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlzdHJ1Y3QgdGNwaGRyICp0aCA9IHNrYi0+aC50aDsKLQlzdHJ1Y3QgaXBoZHIgKmlwaCA9IHNrYi0+bmguaXBoOworCXN0cnVjdCB0Y3BoZHIgKnRoID0gdGNwX2hkcihza2IpOworCWNvbnN0IHN0cnVjdCBpcGhkciAqaXBoID0gaXBfaGRyKHNrYik7CiAJc3RydWN0IHNvY2sgKm5zazsKIAlzdHJ1Y3QgcmVxdWVzdF9zb2NrICoqcHJldjsKIAkvKiBGaW5kIHBvc3NpYmxlIGNvbm5lY3Rpb24gcmVxdWVzdHMuICovCkBAIC0xNDkxLDkgKzE0OTMsOCBAQAogCWlmIChyZXEpCiAJCXJldHVybiB0Y3BfY2hlY2tfcmVxKHNrLCBza2IsIHJlcSwgcHJldik7CiAKLQluc2sgPSBpbmV0X2xvb2t1cF9lc3RhYmxpc2hlZCgmdGNwX2hhc2hpbmZvLCBza2ItPm5oLmlwaC0+c2FkZHIsCi0JCQkJICAgICAgdGgtPnNvdXJjZSwgc2tiLT5uaC5pcGgtPmRhZGRyLAotCQkJCSAgICAgIHRoLT5kZXN0LCBpbmV0X2lpZihza2IpKTsKKwluc2sgPSBpbmV0X2xvb2t1cF9lc3RhYmxpc2hlZCgmdGNwX2hhc2hpbmZvLCBpcGgtPnNhZGRyLCB0aC0+c291cmNlLAorCQkJCSAgICAgIGlwaC0+ZGFkZHIsIHRoLT5kZXN0LCBpbmV0X2lpZihza2IpKTsKIAogCWlmIChuc2spIHsKIAkJaWYgKG5zay0+c2tfc3RhdGUgIT0gVENQX1RJTUVfV0FJVCkgewpAQCAtMTUxMywxNSArMTUxNCwxNyBAQAogCiBzdGF0aWMgX19zdW0xNiB0Y3BfdjRfY2hlY2tzdW1faW5pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogeworCWNvbnN0IHN0cnVjdCBpcGhkciAqaXBoID0gaXBfaGRyKHNrYik7CisKIAlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fQ09NUExFVEUpIHsKLQkJaWYgKCF0Y3BfdjRfY2hlY2soc2tiLT5sZW4sIHNrYi0+bmguaXBoLT5zYWRkciwKLQkJCQkgIHNrYi0+bmguaXBoLT5kYWRkciwgc2tiLT5jc3VtKSkgeworCQlpZiAoIXRjcF92NF9jaGVjayhza2ItPmxlbiwgaXBoLT5zYWRkciwKKwkJCQkgIGlwaC0+ZGFkZHIsIHNrYi0+Y3N1bSkpIHsKIAkJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CiAJCQlyZXR1cm4gMDsKIAkJfQogCX0KIAotCXNrYi0+Y3N1bSA9IGNzdW1fdGNwdWRwX25vZm9sZChza2ItPm5oLmlwaC0+c2FkZHIsIHNrYi0+bmguaXBoLT5kYWRkciwKKwlza2ItPmNzdW0gPSBjc3VtX3RjcHVkcF9ub2ZvbGQoaXBoLT5zYWRkciwgaXBoLT5kYWRkciwKIAkJCQkgICAgICAgc2tiLT5sZW4sIElQUFJPVE9fVENQLCAwKTsKIAogCWlmIChza2ItPmxlbiA8PSA3NikgewpAQCAtMTU1NSw3ICsxNTU4LDcgQEAKIAogCWlmIChzay0+c2tfc3RhdGUgPT0gVENQX0VTVEFCTElTSEVEKSB7IC8qIEZhc3QgcGF0aCAqLwogCQlUQ1BfQ0hFQ0tfVElNRVIoc2spOwotCQlpZiAodGNwX3Jjdl9lc3RhYmxpc2hlZChzaywgc2tiLCBza2ItPmgudGgsIHNrYi0+bGVuKSkgeworCQlpZiAodGNwX3Jjdl9lc3RhYmxpc2hlZChzaywgc2tiLCB0Y3BfaGRyKHNrYiksIHNrYi0+bGVuKSkgewogCQkJcnNrID0gc2s7CiAJCQlnb3RvIHJlc2V0OwogCQl9CkBAIC0xNTYzLDcgKzE1NjYsNyBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQlpZiAoc2tiLT5sZW4gPCAoc2tiLT5oLnRoLT5kb2ZmIDw8IDIpIHx8IHRjcF9jaGVja3N1bV9jb21wbGV0ZShza2IpKQorCWlmIChza2ItPmxlbiA8IHRjcF9oZHJsZW4oc2tiKSB8fCB0Y3BfY2hlY2tzdW1fY29tcGxldGUoc2tiKSkKIAkJZ290byBjc3VtX2VycjsKIAogCWlmIChzay0+c2tfc3RhdGUgPT0gVENQX0xJU1RFTikgewpAQCAtMTU4MSw3ICsxNTg0LDcgQEAKIAl9CiAKIAlUQ1BfQ0hFQ0tfVElNRVIoc2spOwotCWlmICh0Y3BfcmN2X3N0YXRlX3Byb2Nlc3Moc2ssIHNrYiwgc2tiLT5oLnRoLCBza2ItPmxlbikpIHsKKwlpZiAodGNwX3Jjdl9zdGF0ZV9wcm9jZXNzKHNrLCBza2IsIHRjcF9oZHIoc2tiKSwgc2tiLT5sZW4pKSB7CiAJCXJzayA9IHNrOwogCQlnb3RvIHJlc2V0OwogCX0KQEAgLTE2MTAsNiArMTYxMyw3IEBACiAKIGludCB0Y3BfdjRfcmN2KHN0cnVjdCBza19idWZmICpza2IpCiB7CisJY29uc3Qgc3RydWN0IGlwaGRyICppcGg7CiAJc3RydWN0IHRjcGhkciAqdGg7CiAJc3RydWN0IHNvY2sgKnNrOwogCWludCByZXQ7CkBAIC0xNjIzLDcgKzE2MjcsNyBAQAogCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgdGNwaGRyKSkpCiAJCWdvdG8gZGlzY2FyZF9pdDsKIAotCXRoID0gc2tiLT5oLnRoOworCXRoID0gdGNwX2hkcihza2IpOwogCiAJaWYgKHRoLT5kb2ZmIDwgc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpIC8gNCkKIAkJZ290byBiYWRfcGFja2V0OwpAQCAtMTYzNCwyMyArMTYzOCwyMSBAQAogCSAqIFBhY2tldCBsZW5ndGggYW5kIGRvZmYgYXJlIHZhbGlkYXRlZCBieSBoZWFkZXIgcHJlZGljdGlvbiwKIAkgKiBwcm92aWRlZCBjYXNlIG9mIHRoLT5kb2ZmPT0wIGlzIGVsaW1pbmF0ZWQuCiAJICogU28sIHdlIGRlZmVyIHRoZSBjaGVja3MuICovCi0JaWYgKChza2ItPmlwX3N1bW1lZCAhPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWSAmJgotCSAgICAgdGNwX3Y0X2NoZWNrc3VtX2luaXQoc2tiKSkpCisJaWYgKCFza2JfY3N1bV91bm5lY2Vzc2FyeShza2IpICYmIHRjcF92NF9jaGVja3N1bV9pbml0KHNrYikpCiAJCWdvdG8gYmFkX3BhY2tldDsKIAotCXRoID0gc2tiLT5oLnRoOworCXRoID0gdGNwX2hkcihza2IpOworCWlwaCA9IGlwX2hkcihza2IpOwogCVRDUF9TS0JfQ0Ioc2tiKS0+c2VxID0gbnRvaGwodGgtPnNlcSk7CiAJVENQX1NLQl9DQihza2IpLT5lbmRfc2VxID0gKFRDUF9TS0JfQ0Ioc2tiKS0+c2VxICsgdGgtPnN5biArIHRoLT5maW4gKwogCQkJCSAgICBza2ItPmxlbiAtIHRoLT5kb2ZmICogNCk7CiAJVENQX1NLQl9DQihza2IpLT5hY2tfc2VxID0gbnRvaGwodGgtPmFja19zZXEpOwogCVRDUF9TS0JfQ0Ioc2tiKS0+d2hlbgkgPSAwOwotCVRDUF9TS0JfQ0Ioc2tiKS0+ZmxhZ3MJID0gc2tiLT5uaC5pcGgtPnRvczsKKwlUQ1BfU0tCX0NCKHNrYiktPmZsYWdzCSA9IGlwaC0+dG9zOwogCVRDUF9TS0JfQ0Ioc2tiKS0+c2Fja2VkCSA9IDA7CiAKLQlzayA9IF9faW5ldF9sb29rdXAoJnRjcF9oYXNoaW5mbywgc2tiLT5uaC5pcGgtPnNhZGRyLCB0aC0+c291cmNlLAotCQkJICAgc2tiLT5uaC5pcGgtPmRhZGRyLCB0aC0+ZGVzdCwKLQkJCSAgIGluZXRfaWlmKHNrYikpOwotCisJc2sgPSBfX2luZXRfbG9va3VwKCZ0Y3BfaGFzaGluZm8sIGlwaC0+c2FkZHIsIHRoLT5zb3VyY2UsCisJCQkgICBpcGgtPmRhZGRyLCB0aC0+ZGVzdCwgaW5ldF9paWYoc2tiKSk7CiAJaWYgKCFzaykKIAkJZ290byBub190Y3Bfc29ja2V0OwogCkBAIC0xNzI0LDggKzE3MjYsNyBAQAogCXN3aXRjaCAodGNwX3RpbWV3YWl0X3N0YXRlX3Byb2Nlc3MoaW5ldF90d3NrKHNrKSwgc2tiLCB0aCkpIHsKIAljYXNlIFRDUF9UV19TWU46IHsKIAkJc3RydWN0IHNvY2sgKnNrMiA9IGluZXRfbG9va3VwX2xpc3RlbmVyKCZ0Y3BfaGFzaGluZm8sCi0JCQkJCQkJc2tiLT5uaC5pcGgtPmRhZGRyLAotCQkJCQkJCXRoLT5kZXN0LAorCQkJCQkJCWlwaC0+ZGFkZHIsIHRoLT5kZXN0LAogCQkJCQkJCWluZXRfaWlmKHNrYikpOwogCQlpZiAoc2syKSB7CiAJCQlpbmV0X3R3c2tfZGVzY2hlZHVsZShpbmV0X3R3c2soc2spLCAmdGNwX2RlYXRoX3Jvdyk7CkBAIC0xNzcwLDcgKzE3NzEsNyBAQAogCiAJaWYgKHBlZXIpIHsKIAkJaWYgKChzMzIpKHBlZXItPnRjcF90cyAtIHRwLT5yeF9vcHQudHNfcmVjZW50KSA8PSAwIHx8Ci0JCSAgICAocGVlci0+dGNwX3RzX3N0YW1wICsgVENQX1BBV1NfTVNMIDwgeHRpbWUudHZfc2VjICYmCisJCSAgICAocGVlci0+dGNwX3RzX3N0YW1wICsgVENQX1BBV1NfTVNMIDwgZ2V0X3NlY29uZHMoKSAmJgogCQkgICAgIHBlZXItPnRjcF90c19zdGFtcCA8PSB0cC0+cnhfb3B0LnRzX3JlY2VudF9zdGFtcCkpIHsKIAkJCXBlZXItPnRjcF90c19zdGFtcCA9IHRwLT5yeF9vcHQudHNfcmVjZW50X3N0YW1wOwogCQkJcGVlci0+dGNwX3RzID0gdHAtPnJ4X29wdC50c19yZWNlbnQ7CkBAIC0xNzkxLDcgKzE3OTIsNyBAQAogCQljb25zdCBzdHJ1Y3QgdGNwX3RpbWV3YWl0X3NvY2sgKnRjcHR3ID0gdGNwX3R3c2soKHN0cnVjdCBzb2NrICopdHcpOwogCiAJCWlmICgoczMyKShwZWVyLT50Y3BfdHMgLSB0Y3B0dy0+dHdfdHNfcmVjZW50KSA8PSAwIHx8Ci0JCSAgICAocGVlci0+dGNwX3RzX3N0YW1wICsgVENQX1BBV1NfTVNMIDwgeHRpbWUudHZfc2VjICYmCisJCSAgICAocGVlci0+dGNwX3RzX3N0YW1wICsgVENQX1BBV1NfTVNMIDwgZ2V0X3NlY29uZHMoKSAmJgogCQkgICAgIHBlZXItPnRjcF90c19zdGFtcCA8PSB0Y3B0dy0+dHdfdHNfcmVjZW50X3N0YW1wKSkgewogCQkJcGVlci0+dGNwX3RzX3N0YW1wID0gdGNwdHctPnR3X3RzX3JlY2VudF9zdGFtcDsKIAkJCXBlZXItPnRjcF90cwkgICA9IHRjcHR3LT50d190c19yZWNlbnQ7CkBAIC0xODkwLDcgKzE4OTEsNyBAQAogCXRjcF9jbGVhbnVwX2Nvbmdlc3Rpb25fY29udHJvbChzayk7CiAKIAkvKiBDbGVhbnVwIHVwIHRoZSB3cml0ZSBidWZmZXIuICovCi0Jc2tfc3RyZWFtX3dyaXRlcXVldWVfcHVyZ2Uoc2spOworCXRjcF93cml0ZV9xdWV1ZV9wdXJnZShzayk7CiAKIAkvKiBDbGVhbnMgdXAgb3VyLCBob3BlZnVsbHkgZW1wdHksIG91dF9vZl9vcmRlcl9xdWV1ZS4gKi8KIAlfX3NrYl9xdWV1ZV9wdXJnZSgmdHAtPm91dF9vZl9vcmRlcl9xdWV1ZSk7CkBAIC0yMjkzLDEzICsyMjk0LDEzIEBACiAJCXJlcSk7CiB9CiAKLXN0YXRpYyB2b2lkIGdldF90Y3A0X3NvY2soc3RydWN0IHNvY2sgKnNwLCBjaGFyICp0bXBidWYsIGludCBpKQorc3RhdGljIHZvaWQgZ2V0X3RjcDRfc29jayhzdHJ1Y3Qgc29jayAqc2ssIGNoYXIgKnRtcGJ1ZiwgaW50IGkpCiB7CiAJaW50IHRpbWVyX2FjdGl2ZTsKIAl1bnNpZ25lZCBsb25nIHRpbWVyX2V4cGlyZXM7Ci0Jc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzcCk7Ci0JY29uc3Qgc3RydWN0IGluZXRfY29ubmVjdGlvbl9zb2NrICppY3NrID0gaW5ldF9jc2soc3ApOwotCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNwKTsKKwlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKwljb25zdCBzdHJ1Y3QgaW5ldF9jb25uZWN0aW9uX3NvY2sgKmljc2sgPSBpbmV0X2Nzayhzayk7CisJc3RydWN0IGluZXRfc29jayAqaW5ldCA9IGluZXRfc2soc2spOwogCV9fYmUzMiBkZXN0ID0gaW5ldC0+ZGFkZHI7CiAJX19iZTMyIHNyYyA9IGluZXQtPnJjdl9zYWRkcjsKIAlfX3UxNiBkZXN0cCA9IG50b2hzKGluZXQtPmRwb3J0KTsKQEAgLTIzMTEsOSArMjMxMiw5IEBACiAJfSBlbHNlIGlmIChpY3NrLT5pY3NrX3BlbmRpbmcgPT0gSUNTS19USU1FX1BST0JFMCkgewogCQl0aW1lcl9hY3RpdmUJPSA0OwogCQl0aW1lcl9leHBpcmVzCT0gaWNzay0+aWNza190aW1lb3V0OwotCX0gZWxzZSBpZiAodGltZXJfcGVuZGluZygmc3AtPnNrX3RpbWVyKSkgeworCX0gZWxzZSBpZiAodGltZXJfcGVuZGluZygmc2stPnNrX3RpbWVyKSkgewogCQl0aW1lcl9hY3RpdmUJPSAyOwotCQl0aW1lcl9leHBpcmVzCT0gc3AtPnNrX3RpbWVyLmV4cGlyZXM7CisJCXRpbWVyX2V4cGlyZXMJPSBzay0+c2tfdGltZXIuZXhwaXJlczsKIAl9IGVsc2UgewogCQl0aW1lcl9hY3RpdmUJPSAwOwogCQl0aW1lcl9leHBpcmVzID0gamlmZmllczsKQEAgLTIzMjEsMTcgKzIzMjIsMTcgQEAKIAogCXNwcmludGYodG1wYnVmLCAiJTRkOiAlMDhYOiUwNFggJTA4WDolMDRYICUwMlggJTA4WDolMDhYICUwMlg6JTA4bFggIgogCQkJIiUwOFggJTVkICU4ZCAlbHUgJWQgJXAgJXUgJXUgJXUgJXUgJWQiLAotCQlpLCBzcmMsIHNyY3AsIGRlc3QsIGRlc3RwLCBzcC0+c2tfc3RhdGUsCisJCWksIHNyYywgc3JjcCwgZGVzdCwgZGVzdHAsIHNrLT5za19zdGF0ZSwKIAkJdHAtPndyaXRlX3NlcSAtIHRwLT5zbmRfdW5hLAotCQlzcC0+c2tfc3RhdGUgPT0gVENQX0xJU1RFTiA/IHNwLT5za19hY2tfYmFja2xvZyA6CisJCXNrLT5za19zdGF0ZSA9PSBUQ1BfTElTVEVOID8gc2stPnNrX2Fja19iYWNrbG9nIDoKIAkJCQkJICAgICAodHAtPnJjdl9ueHQgLSB0cC0+Y29waWVkX3NlcSksCiAJCXRpbWVyX2FjdGl2ZSwKIAkJamlmZmllc190b19jbG9ja190KHRpbWVyX2V4cGlyZXMgLSBqaWZmaWVzKSwKIAkJaWNzay0+aWNza19yZXRyYW5zbWl0cywKLQkJc29ja19pX3VpZChzcCksCisJCXNvY2tfaV91aWQoc2spLAogCQlpY3NrLT5pY3NrX3Byb2Jlc19vdXQsCi0JCXNvY2tfaV9pbm8oc3ApLAotCQlhdG9taWNfcmVhZCgmc3AtPnNrX3JlZmNudCksIHNwLAorCQlzb2NrX2lfaW5vKHNrKSwKKwkJYXRvbWljX3JlYWQoJnNrLT5za19yZWZjbnQpLCBzaywKIAkJaWNzay0+aWNza19ydG8sCiAJCWljc2stPmljc2tfYWNrLmF0bywKIAkJKGljc2stPmljc2tfYWNrLnF1aWNrIDw8IDEpIHwgaWNzay0+aWNza19hY2sucGluZ3BvbmcsCmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3BfbHAuYyBiL25ldC9pcHY0L3RjcF9scC5jCmluZGV4IGYwZWJhZjAuLjQzMjk0YWQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3RjcF9scC5jCisrKyBiL25ldC9pcHY0L3RjcF9scC5jCkBAIC0yMTgsNyArMjE4LDcgQEAKICAqICAgMy4gY2FsYyBzbW9vdGhlZCBPV0QgKFNPV0QpLgogICogTW9zdCBpZGVhcyBjb21lIGZyb20gdGhlIG9yaWdpbmFsIFRDUC1MUCBpbXBsZW1lbnRhdGlvbi4KICAqLwotc3RhdGljIHZvaWQgdGNwX2xwX3J0dF9zYW1wbGUoc3RydWN0IHNvY2sgKnNrLCB1MzIgdXNydHQpCitzdGF0aWMgdm9pZCB0Y3BfbHBfcnR0X3NhbXBsZShzdHJ1Y3Qgc29jayAqc2ssIHUzMiBydHQpCiB7CiAJc3RydWN0IGxwICpscCA9IGluZXRfY3NrX2NhKHNrKTsKIAlzNjQgbW93ZCA9IHRjcF9scF9vd2RfY2FsY3VsYXRvcihzayk7CkBAIC0yNjEsMTEgKzI2MSwxMyBAQAogICogbmV3UmVubyBpbiBpbmNyZWFzZSBjYXNlLgogICogV2Ugd29yayBpdCBvdXQgYnkgZm9sbG93aW5nIHRoZSBpZGVhIGZyb20gVENQLUxQJ3MgcGFwZXIgZGlyZWN0bHkKICAqLwotc3RhdGljIHZvaWQgdGNwX2xwX3BrdHNfYWNrZWQoc3RydWN0IHNvY2sgKnNrLCB1MzIgbnVtX2Fja2VkKQorc3RhdGljIHZvaWQgdGNwX2xwX3BrdHNfYWNrZWQoc3RydWN0IHNvY2sgKnNrLCB1MzIgbnVtX2Fja2VkLCBrdGltZV90IGxhc3QpCiB7CiAJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CiAJc3RydWN0IGxwICpscCA9IGluZXRfY3NrX2NhKHNrKTsKIAorCXRjcF9scF9ydHRfc2FtcGxlKHNrLCAga3RpbWVfdG9fdXMobmV0X3RpbWVkZWx0YShsYXN0KSkpOworCiAJLyogY2FsYyBpbmZlcmVuY2UgKi8KIAlpZiAodGNwX3RpbWVfc3RhbXAgPiB0cC0+cnhfb3B0LnJjdl90c2VjcikKIAkJbHAtPmluZmVyZW5jZSA9IDMgKiAodGNwX3RpbWVfc3RhbXAgLSB0cC0+cnhfb3B0LnJjdl90c2Vjcik7CkBAIC0zMTIsMTEgKzMxNCwxMSBAQAogfQogCiBzdGF0aWMgc3RydWN0IHRjcF9jb25nZXN0aW9uX29wcyB0Y3BfbHAgPSB7CisJLmZsYWdzID0gVENQX0NPTkdfUlRUX1NUQU1QLAogCS5pbml0ID0gdGNwX2xwX2luaXQsCiAJLnNzdGhyZXNoID0gdGNwX3Jlbm9fc3N0aHJlc2gsCiAJLmNvbmdfYXZvaWQgPSB0Y3BfbHBfY29uZ19hdm9pZCwKIAkubWluX2N3bmQgPSB0Y3BfcmVub19taW5fY3duZCwKLQkucnR0X3NhbXBsZSA9IHRjcF9scF9ydHRfc2FtcGxlLAogCS5wa3RzX2Fja2VkID0gdGNwX2xwX3BrdHNfYWNrZWQsCiAKIAkub3duZXIgPSBUSElTX01PRFVMRSwKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3RjcF9taW5pc29ja3MuYyBiL25ldC9pcHY0L3RjcF9taW5pc29ja3MuYwppbmRleCA2YjVjNjRmLi5hMTJiMDhmIDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3BfbWluaXNvY2tzLmMKKysrIGIvbmV0L2lwdjQvdGNwX21pbmlzb2Nrcy5jCkBAIC0xNDksNyArMTQ5LDcgQEAKIAkJdHctPnR3X3N1YnN0YXRlCSAgPSBUQ1BfVElNRV9XQUlUOwogCQl0Y3B0dy0+dHdfcmN2X254dCA9IFRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcTsKIAkJaWYgKHRtcF9vcHQuc2F3X3RzdGFtcCkgewotCQkJdGNwdHctPnR3X3RzX3JlY2VudF9zdGFtcCA9IHh0aW1lLnR2X3NlYzsKKwkJCXRjcHR3LT50d190c19yZWNlbnRfc3RhbXAgPSBnZXRfc2Vjb25kcygpOwogCQkJdGNwdHctPnR3X3RzX3JlY2VudAkgID0gdG1wX29wdC5yY3ZfdHN2YWw7CiAJCX0KIApAQCAtMjA4LDcgKzIwOCw3IEBACiAKIAkJaWYgKHRtcF9vcHQuc2F3X3RzdGFtcCkgewogCQkJdGNwdHctPnR3X3RzX3JlY2VudAkgID0gdG1wX29wdC5yY3ZfdHN2YWw7Ci0JCQl0Y3B0dy0+dHdfdHNfcmVjZW50X3N0YW1wID0geHRpbWUudHZfc2VjOworCQkJdGNwdHctPnR3X3RzX3JlY2VudF9zdGFtcCA9IGdldF9zZWNvbmRzKCk7CiAJCX0KIAogCQlpbmV0X3R3c2tfcHV0KHR3KTsKQEAgLTI0Niw3ICsyNDYsNyBAQAogCWlmIChwYXdzX3JlamVjdCkKIAkJTkVUX0lOQ19TVEFUU19CSChMSU5VWF9NSUJfUEFXU0VTVEFCUkVKRUNURUQpOwogCi0JaWYoIXRoLT5yc3QpIHsKKwlpZiAoIXRoLT5yc3QpIHsKIAkJLyogSW4gdGhpcyBjYXNlIHdlIG11c3QgcmVzZXQgdGhlIFRJTUVXQUlUIHRpbWVyLgogCQkgKgogCQkgKiBJZiBpdCBpcyBBQ0tsZXNzIFNZTiBpdCBtYXkgYmUgYm90aCBvbGQgZHVwbGljYXRlCkBAIC0zMjQsNyArMzI0LDcgQEAKIAkJCQlpZiAodGNwX2FsbG9jX21kNXNpZ19wb29sKCkgPT0gTlVMTCkKIAkJCQkJQlVHKCk7CiAJCQl9Ci0JCX0gd2hpbGUoMCk7CisJCX0gd2hpbGUgKDApOwogI2VuZGlmCiAKIAkJLyogTGlua2FnZSB1cGRhdGVzLiAqLwpAQCAtMzg3LDggKzM4Nyw4IEBACiAJCS8qIE5vdyBzZXR1cCB0Y3Bfc29jayAqLwogCQluZXd0cCA9IHRjcF9zayhuZXdzayk7CiAJCW5ld3RwLT5wcmVkX2ZsYWdzID0gMDsKLQkJbmV3dHAtPnJjdl9ueHQgPSB0cmVxLT5yY3ZfaXNuICsgMTsKLQkJbmV3dHAtPnNuZF9ueHQgPSBuZXd0cC0+c25kX3VuYSA9IG5ld3RwLT5zbmRfc21sID0gdHJlcS0+c250X2lzbiArIDE7CisJCW5ld3RwLT5yY3Zfd3VwID0gbmV3dHAtPmNvcGllZF9zZXEgPSBuZXd0cC0+cmN2X254dCA9IHRyZXEtPnJjdl9pc24gKyAxOworCQluZXd0cC0+c25kX3NtbCA9IG5ld3RwLT5zbmRfdW5hID0gbmV3dHAtPnNuZF9ueHQgPSB0cmVxLT5zbnRfaXNuICsgMTsKIAogCQl0Y3BfcHJlcXVldWVfaW5pdChuZXd0cCk7CiAKQEAgLTQyMiwxMCArNDIyLDggQEAKIAkJdGNwX3NldF9jYV9zdGF0ZShuZXdzaywgVENQX0NBX09wZW4pOwogCQl0Y3BfaW5pdF94bWl0X3RpbWVycyhuZXdzayk7CiAJCXNrYl9xdWV1ZV9oZWFkX2luaXQoJm5ld3RwLT5vdXRfb2Zfb3JkZXJfcXVldWUpOwotCQluZXd0cC0+cmN2X3d1cCA9IHRyZXEtPnJjdl9pc24gKyAxOwogCQluZXd0cC0+d3JpdGVfc2VxID0gdHJlcS0+c250X2lzbiArIDE7CiAJCW5ld3RwLT5wdXNoZWRfc2VxID0gbmV3dHAtPndyaXRlX3NlcTsKLQkJbmV3dHAtPmNvcGllZF9zZXEgPSB0cmVxLT5yY3ZfaXNuICsgMTsKIAogCQluZXd0cC0+cnhfb3B0LnNhd190c3RhbXAgPSAwOwogCkBAIC00NDAsNyArNDM4LDcgQEAKIAkJCQkJCSAgICAgICBrZWVwYWxpdmVfdGltZV93aGVuKG5ld3RwKSk7CiAKIAkJbmV3dHAtPnJ4X29wdC50c3RhbXBfb2sgPSBpcmVxLT50c3RhbXBfb2s7Ci0JCWlmKChuZXd0cC0+cnhfb3B0LnNhY2tfb2sgPSBpcmVxLT5zYWNrX29rKSAhPSAwKSB7CisJCWlmICgobmV3dHAtPnJ4X29wdC5zYWNrX29rID0gaXJlcS0+c2Fja19vaykgIT0gMCkgewogCQkJaWYgKHN5c2N0bF90Y3BfZmFjaykKIAkJCQluZXd0cC0+cnhfb3B0LnNhY2tfb2sgfD0gMjsKIAkJfQpAQCAtNDU1LDEyICs0NTMsMTMgQEAKIAkJCW5ld3RwLT5yeF9vcHQuc25kX3dzY2FsZSA9IG5ld3RwLT5yeF9vcHQucmN2X3dzY2FsZSA9IDA7CiAJCQluZXd0cC0+d2luZG93X2NsYW1wID0gbWluKG5ld3RwLT53aW5kb3dfY2xhbXAsIDY1NTM1VSk7CiAJCX0KLQkJbmV3dHAtPnNuZF93bmQgPSBudG9ocyhza2ItPmgudGgtPndpbmRvdykgPDwgbmV3dHAtPnJ4X29wdC5zbmRfd3NjYWxlOworCQluZXd0cC0+c25kX3duZCA9IChudG9ocyh0Y3BfaGRyKHNrYiktPndpbmRvdykgPDwKKwkJCQkgIG5ld3RwLT5yeF9vcHQuc25kX3dzY2FsZSk7CiAJCW5ld3RwLT5tYXhfd2luZG93ID0gbmV3dHAtPnNuZF93bmQ7CiAKIAkJaWYgKG5ld3RwLT5yeF9vcHQudHN0YW1wX29rKSB7CiAJCQluZXd0cC0+cnhfb3B0LnRzX3JlY2VudCA9IHJlcS0+dHNfcmVjZW50OwotCQkJbmV3dHAtPnJ4X29wdC50c19yZWNlbnRfc3RhbXAgPSB4dGltZS50dl9zZWM7CisJCQluZXd0cC0+cnhfb3B0LnRzX3JlY2VudF9zdGFtcCA9IGdldF9zZWNvbmRzKCk7CiAJCQluZXd0cC0+dGNwX2hlYWRlcl9sZW4gPSBzaXplb2Yoc3RydWN0IHRjcGhkcikgKyBUQ1BPTEVOX1RTVEFNUF9BTElHTkVEOwogCQl9IGVsc2UgewogCQkJbmV3dHAtPnJ4X29wdC50c19yZWNlbnRfc3RhbXAgPSAwOwpAQCAtNDkwLDcgKzQ4OSw3IEBACiAJCQkgICBzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEsCiAJCQkgICBzdHJ1Y3QgcmVxdWVzdF9zb2NrICoqcHJldikKIHsKLQlzdHJ1Y3QgdGNwaGRyICp0aCA9IHNrYi0+aC50aDsKKwljb25zdCBzdHJ1Y3QgdGNwaGRyICp0aCA9IHRjcF9oZHIoc2tiKTsKIAlfX2JlMzIgZmxnID0gdGNwX2ZsYWdfd29yZCh0aCkgJiAoVENQX0ZMQUdfUlNUfFRDUF9GTEFHX1NZTnxUQ1BfRkxBR19BQ0spOwogCWludCBwYXdzX3JlamVjdCA9IDA7CiAJc3RydWN0IHRjcF9vcHRpb25zX3JlY2VpdmVkIHRtcF9vcHQ7CkBAIC01MDYsNyArNTA1LDcgQEAKIAkJCSAqIGl0IGNhbiBiZSBlc3RpbWF0ZWQgKGFwcHJveGltYXRlbHkpCiAJCQkgKiBmcm9tIGFub3RoZXIgZGF0YS4KIAkJCSAqLwotCQkJdG1wX29wdC50c19yZWNlbnRfc3RhbXAgPSB4dGltZS50dl9zZWMgLSAoKFRDUF9USU1FT1VUX0lOSVQvSFopPDxyZXEtPnJldHJhbnMpOworCQkJdG1wX29wdC50c19yZWNlbnRfc3RhbXAgPSBnZXRfc2Vjb25kcygpIC0gKChUQ1BfVElNRU9VVF9JTklUL0haKTw8cmVxLT5yZXRyYW5zKTsKIAkJCXBhd3NfcmVqZWN0ID0gdGNwX3Bhd3NfY2hlY2soJnRtcF9vcHQsIHRoLT5yc3QpOwogCQl9CiAJfQpAQCAtNzEyLDggKzcxMSw4IEBACiAJaW50IHN0YXRlID0gY2hpbGQtPnNrX3N0YXRlOwogCiAJaWYgKCFzb2NrX293bmVkX2J5X3VzZXIoY2hpbGQpKSB7Ci0JCXJldCA9IHRjcF9yY3Zfc3RhdGVfcHJvY2VzcyhjaGlsZCwgc2tiLCBza2ItPmgudGgsIHNrYi0+bGVuKTsKLQorCQlyZXQgPSB0Y3BfcmN2X3N0YXRlX3Byb2Nlc3MoY2hpbGQsIHNrYiwgdGNwX2hkcihza2IpLAorCQkJCQkgICAgc2tiLT5sZW4pOwogCQkvKiBXYWtldXAgcGFyZW50LCBzZW5kIFNJR0lPICovCiAJCWlmIChzdGF0ZSA9PSBUQ1BfU1lOX1JFQ1YgJiYgY2hpbGQtPnNrX3N0YXRlICE9IHN0YXRlKQogCQkJcGFyZW50LT5za19kYXRhX3JlYWR5KHBhcmVudCwgMCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3Bfb3V0cHV0LmMgYi9uZXQvaXB2NC90Y3Bfb3V0cHV0LmMKaW5kZXggM2MyNDg4MS4uMGZhYWNmOSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwX291dHB1dC5jCisrKyBiL25ldC9pcHY0L3RjcF9vdXRwdXQuYwpAQCAtNjIsMTQgKzYyLDEzIEBACiAvKiBCeSBkZWZhdWx0LCBSRkMyODYxIGJlaGF2aW9yLiAgKi8KIGludCBzeXNjdGxfdGNwX3Nsb3dfc3RhcnRfYWZ0ZXJfaWRsZSBfX3JlYWRfbW9zdGx5ID0gMTsKIAotc3RhdGljIHZvaWQgdXBkYXRlX3NlbmRfaGVhZChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCB0Y3Bfc29jayAqdHAsCi0JCQkgICAgIHN0cnVjdCBza19idWZmICpza2IpCitzdGF0aWMgdm9pZCB1cGRhdGVfc2VuZF9oZWFkKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlzay0+c2tfc2VuZF9oZWFkID0gc2tiLT5uZXh0OwotCWlmIChzay0+c2tfc2VuZF9oZWFkID09IChzdHJ1Y3Qgc2tfYnVmZiAqKSZzay0+c2tfd3JpdGVfcXVldWUpCi0JCXNrLT5za19zZW5kX2hlYWQgPSBOVUxMOworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCisJdGNwX2FkdmFuY2Vfc2VuZF9oZWFkKHNrLCBza2IpOwogCXRwLT5zbmRfbnh0ID0gVENQX1NLQl9DQihza2IpLT5lbmRfc2VxOwotCXRjcF9wYWNrZXRzX291dF9pbmMoc2ssIHRwLCBza2IpOworCXRjcF9wYWNrZXRzX291dF9pbmMoc2ssIHNrYik7CiB9CiAKIC8qIFNORC5OWFQsIGlmIHdpbmRvdyB3YXMgbm90IHNocnVuay4KQEAgLTc4LDggKzc3LDEwIEBACiAgKiBBbnl0aGluZyBpbiBiZXR3ZWVuIFNORC5VTkEuLi5TTkQuVU5BK1NORC5XTkQgYWxzbyBjYW4gYmUgYWxyZWFkeQogICogaW52YWxpZC4gT0ssIGxldCdzIG1ha2UgdGhpcyBmb3Igbm93OgogICovCi1zdGF0aWMgaW5saW5lIF9fdTMyIHRjcF9hY2NlcHRhYmxlX3NlcShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCB0Y3Bfc29jayAqdHApCitzdGF0aWMgaW5saW5lIF9fdTMyIHRjcF9hY2NlcHRhYmxlX3NlcShzdHJ1Y3Qgc29jayAqc2spCiB7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisKIAlpZiAoIWJlZm9yZSh0cC0+c25kX3VuYSt0cC0+c25kX3duZCwgdHAtPnNuZF9ueHQpKQogCQlyZXR1cm4gdHAtPnNuZF9ueHQ7CiAJZWxzZQpAQCAtMjM4LDcgKzIzOSw3IEBACiAJdTMyIG5ld193aW4gPSBfX3RjcF9zZWxlY3Rfd2luZG93KHNrKTsKIAogCS8qIE5ldmVyIHNocmluayB0aGUgb2ZmZXJlZCB3aW5kb3cgKi8KLQlpZihuZXdfd2luIDwgY3VyX3dpbikgeworCWlmIChuZXdfd2luIDwgY3VyX3dpbikgewogCQkvKiBEYW5nZXIgV2lsbCBSb2JpbnNvbiEKIAkJICogRG9uJ3QgdXBkYXRlIHJjdl93dXAvcmN2X3duZCBoZXJlIG9yIGVsc2UKIAkJICogd2Ugd2lsbCBub3QgYmUgYWJsZSB0byBhZHZlcnRpc2UgYSB6ZXJvCkBAIC0yODksMTAgKzI5MCwxMiBAQAogCQkJICAgICAgIChUQ1BPUFRfU0FDSyA8PCAgOCkgfAogCQkJICAgICAgIChUQ1BPTEVOX1NBQ0tfQkFTRSArICh0cC0+cnhfb3B0LmVmZl9zYWNrcyAqCiAJCQkJCQkgICAgIFRDUE9MRU5fU0FDS19QRVJCTE9DSykpKTsKLQkJZm9yKHRoaXNfc2FjayA9IDA7IHRoaXNfc2FjayA8IHRwLT5yeF9vcHQuZWZmX3NhY2tzOyB0aGlzX3NhY2srKykgeworCisJCWZvciAodGhpc19zYWNrID0gMDsgdGhpc19zYWNrIDwgdHAtPnJ4X29wdC5lZmZfc2Fja3M7IHRoaXNfc2FjaysrKSB7CiAJCQkqcHRyKysgPSBodG9ubChzcFt0aGlzX3NhY2tdLnN0YXJ0X3NlcSk7CiAJCQkqcHRyKysgPSBodG9ubChzcFt0aGlzX3NhY2tdLmVuZF9zZXEpOwogCQl9CisKIAkJaWYgKHRwLT5yeF9vcHQuZHNhY2spIHsKIAkJCXRwLT5yeF9vcHQuZHNhY2sgPSAwOwogCQkJdHAtPnJ4X29wdC5lZmZfc2Fja3MtLTsKQEAgLTMzNyw3ICszNDAsNyBAQAogCSAqLwogCSpwdHIrKyA9IGh0b25sKChUQ1BPUFRfTVNTIDw8IDI0KSB8IChUQ1BPTEVOX01TUyA8PCAxNikgfCBtc3MpOwogCWlmICh0cykgewotCQlpZihzYWNrKQorCQlpZiAoc2FjaykKIAkJCSpwdHIrKyA9IGh0b25sKChUQ1BPUFRfU0FDS19QRVJNIDw8IDI0KSB8CiAJCQkJICAgICAgIChUQ1BPTEVOX1NBQ0tfUEVSTSA8PCAxNikgfAogCQkJCSAgICAgICAoVENQT1BUX1RJTUVTVEFNUCA8PCA4KSB8CkBAIC0zNDksNyArMzUyLDcgQEAKIAkJCQkgICAgICAgVENQT0xFTl9USU1FU1RBTVApOwogCQkqcHRyKysgPSBodG9ubCh0c3RhbXApOwkJLyogVFNWQUwgKi8KIAkJKnB0cisrID0gaHRvbmwodHNfcmVjZW50KTsJLyogVFNFQ1IgKi8KLQl9IGVsc2UgaWYoc2FjaykKKwl9IGVsc2UgaWYgKHNhY2spCiAJCSpwdHIrKyA9IGh0b25sKChUQ1BPUFRfTk9QIDw8IDI0KSB8CiAJCQkgICAgICAgKFRDUE9QVF9OT1AgPDwgMTYpIHwKIAkJCSAgICAgICAoVENQT1BUX1NBQ0tfUEVSTSA8PCA4KSB8CkBAIC00MDYsNyArNDA5LDcgQEAKIAkvKiBJZiBjb25nZXN0aW9uIGNvbnRyb2wgaXMgZG9pbmcgdGltZXN0YW1waW5nLCB3ZSBtdXN0CiAJICogdGFrZSBzdWNoIGEgdGltZXN0YW1wIGJlZm9yZSB3ZSBwb3RlbnRpYWxseSBjbG9uZS9jb3B5LgogCSAqLwotCWlmIChpY3NrLT5pY3NrX2NhX29wcy0+cnR0X3NhbXBsZSkKKwlpZiAoaWNzay0+aWNza19jYV9vcHMtPmZsYWdzICYgVENQX0NPTkdfUlRUX1NUQU1QKQogCQlfX25ldF90aW1lc3RhbXAoc2tiKTsKIAogCWlmIChsaWtlbHkoY2xvbmVfaXQpKSB7CkBAIC00MzAsNyArNDMzLDcgQEAKIAlzeXNjdGxfZmxhZ3MgPSAwOwogCWlmICh1bmxpa2VseSh0Y2ItPmZsYWdzICYgVENQQ0JfRkxBR19TWU4pKSB7CiAJCXRjcF9oZWFkZXJfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgdGNwaGRyKSArIFRDUE9MRU5fTVNTOwotCQlpZihzeXNjdGxfdGNwX3RpbWVzdGFtcHMpIHsKKwkJaWYgKHN5c2N0bF90Y3BfdGltZXN0YW1wcykgewogCQkJdGNwX2hlYWRlcl9zaXplICs9IFRDUE9MRU5fVFNUQU1QX0FMSUdORUQ7CiAJCQlzeXNjdGxfZmxhZ3MgfD0gU1lTQ1RMX0ZMQUdfVFNUQU1QUzsKIAkJfQpAQCAtNDY1LDExICs0NjgsMTIgQEAKIAkJdGNwX2hlYWRlcl9zaXplICs9IFRDUE9MRU5fTUQ1U0lHX0FMSUdORUQ7CiAjZW5kaWYKIAotCXRoID0gKHN0cnVjdCB0Y3BoZHIgKikgc2tiX3B1c2goc2tiLCB0Y3BfaGVhZGVyX3NpemUpOwotCXNrYi0+aC50aCA9IHRoOworCXNrYl9wdXNoKHNrYiwgdGNwX2hlYWRlcl9zaXplKTsKKwlza2JfcmVzZXRfdHJhbnNwb3J0X2hlYWRlcihza2IpOwogCXNrYl9zZXRfb3duZXJfdyhza2IsIHNrKTsKIAogCS8qIEJ1aWxkIFRDUCBoZWFkZXIgYW5kIGNoZWNrc3VtIGl0LiAqLworCXRoID0gdGNwX2hkcihza2IpOwogCXRoLT5zb3VyY2UJCT0gaW5ldC0+c3BvcnQ7CiAJdGgtPmRlc3QJCT0gaW5ldC0+ZHBvcnQ7CiAJdGgtPnNlcQkJCT0gaHRvbmwodGNiLT5zZXEpOwpAQCAtNTE1LDcgKzUxOSw3IEBACiAJCQkJCSAgICAgbWQ1ID8gJm1kNV9oYXNoX2xvY2F0aW9uIDoKICNlbmRpZgogCQkJCQkgICAgIE5VTEwpOwotCQlUQ1BfRUNOX3NlbmQoc2ssIHRwLCBza2IsIHRjcF9oZWFkZXJfc2l6ZSk7CisJCVRDUF9FQ05fc2VuZChzaywgc2tiLCB0Y3BfaGVhZGVyX3NpemUpOwogCX0KIAogI2lmZGVmIENPTkZJR19UQ1BfTUQ1U0lHCkBAIC01MjQsNyArNTI4LDcgQEAKIAkJdHAtPmFmX3NwZWNpZmljLT5jYWxjX21kNV9oYXNoKG1kNV9oYXNoX2xvY2F0aW9uLAogCQkJCQkgICAgICAgbWQ1LAogCQkJCQkgICAgICAgc2ssIE5VTEwsIE5VTEwsCi0JCQkJCSAgICAgICBza2ItPmgudGgsCisJCQkJCSAgICAgICB0Y3BfaGRyKHNrYiksCiAJCQkJCSAgICAgICBzay0+c2tfcHJvdG9jb2wsCiAJCQkJCSAgICAgICBza2ItPmxlbik7CiAJfQpAQCAtNTQ1LDcgKzU0OSw3IEBACiAJaWYgKGxpa2VseShlcnIgPD0gMCkpCiAJCXJldHVybiBlcnI7CiAKLQl0Y3BfZW50ZXJfY3dyKHNrKTsKKwl0Y3BfZW50ZXJfY3dyKHNrLCAxKTsKIAogCXJldHVybiBuZXRfeG1pdF9ldmFsKGVycik7CiAKQEAgLTU2NywxMiArNTcxLDggQEAKIAkvKiBBZHZhbmNlIHdyaXRlX3NlcSBhbmQgcGxhY2Ugb250byB0aGUgd3JpdGVfcXVldWUuICovCiAJdHAtPndyaXRlX3NlcSA9IFRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcTsKIAlza2JfaGVhZGVyX3JlbGVhc2Uoc2tiKTsKLQlfX3NrYl9xdWV1ZV90YWlsKCZzay0+c2tfd3JpdGVfcXVldWUsIHNrYik7CisJdGNwX2FkZF93cml0ZV9xdWV1ZV90YWlsKHNrLCBza2IpOwogCXNrX2NoYXJnZV9za2Ioc2ssIHNrYik7Ci0KLQkvKiBRdWV1ZSBpdCwgcmVtZW1iZXJpbmcgd2hlcmUgd2UgbXVzdCBzdGFydCBzZW5kaW5nLiAqLwotCWlmIChzay0+c2tfc2VuZF9oZWFkID09IE5VTEwpCi0JCXNrLT5za19zZW5kX2hlYWQgPSBza2I7CiB9CiAKIHN0YXRpYyB2b2lkIHRjcF9zZXRfc2tiX3Rzb19zZWdzKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IG1zc19ub3cpCkBAIC03MDUsNyArNzA1LDcgQEAKIAogCS8qIExpbmsgQlVGRiBpbnRvIHRoZSBzZW5kIHF1ZXVlLiAqLwogCXNrYl9oZWFkZXJfcmVsZWFzZShidWZmKTsKLQlfX3NrYl9hcHBlbmQoc2tiLCBidWZmLCAmc2stPnNrX3dyaXRlX3F1ZXVlKTsKKwl0Y3BfaW5zZXJ0X3dyaXRlX3F1ZXVlX2FmdGVyKHNrYiwgYnVmZiwgc2spOwogCiAJcmV0dXJuIDA7CiB9CkBAIC03MzYsNyArNzM2LDcgQEAKIAl9CiAJc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncyA9IGs7CiAKLQlza2ItPnRhaWwgPSBza2ItPmRhdGE7CisJc2tiX3Jlc2V0X3RhaWxfcG9pbnRlcihza2IpOwogCXNrYi0+ZGF0YV9sZW4gLT0gbGVuOwogCXNrYi0+bGVuID0gc2tiLT5kYXRhX2xlbjsKIH0KQEAgLTkzMCw4ICs5MzAsOSBAQAogCiAvKiBDb25nZXN0aW9uIHdpbmRvdyB2YWxpZGF0aW9uLiAoUkZDMjg2MSkgKi8KIAotc3RhdGljIHZvaWQgdGNwX2N3bmRfdmFsaWRhdGUoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgdGNwX3NvY2sgKnRwKQorc3RhdGljIHZvaWQgdGNwX2N3bmRfdmFsaWRhdGUoc3RydWN0IHNvY2sgKnNrKQogeworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOwogCV9fdTMyIHBhY2tldHNfb3V0ID0gdHAtPnBhY2tldHNfb3V0OwogCiAJaWYgKHBhY2tldHNfb3V0ID49IHRwLT5zbmRfY3duZCkgewpAQCAtMTAzNCw4ICsxMDM1LDEwIEBACiAJaWYgKG5vbmFnbGUgJiBUQ1BfTkFHTEVfUFVTSCkKIAkJcmV0dXJuIDE7CiAKLQkvKiBEb24ndCB1c2UgdGhlIG5hZ2xlIHJ1bGUgZm9yIHVyZ2VudCBkYXRhIChvciBmb3IgdGhlIGZpbmFsIEZJTikuICAqLwotCWlmICh0cC0+dXJnX21vZGUgfHwKKwkvKiBEb24ndCB1c2UgdGhlIG5hZ2xlIHJ1bGUgZm9yIHVyZ2VudCBkYXRhIChvciBmb3IgdGhlIGZpbmFsIEZJTikuCisJICogTmFnbGUgY2FuIGJlIGlnbm9yZWQgZHVyaW5nIEYtUlRPIHRvbyAoc2VlIFJGQzQxMzgpLgorCSAqLworCWlmICh0cC0+dXJnX21vZGUgfHwgKHRwLT5mcnRvX2NvdW50ZXIgPT0gMikgfHwKIAkgICAgKFRDUF9TS0JfQ0Ioc2tiKS0+ZmxhZ3MgJiBUQ1BDQl9GTEFHX0ZJTikpCiAJCXJldHVybiAxOwogCkBAIC0xMDU2LDcgKzEwNTksNyBAQAogCXJldHVybiAhYWZ0ZXIoZW5kX3NlcSwgdHAtPnNuZF91bmEgKyB0cC0+c25kX3duZCk7CiB9CiAKLS8qIFRoaXMgY2hlY2tzIGlmIHRoZSBkYXRhIGJlYXJpbmcgcGFja2V0IFNLQiAodXN1YWxseSBzay0+c2tfc2VuZF9oZWFkKQorLyogVGhpcyBjaGVja3MgaWYgdGhlIGRhdGEgYmVhcmluZyBwYWNrZXQgU0tCICh1c3VhbGx5IHRjcF9zZW5kX2hlYWQoc2spKQogICogc2hvdWxkIGJlIHB1dCBvbiB0aGUgd2lyZSByaWdodCBub3cuICBJZiBzbywgaXQgcmV0dXJucyB0aGUgbnVtYmVyIG9mCiAgKiBwYWNrZXRzIGFsbG93ZWQgYnkgdGhlIGNvbmdlc3Rpb24gd2luZG93LgogICovCkBAIC0xMDc5LDE1ICsxMDgyLDEwIEBACiAJcmV0dXJuIGN3bmRfcXVvdGE7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHRjcF9za2JfaXNfbGFzdChjb25zdCBzdHJ1Y3Qgc29jayAqc2ssCi0JCQkJICBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoraW50IHRjcF9tYXlfc2VuZF9ub3coc3RydWN0IHNvY2sgKnNrKQogewotCXJldHVybiBza2ItPm5leHQgPT0gKHN0cnVjdCBza19idWZmICopJnNrLT5za193cml0ZV9xdWV1ZTsKLX0KLQotaW50IHRjcF9tYXlfc2VuZF9ub3coc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgdGNwX3NvY2sgKnRwKQotewotCXN0cnVjdCBza19idWZmICpza2IgPSBzay0+c2tfc2VuZF9oZWFkOworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCXN0cnVjdCBza19idWZmICpza2IgPSB0Y3Bfc2VuZF9oZWFkKHNrKTsKIAogCXJldHVybiAoc2tiICYmCiAJCXRjcF9zbmRfdGVzdChzaywgc2tiLCB0Y3BfY3VycmVudF9tc3Moc2ssIDEpLApAQCAtMTE0Myw3ICsxMTQxLDcgQEAKIAogCS8qIExpbmsgQlVGRiBpbnRvIHRoZSBzZW5kIHF1ZXVlLiAqLwogCXNrYl9oZWFkZXJfcmVsZWFzZShidWZmKTsKLQlfX3NrYl9hcHBlbmQoc2tiLCBidWZmLCAmc2stPnNrX3dyaXRlX3F1ZXVlKTsKKwl0Y3BfaW5zZXJ0X3dyaXRlX3F1ZXVlX2FmdGVyKHNrYiwgYnVmZiwgc2spOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMTUzLDggKzExNTEsOSBAQAogICoKICAqIFRoaXMgYWxnb3JpdGhtIGlzIGZyb20gSm9obiBIZWZmbmVyLgogICovCi1zdGF0aWMgaW50IHRjcF90c29fc2hvdWxkX2RlZmVyKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHRjcF9zb2NrICp0cCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3N0YXRpYyBpbnQgdGNwX3Rzb19zaG91bGRfZGVmZXIoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogeworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOwogCWNvbnN0IHN0cnVjdCBpbmV0X2Nvbm5lY3Rpb25fc29jayAqaWNzayA9IGluZXRfY3NrKHNrKTsKIAl1MzIgc2VuZF93aW4sIGNvbmdfd2luLCBsaW1pdCwgaW5fZmxpZ2h0OwogCkBAIC0xMjQ5LDEwICsxMjQ4LDEwIEBACiAKIAkvKiBIYXZlIGVub3VnaCBkYXRhIGluIHRoZSBzZW5kIHF1ZXVlIHRvIHByb2JlPyAqLwogCWxlbiA9IDA7Ci0JaWYgKChza2IgPSBzay0+c2tfc2VuZF9oZWFkKSA9PSBOVUxMKQorCWlmICgoc2tiID0gdGNwX3NlbmRfaGVhZChzaykpID09IE5VTEwpCiAJCXJldHVybiAtMTsKIAl3aGlsZSAoKGxlbiArPSBza2ItPmxlbikgPCBwcm9iZV9zaXplICYmICF0Y3Bfc2tiX2lzX2xhc3Qoc2ssIHNrYikpCi0JCXNrYiA9IHNrYi0+bmV4dDsKKwkJc2tiID0gdGNwX3dyaXRlX3F1ZXVlX25leHQoc2ssIHNrYik7CiAJaWYgKGxlbiA8IHByb2JlX3NpemUpCiAJCXJldHVybiAtMTsKIApAQCAtMTI3OSw5ICsxMjc4LDkgQEAKIAkJcmV0dXJuIC0xOwogCXNrX2NoYXJnZV9za2Ioc2ssIG5za2IpOwogCi0Jc2tiID0gc2stPnNrX3NlbmRfaGVhZDsKLQlfX3NrYl9pbnNlcnQobnNrYiwgc2tiLT5wcmV2LCBza2IsICZzay0+c2tfd3JpdGVfcXVldWUpOwotCXNrLT5za19zZW5kX2hlYWQgPSBuc2tiOworCXNrYiA9IHRjcF9zZW5kX2hlYWQoc2spOworCXRjcF9pbnNlcnRfd3JpdGVfcXVldWVfYmVmb3JlKG5za2IsIHNrYiwgc2spOworCXRjcF9hZHZhbmNlX3NlbmRfaGVhZChzaywgc2tiKTsKIAogCVRDUF9TS0JfQ0IobnNrYiktPnNlcSA9IFRDUF9TS0JfQ0Ioc2tiKS0+c2VxOwogCVRDUF9TS0JfQ0IobnNrYiktPmVuZF9zZXEgPSBUQ1BfU0tCX0NCKHNrYiktPnNlcSArIHByb2JlX3NpemU7CkBAIC0xMjkyLDcgKzEyOTEsNyBAQAogCiAJbGVuID0gMDsKIAl3aGlsZSAobGVuIDwgcHJvYmVfc2l6ZSkgewotCQluZXh0ID0gc2tiLT5uZXh0OworCQluZXh0ID0gdGNwX3dyaXRlX3F1ZXVlX25leHQoc2ssIHNrYik7CiAKIAkJY29weSA9IG1pbl90KGludCwgc2tiLT5sZW4sIHByb2JlX3NpemUgLSBsZW4pOwogCQlpZiAobnNrYi0+aXBfc3VtbWVkKQpAQCAtMTMwNSw3ICsxMzA0LDcgQEAKIAkJCS8qIFdlJ3ZlIGVhdGVuIGFsbCB0aGUgZGF0YSBmcm9tIHRoaXMgc2tiLgogCQkJICogVGhyb3cgaXQgYXdheS4gKi8KIAkJCVRDUF9TS0JfQ0IobnNrYiktPmZsYWdzIHw9IFRDUF9TS0JfQ0Ioc2tiKS0+ZmxhZ3M7Ci0JCQlfX3NrYl91bmxpbmsoc2tiLCAmc2stPnNrX3dyaXRlX3F1ZXVlKTsKKwkJCXRjcF91bmxpbmtfd3JpdGVfcXVldWUoc2tiLCBzayk7CiAJCQlza19zdHJlYW1fZnJlZV9za2Ioc2ssIHNrYik7CiAJCX0gZWxzZSB7CiAJCQlUQ1BfU0tCX0NCKG5za2IpLT5mbGFncyB8PSBUQ1BfU0tCX0NCKHNrYiktPmZsYWdzICYKQEAgLTEzMzMsNyArMTMzMiw3IEBACiAJCS8qIERlY3JlbWVudCBjd25kIGhlcmUgYmVjYXVzZSB3ZSBhcmUgc2VuZGluZwogCQkqIGVmZmVjdGl2ZWx5IHR3byBwYWNrZXRzLiAqLwogCQl0cC0+c25kX2N3bmQtLTsKLQkJdXBkYXRlX3NlbmRfaGVhZChzaywgdHAsIG5za2IpOworCQl1cGRhdGVfc2VuZF9oZWFkKHNrLCBuc2tiKTsKIAogCQlpY3NrLT5pY3NrX210dXAucHJvYmVfc2l6ZSA9IHRjcF9tc3NfdG9fbXR1KHNrLCBuc2tiLT5sZW4pOwogCQl0cC0+bXR1X3Byb2JlLnByb2JlX3NlcV9zdGFydCA9IFRDUF9TS0JfQ0IobnNrYiktPnNlcTsKQEAgLTEzNzcsNyArMTM3Niw3IEBACiAJCXNlbnRfcGt0cyA9IDE7CiAJfQogCi0Jd2hpbGUgKChza2IgPSBzay0+c2tfc2VuZF9oZWFkKSkgeworCXdoaWxlICgoc2tiID0gdGNwX3NlbmRfaGVhZChzaykpKSB7CiAJCXVuc2lnbmVkIGludCBsaW1pdDsKIAogCQl0c29fc2VncyA9IHRjcF9pbml0X3Rzb19zZWdzKHNrLCBza2IsIG1zc19ub3cpOwpAQCAtMTM5Niw3ICsxMzk1LDcgQEAKIAkJCQkJCSAgICAgIG5vbmFnbGUgOiBUQ1BfTkFHTEVfUFVTSCkpKSkKIAkJCQlicmVhazsKIAkJfSBlbHNlIHsKLQkJCWlmICh0Y3BfdHNvX3Nob3VsZF9kZWZlcihzaywgdHAsIHNrYikpCisJCQlpZiAodGNwX3Rzb19zaG91bGRfZGVmZXIoc2ssIHNrYikpCiAJCQkJYnJlYWs7CiAJCX0KIApAQCAtMTQyNSwzMSArMTQyNCwzMSBAQAogCQkvKiBBZHZhbmNlIHRoZSBzZW5kX2hlYWQuICBUaGlzIG9uZSBpcyBzZW50IG91dC4KIAkJICogVGhpcyBjYWxsIHdpbGwgaW5jcmVtZW50IHBhY2tldHNfb3V0LgogCQkgKi8KLQkJdXBkYXRlX3NlbmRfaGVhZChzaywgdHAsIHNrYik7CisJCXVwZGF0ZV9zZW5kX2hlYWQoc2ssIHNrYik7CiAKIAkJdGNwX21pbnNoYWxsX3VwZGF0ZSh0cCwgbXNzX25vdywgc2tiKTsKIAkJc2VudF9wa3RzKys7CiAJfQogCiAJaWYgKGxpa2VseShzZW50X3BrdHMpKSB7Ci0JCXRjcF9jd25kX3ZhbGlkYXRlKHNrLCB0cCk7CisJCXRjcF9jd25kX3ZhbGlkYXRlKHNrKTsKIAkJcmV0dXJuIDA7CiAJfQotCXJldHVybiAhdHAtPnBhY2tldHNfb3V0ICYmIHNrLT5za19zZW5kX2hlYWQ7CisJcmV0dXJuICF0cC0+cGFja2V0c19vdXQgJiYgdGNwX3NlbmRfaGVhZChzayk7CiB9CiAKIC8qIFB1c2ggb3V0IGFueSBwZW5kaW5nIGZyYW1lcyB3aGljaCB3ZXJlIGhlbGQgYmFjayBkdWUgdG8KICAqIFRDUF9DT1JLIG9yIGF0dGVtcHQgYXQgY29hbGVzY2luZyB0aW55IHBhY2tldHMuCiAgKiBUaGUgc29ja2V0IG11c3QgYmUgbG9ja2VkIGJ5IHRoZSBjYWxsZXIuCiAgKi8KLXZvaWQgX190Y3BfcHVzaF9wZW5kaW5nX2ZyYW1lcyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCB0Y3Bfc29jayAqdHAsCi0JCQkgICAgICAgdW5zaWduZWQgaW50IGN1cl9tc3MsIGludCBub25hZ2xlKQordm9pZCBfX3RjcF9wdXNoX3BlbmRpbmdfZnJhbWVzKHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgaW50IGN1cl9tc3MsCisJCQkgICAgICAgaW50IG5vbmFnbGUpCiB7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHNrLT5za19zZW5kX2hlYWQ7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHRjcF9zZW5kX2hlYWQoc2spOwogCiAJaWYgKHNrYikgewogCQlpZiAodGNwX3dyaXRlX3htaXQoc2ssIGN1cl9tc3MsIG5vbmFnbGUpKQotCQkJdGNwX2NoZWNrX3Byb2JlX3RpbWVyKHNrLCB0cCk7CisJCQl0Y3BfY2hlY2tfcHJvYmVfdGltZXIoc2spOwogCX0KIH0KIApAQCAtMTQ1OSw3ICsxNDU4LDcgQEAKIHZvaWQgdGNwX3B1c2hfb25lKHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgaW50IG1zc19ub3cpCiB7CiAJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHNrLT5za19zZW5kX2hlYWQ7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHRjcF9zZW5kX2hlYWQoc2spOwogCXVuc2lnbmVkIGludCB0c29fc2VncywgY3duZF9xdW90YTsKIAogCUJVR19PTighc2tiIHx8IHNrYi0+bGVuIDwgbXNzX25vdyk7CkBAIC0xNDkzLDggKzE0OTIsOCBAQAogCQlUQ1BfU0tCX0NCKHNrYiktPndoZW4gPSB0Y3BfdGltZV9zdGFtcDsKIAogCQlpZiAobGlrZWx5KCF0Y3BfdHJhbnNtaXRfc2tiKHNrLCBza2IsIDEsIHNrLT5za19hbGxvY2F0aW9uKSkpIHsKLQkJCXVwZGF0ZV9zZW5kX2hlYWQoc2ssIHRwLCBza2IpOwotCQkJdGNwX2N3bmRfdmFsaWRhdGUoc2ssIHRwKTsKKwkJCXVwZGF0ZV9zZW5kX2hlYWQoc2ssIHNrYik7CisJCQl0Y3BfY3duZF92YWxpZGF0ZShzayk7CiAJCQlyZXR1cm47CiAJCX0KIAl9CkBAIC0xNjIwLDcgKzE2MTksNyBAQAogc3RhdGljIHZvaWQgdGNwX3JldHJhbnNfdHJ5X2NvbGxhcHNlKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IG1zc19ub3cpCiB7CiAJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7Ci0Jc3RydWN0IHNrX2J1ZmYgKm5leHRfc2tiID0gc2tiLT5uZXh0OworCXN0cnVjdCBza19idWZmICpuZXh0X3NrYiA9IHRjcF93cml0ZV9xdWV1ZV9uZXh0KHNrLCBza2IpOwogCiAJLyogVGhlIGZpcnN0IHRlc3Qgd2UgbXVzdCBtYWtlIGlzIHRoYXQgbmVpdGhlciBvZiB0aGVzZSB0d28KIAkgKiBTS0IncyBhcmUgc3RpbGwgcmVmZXJlbmNlZCBieSBzb21lb25lIGVsc2UuCkBAIC0xNjMwLDcgKzE2MjksNyBAQAogCQl1MTYgZmxhZ3MgPSBUQ1BfU0tCX0NCKHNrYiktPmZsYWdzOwogCiAJCS8qIEFsc28gcHVudCBpZiBuZXh0IHNrYiBoYXMgYmVlbiBTQUNLJ2QuICovCi0JCWlmKFRDUF9TS0JfQ0IobmV4dF9za2IpLT5zYWNrZWQgJiBUQ1BDQl9TQUNLRURfQUNLRUQpCisJCWlmIChUQ1BfU0tCX0NCKG5leHRfc2tiKS0+c2Fja2VkICYgVENQQ0JfU0FDS0VEX0FDS0VEKQogCQkJcmV0dXJuOwogCiAJCS8qIE5leHQgc2tiIGlzIG91dCBvZiB3aW5kb3cuICovCkBAIC0xNjUyLDkgKzE2NTEsMTEgQEAKIAkJY2xlYXJfYWxsX3JldHJhbnNfaGludHModHApOwogCiAJCS8qIE9rLglXZSB3aWxsIGJlIGFibGUgdG8gY29sbGFwc2UgdGhlIHBhY2tldC4gKi8KLQkJX19za2JfdW5saW5rKG5leHRfc2tiLCAmc2stPnNrX3dyaXRlX3F1ZXVlKTsKKwkJdGNwX3VubGlua193cml0ZV9xdWV1ZShuZXh0X3NrYiwgc2spOwogCi0JCW1lbWNweShza2JfcHV0KHNrYiwgbmV4dF9za2Jfc2l6ZSksIG5leHRfc2tiLT5kYXRhLCBuZXh0X3NrYl9zaXplKTsKKwkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShuZXh0X3NrYiwKKwkJCQkJICBza2JfcHV0KHNrYiwgbmV4dF9za2Jfc2l6ZSksCisJCQkJCSAgbmV4dF9za2Jfc2l6ZSk7CiAKIAkJaWYgKG5leHRfc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCkKIAkJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fUEFSVElBTDsKQEAgLTE3MDYsNyArMTcwNyw5IEBACiAJdW5zaWduZWQgaW50IG1zcyA9IHRjcF9jdXJyZW50X21zcyhzaywgMCk7CiAJaW50IGxvc3QgPSAwOwogCi0Jc2tfc3RyZWFtX2Zvcl9yZXRyYW5zX3F1ZXVlKHNrYiwgc2spIHsKKwl0Y3BfZm9yX3dyaXRlX3F1ZXVlKHNrYiwgc2spIHsKKwkJaWYgKHNrYiA9PSB0Y3Bfc2VuZF9oZWFkKHNrKSkKKwkJCWJyZWFrOwogCQlpZiAoc2tiLT5sZW4gPiBtc3MgJiYKIAkJICAgICEoVENQX1NLQl9DQihza2IpLT5zYWNrZWQmVENQQ0JfU0FDS0VEX0FDS0VEKSkgewogCQkJaWYgKFRDUF9TS0JfQ0Ioc2tiKS0+c2Fja2VkJlRDUENCX1NBQ0tFRF9SRVRSQU5TKSB7CkBAIC0xNzg4LDEzICsxNzkxLDEzIEBACiAJfQogCiAJLyogQ29sbGFwc2UgdHdvIGFkamFjZW50IHBhY2tldHMgaWYgd29ydGh3aGlsZSBhbmQgd2UgY2FuLiAqLwotCWlmKCEoVENQX1NLQl9DQihza2IpLT5mbGFncyAmIFRDUENCX0ZMQUdfU1lOKSAmJgotCSAgIChza2ItPmxlbiA8IChjdXJfbXNzID4+IDEpKSAmJgotCSAgIChza2ItPm5leHQgIT0gc2stPnNrX3NlbmRfaGVhZCkgJiYKLQkgICAoc2tiLT5uZXh0ICE9IChzdHJ1Y3Qgc2tfYnVmZiAqKSZzay0+c2tfd3JpdGVfcXVldWUpICYmCi0JICAgKHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MgPT0gMCAmJiBza2Jfc2hpbmZvKHNrYi0+bmV4dCktPm5yX2ZyYWdzID09IDApICYmCi0JICAgKHRjcF9za2JfcGNvdW50KHNrYikgPT0gMSAmJiB0Y3Bfc2tiX3Bjb3VudChza2ItPm5leHQpID09IDEpICYmCi0JICAgKHN5c2N0bF90Y3BfcmV0cmFuc19jb2xsYXBzZSAhPSAwKSkKKwlpZiAoIShUQ1BfU0tCX0NCKHNrYiktPmZsYWdzICYgVENQQ0JfRkxBR19TWU4pICYmCisJICAgIChza2ItPmxlbiA8IChjdXJfbXNzID4+IDEpKSAmJgorCSAgICAodGNwX3dyaXRlX3F1ZXVlX25leHQoc2ssIHNrYikgIT0gdGNwX3NlbmRfaGVhZChzaykpICYmCisJICAgICghdGNwX3NrYl9pc19sYXN0KHNrLCBza2IpKSAmJgorCSAgICAoc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncyA9PSAwICYmIHNrYl9zaGluZm8odGNwX3dyaXRlX3F1ZXVlX25leHQoc2ssIHNrYikpLT5ucl9mcmFncyA9PSAwKSAmJgorCSAgICAodGNwX3NrYl9wY291bnQoc2tiKSA9PSAxICYmIHRjcF9za2JfcGNvdW50KHRjcF93cml0ZV9xdWV1ZV9uZXh0KHNrLCBza2IpKSA9PSAxKSAmJgorCSAgICAoc3lzY3RsX3RjcF9yZXRyYW5zX2NvbGxhcHNlICE9IDApKQogCQl0Y3BfcmV0cmFuc190cnlfY29sbGFwc2Uoc2ssIHNrYiwgY3VyX21zcyk7CiAKIAlpZiAoaW5ldF9jc2soc2spLT5pY3NrX2FmX29wcy0+cmVidWlsZF9oZWFkZXIoc2spKQpAQCAtMTgwNCw5ICsxODA3LDkgQEAKIAkgKiByZXRyYW5zbWl0IHdoZW4gb2xkIGRhdGEgaXMgYXR0YWNoZWQuICBTbyBzdHJpcCBpdCBvZmYKIAkgKiBzaW5jZSBpdCBpcyBjaGVhcCB0byBkbyBzbyBhbmQgc2F2ZXMgYnl0ZXMgb24gdGhlIG5ldHdvcmsuCiAJICovCi0JaWYoc2tiLT5sZW4gPiAwICYmCi0JICAgKFRDUF9TS0JfQ0Ioc2tiKS0+ZmxhZ3MgJiBUQ1BDQl9GTEFHX0ZJTikgJiYKLQkgICB0cC0+c25kX3VuYSA9PSAoVENQX1NLQl9DQihza2IpLT5lbmRfc2VxIC0gMSkpIHsKKwlpZiAoc2tiLT5sZW4gPiAwICYmCisJICAgIChUQ1BfU0tCX0NCKHNrYiktPmZsYWdzICYgVENQQ0JfRkxBR19GSU4pICYmCisJICAgIHRwLT5zbmRfdW5hID09IChUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXEgLSAxKSkgewogCQlpZiAoIXBza2JfdHJpbShza2IsIDApKSB7CiAJCQlUQ1BfU0tCX0NCKHNrYiktPnNlcSA9IFRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcSAtIDE7CiAJCQlza2Jfc2hpbmZvKHNrYiktPmdzb19zZWdzID0gMTsKQEAgLTE4NzIsMTUgKzE4NzUsMTcgQEAKIAkJc2tiID0gdHAtPnJldHJhbnNtaXRfc2tiX2hpbnQ7CiAJCXBhY2tldF9jbnQgPSB0cC0+cmV0cmFuc21pdF9jbnRfaGludDsKIAl9ZWxzZXsKLQkJc2tiID0gc2stPnNrX3dyaXRlX3F1ZXVlLm5leHQ7CisJCXNrYiA9IHRjcF93cml0ZV9xdWV1ZV9oZWFkKHNrKTsKIAkJcGFja2V0X2NudCA9IDA7CiAJfQogCiAJLyogRmlyc3QgcGFzczogcmV0cmFuc21pdCBsb3N0IHBhY2tldHMuICovCiAJaWYgKHRwLT5sb3N0X291dCkgewotCQlza19zdHJlYW1fZm9yX3JldHJhbnNfcXVldWVfZnJvbShza2IsIHNrKSB7CisJCXRjcF9mb3Jfd3JpdGVfcXVldWVfZnJvbShza2IsIHNrKSB7CiAJCQlfX3U4IHNhY2tlZCA9IFRDUF9TS0JfQ0Ioc2tiKS0+c2Fja2VkOwogCisJCQlpZiAoc2tiID09IHRjcF9zZW5kX2hlYWQoc2spKQorCQkJCWJyZWFrOwogCQkJLyogd2UgY291bGQgZG8gYmV0dGVyIHRoYW4gdG8gYXNzaWduIGVhY2ggdGltZSAqLwogCQkJdHAtPnJldHJhbnNtaXRfc2tiX2hpbnQgPSBza2I7CiAJCQl0cC0+cmV0cmFuc21pdF9jbnRfaGludCA9IHBhY2tldF9jbnQ7CkBAIC0xOTA2LDggKzE5MTEsNyBAQAogCQkJCQllbHNlCiAJCQkJCQlORVRfSU5DX1NUQVRTX0JIKExJTlVYX01JQl9UQ1BTTE9XU1RBUlRSRVRSQU5TKTsKIAotCQkJCQlpZiAoc2tiID09Ci0JCQkJCSAgICBza2JfcGVlaygmc2stPnNrX3dyaXRlX3F1ZXVlKSkKKwkJCQkJaWYgKHNrYiA9PSB0Y3Bfd3JpdGVfcXVldWVfaGVhZChzaykpCiAJCQkJCQlpbmV0X2Nza19yZXNldF94bWl0X3RpbWVyKHNrLCBJQ1NLX1RJTUVfUkVUUkFOUywKIAkJCQkJCQkJCSAgaW5ldF9jc2soc2spLT5pY3NrX3J0bywKIAkJCQkJCQkJCSAgVENQX1JUT19NQVgpOwpAQCAtMTkzNywxOCArMTk0MSwyMCBAQAogCSAqIHNlZ21lbnRzIHRvIHNlbmQuCiAJICovCiAKLQlpZiAodGNwX21heV9zZW5kX25vdyhzaywgdHApKQorCWlmICh0Y3BfbWF5X3NlbmRfbm93KHNrKSkKIAkJcmV0dXJuOwogCiAJaWYgKHRwLT5mb3J3YXJkX3NrYl9oaW50KSB7CiAJCXNrYiA9IHRwLT5mb3J3YXJkX3NrYl9oaW50OwogCQlwYWNrZXRfY250ID0gdHAtPmZvcndhcmRfY250X2hpbnQ7CiAJfSBlbHNlewotCQlza2IgPSBzay0+c2tfd3JpdGVfcXVldWUubmV4dDsKKwkJc2tiID0gdGNwX3dyaXRlX3F1ZXVlX2hlYWQoc2spOwogCQlwYWNrZXRfY250ID0gMDsKIAl9CiAKLQlza19zdHJlYW1fZm9yX3JldHJhbnNfcXVldWVfZnJvbShza2IsIHNrKSB7CisJdGNwX2Zvcl93cml0ZV9xdWV1ZV9mcm9tKHNrYiwgc2spIHsKKwkJaWYgKHNrYiA9PSB0Y3Bfc2VuZF9oZWFkKHNrKSkKKwkJCWJyZWFrOwogCQl0cC0+Zm9yd2FyZF9jbnRfaGludCA9IHBhY2tldF9jbnQ7CiAJCXRwLT5mb3J3YXJkX3NrYl9oaW50ID0gc2tiOwogCkBAIC0xOTczLDcgKzE5NzksNyBAQAogCQkJYnJlYWs7CiAJCX0KIAotCQlpZiAoc2tiID09IHNrYl9wZWVrKCZzay0+c2tfd3JpdGVfcXVldWUpKQorCQlpZiAoc2tiID09IHRjcF93cml0ZV9xdWV1ZV9oZWFkKHNrKSkKIAkJCWluZXRfY3NrX3Jlc2V0X3htaXRfdGltZXIoc2ssIElDU0tfVElNRV9SRVRSQU5TLAogCQkJCQkJICBpbmV0X2NzayhzayktPmljc2tfcnRvLAogCQkJCQkJICBUQ1BfUlRPX01BWCk7CkBAIC0xOTg5LDcgKzE5OTUsNyBAQAogdm9pZCB0Y3Bfc2VuZF9maW4oc3RydWN0IHNvY2sgKnNrKQogewogCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOwotCXN0cnVjdCBza19idWZmICpza2IgPSBza2JfcGVla190YWlsKCZzay0+c2tfd3JpdGVfcXVldWUpOworCXN0cnVjdCBza19idWZmICpza2IgPSB0Y3Bfd3JpdGVfcXVldWVfdGFpbChzayk7CiAJaW50IG1zc19ub3c7CiAKIAkvKiBPcHRpbWl6YXRpb24sIHRhY2sgb24gdGhlIEZJTiBpZiB3ZSBoYXZlIGEgcXVldWUgb2YKQEAgLTE5OTgsNyArMjAwNCw3IEBACiAJICovCiAJbXNzX25vdyA9IHRjcF9jdXJyZW50X21zcyhzaywgMSk7CiAKLQlpZiAoc2stPnNrX3NlbmRfaGVhZCAhPSBOVUxMKSB7CisJaWYgKHRjcF9zZW5kX2hlYWQoc2spICE9IE5VTEwpIHsKIAkJVENQX1NLQl9DQihza2IpLT5mbGFncyB8PSBUQ1BDQl9GTEFHX0ZJTjsKIAkJVENQX1NLQl9DQihza2IpLT5lbmRfc2VxKys7CiAJCXRwLT53cml0ZV9zZXErKzsKQEAgLTIwMjUsMTcgKzIwMzEsMTYgQEAKIAkJVENQX1NLQl9DQihza2IpLT5lbmRfc2VxID0gVENQX1NLQl9DQihza2IpLT5zZXEgKyAxOwogCQl0Y3BfcXVldWVfc2tiKHNrLCBza2IpOwogCX0KLQlfX3RjcF9wdXNoX3BlbmRpbmdfZnJhbWVzKHNrLCB0cCwgbXNzX25vdywgVENQX05BR0xFX09GRik7CisJX190Y3BfcHVzaF9wZW5kaW5nX2ZyYW1lcyhzaywgbXNzX25vdywgVENQX05BR0xFX09GRik7CiB9CiAKIC8qIFdlIGdldCBoZXJlIHdoZW4gYSBwcm9jZXNzIGNsb3NlcyBhIGZpbGUgZGVzY3JpcHRvciAoZWl0aGVyIGR1ZSB0bwogICogYW4gZXhwbGljaXQgY2xvc2UoKSBvciBhcyBhIGJ5cHJvZHVjdCBvZiBleGl0KCknaW5nKSBhbmQgdGhlcmUKICAqIHdhcyB1bnJlYWQgZGF0YSBpbiB0aGUgcmVjZWl2ZSBxdWV1ZS4gIFRoaXMgYmVoYXZpb3IgaXMgcmVjb21tZW5kZWQKLSAqIGJ5IGRyYWZ0LWlldGYtdGNwaW1wbC1wcm9iLTAzLnR4dCBzZWN0aW9uIDMuMTAuICAtRGF2ZU0KKyAqIGJ5IFJGQyAyNTI1LCBzZWN0aW9uIDIuMTcuICAtRGF2ZU0KICAqLwogdm9pZCB0Y3Bfc2VuZF9hY3RpdmVfcmVzZXQoc3RydWN0IHNvY2sgKnNrLCBnZnBfdCBwcmlvcml0eSkKIHsKLQlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCiAJLyogTk9URTogTm8gVENQIG9wdGlvbnMgYXR0YWNoZWQgYW5kIHdlIG5ldmVyIHJldHJhbnNtaXQgdGhpcy4gKi8KQEAgLTIwNTUsNyArMjA2MCw3IEBACiAJc2tiX3NoaW5mbyhza2IpLT5nc29fdHlwZSA9IDA7CiAKIAkvKiBTZW5kIGl0IG9mZi4gKi8KLQlUQ1BfU0tCX0NCKHNrYiktPnNlcSA9IHRjcF9hY2NlcHRhYmxlX3NlcShzaywgdHApOworCVRDUF9TS0JfQ0Ioc2tiKS0+c2VxID0gdGNwX2FjY2VwdGFibGVfc2VxKHNrKTsKIAlUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXEgPSBUQ1BfU0tCX0NCKHNrYiktPnNlcTsKIAlUQ1BfU0tCX0NCKHNrYiktPndoZW4gPSB0Y3BfdGltZV9zdGFtcDsKIAlpZiAodGNwX3RyYW5zbWl0X3NrYihzaywgc2tiLCAwLCBwcmlvcml0eSkpCkBAIC0yMDcxLDcgKzIwNzYsNyBAQAogewogCXN0cnVjdCBza19idWZmKiBza2I7CiAKLQlza2IgPSBza2JfcGVlaygmc2stPnNrX3dyaXRlX3F1ZXVlKTsKKwlza2IgPSB0Y3Bfd3JpdGVfcXVldWVfaGVhZChzayk7CiAJaWYgKHNrYiA9PSBOVUxMIHx8ICEoVENQX1NLQl9DQihza2IpLT5mbGFncyZUQ1BDQl9GTEFHX1NZTikpIHsKIAkJcHJpbnRrKEtFUk5fREVCVUcgInRjcF9zZW5kX3N5bmFjazogd3JvbmcgcXVldWUgc3RhdGVcbiIpOwogCQlyZXR1cm4gLUVGQVVMVDsKQEAgLTIwODEsOSArMjA4Niw5IEBACiAJCQlzdHJ1Y3Qgc2tfYnVmZiAqbnNrYiA9IHNrYl9jb3B5KHNrYiwgR0ZQX0FUT01JQyk7CiAJCQlpZiAobnNrYiA9PSBOVUxMKQogCQkJCXJldHVybiAtRU5PTUVNOwotCQkJX19za2JfdW5saW5rKHNrYiwgJnNrLT5za193cml0ZV9xdWV1ZSk7CisJCQl0Y3BfdW5saW5rX3dyaXRlX3F1ZXVlKHNrYiwgc2spOwogCQkJc2tiX2hlYWRlcl9yZWxlYXNlKG5za2IpOwotCQkJX19za2JfcXVldWVfaGVhZCgmc2stPnNrX3dyaXRlX3F1ZXVlLCBuc2tiKTsKKwkJCV9fdGNwX2FkZF93cml0ZV9xdWV1ZV9oZWFkKHNrLCBuc2tiKTsKIAkJCXNrX3N0cmVhbV9mcmVlX3NrYihzaywgc2tiKTsKIAkJCXNrX2NoYXJnZV9za2Ioc2ssIG5za2IpOwogCQkJc2tiID0gbnNrYjsKQEAgLTIxMzMsOCArMjEzOCwxMCBAQAogCWlmIChtZDUpCiAJCXRjcF9oZWFkZXJfc2l6ZSArPSBUQ1BPTEVOX01ENVNJR19BTElHTkVEOwogI2VuZGlmCi0Jc2tiLT5oLnRoID0gdGggPSAoc3RydWN0IHRjcGhkciAqKSBza2JfcHVzaChza2IsIHRjcF9oZWFkZXJfc2l6ZSk7CisJc2tiX3B1c2goc2tiLCB0Y3BfaGVhZGVyX3NpemUpOworCXNrYl9yZXNldF90cmFuc3BvcnRfaGVhZGVyKHNrYik7CiAKKwl0aCA9IHRjcF9oZHIoc2tiKTsKIAltZW1zZXQodGgsIDAsIHNpemVvZihzdHJ1Y3QgdGNwaGRyKSk7CiAJdGgtPnN5biA9IDE7CiAJdGgtPmFjayA9IDE7CkBAIC0yMTg4LDcgKzIxOTUsNyBAQAogCQl0cC0+YWZfc3BlY2lmaWMtPmNhbGNfbWQ1X2hhc2gobWQ1X2hhc2hfbG9jYXRpb24sCiAJCQkJCSAgICAgICBtZDUsCiAJCQkJCSAgICAgICBOVUxMLCBkc3QsIHJlcSwKLQkJCQkJICAgICAgIHNrYi0+aC50aCwgc2stPnNrX3Byb3RvY29sLAorCQkJCQkgICAgICAgdGNwX2hkcihza2IpLCBzay0+c2tfcHJvdG9jb2wsCiAJCQkJCSAgICAgICBza2ItPmxlbik7CiAJfQogI2VuZGlmCkBAIC0yMjcxLDcgKzIyNzgsNyBAQAogCXNrYl9yZXNlcnZlKGJ1ZmYsIE1BWF9UQ1BfSEVBREVSKTsKIAogCVRDUF9TS0JfQ0IoYnVmZiktPmZsYWdzID0gVENQQ0JfRkxBR19TWU47Ci0JVENQX0VDTl9zZW5kX3N5bihzaywgdHAsIGJ1ZmYpOworCVRDUF9FQ05fc2VuZF9zeW4oc2ssIGJ1ZmYpOwogCVRDUF9TS0JfQ0IoYnVmZiktPnNhY2tlZCA9IDA7CiAJc2tiX3NoaW5mbyhidWZmKS0+Z3NvX3NlZ3MgPSAxOwogCXNrYl9zaGluZm8oYnVmZiktPmdzb19zaXplID0gMDsKQEAgLTIyODUsNyArMjI5Miw3IEBACiAJVENQX1NLQl9DQihidWZmKS0+d2hlbiA9IHRjcF90aW1lX3N0YW1wOwogCXRwLT5yZXRyYW5zX3N0YW1wID0gVENQX1NLQl9DQihidWZmKS0+d2hlbjsKIAlza2JfaGVhZGVyX3JlbGVhc2UoYnVmZik7Ci0JX19za2JfcXVldWVfdGFpbCgmc2stPnNrX3dyaXRlX3F1ZXVlLCBidWZmKTsKKwlfX3RjcF9hZGRfd3JpdGVfcXVldWVfdGFpbChzaywgYnVmZik7CiAJc2tfY2hhcmdlX3NrYihzaywgYnVmZik7CiAJdHAtPnBhY2tldHNfb3V0ICs9IHRjcF9za2JfcGNvdW50KGJ1ZmYpOwogCXRjcF90cmFuc21pdF9za2Ioc2ssIGJ1ZmYsIDEsIEdGUF9LRVJORUwpOwpAQCAtMjM2Myw3ICsyMzcwLDYgQEAKIHsKIAkvKiBJZiB3ZSBoYXZlIGJlZW4gcmVzZXQsIHdlIG1heSBub3Qgc2VuZCBhZ2Fpbi4gKi8KIAlpZiAoc2stPnNrX3N0YXRlICE9IFRDUF9DTE9TRSkgewotCQlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKIAkJc3RydWN0IHNrX2J1ZmYgKmJ1ZmY7CiAKIAkJLyogV2UgYXJlIG5vdCBwdXR0aW5nIHRoaXMgb24gdGhlIHdyaXRlIHF1ZXVlLCBzbwpAQCAtMjM4OSw3ICsyMzk1LDcgQEAKIAkJc2tiX3NoaW5mbyhidWZmKS0+Z3NvX3R5cGUgPSAwOwogCiAJCS8qIFNlbmQgaXQgb2ZmLCB0aGlzIGNsZWFycyBkZWxheWVkIGFja3MgZm9yIHVzLiAqLwotCQlUQ1BfU0tCX0NCKGJ1ZmYpLT5zZXEgPSBUQ1BfU0tCX0NCKGJ1ZmYpLT5lbmRfc2VxID0gdGNwX2FjY2VwdGFibGVfc2VxKHNrLCB0cCk7CisJCVRDUF9TS0JfQ0IoYnVmZiktPnNlcSA9IFRDUF9TS0JfQ0IoYnVmZiktPmVuZF9zZXEgPSB0Y3BfYWNjZXB0YWJsZV9zZXEoc2spOwogCQlUQ1BfU0tCX0NCKGJ1ZmYpLT53aGVuID0gdGNwX3RpbWVfc3RhbXA7CiAJCXRjcF90cmFuc21pdF9za2Ioc2ssIGJ1ZmYsIDAsIEdGUF9BVE9NSUMpOwogCX0KQEAgLTI0NDEsNyArMjQ0Nyw3IEBACiAJCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOwogCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCi0JCWlmICgoc2tiID0gc2stPnNrX3NlbmRfaGVhZCkgIT0gTlVMTCAmJgorCQlpZiAoKHNrYiA9IHRjcF9zZW5kX2hlYWQoc2spKSAhPSBOVUxMICYmCiAJCSAgICBiZWZvcmUoVENQX1NLQl9DQihza2IpLT5zZXEsIHRwLT5zbmRfdW5hK3RwLT5zbmRfd25kKSkgewogCQkJaW50IGVycjsKIAkJCXVuc2lnbmVkIGludCBtc3MgPSB0Y3BfY3VycmVudF9tc3Moc2ssIDApOwpAQCAtMjQ2Nyw3ICsyNDczLDcgQEAKIAkJCVRDUF9TS0JfQ0Ioc2tiKS0+d2hlbiA9IHRjcF90aW1lX3N0YW1wOwogCQkJZXJyID0gdGNwX3RyYW5zbWl0X3NrYihzaywgc2tiLCAxLCBHRlBfQVRPTUlDKTsKIAkJCWlmICghZXJyKSB7Ci0JCQkJdXBkYXRlX3NlbmRfaGVhZChzaywgdHAsIHNrYik7CisJCQkJdXBkYXRlX3NlbmRfaGVhZChzaywgc2tiKTsKIAkJCX0KIAkJCXJldHVybiBlcnI7CiAJCX0gZWxzZSB7CkBAIC0yNDkxLDcgKzI0OTcsNyBAQAogCiAJZXJyID0gdGNwX3dyaXRlX3dha2V1cChzayk7CiAKLQlpZiAodHAtPnBhY2tldHNfb3V0IHx8ICFzay0+c2tfc2VuZF9oZWFkKSB7CisJaWYgKHRwLT5wYWNrZXRzX291dCB8fCAhdGNwX3NlbmRfaGVhZChzaykpIHsKIAkJLyogQ2FuY2VsIHByb2JlIHRpbWVyLCBpZiBpdCBpcyBub3QgcmVxdWlyZWQuICovCiAJCWljc2stPmljc2tfcHJvYmVzX291dCA9IDA7CiAJCWljc2stPmljc2tfYmFja29mZiA9IDA7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3BfcHJvYmUuYyBiL25ldC9pcHY0L3RjcF9wcm9iZS5jCmluZGV4IDYxZjQwNmYyLi4zOTM4ZDVkIDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3BfcHJvYmUuYworKysgYi9uZXQvaXB2NC90Y3BfcHJvYmUuYwpAQCAtMjYsNiArMjYsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZmlmby5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aW1lLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KIAogI2luY2x1ZGUgPG5ldC90Y3AuaD4KQEAgLTM0LDQzICszNiw0NSBAQAogTU9EVUxFX0RFU0NSSVBUSU9OKCJUQ1AgY3duZCBzbm9vcGVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKLXN0YXRpYyBpbnQgcG9ydCA9IDA7CitzdGF0aWMgaW50IHBvcnQgX19yZWFkX21vc3RseSA9IDA7CiBNT0RVTEVfUEFSTV9ERVNDKHBvcnQsICJQb3J0IHRvIG1hdGNoICgwPWFsbCkiKTsKIG1vZHVsZV9wYXJhbShwb3J0LCBpbnQsIDApOwogCi1zdGF0aWMgaW50IGJ1ZnNpemUgPSA2NCoxMDI0Oworc3RhdGljIGludCBidWZzaXplIF9fcmVhZF9tb3N0bHkgPSA2NCoxMDI0OwogTU9EVUxFX1BBUk1fREVTQyhidWZzaXplLCAiTG9nIGJ1ZmZlciBzaXplIChkZWZhdWx0IDY0aykiKTsKIG1vZHVsZV9wYXJhbShidWZzaXplLCBpbnQsIDApOwogCitzdGF0aWMgaW50IGZ1bGwgX19yZWFkX21vc3RseTsKK01PRFVMRV9QQVJNX0RFU0MoZnVsbCwgIkZ1bGwgbG9nICgxPWV2ZXJ5IGFjayBwYWNrZXQgcmVjZWl2ZWQsICAwPW9ubHkgY3duZCBjaGFuZ2VzKSIpOworbW9kdWxlX3BhcmFtKGZ1bGwsIGludCwgMCk7CisKIHN0YXRpYyBjb25zdCBjaGFyIHByb2NuYW1lW10gPSAidGNwcHJvYmUiOwogCiBzdHJ1Y3QgewotCXN0cnVjdCBrZmlmbyAgKmZpZm87Ci0Jc3BpbmxvY2tfdCAgICBsb2NrOworCXN0cnVjdCBrZmlmbwkqZmlmbzsKKwlzcGlubG9ja190CWxvY2s7CiAJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsKLQlzdHJ1Y3QgdGltZXZhbCB0c3RhcnQ7CisJa3RpbWVfdAkJc3RhcnQ7CisJdTMyCQlsYXN0Y3duZDsKIH0gdGNwdzsKIAorLyoKKyAqIFByaW50IHRvIGxvZyB3aXRoIHRpbWVzdGFtcHMuCisgKiBGSVhNRTogY2F1c2VzIGFuIGV4dHJhIGNvcHkKKyAqLwogc3RhdGljIHZvaWQgcHJpbnRsKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQogewogCXZhX2xpc3QgYXJnczsKIAlpbnQgbGVuOwotCXN0cnVjdCB0aW1ldmFsIG5vdzsKKwlzdHJ1Y3QgdGltZXNwZWMgdHY7CiAJY2hhciB0YnVmWzI1Nl07CiAKIAl2YV9zdGFydChhcmdzLCBmbXQpOwotCWRvX2dldHRpbWVvZmRheSgmbm93KTsKKwkvKiB3YW50IG1vbm90b25pYyB0aW1lIHNpbmNlIHN0YXJ0IG9mIHRjcF9wcm9iZSAqLworCXR2ID0ga3RpbWVfdG9fdGltZXNwZWMoa3RpbWVfc3ViKGt0aW1lX2dldCgpLCB0Y3B3LnN0YXJ0KSk7CiAKLQlub3cudHZfc2VjIC09IHRjcHcudHN0YXJ0LnR2X3NlYzsKLQlub3cudHZfdXNlYyAtPSB0Y3B3LnRzdGFydC50dl91c2VjOwotCWlmIChub3cudHZfdXNlYyA8IDApIHsKLQkJLS1ub3cudHZfc2VjOwotCQlub3cudHZfdXNlYyArPSAxMDAwMDAwOwotCX0KLQotCWxlbiA9IHNwcmludGYodGJ1ZiwgIiVsdS4lMDZsdSAiLAotCQkgICAgICAodW5zaWduZWQgbG9uZykgbm93LnR2X3NlYywKLQkJICAgICAgKHVuc2lnbmVkIGxvbmcpIG5vdy50dl91c2VjKTsKKwlsZW4gPSBzcHJpbnRmKHRidWYsICIlbHUuJTA5bHUgIiwKKwkJICAgICAgKHVuc2lnbmVkIGxvbmcpIHR2LnR2X3NlYywgKHVuc2lnbmVkIGxvbmcpIHR2LnR2X25zZWMpOwogCWxlbiArPSB2c2NucHJpbnRmKHRidWYrbGVuLCBzaXplb2YodGJ1ZiktbGVuLCBmbXQsIGFyZ3MpOwogCXZhX2VuZChhcmdzKTsKIApAQCAtNzgsMzggKzgyLDQ0IEBACiAJd2FrZV91cCgmdGNwdy53YWl0KTsKIH0KIAotc3RhdGljIGludCBqdGNwX3NlbmRtc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29jayAqc2ssCi0JCQlzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBzaXplKQorLyoKKyAqIEhvb2sgaW5zZXJ0ZWQgdG8gYmUgY2FsbGVkIGJlZm9yZSBlYWNoIHJlY2VpdmUgcGFja2V0LgorICogTm90ZTogYXJndW1lbnRzIG11c3QgbWF0Y2ggdGNwX3Jjdl9lc3RhYmxpc2hlZCgpIQorICovCitzdGF0aWMgaW50IGp0Y3BfcmN2X2VzdGFibGlzaGVkKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICAgICBzdHJ1Y3QgdGNwaGRyICp0aCwgdW5zaWduZWQgbGVuKQogewogCWNvbnN0IHN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOwogCWNvbnN0IHN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKIAotCWlmIChwb3J0ID09IDAgfHwgbnRvaHMoaW5ldC0+ZHBvcnQpID09IHBvcnQgfHwKLQkgICAgbnRvaHMoaW5ldC0+c3BvcnQpID09IHBvcnQpIHsKKwkvKiBPbmx5IHVwZGF0ZSBpZiBwb3J0IG1hdGNoZXMgKi8KKwlpZiAoKHBvcnQgPT0gMCB8fCBudG9ocyhpbmV0LT5kcG9ydCkgPT0gcG9ydCB8fCBudG9ocyhpbmV0LT5zcG9ydCkgPT0gcG9ydCkKKwkgICAgJiYgKGZ1bGwgfHwgdHAtPnNuZF9jd25kICE9IHRjcHcubGFzdGN3bmQpKSB7CiAJCXByaW50bCgiJWQuJWQuJWQuJWQ6JXUgJWQuJWQuJWQuJWQ6JXUgJWQgJSN4ICUjeCAldSAldSAldVxuIiwKIAkJICAgICAgIE5JUFFVQUQoaW5ldC0+c2FkZHIpLCBudG9ocyhpbmV0LT5zcG9ydCksCiAJCSAgICAgICBOSVBRVUFEKGluZXQtPmRhZGRyKSwgbnRvaHMoaW5ldC0+ZHBvcnQpLAotCQkgICAgICAgc2l6ZSwgdHAtPnNuZF9ueHQsIHRwLT5zbmRfdW5hLAorCQkgICAgICAgc2tiLT5sZW4sIHRwLT5zbmRfbnh0LCB0cC0+c25kX3VuYSwKIAkJICAgICAgIHRwLT5zbmRfY3duZCwgdGNwX2N1cnJlbnRfc3N0aHJlc2goc2spLAotCQkgICAgICAgdHAtPnNuZF93bmQpOworCQkgICAgICAgdHAtPnNuZF93bmQsIHRwLT5zcnR0ID4+IDMpOworCQl0Y3B3Lmxhc3Rjd25kID0gdHAtPnNuZF9jd25kOwogCX0KIAogCWpwcm9iZV9yZXR1cm4oKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBqcHJvYmUgdGNwX3NlbmRfcHJvYmUgPSB7CitzdGF0aWMgc3RydWN0IGpwcm9iZSB0Y3BfcHJvYmUgPSB7CiAJLmtwID0gewotCQkuc3ltYm9sX25hbWUJPSAidGNwX3NlbmRtc2ciLAorCQkuc3ltYm9sX25hbWUJPSAidGNwX3Jjdl9lc3RhYmxpc2hlZCIsCiAJfSwKLQkuZW50cnkJPSBKUFJPQkVfRU5UUlkoanRjcF9zZW5kbXNnKSwKKwkuZW50cnkJPSBKUFJPQkVfRU5UUlkoanRjcF9yY3ZfZXN0YWJsaXNoZWQpLAogfTsKIAogCiBzdGF0aWMgaW50IHRjcHByb2JlX29wZW4oc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBmaWxlICogZmlsZSkKIHsKIAlrZmlmb19yZXNldCh0Y3B3LmZpZm8pOwotCWRvX2dldHRpbWVvZmRheSgmdGNwdy50c3RhcnQpOworCXRjcHcuc3RhcnQgPSBrdGltZV9nZXQoKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTYyLDcgKzE3Miw3IEBACiAJaWYgKCFwcm9jX25ldF9mb3BzX2NyZWF0ZShwcm9jbmFtZSwgU19JUlVTUiwgJnRjcHByb2JlX2ZvcHMpKQogCQlnb3RvIGVycjA7CiAKLQlyZXQgPSByZWdpc3Rlcl9qcHJvYmUoJnRjcF9zZW5kX3Byb2JlKTsKKwlyZXQgPSByZWdpc3Rlcl9qcHJvYmUoJnRjcF9wcm9iZSk7CiAJaWYgKHJldCkKIAkJZ290byBlcnIxOwogCkBAIC0xODAsNyArMTkwLDcgQEAKIHsKIAlrZmlmb19mcmVlKHRjcHcuZmlmbyk7CiAJcHJvY19uZXRfcmVtb3ZlKHByb2NuYW1lKTsKLQl1bnJlZ2lzdGVyX2pwcm9iZSgmdGNwX3NlbmRfcHJvYmUpOworCXVucmVnaXN0ZXJfanByb2JlKCZ0Y3BfcHJvYmUpOwogCiB9CiBtb2R1bGVfZXhpdCh0Y3Bwcm9iZV9leGl0KTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3RjcF90aW1lci5jIGIvbmV0L2lwdjQvdGNwX3RpbWVyLmMKaW5kZXggYTkyNDNjZi4uMmNhOTdiMiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwX3RpbWVyLmMKKysrIGIvbmV0L2lwdjQvdGNwX3RpbWVyLmMKQEAgLTIzMyw3ICsyMzMsNyBAQAogCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOwogCWludCBtYXhfcHJvYmVzOwogCi0JaWYgKHRwLT5wYWNrZXRzX291dCB8fCAhc2stPnNrX3NlbmRfaGVhZCkgeworCWlmICh0cC0+cGFja2V0c19vdXQgfHwgIXRjcF9zZW5kX2hlYWQoc2spKSB7CiAJCWljc2stPmljc2tfcHJvYmVzX291dCA9IDA7CiAJCXJldHVybjsKIAl9CkBAIC0yODQsNyArMjg0LDcgQEAKIAlpZiAoIXRwLT5wYWNrZXRzX291dCkKIAkJZ290byBvdXQ7CiAKLQlCVUdfVFJBUCghc2tiX3F1ZXVlX2VtcHR5KCZzay0+c2tfd3JpdGVfcXVldWUpKTsKKwlCVUdfVFJBUCghdGNwX3dyaXRlX3F1ZXVlX2VtcHR5KHNrKSk7CiAKIAlpZiAoIXRwLT5zbmRfd25kICYmICFzb2NrX2ZsYWcoc2ssIFNPQ0tfREVBRCkgJiYKIAkgICAgISgoMSA8PCBzay0+c2tfc3RhdGUpICYgKFRDUEZfU1lOX1NFTlQgfCBUQ1BGX1NZTl9SRUNWKSkpIHsKQEAgLTMwNiw3ICszMDYsNyBAQAogCQkJZ290byBvdXQ7CiAJCX0KIAkJdGNwX2VudGVyX2xvc3Moc2ssIDApOwotCQl0Y3BfcmV0cmFuc21pdF9za2Ioc2ssIHNrYl9wZWVrKCZzay0+c2tfd3JpdGVfcXVldWUpKTsKKwkJdGNwX3JldHJhbnNtaXRfc2tiKHNrLCB0Y3Bfd3JpdGVfcXVldWVfaGVhZChzaykpOwogCQlfX3NrX2RzdF9yZXNldChzayk7CiAJCWdvdG8gb3V0X3Jlc2V0X3RpbWVyOwogCX0KQEAgLTM0MSw3ICszNDEsNyBAQAogCQl0Y3BfZW50ZXJfbG9zcyhzaywgMCk7CiAJfQogCi0JaWYgKHRjcF9yZXRyYW5zbWl0X3NrYihzaywgc2tiX3BlZWsoJnNrLT5za193cml0ZV9xdWV1ZSkpID4gMCkgeworCWlmICh0Y3BfcmV0cmFuc21pdF9za2Ioc2ssIHRjcF93cml0ZV9xdWV1ZV9oZWFkKHNrKSkgPiAwKSB7CiAJCS8qIFJldHJhbnNtaXNzaW9uIGZhaWxlZCBiZWNhdXNlIG9mIGxvY2FsIGNvbmdlc3Rpb24sCiAJCSAqIGRvIG5vdCBiYWNrb2ZmLgogCQkgKi8KQEAgLTQ4Miw3ICs0ODIsNyBAQAogCWVsYXBzZWQgPSBrZWVwYWxpdmVfdGltZV93aGVuKHRwKTsKIAogCS8qIEl0IGlzIGFsaXZlIHdpdGhvdXQga2VlcGFsaXZlIDgpICovCi0JaWYgKHRwLT5wYWNrZXRzX291dCB8fCBzay0+c2tfc2VuZF9oZWFkKQorCWlmICh0cC0+cGFja2V0c19vdXQgfHwgdGNwX3NlbmRfaGVhZChzaykpCiAJCWdvdG8gcmVzY2hlZDsKIAogCWVsYXBzZWQgPSB0Y3BfdGltZV9zdGFtcCAtIHRwLT5yY3ZfdHN0YW1wOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwX3ZlZ2FzLmMgYi9uZXQvaXB2NC90Y3BfdmVnYXMuYwppbmRleCA1YzQ4NGRjLi43M2UxOWNmIDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3BfdmVnYXMuYworKysgYi9uZXQvaXB2NC90Y3BfdmVnYXMuYwpAQCAtMzgsNiArMzgsOCBAQAogCiAjaW5jbHVkZSA8bmV0L3RjcC5oPgogCisjaW5jbHVkZSAidGNwX3ZlZ2FzLmgiCisKIC8qIERlZmF1bHQgdmFsdWVzIG9mIHRoZSBWZWdhcyB2YXJpYWJsZXMsIGluIGZpeGVkLXBvaW50IHJlcHJlc2VudGF0aW9uCiAgKiB3aXRoIFZfUEFSQU1fU0hJRlQgYml0cyB0byB0aGUgcmlnaHQgb2YgdGhlIGJpbmFyeSBwb2ludC4KICAqLwpAQCAtNTQsMTcgKzU2LDYgQEAKIE1PRFVMRV9QQVJNX0RFU0MoZ2FtbWEsICJsaW1pdCBvbiBpbmNyZWFzZSAoc2NhbGUgYnkgMikiKTsKIAogCi0vKiBWZWdhcyB2YXJpYWJsZXMgKi8KLXN0cnVjdCB2ZWdhcyB7Ci0JdTMyCWJlZ19zbmRfbnh0OwkvKiByaWdodCBlZGdlIGR1cmluZyBsYXN0IFJUVCAqLwotCXUzMgliZWdfc25kX3VuYTsJLyogbGVmdCBlZGdlICBkdXJpbmcgbGFzdCBSVFQgKi8KLQl1MzIJYmVnX3NuZF9jd25kOwkvKiBzYXZlcyB0aGUgc2l6ZSBvZiB0aGUgY3duZCAqLwotCXU4CWRvaW5nX3ZlZ2FzX25vdzsvKiBpZiB0cnVlLCBkbyB2ZWdhcyBmb3IgdGhpcyBSVFQgKi8KLQl1MTYJY250UlRUOwkJLyogIyBvZiBSVFRzIG1lYXN1cmVkIHdpdGhpbiBsYXN0IFJUVCAqLwotCXUzMgltaW5SVFQ7CQkvKiBtaW4gb2YgUlRUcyBtZWFzdXJlZCB3aXRoaW4gbGFzdCBSVFQgKGluIHVzZWMpICovCi0JdTMyCWJhc2VSVFQ7CS8qIHRoZSBtaW4gb2YgYWxsIFZlZ2FzIFJUVCBtZWFzdXJlbWVudHMgc2VlbiAoaW4gdXNlYykgKi8KLX07Ci0KIC8qIFRoZXJlIGFyZSBzZXZlcmFsIHNpdHVhdGlvbnMgd2hlbiB3ZSBtdXN0ICJyZS1zdGFydCIgVmVnYXM6CiAgKgogICogIG8gd2hlbiBhIGNvbm5lY3Rpb24gaXMgZXN0YWJsaXNoZWQKQEAgLTgxLDcgKzcyLDcgQEAKICAqIEluc3RlYWQgd2UgbXVzdCB3YWl0IHVudGlsIHRoZSBjb21wbGV0aW9uIG9mIGFuIFJUVCBkdXJpbmcKICAqIHdoaWNoIHdlIGFjdHVhbGx5IHJlY2VpdmUgQUNLcy4KICAqLwotc3RhdGljIGlubGluZSB2b2lkIHZlZ2FzX2VuYWJsZShzdHJ1Y3Qgc29jayAqc2spCitzdGF0aWMgdm9pZCB2ZWdhc19lbmFibGUoc3RydWN0IHNvY2sgKnNrKQogewogCWNvbnN0IHN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOwogCXN0cnVjdCB2ZWdhcyAqdmVnYXMgPSBpbmV0X2Nza19jYShzayk7CkBAIC0xMDQsMTMgKzk1LDE0IEBACiAJdmVnYXMtPmRvaW5nX3ZlZ2FzX25vdyA9IDA7CiB9CiAKLXN0YXRpYyB2b2lkIHRjcF92ZWdhc19pbml0KHN0cnVjdCBzb2NrICpzaykKK3ZvaWQgdGNwX3ZlZ2FzX2luaXQoc3RydWN0IHNvY2sgKnNrKQogewogCXN0cnVjdCB2ZWdhcyAqdmVnYXMgPSBpbmV0X2Nza19jYShzayk7CiAKIAl2ZWdhcy0+YmFzZVJUVCA9IDB4N2ZmZmZmZmY7CiAJdmVnYXNfZW5hYmxlKHNrKTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHRjcF92ZWdhc19pbml0KTsKIAogLyogRG8gUlRUIHNhbXBsaW5nIG5lZWRlZCBmb3IgVmVnYXMuCiAgKiBCYXNpY2FsbHkgd2U6CkBAIC0xMjAsMTAgKzExMiwxMyBAQAogICogICBvIG1pbi1maWx0ZXIgUlRUIHNhbXBsZXMgZnJvbSBhIG11Y2ggbG9uZ2VyIHdpbmRvdyAoZm9yZXZlciBmb3Igbm93KQogICogICAgIHRvIGZpbmQgdGhlIHByb3BhZ2F0aW9uIGRlbGF5IChiYXNlUlRUKQogICovCi1zdGF0aWMgdm9pZCB0Y3BfdmVnYXNfcnR0X2NhbGMoc3RydWN0IHNvY2sgKnNrLCB1MzIgdXNydHQpCit2b2lkIHRjcF92ZWdhc19wa3RzX2Fja2VkKHN0cnVjdCBzb2NrICpzaywgdTMyIGNudCwga3RpbWVfdCBsYXN0KQogewogCXN0cnVjdCB2ZWdhcyAqdmVnYXMgPSBpbmV0X2Nza19jYShzayk7Ci0JdTMyIHZydHQgPSB1c3J0dCArIDE7IC8qIE5ldmVyIGFsbG93IHplcm8gcnR0IG9yIGJhc2VSVFQgKi8KKwl1MzIgdnJ0dDsKKworCS8qIE5ldmVyIGFsbG93IHplcm8gcnR0IG9yIGJhc2VSVFQgKi8KKwl2cnR0ID0ga3RpbWVfdG9fdXMobmV0X3RpbWVkZWx0YShsYXN0KSkgKyAxOwogCiAJLyogRmlsdGVyIHRvIGZpbmQgcHJvcGFnYXRpb24gZGVsYXk6ICovCiAJaWYgKHZydHQgPCB2ZWdhcy0+YmFzZVJUVCkKQEAgLTEzNSw4ICsxMzAsOSBAQAogCXZlZ2FzLT5taW5SVFQgPSBtaW4odmVnYXMtPm1pblJUVCwgdnJ0dCk7CiAJdmVnYXMtPmNudFJUVCsrOwogfQorRVhQT1JUX1NZTUJPTF9HUEwodGNwX3ZlZ2FzX3BrdHNfYWNrZWQpOwogCi1zdGF0aWMgdm9pZCB0Y3BfdmVnYXNfc3RhdGUoc3RydWN0IHNvY2sgKnNrLCB1OCBjYV9zdGF0ZSkKK3ZvaWQgdGNwX3ZlZ2FzX3N0YXRlKHN0cnVjdCBzb2NrICpzaywgdTggY2Ffc3RhdGUpCiB7CiAKIAlpZiAoY2Ffc3RhdGUgPT0gVENQX0NBX09wZW4pCkBAIC0xNDQsNiArMTQwLDcgQEAKIAllbHNlCiAJCXZlZ2FzX2Rpc2FibGUoc2spOwogfQorRVhQT1JUX1NZTUJPTF9HUEwodGNwX3ZlZ2FzX3N0YXRlKTsKIAogLyoKICAqIElmIHRoZSBjb25uZWN0aW9uIGlzIGlkbGUgYW5kIHdlIGFyZSByZXN0YXJ0aW5nLApAQCAtMTU0LDEyICsxNTEsMTMgQEAKICAqIHBhY2tldHMsIF90aGVuXyB3ZSBjYW4gbWFrZSBWZWdhcyBjYWxjdWxhdGlvbnMKICAqIGFnYWluLgogICovCi1zdGF0aWMgdm9pZCB0Y3BfdmVnYXNfY3duZF9ldmVudChzdHJ1Y3Qgc29jayAqc2ssIGVudW0gdGNwX2NhX2V2ZW50IGV2ZW50KQordm9pZCB0Y3BfdmVnYXNfY3duZF9ldmVudChzdHJ1Y3Qgc29jayAqc2ssIGVudW0gdGNwX2NhX2V2ZW50IGV2ZW50KQogewogCWlmIChldmVudCA9PSBDQV9FVkVOVF9DV05EX1JFU1RBUlQgfHwKIAkgICAgZXZlbnQgPT0gQ0FfRVZFTlRfVFhfU1RBUlQpCiAJCXRjcF92ZWdhc19pbml0KHNrKTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHRjcF92ZWdhc19jd25kX2V2ZW50KTsKIAogc3RhdGljIHZvaWQgdGNwX3ZlZ2FzX2NvbmdfYXZvaWQoc3RydWN0IHNvY2sgKnNrLCB1MzIgYWNrLAogCQkJCSB1MzIgc2VxX3J0dCwgdTMyIGluX2ZsaWdodCwgaW50IGZsYWcpCkBAIC0zMzYsMzAgKzMzNCwyOSBAQAogfQogCiAvKiBFeHRyYWN0IGluZm8gZm9yIFRjcCBzb2NrZXQgaW5mbyBwcm92aWRlZCB2aWEgbmV0bGluay4gKi8KLXN0YXRpYyB2b2lkIHRjcF92ZWdhc19nZXRfaW5mbyhzdHJ1Y3Qgc29jayAqc2ssIHUzMiBleHQsCi0JCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3ZvaWQgdGNwX3ZlZ2FzX2dldF9pbmZvKHN0cnVjdCBzb2NrICpzaywgdTMyIGV4dCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAljb25zdCBzdHJ1Y3QgdmVnYXMgKmNhID0gaW5ldF9jc2tfY2Eoc2spOwogCWlmIChleHQgJiAoMSA8PCAoSU5FVF9ESUFHX1ZFR0FTSU5GTyAtIDEpKSkgewotCQlzdHJ1Y3QgdGNwdmVnYXNfaW5mbyAqaW5mbzsKKwkJc3RydWN0IHRjcHZlZ2FzX2luZm8gaW5mbyA9IHsKKwkJCS50Y3B2X2VuYWJsZWQgPSBjYS0+ZG9pbmdfdmVnYXNfbm93LAorCQkJLnRjcHZfcnR0Y250ID0gY2EtPmNudFJUVCwKKwkJCS50Y3B2X3J0dCA9IGNhLT5iYXNlUlRULAorCQkJLnRjcHZfbWlucnR0ID0gY2EtPm1pblJUVCwKKwkJfTsKIAotCQlpbmZvID0gUlRBX0RBVEEoX19SVEFfUFVUKHNrYiwgSU5FVF9ESUFHX1ZFR0FTSU5GTywKLQkJCQkJICBzaXplb2YoKmluZm8pKSk7Ci0KLQkJaW5mby0+dGNwdl9lbmFibGVkID0gY2EtPmRvaW5nX3ZlZ2FzX25vdzsKLQkJaW5mby0+dGNwdl9ydHRjbnQgPSBjYS0+Y250UlRUOwotCQlpbmZvLT50Y3B2X3J0dCA9IGNhLT5iYXNlUlRUOwotCQlpbmZvLT50Y3B2X21pbnJ0dCA9IGNhLT5taW5SVFQ7Ci0JcnRhdHRyX2ZhaWx1cmU6CTsKKwkJbmxhX3B1dChza2IsIElORVRfRElBR19WRUdBU0lORk8sIHNpemVvZihpbmZvKSwgJmluZm8pOwogCX0KIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHRjcF92ZWdhc19nZXRfaW5mbyk7CiAKIHN0YXRpYyBzdHJ1Y3QgdGNwX2Nvbmdlc3Rpb25fb3BzIHRjcF92ZWdhcyA9IHsKKwkuZmxhZ3MJCT0gVENQX0NPTkdfUlRUX1NUQU1QLAogCS5pbml0CQk9IHRjcF92ZWdhc19pbml0LAogCS5zc3RocmVzaAk9IHRjcF9yZW5vX3NzdGhyZXNoLAogCS5jb25nX2F2b2lkCT0gdGNwX3ZlZ2FzX2NvbmdfYXZvaWQsCiAJLm1pbl9jd25kCT0gdGNwX3Jlbm9fbWluX2N3bmQsCi0JLnJ0dF9zYW1wbGUJPSB0Y3BfdmVnYXNfcnR0X2NhbGMsCisJLnBrdHNfYWNrZWQJPSB0Y3BfdmVnYXNfcGt0c19hY2tlZCwKIAkuc2V0X3N0YXRlCT0gdGNwX3ZlZ2FzX3N0YXRlLAogCS5jd25kX2V2ZW50CT0gdGNwX3ZlZ2FzX2N3bmRfZXZlbnQsCiAJLmdldF9pbmZvCT0gdGNwX3ZlZ2FzX2dldF9pbmZvLApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwX3ZlZ2FzLmggYi9uZXQvaXB2NC90Y3BfdmVnYXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDJmYTgxCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjQvdGNwX3ZlZ2FzLmgKQEAgLTAsMCArMSwyNCBAQAorLyoKKyAqIFRDUCBWZWdhcyBjb25nZXN0aW9uIGNvbnRyb2wgaW50ZXJmYWNlCisgKi8KKyNpZm5kZWYgX19UQ1BfVkVHQVNfSAorI2RlZmluZSBfX1RDUF9WRUdBU19IIDEKKworLyogVmVnYXMgdmFyaWFibGVzICovCitzdHJ1Y3QgdmVnYXMgeworCXUzMgliZWdfc25kX254dDsJLyogcmlnaHQgZWRnZSBkdXJpbmcgbGFzdCBSVFQgKi8KKwl1MzIJYmVnX3NuZF91bmE7CS8qIGxlZnQgZWRnZSAgZHVyaW5nIGxhc3QgUlRUICovCisJdTMyCWJlZ19zbmRfY3duZDsJLyogc2F2ZXMgdGhlIHNpemUgb2YgdGhlIGN3bmQgKi8KKwl1OAlkb2luZ192ZWdhc19ub3c7LyogaWYgdHJ1ZSwgZG8gdmVnYXMgZm9yIHRoaXMgUlRUICovCisJdTE2CWNudFJUVDsJCS8qICMgb2YgUlRUcyBtZWFzdXJlZCB3aXRoaW4gbGFzdCBSVFQgKi8KKwl1MzIJbWluUlRUOwkJLyogbWluIG9mIFJUVHMgbWVhc3VyZWQgd2l0aGluIGxhc3QgUlRUIChpbiB1c2VjKSAqLworCXUzMgliYXNlUlRUOwkvKiB0aGUgbWluIG9mIGFsbCBWZWdhcyBSVFQgbWVhc3VyZW1lbnRzIHNlZW4gKGluIHVzZWMpICovCit9OworCitleHRlcm4gdm9pZCB0Y3BfdmVnYXNfaW5pdChzdHJ1Y3Qgc29jayAqc2spOworZXh0ZXJuIHZvaWQgdGNwX3ZlZ2FzX3N0YXRlKHN0cnVjdCBzb2NrICpzaywgdTggY2Ffc3RhdGUpOworZXh0ZXJuIHZvaWQgdGNwX3ZlZ2FzX3BrdHNfYWNrZWQoc3RydWN0IHNvY2sgKnNrLCB1MzIgY250LCBrdGltZV90IGxhc3QpOworZXh0ZXJuIHZvaWQgdGNwX3ZlZ2FzX2N3bmRfZXZlbnQoc3RydWN0IHNvY2sgKnNrLCBlbnVtIHRjcF9jYV9ldmVudCBldmVudCk7CitleHRlcm4gdm9pZCB0Y3BfdmVnYXNfZ2V0X2luZm8oc3RydWN0IHNvY2sgKnNrLCB1MzIgZXh0LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKKworI2VuZGlmCS8qIF9fVENQX1ZFR0FTX0ggKi8KZGlmZiAtLWdpdCBhL25ldC9pcHY0L3RjcF92ZW5vLmMgYi9uZXQvaXB2NC90Y3BfdmVuby5jCmluZGV4IGNlNTdiZjMuLjllZGIzNDAgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3RjcF92ZW5vLmMKKysrIGIvbmV0L2lwdjQvdGNwX3Zlbm8uYwpAQCAtNjksMTAgKzY5LDEzIEBACiB9CiAKIC8qIERvIHJ0dCBzYW1wbGluZyBuZWVkZWQgZm9yIFZlbm8uICovCi1zdGF0aWMgdm9pZCB0Y3BfdmVub19ydHRfY2FsYyhzdHJ1Y3Qgc29jayAqc2ssIHUzMiB1c3J0dCkKK3N0YXRpYyB2b2lkIHRjcF92ZW5vX3BrdHNfYWNrZWQoc3RydWN0IHNvY2sgKnNrLCB1MzIgY250LCBrdGltZV90IGxhc3QpCiB7CiAJc3RydWN0IHZlbm8gKnZlbm8gPSBpbmV0X2Nza19jYShzayk7Ci0JdTMyIHZydHQgPSB1c3J0dCArIDE7CS8qIE5ldmVyIGFsbG93IHplcm8gcnR0IG9yIGJhc2VydHQgKi8KKwl1MzIgdnJ0dDsKKworCS8qIE5ldmVyIGFsbG93IHplcm8gcnR0IG9yIGJhc2VSVFQgKi8KKwl2cnR0ID0ga3RpbWVfdG9fdXMobmV0X3RpbWVkZWx0YShsYXN0KSkgKyAxOwogCiAJLyogRmlsdGVyIHRvIGZpbmQgcHJvcGFnYXRpb24gZGVsYXk6ICovCiAJaWYgKHZydHQgPCB2ZW5vLT5iYXNlcnR0KQpAQCAtMTk5LDEwICsyMDIsMTEgQEAKIH0KIAogc3RhdGljIHN0cnVjdCB0Y3BfY29uZ2VzdGlvbl9vcHMgdGNwX3Zlbm8gPSB7CisJLmZsYWdzCQk9IFRDUF9DT05HX1JUVF9TVEFNUCwKIAkuaW5pdAkJPSB0Y3BfdmVub19pbml0LAogCS5zc3RocmVzaAk9IHRjcF92ZW5vX3NzdGhyZXNoLAogCS5jb25nX2F2b2lkCT0gdGNwX3Zlbm9fY29uZ19hdm9pZCwKLQkucnR0X3NhbXBsZQk9IHRjcF92ZW5vX3J0dF9jYWxjLAorCS5wa3RzX2Fja2VkCT0gdGNwX3Zlbm9fcGt0c19hY2tlZCwKIAkuc2V0X3N0YXRlCT0gdGNwX3Zlbm9fc3RhdGUsCiAJLmN3bmRfZXZlbnQJPSB0Y3BfdmVub19jd25kX2V2ZW50LAogCmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3Bfd2VzdHdvb2QuYyBiL25ldC9pcHY0L3RjcF93ZXN0d29vZC5jCmluZGV4IDRlMWI2MTAuLmU2MWUwOWQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3RjcF93ZXN0d29vZC5jCisrKyBiL25ldC9pcHY0L3RjcF93ZXN0d29vZC5jCkBAIC0xMDAsNyArMTAwLDcgQEAKICAqIENhbGxlZCBhZnRlciBwcm9jZXNzaW5nIGdyb3VwIG9mIHBhY2tldHMuCiAgKiBidXQgYWxsIHdlc3R3b29kIG5lZWRzIGlzIHRoZSBsYXN0IHNhbXBsZSBvZiBzcnR0LgogICovCi1zdGF0aWMgdm9pZCB0Y3Bfd2VzdHdvb2RfcGt0c19hY2tlZChzdHJ1Y3Qgc29jayAqc2ssIHUzMiBjbnQpCitzdGF0aWMgdm9pZCB0Y3Bfd2VzdHdvb2RfcGt0c19hY2tlZChzdHJ1Y3Qgc29jayAqc2ssIHUzMiBjbnQsIGt0aW1lX3QgbGFzdCkKIHsKIAlzdHJ1Y3Qgd2VzdHdvb2QgKncgPSBpbmV0X2Nza19jYShzayk7CiAJaWYgKGNudCA+IDApCkBAIC0yMjYsNyArMjI2LDcgQEAKIAlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKIAlzdHJ1Y3Qgd2VzdHdvb2QgKncgPSBpbmV0X2Nza19jYShzayk7CiAKLQlzd2l0Y2goZXZlbnQpIHsKKwlzd2l0Y2ggKGV2ZW50KSB7CiAJY2FzZSBDQV9FVkVOVF9GQVNUX0FDSzoKIAkJd2VzdHdvb2RfZmFzdF9idyhzayk7CiAJCWJyZWFrOwpAQCAtMjYwLDE2ICsyNjAsMTMgQEAKIHsKIAljb25zdCBzdHJ1Y3Qgd2VzdHdvb2QgKmNhID0gaW5ldF9jc2tfY2Eoc2spOwogCWlmIChleHQgJiAoMSA8PCAoSU5FVF9ESUFHX1ZFR0FTSU5GTyAtIDEpKSkgewotCQlzdHJ1Y3QgcnRhdHRyICpydGE7Ci0JCXN0cnVjdCB0Y3B2ZWdhc19pbmZvICppbmZvOworCQlzdHJ1Y3QgdGNwdmVnYXNfaW5mbyBpbmZvID0geworCQkJLnRjcHZfZW5hYmxlZCA9IDEsCisJCQkudGNwdl9ydHQgPSBqaWZmaWVzX3RvX3VzZWNzKGNhLT5ydHQpLAorCQkJLnRjcHZfbWlucnR0ID0gamlmZmllc190b191c2VjcyhjYS0+cnR0X21pbiksCisJCX07CiAKLQkJcnRhID0gX19SVEFfUFVUKHNrYiwgSU5FVF9ESUFHX1ZFR0FTSU5GTywgc2l6ZW9mKCppbmZvKSk7Ci0JCWluZm8gPSBSVEFfREFUQShydGEpOwotCQlpbmZvLT50Y3B2X2VuYWJsZWQgPSAxOwotCQlpbmZvLT50Y3B2X3J0dGNudCA9IDA7Ci0JCWluZm8tPnRjcHZfcnR0ID0gamlmZmllc190b191c2VjcyhjYS0+cnR0KTsKLQkJaW5mby0+dGNwdl9taW5ydHQgPSBqaWZmaWVzX3RvX3VzZWNzKGNhLT5ydHRfbWluKTsKLQlydGF0dHJfZmFpbHVyZToJOworCQlubGFfcHV0KHNrYiwgSU5FVF9ESUFHX1ZFR0FTSU5GTywgc2l6ZW9mKGluZm8pLCAmaW5mbyk7CiAJfQogfQogCmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3BfeWVhaC5jIGIvbmV0L2lwdjQvdGNwX3llYWguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDVlZDIzCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjQvdGNwX3llYWguYwpAQCAtMCwwICsxLDI2OCBAQAorLyoKKyAqCisgKiAgIFllQUggVENQCisgKgorICogRm9yIGZ1cnRoZXIgZGV0YWlscyBsb29rIGF0OgorICogICAgaHR0cDovL3dpbC5jcy5jYWx0ZWNoLmVkdS9wZmxkbmV0MjAwNy9wYXBlci9ZZUFIX1RDUC5wZGYKKyAqCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXRfZGlhZy5oPgorCisjaW5jbHVkZSA8bmV0L3RjcC5oPgorCisjaW5jbHVkZSAidGNwX3ZlZ2FzLmgiCisKKyNkZWZpbmUgVENQX1lFQUhfQUxQSEEgICAgICAgODAgLy9saW4gbnVtYmVyIG9mIHBhY2tldHMgcXVldWVkIGF0IHRoZSBib3R0bGVuZWNrCisjZGVmaW5lIFRDUF9ZRUFIX0dBTU1BICAgICAgICAxIC8vbGluIGZyYWN0aW9uIG9mIHF1ZXVlIHRvIGJlIHJlbW92ZWQgcGVyIHJ0dAorI2RlZmluZSBUQ1BfWUVBSF9ERUxUQSAgICAgICAgMyAvL2xvZyBtaW5pbXVtIGZyYWN0aW9uIG9mIGN3bmQgdG8gYmUgcmVtb3ZlZCBvbiBsb3NzCisjZGVmaW5lIFRDUF9ZRUFIX0VQU0lMT04gICAgICAxIC8vbG9nIG1heGltdW0gZnJhY3Rpb24gdG8gYmUgcmVtb3ZlZCBvbiBlYXJseSBkZWNvbmdlc3Rpb24KKyNkZWZpbmUgVENQX1lFQUhfUEhZICAgICAgICAgIDggLy9saW4gbWF4aW11bSBkZWx0YSBmcm9tIGJhc2UKKyNkZWZpbmUgVENQX1lFQUhfUkhPICAgICAgICAgMTYgLy9saW4gbWludW11bSBudW1iZXIgb2YgY29uc2VjdXRpdmUgcnR0IHRvIGNvbnNpZGVyIGNvbXBldGl0aW9uIG9uIGxvc3MKKyNkZWZpbmUgVENQX1lFQUhfWkVUQSAgICAgICAgNTAgLy9saW4gbWluaW11bSBudW1iZXIgb2Ygc3RhdGUgc3dpdGNocyB0byByZXNldCByZW5vX2NvdW50CisKKyNkZWZpbmUgVENQX1NDQUxBQkxFX0FJX0NOVAkgMTAwVQorCisvKiBZZUFIIHZhcmlhYmxlcyAqLworc3RydWN0IHllYWggeworCXN0cnVjdCB2ZWdhcyB2ZWdhczsJLyogbXVzdCBiZSBmaXJzdCAqLworCisJLyogWWVBSCAqLworCXUzMiBsYXN0UTsKKwl1MzIgZG9pbmdfcmVub19ub3c7CisKKwl1MzIgcmVub19jb3VudDsKKwl1MzIgZmFzdF9jb3VudDsKKworCXUzMiBwa3RzX2Fja2VkOworfTsKKworc3RhdGljIHZvaWQgdGNwX3llYWhfaW5pdChzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisJc3RydWN0IHllYWggKnllYWggPSBpbmV0X2Nza19jYShzayk7CisKKwl0Y3BfdmVnYXNfaW5pdChzayk7CisKKwl5ZWFoLT5kb2luZ19yZW5vX25vdyA9IDA7CisJeWVhaC0+bGFzdFEgPSAwOworCisJeWVhaC0+cmVub19jb3VudCA9IDI7CisKKwkvKiBFbnN1cmUgdGhlIE1EIGFyaXRobWV0aWMgd29ya3MuICBUaGlzIGlzIHNvbWV3aGF0IHBlZGFudGljLAorCSAqIHNpbmNlIEkgZG9uJ3QgdGhpbmsgd2Ugd2lsbCBzZWUgYSBjd25kIHRoaXMgbGFyZ2UuIDopICovCisJdHAtPnNuZF9jd25kX2NsYW1wID0gbWluX3QodTMyLCB0cC0+c25kX2N3bmRfY2xhbXAsIDB4ZmZmZmZmZmYvMTI4KTsKKworfQorCisKK3N0YXRpYyB2b2lkIHRjcF95ZWFoX3BrdHNfYWNrZWQoc3RydWN0IHNvY2sgKnNrLCB1MzIgcGt0c19hY2tlZCwga3RpbWVfdCBsYXN0KQoreworCWNvbnN0IHN0cnVjdCBpbmV0X2Nvbm5lY3Rpb25fc29jayAqaWNzayA9IGluZXRfY3NrKHNrKTsKKwlzdHJ1Y3QgeWVhaCAqeWVhaCA9IGluZXRfY3NrX2NhKHNrKTsKKworCWlmIChpY3NrLT5pY3NrX2NhX3N0YXRlID09IFRDUF9DQV9PcGVuKQorCQl5ZWFoLT5wa3RzX2Fja2VkID0gcGt0c19hY2tlZDsKKworCXRjcF92ZWdhc19wa3RzX2Fja2VkKHNrLCBwa3RzX2Fja2VkLCBsYXN0KTsKK30KKworc3RhdGljIHZvaWQgdGNwX3llYWhfY29uZ19hdm9pZChzdHJ1Y3Qgc29jayAqc2ssIHUzMiBhY2ssCisJCQkJdTMyIHNlcV9ydHQsIHUzMiBpbl9mbGlnaHQsIGludCBmbGFnKQoreworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCXN0cnVjdCB5ZWFoICp5ZWFoID0gaW5ldF9jc2tfY2Eoc2spOworCisJaWYgKCF0Y3BfaXNfY3duZF9saW1pdGVkKHNrLCBpbl9mbGlnaHQpKQorCQlyZXR1cm47CisKKwlpZiAodHAtPnNuZF9jd25kIDw9IHRwLT5zbmRfc3N0aHJlc2gpCisJCXRjcF9zbG93X3N0YXJ0KHRwKTsKKworCWVsc2UgaWYgKCF5ZWFoLT5kb2luZ19yZW5vX25vdykgeworCQkvKiBTY2FsYWJsZSAqLworCisJCXRwLT5zbmRfY3duZF9jbnQrPXllYWgtPnBrdHNfYWNrZWQ7CisJCWlmICh0cC0+c25kX2N3bmRfY250ID4gbWluKHRwLT5zbmRfY3duZCwgVENQX1NDQUxBQkxFX0FJX0NOVCkpeworCQkJaWYgKHRwLT5zbmRfY3duZCA8IHRwLT5zbmRfY3duZF9jbGFtcCkKKwkJCQl0cC0+c25kX2N3bmQrKzsKKwkJCXRwLT5zbmRfY3duZF9jbnQgPSAwOworCQl9CisKKwkJeWVhaC0+cGt0c19hY2tlZCA9IDE7CisKKwl9IGVsc2UgeworCQkvKiBSZW5vICovCisKKwkJaWYgKHRwLT5zbmRfY3duZF9jbnQgPCB0cC0+c25kX2N3bmQpCisJCQl0cC0+c25kX2N3bmRfY250Kys7CisKKwkJaWYgKHRwLT5zbmRfY3duZF9jbnQgPj0gdHAtPnNuZF9jd25kKSB7CisJCQl0cC0+c25kX2N3bmQrKzsKKwkJCXRwLT5zbmRfY3duZF9jbnQgPSAwOworCQl9CisJfQorCisJLyogVGhlIGtleSBwbGF5ZXJzIGFyZSB2X3ZlZ2FzLmJlZ19zbmRfdW5hIGFuZCB2X2JlZ19zbmRfbnh0LgorCSAqCisJICogVGhlc2UgYXJlIHNvIG5hbWVkIGJlY2F1c2UgdGhleSByZXByZXNlbnQgdGhlIGFwcHJveGltYXRlIHZhbHVlcworCSAqIG9mIHNuZF91bmEgYW5kIHNuZF9ueHQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgY3VycmVudCBSVFQuIE1vcmUKKwkgKiBwcmVjaXNlbHksIHRoZXkgcmVwcmVzZW50IHRoZSBhbW91bnQgb2YgZGF0YSBzZW50IGR1cmluZyB0aGUgUlRULgorCSAqIEF0IHRoZSBlbmQgb2YgdGhlIFJUVCwgd2hlbiB3ZSByZWNlaXZlIGFuIEFDSyBmb3Igdl9iZWdfc25kX254dCwKKwkgKiB3ZSB3aWxsIGNhbGN1bGF0ZSB0aGF0ICh2X2JlZ19zbmRfbnh0IC0gdl92ZWdhcy5iZWdfc25kX3VuYSkgb3V0c3RhbmRpbmcKKwkgKiBieXRlcyBvZiBkYXRhIGhhdmUgYmVlbiBBQ0tlZCBkdXJpbmcgdGhlIGNvdXJzZSBvZiB0aGUgUlRULCBnaXZpbmcKKwkgKiBhbiAiYWN0dWFsIiByYXRlIG9mOgorCSAqCisJICogICAgICh2X2JlZ19zbmRfbnh0IC0gdl92ZWdhcy5iZWdfc25kX3VuYSkgLyAocnR0IGR1cmF0aW9uKQorCSAqCisJICogVW5mb3J0dW5hdGVseSwgdl92ZWdhcy5iZWdfc25kX3VuYSBpcyBub3QgZXhhY3RseSBlcXVhbCB0byBzbmRfdW5hLAorCSAqIGJlY2F1c2UgZGVsYXllZCBBQ0tzIGNhbiBjb3ZlciBtb3JlIHRoYW4gb25lIHNlZ21lbnQsIHNvIHRoZXkKKwkgKiBkb24ndCBsaW5lIHVwIHllYWhseSB3aXRoIHRoZSBib3VuZGFyaWVzIG9mIFJUVHMuCisJICoKKwkgKiBBbm90aGVyIHVuZm9ydHVuYXRlIGZhY3Qgb2YgbGlmZSBpcyB0aGF0IGRlbGF5ZWQgQUNLcyBkZWxheSB0aGUKKwkgKiBhZHZhbmNlIG9mIHRoZSBsZWZ0IGVkZ2Ugb2Ygb3VyIHNlbmQgd2luZG93LCBzbyB0aGF0IHRoZSBudW1iZXIKKwkgKiBvZiBieXRlcyB3ZSBzZW5kIGluIGFuIFJUVCBpcyBvZnRlbiBsZXNzIHRoYW4gb3VyIGN3bmQgd2lsbCBhbGxvdy4KKwkgKiBTbyB3ZSBrZWVwIHRyYWNrIG9mIG91ciBjd25kIHNlcGFyYXRlbHksIGluIHZfYmVnX3NuZF9jd25kLgorCSAqLworCisJaWYgKGFmdGVyKGFjaywgeWVhaC0+dmVnYXMuYmVnX3NuZF9ueHQpKSB7CisKKwkJLyogV2UgZG8gdGhlIFZlZ2FzIGNhbGN1bGF0aW9ucyBvbmx5IGlmIHdlIGdvdCBlbm91Z2ggUlRUCisJCSAqIHNhbXBsZXMgdGhhdCB3ZSBjYW4gYmUgcmVhc29uYWJseSBzdXJlIHRoYXQgd2UgZ290CisJCSAqIGF0IGxlYXN0IG9uZSBSVFQgc2FtcGxlIHRoYXQgd2Fzbid0IGZyb20gYSBkZWxheWVkIEFDSy4KKwkJICogSWYgd2Ugb25seSBoYWQgMiBzYW1wbGVzIHRvdGFsLAorCQkgKiB0aGVuIHRoYXQgbWVhbnMgd2UncmUgZ2V0dGluZyBvbmx5IDEgQUNLIHBlciBSVFQsIHdoaWNoCisJCSAqIG1lYW5zIHRoZXkncmUgYWxtb3N0IGNlcnRhaW5seSBkZWxheWVkIEFDS3MuCisJCSAqIElmICB3ZSBoYXZlIDMgc2FtcGxlcywgd2Ugc2hvdWxkIGJlIE9LLgorCQkgKi8KKworCQlpZiAoeWVhaC0+dmVnYXMuY250UlRUID4gMikgeworCQkJdTMyIHJ0dCwgcXVldWU7CisJCQl1NjQgYnc7CisKKwkJCS8qIFdlIGhhdmUgZW5vdWdoIFJUVCBzYW1wbGVzLCBzbywgdXNpbmcgdGhlIFZlZ2FzCisJCQkgKiBhbGdvcml0aG0sIHdlIGRldGVybWluZSBpZiB3ZSBzaG91bGQgaW5jcmVhc2Ugb3IKKwkJCSAqIGRlY3JlYXNlIGN3bmQsIGFuZCBieSBob3cgbXVjaC4KKwkJCSAqLworCisJCQkvKiBQbHVjayBvdXQgdGhlIFJUVCB3ZSBhcmUgdXNpbmcgZm9yIHRoZSBWZWdhcworCQkJICogY2FsY3VsYXRpb25zLiBUaGlzIGlzIHRoZSBtaW4gUlRUIHNlZW4gZHVyaW5nIHRoZQorCQkJICogbGFzdCBSVFQuIFRha2luZyB0aGUgbWluIGZpbHRlcnMgb3V0IHRoZSBlZmZlY3RzCisJCQkgKiBvZiBkZWxheWVkIEFDS3MsIGF0IHRoZSBjb3N0IG9mIG5vdGljaW5nIGNvbmdlc3Rpb24KKwkJCSAqIGEgYml0IGxhdGVyLgorCQkJICovCisJCQlydHQgPSB5ZWFoLT52ZWdhcy5taW5SVFQ7CisKKwkJCS8qIENvbXB1dGUgZXhjZXNzIG51bWJlciBvZiBwYWNrZXRzIGFib3ZlIGJhbmR3aWR0aAorCQkJICogQXZvaWQgZG9pbmcgZnVsbCA2NCBiaXQgZGl2aWRlLgorCQkJICovCisJCQlidyA9IHRwLT5zbmRfY3duZDsKKwkJCWJ3ICo9IHJ0dCAtIHllYWgtPnZlZ2FzLmJhc2VSVFQ7CisJCQlkb19kaXYoYncsIHJ0dCk7CisJCQlxdWV1ZSA9IGJ3OworCisJCQlpZiAocXVldWUgPiBUQ1BfWUVBSF9BTFBIQSB8fAorCQkJICAgIHJ0dCAtIHllYWgtPnZlZ2FzLmJhc2VSVFQgPiAoeWVhaC0+dmVnYXMuYmFzZVJUVCAvIFRDUF9ZRUFIX1BIWSkpIHsKKwkJCQlpZiAocXVldWUgPiBUQ1BfWUVBSF9BTFBIQQorCQkJCSAgICAmJiB0cC0+c25kX2N3bmQgPiB5ZWFoLT5yZW5vX2NvdW50KSB7CisJCQkJCXUzMiByZWR1Y3Rpb24gPSBtaW4ocXVldWUgLyBUQ1BfWUVBSF9HQU1NQSAsCisJCQkJCQkJICAgIHRwLT5zbmRfY3duZCA+PiBUQ1BfWUVBSF9FUFNJTE9OKTsKKworCQkJCQl0cC0+c25kX2N3bmQgLT0gcmVkdWN0aW9uOworCisJCQkJCXRwLT5zbmRfY3duZCA9IG1heCh0cC0+c25kX2N3bmQsCisJCQkJCQkJICAgeWVhaC0+cmVub19jb3VudCk7CisKKwkJCQkJdHAtPnNuZF9zc3RocmVzaCA9IHRwLT5zbmRfY3duZDsKKwkJCQl9CisKKwkJCQlpZiAoeWVhaC0+cmVub19jb3VudCA8PSAyKQorCQkJCQl5ZWFoLT5yZW5vX2NvdW50ID0gbWF4KHRwLT5zbmRfY3duZD4+MSwgMlUpOworCQkJCWVsc2UKKwkJCQkJeWVhaC0+cmVub19jb3VudCsrOworCisJCQkJeWVhaC0+ZG9pbmdfcmVub19ub3cgPSBtaW4oeWVhaC0+ZG9pbmdfcmVub19ub3cgKyAxLAorCQkJCQkJCSAgIDB4ZmZmZmZmVSk7CisJCQl9IGVsc2UgeworCQkJCXllYWgtPmZhc3RfY291bnQrKzsKKworCQkJCWlmICh5ZWFoLT5mYXN0X2NvdW50ID4gVENQX1lFQUhfWkVUQSkgeworCQkJCQl5ZWFoLT5yZW5vX2NvdW50ID0gMjsKKwkJCQkJeWVhaC0+ZmFzdF9jb3VudCA9IDA7CisJCQkJfQorCisJCQkJeWVhaC0+ZG9pbmdfcmVub19ub3cgPSAwOworCQkJfQorCisJCQl5ZWFoLT5sYXN0USA9IHF1ZXVlOworCisJCX0KKworCQkvKiBTYXZlIHRoZSBleHRlbnQgb2YgdGhlIGN1cnJlbnQgd2luZG93IHNvIHdlIGNhbiB1c2UgdGhpcworCQkgKiBhdCB0aGUgZW5kIG9mIHRoZSBuZXh0IFJUVC4KKwkJICovCisJCXllYWgtPnZlZ2FzLmJlZ19zbmRfdW5hICA9IHllYWgtPnZlZ2FzLmJlZ19zbmRfbnh0OworCQl5ZWFoLT52ZWdhcy5iZWdfc25kX254dCAgPSB0cC0+c25kX254dDsKKwkJeWVhaC0+dmVnYXMuYmVnX3NuZF9jd25kID0gdHAtPnNuZF9jd25kOworCisJCS8qIFdpcGUgdGhlIHNsYXRlIGNsZWFuIGZvciB0aGUgbmV4dCBSVFQuICovCisJCXllYWgtPnZlZ2FzLmNudFJUVCA9IDA7CisJCXllYWgtPnZlZ2FzLm1pblJUVCA9IDB4N2ZmZmZmZmY7CisJfQorfQorCitzdGF0aWMgdTMyIHRjcF95ZWFoX3NzdGhyZXNoKHN0cnVjdCBzb2NrICpzaykgeworCWNvbnN0IHN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCXN0cnVjdCB5ZWFoICp5ZWFoID0gaW5ldF9jc2tfY2Eoc2spOworCXUzMiByZWR1Y3Rpb247CisKKwlpZiAoeWVhaC0+ZG9pbmdfcmVub19ub3cgPCBUQ1BfWUVBSF9SSE8pIHsKKwkJcmVkdWN0aW9uID0geWVhaC0+bGFzdFE7CisKKwkJcmVkdWN0aW9uID0gbWluKCByZWR1Y3Rpb24sIG1heCh0cC0+c25kX2N3bmQ+PjEsIDJVKSApOworCisJCXJlZHVjdGlvbiA9IG1heCggcmVkdWN0aW9uLCB0cC0+c25kX2N3bmQgPj4gVENQX1lFQUhfREVMVEEpOworCX0gZWxzZQorCQlyZWR1Y3Rpb24gPSBtYXgodHAtPnNuZF9jd25kPj4xLDJVKTsKKworCXllYWgtPmZhc3RfY291bnQgPSAwOworCXllYWgtPnJlbm9fY291bnQgPSBtYXgoeWVhaC0+cmVub19jb3VudD4+MSwgMlUpOworCisJcmV0dXJuIHRwLT5zbmRfY3duZCAtIHJlZHVjdGlvbjsKK30KKworc3RhdGljIHN0cnVjdCB0Y3BfY29uZ2VzdGlvbl9vcHMgdGNwX3llYWggPSB7CisJLmZsYWdzCQk9IFRDUF9DT05HX1JUVF9TVEFNUCwKKwkuaW5pdAkJPSB0Y3BfeWVhaF9pbml0LAorCS5zc3RocmVzaAk9IHRjcF95ZWFoX3NzdGhyZXNoLAorCS5jb25nX2F2b2lkCT0gdGNwX3llYWhfY29uZ19hdm9pZCwKKwkubWluX2N3bmQJPSB0Y3BfcmVub19taW5fY3duZCwKKwkuc2V0X3N0YXRlCT0gdGNwX3ZlZ2FzX3N0YXRlLAorCS5jd25kX2V2ZW50CT0gdGNwX3ZlZ2FzX2N3bmRfZXZlbnQsCisJLmdldF9pbmZvCT0gdGNwX3ZlZ2FzX2dldF9pbmZvLAorCS5wa3RzX2Fja2VkCT0gdGNwX3llYWhfcGt0c19hY2tlZCwKKworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAieWVhaCIsCit9OworCitzdGF0aWMgaW50IF9faW5pdCB0Y3BfeWVhaF9yZWdpc3Rlcih2b2lkKQoreworCUJVR19PTihzaXplb2Yoc3RydWN0IHllYWgpID4gSUNTS19DQV9QUklWX1NJWkUpOworCXRjcF9yZWdpc3Rlcl9jb25nZXN0aW9uX2NvbnRyb2woJnRjcF95ZWFoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHRjcF95ZWFoX3VucmVnaXN0ZXIodm9pZCkKK3sKKwl0Y3BfdW5yZWdpc3Rlcl9jb25nZXN0aW9uX2NvbnRyb2woJnRjcF95ZWFoKTsKK30KKworbW9kdWxlX2luaXQodGNwX3llYWhfcmVnaXN0ZXIpOworbW9kdWxlX2V4aXQodGNwX3llYWhfdW5yZWdpc3Rlcik7CisKK01PRFVMRV9BVVRIT1IoIkFuZ2VsbyBQLiBDYXN0ZWxsYW5pIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlllQUggVENQIik7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3BfeWVhaC5oIGIvbmV0L2lwdjQvdGNwX3llYWguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDNiNzE5Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjQvdGNwX3llYWguaApAQCAtMCwwICsxLDcgQEAKKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXRfZGlhZy5oPgorI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgorCisjaW5jbHVkZSA8bmV0L3RjcC5oPgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdWRwLmMgYi9uZXQvaXB2NC91ZHAuYwppbmRleCBmYzYyMGE3Li4xMTNlMGM0IDEwMDY0NAotLS0gYS9uZXQvaXB2NC91ZHAuYworKysgYi9uZXQvaXB2NC91ZHAuYwpAQCAtMTE0LDE0ICsxMTQsMzMgQEAKIAogc3RhdGljIGludCB1ZHBfcG9ydF9yb3ZlcjsKIAotc3RhdGljIGlubGluZSBpbnQgX191ZHBfbGliX2xwb3J0X2ludXNlKF9fdTE2IG51bSwgc3RydWN0IGhsaXN0X2hlYWQgdWRwdGFibGVbXSkKKy8qCisgKiBOb3RlIGFib3V0IHRoaXMgaGFzaCBmdW5jdGlvbiA6CisgKiBUeXBpY2FsIHVzZSBpcyBwcm9iYWJseSBkYWRkciA9IDAsIG9ubHkgZHBvcnQgaXMgZ29pbmcgdG8gdmFyeSBoYXNoCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGhhc2hfcG9ydF9hbmRfYWRkcihfX3UxNiBwb3J0LCBfX2JlMzIgYWRkcikKK3sKKwlhZGRyIF49IGFkZHIgPj4gMTY7CisJYWRkciBePSBhZGRyID4+IDg7CisJcmV0dXJuIHBvcnQgXiBhZGRyOworfQorCitzdGF0aWMgaW5saW5lIGludCBfX3VkcF9saWJfcG9ydF9pbnVzZSh1bnNpZ25lZCBpbnQgaGFzaCwgaW50IHBvcnQsCisJX19iZTMyIGRhZGRyLCBzdHJ1Y3QgaGxpc3RfaGVhZCB1ZHB0YWJsZVtdKQogewogCXN0cnVjdCBzb2NrICpzazsKIAlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKKwlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0OwogCi0Jc2tfZm9yX2VhY2goc2ssIG5vZGUsICZ1ZHB0YWJsZVtudW0gJiAoVURQX0hUQUJMRV9TSVpFIC0gMSldKQotCQlpZiAoc2stPnNrX2hhc2ggPT0gbnVtKQorCXNrX2Zvcl9lYWNoKHNrLCBub2RlLCAmdWRwdGFibGVbaGFzaCAmIChVRFBfSFRBQkxFX1NJWkUgLSAxKV0pIHsKKwkJaWYgKHNrLT5za19oYXNoICE9IGhhc2gpCisJCQljb250aW51ZTsKKwkJaW5ldCA9IGluZXRfc2soc2spOworCQlpZiAoaW5ldC0+bnVtICE9IHBvcnQpCisJCQljb250aW51ZTsKKwkJaWYgKGluZXQtPnJjdl9zYWRkciA9PSBkYWRkcikKIAkJCXJldHVybiAxOworCX0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMTQyLDYgKzE2MSw3IEBACiAJc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7CiAJc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQ7CiAJc3RydWN0IHNvY2sgKnNrMjsKKwl1bnNpZ25lZCBpbnQgaGFzaDsKIAlpbnQgICAgZXJyb3IgPSAxOwogCiAJd3JpdGVfbG9ja19iaCgmdWRwX2hhc2hfbG9jayk7CkBAIC0xNTYsNyArMTc2LDkgQEAKIAkJZm9yIChpID0gMDsgaSA8IFVEUF9IVEFCTEVfU0laRTsgaSsrLCByZXN1bHQrKykgewogCQkJaW50IHNpemU7CiAKLQkJCWhlYWQgPSAmdWRwdGFibGVbcmVzdWx0ICYgKFVEUF9IVEFCTEVfU0laRSAtIDEpXTsKKwkJCWhhc2ggPSBoYXNoX3BvcnRfYW5kX2FkZHIocmVzdWx0LAorCQkJCQlpbmV0X3NrKHNrKS0+cmN2X3NhZGRyKTsKKwkJCWhlYWQgPSAmdWRwdGFibGVbaGFzaCAmIChVRFBfSFRBQkxFX1NJWkUgLSAxKV07CiAJCQlpZiAoaGxpc3RfZW1wdHkoaGVhZCkpIHsKIAkJCQlpZiAocmVzdWx0ID4gc3lzY3RsX2xvY2FsX3BvcnRfcmFuZ2VbMV0pCiAJCQkJCXJlc3VsdCA9IHN5c2N0bF9sb2NhbF9wb3J0X3JhbmdlWzBdICsKQEAgLTE3NSwxMiArMTk3LDIzIEBACiAJCQk7CiAJCX0KIAkJcmVzdWx0ID0gYmVzdDsKLQkJZm9yKGkgPSAwOyBpIDwgKDEgPDwgMTYpIC8gVURQX0hUQUJMRV9TSVpFOyBpKyssIHJlc3VsdCArPSBVRFBfSFRBQkxFX1NJWkUpIHsKKwkJZm9yIChpID0gMDsgaSA8ICgxIDw8IDE2KSAvIFVEUF9IVEFCTEVfU0laRTsKKwkJICAgICBpKyssIHJlc3VsdCArPSBVRFBfSFRBQkxFX1NJWkUpIHsKIAkJCWlmIChyZXN1bHQgPiBzeXNjdGxfbG9jYWxfcG9ydF9yYW5nZVsxXSkKIAkJCQlyZXN1bHQgPSBzeXNjdGxfbG9jYWxfcG9ydF9yYW5nZVswXQogCQkJCQkrICgocmVzdWx0IC0gc3lzY3RsX2xvY2FsX3BvcnRfcmFuZ2VbMF0pICYKIAkJCQkJICAgKFVEUF9IVEFCTEVfU0laRSAtIDEpKTsKLQkJCWlmICghIF9fdWRwX2xpYl9scG9ydF9pbnVzZShyZXN1bHQsIHVkcHRhYmxlKSkKKwkJCWhhc2ggPSBoYXNoX3BvcnRfYW5kX2FkZHIocmVzdWx0LCAwKTsKKwkJCWlmIChfX3VkcF9saWJfcG9ydF9pbnVzZShoYXNoLCByZXN1bHQsCisJCQkJCQkgMCwgdWRwdGFibGUpKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKCFpbmV0X3NrKHNrKS0+cmN2X3NhZGRyKQorCQkJCWJyZWFrOworCisJCQloYXNoID0gaGFzaF9wb3J0X2FuZF9hZGRyKHJlc3VsdCwKKwkJCQkJaW5ldF9zayhzayktPnJjdl9zYWRkcik7CisJCQlpZiAoISBfX3VkcF9saWJfcG9ydF9pbnVzZShoYXNoLCByZXN1bHQsCisJCQkJaW5ldF9zayhzayktPnJjdl9zYWRkciwgdWRwdGFibGUpKQogCQkJCWJyZWFrOwogCQl9CiAJCWlmIChpID49ICgxIDw8IDE2KSAvIFVEUF9IVEFCTEVfU0laRSkKQEAgLTE4OCwyMSArMjIxLDQxIEBACiBnb3RpdDoKIAkJKnBvcnRfcm92ZXIgPSBzbnVtID0gcmVzdWx0OwogCX0gZWxzZSB7Ci0JCWhlYWQgPSAmdWRwdGFibGVbc251bSAmIChVRFBfSFRBQkxFX1NJWkUgLSAxKV07CisJCWhhc2ggPSBoYXNoX3BvcnRfYW5kX2FkZHIoc251bSwgMCk7CisJCWhlYWQgPSAmdWRwdGFibGVbaGFzaCAmIChVRFBfSFRBQkxFX1NJWkUgLSAxKV07CiAKIAkJc2tfZm9yX2VhY2goc2syLCBub2RlLCBoZWFkKQotCQkJaWYgKHNrMi0+c2tfaGFzaCA9PSBzbnVtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotCQkJICAgIHNrMiAhPSBzayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotCQkJICAgICghc2syLT5za19yZXVzZSAgICAgICAgfHwgIXNrLT5za19yZXVzZSkgICAgICAgICAmJgotCQkJICAgICghc2syLT5za19ib3VuZF9kZXZfaWYgfHwgIXNrLT5za19ib3VuZF9kZXZfaWYKLQkJCSAgICAgfHwgc2syLT5za19ib3VuZF9kZXZfaWYgPT0gc2stPnNrX2JvdW5kX2Rldl9pZikgJiYKLQkJCSAgICAoKnNhZGRyX2NvbXApKHNrLCBzazIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisJCQlpZiAoc2syLT5za19oYXNoID09IGhhc2ggJiYKKwkJCSAgICBzazIgIT0gc2sgJiYKKwkJCSAgICBpbmV0X3NrKHNrMiktPm51bSA9PSBzbnVtICYmCisJCQkgICAgKCFzazItPnNrX3JldXNlIHx8ICFzay0+c2tfcmV1c2UpICYmCisJCQkgICAgKCFzazItPnNrX2JvdW5kX2Rldl9pZiB8fCAhc2stPnNrX2JvdW5kX2Rldl9pZiB8fAorCQkJICAgICBzazItPnNrX2JvdW5kX2Rldl9pZiA9PSBzay0+c2tfYm91bmRfZGV2X2lmKSAmJgorCQkJICAgICgqc2FkZHJfY29tcCkoc2ssIHNrMikpCiAJCQkJZ290byBmYWlsOworCisJCWlmIChpbmV0X3NrKHNrKS0+cmN2X3NhZGRyKSB7CisJCQloYXNoID0gaGFzaF9wb3J0X2FuZF9hZGRyKHNudW0sCisJCQkJCQkgIGluZXRfc2soc2spLT5yY3Zfc2FkZHIpOworCQkJaGVhZCA9ICZ1ZHB0YWJsZVtoYXNoICYgKFVEUF9IVEFCTEVfU0laRSAtIDEpXTsKKworCQkJc2tfZm9yX2VhY2goc2syLCBub2RlLCBoZWFkKQorCQkJCWlmIChzazItPnNrX2hhc2ggPT0gaGFzaCAmJgorCQkJCSAgICBzazIgIT0gc2sgJiYKKwkJCQkgICAgaW5ldF9zayhzazIpLT5udW0gPT0gc251bSAmJgorCQkJCSAgICAoIXNrMi0+c2tfcmV1c2UgfHwgIXNrLT5za19yZXVzZSkgJiYKKwkJCQkgICAgKCFzazItPnNrX2JvdW5kX2Rldl9pZiB8fAorCQkJCSAgICAgIXNrLT5za19ib3VuZF9kZXZfaWYgfHwKKwkJCQkgICAgIHNrMi0+c2tfYm91bmRfZGV2X2lmID09CisJCQkJICAgICBzay0+c2tfYm91bmRfZGV2X2lmKSAmJgorCQkJCSAgICAoKnNhZGRyX2NvbXApKHNrLCBzazIpKQorCQkJCQlnb3RvIGZhaWw7CisJCX0KIAl9CiAJaW5ldF9zayhzayktPm51bSA9IHNudW07Ci0Jc2stPnNrX2hhc2ggPSBzbnVtOworCXNrLT5za19oYXNoID0gaGFzaDsKIAlpZiAoc2tfdW5oYXNoZWQoc2spKSB7Ci0JCWhlYWQgPSAmdWRwdGFibGVbc251bSAmIChVRFBfSFRBQkxFX1NJWkUgLSAxKV07CisJCWhlYWQgPSAmdWRwdGFibGVbaGFzaCAmIChVRFBfSFRBQkxFX1NJWkUgLSAxKV07CiAJCXNrX2FkZF9ub2RlKHNrLCBoZWFkKTsKIAkJc29ja19wcm90X2luY191c2Uoc2stPnNrX3Byb3QpOwogCX0KQEAgLTIxMiwxMyArMjY1LDEzIEBACiAJcmV0dXJuIGVycm9yOwogfQogCi1fX2lubGluZV9fIGludCB1ZHBfZ2V0X3BvcnQoc3RydWN0IHNvY2sgKnNrLCB1bnNpZ25lZCBzaG9ydCBzbnVtLAoraW50IHVkcF9nZXRfcG9ydChzdHJ1Y3Qgc29jayAqc2ssIHVuc2lnbmVkIHNob3J0IHNudW0sCiAJCQlpbnQgKCpzY21wKShjb25zdCBzdHJ1Y3Qgc29jayAqLCBjb25zdCBzdHJ1Y3Qgc29jayAqKSkKIHsKIAlyZXR1cm4gIF9fdWRwX2xpYl9nZXRfcG9ydChzaywgc251bSwgdWRwX2hhc2gsICZ1ZHBfcG9ydF9yb3Zlciwgc2NtcCk7CiB9CiAKLWlubGluZSBpbnQgaXB2NF9yY3Zfc2FkZHJfZXF1YWwoY29uc3Qgc3RydWN0IHNvY2sgKnNrMSwgY29uc3Qgc3RydWN0IHNvY2sgKnNrMikKK2ludCBpcHY0X3Jjdl9zYWRkcl9lcXVhbChjb25zdCBzdHJ1Y3Qgc29jayAqc2sxLCBjb25zdCBzdHJ1Y3Qgc29jayAqc2syKQogewogCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQxID0gaW5ldF9zayhzazEpLCAqaW5ldDIgPSBpbmV0X3NrKHNrMik7CiAKQEAgLTI0MSw2MyArMjk0LDc3IEBACiB7CiAJc3RydWN0IHNvY2sgKnNrLCAqcmVzdWx0ID0gTlVMTDsKIAlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKLQl1bnNpZ25lZCBzaG9ydCBobnVtID0gbnRvaHMoZHBvcnQpOwotCWludCBiYWRuZXNzID0gLTE7CisJdW5zaWduZWQgaW50IGhhc2gsIGhhc2h3aWxkOworCWludCBzY29yZSwgYmVzdCA9IC0xLCBocG9ydCA9IG50b2hzKGRwb3J0KTsKKworIAloYXNoID0gaGFzaF9wb3J0X2FuZF9hZGRyKGhwb3J0LCBkYWRkcik7CisgCWhhc2h3aWxkID0gaGFzaF9wb3J0X2FuZF9hZGRyKGhwb3J0LCAwKTsKIAogCXJlYWRfbG9jaygmdWRwX2hhc2hfbG9jayk7Ci0Jc2tfZm9yX2VhY2goc2ssIG5vZGUsICZ1ZHB0YWJsZVtobnVtICYgKFVEUF9IVEFCTEVfU0laRSAtIDEpXSkgeworCitsb29rdXA6CisKKwlza19mb3JfZWFjaChzaywgbm9kZSwgJnVkcHRhYmxlW2hhc2ggJiAoVURQX0hUQUJMRV9TSVpFIC0gMSldKSB7CiAJCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKIAotCQlpZiAoc2stPnNrX2hhc2ggPT0gaG51bSAmJiAhaXB2Nl9vbmx5X3NvY2soc2spKSB7Ci0JCQlpbnQgc2NvcmUgPSAoc2stPnNrX2ZhbWlseSA9PSBQRl9JTkVUID8gMSA6IDApOwotCQkJaWYgKGluZXQtPnJjdl9zYWRkcikgewotCQkJCWlmIChpbmV0LT5yY3Zfc2FkZHIgIT0gZGFkZHIpCi0JCQkJCWNvbnRpbnVlOwotCQkJCXNjb3JlKz0yOwotCQkJfQotCQkJaWYgKGluZXQtPmRhZGRyKSB7Ci0JCQkJaWYgKGluZXQtPmRhZGRyICE9IHNhZGRyKQotCQkJCQljb250aW51ZTsKLQkJCQlzY29yZSs9MjsKLQkJCX0KLQkJCWlmIChpbmV0LT5kcG9ydCkgewotCQkJCWlmIChpbmV0LT5kcG9ydCAhPSBzcG9ydCkKLQkJCQkJY29udGludWU7Ci0JCQkJc2NvcmUrPTI7Ci0JCQl9Ci0JCQlpZiAoc2stPnNrX2JvdW5kX2Rldl9pZikgewotCQkJCWlmIChzay0+c2tfYm91bmRfZGV2X2lmICE9IGRpZikKLQkJCQkJY29udGludWU7Ci0JCQkJc2NvcmUrPTI7Ci0JCQl9Ci0JCQlpZihzY29yZSA9PSA5KSB7Ci0JCQkJcmVzdWx0ID0gc2s7Ci0JCQkJYnJlYWs7Ci0JCQl9IGVsc2UgaWYoc2NvcmUgPiBiYWRuZXNzKSB7Ci0JCQkJcmVzdWx0ID0gc2s7Ci0JCQkJYmFkbmVzcyA9IHNjb3JlOwotCQkJfQorCQlpZiAoc2stPnNrX2hhc2ggIT0gaGFzaCB8fCBpcHY2X29ubHlfc29jayhzaykgfHwKKwkJCWluZXQtPm51bSAhPSBocG9ydCkKKwkJCWNvbnRpbnVlOworCisJCXNjb3JlID0gKHNrLT5za19mYW1pbHkgPT0gUEZfSU5FVCA/IDEgOiAwKTsKKwkJaWYgKGluZXQtPnJjdl9zYWRkcikgeworCQkJaWYgKGluZXQtPnJjdl9zYWRkciAhPSBkYWRkcikKKwkJCQljb250aW51ZTsKKwkJCXNjb3JlKz0yOworCQl9CisJCWlmIChpbmV0LT5kYWRkcikgeworCQkJaWYgKGluZXQtPmRhZGRyICE9IHNhZGRyKQorCQkJCWNvbnRpbnVlOworCQkJc2NvcmUrPTI7CisJCX0KKwkJaWYgKGluZXQtPmRwb3J0KSB7CisJCQlpZiAoaW5ldC0+ZHBvcnQgIT0gc3BvcnQpCisJCQkJY29udGludWU7CisJCQlzY29yZSs9MjsKKwkJfQorCQlpZiAoc2stPnNrX2JvdW5kX2Rldl9pZikgeworCQkJaWYgKHNrLT5za19ib3VuZF9kZXZfaWYgIT0gZGlmKQorCQkJCWNvbnRpbnVlOworCQkJc2NvcmUrPTI7CisJCX0KKwkJaWYgKHNjb3JlID09IDkpIHsKKwkJCXJlc3VsdCA9IHNrOworCQkJZ290byBmb3VuZDsKKwkJfSBlbHNlIGlmIChzY29yZSA+IGJlc3QpIHsKKwkJCXJlc3VsdCA9IHNrOworCQkJYmVzdCA9IHNjb3JlOwogCQl9CiAJfQorCisJaWYgKGhhc2ggIT0gaGFzaHdpbGQpIHsKKwkJaGFzaCA9IGhhc2h3aWxkOworCQlnb3RvIGxvb2t1cDsKKwl9Citmb3VuZDoKIAlpZiAocmVzdWx0KQogCQlzb2NrX2hvbGQocmVzdWx0KTsKIAlyZWFkX3VubG9jaygmdWRwX2hhc2hfbG9jayk7CiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotc3RhdGljIGlubGluZSBzdHJ1Y3Qgc29jayAqdWRwX3Y0X21jYXN0X25leHQoc3RydWN0IHNvY2sgKnNrLAotCQkJCQkgICAgIF9fYmUxNiBsb2NfcG9ydCwgX19iZTMyIGxvY19hZGRyLAorc3RhdGljIGlubGluZSBzdHJ1Y3Qgc29jayAqdWRwX3Y0X21jYXN0X25leHQoc3RydWN0IHNvY2sgKnNrLCB1bnNpZ25lZCBpbnQgaG51bSwKKwkJCQkJICAgICBpbnQgaHBvcnQsIF9fYmUzMiBsb2NfYWRkciwKIAkJCQkJICAgICBfX2JlMTYgcm10X3BvcnQsIF9fYmUzMiBybXRfYWRkciwKIAkJCQkJICAgICBpbnQgZGlmKQogewogCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOwogCXN0cnVjdCBzb2NrICpzID0gc2s7Ci0JdW5zaWduZWQgc2hvcnQgaG51bSA9IG50b2hzKGxvY19wb3J0KTsKIAogCXNrX2Zvcl9lYWNoX2Zyb20ocywgbm9kZSkgewogCQlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0ID0gaW5ldF9zayhzKTsKIAogCQlpZiAocy0+c2tfaGFzaCAhPSBobnVtCQkJCQl8fAorCQkgICAgaW5ldC0+bnVtICE9IGhwb3J0CQkJCQl8fAogCQkgICAgKGluZXQtPmRhZGRyICYmIGluZXQtPmRhZGRyICE9IHJtdF9hZGRyKQkJfHwKIAkJICAgIChpbmV0LT5kcG9ydCAhPSBybXRfcG9ydCAmJiBpbmV0LT5kcG9ydCkJCXx8CiAJCSAgICAoaW5ldC0+cmN2X3NhZGRyICYmIGluZXQtPnJjdl9zYWRkciAhPSBsb2NfYWRkcikJfHwKQEAgLTMyOSw4ICszOTYsOCBAQAogCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQ7CiAJc3RydWN0IGlwaGRyICppcGggPSAoc3RydWN0IGlwaGRyKilza2ItPmRhdGE7CiAJc3RydWN0IHVkcGhkciAqdWggPSAoc3RydWN0IHVkcGhkciopKHNrYi0+ZGF0YSsoaXBoLT5paGw8PDIpKTsKLQlpbnQgdHlwZSA9IHNrYi0+aC5pY21waC0+dHlwZTsKLQlpbnQgY29kZSA9IHNrYi0+aC5pY21waC0+Y29kZTsKKwljb25zdCBpbnQgdHlwZSA9IGljbXBfaGRyKHNrYiktPnR5cGU7CisJY29uc3QgaW50IGNvZGUgPSBpY21wX2hkcihza2IpLT5jb2RlOwogCXN0cnVjdCBzb2NrICpzazsKIAlpbnQgaGFyZGVycjsKIAlpbnQgZXJyOwpAQCAtMzkwLDcgKzQ1Nyw3IEBACiAJc29ja19wdXQoc2spOwogfQogCi1fX2lubGluZV9fIHZvaWQgdWRwX2VycihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgaW5mbykKK3ZvaWQgdWRwX2VycihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgaW5mbykKIHsKIAlyZXR1cm4gX191ZHA0X2xpYl9lcnIoc2tiLCBpbmZvLCB1ZHBfaGFzaCk7CiB9CkBAIC00MTksMTMgKzQ4NiwxNCBAQAogCQkJCSBfX2JlMzIgc3JjLCBfX2JlMzIgZHN0LCBpbnQgbGVuICAgICAgKQogewogCXVuc2lnbmVkIGludCBvZmZzZXQ7Ci0Jc3RydWN0IHVkcGhkciAqdWggPSBza2ItPmgudWg7CisJc3RydWN0IHVkcGhkciAqdWggPSB1ZHBfaGRyKHNrYik7CiAJX193c3VtIGNzdW0gPSAwOwogCiAJaWYgKHNrYl9xdWV1ZV9sZW4oJnNrLT5za193cml0ZV9xdWV1ZSkgPT0gMSkgewogCQkvKgogCQkgKiBPbmx5IG9uZSBmcmFnbWVudCBvbiB0aGUgc29ja2V0LgogCQkgKi8KKwkJc2tiLT5jc3VtX3N0YXJ0ID0gc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKSAtIHNrYi0+aGVhZDsKIAkJc2tiLT5jc3VtX29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCB1ZHBoZHIsIGNoZWNrKTsKIAkJdWgtPmNoZWNrID0gfmNzdW1fdGNwdWRwX21hZ2ljKHNyYywgZHN0LCBsZW4sIElQUFJPVE9fVURQLCAwKTsKIAl9IGVsc2UgewpAQCAtNDM0LDcgKzUwMiw3IEBACiAJCSAqIGZyYWdtZW50cyBvbiB0aGUgc29ja2V0IHNvIHRoYXQgYWxsIGNzdW1zIG9mIHNrX2J1ZmZzCiAJCSAqIHNob3VsZCBiZSB0b2dldGhlcgogCQkgKi8KLQkJb2Zmc2V0ID0gc2tiLT5oLnJhdyAtIHNrYi0+ZGF0YTsKKwkJb2Zmc2V0ID0gc2tiX3RyYW5zcG9ydF9vZmZzZXQoc2tiKTsKIAkJc2tiLT5jc3VtID0gc2tiX2NoZWNrc3VtKHNrYiwgb2Zmc2V0LCBza2ItPmxlbiAtIG9mZnNldCwgMCk7CiAKIAkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOwpAQCAtNDY5LDcgKzUzNyw3IEBACiAJLyoKIAkgKiBDcmVhdGUgYSBVRFAgaGVhZGVyCiAJICovCi0JdWggPSBza2ItPmgudWg7CisJdWggPSB1ZHBfaGRyKHNrYik7CiAJdWgtPnNvdXJjZSA9IGZsLT5mbF9pcF9zcG9ydDsKIAl1aC0+ZGVzdCA9IGZsLT5mbF9pcF9kcG9ydDsKIAl1aC0+bGVuID0gaHRvbnModXAtPmxlbik7CkBAIC03NjUsMzggKzgzMywzOCBAQAogCiBpbnQgdWRwX2lvY3RsKHN0cnVjdCBzb2NrICpzaywgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0Jc3dpdGNoKGNtZCkKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU0lPQ09VVFE6CiAJewotCQljYXNlIFNJT0NPVVRROgotCQl7Ci0JCQlpbnQgYW1vdW50ID0gYXRvbWljX3JlYWQoJnNrLT5za193bWVtX2FsbG9jKTsKLQkJCXJldHVybiBwdXRfdXNlcihhbW91bnQsIChpbnQgX191c2VyICopYXJnKTsKLQkJfQotCi0JCWNhc2UgU0lPQ0lOUToKLQkJewotCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQkJCXVuc2lnbmVkIGxvbmcgYW1vdW50OwotCi0JCQlhbW91bnQgPSAwOwotCQkJc3Bpbl9sb2NrX2JoKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZS5sb2NrKTsKLQkJCXNrYiA9IHNrYl9wZWVrKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSk7Ci0JCQlpZiAoc2tiICE9IE5VTEwpIHsKLQkJCQkvKgotCQkJCSAqIFdlIHdpbGwgb25seSByZXR1cm4gdGhlIGFtb3VudAotCQkJCSAqIG9mIHRoaXMgcGFja2V0IHNpbmNlIHRoYXQgaXMgYWxsCi0JCQkJICogdGhhdCB3aWxsIGJlIHJlYWQuCi0JCQkJICovCi0JCQkJYW1vdW50ID0gc2tiLT5sZW4gLSBzaXplb2Yoc3RydWN0IHVkcGhkcik7Ci0JCQl9Ci0JCQlzcGluX3VubG9ja19iaCgmc2stPnNrX3JlY2VpdmVfcXVldWUubG9jayk7Ci0JCQlyZXR1cm4gcHV0X3VzZXIoYW1vdW50LCAoaW50IF9fdXNlciAqKWFyZyk7Ci0JCX0KLQotCQlkZWZhdWx0OgotCQkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKwkJaW50IGFtb3VudCA9IGF0b21pY19yZWFkKCZzay0+c2tfd21lbV9hbGxvYyk7CisJCXJldHVybiBwdXRfdXNlcihhbW91bnQsIChpbnQgX191c2VyICopYXJnKTsKIAl9Ci0JcmV0dXJuKDApOworCisJY2FzZSBTSU9DSU5ROgorCXsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkJdW5zaWduZWQgbG9uZyBhbW91bnQ7CisKKwkJYW1vdW50ID0gMDsKKwkJc3Bpbl9sb2NrX2JoKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZS5sb2NrKTsKKwkJc2tiID0gc2tiX3BlZWsoJnNrLT5za19yZWNlaXZlX3F1ZXVlKTsKKwkJaWYgKHNrYiAhPSBOVUxMKSB7CisJCQkvKgorCQkJICogV2Ugd2lsbCBvbmx5IHJldHVybiB0aGUgYW1vdW50CisJCQkgKiBvZiB0aGlzIHBhY2tldCBzaW5jZSB0aGF0IGlzIGFsbAorCQkJICogdGhhdCB3aWxsIGJlIHJlYWQuCisJCQkgKi8KKwkJCWFtb3VudCA9IHNrYi0+bGVuIC0gc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpOworCQl9CisJCXNwaW5fdW5sb2NrX2JoKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZS5sb2NrKTsKKwkJcmV0dXJuIHB1dF91c2VyKGFtb3VudCwgKGludCBfX3VzZXIgKilhcmcpOworCX0KKworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PSU9DVExDTUQ7CisJfQorCisJcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC04MTAsNyArODc4LDkgQEAKIAlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0ID0gaW5ldF9zayhzayk7CiAJc3RydWN0IHNvY2thZGRyX2luICpzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luICopbXNnLT5tc2dfbmFtZTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCWludCBjb3BpZWQsIGVyciwgY29weV9vbmx5LCBpc191ZHBsaXRlID0gSVNfVURQTElURShzayk7CisJdW5zaWduZWQgaW50IHVsZW4sIGNvcGllZDsKKwlpbnQgZXJyOworCWludCBpc191ZHBsaXRlID0gSVNfVURQTElURShzayk7CiAKIAkvKgogCSAqCUNoZWNrIGFueSBwYXNzZWQgYWRkcmVzc2VzCkBAIC04MjYsMjggKzg5NiwyNSBAQAogCWlmICghc2tiKQogCQlnb3RvIG91dDsKIAotCWNvcGllZCA9IHNrYi0+bGVuIC0gc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpOwotCWlmIChjb3BpZWQgPiBsZW4pIHsKLQkJY29waWVkID0gbGVuOworCXVsZW4gPSBza2ItPmxlbiAtIHNpemVvZihzdHJ1Y3QgdWRwaGRyKTsKKwljb3BpZWQgPSBsZW47CisJaWYgKGNvcGllZCA+IHVsZW4pCisJCWNvcGllZCA9IHVsZW47CisJZWxzZSBpZiAoY29waWVkIDwgdWxlbikKIAkJbXNnLT5tc2dfZmxhZ3MgfD0gTVNHX1RSVU5DOwotCX0KIAogCS8qCi0JICogCURlY2lkZSB3aGV0aGVyIHRvIGNoZWNrc3VtIGFuZC9vciBjb3B5IGRhdGEuCi0JICoKLQkgKiAJVURQOiAgICAgIGNoZWNrc3VtIG1heSBoYXZlIGJlZW4gY29tcHV0ZWQgaW4gSFcsCi0JICogCSAgICAgICAgICAocmUtKWNvbXB1dGUgaXQgaWYgbWVzc2FnZSBpcyB0cnVuY2F0ZWQuCi0JICogCVVEUC1MaXRlOiBhbHdheXMgbmVlZHMgdG8gY2hlY2tzdW0sIG5vIEhXIHN1cHBvcnQuCisJICogSWYgY2hlY2tzdW0gaXMgbmVlZGVkIGF0IGFsbCwgdHJ5IHRvIGRvIGl0IHdoaWxlIGNvcHlpbmcgdGhlCisJICogZGF0YS4gIElmIHRoZSBkYXRhIGlzIHRydW5jYXRlZCwgb3IgaWYgd2Ugb25seSB3YW50IGEgcGFydGlhbAorCSAqIGNvdmVyYWdlIGNoZWNrc3VtIChVRFAtTGl0ZSksIGRvIGl0IGJlZm9yZSB0aGUgY29weS4KIAkgKi8KLQljb3B5X29ubHkgPSAoc2tiLT5pcF9zdW1tZWQ9PUNIRUNLU1VNX1VOTkVDRVNTQVJZKTsKIAotCWlmIChpc191ZHBsaXRlICB8fCAgKCFjb3B5X29ubHkgICYmICBtc2ctPm1zZ19mbGFncyZNU0dfVFJVTkMpKSB7Ci0JCWlmIChfX3VkcF9saWJfY2hlY2tzdW1fY29tcGxldGUoc2tiKSkKKwlpZiAoY29waWVkIDwgdWxlbiB8fCBVRFBfU0tCX0NCKHNrYiktPnBhcnRpYWxfY292KSB7CisJCWlmICh1ZHBfbGliX2NoZWNrc3VtX2NvbXBsZXRlKHNrYikpCiAJCQlnb3RvIGNzdW1fY29weV9lcnI7Ci0JCWNvcHlfb25seSA9IDE7CiAJfQogCi0JaWYgKGNvcHlfb25seSkKKwlpZiAoc2tiX2NzdW1fdW5uZWNlc3Nhcnkoc2tiKSkKIAkJZXJyID0gc2tiX2NvcHlfZGF0YWdyYW1faW92ZWMoc2tiLCBzaXplb2Yoc3RydWN0IHVkcGhkciksCiAJCQkJCSAgICAgIG1zZy0+bXNnX2lvdiwgY29waWVkICAgICAgICk7CiAJZWxzZSB7CkBAIC04NjYsOCArOTMzLDggQEAKIAlpZiAoc2luKQogCXsKIAkJc2luLT5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKLQkJc2luLT5zaW5fcG9ydCA9IHNrYi0+aC51aC0+c291cmNlOwotCQlzaW4tPnNpbl9hZGRyLnNfYWRkciA9IHNrYi0+bmguaXBoLT5zYWRkcjsKKwkJc2luLT5zaW5fcG9ydCA9IHVkcF9oZHIoc2tiKS0+c291cmNlOworCQlzaW4tPnNpbl9hZGRyLnNfYWRkciA9IGlwX2hkcihza2IpLT5zYWRkcjsKIAkJbWVtc2V0KHNpbi0+c2luX3plcm8sIDAsIHNpemVvZihzaW4tPnNpbl96ZXJvKSk7CiAJfQogCWlmIChpbmV0LT5jbXNnX2ZsYWdzKQpAQCAtODc1LDcgKzk0Miw3IEBACiAKIAllcnIgPSBjb3BpZWQ7CiAJaWYgKGZsYWdzICYgTVNHX1RSVU5DKQotCQllcnIgPSBza2ItPmxlbiAtIHNpemVvZihzdHJ1Y3QgdWRwaGRyKTsKKwkJZXJyID0gdWxlbjsKIAogb3V0X2ZyZWU6CiAJc2tiX2ZyZWVfZGF0YWdyYW0oc2ssIHNrYik7CkBAIC05NDksNyArMTAxNiw3IEBACiAJCXJldHVybiAxOwogCiAJLyogTm93IHdlIGNhbiBnZXQgdGhlIHBvaW50ZXJzICovCi0JdWggPSBza2ItPmgudWg7CisJdWggPSB1ZHBfaGRyKHNrYik7CiAJdWRwZGF0YSA9IChfX3U4ICopdWggKyBzaXplb2Yoc3RydWN0IHVkcGhkcik7CiAJdWRwZGF0YTMyID0gKF9fYmUzMiAqKXVkcGRhdGE7CiAKQEAgLTk1OSw3ICsxMDI2LDcgQEAKIAkJLyogQ2hlY2sgaWYgdGhpcyBpcyBhIGtlZXBhbGl2ZSBwYWNrZXQuICBJZiBzbywgZWF0IGl0LiAqLwogCQlpZiAobGVuID09IDEgJiYgdWRwZGF0YVswXSA9PSAweGZmKSB7CiAJCQlyZXR1cm4gMDsKLQkJfSBlbHNlIGlmIChsZW4gPiBzaXplb2Yoc3RydWN0IGlwX2VzcF9oZHIpICYmIHVkcGRhdGEzMlswXSAhPSAwICkgeworCQl9IGVsc2UgaWYgKGxlbiA+IHNpemVvZihzdHJ1Y3QgaXBfZXNwX2hkcikgJiYgdWRwZGF0YTMyWzBdICE9IDApIHsKIAkJCS8qIEVTUCBQYWNrZXQgd2l0aG91dCBOb24tRVNQIGhlYWRlciAqLwogCQkJbGVuID0gc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpOwogCQl9IGVsc2UKQEAgLTk5MCw3ICsxMDU3LDcgQEAKIAkJcmV0dXJuIDA7CiAKIAkvKiBOb3cgd2UgY2FuIHVwZGF0ZSBhbmQgdmVyaWZ5IHRoZSBwYWNrZXQgbGVuZ3RoLi4uICovCi0JaXBoID0gc2tiLT5uaC5pcGg7CisJaXBoID0gaXBfaGRyKHNrYik7CiAJaXBobGVuID0gaXBoLT5paGwgPDwgMjsKIAlpcGgtPnRvdF9sZW4gPSBodG9ucyhudG9ocyhpcGgtPnRvdF9sZW4pIC0gbGVuKTsKIAlpZiAoc2tiLT5sZW4gPCBpcGhsZW4gKyBsZW4pIHsKQEAgLTEwMDIsNyArMTA2OSw4IEBACiAJICogdHJhbnNwb3J0IGhlYWRlciB0byBwb2ludCB0byBFU1AuICBLZWVwIFVEUCBvbiB0aGUgc3RhY2sKIAkgKiBmb3IgbGF0ZXIuCiAJICovCi0Jc2tiLT5oLnJhdyA9IHNrYl9wdWxsKHNrYiwgbGVuKTsKKwlfX3NrYl9wdWxsKHNrYiwgbGVuKTsKKwlza2JfcmVzZXRfdHJhbnNwb3J0X2hlYWRlcihza2IpOwogCiAJLyogbW9kaWZ5IHRoZSBwcm90b2NvbCAoaXQncyBFU1AhKSAqLwogCWlwaC0+cHJvdG9jb2wgPSBJUFBST1RPX0VTUDsKQEAgLTEwOTUsMTAgKzExNjMsOSBAQAogCQl9CiAJfQogCi0JaWYgKHNrLT5za19maWx0ZXIgJiYgc2tiLT5pcF9zdW1tZWQgIT0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlkpIHsKLQkJaWYgKF9fdWRwX2xpYl9jaGVja3N1bV9jb21wbGV0ZShza2IpKQorCWlmIChzay0+c2tfZmlsdGVyKSB7CisJCWlmICh1ZHBfbGliX2NoZWNrc3VtX2NvbXBsZXRlKHNrYikpCiAJCQlnb3RvIGRyb3A7Ci0JCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CiAJfQogCiAJaWYgKChyYyA9IHNvY2tfcXVldWVfcmN2X3NrYihzayxza2IpKSA8IDApIHsKQEAgLTExMjgsMzMgKzExOTUsNDkgQEAKIAkJCQkgICAgX19iZTMyIHNhZGRyLCBfX2JlMzIgZGFkZHIsCiAJCQkJICAgIHN0cnVjdCBobGlzdF9oZWFkIHVkcHRhYmxlW10pCiB7Ci0Jc3RydWN0IHNvY2sgKnNrOworCXN0cnVjdCBzb2NrICpzaywgKnNrdywgKnNrbmV4dDsKIAlpbnQgZGlmOworCWludCBocG9ydCA9IG50b2hzKHVoLT5kZXN0KTsKKwl1bnNpZ25lZCBpbnQgaGFzaCA9IGhhc2hfcG9ydF9hbmRfYWRkcihocG9ydCwgZGFkZHIpOworCXVuc2lnbmVkIGludCBoYXNod2lsZCA9IGhhc2hfcG9ydF9hbmRfYWRkcihocG9ydCwgMCk7CisKKwlkaWYgPSBza2ItPmRldi0+aWZpbmRleDsKIAogCXJlYWRfbG9jaygmdWRwX2hhc2hfbG9jayk7Ci0Jc2sgPSBza19oZWFkKCZ1ZHB0YWJsZVtudG9ocyh1aC0+ZGVzdCkgJiAoVURQX0hUQUJMRV9TSVpFIC0gMSldKTsKLQlkaWYgPSBza2ItPmRldi0+aWZpbmRleDsKLQlzayA9IHVkcF92NF9tY2FzdF9uZXh0KHNrLCB1aC0+ZGVzdCwgZGFkZHIsIHVoLT5zb3VyY2UsIHNhZGRyLCBkaWYpOwotCWlmIChzaykgewotCQlzdHJ1Y3Qgc29jayAqc2tuZXh0ID0gTlVMTDsKIAorCXNrID0gc2tfaGVhZCgmdWRwdGFibGVbaGFzaCAmIChVRFBfSFRBQkxFX1NJWkUgLSAxKV0pOworCXNrdyA9IHNrX2hlYWQoJnVkcHRhYmxlW2hhc2h3aWxkICYgKFVEUF9IVEFCTEVfU0laRSAtIDEpXSk7CisKKwlzayA9IHVkcF92NF9tY2FzdF9uZXh0KHNrLCBoYXNoLCBocG9ydCwgZGFkZHIsIHVoLT5zb3VyY2UsIHNhZGRyLCBkaWYpOworCWlmICghc2spIHsKKwkJaGFzaCA9IGhhc2h3aWxkOworCQlzayA9IHVkcF92NF9tY2FzdF9uZXh0KHNrdywgaGFzaCwgaHBvcnQsIGRhZGRyLCB1aC0+c291cmNlLAorCQkJc2FkZHIsIGRpZik7CisJfQorCWlmIChzaykgewogCQlkbyB7CiAJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiMSA9IHNrYjsKLQotCQkJc2tuZXh0ID0gdWRwX3Y0X21jYXN0X25leHQoc2tfbmV4dChzayksIHVoLT5kZXN0LCBkYWRkciwKLQkJCQkJCSAgIHVoLT5zb3VyY2UsIHNhZGRyLCBkaWYpOwotCQkJaWYoc2tuZXh0KQorCQkJc2tuZXh0ID0gdWRwX3Y0X21jYXN0X25leHQoc2tfbmV4dChzayksIGhhc2gsIGhwb3J0LAorCQkJCQkJZGFkZHIsIHVoLT5zb3VyY2UsIHNhZGRyLCBkaWYpOworCQkJaWYgKCFza25leHQgJiYgaGFzaCAhPSBoYXNod2lsZCkgeworCQkJCWhhc2ggPSBoYXNod2lsZDsKKwkJCQlza25leHQgPSB1ZHBfdjRfbWNhc3RfbmV4dChza3csIGhhc2gsIGhwb3J0LAorCQkJCQlkYWRkciwgdWgtPnNvdXJjZSwgc2FkZHIsIGRpZik7CisJCQl9CisJCQlpZiAoc2tuZXh0KQogCQkJCXNrYjEgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTsKIAotCQkJaWYoc2tiMSkgeworCQkJaWYgKHNrYjEpIHsKIAkJCQlpbnQgcmV0ID0gdWRwX3F1ZXVlX3Jjdl9za2Ioc2ssIHNrYjEpOwogCQkJCWlmIChyZXQgPiAwKQotCQkJCQkvKiB3ZSBzaG91bGQgcHJvYmFibHkgcmUtcHJvY2VzcyBpbnN0ZWFkCi0JCQkJCSAqIG9mIGRyb3BwaW5nIHBhY2tldHMgaGVyZS4gKi8KKwkJCQkJLyoKKwkJCQkJICogd2Ugc2hvdWxkIHByb2JhYmx5IHJlLXByb2Nlc3MKKwkJCQkJICogaW5zdGVhZCBvZiBkcm9wcGluZyBwYWNrZXRzIGhlcmUuCisJCQkJCSAqLwogCQkJCQlrZnJlZV9za2Ioc2tiMSk7CiAJCQl9CiAJCQlzayA9IHNrbmV4dDsKLQkJfSB3aGlsZShza25leHQpOworCQl9IHdoaWxlIChza25leHQpOwogCX0gZWxzZQogCQlrZnJlZV9za2Ioc2tiKTsKIAlyZWFkX3VubG9jaygmdWRwX2hhc2hfbG9jayk7CkBAIC0xMTY2LDI1ICsxMjQ5LDM3IEBACiAgKiBPdGhlcndpc2UsIGNzdW0gY29tcGxldGlvbiByZXF1aXJlcyBjaGFja3N1bW1pbmcgcGFja2V0IGJvZHksCiAgKiBpbmNsdWRpbmcgdWRwIGhlYWRlciBhbmQgZm9sZGluZyBpdCB0byBza2ItPmNzdW0uCiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCB1ZHA0X2NzdW1faW5pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdWRwaGRyICp1aCkKK3N0YXRpYyBpbmxpbmUgaW50IHVkcDRfY3N1bV9pbml0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB1ZHBoZHIgKnVoLAorCQkJCSBpbnQgcHJvdG8pCiB7CisJY29uc3Qgc3RydWN0IGlwaGRyICppcGg7CisJaW50IGVycjsKKworCVVEUF9TS0JfQ0Ioc2tiKS0+cGFydGlhbF9jb3YgPSAwOworCVVEUF9TS0JfQ0Ioc2tiKS0+Y3Njb3YgPSBza2ItPmxlbjsKKworCWlmIChwcm90byA9PSBJUFBST1RPX1VEUExJVEUpIHsKKwkJZXJyID0gdWRwbGl0ZV9jaGVja3N1bV9pbml0KHNrYiwgdWgpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwlpcGggPSBpcF9oZHIoc2tiKTsKIAlpZiAodWgtPmNoZWNrID09IDApIHsKIAkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKIAl9IGVsc2UgaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0NPTVBMRVRFKSB7Ci0JICAgICAgIGlmICghY3N1bV90Y3B1ZHBfbWFnaWMoc2tiLT5uaC5pcGgtPnNhZGRyLCBza2ItPm5oLmlwaC0+ZGFkZHIsCi0JCQkJICAgICAgc2tiLT5sZW4sIElQUFJPVE9fVURQLCBza2ItPmNzdW0gICAgICAgKSkKKwkgICAgICAgaWYgKCFjc3VtX3RjcHVkcF9tYWdpYyhpcGgtPnNhZGRyLCBpcGgtPmRhZGRyLCBza2ItPmxlbiwKKwkJCQkgICAgICBwcm90bywgc2tiLT5jc3VtKSkKIAkJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CiAJfQotCWlmIChza2ItPmlwX3N1bW1lZCAhPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWSkKLQkJc2tiLT5jc3VtID0gY3N1bV90Y3B1ZHBfbm9mb2xkKHNrYi0+bmguaXBoLT5zYWRkciwKLQkJCQkJICAgICAgIHNrYi0+bmguaXBoLT5kYWRkciwKLQkJCQkJICAgICAgIHNrYi0+bGVuLCBJUFBST1RPX1VEUCwgMCk7CisJaWYgKCFza2JfY3N1bV91bm5lY2Vzc2FyeShza2IpKQorCQlza2ItPmNzdW0gPSBjc3VtX3RjcHVkcF9ub2ZvbGQoaXBoLT5zYWRkciwgaXBoLT5kYWRkciwKKwkJCQkJICAgICAgIHNrYi0+bGVuLCBwcm90bywgMCk7CiAJLyogUHJvYmFibHksIHdlIHNob3VsZCBjaGVja3N1bSB1ZHAgaGVhZGVyIChpdCBzaG91bGQgYmUgaW4gY2FjaGUKIAkgKiBpbiBhbnkgY2FzZSkgYW5kIGRhdGEgaW4gdGlueSBwYWNrZXRzICg8IHJ4IGNvcHlicmVhaykuCiAJICovCiAKLQkvKiBVRFAgPSBVRFAtTGl0ZSB3aXRoIGEgbm9uLXBhcnRpYWwgY2hlY2tzdW0gY292ZXJhZ2UgKi8KLQlVRFBfU0tCX0NCKHNrYiktPnBhcnRpYWxfY292ID0gMDsKKwlyZXR1cm4gMDsKIH0KIAogLyoKQEAgLTExOTIsMTQgKzEyODcsMTQgQEAKICAqLwogCiBpbnQgX191ZHA0X2xpYl9yY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGhsaXN0X2hlYWQgdWRwdGFibGVbXSwKLQkJICAgaW50IGlzX3VkcGxpdGUpCisJCSAgIGludCBwcm90bykKIHsKIAlzdHJ1Y3Qgc29jayAqc2s7Ci0Jc3RydWN0IHVkcGhkciAqdWggPSBza2ItPmgudWg7CisJc3RydWN0IHVkcGhkciAqdWggPSB1ZHBfaGRyKHNrYik7CiAJdW5zaWduZWQgc2hvcnQgdWxlbjsKIAlzdHJ1Y3QgcnRhYmxlICpydCA9IChzdHJ1Y3QgcnRhYmxlKilza2ItPmRzdDsKLQlfX2JlMzIgc2FkZHIgPSBza2ItPm5oLmlwaC0+c2FkZHI7Ci0JX19iZTMyIGRhZGRyID0gc2tiLT5uaC5pcGgtPmRhZGRyOworCV9fYmUzMiBzYWRkciA9IGlwX2hkcihza2IpLT5zYWRkcjsKKwlfX2JlMzIgZGFkZHIgPSBpcF9oZHIoc2tiKS0+ZGFkZHI7CiAKIAkvKgogCSAqICBWYWxpZGF0ZSB0aGUgcGFja2V0LgpAQCAtMTIxMSwyNCArMTMwNiwyMSBAQAogCWlmICh1bGVuID4gc2tiLT5sZW4pCiAJCWdvdG8gc2hvcnRfcGFja2V0OwogCi0JaWYoISBpc191ZHBsaXRlICkgewkJLyogVURQIHZhbGlkYXRlcyB1bGVuLiAqLwotCisJaWYgKHByb3RvID09IElQUFJPVE9fVURQKSB7CisJCS8qIFVEUCB2YWxpZGF0ZXMgdWxlbi4gKi8KIAkJaWYgKHVsZW4gPCBzaXplb2YoKnVoKSB8fCBwc2tiX3RyaW1fcmNzdW0oc2tiLCB1bGVuKSkKIAkJCWdvdG8gc2hvcnRfcGFja2V0OwotCQl1aCA9IHNrYi0+aC51aDsKLQotCQl1ZHA0X2NzdW1faW5pdChza2IsIHVoKTsKLQotCX0gZWxzZSAJewkJCS8qIFVEUC1MaXRlIHZhbGlkYXRlcyBjc2Nvdi4gKi8KLQkJaWYgKHVkcGxpdGU0X2NzdW1faW5pdChza2IsIHVoKSkKLQkJCWdvdG8gY3N1bV9lcnJvcjsKKwkJdWggPSB1ZHBfaGRyKHNrYik7CiAJfQogCi0JaWYocnQtPnJ0X2ZsYWdzICYgKFJUQ0ZfQlJPQURDQVNUfFJUQ0ZfTVVMVElDQVNUKSkKKwlpZiAodWRwNF9jc3VtX2luaXQoc2tiLCB1aCwgcHJvdG8pKQorCQlnb3RvIGNzdW1fZXJyb3I7CisKKwlpZiAocnQtPnJ0X2ZsYWdzICYgKFJUQ0ZfQlJPQURDQVNUfFJUQ0ZfTVVMVElDQVNUKSkKIAkJcmV0dXJuIF9fdWRwNF9saWJfbWNhc3RfZGVsaXZlcihza2IsIHVoLCBzYWRkciwgZGFkZHIsIHVkcHRhYmxlKTsKIAogCXNrID0gX191ZHA0X2xpYl9sb29rdXAoc2FkZHIsIHVoLT5zb3VyY2UsIGRhZGRyLCB1aC0+ZGVzdCwKLQkJCSAgICAgICBza2ItPmRldi0+aWZpbmRleCwgdWRwdGFibGUgICAgICAgICk7CisJCQkgICAgICAgc2tiLT5kZXYtPmlmaW5kZXgsIHVkcHRhYmxlKTsKIAogCWlmIChzayAhPSBOVUxMKSB7CiAJCWludCByZXQgPSB1ZHBfcXVldWVfcmN2X3NrYihzaywgc2tiKTsKQEAgLTEyNTAsNyArMTM0Miw3IEBACiAJaWYgKHVkcF9saWJfY2hlY2tzdW1fY29tcGxldGUoc2tiKSkKIAkJZ290byBjc3VtX2Vycm9yOwogCi0JVURQX0lOQ19TVEFUU19CSChVRFBfTUlCX05PUE9SVFMsIGlzX3VkcGxpdGUpOworCVVEUF9JTkNfU1RBVFNfQkgoVURQX01JQl9OT1BPUlRTLCBwcm90byA9PSBJUFBST1RPX1VEUExJVEUpOwogCWljbXBfc2VuZChza2IsIElDTVBfREVTVF9VTlJFQUNILCBJQ01QX1BPUlRfVU5SRUFDSCwgMCk7CiAKIAkvKgpAQCAtMTI1OCwxMSArMTM1MCwxMSBAQAogCSAqIGRvbid0IHdhbm5hIGxpc3Rlbi4gIElnbm9yZSBpdC4KIAkgKi8KIAlrZnJlZV9za2Ioc2tiKTsKLQlyZXR1cm4oMCk7CisJcmV0dXJuIDA7CiAKIHNob3J0X3BhY2tldDoKIAlMSU1JVF9ORVRERUJVRyhLRVJOX0RFQlVHICJVRFAlczogc2hvcnQgcGFja2V0OiBGcm9tICV1LiV1LiV1LiV1OiV1ICVkLyVkIHRvICV1LiV1LiV1LiV1OiV1XG4iLAotCQkgICAgICAgaXNfdWRwbGl0ZT8gIi1MaXRlIiA6ICIiLAorCQkgICAgICAgcHJvdG8gPT0gSVBQUk9UT19VRFBMSVRFID8gIi1MaXRlIiA6ICIiLAogCQkgICAgICAgTklQUVVBRChzYWRkciksCiAJCSAgICAgICBudG9ocyh1aC0+c291cmNlKSwKIAkJICAgICAgIHVsZW4sCkBAIC0xMjc3LDIxICsxMzY5LDIxIEBACiAJICogdGhlIG5ldHdvcmsgaXMgY29uY2VybmVkLCBhbnl3YXkpIGFzIHBlciA0LjEuMy40IChNVVNUKS4KIAkgKi8KIAlMSU1JVF9ORVRERUJVRyhLRVJOX0RFQlVHICJVRFAlczogYmFkIGNoZWNrc3VtLiBGcm9tICVkLiVkLiVkLiVkOiVkIHRvICVkLiVkLiVkLiVkOiVkIHVsZW4gJWRcbiIsCi0JCSAgICAgICBpc191ZHBsaXRlPyAiLUxpdGUiIDogIiIsCisJCSAgICAgICBwcm90byA9PSBJUFBST1RPX1VEUExJVEUgPyAiLUxpdGUiIDogIiIsCiAJCSAgICAgICBOSVBRVUFEKHNhZGRyKSwKIAkJICAgICAgIG50b2hzKHVoLT5zb3VyY2UpLAogCQkgICAgICAgTklQUVVBRChkYWRkciksCiAJCSAgICAgICBudG9ocyh1aC0+ZGVzdCksCiAJCSAgICAgICB1bGVuKTsKIGRyb3A6Ci0JVURQX0lOQ19TVEFUU19CSChVRFBfTUlCX0lORVJST1JTLCBpc191ZHBsaXRlKTsKKwlVRFBfSU5DX1NUQVRTX0JIKFVEUF9NSUJfSU5FUlJPUlMsIHByb3RvID09IElQUFJPVE9fVURQTElURSk7CiAJa2ZyZWVfc2tiKHNrYik7Ci0JcmV0dXJuKDApOworCXJldHVybiAwOwogfQogCi1fX2lubGluZV9fIGludCB1ZHBfcmN2KHN0cnVjdCBza19idWZmICpza2IpCitpbnQgdWRwX3JjdihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXJldHVybiBfX3VkcDRfbGliX3Jjdihza2IsIHVkcF9oYXNoLCAwKTsKKwlyZXR1cm4gX191ZHA0X2xpYl9yY3Yoc2tiLCB1ZHBfaGFzaCwgSVBQUk9UT19VRFApOwogfQogCiBpbnQgdWRwX2Rlc3Ryb3lfc29jayhzdHJ1Y3Qgc29jayAqc2spCkBAIC0xMzEzLDEzICsxNDA1LDEzIEBACiAJaW50IHZhbDsKIAlpbnQgZXJyID0gMDsKIAotCWlmKG9wdGxlbjxzaXplb2YoaW50KSkKKwlpZiAob3B0bGVuPHNpemVvZihpbnQpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmIChnZXRfdXNlcih2YWwsIChpbnQgX191c2VyICopb3B0dmFsKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQlzd2l0Y2gob3B0bmFtZSkgeworCXN3aXRjaCAob3B0bmFtZSkgewogCWNhc2UgVURQX0NPUks6CiAJCWlmICh2YWwgIT0gMCkgewogCQkJdXAtPmNvcmtmbGFnID0gMTsKQEAgLTEzNzMsNyArMTQ2NSw3IEBACiAJZGVmYXVsdDoKIAkJZXJyID0gLUVOT1BST1RPT1BUOwogCQlicmVhazsKLQl9OworCX0KIAogCXJldHVybiBlcnI7CiB9CkBAIC0xNDA0LDE1ICsxNDk2LDE1IEBACiAJc3RydWN0IHVkcF9zb2NrICp1cCA9IHVkcF9zayhzayk7CiAJaW50IHZhbCwgbGVuOwogCi0JaWYoZ2V0X3VzZXIobGVuLG9wdGxlbikpCisJaWYgKGdldF91c2VyKGxlbixvcHRsZW4pKQogCQlyZXR1cm4gLUVGQVVMVDsKIAogCWxlbiA9IG1pbl90KHVuc2lnbmVkIGludCwgbGVuLCBzaXplb2YoaW50KSk7CiAKLQlpZihsZW4gPCAwKQorCWlmIChsZW4gPCAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXN3aXRjaChvcHRuYW1lKSB7CisJc3dpdGNoIChvcHRuYW1lKSB7CiAJY2FzZSBVRFBfQ09SSzoKIAkJdmFsID0gdXAtPmNvcmtmbGFnOwogCQlicmVhazsKQEAgLTE0MzMsMTEgKzE1MjUsMTEgQEAKIAogCWRlZmF1bHQ6CiAJCXJldHVybiAtRU5PUFJPVE9PUFQ7Ci0JfTsKKwl9CiAKLQlpZihwdXRfdXNlcihsZW4sIG9wdGxlbikpCisJaWYgKHB1dF91c2VyKGxlbiwgb3B0bGVuKSkKIAkJcmV0dXJuIC1FRkFVTFQ7Ci0JaWYoY29weV90b191c2VyKG9wdHZhbCwgJnZhbCxsZW4pKQorCWlmIChjb3B5X3RvX3VzZXIob3B0dmFsLCAmdmFsLGxlbikpCiAJCXJldHVybiAtRUZBVUxUOwogCXJldHVybiAwOwogfQpAQCAtMTQ4NiwxNSArMTU3OCwxMSBAQAogCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCiAJCXNwaW5fbG9ja19iaCgmcmN2cS0+bG9jayk7Ci0JCXdoaWxlICgoc2tiID0gc2tiX3BlZWsocmN2cSkpICE9IE5VTEwpIHsKLQkJCWlmICh1ZHBfbGliX2NoZWNrc3VtX2NvbXBsZXRlKHNrYikpIHsKLQkJCQlVRFBfSU5DX1NUQVRTX0JIKFVEUF9NSUJfSU5FUlJPUlMsIGlzX2xpdGUpOwotCQkJCV9fc2tiX3VubGluayhza2IsIHJjdnEpOwotCQkJCWtmcmVlX3NrYihza2IpOwotCQkJfSBlbHNlIHsKLQkJCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOwotCQkJCWJyZWFrOwotCQkJfQorCQl3aGlsZSAoKHNrYiA9IHNrYl9wZWVrKHJjdnEpKSAhPSBOVUxMICYmCisJCSAgICAgICB1ZHBfbGliX2NoZWNrc3VtX2NvbXBsZXRlKHNrYikpIHsKKwkJCVVEUF9JTkNfU1RBVFNfQkgoVURQX01JQl9JTkVSUk9SUywgaXNfbGl0ZSk7CisJCQlfX3NrYl91bmxpbmsoc2tiLCByY3ZxKTsKKwkJCWtmcmVlX3NrYihza2IpOwogCQl9CiAJCXNwaW5fdW5sb2NrX2JoKCZyY3ZxLT5sb2NrKTsKIApAQCAtMTU3Myw3ICsxNjYxLDcgQEAKIAlzdHJ1Y3Qgc29jayAqc2sgPSB1ZHBfZ2V0X2ZpcnN0KHNlcSk7CiAKIAlpZiAoc2spCi0JCXdoaWxlKHBvcyAmJiAoc2sgPSB1ZHBfZ2V0X25leHQoc2VxLCBzaykpICE9IE5VTEwpCisJCXdoaWxlIChwb3MgJiYgKHNrID0gdWRwX2dldF9uZXh0KHNlcSwgc2spKSAhPSBOVUxMKQogCQkJLS1wb3M7CiAJcmV0dXJuIHBvcyA/IE5VTEwgOiBzazsKIH0KZGlmZiAtLWdpdCBhL25ldC9pcHY0L3VkcGxpdGUuYyBiL25ldC9pcHY0L3VkcGxpdGUuYwppbmRleCBiMjhmZTFlLi5mMzRmZDY4IDEwMDY0NAotLS0gYS9uZXQvaXB2NC91ZHBsaXRlLmMKKysrIGIvbmV0L2lwdjQvdWRwbGl0ZS5jCkBAIC0zMSw3ICszMSw3IEBACiAKIHN0YXRpYyBpbnQgdWRwbGl0ZV9yY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlyZXR1cm4gX191ZHA0X2xpYl9yY3Yoc2tiLCB1ZHBsaXRlX2hhc2gsIDEpOworCXJldHVybiBfX3VkcDRfbGliX3Jjdihza2IsIHVkcGxpdGVfaGFzaCwgSVBQUk9UT19VRFBMSVRFKTsKIH0KIAogc3RhdGljIHZvaWQgdWRwbGl0ZV9lcnIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIGluZm8pCmRpZmYgLS1naXQgYS9uZXQvaXB2NC94ZnJtNF9pbnB1dC5jIGIvbmV0L2lwdjQveGZybTRfaW5wdXQuYwppbmRleCA3OGU4MGRlLi41Y2VjYTk1IDEwMDY0NAotLS0gYS9uZXQvaXB2NC94ZnJtNF9pbnB1dC5jCisrKyBiL25ldC9pcHY0L3hmcm00X2lucHV0LmMKQEAgLTI4LDcgKzI4LDcgQEAKIAlzd2l0Y2ggKG5leHRoZHIpIHsKIAljYXNlIElQUFJPVE9fSVBJUDoKIAljYXNlIElQUFJPVE9fSVBWNjoKLQkJKnNwaSA9IHNrYi0+bmguaXBoLT5zYWRkcjsKKwkJKnNwaSA9IGlwX2hkcihza2IpLT5zYWRkcjsKIAkJKnNlcSA9IDA7CiAJCXJldHVybiAwOwogCX0KQEAgLTM5LDkgKzM5LDkgQEAKICNpZmRlZiBDT05GSUdfTkVURklMVEVSCiBzdGF0aWMgaW5saW5lIGludCB4ZnJtNF9yY3ZfZW5jYXBfZmluaXNoKHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0Jc3RydWN0IGlwaGRyICppcGggPSBza2ItPm5oLmlwaDsKLQogCWlmIChza2ItPmRzdCA9PSBOVUxMKSB7CisJCWNvbnN0IHN0cnVjdCBpcGhkciAqaXBoID0gaXBfaGRyKHNrYik7CisKIAkJaWYgKGlwX3JvdXRlX2lucHV0KHNrYiwgaXBoLT5kYWRkciwgaXBoLT5zYWRkciwgaXBoLT50b3MsCiAJCQkJICAgc2tiLT5kZXYpKQogCQkJZ290byBkcm9wOwpAQCAtNTUsMTggKzU1LDE4IEBACiAKIGludCB4ZnJtNF9yY3ZfZW5jYXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgX191MTYgZW5jYXBfdHlwZSkKIHsKLQlpbnQgZXJyOwogCV9fYmUzMiBzcGksIHNlcTsKIAlzdHJ1Y3QgeGZybV9zdGF0ZSAqeGZybV92ZWNbWEZSTV9NQVhfREVQVEhdOwogCXN0cnVjdCB4ZnJtX3N0YXRlICp4OwogCWludCB4ZnJtX25yID0gMDsKIAlpbnQgZGVjYXBzID0gMDsKKwlpbnQgZXJyID0geGZybTRfcGFyc2Vfc3BpKHNrYiwgaXBfaGRyKHNrYiktPnByb3RvY29sLCAmc3BpLCAmc2VxKTsKIAotCWlmICgoZXJyID0geGZybTRfcGFyc2Vfc3BpKHNrYiwgc2tiLT5uaC5pcGgtPnByb3RvY29sLCAmc3BpLCAmc2VxKSkgIT0gMCkKKwlpZiAoZXJyICE9IDApCiAJCWdvdG8gZHJvcDsKIAogCWRvIHsKLQkJc3RydWN0IGlwaGRyICppcGggPSBza2ItPm5oLmlwaDsKKwkJY29uc3Qgc3RydWN0IGlwaGRyICppcGggPSBpcF9oZHIoc2tiKTsKIAogCQlpZiAoeGZybV9uciA9PSBYRlJNX01BWF9ERVBUSCkKIAkJCWdvdG8gZHJvcDsKQEAgLTExMyw3ICsxMTMsOCBAQAogCQkJYnJlYWs7CiAJCX0KIAotCQlpZiAoKGVyciA9IHhmcm1fcGFyc2Vfc3BpKHNrYiwgc2tiLT5uaC5pcGgtPnByb3RvY29sLCAmc3BpLCAmc2VxKSkgPCAwKQorCQllcnIgPSB4ZnJtX3BhcnNlX3NwaShza2IsIGlwX2hkcihza2IpLT5wcm90b2NvbCwgJnNwaSwgJnNlcSk7CisJCWlmIChlcnIgPCAwKQogCQkJZ290byBkcm9wOwogCX0gd2hpbGUgKCFlcnIpOwogCkBAIC0xNDYsMTUgKzE0NywxNSBAQAogCQlyZXR1cm4gMDsKIAl9IGVsc2UgewogI2lmZGVmIENPTkZJR19ORVRGSUxURVIKLQkJX19za2JfcHVzaChza2IsIHNrYi0+ZGF0YSAtIHNrYi0+bmgucmF3KTsKLQkJc2tiLT5uaC5pcGgtPnRvdF9sZW4gPSBodG9ucyhza2ItPmxlbik7Ci0JCWlwX3NlbmRfY2hlY2soc2tiLT5uaC5pcGgpOworCQlfX3NrYl9wdXNoKHNrYiwgc2tiLT5kYXRhIC0gc2tiX25ldHdvcmtfaGVhZGVyKHNrYikpOworCQlpcF9oZHIoc2tiKS0+dG90X2xlbiA9IGh0b25zKHNrYi0+bGVuKTsKKwkJaXBfc2VuZF9jaGVjayhpcF9oZHIoc2tiKSk7CiAKIAkJTkZfSE9PSyhQRl9JTkVULCBORl9JUF9QUkVfUk9VVElORywgc2tiLCBza2ItPmRldiwgTlVMTCwKIAkJCXhmcm00X3Jjdl9lbmNhcF9maW5pc2gpOwogCQlyZXR1cm4gMDsKICNlbHNlCi0JCXJldHVybiAtc2tiLT5uaC5pcGgtPnByb3RvY29sOworCQlyZXR1cm4gLWlwX2hkcihza2IpLT5wcm90b2NvbDsKICNlbmRpZgogCX0KIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQveGZybTRfbW9kZV9iZWV0LmMgYi9uZXQvaXB2NC94ZnJtNF9tb2RlX2JlZXQuYwppbmRleCBkNDE5ZTE1Li5hNzNlNzEwIDEwMDY0NAotLS0gYS9uZXQvaXB2NC94ZnJtNF9tb2RlX2JlZXQuYworKysgYi9uZXQvaXB2NC94ZnJtNF9tb2RlX2JlZXQuYwpAQCAtMjksMjAgKzI5LDIxIEBACiAgKi8KIHN0YXRpYyBpbnQgeGZybTRfYmVldF9vdXRwdXQoc3RydWN0IHhmcm1fc3RhdGUgKngsIHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0Jc3RydWN0IGlwaGRyICppcGgsICp0b3BfaXBoID0gTlVMTDsKKwlzdHJ1Y3QgaXBoZHIgKmlwaCwgKnRvcF9pcGg7CiAJaW50IGhkcmxlbiwgb3B0bGVuOwogCi0JaXBoID0gc2tiLT5uaC5pcGg7Ci0Jc2tiLT5oLmlwaXBoID0gaXBoOworCWlwaCA9IGlwX2hkcihza2IpOworCXNrYi0+dHJhbnNwb3J0X2hlYWRlciA9IHNrYi0+bmV0d29ya19oZWFkZXI7CiAKIAloZHJsZW4gPSAwOwogCW9wdGxlbiA9IGlwaC0+aWhsICogNCAtIHNpemVvZigqaXBoKTsKIAlpZiAodW5saWtlbHkob3B0bGVuKSkKIAkJaGRybGVuICs9IElQVjRfQkVFVF9QSE1BWExFTiAtIChvcHRsZW4gJiA0KTsKIAotCXNrYi0+bmgucmF3ID0gc2tiX3B1c2goc2tiLCB4LT5wcm9wcy5oZWFkZXJfbGVuICsgaGRybGVuKTsKLQl0b3BfaXBoID0gc2tiLT5uaC5pcGg7Ci0Jc2tiLT5oLnJhdyArPSBzaXplb2YoKmlwaCkgLSBoZHJsZW47CisJc2tiX3B1c2goc2tiLCB4LT5wcm9wcy5oZWFkZXJfbGVuIC0gSVBWNF9CRUVUX1BITUFYTEVOICsgaGRybGVuKTsKKwlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiKTsKKwl0b3BfaXBoID0gaXBfaGRyKHNrYik7CisJc2tiLT50cmFuc3BvcnRfaGVhZGVyICs9IHNpemVvZigqaXBoKSAtIGhkcmxlbjsKIAogCW1lbW1vdmUodG9wX2lwaCwgaXBoLCBzaXplb2YoKmlwaCkpOwogCWlmICh1bmxpa2VseShvcHRsZW4pKSB7CkBAIC01MCw3ICs1MSw3IEBACiAKIAkJQlVHX09OKG9wdGxlbiA8IDApOwogCi0JCXBoID0gKHN0cnVjdCBpcF9iZWV0X3BoZHIgKilza2ItPmgucmF3OworCQlwaCA9IChzdHJ1Y3QgaXBfYmVldF9waGRyICopc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKIAkJcGgtPnBhZGxlbiA9IDQgLSAob3B0bGVuICYgNCk7CiAJCXBoLT5oZHJsZW4gPSBvcHRsZW4gLyA4OwogCQlwaC0+bmV4dGhkciA9IHRvcF9pcGgtPnByb3RvY29sOwpAQCAtNjksMjAgKzcwLDE4IEBACiAKIHN0YXRpYyBpbnQgeGZybTRfYmVldF9pbnB1dChzdHJ1Y3QgeGZybV9zdGF0ZSAqeCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlzdHJ1Y3QgaXBoZHIgKmlwaCA9IHNrYi0+bmguaXBoOworCXN0cnVjdCBpcGhkciAqaXBoID0gaXBfaGRyKHNrYik7CiAJaW50IHBobGVuID0gMDsKIAlpbnQgb3B0bGVuID0gMDsKLQlfX3U4IHBoX25leHRoZHIgPSAwLCBwcm90b2NvbCA9IDA7CisJdTggcGhfbmV4dGhkciA9IDA7CiAJaW50IGVyciA9IC1FSU5WQUw7CiAKLQlwcm90b2NvbCA9IGlwaC0+cHJvdG9jb2w7Ci0KIAlpZiAodW5saWtlbHkoaXBoLT5wcm90b2NvbCA9PSBJUFBST1RPX0JFRVRQSCkpIHsKIAkJc3RydWN0IGlwX2JlZXRfcGhkciAqcGg7CiAKIAkJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgc2l6ZW9mKCpwaCkpKQogCQkJZ290byBvdXQ7Ci0JCXBoID0gKHN0cnVjdCBpcF9iZWV0X3BoZHIgKikoc2tiLT5oLmlwaXBoICsgMSk7CisJCXBoID0gKHN0cnVjdCBpcF9iZWV0X3BoZHIgKikoaXBpcF9oZHIoc2tiKSArIDEpOwogCiAJCXBobGVuID0gc2l6ZW9mKCpwaCkgKyBwaC0+cGFkbGVuOwogCQlvcHRsZW4gPSBwaC0+aGRybGVuICogOCArIChJUFY0X0JFRVRfUEhNQVhMRU4gLSBwaGxlbik7CkBAIC05NiwyMiArOTUsMjAgQEAKIAkJcGhfbmV4dGhkciA9IHBoLT5uZXh0aGRyOwogCX0KIAotCXNrYi0+bmgucmF3ID0gc2tiLT5kYXRhICsgKHBobGVuIC0gc2l6ZW9mKCppcGgpKTsKLQltZW1tb3ZlKHNrYi0+bmgucmF3LCBpcGgsIHNpemVvZigqaXBoKSk7Ci0Jc2tiLT5oLnJhdyA9IHNrYi0+ZGF0YSArIChwaGxlbiArIG9wdGxlbik7Ci0Jc2tiLT5kYXRhID0gc2tiLT5oLnJhdzsKKwlza2Jfc2V0X25ldHdvcmtfaGVhZGVyKHNrYiwgcGhsZW4gLSBzaXplb2YoKmlwaCkpOworCW1lbW1vdmUoc2tiX25ldHdvcmtfaGVhZGVyKHNrYiksIGlwaCwgc2l6ZW9mKCppcGgpKTsKKwlza2Jfc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiLCBwaGxlbiArIG9wdGxlbik7CisJc2tiLT5kYXRhID0gc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKIAotCWlwaCA9IHNrYi0+bmguaXBoOworCWlwaCA9IGlwX2hkcihza2IpOwogCWlwaC0+aWhsID0gKHNpemVvZigqaXBoKSArIG9wdGxlbikgLyA0OwogCWlwaC0+dG90X2xlbiA9IGh0b25zKHNrYi0+bGVuICsgaXBoLT5paGwgKiA0KTsKIAlpcGgtPmRhZGRyID0geC0+c2VsLmRhZGRyLmE0OwogCWlwaC0+c2FkZHIgPSB4LT5zZWwuc2FkZHIuYTQ7CiAJaWYgKHBoX25leHRoZHIpCiAJCWlwaC0+cHJvdG9jb2wgPSBwaF9uZXh0aGRyOwotCWVsc2UKLQkJaXBoLT5wcm90b2NvbCA9IHByb3RvY29sOwogCWlwaC0+Y2hlY2sgPSAwOwotCWlwaC0+Y2hlY2sgPSBpcF9mYXN0X2NzdW0oc2tiLT5uaC5yYXcsIGlwaC0+aWhsKTsKKwlpcGgtPmNoZWNrID0gaXBfZmFzdF9jc3VtKHNrYl9uZXR3b3JrX2hlYWRlcihza2IpLCBpcGgtPmlobCk7CiAJZXJyID0gMDsKIG91dDoKIAlyZXR1cm4gZXJyOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQveGZybTRfbW9kZV90cmFuc3BvcnQuYyBiL25ldC9pcHY0L3hmcm00X21vZGVfdHJhbnNwb3J0LmMKaW5kZXggOTI2NzZiNy4uNjAxMDQ3MSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQveGZybTRfbW9kZV90cmFuc3BvcnQuYworKysgYi9uZXQvaXB2NC94ZnJtNF9tb2RlX3RyYW5zcG9ydC5jCkBAIC0yMywxNiArMjMsMTMgQEAKICAqLwogc3RhdGljIGludCB4ZnJtNF90cmFuc3BvcnRfb3V0cHV0KHN0cnVjdCB4ZnJtX3N0YXRlICp4LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXN0cnVjdCBpcGhkciAqaXBoOwotCWludCBpaGw7CisJc3RydWN0IGlwaGRyICppcGggPSBpcF9oZHIoc2tiKTsKKwlpbnQgaWhsID0gaXBoLT5paGwgKiA0OwogCi0JaXBoID0gc2tiLT5uaC5pcGg7Ci0Jc2tiLT5oLmlwaXBoID0gaXBoOwotCi0JaWhsID0gaXBoLT5paGwgKiA0OwotCXNrYi0+aC5yYXcgKz0gaWhsOwotCi0Jc2tiLT5uaC5yYXcgPSBtZW1tb3ZlKHNrYl9wdXNoKHNrYiwgeC0+cHJvcHMuaGVhZGVyX2xlbiksIGlwaCwgaWhsKTsKKwlza2ItPnRyYW5zcG9ydF9oZWFkZXIgPSBza2ItPm5ldHdvcmtfaGVhZGVyICsgaWhsOworCXNrYl9wdXNoKHNrYiwgeC0+cHJvcHMuaGVhZGVyX2xlbik7CisJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CisJbWVtbW92ZShza2JfbmV0d29ya19oZWFkZXIoc2tiKSwgaXBoLCBpaGwpOwogCXJldHVybiAwOwogfQogCkBAIC00NiwxMiArNDMsMTUgQEAKICAqLwogc3RhdGljIGludCB4ZnJtNF90cmFuc3BvcnRfaW5wdXQoc3RydWN0IHhmcm1fc3RhdGUgKngsIHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JaW50IGlobCA9IHNrYi0+ZGF0YSAtIHNrYi0+aC5yYXc7CisJaW50IGlobCA9IHNrYi0+ZGF0YSAtIHNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYik7CiAKLQlpZiAoc2tiLT5oLnJhdyAhPSBza2ItPm5oLnJhdykKLQkJc2tiLT5uaC5yYXcgPSBtZW1tb3ZlKHNrYi0+aC5yYXcsIHNrYi0+bmgucmF3LCBpaGwpOwotCXNrYi0+bmguaXBoLT50b3RfbGVuID0gaHRvbnMoc2tiLT5sZW4gKyBpaGwpOwotCXNrYi0+aC5yYXcgPSBza2ItPmRhdGE7CisJaWYgKHNrYi0+dHJhbnNwb3J0X2hlYWRlciAhPSBza2ItPm5ldHdvcmtfaGVhZGVyKSB7CisJCW1lbW1vdmUoc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKSwKKwkJCXNrYl9uZXR3b3JrX2hlYWRlcihza2IpLCBpaGwpOworCQlza2ItPm5ldHdvcmtfaGVhZGVyID0gc2tiLT50cmFuc3BvcnRfaGVhZGVyOworCX0KKwlpcF9oZHIoc2tiKS0+dG90X2xlbiA9IGh0b25zKHNrYi0+bGVuICsgaWhsKTsKKwlza2JfcmVzZXRfdHJhbnNwb3J0X2hlYWRlcihza2IpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9uZXQvaXB2NC94ZnJtNF9tb2RlX3R1bm5lbC5jIGIvbmV0L2lwdjQveGZybTRfbW9kZV90dW5uZWwuYwppbmRleCBjZWI0Mzc2Li5hMmYyZTZhIDEwMDY0NAotLS0gYS9uZXQvaXB2NC94ZnJtNF9tb2RlX3R1bm5lbC5jCisrKyBiL25ldC9pcHY0L3hmcm00X21vZGVfdHVubmVsLmMKQEAgLTE2LDggKzE2LDggQEAKIAogc3RhdGljIGlubGluZSB2b2lkIGlwaXBfZWNuX2RlY2Fwc3VsYXRlKHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0Jc3RydWN0IGlwaGRyICpvdXRlcl9pcGggPSBza2ItPm5oLmlwaDsKLQlzdHJ1Y3QgaXBoZHIgKmlubmVyX2lwaCA9IHNrYi0+aC5pcGlwaDsKKwlzdHJ1Y3QgaXBoZHIgKm91dGVyX2lwaCA9IGlwX2hkcihza2IpOworCXN0cnVjdCBpcGhkciAqaW5uZXJfaXBoID0gaXBpcF9oZHIoc2tiKTsKIAogCWlmIChJTkVUX0VDTl9pc19jZShvdXRlcl9pcGgtPnRvcykpCiAJCUlQX0VDTl9zZXRfY2UoaW5uZXJfaXBoKTsKQEAgLTI2LDcgKzI2LDcgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBpcGlwNl9lY25fZGVjYXBzdWxhdGUoc3RydWN0IGlwaGRyICppcGgsIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJaWYgKElORVRfRUNOX2lzX2NlKGlwaC0+dG9zKSkKLQkJSVA2X0VDTl9zZXRfY2Uoc2tiLT5uaC5pcHY2aCk7CisJCUlQNl9FQ05fc2V0X2NlKGlwdjZfaGRyKHNrYikpOwogfQogCiAvKiBBZGQgZW5jYXBzdWxhdGlvbiBoZWFkZXIuCkBAIC00NiwxMSArNDYsMTIgQEAKIAlzdHJ1Y3QgaXBoZHIgKmlwaCwgKnRvcF9pcGg7CiAJaW50IGZsYWdzOwogCi0JaXBoID0gc2tiLT5uaC5pcGg7Ci0Jc2tiLT5oLmlwaXBoID0gaXBoOworCWlwaCA9IGlwX2hkcihza2IpOworCXNrYi0+dHJhbnNwb3J0X2hlYWRlciA9IHNrYi0+bmV0d29ya19oZWFkZXI7CiAKLQlza2ItPm5oLnJhdyA9IHNrYl9wdXNoKHNrYiwgeC0+cHJvcHMuaGVhZGVyX2xlbik7Ci0JdG9wX2lwaCA9IHNrYi0+bmguaXBoOworCXNrYl9wdXNoKHNrYiwgeC0+cHJvcHMuaGVhZGVyX2xlbik7CisJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CisJdG9wX2lwaCA9IGlwX2hkcihza2IpOwogCiAJdG9wX2lwaC0+aWhsID0gNTsKIAl0b3BfaXBoLT52ZXJzaW9uID0gNDsKQEAgLTkwLDEwICs5MSwxMSBAQAogCiBzdGF0aWMgaW50IHhmcm00X3R1bm5lbF9pbnB1dChzdHJ1Y3QgeGZybV9zdGF0ZSAqeCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlzdHJ1Y3QgaXBoZHIgKmlwaCA9IHNrYi0+bmguaXBoOworCXN0cnVjdCBpcGhkciAqaXBoID0gaXBfaGRyKHNrYik7CisJY29uc3QgdW5zaWduZWQgY2hhciAqb2xkX21hYzsKIAlpbnQgZXJyID0gLUVJTlZBTDsKIAotCXN3aXRjaChpcGgtPnByb3RvY29sKXsKKwlzd2l0Y2ggKGlwaC0+cHJvdG9jb2wpewogCQljYXNlIElQUFJPVE9fSVBJUDoKIAkJCWJyZWFrOwogI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQgKENPTkZJR19JUFY2X01PRFVMRSkKQEAgLTExMSwxMCArMTEzLDEwIEBACiAJICAgIChlcnIgPSBwc2tiX2V4cGFuZF9oZWFkKHNrYiwgMCwgMCwgR0ZQX0FUT01JQykpKQogCQlnb3RvIG91dDsKIAotCWlwaCA9IHNrYi0+bmguaXBoOworCWlwaCA9IGlwX2hkcihza2IpOwogCWlmIChpcGgtPnByb3RvY29sID09IElQUFJPVE9fSVBJUCkgewogCQlpZiAoeC0+cHJvcHMuZmxhZ3MgJiBYRlJNX1NUQVRFX0RFQ0FQX0RTQ1ApCi0JCQlpcHY0X2NvcHlfZHNjcChpcGgsIHNrYi0+aC5pcGlwaCk7CisJCQlpcHY0X2NvcHlfZHNjcChpcGgsIGlwaXBfaGRyKHNrYikpOwogCQlpZiAoISh4LT5wcm9wcy5mbGFncyAmIFhGUk1fU1RBVEVfTk9FQ04pKQogCQkJaXBpcF9lY25fZGVjYXBzdWxhdGUoc2tiKTsKIAl9CkBAIC0xMjUsOSArMTI3LDEwIEBACiAJCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUFY2KTsKIAl9CiAjZW5kaWYKLQlza2ItPm1hYy5yYXcgPSBtZW1tb3ZlKHNrYi0+ZGF0YSAtIHNrYi0+bWFjX2xlbiwKLQkJCSAgICAgICBza2ItPm1hYy5yYXcsIHNrYi0+bWFjX2xlbik7Ci0Jc2tiLT5uaC5yYXcgPSBza2ItPmRhdGE7CisJb2xkX21hYyA9IHNrYl9tYWNfaGVhZGVyKHNrYik7CisJc2tiX3NldF9tYWNfaGVhZGVyKHNrYiwgLXNrYi0+bWFjX2xlbik7CisJbWVtbW92ZShza2JfbWFjX2hlYWRlcihza2IpLCBvbGRfbWFjLCBza2ItPm1hY19sZW4pOworCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOwogCWVyciA9IDA7CiAKIG91dDoKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3hmcm00X291dHB1dC5jIGIvbmV0L2lwdjQveGZybTRfb3V0cHV0LmMKaW5kZXggMDM4Y2ExNi4uNDRlZjIwOCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQveGZybTRfb3V0cHV0LmMKKysrIGIvbmV0L2lwdjQveGZybTRfb3V0cHV0LmMKQEAgLTIyLDE0ICsyMiwxMyBAQAogewogCWludCBtdHUsIHJldCA9IDA7CiAJc3RydWN0IGRzdF9lbnRyeSAqZHN0OwotCXN0cnVjdCBpcGhkciAqaXBoID0gc2tiLT5uaC5pcGg7CiAKIAlpZiAoSVBDQihza2IpLT5mbGFncyAmIElQU0tCX1hGUk1fVFVOTkVMX1NJWkUpCiAJCWdvdG8gb3V0OwogCiAJSVBDQihza2IpLT5mbGFncyB8PSBJUFNLQl9YRlJNX1RVTk5FTF9TSVpFOwogCi0JaWYgKCEoaXBoLT5mcmFnX29mZiAmIGh0b25zKElQX0RGKSkgfHwgc2tiLT5sb2NhbF9kZikKKwlpZiAoIShpcF9oZHIoc2tiKS0+ZnJhZ19vZmYgJiBodG9ucyhJUF9ERikpIHx8IHNrYi0+bG9jYWxfZGYpCiAJCWdvdG8gb3V0OwogCiAJZHN0ID0gc2tiLT5kc3Q7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC94ZnJtNF9wb2xpY3kuYyBiL25ldC9pcHY0L3hmcm00X3BvbGljeS5jCmluZGV4IDVkNTFhMmEuLjRmZjhlZDMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3hmcm00X3BvbGljeS5jCisrKyBiL25ldC9pcHY0L3hmcm00X3BvbGljeS5jCkBAIC0xMTksNyArMTE5LDcgQEAKIAogCQlpZiAoeGZybVtpXS0+cHJvcHMubW9kZSA9PSBYRlJNX01PREVfVFVOTkVMKSB7CiAJCQl1bnNpZ25lZCBzaG9ydCBlbmNhcF9mYW1pbHkgPSB4ZnJtW2ldLT5wcm9wcy5mYW1pbHk7Ci0JCQlzd2l0Y2goZW5jYXBfZmFtaWx5KSB7CisJCQlzd2l0Y2ggKGVuY2FwX2ZhbWlseSkgewogCQkJY2FzZSBBRl9JTkVUOgogCQkJCWZsX3R1bm5lbC5mbDRfZHN0ID0geGZybVtpXS0+aWQuZGFkZHIuYTQ7CiAJCQkJZmxfdHVubmVsLmZsNF9zcmMgPSB4ZnJtW2ldLT5wcm9wcy5zYWRkci5hNDsKQEAgLTIwOSw4ICsyMDksOCBAQAogc3RhdGljIHZvaWQKIF9kZWNvZGVfc2Vzc2lvbjQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGZsb3dpICpmbCkKIHsKLQlzdHJ1Y3QgaXBoZHIgKmlwaCA9IHNrYi0+bmguaXBoOwotCXU4ICp4cHJ0aCA9IHNrYi0+bmgucmF3ICsgaXBoLT5paGwqNDsKKwlzdHJ1Y3QgaXBoZHIgKmlwaCA9IGlwX2hkcihza2IpOworCXU4ICp4cHJ0aCA9IHNrYl9uZXR3b3JrX2hlYWRlcihza2IpICsgaXBoLT5paGwgKiA0OwogCiAJbWVtc2V0KGZsLCAwLCBzaXplb2Yoc3RydWN0IGZsb3dpKSk7CiAJaWYgKCEoaXBoLT5mcmFnX29mZiAmIGh0b25zKElQX01GIHwgSVBfT0ZGU0VUKSkpIHsKQEAgLTI2Myw3ICsyNjMsNyBAQAogCQlkZWZhdWx0OgogCQkJZmwtPmZsX2lwc2VjX3NwaSA9IDA7CiAJCQlicmVhazsKLQkJfTsKKwkJfQogCX0KIAlmbC0+cHJvdG8gPSBpcGgtPnByb3RvY29sOwogCWZsLT5mbDRfZHN0ID0gaXBoLT5kYWRkcjsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3hmcm00X3R1bm5lbC5jIGIvbmV0L2lwdjQveGZybTRfdHVubmVsLmMKaW5kZXggM2VlZjA2NC4uNTY4NTEwMyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQveGZybTRfdHVubmVsLmMKKysrIGIvbmV0L2lwdjQveGZybTRfdHVubmVsLmMKQEAgLTEyLDkgKzEyLDggQEAKIAogc3RhdGljIGludCBpcGlwX291dHB1dChzdHJ1Y3QgeGZybV9zdGF0ZSAqeCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlzdHJ1Y3QgaXBoZHIgKmlwaDsKKwlzdHJ1Y3QgaXBoZHIgKmlwaCA9IGlwX2hkcihza2IpOwogCi0JaXBoID0gc2tiLT5uaC5pcGg7CiAJaXBoLT50b3RfbGVuID0gaHRvbnMoc2tiLT5sZW4pOwogCWlwX3NlbmRfY2hlY2soaXBoKTsKIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvS2NvbmZpZyBiL25ldC9pcHY2L0tjb25maWcKaW5kZXggNzk2ODJlZi4uOGU1ZDU0ZiAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvS2NvbmZpZworKysgYi9uZXQvaXB2Ni9LY29uZmlnCkBAIC01Nyw2ICs1NywxNiBAQAogCiAJICBJZiB1bnN1cmUsIHNheSBOLgogCitjb25maWcgSVBWNl9PUFRJTUlTVElDX0RBRAorCWJvb2wgIklQdjY6IEVuYWJsZSBSRkMgNDQyOSBPcHRpbWlzdGljIERBRCAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIElQVjYgJiYgRVhQRVJJTUVOVEFMCisJLS0taGVscC0tLQorCSAgVGhpcyBpcyBleHBlcmltZW50YWwgc3VwcG9ydCBmb3Igb3B0aW1pc3RpYyBEdXBsaWNhdGUKKwkgIEFkZHJlc3MgRGV0ZWN0aW9uLiAgSXQgYWxsb3dzIGZvciBhdXRvY29uZmlndXJlZCBhZGRyZXNzZXMKKwkgIHRvIGJlIHVzZWQgbW9yZSBxdWlja2x5LgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCiBjb25maWcgSU5FVDZfQUgKIAl0cmlzdGF0ZSAiSVB2NjogQUggdHJhbnNmb3JtYXRpb24iCiAJZGVwZW5kcyBvbiBJUFY2CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9NYWtlZmlsZSBiL25ldC9pcHY2L01ha2VmaWxlCmluZGV4IGQ0NjAwMTcuLmJiMzMzMDkwNCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvTWFrZWZpbGUKKysrIGIvbmV0L2lwdjYvTWFrZWZpbGUKQEAgLTcsMTQgKzcsMTUgQEAKIGlwdjYtb2JqcyA6PQlhZl9pbmV0Ni5vIGFueWNhc3QubyBpcDZfb3V0cHV0Lm8gaXA2X2lucHV0Lm8gYWRkcmNvbmYubyBcCiAJCXJvdXRlLm8gaXA2X2ZpYi5vIGlwdjZfc29ja2dsdWUubyBuZGlzYy5vIHVkcC5vIHVkcGxpdGUubyBcCiAJCXJhdy5vIHByb3RvY29sLm8gaWNtcC5vIG1jYXN0Lm8gcmVhc3NlbWJseS5vIHRjcF9pcHY2Lm8gXAotCQlleHRoZHJzLm8gc3lzY3RsX25ldF9pcHY2Lm8gZGF0YWdyYW0ubyBwcm9jLm8gXAotCQlpcDZfZmxvd2xhYmVsLm8gaXB2Nl9zeW1zLm8gaW5ldDZfY29ubmVjdGlvbl9zb2NrLm8KKwkJZXh0aGRycy5vIHN5c2N0bF9uZXRfaXB2Ni5vIGRhdGFncmFtLm8gXAorCQlpcDZfZmxvd2xhYmVsLm8gaW5ldDZfY29ubmVjdGlvbl9zb2NrLm8KIAogaXB2Ni0kKENPTkZJR19YRlJNKSArPSB4ZnJtNl9wb2xpY3kubyB4ZnJtNl9zdGF0ZS5vIHhmcm02X2lucHV0Lm8gXAogCXhmcm02X291dHB1dC5vCiBpcHY2LSQoQ09ORklHX05FVEZJTFRFUikgKz0gbmV0ZmlsdGVyLm8KIGlwdjYtJChDT05GSUdfSVBWNl9NVUxUSVBMRV9UQUJMRVMpICs9IGZpYjZfcnVsZXMubwogaXB2Ni0kKENPTkZJR19JUFY2X01JUDYpICs9IG1pcDYubworaXB2Ni0kKENPTkZJR19QUk9DX0ZTKSArPSBwcm9jLm8KIAogaXB2Ni1vYmpzICs9ICQoaXB2Ni15KQogCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9hZGRyY29uZi5jIGIvbmV0L2lwdjYvYWRkcmNvbmYuYwppbmRleCA0NTJhODJjLi4zNDUyNDMzIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9hZGRyY29uZi5jCisrKyBiL25ldC9pcHY2L2FkZHJjb25mLmMKQEAgLTgxLDYgKzgxLDcgQEAKICNlbmRpZgogCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CiAKICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KQEAgLTIwOCw5ICsyMDksNyBAQAogfTsKIAogLyogSVB2NiBXaWxkY2FyZCBBZGRyZXNzIGFuZCBMb29wYmFjayBBZGRyZXNzIGRlZmluZWQgYnkgUkZDMjU1MyAqLwotI2lmIDAKIGNvbnN0IHN0cnVjdCBpbjZfYWRkciBpbjZhZGRyX2FueSA9IElONkFERFJfQU5ZX0lOSVQ7Ci0jZW5kaWYKIGNvbnN0IHN0cnVjdCBpbjZfYWRkciBpbjZhZGRyX2xvb3BiYWNrID0gSU42QUREUl9MT09QQkFDS19JTklUOwogCiBzdGF0aWMgdm9pZCBhZGRyY29uZl9kZWxfdGltZXIoc3RydWN0IGluZXQ2X2lmYWRkciAqaWZwKQpAQCAtMjQ2LDYgKzI0NSwzNyBAQAogCWFkZF90aW1lcigmaWZwLT50aW1lcik7CiB9CiAKK3N0YXRpYyBpbnQgc25tcDZfYWxsb2NfZGV2KHN0cnVjdCBpbmV0Nl9kZXYgKmlkZXYpCit7CisJaW50IGVyciA9IC1FTk9NRU07CisKKwlpZiAoIWlkZXYgfHwgIWlkZXYtPmRldikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoc25tcF9taWJfaW5pdCgodm9pZCAqKilpZGV2LT5zdGF0cy5pcHY2LAorCQkJICBzaXplb2Yoc3RydWN0IGlwc3RhdHNfbWliKSwKKwkJCSAgX19hbGlnbm9mX18oc3RydWN0IGlwc3RhdHNfbWliKSkgPCAwKQorCQlnb3RvIGVycl9pcDsKKwlpZiAoc25tcF9taWJfaW5pdCgodm9pZCAqKilpZGV2LT5zdGF0cy5pY21wdjYsCisJCQkgIHNpemVvZihzdHJ1Y3QgaWNtcHY2X21pYiksCisJCQkgIF9fYWxpZ25vZl9fKHN0cnVjdCBpY21wdjZfbWliKSkgPCAwKQorCQlnb3RvIGVycl9pY21wOworCisJcmV0dXJuIDA7CisKK2Vycl9pY21wOgorCXNubXBfbWliX2ZyZWUoKHZvaWQgKiopaWRldi0+c3RhdHMuaXB2Nik7CitlcnJfaXA6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBzbm1wNl9mcmVlX2RldihzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2KQoreworCXNubXBfbWliX2ZyZWUoKHZvaWQgKiopaWRldi0+c3RhdHMuaWNtcHY2KTsKKwlzbm1wX21pYl9mcmVlKCh2b2lkICoqKWlkZXYtPnN0YXRzLmlwdjYpOworCXJldHVybiAwOworfQorCiAvKiBOb2JvZHkgcmVmZXJzIHRvIHRoaXMgZGV2aWNlLCB3ZSBtYXkgZGVzdHJveSBpdC4gKi8KIAogc3RhdGljIHZvaWQgaW42X2Rldl9maW5pc2hfZGVzdHJveV9yY3Uoc3RydWN0IHJjdV9oZWFkICpoZWFkKQpAQCAtMjcxLDYgKzMwMSw4IEBACiAJY2FsbF9yY3UoJmlkZXYtPnJjdSwgaW42X2Rldl9maW5pc2hfZGVzdHJveV9yY3UpOwogfQogCitFWFBPUlRfU1lNQk9MKGluNl9kZXZfZmluaXNoX2Rlc3Ryb3kpOworCiBzdGF0aWMgc3RydWN0IGluZXQ2X2RldiAqIGlwdjZfYWRkX2RldihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBpbmV0Nl9kZXYgKm5kZXY7CkBAIC01MjgsNiArNTYwLDE2IEBACiAKIAlpZmEtPnJ0ID0gcnQ7CiAKKwkvKgorCSAqIHBhcnQgb25lIG9mIFJGQyA0NDI5LCBzZWN0aW9uIDMuMworCSAqIFdlIHNob3VsZCBub3QgY29uZmlndXJlIGFuIGFkZHJlc3MgYXMKKwkgKiBvcHRpbWlzdGljIGlmIHdlIGRvIG5vdCB5ZXQga25vdyB0aGUgbGluaworCSAqIGxheWVyIGFkZHJlc3Mgb2Ygb3VyIG5leGhvcCByb3V0ZXIKKwkgKi8KKworCWlmIChydC0+cnQ2aV9uZXh0aG9wID09IE5VTEwpCisJCWlmYS0+ZmxhZ3MgJj0gfklGQV9GX09QVElNSVNUSUM7CisKIAlpZmEtPmlkZXYgPSBpZGV2OwogCWluNl9kZXZfaG9sZChpZGV2KTsKIAkvKiBGb3IgY2FsbGVyICovCkBAIC03MDQsNiArNzQ2LDcgQEAKIAlpbnQgdG1wX3BsZW47CiAJaW50IHJldCA9IDA7CiAJaW50IG1heF9hZGRyZXNzZXM7CisJdTMyIGFkZHJfZmxhZ3M7CiAKIAl3cml0ZV9sb2NrKCZpZGV2LT5sb2NrKTsKIAlpZiAoaWZ0KSB7CkBAIC03NjEsMTAgKzgwNCwxNyBAQAogCXNwaW5fdW5sb2NrX2JoKCZpZnAtPmxvY2spOwogCiAJd3JpdGVfdW5sb2NrKCZpZGV2LT5sb2NrKTsKKworCWFkZHJfZmxhZ3MgPSBJRkFfRl9URU1QT1JBUlk7CisJLyogc2V0IGluIGFkZHJjb25mX3ByZWZpeF9yY3YoKSAqLworCWlmIChpZnAtPmZsYWdzICYgSUZBX0ZfT1BUSU1JU1RJQykKKwkJYWRkcl9mbGFncyB8PSBJRkFfRl9PUFRJTUlTVElDOworCiAJaWZ0ID0gIW1heF9hZGRyZXNzZXMgfHwKIAkgICAgICBpcHY2X2NvdW50X2FkZHJlc3NlcyhpZGV2KSA8IG1heF9hZGRyZXNzZXMgPwogCQlpcHY2X2FkZF9hZGRyKGlkZXYsICZhZGRyLCB0bXBfcGxlbiwKLQkJCSAgICAgIGlwdjZfYWRkcl90eXBlKCZhZGRyKSZJUFY2X0FERFJfU0NPUEVfTUFTSywgSUZBX0ZfVEVNUE9SQVJZKSA6IE5VTEw7CisJCQkgICAgICBpcHY2X2FkZHJfdHlwZSgmYWRkcikmSVBWNl9BRERSX1NDT1BFX01BU0ssCisJCQkgICAgICBhZGRyX2ZsYWdzKSA6IE5VTEw7CiAJaWYgKCFpZnQgfHwgSVNfRVJSKGlmdCkpIHsKIAkJaW42X2lmYV9wdXQoaWZwKTsKIAkJaW42X2Rldl9wdXQoaWRldik7CkBAIC04OTYsMTMgKzk0NiwxNCBAQAogCQkJICogLSBUZW50YXRpdmUgQWRkcmVzcyAoUkZDMjQ2MiBzZWN0aW9uIDUuNCkKIAkJCSAqICAtIEEgdGVudGF0aXZlIGFkZHJlc3MgaXMgbm90IGNvbnNpZGVyZWQKIAkJCSAqICAgICJhc3NpZ25lZCB0byBhbiBpbnRlcmZhY2UiIGluIHRoZSB0cmFkaXRpb25hbAotCQkJICogICAgc2Vuc2UuCisJCQkgKiAgICBzZW5zZSwgdW5sZXNzIGl0IGlzIGFsc28gZmxhZ2dlZCBhcyBvcHRpbWlzdGljLgogCQkJICogLSBDYW5kaWRhdGUgU291cmNlIEFkZHJlc3MgKHNlY3Rpb24gNCkKIAkJCSAqICAtIEluIGFueSBjYXNlLCBhbnljYXN0IGFkZHJlc3NlcywgbXVsdGljYXN0CiAJCQkgKiAgICBhZGRyZXNzZXMsIGFuZCB0aGUgdW5zcGVjaWZpZWQgYWRkcmVzcyBNVVNUCiAJCQkgKiAgICBOT1QgYmUgaW5jbHVkZWQgaW4gYSBjYW5kaWRhdGUgc2V0LgogCQkJICovCi0JCQlpZiAoaWZhLT5mbGFncyAmIElGQV9GX1RFTlRBVElWRSkKKwkJCWlmICgoaWZhLT5mbGFncyAmIElGQV9GX1RFTlRBVElWRSkgJiYKKwkJCSAgICAoIShpZmEtPmZsYWdzICYgSUZBX0ZfT1BUSU1JU1RJQykpKQogCQkJCWNvbnRpbnVlOwogCQkJaWYgKHVubGlrZWx5KHNjb3JlLmFkZHJfdHlwZSA9PSBJUFY2X0FERFJfQU5ZIHx8CiAJCQkJICAgICBzY29yZS5hZGRyX3R5cGUgJiBJUFY2X0FERFJfTVVMVElDQVNUKSkgewpAQCAtOTYxLDE1ICsxMDEyLDE3IEBACiAJCQkJfQogCQkJfQogCi0JCQkvKiBSdWxlIDM6IEF2b2lkIGRlcHJlY2F0ZWQgYWRkcmVzcyAqLworCQkJLyogUnVsZSAzOiBBdm9pZCBkZXByZWNhdGVkIGFuZCBvcHRpbWlzdGljIGFkZHJlc3NlcyAqLwogCQkJaWYgKGhpc2NvcmUucnVsZSA8IDMpIHsKIAkJCQlpZiAoaXB2Nl9zYWRkcl9wcmVmZXJyZWQoaGlzY29yZS5hZGRyX3R5cGUpIHx8Ci0JCQkJICAgICEoaWZhX3Jlc3VsdC0+ZmxhZ3MgJiBJRkFfRl9ERVBSRUNBVEVEKSkKKwkJCQkgICAoKChpZmFfcmVzdWx0LT5mbGFncyAmCisJCQkJICAgIChJRkFfRl9ERVBSRUNBVEVEfElGQV9GX09QVElNSVNUSUMpKSA9PSAwKSkpCiAJCQkJCWhpc2NvcmUuYXR0cnMgfD0gSVBWNl9TQUREUl9TQ09SRV9QUkVGRVJSRUQ7CiAJCQkJaGlzY29yZS5ydWxlKys7CiAJCQl9CiAJCQlpZiAoaXB2Nl9zYWRkcl9wcmVmZXJyZWQoc2NvcmUuYWRkcl90eXBlKSB8fAotCQkJICAgICEoaWZhLT5mbGFncyAmIElGQV9GX0RFUFJFQ0FURUQpKSB7CisJCQkgICAoKChpZmFfcmVzdWx0LT5mbGFncyAmCisJCQkgICAgKElGQV9GX0RFUFJFQ0FURUR8SUZBX0ZfT1BUSU1JU1RJQykpID09IDApKSkgewogCQkJCXNjb3JlLmF0dHJzIHw9IElQVjZfU0FERFJfU0NPUkVfUFJFRkVSUkVEOwogCQkJCWlmICghKGhpc2NvcmUuYXR0cnMgJiBJUFY2X1NBRERSX1NDT1JFX1BSRUZFUlJFRCkpIHsKIAkJCQkJc2NvcmUucnVsZSA9IDM7CkBAIC0xMTA3LDggKzExNjAsMTAgQEAKIAlyZXR1cm4gaXB2Nl9kZXZfZ2V0X3NhZGRyKGRzdCA/IGlwNl9kc3RfaWRldihkc3QpLT5kZXYgOiBOVUxMLCBkYWRkciwgc2FkZHIpOwogfQogCitFWFBPUlRfU1lNQk9MKGlwdjZfZ2V0X3NhZGRyKTsKIAotaW50IGlwdjZfZ2V0X2xsYWRkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaW42X2FkZHIgKmFkZHIpCitpbnQgaXB2Nl9nZXRfbGxhZGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpbjZfYWRkciAqYWRkciwKKwkJICAgIHVuc2lnbmVkIGNoYXIgYmFubmVkX2ZsYWdzKQogewogCXN0cnVjdCBpbmV0Nl9kZXYgKmlkZXY7CiAJaW50IGVyciA9IC1FQUREUk5PVEFWQUlMOwpAQCAtMTExOSw3ICsxMTc0LDcgQEAKIAogCQlyZWFkX2xvY2tfYmgoJmlkZXYtPmxvY2spOwogCQlmb3IgKGlmcD1pZGV2LT5hZGRyX2xpc3Q7IGlmcDsgaWZwPWlmcC0+aWZfbmV4dCkgewotCQkJaWYgKGlmcC0+c2NvcGUgPT0gSUZBX0xJTksgJiYgIShpZnAtPmZsYWdzJklGQV9GX1RFTlRBVElWRSkpIHsKKwkJCWlmIChpZnAtPnNjb3BlID09IElGQV9MSU5LICYmICEoaWZwLT5mbGFncyAmIGJhbm5lZF9mbGFncykpIHsKIAkJCQlpcHY2X2FkZHJfY29weShhZGRyLCAmaWZwLT5hZGRyKTsKIAkJCQllcnIgPSAwOwogCQkJCWJyZWFrOwpAQCAtMTE2MSw2ICsxMjE2LDggQEAKIAlyZXR1cm4gaWZwICE9IE5VTEw7CiB9CiAKK0VYUE9SVF9TWU1CT0woaXB2Nl9jaGtfYWRkcik7CisKIHN0YXRpYwogaW50IGlwdjZfY2hrX3NhbWVfYWRkcihjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmFkZHIsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CkBAIC0xNjY5LDYgKzE3MjYsMTMgQEAKIAogCQlpZiAoaWZwID09IE5VTEwgJiYgdmFsaWRfbGZ0KSB7CiAJCQlpbnQgbWF4X2FkZHJlc3NlcyA9IGluNl9kZXYtPmNuZi5tYXhfYWRkcmVzc2VzOworCQkJdTMyIGFkZHJfZmxhZ3MgPSAwOworCisjaWZkZWYgQ09ORklHX0lQVjZfT1BUSU1JU1RJQ19EQUQKKwkJCWlmIChpbjZfZGV2LT5jbmYub3B0aW1pc3RpY19kYWQgJiYKKwkJCSAgICAhaXB2Nl9kZXZjb25mLmZvcndhcmRpbmcpCisJCQkJYWRkcl9mbGFncyA9IElGQV9GX09QVElNSVNUSUM7CisjZW5kaWYKIAogCQkJLyogRG8gbm90IGFsbG93IHRvIGNyZWF0ZSB0b28gbXVjaCBvZiBhdXRvY29uZmlndXJlZAogCQkJICogYWRkcmVzc2VzOyB0aGlzIHdvdWxkIGJlIHRvbyBlYXN5IHdheSB0byBjcmFzaCBrZXJuZWwuCkBAIC0xNjc2LDcgKzE3NDAsOCBAQAogCQkJaWYgKCFtYXhfYWRkcmVzc2VzIHx8CiAJCQkgICAgaXB2Nl9jb3VudF9hZGRyZXNzZXMoaW42X2RldikgPCBtYXhfYWRkcmVzc2VzKQogCQkJCWlmcCA9IGlwdjZfYWRkX2FkZHIoaW42X2RldiwgJmFkZHIsIHBpbmZvLT5wcmVmaXhfbGVuLAotCQkJCQkJICAgIGFkZHJfdHlwZSZJUFY2X0FERFJfU0NPUEVfTUFTSywgMCk7CisJCQkJCQkgICAgYWRkcl90eXBlJklQVjZfQUREUl9TQ09QRV9NQVNLLAorCQkJCQkJICAgIGFkZHJfZmxhZ3MpOwogCiAJCQlpZiAoIWlmcCB8fCBJU19FUlIoaWZwKSkgewogCQkJCWluNl9kZXZfcHV0KGluNl9kZXYpOwpAQCAtMTg4NCw2ICsxOTQ5LDExIEBACiAKIAkJYWRkcmNvbmZfcHJlZml4X3JvdXRlKCZpZnAtPmFkZHIsIGlmcC0+cHJlZml4X2xlbiwgZGV2LAogCQkJCSAgICAgIGppZmZpZXNfdG9fY2xvY2tfdCh2YWxpZF9sZnQgKiBIWiksIGZsYWdzKTsKKwkJLyoKKwkJICogTm90ZSB0aGF0IHNlY3Rpb24gMy4xIG9mIFJGQyA0NDI5IGluZGljYXRlcworCQkgKiB0aGF0IHRoZSBPcHRpbWlzdGljIGZsYWcgc2hvdWxkIG5vdCBiZSBzZXQgZm9yCisJCSAqIG1hbnVhbGx5IGNvbmZpZ3VyZWQgYWRkcmVzc2VzCisJCSAqLwogCQlhZGRyY29uZl9kYWRfc3RhcnQoaWZwLCAwKTsKIAkJaW42X2lmYV9wdXQoaWZwKTsKIAkJYWRkcmNvbmZfdmVyaWZ5KDApOwpAQCAtMjA2MCw4ICsyMTMwLDE2IEBACiBzdGF0aWMgdm9pZCBhZGRyY29uZl9hZGRfbGlua2xvY2FsKHN0cnVjdCBpbmV0Nl9kZXYgKmlkZXYsIHN0cnVjdCBpbjZfYWRkciAqYWRkcikKIHsKIAlzdHJ1Y3QgaW5ldDZfaWZhZGRyICogaWZwOworCXUzMiBhZGRyX2ZsYWdzID0gSUZBX0ZfUEVSTUFORU5UOwogCi0JaWZwID0gaXB2Nl9hZGRfYWRkcihpZGV2LCBhZGRyLCA2NCwgSUZBX0xJTkssIElGQV9GX1BFUk1BTkVOVCk7CisjaWZkZWYgQ09ORklHX0lQVjZfT1BUSU1JU1RJQ19EQUQKKwlpZiAoaWRldi0+Y25mLm9wdGltaXN0aWNfZGFkICYmCisJICAgICFpcHY2X2RldmNvbmYuZm9yd2FyZGluZykKKwkJYWRkcl9mbGFncyB8PSBJRkFfRl9PUFRJTUlTVElDOworI2VuZGlmCisKKworCWlmcCA9IGlwdjZfYWRkX2FkZHIoaWRldiwgYWRkciwgNjQsIElGQV9MSU5LLCBhZGRyX2ZsYWdzKTsKIAlpZiAoIUlTX0VSUihpZnApKSB7CiAJCWFkZHJjb25mX3ByZWZpeF9yb3V0ZSgmaWZwLT5hZGRyLCBpZnAtPnByZWZpeF9sZW4sIGlkZXYtPmRldiwgMCwgMCk7CiAJCWFkZHJjb25mX2RhZF9zdGFydChpZnAsIDApOwpAQCAtMjEyOSw3ICsyMjA3LDcgQEAKIHsKIAlzdHJ1Y3QgaW42X2FkZHIgbGxhZGRyOwogCi0JaWYgKCFpcHY2X2dldF9sbGFkZHIobGlua19kZXYsICZsbGFkZHIpKSB7CisJaWYgKCFpcHY2X2dldF9sbGFkZHIobGlua19kZXYsICZsbGFkZHIsIElGQV9GX1RFTlRBVElWRSkpIHsKIAkJYWRkcmNvbmZfYWRkX2xpbmtsb2NhbChpZGV2LCAmbGxhZGRyKTsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtMjI0MCw3ICsyMzE4LDcgQEAKIAkJZGVmYXVsdDoKIAkJCWFkZHJjb25mX2Rldl9jb25maWcoZGV2KTsKIAkJCWJyZWFrOwotCQl9OworCQl9CiAJCWlmIChpZGV2KSB7CiAJCQlpZiAocnVuX3BlbmRpbmcpCiAJCQkJYWRkcmNvbmZfZGFkX3J1bihpZGV2KTsKQEAgLTIyODEsOCArMjM1OSw5IEBACiAJCWJyZWFrOwogCiAJY2FzZSBORVRERVZfQ0hBTkdFTkFNRToKLSNpZmRlZiBDT05GSUdfU1lTQ1RMCiAJCWlmIChpZGV2KSB7CisJCQlzbm1wNl91bnJlZ2lzdGVyX2RldihpZGV2KTsKKyNpZmRlZiBDT05GSUdfU1lTQ1RMCiAJCQlhZGRyY29uZl9zeXNjdGxfdW5yZWdpc3RlcigmaWRldi0+Y25mKTsKIAkJCW5laWdoX3N5c2N0bF91bnJlZ2lzdGVyKGlkZXYtPm5kX3Bhcm1zKTsKIAkJCW5laWdoX3N5c2N0bF9yZWdpc3RlcihkZXYsIGlkZXYtPm5kX3Bhcm1zLApAQCAtMjI5MCwxMCArMjM2OSwxMSBAQAogCQkJCQkgICAgICAmbmRpc2NfaWZpbmZvX3N5c2N0bF9jaGFuZ2UsCiAJCQkJCSAgICAgIE5VTEwpOwogCQkJYWRkcmNvbmZfc3lzY3RsX3JlZ2lzdGVyKGlkZXYsICZpZGV2LT5jbmYpOwotCQl9CiAjZW5kaWYKKwkJCXNubXA2X3JlZ2lzdGVyX2RldihpZGV2KTsKKwkJfQogCQlicmVhazsKLQl9OworCX0KIAogCXJldHVybiBOT1RJRllfT0s7CiB9CkBAIC0yNDc0LDcgKzI1NTQsMTEgQEAKIAl1bnNpZ25lZCBsb25nIHJhbmRfbnVtOwogCXN0cnVjdCBpbmV0Nl9kZXYgKmlkZXYgPSBpZnAtPmlkZXY7CiAKLQlyYW5kX251bSA9IG5ldF9yYW5kb20oKSAlIChpZGV2LT5jbmYucnRyX3NvbGljaXRfZGVsYXkgPyA6IDEpOworCWlmIChpZnAtPmZsYWdzICYgSUZBX0ZfT1BUSU1JU1RJQykKKwkJcmFuZF9udW0gPSAwOworCWVsc2UKKwkJcmFuZF9udW0gPSBuZXRfcmFuZG9tKCkgJSAoaWRldi0+Y25mLnJ0cl9zb2xpY2l0X2RlbGF5ID8gOiAxKTsKKwogCWlmcC0+cHJvYmVzID0gaWRldi0+Y25mLmRhZF90cmFuc21pdHM7CiAJYWRkcmNvbmZfbW9kX3RpbWVyKGlmcCwgQUNfREFELCByYW5kX251bSk7CiB9CkBAIC0yNDk2LDcgKzI1ODAsNyBAQAogCWlmIChkZXYtPmZsYWdzJihJRkZfTk9BUlB8SUZGX0xPT1BCQUNLKSB8fAogCSAgICAhKGlmcC0+ZmxhZ3MmSUZBX0ZfVEVOVEFUSVZFKSB8fAogCSAgICBpZnAtPmZsYWdzICYgSUZBX0ZfTk9EQUQpIHsKLQkJaWZwLT5mbGFncyAmPSB+SUZBX0ZfVEVOVEFUSVZFOworCQlpZnAtPmZsYWdzICY9IH4oSUZBX0ZfVEVOVEFUSVZFfElGQV9GX09QVElNSVNUSUMpOwogCQlzcGluX3VubG9ja19iaCgmaWZwLT5sb2NrKTsKIAkJcmVhZF91bmxvY2tfYmgoJmlkZXYtPmxvY2spOwogCkBAIC0yNTE2LDYgKzI2MDAsMTQgQEAKIAkJYWRkcmNvbmZfZGFkX3N0b3AoaWZwKTsKIAkJcmV0dXJuOwogCX0KKworCS8qCisJICogT3B0aW1pc3RpYyBub2RlcyBjYW4gc3RhcnQgcmVjZWl2aW5nCisJICogRnJhbWVzIHJpZ2h0IGF3YXkKKwkgKi8KKwlpZihpZnAtPmZsYWdzICYgSUZBX0ZfT1BUSU1JU1RJQykKKwkJaXA2X2luc19ydChpZnAtPnJ0KTsKKwogCWFkZHJjb25mX2RhZF9raWNrKGlmcCk7CiAJc3Bpbl91bmxvY2tfYmgoJmlmcC0+bG9jayk7CiBvdXQ6CkBAIC0yNTQwLDcgKzI2MzIsNyBAQAogCQkgKiBEQUQgd2FzIHN1Y2Nlc3NmdWwKIAkJICovCiAKLQkJaWZwLT5mbGFncyAmPSB+SUZBX0ZfVEVOVEFUSVZFOworCQlpZnAtPmZsYWdzICY9IH4oSUZBX0ZfVEVOVEFUSVZFfElGQV9GX09QVElNSVNUSUMpOwogCQlzcGluX3VubG9ja19iaCgmaWZwLT5sb2NrKTsKIAkJcmVhZF91bmxvY2tfYmgoJmlkZXYtPmxvY2spOwogCkBAIC0zMTY0LDcgKzMyNTYsNiBAQAogCiAJc19pZHggPSBjYi0+YXJnc1swXTsKIAlzX2lwX2lkeCA9IGlwX2lkeCA9IGNiLT5hcmdzWzFdOwotCXJlYWRfbG9jaygmZGV2X2Jhc2VfbG9jayk7CiAKIAlmb3IgKGRldiA9IGRldl9iYXNlLCBpZHggPSAwOyBkZXY7IGRldiA9IGRldi0+bmV4dCwgaWR4KyspIHsKIAkJaWYgKGlkeCA8IHNfaWR4KQpAQCAtMzIyNiw3ICszMzE3LDYgQEAKIAkJcmVhZF91bmxvY2tfYmgoJmlkZXYtPmxvY2spOwogCQlpbjZfZGV2X3B1dChpZGV2KTsKIAl9Ci0JcmVhZF91bmxvY2soJmRldl9iYXNlX2xvY2spOwogCWNiLT5hcmdzWzBdID0gaWR4OwogCWNiLT5hcmdzWzFdID0gaXBfaWR4OwogCXJldHVybiBza2ItPmxlbjsKQEAgLTMzNTksNiArMzQ0OSw5IEBACiAjZW5kaWYKIAlhcnJheVtERVZDT05GX1BST1hZX05EUF0gPSBjbmYtPnByb3h5X25kcDsKIAlhcnJheVtERVZDT05GX0FDQ0VQVF9TT1VSQ0VfUk9VVEVdID0gY25mLT5hY2NlcHRfc291cmNlX3JvdXRlOworI2lmZGVmIENPTkZJR19JUFY2X09QVElNSVNUSUNfREFECisJYXJyYXlbREVWQ09ORl9PUFRJTUlTVElDX0RBRF0gPSBjbmYtPm9wdGltaXN0aWNfZGFkOworI2VuZGlmCiB9CiAKIHN0YXRpYyBpbmxpbmUgc2l6ZV90IGluZXQ2X2lmX25sbXNnX3NpemUodm9pZCkKQEAgLTMzNzIsMTQgKzM0NjUsNDQgQEAKIAkJCW5sYV90b3RhbF9zaXplKDQpIC8qIElGTEFfSU5FVDZfRkxBR1MgKi8KIAkJCSsgbmxhX3RvdGFsX3NpemUoc2l6ZW9mKHN0cnVjdCBpZmxhX2NhY2hlaW5mbykpCiAJCQkrIG5sYV90b3RhbF9zaXplKERFVkNPTkZfTUFYICogNCkgLyogSUZMQV9JTkVUNl9DT05GICovCisJCQkrIG5sYV90b3RhbF9zaXplKElQU1RBVFNfTUlCX01BWCAqIDgpIC8qIElGTEFfSU5FVDZfU1RBVFMgKi8KKwkJCSsgbmxhX3RvdGFsX3NpemUoSUNNUDZfTUlCX01BWCAqIDgpIC8qIElGTEFfSU5FVDZfSUNNUDZTVEFUUyAqLwogCQkgKTsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIF9fc25tcDZfZmlsbF9zdGF0cyh1NjQgKnN0YXRzLCB2b2lkICoqbWliLCBpbnQgaXRlbXMsCisJCQkJICAgICAgaW50IGJ5dGVzKQoreworCWludCBpOworCWludCBwYWQgPSBieXRlcyAtIHNpemVvZih1NjQpICogaXRlbXM7CisJQlVHX09OKHBhZCA8IDApOworCisJLyogVXNlIHB1dF91bmFsaWduZWQoKSBiZWNhdXNlIHN0YXRzIG1heSBub3QgYmUgYWxpZ25lZCBmb3IgdTY0LiAqLworCXB1dF91bmFsaWduZWQoaXRlbXMsICZzdGF0c1swXSk7CisJZm9yIChpID0gMTsgaSA8IGl0ZW1zOyBpKyspCisJCXB1dF91bmFsaWduZWQoc25tcF9mb2xkX2ZpZWxkKG1pYiwgaSksICZzdGF0c1tpXSk7CisKKwltZW1zZXQoJnN0YXRzW2l0ZW1zXSwgMCwgcGFkKTsKK30KKworc3RhdGljIHZvaWQgc25tcDZfZmlsbF9zdGF0cyh1NjQgKnN0YXRzLCBzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2LCBpbnQgYXR0cnR5cGUsCisJCQkgICAgIGludCBieXRlcykKK3sKKwlzd2l0Y2goYXR0cnR5cGUpIHsKKwljYXNlIElGTEFfSU5FVDZfU1RBVFM6CisJCV9fc25tcDZfZmlsbF9zdGF0cyhzdGF0cywgKHZvaWQgKiopaWRldi0+c3RhdHMuaXB2NiwgSVBTVEFUU19NSUJfTUFYLCBieXRlcyk7CisJCWJyZWFrOworCWNhc2UgSUZMQV9JTkVUNl9JQ01QNlNUQVRTOgorCQlfX3NubXA2X2ZpbGxfc3RhdHMoc3RhdHMsICh2b2lkICoqKWlkZXYtPnN0YXRzLmljbXB2NiwgSUNNUDZfTUlCX01BWCwgYnl0ZXMpOworCQlicmVhazsKKwl9Cit9CisKIHN0YXRpYyBpbnQgaW5ldDZfZmlsbF9pZmluZm8oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGluZXQ2X2RldiAqaWRldiwKIAkJCSAgICAgdTMyIHBpZCwgdTMyIHNlcSwgaW50IGV2ZW50LCB1bnNpZ25lZCBpbnQgZmxhZ3MpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGlkZXYtPmRldjsKLQlzdHJ1Y3QgbmxhdHRyICpjb25mOworCXN0cnVjdCBubGF0dHIgKm5sYTsKIAlzdHJ1Y3QgaWZpbmZvbXNnICpoZHI7CiAJc3RydWN0IG5sbXNnaGRyICpubGg7CiAJdm9pZCAqcHJvdG9pbmZvOwpAQCAtMzQxOSwxMiArMzU0MiwyMiBAQAogCWNpLnJldHJhbnNfdGltZSA9IGlkZXYtPm5kX3Bhcm1zLT5yZXRyYW5zX3RpbWU7CiAJTkxBX1BVVChza2IsIElGTEFfSU5FVDZfQ0FDSEVJTkZPLCBzaXplb2YoY2kpLCAmY2kpOwogCi0JY29uZiA9IG5sYV9yZXNlcnZlKHNrYiwgSUZMQV9JTkVUNl9DT05GLCBERVZDT05GX01BWCAqIHNpemVvZihzMzIpKTsKLQlpZiAoY29uZiA9PSBOVUxMKQorCW5sYSA9IG5sYV9yZXNlcnZlKHNrYiwgSUZMQV9JTkVUNl9DT05GLCBERVZDT05GX01BWCAqIHNpemVvZihzMzIpKTsKKwlpZiAobmxhID09IE5VTEwpCiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwotCWlwdjZfc3RvcmVfZGV2Y29uZigmaWRldi0+Y25mLCBubGFfZGF0YShjb25mKSwgbmxhX2xlbihjb25mKSk7CisJaXB2Nl9zdG9yZV9kZXZjb25mKCZpZGV2LT5jbmYsIG5sYV9kYXRhKG5sYSksIG5sYV9sZW4obmxhKSk7CiAKLQkvKiBYWFggLSBTdGF0aXN0aWNzL01DIG5vdCBpbXBsZW1lbnRlZCAqLworCS8qIFhYWCAtIE1DIG5vdCBpbXBsZW1lbnRlZCAqLworCisJbmxhID0gbmxhX3Jlc2VydmUoc2tiLCBJRkxBX0lORVQ2X1NUQVRTLCBJUFNUQVRTX01JQl9NQVggKiBzaXplb2YodTY0KSk7CisJaWYgKG5sYSA9PSBOVUxMKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKwlzbm1wNl9maWxsX3N0YXRzKG5sYV9kYXRhKG5sYSksIGlkZXYsIElGTEFfSU5FVDZfU1RBVFMsIG5sYV9sZW4obmxhKSk7CisKKwlubGEgPSBubGFfcmVzZXJ2ZShza2IsIElGTEFfSU5FVDZfSUNNUDZTVEFUUywgSUNNUDZfTUlCX01BWCAqIHNpemVvZih1NjQpKTsKKwlpZiAobmxhID09IE5VTEwpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCXNubXA2X2ZpbGxfc3RhdHMobmxhX2RhdGEobmxhKSwgaWRldiwgSUZMQV9JTkVUNl9JQ01QNlNUQVRTLCBubGFfbGVuKG5sYSkpOwogCiAJbmxhX25lc3RfZW5kKHNrYiwgcHJvdG9pbmZvKTsKIAlyZXR1cm4gbmxtc2dfZW5kKHNrYiwgbmxoKTsKQEAgLTM1NTAsMzAgKzM2ODMsMjAgQEAKIAkJcnRubF9zZXRfc2tfZXJyKFJUTkxHUlBfSVBWNl9QUkVGSVgsIGVycik7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcnRuZXRsaW5rX2xpbmsgaW5ldDZfcnRuZXRsaW5rX3RhYmxlW1JUTV9OUl9NU0dUWVBFU10gPSB7Ci0JW1JUTV9HRVRMSU5LIC0gUlRNX0JBU0VdID0geyAuZHVtcGl0CT0gaW5ldDZfZHVtcF9pZmluZm8sIH0sCi0JW1JUTV9ORVdBRERSIC0gUlRNX0JBU0VdID0geyAuZG9pdAk9IGluZXQ2X3J0bV9uZXdhZGRyLCB9LAotCVtSVE1fREVMQUREUiAtIFJUTV9CQVNFXSA9IHsgLmRvaXQJPSBpbmV0Nl9ydG1fZGVsYWRkciwgfSwKLQlbUlRNX0dFVEFERFIgLSBSVE1fQkFTRV0gPSB7IC5kb2l0CT0gaW5ldDZfcnRtX2dldGFkZHIsCi0JCQkJICAgICAuZHVtcGl0CT0gaW5ldDZfZHVtcF9pZmFkZHIsIH0sCi0JW1JUTV9HRVRNVUxUSUNBU1QgLSBSVE1fQkFTRV0gPSB7IC5kdW1waXQgPSBpbmV0Nl9kdW1wX2lmbWNhZGRyLCB9LAotCVtSVE1fR0VUQU5ZQ0FTVCAtIFJUTV9CQVNFXSA9IHsgLmR1bXBpdAk9IGluZXQ2X2R1bXBfaWZhY2FkZHIsIH0sCi0JW1JUTV9ORVdST1VURSAtIFJUTV9CQVNFXSA9IHsgLmRvaXQJPSBpbmV0Nl9ydG1fbmV3cm91dGUsIH0sCi0JW1JUTV9ERUxST1VURSAtIFJUTV9CQVNFXSA9IHsgLmRvaXQJPSBpbmV0Nl9ydG1fZGVscm91dGUsIH0sCi0JW1JUTV9HRVRST1VURSAtIFJUTV9CQVNFXSA9IHsgLmRvaXQJPSBpbmV0Nl9ydG1fZ2V0cm91dGUsCi0JCQkJICAgICAgLmR1bXBpdAk9IGluZXQ2X2R1bXBfZmliLCB9LAotI2lmZGVmIENPTkZJR19JUFY2X01VTFRJUExFX1RBQkxFUwotCVtSVE1fR0VUUlVMRSAgLSBSVE1fQkFTRV0gPSB7IC5kdW1waXQgICA9IGZpYjZfcnVsZXNfZHVtcCwgICB9LAotI2VuZGlmCi19OwotCiBzdGF0aWMgdm9pZCBfX2lwdjZfaWZhX25vdGlmeShpbnQgZXZlbnQsIHN0cnVjdCBpbmV0Nl9pZmFkZHIgKmlmcCkKIHsKIAlpbmV0Nl9pZmFfbm90aWZ5KGV2ZW50ID8gOiBSVE1fTkVXQUREUiwgaWZwKTsKIAogCXN3aXRjaCAoZXZlbnQpIHsKIAljYXNlIFJUTV9ORVdBRERSOgotCQlpcDZfaW5zX3J0KGlmcC0+cnQpOworCQkvKgorCQkgKiBJZiB0aGUgYWRkcmVzcyB3YXMgb3B0aW1pc3RpYworCQkgKiB3ZSBpbnNlcnRlZCB0aGUgcm91dGUgYXQgdGhlIHN0YXJ0IG9mCisJCSAqIG91ciBEQUQgcHJvY2Vzcywgc28gd2UgZG9uJ3QgbmVlZAorCQkgKiB0byBkbyBpdCBhZ2FpbgorCQkgKi8KKwkJaWYgKCEoaWZwLT5ydC0+cnQ2aV9ub2RlKSkKKwkJCWlwNl9pbnNfcnQoaWZwLT5ydCk7CiAJCWlmIChpZnAtPmlkZXYtPmNuZi5mb3J3YXJkaW5nKQogCQkJYWRkcmNvbmZfam9pbl9hbnljYXN0KGlmcCk7CiAJCWJyZWFrOwpAQCAtMzg5NCw2ICs0MDE3LDE3IEBACiAJCQkubW9kZQkJPQkwNjQ0LAogCQkJLnByb2NfaGFuZGxlcgk9CSZwcm9jX2RvaW50dmVjLAogCQl9LAorI2lmZGVmIENPTkZJR19JUFY2X09QVElNSVNUSUNfREFECisJCXsKKwkJCS5jdGxfbmFtZQk9CUNUTF9VTk5VTUJFUkVELAorCQkJLnByb2NuYW1lICAgICAgID0gICAgICAgIm9wdGltaXN0aWNfZGFkIiwKKwkJCS5kYXRhICAgICAgICAgICA9ICAgICAgICZpcHY2X2RldmNvbmYub3B0aW1pc3RpY19kYWQsCisJCQkubWF4bGVuICAgICAgICAgPSAgICAgICBzaXplb2YoaW50KSwKKwkJCS5tb2RlICAgICAgICAgICA9ICAgICAgIDA2NDQsCisJCQkucHJvY19oYW5kbGVyICAgPSAgICAgICAmcHJvY19kb2ludHZlYywKKworCQl9LAorI2VuZGlmCiAJCXsKIAkJCS5jdGxfbmFtZQk9CTAsCS8qIHNlbnRpbmVsICovCiAJCX0KQEAgLTQwMjEsMTEgKzQxNTUsMTUgQEAKIAlyZXR1cm4gYXRvbWljX25vdGlmaWVyX2NoYWluX3JlZ2lzdGVyKCZpbmV0NmFkZHJfY2hhaW4sIG5iKTsKIH0KIAorRVhQT1JUX1NZTUJPTChyZWdpc3Rlcl9pbmV0NmFkZHJfbm90aWZpZXIpOworCiBpbnQgdW5yZWdpc3Rlcl9pbmV0NmFkZHJfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKIHsKIAlyZXR1cm4gYXRvbWljX25vdGlmaWVyX2NoYWluX3VucmVnaXN0ZXIoJmluZXQ2YWRkcl9jaGFpbixuYik7CiB9CiAKK0VYUE9SVF9TWU1CT0wodW5yZWdpc3Rlcl9pbmV0NmFkZHJfbm90aWZpZXIpOworCiAvKgogICoJSW5pdCAvIGNsZWFudXAgY29kZQogICovCkBAIC00MDY0LDcgKzQyMDIsMTggQEAKIAlyZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJmlwdjZfZGV2X25vdGYpOwogCiAJYWRkcmNvbmZfdmVyaWZ5KDApOwotCXJ0bmV0bGlua19saW5rc1tQRl9JTkVUNl0gPSBpbmV0Nl9ydG5ldGxpbmtfdGFibGU7CisKKwllcnIgPSBfX3J0bmxfcmVnaXN0ZXIoUEZfSU5FVDYsIFJUTV9HRVRMSU5LLCBOVUxMLCBpbmV0Nl9kdW1wX2lmaW5mbyk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyb3V0OworCisJLyogT25seSB0aGUgZmlyc3QgY2FsbCB0byBfX3J0bmxfcmVnaXN0ZXIgY2FuIGZhaWwgKi8KKwlfX3J0bmxfcmVnaXN0ZXIoUEZfSU5FVDYsIFJUTV9ORVdBRERSLCBpbmV0Nl9ydG1fbmV3YWRkciwgTlVMTCk7CisJX19ydG5sX3JlZ2lzdGVyKFBGX0lORVQ2LCBSVE1fREVMQUREUiwgaW5ldDZfcnRtX2RlbGFkZHIsIE5VTEwpOworCV9fcnRubF9yZWdpc3RlcihQRl9JTkVUNiwgUlRNX0dFVEFERFIsIGluZXQ2X3J0bV9nZXRhZGRyLCBpbmV0Nl9kdW1wX2lmYWRkcik7CisJX19ydG5sX3JlZ2lzdGVyKFBGX0lORVQ2LCBSVE1fR0VUTVVMVElDQVNULCBOVUxMLCBpbmV0Nl9kdW1wX2lmbWNhZGRyKTsKKwlfX3J0bmxfcmVnaXN0ZXIoUEZfSU5FVDYsIFJUTV9HRVRBTllDQVNULCBOVUxMLCBpbmV0Nl9kdW1wX2lmYWNhZGRyKTsKKwogI2lmZGVmIENPTkZJR19TWVNDVEwKIAlhZGRyY29uZl9zeXNjdGwuc3lzY3RsX2hlYWRlciA9CiAJCXJlZ2lzdGVyX3N5c2N0bF90YWJsZShhZGRyY29uZl9zeXNjdGwuYWRkcmNvbmZfcm9vdF9kaXIpOwpAQCAtNDA3Miw2ICs0MjIxLDEwIEBACiAjZW5kaWYKIAogCXJldHVybiAwOworZXJyb3V0OgorCXVucmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZpcHY2X2Rldl9ub3RmKTsKKworCXJldHVybiBlcnI7CiB9CiAKIHZvaWQgX19leGl0IGFkZHJjb25mX2NsZWFudXAodm9pZCkKQEAgLTQwODMsNyArNDIzNiw2IEBACiAKIAl1bnJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmaXB2Nl9kZXZfbm90Zik7CiAKLQlydG5ldGxpbmtfbGlua3NbUEZfSU5FVDZdID0gTlVMTDsKICNpZmRlZiBDT05GSUdfU1lTQ1RMCiAJYWRkcmNvbmZfc3lzY3RsX3VucmVnaXN0ZXIoJmlwdjZfZGV2Y29uZl9kZmx0KTsKIAlhZGRyY29uZl9zeXNjdGxfdW5yZWdpc3RlcigmaXB2Nl9kZXZjb25mKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2FmX2luZXQ2LmMgYi9uZXQvaXB2Ni9hZl9pbmV0Ni5jCmluZGV4IDVjYWMxNGEuLjE4Y2I5MjggMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2FmX2luZXQ2LmMKKysrIGIvbmV0L2lwdjYvYWZfaW5ldDYuYwpAQCAtOTgsNiArOTgsMTEgQEAKIAlpbnQgdHJ5X2xvYWRpbmdfbW9kdWxlID0gMDsKIAlpbnQgZXJyOwogCisJaWYgKHNvY2stPnR5cGUgIT0gU09DS19SQVcgJiYKKwkgICAgc29jay0+dHlwZSAhPSBTT0NLX0RHUkFNICYmCisJICAgICFpbmV0X2VoYXNoX3NlY3JldCkKKwkJYnVpbGRfZWhhc2hfc2VjcmV0KCk7CisKIAkvKiBMb29rIGZvciB0aGUgcmVxdWVzdGVkIHR5cGUvcHJvdG9jb2wgcGFpci4gKi8KIAlhbnN3ZXIgPSBOVUxMOwogbG9va3VwX3Byb3RvY29sOgpAQCAtMzQ5LDYgKzM1NCw4IEBACiAJcmV0dXJuIGVycjsKIH0KIAorRVhQT1JUX1NZTUJPTChpbmV0Nl9iaW5kKTsKKwogaW50IGluZXQ2X3JlbGVhc2Uoc3RydWN0IHNvY2tldCAqc29jaykKIHsKIAlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKQEAgLTM2NSw2ICszNzIsOCBAQAogCXJldHVybiBpbmV0X3JlbGVhc2Uoc29jayk7CiB9CiAKK0VYUE9SVF9TWU1CT0woaW5ldDZfcmVsZWFzZSk7CisKIGludCBpbmV0Nl9kZXN0cm95X3NvY2soc3RydWN0IHNvY2sgKnNrKQogewogCXN0cnVjdCBpcHY2X3BpbmZvICpucCA9IGluZXQ2X3NrKHNrKTsKQEAgLTQyOCw2ICs0MzcsOCBAQAogCXJldHVybigwKTsKIH0KIAorRVhQT1JUX1NZTUJPTChpbmV0Nl9nZXRuYW1lKTsKKwogaW50IGluZXQ2X2lvY3RsKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewogCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOwpAQCAtNDM3LDYgKzQ0OCw5IEBACiAJY2FzZSBTSU9DR1NUQU1QOgogCQlyZXR1cm4gc29ja19nZXRfdGltZXN0YW1wKHNrLCAoc3RydWN0IHRpbWV2YWwgX191c2VyICopYXJnKTsKIAorCWNhc2UgU0lPQ0dTVEFNUE5TOgorCQlyZXR1cm4gc29ja19nZXRfdGltZXN0YW1wbnMoc2ssIChzdHJ1Y3QgdGltZXNwZWMgX191c2VyICopYXJnKTsKKwogCWNhc2UgU0lPQ0FERFJUOgogCWNhc2UgU0lPQ0RFTFJUOgogCkBAIC00NTcsNiArNDcxLDggQEAKIAlyZXR1cm4oMCk7CiB9CiAKK0VYUE9SVF9TWU1CT0woaW5ldDZfaW9jdGwpOworCiBjb25zdCBzdHJ1Y3QgcHJvdG9fb3BzIGluZXQ2X3N0cmVhbV9vcHMgPSB7CiAJLmZhbWlseQkJICAgPSBQRl9JTkVUNiwKIAkub3duZXIJCSAgID0gVEhJU19NT0RVTEUsCkBAIC02MDMsNiArNjE5LDggQEAKIAlnb3RvIG91dDsKIH0KIAorRVhQT1JUX1NZTUJPTChpbmV0Nl9yZWdpc3Rlcl9wcm90b3N3KTsKKwogdm9pZAogaW5ldDZfdW5yZWdpc3Rlcl9wcm90b3N3KHN0cnVjdCBpbmV0X3Byb3Rvc3cgKnApCiB7CkBAIC02MTksNiArNjM3LDggQEAKIAl9CiB9CiAKK0VYUE9SVF9TWU1CT0woaW5ldDZfdW5yZWdpc3Rlcl9wcm90b3N3KTsKKwogaW50IGluZXQ2X3NrX3JlYnVpbGRfaGVhZGVyKHN0cnVjdCBzb2NrICpzaykKIHsKIAlpbnQgZXJyOwpAQCAtNjc4LDcgKzY5OCw4IEBACiAJaWYgKG5wLT5yeG9wdC5hbGwpIHsKIAkJaWYgKChvcHQtPmhvcCAmJiAobnAtPnJ4b3B0LmJpdHMuaG9wb3B0cyB8fAogCQkJCSAgbnAtPnJ4b3B0LmJpdHMub2hvcG9wdHMpKSB8fAotCQkgICAgKChJUFY2X0ZMT1dJTkZPX01BU0sgJiAqKF9fYmUzMiopc2tiLT5uaC5yYXcpICYmCisJCSAgICAoKElQVjZfRkxPV0lORk9fTUFTSyAmCisJCSAgICAgICooX19iZTMyICopc2tiX25ldHdvcmtfaGVhZGVyKHNrYikpICYmCiAJCSAgICAgbnAtPnJ4b3B0LmJpdHMucnhmbG93KSB8fAogCQkgICAgKG9wdC0+c3JjcnQgJiYgKG5wLT5yeG9wdC5iaXRzLnNyY3J0IHx8CiAJCSAgICAgbnAtPnJ4b3B0LmJpdHMub3NyY3J0KSkgfHwKQEAgLTY5MSw2MSArNzEyLDI4IEBACiAKIEVYUE9SVF9TWU1CT0xfR1BMKGlwdjZfb3B0X2FjY2VwdGVkKTsKIAotaW50Ci1zbm1wNl9taWJfaW5pdCh2b2lkICpwdHJbMl0sIHNpemVfdCBtaWJzaXplLCBzaXplX3QgbWliYWxpZ24pCi17Ci0JaWYgKHB0ciA9PSBOVUxMKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXB0clswXSA9IF9fYWxsb2NfcGVyY3B1KG1pYnNpemUpOwotCWlmICghcHRyWzBdKQotCQlnb3RvIGVycjA7Ci0KLQlwdHJbMV0gPSBfX2FsbG9jX3BlcmNwdShtaWJzaXplKTsKLQlpZiAoIXB0clsxXSkKLQkJZ290byBlcnIxOwotCi0JcmV0dXJuIDA7Ci0KLWVycjE6Ci0JZnJlZV9wZXJjcHUocHRyWzBdKTsKLQlwdHJbMF0gPSBOVUxMOwotZXJyMDoKLQlyZXR1cm4gLUVOT01FTTsKLX0KLQotdm9pZAotc25tcDZfbWliX2ZyZWUodm9pZCAqcHRyWzJdKQotewotCWlmIChwdHIgPT0gTlVMTCkKLQkJcmV0dXJuOwotCWZyZWVfcGVyY3B1KHB0clswXSk7Ci0JZnJlZV9wZXJjcHUocHRyWzFdKTsKLQlwdHJbMF0gPSBwdHJbMV0gPSBOVUxMOwotfQotCiBzdGF0aWMgaW50IF9faW5pdCBpbml0X2lwdjZfbWlicyh2b2lkKQogewotCWlmIChzbm1wNl9taWJfaW5pdCgodm9pZCAqKilpcHY2X3N0YXRpc3RpY3MsIHNpemVvZiAoc3RydWN0IGlwc3RhdHNfbWliKSwKLQkJCSAgIF9fYWxpZ25vZl9fKHN0cnVjdCBpcHN0YXRzX21pYikpIDwgMCkKKwlpZiAoc25tcF9taWJfaW5pdCgodm9pZCAqKilpcHY2X3N0YXRpc3RpY3MsIHNpemVvZiAoc3RydWN0IGlwc3RhdHNfbWliKSwKKwkJCSAgX19hbGlnbm9mX18oc3RydWN0IGlwc3RhdHNfbWliKSkgPCAwKQogCQlnb3RvIGVycl9pcF9taWI7Ci0JaWYgKHNubXA2X21pYl9pbml0KCh2b2lkICoqKWljbXB2Nl9zdGF0aXN0aWNzLCBzaXplb2YgKHN0cnVjdCBpY21wdjZfbWliKSwKLQkJCSAgIF9fYWxpZ25vZl9fKHN0cnVjdCBpY21wdjZfbWliKSkgPCAwKQorCWlmIChzbm1wX21pYl9pbml0KCh2b2lkICoqKWljbXB2Nl9zdGF0aXN0aWNzLCBzaXplb2YgKHN0cnVjdCBpY21wdjZfbWliKSwKKwkJCSAgX19hbGlnbm9mX18oc3RydWN0IGljbXB2Nl9taWIpKSA8IDApCiAJCWdvdG8gZXJyX2ljbXBfbWliOwotCWlmIChzbm1wNl9taWJfaW5pdCgodm9pZCAqKil1ZHBfc3RhdHNfaW42LCBzaXplb2YgKHN0cnVjdCB1ZHBfbWliKSwKLQkJCSAgIF9fYWxpZ25vZl9fKHN0cnVjdCB1ZHBfbWliKSkgPCAwKQorCWlmIChzbm1wX21pYl9pbml0KCh2b2lkICoqKXVkcF9zdGF0c19pbjYsIHNpemVvZiAoc3RydWN0IHVkcF9taWIpLAorCQkJICBfX2FsaWdub2ZfXyhzdHJ1Y3QgdWRwX21pYikpIDwgMCkKIAkJZ290byBlcnJfdWRwX21pYjsKLQlpZiAoc25tcDZfbWliX2luaXQoKHZvaWQgKiopdWRwbGl0ZV9zdGF0c19pbjYsIHNpemVvZiAoc3RydWN0IHVkcF9taWIpLAotCQkJICAgX19hbGlnbm9mX18oc3RydWN0IHVkcF9taWIpKSA8IDApCisJaWYgKHNubXBfbWliX2luaXQoKHZvaWQgKiopdWRwbGl0ZV9zdGF0c19pbjYsIHNpemVvZiAoc3RydWN0IHVkcF9taWIpLAorCQkJICBfX2FsaWdub2ZfXyhzdHJ1Y3QgdWRwX21pYikpIDwgMCkKIAkJZ290byBlcnJfdWRwbGl0ZV9taWI7CiAJcmV0dXJuIDA7CiAKIGVycl91ZHBsaXRlX21pYjoKLQlzbm1wNl9taWJfZnJlZSgodm9pZCAqKil1ZHBfc3RhdHNfaW42KTsKKwlzbm1wX21pYl9mcmVlKCh2b2lkICoqKXVkcF9zdGF0c19pbjYpOwogZXJyX3VkcF9taWI6Ci0Jc25tcDZfbWliX2ZyZWUoKHZvaWQgKiopaWNtcHY2X3N0YXRpc3RpY3MpOworCXNubXBfbWliX2ZyZWUoKHZvaWQgKiopaWNtcHY2X3N0YXRpc3RpY3MpOwogZXJyX2ljbXBfbWliOgotCXNubXA2X21pYl9mcmVlKCh2b2lkICoqKWlwdjZfc3RhdGlzdGljcyk7CisJc25tcF9taWJfZnJlZSgodm9pZCAqKilpcHY2X3N0YXRpc3RpY3MpOwogZXJyX2lwX21pYjoKIAlyZXR1cm4gLUVOT01FTTsKIApAQCAtNzUzLDEwICs3NDEsMTAgQEAKIAogc3RhdGljIHZvaWQgY2xlYW51cF9pcHY2X21pYnModm9pZCkKIHsKLQlzbm1wNl9taWJfZnJlZSgodm9pZCAqKilpcHY2X3N0YXRpc3RpY3MpOwotCXNubXA2X21pYl9mcmVlKCh2b2lkICoqKWljbXB2Nl9zdGF0aXN0aWNzKTsKLQlzbm1wNl9taWJfZnJlZSgodm9pZCAqKil1ZHBfc3RhdHNfaW42KTsKLQlzbm1wNl9taWJfZnJlZSgodm9pZCAqKil1ZHBsaXRlX3N0YXRzX2luNik7CisJc25tcF9taWJfZnJlZSgodm9pZCAqKilpcHY2X3N0YXRpc3RpY3MpOworCXNubXBfbWliX2ZyZWUoKHZvaWQgKiopaWNtcHY2X3N0YXRpc3RpY3MpOworCXNubXBfbWliX2ZyZWUoKHZvaWQgKiopdWRwX3N0YXRzX2luNik7CisJc25tcF9taWJfZnJlZSgodm9pZCAqKil1ZHBsaXRlX3N0YXRzX2luNik7CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IGluZXQ2X2luaXQodm9pZCkKQEAgLTkyOSw2ICs5MTcsOCBAQAogewogCS8qIEZpcnN0IG9mIGFsbCBkaXNhbGxvdyBuZXcgc29ja2V0cyBjcmVhdGlvbi4gKi8KIAlzb2NrX3VucmVnaXN0ZXIoUEZfSU5FVDYpOworCS8qIERpc2FsbG93IGFueSBmdXJ0aGVyIG5ldGxpbmsgbWVzc2FnZXMgKi8KKwlydG5sX3VucmVnaXN0ZXJfYWxsKFBGX0lORVQ2KTsKIAogCS8qIENsZWFudXAgY29kZSBwYXJ0cy4gKi8KIAlpcHY2X3BhY2tldF9jbGVhbnVwKCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9haDYuYyBiL25ldC9pcHY2L2FoNi5jCmluZGV4IGRjNjhiNzIuLmI2OTZjODQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2FoNi5jCisrKyBiL25ldC9pcHY2L2FoNi5jCkBAIC0yMzgsOCArMjM4LDggQEAKIAl0b3BfaXBoID0gKHN0cnVjdCBpcHY2aGRyICopc2tiLT5kYXRhOwogCXRvcF9pcGgtPnBheWxvYWRfbGVuID0gaHRvbnMoc2tiLT5sZW4gLSBzaXplb2YoKnRvcF9pcGgpKTsKIAotCW5leHRoZHIgPSAqc2tiLT5uaC5yYXc7Ci0JKnNrYi0+bmgucmF3ID0gSVBQUk9UT19BSDsKKwluZXh0aGRyID0gKnNrYl9uZXR3b3JrX2hlYWRlcihza2IpOworCSpza2JfbmV0d29ya19oZWFkZXIoc2tiKSA9IElQUFJPVE9fQUg7CiAKIAkvKiBXaGVuIHRoZXJlIGFyZSBubyBleHRlbnNpb24gaGVhZGVycywgd2Ugb25seSBuZWVkIHRvIHNhdmUgdGhlIGZpcnN0CiAJICogOCBieXRlcyBvZiB0aGUgYmFzZSBJUCBoZWFkZXIuCkBAIC0yNDcsNyArMjQ3LDcgQEAKIAltZW1jcHkodG1wX2Jhc2UsIHRvcF9pcGgsIHNpemVvZih0bXBfYmFzZSkpOwogCiAJdG1wX2V4dCA9IE5VTEw7Ci0JZXh0bGVuID0gc2tiLT5oLnJhdyAtICh1bnNpZ25lZCBjaGFyICopKHRvcF9pcGggKyAxKTsKKwlleHRsZW4gPSBza2JfdHJhbnNwb3J0X29mZnNldChza2IpICsgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKTsKIAlpZiAoZXh0bGVuKSB7CiAJCWV4dGxlbiArPSBzaXplb2YoKnRtcF9leHQpOwogCQl0bXBfZXh0ID0ga21hbGxvYyhleHRsZW4sIEdGUF9BVE9NSUMpOwpAQCAtMjY4LDcgKzI2OCw3IEBACiAJCQlnb3RvIGVycm9yX2ZyZWVfaXBoOwogCX0KIAotCWFoID0gKHN0cnVjdCBpcF9hdXRoX2hkciAqKXNrYi0+aC5yYXc7CisJYWggPSAoc3RydWN0IGlwX2F1dGhfaGRyICopc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKIAlhaC0+bmV4dGhkciA9IG5leHRoZHI7CiAKIAl0b3BfaXBoLT5wcmlvcml0eSAgICA9IDA7CkBAIC0zMTYsOCArMzE2LDggQEAKIAkgKgogCSAqIFRvIGVyYXNlIEFIOgogCSAqIEtlZXBpbmcgY29weSBvZiBjbGVhcmVkIGhlYWRlcnMuIEFmdGVyIEFIIHByb2Nlc3NpbmcsCi0JICogTW92aW5nIHRoZSBwb2ludGVyIG9mIHNrYi0+bmgucmF3IGJ5IHVzaW5nIHNrYl9wdWxsIGFzIGxvbmcgYXMgQUgKLQkgKiBoZWFkZXIgbGVuZ3RoLiBUaGVuIGNvcHkgYmFjayB0aGUgY29weSBhcyBsb25nIGFzIGhkcl9sZW4KKwkgKiBNb3ZpbmcgdGhlIHBvaW50ZXIgb2Ygc2tiLT5uZXR3b3JrX2hlYWRlciBieSB1c2luZyBza2JfcHVsbCBhcyBsb25nCisJICogYXMgQUggaGVhZGVyIGxlbmd0aC4gVGhlbiBjb3B5IGJhY2sgdGhlIGNvcHkgYXMgbG9uZyBhcyBoZHJfbGVuCiAJICogSWYgZGVzdGluYXRpb24gaGVhZGVyIGZvbGxvd2luZyBBSCBleGlzdHMsIGNvcHkgaXQgaW50byBhZnRlciBbRXh0Ml0uCiAJICoKIAkgKiB8PD58W0lQdjZdW0V4dDFdW0V4dDJdW0Rlc3RdW1BheWxvYWRdCkBAIC0zMjUsNiArMzI1LDcgQEAKIAkgKi8KIAogCXN0cnVjdCBpcHY2X2F1dGhfaGRyICphaDsKKwlzdHJ1Y3QgaXB2NmhkciAqaXA2aDsKIAlzdHJ1Y3QgYWhfZGF0YSAqYWhwOwogCXVuc2lnbmVkIGNoYXIgKnRtcF9oZHIgPSBOVUxMOwogCXUxNiBoZHJfbGVuOwpAQCAtMzQxLDcgKzM0Miw3IEBACiAJICAgIHBza2JfZXhwYW5kX2hlYWQoc2tiLCAwLCAwLCBHRlBfQVRPTUlDKSkKIAkJZ290byBvdXQ7CiAKLQloZHJfbGVuID0gc2tiLT5kYXRhIC0gc2tiLT5uaC5yYXc7CisJaGRyX2xlbiA9IHNrYi0+ZGF0YSAtIHNrYl9uZXR3b3JrX2hlYWRlcihza2IpOwogCWFoID0gKHN0cnVjdCBpcHY2X2F1dGhfaGRyKilza2ItPmRhdGE7CiAJYWhwID0geC0+ZGF0YTsKIAluZXh0aGRyID0gYWgtPm5leHRoZHI7CkBAIC0zNTQsMTYgKzM1NSwxNyBAQAogCWlmICghcHNrYl9tYXlfcHVsbChza2IsIGFoX2hsZW4pKQogCQlnb3RvIG91dDsKIAotCXRtcF9oZHIgPSBrbWVtZHVwKHNrYi0+bmgucmF3LCBoZHJfbGVuLCBHRlBfQVRPTUlDKTsKKwl0bXBfaGRyID0ga21lbWR1cChza2JfbmV0d29ya19oZWFkZXIoc2tiKSwgaGRyX2xlbiwgR0ZQX0FUT01JQyk7CiAJaWYgKCF0bXBfaGRyKQogCQlnb3RvIG91dDsKLQlpZiAoaXB2Nl9jbGVhcl9tdXRhYmxlX29wdGlvbnMoc2tiLT5uaC5pcHY2aCwgaGRyX2xlbiwgWEZSTV9QT0xJQ1lfSU4pKQorCWlwNmggPSBpcHY2X2hkcihza2IpOworCWlmIChpcHY2X2NsZWFyX211dGFibGVfb3B0aW9ucyhpcDZoLCBoZHJfbGVuLCBYRlJNX1BPTElDWV9JTikpCiAJCWdvdG8gZnJlZV9vdXQ7Ci0Jc2tiLT5uaC5pcHY2aC0+cHJpb3JpdHkgICAgPSAwOwotCXNrYi0+bmguaXB2NmgtPmZsb3dfbGJsWzBdID0gMDsKLQlza2ItPm5oLmlwdjZoLT5mbG93X2xibFsxXSA9IDA7Ci0Jc2tiLT5uaC5pcHY2aC0+Zmxvd19sYmxbMl0gPSAwOwotCXNrYi0+bmguaXB2NmgtPmhvcF9saW1pdCAgID0gMDsKKwlpcDZoLT5wcmlvcml0eSAgICA9IDA7CisJaXA2aC0+Zmxvd19sYmxbMF0gPSAwOworCWlwNmgtPmZsb3dfbGJsWzFdID0gMDsKKwlpcDZoLT5mbG93X2xibFsyXSA9IDA7CisJaXA2aC0+aG9wX2xpbWl0ICAgPSAwOwogCiAJewogCQl1OCBhdXRoX2RhdGFbTUFYX0FIX0FVVEhfTEVOXTsKQEAgLTM4Miw3ICszODQsOSBAQAogCQl9CiAJfQogCi0Jc2tiLT5oLnJhdyA9IG1lbWNweShza2ItPm5oLnJhdyArPSBhaF9obGVuLCB0bXBfaGRyLCBoZHJfbGVuKTsKKwlza2ItPm5ldHdvcmtfaGVhZGVyICs9IGFoX2hsZW47CisJbWVtY3B5KHNrYl9uZXR3b3JrX2hlYWRlcihza2IpLCB0bXBfaGRyLCBoZHJfbGVuKTsKKwlza2ItPnRyYW5zcG9ydF9oZWFkZXIgPSBza2ItPm5ldHdvcmtfaGVhZGVyOwogCV9fc2tiX3B1bGwoc2tiLCBhaF9obGVuICsgaGRyX2xlbik7CiAKIAlrZnJlZSh0bXBfaGRyKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2RhdGFncmFtLmMgYi9uZXQvaXB2Ni9kYXRhZ3JhbS5jCmluZGV4IDNiNGU4ZGMuLjQwM2VlZTYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2RhdGFncmFtLmMKKysrIGIvbmV0L2lwdjYvZGF0YWdyYW0uYwpAQCAtMjA5LDcgKzIwOSw3IEBACiAJCSAgICAgX19iZTE2IHBvcnQsIHUzMiBpbmZvLCB1OCAqcGF5bG9hZCkKIHsKIAlzdHJ1Y3QgaXB2Nl9waW5mbyAqbnAgID0gaW5ldDZfc2soc2spOwotCXN0cnVjdCBpY21wNmhkciAqaWNtcGggPSAoc3RydWN0IGljbXA2aGRyICopc2tiLT5oLnJhdzsKKwlzdHJ1Y3QgaWNtcDZoZHIgKmljbXBoID0gaWNtcDZfaGRyKHNrYik7CiAJc3RydWN0IHNvY2tfZXh0ZXJyX3NrYiAqc2VycjsKIAogCWlmICghbnAtPnJlY3ZlcnIpCkBAIC0yMjcsMTEgKzIyNywxMiBAQAogCXNlcnItPmVlLmVlX3BhZCA9IDA7CiAJc2Vyci0+ZWUuZWVfaW5mbyA9IGluZm87CiAJc2Vyci0+ZWUuZWVfZGF0YSA9IDA7Ci0Jc2Vyci0+YWRkcl9vZmZzZXQgPSAodTgqKSYoKChzdHJ1Y3QgaXB2NmhkciopKGljbXBoKzEpKS0+ZGFkZHIpIC0gc2tiLT5uaC5yYXc7CisJc2Vyci0+YWRkcl9vZmZzZXQgPSAodTggKikmKCgoc3RydWN0IGlwdjZoZHIgKikoaWNtcGggKyAxKSktPmRhZGRyKSAtCisJCQkJICBza2JfbmV0d29ya19oZWFkZXIoc2tiKTsKIAlzZXJyLT5wb3J0ID0gcG9ydDsKIAotCXNrYi0+aC5yYXcgPSBwYXlsb2FkOwogCV9fc2tiX3B1bGwoc2tiLCBwYXlsb2FkIC0gc2tiLT5kYXRhKTsKKwlza2JfcmVzZXRfdHJhbnNwb3J0X2hlYWRlcihza2IpOwogCiAJaWYgKHNvY2tfcXVldWVfZXJyX3NrYihzaywgc2tiKSkKIAkJa2ZyZWVfc2tiKHNrYik7CkBAIC0yNTEsOCArMjUyLDkgQEAKIAlpZiAoIXNrYikKIAkJcmV0dXJuOwogCi0JaXBoID0gKHN0cnVjdCBpcHY2aGRyKilza2JfcHV0KHNrYiwgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSk7Ci0Jc2tiLT5uaC5pcHY2aCA9IGlwaDsKKwlza2JfcHV0KHNrYiwgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSk7CisJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CisJaXBoID0gaXB2Nl9oZHIoc2tiKTsKIAlpcHY2X2FkZHJfY29weSgmaXBoLT5kYWRkciwgJmZsLT5mbDZfZHN0KTsKIAogCXNlcnIgPSBTS0JfRVhUX0VSUihza2IpOwpAQCAtMjYzLDExICsyNjUsMTEgQEAKIAlzZXJyLT5lZS5lZV9wYWQgPSAwOwogCXNlcnItPmVlLmVlX2luZm8gPSBpbmZvOwogCXNlcnItPmVlLmVlX2RhdGEgPSAwOwotCXNlcnItPmFkZHJfb2Zmc2V0ID0gKHU4KikmaXBoLT5kYWRkciAtIHNrYi0+bmgucmF3OworCXNlcnItPmFkZHJfb2Zmc2V0ID0gKHU4ICopJmlwaC0+ZGFkZHIgLSBza2JfbmV0d29ya19oZWFkZXIoc2tiKTsKIAlzZXJyLT5wb3J0ID0gZmwtPmZsX2lwX2Rwb3J0OwogCi0Jc2tiLT5oLnJhdyA9IHNrYi0+dGFpbDsKLQlfX3NrYl9wdWxsKHNrYiwgc2tiLT50YWlsIC0gc2tiLT5kYXRhKTsKKwlfX3NrYl9wdWxsKHNrYiwgc2tiX3RhaWxfcG9pbnRlcihza2IpIC0gc2tiLT5kYXRhKTsKKwlza2JfcmVzZXRfdHJhbnNwb3J0X2hlYWRlcihza2IpOwogCiAJaWYgKHNvY2tfcXVldWVfZXJyX3NrYihzaywgc2tiKSkKIAkJa2ZyZWVfc2tiKHNrYik7CkBAIC0zMDksMjEgKzMxMSwyNCBAQAogCiAJc2luID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYgKiltc2ctPm1zZ19uYW1lOwogCWlmIChzaW4pIHsKKwkJY29uc3QgdW5zaWduZWQgY2hhciAqbmggPSBza2JfbmV0d29ya19oZWFkZXIoc2tiKTsKIAkJc2luLT5zaW42X2ZhbWlseSA9IEFGX0lORVQ2OwogCQlzaW4tPnNpbjZfZmxvd2luZm8gPSAwOwogCQlzaW4tPnNpbjZfcG9ydCA9IHNlcnItPnBvcnQ7CiAJCXNpbi0+c2luNl9zY29wZV9pZCA9IDA7CiAJCWlmIChzZXJyLT5lZS5lZV9vcmlnaW4gPT0gU09fRUVfT1JJR0lOX0lDTVA2KSB7CiAJCQlpcHY2X2FkZHJfY29weSgmc2luLT5zaW42X2FkZHIsCi0JCQkgIChzdHJ1Y3QgaW42X2FkZHIgKikoc2tiLT5uaC5yYXcgKyBzZXJyLT5hZGRyX29mZnNldCkpOworCQkJCSAgKHN0cnVjdCBpbjZfYWRkciAqKShuaCArIHNlcnItPmFkZHJfb2Zmc2V0KSk7CiAJCQlpZiAobnAtPnNuZGZsb3cpCi0JCQkJc2luLT5zaW42X2Zsb3dpbmZvID0gKihfX2JlMzIqKShza2ItPm5oLnJhdyArIHNlcnItPmFkZHJfb2Zmc2V0IC0gMjQpICYgSVBWNl9GTE9XSU5GT19NQVNLOworCQkJCXNpbi0+c2luNl9mbG93aW5mbyA9CisJCQkJCSgqKF9fYmUzMiAqKShuaCArIHNlcnItPmFkZHJfb2Zmc2V0IC0gMjQpICYKKwkJCQkJIElQVjZfRkxPV0lORk9fTUFTSyk7CiAJCQlpZiAoaXB2Nl9hZGRyX3R5cGUoJnNpbi0+c2luNl9hZGRyKSAmIElQVjZfQUREUl9MSU5LTE9DQUwpCiAJCQkJc2luLT5zaW42X3Njb3BlX2lkID0gSVA2Q0Ioc2tiKS0+aWlmOwogCQl9IGVsc2UgewogCQkJaXB2Nl9hZGRyX3NldCgmc2luLT5zaW42X2FkZHIsIDAsIDAsCiAJCQkJICAgICAgaHRvbmwoMHhmZmZmKSwKLQkJCQkgICAgICAqKF9fYmUzMiopKHNrYi0+bmgucmF3ICsgc2Vyci0+YWRkcl9vZmZzZXQpKTsKKwkJCQkgICAgICAqKF9fYmUzMiAqKShuaCArIHNlcnItPmFkZHJfb2Zmc2V0KSk7CiAJCX0KIAl9CiAKQEAgLTMzNSw3ICszNDAsNyBAQAogCQlzaW4tPnNpbjZfZmxvd2luZm8gPSAwOwogCQlzaW4tPnNpbjZfc2NvcGVfaWQgPSAwOwogCQlpZiAoc2Vyci0+ZWUuZWVfb3JpZ2luID09IFNPX0VFX09SSUdJTl9JQ01QNikgewotCQkJaXB2Nl9hZGRyX2NvcHkoJnNpbi0+c2luNl9hZGRyLCAmc2tiLT5uaC5pcHY2aC0+c2FkZHIpOworCQkJaXB2Nl9hZGRyX2NvcHkoJnNpbi0+c2luNl9hZGRyLCAmaXB2Nl9oZHIoc2tiKS0+c2FkZHIpOwogCQkJaWYgKG5wLT5yeG9wdC5hbGwpCiAJCQkJZGF0YWdyYW1fcmVjdl9jdGwoc2ssIG1zZywgc2tiKTsKIAkJCWlmIChpcHY2X2FkZHJfdHlwZSgmc2luLT5zaW42X2FkZHIpICYgSVBWNl9BRERSX0xJTktMT0NBTCkKQEAgLTM0NCw4ICszNDksNyBAQAogCQkJc3RydWN0IGluZXRfc29jayAqaW5ldCA9IGluZXRfc2soc2spOwogCiAJCQlpcHY2X2FkZHJfc2V0KCZzaW4tPnNpbjZfYWRkciwgMCwgMCwKLQkJCQkgICAgICBodG9ubCgweGZmZmYpLAotCQkJCSAgICAgIHNrYi0+bmguaXBoLT5zYWRkcik7CisJCQkJICAgICAgaHRvbmwoMHhmZmZmKSwgaXBfaGRyKHNrYiktPnNhZGRyKTsKIAkJCWlmIChpbmV0LT5jbXNnX2ZsYWdzKQogCQkJCWlwX2Ntc2dfcmVjdihtc2csIHNrYik7CiAJCX0KQEAgLTM4MSwzMyArMzg1LDM0IEBACiB7CiAJc3RydWN0IGlwdjZfcGluZm8gKm5wID0gaW5ldDZfc2soc2spOwogCXN0cnVjdCBpbmV0Nl9za2JfcGFybSAqb3B0ID0gSVA2Q0Ioc2tiKTsKKwl1bnNpZ25lZCBjaGFyICpuaCA9IHNrYl9uZXR3b3JrX2hlYWRlcihza2IpOwogCiAJaWYgKG5wLT5yeG9wdC5iaXRzLnJ4aW5mbykgewogCQlzdHJ1Y3QgaW42X3BrdGluZm8gc3JjX2luZm87CiAKIAkJc3JjX2luZm8uaXBpNl9pZmluZGV4ID0gb3B0LT5paWY7Ci0JCWlwdjZfYWRkcl9jb3B5KCZzcmNfaW5mby5pcGk2X2FkZHIsICZza2ItPm5oLmlwdjZoLT5kYWRkcik7CisJCWlwdjZfYWRkcl9jb3B5KCZzcmNfaW5mby5pcGk2X2FkZHIsICZpcHY2X2hkcihza2IpLT5kYWRkcik7CiAJCXB1dF9jbXNnKG1zZywgU09MX0lQVjYsIElQVjZfUEtUSU5GTywgc2l6ZW9mKHNyY19pbmZvKSwgJnNyY19pbmZvKTsKIAl9CiAKIAlpZiAobnAtPnJ4b3B0LmJpdHMucnhobGltKSB7Ci0JCWludCBobGltID0gc2tiLT5uaC5pcHY2aC0+aG9wX2xpbWl0OworCQlpbnQgaGxpbSA9IGlwdjZfaGRyKHNrYiktPmhvcF9saW1pdDsKIAkJcHV0X2Ntc2cobXNnLCBTT0xfSVBWNiwgSVBWNl9IT1BMSU1JVCwgc2l6ZW9mKGhsaW0pLCAmaGxpbSk7CiAJfQogCiAJaWYgKG5wLT5yeG9wdC5iaXRzLnJ4dGNsYXNzKSB7Ci0JCWludCB0Y2xhc3MgPSAobnRvaGwoKihfX2JlMzIgKilza2ItPm5oLmlwdjZoKSA+PiAyMCkgJiAweGZmOworCQlpbnQgdGNsYXNzID0gKG50b2hsKCooX19iZTMyICopaXB2Nl9oZHIoc2tiKSkgPj4gMjApICYgMHhmZjsKIAkJcHV0X2Ntc2cobXNnLCBTT0xfSVBWNiwgSVBWNl9UQ0xBU1MsIHNpemVvZih0Y2xhc3MpLCAmdGNsYXNzKTsKIAl9CiAKLQlpZiAobnAtPnJ4b3B0LmJpdHMucnhmbG93ICYmICgqKF9fYmUzMiopc2tiLT5uaC5yYXcgJiBJUFY2X0ZMT1dJTkZPX01BU0spKSB7Ci0JCV9fYmUzMiBmbG93aW5mbyA9ICooX19iZTMyKilza2ItPm5oLnJhdyAmIElQVjZfRkxPV0lORk9fTUFTSzsKKwlpZiAobnAtPnJ4b3B0LmJpdHMucnhmbG93ICYmICgqKF9fYmUzMiAqKW5oICYgSVBWNl9GTE9XSU5GT19NQVNLKSkgeworCQlfX2JlMzIgZmxvd2luZm8gPSAqKF9fYmUzMiAqKW5oICYgSVBWNl9GTE9XSU5GT19NQVNLOwogCQlwdXRfY21zZyhtc2csIFNPTF9JUFY2LCBJUFY2X0ZMT1dJTkZPLCBzaXplb2YoZmxvd2luZm8pLCAmZmxvd2luZm8pOwogCX0KIAogCS8qIEhiSCBpcyBhbGxvd2VkIG9ubHkgb25jZSAqLwogCWlmIChucC0+cnhvcHQuYml0cy5ob3BvcHRzICYmIG9wdC0+aG9wKSB7Ci0JCXU4ICpwdHIgPSBza2ItPm5oLnJhdyArIG9wdC0+aG9wOworCQl1OCAqcHRyID0gbmggKyBvcHQtPmhvcDsKIAkJcHV0X2Ntc2cobXNnLCBTT0xfSVBWNiwgSVBWNl9IT1BPUFRTLCAocHRyWzFdKzEpPDwzLCBwdHIpOwogCX0KIApAQCAtNDIzLDExICs0MjgsMTEgQEAKIAkJICogSVBWNl9SRUNWRFNUT1BUUyBpcyBtb3JlIGdlbmVyaWMuIC0teW9zaGZ1amkKIAkJICovCiAJCXVuc2lnbmVkIGludCBvZmYgPSBzaXplb2Yoc3RydWN0IGlwdjZoZHIpOwotCQl1OCBuZXh0aGRyID0gc2tiLT5uaC5pcHY2aC0+bmV4dGhkcjsKKwkJdTggbmV4dGhkciA9IGlwdjZfaGRyKHNrYiktPm5leHRoZHI7CiAKIAkJd2hpbGUgKG9mZiA8PSBvcHQtPmxhc3RvcHQpIHsKIAkJCXVuc2lnbmVkIGxlbjsKLQkJCXU4ICpwdHIgPSBza2ItPm5oLnJhdyArIG9mZjsKKwkJCXU4ICpwdHIgPSBuaCArIG9mZjsKIAogCQkJc3dpdGNoKG5leHRoZHIpIHsKIAkJCWNhc2UgSVBQUk9UT19EU1RPUFRTOgpAQCAtNDYxLDI3ICs0NjYsMjcgQEAKIAkJc3RydWN0IGluNl9wa3RpbmZvIHNyY19pbmZvOwogCiAJCXNyY19pbmZvLmlwaTZfaWZpbmRleCA9IG9wdC0+aWlmOwotCQlpcHY2X2FkZHJfY29weSgmc3JjX2luZm8uaXBpNl9hZGRyLCAmc2tiLT5uaC5pcHY2aC0+ZGFkZHIpOworCQlpcHY2X2FkZHJfY29weSgmc3JjX2luZm8uaXBpNl9hZGRyLCAmaXB2Nl9oZHIoc2tiKS0+ZGFkZHIpOwogCQlwdXRfY21zZyhtc2csIFNPTF9JUFY2LCBJUFY2XzIyOTJQS1RJTkZPLCBzaXplb2Yoc3JjX2luZm8pLCAmc3JjX2luZm8pOwogCX0KIAlpZiAobnAtPnJ4b3B0LmJpdHMucnhvaGxpbSkgewotCQlpbnQgaGxpbSA9IHNrYi0+bmguaXB2NmgtPmhvcF9saW1pdDsKKwkJaW50IGhsaW0gPSBpcHY2X2hkcihza2IpLT5ob3BfbGltaXQ7CiAJCXB1dF9jbXNnKG1zZywgU09MX0lQVjYsIElQVjZfMjI5MkhPUExJTUlULCBzaXplb2YoaGxpbSksICZobGltKTsKIAl9CiAJaWYgKG5wLT5yeG9wdC5iaXRzLm9ob3BvcHRzICYmIG9wdC0+aG9wKSB7Ci0JCXU4ICpwdHIgPSBza2ItPm5oLnJhdyArIG9wdC0+aG9wOworCQl1OCAqcHRyID0gbmggKyBvcHQtPmhvcDsKIAkJcHV0X2Ntc2cobXNnLCBTT0xfSVBWNiwgSVBWNl8yMjkySE9QT1BUUywgKHB0clsxXSsxKTw8MywgcHRyKTsKIAl9CiAJaWYgKG5wLT5yeG9wdC5iaXRzLm9kc3RvcHRzICYmIG9wdC0+ZHN0MCkgewotCQl1OCAqcHRyID0gc2tiLT5uaC5yYXcgKyBvcHQtPmRzdDA7CisJCXU4ICpwdHIgPSBuaCArIG9wdC0+ZHN0MDsKIAkJcHV0X2Ntc2cobXNnLCBTT0xfSVBWNiwgSVBWNl8yMjkyRFNUT1BUUywgKHB0clsxXSsxKTw8MywgcHRyKTsKIAl9CiAJaWYgKG5wLT5yeG9wdC5iaXRzLm9zcmNydCAmJiBvcHQtPnNyY3J0KSB7Ci0JCXN0cnVjdCBpcHY2X3J0X2hkciAqcnRoZHIgPSAoc3RydWN0IGlwdjZfcnRfaGRyICopKHNrYi0+bmgucmF3ICsgb3B0LT5zcmNydCk7CisJCXN0cnVjdCBpcHY2X3J0X2hkciAqcnRoZHIgPSAoc3RydWN0IGlwdjZfcnRfaGRyICopKG5oICsgb3B0LT5zcmNydCk7CiAJCXB1dF9jbXNnKG1zZywgU09MX0lQVjYsIElQVjZfMjI5MlJUSERSLCAocnRoZHItPmhkcmxlbisxKSA8PCAzLCBydGhkcik7CiAJfQogCWlmIChucC0+cnhvcHQuYml0cy5vZHN0b3B0cyAmJiBvcHQtPmRzdDEpIHsKLQkJdTggKnB0ciA9IHNrYi0+bmgucmF3ICsgb3B0LT5kc3QxOworCQl1OCAqcHRyID0gbmggKyBvcHQtPmRzdDE7CiAJCXB1dF9jbXNnKG1zZywgU09MX0lQVjYsIElQVjZfMjI5MkRTVE9QVFMsIChwdHJbMV0rMSk8PDMsIHB0cik7CiAJfQogCXJldHVybiAwOwpAQCAtNzE4LDcgKzcyMyw3IEBACiAJCQkJICAgICAgIGNtc2ctPmNtc2dfdHlwZSk7CiAJCQllcnIgPSAtRUlOVkFMOwogCQkJYnJlYWs7Ci0JCX07CisJCX0KIAl9CiAKIGV4aXRfZjoKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2VzcDYuYyBiL25ldC9pcHY2L2VzcDYuYwppbmRleCAzNjNlNjNmLi43MTA3YmI3IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9lc3A2LmMKKysrIGIvbmV0L2lwdjYvZXNwNi5jCkBAIC00MiwyMSArNDIsMTkgQEAKIHN0YXRpYyBpbnQgZXNwNl9vdXRwdXQoc3RydWN0IHhmcm1fc3RhdGUgKngsIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJaW50IGVycjsKLQlpbnQgaGRyX2xlbjsKIAlzdHJ1Y3QgaXB2NmhkciAqdG9wX2lwaDsKIAlzdHJ1Y3QgaXB2Nl9lc3BfaGRyICplc3BoOwogCXN0cnVjdCBjcnlwdG9fYmxrY2lwaGVyICp0Zm07CiAJc3RydWN0IGJsa2NpcGhlcl9kZXNjIGRlc2M7Ci0Jc3RydWN0IGVzcF9kYXRhICplc3A7CiAJc3RydWN0IHNrX2J1ZmYgKnRyYWlsZXI7CiAJaW50IGJsa3NpemU7CiAJaW50IGNsZW47CiAJaW50IGFsZW47CiAJaW50IG5mcmFnczsKLQotCWVzcCA9IHgtPmRhdGE7Ci0JaGRyX2xlbiA9IHNrYi0+aC5yYXcgLSBza2ItPmRhdGEgKwotCQkgIHNpemVvZigqZXNwaCkgKyBlc3AtPmNvbmYuaXZsZW47CisJdTggKnRhaWw7CisJc3RydWN0IGVzcF9kYXRhICplc3AgPSB4LT5kYXRhOworCWludCBoZHJfbGVuID0gKHNrYl90cmFuc3BvcnRfb2Zmc2V0KHNrYikgKworCQkgICAgICAgc2l6ZW9mKCplc3BoKSArIGVzcC0+Y29uZi5pdmxlbik7CiAKIAkvKiBTdHJpcCBJUCtFU1AgaGVhZGVyLiAqLwogCV9fc2tiX3B1bGwoc2tiLCBoZHJfbGVuKTsKQEAgLTgxLDE5ICs3OSwyMCBAQAogCX0KIAogCS8qIEZpbGwgcGFkZGluZy4uLiAqLworCXRhaWwgPSBza2JfdGFpbF9wb2ludGVyKHRyYWlsZXIpOwogCWRvIHsKIAkJaW50IGk7CiAJCWZvciAoaT0wOyBpPGNsZW4tc2tiLT5sZW4gLSAyOyBpKyspCi0JCQkqKHU4KikodHJhaWxlci0+dGFpbCArIGkpID0gaSsxOworCQkJdGFpbFtpXSA9IGkgKyAxOwogCX0gd2hpbGUgKDApOwotCSoodTgqKSh0cmFpbGVyLT50YWlsICsgY2xlbi1za2ItPmxlbiAtIDIpID0gKGNsZW4gLSBza2ItPmxlbiktMjsKKwl0YWlsW2NsZW4tc2tiLT5sZW4gLSAyXSA9IChjbGVuIC0gc2tiLT5sZW4pIC0gMjsKIAlwc2tiX3B1dChza2IsIHRyYWlsZXIsIGNsZW4gLSBza2ItPmxlbik7CiAKIAl0b3BfaXBoID0gKHN0cnVjdCBpcHY2aGRyICopX19za2JfcHVzaChza2IsIGhkcl9sZW4pOwotCWVzcGggPSAoc3RydWN0IGlwdjZfZXNwX2hkciAqKXNrYi0+aC5yYXc7CisJZXNwaCA9IChzdHJ1Y3QgaXB2Nl9lc3BfaGRyICopc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKIAl0b3BfaXBoLT5wYXlsb2FkX2xlbiA9IGh0b25zKHNrYi0+bGVuICsgYWxlbiAtIHNpemVvZigqdG9wX2lwaCkpOwotCSoodTgqKSh0cmFpbGVyLT50YWlsIC0gMSkgPSAqc2tiLT5uaC5yYXc7Ci0JKnNrYi0+bmgucmF3ID0gSVBQUk9UT19FU1A7CisJKihza2JfdGFpbF9wb2ludGVyKHRyYWlsZXIpIC0gMSkgPSAqc2tiX25ldHdvcmtfaGVhZGVyKHNrYik7CisJKnNrYl9uZXR3b3JrX2hlYWRlcihza2IpID0gSVBQUk9UT19FU1A7CiAKIAllc3BoLT5zcGkgPSB4LT5pZC5zcGk7CiAJZXNwaC0+c2VxX25vID0gaHRvbmwoKyt4LT5yZXBsYXkub3NlcSk7CkBAIC0xNTAsOCArMTQ5LDcgQEAKIAlpbnQgYmxrc2l6ZSA9IEFMSUdOKGNyeXB0b19ibGtjaXBoZXJfYmxvY2tzaXplKHRmbSksIDQpOwogCWludCBhbGVuID0gZXNwLT5hdXRoLmljdl90cnVuY19sZW47CiAJaW50IGVsZW4gPSBza2ItPmxlbiAtIHNpemVvZihzdHJ1Y3QgaXB2Nl9lc3BfaGRyKSAtIGVzcC0+Y29uZi5pdmxlbiAtIGFsZW47Ci0KLQlpbnQgaGRyX2xlbiA9IHNrYi0+aC5yYXcgLSBza2ItPm5oLnJhdzsKKwlpbnQgaGRyX2xlbiA9IHNrYl9uZXR3b3JrX2hlYWRlcl9sZW4oc2tiKTsKIAlpbnQgbmZyYWdzOwogCWludCByZXQgPSAwOwogCkBAIC0xOTEsNyArMTg5LDcgQEAKIAlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CiAKIAllc3BoID0gKHN0cnVjdCBpcHY2X2VzcF9oZHIqKXNrYi0+ZGF0YTsKLQlpcGggPSBza2ItPm5oLmlwdjZoOworCWlwaCA9IGlwdjZfaGRyKHNrYik7CiAKIAkvKiBHZXQgaXZlYy4gVGhpcyBjYW4gYmUgd3JvbmcsIGNoZWNrIGFnYWluc3QgYW5vdGhlciBpbXBscy4gKi8KIAlpZiAoZXNwLT5jb25mLml2bGVuKQpAQCAtMjMxLDI4ICsyMjksMzAgQEAKIAkJcmV0ID0gbmV4dGhkclsxXTsKIAl9CiAKLQlza2ItPmgucmF3ID0gX19za2JfcHVsbChza2IsIHNpemVvZigqZXNwaCkgKyBlc3AtPmNvbmYuaXZsZW4pIC0gaGRyX2xlbjsKLQorCV9fc2tiX3B1bGwoc2tiLCBzaXplb2YoKmVzcGgpICsgZXNwLT5jb25mLml2bGVuKTsKKwlza2Jfc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiLCAtaGRyX2xlbik7CiBvdXQ6CiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHUzMiBlc3A2X2dldF9tYXhfc2l6ZShzdHJ1Y3QgeGZybV9zdGF0ZSAqeCwgaW50IG10dSkKK3N0YXRpYyB1MzIgZXNwNl9nZXRfbXR1KHN0cnVjdCB4ZnJtX3N0YXRlICp4LCBpbnQgbXR1KQogewogCXN0cnVjdCBlc3BfZGF0YSAqZXNwID0geC0+ZGF0YTsKIAl1MzIgYmxrc2l6ZSA9IEFMSUdOKGNyeXB0b19ibGtjaXBoZXJfYmxvY2tzaXplKGVzcC0+Y29uZi50Zm0pLCA0KTsKKwl1MzIgYWxpZ24gPSBtYXhfdCh1MzIsIGJsa3NpemUsIGVzcC0+Y29uZi5wYWRsZW4pOworCXUzMiByZW07CiAKLQlpZiAoeC0+cHJvcHMubW9kZSA9PSBYRlJNX01PREVfVFVOTkVMKSB7Ci0JCW10dSA9IEFMSUdOKG10dSArIDIsIGJsa3NpemUpOwotCX0gZWxzZSB7Ci0JCS8qIFRoZSB3b3JzdCBjYXNlLiAqLworCW10dSAtPSB4LT5wcm9wcy5oZWFkZXJfbGVuICsgZXNwLT5hdXRoLmljdl90cnVuY19sZW47CisJcmVtID0gbXR1ICYgKGFsaWduIC0gMSk7CisJbXR1ICY9IH4oYWxpZ24gLSAxKTsKKworCWlmICh4LT5wcm9wcy5tb2RlICE9IFhGUk1fTU9ERV9UVU5ORUwpIHsKIAkJdTMyIHBhZHNpemUgPSAoKGJsa3NpemUgLSAxKSAmIDcpICsgMTsKLQkJbXR1ID0gQUxJR04obXR1ICsgMiwgcGFkc2l6ZSkgKyBibGtzaXplIC0gcGFkc2l6ZTsKKwkJbXR1IC09IGJsa3NpemUgLSBwYWRzaXplOworCQltdHUgKz0gbWluX3QodTMyLCBibGtzaXplIC0gcGFkc2l6ZSwgcmVtKTsKIAl9Ci0JaWYgKGVzcC0+Y29uZi5wYWRsZW4pCi0JCW10dSA9IEFMSUdOKG10dSwgZXNwLT5jb25mLnBhZGxlbik7CiAKLQlyZXR1cm4gbXR1ICsgeC0+cHJvcHMuaGVhZGVyX2xlbiArIGVzcC0+YXV0aC5pY3ZfdHJ1bmNfbGVuOworCXJldHVybiBtdHUgLSAyOwogfQogCiBzdGF0aWMgdm9pZCBlc3A2X2VycihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaW5ldDZfc2tiX3Bhcm0gKm9wdCwKQEAgLTM4Miw3ICszODIsNyBAQAogCS5wcm90bwkgICAgIAk9IElQUFJPVE9fRVNQLAogCS5pbml0X3N0YXRlCT0gZXNwNl9pbml0X3N0YXRlLAogCS5kZXN0cnVjdG9yCT0gZXNwNl9kZXN0cm95LAotCS5nZXRfbWF4X3NpemUJPSBlc3A2X2dldF9tYXhfc2l6ZSwKKwkuZ2V0X210dQk9IGVzcDZfZ2V0X210dSwKIAkuaW5wdXQJCT0gZXNwNl9pbnB1dCwKIAkub3V0cHV0CQk9IGVzcDZfb3V0cHV0LAogCS5oZHJfb2Zmc2V0CT0geGZybTZfZmluZF8xc3RmcmFnb3B0LApkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvZXh0aGRycy5jIGIvbmV0L2lwdjYvZXh0aGRycy5jCmluZGV4IGZiMzk2MDQuLjZkOGU0YWMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2V4dGhkcnMuYworKysgYi9uZXQvaXB2Ni9leHRoZHJzLmMKQEAgLTUwLDEzICs1MCwxNCBAQAogCiBpbnQgaXB2Nl9maW5kX3RsdihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgb2Zmc2V0LCBpbnQgdHlwZSkKIHsKLQlpbnQgcGFja2V0X2xlbiA9IHNrYi0+dGFpbCAtIHNrYi0+bmgucmF3OworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKm5oID0gc2tiX25ldHdvcmtfaGVhZGVyKHNrYik7CisJaW50IHBhY2tldF9sZW4gPSBza2ItPnRhaWwgLSBza2ItPm5ldHdvcmtfaGVhZGVyOwogCXN0cnVjdCBpcHY2X29wdF9oZHIgKmhkcjsKIAlpbnQgbGVuOwogCiAJaWYgKG9mZnNldCArIDIgPiBwYWNrZXRfbGVuKQogCQlnb3RvIGJhZDsKLQloZHIgPSAoc3RydWN0IGlwdjZfb3B0X2hkciopKHNrYi0+bmgucmF3ICsgb2Zmc2V0KTsKKwloZHIgPSAoc3RydWN0IGlwdjZfb3B0X2hkciAqKShuaCArIG9mZnNldCk7CiAJbGVuID0gKChoZHItPmhkcmxlbiArIDEpIDw8IDMpOwogCiAJaWYgKG9mZnNldCArIGxlbiA+IHBhY2tldF9sZW4pCkBAIC02Niw3ICs2Nyw3IEBACiAJbGVuIC09IDI7CiAKIAl3aGlsZSAobGVuID4gMCkgewotCQlpbnQgb3B0dHlwZSA9IHNrYi0+bmgucmF3W29mZnNldF07CisJCWludCBvcHR0eXBlID0gbmhbb2Zmc2V0XTsKIAkJaW50IG9wdGxlbjsKIAogCQlpZiAob3B0dHlwZSA9PSB0eXBlKQpAQCAtNzcsNyArNzgsNyBAQAogCQkJb3B0bGVuID0gMTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJb3B0bGVuID0gc2tiLT5uaC5yYXdbb2Zmc2V0ICsgMV0gKyAyOworCQkJb3B0bGVuID0gbmhbb2Zmc2V0ICsgMV0gKyAyOwogCQkJaWYgKG9wdGxlbiA+IGxlbikKIAkJCQlnb3RvIGJhZDsKIAkJCWJyZWFrOwpAQCAtMTEzLDcgKzExNCw3IEBACiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYiA9ICpza2JwOwogCi0Jc3dpdGNoICgoc2tiLT5uaC5yYXdbb3B0b2ZmXSAmIDB4QzApID4+IDYpIHsKKwlzd2l0Y2ggKChza2JfbmV0d29ya19oZWFkZXIoc2tiKVtvcHRvZmZdICYgMHhDMCkgPj4gNikgewogCWNhc2UgMDogLyogaWdub3JlICovCiAJCXJldHVybiAxOwogCkBAIC0xMjQsMTIgKzEyNSwxMiBAQAogCQkvKiBBY3R1YWxseSwgaXQgaXMgcmVkdW5kYW50IGNoZWNrLiBpY21wX3NlbmQKIAkJICAgd2lsbCByZWNoZWNrIGluIGFueSBjYXNlLgogCQkgKi8KLQkJaWYgKGlwdjZfYWRkcl9pc19tdWx0aWNhc3QoJnNrYi0+bmguaXB2NmgtPmRhZGRyKSkKKwkJaWYgKGlwdjZfYWRkcl9pc19tdWx0aWNhc3QoJmlwdjZfaGRyKHNrYiktPmRhZGRyKSkKIAkJCWJyZWFrOwogCWNhc2UgMjogLyogc2VuZCBJQ01QIFBBUk0gUFJPQiByZWdhcmRsZXNzIGFuZCBkcm9wIHBhY2tldCAqLwogCQlpY21wdjZfcGFyYW1fcHJvYihza2IsIElDTVBWNl9VTktfT1BUSU9OLCBvcHRvZmYpOwogCQlyZXR1cm4gMDsKLQl9OworCX0KIAogCWtmcmVlX3NrYihza2IpOwogCXJldHVybiAwOwpAQCAtMTQxLDE5ICsxNDIsMjAgQEAKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gKnNrYnA7CiAJc3RydWN0IHRsdnR5cGVfcHJvYyAqY3VycjsKLQlpbnQgb2ZmID0gc2tiLT5oLnJhdyAtIHNrYi0+bmgucmF3OwotCWludCBsZW4gPSAoKHNrYi0+aC5yYXdbMV0rMSk8PDMpOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKm5oID0gc2tiX25ldHdvcmtfaGVhZGVyKHNrYik7CisJaW50IG9mZiA9IHNrYl9uZXR3b3JrX2hlYWRlcl9sZW4oc2tiKTsKKwlpbnQgbGVuID0gKHNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYilbMV0gKyAxKSA8PCAzOwogCi0JaWYgKChza2ItPmgucmF3ICsgbGVuKSAtIHNrYi0+ZGF0YSA+IHNrYl9oZWFkbGVuKHNrYikpCisJaWYgKHNrYl90cmFuc3BvcnRfb2Zmc2V0KHNrYikgKyBsZW4gPiBza2JfaGVhZGxlbihza2IpKQogCQlnb3RvIGJhZDsKIAogCW9mZiArPSAyOwogCWxlbiAtPSAyOwogCiAJd2hpbGUgKGxlbiA+IDApIHsKLQkJaW50IG9wdGxlbiA9IHNrYi0+bmgucmF3W29mZisxXSsyOworCQlpbnQgb3B0bGVuID0gbmhbb2ZmICsgMV0gKyAyOwogCi0JCXN3aXRjaCAoc2tiLT5uaC5yYXdbb2ZmXSkgeworCQlzd2l0Y2ggKG5oW29mZl0pIHsKIAkJY2FzZSBJUFY2X1RMVl9QQUQwOgogCQkJb3B0bGVuID0gMTsKIAkJCWJyZWFrOwpAQCAtMTY1LDcgKzE2Nyw3IEBACiAJCQlpZiAob3B0bGVuID4gbGVuKQogCQkJCWdvdG8gYmFkOwogCQkJZm9yIChjdXJyPXByb2NzOyBjdXJyLT50eXBlID49IDA7IGN1cnIrKykgewotCQkJCWlmIChjdXJyLT50eXBlID09IHNrYi0+bmgucmF3W29mZl0pIHsKKwkJCQlpZiAoY3Vyci0+dHlwZSA9PSBuaFtvZmZdKSB7CiAJCQkJCS8qIHR5cGUgc3BlY2lmaWMgbGVuZ3RoL2FsaWdubWVudAogCQkJCQkgICBjaGVja3Mgd2lsbCBiZSBwZXJmb3JtZWQgaW4gdGhlCiAJCQkJCSAgIGZ1bmMoKS4gKi8KQEAgLTIwMCw3ICsyMDIsNyBAQAogCXN0cnVjdCBza19idWZmICpza2IgPSAqc2ticDsKIAlzdHJ1Y3QgaXB2Nl9kZXN0b3B0X2hhbyAqaGFvOwogCXN0cnVjdCBpbmV0Nl9za2JfcGFybSAqb3B0ID0gSVA2Q0Ioc2tiKTsKLQlzdHJ1Y3QgaXB2NmhkciAqaXB2NmggPSAoc3RydWN0IGlwdjZoZHIgKilza2ItPm5oLnJhdzsKKwlzdHJ1Y3QgaXB2NmhkciAqaXB2NmggPSBpcHY2X2hkcihza2IpOwogCXN0cnVjdCBpbjZfYWRkciB0bXBfYWRkcjsKIAlpbnQgcmV0OwogCkBAIC0yMTEsNyArMjEzLDcgQEAKIAlvcHQtPmRzdGhhbyA9IG9wdC0+ZHN0MTsKIAlvcHQtPmRzdDEgPSAwOwogCi0JaGFvID0gKHN0cnVjdCBpcHY2X2Rlc3RvcHRfaGFvICopKHNrYi0+bmgucmF3ICsgb3B0b2ZmKTsKKwloYW8gPSAoc3RydWN0IGlwdjZfZGVzdG9wdF9oYW8gKikoc2tiX25ldHdvcmtfaGVhZGVyKHNrYikgKyBvcHRvZmYpOwogCiAJaWYgKGhhby0+bGVuZ3RoICE9IDE2KSB7CiAJCUxJTUlUX05FVERFQlVHKApAQCAtMjQ0LDggKzI0Niw5IEBACiAKIAkJLyogdXBkYXRlIGFsbCB2YXJpYWJsZSB1c2luZyBiZWxvdyBieSBjb3BpZWQgc2tidWZmICovCiAJCSpza2JwID0gc2tiID0gc2tiMjsKLQkJaGFvID0gKHN0cnVjdCBpcHY2X2Rlc3RvcHRfaGFvICopKHNrYjItPm5oLnJhdyArIG9wdG9mZik7Ci0JCWlwdjZoID0gKHN0cnVjdCBpcHY2aGRyICopc2tiMi0+bmgucmF3OworCQloYW8gPSAoc3RydWN0IGlwdjZfZGVzdG9wdF9oYW8gKikoc2tiX25ldHdvcmtfaGVhZGVyKHNrYjIpICsKKwkJCQkJCSAgb3B0b2ZmKTsKKwkJaXB2NmggPSBpcHY2X2hkcihza2IyKTsKIAl9CiAKIAlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fQ09NUExFVEUpCkBAIC0yNTUsNyArMjU4LDcgQEAKIAlpcHY2X2FkZHJfY29weSgmaXB2NmgtPnNhZGRyLCAmaGFvLT5hZGRyKTsKIAlpcHY2X2FkZHJfY29weSgmaGFvLT5hZGRyLCAmdG1wX2FkZHIpOwogCi0JaWYgKHNrYi0+dHN0YW1wLm9mZl9zZWMgPT0gMCkKKwlpZiAoc2tiLT50c3RhbXAudHY2NCA9PSAwKQogCQlfX25ldF90aW1lc3RhbXAoc2tiKTsKIAogCXJldHVybiAxOwpAQCAtMjg1LDE2ICsyODgsMTYgQEAKICNlbmRpZgogCXN0cnVjdCBkc3RfZW50cnkgKmRzdDsKIAotCWlmICghcHNrYl9tYXlfcHVsbChza2IsIChza2ItPmgucmF3LXNrYi0+ZGF0YSkrOCkgfHwKLQkgICAgIXBza2JfbWF5X3B1bGwoc2tiLCAoc2tiLT5oLnJhdy1za2ItPmRhdGEpKygoc2tiLT5oLnJhd1sxXSsxKTw8MykpKSB7CisJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgc2tiX3RyYW5zcG9ydF9vZmZzZXQoc2tiKSArIDgpIHx8CisJICAgICFwc2tiX21heV9wdWxsKHNrYiwgKHNrYl90cmFuc3BvcnRfb2Zmc2V0KHNrYikgKworCQkJCSAoKHNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYilbMV0gKyAxKSA8PCAzKSkpKSB7CiAJCUlQNl9JTkNfU1RBVFNfQkgoaXA2X2RzdF9pZGV2KHNrYi0+ZHN0KSwKIAkJCQkgSVBTVEFUU19NSUJfSU5IRFJFUlJPUlMpOwogCQlrZnJlZV9za2Ioc2tiKTsKIAkJcmV0dXJuIC0xOwogCX0KIAotCW9wdC0+bGFzdG9wdCA9IHNrYi0+aC5yYXcgLSBza2ItPm5oLnJhdzsKLQlvcHQtPmRzdDEgPSBza2ItPmgucmF3IC0gc2tiLT5uaC5yYXc7CisJb3B0LT5sYXN0b3B0ID0gb3B0LT5kc3QxID0gc2tiX25ldHdvcmtfaGVhZGVyX2xlbihza2IpOwogI2lmZGVmIENPTkZJR19JUFY2X01JUDYKIAlkc3RidWYgPSBvcHQtPmRzdDE7CiAjZW5kaWYKQEAgLTMwMyw3ICszMDYsNyBAQAogCWlmIChpcDZfcGFyc2VfdGx2KHRsdnByb2NkZXN0b3B0X2xzdCwgc2ticCkpIHsKIAkJZHN0X3JlbGVhc2UoZHN0KTsKIAkJc2tiID0gKnNrYnA7Ci0JCXNrYi0+aC5yYXcgKz0gKChza2ItPmgucmF3WzFdKzEpPDwzKTsKKwkJc2tiLT50cmFuc3BvcnRfaGVhZGVyICs9IChza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpWzFdICsgMSkgPDwgMzsKIAkJb3B0ID0gSVA2Q0Ioc2tiKTsKICNpZmRlZiBDT05GSUdfSVBWNl9NSVA2CiAJCW9wdC0+bmhvZmYgPSBkc3RidWY7CkBAIC0zODQsMTggKzM4NywyMCBAQAogCiAJaW42X2Rldl9wdXQoaWRldik7CiAKLQlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCAoc2tiLT5oLnJhdy1za2ItPmRhdGEpKzgpIHx8Ci0JICAgICFwc2tiX21heV9wdWxsKHNrYiwgKHNrYi0+aC5yYXctc2tiLT5kYXRhKSsoKHNrYi0+aC5yYXdbMV0rMSk8PDMpKSkgeworCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHNrYl90cmFuc3BvcnRfb2Zmc2V0KHNrYikgKyA4KSB8fAorCSAgICAhcHNrYl9tYXlfcHVsbChza2IsIChza2JfdHJhbnNwb3J0X29mZnNldChza2IpICsKKwkJCQkgKChza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpWzFdICsgMSkgPDwgMykpKSkgewogCQlJUDZfSU5DX1NUQVRTX0JIKGlwNl9kc3RfaWRldihza2ItPmRzdCksCiAJCQkJIElQU1RBVFNfTUlCX0lOSERSRVJST1JTKTsKIAkJa2ZyZWVfc2tiKHNrYik7CiAJCXJldHVybiAtMTsKIAl9CiAKLQloZHIgPSAoc3RydWN0IGlwdjZfcnRfaGRyICopIHNrYi0+aC5yYXc7CisJaGRyID0gKHN0cnVjdCBpcHY2X3J0X2hkciAqKXNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYik7CiAKIAlzd2l0Y2ggKGhkci0+dHlwZSkgewogI2lmZGVmIENPTkZJR19JUFY2X01JUDYKKwljYXNlIElQVjZfU1JDUlRfVFlQRV8yOgogCQlicmVhazsKICNlbmRpZgogCWNhc2UgSVBWNl9TUkNSVF9UWVBFXzA6CkBAIC00MDYsMTEgKzQxMSwxMiBAQAogCWRlZmF1bHQ6CiAJCUlQNl9JTkNfU1RBVFNfQkgoaXA2X2RzdF9pZGV2KHNrYi0+ZHN0KSwKIAkJCQkgSVBTVEFUU19NSUJfSU5IRFJFUlJPUlMpOwotCQlpY21wdjZfcGFyYW1fcHJvYihza2IsIElDTVBWNl9IRFJfRklFTEQsICgmaGRyLT50eXBlKSAtIHNrYi0+bmgucmF3KTsKKwkJaWNtcHY2X3BhcmFtX3Byb2Ioc2tiLCBJQ01QVjZfSERSX0ZJRUxELAorCQkJCSAgKCZoZHItPnR5cGUpIC0gc2tiX25ldHdvcmtfaGVhZGVyKHNrYikpOwogCQlyZXR1cm4gLTE7CiAJfQogCi0JaWYgKGlwdjZfYWRkcl9pc19tdWx0aWNhc3QoJnNrYi0+bmguaXB2NmgtPmRhZGRyKSB8fAorCWlmIChpcHY2X2FkZHJfaXNfbXVsdGljYXN0KCZpcHY2X2hkcihza2IpLT5kYWRkcikgfHwKIAkgICAgc2tiLT5wa3RfdHlwZSAhPSBQQUNLRVRfSE9TVCkgewogCQlJUDZfSU5DX1NUQVRTX0JIKGlwNl9kc3RfaWRldihza2ItPmRzdCksCiAJCQkJIElQU1RBVFNfTUlCX0lOQUREUkVSUk9SUyk7CkBAIC00MzgsMTIgKzQ0NCwxMSBAQAogCQkJYnJlYWs7CiAJCX0KIAotCQlvcHQtPmxhc3RvcHQgPSBza2ItPmgucmF3IC0gc2tiLT5uaC5yYXc7Ci0JCW9wdC0+c3JjcnQgPSBza2ItPmgucmF3IC0gc2tiLT5uaC5yYXc7Ci0JCXNrYi0+aC5yYXcgKz0gKGhkci0+aGRybGVuICsgMSkgPDwgMzsKKwkJb3B0LT5sYXN0b3B0ID0gb3B0LT5zcmNydCA9IHNrYl9uZXR3b3JrX2hlYWRlcl9sZW4oc2tiKTsKKwkJc2tiLT50cmFuc3BvcnRfaGVhZGVyICs9IChoZHItPmhkcmxlbiArIDEpIDw8IDM7CiAJCW9wdC0+ZHN0MCA9IG9wdC0+ZHN0MTsKIAkJb3B0LT5kc3QxID0gMDsKLQkJb3B0LT5uaG9mZiA9ICgmaGRyLT5uZXh0aGRyKSAtIHNrYi0+bmgucmF3OworCQlvcHQtPm5ob2ZmID0gKCZoZHItPm5leHRoZHIpIC0gc2tiX25ldHdvcmtfaGVhZGVyKHNrYik7CiAJCXJldHVybiAxOwogCX0KIApAQCAtNDUyLDcgKzQ1Nyw5IEBACiAJCWlmIChoZHItPmhkcmxlbiAmIDB4MDEpIHsKIAkJCUlQNl9JTkNfU1RBVFNfQkgoaXA2X2RzdF9pZGV2KHNrYi0+ZHN0KSwKIAkJCQkJIElQU1RBVFNfTUlCX0lOSERSRVJST1JTKTsKLQkJCWljbXB2Nl9wYXJhbV9wcm9iKHNrYiwgSUNNUFY2X0hEUl9GSUVMRCwgKCZoZHItPmhkcmxlbikgLSBza2ItPm5oLnJhdyk7CisJCQlpY21wdjZfcGFyYW1fcHJvYihza2IsIElDTVBWNl9IRFJfRklFTEQsCisJCQkJCSAgKCgmaGRyLT5oZHJsZW4pIC0KKwkJCQkJICAgc2tiX25ldHdvcmtfaGVhZGVyKHNrYikpKTsKIAkJCXJldHVybiAtMTsKIAkJfQogCQlicmVhazsKQEAgLTQ3OSw3ICs0ODYsOSBAQAogCWlmIChoZHItPnNlZ21lbnRzX2xlZnQgPiBuKSB7CiAJCUlQNl9JTkNfU1RBVFNfQkgoaXA2X2RzdF9pZGV2KHNrYi0+ZHN0KSwKIAkJCQkgSVBTVEFUU19NSUJfSU5IRFJFUlJPUlMpOwotCQlpY21wdjZfcGFyYW1fcHJvYihza2IsIElDTVBWNl9IRFJfRklFTEQsICgmaGRyLT5zZWdtZW50c19sZWZ0KSAtIHNrYi0+bmgucmF3KTsKKwkJaWNtcHY2X3BhcmFtX3Byb2Ioc2tiLCBJQ01QVjZfSERSX0ZJRUxELAorCQkJCSAgKCgmaGRyLT5zZWdtZW50c19sZWZ0KSAtCisJCQkJICAgc2tiX25ldHdvcmtfaGVhZGVyKHNrYikpKTsKIAkJcmV0dXJuIC0xOwogCX0KIApAQCAtNDk4LDcgKzUwNyw3IEBACiAJCWtmcmVlX3NrYihza2IpOwogCQkqc2ticCA9IHNrYiA9IHNrYjI7CiAJCW9wdCA9IElQNkNCKHNrYjIpOwotCQloZHIgPSAoc3RydWN0IGlwdjZfcnRfaGRyICopIHNrYjItPmgucmF3OworCQloZHIgPSAoc3RydWN0IGlwdjZfcnRfaGRyICopc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiMik7CiAJfQogCiAJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0NPTVBMRVRFKQpAQCAtNTE0LDcgKzUyMyw3IEBACiAjaWZkZWYgQ09ORklHX0lQVjZfTUlQNgogCWNhc2UgSVBWNl9TUkNSVF9UWVBFXzI6CiAJCWlmICh4ZnJtNl9pbnB1dF9hZGRyKHNrYiwgKHhmcm1fYWRkcmVzc190ICopYWRkciwKLQkJCQkgICAgICh4ZnJtX2FkZHJlc3NfdCAqKSZza2ItPm5oLmlwdjZoLT5zYWRkciwKKwkJCQkgICAgICh4ZnJtX2FkZHJlc3NfdCAqKSZpcHY2X2hkcihza2IpLT5zYWRkciwKIAkJCQkgICAgIElQUFJPVE9fUk9VVElORykgPCAwKSB7CiAJCQlJUDZfSU5DX1NUQVRTX0JIKGlwNl9kc3RfaWRldihza2ItPmRzdCksCiAJCQkJCSBJUFNUQVRTX01JQl9JTkFERFJFUlJPUlMpOwpAQCAtNTQxLDE5ICs1NTAsMTkgQEAKIAl9CiAKIAlpcHY2X2FkZHJfY29weSgmZGFkZHIsIGFkZHIpOwotCWlwdjZfYWRkcl9jb3B5KGFkZHIsICZza2ItPm5oLmlwdjZoLT5kYWRkcik7Ci0JaXB2Nl9hZGRyX2NvcHkoJnNrYi0+bmguaXB2NmgtPmRhZGRyLCAmZGFkZHIpOworCWlwdjZfYWRkcl9jb3B5KGFkZHIsICZpcHY2X2hkcihza2IpLT5kYWRkcik7CisJaXB2Nl9hZGRyX2NvcHkoJmlwdjZfaGRyKHNrYiktPmRhZGRyLCAmZGFkZHIpOwogCiAJZHN0X3JlbGVhc2UoeGNoZygmc2tiLT5kc3QsIE5VTEwpKTsKIAlpcDZfcm91dGVfaW5wdXQoc2tiKTsKIAlpZiAoc2tiLT5kc3QtPmVycm9yKSB7Ci0JCXNrYl9wdXNoKHNrYiwgc2tiLT5kYXRhIC0gc2tiLT5uaC5yYXcpOworCQlza2JfcHVzaChza2IsIHNrYi0+ZGF0YSAtIHNrYl9uZXR3b3JrX2hlYWRlcihza2IpKTsKIAkJZHN0X2lucHV0KHNrYik7CiAJCXJldHVybiAtMTsKIAl9CiAKIAlpZiAoc2tiLT5kc3QtPmRldi0+ZmxhZ3MmSUZGX0xPT1BCQUNLKSB7Ci0JCWlmIChza2ItPm5oLmlwdjZoLT5ob3BfbGltaXQgPD0gMSkgeworCQlpZiAoaXB2Nl9oZHIoc2tiKS0+aG9wX2xpbWl0IDw9IDEpIHsKIAkJCUlQNl9JTkNfU1RBVFNfQkgoaXA2X2RzdF9pZGV2KHNrYi0+ZHN0KSwKIAkJCQkJIElQU1RBVFNfTUlCX0lOSERSRVJST1JTKTsKIAkJCWljbXB2Nl9zZW5kKHNrYiwgSUNNUFY2X1RJTUVfRVhDRUVELCBJQ01QVjZfRVhDX0hPUExJTUlULApAQCAtNTYxLDExICs1NzAsMTEgQEAKIAkJCWtmcmVlX3NrYihza2IpOwogCQkJcmV0dXJuIC0xOwogCQl9Ci0JCXNrYi0+bmguaXB2NmgtPmhvcF9saW1pdC0tOworCQlpcHY2X2hkcihza2IpLT5ob3BfbGltaXQtLTsKIAkJZ290byBsb29wZWRfYmFjazsKIAl9CiAKLQlza2JfcHVzaChza2IsIHNrYi0+ZGF0YSAtIHNrYi0+bmgucmF3KTsKKwlza2JfcHVzaChza2IsIHNrYi0+ZGF0YSAtIHNrYl9uZXR3b3JrX2hlYWRlcihza2IpKTsKIAlkc3RfaW5wdXQoc2tiKTsKIAlyZXR1cm4gLTE7CiB9CkBAIC02NTYsMTMgKzY2NSwxNCBAQAogc3RhdGljIGludCBpcHY2X2hvcF9yYShzdHJ1Y3Qgc2tfYnVmZiAqKnNrYnAsIGludCBvcHRvZmYpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYiA9ICpza2JwOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKm5oID0gc2tiX25ldHdvcmtfaGVhZGVyKHNrYik7CiAKLQlpZiAoc2tiLT5uaC5yYXdbb3B0b2ZmKzFdID09IDIpIHsKKwlpZiAobmhbb3B0b2ZmICsgMV0gPT0gMikgewogCQlJUDZDQihza2IpLT5yYSA9IG9wdG9mZjsKIAkJcmV0dXJuIDE7CiAJfQogCUxJTUlUX05FVERFQlVHKEtFUk5fREVCVUcgImlwdjZfaG9wX3JhOiB3cm9uZyBSQSBsZW5ndGggJWRcbiIsCi0JCSAgICAgICBza2ItPm5oLnJhd1tvcHRvZmYrMV0pOworCQkgICAgICAgbmhbb3B0b2ZmICsgMV0pOwogCWtmcmVlX3NrYihza2IpOwogCXJldHVybiAwOwogfQpAQCAtNjcyLDIzICs2ODIsMjQgQEAKIHN0YXRpYyBpbnQgaXB2Nl9ob3BfanVtYm8oc3RydWN0IHNrX2J1ZmYgKipza2JwLCBpbnQgb3B0b2ZmKQogewogCXN0cnVjdCBza19idWZmICpza2IgPSAqc2ticDsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpuaCA9IHNrYl9uZXR3b3JrX2hlYWRlcihza2IpOwogCXUzMiBwa3RfbGVuOwogCi0JaWYgKHNrYi0+bmgucmF3W29wdG9mZisxXSAhPSA0IHx8IChvcHRvZmYmMykgIT0gMikgeworCWlmIChuaFtvcHRvZmYgKyAxXSAhPSA0IHx8IChvcHRvZmYgJiAzKSAhPSAyKSB7CiAJCUxJTUlUX05FVERFQlVHKEtFUk5fREVCVUcgImlwdjZfaG9wX2p1bWJvOiB3cm9uZyBqdW1ibyBvcHQgbGVuZ3RoL2FsaWdubWVudCAlZFxuIiwKLQkJCSAgICAgICBza2ItPm5oLnJhd1tvcHRvZmYrMV0pOworCQkJICAgICAgIG5oW29wdG9mZisxXSk7CiAJCUlQNl9JTkNfU1RBVFNfQkgoaXA2X2RzdF9pZGV2KHNrYi0+ZHN0KSwKIAkJCQkgSVBTVEFUU19NSUJfSU5IRFJFUlJPUlMpOwogCQlnb3RvIGRyb3A7CiAJfQogCi0JcGt0X2xlbiA9IG50b2hsKCooX19iZTMyKikoc2tiLT5uaC5yYXcrb3B0b2ZmKzIpKTsKKwlwa3RfbGVuID0gbnRvaGwoKihfX2JlMzIgKikobmggKyBvcHRvZmYgKyAyKSk7CiAJaWYgKHBrdF9sZW4gPD0gSVBWNl9NQVhQTEVOKSB7CiAJCUlQNl9JTkNfU1RBVFNfQkgoaXA2X2RzdF9pZGV2KHNrYi0+ZHN0KSwgSVBTVEFUU19NSUJfSU5IRFJFUlJPUlMpOwogCQlpY21wdjZfcGFyYW1fcHJvYihza2IsIElDTVBWNl9IRFJfRklFTEQsIG9wdG9mZisyKTsKIAkJcmV0dXJuIDA7CiAJfQotCWlmIChza2ItPm5oLmlwdjZoLT5wYXlsb2FkX2xlbikgeworCWlmIChpcHY2X2hkcihza2IpLT5wYXlsb2FkX2xlbikgewogCQlJUDZfSU5DX1NUQVRTX0JIKGlwNl9kc3RfaWRldihza2ItPmRzdCksIElQU1RBVFNfTUlCX0lOSERSRVJST1JTKTsKIAkJaWNtcHY2X3BhcmFtX3Byb2Ioc2tiLCBJQ01QVjZfSERSX0ZJRUxELCBvcHRvZmYpOwogCQlyZXR1cm4gMDsKQEAgLTcyNywxMyArNzM4LDE0IEBACiAJc3RydWN0IGluZXQ2X3NrYl9wYXJtICpvcHQgPSBJUDZDQihza2IpOwogCiAJLyoKLQkgKiBza2ItPm5oLnJhdyBpcyBlcXVhbCB0byBza2ItPmRhdGEsIGFuZAotCSAqIHNrYi0+aC5yYXcgLSBza2ItPm5oLnJhdyBpcyBhbHdheXMgZXF1YWwgdG8KKwkgKiBza2JfbmV0d29ya19oZWFkZXIoc2tiKSBpcyBlcXVhbCB0byBza2ItPmRhdGEsIGFuZAorCSAqIHNrYl9uZXR3b3JrX2hlYWRlcl9sZW4oc2tiKSBpcyBhbHdheXMgZXF1YWwgdG8KIAkgKiBzaXplb2Yoc3RydWN0IGlwdjZoZHIpIGJ5IGRlZmluaXRpb24gb2YKIAkgKiBob3AtYnktaG9wIG9wdGlvbnMuCiAJICovCiAJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSArIDgpIHx8Ci0JICAgICFwc2tiX21heV9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSArICgoc2tiLT5oLnJhd1sxXSArIDEpIDw8IDMpKSkgeworCSAgICAhcHNrYl9tYXlfcHVsbChza2IsIChzaXplb2Yoc3RydWN0IGlwdjZoZHIpICsKKwkJCQkgKChza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpWzFdICsgMSkgPDwgMykpKSkgewogCQlrZnJlZV9za2Ioc2tiKTsKIAkJcmV0dXJuIC0xOwogCX0KQEAgLTc0MSw3ICs3NTMsNyBAQAogCW9wdC0+aG9wID0gc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKTsKIAlpZiAoaXA2X3BhcnNlX3Rsdih0bHZwcm9jaG9wb3B0X2xzdCwgc2ticCkpIHsKIAkJc2tiID0gKnNrYnA7Ci0JCXNrYi0+aC5yYXcgKz0gKHNrYi0+aC5yYXdbMV0rMSk8PDM7CisJCXNrYi0+dHJhbnNwb3J0X2hlYWRlciArPSAoc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKVsxXSArIDEpIDw8IDM7CiAJCW9wdCA9IElQNkNCKHNrYik7CiAJCW9wdC0+bmhvZmYgPSBzaXplb2Yoc3RydWN0IGlwdjZoZHIpOwogCQlyZXR1cm4gMTsKQEAgLTgxMCw2ICs4MjIsOCBAQAogCQlpcHY2X3B1c2hfZXh0aGRyKHNrYiwgcHJvdG8sIE5FWFRIRFJfSE9QLCBvcHQtPmhvcG9wdCk7CiB9CiAKK0VYUE9SVF9TWU1CT0woaXB2Nl9wdXNoX25mcmFnX29wdHMpOworCiB2b2lkIGlwdjZfcHVzaF9mcmFnX29wdHMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGlwdjZfdHhvcHRpb25zICpvcHQsIHU4ICpwcm90bykKIHsKIAlpZiAob3B0LT5kc3Qxb3B0KQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvZmliNl9ydWxlcy5jIGIvbmV0L2lwdjYvZmliNl9ydWxlcy5jCmluZGV4IGVhMzAzNWIuLmZjMzg4MmMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2ZpYjZfcnVsZXMuYworKysgYi9uZXQvaXB2Ni9maWI2X3J1bGVzLmMKQEAgLTE3LDYgKzE3LDcgQEAKIAogI2luY2x1ZGUgPG5ldC9maWJfcnVsZXMuaD4KICNpbmNsdWRlIDxuZXQvaXB2Ni5oPgorI2luY2x1ZGUgPG5ldC9hZGRyY29uZi5oPgogI2luY2x1ZGUgPG5ldC9pcDZfcm91dGUuaD4KICNpbmNsdWRlIDxuZXQvbmV0bGluay5oPgogCkBAIC05NSw4ICs5NiwyNyBAQAogCWlmICh0YWJsZSkKIAkJcnQgPSBsb29rdXAodGFibGUsIGZscCwgZmxhZ3MpOwogCi0JaWYgKHJ0ICE9ICZpcDZfbnVsbF9lbnRyeSkKKwlpZiAocnQgIT0gJmlwNl9udWxsX2VudHJ5KSB7CisJCXN0cnVjdCBmaWI2X3J1bGUgKnIgPSAoc3RydWN0IGZpYjZfcnVsZSAqKXJ1bGU7CisKKwkJLyoKKwkJICogSWYgd2UgbmVlZCB0byBmaW5kIGEgc291cmNlIGFkZHJlc3MgZm9yIHRoaXMgdHJhZmZpYywKKwkJICogd2UgY2hlY2sgdGhlIHJlc3VsdCBpZiBpdCBtZWV0cyByZXF1aXJlbWVudCBvZiB0aGUgcnVsZS4KKwkJICovCisJCWlmICgocnVsZS0+ZmxhZ3MgJiBGSUJfUlVMRV9GSU5EX1NBRERSKSAmJgorCQkgICAgci0+c3JjLnBsZW4gJiYgIShmbGFncyAmIFJUNl9MT09LVVBfRl9IQVNfU0FERFIpKSB7CisJCQlzdHJ1Y3QgaW42X2FkZHIgc2FkZHI7CisJCQlpZiAoaXB2Nl9nZXRfc2FkZHIoJnJ0LT51LmRzdCwgJmZscC0+Zmw2X2RzdCwKKwkJCQkJICAgJnNhZGRyKSkKKwkJCQlnb3RvIGFnYWluOworCQkJaWYgKCFpcHY2X3ByZWZpeF9lcXVhbCgmc2FkZHIsICZyLT5zcmMuYWRkciwKKwkJCQkJICAgICAgIHItPnNyYy5wbGVuKSkKKwkJCQlnb3RvIGFnYWluOworCQkJaXB2Nl9hZGRyX2NvcHkoJmZscC0+Zmw2X3NyYywgJnNhZGRyKTsKKwkJfQogCQlnb3RvIG91dDsKKwl9CithZ2FpbjoKIAlkc3RfcmVsZWFzZSgmcnQtPnUuZHN0KTsKIAlydCA9IE5VTEw7CiAJZ290byBvdXQ7CkBAIC0xMTcsOSArMTM3LDE3IEBACiAJICAgICFpcHY2X3ByZWZpeF9lcXVhbCgmZmwtPmZsNl9kc3QsICZyLT5kc3QuYWRkciwgci0+ZHN0LnBsZW4pKQogCQlyZXR1cm4gMDsKIAorCS8qCisJICogSWYgRklCX1JVTEVfRklORF9TQUREUiBpcyBzZXQgYW5kIHdlIGRvIG5vdCBoYXZlIGEKKwkgKiBzb3VyY2UgYWRkcmVzcyBmb3IgdGhlIHRyYWZmaWMsIHdlIGRlZmVyIGNoZWNrIGZvcgorCSAqIHNvdXJjZSBhZGRyZXNzLgorCSAqLwogCWlmIChyLT5zcmMucGxlbikgewotCQlpZiAoIShmbGFncyAmIFJUNl9MT09LVVBfRl9IQVNfU0FERFIpIHx8Ci0JCSAgICAhaXB2Nl9wcmVmaXhfZXF1YWwoJmZsLT5mbDZfc3JjLCAmci0+c3JjLmFkZHIsIHItPnNyYy5wbGVuKSkKKwkJaWYgKGZsYWdzICYgUlQ2X0xPT0tVUF9GX0hBU19TQUREUikgeworCQkJaWYgKCFpcHY2X3ByZWZpeF9lcXVhbCgmZmwtPmZsNl9zcmMsICZyLT5zcmMuYWRkciwKKwkJCQkJICAgICAgIHItPnNyYy5wbGVuKSkKKwkJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIGlmICghKHItPmNvbW1vbi5mbGFncyAmIEZJQl9SVUxFX0ZJTkRfU0FERFIpKQogCQkJcmV0dXJuIDA7CiAJfQogCkBAIC0yMTYsMTEgKzI0NCw2IEBACiAJcmV0dXJuIC1FTk9CVUZTOwogfQogCi1pbnQgZmliNl9ydWxlc19kdW1wKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYikKLXsKLQlyZXR1cm4gZmliX3J1bGVzX2R1bXAoc2tiLCBjYiwgQUZfSU5FVDYpOwotfQotCiBzdGF0aWMgdTMyIGZpYjZfcnVsZV9kZWZhdWx0X3ByZWYodm9pZCkKIHsKIAlyZXR1cm4gMHgzRkZGOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvaWNtcC5jIGIvbmV0L2lwdjYvaWNtcC5jCmluZGV4IGVkZmU5OGIuLmU5YmNjZTkgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2ljbXAuYworKysgYi9uZXQvaXB2Ni9pY21wLmMKQEAgLTY4LDYgKzY4LDcgQEAKICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAKIERFRklORV9TTk1QX1NUQVQoc3RydWN0IGljbXB2Nl9taWIsIGljbXB2Nl9zdGF0aXN0aWNzKSBfX3JlYWRfbW9zdGx5OworRVhQT1JUX1NZTUJPTChpY21wdjZfc3RhdGlzdGljcyk7CiAKIC8qCiAgKglUaGUgSUNNUCBzb2NrZXQocykuIFRoaXMgaXMgdGhlIG1vc3QgY29udmVuaWVudCB3YXkgdG8gZmxvdyBjb250cm9sCkBAIC0xMjgsOSArMTI5LDkgQEAKIAogc3RhdGljIGludCBpc19pbmVsaWdpYmxlKHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JaW50IHB0ciA9ICh1OCopKHNrYi0+bmguaXB2NmgrMSkgLSBza2ItPmRhdGE7CisJaW50IHB0ciA9ICh1OCAqKShpcHY2X2hkcihza2IpICsgMSkgLSBza2ItPmRhdGE7CiAJaW50IGxlbiA9IHNrYi0+bGVuIC0gcHRyOwotCV9fdTggbmV4dGhkciA9IHNrYi0+bmguaXB2NmgtPm5leHRoZHI7CisJX191OCBuZXh0aGRyID0gaXB2Nl9oZHIoc2tiKS0+bmV4dGhkcjsKIAogCWlmIChsZW4gPCAwKQogCQlyZXR1cm4gMTsKQEAgLTIwNSw3ICsyMDYsNyBAQAogewogCXU4IF9vcHR2YWwsICpvcDsKIAotCW9mZnNldCArPSBza2ItPm5oLnJhdyAtIHNrYi0+ZGF0YTsKKwlvZmZzZXQgKz0gc2tiX25ldHdvcmtfb2Zmc2V0KHNrYik7CiAJb3AgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBvZmZzZXQsIHNpemVvZihfb3B0dmFsKSwgJl9vcHR2YWwpOwogCWlmIChvcCA9PSBOVUxMKQogCQlyZXR1cm4gMTsKQEAgLTIyMSw3ICsyMjIsNyBAQAogCWlmICgoc2tiID0gc2tiX3BlZWsoJnNrLT5za193cml0ZV9xdWV1ZSkpID09IE5VTEwpCiAJCWdvdG8gb3V0OwogCi0JaWNtcDZoID0gKHN0cnVjdCBpY21wNmhkciopIHNrYi0+aC5yYXc7CisJaWNtcDZoID0gaWNtcDZfaGRyKHNrYik7CiAJbWVtY3B5KGljbXA2aCwgdGhkciwgc2l6ZW9mKHN0cnVjdCBpY21wNmhkcikpOwogCWljbXA2aC0+aWNtcDZfY2tzdW0gPSAwOwogCkBAIC0yNzQsNyArMjc1LDcgQEAKICNpZmRlZiBDT05GSUdfSVBWNl9NSVA2CiBzdGF0aWMgdm9pZCBtaXA2X2FkZHJfc3dhcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXN0cnVjdCBpcHY2aGRyICppcGggPSBza2ItPm5oLmlwdjZoOworCXN0cnVjdCBpcHY2aGRyICppcGggPSBpcHY2X2hkcihza2IpOwogCXN0cnVjdCBpbmV0Nl9za2JfcGFybSAqb3B0ID0gSVA2Q0Ioc2tiKTsKIAlzdHJ1Y3QgaXB2Nl9kZXN0b3B0X2hhbyAqaGFvOwogCXN0cnVjdCBpbjZfYWRkciB0bXA7CkBAIC0yODMsNyArMjg0LDggQEAKIAlpZiAob3B0LT5kc3RoYW8pIHsKIAkJb2ZmID0gaXB2Nl9maW5kX3Rsdihza2IsIG9wdC0+ZHN0aGFvLCBJUFY2X1RMVl9IQU8pOwogCQlpZiAobGlrZWx5KG9mZiA+PSAwKSkgewotCQkJaGFvID0gKHN0cnVjdCBpcHY2X2Rlc3RvcHRfaGFvICopKHNrYi0+bmgucmF3ICsgb2ZmKTsKKwkJCWhhbyA9IChzdHJ1Y3QgaXB2Nl9kZXN0b3B0X2hhbyAqKQorCQkJCQkoc2tiX25ldHdvcmtfaGVhZGVyKHNrYikgKyBvZmYpOwogCQkJaXB2Nl9hZGRyX2NvcHkoJnRtcCwgJmlwaC0+c2FkZHIpOwogCQkJaXB2Nl9hZGRyX2NvcHkoJmlwaC0+c2FkZHIsICZoYW8tPmFkZHIpOwogCQkJaXB2Nl9hZGRyX2NvcHkoJmhhby0+YWRkciwgJnRtcCk7CkBAIC0zMDEsNyArMzAzLDcgQEAKIAkJIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGluZXQ2X2RldiAqaWRldiA9IE5VTEw7Ci0Jc3RydWN0IGlwdjZoZHIgKmhkciA9IHNrYi0+bmguaXB2Nmg7CisJc3RydWN0IGlwdjZoZHIgKmhkciA9IGlwdjZfaGRyKHNrYik7CiAJc3RydWN0IHNvY2sgKnNrOwogCXN0cnVjdCBpcHY2X3BpbmZvICpucDsKIAlzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyID0gTlVMTDsKQEAgLTMxNSw3ICszMTcsOCBAQAogCWludCBobGltaXQsIHRjbGFzczsKIAlpbnQgZXJyID0gMDsKIAotCWlmICgodTgqKWhkciA8IHNrYi0+aGVhZCB8fCAodTgqKShoZHIrMSkgPiBza2ItPnRhaWwpCisJaWYgKCh1OCAqKWhkciA8IHNrYi0+aGVhZCB8fAorCSAgICAoc2tiLT5uZXR3b3JrX2hlYWRlciArIHNpemVvZigqaGRyKSkgPiBza2ItPnRhaWwpCiAJCXJldHVybjsKIAogCS8qCkBAIC00MzAsNyArNDMzLDcgQEAKIAkJdGNsYXNzID0gMDsKIAogCW1zZy5za2IgPSBza2I7Ci0JbXNnLm9mZnNldCA9IHNrYi0+bmgucmF3IC0gc2tiLT5kYXRhOworCW1zZy5vZmZzZXQgPSBza2JfbmV0d29ya19vZmZzZXQoc2tiKTsKIAltc2cudHlwZSA9IHR5cGU7CiAKIAlsZW4gPSBza2ItPmxlbiAtIG1zZy5vZmZzZXQ7CkBAIC00NjYsMTMgKzQ2OSwxNSBAQAogCWljbXB2Nl94bWl0X3VubG9jaygpOwogfQogCitFWFBPUlRfU1lNQk9MKGljbXB2Nl9zZW5kKTsKKwogc3RhdGljIHZvaWQgaWNtcHY2X2VjaG9fcmVwbHkoc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3Qgc29jayAqc2s7CiAJc3RydWN0IGluZXQ2X2RldiAqaWRldjsKIAlzdHJ1Y3QgaXB2Nl9waW5mbyAqbnA7CiAJc3RydWN0IGluNl9hZGRyICpzYWRkciA9IE5VTEw7Ci0Jc3RydWN0IGljbXA2aGRyICppY21waCA9IChzdHJ1Y3QgaWNtcDZoZHIgKikgc2tiLT5oLnJhdzsKKwlzdHJ1Y3QgaWNtcDZoZHIgKmljbXBoID0gaWNtcDZfaGRyKHNrYik7CiAJc3RydWN0IGljbXA2aGRyIHRtcF9oZHI7CiAJc3RydWN0IGZsb3dpIGZsOwogCXN0cnVjdCBpY21wdjZfbXNnIG1zZzsKQEAgLTQ4MSw3ICs0ODYsNyBAQAogCWludCBobGltaXQ7CiAJaW50IHRjbGFzczsKIAotCXNhZGRyID0gJnNrYi0+bmguaXB2NmgtPmRhZGRyOworCXNhZGRyID0gJmlwdjZfaGRyKHNrYiktPmRhZGRyOwogCiAJaWYgKCFpcHY2X3VuaWNhc3RfZGVzdGluYXRpb24oc2tiKSkKIAkJc2FkZHIgPSBOVUxMOwpAQCAtNDkxLDcgKzQ5Niw3IEBACiAKIAltZW1zZXQoJmZsLCAwLCBzaXplb2YoZmwpKTsKIAlmbC5wcm90byA9IElQUFJPVE9fSUNNUFY2OwotCWlwdjZfYWRkcl9jb3B5KCZmbC5mbDZfZHN0LCAmc2tiLT5uaC5pcHY2aC0+c2FkZHIpOworCWlwdjZfYWRkcl9jb3B5KCZmbC5mbDZfZHN0LCAmaXB2Nl9oZHIoc2tiKS0+c2FkZHIpOwogCWlmIChzYWRkcikKIAkJaXB2Nl9hZGRyX2NvcHkoJmZsLmZsNl9zcmMsIHNhZGRyKTsKIAlmbC5vaWYgPSBza2ItPmRldi0+aWZpbmRleDsKQEAgLTU3OSw4ICs1ODQsOCBAQAogCWlmICghcHNrYl9tYXlfcHVsbChza2IsIGlubmVyX29mZnNldCs4KSkKIAkJcmV0dXJuOwogCi0Jc2FkZHIgPSAmc2tiLT5uaC5pcHY2aC0+c2FkZHI7Ci0JZGFkZHIgPSAmc2tiLT5uaC5pcHY2aC0+ZGFkZHI7CisJc2FkZHIgPSAmaXB2Nl9oZHIoc2tiKS0+c2FkZHI7CisJZGFkZHIgPSAmaXB2Nl9oZHIoc2tiKS0+ZGFkZHI7CiAKIAkvKiBCVUdHR19GVVRVUkU6IHdlIHNob3VsZCB0cnkgdG8gcGFyc2UgZXh0aGRycyBpbiB0aGlzIHBhY2tldC4KIAkgICBXaXRob3V0IHRoaXMgd2Ugd2lsbCBub3QgYWJsZSBmLmUuIHRvIG1ha2Ugc291cmNlIHJvdXRlZApAQCAtNjI0LDggKzYyOSw4IEBACiAKIAlJQ01QNl9JTkNfU1RBVFNfQkgoaWRldiwgSUNNUDZfTUlCX0lOTVNHUyk7CiAKLQlzYWRkciA9ICZza2ItPm5oLmlwdjZoLT5zYWRkcjsKLQlkYWRkciA9ICZza2ItPm5oLmlwdjZoLT5kYWRkcjsKKwlzYWRkciA9ICZpcHY2X2hkcihza2IpLT5zYWRkcjsKKwlkYWRkciA9ICZpcHY2X2hkcihza2IpLT5kYWRkcjsKIAogCS8qIFBlcmZvcm0gY2hlY2tzdW0uICovCiAJc3dpdGNoIChza2ItPmlwX3N1bW1lZCkgewpAQCAtNjQ3LDcgKzY1Miw3IEBACiAJaWYgKCFwc2tiX3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IGljbXA2aGRyKSkpCiAJCWdvdG8gZGlzY2FyZF9pdDsKIAotCWhkciA9IChzdHJ1Y3QgaWNtcDZoZHIgKikgc2tiLT5oLnJhdzsKKwloZHIgPSBpY21wNl9oZHIoc2tiKTsKIAogCXR5cGUgPSBoZHItPmljbXA2X3R5cGU7CiAKQEAgLTY3Myw3ICs2NzgsNyBAQAogCQkgKi8KIAkJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSkpCiAJCQlnb3RvIGRpc2NhcmRfaXQ7Ci0JCWhkciA9IChzdHJ1Y3QgaWNtcDZoZHIgKikgc2tiLT5oLnJhdzsKKwkJaGRyID0gaWNtcDZfaGRyKHNrYik7CiAJCW9yaWdfaGRyID0gKHN0cnVjdCBpcHY2aGRyICopIChoZHIgKyAxKTsKIAkJcnQ2X3BtdHVfZGlzY292ZXJ5KCZvcmlnX2hkci0+ZGFkZHIsICZvcmlnX2hkci0+c2FkZHIsIGRldiwKIAkJCQkgICBudG9obChoZHItPmljbXA2X210dSkpOwpAQCAtNzI3LDcgKzczMiw4IEBACiAJCSAqLwogCiAJCWljbXB2Nl9ub3RpZnkoc2tiLCB0eXBlLCBoZHItPmljbXA2X2NvZGUsIGhkci0+aWNtcDZfbXR1KTsKLQl9OworCX0KKwogCWtmcmVlX3NrYihza2IpOwogCXJldHVybiAwOwogCkBAIC04NjAsMTEgKzg2NiwxMyBAQAogCWNhc2UgSUNNUFY2X1RJTUVfRVhDRUVEOgogCQkqZXJyID0gRUhPU1RVTlJFQUNIOwogCQlicmVhazsKLQl9OworCX0KIAogCXJldHVybiBmYXRhbDsKIH0KIAorRVhQT1JUX1NZTUJPTChpY21wdjZfZXJyX2NvbnZlcnQpOworCiAjaWZkZWYgQ09ORklHX1NZU0NUTAogY3RsX3RhYmxlIGlwdjZfaWNtcF90YWJsZVtdID0gewogCXsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2lwNl9maWIuYyBiL25ldC9pcHY2L2lwNl9maWIuYwppbmRleCAyNjhmNDc2Li5jYTA4ZWU4IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9pcDZfZmliLmMKKysrIGIvbmV0L2lwdjYvaXA2X2ZpYi5jCkBAIC0zNTksNyArMzU5LDcgQEAKIAlyZXR1cm4gcmVzOwogfQogCi1pbnQgaW5ldDZfZHVtcF9maWIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKQorc3RhdGljIGludCBpbmV0Nl9kdW1wX2ZpYihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpCiB7CiAJdW5zaWduZWQgaW50IGgsIHNfaDsKIAl1bnNpZ25lZCBpbnQgZSA9IDAsIHNfZTsKQEAgLTE0ODYsNiArMTQ4Niw4IEBACiAJCQkJCSAgIE5VTEwsIE5VTEwpOwogCiAJZmliNl90YWJsZXNfaW5pdCgpOworCisJX19ydG5sX3JlZ2lzdGVyKFBGX0lORVQ2LCBSVE1fR0VUUk9VVEUsIE5VTEwsIGluZXQ2X2R1bXBfZmliKTsKIH0KIAogdm9pZCBmaWI2X2djX2NsZWFudXAodm9pZCkKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2lwNl9pbnB1dC5jIGIvbmV0L2lwdjYvaXA2X2lucHV0LmMKaW5kZXggNjFlN2E2Yy4uYmUwZWU4YSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvaXA2X2lucHV0LmMKKysrIGIvbmV0L2lwdjYvaXA2X2lucHV0LmMKQEAgLTk2LDEyICs5NiwxMiBAQAogCWlmICh1bmxpa2VseSghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZigqaGRyKSkpKQogCQlnb3RvIGVycjsKIAotCWhkciA9IHNrYi0+bmguaXB2Nmg7CisJaGRyID0gaXB2Nl9oZHIoc2tiKTsKIAogCWlmIChoZHItPnZlcnNpb24gIT0gNikKIAkJZ290byBlcnI7CiAKLQlza2ItPmgucmF3ID0gKHU4ICopKGhkciArIDEpOworCXNrYi0+dHJhbnNwb3J0X2hlYWRlciA9IHNrYi0+bmV0d29ya19oZWFkZXIgKyBzaXplb2YoKmhkcik7CiAJSVA2Q0Ioc2tiKS0+bmhvZmYgPSBvZmZzZXRvZihzdHJ1Y3QgaXB2NmhkciwgbmV4dGhkcik7CiAKIAlwa3RfbGVuID0gbnRvaHMoaGRyLT5wYXlsb2FkX2xlbik7CkBAIC0xMTYsNyArMTE2LDcgQEAKIAkJCUlQNl9JTkNfU1RBVFNfQkgoaWRldiwgSVBTVEFUU19NSUJfSU5IRFJFUlJPUlMpOwogCQkJZ290byBkcm9wOwogCQl9Ci0JCWhkciA9IHNrYi0+bmguaXB2Nmg7CisJCWhkciA9IGlwdjZfaGRyKHNrYik7CiAJfQogCiAJaWYgKGhkci0+bmV4dGhkciA9PSBORVhUSERSX0hPUCkgewpAQCAtMTYwLDEwICsxNjAsMTAgQEAKIAlyY3VfcmVhZF9sb2NrKCk7CiByZXN1Ym1pdDoKIAlpZGV2ID0gaXA2X2RzdF9pZGV2KHNrYi0+ZHN0KTsKLQlpZiAoIXBza2JfcHVsbChza2IsIHNrYi0+aC5yYXcgLSBza2ItPmRhdGEpKQorCWlmICghcHNrYl9wdWxsKHNrYiwgc2tiX3RyYW5zcG9ydF9vZmZzZXQoc2tiKSkpCiAJCWdvdG8gZGlzY2FyZDsKIAluaG9mZiA9IElQNkNCKHNrYiktPm5ob2ZmOwotCW5leHRoZHIgPSBza2ItPm5oLnJhd1tuaG9mZl07CisJbmV4dGhkciA9IHNrYl9uZXR3b3JrX2hlYWRlcihza2IpW25ob2ZmXTsKIAogCXJhd19zayA9IHNrX2hlYWQoJnJhd192Nl9odGFibGVbbmV4dGhkciAmIChNQVhfSU5FVF9QUk9UT1MgLSAxKV0pOwogCWlmIChyYXdfc2sgJiYgIWlwdjZfcmF3X2RlbGl2ZXIoc2tiLCBuZXh0aGRyKSkKQEAgLTE4MSw5ICsxODEsOSBAQAogCQkJICAgaW5kZWZpbml0ZWx5LiAqLwogCQkJbmZfcmVzZXQoc2tiKTsKIAotCQkJc2tiX3Bvc3RwdWxsX3Jjc3VtKHNrYiwgc2tiLT5uaC5yYXcsCi0JCQkJCSAgIHNrYi0+aC5yYXcgLSBza2ItPm5oLnJhdyk7Ci0JCQloZHIgPSBza2ItPm5oLmlwdjZoOworCQkJc2tiX3Bvc3RwdWxsX3Jjc3VtKHNrYiwgc2tiX25ldHdvcmtfaGVhZGVyKHNrYiksCisJCQkJCSAgIHNrYl9uZXR3b3JrX2hlYWRlcl9sZW4oc2tiKSk7CisJCQloZHIgPSBpcHY2X2hkcihza2IpOwogCQkJaWYgKGlwdjZfYWRkcl9pc19tdWx0aWNhc3QoJmhkci0+ZGFkZHIpICYmCiAJCQkgICAgIWlwdjZfY2hrX21jYXN0X2FkZHIoc2tiLT5kZXYsICZoZHItPmRhZGRyLAogCQkJICAgICZoZHItPnNhZGRyKSAmJgpAQCAtMjM0LDcgKzIzNCw3IEBACiAKIAlJUDZfSU5DX1NUQVRTX0JIKGlwNl9kc3RfaWRldihza2ItPmRzdCksIElQU1RBVFNfTUlCX0lOTUNBU1RQS1RTKTsKIAotCWhkciA9IHNrYi0+bmguaXB2Nmg7CisJaGRyID0gaXB2Nl9oZHIoc2tiKTsKIAlkZWxpdmVyID0gbGlrZWx5KCEoc2tiLT5kZXYtPmZsYWdzICYgKElGRl9QUk9NSVNDfElGRl9BTExNVUxUSSkpKSB8fAogCSAgICBpcHY2X2Noa19tY2FzdF9hZGRyKHNrYi0+ZGV2LCAmaGRyLT5kYWRkciwgTlVMTCk7CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2lwNl9vdXRwdXQuYyBiL25ldC9pcHY2L2lwNl9vdXRwdXQuYwppbmRleCAzMDU1MTY5Li5mNTA4MTcxIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9pcDZfb3V0cHV0LmMKKysrIGIvbmV0L2lwdjYvaXA2X291dHB1dC5jCkBAIC04OCw4ICs4OCw4IEBACiAvKiBkZXZfbG9vcGJhY2tfeG1pdCBmb3IgdXNlIHdpdGggbmV0ZmlsdGVyLiAqLwogc3RhdGljIGludCBpcDZfZGV2X2xvb3BiYWNrX3htaXQoc3RydWN0IHNrX2J1ZmYgKm5ld3NrYikKIHsKLQluZXdza2ItPm1hYy5yYXcgPSBuZXdza2ItPmRhdGE7Ci0JX19za2JfcHVsbChuZXdza2IsIG5ld3NrYi0+bmgucmF3IC0gbmV3c2tiLT5kYXRhKTsKKwlza2JfcmVzZXRfbWFjX2hlYWRlcihuZXdza2IpOworCV9fc2tiX3B1bGwobmV3c2tiLCBza2JfbmV0d29ya19vZmZzZXQobmV3c2tiKSk7CiAJbmV3c2tiLT5wa3RfdHlwZSA9IFBBQ0tFVF9MT09QQkFDSzsKIAluZXdza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOwogCUJVR19UUkFQKG5ld3NrYi0+ZHN0KTsKQEAgLTEwNywxMyArMTA3LDEzIEBACiAJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0lQVjYpOwogCXNrYi0+ZGV2ID0gZGV2OwogCi0JaWYgKGlwdjZfYWRkcl9pc19tdWx0aWNhc3QoJnNrYi0+bmguaXB2NmgtPmRhZGRyKSkgeworCWlmIChpcHY2X2FkZHJfaXNfbXVsdGljYXN0KCZpcHY2X2hkcihza2IpLT5kYWRkcikpIHsKIAkJc3RydWN0IGlwdjZfcGluZm8qIG5wID0gc2tiLT5zayA/IGluZXQ2X3NrKHNrYi0+c2spIDogTlVMTDsKIAkJc3RydWN0IGluZXQ2X2RldiAqaWRldiA9IGlwNl9kc3RfaWRldihza2ItPmRzdCk7CiAKIAkJaWYgKCEoZGV2LT5mbGFncyAmIElGRl9MT09QQkFDSykgJiYgKCFucCB8fCBucC0+bWNfbG9vcCkgJiYKLQkJICAgIGlwdjZfY2hrX21jYXN0X2FkZHIoZGV2LCAmc2tiLT5uaC5pcHY2aC0+ZGFkZHIsCi0JCQkJJnNrYi0+bmguaXB2NmgtPnNhZGRyKSkgeworCQkgICAgaXB2Nl9jaGtfbWNhc3RfYWRkcihkZXYsICZpcHY2X2hkcihza2IpLT5kYWRkciwKKwkJCQkJJmlwdjZfaGRyKHNrYiktPnNhZGRyKSkgewogCQkJc3RydWN0IHNrX2J1ZmYgKm5ld3NrYiA9IHNrYl9jbG9uZShza2IsIEdGUF9BVE9NSUMpOwogCiAJCQkvKiBEbyBub3QgY2hlY2sgZm9yIElGRl9BTExNVUxUSTsgbXVsdGljYXN0IHJvdXRpbmcKQEAgLTEyNCw3ICsxMjQsNyBAQAogCQkJCQluZXdza2ItPmRldiwKIAkJCQkJaXA2X2Rldl9sb29wYmFja194bWl0KTsKIAotCQkJaWYgKHNrYi0+bmguaXB2NmgtPmhvcF9saW1pdCA9PSAwKSB7CisJCQlpZiAoaXB2Nl9oZHIoc2tiKS0+aG9wX2xpbWl0ID09IDApIHsKIAkJCQlJUDZfSU5DX1NUQVRTKGlkZXYsIElQU1RBVFNfTUlCX09VVERJU0NBUkRTKTsKIAkJCQlrZnJlZV9za2Ioc2tiKTsKIAkJCQlyZXR1cm4gMDsKQEAgLTEzNyw5ICsxMzcsMTcgQEAKIAlyZXR1cm4gTkZfSE9PSyhQRl9JTkVUNiwgTkZfSVA2X1BPU1RfUk9VVElORywgc2tiLE5VTEwsIHNrYi0+ZGV2LGlwNl9vdXRwdXRfZmluaXNoKTsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgaXA2X3NrYl9kc3RfbXR1KHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGlwdjZfcGluZm8gKm5wID0gc2tiLT5zayA/IGluZXQ2X3NrKHNrYi0+c2spIDogTlVMTDsKKworCXJldHVybiAobnAgJiYgbnAtPnBtdHVkaXNjID09IElQVjZfUE1UVURJU0NfUFJPQkUpID8KKwkgICAgICAgc2tiLT5kc3QtPmRldi0+bXR1IDogZHN0X210dShza2ItPmRzdCk7Cit9CisKIGludCBpcDZfb3V0cHV0KHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JaWYgKChza2ItPmxlbiA+IGRzdF9tdHUoc2tiLT5kc3QpICYmICFza2JfaXNfZ3NvKHNrYikpIHx8CisJaWYgKChza2ItPmxlbiA+IGlwNl9za2JfZHN0X210dShza2IpICYmICFza2JfaXNfZ3NvKHNrYikpIHx8CiAJCQkJZHN0X2FsbGZyYWcoc2tiLT5kc3QpKQogCQlyZXR1cm4gaXA2X2ZyYWdtZW50KHNrYiwgaXA2X291dHB1dDIpOwogCWVsc2UKQEAgLTE5MSw3ICsxOTksOSBAQAogCQkJaXB2Nl9wdXNoX25mcmFnX29wdHMoc2tiLCBvcHQsICZwcm90bywgJmZpcnN0X2hvcCk7CiAJfQogCi0JaGRyID0gc2tiLT5uaC5pcHY2aCA9IChzdHJ1Y3QgaXB2Nmhkciopc2tiX3B1c2goc2tiLCBzaXplb2Yoc3RydWN0IGlwdjZoZHIpKTsKKwlza2JfcHVzaChza2IsIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikpOworCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOworCWhkciA9IGlwdjZfaGRyKHNrYik7CiAKIAkvKgogCSAqCUZpbGwgaW4gdGhlIElQdjYgaGVhZGVyCkBAIC0yMzksNiArMjQ5LDggQEAKIAlyZXR1cm4gLUVNU0dTSVpFOwogfQogCitFWFBPUlRfU1lNQk9MKGlwNl94bWl0KTsKKwogLyoKICAqCVRvIGF2b2lkIGV4dHJhIHByb2JsZW1zIE5EIHBhY2tldHMgYXJlIHNlbmQgdGhyb3VnaCB0aGlzCiAgKglyb3V0aW5lLiBJdCdzIGNvZGUgZHVwbGljYXRpb24gYnV0IEkgcmVhbGx5IHdhbnQgdG8gYXZvaWQKQEAgLTI1OSw4ICsyNzEsOSBAQAogCiAJdG90bGVuID0gbGVuICsgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKTsKIAotCWhkciA9IChzdHJ1Y3QgaXB2NmhkciAqKSBza2JfcHV0KHNrYiwgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSk7Ci0Jc2tiLT5uaC5pcHY2aCA9IGhkcjsKKwlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiKTsKKwlza2JfcHV0KHNrYiwgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSk7CisJaGRyID0gaXB2Nl9oZHIoc2tiKTsKIAogCSooX19iZTMyKiloZHIgPSBodG9ubCgweDYwMDAwMDAwKTsKIApAQCAtMzA1LDcgKzMxOCw3IEBACiAKIHN0YXRpYyBpbnQgaXA2X2ZvcndhcmRfcHJveHlfY2hlY2soc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlzdHJ1Y3QgaXB2NmhkciAqaGRyID0gc2tiLT5uaC5pcHY2aDsKKwlzdHJ1Y3QgaXB2NmhkciAqaGRyID0gaXB2Nl9oZHIoc2tiKTsKIAl1OCBuZXh0aGRyID0gaGRyLT5uZXh0aGRyOwogCWludCBvZmZzZXQ7CiAKQEAgLTMxOSwxMCArMzMyLDExIEBACiAJaWYgKG5leHRoZHIgPT0gSVBQUk9UT19JQ01QVjYpIHsKIAkJc3RydWN0IGljbXA2aGRyICppY21wNjsKIAotCQlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCBza2ItPm5oLnJhdyArIG9mZnNldCArIDEgLSBza2ItPmRhdGEpKQorCQlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCAoc2tiX25ldHdvcmtfaGVhZGVyKHNrYikgKworCQkJCQkgb2Zmc2V0ICsgMSAtIHNrYi0+ZGF0YSkpKQogCQkJcmV0dXJuIDA7CiAKLQkJaWNtcDYgPSAoc3RydWN0IGljbXA2aGRyICopKHNrYi0+bmgucmF3ICsgb2Zmc2V0KTsKKwkJaWNtcDYgPSAoc3RydWN0IGljbXA2aGRyICopKHNrYl9uZXR3b3JrX2hlYWRlcihza2IpICsgb2Zmc2V0KTsKIAogCQlzd2l0Y2ggKGljbXA2LT5pY21wNl90eXBlKSB7CiAJCWNhc2UgTkRJU0NfUk9VVEVSX1NPTElDSVRBVElPTjoKQEAgLTM2MSw3ICszNzUsNyBAQAogaW50IGlwNl9mb3J3YXJkKHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IGRzdF9lbnRyeSAqZHN0ID0gc2tiLT5kc3Q7Ci0Jc3RydWN0IGlwdjZoZHIgKmhkciA9IHNrYi0+bmguaXB2Nmg7CisJc3RydWN0IGlwdjZoZHIgKmhkciA9IGlwdjZfaGRyKHNrYik7CiAJc3RydWN0IGluZXQ2X3NrYl9wYXJtICpvcHQgPSBJUDZDQihza2IpOwogCiAJaWYgKGlwdjZfZGV2Y29uZi5mb3J3YXJkaW5nID09IDApCkBAIC0zNzIsNyArMzg2LDcgQEAKIAkJZ290byBkcm9wOwogCX0KIAotCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKKwlza2JfZm9yd2FyZF9jc3VtKHNrYik7CiAKIAkvKgogCSAqCVdlIERPIE5PVCBtYWtlIGFueSBwcm9jZXNzaW5nIG9uCkBAIC0zODgsNyArNDAyLDcgQEAKIAkgKgl0aGF0IGRpZmZlcmVudCBmcmFnbWVudHMgd2lsbCBnbyBhbG9uZyBvbmUgcGF0aC4gLS1BTksKIAkgKi8KIAlpZiAob3B0LT5yYSkgewotCQl1OCAqcHRyID0gc2tiLT5uaC5yYXcgKyBvcHQtPnJhOworCQl1OCAqcHRyID0gc2tiX25ldHdvcmtfaGVhZGVyKHNrYikgKyBvcHQtPnJhOwogCQlpZiAoaXA2X2NhbGxfcmFfY2hhaW4oc2tiLCAocHRyWzJdPDw4KSArIHB0clszXSkpCiAJCQlyZXR1cm4gMDsKIAl9CkBAIC00NzAsNyArNDg0LDcgQEAKIAkJZ290byBkcm9wOwogCX0KIAotCWhkciA9IHNrYi0+bmguaXB2Nmg7CisJaGRyID0gaXB2Nl9oZHIoc2tiKTsKIAogCS8qIE1hbmdsaW5nIGhvcHMgbnVtYmVyIGRlbGF5ZWQgdG8gcG9pbnQgYWZ0ZXIgc2tiIENPVyAqLwogCkBAIC00OTksMzMgKzUxMywxOCBAQAogI2lmZGVmIENPTkZJR19ORVRfU0NIRUQKIAl0by0+dGNfaW5kZXggPSBmcm9tLT50Y19pbmRleDsKICNlbmRpZgotI2lmZGVmIENPTkZJR19ORVRGSUxURVIKLQkvKiBDb25uZWN0aW9uIGFzc29jaWF0aW9uIGlzIHNhbWUgYXMgcHJlLWZyYWcgcGFja2V0ICovCi0JbmZfY29ubnRyYWNrX3B1dCh0by0+bmZjdCk7Ci0JdG8tPm5mY3QgPSBmcm9tLT5uZmN0OwotCW5mX2Nvbm50cmFja19nZXQodG8tPm5mY3QpOwotCXRvLT5uZmN0aW5mbyA9IGZyb20tPm5mY3RpbmZvOwotI2lmIGRlZmluZWQoQ09ORklHX05GX0NPTk5UUkFDSykgfHwgZGVmaW5lZChDT05GSUdfTkZfQ09OTlRSQUNLX01PRFVMRSkKLQluZl9jb25udHJhY2tfcHV0X3JlYXNtKHRvLT5uZmN0X3JlYXNtKTsKLQl0by0+bmZjdF9yZWFzbSA9IGZyb20tPm5mY3RfcmVhc207Ci0JbmZfY29ubnRyYWNrX2dldF9yZWFzbSh0by0+bmZjdF9yZWFzbSk7Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfQlJJREdFX05FVEZJTFRFUgotCW5mX2JyaWRnZV9wdXQodG8tPm5mX2JyaWRnZSk7Ci0JdG8tPm5mX2JyaWRnZSA9IGZyb20tPm5mX2JyaWRnZTsKLQluZl9icmlkZ2VfZ2V0KHRvLT5uZl9icmlkZ2UpOwotI2VuZGlmCi0jZW5kaWYKKwluZl9jb3B5KHRvLCBmcm9tKTsKIAlza2JfY29weV9zZWNtYXJrKHRvLCBmcm9tKTsKIH0KIAogaW50IGlwNl9maW5kXzFzdGZyYWdvcHQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTggKipuZXh0aGRyKQogewogCXUxNiBvZmZzZXQgPSBzaXplb2Yoc3RydWN0IGlwdjZoZHIpOwotCXN0cnVjdCBpcHY2X29wdF9oZHIgKmV4dGhkciA9IChzdHJ1Y3QgaXB2Nl9vcHRfaGRyKikoc2tiLT5uaC5pcHY2aCArIDEpOwotCXVuc2lnbmVkIGludCBwYWNrZXRfbGVuID0gc2tiLT50YWlsIC0gc2tiLT5uaC5yYXc7CisJc3RydWN0IGlwdjZfb3B0X2hkciAqZXh0aGRyID0KKwkJCQkoc3RydWN0IGlwdjZfb3B0X2hkciAqKShpcHY2X2hkcihza2IpICsgMSk7CisJdW5zaWduZWQgaW50IHBhY2tldF9sZW4gPSBza2ItPnRhaWwgLSBza2ItPm5ldHdvcmtfaGVhZGVyOwogCWludCBmb3VuZF9yaGRyID0gMDsKLQkqbmV4dGhkciA9ICZza2ItPm5oLmlwdjZoLT5uZXh0aGRyOworCSpuZXh0aGRyID0gJmlwdjZfaGRyKHNrYiktPm5leHRoZHI7CiAKIAl3aGlsZSAob2Zmc2V0ICsgMSA8PSBwYWNrZXRfbGVuKSB7CiAKQEAgLTU1MCw3ICs1NDksOCBAQAogCiAJCW9mZnNldCArPSBpcHY2X29wdGxlbihleHRoZHIpOwogCQkqbmV4dGhkciA9ICZleHRoZHItPm5leHRoZHI7Ci0JCWV4dGhkciA9IChzdHJ1Y3QgaXB2Nl9vcHRfaGRyKikoc2tiLT5uaC5yYXcgKyBvZmZzZXQpOworCQlleHRoZHIgPSAoc3RydWN0IGlwdjZfb3B0X2hkciAqKShza2JfbmV0d29ya19oZWFkZXIoc2tiKSArCisJCQkJCQkgb2Zmc2V0KTsKIAl9CiAKIAlyZXR1cm4gb2Zmc2V0OwpAQCAtNTc0LDcgKzU3NCwyMCBAQAogCWhsZW4gPSBpcDZfZmluZF8xc3RmcmFnb3B0KHNrYiwgJnByZXZoZHIpOwogCW5leHRoZHIgPSAqcHJldmhkcjsKIAotCW10dSA9IGRzdF9tdHUoJnJ0LT51LmRzdCk7CisJbXR1ID0gaXA2X3NrYl9kc3RfbXR1KHNrYik7CisKKwkvKiBXZSBtdXN0IG5vdCBmcmFnbWVudCBpZiB0aGUgc29ja2V0IGlzIHNldCB0byBmb3JjZSBNVFUgZGlzY292ZXJ5CisJICogb3IgaWYgdGhlIHNrYiBpdCBub3QgZ2VuZXJhdGVkIGJ5IGEgbG9jYWwgc29ja2V0LiAgKFRoaXMgbGFzdAorCSAqIGNoZWNrIHNob3VsZCBiZSByZWR1bmRhbnQsIGJ1dCBpdCdzIGZyZWUuKQorCSAqLworCWlmICghbnAgfHwgbnAtPnBtdHVkaXNjID49IElQVjZfUE1UVURJU0NfRE8pIHsKKwkJc2tiLT5kZXYgPSBza2ItPmRzdC0+ZGV2OworCQlpY21wdjZfc2VuZChza2IsIElDTVBWNl9QS1RfVE9PQklHLCAwLCBtdHUsIHNrYi0+ZGV2KTsKKwkJSVA2X0lOQ19TVEFUUyhpcDZfZHN0X2lkZXYoc2tiLT5kc3QpLCBJUFNUQVRTX01JQl9GUkFHRkFJTFMpOworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIC1FTVNHU0laRTsKKwl9CisKIAlpZiAobnAgJiYgbnAtPmZyYWdfc2l6ZSA8IG10dSkgewogCQlpZiAobnAtPmZyYWdfc2l6ZSkKIAkJCW10dSA9IG5wLT5mcmFnX3NpemU7CkBAIC02MTYsNyArNjI5LDcgQEAKIAkJLyogQlVJTEQgSEVBREVSICovCiAKIAkJKnByZXZoZHIgPSBORVhUSERSX0ZSQUdNRU5UOwotCQl0bXBfaGRyID0ga21lbWR1cChza2ItPm5oLnJhdywgaGxlbiwgR0ZQX0FUT01JQyk7CisJCXRtcF9oZHIgPSBrbWVtZHVwKHNrYl9uZXR3b3JrX2hlYWRlcihza2IpLCBobGVuLCBHRlBfQVRPTUlDKTsKIAkJaWYgKCF0bXBfaGRyKSB7CiAJCQlJUDZfSU5DX1NUQVRTKGlwNl9kc3RfaWRldihza2ItPmRzdCksIElQU1RBVFNfTUlCX0ZSQUdGQUlMUyk7CiAJCQlyZXR1cm4gLUVOT01FTTsKQEAgLTYyNCw4ICs2MzcsOSBAQAogCiAJCV9fc2tiX3B1bGwoc2tiLCBobGVuKTsKIAkJZmggPSAoc3RydWN0IGZyYWdfaGRyKilfX3NrYl9wdXNoKHNrYiwgc2l6ZW9mKHN0cnVjdCBmcmFnX2hkcikpOwotCQlza2ItPm5oLnJhdyA9IF9fc2tiX3B1c2goc2tiLCBobGVuKTsKLQkJbWVtY3B5KHNrYi0+bmgucmF3LCB0bXBfaGRyLCBobGVuKTsKKwkJX19za2JfcHVzaChza2IsIGhsZW4pOworCQlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiKTsKKwkJbWVtY3B5KHNrYl9uZXR3b3JrX2hlYWRlcihza2IpLCB0bXBfaGRyLCBobGVuKTsKIAogCQlpcHY2X3NlbGVjdF9pZGVudChza2IsIGZoKTsKIAkJZmgtPm5leHRoZHIgPSBuZXh0aGRyOwpAQCAtNjM2LDcgKzY1MCw4IEBACiAJCWZpcnN0X2xlbiA9IHNrYl9wYWdlbGVuKHNrYik7CiAJCXNrYi0+ZGF0YV9sZW4gPSBmaXJzdF9sZW4gLSBza2JfaGVhZGxlbihza2IpOwogCQlza2ItPmxlbiA9IGZpcnN0X2xlbjsKLQkJc2tiLT5uaC5pcHY2aC0+cGF5bG9hZF9sZW4gPSBodG9ucyhmaXJzdF9sZW4gLSBzaXplb2Yoc3RydWN0IGlwdjZoZHIpKTsKKwkJaXB2Nl9oZHIoc2tiKS0+cGF5bG9hZF9sZW4gPSBodG9ucyhmaXJzdF9sZW4gLQorCQkJCQkJICAgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSk7CiAKIAkJZHN0X2hvbGQoJnJ0LT51LmRzdCk7CiAKQEAgLTY0NSwxMCArNjYwLDEyIEBACiAJCQkgKiBiZWZvcmUgcHJldmlvdXMgb25lIHdlbnQgZG93bi4gKi8KIAkJCWlmIChmcmFnKSB7CiAJCQkJZnJhZy0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKLQkJCQlmcmFnLT5oLnJhdyA9IGZyYWctPmRhdGE7CisJCQkJc2tiX3Jlc2V0X3RyYW5zcG9ydF9oZWFkZXIoZnJhZyk7CiAJCQkJZmggPSAoc3RydWN0IGZyYWdfaGRyKilfX3NrYl9wdXNoKGZyYWcsIHNpemVvZihzdHJ1Y3QgZnJhZ19oZHIpKTsKLQkJCQlmcmFnLT5uaC5yYXcgPSBfX3NrYl9wdXNoKGZyYWcsIGhsZW4pOwotCQkJCW1lbWNweShmcmFnLT5uaC5yYXcsIHRtcF9oZHIsIGhsZW4pOworCQkJCV9fc2tiX3B1c2goZnJhZywgaGxlbik7CisJCQkJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKGZyYWcpOworCQkJCW1lbWNweShza2JfbmV0d29ya19oZWFkZXIoZnJhZyksIHRtcF9oZHIsCisJCQkJICAgICAgIGhsZW4pOwogCQkJCW9mZnNldCArPSBza2ItPmxlbiAtIGhsZW4gLSBzaXplb2Yoc3RydWN0IGZyYWdfaGRyKTsKIAkJCQlmaC0+bmV4dGhkciA9IG5leHRoZHI7CiAJCQkJZmgtPnJlc2VydmVkID0gMDsKQEAgLTY1Niw3ICs2NzMsOSBAQAogCQkJCWlmIChmcmFnLT5uZXh0ICE9IE5VTEwpCiAJCQkJCWZoLT5mcmFnX29mZiB8PSBodG9ucyhJUDZfTUYpOwogCQkJCWZoLT5pZGVudGlmaWNhdGlvbiA9IGZyYWdfaWQ7Ci0JCQkJZnJhZy0+bmguaXB2NmgtPnBheWxvYWRfbGVuID0gaHRvbnMoZnJhZy0+bGVuIC0gc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSk7CisJCQkJaXB2Nl9oZHIoZnJhZyktPnBheWxvYWRfbGVuID0KKwkJCQkJCWh0b25zKGZyYWctPmxlbiAtCisJCQkJCQkgICAgICBzaXplb2Yoc3RydWN0IGlwdjZoZHIpKTsKIAkJCQlpcDZfY29weV9tZXRhZGF0YShmcmFnLCBza2IpOwogCQkJfQogCkBAIC03MzMsOSArNzUyLDEwIEBACiAJCWlwNl9jb3B5X21ldGFkYXRhKGZyYWcsIHNrYik7CiAJCXNrYl9yZXNlcnZlKGZyYWcsIExMX1JFU0VSVkVEX1NQQUNFKHJ0LT51LmRzdC5kZXYpKTsKIAkJc2tiX3B1dChmcmFnLCBsZW4gKyBobGVuICsgc2l6ZW9mKHN0cnVjdCBmcmFnX2hkcikpOwotCQlmcmFnLT5uaC5yYXcgPSBmcmFnLT5kYXRhOwotCQlmaCA9IChzdHJ1Y3QgZnJhZ19oZHIqKShmcmFnLT5kYXRhICsgaGxlbik7Ci0JCWZyYWctPmgucmF3ID0gZnJhZy0+ZGF0YSArIGhsZW4gKyBzaXplb2Yoc3RydWN0IGZyYWdfaGRyKTsKKwkJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKGZyYWcpOworCQlmaCA9IChzdHJ1Y3QgZnJhZ19oZHIgKikoc2tiX25ldHdvcmtfaGVhZGVyKGZyYWcpICsgaGxlbik7CisJCWZyYWctPnRyYW5zcG9ydF9oZWFkZXIgPSAoZnJhZy0+bmV0d29ya19oZWFkZXIgKyBobGVuICsKKwkJCQkJICBzaXplb2Yoc3RydWN0IGZyYWdfaGRyKSk7CiAKIAkJLyoKIAkJICoJQ2hhcmdlIHRoZSBtZW1vcnkgZm9yIHRoZSBmcmFnbWVudCB0byBhbnkgb3duZXIKQEAgLTc0Nyw3ICs3NjcsNyBAQAogCQkvKgogCQkgKglDb3B5IHRoZSBwYWNrZXQgaGVhZGVyIGludG8gdGhlIG5ldyBidWZmZXIuCiAJCSAqLwotCQltZW1jcHkoZnJhZy0+bmgucmF3LCBza2ItPmRhdGEsIGhsZW4pOworCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgc2tiX25ldHdvcmtfaGVhZGVyKGZyYWcpLCBobGVuKTsKIAogCQkvKgogCQkgKglCdWlsZCBmcmFnbWVudCBoZWFkZXIuCkBAIC03NjMsMTQgKzc4MywxNSBAQAogCQkvKgogCQkgKglDb3B5IGEgYmxvY2sgb2YgdGhlIElQIGRhdGFncmFtLgogCQkgKi8KLQkJaWYgKHNrYl9jb3B5X2JpdHMoc2tiLCBwdHIsIGZyYWctPmgucmF3LCBsZW4pKQorCQlpZiAoc2tiX2NvcHlfYml0cyhza2IsIHB0ciwgc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKSwgbGVuKSkKIAkJCUJVRygpOwogCQlsZWZ0IC09IGxlbjsKIAogCQlmaC0+ZnJhZ19vZmYgPSBodG9ucyhvZmZzZXQpOwogCQlpZiAobGVmdCA+IDApCiAJCQlmaC0+ZnJhZ19vZmYgfD0gaHRvbnMoSVA2X01GKTsKLQkJZnJhZy0+bmguaXB2NmgtPnBheWxvYWRfbGVuID0gaHRvbnMoZnJhZy0+bGVuIC0gc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSk7CisJCWlwdjZfaGRyKGZyYWcpLT5wYXlsb2FkX2xlbiA9IGh0b25zKGZyYWctPmxlbiAtCisJCQkJCQkgICAgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSk7CiAKIAkJcHRyICs9IGxlbjsKIAkJb2Zmc2V0ICs9IGxlbjsKQEAgLTg2MSw2ICs4ODIsNDEgQEAKIAkJCWdvdG8gb3V0X2Vycl9yZWxlYXNlOwogCX0KIAorI2lmZGVmIENPTkZJR19JUFY2X09QVElNSVNUSUNfREFECisJCS8qCisJCSAqIEhlcmUgaWYgdGhlIGRzdCBlbnRyeSB3ZSd2ZSBsb29rZWQgdXAKKwkJICogaGFzIGEgbmVpZ2hib3VyIGVudHJ5IHRoYXQgaXMgaW4gdGhlIElOQ09NUExFVEUKKwkJICogc3RhdGUgYW5kIHRoZSBzcmMgYWRkcmVzcyBmcm9tIHRoZSBmbG93IGlzCisJCSAqIG1hcmtlZCBhcyBPUFRJTUlTVElDLCB3ZSByZWxlYXNlIHRoZSBmb3VuZAorCQkgKiBkc3QgZW50cnkgYW5kIHJlcGxhY2UgaXQgaW5zdGVhZCB3aXRoIHRoZQorCQkgKiBkc3QgZW50cnkgb2YgdGhlIG5leHRob3Agcm91dGVyCisJCSAqLworCQlpZiAoISgoKmRzdCktPm5laWdoYm91ci0+bnVkX3N0YXRlICYgTlVEX1ZBTElEKSkgeworCQkJc3RydWN0IGluZXQ2X2lmYWRkciAqaWZwOworCQkJc3RydWN0IGZsb3dpIGZsX2d3OworCQkJaW50IHJlZGlyZWN0OworCisJCQlpZnAgPSBpcHY2X2dldF9pZmFkZHIoJmZsLT5mbDZfc3JjLCAoKmRzdCktPmRldiwgMSk7CisKKwkJCXJlZGlyZWN0ID0gKGlmcCAmJiBpZnAtPmZsYWdzICYgSUZBX0ZfT1BUSU1JU1RJQyk7CisJCQlpZiAoaWZwKQorCQkJCWluNl9pZmFfcHV0KGlmcCk7CisKKwkJCWlmIChyZWRpcmVjdCkgeworCQkJCS8qCisJCQkJICogV2UgbmVlZCB0byBnZXQgdGhlIGRzdCBlbnRyeSBmb3IgdGhlCisJCQkJICogZGVmYXVsdCByb3V0ZXIgaW5zdGVhZAorCQkJCSAqLworCQkJCWRzdF9yZWxlYXNlKCpkc3QpOworCQkJCW1lbWNweSgmZmxfZ3csIGZsLCBzaXplb2Yoc3RydWN0IGZsb3dpKSk7CisJCQkJbWVtc2V0KCZmbF9ndy5mbDZfZHN0LCAwLCBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSk7CisJCQkJKmRzdCA9IGlwNl9yb3V0ZV9vdXRwdXQoc2ssICZmbF9ndyk7CisJCQkJaWYgKChlcnIgPSAoKmRzdCktPmVycm9yKSkKKwkJCQkJZ290byBvdXRfZXJyX3JlbGVhc2U7CisJCQl9CisJCX0KKyNlbmRpZgorCiAJcmV0dXJuIDA7CiAKIG91dF9lcnJfcmVsZWFzZToKQEAgLTkzOSwxMCArOTk1LDEwIEBACiAJCXNrYl9wdXQoc2tiLGZyYWdoZWFkZXJsZW4gKyB0cmFuc2hkcmxlbik7CiAKIAkJLyogaW5pdGlhbGl6ZSBuZXR3b3JrIGhlYWRlciBwb2ludGVyICovCi0JCXNrYi0+bmgucmF3ID0gc2tiLT5kYXRhOworCQlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiKTsKIAogCQkvKiBpbml0aWFsaXplIHByb3RvY29sIGhlYWRlciBwb2ludGVyICovCi0JCXNrYi0+aC5yYXcgPSBza2ItPmRhdGEgKyBmcmFnaGVhZGVybGVuOworCQlza2ItPnRyYW5zcG9ydF9oZWFkZXIgPSBza2ItPm5ldHdvcmtfaGVhZGVyICsgZnJhZ2hlYWRlcmxlbjsKIAogCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1BBUlRJQUw7CiAJCXNrYi0+Y3N1bSA9IDA7CkBAIC0xMDE1LDcgKzEwNzEsOCBAQAogCQlpbmV0LT5jb3JrLmZsID0gKmZsOwogCQlucC0+Y29yay5ob3BfbGltaXQgPSBobGltaXQ7CiAJCW5wLT5jb3JrLnRjbGFzcyA9IHRjbGFzczsKLQkJbXR1ID0gZHN0X210dShydC0+dS5kc3QucGF0aCk7CisJCW10dSA9IG5wLT5wbXR1ZGlzYyA9PSBJUFY2X1BNVFVESVNDX1BST0JFID8KKwkJICAgICAgcnQtPnUuZHN0LmRldi0+bXR1IDogZHN0X210dShydC0+dS5kc3QucGF0aCk7CiAJCWlmIChucC0+ZnJhZ19zaXplIDwgbXR1KSB7CiAJCQlpZiAobnAtPmZyYWdfc2l6ZSkKIAkJCQltdHUgPSBucC0+ZnJhZ19zaXplOwpAQCAtMTE2MiwxMCArMTIxOSwxMCBAQAogCQkJICoJRmluZCB3aGVyZSB0byBzdGFydCBwdXR0aW5nIGJ5dGVzCiAJCQkgKi8KIAkJCWRhdGEgPSBza2JfcHV0KHNrYiwgZnJhZ2xlbik7Ci0JCQlza2ItPm5oLnJhdyA9IGRhdGEgKyBleHRoZHJsZW47CisJCQlza2Jfc2V0X25ldHdvcmtfaGVhZGVyKHNrYiwgZXh0aGRybGVuKTsKIAkJCWRhdGEgKz0gZnJhZ2hlYWRlcmxlbjsKLQkJCXNrYi0+aC5yYXcgPSBkYXRhICsgZXh0aGRybGVuOwotCisJCQlza2ItPnRyYW5zcG9ydF9oZWFkZXIgPSAoc2tiLT5uZXR3b3JrX2hlYWRlciArCisJCQkJCQkgZnJhZ2hlYWRlcmxlbik7CiAJCQlpZiAoZnJhZ2dhcCkgewogCQkJCXNrYi0+Y3N1bSA9IHNrYl9jb3B5X2FuZF9jc3VtX2JpdHMoCiAJCQkJCXNrYl9wcmV2LCBtYXhmcmFnbGVuLApAQCAtMTI4OCwxMCArMTM0NSwxMCBAQAogCXRhaWxfc2tiID0gJihza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdCk7CiAKIAkvKiBtb3ZlIHNrYi0+ZGF0YSB0byBpcCBoZWFkZXIgZnJvbSBleHQgaGVhZGVyICovCi0JaWYgKHNrYi0+ZGF0YSA8IHNrYi0+bmgucmF3KQotCQlfX3NrYl9wdWxsKHNrYiwgc2tiLT5uaC5yYXcgLSBza2ItPmRhdGEpOworCWlmIChza2ItPmRhdGEgPCBza2JfbmV0d29ya19oZWFkZXIoc2tiKSkKKwkJX19za2JfcHVsbChza2IsIHNrYl9uZXR3b3JrX29mZnNldChza2IpKTsKIAl3aGlsZSAoKHRtcF9za2IgPSBfX3NrYl9kZXF1ZXVlKCZzay0+c2tfd3JpdGVfcXVldWUpKSAhPSBOVUxMKSB7Ci0JCV9fc2tiX3B1bGwodG1wX3NrYiwgc2tiLT5oLnJhdyAtIHNrYi0+bmgucmF3KTsKKwkJX19za2JfcHVsbCh0bXBfc2tiLCBza2JfbmV0d29ya19oZWFkZXJfbGVuKHNrYikpOwogCQkqdGFpbF9za2IgPSB0bXBfc2tiOwogCQl0YWlsX3NrYiA9ICYodG1wX3NrYi0+bmV4dCk7CiAJCXNrYi0+bGVuICs9IHRtcF9za2ItPmxlbjsKQEAgLTEzMDMsMTMgKzEzNjAsMTUgQEAKIAl9CiAKIAlpcHY2X2FkZHJfY29weShmaW5hbF9kc3QsICZmbC0+Zmw2X2RzdCk7Ci0JX19za2JfcHVsbChza2IsIHNrYi0+aC5yYXcgLSBza2ItPm5oLnJhdyk7CisJX19za2JfcHVsbChza2IsIHNrYl9uZXR3b3JrX2hlYWRlcl9sZW4oc2tiKSk7CiAJaWYgKG9wdCAmJiBvcHQtPm9wdF9mbGVuKQogCQlpcHY2X3B1c2hfZnJhZ19vcHRzKHNrYiwgb3B0LCAmcHJvdG8pOwogCWlmIChvcHQgJiYgb3B0LT5vcHRfbmZsZW4pCiAJCWlwdjZfcHVzaF9uZnJhZ19vcHRzKHNrYiwgb3B0LCAmcHJvdG8sICZmaW5hbF9kc3QpOwogCi0Jc2tiLT5uaC5pcHY2aCA9IGhkciA9IChzdHJ1Y3QgaXB2NmhkciopIHNrYl9wdXNoKHNrYiwgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSk7CisJc2tiX3B1c2goc2tiLCBzaXplb2Yoc3RydWN0IGlwdjZoZHIpKTsKKwlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiKTsKKwloZHIgPSBpcHY2X2hkcihza2IpOwogCiAJKihfX2JlMzIqKWhkciA9IGZsLT5mbDZfZmxvd2xhYmVsIHwKIAkJICAgICBodG9ubCgweDYwMDAwMDAwIHwgKChpbnQpbnAtPmNvcmsudGNsYXNzIDw8IDIwKSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pcDZfdHVubmVsLmMgYi9uZXQvaXB2Ni9pcDZfdHVubmVsLmMKaW5kZXggMDhkOTQ0Mi4uYTA5MDJmYiAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvaXA2X3R1bm5lbC5jCisrKyBiL25ldC9pcHY2L2lwNl90dW5uZWwuYwpAQCAtMSwxNCArMSwxNSBAQAogLyoKLSAqCUlQdjYgb3ZlciBJUHY2IHR1bm5lbCBkZXZpY2UKKyAqCUlQdjYgdHVubmVsaW5nIGRldmljZQogICoJTGludXggSU5FVDYgaW1wbGVtZW50YXRpb24KICAqCiAgKglBdXRob3JzOgogICoJVmlsbGUgTnVvcnZhbGEJCTx2bnVvcnZhbEB0Y3MuaHV0LmZpPgorICoJWWFzdXl1a2kgS296YWthaQk8a296YWthaUBsaW51eC1pcHY2Lm9yZz4KICAqCiAgKgkkSWQkCiAgKgogICogICAgICBCYXNlZCBvbjoKLSAqICAgICAgbGludXgvbmV0L2lwdjYvc2l0LmMKKyAqICAgICAgbGludXgvbmV0L2lwdjYvc2l0LmMgYW5kIGxpbnV4L25ldC9pcHY0L2lwaXAuYwogICoKICAqICAgICAgUkZDIDI0NzMKICAqCkBAIC0yNCw2ICsyNSw3IEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NvY2tpb3MuaD4KKyNpbmNsdWRlIDxsaW51eC9pY21wLmg+CiAjaW5jbHVkZSA8bGludXgvaWYuaD4KICNpbmNsdWRlIDxsaW51eC9pbi5oPgogI2luY2x1ZGUgPGxpbnV4L2lwLmg+CkBAIC00MSw2ICs0Myw3IEBACiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAKKyNpbmNsdWRlIDxuZXQvaWNtcC5oPgogI2luY2x1ZGUgPG5ldC9pcC5oPgogI2luY2x1ZGUgPG5ldC9pcHY2Lmg+CiAjaW5jbHVkZSA8bmV0L2lwNl9yb3V0ZS5oPgpAQCAtNTEsNyArNTQsNyBAQAogI2luY2x1ZGUgPG5ldC9pbmV0X2Vjbi5oPgogCiBNT0RVTEVfQVVUSE9SKCJWaWxsZSBOdW9ydmFsYSIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJJUHY2LWluLUlQdjYgdHVubmVsIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIklQdjYgdHVubmVsaW5nIGRldmljZSIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCiAjZGVmaW5lIElQVjZfVExWX1RFTF9EU1RfU0laRSA4CkBAIC02Myw2ICs2Niw3IEBACiAjZW5kaWYKIAogI2RlZmluZSBJUFY2X1RDTEFTU19NQVNLIChJUFY2X0ZMT1dJTkZPX01BU0sgJiB+SVBWNl9GTE9XTEFCRUxfTUFTSykKKyNkZWZpbmUgSVBWNl9UQ0xBU1NfU0hJRlQgMjAKIAogI2RlZmluZSBIQVNIX1NJWkUgIDMyCiAKQEAgLTcwLDEyICs3NCwxMiBAQAogCQkgICAgIChhZGRyKS0+czZfYWRkcjMyWzJdIF4gKGFkZHIpLT5zNl9hZGRyMzJbM10pICYgXAogCQkgICAgKEhBU0hfU0laRSAtIDEpKQogCi1zdGF0aWMgaW50IGlwNmlwNl9mYl90bmxfZGV2X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci1zdGF0aWMgaW50IGlwNmlwNl90bmxfZGV2X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci1zdGF0aWMgdm9pZCBpcDZpcDZfdG5sX2Rldl9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgaXA2X2ZiX3RubF9kZXZfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgaXA2X3RubF9kZXZfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGlwNl90bmxfZGV2X3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogCiAvKiB0aGUgSVB2NiB0dW5uZWwgZmFsbGJhY2sgZGV2aWNlICovCi1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmlwNmlwNl9mYl90bmxfZGV2Oworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICppcDZfZmJfdG5sX2RldjsKIAogCiAvKiBsaXN0cyBmb3Igc3RvcmluZyB0dW5uZWxzIGluIHVzZSAqLwpAQCAtODQsNyArODgsNyBAQAogc3RhdGljIHN0cnVjdCBpcDZfdG5sICoqdG5sc1syXSA9IHsgdG5sc193YywgdG5sc19yX2wgfTsKIAogLyogbG9jayBmb3IgdGhlIHR1bm5lbCBsaXN0cyAqLwotc3RhdGljIERFRklORV9SV0xPQ0soaXA2aXA2X2xvY2spOworc3RhdGljIERFRklORV9SV0xPQ0soaXA2X3RubF9sb2NrKTsKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgZHN0X2VudHJ5ICppcDZfdG5sX2RzdF9jaGVjayhzdHJ1Y3QgaXA2X3RubCAqdCkKIHsKQEAgLTExNSw3ICsxMTksNyBAQAogfQogCiAvKioKLSAqIGlwNmlwNl90bmxfbG9va3VwIC0gZmV0Y2ggdHVubmVsIG1hdGNoaW5nIHRoZSBlbmQtcG9pbnQgYWRkcmVzc2VzCisgKiBpcDZfdG5sX2xvb2t1cCAtIGZldGNoIHR1bm5lbCBtYXRjaGluZyB0aGUgZW5kLXBvaW50IGFkZHJlc3NlcwogICogICBAcmVtb3RlOiB0aGUgYWRkcmVzcyBvZiB0aGUgdHVubmVsIGV4aXQtcG9pbnQKICAqICAgQGxvY2FsOiB0aGUgYWRkcmVzcyBvZiB0aGUgdHVubmVsIGVudHJ5LXBvaW50CiAgKgpAQCAtMTI2LDcgKzEzMCw3IEBACiAgKiovCiAKIHN0YXRpYyBzdHJ1Y3QgaXA2X3RubCAqCi1pcDZpcDZfdG5sX2xvb2t1cChzdHJ1Y3QgaW42X2FkZHIgKnJlbW90ZSwgc3RydWN0IGluNl9hZGRyICpsb2NhbCkKK2lwNl90bmxfbG9va3VwKHN0cnVjdCBpbjZfYWRkciAqcmVtb3RlLCBzdHJ1Y3QgaW42X2FkZHIgKmxvY2FsKQogewogCXVuc2lnbmVkIGgwID0gSEFTSChyZW1vdGUpOwogCXVuc2lnbmVkIGgxID0gSEFTSChsb2NhbCk7CkBAIC0xNDUsMTggKzE0OSwxOCBAQAogfQogCiAvKioKLSAqIGlwNmlwNl9idWNrZXQgLSBnZXQgaGVhZCBvZiBsaXN0IG1hdGNoaW5nIGdpdmVuIHR1bm5lbCBwYXJhbWV0ZXJzCisgKiBpcDZfdG5sX2J1Y2tldCAtIGdldCBoZWFkIG9mIGxpc3QgbWF0Y2hpbmcgZ2l2ZW4gdHVubmVsIHBhcmFtZXRlcnMKICAqICAgQHA6IHBhcmFtZXRlcnMgY29udGFpbmluZyB0dW5uZWwgZW5kLXBvaW50cwogICoKICAqIERlc2NyaXB0aW9uOgotICogICBpcDZpcDZfYnVja2V0KCkgcmV0dXJucyB0aGUgaGVhZCBvZiB0aGUgbGlzdCBtYXRjaGluZyB0aGUKKyAqICAgaXA2X3RubF9idWNrZXQoKSByZXR1cm5zIHRoZSBoZWFkIG9mIHRoZSBsaXN0IG1hdGNoaW5nIHRoZQogICogICAmc3RydWN0IGluNl9hZGRyIGVudHJpZXMgbGFkZHIgYW5kIHJhZGRyIGluIEBwLgogICoKICAqIFJldHVybjogaGVhZCBvZiBJUHY2IHR1bm5lbCBsaXN0CiAgKiovCiAKIHN0YXRpYyBzdHJ1Y3QgaXA2X3RubCAqKgotaXA2aXA2X2J1Y2tldChzdHJ1Y3QgaXA2X3RubF9wYXJtICpwKQoraXA2X3RubF9idWNrZXQoc3RydWN0IGlwNl90bmxfcGFybSAqcCkKIHsKIAlzdHJ1Y3QgaW42X2FkZHIgKnJlbW90ZSA9ICZwLT5yYWRkcjsKIAlzdHJ1Y3QgaW42X2FkZHIgKmxvY2FsID0gJnAtPmxhZGRyOwpAQCAtMTcxLDM2ICsxNzUsMzYgQEAKIH0KIAogLyoqCi0gKiBpcDZpcDZfdG5sX2xpbmsgLSBhZGQgdHVubmVsIHRvIGhhc2ggdGFibGUKKyAqIGlwNl90bmxfbGluayAtIGFkZCB0dW5uZWwgdG8gaGFzaCB0YWJsZQogICogICBAdDogdHVubmVsIHRvIGJlIGFkZGVkCiAgKiovCiAKIHN0YXRpYyB2b2lkCi1pcDZpcDZfdG5sX2xpbmsoc3RydWN0IGlwNl90bmwgKnQpCitpcDZfdG5sX2xpbmsoc3RydWN0IGlwNl90bmwgKnQpCiB7Ci0Jc3RydWN0IGlwNl90bmwgKip0cCA9IGlwNmlwNl9idWNrZXQoJnQtPnBhcm1zKTsKKwlzdHJ1Y3QgaXA2X3RubCAqKnRwID0gaXA2X3RubF9idWNrZXQoJnQtPnBhcm1zKTsKIAogCXQtPm5leHQgPSAqdHA7Ci0Jd3JpdGVfbG9ja19iaCgmaXA2aXA2X2xvY2spOworCXdyaXRlX2xvY2tfYmgoJmlwNl90bmxfbG9jayk7CiAJKnRwID0gdDsKLQl3cml0ZV91bmxvY2tfYmgoJmlwNmlwNl9sb2NrKTsKKwl3cml0ZV91bmxvY2tfYmgoJmlwNl90bmxfbG9jayk7CiB9CiAKIC8qKgotICogaXA2aXA2X3RubF91bmxpbmsgLSByZW1vdmUgdHVubmVsIGZyb20gaGFzaCB0YWJsZQorICogaXA2X3RubF91bmxpbmsgLSByZW1vdmUgdHVubmVsIGZyb20gaGFzaCB0YWJsZQogICogICBAdDogdHVubmVsIHRvIGJlIHJlbW92ZWQKICAqKi8KIAogc3RhdGljIHZvaWQKLWlwNmlwNl90bmxfdW5saW5rKHN0cnVjdCBpcDZfdG5sICp0KQoraXA2X3RubF91bmxpbmsoc3RydWN0IGlwNl90bmwgKnQpCiB7CiAJc3RydWN0IGlwNl90bmwgKip0cDsKIAotCWZvciAodHAgPSBpcDZpcDZfYnVja2V0KCZ0LT5wYXJtcyk7ICp0cDsgdHAgPSAmKCp0cCktPm5leHQpIHsKKwlmb3IgKHRwID0gaXA2X3RubF9idWNrZXQoJnQtPnBhcm1zKTsgKnRwOyB0cCA9ICYoKnRwKS0+bmV4dCkgewogCQlpZiAodCA9PSAqdHApIHsKLQkJCXdyaXRlX2xvY2tfYmgoJmlwNmlwNl9sb2NrKTsKKwkJCXdyaXRlX2xvY2tfYmgoJmlwNl90bmxfbG9jayk7CiAJCQkqdHAgPSB0LT5uZXh0OwotCQkJd3JpdGVfdW5sb2NrX2JoKCZpcDZpcDZfbG9jayk7CisJCQl3cml0ZV91bmxvY2tfYmgoJmlwNl90bmxfbG9jayk7CiAJCQlicmVhazsKIAkJfQogCX0KQEAgLTIzNywxMiArMjQxLDEyIEBACiAJCWlmIChpID09IElQNl9UTkxfTUFYKQogCQkJZ290byBmYWlsZWQ7CiAJfQotCWRldiA9IGFsbG9jX25ldGRldihzaXplb2YgKCp0KSwgbmFtZSwgaXA2aXA2X3RubF9kZXZfc2V0dXApOworCWRldiA9IGFsbG9jX25ldGRldihzaXplb2YgKCp0KSwgbmFtZSwgaXA2X3RubF9kZXZfc2V0dXApOwogCWlmIChkZXYgPT0gTlVMTCkKIAkJZ290byBmYWlsZWQ7CiAKIAl0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlkZXYtPmluaXQgPSBpcDZpcDZfdG5sX2Rldl9pbml0OworCWRldi0+aW5pdCA9IGlwNl90bmxfZGV2X2luaXQ7CiAJdC0+cGFybXMgPSAqcDsKIAogCWlmICgoZXJyID0gcmVnaXN0ZXJfbmV0ZGV2aWNlKGRldikpIDwgMCkgewpAQCAtMjUwLDE5ICsyNTQsMTkgQEAKIAkJZ290byBmYWlsZWQ7CiAJfQogCWRldl9ob2xkKGRldik7Ci0JaXA2aXA2X3RubF9saW5rKHQpOworCWlwNl90bmxfbGluayh0KTsKIAlyZXR1cm4gdDsKIGZhaWxlZDoKIAlyZXR1cm4gTlVMTDsKIH0KIAogLyoqCi0gKiBpcDZpcDZfdG5sX2xvY2F0ZSAtIGZpbmQgb3IgY3JlYXRlIHR1bm5lbCBtYXRjaGluZyBnaXZlbiBwYXJhbWV0ZXJzCisgKiBpcDZfdG5sX2xvY2F0ZSAtIGZpbmQgb3IgY3JlYXRlIHR1bm5lbCBtYXRjaGluZyBnaXZlbiBwYXJhbWV0ZXJzCiAgKiAgIEBwOiB0dW5uZWwgcGFyYW1ldGVycwogICogICBAY3JlYXRlOiAhPSAwIGlmIGFsbG93ZWQgdG8gY3JlYXRlIG5ldyB0dW5uZWwgaWYgbm8gbWF0Y2ggZm91bmQKICAqCiAgKiBEZXNjcmlwdGlvbjoKLSAqICAgaXA2aXA2X3RubF9sb2NhdGUoKSBmaXJzdCB0cmllcyB0byBsb2NhdGUgYW4gZXhpc3RpbmcgdHVubmVsCisgKiAgIGlwNl90bmxfbG9jYXRlKCkgZmlyc3QgdHJpZXMgdG8gbG9jYXRlIGFuIGV4aXN0aW5nIHR1bm5lbAogICogICBiYXNlZCBvbiBAcGFybXMuIElmIHRoaXMgaXMgdW5zdWNjZXNzZnVsLCBidXQgQGNyZWF0ZSBpcyBzZXQgYSBuZXcKICAqICAgdHVubmVsIGRldmljZSBpcyBjcmVhdGVkIGFuZCByZWdpc3RlcmVkIGZvciB1c2UuCiAgKgpAQCAtMjcwLDEzICsyNzQsMTMgQEAKICAqICAgbWF0Y2hpbmcgdHVubmVsIG9yIE5VTEwKICAqKi8KIAotc3RhdGljIHN0cnVjdCBpcDZfdG5sICppcDZpcDZfdG5sX2xvY2F0ZShzdHJ1Y3QgaXA2X3RubF9wYXJtICpwLCBpbnQgY3JlYXRlKQorc3RhdGljIHN0cnVjdCBpcDZfdG5sICppcDZfdG5sX2xvY2F0ZShzdHJ1Y3QgaXA2X3RubF9wYXJtICpwLCBpbnQgY3JlYXRlKQogewogCXN0cnVjdCBpbjZfYWRkciAqcmVtb3RlID0gJnAtPnJhZGRyOwogCXN0cnVjdCBpbjZfYWRkciAqbG9jYWwgPSAmcC0+bGFkZHI7CiAJc3RydWN0IGlwNl90bmwgKnQ7CiAKLQlmb3IgKHQgPSAqaXA2aXA2X2J1Y2tldChwKTsgdDsgdCA9IHQtPm5leHQpIHsKKwlmb3IgKHQgPSAqaXA2X3RubF9idWNrZXQocCk7IHQ7IHQgPSB0LT5uZXh0KSB7CiAJCWlmIChpcHY2X2FkZHJfZXF1YWwobG9jYWwsICZ0LT5wYXJtcy5sYWRkcikgJiYKIAkJICAgIGlwdjZfYWRkcl9lcXVhbChyZW1vdGUsICZ0LT5wYXJtcy5yYWRkcikpCiAJCQlyZXR1cm4gdDsKQEAgLTI4NywyNCArMjkxLDI0IEBACiB9CiAKIC8qKgotICogaXA2aXA2X3RubF9kZXZfdW5pbml0IC0gdHVubmVsIGRldmljZSB1bmluaXRpYWxpemVyCisgKiBpcDZfdG5sX2Rldl91bmluaXQgLSB0dW5uZWwgZGV2aWNlIHVuaW5pdGlhbGl6ZXIKICAqICAgQGRldjogdGhlIGRldmljZSB0byBiZSBkZXN0cm95ZWQKICAqCiAgKiBEZXNjcmlwdGlvbjoKLSAqICAgaXA2aXA2X3RubF9kZXZfdW5pbml0KCkgcmVtb3ZlcyB0dW5uZWwgZnJvbSBpdHMgbGlzdAorICogICBpcDZfdG5sX2Rldl91bmluaXQoKSByZW1vdmVzIHR1bm5lbCBmcm9tIGl0cyBsaXN0CiAgKiovCiAKIHN0YXRpYyB2b2lkCi1pcDZpcDZfdG5sX2Rldl91bmluaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK2lwNl90bmxfZGV2X3VuaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBpcDZfdG5sICp0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAotCWlmIChkZXYgPT0gaXA2aXA2X2ZiX3RubF9kZXYpIHsKLQkJd3JpdGVfbG9ja19iaCgmaXA2aXA2X2xvY2spOworCWlmIChkZXYgPT0gaXA2X2ZiX3RubF9kZXYpIHsKKwkJd3JpdGVfbG9ja19iaCgmaXA2X3RubF9sb2NrKTsKIAkJdG5sc193Y1swXSA9IE5VTEw7Ci0JCXdyaXRlX3VubG9ja19iaCgmaXA2aXA2X2xvY2spOworCQl3cml0ZV91bmxvY2tfYmgoJmlwNl90bmxfbG9jayk7CiAJfSBlbHNlIHsKLQkJaXA2aXA2X3RubF91bmxpbmsodCk7CisJCWlwNl90bmxfdW5saW5rKHQpOwogCX0KIAlpcDZfdG5sX2RzdF9yZXNldCh0KTsKIAlkZXZfcHV0KGRldik7CkBAIC0zNzIsMTYgKzM3NiwxNiBAQAogfQogCiAvKioKLSAqIGlwNmlwNl9lcnIgLSB0dW5uZWwgZXJyb3IgaGFuZGxlcgorICogaXA2X3RubF9lcnIgLSB0dW5uZWwgZXJyb3IgaGFuZGxlcgogICoKICAqIERlc2NyaXB0aW9uOgotICogICBpcDZpcDZfZXJyKCkgc2hvdWxkIGhhbmRsZSBlcnJvcnMgaW4gdGhlIHR1bm5lbCBhY2NvcmRpbmcKKyAqICAgaXA2X3RubF9lcnIoKSBzaG91bGQgaGFuZGxlIGVycm9ycyBpbiB0aGUgdHVubmVsIGFjY29yZGluZwogICogICB0byB0aGUgc3BlY2lmaWNhdGlvbnMgaW4gUkZDIDI0NzMuCiAgKiovCiAKIHN0YXRpYyBpbnQKLWlwNmlwNl9lcnIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGluZXQ2X3NrYl9wYXJtICpvcHQsCi0JICAgaW50IHR5cGUsIGludCBjb2RlLCBpbnQgb2Zmc2V0LCBfX2JlMzIgaW5mbykKK2lwNl90bmxfZXJyKHN0cnVjdCBza19idWZmICpza2IsIF9fdTggaXBwcm90bywgc3RydWN0IGluZXQ2X3NrYl9wYXJtICpvcHQsCisJICAgIGludCAqdHlwZSwgaW50ICpjb2RlLCBpbnQgKm1zZywgX19iZTMyICppbmZvLCBpbnQgb2Zmc2V0KQogewogCXN0cnVjdCBpcHY2aGRyICppcHY2aCA9IChzdHJ1Y3QgaXB2NmhkciAqKSBza2ItPmRhdGE7CiAJc3RydWN0IGlwNl90bmwgKnQ7CkBAIC0zOTYsMTMgKzQwMCwxNiBAQAogCSAgIGluIHRyb3VibGUgc2luY2Ugd2UgbWlnaHQgbmVlZCB0aGUgc291cmNlIGFkZHJlc3MgZm9yIGZ1cnRoZXIKIAkgICBwcm9jZXNzaW5nIG9mIHRoZSBlcnJvci4gKi8KIAotCXJlYWRfbG9jaygmaXA2aXA2X2xvY2spOwotCWlmICgodCA9IGlwNmlwNl90bmxfbG9va3VwKCZpcHY2aC0+ZGFkZHIsICZpcHY2aC0+c2FkZHIpKSA9PSBOVUxMKQorCXJlYWRfbG9jaygmaXA2X3RubF9sb2NrKTsKKwlpZiAoKHQgPSBpcDZfdG5sX2xvb2t1cCgmaXB2NmgtPmRhZGRyLCAmaXB2NmgtPnNhZGRyKSkgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisKKwlpZiAodC0+cGFybXMucHJvdG8gIT0gaXBwcm90byAmJiB0LT5wYXJtcy5wcm90byAhPSAwKQogCQlnb3RvIG91dDsKIAogCWVyciA9IDA7CiAKLQlzd2l0Y2ggKHR5cGUpIHsKKwlzd2l0Y2ggKCp0eXBlKSB7CiAJCV9fdTMyIHRlbGk7CiAJCXN0cnVjdCBpcHY2X3Rsdl90bmxfZW5jX2xpbSAqdGVsOwogCQlfX3UzMiBtdHU7CkBAIC00MTQsNyArNDIxLDcgQEAKIAkJcmVsX21zZyA9IDE7CiAJCWJyZWFrOwogCWNhc2UgSUNNUFY2X1RJTUVfRVhDRUVEOgotCQlpZiAoY29kZSA9PSBJQ01QVjZfRVhDX0hPUExJTUlUKSB7CisJCWlmICgoKmNvZGUpID09IElDTVBWNl9FWENfSE9QTElNSVQpIHsKIAkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCiAJCQkJcHJpbnRrKEtFUk5fV0FSTklORwogCQkJCSAgICAgICAiJXM6IFRvbyBzbWFsbCBob3AgbGltaXQgb3IgIgpAQCAtNDI1LDEwICs0MzIsMTAgQEAKIAkJYnJlYWs7CiAJY2FzZSBJQ01QVjZfUEFSQU1QUk9COgogCQl0ZWxpID0gMDsKLQkJaWYgKGNvZGUgPT0gSUNNUFY2X0hEUl9GSUVMRCkKKwkJaWYgKCgqY29kZSkgPT0gSUNNUFY2X0hEUl9GSUVMRCkKIAkJCXRlbGkgPSBwYXJzZV90bHZfdG5sX2VuY19saW0oc2tiLCBza2ItPmRhdGEpOwogCi0JCWlmICh0ZWxpICYmIHRlbGkgPT0gbnRvaGwoaW5mbykgLSAyKSB7CisJCWlmICh0ZWxpICYmIHRlbGkgPT0gbnRvaGwoKmluZm8pIC0gMikgewogCQkJdGVsID0gKHN0cnVjdCBpcHY2X3Rsdl90bmxfZW5jX2xpbSAqKSAmc2tiLT5kYXRhW3RlbGldOwogCQkJaWYgKHRlbC0+ZW5jYXBfbGltaXQgPT0gMCkgewogCQkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCkBAIC00NDUsNyArNDUyLDcgQEAKIAkJfQogCQlicmVhazsKIAljYXNlIElDTVBWNl9QS1RfVE9PQklHOgotCQltdHUgPSBudG9obChpbmZvKSAtIG9mZnNldDsKKwkJbXR1ID0gbnRvaGwoKmluZm8pIC0gb2Zmc2V0OwogCQlpZiAobXR1IDwgSVBWNl9NSU5fTVRVKQogCQkJbXR1ID0gSVBWNl9NSU5fTVRVOwogCQl0LT5kZXYtPm10dSA9IG10dTsKQEAgLTQ1OCwyMCArNDY1LDE0NCBAQAogCQl9CiAJCWJyZWFrOwogCX0KLQlpZiAocmVsX21zZyAmJiAgcHNrYl9tYXlfcHVsbChza2IsIG9mZnNldCArIHNpemVvZiAoKmlwdjZoKSkpIHsKKworCSp0eXBlID0gcmVsX3R5cGU7CisJKmNvZGUgPSByZWxfY29kZTsKKwkqaW5mbyA9IHJlbF9pbmZvOworCSptc2cgPSByZWxfbXNnOworCitvdXQ6CisJcmVhZF91bmxvY2soJmlwNl90bmxfbG9jayk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludAoraXA0aXA2X2VycihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaW5ldDZfc2tiX3Bhcm0gKm9wdCwKKwkgICBpbnQgdHlwZSwgaW50IGNvZGUsIGludCBvZmZzZXQsIF9fdTMyIGluZm8pCit7CisJaW50IHJlbF9tc2cgPSAwOworCWludCByZWxfdHlwZSA9IHR5cGU7CisJaW50IHJlbF9jb2RlID0gY29kZTsKKwlfX3UzMiByZWxfaW5mbyA9IGluZm87CisJaW50IGVycjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiMjsKKwlzdHJ1Y3QgaXBoZHIgKmVpcGg7CisJc3RydWN0IGZsb3dpIGZsOworCXN0cnVjdCBydGFibGUgKnJ0OworCisJZXJyID0gaXA2X3RubF9lcnIoc2tiLCBJUFBST1RPX0lQSVAsIG9wdCwgJnJlbF90eXBlLCAmcmVsX2NvZGUsCisJCQkgICZyZWxfbXNnLCAmcmVsX2luZm8sIG9mZnNldCk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwlpZiAocmVsX21zZyA9PSAwKQorCQlyZXR1cm4gMDsKKworCXN3aXRjaCAocmVsX3R5cGUpIHsKKwljYXNlIElDTVBWNl9ERVNUX1VOUkVBQ0g6CisJCWlmIChyZWxfY29kZSAhPSBJQ01QVjZfQUREUl9VTlJFQUNIKQorCQkJcmV0dXJuIDA7CisJCXJlbF90eXBlID0gSUNNUF9ERVNUX1VOUkVBQ0g7CisJCXJlbF9jb2RlID0gSUNNUF9IT1NUX1VOUkVBQ0g7CisJCWJyZWFrOworCWNhc2UgSUNNUFY2X1BLVF9UT09CSUc6CisJCWlmIChyZWxfY29kZSAhPSAwKQorCQkJcmV0dXJuIDA7CisJCXJlbF90eXBlID0gSUNNUF9ERVNUX1VOUkVBQ0g7CisJCXJlbF9jb2RlID0gSUNNUF9GUkFHX05FRURFRDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgb2Zmc2V0ICsgc2l6ZW9mKHN0cnVjdCBpcGhkcikpKQorCQlyZXR1cm4gMDsKKworCXNrYjIgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXNrYjIpCisJCXJldHVybiAwOworCisJZHN0X3JlbGVhc2Uoc2tiMi0+ZHN0KTsKKwlza2IyLT5kc3QgPSBOVUxMOworCXNrYl9wdWxsKHNrYjIsIG9mZnNldCk7CisJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYjIpOworCWVpcGggPSBpcF9oZHIoc2tiMik7CisKKwkvKiBUcnkgdG8gZ3Vlc3MgaW5jb21pbmcgaW50ZXJmYWNlICovCisJbWVtc2V0KCZmbCwgMCwgc2l6ZW9mKGZsKSk7CisJZmwuZmw0X2RzdCA9IGVpcGgtPnNhZGRyOworCWZsLmZsNF90b3MgPSBSVF9UT1MoZWlwaC0+dG9zKTsKKwlmbC5wcm90byA9IElQUFJPVE9fSVBJUDsKKwlpZiAoaXBfcm91dGVfb3V0cHV0X2tleSgmcnQsICZmbCkpCisJCWdvdG8gb3V0OworCisJc2tiMi0+ZGV2ID0gcnQtPnUuZHN0LmRldjsKKworCS8qIHJvdXRlICJpbmNvbWluZyIgcGFja2V0ICovCisJaWYgKHJ0LT5ydF9mbGFncyAmIFJUQ0ZfTE9DQUwpIHsKKwkJaXBfcnRfcHV0KHJ0KTsKKwkJcnQgPSBOVUxMOworCQlmbC5mbDRfZHN0ID0gZWlwaC0+ZGFkZHI7CisJCWZsLmZsNF9zcmMgPSBlaXBoLT5zYWRkcjsKKwkJZmwuZmw0X3RvcyA9IGVpcGgtPnRvczsKKwkJaWYgKGlwX3JvdXRlX291dHB1dF9rZXkoJnJ0LCAmZmwpIHx8CisJCSAgICBydC0+dS5kc3QuZGV2LT50eXBlICE9IEFSUEhSRF9UVU5ORUwpIHsKKwkJCWlwX3J0X3B1dChydCk7CisJCQlnb3RvIG91dDsKKwkJfQorCX0gZWxzZSB7CisJCWlwX3J0X3B1dChydCk7CisJCWlmIChpcF9yb3V0ZV9pbnB1dChza2IyLCBlaXBoLT5kYWRkciwgZWlwaC0+c2FkZHIsIGVpcGgtPnRvcywKKwkJCQkgICBza2IyLT5kZXYpIHx8CisJCSAgICBza2IyLT5kc3QtPmRldi0+dHlwZSAhPSBBUlBIUkRfVFVOTkVMKQorCQkJZ290byBvdXQ7CisJfQorCisJLyogY2hhbmdlIG10dSBvbiB0aGlzIHJvdXRlICovCisJaWYgKHJlbF90eXBlID09IElDTVBfREVTVF9VTlJFQUNIICYmIHJlbF9jb2RlID09IElDTVBfRlJBR19ORUVERUQpIHsKKwkJaWYgKHJlbF9pbmZvID4gZHN0X210dShza2IyLT5kc3QpKQorCQkJZ290byBvdXQ7CisKKwkJc2tiMi0+ZHN0LT5vcHMtPnVwZGF0ZV9wbXR1KHNrYjItPmRzdCwgcmVsX2luZm8pOworCQlyZWxfaW5mbyA9IGh0b25sKHJlbF9pbmZvKTsKKwl9CisKKwlpY21wX3NlbmQoc2tiMiwgcmVsX3R5cGUsIHJlbF9jb2RlLCByZWxfaW5mbyk7CisKK291dDoKKwlrZnJlZV9za2Ioc2tiMik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2lwNmlwNl9lcnIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGluZXQ2X3NrYl9wYXJtICpvcHQsCisJICAgaW50IHR5cGUsIGludCBjb2RlLCBpbnQgb2Zmc2V0LCBfX3UzMiBpbmZvKQoreworCWludCByZWxfbXNnID0gMDsKKwlpbnQgcmVsX3R5cGUgPSB0eXBlOworCWludCByZWxfY29kZSA9IGNvZGU7CisJX191MzIgcmVsX2luZm8gPSBpbmZvOworCWludCBlcnI7CisKKwllcnIgPSBpcDZfdG5sX2Vycihza2IsIElQUFJPVE9fSVBWNiwgb3B0LCAmcmVsX3R5cGUsICZyZWxfY29kZSwKKwkJCSAgJnJlbF9tc2csICZyZWxfaW5mbywgb2Zmc2V0KTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCWlmIChyZWxfbXNnICYmIHBza2JfbWF5X3B1bGwoc2tiLCBvZmZzZXQgKyBzaXplb2Yoc3RydWN0IGlwdjZoZHIpKSkgewogCQlzdHJ1Y3QgcnQ2X2luZm8gKnJ0OwogCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiMiA9IHNrYl9jbG9uZShza2IsIEdGUF9BVE9NSUMpOwogCiAJCWlmICghc2tiMikKLQkJCWdvdG8gb3V0OworCQkJcmV0dXJuIDA7CiAKIAkJZHN0X3JlbGVhc2Uoc2tiMi0+ZHN0KTsKIAkJc2tiMi0+ZHN0ID0gTlVMTDsKIAkJc2tiX3B1bGwoc2tiMiwgb2Zmc2V0KTsKLQkJc2tiMi0+bmgucmF3ID0gc2tiMi0+ZGF0YTsKKwkJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYjIpOwogCiAJCS8qIFRyeSB0byBndWVzcyBpbmNvbWluZyBpbnRlcmZhY2UgKi8KLQkJcnQgPSBydDZfbG9va3VwKCZza2IyLT5uaC5pcHY2aC0+c2FkZHIsIE5VTEwsIDAsIDApOworCQlydCA9IHJ0Nl9sb29rdXAoJmlwdjZfaGRyKHNrYjIpLT5zYWRkciwgTlVMTCwgMCwgMCk7CiAKIAkJaWYgKHJ0ICYmIHJ0LT5ydDZpX2RldikKIAkJCXNrYjItPmRldiA9IHJ0LT5ydDZpX2RldjsKQEAgLTQ4MywxOSArNjE0LDM0IEBACiAKIAkJa2ZyZWVfc2tiKHNrYjIpOwogCX0KLW91dDoKLQlyZWFkX3VubG9jaygmaXA2aXA2X2xvY2spOwotCXJldHVybiBlcnI7CisKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGlwNmlwNl9lY25fZGVjYXBzdWxhdGUoc3RydWN0IGlwdjZoZHIgKm91dGVyX2lwaCwKLQkJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorc3RhdGljIHZvaWQgaXA0aXA2X2RzY3BfZWNuX2RlY2Fwc3VsYXRlKHN0cnVjdCBpcDZfdG5sICp0LAorCQkJCQlzdHJ1Y3QgaXB2NmhkciAqaXB2NmgsCisJCQkJCXN0cnVjdCBza19idWZmICpza2IpCiB7Ci0Jc3RydWN0IGlwdjZoZHIgKmlubmVyX2lwaCA9IHNrYi0+bmguaXB2Nmg7CisJX191OCBkc2ZpZWxkID0gaXB2Nl9nZXRfZHNmaWVsZChpcHY2aCkgJiB+SU5FVF9FQ05fTUFTSzsKIAotCWlmIChJTkVUX0VDTl9pc19jZShpcHY2X2dldF9kc2ZpZWxkKG91dGVyX2lwaCkpKQotCQlJUDZfRUNOX3NldF9jZShpbm5lcl9pcGgpOworCWlmICh0LT5wYXJtcy5mbGFncyAmIElQNl9UTkxfRl9SQ1ZfRFNDUF9DT1BZKQorCQlpcHY0X2NoYW5nZV9kc2ZpZWxkKGlwX2hkcihza2IpLCBJTkVUX0VDTl9NQVNLLCBkc2ZpZWxkKTsKKworCWlmIChJTkVUX0VDTl9pc19jZShkc2ZpZWxkKSkKKwkJSVBfRUNOX3NldF9jZShpcF9oZHIoc2tiKSk7CiB9CisKK3N0YXRpYyB2b2lkIGlwNmlwNl9kc2NwX2Vjbl9kZWNhcHN1bGF0ZShzdHJ1Y3QgaXA2X3RubCAqdCwKKwkJCQkJc3RydWN0IGlwdjZoZHIgKmlwdjZoLAorCQkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWlmICh0LT5wYXJtcy5mbGFncyAmIElQNl9UTkxfRl9SQ1ZfRFNDUF9DT1BZKQorCQlpcHY2X2NvcHlfZHNjcChpcHY2aCwgaXB2Nl9oZHIoc2tiKSk7CisKKwlpZiAoSU5FVF9FQ05faXNfY2UoaXB2Nl9nZXRfZHNmaWVsZChpcHY2aCkpKQorCQlJUDZfRUNOX3NldF9jZShpcHY2X2hkcihza2IpKTsKK30KKwogc3RhdGljIGlubGluZSBpbnQgaXA2X3RubF9yY3ZfY3RsKHN0cnVjdCBpcDZfdG5sICp0KQogewogCXN0cnVjdCBpcDZfdG5sX3Bhcm0gKnAgPSAmdC0+cGFybXM7CkBAIC01MTksNTMgKzY2NSw2MSBAQAogfQogCiAvKioKLSAqIGlwNmlwNl9yY3YgLSBkZWNhcHN1bGF0ZSBJUHY2IHBhY2tldCBhbmQgcmV0cmFuc21pdCBpdCBsb2NhbGx5CisgKiBpcDZfdG5sX3JjdiAtIGRlY2Fwc3VsYXRlIElQdjYgcGFja2V0IGFuZCByZXRyYW5zbWl0IGl0IGxvY2FsbHkKICAqICAgQHNrYjogcmVjZWl2ZWQgc29ja2V0IGJ1ZmZlcgorICogICBAcHJvdG9jb2w6IGV0aGVybmV0IHByb3RvY29sIElECisgKiAgIEBkc2NwX2Vjbl9kZWNhcHN1bGF0ZTogdGhlIGZ1bmN0aW9uIHRvIGRlY2Fwc3VsYXRlIERTQ1AgY29kZSBhbmQgRUNOCiAgKgogICogUmV0dXJuOiAwCiAgKiovCiAKLXN0YXRpYyBpbnQKLWlwNmlwNl9yY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3N0YXRpYyBpbnQgaXA2X3RubF9yY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYiwgX191MTYgcHJvdG9jb2wsCisJCSAgICAgICBfX3U4IGlwcHJvdG8sCisJCSAgICAgICB2b2lkICgqZHNjcF9lY25fZGVjYXBzdWxhdGUpKHN0cnVjdCBpcDZfdG5sICp0LAorCQkJCQkJICAgIHN0cnVjdCBpcHY2aGRyICppcHY2aCwKKwkJCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKSkKIHsKLQlzdHJ1Y3QgaXB2NmhkciAqaXB2Nmg7CiAJc3RydWN0IGlwNl90bmwgKnQ7CisJc3RydWN0IGlwdjZoZHIgKmlwdjZoID0gaXB2Nl9oZHIoc2tiKTsKIAotCWlwdjZoID0gc2tiLT5uaC5pcHY2aDsKKwlyZWFkX2xvY2soJmlwNl90bmxfbG9jayk7CiAKLQlyZWFkX2xvY2soJmlwNmlwNl9sb2NrKTsKKwlpZiAoKHQgPSBpcDZfdG5sX2xvb2t1cCgmaXB2NmgtPnNhZGRyLCAmaXB2NmgtPmRhZGRyKSkgIT0gTlVMTCkgeworCQlpZiAodC0+cGFybXMucHJvdG8gIT0gaXBwcm90byAmJiB0LT5wYXJtcy5wcm90byAhPSAwKSB7CisJCQlyZWFkX3VubG9jaygmaXA2X3RubF9sb2NrKTsKKwkJCWdvdG8gZGlzY2FyZDsKKwkJfQogCi0JaWYgKCh0ID0gaXA2aXA2X3RubF9sb29rdXAoJmlwdjZoLT5zYWRkciwgJmlwdjZoLT5kYWRkcikpICE9IE5VTEwpIHsKIAkJaWYgKCF4ZnJtNl9wb2xpY3lfY2hlY2soTlVMTCwgWEZSTV9QT0xJQ1lfSU4sIHNrYikpIHsKLQkJCXJlYWRfdW5sb2NrKCZpcDZpcDZfbG9jayk7CisJCQlyZWFkX3VubG9jaygmaXA2X3RubF9sb2NrKTsKIAkJCWdvdG8gZGlzY2FyZDsKIAkJfQogCiAJCWlmICghaXA2X3RubF9yY3ZfY3RsKHQpKSB7CiAJCQl0LT5zdGF0LnJ4X2Ryb3BwZWQrKzsKLQkJCXJlYWRfdW5sb2NrKCZpcDZpcDZfbG9jayk7CisJCQlyZWFkX3VubG9jaygmaXA2X3RubF9sb2NrKTsKIAkJCWdvdG8gZGlzY2FyZDsKIAkJfQogCQlzZWNwYXRoX3Jlc2V0KHNrYik7Ci0JCXNrYi0+bWFjLnJhdyA9IHNrYi0+bmgucmF3OwotCQlza2ItPm5oLnJhdyA9IHNrYi0+ZGF0YTsKLQkJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0lQVjYpOworCQlza2ItPm1hY19oZWFkZXIgPSBza2ItPm5ldHdvcmtfaGVhZGVyOworCQlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiKTsKKwkJc2tiLT5wcm90b2NvbCA9IGh0b25zKHByb3RvY29sKTsKIAkJc2tiLT5wa3RfdHlwZSA9IFBBQ0tFVF9IT1NUOwogCQltZW1zZXQoc2tiLT5jYiwgMCwgc2l6ZW9mKHN0cnVjdCBpbmV0Nl9za2JfcGFybSkpOwogCQlza2ItPmRldiA9IHQtPmRldjsKIAkJZHN0X3JlbGVhc2Uoc2tiLT5kc3QpOwogCQlza2ItPmRzdCA9IE5VTEw7CiAJCW5mX3Jlc2V0KHNrYik7Ci0JCWlmICh0LT5wYXJtcy5mbGFncyAmIElQNl9UTkxfRl9SQ1ZfRFNDUF9DT1BZKQotCQkJaXB2Nl9jb3B5X2RzY3AoaXB2NmgsIHNrYi0+bmguaXB2NmgpOwotCQlpcDZpcDZfZWNuX2RlY2Fwc3VsYXRlKGlwdjZoLCBza2IpOworCisJCWRzY3BfZWNuX2RlY2Fwc3VsYXRlKHQsIGlwdjZoLCBza2IpOworCiAJCXQtPnN0YXQucnhfcGFja2V0cysrOwogCQl0LT5zdGF0LnJ4X2J5dGVzICs9IHNrYi0+bGVuOwogCQluZXRpZl9yeChza2IpOwotCQlyZWFkX3VubG9jaygmaXA2aXA2X2xvY2spOworCQlyZWFkX3VubG9jaygmaXA2X3RubF9sb2NrKTsKIAkJcmV0dXJuIDA7CiAJfQotCXJlYWRfdW5sb2NrKCZpcDZpcDZfbG9jayk7CisJcmVhZF91bmxvY2soJmlwNl90bmxfbG9jayk7CiAJcmV0dXJuIDE7CiAKIGRpc2NhcmQ6CkBAIC01NzMsNiArNzI3LDE4IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgaXA0aXA2X3JjdihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiBpcDZfdG5sX3Jjdihza2IsIEVUSF9QX0lQLCBJUFBST1RPX0lQSVAsCisJCQkgICBpcDRpcDZfZHNjcF9lY25fZGVjYXBzdWxhdGUpOworfQorCitzdGF0aWMgaW50IGlwNmlwNl9yY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gaXA2X3RubF9yY3Yoc2tiLCBFVEhfUF9JUFY2LCBJUFBST1RPX0lQVjYsCisJCQkgICBpcDZpcDZfZHNjcF9lY25fZGVjYXBzdWxhdGUpOworfQorCiBzdHJ1Y3QgaXB2Nl90ZWxfdHhvcHRpb24gewogCXN0cnVjdCBpcHY2X3R4b3B0aW9ucyBvcHM7CiAJX191OCBkc3Rfb3B0WzhdOwpAQCAtNTkzLDcgKzc1OSw3IEBACiB9CiAKIC8qKgotICogaXA2aXA2X3RubF9hZGRyX2NvbmZsaWN0IC0gY29tcGFyZSBwYWNrZXQgYWRkcmVzc2VzIHRvIHR1bm5lbCdzIG93bgorICogaXA2X3RubF9hZGRyX2NvbmZsaWN0IC0gY29tcGFyZSBwYWNrZXQgYWRkcmVzc2VzIHRvIHR1bm5lbCdzIG93bgogICogICBAdDogdGhlIG91dGdvaW5nIHR1bm5lbCBkZXZpY2UKICAqICAgQGhkcjogSVB2NiBoZWFkZXIgZnJvbSB0aGUgaW5jb21pbmcgcGFja2V0CiAgKgpAQCAtNjA3LDcgKzc3Myw3IEBACiAgKiovCiAKIHN0YXRpYyBpbmxpbmUgaW50Ci1pcDZpcDZfdG5sX2FkZHJfY29uZmxpY3Qoc3RydWN0IGlwNl90bmwgKnQsIHN0cnVjdCBpcHY2aGRyICpoZHIpCitpcDZfdG5sX2FkZHJfY29uZmxpY3Qoc3RydWN0IGlwNl90bmwgKnQsIHN0cnVjdCBpcHY2aGRyICpoZHIpCiB7CiAJcmV0dXJuIGlwdjZfYWRkcl9lcXVhbCgmdC0+cGFybXMucmFkZHIsICZoZHItPnNhZGRyKTsKIH0KQEAgLTY0MSw3MiArODA3LDQ5IEBACiAJcmV0dXJuIHJldDsKIH0KIC8qKgotICogaXA2aXA2X3RubF94bWl0IC0gZW5jYXBzdWxhdGUgcGFja2V0IGFuZCBzZW5kCisgKiBpcDZfdG5sX3htaXQyIC0gZW5jYXBzdWxhdGUgcGFja2V0IGFuZCBzZW5kCiAgKiAgIEBza2I6IHRoZSBvdXRnb2luZyBzb2NrZXQgYnVmZmVyCiAgKiAgIEBkZXY6IHRoZSBvdXRnb2luZyB0dW5uZWwgZGV2aWNlCisgKiAgIEBkc2ZpZWxkOiBkc2NwIGNvZGUgZm9yIG91dGVyIGhlYWRlcgorICogICBAZmw6IGZsb3cgb2YgdHVubmVsZWQgcGFja2V0CisgKiAgIEBlbmNhcF9saW1pdDogZW5jYXBzdWxhdGlvbiBsaW1pdAorICogICBAcG10dTogUGF0aCBNVFUgaXMgc3RvcmVkIGlmIHBhY2tldCBpcyB0b28gYmlnCiAgKgogICogRGVzY3JpcHRpb246CiAgKiAgIEJ1aWxkIG5ldyBoZWFkZXIgYW5kIGRvIHNvbWUgc2FuaXR5IGNoZWNrcyBvbiB0aGUgcGFja2V0IGJlZm9yZSBzZW5kaW5nCiAgKiAgIGl0LgogICoKICAqIFJldHVybjoKLSAqICAgMAorICogICAwIG9uIHN1Y2Nlc3MKKyAqICAgLTEgZmFpbAorICogICAlLUVNU0dTSVpFIG1lc3NhZ2UgdG9vIGJpZy4gcmV0dXJuIG10dSBpbiB0aGlzIGNhc2UuCiAgKiovCiAKLXN0YXRpYyBpbnQKLWlwNmlwNl90bmxfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIGludCBpcDZfdG5sX3htaXQyKHN0cnVjdCBza19idWZmICpza2IsCisJCQkgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSBfX3U4IGRzZmllbGQsCisJCQkgc3RydWN0IGZsb3dpICpmbCwKKwkJCSBpbnQgZW5jYXBfbGltaXQsCisJCQkgX191MzIgKnBtdHUpCiB7CiAJc3RydWN0IGlwNl90bmwgKnQgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICZ0LT5zdGF0OwotCXN0cnVjdCBpcHY2aGRyICppcHY2aCA9IHNrYi0+bmguaXB2Nmg7Ci0JaW50IGVuY2FwX2xpbWl0ID0gLTE7CisJc3RydWN0IGlwdjZoZHIgKmlwdjZoID0gaXB2Nl9oZHIoc2tiKTsKIAlzdHJ1Y3QgaXB2Nl90ZWxfdHhvcHRpb24gb3B0OwotCV9fdTE2IG9mZnNldDsKLQlzdHJ1Y3QgZmxvd2kgZmw7CiAJc3RydWN0IGRzdF9lbnRyeSAqZHN0OwogCXN0cnVjdCBuZXRfZGV2aWNlICp0ZGV2OwogCWludCBtdHU7CiAJaW50IG1heF9oZWFkcm9vbSA9IHNpemVvZihzdHJ1Y3QgaXB2Nmhkcik7CiAJdTggcHJvdG87Ci0JaW50IGVycjsKKwlpbnQgZXJyID0gLTE7CiAJaW50IHBrdF9sZW47Ci0JaW50IGRzZmllbGQ7Ci0KLQlpZiAodC0+cmVjdXJzaW9uKyspIHsKLQkJc3RhdHMtPmNvbGxpc2lvbnMrKzsKLQkJZ290byB0eF9lcnI7Ci0JfQotCWlmIChza2ItPnByb3RvY29sICE9IGh0b25zKEVUSF9QX0lQVjYpIHx8Ci0JICAgICFpcDZfdG5sX3htaXRfY3RsKHQpIHx8IGlwNmlwNl90bmxfYWRkcl9jb25mbGljdCh0LCBpcHY2aCkpCi0JCWdvdG8gdHhfZXJyOwotCi0JaWYgKChvZmZzZXQgPSBwYXJzZV90bHZfdG5sX2VuY19saW0oc2tiLCBza2ItPm5oLnJhdykpID4gMCkgewotCQlzdHJ1Y3QgaXB2Nl90bHZfdG5sX2VuY19saW0gKnRlbDsKLQkJdGVsID0gKHN0cnVjdCBpcHY2X3Rsdl90bmxfZW5jX2xpbSAqKSAmc2tiLT5uaC5yYXdbb2Zmc2V0XTsKLQkJaWYgKHRlbC0+ZW5jYXBfbGltaXQgPT0gMCkgewotCQkJaWNtcHY2X3NlbmQoc2tiLCBJQ01QVjZfUEFSQU1QUk9CLAotCQkJCSAgICBJQ01QVjZfSERSX0ZJRUxELCBvZmZzZXQgKyAyLCBza2ItPmRldik7Ci0JCQlnb3RvIHR4X2VycjsKLQkJfQotCQllbmNhcF9saW1pdCA9IHRlbC0+ZW5jYXBfbGltaXQgLSAxOwotCX0gZWxzZSBpZiAoISh0LT5wYXJtcy5mbGFncyAmIElQNl9UTkxfRl9JR05fRU5DQVBfTElNSVQpKQotCQllbmNhcF9saW1pdCA9IHQtPnBhcm1zLmVuY2FwX2xpbWl0OwotCi0JbWVtY3B5KCZmbCwgJnQtPmZsLCBzaXplb2YgKGZsKSk7Ci0JcHJvdG8gPSBmbC5wcm90bzsKLQotCWRzZmllbGQgPSBpcHY2X2dldF9kc2ZpZWxkKGlwdjZoKTsKLQlpZiAoKHQtPnBhcm1zLmZsYWdzICYgSVA2X1ROTF9GX1VTRV9PUklHX1RDTEFTUykpCi0JCWZsLmZsNl9mbG93bGFiZWwgfD0gKCooX19iZTMyICopIGlwdjZoICYgSVBWNl9UQ0xBU1NfTUFTSyk7Ci0JaWYgKCh0LT5wYXJtcy5mbGFncyAmIElQNl9UTkxfRl9VU0VfT1JJR19GTE9XTEFCRUwpKQotCQlmbC5mbDZfZmxvd2xhYmVsIHw9ICgqKF9fYmUzMiAqKSBpcHY2aCAmIElQVjZfRkxPV0xBQkVMX01BU0spOwogCiAJaWYgKChkc3QgPSBpcDZfdG5sX2RzdF9jaGVjayh0KSkgIT0gTlVMTCkKIAkJZHN0X2hvbGQoZHN0KTsKIAllbHNlIHsKLQkJZHN0ID0gaXA2X3JvdXRlX291dHB1dChOVUxMLCAmZmwpOworCQlkc3QgPSBpcDZfcm91dGVfb3V0cHV0KE5VTEwsIGZsKTsKIAotCQlpZiAoZHN0LT5lcnJvciB8fCB4ZnJtX2xvb2t1cCgmZHN0LCAmZmwsIE5VTEwsIDApIDwgMCkKKwkJaWYgKGRzdC0+ZXJyb3IgfHwgeGZybV9sb29rdXAoJmRzdCwgZmwsIE5VTEwsIDApIDwgMCkKIAkJCWdvdG8gdHhfZXJyX2xpbmtfZmFpbHVyZTsKIAl9CiAKQEAgLTczMCw3ICs4NzMsOCBAQAogCWlmIChza2ItPmRzdCkKIAkJc2tiLT5kc3QtPm9wcy0+dXBkYXRlX3BtdHUoc2tiLT5kc3QsIG10dSk7CiAJaWYgKHNrYi0+bGVuID4gbXR1KSB7Ci0JCWljbXB2Nl9zZW5kKHNrYiwgSUNNUFY2X1BLVF9UT09CSUcsIDAsIG10dSwgZGV2KTsKKwkJKnBtdHUgPSBtdHU7CisJCWVyciA9IC1FTVNHU0laRTsKIAkJZ290byB0eF9lcnJfZHN0X3JlbGVhc2U7CiAJfQogCkBAIC03NTQsMjIgKzg5OCwyNCBAQAogCWRzdF9yZWxlYXNlKHNrYi0+ZHN0KTsKIAlza2ItPmRzdCA9IGRzdF9jbG9uZShkc3QpOwogCi0Jc2tiLT5oLnJhdyA9IHNrYi0+bmgucmF3OworCXNrYi0+dHJhbnNwb3J0X2hlYWRlciA9IHNrYi0+bmV0d29ya19oZWFkZXI7CiAKKwlwcm90byA9IGZsLT5wcm90bzsKIAlpZiAoZW5jYXBfbGltaXQgPj0gMCkgewogCQlpbml0X3RlbF90eG9wdCgmb3B0LCBlbmNhcF9saW1pdCk7CiAJCWlwdjZfcHVzaF9uZnJhZ19vcHRzKHNrYiwgJm9wdC5vcHMsICZwcm90bywgTlVMTCk7CiAJfQotCXNrYi0+bmgucmF3ID0gc2tiX3B1c2goc2tiLCBzaXplb2Yoc3RydWN0IGlwdjZoZHIpKTsKLQlpcHY2aCA9IHNrYi0+bmguaXB2Nmg7Ci0JKihfX2JlMzIqKWlwdjZoID0gZmwuZmw2X2Zsb3dsYWJlbCB8IGh0b25sKDB4NjAwMDAwMDApOworCXNrYl9wdXNoKHNrYiwgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSk7CisJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CisJaXB2NmggPSBpcHY2X2hkcihza2IpOworCSooX19iZTMyKilpcHY2aCA9IGZsLT5mbDZfZmxvd2xhYmVsIHwgaHRvbmwoMHg2MDAwMDAwMCk7CiAJZHNmaWVsZCA9IElORVRfRUNOX2VuY2Fwc3VsYXRlKDAsIGRzZmllbGQpOwogCWlwdjZfY2hhbmdlX2RzZmllbGQoaXB2NmgsIH5JTkVUX0VDTl9NQVNLLCBkc2ZpZWxkKTsKIAlpcHY2aC0+cGF5bG9hZF9sZW4gPSBodG9ucyhza2ItPmxlbiAtIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikpOwogCWlwdjZoLT5ob3BfbGltaXQgPSB0LT5wYXJtcy5ob3BfbGltaXQ7CiAJaXB2NmgtPm5leHRoZHIgPSBwcm90bzsKLQlpcHY2X2FkZHJfY29weSgmaXB2NmgtPnNhZGRyLCAmZmwuZmw2X3NyYyk7Ci0JaXB2Nl9hZGRyX2NvcHkoJmlwdjZoLT5kYWRkciwgJmZsLmZsNl9kc3QpOworCWlwdjZfYWRkcl9jb3B5KCZpcHY2aC0+c2FkZHIsICZmbC0+Zmw2X3NyYyk7CisJaXB2Nl9hZGRyX2NvcHkoJmlwdjZoLT5kYWRkciwgJmZsLT5mbDZfZHN0KTsKIAluZl9yZXNldChza2IpOwogCXBrdF9sZW4gPSBza2ItPmxlbjsKIAllcnIgPSBORl9IT09LKFBGX0lORVQ2LCBORl9JUDZfTE9DQUxfT1VULCBza2IsIE5VTEwsCkBAIC03ODMsMTMgKzkyOSwxMzEgQEAKIAkJc3RhdHMtPnR4X2Fib3J0ZWRfZXJyb3JzKys7CiAJfQogCWlwNl90bmxfZHN0X3N0b3JlKHQsIGRzdCk7Ci0JdC0+cmVjdXJzaW9uLS07CiAJcmV0dXJuIDA7CiB0eF9lcnJfbGlua19mYWlsdXJlOgogCXN0YXRzLT50eF9jYXJyaWVyX2Vycm9ycysrOwogCWRzdF9saW5rX2ZhaWx1cmUoc2tiKTsKIHR4X2Vycl9kc3RfcmVsZWFzZToKIAlkc3RfcmVsZWFzZShkc3QpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitpcDRpcDZfdG5sX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaXA2X3RubCAqdCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGlwaGRyICAqaXBoID0gaXBfaGRyKHNrYik7CisJaW50IGVuY2FwX2xpbWl0ID0gLTE7CisJc3RydWN0IGZsb3dpIGZsOworCV9fdTggZHNmaWVsZDsKKwlfX3UzMiBtdHU7CisJaW50IGVycjsKKworCWlmICgodC0+cGFybXMucHJvdG8gIT0gSVBQUk9UT19JUElQICYmIHQtPnBhcm1zLnByb3RvICE9IDApIHx8CisJICAgICFpcDZfdG5sX3htaXRfY3RsKHQpKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoISh0LT5wYXJtcy5mbGFncyAmIElQNl9UTkxfRl9JR05fRU5DQVBfTElNSVQpKQorCQllbmNhcF9saW1pdCA9IHQtPnBhcm1zLmVuY2FwX2xpbWl0OworCisJbWVtY3B5KCZmbCwgJnQtPmZsLCBzaXplb2YgKGZsKSk7CisJZmwucHJvdG8gPSBJUFBST1RPX0lQSVA7CisKKwlkc2ZpZWxkID0gaXB2NF9nZXRfZHNmaWVsZChpcGgpOworCisJaWYgKCh0LT5wYXJtcy5mbGFncyAmIElQNl9UTkxfRl9VU0VfT1JJR19UQ0xBU1MpKQorCQlmbC5mbDZfZmxvd2xhYmVsIHw9IG50b2hsKCgoX191MzIpaXBoLT50b3MgPDwgSVBWNl9UQ0xBU1NfU0hJRlQpCisJCQkJCSAgJiBJUFY2X1RDTEFTU19NQVNLKTsKKworCWVyciA9IGlwNl90bmxfeG1pdDIoc2tiLCBkZXYsIGRzZmllbGQsICZmbCwgZW5jYXBfbGltaXQsICZtdHUpOworCWlmIChlcnIgIT0gMCkgeworCQkvKiBYWFg6IHNlbmQgSUNNUCBlcnJvciBldmVuIGlmIERGIGlzIG5vdCBzZXQuICovCisJCWlmIChlcnIgPT0gLUVNU0dTSVpFKQorCQkJaWNtcF9zZW5kKHNrYiwgSUNNUF9ERVNUX1VOUkVBQ0gsIElDTVBfRlJBR19ORUVERUQsCisJCQkJICBodG9ubChtdHUpKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludAoraXA2aXA2X3RubF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGlwNl90bmwgKnQgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBpcHY2aGRyICppcHY2aCA9IGlwdjZfaGRyKHNrYik7CisJaW50IGVuY2FwX2xpbWl0ID0gLTE7CisJX191MTYgb2Zmc2V0OworCXN0cnVjdCBmbG93aSBmbDsKKwlfX3U4IGRzZmllbGQ7CisJX191MzIgbXR1OworCWludCBlcnI7CisKKwlpZiAoKHQtPnBhcm1zLnByb3RvICE9IElQUFJPVE9fSVBWNiAmJiB0LT5wYXJtcy5wcm90byAhPSAwKSB8fAorCSAgICAhaXA2X3RubF94bWl0X2N0bCh0KSB8fCBpcDZfdG5sX2FkZHJfY29uZmxpY3QodCwgaXB2NmgpKQorCQlyZXR1cm4gLTE7CisKKwlvZmZzZXQgPSBwYXJzZV90bHZfdG5sX2VuY19saW0oc2tiLCBza2JfbmV0d29ya19oZWFkZXIoc2tiKSk7CisJaWYgKG9mZnNldCA+IDApIHsKKwkJc3RydWN0IGlwdjZfdGx2X3RubF9lbmNfbGltICp0ZWw7CisJCXRlbCA9IChzdHJ1Y3QgaXB2Nl90bHZfdG5sX2VuY19saW0gKikmc2tiX25ldHdvcmtfaGVhZGVyKHNrYilbb2Zmc2V0XTsKKwkJaWYgKHRlbC0+ZW5jYXBfbGltaXQgPT0gMCkgeworCQkJaWNtcHY2X3NlbmQoc2tiLCBJQ01QVjZfUEFSQU1QUk9CLAorCQkJCSAgICBJQ01QVjZfSERSX0ZJRUxELCBvZmZzZXQgKyAyLCBza2ItPmRldik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJZW5jYXBfbGltaXQgPSB0ZWwtPmVuY2FwX2xpbWl0IC0gMTsKKwl9IGVsc2UgaWYgKCEodC0+cGFybXMuZmxhZ3MgJiBJUDZfVE5MX0ZfSUdOX0VOQ0FQX0xJTUlUKSkKKwkJZW5jYXBfbGltaXQgPSB0LT5wYXJtcy5lbmNhcF9saW1pdDsKKworCW1lbWNweSgmZmwsICZ0LT5mbCwgc2l6ZW9mIChmbCkpOworCWZsLnByb3RvID0gSVBQUk9UT19JUFY2OworCisJZHNmaWVsZCA9IGlwdjZfZ2V0X2RzZmllbGQoaXB2NmgpOworCWlmICgodC0+cGFybXMuZmxhZ3MgJiBJUDZfVE5MX0ZfVVNFX09SSUdfVENMQVNTKSkKKwkJZmwuZmw2X2Zsb3dsYWJlbCB8PSAoKihfX2JlMzIgKikgaXB2NmggJiBJUFY2X1RDTEFTU19NQVNLKTsKKwlpZiAoKHQtPnBhcm1zLmZsYWdzICYgSVA2X1ROTF9GX1VTRV9PUklHX0ZMT1dMQUJFTCkpCisJCWZsLmZsNl9mbG93bGFiZWwgfD0gKCooX19iZTMyICopIGlwdjZoICYgSVBWNl9GTE9XTEFCRUxfTUFTSyk7CisKKwllcnIgPSBpcDZfdG5sX3htaXQyKHNrYiwgZGV2LCBkc2ZpZWxkLCAmZmwsIGVuY2FwX2xpbWl0LCAmbXR1KTsKKwlpZiAoZXJyICE9IDApIHsKKwkJaWYgKGVyciA9PSAtRU1TR1NJWkUpCisJCQlpY21wdjZfc2VuZChza2IsIElDTVBWNl9QS1RfVE9PQklHLCAwLCBtdHUsIGRldik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAoraXA2X3RubF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGlwNl90bmwgKnQgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICZ0LT5zdGF0OworCWludCByZXQ7CisKKwlpZiAodC0+cmVjdXJzaW9uKyspIHsKKwkJdC0+c3RhdC5jb2xsaXNpb25zKys7CisJCWdvdG8gdHhfZXJyOworCX0KKworCXN3aXRjaCAoc2tiLT5wcm90b2NvbCkgeworCWNhc2UgX19jb25zdGFudF9odG9ucyhFVEhfUF9JUCk6CisJCXJldCA9IGlwNGlwNl90bmxfeG1pdChza2IsIGRldik7CisJCWJyZWFrOworCWNhc2UgX19jb25zdGFudF9odG9ucyhFVEhfUF9JUFY2KToKKwkJcmV0ID0gaXA2aXA2X3RubF94bWl0KHNrYiwgZGV2KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZ290byB0eF9lcnI7CisJfQorCisJaWYgKHJldCA8IDApCisJCWdvdG8gdHhfZXJyOworCisJdC0+cmVjdXJzaW9uLS07CisJcmV0dXJuIDA7CisKIHR4X2VycjoKIAlzdGF0cy0+dHhfZXJyb3JzKys7CiAJc3RhdHMtPnR4X2Ryb3BwZWQrKzsKQEAgLTgxNyw3ICsxMDgxLDcgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGlwNmlwNl90bmxfbGlua19jb25maWcoc3RydWN0IGlwNl90bmwgKnQpCitzdGF0aWMgdm9pZCBpcDZfdG5sX2xpbmtfY29uZmlnKHN0cnVjdCBpcDZfdG5sICp0KQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSB0LT5kZXY7CiAJc3RydWN0IGlwNl90bmxfcGFybSAqcCA9ICZ0LT5wYXJtczsKQEAgLTg3MCwxNyArMTEzNCwxNyBAQAogfQogCiAvKioKLSAqIGlwNmlwNl90bmxfY2hhbmdlIC0gdXBkYXRlIHRoZSB0dW5uZWwgcGFyYW1ldGVycworICogaXA2X3RubF9jaGFuZ2UgLSB1cGRhdGUgdGhlIHR1bm5lbCBwYXJhbWV0ZXJzCiAgKiAgIEB0OiB0dW5uZWwgdG8gYmUgY2hhbmdlZAogICogICBAcDogdHVubmVsIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycwogICogICBAYWN0aXZlOiAhPSAwIGlmIHR1bm5lbCBpcyByZWFkeSBmb3IgdXNlCiAgKgogICogRGVzY3JpcHRpb246Ci0gKiAgIGlwNmlwNl90bmxfY2hhbmdlKCkgdXBkYXRlcyB0aGUgdHVubmVsIHBhcmFtZXRlcnMKKyAqICAgaXA2X3RubF9jaGFuZ2UoKSB1cGRhdGVzIHRoZSB0dW5uZWwgcGFyYW1ldGVycwogICoqLwogCiBzdGF0aWMgaW50Ci1pcDZpcDZfdG5sX2NoYW5nZShzdHJ1Y3QgaXA2X3RubCAqdCwgc3RydWN0IGlwNl90bmxfcGFybSAqcCkKK2lwNl90bmxfY2hhbmdlKHN0cnVjdCBpcDZfdG5sICp0LCBzdHJ1Y3QgaXA2X3RubF9wYXJtICpwKQogewogCWlwdjZfYWRkcl9jb3B5KCZ0LT5wYXJtcy5sYWRkciwgJnAtPmxhZGRyKTsKIAlpcHY2X2FkZHJfY29weSgmdC0+cGFybXMucmFkZHIsICZwLT5yYWRkcik7CkBAIC04ODksMTkgKzExNTMsMjAgQEAKIAl0LT5wYXJtcy5lbmNhcF9saW1pdCA9IHAtPmVuY2FwX2xpbWl0OwogCXQtPnBhcm1zLmZsb3dpbmZvID0gcC0+Zmxvd2luZm87CiAJdC0+cGFybXMubGluayA9IHAtPmxpbms7CisJdC0+cGFybXMucHJvdG8gPSBwLT5wcm90bzsKIAlpcDZfdG5sX2RzdF9yZXNldCh0KTsKLQlpcDZpcDZfdG5sX2xpbmtfY29uZmlnKHQpOworCWlwNl90bmxfbGlua19jb25maWcodCk7CiAJcmV0dXJuIDA7CiB9CiAKIC8qKgotICogaXA2aXA2X3RubF9pb2N0bCAtIGNvbmZpZ3VyZSBpcHY2IHR1bm5lbHMgZnJvbSB1c2Vyc3BhY2UKKyAqIGlwNl90bmxfaW9jdGwgLSBjb25maWd1cmUgaXB2NiB0dW5uZWxzIGZyb20gdXNlcnNwYWNlCiAgKiAgIEBkZXY6IHZpcnR1YWwgZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0dW5uZWwKICAqICAgQGlmcjogcGFyYW1ldGVycyBwYXNzZWQgZnJvbSB1c2Vyc3BhY2UKICAqICAgQGNtZDogY29tbWFuZCB0byBiZSBwZXJmb3JtZWQKICAqCiAgKiBEZXNjcmlwdGlvbjoKLSAqICAgaXA2aXA2X3RubF9pb2N0bCgpIGlzIHVzZWQgZm9yIG1hbmFnaW5nIElQdjYgdHVubmVscworICogICBpcDZfdG5sX2lvY3RsKCkgaXMgdXNlZCBmb3IgbWFuYWdpbmcgSVB2NiB0dW5uZWxzCiAgKiAgIGZyb20gdXNlcnNwYWNlLgogICoKICAqICAgVGhlIHBvc3NpYmxlIGNvbW1hbmRzIGFyZSB0aGUgZm9sbG93aW5nOgpAQCAtOTIzLDcgKzExODgsNyBAQAogICoqLwogCiBzdGF0aWMgaW50Ci1pcDZpcDZfdG5sX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKQoraXA2X3RubF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKIHsKIAlpbnQgZXJyID0gMDsKIAlzdHJ1Y3QgaXA2X3RubF9wYXJtIHA7CkBAIC05MzEsMTIgKzExOTYsMTIgQEAKIAogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBTSU9DR0VUVFVOTkVMOgotCQlpZiAoZGV2ID09IGlwNmlwNl9mYl90bmxfZGV2KSB7CisJCWlmIChkZXYgPT0gaXA2X2ZiX3RubF9kZXYpIHsKIAkJCWlmIChjb3B5X2Zyb21fdXNlcigmcCwgaWZyLT5pZnJfaWZydS5pZnJ1X2RhdGEsIHNpemVvZiAocCkpKSB7CiAJCQkJZXJyID0gLUVGQVVMVDsKIAkJCQlicmVhazsKIAkJCX0KLQkJCXQgPSBpcDZpcDZfdG5sX2xvY2F0ZSgmcCwgMCk7CisJCQl0ID0gaXA2X3RubF9sb2NhdGUoJnAsIDApOwogCQl9CiAJCWlmICh0ID09IE5VTEwpCiAJCQl0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKQEAgLTk1NCwxMCArMTIxOSwxMSBAQAogCQlpZiAoY29weV9mcm9tX3VzZXIoJnAsIGlmci0+aWZyX2lmcnUuaWZydV9kYXRhLCBzaXplb2YgKHApKSkKIAkJCWJyZWFrOwogCQllcnIgPSAtRUlOVkFMOwotCQlpZiAocC5wcm90byAhPSBJUFBST1RPX0lQVjYpCisJCWlmIChwLnByb3RvICE9IElQUFJPVE9fSVBWNiAmJiBwLnByb3RvICE9IElQUFJPVE9fSVBJUCAmJgorCQkgICAgcC5wcm90byAhPSAwKQogCQkJYnJlYWs7Ci0JCXQgPSBpcDZpcDZfdG5sX2xvY2F0ZSgmcCwgY21kID09IFNJT0NBRERUVU5ORUwpOwotCQlpZiAoZGV2ICE9IGlwNmlwNl9mYl90bmxfZGV2ICYmIGNtZCA9PSBTSU9DQ0hHVFVOTkVMKSB7CisJCXQgPSBpcDZfdG5sX2xvY2F0ZSgmcCwgY21kID09IFNJT0NBRERUVU5ORUwpOworCQlpZiAoZGV2ICE9IGlwNl9mYl90bmxfZGV2ICYmIGNtZCA9PSBTSU9DQ0hHVFVOTkVMKSB7CiAJCQlpZiAodCAhPSBOVUxMKSB7CiAJCQkJaWYgKHQtPmRldiAhPSBkZXYpIHsKIAkJCQkJZXJyID0gLUVFWElTVDsKQEAgLTk2Niw5ICsxMjMyLDkgQEAKIAkJCX0gZWxzZQogCQkJCXQgPSBuZXRkZXZfcHJpdihkZXYpOwogCi0JCQlpcDZpcDZfdG5sX3VubGluayh0KTsKLQkJCWVyciA9IGlwNmlwNl90bmxfY2hhbmdlKHQsICZwKTsKLQkJCWlwNmlwNl90bmxfbGluayh0KTsKKwkJCWlwNl90bmxfdW5saW5rKHQpOworCQkJZXJyID0gaXA2X3RubF9jaGFuZ2UodCwgJnApOworCQkJaXA2X3RubF9saW5rKHQpOwogCQkJbmV0ZGV2X3N0YXRlX2NoYW5nZShkZXYpOwogCQl9CiAJCWlmICh0KSB7CkBAIC05ODQsMTUgKzEyNTAsMTUgQEAKIAkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQogCQkJYnJlYWs7CiAKLQkJaWYgKGRldiA9PSBpcDZpcDZfZmJfdG5sX2RldikgeworCQlpZiAoZGV2ID09IGlwNl9mYl90bmxfZGV2KSB7CiAJCQllcnIgPSAtRUZBVUxUOwogCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZwLCBpZnItPmlmcl9pZnJ1LmlmcnVfZGF0YSwgc2l6ZW9mIChwKSkpCiAJCQkJYnJlYWs7CiAJCQllcnIgPSAtRU5PRU5UOwotCQkJaWYgKCh0ID0gaXA2aXA2X3RubF9sb2NhdGUoJnAsIDApKSA9PSBOVUxMKQorCQkJaWYgKCh0ID0gaXA2X3RubF9sb2NhdGUoJnAsIDApKSA9PSBOVUxMKQogCQkJCWJyZWFrOwogCQkJZXJyID0gLUVQRVJNOwotCQkJaWYgKHQtPmRldiA9PSBpcDZpcDZfZmJfdG5sX2RldikKKwkJCWlmICh0LT5kZXYgPT0gaXA2X2ZiX3RubF9kZXYpCiAJCQkJYnJlYWs7CiAJCQlkZXYgPSB0LT5kZXY7CiAJCX0KQEAgLTEwMDYsMjAgKzEyNzIsMjAgQEAKIH0KIAogLyoqCi0gKiBpcDZpcDZfdG5sX2dldF9zdGF0cyAtIHJldHVybiB0aGUgc3RhdHMgZm9yIHR1bm5lbCBkZXZpY2UKKyAqIGlwNl90bmxfZ2V0X3N0YXRzIC0gcmV0dXJuIHRoZSBzdGF0cyBmb3IgdHVubmVsIGRldmljZQogICogICBAZGV2OiB2aXJ0dWFsIGRldmljZSBhc3NvY2lhdGVkIHdpdGggdHVubmVsCiAgKgogICogUmV0dXJuOiBzdGF0cyBmb3IgZGV2aWNlCiAgKiovCiAKIHN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqCi1pcDZpcDZfdG5sX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoraXA2X3RubF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlyZXR1cm4gJigoKHN0cnVjdCBpcDZfdG5sICopbmV0ZGV2X3ByaXYoZGV2KSktPnN0YXQpOwogfQogCiAvKioKLSAqIGlwNmlwNl90bmxfY2hhbmdlX210dSAtIGNoYW5nZSBtdHUgbWFudWFsbHkgZm9yIHR1bm5lbCBkZXZpY2UKKyAqIGlwNl90bmxfY2hhbmdlX210dSAtIGNoYW5nZSBtdHUgbWFudWFsbHkgZm9yIHR1bm5lbCBkZXZpY2UKICAqICAgQGRldjogdmlydHVhbCBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHR1bm5lbAogICogICBAbmV3X210dTogdGhlIG5ldyBtdHUKICAqCkBAIC0xMDI5LDcgKzEyOTUsNyBAQAogICoqLwogCiBzdGF0aWMgaW50Ci1pcDZpcDZfdG5sX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpCitpcDZfdG5sX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpCiB7CiAJaWYgKG5ld19tdHUgPCBJUFY2X01JTl9NVFUpIHsKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xMDM5LDIyICsxMzA1LDIyIEBACiB9CiAKIC8qKgotICogaXA2aXA2X3RubF9kZXZfc2V0dXAgLSBzZXR1cCB2aXJ0dWFsIHR1bm5lbCBkZXZpY2UKKyAqIGlwNl90bmxfZGV2X3NldHVwIC0gc2V0dXAgdmlydHVhbCB0dW5uZWwgZGV2aWNlCiAgKiAgIEBkZXY6IHZpcnR1YWwgZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0dW5uZWwKICAqCiAgKiBEZXNjcmlwdGlvbjoKICAqICAgSW5pdGlhbGl6ZSBmdW5jdGlvbiBwb2ludGVycyBhbmQgZGV2aWNlIHBhcmFtZXRlcnMKICAqKi8KIAotc3RhdGljIHZvaWQgaXA2aXA2X3RubF9kZXZfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIGlwNl90bmxfZGV2X3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJU0VUX01PRFVMRV9PV05FUihkZXYpOwotCWRldi0+dW5pbml0ID0gaXA2aXA2X3RubF9kZXZfdW5pbml0OworCWRldi0+dW5pbml0ID0gaXA2X3RubF9kZXZfdW5pbml0OwogCWRldi0+ZGVzdHJ1Y3RvciA9IGZyZWVfbmV0ZGV2OwotCWRldi0+aGFyZF9zdGFydF94bWl0ID0gaXA2aXA2X3RubF94bWl0OwotCWRldi0+Z2V0X3N0YXRzID0gaXA2aXA2X3RubF9nZXRfc3RhdHM7Ci0JZGV2LT5kb19pb2N0bCA9IGlwNmlwNl90bmxfaW9jdGw7Ci0JZGV2LT5jaGFuZ2VfbXR1ID0gaXA2aXA2X3RubF9jaGFuZ2VfbXR1OworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gaXA2X3RubF94bWl0OworCWRldi0+Z2V0X3N0YXRzID0gaXA2X3RubF9nZXRfc3RhdHM7CisJZGV2LT5kb19pb2N0bCA9IGlwNl90bmxfaW9jdGw7CisJZGV2LT5jaGFuZ2VfbXR1ID0gaXA2X3RubF9jaGFuZ2VfbXR1OwogCiAJZGV2LT50eXBlID0gQVJQSFJEX1RVTk5FTDY7CiAJZGV2LT5oYXJkX2hlYWRlcl9sZW4gPSBMTF9NQVhfSEVBREVSICsgc2l6ZW9mIChzdHJ1Y3QgaXB2Nmhkcik7CkBAIC0xMDY1LDUwICsxMzMxLDU2IEBACiAKIAogLyoqCi0gKiBpcDZpcDZfdG5sX2Rldl9pbml0X2dlbiAtIGdlbmVyYWwgaW5pdGlhbGl6ZXIgZm9yIGFsbCB0dW5uZWwgZGV2aWNlcworICogaXA2X3RubF9kZXZfaW5pdF9nZW4gLSBnZW5lcmFsIGluaXRpYWxpemVyIGZvciBhbGwgdHVubmVsIGRldmljZXMKICAqICAgQGRldjogdmlydHVhbCBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHR1bm5lbAogICoqLwogCiBzdGF0aWMgaW5saW5lIHZvaWQKLWlwNmlwNl90bmxfZGV2X2luaXRfZ2VuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitpcDZfdG5sX2Rldl9pbml0X2dlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBpcDZfdG5sICp0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQl0LT5mbC5wcm90byA9IElQUFJPVE9fSVBWNjsKIAl0LT5kZXYgPSBkZXY7CiAJc3RyY3B5KHQtPnBhcm1zLm5hbWUsIGRldi0+bmFtZSk7CiB9CiAKIC8qKgotICogaXA2aXA2X3RubF9kZXZfaW5pdCAtIGluaXRpYWxpemVyIGZvciBhbGwgbm9uIGZhbGxiYWNrIHR1bm5lbCBkZXZpY2VzCisgKiBpcDZfdG5sX2Rldl9pbml0IC0gaW5pdGlhbGl6ZXIgZm9yIGFsbCBub24gZmFsbGJhY2sgdHVubmVsIGRldmljZXMKICAqICAgQGRldjogdmlydHVhbCBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHR1bm5lbAogICoqLwogCiBzdGF0aWMgaW50Ci1pcDZpcDZfdG5sX2Rldl9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitpcDZfdG5sX2Rldl9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGlwNl90bmwgKnQgPSBuZXRkZXZfcHJpdihkZXYpOwotCWlwNmlwNl90bmxfZGV2X2luaXRfZ2VuKGRldik7Ci0JaXA2aXA2X3RubF9saW5rX2NvbmZpZyh0KTsKKwlpcDZfdG5sX2Rldl9pbml0X2dlbihkZXYpOworCWlwNl90bmxfbGlua19jb25maWcodCk7CiAJcmV0dXJuIDA7CiB9CiAKIC8qKgotICogaXA2aXA2X2ZiX3RubF9kZXZfaW5pdCAtIGluaXRpYWxpemVyIGZvciBmYWxsYmFjayB0dW5uZWwgZGV2aWNlCisgKiBpcDZfZmJfdG5sX2Rldl9pbml0IC0gaW5pdGlhbGl6ZXIgZm9yIGZhbGxiYWNrIHR1bm5lbCBkZXZpY2UKICAqICAgQGRldjogZmFsbGJhY2sgZGV2aWNlCiAgKgogICogUmV0dXJuOiAwCiAgKiovCiAKIHN0YXRpYyBpbnQKLWlwNmlwNl9mYl90bmxfZGV2X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK2lwNl9mYl90bmxfZGV2X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgaXA2X3RubCAqdCA9IG5ldGRldl9wcml2KGRldik7Ci0JaXA2aXA2X3RubF9kZXZfaW5pdF9nZW4oZGV2KTsKKwlpcDZfdG5sX2Rldl9pbml0X2dlbihkZXYpOworCXQtPnBhcm1zLnByb3RvID0gSVBQUk9UT19JUFY2OwogCWRldl9ob2xkKGRldik7CiAJdG5sc193Y1swXSA9IHQ7CiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgeGZybTZfdHVubmVsIGlwNGlwNl9oYW5kbGVyID0geworCS5oYW5kbGVyCT0gaXA0aXA2X3JjdiwKKwkuZXJyX2hhbmRsZXIJPSBpcDRpcDZfZXJyLAorCS5wcmlvcml0eQk9CTEsCit9OworCiBzdGF0aWMgc3RydWN0IHhmcm02X3R1bm5lbCBpcDZpcDZfaGFuZGxlciA9IHsKIAkuaGFuZGxlcgk9IGlwNmlwNl9yY3YsCiAJLmVycl9oYW5kbGVyCT0gaXA2aXA2X2VyciwKQEAgLTExMjUsMzAgKzEzOTcsNDAgQEAKIHsKIAlpbnQgIGVycjsKIAotCWlmICh4ZnJtNl90dW5uZWxfcmVnaXN0ZXIoJmlwNmlwNl9oYW5kbGVyLCBBRl9JTkVUNikpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJpcDZpcDYgaW5pdDogY2FuJ3QgcmVnaXN0ZXIgdHVubmVsXG4iKTsKLQkJcmV0dXJuIC1FQUdBSU47CisJaWYgKHhmcm02X3R1bm5lbF9yZWdpc3RlcigmaXA0aXA2X2hhbmRsZXIsIEFGX0lORVQpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaXA2X3R1bm5lbCBpbml0OiBjYW4ndCByZWdpc3RlciBpcDRpcDZcbiIpOworCQllcnIgPSAtRUFHQUlOOworCQlnb3RvIG91dDsKIAl9Ci0JaXA2aXA2X2ZiX3RubF9kZXYgPSBhbGxvY19uZXRkZXYoc2l6ZW9mKHN0cnVjdCBpcDZfdG5sKSwgImlwNnRubDAiLAotCQkJCQkgaXA2aXA2X3RubF9kZXZfc2V0dXApOwogCi0JaWYgKCFpcDZpcDZfZmJfdG5sX2RldikgeworCWlmICh4ZnJtNl90dW5uZWxfcmVnaXN0ZXIoJmlwNmlwNl9oYW5kbGVyLCBBRl9JTkVUNikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpcDZfdHVubmVsIGluaXQ6IGNhbid0IHJlZ2lzdGVyIGlwNmlwNlxuIik7CisJCWVyciA9IC1FQUdBSU47CisJCWdvdG8gdW5yZWdfaXA0aXA2OworCX0KKwlpcDZfZmJfdG5sX2RldiA9IGFsbG9jX25ldGRldihzaXplb2Yoc3RydWN0IGlwNl90bmwpLCAiaXA2dG5sMCIsCisJCQkJICAgICAgaXA2X3RubF9kZXZfc2V0dXApOworCisJaWYgKCFpcDZfZmJfdG5sX2RldikgewogCQllcnIgPSAtRU5PTUVNOwogCQlnb3RvIGZhaWw7CiAJfQotCWlwNmlwNl9mYl90bmxfZGV2LT5pbml0ID0gaXA2aXA2X2ZiX3RubF9kZXZfaW5pdDsKKwlpcDZfZmJfdG5sX2Rldi0+aW5pdCA9IGlwNl9mYl90bmxfZGV2X2luaXQ7CiAKLQlpZiAoKGVyciA9IHJlZ2lzdGVyX25ldGRldihpcDZpcDZfZmJfdG5sX2RldikpKSB7Ci0JCWZyZWVfbmV0ZGV2KGlwNmlwNl9mYl90bmxfZGV2KTsKKwlpZiAoKGVyciA9IHJlZ2lzdGVyX25ldGRldihpcDZfZmJfdG5sX2RldikpKSB7CisJCWZyZWVfbmV0ZGV2KGlwNl9mYl90bmxfZGV2KTsKIAkJZ290byBmYWlsOwogCX0KIAlyZXR1cm4gMDsKIGZhaWw6CiAJeGZybTZfdHVubmVsX2RlcmVnaXN0ZXIoJmlwNmlwNl9oYW5kbGVyLCBBRl9JTkVUNik7Cit1bnJlZ19pcDRpcDY6CisJeGZybTZfdHVubmVsX2RlcmVnaXN0ZXIoJmlwNGlwNl9oYW5kbGVyLCBBRl9JTkVUKTsKK291dDoKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgdm9pZCBfX2V4aXQgaXA2aXA2X2Rlc3Ryb3lfdHVubmVscyh2b2lkKQorc3RhdGljIHZvaWQgX19leGl0IGlwNl90bmxfZGVzdHJveV90dW5uZWxzKHZvaWQpCiB7CiAJaW50IGg7CiAJc3RydWN0IGlwNl90bmwgKnQ7CkBAIC0xMTY4LDExICsxNDUwLDE0IEBACiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBpcDZfdHVubmVsX2NsZWFudXAodm9pZCkKIHsKKwlpZiAoeGZybTZfdHVubmVsX2RlcmVnaXN0ZXIoJmlwNGlwNl9oYW5kbGVyLCBBRl9JTkVUKSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiaXA2X3R1bm5lbCBjbG9zZTogY2FuJ3QgZGVyZWdpc3RlciBpcDRpcDZcbiIpOworCiAJaWYgKHhmcm02X3R1bm5lbF9kZXJlZ2lzdGVyKCZpcDZpcDZfaGFuZGxlciwgQUZfSU5FVDYpKQotCQlwcmludGsoS0VSTl9JTkZPICJpcDZpcDYgY2xvc2U6IGNhbid0IGRlcmVnaXN0ZXIgdHVubmVsXG4iKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiaXA2X3R1bm5lbCBjbG9zZTogY2FuJ3QgZGVyZWdpc3RlciBpcDZpcDZcbiIpOwogCiAJcnRubF9sb2NrKCk7Ci0JaXA2aXA2X2Rlc3Ryb3lfdHVubmVscygpOworCWlwNl90bmxfZGVzdHJveV90dW5uZWxzKCk7CiAJcnRubF91bmxvY2soKTsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvaXBjb21wNi5jIGIvbmV0L2lwdjYvaXBjb21wNi5jCmluZGV4IDU3MjRiYTkuLjFlZTUwYjUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2lwY29tcDYuYworKysgYi9uZXQvaXB2Ni9pcGNvbXA2LmMKQEAgLTc5LDkgKzc5LDkgQEAKIAlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CiAKIAkvKiBSZW1vdmUgaXBjb21wIGhlYWRlciBhbmQgZGVjb21wcmVzcyBvcmlnaW5hbCBwYXlsb2FkICovCi0JaXBoID0gc2tiLT5uaC5pcHY2aDsKKwlpcGggPSBpcHY2X2hkcihza2IpOwogCWlwY2ggPSAodm9pZCAqKXNrYi0+ZGF0YTsKLQlza2ItPmgucmF3ID0gc2tiLT5uaC5yYXcgKyBzaXplb2YoKmlwY2gpOworCXNrYi0+dHJhbnNwb3J0X2hlYWRlciA9IHNrYi0+bmV0d29ya19oZWFkZXIgKyBzaXplb2YoKmlwY2gpOwogCV9fc2tiX3B1bGwoc2tiLCBzaXplb2YoKmlwY2gpKTsKIAogCS8qIGRlY29tcHJlc3Npb24gKi8KQEAgLTExMSw3ICsxMTEsNyBAQAogCiAJc2tiLT50cnVlc2l6ZSArPSBkbGVuIC0gcGxlbjsKIAlfX3NrYl9wdXQoc2tiLCBkbGVuIC0gcGxlbik7Ci0JbWVtY3B5KHNrYi0+ZGF0YSwgc2NyYXRjaCwgZGxlbik7CisJc2tiX2NvcHlfdG9fbGluZWFyX2RhdGEoc2tiLCBzY3JhdGNoLCBkbGVuKTsKIAllcnIgPSBpcGNoLT5uZXh0aGRyOwogCiBvdXRfcHV0X2NwdToKQEAgLTEyNCwxNSArMTI0LDEzIEBACiB7CiAJaW50IGVycjsKIAlzdHJ1Y3QgaXB2NmhkciAqdG9wX2lwaDsKLQlpbnQgaGRyX2xlbjsKIAlzdHJ1Y3QgaXB2Nl9jb21wX2hkciAqaXBjaDsKIAlzdHJ1Y3QgaXBjb21wX2RhdGEgKmlwY2QgPSB4LT5kYXRhOwogCWludCBwbGVuLCBkbGVuOwogCXU4ICpzdGFydCwgKnNjcmF0Y2g7CiAJc3RydWN0IGNyeXB0b19jb21wICp0Zm07CiAJaW50IGNwdTsKLQotCWhkcl9sZW4gPSBza2ItPmgucmF3IC0gc2tiLT5kYXRhOworCWludCBoZHJfbGVuID0gc2tiX3RyYW5zcG9ydF9vZmZzZXQoc2tiKTsKIAogCS8qIGNoZWNrIHdoZXRoZXIgZGF0YWdyYW0gbGVuIGlzIGxhcmdlciB0aGFuIHRocmVzaG9sZCAqLwogCWlmICgoc2tiLT5sZW4gLSBoZHJfbGVuKSA8IGlwY2QtPnRocmVzaG9sZCkgewpAQCAtMTQ1LDcgKzE0Myw3IEBACiAJLyogY29tcHJlc3Npb24gKi8KIAlwbGVuID0gc2tiLT5sZW4gLSBoZHJfbGVuOwogCWRsZW4gPSBJUENPTVBfU0NSQVRDSF9TSVpFOwotCXN0YXJ0ID0gc2tiLT5oLnJhdzsKKwlzdGFydCA9IHNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYik7CiAKIAljcHUgPSBnZXRfY3B1KCk7CiAJc2NyYXRjaCA9ICpwZXJfY3B1X3B0cihpcGNvbXA2X3NjcmF0Y2hlcywgY3B1KTsKQEAgLTE2NiwxMCArMTY0LDEwIEBACiAJdG9wX2lwaC0+cGF5bG9hZF9sZW4gPSBodG9ucyhza2ItPmxlbiAtIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikpOwogCiAJaXBjaCA9IChzdHJ1Y3QgaXB2Nl9jb21wX2hkciAqKXN0YXJ0OwotCWlwY2gtPm5leHRoZHIgPSAqc2tiLT5uaC5yYXc7CisJaXBjaC0+bmV4dGhkciA9ICpza2JfbmV0d29ya19oZWFkZXIoc2tiKTsKIAlpcGNoLT5mbGFncyA9IDA7CiAJaXBjaC0+Y3BpID0gaHRvbnMoKHUxNiApbnRvaGwoeC0+aWQuc3BpKSk7Ci0JKnNrYi0+bmgucmF3ID0gSVBQUk9UT19DT01QOworCSpza2JfbmV0d29ya19oZWFkZXIoc2tiKSA9IElQUFJPVE9fQ09NUDsKIAogb3V0X29rOgogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvaXB2Nl9zb2NrZ2x1ZS5jIGIvbmV0L2lwdjYvaXB2Nl9zb2NrZ2x1ZS5jCmluZGV4IGY1Zjk1ODIuLmFhM2QwN2MgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2lwdjZfc29ja2dsdWUuYworKysgYi9uZXQvaXB2Ni9pcHY2X3NvY2tnbHVlLmMKQEAgLTEwMSwxNCArMTAxLDE0IEBACiAJaWYgKHVubGlrZWx5KCFwc2tiX21heV9wdWxsKHNrYiwgc2l6ZW9mKCppcHY2aCkpKSkKIAkJZ290byBvdXQ7CiAKLQlpcHY2aCA9IHNrYi0+bmguaXB2Nmg7CisJaXB2NmggPSBpcHY2X2hkcihza2IpOwogCV9fc2tiX3B1bGwoc2tiLCBzaXplb2YoKmlwdjZoKSk7CiAJZXJyID0gLUVQUk9UT05PU1VQUE9SVDsKIAogCXJjdV9yZWFkX2xvY2soKTsKIAlvcHMgPSBpcHY2X2dzb19wdWxsX2V4dGhkcnMoc2tiLCBpcHY2aC0+bmV4dGhkcik7CiAJaWYgKGxpa2VseShvcHMgJiYgb3BzLT5nc29fc2VuZF9jaGVjaykpIHsKLQkJc2tiLT5oLnJhdyA9IHNrYi0+ZGF0YTsKKwkJc2tiX3Jlc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKIAkJZXJyID0gb3BzLT5nc29fc2VuZF9jaGVjayhza2IpOwogCX0KIAlyY3VfcmVhZF91bmxvY2soKTsKQEAgLTEzNywxNCArMTM3LDE0IEBACiAJaWYgKHVubGlrZWx5KCFwc2tiX21heV9wdWxsKHNrYiwgc2l6ZW9mKCppcHY2aCkpKSkKIAkJZ290byBvdXQ7CiAKLQlpcHY2aCA9IHNrYi0+bmguaXB2Nmg7CisJaXB2NmggPSBpcHY2X2hkcihza2IpOwogCV9fc2tiX3B1bGwoc2tiLCBzaXplb2YoKmlwdjZoKSk7CiAJc2VncyA9IEVSUl9QVFIoLUVQUk9UT05PU1VQUE9SVCk7CiAKIAlyY3VfcmVhZF9sb2NrKCk7CiAJb3BzID0gaXB2Nl9nc29fcHVsbF9leHRoZHJzKHNrYiwgaXB2NmgtPm5leHRoZHIpOwogCWlmIChsaWtlbHkob3BzICYmIG9wcy0+Z3NvX3NlZ21lbnQpKSB7Ci0JCXNrYi0+aC5yYXcgPSBza2ItPmRhdGE7CisJCXNrYl9yZXNldF90cmFuc3BvcnRfaGVhZGVyKHNrYik7CiAJCXNlZ3MgPSBvcHMtPmdzb19zZWdtZW50KHNrYiwgZmVhdHVyZXMpOwogCX0KIAlyY3VfcmVhZF91bmxvY2soKTsKQEAgLTE1Myw3ICsxNTMsNyBAQAogCQlnb3RvIG91dDsKIAogCWZvciAoc2tiID0gc2Vnczsgc2tiOyBza2IgPSBza2ItPm5leHQpIHsKLQkJaXB2NmggPSBza2ItPm5oLmlwdjZoOworCQlpcHY2aCA9IGlwdjZfaGRyKHNrYik7CiAJCWlwdjZoLT5wYXlsb2FkX2xlbiA9IGh0b25zKHNrYi0+bGVuIC0gc2tiLT5tYWNfbGVuIC0KIAkJCQkJICAgc2l6ZW9mKCppcHY2aCkpOwogCX0KQEAgLTY5NCw3ICs2OTQsNyBAQAogCQlyZXR2ID0gaXA2X3JhX2NvbnRyb2woc2ssIHZhbCwgTlVMTCk7CiAJCWJyZWFrOwogCWNhc2UgSVBWNl9NVFVfRElTQ09WRVI6Ci0JCWlmICh2YWw8MCB8fCB2YWw+MikKKwkJaWYgKHZhbDwwIHx8IHZhbD4zKQogCQkJZ290byBlX2ludmFsOwogCQlucC0+cG10dWRpc2MgPSB2YWw7CiAJCXJldHYgPSAwOwpAQCAtNzYxLDYgKzc2MSw3IEBACiAJcmV0dXJuIGVycjsKIH0KIAorRVhQT1JUX1NZTUJPTChpcHY2X3NldHNvY2tvcHQpOwogCiAjaWZkZWYgQ09ORklHX0NPTVBBVAogaW50IGNvbXBhdF9pcHY2X3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLApAQCAtNzk2LDE4ICs3OTcsMzcgQEAKICNlbmRpZgogCiBzdGF0aWMgaW50IGlwdjZfZ2V0c29ja29wdF9zdGlja3koc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgaXB2Nl90eG9wdGlvbnMgKm9wdCwKLQkJCQkgIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBsZW4pCisJCQkJICBpbnQgb3B0bmFtZSwgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IGxlbikKIHsKIAlzdHJ1Y3QgaXB2Nl9vcHRfaGRyICpoZHI7CiAKLQlpZiAoIW9wdCB8fCAhb3B0LT5ob3BvcHQpCisJaWYgKCFvcHQpCiAJCXJldHVybiAwOwotCWhkciA9IG9wdC0+aG9wb3B0OworCisJc3dpdGNoKG9wdG5hbWUpIHsKKwljYXNlIElQVjZfSE9QT1BUUzoKKwkJaGRyID0gb3B0LT5ob3BvcHQ7CisJCWJyZWFrOworCWNhc2UgSVBWNl9SVEhEUkRTVE9QVFM6CisJCWhkciA9IG9wdC0+ZHN0MG9wdDsKKwkJYnJlYWs7CisJY2FzZSBJUFY2X1JUSERSOgorCQloZHIgPSAoc3RydWN0IGlwdjZfb3B0X2hkciAqKW9wdC0+c3JjcnQ7CisJCWJyZWFrOworCWNhc2UgSVBWNl9EU1RPUFRTOgorCQloZHIgPSBvcHQtPmRzdDFvcHQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOwkvKiBzaG91bGQgbm90IGhhcHBlbiAqLworCX0KKworCWlmICghaGRyKQorCQlyZXR1cm4gMDsKIAogCWxlbiA9IG1pbl90KHVuc2lnbmVkIGludCwgbGVuLCBpcHY2X29wdGxlbihoZHIpKTsKLQlpZiAoY29weV90b191c2VyKG9wdHZhbCwgaGRyLCBpcHY2X29wdGxlbihoZHIpKSkKKwlpZiAoY29weV90b191c2VyKG9wdHZhbCwgaGRyLCBsZW4pKTsKIAkJcmV0dXJuIC1FRkFVTFQ7Ci0JcmV0dXJuIGxlbjsKKwlyZXR1cm4gaXB2Nl9vcHRsZW4oaGRyKTsKIH0KIAogc3RhdGljIGludCBkb19pcHY2X2dldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLApAQCAtOTQ1LDcgKzk2NSw3IEBACiAKIAkJbG9ja19zb2NrKHNrKTsKIAkJbGVuID0gaXB2Nl9nZXRzb2Nrb3B0X3N0aWNreShzaywgbnAtPm9wdCwKLQkJCQkJICAgICBvcHR2YWwsIGxlbik7CisJCQkJCSAgICAgb3B0bmFtZSwgb3B0dmFsLCBsZW4pOwogCQlyZWxlYXNlX3NvY2soc2spOwogCQlyZXR1cm4gcHV0X3VzZXIobGVuLCBvcHRsZW4pOwogCX0KQEAgLTEwNjYsNiArMTA4Niw4IEBACiAJcmV0dXJuIGVycjsKIH0KIAorRVhQT1JUX1NZTUJPTChpcHY2X2dldHNvY2tvcHQpOworCiAjaWZkZWYgQ09ORklHX0NPTVBBVAogaW50IGNvbXBhdF9pcHY2X2dldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAogCQkJICAgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IF9fdXNlciAqb3B0bGVuKQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvaXB2Nl9zeW1zLmMgYi9uZXQvaXB2Ni9pcHY2X3N5bXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTEyZTNkNC4uMDAwMDAwMAotLS0gYS9uZXQvaXB2Ni9pcHY2X3N5bXMuYworKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPG5ldC9wcm90b2NvbC5oPgotI2luY2x1ZGUgPG5ldC9pcHY2Lmg+Ci0jaW5jbHVkZSA8bmV0L2FkZHJjb25mLmg+Ci0jaW5jbHVkZSA8bmV0L2lwNl9yb3V0ZS5oPgotI2luY2x1ZGUgPG5ldC94ZnJtLmg+Ci0KLUVYUE9SVF9TWU1CT0woaWNtcHY2X3NlbmQpOwotRVhQT1JUX1NZTUJPTChpY21wdjZfc3RhdGlzdGljcyk7Ci1FWFBPUlRfU1lNQk9MKGljbXB2Nl9lcnJfY29udmVydCk7Ci1FWFBPUlRfU1lNQk9MKG5kaXNjX21jX21hcCk7Ci1FWFBPUlRfU1lNQk9MKHJlZ2lzdGVyX2luZXQ2YWRkcl9ub3RpZmllcik7Ci1FWFBPUlRfU1lNQk9MKHVucmVnaXN0ZXJfaW5ldDZhZGRyX25vdGlmaWVyKTsKLUVYUE9SVF9TWU1CT0woaXA2X3JvdXRlX291dHB1dCk7Ci1FWFBPUlRfU1lNQk9MKGlwdjZfc2V0c29ja29wdCk7Ci1FWFBPUlRfU1lNQk9MKGlwdjZfZ2V0c29ja29wdCk7Ci1FWFBPUlRfU1lNQk9MKGluZXQ2X3JlZ2lzdGVyX3Byb3Rvc3cpOwotRVhQT1JUX1NZTUJPTChpbmV0Nl91bnJlZ2lzdGVyX3Byb3Rvc3cpOwotRVhQT1JUX1NZTUJPTChpbmV0Nl9hZGRfcHJvdG9jb2wpOwotRVhQT1JUX1NZTUJPTChpbmV0Nl9kZWxfcHJvdG9jb2wpOwotRVhQT1JUX1NZTUJPTChpcDZfeG1pdCk7Ci1FWFBPUlRfU1lNQk9MKGluZXQ2X3JlbGVhc2UpOwotRVhQT1JUX1NZTUJPTChpbmV0Nl9iaW5kKTsKLUVYUE9SVF9TWU1CT0woaW5ldDZfZ2V0bmFtZSk7Ci1FWFBPUlRfU1lNQk9MKGluZXQ2X2lvY3RsKTsKLUVYUE9SVF9TWU1CT0woaXB2Nl9nZXRfc2FkZHIpOwotRVhQT1JUX1NZTUJPTChpcHY2X2Noa19hZGRyKTsKLUVYUE9SVF9TWU1CT0woaW42X2Rldl9maW5pc2hfZGVzdHJveSk7Ci0jaWZkZWYgQ09ORklHX1hGUk0KLUVYUE9SVF9TWU1CT0woeGZybTZfcmN2KTsKLUVYUE9SVF9TWU1CT0woeGZybTZfaW5wdXRfYWRkcik7Ci1FWFBPUlRfU1lNQk9MKHhmcm02X2ZpbmRfMXN0ZnJhZ29wdCk7Ci0jZW5kaWYKLUVYUE9SVF9TWU1CT0wocnQ2X2xvb2t1cCk7Ci1FWFBPUlRfU1lNQk9MKGlwdjZfcHVzaF9uZnJhZ19vcHRzKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L21jYXN0LmMgYi9uZXQvaXB2Ni9tY2FzdC5jCmluZGV4IGE4ZDY2MjUuLjZjMjc1ODkgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L21jYXN0LmMKKysrIGIvbmV0L2lwdjYvbWNhc3QuYwpAQCAtOTg4LDcgKzk4OCw3IEBACiAJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCBpY21wNmhkcikpKQogCQlyZXR1cm4gMDsKIAotCXBpYyA9IChzdHJ1Y3QgaWNtcDZoZHIgKilza2ItPmgucmF3OworCXBpYyA9IGljbXA2X2hkcihza2IpOwogCiAJc3dpdGNoIChwaWMtPmljbXA2X3R5cGUpIHsKIAljYXNlIElDTVBWNl9NR01fUVVFUlk6CkBAIC0xMTY3LDExICsxMTY3LDExIEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJLyogY29tcHV0ZSBwYXlsb2FkIGxlbmd0aCBleGNsdWRpbmcgZXh0ZW5zaW9uIGhlYWRlcnMgKi8KLQlsZW4gPSBudG9ocyhza2ItPm5oLmlwdjZoLT5wYXlsb2FkX2xlbikgKyBzaXplb2Yoc3RydWN0IGlwdjZoZHIpOwotCWxlbiAtPSAoY2hhciAqKXNrYi0+aC5yYXcgLSAoY2hhciAqKXNrYi0+bmguaXB2Nmg7CisJbGVuID0gbnRvaHMoaXB2Nl9oZHIoc2tiKS0+cGF5bG9hZF9sZW4pICsgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKTsKKwlsZW4gLT0gc2tiX25ldHdvcmtfaGVhZGVyX2xlbihza2IpOwogCiAJLyogRHJvcCBxdWVyaWVzIHdpdGggbm90IGxpbmsgbG9jYWwgc291cmNlICovCi0JaWYgKCEoaXB2Nl9hZGRyX3R5cGUoJnNrYi0+bmguaXB2NmgtPnNhZGRyKSZJUFY2X0FERFJfTElOS0xPQ0FMKSkKKwlpZiAoIShpcHY2X2FkZHJfdHlwZSgmaXB2Nl9oZHIoc2tiKS0+c2FkZHIpICYgSVBWNl9BRERSX0xJTktMT0NBTCkpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWRldiA9IGluNl9kZXZfZ2V0KHNrYi0+ZGV2KTsKQEAgLTExNzksNyArMTE3OSw3IEBACiAJaWYgKGlkZXYgPT0gTlVMTCkKIAkJcmV0dXJuIDA7CiAKLQloZHIgPSAoc3RydWN0IGljbXA2aGRyICopIHNrYi0+aC5yYXc7CisJaGRyID0gaWNtcDZfaGRyKHNrYik7CiAJZ3JvdXAgPSAoc3RydWN0IGluNl9hZGRyICopIChoZHIgKyAxKTsKIAlncm91cF90eXBlID0gaXB2Nl9hZGRyX3R5cGUoZ3JvdXApOwogCkBAIC0xMjEyLDcgKzEyMTIsNyBAQAogCQkJaW42X2Rldl9wdXQoaWRldik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQotCQltbGgyID0gKHN0cnVjdCBtbGQyX3F1ZXJ5ICopIHNrYi0+aC5yYXc7CisJCW1saDIgPSAoc3RydWN0IG1sZDJfcXVlcnkgKilza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpOwogCQltYXhfZGVsYXkgPSAoTUxEVjJfTVJDKG50b2hzKG1saDItPm1yYykpKkhaKS8xMDAwOwogCQlpZiAoIW1heF9kZWxheSkKIAkJCW1heF9kZWxheSA9IDE7CkBAIC0xMjM1LDcgKzEyMzUsNyBAQAogCQkJCWluNl9kZXZfcHV0KGlkZXYpOwogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQotCQkJbWxoMiA9IChzdHJ1Y3QgbWxkMl9xdWVyeSAqKSBza2ItPmgucmF3OworCQkJbWxoMiA9IChzdHJ1Y3QgbWxkMl9xdWVyeSAqKXNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYik7CiAJCQltYXJrID0gMTsKIAkJfQogCX0gZWxzZSB7CkBAIC0xMzAwLDEwICsxMzAwLDEwIEBACiAJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWhkciA9IChzdHJ1Y3QgaWNtcDZoZHIqKSBza2ItPmgucmF3OworCWhkciA9IGljbXA2X2hkcihza2IpOwogCiAJLyogRHJvcCByZXBvcnRzIHdpdGggbm90IGxpbmsgbG9jYWwgc291cmNlICovCi0JYWRkcl90eXBlID0gaXB2Nl9hZGRyX3R5cGUoJnNrYi0+bmguaXB2NmgtPnNhZGRyKTsKKwlhZGRyX3R5cGUgPSBpcHY2X2FkZHJfdHlwZSgmaXB2Nl9oZHIoc2tiKS0+c2FkZHIpOwogCWlmIChhZGRyX3R5cGUgIT0gSVBWNl9BRERSX0FOWSAmJgogCSAgICAhKGFkZHJfdHlwZSZJUFY2X0FERFJfTElOS0xPQ0FMKSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xNDExLDcgKzE0MTEsNyBAQAogCiAJc2tiX3Jlc2VydmUoc2tiLCBMTF9SRVNFUlZFRF9TUEFDRShkZXYpKTsKIAotCWlmIChpcHY2X2dldF9sbGFkZHIoZGV2LCAmYWRkcl9idWYpKSB7CisJaWYgKGlwdjZfZ2V0X2xsYWRkcihkZXYsICZhZGRyX2J1ZiwgSUZBX0ZfVEVOVEFUSVZFKSkgewogCQkvKiA8ZHJhZnQtaWV0Zi1tYWdtYS1tbGQtc291cmNlLTA1LnR4dD46CiAJCSAqIHVzZSB1bnNwZWNpZmllZCBhZGRyZXNzIGFzIHRoZSBzb3VyY2UgYWRkcmVzcwogCQkgKiB3aGVuIGEgdmFsaWQgbGluay1sb2NhbCBhZGRyZXNzIGlzIG5vdCBhdmFpbGFibGUuCkBAIC0xNDIzLDggKzE0MjMsOSBAQAogCiAJbWVtY3B5KHNrYl9wdXQoc2tiLCBzaXplb2YocmEpKSwgcmEsIHNpemVvZihyYSkpOwogCi0JcG1yID0oc3RydWN0IG1sZDJfcmVwb3J0ICopc2tiX3B1dChza2IsIHNpemVvZigqcG1yKSk7Ci0Jc2tiLT5oLnJhdyA9ICh1bnNpZ25lZCBjaGFyICopcG1yOworCXNrYl9zZXRfdHJhbnNwb3J0X2hlYWRlcihza2IsIHNrYl90YWlsX3BvaW50ZXIoc2tiKSAtIHNrYi0+ZGF0YSk7CisJc2tiX3B1dChza2IsIHNpemVvZigqcG1yKSk7CisJcG1yID0gKHN0cnVjdCBtbGQyX3JlcG9ydCAqKXNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYik7CiAJcG1yLT50eXBlID0gSUNNUFY2X01MRDJfUkVQT1JUOwogCXBtci0+cmVzdjEgPSAwOwogCXBtci0+Y3N1bSA9IDA7CkBAIC0xNDQxLDcgKzE0NDIsNyBAQAogCQl1bnNpZ25lZCBjaGFyIGhhW01BWF9BRERSX0xFTl07CiAJCWludCBlcnI7CiAKLQkJbmRpc2NfbWNfbWFwKCZza2ItPm5oLmlwdjZoLT5kYWRkciwgaGEsIGRldiwgMSk7CisJCW5kaXNjX21jX21hcCgmaXB2Nl9oZHIoc2tiKS0+ZGFkZHIsIGhhLCBkZXYsIDEpOwogCQllcnIgPSBkZXYtPmhhcmRfaGVhZGVyKHNrYiwgZGV2LCBFVEhfUF9JUFY2LCBoYSwgTlVMTCwgc2tiLT5sZW4pOwogCQlpZiAoZXJyIDwgMCkgewogCQkJa2ZyZWVfc2tiKHNrYik7CkBAIC0xNDU5LDIwICsxNDYwLDIxIEBACiAKIHN0YXRpYyB2b2lkIG1sZF9zZW5kcGFjayhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXN0cnVjdCBpcHY2aGRyICpwaXA2ID0gc2tiLT5uaC5pcHY2aDsKLQlzdHJ1Y3QgbWxkMl9yZXBvcnQgKnBtciA9IChzdHJ1Y3QgbWxkMl9yZXBvcnQgKilza2ItPmgucmF3OworCXN0cnVjdCBpcHY2aGRyICpwaXA2ID0gaXB2Nl9oZHIoc2tiKTsKKwlzdHJ1Y3QgbWxkMl9yZXBvcnQgKnBtciA9CisJCQkgICAgICAoc3RydWN0IG1sZDJfcmVwb3J0ICopc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKIAlpbnQgcGF5bG9hZF9sZW4sIG1sZGxlbjsKIAlzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2ID0gaW42X2Rldl9nZXQoc2tiLT5kZXYpOwogCWludCBlcnI7CiAKIAlJUDZfSU5DX1NUQVRTKGlkZXYsIElQU1RBVFNfTUlCX09VVFJFUVVFU1RTKTsKLQlwYXlsb2FkX2xlbiA9IHNrYi0+dGFpbCAtICh1bnNpZ25lZCBjaGFyICopc2tiLT5uaC5pcHY2aCAtCi0JCXNpemVvZihzdHJ1Y3QgaXB2Nmhkcik7Ci0JbWxkbGVuID0gc2tiLT50YWlsIC0gc2tiLT5oLnJhdzsKKwlwYXlsb2FkX2xlbiA9IChza2ItPnRhaWwgLSBza2ItPm5ldHdvcmtfaGVhZGVyKSAtIHNpemVvZigqcGlwNik7CisJbWxkbGVuID0gc2tiLT50YWlsIC0gc2tiLT50cmFuc3BvcnRfaGVhZGVyOwogCXBpcDYtPnBheWxvYWRfbGVuID0gaHRvbnMocGF5bG9hZF9sZW4pOwogCiAJcG1yLT5jc3VtID0gY3N1bV9pcHY2X21hZ2ljKCZwaXA2LT5zYWRkciwgJnBpcDYtPmRhZGRyLCBtbGRsZW4sCi0JCUlQUFJPVE9fSUNNUFY2LCBjc3VtX3BhcnRpYWwoc2tiLT5oLnJhdywgbWxkbGVuLCAwKSk7CisJCUlQUFJPVE9fSUNNUFY2LCBjc3VtX3BhcnRpYWwoc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKSwKKwkJCQkJICAgICBtbGRsZW4sIDApKTsKIAllcnIgPSBORl9IT09LKFBGX0lORVQ2LCBORl9JUDZfTE9DQUxfT1VULCBza2IsIE5VTEwsIHNrYi0+ZGV2LAogCQltbGRfZGV2X3F1ZXVlX3htaXQpOwogCWlmICghZXJyKSB7CkBAIC0xNTA2LDcgKzE1MDgsNyBAQAogCXBnci0+Z3JlY19hdXh3b3JkcyA9IDA7CiAJcGdyLT5ncmVjX25zcmNzID0gMDsKIAlwZ3ItPmdyZWNfbWNhID0gcG1jLT5tY2FfYWRkcjsJLyogc3RydWN0dXJlIGNvcHkgKi8KLQlwbXIgPSAoc3RydWN0IG1sZDJfcmVwb3J0ICopc2tiLT5oLnJhdzsKKwlwbXIgPSAoc3RydWN0IG1sZDJfcmVwb3J0ICopc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKIAlwbXItPm5ncmVjID0gaHRvbnMobnRvaHMocG1yLT5uZ3JlYykrMSk7CiAJKnBwZ3IgPSBwZ3I7CiAJcmV0dXJuIHNrYjsKQEAgLTE1MzksNyArMTU0MSw3IEBACiAJaWYgKCEqcHNmX2xpc3QpCiAJCWdvdG8gZW1wdHlfc291cmNlOwogCi0JcG1yID0gc2tiID8gKHN0cnVjdCBtbGQyX3JlcG9ydCAqKXNrYi0+aC5yYXcgOiBOVUxMOworCXBtciA9IHNrYiA/IChzdHJ1Y3QgbWxkMl9yZXBvcnQgKilza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpIDogTlVMTDsKIAogCS8qIEVYIGFuZCBUT19FWCBnZXQgYSBmcmVzaCBwYWNrZXQsIGlmIG5lZWRlZCAqLwogCWlmICh0cnVuY2F0ZSkgewpAQCAtMTc5MSw3ICsxNzkzLDcgQEAKIAogCXNrYl9yZXNlcnZlKHNrYiwgTExfUkVTRVJWRURfU1BBQ0UoZGV2KSk7CiAKLQlpZiAoaXB2Nl9nZXRfbGxhZGRyKGRldiwgJmFkZHJfYnVmKSkgeworCWlmIChpcHY2X2dldF9sbGFkZHIoZGV2LCAmYWRkcl9idWYsIElGQV9GX1RFTlRBVElWRSkpIHsKIAkJLyogPGRyYWZ0LWlldGYtbWFnbWEtbWxkLXNvdXJjZS0wNS50eHQ+OgogCQkgKiB1c2UgdW5zcGVjaWZpZWQgYWRkcmVzcyBhcyB0aGUgc291cmNlIGFkZHJlc3MKIAkJICogd2hlbiBhIHZhbGlkIGxpbmstbG9jYWwgYWRkcmVzcyBpcyBub3QgYXZhaWxhYmxlLgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbWlwNi5jIGIvbmV0L2lwdjYvbWlwNi5jCmluZGV4IDBhZmNhYmQuLjEzYjcxNjAgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L21pcDYuYworKysgYi9uZXQvaXB2Ni9taXA2LmMKQEAgLTkwLDIzICs5MCwyNiBAQAogewogCXN0cnVjdCBpcDZfbWggKm1oOwogCi0JaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgKHNrYi0+aC5yYXcgLSBza2ItPmRhdGEpICsgOCkgfHwKLQkgICAgIXBza2JfbWF5X3B1bGwoc2tiLCAoc2tiLT5oLnJhdyAtIHNrYi0+ZGF0YSkgKyAoKHNrYi0+aC5yYXdbMV0gKyAxKSA8PCAzKSkpCisJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgKHNrYl90cmFuc3BvcnRfb2Zmc2V0KHNrYikpICsgOCkgfHwKKwkgICAgIXBza2JfbWF5X3B1bGwoc2tiLCAoc2tiX3RyYW5zcG9ydF9vZmZzZXQoc2tiKSArCisJCQkJICgoc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKVsxXSArIDEpIDw8IDMpKSkpCiAJCXJldHVybiAtMTsKIAotCW1oID0gKHN0cnVjdCBpcDZfbWggKilza2ItPmgucmF3OworCW1oID0gKHN0cnVjdCBpcDZfbWggKilza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpOwogCiAJaWYgKG1oLT5pcDZtaF9oZHJsZW4gPCBtaXA2X21oX2xlbihtaC0+aXA2bWhfdHlwZSkpIHsKIAkJTElNSVRfTkVUREVCVUcoS0VSTl9ERUJVRyAibWlwNjogTUggbWVzc2FnZSB0b28gc2hvcnQ6ICVkIHZzID49JWRcbiIsCiAJCQkgICAgICAgbWgtPmlwNm1oX2hkcmxlbiwgbWlwNl9taF9sZW4obWgtPmlwNm1oX3R5cGUpKTsKLQkJbWlwNl9wYXJhbV9wcm9iKHNrYiwgMCwgKCZtaC0+aXA2bWhfaGRybGVuKSAtIHNrYi0+bmgucmF3KTsKKwkJbWlwNl9wYXJhbV9wcm9iKHNrYiwgMCwgKCgmbWgtPmlwNm1oX2hkcmxlbikgLQorCQkJCQkgc2tiX25ldHdvcmtfaGVhZGVyKHNrYikpKTsKIAkJcmV0dXJuIC0xOwogCX0KIAogCWlmIChtaC0+aXA2bWhfcHJvdG8gIT0gSVBQUk9UT19OT05FKSB7CiAJCUxJTUlUX05FVERFQlVHKEtFUk5fREVCVUcgIm1pcDY6IE1IIGludmFsaWQgcGF5bG9hZCBwcm90byA9ICVkXG4iLAogCQkJICAgICAgIG1oLT5pcDZtaF9wcm90byk7Ci0JCW1pcDZfcGFyYW1fcHJvYihza2IsIDAsICgmbWgtPmlwNm1oX3Byb3RvKSAtIHNrYi0+bmgucmF3KTsKKwkJbWlwNl9wYXJhbV9wcm9iKHNrYiwgMCwgKCgmbWgtPmlwNm1oX3Byb3RvKSAtCisJCQkJCSBza2JfbmV0d29ya19oZWFkZXIoc2tiKSkpOwogCQlyZXR1cm4gLTE7CiAJfQogCkBAIC0xMjIsMTIgKzEyNSwxMiBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBtaXA2X3JlcG9ydF9yYXRlX2xpbWl0ZXIgbWlwNl9yZXBvcnRfcmwgPSB7Ci0JLmxvY2sgPSBTUElOX0xPQ0tfVU5MT0NLRUQKKwkubG9jayA9IF9fU1BJTl9MT0NLX1VOTE9DS0VEKG1pcDZfcmVwb3J0X3JsLmxvY2spCiB9OwogCiBzdGF0aWMgaW50IG1pcDZfZGVzdG9wdF9pbnB1dChzdHJ1Y3QgeGZybV9zdGF0ZSAqeCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlzdHJ1Y3QgaXB2NmhkciAqaXBoID0gc2tiLT5uaC5pcHY2aDsKKwlzdHJ1Y3QgaXB2NmhkciAqaXBoID0gaXB2Nl9oZHIoc2tiKTsKIAlzdHJ1Y3QgaXB2Nl9kZXN0b3B0X2hkciAqZGVzdG9wdCA9IChzdHJ1Y3QgaXB2Nl9kZXN0b3B0X2hkciAqKXNrYi0+ZGF0YTsKIAogCWlmICghaXB2Nl9hZGRyX2VxdWFsKCZpcGgtPnNhZGRyLCAoc3RydWN0IGluNl9hZGRyICopeC0+Y29hZGRyKSAmJgpAQCAtMTUyLDEwICsxNTUsMTAgQEAKIAlpcGggPSAoc3RydWN0IGlwdjZoZHIgKilza2ItPmRhdGE7CiAJaXBoLT5wYXlsb2FkX2xlbiA9IGh0b25zKHNrYi0+bGVuIC0gc2l6ZW9mKCppcGgpKTsKIAotCW5leHRoZHIgPSAqc2tiLT5uaC5yYXc7Ci0JKnNrYi0+bmgucmF3ID0gSVBQUk9UT19EU1RPUFRTOworCW5leHRoZHIgPSAqc2tiX25ldHdvcmtfaGVhZGVyKHNrYik7CisJKnNrYl9uZXR3b3JrX2hlYWRlcihza2IpID0gSVBQUk9UT19EU1RPUFRTOwogCi0JZHN0b3B0ID0gKHN0cnVjdCBpcHY2X2Rlc3RvcHRfaGRyICopc2tiLT5oLnJhdzsKKwlkc3RvcHQgPSAoc3RydWN0IGlwdjZfZGVzdG9wdF9oZHIgKilza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpOwogCWRzdG9wdC0+bmV4dGhkciA9IG5leHRoZHI7CiAKIAloYW8gPSBtaXA2X3BhZG4oKGNoYXIgKikoZHN0b3B0ICsgMSksCkBAIC0yMTUsMjEgKzIxOCwyMiBAQAogCWlmIChsaWtlbHkob3B0LT5kc3RoYW8pKSB7CiAJCW9mZnNldCA9IGlwdjZfZmluZF90bHYoc2tiLCBvcHQtPmRzdGhhbywgSVBWNl9UTFZfSEFPKTsKIAkJaWYgKGxpa2VseShvZmZzZXQgPj0gMCkpCi0JCQloYW8gPSAoc3RydWN0IGlwdjZfZGVzdG9wdF9oYW8gKikoc2tiLT5uaC5yYXcgKyBvZmZzZXQpOworCQkJaGFvID0gKHN0cnVjdCBpcHY2X2Rlc3RvcHRfaGFvICopCisJCQkJCShza2JfbmV0d29ya19oZWFkZXIoc2tiKSArIG9mZnNldCk7CiAJfQogCiAJc2tiX2dldF90aW1lc3RhbXAoc2tiLCAmc3RhbXApOwogCi0JaWYgKCFtaXA2X3JlcG9ydF9ybF9hbGxvdygmc3RhbXAsICZza2ItPm5oLmlwdjZoLT5kYWRkciwKLQkJCQkgIGhhbyA/ICZoYW8tPmFkZHIgOiAmc2tiLT5uaC5pcHY2aC0+c2FkZHIsCisJaWYgKCFtaXA2X3JlcG9ydF9ybF9hbGxvdygmc3RhbXAsICZpcHY2X2hkcihza2IpLT5kYWRkciwKKwkJCQkgIGhhbyA/ICZoYW8tPmFkZHIgOiAmaXB2Nl9oZHIoc2tiKS0+c2FkZHIsCiAJCQkJICBvcHQtPmlpZikpCiAJCWdvdG8gb3V0OwogCiAJbWVtc2V0KCZzZWwsIDAsIHNpemVvZihzZWwpKTsKLQltZW1jcHkoJnNlbC5kYWRkciwgKHhmcm1fYWRkcmVzc190ICopJnNrYi0+bmguaXB2NmgtPmRhZGRyLAorCW1lbWNweSgmc2VsLmRhZGRyLCAoeGZybV9hZGRyZXNzX3QgKikmaXB2Nl9oZHIoc2tiKS0+ZGFkZHIsCiAJICAgICAgIHNpemVvZihzZWwuZGFkZHIpKTsKIAlzZWwucHJlZml4bGVuX2QgPSAxMjg7Ci0JbWVtY3B5KCZzZWwuc2FkZHIsICh4ZnJtX2FkZHJlc3NfdCAqKSZza2ItPm5oLmlwdjZoLT5zYWRkciwKKwltZW1jcHkoJnNlbC5zYWRkciwgKHhmcm1fYWRkcmVzc190ICopJmlwdjZfaGRyKHNrYiktPnNhZGRyLAogCSAgICAgICBzaXplb2Yoc2VsLnNhZGRyKSk7CiAJc2VsLnByZWZpeGxlbl9zID0gMTI4OwogCXNlbC5mYW1pbHkgPSBBRl9JTkVUNjsKQEAgLTI1MywxMSArMjU3LDEzIEBACiAJCQkgICAgICAgdTggKipuZXh0aGRyKQogewogCXUxNiBvZmZzZXQgPSBzaXplb2Yoc3RydWN0IGlwdjZoZHIpOwotCXN0cnVjdCBpcHY2X29wdF9oZHIgKmV4dGhkciA9IChzdHJ1Y3QgaXB2Nl9vcHRfaGRyKikoc2tiLT5uaC5pcHY2aCArIDEpOwotCXVuc2lnbmVkIGludCBwYWNrZXRfbGVuID0gc2tiLT50YWlsIC0gc2tiLT5uaC5yYXc7CisJc3RydWN0IGlwdjZfb3B0X2hkciAqZXh0aGRyID0KKwkJCQkgICAoc3RydWN0IGlwdjZfb3B0X2hkciAqKShpcHY2X2hkcihza2IpICsgMSk7CisJY29uc3QgdW5zaWduZWQgY2hhciAqbmggPSBza2JfbmV0d29ya19oZWFkZXIoc2tiKTsKKwl1bnNpZ25lZCBpbnQgcGFja2V0X2xlbiA9IHNrYi0+dGFpbCAtIHNrYi0+bmV0d29ya19oZWFkZXI7CiAJaW50IGZvdW5kX3JoZHIgPSAwOwogCi0JKm5leHRoZHIgPSAmc2tiLT5uaC5pcHY2aC0+bmV4dGhkcjsKKwkqbmV4dGhkciA9ICZpcHY2X2hkcihza2IpLT5uZXh0aGRyOwogCiAJd2hpbGUgKG9mZnNldCArIDEgPD0gcGFja2V0X2xlbikgewogCkBAIC0yODgsNyArMjk0LDcgQEAKIAogCQlvZmZzZXQgKz0gaXB2Nl9vcHRsZW4oZXh0aGRyKTsKIAkJKm5leHRoZHIgPSAmZXh0aGRyLT5uZXh0aGRyOwotCQlleHRoZHIgPSAoc3RydWN0IGlwdjZfb3B0X2hkciopKHNrYi0+bmgucmF3ICsgb2Zmc2V0KTsKKwkJZXh0aGRyID0gKHN0cnVjdCBpcHY2X29wdF9oZHIgKikobmggKyBvZmZzZXQpOwogCX0KIAogCXJldHVybiBvZmZzZXQ7CkBAIC0zNjEsMTAgKzM2NywxMCBAQAogCWlwaCA9IChzdHJ1Y3QgaXB2NmhkciAqKXNrYi0+ZGF0YTsKIAlpcGgtPnBheWxvYWRfbGVuID0gaHRvbnMoc2tiLT5sZW4gLSBzaXplb2YoKmlwaCkpOwogCi0JbmV4dGhkciA9ICpza2ItPm5oLnJhdzsKLQkqc2tiLT5uaC5yYXcgPSBJUFBST1RPX1JPVVRJTkc7CisJbmV4dGhkciA9ICpza2JfbmV0d29ya19oZWFkZXIoc2tiKTsKKwkqc2tiX25ldHdvcmtfaGVhZGVyKHNrYikgPSBJUFBST1RPX1JPVVRJTkc7CiAKLQlydDIgPSAoc3RydWN0IHJ0Ml9oZHIgKilza2ItPmgucmF3OworCXJ0MiA9IChzdHJ1Y3QgcnQyX2hkciAqKXNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYik7CiAJcnQyLT5ydF9oZHIubmV4dGhkciA9IG5leHRoZHI7CiAJcnQyLT5ydF9oZHIuaGRybGVuID0gKHgtPnByb3BzLmhlYWRlcl9sZW4gPj4gMykgLSAxOwogCXJ0Mi0+cnRfaGRyLnR5cGUgPSBJUFY2X1NSQ1JUX1RZUEVfMjsKQEAgLTM4MywxMSArMzg5LDEzIEBACiAJCQkgICAgIHU4ICoqbmV4dGhkcikKIHsKIAl1MTYgb2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKTsKLQlzdHJ1Y3QgaXB2Nl9vcHRfaGRyICpleHRoZHIgPSAoc3RydWN0IGlwdjZfb3B0X2hkciopKHNrYi0+bmguaXB2NmggKyAxKTsKLQl1bnNpZ25lZCBpbnQgcGFja2V0X2xlbiA9IHNrYi0+dGFpbCAtIHNrYi0+bmgucmF3OworCXN0cnVjdCBpcHY2X29wdF9oZHIgKmV4dGhkciA9CisJCQkJICAgKHN0cnVjdCBpcHY2X29wdF9oZHIgKikoaXB2Nl9oZHIoc2tiKSArIDEpOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKm5oID0gc2tiX25ldHdvcmtfaGVhZGVyKHNrYik7CisJdW5zaWduZWQgaW50IHBhY2tldF9sZW4gPSBza2ItPnRhaWwgLSBza2ItPm5ldHdvcmtfaGVhZGVyOwogCWludCBmb3VuZF9yaGRyID0gMDsKIAotCSpuZXh0aGRyID0gJnNrYi0+bmguaXB2NmgtPm5leHRoZHI7CisJKm5leHRoZHIgPSAmaXB2Nl9oZHIoc2tiKS0+bmV4dGhkcjsKIAogCXdoaWxlIChvZmZzZXQgKyAxIDw9IHBhY2tldF9sZW4pIHsKIApAQCAtMzk3LDcgKzQwNSw3IEBACiAJCWNhc2UgTkVYVEhEUl9ST1VUSU5HOgogCQkJaWYgKG9mZnNldCArIDMgPD0gcGFja2V0X2xlbikgewogCQkJCXN0cnVjdCBpcHY2X3J0X2hkciAqcnQ7Ci0JCQkJcnQgPSAoc3RydWN0IGlwdjZfcnRfaGRyICopKHNrYi0+bmgucmF3ICsgb2Zmc2V0KTsKKwkJCQlydCA9IChzdHJ1Y3QgaXB2Nl9ydF9oZHIgKikobmggKyBvZmZzZXQpOwogCQkJCWlmIChydC0+dHlwZSAhPSAwKQogCQkJCQlyZXR1cm4gb2Zmc2V0OwogCQkJfQpAQCAtNDE3LDcgKzQyNSw3IEBACiAKIAkJb2Zmc2V0ICs9IGlwdjZfb3B0bGVuKGV4dGhkcik7CiAJCSpuZXh0aGRyID0gJmV4dGhkci0+bmV4dGhkcjsKLQkJZXh0aGRyID0gKHN0cnVjdCBpcHY2X29wdF9oZHIqKShza2ItPm5oLnJhdyArIG9mZnNldCk7CisJCWV4dGhkciA9IChzdHJ1Y3QgaXB2Nl9vcHRfaGRyICopKG5oICsgb2Zmc2V0KTsKIAl9CiAKIAlyZXR1cm4gb2Zmc2V0OwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmRpc2MuYyBiL25ldC9pcHY2L25kaXNjLmMKaW5kZXggMTIxZjMxYy4uZDhiMzY0NSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmRpc2MuYworKysgYi9uZXQvaXB2Ni9uZGlzYy5jCkBAIC0zMTksNiArMzE5LDggQEAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAorRVhQT1JUX1NZTUJPTChuZGlzY19tY19tYXApOworCiBzdGF0aWMgdTMyIG5kaXNjX2hhc2goY29uc3Qgdm9pZCAqcGtleSwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAljb25zdCB1MzIgKnAzMiA9IHBrZXk7CkBAIC00MjUsMjggKzQyNywxMDggQEAKIAlzZWN1cml0eV9za19jbGFzc2lmeV9mbG93KG5kaXNjX3NvY2tldC0+c2ssIGZsKTsKIH0KIAorc3RhdGljIHZvaWQgX19uZGlzY19zZW5kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IG5laWdoYm91ciAqbmVpZ2gsCisJCQkgc3RydWN0IGluNl9hZGRyICpkYWRkciwgc3RydWN0IGluNl9hZGRyICpzYWRkciwKKwkJCSBzdHJ1Y3QgaWNtcDZoZHIgKmljbXA2aCwgc3RydWN0IGluNl9hZGRyICp0YXJnZXQsCisJCQkgaW50IGxsaW5mbywgaW50IGljbXA2X21pYl9vdXRuZCkKK3sKKwlzdHJ1Y3QgZmxvd2kgZmw7CisJc3RydWN0IGRzdF9lbnRyeSAqZHN0OworCXN0cnVjdCBzb2NrICpzayA9IG5kaXNjX3NvY2tldC0+c2s7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgaWNtcDZoZHIgKmhkcjsKKwlzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2OworCWludCBsZW47CisJaW50IGVycjsKKwl1OCAqb3B0OworCisJbmRpc2NfZmxvd19pbml0KCZmbCwgaWNtcDZoLT5pY21wNl90eXBlLCBzYWRkciwgZGFkZHIsCisJCQlkZXYtPmlmaW5kZXgpOworCisJZHN0ID0gbmRpc2NfZHN0X2FsbG9jKGRldiwgbmVpZ2gsIGRhZGRyLCBpcDZfb3V0cHV0KTsKKwlpZiAoIWRzdCkKKwkJcmV0dXJuOworCisJZXJyID0geGZybV9sb29rdXAoJmRzdCwgJmZsLCBOVUxMLCAwKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuOworCisJaWYgKCFkZXYtPmFkZHJfbGVuKQorCQlsbGluZm8gPSAwOworCisJbGVuID0gc2l6ZW9mKHN0cnVjdCBpY21wNmhkcikgKyAodGFyZ2V0ID8gc2l6ZW9mKCp0YXJnZXQpIDogMCk7CisJaWYgKGxsaW5mbykKKwkJbGVuICs9IG5kaXNjX29wdF9hZGRyX3NwYWNlKGRldik7CisKKwlza2IgPSBzb2NrX2FsbG9jX3NlbmRfc2tiKHNrLAorCQkJCSAgKE1BWF9IRUFERVIgKyBzaXplb2Yoc3RydWN0IGlwdjZoZHIpICsKKwkJCQkgICBsZW4gKyBMTF9SRVNFUlZFRF9TUEFDRShkZXYpKSwKKwkJCQkgIDEsICZlcnIpOworCWlmICghc2tiKSB7CisJCU5EX1BSSU5USzAoS0VSTl9FUlIKKwkJCSAgICJJQ01QdjYgTkQ6ICVzKCkgZmFpbGVkIHRvIGFsbG9jYXRlIGFuIHNrYi5cbiIsCisJCQkgICBfX0ZVTkNUSU9OX18pOworCQlkc3RfcmVsZWFzZShkc3QpOworCQlyZXR1cm47CisJfQorCisJc2tiX3Jlc2VydmUoc2tiLCBMTF9SRVNFUlZFRF9TUEFDRShkZXYpKTsKKwlpcDZfbmRfaGRyKHNrLCBza2IsIGRldiwgc2FkZHIsIGRhZGRyLCBJUFBST1RPX0lDTVBWNiwgbGVuKTsKKworCXNrYi0+dHJhbnNwb3J0X2hlYWRlciA9IHNrYi0+dGFpbDsKKwlza2JfcHV0KHNrYiwgbGVuKTsKKworCWhkciA9IChzdHJ1Y3QgaWNtcDZoZHIgKilza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpOworCW1lbWNweShoZHIsIGljbXA2aCwgc2l6ZW9mKCpoZHIpKTsKKworCW9wdCA9IHNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYikgKyBzaXplb2Yoc3RydWN0IGljbXA2aGRyKTsKKwlpZiAodGFyZ2V0KSB7CisJCWlwdjZfYWRkcl9jb3B5KChzdHJ1Y3QgaW42X2FkZHIgKilvcHQsIHRhcmdldCk7CisJCW9wdCArPSBzaXplb2YoKnRhcmdldCk7CisJfQorCisJaWYgKGxsaW5mbykKKwkJbmRpc2NfZmlsbF9hZGRyX29wdGlvbihvcHQsIGxsaW5mbywgZGV2LT5kZXZfYWRkciwKKwkJCQkgICAgICAgZGV2LT5hZGRyX2xlbiwgZGV2LT50eXBlKTsKKworCWhkci0+aWNtcDZfY2tzdW0gPSBjc3VtX2lwdjZfbWFnaWMoc2FkZHIsIGRhZGRyLCBsZW4sCisJCQkJCSAgIElQUFJPVE9fSUNNUFY2LAorCQkJCQkgICBjc3VtX3BhcnRpYWwoKF9fdTggKikgaGRyLAorCQkJCQkJCWxlbiwgMCkpOworCisJc2tiLT5kc3QgPSBkc3Q7CisKKwlpZGV2ID0gaW42X2Rldl9nZXQoZHN0LT5kZXYpOworCUlQNl9JTkNfU1RBVFMoaWRldiwgSVBTVEFUU19NSUJfT1VUUkVRVUVTVFMpOworCisJZXJyID0gTkZfSE9PSyhQRl9JTkVUNiwgTkZfSVA2X0xPQ0FMX09VVCwgc2tiLCBOVUxMLCBkc3QtPmRldiwgZHN0X291dHB1dCk7CisJaWYgKCFlcnIpIHsKKwkJSUNNUDZfSU5DX1NUQVRTKGlkZXYsIGljbXA2X21pYl9vdXRuZCk7CisJCUlDTVA2X0lOQ19TVEFUUyhpZGV2LCBJQ01QNl9NSUJfT1VUTVNHUyk7CisJfQorCisJaWYgKGxpa2VseShpZGV2ICE9IE5VTEwpKQorCQlpbjZfZGV2X3B1dChpZGV2KTsKK30KKwogc3RhdGljIHZvaWQgbmRpc2Nfc2VuZF9uYShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaCwKIAkJICAgc3RydWN0IGluNl9hZGRyICpkYWRkciwgc3RydWN0IGluNl9hZGRyICpzb2xpY2l0ZWRfYWRkciwKIAkJICAgaW50IHJvdXRlciwgaW50IHNvbGljaXRlZCwgaW50IG92ZXJyaWRlLCBpbnQgaW5jX29wdCkKIHsKIAlzdHJ1Y3QgaW42X2FkZHIgdG1wYWRkcjsKIAlzdHJ1Y3QgaW5ldDZfaWZhZGRyICppZnA7Ci0Jc3RydWN0IGluZXQ2X2RldiAqaWRldjsKLQlzdHJ1Y3QgZmxvd2kgZmw7Ci0Jc3RydWN0IGRzdF9lbnRyeSogZHN0OwotCXN0cnVjdCBzb2NrICpzayA9IG5kaXNjX3NvY2tldC0+c2s7CiAJc3RydWN0IGluNl9hZGRyICpzcmNfYWRkcjsKLQlzdHJ1Y3QgbmRfbXNnICptc2c7Ci0JaW50IGxlbjsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCWludCBlcnI7Ci0KLQlsZW4gPSBzaXplb2Yoc3RydWN0IGljbXA2aGRyKSArIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpOworCXN0cnVjdCBpY21wNmhkciBpY21wNmggPSB7CisJCS5pY21wNl90eXBlID0gTkRJU0NfTkVJR0hCT1VSX0FEVkVSVElTRU1FTlQsCisJfTsKIAogCS8qIGZvciBhbnljYXN0IG9yIHByb3h5LCBzb2xpY2l0ZWRfYWRkciAhPSBzcmNfYWRkciAqLwogCWlmcCA9IGlwdjZfZ2V0X2lmYWRkcihzb2xpY2l0ZWRfYWRkciwgZGV2LCAxKTsKIAlpZiAoaWZwKSB7CiAJCXNyY19hZGRyID0gc29saWNpdGVkX2FkZHI7CisJCWlmIChpZnAtPmZsYWdzICYgSUZBX0ZfT1BUSU1JU1RJQykKKwkJCW92ZXJyaWRlID0gMDsKIAkJaW42X2lmYV9wdXQoaWZwKTsKIAl9IGVsc2UgewogCQlpZiAoaXB2Nl9kZXZfZ2V0X3NhZGRyKGRldiwgZGFkZHIsICZ0bXBhZGRyKSkKQEAgLTQ1NCwyMzcgKzUzNiw3MSBAQAogCQlzcmNfYWRkciA9ICZ0bXBhZGRyOwogCX0KIAotCW5kaXNjX2Zsb3dfaW5pdCgmZmwsIE5ESVNDX05FSUdIQk9VUl9BRFZFUlRJU0VNRU5ULCBzcmNfYWRkciwgZGFkZHIsCi0JCQlkZXYtPmlmaW5kZXgpOworCWljbXA2aC5pY21wNl9yb3V0ZXIgPSByb3V0ZXI7CisJaWNtcDZoLmljbXA2X3NvbGljaXRlZCA9IHNvbGljaXRlZDsKKwlpY21wNmguaWNtcDZfb3ZlcnJpZGUgPSBvdmVycmlkZTsKIAotCWRzdCA9IG5kaXNjX2RzdF9hbGxvYyhkZXYsIG5laWdoLCBkYWRkciwgaXA2X291dHB1dCk7Ci0JaWYgKCFkc3QpCi0JCXJldHVybjsKLQotCWVyciA9IHhmcm1fbG9va3VwKCZkc3QsICZmbCwgTlVMTCwgMCk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybjsKLQotCWlmIChpbmNfb3B0KSB7Ci0JCWlmIChkZXYtPmFkZHJfbGVuKQotCQkJbGVuICs9IG5kaXNjX29wdF9hZGRyX3NwYWNlKGRldik7Ci0JCWVsc2UKLQkJCWluY19vcHQgPSAwOwotCX0KLQotCXNrYiA9IHNvY2tfYWxsb2Nfc2VuZF9za2Ioc2ssCi0JCQkJICAoTUFYX0hFQURFUiArIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikgKwotCQkJCSAgIGxlbiArIExMX1JFU0VSVkVEX1NQQUNFKGRldikpLAotCQkJCSAgMSwgJmVycik7Ci0KLQlpZiAoc2tiID09IE5VTEwpIHsKLQkJTkRfUFJJTlRLMChLRVJOX0VSUgotCQkJICAgIklDTVB2NiBOQTogJXMoKSBmYWlsZWQgdG8gYWxsb2NhdGUgYW4gc2tiLlxuIiwKLQkJCSAgIF9fRlVOQ1RJT05fXyk7Ci0JCWRzdF9yZWxlYXNlKGRzdCk7Ci0JCXJldHVybjsKLQl9Ci0KLQlza2JfcmVzZXJ2ZShza2IsIExMX1JFU0VSVkVEX1NQQUNFKGRldikpOwotCWlwNl9uZF9oZHIoc2ssIHNrYiwgZGV2LCBzcmNfYWRkciwgZGFkZHIsIElQUFJPVE9fSUNNUFY2LCBsZW4pOwotCi0JbXNnID0gKHN0cnVjdCBuZF9tc2cgKilza2JfcHV0KHNrYiwgbGVuKTsKLQlza2ItPmgucmF3ID0gKHVuc2lnbmVkIGNoYXIqKW1zZzsKLQotCW1zZy0+aWNtcGguaWNtcDZfdHlwZSA9IE5ESVNDX05FSUdIQk9VUl9BRFZFUlRJU0VNRU5UOwotCW1zZy0+aWNtcGguaWNtcDZfY29kZSA9IDA7Ci0JbXNnLT5pY21waC5pY21wNl9ja3N1bSA9IDA7Ci0KLQltc2ctPmljbXBoLmljbXA2X3VudXNlZCA9IDA7Ci0JbXNnLT5pY21waC5pY21wNl9yb3V0ZXIgICAgPSByb3V0ZXI7Ci0JbXNnLT5pY21waC5pY21wNl9zb2xpY2l0ZWQgPSBzb2xpY2l0ZWQ7Ci0JbXNnLT5pY21waC5pY21wNl9vdmVycmlkZSAgPSBvdmVycmlkZTsKLQotCS8qIFNldCB0aGUgdGFyZ2V0IGFkZHJlc3MuICovCi0JaXB2Nl9hZGRyX2NvcHkoJm1zZy0+dGFyZ2V0LCBzb2xpY2l0ZWRfYWRkcik7Ci0KLQlpZiAoaW5jX29wdCkKLQkJbmRpc2NfZmlsbF9hZGRyX29wdGlvbihtc2ctPm9wdCwgTkRfT1BUX1RBUkdFVF9MTF9BRERSLCBkZXYtPmRldl9hZGRyLAotCQkJCSAgICAgICBkZXYtPmFkZHJfbGVuLCBkZXYtPnR5cGUpOwotCi0JLyogY2hlY2tzdW0gKi8KLQltc2ctPmljbXBoLmljbXA2X2Nrc3VtID0gY3N1bV9pcHY2X21hZ2ljKHNyY19hZGRyLCBkYWRkciwgbGVuLAotCQkJCQkJIElQUFJPVE9fSUNNUFY2LAotCQkJCQkJIGNzdW1fcGFydGlhbCgoX191OCAqKSBtc2csCi0JCQkJCQkJICAgICAgbGVuLCAwKSk7Ci0KLQlza2ItPmRzdCA9IGRzdDsKLQlpZGV2ID0gaW42X2Rldl9nZXQoZHN0LT5kZXYpOwotCUlQNl9JTkNfU1RBVFMoaWRldiwgSVBTVEFUU19NSUJfT1VUUkVRVUVTVFMpOwotCWVyciA9IE5GX0hPT0soUEZfSU5FVDYsIE5GX0lQNl9MT0NBTF9PVVQsIHNrYiwgTlVMTCwgZHN0LT5kZXYsIGRzdF9vdXRwdXQpOwotCWlmICghZXJyKSB7Ci0JCUlDTVA2X0lOQ19TVEFUUyhpZGV2LCBJQ01QNl9NSUJfT1VUTkVJR0hCT1JBRFZFUlRJU0VNRU5UUyk7Ci0JCUlDTVA2X0lOQ19TVEFUUyhpZGV2LCBJQ01QNl9NSUJfT1VUTVNHUyk7Ci0JfQotCi0JaWYgKGxpa2VseShpZGV2ICE9IE5VTEwpKQotCQlpbjZfZGV2X3B1dChpZGV2KTsKKwlfX25kaXNjX3NlbmQoZGV2LCBuZWlnaCwgZGFkZHIsIHNyY19hZGRyLAorCQkgICAgICZpY21wNmgsIHNvbGljaXRlZF9hZGRyLAorCQkgICAgIGluY19vcHQgPyBORF9PUFRfVEFSR0VUX0xMX0FERFIgOiAwLAorCQkgICAgIElDTVA2X01JQl9PVVRORUlHSEJPUkFEVkVSVElTRU1FTlRTKTsKIH0KIAogdm9pZCBuZGlzY19zZW5kX25zKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBuZWlnaGJvdXIgKm5laWdoLAogCQkgICBzdHJ1Y3QgaW42X2FkZHIgKnNvbGljaXQsCiAJCSAgIHN0cnVjdCBpbjZfYWRkciAqZGFkZHIsIHN0cnVjdCBpbjZfYWRkciAqc2FkZHIpCiB7Ci0Jc3RydWN0IGZsb3dpIGZsOwotCXN0cnVjdCBkc3RfZW50cnkqIGRzdDsKLQlzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2OwotCXN0cnVjdCBzb2NrICpzayA9IG5kaXNjX3NvY2tldC0+c2s7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQlzdHJ1Y3QgbmRfbXNnICptc2c7CiAJc3RydWN0IGluNl9hZGRyIGFkZHJfYnVmOwotCWludCBsZW47Ci0JaW50IGVycjsKLQlpbnQgc2VuZF9sbGluZm87CisJc3RydWN0IGljbXA2aGRyIGljbXA2aCA9IHsKKwkJLmljbXA2X3R5cGUgPSBORElTQ19ORUlHSEJPVVJfU09MSUNJVEFUSU9OLAorCX07CiAKIAlpZiAoc2FkZHIgPT0gTlVMTCkgewotCQlpZiAoaXB2Nl9nZXRfbGxhZGRyKGRldiwgJmFkZHJfYnVmKSkKKwkJaWYgKGlwdjZfZ2V0X2xsYWRkcihkZXYsICZhZGRyX2J1ZiwKKwkJCQkgICAoSUZBX0ZfVEVOVEFUSVZFfElGQV9GX09QVElNSVNUSUMpKSkKIAkJCXJldHVybjsKIAkJc2FkZHIgPSAmYWRkcl9idWY7CiAJfQogCi0JbmRpc2NfZmxvd19pbml0KCZmbCwgTkRJU0NfTkVJR0hCT1VSX1NPTElDSVRBVElPTiwgc2FkZHIsIGRhZGRyLAotCQkJZGV2LT5pZmluZGV4KTsKLQotCWRzdCA9IG5kaXNjX2RzdF9hbGxvYyhkZXYsIG5laWdoLCBkYWRkciwgaXA2X291dHB1dCk7Ci0JaWYgKCFkc3QpCi0JCXJldHVybjsKLQotCWVyciA9IHhmcm1fbG9va3VwKCZkc3QsICZmbCwgTlVMTCwgMCk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybjsKLQotCWxlbiA9IHNpemVvZihzdHJ1Y3QgaWNtcDZoZHIpICsgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcik7Ci0Jc2VuZF9sbGluZm8gPSBkZXYtPmFkZHJfbGVuICYmICFpcHY2X2FkZHJfYW55KHNhZGRyKTsKLQlpZiAoc2VuZF9sbGluZm8pCi0JCWxlbiArPSBuZGlzY19vcHRfYWRkcl9zcGFjZShkZXYpOwotCi0Jc2tiID0gc29ja19hbGxvY19zZW5kX3NrYihzaywKLQkJCQkgIChNQVhfSEVBREVSICsgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSArCi0JCQkJICAgbGVuICsgTExfUkVTRVJWRURfU1BBQ0UoZGV2KSksCi0JCQkJICAxLCAmZXJyKTsKLQlpZiAoc2tiID09IE5VTEwpIHsKLQkJTkRfUFJJTlRLMChLRVJOX0VSUgotCQkJICAgIklDTVB2NiBOQTogJXMoKSBmYWlsZWQgdG8gYWxsb2NhdGUgYW4gc2tiLlxuIiwKLQkJCSAgIF9fRlVOQ1RJT05fXyk7Ci0JCWRzdF9yZWxlYXNlKGRzdCk7Ci0JCXJldHVybjsKLQl9Ci0KLQlza2JfcmVzZXJ2ZShza2IsIExMX1JFU0VSVkVEX1NQQUNFKGRldikpOwotCWlwNl9uZF9oZHIoc2ssIHNrYiwgZGV2LCBzYWRkciwgZGFkZHIsIElQUFJPVE9fSUNNUFY2LCBsZW4pOwotCi0JbXNnID0gKHN0cnVjdCBuZF9tc2cgKilza2JfcHV0KHNrYiwgbGVuKTsKLQlza2ItPmgucmF3ID0gKHVuc2lnbmVkIGNoYXIqKW1zZzsKLQltc2ctPmljbXBoLmljbXA2X3R5cGUgPSBORElTQ19ORUlHSEJPVVJfU09MSUNJVEFUSU9OOwotCW1zZy0+aWNtcGguaWNtcDZfY29kZSA9IDA7Ci0JbXNnLT5pY21waC5pY21wNl9ja3N1bSA9IDA7Ci0JbXNnLT5pY21waC5pY21wNl91bnVzZWQgPSAwOwotCi0JLyogU2V0IHRoZSB0YXJnZXQgYWRkcmVzcy4gKi8KLQlpcHY2X2FkZHJfY29weSgmbXNnLT50YXJnZXQsIHNvbGljaXQpOwotCi0JaWYgKHNlbmRfbGxpbmZvKQotCQluZGlzY19maWxsX2FkZHJfb3B0aW9uKG1zZy0+b3B0LCBORF9PUFRfU09VUkNFX0xMX0FERFIsIGRldi0+ZGV2X2FkZHIsCi0JCQkJICAgICAgIGRldi0+YWRkcl9sZW4sIGRldi0+dHlwZSk7Ci0KLQkvKiBjaGVja3N1bSAqLwotCW1zZy0+aWNtcGguaWNtcDZfY2tzdW0gPSBjc3VtX2lwdjZfbWFnaWMoJnNrYi0+bmguaXB2NmgtPnNhZGRyLAotCQkJCQkJIGRhZGRyLCBsZW4sCi0JCQkJCQkgSVBQUk9UT19JQ01QVjYsCi0JCQkJCQkgY3N1bV9wYXJ0aWFsKChfX3U4ICopIG1zZywKLQkJCQkJCQkgICAgICBsZW4sIDApKTsKLQkvKiBzZW5kIGl0ISAqLwotCXNrYi0+ZHN0ID0gZHN0OwotCWlkZXYgPSBpbjZfZGV2X2dldChkc3QtPmRldik7Ci0JSVA2X0lOQ19TVEFUUyhpZGV2LCBJUFNUQVRTX01JQl9PVVRSRVFVRVNUUyk7Ci0JZXJyID0gTkZfSE9PSyhQRl9JTkVUNiwgTkZfSVA2X0xPQ0FMX09VVCwgc2tiLCBOVUxMLCBkc3QtPmRldiwgZHN0X291dHB1dCk7Ci0JaWYgKCFlcnIpIHsKLQkJSUNNUDZfSU5DX1NUQVRTKGlkZXYsIElDTVA2X01JQl9PVVRORUlHSEJPUlNPTElDSVRTKTsKLQkJSUNNUDZfSU5DX1NUQVRTKGlkZXYsIElDTVA2X01JQl9PVVRNU0dTKTsKLQl9Ci0KLQlpZiAobGlrZWx5KGlkZXYgIT0gTlVMTCkpCi0JCWluNl9kZXZfcHV0KGlkZXYpOworCV9fbmRpc2Nfc2VuZChkZXYsIG5laWdoLCBkYWRkciwgc2FkZHIsCisJCSAgICAgJmljbXA2aCwgc29saWNpdCwKKwkJICAgICAhaXB2Nl9hZGRyX2FueShzYWRkcikgPyBORF9PUFRfU09VUkNFX0xMX0FERFIgOiAwLAorCQkgICAgIElDTVA2X01JQl9PVVRORUlHSEJPUlNPTElDSVRTKTsKIH0KIAogdm9pZCBuZGlzY19zZW5kX3JzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpbjZfYWRkciAqc2FkZHIsCiAJCSAgIHN0cnVjdCBpbjZfYWRkciAqZGFkZHIpCiB7Ci0Jc3RydWN0IGZsb3dpIGZsOwotCXN0cnVjdCBkc3RfZW50cnkqIGRzdDsKLQlzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2OwotCXN0cnVjdCBzb2NrICpzayA9IG5kaXNjX3NvY2tldC0+c2s7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQlzdHJ1Y3QgaWNtcDZoZHIgKmhkcjsKLQlfX3U4ICogb3B0OwotCWludCBsZW47Ci0JaW50IGVycjsKKwlzdHJ1Y3QgaWNtcDZoZHIgaWNtcDZoID0geworCQkuaWNtcDZfdHlwZSA9IE5ESVNDX1JPVVRFUl9TT0xJQ0lUQVRJT04sCisJfTsKKwlpbnQgc2VuZF9zbGxhbyA9IGRldi0+YWRkcl9sZW47CiAKLQluZGlzY19mbG93X2luaXQoJmZsLCBORElTQ19ST1VURVJfU09MSUNJVEFUSU9OLCBzYWRkciwgZGFkZHIsCi0JCQlkZXYtPmlmaW5kZXgpOwotCi0JZHN0ID0gbmRpc2NfZHN0X2FsbG9jKGRldiwgTlVMTCwgZGFkZHIsIGlwNl9vdXRwdXQpOwotCWlmICghZHN0KQotCQlyZXR1cm47Ci0KLQllcnIgPSB4ZnJtX2xvb2t1cCgmZHN0LCAmZmwsIE5VTEwsIDApOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm47Ci0KLQlsZW4gPSBzaXplb2Yoc3RydWN0IGljbXA2aGRyKTsKLQlpZiAoZGV2LT5hZGRyX2xlbikKLQkJbGVuICs9IG5kaXNjX29wdF9hZGRyX3NwYWNlKGRldik7Ci0KLQlza2IgPSBzb2NrX2FsbG9jX3NlbmRfc2tiKHNrLAotCQkJCSAgKE1BWF9IRUFERVIgKyBzaXplb2Yoc3RydWN0IGlwdjZoZHIpICsKLQkJCQkgICBsZW4gKyBMTF9SRVNFUlZFRF9TUEFDRShkZXYpKSwKLQkJCQkgIDEsICZlcnIpOwotCWlmIChza2IgPT0gTlVMTCkgewotCQlORF9QUklOVEswKEtFUk5fRVJSCi0JCQkgICAiSUNNUHY2IFJTOiAlcygpIGZhaWxlZCB0byBhbGxvY2F0ZSBhbiBza2IuXG4iLAotCQkJICAgX19GVU5DVElPTl9fKTsKLQkJZHN0X3JlbGVhc2UoZHN0KTsKLQkJcmV0dXJuOworI2lmZGVmIENPTkZJR19JUFY2X09QVElNSVNUSUNfREFECisJLyoKKwkgKiBBY2NvcmRpbmcgdG8gc2VjdGlvbiAyLjIgb2YgUkZDIDQ0MjksIHdlIG11c3Qgbm90CisJICogc2VuZCByb3V0ZXIgc29saWNpdGF0aW9ucyB3aXRoIGEgc2xsYW8gZnJvbQorCSAqIG9wdGltaXN0aWMgYWRkcmVzc2VzLCBidXQgd2UgbWF5IHNlbmQgdGhlIHNvbGljaXRhdGlvbgorCSAqIGlmIHdlIGRvbid0IGluY2x1ZGUgdGhlIHNsbGFvLiAgU28gaGVyZSB3ZSBjaGVjaworCSAqIGlmIG91ciBhZGRyZXNzIGlzIG9wdGltaXN0aWMsIGFuZCBpZiBzbywgd2UKKwkgKiBzdXByZXNzIHRoZSBpbmNsdXNpb24gb2YgdGhlIHNsbGFvLgorCSAqLworCWlmIChzZW5kX3NsbGFvKSB7CisJCXN0cnVjdCBpbmV0Nl9pZmFkZHIgKmlmcCA9IGlwdjZfZ2V0X2lmYWRkcihzYWRkciwgZGV2LCAxKTsKKwkJaWYgKGlmcCkgeworCQkJaWYgKGlmcC0+ZmxhZ3MgJiBJRkFfRl9PUFRJTUlTVElDKSAgeworCQkJCXNlbmRfc2xsYW8gPSAwOworCQkJfQorCQkJaW42X2lmYV9wdXQoaWZwKTsKKwkJfSBlbHNlIHsKKwkJCXNlbmRfc2xsYW8gPSAwOworCQl9CiAJfQotCi0Jc2tiX3Jlc2VydmUoc2tiLCBMTF9SRVNFUlZFRF9TUEFDRShkZXYpKTsKLQlpcDZfbmRfaGRyKHNrLCBza2IsIGRldiwgc2FkZHIsIGRhZGRyLCBJUFBST1RPX0lDTVBWNiwgbGVuKTsKLQotCWhkciA9IChzdHJ1Y3QgaWNtcDZoZHIgKilza2JfcHV0KHNrYiwgbGVuKTsKLQlza2ItPmgucmF3ID0gKHVuc2lnbmVkIGNoYXIqKWhkcjsKLQloZHItPmljbXA2X3R5cGUgPSBORElTQ19ST1VURVJfU09MSUNJVEFUSU9OOwotCWhkci0+aWNtcDZfY29kZSA9IDA7Ci0JaGRyLT5pY21wNl9ja3N1bSA9IDA7Ci0JaGRyLT5pY21wNl91bnVzZWQgPSAwOwotCi0Jb3B0ID0gKHU4KikgKGhkciArIDEpOwotCi0JaWYgKGRldi0+YWRkcl9sZW4pCi0JCW5kaXNjX2ZpbGxfYWRkcl9vcHRpb24ob3B0LCBORF9PUFRfU09VUkNFX0xMX0FERFIsIGRldi0+ZGV2X2FkZHIsCi0JCQkJICAgICAgIGRldi0+YWRkcl9sZW4sIGRldi0+dHlwZSk7Ci0KLQkvKiBjaGVja3N1bSAqLwotCWhkci0+aWNtcDZfY2tzdW0gPSBjc3VtX2lwdjZfbWFnaWMoJnNrYi0+bmguaXB2NmgtPnNhZGRyLCBkYWRkciwgbGVuLAotCQkJCQkgICBJUFBST1RPX0lDTVBWNiwKLQkJCQkJICAgY3N1bV9wYXJ0aWFsKChfX3U4ICopIGhkciwgbGVuLCAwKSk7Ci0KLQkvKiBzZW5kIGl0ISAqLwotCXNrYi0+ZHN0ID0gZHN0OwotCWlkZXYgPSBpbjZfZGV2X2dldChkc3QtPmRldik7Ci0JSVA2X0lOQ19TVEFUUyhpZGV2LCBJUFNUQVRTX01JQl9PVVRSRVFVRVNUUyk7Ci0JZXJyID0gTkZfSE9PSyhQRl9JTkVUNiwgTkZfSVA2X0xPQ0FMX09VVCwgc2tiLCBOVUxMLCBkc3QtPmRldiwgZHN0X291dHB1dCk7Ci0JaWYgKCFlcnIpIHsKLQkJSUNNUDZfSU5DX1NUQVRTKGlkZXYsIElDTVA2X01JQl9PVVRST1VURVJTT0xJQ0lUUyk7Ci0JCUlDTVA2X0lOQ19TVEFUUyhpZGV2LCBJQ01QNl9NSUJfT1VUTVNHUyk7Ci0JfQotCi0JaWYgKGxpa2VseShpZGV2ICE9IE5VTEwpKQotCQlpbjZfZGV2X3B1dChpZGV2KTsKKyNlbmRpZgorCV9fbmRpc2Nfc2VuZChkZXYsIE5VTEwsIGRhZGRyLCBzYWRkciwKKwkJICAgICAmaWNtcDZoLCBOVUxMLAorCQkgICAgIHNlbmRfc2xsYW8gPyBORF9PUFRfU09VUkNFX0xMX0FERFIgOiAwLAorCQkgICAgIElDTVA2X01JQl9PVVRST1VURVJTT0xJQ0lUUyk7CiB9CiAKIApAQCAtNzA4LDggKzYyNCw4IEBACiAJc3RydWN0IGluNl9hZGRyICp0YXJnZXQgPSAoc3RydWN0IGluNl9hZGRyICopJm5laWdoLT5wcmltYXJ5X2tleTsKIAlpbnQgcHJvYmVzID0gYXRvbWljX3JlYWQoJm5laWdoLT5wcm9iZXMpOwogCi0JaWYgKHNrYiAmJiBpcHY2X2Noa19hZGRyKCZza2ItPm5oLmlwdjZoLT5zYWRkciwgZGV2LCAxKSkKLQkJc2FkZHIgPSAmc2tiLT5uaC5pcHY2aC0+c2FkZHI7CisJaWYgKHNrYiAmJiBpcHY2X2Noa19hZGRyKCZpcHY2X2hkcihza2IpLT5zYWRkciwgZGV2LCAxKSkKKwkJc2FkZHIgPSAmaXB2Nl9oZHIoc2tiKS0+c2FkZHI7CiAKIAlpZiAoKHByb2JlcyAtPSBuZWlnaC0+cGFybXMtPnVjYXN0X3Byb2JlcykgPCAwKSB7CiAJCWlmICghKG5laWdoLT5udWRfc3RhdGUgJiBOVURfVkFMSUQpKSB7CkBAIC03MzIsMTEgKzY0OCwxMiBAQAogCiBzdGF0aWMgdm9pZCBuZGlzY19yZWN2X25zKHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0Jc3RydWN0IG5kX21zZyAqbXNnID0gKHN0cnVjdCBuZF9tc2cgKilza2ItPmgucmF3OwotCXN0cnVjdCBpbjZfYWRkciAqc2FkZHIgPSAmc2tiLT5uaC5pcHY2aC0+c2FkZHI7Ci0Jc3RydWN0IGluNl9hZGRyICpkYWRkciA9ICZza2ItPm5oLmlwdjZoLT5kYWRkcjsKKwlzdHJ1Y3QgbmRfbXNnICptc2cgPSAoc3RydWN0IG5kX21zZyAqKXNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYik7CisJc3RydWN0IGluNl9hZGRyICpzYWRkciA9ICZpcHY2X2hkcihza2IpLT5zYWRkcjsKKwlzdHJ1Y3QgaW42X2FkZHIgKmRhZGRyID0gJmlwdjZfaGRyKHNrYiktPmRhZGRyOwogCXU4ICpsbGFkZHIgPSBOVUxMOwotCXUzMiBuZG9wdGxlbiA9IHNrYi0+dGFpbCAtIG1zZy0+b3B0OworCXUzMiBuZG9wdGxlbiA9IHNrYi0+dGFpbCAtIChza2ItPnRyYW5zcG9ydF9oZWFkZXIgKworCQkJCSAgICBvZmZzZXRvZihzdHJ1Y3QgbmRfbXNnLCBvcHQpKTsKIAlzdHJ1Y3QgbmRpc2Nfb3B0aW9ucyBuZG9wdHM7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHNrYi0+ZGV2OwogCXN0cnVjdCBpbmV0Nl9pZmFkZHIgKmlmcDsKQEAgLTc5NiwyOCArNzEzLDQwIEBACiAJaW5jID0gaXB2Nl9hZGRyX2lzX211bHRpY2FzdChkYWRkcik7CiAKIAlpZiAoKGlmcCA9IGlwdjZfZ2V0X2lmYWRkcigmbXNnLT50YXJnZXQsIGRldiwgMSkpICE9IE5VTEwpIHsKLQkJaWYgKGlmcC0+ZmxhZ3MgJiBJRkFfRl9URU5UQVRJVkUpIHsKLQkJCS8qIEFkZHJlc3MgaXMgdGVudGF0aXZlLiBJZiB0aGUgc291cmNlCi0JCQkgICBpcyB1bnNwZWNpZmllZCBhZGRyZXNzLCBpdCBpcyBzb21lb25lCi0JCQkgICBkb2VzIERBRCwgb3RoZXJ3aXNlIHdlIGlnbm9yZSBzb2xpY2l0YXRpb25zCi0JCQkgICB1bnRpbCBEQUQgdGltZXIgZXhwaXJlcy4KLQkJCSAqLwotCQkJaWYgKCFkYWQpCi0JCQkJZ290byBvdXQ7Ci0JCQlpZiAoZGV2LT50eXBlID09IEFSUEhSRF9JRUVFODAyX1RSKSB7Ci0JCQkJdW5zaWduZWQgY2hhciAqc2FkciA9IHNrYi0+bWFjLnJhdzsKLQkJCQlpZiAoKChzYWRyWzhdIF4gZGV2LT5kZXZfYWRkclswXSkgJiAweDdmKSA9PSAwICYmCi0JCQkJICAgIHNhZHJbOV0gPT0gZGV2LT5kZXZfYWRkclsxXSAmJgotCQkJCSAgICBzYWRyWzEwXSA9PSBkZXYtPmRldl9hZGRyWzJdICYmCi0JCQkJICAgIHNhZHJbMTFdID09IGRldi0+ZGV2X2FkZHJbM10gJiYKLQkJCQkgICAgc2FkclsxMl0gPT0gZGV2LT5kZXZfYWRkcls0XSAmJgotCQkJCSAgICBzYWRyWzEzXSA9PSBkZXYtPmRldl9hZGRyWzVdKSB7Ci0JCQkJCS8qIGxvb3BlZC1iYWNrIHRvIHVzICovCi0JCQkJCWdvdG8gb3V0OworCisJCWlmIChpZnAtPmZsYWdzICYgKElGQV9GX1RFTlRBVElWRXxJRkFfRl9PUFRJTUlTVElDKSkgeworCQkJaWYgKGRhZCkgeworCQkJCWlmIChkZXYtPnR5cGUgPT0gQVJQSFJEX0lFRUU4MDJfVFIpIHsKKwkJCQkJY29uc3QgdW5zaWduZWQgY2hhciAqc2FkcjsKKwkJCQkJc2FkciA9IHNrYl9tYWNfaGVhZGVyKHNrYik7CisJCQkJCWlmICgoKHNhZHJbOF0gXiBkZXYtPmRldl9hZGRyWzBdKSAmIDB4N2YpID09IDAgJiYKKwkJCQkJICAgIHNhZHJbOV0gPT0gZGV2LT5kZXZfYWRkclsxXSAmJgorCQkJCQkgICAgc2FkclsxMF0gPT0gZGV2LT5kZXZfYWRkclsyXSAmJgorCQkJCQkgICAgc2FkclsxMV0gPT0gZGV2LT5kZXZfYWRkclszXSAmJgorCQkJCQkgICAgc2FkclsxMl0gPT0gZGV2LT5kZXZfYWRkcls0XSAmJgorCQkJCQkgICAgc2FkclsxM10gPT0gZGV2LT5kZXZfYWRkcls1XSkgeworCQkJCQkJLyogbG9vcGVkLWJhY2sgdG8gdXMgKi8KKwkJCQkJCWdvdG8gb3V0OworCQkJCQl9CiAJCQkJfQorCisJCQkJLyoKKwkJCQkgKiBXZSBhcmUgY29sbGlkaW5nIHdpdGggYW5vdGhlciBub2RlCisJCQkJICogd2hvIGlzIGRvaW5nIERBRAorCQkJCSAqIHNvIGZhaWwgb3VyIERBRCBwcm9jZXNzCisJCQkJICovCisJCQkJYWRkcmNvbmZfZGFkX2ZhaWx1cmUoaWZwKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0gZWxzZSB7CisJCQkJLyoKKwkJCQkgKiBUaGlzIGlzIG5vdCBhIGRhZCBzb2xpY2l0YXRpb24uCisJCQkJICogSWYgd2UgYXJlIGFuIG9wdGltaXN0aWMgbm9kZSwKKwkJCQkgKiB3ZSBzaG91bGQgcmVzcG9uZC4KKwkJCQkgKiBPdGhlcndpc2UsIHdlIHNob3VsZCBpZ25vcmUgaXQuCisJCQkJICovCisJCQkJaWYgKCEoaWZwLT5mbGFncyAmIElGQV9GX09QVElNSVNUSUMpKQorCQkJCQlnb3RvIG91dDsKIAkJCX0KLQkJCWFkZHJjb25mX2RhZF9mYWlsdXJlKGlmcCk7Ci0JCQlyZXR1cm47CiAJCX0KIAogCQlpZGV2ID0gaWZwLT5pZGV2OwpAQCAtODk4LDExICs4MjcsMTIgQEAKIAogc3RhdGljIHZvaWQgbmRpc2NfcmVjdl9uYShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXN0cnVjdCBuZF9tc2cgKm1zZyA9IChzdHJ1Y3QgbmRfbXNnICopc2tiLT5oLnJhdzsKLQlzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyID0gJnNrYi0+bmguaXB2NmgtPnNhZGRyOwotCXN0cnVjdCBpbjZfYWRkciAqZGFkZHIgPSAmc2tiLT5uaC5pcHY2aC0+ZGFkZHI7CisJc3RydWN0IG5kX21zZyAqbXNnID0gKHN0cnVjdCBuZF9tc2cgKilza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpOworCXN0cnVjdCBpbjZfYWRkciAqc2FkZHIgPSAmaXB2Nl9oZHIoc2tiKS0+c2FkZHI7CisJc3RydWN0IGluNl9hZGRyICpkYWRkciA9ICZpcHY2X2hkcihza2IpLT5kYWRkcjsKIAl1OCAqbGxhZGRyID0gTlVMTDsKLQl1MzIgbmRvcHRsZW4gPSBza2ItPnRhaWwgLSBtc2ctPm9wdDsKKwl1MzIgbmRvcHRsZW4gPSBza2ItPnRhaWwgLSAoc2tiLT50cmFuc3BvcnRfaGVhZGVyICsKKwkJCQkgICAgb2Zmc2V0b2Yoc3RydWN0IG5kX21zZywgb3B0KSk7CiAJc3RydWN0IG5kaXNjX29wdGlvbnMgbmRvcHRzOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBza2ItPmRldjsKIAlzdHJ1Y3QgaW5ldDZfaWZhZGRyICppZnA7CkBAIC0xMDAwLDExICs5MzAsMTEgQEAKIAogc3RhdGljIHZvaWQgbmRpc2NfcmVjdl9ycyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXN0cnVjdCByc19tc2cgKnJzX21zZyA9IChzdHJ1Y3QgcnNfbXNnICopIHNrYi0+aC5yYXc7CisJc3RydWN0IHJzX21zZyAqcnNfbXNnID0gKHN0cnVjdCByc19tc2cgKilza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpOwogCXVuc2lnbmVkIGxvbmcgbmRvcHRsZW4gPSBza2ItPmxlbiAtIHNpemVvZigqcnNfbXNnKTsKIAlzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaDsKIAlzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2OwotCXN0cnVjdCBpbjZfYWRkciAqc2FkZHIgPSAmc2tiLT5uaC5pcHY2aC0+c2FkZHI7CisJc3RydWN0IGluNl9hZGRyICpzYWRkciA9ICZpcHY2X2hkcihza2IpLT5zYWRkcjsKIAlzdHJ1Y3QgbmRpc2Nfb3B0aW9ucyBuZG9wdHM7CiAJdTggKmxsYWRkciA9IE5VTEw7CiAKQEAgLTEwNTcsNyArOTg3LDcgQEAKIAogc3RhdGljIHZvaWQgbmRpc2Nfcm91dGVyX2Rpc2NvdmVyeShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXN0cnVjdCByYV9tc2cgKnJhX21zZyA9IChzdHJ1Y3QgcmFfbXNnICopIHNrYi0+aC5yYXc7CisJc3RydWN0IHJhX21zZyAqcmFfbXNnID0gKHN0cnVjdCByYV9tc2cgKilza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpOwogCXN0cnVjdCBuZWlnaGJvdXIgKm5laWdoID0gTlVMTDsKIAlzdHJ1Y3QgaW5ldDZfZGV2ICppbjZfZGV2OwogCXN0cnVjdCBydDZfaW5mbyAqcnQgPSBOVUxMOwpAQCAtMTA2OCw5ICs5OTgsOSBAQAogCiAJX191OCAqIG9wdCA9IChfX3U4ICopKHJhX21zZyArIDEpOwogCi0Jb3B0bGVuID0gKHNrYi0+dGFpbCAtIHNrYi0+aC5yYXcpIC0gc2l6ZW9mKHN0cnVjdCByYV9tc2cpOworCW9wdGxlbiA9IChza2ItPnRhaWwgLSBza2ItPnRyYW5zcG9ydF9oZWFkZXIpIC0gc2l6ZW9mKHN0cnVjdCByYV9tc2cpOwogCi0JaWYgKCEoaXB2Nl9hZGRyX3R5cGUoJnNrYi0+bmguaXB2NmgtPnNhZGRyKSAmIElQVjZfQUREUl9MSU5LTE9DQUwpKSB7CisJaWYgKCEoaXB2Nl9hZGRyX3R5cGUoJmlwdjZfaGRyKHNrYiktPnNhZGRyKSAmIElQVjZfQUREUl9MSU5LTE9DQUwpKSB7CiAJCU5EX1BSSU5USzIoS0VSTl9XQVJOSU5HCiAJCQkgICAiSUNNUHY2IFJBOiBzb3VyY2UgYWRkcmVzcyBpcyBub3QgbGluay1sb2NhbC5cbiIpOwogCQlyZXR1cm47CkBAIC0xMTM2LDcgKzEwNjYsNyBAQAogCQlwcmVmID0gSUNNUFY2X1JPVVRFUl9QUkVGX01FRElVTTsKICNlbmRpZgogCi0JcnQgPSBydDZfZ2V0X2RmbHRfcm91dGVyKCZza2ItPm5oLmlwdjZoLT5zYWRkciwgc2tiLT5kZXYpOworCXJ0ID0gcnQ2X2dldF9kZmx0X3JvdXRlcigmaXB2Nl9oZHIoc2tiKS0+c2FkZHIsIHNrYi0+ZGV2KTsKIAogCWlmIChydCkKIAkJbmVpZ2ggPSBydC0+cnQ2aV9uZXh0aG9wOwpAQCAtMTE1MSw3ICsxMDgxLDcgQEAKIAkJTkRfUFJJTlRLMyhLRVJOX0RFQlVHCiAJCQkgICAiSUNNUHY2IFJBOiBhZGRpbmcgZGVmYXVsdCByb3V0ZXIuXG4iKTsKIAotCQlydCA9IHJ0Nl9hZGRfZGZsdF9yb3V0ZXIoJnNrYi0+bmguaXB2NmgtPnNhZGRyLCBza2ItPmRldiwgcHJlZik7CisJCXJ0ID0gcnQ2X2FkZF9kZmx0X3JvdXRlcigmaXB2Nl9oZHIoc2tiKS0+c2FkZHIsIHNrYi0+ZGV2LCBwcmVmKTsKIAkJaWYgKHJ0ID09IE5VTEwpIHsKIAkJCU5EX1BSSU5USzAoS0VSTl9FUlIKIAkJCQkgICAiSUNNUHY2IFJBOiAlcygpIGZhaWxlZCB0byBhZGQgZGVmYXVsdCByb3V0ZS5cbiIsCkBAIC0xMjIzLDcgKzExNTMsNyBAQAogCSAqLwogCiAJaWYgKCFuZWlnaCkKLQkJbmVpZ2ggPSBfX25laWdoX2xvb2t1cCgmbmRfdGJsLCAmc2tiLT5uaC5pcHY2aC0+c2FkZHIsCisJCW5laWdoID0gX19uZWlnaF9sb29rdXAoJm5kX3RibCwgJmlwdjZfaGRyKHNrYiktPnNhZGRyLAogCQkJCSAgICAgICBza2ItPmRldiwgMSk7CiAJaWYgKG5laWdoKSB7CiAJCXU4ICpsbGFkZHIgPSBOVUxMOwpAQCAtMTI1Miw3ICsxMTgyLDcgQEAKIAkJCWlmICgoKHN0cnVjdCByb3V0ZV9pbmZvICopcCktPnByZWZpeF9sZW4gPiBpbjZfZGV2LT5jbmYuYWNjZXB0X3JhX3J0X2luZm9fbWF4X3BsZW4pCiAJCQkJY29udGludWU7CiAJCQlydDZfcm91dGVfcmN2KHNrYi0+ZGV2LCAodTgqKXAsIChwLT5uZF9vcHRfbGVuKSA8PCAzLAotCQkJCSAgICAgICZza2ItPm5oLmlwdjZoLT5zYWRkcik7CisJCQkJICAgICAgJmlwdjZfaGRyKHNrYiktPnNhZGRyKTsKIAkJfQogCX0KICNlbmRpZgpAQCAtMTMxMSwxMyArMTI0MSwxMyBAQAogCWludCBvcHRsZW47CiAJdTggKmxsYWRkciA9IE5VTEw7CiAKLQlpZiAoIShpcHY2X2FkZHJfdHlwZSgmc2tiLT5uaC5pcHY2aC0+c2FkZHIpICYgSVBWNl9BRERSX0xJTktMT0NBTCkpIHsKKwlpZiAoIShpcHY2X2FkZHJfdHlwZSgmaXB2Nl9oZHIoc2tiKS0+c2FkZHIpICYgSVBWNl9BRERSX0xJTktMT0NBTCkpIHsKIAkJTkRfUFJJTlRLMihLRVJOX1dBUk5JTkcKIAkJCSAgICJJQ01QdjYgUmVkaXJlY3Q6IHNvdXJjZSBhZGRyZXNzIGlzIG5vdCBsaW5rLWxvY2FsLlxuIik7CiAJCXJldHVybjsKIAl9CiAKLQlvcHRsZW4gPSBza2ItPnRhaWwgLSBza2ItPmgucmF3OworCW9wdGxlbiA9IHNrYi0+dGFpbCAtIHNrYi0+dHJhbnNwb3J0X2hlYWRlcjsKIAlvcHRsZW4gLT0gc2l6ZW9mKHN0cnVjdCBpY21wNmhkcikgKyAyICogc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcik7CiAKIAlpZiAob3B0bGVuIDwgMCkgewpAQCAtMTMyNiw3ICsxMjU2LDcgQEAKIAkJcmV0dXJuOwogCX0KIAotCWljbXBoID0gKHN0cnVjdCBpY21wNmhkciAqKSBza2ItPmgucmF3OworCWljbXBoID0gaWNtcDZfaGRyKHNrYik7CiAJdGFyZ2V0ID0gKHN0cnVjdCBpbjZfYWRkciAqKSAoaWNtcGggKyAxKTsKIAlkZXN0ID0gdGFyZ2V0ICsgMTsKIApAQCAtMTM3Niw4ICsxMzA2LDggQEAKIAogCW5laWdoID0gX19uZWlnaF9sb29rdXAoJm5kX3RibCwgdGFyZ2V0LCBza2ItPmRldiwgMSk7CiAJaWYgKG5laWdoKSB7Ci0JCXJ0Nl9yZWRpcmVjdChkZXN0LCAmc2tiLT5uaC5pcHY2aC0+ZGFkZHIsCi0JCQkgICAgICZza2ItPm5oLmlwdjZoLT5zYWRkciwgbmVpZ2gsIGxsYWRkciwKKwkJcnQ2X3JlZGlyZWN0KGRlc3QsICZpcHY2X2hkcihza2IpLT5kYWRkciwKKwkJCSAgICAgJmlwdjZfaGRyKHNrYiktPnNhZGRyLCBuZWlnaCwgbGxhZGRyLAogCQkJICAgICBvbl9saW5rKTsKIAkJbmVpZ2hfcmVsZWFzZShuZWlnaCk7CiAJfQpAQCAtMTQwNiwyMSArMTMzNiwyMSBAQAogCiAJZGV2ID0gc2tiLT5kZXY7CiAKLQlpZiAoaXB2Nl9nZXRfbGxhZGRyKGRldiwgJnNhZGRyX2J1ZikpIHsKKwlpZiAoaXB2Nl9nZXRfbGxhZGRyKGRldiwgJnNhZGRyX2J1ZiwgSUZBX0ZfVEVOVEFUSVZFKSkgewogCQlORF9QUklOVEsyKEtFUk5fV0FSTklORwogCQkJICAgIklDTVB2NiBSZWRpcmVjdDogbm8gbGluay1sb2NhbCBhZGRyZXNzIG9uICVzXG4iLAogCQkJICAgZGV2LT5uYW1lKTsKIAkJcmV0dXJuOwogCX0KIAotCWlmICghaXB2Nl9hZGRyX2VxdWFsKCZza2ItPm5oLmlwdjZoLT5kYWRkciwgdGFyZ2V0KSAmJgorCWlmICghaXB2Nl9hZGRyX2VxdWFsKCZpcHY2X2hkcihza2IpLT5kYWRkciwgdGFyZ2V0KSAmJgogCSAgICAhKGlwdjZfYWRkcl90eXBlKHRhcmdldCkgJiBJUFY2X0FERFJfTElOS0xPQ0FMKSkgewogCQlORF9QUklOVEsyKEtFUk5fV0FSTklORwogCQkJIklDTVB2NiBSZWRpcmVjdDogdGFyZ2V0IGFkZHJlc3MgaXMgbm90IGxpbmstbG9jYWwuXG4iKTsKIAkJcmV0dXJuOwogCX0KIAotCW5kaXNjX2Zsb3dfaW5pdCgmZmwsIE5ESVNDX1JFRElSRUNULCAmc2FkZHJfYnVmLCAmc2tiLT5uaC5pcHY2aC0+c2FkZHIsCisJbmRpc2NfZmxvd19pbml0KCZmbCwgTkRJU0NfUkVESVJFQ1QsICZzYWRkcl9idWYsICZpcHY2X2hkcihza2IpLT5zYWRkciwKIAkJCWRldi0+aWZpbmRleCk7CiAKIAlkc3QgPSBpcDZfcm91dGVfb3V0cHV0KE5VTEwsICZmbCk7CkBAIC0xNDc1LDExICsxNDA1LDEyIEBACiAJaGxlbiA9IDA7CiAKIAlza2JfcmVzZXJ2ZShidWZmLCBMTF9SRVNFUlZFRF9TUEFDRShkZXYpKTsKLQlpcDZfbmRfaGRyKHNrLCBidWZmLCBkZXYsICZzYWRkcl9idWYsICZza2ItPm5oLmlwdjZoLT5zYWRkciwKKwlpcDZfbmRfaGRyKHNrLCBidWZmLCBkZXYsICZzYWRkcl9idWYsICZpcHY2X2hkcihza2IpLT5zYWRkciwKIAkJICAgSVBQUk9UT19JQ01QVjYsIGxlbik7CiAKLQlpY21waCA9IChzdHJ1Y3QgaWNtcDZoZHIgKilza2JfcHV0KGJ1ZmYsIGxlbik7Ci0JYnVmZi0+aC5yYXcgPSAodW5zaWduZWQgY2hhciopaWNtcGg7CisJc2tiX3NldF90cmFuc3BvcnRfaGVhZGVyKGJ1ZmYsIHNrYl90YWlsX3BvaW50ZXIoYnVmZikgLSBidWZmLT5kYXRhKTsKKwlza2JfcHV0KGJ1ZmYsIGxlbik7CisJaWNtcGggPSBpY21wNl9oZHIoYnVmZik7CiAKIAltZW1zZXQoaWNtcGgsIDAsIHNpemVvZihzdHJ1Y3QgaWNtcDZoZHIpKTsKIAlpY21waC0+aWNtcDZfdHlwZSA9IE5ESVNDX1JFRElSRUNUOwpAQCAtMTQ5MSw3ICsxNDIyLDcgQEAKIAlhZGRycCA9IChzdHJ1Y3QgaW42X2FkZHIgKikoaWNtcGggKyAxKTsKIAlpcHY2X2FkZHJfY29weShhZGRycCwgdGFyZ2V0KTsKIAlhZGRycCsrOwotCWlwdjZfYWRkcl9jb3B5KGFkZHJwLCAmc2tiLT5uaC5pcHY2aC0+ZGFkZHIpOworCWlwdjZfYWRkcl9jb3B5KGFkZHJwLCAmaXB2Nl9oZHIoc2tiKS0+ZGFkZHIpOwogCiAJb3B0ID0gKHU4KikgKGFkZHJwICsgMSk7CiAKQEAgLTE1MTIsOSArMTQ0Myw5IEBACiAJKihvcHQrKykgPSAocmRfbGVuID4+IDMpOwogCW9wdCArPSA2OwogCi0JbWVtY3B5KG9wdCwgc2tiLT5uaC5pcHY2aCwgcmRfbGVuIC0gOCk7CisJbWVtY3B5KG9wdCwgaXB2Nl9oZHIoc2tiKSwgcmRfbGVuIC0gOCk7CiAKLQlpY21waC0+aWNtcDZfY2tzdW0gPSBjc3VtX2lwdjZfbWFnaWMoJnNhZGRyX2J1ZiwgJnNrYi0+bmguaXB2NmgtPnNhZGRyLAorCWljbXBoLT5pY21wNl9ja3N1bSA9IGNzdW1faXB2Nl9tYWdpYygmc2FkZHJfYnVmLCAmaXB2Nl9oZHIoc2tiKS0+c2FkZHIsCiAJCQkJCSAgICAgbGVuLCBJUFBST1RPX0lDTVBWNiwKIAkJCQkJICAgICBjc3VtX3BhcnRpYWwoKHU4ICopIGljbXBoLCBsZW4sIDApKTsKIApAQCAtMTU0NCwxNCArMTQ3NSwxNCBAQAogCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHNrYi0+bGVuKSkKIAkJcmV0dXJuIDA7CiAKLQltc2cgPSAoc3RydWN0IG5kX21zZyAqKSBza2ItPmgucmF3OworCW1zZyA9IChzdHJ1Y3QgbmRfbXNnICopc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKIAotCV9fc2tiX3B1c2goc2tiLCBza2ItPmRhdGEtc2tiLT5oLnJhdyk7CisJX19za2JfcHVzaChza2IsIHNrYi0+ZGF0YSAtIHNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYikpOwogCi0JaWYgKHNrYi0+bmguaXB2NmgtPmhvcF9saW1pdCAhPSAyNTUpIHsKKwlpZiAoaXB2Nl9oZHIoc2tiKS0+aG9wX2xpbWl0ICE9IDI1NSkgewogCQlORF9QUklOVEsyKEtFUk5fV0FSTklORwogCQkJICAgIklDTVB2NiBORElTQzogaW52YWxpZCBob3AtbGltaXQ6ICVkXG4iLAotCQkJICAgc2tiLT5uaC5pcHY2aC0+aG9wX2xpbWl0KTsKKwkJCSAgIGlwdjZfaGRyKHNrYiktPmhvcF9saW1pdCk7CiAJCXJldHVybiAwOwogCX0KIApAQCAtMTU4NCw3ICsxNTE1LDcgQEAKIAljYXNlIE5ESVNDX1JFRElSRUNUOgogCQluZGlzY19yZWRpcmVjdF9yY3Yoc2tiKTsKIAkJYnJlYWs7Ci0JfTsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyLmMKaW5kZXggMWM0MDVkZC4uMzhiMTQ5NiAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyLmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyLmMKQEAgLTExLDcgKzExLDcgQEAKIAogaW50IGlwNl9yb3V0ZV9tZV9oYXJkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlzdHJ1Y3QgaXB2NmhkciAqaXBoID0gc2tiLT5uaC5pcHY2aDsKKwlzdHJ1Y3QgaXB2NmhkciAqaXBoID0gaXB2Nl9oZHIoc2tiKTsKIAlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3Q7CiAJc3RydWN0IGZsb3dpIGZsID0gewogCQkub2lmID0gc2tiLT5zayA/IHNrYi0+c2stPnNrX2JvdW5kX2Rldl9pZiA6IDAsCkBAIC02MSw3ICs2MSw3IEBACiAJc3RydWN0IGlwNl9ydF9pbmZvICpydF9pbmZvID0gbmZfaW5mb19yZXJvdXRlKGluZm8pOwogCiAJaWYgKGluZm8tPmhvb2sgPT0gTkZfSVA2X0xPQ0FMX09VVCkgewotCQlzdHJ1Y3QgaXB2NmhkciAqaXBoID0gc2tiLT5uaC5pcHY2aDsKKwkJc3RydWN0IGlwdjZoZHIgKmlwaCA9IGlwdjZfaGRyKHNrYik7CiAKIAkJcnRfaW5mby0+ZGFkZHIgPSBpcGgtPmRhZGRyOwogCQlydF9pbmZvLT5zYWRkciA9IGlwaC0+c2FkZHI7CkBAIC03Myw3ICs3Myw3IEBACiAJc3RydWN0IGlwNl9ydF9pbmZvICpydF9pbmZvID0gbmZfaW5mb19yZXJvdXRlKGluZm8pOwogCiAJaWYgKGluZm8tPmhvb2sgPT0gTkZfSVA2X0xPQ0FMX09VVCkgewotCQlzdHJ1Y3QgaXB2NmhkciAqaXBoID0gKCpwc2tiKS0+bmguaXB2Nmg7CisJCXN0cnVjdCBpcHY2aGRyICppcGggPSBpcHY2X2hkcigqcHNrYik7CiAJCWlmICghaXB2Nl9hZGRyX2VxdWFsKCZpcGgtPmRhZGRyLCAmcnRfaW5mby0+ZGFkZHIpIHx8CiAJCSAgICAhaXB2Nl9hZGRyX2VxdWFsKCZpcGgtPnNhZGRyLCAmcnRfaW5mby0+c2FkZHIpKQogCQkJcmV0dXJuIGlwNl9yb3V0ZV9tZV9oYXJkZXIoKnBza2IpOwpAQCAtODQsNyArODQsNyBAQAogX19zdW0xNiBuZl9pcDZfY2hlY2tzdW0oc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IGhvb2ssCiAJCQkgICAgIHVuc2lnbmVkIGludCBkYXRhb2ZmLCB1X2ludDhfdCBwcm90b2NvbCkKIHsKLQlzdHJ1Y3QgaXB2NmhkciAqaXA2aCA9IHNrYi0+bmguaXB2Nmg7CisJc3RydWN0IGlwdjZoZHIgKmlwNmggPSBpcHY2X2hkcihza2IpOwogCV9fc3VtMTYgY3N1bSA9IDA7CiAKIAlzd2l0Y2ggKHNrYi0+aXBfc3VtbWVkKSB7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2X3F1ZXVlLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2X3F1ZXVlLmMKaW5kZXggZmRiMzBhNS4uMDAwNGRiMyAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNl9xdWV1ZS5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZfcXVldWUuYwpAQCAtMTEsMTggKzExLDYgQEAKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogMjAwMS0xMS0wNjogRmlyc3QgdHJ5LiBXb3JraW5nIHdpdGggaXBfcXVldWUuYyBmb3IgSVB2NCBhbmQgdHJ5aW5nCi0gKiAgICAgICAgICAgICB0byBhZGFwdCBpdCB0byBJUHY2Ci0gKiAgICAgICAgICAgICBIRUFWSUxZIGJhc2VkIGluIGlwcXVldWUuYyBieSBKYW1lcyBNb3JyaXMuIEl0J3MganVzdAotICogICAgICAgICAgICAgYSBsaXR0bGUgbW9kaWZpZWQgdmVyc2lvbiBvZiBpdCwgc28gaGUncyBuZWFybHkgdGhlCi0gKiAgICAgICAgICAgICByZWFsIGNvZGVyIG9mIHRoaXMuCi0gKiAgICAgICAgICAgICBGZXcgY2hhbmdlcyBuZWVkZWQsIG1haW5seSB0aGUgaGFyZF9yb3V0aW5nIGNvZGUgYW5kCi0gKiAgICAgICAgICAgICB0aGUgbmV0bGluayBzb2NrZXQgcHJvdG9jb2wgKHdlJ3JlIE5FVExJTktfSVA2X0ZXKS4KLSAqIDIwMDItMDYtMjU6IENvZGUgY2xlYW51cC4gW0pNOiBwb3J0ZWQgY2xlYW51cCBvdmVyIGZyb20gaXBfcXVldWUuY10KLSAqIDIwMDUtMDItMDQ6IEFkZGVkIC9wcm9jIGNvdW50ZXIgZm9yIGRyb3BwZWQgcGFja2V0czsgZml4ZWQgc28KLSAqICAgICAgICAgICAgIHBhY2tldHMgYXJlbid0IGRlbGl2ZXJlZCB0byB1c2VyIHNwYWNlIGlmIHRoZXkncmUgZ29pbmcKLSAqICAgICAgICAgICAgIHRvIGJlIGRyb3BwZWQuCiAgKi8KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KQEAgLTE4OSwxMiArMTc3LDEzIEBACiBzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKgogaXBxX2J1aWxkX3BhY2tldF9tZXNzYWdlKHN0cnVjdCBpcHFfcXVldWVfZW50cnkgKmVudHJ5LCBpbnQgKmVycnApCiB7Ci0JdW5zaWduZWQgY2hhciAqb2xkX3RhaWw7CisJc2tfYnVmZl9kYXRhX3Qgb2xkX3RhaWw7CiAJc2l6ZV90IHNpemUgPSAwOwogCXNpemVfdCBkYXRhX2xlbiA9IDA7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3QgaXBxX3BhY2tldF9tc2cgKnBtc2c7CiAJc3RydWN0IG5sbXNnaGRyICpubGg7CisJc3RydWN0IHRpbWV2YWwgdHY7CiAKIAlyZWFkX2xvY2tfYmgoJnF1ZXVlX2xvY2spOwogCkBAIC0yMzIsMTUgKzIyMSwxNiBAQAogCWlmICghc2tiKQogCQlnb3RvIG5sbXNnX2ZhaWx1cmU7CiAKLQlvbGRfdGFpbD0gc2tiLT50YWlsOworCW9sZF90YWlsID0gc2tiLT50YWlsOwogCW5saCA9IE5MTVNHX1BVVChza2IsIDAsIDAsIElQUU1fUEFDS0VULCBzaXplIC0gc2l6ZW9mKCpubGgpKTsKIAlwbXNnID0gTkxNU0dfREFUQShubGgpOwogCW1lbXNldChwbXNnLCAwLCBzaXplb2YoKnBtc2cpKTsKIAogCXBtc2ctPnBhY2tldF9pZCAgICAgICA9ICh1bnNpZ25lZCBsb25nICllbnRyeTsKIAlwbXNnLT5kYXRhX2xlbiAgICAgICAgPSBkYXRhX2xlbjsKLQlwbXNnLT50aW1lc3RhbXBfc2VjICAgPSBlbnRyeS0+c2tiLT50c3RhbXAub2ZmX3NlYzsKLQlwbXNnLT50aW1lc3RhbXBfdXNlYyAgPSBlbnRyeS0+c2tiLT50c3RhbXAub2ZmX3VzZWM7CisJdHYgPSBrdGltZV90b190aW1ldmFsKGVudHJ5LT5za2ItPnRzdGFtcCk7CisJcG1zZy0+dGltZXN0YW1wX3NlYyAgID0gdHYudHZfc2VjOworCXBtc2ctPnRpbWVzdGFtcF91c2VjICA9IHR2LnR2X3VzZWM7CiAJcG1zZy0+bWFyayAgICAgICAgICAgID0gZW50cnktPnNrYi0+bWFyazsKIAlwbXNnLT5ob29rICAgICAgICAgICAgPSBlbnRyeS0+aW5mby0+aG9vazsKIAlwbXNnLT5od19wcm90b2NvbCAgICAgPSBlbnRyeS0+c2tiLT5wcm90b2NvbDsKQEAgLTM3Niw3ICszNjYsNyBAQAogCX0KIAlpZiAoIXNrYl9tYWtlX3dyaXRhYmxlKCZlLT5za2IsIHYtPmRhdGFfbGVuKSkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JbWVtY3B5KGUtPnNrYi0+ZGF0YSwgdi0+cGF5bG9hZCwgdi0+ZGF0YV9sZW4pOworCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhKGUtPnNrYiwgdi0+cGF5bG9hZCwgdi0+ZGF0YV9sZW4pOwogCWUtPnNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKIAogCXJldHVybiAwOwpAQCAtNDg1LDcgKzQ3NSw3IEBACiAJaWYgKHNrYmxlbiA8IHNpemVvZigqbmxoKSkKIAkJcmV0dXJuOwogCi0JbmxoID0gKHN0cnVjdCBubG1zZ2hkciAqKXNrYi0+ZGF0YTsKKwlubGggPSBubG1zZ19oZHIoc2tiKTsKIAlubG1zZ2xlbiA9IG5saC0+bmxtc2dfbGVuOwogCWlmIChubG1zZ2xlbiA8IHNpemVvZigqbmxoKSB8fCBza2JsZW4gPCBubG1zZ2xlbikKIAkJcmV0dXJuOwpAQCAtNjY3LDcgKzY1Nyw3IEBACiAJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jOwogCiAJbmV0bGlua19yZWdpc3Rlcl9ub3RpZmllcigmaXBxX25sX25vdGlmaWVyKTsKLQlpcHFubCA9IG5ldGxpbmtfa2VybmVsX2NyZWF0ZShORVRMSU5LX0lQNl9GVywgMCwgaXBxX3Jjdl9zaywKKwlpcHFubCA9IG5ldGxpbmtfa2VybmVsX2NyZWF0ZShORVRMSU5LX0lQNl9GVywgMCwgaXBxX3Jjdl9zaywgTlVMTCwKIAkJCQkgICAgICBUSElTX01PRFVMRSk7CiAJaWYgKGlwcW5sID09IE5VTEwpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJpcDZfcXVldWU6IGZhaWxlZCB0byBjcmVhdGUgbmV0bGluayBzb2NrZXRcbiIpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNl90YWJsZXMuYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZfdGFibGVzLmMKaW5kZXggN2M1MTJlMS4uOWFhNjI0MCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNl90YWJsZXMuYworKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2X3RhYmxlcy5jCkBAIC03LDE1ICs3LDYgQEAKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogMTkgSmFuIDIwMDIgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KLSAqIAktIGluY3JlYXNlIG1vZHVsZSB1c2FnZSBjb3VudCBhcyBzb29uIGFzIHdlIGhhdmUgcnVsZXMgaW5zaWRlCi0gKiAJICBhIHRhYmxlCi0gKiAwNiBKdW4gMjAwMiBBbmRyYXMgS2lzLVN6YWJvIDxraXN6YUBzY2guYm1lLmh1PgotICogICAgICAtIG5ldyBleHRlbnNpb24gaGVhZGVyIHBhcnNlciBjb2RlCi0gKiAxNSBPY3QgMjAwNSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAbmV0ZmlsdGVyLm9yZz4KLSAqIAktIFVuaWZpY2F0aW9uIG9mIHtpcCxpcDZ9X3RhYmxlcyBpbnRvIHhfdGFibGVzCi0gKiAJLSBSZW1vdmVkIHRjcCBhbmQgdWRwIGNvZGUsIHNpbmNlIGl0J3Mgbm90IGlwdjYgc3BlY2lmaWMKICAqLwogCiAjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgpAQCAtMTE1LDcgKzEwNiw3IEBACiB7CiAJc2l6ZV90IGk7CiAJdW5zaWduZWQgbG9uZyByZXQ7Ci0JY29uc3Qgc3RydWN0IGlwdjZoZHIgKmlwdjYgPSBza2ItPm5oLmlwdjZoOworCWNvbnN0IHN0cnVjdCBpcHY2aGRyICppcHY2ID0gaXB2Nl9oZHIoc2tiKTsKIAogI2RlZmluZSBGV0lOVihib29sLGludmZsZykgKChib29sKSBeICEhKGlwNmluZm8tPmludmZsYWdzICYgaW52ZmxnKSkKIApAQCAtMzAxLDcgKzI5Miw3IEBACiAJCQkJZ290byBub19tYXRjaDsKIAogCQkJQUREX0NPVU5URVIoZS0+Y291bnRlcnMsCi0JCQkJICAgIG50b2hzKCgqcHNrYiktPm5oLmlwdjZoLT5wYXlsb2FkX2xlbikKKwkJCQkgICAgbnRvaHMoaXB2Nl9oZHIoKnBza2IpLT5wYXlsb2FkX2xlbikKIAkJCQkgICAgKyBJUFY2X0hEUl9MRU4sCiAJCQkJICAgIDEpOwogCkBAIC0xNDQ4LDggKzE0MzksOCBAQAogaW50IGlwdjZfZmluZF9oZHIoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50ICpvZmZzZXQsCiAJCSAgaW50IHRhcmdldCwgdW5zaWduZWQgc2hvcnQgKmZyYWdvZmYpCiB7Ci0JdW5zaWduZWQgaW50IHN0YXJ0ID0gKHU4Kikoc2tiLT5uaC5pcHY2aCArIDEpIC0gc2tiLT5kYXRhOwotCXU4IG5leHRoZHIgPSBza2ItPm5oLmlwdjZoLT5uZXh0aGRyOworCXVuc2lnbmVkIGludCBzdGFydCA9IHNrYl9uZXR3b3JrX29mZnNldChza2IpICsgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKTsKKwl1OCBuZXh0aGRyID0gaXB2Nl9oZHIoc2tiKS0+bmV4dGhkcjsKIAl1bnNpZ25lZCBpbnQgbGVuID0gc2tiLT5sZW4gLSBzdGFydDsKIAogCWlmIChmcmFnb2ZmKQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfSEwuYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X0hMLmMKaW5kZXggY2NiYWI2Ni4uNDExNWE1NyAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfSEwuYworKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9ITC5jCkBAIC0zMiw3ICszMiw3IEBACiAJaWYgKCFza2JfbWFrZV93cml0YWJsZShwc2tiLCAoKnBza2IpLT5sZW4pKQogCQlyZXR1cm4gTkZfRFJPUDsKIAotCWlwNmggPSAoKnBza2IpLT5uaC5pcHY2aDsKKwlpcDZoID0gaXB2Nl9oZHIoKnBza2IpOwogCiAJc3dpdGNoIChpbmZvLT5tb2RlKSB7CiAJCWNhc2UgSVA2VF9ITF9TRVQ6CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9MT0cuYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X0xPRy5jCmluZGV4IGFmYWEwMzkuLjViYjljZDMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X0xPRy5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X0xPRy5jCkBAIC0zOTYsOCArMzk2LDggQEAKIAkJLyogTUFDIGxvZ2dpbmcgZm9yIGlucHV0IGNoYWluIG9ubHkuICovCiAJCXByaW50aygiTUFDPSIpOwogCQlpZiAoc2tiLT5kZXYgJiYgKGxlbiA9IHNrYi0+ZGV2LT5oYXJkX2hlYWRlcl9sZW4pICYmCi0JCSAgICBza2ItPm1hYy5yYXcgIT0gc2tiLT5uaC5yYXcpIHsKLQkJCXVuc2lnbmVkIGNoYXIgKnAgPSBza2ItPm1hYy5yYXc7CisJCSAgICBza2ItPm1hY19oZWFkZXIgIT0gc2tiLT5uZXR3b3JrX2hlYWRlcikgeworCQkJY29uc3QgdW5zaWduZWQgY2hhciAqcCA9IHNrYl9tYWNfaGVhZGVyKHNrYik7CiAJCQlpbnQgaTsKIAogCQkJaWYgKHNrYi0+ZGV2LT50eXBlID09IEFSUEhSRF9TSVQgJiYKQEAgLTQxMiw3ICs0MTIsOCBAQAogCQkJcHJpbnRrKCIgIik7CiAKIAkJCWlmIChza2ItPmRldi0+dHlwZSA9PSBBUlBIUkRfU0lUKSB7Ci0JCQkJc3RydWN0IGlwaGRyICppcGggPSAoc3RydWN0IGlwaGRyICopc2tiLT5tYWMucmF3OworCQkJCWNvbnN0IHN0cnVjdCBpcGhkciAqaXBoID0KKwkJCQkJKHN0cnVjdCBpcGhkciAqKXNrYl9tYWNfaGVhZGVyKHNrYik7CiAJCQkJcHJpbnRrKCJUVU5ORUw9JXUuJXUuJXUuJXUtPiV1LiV1LiV1LiV1ICIsCiAJCQkJICAgICAgIE5JUFFVQUQoaXBoLT5zYWRkciksCiAJCQkJICAgICAgIE5JUFFVQUQoaXBoLT5kYWRkcikpOwpAQCAtNDIxLDcgKzQyMiw3IEBACiAJCQlwcmludGsoIiAiKTsKIAl9CiAKLQlkdW1wX3BhY2tldChsb2dpbmZvLCBza2IsICh1OCopc2tiLT5uaC5pcHY2aCAtIHNrYi0+ZGF0YSwgMSk7CisJZHVtcF9wYWNrZXQobG9naW5mbywgc2tiLCBza2JfbmV0d29ya19vZmZzZXQoc2tiKSwgMSk7CiAJcHJpbnRrKCJcbiIpOwogCXNwaW5fdW5sb2NrX2JoKCZsb2dfbG9jayk7CiB9CkBAIC00ODksMTQgKzQ5MCwxMCBAQAogCXJldCA9IHh0X3JlZ2lzdGVyX3RhcmdldCgmaXA2dF9sb2dfcmVnKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKLQlpZiAobmZfbG9nX3JlZ2lzdGVyKFBGX0lORVQ2LCAmaXA2dF9sb2dnZXIpIDwgMCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJpcDZ0X0xPRzogbm90IGxvZ2dpbmcgdmlhIHN5c3RlbSBjb25zb2xlICIKLQkJICAgICAgICJzaW5jZSBzb21lYm9keSBlbHNlIGFscmVhZHkgcmVnaXN0ZXJlZCBmb3IgUEZfSU5FVDZcbiIpOwotCQkvKiB3ZSBjYW5ub3QgbWFrZSBtb2R1bGUgbG9hZCBmYWlsIGhlcmUsIHNpbmNlIG90aGVyd2lzZQotCQkgKiBpcDZ0YWJsZXMgdXNlcnNwYWNlIHdvdWxkIGFib3J0ICovCi0JfQotCi0JcmV0dXJuIDA7CisJcmV0ID0gbmZfbG9nX3JlZ2lzdGVyKFBGX0lORVQ2LCAmaXA2dF9sb2dnZXIpOworCWlmIChyZXQgPCAwICYmIHJldCAhPSAtRUVYSVNUKQorCQl4dF91bnJlZ2lzdGVyX3RhcmdldCgmaXA2dF9sb2dfcmVnKTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgaXA2dF9sb2dfZmluaSh2b2lkKQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfUkVKRUNULmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9SRUpFQ1QuYwppbmRleCA2YWJlZTk0Li5jYjNkMjQxIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9SRUpFQ1QuYworKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9SRUpFQ1QuYwpAQCAtNDcsNyArNDcsNyBAQAogCXN0cnVjdCB0Y3BoZHIgb3RjcGgsICp0Y3BoOwogCXVuc2lnbmVkIGludCBvdGNwbGVuLCBoaF9sZW47CiAJaW50IHRjcGhvZmYsIG5lZWRzX2FjazsKLQlzdHJ1Y3QgaXB2NmhkciAqb2lwNmggPSBvbGRza2ItPm5oLmlwdjZoLCAqaXA2aDsKKwlzdHJ1Y3QgaXB2NmhkciAqb2lwNmggPSBpcHY2X2hkcihvbGRza2IpLCAqaXA2aDsKIAlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QgPSBOVUxMOwogCXU4IHByb3RvOwogCXN0cnVjdCBmbG93aSBmbDsKQEAgLTEyMCw4ICsxMjAsOSBAQAogCiAJc2tiX3Jlc2VydmUobnNrYiwgaGhfbGVuICsgZHN0LT5oZWFkZXJfbGVuKTsKIAotCWlwNmggPSBuc2tiLT5uaC5pcHY2aCA9IChzdHJ1Y3QgaXB2NmhkciAqKQotCQkJCQlza2JfcHV0KG5za2IsIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikpOworCXNrYl9wdXQobnNrYiwgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSk7CisJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKG5za2IpOworCWlwNmggPSBpcHY2X2hkcihuc2tiKTsKIAlpcDZoLT52ZXJzaW9uID0gNjsKIAlpcDZoLT5ob3BfbGltaXQgPSBkc3RfbWV0cmljKGRzdCwgUlRBWF9IT1BMSU1JVCk7CiAJaXA2aC0+bmV4dGhkciA9IElQUFJPVE9fVENQOwpAQCAtMTU1LDggKzE1Niw4IEBACiAJdGNwaC0+Y2hlY2sgPSAwOwogCiAJLyogQWRqdXN0IFRDUCBjaGVja3N1bSAqLwotCXRjcGgtPmNoZWNrID0gY3N1bV9pcHY2X21hZ2ljKCZuc2tiLT5uaC5pcHY2aC0+c2FkZHIsCi0JCQkJICAgICAgJm5za2ItPm5oLmlwdjZoLT5kYWRkciwKKwl0Y3BoLT5jaGVjayA9IGNzdW1faXB2Nl9tYWdpYygmaXB2Nl9oZHIobnNrYiktPnNhZGRyLAorCQkJCSAgICAgICZpcHY2X2hkcihuc2tiKS0+ZGFkZHIsCiAJCQkJICAgICAgc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpLCBJUFBST1RPX1RDUCwKIAkJCQkgICAgICBjc3VtX3BhcnRpYWwoKGNoYXIgKil0Y3BoLAogCQkJCQkJICAgc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpLCAwKSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9ldWk2NC5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfZXVpNjQuYwppbmRleCA5NjdiZWQ3Li4wZjNkZDkzIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9ldWk2NC5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2V1aTY0LmMKQEAgLTMyLDggKzMyLDggQEAKIAl1bnNpZ25lZCBjaGFyIGV1aTY0WzhdOwogCWludCBpID0gMDsKIAotCWlmICghKHNrYi0+bWFjLnJhdyA+PSBza2ItPmhlYWQgJiYKLQkgICAgICAoc2tiLT5tYWMucmF3ICsgRVRIX0hMRU4pIDw9IHNrYi0+ZGF0YSkgJiYKKwlpZiAoIShza2JfbWFjX2hlYWRlcihza2IpID49IHNrYi0+aGVhZCAmJgorCSAgICAgIChza2JfbWFjX2hlYWRlcihza2IpICsgRVRIX0hMRU4pIDw9IHNrYi0+ZGF0YSkgJiYKIAkgICAgb2Zmc2V0ICE9IDApIHsKIAkJKmhvdGRyb3AgPSAxOwogCQlyZXR1cm4gMDsKQEAgLTQyLDcgKzQyLDcgQEAKIAltZW1zZXQoZXVpNjQsIDAsIHNpemVvZihldWk2NCkpOwogCiAJaWYgKGV0aF9oZHIoc2tiKS0+aF9wcm90byA9PSBodG9ucyhFVEhfUF9JUFY2KSkgewotCQlpZiAoc2tiLT5uaC5pcHY2aC0+dmVyc2lvbiA9PSAweDYpIHsKKwkJaWYgKGlwdjZfaGRyKHNrYiktPnZlcnNpb24gPT0gMHg2KSB7CiAJCQltZW1jcHkoZXVpNjQsIGV0aF9oZHIoc2tiKS0+aF9zb3VyY2UsIDMpOwogCQkJbWVtY3B5KGV1aTY0ICsgNSwgZXRoX2hkcihza2IpLT5oX3NvdXJjZSArIDMsIDMpOwogCQkJZXVpNjRbM10gPSAweGZmOwpAQCAtNTAsNyArNTAsNyBAQAogCQkJZXVpNjRbMF0gfD0gMHgwMjsKIAogCQkJaSA9IDA7Ci0JCQl3aGlsZSAoKHNrYi0+bmguaXB2NmgtPnNhZGRyLnM2X2FkZHJbOCtpXSA9PSBldWk2NFtpXSkKKwkJCXdoaWxlICgoaXB2Nl9oZHIoc2tiKS0+c2FkZHIuczZfYWRkcls4ICsgaV0gPT0gZXVpNjRbaV0pCiAJCQkgICAgICAgJiYgKGkgPCA4KSkKIAkJCQlpKys7CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2hsLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9obC5jCmluZGV4IDM3YzhhNGQuLmQ2MDZjMGUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2hsLmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfaGwuYwpAQCAtMjUsNyArMjUsNyBAQAogCQkgaW50IG9mZnNldCwgdW5zaWduZWQgaW50IHByb3RvZmYsIGludCAqaG90ZHJvcCkKIHsKIAljb25zdCBzdHJ1Y3QgaXA2dF9obF9pbmZvICppbmZvID0gbWF0Y2hpbmZvOwotCWNvbnN0IHN0cnVjdCBpcHY2aGRyICppcDZoID0gc2tiLT5uaC5pcHY2aDsKKwljb25zdCBzdHJ1Y3QgaXB2NmhkciAqaXA2aCA9IGlwdjZfaGRyKHNrYik7CiAKIAlzd2l0Y2ggKGluZm8tPm1vZGUpIHsKIAkJY2FzZSBJUDZUX0hMX0VROgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfaXB2NmhlYWRlci5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfaXB2NmhlYWRlci5jCmluZGV4IDcwMGExMWQuLmZkNmEwODYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2lwdjZoZWFkZXIuYworKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9pcHY2aGVhZGVyLmMKQEAgLTQ1LDcgKzQ1LDcgQEAKIAkvKiBNYWtlIHN1cmUgdGhpcyBpc24ndCBhbiBldmlsIHBhY2tldCAqLwogCiAJLyogdHlwZSBvZiB0aGUgMXN0IGV4dGhkciAqLwotCW5leHRoZHIgPSBza2ItPm5oLmlwdjZoLT5uZXh0aGRyOworCW5leHRoZHIgPSBpcHY2X2hkcihza2IpLT5uZXh0aGRyOwogCS8qIHBvaW50ZXIgdG8gdGhlIDFzdCBleHRoZHIgKi8KIAlwdHIgPSBzaXplb2Yoc3RydWN0IGlwdjZoZHIpOwogCS8qIGF2YWlsYWJsZSBsZW5ndGggKi8KZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0YWJsZV9maWx0ZXIuYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0YWJsZV9maWx0ZXIuYwppbmRleCAxMTJhMjFkLi43NmYwY2Y2IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dGFibGVfZmlsdGVyLmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRhYmxlX2ZpbHRlci5jCkBAIC0xMDIsNyArMTAyLDcgQEAKICNpZiAwCiAJLyogcm9vdCBpcyBwbGF5aW5nIHdpdGggcmF3IHNvY2tldHMuICovCiAJaWYgKCgqcHNrYiktPmxlbiA8IHNpemVvZihzdHJ1Y3QgaXBoZHIpCi0JICAgIHx8ICgqcHNrYiktPm5oLmlwaC0+aWhsICogNCA8IHNpemVvZihzdHJ1Y3QgaXBoZHIpKSB7CisJICAgIHx8IGlwX2hkcmxlbigqcHNrYikgPCBzaXplb2Yoc3RydWN0IGlwaGRyKSkgewogCQlpZiAobmV0X3JhdGVsaW1pdCgpKQogCQkJcHJpbnRrKCJpcDZ0X2hvb2s6IGhhcHB5IGNyYWNraW5nLlxuIik7CiAJCXJldHVybiBORl9BQ0NFUFQ7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dGFibGVfbWFuZ2xlLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dGFibGVfbWFuZ2xlLmMKaW5kZXggMGM0NjhkMy4uYTlmMTBlMyAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRhYmxlX21hbmdsZS5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0YWJsZV9tYW5nbGUuYwpAQCAtNyw4ICs3LDYgQEAKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogRXh0ZW5kZWQgdG8gYWxsIGZpdmUgbmV0ZmlsdGVyIGhvb2tzIGJ5IEJyYWQgQ2hhcG1hbiAmIEhhcmFsZCBXZWx0ZQogICovCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2X3RhYmxlcy5oPgpAQCAtMTM4LDcgKzEzNiw3IEBACiAjaWYgMAogCS8qIHJvb3QgaXMgcGxheWluZyB3aXRoIHJhdyBzb2NrZXRzLiAqLwogCWlmICgoKnBza2IpLT5sZW4gPCBzaXplb2Yoc3RydWN0IGlwaGRyKQotCSAgICB8fCAoKnBza2IpLT5uaC5pcGgtPmlobCAqIDQgPCBzaXplb2Yoc3RydWN0IGlwaGRyKSkgeworCSAgICB8fCBpcF9oZHJsZW4oKnBza2IpIDwgc2l6ZW9mKHN0cnVjdCBpcGhkcikpIHsKIAkJaWYgKG5ldF9yYXRlbGltaXQoKSkKIAkJCXByaW50aygiaXA2dF9ob29rOiBoYXBweSBjcmFja2luZy5cbiIpOwogCQlyZXR1cm4gTkZfQUNDRVBUOwpAQCAtMTQ2LDIxICsxNDQsMjEgQEAKICNlbmRpZgogCiAJLyogc2F2ZSBzb3VyY2UvZGVzdCBhZGRyZXNzLCBtYXJrLCBob3BsaW1pdCwgZmxvd2xhYmVsLCBwcmlvcml0eSwgICovCi0JbWVtY3B5KCZzYWRkciwgJigqcHNrYiktPm5oLmlwdjZoLT5zYWRkciwgc2l6ZW9mKHNhZGRyKSk7Ci0JbWVtY3B5KCZkYWRkciwgJigqcHNrYiktPm5oLmlwdjZoLT5kYWRkciwgc2l6ZW9mKGRhZGRyKSk7CisJbWVtY3B5KCZzYWRkciwgJmlwdjZfaGRyKCpwc2tiKS0+c2FkZHIsIHNpemVvZihzYWRkcikpOworCW1lbWNweSgmZGFkZHIsICZpcHY2X2hkcigqcHNrYiktPmRhZGRyLCBzaXplb2YoZGFkZHIpKTsKIAltYXJrID0gKCpwc2tiKS0+bWFyazsKLQlob3BfbGltaXQgPSAoKnBza2IpLT5uaC5pcHY2aC0+aG9wX2xpbWl0OworCWhvcF9saW1pdCA9IGlwdjZfaGRyKCpwc2tiKS0+aG9wX2xpbWl0OwogCiAJLyogZmxvd2xhYmVsIGFuZCBwcmlvIChpbmNsdWRlcyB2ZXJzaW9uLCB3aGljaCBzaG91bGRuJ3QgY2hhbmdlIGVpdGhlciAqLwotCWZsb3dsYWJlbCA9ICooKHVfaW50MzJfdCAqKSAoKnBza2IpLT5uaC5pcHY2aCk7CisJZmxvd2xhYmVsID0gKigodV9pbnQzMl90ICopaXB2Nl9oZHIoKnBza2IpKTsKIAogCXJldCA9IGlwNnRfZG9fdGFibGUocHNrYiwgaG9vaywgaW4sIG91dCwgJnBhY2tldF9tYW5nbGVyKTsKIAogCWlmIChyZXQgIT0gTkZfRFJPUCAmJiByZXQgIT0gTkZfU1RPTEVOCi0JCSYmIChtZW1jbXAoJigqcHNrYiktPm5oLmlwdjZoLT5zYWRkciwgJnNhZGRyLCBzaXplb2Yoc2FkZHIpKQotCQkgICAgfHwgbWVtY21wKCYoKnBza2IpLT5uaC5pcHY2aC0+ZGFkZHIsICZkYWRkciwgc2l6ZW9mKGRhZGRyKSkKKwkJJiYgKG1lbWNtcCgmaXB2Nl9oZHIoKnBza2IpLT5zYWRkciwgJnNhZGRyLCBzaXplb2Yoc2FkZHIpKQorCQkgICAgfHwgbWVtY21wKCZpcHY2X2hkcigqcHNrYiktPmRhZGRyLCAmZGFkZHIsIHNpemVvZihkYWRkcikpCiAJCSAgICB8fCAoKnBza2IpLT5tYXJrICE9IG1hcmsKLQkJICAgIHx8ICgqcHNrYiktPm5oLmlwdjZoLT5ob3BfbGltaXQgIT0gaG9wX2xpbWl0KSkKKwkJICAgIHx8IGlwdjZfaGRyKCpwc2tiKS0+aG9wX2xpbWl0ICE9IGhvcF9saW1pdCkpCiAJCXJldHVybiBpcDZfcm91dGVfbWVfaGFyZGVyKCpwc2tiKSA9PSAwID8gcmV0IDogTkZfRFJPUDsKIAogCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2wzcHJvdG9faXB2Ni5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sM3Byb3RvX2lwdjYuYwppbmRleCBkMTEwMjQ1Li42ZDJhMDgyIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2wzcHJvdG9faXB2Ni5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDNwcm90b19pcHY2LmMKQEAgLTcsMTcgKzcsNiBAQAogICoKICAqIEF1dGhvcjoKICAqCVlhc3V5dWtpIEtvemFrYWkgQFVTQUdJIDx5YXN1eXVraS5rb3pha2FpQHRvc2hpYmEuY28uanA+Ci0gKgotICogMTYgRGVjIDIwMDM6IFlhc3V5dWtpIEtvemFrYWkgQFVTQUdJIDx5YXN1eXVraS5rb3pha2FpQHRvc2hpYmEuY28uanA+Ci0gKgktIHN1cHBvcnQgTGF5ZXIgMyBwcm90b2NvbCBpbmRlcGVuZGVudCBjb25uZWN0aW9uIHRyYWNraW5nLgotICoJICBCYXNlZCBvbiB0aGUgb3JpZ2luYWwgaXBfY29ubnRyYWNrIGNvZGUgd2hpY2gJaGFkIHRoZSBmb2xsb3dpbmcKLSAqCSAgY29weXJpZ2h0IGluZm9ybWF0aW9uOgotICoJCShDKSAxOTk5LTIwMDEgUGF1bCBgUnVzdHknIFJ1c3NlbGwKLSAqCQkoQykgMjAwMi0yMDA0IE5ldGZpbHRlciBDb3JlIFRlYW0gPGNvcmV0ZWFtQG5ldGZpbHRlci5vcmc+Ci0gKgotICogMjMgTWFyIDIwMDQ6IFlhc3V5dWtpIEtvemFrYWkgQFVTQUdJIDx5YXN1eXVraS5rb3pha2FpQHRvc2hpYmEuY28uanA+Ci0gKgktIGFkZCBnZXRfZmVhdHVyZXMoKSB0byBzdXBwb3J0IHZhcmlvdXMgc2l6ZSBvZiBjb25udHJhY2sKLSAqCSAgc3RydWN0dXJlcy4KICAqLwogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KQEAgLTEzOCwxNiArMTI3LDEwIEBACiBpcHY2X3ByZXBhcmUoc3RydWN0IHNrX2J1ZmYgKipwc2tiLCB1bnNpZ25lZCBpbnQgaG9va251bSwgdW5zaWduZWQgaW50ICpkYXRhb2ZmLAogCSAgICAgdV9pbnQ4X3QgKnByb3RvbnVtKQogewotCXVuc2lnbmVkIGludCBleHRvZmY7Ci0JdW5zaWduZWQgY2hhciBwbnVtOwotCWludCBwcm90b2ZmOwotCi0JZXh0b2ZmID0gKHU4KikoKCpwc2tiKS0+bmguaXB2NmggKyAxKSAtICgqcHNrYiktPmRhdGE7Ci0JcG51bSA9ICgqcHNrYiktPm5oLmlwdjZoLT5uZXh0aGRyOwotCi0JcHJvdG9mZiA9IG5mX2N0X2lwdjZfc2tpcF9leHRoZHIoKnBza2IsIGV4dG9mZiwgJnBudW0sCi0JCQkJCSAoKnBza2IpLT5sZW4gLSBleHRvZmYpOwotCisJdW5zaWduZWQgaW50IGV4dG9mZiA9ICh1OCAqKShpcHY2X2hkcigqcHNrYikgKyAxKSAtICgqcHNrYiktPmRhdGE7CisJdW5zaWduZWQgY2hhciBwbnVtID0gaXB2Nl9oZHIoKnBza2IpLT5uZXh0aGRyOworCWludCBwcm90b2ZmID0gbmZfY3RfaXB2Nl9za2lwX2V4dGhkcigqcHNrYiwgZXh0b2ZmLCAmcG51bSwKKwkJCQkJICAgICAoKnBza2IpLT5sZW4gLSBleHRvZmYpOwogCS8qCiAJICogKHByb3RvZmYgPT0gKCpwc2tiKS0+bGVuKSBtZWFuIHRoYXQgdGhlIHBhY2tldCBkb2Vzbid0IGhhdmUgbm8gZGF0YQogCSAqIGV4Y2VwdCBvZiBJUHY2ICYgZXh0IGhlYWRlcnMuIGJ1dCBpdCdzIHRyYWNrZWQgYW55d2F5LiAtIFlLCkBAIC0xNzksOSArMTYyLDggQEAKIAlzdHJ1Y3QgbmZfY29ubl9oZWxwICpoZWxwOwogCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvOwogCXVuc2lnbmVkIGludCByZXQsIHByb3RvZmY7Ci0JdW5zaWduZWQgaW50IGV4dG9mZiA9ICh1OCopKCgqcHNrYiktPm5oLmlwdjZoICsgMSkKLQkJCSAgICAgIC0gKCpwc2tiKS0+ZGF0YTsKLQl1bnNpZ25lZCBjaGFyIHBudW0gPSAoKnBza2IpLT5uaC5pcHY2aC0+bmV4dGhkcjsKKwl1bnNpZ25lZCBpbnQgZXh0b2ZmID0gKHU4ICopKGlwdjZfaGRyKCpwc2tiKSArIDEpIC0gKCpwc2tiKS0+ZGF0YTsKKwl1bnNpZ25lZCBjaGFyIHBudW0gPSBpcHY2X2hkcigqcHNrYiktPm5leHRoZHI7CiAKIAogCS8qIFRoaXMgaXMgd2hlcmUgd2UgY2FsbCB0aGUgaGVscGVyOiBhcyB0aGUgcGFja2V0IGdvZXMgb3V0LiAqLwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b19pY21wdjYuYyBiL25ldC9pcHY2L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9faWNtcHY2LmMKaW5kZXggMDc1ZGE0Zi4uMGJlNzkwZCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b19pY21wdjYuYworKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX2ljbXB2Ni5jCkBAIC03LDEzICs3LDYgQEAKICAqCiAgKiBBdXRob3I6CiAgKglZYXN1eXVraSBLb3pha2FpIEBVU0FHSSA8eWFzdXl1a2kua296YWthaUB0b3NoaWJhLmNvLmpwPgotICoKLSAqIDE2IERlYyAyMDAzOiBZYXN1eXVraSBLb3pha2FpIEBVU0FHSSA8eWFzdXl1a2kua296YWthaUB0b3NoaWJhLmNvLmpwPgotICoJLSBJQ01QdjYgdHJhY2tpbmcgc3VwcG9ydC4gRGVyaXZlZCBmcm9tIHRoZSBvcmlnaW5hbCBpcF9jb25udHJhY2sgY29kZQotICoJICBuZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX3Byb3RvX2ljbXAuYyB3aGljaCBoYWQgdGhlIGZvbGxvd2luZwotICoJICBjb3B5cmlnaHQgaW5mb3JtYXRpb246Ci0gKgkJKEMpIDE5OTktMjAwMSBQYXVsIGBSdXN0eScgUnVzc2VsbAotICoJCShDKSAyMDAyLTIwMDQgTmV0ZmlsdGVyIENvcmUgVGVhbSA8Y29yZXRlYW1AbmV0ZmlsdGVyLm9yZz4KICAqLwogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9uZl9jb25udHJhY2tfcmVhc20uYyBiL25ldC9pcHY2L25ldGZpbHRlci9uZl9jb25udHJhY2tfcmVhc20uYwppbmRleCAxNWFiMWUzLi4zNDdhYjc2IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3JlYXNtLmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19yZWFzbS5jCkBAIC04Miw3ICs4Miw3IEBACiAJc3RydWN0IHNrX2J1ZmYJCSpmcmFnbWVudHM7CiAJaW50CQkJbGVuOwogCWludAkJCW1lYXQ7Ci0Jc3RydWN0IHRpbWV2YWwJCXN0YW1wOworCWt0aW1lX3QJCQlzdGFtcDsKIAl1bnNpZ25lZCBpbnQJCWNzdW07CiAJX191OAkJCWxhc3RfaW47CS8qIGhhcyBmaXJzdC9sYXN0IHNlZ21lbnQgYXJyaXZlZD8gKi8KICNkZWZpbmUgQ09NUExFVEUJCTQKQEAgLTM1Myw5ICszNTMsNyBAQAogCWlwdjZfYWRkcl9jb3B5KCZmcS0+c2FkZHIsIHNyYyk7CiAJaXB2Nl9hZGRyX2NvcHkoJmZxLT5kYWRkciwgZHN0KTsKIAotCWluaXRfdGltZXIoJmZxLT50aW1lcik7Ci0JZnEtPnRpbWVyLmZ1bmN0aW9uID0gbmZfY3RfZnJhZzZfZXhwaXJlOwotCWZxLT50aW1lci5kYXRhID0gKGxvbmcpIGZxOworCXNldHVwX3RpbWVyKCZmcS0+dGltZXIsIG5mX2N0X2ZyYWc2X2V4cGlyZSwgKHVuc2lnbmVkIGxvbmcpZnEpOwogCXNwaW5fbG9ja19pbml0KCZmcS0+bG9jayk7CiAJYXRvbWljX3NldCgmZnEtPnJlZmNudCwgMSk7CiAKQEAgLTQwMCwxOSArMzk4LDIwIEBACiAJfQogCiAJb2Zmc2V0ID0gbnRvaHMoZmhkci0+ZnJhZ19vZmYpICYgfjB4NzsKLQllbmQgPSBvZmZzZXQgKyAobnRvaHMoc2tiLT5uaC5pcHY2aC0+cGF5bG9hZF9sZW4pIC0KLQkJCSgodTggKikgKGZoZHIgKyAxKSAtICh1OCAqKSAoc2tiLT5uaC5pcHY2aCArIDEpKSk7CisJZW5kID0gb2Zmc2V0ICsgKG50b2hzKGlwdjZfaGRyKHNrYiktPnBheWxvYWRfbGVuKSAtCisJCQkoKHU4ICopKGZoZHIgKyAxKSAtICh1OCAqKShpcHY2X2hkcihza2IpICsgMSkpKTsKIAogCWlmICgodW5zaWduZWQgaW50KWVuZCA+IElQVjZfTUFYUExFTikgewogCQlERUJVR1AoIm9mZnNldCBpcyB0b28gbGFyZ2UuXG4iKTsKIAkJcmV0dXJuIC0xOwogCX0KIAotCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9DT01QTEVURSkKKwlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fQ09NUExFVEUpIHsKKwkJY29uc3QgdW5zaWduZWQgY2hhciAqbmggPSBza2JfbmV0d29ya19oZWFkZXIoc2tiKTsKIAkJc2tiLT5jc3VtID0gY3N1bV9zdWIoc2tiLT5jc3VtLAotCQkJCSAgICAgY3N1bV9wYXJ0aWFsKHNrYi0+bmgucmF3LAotCQkJCQkJICAodTgqKShmaGRyICsgMSkgLSBza2ItPm5oLnJhdywKKwkJCQkgICAgIGNzdW1fcGFydGlhbChuaCwgKHU4ICopKGZoZHIgKyAxKSAtIG5oLAogCQkJCQkJICAwKSk7CisJfQogCiAJLyogSXMgdGhpcyB0aGUgZmluYWwgZnJhZ21lbnQ/ICovCiAJaWYgKCEoZmhkci0+ZnJhZ19vZmYgJiBodG9ucyhJUDZfTUYpKSkgewpAQCAtNTQyLDcgKzU0MSw3IEBACiAJCWZxLT5mcmFnbWVudHMgPSBza2I7CiAKIAlza2ItPmRldiA9IE5VTEw7Ci0Jc2tiX2dldF90aW1lc3RhbXAoc2tiLCAmZnEtPnN0YW1wKTsKKwlmcS0+c3RhbXAgPSBza2ItPnRzdGFtcDsKIAlmcS0+bWVhdCArPSBza2ItPmxlbjsKIAlhdG9taWNfYWRkKHNrYi0+dHJ1ZXNpemUsICZuZl9jdF9mcmFnNl9tZW0pOwogCkBAIC01ODMsNyArNTgyLDkgQEAKIAlCVUdfVFJBUChORkNUX0ZSQUc2X0NCKGhlYWQpLT5vZmZzZXQgPT0gMCk7CiAKIAkvKiBVbmZyYWdtZW50ZWQgcGFydCBpcyB0YWtlbiBmcm9tIHRoZSBmaXJzdCBzZWdtZW50LiAqLwotCXBheWxvYWRfbGVuID0gKGhlYWQtPmRhdGEgLSBoZWFkLT5uaC5yYXcpIC0gc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSArIGZxLT5sZW4gLSBzaXplb2Yoc3RydWN0IGZyYWdfaGRyKTsKKwlwYXlsb2FkX2xlbiA9ICgoaGVhZC0+ZGF0YSAtIHNrYl9uZXR3b3JrX2hlYWRlcihoZWFkKSkgLQorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSArIGZxLT5sZW4gLQorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBmcmFnX2hkcikpOwogCWlmIChwYXlsb2FkX2xlbiA+IElQVjZfTUFYUExFTikgewogCQlERUJVR1AoInBheWxvYWQgbGVuIGlzIHRvbyBsYXJnZS5cbiIpOwogCQlnb3RvIG91dF9vdmVyc2l6ZTsKQEAgLTYyNCwxNSArNjI1LDE1IEBACiAKIAkvKiBXZSBoYXZlIHRvIHJlbW92ZSBmcmFnbWVudCBoZWFkZXIgZnJvbSBkYXRhZ3JhbSBhbmQgdG8gcmVsb2NhdGUKIAkgKiBoZWFkZXIgaW4gb3JkZXIgdG8gY2FsY3VsYXRlIElDViBjb3JyZWN0bHkuICovCi0JaGVhZC0+bmgucmF3W2ZxLT5uaG9mZnNldF0gPSBoZWFkLT5oLnJhd1swXTsKKwlza2JfbmV0d29ya19oZWFkZXIoaGVhZClbZnEtPm5ob2Zmc2V0XSA9IHNrYl90cmFuc3BvcnRfaGVhZGVyKGhlYWQpWzBdOwogCW1lbW1vdmUoaGVhZC0+aGVhZCArIHNpemVvZihzdHJ1Y3QgZnJhZ19oZHIpLCBoZWFkLT5oZWFkLAogCQkoaGVhZC0+ZGF0YSAtIGhlYWQtPmhlYWQpIC0gc2l6ZW9mKHN0cnVjdCBmcmFnX2hkcikpOwotCWhlYWQtPm1hYy5yYXcgKz0gc2l6ZW9mKHN0cnVjdCBmcmFnX2hkcik7Ci0JaGVhZC0+bmgucmF3ICs9IHNpemVvZihzdHJ1Y3QgZnJhZ19oZHIpOworCWhlYWQtPm1hY19oZWFkZXIgKz0gc2l6ZW9mKHN0cnVjdCBmcmFnX2hkcik7CisJaGVhZC0+bmV0d29ya19oZWFkZXIgKz0gc2l6ZW9mKHN0cnVjdCBmcmFnX2hkcik7CiAKIAlza2Jfc2hpbmZvKGhlYWQpLT5mcmFnX2xpc3QgPSBoZWFkLT5uZXh0OwotCWhlYWQtPmgucmF3ID0gaGVhZC0+ZGF0YTsKLQlza2JfcHVzaChoZWFkLCBoZWFkLT5kYXRhIC0gaGVhZC0+bmgucmF3KTsKKwlza2JfcmVzZXRfdHJhbnNwb3J0X2hlYWRlcihoZWFkKTsKKwlza2JfcHVzaChoZWFkLCBoZWFkLT5kYXRhIC0gc2tiX25ldHdvcmtfaGVhZGVyKGhlYWQpKTsKIAlhdG9taWNfc3ViKGhlYWQtPnRydWVzaXplLCAmbmZfY3RfZnJhZzZfbWVtKTsKIAogCWZvciAoZnA9aGVhZC0+bmV4dDsgZnA7IGZwID0gZnAtPm5leHQpIHsKQEAgLTY0OCwxMiArNjQ5LDE0IEBACiAKIAloZWFkLT5uZXh0ID0gTlVMTDsKIAloZWFkLT5kZXYgPSBkZXY7Ci0Jc2tiX3NldF90aW1lc3RhbXAoaGVhZCwgJmZxLT5zdGFtcCk7Ci0JaGVhZC0+bmguaXB2NmgtPnBheWxvYWRfbGVuID0gaHRvbnMocGF5bG9hZF9sZW4pOworCWhlYWQtPnRzdGFtcCA9IGZxLT5zdGFtcDsKKwlpcHY2X2hkcihoZWFkKS0+cGF5bG9hZF9sZW4gPSBodG9ucyhwYXlsb2FkX2xlbik7CiAKIAkvKiBZZXMsIGFuZCBmb2xkIHJlZHVuZGFudCBjaGVja3N1bSBiYWNrLiA4KSAqLwogCWlmIChoZWFkLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fQ09NUExFVEUpCi0JCWhlYWQtPmNzdW0gPSBjc3VtX3BhcnRpYWwoaGVhZC0+bmgucmF3LCBoZWFkLT5oLnJhdy1oZWFkLT5uaC5yYXcsIGhlYWQtPmNzdW0pOworCQloZWFkLT5jc3VtID0gY3N1bV9wYXJ0aWFsKHNrYl9uZXR3b3JrX2hlYWRlcihoZWFkKSwKKwkJCQkJICBza2JfbmV0d29ya19oZWFkZXJfbGVuKGhlYWQpLAorCQkJCQkgIGhlYWQtPmNzdW0pOwogCiAJZnEtPmZyYWdtZW50cyA9IE5VTEw7CiAKQEAgLTcwMSw5ICs3MDQsMTAgQEAKIHN0YXRpYyBpbnQKIGZpbmRfcHJldl9maGRyKHN0cnVjdCBza19idWZmICpza2IsIHU4ICpwcmV2aGRycCwgaW50ICpwcmV2aG9mZiwgaW50ICpmaG9mZikKIHsKLQl1OCBuZXh0aGRyID0gc2tiLT5uaC5pcHY2aC0+bmV4dGhkcjsKLQl1OCBwcmV2X25ob2ZmID0gKHU4ICopJnNrYi0+bmguaXB2NmgtPm5leHRoZHIgLSBza2ItPmRhdGE7Ci0JaW50IHN0YXJ0ID0gKHU4ICopKHNrYi0+bmguaXB2NmgrMSkgLSBza2ItPmRhdGE7CisJdTggbmV4dGhkciA9IGlwdjZfaGRyKHNrYiktPm5leHRoZHI7CisJY29uc3QgaW50IG5ldG9mZiA9IHNrYl9uZXR3b3JrX29mZnNldChza2IpOworCXU4IHByZXZfbmhvZmYgPSBuZXRvZmYgKyBvZmZzZXRvZihzdHJ1Y3QgaXB2NmhkciwgbmV4dGhkcik7CisJaW50IHN0YXJ0ID0gbmV0b2ZmICsgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKTsKIAlpbnQgbGVuID0gc2tiLT5sZW4gLSBzdGFydDsKIAl1OCBwcmV2aGRyID0gTkVYVEhEUl9JUFY2OwogCkBAIC03NTksNyArNzYzLDcgQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAqcmV0X3NrYiA9IE5VTEw7CiAKIAkvKiBKdW1ibyBwYXlsb2FkIGluaGliaXRzIGZyYWcuIGhlYWRlciAqLwotCWlmIChza2ItPm5oLmlwdjZoLT5wYXlsb2FkX2xlbiA9PSAwKSB7CisJaWYgKGlwdjZfaGRyKHNrYiktPnBheWxvYWRfbGVuID09IDApIHsKIAkJREVCVUdQKCJwYXlsb2FkIGxlbiA9IDBcbiIpOwogCQlyZXR1cm4gc2tiOwogCX0KQEAgLTc4MCw5ICs3ODQsOSBAQAogCQlnb3RvIHJldF9vcmlnOwogCX0KIAotCWNsb25lLT5oLnJhdyA9IGNsb25lLT5kYXRhICsgZmhvZmY7Ci0JaGRyID0gY2xvbmUtPm5oLmlwdjZoOwotCWZoZHIgPSAoc3RydWN0IGZyYWdfaGRyICopY2xvbmUtPmgucmF3OworCXNrYl9zZXRfdHJhbnNwb3J0X2hlYWRlcihjbG9uZSwgZmhvZmYpOworCWhkciA9IGlwdjZfaGRyKGNsb25lKTsKKwlmaGRyID0gKHN0cnVjdCBmcmFnX2hkciAqKXNrYl90cmFuc3BvcnRfaGVhZGVyKGNsb25lKTsKIAogCWlmICghKGZoZHItPmZyYWdfb2ZmICYgaHRvbnMoMHhGRkY5KSkpIHsKIAkJREVCVUdQKCJJbnZhbGlkIGZyYWdtZW50IG9mZnNldFxuIik7CkBAIC04NjQsOCArODY4LDcgQEAKIAluZl9jdF9mcmFnNl9oYXNoX3JuZCA9ICh1MzIpICgobnVtX3BoeXNwYWdlcyBeIChudW1fcGh5c3BhZ2VzPj43KSkgXgogCQkJCSAgIChqaWZmaWVzIF4gKGppZmZpZXMgPj4gNikpKTsKIAotCWluaXRfdGltZXIoJm5mX2N0X2ZyYWc2X3NlY3JldF90aW1lcik7Ci0JbmZfY3RfZnJhZzZfc2VjcmV0X3RpbWVyLmZ1bmN0aW9uID0gbmZfY3RfZnJhZzZfc2VjcmV0X3JlYnVpbGQ7CisJc2V0dXBfdGltZXIoJm5mX2N0X2ZyYWc2X3NlY3JldF90aW1lciwgbmZfY3RfZnJhZzZfc2VjcmV0X3JlYnVpbGQsIDApOwogCW5mX2N0X2ZyYWc2X3NlY3JldF90aW1lci5leHBpcmVzID0gamlmZmllcwogCQkJCQkgICArIG5mX2N0X2ZyYWc2X3NlY3JldF9pbnRlcnZhbDsKIAlhZGRfdGltZXIoJm5mX2N0X2ZyYWc2X3NlY3JldF90aW1lcik7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9wcm9jLmMgYi9uZXQvaXB2Ni9wcm9jLmMKaW5kZXggZmEzZmI1MC4uOTIwZGM5YyAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvcHJvYy5jCisrKyBiL25ldC9pcHY2L3Byb2MuYwpAQCAtMjMsMTIgKzIzLDEyIEBACiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSA8bmV0L2lwLmg+CiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KICNpbmNsdWRlIDxuZXQvdGNwLmg+CiAjaW5jbHVkZSA8bmV0L3RyYW5zcF92Ni5oPgogI2luY2x1ZGUgPG5ldC9pcHY2Lmg+CiAKLSNpZmRlZiBDT05GSUdfUFJPQ19GUwogc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY19uZXRfZGV2c25tcDY7CiAKIHN0YXRpYyBpbnQgZm9sZF9wcm90X2ludXNlKHN0cnVjdCBwcm90byAqcHJvdG8pCkBAIC0xNDIsMjYgKzE0MiwxMyBAQAogCVNOTVBfTUlCX1NFTlRJTkVMCiB9OwogCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotZm9sZF9maWVsZCh2b2lkICptaWJbXSwgaW50IG9mZnQpCi17Ci0JdW5zaWduZWQgbG9uZyByZXMgPSAwOwotCWludCBpOwotCi0JZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpIHsKLQkJcmVzICs9ICooKCh1bnNpZ25lZCBsb25nICopcGVyX2NwdV9wdHIobWliWzBdLCBpKSkgKyBvZmZ0KTsKLQkJcmVzICs9ICooKCh1bnNpZ25lZCBsb25nICopcGVyX2NwdV9wdHIobWliWzFdLCBpKSkgKyBvZmZ0KTsKLQl9Ci0JcmV0dXJuIHJlczsKLX0KLQogc3RhdGljIGlubGluZSB2b2lkCiBzbm1wNl9zZXFfc2hvd19pdGVtKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICoqbWliLCBzdHJ1Y3Qgc25tcF9taWIgKml0ZW1saXN0KQogewogCWludCBpOwogCWZvciAoaT0wOyBpdGVtbGlzdFtpXS5uYW1lOyBpKyspCiAJCXNlcV9wcmludGYoc2VxLCAiJS0zMnNcdCVsdVxuIiwgaXRlbWxpc3RbaV0ubmFtZSwKLQkJCQlmb2xkX2ZpZWxkKG1pYiwgaXRlbWxpc3RbaV0uZW50cnkpKTsKKwkJCSAgIHNubXBfZm9sZF9maWVsZChtaWIsIGl0ZW1saXN0W2ldLmVudHJ5KSk7CiB9CiAKIHN0YXRpYyBpbnQgc25tcDZfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCkBAIC0yMzYsNiArMjIzLDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJcmVtb3ZlX3Byb2NfZW50cnkoaWRldi0+c3RhdHMucHJvY19kaXJfZW50cnktPm5hbWUsCiAJCQkgIHByb2NfbmV0X2RldnNubXA2KTsKKwlpZGV2LT5zdGF0cy5wcm9jX2Rpcl9lbnRyeSA9IE5VTEw7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI3MSw0NyArMjU5LDMgQEAKIAlwcm9jX25ldF9yZW1vdmUoInNubXA2Iik7CiB9CiAKLSNlbHNlCS8qIENPTkZJR19QUk9DX0ZTICovCi0KLQotaW50IHNubXA2X3JlZ2lzdGVyX2RldihzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2KQotewotCXJldHVybiAwOwotfQotCi1pbnQgc25tcDZfdW5yZWdpc3Rlcl9kZXYoc3RydWN0IGluZXQ2X2RldiAqaWRldikKLXsKLQlyZXR1cm4gMDsKLX0KLSNlbmRpZgkvKiBDT05GSUdfUFJPQ19GUyAqLwotCi1pbnQgc25tcDZfYWxsb2NfZGV2KHN0cnVjdCBpbmV0Nl9kZXYgKmlkZXYpCi17Ci0JaW50IGVyciA9IC1FTk9NRU07Ci0KLQlpZiAoIWlkZXYgfHwgIWlkZXYtPmRldikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoc25tcDZfbWliX2luaXQoKHZvaWQgKiopaWRldi0+c3RhdHMuaXB2Niwgc2l6ZW9mKHN0cnVjdCBpcHN0YXRzX21pYiksCi0JCQkgICBfX2FsaWdub2ZfXyhzdHJ1Y3QgaXBzdGF0c19taWIpKSA8IDApCi0JCWdvdG8gZXJyX2lwOwotCWlmIChzbm1wNl9taWJfaW5pdCgodm9pZCAqKilpZGV2LT5zdGF0cy5pY21wdjYsIHNpemVvZihzdHJ1Y3QgaWNtcHY2X21pYiksCi0JCQkgICBfX2FsaWdub2ZfXyhzdHJ1Y3QgaWNtcHY2X21pYikpIDwgMCkKLQkJZ290byBlcnJfaWNtcDsKLQotCXJldHVybiAwOwotCi1lcnJfaWNtcDoKLQlzbm1wNl9taWJfZnJlZSgodm9pZCAqKilpZGV2LT5zdGF0cy5pcHY2KTsKLWVycl9pcDoKLQlyZXR1cm4gZXJyOwotfQotCi1pbnQgc25tcDZfZnJlZV9kZXYoc3RydWN0IGluZXQ2X2RldiAqaWRldikKLXsKLQlzbm1wNl9taWJfZnJlZSgodm9pZCAqKilpZGV2LT5zdGF0cy5pY21wdjYpOwotCXNubXA2X21pYl9mcmVlKCh2b2lkICoqKWlkZXYtPnN0YXRzLmlwdjYpOwotCXJldHVybiAwOwotfQotCi0KZGlmZiAtLWdpdCBhL25ldC9pcHY2L3Byb3RvY29sLmMgYi9uZXQvaXB2Ni9wcm90b2NvbC5jCmluZGV4IGVmNDNiZDUuLmY5MjlmNDcgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3Byb3RvY29sLmMKKysrIGIvbmV0L2lwdjYvcHJvdG9jb2wuYwpAQCAtNjAsNiArNjAsOCBAQAogCXJldHVybiByZXQ7CiB9CiAKK0VYUE9SVF9TWU1CT0woaW5ldDZfYWRkX3Byb3RvY29sKTsKKwogLyoKICAqCVJlbW92ZSBhIHByb3RvY29sIGZyb20gdGhlIGhhc2ggdGFibGVzLgogICovCkBAIC04MywzICs4NSw1IEBACiAKIAlyZXR1cm4gcmV0OwogfQorCitFWFBPUlRfU1lNQk9MKGluZXQ2X2RlbF9wcm90b2NvbCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9yYXcuYyBiL25ldC9pcHY2L3Jhdy5jCmluZGV4IDIwM2UwNjkuLjAwOWExMDQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3Jhdy5jCisrKyBiL25ldC9pcHY2L3Jhdy5jCkBAIC0xNTIsNyArMTUyLDcgQEAKIAlpbnQgZGVsaXZlcmVkID0gMDsKIAlfX3U4IGhhc2g7CiAKLQlzYWRkciA9ICZza2ItPm5oLmlwdjZoLT5zYWRkcjsKKwlzYWRkciA9ICZpcHY2X2hkcihza2IpLT5zYWRkcjsKIAlkYWRkciA9IHNhZGRyICsgMTsKIAogCWhhc2ggPSBuZXh0aGRyICYgKE1BWF9JTkVUX1BST1RPUyAtIDEpOwpAQCAtMzYxLDE3ICszNjEsMTggQEAKIAkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKIAogCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9DT01QTEVURSkgewotCQlza2JfcG9zdHB1bGxfcmNzdW0oc2tiLCBza2ItPm5oLnJhdywKLQkJCQkgICBza2ItPmgucmF3IC0gc2tiLT5uaC5yYXcpOwotCQlpZiAoIWNzdW1faXB2Nl9tYWdpYygmc2tiLT5uaC5pcHY2aC0+c2FkZHIsCi0JCQkJICAgICAmc2tiLT5uaC5pcHY2aC0+ZGFkZHIsCisJCXNrYl9wb3N0cHVsbF9yY3N1bShza2IsIHNrYl9uZXR3b3JrX2hlYWRlcihza2IpLAorCQkJCSAgIHNrYl9uZXR3b3JrX2hlYWRlcl9sZW4oc2tiKSk7CisJCWlmICghY3N1bV9pcHY2X21hZ2ljKCZpcHY2X2hkcihza2IpLT5zYWRkciwKKwkJCQkgICAgICZpcHY2X2hkcihza2IpLT5kYWRkciwKIAkJCQkgICAgIHNrYi0+bGVuLCBpbmV0LT5udW0sIHNrYi0+Y3N1bSkpCiAJCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOwogCX0KLQlpZiAoc2tiLT5pcF9zdW1tZWQgIT0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlkpCi0JCXNrYi0+Y3N1bSA9IH5jc3VtX3VuZm9sZChjc3VtX2lwdjZfbWFnaWMoJnNrYi0+bmguaXB2NmgtPnNhZGRyLAotCQkJCQkgICAgICZza2ItPm5oLmlwdjZoLT5kYWRkciwKLQkJCQkJICAgICBza2ItPmxlbiwgaW5ldC0+bnVtLCAwKSk7CisJaWYgKCFza2JfY3N1bV91bm5lY2Vzc2FyeShza2IpKQorCQlza2ItPmNzdW0gPSB+Y3N1bV91bmZvbGQoY3N1bV9pcHY2X21hZ2ljKCZpcHY2X2hkcihza2IpLT5zYWRkciwKKwkJCQkJCQkgJmlwdjZfaGRyKHNrYiktPmRhZGRyLAorCQkJCQkJCSBza2ItPmxlbiwKKwkJCQkJCQkgaW5ldC0+bnVtLCAwKSk7CiAKIAlpZiAoaW5ldC0+aGRyaW5jbCkgewogCQlpZiAoc2tiX2NoZWNrc3VtX2NvbXBsZXRlKHNrYikpIHsKQEAgLTQyMCw3ICs0MjEsNyBAQAogCQltc2ctPm1zZ19mbGFncyB8PSBNU0dfVFJVTkM7CiAJfQogCi0JaWYgKHNrYi0+aXBfc3VtbWVkPT1DSEVDS1NVTV9VTk5FQ0VTU0FSWSkgeworCWlmIChza2JfY3N1bV91bm5lY2Vzc2FyeShza2IpKSB7CiAJCWVyciA9IHNrYl9jb3B5X2RhdGFncmFtX2lvdmVjKHNrYiwgMCwgbXNnLT5tc2dfaW92LCBjb3BpZWQpOwogCX0gZWxzZSBpZiAobXNnLT5tc2dfZmxhZ3MmTVNHX1RSVU5DKSB7CiAJCWlmIChfX3NrYl9jaGVja3N1bV9jb21wbGV0ZShza2IpKQpAQCAtNDM4LDcgKzQzOSw3IEBACiAJaWYgKHNpbjYpIHsKIAkJc2luNi0+c2luNl9mYW1pbHkgPSBBRl9JTkVUNjsKIAkJc2luNi0+c2luNl9wb3J0ID0gMDsKLQkJaXB2Nl9hZGRyX2NvcHkoJnNpbjYtPnNpbjZfYWRkciwgJnNrYi0+bmguaXB2NmgtPnNhZGRyKTsKKwkJaXB2Nl9hZGRyX2NvcHkoJnNpbjYtPnNpbjZfYWRkciwgJmlwdjZfaGRyKHNrYiktPnNhZGRyKTsKIAkJc2luNi0+c2luNl9mbG93aW5mbyA9IDA7CiAJCXNpbjYtPnNpbjZfc2NvcGVfaWQgPSAwOwogCQlpZiAoaXB2Nl9hZGRyX3R5cGUoJnNpbjYtPnNpbjZfYWRkcikgJiBJUFY2X0FERFJfTElOS0xPQ0FMKQpAQCAtNDg4LDcgKzQ4OSw4IEBACiAJCWdvdG8gb3V0OwogCiAJb2Zmc2V0ID0gcnAtPm9mZnNldDsKLQl0b3RhbF9sZW4gPSBpbmV0X3NrKHNrKS0+Y29yay5sZW5ndGggLSAoc2tiLT5uaC5yYXcgLSBza2ItPmRhdGEpOworCXRvdGFsX2xlbiA9IGluZXRfc2soc2spLT5jb3JrLmxlbmd0aCAtIChza2JfbmV0d29ya19oZWFkZXIoc2tiKSAtCisJCQkJCQlza2ItPmRhdGEpOwogCWlmIChvZmZzZXQgPj0gdG90YWxfbGVuIC0gMSkgewogCQllcnIgPSAtRUlOVkFMOwogCQlpcDZfZmx1c2hfcGVuZGluZ19mcmFtZXMoc2spOwpAQCAtNTExLDcgKzUxMyw3IEBACiAJCQlpZiAoY3N1bV9za2IpCiAJCQkJY29udGludWU7CiAKLQkJCWxlbiA9IHNrYi0+bGVuIC0gKHNrYi0+aC5yYXcgLSBza2ItPmRhdGEpOworCQkJbGVuID0gc2tiLT5sZW4gLSBza2JfdHJhbnNwb3J0X29mZnNldChza2IpOwogCQkJaWYgKG9mZnNldCA+PSBsZW4pIHsKIAkJCQlvZmZzZXQgLT0gbGVuOwogCQkJCWNvbnRpbnVlOwpAQCAtNTIzLDcgKzUyNSw3IEBACiAJCXNrYiA9IGNzdW1fc2tiOwogCX0KIAotCW9mZnNldCArPSBza2ItPmgucmF3IC0gc2tiLT5kYXRhOworCW9mZnNldCArPSBza2JfdHJhbnNwb3J0X29mZnNldChza2IpOwogCWlmIChza2JfY29weV9iaXRzKHNrYiwgb2Zmc2V0LCAmY3N1bSwgMikpCiAJCUJVRygpOwogCkBAIC01NzUsMTEgKzU3NywxMyBAQAogCXNrYi0+cHJpb3JpdHkgPSBzay0+c2tfcHJpb3JpdHk7CiAJc2tiLT5kc3QgPSBkc3RfY2xvbmUoJnJ0LT51LmRzdCk7CiAKLQlza2ItPm5oLmlwdjZoID0gaXBoID0gKHN0cnVjdCBpcHY2aGRyICopc2tiX3B1dChza2IsIGxlbmd0aCk7CisJc2tiX3B1dChza2IsIGxlbmd0aCk7CisJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CisJaXBoID0gaXB2Nl9oZHIoc2tiKTsKIAogCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKIAotCXNrYi0+aC5yYXcgPSBza2ItPm5oLnJhdzsKKwlza2ItPnRyYW5zcG9ydF9oZWFkZXIgPSBza2ItPm5ldHdvcmtfaGVhZGVyOwogCWVyciA9IG1lbWNweV9mcm9taW92ZWNlbmQoKHZvaWQgKilpcGgsIGZyb20sIDAsIGxlbmd0aCk7CiAJaWYgKGVycikKIAkJZ290byBlcnJvcl9mYXVsdDsKQEAgLTg3OCw3ICs4ODIsNyBAQAogCQlyZXR1cm4gMDsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVOT1BST1RPT1BUOwotCX07CisJfQogCiAJcmV0dXJuIDA7CiB9CkBAIC05MDMsNyArOTA3LDcgQEAKIAkJcmV0dXJuIDA7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FTk9QUk9UT09QVDsKLQl9OworCX0KIAogCXJldHVybiAwOwogfQpAQCAtOTU3LDcgKzk2MSw4IEBACiAJCWRlZmF1bHQ6CiAJCQlyZXR1cm4gaXB2Nl9zZXRzb2Nrb3B0KHNrLCBsZXZlbCwgb3B0bmFtZSwgb3B0dmFsLAogCQkJCQkgICAgICAgb3B0bGVuKTsKLQl9OworCX0KKwogCXJldHVybiBkb19yYXd2Nl9zZXRzb2Nrb3B0KHNrLCBsZXZlbCwgb3B0bmFtZSwgb3B0dmFsLCBvcHRsZW4pOwogfQogCkBAIC05NzgsNyArOTgzLDcgQEAKIAlkZWZhdWx0OgogCQlyZXR1cm4gY29tcGF0X2lwdjZfc2V0c29ja29wdChzaywgbGV2ZWwsIG9wdG5hbWUsCiAJCQkJCSAgICAgIG9wdHZhbCwgb3B0bGVuKTsKLQl9OworCX0KIAlyZXR1cm4gZG9fcmF3djZfc2V0c29ja29wdChzaywgbGV2ZWwsIG9wdG5hbWUsIG9wdHZhbCwgb3B0bGVuKTsKIH0KICNlbmRpZgpAQCAtMTAzMSw3ICsxMDM2LDggQEAKIAkJZGVmYXVsdDoKIAkJCXJldHVybiBpcHY2X2dldHNvY2tvcHQoc2ssIGxldmVsLCBvcHRuYW1lLCBvcHR2YWwsCiAJCQkJCSAgICAgICBvcHRsZW4pOwotCX07CisJfQorCiAJcmV0dXJuIGRvX3Jhd3Y2X2dldHNvY2tvcHQoc2ssIGxldmVsLCBvcHRuYW1lLCBvcHR2YWwsIG9wdGxlbik7CiB9CiAKQEAgLTEwNTIsNyArMTA1OCw3IEBACiAJZGVmYXVsdDoKIAkJcmV0dXJuIGNvbXBhdF9pcHY2X2dldHNvY2tvcHQoc2ssIGxldmVsLCBvcHRuYW1lLAogCQkJCQkgICAgICBvcHR2YWwsIG9wdGxlbik7Ci0JfTsKKwl9CiAJcmV0dXJuIGRvX3Jhd3Y2X2dldHNvY2tvcHQoc2ssIGxldmVsLCBvcHRuYW1lLCBvcHR2YWwsIG9wdGxlbik7CiB9CiAjZW5kaWYKQEAgLTEwNzMsNyArMTA3OSw3IEBACiAJCQlzcGluX2xvY2tfYmgoJnNrLT5za19yZWNlaXZlX3F1ZXVlLmxvY2spOwogCQkJc2tiID0gc2tiX3BlZWsoJnNrLT5za19yZWNlaXZlX3F1ZXVlKTsKIAkJCWlmIChza2IgIT0gTlVMTCkKLQkJCQlhbW91bnQgPSBza2ItPnRhaWwgLSBza2ItPmgucmF3OworCQkJCWFtb3VudCA9IHNrYi0+dGFpbCAtIHNrYi0+dHJhbnNwb3J0X2hlYWRlcjsKIAkJCXNwaW5fdW5sb2NrX2JoKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZS5sb2NrKTsKIAkJCXJldHVybiBwdXRfdXNlcihhbW91bnQsIChpbnQgX191c2VyICopYXJnKTsKIAkJfQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvcmVhc3NlbWJseS5jIGIvbmV0L2lwdjYvcmVhc3NlbWJseS5jCmluZGV4IDcwMzRjNTQuLmRlNzk1YzAgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3JlYXNzZW1ibHkuYworKysgYi9uZXQvaXB2Ni9yZWFzc2VtYmx5LmMKQEAgLTg4LDcgKzg4LDcgQEAKIAlpbnQJCQlsZW47CiAJaW50CQkJbWVhdDsKIAlpbnQJCQlpaWY7Ci0Jc3RydWN0IHRpbWV2YWwJCXN0YW1wOworCWt0aW1lX3QJCQlzdGFtcDsKIAl1bnNpZ25lZCBpbnQJCWNzdW07CiAJX191OAkJCWxhc3RfaW47CS8qIGhhcyBmaXJzdC9sYXN0IHNlZ21lbnQgYXJyaXZlZD8gKi8KICNkZWZpbmUgQ09NUExFVEUJCTQKQEAgLTQzMCwxOSArNDMwLDI0IEBACiAJCWdvdG8gZXJyOwogCiAJb2Zmc2V0ID0gbnRvaHMoZmhkci0+ZnJhZ19vZmYpICYgfjB4NzsKLQllbmQgPSBvZmZzZXQgKyAobnRvaHMoc2tiLT5uaC5pcHY2aC0+cGF5bG9hZF9sZW4pIC0KLQkJCSgodTggKikgKGZoZHIgKyAxKSAtICh1OCAqKSAoc2tiLT5uaC5pcHY2aCArIDEpKSk7CisJZW5kID0gb2Zmc2V0ICsgKG50b2hzKGlwdjZfaGRyKHNrYiktPnBheWxvYWRfbGVuKSAtCisJCQkoKHU4ICopKGZoZHIgKyAxKSAtICh1OCAqKShpcHY2X2hkcihza2IpICsgMSkpKTsKIAogCWlmICgodW5zaWduZWQgaW50KWVuZCA+IElQVjZfTUFYUExFTikgewogCQlJUDZfSU5DX1NUQVRTX0JIKGlwNl9kc3RfaWRldihza2ItPmRzdCksCiAJCQkJIElQU1RBVFNfTUlCX0lOSERSRVJST1JTKTsKLQkJaWNtcHY2X3BhcmFtX3Byb2Ioc2tiLElDTVBWNl9IRFJfRklFTEQsICh1OCopJmZoZHItPmZyYWdfb2ZmIC0gc2tiLT5uaC5yYXcpOworCQlpY21wdjZfcGFyYW1fcHJvYihza2IsIElDTVBWNl9IRFJfRklFTEQsCisJCQkJICAoKHU4ICopJmZoZHItPmZyYWdfb2ZmIC0KKwkJCQkgICBza2JfbmV0d29ya19oZWFkZXIoc2tiKSkpOwogCQlyZXR1cm47CiAJfQogCi0JaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0NPTVBMRVRFKQorCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9DT01QTEVURSkgeworCQljb25zdCB1bnNpZ25lZCBjaGFyICpuaCA9IHNrYl9uZXR3b3JrX2hlYWRlcihza2IpOwogCQlza2ItPmNzdW0gPSBjc3VtX3N1Yihza2ItPmNzdW0sCi0JCQkJICAgICBjc3VtX3BhcnRpYWwoc2tiLT5uaC5yYXcsICh1OCopKGZoZHIrMSktc2tiLT5uaC5yYXcsIDApKTsKKwkJCQkgICAgIGNzdW1fcGFydGlhbChuaCwgKHU4ICopKGZoZHIgKyAxKSAtIG5oLAorCQkJCQkJICAwKSk7CisJfQogCiAJLyogSXMgdGhpcyB0aGUgZmluYWwgZnJhZ21lbnQ/ICovCiAJaWYgKCEoZmhkci0+ZnJhZ19vZmYgJiBodG9ucyhJUDZfTUYpKSkgewpAQCAtNTYyLDcgKzU2Nyw3IEBACiAJaWYgKHNrYi0+ZGV2KQogCQlmcS0+aWlmID0gc2tiLT5kZXYtPmlmaW5kZXg7CiAJc2tiLT5kZXYgPSBOVUxMOwotCXNrYl9nZXRfdGltZXN0YW1wKHNrYiwgJmZxLT5zdGFtcCk7CisJZnEtPnN0YW1wID0gc2tiLT50c3RhbXA7CiAJZnEtPm1lYXQgKz0gc2tiLT5sZW47CiAJYXRvbWljX2FkZChza2ItPnRydWVzaXplLCAmaXA2X2ZyYWdfbWVtKTsKIApAQCAtNjA1LDcgKzYxMCw5IEBACiAJQlVHX1RSQVAoRlJBRzZfQ0IoaGVhZCktPm9mZnNldCA9PSAwKTsKIAogCS8qIFVuZnJhZ21lbnRlZCBwYXJ0IGlzIHRha2VuIGZyb20gdGhlIGZpcnN0IHNlZ21lbnQuICovCi0JcGF5bG9hZF9sZW4gPSAoaGVhZC0+ZGF0YSAtIGhlYWQtPm5oLnJhdykgLSBzaXplb2Yoc3RydWN0IGlwdjZoZHIpICsgZnEtPmxlbiAtIHNpemVvZihzdHJ1Y3QgZnJhZ19oZHIpOworCXBheWxvYWRfbGVuID0gKChoZWFkLT5kYXRhIC0gc2tiX25ldHdvcmtfaGVhZGVyKGhlYWQpKSAtCisJCSAgICAgICBzaXplb2Yoc3RydWN0IGlwdjZoZHIpICsgZnEtPmxlbiAtCisJCSAgICAgICBzaXplb2Yoc3RydWN0IGZyYWdfaGRyKSk7CiAJaWYgKHBheWxvYWRfbGVuID4gSVBWNl9NQVhQTEVOKQogCQlnb3RvIG91dF9vdmVyc2l6ZTsKIApAQCAtNjM5LDE1ICs2NDYsMTUgQEAKIAkvKiBXZSBoYXZlIHRvIHJlbW92ZSBmcmFnbWVudCBoZWFkZXIgZnJvbSBkYXRhZ3JhbSBhbmQgdG8gcmVsb2NhdGUKIAkgKiBoZWFkZXIgaW4gb3JkZXIgdG8gY2FsY3VsYXRlIElDViBjb3JyZWN0bHkuICovCiAJbmhvZmYgPSBmcS0+bmhvZmZzZXQ7Ci0JaGVhZC0+bmgucmF3W25ob2ZmXSA9IGhlYWQtPmgucmF3WzBdOworCXNrYl9uZXR3b3JrX2hlYWRlcihoZWFkKVtuaG9mZl0gPSBza2JfdHJhbnNwb3J0X2hlYWRlcihoZWFkKVswXTsKIAltZW1tb3ZlKGhlYWQtPmhlYWQgKyBzaXplb2Yoc3RydWN0IGZyYWdfaGRyKSwgaGVhZC0+aGVhZCwKIAkJKGhlYWQtPmRhdGEgLSBoZWFkLT5oZWFkKSAtIHNpemVvZihzdHJ1Y3QgZnJhZ19oZHIpKTsKLQloZWFkLT5tYWMucmF3ICs9IHNpemVvZihzdHJ1Y3QgZnJhZ19oZHIpOwotCWhlYWQtPm5oLnJhdyArPSBzaXplb2Yoc3RydWN0IGZyYWdfaGRyKTsKKwloZWFkLT5tYWNfaGVhZGVyICs9IHNpemVvZihzdHJ1Y3QgZnJhZ19oZHIpOworCWhlYWQtPm5ldHdvcmtfaGVhZGVyICs9IHNpemVvZihzdHJ1Y3QgZnJhZ19oZHIpOwogCiAJc2tiX3NoaW5mbyhoZWFkKS0+ZnJhZ19saXN0ID0gaGVhZC0+bmV4dDsKLQloZWFkLT5oLnJhdyA9IGhlYWQtPmRhdGE7Ci0Jc2tiX3B1c2goaGVhZCwgaGVhZC0+ZGF0YSAtIGhlYWQtPm5oLnJhdyk7CisJc2tiX3Jlc2V0X3RyYW5zcG9ydF9oZWFkZXIoaGVhZCk7CisJc2tiX3B1c2goaGVhZCwgaGVhZC0+ZGF0YSAtIHNrYl9uZXR3b3JrX2hlYWRlcihoZWFkKSk7CiAJYXRvbWljX3N1YihoZWFkLT50cnVlc2l6ZSwgJmlwNl9mcmFnX21lbSk7CiAKIAlmb3IgKGZwPWhlYWQtPm5leHQ7IGZwOyBmcCA9IGZwLT5uZXh0KSB7CkBAIC02NjMsMTUgKzY3MCwxNyBAQAogCiAJaGVhZC0+bmV4dCA9IE5VTEw7CiAJaGVhZC0+ZGV2ID0gZGV2OwotCXNrYl9zZXRfdGltZXN0YW1wKGhlYWQsICZmcS0+c3RhbXApOwotCWhlYWQtPm5oLmlwdjZoLT5wYXlsb2FkX2xlbiA9IGh0b25zKHBheWxvYWRfbGVuKTsKKwloZWFkLT50c3RhbXAgPSBmcS0+c3RhbXA7CisJaXB2Nl9oZHIoaGVhZCktPnBheWxvYWRfbGVuID0gaHRvbnMocGF5bG9hZF9sZW4pOwogCUlQNkNCKGhlYWQpLT5uaG9mZiA9IG5ob2ZmOwogCiAJKnNrYl9pbiA9IGhlYWQ7CiAKIAkvKiBZZXMsIGFuZCBmb2xkIHJlZHVuZGFudCBjaGVja3N1bSBiYWNrLiA4KSAqLwogCWlmIChoZWFkLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fQ09NUExFVEUpCi0JCWhlYWQtPmNzdW0gPSBjc3VtX3BhcnRpYWwoaGVhZC0+bmgucmF3LCBoZWFkLT5oLnJhdy1oZWFkLT5uaC5yYXcsIGhlYWQtPmNzdW0pOworCQloZWFkLT5jc3VtID0gY3N1bV9wYXJ0aWFsKHNrYl9uZXR3b3JrX2hlYWRlcihoZWFkKSwKKwkJCQkJICBza2JfbmV0d29ya19oZWFkZXJfbGVuKGhlYWQpLAorCQkJCQkgIGhlYWQtPmNzdW0pOwogCiAJcmN1X3JlYWRfbG9jaygpOwogCUlQNl9JTkNfU1RBVFNfQkgoX19pbjZfZGV2X2dldChkZXYpLCBJUFNUQVRTX01JQl9SRUFTTU9LUyk7CkBAIC02OTksMzMgKzcwOCwzNCBAQAogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBza2ItPmRldjsKIAlzdHJ1Y3QgZnJhZ19oZHIgKmZoZHI7CiAJc3RydWN0IGZyYWdfcXVldWUgKmZxOwotCXN0cnVjdCBpcHY2aGRyICpoZHI7Ci0KLQloZHIgPSBza2ItPm5oLmlwdjZoOworCXN0cnVjdCBpcHY2aGRyICpoZHIgPSBpcHY2X2hkcihza2IpOwogCiAJSVA2X0lOQ19TVEFUU19CSChpcDZfZHN0X2lkZXYoc2tiLT5kc3QpLCBJUFNUQVRTX01JQl9SRUFTTVJFUURTKTsKIAogCS8qIEp1bWJvIHBheWxvYWQgaW5oaWJpdHMgZnJhZy4gaGVhZGVyICovCiAJaWYgKGhkci0+cGF5bG9hZF9sZW49PTApIHsKIAkJSVA2X0lOQ19TVEFUUyhpcDZfZHN0X2lkZXYoc2tiLT5kc3QpLCBJUFNUQVRTX01JQl9JTkhEUkVSUk9SUyk7Ci0JCWljbXB2Nl9wYXJhbV9wcm9iKHNrYiwgSUNNUFY2X0hEUl9GSUVMRCwgc2tiLT5oLnJhdy1za2ItPm5oLnJhdyk7CisJCWljbXB2Nl9wYXJhbV9wcm9iKHNrYiwgSUNNUFY2X0hEUl9GSUVMRCwKKwkJCQkgIHNrYl9uZXR3b3JrX2hlYWRlcl9sZW4oc2tiKSk7CiAJCXJldHVybiAtMTsKIAl9Ci0JaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgKHNrYi0+aC5yYXctc2tiLT5kYXRhKStzaXplb2Yoc3RydWN0IGZyYWdfaGRyKSkpIHsKKwlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCAoc2tiX3RyYW5zcG9ydF9vZmZzZXQoc2tiKSArCisJCQkJIHNpemVvZihzdHJ1Y3QgZnJhZ19oZHIpKSkpIHsKIAkJSVA2X0lOQ19TVEFUUyhpcDZfZHN0X2lkZXYoc2tiLT5kc3QpLCBJUFNUQVRTX01JQl9JTkhEUkVSUk9SUyk7Ci0JCWljbXB2Nl9wYXJhbV9wcm9iKHNrYiwgSUNNUFY2X0hEUl9GSUVMRCwgc2tiLT5oLnJhdy1za2ItPm5oLnJhdyk7CisJCWljbXB2Nl9wYXJhbV9wcm9iKHNrYiwgSUNNUFY2X0hEUl9GSUVMRCwKKwkJCQkgIHNrYl9uZXR3b3JrX2hlYWRlcl9sZW4oc2tiKSk7CiAJCXJldHVybiAtMTsKIAl9CiAKLQloZHIgPSBza2ItPm5oLmlwdjZoOwotCWZoZHIgPSAoc3RydWN0IGZyYWdfaGRyICopc2tiLT5oLnJhdzsKKwloZHIgPSBpcHY2X2hkcihza2IpOworCWZoZHIgPSAoc3RydWN0IGZyYWdfaGRyICopc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKIAogCWlmICghKGZoZHItPmZyYWdfb2ZmICYgaHRvbnMoMHhGRkY5KSkpIHsKIAkJLyogSXQgaXMgbm90IGEgZnJhZ21lbnRlZCBmcmFtZSAqLwotCQlza2ItPmgucmF3ICs9IHNpemVvZihzdHJ1Y3QgZnJhZ19oZHIpOworCQlza2ItPnRyYW5zcG9ydF9oZWFkZXIgKz0gc2l6ZW9mKHN0cnVjdCBmcmFnX2hkcik7CiAJCUlQNl9JTkNfU1RBVFNfQkgoaXA2X2RzdF9pZGV2KHNrYi0+ZHN0KSwgSVBTVEFUU19NSUJfUkVBU01PS1MpOwogCi0JCUlQNkNCKHNrYiktPm5ob2ZmID0gKHU4KilmaGRyIC0gc2tiLT5uaC5yYXc7CisJCUlQNkNCKHNrYiktPm5ob2ZmID0gKHU4ICopZmhkciAtIHNrYl9uZXR3b3JrX2hlYWRlcihza2IpOwogCQlyZXR1cm4gMTsKIAl9CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3JvdXRlLmMgYi9uZXQvaXB2Ni9yb3V0ZS5jCmluZGV4IGFlYmI0ZTIuLmI0NmFkNTMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3JvdXRlLmMKKysrIGIvbmV0L2lwdjYvcm91dGUuYwpAQCAtNTc1LDYgKzU3NSw4IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKK0VYUE9SVF9TWU1CT0wocnQ2X2xvb2t1cCk7CisKIC8qIGlwNl9pbnNfcnQgaXMgY2FsbGVkIHdpdGggRlJFRSB0YWJsZS0+dGI2X2xvY2suCiAgICBJdCB0YWtlcyBuZXcgcm91dGUgZW50cnksIHRoZSBhZGRpdGlvbiBmYWlscyBieSBhbnkgcmVhc29uIHRoZQogICAgcm91dGUgaXMgZnJlZWQuIEluIGFueSBjYXNlLCBpZiBjYWxsZXIgZG9lcyBub3QgaG9sZCBpdCwgaXQgbWF5CkBAIC03MjQsNyArNzI2LDcgQEAKIAogdm9pZCBpcDZfcm91dGVfaW5wdXQoc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlzdHJ1Y3QgaXB2NmhkciAqaXBoID0gc2tiLT5uaC5pcHY2aDsKKwlzdHJ1Y3QgaXB2NmhkciAqaXBoID0gaXB2Nl9oZHIoc2tiKTsKIAlpbnQgZmxhZ3MgPSBSVDZfTE9PS1VQX0ZfSEFTX1NBRERSOwogCXN0cnVjdCBmbG93aSBmbCA9IHsKIAkJLmlpZiA9IHNrYi0+ZGV2LT5pZmluZGV4LApAQCAtODI5LDYgKzgzMSw3IEBACiAJcmV0dXJuIGZpYjZfcnVsZV9sb29rdXAoZmwsIGZsYWdzLCBpcDZfcG9sX3JvdXRlX291dHB1dCk7CiB9CiAKK0VYUE9SVF9TWU1CT0woaXA2X3JvdXRlX291dHB1dCk7CiAKIC8qCiAgKglEZXN0aW5hdGlvbiBjYWNoZSBzdXBwb3J0IGZ1bmN0aW9ucwpAQCAtMTc1Nyw3ICsxNzYwLDcgQEAKIAkJcnRubF91bmxvY2soKTsKIAogCQlyZXR1cm4gZXJyOwotCX07CisJfQogCiAJcmV0dXJuIC1FSU5WQUw7CiB9CkBAIC0xNzcyLDcgKzE3NzUsNyBAQAogCWludCB0eXBlOwogCXN3aXRjaCAoaXBzdGF0c19taWJfbm9yb3V0ZXMpIHsKIAljYXNlIElQU1RBVFNfTUlCX0lOTk9ST1VURVM6Ci0JCXR5cGUgPSBpcHY2X2FkZHJfdHlwZSgmc2tiLT5uaC5pcHY2aC0+ZGFkZHIpOworCQl0eXBlID0gaXB2Nl9hZGRyX3R5cGUoJmlwdjZfaGRyKHNrYiktPmRhZGRyKTsKIAkJaWYgKHR5cGUgPT0gSVBWNl9BRERSX0FOWSB8fCB0eXBlID09IElQVjZfQUREUl9SRVNFUlZFRCkgewogCQkJSVA2X0lOQ19TVEFUUyhpcDZfZHN0X2lkZXYoc2tiLT5kc3QpLCBJUFNUQVRTX01JQl9JTkFERFJFUlJPUlMpOwogCQkJYnJlYWs7CkBAIC0yMDEyLDcgKzIwMTUsNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLWludCBpbmV0Nl9ydG1fZGVscm91dGUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5sbXNnaGRyKiBubGgsIHZvaWQgKmFyZykKK3N0YXRpYyBpbnQgaW5ldDZfcnRtX2RlbHJvdXRlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBubG1zZ2hkciogbmxoLCB2b2lkICphcmcpCiB7CiAJc3RydWN0IGZpYjZfY29uZmlnIGNmZzsKIAlpbnQgZXJyOwpAQCAtMjAyNCw3ICsyMDI3LDcgQEAKIAlyZXR1cm4gaXA2X3JvdXRlX2RlbCgmY2ZnKTsKIH0KIAotaW50IGluZXQ2X3J0bV9uZXdyb3V0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgbmxtc2doZHIqIG5saCwgdm9pZCAqYXJnKQorc3RhdGljIGludCBpbmV0Nl9ydG1fbmV3cm91dGUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5sbXNnaGRyKiBubGgsIHZvaWQgKmFyZykKIHsKIAlzdHJ1Y3QgZmliNl9jb25maWcgY2ZnOwogCWludCBlcnI7CkBAIC0yMTYxLDcgKzIxNjQsNyBAQAogCQkgICAgIHByZWZpeCwgTkxNX0ZfTVVMVEkpOwogfQogCi1pbnQgaW5ldDZfcnRtX2dldHJvdXRlKHN0cnVjdCBza19idWZmICppbl9za2IsIHN0cnVjdCBubG1zZ2hkciogbmxoLCB2b2lkICphcmcpCitzdGF0aWMgaW50IGluZXQ2X3J0bV9nZXRyb3V0ZShzdHJ1Y3Qgc2tfYnVmZiAqaW5fc2tiLCBzdHJ1Y3Qgbmxtc2doZHIqIG5saCwgdm9pZCAqYXJnKQogewogCXN0cnVjdCBubGF0dHIgKnRiW1JUQV9NQVgrMV07CiAJc3RydWN0IHJ0Nl9pbmZvICpydDsKQEAgLTIyMTUsNyArMjIxOCw3IEBACiAJLyogUmVzZXJ2ZSByb29tIGZvciBkdW1teSBoZWFkZXJzLCB0aGlzIHNrYiBjYW4gcGFzcwogCSAgIHRocm91Z2ggZ29vZCBjaHVuayBvZiByb3V0aW5nIGVuZ2luZS4KIAkgKi8KLQlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKIAlza2JfcmVzZXJ2ZShza2IsIE1BWF9IRUFERVIgKyBzaXplb2Yoc3RydWN0IGlwdjZoZHIpKTsKIAogCXJ0ID0gKHN0cnVjdCBydDZfaW5mbyopIGlwNl9yb3V0ZV9vdXRwdXQoTlVMTCwgJmZsKTsKQEAgLTI0ODYsOCArMjQ4OSw5IEBACiAKIHZvaWQgX19pbml0IGlwNl9yb3V0ZV9pbml0KHZvaWQpCiB7CisjaWZkZWYgCUNPTkZJR19QUk9DX0ZTCiAJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwOwotCisjZW5kaWYKIAlpcDZfZHN0X29wcy5rbWVtX2NhY2hlcCA9CiAJCWttZW1fY2FjaGVfY3JlYXRlKCJpcDZfZHN0X2NhY2hlIiwgc2l6ZW9mKHN0cnVjdCBydDZfaW5mbyksIDAsCiAJCQkJICBTTEFCX0hXQ0FDSEVfQUxJR058U0xBQl9QQU5JQywgTlVMTCwgTlVMTCk7CkBAIC0yNTA1LDYgKzI1MDksMTAgQEAKICNpZmRlZiBDT05GSUdfSVBWNl9NVUxUSVBMRV9UQUJMRVMKIAlmaWI2X3J1bGVzX2luaXQoKTsKICNlbmRpZgorCisJX19ydG5sX3JlZ2lzdGVyKFBGX0lORVQ2LCBSVE1fTkVXUk9VVEUsIGluZXQ2X3J0bV9uZXdyb3V0ZSwgTlVMTCk7CisJX19ydG5sX3JlZ2lzdGVyKFBGX0lORVQ2LCBSVE1fREVMUk9VVEUsIGluZXQ2X3J0bV9kZWxyb3V0ZSwgTlVMTCk7CisJX19ydG5sX3JlZ2lzdGVyKFBGX0lORVQ2LCBSVE1fR0VUUk9VVEUsIGluZXQ2X3J0bV9nZXRyb3V0ZSwgTlVMTCk7CiB9CiAKIHZvaWQgaXA2X3JvdXRlX2NsZWFudXAodm9pZCkKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3NpdC5jIGIvbmV0L2lwdjYvc2l0LmMKaW5kZXggMDhkNmVkMy4uMWVmYTk1YSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvc2l0LmMKKysrIGIvbmV0L2lwdjYvc2l0LmMKQEAgLTk5LDEwICs5OSwxMCBAQAogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgc3RydWN0IGlwX3R1bm5lbCAqKiBpcGlwNl9idWNrZXQoc3RydWN0IGlwX3R1bm5lbCAqdCkKK3N0YXRpYyBzdHJ1Y3QgaXBfdHVubmVsICoqX19pcGlwNl9idWNrZXQoc3RydWN0IGlwX3R1bm5lbF9wYXJtICpwYXJtcykKIHsKLQlfX2JlMzIgcmVtb3RlID0gdC0+cGFybXMuaXBoLmRhZGRyOwotCV9fYmUzMiBsb2NhbCA9IHQtPnBhcm1zLmlwaC5zYWRkcjsKKwlfX2JlMzIgcmVtb3RlID0gcGFybXMtPmlwaC5kYWRkcjsKKwlfX2JlMzIgbG9jYWwgPSBwYXJtcy0+aXBoLnNhZGRyOwogCXVuc2lnbmVkIGggPSAwOwogCWludCBwcmlvID0gMDsKIApAQCAtMTE3LDYgKzExNywxMSBAQAogCXJldHVybiAmdHVubmVsc1twcmlvXVtoXTsKIH0KIAorc3RhdGljIGlubGluZSBzdHJ1Y3QgaXBfdHVubmVsICoqaXBpcDZfYnVja2V0KHN0cnVjdCBpcF90dW5uZWwgKnQpCit7CisJcmV0dXJuIF9faXBpcDZfYnVja2V0KCZ0LT5wYXJtcyk7Cit9CisKIHN0YXRpYyB2b2lkIGlwaXA2X3R1bm5lbF91bmxpbmsoc3RydWN0IGlwX3R1bm5lbCAqdCkKIHsKIAlzdHJ1Y3QgaXBfdHVubmVsICoqdHA7CkBAIC0xNDcsMTkgKzE1Miw5IEBACiAJX19iZTMyIGxvY2FsID0gcGFybXMtPmlwaC5zYWRkcjsKIAlzdHJ1Y3QgaXBfdHVubmVsICp0LCAqKnRwLCAqbnQ7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKLQl1bnNpZ25lZCBoID0gMDsKLQlpbnQgcHJpbyA9IDA7CiAJY2hhciBuYW1lW0lGTkFNU0laXTsKIAotCWlmIChyZW1vdGUpIHsKLQkJcHJpbyB8PSAyOwotCQloIF49IEhBU0gocmVtb3RlKTsKLQl9Ci0JaWYgKGxvY2FsKSB7Ci0JCXByaW8gfD0gMTsKLQkJaCBePSBIQVNIKGxvY2FsKTsKLQl9Ci0JZm9yICh0cCA9ICZ0dW5uZWxzW3ByaW9dW2hdOyAodCA9ICp0cCkgIT0gTlVMTDsgdHAgPSAmdC0+bmV4dCkgeworCWZvciAodHAgPSBfX2lwaXA2X2J1Y2tldChwYXJtcyk7ICh0ID0gKnRwKSAhPSBOVUxMOyB0cCA9ICZ0LT5uZXh0KSB7CiAJCWlmIChsb2NhbCA9PSB0LT5wYXJtcy5pcGguc2FkZHIgJiYgcmVtb3RlID09IHQtPnBhcm1zLmlwaC5kYWRkcikKIAkJCXJldHVybiB0OwogCX0KQEAgLTIyNCw4ICsyMTksOCBAQAogICAgSUNNUCBpbiB0aGUgcmVhbCBJbnRlcm5ldCBpcyBhYnNvbHV0ZWx5IGluZmVhc2libGUuCiAgKi8KIAlzdHJ1Y3QgaXBoZHIgKmlwaCA9IChzdHJ1Y3QgaXBoZHIqKXNrYi0+ZGF0YTsKLQlpbnQgdHlwZSA9IHNrYi0+aC5pY21waC0+dHlwZTsKLQlpbnQgY29kZSA9IHNrYi0+aC5pY21waC0+Y29kZTsKKwljb25zdCBpbnQgdHlwZSA9IGljbXBfaGRyKHNrYiktPnR5cGU7CisJY29uc3QgaW50IGNvZGUgPSBpY21wX2hkcihza2IpLT5jb2RlOwogCXN0cnVjdCBpcF90dW5uZWwgKnQ7CiAJaW50IGVycjsKIApAQCAtMjgwLDggKzI3NSw4IEBACiAJc3RydWN0IGlwaGRyICppcGggPSAoc3RydWN0IGlwaGRyKilkcDsKIAlpbnQgaGxlbiA9IGlwaC0+aWhsPDwyOwogCXN0cnVjdCBpcHY2aGRyICppcGg2OwotCWludCB0eXBlID0gc2tiLT5oLmljbXBoLT50eXBlOwotCWludCBjb2RlID0gc2tiLT5oLmljbXBoLT5jb2RlOworCWNvbnN0IGludCB0eXBlID0gaWNtcF9oZHIoc2tiKS0+dHlwZTsKKwljb25zdCBpbnQgY29kZSA9IGljbXBfaGRyKHNrYiktPmNvZGU7CiAJaW50IHJlbF90eXBlID0gMDsKIAlpbnQgcmVsX2NvZGUgPSAwOwogCWludCByZWxfaW5mbyA9IDA7CkBAIC0yOTYsMTQgKzI5MSwxNCBAQAogCWRlZmF1bHQ6CiAJCXJldHVybjsKIAljYXNlIElDTVBfUEFSQU1FVEVSUFJPQjoKLQkJaWYgKHNrYi0+aC5pY21waC0+dW4uZ2F0ZXdheSA8IGhsZW4pCisJCWlmIChpY21wX2hkcihza2IpLT51bi5nYXRld2F5IDwgaGxlbikKIAkJCXJldHVybjsKIAogCQkvKiBTby4uLiBUaGlzIGd1eSBmb3VuZCBzb21ldGhpbmcgc3RyYW5nZSBJTlNJREUgZW5jYXBzdWxhdGVkCiAJCSAgIHBhY2tldC4gV2VsbCwgaGUgaXMgZm9vbCwgYnV0IHdoYXQgY2FuIHdlIGRvID8KIAkJICovCiAJCXJlbF90eXBlID0gSUNNUFY2X1BBUkFNUFJPQjsKLQkJcmVsX2luZm8gPSBza2ItPmguaWNtcGgtPnVuLmdhdGV3YXkgLSBobGVuOworCQlyZWxfaW5mbyA9IGljbXBfaGRyKHNrYiktPnVuLmdhdGV3YXkgLSBobGVuOwogCQlicmVhazsKIAogCWNhc2UgSUNNUF9ERVNUX1VOUkVBQ0g6CkBAIC0zNDAsNyArMzM1LDcgQEAKIAlkc3RfcmVsZWFzZShza2IyLT5kc3QpOwogCXNrYjItPmRzdCA9IE5VTEw7CiAJc2tiX3B1bGwoc2tiMiwgc2tiLT5kYXRhIC0gKHU4KilpcGg2KTsKLQlza2IyLT5uaC5yYXcgPSBza2IyLT5kYXRhOworCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IyKTsKIAogCS8qIFRyeSB0byBndWVzcyBpbmNvbWluZyBpbnRlcmZhY2UgKi8KIAlydDZpID0gcnQ2X2xvb2t1cCgmaXBoNi0+c2FkZHIsIE5VTEwsIE5VTEwsIDApOwpAQCAtMzY2LDcgKzM2MSw3IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgaXBpcDZfZWNuX2RlY2Fwc3VsYXRlKHN0cnVjdCBpcGhkciAqaXBoLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCWlmIChJTkVUX0VDTl9pc19jZShpcGgtPnRvcykpCi0JCUlQNl9FQ05fc2V0X2NlKHNrYi0+bmguaXB2NmgpOworCQlJUDZfRUNOX3NldF9jZShpcHY2X2hkcihza2IpKTsKIH0KIAogc3RhdGljIGludCBpcGlwNl9yY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYikKQEAgLTM3NywxMyArMzcyLDEzIEBACiAJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSkpCiAJCWdvdG8gb3V0OwogCi0JaXBoID0gc2tiLT5uaC5pcGg7CisJaXBoID0gaXBfaGRyKHNrYik7CiAKIAlyZWFkX2xvY2soJmlwaXA2X2xvY2spOwogCWlmICgodHVubmVsID0gaXBpcDZfdHVubmVsX2xvb2t1cChpcGgtPnNhZGRyLCBpcGgtPmRhZGRyKSkgIT0gTlVMTCkgewogCQlzZWNwYXRoX3Jlc2V0KHNrYik7Ci0JCXNrYi0+bWFjLnJhdyA9IHNrYi0+bmgucmF3OwotCQlza2ItPm5oLnJhdyA9IHNrYi0+ZGF0YTsKKwkJc2tiLT5tYWNfaGVhZGVyID0gc2tiLT5uZXR3b3JrX2hlYWRlcjsKKwkJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CiAJCUlQQ0Ioc2tiKS0+ZmxhZ3MgPSAwOwogCQlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfSVBWNik7CiAJCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfSE9TVDsKQEAgLTQzMCw3ICs0MjUsNyBAQAogCXN0cnVjdCBpcF90dW5uZWwgKnR1bm5lbCA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJnR1bm5lbC0+c3RhdDsKIAlzdHJ1Y3QgaXBoZHIgICp0aXBoID0gJnR1bm5lbC0+cGFybXMuaXBoOwotCXN0cnVjdCBpcHY2aGRyICppcGg2ID0gc2tiLT5uaC5pcHY2aDsKKwlzdHJ1Y3QgaXB2NmhkciAqaXBoNiA9IGlwdjZfaGRyKHNrYik7CiAJdTggICAgIHRvcyA9IHR1bm5lbC0+cGFybXMuaXBoLnRvczsKIAlzdHJ1Y3QgcnRhYmxlICpydDsgICAgIAkJCS8qIFJvdXRlIHRvIHRoZSBvdGhlciBob3N0ICovCiAJc3RydWN0IG5ldF9kZXZpY2UgKnRkZXY7CQkJLyogRGV2aWNlIHRvIG90aGVyIGhvc3QgKi8KQEAgLTQ2OCw3ICs0NjMsNyBAQAogCQlhZGRyX3R5cGUgPSBpcHY2X2FkZHJfdHlwZShhZGRyNik7CiAKIAkJaWYgKGFkZHJfdHlwZSA9PSBJUFY2X0FERFJfQU5ZKSB7Ci0JCQlhZGRyNiA9ICZza2ItPm5oLmlwdjZoLT5kYWRkcjsKKwkJCWFkZHI2ID0gJmlwdjZfaGRyKHNrYiktPmRhZGRyOwogCQkJYWRkcl90eXBlID0gaXB2Nl9hZGRyX3R5cGUoYWRkcjYpOwogCQl9CiAKQEAgLTU1MCwxMSArNTQ1LDEyIEBACiAJCQlza2Jfc2V0X293bmVyX3cobmV3X3NrYiwgc2tiLT5zayk7CiAJCWRldl9rZnJlZV9za2Ioc2tiKTsKIAkJc2tiID0gbmV3X3NrYjsKLQkJaXBoNiA9IHNrYi0+bmguaXB2Nmg7CisJCWlwaDYgPSBpcHY2X2hkcihza2IpOwogCX0KIAotCXNrYi0+aC5yYXcgPSBza2ItPm5oLnJhdzsKLQlza2ItPm5oLnJhdyA9IHNrYl9wdXNoKHNrYiwgc2l6ZW9mKHN0cnVjdCBpcGhkcikpOworCXNrYi0+dHJhbnNwb3J0X2hlYWRlciA9IHNrYi0+bmV0d29ya19oZWFkZXI7CisJc2tiX3B1c2goc2tiLCBzaXplb2Yoc3RydWN0IGlwaGRyKSk7CisJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CiAJbWVtc2V0KCYoSVBDQihza2IpLT5vcHQpLCAwLCBzaXplb2YoSVBDQihza2IpLT5vcHQpKTsKIAlJUENCKHNrYiktPmZsYWdzID0gMDsKIAlkc3RfcmVsZWFzZShza2ItPmRzdCk7CkBAIC01NjQsNyArNTYwLDcgQEAKIAkgKglQdXNoIGRvd24gYW5kIGluc3RhbGwgdGhlIElQSVAgaGVhZGVyLgogCSAqLwogCi0JaXBoIAkJCT0Jc2tiLT5uaC5pcGg7CisJaXBoIAkJCT0JaXBfaGRyKHNrYik7CiAJaXBoLT52ZXJzaW9uCQk9CTQ7CiAJaXBoLT5paGwJCT0Jc2l6ZW9mKHN0cnVjdCBpcGhkcik+PjI7CiAJaWYgKG10dSA+IElQVjZfTUlOX01UVSkKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3RjcF9pcHY2LmMgYi9uZXQvaXB2Ni90Y3BfaXB2Ni5jCmluZGV4IDkyZjk5OTIuLmUyZjI1ZWEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3RjcF9pcHY2LmMKKysrIGIvbmV0L2lwdjYvdGNwX2lwdjYuYwpAQCAtMTE1LDEwICsxMTUsMTAgQEAKIAogc3RhdGljIF9fdTMyIHRjcF92Nl9pbml0X3NlcXVlbmNlKHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JcmV0dXJuIHNlY3VyZV90Y3B2Nl9zZXF1ZW5jZV9udW1iZXIoc2tiLT5uaC5pcHY2aC0+ZGFkZHIuczZfYWRkcjMyLAotCQkJCQkgICAgc2tiLT5uaC5pcHY2aC0+c2FkZHIuczZfYWRkcjMyLAotCQkJCQkgICAgc2tiLT5oLnRoLT5kZXN0LAotCQkJCQkgICAgc2tiLT5oLnRoLT5zb3VyY2UpOworCXJldHVybiBzZWN1cmVfdGNwdjZfc2VxdWVuY2VfbnVtYmVyKGlwdjZfaGRyKHNrYiktPmRhZGRyLnM2X2FkZHIzMiwKKwkJCQkJICAgIGlwdjZfaGRyKHNrYiktPnNhZGRyLnM2X2FkZHIzMiwKKwkJCQkJICAgIHRjcF9oZHIoc2tiKS0+ZGVzdCwKKwkJCQkJICAgIHRjcF9oZHIoc2tiKS0+c291cmNlKTsKIH0KIAogc3RhdGljIGludCB0Y3BfdjZfY29ubmVjdChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBzb2NrYWRkciAqdWFkZHIsCkBAIC00ODYsNyArNDg2LDkgQEAKIAkJCXN0cnVjdCBza19idWZmICpwa3RvcHRzID0gdHJlcS0+cGt0b3B0czsKIAkJCXN0cnVjdCBpbmV0Nl9za2JfcGFybSAqcnhvcHQgPSBJUDZDQihwa3RvcHRzKTsKIAkJCWlmIChyeG9wdC0+c3JjcnQpCi0JCQkJb3B0ID0gaXB2Nl9pbnZlcnRfcnRoZHIoc2ssIChzdHJ1Y3QgaXB2Nl9ydF9oZHIqKShwa3RvcHRzLT5uaC5yYXcgKyByeG9wdC0+c3JjcnQpKTsKKwkJCQlvcHQgPSBpcHY2X2ludmVydF9ydGhkcihzaywKKwkJCSAgKHN0cnVjdCBpcHY2X3J0X2hkciAqKShza2JfbmV0d29ya19oZWFkZXIocGt0b3B0cykgKworCQkJCQkJIHJ4b3B0LT5zcmNydCkpOwogCQl9CiAKIAkJaWYgKG9wdCAmJiBvcHQtPnNyY3J0KSB7CkBAIC01MDcsNyArNTA5LDcgQEAKIAogCXNrYiA9IHRjcF9tYWtlX3N5bmFjayhzaywgZHN0LCByZXEpOwogCWlmIChza2IpIHsKLQkJc3RydWN0IHRjcGhkciAqdGggPSBza2ItPmgudGg7CisJCXN0cnVjdCB0Y3BoZHIgKnRoID0gdGNwX2hkcihza2IpOwogCiAJCXRoLT5jaGVjayA9IHRjcF92Nl9jaGVjayh0aCwgc2tiLT5sZW4sCiAJCQkJCSAmdHJlcS0+bG9jX2FkZHIsICZ0cmVxLT5ybXRfYWRkciwKQEAgLTgzNSw4ICs4MzcsOCBAQAogewogCV9fdTggKmhhc2hfbG9jYXRpb24gPSBOVUxMOwogCXN0cnVjdCB0Y3BfbWQ1c2lnX2tleSAqaGFzaF9leHBlY3RlZDsKLQlzdHJ1Y3QgaXB2NmhkciAqaXA2aCA9IHNrYi0+bmguaXB2Nmg7Ci0Jc3RydWN0IHRjcGhkciAqdGggPSBza2ItPmgudGg7CisJc3RydWN0IGlwdjZoZHIgKmlwNmggPSBpcHY2X2hkcihza2IpOworCXN0cnVjdCB0Y3BoZHIgKnRoID0gdGNwX2hkcihza2IpOwogCWludCBsZW5ndGggPSAodGgtPmRvZmYgPDwgMikgLSBzaXplb2YgKCp0aCk7CiAJaW50IGdlbmhhc2g7CiAJdTggKnB0cjsKQEAgLTk0NCwxMCArOTQ2LDExIEBACiBzdGF0aWMgdm9pZCB0Y3BfdjZfc2VuZF9jaGVjayhzdHJ1Y3Qgc29jayAqc2ssIGludCBsZW4sIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IGlwdjZfcGluZm8gKm5wID0gaW5ldDZfc2soc2spOwotCXN0cnVjdCB0Y3BoZHIgKnRoID0gc2tiLT5oLnRoOworCXN0cnVjdCB0Y3BoZHIgKnRoID0gdGNwX2hkcihza2IpOwogCiAJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1BBUlRJQUwpIHsKIAkJdGgtPmNoZWNrID0gfmNzdW1faXB2Nl9tYWdpYygmbnAtPnNhZGRyLCAmbnAtPmRhZGRyLCBsZW4sIElQUFJPVE9fVENQLCAgMCk7CisJCXNrYi0+Y3N1bV9zdGFydCA9IHNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYikgLSBza2ItPmhlYWQ7CiAJCXNrYi0+Y3N1bV9vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3QgdGNwaGRyLCBjaGVjayk7CiAJfSBlbHNlIHsKIAkJdGgtPmNoZWNrID0gY3N1bV9pcHY2X21hZ2ljKCZucC0+c2FkZHIsICZucC0+ZGFkZHIsIGxlbiwgSVBQUk9UT19UQ1AsCkBAIC05NjQsMTIgKzk2NywxMyBAQAogCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZigqdGgpKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpcHY2aCA9IHNrYi0+bmguaXB2Nmg7Ci0JdGggPSBza2ItPmgudGg7CisJaXB2NmggPSBpcHY2X2hkcihza2IpOworCXRoID0gdGNwX2hkcihza2IpOwogCiAJdGgtPmNoZWNrID0gMDsKIAl0aC0+Y2hlY2sgPSB+Y3N1bV9pcHY2X21hZ2ljKCZpcHY2aC0+c2FkZHIsICZpcHY2aC0+ZGFkZHIsIHNrYi0+bGVuLAogCQkJCSAgICAgSVBQUk9UT19UQ1AsIDApOworCXNrYi0+Y3N1bV9zdGFydCA9IHNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYikgLSBza2ItPmhlYWQ7CiAJc2tiLT5jc3VtX29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCB0Y3BoZHIsIGNoZWNrKTsKIAlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1BBUlRJQUw7CiAJcmV0dXJuIDA7CkBAIC05NzcsNyArOTgxLDcgQEAKIAogc3RhdGljIHZvaWQgdGNwX3Y2X3NlbmRfcmVzZXQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXN0cnVjdCB0Y3BoZHIgKnRoID0gc2tiLT5oLnRoLCAqdDE7CisJc3RydWN0IHRjcGhkciAqdGggPSB0Y3BfaGRyKHNrYiksICp0MTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqYnVmZjsKIAlzdHJ1Y3QgZmxvd2kgZmw7CiAJaW50IHRvdF9sZW4gPSBzaXplb2YoKnRoKTsKQEAgLTk5Myw3ICs5OTcsNyBAQAogCiAjaWZkZWYgQ09ORklHX1RDUF9NRDVTSUcKIAlpZiAoc2spCi0JCWtleSA9IHRjcF92Nl9tZDVfZG9fbG9va3VwKHNrLCAmc2tiLT5uaC5pcHY2aC0+ZGFkZHIpOworCQlrZXkgPSB0Y3BfdjZfbWQ1X2RvX2xvb2t1cChzaywgJmlwdjZfaGRyKHNrYiktPmRhZGRyKTsKIAllbHNlCiAJCWtleSA9IE5VTEw7CiAKQEAgLTEwMzcsMjAgKzEwNDEsMTggQEAKIAkJCSAgICAgICAoVENQT1BUX05PUCA8PCAxNikgfAogCQkJICAgICAgIChUQ1BPUFRfTUQ1U0lHIDw8IDgpIHwKIAkJCSAgICAgICBUQ1BPTEVOX01ENVNJRyk7Ci0JCXRjcF92Nl9kb19jYWxjX21kNV9oYXNoKChfX3U4Kikmb3B0WzFdLAotCQkJCQlrZXksCi0JCQkJCSZza2ItPm5oLmlwdjZoLT5kYWRkciwKLQkJCQkJJnNrYi0+bmguaXB2NmgtPnNhZGRyLAotCQkJCQl0MSwgSVBQUk9UT19UQ1AsCi0JCQkJCXRvdF9sZW4pOworCQl0Y3BfdjZfZG9fY2FsY19tZDVfaGFzaCgoX191OCAqKSZvcHRbMV0sIGtleSwKKwkJCQkJJmlwdjZfaGRyKHNrYiktPmRhZGRyLAorCQkJCQkmaXB2Nl9oZHIoc2tiKS0+c2FkZHIsCisJCQkJCXQxLCBJUFBST1RPX1RDUCwgdG90X2xlbik7CiAJfQogI2VuZGlmCiAKIAlidWZmLT5jc3VtID0gY3N1bV9wYXJ0aWFsKChjaGFyICopdDEsIHNpemVvZigqdDEpLCAwKTsKIAogCW1lbXNldCgmZmwsIDAsIHNpemVvZihmbCkpOwotCWlwdjZfYWRkcl9jb3B5KCZmbC5mbDZfZHN0LCAmc2tiLT5uaC5pcHY2aC0+c2FkZHIpOwotCWlwdjZfYWRkcl9jb3B5KCZmbC5mbDZfc3JjLCAmc2tiLT5uaC5pcHY2aC0+ZGFkZHIpOworCWlwdjZfYWRkcl9jb3B5KCZmbC5mbDZfZHN0LCAmaXB2Nl9oZHIoc2tiKS0+c2FkZHIpOworCWlwdjZfYWRkcl9jb3B5KCZmbC5mbDZfc3JjLCAmaXB2Nl9oZHIoc2tiKS0+ZGFkZHIpOwogCiAJdDEtPmNoZWNrID0gY3N1bV9pcHY2X21hZ2ljKCZmbC5mbDZfc3JjLCAmZmwuZmw2X2RzdCwKIAkJCQkgICAgc2l6ZW9mKCp0MSksIElQUFJPVE9fVENQLApAQCAtMTA3OSw3ICsxMDgxLDcgQEAKIHN0YXRpYyB2b2lkIHRjcF92Nl9zZW5kX2FjayhzdHJ1Y3QgdGNwX3RpbWV3YWl0X3NvY2sgKnR3LAogCQkJICAgIHN0cnVjdCBza19idWZmICpza2IsIHUzMiBzZXEsIHUzMiBhY2ssIHUzMiB3aW4sIHUzMiB0cykKIHsKLQlzdHJ1Y3QgdGNwaGRyICp0aCA9IHNrYi0+aC50aCwgKnQxOworCXN0cnVjdCB0Y3BoZHIgKnRoID0gdGNwX2hkcihza2IpLCAqdDE7CiAJc3RydWN0IHNrX2J1ZmYgKmJ1ZmY7CiAJc3RydWN0IGZsb3dpIGZsOwogCWludCB0b3RfbGVuID0gc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpOwpAQCAtMTA5MSw3ICsxMDkzLDcgQEAKIAogI2lmZGVmIENPTkZJR19UQ1BfTUQ1U0lHCiAJaWYgKCF0dyAmJiBza2ItPnNrKSB7Ci0JCWtleSA9IHRjcF92Nl9tZDVfZG9fbG9va3VwKHNrYi0+c2ssICZza2ItPm5oLmlwdjZoLT5kYWRkcik7CisJCWtleSA9IHRjcF92Nl9tZDVfZG9fbG9va3VwKHNrYi0+c2ssICZpcHY2X2hkcihza2IpLT5kYWRkcik7CiAJfSBlbHNlIGlmICh0dyAmJiB0dy0+dHdfbWQ1X2tleWxlbikgewogCQl0d19rZXkua2V5ID0gdHctPnR3X21kNV9rZXk7CiAJCXR3X2tleS5rZXlsZW4gPSB0dy0+dHdfbWQ1X2tleWxlbjsKQEAgLTExNDAsMjAgKzExNDIsMTggQEAKIAlpZiAoa2V5KSB7CiAJCSp0b3B0KysgPSBodG9ubCgoVENQT1BUX05PUCA8PCAyNCkgfCAoVENQT1BUX05PUCA8PCAxNikgfAogCQkJCShUQ1BPUFRfTUQ1U0lHIDw8IDgpIHwgVENQT0xFTl9NRDVTSUcpOwotCQl0Y3BfdjZfZG9fY2FsY19tZDVfaGFzaCgoX191OCAqKXRvcHQsCi0JCQkJCWtleSwKLQkJCQkJJnNrYi0+bmguaXB2NmgtPmRhZGRyLAotCQkJCQkmc2tiLT5uaC5pcHY2aC0+c2FkZHIsCi0JCQkJCXQxLCBJUFBST1RPX1RDUCwKLQkJCQkJdG90X2xlbik7CisJCXRjcF92Nl9kb19jYWxjX21kNV9oYXNoKChfX3U4ICopdG9wdCwga2V5LAorCQkJCQkmaXB2Nl9oZHIoc2tiKS0+ZGFkZHIsCisJCQkJCSZpcHY2X2hkcihza2IpLT5zYWRkciwKKwkJCQkJdDEsIElQUFJPVE9fVENQLCB0b3RfbGVuKTsKIAl9CiAjZW5kaWYKIAogCWJ1ZmYtPmNzdW0gPSBjc3VtX3BhcnRpYWwoKGNoYXIgKil0MSwgdG90X2xlbiwgMCk7CiAKIAltZW1zZXQoJmZsLCAwLCBzaXplb2YoZmwpKTsKLQlpcHY2X2FkZHJfY29weSgmZmwuZmw2X2RzdCwgJnNrYi0+bmguaXB2NmgtPnNhZGRyKTsKLQlpcHY2X2FkZHJfY29weSgmZmwuZmw2X3NyYywgJnNrYi0+bmguaXB2NmgtPmRhZGRyKTsKKwlpcHY2X2FkZHJfY29weSgmZmwuZmw2X2RzdCwgJmlwdjZfaGRyKHNrYiktPnNhZGRyKTsKKwlpcHY2X2FkZHJfY29weSgmZmwuZmw2X3NyYywgJmlwdjZfaGRyKHNrYiktPmRhZGRyKTsKIAogCXQxLT5jaGVjayA9IGNzdW1faXB2Nl9tYWdpYygmZmwuZmw2X3NyYywgJmZsLmZsNl9kc3QsCiAJCQkJICAgIHRvdF9sZW4sIElQUFJPVE9fVENQLApAQCAtMTE5NywxOCArMTE5NywxOCBAQAogc3RhdGljIHN0cnVjdCBzb2NrICp0Y3BfdjZfaG5kX3JlcShzdHJ1Y3Qgc29jayAqc2ssc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEsICoqcHJldjsKLQljb25zdCBzdHJ1Y3QgdGNwaGRyICp0aCA9IHNrYi0+aC50aDsKKwljb25zdCBzdHJ1Y3QgdGNwaGRyICp0aCA9IHRjcF9oZHIoc2tiKTsKIAlzdHJ1Y3Qgc29jayAqbnNrOwogCiAJLyogRmluZCBwb3NzaWJsZSBjb25uZWN0aW9uIHJlcXVlc3RzLiAqLwogCXJlcSA9IGluZXQ2X2Nza19zZWFyY2hfcmVxKHNrLCAmcHJldiwgdGgtPnNvdXJjZSwKLQkJCQkgICAmc2tiLT5uaC5pcHY2aC0+c2FkZHIsCi0JCQkJICAgJnNrYi0+bmguaXB2NmgtPmRhZGRyLCBpbmV0Nl9paWYoc2tiKSk7CisJCQkJICAgJmlwdjZfaGRyKHNrYiktPnNhZGRyLAorCQkJCSAgICZpcHY2X2hkcihza2IpLT5kYWRkciwgaW5ldDZfaWlmKHNrYikpOwogCWlmIChyZXEpCiAJCXJldHVybiB0Y3BfY2hlY2tfcmVxKHNrLCBza2IsIHJlcSwgcHJldik7CiAKLQluc2sgPSBfX2luZXQ2X2xvb2t1cF9lc3RhYmxpc2hlZCgmdGNwX2hhc2hpbmZvLCAmc2tiLT5uaC5pcHY2aC0+c2FkZHIsCi0JCQkJCSB0aC0+c291cmNlLCAmc2tiLT5uaC5pcHY2aC0+ZGFkZHIsCisJbnNrID0gX19pbmV0Nl9sb29rdXBfZXN0YWJsaXNoZWQoJnRjcF9oYXNoaW5mbywgJmlwdjZfaGRyKHNrYiktPnNhZGRyLAorCQkJCQkgdGgtPnNvdXJjZSwgJmlwdjZfaGRyKHNrYiktPmRhZGRyLAogCQkJCQkgbnRvaHModGgtPmRlc3QpLCBpbmV0Nl9paWYoc2tiKSk7CiAKIAlpZiAobnNrKSB7CkBAIC0xMjc1LDkgKzEyNzUsOSBAQAogCXRjcF9vcGVucmVxX2luaXQocmVxLCAmdG1wX29wdCwgc2tiKTsKIAogCXRyZXEgPSBpbmV0Nl9yc2socmVxKTsKLQlpcHY2X2FkZHJfY29weSgmdHJlcS0+cm10X2FkZHIsICZza2ItPm5oLmlwdjZoLT5zYWRkcik7Ci0JaXB2Nl9hZGRyX2NvcHkoJnRyZXEtPmxvY19hZGRyLCAmc2tiLT5uaC5pcHY2aC0+ZGFkZHIpOwotCVRDUF9FQ05fY3JlYXRlX3JlcXVlc3QocmVxLCBza2ItPmgudGgpOworCWlwdjZfYWRkcl9jb3B5KCZ0cmVxLT5ybXRfYWRkciwgJmlwdjZfaGRyKHNrYiktPnNhZGRyKTsKKwlpcHY2X2FkZHJfY29weSgmdHJlcS0+bG9jX2FkZHIsICZpcHY2X2hkcihza2IpLT5kYWRkcik7CisJVENQX0VDTl9jcmVhdGVfcmVxdWVzdChyZXEsIHRjcF9oZHIoc2tiKSk7CiAJdHJlcS0+cGt0b3B0cyA9IE5VTEw7CiAJaWYgKGlwdjZfb3B0X2FjY2VwdGVkKHNrLCBza2IpIHx8CiAJICAgIG5wLT5yeG9wdC5iaXRzLnJ4aW5mbyB8fCBucC0+cnhvcHQuYml0cy5yeG9pbmZvIHx8CkBAIC0xMzYzLDcgKzEzNjMsNyBAQAogCQluZXducC0+cGt0b3B0aW9ucyAgPSBOVUxMOwogCQluZXducC0+b3B0CSAgID0gTlVMTDsKIAkJbmV3bnAtPm1jYXN0X29pZiAgID0gaW5ldDZfaWlmKHNrYik7Ci0JCW5ld25wLT5tY2FzdF9ob3BzICA9IHNrYi0+bmguaXB2NmgtPmhvcF9saW1pdDsKKwkJbmV3bnAtPm1jYXN0X2hvcHMgID0gaXB2Nl9oZHIoc2tiKS0+aG9wX2xpbWl0OwogCiAJCS8qCiAJCSAqIE5vIG5lZWQgdG8gY2hhcmdlIHRoaXMgc29jayB0byB0aGUgcmVsZXZhbnQgSVB2NiByZWZjbnQgZGVidWcgc29ja3MgY291bnQKQEAgLTEzODksNyArMTM4OSw5IEBACiAJICAgIG9wdCA9PSBOVUxMICYmIHRyZXEtPnBrdG9wdHMpIHsKIAkJc3RydWN0IGluZXQ2X3NrYl9wYXJtICpyeG9wdCA9IElQNkNCKHRyZXEtPnBrdG9wdHMpOwogCQlpZiAocnhvcHQtPnNyY3J0KQotCQkJb3B0ID0gaXB2Nl9pbnZlcnRfcnRoZHIoc2ssIChzdHJ1Y3QgaXB2Nl9ydF9oZHIgKikodHJlcS0+cGt0b3B0cy0+bmgucmF3ICsgcnhvcHQtPnNyY3J0KSk7CisJCQlvcHQgPSBpcHY2X2ludmVydF9ydGhkcihzaywKKwkJICAgKHN0cnVjdCBpcHY2X3J0X2hkciAqKShza2JfbmV0d29ya19oZWFkZXIodHJlcS0+cGt0b3B0cykgKworCQkJCQkgIHJ4b3B0LT5zcmNydCkpOwogCX0KIAogCWlmIChkc3QgPT0gTlVMTCkgewpAQCAtMTQ2OSw3ICsxNDcxLDcgQEAKIAl9CiAJbmV3bnAtPm9wdAkgID0gTlVMTDsKIAluZXducC0+bWNhc3Rfb2lmICA9IGluZXQ2X2lpZihza2IpOwotCW5ld25wLT5tY2FzdF9ob3BzID0gc2tiLT5uaC5pcHY2aC0+aG9wX2xpbWl0OworCW5ld25wLT5tY2FzdF9ob3BzID0gaXB2Nl9oZHIoc2tiKS0+aG9wX2xpbWl0OwogCiAJLyogQ2xvbmUgbmF0aXZlIElQdjYgb3B0aW9ucyBmcm9tIGxpc3RlbmluZyBzb2NrZXQgKGlmIGFueSkKIApAQCAtMTUyOCwxNSArMTUzMCwxNiBAQAogc3RhdGljIF9fc3VtMTYgdGNwX3Y2X2NoZWNrc3VtX2luaXQoc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fQ09NUExFVEUpIHsKLQkJaWYgKCF0Y3BfdjZfY2hlY2soc2tiLT5oLnRoLHNrYi0+bGVuLCZza2ItPm5oLmlwdjZoLT5zYWRkciwKLQkJCQkgICZza2ItPm5oLmlwdjZoLT5kYWRkcixza2ItPmNzdW0pKSB7CisJCWlmICghdGNwX3Y2X2NoZWNrKHRjcF9oZHIoc2tiKSwgc2tiLT5sZW4sICZpcHY2X2hkcihza2IpLT5zYWRkciwKKwkJCQkgICZpcHY2X2hkcihza2IpLT5kYWRkciwgc2tiLT5jc3VtKSkgewogCQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKIAkJCXJldHVybiAwOwogCQl9CiAJfQogCi0Jc2tiLT5jc3VtID0gfmNzdW1fdW5mb2xkKHRjcF92Nl9jaGVjayhza2ItPmgudGgsc2tiLT5sZW4sJnNrYi0+bmguaXB2NmgtPnNhZGRyLAotCQkJCSAgJnNrYi0+bmguaXB2NmgtPmRhZGRyLCAwKSk7CisJc2tiLT5jc3VtID0gfmNzdW1fdW5mb2xkKHRjcF92Nl9jaGVjayh0Y3BfaGRyKHNrYiksIHNrYi0+bGVuLAorCQkJCQkgICAgICAmaXB2Nl9oZHIoc2tiKS0+c2FkZHIsCisJCQkJCSAgICAgICZpcHY2X2hkcihza2IpLT5kYWRkciwgMCkpOwogCiAJaWYgKHNrYi0+bGVuIDw9IDc2KSB7CiAJCXJldHVybiBfX3NrYl9jaGVja3N1bV9jb21wbGV0ZShza2IpOwpAQCAtMTYwMCw3ICsxNjAzLDcgQEAKIAogCWlmIChzay0+c2tfc3RhdGUgPT0gVENQX0VTVEFCTElTSEVEKSB7IC8qIEZhc3QgcGF0aCAqLwogCQlUQ1BfQ0hFQ0tfVElNRVIoc2spOwotCQlpZiAodGNwX3Jjdl9lc3RhYmxpc2hlZChzaywgc2tiLCBza2ItPmgudGgsIHNrYi0+bGVuKSkKKwkJaWYgKHRjcF9yY3ZfZXN0YWJsaXNoZWQoc2ssIHNrYiwgdGNwX2hkcihza2IpLCBza2ItPmxlbikpCiAJCQlnb3RvIHJlc2V0OwogCQlUQ1BfQ0hFQ0tfVElNRVIoc2spOwogCQlpZiAob3B0X3NrYikKQEAgLTE2MDgsNyArMTYxMSw3IEBACiAJCXJldHVybiAwOwogCX0KIAotCWlmIChza2ItPmxlbiA8IChza2ItPmgudGgtPmRvZmY8PDIpIHx8IHRjcF9jaGVja3N1bV9jb21wbGV0ZShza2IpKQorCWlmIChza2ItPmxlbiA8IHRjcF9oZHJsZW4oc2tiKSB8fCB0Y3BfY2hlY2tzdW1fY29tcGxldGUoc2tiKSkKIAkJZ290byBjc3VtX2VycjsKIAogCWlmIChzay0+c2tfc3RhdGUgPT0gVENQX0xJU1RFTikgewpAQCAtMTYzMSw3ICsxNjM0LDcgQEAKIAl9CiAKIAlUQ1BfQ0hFQ0tfVElNRVIoc2spOwotCWlmICh0Y3BfcmN2X3N0YXRlX3Byb2Nlc3Moc2ssIHNrYiwgc2tiLT5oLnRoLCBza2ItPmxlbikpCisJaWYgKHRjcF9yY3Zfc3RhdGVfcHJvY2Vzcyhzaywgc2tiLCB0Y3BfaGRyKHNrYiksIHNrYi0+bGVuKSkKIAkJZ290byByZXNldDsKIAlUQ1BfQ0hFQ0tfVElNRVIoc2spOwogCWlmIChvcHRfc2tiKQpAQCAtMTY2NCw3ICsxNjY3LDcgQEAKIAkJaWYgKG5wLT5yeG9wdC5iaXRzLnJ4aW5mbyB8fCBucC0+cnhvcHQuYml0cy5yeG9pbmZvKQogCQkJbnAtPm1jYXN0X29pZiA9IGluZXQ2X2lpZihvcHRfc2tiKTsKIAkJaWYgKG5wLT5yeG9wdC5iaXRzLnJ4aGxpbSB8fCBucC0+cnhvcHQuYml0cy5yeG9obGltKQotCQkJbnAtPm1jYXN0X2hvcHMgPSBvcHRfc2tiLT5uaC5pcHY2aC0+aG9wX2xpbWl0OworCQkJbnAtPm1jYXN0X2hvcHMgPSBpcHY2X2hkcihvcHRfc2tiKS0+aG9wX2xpbWl0OwogCQlpZiAoaXB2Nl9vcHRfYWNjZXB0ZWQoc2ssIG9wdF9za2IpKSB7CiAJCQlza2Jfc2V0X293bmVyX3Iob3B0X3NrYiwgc2spOwogCQkJb3B0X3NrYiA9IHhjaGcoJm5wLT5wa3RvcHRpb25zLCBvcHRfc2tiKTsKQEAgLTE2OTcsMjggKzE3MDAsMjcgQEAKIAlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IHRjcGhkcikpKQogCQlnb3RvIGRpc2NhcmRfaXQ7CiAKLQl0aCA9IHNrYi0+aC50aDsKKwl0aCA9IHRjcF9oZHIoc2tiKTsKIAogCWlmICh0aC0+ZG9mZiA8IHNpemVvZihzdHJ1Y3QgdGNwaGRyKS80KQogCQlnb3RvIGJhZF9wYWNrZXQ7CiAJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgdGgtPmRvZmYqNCkpCiAJCWdvdG8gZGlzY2FyZF9pdDsKIAotCWlmICgoc2tiLT5pcF9zdW1tZWQgIT0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlkgJiYKLQkgICAgIHRjcF92Nl9jaGVja3N1bV9pbml0KHNrYikpKQorCWlmICghc2tiX2NzdW1fdW5uZWNlc3Nhcnkoc2tiKSAmJiB0Y3BfdjZfY2hlY2tzdW1faW5pdChza2IpKQogCQlnb3RvIGJhZF9wYWNrZXQ7CiAKLQl0aCA9IHNrYi0+aC50aDsKKwl0aCA9IHRjcF9oZHIoc2tiKTsKIAlUQ1BfU0tCX0NCKHNrYiktPnNlcSA9IG50b2hsKHRoLT5zZXEpOwogCVRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcSA9IChUQ1BfU0tCX0NCKHNrYiktPnNlcSArIHRoLT5zeW4gKyB0aC0+ZmluICsKIAkJCQkgICAgc2tiLT5sZW4gLSB0aC0+ZG9mZio0KTsKIAlUQ1BfU0tCX0NCKHNrYiktPmFja19zZXEgPSBudG9obCh0aC0+YWNrX3NlcSk7CiAJVENQX1NLQl9DQihza2IpLT53aGVuID0gMDsKLQlUQ1BfU0tCX0NCKHNrYiktPmZsYWdzID0gaXB2Nl9nZXRfZHNmaWVsZChza2ItPm5oLmlwdjZoKTsKKwlUQ1BfU0tCX0NCKHNrYiktPmZsYWdzID0gaXB2Nl9nZXRfZHNmaWVsZChpcHY2X2hkcihza2IpKTsKIAlUQ1BfU0tCX0NCKHNrYiktPnNhY2tlZCA9IDA7CiAKLQlzayA9IF9faW5ldDZfbG9va3VwKCZ0Y3BfaGFzaGluZm8sICZza2ItPm5oLmlwdjZoLT5zYWRkciwgdGgtPnNvdXJjZSwKLQkJCSAgICAmc2tiLT5uaC5pcHY2aC0+ZGFkZHIsIG50b2hzKHRoLT5kZXN0KSwKKwlzayA9IF9faW5ldDZfbG9va3VwKCZ0Y3BfaGFzaGluZm8sICZpcHY2X2hkcihza2IpLT5zYWRkciwgdGgtPnNvdXJjZSwKKwkJCSAgICAmaXB2Nl9oZHIoc2tiKS0+ZGFkZHIsIG50b2hzKHRoLT5kZXN0KSwKIAkJCSAgICBpbmV0Nl9paWYoc2tiKSk7CiAKIAlpZiAoIXNrKQpAQCAtMTc5OCw3ICsxODAwLDcgQEAKIAkJc3RydWN0IHNvY2sgKnNrMjsKIAogCQlzazIgPSBpbmV0Nl9sb29rdXBfbGlzdGVuZXIoJnRjcF9oYXNoaW5mbywKLQkJCQkJICAgICZza2ItPm5oLmlwdjZoLT5kYWRkciwKKwkJCQkJICAgICZpcHY2X2hkcihza2IpLT5kYWRkciwKIAkJCQkJICAgIG50b2hzKHRoLT5kZXN0KSwgaW5ldDZfaWlmKHNrYikpOwogCQlpZiAoc2syICE9IE5VTEwpIHsKIAkJCXN0cnVjdCBpbmV0X3RpbWV3YWl0X3NvY2sgKnR3ID0gaW5ldF90d3NrKHNrKTsKQEAgLTE5NDUsNiArMTk0Nyw3IEBACiAJcmV0dXJuIGluZXQ2X2Rlc3Ryb3lfc29jayhzayk7CiB9CiAKKyNpZmRlZiBDT05GSUdfUFJPQ19GUwogLyogUHJvYyBmaWxlc3lzdGVtIFRDUHY2IHNvY2sgbGlzdCBkdW1waW5nLiAqLwogc3RhdGljIHZvaWQgZ2V0X29wZW5yZXE2KHN0cnVjdCBzZXFfZmlsZSAqc2VxLAogCQkJIHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxLCBpbnQgaSwgaW50IHVpZCkKQEAgLTIwNjEsNyArMjA2NCw2IEBACiAJCSAgIGF0b21pY19yZWFkKCZ0dy0+dHdfcmVmY250KSwgdHcpOwogfQogCi0jaWZkZWYgQ09ORklHX1BST0NfRlMKIHN0YXRpYyBpbnQgdGNwNl9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKIHsKIAlzdHJ1Y3QgdGNwX2l0ZXJfc3RhdGUgKnN0OwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvdWRwLmMgYi9uZXQvaXB2Ni91ZHAuYwppbmRleCBmNTkwZGI1Li5iMDgzYzA5IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni91ZHAuYworKysgYi9uZXQvaXB2Ni91ZHAuYwpAQCAtOTMsMTAgKzkzLDEwIEBACiAJCQkJCWNvbnRpbnVlOwogCQkJCXNjb3JlKys7CiAJCQl9Ci0JCQlpZihzY29yZSA9PSA0KSB7CisJCQlpZiAoc2NvcmUgPT0gNCkgewogCQkJCXJlc3VsdCA9IHNrOwogCQkJCWJyZWFrOwotCQkJfSBlbHNlIGlmKHNjb3JlID4gYmFkbmVzcykgeworCQkJfSBlbHNlIGlmIChzY29yZSA+IGJhZG5lc3MpIHsKIAkJCQlyZXN1bHQgPSBzazsKIAkJCQliYWRuZXNzID0gc2NvcmU7CiAJCQl9CkBAIC0xMjAsOCArMTIwLDkgQEAKIAlzdHJ1Y3QgaXB2Nl9waW5mbyAqbnAgPSBpbmV0Nl9zayhzayk7CiAJc3RydWN0IGluZXRfc29jayAqaW5ldCA9IGluZXRfc2soc2spOwogCXN0cnVjdCBza19idWZmICpza2I7Ci0Jc2l6ZV90IGNvcGllZDsKLQlpbnQgZXJyLCBjb3B5X29ubHksIGlzX3VkcGxpdGUgPSBJU19VRFBMSVRFKHNrKTsKKwl1bnNpZ25lZCBpbnQgdWxlbiwgY29waWVkOworCWludCBlcnI7CisJaW50IGlzX3VkcGxpdGUgPSBJU19VRFBMSVRFKHNrKTsKIAogCWlmIChhZGRyX2xlbikKIAkJKmFkZHJfbGVuPXNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KTsKQEAgLTEzNCwyNCArMTM1LDI1IEBACiAJaWYgKCFza2IpCiAJCWdvdG8gb3V0OwogCi0JY29waWVkID0gc2tiLT5sZW4gLSBzaXplb2Yoc3RydWN0IHVkcGhkcik7Ci0JaWYgKGNvcGllZCA+IGxlbikgewotCQljb3BpZWQgPSBsZW47CisJdWxlbiA9IHNrYi0+bGVuIC0gc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpOworCWNvcGllZCA9IGxlbjsKKwlpZiAoY29waWVkID4gdWxlbikKKwkJY29waWVkID0gdWxlbjsKKwllbHNlIGlmIChjb3BpZWQgPCB1bGVuKQogCQltc2ctPm1zZ19mbGFncyB8PSBNU0dfVFJVTkM7Ci0JfQogCiAJLyoKLQkgKiAJRGVjaWRlIHdoZXRoZXIgdG8gY2hlY2tzdW0gYW5kL29yIGNvcHkgZGF0YS4KKwkgKiBJZiBjaGVja3N1bSBpcyBuZWVkZWQgYXQgYWxsLCB0cnkgdG8gZG8gaXQgd2hpbGUgY29weWluZyB0aGUKKwkgKiBkYXRhLiAgSWYgdGhlIGRhdGEgaXMgdHJ1bmNhdGVkLCBvciBpZiB3ZSBvbmx5IHdhbnQgYSBwYXJ0aWFsCisJICogY292ZXJhZ2UgY2hlY2tzdW0gKFVEUC1MaXRlKSwgZG8gaXQgYmVmb3JlIHRoZSBjb3B5LgogCSAqLwotCWNvcHlfb25seSA9IChza2ItPmlwX3N1bW1lZD09Q0hFQ0tTVU1fVU5ORUNFU1NBUlkpOwogCi0JaWYgKGlzX3VkcGxpdGUgIHx8ICAoIWNvcHlfb25seSAgJiYgIG1zZy0+bXNnX2ZsYWdzJk1TR19UUlVOQykpIHsKLQkJaWYgKF9fdWRwX2xpYl9jaGVja3N1bV9jb21wbGV0ZShza2IpKQorCWlmIChjb3BpZWQgPCB1bGVuIHx8IFVEUF9TS0JfQ0Ioc2tiKS0+cGFydGlhbF9jb3YpIHsKKwkJaWYgKHVkcF9saWJfY2hlY2tzdW1fY29tcGxldGUoc2tiKSkKIAkJCWdvdG8gY3N1bV9jb3B5X2VycjsKLQkJY29weV9vbmx5ID0gMTsKIAl9CiAKLQlpZiAoY29weV9vbmx5KQorCWlmIChza2JfY3N1bV91bm5lY2Vzc2FyeShza2IpKQogCQllcnIgPSBza2JfY29weV9kYXRhZ3JhbV9pb3ZlYyhza2IsIHNpemVvZihzdHJ1Y3QgdWRwaGRyKSwKIAkJCQkJICAgICAgbXNnLT5tc2dfaW92LCBjb3BpZWQgICAgICAgKTsKIAllbHNlIHsKQEAgLTE3MCwxNSArMTcyLDE2IEBACiAKIAkJc2luNiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopIG1zZy0+bXNnX25hbWU7CiAJCXNpbjYtPnNpbjZfZmFtaWx5ID0gQUZfSU5FVDY7Ci0JCXNpbjYtPnNpbjZfcG9ydCA9IHNrYi0+aC51aC0+c291cmNlOworCQlzaW42LT5zaW42X3BvcnQgPSB1ZHBfaGRyKHNrYiktPnNvdXJjZTsKIAkJc2luNi0+c2luNl9mbG93aW5mbyA9IDA7CiAJCXNpbjYtPnNpbjZfc2NvcGVfaWQgPSAwOwogCiAJCWlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX0lQKSkKIAkJCWlwdjZfYWRkcl9zZXQoJnNpbjYtPnNpbjZfYWRkciwgMCwgMCwKLQkJCQkgICAgICBodG9ubCgweGZmZmYpLCBza2ItPm5oLmlwaC0+c2FkZHIpOworCQkJCSAgICAgIGh0b25sKDB4ZmZmZiksIGlwX2hkcihza2IpLT5zYWRkcik7CiAJCWVsc2UgewotCQkJaXB2Nl9hZGRyX2NvcHkoJnNpbjYtPnNpbjZfYWRkciwgJnNrYi0+bmguaXB2NmgtPnNhZGRyKTsKKwkJCWlwdjZfYWRkcl9jb3B5KCZzaW42LT5zaW42X2FkZHIsCisJCQkJICAgICAgICZpcHY2X2hkcihza2IpLT5zYWRkcik7CiAJCQlpZiAoaXB2Nl9hZGRyX3R5cGUoJnNpbjYtPnNpbjZfYWRkcikgJiBJUFY2X0FERFJfTElOS0xPQ0FMKQogCQkJCXNpbjYtPnNpbjZfc2NvcGVfaWQgPSBJUDZDQihza2IpLT5paWY7CiAJCX0KQEAgLTE5NCw3ICsxOTcsNyBAQAogCiAJZXJyID0gY29waWVkOwogCWlmIChmbGFncyAmIE1TR19UUlVOQykKLQkJZXJyID0gc2tiLT5sZW4gLSBzaXplb2Yoc3RydWN0IHVkcGhkcik7CisJCWVyciA9IHVsZW47CiAKIG91dF9mcmVlOgogCXNrYl9mcmVlX2RhdGFncmFtKHNrLCBza2IpOwpAQCAtMjc5LDggKzI4MiwxMCBAQAogCQl9CiAJfQogCi0JaWYgKHVkcF9saWJfY2hlY2tzdW1fY29tcGxldGUoc2tiKSkKLQkJZ290byBkcm9wOworCWlmIChzay0+c2tfZmlsdGVyKSB7CisJCWlmICh1ZHBfbGliX2NoZWNrc3VtX2NvbXBsZXRlKHNrYikpCisJCQlnb3RvIGRyb3A7CisJfQogCiAJaWYgKChyYyA9IHNvY2tfcXVldWVfcmN2X3NrYihzayxza2IpKSA8IDApIHsKIAkJLyogTm90ZSB0aGF0IGFuIEVOT01FTSBlcnJvciBpcyBjaGFyZ2VkIHR3aWNlICovCkBAIC0zMjUsNyArMzMwLDcgQEAKIAkJCQlpZiAoIWlwdjZfYWRkcl9lcXVhbCgmbnAtPnJjdl9zYWRkciwgbG9jX2FkZHIpKQogCQkJCQljb250aW51ZTsKIAkJCX0KLQkJCWlmKCFpbmV0Nl9tY19jaGVjayhzLCBsb2NfYWRkciwgcm10X2FkZHIpKQorCQkJaWYgKCFpbmV0Nl9tY19jaGVjayhzLCBsb2NfYWRkciwgcm10X2FkZHIpKQogCQkJCWNvbnRpbnVlOwogCQkJcmV0dXJuIHM7CiAJCX0KQEAgLTM0MSw3ICszNDYsNyBAQAogCQkJICAgc3RydWN0IGluNl9hZGRyICpkYWRkciwgc3RydWN0IGhsaXN0X2hlYWQgdWRwdGFibGVbXSkKIHsKIAlzdHJ1Y3Qgc29jayAqc2ssICpzazI7Ci0JY29uc3Qgc3RydWN0IHVkcGhkciAqdWggPSBza2ItPmgudWg7CisJY29uc3Qgc3RydWN0IHVkcGhkciAqdWggPSB1ZHBfaGRyKHNrYik7CiAJaW50IGRpZjsKIAogCXJlYWRfbG9jaygmdWRwX2hhc2hfbG9jayk7CkBAIC0zNjYsOSArMzcxLDIwIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHVkcDZfY3N1bV9pbml0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB1ZHBoZHIgKnVoKQotCitzdGF0aWMgaW5saW5lIGludCB1ZHA2X2NzdW1faW5pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdWRwaGRyICp1aCwKKwkJCQkgaW50IHByb3RvKQogeworCWludCBlcnI7CisKKwlVRFBfU0tCX0NCKHNrYiktPnBhcnRpYWxfY292ID0gMDsKKwlVRFBfU0tCX0NCKHNrYiktPmNzY292ID0gc2tiLT5sZW47CisKKwlpZiAocHJvdG8gPT0gSVBQUk9UT19VRFBMSVRFKSB7CisJCWVyciA9IHVkcGxpdGVfY2hlY2tzdW1faW5pdChza2IsIHVoKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJfQorCiAJaWYgKHVoLT5jaGVjayA9PSAwKSB7CiAJCS8qIFJGQyAyNDYwIHNlY3Rpb24gOC4xIHNheXMgdGhhdCB3ZSBTSE9VTEQgbG9nCiAJCSAgIHRoaXMgZXJyb3IuIFdlbGwsIGl0IGlzIHJlYXNvbmFibGUuCkBAIC0zNzcsMjEgKzM5MywyMCBAQAogCQlyZXR1cm4gMTsKIAl9CiAJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0NPTVBMRVRFICYmCi0JICAgICFjc3VtX2lwdjZfbWFnaWMoJnNrYi0+bmguaXB2NmgtPnNhZGRyLCAmc2tiLT5uaC5pcHY2aC0+ZGFkZHIsCi0JCQkgICAgIHNrYi0+bGVuLCBJUFBST1RPX1VEUCwgc2tiLT5jc3VtICAgICAgICAgICAgICkpCisJICAgICFjc3VtX2lwdjZfbWFnaWMoJmlwdjZfaGRyKHNrYiktPnNhZGRyLCAmaXB2Nl9oZHIoc2tiKS0+ZGFkZHIsCisJCQkgICAgIHNrYi0+bGVuLCBwcm90bywgc2tiLT5jc3VtKSkKIAkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKIAotCWlmIChza2ItPmlwX3N1bW1lZCAhPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWSkKLQkJc2tiLT5jc3VtID0gfmNzdW1fdW5mb2xkKGNzdW1faXB2Nl9tYWdpYygmc2tiLT5uaC5pcHY2aC0+c2FkZHIsCi0JCQkJCQkJICZza2ItPm5oLmlwdjZoLT5kYWRkciwKLQkJCQkJCQkgc2tiLT5sZW4sIElQUFJPVE9fVURQLAotCQkJCQkJCSAwKSk7CisJaWYgKCFza2JfY3N1bV91bm5lY2Vzc2FyeShza2IpKQorCQlza2ItPmNzdW0gPSB+Y3N1bV91bmZvbGQoY3N1bV9pcHY2X21hZ2ljKCZpcHY2X2hkcihza2IpLT5zYWRkciwKKwkJCQkJCQkgJmlwdjZfaGRyKHNrYiktPmRhZGRyLAorCQkJCQkJCSBza2ItPmxlbiwgcHJvdG8sIDApKTsKIAotCXJldHVybiAoVURQX1NLQl9DQihza2IpLT5wYXJ0aWFsX2NvdiA9IDApOworCXJldHVybiAwOwogfQogCiBpbnQgX191ZHA2X2xpYl9yY3Yoc3RydWN0IHNrX2J1ZmYgKipwc2tiLCBzdHJ1Y3QgaGxpc3RfaGVhZCB1ZHB0YWJsZVtdLAotCQkgICBpbnQgaXNfdWRwbGl0ZSkKKwkJICAgaW50IHByb3RvKQogewogCXN0cnVjdCBza19idWZmICpza2IgPSAqcHNrYjsKIAlzdHJ1Y3Qgc29jayAqc2s7CkBAIC00MDMsMTUgKzQxOCwxNiBAQAogCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgdWRwaGRyKSkpCiAJCWdvdG8gc2hvcnRfcGFja2V0OwogCi0Jc2FkZHIgPSAmc2tiLT5uaC5pcHY2aC0+c2FkZHI7Ci0JZGFkZHIgPSAmc2tiLT5uaC5pcHY2aC0+ZGFkZHI7Ci0JdWggPSBza2ItPmgudWg7CisJc2FkZHIgPSAmaXB2Nl9oZHIoc2tiKS0+c2FkZHI7CisJZGFkZHIgPSAmaXB2Nl9oZHIoc2tiKS0+ZGFkZHI7CisJdWggPSB1ZHBfaGRyKHNrYik7CiAKIAl1bGVuID0gbnRvaHModWgtPmxlbik7CiAJaWYgKHVsZW4gPiBza2ItPmxlbikKIAkJZ290byBzaG9ydF9wYWNrZXQ7CiAKLQlpZighIGlzX3VkcGxpdGUgKSB7CQkvKiBVRFAgdmFsaWRhdGVzIHVsZW4uICovCisJaWYgKHByb3RvID09IElQUFJPVE9fVURQKSB7CisJCS8qIFVEUCB2YWxpZGF0ZXMgdWxlbi4gKi8KIAogCQkvKiBDaGVjayBmb3IganVtYm8gcGF5bG9hZCAqLwogCQlpZiAodWxlbiA9PSAwKQpAQCAtNDIzLDE5ICs0MzksMTUgQEAKIAkJaWYgKHVsZW4gPCBza2ItPmxlbikgewogCQkJaWYgKHBza2JfdHJpbV9yY3N1bShza2IsIHVsZW4pKQogCQkJCWdvdG8gc2hvcnRfcGFja2V0OwotCQkJc2FkZHIgPSAmc2tiLT5uaC5pcHY2aC0+c2FkZHI7Ci0JCQlkYWRkciA9ICZza2ItPm5oLmlwdjZoLT5kYWRkcjsKLQkJCXVoID0gc2tiLT5oLnVoOworCQkJc2FkZHIgPSAmaXB2Nl9oZHIoc2tiKS0+c2FkZHI7CisJCQlkYWRkciA9ICZpcHY2X2hkcihza2IpLT5kYWRkcjsKKwkJCXVoID0gdWRwX2hkcihza2IpOwogCQl9Ci0KLQkJaWYgKHVkcDZfY3N1bV9pbml0KHNrYiwgdWgpKQotCQkJZ290byBkaXNjYXJkOwotCi0JfSBlbHNlIAl7CQkJLyogVURQLUxpdGUgdmFsaWRhdGVzIGNzY292LiAqLwotCQlpZiAodWRwbGl0ZTZfY3N1bV9pbml0KHNrYiwgdWgpKQotCQkJZ290byBkaXNjYXJkOwogCX0KIAorCWlmICh1ZHA2X2NzdW1faW5pdChza2IsIHVoLCBwcm90bykpCisJCWdvdG8gZGlzY2FyZDsKKwogCS8qCiAJICoJTXVsdGljYXN0IHJlY2VpdmUgY29kZQogCSAqLwpAQCAtNDU3LDMzICs0NjksMzQgQEAKIAogCQlpZiAodWRwX2xpYl9jaGVja3N1bV9jb21wbGV0ZShza2IpKQogCQkJZ290byBkaXNjYXJkOwotCQlVRFA2X0lOQ19TVEFUU19CSChVRFBfTUlCX05PUE9SVFMsIGlzX3VkcGxpdGUpOworCQlVRFA2X0lOQ19TVEFUU19CSChVRFBfTUlCX05PUE9SVFMsIHByb3RvID09IElQUFJPVE9fVURQTElURSk7CiAKIAkJaWNtcHY2X3NlbmQoc2tiLCBJQ01QVjZfREVTVF9VTlJFQUNILCBJQ01QVjZfUE9SVF9VTlJFQUNILCAwLCBkZXYpOwogCiAJCWtmcmVlX3NrYihza2IpOwotCQlyZXR1cm4oMCk7CisJCXJldHVybiAwOwogCX0KIAogCS8qIGRlbGl2ZXIgKi8KIAogCXVkcHY2X3F1ZXVlX3Jjdl9za2Ioc2ssIHNrYik7CiAJc29ja19wdXQoc2spOwotCXJldHVybigwKTsKKwlyZXR1cm4gMDsKIAogc2hvcnRfcGFja2V0OgogCUxJTUlUX05FVERFQlVHKEtFUk5fREVCVUcgIlVEUCVzdjY6IHNob3J0IHBhY2tldDogJWQvJXVcbiIsCi0JCSAgICAgICBpc191ZHBsaXRlPyAiLUxpdGUiIDogIiIsICB1bGVuLCBza2ItPmxlbik7CisJCSAgICAgICBwcm90byA9PSBJUFBST1RPX1VEUExJVEUgPyAiLUxpdGUiIDogIiIsCisJCSAgICAgICB1bGVuLCBza2ItPmxlbik7CiAKIGRpc2NhcmQ6Ci0JVURQNl9JTkNfU1RBVFNfQkgoVURQX01JQl9JTkVSUk9SUywgaXNfdWRwbGl0ZSk7CisJVURQNl9JTkNfU1RBVFNfQkgoVURQX01JQl9JTkVSUk9SUywgcHJvdG8gPT0gSVBQUk9UT19VRFBMSVRFKTsKIAlrZnJlZV9za2Ioc2tiKTsKLQlyZXR1cm4oMCk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBfX2lubGluZV9fIGludCB1ZHB2Nl9yY3Yoc3RydWN0IHNrX2J1ZmYgKipwc2tiKQogewotCXJldHVybiBfX3VkcDZfbGliX3Jjdihwc2tiLCB1ZHBfaGFzaCwgMCk7CisJcmV0dXJuIF9fdWRwNl9saWJfcmN2KHBza2IsIHVkcF9oYXNoLCBJUFBST1RPX1VEUCk7CiB9CiAKIC8qCkBAIC01MjEsNyArNTM0LDcgQEAKIAkvKgogCSAqIENyZWF0ZSBhIFVEUCBoZWFkZXIKIAkgKi8KLQl1aCA9IHNrYi0+aC51aDsKKwl1aCA9IHVkcF9oZHIoc2tiKTsKIAl1aC0+c291cmNlID0gZmwtPmZsX2lwX3Nwb3J0OwogCXVoLT5kZXN0ID0gZmwtPmZsX2lwX2Rwb3J0OwogCXVoLT5sZW4gPSBodG9ucyh1cC0+bGVuKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3VkcGxpdGUuYyBiL25ldC9pcHY2L3VkcGxpdGUuYwppbmRleCA2MjlmOTcxLi5mNTQwMTZhIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni91ZHBsaXRlLmMKKysrIGIvbmV0L2lwdjYvdWRwbGl0ZS5jCkBAIC0xOSw3ICsxOSw3IEBACiAKIHN0YXRpYyBpbnQgdWRwbGl0ZXY2X3JjdihzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IpCiB7Ci0JcmV0dXJuIF9fdWRwNl9saWJfcmN2KHBza2IsIHVkcGxpdGVfaGFzaCwgMSk7CisJcmV0dXJuIF9fdWRwNl9saWJfcmN2KHBza2IsIHVkcGxpdGVfaGFzaCwgSVBQUk9UT19VRFBMSVRFKTsKIH0KIAogc3RhdGljIHZvaWQgdWRwbGl0ZXY2X2VycihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLApkaWZmIC0tZ2l0IGEvbmV0L2lwdjYveGZybTZfaW5wdXQuYyBiL25ldC9pcHY2L3hmcm02X2lucHV0LmMKaW5kZXggMzFmNjUxZi4uZDdlZDhhYSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYveGZybTZfaW5wdXQuYworKysgYi9uZXQvaXB2Ni94ZnJtNl9pbnB1dC5jCkBAIC0yOCwxNCArMjgsMTQgQEAKIAl1bnNpZ25lZCBpbnQgbmhvZmY7CiAKIAluaG9mZiA9IElQNkNCKHNrYiktPm5ob2ZmOwotCW5leHRoZHIgPSBza2ItPm5oLnJhd1tuaG9mZl07CisJbmV4dGhkciA9IHNrYl9uZXR3b3JrX2hlYWRlcihza2IpW25ob2ZmXTsKIAogCXNlcSA9IDA7CiAJaWYgKCFzcGkgJiYgKGVyciA9IHhmcm1fcGFyc2Vfc3BpKHNrYiwgbmV4dGhkciwgJnNwaSwgJnNlcSkpICE9IDApCiAJCWdvdG8gZHJvcDsKIAogCWRvIHsKLQkJc3RydWN0IGlwdjZoZHIgKmlwaCA9IHNrYi0+bmguaXB2Nmg7CisJCXN0cnVjdCBpcHY2aGRyICppcGggPSBpcHY2X2hkcihza2IpOwogCiAJCWlmICh4ZnJtX25yID09IFhGUk1fTUFYX0RFUFRIKQogCQkJZ290byBkcm9wOwpAQCAtNTgsNyArNTgsNyBAQAogCQlpZiAobmV4dGhkciA8PSAwKQogCQkJZ290byBkcm9wX3VubG9jazsKIAotCQlza2ItPm5oLnJhd1tuaG9mZl0gPSBuZXh0aGRyOworCQlza2JfbmV0d29ya19oZWFkZXIoc2tiKVtuaG9mZl0gPSBuZXh0aGRyOwogCiAJCWlmICh4LT5wcm9wcy5yZXBsYXlfd2luZG93KQogCQkJeGZybV9yZXBsYXlfYWR2YW5jZSh4LCBzZXEpOwpAQCAtMTEyLDggKzExMiw4IEBACiAJCXJldHVybiAtMTsKIAl9IGVsc2UgewogI2lmZGVmIENPTkZJR19ORVRGSUxURVIKLQkJc2tiLT5uaC5pcHY2aC0+cGF5bG9hZF9sZW4gPSBodG9ucyhza2ItPmxlbik7Ci0JCV9fc2tiX3B1c2goc2tiLCBza2ItPmRhdGEgLSBza2ItPm5oLnJhdyk7CisJCWlwdjZfaGRyKHNrYiktPnBheWxvYWRfbGVuID0gaHRvbnMoc2tiLT5sZW4pOworCQlfX3NrYl9wdXNoKHNrYiwgc2tiLT5kYXRhIC0gc2tiX25ldHdvcmtfaGVhZGVyKHNrYikpOwogCiAJCU5GX0hPT0soUEZfSU5FVDYsIE5GX0lQNl9QUkVfUk9VVElORywgc2tiLCBza2ItPmRldiwgTlVMTCwKIAkJCWlwNl9yY3ZfZmluaXNoKTsKQEAgLTE0MCwxOSArMTQwLDE5IEBACiAJcmV0dXJuIHhmcm02X3Jjdl9zcGkoKnBza2IsIDApOwogfQogCitFWFBPUlRfU1lNQk9MKHhmcm02X3Jjdik7CisKIGludCB4ZnJtNl9pbnB1dF9hZGRyKHN0cnVjdCBza19idWZmICpza2IsIHhmcm1fYWRkcmVzc190ICpkYWRkciwKIAkJICAgICB4ZnJtX2FkZHJlc3NfdCAqc2FkZHIsIHU4IHByb3RvKQogewogCXN0cnVjdCB4ZnJtX3N0YXRlICp4ID0gTlVMTDsKIAlpbnQgd2lsZGNhcmQgPSAwOwotCXN0cnVjdCBpbjZfYWRkciBhbnk7CiAJeGZybV9hZGRyZXNzX3QgKnhhbnk7CiAJc3RydWN0IHhmcm1fc3RhdGUgKnhmcm1fdmVjX29uZSA9IE5VTEw7CiAJaW50IG5oID0gMDsKIAlpbnQgaSA9IDA7CiAKLQlpcHY2X2FkZHJfc2V0KCZhbnksIDAsIDAsIDAsIDApOwotCXhhbnkgPSAoeGZybV9hZGRyZXNzX3QgKikmYW55OworCXhhbnkgPSAoeGZybV9hZGRyZXNzX3QgKikmaW42YWRkcl9hbnk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CiAJCXhmcm1fYWRkcmVzc190ICpkc3QsICpzcmM7CkBAIC0yNDcsMyArMjQ3LDUgQEAKIAkJeGZybV9zdGF0ZV9wdXQoeGZybV92ZWNfb25lKTsKIAlyZXR1cm4gLTE7CiB9CisKK0VYUE9SVF9TWU1CT0woeGZybTZfaW5wdXRfYWRkcik7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni94ZnJtNl9tb2RlX2JlZXQuYyBiL25ldC9pcHY2L3hmcm02X21vZGVfYmVldC5jCmluZGV4IGVkY2ZmZmEuLjJlNjFkNmQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3hmcm02X21vZGVfYmVldC5jCisrKyBiL25ldC9pcHY2L3hmcm02X21vZGVfYmVldC5jCkBAIC0zOCwxNyArMzgsMTggQEAKIAlpbnQgaGRyX2xlbjsKIAogCXNrYl9wdXNoKHNrYiwgeC0+cHJvcHMuaGVhZGVyX2xlbik7Ci0JaXBoID0gc2tiLT5uaC5pcHY2aDsKKwlpcGggPSBpcHY2X2hkcihza2IpOwogCiAJaGRyX2xlbiA9IGlwNl9maW5kXzFzdGZyYWdvcHQoc2tiLCAmcHJldmhkcik7Ci0Jc2tiLT5uaC5yYXcgPSBwcmV2aGRyIC0geC0+cHJvcHMuaGVhZGVyX2xlbjsKLQlza2ItPmgucmF3ID0gc2tiLT5kYXRhICsgaGRyX2xlbjsKKwlza2Jfc2V0X25ldHdvcmtfaGVhZGVyKHNrYiwKKwkJCSAgICAgICAocHJldmhkciAtIHgtPnByb3BzLmhlYWRlcl9sZW4pIC0gc2tiLT5kYXRhKTsKKwlza2Jfc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiLCBoZHJfbGVuKTsKIAltZW1tb3ZlKHNrYi0+ZGF0YSwgaXBoLCBoZHJfbGVuKTsKIAotCXNrYi0+bmgucmF3ID0gc2tiLT5kYXRhOwotCXRvcF9pcGggPSBza2ItPm5oLmlwdjZoOwotCXNrYi0+bmgucmF3ID0gJnRvcF9pcGgtPm5leHRoZHI7Ci0Jc2tiLT5oLmlwdjZoID0gdG9wX2lwaCArIDE7CisJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CisJdG9wX2lwaCA9IGlwdjZfaGRyKHNrYik7CisJc2tiLT50cmFuc3BvcnRfaGVhZGVyID0gc2tiLT5uZXR3b3JrX2hlYWRlciArIHNpemVvZihzdHJ1Y3QgaXB2Nmhkcik7CisJc2tiLT5uZXR3b3JrX2hlYWRlciArPSBvZmZzZXRvZihzdHJ1Y3QgaXB2NmhkciwgbmV4dGhkcik7CiAKIAlpcHY2X2FkZHJfY29weSgmdG9wX2lwaC0+c2FkZHIsIChzdHJ1Y3QgaW42X2FkZHIgKikmeC0+cHJvcHMuc2FkZHIpOwogCWlwdjZfYWRkcl9jb3B5KCZ0b3BfaXBoLT5kYWRkciwgKHN0cnVjdCBpbjZfYWRkciAqKSZ4LT5pZC5kYWRkcik7CkBAIC01OSw2ICs2MCw3IEBACiBzdGF0aWMgaW50IHhmcm02X2JlZXRfaW5wdXQoc3RydWN0IHhmcm1fc3RhdGUgKngsIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IGlwdjZoZHIgKmlwNmg7CisJY29uc3QgdW5zaWduZWQgY2hhciAqb2xkX21hYzsKIAlpbnQgc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaXB2Nmhkcik7CiAJaW50IGVyciA9IC1FSU5WQUw7CiAKQEAgLTY2LDEzICs2OCwxNCBAQAogCQlnb3RvIG91dDsKIAogCXNrYl9wdXNoKHNrYiwgc2l6ZSk7Ci0JbWVtbW92ZShza2ItPmRhdGEsIHNrYi0+bmgucmF3LCBzaXplKTsKLQlza2ItPm5oLnJhdyA9IHNrYi0+ZGF0YTsKKwltZW1tb3ZlKHNrYi0+ZGF0YSwgc2tiX25ldHdvcmtfaGVhZGVyKHNrYiksIHNpemUpOworCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOwogCi0Jc2tiLT5tYWMucmF3ID0gbWVtbW92ZShza2ItPmRhdGEgLSBza2ItPm1hY19sZW4sCi0JCQkgICAgICAgc2tiLT5tYWMucmF3LCBza2ItPm1hY19sZW4pOworCW9sZF9tYWMgPSBza2JfbWFjX2hlYWRlcihza2IpOworCXNrYl9zZXRfbWFjX2hlYWRlcihza2IsIC1za2ItPm1hY19sZW4pOworCW1lbW1vdmUoc2tiX21hY19oZWFkZXIoc2tiKSwgb2xkX21hYywgc2tiLT5tYWNfbGVuKTsKIAotCWlwNmggPSBza2ItPm5oLmlwdjZoOworCWlwNmggPSBpcHY2X2hkcihza2IpOwogCWlwNmgtPnBheWxvYWRfbGVuID0gaHRvbnMoc2tiLT5sZW4gLSBzaXplKTsKIAlpcHY2X2FkZHJfY29weSgmaXA2aC0+ZGFkZHIsIChzdHJ1Y3QgaW42X2FkZHIgKikgJngtPnNlbC5kYWRkci5hNik7CiAJaXB2Nl9hZGRyX2NvcHkoJmlwNmgtPnNhZGRyLCAoc3RydWN0IGluNl9hZGRyICopICZ4LT5zZWwuc2FkZHIuYTYpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYveGZybTZfbW9kZV9yby5jIGIvbmV0L2lwdjYveGZybTZfbW9kZV9yby5jCmluZGV4IDYwMzFjMTYuLjZhZDZkN2EgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3hmcm02X21vZGVfcm8uYworKysgYi9uZXQvaXB2Ni94ZnJtNl9tb2RlX3JvLmMKQEAgLTUwLDExICs1MCwxMiBAQAogCWludCBoZHJfbGVuOwogCiAJc2tiX3B1c2goc2tiLCB4LT5wcm9wcy5oZWFkZXJfbGVuKTsKLQlpcGggPSBza2ItPm5oLmlwdjZoOworCWlwaCA9IGlwdjZfaGRyKHNrYik7CiAKIAloZHJfbGVuID0geC0+dHlwZS0+aGRyX29mZnNldCh4LCBza2IsICZwcmV2aGRyKTsKLQlza2ItPm5oLnJhdyA9IHByZXZoZHIgLSB4LT5wcm9wcy5oZWFkZXJfbGVuOwotCXNrYi0+aC5yYXcgPSBza2ItPmRhdGEgKyBoZHJfbGVuOworCXNrYl9zZXRfbmV0d29ya19oZWFkZXIoc2tiLAorCQkJICAgICAgIChwcmV2aGRyIC0geC0+cHJvcHMuaGVhZGVyX2xlbikgLSBza2ItPmRhdGEpOworCXNrYl9zZXRfdHJhbnNwb3J0X2hlYWRlcihza2IsIGhkcl9sZW4pOwogCW1lbW1vdmUoc2tiLT5kYXRhLCBpcGgsIGhkcl9sZW4pOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYveGZybTZfbW9kZV90cmFuc3BvcnQuYyBiL25ldC9pcHY2L3hmcm02X21vZGVfdHJhbnNwb3J0LmMKaW5kZXggM2E0YjM5Yi4uYzAyNmJmZSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYveGZybTZfbW9kZV90cmFuc3BvcnQuYworKysgYi9uZXQvaXB2Ni94ZnJtNl9tb2RlX3RyYW5zcG9ydC5jCkBAIC0zMiwxMSArMzIsMTIgQEAKIAlpbnQgaGRyX2xlbjsKIAogCXNrYl9wdXNoKHNrYiwgeC0+cHJvcHMuaGVhZGVyX2xlbik7Ci0JaXBoID0gc2tiLT5uaC5pcHY2aDsKKwlpcGggPSBpcHY2X2hkcihza2IpOwogCiAJaGRyX2xlbiA9IHgtPnR5cGUtPmhkcl9vZmZzZXQoeCwgc2tiLCAmcHJldmhkcik7Ci0Jc2tiLT5uaC5yYXcgPSBwcmV2aGRyIC0geC0+cHJvcHMuaGVhZGVyX2xlbjsKLQlza2ItPmgucmF3ID0gc2tiLT5kYXRhICsgaGRyX2xlbjsKKwlza2Jfc2V0X25ldHdvcmtfaGVhZGVyKHNrYiwKKwkJCSAgICAgICAocHJldmhkciAtIHgtPnByb3BzLmhlYWRlcl9sZW4pIC0gc2tiLT5kYXRhKTsKKwlza2Jfc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiLCBoZHJfbGVuKTsKIAltZW1tb3ZlKHNrYi0+ZGF0YSwgaXBoLCBoZHJfbGVuKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTUxLDEzICs1MiwxNiBAQAogICovCiBzdGF0aWMgaW50IHhmcm02X3RyYW5zcG9ydF9pbnB1dChzdHJ1Y3QgeGZybV9zdGF0ZSAqeCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlpbnQgaWhsID0gc2tiLT5kYXRhIC0gc2tiLT5oLnJhdzsKKwlpbnQgaWhsID0gc2tiLT5kYXRhIC0gc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKIAotCWlmIChza2ItPmgucmF3ICE9IHNrYi0+bmgucmF3KQotCQlza2ItPm5oLnJhdyA9IG1lbW1vdmUoc2tiLT5oLnJhdywgc2tiLT5uaC5yYXcsIGlobCk7Ci0Jc2tiLT5uaC5pcHY2aC0+cGF5bG9hZF9sZW4gPSBodG9ucyhza2ItPmxlbiArIGlobCAtCisJaWYgKHNrYi0+dHJhbnNwb3J0X2hlYWRlciAhPSBza2ItPm5ldHdvcmtfaGVhZGVyKSB7CisJCW1lbW1vdmUoc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKSwKKwkJCXNrYl9uZXR3b3JrX2hlYWRlcihza2IpLCBpaGwpOworCQlza2ItPm5ldHdvcmtfaGVhZGVyID0gc2tiLT50cmFuc3BvcnRfaGVhZGVyOworCX0KKwlpcHY2X2hkcihza2IpLT5wYXlsb2FkX2xlbiA9IGh0b25zKHNrYi0+bGVuICsgaWhsIC0KIAkJCQkJICAgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSk7Ci0Jc2tiLT5oLnJhdyA9IHNrYi0+ZGF0YTsKKwlza2JfcmVzZXRfdHJhbnNwb3J0X2hlYWRlcihza2IpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni94ZnJtNl9tb2RlX3R1bm5lbC5jIGIvbmV0L2lwdjYveGZybTZfbW9kZV90dW5uZWwuYwppbmRleCAwYmM4NjZjLi5hNmMwY2RmIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni94ZnJtNl9tb2RlX3R1bm5lbC5jCisrKyBiL25ldC9pcHY2L3hmcm02X21vZGVfdHVubmVsLmMKQEAgLTE4LDggKzE4LDggQEAKIAogc3RhdGljIGlubGluZSB2b2lkIGlwaXA2X2Vjbl9kZWNhcHN1bGF0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXN0cnVjdCBpcHY2aGRyICpvdXRlcl9pcGggPSBza2ItPm5oLmlwdjZoOwotCXN0cnVjdCBpcHY2aGRyICppbm5lcl9pcGggPSBza2ItPmguaXB2Nmg7CisJc3RydWN0IGlwdjZoZHIgKm91dGVyX2lwaCA9IGlwdjZfaGRyKHNrYik7CisJc3RydWN0IGlwdjZoZHIgKmlubmVyX2lwaCA9IGlwaXB2Nl9oZHIoc2tiKTsKIAogCWlmIChJTkVUX0VDTl9pc19jZShpcHY2X2dldF9kc2ZpZWxkKG91dGVyX2lwaCkpKQogCQlJUDZfRUNOX3NldF9jZShpbm5lcl9pcGgpOwpAQCAtMjcsOCArMjcsOCBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgaXA2aXBfZWNuX2RlY2Fwc3VsYXRlKHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JaWYgKElORVRfRUNOX2lzX2NlKGlwdjZfZ2V0X2RzZmllbGQoc2tiLT5uaC5pcHY2aCkpKQotCQkJSVBfRUNOX3NldF9jZShza2ItPmguaXBpcGgpOworCWlmIChJTkVUX0VDTl9pc19jZShpcHY2X2dldF9kc2ZpZWxkKGlwdjZfaGRyKHNrYikpKSkKKwkJCUlQX0VDTl9zZXRfY2UoaXBpcF9oZHIoc2tiKSk7CiB9CiAKIC8qIEFkZCBlbmNhcHN1bGF0aW9uIGhlYWRlci4KQEAgLTUxLDEyICs1MSwxMiBAQAogCWludCBkc2ZpZWxkOwogCiAJc2tiX3B1c2goc2tiLCB4LT5wcm9wcy5oZWFkZXJfbGVuKTsKLQlpcGggPSBza2ItPm5oLmlwdjZoOworCWlwaCA9IGlwdjZfaGRyKHNrYik7CiAKLQlza2ItPm5oLnJhdyA9IHNrYi0+ZGF0YTsKLQl0b3BfaXBoID0gc2tiLT5uaC5pcHY2aDsKLQlza2ItPm5oLnJhdyA9ICZ0b3BfaXBoLT5uZXh0aGRyOwotCXNrYi0+aC5pcHY2aCA9IHRvcF9pcGggKyAxOworCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOworCXRvcF9pcGggPSBpcHY2X2hkcihza2IpOworCXNrYi0+dHJhbnNwb3J0X2hlYWRlciA9IHNrYi0+bmV0d29ya19oZWFkZXIgKyBzaXplb2Yoc3RydWN0IGlwdjZoZHIpOworCXNrYi0+bmV0d29ya19oZWFkZXIgICArPSBvZmZzZXRvZihzdHJ1Y3QgaXB2NmhkciwgbmV4dGhkcik7CiAKIAl0b3BfaXBoLT52ZXJzaW9uID0gNjsKIAlpZiAoeGRzdC0+cm91dGUtPm9wcy0+ZmFtaWx5ID09IEFGX0lORVQ2KSB7CkBAIC04Niw5ICs4NiwxMSBAQAogc3RhdGljIGludCB4ZnJtNl90dW5uZWxfaW5wdXQoc3RydWN0IHhmcm1fc3RhdGUgKngsIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJaW50IGVyciA9IC1FSU5WQUw7CisJY29uc3QgdW5zaWduZWQgY2hhciAqb2xkX21hYzsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpuaCA9IHNrYl9uZXR3b3JrX2hlYWRlcihza2IpOwogCi0JaWYgKHNrYi0+bmgucmF3W0lQNkNCKHNrYiktPm5ob2ZmXSAhPSBJUFBST1RPX0lQVjYKLQkgICAgJiYgc2tiLT5uaC5yYXdbSVA2Q0Ioc2tiKS0+bmhvZmZdICE9IElQUFJPVE9fSVBJUCkKKwlpZiAobmhbSVA2Q0Ioc2tiKS0+bmhvZmZdICE9IElQUFJPVE9fSVBWNiAmJgorCSAgICBuaFtJUDZDQihza2IpLT5uaG9mZl0gIT0gSVBQUk9UT19JUElQKQogCQlnb3RvIG91dDsKIAlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IGlwdjZoZHIpKSkKIAkJZ290byBvdXQ7CkBAIC05Nyw5ICs5OSwxMCBAQAogCSAgICAoZXJyID0gcHNrYl9leHBhbmRfaGVhZChza2IsIDAsIDAsIEdGUF9BVE9NSUMpKSkKIAkJZ290byBvdXQ7CiAKLQlpZiAoc2tiLT5uaC5yYXdbSVA2Q0Ioc2tiKS0+bmhvZmZdID09IElQUFJPVE9fSVBWNikgeworCW5oID0gc2tiX25ldHdvcmtfaGVhZGVyKHNrYik7CisJaWYgKG5oW0lQNkNCKHNrYiktPm5ob2ZmXSA9PSBJUFBST1RPX0lQVjYpIHsKIAkJaWYgKHgtPnByb3BzLmZsYWdzICYgWEZSTV9TVEFURV9ERUNBUF9EU0NQKQotCQkJaXB2Nl9jb3B5X2RzY3Aoc2tiLT5uaC5pcHY2aCwgc2tiLT5oLmlwdjZoKTsKKwkJCWlwdjZfY29weV9kc2NwKGlwdjZfaGRyKHNrYiksIGlwaXB2Nl9oZHIoc2tiKSk7CiAJCWlmICghKHgtPnByb3BzLmZsYWdzICYgWEZSTV9TVEFURV9OT0VDTikpCiAJCQlpcGlwNl9lY25fZGVjYXBzdWxhdGUoc2tiKTsKIAl9IGVsc2UgewpAQCAtMTA3LDkgKzExMCwxMCBAQAogCQkJaXA2aXBfZWNuX2RlY2Fwc3VsYXRlKHNrYik7CiAJCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUCk7CiAJfQotCXNrYi0+bWFjLnJhdyA9IG1lbW1vdmUoc2tiLT5kYXRhIC0gc2tiLT5tYWNfbGVuLAotCQkJICAgICAgIHNrYi0+bWFjLnJhdywgc2tiLT5tYWNfbGVuKTsKLQlza2ItPm5oLnJhdyA9IHNrYi0+ZGF0YTsKKwlvbGRfbWFjID0gc2tiX21hY19oZWFkZXIoc2tiKTsKKwlza2Jfc2V0X21hY19oZWFkZXIoc2tiLCAtc2tiLT5tYWNfbGVuKTsKKwltZW1tb3ZlKHNrYl9tYWNfaGVhZGVyKHNrYiksIG9sZF9tYWMsIHNrYi0+bWFjX2xlbik7CisJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CiAJZXJyID0gMDsKIAogb3V0OgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYveGZybTZfb3V0cHV0LmMgYi9uZXQvaXB2Ni94ZnJtNl9vdXRwdXQuYwppbmRleCBkNmQ3ODZiLi41NjM2NGE1IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni94ZnJtNl9vdXRwdXQuYworKysgYi9uZXQvaXB2Ni94ZnJtNl9vdXRwdXQuYwpAQCAtMjMsNiArMjMsOCBAQAogCXJldHVybiBpcDZfZmluZF8xc3RmcmFnb3B0KHNrYiwgcHJldmhkcik7CiB9CiAKK0VYUE9SVF9TWU1CT0woeGZybTZfZmluZF8xc3RmcmFnb3B0KTsKKwogc3RhdGljIGludCB4ZnJtNl90dW5uZWxfY2hlY2tfc2l6ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCWludCBtdHUsIHJldCA9IDA7CkBAIC03NiwxMSArNzgsMTEgQEAKIAkJeC0+Y3VybGZ0LmJ5dGVzICs9IHNrYi0+bGVuOwogCQl4LT5jdXJsZnQucGFja2V0cysrOwogCQlpZiAoeC0+cHJvcHMubW9kZSA9PSBYRlJNX01PREVfUk9VVEVPUFRJTUlaQVRJT04pCi0JCQl4LT5sYXN0dXNlZCA9ICh1NjQpeHRpbWUudHZfc2VjOworCQkJeC0+bGFzdHVzZWQgPSBnZXRfc2Vjb25kcygpOwogCiAJCXNwaW5fdW5sb2NrX2JoKCZ4LT5sb2NrKTsKIAotCQlza2ItPm5oLnJhdyA9IHNrYi0+ZGF0YTsKKwkJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CiAKIAkJaWYgKCEoc2tiLT5kc3QgPSBkc3RfcG9wKGRzdCkpKSB7CiAJCQllcnIgPSAtRUhPU1RVTlJFQUNIOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYveGZybTZfcG9saWN5LmMgYi9uZXQvaXB2Ni94ZnJtNl9wb2xpY3kuYwppbmRleCBkOGE1ODViLi4xZmFhMmVhIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni94ZnJtNl9wb2xpY3kuYworKysgYi9uZXQvaXB2Ni94ZnJtNl9wb2xpY3kuYwpAQCAtMjQwLDcgKzI0MCw4IEBACiAJCWlmICghYWZpbmZvKSB7CiAJCQlkc3QgPSAqZHN0X3A7CiAJCQlnb3RvIGVycm9yOwotCQl9OworCQl9CisKIAkJZHN0X3ByZXYtPm91dHB1dCA9IGFmaW5mby0+b3V0cHV0OwogCQl4ZnJtX3N0YXRlX3B1dF9hZmluZm8oYWZpbmZvKTsKIAkJLyogU2hlaXQuLi4gSSByZW1lbWJlciBJIGRpZCB0aGlzIHJpZ2h0LiBBcHBhcmVudGx5LApAQCAtMjcwLDE3ICsyNzEsMTkgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZAogX2RlY29kZV9zZXNzaW9uNihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZmxvd2kgKmZsKQogewotCXUxNiBvZmZzZXQgPSBza2ItPmgucmF3IC0gc2tiLT5uaC5yYXc7Ci0Jc3RydWN0IGlwdjZoZHIgKmhkciA9IHNrYi0+bmguaXB2Nmg7CisJdTE2IG9mZnNldCA9IHNrYl9uZXR3b3JrX2hlYWRlcl9sZW4oc2tiKTsKKwlzdHJ1Y3QgaXB2NmhkciAqaGRyID0gaXB2Nl9oZHIoc2tiKTsKIAlzdHJ1Y3QgaXB2Nl9vcHRfaGRyICpleHRoZHI7Ci0JdTggbmV4dGhkciA9IHNrYi0+bmgucmF3W0lQNkNCKHNrYiktPm5ob2ZmXTsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpuaCA9IHNrYl9uZXR3b3JrX2hlYWRlcihza2IpOworCXU4IG5leHRoZHIgPSBuaFtJUDZDQihza2IpLT5uaG9mZl07CiAKIAltZW1zZXQoZmwsIDAsIHNpemVvZihzdHJ1Y3QgZmxvd2kpKTsKIAlpcHY2X2FkZHJfY29weSgmZmwtPmZsNl9kc3QsICZoZHItPmRhZGRyKTsKIAlpcHY2X2FkZHJfY29weSgmZmwtPmZsNl9zcmMsICZoZHItPnNhZGRyKTsKIAotCXdoaWxlIChwc2tiX21heV9wdWxsKHNrYiwgc2tiLT5uaC5yYXcgKyBvZmZzZXQgKyAxIC0gc2tiLT5kYXRhKSkgewotCQlleHRoZHIgPSAoc3RydWN0IGlwdjZfb3B0X2hkciopKHNrYi0+bmgucmF3ICsgb2Zmc2V0KTsKKwl3aGlsZSAocHNrYl9tYXlfcHVsbChza2IsIG5oICsgb2Zmc2V0ICsgMSAtIHNrYi0+ZGF0YSkpIHsKKwkJbmggPSBza2JfbmV0d29ya19oZWFkZXIoc2tiKTsKKwkJZXh0aGRyID0gKHN0cnVjdCBpcHY2X29wdF9oZHIgKikobmggKyBvZmZzZXQpOwogCiAJCXN3aXRjaCAobmV4dGhkcikgewogCQljYXNlIE5FWFRIRFJfUk9VVElORzoKQEAgLTI4OCw3ICsyOTEsNyBAQAogCQljYXNlIE5FWFRIRFJfREVTVDoKIAkJCW9mZnNldCArPSBpcHY2X29wdGxlbihleHRoZHIpOwogCQkJbmV4dGhkciA9IGV4dGhkci0+bmV4dGhkcjsKLQkJCWV4dGhkciA9IChzdHJ1Y3QgaXB2Nl9vcHRfaGRyKikoc2tiLT5uaC5yYXcgKyBvZmZzZXQpOworCQkJZXh0aGRyID0gKHN0cnVjdCBpcHY2X29wdF9oZHIgKikobmggKyBvZmZzZXQpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBJUFBST1RPX1VEUDoKQEAgLTI5Niw3ICsyOTksNyBAQAogCQljYXNlIElQUFJPVE9fVENQOgogCQljYXNlIElQUFJPVE9fU0NUUDoKIAkJY2FzZSBJUFBST1RPX0RDQ1A6Ci0JCQlpZiAocHNrYl9tYXlfcHVsbChza2IsIHNrYi0+bmgucmF3ICsgb2Zmc2V0ICsgNCAtIHNrYi0+ZGF0YSkpIHsKKwkJCWlmIChwc2tiX21heV9wdWxsKHNrYiwgbmggKyBvZmZzZXQgKyA0IC0gc2tiLT5kYXRhKSkgewogCQkJCV9fYmUxNiAqcG9ydHMgPSAoX19iZTE2ICopZXh0aGRyOwogCiAJCQkJZmwtPmZsX2lwX3Nwb3J0ID0gcG9ydHNbMF07CkBAIC0zMDYsNyArMzA5LDcgQEAKIAkJCXJldHVybjsKIAogCQljYXNlIElQUFJPVE9fSUNNUFY2OgotCQkJaWYgKHBza2JfbWF5X3B1bGwoc2tiLCBza2ItPm5oLnJhdyArIG9mZnNldCArIDIgLSBza2ItPmRhdGEpKSB7CisJCQlpZiAocHNrYl9tYXlfcHVsbChza2IsIG5oICsgb2Zmc2V0ICsgMiAtIHNrYi0+ZGF0YSkpIHsKIAkJCQl1OCAqaWNtcCA9ICh1OCAqKWV4dGhkcjsKIAogCQkJCWZsLT5mbF9pY21wX3R5cGUgPSBpY21wWzBdOwpAQCAtMzE3LDcgKzMyMCw3IEBACiAKICNpZmRlZiBDT05GSUdfSVBWNl9NSVA2CiAJCWNhc2UgSVBQUk9UT19NSDoKLQkJCWlmIChwc2tiX21heV9wdWxsKHNrYiwgc2tiLT5uaC5yYXcgKyBvZmZzZXQgKyAzIC0gc2tiLT5kYXRhKSkgeworCQkJaWYgKHBza2JfbWF5X3B1bGwoc2tiLCBuaCArIG9mZnNldCArIDMgLSBza2ItPmRhdGEpKSB7CiAJCQkJc3RydWN0IGlwNl9taCAqbWg7CiAJCQkJbWggPSAoc3RydWN0IGlwNl9taCAqKWV4dGhkcjsKIApAQCAtMzM1LDcgKzMzOCw3IEBACiAJCQlmbC0+ZmxfaXBzZWNfc3BpID0gMDsKIAkJCWZsLT5wcm90byA9IG5leHRoZHI7CiAJCQlyZXR1cm47Ci0JCX07CisJCX0KIAl9CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3hmcm02X3R1bm5lbC5jIGIvbmV0L2lwdjYveGZybTZfdHVubmVsLmMKaW5kZXggOTNjNDIyMy4uNTUwMmNjOTQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3hmcm02X3R1bm5lbC5jCisrKyBiL25ldC9pcHY2L3hmcm02X3R1bm5lbC5jCkBAIC0yNTcsMTEgKzI1NywxMSBAQAogCiBzdGF0aWMgaW50IHhmcm02X3R1bm5lbF9yY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlzdHJ1Y3QgaXB2NmhkciAqaXBoID0gc2tiLT5uaC5pcHY2aDsKKwlzdHJ1Y3QgaXB2NmhkciAqaXBoID0gaXB2Nl9oZHIoc2tiKTsKIAlfX2JlMzIgc3BpOwogCiAJc3BpID0geGZybTZfdHVubmVsX3NwaV9sb29rdXAoKHhmcm1fYWRkcmVzc190ICopJmlwaC0+c2FkZHIpOwotCXJldHVybiB4ZnJtNl9yY3Zfc3BpKHNrYiwgc3BpKTsKKwlyZXR1cm4geGZybTZfcmN2X3NwaShza2IsIHNwaSkgPiAwID8gOiAwOwogfQogCiBzdGF0aWMgaW50IHhmcm02X3R1bm5lbF9lcnIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGluZXQ2X3NrYl9wYXJtICpvcHQsCmRpZmYgLS1naXQgYS9uZXQvaXB4L2FmX2lweC5jIGIvbmV0L2lweC9hZl9pcHguYwppbmRleCBjYWMzNWE3Li4zOTJmOGJjIDEwMDY0NAotLS0gYS9uZXQvaXB4L2FmX2lweC5jCisrKyBiL25ldC9pcHgvYWZfaXB4LmMKQEAgLTU3Niw3ICs1NzYsOSBAQAogCXNrYjIgPSBhbGxvY19za2IobGVuLCBHRlBfQVRPTUlDKTsKIAlpZiAoc2tiMikgewogCQlza2JfcmVzZXJ2ZShza2IyLCBvdXRfb2Zmc2V0KTsKLQkJc2tiMi0+bmgucmF3ID0gc2tiMi0+aC5yYXcgPSBza2JfcHV0KHNrYjIsIHNrYi0+bGVuKTsKKwkJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYjIpOworCQlza2JfcmVzZXRfdHJhbnNwb3J0X2hlYWRlcihza2IyKTsKKwkJc2tiX3B1dChza2IyLCBza2ItPmxlbik7CiAJCW1lbWNweShpcHhfaGRyKHNrYjIpLCBpcHhfaGRyKHNrYiksIHNrYi0+bGVuKTsKIAkJbWVtY3B5KHNrYjItPmNiLCBza2ItPmNiLCBzaXplb2Yoc2tiLT5jYikpOwogCX0KQEAgLTE4MDcsOCArMTgwOSw4IEBACiAJCQkJICAgICBjb3BpZWQpOwogCWlmIChyYykKIAkJZ290byBvdXRfZnJlZTsKLQlpZiAoc2tiLT50c3RhbXAub2ZmX3NlYykKLQkJc2tiX2dldF90aW1lc3RhbXAoc2tiLCAmc2stPnNrX3N0YW1wKTsKKwlpZiAoc2tiLT50c3RhbXAudHY2NCkKKwkJc2stPnNrX3N0YW1wID0gc2tiLT50c3RhbXA7CiAKIAltc2ctPm1zZ19uYW1lbGVuID0gc2l6ZW9mKCpzaXB4KTsKIApkaWZmIC0tZ2l0IGEvbmV0L2lweC9pcHhfcm91dGUuYyBiL25ldC9pcHgvaXB4X3JvdXRlLmMKaW5kZXggOGUxY2FkOS4uZTE2YzExNCAxMDA2NDQKLS0tIGEvbmV0L2lweC9pcHhfcm91dGUuYworKysgYi9uZXQvaXB4L2lweF9yb3V0ZS5jCkBAIC0yMDMsNyArMjAzLDkgQEAKIAlza2ItPnNrID0gc2s7CiAKIAkvKiBGaWxsIGluIElQWCBoZWFkZXIgKi8KLQlza2ItPmgucmF3ID0gc2tiLT5uaC5yYXcgPSBza2JfcHV0KHNrYiwgc2l6ZW9mKHN0cnVjdCBpcHhoZHIpKTsKKwlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiKTsKKwlza2JfcmVzZXRfdHJhbnNwb3J0X2hlYWRlcihza2IpOworCXNrYl9wdXQoc2tiLCBzaXplb2Yoc3RydWN0IGlweGhkcikpOwogCWlweCA9IGlweF9oZHIoc2tiKTsKIAlpcHgtPmlweF9wa3RzaXplID0gaHRvbnMobGVuICsgc2l6ZW9mKHN0cnVjdCBpcHhoZHIpKTsKIAlJUFhfU0tCX0NCKHNrYiktPmlweF90Y3RybCA9IDA7CmRpZmYgLS1naXQgYS9uZXQvaXJkYS9hZl9pcmRhLmMgYi9uZXQvaXJkYS9hZl9pcmRhLmMKaW5kZXggMGViN2Q1OS4uMDZjOTdjNiAxMDA2NDQKLS0tIGEvbmV0L2lyZGEvYWZfaXJkYS5jCisrKyBiL25ldC9pcmRhL2FmX2lyZGEuYwpAQCAtODksNyArODksNiBAQAogCiAJc2VsZiA9IGluc3RhbmNlOwogCXNrID0gaW5zdGFuY2U7Ci0JSVJEQV9BU1NFUlQoc2sgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CiAKIAllcnIgPSBzb2NrX3F1ZXVlX3Jjdl9za2Ioc2ssIHNrYik7CiAJaWYgKGVycikgewpAQCAtMTMxLDE0ICsxMzAsMTIgQEAKIAl9CiAKIAkvKiBQcmV2ZW50IHJhY2UgY29uZGl0aW9ucyB3aXRoIGlyZGFfcmVsZWFzZSgpIGFuZCBpcmRhX3NodXRkb3duKCkgKi8KKwliaF9sb2NrX3NvY2soc2spOwogCWlmICghc29ja19mbGFnKHNrLCBTT0NLX0RFQUQpICYmIHNrLT5za19zdGF0ZSAhPSBUQ1BfQ0xPU0UpIHsKLQkJbG9ja19zb2NrKHNrKTsKIAkJc2stPnNrX3N0YXRlICAgICA9IFRDUF9DTE9TRTsKLQkJc2stPnNrX2VyciAgICAgICA9IEVDT05OUkVTRVQ7CiAJCXNrLT5za19zaHV0ZG93biB8PSBTRU5EX1NIVVRET1dOOwogCiAJCXNrLT5za19zdGF0ZV9jaGFuZ2Uoc2spOwotCQlyZWxlYXNlX3NvY2soc2spOwogCiAJCS8qIENsb3NlIG91ciBUU0FQLgogCQkgKiBJZiB3ZSBsZWF2ZSBpdCBvcGVuLCBJckxNUCBwdXQgaXQgYmFjayBpbnRvIHRoZSBsaXN0IG9mCkBAIC0xNTgsNiArMTU1LDcgQEAKIAkJCXNlbGYtPnRzYXAgPSBOVUxMOwogCQl9CiAJfQorCWJoX3VubG9ja19zb2NrKHNrKTsKIAogCS8qIE5vdGUgOiBvbmNlIHdlIGFyZSB0aGVyZSwgdGhlcmUgaXMgbm90IG11Y2ggeW91IHdhbnQgdG8gZG8KIAkgKiB3aXRoIHRoZSBzb2NrZXQgYW55bW9yZSwgYXBhcnQgZnJvbSBjbG9zaW5nIGl0LgpAQCAtMjIwLDcgKzIxOCw3IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXNlbGYtPm1heF9kYXRhX3NpemUgPSBpcnR0cF9nZXRfbWF4X3NlZ19zaXplKHNlbGYtPnRzYXApOwotCX07CisJfQogCiAJSVJEQV9ERUJVRygyLCAiJXMoKSwgbWF4X2RhdGFfc2l6ZT0lZFxuIiwgX19GVU5DVElPTl9fLAogCQkgICBzZWxmLT5tYXhfZGF0YV9zaXplKTsKQEAgLTI4Myw3ICsyODEsNyBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlzZWxmLT5tYXhfZGF0YV9zaXplID0gaXJ0dHBfZ2V0X21heF9zZWdfc2l6ZShzZWxmLT50c2FwKTsKLQl9OworCX0KIAogCUlSREFfREVCVUcoMiwgIiVzKCksIG1heF9kYXRhX3NpemU9JWRcbiIsIF9fRlVOQ1RJT05fXywKIAkJICAgc2VsZi0+bWF4X2RhdGFfc2l6ZSk7CkBAIC0zMDYsOCArMzA0LDYgQEAKIAogCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CiAKLQlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOwotCiAJc2tiID0gYWxsb2Nfc2tiKFRUUF9NQVhfSEVBREVSICsgVFRQX1NBUl9IRUFERVIsCiAJCQlHRlBfQVRPTUlDKTsKIAlpZiAoc2tiID09IE5VTEwpIHsKQEAgLTMzNyw3ICszMzMsNyBAQAogCiAJc2VsZiA9IGluc3RhbmNlOwogCXNrID0gaW5zdGFuY2U7Ci0JSVJEQV9BU1NFUlQoc2sgIT0gTlVMTCwgcmV0dXJuOyk7CisJQlVHX09OKHNrID09IE5VTEwpOwogCiAJc3dpdGNoIChmbG93KSB7CiAJY2FzZSBGTE9XX1NUT1A6CkBAIC00NDksNyArNDQ1LDcgQEAKIAlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOwogCiAJc2VsZiA9IChzdHJ1Y3QgaXJkYV9zb2NrICopIHByaXY7Ci0JSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlCVUdfT04oc2VsZiA9PSBOVUxMKTsKIAogCS8qIE5vdGhpbmcgZm9yIHRoZSBjYWxsZXIgKi8KIAlzZWxmLT5jYWNoZWxvZyA9IE5VTEw7CkBAIC01NDYsOCArNTQyLDYgQEAKIHsKIAlJUkRBX0RFQlVHKDIsICIlcyglcCwgJXMpXG4iLCBfX0ZVTkNUSU9OX18sIHNlbGYsIG5hbWUpOwogCi0JSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKLQogCWlmIChzZWxmLT5pcmlhcCkgewogCQlJUkRBX1dBUk5JTkcoIiVzKCk6IGJ1c3kgd2l0aCBhIHByZXZpb3VzIHF1ZXJ5XG4iLAogCQkJICAgICBfX0ZVTkNUSU9OX18pOwpAQCAtNjM1LDggKzYyOSw2IEBACiAKIAlJUkRBX0RFQlVHKDIsICIlcygpLCBuYW1lPSVzXG4iLCBfX0ZVTkNUSU9OX18sIG5hbWUpOwogCi0JSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKLQogCS8qIEFzayBsbXAgZm9yIHRoZSBjdXJyZW50IGRpc2NvdmVyeSBsb2cKIAkgKiBOb3RlIDogd2UgaGF2ZSB0byB1c2UgaXJsbXBfZ2V0X2Rpc2NvdmVyaWVzKCksIGFzIG9wcG9zZWQKIAkgKiB0byBwbGF5IHdpdGggdGhlIGNhY2hlbG9nIGRpcmVjdGx5LCBiZWNhdXNlIHdoaWxlIHdlIGFyZQpAQCAtNzg0LDggKzc3Niw2IEBACiAJc3RydWN0IGlyZGFfc29jayAqc2VsZiA9IGlyZGFfc2soc2spOwogCWludCBlcnI7CiAKLQlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOwotCiAJSVJEQV9ERUJVRygyLCAiJXMoJXApXG4iLCBfX0ZVTkNUSU9OX18sIHNlbGYpOwogCiAJaWYgKGFkZHJfbGVuICE9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaXJkYSkpCkBAIC04NDEsOCArODMxLDYgQEAKIAogCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CiAKLQlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOwotCiAJZXJyID0gaXJkYV9jcmVhdGUobmV3c29jaywgc2stPnNrX3Byb3RvY29sKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwpAQCAtODczLDQ0ICs4NjEsMjggQEAKIAkgKiBjYWxsaW5nIHVzLCB0aGUgZGF0YSBpcyB3YWl0aW5nIGZvciB1cyA7LSkKIAkgKiBKZWFuIElJCiAJICovCi0Jc2tiID0gc2tiX2RlcXVldWUoJnNrLT5za19yZWNlaXZlX3F1ZXVlKTsKLQlpZiAoc2tiID09IE5VTEwpIHsKLQkJaW50IHJldCA9IDA7Ci0JCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXRxLCBjdXJyZW50KTsKKwl3aGlsZSAoMSkgeworCQlza2IgPSBza2JfZGVxdWV1ZSgmc2stPnNrX3JlY2VpdmVfcXVldWUpOworCQlpZiAoc2tiKQorCQkJYnJlYWs7CiAKIAkJLyogTm9uIGJsb2NraW5nIG9wZXJhdGlvbiAqLwogCQlpZiAoZmxhZ3MgJiBPX05PTkJMT0NLKQogCQkJcmV0dXJuIC1FV09VTERCTE9DSzsKIAotCQkvKiBUaGUgZm9sbG93aW5nIGNvZGUgaXMgYSBjdXQnbidwYXN0ZSBvZiB0aGUKLQkJICogd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKCkgbWFjcm8uCi0JCSAqIFdlIGRvbid0IHVzIHRoZSBtYWNybyBiZWNhdXNlIHRoZSBjb25kaXRpb24gaGFzCi0JCSAqIHNpZGUgZWZmZWN0cyA6IHdlIHdhbnQgdG8gbWFrZSBzdXJlIHRoYXQgb25seSBvbmUKLQkJICogc2tiIGdldCBkZXF1ZXVlZCAtIEplYW4gSUkgKi8KLQkJYWRkX3dhaXRfcXVldWUoc2stPnNrX3NsZWVwLCAmd2FpdHEpOwotCQlmb3IgKDs7KSB7Ci0JCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCQkJc2tiID0gc2tiX2RlcXVldWUoJnNrLT5za19yZWNlaXZlX3F1ZXVlKTsKLQkJCWlmIChza2IgIT0gTlVMTCkKLQkJCQlicmVhazsKLQkJCWlmICghc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKLQkJCQlzY2hlZHVsZSgpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJcmV0ID0gLUVSRVNUQVJUU1lTOwotCQkJYnJlYWs7Ci0JCX0KLQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7Ci0JCXJlbW92ZV93YWl0X3F1ZXVlKHNrLT5za19zbGVlcCwgJndhaXRxKTsKLQkJaWYocmV0KQotCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwkJZXJyID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKCooc2stPnNrX3NsZWVwKSwKKwkJCQkJc2tiX3BlZWsoJnNrLT5za19yZWNlaXZlX3F1ZXVlKSk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOwogCX0KIAogCW5ld3NrID0gbmV3c29jay0+c2s7CisJaWYgKG5ld3NrID09IE5VTEwpCisJCXJldHVybiAtRUlPOworCiAJbmV3c2stPnNrX3N0YXRlID0gVENQX0VTVEFCTElTSEVEOwogCiAJbmV3ID0gaXJkYV9zayhuZXdzayk7Ci0JSVJEQV9BU1NFUlQobmV3ICE9IE5VTEwsIHJldHVybiAtMTspOwogCiAJLyogTm93IGF0dGFjaCB1cCB0aGUgbmV3IHNvY2tldCAqLwogCW5ldy0+dHNhcCA9IGlydHRwX2R1cChzZWxmLT50c2FwLCBuZXcpOwpAQCAtMTA2MSw3ICsxMDMzLDggQEAKIAogCWlmIChzay0+c2tfc3RhdGUgIT0gVENQX0VTVEFCTElTSEVEKSB7CiAJCXNvY2stPnN0YXRlID0gU1NfVU5DT05ORUNURUQ7Ci0JCXJldHVybiBzb2NrX2Vycm9yKHNrKTsJLyogQWx3YXlzIHNldCBhdCB0aGlzIHBvaW50ICovCisJCWVyciA9IHNvY2tfZXJyb3Ioc2spOworCQlyZXR1cm4gZXJyPyBlcnIgOiAtRUNPTk5SRVNFVDsKIAl9CiAKIAlzb2NrLT5zdGF0ZSA9IFNTX0NPTk5FQ1RFRDsKQEAgLTExNzEsOCArMTE0NCw2IEBACiB7CiAJSVJEQV9ERUJVRygyLCAiJXMoJXApXG4iLCBfX0ZVTkNUSU9OX18sIHNlbGYpOwogCi0JSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKLQogCS8qIFVucmVnaXN0ZXIgd2l0aCBJckxNUCAqLwogCWlybG1wX3VucmVnaXN0ZXJfY2xpZW50KHNlbGYtPmNrZXkpOwogCWlybG1wX3VucmVnaXN0ZXJfc2VydmljZShzZWxmLT5za2V5KTsKQEAgLTEyNzQsNyArMTI0NSw2IEBACiAJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CiAJc3RydWN0IGlyZGFfc29jayAqc2VsZjsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCXVuc2lnbmVkIGNoYXIgKmFzbXB0cjsKIAlpbnQgZXJyOwogCiAJSVJEQV9ERUJVRyg0LCAiJXMoKSwgbGVuPSV6ZFxuIiwgX19GVU5DVElPTl9fLCBsZW4pOwpAQCAtMTI5Miw3ICsxMjYyLDYgQEAKIAkJcmV0dXJuIC1FTk9UQ09OTjsKIAogCXNlbGYgPSBpcmRhX3NrKHNrKTsKLQlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOwogCiAJLyogQ2hlY2sgaWYgSXJUVFAgaXMgd2FudHMgdXMgdG8gc2xvdyBkb3duICovCiAKQEAgLTEzMTcsOSArMTI4Niw5IEBACiAJCXJldHVybiAtRU5PQlVGUzsKIAogCXNrYl9yZXNlcnZlKHNrYiwgc2VsZi0+bWF4X2hlYWRlcl9zaXplICsgMTYpOwotCi0JYXNtcHRyID0gc2tiLT5oLnJhdyA9IHNrYl9wdXQoc2tiLCBsZW4pOwotCWVyciA9IG1lbWNweV9mcm9taW92ZWMoYXNtcHRyLCBtc2ctPm1zZ19pb3YsIGxlbik7CisJc2tiX3Jlc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKKwlza2JfcHV0KHNrYiwgbGVuKTsKKwllcnIgPSBtZW1jcHlfZnJvbWlvdmVjKHNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYiksIG1zZy0+bXNnX2lvdiwgbGVuKTsKIAlpZiAoZXJyKSB7CiAJCWtmcmVlX3NrYihza2IpOwogCQlyZXR1cm4gZXJyOwpAQCAtMTM1NSwxNiArMTMyNCwxNiBAQAogCiAJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKIAotCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7Ci0JSVJEQV9BU1NFUlQoIXNvY2tfZXJyb3Ioc2spLCByZXR1cm4gLTE7KTsKKwlpZiAoKGVyciA9IHNvY2tfZXJyb3Ioc2spKSA8IDApCisJCXJldHVybiBlcnI7CiAKIAlza2IgPSBza2JfcmVjdl9kYXRhZ3JhbShzaywgZmxhZ3MgJiB+TVNHX0RPTlRXQUlULAogCQkJCWZsYWdzICYgTVNHX0RPTlRXQUlULCAmZXJyKTsKIAlpZiAoIXNrYikKIAkJcmV0dXJuIGVycjsKIAotCXNrYi0+aC5yYXcgPSBza2ItPmRhdGE7Ci0JY29waWVkICAgICA9IHNrYi0+bGVuOworCXNrYl9yZXNldF90cmFuc3BvcnRfaGVhZGVyKHNrYik7CisJY29waWVkID0gc2tiLT5sZW47CiAKIAlpZiAoY29waWVkID4gc2l6ZSkgewogCQlJUkRBX0RFQlVHKDIsICIlcygpLCBSZWNlaXZlZCB0cnVuY2F0ZWQgZnJhbWUgKCV6ZCA8ICV6ZCkhXG4iLApAQCAtMTQwMywxMyArMTM3MiwxMyBAQAogCXN0cnVjdCBpcmRhX3NvY2sgKnNlbGYgPSBpcmRhX3NrKHNrKTsKIAlpbnQgbm9ibG9jayA9IGZsYWdzICYgTVNHX0RPTlRXQUlUOwogCXNpemVfdCBjb3BpZWQgPSAwOwotCWludCB0YXJnZXQgPSAxOwotCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXRxLCBjdXJyZW50KTsKKwlpbnQgdGFyZ2V0LCBlcnI7CisJbG9uZyB0aW1lbzsKIAogCUlSREFfREVCVUcoMywgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CiAKLQlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOwotCUlSREFfQVNTRVJUKCFzb2NrX2Vycm9yKHNrKSwgcmV0dXJuIC0xOyk7CisJaWYgKChlcnIgPSBzb2NrX2Vycm9yKHNrKSkgPCAwKQorCQlyZXR1cm4gZXJyOwogCiAJaWYgKHNvY2stPmZsYWdzICYgX19TT19BQ0NFUFRDT04pCiAJCXJldHVybigtRUlOVkFMKTsKQEAgLTE0MTcsOCArMTM4Niw4IEBACiAJaWYgKGZsYWdzICYgTVNHX09PQikKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCi0JaWYgKGZsYWdzICYgTVNHX1dBSVRBTEwpCi0JCXRhcmdldCA9IHNpemU7CisJdGFyZ2V0ID0gc29ja19yY3Zsb3dhdChzaywgZmxhZ3MgJiBNU0dfV0FJVEFMTCwgc2l6ZSk7CisJdGltZW8gPSBzb2NrX3JjdnRpbWVvKHNrLCBub2Jsb2NrKTsKIAogCW1zZy0+bXNnX25hbWVsZW4gPSAwOwogCkBAIC0xNDI2LDE5ICsxMzk1LDE0IEBACiAJCWludCBjaHVuazsKIAkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHNrYl9kZXF1ZXVlKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSk7CiAKLQkJaWYgKHNrYj09TlVMTCkgeworCQlpZiAoc2tiID09IE5VTEwpIHsKKwkJCURFRklORV9XQUlUKHdhaXQpOwogCQkJaW50IHJldCA9IDA7CiAKIAkJCWlmIChjb3BpZWQgPj0gdGFyZ2V0KQogCQkJCWJyZWFrOwogCi0JCQkvKiBUaGUgZm9sbG93aW5nIGNvZGUgaXMgYSBjdXQnbidwYXN0ZSBvZiB0aGUKLQkJCSAqIHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSgpIG1hY3JvLgotCQkJICogV2UgZG9uJ3QgdXMgdGhlIG1hY3JvIGJlY2F1c2UgdGhlIHRlc3QgY29uZGl0aW9uCi0JCQkgKiBpcyBtZXNzeS4gLSBKZWFuIElJICovCi0JCQlzZXRfYml0KFNPQ0tfQVNZTkNfV0FJVERBVEEsICZzay0+c2tfc29ja2V0LT5mbGFncyk7Ci0JCQlhZGRfd2FpdF9xdWV1ZShzay0+c2tfc2xlZXAsICZ3YWl0cSk7Ci0JCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJcHJlcGFyZV90b193YWl0X2V4Y2x1c2l2ZShzay0+c2tfc2xlZXAsICZ3YWl0LCBUQVNLX0lOVEVSUlVQVElCTEUpOwogCiAJCQkvKgogCQkJICoJUE9TSVggMTAwMy4xZyBtYW5kYXRlcyB0aGlzIG9yZGVyLgpAQCAtMTQ1MSwxNyArMTQxNSwxNyBAQAogCQkJZWxzZSBpZiAobm9ibG9jaykKIAkJCQlyZXQgPSAtRUFHQUlOOwogCQkJZWxzZSBpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCi0JCQkJcmV0ID0gLUVSRVNUQVJUU1lTOworCQkJCXJldCA9IHNvY2tfaW50cl9lcnJubyh0aW1lbyk7CisJCQllbHNlIGlmIChzay0+c2tfc3RhdGUgIT0gVENQX0VTVEFCTElTSEVEKQorCQkJCXJldCA9IC1FTk9UQ09OTjsKIAkJCWVsc2UgaWYgKHNrYl9wZWVrKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSkgPT0gTlVMTCkKIAkJCQkvKiBXYWl0IHByb2Nlc3MgdW50aWwgZGF0YSBhcnJpdmVzICovCiAJCQkJc2NoZWR1bGUoKTsKIAotCQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7Ci0JCQlyZW1vdmVfd2FpdF9xdWV1ZShzay0+c2tfc2xlZXAsICZ3YWl0cSk7Ci0JCQljbGVhcl9iaXQoU09DS19BU1lOQ19XQUlUREFUQSwgJnNrLT5za19zb2NrZXQtPmZsYWdzKTsKKwkJCWZpbmlzaF93YWl0KHNrLT5za19zbGVlcCwgJndhaXQpOwogCi0JCQlpZihyZXQpCi0JCQkJcmV0dXJuKHJldCk7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CiAJCQlpZiAoc2stPnNrX3NodXRkb3duICYgUkNWX1NIVVRET1dOKQogCQkJCWJyZWFrOwogCkBAIC0xNTMwLDcgKzE0OTQsNiBAQAogCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOwogCXN0cnVjdCBpcmRhX3NvY2sgKnNlbGY7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQl1bnNpZ25lZCBjaGFyICphc21wdHI7CiAJaW50IGVycjsKIAogCUlSREFfREVCVUcoNCwgIiVzKCksIGxlbj0lemRcbiIsIF9fRlVOQ1RJT05fXywgbGVuKTsKQEAgLTE1NDcsNyArMTUxMCw2IEBACiAJCXJldHVybiAtRU5PVENPTk47CiAKIAlzZWxmID0gaXJkYV9zayhzayk7Ci0JSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKIAogCS8qCiAJICogQ2hlY2sgdGhhdCB3ZSBkb24ndCBzZW5kIG91dCB0b28gYmlnIGZyYW1lcy4gVGhpcyBpcyBhbiB1bnJlbGlhYmxlCkBAIC0xNTY2LDEwICsxNTI4LDExIEBACiAJCXJldHVybiAtRU5PQlVGUzsKIAogCXNrYl9yZXNlcnZlKHNrYiwgc2VsZi0+bWF4X2hlYWRlcl9zaXplKTsKKwlza2JfcmVzZXRfdHJhbnNwb3J0X2hlYWRlcihza2IpOwogCiAJSVJEQV9ERUJVRyg0LCAiJXMoKSwgYXBwZW5kaW5nIHVzZXIgZGF0YVxuIiwgX19GVU5DVElPTl9fKTsKLQlhc21wdHIgPSBza2ItPmgucmF3ID0gc2tiX3B1dChza2IsIGxlbik7Ci0JZXJyID0gbWVtY3B5X2Zyb21pb3ZlYyhhc21wdHIsIG1zZy0+bXNnX2lvdiwgbGVuKTsKKwlza2JfcHV0KHNrYiwgbGVuKTsKKwllcnIgPSBtZW1jcHlfZnJvbWlvdmVjKHNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYiksIG1zZy0+bXNnX2lvdiwgbGVuKTsKIAlpZiAoZXJyKSB7CiAJCWtmcmVlX3NrYihza2IpOwogCQlyZXR1cm4gZXJyOwpAQCAtMTYwMiw3ICsxNTY1LDYgQEAKIAlfX3U4IHBpZCA9IDA7CiAJaW50IGJvdW5kID0gMDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCXVuc2lnbmVkIGNoYXIgKmFzbXB0cjsKIAlpbnQgZXJyOwogCiAJSVJEQV9ERUJVRyg0LCAiJXMoKSwgbGVuPSV6ZFxuIiwgX19GVU5DVElPTl9fLCBsZW4pOwpAQCAtMTYxNiw3ICsxNTc4LDYgQEAKIAl9CiAKIAlzZWxmID0gaXJkYV9zayhzayk7Ci0JSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKIAogCS8qIENoZWNrIGlmIGFuIGFkZHJlc3Mgd2FzIHNwZWNpZmllZCB3aXRoIHNlbmR0by4gSmVhbiBJSSAqLwogCWlmIChtc2ctPm1zZ19uYW1lKSB7CkBAIC0xNjYyLDEwICsxNjIzLDExIEBACiAJCXJldHVybiAtRU5PQlVGUzsKIAogCXNrYl9yZXNlcnZlKHNrYiwgc2VsZi0+bWF4X2hlYWRlcl9zaXplKTsKKwlza2JfcmVzZXRfdHJhbnNwb3J0X2hlYWRlcihza2IpOwogCiAJSVJEQV9ERUJVRyg0LCAiJXMoKSwgYXBwZW5kaW5nIHVzZXIgZGF0YVxuIiwgX19GVU5DVElPTl9fKTsKLQlhc21wdHIgPSBza2ItPmgucmF3ID0gc2tiX3B1dChza2IsIGxlbik7Ci0JZXJyID0gbWVtY3B5X2Zyb21pb3ZlYyhhc21wdHIsIG1zZy0+bXNnX2lvdiwgbGVuKTsKKwlza2JfcHV0KHNrYiwgbGVuKTsKKwllcnIgPSBtZW1jcHlfZnJvbWlvdmVjKHNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYiksIG1zZy0+bXNnX2lvdiwgbGVuKTsKIAlpZiAoZXJyKSB7CiAJCWtmcmVlX3NrYihza2IpOwogCQlyZXR1cm4gZXJyOwpAQCAtMTY4OSw4ICsxNjUxLDYgQEAKIAlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKIAlzdHJ1Y3QgaXJkYV9zb2NrICpzZWxmID0gaXJkYV9zayhzayk7CiAKLQlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOwotCiAJSVJEQV9ERUJVRygxLCAiJXMoJXApXG4iLCBfX0ZVTkNUSU9OX18sIHNlbGYpOwogCiAJc2stPnNrX3N0YXRlICAgICAgID0gVENQX0NMT1NFOwpAQCAtMTg2Myw4ICsxODIzLDYgQEAKIAlzdHJ1Y3QgaWFzX2F0dHJpYiAqCWlhc19hdHRyOwkvKiBBdHRyaWJ1dGUgaW4gSUFTIG9iamVjdCAqLwogCWludCBvcHQ7CiAKLQlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOwotCiAJSVJEQV9ERUJVRygyLCAiJXMoJXApXG4iLCBfX0ZVTkNUSU9OX18sIHNlbGYpOwogCiAJaWYgKGxldmVsICE9IFNPTF9JUkxNUCkKZGlmZiAtLWdpdCBhL25ldC9pcmRhL2lyY29tbS9pcmNvbW1fcGFyYW0uYyBiL25ldC9pcmRhL2lyY29tbS9pcmNvbW1fcGFyYW0uYwppbmRleCAwMWQ3YzljLi5lNWU0NzkyIDEwMDY0NAotLS0gYS9uZXQvaXJkYS9pcmNvbW0vaXJjb21tX3BhcmFtLmMKKysrIGIvbmV0L2lyZGEvaXJjb21tL2lyY29tbV9wYXJhbS5jCkBAIC0xMzMsOCArMTMzLDggQEAKIAkgKiBJbnNlcnRpbmcgaXMgYSBsaXR0bGUgYml0IHRyaWNreSBzaW5jZSB3ZSBkb24ndCBrbm93IGhvdyBtdWNoCiAJICogcm9vbSB3ZSB3aWxsIG5lZWQuIEJ1dCB0aGlzIHNob3VsZCBob3BlZnVsbHkgd29yayBPSwogCSAqLwotCWNvdW50ID0gaXJkYV9wYXJhbV9pbnNlcnQoc2VsZiwgcGksIHNrYi0+dGFpbCwgc2tiX3RhaWxyb29tKHNrYiksCi0JCQkJICAmaXJjb21tX3BhcmFtX2luZm8pOworCWNvdW50ID0gaXJkYV9wYXJhbV9pbnNlcnQoc2VsZiwgcGksIHNrYl90YWlsX3BvaW50ZXIoc2tiKSwKKwkJCQkgIHNrYl90YWlscm9vbShza2IpLCAmaXJjb21tX3BhcmFtX2luZm8pOwogCWlmIChjb3VudCA8IDApIHsKIAkJSVJEQV9XQVJOSU5HKCIlcygpLCBubyByb29tIGZvciBwYXJhbWV0ZXIhXG4iLCBfX0ZVTkNUSU9OX18pOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5zcGlubG9jaywgZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvbmV0L2lyZGEvaXJkYV9kZXZpY2UuYyBiL25ldC9pcmRhL2lyZGFfZGV2aWNlLmMKaW5kZXggZTcxNzgwMS4uN2I1ZGVmMSAxMDA2NDQKLS0tIGEvbmV0L2lyZGEvaXJkYV9kZXZpY2UuYworKysgYi9uZXQvaXJkYS9pcmRhX2RldmljZS5jCkBAIC0zNzUsNyArMzc1LDcgQEAKIGRvbmdsZV90ICppcmRhX2RldmljZV9kb25nbGVfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgdHlwZSkKIHsKIAlzdHJ1Y3QgZG9uZ2xlX3JlZyAqcmVnOwotCWRvbmdsZV90ICpkb25nbGUgPSBOVUxMOworCWRvbmdsZV90ICpkb25nbGUgPSBremFsbG9jKHNpemVvZihkb25nbGVfdCksIEdGUF9LRVJORUwpOwogCiAJbWlnaHRfc2xlZXAoKTsKIApAQCAtMzk3LDE5ICszOTcsMTQgQEAKIAlpZiAoIXJlZyB8fCAhdHJ5X21vZHVsZV9nZXQocmVnLT5vd25lcikgKSB7CiAJCUlSREFfRVJST1IoIklyREE6IFVuYWJsZSB0byBmaW5kIHJlcXVlc3RlZCBkb25nbGUgdHlwZSAleFxuIiwKIAkJCSAgIHR5cGUpOwotCQlnb3RvIG91dDsKKwkJa2ZyZWUoZG9uZ2xlKTsKKwkJZG9uZ2xlID0gTlVMTDsKIAl9Ci0KLQkvKiBBbGxvY2F0ZSBkb25nbGUgaW5mbyBmb3IgdGhpcyBpbnN0YW5jZSAqLwotCWRvbmdsZSA9IGt6YWxsb2Moc2l6ZW9mKGRvbmdsZV90KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkb25nbGUpCi0JCWdvdG8gb3V0OwotCi0JLyogQmluZCB0aGUgcmVnaXN0cmF0aW9uIGluZm8gdG8gdGhpcyBwYXJ0aWN1bGFyIGluc3RhbmNlICovCi0JZG9uZ2xlLT5pc3N1ZSA9IHJlZzsKLQlkb25nbGUtPmRldiA9IGRldjsKLQotIG91dDoKKwlpZiAoZG9uZ2xlKSB7CisJCS8qIEJpbmQgdGhlIHJlZ2lzdHJhdGlvbiBpbmZvIHRvIHRoaXMgcGFydGljdWxhciBpbnN0YW5jZSAqLworCQlkb25nbGUtPmlzc3VlID0gcmVnOworCQlkb25nbGUtPmRldiA9IGRldjsKKwl9CiAJc3Bpbl91bmxvY2soJmRvbmdsZXMtPmhiX3NwaW5sb2NrKTsKIAlyZXR1cm4gZG9uZ2xlOwogfQpkaWZmIC0tZ2l0IGEvbmV0L2lyZGEvaXJsYW4vaXJsYW5fY29tbW9uLmMgYi9uZXQvaXJkYS9pcmxhbi9pcmxhbl9jb21tb24uYwppbmRleCBmY2Y5ZDY1Li5lZDY5NzczIDEwMDY0NAotLS0gYS9uZXQvaXJkYS9pcmxhbi9pcmxhbl9jb21tb24uYworKysgYi9uZXQvaXJkYS9pcmxhbi9pcmxhbl9jb21tb24uYwpAQCAtMTAzOSw3ICsxMDM5LDcgQEAKIAl9CiAKIAkvKiBJbnNlcnQgYXQgZW5kIG9mIHNrLWJ1ZmZlciAqLwotCWZyYW1lID0gc2tiLT50YWlsOworCWZyYW1lID0gc2tiX3RhaWxfcG9pbnRlcihza2IpOwogCiAJLyogTWFrZSBzcGFjZSBmb3IgZGF0YSAqLwogCWlmIChza2JfdGFpbHJvb20oc2tiKSA8IChwYXJhbV9sZW4rdmFsdWVfbGVuKzMpKSB7CmRpZmYgLS1naXQgYS9uZXQvaXJkYS9pcmxhbi9pcmxhbl9ldGguYyBiL25ldC9pcmRhL2lybGFuL2lybGFuX2V0aC5jCmluZGV4IDY3MmFiM2YuLmM0MjE1MjEgMTAwNjQ0Ci0tLSBhL25ldC9pcmRhL2lybGFuL2lybGFuX2V0aC5jCisrKyBiL25ldC9pcmRhL2lybGFuL2lybGFuX2V0aC5jCkBAIC0yMzQsOCArMjM0LDcgQEAKIAkgKiBtaWdodCBoYXZlIGJlZW4gcHJldmlvdXNseSBzZXQgYnkgdGhlIGxvdyBsZXZlbCBJckRBIG5ldHdvcmsKIAkgKiBkZXZpY2UgZHJpdmVyCiAJICovCi0Jc2tiLT5kZXYgPSBzZWxmLT5kZXY7Ci0Jc2tiLT5wcm90b2NvbD1ldGhfdHlwZV90cmFucyhza2IsIHNrYi0+ZGV2KTsgLyogUmVtb3ZlIGV0aCBoZWFkZXIgKi8KKwlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBzZWxmLT5kZXYpOyAvKiBSZW1vdmUgZXRoIGhlYWRlciAqLwogCiAJc2VsZi0+c3RhdHMucnhfcGFja2V0cysrOwogCXNlbGYtPnN0YXRzLnJ4X2J5dGVzICs9IHNrYi0+bGVuOwpkaWZmIC0tZ2l0IGEvbmV0L2lyZGEvaXJsYXBfZXZlbnQuYyBiL25ldC9pcmRhL2lybGFwX2V2ZW50LmMKaW5kZXggN2I2NDMzZi4uMGIwMjA3MyAxMDA2NDQKLS0tIGEvbmV0L2lyZGEvaXJsYXBfZXZlbnQuYworKysgYi9uZXQvaXJkYS9pcmxhcF9ldmVudC5jCkBAIC01OTAsNyArNTkwLDcgQEAKIAkJaWYgKCFzZWxmLT5kaXNjb3ZlcnlfbG9nKSB7CiAJCQlJUkRBX1dBUk5JTkcoIiVzOiBkaXNjb3ZlcnkgbG9nIGlzIGdvbmUhICIKIAkJCQkgICAgICJtYXliZSB0aGUgZGlzY292ZXJ5IHRpbWVvdXQgaGFzIGJlZW4gc2V0IgotCQkJCSAgICAgIiB0byBzaG9ydD9cbiIsIF9fRlVOQ1RJT05fXyk7CisJCQkJICAgICAiIHRvbyBzaG9ydD9cbiIsIF9fRlVOQ1RJT05fXyk7CiAJCQlicmVhazsKIAkJfQogCQloYXNoYmluX2luc2VydChzZWxmLT5kaXNjb3ZlcnlfbG9nLApkaWZmIC0tZ2l0IGEvbmV0L2lyZGEvaXJsYXBfZnJhbWUuYyBiL25ldC9pcmRhL2lybGFwX2ZyYW1lLmMKaW5kZXggMGIwNDYwMy4uM2M1YTY4ZSAxMDA2NDQKLS0tIGEvbmV0L2lyZGEvaXJsYXBfZnJhbWUuYworKysgYi9uZXQvaXJkYS9pcmxhcF9mcmFtZS5jCkBAIC05Myw3ICs5Myw5IEBACiB7CiAJLyogU29tZSBjb21tb24gaW5pdCBzdHVmZiAqLwogCXNrYi0+ZGV2ID0gc2VsZi0+bmV0ZGV2OwotCXNrYi0+aC5yYXcgPSBza2ItPm5oLnJhdyA9IHNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKwlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOworCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOworCXNrYl9yZXNldF90cmFuc3BvcnRfaGVhZGVyKHNrYik7CiAJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0lSREEpOwogCXNrYi0+cHJpb3JpdHkgPSBUQ19QUklPX0JFU1RFRkZPUlQ7CiAKQEAgLTQxMSw3ICs0MTMsNyBAQAogCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IExBUF9NQUdJQywgcmV0dXJuOyk7CiAKIAlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IHhpZF9mcmFtZSkpKSB7Ci0JCUlSREFfRVJST1IoIiVzOiBmcmFtZSB0byBzaG9ydCFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCUlSREFfRVJST1IoIiVzOiBmcmFtZSB0b28gc2hvcnQhXG4iLCBfX0ZVTkNUSU9OX18pOwogCQlyZXR1cm47CiAJfQogCkBAIC00ODIsNyArNDg0LDcgQEAKIAljaGFyICp0ZXh0OwogCiAJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCB4aWRfZnJhbWUpKSkgewotCQlJUkRBX0VSUk9SKCIlczogZnJhbWUgdG8gc2hvcnQhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlJUkRBX0VSUk9SKCIlczogZnJhbWUgdG9vIHNob3J0IVxuIiwgX19GVU5DVElPTl9fKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtNTI2LDcgKzUyOCw3IEBACiAJCS8qIENoZWNrIGlmIHRoaW5ncyBhcmUgc2FuZSBhdCB0aGlzIHBvaW50Li4uICovCiAJCWlmKChkaXNjb3ZlcnlfaW5mbyA9PSBOVUxMKSB8fAogCQkgICAhcHNrYl9tYXlfcHVsbChza2IsIDMpKSB7Ci0JCQlJUkRBX0VSUk9SKCIlczogZGlzY292ZXJ5IGZyYW1lIHRvIHNob3J0IVxuIiwKKwkJCUlSREFfRVJST1IoIiVzOiBkaXNjb3ZlcnkgZnJhbWUgdG9vIHNob3J0IVxuIiwKIAkJCQkgICBfX0ZVTkNUSU9OX18pOwogCQkJcmV0dXJuOwogCQl9CkBAIC0xMTcxLDcgKzExNzMsNyBAQAogCUlSREFfQVNTRVJUKGluZm8gIT0gTlVMTCwgcmV0dXJuOyk7CiAKIAlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCA0KSkgewotCQlJUkRBX0VSUk9SKCIlczogZnJhbWUgdG8gc2hvcnQhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlJUkRBX0VSUk9SKCIlczogZnJhbWUgdG9vIHNob3J0IVxuIiwgX19GVU5DVElPTl9fKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMTI2MCw3ICsxMjYyLDcgQEAKIAlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOwogCiAJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgc2l6ZW9mKCpmcmFtZSkpKSB7Ci0JCUlSREFfRVJST1IoIiVzOiBmcmFtZSB0byBzaG9ydCFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCUlSREFfRVJST1IoIiVzOiBmcmFtZSB0b28gc2hvcnQhXG4iLCBfX0ZVTkNUSU9OX18pOwogCQlyZXR1cm47CiAJfQogCWZyYW1lID0gKHN0cnVjdCB0ZXN0X2ZyYW1lICopIHNrYi0+ZGF0YTsKQEAgLTEyNjgsNyArMTI3MCw3IEBACiAJLyogQnJvYWRjYXN0IGZyYW1lcyBtdXN0IGNhcnJ5IHNhZGRyIGFuZCBkYWRkciBmaWVsZHMgKi8KIAlpZiAoaW5mby0+Y2FkZHIgPT0gQ0JST0FEQ0FTVCkgewogCQlpZiAoc2tiLT5sZW4gPCBzaXplb2Yoc3RydWN0IHRlc3RfZnJhbWUpKSB7Ci0JCQlJUkRBX0RFQlVHKDAsICIlcygpIHRlc3QgZnJhbWUgdG8gc2hvcnQhXG4iLAorCQkJSVJEQV9ERUJVRygwLCAiJXMoKSB0ZXN0IGZyYW1lIHRvbyBzaG9ydCFcbiIsCiAJCQkJICAgX19GVU5DVElPTl9fKTsKIAkJCXJldHVybjsKIAkJfQpAQCAtMTMzNCw3ICsxMzM2LDcgQEAKIAogCS8qIENoZWNrIGlmIGZyYW1lIGlzIGxhcmdlIGVub3VnaCBmb3IgcGFyc2luZyAqLwogCWlmICghcHNrYl9tYXlfcHVsbChza2IsIDIpKSB7Ci0JCUlSREFfRVJST1IoIiVzOiBmcmFtZSB0byBzaG9ydCFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCUlSREFfRVJST1IoIiVzOiBmcmFtZSB0b28gc2hvcnQhXG4iLCBfX0ZVTkNUSU9OX18pOwogCQlkZXZfa2ZyZWVfc2tiKHNrYik7CiAJCXJldHVybiAtMTsKIAl9CmRpZmYgLS1naXQgYS9uZXQvaXJkYS9pcnF1ZXVlLmMgYi9uZXQvaXJkYS9pcnF1ZXVlLmMKaW5kZXggOTI2NjIzMy4uZDA1OGI0NiAxMDA2NDQKLS0tIGEvbmV0L2lyZGEvaXJxdWV1ZS5jCisrKyBiL25ldC9pcmRhL2lycXVldWUuYwpAQCAtMzg0LDYgKzM4NCw5IEBACiAgKiAgICBmb3IgZGVhbGxvY2F0aW5nIHRoaXMgc3RydWN0dXJlIGlmIGl0J3MgY29tcGxleC4gSWYgbm90IHRoZSB1c2VyIGNhbgogICogICAganVzdCBzdXBwbHkga2ZyZWUsIHdoaWNoIHNob3VsZCB0YWtlIGNhcmUgb2YgdGhlIGpvYi4KICAqLworI2lmZGVmIENPTkZJR19MT0NLREVQCitzdGF0aWMgaW50IGhhc2hiaW5fbG9ja19kZXB0aCA9IDA7CisjZW5kaWYKIGludCBoYXNoYmluX2RlbGV0ZSggaGFzaGJpbl90KiBoYXNoYmluLCBGUkVFX0ZVTkMgZnJlZV9mdW5jKQogewogCWlyZGFfcXVldWVfdCogcXVldWU7CkBAIC0zOTUsNyArMzk4LDggQEAKIAogCS8qIFN5bmNocm9uaXplICovCiAJaWYgKCBoYXNoYmluLT5oYl90eXBlICYgSEJfTE9DSyApIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmhhc2hiaW4tPmhiX3NwaW5sb2NrLCBmbGFncyk7CisJCXNwaW5fbG9ja19pcnFzYXZlX25lc3RlZCgmaGFzaGJpbi0+aGJfc3BpbmxvY2ssIGZsYWdzLAorCQkJCQkgaGFzaGJpbl9sb2NrX2RlcHRoKyspOwogCX0KIAogCS8qCkBAIC00MTksNiArNDIzLDkgQEAKIAkvKiBSZWxlYXNlIGxvY2sgKi8KIAlpZiAoIGhhc2hiaW4tPmhiX3R5cGUgJiBIQl9MT0NLKSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhc2hiaW4tPmhiX3NwaW5sb2NrLCBmbGFncyk7CisjaWZkZWYgQ09ORklHX0xPQ0tERVAKKwkJaGFzaGJpbl9sb2NrX2RlcHRoLS07CisjZW5kaWYKIAl9CiAKIAkvKgpkaWZmIC0tZ2l0IGEvbmV0L2lyZGEvaXJ0dHAuYyBiL25ldC9pcmRhL2lydHRwLmMKaW5kZXggZGEzZjJiYy4uNzA2OWU0YSAxMDA2NDQKLS0tIGEvbmV0L2lyZGEvaXJ0dHAuYworKysgYi9uZXQvaXJkYS9pcnR0cC5jCkBAIC0yNTYsNyArMjU2LDcgQEAKIAkgKiAgQ29weSBhbGwgZnJhZ21lbnRzIHRvIGEgbmV3IGJ1ZmZlcgogCSAqLwogCXdoaWxlICgoZnJhZyA9IHNrYl9kZXF1ZXVlKCZzZWxmLT5yeF9mcmFnbWVudHMpKSAhPSBOVUxMKSB7Ci0JCW1lbWNweShza2ItPmRhdGErbiwgZnJhZy0+ZGF0YSwgZnJhZy0+bGVuKTsKKwkJc2tiX2NvcHlfdG9fbGluZWFyX2RhdGFfb2Zmc2V0KHNrYiwgbiwgZnJhZy0+ZGF0YSwgZnJhZy0+bGVuKTsKIAkJbiArPSBmcmFnLT5sZW47CiAKIAkJZGV2X2tmcmVlX3NrYihmcmFnKTsKQEAgLTMxNCw4ICszMTQsOCBAQAogCQlza2JfcmVzZXJ2ZShmcmFnLCBzZWxmLT5tYXhfaGVhZGVyX3NpemUpOwogCiAJCS8qIENvcHkgZGF0YSBmcm9tIHRoZSBvcmlnaW5hbCBza2IgaW50byB0aGlzIGZyYWdtZW50LiAqLwotCQltZW1jcHkoc2tiX3B1dChmcmFnLCBzZWxmLT5tYXhfc2VnX3NpemUpLCBza2ItPmRhdGEsCi0JCSAgICAgICBzZWxmLT5tYXhfc2VnX3NpemUpOworCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgc2tiX3B1dChmcmFnLCBzZWxmLT5tYXhfc2VnX3NpemUpLAorCQkJICAgICAgc2VsZi0+bWF4X3NlZ19zaXplKTsKIAogCQkvKiBJbnNlcnQgVFRQIGhlYWRlciwgd2l0aCB0aGUgbW9yZSBiaXQgc2V0ICovCiAJCWZyYW1lID0gc2tiX3B1c2goZnJhZywgVFRQX0hFQURFUik7CkBAIC01NTEsNyArNTUxLDcgQEAKIAl9CiAKIAlpZiAoc2tiLT5sZW4gPiBzZWxmLT5tYXhfc2VnX3NpemUpIHsKLQkJSVJEQV9ERUJVRygxLCAiJXMoKSwgVURhdGEgaXMgdG8gbGFyZ2UgZm9yIElyTEFQIVxuIiwKKwkJSVJEQV9ERUJVRygxLCAiJXMoKSwgVURhdGEgaXMgdG9vIGxhcmdlIGZvciBJckxBUCFcbiIsCiAJCQkgICBfX0ZVTkNUSU9OX18pOwogCQlnb3RvIGVycjsKIAl9CkBAIC01OTgsNyArNTk4LDcgQEAKIAkgKiAgaW5zaWRlIGFuIElyTEFQIGZyYW1lCiAJICovCiAJaWYgKChzZWxmLT50eF9tYXhfc2R1X3NpemUgPT0gMCkgJiYgKHNrYi0+bGVuID4gc2VsZi0+bWF4X3NlZ19zaXplKSkgewotCQlJUkRBX0VSUk9SKCIlczogU0FSIGRpc2FibGVkLCBhbmQgZGF0YSBpcyB0byBsYXJnZSBmb3IgSXJMQVAhXG4iLAorCQlJUkRBX0VSUk9SKCIlczogU0FSIGRpc2FibGVkLCBhbmQgZGF0YSBpcyB0b28gbGFyZ2UgZm9yIElyTEFQIVxuIiwKIAkJCSAgIF9fRlVOQ1RJT05fXyk7CiAJCXJldCA9IC1FTVNHU0laRTsKIAkJZ290byBlcnI7CmRpZmYgLS1naXQgYS9uZXQvaXJkYS9wYXJhbWV0ZXJzLmMgYi9uZXQvaXJkYS9wYXJhbWV0ZXJzLmMKaW5kZXggNzVhNzJkMi4uMjYyN2RhZCAxMDA2NDQKLS0tIGEvbmV0L2lyZGEvcGFyYW1ldGVycy5jCisrKyBiL25ldC9pcmRhL3BhcmFtZXRlcnMuYwpAQCAtMTYwLDcgKzE2MCw3IEBACiAJfQogCS8qIENoZWNrIGlmIGJ1ZmZlciBpcyBsb25nIGVub3VnaCBmb3IgaW5zZXJ0aW9uICovCiAJaWYgKGxlbiA8ICgyK3AucGwpKSB7Ci0JCUlSREFfV0FSTklORygiJXM6IGJ1ZmZlciB0byBzaG9ydCBmb3IgaW5zZXJ0aW9uIVxuIiwKKwkJSVJEQV9XQVJOSU5HKCIlczogYnVmZmVyIHRvbyBzaG9ydCBmb3IgaW5zZXJ0aW9uIVxuIiwKIAkJCSAgICAgX19GVU5DVElPTl9fKTsKIAkJcmV0dXJuIC0xOwogCX0KQEAgLTIxNiw3ICsyMTYsNyBAQAogCiAJLyogQ2hlY2sgaWYgYnVmZmVyIGlzIGxvbmcgZW5vdWdoIGZvciBwYXJzaW5nICovCiAJaWYgKGxlbiA8ICgyK3AucGwpKSB7Ci0JCUlSREFfV0FSTklORygiJXM6IGJ1ZmZlciB0byBzaG9ydCBmb3IgcGFyc2luZyEgIgorCQlJUkRBX1dBUk5JTkcoIiVzOiBidWZmZXIgdG9vIHNob3J0IGZvciBwYXJzaW5nISAiCiAJCQkgICAgICJOZWVkICVkIGJ5dGVzLCBidXQgbGVuIGlzIG9ubHkgJWRcbiIsCiAJCQkgICAgIF9fRlVOQ1RJT05fXywgcC5wbCwgbGVuKTsKIAkJcmV0dXJuIC0xOwpAQCAtMzA0LDcgKzMwNCw3IEBACiAKIAkvKiBDaGVjayBpZiBidWZmZXIgaXMgbG9uZyBlbm91Z2ggZm9yIHBhcnNpbmcgKi8KIAlpZiAobGVuIDwgKDIrcC5wbCkpIHsKLQkJSVJEQV9XQVJOSU5HKCIlczogYnVmZmVyIHRvIHNob3J0IGZvciBwYXJzaW5nISAiCisJCUlSREFfV0FSTklORygiJXM6IGJ1ZmZlciB0b28gc2hvcnQgZm9yIHBhcnNpbmchICIKIAkJCSAgICAgIk5lZWQgJWQgYnl0ZXMsIGJ1dCBsZW4gaXMgb25seSAlZFxuIiwKIAkJCSAgICAgX19GVU5DVElPTl9fLCBwLnBsLCBsZW4pOwogCQlyZXR1cm4gLTE7CkBAIC0zNDMsNyArMzQzLDcgQEAKIAogCS8qIENoZWNrIGlmIGJ1ZmZlciBpcyBsb25nIGVub3VnaCBmb3IgcGFyc2luZyAqLwogCWlmIChsZW4gPCAoMitwLnBsKSkgewotCQlJUkRBX1dBUk5JTkcoIiVzOiBidWZmZXIgdG8gc2hvcnQgZm9yIHBhcnNpbmchICIKKwkJSVJEQV9XQVJOSU5HKCIlczogYnVmZmVyIHRvbyBzaG9ydCBmb3IgcGFyc2luZyEgIgogCQkJICAgICAiTmVlZCAlZCBieXRlcywgYnV0IGxlbiBpcyBvbmx5ICVkXG4iLAogCQkJICAgICBfX0ZVTkNUSU9OX18sIHAucGwsIGxlbik7CiAJCXJldHVybiAtMTsKZGlmZiAtLWdpdCBhL25ldC9pcmRhL3Fvcy5jIGIvbmV0L2lyZGEvcW9zLmMKaW5kZXggMzQ5MDEyYy4uYWViMThjZiAxMDA2NDQKLS0tIGEvbmV0L2lyZGEvcW9zLmMKKysrIGIvbmV0L2lyZGEvcW9zLmMKQEAgLTQ2OSw0OSArNDY5LDQ5IEBACiAJaW50IHJldDsKIAogCS8qIEluc2VydCBkYXRhIHJhdGUgKi8KLQlyZXQgPSBpcmRhX3BhcmFtX2luc2VydChzZWxmLCBQSV9CQVVEX1JBVEUsIHNrYi0+dGFpbCwKKwlyZXQgPSBpcmRhX3BhcmFtX2luc2VydChzZWxmLCBQSV9CQVVEX1JBVEUsIHNrYl90YWlsX3BvaW50ZXIoc2tiKSwKIAkJCQlza2JfdGFpbHJvb20oc2tiKSwgJmlybGFwX3BhcmFtX2luZm8pOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCXNrYl9wdXQoc2tiLCByZXQpOwogCiAJLyogSW5zZXJ0IG1heCB0dXJuYXJvdW5kIHRpbWUgKi8KLQlyZXQgPSBpcmRhX3BhcmFtX2luc2VydChzZWxmLCBQSV9NQVhfVFVSTl9USU1FLCBza2ItPnRhaWwsCisJcmV0ID0gaXJkYV9wYXJhbV9pbnNlcnQoc2VsZiwgUElfTUFYX1RVUk5fVElNRSwgc2tiX3RhaWxfcG9pbnRlcihza2IpLAogCQkJCXNrYl90YWlscm9vbShza2IpLCAmaXJsYXBfcGFyYW1faW5mbyk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAJc2tiX3B1dChza2IsIHJldCk7CiAKIAkvKiBJbnNlcnQgZGF0YSBzaXplICovCi0JcmV0ID0gaXJkYV9wYXJhbV9pbnNlcnQoc2VsZiwgUElfREFUQV9TSVpFLCBza2ItPnRhaWwsCisJcmV0ID0gaXJkYV9wYXJhbV9pbnNlcnQoc2VsZiwgUElfREFUQV9TSVpFLCBza2JfdGFpbF9wb2ludGVyKHNrYiksCiAJCQkJc2tiX3RhaWxyb29tKHNrYiksICZpcmxhcF9wYXJhbV9pbmZvKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAlza2JfcHV0KHNrYiwgcmV0KTsKIAogCS8qIEluc2VydCB3aW5kb3cgc2l6ZSAqLwotCXJldCA9IGlyZGFfcGFyYW1faW5zZXJ0KHNlbGYsIFBJX1dJTkRPV19TSVpFLCBza2ItPnRhaWwsCisJcmV0ID0gaXJkYV9wYXJhbV9pbnNlcnQoc2VsZiwgUElfV0lORE9XX1NJWkUsIHNrYl90YWlsX3BvaW50ZXIoc2tiKSwKIAkJCQlza2JfdGFpbHJvb20oc2tiKSwgJmlybGFwX3BhcmFtX2luZm8pOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCXNrYl9wdXQoc2tiLCByZXQpOwogCiAJLyogSW5zZXJ0IGFkZGl0aW9uYWwgQk9GcyAqLwotCXJldCA9IGlyZGFfcGFyYW1faW5zZXJ0KHNlbGYsIFBJX0FERF9CT0ZTLCBza2ItPnRhaWwsCisJcmV0ID0gaXJkYV9wYXJhbV9pbnNlcnQoc2VsZiwgUElfQUREX0JPRlMsIHNrYl90YWlsX3BvaW50ZXIoc2tiKSwKIAkJCQlza2JfdGFpbHJvb20oc2tiKSwgJmlybGFwX3BhcmFtX2luZm8pOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCXNrYl9wdXQoc2tiLCByZXQpOwogCiAJLyogSW5zZXJ0IG1pbmltdW0gdHVybmFyb3VuZCB0aW1lICovCi0JcmV0ID0gaXJkYV9wYXJhbV9pbnNlcnQoc2VsZiwgUElfTUlOX1RVUk5fVElNRSwgc2tiLT50YWlsLAorCXJldCA9IGlyZGFfcGFyYW1faW5zZXJ0KHNlbGYsIFBJX01JTl9UVVJOX1RJTUUsIHNrYl90YWlsX3BvaW50ZXIoc2tiKSwKIAkJCQlza2JfdGFpbHJvb20oc2tiKSwgJmlybGFwX3BhcmFtX2luZm8pOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCXNrYl9wdXQoc2tiLCByZXQpOwogCiAJLyogSW5zZXJ0IGxpbmsgZGlzY29ubmVjdC90aHJlc2hvbGQgdGltZSAqLwotCXJldCA9IGlyZGFfcGFyYW1faW5zZXJ0KHNlbGYsIFBJX0xJTktfRElTQywgc2tiLT50YWlsLAorCXJldCA9IGlyZGFfcGFyYW1faW5zZXJ0KHNlbGYsIFBJX0xJTktfRElTQywgc2tiX3RhaWxfcG9pbnRlcihza2IpLAogCQkJCXNrYl90YWlscm9vbShza2IpLCAmaXJsYXBfcGFyYW1faW5mbyk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9uZXQvaXJkYS93cmFwcGVyLmMgYi9uZXQvaXJkYS93cmFwcGVyLmMKaW5kZXggNWFiZmI3MS4uYTdhN2YxOSAxMDA2NDQKLS0tIGEvbmV0L2lyZGEvd3JhcHBlci5jCisrKyBiL25ldC9pcmRhL3dyYXBwZXIuYwpAQCAtMjM5LDcgKzIzOSw4IEBACiAKIAlpZihkb2NvcHkpIHsKIAkJLyogQ29weSBkYXRhIHdpdGhvdXQgQ1JDIChsZW5naHQgYWxyZWFkeSBjaGVja2VkKSAqLwotCQltZW1jcHkobmV3c2tiLT5kYXRhLCByeF9idWZmLT5kYXRhLCByeF9idWZmLT5sZW4gLSAyKTsKKwkJc2tiX2NvcHlfdG9fbGluZWFyX2RhdGEobmV3c2tiLCByeF9idWZmLT5kYXRhLAorCQkJCQlyeF9idWZmLT5sZW4gLSAyKTsKIAkJLyogRGVsaXZlciB0aGlzIHNrYiAqLwogCQlkYXRhc2tiID0gbmV3c2tiOwogCX0gZWxzZSB7CkBAIC0yNTYsNyArMjU3LDcgQEAKIAogCS8qIEZlZWQgaXQgdG8gSXJMQVAgbGF5ZXIgKi8KIAlkYXRhc2tiLT5kZXYgPSBkZXY7Ci0JZGF0YXNrYi0+bWFjLnJhdyAgPSBkYXRhc2tiLT5kYXRhOworCXNrYl9yZXNldF9tYWNfaGVhZGVyKGRhdGFza2IpOwogCWRhdGFza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfSVJEQSk7CiAKIAluZXRpZl9yeChkYXRhc2tiKTsKZGlmZiAtLWdpdCBhL25ldC9pdWN2L2FmX2l1Y3YuYyBiL25ldC9pdWN2L2FmX2l1Y3YuYwppbmRleCBhY2M5NDIxLi5lODRjOTI0IDEwMDY0NAotLS0gYS9uZXQvaXVjdi9hZl9pdWN2LmMKKysrIGIvbmV0L2l1Y3YvYWZfaXVjdi5jCkBAIC0xODEsNyArMTgxLDcgQEAKIAlkZWZhdWx0OgogCQlzb2NrX3NldF9mbGFnKHNrLCBTT0NLX1pBUFBFRCk7CiAJCWJyZWFrOwotCX07CisJfQogCiAJcmVsZWFzZV9zb2NrKHNrKTsKIAlpdWN2X3NvY2tfa2lsbChzayk7CkBAIC05NTMsOCArOTUzLDggQEAKIAkJCXJldHVybjsKIAkJfQogCi0JCXNrYi0+aC5yYXcgPSBza2ItPmRhdGE7Ci0JCXNrYi0+bmgucmF3ID0gc2tiLT5kYXRhOworCQlza2JfcmVzZXRfdHJhbnNwb3J0X2hlYWRlcihza2IpOworCQlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiKTsKIAkJc2tiLT5sZW4gPSBtc2ctPmxlbmd0aDsKIAl9CiAKZGlmZiAtLWdpdCBhL25ldC9pdWN2L2l1Y3YuYyBiL25ldC9pdWN2L2l1Y3YuYwppbmRleCAxYjEwZDU3Li45MDNiZGI2IDEwMDY0NAotLS0gYS9uZXQvaXVjdi9pdWN2LmMKKysrIGIvbmV0L2l1Y3YvaXVjdi5jCkBAIC05MCwyMCArOTAsNDMgQEAKIAl1MzIgcmVzMls4XTsKIH07CiAKLXN0cnVjdCBpdWN2X3dvcmsgeworc3RydWN0IGl1Y3ZfaXJxX2xpc3QgewogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIAlzdHJ1Y3QgaXVjdl9pcnFfZGF0YSBkYXRhOwogfTsKIAotc3RhdGljIExJU1RfSEVBRChpdWN2X3dvcmtfcXVldWUpOwotc3RhdGljIERFRklORV9TUElOTE9DSyhpdWN2X3dvcmtfbG9jayk7Ci0KIHN0YXRpYyBzdHJ1Y3QgaXVjdl9pcnFfZGF0YSAqaXVjdl9pcnFfZGF0YTsKIHN0YXRpYyBjcHVtYXNrX3QgaXVjdl9idWZmZXJfY3B1bWFzayA9IENQVV9NQVNLX05PTkU7CiBzdGF0aWMgY3B1bWFza190IGl1Y3ZfaXJxX2NwdW1hc2sgPSBDUFVfTUFTS19OT05FOwogCi1zdGF0aWMgdm9pZCBpdWN2X3Rhc2tsZXRfaGFuZGxlcih1bnNpZ25lZCBsb25nKTsKLXN0YXRpYyBERUNMQVJFX1RBU0tMRVQoaXVjdl90YXNrbGV0LCBpdWN2X3Rhc2tsZXRfaGFuZGxlciwwKTsKKy8qCisgKiBRdWV1ZSBvZiBpbnRlcnJ1cHQgYnVmZmVycyBsb2NrIGZvciBkZWxpdmVyeSB2aWEgdGhlIHRhc2tsZXQKKyAqIChmYXN0IGJ1dCBjYW4ndCBjYWxsIHNtcF9jYWxsX2Z1bmN0aW9uKS4KKyAqLworc3RhdGljIExJU1RfSEVBRChpdWN2X3Rhc2tfcXVldWUpOworCisvKgorICogVGhlIHRhc2tsZXQgZm9yIGZhc3QgZGVsaXZlcnkgb2YgaXVjdiBpbnRlcnJ1cHRzLgorICovCitzdGF0aWMgdm9pZCBpdWN2X3Rhc2tsZXRfZm4odW5zaWduZWQgbG9uZyk7CitzdGF0aWMgREVDTEFSRV9UQVNLTEVUKGl1Y3ZfdGFza2xldCwgaXVjdl90YXNrbGV0X2ZuLDApOworCisvKgorICogUXVldWUgb2YgaW50ZXJydXB0IGJ1ZmZlcnMgZm9yIGRlbGl2ZXJ5IHZpYSBhIHdvcmsgcXVldWUKKyAqIChzbG93ZXIgYnV0IGNhbiBjYWxsIHNtcF9jYWxsX2Z1bmN0aW9uKS4KKyAqLworc3RhdGljIExJU1RfSEVBRChpdWN2X3dvcmtfcXVldWUpOworCisvKgorICogVGhlIHdvcmsgZWxlbWVudCB0byBkZWxpdmVyIHBhdGggcGVuZGluZyBpbnRlcnJ1cHRzLgorICovCitzdGF0aWMgdm9pZCBpdWN2X3dvcmtfZm4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKK3N0YXRpYyBERUNMQVJFX1dPUksoaXVjdl93b3JrLCBpdWN2X3dvcmtfZm4pOworCisvKgorICogU3BpbmxvY2sgcHJvdGVjdGluZyB0YXNrIGFuZCB3b3JrIHF1ZXVlLgorICovCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGl1Y3ZfcXVldWVfbG9jayk7CiAKIGVudW0gaXVjdl9jb21tYW5kX2NvZGVzIHsKIAlJVUNWX1FVRVJZID0gMCwKQEAgLTE0NywxMCArMTcwLDEwIEBACiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGl1Y3ZfdGFibGVfbG9jayk7CiAKIC8qCi0gKiBpdWN2X3Rhc2tsZXRfY3B1OiBjb250YWlucyB0aGUgbnVtYmVyIG9mIHRoZSBjcHUgZXhlY3V0aW5nIHRoZSB0YXNrbGV0LgotICogTmVlZGVkIGZvciBpdWN2X3BhdGhfc2V2ZXIgY2FsbGVkIGZyb20gdGFza2xldC4KKyAqIGl1Y3ZfYWN0aXZlX2NwdTogY29udGFpbnMgdGhlIG51bWJlciBvZiB0aGUgY3B1IGV4ZWN1dGluZyB0aGUgdGFza2xldAorICogb3IgdGhlIHdvcmsgaGFuZGxlci4gTmVlZGVkIGZvciBpdWN2X3BhdGhfc2V2ZXIgY2FsbGVkIGZyb20gdGFza2xldC4KICAqLwotc3RhdGljIGludCBpdWN2X3Rhc2tsZXRfY3B1ID0gLTE7CitzdGF0aWMgaW50IGl1Y3ZfYWN0aXZlX2NwdSA9IC0xOwogCiAvKgogICogTXV0ZXggYW5kIHdhaXQgcXVldWUgZm9yIGl1Y3ZfcmVnaXN0ZXIvaXVjdl91bnJlZ2lzdGVyLgpAQCAtNDQ5LDE3ICs0NzIsMTkgQEAKIHsKIAlpbnQgY3B1OwogCisJcHJlZW1wdF9kaXNhYmxlKCk7CiAJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpCiAJCS8qIEVuYWJsZSBhbGwgY3B1cyB3aXRoIGEgZGVjbGFyZWQgYnVmZmVyLiAqLwogCQlpZiAoY3B1X2lzc2V0KGNwdSwgaXVjdl9idWZmZXJfY3B1bWFzaykgJiYKIAkJICAgICFjcHVfaXNzZXQoY3B1LCBpdWN2X2lycV9jcHVtYXNrKSkKIAkJCXNtcF9jYWxsX2Z1bmN0aW9uX29uKGl1Y3ZfYWxsb3dfY3B1LCBOVUxMLCAwLCAxLCBjcHUpOworCXByZWVtcHRfZW5hYmxlKCk7CiB9CiAKIC8qKgogICogaXVjdl9zZXRtYXNrX3VwCiAgKgotICogQWxsb3cgaXVjdiBpbnRlcnJ1cHRzIG9uIGEgc2luZ2xlIGNwdXMuCisgKiBBbGxvdyBpdWN2IGludGVycnVwdHMgb24gYSBzaW5nbGUgY3B1LgogICovCiBzdGF0aWMgdm9pZCBpdWN2X3NldG1hc2tfdXAodm9pZCkKIHsKQEAgLTQ5Myw4ICs1MTgsMTAgQEAKIAkJZ290byBvdXQ7CiAJLyogRGVjbGFyZSBwZXIgY3B1IGJ1ZmZlcnMuICovCiAJcmMgPSAtRUlPOworCXByZWVtcHRfZGlzYWJsZSgpOwogCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KQogCQlzbXBfY2FsbF9mdW5jdGlvbl9vbihpdWN2X2RlY2xhcmVfY3B1LCBOVUxMLCAwLCAxLCBjcHUpOworCXByZWVtcHRfZW5hYmxlKCk7CiAJaWYgKGNwdXNfZW1wdHkoaXVjdl9idWZmZXJfY3B1bWFzaykpCiAJCS8qIE5vIGNwdSBjb3VsZCBkZWNsYXJlIGFuIGl1Y3YgYnVmZmVyLiAqLwogCQlnb3RvIG91dF9wYXRoOwpAQCAtNTE5LDcgKzU0Niw2IEBACiAJa2ZyZWUoaXVjdl9wYXRoX3RhYmxlKTsKIH0KIAotI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQogc3RhdGljIGludCBfX2NwdWluaXQgaXVjdl9jcHVfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqc2VsZiwKIAkJCQkgICAgIHVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpoY3B1KQogewpAQCAtNTY1LDcgKzU5MSw2IEBACiBzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGl1Y3ZfY3B1X25vdGlmaWVyID0gewogCS5ub3RpZmllcl9jYWxsID0gaXVjdl9jcHVfbm90aWZ5LAogfTsKLSNlbmRpZgogCiAvKioKICAqIGl1Y3Zfc2V2ZXJfcGF0aGlkCkBAIC01ODYsNDggKzYxMSw0OSBAQAogCXJldHVybiBpdWN2X2NhbGxfYjJmMChJVUNWX1NFVkVSLCBwYXJtKTsKIH0KIAorI2lmZGVmIENPTkZJR19TTVAKIC8qKgotICogX19pdWN2X2NsZWFudXBfcGF0aGlkCisgKiBfX2l1Y3ZfY2xlYW51cF9xdWV1ZQogICogQGR1bW15OiB1bnVzZWQgZHVtbXkgYXJndW1lbnQKICAqCiAgKiBOb3AgZnVuY3Rpb24gY2FsbGVkIHZpYSBzbXBfY2FsbF9mdW5jdGlvbiB0byBmb3JjZSB3b3JrIGl0ZW1zIGZyb20KICAqIHBlbmRpbmcgZXh0ZXJuYWwgaXVjdiBpbnRlcnJ1cHRzIHRvIHRoZSB3b3JrIHF1ZXVlLgogICovCi1zdGF0aWMgdm9pZCBfX2l1Y3ZfY2xlYW51cF9wYXRoaWQodm9pZCAqZHVtbXkpCitzdGF0aWMgdm9pZCBfX2l1Y3ZfY2xlYW51cF9xdWV1ZSh2b2lkICpkdW1teSkKIHsKIH0KKyNlbmRpZgogCiAvKioKLSAqIGl1Y3ZfY2xlYW51cF9wYXRoaWQKLSAqIEBwYXRoaWQ6IDE2IGJpdCBwYXRoaWQKKyAqIGl1Y3ZfY2xlYW51cF9xdWV1ZQogICoKICAqIEZ1bmN0aW9uIGNhbGxlZCBhZnRlciBhIHBhdGggaGFzIGJlZW4gc2V2ZXJlZCB0byBmaW5kIGFsbCByZW1haW5pbmcKICAqIHdvcmsgaXRlbXMgZm9yIHRoZSBub3cgc3RhbGUgcGF0aGlkLiBUaGUgY2FsbGVyIG5lZWRzIHRvIGhvbGQgdGhlCiAgKiBpdWN2X3RhYmxlX2xvY2suCiAgKi8KLXN0YXRpYyB2b2lkIGl1Y3ZfY2xlYW51cF9wYXRoaWQodTE2IHBhdGhpZCkKK3N0YXRpYyB2b2lkIGl1Y3ZfY2xlYW51cF9xdWV1ZSh2b2lkKQogewotCXN0cnVjdCBpdWN2X3dvcmsgKnAsICpuOworCXN0cnVjdCBpdWN2X2lycV9saXN0ICpwLCAqbjsKIAogCS8qCi0JICogUGF0aCBpcyBzZXZlcmVkLCB0aGUgcGF0aGlkIGNhbiBiZSByZXVzZWQgaW1tZWRpYXRseSBvbgotCSAqIGEgaXVjdiBjb25uZWN0IG9yIGEgY29ubmVjdGlvbiBwZW5kaW5nIGludGVycnVwdC4KLQkgKiBpdWN2X3BhdGhfY29ubmVjdCBhbmQgY29ubmVjdGlvbiBwZW5kaW5nIGludGVycnVwdCB3aWxsCi0JICogd2FpdCB1bnRpbCB0aGUgaXVjdl90YWJsZV9sb2NrIGlzIHJlbGVhc2VkIGJlZm9yZSB0aGUKLQkgKiByZWN5Y2xlZCBwYXRoaWQgZW50ZXJzIHRoZSBzeXN0ZW0uCi0JICogRm9yY2UgcmVtYWluaW5nIGludGVycnVwdHMgdG8gdGhlIHdvcmsgcXVldWUsIHRoZW4KLQkgKiBzY2FuIHRoZSB3b3JrIHF1ZXVlIGZvciBpdGVtcyBvZiB0aGlzIHBhdGguCisJICogV2hlbiBhIHBhdGggaXMgc2V2ZXJlZCwgdGhlIHBhdGhpZCBjYW4gYmUgcmV1c2VkIGltbWVkaWF0bHkKKwkgKiBvbiBhIGl1Y3YgY29ubmVjdCBvciBhIGNvbm5lY3Rpb24gcGVuZGluZyBpbnRlcnJ1cHQuIFJlbW92ZQorCSAqIGFsbCBlbnRyaWVzIGZyb20gdGhlIHRhc2sgcXVldWUgdGhhdCByZWZlciB0byBhIHN0YWxlIHBhdGhpZAorCSAqIChpdWN2X3BhdGhfdGFibGVbaXhdID09IE5VTEwpLiBPbmx5IHRoZW4gZG8gdGhlIGl1Y3YgY29ubmVjdAorCSAqIG9yIGRlbGl2ZXIgdGhlIGNvbm5lY3Rpb24gcGVuZGluZyBpbnRlcnJ1cHQuIFRvIGdldCBhbGwgdGhlCisJICogcGVuZGluZyBpbnRlcnJ1cHRzIGZvcmNlIHRoZW0gdG8gdGhlIHdvcmsgcXVldWUgYnkgY2FsbGluZworCSAqIGFuIGVtcHR5IGZ1bmN0aW9uIG9uIGFsbCBjcHVzLgogCSAqLwotCXNtcF9jYWxsX2Z1bmN0aW9uKF9faXVjdl9jbGVhbnVwX3BhdGhpZCwgTlVMTCwgMCwgMSk7Ci0Jc3Bpbl9sb2NrX2lycSgmaXVjdl93b3JrX2xvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwLCBuLCAmaXVjdl93b3JrX3F1ZXVlLCBsaXN0KSB7Ci0JCS8qIFJlbW92ZSB3b3JrIGl0ZW1zIGZvciBwYXRoaWQgZXhjZXB0IGNvbm5lY3Rpb24gcGVuZGluZyAqLwotCQlpZiAocC0+ZGF0YS5pcHBhdGhpZCA9PSBwYXRoaWQgJiYgcC0+ZGF0YS5pcHR5cGUgIT0gMHgwMSkgeworCXNtcF9jYWxsX2Z1bmN0aW9uKF9faXVjdl9jbGVhbnVwX3F1ZXVlLCBOVUxMLCAwLCAxKTsKKwlzcGluX2xvY2tfaXJxKCZpdWN2X3F1ZXVlX2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwLCBuLCAmaXVjdl90YXNrX3F1ZXVlLCBsaXN0KSB7CisJCS8qIFJlbW92ZSBzdGFsZSB3b3JrIGl0ZW1zIGZyb20gdGhlIHRhc2sgcXVldWUuICovCisJCWlmIChpdWN2X3BhdGhfdGFibGVbcC0+ZGF0YS5pcHBhdGhpZF0gPT0gTlVMTCkgewogCQkJbGlzdF9kZWwoJnAtPmxpc3QpOwogCQkJa2ZyZWUocCk7CiAJCX0KIAl9Ci0Jc3Bpbl91bmxvY2tfaXJxKCZpdWN2X3dvcmtfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxKCZpdWN2X3F1ZXVlX2xvY2spOwogfQogCiAvKioKQEAgLTY4Niw3ICs3MTIsNiBAQAogCQlpdWN2X3NldmVyX3BhdGhpZChwLT5wYXRoaWQsIE5VTEwpOwogCQlpdWN2X3BhdGhfdGFibGVbcC0+cGF0aGlkXSA9IE5VTEw7CiAJCWxpc3RfZGVsKCZwLT5saXN0KTsKLQkJaXVjdl9jbGVhbnVwX3BhdGhpZChwLT5wYXRoaWQpOwogCQlpdWN2X3BhdGhfZnJlZShwKTsKIAl9CiAJc3Bpbl91bmxvY2tfYmgoJml1Y3ZfdGFibGVfbG9jayk7CkBAIC03NTksOSArNzg0LDkgQEAKIAl1bmlvbiBpdWN2X3BhcmFtICpwYXJtOwogCWludCByYzsKIAotCXByZWVtcHRfZGlzYWJsZSgpOwotCWlmIChpdWN2X3Rhc2tsZXRfY3B1ICE9IHNtcF9wcm9jZXNzb3JfaWQoKSkKLQkJc3Bpbl9sb2NrX2JoKCZpdWN2X3RhYmxlX2xvY2spOworCUJVR19PTihpbl9hdG9taWMoKSk7CisJc3Bpbl9sb2NrX2JoKCZpdWN2X3RhYmxlX2xvY2spOworCWl1Y3ZfY2xlYW51cF9xdWV1ZSgpOwogCXBhcm0gPSBwZXJjcHVfcHRyKGl1Y3ZfcGFyYW0sIHNtcF9wcm9jZXNzb3JfaWQoKSk7CiAJbWVtc2V0KHBhcm0sIDAsIHNpemVvZih1bmlvbiBpdWN2X3BhcmFtKSk7CiAJcGFybS0+Y3RybC5pcG1zZ2xpbSA9IHBhdGgtPm1zZ2xpbTsKQEAgLTc5Niw5ICs4MjEsNyBAQAogCQkJcmMgPSAtRUlPOwogCQl9CiAJfQotCWlmIChpdWN2X3Rhc2tsZXRfY3B1ICE9IHNtcF9wcm9jZXNzb3JfaWQoKSkKLQkJc3Bpbl91bmxvY2tfYmgoJml1Y3ZfdGFibGVfbG9jayk7Ci0JcHJlZW1wdF9lbmFibGUoKTsKKwlzcGluX3VubG9ja19iaCgmaXVjdl90YWJsZV9sb2NrKTsKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTg2OSwxNSArODkyLDE0IEBACiAKIAogCXByZWVtcHRfZGlzYWJsZSgpOwotCWlmIChpdWN2X3Rhc2tsZXRfY3B1ICE9IHNtcF9wcm9jZXNzb3JfaWQoKSkKKwlpZiAoaXVjdl9hY3RpdmVfY3B1ICE9IHNtcF9wcm9jZXNzb3JfaWQoKSkKIAkJc3Bpbl9sb2NrX2JoKCZpdWN2X3RhYmxlX2xvY2spOwogCXJjID0gaXVjdl9zZXZlcl9wYXRoaWQocGF0aC0+cGF0aGlkLCB1c2VyZGF0YSk7CiAJaWYgKCFyYykgewogCQlpdWN2X3BhdGhfdGFibGVbcGF0aC0+cGF0aGlkXSA9IE5VTEw7CiAJCWxpc3RfZGVsX2luaXQoJnBhdGgtPmxpc3QpOwotCQlpdWN2X2NsZWFudXBfcGF0aGlkKHBhdGgtPnBhdGhpZCk7CiAJfQotCWlmIChpdWN2X3Rhc2tsZXRfY3B1ICE9IHNtcF9wcm9jZXNzb3JfaWQoKSkKKwlpZiAoaXVjdl9hY3RpdmVfY3B1ICE9IHNtcF9wcm9jZXNzb3JfaWQoKSkKIAkJc3Bpbl91bmxvY2tfYmgoJml1Y3ZfdGFibGVfbG9jayk7CiAJcHJlZW1wdF9lbmFibGUoKTsKIAlyZXR1cm4gcmM7CkBAIC0xMjQ2LDggKzEyNjgsNyBAQAogCXN0cnVjdCBpdWN2X3BhdGhfY29tcGxldGUgKmlwYyA9ICh2b2lkICopIGRhdGE7CiAJc3RydWN0IGl1Y3ZfcGF0aCAqcGF0aCA9IGl1Y3ZfcGF0aF90YWJsZVtpcGMtPmlwcGF0aGlkXTsKIAotCUJVR19PTighcGF0aCB8fCAhcGF0aC0+aGFuZGxlcik7Ci0JaWYgKHBhdGgtPmhhbmRsZXItPnBhdGhfY29tcGxldGUpCisJaWYgKHBhdGggJiYgcGF0aC0+aGFuZGxlciAmJiBwYXRoLT5oYW5kbGVyLT5wYXRoX2NvbXBsZXRlKQogCQlwYXRoLT5oYW5kbGVyLT5wYXRoX2NvbXBsZXRlKHBhdGgsIGlwYy0+aXB1c2VyKTsKIH0KIApAQCAtMTI3NSwxNCArMTI5NiwxNCBAQAogCXN0cnVjdCBpdWN2X3BhdGhfc2V2ZXJlZCAqaXBzID0gKHZvaWQgKikgZGF0YTsKIAlzdHJ1Y3QgaXVjdl9wYXRoICpwYXRoID0gaXVjdl9wYXRoX3RhYmxlW2lwcy0+aXBwYXRoaWRdOwogCi0JQlVHX09OKCFwYXRoIHx8ICFwYXRoLT5oYW5kbGVyKTsKKwlpZiAoIXBhdGggfHwgIXBhdGgtPmhhbmRsZXIpCS8qIEFscmVhZHkgc2V2ZXJlZCAqLworCQlyZXR1cm47CiAJaWYgKHBhdGgtPmhhbmRsZXItPnBhdGhfc2V2ZXJlZCkKIAkJcGF0aC0+aGFuZGxlci0+cGF0aF9zZXZlcmVkKHBhdGgsIGlwcy0+aXB1c2VyKTsKIAllbHNlIHsKIAkJaXVjdl9zZXZlcl9wYXRoaWQocGF0aC0+cGF0aGlkLCBOVUxMKTsKIAkJaXVjdl9wYXRoX3RhYmxlW3BhdGgtPnBhdGhpZF0gPSBOVUxMOwogCQlsaXN0X2RlbF9pbml0KCZwYXRoLT5saXN0KTsKLQkJaXVjdl9jbGVhbnVwX3BhdGhpZChwYXRoLT5wYXRoaWQpOwogCQlpdWN2X3BhdGhfZnJlZShwYXRoKTsKIAl9CiB9CkBAIC0xMzExLDggKzEzMzIsNyBAQAogCXN0cnVjdCBpdWN2X3BhdGhfcXVpZXNjZWQgKmlwcSA9ICh2b2lkICopIGRhdGE7CiAJc3RydWN0IGl1Y3ZfcGF0aCAqcGF0aCA9IGl1Y3ZfcGF0aF90YWJsZVtpcHEtPmlwcGF0aGlkXTsKIAotCUJVR19PTighcGF0aCB8fCAhcGF0aC0+aGFuZGxlcik7Ci0JaWYgKHBhdGgtPmhhbmRsZXItPnBhdGhfcXVpZXNjZWQpCisJaWYgKHBhdGggJiYgcGF0aC0+aGFuZGxlciAmJiBwYXRoLT5oYW5kbGVyLT5wYXRoX3F1aWVzY2VkKQogCQlwYXRoLT5oYW5kbGVyLT5wYXRoX3F1aWVzY2VkKHBhdGgsIGlwcS0+aXB1c2VyKTsKIH0KIApAQCAtMTM0MCw4ICsxMzYwLDcgQEAKIAlzdHJ1Y3QgaXVjdl9wYXRoX3Jlc3VtZWQgKmlwciA9ICh2b2lkICopIGRhdGE7CiAJc3RydWN0IGl1Y3ZfcGF0aCAqcGF0aCA9IGl1Y3ZfcGF0aF90YWJsZVtpcHItPmlwcGF0aGlkXTsKIAotCUJVR19PTighcGF0aCB8fCAhcGF0aC0+aGFuZGxlcik7Ci0JaWYgKHBhdGgtPmhhbmRsZXItPnBhdGhfcmVzdW1lZCkKKwlpZiAocGF0aCAmJiBwYXRoLT5oYW5kbGVyICYmIHBhdGgtPmhhbmRsZXItPnBhdGhfcmVzdW1lZCkKIAkJcGF0aC0+aGFuZGxlci0+cGF0aF9yZXN1bWVkKHBhdGgsIGlwci0+aXB1c2VyKTsKIH0KIApAQCAtMTM3Myw4ICsxMzkyLDcgQEAKIAlzdHJ1Y3QgaXVjdl9wYXRoICpwYXRoID0gaXVjdl9wYXRoX3RhYmxlW2ltYy0+aXBwYXRoaWRdOwogCXN0cnVjdCBpdWN2X21lc3NhZ2UgbXNnOwogCi0JQlVHX09OKCFwYXRoIHx8ICFwYXRoLT5oYW5kbGVyKTsKLQlpZiAocGF0aC0+aGFuZGxlci0+bWVzc2FnZV9jb21wbGV0ZSkgeworCWlmIChwYXRoICYmIHBhdGgtPmhhbmRsZXIgJiYgcGF0aC0+aGFuZGxlci0+bWVzc2FnZV9jb21wbGV0ZSkgewogCQltc2cuZmxhZ3MgPSBpbWMtPmlwZmxhZ3MxOwogCQltc2cuaWQgPSBpbWMtPmlwbXNnaWQ7CiAJCW1zZy5hdWRpdCA9IGltYy0+aXBhdWRpdDsKQEAgLTE0MTksOCArMTQzNyw3IEBACiAJc3RydWN0IGl1Y3ZfcGF0aCAqcGF0aCA9IGl1Y3ZfcGF0aF90YWJsZVtpbXAtPmlwcGF0aGlkXTsKIAlzdHJ1Y3QgaXVjdl9tZXNzYWdlIG1zZzsKIAotCUJVR19PTighcGF0aCB8fCAhcGF0aC0+aGFuZGxlcik7Ci0JaWYgKHBhdGgtPmhhbmRsZXItPm1lc3NhZ2VfcGVuZGluZykgeworCWlmIChwYXRoICYmIHBhdGgtPmhhbmRsZXIgJiYgcGF0aC0+aGFuZGxlci0+bWVzc2FnZV9wZW5kaW5nKSB7CiAJCW1zZy5mbGFncyA9IGltcC0+aXBmbGFnczE7CiAJCW1zZy5pZCA9IGltcC0+aXBtc2dpZDsKIAkJbXNnLmNsYXNzID0gaW1wLT5pcHRyZ2NsczsKQEAgLTE0MzUsMTcgKzE0NTIsMTYgQEAKIH0KIAogLyoqCi0gKiBpdWN2X3Rhc2tsZXRfaGFuZGxlcjoKKyAqIGl1Y3ZfdGFza2xldF9mbjoKICAqCiAgKiBUaGlzIHRhc2tsZXQgbG9vcHMgb3ZlciB0aGUgcXVldWUgb2YgaXJxIGJ1ZmZlcnMgY3JlYXRlZCBieQogICogaXVjdl9leHRlcm5hbF9pbnRlcnJ1cHQsIGNhbGxzIHRoZSBhcHByb3ByaWF0ZSBhY3Rpb24gaGFuZGxlcgogICogYW5kIHRoZW4gZnJlZXMgdGhlIGJ1ZmZlci4KICAqLwotc3RhdGljIHZvaWQgaXVjdl90YXNrbGV0X2hhbmRsZXIodW5zaWduZWQgbG9uZyBpZ25vcmVkKQorc3RhdGljIHZvaWQgaXVjdl90YXNrbGV0X2ZuKHVuc2lnbmVkIGxvbmcgaWdub3JlZCkKIHsKIAl0eXBlZGVmIHZvaWQgaXVjdl9pcnFfZm4oc3RydWN0IGl1Y3ZfaXJxX2RhdGEgKik7CiAJc3RhdGljIGl1Y3ZfaXJxX2ZuICppcnFfZm5bXSA9IHsKLQkJWzB4MDFdID0gaXVjdl9wYXRoX3BlbmRpbmcsCiAJCVsweDAyXSA9IGl1Y3ZfcGF0aF9jb21wbGV0ZSwKIAkJWzB4MDNdID0gaXVjdl9wYXRoX3NldmVyZWQsCiAJCVsweDA0XSA9IGl1Y3ZfcGF0aF9xdWllc2NlZCwKQEAgLTE0NTUsMzggKzE0NzEsNzAgQEAKIAkJWzB4MDhdID0gaXVjdl9tZXNzYWdlX3BlbmRpbmcsCiAJCVsweDA5XSA9IGl1Y3ZfbWVzc2FnZV9wZW5kaW5nLAogCX07Ci0Jc3RydWN0IGl1Y3Zfd29yayAqcDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHRhc2tfcXVldWUgPSBMSVNUX0hFQURfSU5JVCh0YXNrX3F1ZXVlKTsKKwlzdHJ1Y3QgaXVjdl9pcnFfbGlzdCAqcCwgKm47CiAKIAkvKiBTZXJpYWxpemUgdGFza2xldCwgaXVjdl9wYXRoX3NldmVyIGFuZCBpdWN2X3BhdGhfY29ubmVjdC4gKi8KIAlzcGluX2xvY2soJml1Y3ZfdGFibGVfbG9jayk7Ci0JaXVjdl90YXNrbGV0X2NwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwlpdWN2X2FjdGl2ZV9jcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAKLQlzcGluX2xvY2tfaXJxKCZpdWN2X3dvcmtfbG9jayk7Ci0Jd2hpbGUgKCFsaXN0X2VtcHR5KCZpdWN2X3dvcmtfcXVldWUpKSB7Ci0JCXAgPSBsaXN0X2VudHJ5KGl1Y3Zfd29ya19xdWV1ZS5uZXh0LCBzdHJ1Y3QgaXVjdl93b3JrLCBsaXN0KTsKKwlzcGluX2xvY2tfaXJxKCZpdWN2X3F1ZXVlX2xvY2spOworCWxpc3Rfc3BsaWNlX2luaXQoJml1Y3ZfdGFza19xdWV1ZSwgJnRhc2tfcXVldWUpOworCXNwaW5fdW5sb2NrX2lycSgmaXVjdl9xdWV1ZV9sb2NrKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwLCBuLCAmdGFza19xdWV1ZSwgbGlzdCkgewogCQlsaXN0X2RlbF9pbml0KCZwLT5saXN0KTsKLQkJc3Bpbl91bmxvY2tfaXJxKCZpdWN2X3dvcmtfbG9jayk7CiAJCWlycV9mbltwLT5kYXRhLmlwdHlwZV0oJnAtPmRhdGEpOwogCQlrZnJlZShwKTsKLQkJc3Bpbl9sb2NrX2lycSgmaXVjdl93b3JrX2xvY2spOwogCX0KLQlzcGluX3VubG9ja19pcnEoJml1Y3Zfd29ya19sb2NrKTsKIAotCWl1Y3ZfdGFza2xldF9jcHUgPSAtMTsKKwlpdWN2X2FjdGl2ZV9jcHUgPSAtMTsKIAlzcGluX3VubG9jaygmaXVjdl90YWJsZV9sb2NrKTsKIH0KIAogLyoqCisgKiBpdWN2X3dvcmtfZm46CisgKgorICogVGhpcyB3b3JrIGZ1bmN0aW9uIGxvb3BzIG92ZXIgdGhlIHF1ZXVlIG9mIHBhdGggcGVuZGluZyBpcnEgYmxvY2tzCisgKiBjcmVhdGVkIGJ5IGl1Y3ZfZXh0ZXJuYWxfaW50ZXJydXB0LCBjYWxscyB0aGUgYXBwcm9wcmlhdGUgYWN0aW9uCisgKiBoYW5kbGVyIGFuZCB0aGVuIGZyZWVzIHRoZSBidWZmZXIuCisgKi8KK3N0YXRpYyB2b2lkIGl1Y3Zfd29ya19mbihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJdHlwZWRlZiB2b2lkIGl1Y3ZfaXJxX2ZuKHN0cnVjdCBpdWN2X2lycV9kYXRhICopOworCXN0cnVjdCBsaXN0X2hlYWQgd29ya19xdWV1ZSA9IExJU1RfSEVBRF9JTklUKHdvcmtfcXVldWUpOworCXN0cnVjdCBpdWN2X2lycV9saXN0ICpwLCAqbjsKKworCS8qIFNlcmlhbGl6ZSB0YXNrbGV0LCBpdWN2X3BhdGhfc2V2ZXIgYW5kIGl1Y3ZfcGF0aF9jb25uZWN0LiAqLworCXNwaW5fbG9ja19iaCgmaXVjdl90YWJsZV9sb2NrKTsKKwlpdWN2X2FjdGl2ZV9jcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisKKwlzcGluX2xvY2tfaXJxKCZpdWN2X3F1ZXVlX2xvY2spOworCWxpc3Rfc3BsaWNlX2luaXQoJml1Y3Zfd29ya19xdWV1ZSwgJndvcmtfcXVldWUpOworCXNwaW5fdW5sb2NrX2lycSgmaXVjdl9xdWV1ZV9sb2NrKTsKKworCWl1Y3ZfY2xlYW51cF9xdWV1ZSgpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwLCBuLCAmd29ya19xdWV1ZSwgbGlzdCkgeworCQlsaXN0X2RlbF9pbml0KCZwLT5saXN0KTsKKwkJaXVjdl9wYXRoX3BlbmRpbmcoJnAtPmRhdGEpOworCQlrZnJlZShwKTsKKwl9CisKKwlpdWN2X2FjdGl2ZV9jcHUgPSAtMTsKKwlzcGluX3VubG9ja19iaCgmaXVjdl90YWJsZV9sb2NrKTsKK30KKworLyoqCiAgKiBpdWN2X2V4dGVybmFsX2ludGVycnVwdAogICogQGNvZGU6IGlycSBjb2RlCiAgKgogICogSGFuZGxlcyBleHRlcm5hbCBpbnRlcnJ1cHRzIGNvbWluZyBpbiBmcm9tIENQLgotICogUGxhY2VzIHRoZSBpbnRlcnJ1cHQgYnVmZmVyIG9uIGEgcXVldWUgYW5kIHNjaGVkdWxlcyBpdWN2X3Rhc2tsZXRfaGFuZGxlcigpLgorICogUGxhY2VzIHRoZSBpbnRlcnJ1cHQgYnVmZmVyIG9uIGEgcXVldWUgYW5kIHNjaGVkdWxlcyBpdWN2X3Rhc2tsZXRfZm4oKS4KICAqLwogc3RhdGljIHZvaWQgaXVjdl9leHRlcm5hbF9pbnRlcnJ1cHQodTE2IGNvZGUpCiB7CiAJc3RydWN0IGl1Y3ZfaXJxX2RhdGEgKnA7Ci0Jc3RydWN0IGl1Y3Zfd29yayAqd29yazsKKwlzdHJ1Y3QgaXVjdl9pcnFfbGlzdCAqd29yazsKIAogCXAgPSBwZXJjcHVfcHRyKGl1Y3ZfaXJxX2RhdGEsIHNtcF9wcm9jZXNzb3JfaWQoKSk7CiAJaWYgKHAtPmlwcGF0aGlkID49IGl1Y3ZfbWF4X3BhdGhpZCkgewpAQCAtMTUwMCwxNiArMTU0OCwyMyBAQAogCQlwcmludGsoS0VSTl9FUlIgIml1Y3ZfZG9faW50OiB1bmtub3duIGl1Y3YgaW50ZXJydXB0XG4iKTsKIAkJcmV0dXJuOwogCX0KLQl3b3JrID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGl1Y3Zfd29yayksIEdGUF9BVE9NSUMpOworCXdvcmsgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaXVjdl9pcnFfbGlzdCksIEdGUF9BVE9NSUMpOwogCWlmICghd29yaykgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJpdWN2X2V4dGVybmFsX2ludGVycnVwdDogb3V0IG9mIG1lbW9yeVxuIik7CiAJCXJldHVybjsKIAl9CiAJbWVtY3B5KCZ3b3JrLT5kYXRhLCBwLCBzaXplb2Yod29yay0+ZGF0YSkpOwotCXNwaW5fbG9jaygmaXVjdl93b3JrX2xvY2spOwotCWxpc3RfYWRkX3RhaWwoJndvcmstPmxpc3QsICZpdWN2X3dvcmtfcXVldWUpOwotCXNwaW5fdW5sb2NrKCZpdWN2X3dvcmtfbG9jayk7Ci0JdGFza2xldF9zY2hlZHVsZSgmaXVjdl90YXNrbGV0KTsKKwlzcGluX2xvY2soJml1Y3ZfcXVldWVfbG9jayk7CisJaWYgKHAtPmlwdHlwZSA9PSAweDAxKSB7CisJCS8qIFBhdGggcGVuZGluZyBpbnRlcnJ1cHQuICovCisJCWxpc3RfYWRkX3RhaWwoJndvcmstPmxpc3QsICZpdWN2X3dvcmtfcXVldWUpOworCQlzY2hlZHVsZV93b3JrKCZpdWN2X3dvcmspOworCX0gZWxzZSB7CisJCS8qIFRoZSBvdGhlciBpbnRlcnJ1cHRzLiAqLworCQlsaXN0X2FkZF90YWlsKCZ3b3JrLT5saXN0LCAmaXVjdl90YXNrX3F1ZXVlKTsKKwkJdGFza2xldF9zY2hlZHVsZSgmaXVjdl90YXNrbGV0KTsKKwl9CisJc3Bpbl91bmxvY2soJml1Y3ZfcXVldWVfbG9jayk7CiB9CiAKIC8qKgpAQCAtMTU3OSwxMiArMTYzNCwxNCBAQAogICovCiBzdGF0aWMgdm9pZCBpdWN2X2V4aXQodm9pZCkKIHsKLQlzdHJ1Y3QgaXVjdl93b3JrICpwLCAqbjsKKwlzdHJ1Y3QgaXVjdl9pcnFfbGlzdCAqcCwgKm47CiAKLQlzcGluX2xvY2tfaXJxKCZpdWN2X3dvcmtfbG9jayk7CisJc3Bpbl9sb2NrX2lycSgmaXVjdl9xdWV1ZV9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocCwgbiwgJml1Y3ZfdGFza19xdWV1ZSwgbGlzdCkKKwkJa2ZyZWUocCk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHAsIG4sICZpdWN2X3dvcmtfcXVldWUsIGxpc3QpCiAJCWtmcmVlKHApOwotCXNwaW5fdW5sb2NrX2lycSgmaXVjdl93b3JrX2xvY2spOworCXNwaW5fdW5sb2NrX2lycSgmaXVjdl9xdWV1ZV9sb2NrKTsKIAl1bnJlZ2lzdGVyX2hvdGNwdV9ub3RpZmllcigmaXVjdl9jcHVfbm90aWZpZXIpOwogCXBlcmNwdV9mcmVlKGl1Y3ZfcGFyYW0pOwogCXBlcmNwdV9mcmVlKGl1Y3ZfaXJxX2RhdGEpOwpkaWZmIC0tZ2l0IGEvbmV0L2tleS9hZl9rZXkuYyBiL25ldC9rZXkvYWZfa2V5LmMKaW5kZXggMzQ1MDE5My4uYTk5NDQ0MSAxMDA2NDQKLS0tIGEvbmV0L2tleS9hZl9rZXkuYworKysgYi9uZXQva2V5L2FmX2tleS5jCkBAIC0zNzksNyArMzc5LDcgQEAKIAkJICovCiAJCXJldHVybiAtRUlOVkFMOwogCQlicmVhazsKLQl9OworCX0KIAogCXJldHVybiAwOwogfQpAQCAtMzY2Nyw3ICszNjY3LDcgQEAKIAkJY29waWVkID0gbGVuOwogCX0KIAotCXNrYi0+aC5yYXcgPSBza2ItPmRhdGE7CisJc2tiX3Jlc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKIAllcnIgPSBza2JfY29weV9kYXRhZ3JhbV9pb3ZlYyhza2IsIDAsIG1zZy0+bXNnX2lvdiwgY29waWVkKTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dF9mcmVlOwpkaWZmIC0tZ2l0IGEvbmV0L2xsYy9sbGNfaW5wdXQuYyBiL25ldC9sbGMvbGxjX2lucHV0LmMKaW5kZXggYjNmNjVkMS4uMDk5ZWQ4ZiAxMDA2NDQKLS0tIGEvbmV0L2xsYy9sbGNfaW5wdXQuYworKysgYi9uZXQvbGxjL2xsY19pbnB1dC5jCkBAIC0xMTIsNyArMTEyLDcgQEAKIAlpZiAodW5saWtlbHkoIXBza2JfbWF5X3B1bGwoc2tiLCBsbGNfbGVuKSkpCiAJCXJldHVybiAwOwogCi0Jc2tiLT5oLnJhdyArPSBsbGNfbGVuOworCXNrYi0+dHJhbnNwb3J0X2hlYWRlciArPSBsbGNfbGVuOwogCXNrYl9wdWxsKHNrYiwgbGxjX2xlbik7CiAJaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfODAyXzIpKSB7CiAJCV9fYmUxNiBwZHVsZW4gPSBldGhfaGRyKHNrYiktPmhfcHJvdG87CmRpZmYgLS1naXQgYS9uZXQvbGxjL2xsY19vdXRwdXQuYyBiL25ldC9sbGMvbGxjX291dHB1dC5jCmluZGV4IGY0MjkxZjMuLjc1NGY0ZmUgMTAwNjQ0Ci0tLSBhL25ldC9sbGMvbGxjX291dHB1dC5jCisrKyBiL25ldC9sbGMvbGxjX291dHB1dC5jCkBAIC00MSw3ICs0MSw4IEBACiAJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBza2ItPmRldjsKIAkJc3RydWN0IHRyaF9oZHIgKnRyaDsKIAotCQlza2ItPm1hYy5yYXcgPSBza2JfcHVzaChza2IsIHNpemVvZigqdHJoKSk7CisJCXNrYl9wdXNoKHNrYiwgc2l6ZW9mKCp0cmgpKTsKKwkJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKIAkJdHJoID0gdHJfaGRyKHNrYik7CiAJCXRyaC0+YWMgPSBBQzsKIAkJdHJoLT5mYyA9IExMQ19GUkFNRTsKQEAgLTUyLDcgKzUzLDcgQEAKIAkJaWYgKGRhKSB7CiAJCQltZW1jcHkodHJoLT5kYWRkciwgZGEsIGRldi0+YWRkcl9sZW4pOwogCQkJdHJfc291cmNlX3JvdXRlKHNrYiwgdHJoLCBkZXYpOwotCQkJc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOworCQkJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKIAkJfQogCQlicmVhazsKIAl9CkBAIC02Miw3ICs2Myw4IEBACiAJCXVuc2lnbmVkIHNob3J0IGxlbiA9IHNrYi0+bGVuOwogCQlzdHJ1Y3QgZXRoaGRyICpldGg7CiAKLQkJc2tiLT5tYWMucmF3ID0gc2tiX3B1c2goc2tiLCBzaXplb2YoKmV0aCkpOworCQlza2JfcHVzaChza2IsIHNpemVvZigqZXRoKSk7CisJCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CiAJCWV0aCA9IGV0aF9oZHIoc2tiKTsKIAkJZXRoLT5oX3Byb3RvID0gaHRvbnMobGVuKTsKIAkJbWVtY3B5KGV0aC0+aF9kZXN0LCBkYSwgRVRIX0FMRU4pOwpkaWZmIC0tZ2l0IGEvbmV0L2xsYy9sbGNfc2FwLmMgYi9uZXQvbGxjL2xsY19zYXAuYwppbmRleCAyNjE1ZGM4Li4yNTI1MTY1IDEwMDY0NAotLS0gYS9uZXQvbGxjL2xsY19zYXAuYworKysgYi9uZXQvbGxjL2xsY19zYXAuYwpAQCAtMzYsMTEgKzM2LDEyIEBACiAJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGFsbG9jX3NrYigxMjgsIEdGUF9BVE9NSUMpOwogCiAJaWYgKHNrYikgeworCQlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwogCQlza2JfcmVzZXJ2ZShza2IsIDUwKTsKLQkJc2tiLT5uaC5yYXcgICA9IHNrYi0+aC5yYXcgPSBza2ItPmRhdGE7CisJCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOworCQlza2JfcmVzZXRfdHJhbnNwb3J0X2hlYWRlcihza2IpOwogCQlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfODAyXzIpOwogCQlza2ItPmRldiAgICAgID0gZGV2OwotCQlza2ItPm1hYy5yYXcgID0gc2tiLT5oZWFkOwogCQlpZiAoc2sgIT0gTlVMTCkKIAkJCXNrYl9zZXRfb3duZXJfdyhza2IsIHNrKTsKIAl9CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL0tjb25maWcgYi9uZXQvbmV0ZmlsdGVyL0tjb25maWcKaW5kZXggNTQ2OThhZi4uYzU1OGYzMiAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9LY29uZmlnCisrKyBiL25ldC9uZXRmaWx0ZXIvS2NvbmZpZwpAQCAtMjUsNiArMjUsNyBAQAogCSAgYW5kIGlzIGFsc28gc2NoZWR1bGVkIHRvIHJlcGxhY2UgdGhlIG9sZCBzeXNsb2ctYmFzZWQgaXB0X0xPRwogCSAgYW5kIGlwNnRfTE9HIG1vZHVsZXMuCiAKKyMgUmVuYW1lIHRoaXMgdG8gTkZfQ09OTlRSQUNLIGluIGEgMi42LjI1CiBjb25maWcgTkZfQ09OTlRSQUNLX0VOQUJMRUQKIAl0cmlzdGF0ZSAiTmV0ZmlsdGVyIGNvbm5lY3Rpb24gdHJhY2tpbmcgc3VwcG9ydCIKIAloZWxwCkBAIC0zOSw0MiArNDAsOSBAQAogCiAJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KIAotY2hvaWNlCi0JcHJvbXB0ICJOZXRmaWx0ZXIgY29ubmVjdGlvbiB0cmFja2luZyBzdXBwb3J0IgotCWRlcGVuZHMgb24gTkZfQ09OTlRSQUNLX0VOQUJMRUQKLQotY29uZmlnIE5GX0NPTk5UUkFDS19TVVBQT1JUCi0JYm9vbCAiTGF5ZXIgMyBJbmRlcGVuZGVudCBDb25uZWN0aW9uIHRyYWNraW5nIgotCWhlbHAKLQkgIExheWVyIDMgaW5kZXBlbmRlbnQgY29ubmVjdGlvbiB0cmFja2luZyBpcyBleHBlcmltZW50YWwgc2NoZW1lCi0JICB3aGljaCBnZW5lcmFsaXplIGlwX2Nvbm50cmFjayB0byBzdXBwb3J0IG90aGVyIGxheWVyIDMgcHJvdG9jb2xzLgotCi0JICBUaGlzIGlzIHJlcXVpcmVkIHRvIGRvIE1hc3F1ZXJhZGluZyBvciBvdGhlciBraW5kcyBvZiBOZXR3b3JrCi0JICBBZGRyZXNzIFRyYW5zbGF0aW9uIChleGNlcHQgZm9yIEZhc3QgTkFUKS4gIEl0IGNhbiBhbHNvIGJlIHVzZWQgdG8KLQkgIGVuaGFuY2UgcGFja2V0IGZpbHRlcmluZyAoc2VlIGBDb25uZWN0aW9uIHN0YXRlIG1hdGNoIHN1cHBvcnQnCi0JICBiZWxvdykuCi0KLWNvbmZpZyBJUF9ORl9DT05OVFJBQ0tfU1VQUE9SVAotCWJvb2wgIkxheWVyIDMgRGVwZW5kZW50IENvbm5lY3Rpb24gdHJhY2tpbmcgKE9CU09MRVRFKSIKLQloZWxwCi0JICBUaGUgb2xkLCBMYXllciAzIGRlcGVuZGVudCBpcF9jb25udHJhY2sgc3Vic3lzdGVtIG9mIG5ldGZpbHRlci4KLQotCSAgVGhpcyBpcyByZXF1aXJlZCB0byBkbyBNYXNxdWVyYWRpbmcgb3Igb3RoZXIga2luZHMgb2YgTmV0d29yawotCSAgQWRkcmVzcyBUcmFuc2xhdGlvbiAoZXhjZXB0IGZvciBGYXN0IE5BVCkuICBJdCBjYW4gYWxzbyBiZSB1c2VkIHRvCi0JICBlbmhhbmNlIHBhY2tldCBmaWx0ZXJpbmcgKHNlZSBgQ29ubmVjdGlvbiBzdGF0ZSBtYXRjaCBzdXBwb3J0JwotCSAgYmVsb3cpLgotCi1lbmRjaG9pY2UKLQogY29uZmlnIE5GX0NPTk5UUkFDSwogCXRyaXN0YXRlCi0JZGVmYXVsdCBtIGlmIE5GX0NPTk5UUkFDS19TVVBQT1JUICYmIE5GX0NPTk5UUkFDS19FTkFCTEVEPW0KLQlkZWZhdWx0IHkgaWYgTkZfQ09OTlRSQUNLX1NVUFBPUlQgJiYgTkZfQ09OTlRSQUNLX0VOQUJMRUQ9eQotCi1jb25maWcgSVBfTkZfQ09OTlRSQUNLCi0JdHJpc3RhdGUKLQlkZWZhdWx0IG0gaWYgSVBfTkZfQ09OTlRSQUNLX1NVUFBPUlQgJiYgTkZfQ09OTlRSQUNLX0VOQUJMRUQ9bQotCWRlZmF1bHQgeSBpZiBJUF9ORl9DT05OVFJBQ0tfU1VQUE9SVCAmJiBORl9DT05OVFJBQ0tfRU5BQkxFRD15CisJZGVmYXVsdCBORl9DT05OVFJBQ0tfRU5BQkxFRAogCiBjb25maWcgTkZfQ1RfQUNDVAogCWJvb2wgIkNvbm5lY3Rpb24gdHJhY2tpbmcgZmxvdyBhY2NvdW50aW5nIgpAQCAtMzAzLDkgKzI3MSw4IEBACiAJdHJpc3RhdGUgICciQ09OTk1BUksiIHRhcmdldCBzdXBwb3J0JwogCWRlcGVuZHMgb24gTkVURklMVEVSX1hUQUJMRVMKIAlkZXBlbmRzIG9uIElQX05GX01BTkdMRSB8fCBJUDZfTkZfTUFOR0xFCi0JZGVwZW5kcyBvbiBJUF9ORl9DT05OVFJBQ0sgfHwgTkZfQ09OTlRSQUNLCi0Jc2VsZWN0IElQX05GX0NPTk5UUkFDS19NQVJLIGlmIElQX05GX0NPTk5UUkFDSwotCXNlbGVjdCBORl9DT05OVFJBQ0tfTUFSSyBpZiBORl9DT05OVFJBQ0sKKwlkZXBlbmRzIG9uIE5GX0NPTk5UUkFDSworCXNlbGVjdCBORl9DT05OVFJBQ0tfTUFSSwogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGFkZHMgYSBgQ09OTk1BUksnIHRhcmdldCwgd2hpY2ggYWxsb3dzIG9uZSB0byBtYW5pcHVsYXRlCiAJICB0aGUgY29ubmVjdGlvbiBtYXJrIHZhbHVlLiAgU2ltaWxhciB0byB0aGUgTUFSSyB0YXJnZXQsIGJ1dApAQCAtMzY2LDcgKzMzMyw3IEBACiAJdHJpc3RhdGUgICciTk9UUkFDSyIgdGFyZ2V0IHN1cHBvcnQnCiAJZGVwZW5kcyBvbiBORVRGSUxURVJfWFRBQkxFUwogCWRlcGVuZHMgb24gSVBfTkZfUkFXIHx8IElQNl9ORl9SQVcKLQlkZXBlbmRzIG9uIElQX05GX0NPTk5UUkFDSyB8fCBORl9DT05OVFJBQ0sKKwlkZXBlbmRzIG9uIE5GX0NPTk5UUkFDSwogCWhlbHAKIAkgIFRoZSBOT1RSQUNLIHRhcmdldCBhbGxvd3MgYSBzZWxlY3QgcnVsZSB0byBzcGVjaWZ5CiAJICB3aGljaCBwYWNrZXRzICpub3QqIHRvIGVudGVyIHRoZSBjb25udHJhY2svTkFUCkBAIC0zODcsOSArMzU0LDcgQEAKIAogY29uZmlnIE5FVEZJTFRFUl9YVF9UQVJHRVRfQ09OTlNFQ01BUksKIAl0cmlzdGF0ZSAnIkNPTk5TRUNNQVJLIiB0YXJnZXQgc3VwcG9ydCcKLQlkZXBlbmRzIG9uIE5FVEZJTFRFUl9YVEFCTEVTICYmIFwKLQkJICAgKChORl9DT05OVFJBQ0sgJiYgTkZfQ09OTlRSQUNLX1NFQ01BUkspIHx8IFwKLQkJICAgIChJUF9ORl9DT05OVFJBQ0sgJiYgSVBfTkZfQ09OTlRSQUNLX1NFQ01BUkspKQorCWRlcGVuZHMgb24gTkVURklMVEVSX1hUQUJMRVMgJiYgTkZfQ09OTlRSQUNLICYmIE5GX0NPTk5UUkFDS19TRUNNQVJLCiAJaGVscAogCSAgVGhlIENPTk5TRUNNQVJLIHRhcmdldCBjb3BpZXMgc2VjdXJpdHkgbWFya2luZ3MgZnJvbSBwYWNrZXRzCiAJICB0byBjb25uZWN0aW9ucywgYW5kIHJlc3RvcmVzIHNlY3VyaXR5IG1hcmtpbmdzIGZyb20gY29ubmVjdGlvbnMKQEAgLTQzNyw5ICs0MDIsOCBAQAogY29uZmlnIE5FVEZJTFRFUl9YVF9NQVRDSF9DT05OQllURVMKIAl0cmlzdGF0ZSAgJyJjb25uYnl0ZXMiIHBlci1jb25uZWN0aW9uIGNvdW50ZXIgbWF0Y2ggc3VwcG9ydCcKIAlkZXBlbmRzIG9uIE5FVEZJTFRFUl9YVEFCTEVTCi0JZGVwZW5kcyBvbiBJUF9ORl9DT05OVFJBQ0sgfHwgTkZfQ09OTlRSQUNLCi0Jc2VsZWN0IElQX05GX0NUX0FDQ1QgaWYgSVBfTkZfQ09OTlRSQUNLCi0Jc2VsZWN0IE5GX0NUX0FDQ1QgaWYgTkZfQ09OTlRSQUNLCisJZGVwZW5kcyBvbiBORl9DT05OVFJBQ0sKKwlzZWxlY3QgTkZfQ1RfQUNDVAogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGFkZHMgYSBgY29ubmJ5dGVzJyBtYXRjaCwgd2hpY2ggYWxsb3dzIHlvdSB0byBtYXRjaCB0aGUKIAkgIG51bWJlciBvZiBieXRlcyBhbmQvb3IgcGFja2V0cyBmb3IgZWFjaCBkaXJlY3Rpb24gd2l0aGluIGEgY29ubmVjdGlvbi4KQEAgLTQ1MCw5ICs0MTQsOCBAQAogY29uZmlnIE5FVEZJTFRFUl9YVF9NQVRDSF9DT05OTUFSSwogCXRyaXN0YXRlICAnImNvbm5tYXJrIiBjb25uZWN0aW9uIG1hcmsgbWF0Y2ggc3VwcG9ydCcKIAlkZXBlbmRzIG9uIE5FVEZJTFRFUl9YVEFCTEVTCi0JZGVwZW5kcyBvbiBJUF9ORl9DT05OVFJBQ0sgfHwgTkZfQ09OTlRSQUNLCi0Jc2VsZWN0IElQX05GX0NPTk5UUkFDS19NQVJLIGlmIElQX05GX0NPTk5UUkFDSwotCXNlbGVjdCBORl9DT05OVFJBQ0tfTUFSSyBpZiBORl9DT05OVFJBQ0sKKwlkZXBlbmRzIG9uIE5GX0NPTk5UUkFDSworCXNlbGVjdCBORl9DT05OVFJBQ0tfTUFSSwogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGFkZHMgYSBgY29ubm1hcmsnIG1hdGNoLCB3aGljaCBhbGxvd3MgeW91IHRvIG1hdGNoIHRoZQogCSAgY29ubmVjdGlvbiBtYXJrIHZhbHVlIHByZXZpb3VzbHkgc2V0IGZvciB0aGUgc2Vzc2lvbiBieSBgQ09OTk1BUksnLiAKQEAgLTQ2NCw3ICs0MjcsNyBAQAogY29uZmlnIE5FVEZJTFRFUl9YVF9NQVRDSF9DT05OVFJBQ0sKIAl0cmlzdGF0ZSAnImNvbm50cmFjayIgY29ubmVjdGlvbiB0cmFja2luZyBtYXRjaCBzdXBwb3J0JwogCWRlcGVuZHMgb24gTkVURklMVEVSX1hUQUJMRVMKLQlkZXBlbmRzIG9uIElQX05GX0NPTk5UUkFDSyB8fCBORl9DT05OVFJBQ0sKKwlkZXBlbmRzIG9uIE5GX0NPTk5UUkFDSwogCWhlbHAKIAkgIFRoaXMgaXMgYSBnZW5lcmFsIGNvbm50cmFjayBtYXRjaCBtb2R1bGUsIGEgc3VwZXJzZXQgb2YgdGhlIHN0YXRlIG1hdGNoLgogCkBAIC01MDgsNyArNDcxLDcgQEAKIGNvbmZpZyBORVRGSUxURVJfWFRfTUFUQ0hfSEVMUEVSCiAJdHJpc3RhdGUgJyJoZWxwZXIiIG1hdGNoIHN1cHBvcnQnCiAJZGVwZW5kcyBvbiBORVRGSUxURVJfWFRBQkxFUwotCWRlcGVuZHMgb24gSVBfTkZfQ09OTlRSQUNLIHx8IE5GX0NPTk5UUkFDSworCWRlcGVuZHMgb24gTkZfQ09OTlRSQUNLCiAJaGVscAogCSAgSGVscGVyIG1hdGNoaW5nIGFsbG93cyB5b3UgdG8gbWF0Y2ggcGFja2V0cyBpbiBkeW5hbWljIGNvbm5lY3Rpb25zCiAJICB0cmFja2VkIGJ5IGEgY29ubnRyYWNrLWhlbHBlciwgaWUuIGlwX2Nvbm50cmFja19mdHAKQEAgLTYzMiw3ICs1OTUsNyBAQAogY29uZmlnIE5FVEZJTFRFUl9YVF9NQVRDSF9TVEFURQogCXRyaXN0YXRlICcic3RhdGUiIG1hdGNoIHN1cHBvcnQnCiAJZGVwZW5kcyBvbiBORVRGSUxURVJfWFRBQkxFUwotCWRlcGVuZHMgb24gSVBfTkZfQ09OTlRSQUNLIHx8IE5GX0NPTk5UUkFDSworCWRlcGVuZHMgb24gTkZfQ09OTlRSQUNLCiAJaGVscAogCSAgQ29ubmVjdGlvbiBzdGF0ZSBtYXRjaGluZyBhbGxvd3MgeW91IHRvIG1hdGNoIHBhY2tldHMgYmFzZWQgb24gdGhlaXIKIAkgIHJlbGF0aW9uc2hpcCB0byBhIHRyYWNrZWQgY29ubmVjdGlvbiAoaWUuIHByZXZpb3VzIHBhY2tldHMpLiAgVGhpcwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9jb3JlLmMgYi9uZXQvbmV0ZmlsdGVyL2NvcmUuYwppbmRleCBjM2ViZGJkLi5hODQ0NzhlIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL2NvcmUuYworKysgYi9uZXQvbmV0ZmlsdGVyL2NvcmUuYwpAQCAtNSwxMCArNSw2IEBACiAgKiB3YXkuCiAgKgogICogUnVzdHkgUnVzc2VsbCAoQykyMDAwIC0tIFRoaXMgY29kZSBpcyBHUEwuCi0gKgotICogRmVicnVhcnkgMjAwMDogTW9kaWZpZWQgYnkgSmFtZXMgTW9ycmlzIHRvIGhhdmUgMSBxdWV1ZSBwZXIgcHJvdG9jb2wuCi0gKiAxNS1NYXItMjAwMDogICBBZGRlZCBORl9SRVBFQVQgLS1SUi4KLSAqIDA4LU1heS0yMDAzOgkgIEludGVybmFsIGxvZ2dpbmcgaW50ZXJmYWNlIGFkZGVkIGJ5IEpvenNlZiBLYWRsZWNzaWsuCiAgKi8KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KQEAgLTI0NCw2ICsyNDAsNyBAQAogfQogRVhQT1JUX1NZTUJPTChuZl9wcm90b19jc3VtX3JlcGxhY2U0KTsKIAorI2lmIGRlZmluZWQoQ09ORklHX05GX0NPTk5UUkFDSykgfHwgZGVmaW5lZChDT05GSUdfTkZfQ09OTlRSQUNLX01PRFVMRSkKIC8qIFRoaXMgZG9lcyBub3QgYmVsb25nIGhlcmUsIGJ1dCBsb2NhbGx5IGdlbmVyYXRlZCBlcnJvcnMgbmVlZCBpdCBpZiBjb25uZWN0aW9uCiAgICB0cmFja2luZyBpbiB1c2U6IHdpdGhvdXQgdGhpcywgY29ubmVjdGlvbiBtYXkgbm90IGJlIGluIGhhc2ggdGFibGUsIGFuZCBoZW5jZQogICAgbWFudWZhY3R1cmVkIElDTVAgb3IgUlNUIHBhY2tldHMgd2lsbCBub3QgYmUgYXNzb2NpYXRlZCB3aXRoIGl0LiAqLwpAQCAtMjY0LDYgKzI2MSwyMiBAQAogfQogRVhQT1JUX1NZTUJPTChuZl9jdF9hdHRhY2gpOwogCit2b2lkICgqbmZfY3RfZGVzdHJveSkoc3RydWN0IG5mX2Nvbm50cmFjayAqKTsKK0VYUE9SVF9TWU1CT0wobmZfY3RfZGVzdHJveSk7CisKK3ZvaWQgbmZfY29ubnRyYWNrX2Rlc3Ryb3koc3RydWN0IG5mX2Nvbm50cmFjayAqbmZjdCkKK3sKKwl2b2lkICgqZGVzdHJveSkoc3RydWN0IG5mX2Nvbm50cmFjayAqKTsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlkZXN0cm95ID0gcmN1X2RlcmVmZXJlbmNlKG5mX2N0X2Rlc3Ryb3kpOworCUJVR19PTihkZXN0cm95ID09IE5VTEwpOworCWRlc3Ryb3kobmZjdCk7CisJcmN1X3JlYWRfdW5sb2NrKCk7Cit9CitFWFBPUlRfU1lNQk9MKG5mX2Nvbm50cmFja19kZXN0cm95KTsKKyNlbmRpZiAvKiBDT05GSUdfTkZfQ09OTlRSQUNLICovCisKICNpZmRlZiBDT05GSUdfUFJPQ19GUwogc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX25ldF9uZXRmaWx0ZXI7CiBFWFBPUlRfU1lNQk9MKHByb2NfbmV0X25ldGZpbHRlcik7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb3JlLmMgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb3JlLmMKaW5kZXggYjNhNzBlYi4uZTEzMmM4YSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29yZS5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvcmUuYwpAQCAtOSwyNCArOSw2IEBACiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIDIzIEFwciAyMDAxOiBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgotICoJLSBuZXcgQVBJIGFuZCBoYW5kbGluZyBvZiBjb25udHJhY2svbmF0IGhlbHBlcnMKLSAqCS0gbm93IGNhcGFibGUgb2YgbXVsdGlwbGUgZXhwZWN0YXRpb25zIGZvciBvbmUgbWFzdGVyCi0gKiAxNiBKdWwgMjAwMjogSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KLSAqCS0gYWRkIHVzYWdlL3JlZmVyZW5jZSBjb3VudHMgdG8gaXBfY29ubnRyYWNrX2V4cGVjdAotICoJLSBleHBvcnQgaXBfY29ubnRyYWNrW19leHBlY3RdX3tmaW5kX2dldCxwdXR9IGZ1bmN0aW9ucwotICogMTYgRGVjIDIwMDM6IFlhc3V5dWtpIEtvemFrYWkgQFVTQUdJIDx5YXN1eXVraS5rb3pha2FpQHRvc2hpYmEuY28uanA+Ci0gKgktIGdlbmVyYWxpemUgTDMgcHJvdG9jb2wgZGVuZW5kZW50IHBhcnQuCi0gKiAyMyBNYXIgMjAwNDogWWFzdXl1a2kgS296YWthaSBAVVNBR0kgPHlhc3V5dWtpLmtvemFrYWlAdG9zaGliYS5jby5qcD4KLSAqCS0gYWRkIHN1cHBvcnQgdmFyaW91cyBzaXplIG9mIGNvbm50cmFjayBzdHJ1Y3R1cmVzLgotICogMjYgSmFuIDIwMDY6IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBuZXRmaWx0ZXIub3JnPgotICogCS0gcmVzdHJ1Y3R1cmUgbmZfY29ubiAoaW50cm9kdWNlIG5mX2Nvbm5faGVscCkKLSAqIAktIHJlZGVzaWduICdmZWF0dXJlcycgaG93IHRoZXkgd2VyZSBvcmlnaW5hbGx5IGludGVuZGVkCi0gKiAyNiBGZWIgMjAwNjogUGFibG8gTmVpcmEgQXl1c28gPHBhYmxvQGV1cm9kZXYubmV0PgotICogCS0gYWRkIHN1cHBvcnQgZm9yIEwzIHByb3RvY29sIG1vZHVsZSBsb2FkIG9uIGRlbWFuZC4KLSAqCi0gKiBEZXJpdmVkIGZyb20gbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19jb3JlLmMKICAqLwogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KQEAgLTEyOCwxMCArMTEwLDExIEBACiAJCQkJICB1bnNpZ25lZCBpbnQgc2l6ZSwgdW5zaWduZWQgaW50IHJuZCkKIHsKIAl1bnNpZ25lZCBpbnQgYSwgYjsKLQlhID0gamhhc2goKHZvaWQgKil0dXBsZS0+c3JjLnUzLmFsbCwgc2l6ZW9mKHR1cGxlLT5zcmMudTMuYWxsKSwKLQkJICAoKHR1cGxlLT5zcmMubDNudW0pIDw8IDE2KSB8IHR1cGxlLT5kc3QucHJvdG9udW0pOwotCWIgPSBqaGFzaCgodm9pZCAqKXR1cGxlLT5kc3QudTMuYWxsLCBzaXplb2YodHVwbGUtPmRzdC51My5hbGwpLAotCQkJKHR1cGxlLT5zcmMudS5hbGwgPDwgMTYpIHwgdHVwbGUtPmRzdC51LmFsbCk7CisKKwlhID0gamhhc2gyKHR1cGxlLT5zcmMudTMuYWxsLCBBUlJBWV9TSVpFKHR1cGxlLT5zcmMudTMuYWxsKSwKKwkJICAgKHR1cGxlLT5zcmMubDNudW0gPDwgMTYpIHwgdHVwbGUtPmRzdC5wcm90b251bSk7CisJYiA9IGpoYXNoMih0dXBsZS0+ZHN0LnUzLmFsbCwgQVJSQVlfU0laRSh0dXBsZS0+ZHN0LnUzLmFsbCksCisJCSAgICh0dXBsZS0+c3JjLnUuYWxsIDw8IDE2KSB8IHR1cGxlLT5kc3QudS5hbGwpOwogCiAJcmV0dXJuIGpoYXNoXzJ3b3JkcyhhLCBiLCBybmQpICUgc2l6ZTsKIH0KQEAgLTYzMywxMyArNjE2LDExIEBACiAJbWVtc2V0KGNvbm50cmFjaywgMCwgbmZfY3RfY2FjaGVbZmVhdHVyZXNdLnNpemUpOwogCWNvbm50cmFjay0+ZmVhdHVyZXMgPSBmZWF0dXJlczsKIAlhdG9taWNfc2V0KCZjb25udHJhY2stPmN0X2dlbmVyYWwudXNlLCAxKTsKLQljb25udHJhY2stPmN0X2dlbmVyYWwuZGVzdHJveSA9IGRlc3Ryb3lfY29ubnRyYWNrOwogCWNvbm50cmFjay0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUgPSAqb3JpZzsKIAljb25udHJhY2stPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlID0gKnJlcGw7CiAJLyogRG9uJ3Qgc2V0IHRpbWVyIHlldDogd2FpdCBmb3IgY29uZmlybWF0aW9uICovCi0JaW5pdF90aW1lcigmY29ubnRyYWNrLT50aW1lb3V0KTsKLQljb25udHJhY2stPnRpbWVvdXQuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWNvbm50cmFjazsKLQljb25udHJhY2stPnRpbWVvdXQuZnVuY3Rpb24gPSBkZWF0aF9ieV90aW1lb3V0OworCXNldHVwX3RpbWVyKCZjb25udHJhY2stPnRpbWVvdXQsIGRlYXRoX2J5X3RpbWVvdXQsCisJCSAgICAodW5zaWduZWQgbG9uZyljb25udHJhY2spOwogCXJlYWRfdW5sb2NrX2JoKCZuZl9jdF9jYWNoZV9sb2NrKTsKIAogCXJldHVybiBjb25udHJhY2s7CkBAIC03NjgsNyArNzQ5LDcgQEAKIAlzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlX2hhc2ggKmg7CiAJc3RydWN0IG5mX2Nvbm4gKmN0OwogCi0JaWYgKCFuZl9jdF9nZXRfdHVwbGUoc2tiLCAodW5zaWduZWQgaW50KShza2ItPm5oLnJhdyAtIHNrYi0+ZGF0YSksCisJaWYgKCFuZl9jdF9nZXRfdHVwbGUoc2tiLCBza2JfbmV0d29ya19vZmZzZXQoc2tiKSwKIAkJCSAgICAgZGF0YW9mZiwgbDNudW0sIHByb3RvbnVtLCAmdHVwbGUsIGwzcHJvdG8sCiAJCQkgICAgIGw0cHJvdG8pKSB7CiAJCURFQlVHUCgicmVzb2x2ZV9ub3JtYWxfY3Q6IENhbid0IGdldCB0dXBsZVxuIik7CkBAIC05NjAsNyArOTQxLDcgQEAKIAlpZiAoZG9fYWNjdCkgewogCQljdC0+Y291bnRlcnNbQ1RJTkZPMkRJUihjdGluZm8pXS5wYWNrZXRzKys7CiAJCWN0LT5jb3VudGVyc1tDVElORk8yRElSKGN0aW5mbyldLmJ5dGVzICs9Ci0JCQlza2ItPmxlbiAtICh1bnNpZ25lZCBpbnQpKHNrYi0+bmgucmF3IC0gc2tiLT5kYXRhKTsKKwkJCXNrYi0+bGVuIC0gc2tiX25ldHdvcmtfb2Zmc2V0KHNrYik7CiAKIAkJaWYgKChjdC0+Y291bnRlcnNbQ1RJTkZPMkRJUihjdGluZm8pXS5wYWNrZXRzICYgMHg4MDAwMDAwMCkKIAkJICAgIHx8IChjdC0+Y291bnRlcnNbQ1RJTkZPMkRJUihjdGluZm8pXS5ieXRlcyAmIDB4ODAwMDAwMDApKQpAQCAtMTE0MCw2ICsxMTIxLDggQEAKIAl3aGlsZSAoYXRvbWljX3JlYWQoJm5mX2Nvbm50cmFja191bnRyYWNrZWQuY3RfZ2VuZXJhbC51c2UpID4gMSkKIAkJc2NoZWR1bGUoKTsKIAorCXJjdV9hc3NpZ25fcG9pbnRlcihuZl9jdF9kZXN0cm95LCBOVUxMKTsKKwogCWZvciAoaSA9IDA7IGkgPCBORl9DVF9GX05VTTsgaSsrKSB7CiAJCWlmIChuZl9jdF9jYWNoZVtpXS51c2UgPT0gMCkKIAkJCWNvbnRpbnVlOwpAQCAtMTE1MiwxNCArMTEzNSw3IEBACiAJZnJlZV9jb25udHJhY2tfaGFzaChuZl9jb25udHJhY2tfaGFzaCwgbmZfY29ubnRyYWNrX3ZtYWxsb2MsCiAJCQkgICAgbmZfY29ubnRyYWNrX2h0YWJsZV9zaXplKTsKIAotCW5mX2Nvbm50cmFja19sNHByb3RvX3VucmVnaXN0ZXIoJm5mX2Nvbm50cmFja19sNHByb3RvX2dlbmVyaWMpOwotCi0JLyogZnJlZSBsM3Byb3RvIHByb3RvY29sIHRhYmxlcyAqLwotCWZvciAoaSA9IDA7IGkgPCBQRl9NQVg7IGkrKykKLQkJaWYgKG5mX2N0X3Byb3Rvc1tpXSkgewotCQkJa2ZyZWUobmZfY3RfcHJvdG9zW2ldKTsKLQkJCW5mX2N0X3Byb3Rvc1tpXSA9IE5VTEw7Ci0JCX0KKwluZl9jb25udHJhY2tfcHJvdG9fZmluaSgpOwogfQogCiBzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCAqYWxsb2NfaGFzaHRhYmxlKGludCBzaXplLCBpbnQgKnZtYWxsb2NlZCkKQEAgLTEyMzcsNyArMTIxMyw2IEBACiAKIGludCBfX2luaXQgbmZfY29ubnRyYWNrX2luaXQodm9pZCkKIHsKLQl1bnNpZ25lZCBpbnQgaTsKIAlpbnQgcmV0OwogCiAJLyogSWRlYSBmcm9tIHRjcC5jOiB1c2UgMS8xNjM4NCBvZiBtZW1vcnkuICBPbiBpMzg2OiAzMk1CCkBAIC0xMjc5LDE4ICsxMjU0LDEzIEBACiAJCWdvdG8gZXJyX2ZyZWVfY29ubnRyYWNrX3NsYWI7CiAJfQogCi0JcmV0ID0gbmZfY29ubnRyYWNrX2w0cHJvdG9fcmVnaXN0ZXIoJm5mX2Nvbm50cmFja19sNHByb3RvX2dlbmVyaWMpOworCXJldCA9IG5mX2Nvbm50cmFja19wcm90b19pbml0KCk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gb3V0X2ZyZWVfZXhwZWN0X3NsYWI7CiAKLQkvKiBEb24ndCBORUVEIGxvY2sgaGVyZSwgYnV0IGdvb2QgZm9ybSBhbnl3YXkuICovCi0Jd3JpdGVfbG9ja19iaCgmbmZfY29ubnRyYWNrX2xvY2spOwotCWZvciAoaSA9IDA7IGkgPCBBRl9NQVg7IGkrKykKLQkJbmZfY3RfbDNwcm90b3NbaV0gPSAmbmZfY29ubnRyYWNrX2wzcHJvdG9fZ2VuZXJpYzsKLQl3cml0ZV91bmxvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKLQogCS8qIEZvciB1c2UgYnkgUkVKRUNUIHRhcmdldCAqLwogCXJjdV9hc3NpZ25fcG9pbnRlcihpcF9jdF9hdHRhY2gsIF9fbmZfY29ubnRyYWNrX2F0dGFjaCk7CisJcmN1X2Fzc2lnbl9wb2ludGVyKG5mX2N0X2Rlc3Ryb3ksIGRlc3Ryb3lfY29ubnRyYWNrKTsKIAogCS8qIFNldCB1cCBmYWtlIGNvbm50cmFjazoKIAkgICAgLSB0byBuZXZlciBiZSBkZWxldGVkLCBub3QgaW4gYW55IGhhc2hlcyAqLwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZWNhY2hlLmMgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19lY2FjaGUuYwppbmRleCAxYTIyM2UwLi42YmQ0MjFkIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19lY2FjaGUuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19lY2FjaGUuYwpAQCAtOTEsMyArOTEsMjYgQEAKIAl9CiB9CiAKK2ludCBuZl9jb25udHJhY2tfcmVnaXN0ZXJfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKK3sKKwlyZXR1cm4gYXRvbWljX25vdGlmaWVyX2NoYWluX3JlZ2lzdGVyKCZuZl9jb25udHJhY2tfY2hhaW4sIG5iKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG5mX2Nvbm50cmFja19yZWdpc3Rlcl9ub3RpZmllcik7CisKK2ludCBuZl9jb25udHJhY2tfdW5yZWdpc3Rlcl9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKQoreworCXJldHVybiBhdG9taWNfbm90aWZpZXJfY2hhaW5fdW5yZWdpc3RlcigmbmZfY29ubnRyYWNrX2NoYWluLCBuYik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChuZl9jb25udHJhY2tfdW5yZWdpc3Rlcl9ub3RpZmllcik7CisKK2ludCBuZl9jb25udHJhY2tfZXhwZWN0X3JlZ2lzdGVyX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpCit7CisJcmV0dXJuIGF0b21pY19ub3RpZmllcl9jaGFpbl9yZWdpc3RlcigmbmZfY29ubnRyYWNrX2V4cGVjdF9jaGFpbiwgbmIpOworfQorRVhQT1JUX1NZTUJPTF9HUEwobmZfY29ubnRyYWNrX2V4cGVjdF9yZWdpc3Rlcl9ub3RpZmllcik7CisKK2ludCBuZl9jb25udHJhY2tfZXhwZWN0X3VucmVnaXN0ZXJfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKK3sKKwlyZXR1cm4gYXRvbWljX25vdGlmaWVyX2NoYWluX3VucmVnaXN0ZXIoJm5mX2Nvbm50cmFja19leHBlY3RfY2hhaW4sIG5iKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG5mX2Nvbm50cmFja19leHBlY3RfdW5yZWdpc3Rlcl9ub3RpZmllcik7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19leHBlY3QuYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4cGVjdC5jCmluZGV4IGNlNzBhNmYuLmMzMWFmMjkgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4cGVjdC5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4cGVjdC5jCkBAIC0yOTAsOSArMjkwLDcgQEAKIAltYXN0ZXJfaGVscC0+ZXhwZWN0aW5nKys7CiAJbGlzdF9hZGQoJmV4cC0+bGlzdCwgJm5mX2Nvbm50cmFja19leHBlY3RfbGlzdCk7CiAKLQlpbml0X3RpbWVyKCZleHAtPnRpbWVvdXQpOwotCWV4cC0+dGltZW91dC5kYXRhID0gKHVuc2lnbmVkIGxvbmcpZXhwOwotCWV4cC0+dGltZW91dC5mdW5jdGlvbiA9IGV4cGVjdGF0aW9uX3RpbWVkX291dDsKKwlzZXR1cF90aW1lcigmZXhwLT50aW1lb3V0LCBleHBlY3RhdGlvbl90aW1lZF9vdXQsICh1bnNpZ25lZCBsb25nKWV4cCk7CiAJZXhwLT50aW1lb3V0LmV4cGlyZXMgPSBqaWZmaWVzICsgbWFzdGVyX2hlbHAtPmhlbHBlci0+dGltZW91dCAqIEhaOwogCWFkZF90aW1lcigmZXhwLT50aW1lb3V0KTsKIApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZnRwLmMgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19mdHAuYwppbmRleCAzMDg5ZGZjLi5hMTg2Nzk5IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19mdHAuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19mdHAuYwpAQCAtNywxMiArNyw2IEBACiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIDE2IERlYyAyMDAzOiBZYXN1eXVraSBLb3pha2FpIEBVU0FHSSA8eWFzdXl1a2kua296YWthaUB0b3NoaWJhLmNvLmpwPgotICoJLSBlbmFibGUgd29ya2luZyB3aXRoIExheWVyIDMgcHJvdG9jb2wgaW5kZXBlbmRlbnQgY29ubmVjdGlvbiB0cmFja2luZy4KLSAqCS0gdHJhY2sgRVBSVCBhbmQgRVBTViBjb21tYW5kcyB3aXRoIElQdjYgYWRkcmVzcy4KLSAqCi0gKiBEZXJpdmVkIGZyb20gbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19mdHAuYwogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX25ldGJpb3NfbnMuYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX25ldGJpb3NfbnMuYwppbmRleCBiYjI2YTY1Li4xMDkzNDc4IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19uZXRiaW9zX25zLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbmV0Ymlvc19ucy5jCkBAIC00Niw3ICs0Niw3IEBACiAJCXN0cnVjdCBuZl9jb25uICpjdCwgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8pCiB7CiAJc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKmV4cDsKLQlzdHJ1Y3QgaXBoZHIgKmlwaCA9ICgqcHNrYiktPm5oLmlwaDsKKwlzdHJ1Y3QgaXBoZHIgKmlwaCA9IGlwX2hkcigqcHNrYik7CiAJc3RydWN0IHJ0YWJsZSAqcnQgPSAoc3RydWN0IHJ0YWJsZSAqKSgqcHNrYiktPmRzdDsKIAlzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXY7CiAJX19iZTMyIG1hc2sgPSAwOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbmV0bGluay5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbmV0bGluay5jCmluZGV4IDQ4ZjA1MzEuLmFhMWE5N2VlIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19uZXRsaW5rLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbmV0bGluay5jCkBAIC02LDkgKzYsNiBAQAogICogKEMpIDIwMDMgYnkgUGF0cmljayBNY2hhcmR5IDxrYWJlckB0cmFzaC5uZXQ+CiAgKiAoQykgMjAwNS0yMDA2IGJ5IFBhYmxvIE5laXJhIEF5dXNvIDxwYWJsb0BldXJvZGV2Lm5ldD4KICAqCi0gKiBJJ3ZlIHJld29ya2VkIHRoaXMgc3R1ZmYgdG8gdXNlIGF0dHJpYnV0ZXMgaW5zdGVhZCBvZiBjb25udHJhY2sKLSAqIHN0cnVjdHVyZXMuIDUuNDQgYW0uIEkgbmVlZCBtb3JlIHRlYS4gLS1wYWJsbyAwNS8wNy8xMS4KLSAqCiAgKiBJbml0aWFsIGNvbm5lY3Rpb24gdHJhY2tpbmcgdmlhIG5ldGxpbmsgZGV2ZWxvcG1lbnQgZnVuZGVkIGFuZAogICogZ2VuZXJhbGx5IG1hZGUgcG9zc2libGUgYnkgTmV0d29yayBSb2JvdHMsIEluYy4gKHd3dy5uZXR3b3Jrcm9ib3RzLmNvbSkKICAqCkBAIC0xNiw4ICsxMyw2IEBACiAgKgogICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcwogICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KLSAqCi0gKiBEZXJpdmVkIGZyb20gaXBfY29ubnRyYWNrX25ldGxpbmsuYzogUG9ydCBieSBQYWJsbyBOZWlyYSBBeXVzbyAoMDUvMTEvMTQpCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KQEAgLTMzLDYgKzI4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgogCiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CisjaW5jbHVkZSA8bmV0L25ldGxpbmsuaD4KICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oPgogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvcmUuaD4KICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19leHBlY3QuaD4KQEAgLTI2OCw5ICsyNjQsNyBAQAogCXN0cnVjdCBubG1zZ2hkciAqbmxoOwogCXN0cnVjdCBuZmdlbm1zZyAqbmZtc2c7CiAJc3RydWN0IG5mYXR0ciAqbmVzdF9wYXJtczsKLQl1bnNpZ25lZCBjaGFyICpiOwotCi0JYiA9IHNrYi0+dGFpbDsKKwl1bnNpZ25lZCBjaGFyICpiID0gc2tiX3RhaWxfcG9pbnRlcihza2IpOwogCiAJZXZlbnQgfD0gTkZOTF9TVUJTWVNfQ1RORVRMSU5LIDw8IDg7CiAJbmxoICAgID0gTkxNU0dfUFVUKHNrYiwgcGlkLCBzZXEsIGV2ZW50LCBzaXplb2Yoc3RydWN0IG5mZ2VubXNnKSk7CkBAIC0zMDMsMTIgKzI5NywxMiBAQAogCSAgICBjdG5ldGxpbmtfZHVtcF91c2Uoc2tiLCBjdCkgPCAwKQogCQlnb3RvIG5mYXR0cl9mYWlsdXJlOwogCi0JbmxoLT5ubG1zZ19sZW4gPSBza2ItPnRhaWwgLSBiOworCW5saC0+bmxtc2dfbGVuID0gc2tiX3RhaWxfcG9pbnRlcihza2IpIC0gYjsKIAlyZXR1cm4gc2tiLT5sZW47CiAKIG5sbXNnX2ZhaWx1cmU6CiBuZmF0dHJfZmFpbHVyZToKLQlza2JfdHJpbShza2IsIGIgLSBza2ItPmRhdGEpOworCW5sbXNnX3RyaW0oc2tiLCBiKTsKIAlyZXR1cm4gLTE7CiB9CiAKQEAgLTMyMiw3ICszMTYsNyBAQAogCXN0cnVjdCBuZl9jb25uICpjdCA9IChzdHJ1Y3QgbmZfY29ubiAqKXB0cjsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXVuc2lnbmVkIGludCB0eXBlOwotCXVuc2lnbmVkIGNoYXIgKmI7CisJc2tfYnVmZl9kYXRhX3QgYjsKIAl1bnNpZ25lZCBpbnQgZmxhZ3MgPSAwLCBncm91cDsKIAogCS8qIGlnbm9yZSBvdXIgZmFrZSBjb25udHJhY2sgZW50cnkgKi8KQEAgLTY2Miw3ICs2NTYsNyBAQAogCiBzdGF0aWMgaW50CiBjdG5ldGxpbmtfZGVsX2Nvbm50cmFjayhzdHJ1Y3Qgc29jayAqY3RubCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCXN0cnVjdCBubG1zZ2hkciAqbmxoLCBzdHJ1Y3QgbmZhdHRyICpjZGFbXSwgaW50ICplcnJwKQorCQkJc3RydWN0IG5sbXNnaGRyICpubGgsIHN0cnVjdCBuZmF0dHIgKmNkYVtdKQogewogCXN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGVfaGFzaCAqaDsKIAlzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlIHR1cGxlOwpAQCAtNzEwLDcgKzcwNCw3IEBACiAKIHN0YXRpYyBpbnQKIGN0bmV0bGlua19nZXRfY29ubnRyYWNrKHN0cnVjdCBzb2NrICpjdG5sLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJc3RydWN0IG5sbXNnaGRyICpubGgsIHN0cnVjdCBuZmF0dHIgKmNkYVtdLCBpbnQgKmVycnApCisJCQlzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgc3RydWN0IG5mYXR0ciAqY2RhW10pCiB7CiAJc3RydWN0IG5mX2Nvbm50cmFja190dXBsZV9oYXNoICpoOwogCXN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgdHVwbGU7CkBAIC03MjEsMjIgKzcxNSwxMiBAQAogCWludCBlcnIgPSAwOwogCiAJaWYgKG5saC0+bmxtc2dfZmxhZ3MgJiBOTE1fRl9EVU1QKSB7Ci0JCXUzMiBybGVuOwotCiAjaWZuZGVmIENPTkZJR19ORl9DVF9BQ0NUCiAJCWlmIChORk5MX01TR19UWVBFKG5saC0+bmxtc2dfdHlwZSkgPT0gSVBDVE5MX01TR19DVF9HRVRfQ1RSWkVSTykKIAkJCXJldHVybiAtRU5PVFNVUFA7CiAjZW5kaWYKLQkJaWYgKCgqZXJycCA9IG5ldGxpbmtfZHVtcF9zdGFydChjdG5sLCBza2IsIG5saCwKLQkJCQkJCWN0bmV0bGlua19kdW1wX3RhYmxlLAotCQkJCQkJY3RuZXRsaW5rX2RvbmUpKSAhPSAwKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJcmxlbiA9IE5MTVNHX0FMSUdOKG5saC0+bmxtc2dfbGVuKTsKLQkJaWYgKHJsZW4gPiBza2ItPmxlbikKLQkJCXJsZW4gPSBza2ItPmxlbjsKLQkJc2tiX3B1bGwoc2tiLCBybGVuKTsKLQkJcmV0dXJuIDA7CisJCXJldHVybiBuZXRsaW5rX2R1bXBfc3RhcnQoY3RubCwgc2tiLCBubGgsIGN0bmV0bGlua19kdW1wX3RhYmxlLAorCQkJCQkgIGN0bmV0bGlua19kb25lKTsKIAl9CiAKIAlpZiAobmZhdHRyX2JhZF9zaXplKGNkYSwgQ1RBX01BWCwgY3RhX21pbikpCkBAIC0xMDEwLDcgKzk5NCw3IEBACiAKIHN0YXRpYyBpbnQKIGN0bmV0bGlua19uZXdfY29ubnRyYWNrKHN0cnVjdCBzb2NrICpjdG5sLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJc3RydWN0IG5sbXNnaGRyICpubGgsIHN0cnVjdCBuZmF0dHIgKmNkYVtdLCBpbnQgKmVycnApCisJCQlzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgc3RydWN0IG5mYXR0ciAqY2RhW10pCiB7CiAJc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSBvdHVwbGUsIHJ0dXBsZTsKIAlzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlX2hhc2ggKmggPSBOVUxMOwpAQCAtMTE1Miw5ICsxMTM2LDcgQEAKIHsKIAlzdHJ1Y3Qgbmxtc2doZHIgKm5saDsKIAlzdHJ1Y3QgbmZnZW5tc2cgKm5mbXNnOwotCXVuc2lnbmVkIGNoYXIgKmI7Ci0KLQliID0gc2tiLT50YWlsOworCXVuc2lnbmVkIGNoYXIgKmIgPSBza2JfdGFpbF9wb2ludGVyKHNrYik7CiAKIAlldmVudCB8PSBORk5MX1NVQlNZU19DVE5FVExJTktfRVhQIDw8IDg7CiAJbmxoICAgID0gTkxNU0dfUFVUKHNrYiwgcGlkLCBzZXEsIGV2ZW50LCBzaXplb2Yoc3RydWN0IG5mZ2VubXNnKSk7CkBAIC0xMTY4LDEyICsxMTUwLDEyIEBACiAJaWYgKGN0bmV0bGlua19leHBfZHVtcF9leHBlY3Qoc2tiLCBleHApIDwgMCkKIAkJZ290byBuZmF0dHJfZmFpbHVyZTsKIAotCW5saC0+bmxtc2dfbGVuID0gc2tiLT50YWlsIC0gYjsKKwlubGgtPm5sbXNnX2xlbiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKSAtIGI7CiAJcmV0dXJuIHNrYi0+bGVuOwogCiBubG1zZ19mYWlsdXJlOgogbmZhdHRyX2ZhaWx1cmU6Ci0Jc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKKwlubG1zZ190cmltKHNrYiwgYik7CiAJcmV0dXJuIC0xOwogfQogCkBAIC0xMTg2LDcgKzExNjgsNyBAQAogCXN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpleHAgPSAoc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKilwdHI7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAl1bnNpZ25lZCBpbnQgdHlwZTsKLQl1bnNpZ25lZCBjaGFyICpiOworCXNrX2J1ZmZfZGF0YV90IGI7CiAJaW50IGZsYWdzID0gMDsKIAogCWlmIChldmVudHMgJiBJUEVYUF9ORVcpIHsKQEAgLTEyNjMsNyArMTI0NSw3IEBACiAKIHN0YXRpYyBpbnQKIGN0bmV0bGlua19nZXRfZXhwZWN0KHN0cnVjdCBzb2NrICpjdG5sLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkgICAgIHN0cnVjdCBubG1zZ2hkciAqbmxoLCBzdHJ1Y3QgbmZhdHRyICpjZGFbXSwgaW50ICplcnJwKQorCQkgICAgIHN0cnVjdCBubG1zZ2hkciAqbmxoLCBzdHJ1Y3QgbmZhdHRyICpjZGFbXSkKIHsKIAlzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlIHR1cGxlOwogCXN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpleHA7CkBAIC0xMjc2LDE3ICsxMjU4LDkgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAobmxoLT5ubG1zZ19mbGFncyAmIE5MTV9GX0RVTVApIHsKLQkJdTMyIHJsZW47Ci0KLQkJaWYgKCgqZXJycCA9IG5ldGxpbmtfZHVtcF9zdGFydChjdG5sLCBza2IsIG5saCwKLQkJCQkJCWN0bmV0bGlua19leHBfZHVtcF90YWJsZSwKLQkJCQkJCWN0bmV0bGlua19kb25lKSkgIT0gMCkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlybGVuID0gTkxNU0dfQUxJR04obmxoLT5ubG1zZ19sZW4pOwotCQlpZiAocmxlbiA+IHNrYi0+bGVuKQotCQkJcmxlbiA9IHNrYi0+bGVuOwotCQlza2JfcHVsbChza2IsIHJsZW4pOwotCQlyZXR1cm4gMDsKKwkJcmV0dXJuIG5ldGxpbmtfZHVtcF9zdGFydChjdG5sLCBza2IsIG5saCwKKwkJCQkJICBjdG5ldGxpbmtfZXhwX2R1bXBfdGFibGUsCisJCQkJCSAgY3RuZXRsaW5rX2RvbmUpOwogCX0KIAogCWlmIChjZGFbQ1RBX0VYUEVDVF9NQVNURVItMV0pCkBAIC0xMzMzLDcgKzEzMDcsNyBAQAogCiBzdGF0aWMgaW50CiBjdG5ldGxpbmtfZGVsX2V4cGVjdChzdHJ1Y3Qgc29jayAqY3RubCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJICAgICBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgc3RydWN0IG5mYXR0ciAqY2RhW10sIGludCAqZXJycCkKKwkJICAgICBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgc3RydWN0IG5mYXR0ciAqY2RhW10pCiB7CiAJc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKmV4cCwgKnRtcDsKIAlzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlIHR1cGxlOwpAQCAtMTQ2Nyw3ICsxNDQxLDcgQEAKIAogc3RhdGljIGludAogY3RuZXRsaW5rX25ld19leHBlY3Qoc3RydWN0IHNvY2sgKmN0bmwsIHN0cnVjdCBza19idWZmICpza2IsCi0JCSAgICAgc3RydWN0IG5sbXNnaGRyICpubGgsIHN0cnVjdCBuZmF0dHIgKmNkYVtdLCBpbnQgKmVycnApCisJCSAgICAgc3RydWN0IG5sbXNnaGRyICpubGgsIHN0cnVjdCBuZmF0dHIgKmNkYVtdKQogewogCXN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgdHVwbGU7CiAJc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKmV4cDsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvLmMgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90by5jCmluZGV4IDQ1NjE1NWYuLjZkOTQ3MDYgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG8uYwpAQCAtMjgsMTMgKzI4LDEzIEBACiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDRwcm90by5oPgogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvcmUuaD4KIAotc3RydWN0IG5mX2Nvbm50cmFja19sNHByb3RvICoqbmZfY3RfcHJvdG9zW1BGX01BWF0gX19yZWFkX21vc3RseTsKK3N0YXRpYyBzdHJ1Y3QgbmZfY29ubnRyYWNrX2w0cHJvdG8gKipuZl9jdF9wcm90b3NbUEZfTUFYXSBfX3JlYWRfbW9zdGx5Owogc3RydWN0IG5mX2Nvbm50cmFja19sM3Byb3RvICpuZl9jdF9sM3Byb3Rvc1tBRl9NQVhdIF9fcmVhZF9tb3N0bHk7CiBFWFBPUlRfU1lNQk9MX0dQTChuZl9jdF9sM3Byb3Rvcyk7CiAKLSNpZmRlZiBDT05GSUdfU1lTQ1RMCi1zdGF0aWMgREVGSU5FX01VVEVYKG5mX2N0X3Byb3RvX3N5c2N0bF9tdXRleCk7CitzdGF0aWMgREVGSU5FX01VVEVYKG5mX2N0X3Byb3RvX211dGV4KTsKIAorI2lmZGVmIENPTkZJR19TWVNDVEwKIHN0YXRpYyBpbnQKIG5mX2N0X3JlZ2lzdGVyX3N5c2N0bChzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlciAqKmhlYWRlciwgc3RydWN0IGN0bF90YWJsZSAqcGF0aCwKIAkJICAgICAgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIHVuc2lnbmVkIGludCAqdXNlcnMpCkBAIC0xNjQsMTMgKzE2NCwxMSBAQAogCWludCBlcnIgPSAwOwogCiAjaWZkZWYgQ09ORklHX1NZU0NUTAotCW11dGV4X2xvY2soJm5mX2N0X3Byb3RvX3N5c2N0bF9tdXRleCk7CiAJaWYgKGwzcHJvdG8tPmN0bF90YWJsZSAhPSBOVUxMKSB7CiAJCWVyciA9IG5mX2N0X3JlZ2lzdGVyX3N5c2N0bCgmbDNwcm90by0+Y3RsX3RhYmxlX2hlYWRlciwKIAkJCQkJICAgIGwzcHJvdG8tPmN0bF90YWJsZV9wYXRoLAogCQkJCQkgICAgbDNwcm90by0+Y3RsX3RhYmxlLCBOVUxMKTsKIAl9Ci0JbXV0ZXhfdW5sb2NrKCZuZl9jdF9wcm90b19zeXNjdGxfbXV0ZXgpOwogI2VuZGlmCiAJcmV0dXJuIGVycjsKIH0KQEAgLTE3OCwxMSArMTc2LDkgQEAKIHN0YXRpYyB2b2lkIG5mX2N0X2wzcHJvdG9fdW5yZWdpc3Rlcl9zeXNjdGwoc3RydWN0IG5mX2Nvbm50cmFja19sM3Byb3RvICpsM3Byb3RvKQogewogI2lmZGVmIENPTkZJR19TWVNDVEwKLQltdXRleF9sb2NrKCZuZl9jdF9wcm90b19zeXNjdGxfbXV0ZXgpOwogCWlmIChsM3Byb3RvLT5jdGxfdGFibGVfaGVhZGVyICE9IE5VTEwpCiAJCW5mX2N0X3VucmVnaXN0ZXJfc3lzY3RsKCZsM3Byb3RvLT5jdGxfdGFibGVfaGVhZGVyLAogCQkJCQlsM3Byb3RvLT5jdGxfdGFibGUsIE5VTEwpOwotCW11dGV4X3VubG9jaygmbmZfY3RfcHJvdG9fc3lzY3RsX211dGV4KTsKICNlbmRpZgogfQogCkBAIC0xOTAsMjcgKzE4NiwyMyBAQAogewogCWludCByZXQgPSAwOwogCi0JaWYgKHByb3RvLT5sM3Byb3RvID49IEFGX01BWCkgewotCQlyZXQgPSAtRUJVU1k7Ci0JCWdvdG8gb3V0OwotCX0KKwlpZiAocHJvdG8tPmwzcHJvdG8gPj0gQUZfTUFYKQorCQlyZXR1cm4gLUVCVVNZOwogCi0Jd3JpdGVfbG9ja19iaCgmbmZfY29ubnRyYWNrX2xvY2spOworCW11dGV4X2xvY2soJm5mX2N0X3Byb3RvX211dGV4KTsKIAlpZiAobmZfY3RfbDNwcm90b3NbcHJvdG8tPmwzcHJvdG9dICE9ICZuZl9jb25udHJhY2tfbDNwcm90b19nZW5lcmljKSB7CiAJCXJldCA9IC1FQlVTWTsKIAkJZ290byBvdXRfdW5sb2NrOwogCX0KLQlyY3VfYXNzaWduX3BvaW50ZXIobmZfY3RfbDNwcm90b3NbcHJvdG8tPmwzcHJvdG9dLCBwcm90byk7Ci0Jd3JpdGVfdW5sb2NrX2JoKCZuZl9jb25udHJhY2tfbG9jayk7CiAKIAlyZXQgPSBuZl9jdF9sM3Byb3RvX3JlZ2lzdGVyX3N5c2N0bChwcm90byk7CiAJaWYgKHJldCA8IDApCi0JCW5mX2Nvbm50cmFja19sM3Byb3RvX3VucmVnaXN0ZXIocHJvdG8pOwotCXJldHVybiByZXQ7CisJCWdvdG8gb3V0X3VubG9jazsKKworCXJjdV9hc3NpZ25fcG9pbnRlcihuZl9jdF9sM3Byb3Rvc1twcm90by0+bDNwcm90b10sIHByb3RvKTsKIAogb3V0X3VubG9jazoKLQl3cml0ZV91bmxvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKLW91dDoKKwltdXRleF91bmxvY2soJm5mX2N0X3Byb3RvX211dGV4KTsKIAlyZXR1cm4gcmV0OwogfQogRVhQT1JUX1NZTUJPTF9HUEwobmZfY29ubnRyYWNrX2wzcHJvdG9fcmVnaXN0ZXIpOwpAQCAtMjE5LDE0ICsyMTEsMTQgQEAKIHsKIAlCVUdfT04ocHJvdG8tPmwzcHJvdG8gPj0gQUZfTUFYKTsKIAotCXdyaXRlX2xvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKKwltdXRleF9sb2NrKCZuZl9jdF9wcm90b19tdXRleCk7CiAJQlVHX09OKG5mX2N0X2wzcHJvdG9zW3Byb3RvLT5sM3Byb3RvXSAhPSBwcm90byk7CiAJcmN1X2Fzc2lnbl9wb2ludGVyKG5mX2N0X2wzcHJvdG9zW3Byb3RvLT5sM3Byb3RvXSwKIAkJCSAgICZuZl9jb25udHJhY2tfbDNwcm90b19nZW5lcmljKTsKLQl3cml0ZV91bmxvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKLQlzeW5jaHJvbml6ZV9yY3UoKTsKLQogCW5mX2N0X2wzcHJvdG9fdW5yZWdpc3Rlcl9zeXNjdGwocHJvdG8pOworCW11dGV4X3VubG9jaygmbmZfY3RfcHJvdG9fbXV0ZXgpOworCisJc3luY2hyb25pemVfcmN1KCk7CiAKIAkvKiBSZW1vdmUgYWxsIGNvbnRyYWNrIGVudHJpZXMgZm9yIHRoaXMgcHJvdG9jb2wgKi8KIAluZl9jdF9pdGVyYXRlX2NsZWFudXAoa2lsbF9sM3Byb3RvLCBwcm90byk7CkBAIC0yMzgsNyArMjMwLDYgQEAKIAlpbnQgZXJyID0gMDsKIAogI2lmZGVmIENPTkZJR19TWVNDVEwKLQltdXRleF9sb2NrKCZuZl9jdF9wcm90b19zeXNjdGxfbXV0ZXgpOwogCWlmIChsNHByb3RvLT5jdGxfdGFibGUgIT0gTlVMTCkgewogCQllcnIgPSBuZl9jdF9yZWdpc3Rlcl9zeXNjdGwobDRwcm90by0+Y3RsX3RhYmxlX2hlYWRlciwKIAkJCQkJICAgIG5mX25ldF9uZXRmaWx0ZXJfc3lzY3RsX3BhdGgsCkBAIC0yNjAsNyArMjUxLDYgQEAKIAl9CiAjZW5kaWYgLyogQ09ORklHX05GX0NPTk5UUkFDS19QUk9DX0NPTVBBVCAqLwogb3V0OgotCW11dGV4X3VubG9jaygmbmZfY3RfcHJvdG9fc3lzY3RsX211dGV4KTsKICNlbmRpZiAvKiBDT05GSUdfU1lTQ1RMICovCiAJcmV0dXJuIGVycjsKIH0KQEAgLTI2OCw3ICsyNTgsNiBAQAogc3RhdGljIHZvaWQgbmZfY3RfbDRwcm90b191bnJlZ2lzdGVyX3N5c2N0bChzdHJ1Y3QgbmZfY29ubnRyYWNrX2w0cHJvdG8gKmw0cHJvdG8pCiB7CiAjaWZkZWYgQ09ORklHX1NZU0NUTAotCW11dGV4X2xvY2soJm5mX2N0X3Byb3RvX3N5c2N0bF9tdXRleCk7CiAJaWYgKGw0cHJvdG8tPmN0bF90YWJsZV9oZWFkZXIgIT0gTlVMTCAmJgogCSAgICAqbDRwcm90by0+Y3RsX3RhYmxlX2hlYWRlciAhPSBOVUxMKQogCQluZl9jdF91bnJlZ2lzdGVyX3N5c2N0bChsNHByb3RvLT5jdGxfdGFibGVfaGVhZGVyLApAQCAtMjc5LDcgKzI2OCw2IEBACiAJCW5mX2N0X3VucmVnaXN0ZXJfc3lzY3RsKCZsNHByb3RvLT5jdGxfY29tcGF0X3RhYmxlX2hlYWRlciwKIAkJCQkJbDRwcm90by0+Y3RsX2NvbXBhdF90YWJsZSwgTlVMTCk7CiAjZW5kaWYgLyogQ09ORklHX05GX0NPTk5UUkFDS19QUk9DX0NPTVBBVCAqLwotCW11dGV4X3VubG9jaygmbmZfY3RfcHJvdG9fc3lzY3RsX211dGV4KTsKICNlbmRpZiAvKiBDT05GSUdfU1lTQ1RMICovCiB9CiAKQEAgLTI4OSw2OCArMjc3LDQxIEBACiB7CiAJaW50IHJldCA9IDA7CiAKLQlpZiAobDRwcm90by0+bDNwcm90byA+PSBQRl9NQVgpIHsKLQkJcmV0ID0gLUVCVVNZOwotCQlnb3RvIG91dDsKLQl9CisJaWYgKGw0cHJvdG8tPmwzcHJvdG8gPj0gUEZfTUFYKQorCQlyZXR1cm4gLUVCVVNZOwogCi0JaWYgKGw0cHJvdG8gPT0gJm5mX2Nvbm50cmFja19sNHByb3RvX2dlbmVyaWMpCi0JCXJldHVybiBuZl9jdF9sNHByb3RvX3JlZ2lzdGVyX3N5c2N0bChsNHByb3RvKTsKLQotcmV0cnk6Ci0Jd3JpdGVfbG9ja19iaCgmbmZfY29ubnRyYWNrX2xvY2spOwotCWlmIChuZl9jdF9wcm90b3NbbDRwcm90by0+bDNwcm90b10pIHsKLQkJaWYgKG5mX2N0X3Byb3Rvc1tsNHByb3RvLT5sM3Byb3RvXVtsNHByb3RvLT5sNHByb3RvXQotCQkJCSE9ICZuZl9jb25udHJhY2tfbDRwcm90b19nZW5lcmljKSB7Ci0JCQlyZXQgPSAtRUJVU1k7Ci0JCQlnb3RvIG91dF91bmxvY2s7Ci0JCX0KLQl9IGVsc2UgeworCW11dGV4X2xvY2soJm5mX2N0X3Byb3RvX211dGV4KTsKKwlpZiAoIW5mX2N0X3Byb3Rvc1tsNHByb3RvLT5sM3Byb3RvXSkgewogCQkvKiBsM3Byb3RvIG1heSBiZSBsb2FkZWQgbGF0dGVyLiAqLwogCQlzdHJ1Y3QgbmZfY29ubnRyYWNrX2w0cHJvdG8gKipwcm90b19hcnJheTsKIAkJaW50IGk7CiAKLQkJd3JpdGVfdW5sb2NrX2JoKCZuZl9jb25udHJhY2tfbG9jayk7Ci0KLQkJcHJvdG9fYXJyYXkgPSAoc3RydWN0IG5mX2Nvbm50cmFja19sNHByb3RvICoqKQotCQkJCWttYWxsb2MoTUFYX05GX0NUX1BST1RPICoKLQkJCQkJIHNpemVvZihzdHJ1Y3QgbmZfY29ubnRyYWNrX2w0cHJvdG8gKiksCi0JCQkJCUdGUF9LRVJORUwpOworCQlwcm90b19hcnJheSA9IGttYWxsb2MoTUFYX05GX0NUX1BST1RPICoKKwkJCQkgICAgICBzaXplb2Yoc3RydWN0IG5mX2Nvbm50cmFja19sNHByb3RvICopLAorCQkJCSAgICAgIEdGUF9LRVJORUwpOwogCQlpZiAocHJvdG9fYXJyYXkgPT0gTlVMTCkgewogCQkJcmV0ID0gLUVOT01FTTsKLQkJCWdvdG8gb3V0OworCQkJZ290byBvdXRfdW5sb2NrOwogCQl9CisKIAkJZm9yIChpID0gMDsgaSA8IE1BWF9ORl9DVF9QUk9UTzsgaSsrKQogCQkJcHJvdG9fYXJyYXlbaV0gPSAmbmZfY29ubnRyYWNrX2w0cHJvdG9fZ2VuZXJpYzsKLQotCQl3cml0ZV9sb2NrX2JoKCZuZl9jb25udHJhY2tfbG9jayk7Ci0JCWlmIChuZl9jdF9wcm90b3NbbDRwcm90by0+bDNwcm90b10pIHsKLQkJCS8qIGJhZCB0aW1pbmcsIGJ1dCBubyBwcm9ibGVtICovCi0JCQl3cml0ZV91bmxvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKLQkJCWtmcmVlKHByb3RvX2FycmF5KTsKLQkJfSBlbHNlIHsKLQkJCW5mX2N0X3Byb3Rvc1tsNHByb3RvLT5sM3Byb3RvXSA9IHByb3RvX2FycmF5OwotCQkJd3JpdGVfdW5sb2NrX2JoKCZuZl9jb25udHJhY2tfbG9jayk7Ci0JCX0KLQotCQkvKgotCQkgKiBKdXN0IG9uY2UgYmVjYXVzZSBhcnJheSBpcyBuZXZlciBmcmVlZCB1bnRpbCB1bmxvYWRpbmcKLQkJICogbmZfY29ubnRyYWNrLmtvCi0JCSAqLwotCQlnb3RvIHJldHJ5OworCQluZl9jdF9wcm90b3NbbDRwcm90by0+bDNwcm90b10gPSBwcm90b19hcnJheTsKKwl9IGVsc2UgaWYgKG5mX2N0X3Byb3Rvc1tsNHByb3RvLT5sM3Byb3RvXVtsNHByb3RvLT5sNHByb3RvXSAhPQorCQkJCQkmbmZfY29ubnRyYWNrX2w0cHJvdG9fZ2VuZXJpYykgeworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0X3VubG9jazsKIAl9CiAKLQlyY3VfYXNzaWduX3BvaW50ZXIobmZfY3RfcHJvdG9zW2w0cHJvdG8tPmwzcHJvdG9dW2w0cHJvdG8tPmw0cHJvdG9dLCBsNHByb3RvKTsKLQl3cml0ZV91bmxvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKLQogCXJldCA9IG5mX2N0X2w0cHJvdG9fcmVnaXN0ZXJfc3lzY3RsKGw0cHJvdG8pOwogCWlmIChyZXQgPCAwKQotCQluZl9jb25udHJhY2tfbDRwcm90b191bnJlZ2lzdGVyKGw0cHJvdG8pOwotCXJldHVybiByZXQ7CisJCWdvdG8gb3V0X3VubG9jazsKKworCXJjdV9hc3NpZ25fcG9pbnRlcihuZl9jdF9wcm90b3NbbDRwcm90by0+bDNwcm90b11bbDRwcm90by0+bDRwcm90b10sCisJCQkgICBsNHByb3RvKTsKIAogb3V0X3VubG9jazoKLQl3cml0ZV91bmxvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKLW91dDoKKwltdXRleF91bmxvY2soJm5mX2N0X3Byb3RvX211dGV4KTsKIAlyZXR1cm4gcmV0OwogfQogRVhQT1JUX1NZTUJPTF9HUEwobmZfY29ubnRyYWNrX2w0cHJvdG9fcmVnaXN0ZXIpOwpAQCAtMzU5LDIxICszMjAsNDIgQEAKIHsKIAlCVUdfT04obDRwcm90by0+bDNwcm90byA+PSBQRl9NQVgpOwogCi0JaWYgKGw0cHJvdG8gPT0gJm5mX2Nvbm50cmFja19sNHByb3RvX2dlbmVyaWMpIHsKLQkJbmZfY3RfbDRwcm90b191bnJlZ2lzdGVyX3N5c2N0bChsNHByb3RvKTsKLQkJcmV0dXJuOwotCX0KLQotCXdyaXRlX2xvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKKwltdXRleF9sb2NrKCZuZl9jdF9wcm90b19tdXRleCk7CiAJQlVHX09OKG5mX2N0X3Byb3Rvc1tsNHByb3RvLT5sM3Byb3RvXVtsNHByb3RvLT5sNHByb3RvXSAhPSBsNHByb3RvKTsKIAlyY3VfYXNzaWduX3BvaW50ZXIobmZfY3RfcHJvdG9zW2w0cHJvdG8tPmwzcHJvdG9dW2w0cHJvdG8tPmw0cHJvdG9dLAogCQkJICAgJm5mX2Nvbm50cmFja19sNHByb3RvX2dlbmVyaWMpOwotCXdyaXRlX3VubG9ja19iaCgmbmZfY29ubnRyYWNrX2xvY2spOwotCXN5bmNocm9uaXplX3JjdSgpOwotCiAJbmZfY3RfbDRwcm90b191bnJlZ2lzdGVyX3N5c2N0bChsNHByb3RvKTsKKwltdXRleF91bmxvY2soJm5mX2N0X3Byb3RvX211dGV4KTsKKworCXN5bmNocm9uaXplX3JjdSgpOwogCiAJLyogUmVtb3ZlIGFsbCBjb250cmFjayBlbnRyaWVzIGZvciB0aGlzIHByb3RvY29sICovCiAJbmZfY3RfaXRlcmF0ZV9jbGVhbnVwKGtpbGxfbDRwcm90bywgbDRwcm90byk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChuZl9jb25udHJhY2tfbDRwcm90b191bnJlZ2lzdGVyKTsKKworaW50IG5mX2Nvbm50cmFja19wcm90b19pbml0KHZvaWQpCit7CisJdW5zaWduZWQgaW50IGk7CisJaW50IGVycjsKKworCWVyciA9IG5mX2N0X2w0cHJvdG9fcmVnaXN0ZXJfc3lzY3RsKCZuZl9jb25udHJhY2tfbDRwcm90b19nZW5lcmljKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCWZvciAoaSA9IDA7IGkgPCBBRl9NQVg7IGkrKykKKwkJcmN1X2Fzc2lnbl9wb2ludGVyKG5mX2N0X2wzcHJvdG9zW2ldLAorCQkJCSAgICZuZl9jb25udHJhY2tfbDNwcm90b19nZW5lcmljKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBuZl9jb25udHJhY2tfcHJvdG9fZmluaSh2b2lkKQoreworCXVuc2lnbmVkIGludCBpOworCisJbmZfY3RfbDRwcm90b191bnJlZ2lzdGVyX3N5c2N0bCgmbmZfY29ubnRyYWNrX2w0cHJvdG9fZ2VuZXJpYyk7CisKKwkvKiBmcmVlIGwzcHJvdG8gcHJvdG9jb2wgdGFibGVzICovCisJZm9yIChpID0gMDsgaSA8IFBGX01BWDsgaSsrKQorCQlrZnJlZShuZl9jdF9wcm90b3NbaV0pOworfQpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9fZ2VuZXJpYy5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9fZ2VuZXJpYy5jCmluZGV4IDdjMDY5OTMuLjZmYWYxYmUgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX2dlbmVyaWMuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b19nZW5lcmljLmMKQEAgLTQsMTEgKzQsNiBAQAogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiAxNiBEZWMgMjAwMzogWWFzdXl1a2kgS296YWthaSBAVVNBR0kgPHlhc3V5dWtpLmtvemFrYWlAdG9zaGliYS5jby5qcD4KLSAqCS0gZW5hYmxlIHdvcmtpbmcgd2l0aCBMMyBwcm90b2NvbCBpbmRlcGVuZGVudCBjb25uZWN0aW9uIHRyYWNraW5nLgotICoKLSAqIERlcml2ZWQgZnJvbSBuZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX3Byb3RvX2dlbmVyaWMuYwogICovCiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9fc2N0cC5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9fc2N0cC5jCmluZGV4IDNjODA1NTguLjBkMzI1NGIgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX3NjdHAuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b19zY3RwLmMKQEAgLTcsMTUgKzcsNiBAQAogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiAxNyBPY3QgMjAwNDogWWFzdXl1a2kgS296YWthaSBAVVNBR0kgPHlhc3V5dWtpLmtvemFrYWlAdG9zaGliYS5jby5qcD4KLSAqCS0gZW5hYmxlIHdvcmtpbmcgd2l0aCBMMyBwcm90b2NvbCBpbmRlcGVuZGVudCBjb25uZWN0aW9uIHRyYWNraW5nLgotICoKLSAqIERlcml2ZWQgZnJvbSBuZXQvaXB2NC9pcF9jb25udHJhY2tfc2N0cC5jCi0gKi8KLQotLyoKLSAqIEFkZGVkIHN1cHBvcnQgZm9yIHByb2MgbWFuaXB1bGF0aW9uIG9mIHRpbWVvdXRzLgogICovCiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9fdGNwLmMgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b190Y3AuYwppbmRleCAxNTNkNjYxLi5jY2RkNWQyIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b190Y3AuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b190Y3AuYwpAQCAtNCwyNCArNCw2IEBACiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIEpvenNlZiBLYWRsZWNzaWsgPGthZGxlY0BibGFja2hvbGUua2ZraS5odT46Ci0gKgktIFJlYWwgc3RhdGVmdWwgY29ubmVjdGlvbiB0cmFja2luZwotICoJLSBNb2RpZmllZCBzdGF0ZSB0cmFuc2l0aW9ucyB0YWJsZQotICoJLSBXaW5kb3cgc2NhbGluZyBzdXBwb3J0IGFkZGVkCi0gKgktIFNBQ0sgc3VwcG9ydCBhZGRlZAotICoKLSAqIFdpbGx5IFRhcnJlYXU6Ci0gKgktIFN0YXRlIHRhYmxlIGJ1Z2ZpeGVzCi0gKgktIE1vcmUgcm9idXN0IHN0YXRlIGNoYW5nZXMKLSAqCS0gVHVuaW5nIHRpbWVyIHBhcmFtZXRlcnMKLSAqCi0gKiAyNyBPY3QgMjAwNDogWWFzdXl1a2kgS296YWthaSBAVVNBR0kgPHlhc3V5dWtpLmtvemFrYWlAdG9zaGliYS5jby5qcD4KLSAqCS0gZ2VuZWxpemVkIExheWVyIDMgcHJvdG9jb2wgcGFydC4KLSAqCi0gKiBEZXJpdmVkIGZyb20gbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19wcm90b190Y3AuYwotICoKLSAqIHZlcnNpb24gMi4yCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CkBAIC00NzAsMTEgKzQ1MiwxMCBAQAogCiAJLyogRmFzdCBwYXRoIGZvciB0aW1lc3RhbXAtb25seSBvcHRpb24gKi8KIAlpZiAobGVuZ3RoID09IFRDUE9MRU5fVFNUQU1QX0FMSUdORUQqNAotCSAgICAmJiAqKF9fYmUzMiAqKXB0ciA9PQotCQlfX2NvbnN0YW50X2h0b25sKChUQ1BPUFRfTk9QIDw8IDI0KQotCQkJCSB8IChUQ1BPUFRfTk9QIDw8IDE2KQotCQkJCSB8IChUQ1BPUFRfVElNRVNUQU1QIDw8IDgpCi0JCQkJIHwgVENQT0xFTl9USU1FU1RBTVApKQorCSAgICAmJiAqKF9fYmUzMiAqKXB0ciA9PSBodG9ubCgoVENQT1BUX05PUCA8PCAyNCkKKwkJCQkgICAgICAgfCAoVENQT1BUX05PUCA8PCAxNikKKwkJCQkgICAgICAgfCAoVENQT1BUX1RJTUVTVEFNUCA8PCA4KQorCQkJCSAgICAgICB8IFRDUE9MRU5fVElNRVNUQU1QKSkKIAkJcmV0dXJuOwogCiAJd2hpbGUgKGxlbmd0aCA+IDApIHsKQEAgLTc2NSwyNiArNzQ2LDE4IEBACiAjZGVmaW5lCVRIX0VDRQkweDQwCiAjZGVmaW5lCVRIX0NXUgkweDgwCiAKLS8qIHRhYmxlIG9mIHZhbGlkIGZsYWcgY29tYmluYXRpb25zIC0gRUNFIGFuZCBDV1IgYXJlIGFsd2F5cyB2YWxpZCAqLwotc3RhdGljIHU4IHRjcF92YWxpZF9mbGFnc1soVEhfRklOfFRIX1NZTnxUSF9SU1R8VEhfUFVTSHxUSF9BQ0t8VEhfVVJHKSArIDFdID0KKy8qIHRhYmxlIG9mIHZhbGlkIGZsYWcgY29tYmluYXRpb25zIC0gUFVTSCwgRUNFIGFuZCBDV1IgYXJlIGFsd2F5cyB2YWxpZCAqLworc3RhdGljIHU4IHRjcF92YWxpZF9mbGFnc1soVEhfRklOfFRIX1NZTnxUSF9SU1R8VEhfQUNLfFRIX1VSRykgKyAxXSA9CiB7CiAJW1RIX1NZTl0JCQk9IDEsCi0JW1RIX1NZTnxUSF9QVVNIXQkJPSAxLAogCVtUSF9TWU58VEhfVVJHXQkJCT0gMSwKLQlbVEhfU1lOfFRIX1BVU0h8VEhfVVJHXQkJPSAxLAogCVtUSF9TWU58VEhfQUNLXQkJCT0gMSwKLQlbVEhfU1lOfFRIX0FDS3xUSF9QVVNIXQkJPSAxLAogCVtUSF9SU1RdCQkJPSAxLAogCVtUSF9SU1R8VEhfQUNLXQkJCT0gMSwKLQlbVEhfUlNUfFRIX0FDS3xUSF9QVVNIXQkJPSAxLAogCVtUSF9GSU58VEhfQUNLXQkJCT0gMSwKLQlbVEhfQUNLXQkJCT0gMSwKLQlbVEhfQUNLfFRIX1BVU0hdCQk9IDEsCi0JW1RIX0FDS3xUSF9VUkddCQkJPSAxLAotCVtUSF9BQ0t8VEhfVVJHfFRIX1BVU0hdCQk9IDEsCi0JW1RIX0ZJTnxUSF9BQ0t8VEhfUFVTSF0JCT0gMSwKIAlbVEhfRklOfFRIX0FDS3xUSF9VUkddCQk9IDEsCi0JW1RIX0ZJTnxUSF9BQ0t8VEhfVVJHfFRIX1BVU0hdCT0gMSwKKwlbVEhfQUNLXQkJCT0gMSwKKwlbVEhfQUNLfFRIX1VSR10JCQk9IDEsCiB9OwogCiAvKiBQcm90ZWN0IGNvbm50cmFjayBhZ2Fpc3QgYnJva2VuIHBhY2tldHMuIENvZGUgdGFrZW4gZnJvbSBpcHRfdW5jbGVhbi5jLiAgKi8KQEAgLTgzMSw3ICs4MDQsNyBAQAogCX0KIAogCS8qIENoZWNrIFRDUCBmbGFncy4gKi8KLQl0Y3BmbGFncyA9ICgoKHVfaW50OF90ICopdGgpWzEzXSAmIH4oVEhfRUNFfFRIX0NXUikpOworCXRjcGZsYWdzID0gKCgodV9pbnQ4X3QgKil0aClbMTNdICYgfihUSF9FQ0V8VEhfQ1dSfFRIX1BVU0gpKTsKIAlpZiAoIXRjcF92YWxpZF9mbGFnc1t0Y3BmbGFnc10pIHsKIAkJaWYgKExPR19JTlZBTElEKElQUFJPVE9fVENQKSkKIAkJCW5mX2xvZ19wYWNrZXQocGYsIDAsIHNrYiwgTlVMTCwgTlVMTCwgTlVMTCwKQEAgLTExMTAsMTEgKzEwODMsMjYgQEAKIAkJCSBjb25zdCBzdHJ1Y3QgbmZfY29ubiAqY3QpCiB7CiAJc3RydWN0IG5mYXR0ciAqbmVzdF9wYXJtczsKKwlzdHJ1Y3QgbmZfY3RfdGNwX2ZsYWdzIHRtcCA9IHt9OwogCiAJcmVhZF9sb2NrX2JoKCZ0Y3BfbG9jayk7CiAJbmVzdF9wYXJtcyA9IE5GQV9ORVNUKHNrYiwgQ1RBX1BST1RPSU5GT19UQ1ApOwogCU5GQV9QVVQoc2tiLCBDVEFfUFJPVE9JTkZPX1RDUF9TVEFURSwgc2l6ZW9mKHVfaW50OF90KSwKIAkJJmN0LT5wcm90by50Y3Auc3RhdGUpOworCisJTkZBX1BVVChza2IsIENUQV9QUk9UT0lORk9fVENQX1dTQ0FMRV9PUklHSU5BTCwgc2l6ZW9mKHVfaW50OF90KSwKKwkJJmN0LT5wcm90by50Y3Auc2VlblswXS50ZF9zY2FsZSk7CisKKwlORkFfUFVUKHNrYiwgQ1RBX1BST1RPSU5GT19UQ1BfV1NDQUxFX1JFUExZLCBzaXplb2YodV9pbnQ4X3QpLAorCQkmY3QtPnByb3RvLnRjcC5zZWVuWzFdLnRkX3NjYWxlKTsKKworCXRtcC5mbGFncyA9IGN0LT5wcm90by50Y3Auc2VlblswXS5mbGFnczsKKwlORkFfUFVUKHNrYiwgQ1RBX1BST1RPSU5GT19UQ1BfRkxBR1NfT1JJR0lOQUwsCisJCXNpemVvZihzdHJ1Y3QgbmZfY3RfdGNwX2ZsYWdzKSwgJnRtcCk7CisKKwl0bXAuZmxhZ3MgPSBjdC0+cHJvdG8udGNwLnNlZW5bMV0uZmxhZ3M7CisJTkZBX1BVVChza2IsIENUQV9QUk9UT0lORk9fVENQX0ZMQUdTX1JFUExZLAorCQlzaXplb2Yoc3RydWN0IG5mX2N0X3RjcF9mbGFncyksICZ0bXApOwogCXJlYWRfdW5sb2NrX2JoKCZ0Y3BfbG9jayk7CiAKIAlORkFfTkVTVF9FTkQoc2tiLCBuZXN0X3Bhcm1zKTsKQEAgLTExMjcsNyArMTExNSwxMSBAQAogfQogCiBzdGF0aWMgY29uc3Qgc2l6ZV90IGN0YV9taW5fdGNwW0NUQV9QUk9UT0lORk9fVENQX01BWF0gPSB7Ci0JW0NUQV9QUk9UT0lORk9fVENQX1NUQVRFLTFdCT0gc2l6ZW9mKHVfaW50OF90KSwKKwlbQ1RBX1BST1RPSU5GT19UQ1BfU1RBVEUtMV0JICAgICAgPSBzaXplb2YodV9pbnQ4X3QpLAorCVtDVEFfUFJPVE9JTkZPX1RDUF9XU0NBTEVfT1JJR0lOQUwtMV0gPSBzaXplb2YodV9pbnQ4X3QpLAorCVtDVEFfUFJPVE9JTkZPX1RDUF9XU0NBTEVfUkVQTFktMV0gICAgPSBzaXplb2YodV9pbnQ4X3QpLAorCVtDVEFfUFJPVE9JTkZPX1RDUF9GTEFHU19PUklHSU5BTC0xXSAgPSBzaXplb2Yoc3RydWN0IG5mX2N0X3RjcF9mbGFncyksCisJW0NUQV9QUk9UT0lORk9fVENQX0ZMQUdTX1JFUExZLTFdICAgICA9IHNpemVvZihzdHJ1Y3QgbmZfY3RfdGNwX2ZsYWdzKQogfTsKIAogc3RhdGljIGludCBuZmF0dHJfdG9fdGNwKHN0cnVjdCBuZmF0dHIgKmNkYVtdLCBzdHJ1Y3QgbmZfY29ubiAqY3QpCkBAIC0xMTUxLDYgKzExNDMsMzAgQEAKIAl3cml0ZV9sb2NrX2JoKCZ0Y3BfbG9jayk7CiAJY3QtPnByb3RvLnRjcC5zdGF0ZSA9CiAJCSoodV9pbnQ4X3QgKilORkFfREFUQSh0YltDVEFfUFJPVE9JTkZPX1RDUF9TVEFURS0xXSk7CisKKwlpZiAodGJbQ1RBX1BST1RPSU5GT19UQ1BfRkxBR1NfT1JJR0lOQUwtMV0pIHsKKwkJc3RydWN0IG5mX2N0X3RjcF9mbGFncyAqYXR0ciA9CisJCQlORkFfREFUQSh0YltDVEFfUFJPVE9JTkZPX1RDUF9GTEFHU19PUklHSU5BTC0xXSk7CisJCWN0LT5wcm90by50Y3Auc2VlblswXS5mbGFncyAmPSB+YXR0ci0+bWFzazsKKwkJY3QtPnByb3RvLnRjcC5zZWVuWzBdLmZsYWdzIHw9IGF0dHItPmZsYWdzICYgYXR0ci0+bWFzazsKKwl9CisKKwlpZiAodGJbQ1RBX1BST1RPSU5GT19UQ1BfRkxBR1NfUkVQTFktMV0pIHsKKwkJc3RydWN0IG5mX2N0X3RjcF9mbGFncyAqYXR0ciA9CisJCQlORkFfREFUQSh0YltDVEFfUFJPVE9JTkZPX1RDUF9GTEFHU19SRVBMWS0xXSk7CisJCWN0LT5wcm90by50Y3Auc2VlblsxXS5mbGFncyAmPSB+YXR0ci0+bWFzazsKKwkJY3QtPnByb3RvLnRjcC5zZWVuWzFdLmZsYWdzIHw9IGF0dHItPmZsYWdzICYgYXR0ci0+bWFzazsKKwl9CisKKwlpZiAodGJbQ1RBX1BST1RPSU5GT19UQ1BfV1NDQUxFX09SSUdJTkFMLTFdICYmCisJICAgIHRiW0NUQV9QUk9UT0lORk9fVENQX1dTQ0FMRV9SRVBMWS0xXSAmJgorCSAgICBjdC0+cHJvdG8udGNwLnNlZW5bMF0uZmxhZ3MgJiBJUF9DVF9UQ1BfRkxBR19XSU5ET1dfU0NBTEUgJiYKKwkgICAgY3QtPnByb3RvLnRjcC5zZWVuWzFdLmZsYWdzICYgSVBfQ1RfVENQX0ZMQUdfV0lORE9XX1NDQUxFKSB7CisJCWN0LT5wcm90by50Y3Auc2VlblswXS50ZF9zY2FsZSA9ICoodV9pbnQ4X3QgKikKKwkJCU5GQV9EQVRBKHRiW0NUQV9QUk9UT0lORk9fVENQX1dTQ0FMRV9PUklHSU5BTC0xXSk7CisJCWN0LT5wcm90by50Y3Auc2VlblsxXS50ZF9zY2FsZSA9ICoodV9pbnQ4X3QgKikKKwkJCU5GQV9EQVRBKHRiW0NUQV9QUk9UT0lORk9fVENQX1dTQ0FMRV9SRVBMWS0xXSk7CisJfQogCXdyaXRlX3VubG9ja19iaCgmdGNwX2xvY2spOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b191ZHAuYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX3VkcC5jCmluZGV4IGE1ZTU3MjYuLjM2MjBlY2MgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX3VkcC5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX3VkcC5jCkBAIC00LDExICs0LDYgQEAKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogMTYgRGVjIDIwMDM6IFlhc3V5dWtpIEtvemFrYWkgQFVTQUdJIDx5YXN1eXVraS5rb3pha2FpQHRvc2hpYmEuY28uanA+Ci0gKgktIGVuYWJsZSB3b3JraW5nIHdpdGggTGF5ZXIgMyBwcm90b2NvbCBpbmRlcGVuZGVudCBjb25uZWN0aW9uIHRyYWNraW5nLgotICoKLSAqIERlcml2ZWQgZnJvbSBuZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX3Byb3RvX3VkcC5jCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19zdGFuZGFsb25lLmMgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19zdGFuZGFsb25lLmMKaW5kZXggYjg1ODYzNi4uNDViYWViMCAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfc3RhbmRhbG9uZS5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3N0YW5kYWxvbmUuYwpAQCAtMSwyMCArMSw5IEBACi0vKiBUaGlzIGZpbGUgY29udGFpbnMgYWxsIHRoZSBmdW5jdGlvbnMgcmVxdWlyZWQgZm9yIHRoZSBzdGFuZGFsb25lCi0gICBuZl9jb25udHJhY2sgbW9kdWxlLgotCi0gICBUaGVzZSBhcmUgbm90IHJlcXVpcmVkIGJ5IHRoZSBjb21wYXRpYmlsaXR5IGxheWVyLgotKi8KLQogLyogKEMpIDE5OTktMjAwMSBQYXVsIGBSdXN0eScgUnVzc2VsbAogICogKEMpIDIwMDItMjAwNCBOZXRmaWx0ZXIgQ29yZSBUZWFtIDxjb3JldGVhbUBuZXRmaWx0ZXIub3JnPgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogMTYgRGVjIDIwMDM6IFlhc3V5dWtpIEtvemFrYWkgQFVTQUdJIDx5YXN1eXVraS5rb3pha2FpQHRvc2hpYmEuY28uanA+Ci0gKgktIGdlbmVyYWxpemUgTDMgcHJvdG9jb2wgZGVwZW5kZW50IHBhcnQuCi0gKgotICogRGVyaXZlZCBmcm9tIG5ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfc3RhbmRhbG9uZS5jCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mbmV0bGluay5jIGIvbmV0L25ldGZpbHRlci9uZm5ldGxpbmsuYwppbmRleCBiZjIzZTQ4Li44Nzk3ZTY5IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mbmV0bGluay5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZuZXRsaW5rLmMKQEAgLTMsNyArMyw3IEBACiAgKgogICogKEMpIDIwMDEgYnkgSmF5IFNjaHVsaXN0IDxqc2NobHN0QHNhbWJhLm9yZz4sCiAgKiAoQykgMjAwMi0yMDA1IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+Ci0gKiAoQykgMjAwNSBieSBQYWJsbyBOZWlyYSBBeXVzbyA8cGFibG9AZXVyb2Rldi5uZXQ+CisgKiAoQykgMjAwNSwyMDA3IGJ5IFBhYmxvIE5laXJhIEF5dXNvIDxwYWJsb0BuZXRmaWx0ZXIub3JnPgogICoKICAqIEluaXRpYWwgbmV0ZmlsdGVyIG1lc3NhZ2VzIHZpYSBuZXRsaW5rIGRldmVsb3BtZW50IGZ1bmRlZCBhbmQKICAqIGdlbmVyYWxseSBtYWRlIHBvc3NpYmxlIGJ5IE5ldHdvcmsgUm9ib3RzLCBJbmMuICh3d3cubmV0d29ya3JvYm90cy5jb20pCkBAIC0yOCwxMCArMjgsOSBAQAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bmV0L25ldGxpbmsuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KIAotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIvbmZuZXRsaW5rLmg+CiAKQEAgLTQxLDMyICs0MCwzNCBAQAogCiBzdGF0aWMgY2hhciBfX2luaXRkYXRhIG5mdmVyc2lvbltdID0gIjAuMzAiOwogCi0jaWYgMAotI2RlZmluZSBERUJVR1AoZm9ybWF0LCBhcmdzLi4uKQlcCi0JCXByaW50ayhLRVJOX0RFQlVHICIlcyglZCk6JXMoKTogIiBmb3JtYXQsIF9fRklMRV9fLCBcCi0JCQlfX0xJTkVfXywgX19GVU5DVElPTl9fLCAjIyBhcmdzKQotI2Vsc2UKLSNkZWZpbmUgREVCVUdQKGZvcm1hdCwgYXJncy4uLikKLSNlbmRpZgotCiBzdGF0aWMgc3RydWN0IHNvY2sgKm5mbmwgPSBOVUxMOwogc3RhdGljIHN0cnVjdCBuZm5ldGxpbmtfc3Vic3lzdGVtICpzdWJzeXNfdGFibGVbTkZOTF9TVUJTWVNfQ09VTlRdOwotREVDTEFSRV9NVVRFWChuZm5sX3NlbSk7CitzdGF0aWMgREVGSU5FX01VVEVYKG5mbmxfbXV0ZXgpOwogCi12b2lkIG5mbmxfbG9jayh2b2lkKQorc3RhdGljIHZvaWQgbmZubF9sb2NrKHZvaWQpCiB7Ci0JbmZubF9zaGxvY2soKTsKKwltdXRleF9sb2NrKCZuZm5sX211dGV4KTsKIH0KIAotdm9pZCBuZm5sX3VubG9jayh2b2lkKQorc3RhdGljIGludCBuZm5sX3RyeWxvY2sodm9pZCkKIHsKLQluZm5sX3NodW5sb2NrKCk7CisJcmV0dXJuICFtdXRleF90cnlsb2NrKCZuZm5sX211dGV4KTsKK30KKworc3RhdGljIHZvaWQgX19uZm5sX3VubG9jayh2b2lkKQoreworCW11dGV4X3VubG9jaygmbmZubF9tdXRleCk7Cit9CisKK3N0YXRpYyB2b2lkIG5mbmxfdW5sb2NrKHZvaWQpCit7CisJbXV0ZXhfdW5sb2NrKCZuZm5sX211dGV4KTsKKwlpZiAobmZubC0+c2tfcmVjZWl2ZV9xdWV1ZS5xbGVuKQorCQluZm5sLT5za19kYXRhX3JlYWR5KG5mbmwsIDApOwogfQogCiBpbnQgbmZuZXRsaW5rX3N1YnN5c19yZWdpc3RlcihzdHJ1Y3QgbmZuZXRsaW5rX3N1YnN5c3RlbSAqbikKIHsKLQlERUJVR1AoInJlZ2lzdGVyaW5nIHN1YnN5c3RlbSBJRCAldVxuIiwgbi0+c3Vic3lzX2lkKTsKLQogCW5mbmxfbG9jaygpOwogCWlmIChzdWJzeXNfdGFibGVbbi0+c3Vic3lzX2lkXSkgewogCQluZm5sX3VubG9jaygpOwpAQCAtNzcsMjQgKzc4LDIzIEBACiAKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKG5mbmV0bGlua19zdWJzeXNfcmVnaXN0ZXIpOwogCiBpbnQgbmZuZXRsaW5rX3N1YnN5c191bnJlZ2lzdGVyKHN0cnVjdCBuZm5ldGxpbmtfc3Vic3lzdGVtICpuKQogewotCURFQlVHUCgidW5yZWdpc3RlcmluZyBzdWJzeXN0ZW0gSUQgJXVcbiIsIG4tPnN1YnN5c19pZCk7Ci0KIAluZm5sX2xvY2soKTsKIAlzdWJzeXNfdGFibGVbbi0+c3Vic3lzX2lkXSA9IE5VTEw7CiAJbmZubF91bmxvY2soKTsKIAogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTF9HUEwobmZuZXRsaW5rX3N1YnN5c191bnJlZ2lzdGVyKTsKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgbmZuZXRsaW5rX3N1YnN5c3RlbSAqbmZuZXRsaW5rX2dldF9zdWJzeXModV9pbnQxNl90IHR5cGUpCiB7CiAJdV9pbnQ4X3Qgc3Vic3lzX2lkID0gTkZOTF9TVUJTWVNfSUQodHlwZSk7CiAKLQlpZiAoc3Vic3lzX2lkID49IE5GTkxfU1VCU1lTX0NPVU5UCi0JICAgIHx8IHN1YnN5c190YWJsZVtzdWJzeXNfaWRdID09IE5VTEwpCisJaWYgKHN1YnN5c19pZCA+PSBORk5MX1NVQlNZU19DT1VOVCkKIAkJcmV0dXJuIE5VTEw7CiAKIAlyZXR1cm4gc3Vic3lzX3RhYmxlW3N1YnN5c19pZF07CkBAIC0xMDUsMTAgKzEwNSw4IEBACiB7CiAJdV9pbnQ4X3QgY2JfaWQgPSBORk5MX01TR19UWVBFKHR5cGUpOwogCi0JaWYgKGNiX2lkID49IHNzLT5jYl9jb3VudCkgewotCQlERUJVR1AoIm1zZ3R5cGUgJXUgPj0gJXUsIHJldHVybmluZ1xuIiwgdHlwZSwgc3MtPmNiX2NvdW50KTsKKwlpZiAoY2JfaWQgPj0gc3MtPmNiX2NvdW50KQogCQlyZXR1cm4gTlVMTDsKLQl9CiAKIAlyZXR1cm4gJnNzLT5jYltjYl9pZF07CiB9CkBAIC0xMjUsNiArMTIzLDcgQEAKIAltZW1jcHkoTkZBX0RBVEEobmZhKSwgZGF0YSwgYXR0cmxlbik7CiAJbWVtc2V0KE5GQV9EQVRBKG5mYSkgKyBhdHRybGVuLCAwLCBORkFfQUxJR04oc2l6ZSkgLSBzaXplKTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKF9fbmZhX2ZpbGwpOwogCiB2b2lkIG5mYXR0cl9wYXJzZShzdHJ1Y3QgbmZhdHRyICp0YltdLCBpbnQgbWF4YXR0ciwgc3RydWN0IG5mYXR0ciAqbmZhLCBpbnQgbGVuKQogewpAQCAtMTM3LDYgKzEzNiw3IEBACiAJCW5mYSA9IE5GQV9ORVhUKG5mYSwgbGVuKTsKIAl9CiB9CitFWFBPUlRfU1lNQk9MX0dQTChuZmF0dHJfcGFyc2UpOwogCiAvKioKICAqIG5mbmV0bGlua19jaGVja19hdHRyaWJ1dGVzIC0gY2hlY2sgYW5kIHBhcnNlIG5mbmV0bGluayBhdHRyaWJ1dGVzCkBAIC0xNTAsMzcgKzE1MCwxNSBAQAogbmZuZXRsaW5rX2NoZWNrX2F0dHJpYnV0ZXMoc3RydWN0IG5mbmV0bGlua19zdWJzeXN0ZW0gKnN1YnN5cywKIAkJCSAgIHN0cnVjdCBubG1zZ2hkciAqbmxoLCBzdHJ1Y3QgbmZhdHRyICpjZGFbXSkKIHsKLQlpbnQgbWluX2xlbjsKLQl1X2ludDE2X3QgYXR0cl9jb3VudDsKKwlpbnQgbWluX2xlbiA9IE5MTVNHX1NQQUNFKHNpemVvZihzdHJ1Y3QgbmZnZW5tc2cpKTsKIAl1X2ludDhfdCBjYl9pZCA9IE5GTkxfTVNHX1RZUEUobmxoLT5ubG1zZ190eXBlKTsKLQotCWlmICh1bmxpa2VseShjYl9pZCA+PSBzdWJzeXMtPmNiX2NvdW50KSkgewotCQlERUJVR1AoIm1zZ3R5cGUgJXUgPj0gJXUsIHJldHVybmluZ1xuIiwKLQkJCWNiX2lkLCBzdWJzeXMtPmNiX2NvdW50KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JbWluX2xlbiA9IE5MTVNHX1NQQUNFKHNpemVvZihzdHJ1Y3QgbmZnZW5tc2cpKTsKLQlpZiAodW5saWtlbHkobmxoLT5ubG1zZ19sZW4gPCBtaW5fbGVuKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlhdHRyX2NvdW50ID0gc3Vic3lzLT5jYltjYl9pZF0uYXR0cl9jb3VudDsKLQltZW1zZXQoY2RhLCAwLCBzaXplb2Yoc3RydWN0IG5mYXR0ciAqKSAqIGF0dHJfY291bnQpOworCXVfaW50MTZfdCBhdHRyX2NvdW50ID0gc3Vic3lzLT5jYltjYl9pZF0uYXR0cl9jb3VudDsKIAogCS8qIGNoZWNrIGF0dHJpYnV0ZSBsZW5ndGhzLiAqLwogCWlmIChsaWtlbHkobmxoLT5ubG1zZ19sZW4gPiBtaW5fbGVuKSkgewogCQlzdHJ1Y3QgbmZhdHRyICphdHRyID0gTkZNX05GQShOTE1TR19EQVRBKG5saCkpOwogCQlpbnQgYXR0cmxlbiA9IG5saC0+bmxtc2dfbGVuIC0gTkxNU0dfQUxJR04obWluX2xlbik7Ci0KLQkJd2hpbGUgKE5GQV9PSyhhdHRyLCBhdHRybGVuKSkgewotCQkJdW5zaWduZWQgZmxhdm9yID0gTkZBX1RZUEUoYXR0cik7Ci0JCQlpZiAoZmxhdm9yKSB7Ci0JCQkJaWYgKGZsYXZvciA+IGF0dHJfY291bnQpCi0JCQkJCXJldHVybiAtRUlOVkFMOwotCQkJCWNkYVtmbGF2b3IgLSAxXSA9IGF0dHI7Ci0JCQl9Ci0JCQlhdHRyID0gTkZBX05FWFQoYXR0ciwgYXR0cmxlbik7Ci0JCX0KKwkJbmZhdHRyX3BhcnNlKGNkYSwgYXR0cl9jb3VudCwgYXR0ciwgYXR0cmxlbik7CiAJfQogCiAJLyogaW1wbGljaXQ6IGlmIG5sbXNnX2xlbiA9PSBtaW5fbGVuLCB3ZSByZXR1cm4gMCwgYW5kIGFuIGVtcHR5CkBAIC0yMDgsNjIgKzE4Niw0NiBAQAogCiAJcmV0dXJuIGVycjsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKG5mbmV0bGlua19zZW5kKTsKIAogaW50IG5mbmV0bGlua191bmljYXN0KHN0cnVjdCBza19idWZmICpza2IsIHVfaW50MzJfdCBwaWQsIGludCBmbGFncykKIHsKIAlyZXR1cm4gbmV0bGlua191bmljYXN0KG5mbmwsIHNrYiwgcGlkLCBmbGFncyk7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChuZm5ldGxpbmtfdW5pY2FzdCk7CiAKIC8qIFByb2Nlc3Mgb25lIGNvbXBsZXRlIG5mbmV0bGluayBtZXNzYWdlLiAqLwotc3RhdGljIGludCBuZm5ldGxpbmtfcmN2X21zZyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCSAgICBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgaW50ICplcnJwKQorc3RhdGljIGludCBuZm5ldGxpbmtfcmN2X21zZyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCkKIHsKIAlzdHJ1Y3QgbmZubF9jYWxsYmFjayAqbmM7CiAJc3RydWN0IG5mbmV0bGlua19zdWJzeXN0ZW0gKnNzOwotCWludCB0eXBlLCBlcnIgPSAwOworCWludCB0eXBlLCBlcnI7CiAKLQlERUJVR1AoImVudGVyZWQ7IHN1YnN5cz0ldSwgbXNndHlwZT0ldVxuIiwKLQkJIE5GTkxfU1VCU1lTX0lEKG5saC0+bmxtc2dfdHlwZSksCi0JCSBORk5MX01TR19UWVBFKG5saC0+bmxtc2dfdHlwZSkpOwotCi0JaWYgKHNlY3VyaXR5X25ldGxpbmtfcmVjdihza2IsIENBUF9ORVRfQURNSU4pKSB7Ci0JCURFQlVHUCgibWlzc2luZyBDQVBfTkVUX0FETUlOXG4iKTsKLQkJKmVycnAgPSAtRVBFUk07Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKiBPbmx5IHJlcXVlc3RzIGFyZSBoYW5kbGVkIGJ5IGtlcm5lbCBub3cuICovCi0JaWYgKCEobmxoLT5ubG1zZ19mbGFncyAmIE5MTV9GX1JFUVVFU1QpKSB7Ci0JCURFQlVHUCgicmVjZWl2ZWQgbm9uLXJlcXVlc3QgbWVzc2FnZVxuIik7Ci0JCXJldHVybiAwOwotCX0KKwlpZiAoc2VjdXJpdHlfbmV0bGlua19yZWN2KHNrYiwgQ0FQX05FVF9BRE1JTikpCisJCXJldHVybiAtRVBFUk07CiAKIAkvKiBBbGwgdGhlIG1lc3NhZ2VzIG11c3QgYXQgbGVhc3QgY29udGFpbiBuZmdlbm1zZyAqLwotCWlmIChubGgtPm5sbXNnX2xlbiA8IE5MTVNHX1NQQUNFKHNpemVvZihzdHJ1Y3QgbmZnZW5tc2cpKSkgewotCQlERUJVR1AoInJlY2VpdmVkIG1lc3NhZ2Ugd2FzIHRvbyBzaG9ydFxuIik7CisJaWYgKG5saC0+bmxtc2dfbGVuIDwgTkxNU0dfU1BBQ0Uoc2l6ZW9mKHN0cnVjdCBuZmdlbm1zZykpKQogCQlyZXR1cm4gMDsKLQl9CiAKIAl0eXBlID0gbmxoLT5ubG1zZ190eXBlOwogCXNzID0gbmZuZXRsaW5rX2dldF9zdWJzeXModHlwZSk7CiAJaWYgKCFzcykgewogI2lmZGVmIENPTkZJR19LTU9ECi0JCS8qIGRvbid0IGNhbGwgbmZubF9zaHVubG9jaywgc2luY2UgaXQgd291bGQgcmVlbnRlcgorCQkvKiBkb24ndCBjYWxsIG5mbmxfdW5sb2NrLCBzaW5jZSBpdCB3b3VsZCByZWVudGVyCiAJCSAqIHdpdGggZnVydGhlciBwYWNrZXQgcHJvY2Vzc2luZyAqLwotCQl1cCgmbmZubF9zZW0pOworCQlfX25mbmxfdW5sb2NrKCk7CiAJCXJlcXVlc3RfbW9kdWxlKCJuZm5ldGxpbmstc3Vic3lzLSVkIiwgTkZOTF9TVUJTWVNfSUQodHlwZSkpOwotCQluZm5sX3NobG9jaygpOworCQluZm5sX2xvY2soKTsKIAkJc3MgPSBuZm5ldGxpbmtfZ2V0X3N1YnN5cyh0eXBlKTsKIAkJaWYgKCFzcykKICNlbmRpZgotCQkJZ290byBlcnJfaW52YWw7CisJCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAluYyA9IG5mbmV0bGlua19maW5kX2NsaWVudCh0eXBlLCBzcyk7Ci0JaWYgKCFuYykgewotCQlERUJVR1AoInVuYWJsZSB0byBmaW5kIGNsaWVudCBmb3IgdHlwZSAlZFxuIiwgdHlwZSk7Ci0JCWdvdG8gZXJyX2ludmFsOwotCX0KKwlpZiAoIW5jKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCXsKIAkJdV9pbnQxNl90IGF0dHJfY291bnQgPQpAQCAtMjc0LDczICsyMzYsMjEgQEAKIAogCQllcnIgPSBuZm5ldGxpbmtfY2hlY2tfYXR0cmlidXRlcyhzcywgbmxoLCBjZGEpOwogCQlpZiAoZXJyIDwgMCkKLQkJCWdvdG8gZXJyX2ludmFsOwotCi0JCURFQlVHUCgiY2FsbGluZyBoYW5kbGVyXG4iKTsKLQkJZXJyID0gbmMtPmNhbGwobmZubCwgc2tiLCBubGgsIGNkYSwgZXJycCk7Ci0JCSplcnJwID0gZXJyOwotCQlyZXR1cm4gZXJyOworCQkJcmV0dXJuIGVycjsKKwkJcmV0dXJuIG5jLT5jYWxsKG5mbmwsIHNrYiwgbmxoLCBjZGEpOwogCX0KLQotZXJyX2ludmFsOgotCURFQlVHUCgicmV0dXJuaW5nIC1FSU5WQUxcbiIpOwotCSplcnJwID0gLUVJTlZBTDsKLQlyZXR1cm4gLTE7Ci19Ci0KLS8qIFByb2Nlc3Mgb25lIHBhY2tldCBvZiBtZXNzYWdlcy4gKi8KLXN0YXRpYyBpbmxpbmUgaW50IG5mbmV0bGlua19yY3Zfc2tiKHN0cnVjdCBza19idWZmICpza2IpCi17Ci0JaW50IGVycjsKLQlzdHJ1Y3Qgbmxtc2doZHIgKm5saDsKLQotCXdoaWxlIChza2ItPmxlbiA+PSBOTE1TR19TUEFDRSgwKSkgewotCQl1MzIgcmxlbjsKLQotCQlubGggPSAoc3RydWN0IG5sbXNnaGRyICopc2tiLT5kYXRhOwotCQlpZiAobmxoLT5ubG1zZ19sZW4gPCBzaXplb2Yoc3RydWN0IG5sbXNnaGRyKQotCQkgICAgfHwgc2tiLT5sZW4gPCBubGgtPm5sbXNnX2xlbikKLQkJCXJldHVybiAwOwotCQlybGVuID0gTkxNU0dfQUxJR04obmxoLT5ubG1zZ19sZW4pOwotCQlpZiAocmxlbiA+IHNrYi0+bGVuKQotCQkJcmxlbiA9IHNrYi0+bGVuOwotCQlpZiAobmZuZXRsaW5rX3Jjdl9tc2coc2tiLCBubGgsICZlcnIpKSB7Ci0JCQlpZiAoIWVycikKLQkJCQlyZXR1cm4gLTE7Ci0JCQluZXRsaW5rX2Fjayhza2IsIG5saCwgZXJyKTsKLQkJfSBlbHNlCi0JCQlpZiAobmxoLT5ubG1zZ19mbGFncyAmIE5MTV9GX0FDSykKLQkJCQluZXRsaW5rX2Fjayhza2IsIG5saCwgMCk7Ci0JCXNrYl9wdWxsKHNrYiwgcmxlbik7Ci0JfQotCi0JcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIG5mbmV0bGlua19yY3Yoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGVuKQogeworCXVuc2lnbmVkIGludCBxbGVuID0gMDsKKwogCWRvIHsKLQkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQotCQlpZiAobmZubF9zaGxvY2tfbm93YWl0KCkpCisJCWlmIChuZm5sX3RyeWxvY2soKSkKIAkJCXJldHVybjsKLQotCQl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSkpICE9IE5VTEwpIHsKLQkJCWlmIChuZm5ldGxpbmtfcmN2X3NrYihza2IpKSB7Ci0JCQkJaWYgKHNrYi0+bGVuKQotCQkJCQlza2JfcXVldWVfaGVhZCgmc2stPnNrX3JlY2VpdmVfcXVldWUsCi0JCQkJCQkgICAgICAgc2tiKTsKLQkJCQllbHNlCi0JCQkJCWtmcmVlX3NrYihza2IpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJa2ZyZWVfc2tiKHNrYik7Ci0JCX0KLQotCQkvKiBkb24ndCBjYWxsIG5mbmxfc2h1bmxvY2ssIHNpbmNlIGl0IHdvdWxkIHJlZW50ZXIKLQkJICogd2l0aCBmdXJ0aGVyIHBhY2tldCBwcm9jZXNzaW5nICovCi0JCXVwKCZuZm5sX3NlbSk7Ci0JfSB3aGlsZShuZm5sICYmIG5mbmwtPnNrX3JlY2VpdmVfcXVldWUucWxlbik7CisJCW5ldGxpbmtfcnVuX3F1ZXVlKHNrLCAmcWxlbiwgbmZuZXRsaW5rX3Jjdl9tc2cpOworCQlfX25mbmxfdW5sb2NrKCk7CisJfSB3aGlsZSAocWxlbik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBuZm5ldGxpbmtfZXhpdCh2b2lkKQpAQCAtMzU1LDcgKzI2NSw3IEBACiAJcHJpbnRrKCJOZXRmaWx0ZXIgbWVzc2FnZXMgdmlhIE5FVExJTksgdiVzLlxuIiwgbmZ2ZXJzaW9uKTsKIAogCW5mbmwgPSBuZXRsaW5rX2tlcm5lbF9jcmVhdGUoTkVUTElOS19ORVRGSUxURVIsIE5GTkxHUlBfTUFYLAotCQkJCSAgICAgbmZuZXRsaW5rX3JjdiwgVEhJU19NT0RVTEUpOworCQkJCSAgICAgbmZuZXRsaW5rX3JjdiwgTlVMTCwgVEhJU19NT0RVTEUpOwogCWlmICghbmZubCkgewogCQlwcmludGsoS0VSTl9FUlIgImNhbm5vdCBpbml0aWFsaXplIG5mbmV0bGluayFcbiIpOwogCQlyZXR1cm4gLTE7CkBAIC0zNjYsMTAgKzI3NiwzIEBACiAKIG1vZHVsZV9pbml0KG5mbmV0bGlua19pbml0KTsKIG1vZHVsZV9leGl0KG5mbmV0bGlua19leGl0KTsKLQotRVhQT1JUX1NZTUJPTF9HUEwobmZuZXRsaW5rX3N1YnN5c19yZWdpc3Rlcik7Ci1FWFBPUlRfU1lNQk9MX0dQTChuZm5ldGxpbmtfc3Vic3lzX3VucmVnaXN0ZXIpOwotRVhQT1JUX1NZTUJPTF9HUEwobmZuZXRsaW5rX3NlbmQpOwotRVhQT1JUX1NZTUJPTF9HUEwobmZuZXRsaW5rX3VuaWNhc3QpOwotRVhQT1JUX1NZTUJPTF9HUEwobmZhdHRyX3BhcnNlKTsKLUVYUE9SVF9TWU1CT0xfR1BMKF9fbmZhX2ZpbGwpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZm5ldGxpbmtfbG9nLmMgYi9uZXQvbmV0ZmlsdGVyL25mbmV0bGlua19sb2cuYwppbmRleCA1Y2IzMGViLi5lMzJlMzBlIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mbmV0bGlua19sb2cuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mbmV0bGlua19sb2cuYwpAQCAtMTAsMTEgKzEwLDYgQEAKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogMjAwNi0wMS0yNiBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAbmV0ZmlsdGVyLm9yZz4KLSAqIAktIEFkZCBvcHRpb25hbCBsb2NhbCBhbmQgZ2xvYmFsIHNlcXVlbmNlIG51bWJlciB0byBkZXRlY3QgbG9zdAotICogCSAgZXZlbnRzIGZyb20gdXNlcnNwYWNlCi0gKgogICovCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CkBAIC0xNjMsMTAgKzE1OCw3IEBACiAJLyogbmVlZHMgdG8gYmUgdHdvLCBzaW5jZSB3ZSBfcHV0KCkgYWZ0ZXIgY3JlYXRpb24gKi8KIAlhdG9taWNfc2V0KCZpbnN0LT51c2UsIDIpOwogCi0JaW5pdF90aW1lcigmaW5zdC0+dGltZXIpOwotCWluc3QtPnRpbWVyLmZ1bmN0aW9uID0gbmZ1bG5sX3RpbWVyOwotCWluc3QtPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylpbnN0OwotCS8qIGRvbid0IHN0YXJ0IHRpbWVyIHlldC4gKHJlKXN0YXJ0IGl0ICB3aXRoIGV2ZXJ5IHBhY2tldCAqLworCXNldHVwX3RpbWVyKCZpbnN0LT50aW1lciwgbmZ1bG5sX3RpbWVyLCAodW5zaWduZWQgbG9uZylpbnN0KTsKIAogCWluc3QtPnBlZXJfcGlkID0gcGlkOwogCWluc3QtPmdyb3VwX251bSA9IGdyb3VwX251bTsKQEAgLTIwMCwyMCArMTkyLDE0IEBACiBzdGF0aWMgaW50IF9fbmZ1bG5sX3NlbmQoc3RydWN0IG5mdWxubF9pbnN0YW5jZSAqaW5zdCk7CiAKIHN0YXRpYyB2b2lkCi1faW5zdGFuY2VfZGVzdHJveTIoc3RydWN0IG5mdWxubF9pbnN0YW5jZSAqaW5zdCwgaW50IGxvY2spCitfX2luc3RhbmNlX2Rlc3Ryb3koc3RydWN0IG5mdWxubF9pbnN0YW5jZSAqaW5zdCkKIHsKIAkvKiBmaXJzdCBwdWxsIGl0IG91dCBvZiB0aGUgZ2xvYmFsIGxpc3QgKi8KLQlpZiAobG9jaykKLQkJd3JpdGVfbG9ja19iaCgmaW5zdGFuY2VzX2xvY2spOwotCiAJVURFQlVHKCJyZW1vdmluZyBpbnN0YW5jZSAlcCAocXVldWVudW09JXUpIGZyb20gaGFzaFxuIiwKIAkJaW5zdCwgaW5zdC0+Z3JvdXBfbnVtKTsKIAogCWhsaXN0X2RlbCgmaW5zdC0+aGxpc3QpOwogCi0JaWYgKGxvY2spCi0JCXdyaXRlX3VubG9ja19iaCgmaW5zdGFuY2VzX2xvY2spOwotCiAJLyogdGhlbiBmbHVzaCBhbGwgcGVuZGluZyBwYWNrZXRzIGZyb20gc2tiICovCiAKIAlzcGluX2xvY2tfYmgoJmluc3QtPmxvY2spOwpAQCAtMjM1LDE1ICsyMjEsMTEgQEAKIH0KIAogc3RhdGljIGlubGluZSB2b2lkCi1fX2luc3RhbmNlX2Rlc3Ryb3koc3RydWN0IG5mdWxubF9pbnN0YW5jZSAqaW5zdCkKLXsKLQlfaW5zdGFuY2VfZGVzdHJveTIoaW5zdCwgMCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAogaW5zdGFuY2VfZGVzdHJveShzdHJ1Y3QgbmZ1bG5sX2luc3RhbmNlICppbnN0KQogewotCV9pbnN0YW5jZV9kZXN0cm95MihpbnN0LCAxKTsKKwl3cml0ZV9sb2NrX2JoKCZpbnN0YW5jZXNfbG9jayk7CisJX19pbnN0YW5jZV9kZXN0cm95KGluc3QpOworCXdyaXRlX3VubG9ja19iaCgmaW5zdGFuY2VzX2xvY2spOwogfQogCiBzdGF0aWMgaW50CkBAIC0zNjUsOSArMzQ3LDYgQEAKIHsKIAlpbnQgc3RhdHVzOwogCi0JaWYgKCFpbnN0LT5za2IpCi0JCXJldHVybiAwOwotCiAJaWYgKGluc3QtPnFsZW4gPiAxKQogCQlpbnN0LT5sYXN0bmxoLT5ubG1zZ190eXBlID0gTkxNU0dfRE9ORTsKIApAQCAtMzkxLDcgKzM3MCw4IEBACiAJVURFQlVHKCJ0aW1lciBmdW5jdGlvbiBjYWxsZWQsIGZsdXNoaW5nIGJ1ZmZlclxuIik7CiAKIAlzcGluX2xvY2tfYmgoJmluc3QtPmxvY2spOwotCV9fbmZ1bG5sX3NlbmQoaW5zdCk7CisJaWYgKGluc3QtPnNrYikKKwkJX19uZnVsbmxfc2VuZChpbnN0KTsKIAlzcGluX3VubG9ja19iaCgmaW5zdC0+bG9jayk7CiAJaW5zdGFuY2VfcHV0KGluc3QpOwogfQpAQCAtNDA5LDE1ICszODksMTQgQEAKIAkJCWNvbnN0IHN0cnVjdCBuZl9sb2dpbmZvICpsaSwKIAkJCWNvbnN0IGNoYXIgKnByZWZpeCwgdW5zaWduZWQgaW50IHBsZW4pCiB7Ci0JdW5zaWduZWQgY2hhciAqb2xkX3RhaWw7CiAJc3RydWN0IG5mdWxubF9tc2dfcGFja2V0X2hkciBwbXNnOwogCXN0cnVjdCBubG1zZ2hkciAqbmxoOwogCXN0cnVjdCBuZmdlbm1zZyAqbmZtc2c7CiAJX19iZTMyIHRtcF91aW50OworCXNrX2J1ZmZfZGF0YV90IG9sZF90YWlsID0gaW5zdC0+c2tiLT50YWlsOwogCiAJVURFQlVHKCJlbnRlcmVkXG4iKTsKIAotCW9sZF90YWlsID0gaW5zdC0+c2tiLT50YWlsOwogCW5saCA9IE5MTVNHX1BVVChpbnN0LT5za2IsIDAsIDAsCiAJCQlORk5MX1NVQlNZU19VTE9HIDw8IDggfCBORlVMTkxfTVNHX1BBQ0tFVCwKIAkJCXNpemVvZihzdHJ1Y3QgbmZnZW5tc2cpKTsKQEAgLTUwOSwxMSArNDg4LDExIEBACiAJCU5GQV9QVVQoaW5zdC0+c2tiLCBORlVMQV9IV0FERFIsIHNpemVvZihwaHcpLCAmcGh3KTsKIAl9CiAKLQlpZiAoc2tiLT50c3RhbXAub2ZmX3NlYykgeworCWlmIChza2ItPnRzdGFtcC50djY0KSB7CiAJCXN0cnVjdCBuZnVsbmxfbXNnX3BhY2tldF90aW1lc3RhbXAgdHM7Ci0KLQkJdHMuc2VjID0gY3B1X3RvX2JlNjQoc2tiLT50c3RhbXAub2ZmX3NlYyk7Ci0JCXRzLnVzZWMgPSBjcHVfdG9fYmU2NChza2ItPnRzdGFtcC5vZmZfdXNlYyk7CisJCXN0cnVjdCB0aW1ldmFsIHR2ID0ga3RpbWVfdG9fdGltZXZhbChza2ItPnRzdGFtcCk7CisJCXRzLnNlYyA9IGNwdV90b19iZTY0KHR2LnR2X3NlYyk7CisJCXRzLnVzZWMgPSBjcHVfdG9fYmU2NCh0di50dl91c2VjKTsKIAogCQlORkFfUFVUKGluc3QtPnNrYiwgTkZVTEFfVElNRVNUQU1QLCBzaXplb2YodHMpLCAmdHMpOwogCX0KQEAgLTU5Niw3ICs1NzUsNiBAQAogCXN0cnVjdCBuZnVsbmxfaW5zdGFuY2UgKmluc3Q7CiAJY29uc3Qgc3RydWN0IG5mX2xvZ2luZm8gKmxpOwogCXVuc2lnbmVkIGludCBxdGhyZXNob2xkOwotCXVuc2lnbmVkIGludCBubGJ1ZnNpejsKIAl1bnNpZ25lZCBpbnQgcGxlbjsKIAogCWlmIChsaV91c2VyICYmIGxpX3VzZXItPnR5cGUgPT0gTkZfTE9HX1RZUEVfVUxPRykKQEAgLTYwNiwxMiArNTg0LDcgQEAKIAogCWluc3QgPSBpbnN0YW5jZV9sb29rdXBfZ2V0KGxpLT51LnVsb2cuZ3JvdXApOwogCWlmICghaW5zdCkKLQkJaW5zdCA9IGluc3RhbmNlX2xvb2t1cF9nZXQoMCk7Ci0JaWYgKCFpbnN0KSB7Ci0JCVBSSU5UUigibmZuZXRsaW5rX2xvZzogdHJ5aW5nIHRvIGxvZyBwYWNrZXQsICIKLQkJCSJidXQgbm8gaW5zdGFuY2UgZm9yIGdyb3VwICV1XG4iLCBsaS0+dS51bG9nLmdyb3VwKTsKIAkJcmV0dXJuOwotCX0KIAogCXBsZW4gPSAwOwogCWlmIChwcmVmaXgpCkBAIC02NjcsMjQgKzY0MCwxMSBAQAogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCXNwaW5fdW5sb2NrX2JoKCZpbnN0LT5sb2NrKTsKLQkJaW5zdGFuY2VfcHV0KGluc3QpOwotCQlyZXR1cm47CisJCWdvdG8gdW5sb2NrX2FuZF9yZWxlYXNlOwogCX0KIAotCWlmIChzaXplID4gaW5zdC0+bmxidWZzaXopCi0JCW5sYnVmc2l6ID0gc2l6ZTsKLQllbHNlCi0JCW5sYnVmc2l6ID0gaW5zdC0+bmxidWZzaXo7Ci0KLQlpZiAoIWluc3QtPnNrYikgewotCQlpZiAoIShpbnN0LT5za2IgPSBuZnVsbmxfYWxsb2Nfc2tiKG5sYnVmc2l6LCBzaXplKSkpIHsKLQkJCVVERUJVRygiZXJyb3IgaW4gbmZ1bG5sX2FsbG9jX3NrYigldSwgJXUpXG4iLAotCQkJCWluc3QtPm5sYnVmc2l6LCBzaXplKTsKLQkJCWdvdG8gYWxsb2NfZmFpbHVyZTsKLQkJfQotCX0gZWxzZSBpZiAoaW5zdC0+cWxlbiA+PSBxdGhyZXNob2xkIHx8Ci0JCSAgIHNpemUgPiBza2JfdGFpbHJvb20oaW5zdC0+c2tiKSkgeworCWlmIChpbnN0LT5xbGVuID49IHF0aHJlc2hvbGQgfHwKKwkgICAgKGluc3QtPnNrYiAmJiBzaXplID4gc2tiX3RhaWxyb29tKGluc3QtPnNrYikpKSB7CiAJCS8qIGVpdGhlciB0aGUgcXVldWUgbGVuIGlzIHRvbyBoaWdoIG9yIHdlIGRvbid0IGhhdmUKIAkJICogZW5vdWdoIHJvb20gaW4gdGhlIHNrYiBsZWZ0LiBmbHVzaCB0byB1c2Vyc3BhY2UuICovCiAJCVVERUJVRygiZmx1c2hpbmcgb2xkIHNrYlxuIik7CkBAIC02OTMsMTIgKzY1MywxMiBAQAogCQlpZiAoZGVsX3RpbWVyKCZpbnN0LT50aW1lcikpCiAJCQlpbnN0YW5jZV9wdXQoaW5zdCk7CiAJCV9fbmZ1bG5sX3NlbmQoaW5zdCk7CisJfQogCi0JCWlmICghKGluc3QtPnNrYiA9IG5mdWxubF9hbGxvY19za2IobmxidWZzaXosIHNpemUpKSkgewotCQkJVURFQlVHKCJlcnJvciBpbiBuZnVsbmxfYWxsb2Nfc2tiKCV1LCAldSlcbiIsCi0JCQkJaW5zdC0+bmxidWZzaXosIHNpemUpOworCWlmICghaW5zdC0+c2tiKSB7CisJCWluc3QtPnNrYiA9IG5mdWxubF9hbGxvY19za2IoaW5zdC0+bmxidWZzaXosIHNpemUpOworCQlpZiAoIWluc3QtPnNrYikKIAkJCWdvdG8gYWxsb2NfZmFpbHVyZTsKLQkJfQogCX0KIAogCVVERUJVRygicWxlbiAlZCwgcXRocmVzaG9sZCAlZFxuIiwgaW5zdC0+cWxlbiwgcXRocmVzaG9sZCk7CkBAIC03NjAsNyArNzIwLDcgQEAKIAogc3RhdGljIGludAogbmZ1bG5sX3JlY3ZfdW5zdXBwKHN0cnVjdCBzb2NrICpjdG5sLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkgIHN0cnVjdCBubG1zZ2hkciAqbmxoLCBzdHJ1Y3QgbmZhdHRyICpuZnFhW10sIGludCAqZXJycCkKKwkJICBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgc3RydWN0IG5mYXR0ciAqbmZxYVtdKQogewogCXJldHVybiAtRU5PVFNVUFA7CiB9CkBAIC03OTgsNyArNzU4LDcgQEAKIAogc3RhdGljIGludAogbmZ1bG5sX3JlY3ZfY29uZmlnKHN0cnVjdCBzb2NrICpjdG5sLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkgICBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgc3RydWN0IG5mYXR0ciAqbmZ1bGFbXSwgaW50ICplcnJwKQorCQkgICBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgc3RydWN0IG5mYXR0ciAqbmZ1bGFbXSkKIHsKIAlzdHJ1Y3QgbmZnZW5tc2cgKm5mbXNnID0gTkxNU0dfREFUQShubGgpOwogCXVfaW50MTZfdCBncm91cF9udW0gPSBudG9ocyhuZm1zZy0+cmVzX2lkKTsKQEAgLTgzMCwxMyArNzkwLDEzIEBACiAJCQkJCSAgICAgICBORVRMSU5LX0NCKHNrYikucGlkKTsKIAkJCWlmICghaW5zdCkgewogCQkJCXJldCA9IC1FSU5WQUw7Ci0JCQkJZ290byBvdXRfcHV0OworCQkJCWdvdG8gb3V0OwogCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgTkZVTE5MX0NGR19DTURfVU5CSU5EOgogCQkJaWYgKCFpbnN0KSB7CiAJCQkJcmV0ID0gLUVOT0RFVjsKLQkJCQlnb3RvIG91dF9wdXQ7CisJCQkJZ290byBvdXQ7CiAJCQl9CiAKIAkJCWlmIChpbnN0LT5wZWVyX3BpZCAhPSBORVRMSU5LX0NCKHNrYikucGlkKSB7CkBAIC04NDUsNyArODA1LDcgQEAKIAkJCX0KIAogCQkJaW5zdGFuY2VfZGVzdHJveShpbnN0KTsKLQkJCWJyZWFrOworCQkJZ290byBvdXQ7CiAJCWNhc2UgTkZVTE5MX0NGR19DTURfUEZfQklORDoKIAkJCVVERUJVRygicmVnaXN0ZXJpbmcgbG9nIGhhbmRsZXIgZm9yIHBmPSV1XG4iLCBwZik7CiAJCQlyZXQgPSBuZl9sb2dfcmVnaXN0ZXIocGYsICZuZnVsbmxfbG9nZ2VyKTsKQEAgLTg2OSw3ICs4MjksNyBAQAogCQkJCSJncm91cD0ldSBwaWQ9JXUgPT5FTk9FTlRcbiIsCiAJCQkJZ3JvdXBfbnVtLCBORVRMSU5LX0NCKHNrYikucGlkKTsKIAkJCXJldCA9IC1FTk9FTlQ7Ci0JCQlnb3RvIG91dF9wdXQ7CisJCQlnb3RvIG91dDsKIAkJfQogCiAJCWlmIChpbnN0LT5wZWVyX3BpZCAhPSBORVRMSU5LX0NCKHNrYikucGlkKSB7CkBAIC05MzksMTAgKzg5OSw4IEBACiAJdW5zaWduZWQgaW50IGJ1Y2tldDsKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgaGxpc3Rfbm9kZSAqZ2V0X2ZpcnN0KHN0cnVjdCBzZXFfZmlsZSAqc2VxKQorc3RhdGljIHN0cnVjdCBobGlzdF9ub2RlICpnZXRfZmlyc3Qoc3RydWN0IGl0ZXJfc3RhdGUgKnN0KQogewotCXN0cnVjdCBpdGVyX3N0YXRlICpzdCA9IHNlcS0+cHJpdmF0ZTsKLQogCWlmICghc3QpCiAJCXJldHVybiBOVUxMOwogCkBAIC05NTMsMTAgKzkxMSw4IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaGxpc3Rfbm9kZSAqZ2V0X25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHN0cnVjdCBobGlzdF9ub2RlICpoKQorc3RhdGljIHN0cnVjdCBobGlzdF9ub2RlICpnZXRfbmV4dChzdHJ1Y3QgaXRlcl9zdGF0ZSAqc3QsIHN0cnVjdCBobGlzdF9ub2RlICpoKQogewotCXN0cnVjdCBpdGVyX3N0YXRlICpzdCA9IHNlcS0+cHJpdmF0ZTsKLQogCWggPSBoLT5uZXh0OwogCXdoaWxlICghaCkgewogCQlpZiAoKytzdC0+YnVja2V0ID49IElOU1RBTkNFX0JVQ0tFVFMpCkBAIC05NjcsMTMgKzkyMywxMyBAQAogCXJldHVybiBoOwogfQogCi1zdGF0aWMgc3RydWN0IGhsaXN0X25vZGUgKmdldF9pZHgoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCBwb3MpCitzdGF0aWMgc3RydWN0IGhsaXN0X25vZGUgKmdldF9pZHgoc3RydWN0IGl0ZXJfc3RhdGUgKnN0LCBsb2ZmX3QgcG9zKQogewogCXN0cnVjdCBobGlzdF9ub2RlICpoZWFkOwotCWhlYWQgPSBnZXRfZmlyc3Qoc2VxKTsKKwloZWFkID0gZ2V0X2ZpcnN0KHN0KTsKIAogCWlmIChoZWFkKQotCQl3aGlsZSAocG9zICYmIChoZWFkID0gZ2V0X25leHQoc2VxLCBoZWFkKSkpCisJCXdoaWxlIChwb3MgJiYgKGhlYWQgPSBnZXRfbmV4dChzdCwgaGVhZCkpKQogCQkJcG9zLS07CiAJcmV0dXJuIHBvcyA/IE5VTEwgOiBoZWFkOwogfQpAQCAtOTgxLDEzICs5MzcsMTMgQEAKIHN0YXRpYyB2b2lkICpzZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKQogewogCXJlYWRfbG9ja19iaCgmaW5zdGFuY2VzX2xvY2spOwotCXJldHVybiBnZXRfaWR4KHNlcSwgKnBvcyk7CisJcmV0dXJuIGdldF9pZHgoc2VxLT5wcml2YXRlLCAqcG9zKTsKIH0KIAogc3RhdGljIHZvaWQgKnNlcV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdiwgbG9mZl90ICpwb3MpCiB7CiAJKCpwb3MpKys7Ci0JcmV0dXJuIGdldF9uZXh0KHMsIHYpOworCXJldHVybiBnZXRfbmV4dChzLT5wcml2YXRlLCB2KTsKIH0KIAogc3RhdGljIHZvaWQgc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp2KQpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZm5ldGxpbmtfcXVldWUuYyBiL25ldC9uZXRmaWx0ZXIvbmZuZXRsaW5rX3F1ZXVlLmMKaW5kZXggZDljZTRhNy4uN2E5N2JlYyAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZm5ldGxpbmtfcXVldWUuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mbmV0bGlua19xdWV1ZS5jCkBAIC0zMzgsNyArMzM4LDcgQEAKIG5mcW5sX2J1aWxkX3BhY2tldF9tZXNzYWdlKHN0cnVjdCBuZnFubF9pbnN0YW5jZSAqcXVldWUsCiAJCQkgICBzdHJ1Y3QgbmZxbmxfcXVldWVfZW50cnkgKmVudHJ5LCBpbnQgKmVycnApCiB7Ci0JdW5zaWduZWQgY2hhciAqb2xkX3RhaWw7CisJc2tfYnVmZl9kYXRhX3Qgb2xkX3RhaWw7CiAJc2l6ZV90IHNpemU7CiAJc2l6ZV90IGRhdGFfbGVuID0gMDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwpAQCAtNDA0LDcgKzQwNCw3IEBACiAJaWYgKCFza2IpCiAJCWdvdG8gbmxtc2dfZmFpbHVyZTsKIAotCW9sZF90YWlsPSBza2ItPnRhaWw7CisJb2xkX3RhaWwgPSBza2ItPnRhaWw7CiAJbmxoID0gTkxNU0dfUFVUKHNrYiwgMCwgMCwKIAkJCU5GTkxfU1VCU1lTX1FVRVVFIDw8IDggfCBORlFOTF9NU0dfUEFDS0VULAogCQkJc2l6ZW9mKHN0cnVjdCBuZmdlbm1zZykpOwpAQCAtNDk1LDExICs0OTUsMTEgQEAKIAkJTkZBX1BVVChza2IsIE5GUUFfSFdBRERSLCBzaXplb2YocGh3KSwgJnBodyk7CiAJfQogCi0JaWYgKGVudHNrYi0+dHN0YW1wLm9mZl9zZWMpIHsKKwlpZiAoZW50c2tiLT50c3RhbXAudHY2NCkgewogCQlzdHJ1Y3QgbmZxbmxfbXNnX3BhY2tldF90aW1lc3RhbXAgdHM7Ci0KLQkJdHMuc2VjID0gY3B1X3RvX2JlNjQoZW50c2tiLT50c3RhbXAub2ZmX3NlYyk7Ci0JCXRzLnVzZWMgPSBjcHVfdG9fYmU2NChlbnRza2ItPnRzdGFtcC5vZmZfdXNlYyk7CisJCXN0cnVjdCB0aW1ldmFsIHR2ID0ga3RpbWVfdG9fdGltZXZhbChlbnRza2ItPnRzdGFtcCk7CisJCXRzLnNlYyA9IGNwdV90b19iZTY0KHR2LnR2X3NlYyk7CisJCXRzLnVzZWMgPSBjcHVfdG9fYmU2NCh0di50dl91c2VjKTsKIAogCQlORkFfUFVUKHNrYiwgTkZRQV9USU1FU1RBTVAsIHNpemVvZih0cyksICZ0cyk7CiAJfQpAQCAtNjQ4LDcgKzY0OCw3IEBACiAJfQogCWlmICghc2tiX21ha2Vfd3JpdGFibGUoJmUtPnNrYiwgZGF0YV9sZW4pKQogCQlyZXR1cm4gLUVOT01FTTsKLQltZW1jcHkoZS0+c2tiLT5kYXRhLCBkYXRhLCBkYXRhX2xlbik7CisJc2tiX2NvcHlfdG9fbGluZWFyX2RhdGEoZS0+c2tiLCBkYXRhLCBkYXRhX2xlbik7CiAJZS0+c2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOwogCXJldHVybiAwOwogfQpAQCAtNzgzLDcgKzc4Myw3IEBACiAKIHN0YXRpYyBpbnQKIG5mcW5sX3JlY3ZfdmVyZGljdChzdHJ1Y3Qgc29jayAqY3RubCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJICAgc3RydWN0IG5sbXNnaGRyICpubGgsIHN0cnVjdCBuZmF0dHIgKm5mcWFbXSwgaW50ICplcnJwKQorCQkgICBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgc3RydWN0IG5mYXR0ciAqbmZxYVtdKQogewogCXN0cnVjdCBuZmdlbm1zZyAqbmZtc2cgPSBOTE1TR19EQVRBKG5saCk7CiAJdV9pbnQxNl90IHF1ZXVlX251bSA9IG50b2hzKG5mbXNnLT5yZXNfaWQpOwpAQCAtODQ4LDcgKzg0OCw3IEBACiAKIHN0YXRpYyBpbnQKIG5mcW5sX3JlY3ZfdW5zdXBwKHN0cnVjdCBzb2NrICpjdG5sLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkgIHN0cnVjdCBubG1zZ2hkciAqbmxoLCBzdHJ1Y3QgbmZhdHRyICpuZnFhW10sIGludCAqZXJycCkKKwkJICBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgc3RydWN0IG5mYXR0ciAqbmZxYVtdKQogewogCXJldHVybiAtRU5PVFNVUFA7CiB9CkBAIC04NjUsNyArODY1LDcgQEAKIAogc3RhdGljIGludAogbmZxbmxfcmVjdl9jb25maWcoc3RydWN0IHNvY2sgKmN0bmwsIHN0cnVjdCBza19idWZmICpza2IsCi0JCSAgc3RydWN0IG5sbXNnaGRyICpubGgsIHN0cnVjdCBuZmF0dHIgKm5mcWFbXSwgaW50ICplcnJwKQorCQkgIHN0cnVjdCBubG1zZ2hkciAqbmxoLCBzdHJ1Y3QgbmZhdHRyICpuZnFhW10pCiB7CiAJc3RydWN0IG5mZ2VubXNnICpuZm1zZyA9IE5MTVNHX0RBVEEobmxoKTsKIAl1X2ludDE2X3QgcXVldWVfbnVtID0gbnRvaHMobmZtc2ctPnJlc19pZCk7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3hfdGFibGVzLmMgYi9uZXQvbmV0ZmlsdGVyL3hfdGFibGVzLmMKaW5kZXggZWM2MDdhNC4uMGViMjUwNCAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94X3RhYmxlcy5jCisrKyBiL25ldC9uZXRmaWx0ZXIveF90YWJsZXMuYwpAQCAtNTYsOCArNTYsOCBAQAogfTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKnh0X3ByZWZpeFtOUFJPVE9dID0gewotCVtBRl9JTkVUXSAJPSAiaXAiLAotCVtBRl9JTkVUNl0gCT0gImlwNiIsCisJW0FGX0lORVRdCT0gImlwIiwKKwlbQUZfSU5FVDZdCT0gImlwNiIsCiAJW05GX0FSUF0JPSAiYXJwIiwKIH07CiAKQEAgLTY1MSwxMiArNjUxLDYgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKHh0X3VucmVnaXN0ZXJfdGFibGUpOwogCiAjaWZkZWYgQ09ORklHX1BST0NfRlMKLXN0YXRpYyBjaGFyICp4dF9wcm90b19wcmVmaXhbTlBST1RPXSA9IHsKLQlbQUZfSU5FVF0JPSAiaXAiLAotCVtBRl9JTkVUNl0JPSAiaXA2IiwKLQlbTkZfQVJQXQk9ICJhcnAiLAotfTsKLQogc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgKnh0X2dldF9pZHgoc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCBwb3MpCiB7CiAJc3RydWN0IGxpc3RfaGVhZCAqaGVhZCA9IGxpc3QtPm5leHQ7CkBAIC03OTgsNyArNzkyLDcgQEAKIAogCiAjaWZkZWYgQ09ORklHX1BST0NfRlMKLQlzdHJsY3B5KGJ1ZiwgeHRfcHJvdG9fcHJlZml4W2FmXSwgc2l6ZW9mKGJ1ZikpOworCXN0cmxjcHkoYnVmLCB4dF9wcmVmaXhbYWZdLCBzaXplb2YoYnVmKSk7CiAJc3RybGNhdChidWYsIEZPUk1BVF9UQUJMRVMsIHNpemVvZihidWYpKTsKIAlwcm9jID0gcHJvY19uZXRfZm9wc19jcmVhdGUoYnVmLCAwNDQwLCAmeHRfZmlsZV9vcHMpOwogCWlmICghcHJvYykKQEAgLTgwNiwxNCArODAwLDE0IEBACiAJcHJvYy0+ZGF0YSA9ICh2b2lkICopICgodW5zaWduZWQgbG9uZykgYWYgfCAoVEFCTEUgPDwgMTYpKTsKIAogCi0Jc3RybGNweShidWYsIHh0X3Byb3RvX3ByZWZpeFthZl0sIHNpemVvZihidWYpKTsKKwlzdHJsY3B5KGJ1ZiwgeHRfcHJlZml4W2FmXSwgc2l6ZW9mKGJ1ZikpOwogCXN0cmxjYXQoYnVmLCBGT1JNQVRfTUFUQ0hFUywgc2l6ZW9mKGJ1ZikpOwogCXByb2MgPSBwcm9jX25ldF9mb3BzX2NyZWF0ZShidWYsIDA0NDAsICZ4dF9maWxlX29wcyk7CiAJaWYgKCFwcm9jKQogCQlnb3RvIG91dF9yZW1vdmVfdGFibGVzOwogCXByb2MtPmRhdGEgPSAodm9pZCAqKSAoKHVuc2lnbmVkIGxvbmcpIGFmIHwgKE1BVENIIDw8IDE2KSk7CiAKLQlzdHJsY3B5KGJ1ZiwgeHRfcHJvdG9fcHJlZml4W2FmXSwgc2l6ZW9mKGJ1ZikpOworCXN0cmxjcHkoYnVmLCB4dF9wcmVmaXhbYWZdLCBzaXplb2YoYnVmKSk7CiAJc3RybGNhdChidWYsIEZPUk1BVF9UQVJHRVRTLCBzaXplb2YoYnVmKSk7CiAJcHJvYyA9IHByb2NfbmV0X2ZvcHNfY3JlYXRlKGJ1ZiwgMDQ0MCwgJnh0X2ZpbGVfb3BzKTsKIAlpZiAoIXByb2MpCkBAIC04MjUsMTIgKzgxOSwxMiBAQAogCiAjaWZkZWYgQ09ORklHX1BST0NfRlMKIG91dF9yZW1vdmVfbWF0Y2hlczoKLQlzdHJsY3B5KGJ1ZiwgeHRfcHJvdG9fcHJlZml4W2FmXSwgc2l6ZW9mKGJ1ZikpOworCXN0cmxjcHkoYnVmLCB4dF9wcmVmaXhbYWZdLCBzaXplb2YoYnVmKSk7CiAJc3RybGNhdChidWYsIEZPUk1BVF9NQVRDSEVTLCBzaXplb2YoYnVmKSk7CiAJcHJvY19uZXRfcmVtb3ZlKGJ1Zik7CiAKIG91dF9yZW1vdmVfdGFibGVzOgotCXN0cmxjcHkoYnVmLCB4dF9wcm90b19wcmVmaXhbYWZdLCBzaXplb2YoYnVmKSk7CisJc3RybGNweShidWYsIHh0X3ByZWZpeFthZl0sIHNpemVvZihidWYpKTsKIAlzdHJsY2F0KGJ1ZiwgRk9STUFUX1RBQkxFUywgc2l6ZW9mKGJ1ZikpOwogCXByb2NfbmV0X3JlbW92ZShidWYpOwogb3V0OgpAQCAtODQ0LDE1ICs4MzgsMTUgQEAKICNpZmRlZiBDT05GSUdfUFJPQ19GUwogCWNoYXIgYnVmW1hUX0ZVTkNUSU9OX01BWE5BTUVMRU5dOwogCi0Jc3RybGNweShidWYsIHh0X3Byb3RvX3ByZWZpeFthZl0sIHNpemVvZihidWYpKTsKKwlzdHJsY3B5KGJ1ZiwgeHRfcHJlZml4W2FmXSwgc2l6ZW9mKGJ1ZikpOwogCXN0cmxjYXQoYnVmLCBGT1JNQVRfVEFCTEVTLCBzaXplb2YoYnVmKSk7CiAJcHJvY19uZXRfcmVtb3ZlKGJ1Zik7CiAKLQlzdHJsY3B5KGJ1ZiwgeHRfcHJvdG9fcHJlZml4W2FmXSwgc2l6ZW9mKGJ1ZikpOworCXN0cmxjcHkoYnVmLCB4dF9wcmVmaXhbYWZdLCBzaXplb2YoYnVmKSk7CiAJc3RybGNhdChidWYsIEZPUk1BVF9UQVJHRVRTLCBzaXplb2YoYnVmKSk7CiAJcHJvY19uZXRfcmVtb3ZlKGJ1Zik7CiAKLQlzdHJsY3B5KGJ1ZiwgeHRfcHJvdG9fcHJlZml4W2FmXSwgc2l6ZW9mKGJ1ZikpOworCXN0cmxjcHkoYnVmLCB4dF9wcmVmaXhbYWZdLCBzaXplb2YoYnVmKSk7CiAJc3RybGNhdChidWYsIEZPUk1BVF9NQVRDSEVTLCBzaXplb2YoYnVmKSk7CiAJcHJvY19uZXRfcmVtb3ZlKGJ1Zik7CiAjZW5kaWYgLypDT05GSUdfUFJPQ19GUyovCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X0NPTk5NQVJLLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X0NPTk5NQVJLLmMKaW5kZXggNzk1YzA1OC4uYjAzY2UwMCAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94dF9DT05OTUFSSy5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfQ09OTk1BUksuYwpAQCAtMzAsMTAgKzMwLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9DT05OTUFSSy5oPgotI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvbXBhdC5oPgotI2lmIGRlZmluZWQoQ09ORklHX05GX0NPTk5UUkFDSykgfHwgZGVmaW5lZChDT05GSUdfTkZfQ09OTlRSQUNLX01PRFVMRSkKICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19lY2FjaGUuaD4KLSNlbmRpZgogCiBzdGF0aWMgdW5zaWduZWQgaW50CiB0YXJnZXQoc3RydWN0IHNrX2J1ZmYgKipwc2tiLApAQCAtNDQsNDAgKzQxLDMzIEBACiAgICAgICAgY29uc3Qgdm9pZCAqdGFyZ2luZm8pCiB7CiAJY29uc3Qgc3RydWN0IHh0X2Nvbm5tYXJrX3RhcmdldF9pbmZvICptYXJraW5mbyA9IHRhcmdpbmZvOworCXN0cnVjdCBuZl9jb25uICpjdDsKKwllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbzsKIAl1X2ludDMyX3QgZGlmZjsKIAl1X2ludDMyX3QgbWFyazsKIAl1X2ludDMyX3QgbmV3bWFyazsKLQl1X2ludDMyX3QgY3RpbmZvOwotCXVfaW50MzJfdCAqY3RtYXJrID0gbmZfY3RfZ2V0X21hcmsoKnBza2IsICZjdGluZm8pOwogCi0JaWYgKGN0bWFyaykgeworCWN0ID0gbmZfY3RfZ2V0KCpwc2tiLCAmY3RpbmZvKTsKKwlpZiAoY3QpIHsKIAkJc3dpdGNoKG1hcmtpbmZvLT5tb2RlKSB7CiAJCWNhc2UgWFRfQ09OTk1BUktfU0VUOgotCQkJbmV3bWFyayA9ICgqY3RtYXJrICYgfm1hcmtpbmZvLT5tYXNrKSB8IG1hcmtpbmZvLT5tYXJrOwotCQkJaWYgKG5ld21hcmsgIT0gKmN0bWFyaykgewotCQkJCSpjdG1hcmsgPSBuZXdtYXJrOwotI2lmIGRlZmluZWQoQ09ORklHX0lQX05GX0NPTk5UUkFDSykgfHwgZGVmaW5lZChDT05GSUdfSVBfTkZfQ09OTlRSQUNLX01PRFVMRSkKLQkJCQlpcF9jb25udHJhY2tfZXZlbnRfY2FjaGUoSVBDVF9NQVJLLCAqcHNrYik7Ci0jZWxzZQorCQkJbmV3bWFyayA9IChjdC0+bWFyayAmIH5tYXJraW5mby0+bWFzaykgfCBtYXJraW5mby0+bWFyazsKKwkJCWlmIChuZXdtYXJrICE9IGN0LT5tYXJrKSB7CisJCQkJY3QtPm1hcmsgPSBuZXdtYXJrOwogCQkJCW5mX2Nvbm50cmFja19ldmVudF9jYWNoZShJUENUX01BUkssICpwc2tiKTsKLSNlbmRpZgogCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgWFRfQ09OTk1BUktfU0FWRToKLQkJCW5ld21hcmsgPSAoKmN0bWFyayAmIH5tYXJraW5mby0+bWFzaykgfAorCQkJbmV3bWFyayA9IChjdC0+bWFyayAmIH5tYXJraW5mby0+bWFzaykgfAogCQkJCSAgKCgqcHNrYiktPm1hcmsgJiBtYXJraW5mby0+bWFzayk7Ci0JCQlpZiAoKmN0bWFyayAhPSBuZXdtYXJrKSB7Ci0JCQkJKmN0bWFyayA9IG5ld21hcms7Ci0jaWYgZGVmaW5lZChDT05GSUdfSVBfTkZfQ09OTlRSQUNLKSB8fCBkZWZpbmVkKENPTkZJR19JUF9ORl9DT05OVFJBQ0tfTU9EVUxFKQotCQkJCWlwX2Nvbm50cmFja19ldmVudF9jYWNoZShJUENUX01BUkssICpwc2tiKTsKLSNlbHNlCisJCQlpZiAoY3QtPm1hcmsgIT0gbmV3bWFyaykgeworCQkJCWN0LT5tYXJrID0gbmV3bWFyazsKIAkJCQluZl9jb25udHJhY2tfZXZlbnRfY2FjaGUoSVBDVF9NQVJLLCAqcHNrYik7Ci0jZW5kaWYKIAkJCX0KIAkJCWJyZWFrOwogCQljYXNlIFhUX0NPTk5NQVJLX1JFU1RPUkU6CiAJCQltYXJrID0gKCpwc2tiKS0+bWFyazsKLQkJCWRpZmYgPSAoKmN0bWFyayBeIG1hcmspICYgbWFya2luZm8tPm1hc2s7CisJCQlkaWZmID0gKGN0LT5tYXJrIF4gbWFyaykgJiBtYXJraW5mby0+bWFzazsKIAkJCSgqcHNrYiktPm1hcmsgPSBtYXJrIF4gZGlmZjsKIAkJCWJyZWFrOwogCQl9CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X0NPTk5TRUNNQVJLLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X0NPTk5TRUNNQVJLLmMKaW5kZXggMWFiMGRiNi4uODFjMGM1OCAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94dF9DT05OU0VDTUFSSy5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfQ09OTlNFQ01BUksuYwpAQCAtMTksNyArMTksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9DT05OU0VDTUFSSy5oPgotI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvbXBhdC5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrLmg+CiAKICNkZWZpbmUgUEZYICJDT05OU0VDTUFSSzogIgogCkBAIC0zNiwxMiArMzYsMTIgQEAKIHN0YXRpYyB2b2lkIHNlY21hcmtfc2F2ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCWlmIChza2ItPnNlY21hcmspIHsKLQkJdTMyICpjb25uc2VjbWFyazsKKwkJc3RydWN0IG5mX2Nvbm4gKmN0OwogCQllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbzsKIAotCQljb25uc2VjbWFyayA9IG5mX2N0X2dldF9zZWNtYXJrKHNrYiwgJmN0aW5mbyk7Ci0JCWlmIChjb25uc2VjbWFyayAmJiAhKmNvbm5zZWNtYXJrKQotCQkJKmNvbm5zZWNtYXJrID0gc2tiLT5zZWNtYXJrOworCQljdCA9IG5mX2N0X2dldChza2IsICZjdGluZm8pOworCQlpZiAoY3QgJiYgIWN0LT5zZWNtYXJrKQorCQkJY3QtPnNlY21hcmsgPSBza2ItPnNlY21hcms7CiAJfQogfQogCkBAIC01MiwxMiArNTIsMTIgQEAKIHN0YXRpYyB2b2lkIHNlY21hcmtfcmVzdG9yZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCWlmICghc2tiLT5zZWNtYXJrKSB7Ci0JCXUzMiAqY29ubnNlY21hcms7CisJCXN0cnVjdCBuZl9jb25uICpjdDsKIAkJZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm87CiAKLQkJY29ubnNlY21hcmsgPSBuZl9jdF9nZXRfc2VjbWFyayhza2IsICZjdGluZm8pOwotCQlpZiAoY29ubnNlY21hcmsgJiYgKmNvbm5zZWNtYXJrKQotCQkJc2tiLT5zZWNtYXJrID0gKmNvbm5zZWNtYXJrOworCQljdCA9IG5mX2N0X2dldChza2IsICZjdGluZm8pOworCQlpZiAoY3QgJiYgY3QtPnNlY21hcmspCisJCQlza2ItPnNlY21hcmsgPSBjdC0+c2VjbWFyazsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfRFNDUC5jIGIvbmV0L25ldGZpbHRlci94dF9EU0NQLmMKaW5kZXggYTdjYzc1YS4uOWYyZjIyMCAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94dF9EU0NQLmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9EU0NQLmMKQEAgLTgsOCArOCw2IEBACiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqCiAgKiBTZWUgUkZDMjQ3NCBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgRFNDUCBmaWVsZCB3aXRoaW4gdGhlIElQIEhlYWRlci4KLSAqCi0gKiB4dF9EU0NQLmMsdiAxLjggMjAwMi8wOC8wNiAxODo0MTo1NyBsYWZvcmdlIEV4cAogKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtMzUsMTMgKzMzLDEzIEBACiAJCQkgICBjb25zdCB2b2lkICp0YXJnaW5mbykKIHsKIAljb25zdCBzdHJ1Y3QgeHRfRFNDUF9pbmZvICpkaW5mbyA9IHRhcmdpbmZvOwotCXVfaW50OF90IGRzY3AgPSBpcHY0X2dldF9kc2ZpZWxkKCgqcHNrYiktPm5oLmlwaCkgPj4gWFRfRFNDUF9TSElGVDsKKwl1X2ludDhfdCBkc2NwID0gaXB2NF9nZXRfZHNmaWVsZChpcF9oZHIoKnBza2IpKSA+PiBYVF9EU0NQX1NISUZUOwogCiAJaWYgKGRzY3AgIT0gZGluZm8tPmRzY3ApIHsKIAkJaWYgKCFza2JfbWFrZV93cml0YWJsZShwc2tiLCBzaXplb2Yoc3RydWN0IGlwaGRyKSkpCiAJCQlyZXR1cm4gTkZfRFJPUDsKIAotCQlpcHY0X2NoYW5nZV9kc2ZpZWxkKCgqcHNrYiktPm5oLmlwaCwgKF9fdTgpKH5YVF9EU0NQX01BU0spLAorCQlpcHY0X2NoYW5nZV9kc2ZpZWxkKGlwX2hkcigqcHNrYiksIChfX3U4KSh+WFRfRFNDUF9NQVNLKSwKIAkJCQkgICAgZGluZm8tPmRzY3AgPDwgWFRfRFNDUF9TSElGVCk7CiAKIAl9CkBAIC01NiwxMyArNTQsMTMgQEAKIAkJCSAgICBjb25zdCB2b2lkICp0YXJnaW5mbykKIHsKIAljb25zdCBzdHJ1Y3QgeHRfRFNDUF9pbmZvICpkaW5mbyA9IHRhcmdpbmZvOwotCXVfaW50OF90IGRzY3AgPSBpcHY2X2dldF9kc2ZpZWxkKCgqcHNrYiktPm5oLmlwdjZoKSA+PiBYVF9EU0NQX1NISUZUOworCXVfaW50OF90IGRzY3AgPSBpcHY2X2dldF9kc2ZpZWxkKGlwdjZfaGRyKCpwc2tiKSkgPj4gWFRfRFNDUF9TSElGVDsKIAogCWlmIChkc2NwICE9IGRpbmZvLT5kc2NwKSB7CiAJCWlmICghc2tiX21ha2Vfd3JpdGFibGUocHNrYiwgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSkpCiAJCQlyZXR1cm4gTkZfRFJPUDsKIAotCQlpcHY2X2NoYW5nZV9kc2ZpZWxkKCgqcHNrYiktPm5oLmlwdjZoLCAoX191OCkoflhUX0RTQ1BfTUFTSyksCisJCWlwdjZfY2hhbmdlX2RzZmllbGQoaXB2Nl9oZHIoKnBza2IpLCAoX191OCkoflhUX0RTQ1BfTUFTSyksCiAJCQkJICAgIGRpbmZvLT5kc2NwIDw8IFhUX0RTQ1BfU0hJRlQpOwogCX0KIAlyZXR1cm4gWFRfQ09OVElOVUU7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X05PVFJBQ0suYyBiL25ldC9uZXRmaWx0ZXIveHRfTk9UUkFDSy5jCmluZGV4IGI4NzRhMjAuLjUwODVmYjMgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIveHRfTk9UUkFDSy5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfTk9UUkFDSy5jCkBAIC01LDcgKzUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogCiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+Ci0jaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29tcGF0Lmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2suaD4KIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0FMSUFTKCJpcHRfTk9UUkFDSyIpOwpAQCAtMjYsNyArMjYsNyBAQAogCSAgIElmIHRoZXJlIGlzIGEgcmVhbCBjdCBlbnRyeSBjb3JyZXNwb25kaWcgdG8gdGhpcyBwYWNrZXQsCiAJICAgaXQnbGwgaGFuZyBhcm91biB0aWxsIHRpbWluZyBvdXQuIFdlIGRvbid0IGRlYWwgd2l0aCBpdAogCSAgIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLiBKSyAqLwotCW5mX2N0X3VudHJhY2soKnBza2IpOworCSgqcHNrYiktPm5mY3QgPSAmbmZfY29ubnRyYWNrX3VudHJhY2tlZC5jdF9nZW5lcmFsOwogCSgqcHNrYiktPm5mY3RpbmZvID0gSVBfQ1RfTkVXOwogCW5mX2Nvbm50cmFja19nZXQoKCpwc2tiKS0+bmZjdCk7CiAKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfVENQTVNTLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X1RDUE1TUy5jCmluZGV4IGRiN2UzOGMuLjE1ZmU4ZjYgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIveHRfVENQTVNTLmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9UQ1BNU1MuYwpAQCAtNTQsNyArNTQsNyBAQAogCQlyZXR1cm4gLTE7CiAKIAl0Y3BsZW4gPSAoKnBza2IpLT5sZW4gLSB0Y3Bob2ZmOwotCXRjcGggPSAoc3RydWN0IHRjcGhkciAqKSgoKnBza2IpLT5uaC5yYXcgKyB0Y3Bob2ZmKTsKKwl0Y3BoID0gKHN0cnVjdCB0Y3BoZHIgKikoc2tiX25ldHdvcmtfaGVhZGVyKCpwc2tiKSArIHRjcGhvZmYpOwogCiAJLyogU2luY2UgaXQgcGFzc2VkIGZsYWdzIHRlc3QgaW4gdGNwIG1hdGNoLCB3ZSBrbm93IGl0IGlzIGlzCiAJICAgbm90IGEgZnJhZ21lbnQsIGFuZCBoYXMgZGF0YSA+PSB0Y3AgaGVhZGVyIGxlbmd0aC4gIFNZTgpAQCAtMTEzLDcgKzExMyw3IEBACiAJCQlyZXR1cm4gLTE7CiAJCWtmcmVlX3NrYigqcHNrYik7CiAJCSpwc2tiID0gbmV3c2tiOwotCQl0Y3BoID0gKHN0cnVjdCB0Y3BoZHIgKikoKCpwc2tiKS0+bmgucmF3ICsgdGNwaG9mZik7CisJCXRjcGggPSAoc3RydWN0IHRjcGhkciAqKShza2JfbmV0d29ya19oZWFkZXIoKnBza2IpICsgdGNwaG9mZik7CiAJfQogCiAJc2tiX3B1dCgoKnBza2IpLCBUQ1BPTEVOX01TUyk7CkBAIC0xNDUsNyArMTQ1LDcgQEAKIAkJICBjb25zdCBzdHJ1Y3QgeHRfdGFyZ2V0ICp0YXJnZXQsCiAJCSAgY29uc3Qgdm9pZCAqdGFyZ2luZm8pCiB7Ci0Jc3RydWN0IGlwaGRyICppcGggPSAoKnBza2IpLT5uaC5pcGg7CisJc3RydWN0IGlwaGRyICppcGggPSBpcF9oZHIoKnBza2IpOwogCV9fYmUxNiBuZXdsZW47CiAJaW50IHJldDsKIApAQCAtMTU0LDcgKzE1NCw3IEBACiAJaWYgKHJldCA8IDApCiAJCXJldHVybiBORl9EUk9QOwogCWlmIChyZXQgPiAwKSB7Ci0JCWlwaCA9ICgqcHNrYiktPm5oLmlwaDsKKwkJaXBoID0gaXBfaGRyKCpwc2tiKTsKIAkJbmV3bGVuID0gaHRvbnMobnRvaHMoaXBoLT50b3RfbGVuKSArIHJldCk7CiAJCW5mX2NzdW1fcmVwbGFjZTIoJmlwaC0+Y2hlY2ssIGlwaC0+dG90X2xlbiwgbmV3bGVuKTsKIAkJaXBoLT50b3RfbGVuID0gbmV3bGVuOwpAQCAtMTcxLDcgKzE3MSw3IEBACiAJCSAgY29uc3Qgc3RydWN0IHh0X3RhcmdldCAqdGFyZ2V0LAogCQkgIGNvbnN0IHZvaWQgKnRhcmdpbmZvKQogewotCXN0cnVjdCBpcHY2aGRyICppcHY2aCA9ICgqcHNrYiktPm5oLmlwdjZoOworCXN0cnVjdCBpcHY2aGRyICppcHY2aCA9IGlwdjZfaGRyKCpwc2tiKTsKIAl1OCBuZXh0aGRyOwogCWludCB0Y3Bob2ZmOwogCWludCByZXQ7CkBAIC0xODcsNyArMTg3LDcgQEAKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIE5GX0RST1A7CiAJaWYgKHJldCA+IDApIHsKLQkJaXB2NmggPSAoKnBza2IpLT5uaC5pcHY2aDsKKwkJaXB2NmggPSBpcHY2X2hkcigqcHNrYik7CiAJCWlwdjZoLT5wYXlsb2FkX2xlbiA9IGh0b25zKG50b2hzKGlwdjZoLT5wYXlsb2FkX2xlbikgKyByZXQpOwogCX0KIAlyZXR1cm4gWFRfQ09OVElOVUU7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X2Nvbm5ieXRlcy5jIGIvbmV0L25ldGZpbHRlci94dF9jb25uYnl0ZXMuYwppbmRleCA1ZTMyZGZhLi44MDRhZmU1IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL3h0X2Nvbm5ieXRlcy5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfY29ubmJ5dGVzLmMKQEAgLTEsMjAgKzEsMTEgQEAKIC8qIEtlcm5lbCBtb2R1bGUgdG8gbWF0Y2ggY29ubmVjdGlvbiB0cmFja2luZyBieXRlIGNvdW50ZXIuCiAgKiBHUEwgKEMpIDIwMDIgTWFydGluIERldmVyYSAoZGV2aWtAY2RpLmN6KS4KLSAqCi0gKiAyMDA0LTA3LTIwIEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBuZXRmaWx0ZXIub3JnPgotICogCS0gcmVpbXBsZW1lbnRlZCB0byB1c2UgcGVyLWNvbm5lY3Rpb24gYWNjb3VudGluZyBjb3VudGVycwotICogCS0gYWRkIGZ1bmN0aW9uYWxpdHkgdG8gbWF0Y2ggbnVtYmVyIG9mIHBhY2tldHMKLSAqIAktIGFkZCBmdW5jdGlvbmFsaXR5IHRvIG1hdGNoIGF2ZXJhZ2UgcGFja2V0IHNpemUKLSAqIAktIGFkZCBzdXBwb3J0IHRvIG1hdGNoIGRpcmVjdGlvbnMgc2VwZXJhdGVseQotICogMjAwNS0xMC0xNiBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAbmV0ZmlsdGVyLm9yZz4KLSAqIAktIFBvcnQgdG8geF90YWJsZXMKLSAqCiAgKi8KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLSNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb21wYXQuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfY29ubmJ5dGVzLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2suaD4KIAogI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgogI2luY2x1ZGUgPGFzbS9iaXRvcHMuaD4KQEAgLTI0LDIyICsxNSw2IEBACiBNT0RVTEVfREVTQ1JJUFRJT04oImlwdGFibGVzIG1hdGNoIGZvciBtYXRjaGluZyBudW1iZXIgb2YgcGt0cy9ieXRlcyBwZXIgY29ubmVjdGlvbiIpOwogTU9EVUxFX0FMSUFTKCJpcHRfY29ubmJ5dGVzIik7CiAKLS8qIDY0Yml0IGRpdmlzb3IsIGRpdmlkZW5kIGFuZCByZXN1bHQuIGR5bmFtaWMgcHJlY2lzaW9uICovCi1zdGF0aWMgdV9pbnQ2NF90IGRpdjY0XzY0KHVfaW50NjRfdCBkaXZpZGVuZCwgdV9pbnQ2NF90IGRpdmlzb3IpCi17Ci0JdV9pbnQzMl90IGQgPSBkaXZpc29yOwotCi0JaWYgKGRpdmlzb3IgPiAweGZmZmZmZmZmVUxMKSB7Ci0JCXVuc2lnbmVkIGludCBzaGlmdCA9IGZscyhkaXZpc29yID4+IDMyKTsKLQotCQlkID0gZGl2aXNvciA+PiBzaGlmdDsKLQkJZGl2aWRlbmQgPj49IHNoaWZ0OwotCX0KLQotCWRvX2RpdihkaXZpZGVuZCwgZCk7Ci0JcmV0dXJuIGRpdmlkZW5kOwotfQotCiBzdGF0aWMgaW50CiBtYXRjaChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLApAQCAtNTEsMTMgKzI2LDE3IEBACiAgICAgICBpbnQgKmhvdGRyb3ApCiB7CiAJY29uc3Qgc3RydWN0IHh0X2Nvbm5ieXRlc19pbmZvICpzaW5mbyA9IG1hdGNoaW5mbzsKKwlzdHJ1Y3QgbmZfY29ubiAqY3Q7CisJZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm87CiAJdV9pbnQ2NF90IHdoYXQgPSAwOwkvKiBpbml0aWFsaXplIHRvIG1ha2UgZ2NjIGhhcHB5ICovCiAJdV9pbnQ2NF90IGJ5dGVzID0gMDsKIAl1X2ludDY0X3QgcGt0cyA9IDA7CiAJY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja19jb3VudGVyICpjb3VudGVyczsKIAotCWlmICghKGNvdW50ZXJzID0gbmZfY3RfZ2V0X2NvdW50ZXJzKHNrYikpKQotCQlyZXR1cm4gMDsgLyogbm8gbWF0Y2ggKi8KKwljdCA9IG5mX2N0X2dldChza2IsICZjdGluZm8pOworCWlmICghY3QpCisJCXJldHVybiAwOworCWNvdW50ZXJzID0gY3QtPmNvdW50ZXJzOwogCiAJc3dpdGNoIChzaW5mby0+d2hhdCkgewogCWNhc2UgWFRfQ09OTkJZVEVTX1BLVFM6CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X2Nvbm5tYXJrLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X2Nvbm5tYXJrLmMKaW5kZXggMzZjMmRlZi4uZTE4MDMyNSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94dF9jb25ubWFyay5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfY29ubm1hcmsuYwpAQCAtMjEsMTYgKzIxLDE1IEBACiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9jb25ubWFyay5oPgogCiBNT0RVTEVfQVVUSE9SKCJIZW5yaWsgTm9yZHN0cm9tIDxobm9AbWFyYXN5dGVtcy5jb20+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIklQIHRhYmxlcyBjb25ubWFyayBtYXRjaCBtb2R1bGUiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9BTElBUygiaXB0X2Nvbm5tYXJrIik7CiAKLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfY29ubm1hcmsuaD4KLSNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb21wYXQuaD4KLQogc3RhdGljIGludAogbWF0Y2goY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKQEAgLTQyLDEyICs0MSwxNCBAQAogICAgICAgaW50ICpob3Rkcm9wKQogewogCWNvbnN0IHN0cnVjdCB4dF9jb25ubWFya19pbmZvICppbmZvID0gbWF0Y2hpbmZvOwotCXVfaW50MzJfdCBjdGluZm87Ci0JY29uc3QgdV9pbnQzMl90ICpjdG1hcmsgPSBuZl9jdF9nZXRfbWFyayhza2IsICZjdGluZm8pOwotCWlmICghY3RtYXJrKQorCXN0cnVjdCBuZl9jb25uICpjdDsKKwllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbzsKKworCWN0ID0gbmZfY3RfZ2V0KHNrYiwgJmN0aW5mbyk7CisJaWYgKCFjdCkKIAkJcmV0dXJuIDA7CiAKLQlyZXR1cm4gKCgoKmN0bWFyaykgJiBpbmZvLT5tYXNrKSA9PSBpbmZvLT5tYXJrKSBeIGluZm8tPmludmVydDsKKwlyZXR1cm4gKCgoY3QtPm1hcmspICYgaW5mby0+bWFzaykgPT0gaW5mby0+bWFyaykgXiBpbmZvLT5pbnZlcnQ7CiB9CiAKIHN0YXRpYyBpbnQKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfY29ubnRyYWNrLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X2Nvbm50cmFjay5jCmluZGV4IDI4ODVjMzcuLmY0ZWE4ZmUgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIveHRfY29ubnRyYWNrLmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9jb25udHJhY2suYwpAQCAtMTAsMTIxICsxMCwxNSBAQAogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0KLSNpZiBkZWZpbmVkKENPTkZJR19JUF9ORl9DT05OVFJBQ0spIHx8IGRlZmluZWQoQ09ORklHX0lQX05GX0NPTk5UUkFDS19NT0RVTEUpCi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfY29ubnRyYWNrX3R1cGxlLmg+Ci0jZWxzZQotI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrLmg+Ci0jZW5kaWYKLQogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9jb25udHJhY2suaD4KLSNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb21wYXQuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oPgogCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfQVVUSE9SKCJNYXJjIEJvdWNoZXIgPG1hcmNAbWJzaS5jYT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiaXB0YWJsZXMgY29ubmVjdGlvbiB0cmFja2luZyBtYXRjaCBtb2R1bGUiKTsKIE1PRFVMRV9BTElBUygiaXB0X2Nvbm50cmFjayIpOwogCi0jaWYgZGVmaW5lZChDT05GSUdfSVBfTkZfQ09OTlRSQUNLKSB8fCBkZWZpbmVkKENPTkZJR19JUF9ORl9DT05OVFJBQ0tfTU9EVUxFKQotCi1zdGF0aWMgaW50Ci1tYXRjaChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLSAgICAgIGNvbnN0IHN0cnVjdCB4dF9tYXRjaCAqbWF0Y2gsCi0gICAgICBjb25zdCB2b2lkICptYXRjaGluZm8sCi0gICAgICBpbnQgb2Zmc2V0LAotICAgICAgdW5zaWduZWQgaW50IHByb3RvZmYsCi0gICAgICBpbnQgKmhvdGRyb3ApCi17Ci0JY29uc3Qgc3RydWN0IHh0X2Nvbm50cmFja19pbmZvICpzaW5mbyA9IG1hdGNoaW5mbzsKLQlzdHJ1Y3QgaXBfY29ubnRyYWNrICpjdDsKLQllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbzsKLQl1bnNpZ25lZCBpbnQgc3RhdGViaXQ7Ci0KLQljdCA9IGlwX2Nvbm50cmFja19nZXQoKHN0cnVjdCBza19idWZmICopc2tiLCAmY3RpbmZvKTsKLQotI2RlZmluZSBGV0lOVihib29sLCBpbnZmbGcpICgoYm9vbCkgXiAhIShzaW5mby0+aW52ZmxhZ3MgJiBpbnZmbGcpKQotCi0JaWYgKGN0ID09ICZpcF9jb25udHJhY2tfdW50cmFja2VkKQotCQlzdGF0ZWJpdCA9IFhUX0NPTk5UUkFDS19TVEFURV9VTlRSQUNLRUQ7Ci0JZWxzZSBpZiAoY3QpCi0JCXN0YXRlYml0ID0gWFRfQ09OTlRSQUNLX1NUQVRFX0JJVChjdGluZm8pOwotCWVsc2UKLQkJc3RhdGViaXQgPSBYVF9DT05OVFJBQ0tfU1RBVEVfSU5WQUxJRDsKLQotCWlmIChzaW5mby0+ZmxhZ3MgJiBYVF9DT05OVFJBQ0tfU1RBVEUpIHsKLQkJaWYgKGN0KSB7Ci0JCQlpZiAodGVzdF9iaXQoSVBTX1NSQ19OQVRfQklULCAmY3QtPnN0YXR1cykpCi0JCQkJc3RhdGViaXQgfD0gWFRfQ09OTlRSQUNLX1NUQVRFX1NOQVQ7Ci0JCQlpZiAodGVzdF9iaXQoSVBTX0RTVF9OQVRfQklULCAmY3QtPnN0YXR1cykpCi0JCQkJc3RhdGViaXQgfD0gWFRfQ09OTlRSQUNLX1NUQVRFX0ROQVQ7Ci0JCX0KLQkJaWYgKEZXSU5WKChzdGF0ZWJpdCAmIHNpbmZvLT5zdGF0ZW1hc2spID09IDAsCi0JCQkgIFhUX0NPTk5UUkFDS19TVEFURSkpCi0JCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAoY3QgPT0gTlVMTCkgewotCQlpZiAoc2luZm8tPmZsYWdzICYgflhUX0NPTk5UUkFDS19TVEFURSkKLQkJCXJldHVybiAwOwotCQlyZXR1cm4gMTsKLQl9Ci0KLQlpZiAoc2luZm8tPmZsYWdzICYgWFRfQ09OTlRSQUNLX1BST1RPICYmCi0JICAgIEZXSU5WKGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZS5kc3QucHJvdG9udW0gIT0KLQkJICBzaW5mby0+dHVwbGVbSVBfQ1RfRElSX09SSUdJTkFMXS5kc3QucHJvdG9udW0sCi0JCSAgWFRfQ09OTlRSQUNLX1BST1RPKSkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoc2luZm8tPmZsYWdzICYgWFRfQ09OTlRSQUNLX09SSUdTUkMgJiYKLQkgICAgRldJTlYoKGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZS5zcmMuaXAgJgotCQkgICBzaW5mby0+c2lwbXNrW0lQX0NUX0RJUl9PUklHSU5BTF0uc19hZGRyKSAhPQotCQkgIHNpbmZvLT50dXBsZVtJUF9DVF9ESVJfT1JJR0lOQUxdLnNyYy5pcCwKLQkJICBYVF9DT05OVFJBQ0tfT1JJR1NSQykpCi0JCXJldHVybiAwOwotCi0JaWYgKHNpbmZvLT5mbGFncyAmIFhUX0NPTk5UUkFDS19PUklHRFNUICYmCi0JICAgIEZXSU5WKChjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUuZHN0LmlwICYKLQkJICAgc2luZm8tPmRpcG1za1tJUF9DVF9ESVJfT1JJR0lOQUxdLnNfYWRkcikgIT0KLQkJICBzaW5mby0+dHVwbGVbSVBfQ1RfRElSX09SSUdJTkFMXS5kc3QuaXAsCi0JCSAgWFRfQ09OTlRSQUNLX09SSUdEU1QpKQotCQlyZXR1cm4gMDsKLQotCWlmIChzaW5mby0+ZmxhZ3MgJiBYVF9DT05OVFJBQ0tfUkVQTFNSQyAmJgotCSAgICBGV0lOVigoY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlLnNyYy5pcCAmCi0JCSAgIHNpbmZvLT5zaXBtc2tbSVBfQ1RfRElSX1JFUExZXS5zX2FkZHIpICE9Ci0JCSAgc2luZm8tPnR1cGxlW0lQX0NUX0RJUl9SRVBMWV0uc3JjLmlwLAotCQkgIFhUX0NPTk5UUkFDS19SRVBMU1JDKSkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoc2luZm8tPmZsYWdzICYgWFRfQ09OTlRSQUNLX1JFUExEU1QgJiYKLQkgICAgRldJTlYoKGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX1JFUExZXS50dXBsZS5kc3QuaXAgJgotCQkgICBzaW5mby0+ZGlwbXNrW0lQX0NUX0RJUl9SRVBMWV0uc19hZGRyKSAhPQotCQkgIHNpbmZvLT50dXBsZVtJUF9DVF9ESVJfUkVQTFldLmRzdC5pcCwKLQkJICBYVF9DT05OVFJBQ0tfUkVQTERTVCkpCi0JCXJldHVybiAwOwotCi0JaWYgKHNpbmZvLT5mbGFncyAmIFhUX0NPTk5UUkFDS19TVEFUVVMgJiYKLQkgICAgRldJTlYoKGN0LT5zdGF0dXMgJiBzaW5mby0+c3RhdHVzbWFzaykgPT0gMCwKLQkJICBYVF9DT05OVFJBQ0tfU1RBVFVTKSkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoc2luZm8tPmZsYWdzICYgWFRfQ09OTlRSQUNLX0VYUElSRVMpIHsKLQkJdW5zaWduZWQgbG9uZyBleHBpcmVzID0gdGltZXJfcGVuZGluZygmY3QtPnRpbWVvdXQpID8KLQkJCQkJKGN0LT50aW1lb3V0LmV4cGlyZXMgLSBqaWZmaWVzKS9IWiA6IDA7Ci0KLQkJaWYgKEZXSU5WKCEoZXhwaXJlcyA+PSBzaW5mby0+ZXhwaXJlc19taW4gJiYKLQkJCSAgICBleHBpcmVzIDw9IHNpbmZvLT5leHBpcmVzX21heCksCi0JCQkgIFhUX0NPTk5UUkFDS19FWFBJUkVTKSkKLQkJCXJldHVybiAwOwotCX0KLQlyZXR1cm4gMTsKLX0KLQotI2Vsc2UgLyogQ09ORklHX0lQX05GX0NPTk5UUkFDSyAqLwogc3RhdGljIGludAogbWF0Y2goY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKQEAgLTIyMCw4ICsxMTQsNiBAQAogCXJldHVybiAxOwogfQogCi0jZW5kaWYgLyogQ09ORklHX05GX0lQX0NPTk5UUkFDSyAqLwotCiBzdGF0aWMgaW50CiBjaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKIAkgICBjb25zdCB2b2lkICppcCwKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfZHNjcC5jIGIvbmV0L25ldGZpbHRlci94dF9kc2NwLmMKaW5kZXggMjZjN2Y0YS4uNTZiMjQ3ZSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94dF9kc2NwLmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9kc2NwLmMKQEAgLTEsNyArMSw1IEBACiAvKiBJUCB0YWJsZXMgbW9kdWxlIGZvciBtYXRjaGluZyB0aGUgdmFsdWUgb2YgdGhlIElQdjQvSVB2NiBEU0NQIGZpZWxkCiAgKgotICogeHRfZHNjcC5jLHYgMS4zIDIwMDIvMDgvMDUgMTk6MDA6MjEgbGFmb3JnZSBFeHAKLSAqCiAgKiAoQykgMjAwMiBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAbmV0ZmlsdGVyLm9yZz4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQpAQCAtMzQsNyArMzIsNyBAQAogCQkgaW50ICpob3Rkcm9wKQogewogCWNvbnN0IHN0cnVjdCB4dF9kc2NwX2luZm8gKmluZm8gPSBtYXRjaGluZm87Ci0JdV9pbnQ4X3QgZHNjcCA9IGlwdjRfZ2V0X2RzZmllbGQoc2tiLT5uaC5pcGgpID4+IFhUX0RTQ1BfU0hJRlQ7CisJdV9pbnQ4X3QgZHNjcCA9IGlwdjRfZ2V0X2RzZmllbGQoaXBfaGRyKHNrYikpID4+IFhUX0RTQ1BfU0hJRlQ7CiAKIAlyZXR1cm4gKGRzY3AgPT0gaW5mby0+ZHNjcCkgXiAhIWluZm8tPmludmVydDsKIH0KQEAgLTQ5LDcgKzQ3LDcgQEAKIAkJICBpbnQgKmhvdGRyb3ApCiB7CiAJY29uc3Qgc3RydWN0IHh0X2RzY3BfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKLQl1X2ludDhfdCBkc2NwID0gaXB2Nl9nZXRfZHNmaWVsZChza2ItPm5oLmlwdjZoKSA+PiBYVF9EU0NQX1NISUZUOworCXVfaW50OF90IGRzY3AgPSBpcHY2X2dldF9kc2ZpZWxkKGlwdjZfaGRyKHNrYikpID4+IFhUX0RTQ1BfU0hJRlQ7CiAKIAlyZXR1cm4gKGRzY3AgPT0gaW5mby0+ZHNjcCkgXiAhIWluZm8tPmludmVydDsKIH0KZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfaGFzaGxpbWl0LmMgYi9uZXQvbmV0ZmlsdGVyL3h0X2hhc2hsaW1pdC5jCmluZGV4IDlmMzdkNTkuLmQzMDQzZmEgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIveHRfaGFzaGxpbWl0LmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9oYXNobGltaXQuYwpAQCAtMjE2LDEwICsyMTYsOCBAQAogCWhpbmZvLT5wZGUtPnByb2NfZm9wcyA9ICZkbF9maWxlX29wczsKIAloaW5mby0+cGRlLT5kYXRhID0gaGluZm87CiAKLQlpbml0X3RpbWVyKCZoaW5mby0+dGltZXIpOworCXNldHVwX3RpbWVyKCZoaW5mby0+dGltZXIsIGh0YWJsZV9nYywgKHVuc2lnbmVkIGxvbmcgKWhpbmZvKTsKIAloaW5mby0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKGhpbmZvLT5jZmcuZ2NfaW50ZXJ2YWwpOwotCWhpbmZvLT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcgKWhpbmZvOwotCWhpbmZvLT50aW1lci5mdW5jdGlvbiA9IGh0YWJsZV9nYzsKIAlhZGRfdGltZXIoJmhpbmZvLT50aW1lcik7CiAKIAlzcGluX2xvY2tfYmgoJmhhc2hsaW1pdF9sb2NrKTsKQEAgLTM4MCwyMiArMzc4LDIyIEBACiAJc3dpdGNoIChoaW5mby0+ZmFtaWx5KSB7CiAJY2FzZSBBRl9JTkVUOgogCQlpZiAoaGluZm8tPmNmZy5tb2RlICYgWFRfSEFTSExJTUlUX0hBU0hfRElQKQotCQkJZHN0LT5hZGRyLmlwLmRzdCA9IHNrYi0+bmguaXBoLT5kYWRkcjsKKwkJCWRzdC0+YWRkci5pcC5kc3QgPSBpcF9oZHIoc2tiKS0+ZGFkZHI7CiAJCWlmIChoaW5mby0+Y2ZnLm1vZGUgJiBYVF9IQVNITElNSVRfSEFTSF9TSVApCi0JCQlkc3QtPmFkZHIuaXAuc3JjID0gc2tiLT5uaC5pcGgtPnNhZGRyOworCQkJZHN0LT5hZGRyLmlwLnNyYyA9IGlwX2hkcihza2IpLT5zYWRkcjsKIAogCQlpZiAoIShoaW5mby0+Y2ZnLm1vZGUgJgogCQkgICAgICAoWFRfSEFTSExJTUlUX0hBU0hfRFBUIHwgWFRfSEFTSExJTUlUX0hBU0hfU1BUKSkpCiAJCQlyZXR1cm4gMDsKLQkJbmV4dGhkciA9IHNrYi0+bmguaXBoLT5wcm90b2NvbDsKKwkJbmV4dGhkciA9IGlwX2hkcihza2IpLT5wcm90b2NvbDsKIAkJYnJlYWs7CiAjaWYgZGVmaW5lZChDT05GSUdfSVA2X05GX0lQVEFCTEVTKSB8fCBkZWZpbmVkKENPTkZJR19JUDZfTkZfSVBUQUJMRVNfTU9EVUxFKQogCWNhc2UgQUZfSU5FVDY6CiAJCWlmIChoaW5mby0+Y2ZnLm1vZGUgJiBYVF9IQVNITElNSVRfSEFTSF9ESVApCi0JCQltZW1jcHkoJmRzdC0+YWRkci5pcDYuZHN0LCAmc2tiLT5uaC5pcHY2aC0+ZGFkZHIsCisJCQltZW1jcHkoJmRzdC0+YWRkci5pcDYuZHN0LCAmaXB2Nl9oZHIoc2tiKS0+ZGFkZHIsCiAJCQkgICAgICAgc2l6ZW9mKGRzdC0+YWRkci5pcDYuZHN0KSk7CiAJCWlmIChoaW5mby0+Y2ZnLm1vZGUgJiBYVF9IQVNITElNSVRfSEFTSF9TSVApCi0JCQltZW1jcHkoJmRzdC0+YWRkci5pcDYuc3JjLCAmc2tiLT5uaC5pcHY2aC0+c2FkZHIsCisJCQltZW1jcHkoJmRzdC0+YWRkci5pcDYuc3JjLCAmaXB2Nl9oZHIoc2tiKS0+c2FkZHIsCiAJCQkgICAgICAgc2l6ZW9mKGRzdC0+YWRkci5pcDYuc3JjKSk7CiAKIAkJaWYgKCEoaGluZm8tPmNmZy5tb2RlICYKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfaGVscGVyLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X2hlbHBlci5jCmluZGV4IDQwN2QxZDUuLmMxMzliMmYgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIveHRfaGVscGVyLmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9oZWxwZXIuYwpAQCAtNSwyNiArNSwxNiBAQAogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiAgIDE5IE1hciAyMDAyIEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+OgotICogICAJCSAtIFBvcnQgdG8gbmV3bmF0IGluZnJhc3RydWN0dXJlCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgotI2lmIGRlZmluZWQoQ09ORklHX0lQX05GX0NPTk5UUkFDSykgfHwgZGVmaW5lZChDT05GSUdfSVBfTkZfQ09OTlRSQUNLX01PRFVMRSkKLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2suaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfY29yZS5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFja19oZWxwZXIuaD4KLSNlbHNlCiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2suaD4KICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb3JlLmg+CiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaGVscGVyLmg+Ci0jZW5kaWYKICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfaGVscGVyLmg+Ci0jaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29tcGF0Lmg+CiAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9BVVRIT1IoIk1hcnRpbiBKb3NlZnNzb24gPGdhbmRhbGZAbmV0ZmlsdGVyLm9yZz4iKTsKQEAgLTM4LDU1ICsyOCw2IEBACiAjZGVmaW5lIERFQlVHUChmb3JtYXQsIGFyZ3MuLi4pCiAjZW5kaWYKIAotI2lmIGRlZmluZWQoQ09ORklHX0lQX05GX0NPTk5UUkFDSykgfHwgZGVmaW5lZChDT05GSUdfSVBfTkZfQ09OTlRSQUNLX01PRFVMRSkKLXN0YXRpYyBpbnQKLW1hdGNoKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0gICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0gICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotICAgICAgY29uc3Qgc3RydWN0IHh0X21hdGNoICptYXRjaCwKLSAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKLSAgICAgIGludCBvZmZzZXQsCi0gICAgICB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKLSAgICAgIGludCAqaG90ZHJvcCkKLXsKLQljb25zdCBzdHJ1Y3QgeHRfaGVscGVyX2luZm8gKmluZm8gPSBtYXRjaGluZm87Ci0Jc3RydWN0IGlwX2Nvbm50cmFjayAqY3Q7Ci0JZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm87Ci0JaW50IHJldCA9IGluZm8tPmludmVydDsKLQotCWN0ID0gaXBfY29ubnRyYWNrX2dldCgoc3RydWN0IHNrX2J1ZmYgKilza2IsICZjdGluZm8pOwotCWlmICghY3QpIHsKLQkJREVCVUdQKCJ4dF9oZWxwZXI6IEVlayEgaW52YWxpZCBjb25udHJhY2s/XG4iKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlpZiAoIWN0LT5tYXN0ZXIpIHsKLQkJREVCVUdQKCJ4dF9oZWxwZXI6IGNvbm50cmFjayAlcCBoYXMgbm8gbWFzdGVyXG4iLCBjdCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcmVhZF9sb2NrX2JoKCZpcF9jb25udHJhY2tfbG9jayk7Ci0JaWYgKCFjdC0+bWFzdGVyLT5oZWxwZXIpIHsKLQkJREVCVUdQKCJ4dF9oZWxwZXI6IG1hc3RlciBjdCAlcCBoYXMgbm8gaGVscGVyXG4iLAotCQkJZXhwLT5leHBlY3RhbnQpOwotCQlnb3RvIG91dF91bmxvY2s7Ci0JfQotCi0JREVCVUdQKCJtYXN0ZXIncyBuYW1lID0gJXMgLCBpbmZvLT5uYW1lID0gJXNcbiIsCi0JCWN0LT5tYXN0ZXItPmhlbHBlci0+bmFtZSwgaW5mby0+bmFtZSk7Ci0KLQlpZiAoaW5mby0+bmFtZVswXSA9PSAnXDAnKQotCQlyZXQgXj0gMTsKLQllbHNlCi0JCXJldCBePSAhc3RybmNtcChjdC0+bWFzdGVyLT5oZWxwZXItPm5hbWUsIGluZm8tPm5hbWUsCi0JCQkJc3RybGVuKGN0LT5tYXN0ZXItPmhlbHBlci0+bmFtZSkpOwotb3V0X3VubG9jazoKLQlyZWFkX3VubG9ja19iaCgmaXBfY29ubnRyYWNrX2xvY2spOwotCXJldHVybiByZXQ7Ci19Ci0KLSNlbHNlIC8qIENPTkZJR19JUF9ORl9DT05OVFJBQ0sgKi8KLQogc3RhdGljIGludAogbWF0Y2goY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKQEAgLTEzNCw3ICs3NSw2IEBACiAJcmVhZF91bmxvY2tfYmgoJm5mX2Nvbm50cmFja19sb2NrKTsKIAlyZXR1cm4gcmV0OwogfQotI2VuZGlmCiAKIHN0YXRpYyBpbnQgY2hlY2soY29uc3QgY2hhciAqdGFibGVuYW1lLAogCQkgY29uc3Qgdm9pZCAqaW5mLApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9sZW5ndGguYyBiL25ldC9uZXRmaWx0ZXIveHRfbGVuZ3RoLmMKaW5kZXggMzJmYjk5OC4uNzcyODhjNSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94dF9sZW5ndGguYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X2xlbmd0aC5jCkBAIC0zMSw3ICszMSw3IEBACiAgICAgICBpbnQgKmhvdGRyb3ApCiB7CiAJY29uc3Qgc3RydWN0IHh0X2xlbmd0aF9pbmZvICppbmZvID0gbWF0Y2hpbmZvOwotCXVfaW50MTZfdCBwa3RsZW4gPSBudG9ocyhza2ItPm5oLmlwaC0+dG90X2xlbik7CisJdV9pbnQxNl90IHBrdGxlbiA9IG50b2hzKGlwX2hkcihza2IpLT50b3RfbGVuKTsKIAogCXJldHVybiAocGt0bGVuID49IGluZm8tPm1pbiAmJiBwa3RsZW4gPD0gaW5mby0+bWF4KSBeIGluZm8tPmludmVydDsKIH0KQEAgLTQ3LDcgKzQ3LDggQEAKICAgICAgICBpbnQgKmhvdGRyb3ApCiB7CiAJY29uc3Qgc3RydWN0IHh0X2xlbmd0aF9pbmZvICppbmZvID0gbWF0Y2hpbmZvOwotCXVfaW50MTZfdCBwa3RsZW4gPSBudG9ocyhza2ItPm5oLmlwdjZoLT5wYXlsb2FkX2xlbikgKyBzaXplb2Yoc3RydWN0IGlwdjZoZHIpOworCWNvbnN0IHVfaW50MTZfdCBwa3RsZW4gPSAobnRvaHMoaXB2Nl9oZHIoc2tiKS0+cGF5bG9hZF9sZW4pICsKKwkJCQkgIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikpOwogCiAJcmV0dXJuIChwa3RsZW4gPj0gaW5mby0+bWluICYmIHBrdGxlbiA8PSBpbmZvLT5tYXgpIF4gaW5mby0+aW52ZXJ0OwogfQpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9saW1pdC5jIGIvbmV0L25ldGZpbHRlci94dF9saW1pdC5jCmluZGV4IDZmZDgzNDcuLjU3MWE3MmEgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIveHRfbGltaXQuYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X2xpbWl0LmMKQEAgLTEsMTAgKzEsMyBAQAotLyogS2VybmVsIG1vZHVsZSB0byBjb250cm9sIHRoZSByYXRlCi0gKgotICogMiBTZXB0ZW1iZXIgMTk5OTogQ2hhbmdlZCBmcm9tIHRoZSB0YXJnZXQgUkFURSB0byB0aGUgbWF0Y2gKLSAqICAgICAgICAgICAgICAgICAgIGBsaW1pdCcsIHJlbW92ZWQgbG9nZ2luZy4gIERpZCBJIG1lbnRpb24gdGhhdAotICogICAgICAgICAgICAgICAgICAgQWxleGV5IGlzIGEgZnVja2luZyBnZW5pdXM/Ci0gKiAgICAgICAgICAgICAgICAgICBSdXN0eSBSdXNzZWxsIChydXN0eUBydXN0Y29ycC5jb20uYXUpLiAgKi8KLQogLyogKEMpIDE5OTkgSuly9G1lIGRlIFZpdmllIDxkZXZpdmllQGluZm8uZW5zZXJiLnUtYm9yZGVhdXguZnI+CiAgKiAoQykgMTk5OSBIZXJ26SBFeWNoZW5uZSA8ZXljaGVubmVAaW5mby5lbnNlcmIudS1ib3JkZWF1eC5mcj4KICAqCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X21hYy5jIGIvbmV0L25ldGZpbHRlci94dF9tYWMuYwppbmRleCBkNDMwZDkwLi4xZDNhMWQ5IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL3h0X21hYy5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfbWFjLmMKQEAgLTM3LDggKzM3LDggQEAKICAgICBjb25zdCBzdHJ1Y3QgeHRfbWFjX2luZm8gKmluZm8gPSBtYXRjaGluZm87CiAKICAgICAvKiBJcyBtYWMgcG9pbnRlciB2YWxpZD8gKi8KLSAgICByZXR1cm4gKHNrYi0+bWFjLnJhdyA+PSBza2ItPmhlYWQKLQkgICAgJiYgKHNrYi0+bWFjLnJhdyArIEVUSF9ITEVOKSA8PSBza2ItPmRhdGEKKyAgICByZXR1cm4gKHNrYl9tYWNfaGVhZGVyKHNrYikgPj0gc2tiLT5oZWFkICYmCisJICAgIChza2JfbWFjX2hlYWRlcihza2IpICsgRVRIX0hMRU4pIDw9IHNrYi0+ZGF0YQogCSAgICAvKiBJZiBzbywgY29tcGFyZS4uLiAqLwogCSAgICAmJiAoKCFjb21wYXJlX2V0aGVyX2FkZHIoZXRoX2hkcihza2IpLT5oX3NvdXJjZSwgaW5mby0+c3JjYWRkcikpCiAJCV4gaW5mby0+aW52ZXJ0KSk7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X3BrdHR5cGUuYyBiL25ldC9uZXRmaWx0ZXIveHRfcGt0dHlwZS5jCmluZGV4IDE2ZTdiMDguLmUxNDA5ZmMgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIveHRfcGt0dHlwZS5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfcGt0dHlwZS5jCkBAIC0zNCw3ICszNCw3IEBACiAJY29uc3Qgc3RydWN0IHh0X3BrdHR5cGVfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKIAogCWlmIChza2ItPnBrdF90eXBlID09IFBBQ0tFVF9MT09QQkFDSykKLQkJdHlwZSA9IChNVUxUSUNBU1Qoc2tiLT5uaC5pcGgtPmRhZGRyKQorCQl0eXBlID0gKE1VTFRJQ0FTVChpcF9oZHIoc2tiKS0+ZGFkZHIpCiAJCQk/IFBBQ0tFVF9NVUxUSUNBU1QKIAkJCTogUEFDS0VUX0JST0FEQ0FTVCk7CiAJZWxzZQpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9yZWFsbS5jIGIvbmV0L25ldGZpbHRlci94dF9yZWFsbS5jCmluZGV4IDk3ZmZjMmYuLmMyMDE3ZjggMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIveHRfcmVhbG0uYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X3JlYWxtLmMKQEAgLTEsNyArMSw1IEBACiAvKiBJUCB0YWJsZXMgbW9kdWxlIGZvciBtYXRjaGluZyB0aGUgcm91dGluZyByZWFsbQogICoKLSAqICRJZDogaXB0X3JlYWxtLmMsdiAxLjMgMjAwNC8wMy8wNSAxMzoyNTo0MCBsYWZvcmdlIEV4cCAkCi0gKgogICogKEMpIDIwMDMgYnkgU2FtcHNhIFJhbnRhIDxzYW1wc2FAbmV0c29uaWMuZmk+CiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfc3RhdGUuYyBiL25ldC9uZXRmaWx0ZXIveHRfc3RhdGUuYwppbmRleCBkZjM3YjkxLi4xNDkyOTRmIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL3h0X3N0YXRlLmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9zdGF0ZS5jCkBAIC0xMCw3ICsxMCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLSNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb21wYXQuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9zdGF0ZS5oPgogCkBAIC0zNiw3ICszNiw3IEBACiAKIAlpZiAobmZfY3RfaXNfdW50cmFja2VkKHNrYikpCiAJCXN0YXRlYml0ID0gWFRfU1RBVEVfVU5UUkFDS0VEOwotCWVsc2UgaWYgKCFuZl9jdF9nZXRfY3RpbmZvKHNrYiwgJmN0aW5mbykpCisJZWxzZSBpZiAoIW5mX2N0X2dldChza2IsICZjdGluZm8pKQogCQlzdGF0ZWJpdCA9IFhUX1NUQVRFX0lOVkFMSUQ7CiAJZWxzZQogCQlzdGF0ZWJpdCA9IFhUX1NUQVRFX0JJVChjdGluZm8pOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGxhYmVsL25ldGxhYmVsX2thcGkuYyBiL25ldC9uZXRsYWJlbC9uZXRsYWJlbF9rYXBpLmMKaW5kZXggZTAzYTMyOC4uZjI1MzVlNyAxMDA2NDQKLS0tIGEvbmV0L25ldGxhYmVsL25ldGxhYmVsX2thcGkuYworKysgYi9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfa2FwaS5jCkBAIC0yNjMsOSArMjYzLDYgQEAKIAlpbnQgcmV0X3ZhbCA9IC1FTk9FTlQ7CiAJc3RydWN0IG5ldGxibF9kb21fbWFwICpkb21fZW50cnk7CiAKLQlpZiAoKHNlY2F0dHItPmZsYWdzICYgTkVUTEJMX1NFQ0FUVFJfRE9NQUlOKSA9PSAwKQotCQlyZXR1cm4gLUVOT0VOVDsKLQogCXJjdV9yZWFkX2xvY2soKTsKIAlkb21fZW50cnkgPSBuZXRsYmxfZG9taHNoX2dldGVudHJ5KHNlY2F0dHItPmRvbWFpbik7CiAJaWYgKGRvbV9lbnRyeSA9PSBOVUxMKQpkaWZmIC0tZ2l0IGEvbmV0L25ldGxpbmsvYWZfbmV0bGluay5jIGIvbmV0L25ldGxpbmsvYWZfbmV0bGluay5jCmluZGV4IGM0OGIwZjQ5Li40MmQyZmI5IDEwMDY0NAotLS0gYS9uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMKKysrIGIvbmV0L25ldGxpbmsvYWZfbmV0bGluay5jCkBAIC01Niw2ICs1Niw3IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9hdWRpdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlbGludXguaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogCiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KICNpbmNsdWRlIDxuZXQvc2NtLmg+CkBAIC03Niw3ICs3Nyw4IEBACiAJdW5zaWduZWQgbG9uZwkJc3RhdGU7CiAJd2FpdF9xdWV1ZV9oZWFkX3QJd2FpdDsKIAlzdHJ1Y3QgbmV0bGlua19jYWxsYmFjawkqY2I7Ci0Jc3BpbmxvY2tfdAkJY2JfbG9jazsKKwlzdHJ1Y3QgbXV0ZXgJCSpjYl9tdXRleDsKKwlzdHJ1Y3QgbXV0ZXgJCWNiX2RlZl9tdXRleDsKIAl2b2lkCQkJKCpkYXRhX3JlYWR5KShzdHJ1Y3Qgc29jayAqc2ssIGludCBieXRlcyk7CiAJc3RydWN0IG1vZHVsZQkJKm1vZHVsZTsKIH07CkBAIC0xMDgsNiArMTEwLDcgQEAKIAl1bnNpZ25lZCBsb25nICpsaXN0ZW5lcnM7CiAJdW5zaWduZWQgaW50IG5sX25vbnJvb3Q7CiAJdW5zaWduZWQgaW50IGdyb3VwczsKKwlzdHJ1Y3QgbXV0ZXggKmNiX211dGV4OwogCXN0cnVjdCBtb2R1bGUgKm1vZHVsZTsKIAlpbnQgcmVnaXN0ZXJlZDsKIH07CkBAIC0xMTgsNiArMTIxLDcgQEAKIAogc3RhdGljIGludCBuZXRsaW5rX2R1bXAoc3RydWN0IHNvY2sgKnNrKTsKIHN0YXRpYyB2b2lkIG5ldGxpbmtfZGVzdHJveV9jYWxsYmFjayhzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpOworc3RhdGljIHZvaWQgbmV0bGlua19xdWV1ZV9za2lwKHN0cnVjdCBubG1zZ2hkciAqbmxoLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIAogc3RhdGljIERFRklORV9SV0xPQ0sobmxfdGFibGVfbG9jayk7CiBzdGF0aWMgYXRvbWljX3QgbmxfdGFibGVfdXNlcnMgPSBBVE9NSUNfSU5JVCgwKTsKQEAgLTM3MCw3ICszNzQsOCBAQAogCS5vYmpfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgbmV0bGlua19zb2NrKSwKIH07CiAKLXN0YXRpYyBpbnQgX19uZXRsaW5rX2NyZWF0ZShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgcHJvdG9jb2wpCitzdGF0aWMgaW50IF9fbmV0bGlua19jcmVhdGUoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG11dGV4ICpjYl9tdXRleCwKKwkJCSAgICBpbnQgcHJvdG9jb2wpCiB7CiAJc3RydWN0IHNvY2sgKnNrOwogCXN0cnVjdCBuZXRsaW5rX3NvY2sgKm5sazsKQEAgLTM4NCw3ICszODksMTIgQEAKIAlzb2NrX2luaXRfZGF0YShzb2NrLCBzayk7CiAKIAlubGsgPSBubGtfc2soc2spOwotCXNwaW5fbG9ja19pbml0KCZubGstPmNiX2xvY2spOworCWlmIChjYl9tdXRleCkKKwkJbmxrLT5jYl9tdXRleCA9IGNiX211dGV4OworCWVsc2UgeworCQlubGstPmNiX211dGV4ID0gJm5say0+Y2JfZGVmX211dGV4OworCQltdXRleF9pbml0KG5say0+Y2JfbXV0ZXgpOworCX0KIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZubGstPndhaXQpOwogCiAJc2stPnNrX2Rlc3RydWN0ID0gbmV0bGlua19zb2NrX2Rlc3RydWN0OwpAQCAtMzk1LDggKzQwNSw4IEBACiBzdGF0aWMgaW50IG5ldGxpbmtfY3JlYXRlKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBwcm90b2NvbCkKIHsKIAlzdHJ1Y3QgbW9kdWxlICptb2R1bGUgPSBOVUxMOworCXN0cnVjdCBtdXRleCAqY2JfbXV0ZXg7CiAJc3RydWN0IG5ldGxpbmtfc29jayAqbmxrOwotCXVuc2lnbmVkIGludCBncm91cHM7CiAJaW50IGVyciA9IDA7CiAKIAlzb2NrLT5zdGF0ZSA9IFNTX1VOQ09OTkVDVEVEOwpAQCAtNDE4LDEwICs0MjgsMTAgQEAKIAlpZiAobmxfdGFibGVbcHJvdG9jb2xdLnJlZ2lzdGVyZWQgJiYKIAkgICAgdHJ5X21vZHVsZV9nZXQobmxfdGFibGVbcHJvdG9jb2xdLm1vZHVsZSkpCiAJCW1vZHVsZSA9IG5sX3RhYmxlW3Byb3RvY29sXS5tb2R1bGU7Ci0JZ3JvdXBzID0gbmxfdGFibGVbcHJvdG9jb2xdLmdyb3VwczsKKwljYl9tdXRleCA9IG5sX3RhYmxlW3Byb3RvY29sXS5jYl9tdXRleDsKIAluZXRsaW5rX3VubG9ja190YWJsZSgpOwogCi0JaWYgKChlcnIgPSBfX25ldGxpbmtfY3JlYXRlKHNvY2ssIHByb3RvY29sKSkgPCAwKQorCWlmICgoZXJyID0gX19uZXRsaW5rX2NyZWF0ZShzb2NrLCBjYl9tdXRleCwgcHJvdG9jb2wpKSA8IDApCiAJCWdvdG8gb3V0X21vZHVsZTsKIAogCW5sayA9IG5sa19zayhzb2NrLT5zayk7CkBAIC00NDYsMTQgKzQ1NiwxNCBAQAogCXNvY2tfb3JwaGFuKHNrKTsKIAlubGsgPSBubGtfc2soc2spOwogCi0Jc3Bpbl9sb2NrKCZubGstPmNiX2xvY2spOworCW11dGV4X2xvY2sobmxrLT5jYl9tdXRleCk7CiAJaWYgKG5say0+Y2IpIHsKIAkJaWYgKG5say0+Y2ItPmRvbmUpCiAJCQlubGstPmNiLT5kb25lKG5say0+Y2IpOwogCQluZXRsaW5rX2Rlc3Ryb3lfY2FsbGJhY2sobmxrLT5jYik7CiAJCW5say0+Y2IgPSBOVUxMOwogCX0KLQlzcGluX3VubG9jaygmbmxrLT5jYl9sb2NrKTsKKwltdXRleF91bmxvY2sobmxrLT5jYl9tdXRleCk7CiAKIAkvKiBPSy4gU29ja2V0IGlzIHVubGlua2VkLCBhbmQsIHRoZXJlZm9yZSwKIAkgICBubyBuZXcgcGFja2V0cyB3aWxsIGFycml2ZSAqLwpAQCAtMTIxNSw3ICsxMjI1LDcgQEAKIAkJY29waWVkID0gbGVuOwogCX0KIAotCXNrYi0+aC5yYXcgPSBza2ItPmRhdGE7CisJc2tiX3Jlc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKIAllcnIgPSBza2JfY29weV9kYXRhZ3JhbV9pb3ZlYyhza2IsIDAsIG1zZy0+bXNnX2lvdiwgY29waWVkKTsKIAogCWlmIChtc2ctPm1zZ19uYW1lKSB7CkBAIC0xMjQyLDYgKzEyNTIsOSBAQAogCiAJc2NtX3JlY3Yoc29jaywgbXNnLCBzaW9jYi0+c2NtLCBmbGFncyk7CiAKKwlpZiAoZmxhZ3MgJiBNU0dfVFJVTkMpCisJCWNvcGllZCA9IHNrYi0+bGVuOworCiBvdXQ6CiAJbmV0bGlua19yY3Zfd2FrZShzayk7CiAJcmV0dXJuIGVyciA/IDogY29waWVkOwpAQCAtMTI2NSw3ICsxMjc4LDcgQEAKIHN0cnVjdCBzb2NrICoKIG5ldGxpbmtfa2VybmVsX2NyZWF0ZShpbnQgdW5pdCwgdW5zaWduZWQgaW50IGdyb3VwcywKIAkJICAgICAgdm9pZCAoKmlucHV0KShzdHJ1Y3Qgc29jayAqc2ssIGludCBsZW4pLAotCQkgICAgICBzdHJ1Y3QgbW9kdWxlICptb2R1bGUpCisJCSAgICAgIHN0cnVjdCBtdXRleCAqY2JfbXV0ZXgsIHN0cnVjdCBtb2R1bGUgKm1vZHVsZSkKIHsKIAlzdHJ1Y3Qgc29ja2V0ICpzb2NrOwogCXN0cnVjdCBzb2NrICpzazsKQEAgLTEyODAsNyArMTI5Myw3IEBACiAJaWYgKHNvY2tfY3JlYXRlX2xpdGUoUEZfTkVUTElOSywgU09DS19ER1JBTSwgdW5pdCwgJnNvY2spKQogCQlyZXR1cm4gTlVMTDsKIAotCWlmIChfX25ldGxpbmtfY3JlYXRlKHNvY2ssIHVuaXQpIDwgMCkKKwlpZiAoX19uZXRsaW5rX2NyZWF0ZShzb2NrLCBjYl9tdXRleCwgdW5pdCkgPCAwKQogCQlnb3RvIG91dF9zb2NrX3JlbGVhc2U7CiAKIAlpZiAoZ3JvdXBzIDwgMzIpCkBAIC0xMzA0LDYgKzEzMTcsNyBAQAogCW5ldGxpbmtfdGFibGVfZ3JhYigpOwogCW5sX3RhYmxlW3VuaXRdLmdyb3VwcyA9IGdyb3VwczsKIAlubF90YWJsZVt1bml0XS5saXN0ZW5lcnMgPSBsaXN0ZW5lcnM7CisJbmxfdGFibGVbdW5pdF0uY2JfbXV0ZXggPSBjYl9tdXRleDsKIAlubF90YWJsZVt1bml0XS5tb2R1bGUgPSBtb2R1bGU7CiAJbmxfdGFibGVbdW5pdF0ucmVnaXN0ZXJlZCA9IDE7CiAJbmV0bGlua190YWJsZV91bmdyYWIoKTsKQEAgLTEzNDYsNyArMTM2MCw3IEBACiAJaWYgKCFza2IpCiAJCWdvdG8gZXJyb3V0OwogCi0Jc3Bpbl9sb2NrKCZubGstPmNiX2xvY2spOworCW11dGV4X2xvY2sobmxrLT5jYl9tdXRleCk7CiAKIAljYiA9IG5say0+Y2I7CiAJaWYgKGNiID09IE5VTEwpIHsKQEAgLTEzNTcsNyArMTM3MSw3IEBACiAJbGVuID0gY2ItPmR1bXAoc2tiLCBjYik7CiAKIAlpZiAobGVuID4gMCkgewotCQlzcGluX3VubG9jaygmbmxrLT5jYl9sb2NrKTsKKwkJbXV0ZXhfdW5sb2NrKG5say0+Y2JfbXV0ZXgpOwogCQlza2JfcXVldWVfdGFpbCgmc2stPnNrX3JlY2VpdmVfcXVldWUsIHNrYik7CiAJCXNrLT5za19kYXRhX3JlYWR5KHNrLCBsZW4pOwogCQlyZXR1cm4gMDsKQEAgLTEzNzUsMTMgKzEzODksMTMgQEAKIAlpZiAoY2ItPmRvbmUpCiAJCWNiLT5kb25lKGNiKTsKIAlubGstPmNiID0gTlVMTDsKLQlzcGluX3VubG9jaygmbmxrLT5jYl9sb2NrKTsKKwltdXRleF91bmxvY2sobmxrLT5jYl9tdXRleCk7CiAKIAluZXRsaW5rX2Rlc3Ryb3lfY2FsbGJhY2soY2IpOwogCXJldHVybiAwOwogCiBlcnJvdXRfc2tiOgotCXNwaW5fdW5sb2NrKCZubGstPmNiX2xvY2spOworCW11dGV4X3VubG9jayhubGstPmNiX211dGV4KTsKIAlrZnJlZV9za2Ioc2tiKTsKIGVycm91dDoKIAlyZXR1cm4gZXJyOwpAQCAtMTQxMywxOSArMTQyNywyNCBAQAogCX0KIAlubGsgPSBubGtfc2soc2spOwogCS8qIEEgZHVtcCBvciBkZXN0cnVjdGlvbiBpcyBpbiBwcm9ncmVzcy4uLiAqLwotCXNwaW5fbG9jaygmbmxrLT5jYl9sb2NrKTsKKwltdXRleF9sb2NrKG5say0+Y2JfbXV0ZXgpOwogCWlmIChubGstPmNiIHx8IHNvY2tfZmxhZyhzaywgU09DS19ERUFEKSkgewotCQlzcGluX3VubG9jaygmbmxrLT5jYl9sb2NrKTsKKwkJbXV0ZXhfdW5sb2NrKG5say0+Y2JfbXV0ZXgpOwogCQluZXRsaW5rX2Rlc3Ryb3lfY2FsbGJhY2soY2IpOwogCQlzb2NrX3B1dChzayk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCW5say0+Y2IgPSBjYjsKLQlzcGluX3VubG9jaygmbmxrLT5jYl9sb2NrKTsKKwltdXRleF91bmxvY2sobmxrLT5jYl9tdXRleCk7CiAKIAluZXRsaW5rX2R1bXAoc2spOwogCXNvY2tfcHV0KHNrKTsKLQlyZXR1cm4gMDsKKworCS8qIFdlIHN1Y2Nlc3NmdWxseSBzdGFydGVkIGEgZHVtcCwgYnkgcmV0dXJuaW5nIC1FSU5UUiB3ZQorCSAqIHNpZ25hbCB0aGUgcXVldWUgbWFuZ2VtZW50IHRvIGludGVycnVwdCBwcm9jZXNzaW5nIG9mCisJICogYW55IG5ldGxpbmsgbWVzc2FnZXMgc28gdXNlcnNwYWNlIGdldHMgYSBjaGFuY2UgdG8gcmVhZAorCSAqIHRoZSByZXN1bHRzLiAqLworCXJldHVybiAtRUlOVFI7CiB9CiAKIHZvaWQgbmV0bGlua19hY2soc3RydWN0IHNrX2J1ZmYgKmluX3NrYiwgc3RydWN0IG5sbXNnaGRyICpubGgsIGludCBlcnIpCkBAIC0xNDYyLDI3ICsxNDgxLDM1IEBACiB9CiAKIHN0YXRpYyBpbnQgbmV0bGlua19yY3Zfc2tiKHN0cnVjdCBza19idWZmICpza2IsIGludCAoKmNiKShzdHJ1Y3Qgc2tfYnVmZiAqLAotCQkJCQkJICAgICBzdHJ1Y3Qgbmxtc2doZHIgKiwgaW50ICopKQorCQkJCQkJICAgICBzdHJ1Y3Qgbmxtc2doZHIgKikpCiB7CiAJc3RydWN0IG5sbXNnaGRyICpubGg7CiAJaW50IGVycjsKIAogCXdoaWxlIChza2ItPmxlbiA+PSBubG1zZ190b3RhbF9zaXplKDApKSB7Ci0JCW5saCA9IChzdHJ1Y3Qgbmxtc2doZHIgKikgc2tiLT5kYXRhOworCQlubGggPSBubG1zZ19oZHIoc2tiKTsKKwkJZXJyID0gMDsKIAogCQlpZiAobmxoLT5ubG1zZ19sZW4gPCBOTE1TR19IRFJMRU4gfHwgc2tiLT5sZW4gPCBubGgtPm5sbXNnX2xlbikKIAkJCXJldHVybiAwOwogCi0JCWlmIChjYihza2IsIG5saCwgJmVycikgPCAwKSB7Ci0JCQkvKiBOb3QgYW4gZXJyb3IsIGJ1dCB3ZSBoYXZlIHRvIGludGVycnVwdCBwcm9jZXNzaW5nCi0JCQkgKiBoZXJlLiBOb3RlOiB0aGF0IGluIHRoaXMgY2FzZSB3ZSBkbyBub3QgcHVsbAotCQkJICogbWVzc2FnZSBmcm9tIHNrYiwgaXQgd2lsbCBiZSBwcm9jZXNzZWQgbGF0ZXIuCi0JCQkgKi8KLQkJCWlmIChlcnIgPT0gMCkKLQkJCQlyZXR1cm4gLTE7CisJCS8qIE9ubHkgcmVxdWVzdHMgYXJlIGhhbmRsZWQgYnkgdGhlIGtlcm5lbCAqLworCQlpZiAoIShubGgtPm5sbXNnX2ZsYWdzICYgTkxNX0ZfUkVRVUVTVCkpCisJCQlnb3RvIHNraXA7CisKKwkJLyogU2tpcCBjb250cm9sIG1lc3NhZ2VzICovCisJCWlmIChubGgtPm5sbXNnX3R5cGUgPCBOTE1TR19NSU5fVFlQRSkKKwkJCWdvdG8gc2tpcDsKKworCQllcnIgPSBjYihza2IsIG5saCk7CisJCWlmIChlcnIgPT0gLUVJTlRSKSB7CisJCQkvKiBOb3QgYW4gZXJyb3IsIGJ1dCB3ZSBpbnRlcnJ1cHQgcHJvY2Vzc2luZyAqLworCQkJbmV0bGlua19xdWV1ZV9za2lwKG5saCwgc2tiKTsKKwkJCXJldHVybiBlcnI7CisJCX0KK3NraXA6CisJCWlmIChubGgtPm5sbXNnX2ZsYWdzICYgTkxNX0ZfQUNLIHx8IGVycikKIAkJCW5ldGxpbmtfYWNrKHNrYiwgbmxoLCBlcnIpOwotCQl9IGVsc2UgaWYgKG5saC0+bmxtc2dfZmxhZ3MgJiBOTE1fRl9BQ0spCi0JCQluZXRsaW5rX2Fjayhza2IsIG5saCwgMCk7CiAKIAkJbmV0bGlua19xdWV1ZV9za2lwKG5saCwgc2tiKTsKIAl9CkBAIC0xNTA0LDkgKzE1MzEsMTQgQEAKICAqCiAgKiBxbGVuIG11c3QgYmUgaW5pdGlhbGl6ZWQgdG8gMCBiZWZvcmUgdGhlIGluaXRpYWwgZW50cnksIGFmdGVyd2FyZHMKICAqIHRoZSBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIHJlcGVhdGVkbHkgdW50aWwgcWxlbiByZWFjaGVzIDAuCisgKgorICogVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIG1heSByZXR1cm4gLUVJTlRSIHRvIHNpZ25hbCB0aGF0IHByb2Nlc3NpbmcKKyAqIG9mIG5ldGxpbmsgbWVzc2FnZXMgc2hhbGwgYmUgaW50ZXJydXB0ZWQuIEluIHRoaXMgY2FzZSB0aGUgbWVzc2FnZQorICogY3VycmVudGx5IGJlaW5nIHByb2Nlc3NlZCB3aWxsIE5PVCBiZSByZXF1ZXVlZCBvbnRvIHRoZSByZWNlaXZlCisgKiBxdWV1ZS4KICAqLwogdm9pZCBuZXRsaW5rX3J1bl9xdWV1ZShzdHJ1Y3Qgc29jayAqc2ssIHVuc2lnbmVkIGludCAqcWxlbiwKLQkJICAgICAgIGludCAoKmNiKShzdHJ1Y3Qgc2tfYnVmZiAqLCBzdHJ1Y3Qgbmxtc2doZHIgKiwgaW50ICopKQorCQkgICAgICAgaW50ICgqY2IpKHN0cnVjdCBza19idWZmICosIHN0cnVjdCBubG1zZ2hkciAqKSkKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCkBAIC0xNTM3LDcgKzE1NjksNyBAQAogICogUHVsbHMgdGhlIGdpdmVuIG5ldGxpbmsgbWVzc2FnZSBvZmYgdGhlIHNvY2tldCBidWZmZXIgc28gdGhlIG5leHQKICAqIGNhbGwgdG8gbmV0bGlua19xdWV1ZV9ydW4oKSB3aWxsIG5vdCByZWNvbnNpZGVyIHRoZSBtZXNzYWdlLgogICovCi12b2lkIG5ldGxpbmtfcXVldWVfc2tpcChzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3N0YXRpYyB2b2lkIG5ldGxpbmtfcXVldWVfc2tpcChzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlpbnQgbXNnbGVuID0gTkxNU0dfQUxJR04obmxoLT5ubG1zZ19sZW4pOwogCkBAIC0xODIwLDEyICsxODUyLDEwIEBACiAKIEVYUE9SVF9TWU1CT0wobmV0bGlua19hY2spOwogRVhQT1JUX1NZTUJPTChuZXRsaW5rX3J1bl9xdWV1ZSk7Ci1FWFBPUlRfU1lNQk9MKG5ldGxpbmtfcXVldWVfc2tpcCk7CiBFWFBPUlRfU1lNQk9MKG5ldGxpbmtfYnJvYWRjYXN0KTsKIEVYUE9SVF9TWU1CT0wobmV0bGlua19kdW1wX3N0YXJ0KTsKIEVYUE9SVF9TWU1CT0wobmV0bGlua19rZXJuZWxfY3JlYXRlKTsKIEVYUE9SVF9TWU1CT0wobmV0bGlua19yZWdpc3Rlcl9ub3RpZmllcik7Ci1FWFBPUlRfU1lNQk9MKG5ldGxpbmtfc2V0X2Vycik7CiBFWFBPUlRfU1lNQk9MKG5ldGxpbmtfc2V0X25vbnJvb3QpOwogRVhQT1JUX1NZTUJPTChuZXRsaW5rX3VuaWNhc3QpOwogRVhQT1JUX1NZTUJPTChuZXRsaW5rX3VucmVnaXN0ZXJfbm90aWZpZXIpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGxpbmsvYXR0ci5jIGIvbmV0L25ldGxpbmsvYXR0ci5jCmluZGV4IDAwNDEzOTUuLmRmNWY4MjAgMTAwNjQ0Ci0tLSBhL25ldC9uZXRsaW5rL2F0dHIuYworKysgYi9uZXQvbmV0bGluay9hdHRyLmMKQEAgLTY3LDYgKzY3LDExIEBACiAJCX0KIAkJYnJlYWs7CiAKKwljYXNlIE5MQV9CSU5BUlk6CisJCWlmIChwdC0+bGVuICYmIGF0dHJsZW4gPiBwdC0+bGVuKQorCQkJcmV0dXJuIC1FUkFOR0U7CisJCWJyZWFrOworCiAJZGVmYXVsdDoKIAkJaWYgKHB0LT5sZW4pCiAJCQltaW5sZW4gPSBwdC0+bGVuOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGxpbmsvZ2VuZXRsaW5rLmMgYi9uZXQvbmV0bGluay9nZW5ldGxpbmsuYwppbmRleCBjMjk5Njc5Li42ZTMxMjM0IDEwMDY0NAotLS0gYS9uZXQvbmV0bGluay9nZW5ldGxpbmsuYworKysgYi9uZXQvbmV0bGluay9nZW5ldGxpbmsuYwpAQCAtMjk1LDY2ICsyOTUsNDYgQEAKIAlyZXR1cm4gLUVOT0VOVDsKIH0KIAotc3RhdGljIGludCBnZW5sX3Jjdl9tc2coc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5sbXNnaGRyICpubGgsCi0JCQkgICAgICAgaW50ICplcnJwKQorc3RhdGljIGludCBnZW5sX3Jjdl9tc2coc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5sbXNnaGRyICpubGgpCiB7CiAJc3RydWN0IGdlbmxfb3BzICpvcHM7CiAJc3RydWN0IGdlbmxfZmFtaWx5ICpmYW1pbHk7CiAJc3RydWN0IGdlbmxfaW5mbyBpbmZvOwogCXN0cnVjdCBnZW5sbXNnaGRyICpoZHIgPSBubG1zZ19kYXRhKG5saCk7Ci0JaW50IGhkcmxlbiwgZXJyID0gLUVJTlZBTDsKLQotCWlmICghKG5saC0+bmxtc2dfZmxhZ3MgJiBOTE1fRl9SRVFVRVNUKSkKLQkJZ290byBpZ25vcmU7Ci0KLQlpZiAobmxoLT5ubG1zZ190eXBlIDwgTkxNU0dfTUlOX1RZUEUpCi0JCWdvdG8gaWdub3JlOworCWludCBoZHJsZW4sIGVycjsKIAogCWZhbWlseSA9IGdlbmxfZmFtaWx5X2ZpbmRfYnlpZChubGgtPm5sbXNnX3R5cGUpOwotCWlmIChmYW1pbHkgPT0gTlVMTCkgewotCQllcnIgPSAtRU5PRU5UOwotCQlnb3RvIGVycm91dDsKLQl9CisJaWYgKGZhbWlseSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0VOVDsKIAogCWhkcmxlbiA9IEdFTkxfSERSTEVOICsgZmFtaWx5LT5oZHJzaXplOwogCWlmIChubGgtPm5sbXNnX2xlbiA8IG5sbXNnX21zZ19zaXplKGhkcmxlbikpCi0JCWdvdG8gZXJyb3V0OworCQlyZXR1cm4gLUVJTlZBTDsKIAogCW9wcyA9IGdlbmxfZ2V0X2NtZChoZHItPmNtZCwgZmFtaWx5KTsKLQlpZiAob3BzID09IE5VTEwpIHsKLQkJZXJyID0gLUVPUE5PVFNVUFA7Ci0JCWdvdG8gZXJyb3V0OwotCX0KKwlpZiAob3BzID09IE5VTEwpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKIAotCWlmICgob3BzLT5mbGFncyAmIEdFTkxfQURNSU5fUEVSTSkgJiYgc2VjdXJpdHlfbmV0bGlua19yZWN2KHNrYiwgQ0FQX05FVF9BRE1JTikpIHsKLQkJZXJyID0gLUVQRVJNOwotCQlnb3RvIGVycm91dDsKLQl9CisJaWYgKChvcHMtPmZsYWdzICYgR0VOTF9BRE1JTl9QRVJNKSAmJgorCSAgICBzZWN1cml0eV9uZXRsaW5rX3JlY3Yoc2tiLCBDQVBfTkVUX0FETUlOKSkKKwkJcmV0dXJuIC1FUEVSTTsKIAogCWlmIChubGgtPm5sbXNnX2ZsYWdzICYgTkxNX0ZfRFVNUCkgewotCQlpZiAob3BzLT5kdW1waXQgPT0gTlVMTCkgewotCQkJZXJyID0gLUVPUE5PVFNVUFA7Ci0JCQlnb3RvIGVycm91dDsKLQkJfQorCQlpZiAob3BzLT5kdW1waXQgPT0gTlVMTCkKKwkJCXJldHVybiAtRU9QTk9UU1VQUDsKIAotCQkqZXJycCA9IGVyciA9IG5ldGxpbmtfZHVtcF9zdGFydChnZW5sX3NvY2ssIHNrYiwgbmxoLAotCQkJCQkJIG9wcy0+ZHVtcGl0LCBvcHMtPmRvbmUpOwotCQlpZiAoZXJyID09IDApCi0JCQlza2JfcHVsbChza2IsIG1pbihOTE1TR19BTElHTihubGgtPm5sbXNnX2xlbiksCi0JCQkJCSAgc2tiLT5sZW4pKTsKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gbmV0bGlua19kdW1wX3N0YXJ0KGdlbmxfc29jaywgc2tiLCBubGgsCisJCQkJCSAgb3BzLT5kdW1waXQsIG9wcy0+ZG9uZSk7CiAJfQogCi0JaWYgKG9wcy0+ZG9pdCA9PSBOVUxMKSB7Ci0JCWVyciA9IC1FT1BOT1RTVVBQOwotCQlnb3RvIGVycm91dDsKLQl9CisJaWYgKG9wcy0+ZG9pdCA9PSBOVUxMKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKIAlpZiAoZmFtaWx5LT5hdHRyYnVmKSB7CiAJCWVyciA9IG5sbXNnX3BhcnNlKG5saCwgaGRybGVuLCBmYW1pbHktPmF0dHJidWYsIGZhbWlseS0+bWF4YXR0ciwKIAkJCQkgIG9wcy0+cG9saWN5KTsKIAkJaWYgKGVyciA8IDApCi0JCQlnb3RvIGVycm91dDsKKwkJCXJldHVybiBlcnI7CiAJfQogCiAJaW5mby5zbmRfc2VxID0gbmxoLT5ubG1zZ19zZXE7CkBAIC0zNjQsMTUgKzM0NCw3IEBACiAJaW5mby51c2VyaGRyID0gbmxtc2dfZGF0YShubGgpICsgR0VOTF9IRFJMRU47CiAJaW5mby5hdHRycyA9IGZhbWlseS0+YXR0cmJ1ZjsKIAotCSplcnJwID0gZXJyID0gb3BzLT5kb2l0KHNrYiwgJmluZm8pOwotCXJldHVybiBlcnI7Ci0KLWlnbm9yZToKLQlyZXR1cm4gMDsKLQotZXJyb3V0OgotCSplcnJwID0gZXJyOwotCXJldHVybiAtMTsKKwlyZXR1cm4gb3BzLT5kb2l0KHNrYiwgJmluZm8pOwogfQogCiBzdGF0aWMgdm9pZCBnZW5sX3JjdihzdHJ1Y3Qgc29jayAqc2ssIGludCBsZW4pCkBAIC01ODYsNyArNTU4LDcgQEAKIAogCW5ldGxpbmtfc2V0X25vbnJvb3QoTkVUTElOS19HRU5FUklDLCBOTF9OT05ST09UX1JFQ1YpOwogCWdlbmxfc29jayA9IG5ldGxpbmtfa2VybmVsX2NyZWF0ZShORVRMSU5LX0dFTkVSSUMsIEdFTkxfTUFYX0lELAotCQkJCQkgIGdlbmxfcmN2LCBUSElTX01PRFVMRSk7CisJCQkJCSAgZ2VubF9yY3YsIE5VTEwsIFRISVNfTU9EVUxFKTsKIAlpZiAoZ2VubF9zb2NrID09IE5VTEwpCiAJCXBhbmljKCJHRU5MOiBDYW5ub3QgaW5pdGlhbGl6ZSBnZW5lcmljIG5ldGxpbmtcbiIpOwogCmRpZmYgLS1naXQgYS9uZXQvbmV0cm9tL2FmX25ldHJvbS5jIGIvbmV0L25ldHJvbS9hZl9uZXRyb20uYwppbmRleCBiZjk4MzdkLi41ZDRhMjZjIDEwMDY0NAotLS0gYS9uZXQvbmV0cm9tL2FmX25ldHJvbS5jCisrKyBiL25ldC9uZXRyb20vYWZfbmV0cm9tLmMKQEAgLTYyNSw0MiArNjI1LDQyIEBACiAJYXgyNV9hZGRyZXNzICpzb3VyY2UgPSBOVUxMOwogCWF4MjVfdWlkX2Fzc29jICp1c2VyOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJaW50IGVyciA9IDA7CiAKIAlsb2NrX3NvY2soc2spOwogCWlmIChzay0+c2tfc3RhdGUgPT0gVENQX0VTVEFCTElTSEVEICYmIHNvY2stPnN0YXRlID09IFNTX0NPTk5FQ1RJTkcpIHsKIAkJc29jay0+c3RhdGUgPSBTU19DT05ORUNURUQ7Ci0JCXJlbGVhc2Vfc29jayhzayk7Ci0JCXJldHVybiAwOwkvKiBDb25uZWN0IGNvbXBsZXRlZCBkdXJpbmcgYSBFUkVTVEFSVFNZUyBldmVudCAqLworCQlnb3RvIG91dF9yZWxlYXNlOwkvKiBDb25uZWN0IGNvbXBsZXRlZCBkdXJpbmcgYSBFUkVTVEFSVFNZUyBldmVudCAqLwogCX0KIAogCWlmIChzay0+c2tfc3RhdGUgPT0gVENQX0NMT1NFICYmIHNvY2stPnN0YXRlID09IFNTX0NPTk5FQ1RJTkcpIHsKIAkJc29jay0+c3RhdGUgPSBTU19VTkNPTk5FQ1RFRDsKLQkJcmVsZWFzZV9zb2NrKHNrKTsKLQkJcmV0dXJuIC1FQ09OTlJFRlVTRUQ7CisJCWVyciA9IC1FQ09OTlJFRlVTRUQ7CisJCWdvdG8gb3V0X3JlbGVhc2U7CiAJfQogCiAJaWYgKHNrLT5za19zdGF0ZSA9PSBUQ1BfRVNUQUJMSVNIRUQpIHsKLQkJcmVsZWFzZV9zb2NrKHNrKTsKLQkJcmV0dXJuIC1FSVNDT05OOwkvKiBObyByZWNvbm5lY3Qgb24gYSBzZXFwYWNrZXQgc29ja2V0ICovCisJCWVyciA9IC1FSVNDT05OOwkvKiBObyByZWNvbm5lY3Qgb24gYSBzZXFwYWNrZXQgc29ja2V0ICovCisJCWdvdG8gb3V0X3JlbGVhc2U7CiAJfQogCiAJc2stPnNrX3N0YXRlICAgPSBUQ1BfQ0xPU0U7CiAJc29jay0+c3RhdGUgPSBTU19VTkNPTk5FQ1RFRDsKIAogCWlmIChhZGRyX2xlbiAhPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2F4MjUpICYmIGFkZHJfbGVuICE9IHNpemVvZihzdHJ1Y3QgZnVsbF9zb2NrYWRkcl9heDI1KSkgewotCQlyZWxlYXNlX3NvY2soc2spOwotCQlyZXR1cm4gLUVJTlZBTDsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBvdXRfcmVsZWFzZTsKIAl9CiAJaWYgKGFkZHItPnNheDI1X2ZhbWlseSAhPSBBRl9ORVRST00pIHsKLQkJcmVsZWFzZV9zb2NrKHNrKTsKLQkJcmV0dXJuIC1FSU5WQUw7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X3JlbGVhc2U7CiAJfQogCWlmIChzb2NrX2ZsYWcoc2ssIFNPQ0tfWkFQUEVEKSkgewkvKiBNdXN0IGJpbmQgZmlyc3QgLSBhdXRvYmluZGluZyBpbiB0aGlzIG1heSBvciBtYXkgbm90IHdvcmsgKi8KIAkJc29ja19yZXNldF9mbGFnKHNrLCBTT0NLX1pBUFBFRCk7CiAKIAkJaWYgKChkZXYgPSBucl9kZXZfZmlyc3QoKSkgPT0gTlVMTCkgewotCQkJcmVsZWFzZV9zb2NrKHNrKTsKLQkJCXJldHVybiAtRU5FVFVOUkVBQ0g7CisJCQllcnIgPSAtRU5FVFVOUkVBQ0g7CisJCQlnb3RvIG91dF9yZWxlYXNlOwogCQl9CiAJCXNvdXJjZSA9IChheDI1X2FkZHJlc3MgKilkZXYtPmRldl9hZGRyOwogCkBAIC02NzEsOCArNjcxLDggQEAKIAkJfSBlbHNlIHsKIAkJCWlmIChheDI1X3VpZF9wb2xpY3kgJiYgIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpIHsKIAkJCQlkZXZfcHV0KGRldik7Ci0JCQkJcmVsZWFzZV9zb2NrKHNrKTsKLQkJCQlyZXR1cm4gLUVQRVJNOworCQkJCWVyciA9IC1FUEVSTTsKKwkJCQlnb3RvIG91dF9yZWxlYXNlOwogCQkJfQogCQkJbnItPnVzZXJfYWRkciAgID0gKnNvdXJjZTsKIAkJfQpAQCAtNzA3LDggKzcwNyw4IEBACiAKIAkvKiBOb3cgdGhlIGxvb3AgKi8KIAlpZiAoc2stPnNrX3N0YXRlICE9IFRDUF9FU1RBQkxJU0hFRCAmJiAoZmxhZ3MgJiBPX05PTkJMT0NLKSkgewotCQlyZWxlYXNlX3NvY2soc2spOwotCQlyZXR1cm4gLUVJTlBST0dSRVNTOworCQllcnIgPSAtRUlOUFJPR1JFU1M7CisJCWdvdG8gb3V0X3JlbGVhc2U7CiAJfQogCiAJLyoKQEAgLTcxNiw0NiArNzE2LDQ2IEBACiAJICogY2xvc2VkLgogCSAqLwogCWlmIChzay0+c2tfc3RhdGUgPT0gVENQX1NZTl9TRU5UKSB7Ci0JCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gY3VycmVudDsKLQkJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgdHNrKTsKKwkJREVGSU5FX1dBSVQod2FpdCk7CiAKLQkJYWRkX3dhaXRfcXVldWUoc2stPnNrX3NsZWVwLCAmd2FpdCk7CiAJCWZvciAoOzspIHsKLQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCQlwcmVwYXJlX3RvX3dhaXQoc2stPnNrX3NsZWVwLCAmd2FpdCwKKwkJCSAgICAgICAgICAgICAgICBUQVNLX0lOVEVSUlVQVElCTEUpOwogCQkJaWYgKHNrLT5za19zdGF0ZSAhPSBUQ1BfU1lOX1NFTlQpCiAJCQkJYnJlYWs7Ci0JCQlyZWxlYXNlX3NvY2soc2spOwotCQkJaWYgKCFzaWduYWxfcGVuZGluZyh0c2spKSB7CisJCQlpZiAoIXNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJcmVsZWFzZV9zb2NrKHNrKTsKIAkJCQlzY2hlZHVsZSgpOwogCQkJCWxvY2tfc29jayhzayk7CiAJCQkJY29udGludWU7CiAJCQl9Ci0JCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKLQkJCXJlbW92ZV93YWl0X3F1ZXVlKHNrLT5za19zbGVlcCwgJndhaXQpOwotCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwkJCWVyciA9IC1FUkVTVEFSVFNZUzsKKwkJCWJyZWFrOwogCQl9Ci0JCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOwotCQlyZW1vdmVfd2FpdF9xdWV1ZShzay0+c2tfc2xlZXAsICZ3YWl0KTsKKwkJZmluaXNoX3dhaXQoc2stPnNrX3NsZWVwLCAmd2FpdCk7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dF9yZWxlYXNlOwogCX0KIAogCWlmIChzay0+c2tfc3RhdGUgIT0gVENQX0VTVEFCTElTSEVEKSB7CiAJCXNvY2stPnN0YXRlID0gU1NfVU5DT05ORUNURUQ7Ci0JCXJlbGVhc2Vfc29jayhzayk7Ci0JCXJldHVybiBzb2NrX2Vycm9yKHNrKTsJLyogQWx3YXlzIHNldCBhdCB0aGlzIHBvaW50ICovCisJCWVyciA9IHNvY2tfZXJyb3Ioc2spOwkvKiBBbHdheXMgc2V0IGF0IHRoaXMgcG9pbnQgKi8KKwkJZ290byBvdXRfcmVsZWFzZTsKIAl9CiAKIAlzb2NrLT5zdGF0ZSA9IFNTX0NPTk5FQ1RFRDsKKworb3V0X3JlbGVhc2U6CiAJcmVsZWFzZV9zb2NrKHNrKTsKIAotCXJldHVybiAwOworCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyBpbnQgbnJfYWNjZXB0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrZXQgKm5ld3NvY2ssIGludCBmbGFncykKIHsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7Ci0JREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgdHNrKTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCBzb2NrICpuZXdzazsKKwlERUZJTkVfV0FJVCh3YWl0KTsKIAlzdHJ1Y3Qgc29jayAqc2s7CiAJaW50IGVyciA9IDA7CiAKQEAgLTc2NSw0MiArNzY1LDQwIEBACiAJbG9ja19zb2NrKHNrKTsKIAlpZiAoc2stPnNrX3R5cGUgIT0gU09DS19TRVFQQUNLRVQpIHsKIAkJZXJyID0gLUVPUE5PVFNVUFA7Ci0JCWdvdG8gb3V0OworCQlnb3RvIG91dF9yZWxlYXNlOwogCX0KIAogCWlmIChzay0+c2tfc3RhdGUgIT0gVENQX0xJU1RFTikgewogCQllcnIgPSAtRUlOVkFMOwotCQlnb3RvIG91dDsKKwkJZ290byBvdXRfcmVsZWFzZTsKIAl9CiAKIAkvKgogCSAqCVRoZSB3cml0ZSBxdWV1ZSB0aGlzIHRpbWUgaXMgaG9sZGluZyBzb2NrZXRzIHJlYWR5IHRvIHVzZQogCSAqCWhvb2tlZCBpbnRvIHRoZSBTQUJNIHdlIHNhdmVkCiAJICovCi0JYWRkX3dhaXRfcXVldWUoc2stPnNrX3NsZWVwLCAmd2FpdCk7CiAJZm9yICg7OykgeworCQlwcmVwYXJlX3RvX3dhaXQoc2stPnNrX3NsZWVwLCAmd2FpdCwgVEFTS19JTlRFUlJVUFRJQkxFKTsKIAkJc2tiID0gc2tiX2RlcXVldWUoJnNrLT5za19yZWNlaXZlX3F1ZXVlKTsKIAkJaWYgKHNrYikKIAkJCWJyZWFrOwogCi0JCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOwotCQlyZWxlYXNlX3NvY2soc2spOwogCQlpZiAoZmxhZ3MgJiBPX05PTkJMT0NLKSB7Ci0JCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKLQkJCXJlbW92ZV93YWl0X3F1ZXVlKHNrLT5za19zbGVlcCwgJndhaXQpOwotCQkJcmV0dXJuIC1FV09VTERCTE9DSzsKKwkJCWVyciA9IC1FV09VTERCTE9DSzsKKwkJCWJyZWFrOwogCQl9Ci0JCWlmICghc2lnbmFsX3BlbmRpbmcodHNrKSkgeworCQlpZiAoIXNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlyZWxlYXNlX3NvY2soc2spOwogCQkJc2NoZWR1bGUoKTsKIAkJCWxvY2tfc29jayhzayk7CiAJCQljb250aW51ZTsKIAkJfQotCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKLQkJcmVtb3ZlX3dhaXRfcXVldWUoc2stPnNrX3NsZWVwLCAmd2FpdCk7Ci0JCXJldHVybiAtRVJFU1RBUlRTWVM7CisJCWVyciA9IC1FUkVTVEFSVFNZUzsKKwkJYnJlYWs7CiAJfQotCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOwotCXJlbW92ZV93YWl0X3F1ZXVlKHNrLT5za19zbGVlcCwgJndhaXQpOworCWZpbmlzaF93YWl0KHNrLT5za19zbGVlcCwgJndhaXQpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X3JlbGVhc2U7CiAKIAluZXdzayA9IHNrYi0+c2s7CiAJbmV3c2stPnNrX3NvY2tldCA9IG5ld3NvY2s7CkBAIC04MTEsOCArODA5LDkgQEAKIAlza19hY2NlcHRxX3JlbW92ZWQoc2spOwogCW5ld3NvY2stPnNrID0gbmV3c2s7CiAKLW91dDoKK291dF9yZWxlYXNlOgogCXJlbGVhc2Vfc29jayhzayk7CisKIAlyZXR1cm4gZXJyOwogfQogCkBAIC04NzgsNyArODc3LDcgQEAKIAlpZiAoZnJhbWV0eXBlID09IE5SX1BST1RPRVhUICYmCiAJICAgIGNpcmN1aXRfaW5kZXggPT0gTlJfUFJPVE9fSVAgJiYgY2lyY3VpdF9pZCA9PSBOUl9QUk9UT19JUCkgewogCQlza2JfcHVsbChza2IsIE5SX05FVFdPUktfTEVOICsgTlJfVFJBTlNQT1JUX0xFTik7Ci0JCXNrYi0+aC5yYXcgPSBza2ItPmRhdGE7CisJCXNrYl9yZXNldF90cmFuc3BvcnRfaGVhZGVyKHNrYik7CiAKIAkJcmV0dXJuIG5yX3J4X2lwKHNrYiwgZGV2KTsKIAl9CkBAIC05MDQsNyArOTAzLDcgQEAKIAl9CiAKIAlpZiAoc2sgIT0gTlVMTCkgewotCQlza2ItPmgucmF3ID0gc2tiLT5kYXRhOworCQlza2JfcmVzZXRfdHJhbnNwb3J0X2hlYWRlcihza2IpOwogCiAJCWlmIChmcmFtZXR5cGUgPT0gTlJfQ09OTkFDSyAmJiBza2ItPmxlbiA9PSAyMikKIAkJCW5yX3NrKHNrKS0+YnBxZXh0ID0gMTsKQEAgLTEwNzQsNiArMTA3Myw3IEBACiAJCWdvdG8gb3V0OwogCiAJc2tiX3Jlc2VydmUoc2tiLCBzaXplIC0gbGVuKTsKKwlza2JfcmVzZXRfdHJhbnNwb3J0X2hlYWRlcihza2IpOwogCiAJLyoKIAkgKglQdXNoIGRvd24gdGhlIE5FVC9ST00gaGVhZGVyCkBAIC0xMDk0LDE0ICsxMDk0LDEyIEBACiAJLyoKIAkgKglQdXQgdGhlIGRhdGEgb24gdGhlIGVuZAogCSAqLworCXNrYl9wdXQoc2tiLCBsZW4pOwogCi0Jc2tiLT5oLnJhdyA9IHNrYl9wdXQoc2tiLCBsZW4pOwotCi0JYXNtcHRyID0gc2tiLT5oLnJhdzsKIAlTT0NLX0RFQlVHKHNrLCAiTkVUL1JPTTogQXBwZW5kaW5nIHVzZXIgZGF0YVxuIik7CiAKIAkvKiBVc2VyIGRhdGEgZm9sbG93cyBpbW1lZGlhdGVseSBhZnRlciB0aGUgTkVUL1JPTSB0cmFuc3BvcnQgaGVhZGVyICovCi0JaWYgKG1lbWNweV9mcm9taW92ZWMoYXNtcHRyLCBtc2ctPm1zZ19pb3YsIGxlbikpIHsKKwlpZiAobWVtY3B5X2Zyb21pb3ZlYyhza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpLCBtc2ctPm1zZ19pb3YsIGxlbikpIHsKIAkJa2ZyZWVfc2tiKHNrYik7CiAJCWVyciA9IC1FRkFVTFQ7CiAJCWdvdG8gb3V0OwpAQCAtMTE0OSw3ICsxMTQ3LDcgQEAKIAkJcmV0dXJuIGVyOwogCX0KIAotCXNrYi0+aC5yYXcgPSBza2ItPmRhdGE7CisJc2tiX3Jlc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKIAljb3BpZWQgICAgID0gc2tiLT5sZW47CiAKIAlpZiAoY29waWVkID4gc2l6ZSkgewpAQCAtMTE2MSw3ICsxMTU5LDggQEAKIAogCWlmIChzYXggIT0gTlVMTCkgewogCQlzYXgtPnNheDI1X2ZhbWlseSA9IEFGX05FVFJPTTsKLQkJbWVtY3B5KHNheC0+c2F4MjVfY2FsbC5heDI1X2NhbGwsIHNrYi0+ZGF0YSArIDcsIEFYMjVfQUREUl9MRU4pOworCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhX29mZnNldChza2IsIDcsIHNheC0+c2F4MjVfY2FsbC5heDI1X2NhbGwsCisJCQkgICAgICBBWDI1X0FERFJfTEVOKTsKIAl9CiAKIAltc2ctPm1zZ19uYW1lbGVuID0gc2l6ZW9mKCpzYXgpOwpAQCAtMTIwOSw2ICsxMjA4LDEyIEBACiAJCXJlbGVhc2Vfc29jayhzayk7CiAJCXJldHVybiByZXQ7CiAKKwljYXNlIFNJT0NHU1RBTVBOUzoKKwkJbG9ja19zb2NrKHNrKTsKKwkJcmV0ID0gc29ja19nZXRfdGltZXN0YW1wbnMoc2ssIGFyZ3ApOworCQlyZWxlYXNlX3NvY2soc2spOworCQlyZXR1cm4gcmV0OworCiAJY2FzZSBTSU9DR0lGQUREUjoKIAljYXNlIFNJT0NTSUZBRERSOgogCWNhc2UgU0lPQ0dJRkRTVEFERFI6CmRpZmYgLS1naXQgYS9uZXQvbmV0cm9tL25yX2Rldi5jIGIvbmV0L25ldHJvbS9ucl9kZXYuYwppbmRleCA5YTk3ZWQ2Li5jN2I1ZDkzIDEwMDY0NAotLS0gYS9uZXQvbmV0cm9tL25yX2Rldi5jCisrKyBiL25ldC9uZXRyb20vbnJfZGV2LmMKQEAgLTU2LDggKzU2LDggQEAKIAogCS8qIFNwb29mIGluY29taW5nIGRldmljZSAqLwogCXNrYi0+ZGV2ICAgICAgPSBkZXY7Ci0Jc2tiLT5tYWMucmF3ICA9IHNrYi0+bmgucmF3OwotCXNrYi0+bmgucmF3ICAgPSBza2ItPmRhdGE7CisJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKKwlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiKTsKIAlza2ItPnBrdF90eXBlID0gUEFDS0VUX0hPU1Q7CiAKIAluZXRpZl9yeChza2IpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldHJvbS9ucl9pbi5jIGIvbmV0L25ldHJvbS9ucl9pbi5jCmluZGV4IDU1NjBhY2IuLjY4MTc2NDggMTAwNjQ0Ci0tLSBhL25ldC9uZXRyb20vbnJfaW4uYworKysgYi9uZXQvbmV0cm9tL25yX2luLmMKQEAgLTUxLDEwICs1MSwxMiBAQAogCQlpZiAoKHNrYm4gPSBhbGxvY19za2IobnItPmZyYWdsZW4sIEdGUF9BVE9NSUMpKSA9PSBOVUxMKQogCQkJcmV0dXJuIDE7CiAKLQkJc2tibi0+aC5yYXcgPSBza2JuLT5kYXRhOworCQlza2JfcmVzZXRfdHJhbnNwb3J0X2hlYWRlcihza2JuKTsKIAogCQl3aGlsZSAoKHNrYm8gPSBza2JfZGVxdWV1ZSgmbnItPmZyYWdfcXVldWUpKSAhPSBOVUxMKSB7Ci0JCQltZW1jcHkoc2tiX3B1dChza2JuLCBza2JvLT5sZW4pLCBza2JvLT5kYXRhLCBza2JvLT5sZW4pOworCQkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2JvLAorCQkJCQkJICBza2JfcHV0KHNrYm4sIHNrYm8tPmxlbiksCisJCQkJCQkgIHNrYm8tPmxlbik7CiAJCQlrZnJlZV9za2Ioc2tibyk7CiAJCX0KIApkaWZmIC0tZ2l0IGEvbmV0L25ldHJvbS9ucl9sb29wYmFjay5jIGIvbmV0L25ldHJvbS9ucl9sb29wYmFjay5jCmluZGV4IGU4NTZhZTEuLmYzMjRkNWQgMTAwNjQ0Ci0tLSBhL25ldC9uZXRyb20vbnJfbG9vcGJhY2suYworKysgYi9uZXQvbmV0cm9tL25yX2xvb3BiYWNrLmMKQEAgLTM0LDggKzM0LDggQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tibjsKIAogCWlmICgoc2tibiA9IGFsbG9jX3NrYihza2ItPmxlbiwgR0ZQX0FUT01JQykpICE9IE5VTEwpIHsKLQkJbWVtY3B5KHNrYl9wdXQoc2tibiwgc2tiLT5sZW4pLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKLQkJc2tibi0+aC5yYXcgPSBza2JuLT5kYXRhOworCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgc2tiX3B1dChza2JuLCBza2ItPmxlbiksIHNrYi0+bGVuKTsKKwkJc2tiX3Jlc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tibik7CiAKIAkJc2tiX3F1ZXVlX3RhaWwoJmxvb3BiYWNrX3F1ZXVlLCBza2JuKTsKIApkaWZmIC0tZ2l0IGEvbmV0L25ldHJvbS9ucl9vdXQuYyBiL25ldC9uZXRyb20vbnJfb3V0LmMKaW5kZXggMGNiZmI2MS4uZTNlNmM0NCAxMDA2NDQKLS0tIGEvbmV0L25ldHJvbS9ucl9vdXQuYworKysgYi9uZXQvbmV0cm9tL25yX291dC5jCkBAIC00MCw3ICs0MCw3IEBACiAKIAlpZiAoc2tiLT5sZW4gLSBOUl9UUkFOU1BPUlRfTEVOID4gTlJfTUFYX1BBQ0tFVF9TSVpFKSB7CiAJCS8qIFNhdmUgYSBjb3B5IG9mIHRoZSBUcmFuc3BvcnQgSGVhZGVyICovCi0JCW1lbWNweSh0cmFuc3BvcnQsIHNrYi0+ZGF0YSwgTlJfVFJBTlNQT1JUX0xFTik7CisJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCB0cmFuc3BvcnQsIE5SX1RSQU5TUE9SVF9MRU4pOwogCQlza2JfcHVsbChza2IsIE5SX1RSQU5TUE9SVF9MRU4pOwogCiAJCWZyb250bGVuID0gc2tiX2hlYWRyb29tKHNrYik7CkBAIC01NCwxMyArNTQsMTMgQEAKIAkJCWxlbiA9IChOUl9NQVhfUEFDS0VUX1NJWkUgPiBza2ItPmxlbikgPyBza2ItPmxlbiA6IE5SX01BWF9QQUNLRVRfU0laRTsKIAogCQkJLyogQ29weSB0aGUgdXNlciBkYXRhICovCi0JCQltZW1jcHkoc2tiX3B1dChza2JuLCBsZW4pLCBza2ItPmRhdGEsIGxlbik7CisJCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgc2tiX3B1dChza2JuLCBsZW4pLCBsZW4pOwogCQkJc2tiX3B1bGwoc2tiLCBsZW4pOwogCiAJCQkvKiBEdXBsaWNhdGUgdGhlIFRyYW5zcG9ydCBIZWFkZXIgKi8KIAkJCXNrYl9wdXNoKHNrYm4sIE5SX1RSQU5TUE9SVF9MRU4pOwotCQkJbWVtY3B5KHNrYm4tPmRhdGEsIHRyYW5zcG9ydCwgTlJfVFJBTlNQT1JUX0xFTik7Ci0KKwkJCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhKHNrYm4sIHRyYW5zcG9ydCwKKwkJCQkJCU5SX1RSQU5TUE9SVF9MRU4pOwogCQkJaWYgKHNrYi0+bGVuID4gMCkKIAkJCQlza2JuLT5kYXRhWzRdIHw9IE5SX01PUkVfRkxBRzsKIApkaWZmIC0tZ2l0IGEvbmV0L25ldHJvbS9ucl9zdWJyLmMgYi9uZXQvbmV0cm9tL25yX3N1YnIuYwppbmRleCAwN2I2OTRkLi4wNGU3ZDBkMiAxMDA2NDQKLS0tIGEvbmV0L25ldHJvbS9ucl9zdWJyLmMKKysrIGIvbmV0L25ldHJvbS9ucl9zdWJyLmMKQEAgLTIyNiwxMyArMjI2LDEzIEBACiAKIAlkcHRyID0gc2tiX3B1dChza2JuLCBOUl9ORVRXT1JLX0xFTiArIE5SX1RSQU5TUE9SVF9MRU4pOwogCi0JbWVtY3B5KGRwdHIsIHNrYi0+ZGF0YSArIDcsIEFYMjVfQUREUl9MRU4pOworCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGFfb2Zmc2V0KHNrYiwgNywgZHB0ciwgQVgyNV9BRERSX0xFTik7CiAJZHB0cls2XSAmPSB+QVgyNV9DQklUOwogCWRwdHJbNl0gJj0gfkFYMjVfRUJJVDsKIAlkcHRyWzZdIHw9IEFYMjVfU1NTSURfU1BBUkU7CiAJZHB0ciArPSBBWDI1X0FERFJfTEVOOwogCi0JbWVtY3B5KGRwdHIsIHNrYi0+ZGF0YSArIDAsIEFYMjVfQUREUl9MRU4pOworCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCBkcHRyLCBBWDI1X0FERFJfTEVOKTsKIAlkcHRyWzZdICY9IH5BWDI1X0NCSVQ7CiAJZHB0cls2XSB8PSBBWDI1X0VCSVQ7CiAJZHB0cls2XSB8PSBBWDI1X1NTU0lEX1NQQVJFOwpkaWZmIC0tZ2l0IGEvbmV0L3BhY2tldC9hZl9wYWNrZXQuYyBiL25ldC9wYWNrZXQvYWZfcGFja2V0LmMKaW5kZXggMjhkNDdlOC4uMDJlNDAxYyAxMDA2NDQKLS0tIGEvbmV0L3BhY2tldC9hZl9wYWNrZXQuYworKysgYi9uZXQvcGFja2V0L2FmX3BhY2tldC5jCkBAIC0xMTQsMjIgKzExNCwyMiBAQAogLS0tLS0tLS0tLS0KIAogSW5jb21pbmcsIGRldi0+aGFyZF9oZWFkZXIhPU5VTEwKLSAgIG1hYy5yYXcgLT4gbGwgaGVhZGVyCi0gICBkYXRhICAgIC0+IGRhdGEKKyAgIG1hY19oZWFkZXIgLT4gbGwgaGVhZGVyCisgICBkYXRhICAgICAgIC0+IGRhdGEKIAogT3V0Z29pbmcsIGRldi0+aGFyZF9oZWFkZXIhPU5VTEwKLSAgIG1hYy5yYXcgLT4gbGwgaGVhZGVyCi0gICBkYXRhICAgIC0+IGxsIGhlYWRlcgorICAgbWFjX2hlYWRlciAtPiBsbCBoZWFkZXIKKyAgIGRhdGEgICAgICAgLT4gbGwgaGVhZGVyCiAKIEluY29taW5nLCBkZXYtPmhhcmRfaGVhZGVyPT1OVUxMCi0gICBtYWMucmF3IC0+IFVOS05PV04gcG9zaXRpb24uIEl0IGlzIHZlcnkgbGlrZWx5LCB0aGF0IGl0IHBvaW50cyB0byBsbCBoZWFkZXIuCi0JICAgICAgUFBQIG1ha2VzIGl0LCB0aGF0IGlzIHdyb25nLCBiZWNhdXNlIGludHJvZHVjZSBhc3N5bWV0cnkKLQkgICAgICBiZXR3ZWVuIHJ4IGFuZCB0eCBwYXRocy4KLSAgIGRhdGEgICAgLT4gZGF0YQorICAgbWFjX2hlYWRlciAtPiBVTktOT1dOIHBvc2l0aW9uLiBJdCBpcyB2ZXJ5IGxpa2VseSwgdGhhdCBpdCBwb2ludHMgdG8gbGwKKwkJIGhlYWRlci4gIFBQUCBtYWtlcyBpdCwgdGhhdCBpcyB3cm9uZywgYmVjYXVzZSBpbnRyb2R1Y2UKKyAgICAgICAgICAgICAgICAgYXNzeW1ldHJ5IGJldHdlZW4gcnggYW5kIHR4IHBhdGhzLgorICAgZGF0YSAgICAgICAtPiBkYXRhCiAKIE91dGdvaW5nLCBkZXYtPmhhcmRfaGVhZGVyPT1OVUxMCi0gICBtYWMucmF3IC0+IGRhdGEuIGxsIGhlYWRlciBpcyBzdGlsbCBub3QgYnVpbHQhCi0gICBkYXRhICAgIC0+IGRhdGEKKyAgIG1hY19oZWFkZXIgLT4gZGF0YS4gbGwgaGVhZGVyIGlzIHN0aWxsIG5vdCBidWlsdCEKKyAgIGRhdGEgICAgICAgLT4gZGF0YQogCiBSZXN1bWUKICAgSWYgZGV2LT5oYXJkX2hlYWRlcj09TlVMTCB3ZSBhcmUgdW5saWtlbHkgdG8gcmVzdG9yZSBzZW5zaWJsZSBsbCBoZWFkZXIuCkBAIC0xMzksMTIgKzEzOSwxMiBAQAogLS0tLS0tLS0tLS0tCiAKIGRldi0+aGFyZF9oZWFkZXIgIT0gTlVMTAotICAgbWFjLnJhdyAtPiBsbCBoZWFkZXIKLSAgIGRhdGEgICAgLT4gbGwgaGVhZGVyCisgICBtYWNfaGVhZGVyIC0+IGxsIGhlYWRlcgorICAgZGF0YSAgICAgICAtPiBsbCBoZWFkZXIKIAogZGV2LT5oYXJkX2hlYWRlciA9PSBOVUxMIChsbCBoZWFkZXIgaXMgYWRkZWQgYnkgZGV2aWNlLCB3ZSBjYW5ub3QgY29udHJvbCBpdCkKLSAgIG1hYy5yYXcgLT4gZGF0YQotICAgZGF0YSAtPiBkYXRhCisgICBtYWNfaGVhZGVyIC0+IGRhdGEKKyAgIGRhdGEgICAgICAgLT4gZGF0YQogCiAgICBXZSBzaG91bGQgc2V0IG5oLnJhdyBvbiBvdXRwdXQgdG8gY29ycmVjdCBwb3Npc3Rpb24sCiAgICBwYWNrZXQgY2xhc3NpZmllciBkZXBlbmRzIG9uIGl0LgpAQCAtMjAxLDcgKzIwMSw4IEBACiAJc3RydWN0IHBhY2tldF90eXBlCXByb3RfaG9vazsKIAlzcGlubG9ja190CQliaW5kX2xvY2s7CiAJdW5zaWduZWQgaW50CQlydW5uaW5nOjEsCS8qIHByb3RfaG9vayBpcyBhdHRhY2hlZCovCi0JCQkJYXV4ZGF0YToxOworCQkJCWF1eGRhdGE6MSwKKwkJCQlvcmlnZGV2OjE7CiAJaW50CQkJaWZpbmRleDsJLyogYm91bmQgZGV2aWNlCQkqLwogCV9fYmUxNgkJCW51bTsKICNpZmRlZiBDT05GSUdfUEFDS0VUX01VTFRJQ0FTVApAQCAtMjg0LDcgKzI4NSw3IEBACiAJICoJSW5jb21pbmcgcGFja2V0cyBoYXZlIGxsIGhlYWRlciBwdWxsZWQsCiAJICoJcHVzaCBpdCBiYWNrLgogCSAqCi0JICoJRm9yIG91dGdvaW5nIG9uZXMgc2tiLT5kYXRhID09IHNrYi0+bWFjLnJhdworCSAqCUZvciBvdXRnb2luZyBvbmVzIHNrYi0+ZGF0YSA9PSBza2JfbWFjX2hlYWRlcihza2IpCiAJICoJc28gdGhhdCB0aGlzIHByb2NlZHVyZSBpcyBub29wLgogCSAqLwogCkBAIC0zMDMsNyArMzA0LDcgQEAKIAogCXNwa3QgPSAmUEFDS0VUX1NLQl9DQihza2IpLT5zYS5wa3Q7CiAKLQlza2JfcHVzaChza2IsIHNrYi0+ZGF0YS1za2ItPm1hYy5yYXcpOworCXNrYl9wdXNoKHNrYiwgc2tiLT5kYXRhIC0gc2tiX21hY19oZWFkZXIoc2tiKSk7CiAKIAkvKgogCSAqCVRoZSBTT0NLX1BBQ0tFVCBzb2NrZXQgcmVjZWl2ZXMgX2FsbF8gZnJhbWVzLgpAQCAtNDAxLDE0ICs0MDIsMTQgQEAKIAkgKiBub3RhYmxlIG9uZSBoZXJlLiBUaGlzIHNob3VsZCByZWFsbHkgYmUgZml4ZWQgYXQgdGhlIGRyaXZlciBsZXZlbC4KIAkgKi8KIAlza2JfcmVzZXJ2ZShza2IsIExMX1JFU0VSVkVEX1NQQUNFKGRldikpOwotCXNrYi0+bmgucmF3ID0gc2tiLT5kYXRhOworCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOwogCiAJLyogVHJ5IHRvIGFsaWduIGRhdGEgcGFydCBjb3JyZWN0bHkgKi8KIAlpZiAoZGV2LT5oYXJkX2hlYWRlcikgewogCQlza2ItPmRhdGEgLT0gZGV2LT5oYXJkX2hlYWRlcl9sZW47CiAJCXNrYi0+dGFpbCAtPSBkZXYtPmhhcmRfaGVhZGVyX2xlbjsKIAkJaWYgKGxlbiA8IGRldi0+aGFyZF9oZWFkZXJfbGVuKQotCQkJc2tiLT5uaC5yYXcgPSBza2ItPmRhdGE7CisJCQlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiKTsKIAl9CiAKIAkvKiBSZXR1cm5zIC1FRkFVTFQgb24gZXJyb3IgKi8KQEAgLTQ4OCwxMCArNDg5LDEwIEBACiAJCSAgIG5ldmVyIGRlbGl2ZXJlZCB0byB1c2VyLgogCQkgKi8KIAkJaWYgKHNrLT5za190eXBlICE9IFNPQ0tfREdSQU0pCi0JCQlza2JfcHVzaChza2IsIHNrYi0+ZGF0YSAtIHNrYi0+bWFjLnJhdyk7CisJCQlza2JfcHVzaChza2IsIHNrYi0+ZGF0YSAtIHNrYl9tYWNfaGVhZGVyKHNrYikpOwogCQllbHNlIGlmIChza2ItPnBrdF90eXBlID09IFBBQ0tFVF9PVVRHT0lORykgewogCQkJLyogU3BlY2lhbCBjYXNlOiBvdXRnb2luZyBwYWNrZXRzIGhhdmUgbGwgaGVhZGVyIGF0IGhlYWQgKi8KLQkJCXNrYl9wdWxsKHNrYiwgc2tiLT5uaC5yYXcgLSBza2ItPmRhdGEpOworCQkJc2tiX3B1bGwoc2tiLCBza2JfbmV0d29ya19vZmZzZXQoc2tiKSk7CiAJCX0KIAl9CiAKQEAgLTUyOCw3ICs1MjksMTAgQEAKIAlzbGwtPnNsbF9oYXR5cGUgPSBkZXYtPnR5cGU7CiAJc2xsLT5zbGxfcHJvdG9jb2wgPSBza2ItPnByb3RvY29sOwogCXNsbC0+c2xsX3BrdHR5cGUgPSBza2ItPnBrdF90eXBlOwotCXNsbC0+c2xsX2lmaW5kZXggPSBkZXYtPmlmaW5kZXg7CisJaWYgKHVubGlrZWx5KHBvLT5vcmlnZGV2KSAmJiBza2ItPnBrdF90eXBlID09IFBBQ0tFVF9IT1NUKQorCQlzbGwtPnNsbF9pZmluZGV4ID0gb3JpZ19kZXYtPmlmaW5kZXg7CisJZWxzZQorCQlzbGwtPnNsbF9pZmluZGV4ID0gZGV2LT5pZmluZGV4OwogCXNsbC0+c2xsX2hhbGVuID0gMDsKIAogCWlmIChkZXYtPmhhcmRfaGVhZGVyX3BhcnNlKQpAQCAtNTgyLDYgKzU4Niw3IEBACiAJdW5zaWduZWQgbG9uZyBzdGF0dXMgPSBUUF9TVEFUVVNfTE9TSU5HfFRQX1NUQVRVU19VU0VSOwogCXVuc2lnbmVkIHNob3J0IG1hY29mZiwgbmV0b2ZmOwogCXN0cnVjdCBza19idWZmICpjb3B5X3NrYiA9IE5VTEw7CisJc3RydWN0IHRpbWV2YWwgdHY7CiAKIAlpZiAoc2tiLT5wa3RfdHlwZSA9PSBQQUNLRVRfTE9PUEJBQ0spCiAJCWdvdG8gZHJvcDsKQEAgLTU5MSwxMCArNTk2LDEwIEBACiAKIAlpZiAoZGV2LT5oYXJkX2hlYWRlcikgewogCQlpZiAoc2stPnNrX3R5cGUgIT0gU09DS19ER1JBTSkKLQkJCXNrYl9wdXNoKHNrYiwgc2tiLT5kYXRhIC0gc2tiLT5tYWMucmF3KTsKKwkJCXNrYl9wdXNoKHNrYiwgc2tiLT5kYXRhIC0gc2tiX21hY19oZWFkZXIoc2tiKSk7CiAJCWVsc2UgaWYgKHNrYi0+cGt0X3R5cGUgPT0gUEFDS0VUX09VVEdPSU5HKSB7CiAJCQkvKiBTcGVjaWFsIGNhc2U6IG91dGdvaW5nIHBhY2tldHMgaGF2ZSBsbCBoZWFkZXIgYXQgaGVhZCAqLwotCQkJc2tiX3B1bGwoc2tiLCBza2ItPm5oLnJhdyAtIHNrYi0+ZGF0YSk7CisJCQlza2JfcHVsbChza2IsIHNrYl9uZXR3b3JrX29mZnNldChza2IpKTsKIAkJfQogCX0KIApAQCAtNjEyLDcgKzYxNyw3IEBACiAJaWYgKHNrLT5za190eXBlID09IFNPQ0tfREdSQU0pIHsKIAkJbWFjb2ZmID0gbmV0b2ZmID0gVFBBQ0tFVF9BTElHTihUUEFDS0VUX0hEUkxFTikgKyAxNjsKIAl9IGVsc2UgewotCQl1bnNpZ25lZCBtYWNsZW4gPSBza2ItPm5oLnJhdyAtIHNrYi0+ZGF0YTsKKwkJdW5zaWduZWQgbWFjbGVuID0gc2tiX25ldHdvcmtfb2Zmc2V0KHNrYik7CiAJCW5ldG9mZiA9IFRQQUNLRVRfQUxJR04oVFBBQ0tFVF9IRFJMRU4gKyAobWFjbGVuIDwgMTYgPyAxNiA6IG1hY2xlbikpOwogCQltYWNvZmYgPSBuZXRvZmYgLSBtYWNsZW47CiAJfQpAQCAtNjU2LDEyICs2NjEsMTMgQEAKIAloLT50cF9zbmFwbGVuID0gc25hcGxlbjsKIAloLT50cF9tYWMgPSBtYWNvZmY7CiAJaC0+dHBfbmV0ID0gbmV0b2ZmOwotCWlmIChza2ItPnRzdGFtcC5vZmZfc2VjID09IDApIHsKKwlpZiAoc2tiLT50c3RhbXAudHY2NCA9PSAwKSB7CiAJCV9fbmV0X3RpbWVzdGFtcChza2IpOwogCQlzb2NrX2VuYWJsZV90aW1lc3RhbXAoc2spOwogCX0KLQloLT50cF9zZWMgPSBza2ItPnRzdGFtcC5vZmZfc2VjOwotCWgtPnRwX3VzZWMgPSBza2ItPnRzdGFtcC5vZmZfdXNlYzsKKwl0diA9IGt0aW1lX3RvX3RpbWV2YWwoc2tiLT50c3RhbXApOworCWgtPnRwX3NlYyA9IHR2LnR2X3NlYzsKKwloLT50cF91c2VjID0gdHYudHZfdXNlYzsKIAogCXNsbCA9IChzdHJ1Y3Qgc29ja2FkZHJfbGwqKSgodTgqKWggKyBUUEFDS0VUX0FMSUdOKHNpemVvZigqaCkpKTsKIAlzbGwtPnNsbF9oYWxlbiA9IDA7CkBAIC02NzEsNyArNjc3LDEwIEBACiAJc2xsLT5zbGxfaGF0eXBlID0gZGV2LT50eXBlOwogCXNsbC0+c2xsX3Byb3RvY29sID0gc2tiLT5wcm90b2NvbDsKIAlzbGwtPnNsbF9wa3R0eXBlID0gc2tiLT5wa3RfdHlwZTsKLQlzbGwtPnNsbF9pZmluZGV4ID0gZGV2LT5pZmluZGV4OworCWlmICh1bmxpa2VseShwby0+b3JpZ2RldikgJiYgc2tiLT5wa3RfdHlwZSA9PSBQQUNLRVRfSE9TVCkKKwkJc2xsLT5zbGxfaWZpbmRleCA9IG9yaWdfZGV2LT5pZmluZGV4OworCWVsc2UKKwkJc2xsLT5zbGxfaWZpbmRleCA9IGRldi0+aWZpbmRleDsKIAogCWgtPnRwX3N0YXR1cyA9IHN0YXR1czsKIAlzbXBfbWIoKTsKQEAgLTc2NiwxNCArNzc1LDE0IEBACiAJCWdvdG8gb3V0X3VubG9jazsKIAogCXNrYl9yZXNlcnZlKHNrYiwgTExfUkVTRVJWRURfU1BBQ0UoZGV2KSk7Ci0Jc2tiLT5uaC5yYXcgPSBza2ItPmRhdGE7CisJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CiAKIAlpZiAoZGV2LT5oYXJkX2hlYWRlcikgewogCQlpbnQgcmVzOwogCQllcnIgPSAtRUlOVkFMOwogCQlyZXMgPSBkZXYtPmhhcmRfaGVhZGVyKHNrYiwgZGV2LCBudG9ocyhwcm90byksIGFkZHIsIE5VTEwsIGxlbik7CiAJCWlmIChzb2NrLT50eXBlICE9IFNPQ0tfREdSQU0pIHsKLQkJCXNrYi0+dGFpbCA9IHNrYi0+ZGF0YTsKKwkJCXNrYl9yZXNldF90YWlsX3BvaW50ZXIoc2tiKTsKIAkJCXNrYi0+bGVuID0gMDsKIAkJfSBlbHNlIGlmIChyZXMgPCAwKQogCQkJZ290byBvdXRfZnJlZTsKQEAgLTExNDMsNyArMTE1Miw3IEBACiAJCWF1eC50cF9sZW4gPSBQQUNLRVRfU0tCX0NCKHNrYiktPm9yaWdsZW47CiAJCWF1eC50cF9zbmFwbGVuID0gc2tiLT5sZW47CiAJCWF1eC50cF9tYWMgPSAwOwotCQlhdXgudHBfbmV0ID0gc2tiLT5uaC5yYXcgLSBza2ItPmRhdGE7CisJCWF1eC50cF9uZXQgPSBza2JfbmV0d29ya19vZmZzZXQoc2tiKTsKIAogCQlwdXRfY21zZyhtc2csIFNPTF9QQUNLRVQsIFBBQ0tFVF9BVVhEQVRBLCBzaXplb2YoYXV4KSwgJmF1eCk7CiAJfQpAQCAtMTQxMSw2ICsxNDIwLDE4IEBACiAJCXBvLT5hdXhkYXRhID0gISF2YWw7CiAJCXJldHVybiAwOwogCX0KKwljYXNlIFBBQ0tFVF9PUklHREVWOgorCXsKKwkJaW50IHZhbDsKKworCQlpZiAob3B0bGVuIDwgc2l6ZW9mKHZhbCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZ2YWwsIG9wdHZhbCwgc2l6ZW9mKHZhbCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJcG8tPm9yaWdkZXYgPSAhIXZhbDsKKwkJcmV0dXJuIDA7CisJfQogCWRlZmF1bHQ6CiAJCXJldHVybiAtRU5PUFJPVE9PUFQ7CiAJfQpAQCAtMTQ1NCw2ICsxNDc1LDEzIEBACiAKIAkJZGF0YSA9ICZ2YWw7CiAJCWJyZWFrOworCWNhc2UgUEFDS0VUX09SSUdERVY6CisJCWlmIChsZW4gPiBzaXplb2YoaW50KSkKKwkJCWxlbiA9IHNpemVvZihpbnQpOworCQl2YWwgPSBwby0+b3JpZ2RldjsKKworCQlkYXRhID0gJnZhbDsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FTk9QUk9UT09QVDsKIAl9CkBAIC0xNTQzLDYgKzE1NzEsOCBAQAogCQl9CiAJCWNhc2UgU0lPQ0dTVEFNUDoKIAkJCXJldHVybiBzb2NrX2dldF90aW1lc3RhbXAoc2ssIChzdHJ1Y3QgdGltZXZhbCBfX3VzZXIgKilhcmcpOworCQljYXNlIFNJT0NHU1RBTVBOUzoKKwkJCXJldHVybiBzb2NrX2dldF90aW1lc3RhbXBucyhzaywgKHN0cnVjdCB0aW1lc3BlYyBfX3VzZXIgKilhcmcpOwogCiAjaWZkZWYgQ09ORklHX0lORVQKIAkJY2FzZSBTSU9DQUREUlQ6CmRpZmYgLS1naXQgYS9uZXQvcm9zZS9hZl9yb3NlLmMgYi9uZXQvcm9zZS9hZl9yb3NlLmMKaW5kZXggZjkyZDUzMS4uZDQ3NmM0MyAxMDA2NDQKLS0tIGEvbmV0L3Jvc2UvYWZfcm9zZS5jCisrKyBiL25ldC9yb3NlL2FmX3Jvc2UuYwpAQCAtODEyLDI2ICs4MTIsMjYgQEAKIAkgKiBjbG9zZWQuCiAJICovCiAJaWYgKHNrLT5za19zdGF0ZSA9PSBUQ1BfU1lOX1NFTlQpIHsKLQkJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OwotCQlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCB0c2spOworCQlERUZJTkVfV0FJVCh3YWl0KTsKIAotCQlhZGRfd2FpdF9xdWV1ZShzay0+c2tfc2xlZXAsICZ3YWl0KTsKIAkJZm9yICg7OykgewotCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCXByZXBhcmVfdG9fd2FpdChzay0+c2tfc2xlZXAsICZ3YWl0LAorCQkJICAgICAgICAgICAgICAgIFRBU0tfSU5URVJSVVBUSUJMRSk7CiAJCQlpZiAoc2stPnNrX3N0YXRlICE9IFRDUF9TWU5fU0VOVCkKIAkJCQlicmVhazsKLQkJCXJlbGVhc2Vfc29jayhzayk7Ci0JCQlpZiAoIXNpZ25hbF9wZW5kaW5nKHRzaykpIHsKKwkJCWlmICghc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQlyZWxlYXNlX3NvY2soc2spOwogCQkJCXNjaGVkdWxlKCk7CiAJCQkJbG9ja19zb2NrKHNrKTsKIAkJCQljb250aW51ZTsKIAkJCX0KLQkJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOwotCQkJcmVtb3ZlX3dhaXRfcXVldWUoc2stPnNrX3NsZWVwLCAmd2FpdCk7Ci0JCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCQkJZXJyID0gLUVSRVNUQVJUU1lTOworCQkJYnJlYWs7CiAJCX0KLQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7Ci0JCXJlbW92ZV93YWl0X3F1ZXVlKHNrLT5za19zbGVlcCwgJndhaXQpOworCQlmaW5pc2hfd2FpdChzay0+c2tfc2xlZXAsICZ3YWl0KTsKKworCQlpZiAoZXJyKQorCQkJZ290byBvdXRfcmVsZWFzZTsKIAl9CiAKIAlpZiAoc2stPnNrX3N0YXRlICE9IFRDUF9FU1RBQkxJU0hFRCkgewpAQCAtODU2LDEwICs4NTYsOSBAQAogCiBzdGF0aWMgaW50IHJvc2VfYWNjZXB0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrZXQgKm5ld3NvY2ssIGludCBmbGFncykKIHsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7Ci0JREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgdHNrKTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCBzb2NrICpuZXdzazsKKwlERUZJTkVfV0FJVCh3YWl0KTsKIAlzdHJ1Y3Qgc29jayAqc2s7CiAJaW50IGVyciA9IDA7CiAKQEAgLTg2OSw0MiArODY4LDQxIEBACiAJbG9ja19zb2NrKHNrKTsKIAlpZiAoc2stPnNrX3R5cGUgIT0gU09DS19TRVFQQUNLRVQpIHsKIAkJZXJyID0gLUVPUE5PVFNVUFA7Ci0JCWdvdG8gb3V0OworCQlnb3RvIG91dF9yZWxlYXNlOwogCX0KIAogCWlmIChzay0+c2tfc3RhdGUgIT0gVENQX0xJU1RFTikgewogCQllcnIgPSAtRUlOVkFMOwotCQlnb3RvIG91dDsKKwkJZ290byBvdXRfcmVsZWFzZTsKIAl9CiAKIAkvKgogCSAqCVRoZSB3cml0ZSBxdWV1ZSB0aGlzIHRpbWUgaXMgaG9sZGluZyBzb2NrZXRzIHJlYWR5IHRvIHVzZQogCSAqCWhvb2tlZCBpbnRvIHRoZSBTQUJNIHdlIHNhdmVkCiAJICovCi0JYWRkX3dhaXRfcXVldWUoc2stPnNrX3NsZWVwLCAmd2FpdCk7CiAJZm9yICg7OykgeworCQlwcmVwYXJlX3RvX3dhaXQoc2stPnNrX3NsZWVwLCAmd2FpdCwgVEFTS19JTlRFUlJVUFRJQkxFKTsKKwogCQlza2IgPSBza2JfZGVxdWV1ZSgmc2stPnNrX3JlY2VpdmVfcXVldWUpOwogCQlpZiAoc2tiKQogCQkJYnJlYWs7CiAKLQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7Ci0JCXJlbGVhc2Vfc29jayhzayk7CiAJCWlmIChmbGFncyAmIE9fTk9OQkxPQ0spIHsKLQkJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOwotCQkJcmVtb3ZlX3dhaXRfcXVldWUoc2stPnNrX3NsZWVwLCAmd2FpdCk7Ci0JCQlyZXR1cm4gLUVXT1VMREJMT0NLOworCQkJZXJyID0gLUVXT1VMREJMT0NLOworCQkJYnJlYWs7CiAJCX0KLQkJaWYgKCFzaWduYWxfcGVuZGluZyh0c2spKSB7CisJCWlmICghc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCXJlbGVhc2Vfc29jayhzayk7CiAJCQlzY2hlZHVsZSgpOwogCQkJbG9ja19zb2NrKHNrKTsKIAkJCWNvbnRpbnVlOwogCQl9Ci0JCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOwotCQlyZW1vdmVfd2FpdF9xdWV1ZShzay0+c2tfc2xlZXAsICZ3YWl0KTsKLQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwkJZXJyID0gLUVSRVNUQVJUU1lTOworCQlicmVhazsKIAl9Ci0JY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7Ci0JcmVtb3ZlX3dhaXRfcXVldWUoc2stPnNrX3NsZWVwLCAmd2FpdCk7CisJZmluaXNoX3dhaXQoc2stPnNrX3NsZWVwLCAmd2FpdCk7CisJaWYgKGVycikKKwkJZ290byBvdXRfcmVsZWFzZTsKIAogCW5ld3NrID0gc2tiLT5zazsKIAluZXdzay0+c2tfc29ja2V0ID0gbmV3c29jazsKQEAgLTkxNiw3ICs5MTQsNyBAQAogCXNrLT5za19hY2tfYmFja2xvZy0tOwogCW5ld3NvY2stPnNrID0gbmV3c2s7CiAKLW91dDoKK291dF9yZWxlYXNlOgogCXJlbGVhc2Vfc29jayhzayk7CiAKIAlyZXR1cm4gZXJyOwpAQCAtMTEwNSw5ICsxMTAzLDEwIEBACiAJICovCiAJU09DS19ERUJVRyhzaywgIlJPU0U6IEFwcGVuZGluZyB1c2VyIGRhdGFcbiIpOwogCi0JYXNtcHRyID0gc2tiLT5oLnJhdyA9IHNrYl9wdXQoc2tiLCBsZW4pOworCXNrYl9yZXNldF90cmFuc3BvcnRfaGVhZGVyKHNrYik7CisJc2tiX3B1dChza2IsIGxlbik7CiAKLQllcnIgPSBtZW1jcHlfZnJvbWlvdmVjKGFzbXB0ciwgbXNnLT5tc2dfaW92LCBsZW4pOworCWVyciA9IG1lbWNweV9mcm9taW92ZWMoc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKSwgbXNnLT5tc2dfaW92LCBsZW4pOwogCWlmIChlcnIpIHsKIAkJa2ZyZWVfc2tiKHNrYik7CiAJCXJldHVybiBlcnI7CkBAIC0xMTU1LDcgKzExNTQsNyBAQAogCQlpbnQgbGc7CiAKIAkJLyogU2F2ZSBhIGNvcHkgb2YgdGhlIEhlYWRlciAqLwotCQltZW1jcHkoaGVhZGVyLCBza2ItPmRhdGEsIFJPU0VfTUlOX0xFTik7CisJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCBoZWFkZXIsIFJPU0VfTUlOX0xFTik7CiAJCXNrYl9wdWxsKHNrYiwgUk9TRV9NSU5fTEVOKTsKIAogCQlmcm9udGxlbiA9IHNrYl9oZWFkcm9vbShza2IpOwpAQCAtMTE3NSwxMiArMTE3NCwxMiBAQAogCQkJbGcgPSAoUk9TRV9QQUNMRU4gPiBza2ItPmxlbikgPyBza2ItPmxlbiA6IFJPU0VfUEFDTEVOOwogCiAJCQkvKiBDb3B5IHRoZSB1c2VyIGRhdGEgKi8KLQkJCW1lbWNweShza2JfcHV0KHNrYm4sIGxnKSwgc2tiLT5kYXRhLCBsZyk7CisJCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgc2tiX3B1dChza2JuLCBsZyksIGxnKTsKIAkJCXNrYl9wdWxsKHNrYiwgbGcpOwogCiAJCQkvKiBEdXBsaWNhdGUgdGhlIEhlYWRlciAqLwogCQkJc2tiX3B1c2goc2tibiwgUk9TRV9NSU5fTEVOKTsKLQkJCW1lbWNweShza2JuLT5kYXRhLCBoZWFkZXIsIFJPU0VfTUlOX0xFTik7CisJCQlza2JfY29weV90b19saW5lYXJfZGF0YShza2JuLCBoZWFkZXIsIFJPU0VfTUlOX0xFTik7CiAKIAkJCWlmIChza2ItPmxlbiA+IDApCiAJCQkJc2tibi0+ZGF0YVsyXSB8PSBNX0JJVDsKQEAgLTEyMzQsNyArMTIzMyw3IEBACiAJCSphc21wdHIgPSBxYml0OwogCX0KIAotCXNrYi0+aC5yYXcgPSBza2ItPmRhdGE7CisJc2tiX3Jlc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKIAljb3BpZWQgICAgID0gc2tiLT5sZW47CiAKIAlpZiAoY29waWVkID4gc2l6ZSkgewpAQCAtMTI5Niw2ICsxMjk1LDkgQEAKIAljYXNlIFNJT0NHU1RBTVA6CiAJCXJldHVybiBzb2NrX2dldF90aW1lc3RhbXAoc2ssIChzdHJ1Y3QgdGltZXZhbCBfX3VzZXIgKikgYXJncCk7CiAKKwljYXNlIFNJT0NHU1RBTVBOUzoKKwkJcmV0dXJuIHNvY2tfZ2V0X3RpbWVzdGFtcG5zKHNrLCAoc3RydWN0IHRpbWVzcGVjIF9fdXNlciAqKSBhcmdwKTsKKwogCWNhc2UgU0lPQ0dJRkFERFI6CiAJY2FzZSBTSU9DU0lGQUREUjoKIAljYXNlIFNJT0NHSUZEU1RBRERSOgpkaWZmIC0tZ2l0IGEvbmV0L3Jvc2Uvcm9zZV9sb29wYmFjay5jIGIvbmV0L3Jvc2Uvcm9zZV9sb29wYmFjay5jCmluZGV4IDNlNDFiZDkuLmNkMDE2NDIgMTAwNjQ0Ci0tLSBhL25ldC9yb3NlL3Jvc2VfbG9vcGJhY2suYworKysgYi9uZXQvcm9zZS9yb3NlX2xvb3BiYWNrLmMKQEAgLTc3LDcgKzc3LDcgQEAKIAkJZGVzdCAgICAgID0gKHJvc2VfYWRkcmVzcyAqKShza2ItPmRhdGEgKyA0KTsKIAkJbGNpX28gICAgID0gMHhGRkYgLSBsY2lfaTsKIAotCQlza2ItPmgucmF3ID0gc2tiLT5kYXRhOworCQlza2JfcmVzZXRfdHJhbnNwb3J0X2hlYWRlcihza2IpOwogCiAJCXNrID0gcm9zZV9maW5kX3NvY2tldChsY2lfbywgJnJvc2VfbG9vcGJhY2tfbmVpZ2gpOwogCQlpZiAoc2spIHsKZGlmZiAtLWdpdCBhL25ldC9yb3NlL3Jvc2Vfcm91dGUuYyBiL25ldC9yb3NlL3Jvc2Vfcm91dGUuYwppbmRleCBhMTIzM2UxLi4xZjlhZWZkIDEwMDY0NAotLS0gYS9uZXQvcm9zZS9yb3NlX3JvdXRlLmMKKysrIGIvbmV0L3Jvc2Uvcm9zZV9yb3V0ZS5jCkBAIC05MDYsNyArOTA2LDcgQEAKIAkJCX0KIAkJfQogCQllbHNlIHsKLQkJCXNrYi0+aC5yYXcgPSBza2ItPmRhdGE7CisJCQlza2JfcmVzZXRfdHJhbnNwb3J0X2hlYWRlcihza2IpOwogCQkJcmVzID0gcm9zZV9wcm9jZXNzX3J4X2ZyYW1lKHNrLCBza2IpOwogCQkJZ290byBvdXQ7CiAJCX0KZGlmZiAtLWdpdCBhL25ldC9yeHJwYy9LY29uZmlnIGIvbmV0L3J4cnBjL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc1MGY2ZAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9yeHJwYy9LY29uZmlnCkBAIC0wLDAgKzEsNDIgQEAKKyMKKyMgUnhSUEMgc2Vzc2lvbiBzb2NrZXRzCisjCisKK2NvbmZpZyBBRl9SWFJQQworCXRyaXN0YXRlICJSeFJQQyBzZXNzaW9uIHNvY2tldHMiCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKKwloZWxwCisJICBTYXkgWSBvciBNIGhlcmUgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciBSeFJQQyBzZXNzaW9uIHNvY2tldHMgKGp1c3QKKwkgIHRoZSB0cmFuc3BvcnQgcGFydCwgbm90IHRoZSBwcmVzZW50YXRpb24gcGFydDogKHVuKW1hcnNoYWxsaW5nIGlzCisJICBsZWZ0IHRvIHRoZSBhcHBsaWNhdGlvbikuCisKKwkgIFRoZXNlIGFyZSB1c2VkIGZvciBBRlMga2VybmVsIGZpbGVzeXN0ZW0gYW5kIHVzZXJzcGFjZSB1dGlsaXRpZXMuCisKKwkgIFRoaXMgbW9kdWxlIGF0IHRoZSBtb21lbnQgb25seSBzdXBwb3J0cyBjbGllbnQgb3BlcmF0aW9ucyBhbmQgaXMKKwkgIGN1cnJlbnRseSBpbmNvbXBsZXRlLgorCisJICBTZWUgRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3J4cnBjLnR4dC4KKworCitjb25maWcgQUZfUlhSUENfREVCVUcKKwlib29sICJSeFJQQyBkeW5hbWljIGRlYnVnZ2luZyIKKwlkZXBlbmRzIG9uIEFGX1JYUlBDCisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBtYWtlIHJ1bnRpbWUgY29udHJvbGxhYmxlIGRlYnVnZ2luZyBtZXNzYWdlcyBhcHBlYXIuCisKKwkgIFNlZSBEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvcnhycGMudHh0LgorCisKK2NvbmZpZyBSWEtBRAorCXRyaXN0YXRlICJSeFJQQyBLZXJiZXJvcyBzZWN1cml0eSIKKwlkZXBlbmRzIG9uIEFGX1JYUlBDICYmIEtFWVMKKwlzZWxlY3QgQ1JZUFRPCisJc2VsZWN0IENSWVBUT19NQU5BR0VSCisJc2VsZWN0IENSWVBUT19CTEtDSVBIRVIKKwlzZWxlY3QgQ1JZUFRPX1BDQkMKKwlzZWxlY3QgQ1JZUFRPX0ZDUllQVAorCWhlbHAKKwkgIFByb3ZpZGUga2VyYmVyb3MgNCBhbmQgQUZTIGthc2VydmVyIHNlY3VyaXR5IGhhbmRsaW5nIGZvciBBRl9SWFJQQworCSAgdGhyb3VnaCB0aGUgdXNlIG9mIHRoZSBrZXkgcmV0ZW50aW9uIHNlcnZpY2UuCisKKwkgIFNlZSBEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvcnhycGMudHh0LgpkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL01ha2VmaWxlIGIvbmV0L3J4cnBjL01ha2VmaWxlCmluZGV4IDZlZmNiNmYuLmM0Njg2N2MgMTAwNjQ0Ci0tLSBhL25ldC9yeHJwYy9NYWtlZmlsZQorKysgYi9uZXQvcnhycGMvTWFrZWZpbGUKQEAgLTEsMjUgKzEsMjkgQEAKICMKLSMgTWFrZWZpbGUgZm9yIExpbnV4IGtlcm5lbCBSeCBSUEMKKyMgTWFrZWZpbGUgZm9yIExpbnV4IGtlcm5lbCBSeFJQQwogIwogCi0jQ0ZMQUdTICs9IC1maW5zdHJ1bWVudC1mdW5jdGlvbnMKLQotcnhycGMtb2JqcyA6PSBcCi0JY2FsbC5vIFwKLQljb25uZWN0aW9uLm8gXAotCWtyeGlvZC5vIFwKLQlrcnhzZWNkLm8gXAotCWtyeHRpbW9kLm8gXAotCW1haW4ubyBcCi0JcGVlci5vIFwKLQlyeHJwY19zeW1zLm8gXAotCXRyYW5zcG9ydC5vCithZi1yeHJwYy1vYmpzIDo9IFwKKwlhZl9yeHJwYy5vIFwKKwlhci1hY2NlcHQubyBcCisJYXItYWNrLm8gXAorCWFyLWNhbGwubyBcCisJYXItY29ubmVjdGlvbi5vIFwKKwlhci1jb25uZXZlbnQubyBcCisJYXItZXJyb3IubyBcCisJYXItaW5wdXQubyBcCisJYXIta2V5Lm8gXAorCWFyLWxvY2FsLm8gXAorCWFyLW91dHB1dC5vIFwKKwlhci1wZWVyLm8gXAorCWFyLXJlY3Ztc2cubyBcCisJYXItc2VjdXJpdHkubyBcCisJYXItc2tidWZmLm8gXAorCWFyLXRyYW5zcG9ydC5vCiAKIGlmZXEgKCQoQ09ORklHX1BST0NfRlMpLHkpCi1yeHJwYy1vYmpzICs9IHByb2MubwotZW5kaWYKLWlmZXEgKCQoQ09ORklHX1NZU0NUTCkseSkKLXJ4cnBjLW9ianMgKz0gc3lzY3RsLm8KK2FmLXJ4cnBjLW9ianMgKz0gYXItcHJvYy5vCiBlbmRpZgogCi1vYmotJChDT05GSUdfUlhSUEMpIDo9IHJ4cnBjLm8KK29iai0kKENPTkZJR19BRl9SWFJQQykgKz0gYWYtcnhycGMubworCitvYmotJChDT05GSUdfUlhLQUQpICs9IHJ4a2FkLm8KZGlmZiAtLWdpdCBhL25ldC9yeHJwYy9hZl9yeHJwYy5jIGIvbmV0L3J4cnBjL2FmX3J4cnBjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM1N2RmOQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9yeHJwYy9hZl9yeHJwYy5jCkBAIC0wLDAgKzEsODc5IEBACisvKiBBRl9SWFJQQyBpbXBsZW1lbnRhdGlvbgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPG5ldC9hZl9yeHJwYy5oPgorI2luY2x1ZGUgImFyLWludGVybmFsLmgiCisKK01PRFVMRV9ERVNDUklQVElPTigiUnhSUEMgbmV0d29yayBwcm90b2NvbCIpOworTU9EVUxFX0FVVEhPUigiUmVkIEhhdCwgSW5jLiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTX05FVFBST1RPKFBGX1JYUlBDKTsKKwordW5zaWduZWQgcnhycGNfZGVidWc7IC8vID0gUlhSUENfREVCVUdfS1BST1RPOworbW9kdWxlX3BhcmFtX25hbWVkKGRlYnVnLCByeHJwY19kZWJ1ZywgdWludCwgU19JV1VTUiB8IFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhyeHJwY19kZWJ1ZywgIlJ4UlBDIGRlYnVnZ2luZyBtYXNrIik7CisKK3N0YXRpYyBpbnQgc3lzY3RsX3J4cnBjX21heF9xbGVuIF9fcmVhZF9tb3N0bHkgPSAxMDsKKworc3RhdGljIHN0cnVjdCBwcm90byByeHJwY19wcm90bzsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcHJvdG9fb3BzIHJ4cnBjX3JwY19vcHM7CisKKy8qIGxvY2FsIGVwb2NoIGZvciBkZXRlY3RpbmcgbG9jYWwtZW5kIHJlc2V0ICovCitfX2JlMzIgcnhycGNfZXBvY2g7CisKKy8qIGN1cnJlbnQgZGVidWdnaW5nIElEICovCithdG9taWNfdCByeHJwY19kZWJ1Z19pZDsKKworLyogY291bnQgb2Ygc2ticyBjdXJyZW50bHkgaW4gdXNlICovCithdG9taWNfdCByeHJwY19uX3NrYnM7CisKK3N0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpyeHJwY193b3JrcXVldWU7CisKK3N0YXRpYyB2b2lkIHJ4cnBjX3NvY2tfZGVzdHJ1Y3RvcihzdHJ1Y3Qgc29jayAqKTsKKworLyoKKyAqIHNlZSBpZiBhbiBSeFJQQyBzb2NrZXQgaXMgY3VycmVudGx5IHdyaXRhYmxlCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHJ4cnBjX3dyaXRhYmxlKHN0cnVjdCBzb2NrICpzaykKK3sKKwlyZXR1cm4gYXRvbWljX3JlYWQoJnNrLT5za193bWVtX2FsbG9jKSA8IChzaXplX3QpIHNrLT5za19zbmRidWY7Cit9CisKKy8qCisgKiB3YWl0IGZvciB3cml0ZSBidWZmZXJhZ2UgdG8gYmVjb21lIGF2YWlsYWJsZQorICovCitzdGF0aWMgdm9pZCByeHJwY193cml0ZV9zcGFjZShzdHJ1Y3Qgc29jayAqc2spCit7CisJX2VudGVyKCIlcCIsIHNrKTsKKwlyZWFkX2xvY2soJnNrLT5za19jYWxsYmFja19sb2NrKTsKKwlpZiAocnhycGNfd3JpdGFibGUoc2spKSB7CisJCWlmIChzay0+c2tfc2xlZXAgJiYgd2FpdHF1ZXVlX2FjdGl2ZShzay0+c2tfc2xlZXApKQorCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKHNrLT5za19zbGVlcCk7CisJCXNrX3dha2VfYXN5bmMoc2ssIDIsIFBPTExfT1VUKTsKKwl9CisJcmVhZF91bmxvY2soJnNrLT5za19jYWxsYmFja19sb2NrKTsKK30KKworLyoKKyAqIHZhbGlkYXRlIGFuIFJ4UlBDIGFkZHJlc3MKKyAqLworc3RhdGljIGludCByeHJwY192YWxpZGF0ZV9hZGRyZXNzKHN0cnVjdCByeHJwY19zb2NrICpyeCwKKwkJCQkgIHN0cnVjdCBzb2NrYWRkcl9yeHJwYyAqc3J4LAorCQkJCSAgaW50IGxlbikKK3sKKwlpZiAobGVuIDwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9yeHJwYykpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHNyeC0+c3J4X2ZhbWlseSAhPSBBRl9SWFJQQykKKwkJcmV0dXJuIC1FQUZOT1NVUFBPUlQ7CisKKwlpZiAoc3J4LT50cmFuc3BvcnRfdHlwZSAhPSBTT0NLX0RHUkFNKQorCQlyZXR1cm4gLUVTT0NLVE5PU1VQUE9SVDsKKworCWxlbiAtPSBvZmZzZXRvZihzdHJ1Y3Qgc29ja2FkZHJfcnhycGMsIHRyYW5zcG9ydCk7CisJaWYgKHNyeC0+dHJhbnNwb3J0X2xlbiA8IHNpemVvZihzYV9mYW1pbHlfdCkgfHwKKwkgICAgc3J4LT50cmFuc3BvcnRfbGVuID4gbGVuKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChzcngtPnRyYW5zcG9ydC5mYW1pbHkgIT0gcngtPnByb3RvKQorCQlyZXR1cm4gLUVBRk5PU1VQUE9SVDsKKworCXN3aXRjaCAoc3J4LT50cmFuc3BvcnQuZmFtaWx5KSB7CisJY2FzZSBBRl9JTkVUOgorCQlfZGVidWcoIklORVQ6ICV4IEAgJXUuJXUuJXUuJXUiLAorCQkgICAgICAgbnRvaHMoc3J4LT50cmFuc3BvcnQuc2luLnNpbl9wb3J0KSwKKwkJICAgICAgIE5JUFFVQUQoc3J4LT50cmFuc3BvcnQuc2luLnNpbl9hZGRyKSk7CisJCWlmIChzcngtPnRyYW5zcG9ydF9sZW4gPiA4KQorCQkJbWVtc2V0KCh2b2lkICopJnNyeC0+dHJhbnNwb3J0ICsgOCwgMCwKKwkJCSAgICAgICBzcngtPnRyYW5zcG9ydF9sZW4gLSA4KTsKKwkJYnJlYWs7CisKKwljYXNlIEFGX0lORVQ2OgorCWRlZmF1bHQ6CisJCXJldHVybiAtRUFGTk9TVVBQT1JUOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogYmluZCBhIGxvY2FsIGFkZHJlc3MgdG8gYW4gUnhSUEMgc29ja2V0CisgKi8KK3N0YXRpYyBpbnQgcnhycGNfYmluZChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHIgKnNhZGRyLCBpbnQgbGVuKQoreworCXN0cnVjdCBzb2NrYWRkcl9yeHJwYyAqc3J4ID0gKHN0cnVjdCBzb2NrYWRkcl9yeHJwYyAqKSBzYWRkcjsKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3QgcnhycGNfbG9jYWwgKmxvY2FsOworCXN0cnVjdCByeHJwY19zb2NrICpyeCA9IHJ4cnBjX3NrKHNrKSwgKnByeDsKKwlfX2JlMTYgc2VydmljZV9pZDsKKwlpbnQgcmV0OworCisJX2VudGVyKCIlcCwlcCwlZCIsIHJ4LCBzYWRkciwgbGVuKTsKKworCXJldCA9IHJ4cnBjX3ZhbGlkYXRlX2FkZHJlc3MocngsIHNyeCwgbGVuKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJvcjsKKworCWxvY2tfc29jaygmcngtPnNrKTsKKworCWlmIChyeC0+c2suc2tfc3RhdGUgIT0gUlhSUENfVU5DT05ORUNURUQpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnJvcl91bmxvY2s7CisJfQorCisJbWVtY3B5KCZyeC0+c3J4LCBzcngsIHNpemVvZihyeC0+c3J4KSk7CisKKwkvKiBmaW5kIGEgbG9jYWwgdHJhbnNwb3J0IGVuZHBvaW50IGlmIHdlIGRvbid0IGhhdmUgb25lIGFscmVhZHkgKi8KKwlsb2NhbCA9IHJ4cnBjX2xvb2t1cF9sb2NhbCgmcngtPnNyeCk7CisJaWYgKElTX0VSUihsb2NhbCkpIHsKKwkJcmV0ID0gUFRSX0VSUihsb2NhbCk7CisJCWdvdG8gZXJyb3JfdW5sb2NrOworCX0KKworCXJ4LT5sb2NhbCA9IGxvY2FsOworCWlmIChzcngtPnNyeF9zZXJ2aWNlKSB7CisJCXNlcnZpY2VfaWQgPSBodG9ucyhzcngtPnNyeF9zZXJ2aWNlKTsKKwkJd3JpdGVfbG9ja19iaCgmbG9jYWwtPnNlcnZpY2VzX2xvY2spOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHByeCwgJmxvY2FsLT5zZXJ2aWNlcywgbGlzdGVuX2xpbmspIHsKKwkJCWlmIChwcngtPnNlcnZpY2VfaWQgPT0gc2VydmljZV9pZCkKKwkJCQlnb3RvIHNlcnZpY2VfaW5fdXNlOworCQl9CisKKwkJcngtPnNlcnZpY2VfaWQgPSBzZXJ2aWNlX2lkOworCQlsaXN0X2FkZF90YWlsKCZyeC0+bGlzdGVuX2xpbmssICZsb2NhbC0+c2VydmljZXMpOworCQl3cml0ZV91bmxvY2tfYmgoJmxvY2FsLT5zZXJ2aWNlc19sb2NrKTsKKworCQlyeC0+c2suc2tfc3RhdGUgPSBSWFJQQ19TRVJWRVJfQk9VTkQ7CisJfSBlbHNlIHsKKwkJcngtPnNrLnNrX3N0YXRlID0gUlhSUENfQ0xJRU5UX0JPVU5EOworCX0KKworCXJlbGVhc2Vfc29jaygmcngtPnNrKTsKKwlfbGVhdmUoIiA9IDAiKTsKKwlyZXR1cm4gMDsKKworc2VydmljZV9pbl91c2U6CisJcmV0ID0gLUVBRERSSU5VU0U7CisJd3JpdGVfdW5sb2NrX2JoKCZsb2NhbC0+c2VydmljZXNfbG9jayk7CitlcnJvcl91bmxvY2s6CisJcmVsZWFzZV9zb2NrKCZyeC0+c2spOworZXJyb3I6CisJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIHNldCB0aGUgbnVtYmVyIG9mIHBlbmRpbmcgY2FsbHMgcGVybWl0dGVkIG9uIGEgbGlzdGVuaW5nIHNvY2tldAorICovCitzdGF0aWMgaW50IHJ4cnBjX2xpc3RlbihzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgYmFja2xvZykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3QgcnhycGNfc29jayAqcnggPSByeHJwY19zayhzayk7CisJaW50IHJldDsKKworCV9lbnRlcigiJXAsJWQiLCByeCwgYmFja2xvZyk7CisKKwlsb2NrX3NvY2soJnJ4LT5zayk7CisKKwlzd2l0Y2ggKHJ4LT5zay5za19zdGF0ZSkgeworCWNhc2UgUlhSUENfVU5DT05ORUNURUQ6CisJCXJldCA9IC1FQUREUk5PVEFWQUlMOworCQlicmVhazsKKwljYXNlIFJYUlBDX0NMSUVOVF9CT1VORDoKKwljYXNlIFJYUlBDX0NMSUVOVF9DT05ORUNURUQ6CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVCVVNZOworCQlicmVhazsKKwljYXNlIFJYUlBDX1NFUlZFUl9CT1VORDoKKwkJQVNTRVJUKHJ4LT5sb2NhbCAhPSBOVUxMKTsKKwkJc2stPnNrX21heF9hY2tfYmFja2xvZyA9IGJhY2tsb2c7CisJCXJ4LT5zay5za19zdGF0ZSA9IFJYUlBDX1NFUlZFUl9MSVNURU5JTkc7CisJCXJldCA9IDA7CisJCWJyZWFrOworCX0KKworCXJlbGVhc2Vfc29jaygmcngtPnNrKTsKKwlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogZmluZCBhIHRyYW5zcG9ydCBieSBhZGRyZXNzCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICpyeHJwY19uYW1lX3RvX3RyYW5zcG9ydChzdHJ1Y3Qgc29ja2V0ICpzb2NrLAorCQkJCQkJICAgICAgIHN0cnVjdCBzb2NrYWRkciAqYWRkciwKKwkJCQkJCSAgICAgICBpbnQgYWRkcl9sZW4sIGludCBmbGFncywKKwkJCQkJCSAgICAgICBnZnBfdCBnZnApCit7CisJc3RydWN0IHNvY2thZGRyX3J4cnBjICpzcnggPSAoc3RydWN0IHNvY2thZGRyX3J4cnBjICopIGFkZHI7CisJc3RydWN0IHJ4cnBjX3RyYW5zcG9ydCAqdHJhbnM7CisJc3RydWN0IHJ4cnBjX3NvY2sgKnJ4ID0gcnhycGNfc2soc29jay0+c2spOworCXN0cnVjdCByeHJwY19wZWVyICpwZWVyOworCisJX2VudGVyKCIlcCwlcCwlZCwlZCIsIHJ4LCBhZGRyLCBhZGRyX2xlbiwgZmxhZ3MpOworCisJQVNTRVJUKHJ4LT5sb2NhbCAhPSBOVUxMKTsKKwlBU1NFUlQocngtPnNrLnNrX3N0YXRlID4gUlhSUENfVU5DT05ORUNURUQpOworCisJaWYgKHJ4LT5zcngudHJhbnNwb3J0X3R5cGUgIT0gc3J4LT50cmFuc3BvcnRfdHlwZSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVTT0NLVE5PU1VQUE9SVCk7CisJaWYgKHJ4LT5zcngudHJhbnNwb3J0LmZhbWlseSAhPSBzcngtPnRyYW5zcG9ydC5mYW1pbHkpCisJCXJldHVybiBFUlJfUFRSKC1FQUZOT1NVUFBPUlQpOworCisJLyogZmluZCBhIHJlbW90ZSB0cmFuc3BvcnQgZW5kcG9pbnQgZnJvbSB0aGUgbG9jYWwgb25lICovCisJcGVlciA9IHJ4cnBjX2dldF9wZWVyKHNyeCwgZ2ZwKTsKKwlpZiAoSVNfRVJSKHBlZXIpKQorCQlyZXR1cm4gRVJSX1BUUihQVFJfRVJSKHBlZXIpKTsKKworCS8qIGZpbmQgYSB0cmFuc3BvcnQgKi8KKwl0cmFucyA9IHJ4cnBjX2dldF90cmFuc3BvcnQocngtPmxvY2FsLCBwZWVyLCBnZnApOworCXJ4cnBjX3B1dF9wZWVyKHBlZXIpOworCV9sZWF2ZSgiID0gJXAiLCB0cmFucyk7CisJcmV0dXJuIHRyYW5zOworfQorCisvKioKKyAqIHJ4cnBjX2tlcm5lbF9iZWdpbl9jYWxsIC0gQWxsb3cgYSBrZXJuZWwgc2VydmljZSB0byBiZWdpbiBhIGNhbGwKKyAqIEBzb2NrOiBUaGUgc29ja2V0IG9uIHdoaWNoIHRvIG1ha2UgdGhlIGNhbGwKKyAqIEBzcng6IFRoZSBhZGRyZXNzIG9mIHRoZSBwZWVyIHRvIGNvbnRhY3QgKGRlZmF1bHRzIHRvIHNvY2tldCBzZXR0aW5nKQorICogQGtleTogVGhlIHNlY3VyaXR5IGNvbnRleHQgdG8gdXNlIChkZWZhdWx0cyB0byBzb2NrZXQgc2V0dGluZykKKyAqIEB1c2VyX2NhbGxfSUQ6IFRoZSBJRCB0byB1c2UKKyAqCisgKiBBbGxvdyBhIGtlcm5lbCBzZXJ2aWNlIHRvIGJlZ2luIGEgY2FsbCBvbiB0aGUgbm9taW5hdGVkIHNvY2tldC4gIFRoaXMganVzdAorICogc2V0cyB1cCBhbGwgdGhlIGludGVybmFsIHRyYWNraW5nIHN0cnVjdHVyZXMgYW5kIGFsbG9jYXRlcyBjb25uZWN0aW9uIGFuZAorICogY2FsbCBJRHMgYXMgYXBwcm9wcmlhdGUuICBUaGUgY2FsbCB0byBiZSB1c2VkIGlzIHJldHVybmVkLgorICoKKyAqIFRoZSBkZWZhdWx0IHNvY2tldCBkZXN0aW5hdGlvbiBhZGRyZXNzIGFuZCBzZWN1cml0eSBtYXkgYmUgb3ZlcnJpZGRlbiBieQorICogc3VwcGx5aW5nIEBzcnggYW5kIEBrZXkuCisgKi8KK3N0cnVjdCByeHJwY19jYWxsICpyeHJwY19rZXJuZWxfYmVnaW5fY2FsbChzdHJ1Y3Qgc29ja2V0ICpzb2NrLAorCQkJCQkgICBzdHJ1Y3Qgc29ja2FkZHJfcnhycGMgKnNyeCwKKwkJCQkJICAgc3RydWN0IGtleSAqa2V5LAorCQkJCQkgICB1bnNpZ25lZCBsb25nIHVzZXJfY2FsbF9JRCwKKwkJCQkJICAgZ2ZwX3QgZ2ZwKQoreworCXN0cnVjdCByeHJwY19jb25uX2J1bmRsZSAqYnVuZGxlOworCXN0cnVjdCByeHJwY190cmFuc3BvcnQgKnRyYW5zOworCXN0cnVjdCByeHJwY19jYWxsICpjYWxsOworCXN0cnVjdCByeHJwY19zb2NrICpyeCA9IHJ4cnBjX3NrKHNvY2stPnNrKTsKKwlfX2JlMTYgc2VydmljZV9pZDsKKworCV9lbnRlcigiLCwleCwlbHgiLCBrZXlfc2VyaWFsKGtleSksIHVzZXJfY2FsbF9JRCk7CisKKwlsb2NrX3NvY2soJnJ4LT5zayk7CisKKwlpZiAoc3J4KSB7CisJCXRyYW5zID0gcnhycGNfbmFtZV90b190cmFuc3BvcnQoc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSBzcngsCisJCQkJCQlzaXplb2YoKnNyeCksIDAsIGdmcCk7CisJCWlmIChJU19FUlIodHJhbnMpKSB7CisJCQljYWxsID0gRVJSX1BUUihQVFJfRVJSKHRyYW5zKSk7CisJCQl0cmFucyA9IE5VTEw7CisJCQlnb3RvIG91dDsKKwkJfQorCX0gZWxzZSB7CisJCXRyYW5zID0gcngtPnRyYW5zOworCQlpZiAoIXRyYW5zKSB7CisJCQljYWxsID0gRVJSX1BUUigtRU5PVENPTk4pOworCQkJZ290byBvdXQ7CisJCX0KKwkJYXRvbWljX2luYygmdHJhbnMtPnVzYWdlKTsKKwl9CisKKwlzZXJ2aWNlX2lkID0gcngtPnNlcnZpY2VfaWQ7CisJaWYgKHNyeCkKKwkJc2VydmljZV9pZCA9IGh0b25zKHNyeC0+c3J4X3NlcnZpY2UpOworCisJaWYgKCFrZXkpCisJCWtleSA9IHJ4LT5rZXk7CisJaWYgKGtleSAmJiAha2V5LT5wYXlsb2FkLmRhdGEpCisJCWtleSA9IE5VTEw7IC8qIGEgbm8tc2VjdXJpdHkga2V5ICovCisKKwlidW5kbGUgPSByeHJwY19nZXRfYnVuZGxlKHJ4LCB0cmFucywga2V5LCBzZXJ2aWNlX2lkLCBnZnApOworCWlmIChJU19FUlIoYnVuZGxlKSkgeworCQljYWxsID0gRVJSX1BUUihQVFJfRVJSKGJ1bmRsZSkpOworCQlnb3RvIG91dDsKKwl9CisKKwljYWxsID0gcnhycGNfZ2V0X2NsaWVudF9jYWxsKHJ4LCB0cmFucywgYnVuZGxlLCB1c2VyX2NhbGxfSUQsIHRydWUsCisJCQkJICAgICBnZnApOworCXJ4cnBjX3B1dF9idW5kbGUodHJhbnMsIGJ1bmRsZSk7CitvdXQ6CisJcnhycGNfcHV0X3RyYW5zcG9ydCh0cmFucyk7CisJcmVsZWFzZV9zb2NrKCZyeC0+c2spOworCV9sZWF2ZSgiID0gJXAiLCBjYWxsKTsKKwlyZXR1cm4gY2FsbDsKK30KKworRVhQT1JUX1NZTUJPTChyeHJwY19rZXJuZWxfYmVnaW5fY2FsbCk7CisKKy8qKgorICogcnhycGNfa2VybmVsX2VuZF9jYWxsIC0gQWxsb3cgYSBrZXJuZWwgc2VydmljZSB0byBlbmQgYSBjYWxsIGl0IHdhcyB1c2luZworICogQGNhbGw6IFRoZSBjYWxsIHRvIGVuZAorICoKKyAqIEFsbG93IGEga2VybmVsIHNlcnZpY2UgdG8gZW5kIGEgY2FsbCBpdCB3YXMgdXNpbmcuICBUaGUgY2FsbCBtdXN0IGJlCisgKiBjb21wbGV0ZSBiZWZvcmUgdGhpcyBpcyBjYWxsZWQgKHRoZSBjYWxsIHNob3VsZCBiZSBhYm9ydGVkIGlmIG5lY2Vzc2FyeSkuCisgKi8KK3ZvaWQgcnhycGNfa2VybmVsX2VuZF9jYWxsKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKQoreworCV9lbnRlcigiJWR7JWR9IiwgY2FsbC0+ZGVidWdfaWQsIGF0b21pY19yZWFkKCZjYWxsLT51c2FnZSkpOworCXJ4cnBjX3JlbW92ZV91c2VyX0lEKGNhbGwtPnNvY2tldCwgY2FsbCk7CisJcnhycGNfcHV0X2NhbGwoY2FsbCk7Cit9CisKK0VYUE9SVF9TWU1CT0wocnhycGNfa2VybmVsX2VuZF9jYWxsKTsKKworLyoqCisgKiByeHJwY19rZXJuZWxfaW50ZXJjZXB0X3J4X21lc3NhZ2VzIC0gSW50ZXJjZXB0IHJlY2VpdmVkIFJ4UlBDIG1lc3NhZ2VzCisgKiBAc29jazogVGhlIHNvY2tldCB0byBpbnRlcmNlcHQgcmVjZWl2ZWQgbWVzc2FnZXMgb24KKyAqIEBpbnRlcmNlcHRvcjogVGhlIGZ1bmN0aW9uIHRvIHBhc3MgdGhlIG1lc3NhZ2VzIHRvCisgKgorICogQWxsb3cgYSBrZXJuZWwgc2VydmljZSB0byBpbnRlcmNlcHQgbWVzc2FnZXMgaGVhZGluZyBmb3IgdGhlIFJ4IHF1ZXVlIG9uIGFuCisgKiBSeFJQQyBzb2NrZXQuICBUaGV5IGdldCBwYXNzZWQgdG8gdGhlIHNwZWNpZmllZCBmdW5jdGlvbiBpbnN0ZWFkLgorICogQGludGVyY2VwdG9yIHNob3VsZCBmcmVlIHRoZSBzb2NrZXQgYnVmZmVycyBpdCBpcyBnaXZlbi4gIEBpbnRlcmNlcHRvciBpcworICogY2FsbGVkIHdpdGggdGhlIHNvY2tldCByZWNlaXZlIHF1ZXVlIHNwaW5sb2NrIGhlbGQgYW5kIHNvZnRpcnFzIGRpc2FibGVkIC0KKyAqIHRoaXMgZW5zdXJlcyB0aGF0IHRoZSBtZXNzYWdlcyB3aWxsIGJlIGRlbGl2ZXJlZCBpbiB0aGUgcmlnaHQgb3JkZXIuCisgKi8KK3ZvaWQgcnhycGNfa2VybmVsX2ludGVyY2VwdF9yeF9tZXNzYWdlcyhzdHJ1Y3Qgc29ja2V0ICpzb2NrLAorCQkJCQlyeHJwY19pbnRlcmNlcHRvcl90IGludGVyY2VwdG9yKQoreworCXN0cnVjdCByeHJwY19zb2NrICpyeCA9IHJ4cnBjX3NrKHNvY2stPnNrKTsKKworCV9lbnRlcigiIik7CisJcngtPmludGVyY2VwdG9yID0gaW50ZXJjZXB0b3I7Cit9CisKK0VYUE9SVF9TWU1CT0wocnhycGNfa2VybmVsX2ludGVyY2VwdF9yeF9tZXNzYWdlcyk7CisKKy8qCisgKiBjb25uZWN0IGFuIFJ4UlBDIHNvY2tldAorICogLSB0aGlzIGp1c3QgdGFyZ2V0cyBpdCBhdCBhIHNwZWNpZmljIGRlc3RpbmF0aW9uOyBubyBhY3R1YWwgY29ubmVjdGlvbgorICogICBuZWdvdGlhdGlvbiB0YWtlcyBwbGFjZQorICovCitzdGF0aWMgaW50IHJ4cnBjX2Nvbm5lY3Qoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2thZGRyICphZGRyLAorCQkJIGludCBhZGRyX2xlbiwgaW50IGZsYWdzKQoreworCXN0cnVjdCBzb2NrYWRkcl9yeHJwYyAqc3J4ID0gKHN0cnVjdCBzb2NrYWRkcl9yeHJwYyAqKSBhZGRyOworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXN0cnVjdCByeHJwY190cmFuc3BvcnQgKnRyYW5zOworCXN0cnVjdCByeHJwY19sb2NhbCAqbG9jYWw7CisJc3RydWN0IHJ4cnBjX3NvY2sgKnJ4ID0gcnhycGNfc2soc2spOworCWludCByZXQ7CisKKwlfZW50ZXIoIiVwLCVwLCVkLCVkIiwgcngsIGFkZHIsIGFkZHJfbGVuLCBmbGFncyk7CisKKwlyZXQgPSByeHJwY192YWxpZGF0ZV9hZGRyZXNzKHJ4LCBzcngsIGFkZHJfbGVuKTsKKwlpZiAocmV0IDwgMCkgeworCQlfbGVhdmUoIiA9ICVkIFtiYWQgYWRkcl0iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWxvY2tfc29jaygmcngtPnNrKTsKKworCXN3aXRjaCAocngtPnNrLnNrX3N0YXRlKSB7CisJY2FzZSBSWFJQQ19VTkNPTk5FQ1RFRDoKKwkJLyogZmluZCBhIGxvY2FsIHRyYW5zcG9ydCBlbmRwb2ludCBpZiB3ZSBkb24ndCBoYXZlIG9uZSBhbHJlYWR5ICovCisJCUFTU0VSVENNUChyeC0+bG9jYWwsID09LCBOVUxMKTsKKwkJcngtPnNyeC5zcnhfZmFtaWx5ID0gQUZfUlhSUEM7CisJCXJ4LT5zcnguc3J4X3NlcnZpY2UgPSAwOworCQlyeC0+c3J4LnRyYW5zcG9ydF90eXBlID0gc3J4LT50cmFuc3BvcnRfdHlwZTsKKwkJcngtPnNyeC50cmFuc3BvcnRfbGVuID0gc2l6ZW9mKHNhX2ZhbWlseV90KTsKKwkJcngtPnNyeC50cmFuc3BvcnQuZmFtaWx5ID0gc3J4LT50cmFuc3BvcnQuZmFtaWx5OworCQlsb2NhbCA9IHJ4cnBjX2xvb2t1cF9sb2NhbCgmcngtPnNyeCk7CisJCWlmIChJU19FUlIobG9jYWwpKSB7CisJCQlyZWxlYXNlX3NvY2soJnJ4LT5zayk7CisJCQlyZXR1cm4gUFRSX0VSUihsb2NhbCk7CisJCX0KKwkJcngtPmxvY2FsID0gbG9jYWw7CisJCXJ4LT5zay5za19zdGF0ZSA9IFJYUlBDX0NMSUVOVF9CT1VORDsKKwljYXNlIFJYUlBDX0NMSUVOVF9CT1VORDoKKwkJYnJlYWs7CisJY2FzZSBSWFJQQ19DTElFTlRfQ09OTkVDVEVEOgorCQlyZWxlYXNlX3NvY2soJnJ4LT5zayk7CisJCXJldHVybiAtRUlTQ09OTjsKKwlkZWZhdWx0OgorCQlyZWxlYXNlX3NvY2soJnJ4LT5zayk7CisJCXJldHVybiAtRUJVU1k7IC8qIHNlcnZlciBzb2NrZXRzIGNhbid0IGNvbm5lY3QgYXMgd2VsbCAqLworCX0KKworCXRyYW5zID0gcnhycGNfbmFtZV90b190cmFuc3BvcnQoc29jaywgYWRkciwgYWRkcl9sZW4sIGZsYWdzLAorCQkJCQlHRlBfS0VSTkVMKTsKKwlpZiAoSVNfRVJSKHRyYW5zKSkgeworCQlyZWxlYXNlX3NvY2soJnJ4LT5zayk7CisJCV9sZWF2ZSgiID0gJWxkIiwgUFRSX0VSUih0cmFucykpOworCQlyZXR1cm4gUFRSX0VSUih0cmFucyk7CisJfQorCisJcngtPnRyYW5zID0gdHJhbnM7CisJcngtPnNlcnZpY2VfaWQgPSBodG9ucyhzcngtPnNyeF9zZXJ2aWNlKTsKKwlyeC0+c2suc2tfc3RhdGUgPSBSWFJQQ19DTElFTlRfQ09OTkVDVEVEOworCisJcmVsZWFzZV9zb2NrKCZyeC0+c2spOworCXJldHVybiAwOworfQorCisvKgorICogc2VuZCBhIG1lc3NhZ2UgdGhyb3VnaCBhbiBSeFJQQyBzb2NrZXQKKyAqIC0gaW4gYSBjbGllbnQgdGhpcyBkb2VzIGEgbnVtYmVyIG9mIHRoaW5nczoKKyAqICAgLSBmaW5kcy9zZXRzIHVwIGEgY29ubmVjdGlvbiBmb3IgdGhlIHNlY3VyaXR5IHNwZWNpZmllZCAoaWYgYW55KQorICogICAtIGluaXRpYXRlcyBhIGNhbGwgKElEIGluIGNvbnRyb2wgZGF0YSkKKyAqICAgLSBlbmRzIHRoZSByZXF1ZXN0IHBoYXNlIG9mIGEgY2FsbCAoaWYgTVNHX01PUkUgaXMgbm90IHNldCkKKyAqICAgLSBzZW5kcyBhIGNhbGwgZGF0YSBwYWNrZXQKKyAqICAgLSBtYXkgc2VuZCBhbiBhYm9ydCAoYWJvcnQgY29kZSBpbiBjb250cm9sIGRhdGEpCisgKi8KK3N0YXRpYyBpbnQgcnhycGNfc2VuZG1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCisJCQkgc3RydWN0IG1zZ2hkciAqbSwgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICp0cmFuczsKKwlzdHJ1Y3QgcnhycGNfc29jayAqcnggPSByeHJwY19zayhzb2NrLT5zayk7CisJaW50IHJldDsKKworCV9lbnRlcigiLHslZH0sLCV6dSIsIHJ4LT5zay5za19zdGF0ZSwgbGVuKTsKKworCWlmIChtLT5tc2dfZmxhZ3MgJiBNU0dfT09CKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlpZiAobS0+bXNnX25hbWUpIHsKKwkJcmV0ID0gcnhycGNfdmFsaWRhdGVfYWRkcmVzcyhyeCwgbS0+bXNnX25hbWUsIG0tPm1zZ19uYW1lbGVuKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCV9sZWF2ZSgiID0gJWQgW2JhZCBhZGRyXSIsIHJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJdHJhbnMgPSBOVUxMOworCWxvY2tfc29jaygmcngtPnNrKTsKKworCWlmIChtLT5tc2dfbmFtZSkgeworCQlyZXQgPSAtRUlTQ09OTjsKKwkJdHJhbnMgPSByeHJwY19uYW1lX3RvX3RyYW5zcG9ydChzb2NrLCBtLT5tc2dfbmFtZSwKKwkJCQkJCW0tPm1zZ19uYW1lbGVuLCAwLCBHRlBfS0VSTkVMKTsKKwkJaWYgKElTX0VSUih0cmFucykpIHsKKwkJCXJldCA9IFBUUl9FUlIodHJhbnMpOworCQkJdHJhbnMgPSBOVUxMOworCQkJZ290byBvdXQ7CisJCX0KKwl9IGVsc2UgeworCQl0cmFucyA9IHJ4LT50cmFuczsKKwkJaWYgKHRyYW5zKQorCQkJYXRvbWljX2luYygmdHJhbnMtPnVzYWdlKTsKKwl9CisKKwlzd2l0Y2ggKHJ4LT5zay5za19zdGF0ZSkgeworCWNhc2UgUlhSUENfU0VSVkVSX0xJU1RFTklORzoKKwkJaWYgKCFtLT5tc2dfbmFtZSkgeworCQkJcmV0ID0gcnhycGNfc2VydmVyX3NlbmRtc2coaW9jYiwgcngsIG0sIGxlbik7CisJCQlicmVhazsKKwkJfQorCWNhc2UgUlhSUENfU0VSVkVSX0JPVU5EOgorCWNhc2UgUlhSUENfQ0xJRU5UX0JPVU5EOgorCQlpZiAoIW0tPm1zZ19uYW1lKSB7CisJCQlyZXQgPSAtRU5PVENPTk47CisJCQlicmVhazsKKwkJfQorCWNhc2UgUlhSUENfQ0xJRU5UX0NPTk5FQ1RFRDoKKwkJcmV0ID0gcnhycGNfY2xpZW50X3NlbmRtc2coaW9jYiwgcngsIHRyYW5zLCBtLCBsZW4pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRU5PVENPTk47CisJCWJyZWFrOworCX0KKworb3V0OgorCXJlbGVhc2Vfc29jaygmcngtPnNrKTsKKwlpZiAodHJhbnMpCisJCXJ4cnBjX3B1dF90cmFuc3BvcnQodHJhbnMpOworCV9sZWF2ZSgiID0gJWQiLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBzZXQgUnhSUEMgc29ja2V0IG9wdGlvbnMKKyAqLworc3RhdGljIGludCByeHJwY19zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCisJCQkgICAgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IG9wdGxlbikKK3sKKwlzdHJ1Y3QgcnhycGNfc29jayAqcnggPSByeHJwY19zayhzb2NrLT5zayk7CisJdW5zaWduZWQgbWluX3NlY19sZXZlbDsKKwlpbnQgcmV0OworCisJX2VudGVyKCIsJWQsJWQsLCVkIiwgbGV2ZWwsIG9wdG5hbWUsIG9wdGxlbik7CisKKwlsb2NrX3NvY2soJnJ4LT5zayk7CisJcmV0ID0gLUVPUE5PVFNVUFA7CisKKwlpZiAobGV2ZWwgPT0gU09MX1JYUlBDKSB7CisJCXN3aXRjaCAob3B0bmFtZSkgeworCQljYXNlIFJYUlBDX0VYQ0xVU0lWRV9DT05ORUNUSU9OOgorCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWlmIChvcHRsZW4gIT0gMCkKKwkJCQlnb3RvIGVycm9yOworCQkJcmV0ID0gLUVJU0NPTk47CisJCQlpZiAocngtPnNrLnNrX3N0YXRlICE9IFJYUlBDX1VOQ09OTkVDVEVEKQorCQkJCWdvdG8gZXJyb3I7CisJCQlzZXRfYml0KFJYUlBDX1NPQ0tfRVhDTFVTSVZFX0NPTk4sICZyeC0+ZmxhZ3MpOworCQkJZ290byBzdWNjZXNzOworCisJCWNhc2UgUlhSUENfU0VDVVJJVFlfS0VZOgorCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWlmIChyeC0+a2V5KQorCQkJCWdvdG8gZXJyb3I7CisJCQlyZXQgPSAtRUlTQ09OTjsKKwkJCWlmIChyeC0+c2suc2tfc3RhdGUgIT0gUlhSUENfVU5DT05ORUNURUQpCisJCQkJZ290byBlcnJvcjsKKwkJCXJldCA9IHJ4cnBjX3JlcXVlc3Rfa2V5KHJ4LCBvcHR2YWwsIG9wdGxlbik7CisJCQlnb3RvIGVycm9yOworCisJCWNhc2UgUlhSUENfU0VDVVJJVFlfS0VZUklORzoKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlpZiAocngtPmtleSkKKwkJCQlnb3RvIGVycm9yOworCQkJcmV0ID0gLUVJU0NPTk47CisJCQlpZiAocngtPnNrLnNrX3N0YXRlICE9IFJYUlBDX1VOQ09OTkVDVEVEKQorCQkJCWdvdG8gZXJyb3I7CisJCQlyZXQgPSByeHJwY19zZXJ2ZXJfa2V5cmluZyhyeCwgb3B0dmFsLCBvcHRsZW4pOworCQkJZ290byBlcnJvcjsKKworCQljYXNlIFJYUlBDX01JTl9TRUNVUklUWV9MRVZFTDoKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlpZiAob3B0bGVuICE9IHNpemVvZih1bnNpZ25lZCkpCisJCQkJZ290byBlcnJvcjsKKwkJCXJldCA9IC1FSVNDT05OOworCQkJaWYgKHJ4LT5zay5za19zdGF0ZSAhPSBSWFJQQ19VTkNPTk5FQ1RFRCkKKwkJCQlnb3RvIGVycm9yOworCQkJcmV0ID0gZ2V0X3VzZXIobWluX3NlY19sZXZlbCwKKwkJCQkgICAgICAgKHVuc2lnbmVkIF9fdXNlciAqKSBvcHR2YWwpOworCQkJaWYgKHJldCA8IDApCisJCQkJZ290byBlcnJvcjsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlpZiAobWluX3NlY19sZXZlbCA+IFJYUlBDX1NFQ1VSSVRZX01BWCkKKwkJCQlnb3RvIGVycm9yOworCQkJcngtPm1pbl9zZWNfbGV2ZWwgPSBtaW5fc2VjX2xldmVsOworCQkJZ290byBzdWNjZXNzOworCisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KKworc3VjY2VzczoKKwlyZXQgPSAwOworZXJyb3I6CisJcmVsZWFzZV9zb2NrKCZyeC0+c2spOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBwZXJtaXQgYW4gUnhSUEMgc29ja2V0IHRvIGJlIHBvbGxlZAorICovCitzdGF0aWMgdW5zaWduZWQgaW50IHJ4cnBjX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCisJCQkgICAgICAgcG9sbF90YWJsZSAqd2FpdCkKK3sKKwl1bnNpZ25lZCBpbnQgbWFzazsKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKworCXBvbGxfd2FpdChmaWxlLCBzay0+c2tfc2xlZXAsIHdhaXQpOworCW1hc2sgPSAwOworCisJLyogdGhlIHNvY2tldCBpcyByZWFkYWJsZSBpZiB0aGVyZSBhcmUgYW55IG1lc3NhZ2VzIHdhaXRpbmcgb24gdGhlIFJ4CisJICogcXVldWUgKi8KKwlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmc2stPnNrX3JlY2VpdmVfcXVldWUpKQorCQltYXNrIHw9IFBPTExJTiB8IFBPTExSRE5PUk07CisKKwkvKiB0aGUgc29ja2V0IGlzIHdyaXRhYmxlIGlmIHRoZXJlIGlzIHNwYWNlIHRvIGFkZCBuZXcgZGF0YSB0byB0aGUKKwkgKiBzb2NrZXQ7IHRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IGFueSBwYXJ0aWN1bGFyIGNhbGwgaW4gcHJvZ3Jlc3MKKwkgKiBvbiB0aGUgc29ja2V0IG1heSBoYXZlIHNwYWNlIGluIHRoZSBUeCBBQ0sgd2luZG93ICovCisJaWYgKHJ4cnBjX3dyaXRhYmxlKHNrKSkKKwkJbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKKworCXJldHVybiBtYXNrOworfQorCisvKgorICogY3JlYXRlIGFuIFJ4UlBDIHNvY2tldAorICovCitzdGF0aWMgaW50IHJ4cnBjX2NyZWF0ZShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgcHJvdG9jb2wpCit7CisJc3RydWN0IHJ4cnBjX3NvY2sgKnJ4OworCXN0cnVjdCBzb2NrICpzazsKKworCV9lbnRlcigiJXAsJWQiLCBzb2NrLCBwcm90b2NvbCk7CisKKwkvKiB3ZSBzdXBwb3J0IHRyYW5zcG9ydCBwcm90b2NvbCBVRFAgb25seSAqLworCWlmIChwcm90b2NvbCAhPSBQRl9JTkVUKQorCQlyZXR1cm4gLUVQUk9UT05PU1VQUE9SVDsKKworCWlmIChzb2NrLT50eXBlICE9IFNPQ0tfREdSQU0pCisJCXJldHVybiAtRVNPQ0tUTk9TVVBQT1JUOworCisJc29jay0+b3BzID0gJnJ4cnBjX3JwY19vcHM7CisJc29jay0+c3RhdGUgPSBTU19VTkNPTk5FQ1RFRDsKKworCXNrID0gc2tfYWxsb2MoUEZfUlhSUEMsIEdGUF9LRVJORUwsICZyeHJwY19wcm90bywgMSk7CisJaWYgKCFzaykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzb2NrX2luaXRfZGF0YShzb2NrLCBzayk7CisJc2stPnNrX3N0YXRlCQk9IFJYUlBDX1VOQ09OTkVDVEVEOworCXNrLT5za193cml0ZV9zcGFjZQk9IHJ4cnBjX3dyaXRlX3NwYWNlOworCXNrLT5za19tYXhfYWNrX2JhY2tsb2cJPSBzeXNjdGxfcnhycGNfbWF4X3FsZW47CisJc2stPnNrX2Rlc3RydWN0CQk9IHJ4cnBjX3NvY2tfZGVzdHJ1Y3RvcjsKKworCXJ4ID0gcnhycGNfc2soc2spOworCXJ4LT5wcm90byA9IHByb3RvY29sOworCXJ4LT5jYWxscyA9IFJCX1JPT1Q7CisKKwlJTklUX0xJU1RfSEVBRCgmcngtPmxpc3Rlbl9saW5rKTsKKwlJTklUX0xJU1RfSEVBRCgmcngtPnNlY3VyZXEpOworCUlOSVRfTElTVF9IRUFEKCZyeC0+YWNjZXB0cSk7CisJcndsb2NrX2luaXQoJnJ4LT5jYWxsX2xvY2spOworCW1lbXNldCgmcngtPnNyeCwgMCwgc2l6ZW9mKHJ4LT5zcngpKTsKKworCV9sZWF2ZSgiID0gMCBbJXBdIiwgcngpOworCXJldHVybiAwOworfQorCisvKgorICogUnhSUEMgc29ja2V0IGRlc3RydWN0b3IKKyAqLworc3RhdGljIHZvaWQgcnhycGNfc29ja19kZXN0cnVjdG9yKHN0cnVjdCBzb2NrICpzaykKK3sKKwlfZW50ZXIoIiVwIiwgc2spOworCisJcnhycGNfcHVyZ2VfcXVldWUoJnNrLT5za19yZWNlaXZlX3F1ZXVlKTsKKworCUJVR19UUkFQKCFhdG9taWNfcmVhZCgmc2stPnNrX3dtZW1fYWxsb2MpKTsKKwlCVUdfVFJBUChza191bmhhc2hlZChzaykpOworCUJVR19UUkFQKCFzay0+c2tfc29ja2V0KTsKKworCWlmICghc29ja19mbGFnKHNrLCBTT0NLX0RFQUQpKSB7CisJCXByaW50aygiQXR0ZW1wdCB0byByZWxlYXNlIGFsaXZlIHJ4cnBjIHNvY2tldDogJXBcbiIsIHNrKTsKKwkJcmV0dXJuOworCX0KK30KKworLyoKKyAqIHJlbGVhc2UgYW4gUnhSUEMgc29ja2V0CisgKi8KK3N0YXRpYyBpbnQgcnhycGNfcmVsZWFzZV9zb2NrKHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3QgcnhycGNfc29jayAqcnggPSByeHJwY19zayhzayk7CisKKwlfZW50ZXIoIiVweyVkLCVkfSIsIHNrLCBzay0+c2tfc3RhdGUsIGF0b21pY19yZWFkKCZzay0+c2tfcmVmY250KSk7CisKKwkvKiBkZWNsYXJlIHRoZSBzb2NrZXQgY2xvc2VkIGZvciBidXNpbmVzcyAqLworCXNvY2tfb3JwaGFuKHNrKTsKKwlzay0+c2tfc2h1dGRvd24gPSBTSFVURE9XTl9NQVNLOworCisJc3Bpbl9sb2NrX2JoKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZS5sb2NrKTsKKwlzay0+c2tfc3RhdGUgPSBSWFJQQ19DTE9TRTsKKwlzcGluX3VubG9ja19iaCgmc2stPnNrX3JlY2VpdmVfcXVldWUubG9jayk7CisKKwlBU1NFUlRDTVAocngtPmxpc3Rlbl9saW5rLm5leHQsICE9LCBMSVNUX1BPSVNPTjEpOworCisJaWYgKCFsaXN0X2VtcHR5KCZyeC0+bGlzdGVuX2xpbmspKSB7CisJCXdyaXRlX2xvY2tfYmgoJnJ4LT5sb2NhbC0+c2VydmljZXNfbG9jayk7CisJCWxpc3RfZGVsKCZyeC0+bGlzdGVuX2xpbmspOworCQl3cml0ZV91bmxvY2tfYmgoJnJ4LT5sb2NhbC0+c2VydmljZXNfbG9jayk7CisJfQorCisJLyogdHJ5IHRvIGZsdXNoIG91dCB0aGlzIHNvY2tldCAqLworCXJ4cnBjX3JlbGVhc2VfY2FsbHNfb25fc29ja2V0KHJ4KTsKKwlmbHVzaF93b3JrcXVldWUocnhycGNfd29ya3F1ZXVlKTsKKwlyeHJwY19wdXJnZV9xdWV1ZSgmc2stPnNrX3JlY2VpdmVfcXVldWUpOworCisJaWYgKHJ4LT5jb25uKSB7CisJCXJ4cnBjX3B1dF9jb25uZWN0aW9uKHJ4LT5jb25uKTsKKwkJcngtPmNvbm4gPSBOVUxMOworCX0KKworCWlmIChyeC0+YnVuZGxlKSB7CisJCXJ4cnBjX3B1dF9idW5kbGUocngtPnRyYW5zLCByeC0+YnVuZGxlKTsKKwkJcngtPmJ1bmRsZSA9IE5VTEw7CisJfQorCWlmIChyeC0+dHJhbnMpIHsKKwkJcnhycGNfcHV0X3RyYW5zcG9ydChyeC0+dHJhbnMpOworCQlyeC0+dHJhbnMgPSBOVUxMOworCX0KKwlpZiAocngtPmxvY2FsKSB7CisJCXJ4cnBjX3B1dF9sb2NhbChyeC0+bG9jYWwpOworCQlyeC0+bG9jYWwgPSBOVUxMOworCX0KKworCWtleV9wdXQocngtPmtleSk7CisJcngtPmtleSA9IE5VTEw7CisJa2V5X3B1dChyeC0+c2VjdXJpdGllcyk7CisJcngtPnNlY3VyaXRpZXMgPSBOVUxMOworCXNvY2tfcHV0KHNrKTsKKworCV9sZWF2ZSgiID0gMCIpOworCXJldHVybiAwOworfQorCisvKgorICogcmVsZWFzZSBhbiBSeFJQQyBCU0Qgc29ja2V0IG9uIGNsb3NlKCkgb3IgZXF1aXZhbGVudAorICovCitzdGF0aWMgaW50IHJ4cnBjX3JlbGVhc2Uoc3RydWN0IHNvY2tldCAqc29jaykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKworCV9lbnRlcigiJXB7JXB9Iiwgc29jaywgc2spOworCisJaWYgKCFzaykKKwkJcmV0dXJuIDA7CisKKwlzb2NrLT5zayA9IE5VTEw7CisKKwlyZXR1cm4gcnhycGNfcmVsZWFzZV9zb2NrKHNrKTsKK30KKworLyoKKyAqIFJ4UlBDIG5ldHdvcmsgcHJvdG9jb2wKKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBwcm90b19vcHMgcnhycGNfcnBjX29wcyA9IHsKKwkuZmFtaWx5CQk9IFBGX1VOSVgsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5yZWxlYXNlCT0gcnhycGNfcmVsZWFzZSwKKwkuYmluZAkJPSByeHJwY19iaW5kLAorCS5jb25uZWN0CT0gcnhycGNfY29ubmVjdCwKKwkuc29ja2V0cGFpcgk9IHNvY2tfbm9fc29ja2V0cGFpciwKKwkuYWNjZXB0CQk9IHNvY2tfbm9fYWNjZXB0LAorCS5nZXRuYW1lCT0gc29ja19ub19nZXRuYW1lLAorCS5wb2xsCQk9IHJ4cnBjX3BvbGwsCisJLmlvY3RsCQk9IHNvY2tfbm9faW9jdGwsCisJLmxpc3RlbgkJPSByeHJwY19saXN0ZW4sCisJLnNodXRkb3duCT0gc29ja19ub19zaHV0ZG93biwKKwkuc2V0c29ja29wdAk9IHJ4cnBjX3NldHNvY2tvcHQsCisJLmdldHNvY2tvcHQJPSBzb2NrX25vX2dldHNvY2tvcHQsCisJLnNlbmRtc2cJPSByeHJwY19zZW5kbXNnLAorCS5yZWN2bXNnCT0gcnhycGNfcmVjdm1zZywKKwkubW1hcAkJPSBzb2NrX25vX21tYXAsCisJLnNlbmRwYWdlCT0gc29ja19ub19zZW5kcGFnZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcHJvdG8gcnhycGNfcHJvdG8gPSB7CisJLm5hbWUJCT0gIlJYUlBDIiwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm9ial9zaXplCT0gc2l6ZW9mKHN0cnVjdCByeHJwY19zb2NrKSwKKwkubWF4X2hlYWRlcgk9IHNpemVvZihzdHJ1Y3QgcnhycGNfaGVhZGVyKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X3Byb3RvX2ZhbWlseSByeHJwY19mYW1pbHlfb3BzID0geworCS5mYW1pbHkJPSBQRl9SWFJQQywKKwkuY3JlYXRlID0gcnhycGNfY3JlYXRlLAorCS5vd25lcgk9IFRISVNfTU9EVUxFLAorfTsKKworLyoKKyAqIGluaXRpYWxpc2UgYW5kIHJlZ2lzdGVyIHRoZSBSeFJQQyBwcm90b2NvbAorICovCitzdGF0aWMgaW50IF9faW5pdCBhZl9yeHJwY19pbml0KHZvaWQpCit7CisJc3RydWN0IHNrX2J1ZmYgKmR1bW15X3NrYjsKKwlpbnQgcmV0ID0gLTE7CisKKwlCVUlMRF9CVUdfT04oc2l6ZW9mKHN0cnVjdCByeHJwY19za2JfcHJpdikgPiBzaXplb2YoZHVtbXlfc2tiLT5jYikpOworCisJcnhycGNfZXBvY2ggPSBodG9ubCh4dGltZS50dl9zZWMpOworCisJcmV0ID0gLUVOT01FTTsKKwlyeHJwY19jYWxsX2phciA9IGttZW1fY2FjaGVfY3JlYXRlKAorCQkicnhycGNfY2FsbF9qYXIiLCBzaXplb2Yoc3RydWN0IHJ4cnBjX2NhbGwpLCAwLAorCQlTTEFCX0hXQ0FDSEVfQUxJR04sIE5VTEwsIE5VTEwpOworCWlmICghcnhycGNfY2FsbF9qYXIpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJSeFJQQzogRmFpbGVkIHRvIGFsbG9jYXRlIGNhbGwgamFyXG4iKTsKKwkJZ290byBlcnJvcl9jYWxsX2phcjsKKwl9CisKKwlyeHJwY193b3JrcXVldWUgPSBjcmVhdGVfd29ya3F1ZXVlKCJrcnhycGNkIik7CisJaWYgKCFyeHJwY193b3JrcXVldWUpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJSeFJQQzogRmFpbGVkIHRvIGFsbG9jYXRlIHdvcmsgcXVldWVcbiIpOworCQlnb3RvIGVycm9yX3dvcmtfcXVldWU7CisJfQorCisJcmV0ID0gcHJvdG9fcmVnaXN0ZXIoJnJ4cnBjX3Byb3RvLCAxKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9DUklUICJSeFJQQzogQ2Fubm90IHJlZ2lzdGVyIHByb3RvY29sXG4iKTsKKwkJZ290byBlcnJvcl9wcm90bzsKKwl9CisKKwlyZXQgPSBzb2NrX3JlZ2lzdGVyKCZyeHJwY19mYW1pbHlfb3BzKTsKKwlpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0NSSVQgIlJ4UlBDOiBDYW5ub3QgcmVnaXN0ZXIgc29ja2V0IGZhbWlseVxuIik7CisJCWdvdG8gZXJyb3Jfc29jazsKKwl9CisKKwlyZXQgPSByZWdpc3Rlcl9rZXlfdHlwZSgma2V5X3R5cGVfcnhycGMpOworCWlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fQ1JJVCAiUnhSUEM6IENhbm5vdCByZWdpc3RlciBjbGllbnQga2V5IHR5cGVcbiIpOworCQlnb3RvIGVycm9yX2tleV90eXBlOworCX0KKworCXJldCA9IHJlZ2lzdGVyX2tleV90eXBlKCZrZXlfdHlwZV9yeHJwY19zKTsKKwlpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0NSSVQgIlJ4UlBDOiBDYW5ub3QgcmVnaXN0ZXIgc2VydmVyIGtleSB0eXBlXG4iKTsKKwkJZ290byBlcnJvcl9rZXlfdHlwZV9zOworCX0KKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisJcHJvY19uZXRfZm9wc19jcmVhdGUoInJ4cnBjX2NhbGxzIiwgMCwgJnJ4cnBjX2NhbGxfc2VxX2ZvcHMpOworCXByb2NfbmV0X2ZvcHNfY3JlYXRlKCJyeHJwY19jb25ucyIsIDAsICZyeHJwY19jb25uZWN0aW9uX3NlcV9mb3BzKTsKKyNlbmRpZgorCXJldHVybiAwOworCitlcnJvcl9rZXlfdHlwZV9zOgorCXVucmVnaXN0ZXJfa2V5X3R5cGUoJmtleV90eXBlX3J4cnBjKTsKK2Vycm9yX2tleV90eXBlOgorCXNvY2tfdW5yZWdpc3RlcihQRl9SWFJQQyk7CitlcnJvcl9zb2NrOgorCXByb3RvX3VucmVnaXN0ZXIoJnJ4cnBjX3Byb3RvKTsKK2Vycm9yX3Byb3RvOgorCWRlc3Ryb3lfd29ya3F1ZXVlKHJ4cnBjX3dvcmtxdWV1ZSk7CitlcnJvcl93b3JrX3F1ZXVlOgorCWttZW1fY2FjaGVfZGVzdHJveShyeHJwY19jYWxsX2phcik7CitlcnJvcl9jYWxsX2phcjoKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogdW5yZWdpc3RlciB0aGUgUnhSUEMgcHJvdG9jb2wKKyAqLworc3RhdGljIHZvaWQgX19leGl0IGFmX3J4cnBjX2V4aXQodm9pZCkKK3sKKwlfZW50ZXIoIiIpOworCXVucmVnaXN0ZXJfa2V5X3R5cGUoJmtleV90eXBlX3J4cnBjX3MpOworCXVucmVnaXN0ZXJfa2V5X3R5cGUoJmtleV90eXBlX3J4cnBjKTsKKwlzb2NrX3VucmVnaXN0ZXIoUEZfUlhSUEMpOworCXByb3RvX3VucmVnaXN0ZXIoJnJ4cnBjX3Byb3RvKTsKKwlyeHJwY19kZXN0cm95X2FsbF9jYWxscygpOworCXJ4cnBjX2Rlc3Ryb3lfYWxsX2Nvbm5lY3Rpb25zKCk7CisJcnhycGNfZGVzdHJveV9hbGxfdHJhbnNwb3J0cygpOworCXJ4cnBjX2Rlc3Ryb3lfYWxsX3BlZXJzKCk7CisJcnhycGNfZGVzdHJveV9hbGxfbG9jYWxzKCk7CisKKwlBU1NFUlRDTVAoYXRvbWljX3JlYWQoJnJ4cnBjX25fc2ticyksID09LCAwKTsKKworCV9kZWJ1ZygiZmx1c2ggc2NoZWR1bGVkIHdvcmsiKTsKKwlmbHVzaF93b3JrcXVldWUocnhycGNfd29ya3F1ZXVlKTsKKwlwcm9jX25ldF9yZW1vdmUoInJ4cnBjX2Nvbm5zIik7CisJcHJvY19uZXRfcmVtb3ZlKCJyeHJwY19jYWxscyIpOworCWRlc3Ryb3lfd29ya3F1ZXVlKHJ4cnBjX3dvcmtxdWV1ZSk7CisJa21lbV9jYWNoZV9kZXN0cm95KHJ4cnBjX2NhbGxfamFyKTsKKwlfbGVhdmUoIiIpOworfQorCittb2R1bGVfaW5pdChhZl9yeHJwY19pbml0KTsKK21vZHVsZV9leGl0KGFmX3J4cnBjX2V4aXQpOwpkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL2FyLWFjY2VwdC5jIGIvbmV0L3J4cnBjL2FyLWFjY2VwdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYTg3ZmQKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvcnhycGMvYXItYWNjZXB0LmMKQEAgLTAsMCArMSw1MDQgQEAKKy8qIGluY29taW5nIGNhbGwgaGFuZGxpbmcKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2VycnF1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvdWRwLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pbjYuaD4KKyNpbmNsdWRlIDxsaW51eC9pY21wLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxuZXQvYWZfcnhycGMuaD4KKyNpbmNsdWRlIDxuZXQvaXAuaD4KKyNpbmNsdWRlICJhci1pbnRlcm5hbC5oIgorCisvKgorICogZ2VuZXJhdGUgYSBjb25uZWN0aW9uLWxldmVsIGFib3J0CisgKi8KK3N0YXRpYyBpbnQgcnhycGNfYnVzeShzdHJ1Y3QgcnhycGNfbG9jYWwgKmxvY2FsLCBzdHJ1Y3Qgc29ja2FkZHJfcnhycGMgKnNyeCwKKwkJICAgICAgc3RydWN0IHJ4cnBjX2hlYWRlciAqaGRyKQoreworCXN0cnVjdCBtc2doZHIgbXNnOworCXN0cnVjdCBrdmVjIGlvdlsxXTsKKwlzaXplX3QgbGVuOworCWludCByZXQ7CisKKwlfZW50ZXIoIiVkLCwiLCBsb2NhbC0+ZGVidWdfaWQpOworCisJbXNnLm1zZ19uYW1lCT0gJnNyeC0+dHJhbnNwb3J0LnNpbjsKKwltc2cubXNnX25hbWVsZW4JPSBzaXplb2Yoc3J4LT50cmFuc3BvcnQuc2luKTsKKwltc2cubXNnX2NvbnRyb2wJPSBOVUxMOworCW1zZy5tc2dfY29udHJvbGxlbiA9IDA7CisJbXNnLm1zZ19mbGFncwk9IDA7CisKKwloZHItPnNlcQk9IDA7CisJaGRyLT50eXBlCT0gUlhSUENfUEFDS0VUX1RZUEVfQlVTWTsKKwloZHItPmZsYWdzCT0gMDsKKwloZHItPnVzZXJTdGF0dXMJPSAwOworCWhkci0+X3JzdmQJPSAwOworCisJaW92WzBdLmlvdl9iYXNlCT0gaGRyOworCWlvdlswXS5pb3ZfbGVuCT0gc2l6ZW9mKCpoZHIpOworCisJbGVuID0gaW92WzBdLmlvdl9sZW47CisKKwloZHItPnNlcmlhbCA9IGh0b25sKDEpOworCV9wcm90bygiVHggQlVTWSAlJSV1IiwgbnRvaGwoaGRyLT5zZXJpYWwpKTsKKworCXJldCA9IGtlcm5lbF9zZW5kbXNnKGxvY2FsLT5zb2NrZXQsICZtc2csIGlvdiwgMSwgbGVuKTsKKwlpZiAocmV0IDwgMCkgeworCQlfbGVhdmUoIiA9IC1FQUdBSU4gW3NlbmRtc2cgZmFpbGVkOiAlZF0iLCByZXQpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKwlfbGVhdmUoIiA9IDAiKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGFjY2VwdCBhbiBpbmNvbWluZyBjYWxsIHRoYXQgbmVlZHMgcGVlciwgdHJhbnNwb3J0IGFuZC9vciBjb25uZWN0aW9uIHNldHRpbmcKKyAqIHVwCisgKi8KK3N0YXRpYyBpbnQgcnhycGNfYWNjZXB0X2luY29taW5nX2NhbGwoc3RydWN0IHJ4cnBjX2xvY2FsICpsb2NhbCwKKwkJCQkgICAgICBzdHJ1Y3QgcnhycGNfc29jayAqcngsCisJCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgICAgICBzdHJ1Y3Qgc29ja2FkZHJfcnhycGMgKnNyeCkKK3sKKwlzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubjsKKwlzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICp0cmFuczsKKwlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwLCAqbnNwOworCXN0cnVjdCByeHJwY19wZWVyICpwZWVyOworCXN0cnVjdCByeHJwY19jYWxsICpjYWxsOworCXN0cnVjdCBza19idWZmICpub3RpZmljYXRpb247CisJaW50IHJldDsKKworCV9lbnRlcigiIik7CisKKwlzcCA9IHJ4cnBjX3NrYihza2IpOworCisJLyogZ2V0IGEgbm90aWZpY2F0aW9uIG1lc3NhZ2UgdG8gc2VuZCB0byB0aGUgc2VydmVyIGFwcCAqLworCW5vdGlmaWNhdGlvbiA9IGFsbG9jX3NrYigwLCBHRlBfTk9GUyk7CisJcnhycGNfbmV3X3NrYihub3RpZmljYXRpb24pOworCW5vdGlmaWNhdGlvbi0+bWFyayA9IFJYUlBDX1NLQl9NQVJLX05FV19DQUxMOworCisJcGVlciA9IHJ4cnBjX2dldF9wZWVyKHNyeCwgR0ZQX05PSU8pOworCWlmIChJU19FUlIocGVlcikpIHsKKwkJX2RlYnVnKCJubyBwZWVyIik7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwl0cmFucyA9IHJ4cnBjX2dldF90cmFuc3BvcnQobG9jYWwsIHBlZXIsIEdGUF9OT0lPKTsKKwlyeHJwY19wdXRfcGVlcihwZWVyKTsKKwlpZiAoIXRyYW5zKSB7CisJCV9kZWJ1Zygibm8gdHJhbnMiKTsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIGVycm9yOworCX0KKworCWNvbm4gPSByeHJwY19pbmNvbWluZ19jb25uZWN0aW9uKHRyYW5zLCAmc3AtPmhkciwgR0ZQX05PSU8pOworCXJ4cnBjX3B1dF90cmFuc3BvcnQodHJhbnMpOworCWlmIChJU19FUlIoY29ubikpIHsKKwkJX2RlYnVnKCJubyBjb25uIik7CisJCXJldCA9IFBUUl9FUlIoY29ubik7CisJCWdvdG8gZXJyb3I7CisJfQorCisJY2FsbCA9IHJ4cnBjX2luY29taW5nX2NhbGwocngsIGNvbm4sICZzcC0+aGRyLCBHRlBfTk9JTyk7CisJcnhycGNfcHV0X2Nvbm5lY3Rpb24oY29ubik7CisJaWYgKElTX0VSUihjYWxsKSkgeworCQlfZGVidWcoIm5vIGNhbGwiKTsKKwkJcmV0ID0gUFRSX0VSUihjYWxsKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwkvKiBhdHRhY2ggdGhlIGNhbGwgdG8gdGhlIHNvY2tldCAqLworCXJlYWRfbG9ja19iaCgmbG9jYWwtPnNlcnZpY2VzX2xvY2spOworCWlmIChyeC0+c2suc2tfc3RhdGUgPT0gUlhSUENfQ0xPU0UpCisJCWdvdG8gaW52YWxpZF9zZXJ2aWNlOworCisJd3JpdGVfbG9jaygmcngtPmNhbGxfbG9jayk7CisJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KFJYUlBDX0NBTExfSU5JVF9BQ0NFUFQsICZjYWxsLT5mbGFncykpIHsKKwkJcnhycGNfZ2V0X2NhbGwoY2FsbCk7CisKKwkJc3Bpbl9sb2NrKCZjYWxsLT5jb25uLT5zdGF0ZV9sb2NrKTsKKwkJaWYgKHNwLT5oZHIuc2VjdXJpdHlJbmRleCA+IDAgJiYKKwkJICAgIGNhbGwtPmNvbm4tPnN0YXRlID09IFJYUlBDX0NPTk5fU0VSVkVSX1VOU0VDVVJFRCkgeworCQkJX2RlYnVnKCJhd2FpdCBjb25uIHNlYyIpOworCQkJbGlzdF9hZGRfdGFpbCgmY2FsbC0+YWNjZXB0X2xpbmssICZyeC0+c2VjdXJlcSk7CisJCQljYWxsLT5jb25uLT5zdGF0ZSA9IFJYUlBDX0NPTk5fU0VSVkVSX0NIQUxMRU5HSU5HOworCQkJYXRvbWljX2luYygmY2FsbC0+Y29ubi0+dXNhZ2UpOworCQkJc2V0X2JpdChSWFJQQ19DT05OX0NIQUxMRU5HRSwgJmNhbGwtPmNvbm4tPmV2ZW50cyk7CisJCQlyeHJwY19xdWV1ZV9jb25uKGNhbGwtPmNvbm4pOworCQl9IGVsc2UgeworCQkJX2RlYnVnKCJjb25uIHJlYWR5Iik7CisJCQljYWxsLT5zdGF0ZSA9IFJYUlBDX0NBTExfU0VSVkVSX0FDQ0VQVElORzsKKwkJCWxpc3RfYWRkX3RhaWwoJmNhbGwtPmFjY2VwdF9saW5rLCAmcngtPmFjY2VwdHEpOworCQkJcnhycGNfZ2V0X2NhbGwoY2FsbCk7CisJCQluc3AgPSByeHJwY19za2Iobm90aWZpY2F0aW9uKTsKKwkJCW5zcC0+Y2FsbCA9IGNhbGw7CisKKwkJCUFTU0VSVENNUChhdG9taWNfcmVhZCgmY2FsbC0+dXNhZ2UpLCA+PSwgMyk7CisKKwkJCV9kZWJ1Zygibm90aWZ5Iik7CisJCQlzcGluX2xvY2soJmNhbGwtPmxvY2spOworCQkJcmV0ID0gcnhycGNfcXVldWVfcmN2X3NrYihjYWxsLCBub3RpZmljYXRpb24sIHRydWUsCisJCQkJCQkgIGZhbHNlKTsKKwkJCXNwaW5fdW5sb2NrKCZjYWxsLT5sb2NrKTsKKwkJCW5vdGlmaWNhdGlvbiA9IE5VTEw7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlCVUcoKTsKKwkJfQorCQlzcGluX3VubG9jaygmY2FsbC0+Y29ubi0+c3RhdGVfbG9jayk7CisKKwkJX2RlYnVnKCJxdWV1ZWQiKTsKKwl9CisJd3JpdGVfdW5sb2NrKCZyeC0+Y2FsbF9sb2NrKTsKKworCV9kZWJ1ZygicHJvY2VzcyIpOworCXJ4cnBjX2Zhc3RfcHJvY2Vzc19wYWNrZXQoY2FsbCwgc2tiKTsKKworCV9kZWJ1ZygiZG9uZSIpOworCXJlYWRfdW5sb2NrX2JoKCZsb2NhbC0+c2VydmljZXNfbG9jayk7CisJcnhycGNfZnJlZV9za2Iobm90aWZpY2F0aW9uKTsKKwlyeHJwY19wdXRfY2FsbChjYWxsKTsKKwlfbGVhdmUoIiA9IDAiKTsKKwlyZXR1cm4gMDsKKworaW52YWxpZF9zZXJ2aWNlOgorCV9kZWJ1ZygiaW52YWxpZCIpOworCXJlYWRfdW5sb2NrX2JoKCZsb2NhbC0+c2VydmljZXNfbG9jayk7CisKKwlyZWFkX2xvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOworCWlmICghdGVzdF9iaXQoUlhSUENfQ0FMTF9SRUxFQVNFLCAmY2FsbC0+ZmxhZ3MpICYmCisJICAgICF0ZXN0X2FuZF9zZXRfYml0KFJYUlBDX0NBTExfUkVMRUFTRSwgJmNhbGwtPmV2ZW50cykpIHsKKwkJcnhycGNfZ2V0X2NhbGwoY2FsbCk7CisJCXJ4cnBjX3F1ZXVlX2NhbGwoY2FsbCk7CisJfQorCXJlYWRfdW5sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKKwlyeHJwY19wdXRfY2FsbChjYWxsKTsKKwlyZXQgPSAtRUNPTk5SRUZVU0VEOworZXJyb3I6CisJcnhycGNfZnJlZV9za2Iobm90aWZpY2F0aW9uKTsKKwlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogYWNjZXB0IGluY29taW5nIGNhbGxzIHRoYXQgbmVlZCBwZWVyLCB0cmFuc3BvcnQgYW5kL29yIGNvbm5lY3Rpb24gc2V0dGluZyB1cAorICogLSB0aGUgcGFja2V0cyB3ZSBnZXQgYXJlIGFsbCBpbmNvbWluZyBjbGllbnQgREFUQSBwYWNrZXRzIHRoYXQgaGF2ZSBzZXEgPT0gMQorICovCit2b2lkIHJ4cnBjX2FjY2VwdF9pbmNvbWluZ19jYWxscyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHJ4cnBjX2xvY2FsICpsb2NhbCA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcnhycGNfbG9jYWwsIGFjY2VwdG9yKTsKKwlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwOworCXN0cnVjdCBzb2NrYWRkcl9yeHJwYyBzcng7CisJc3RydWN0IHJ4cnBjX3NvY2sgKnJ4OworCXN0cnVjdCBza19idWZmICpza2I7CisJX19iZTE2IHNlcnZpY2VfaWQ7CisJaW50IHJldDsKKworCV9lbnRlcigiJWQiLCBsb2NhbC0+ZGVidWdfaWQpOworCisJcmVhZF9sb2NrX2JoKCZyeHJwY19sb2NhbF9sb2NrKTsKKwlpZiAoYXRvbWljX3JlYWQoJmxvY2FsLT51c2FnZSkgPiAwKQorCQlyeHJwY19nZXRfbG9jYWwobG9jYWwpOworCWVsc2UKKwkJbG9jYWwgPSBOVUxMOworCXJlYWRfdW5sb2NrX2JoKCZyeHJwY19sb2NhbF9sb2NrKTsKKwlpZiAoIWxvY2FsKSB7CisJCV9sZWF2ZSgiIFtsb2NhbCBkZWFkXSIpOworCQlyZXR1cm47CisJfQorCitwcm9jZXNzX25leHRfcGFja2V0OgorCXNrYiA9IHNrYl9kZXF1ZXVlKCZsb2NhbC0+YWNjZXB0X3F1ZXVlKTsKKwlpZiAoIXNrYikgeworCQlyeHJwY19wdXRfbG9jYWwobG9jYWwpOworCQlfbGVhdmUoIlxuIik7CisJCXJldHVybjsKKwl9CisKKwlfbmV0KCJpbmNvbWluZyBjYWxsIHNrYiAlcCIsIHNrYik7CisKKwlzcCA9IHJ4cnBjX3NrYihza2IpOworCisJLyogZGV0ZXJtaW5lIHRoZSByZW1vdGUgYWRkcmVzcyAqLworCW1lbXNldCgmc3J4LCAwLCBzaXplb2Yoc3J4KSk7CisJc3J4LnNyeF9mYW1pbHkgPSBBRl9SWFJQQzsKKwlzcngudHJhbnNwb3J0LmZhbWlseSA9IGxvY2FsLT5zcngudHJhbnNwb3J0LmZhbWlseTsKKwlzcngudHJhbnNwb3J0X3R5cGUgPSBsb2NhbC0+c3J4LnRyYW5zcG9ydF90eXBlOworCXN3aXRjaCAoc3J4LnRyYW5zcG9ydC5mYW1pbHkpIHsKKwljYXNlIEFGX0lORVQ6CisJCXNyeC50cmFuc3BvcnRfbGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbik7CisJCXNyeC50cmFuc3BvcnQuc2luLnNpbl9wb3J0ID0gdWRwX2hkcihza2IpLT5zb3VyY2U7CisJCXNyeC50cmFuc3BvcnQuc2luLnNpbl9hZGRyLnNfYWRkciA9IGlwX2hkcihza2IpLT5zYWRkcjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZ290byBidXN5OworCX0KKworCS8qIGdldCB0aGUgc29ja2V0IHByb3ZpZGluZyB0aGUgc2VydmljZSAqLworCXNlcnZpY2VfaWQgPSBzcC0+aGRyLnNlcnZpY2VJZDsKKwlyZWFkX2xvY2tfYmgoJmxvY2FsLT5zZXJ2aWNlc19sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJ4LCAmbG9jYWwtPnNlcnZpY2VzLCBsaXN0ZW5fbGluaykgeworCQlpZiAocngtPnNlcnZpY2VfaWQgPT0gc2VydmljZV9pZCAmJgorCQkgICAgcngtPnNrLnNrX3N0YXRlICE9IFJYUlBDX0NMT1NFKQorCQkJZ290byBmb3VuZF9zZXJ2aWNlOworCX0KKwlyZWFkX3VubG9ja19iaCgmbG9jYWwtPnNlcnZpY2VzX2xvY2spOworCWdvdG8gaW52YWxpZF9zZXJ2aWNlOworCitmb3VuZF9zZXJ2aWNlOgorCV9kZWJ1ZygiZm91bmQgc2VydmljZSAlaGQiLCBudG9ocyhyeC0+c2VydmljZV9pZCkpOworCWlmIChza19hY2NlcHRxX2lzX2Z1bGwoJnJ4LT5zaykpCisJCWdvdG8gYmFja2xvZ19mdWxsOworCXNrX2FjY2VwdHFfYWRkZWQoJnJ4LT5zayk7CisJc29ja19ob2xkKCZyeC0+c2spOworCXJlYWRfdW5sb2NrX2JoKCZsb2NhbC0+c2VydmljZXNfbG9jayk7CisKKwlyZXQgPSByeHJwY19hY2NlcHRfaW5jb21pbmdfY2FsbChsb2NhbCwgcngsIHNrYiwgJnNyeCk7CisJaWYgKHJldCA8IDApCisJCXNrX2FjY2VwdHFfcmVtb3ZlZCgmcngtPnNrKTsKKwlzb2NrX3B1dCgmcngtPnNrKTsKKwlzd2l0Y2ggKHJldCkgeworCWNhc2UgLUVDT05OUkVTRVQ6IC8qIG9sZCBjYWxscyBhcmUgaWdub3JlZCAqLworCWNhc2UgLUVDT05OQUJPUlRFRDogLyogYWJvcnRlZCBjYWxscyBhcmUgcmVhYm9ydGVkIG9yIGlnbm9yZWQgKi8KKwljYXNlIDA6CisJCWdvdG8gcHJvY2Vzc19uZXh0X3BhY2tldDsKKwljYXNlIC1FQ09OTlJFRlVTRUQ6CisJCWdvdG8gaW52YWxpZF9zZXJ2aWNlOworCWNhc2UgLUVCVVNZOgorCQlnb3RvIGJ1c3k7CisJY2FzZSAtRUtFWVJFSkVDVEVEOgorCQlnb3RvIHNlY3VyaXR5X21pc21hdGNoOworCWRlZmF1bHQ6CisJCUJVRygpOworCX0KKworYmFja2xvZ19mdWxsOgorCXJlYWRfdW5sb2NrX2JoKCZsb2NhbC0+c2VydmljZXNfbG9jayk7CitidXN5OgorCXJ4cnBjX2J1c3kobG9jYWwsICZzcngsICZzcC0+aGRyKTsKKwlyeHJwY19mcmVlX3NrYihza2IpOworCWdvdG8gcHJvY2Vzc19uZXh0X3BhY2tldDsKKworaW52YWxpZF9zZXJ2aWNlOgorCXNrYi0+cHJpb3JpdHkgPSBSWF9JTlZBTElEX09QRVJBVElPTjsKKwlyeHJwY19yZWplY3RfcGFja2V0KGxvY2FsLCBza2IpOworCWdvdG8gcHJvY2Vzc19uZXh0X3BhY2tldDsKKworCS8qIGNhbid0IGNoYW5nZSBjb25uZWN0aW9uIHNlY3VyaXR5IHR5cGUgbWlkLWZsb3cgKi8KK3NlY3VyaXR5X21pc21hdGNoOgorCXNrYi0+cHJpb3JpdHkgPSBSWF9QUk9UT0NPTF9FUlJPUjsKKwlyeHJwY19yZWplY3RfcGFja2V0KGxvY2FsLCBza2IpOworCWdvdG8gcHJvY2Vzc19uZXh0X3BhY2tldDsKK30KKworLyoKKyAqIGhhbmRsZSBhY2NlcHRhbmNlIG9mIGEgY2FsbCBieSB1c2Vyc3BhY2UKKyAqIC0gYXNzaWduIHRoZSB1c2VyIGNhbGwgSUQgdG8gdGhlIGNhbGwgYXQgdGhlIGZyb250IG9mIHRoZSBxdWV1ZQorICovCitzdHJ1Y3QgcnhycGNfY2FsbCAqcnhycGNfYWNjZXB0X2NhbGwoc3RydWN0IHJ4cnBjX3NvY2sgKnJ4LAorCQkJCSAgICAgdW5zaWduZWQgbG9uZyB1c2VyX2NhbGxfSUQpCit7CisJc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGw7CisJc3RydWN0IHJiX25vZGUgKnBhcmVudCwgKipwcDsKKwlpbnQgcmV0OworCisJX2VudGVyKCIsJWx4IiwgdXNlcl9jYWxsX0lEKTsKKworCUFTU0VSVCghaXJxc19kaXNhYmxlZCgpKTsKKworCXdyaXRlX2xvY2soJnJ4LT5jYWxsX2xvY2spOworCisJcmV0ID0gLUVOT0RBVEE7CisJaWYgKGxpc3RfZW1wdHkoJnJ4LT5hY2NlcHRxKSkKKwkJZ290byBvdXQ7CisKKwkvKiBjaGVjayB0aGUgdXNlciBJRCBpc24ndCBhbHJlYWR5IGluIHVzZSAqLworCXJldCA9IC1FQkFEU0xUOworCXBwID0gJnJ4LT5jYWxscy5yYl9ub2RlOworCXBhcmVudCA9IE5VTEw7CisJd2hpbGUgKCpwcCkgeworCQlwYXJlbnQgPSAqcHA7CisJCWNhbGwgPSByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCByeHJwY19jYWxsLCBzb2NrX25vZGUpOworCisJCWlmICh1c2VyX2NhbGxfSUQgPCBjYWxsLT51c2VyX2NhbGxfSUQpCisJCQlwcCA9ICYoKnBwKS0+cmJfbGVmdDsKKwkJZWxzZSBpZiAodXNlcl9jYWxsX0lEID4gY2FsbC0+dXNlcl9jYWxsX0lEKQorCQkJcHAgPSAmKCpwcCktPnJiX3JpZ2h0OworCQllbHNlCisJCQlnb3RvIG91dDsKKwl9CisKKwkvKiBkZXF1ZXVlIHRoZSBmaXJzdCBjYWxsIGFuZCBjaGVjayBpdCdzIHN0aWxsIHZhbGlkICovCisJY2FsbCA9IGxpc3RfZW50cnkocngtPmFjY2VwdHEubmV4dCwgc3RydWN0IHJ4cnBjX2NhbGwsIGFjY2VwdF9saW5rKTsKKwlsaXN0X2RlbF9pbml0KCZjYWxsLT5hY2NlcHRfbGluayk7CisJc2tfYWNjZXB0cV9yZW1vdmVkKCZyeC0+c2spOworCisJd3JpdGVfbG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7CisJc3dpdGNoIChjYWxsLT5zdGF0ZSkgeworCWNhc2UgUlhSUENfQ0FMTF9TRVJWRVJfQUNDRVBUSU5HOgorCQljYWxsLT5zdGF0ZSA9IFJYUlBDX0NBTExfU0VSVkVSX1JFQ1ZfUkVRVUVTVDsKKwkJYnJlYWs7CisJY2FzZSBSWFJQQ19DQUxMX1JFTU9URUxZX0FCT1JURUQ6CisJY2FzZSBSWFJQQ19DQUxMX0xPQ0FMTFlfQUJPUlRFRDoKKwkJcmV0ID0gLUVDT05OQUJPUlRFRDsKKwkJZ290byBvdXRfcmVsZWFzZTsKKwljYXNlIFJYUlBDX0NBTExfTkVUV09SS19FUlJPUjoKKwkJcmV0ID0gY2FsbC0+Y29ubi0+ZXJyb3I7CisJCWdvdG8gb3V0X3JlbGVhc2U7CisJY2FzZSBSWFJQQ19DQUxMX0RFQUQ6CisJCXJldCA9IC1FVElNRTsKKwkJZ290byBvdXRfZGlzY2FyZDsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9CisKKwkvKiBmb3JtYWxpc2UgdGhlIGFjY2VwdGFuY2UgKi8KKwljYWxsLT51c2VyX2NhbGxfSUQgPSB1c2VyX2NhbGxfSUQ7CisJcmJfbGlua19ub2RlKCZjYWxsLT5zb2NrX25vZGUsIHBhcmVudCwgcHApOworCXJiX2luc2VydF9jb2xvcigmY2FsbC0+c29ja19ub2RlLCAmcngtPmNhbGxzKTsKKwlpZiAodGVzdF9hbmRfc2V0X2JpdChSWFJQQ19DQUxMX0hBU19VU0VSSUQsICZjYWxsLT5mbGFncykpCisJCUJVRygpOworCWlmICh0ZXN0X2FuZF9zZXRfYml0KFJYUlBDX0NBTExfQUNDRVBURUQsICZjYWxsLT5ldmVudHMpKQorCQlCVUcoKTsKKwlyeHJwY19xdWV1ZV9jYWxsKGNhbGwpOworCisJcnhycGNfZ2V0X2NhbGwoY2FsbCk7CisJd3JpdGVfdW5sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKKwl3cml0ZV91bmxvY2soJnJ4LT5jYWxsX2xvY2spOworCV9sZWF2ZSgiID0gJXB7JWR9IiwgY2FsbCwgY2FsbC0+ZGVidWdfaWQpOworCXJldHVybiBjYWxsOworCisJLyogaWYgdGhlIGNhbGwgaXMgYWxyZWFkeSBkeWluZyBvciBkZWFkLCB0aGVuIHdlIGxlYXZlIHRoZSBzb2NrZXQncyByZWYKKwkgKiBvbiBpdCB0byBiZSByZWxlYXNlZCBieSByeHJwY19kZWFkX2NhbGxfZXhwaXJlZCgpIGFzIGluZHVjZWQgYnkKKwkgKiByeHJwY19yZWxlYXNlX2NhbGwoKSAqLworb3V0X3JlbGVhc2U6CisJX2RlYnVnKCJyZWxlYXNlICVwIiwgY2FsbCk7CisJaWYgKCF0ZXN0X2JpdChSWFJQQ19DQUxMX1JFTEVBU0VELCAmY2FsbC0+ZmxhZ3MpICYmCisJICAgICF0ZXN0X2FuZF9zZXRfYml0KFJYUlBDX0NBTExfUkVMRUFTRSwgJmNhbGwtPmV2ZW50cykpCisJCXJ4cnBjX3F1ZXVlX2NhbGwoY2FsbCk7CitvdXRfZGlzY2FyZDoKKwl3cml0ZV91bmxvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOworCV9kZWJ1ZygiZGlzY2FyZCAlcCIsIGNhbGwpOworb3V0OgorCXdyaXRlX3VubG9jaygmcngtPmNhbGxfbG9jayk7CisJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJcmV0dXJuIEVSUl9QVFIocmV0KTsKK30KKworLyoKKyAqIGhhbmRsZSByZWplY3RhbmNlIG9mIGEgY2FsbCBieSB1c2Vyc3BhY2UKKyAqIC0gcmVqZWN0IHRoZSBjYWxsIGF0IHRoZSBmcm9udCBvZiB0aGUgcXVldWUKKyAqLworaW50IHJ4cnBjX3JlamVjdF9jYWxsKHN0cnVjdCByeHJwY19zb2NrICpyeCkKK3sKKwlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbDsKKwlpbnQgcmV0OworCisJX2VudGVyKCIiKTsKKworCUFTU0VSVCghaXJxc19kaXNhYmxlZCgpKTsKKworCXdyaXRlX2xvY2soJnJ4LT5jYWxsX2xvY2spOworCisJcmV0ID0gLUVOT0RBVEE7CisJaWYgKGxpc3RfZW1wdHkoJnJ4LT5hY2NlcHRxKSkKKwkJZ290byBvdXQ7CisKKwkvKiBkZXF1ZXVlIHRoZSBmaXJzdCBjYWxsIGFuZCBjaGVjayBpdCdzIHN0aWxsIHZhbGlkICovCisJY2FsbCA9IGxpc3RfZW50cnkocngtPmFjY2VwdHEubmV4dCwgc3RydWN0IHJ4cnBjX2NhbGwsIGFjY2VwdF9saW5rKTsKKwlsaXN0X2RlbF9pbml0KCZjYWxsLT5hY2NlcHRfbGluayk7CisJc2tfYWNjZXB0cV9yZW1vdmVkKCZyeC0+c2spOworCisJd3JpdGVfbG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7CisJc3dpdGNoIChjYWxsLT5zdGF0ZSkgeworCWNhc2UgUlhSUENfQ0FMTF9TRVJWRVJfQUNDRVBUSU5HOgorCQljYWxsLT5zdGF0ZSA9IFJYUlBDX0NBTExfU0VSVkVSX0JVU1k7CisJCWlmICh0ZXN0X2FuZF9zZXRfYml0KFJYUlBDX0NBTExfUkVKRUNUX0JVU1ksICZjYWxsLT5ldmVudHMpKQorCQkJcnhycGNfcXVldWVfY2FsbChjYWxsKTsKKwkJcmV0ID0gMDsKKwkJZ290byBvdXRfcmVsZWFzZTsKKwljYXNlIFJYUlBDX0NBTExfUkVNT1RFTFlfQUJPUlRFRDoKKwljYXNlIFJYUlBDX0NBTExfTE9DQUxMWV9BQk9SVEVEOgorCQlyZXQgPSAtRUNPTk5BQk9SVEVEOworCQlnb3RvIG91dF9yZWxlYXNlOworCWNhc2UgUlhSUENfQ0FMTF9ORVRXT1JLX0VSUk9SOgorCQlyZXQgPSBjYWxsLT5jb25uLT5lcnJvcjsKKwkJZ290byBvdXRfcmVsZWFzZTsKKwljYXNlIFJYUlBDX0NBTExfREVBRDoKKwkJcmV0ID0gLUVUSU1FOworCQlnb3RvIG91dF9kaXNjYXJkOworCWRlZmF1bHQ6CisJCUJVRygpOworCX0KKworCS8qIGlmIHRoZSBjYWxsIGlzIGFscmVhZHkgZHlpbmcgb3IgZGVhZCwgdGhlbiB3ZSBsZWF2ZSB0aGUgc29ja2V0J3MgcmVmCisJICogb24gaXQgdG8gYmUgcmVsZWFzZWQgYnkgcnhycGNfZGVhZF9jYWxsX2V4cGlyZWQoKSBhcyBpbmR1Y2VkIGJ5CisJICogcnhycGNfcmVsZWFzZV9jYWxsKCkgKi8KK291dF9yZWxlYXNlOgorCV9kZWJ1ZygicmVsZWFzZSAlcCIsIGNhbGwpOworCWlmICghdGVzdF9iaXQoUlhSUENfQ0FMTF9SRUxFQVNFRCwgJmNhbGwtPmZsYWdzKSAmJgorCSAgICAhdGVzdF9hbmRfc2V0X2JpdChSWFJQQ19DQUxMX1JFTEVBU0UsICZjYWxsLT5ldmVudHMpKQorCQlyeHJwY19xdWV1ZV9jYWxsKGNhbGwpOworb3V0X2Rpc2NhcmQ6CisJd3JpdGVfdW5sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKKwlfZGVidWcoImRpc2NhcmQgJXAiLCBjYWxsKTsKK291dDoKKwl3cml0ZV91bmxvY2soJnJ4LT5jYWxsX2xvY2spOworCV9sZWF2ZSgiID0gJWQiLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogcnhycGNfa2VybmVsX2FjY2VwdF9jYWxsIC0gQWxsb3cgYSBrZXJuZWwgc2VydmljZSB0byBhY2NlcHQgYW4gaW5jb21pbmcgY2FsbAorICogQHNvY2s6IFRoZSBzb2NrZXQgb24gd2hpY2ggdGhlIGltcGVuZGluZyBjYWxsIGlzIHdhaXRpbmcKKyAqIEB1c2VyX2NhbGxfSUQ6IFRoZSB0YWcgdG8gYXR0YWNoIHRvIHRoZSBjYWxsCisgKgorICogQWxsb3cgYSBrZXJuZWwgc2VydmljZSB0byBhY2NlcHQgYW4gaW5jb21pbmcgY2FsbCwgYXNzdW1pbmcgdGhlIGluY29taW5nCisgKiBjYWxsIGlzIHN0aWxsIHZhbGlkLgorICovCitzdHJ1Y3QgcnhycGNfY2FsbCAqcnhycGNfa2VybmVsX2FjY2VwdF9jYWxsKHN0cnVjdCBzb2NrZXQgKnNvY2ssCisJCQkJCSAgICB1bnNpZ25lZCBsb25nIHVzZXJfY2FsbF9JRCkKK3sKKwlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbDsKKworCV9lbnRlcigiLCVseCIsIHVzZXJfY2FsbF9JRCk7CisJY2FsbCA9IHJ4cnBjX2FjY2VwdF9jYWxsKHJ4cnBjX3NrKHNvY2stPnNrKSwgdXNlcl9jYWxsX0lEKTsKKwlfbGVhdmUoIiA9ICVwIiwgY2FsbCk7CisJcmV0dXJuIGNhbGw7Cit9CisKK0VYUE9SVF9TWU1CT0wocnhycGNfa2VybmVsX2FjY2VwdF9jYWxsKTsKKworLyoqCisgKiByeHJwY19rZXJuZWxfcmVqZWN0X2NhbGwgLSBBbGxvdyBhIGtlcm5lbCBzZXJ2aWNlIHRvIHJlamVjdCBhbiBpbmNvbWluZyBjYWxsCisgKiBAc29jazogVGhlIHNvY2tldCBvbiB3aGljaCB0aGUgaW1wZW5kaW5nIGNhbGwgaXMgd2FpdGluZworICoKKyAqIEFsbG93IGEga2VybmVsIHNlcnZpY2UgdG8gcmVqZWN0IGFuIGluY29taW5nIGNhbGwgd2l0aCBhIEJVU1kgbWVzc2FnZSwKKyAqIGFzc3VtaW5nIHRoZSBpbmNvbWluZyBjYWxsIGlzIHN0aWxsIHZhbGlkLgorICovCitpbnQgcnhycGNfa2VybmVsX3JlamVjdF9jYWxsKHN0cnVjdCBzb2NrZXQgKnNvY2spCit7CisJaW50IHJldDsKKworCV9lbnRlcigiIik7CisJcmV0ID0gcnhycGNfcmVqZWN0X2NhbGwocnhycGNfc2soc29jay0+c2spKTsKKwlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCitFWFBPUlRfU1lNQk9MKHJ4cnBjX2tlcm5lbF9yZWplY3RfY2FsbCk7CmRpZmYgLS1naXQgYS9uZXQvcnhycGMvYXItYWNrLmMgYi9uZXQvcnhycGMvYXItYWNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmMwN2E5MgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9yeHJwYy9hci1hY2suYwpAQCAtMCwwICsxLDEyNTAgQEAKKy8qIE1hbmFnZW1lbnQgb2YgVHggd2luZG93LCBUeCByZXNlbmQsIEFDS3MgYW5kIG91dC1vZi1zZXF1ZW5jZSByZWNlcHRpb24KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NpcmNfYnVmLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvdWRwLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxuZXQvYWZfcnhycGMuaD4KKyNpbmNsdWRlICJhci1pbnRlcm5hbC5oIgorCitzdGF0aWMgdW5zaWduZWQgcnhycGNfYWNrX2RlZmVyID0gMTsKKworc3RhdGljIGNvbnN0IGNoYXIgKnJ4cnBjX2Fja3NbXSA9IHsKKwkiLS0tIiwgIlJFUSIsICJEVVAiLCAiT09TIiwgIldJTiIsICJNRU0iLCAiUE5HIiwgIlBOUiIsICJETFkiLCAiSURMIiwKKwkiLT8tIgorfTsKKworc3RhdGljIGNvbnN0IHM4IHJ4cnBjX2Fja19wcmlvcml0eVtdID0geworCVswXQkJCQk9IDAsCisJW1JYUlBDX0FDS19ERUxBWV0JCT0gMSwKKwlbUlhSUENfQUNLX1JFUVVFU1RFRF0JCT0gMiwKKwlbUlhSUENfQUNLX0lETEVdCQk9IDMsCisJW1JYUlBDX0FDS19QSU5HX1JFU1BPTlNFXQk9IDQsCisJW1JYUlBDX0FDS19EVVBMSUNBVEVdCQk9IDUsCisJW1JYUlBDX0FDS19PVVRfT0ZfU0VRVUVOQ0VdCT0gNiwKKwlbUlhSUENfQUNLX0VYQ0VFRFNfV0lORE9XXQk9IDcsCisJW1JYUlBDX0FDS19OT1NQQUNFXQkJPSA4LAorfTsKKworLyoKKyAqIHByb3Bvc2UgYW4gQUNLIGJlIHNlbnQKKyAqLwordm9pZCBfX3J4cnBjX3Byb3Bvc2VfQUNLKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLCB1aW50OF90IGFja19yZWFzb24sCisJCQkgX19iZTMyIHNlcmlhbCwgYm9vbCBpbW1lZGlhdGUpCit7CisJdW5zaWduZWQgbG9uZyBleHBpcnk7CisJczggcHJpb3IgPSByeHJwY19hY2tfcHJpb3JpdHlbYWNrX3JlYXNvbl07CisKKwlBU1NFUlRDTVAocHJpb3IsID4sIDApOworCisJX2VudGVyKCJ7JWR9LCVzLCUlJXgsJXUiLAorCSAgICAgICBjYWxsLT5kZWJ1Z19pZCwgcnhycGNfYWNrc1thY2tfcmVhc29uXSwgbnRvaGwoc2VyaWFsKSwKKwkgICAgICAgaW1tZWRpYXRlKTsKKworCWlmIChwcmlvciA8IHJ4cnBjX2Fja19wcmlvcml0eVtjYWxsLT5hY2tyX3JlYXNvbl0pIHsKKwkJaWYgKGltbWVkaWF0ZSkKKwkJCWdvdG8gY2FuY2VsX3RpbWVyOworCQlyZXR1cm47CisJfQorCisJLyogdXBkYXRlIERFTEFZLCBJRExFLCBSRVFVRVNURUQgYW5kIFBJTkdfUkVTUE9OU0UgQUNLIHNlcmlhbAorCSAqIG51bWJlcnMgKi8KKwlpZiAocHJpb3IgPT0gcnhycGNfYWNrX3ByaW9yaXR5W2NhbGwtPmFja3JfcmVhc29uXSkgeworCQlpZiAocHJpb3IgPD0gNCkKKwkJCWNhbGwtPmFja3Jfc2VyaWFsID0gc2VyaWFsOworCQlpZiAoaW1tZWRpYXRlKQorCQkJZ290byBjYW5jZWxfdGltZXI7CisJCXJldHVybjsKKwl9CisKKwljYWxsLT5hY2tyX3JlYXNvbiA9IGFja19yZWFzb247CisJY2FsbC0+YWNrcl9zZXJpYWwgPSBzZXJpYWw7CisKKwlzd2l0Y2ggKGFja19yZWFzb24pIHsKKwljYXNlIFJYUlBDX0FDS19ERUxBWToKKwkJX2RlYnVnKCJydW4gZGVsYXkgdGltZXIiKTsKKwkJY2FsbC0+YWNrX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgcnhycGNfYWNrX3RpbWVvdXQgKiBIWjsKKwkJYWRkX3RpbWVyKCZjYWxsLT5hY2tfdGltZXIpOworCQlyZXR1cm47CisKKwljYXNlIFJYUlBDX0FDS19JRExFOgorCQlpZiAoIWltbWVkaWF0ZSkgeworCQkJX2RlYnVnKCJydW4gZGVmZXIgdGltZXIiKTsKKwkJCWV4cGlyeSA9IDE7CisJCQlnb3RvIHJ1bl90aW1lcjsKKwkJfQorCQlnb3RvIGNhbmNlbF90aW1lcjsKKworCWNhc2UgUlhSUENfQUNLX1JFUVVFU1RFRDoKKwkJaWYgKCFyeHJwY19hY2tfZGVmZXIpCisJCQlnb3RvIGNhbmNlbF90aW1lcjsKKwkJaWYgKCFpbW1lZGlhdGUgfHwgc2VyaWFsID09IGNwdV90b19iZTMyKDEpKSB7CisJCQlfZGVidWcoInJ1biBkZWZlciB0aW1lciIpOworCQkJZXhwaXJ5ID0gcnhycGNfYWNrX2RlZmVyOworCQkJZ290byBydW5fdGltZXI7CisJCX0KKworCWRlZmF1bHQ6CisJCV9kZWJ1ZygiaW1tZWRpYXRlIEFDSyIpOworCQlnb3RvIGNhbmNlbF90aW1lcjsKKwl9CisKK3J1bl90aW1lcjoKKwlleHBpcnkgKz0gamlmZmllczsKKwlpZiAoIXRpbWVyX3BlbmRpbmcoJmNhbGwtPmFja190aW1lcikgfHwKKwkgICAgdGltZV9hZnRlcihjYWxsLT5hY2tfdGltZXIuZXhwaXJlcywgZXhwaXJ5KSkKKwkJbW9kX3RpbWVyKCZjYWxsLT5hY2tfdGltZXIsIGV4cGlyeSk7CisJcmV0dXJuOworCitjYW5jZWxfdGltZXI6CisJX2RlYnVnKCJjYW5jZWwgdGltZXIgJSUldSIsIG50b2hsKHNlcmlhbCkpOworCXRyeV90b19kZWxfdGltZXJfc3luYygmY2FsbC0+YWNrX3RpbWVyKTsKKwlyZWFkX2xvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOworCWlmIChjYWxsLT5zdGF0ZSA8PSBSWFJQQ19DQUxMX0NPTVBMRVRFICYmCisJICAgICF0ZXN0X2FuZF9zZXRfYml0KFJYUlBDX0NBTExfQUNLLCAmY2FsbC0+ZXZlbnRzKSkKKwkJcnhycGNfcXVldWVfY2FsbChjYWxsKTsKKwlyZWFkX3VubG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7Cit9CisKKy8qCisgKiBwcm9wb3NlIGFuIEFDSyBiZSBzZW50LCBsb2NraW5nIHRoZSBjYWxsIHN0cnVjdHVyZQorICovCit2b2lkIHJ4cnBjX3Byb3Bvc2VfQUNLKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLCB1aW50OF90IGFja19yZWFzb24sCisJCSAgICAgICBfX2JlMzIgc2VyaWFsLCBib29sIGltbWVkaWF0ZSkKK3sKKwlzOCBwcmlvciA9IHJ4cnBjX2Fja19wcmlvcml0eVthY2tfcmVhc29uXTsKKworCWlmIChwcmlvciA+IHJ4cnBjX2Fja19wcmlvcml0eVtjYWxsLT5hY2tyX3JlYXNvbl0pIHsKKwkJc3Bpbl9sb2NrX2JoKCZjYWxsLT5sb2NrKTsKKwkJX19yeHJwY19wcm9wb3NlX0FDSyhjYWxsLCBhY2tfcmVhc29uLCBzZXJpYWwsIGltbWVkaWF0ZSk7CisJCXNwaW5fdW5sb2NrX2JoKCZjYWxsLT5sb2NrKTsKKwl9Cit9CisKKy8qCisgKiBzZXQgdGhlIHJlc2VuZCB0aW1lcgorICovCitzdGF0aWMgdm9pZCByeHJwY19zZXRfcmVzZW5kKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLCB1OCByZXNlbmQsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgcmVzZW5kX2F0KQoreworCXJlYWRfbG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7CisJaWYgKGNhbGwtPnN0YXRlID49IFJYUlBDX0NBTExfQ09NUExFVEUpCisJCXJlc2VuZCA9IDA7CisKKwlpZiAocmVzZW5kICYgMSkgeworCQlfZGVidWcoIlNFVCBSRVNFTkQiKTsKKwkJc2V0X2JpdChSWFJQQ19DQUxMX1JFU0VORCwgJmNhbGwtPmV2ZW50cyk7CisJfQorCisJaWYgKHJlc2VuZCAmIDIpIHsKKwkJX2RlYnVnKCJNT0RJRlkgUkVTRU5EIFRJTUVSIik7CisJCXNldF9iaXQoUlhSUENfQ0FMTF9SVU5fUlRJTUVSLCAmY2FsbC0+ZmxhZ3MpOworCQltb2RfdGltZXIoJmNhbGwtPnJlc2VuZF90aW1lciwgcmVzZW5kX2F0KTsKKwl9IGVsc2UgeworCQlfZGVidWcoIktJTEwgUkVTRU5EIFRJTUVSIik7CisJCWRlbF90aW1lcl9zeW5jKCZjYWxsLT5yZXNlbmRfdGltZXIpOworCQljbGVhcl9iaXQoUlhSUENfQ0FMTF9SRVNFTkRfVElNRVIsICZjYWxsLT5ldmVudHMpOworCQljbGVhcl9iaXQoUlhSUENfQ0FMTF9SVU5fUlRJTUVSLCAmY2FsbC0+ZmxhZ3MpOworCX0KKwlyZWFkX3VubG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7Cit9CisKKy8qCisgKiByZXNlbmQgcGFja2V0cworICovCitzdGF0aWMgdm9pZCByeHJwY19yZXNlbmQoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpCit7CisJc3RydWN0IHJ4cnBjX3NrYl9wcml2ICpzcDsKKwlzdHJ1Y3QgcnhycGNfaGVhZGVyICpoZHI7CisJc3RydWN0IHNrX2J1ZmYgKnR4YjsKKwl1bnNpZ25lZCBsb25nICpwX3R4YiwgcmVzZW5kX2F0OworCWludCBsb29wLCBzdG9wOworCXU4IHJlc2VuZDsKKworCV9lbnRlcigieyVkLCVkLCVkLCVkfSwiLAorCSAgICAgICBjYWxsLT5hY2tzX2hhcmQsIGNhbGwtPmFja3NfdW5hY2tlZCwKKwkgICAgICAgYXRvbWljX3JlYWQoJmNhbGwtPnNlcXVlbmNlKSwKKwkgICAgICAgQ0lSQ19DTlQoY2FsbC0+YWNrc19oZWFkLCBjYWxsLT5hY2tzX3RhaWwsIGNhbGwtPmFja3Nfd2luc3opKTsKKworCXN0b3AgPSAwOworCXJlc2VuZCA9IDA7CisJcmVzZW5kX2F0ID0gMDsKKworCWZvciAobG9vcCA9IGNhbGwtPmFja3NfdGFpbDsKKwkgICAgIGxvb3AgIT0gY2FsbC0+YWNrc19oZWFkIHx8IHN0b3A7CisJICAgICBsb29wID0gKGxvb3AgKyAxKSAmICAoY2FsbC0+YWNrc193aW5zeiAtIDEpCisJICAgICApIHsKKwkJcF90eGIgPSBjYWxsLT5hY2tzX3dpbmRvdyArIGxvb3A7CisJCXNtcF9yZWFkX2JhcnJpZXJfZGVwZW5kcygpOworCQlpZiAoKnBfdHhiICYgMSkKKwkJCWNvbnRpbnVlOworCisJCXR4YiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKSAqcF90eGI7CisJCXNwID0gcnhycGNfc2tiKHR4Yik7CisKKwkJaWYgKHNwLT5uZWVkX3Jlc2VuZCkgeworCQkJc3AtPm5lZWRfcmVzZW5kID0gMDsKKworCQkJLyogZWFjaCBUeCBwYWNrZXQgaGFzIGEgbmV3IHNlcmlhbCBudW1iZXIgKi8KKwkJCXNwLT5oZHIuc2VyaWFsID0KKwkJCQlodG9ubChhdG9taWNfaW5jX3JldHVybigmY2FsbC0+Y29ubi0+c2VyaWFsKSk7CisKKwkJCWhkciA9IChzdHJ1Y3QgcnhycGNfaGVhZGVyICopIHR4Yi0+aGVhZDsKKwkJCWhkci0+c2VyaWFsID0gc3AtPmhkci5zZXJpYWw7CisKKwkJCV9wcm90bygiVHggREFUQSAlJSV1IHsgIyVkIH0iLAorCQkJICAgICAgIG50b2hsKHNwLT5oZHIuc2VyaWFsKSwgbnRvaGwoc3AtPmhkci5zZXEpKTsKKwkJCWlmIChyeHJwY19zZW5kX3BhY2tldChjYWxsLT5jb25uLT50cmFucywgdHhiKSA8IDApIHsKKwkJCQlzdG9wID0gMDsKKwkJCQlzcC0+cmVzZW5kX2F0ID0gamlmZmllcyArIDM7CisJCQl9IGVsc2UgeworCQkJCXNwLT5yZXNlbmRfYXQgPQorCQkJCQlqaWZmaWVzICsgcnhycGNfcmVzZW5kX3RpbWVvdXQgKiBIWjsKKwkJCX0KKwkJfQorCisJCWlmICh0aW1lX2FmdGVyX2VxKGppZmZpZXMgKyAxLCBzcC0+cmVzZW5kX2F0KSkgeworCQkJc3AtPm5lZWRfcmVzZW5kID0gMTsKKwkJCXJlc2VuZCB8PSAxOworCQl9IGVsc2UgaWYgKHJlc2VuZCAmIDIpIHsKKwkJCWlmICh0aW1lX2JlZm9yZShzcC0+cmVzZW5kX2F0LCByZXNlbmRfYXQpKQorCQkJCXJlc2VuZF9hdCA9IHNwLT5yZXNlbmRfYXQ7CisJCX0gZWxzZSB7CisJCQlyZXNlbmRfYXQgPSBzcC0+cmVzZW5kX2F0OworCQkJcmVzZW5kIHw9IDI7CisJCX0KKwl9CisKKwlyeHJwY19zZXRfcmVzZW5kKGNhbGwsIHJlc2VuZCwgcmVzZW5kX2F0KTsKKwlfbGVhdmUoIiIpOworfQorCisvKgorICogaGFuZGxlIHJlc2VuZCB0aW1lciBleHBpcnkKKyAqLworc3RhdGljIHZvaWQgcnhycGNfcmVzZW5kX3RpbWVyKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKQoreworCXN0cnVjdCByeHJwY19za2JfcHJpdiAqc3A7CisJc3RydWN0IHNrX2J1ZmYgKnR4YjsKKwl1bnNpZ25lZCBsb25nICpwX3R4YiwgcmVzZW5kX2F0OworCWludCBsb29wOworCXU4IHJlc2VuZDsKKworCV9lbnRlcigiJWQsJWQsJWQiLAorCSAgICAgICBjYWxsLT5hY2tzX3RhaWwsIGNhbGwtPmFja3NfdW5hY2tlZCwgY2FsbC0+YWNrc19oZWFkKTsKKworCXJlc2VuZCA9IDA7CisJcmVzZW5kX2F0ID0gMDsKKworCWZvciAobG9vcCA9IGNhbGwtPmFja3NfdW5hY2tlZDsKKwkgICAgIGxvb3AgIT0gY2FsbC0+YWNrc19oZWFkOworCSAgICAgbG9vcCA9IChsb29wICsgMSkgJiAgKGNhbGwtPmFja3Nfd2luc3ogLSAxKQorCSAgICAgKSB7CisJCXBfdHhiID0gY2FsbC0+YWNrc193aW5kb3cgKyBsb29wOworCQlzbXBfcmVhZF9iYXJyaWVyX2RlcGVuZHMoKTsKKwkJdHhiID0gKHN0cnVjdCBza19idWZmICopICgqcF90eGIgJiB+MSk7CisJCXNwID0gcnhycGNfc2tiKHR4Yik7CisKKwkJQVNTRVJUKCEoKnBfdHhiICYgMSkpOworCisJCWlmIChzcC0+bmVlZF9yZXNlbmQpIHsKKwkJCTsKKwkJfSBlbHNlIGlmICh0aW1lX2FmdGVyX2VxKGppZmZpZXMgKyAxLCBzcC0+cmVzZW5kX2F0KSkgeworCQkJc3AtPm5lZWRfcmVzZW5kID0gMTsKKwkJCXJlc2VuZCB8PSAxOworCQl9IGVsc2UgaWYgKHJlc2VuZCAmIDIpIHsKKwkJCWlmICh0aW1lX2JlZm9yZShzcC0+cmVzZW5kX2F0LCByZXNlbmRfYXQpKQorCQkJCXJlc2VuZF9hdCA9IHNwLT5yZXNlbmRfYXQ7CisJCX0gZWxzZSB7CisJCQlyZXNlbmRfYXQgPSBzcC0+cmVzZW5kX2F0OworCQkJcmVzZW5kIHw9IDI7CisJCX0KKwl9CisKKwlyeHJwY19zZXRfcmVzZW5kKGNhbGwsIHJlc2VuZCwgcmVzZW5kX2F0KTsKKwlfbGVhdmUoIiIpOworfQorCisvKgorICogcHJvY2VzcyBzb2Z0IEFDS3Mgb2Ygb3VyIHRyYW5zbWl0dGVkIHBhY2tldHMKKyAqIC0gdGhlc2UgaW5kaWNhdGUgcGFja2V0cyB0aGUgcGVlciBoYXMgb3IgaGFzIG5vdCByZWNlaXZlZCwgYnV0IGhhc24ndCB5ZXQKKyAqICAgZ2l2ZW4gdG8gdGhlIGNvbnN1bWVyLCBhbmQgc28gY2FuIHN0aWxsIGJlIGRpc2NhcmRlZCBhbmQgcmUtcmVxdWVzdGVkCisgKi8KK3N0YXRpYyBpbnQgcnhycGNfcHJvY2Vzc19zb2Z0X0FDS3Moc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsCisJCQkJICAgc3RydWN0IHJ4cnBjX2Fja3BhY2tldCAqYWNrLAorCQkJCSAgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHJ4cnBjX3NrYl9wcml2ICpzcDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqdHhiOworCXVuc2lnbmVkIGxvbmcgKnBfdHhiLCByZXNlbmRfYXQ7CisJaW50IGxvb3A7CisJdTggc2Fja3NbUlhSUENfTUFYQUNLU10sIHJlc2VuZDsKKworCV9lbnRlcigieyVkLCVkfSx7JWR9LCIsCisJICAgICAgIGNhbGwtPmFja3NfaGFyZCwKKwkgICAgICAgQ0lSQ19DTlQoY2FsbC0+YWNrc19oZWFkLCBjYWxsLT5hY2tzX3RhaWwsIGNhbGwtPmFja3Nfd2luc3opLAorCSAgICAgICBhY2stPm5BY2tzKTsKKworCWlmIChza2JfY29weV9iaXRzKHNrYiwgMCwgc2Fja3MsIGFjay0+bkFja3MpIDwgMCkKKwkJZ290byBwcm90b2NvbF9lcnJvcjsKKworCXJlc2VuZCA9IDA7CisJcmVzZW5kX2F0ID0gMDsKKwlmb3IgKGxvb3AgPSAwOyBsb29wIDwgYWNrLT5uQWNrczsgbG9vcCsrKSB7CisJCXBfdHhiID0gY2FsbC0+YWNrc193aW5kb3c7CisJCXBfdHhiICs9IChjYWxsLT5hY2tzX3RhaWwgKyBsb29wKSAmIChjYWxsLT5hY2tzX3dpbnN6IC0gMSk7CisJCXNtcF9yZWFkX2JhcnJpZXJfZGVwZW5kcygpOworCQl0eGIgPSAoc3RydWN0IHNrX2J1ZmYgKikgKCpwX3R4YiAmIH4xKTsKKwkJc3AgPSByeHJwY19za2IodHhiKTsKKworCQlzd2l0Y2ggKHNhY2tzW2xvb3BdKSB7CisJCWNhc2UgUlhSUENfQUNLX1RZUEVfQUNLOgorCQkJc3AtPm5lZWRfcmVzZW5kID0gMDsKKwkJCSpwX3R4YiB8PSAxOworCQkJYnJlYWs7CisJCWNhc2UgUlhSUENfQUNLX1RZUEVfTkFDSzoKKwkJCXNwLT5uZWVkX3Jlc2VuZCA9IDE7CisJCQkqcF90eGIgJj0gfjE7CisJCQlyZXNlbmQgPSAxOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlfZGVidWcoIlVuc3VwcG9ydGVkIEFDSyB0eXBlICVkIiwgc2Fja3NbbG9vcF0pOworCQkJZ290byBwcm90b2NvbF9lcnJvcjsKKwkJfQorCX0KKworCXNtcF9tYigpOworCWNhbGwtPmFja3NfdW5hY2tlZCA9IChjYWxsLT5hY2tzX3RhaWwgKyBsb29wKSAmIChjYWxsLT5hY2tzX3dpbnN6IC0gMSk7CisKKwkvKiBhbnl0aGluZyBub3QgZXhwbGljaXRseSBBQ0snZCBpcyBpbXBsaWNpdGx5IE5BQ0snZCwgYnV0IG1heSBqdXN0IG5vdAorCSAqIGhhdmUgYmVlbiByZWNlaXZlZCBvciBwcm9jZXNzZWQgeWV0IGJ5IHRoZSBmYXIgZW5kICovCisJZm9yIChsb29wID0gY2FsbC0+YWNrc191bmFja2VkOworCSAgICAgbG9vcCAhPSBjYWxsLT5hY2tzX2hlYWQ7CisJICAgICBsb29wID0gKGxvb3AgKyAxKSAmICAoY2FsbC0+YWNrc193aW5zeiAtIDEpCisJICAgICApIHsKKwkJcF90eGIgPSBjYWxsLT5hY2tzX3dpbmRvdyArIGxvb3A7CisJCXNtcF9yZWFkX2JhcnJpZXJfZGVwZW5kcygpOworCQl0eGIgPSAoc3RydWN0IHNrX2J1ZmYgKikgKCpwX3R4YiAmIH4xKTsKKwkJc3AgPSByeHJwY19za2IodHhiKTsKKworCQlpZiAoKnBfdHhiICYgMSkgeworCQkJLyogcGFja2V0IG11c3QgaGF2ZSBiZWVuIGRpc2NhcmRlZCAqLworCQkJc3AtPm5lZWRfcmVzZW5kID0gMTsKKwkJCSpwX3R4YiAmPSB+MTsKKwkJCXJlc2VuZCB8PSAxOworCQl9IGVsc2UgaWYgKHNwLT5uZWVkX3Jlc2VuZCkgeworCQkJOworCQl9IGVsc2UgaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcyArIDEsIHNwLT5yZXNlbmRfYXQpKSB7CisJCQlzcC0+bmVlZF9yZXNlbmQgPSAxOworCQkJcmVzZW5kIHw9IDE7CisJCX0gZWxzZSBpZiAocmVzZW5kICYgMikgeworCQkJaWYgKHRpbWVfYmVmb3JlKHNwLT5yZXNlbmRfYXQsIHJlc2VuZF9hdCkpCisJCQkJcmVzZW5kX2F0ID0gc3AtPnJlc2VuZF9hdDsKKwkJfSBlbHNlIHsKKwkJCXJlc2VuZF9hdCA9IHNwLT5yZXNlbmRfYXQ7CisJCQlyZXNlbmQgfD0gMjsKKwkJfQorCX0KKworCXJ4cnBjX3NldF9yZXNlbmQoY2FsbCwgcmVzZW5kLCByZXNlbmRfYXQpOworCV9sZWF2ZSgiID0gMCIpOworCXJldHVybiAwOworCitwcm90b2NvbF9lcnJvcjoKKwlfbGVhdmUoIiA9IC1FUFJPVE8iKTsKKwlyZXR1cm4gLUVQUk9UTzsKK30KKworLyoKKyAqIGRpc2NhcmQgaGFyZC1BQ0snZCBwYWNrZXRzIGZyb20gdGhlIFR4IHdpbmRvdworICovCitzdGF0aWMgdm9pZCByeHJwY19yb3RhdGVfdHhfd2luZG93KHN0cnVjdCByeHJwY19jYWxsICpjYWxsLCB1MzIgaGFyZCkKK3sKKwlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwOworCXVuc2lnbmVkIGxvbmcgX3NrYjsKKwlpbnQgdGFpbCA9IGNhbGwtPmFja3NfdGFpbCwgb2xkX3RhaWw7CisJaW50IHdpbiA9IENJUkNfQ05UKGNhbGwtPmFja3NfaGVhZCwgdGFpbCwgY2FsbC0+YWNrc193aW5zeik7CisKKwlfZW50ZXIoInsldSwldX0sJXUiLCBjYWxsLT5hY2tzX2hhcmQsIHdpbiwgaGFyZCk7CisKKwlBU1NFUlRDTVAoaGFyZCAtIGNhbGwtPmFja3NfaGFyZCwgPD0sIHdpbik7CisKKwl3aGlsZSAoY2FsbC0+YWNrc19oYXJkIDwgaGFyZCkgeworCQlzbXBfcmVhZF9iYXJyaWVyX2RlcGVuZHMoKTsKKwkJX3NrYiA9IGNhbGwtPmFja3Nfd2luZG93W3RhaWxdICYgfjE7CisJCXNwID0gcnhycGNfc2tiKChzdHJ1Y3Qgc2tfYnVmZiAqKSBfc2tiKTsKKwkJcnhycGNfZnJlZV9za2IoKHN0cnVjdCBza19idWZmICopIF9za2IpOworCQlvbGRfdGFpbCA9IHRhaWw7CisJCXRhaWwgPSAodGFpbCArIDEpICYgKGNhbGwtPmFja3Nfd2luc3ogLSAxKTsKKwkJY2FsbC0+YWNrc190YWlsID0gdGFpbDsKKwkJaWYgKGNhbGwtPmFja3NfdW5hY2tlZCA9PSBvbGRfdGFpbCkKKwkJCWNhbGwtPmFja3NfdW5hY2tlZCA9IHRhaWw7CisJCWNhbGwtPmFja3NfaGFyZCsrOworCX0KKworCXdha2VfdXAoJmNhbGwtPnR4X3dhaXRxKTsKK30KKworLyoKKyAqIGNsZWFyIHRoZSBUeCB3aW5kb3cgaW4gdGhlIGV2ZW50IG9mIGEgZmFpbHVyZQorICovCitzdGF0aWMgdm9pZCByeHJwY19jbGVhcl90eF93aW5kb3coc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpCit7CisJcnhycGNfcm90YXRlX3R4X3dpbmRvdyhjYWxsLCBhdG9taWNfcmVhZCgmY2FsbC0+c2VxdWVuY2UpKTsKK30KKworLyoKKyAqIGRyYWluIHRoZSBvdXQgb2Ygc2VxdWVuY2UgcmVjZWl2ZWQgcGFja2V0IHF1ZXVlIGludG8gdGhlIHBhY2tldCBSeCBxdWV1ZQorICovCitzdGF0aWMgaW50IHJ4cnBjX2RyYWluX3J4X29vc19xdWV1ZShzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCkKK3sKKwlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwOworCXN0cnVjdCBza19idWZmICpza2I7CisJYm9vbCB0ZXJtaW5hbDsKKwlpbnQgcmV0OworCisJX2VudGVyKCJ7JWQsJWR9IiwgY2FsbC0+cnhfZGF0YV9wb3N0LCBjYWxsLT5yeF9maXJzdF9vb3MpOworCisJc3Bpbl9sb2NrX2JoKCZjYWxsLT5sb2NrKTsKKworCXJldCA9IC1FQ09OTlJFU0VUOworCWlmICh0ZXN0X2JpdChSWFJQQ19DQUxMX1JFTEVBU0VELCAmY2FsbC0+ZmxhZ3MpKQorCQlnb3RvIHNvY2tldF91bmF2YWlsYWJsZTsKKworCXNrYiA9IHNrYl9kZXF1ZXVlKCZjYWxsLT5yeF9vb3NfcXVldWUpOworCWlmIChza2IpIHsKKwkJc3AgPSByeHJwY19za2Ioc2tiKTsKKworCQlfZGVidWcoImRyYWluIE9PUyBwYWNrZXQgJWQgWyVkXSIsCisJCSAgICAgICBudG9obChzcC0+aGRyLnNlcSksIGNhbGwtPnJ4X2ZpcnN0X29vcyk7CisKKwkJaWYgKG50b2hsKHNwLT5oZHIuc2VxKSAhPSBjYWxsLT5yeF9maXJzdF9vb3MpIHsKKwkJCXNrYl9xdWV1ZV9oZWFkKCZjYWxsLT5yeF9vb3NfcXVldWUsIHNrYik7CisJCQljYWxsLT5yeF9maXJzdF9vb3MgPSBudG9obChyeHJwY19za2Ioc2tiKS0+aGRyLnNlcSk7CisJCQlfZGVidWcoInJlcXVldWUgJXAgeyV1fSIsIHNrYiwgY2FsbC0+cnhfZmlyc3Rfb29zKTsKKwkJfSBlbHNlIHsKKwkJCXNrYi0+bWFyayA9IFJYUlBDX1NLQl9NQVJLX0RBVEE7CisJCQl0ZXJtaW5hbCA9ICgoc3AtPmhkci5mbGFncyAmIFJYUlBDX0xBU1RfUEFDS0VUKSAmJgorCQkJCSEoc3AtPmhkci5mbGFncyAmIFJYUlBDX0NMSUVOVF9JTklUSUFURUQpKTsKKwkJCXJldCA9IHJ4cnBjX3F1ZXVlX3Jjdl9za2IoY2FsbCwgc2tiLCB0cnVlLCB0ZXJtaW5hbCk7CisJCQlCVUdfT04ocmV0IDwgMCk7CisJCQlfZGVidWcoImRyYWluICMldSIsIGNhbGwtPnJ4X2RhdGFfcG9zdCk7CisJCQljYWxsLT5yeF9kYXRhX3Bvc3QrKzsKKworCQkJLyogZmluZCBvdXQgd2hhdCB0aGUgbmV4dCBwYWNrZXQgaXMgKi8KKwkJCXNrYiA9IHNrYl9wZWVrKCZjYWxsLT5yeF9vb3NfcXVldWUpOworCQkJaWYgKHNrYikKKwkJCQljYWxsLT5yeF9maXJzdF9vb3MgPQorCQkJCQludG9obChyeHJwY19za2Ioc2tiKS0+aGRyLnNlcSk7CisJCQllbHNlCisJCQkJY2FsbC0+cnhfZmlyc3Rfb29zID0gMDsKKwkJCV9kZWJ1ZygicGVlayAlcCB7JXV9Iiwgc2tiLCBjYWxsLT5yeF9maXJzdF9vb3MpOworCQl9CisJfQorCisJcmV0ID0gMDsKK3NvY2tldF91bmF2YWlsYWJsZToKKwlzcGluX3VubG9ja19iaCgmY2FsbC0+bG9jayk7CisJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIGluc2VydCBhbiBvdXQgb2Ygc2VxdWVuY2UgcGFja2V0IGludG8gdGhlIGJ1ZmZlcgorICovCitzdGF0aWMgdm9pZCByeHJwY19pbnNlcnRfb29zX3BhY2tldChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwKKwkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwLCAqcHNwOworCXN0cnVjdCBza19idWZmICpwOworCXUzMiBzZXE7CisKKwlzcCA9IHJ4cnBjX3NrYihza2IpOworCXNlcSA9IG50b2hsKHNwLT5oZHIuc2VxKTsKKwlfZW50ZXIoIiwseyV1fSIsIHNlcSk7CisKKwlza2ItPmRlc3RydWN0b3IgPSByeHJwY19wYWNrZXRfZGVzdHJ1Y3RvcjsKKwlBU1NFUlRDTVAoc3AtPmNhbGwsID09LCBOVUxMKTsKKwlzcC0+Y2FsbCA9IGNhbGw7CisJcnhycGNfZ2V0X2NhbGwoY2FsbCk7CisKKwkvKiBpbnNlcnQgaW50byB0aGUgYnVmZmVyIGluIHNlcXVlbmNlIG9yZGVyICovCisJc3Bpbl9sb2NrX2JoKCZjYWxsLT5sb2NrKTsKKworCXNrYl9xdWV1ZV93YWxrKCZjYWxsLT5yeF9vb3NfcXVldWUsIHApIHsKKwkJcHNwID0gcnhycGNfc2tiKHApOworCQlpZiAobnRvaGwocHNwLT5oZHIuc2VxKSA+IHNlcSkgeworCQkJX2RlYnVnKCJpbnNlcnQgb29zICMldSBiZWZvcmUgIyV1IiwKKwkJCSAgICAgICBzZXEsIG50b2hsKHBzcC0+aGRyLnNlcSkpOworCQkJc2tiX2luc2VydChwLCBza2IsICZjYWxsLT5yeF9vb3NfcXVldWUpOworCQkJZ290byBpbnNlcnRlZDsKKwkJfQorCX0KKworCV9kZWJ1ZygiYXBwZW5kIG9vcyAjJXUiLCBzZXEpOworCXNrYl9xdWV1ZV90YWlsKCZjYWxsLT5yeF9vb3NfcXVldWUsIHNrYik7CitpbnNlcnRlZDoKKworCS8qIHdlIG1pZ2h0IG5vdyBoYXZlIGEgbmV3IGZyb250IHRvIHRoZSBxdWV1ZSAqLworCWlmIChjYWxsLT5yeF9maXJzdF9vb3MgPT0gMCB8fCBzZXEgPCBjYWxsLT5yeF9maXJzdF9vb3MpCisJCWNhbGwtPnJ4X2ZpcnN0X29vcyA9IHNlcTsKKworCXJlYWRfbG9jaygmY2FsbC0+c3RhdGVfbG9jayk7CisJaWYgKGNhbGwtPnN0YXRlIDwgUlhSUENfQ0FMTF9DT01QTEVURSAmJgorCSAgICBjYWxsLT5yeF9kYXRhX3Bvc3QgPT0gY2FsbC0+cnhfZmlyc3Rfb29zKSB7CisJCV9kZWJ1ZygiZHJhaW4gcnggb29zIG5vdyIpOworCQlzZXRfYml0KFJYUlBDX0NBTExfRFJBSU5fUlhfT09TLCAmY2FsbC0+ZXZlbnRzKTsKKwl9CisJcmVhZF91bmxvY2soJmNhbGwtPnN0YXRlX2xvY2spOworCisJc3Bpbl91bmxvY2tfYmgoJmNhbGwtPmxvY2spOworCV9sZWF2ZSgiIFtzdG9yZWQgIyV1XSIsIGNhbGwtPnJ4X2ZpcnN0X29vcyk7Cit9CisKKy8qCisgKiBjbGVhciB0aGUgVHggd2luZG93IG9uIGZpbmFsIEFDSyByZWNlcHRpb24KKyAqLworc3RhdGljIHZvaWQgcnhycGNfemFwX3R4X3dpbmRvdyhzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCkKK3sKKwlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwOworCXN0cnVjdCBza19idWZmICpza2I7CisJdW5zaWduZWQgbG9uZyBfc2tiLCAqYWNrc193aW5kb3c7CisJdWludDhfdCB3aW5zeiA9IGNhbGwtPmFja3Nfd2luc3o7CisJaW50IHRhaWw7CisKKwlhY2tzX3dpbmRvdyA9IGNhbGwtPmFja3Nfd2luZG93OworCWNhbGwtPmFja3Nfd2luZG93ID0gTlVMTDsKKworCXdoaWxlIChDSVJDX0NOVChjYWxsLT5hY2tzX2hlYWQsIGNhbGwtPmFja3NfdGFpbCwgd2luc3opID4gMCkgeworCQl0YWlsID0gY2FsbC0+YWNrc190YWlsOworCQlzbXBfcmVhZF9iYXJyaWVyX2RlcGVuZHMoKTsKKwkJX3NrYiA9IGFja3Nfd2luZG93W3RhaWxdICYgfjE7CisJCXNtcF9tYigpOworCQljYWxsLT5hY2tzX3RhaWwgPSAoY2FsbC0+YWNrc190YWlsICsgMSkgJiAod2luc3ogLSAxKTsKKworCQlza2IgPSAoc3RydWN0IHNrX2J1ZmYgKikgX3NrYjsKKwkJc3AgPSByeHJwY19za2Ioc2tiKTsKKwkJX2RlYnVnKCIrKysgY2xlYXIgVHggJXUiLCBudG9obChzcC0+aGRyLnNlcSkpOworCQlyeHJwY19mcmVlX3NrYihza2IpOworCX0KKworCWtmcmVlKGFja3Nfd2luZG93KTsKK30KKworLyoKKyAqIHByb2Nlc3MgcGFja2V0cyBpbiB0aGUgcmVjZXB0aW9uIHF1ZXVlCisgKi8KK3N0YXRpYyBpbnQgcnhycGNfcHJvY2Vzc19yeF9xdWV1ZShzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwKKwkJCQkgIHUzMiAqX2Fib3J0X2NvZGUpCit7CisJc3RydWN0IHJ4cnBjX2Fja3BhY2tldCBhY2s7CisJc3RydWN0IHJ4cnBjX3NrYl9wcml2ICpzcDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWJvb2wgcG9zdF9BQ0s7CisJaW50IGxhdGVzdDsKKwl1MzIgaGFyZCwgdHg7CisKKwlfZW50ZXIoIiIpOworCitwcm9jZXNzX2Z1cnRoZXI6CisJc2tiID0gc2tiX2RlcXVldWUoJmNhbGwtPnJ4X3F1ZXVlKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuIC1FQUdBSU47CisKKwlfbmV0KCJkZWZlcnJlZCBza2IgJXAiLCBza2IpOworCisJc3AgPSByeHJwY19za2Ioc2tiKTsKKworCV9kZWJ1ZygicHJvY2VzcyAlcyBbc3QgJWRdIiwgcnhycGNfcGt0c1tzcC0+aGRyLnR5cGVdLCBjYWxsLT5zdGF0ZSk7CisKKwlwb3N0X0FDSyA9IGZhbHNlOworCisJc3dpdGNoIChzcC0+aGRyLnR5cGUpIHsKKwkJLyogZGF0YSBwYWNrZXRzIHRoYXQgd2luZCB1cCBoZXJlIGhhdmUgYmVlbiByZWNlaXZlZCBvdXQgb2YKKwkJICogb3JkZXIsIG5lZWQgc2VjdXJpdHkgcHJvY2Vzc2luZyBvciBhcmUganVtYm8gcGFja2V0cyAqLworCWNhc2UgUlhSUENfUEFDS0VUX1RZUEVfREFUQToKKwkJX3Byb3RvKCJPT1NRIERBVEEgJSUldSB7ICMldSB9IiwKKwkJICAgICAgIG50b2hsKHNwLT5oZHIuc2VyaWFsKSwgbnRvaGwoc3AtPmhkci5zZXEpKTsKKworCQkvKiBzZWN1cmVkIHBhY2tldHMgbXVzdCBiZSB2ZXJpZmllZCBhbmQgcG9zc2libHkgZGVjcnlwdGVkICovCisJCWlmIChyeHJwY192ZXJpZnlfcGFja2V0KGNhbGwsIHNrYiwgX2Fib3J0X2NvZGUpIDwgMCkKKwkJCWdvdG8gcHJvdG9jb2xfZXJyb3I7CisKKwkJcnhycGNfaW5zZXJ0X29vc19wYWNrZXQoY2FsbCwgc2tiKTsKKwkJZ290byBwcm9jZXNzX2Z1cnRoZXI7CisKKwkJLyogcGFydGlhbCBBQ0sgdG8gcHJvY2VzcyAqLworCWNhc2UgUlhSUENfUEFDS0VUX1RZUEVfQUNLOgorCQlpZiAoc2tiX2NvcHlfYml0cyhza2IsIDAsICZhY2ssIHNpemVvZihhY2spKSA8IDApIHsKKwkJCV9kZWJ1ZygiZXh0cmFjdGlvbiBmYWlsdXJlIik7CisJCQlnb3RvIHByb3RvY29sX2Vycm9yOworCQl9CisJCWlmICghc2tiX3B1bGwoc2tiLCBzaXplb2YoYWNrKSkpCisJCQlCVUcoKTsKKworCQlsYXRlc3QgPSBudG9obChzcC0+aGRyLnNlcmlhbCk7CisJCWhhcmQgPSBudG9obChhY2suZmlyc3RQYWNrZXQpOworCQl0eCA9IGF0b21pY19yZWFkKCZjYWxsLT5zZXF1ZW5jZSk7CisKKwkJX3Byb3RvKCJSeCBBQ0sgJSUldSB7IG09JWh1IGY9IyV1IHA9IyV1IHM9JSUldSByPSVzIG49JXUgfSIsCisJCSAgICAgICBsYXRlc3QsCisJCSAgICAgICBudG9ocyhhY2subWF4U2tldyksCisJCSAgICAgICBoYXJkLAorCQkgICAgICAgbnRvaGwoYWNrLnByZXZpb3VzUGFja2V0KSwKKwkJICAgICAgIG50b2hsKGFjay5zZXJpYWwpLAorCQkgICAgICAgcnhycGNfYWNrc1thY2sucmVhc29uXSwKKwkJICAgICAgIGFjay5uQWNrcyk7CisKKwkJaWYgKGFjay5yZWFzb24gPT0gUlhSUENfQUNLX1BJTkcpIHsKKwkJCV9wcm90bygiUnggQUNLICUlJXUgUElORyBSZXF1ZXN0IiwgbGF0ZXN0KTsKKwkJCXJ4cnBjX3Byb3Bvc2VfQUNLKGNhbGwsIFJYUlBDX0FDS19QSU5HX1JFU1BPTlNFLAorCQkJCQkgIHNwLT5oZHIuc2VyaWFsLCB0cnVlKTsKKwkJfQorCisJCS8qIGRpc2NhcmQgYW55IG91dC1vZi1vcmRlciBvciBkdXBsaWNhdGUgQUNLcyAqLworCQlpZiAobGF0ZXN0IC0gY2FsbC0+YWNrc19sYXRlc3QgPD0gMCkgeworCQkJX2RlYnVnKCJkaXNjYXJkIEFDSyAlZCA8PSAlZCIsCisJCQkgICAgICAgbGF0ZXN0LCBjYWxsLT5hY2tzX2xhdGVzdCk7CisJCQlnb3RvIGRpc2NhcmQ7CisJCX0KKwkJY2FsbC0+YWNrc19sYXRlc3QgPSBsYXRlc3Q7CisKKwkJaWYgKGNhbGwtPnN0YXRlICE9IFJYUlBDX0NBTExfQ0xJRU5UX1NFTkRfUkVRVUVTVCAmJgorCQkgICAgY2FsbC0+c3RhdGUgIT0gUlhSUENfQ0FMTF9DTElFTlRfQVdBSVRfUkVQTFkgJiYKKwkJICAgIGNhbGwtPnN0YXRlICE9IFJYUlBDX0NBTExfU0VSVkVSX1NFTkRfUkVQTFkgJiYKKwkJICAgIGNhbGwtPnN0YXRlICE9IFJYUlBDX0NBTExfU0VSVkVSX0FXQUlUX0FDSykKKwkJCWdvdG8gZGlzY2FyZDsKKworCQlfZGVidWcoIlR4PSVkIEg9JXUgUz0lZCIsIHR4LCBjYWxsLT5hY2tzX2hhcmQsIGNhbGwtPnN0YXRlKTsKKworCQlpZiAoaGFyZCA+IDApIHsKKwkJCWlmIChoYXJkIC0gMSA+IHR4KSB7CisJCQkJX2RlYnVnKCJoYXJkLUFDSydkIHBhY2tldCAlZCBub3QgdHJhbnNtaXR0ZWQiCisJCQkJICAgICAgICIgKCVkIHRvcCkiLAorCQkJCSAgICAgICBoYXJkIC0gMSwgdHgpOworCQkJCWdvdG8gcHJvdG9jb2xfZXJyb3I7CisJCQl9CisKKwkJCWlmICgoY2FsbC0+c3RhdGUgPT0gUlhSUENfQ0FMTF9DTElFTlRfQVdBSVRfUkVQTFkgfHwKKwkJCSAgICAgY2FsbC0+c3RhdGUgPT0gUlhSUENfQ0FMTF9TRVJWRVJfQVdBSVRfQUNLKSAmJgorCQkJICAgIGhhcmQgPiB0eCkKKwkJCQlnb3RvIGFsbF9hY2tlZDsKKworCQkJc21wX3JtYigpOworCQkJcnhycGNfcm90YXRlX3R4X3dpbmRvdyhjYWxsLCBoYXJkIC0gMSk7CisJCX0KKworCQlpZiAoYWNrLm5BY2tzID4gMCkgeworCQkJaWYgKGhhcmQgLSAxICsgYWNrLm5BY2tzID4gdHgpIHsKKwkJCQlfZGVidWcoInNvZnQtQUNLJ2QgcGFja2V0ICVkKyVkIG5vdCIKKwkJCQkgICAgICAgIiB0cmFuc21pdHRlZCAoJWQgdG9wKSIsCisJCQkJICAgICAgIGhhcmQgLSAxLCBhY2subkFja3MsIHR4KTsKKwkJCQlnb3RvIHByb3RvY29sX2Vycm9yOworCQkJfQorCisJCQlpZiAocnhycGNfcHJvY2Vzc19zb2Z0X0FDS3MoY2FsbCwgJmFjaywgc2tiKSA8IDApCisJCQkJZ290byBwcm90b2NvbF9lcnJvcjsKKwkJfQorCQlnb3RvIGRpc2NhcmQ7CisKKwkJLyogY29tcGxldGUgQUNLIHRvIHByb2Nlc3MgKi8KKwljYXNlIFJYUlBDX1BBQ0tFVF9UWVBFX0FDS0FMTDoKKwkJZ290byBhbGxfYWNrZWQ7CisKKwkJLyogYWJvcnQgYW5kIGJ1c3kgYXJlIGhhbmRsZWQgZWxzZXdoZXJlICovCisJY2FzZSBSWFJQQ19QQUNLRVRfVFlQRV9CVVNZOgorCWNhc2UgUlhSUENfUEFDS0VUX1RZUEVfQUJPUlQ6CisJCUJVRygpOworCisJCS8qIGNvbm5lY3Rpb24gbGV2ZWwgZXZlbnRzIC0gYWxzbyBoYW5kbGVkIGVsc2V3aGVyZSAqLworCWNhc2UgUlhSUENfUEFDS0VUX1RZUEVfQ0hBTExFTkdFOgorCWNhc2UgUlhSUENfUEFDS0VUX1RZUEVfUkVTUE9OU0U6CisJY2FzZSBSWFJQQ19QQUNLRVRfVFlQRV9ERUJVRzoKKwkJQlVHKCk7CisJfQorCisJLyogaWYgd2UndmUgaGFkIGEgaGFyZCBBQ0sgdGhhdCBjb3ZlcnMgYWxsIHRoZSBwYWNrZXRzIHdlJ3ZlIHNlbnQsIHRoZW4KKwkgKiB0aGF0IGVuZHMgdGhhdCBwaGFzZSBvZiB0aGUgb3BlcmF0aW9uICovCithbGxfYWNrZWQ6CisJd3JpdGVfbG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7CisJX2RlYnVnKCJhY2sgYWxsICVkIiwgY2FsbC0+c3RhdGUpOworCisJc3dpdGNoIChjYWxsLT5zdGF0ZSkgeworCWNhc2UgUlhSUENfQ0FMTF9DTElFTlRfQVdBSVRfUkVQTFk6CisJCWNhbGwtPnN0YXRlID0gUlhSUENfQ0FMTF9DTElFTlRfUkVDVl9SRVBMWTsKKwkJYnJlYWs7CisJY2FzZSBSWFJQQ19DQUxMX1NFUlZFUl9BV0FJVF9BQ0s6CisJCV9kZWJ1Zygic3J2IGNvbXBsZXRlIik7CisJCWNhbGwtPnN0YXRlID0gUlhSUENfQ0FMTF9DT01QTEVURTsKKwkJcG9zdF9BQ0sgPSB0cnVlOworCQlicmVhazsKKwljYXNlIFJYUlBDX0NBTExfQ0xJRU5UX1NFTkRfUkVRVUVTVDoKKwljYXNlIFJYUlBDX0NBTExfU0VSVkVSX1JFQ1ZfUkVRVUVTVDoKKwkJZ290byBwcm90b2NvbF9lcnJvcl91bmxvY2s7IC8qIGNhbid0IG9jY3VyIHlldCAqLworCWRlZmF1bHQ6CisJCXdyaXRlX3VubG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7CisJCWdvdG8gZGlzY2FyZDsgLyogYXNzdW1lIHBhY2tldCBsZWZ0IG92ZXIgZnJvbSBlYXJsaWVyIHBoYXNlICovCisJfQorCisJd3JpdGVfdW5sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKKworCS8qIGlmIGFsbCB0aGUgcGFja2V0cyB3ZSBzZW50IGFyZSBoYXJkLUFDSydkLCB0aGVuIHdlIGNhbiBkaXNjYXJkCisJICogd2hhdGV2ZXIgd2UndmUgZ290IGxlZnQgKi8KKwlfZGVidWcoImNsZWFyIFR4ICVkIiwKKwkgICAgICAgQ0lSQ19DTlQoY2FsbC0+YWNrc19oZWFkLCBjYWxsLT5hY2tzX3RhaWwsIGNhbGwtPmFja3Nfd2luc3opKTsKKworCWRlbF90aW1lcl9zeW5jKCZjYWxsLT5yZXNlbmRfdGltZXIpOworCWNsZWFyX2JpdChSWFJQQ19DQUxMX1JVTl9SVElNRVIsICZjYWxsLT5mbGFncyk7CisJY2xlYXJfYml0KFJYUlBDX0NBTExfUkVTRU5EX1RJTUVSLCAmY2FsbC0+ZXZlbnRzKTsKKworCWlmIChjYWxsLT5hY2tzX3dpbmRvdykKKwkJcnhycGNfemFwX3R4X3dpbmRvdyhjYWxsKTsKKworCWlmIChwb3N0X0FDSykgeworCQkvKiBwb3N0IHRoZSBmaW5hbCBBQ0sgbWVzc2FnZSBmb3IgdXNlcnNwYWNlIHRvIHBpY2sgdXAgKi8KKwkJX2RlYnVnKCJwb3N0IEFDSyIpOworCQlza2ItPm1hcmsgPSBSWFJQQ19TS0JfTUFSS19GSU5BTF9BQ0s7CisJCXNwLT5jYWxsID0gY2FsbDsKKwkJcnhycGNfZ2V0X2NhbGwoY2FsbCk7CisJCXNwaW5fbG9ja19iaCgmY2FsbC0+bG9jayk7CisJCWlmIChyeHJwY19xdWV1ZV9yY3Zfc2tiKGNhbGwsIHNrYiwgdHJ1ZSwgdHJ1ZSkgPCAwKQorCQkJQlVHKCk7CisJCXNwaW5fdW5sb2NrX2JoKCZjYWxsLT5sb2NrKTsKKwkJZ290byBwcm9jZXNzX2Z1cnRoZXI7CisJfQorCitkaXNjYXJkOgorCXJ4cnBjX2ZyZWVfc2tiKHNrYik7CisJZ290byBwcm9jZXNzX2Z1cnRoZXI7CisKK3Byb3RvY29sX2Vycm9yX3VubG9jazoKKwl3cml0ZV91bmxvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOworcHJvdG9jb2xfZXJyb3I6CisJcnhycGNfZnJlZV9za2Ioc2tiKTsKKwlfbGVhdmUoIiA9IC1FUFJPVE8iKTsKKwlyZXR1cm4gLUVQUk9UTzsKK30KKworLyoKKyAqIHBvc3QgYSBtZXNzYWdlIHRvIHRoZSBzb2NrZXQgUnggcXVldWUgZm9yIHJlY3Ztc2coKSB0byBwaWNrIHVwCisgKi8KK3N0YXRpYyBpbnQgcnhycGNfcG9zdF9tZXNzYWdlKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLCB1MzIgbWFyaywgdTMyIGVycm9yLAorCQkJICAgICAgYm9vbCBmYXRhbCkKK3sKKwlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwOworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IHJldDsKKworCV9lbnRlcigieyVkLCVseH0sJXUsJXUsJWQiLAorCSAgICAgICBjYWxsLT5kZWJ1Z19pZCwgY2FsbC0+ZmxhZ3MsIG1hcmssIGVycm9yLCBmYXRhbCk7CisKKwkvKiByZW1vdmUgdGltZXJzIGFuZCB0aGluZ3MgZm9yIGZhdGFsIG1lc3NhZ2VzICovCisJaWYgKGZhdGFsKSB7CisJCWRlbF90aW1lcl9zeW5jKCZjYWxsLT5yZXNlbmRfdGltZXIpOworCQlkZWxfdGltZXJfc3luYygmY2FsbC0+YWNrX3RpbWVyKTsKKwkJY2xlYXJfYml0KFJYUlBDX0NBTExfUlVOX1JUSU1FUiwgJmNhbGwtPmZsYWdzKTsKKwl9CisKKwlpZiAobWFyayAhPSBSWFJQQ19TS0JfTUFSS19ORVdfQ0FMTCAmJgorCSAgICAhdGVzdF9iaXQoUlhSUENfQ0FMTF9IQVNfVVNFUklELCAmY2FsbC0+ZmxhZ3MpKSB7CisJCV9sZWF2ZSgiW25vIHVzZXJpZF0iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCF0ZXN0X2JpdChSWFJQQ19DQUxMX1RFUk1JTkFMX01TRywgJmNhbGwtPmZsYWdzKSkgeworCQlza2IgPSBhbGxvY19za2IoMCwgR0ZQX05PRlMpOworCQlpZiAoIXNrYikKKwkJCXJldHVybiAtRU5PTUVNOworCisJCXJ4cnBjX25ld19za2Ioc2tiKTsKKworCQlza2ItPm1hcmsgPSBtYXJrOworCisJCXNwID0gcnhycGNfc2tiKHNrYik7CisJCW1lbXNldChzcCwgMCwgc2l6ZW9mKCpzcCkpOworCQlzcC0+ZXJyb3IgPSBlcnJvcjsKKwkJc3AtPmNhbGwgPSBjYWxsOworCQlyeHJwY19nZXRfY2FsbChjYWxsKTsKKworCQlzcGluX2xvY2tfYmgoJmNhbGwtPmxvY2spOworCQlyZXQgPSByeHJwY19xdWV1ZV9yY3Zfc2tiKGNhbGwsIHNrYiwgdHJ1ZSwgZmF0YWwpOworCQlzcGluX3VubG9ja19iaCgmY2FsbC0+bG9jayk7CisJCWlmIChyZXQgPCAwKQorCQkJQlVHKCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBoYW5kbGUgYmFja2dyb3VuZCBwcm9jZXNzaW5nIG9mIGluY29taW5nIGNhbGwgcGFja2V0cyBhbmQgQUNLIC8gYWJvcnQKKyAqIGdlbmVyYXRpb24KKyAqLwordm9pZCByeHJwY19wcm9jZXNzX2NhbGwoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCByeHJwY19jYWxsICpjYWxsID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCByeHJwY19jYWxsLCBwcm9jZXNzb3IpOworCXN0cnVjdCByeHJwY19hY2twYWNrZXQgYWNrOworCXN0cnVjdCByeHJwY19hY2tpbmZvIGFja2luZm87CisJc3RydWN0IHJ4cnBjX2hlYWRlciBoZHI7CisJc3RydWN0IG1zZ2hkciBtc2c7CisJc3RydWN0IGt2ZWMgaW92WzVdOworCXVuc2lnbmVkIGxvbmcgYml0czsKKwlfX2JlMzIgZGF0YTsKKwlzaXplX3QgbGVuOworCWludCBnZW5iaXQsIGxvb3AsIG5iaXQsIGlvYywgcmV0OworCXUzMiBhYm9ydF9jb2RlID0gUlhfUFJPVE9DT0xfRVJST1I7CisJdTggKmFja3MgPSBOVUxMOworCisJLy9wcmludGsoIlxuLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCV9lbnRlcigieyVkLCVzLCVseH0gWyVsdV0iLAorCSAgICAgICBjYWxsLT5kZWJ1Z19pZCwgcnhycGNfY2FsbF9zdGF0ZXNbY2FsbC0+c3RhdGVdLCBjYWxsLT5ldmVudHMsCisJICAgICAgIChqaWZmaWVzIC0gY2FsbC0+Y3JlYXRpb25famlmKSAvIChIWiAvIDEwKSk7CisKKwlpZiAodGVzdF9hbmRfc2V0X2JpdChSWFJQQ19DQUxMX1BST0NfQlVTWSwgJmNhbGwtPmZsYWdzKSkgeworCQlfZGVidWcoIlhYWFhYWFhYWFhYWFggUlVOTklORyBPTiBNVUxUSVBMRSBDUFVTIFhYWFhYWFhYWFhYWFgiKTsKKwkJcmV0dXJuOworCX0KKworCS8qIHRoZXJlJ3MgYSBnb29kIGNoYW5jZSB3ZSdyZSBnb2luZyB0byBoYXZlIHRvIHNlbmQgYSBtZXNzYWdlLCBzbyBzZXQKKwkgKiBvbmUgdXAgaW4gYWR2YW5jZSAqLworCW1zZy5tc2dfbmFtZQk9ICZjYWxsLT5jb25uLT50cmFucy0+cGVlci0+c3J4LnRyYW5zcG9ydC5zaW47CisJbXNnLm1zZ19uYW1lbGVuCT0gc2l6ZW9mKGNhbGwtPmNvbm4tPnRyYW5zLT5wZWVyLT5zcngudHJhbnNwb3J0LnNpbik7CisJbXNnLm1zZ19jb250cm9sCT0gTlVMTDsKKwltc2cubXNnX2NvbnRyb2xsZW4gPSAwOworCW1zZy5tc2dfZmxhZ3MJPSAwOworCisJaGRyLmVwb2NoCT0gY2FsbC0+Y29ubi0+ZXBvY2g7CisJaGRyLmNpZAkJPSBjYWxsLT5jaWQ7CisJaGRyLmNhbGxOdW1iZXIJPSBjYWxsLT5jYWxsX2lkOworCWhkci5zZXEJCT0gMDsKKwloZHIudHlwZQk9IFJYUlBDX1BBQ0tFVF9UWVBFX0FDSzsKKwloZHIuZmxhZ3MJPSBjYWxsLT5jb25uLT5vdXRfY2xpZW50ZmxhZzsKKwloZHIudXNlclN0YXR1cwk9IDA7CisJaGRyLnNlY3VyaXR5SW5kZXggPSBjYWxsLT5jb25uLT5zZWN1cml0eV9peDsKKwloZHIuX3JzdmQJPSAwOworCWhkci5zZXJ2aWNlSWQJPSBjYWxsLT5jb25uLT5zZXJ2aWNlX2lkOworCisJbWVtc2V0KGlvdiwgMCwgc2l6ZW9mKGlvdikpOworCWlvdlswXS5pb3ZfYmFzZQk9ICZoZHI7CisJaW92WzBdLmlvdl9sZW4JPSBzaXplb2YoaGRyKTsKKworCS8qIGRlYWwgd2l0aCBldmVudHMgb2YgYSBmaW5hbCBuYXR1cmUgKi8KKwlpZiAodGVzdF9iaXQoUlhSUENfQ0FMTF9SRUxFQVNFLCAmY2FsbC0+ZXZlbnRzKSkgeworCQlyeHJwY19yZWxlYXNlX2NhbGwoY2FsbCk7CisJCWNsZWFyX2JpdChSWFJQQ19DQUxMX1JFTEVBU0UsICZjYWxsLT5ldmVudHMpOworCX0KKworCWlmICh0ZXN0X2JpdChSWFJQQ19DQUxMX1JDVkRfRVJST1IsICZjYWxsLT5ldmVudHMpKSB7CisJCWludCBlcnJvcjsKKworCQljbGVhcl9iaXQoUlhSUENfQ0FMTF9DT05OX0FCT1JULCAmY2FsbC0+ZXZlbnRzKTsKKwkJY2xlYXJfYml0KFJYUlBDX0NBTExfUkVKRUNUX0JVU1ksICZjYWxsLT5ldmVudHMpOworCQljbGVhcl9iaXQoUlhSUENfQ0FMTF9BQk9SVCwgJmNhbGwtPmV2ZW50cyk7CisKKwkJZXJyb3IgPSBjYWxsLT5jb25uLT50cmFucy0+cGVlci0+bmV0X2Vycm9yOworCQlfZGVidWcoInBvc3QgbmV0IGVycm9yICVkIiwgZXJyb3IpOworCisJCWlmIChyeHJwY19wb3N0X21lc3NhZ2UoY2FsbCwgUlhSUENfU0tCX01BUktfTkVUX0VSUk9SLAorCQkJCSAgICAgICBlcnJvciwgdHJ1ZSkgPCAwKQorCQkJZ290byBub19tZW07CisJCWNsZWFyX2JpdChSWFJQQ19DQUxMX1JDVkRfRVJST1IsICZjYWxsLT5ldmVudHMpOworCQlnb3RvIGtpbGxfQUNLczsKKwl9CisKKwlpZiAodGVzdF9iaXQoUlhSUENfQ0FMTF9DT05OX0FCT1JULCAmY2FsbC0+ZXZlbnRzKSkgeworCQlBU1NFUlRDTVAoY2FsbC0+c3RhdGUsID4sIFJYUlBDX0NBTExfQ09NUExFVEUpOworCisJCWNsZWFyX2JpdChSWFJQQ19DQUxMX1JFSkVDVF9CVVNZLCAmY2FsbC0+ZXZlbnRzKTsKKwkJY2xlYXJfYml0KFJYUlBDX0NBTExfQUJPUlQsICZjYWxsLT5ldmVudHMpOworCisJCV9kZWJ1ZygicG9zdCBjb25uIGFib3J0Iik7CisKKwkJaWYgKHJ4cnBjX3Bvc3RfbWVzc2FnZShjYWxsLCBSWFJQQ19TS0JfTUFSS19MT0NBTF9FUlJPUiwKKwkJCQkgICAgICAgY2FsbC0+Y29ubi0+ZXJyb3IsIHRydWUpIDwgMCkKKwkJCWdvdG8gbm9fbWVtOworCQljbGVhcl9iaXQoUlhSUENfQ0FMTF9DT05OX0FCT1JULCAmY2FsbC0+ZXZlbnRzKTsKKwkJZ290byBraWxsX0FDS3M7CisJfQorCisJaWYgKHRlc3RfYml0KFJYUlBDX0NBTExfUkVKRUNUX0JVU1ksICZjYWxsLT5ldmVudHMpKSB7CisJCWhkci50eXBlID0gUlhSUENfUEFDS0VUX1RZUEVfQlVTWTsKKwkJZ2VuYml0ID0gUlhSUENfQ0FMTF9SRUpFQ1RfQlVTWTsKKwkJZ290byBzZW5kX21lc3NhZ2U7CisJfQorCisJaWYgKHRlc3RfYml0KFJYUlBDX0NBTExfQUJPUlQsICZjYWxsLT5ldmVudHMpKSB7CisJCUFTU0VSVENNUChjYWxsLT5zdGF0ZSwgPiwgUlhSUENfQ0FMTF9DT01QTEVURSk7CisKKwkJaWYgKHJ4cnBjX3Bvc3RfbWVzc2FnZShjYWxsLCBSWFJQQ19TS0JfTUFSS19MT0NBTF9FUlJPUiwKKwkJCQkgICAgICAgRUNPTk5BQk9SVEVELCB0cnVlKSA8IDApCisJCQlnb3RvIG5vX21lbTsKKwkJaGRyLnR5cGUgPSBSWFJQQ19QQUNLRVRfVFlQRV9BQk9SVDsKKwkJZGF0YSA9IGh0b25sKGNhbGwtPmFib3J0X2NvZGUpOworCQlpb3ZbMV0uaW92X2Jhc2UgPSAmZGF0YTsKKwkJaW92WzFdLmlvdl9sZW4gPSBzaXplb2YoZGF0YSk7CisJCWdlbmJpdCA9IFJYUlBDX0NBTExfQUJPUlQ7CisJCWdvdG8gc2VuZF9tZXNzYWdlOworCX0KKworCWlmICh0ZXN0X2JpdChSWFJQQ19DQUxMX0FDS19GSU5BTCwgJmNhbGwtPmV2ZW50cykpIHsKKwkJaGRyLnR5cGUgPSBSWFJQQ19QQUNLRVRfVFlQRV9BQ0tBTEw7CisJCWdlbmJpdCA9IFJYUlBDX0NBTExfQUNLX0ZJTkFMOworCQlnb3RvIHNlbmRfbWVzc2FnZTsKKwl9CisKKwlpZiAoY2FsbC0+ZXZlbnRzICYgKCgxIDw8IFJYUlBDX0NBTExfUkNWRF9CVVNZKSB8CisJCQkgICAgKDEgPDwgUlhSUENfQ0FMTF9SQ1ZEX0FCT1JUKSkKKwkgICAgKSB7CisJCXUzMiBtYXJrOworCisJCWlmICh0ZXN0X2JpdChSWFJQQ19DQUxMX1JDVkRfQUJPUlQsICZjYWxsLT5ldmVudHMpKQorCQkJbWFyayA9IFJYUlBDX1NLQl9NQVJLX1JFTU9URV9BQk9SVDsKKwkJZWxzZQorCQkJbWFyayA9IFJYUlBDX1NLQl9NQVJLX0JVU1k7CisKKwkJX2RlYnVnKCJwb3N0IGFib3J0L2J1c3kiKTsKKwkJcnhycGNfY2xlYXJfdHhfd2luZG93KGNhbGwpOworCQlpZiAocnhycGNfcG9zdF9tZXNzYWdlKGNhbGwsIG1hcmssIEVDT05OQUJPUlRFRCwgdHJ1ZSkgPCAwKQorCQkJZ290byBub19tZW07CisKKwkJY2xlYXJfYml0KFJYUlBDX0NBTExfUkNWRF9CVVNZLCAmY2FsbC0+ZXZlbnRzKTsKKwkJY2xlYXJfYml0KFJYUlBDX0NBTExfUkNWRF9BQk9SVCwgJmNhbGwtPmV2ZW50cyk7CisJCWdvdG8ga2lsbF9BQ0tzOworCX0KKworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoUlhSUENfQ0FMTF9SQ1ZEX0FDS0FMTCwgJmNhbGwtPmV2ZW50cykpIHsKKwkJX2RlYnVnKCJkbyBpbXBsaWNpdCBhY2thbGwiKTsKKwkJcnhycGNfY2xlYXJfdHhfd2luZG93KGNhbGwpOworCX0KKworCWlmICh0ZXN0X2JpdChSWFJQQ19DQUxMX0xJRkVfVElNRVIsICZjYWxsLT5ldmVudHMpKSB7CisJCXdyaXRlX2xvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOworCQlpZiAoY2FsbC0+c3RhdGUgPD0gUlhSUENfQ0FMTF9DT01QTEVURSkgeworCQkJY2FsbC0+c3RhdGUgPSBSWFJQQ19DQUxMX0xPQ0FMTFlfQUJPUlRFRDsKKwkJCWNhbGwtPmFib3J0X2NvZGUgPSBSWF9DQUxMX1RJTUVPVVQ7CisJCQlzZXRfYml0KFJYUlBDX0NBTExfQUJPUlQsICZjYWxsLT5ldmVudHMpOworCQl9CisJCXdyaXRlX3VubG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7CisKKwkJX2RlYnVnKCJwb3N0IHRpbWVvdXQiKTsKKwkJaWYgKHJ4cnBjX3Bvc3RfbWVzc2FnZShjYWxsLCBSWFJQQ19TS0JfTUFSS19MT0NBTF9FUlJPUiwKKwkJCQkgICAgICAgRVRJTUUsIHRydWUpIDwgMCkKKwkJCWdvdG8gbm9fbWVtOworCisJCWNsZWFyX2JpdChSWFJQQ19DQUxMX0xJRkVfVElNRVIsICZjYWxsLT5ldmVudHMpOworCQlnb3RvIGtpbGxfQUNLczsKKwl9CisKKwkvKiBkZWFsIHdpdGggYXNzb3J0ZWQgaW5ib3VuZCBtZXNzYWdlcyAqLworCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZjYWxsLT5yeF9xdWV1ZSkpIHsKKwkJc3dpdGNoIChyeHJwY19wcm9jZXNzX3J4X3F1ZXVlKGNhbGwsICZhYm9ydF9jb2RlKSkgeworCQljYXNlIDA6CisJCWNhc2UgLUVBR0FJTjoKKwkJCWJyZWFrOworCQljYXNlIC1FTk9NRU06CisJCQlnb3RvIG5vX21lbTsKKwkJY2FzZSAtRUtFWUVYUElSRUQ6CisJCWNhc2UgLUVLRVlSRUpFQ1RFRDoKKwkJY2FzZSAtRVBST1RPOgorCQkJcnhycGNfYWJvcnRfY2FsbChjYWxsLCBhYm9ydF9jb2RlKTsKKwkJCWdvdG8ga2lsbF9BQ0tzOworCQl9CisJfQorCisJLyogaGFuZGxlIHJlc2VuZGluZyAqLworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoUlhSUENfQ0FMTF9SRVNFTkRfVElNRVIsICZjYWxsLT5ldmVudHMpKQorCQlyeHJwY19yZXNlbmRfdGltZXIoY2FsbCk7CisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChSWFJQQ19DQUxMX1JFU0VORCwgJmNhbGwtPmV2ZW50cykpCisJCXJ4cnBjX3Jlc2VuZChjYWxsKTsKKworCS8qIGNvbnNpZGVyIHNlbmRpbmcgYW4gb3JkaW5hcnkgQUNLICovCisJaWYgKHRlc3RfYml0KFJYUlBDX0NBTExfQUNLLCAmY2FsbC0+ZXZlbnRzKSkgeworCQlfX2JlMzIgcGFkOworCisJCV9kZWJ1Zygic2VuZCBBQ0s6IHdpbmRvdzogJWQgLSAlZCB7ICVseCB9IiwKKwkJICAgICAgIGNhbGwtPnJ4X2RhdGFfZWF0ZW4sIGNhbGwtPmFja3Jfd2luX3RvcCwKKwkJICAgICAgIGNhbGwtPmFja3Jfd2luZG93WzBdKTsKKworCQlpZiAoY2FsbC0+c3RhdGUgPiBSWFJQQ19DQUxMX1NFUlZFUl9BQ0tfUkVRVUVTVCAmJgorCQkgICAgY2FsbC0+YWNrcl9yZWFzb24gIT0gUlhSUENfQUNLX1BJTkdfUkVTUE9OU0UpIHsKKwkJCS8qIEFDSyBieSBzZW5kaW5nIHJlcGx5IERBVEEgcGFja2V0IGluIHRoaXMgc3RhdGUgKi8KKwkJCWNsZWFyX2JpdChSWFJQQ19DQUxMX0FDSywgJmNhbGwtPmV2ZW50cyk7CisJCQlnb3RvIG1heWJlX3Jlc2NoZWR1bGU7CisJCX0KKworCQlnZW5iaXQgPSBSWFJQQ19DQUxMX0FDSzsKKworCQlhY2tzID0ga3phbGxvYyhjYWxsLT5hY2tyX3dpbl90b3AgLSBjYWxsLT5yeF9kYXRhX2VhdGVuLAorCQkJICAgICAgIEdGUF9OT0ZTKTsKKwkJaWYgKCFhY2tzKQorCQkJZ290byBub19tZW07CisKKwkJLy9oZHIuZmxhZ3MJPSBSWFJQQ19TTE9XX1NUQVJUX09LOworCQlhY2suYnVmZmVyU3BhY2UJPSBodG9ucyg4KTsKKwkJYWNrLm1heFNrZXcJPSAwOworCQlhY2suc2VyaWFsCT0gMDsKKwkJYWNrLnJlYXNvbgk9IDA7CisKKwkJYWNraW5mby5yeE1UVQk9IGh0b25sKDU2OTIpOworLy8JCWFja2luZm8ucnhNVFUJPSBodG9ubChjYWxsLT5jb25uLT50cmFucy0+cGVlci0+bWF4ZGF0YSk7CisJCWFja2luZm8ubWF4TVRVCT0gaHRvbmwoY2FsbC0+Y29ubi0+dHJhbnMtPnBlZXItPm1heGRhdGEpOworCQlhY2tpbmZvLnJ3aW5kCT0gaHRvbmwoMzIpOworCQlhY2tpbmZvLmp1bWJvX21heCA9IGh0b25sKDQpOworCisJCXNwaW5fbG9ja19iaCgmY2FsbC0+bG9jayk7CisJCWFjay5yZWFzb24gPSBjYWxsLT5hY2tyX3JlYXNvbjsKKwkJYWNrLnNlcmlhbCA9IGNhbGwtPmFja3Jfc2VyaWFsOworCQlhY2sucHJldmlvdXNQYWNrZXQgPSBjYWxsLT5hY2tyX3ByZXZfc2VxOworCQlhY2suZmlyc3RQYWNrZXQgPSBodG9ubChjYWxsLT5yeF9kYXRhX2VhdGVuICsgMSk7CisKKwkJYWNrLm5BY2tzID0gMDsKKwkJZm9yIChsb29wID0gMDsgbG9vcCA8IFJYUlBDX0FDS1JfV0lORE9XX0FTWjsgbG9vcCsrKSB7CisJCQluYml0ID0gbG9vcCAqIEJJVFNfUEVSX0xPTkc7CisJCQlmb3IgKGJpdHMgPSBjYWxsLT5hY2tyX3dpbmRvd1tsb29wXTsgYml0czsgYml0cyA+Pj0gMQorCQkJICAgICApIHsKKwkJCQlfZGVidWcoIi0gbD0lZCBuPSVkIGI9JWx4IiwgbG9vcCwgbmJpdCwgYml0cyk7CisJCQkJaWYgKGJpdHMgJiAxKSB7CisJCQkJCWFja3NbbmJpdF0gPSBSWFJQQ19BQ0tfVFlQRV9BQ0s7CisJCQkJCWFjay5uQWNrcyA9IG5iaXQgKyAxOworCQkJCX0KKwkJCQluYml0Kys7CisJCQl9CisJCX0KKwkJY2FsbC0+YWNrcl9yZWFzb24gPSAwOworCQlzcGluX3VubG9ja19iaCgmY2FsbC0+bG9jayk7CisKKwkJcGFkID0gMDsKKworCQlpb3ZbMV0uaW92X2Jhc2UgPSAmYWNrOworCQlpb3ZbMV0uaW92X2xlbgk9IHNpemVvZihhY2spOworCQlpb3ZbMl0uaW92X2Jhc2UgPSBhY2tzOworCQlpb3ZbMl0uaW92X2xlbgk9IGFjay5uQWNrczsKKwkJaW92WzNdLmlvdl9iYXNlID0gJnBhZDsKKwkJaW92WzNdLmlvdl9sZW4JPSAzOworCQlpb3ZbNF0uaW92X2Jhc2UgPSAmYWNraW5mbzsKKwkJaW92WzRdLmlvdl9sZW4JPSBzaXplb2YoYWNraW5mbyk7CisKKwkJc3dpdGNoIChhY2sucmVhc29uKSB7CisJCWNhc2UgUlhSUENfQUNLX1JFUVVFU1RFRDoKKwkJY2FzZSBSWFJQQ19BQ0tfRFVQTElDQVRFOgorCQljYXNlIFJYUlBDX0FDS19PVVRfT0ZfU0VRVUVOQ0U6CisJCWNhc2UgUlhSUENfQUNLX0VYQ0VFRFNfV0lORE9XOgorCQljYXNlIFJYUlBDX0FDS19OT1NQQUNFOgorCQljYXNlIFJYUlBDX0FDS19QSU5HOgorCQljYXNlIFJYUlBDX0FDS19QSU5HX1JFU1BPTlNFOgorCQkJZ290byBzZW5kX0FDS193aXRoX3NrZXc7CisJCWNhc2UgUlhSUENfQUNLX0RFTEFZOgorCQljYXNlIFJYUlBDX0FDS19JRExFOgorCQkJZ290byBzZW5kX0FDSzsKKwkJfQorCX0KKworCS8qIGhhbmRsZSBjb21wbGV0aW9uIG9mIHNlY3VyaXR5IG5lZ290aWF0aW9ucyBvbiBhbiBpbmNvbWluZworCSAqIGNvbm5lY3Rpb24gKi8KKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFJYUlBDX0NBTExfU0VDVVJFRCwgJmNhbGwtPmV2ZW50cykpIHsKKwkJX2RlYnVnKCJzZWN1cmVkIik7CisJCXNwaW5fbG9ja19iaCgmY2FsbC0+bG9jayk7CisKKwkJaWYgKGNhbGwtPnN0YXRlID09IFJYUlBDX0NBTExfU0VSVkVSX1NFQ1VSSU5HKSB7CisJCQlfZGVidWcoInNlY3VyaW5nIik7CisJCQl3cml0ZV9sb2NrKCZjYWxsLT5jb25uLT5sb2NrKTsKKwkJCWlmICghdGVzdF9iaXQoUlhSUENfQ0FMTF9SRUxFQVNFRCwgJmNhbGwtPmZsYWdzKSAmJgorCQkJICAgICF0ZXN0X2JpdChSWFJQQ19DQUxMX1JFTEVBU0UsICZjYWxsLT5ldmVudHMpKSB7CisJCQkJX2RlYnVnKCJub3QgcmVsZWFzZWQiKTsKKwkJCQljYWxsLT5zdGF0ZSA9IFJYUlBDX0NBTExfU0VSVkVSX0FDQ0VQVElORzsKKwkJCQlsaXN0X21vdmVfdGFpbCgmY2FsbC0+YWNjZXB0X2xpbmssCisJCQkJCSAgICAgICAmY2FsbC0+c29ja2V0LT5hY2NlcHRxKTsKKwkJCX0KKwkJCXdyaXRlX3VubG9jaygmY2FsbC0+Y29ubi0+bG9jayk7CisJCQlyZWFkX2xvY2soJmNhbGwtPnN0YXRlX2xvY2spOworCQkJaWYgKGNhbGwtPnN0YXRlIDwgUlhSUENfQ0FMTF9DT01QTEVURSkKKwkJCQlzZXRfYml0KFJYUlBDX0NBTExfUE9TVF9BQ0NFUFQsICZjYWxsLT5ldmVudHMpOworCQkJcmVhZF91bmxvY2soJmNhbGwtPnN0YXRlX2xvY2spOworCQl9CisKKwkJc3Bpbl91bmxvY2tfYmgoJmNhbGwtPmxvY2spOworCQlpZiAoIXRlc3RfYml0KFJYUlBDX0NBTExfUE9TVF9BQ0NFUFQsICZjYWxsLT5ldmVudHMpKQorCQkJZ290byBtYXliZV9yZXNjaGVkdWxlOworCX0KKworCS8qIHBvc3QgYSBub3RpZmljYXRpb24gb2YgYW4gYWNjZXB0YWJsZSBjb25uZWN0aW9uIHRvIHRoZSBhcHAgKi8KKwlpZiAodGVzdF9iaXQoUlhSUENfQ0FMTF9QT1NUX0FDQ0VQVCwgJmNhbGwtPmV2ZW50cykpIHsKKwkJX2RlYnVnKCJwb3N0IGFjY2VwdCIpOworCQlpZiAocnhycGNfcG9zdF9tZXNzYWdlKGNhbGwsIFJYUlBDX1NLQl9NQVJLX05FV19DQUxMLAorCQkJCSAgICAgICAwLCBmYWxzZSkgPCAwKQorCQkJZ290byBub19tZW07CisJCWNsZWFyX2JpdChSWFJQQ19DQUxMX1BPU1RfQUNDRVBULCAmY2FsbC0+ZXZlbnRzKTsKKwkJZ290byBtYXliZV9yZXNjaGVkdWxlOworCX0KKworCS8qIGhhbmRsZSBpbmNvbWluZyBjYWxsIGFjY2VwdGFuY2UgKi8KKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFJYUlBDX0NBTExfQUNDRVBURUQsICZjYWxsLT5ldmVudHMpKSB7CisJCV9kZWJ1ZygiYWNjZXB0ZWQiKTsKKwkJQVNTRVJUQ01QKGNhbGwtPnJ4X2RhdGFfcG9zdCwgPT0sIDApOworCQljYWxsLT5yeF9kYXRhX3Bvc3QgPSAxOworCQlyZWFkX2xvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOworCQlpZiAoY2FsbC0+c3RhdGUgPCBSWFJQQ19DQUxMX0NPTVBMRVRFKQorCQkJc2V0X2JpdChSWFJQQ19DQUxMX0RSQUlOX1JYX09PUywgJmNhbGwtPmV2ZW50cyk7CisJCXJlYWRfdW5sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKKwl9CisKKwkvKiBkcmFpbiB0aGUgb3V0IG9mIHNlcXVlbmNlIHJlY2VpdmVkIHBhY2tldCBxdWV1ZSBpbnRvIHRoZSBwYWNrZXQgUngKKwkgKiBxdWV1ZSAqLworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoUlhSUENfQ0FMTF9EUkFJTl9SWF9PT1MsICZjYWxsLT5ldmVudHMpKSB7CisJCXdoaWxlIChjYWxsLT5yeF9kYXRhX3Bvc3QgPT0gY2FsbC0+cnhfZmlyc3Rfb29zKQorCQkJaWYgKHJ4cnBjX2RyYWluX3J4X29vc19xdWV1ZShjYWxsKSA8IDApCisJCQkJYnJlYWs7CisJCWdvdG8gbWF5YmVfcmVzY2hlZHVsZTsKKwl9CisKKwkvKiBvdGhlciBldmVudHMgbWF5IGhhdmUgYmVlbiByYWlzZWQgc2luY2Ugd2Ugc3RhcnRlZCBjaGVja2luZyAqLworCWdvdG8gbWF5YmVfcmVzY2hlZHVsZTsKKworc2VuZF9BQ0tfd2l0aF9za2V3OgorCWFjay5tYXhTa2V3ID0gaHRvbnMoYXRvbWljX3JlYWQoJmNhbGwtPmNvbm4tPmhpX3NlcmlhbCkgLQorCQkJICAgIG50b2hsKGFjay5zZXJpYWwpKTsKK3NlbmRfQUNLOgorCWhkci5zZXJpYWwgPSBodG9ubChhdG9taWNfaW5jX3JldHVybigmY2FsbC0+Y29ubi0+c2VyaWFsKSk7CisJX3Byb3RvKCJUeCBBQ0sgJSUldSB7IG09JWh1IGY9IyV1IHA9IyV1IHM9JSUldSByPSVzIG49JXUgfSIsCisJICAgICAgIG50b2hsKGhkci5zZXJpYWwpLAorCSAgICAgICBudG9ocyhhY2subWF4U2tldyksCisJICAgICAgIG50b2hsKGFjay5maXJzdFBhY2tldCksCisJICAgICAgIG50b2hsKGFjay5wcmV2aW91c1BhY2tldCksCisJICAgICAgIG50b2hsKGFjay5zZXJpYWwpLAorCSAgICAgICByeHJwY19hY2tzW2Fjay5yZWFzb25dLAorCSAgICAgICBhY2subkFja3MpOworCisJZGVsX3RpbWVyX3N5bmMoJmNhbGwtPmFja190aW1lcik7CisJaWYgKGFjay5uQWNrcyA+IDApCisJCXNldF9iaXQoUlhSUENfQ0FMTF9UWF9TT0ZUX0FDSywgJmNhbGwtPmZsYWdzKTsKKwlnb3RvIHNlbmRfbWVzc2FnZV8yOworCitzZW5kX21lc3NhZ2U6CisJX2RlYnVnKCJzZW5kIG1lc3NhZ2UiKTsKKworCWhkci5zZXJpYWwgPSBodG9ubChhdG9taWNfaW5jX3JldHVybigmY2FsbC0+Y29ubi0+c2VyaWFsKSk7CisJX3Byb3RvKCJUeCAlcyAlJSV1IiwgcnhycGNfcGt0c1toZHIudHlwZV0sIG50b2hsKGhkci5zZXJpYWwpKTsKK3NlbmRfbWVzc2FnZV8yOgorCisJbGVuID0gaW92WzBdLmlvdl9sZW47CisJaW9jID0gMTsKKwlpZiAoaW92WzRdLmlvdl9sZW4pIHsKKwkJaW9jID0gNTsKKwkJbGVuICs9IGlvdls0XS5pb3ZfbGVuOworCQlsZW4gKz0gaW92WzNdLmlvdl9sZW47CisJCWxlbiArPSBpb3ZbMl0uaW92X2xlbjsKKwkJbGVuICs9IGlvdlsxXS5pb3ZfbGVuOworCX0gZWxzZSBpZiAoaW92WzNdLmlvdl9sZW4pIHsKKwkJaW9jID0gNDsKKwkJbGVuICs9IGlvdlszXS5pb3ZfbGVuOworCQlsZW4gKz0gaW92WzJdLmlvdl9sZW47CisJCWxlbiArPSBpb3ZbMV0uaW92X2xlbjsKKwl9IGVsc2UgaWYgKGlvdlsyXS5pb3ZfbGVuKSB7CisJCWlvYyA9IDM7CisJCWxlbiArPSBpb3ZbMl0uaW92X2xlbjsKKwkJbGVuICs9IGlvdlsxXS5pb3ZfbGVuOworCX0gZWxzZSBpZiAoaW92WzFdLmlvdl9sZW4pIHsKKwkJaW9jID0gMjsKKwkJbGVuICs9IGlvdlsxXS5pb3ZfbGVuOworCX0KKworCXJldCA9IGtlcm5lbF9zZW5kbXNnKGNhbGwtPmNvbm4tPnRyYW5zLT5sb2NhbC0+c29ja2V0LAorCQkJICAgICAmbXNnLCBpb3YsIGlvYywgbGVuKTsKKwlpZiAocmV0IDwgMCkgeworCQlfZGVidWcoInNlbmRtc2cgZmFpbGVkOiAlZCIsIHJldCk7CisJCXJlYWRfbG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7CisJCWlmIChjYWxsLT5zdGF0ZSA8IFJYUlBDX0NBTExfREVBRCkKKwkJCXJ4cnBjX3F1ZXVlX2NhbGwoY2FsbCk7CisJCXJlYWRfdW5sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlzd2l0Y2ggKGdlbmJpdCkgeworCWNhc2UgUlhSUENfQ0FMTF9BQk9SVDoKKwkJY2xlYXJfYml0KGdlbmJpdCwgJmNhbGwtPmV2ZW50cyk7CisJCWNsZWFyX2JpdChSWFJQQ19DQUxMX1JDVkRfQUJPUlQsICZjYWxsLT5ldmVudHMpOworCQlnb3RvIGtpbGxfQUNLczsKKworCWNhc2UgUlhSUENfQ0FMTF9BQ0tfRklOQUw6CisJCXdyaXRlX2xvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOworCQlpZiAoY2FsbC0+c3RhdGUgPT0gUlhSUENfQ0FMTF9DTElFTlRfRklOQUxfQUNLKQorCQkJY2FsbC0+c3RhdGUgPSBSWFJQQ19DQUxMX0NPTVBMRVRFOworCQl3cml0ZV91bmxvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOworCQlnb3RvIGtpbGxfQUNLczsKKworCWRlZmF1bHQ6CisJCWNsZWFyX2JpdChnZW5iaXQsICZjYWxsLT5ldmVudHMpOworCQlzd2l0Y2ggKGNhbGwtPnN0YXRlKSB7CisJCWNhc2UgUlhSUENfQ0FMTF9DTElFTlRfQVdBSVRfUkVQTFk6CisJCWNhc2UgUlhSUENfQ0FMTF9DTElFTlRfUkVDVl9SRVBMWToKKwkJY2FzZSBSWFJQQ19DQUxMX1NFUlZFUl9SRUNWX1JFUVVFU1Q6CisJCWNhc2UgUlhSUENfQ0FMTF9TRVJWRVJfQUNLX1JFUVVFU1Q6CisJCQlfZGVidWcoInN0YXJ0IEFDSyB0aW1lciIpOworCQkJcnhycGNfcHJvcG9zZV9BQ0soY2FsbCwgUlhSUENfQUNLX0RFTEFZLAorCQkJCQkgIGNhbGwtPmFja3Jfc2VyaWFsLCBmYWxzZSk7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCQlnb3RvIG1heWJlX3Jlc2NoZWR1bGU7CisJfQorCitraWxsX0FDS3M6CisJZGVsX3RpbWVyX3N5bmMoJmNhbGwtPmFja190aW1lcik7CisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChSWFJQQ19DQUxMX0FDS19GSU5BTCwgJmNhbGwtPmV2ZW50cykpCisJCXJ4cnBjX3B1dF9jYWxsKGNhbGwpOworCWNsZWFyX2JpdChSWFJQQ19DQUxMX0FDSywgJmNhbGwtPmV2ZW50cyk7CisKK21heWJlX3Jlc2NoZWR1bGU6CisJaWYgKGNhbGwtPmV2ZW50cyB8fCAhc2tiX3F1ZXVlX2VtcHR5KCZjYWxsLT5yeF9xdWV1ZSkpIHsKKwkJcmVhZF9sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKKwkJaWYgKGNhbGwtPnN0YXRlIDwgUlhSUENfQ0FMTF9ERUFEKQorCQkJcnhycGNfcXVldWVfY2FsbChjYWxsKTsKKwkJcmVhZF91bmxvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOworCX0KKworCS8qIGRvbid0IGxlYXZlIGFib3J0ZWQgY29ubmVjdGlvbnMgb24gdGhlIGFjY2VwdCBxdWV1ZSAqLworCWlmIChjYWxsLT5zdGF0ZSA+PSBSWFJQQ19DQUxMX0NPTVBMRVRFICYmCisJICAgICFsaXN0X2VtcHR5KCZjYWxsLT5hY2NlcHRfbGluaykpIHsKKwkJX2RlYnVnKCJYIHVubGlua2luZyBvbmNlLXBlbmRpbmcgY2FsbCAlcCB7IGU9JWx4IGY9JWx4IGM9JXggfSIsCisJCSAgICAgICBjYWxsLCBjYWxsLT5ldmVudHMsIGNhbGwtPmZsYWdzLAorCQkgICAgICAgbnRvaGwoY2FsbC0+Y29ubi0+Y2lkKSk7CisKKwkJcmVhZF9sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKKwkJaWYgKCF0ZXN0X2JpdChSWFJQQ19DQUxMX1JFTEVBU0VELCAmY2FsbC0+ZmxhZ3MpICYmCisJCSAgICAhdGVzdF9hbmRfc2V0X2JpdChSWFJQQ19DQUxMX1JFTEVBU0UsICZjYWxsLT5ldmVudHMpKQorCQkJcnhycGNfcXVldWVfY2FsbChjYWxsKTsKKwkJcmVhZF91bmxvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOworCX0KKworZXJyb3I6CisJY2xlYXJfYml0KFJYUlBDX0NBTExfUFJPQ19CVVNZLCAmY2FsbC0+ZmxhZ3MpOworCWtmcmVlKGFja3MpOworCisJLyogYmVjYXVzZSB3ZSBkb24ndCB3YW50IHR3byBDUFVzIGJvdGggcHJvY2Vzc2luZyB0aGUgd29yayBpdGVtIGZvciBvbmUKKwkgKiBjYWxsIGF0IHRoZSBzYW1lIHRpbWUsIHdlIHVzZSBhIGZsYWcgdG8gbm90ZSB3aGVuIGl0J3MgYnVzeTsgaG93ZXZlcgorCSAqIHRoaXMgbWVhbnMgdGhlcmUncyBhIHJhY2UgYmV0d2VlbiBjbGVhcmluZyB0aGUgZmxhZyBhbmQgc2V0dGluZyB0aGUKKwkgKiB3b3JrIHBlbmRpbmcgYml0IGFuZCB0aGUgd29yayBpdGVtIGJlaW5nIHByb2Nlc3NlZCBhZ2FpbiAqLworCWlmIChjYWxsLT5ldmVudHMgJiYgIXdvcmtfcGVuZGluZygmY2FsbC0+cHJvY2Vzc29yKSkgeworCQlfZGVidWcoImp1bXBzdGFydCAleCIsIG50b2hsKGNhbGwtPmNvbm4tPmNpZCkpOworCQlyeHJwY19xdWV1ZV9jYWxsKGNhbGwpOworCX0KKworCV9sZWF2ZSgiIik7CisJcmV0dXJuOworCitub19tZW06CisJX2RlYnVnKCJvdXQgb2YgbWVtb3J5Iik7CisJZ290byBtYXliZV9yZXNjaGVkdWxlOworfQpkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL2FyLWNhbGwuYyBiL25ldC9yeHJwYy9hci1jYWxsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ5MmQ4OAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9yeHJwYy9hci1jYWxsLmMKQEAgLTAsMCArMSw4MDQgQEAKKy8qIFJ4UlBDIGluZGl2aWR1YWwgcmVtb3RlIHByb2NlZHVyZSBjYWxsIGhhbmRsaW5nCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jaXJjX2J1Zi5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bmV0L2FmX3J4cnBjLmg+CisjaW5jbHVkZSAiYXItaW50ZXJuYWwuaCIKKworc3RydWN0IGttZW1fY2FjaGUgKnJ4cnBjX2NhbGxfamFyOworTElTVF9IRUFEKHJ4cnBjX2NhbGxzKTsKK0RFRklORV9SV0xPQ0socnhycGNfY2FsbF9sb2NrKTsKK3N0YXRpYyB1bnNpZ25lZCByeHJwY19jYWxsX21heF9saWZldGltZSA9IDYwOworc3RhdGljIHVuc2lnbmVkIHJ4cnBjX2RlYWRfY2FsbF90aW1lb3V0ID0gMjsKKworc3RhdGljIHZvaWQgcnhycGNfZGVzdHJveV9jYWxsKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CitzdGF0aWMgdm9pZCByeHJwY19jYWxsX2xpZmVfZXhwaXJlZCh1bnNpZ25lZCBsb25nIF9jYWxsKTsKK3N0YXRpYyB2b2lkIHJ4cnBjX2RlYWRfY2FsbF9leHBpcmVkKHVuc2lnbmVkIGxvbmcgX2NhbGwpOworc3RhdGljIHZvaWQgcnhycGNfYWNrX3RpbWVfZXhwaXJlZCh1bnNpZ25lZCBsb25nIF9jYWxsKTsKK3N0YXRpYyB2b2lkIHJ4cnBjX3Jlc2VuZF90aW1lX2V4cGlyZWQodW5zaWduZWQgbG9uZyBfY2FsbCk7CisKKy8qCisgKiBhbGxvY2F0ZSBhIG5ldyBjYWxsCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcnhycGNfY2FsbCAqcnhycGNfYWxsb2NfY2FsbChnZnBfdCBnZnApCit7CisJc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGw7CisKKwljYWxsID0ga21lbV9jYWNoZV96YWxsb2MocnhycGNfY2FsbF9qYXIsIGdmcCk7CisJaWYgKCFjYWxsKQorCQlyZXR1cm4gTlVMTDsKKworCWNhbGwtPmFja3Nfd2luc3ogPSAxNjsKKwljYWxsLT5hY2tzX3dpbmRvdyA9IGttYWxsb2MoY2FsbC0+YWNrc193aW5zeiAqIHNpemVvZih1bnNpZ25lZCBsb25nKSwKKwkJCQkgICAgZ2ZwKTsKKwlpZiAoIWNhbGwtPmFja3Nfd2luZG93KSB7CisJCWttZW1fY2FjaGVfZnJlZShyeHJwY19jYWxsX2phciwgY2FsbCk7CisJCXJldHVybiBOVUxMOworCX0KKworCXNldHVwX3RpbWVyKCZjYWxsLT5saWZldGltZXIsICZyeHJwY19jYWxsX2xpZmVfZXhwaXJlZCwKKwkJICAgICh1bnNpZ25lZCBsb25nKSBjYWxsKTsKKwlzZXR1cF90aW1lcigmY2FsbC0+ZGVhZHNwYW4sICZyeHJwY19kZWFkX2NhbGxfZXhwaXJlZCwKKwkJICAgICh1bnNpZ25lZCBsb25nKSBjYWxsKTsKKwlzZXR1cF90aW1lcigmY2FsbC0+YWNrX3RpbWVyLCAmcnhycGNfYWNrX3RpbWVfZXhwaXJlZCwKKwkJICAgICh1bnNpZ25lZCBsb25nKSBjYWxsKTsKKwlzZXR1cF90aW1lcigmY2FsbC0+cmVzZW5kX3RpbWVyLCAmcnhycGNfcmVzZW5kX3RpbWVfZXhwaXJlZCwKKwkJICAgICh1bnNpZ25lZCBsb25nKSBjYWxsKTsKKwlJTklUX1dPUksoJmNhbGwtPmRlc3Ryb3llciwgJnJ4cnBjX2Rlc3Ryb3lfY2FsbCk7CisJSU5JVF9XT1JLKCZjYWxsLT5wcm9jZXNzb3IsICZyeHJwY19wcm9jZXNzX2NhbGwpOworCUlOSVRfTElTVF9IRUFEKCZjYWxsLT5hY2NlcHRfbGluayk7CisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmY2FsbC0+cnhfcXVldWUpOworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmNhbGwtPnJ4X29vc19xdWV1ZSk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmY2FsbC0+dHhfd2FpdHEpOworCXNwaW5fbG9ja19pbml0KCZjYWxsLT5sb2NrKTsKKwlyd2xvY2tfaW5pdCgmY2FsbC0+c3RhdGVfbG9jayk7CisJYXRvbWljX3NldCgmY2FsbC0+dXNhZ2UsIDEpOworCWNhbGwtPmRlYnVnX2lkID0gYXRvbWljX2luY19yZXR1cm4oJnJ4cnBjX2RlYnVnX2lkKTsKKwljYWxsLT5zdGF0ZSA9IFJYUlBDX0NBTExfQ0xJRU5UX1NFTkRfUkVRVUVTVDsKKworCW1lbXNldCgmY2FsbC0+c29ja19ub2RlLCAweGVkLCBzaXplb2YoY2FsbC0+c29ja19ub2RlKSk7CisKKwljYWxsLT5yeF9kYXRhX2V4cGVjdCA9IDE7CisJY2FsbC0+cnhfZGF0YV9lYXRlbiA9IDA7CisJY2FsbC0+cnhfZmlyc3Rfb29zID0gMDsKKwljYWxsLT5hY2tyX3dpbl90b3AgPSBjYWxsLT5yeF9kYXRhX2VhdGVuICsgMSArIFJYUlBDX01BWEFDS1M7CisJY2FsbC0+Y3JlYXRpb25famlmID0gamlmZmllczsKKwlyZXR1cm4gY2FsbDsKK30KKworLyoKKyAqIGFsbG9jYXRlIGEgbmV3IGNsaWVudCBjYWxsIGFuZCBhdHRlbXB0IHRvIHRvIGdldCBhIGNvbm5lY3Rpb24gc2xvdCBmb3IgaXQKKyAqLworc3RhdGljIHN0cnVjdCByeHJwY19jYWxsICpyeHJwY19hbGxvY19jbGllbnRfY2FsbCgKKwlzdHJ1Y3QgcnhycGNfc29jayAqcngsCisJc3RydWN0IHJ4cnBjX3RyYW5zcG9ydCAqdHJhbnMsCisJc3RydWN0IHJ4cnBjX2Nvbm5fYnVuZGxlICpidW5kbGUsCisJZ2ZwX3QgZ2ZwKQoreworCXN0cnVjdCByeHJwY19jYWxsICpjYWxsOworCWludCByZXQ7CisKKwlfZW50ZXIoIiIpOworCisJQVNTRVJUKHJ4ICE9IE5VTEwpOworCUFTU0VSVCh0cmFucyAhPSBOVUxMKTsKKwlBU1NFUlQoYnVuZGxlICE9IE5VTEwpOworCisJY2FsbCA9IHJ4cnBjX2FsbG9jX2NhbGwoZ2ZwKTsKKwlpZiAoIWNhbGwpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJc29ja19ob2xkKCZyeC0+c2spOworCWNhbGwtPnNvY2tldCA9IHJ4OworCWNhbGwtPnJ4X2RhdGFfcG9zdCA9IDE7CisKKwlyZXQgPSByeHJwY19jb25uZWN0X2NhbGwocngsIHRyYW5zLCBidW5kbGUsIGNhbGwsIGdmcCk7CisJaWYgKHJldCA8IDApIHsKKwkJa21lbV9jYWNoZV9mcmVlKHJ4cnBjX2NhbGxfamFyLCBjYWxsKTsKKwkJcmV0dXJuIEVSUl9QVFIocmV0KTsKKwl9CisKKwlzcGluX2xvY2soJmNhbGwtPmNvbm4tPnRyYW5zLT5wZWVyLT5sb2NrKTsKKwlsaXN0X2FkZCgmY2FsbC0+ZXJyb3JfbGluaywgJmNhbGwtPmNvbm4tPnRyYW5zLT5wZWVyLT5lcnJvcl90YXJnZXRzKTsKKwlzcGluX3VubG9jaygmY2FsbC0+Y29ubi0+dHJhbnMtPnBlZXItPmxvY2spOworCisJY2FsbC0+bGlmZXRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgcnhycGNfY2FsbF9tYXhfbGlmZXRpbWUgKiBIWjsKKwlhZGRfdGltZXIoJmNhbGwtPmxpZmV0aW1lcik7CisKKwlfbGVhdmUoIiA9ICVwIiwgY2FsbCk7CisJcmV0dXJuIGNhbGw7Cit9CisKKy8qCisgKiBzZXQgdXAgYSBjYWxsIGZvciB0aGUgZ2l2ZW4gZGF0YQorICogLSBjYWxsZWQgaW4gcHJvY2VzcyBjb250ZXh0IHdpdGggSVJRcyBlbmFibGVkCisgKi8KK3N0cnVjdCByeHJwY19jYWxsICpyeHJwY19nZXRfY2xpZW50X2NhbGwoc3RydWN0IHJ4cnBjX3NvY2sgKnJ4LAorCQkJCQkgc3RydWN0IHJ4cnBjX3RyYW5zcG9ydCAqdHJhbnMsCisJCQkJCSBzdHJ1Y3QgcnhycGNfY29ubl9idW5kbGUgKmJ1bmRsZSwKKwkJCQkJIHVuc2lnbmVkIGxvbmcgdXNlcl9jYWxsX0lELAorCQkJCQkgaW50IGNyZWF0ZSwKKwkJCQkJIGdmcF90IGdmcCkKK3sKKwlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwgKmNhbmRpZGF0ZTsKKwlzdHJ1Y3QgcmJfbm9kZSAqcCwgKnBhcmVudCwgKipwcDsKKworCV9lbnRlcigiJXAsJWQsJWQsJWx4LCVkIiwKKwkgICAgICAgcngsIHRyYW5zID8gdHJhbnMtPmRlYnVnX2lkIDogLTEsIGJ1bmRsZSA/IGJ1bmRsZS0+ZGVidWdfaWQgOiAtMSwKKwkgICAgICAgdXNlcl9jYWxsX0lELCBjcmVhdGUpOworCisJLyogc2VhcmNoIHRoZSBleHRhbnQgY2FsbHMgZmlyc3QgZm9yIG9uZSB0aGF0IG1hdGNoZXMgdGhlIHNwZWNpZmllZAorCSAqIHVzZXIgSUQgKi8KKwlyZWFkX2xvY2soJnJ4LT5jYWxsX2xvY2spOworCisJcCA9IHJ4LT5jYWxscy5yYl9ub2RlOworCXdoaWxlIChwKSB7CisJCWNhbGwgPSByYl9lbnRyeShwLCBzdHJ1Y3QgcnhycGNfY2FsbCwgc29ja19ub2RlKTsKKworCQlpZiAodXNlcl9jYWxsX0lEIDwgY2FsbC0+dXNlcl9jYWxsX0lEKQorCQkJcCA9IHAtPnJiX2xlZnQ7CisJCWVsc2UgaWYgKHVzZXJfY2FsbF9JRCA+IGNhbGwtPnVzZXJfY2FsbF9JRCkKKwkJCXAgPSBwLT5yYl9yaWdodDsKKwkJZWxzZQorCQkJZ290byBmb3VuZF9leHRhbnRfY2FsbDsKKwl9CisKKwlyZWFkX3VubG9jaygmcngtPmNhbGxfbG9jayk7CisKKwlpZiAoIWNyZWF0ZSB8fCAhdHJhbnMpCisJCXJldHVybiBFUlJfUFRSKC1FQkFEU0xUKTsKKworCS8qIG5vdCB5ZXQgcHJlc2VudCAtIGNyZWF0ZSBhIGNhbmRpZGF0ZSBmb3IgYSBuZXcgcmVjb3JkIGFuZCB0aGVuCisJICogcmVkbyB0aGUgc2VhcmNoICovCisJY2FuZGlkYXRlID0gcnhycGNfYWxsb2NfY2xpZW50X2NhbGwocngsIHRyYW5zLCBidW5kbGUsIGdmcCk7CisJaWYgKElTX0VSUihjYW5kaWRhdGUpKSB7CisJCV9sZWF2ZSgiID0gJWxkIiwgUFRSX0VSUihjYW5kaWRhdGUpKTsKKwkJcmV0dXJuIGNhbmRpZGF0ZTsKKwl9CisKKwljYW5kaWRhdGUtPnVzZXJfY2FsbF9JRCA9IHVzZXJfY2FsbF9JRDsKKwlfX3NldF9iaXQoUlhSUENfQ0FMTF9IQVNfVVNFUklELCAmY2FuZGlkYXRlLT5mbGFncyk7CisKKwl3cml0ZV9sb2NrKCZyeC0+Y2FsbF9sb2NrKTsKKworCXBwID0gJnJ4LT5jYWxscy5yYl9ub2RlOworCXBhcmVudCA9IE5VTEw7CisJd2hpbGUgKCpwcCkgeworCQlwYXJlbnQgPSAqcHA7CisJCWNhbGwgPSByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCByeHJwY19jYWxsLCBzb2NrX25vZGUpOworCisJCWlmICh1c2VyX2NhbGxfSUQgPCBjYWxsLT51c2VyX2NhbGxfSUQpCisJCQlwcCA9ICYoKnBwKS0+cmJfbGVmdDsKKwkJZWxzZSBpZiAodXNlcl9jYWxsX0lEID4gY2FsbC0+dXNlcl9jYWxsX0lEKQorCQkJcHAgPSAmKCpwcCktPnJiX3JpZ2h0OworCQllbHNlCisJCQlnb3RvIGZvdW5kX2V4dGFudF9zZWNvbmQ7CisJfQorCisJLyogc2Vjb25kIHNlYXJjaCBhbHNvIGZhaWxlZDsgYWRkIHRoZSBuZXcgY2FsbCAqLworCWNhbGwgPSBjYW5kaWRhdGU7CisJY2FuZGlkYXRlID0gTlVMTDsKKwlyeHJwY19nZXRfY2FsbChjYWxsKTsKKworCXJiX2xpbmtfbm9kZSgmY2FsbC0+c29ja19ub2RlLCBwYXJlbnQsIHBwKTsKKwlyYl9pbnNlcnRfY29sb3IoJmNhbGwtPnNvY2tfbm9kZSwgJnJ4LT5jYWxscyk7CisJd3JpdGVfdW5sb2NrKCZyeC0+Y2FsbF9sb2NrKTsKKworCXdyaXRlX2xvY2tfYmgoJnJ4cnBjX2NhbGxfbG9jayk7CisJbGlzdF9hZGRfdGFpbCgmY2FsbC0+bGluaywgJnJ4cnBjX2NhbGxzKTsKKwl3cml0ZV91bmxvY2tfYmgoJnJ4cnBjX2NhbGxfbG9jayk7CisKKwlfbmV0KCJDQUxMIG5ldyAlZCBvbiBDT05OICVkIiwgY2FsbC0+ZGVidWdfaWQsIGNhbGwtPmNvbm4tPmRlYnVnX2lkKTsKKworCV9sZWF2ZSgiID0gJXAgW25ld10iLCBjYWxsKTsKKwlyZXR1cm4gY2FsbDsKKworCS8qIHdlIGZvdW5kIHRoZSBjYWxsIGluIHRoZSBsaXN0IGltbWVkaWF0ZWx5ICovCitmb3VuZF9leHRhbnRfY2FsbDoKKwlyeHJwY19nZXRfY2FsbChjYWxsKTsKKwlyZWFkX3VubG9jaygmcngtPmNhbGxfbG9jayk7CisJX2xlYXZlKCIgPSAlcCBbZXh0YW50ICVkXSIsIGNhbGwsIGF0b21pY19yZWFkKCZjYWxsLT51c2FnZSkpOworCXJldHVybiBjYWxsOworCisJLyogd2UgZm91bmQgdGhlIGNhbGwgb24gdGhlIHNlY29uZCB0aW1lIHRocm91Z2ggdGhlIGxpc3QgKi8KK2ZvdW5kX2V4dGFudF9zZWNvbmQ6CisJcnhycGNfZ2V0X2NhbGwoY2FsbCk7CisJd3JpdGVfdW5sb2NrKCZyeC0+Y2FsbF9sb2NrKTsKKwlyeHJwY19wdXRfY2FsbChjYW5kaWRhdGUpOworCV9sZWF2ZSgiID0gJXAgW3NlY29uZCAlZF0iLCBjYWxsLCBhdG9taWNfcmVhZCgmY2FsbC0+dXNhZ2UpKTsKKwlyZXR1cm4gY2FsbDsKK30KKworLyoKKyAqIHNldCB1cCBhbiBpbmNvbWluZyBjYWxsCisgKiAtIGNhbGxlZCBpbiBwcm9jZXNzIGNvbnRleHQgd2l0aCBJUlFzIGVuYWJsZWQKKyAqLworc3RydWN0IHJ4cnBjX2NhbGwgKnJ4cnBjX2luY29taW5nX2NhbGwoc3RydWN0IHJ4cnBjX3NvY2sgKnJ4LAorCQkJCSAgICAgICBzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubiwKKwkJCQkgICAgICAgc3RydWN0IHJ4cnBjX2hlYWRlciAqaGRyLAorCQkJCSAgICAgICBnZnBfdCBnZnApCit7CisJc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsICpjYW5kaWRhdGU7CisJc3RydWN0IHJiX25vZGUgKipwLCAqcGFyZW50OworCV9fYmUzMiBjYWxsX2lkOworCisJX2VudGVyKCIsJWQsLCV4IiwgY29ubi0+ZGVidWdfaWQsIGdmcCk7CisKKwlBU1NFUlQocnggIT0gTlVMTCk7CisKKwljYW5kaWRhdGUgPSByeHJwY19hbGxvY19jYWxsKGdmcCk7CisJaWYgKCFjYW5kaWRhdGUpCisJCXJldHVybiBFUlJfUFRSKC1FQlVTWSk7CisKKwljYW5kaWRhdGUtPnNvY2tldCA9IHJ4OworCWNhbmRpZGF0ZS0+Y29ubiA9IGNvbm47CisJY2FuZGlkYXRlLT5jaWQgPSBoZHItPmNpZDsKKwljYW5kaWRhdGUtPmNhbGxfaWQgPSBoZHItPmNhbGxOdW1iZXI7CisJY2FuZGlkYXRlLT5jaGFubmVsID0gbnRvaGwoaGRyLT5jaWQpICYgUlhSUENfQ0hBTk5FTE1BU0s7CisJY2FuZGlkYXRlLT5yeF9kYXRhX3Bvc3QgPSAwOworCWNhbmRpZGF0ZS0+c3RhdGUgPSBSWFJQQ19DQUxMX1NFUlZFUl9BQ0NFUFRJTkc7CisJaWYgKGNvbm4tPnNlY3VyaXR5X2l4ID4gMCkKKwkJY2FuZGlkYXRlLT5zdGF0ZSA9IFJYUlBDX0NBTExfU0VSVkVSX1NFQ1VSSU5HOworCisJd3JpdGVfbG9ja19iaCgmY29ubi0+bG9jayk7CisKKwkvKiBzZXQgdGhlIGNoYW5uZWwgZm9yIHRoaXMgY2FsbCAqLworCWNhbGwgPSBjb25uLT5jaGFubmVsc1tjYW5kaWRhdGUtPmNoYW5uZWxdOworCV9kZWJ1ZygiY2hhbm5lbFsldV0gaXMgJXAiLCBjYW5kaWRhdGUtPmNoYW5uZWwsIGNhbGwpOworCWlmIChjYWxsICYmIGNhbGwtPmNhbGxfaWQgPT0gaGRyLT5jYWxsTnVtYmVyKSB7CisJCS8qIGFscmVhZHkgc2V0OyBtdXN0J3ZlIGJlZW4gYSBkdXBsaWNhdGUgcGFja2V0ICovCisJCV9kZWJ1ZygiZXh0YW50IGNhbGwgWyVkXSIsIGNhbGwtPnN0YXRlKTsKKwkJQVNTRVJUQ01QKGNhbGwtPmNvbm4sID09LCBjb25uKTsKKworCQlyZWFkX2xvY2soJmNhbGwtPnN0YXRlX2xvY2spOworCQlzd2l0Y2ggKGNhbGwtPnN0YXRlKSB7CisJCWNhc2UgUlhSUENfQ0FMTF9MT0NBTExZX0FCT1JURUQ6CisJCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoUlhSUENfQ0FMTF9BQk9SVCwgJmNhbGwtPmV2ZW50cykpCisJCQkJcnhycGNfcXVldWVfY2FsbChjYWxsKTsKKwkJY2FzZSBSWFJQQ19DQUxMX1JFTU9URUxZX0FCT1JURUQ6CisJCQlyZWFkX3VubG9jaygmY2FsbC0+c3RhdGVfbG9jayk7CisJCQlnb3RvIGFib3J0ZWRfY2FsbDsKKwkJZGVmYXVsdDoKKwkJCXJ4cnBjX2dldF9jYWxsKGNhbGwpOworCQkJcmVhZF91bmxvY2soJmNhbGwtPnN0YXRlX2xvY2spOworCQkJZ290byBleHRhbnRfY2FsbDsKKwkJfQorCX0KKworCWlmIChjYWxsKSB7CisJCS8qIGl0IHNlZW1zIHRoZSBjaGFubmVsIGlzIHN0aWxsIGluIHVzZSBmcm9tIHRoZSBwcmV2aW91cyBjYWxsCisJCSAqIC0gZGl0Y2ggdGhlIG9sZCBiaW5kaW5nIGlmIGl0cyBjYWxsIGlzIG5vdyBjb21wbGV0ZSAqLworCQlfZGVidWcoIkNBTEw6ICV1IHsgJXMgfSIsCisJCSAgICAgICBjYWxsLT5kZWJ1Z19pZCwgcnhycGNfY2FsbF9zdGF0ZXNbY2FsbC0+c3RhdGVdKTsKKworCQlpZiAoY2FsbC0+c3RhdGUgPj0gUlhSUENfQ0FMTF9DT01QTEVURSkgeworCQkJY29ubi0+Y2hhbm5lbHNbY2FsbC0+Y2hhbm5lbF0gPSBOVUxMOworCQl9IGVsc2UgeworCQkJd3JpdGVfdW5sb2NrX2JoKCZjb25uLT5sb2NrKTsKKwkJCWttZW1fY2FjaGVfZnJlZShyeHJwY19jYWxsX2phciwgY2FuZGlkYXRlKTsKKwkJCV9sZWF2ZSgiID0gLUVCVVNZIik7CisJCQlyZXR1cm4gRVJSX1BUUigtRUJVU1kpOworCQl9CisJfQorCisJLyogY2hlY2sgdGhlIGNhbGwgbnVtYmVyIGlzbid0IGR1cGxpY2F0ZSAqLworCV9kZWJ1ZygiY2hlY2sgZHVwIik7CisJY2FsbF9pZCA9IGhkci0+Y2FsbE51bWJlcjsKKwlwID0gJmNvbm4tPmNhbGxzLnJiX25vZGU7CisJcGFyZW50ID0gTlVMTDsKKwl3aGlsZSAoKnApIHsKKwkJcGFyZW50ID0gKnA7CisJCWNhbGwgPSByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCByeHJwY19jYWxsLCBjb25uX25vZGUpOworCisJCWlmIChjYWxsX2lkIDwgY2FsbC0+Y2FsbF9pZCkKKwkJCXAgPSAmKCpwKS0+cmJfbGVmdDsKKwkJZWxzZSBpZiAoY2FsbF9pZCA+IGNhbGwtPmNhbGxfaWQpCisJCQlwID0gJigqcCktPnJiX3JpZ2h0OworCQllbHNlCisJCQlnb3RvIG9sZF9jYWxsOworCX0KKworCS8qIG1ha2UgdGhlIGNhbGwgYXZhaWxhYmxlICovCisJX2RlYnVnKCJuZXcgY2FsbCIpOworCWNhbGwgPSBjYW5kaWRhdGU7CisJY2FuZGlkYXRlID0gTlVMTDsKKwlyYl9saW5rX25vZGUoJmNhbGwtPmNvbm5fbm9kZSwgcGFyZW50LCBwKTsKKwlyYl9pbnNlcnRfY29sb3IoJmNhbGwtPmNvbm5fbm9kZSwgJmNvbm4tPmNhbGxzKTsKKwljb25uLT5jaGFubmVsc1tjYWxsLT5jaGFubmVsXSA9IGNhbGw7CisJc29ja19ob2xkKCZyeC0+c2spOworCWF0b21pY19pbmMoJmNvbm4tPnVzYWdlKTsKKwl3cml0ZV91bmxvY2tfYmgoJmNvbm4tPmxvY2spOworCisJc3Bpbl9sb2NrKCZjb25uLT50cmFucy0+cGVlci0+bG9jayk7CisJbGlzdF9hZGQoJmNhbGwtPmVycm9yX2xpbmssICZjb25uLT50cmFucy0+cGVlci0+ZXJyb3JfdGFyZ2V0cyk7CisJc3Bpbl91bmxvY2soJmNvbm4tPnRyYW5zLT5wZWVyLT5sb2NrKTsKKworCXdyaXRlX2xvY2tfYmgoJnJ4cnBjX2NhbGxfbG9jayk7CisJbGlzdF9hZGRfdGFpbCgmY2FsbC0+bGluaywgJnJ4cnBjX2NhbGxzKTsKKwl3cml0ZV91bmxvY2tfYmgoJnJ4cnBjX2NhbGxfbG9jayk7CisKKwlfbmV0KCJDQUxMIGluY29taW5nICVkIG9uIENPTk4gJWQiLCBjYWxsLT5kZWJ1Z19pZCwgY2FsbC0+Y29ubi0+ZGVidWdfaWQpOworCisJY2FsbC0+bGlmZXRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgcnhycGNfY2FsbF9tYXhfbGlmZXRpbWUgKiBIWjsKKwlhZGRfdGltZXIoJmNhbGwtPmxpZmV0aW1lcik7CisJX2xlYXZlKCIgPSAlcCB7JWR9IFtuZXddIiwgY2FsbCwgY2FsbC0+ZGVidWdfaWQpOworCXJldHVybiBjYWxsOworCitleHRhbnRfY2FsbDoKKwl3cml0ZV91bmxvY2tfYmgoJmNvbm4tPmxvY2spOworCWttZW1fY2FjaGVfZnJlZShyeHJwY19jYWxsX2phciwgY2FuZGlkYXRlKTsKKwlfbGVhdmUoIiA9ICVwIHslZH0gW2V4dGFudF0iLCBjYWxsLCBjYWxsID8gY2FsbC0+ZGVidWdfaWQgOiAtMSk7CisJcmV0dXJuIGNhbGw7CisKK2Fib3J0ZWRfY2FsbDoKKwl3cml0ZV91bmxvY2tfYmgoJmNvbm4tPmxvY2spOworCWttZW1fY2FjaGVfZnJlZShyeHJwY19jYWxsX2phciwgY2FuZGlkYXRlKTsKKwlfbGVhdmUoIiA9IC1FQ09OTkFCT1JURUQiKTsKKwlyZXR1cm4gRVJSX1BUUigtRUNPTk5BQk9SVEVEKTsKKworb2xkX2NhbGw6CisJd3JpdGVfdW5sb2NrX2JoKCZjb25uLT5sb2NrKTsKKwlrbWVtX2NhY2hlX2ZyZWUocnhycGNfY2FsbF9qYXIsIGNhbmRpZGF0ZSk7CisJX2xlYXZlKCIgPSAtRUNPTk5SRVNFVCBbb2xkXSIpOworCXJldHVybiBFUlJfUFRSKC1FQ09OTlJFU0VUKTsKK30KKworLyoKKyAqIGZpbmQgYW4gZXh0YW50IHNlcnZlciBjYWxsCisgKiAtIGNhbGxlZCBpbiBwcm9jZXNzIGNvbnRleHQgd2l0aCBJUlFzIGVuYWJsZWQKKyAqLworc3RydWN0IHJ4cnBjX2NhbGwgKnJ4cnBjX2ZpbmRfc2VydmVyX2NhbGwoc3RydWN0IHJ4cnBjX3NvY2sgKnJ4LAorCQkJCQkgIHVuc2lnbmVkIGxvbmcgdXNlcl9jYWxsX0lEKQoreworCXN0cnVjdCByeHJwY19jYWxsICpjYWxsOworCXN0cnVjdCByYl9ub2RlICpwOworCisJX2VudGVyKCIlcCwlbHgiLCByeCwgdXNlcl9jYWxsX0lEKTsKKworCS8qIHNlYXJjaCB0aGUgZXh0YW50IGNhbGxzIGZvciBvbmUgdGhhdCBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgdXNlcgorCSAqIElEICovCisJcmVhZF9sb2NrKCZyeC0+Y2FsbF9sb2NrKTsKKworCXAgPSByeC0+Y2FsbHMucmJfbm9kZTsKKwl3aGlsZSAocCkgeworCQljYWxsID0gcmJfZW50cnkocCwgc3RydWN0IHJ4cnBjX2NhbGwsIHNvY2tfbm9kZSk7CisKKwkJaWYgKHVzZXJfY2FsbF9JRCA8IGNhbGwtPnVzZXJfY2FsbF9JRCkKKwkJCXAgPSBwLT5yYl9sZWZ0OworCQllbHNlIGlmICh1c2VyX2NhbGxfSUQgPiBjYWxsLT51c2VyX2NhbGxfSUQpCisJCQlwID0gcC0+cmJfcmlnaHQ7CisJCWVsc2UKKwkJCWdvdG8gZm91bmRfZXh0YW50X2NhbGw7CisJfQorCisJcmVhZF91bmxvY2soJnJ4LT5jYWxsX2xvY2spOworCV9sZWF2ZSgiID0gTlVMTCIpOworCXJldHVybiBOVUxMOworCisJLyogd2UgZm91bmQgdGhlIGNhbGwgaW4gdGhlIGxpc3QgaW1tZWRpYXRlbHkgKi8KK2ZvdW5kX2V4dGFudF9jYWxsOgorCXJ4cnBjX2dldF9jYWxsKGNhbGwpOworCXJlYWRfdW5sb2NrKCZyeC0+Y2FsbF9sb2NrKTsKKwlfbGVhdmUoIiA9ICVwIFslZF0iLCBjYWxsLCBhdG9taWNfcmVhZCgmY2FsbC0+dXNhZ2UpKTsKKwlyZXR1cm4gY2FsbDsKK30KKworLyoKKyAqIGRldGFjaCBhIGNhbGwgZnJvbSBhIHNvY2tldCBhbmQgc2V0IHVwIGZvciByZWxlYXNlCisgKi8KK3ZvaWQgcnhycGNfcmVsZWFzZV9jYWxsKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKQoreworCXN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uID0gY2FsbC0+Y29ubjsKKwlzdHJ1Y3QgcnhycGNfc29jayAqcnggPSBjYWxsLT5zb2NrZXQ7CisKKwlfZW50ZXIoInslZCwlZCwlZCwlZH0iLAorCSAgICAgICBjYWxsLT5kZWJ1Z19pZCwgYXRvbWljX3JlYWQoJmNhbGwtPnVzYWdlKSwKKwkgICAgICAgYXRvbWljX3JlYWQoJmNhbGwtPmFja3Jfbm90X2lkbGUpLAorCSAgICAgICBjYWxsLT5yeF9maXJzdF9vb3MpOworCisJc3Bpbl9sb2NrX2JoKCZjYWxsLT5sb2NrKTsKKwlpZiAodGVzdF9hbmRfc2V0X2JpdChSWFJQQ19DQUxMX1JFTEVBU0VELCAmY2FsbC0+ZmxhZ3MpKQorCQlCVUcoKTsKKwlzcGluX3VubG9ja19iaCgmY2FsbC0+bG9jayk7CisKKwkvKiBkaXNzb2NpYXRlIGZyb20gdGhlIHNvY2tldAorCSAqIC0gdGhlIHNvY2tldCdzIHJlZiBvbiB0aGUgY2FsbCBpcyBwYXNzZWQgdG8gdGhlIGRlYXRoIHRpbWVyCisJICovCisJX2RlYnVnKCJSRUxFQVNFIENBTEwgJXAgKCVkIENPTk4gJXApIiwgY2FsbCwgY2FsbC0+ZGVidWdfaWQsIGNvbm4pOworCisJd3JpdGVfbG9ja19iaCgmcngtPmNhbGxfbG9jayk7CisJaWYgKCFsaXN0X2VtcHR5KCZjYWxsLT5hY2NlcHRfbGluaykpIHsKKwkJX2RlYnVnKCJ1bmxpbmtpbmcgb25jZS1wZW5kaW5nIGNhbGwgJXAgeyBlPSVseCBmPSVseCB9IiwKKwkJICAgICAgIGNhbGwsIGNhbGwtPmV2ZW50cywgY2FsbC0+ZmxhZ3MpOworCQlBU1NFUlQoIXRlc3RfYml0KFJYUlBDX0NBTExfSEFTX1VTRVJJRCwgJmNhbGwtPmZsYWdzKSk7CisJCWxpc3RfZGVsX2luaXQoJmNhbGwtPmFjY2VwdF9saW5rKTsKKwkJc2tfYWNjZXB0cV9yZW1vdmVkKCZyeC0+c2spOworCX0gZWxzZSBpZiAodGVzdF9iaXQoUlhSUENfQ0FMTF9IQVNfVVNFUklELCAmY2FsbC0+ZmxhZ3MpKSB7CisJCXJiX2VyYXNlKCZjYWxsLT5zb2NrX25vZGUsICZyeC0+Y2FsbHMpOworCQltZW1zZXQoJmNhbGwtPnNvY2tfbm9kZSwgMHhkZCwgc2l6ZW9mKGNhbGwtPnNvY2tfbm9kZSkpOworCQljbGVhcl9iaXQoUlhSUENfQ0FMTF9IQVNfVVNFUklELCAmY2FsbC0+ZmxhZ3MpOworCX0KKwl3cml0ZV91bmxvY2tfYmgoJnJ4LT5jYWxsX2xvY2spOworCisJLyogZnJlZSB1cCB0aGUgY2hhbm5lbCBmb3IgcmV1c2UgKi8KKwlzcGluX2xvY2soJmNvbm4tPnRyYW5zLT5jbGllbnRfbG9jayk7CisJd3JpdGVfbG9ja19iaCgmY29ubi0+bG9jayk7CisJd3JpdGVfbG9jaygmY2FsbC0+c3RhdGVfbG9jayk7CisKKwlpZiAoY29ubi0+Y2hhbm5lbHNbY2FsbC0+Y2hhbm5lbF0gPT0gY2FsbCkKKwkJY29ubi0+Y2hhbm5lbHNbY2FsbC0+Y2hhbm5lbF0gPSBOVUxMOworCisJaWYgKGNvbm4tPm91dF9jbGllbnRmbGFnICYmIGNvbm4tPmJ1bmRsZSkgeworCQljb25uLT5hdmFpbF9jYWxscysrOworCQlzd2l0Y2ggKGNvbm4tPmF2YWlsX2NhbGxzKSB7CisJCWNhc2UgMToKKwkJCWxpc3RfbW92ZV90YWlsKCZjb25uLT5idW5kbGVfbGluaywKKwkJCQkgICAgICAgJmNvbm4tPmJ1bmRsZS0+YXZhaWxfY29ubnMpOworCQljYXNlIDIgLi4uIFJYUlBDX01BWENBTExTIC0gMToKKwkJCUFTU0VSVChjb25uLT5jaGFubmVsc1swXSA9PSBOVUxMIHx8CisJCQkgICAgICAgY29ubi0+Y2hhbm5lbHNbMV0gPT0gTlVMTCB8fAorCQkJICAgICAgIGNvbm4tPmNoYW5uZWxzWzJdID09IE5VTEwgfHwKKwkJCSAgICAgICBjb25uLT5jaGFubmVsc1szXSA9PSBOVUxMKTsKKwkJCWJyZWFrOworCQljYXNlIFJYUlBDX01BWENBTExTOgorCQkJbGlzdF9tb3ZlX3RhaWwoJmNvbm4tPmJ1bmRsZV9saW5rLAorCQkJCSAgICAgICAmY29ubi0+YnVuZGxlLT51bnVzZWRfY29ubnMpOworCQkJQVNTRVJUKGNvbm4tPmNoYW5uZWxzWzBdID09IE5VTEwgJiYKKwkJCSAgICAgICBjb25uLT5jaGFubmVsc1sxXSA9PSBOVUxMICYmCisJCQkgICAgICAgY29ubi0+Y2hhbm5lbHNbMl0gPT0gTlVMTCAmJgorCQkJICAgICAgIGNvbm4tPmNoYW5uZWxzWzNdID09IE5VTEwpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9FUlIgIlJ4UlBDOiBjb25uLT5hdmFpbF9jYWxscz0lZFxuIiwKKwkJCSAgICAgICBjb25uLT5hdmFpbF9jYWxscyk7CisJCQlCVUcoKTsKKwkJfQorCX0KKworCXNwaW5fdW5sb2NrKCZjb25uLT50cmFucy0+Y2xpZW50X2xvY2spOworCisJaWYgKGNhbGwtPnN0YXRlIDwgUlhSUENfQ0FMTF9DT01QTEVURSAmJgorCSAgICBjYWxsLT5zdGF0ZSAhPSBSWFJQQ19DQUxMX0NMSUVOVF9GSU5BTF9BQ0spIHsKKwkJX2RlYnVnKCIrKysgQUJPUlRJTkcgU1RBVEUgJWQgKysrXG4iLCBjYWxsLT5zdGF0ZSk7CisJCWNhbGwtPnN0YXRlID0gUlhSUENfQ0FMTF9MT0NBTExZX0FCT1JURUQ7CisJCWNhbGwtPmFib3J0X2NvZGUgPSBSWF9DQUxMX0RFQUQ7CisJCXNldF9iaXQoUlhSUENfQ0FMTF9BQk9SVCwgJmNhbGwtPmV2ZW50cyk7CisJCXJ4cnBjX3F1ZXVlX2NhbGwoY2FsbCk7CisJfQorCXdyaXRlX3VubG9jaygmY2FsbC0+c3RhdGVfbG9jayk7CisJd3JpdGVfdW5sb2NrX2JoKCZjb25uLT5sb2NrKTsKKworCS8qIGNsZWFuIHVwIHRoZSBSeCBxdWV1ZSAqLworCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZjYWxsLT5yeF9xdWV1ZSkgfHwKKwkgICAgIXNrYl9xdWV1ZV9lbXB0eSgmY2FsbC0+cnhfb29zX3F1ZXVlKSkgeworCQlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwOworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJCV9kZWJ1ZygicHVyZ2UgUnggcXVldWVzIik7CisKKwkJc3Bpbl9sb2NrX2JoKCZjYWxsLT5sb2NrKTsKKwkJd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZSgmY2FsbC0+cnhfcXVldWUpKSB8fAorCQkgICAgICAgKHNrYiA9IHNrYl9kZXF1ZXVlKCZjYWxsLT5yeF9vb3NfcXVldWUpKSkgeworCQkJc3AgPSByeHJwY19za2Ioc2tiKTsKKwkJCWlmIChzcC0+Y2FsbCkgeworCQkJCUFTU0VSVENNUChzcC0+Y2FsbCwgPT0sIGNhbGwpOworCQkJCXJ4cnBjX3B1dF9jYWxsKGNhbGwpOworCQkJCXNwLT5jYWxsID0gTlVMTDsKKwkJCX0KKwkJCXNrYi0+ZGVzdHJ1Y3RvciA9IE5VTEw7CisJCQlzcGluX3VubG9ja19iaCgmY2FsbC0+bG9jayk7CisKKwkJCV9kZWJ1ZygiLSB6YXAgJXMgJSUldSAjJXUiLAorCQkJICAgICAgIHJ4cnBjX3BrdHNbc3AtPmhkci50eXBlXSwKKwkJCSAgICAgICBudG9obChzcC0+aGRyLnNlcmlhbCksCisJCQkgICAgICAgbnRvaGwoc3AtPmhkci5zZXEpKTsKKwkJCXJ4cnBjX2ZyZWVfc2tiKHNrYik7CisJCQlzcGluX2xvY2tfYmgoJmNhbGwtPmxvY2spOworCQl9CisJCXNwaW5fdW5sb2NrX2JoKCZjYWxsLT5sb2NrKTsKKworCQlBU1NFUlRDTVAoY2FsbC0+c3RhdGUsICE9LCBSWFJQQ19DQUxMX0NPTVBMRVRFKTsKKwl9CisKKwlkZWxfdGltZXJfc3luYygmY2FsbC0+cmVzZW5kX3RpbWVyKTsKKwlkZWxfdGltZXJfc3luYygmY2FsbC0+YWNrX3RpbWVyKTsKKwlkZWxfdGltZXJfc3luYygmY2FsbC0+bGlmZXRpbWVyKTsKKwljYWxsLT5kZWFkc3Bhbi5leHBpcmVzID0gamlmZmllcyArIHJ4cnBjX2RlYWRfY2FsbF90aW1lb3V0ICogSFo7CisJYWRkX3RpbWVyKCZjYWxsLT5kZWFkc3Bhbik7CisKKwlfbGVhdmUoIiIpOworfQorCisvKgorICogaGFuZGxlIGEgZGVhZCBjYWxsIGJlaW5nIHJlYWR5IGZvciByZWFwaW5nCisgKi8KK3N0YXRpYyB2b2lkIHJ4cnBjX2RlYWRfY2FsbF9leHBpcmVkKHVuc2lnbmVkIGxvbmcgX2NhbGwpCit7CisJc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwgPSAoc3RydWN0IHJ4cnBjX2NhbGwgKikgX2NhbGw7CisKKwlfZW50ZXIoInslZH0iLCBjYWxsLT5kZWJ1Z19pZCk7CisKKwl3cml0ZV9sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKKwljYWxsLT5zdGF0ZSA9IFJYUlBDX0NBTExfREVBRDsKKwl3cml0ZV91bmxvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOworCXJ4cnBjX3B1dF9jYWxsKGNhbGwpOworfQorCisvKgorICogbWFyayBhIGNhbGwgYXMgdG8gYmUgcmVsZWFzZWQsIGFib3J0aW5nIGl0IGlmIGl0J3Mgc3RpbGwgaW4gcHJvZ3Jlc3MKKyAqIC0gY2FsbGVkIHdpdGggc29mdGlycXMgZGlzYWJsZWQKKyAqLworc3RhdGljIHZvaWQgcnhycGNfbWFya19jYWxsX3JlbGVhc2VkKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKQoreworCWJvb2wgc2NoZWQ7CisKKwl3cml0ZV9sb2NrKCZjYWxsLT5zdGF0ZV9sb2NrKTsKKwlpZiAoY2FsbC0+c3RhdGUgPCBSWFJQQ19DQUxMX0RFQUQpIHsKKwkJc2NoZWQgPSBmYWxzZTsKKwkJaWYgKGNhbGwtPnN0YXRlIDwgUlhSUENfQ0FMTF9DT01QTEVURSkgeworCQkJX2RlYnVnKCJhYm9ydCBjYWxsICVwIiwgY2FsbCk7CisJCQljYWxsLT5zdGF0ZSA9IFJYUlBDX0NBTExfTE9DQUxMWV9BQk9SVEVEOworCQkJY2FsbC0+YWJvcnRfY29kZSA9IFJYX0NBTExfREVBRDsKKwkJCWlmICghdGVzdF9hbmRfc2V0X2JpdChSWFJQQ19DQUxMX0FCT1JULCAmY2FsbC0+ZXZlbnRzKSkKKwkJCQlzY2hlZCA9IHRydWU7CisJCX0KKwkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KFJYUlBDX0NBTExfUkVMRUFTRSwgJmNhbGwtPmV2ZW50cykpCisJCQlzY2hlZCA9IHRydWU7CisJCWlmIChzY2hlZCkKKwkJCXJ4cnBjX3F1ZXVlX2NhbGwoY2FsbCk7CisJfQorCXdyaXRlX3VubG9jaygmY2FsbC0+c3RhdGVfbG9jayk7Cit9CisKKy8qCisgKiByZWxlYXNlIGFsbCB0aGUgY2FsbHMgYXNzb2NpYXRlZCB3aXRoIGEgc29ja2V0CisgKi8KK3ZvaWQgcnhycGNfcmVsZWFzZV9jYWxsc19vbl9zb2NrZXQoc3RydWN0IHJ4cnBjX3NvY2sgKnJ4KQoreworCXN0cnVjdCByeHJwY19jYWxsICpjYWxsOworCXN0cnVjdCByYl9ub2RlICpwOworCisJX2VudGVyKCIlcCIsIHJ4KTsKKworCXJlYWRfbG9ja19iaCgmcngtPmNhbGxfbG9jayk7CisKKwkvKiBtYXJrIGFsbCB0aGUgY2FsbHMgYXMgbm8gbG9uZ2VyIHdhbnRpbmcgaW5jb21pbmcgcGFja2V0cyAqLworCWZvciAocCA9IHJiX2ZpcnN0KCZyeC0+Y2FsbHMpOyBwOyBwID0gcmJfbmV4dChwKSkgeworCQljYWxsID0gcmJfZW50cnkocCwgc3RydWN0IHJ4cnBjX2NhbGwsIHNvY2tfbm9kZSk7CisJCXJ4cnBjX21hcmtfY2FsbF9yZWxlYXNlZChjYWxsKTsKKwl9CisKKwkvKiBraWxsIHRoZSBub3QteWV0LWFjY2VwdGVkIGluY29taW5nIGNhbGxzICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjYWxsLCAmcngtPnNlY3VyZXEsIGFjY2VwdF9saW5rKSB7CisJCXJ4cnBjX21hcmtfY2FsbF9yZWxlYXNlZChjYWxsKTsKKwl9CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNhbGwsICZyeC0+YWNjZXB0cSwgYWNjZXB0X2xpbmspIHsKKwkJcnhycGNfbWFya19jYWxsX3JlbGVhc2VkKGNhbGwpOworCX0KKworCXJlYWRfdW5sb2NrX2JoKCZyeC0+Y2FsbF9sb2NrKTsKKwlfbGVhdmUoIiIpOworfQorCisvKgorICogcmVsZWFzZSBhIGNhbGwKKyAqLwordm9pZCBfX3J4cnBjX3B1dF9jYWxsKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKQoreworCUFTU0VSVChjYWxsICE9IE5VTEwpOworCisJX2VudGVyKCIlcHt1PSVkfSIsIGNhbGwsIGF0b21pY19yZWFkKCZjYWxsLT51c2FnZSkpOworCisJQVNTRVJUQ01QKGF0b21pY19yZWFkKCZjYWxsLT51c2FnZSksID4sIDApOworCisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmNhbGwtPnVzYWdlKSkgeworCQlfZGVidWcoImNhbGwgJWQgZGVhZCIsIGNhbGwtPmRlYnVnX2lkKTsKKwkJQVNTRVJUQ01QKGNhbGwtPnN0YXRlLCA9PSwgUlhSUENfQ0FMTF9ERUFEKTsKKwkJcnhycGNfcXVldWVfd29yaygmY2FsbC0+ZGVzdHJveWVyKTsKKwl9CisJX2xlYXZlKCIiKTsKK30KKworLyoKKyAqIGNsZWFuIHVwIGEgY2FsbAorICovCitzdGF0aWMgdm9pZCByeHJwY19jbGVhbnVwX2NhbGwoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpCit7CisJX25ldCgiREVTVFJPWSBDQUxMICVkIiwgY2FsbC0+ZGVidWdfaWQpOworCisJQVNTRVJUKGNhbGwtPnNvY2tldCk7CisKKwltZW1zZXQoJmNhbGwtPnNvY2tfbm9kZSwgMHhjZCwgc2l6ZW9mKGNhbGwtPnNvY2tfbm9kZSkpOworCisJZGVsX3RpbWVyX3N5bmMoJmNhbGwtPmxpZmV0aW1lcik7CisJZGVsX3RpbWVyX3N5bmMoJmNhbGwtPmRlYWRzcGFuKTsKKwlkZWxfdGltZXJfc3luYygmY2FsbC0+YWNrX3RpbWVyKTsKKwlkZWxfdGltZXJfc3luYygmY2FsbC0+cmVzZW5kX3RpbWVyKTsKKworCUFTU0VSVCh0ZXN0X2JpdChSWFJQQ19DQUxMX1JFTEVBU0VELCAmY2FsbC0+ZmxhZ3MpKTsKKwlBU1NFUlRDTVAoY2FsbC0+ZXZlbnRzLCA9PSwgMCk7CisJaWYgKHdvcmtfcGVuZGluZygmY2FsbC0+cHJvY2Vzc29yKSkgeworCQlfZGVidWcoImRlZmVyIGRlc3Ryb3kiKTsKKwkJcnhycGNfcXVldWVfd29yaygmY2FsbC0+ZGVzdHJveWVyKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChjYWxsLT5jb25uKSB7CisJCXNwaW5fbG9jaygmY2FsbC0+Y29ubi0+dHJhbnMtPnBlZXItPmxvY2spOworCQlsaXN0X2RlbCgmY2FsbC0+ZXJyb3JfbGluayk7CisJCXNwaW5fdW5sb2NrKCZjYWxsLT5jb25uLT50cmFucy0+cGVlci0+bG9jayk7CisKKwkJd3JpdGVfbG9ja19iaCgmY2FsbC0+Y29ubi0+bG9jayk7CisJCXJiX2VyYXNlKCZjYWxsLT5jb25uX25vZGUsICZjYWxsLT5jb25uLT5jYWxscyk7CisJCXdyaXRlX3VubG9ja19iaCgmY2FsbC0+Y29ubi0+bG9jayk7CisJCXJ4cnBjX3B1dF9jb25uZWN0aW9uKGNhbGwtPmNvbm4pOworCX0KKworCWlmIChjYWxsLT5hY2tzX3dpbmRvdykgeworCQlfZGVidWcoImtpbGwgVHggd2luZG93ICVkIiwKKwkJICAgICAgIENJUkNfQ05UKGNhbGwtPmFja3NfaGVhZCwgY2FsbC0+YWNrc190YWlsLAorCQkJCWNhbGwtPmFja3Nfd2luc3opKTsKKwkJc21wX21iKCk7CisJCXdoaWxlIChDSVJDX0NOVChjYWxsLT5hY2tzX2hlYWQsIGNhbGwtPmFja3NfdGFpbCwKKwkJCQljYWxsLT5hY2tzX3dpbnN6KSA+IDApIHsKKwkJCXN0cnVjdCByeHJwY19za2JfcHJpdiAqc3A7CisJCQl1bnNpZ25lZCBsb25nIF9za2I7CisKKwkJCV9za2IgPSBjYWxsLT5hY2tzX3dpbmRvd1tjYWxsLT5hY2tzX3RhaWxdICYgfjE7CisJCQlzcCA9IHJ4cnBjX3NrYigoc3RydWN0IHNrX2J1ZmYgKikgX3NrYik7CisJCQlfZGVidWcoIisrKyBjbGVhciBUeCAldSIsIG50b2hsKHNwLT5oZHIuc2VxKSk7CisJCQlyeHJwY19mcmVlX3NrYigoc3RydWN0IHNrX2J1ZmYgKikgX3NrYik7CisJCQljYWxsLT5hY2tzX3RhaWwgPQorCQkJCShjYWxsLT5hY2tzX3RhaWwgKyAxKSAmIChjYWxsLT5hY2tzX3dpbnN6IC0gMSk7CisJCX0KKworCQlrZnJlZShjYWxsLT5hY2tzX3dpbmRvdyk7CisJfQorCisJcnhycGNfZnJlZV9za2IoY2FsbC0+dHhfcGVuZGluZyk7CisKKwlyeHJwY19wdXJnZV9xdWV1ZSgmY2FsbC0+cnhfcXVldWUpOworCUFTU0VSVChza2JfcXVldWVfZW1wdHkoJmNhbGwtPnJ4X29vc19xdWV1ZSkpOworCXNvY2tfcHV0KCZjYWxsLT5zb2NrZXQtPnNrKTsKKwlrbWVtX2NhY2hlX2ZyZWUocnhycGNfY2FsbF9qYXIsIGNhbGwpOworfQorCisvKgorICogZGVzdHJveSBhIGNhbGwKKyAqLworc3RhdGljIHZvaWQgcnhycGNfZGVzdHJveV9jYWxsKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcnhycGNfY2FsbCwgZGVzdHJveWVyKTsKKworCV9lbnRlcigiJXB7JWQsJWQsJXB9IiwKKwkgICAgICAgY2FsbCwgYXRvbWljX3JlYWQoJmNhbGwtPnVzYWdlKSwgY2FsbC0+Y2hhbm5lbCwgY2FsbC0+Y29ubik7CisKKwlBU1NFUlRDTVAoY2FsbC0+c3RhdGUsID09LCBSWFJQQ19DQUxMX0RFQUQpOworCisJd3JpdGVfbG9ja19iaCgmcnhycGNfY2FsbF9sb2NrKTsKKwlsaXN0X2RlbF9pbml0KCZjYWxsLT5saW5rKTsKKwl3cml0ZV91bmxvY2tfYmgoJnJ4cnBjX2NhbGxfbG9jayk7CisKKwlyeHJwY19jbGVhbnVwX2NhbGwoY2FsbCk7CisJX2xlYXZlKCIiKTsKK30KKworLyoKKyAqIHByZWVtcHRpdmVseSBkZXN0cm95IGFsbCB0aGUgY2FsbCByZWNvcmRzIGZyb20gYSB0cmFuc3BvcnQgZW5kcG9pbnQgcmF0aGVyCisgKiB0aGFuIHdhaXRpbmcgZm9yIHRoZW0gdG8gdGltZSBvdXQKKyAqLwordm9pZCBfX2V4aXQgcnhycGNfZGVzdHJveV9hbGxfY2FsbHModm9pZCkKK3sKKwlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbDsKKworCV9lbnRlcigiIik7CisJd3JpdGVfbG9ja19iaCgmcnhycGNfY2FsbF9sb2NrKTsKKworCXdoaWxlICghbGlzdF9lbXB0eSgmcnhycGNfY2FsbHMpKSB7CisJCWNhbGwgPSBsaXN0X2VudHJ5KHJ4cnBjX2NhbGxzLm5leHQsIHN0cnVjdCByeHJwY19jYWxsLCBsaW5rKTsKKwkJX2RlYnVnKCJaYXBwaW5nIGNhbGwgJXAiLCBjYWxsKTsKKworCQlsaXN0X2RlbF9pbml0KCZjYWxsLT5saW5rKTsKKworCQlzd2l0Y2ggKGF0b21pY19yZWFkKCZjYWxsLT51c2FnZSkpIHsKKwkJY2FzZSAwOgorCQkJQVNTRVJUQ01QKGNhbGwtPnN0YXRlLCA9PSwgUlhSUENfQ0FMTF9ERUFEKTsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlpZiAoZGVsX3RpbWVyX3N5bmMoJmNhbGwtPmRlYWRzcGFuKSAhPSAwICYmCisJCQkgICAgY2FsbC0+c3RhdGUgIT0gUlhSUENfQ0FMTF9ERUFEKQorCQkJCXJ4cnBjX2RlYWRfY2FsbF9leHBpcmVkKCh1bnNpZ25lZCBsb25nKSBjYWxsKTsKKwkJCWlmIChjYWxsLT5zdGF0ZSAhPSBSWFJQQ19DQUxMX0RFQUQpCisJCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9FUlIgIlJYUlBDOiIKKwkJCSAgICAgICAiIENhbGwgJXAgc3RpbGwgaW4gdXNlICglZCwlZCwlcywlbHgsJWx4KSFcbiIsCisJCQkgICAgICAgY2FsbCwgYXRvbWljX3JlYWQoJmNhbGwtPnVzYWdlKSwKKwkJCSAgICAgICBhdG9taWNfcmVhZCgmY2FsbC0+YWNrcl9ub3RfaWRsZSksCisJCQkgICAgICAgcnhycGNfY2FsbF9zdGF0ZXNbY2FsbC0+c3RhdGVdLAorCQkJICAgICAgIGNhbGwtPmZsYWdzLCBjYWxsLT5ldmVudHMpOworCQkJaWYgKCFza2JfcXVldWVfZW1wdHkoJmNhbGwtPnJ4X3F1ZXVlKSkKKwkJCQlwcmludGsoS0VSTl9FUlIiUlhSUEM6IFJ4IHF1ZXVlIG9jY3VwaWVkXG4iKTsKKwkJCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZjYWxsLT5yeF9vb3NfcXVldWUpKQorCQkJCXByaW50ayhLRVJOX0VSUiJSWFJQQzogT09TIHF1ZXVlIG9jY3VwaWVkXG4iKTsKKwkJCWJyZWFrOworCQl9CisKKwkJd3JpdGVfdW5sb2NrX2JoKCZyeHJwY19jYWxsX2xvY2spOworCQljb25kX3Jlc2NoZWQoKTsKKwkJd3JpdGVfbG9ja19iaCgmcnhycGNfY2FsbF9sb2NrKTsKKwl9CisKKwl3cml0ZV91bmxvY2tfYmgoJnJ4cnBjX2NhbGxfbG9jayk7CisJX2xlYXZlKCIiKTsKK30KKworLyoKKyAqIGhhbmRsZSBjYWxsIGxpZmV0aW1lIGJlaW5nIGV4Y2VlZGVkCisgKi8KK3N0YXRpYyB2b2lkIHJ4cnBjX2NhbGxfbGlmZV9leHBpcmVkKHVuc2lnbmVkIGxvbmcgX2NhbGwpCit7CisJc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwgPSAoc3RydWN0IHJ4cnBjX2NhbGwgKikgX2NhbGw7CisKKwlpZiAoY2FsbC0+c3RhdGUgPj0gUlhSUENfQ0FMTF9DT01QTEVURSkKKwkJcmV0dXJuOworCisJX2VudGVyKCJ7JWR9IiwgY2FsbC0+ZGVidWdfaWQpOworCXJlYWRfbG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7CisJaWYgKGNhbGwtPnN0YXRlIDwgUlhSUENfQ0FMTF9DT01QTEVURSkgeworCQlzZXRfYml0KFJYUlBDX0NBTExfTElGRV9USU1FUiwgJmNhbGwtPmV2ZW50cyk7CisJCXJ4cnBjX3F1ZXVlX2NhbGwoY2FsbCk7CisJfQorCXJlYWRfdW5sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKK30KKworLyoKKyAqIGhhbmRsZSByZXNlbmQgdGltZXIgZXhwaXJ5CisgKi8KK3N0YXRpYyB2b2lkIHJ4cnBjX3Jlc2VuZF90aW1lX2V4cGlyZWQodW5zaWduZWQgbG9uZyBfY2FsbCkKK3sKKwlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCA9IChzdHJ1Y3QgcnhycGNfY2FsbCAqKSBfY2FsbDsKKworCV9lbnRlcigieyVkfSIsIGNhbGwtPmRlYnVnX2lkKTsKKworCWlmIChjYWxsLT5zdGF0ZSA+PSBSWFJQQ19DQUxMX0NPTVBMRVRFKQorCQlyZXR1cm47CisKKwlyZWFkX2xvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOworCWNsZWFyX2JpdChSWFJQQ19DQUxMX1JVTl9SVElNRVIsICZjYWxsLT5mbGFncyk7CisJaWYgKGNhbGwtPnN0YXRlIDwgUlhSUENfQ0FMTF9DT01QTEVURSAmJgorCSAgICAhdGVzdF9hbmRfc2V0X2JpdChSWFJQQ19DQUxMX1JFU0VORF9USU1FUiwgJmNhbGwtPmV2ZW50cykpCisJCXJ4cnBjX3F1ZXVlX2NhbGwoY2FsbCk7CisJcmVhZF91bmxvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOworfQorCisvKgorICogaGFuZGxlIEFDSyB0aW1lciBleHBpcnkKKyAqLworc3RhdGljIHZvaWQgcnhycGNfYWNrX3RpbWVfZXhwaXJlZCh1bnNpZ25lZCBsb25nIF9jYWxsKQoreworCXN0cnVjdCByeHJwY19jYWxsICpjYWxsID0gKHN0cnVjdCByeHJwY19jYWxsICopIF9jYWxsOworCisJX2VudGVyKCJ7JWR9IiwgY2FsbC0+ZGVidWdfaWQpOworCisJaWYgKGNhbGwtPnN0YXRlID49IFJYUlBDX0NBTExfQ09NUExFVEUpCisJCXJldHVybjsKKworCXJlYWRfbG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7CisJaWYgKGNhbGwtPnN0YXRlIDwgUlhSUENfQ0FMTF9DT01QTEVURSAmJgorCSAgICAhdGVzdF9hbmRfc2V0X2JpdChSWFJQQ19DQUxMX0FDSywgJmNhbGwtPmV2ZW50cykpCisJCXJ4cnBjX3F1ZXVlX2NhbGwoY2FsbCk7CisJcmVhZF91bmxvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOworfQpkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL2FyLWNvbm5lY3Rpb24uYyBiL25ldC9yeHJwYy9hci1jb25uZWN0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNjYjNlMAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9yeHJwYy9hci1jb25uZWN0aW9uLmMKQEAgLTAsMCArMSw5MTEgQEAKKy8qIFJ4UlBDIHZpcnR1YWwgY29ubmVjdGlvbiBoYW5kbGVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPG5ldC9hZl9yeHJwYy5oPgorI2luY2x1ZGUgImFyLWludGVybmFsLmgiCisKK3N0YXRpYyB2b2lkIHJ4cnBjX2Nvbm5lY3Rpb25fcmVhcGVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CisKK0xJU1RfSEVBRChyeHJwY19jb25uZWN0aW9ucyk7CitERUZJTkVfUldMT0NLKHJ4cnBjX2Nvbm5lY3Rpb25fbG9jayk7CitzdGF0aWMgdW5zaWduZWQgbG9uZyByeHJwY19jb25uZWN0aW9uX3RpbWVvdXQgPSAxMCAqIDYwOworc3RhdGljIERFQ0xBUkVfREVMQVlFRF9XT1JLKHJ4cnBjX2Nvbm5lY3Rpb25fcmVhcCwgcnhycGNfY29ubmVjdGlvbl9yZWFwZXIpOworCisvKgorICogYWxsb2NhdGUgYSBuZXcgY2xpZW50IGNvbm5lY3Rpb24gYnVuZGxlCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcnhycGNfY29ubl9idW5kbGUgKnJ4cnBjX2FsbG9jX2J1bmRsZShnZnBfdCBnZnApCit7CisJc3RydWN0IHJ4cnBjX2Nvbm5fYnVuZGxlICpidW5kbGU7CisKKwlfZW50ZXIoIiIpOworCisJYnVuZGxlID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHJ4cnBjX2Nvbm5fYnVuZGxlKSwgZ2ZwKTsKKwlpZiAoYnVuZGxlKSB7CisJCUlOSVRfTElTVF9IRUFEKCZidW5kbGUtPnVudXNlZF9jb25ucyk7CisJCUlOSVRfTElTVF9IRUFEKCZidW5kbGUtPmF2YWlsX2Nvbm5zKTsKKwkJSU5JVF9MSVNUX0hFQUQoJmJ1bmRsZS0+YnVzeV9jb25ucyk7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmJ1bmRsZS0+Y2hhbndhaXQpOworCQlhdG9taWNfc2V0KCZidW5kbGUtPnVzYWdlLCAxKTsKKwl9CisKKwlfbGVhdmUoIiA9ICVwIiwgYnVuZGxlKTsKKwlyZXR1cm4gYnVuZGxlOworfQorCisvKgorICogY29tcGFyZSBidW5kbGUgcGFyYW1ldGVycyB3aXRoIHdoYXQgd2UncmUgbG9va2luZyBmb3IKKyAqIC0gcmV0dXJuIC12ZSwgMCBvciArdmUKKyAqLworc3RhdGljIGlubGluZQoraW50IHJ4cnBjX2NtcF9idW5kbGUoY29uc3Qgc3RydWN0IHJ4cnBjX2Nvbm5fYnVuZGxlICpidW5kbGUsCisJCSAgICAgc3RydWN0IGtleSAqa2V5LCBfX2JlMTYgc2VydmljZV9pZCkKK3sKKwlyZXR1cm4gKGJ1bmRsZS0+c2VydmljZV9pZCAtIHNlcnZpY2VfaWQpID86CisJCSgodW5zaWduZWQgbG9uZykgYnVuZGxlLT5rZXkgLSAodW5zaWduZWQgbG9uZykga2V5KTsKK30KKworLyoKKyAqIGdldCBidW5kbGUgb2YgY2xpZW50IGNvbm5lY3Rpb25zIHRoYXQgYSBjbGllbnQgc29ja2V0IGNhbiBtYWtlIHVzZSBvZgorICovCitzdHJ1Y3QgcnhycGNfY29ubl9idW5kbGUgKnJ4cnBjX2dldF9idW5kbGUoc3RydWN0IHJ4cnBjX3NvY2sgKnJ4LAorCQkJCQkgICBzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICp0cmFucywKKwkJCQkJICAgc3RydWN0IGtleSAqa2V5LAorCQkJCQkgICBfX2JlMTYgc2VydmljZV9pZCwKKwkJCQkJICAgZ2ZwX3QgZ2ZwKQoreworCXN0cnVjdCByeHJwY19jb25uX2J1bmRsZSAqYnVuZGxlLCAqY2FuZGlkYXRlOworCXN0cnVjdCByYl9ub2RlICpwLCAqcGFyZW50LCAqKnBwOworCisJX2VudGVyKCIlcHsleH0sJXgsJWh4LCIsCisJICAgICAgIHJ4LCBrZXlfc2VyaWFsKGtleSksIHRyYW5zLT5kZWJ1Z19pZCwgbnRvaGwoc2VydmljZV9pZCkpOworCisJaWYgKHJ4LT50cmFucyA9PSB0cmFucyAmJiByeC0+YnVuZGxlKSB7CisJCWF0b21pY19pbmMoJnJ4LT5idW5kbGUtPnVzYWdlKTsKKwkJcmV0dXJuIHJ4LT5idW5kbGU7CisJfQorCisJLyogc2VhcmNoIHRoZSBleHRhbnQgYnVuZGxlcyBmaXJzdCBmb3Igb25lIHRoYXQgbWF0Y2hlcyB0aGUgc3BlY2lmaWVkCisJICogdXNlciBJRCAqLworCXNwaW5fbG9jaygmdHJhbnMtPmNsaWVudF9sb2NrKTsKKworCXAgPSB0cmFucy0+YnVuZGxlcy5yYl9ub2RlOworCXdoaWxlIChwKSB7CisJCWJ1bmRsZSA9IHJiX2VudHJ5KHAsIHN0cnVjdCByeHJwY19jb25uX2J1bmRsZSwgbm9kZSk7CisKKwkJaWYgKHJ4cnBjX2NtcF9idW5kbGUoYnVuZGxlLCBrZXksIHNlcnZpY2VfaWQpIDwgMCkKKwkJCXAgPSBwLT5yYl9sZWZ0OworCQllbHNlIGlmIChyeHJwY19jbXBfYnVuZGxlKGJ1bmRsZSwga2V5LCBzZXJ2aWNlX2lkKSA+IDApCisJCQlwID0gcC0+cmJfcmlnaHQ7CisJCWVsc2UKKwkJCWdvdG8gZm91bmRfZXh0YW50X2J1bmRsZTsKKwl9CisKKwlzcGluX3VubG9jaygmdHJhbnMtPmNsaWVudF9sb2NrKTsKKworCS8qIG5vdCB5ZXQgcHJlc2VudCAtIGNyZWF0ZSBhIGNhbmRpZGF0ZSBmb3IgYSBuZXcgcmVjb3JkIGFuZCB0aGVuCisJICogcmVkbyB0aGUgc2VhcmNoICovCisJY2FuZGlkYXRlID0gcnhycGNfYWxsb2NfYnVuZGxlKGdmcCk7CisJaWYgKCFjYW5kaWRhdGUpIHsKKwkJX2xlYXZlKCIgPSAtRU5PTUVNIik7CisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCX0KKworCWNhbmRpZGF0ZS0+a2V5ID0ga2V5X2dldChrZXkpOworCWNhbmRpZGF0ZS0+c2VydmljZV9pZCA9IHNlcnZpY2VfaWQ7CisKKwlzcGluX2xvY2soJnRyYW5zLT5jbGllbnRfbG9jayk7CisKKwlwcCA9ICZ0cmFucy0+YnVuZGxlcy5yYl9ub2RlOworCXBhcmVudCA9IE5VTEw7CisJd2hpbGUgKCpwcCkgeworCQlwYXJlbnQgPSAqcHA7CisJCWJ1bmRsZSA9IHJiX2VudHJ5KHBhcmVudCwgc3RydWN0IHJ4cnBjX2Nvbm5fYnVuZGxlLCBub2RlKTsKKworCQlpZiAocnhycGNfY21wX2J1bmRsZShidW5kbGUsIGtleSwgc2VydmljZV9pZCkgPCAwKQorCQkJcHAgPSAmKCpwcCktPnJiX2xlZnQ7CisJCWVsc2UgaWYgKHJ4cnBjX2NtcF9idW5kbGUoYnVuZGxlLCBrZXksIHNlcnZpY2VfaWQpID4gMCkKKwkJCXBwID0gJigqcHApLT5yYl9yaWdodDsKKwkJZWxzZQorCQkJZ290byBmb3VuZF9leHRhbnRfc2Vjb25kOworCX0KKworCS8qIHNlY29uZCBzZWFyY2ggYWxzbyBmYWlsZWQ7IGFkZCB0aGUgbmV3IGJ1bmRsZSAqLworCWJ1bmRsZSA9IGNhbmRpZGF0ZTsKKwljYW5kaWRhdGUgPSBOVUxMOworCisJcmJfbGlua19ub2RlKCZidW5kbGUtPm5vZGUsIHBhcmVudCwgcHApOworCXJiX2luc2VydF9jb2xvcigmYnVuZGxlLT5ub2RlLCAmdHJhbnMtPmJ1bmRsZXMpOworCXNwaW5fdW5sb2NrKCZ0cmFucy0+Y2xpZW50X2xvY2spOworCV9uZXQoIkJVTkRMRSBuZXcgb24gdHJhbnMgJWQiLCB0cmFucy0+ZGVidWdfaWQpOworCWlmICghcngtPmJ1bmRsZSAmJiByeC0+c2suc2tfc3RhdGUgPT0gUlhSUENfQ0xJRU5UX0NPTk5FQ1RFRCkgeworCQlhdG9taWNfaW5jKCZidW5kbGUtPnVzYWdlKTsKKwkJcngtPmJ1bmRsZSA9IGJ1bmRsZTsKKwl9CisJX2xlYXZlKCIgPSAlcCBbbmV3XSIsIGJ1bmRsZSk7CisJcmV0dXJuIGJ1bmRsZTsKKworCS8qIHdlIGZvdW5kIHRoZSBidW5kbGUgaW4gdGhlIGxpc3QgaW1tZWRpYXRlbHkgKi8KK2ZvdW5kX2V4dGFudF9idW5kbGU6CisJYXRvbWljX2luYygmYnVuZGxlLT51c2FnZSk7CisJc3Bpbl91bmxvY2soJnRyYW5zLT5jbGllbnRfbG9jayk7CisJX25ldCgiQlVORExFIG9sZCBvbiB0cmFucyAlZCIsIHRyYW5zLT5kZWJ1Z19pZCk7CisJaWYgKCFyeC0+YnVuZGxlICYmIHJ4LT5zay5za19zdGF0ZSA9PSBSWFJQQ19DTElFTlRfQ09OTkVDVEVEKSB7CisJCWF0b21pY19pbmMoJmJ1bmRsZS0+dXNhZ2UpOworCQlyeC0+YnVuZGxlID0gYnVuZGxlOworCX0KKwlfbGVhdmUoIiA9ICVwIFtleHRhbnQgJWRdIiwgYnVuZGxlLCBhdG9taWNfcmVhZCgmYnVuZGxlLT51c2FnZSkpOworCXJldHVybiBidW5kbGU7CisKKwkvKiB3ZSBmb3VuZCB0aGUgYnVuZGxlIG9uIHRoZSBzZWNvbmQgdGltZSB0aHJvdWdoIHRoZSBsaXN0ICovCitmb3VuZF9leHRhbnRfc2Vjb25kOgorCWF0b21pY19pbmMoJmJ1bmRsZS0+dXNhZ2UpOworCXNwaW5fdW5sb2NrKCZ0cmFucy0+Y2xpZW50X2xvY2spOworCWtmcmVlKGNhbmRpZGF0ZSk7CisJX25ldCgiQlVORExFIG9sZDIgb24gdHJhbnMgJWQiLCB0cmFucy0+ZGVidWdfaWQpOworCWlmICghcngtPmJ1bmRsZSAmJiByeC0+c2suc2tfc3RhdGUgPT0gUlhSUENfQ0xJRU5UX0NPTk5FQ1RFRCkgeworCQlhdG9taWNfaW5jKCZidW5kbGUtPnVzYWdlKTsKKwkJcngtPmJ1bmRsZSA9IGJ1bmRsZTsKKwl9CisJX2xlYXZlKCIgPSAlcCBbc2Vjb25kICVkXSIsIGJ1bmRsZSwgYXRvbWljX3JlYWQoJmJ1bmRsZS0+dXNhZ2UpKTsKKwlyZXR1cm4gYnVuZGxlOworfQorCisvKgorICogcmVsZWFzZSBhIGJ1bmRsZQorICovCit2b2lkIHJ4cnBjX3B1dF9idW5kbGUoc3RydWN0IHJ4cnBjX3RyYW5zcG9ydCAqdHJhbnMsCisJCSAgICAgIHN0cnVjdCByeHJwY19jb25uX2J1bmRsZSAqYnVuZGxlKQoreworCV9lbnRlcigiJXAsJXB7JWR9Iix0cmFucywgYnVuZGxlLCBhdG9taWNfcmVhZCgmYnVuZGxlLT51c2FnZSkpOworCisJaWYgKGF0b21pY19kZWNfYW5kX2xvY2soJmJ1bmRsZS0+dXNhZ2UsICZ0cmFucy0+Y2xpZW50X2xvY2spKSB7CisJCV9kZWJ1ZygiRGVzdHJveSBidW5kbGUiKTsKKwkJcmJfZXJhc2UoJmJ1bmRsZS0+bm9kZSwgJnRyYW5zLT5idW5kbGVzKTsKKwkJc3Bpbl91bmxvY2soJnRyYW5zLT5jbGllbnRfbG9jayk7CisJCUFTU0VSVChsaXN0X2VtcHR5KCZidW5kbGUtPnVudXNlZF9jb25ucykpOworCQlBU1NFUlQobGlzdF9lbXB0eSgmYnVuZGxlLT5hdmFpbF9jb25ucykpOworCQlBU1NFUlQobGlzdF9lbXB0eSgmYnVuZGxlLT5idXN5X2Nvbm5zKSk7CisJCUFTU0VSVENNUChidW5kbGUtPm51bV9jb25ucywgPT0sIDApOworCQlrZXlfcHV0KGJ1bmRsZS0+a2V5KTsKKwkJa2ZyZWUoYnVuZGxlKTsKKwl9CisKKwlfbGVhdmUoIiIpOworfQorCisvKgorICogYWxsb2NhdGUgYSBuZXcgY29ubmVjdGlvbgorICovCitzdGF0aWMgc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKnJ4cnBjX2FsbG9jX2Nvbm5lY3Rpb24oZ2ZwX3QgZ2ZwKQoreworCXN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uOworCisJX2VudGVyKCIiKTsKKworCWNvbm4gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiksIGdmcCk7CisJaWYgKGNvbm4pIHsKKwkJSU5JVF9XT1JLKCZjb25uLT5wcm9jZXNzb3IsICZyeHJwY19wcm9jZXNzX2Nvbm5lY3Rpb24pOworCQlJTklUX0xJU1RfSEVBRCgmY29ubi0+YnVuZGxlX2xpbmspOworCQljb25uLT5jYWxscyA9IFJCX1JPT1Q7CisJCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmNvbm4tPnJ4X3F1ZXVlKTsKKwkJcndsb2NrX2luaXQoJmNvbm4tPmxvY2spOworCQlzcGluX2xvY2tfaW5pdCgmY29ubi0+c3RhdGVfbG9jayk7CisJCWF0b21pY19zZXQoJmNvbm4tPnVzYWdlLCAxKTsKKwkJY29ubi0+ZGVidWdfaWQgPSBhdG9taWNfaW5jX3JldHVybigmcnhycGNfZGVidWdfaWQpOworCQljb25uLT5hdmFpbF9jYWxscyA9IFJYUlBDX01BWENBTExTOworCQljb25uLT5zaXplX2FsaWduID0gNDsKKwkJY29ubi0+aGVhZGVyX3NpemUgPSBzaXplb2Yoc3RydWN0IHJ4cnBjX2hlYWRlcik7CisJfQorCisJX2xlYXZlKCIgPSAlcHslZH0iLCBjb25uLCBjb25uLT5kZWJ1Z19pZCk7CisJcmV0dXJuIGNvbm47Cit9CisKKy8qCisgKiBhc3NpZ24gYSBjb25uZWN0aW9uIElEIHRvIGEgY29ubmVjdGlvbiBhbmQgYWRkIGl0IHRvIHRoZSB0cmFuc3BvcnQncworICogY29ubmVjdGlvbiBsb29rdXAgdHJlZQorICogLSBjYWxsZWQgd2l0aCB0cmFuc3BvcnQgY2xpZW50IGxvY2sgaGVsZAorICovCitzdGF0aWMgdm9pZCByeHJwY19hc3NpZ25fY29ubmVjdGlvbl9pZChzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubikKK3sKKwlzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqeGNvbm47CisJc3RydWN0IHJiX25vZGUgKnBhcmVudCwgKipwOworCV9fYmUzMiBlcG9jaDsKKwl1MzIgcmVhbF9jb25uX2lkOworCisJX2VudGVyKCIiKTsKKworCWVwb2NoID0gY29ubi0+ZXBvY2g7CisKKwl3cml0ZV9sb2NrX2JoKCZjb25uLT50cmFucy0+Y29ubl9sb2NrKTsKKworCWNvbm4tPnRyYW5zLT5jb25uX2lkY291bnRlciArPSBSWFJQQ19DSURfSU5DOworCWlmIChjb25uLT50cmFucy0+Y29ubl9pZGNvdW50ZXIgPCBSWFJQQ19DSURfSU5DKQorCQljb25uLT50cmFucy0+Y29ubl9pZGNvdW50ZXIgPSBSWFJQQ19DSURfSU5DOworCXJlYWxfY29ubl9pZCA9IGNvbm4tPnRyYW5zLT5jb25uX2lkY291bnRlcjsKKworYXR0ZW1wdF9pbnNlcnRpb246CisJcGFyZW50ID0gTlVMTDsKKwlwID0gJmNvbm4tPnRyYW5zLT5jbGllbnRfY29ubnMucmJfbm9kZTsKKworCXdoaWxlICgqcCkgeworCQlwYXJlbnQgPSAqcDsKKwkJeGNvbm4gPSByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCByeHJwY19jb25uZWN0aW9uLCBub2RlKTsKKworCQlpZiAoZXBvY2ggPCB4Y29ubi0+ZXBvY2gpCisJCQlwID0gJigqcCktPnJiX2xlZnQ7CisJCWVsc2UgaWYgKGVwb2NoID4geGNvbm4tPmVwb2NoKQorCQkJcCA9ICYoKnApLT5yYl9yaWdodDsKKwkJZWxzZSBpZiAocmVhbF9jb25uX2lkIDwgeGNvbm4tPnJlYWxfY29ubl9pZCkKKwkJCXAgPSAmKCpwKS0+cmJfbGVmdDsKKwkJZWxzZSBpZiAocmVhbF9jb25uX2lkID4geGNvbm4tPnJlYWxfY29ubl9pZCkKKwkJCXAgPSAmKCpwKS0+cmJfcmlnaHQ7CisJCWVsc2UKKwkJCWdvdG8gaWRfZXhpc3RzOworCX0KKworCS8qIHdlJ3ZlIGZvdW5kIGEgc3VpdGFibGUgaG9sZSAtIGFycmFuZ2UgZm9yIHRoaXMgY29ubmVjdGlvbiB0byBvY2N1cHkKKwkgKiBpdCAqLworCXJiX2xpbmtfbm9kZSgmY29ubi0+bm9kZSwgcGFyZW50LCBwKTsKKwlyYl9pbnNlcnRfY29sb3IoJmNvbm4tPm5vZGUsICZjb25uLT50cmFucy0+Y2xpZW50X2Nvbm5zKTsKKworCWNvbm4tPnJlYWxfY29ubl9pZCA9IHJlYWxfY29ubl9pZDsKKwljb25uLT5jaWQgPSBodG9ubChyZWFsX2Nvbm5faWQpOworCXdyaXRlX3VubG9ja19iaCgmY29ubi0+dHJhbnMtPmNvbm5fbG9jayk7CisJX2xlYXZlKCIgW0NPTk5JRCAleCBDSUQgJXhdIiwgcmVhbF9jb25uX2lkLCBudG9obChjb25uLT5jaWQpKTsKKwlyZXR1cm47CisKKwkvKiB3ZSBmb3VuZCBhIGNvbm5lY3Rpb24gd2l0aCB0aGUgcHJvcG9zZWQgSUQgLSB3YWxrIHRoZSB0cmVlIGZyb20gdGhhdAorCSAqIHBvaW50IGxvb2tpbmcgZm9yIHRoZSBuZXh0IHVudXNlZCBJRCAqLworaWRfZXhpc3RzOgorCWZvciAoOzspIHsKKwkJcmVhbF9jb25uX2lkICs9IFJYUlBDX0NJRF9JTkM7CisJCWlmIChyZWFsX2Nvbm5faWQgPCBSWFJQQ19DSURfSU5DKSB7CisJCQlyZWFsX2Nvbm5faWQgPSBSWFJQQ19DSURfSU5DOworCQkJY29ubi0+dHJhbnMtPmNvbm5faWRjb3VudGVyID0gcmVhbF9jb25uX2lkOworCQkJZ290byBhdHRlbXB0X2luc2VydGlvbjsKKwkJfQorCisJCXBhcmVudCA9IHJiX25leHQocGFyZW50KTsKKwkJaWYgKCFwYXJlbnQpCisJCQlnb3RvIGF0dGVtcHRfaW5zZXJ0aW9uOworCisJCXhjb25uID0gcmJfZW50cnkocGFyZW50LCBzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiwgbm9kZSk7CisJCWlmIChlcG9jaCA8IHhjb25uLT5lcG9jaCB8fAorCQkgICAgcmVhbF9jb25uX2lkIDwgeGNvbm4tPnJlYWxfY29ubl9pZCkKKwkJCWdvdG8gYXR0ZW1wdF9pbnNlcnRpb247CisJfQorfQorCisvKgorICogYWRkIGEgY2FsbCB0byBhIGNvbm5lY3Rpb24ncyBjYWxsLWJ5LUlEIHRyZWUKKyAqLworc3RhdGljIHZvaWQgcnhycGNfYWRkX2NhbGxfSURfdG9fY29ubihzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubiwKKwkJCQkgICAgICBzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCkKK3sKKwlzdHJ1Y3QgcnhycGNfY2FsbCAqeGNhbGw7CisJc3RydWN0IHJiX25vZGUgKnBhcmVudCwgKipwOworCV9fYmUzMiBjYWxsX2lkOworCisJd3JpdGVfbG9ja19iaCgmY29ubi0+bG9jayk7CisKKwljYWxsX2lkID0gY2FsbC0+Y2FsbF9pZDsKKwlwID0gJmNvbm4tPmNhbGxzLnJiX25vZGU7CisJcGFyZW50ID0gTlVMTDsKKwl3aGlsZSAoKnApIHsKKwkJcGFyZW50ID0gKnA7CisJCXhjYWxsID0gcmJfZW50cnkocGFyZW50LCBzdHJ1Y3QgcnhycGNfY2FsbCwgY29ubl9ub2RlKTsKKworCQlpZiAoY2FsbF9pZCA8IHhjYWxsLT5jYWxsX2lkKQorCQkJcCA9ICYoKnApLT5yYl9sZWZ0OworCQllbHNlIGlmIChjYWxsX2lkID4geGNhbGwtPmNhbGxfaWQpCisJCQlwID0gJigqcCktPnJiX3JpZ2h0OworCQllbHNlCisJCQlCVUcoKTsKKwl9CisKKwlyYl9saW5rX25vZGUoJmNhbGwtPmNvbm5fbm9kZSwgcGFyZW50LCBwKTsKKwlyYl9pbnNlcnRfY29sb3IoJmNhbGwtPmNvbm5fbm9kZSwgJmNvbm4tPmNhbGxzKTsKKworCXdyaXRlX3VubG9ja19iaCgmY29ubi0+bG9jayk7Cit9CisKKy8qCisgKiBjb25uZWN0IGEgY2FsbCBvbiBhbiBleGNsdXNpdmUgY29ubmVjdGlvbgorICovCitzdGF0aWMgaW50IHJ4cnBjX2Nvbm5lY3RfZXhjbHVzaXZlKHN0cnVjdCByeHJwY19zb2NrICpyeCwKKwkJCQkgICBzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICp0cmFucywKKwkJCQkgICBfX2JlMTYgc2VydmljZV9pZCwKKwkJCQkgICBzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwKKwkJCQkgICBnZnBfdCBnZnApCit7CisJc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm47CisJaW50IGNoYW4sIHJldDsKKworCV9lbnRlcigiIik7CisKKwljb25uID0gcngtPmNvbm47CisJaWYgKCFjb25uKSB7CisJCS8qIG5vdCB5ZXQgcHJlc2VudCAtIGNyZWF0ZSBhIGNhbmRpZGF0ZSBmb3IgYSBuZXcgY29ubmVjdGlvbgorCQkgKiBhbmQgdGhlbiByZWRvIHRoZSBjaGVjayAqLworCQljb25uID0gcnhycGNfYWxsb2NfY29ubmVjdGlvbihnZnApOworCQlpZiAoSVNfRVJSKGNvbm4pKSB7CisJCQlfbGVhdmUoIiA9ICVsZCIsIFBUUl9FUlIoY29ubikpOworCQkJcmV0dXJuIFBUUl9FUlIoY29ubik7CisJCX0KKworCQljb25uLT50cmFucyA9IHRyYW5zOworCQljb25uLT5idW5kbGUgPSBOVUxMOworCQljb25uLT5zZXJ2aWNlX2lkID0gc2VydmljZV9pZDsKKwkJY29ubi0+ZXBvY2ggPSByeHJwY19lcG9jaDsKKwkJY29ubi0+aW5fY2xpZW50ZmxhZyA9IDA7CisJCWNvbm4tPm91dF9jbGllbnRmbGFnID0gUlhSUENfQ0xJRU5UX0lOSVRJQVRFRDsKKwkJY29ubi0+Y2lkID0gMDsKKwkJY29ubi0+c3RhdGUgPSBSWFJQQ19DT05OX0NMSUVOVDsKKwkJY29ubi0+YXZhaWxfY2FsbHMgPSBSWFJQQ19NQVhDQUxMUyAtIDE7CisJCWNvbm4tPnNlY3VyaXR5X2xldmVsID0gcngtPm1pbl9zZWNfbGV2ZWw7CisJCWNvbm4tPmtleSA9IGtleV9nZXQocngtPmtleSk7CisKKwkJcmV0ID0gcnhycGNfaW5pdF9jbGllbnRfY29ubl9zZWN1cml0eShjb25uKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWtleV9wdXQoY29ubi0+a2V5KTsKKwkJCWtmcmVlKGNvbm4pOworCQkJX2xlYXZlKCIgPSAlZCBba2V5XSIsIHJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJd3JpdGVfbG9ja19iaCgmcnhycGNfY29ubmVjdGlvbl9sb2NrKTsKKwkJbGlzdF9hZGRfdGFpbCgmY29ubi0+bGluaywgJnJ4cnBjX2Nvbm5lY3Rpb25zKTsKKwkJd3JpdGVfdW5sb2NrX2JoKCZyeHJwY19jb25uZWN0aW9uX2xvY2spOworCisJCXNwaW5fbG9jaygmdHJhbnMtPmNsaWVudF9sb2NrKTsKKwkJYXRvbWljX2luYygmdHJhbnMtPnVzYWdlKTsKKworCQlfbmV0KCJDT05ORUNUIEVYQ0wgbmV3ICVkIG9uIFRSQU5TICVkIiwKKwkJICAgICBjb25uLT5kZWJ1Z19pZCwgY29ubi0+dHJhbnMtPmRlYnVnX2lkKTsKKworCQlyeHJwY19hc3NpZ25fY29ubmVjdGlvbl9pZChjb25uKTsKKwkJcngtPmNvbm4gPSBjb25uOworCX0KKworCS8qIHdlJ3ZlIGdvdCBhIGNvbm5lY3Rpb24gd2l0aCBhIGZyZWUgY2hhbm5lbCBhbmQgd2UgY2FuIG5vdyBhdHRhY2ggdGhlCisJICogY2FsbCB0byBpdAorCSAqIC0gd2UncmUgaG9sZGluZyB0aGUgdHJhbnNwb3J0J3MgY2xpZW50IGxvY2sKKwkgKiAtIHdlJ3JlIGhvbGRpbmcgYSByZWZlcmVuY2Ugb24gdGhlIGNvbm5lY3Rpb24KKwkgKi8KKwlmb3IgKGNoYW4gPSAwOyBjaGFuIDwgUlhSUENfTUFYQ0FMTFM7IGNoYW4rKykKKwkJaWYgKCFjb25uLT5jaGFubmVsc1tjaGFuXSkKKwkJCWdvdG8gZm91bmRfY2hhbm5lbDsKKwlnb3RvIG5vX2ZyZWVfY2hhbm5lbHM7CisKK2ZvdW5kX2NoYW5uZWw6CisJYXRvbWljX2luYygmY29ubi0+dXNhZ2UpOworCWNvbm4tPmNoYW5uZWxzW2NoYW5dID0gY2FsbDsKKwljYWxsLT5jb25uID0gY29ubjsKKwljYWxsLT5jaGFubmVsID0gY2hhbjsKKwljYWxsLT5jaWQgPSBjb25uLT5jaWQgfCBodG9ubChjaGFuKTsKKwljYWxsLT5jYWxsX2lkID0gaHRvbmwoKytjb25uLT5jYWxsX2NvdW50ZXIpOworCisJX25ldCgiQ09OTkVDVCBjbGllbnQgb24gY29ubiAlZCBjaGFuICVkIGFzIGNhbGwgJXgiLAorCSAgICAgY29ubi0+ZGVidWdfaWQsIGNoYW4sIG50b2hsKGNhbGwtPmNhbGxfaWQpKTsKKworCXNwaW5fdW5sb2NrKCZ0cmFucy0+Y2xpZW50X2xvY2spOworCisJcnhycGNfYWRkX2NhbGxfSURfdG9fY29ubihjb25uLCBjYWxsKTsKKwlfbGVhdmUoIiA9IDAiKTsKKwlyZXR1cm4gMDsKKworbm9fZnJlZV9jaGFubmVsczoKKwlzcGluX3VubG9jaygmdHJhbnMtPmNsaWVudF9sb2NrKTsKKwlfbGVhdmUoIiA9IC1FTk9TUiIpOworCXJldHVybiAtRU5PU1I7Cit9CisKKy8qCisgKiBmaW5kIGEgY29ubmVjdGlvbiBmb3IgYSBjYWxsCisgKiAtIGNhbGxlZCBpbiBwcm9jZXNzIGNvbnRleHQgd2l0aCBJUlFzIGVuYWJsZWQKKyAqLworaW50IHJ4cnBjX2Nvbm5lY3RfY2FsbChzdHJ1Y3QgcnhycGNfc29jayAqcngsCisJCSAgICAgICBzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICp0cmFucywKKwkJICAgICAgIHN0cnVjdCByeHJwY19jb25uX2J1bmRsZSAqYnVuZGxlLAorCQkgICAgICAgc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsCisJCSAgICAgICBnZnBfdCBnZnApCit7CisJc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4sICpjYW5kaWRhdGU7CisJaW50IGNoYW4sIHJldDsKKworCURFQ0xBUkVfV0FJVFFVRVVFKG15c2VsZiwgY3VycmVudCk7CisKKwlfZW50ZXIoIiVwLCVseCwiLCByeCwgY2FsbC0+dXNlcl9jYWxsX0lEKTsKKworCWlmICh0ZXN0X2JpdChSWFJQQ19TT0NLX0VYQ0xVU0lWRV9DT05OLCAmcngtPmZsYWdzKSkKKwkJcmV0dXJuIHJ4cnBjX2Nvbm5lY3RfZXhjbHVzaXZlKHJ4LCB0cmFucywgYnVuZGxlLT5zZXJ2aWNlX2lkLAorCQkJCQkgICAgICAgY2FsbCwgZ2ZwKTsKKworCXNwaW5fbG9jaygmdHJhbnMtPmNsaWVudF9sb2NrKTsKKwlmb3IgKDs7KSB7CisJCS8qIHNlZSBpZiB0aGUgYnVuZGxlIGhhcyBhIGNhbGwgc2xvdCBhdmFpbGFibGUgKi8KKwkJaWYgKCFsaXN0X2VtcHR5KCZidW5kbGUtPmF2YWlsX2Nvbm5zKSkgeworCQkJX2RlYnVnKCJhdmFpbCIpOworCQkJY29ubiA9IGxpc3RfZW50cnkoYnVuZGxlLT5hdmFpbF9jb25ucy5uZXh0LAorCQkJCQkgIHN0cnVjdCByeHJwY19jb25uZWN0aW9uLAorCQkJCQkgIGJ1bmRsZV9saW5rKTsKKwkJCWlmICgtLWNvbm4tPmF2YWlsX2NhbGxzID09IDApCisJCQkJbGlzdF9tb3ZlKCZjb25uLT5idW5kbGVfbGluaywKKwkJCQkJICAmYnVuZGxlLT5idXN5X2Nvbm5zKTsKKwkJCUFTU0VSVENNUChjb25uLT5hdmFpbF9jYWxscywgPCwgUlhSUENfTUFYQ0FMTFMpOworCQkJQVNTRVJUKGNvbm4tPmNoYW5uZWxzWzBdID09IE5VTEwgfHwKKwkJCSAgICAgICBjb25uLT5jaGFubmVsc1sxXSA9PSBOVUxMIHx8CisJCQkgICAgICAgY29ubi0+Y2hhbm5lbHNbMl0gPT0gTlVMTCB8fAorCQkJICAgICAgIGNvbm4tPmNoYW5uZWxzWzNdID09IE5VTEwpOworCQkJYXRvbWljX2luYygmY29ubi0+dXNhZ2UpOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoIWxpc3RfZW1wdHkoJmJ1bmRsZS0+dW51c2VkX2Nvbm5zKSkgeworCQkJX2RlYnVnKCJ1bnVzZWQiKTsKKwkJCWNvbm4gPSBsaXN0X2VudHJ5KGJ1bmRsZS0+dW51c2VkX2Nvbm5zLm5leHQsCisJCQkJCSAgc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24sCisJCQkJCSAgYnVuZGxlX2xpbmspOworCQkJQVNTRVJUQ01QKGNvbm4tPmF2YWlsX2NhbGxzLCA9PSwgUlhSUENfTUFYQ0FMTFMpOworCQkJY29ubi0+YXZhaWxfY2FsbHMgPSBSWFJQQ19NQVhDQUxMUyAtIDE7CisJCQlBU1NFUlQoY29ubi0+Y2hhbm5lbHNbMF0gPT0gTlVMTCAmJgorCQkJICAgICAgIGNvbm4tPmNoYW5uZWxzWzFdID09IE5VTEwgJiYKKwkJCSAgICAgICBjb25uLT5jaGFubmVsc1syXSA9PSBOVUxMICYmCisJCQkgICAgICAgY29ubi0+Y2hhbm5lbHNbM10gPT0gTlVMTCk7CisJCQlhdG9taWNfaW5jKCZjb25uLT51c2FnZSk7CisJCQlsaXN0X21vdmUoJmNvbm4tPmJ1bmRsZV9saW5rLCAmYnVuZGxlLT5hdmFpbF9jb25ucyk7CisJCQlicmVhazsKKwkJfQorCisJCS8qIG5lZWQgdG8gYWxsb2NhdGUgYSBuZXcgY29ubmVjdGlvbiAqLworCQlfZGVidWcoImdldCBuZXcgY29ubiBbJWRdIiwgYnVuZGxlLT5udW1fY29ubnMpOworCisJCXNwaW5fdW5sb2NrKCZ0cmFucy0+Y2xpZW50X2xvY2spOworCisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCWdvdG8gaW50ZXJydXB0ZWQ7CisKKwkJaWYgKGJ1bmRsZS0+bnVtX2Nvbm5zID49IDIwKSB7CisJCQlfZGVidWcoInRvbyBtYW55IGNvbm5zIik7CisKKwkJCWlmICghKGdmcCAmIF9fR0ZQX1dBSVQpKSB7CisJCQkJX2xlYXZlKCIgPSAtRUFHQUlOIik7CisJCQkJcmV0dXJuIC1FQUdBSU47CisJCQl9CisKKwkJCWFkZF93YWl0X3F1ZXVlKCZidW5kbGUtPmNoYW53YWl0LCAmbXlzZWxmKTsKKwkJCWZvciAoOzspIHsKKwkJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJCWlmIChidW5kbGUtPm51bV9jb25ucyA8IDIwIHx8CisJCQkJICAgICFsaXN0X2VtcHR5KCZidW5kbGUtPnVudXNlZF9jb25ucykgfHwKKwkJCQkgICAgIWxpc3RfZW1wdHkoJmJ1bmRsZS0+YXZhaWxfY29ubnMpKQorCQkJCQlicmVhazsKKwkJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQkJCWdvdG8gaW50ZXJydXB0ZWRfZGVxdWV1ZTsKKwkJCQlzY2hlZHVsZSgpOworCQkJfQorCQkJcmVtb3ZlX3dhaXRfcXVldWUoJmJ1bmRsZS0+Y2hhbndhaXQsICZteXNlbGYpOworCQkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCQkJc3Bpbl9sb2NrKCZ0cmFucy0+Y2xpZW50X2xvY2spOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBub3QgeWV0IHByZXNlbnQgLSBjcmVhdGUgYSBjYW5kaWRhdGUgZm9yIGEgbmV3IGNvbm5lY3Rpb24gYW5kIHRoZW4KKwkJICogcmVkbyB0aGUgY2hlY2sgKi8KKwkJY2FuZGlkYXRlID0gcnhycGNfYWxsb2NfY29ubmVjdGlvbihnZnApOworCQlpZiAoSVNfRVJSKGNhbmRpZGF0ZSkpIHsKKwkJCV9sZWF2ZSgiID0gJWxkIiwgUFRSX0VSUihjYW5kaWRhdGUpKTsKKwkJCXJldHVybiBQVFJfRVJSKGNhbmRpZGF0ZSk7CisJCX0KKworCQljYW5kaWRhdGUtPnRyYW5zID0gdHJhbnM7CisJCWNhbmRpZGF0ZS0+YnVuZGxlID0gYnVuZGxlOworCQljYW5kaWRhdGUtPnNlcnZpY2VfaWQgPSBidW5kbGUtPnNlcnZpY2VfaWQ7CisJCWNhbmRpZGF0ZS0+ZXBvY2ggPSByeHJwY19lcG9jaDsKKwkJY2FuZGlkYXRlLT5pbl9jbGllbnRmbGFnID0gMDsKKwkJY2FuZGlkYXRlLT5vdXRfY2xpZW50ZmxhZyA9IFJYUlBDX0NMSUVOVF9JTklUSUFURUQ7CisJCWNhbmRpZGF0ZS0+Y2lkID0gMDsKKwkJY2FuZGlkYXRlLT5zdGF0ZSA9IFJYUlBDX0NPTk5fQ0xJRU5UOworCQljYW5kaWRhdGUtPmF2YWlsX2NhbGxzID0gUlhSUENfTUFYQ0FMTFM7CisJCWNhbmRpZGF0ZS0+c2VjdXJpdHlfbGV2ZWwgPSByeC0+bWluX3NlY19sZXZlbDsKKwkJY2FuZGlkYXRlLT5rZXkgPSBrZXlfZ2V0KGJ1bmRsZS0+a2V5KTsKKworCQlyZXQgPSByeHJwY19pbml0X2NsaWVudF9jb25uX3NlY3VyaXR5KGNhbmRpZGF0ZSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlrZXlfcHV0KGNhbmRpZGF0ZS0+a2V5KTsKKwkJCWtmcmVlKGNhbmRpZGF0ZSk7CisJCQlfbGVhdmUoIiA9ICVkIFtrZXldIiwgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQl3cml0ZV9sb2NrX2JoKCZyeHJwY19jb25uZWN0aW9uX2xvY2spOworCQlsaXN0X2FkZF90YWlsKCZjYW5kaWRhdGUtPmxpbmssICZyeHJwY19jb25uZWN0aW9ucyk7CisJCXdyaXRlX3VubG9ja19iaCgmcnhycGNfY29ubmVjdGlvbl9sb2NrKTsKKworCQlzcGluX2xvY2soJnRyYW5zLT5jbGllbnRfbG9jayk7CisKKwkJbGlzdF9hZGQoJmNhbmRpZGF0ZS0+YnVuZGxlX2xpbmssICZidW5kbGUtPnVudXNlZF9jb25ucyk7CisJCWJ1bmRsZS0+bnVtX2Nvbm5zKys7CisJCWF0b21pY19pbmMoJmJ1bmRsZS0+dXNhZ2UpOworCQlhdG9taWNfaW5jKCZ0cmFucy0+dXNhZ2UpOworCisJCV9uZXQoIkNPTk5FQ1QgbmV3ICVkIG9uIFRSQU5TICVkIiwKKwkJICAgICBjYW5kaWRhdGUtPmRlYnVnX2lkLCBjYW5kaWRhdGUtPnRyYW5zLT5kZWJ1Z19pZCk7CisKKwkJcnhycGNfYXNzaWduX2Nvbm5lY3Rpb25faWQoY2FuZGlkYXRlKTsKKwkJaWYgKGNhbmRpZGF0ZS0+c2VjdXJpdHkpCisJCQljYW5kaWRhdGUtPnNlY3VyaXR5LT5wcmltZV9wYWNrZXRfc2VjdXJpdHkoY2FuZGlkYXRlKTsKKworCQkvKiBsZWF2ZSB0aGUgY2FuZGlkYXRlIGx1cmtpbmcgaW4gem9tYmllIG1vZGUgYXR0YWNoZWQgdG8gdGhlCisJCSAqIGJ1bmRsZSB1bnRpbCB3ZSdyZSByZWFkeSBmb3IgaXQgKi8KKwkJcnhycGNfcHV0X2Nvbm5lY3Rpb24oY2FuZGlkYXRlKTsKKwkJY2FuZGlkYXRlID0gTlVMTDsKKwl9CisKKwkvKiB3ZSd2ZSBnb3QgYSBjb25uZWN0aW9uIHdpdGggYSBmcmVlIGNoYW5uZWwgYW5kIHdlIGNhbiBub3cgYXR0YWNoIHRoZQorCSAqIGNhbGwgdG8gaXQKKwkgKiAtIHdlJ3JlIGhvbGRpbmcgdGhlIHRyYW5zcG9ydCdzIGNsaWVudCBsb2NrCisJICogLSB3ZSdyZSBob2xkaW5nIGEgcmVmZXJlbmNlIG9uIHRoZSBjb25uZWN0aW9uCisJICogLSB3ZSdyZSBob2xkaW5nIGEgcmVmZXJlbmNlIG9uIHRoZSBidW5kbGUKKwkgKi8KKwlmb3IgKGNoYW4gPSAwOyBjaGFuIDwgUlhSUENfTUFYQ0FMTFM7IGNoYW4rKykKKwkJaWYgKCFjb25uLT5jaGFubmVsc1tjaGFuXSkKKwkJCWdvdG8gZm91bmRfY2hhbm5lbDsKKwlBU1NFUlQoY29ubi0+Y2hhbm5lbHNbMF0gPT0gTlVMTCB8fAorCSAgICAgICBjb25uLT5jaGFubmVsc1sxXSA9PSBOVUxMIHx8CisJICAgICAgIGNvbm4tPmNoYW5uZWxzWzJdID09IE5VTEwgfHwKKwkgICAgICAgY29ubi0+Y2hhbm5lbHNbM10gPT0gTlVMTCk7CisJQlVHKCk7CisKK2ZvdW5kX2NoYW5uZWw6CisJY29ubi0+Y2hhbm5lbHNbY2hhbl0gPSBjYWxsOworCWNhbGwtPmNvbm4gPSBjb25uOworCWNhbGwtPmNoYW5uZWwgPSBjaGFuOworCWNhbGwtPmNpZCA9IGNvbm4tPmNpZCB8IGh0b25sKGNoYW4pOworCWNhbGwtPmNhbGxfaWQgPSBodG9ubCgrK2Nvbm4tPmNhbGxfY291bnRlcik7CisKKwlfbmV0KCJDT05ORUNUIGNsaWVudCBvbiBjb25uICVkIGNoYW4gJWQgYXMgY2FsbCAleCIsCisJICAgICBjb25uLT5kZWJ1Z19pZCwgY2hhbiwgbnRvaGwoY2FsbC0+Y2FsbF9pZCkpOworCisJQVNTRVJUQ01QKGNvbm4tPmF2YWlsX2NhbGxzLCA8LCBSWFJQQ19NQVhDQUxMUyk7CisJc3Bpbl91bmxvY2soJnRyYW5zLT5jbGllbnRfbG9jayk7CisKKwlyeHJwY19hZGRfY2FsbF9JRF90b19jb25uKGNvbm4sIGNhbGwpOworCisJX2xlYXZlKCIgPSAwIik7CisJcmV0dXJuIDA7CisKK2ludGVycnVwdGVkX2RlcXVldWU6CisJcmVtb3ZlX3dhaXRfcXVldWUoJmJ1bmRsZS0+Y2hhbndhaXQsICZteXNlbGYpOworCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKK2ludGVycnVwdGVkOgorCV9sZWF2ZSgiID0gLUVSRVNUQVJUU1lTIik7CisJcmV0dXJuIC1FUkVTVEFSVFNZUzsKK30KKworLyoKKyAqIGdldCBhIHJlY29yZCBvZiBhbiBpbmNvbWluZyBjb25uZWN0aW9uCisgKi8KK3N0cnVjdCByeHJwY19jb25uZWN0aW9uICoKK3J4cnBjX2luY29taW5nX2Nvbm5lY3Rpb24oc3RydWN0IHJ4cnBjX3RyYW5zcG9ydCAqdHJhbnMsCisJCQkgIHN0cnVjdCByeHJwY19oZWFkZXIgKmhkciwKKwkJCSAgZ2ZwX3QgZ2ZwKQoreworCXN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uLCAqY2FuZGlkYXRlID0gTlVMTDsKKwlzdHJ1Y3QgcmJfbm9kZSAqcCwgKipwcDsKKwljb25zdCBjaGFyICpuZXcgPSAib2xkIjsKKwlfX2JlMzIgZXBvY2g7CisJdTMyIGNvbm5faWQ7CisKKwlfZW50ZXIoIiIpOworCisJQVNTRVJUKGhkci0+ZmxhZ3MgJiBSWFJQQ19DTElFTlRfSU5JVElBVEVEKTsKKworCWVwb2NoID0gaGRyLT5lcG9jaDsKKwljb25uX2lkID0gbnRvaGwoaGRyLT5jaWQpICYgUlhSUENfQ0lETUFTSzsKKworCS8qIHNlYXJjaCB0aGUgY29ubmVjdGlvbiBsaXN0IGZpcnN0ICovCisJcmVhZF9sb2NrX2JoKCZ0cmFucy0+Y29ubl9sb2NrKTsKKworCXAgPSB0cmFucy0+c2VydmVyX2Nvbm5zLnJiX25vZGU7CisJd2hpbGUgKHApIHsKKwkJY29ubiA9IHJiX2VudHJ5KHAsIHN0cnVjdCByeHJwY19jb25uZWN0aW9uLCBub2RlKTsKKworCQlfZGVidWcoIm1heWJlICV4IiwgY29ubi0+cmVhbF9jb25uX2lkKTsKKworCQlpZiAoZXBvY2ggPCBjb25uLT5lcG9jaCkKKwkJCXAgPSBwLT5yYl9sZWZ0OworCQllbHNlIGlmIChlcG9jaCA+IGNvbm4tPmVwb2NoKQorCQkJcCA9IHAtPnJiX3JpZ2h0OworCQllbHNlIGlmIChjb25uX2lkIDwgY29ubi0+cmVhbF9jb25uX2lkKQorCQkJcCA9IHAtPnJiX2xlZnQ7CisJCWVsc2UgaWYgKGNvbm5faWQgPiBjb25uLT5yZWFsX2Nvbm5faWQpCisJCQlwID0gcC0+cmJfcmlnaHQ7CisJCWVsc2UKKwkJCWdvdG8gZm91bmRfZXh0YW50X2Nvbm5lY3Rpb247CisJfQorCXJlYWRfdW5sb2NrX2JoKCZ0cmFucy0+Y29ubl9sb2NrKTsKKworCS8qIG5vdCB5ZXQgcHJlc2VudCAtIGNyZWF0ZSBhIGNhbmRpZGF0ZSBmb3IgYSBuZXcgcmVjb3JkIGFuZCB0aGVuCisJICogcmVkbyB0aGUgc2VhcmNoICovCisJY2FuZGlkYXRlID0gcnhycGNfYWxsb2NfY29ubmVjdGlvbihnZnApOworCWlmICghY2FuZGlkYXRlKSB7CisJCV9sZWF2ZSgiID0gLUVOT01FTSIpOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwl9CisKKwljYW5kaWRhdGUtPnRyYW5zID0gdHJhbnM7CisJY2FuZGlkYXRlLT5lcG9jaCA9IGhkci0+ZXBvY2g7CisJY2FuZGlkYXRlLT5jaWQgPSBoZHItPmNpZCAmIF9fY29uc3RhbnRfY3B1X3RvX2JlMzIoUlhSUENfQ0lETUFTSyk7CisJY2FuZGlkYXRlLT5zZXJ2aWNlX2lkID0gaGRyLT5zZXJ2aWNlSWQ7CisJY2FuZGlkYXRlLT5zZWN1cml0eV9peCA9IGhkci0+c2VjdXJpdHlJbmRleDsKKwljYW5kaWRhdGUtPmluX2NsaWVudGZsYWcgPSBSWFJQQ19DTElFTlRfSU5JVElBVEVEOworCWNhbmRpZGF0ZS0+b3V0X2NsaWVudGZsYWcgPSAwOworCWNhbmRpZGF0ZS0+cmVhbF9jb25uX2lkID0gY29ubl9pZDsKKwljYW5kaWRhdGUtPnN0YXRlID0gUlhSUENfQ09OTl9TRVJWRVI7CisJaWYgKGNhbmRpZGF0ZS0+c2VydmljZV9pZCkKKwkJY2FuZGlkYXRlLT5zdGF0ZSA9IFJYUlBDX0NPTk5fU0VSVkVSX1VOU0VDVVJFRDsKKworCXdyaXRlX2xvY2tfYmgoJnRyYW5zLT5jb25uX2xvY2spOworCisJcHAgPSAmdHJhbnMtPnNlcnZlcl9jb25ucy5yYl9ub2RlOworCXAgPSBOVUxMOworCXdoaWxlICgqcHApIHsKKwkJcCA9ICpwcDsKKwkJY29ubiA9IHJiX2VudHJ5KHAsIHN0cnVjdCByeHJwY19jb25uZWN0aW9uLCBub2RlKTsKKworCQlpZiAoZXBvY2ggPCBjb25uLT5lcG9jaCkKKwkJCXBwID0gJigqcHApLT5yYl9sZWZ0OworCQllbHNlIGlmIChlcG9jaCA+IGNvbm4tPmVwb2NoKQorCQkJcHAgPSAmKCpwcCktPnJiX3JpZ2h0OworCQllbHNlIGlmIChjb25uX2lkIDwgY29ubi0+cmVhbF9jb25uX2lkKQorCQkJcHAgPSAmKCpwcCktPnJiX2xlZnQ7CisJCWVsc2UgaWYgKGNvbm5faWQgPiBjb25uLT5yZWFsX2Nvbm5faWQpCisJCQlwcCA9ICYoKnBwKS0+cmJfcmlnaHQ7CisJCWVsc2UKKwkJCWdvdG8gZm91bmRfZXh0YW50X3NlY29uZDsKKwl9CisKKwkvKiB3ZSBjYW4gbm93IGFkZCB0aGUgbmV3IGNhbmRpZGF0ZSB0byB0aGUgbGlzdCAqLworCWNvbm4gPSBjYW5kaWRhdGU7CisJY2FuZGlkYXRlID0gTlVMTDsKKwlyYl9saW5rX25vZGUoJmNvbm4tPm5vZGUsIHAsIHBwKTsKKwlyYl9pbnNlcnRfY29sb3IoJmNvbm4tPm5vZGUsICZ0cmFucy0+c2VydmVyX2Nvbm5zKTsKKwlhdG9taWNfaW5jKCZjb25uLT50cmFucy0+dXNhZ2UpOworCisJd3JpdGVfdW5sb2NrX2JoKCZ0cmFucy0+Y29ubl9sb2NrKTsKKworCXdyaXRlX2xvY2tfYmgoJnJ4cnBjX2Nvbm5lY3Rpb25fbG9jayk7CisJbGlzdF9hZGRfdGFpbCgmY29ubi0+bGluaywgJnJ4cnBjX2Nvbm5lY3Rpb25zKTsKKwl3cml0ZV91bmxvY2tfYmgoJnJ4cnBjX2Nvbm5lY3Rpb25fbG9jayk7CisKKwluZXcgPSAibmV3IjsKKworc3VjY2VzczoKKwlfbmV0KCJDT05ORUNUSU9OICVzICVkIHsleH0iLCBuZXcsIGNvbm4tPmRlYnVnX2lkLCBjb25uLT5yZWFsX2Nvbm5faWQpOworCisJX2xlYXZlKCIgPSAlcCB7dT0lZH0iLCBjb25uLCBhdG9taWNfcmVhZCgmY29ubi0+dXNhZ2UpKTsKKwlyZXR1cm4gY29ubjsKKworCS8qIHdlIGZvdW5kIHRoZSBjb25uZWN0aW9uIGluIHRoZSBsaXN0IGltbWVkaWF0ZWx5ICovCitmb3VuZF9leHRhbnRfY29ubmVjdGlvbjoKKwlpZiAoaGRyLT5zZWN1cml0eUluZGV4ICE9IGNvbm4tPnNlY3VyaXR5X2l4KSB7CisJCXJlYWRfdW5sb2NrX2JoKCZ0cmFucy0+Y29ubl9sb2NrKTsKKwkJZ290byBzZWN1cml0eV9taXNtYXRjaDsKKwl9CisJYXRvbWljX2luYygmY29ubi0+dXNhZ2UpOworCXJlYWRfdW5sb2NrX2JoKCZ0cmFucy0+Y29ubl9sb2NrKTsKKwlnb3RvIHN1Y2Nlc3M7CisKKwkvKiB3ZSBmb3VuZCB0aGUgY29ubmVjdGlvbiBvbiB0aGUgc2Vjb25kIHRpbWUgdGhyb3VnaCB0aGUgbGlzdCAqLworZm91bmRfZXh0YW50X3NlY29uZDoKKwlpZiAoaGRyLT5zZWN1cml0eUluZGV4ICE9IGNvbm4tPnNlY3VyaXR5X2l4KSB7CisJCXdyaXRlX3VubG9ja19iaCgmdHJhbnMtPmNvbm5fbG9jayk7CisJCWdvdG8gc2VjdXJpdHlfbWlzbWF0Y2g7CisJfQorCWF0b21pY19pbmMoJmNvbm4tPnVzYWdlKTsKKwl3cml0ZV91bmxvY2tfYmgoJnRyYW5zLT5jb25uX2xvY2spOworCWtmcmVlKGNhbmRpZGF0ZSk7CisJZ290byBzdWNjZXNzOworCitzZWN1cml0eV9taXNtYXRjaDoKKwlrZnJlZShjYW5kaWRhdGUpOworCV9sZWF2ZSgiID0gLUVLRVlSRUpFQ1RFRCIpOworCXJldHVybiBFUlJfUFRSKC1FS0VZUkVKRUNURUQpOworfQorCisvKgorICogZmluZCBhIGNvbm5lY3Rpb24gYmFzZWQgb24gdHJhbnNwb3J0IGFuZCBSeFJQQyBjb25uZWN0aW9uIElEIGZvciBhbiBpbmNvbWluZworICogcGFja2V0CisgKi8KK3N0cnVjdCByeHJwY19jb25uZWN0aW9uICpyeHJwY19maW5kX2Nvbm5lY3Rpb24oc3RydWN0IHJ4cnBjX3RyYW5zcG9ydCAqdHJhbnMsCisJCQkJCSAgICAgICBzdHJ1Y3QgcnhycGNfaGVhZGVyICpoZHIpCit7CisJc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm47CisJc3RydWN0IHJiX25vZGUgKnA7CisJX19iZTMyIGVwb2NoOworCXUzMiBjb25uX2lkOworCisJX2VudGVyKCIseyV4LCV4fSIsIG50b2hsKGhkci0+Y2lkKSwgaGRyLT5mbGFncyk7CisKKwlyZWFkX2xvY2tfYmgoJnRyYW5zLT5jb25uX2xvY2spOworCisJY29ubl9pZCA9IG50b2hsKGhkci0+Y2lkKSAmIFJYUlBDX0NJRE1BU0s7CisJZXBvY2ggPSBoZHItPmVwb2NoOworCisJaWYgKGhkci0+ZmxhZ3MgJiBSWFJQQ19DTElFTlRfSU5JVElBVEVEKQorCQlwID0gdHJhbnMtPnNlcnZlcl9jb25ucy5yYl9ub2RlOworCWVsc2UKKwkJcCA9IHRyYW5zLT5jbGllbnRfY29ubnMucmJfbm9kZTsKKworCXdoaWxlIChwKSB7CisJCWNvbm4gPSByYl9lbnRyeShwLCBzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiwgbm9kZSk7CisKKwkJX2RlYnVnKCJtYXliZSAleCIsIGNvbm4tPnJlYWxfY29ubl9pZCk7CisKKwkJaWYgKGVwb2NoIDwgY29ubi0+ZXBvY2gpCisJCQlwID0gcC0+cmJfbGVmdDsKKwkJZWxzZSBpZiAoZXBvY2ggPiBjb25uLT5lcG9jaCkKKwkJCXAgPSBwLT5yYl9yaWdodDsKKwkJZWxzZSBpZiAoY29ubl9pZCA8IGNvbm4tPnJlYWxfY29ubl9pZCkKKwkJCXAgPSBwLT5yYl9sZWZ0OworCQllbHNlIGlmIChjb25uX2lkID4gY29ubi0+cmVhbF9jb25uX2lkKQorCQkJcCA9IHAtPnJiX3JpZ2h0OworCQllbHNlCisJCQlnb3RvIGZvdW5kOworCX0KKworCXJlYWRfdW5sb2NrX2JoKCZ0cmFucy0+Y29ubl9sb2NrKTsKKwlfbGVhdmUoIiA9IE5VTEwiKTsKKwlyZXR1cm4gTlVMTDsKKworZm91bmQ6CisJYXRvbWljX2luYygmY29ubi0+dXNhZ2UpOworCXJlYWRfdW5sb2NrX2JoKCZ0cmFucy0+Y29ubl9sb2NrKTsKKwlfbGVhdmUoIiA9ICVwIiwgY29ubik7CisJcmV0dXJuIGNvbm47Cit9CisKKy8qCisgKiByZWxlYXNlIGEgdmlydHVhbCBjb25uZWN0aW9uCisgKi8KK3ZvaWQgcnhycGNfcHV0X2Nvbm5lY3Rpb24oc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4pCit7CisJX2VudGVyKCIlcHt1PSVkLGQ9JWR9IiwKKwkgICAgICAgY29ubiwgYXRvbWljX3JlYWQoJmNvbm4tPnVzYWdlKSwgY29ubi0+ZGVidWdfaWQpOworCisJQVNTRVJUQ01QKGF0b21pY19yZWFkKCZjb25uLT51c2FnZSksID4sIDApOworCisJY29ubi0+cHV0X3RpbWUgPSB4dGltZS50dl9zZWM7CisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmNvbm4tPnVzYWdlKSkgeworCQlfZGVidWcoInpvbWJpZSIpOworCQlyeHJwY19xdWV1ZV9kZWxheWVkX3dvcmsoJnJ4cnBjX2Nvbm5lY3Rpb25fcmVhcCwgMCk7CisJfQorCisJX2xlYXZlKCIiKTsKK30KKworLyoKKyAqIGRlc3Ryb3kgYSB2aXJ0dWFsIGNvbm5lY3Rpb24KKyAqLworc3RhdGljIHZvaWQgcnhycGNfZGVzdHJveV9jb25uZWN0aW9uKHN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uKQoreworCV9lbnRlcigiJXB7JWR9IiwgY29ubiwgYXRvbWljX3JlYWQoJmNvbm4tPnVzYWdlKSk7CisKKwlBU1NFUlRDTVAoYXRvbWljX3JlYWQoJmNvbm4tPnVzYWdlKSwgPT0sIDApOworCisJX25ldCgiREVTVFJPWSBDT05OICVkIiwgY29ubi0+ZGVidWdfaWQpOworCisJaWYgKGNvbm4tPmJ1bmRsZSkKKwkJcnhycGNfcHV0X2J1bmRsZShjb25uLT50cmFucywgY29ubi0+YnVuZGxlKTsKKworCUFTU0VSVChSQl9FTVBUWV9ST09UKCZjb25uLT5jYWxscykpOworCXJ4cnBjX3B1cmdlX3F1ZXVlKCZjb25uLT5yeF9xdWV1ZSk7CisKKwlyeHJwY19jbGVhcl9jb25uX3NlY3VyaXR5KGNvbm4pOworCXJ4cnBjX3B1dF90cmFuc3BvcnQoY29ubi0+dHJhbnMpOworCWtmcmVlKGNvbm4pOworCV9sZWF2ZSgiIik7Cit9CisKKy8qCisgKiByZWFwIGRlYWQgY29ubmVjdGlvbnMKKyAqLwordm9pZCByeHJwY19jb25uZWN0aW9uX3JlYXBlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4sICpfcDsKKwl1bnNpZ25lZCBsb25nIG5vdywgZWFybGllc3QsIHJlYXBfdGltZTsKKworCUxJU1RfSEVBRChncmF2ZXlhcmQpOworCisJX2VudGVyKCIiKTsKKworCW5vdyA9IHh0aW1lLnR2X3NlYzsKKwllYXJsaWVzdCA9IFVMT05HX01BWDsKKworCXdyaXRlX2xvY2tfYmgoJnJ4cnBjX2Nvbm5lY3Rpb25fbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNvbm4sIF9wLCAmcnhycGNfY29ubmVjdGlvbnMsIGxpbmspIHsKKwkJX2RlYnVnKCJyZWFwIENPTk4gJWQgeyB1PSVkLHQ9JWxkIH0iLAorCQkgICAgICAgY29ubi0+ZGVidWdfaWQsIGF0b21pY19yZWFkKCZjb25uLT51c2FnZSksCisJCSAgICAgICAobG9uZykgbm93IC0gKGxvbmcpIGNvbm4tPnB1dF90aW1lKTsKKworCQlpZiAobGlrZWx5KGF0b21pY19yZWFkKCZjb25uLT51c2FnZSkgPiAwKSkKKwkJCWNvbnRpbnVlOworCisJCXNwaW5fbG9jaygmY29ubi0+dHJhbnMtPmNsaWVudF9sb2NrKTsKKwkJd3JpdGVfbG9jaygmY29ubi0+dHJhbnMtPmNvbm5fbG9jayk7CisJCXJlYXBfdGltZSA9IGNvbm4tPnB1dF90aW1lICsgcnhycGNfY29ubmVjdGlvbl90aW1lb3V0OworCisJCWlmIChhdG9taWNfcmVhZCgmY29ubi0+dXNhZ2UpID4gMCkgeworCQkJOworCQl9IGVsc2UgaWYgKHJlYXBfdGltZSA8PSBub3cpIHsKKwkJCWxpc3RfbW92ZV90YWlsKCZjb25uLT5saW5rLCAmZ3JhdmV5YXJkKTsKKwkJCWlmIChjb25uLT5vdXRfY2xpZW50ZmxhZykKKwkJCQlyYl9lcmFzZSgmY29ubi0+bm9kZSwKKwkJCQkJICZjb25uLT50cmFucy0+Y2xpZW50X2Nvbm5zKTsKKwkJCWVsc2UKKwkJCQlyYl9lcmFzZSgmY29ubi0+bm9kZSwKKwkJCQkJICZjb25uLT50cmFucy0+c2VydmVyX2Nvbm5zKTsKKwkJCWlmIChjb25uLT5idW5kbGUpIHsKKwkJCQlsaXN0X2RlbF9pbml0KCZjb25uLT5idW5kbGVfbGluayk7CisJCQkJY29ubi0+YnVuZGxlLT5udW1fY29ubnMtLTsKKwkJCX0KKworCQl9IGVsc2UgaWYgKHJlYXBfdGltZSA8IGVhcmxpZXN0KSB7CisJCQllYXJsaWVzdCA9IHJlYXBfdGltZTsKKwkJfQorCisJCXdyaXRlX3VubG9jaygmY29ubi0+dHJhbnMtPmNvbm5fbG9jayk7CisJCXNwaW5fdW5sb2NrKCZjb25uLT50cmFucy0+Y2xpZW50X2xvY2spOworCX0KKwl3cml0ZV91bmxvY2tfYmgoJnJ4cnBjX2Nvbm5lY3Rpb25fbG9jayk7CisKKwlpZiAoZWFybGllc3QgIT0gVUxPTkdfTUFYKSB7CisJCV9kZWJ1ZygicmVzY2hlZHVsZSByZWFwZXIgJWxkIiwgKGxvbmcpIGVhcmxpZXN0IC0gbm93KTsKKwkJQVNTRVJUQ01QKGVhcmxpZXN0LCA+LCBub3cpOworCQlyeHJwY19xdWV1ZV9kZWxheWVkX3dvcmsoJnJ4cnBjX2Nvbm5lY3Rpb25fcmVhcCwKKwkJCQkJIChlYXJsaWVzdCAtIG5vdykgKiBIWik7CisJfQorCisJLyogdGhlbiBkZXN0cm95IGFsbCB0aG9zZSBwdWxsZWQgb3V0ICovCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZncmF2ZXlhcmQpKSB7CisJCWNvbm4gPSBsaXN0X2VudHJ5KGdyYXZleWFyZC5uZXh0LCBzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiwKKwkJCQkgIGxpbmspOworCQlsaXN0X2RlbF9pbml0KCZjb25uLT5saW5rKTsKKworCQlBU1NFUlRDTVAoYXRvbWljX3JlYWQoJmNvbm4tPnVzYWdlKSwgPT0sIDApOworCQlyeHJwY19kZXN0cm95X2Nvbm5lY3Rpb24oY29ubik7CisJfQorCisJX2xlYXZlKCIiKTsKK30KKworLyoKKyAqIHByZWVtcHRpdmVseSBkZXN0cm95IGFsbCB0aGUgY29ubmVjdGlvbiByZWNvcmRzIHJhdGhlciB0aGFuIHdhaXRpbmcgZm9yIHRoZW0KKyAqIHRvIHRpbWUgb3V0CisgKi8KK3ZvaWQgX19leGl0IHJ4cnBjX2Rlc3Ryb3lfYWxsX2Nvbm5lY3Rpb25zKHZvaWQpCit7CisJX2VudGVyKCIiKTsKKworCXJ4cnBjX2Nvbm5lY3Rpb25fdGltZW91dCA9IDA7CisJY2FuY2VsX2RlbGF5ZWRfd29yaygmcnhycGNfY29ubmVjdGlvbl9yZWFwKTsKKwlyeHJwY19xdWV1ZV9kZWxheWVkX3dvcmsoJnJ4cnBjX2Nvbm5lY3Rpb25fcmVhcCwgMCk7CisKKwlfbGVhdmUoIiIpOworfQpkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL2FyLWNvbm5ldmVudC5jIGIvbmV0L3J4cnBjL2FyLWNvbm5ldmVudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhZGE0M2QKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvcnhycGMvYXItY29ubmV2ZW50LmMKQEAgLTAsMCArMSw0MDMgQEAKKy8qIGNvbm5lY3Rpb24tbGV2ZWwgZXZlbnQgaGFuZGxpbmcKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2VycnF1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvdWRwLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pbjYuaD4KKyNpbmNsdWRlIDxsaW51eC9pY21wLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxuZXQvYWZfcnhycGMuaD4KKyNpbmNsdWRlIDxuZXQvaXAuaD4KKyNpbmNsdWRlICJhci1pbnRlcm5hbC5oIgorCisvKgorICogcGFzcyBhIGNvbm5lY3Rpb24tbGV2ZWwgYWJvcnQgb250byBhbGwgY2FsbHMgb24gdGhhdCBjb25uZWN0aW9uCisgKi8KK3N0YXRpYyB2b2lkIHJ4cnBjX2Fib3J0X2NhbGxzKHN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uLCBpbnQgc3RhdGUsCisJCQkgICAgICB1MzIgYWJvcnRfY29kZSkKK3sKKwlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbDsKKwlzdHJ1Y3QgcmJfbm9kZSAqcDsKKworCV9lbnRlcigieyVkfSwleCIsIGNvbm4tPmRlYnVnX2lkLCBhYm9ydF9jb2RlKTsKKworCXJlYWRfbG9ja19iaCgmY29ubi0+bG9jayk7CisKKwlmb3IgKHAgPSByYl9maXJzdCgmY29ubi0+Y2FsbHMpOyBwOyBwID0gcmJfbmV4dChwKSkgeworCQljYWxsID0gcmJfZW50cnkocCwgc3RydWN0IHJ4cnBjX2NhbGwsIGNvbm5fbm9kZSk7CisJCXdyaXRlX2xvY2soJmNhbGwtPnN0YXRlX2xvY2spOworCQlpZiAoY2FsbC0+c3RhdGUgPD0gUlhSUENfQ0FMTF9DT01QTEVURSkgeworCQkJY2FsbC0+c3RhdGUgPSBzdGF0ZTsKKwkJCWNhbGwtPmFib3J0X2NvZGUgPSBhYm9ydF9jb2RlOworCQkJaWYgKHN0YXRlID09IFJYUlBDX0NBTExfTE9DQUxMWV9BQk9SVEVEKQorCQkJCXNldF9iaXQoUlhSUENfQ0FMTF9DT05OX0FCT1JULCAmY2FsbC0+ZXZlbnRzKTsKKwkJCWVsc2UKKwkJCQlzZXRfYml0KFJYUlBDX0NBTExfUkNWRF9BQk9SVCwgJmNhbGwtPmV2ZW50cyk7CisJCQlyeHJwY19xdWV1ZV9jYWxsKGNhbGwpOworCQl9CisJCXdyaXRlX3VubG9jaygmY2FsbC0+c3RhdGVfbG9jayk7CisJfQorCisJcmVhZF91bmxvY2tfYmgoJmNvbm4tPmxvY2spOworCV9sZWF2ZSgiIik7Cit9CisKKy8qCisgKiBnZW5lcmF0ZSBhIGNvbm5lY3Rpb24tbGV2ZWwgYWJvcnQKKyAqLworc3RhdGljIGludCByeHJwY19hYm9ydF9jb25uZWN0aW9uKHN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uLAorCQkJCSAgdTMyIGVycm9yLCB1MzIgYWJvcnRfY29kZSkKK3sKKwlzdHJ1Y3QgcnhycGNfaGVhZGVyIGhkcjsKKwlzdHJ1Y3QgbXNnaGRyIG1zZzsKKwlzdHJ1Y3Qga3ZlYyBpb3ZbMl07CisJX19iZTMyIHdvcmQ7CisJc2l6ZV90IGxlbjsKKwlpbnQgcmV0OworCisJX2VudGVyKCIlZCwsJXUsJXUiLCBjb25uLT5kZWJ1Z19pZCwgZXJyb3IsIGFib3J0X2NvZGUpOworCisJLyogZ2VuZXJhdGUgYSBjb25uZWN0aW9uLWxldmVsIGFib3J0ICovCisJc3Bpbl9sb2NrX2JoKCZjb25uLT5zdGF0ZV9sb2NrKTsKKwlpZiAoY29ubi0+c3RhdGUgPCBSWFJQQ19DT05OX1JFTU9URUxZX0FCT1JURUQpIHsKKwkJY29ubi0+c3RhdGUgPSBSWFJQQ19DT05OX0xPQ0FMTFlfQUJPUlRFRDsKKwkJY29ubi0+ZXJyb3IgPSBlcnJvcjsKKwkJc3Bpbl91bmxvY2tfYmgoJmNvbm4tPnN0YXRlX2xvY2spOworCX0gZWxzZSB7CisJCXNwaW5fdW5sb2NrX2JoKCZjb25uLT5zdGF0ZV9sb2NrKTsKKwkJX2xlYXZlKCIgPSAwIFthbHJlYWR5IGRlYWRdIik7CisJCXJldHVybiAwOworCX0KKworCXJ4cnBjX2Fib3J0X2NhbGxzKGNvbm4sIFJYUlBDX0NBTExfTE9DQUxMWV9BQk9SVEVELCBhYm9ydF9jb2RlKTsKKworCW1zZy5tc2dfbmFtZQk9ICZjb25uLT50cmFucy0+cGVlci0+c3J4LnRyYW5zcG9ydC5zaW47CisJbXNnLm1zZ19uYW1lbGVuCT0gc2l6ZW9mKGNvbm4tPnRyYW5zLT5wZWVyLT5zcngudHJhbnNwb3J0LnNpbik7CisJbXNnLm1zZ19jb250cm9sCT0gTlVMTDsKKwltc2cubXNnX2NvbnRyb2xsZW4gPSAwOworCW1zZy5tc2dfZmxhZ3MJPSAwOworCisJaGRyLmVwb2NoCT0gY29ubi0+ZXBvY2g7CisJaGRyLmNpZAkJPSBjb25uLT5jaWQ7CisJaGRyLmNhbGxOdW1iZXIJPSAwOworCWhkci5zZXEJCT0gMDsKKwloZHIudHlwZQk9IFJYUlBDX1BBQ0tFVF9UWVBFX0FCT1JUOworCWhkci5mbGFncwk9IGNvbm4tPm91dF9jbGllbnRmbGFnOworCWhkci51c2VyU3RhdHVzCT0gMDsKKwloZHIuc2VjdXJpdHlJbmRleCA9IGNvbm4tPnNlY3VyaXR5X2l4OworCWhkci5fcnN2ZAk9IDA7CisJaGRyLnNlcnZpY2VJZAk9IGNvbm4tPnNlcnZpY2VfaWQ7CisKKwl3b3JkID0gaHRvbmwoYWJvcnRfY29kZSk7CisKKwlpb3ZbMF0uaW92X2Jhc2UJPSAmaGRyOworCWlvdlswXS5pb3ZfbGVuCT0gc2l6ZW9mKGhkcik7CisJaW92WzFdLmlvdl9iYXNlCT0gJndvcmQ7CisJaW92WzFdLmlvdl9sZW4JPSBzaXplb2Yod29yZCk7CisKKwlsZW4gPSBpb3ZbMF0uaW92X2xlbiArIGlvdlsxXS5pb3ZfbGVuOworCisJaGRyLnNlcmlhbCA9IGh0b25sKGF0b21pY19pbmNfcmV0dXJuKCZjb25uLT5zZXJpYWwpKTsKKwlfcHJvdG8oIlR4IENPTk4gQUJPUlQgJSUldSB7ICVkIH0iLCBudG9obChoZHIuc2VyaWFsKSwgYWJvcnRfY29kZSk7CisKKwlyZXQgPSBrZXJuZWxfc2VuZG1zZyhjb25uLT50cmFucy0+bG9jYWwtPnNvY2tldCwgJm1zZywgaW92LCAyLCBsZW4pOworCWlmIChyZXQgPCAwKSB7CisJCV9kZWJ1Zygic2VuZG1zZyBmYWlsZWQ6ICVkIiwgcmV0KTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCisJX2xlYXZlKCIgPSAwIik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBtYXJrIGEgY2FsbCBhcyBiZWluZyBvbiBhIG5vdy1zZWN1cmVkIGNoYW5uZWwKKyAqIC0gbXVzdCBiZSBjYWxsZWQgd2l0aCBzb2Z0aXJxcyBkaXNhYmxlZAorICovCit2b2lkIHJ4cnBjX2NhbGxfaXNfc2VjdXJlKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKQoreworCV9lbnRlcigiJXAiLCBjYWxsKTsKKwlpZiAoY2FsbCkgeworCQlyZWFkX2xvY2soJmNhbGwtPnN0YXRlX2xvY2spOworCQlpZiAoY2FsbC0+c3RhdGUgPCBSWFJQQ19DQUxMX0NPTVBMRVRFICYmCisJCSAgICAhdGVzdF9hbmRfc2V0X2JpdChSWFJQQ19DQUxMX1NFQ1VSRUQsICZjYWxsLT5ldmVudHMpKQorCQkJcnhycGNfcXVldWVfY2FsbChjYWxsKTsKKwkJcmVhZF91bmxvY2soJmNhbGwtPnN0YXRlX2xvY2spOworCX0KK30KKworLyoKKyAqIGNvbm5lY3Rpb24tbGV2ZWwgUnggcGFja2V0IHByb2Nlc3NvcgorICovCitzdGF0aWMgaW50IHJ4cnBjX3Byb2Nlc3NfZXZlbnQoc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4sCisJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICAgICB1MzIgKl9hYm9ydF9jb2RlKQoreworCXN0cnVjdCByeHJwY19za2JfcHJpdiAqc3AgPSByeHJwY19za2Ioc2tiKTsKKwlfX2JlMzIgdG1wOworCXUzMiBzZXJpYWw7CisJaW50IGxvb3AsIHJldDsKKworCWlmIChjb25uLT5zdGF0ZSA+PSBSWFJQQ19DT05OX1JFTU9URUxZX0FCT1JURUQpCisJCXJldHVybiAtRUNPTk5BQk9SVEVEOworCisJc2VyaWFsID0gbnRvaGwoc3AtPmhkci5zZXJpYWwpOworCisJc3dpdGNoIChzcC0+aGRyLnR5cGUpIHsKKwljYXNlIFJYUlBDX1BBQ0tFVF9UWVBFX0FCT1JUOgorCQlpZiAoc2tiX2NvcHlfYml0cyhza2IsIDAsICZ0bXAsIHNpemVvZih0bXApKSA8IDApCisJCQlyZXR1cm4gLUVQUk9UTzsKKwkJX3Byb3RvKCJSeCBBQk9SVCAlJSV1IHsgYWM9JWQgfSIsIHNlcmlhbCwgbnRvaGwodG1wKSk7CisKKwkJY29ubi0+c3RhdGUgPSBSWFJQQ19DT05OX1JFTU9URUxZX0FCT1JURUQ7CisJCXJ4cnBjX2Fib3J0X2NhbGxzKGNvbm4sIFJYUlBDX0NBTExfUkVNT1RFTFlfQUJPUlRFRCwKKwkJCQkgIG50b2hsKHRtcCkpOworCQlyZXR1cm4gLUVDT05OQUJPUlRFRDsKKworCWNhc2UgUlhSUENfUEFDS0VUX1RZUEVfQ0hBTExFTkdFOgorCQlpZiAoY29ubi0+c2VjdXJpdHkpCisJCQlyZXR1cm4gY29ubi0+c2VjdXJpdHktPnJlc3BvbmRfdG9fY2hhbGxlbmdlKAorCQkJCWNvbm4sIHNrYiwgX2Fib3J0X2NvZGUpOworCQlyZXR1cm4gLUVQUk9UTzsKKworCWNhc2UgUlhSUENfUEFDS0VUX1RZUEVfUkVTUE9OU0U6CisJCWlmICghY29ubi0+c2VjdXJpdHkpCisJCQlyZXR1cm4gLUVQUk9UTzsKKworCQlyZXQgPSBjb25uLT5zZWN1cml0eS0+dmVyaWZ5X3Jlc3BvbnNlKGNvbm4sIHNrYiwgX2Fib3J0X2NvZGUpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisKKwkJcmV0ID0gY29ubi0+c2VjdXJpdHktPmluaXRfY29ubmVjdGlvbl9zZWN1cml0eShjb25uKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCisJCWNvbm4tPnNlY3VyaXR5LT5wcmltZV9wYWNrZXRfc2VjdXJpdHkoY29ubik7CisJCXJlYWRfbG9ja19iaCgmY29ubi0+bG9jayk7CisJCXNwaW5fbG9jaygmY29ubi0+c3RhdGVfbG9jayk7CisKKwkJaWYgKGNvbm4tPnN0YXRlID09IFJYUlBDX0NPTk5fU0VSVkVSX0NIQUxMRU5HSU5HKSB7CisJCQljb25uLT5zdGF0ZSA9IFJYUlBDX0NPTk5fU0VSVkVSOworCQkJZm9yIChsb29wID0gMDsgbG9vcCA8IFJYUlBDX01BWENBTExTOyBsb29wKyspCisJCQkJcnhycGNfY2FsbF9pc19zZWN1cmUoY29ubi0+Y2hhbm5lbHNbbG9vcF0pOworCQl9CisKKwkJc3Bpbl91bmxvY2soJmNvbm4tPnN0YXRlX2xvY2spOworCQlyZWFkX3VubG9ja19iaCgmY29ubi0+bG9jayk7CisJCXJldHVybiAwOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FUFJPVE87CisJfQorfQorCisvKgorICogc2V0IHVwIHNlY3VyaXR5IGFuZCBpc3N1ZSBhIGNoYWxsZW5nZQorICovCitzdGF0aWMgdm9pZCByeHJwY19zZWN1cmVfY29ubmVjdGlvbihzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubikKK3sKKwl1MzIgYWJvcnRfY29kZTsKKwlpbnQgcmV0OworCisJX2VudGVyKCJ7JWR9IiwgY29ubi0+ZGVidWdfaWQpOworCisJQVNTRVJUKGNvbm4tPnNlY3VyaXR5X2l4ICE9IDApOworCisJaWYgKCFjb25uLT5rZXkpIHsKKwkJX2RlYnVnKCJzZXQgdXAgc2VjdXJpdHkiKTsKKwkJcmV0ID0gcnhycGNfaW5pdF9zZXJ2ZXJfY29ubl9zZWN1cml0eShjb25uKTsKKwkJc3dpdGNoIChyZXQpIHsKKwkJY2FzZSAwOgorCQkJYnJlYWs7CisJCWNhc2UgLUVOT0VOVDoKKwkJCWFib3J0X2NvZGUgPSBSWF9DQUxMX0RFQUQ7CisJCQlnb3RvIGFib3J0OworCQlkZWZhdWx0OgorCQkJYWJvcnRfY29kZSA9IFJYS0FETk9BVVRIOworCQkJZ290byBhYm9ydDsKKwkJfQorCX0KKworCUFTU0VSVChjb25uLT5zZWN1cml0eSAhPSBOVUxMKTsKKworCWlmIChjb25uLT5zZWN1cml0eS0+aXNzdWVfY2hhbGxlbmdlKGNvbm4pIDwgMCkgeworCQlhYm9ydF9jb2RlID0gUlhfQ0FMTF9ERUFEOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGFib3J0OworCX0KKworCV9sZWF2ZSgiIik7CisJcmV0dXJuOworCithYm9ydDoKKwlfZGVidWcoImFib3J0ICVkLCAlZCIsIHJldCwgYWJvcnRfY29kZSk7CisJcnhycGNfYWJvcnRfY29ubmVjdGlvbihjb25uLCAtcmV0LCBhYm9ydF9jb2RlKTsKKwlfbGVhdmUoIiBbYWJvcnRlZF0iKTsKK30KKworLyoKKyAqIGNvbm5lY3Rpb24tbGV2ZWwgZXZlbnQgcHJvY2Vzc29yCisgKi8KK3ZvaWQgcnhycGNfcHJvY2Vzc19jb25uZWN0aW9uKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubiA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiwgcHJvY2Vzc29yKTsKKwlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwOworCXN0cnVjdCBza19idWZmICpza2I7CisJdTMyIGFib3J0X2NvZGUgPSBSWF9QUk9UT0NPTF9FUlJPUjsKKwlpbnQgcmV0OworCisJX2VudGVyKCJ7JWR9IiwgY29ubi0+ZGVidWdfaWQpOworCisJYXRvbWljX2luYygmY29ubi0+dXNhZ2UpOworCisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChSWFJQQ19DT05OX0NIQUxMRU5HRSwgJmNvbm4tPmV2ZW50cykpIHsKKwkJcnhycGNfc2VjdXJlX2Nvbm5lY3Rpb24oY29ubik7CisJCXJ4cnBjX3B1dF9jb25uZWN0aW9uKGNvbm4pOworCX0KKworCS8qIGdvIHRocm91Z2ggdGhlIGNvbm4tbGV2ZWwgZXZlbnQgcGFja2V0cywgcmVsZWFzaW5nIHRoZSByZWYgb24gdGhpcworCSAqIGNvbm5lY3Rpb24gdGhhdCBlYWNoIG9uZSBoYXMgd2hlbiB3ZSd2ZSBmaW5pc2hlZCB3aXRoIGl0ICovCisJd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZSgmY29ubi0+cnhfcXVldWUpKSkgeworCQlzcCA9IHJ4cnBjX3NrYihza2IpOworCisJCXJldCA9IHJ4cnBjX3Byb2Nlc3NfZXZlbnQoY29ubiwgc2tiLCAmYWJvcnRfY29kZSk7CisJCXN3aXRjaCAocmV0KSB7CisJCWNhc2UgLUVQUk9UTzoKKwkJY2FzZSAtRUtFWUVYUElSRUQ6CisJCWNhc2UgLUVLRVlSRUpFQ1RFRDoKKwkJCWdvdG8gcHJvdG9jb2xfZXJyb3I7CisJCWNhc2UgLUVBR0FJTjoKKwkJCWdvdG8gcmVxdWV1ZV9hbmRfbGVhdmU7CisJCWNhc2UgLUVDT05OQUJPUlRFRDoKKwkJZGVmYXVsdDoKKwkJCXJ4cnBjX3B1dF9jb25uZWN0aW9uKGNvbm4pOworCQkJcnhycGNfZnJlZV9za2Ioc2tiKTsKKwkJCWJyZWFrOworCQl9CisJfQorCitvdXQ6CisJcnhycGNfcHV0X2Nvbm5lY3Rpb24oY29ubik7CisJX2xlYXZlKCIiKTsKKwlyZXR1cm47CisKK3JlcXVldWVfYW5kX2xlYXZlOgorCXNrYl9xdWV1ZV9oZWFkKCZjb25uLT5yeF9xdWV1ZSwgc2tiKTsKKwlnb3RvIG91dDsKKworcHJvdG9jb2xfZXJyb3I6CisJaWYgKHJ4cnBjX2Fib3J0X2Nvbm5lY3Rpb24oY29ubiwgLXJldCwgYWJvcnRfY29kZSkgPCAwKQorCQlnb3RvIHJlcXVldWVfYW5kX2xlYXZlOworCXJ4cnBjX3B1dF9jb25uZWN0aW9uKGNvbm4pOworCXJ4cnBjX2ZyZWVfc2tiKHNrYik7CisJX2xlYXZlKCIgW0VQUk9UT10iKTsKKwlnb3RvIG91dDsKK30KKworLyoKKyAqIHB1dCBhIHBhY2tldCB1cCBmb3IgdHJhbnNwb3J0LWxldmVsIGFib3J0CisgKi8KK3ZvaWQgcnhycGNfcmVqZWN0X3BhY2tldChzdHJ1Y3QgcnhycGNfbG9jYWwgKmxvY2FsLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCUNIRUNLX1NMQUJfT0tBWSgmbG9jYWwtPnVzYWdlKTsKKworCWlmICghYXRvbWljX2luY19ub3RfemVybygmbG9jYWwtPnVzYWdlKSkgeworCQlwcmludGsoInJlc3VycmVjdGVkIG9uIHJlamVjdFxuIik7CisJCUJVRygpOworCX0KKworCXNrYl9xdWV1ZV90YWlsKCZsb2NhbC0+cmVqZWN0X3F1ZXVlLCBza2IpOworCXJ4cnBjX3F1ZXVlX3dvcmsoJmxvY2FsLT5yZWplY3Rlcik7Cit9CisKKy8qCisgKiByZWplY3QgcGFja2V0cyB0aHJvdWdoIHRoZSBsb2NhbCBlbmRwb2ludAorICovCit2b2lkIHJ4cnBjX3JlamVjdF9wYWNrZXRzKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwl1bmlvbiB7CisJCXN0cnVjdCBzb2NrYWRkciBzYTsKKwkJc3RydWN0IHNvY2thZGRyX2luIHNpbjsKKwl9IHNhOworCXN0cnVjdCByeHJwY19za2JfcHJpdiAqc3A7CisJc3RydWN0IHJ4cnBjX2hlYWRlciBoZHI7CisJc3RydWN0IHJ4cnBjX2xvY2FsICpsb2NhbDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBtc2doZHIgbXNnOworCXN0cnVjdCBrdmVjIGlvdlsyXTsKKwlzaXplX3Qgc2l6ZTsKKwlfX2JlMzIgY29kZTsKKworCWxvY2FsID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCByeHJwY19sb2NhbCwgcmVqZWN0ZXIpOworCXJ4cnBjX2dldF9sb2NhbChsb2NhbCk7CisKKwlfZW50ZXIoIiVkIiwgbG9jYWwtPmRlYnVnX2lkKTsKKworCWlvdlswXS5pb3ZfYmFzZSA9ICZoZHI7CisJaW92WzBdLmlvdl9sZW4gPSBzaXplb2YoaGRyKTsKKwlpb3ZbMV0uaW92X2Jhc2UgPSAmY29kZTsKKwlpb3ZbMV0uaW92X2xlbiA9IHNpemVvZihjb2RlKTsKKwlzaXplID0gc2l6ZW9mKGhkcikgKyBzaXplb2YoY29kZSk7CisKKwltc2cubXNnX25hbWUgPSAmc2E7CisJbXNnLm1zZ19jb250cm9sID0gTlVMTDsKKwltc2cubXNnX2NvbnRyb2xsZW4gPSAwOworCW1zZy5tc2dfZmxhZ3MgPSAwOworCisJbWVtc2V0KCZzYSwgMCwgc2l6ZW9mKHNhKSk7CisJc2Euc2Euc2FfZmFtaWx5ID0gbG9jYWwtPnNyeC50cmFuc3BvcnQuZmFtaWx5OworCXN3aXRjaCAoc2Euc2Euc2FfZmFtaWx5KSB7CisJY2FzZSBBRl9JTkVUOgorCQltc2cubXNnX25hbWVsZW4gPSBzaXplb2Yoc2Euc2luKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbXNnLm1zZ19uYW1lbGVuID0gMDsKKwkJYnJlYWs7CisJfQorCisJbWVtc2V0KCZoZHIsIDAsIHNpemVvZihoZHIpKTsKKwloZHIudHlwZSA9IFJYUlBDX1BBQ0tFVF9UWVBFX0FCT1JUOworCisJd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZSgmbG9jYWwtPnJlamVjdF9xdWV1ZSkpKSB7CisJCXNwID0gcnhycGNfc2tiKHNrYik7CisJCXN3aXRjaCAoc2Euc2Euc2FfZmFtaWx5KSB7CisJCWNhc2UgQUZfSU5FVDoKKwkJCXNhLnNpbi5zaW5fcG9ydCA9IHVkcF9oZHIoc2tiKS0+c291cmNlOworCQkJc2Euc2luLnNpbl9hZGRyLnNfYWRkciA9IGlwX2hkcihza2IpLT5zYWRkcjsKKwkJCWNvZGUgPSBodG9ubChza2ItPnByaW9yaXR5KTsKKworCQkJaGRyLmVwb2NoID0gc3AtPmhkci5lcG9jaDsKKwkJCWhkci5jaWQgPSBzcC0+aGRyLmNpZDsKKwkJCWhkci5jYWxsTnVtYmVyID0gc3AtPmhkci5jYWxsTnVtYmVyOworCQkJaGRyLnNlcnZpY2VJZCA9IHNwLT5oZHIuc2VydmljZUlkOworCQkJaGRyLmZsYWdzID0gc3AtPmhkci5mbGFnczsKKwkJCWhkci5mbGFncyBePSBSWFJQQ19DTElFTlRfSU5JVElBVEVEOworCQkJaGRyLmZsYWdzICY9IFJYUlBDX0NMSUVOVF9JTklUSUFURUQ7CisKKwkJCWtlcm5lbF9zZW5kbXNnKGxvY2FsLT5zb2NrZXQsICZtc2csIGlvdiwgMiwgc2l6ZSk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKworCQlyeHJwY19mcmVlX3NrYihza2IpOworCQlyeHJwY19wdXRfbG9jYWwobG9jYWwpOworCX0KKworCXJ4cnBjX3B1dF9sb2NhbChsb2NhbCk7CisJX2xlYXZlKCIiKTsKK30KZGlmZiAtLWdpdCBhL25ldC9yeHJwYy9hci1lcnJvci5jIGIvbmV0L3J4cnBjL2FyLWVycm9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmMyN2RmMQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9yeHJwYy9hci1lcnJvci5jCkBAIC0wLDAgKzEsMjUzIEBACisvKiBFcnJvciBtZXNzYWdlIGhhbmRsaW5nIChJQ01QKQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvZXJycXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC91ZHAuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2luNi5oPgorI2luY2x1ZGUgPGxpbnV4L2ljbXAuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPG5ldC9hZl9yeHJwYy5oPgorI2luY2x1ZGUgPG5ldC9pcC5oPgorI2luY2x1ZGUgImFyLWludGVybmFsLmgiCisKKy8qCisgKiBoYW5kbGUgYW4gZXJyb3IgcmVjZWl2ZWQgb24gdGhlIGxvY2FsIGVuZHBvaW50CisgKi8KK3ZvaWQgcnhycGNfVURQX2Vycm9yX3JlcG9ydChzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IHNvY2tfZXh0ZXJyX3NrYiAqc2VycjsKKwlzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICp0cmFuczsKKwlzdHJ1Y3QgcnhycGNfbG9jYWwgKmxvY2FsID0gc2stPnNrX3VzZXJfZGF0YTsKKwlzdHJ1Y3QgcnhycGNfcGVlciAqcGVlcjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCV9fYmUzMiBhZGRyOworCV9fYmUxNiBwb3J0OworCisJX2VudGVyKCIlcHslZH0iLCBzaywgbG9jYWwtPmRlYnVnX2lkKTsKKworCXNrYiA9IHNrYl9kZXF1ZXVlKCZzay0+c2tfZXJyb3JfcXVldWUpOworCWlmICghc2tiKSB7CisJCV9sZWF2ZSgiVURQIHNvY2tldCBlcnJxdWV1ZSBlbXB0eSIpOworCQlyZXR1cm47CisJfQorCisJcnhycGNfbmV3X3NrYihza2IpOworCisJc2VyciA9IFNLQl9FWFRfRVJSKHNrYik7CisJYWRkciA9ICooX19iZTMyICopKHNrYl9uZXR3b3JrX2hlYWRlcihza2IpICsgc2Vyci0+YWRkcl9vZmZzZXQpOworCXBvcnQgPSBzZXJyLT5wb3J0OworCisJX25ldCgiUnggVURQIEVycm9yIGZyb20gIk5JUFFVQURfRk1UIjolaHUiLAorCSAgICAgTklQUVVBRChhZGRyKSwgbnRvaHMocG9ydCkpOworCV9kZWJ1ZygiTXNnIGw6JWQgZDolZCIsIHNrYi0+bGVuLCBza2ItPmRhdGFfbGVuKTsKKworCXBlZXIgPSByeHJwY19maW5kX3BlZXIobG9jYWwsIGFkZHIsIHBvcnQpOworCWlmIChJU19FUlIocGVlcikpIHsKKwkJcnhycGNfZnJlZV9za2Ioc2tiKTsKKwkJX2xlYXZlKCIgW25vIHBlZXJdIik7CisJCXJldHVybjsKKwl9CisKKwl0cmFucyA9IHJ4cnBjX2ZpbmRfdHJhbnNwb3J0KGxvY2FsLCBwZWVyKTsKKwlpZiAoIXRyYW5zKSB7CisJCXJ4cnBjX3B1dF9wZWVyKHBlZXIpOworCQlyeHJwY19mcmVlX3NrYihza2IpOworCQlfbGVhdmUoIiBbbm8gdHJhbnNdIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoc2Vyci0+ZWUuZWVfb3JpZ2luID09IFNPX0VFX09SSUdJTl9JQ01QICYmCisJICAgIHNlcnItPmVlLmVlX3R5cGUgPT0gSUNNUF9ERVNUX1VOUkVBQ0ggJiYKKwkgICAgc2Vyci0+ZWUuZWVfY29kZSA9PSBJQ01QX0ZSQUdfTkVFREVECisJICAgICkgeworCQl1MzIgbXR1ID0gc2Vyci0+ZWUuZWVfaW5mbzsKKworCQlfbmV0KCJSeCBSZWNlaXZlZCBJQ01QIEZyYWdtZW50YXRpb24gTmVlZGVkICglZCkiLCBtdHUpOworCisJCS8qIHdpbmQgZG93biB0aGUgbG9jYWwgaW50ZXJmYWNlIE1UVSAqLworCQlpZiAobXR1ID4gMCAmJiBwZWVyLT5pZl9tdHUgPT0gNjU1MzUgJiYgbXR1IDwgcGVlci0+aWZfbXR1KSB7CisJCQlwZWVyLT5pZl9tdHUgPSBtdHU7CisJCQlfbmV0KCJJL0YgTVRVICV1IiwgbXR1KTsKKwkJfQorCisJCS8qIGlwX3J0X2ZyYWdfbmVlZGVkKCkgbWF5IGhhdmUgZWF0ZW4gdGhlIGluZm8gKi8KKwkJaWYgKG10dSA9PSAwKQorCQkJbXR1ID0gbnRvaHMoaWNtcF9oZHIoc2tiKS0+dW4uZnJhZy5tdHUpOworCisJCWlmIChtdHUgPT0gMCkgeworCQkJLyogdGhleSBkaWRuJ3QgZ2l2ZSB1cyBhIHNpemUsIGVzdGltYXRlIG9uZSAqLworCQkJaWYgKG10dSA+IDE1MDApIHsKKwkJCQltdHUgPj49IDE7CisJCQkJaWYgKG10dSA8IDE1MDApCisJCQkJCW10dSA9IDE1MDA7CisJCQl9IGVsc2UgeworCQkJCW10dSAtPSAxMDA7CisJCQkJaWYgKG10dSA8IHBlZXItPmhkcnNpemUpCisJCQkJCW10dSA9IHBlZXItPmhkcnNpemUgKyA0OworCQkJfQorCQl9CisKKwkJaWYgKG10dSA8IHBlZXItPm10dSkgeworCQkJcGVlci0+bXR1ID0gbXR1OworCQkJcGVlci0+bWF4ZGF0YSA9IHBlZXItPm10dSAtIHBlZXItPmhkcnNpemU7CisJCQlfbmV0KCJOZXQgTVRVICV1IChtYXhkYXRhICV1KSIsCisJCQkgICAgIHBlZXItPm10dSwgcGVlci0+bWF4ZGF0YSk7CisJCX0KKwl9CisKKwlyeHJwY19wdXRfcGVlcihwZWVyKTsKKworCS8qIHBhc3MgdGhlIHRyYW5zcG9ydCByZWYgdG8gZXJyb3JfaGFuZGxlciB0byByZWxlYXNlICovCisJc2tiX3F1ZXVlX3RhaWwoJnRyYW5zLT5lcnJvcl9xdWV1ZSwgc2tiKTsKKwlyeHJwY19xdWV1ZV93b3JrKCZ0cmFucy0+ZXJyb3JfaGFuZGxlcik7CisKKwkvKiByZXNldCBhbmQgcmVnZW5lcmF0ZSBzb2NrZXQgZXJyb3IgKi8KKwlzcGluX2xvY2tfYmgoJnNrLT5za19lcnJvcl9xdWV1ZS5sb2NrKTsKKwlzay0+c2tfZXJyID0gMDsKKwlza2IgPSBza2JfcGVlaygmc2stPnNrX2Vycm9yX3F1ZXVlKTsKKwlpZiAoc2tiKSB7CisJCXNrLT5za19lcnIgPSBTS0JfRVhUX0VSUihza2IpLT5lZS5lZV9lcnJubzsKKwkJc3Bpbl91bmxvY2tfYmgoJnNrLT5za19lcnJvcl9xdWV1ZS5sb2NrKTsKKwkJc2stPnNrX2Vycm9yX3JlcG9ydChzayk7CisJfSBlbHNlIHsKKwkJc3Bpbl91bmxvY2tfYmgoJnNrLT5za19lcnJvcl9xdWV1ZS5sb2NrKTsKKwl9CisKKwlfbGVhdmUoIiIpOworfQorCisvKgorICogZGVhbCB3aXRoIFVEUCBlcnJvciBtZXNzYWdlcworICovCit2b2lkIHJ4cnBjX1VEUF9lcnJvcl9oYW5kbGVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3Qgc29ja19leHRlbmRlZF9lcnIgKmVlOworCXN0cnVjdCBzb2NrX2V4dGVycl9za2IgKnNlcnI7CisJc3RydWN0IHJ4cnBjX3RyYW5zcG9ydCAqdHJhbnMgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHJ4cnBjX3RyYW5zcG9ydCwgZXJyb3JfaGFuZGxlcik7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgbG9jYWwsIGVycjsKKworCV9lbnRlcigiIik7CisKKwlza2IgPSBza2JfZGVxdWV1ZSgmdHJhbnMtPmVycm9yX3F1ZXVlKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuOworCisJc2VyciA9IFNLQl9FWFRfRVJSKHNrYik7CisJZWUgPSAmc2Vyci0+ZWU7CisKKwlfbmV0KCJSeCBFcnJvciBvPSVkIHQ9JWQgYz0lZCBlPSVkIiwKKwkgICAgIGVlLT5lZV9vcmlnaW4sIGVlLT5lZV90eXBlLCBlZS0+ZWVfY29kZSwgZWUtPmVlX2Vycm5vKTsKKworCWVyciA9IGVlLT5lZV9lcnJubzsKKworCXN3aXRjaCAoZWUtPmVlX29yaWdpbikgeworCWNhc2UgU09fRUVfT1JJR0lOX0lDTVA6CisJCWxvY2FsID0gMDsKKwkJc3dpdGNoIChlZS0+ZWVfdHlwZSkgeworCQljYXNlIElDTVBfREVTVF9VTlJFQUNIOgorCQkJc3dpdGNoIChlZS0+ZWVfY29kZSkgeworCQkJY2FzZSBJQ01QX05FVF9VTlJFQUNIOgorCQkJCV9uZXQoIlJ4IFJlY2VpdmVkIElDTVAgTmV0d29yayBVbnJlYWNoYWJsZSIpOworCQkJCWVyciA9IEVORVRVTlJFQUNIOworCQkJCWJyZWFrOworCQkJY2FzZSBJQ01QX0hPU1RfVU5SRUFDSDoKKwkJCQlfbmV0KCJSeCBSZWNlaXZlZCBJQ01QIEhvc3QgVW5yZWFjaGFibGUiKTsKKwkJCQllcnIgPSBFSE9TVFVOUkVBQ0g7CisJCQkJYnJlYWs7CisJCQljYXNlIElDTVBfUE9SVF9VTlJFQUNIOgorCQkJCV9uZXQoIlJ4IFJlY2VpdmVkIElDTVAgUG9ydCBVbnJlYWNoYWJsZSIpOworCQkJCWVyciA9IEVDT05OUkVGVVNFRDsKKwkJCQlicmVhazsKKwkJCWNhc2UgSUNNUF9GUkFHX05FRURFRDoKKwkJCQlfbmV0KCJSeCBSZWNlaXZlZCBJQ01QIEZyYWdtZW50YXRpb24gTmVlZGVkICglZCkiLAorCQkJCSAgICAgZWUtPmVlX2luZm8pOworCQkJCWVyciA9IDA7IC8qIGRlYWx0IHdpdGggZWxzZXdoZXJlICovCisJCQkJYnJlYWs7CisJCQljYXNlIElDTVBfTkVUX1VOS05PV046CisJCQkJX25ldCgiUnggUmVjZWl2ZWQgSUNNUCBVbmtub3duIE5ldHdvcmsiKTsKKwkJCQllcnIgPSBFTkVUVU5SRUFDSDsKKwkJCQlicmVhazsKKwkJCWNhc2UgSUNNUF9IT1NUX1VOS05PV046CisJCQkJX25ldCgiUnggUmVjZWl2ZWQgSUNNUCBVbmtub3duIEhvc3QiKTsKKwkJCQllcnIgPSBFSE9TVFVOUkVBQ0g7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCV9uZXQoIlJ4IFJlY2VpdmVkIElDTVAgRGVzdFVucmVhY2ggY29kZT0ldSIsCisJCQkJICAgICBlZS0+ZWVfY29kZSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIElDTVBfVElNRV9FWENFRURFRDoKKwkJCV9uZXQoIlJ4IFJlY2VpdmVkIElDTVAgVFRMIEV4Y2VlZGVkIik7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJX3Byb3RvKCJSeCBSZWNlaXZlZCBJQ01QIGVycm9yIHsgdHlwZT0ldSBjb2RlPSV1IH0iLAorCQkJICAgICAgIGVlLT5lZV90eXBlLCBlZS0+ZWVfY29kZSk7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKworCWNhc2UgU09fRUVfT1JJR0lOX0xPQ0FMOgorCQlfcHJvdG8oIlJ4IFJlY2VpdmVkIGxvY2FsIGVycm9yIHsgZXJyb3I9JWQgfSIsCisJCSAgICAgICBlZS0+ZWVfZXJybm8pOworCQlsb2NhbCA9IDE7CisJCWJyZWFrOworCisJY2FzZSBTT19FRV9PUklHSU5fTk9ORToKKwljYXNlIFNPX0VFX09SSUdJTl9JQ01QNjoKKwlkZWZhdWx0OgorCQlfcHJvdG8oIlJ4IFJlY2VpdmVkIGVycm9yIHJlcG9ydCB7IG9yaWc9JXUgfSIsCisJCSAgICAgICBlZS0+ZWVfb3JpZ2luKTsKKwkJbG9jYWwgPSAwOworCQlicmVhazsKKwl9CisKKwkvKiB0ZXJtaW5hdGUgYWxsIHRoZSBhZmZlY3RlZCBjYWxscyBpZiB0aGVyZSdzIGFuIHVucmVjb3ZlcmFibGUKKwkgKiBlcnJvciAqLworCWlmIChlcnIpIHsKKwkJc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsICpfbjsKKworCQlfZGVidWcoIklTU1VFIEVSUk9SICVkIiwgZXJyKTsKKworCQlzcGluX2xvY2tfYmgoJnRyYW5zLT5wZWVyLT5sb2NrKTsKKwkJdHJhbnMtPnBlZXItPm5ldF9lcnJvciA9IGVycjsKKworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY2FsbCwgX24sICZ0cmFucy0+cGVlci0+ZXJyb3JfdGFyZ2V0cywKKwkJCQkJIGVycm9yX2xpbmspIHsKKwkJCXdyaXRlX2xvY2soJmNhbGwtPnN0YXRlX2xvY2spOworCQkJaWYgKGNhbGwtPnN0YXRlICE9IFJYUlBDX0NBTExfQ09NUExFVEUgJiYKKwkJCSAgICBjYWxsLT5zdGF0ZSA8IFJYUlBDX0NBTExfTkVUV09SS19FUlJPUikgeworCQkJCWNhbGwtPnN0YXRlID0gUlhSUENfQ0FMTF9ORVRXT1JLX0VSUk9SOworCQkJCXNldF9iaXQoUlhSUENfQ0FMTF9SQ1ZEX0VSUk9SLCAmY2FsbC0+ZXZlbnRzKTsKKwkJCQlyeHJwY19xdWV1ZV9jYWxsKGNhbGwpOworCQkJfQorCQkJd3JpdGVfdW5sb2NrKCZjYWxsLT5zdGF0ZV9sb2NrKTsKKwkJCWxpc3RfZGVsX2luaXQoJmNhbGwtPmVycm9yX2xpbmspOworCQl9CisKKwkJc3Bpbl91bmxvY2tfYmgoJnRyYW5zLT5wZWVyLT5sb2NrKTsKKwl9CisKKwlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmdHJhbnMtPmVycm9yX3F1ZXVlKSkKKwkJcnhycGNfcXVldWVfd29yaygmdHJhbnMtPmVycm9yX2hhbmRsZXIpOworCisJcnhycGNfZnJlZV9za2Ioc2tiKTsKKwlyeHJwY19wdXRfdHJhbnNwb3J0KHRyYW5zKTsKKwlfbGVhdmUoIiIpOworfQpkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL2FyLWlucHV0LmMgYi9uZXQvcnhycGMvYXItaW5wdXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWI1YmJiCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3J4cnBjL2FyLWlucHV0LmMKQEAgLTAsMCArMSw3OTcgQEAKKy8qIFJ4UlBDIHBhY2tldCByZWNlcHRpb24KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2VycnF1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvdWRwLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pbjYuaD4KKyNpbmNsdWRlIDxsaW51eC9pY21wLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxuZXQvYWZfcnhycGMuaD4KKyNpbmNsdWRlIDxuZXQvaXAuaD4KKyNpbmNsdWRlICJhci1pbnRlcm5hbC5oIgorCit1bnNpZ25lZCBsb25nIHJ4cnBjX2Fja190aW1lb3V0ID0gMTsKKworY29uc3QgY2hhciAqcnhycGNfcGt0c1tdID0geworCSI/MDAiLAorCSJEQVRBIiwgIkFDSyIsICJCVVNZIiwgIkFCT1JUIiwgIkFDS0FMTCIsICJDSEFMTCIsICJSRVNQIiwgIkRFQlVHIiwKKwkiPzA5IiwgIj8xMCIsICI/MTEiLCAiPzEyIiwgIj8xMyIsICI/MTQiLCAiPzE1IgorfTsKKworLyoKKyAqIHF1ZXVlIGEgcGFja2V0IGZvciByZWN2bXNnIHRvIHBhc3MgdG8gdXNlcnNwYWNlCisgKiAtIHRoZSBjYWxsZXIgbXVzdCBob2xkIGEgbG9jayBvbiBjYWxsLT5sb2NrCisgKiAtIG11c3Qgbm90IGJlIGNhbGxlZCB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQgKHNrX2ZpbHRlcigpIGRpc2FibGVzIEJIJ3MpCisgKiAtIGVhdHMgdGhlIHBhY2tldCB3aGV0aGVyIHN1Y2Nlc3NmdWwgb3Igbm90CisgKiAtIHRoZXJlIG11c3QgYmUganVzdCBvbmUgcmVmZXJlbmNlIHRvIHRoZSBwYWNrZXQsIHdoaWNoIHRoZSBjYWxsZXIgcGFzc2VzIHRvCisgKiAgIHRoaXMgZnVuY3Rpb24KKyAqLworaW50IHJ4cnBjX3F1ZXVlX3Jjdl9za2Ioc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIHN0cnVjdCBza19idWZmICpza2IsCisJCQlib29sIGZvcmNlLCBib29sIHRlcm1pbmFsKQoreworCXN0cnVjdCByeHJwY19za2JfcHJpdiAqc3A7CisJc3RydWN0IHJ4cnBjX3NvY2sgKnJ4ID0gY2FsbC0+c29ja2V0OworCXN0cnVjdCBzb2NrICpzazsKKwlpbnQgc2tiX2xlbiwgcmV0OworCisJX2VudGVyKCIsLCVkLCVkIiwgZm9yY2UsIHRlcm1pbmFsKTsKKworCUFTU0VSVCghaXJxc19kaXNhYmxlZCgpKTsKKworCXNwID0gcnhycGNfc2tiKHNrYik7CisJQVNTRVJUQ01QKHNwLT5jYWxsLCA9PSwgY2FsbCk7CisKKwkvKiBpZiB3ZSd2ZSBhbHJlYWR5IHBvc3RlZCB0aGUgdGVybWluYWwgbWVzc2FnZSBmb3IgYSBjYWxsLCB0aGVuIHdlCisJICogZG9uJ3QgcG9zdCBhbnkgbW9yZSAqLworCWlmICh0ZXN0X2JpdChSWFJQQ19DQUxMX1RFUk1JTkFMX01TRywgJmNhbGwtPmZsYWdzKSkgeworCQlfZGVidWcoImFscmVhZHkgdGVybWluYXRlZCIpOworCQlBU1NFUlRDTVAoY2FsbC0+c3RhdGUsID49LCBSWFJQQ19DQUxMX0NPTVBMRVRFKTsKKwkJc2tiLT5kZXN0cnVjdG9yID0gTlVMTDsKKwkJc3AtPmNhbGwgPSBOVUxMOworCQlyeHJwY19wdXRfY2FsbChjYWxsKTsKKwkJcnhycGNfZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJc2sgPSAmcngtPnNrOworCisJaWYgKCFmb3JjZSkgeworCQkvKiBjYXN0IHNrYi0+cmN2YnVmIHRvIHVuc2lnbmVkLi4uICBJdCdzIHBvaW50bGVzcywgYnV0CisJCSAqIHJlZHVjZXMgbnVtYmVyIG9mIHdhcm5pbmdzIHdoZW4gY29tcGlsaW5nIHdpdGggLVcKKwkJICogLS1BTksgKi8KKy8vCQlyZXQgPSAtRU5PQlVGUzsKKy8vCQlpZiAoYXRvbWljX3JlYWQoJnNrLT5za19ybWVtX2FsbG9jKSArIHNrYi0+dHJ1ZXNpemUgPj0KKy8vCQkgICAgKHVuc2lnbmVkKSBzay0+c2tfcmN2YnVmKQorLy8JCQlnb3RvIG91dDsKKworCQlyZXQgPSBza19maWx0ZXIoc2ssIHNrYik7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBvdXQ7CisJfQorCisJc3Bpbl9sb2NrX2JoKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZS5sb2NrKTsKKwlpZiAoIXRlc3RfYml0KFJYUlBDX0NBTExfVEVSTUlOQUxfTVNHLCAmY2FsbC0+ZmxhZ3MpICYmCisJICAgICF0ZXN0X2JpdChSWFJQQ19DQUxMX1JFTEVBU0VELCAmY2FsbC0+ZmxhZ3MpICYmCisJICAgIGNhbGwtPnNvY2tldC0+c2suc2tfc3RhdGUgIT0gUlhSUENfQ0xPU0UpIHsKKwkJc2tiLT5kZXN0cnVjdG9yID0gcnhycGNfcGFja2V0X2Rlc3RydWN0b3I7CisJCXNrYi0+ZGV2ID0gTlVMTDsKKwkJc2tiLT5zayA9IHNrOworCQlhdG9taWNfYWRkKHNrYi0+dHJ1ZXNpemUsICZzay0+c2tfcm1lbV9hbGxvYyk7CisKKwkJaWYgKHRlcm1pbmFsKSB7CisJCQlfZGVidWcoIjw8PDwgVEVSTUlOQUwgTUVTU0FHRSA+Pj4+Iik7CisJCQlzZXRfYml0KFJYUlBDX0NBTExfVEVSTUlOQUxfTVNHLCAmY2FsbC0+ZmxhZ3MpOworCQl9CisKKwkJLyogYWxsb3cgaW50ZXJjZXB0aW9uIGJ5IGEga2VybmVsIHNlcnZpY2UgKi8KKwkJaWYgKHJ4LT5pbnRlcmNlcHRvcikgeworCQkJcngtPmludGVyY2VwdG9yKHNrLCBjYWxsLT51c2VyX2NhbGxfSUQsIHNrYik7CisJCQlzcGluX3VubG9ja19iaCgmc2stPnNrX3JlY2VpdmVfcXVldWUubG9jayk7CisJCX0gZWxzZSB7CisKKwkJCS8qIENhY2hlIHRoZSBTS0IgbGVuZ3RoIGJlZm9yZSB3ZSB0YWNrIGl0IG9udG8gdGhlCisJCQkgKiByZWNlaXZlIHF1ZXVlLiAgT25jZSBpdCBpcyBhZGRlZCBpdCBubyBsb25nZXIKKwkJCSAqIGJlbG9uZ3MgdG8gdXMgYW5kIG1heSBiZSBmcmVlZCBieSBvdGhlciB0aHJlYWRzIG9mCisJCQkgKiBjb250cm9sIHB1bGxpbmcgcGFja2V0cyBmcm9tIHRoZSBxdWV1ZSAqLworCQkJc2tiX2xlbiA9IHNrYi0+bGVuOworCisJCQlfbmV0KCJwb3N0IHNrYiAlcCIsIHNrYik7CisJCQlfX3NrYl9xdWV1ZV90YWlsKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSwgc2tiKTsKKwkJCXNwaW5fdW5sb2NrX2JoKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZS5sb2NrKTsKKworCQkJaWYgKCFzb2NrX2ZsYWcoc2ssIFNPQ0tfREVBRCkpCisJCQkJc2stPnNrX2RhdGFfcmVhZHkoc2ssIHNrYl9sZW4pOworCQl9CisJCXNrYiA9IE5VTEw7CisJfSBlbHNlIHsKKwkJc3Bpbl91bmxvY2tfYmgoJnNrLT5za19yZWNlaXZlX3F1ZXVlLmxvY2spOworCX0KKwlyZXQgPSAwOworCitvdXQ6CisJLyogcmVsZWFzZSB0aGUgc29ja2V0IGJ1ZmZlciAqLworCWlmIChza2IpIHsKKwkJc2tiLT5kZXN0cnVjdG9yID0gTlVMTDsKKwkJc3AtPmNhbGwgPSBOVUxMOworCQlyeHJwY19wdXRfY2FsbChjYWxsKTsKKwkJcnhycGNfZnJlZV9za2Ioc2tiKTsKKwl9CisKKwlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogcHJvY2VzcyBhIERBVEEgcGFja2V0LCBwb3N0aW5nIHRoZSBwYWNrZXQgdG8gdGhlIGFwcHJvcHJpYXRlIHF1ZXVlCisgKiAtIGVhdHMgdGhlIHBhY2tldCBpZiBzdWNjZXNzZnVsCisgKi8KK3N0YXRpYyBpbnQgcnhycGNfZmFzdF9wcm9jZXNzX2RhdGEoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsCisJCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIHNlcSkKK3sKKwlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwOworCWJvb2wgdGVybWluYWw7CisJaW50IHJldCwgYWNrYml0LCBhY2s7CisKKwlfZW50ZXIoInsldSwldX0sLHsldX0iLCBjYWxsLT5yeF9kYXRhX3Bvc3QsIGNhbGwtPnJ4X2ZpcnN0X29vcywgc2VxKTsKKworCXNwID0gcnhycGNfc2tiKHNrYik7CisJQVNTRVJUQ01QKHNwLT5jYWxsLCA9PSwgTlVMTCk7CisKKwlzcGluX2xvY2soJmNhbGwtPmxvY2spOworCisJaWYgKGNhbGwtPnN0YXRlID4gUlhSUENfQ0FMTF9DT01QTEVURSkKKwkJZ290byBkaXNjYXJkOworCisJQVNTRVJUQ01QKGNhbGwtPnJ4X2RhdGFfZXhwZWN0LCA+PSwgY2FsbC0+cnhfZGF0YV9wb3N0KTsKKwlBU1NFUlRDTVAoY2FsbC0+cnhfZGF0YV9wb3N0LCA+PSwgY2FsbC0+cnhfZGF0YV9yZWN2KTsKKwlBU1NFUlRDTVAoY2FsbC0+cnhfZGF0YV9yZWN2LCA+PSwgY2FsbC0+cnhfZGF0YV9lYXRlbik7CisKKwlpZiAoc2VxIDwgY2FsbC0+cnhfZGF0YV9wb3N0KSB7CisJCV9kZWJ1ZygiZHVwICMldSBbLSV1XSIsIHNlcSwgY2FsbC0+cnhfZGF0YV9wb3N0KTsKKwkJYWNrID0gUlhSUENfQUNLX0RVUExJQ0FURTsKKwkJcmV0ID0gLUVOT0JVRlM7CisJCWdvdG8gZGlzY2FyZF9hbmRfYWNrOworCX0KKworCS8qIHdlIG1heSBhbHJlYWR5IGhhdmUgdGhlIHBhY2tldCBpbiB0aGUgb3V0IG9mIHNlcXVlbmNlIHF1ZXVlICovCisJYWNrYml0ID0gc2VxIC0gKGNhbGwtPnJ4X2RhdGFfZWF0ZW4gKyAxKTsKKwlBU1NFUlRDTVAoYWNrYml0LCA+PSwgMCk7CisJaWYgKF9fdGVzdF9hbmRfc2V0X2JpdChhY2tiaXQsIGNhbGwtPmFja3Jfd2luZG93KSkgeworCQlfZGVidWcoImR1cCBvb3MgIyV1IFsldSwldV0iLAorCQkgICAgICAgc2VxLCBjYWxsLT5yeF9kYXRhX2VhdGVuLCBjYWxsLT5yeF9kYXRhX3Bvc3QpOworCQlhY2sgPSBSWFJQQ19BQ0tfRFVQTElDQVRFOworCQlnb3RvIGRpc2NhcmRfYW5kX2FjazsKKwl9CisKKwlpZiAoc2VxID49IGNhbGwtPmFja3Jfd2luX3RvcCkgeworCQlfZGVidWcoImV4Y2VlZCAjJXUgWyV1XSIsIHNlcSwgY2FsbC0+YWNrcl93aW5fdG9wKTsKKwkJX19jbGVhcl9iaXQoYWNrYml0LCBjYWxsLT5hY2tyX3dpbmRvdyk7CisJCWFjayA9IFJYUlBDX0FDS19FWENFRURTX1dJTkRPVzsKKwkJZ290byBkaXNjYXJkX2FuZF9hY2s7CisJfQorCisJaWYgKHNlcSA9PSBjYWxsLT5yeF9kYXRhX2V4cGVjdCkgeworCQljbGVhcl9iaXQoUlhSUENfQ0FMTF9FWFBFQ1RfT09TLCAmY2FsbC0+ZmxhZ3MpOworCQljYWxsLT5yeF9kYXRhX2V4cGVjdCsrOworCX0gZWxzZSBpZiAoc2VxID4gY2FsbC0+cnhfZGF0YV9leHBlY3QpIHsKKwkJX2RlYnVnKCJvb3MgIyV1IFsldV0iLCBzZXEsIGNhbGwtPnJ4X2RhdGFfZXhwZWN0KTsKKwkJY2FsbC0+cnhfZGF0YV9leHBlY3QgPSBzZXEgKyAxOworCQlpZiAodGVzdF9hbmRfc2V0X2JpdChSWFJQQ19DQUxMX0VYUEVDVF9PT1MsICZjYWxsLT5mbGFncykpIHsKKwkJCWFjayA9IFJYUlBDX0FDS19PVVRfT0ZfU0VRVUVOQ0U7CisJCQlnb3RvIGVucXVldWVfYW5kX2FjazsKKwkJfQorCQlnb3RvIGVucXVldWVfcGFja2V0OworCX0KKworCWlmIChzZXEgIT0gY2FsbC0+cnhfZGF0YV9wb3N0KSB7CisJCV9kZWJ1ZygiYWhlYWQgIyV1IFsldV0iLCBzZXEsIGNhbGwtPnJ4X2RhdGFfcG9zdCk7CisJCWdvdG8gZW5xdWV1ZV9wYWNrZXQ7CisJfQorCisJaWYgKHRlc3RfYml0KFJYUlBDX0NBTExfUkNWRF9MQVNULCAmY2FsbC0+ZmxhZ3MpKQorCQlnb3RvIHByb3RvY29sX2Vycm9yOworCisJLyogaWYgdGhlIHBhY2tldCBuZWVkIHNlY3VyaXR5IHRoaW5ncyBkb2luZyB0byBpdCwgdGhlbiBpdCBnb2VzIGRvd24KKwkgKiB0aGUgc2xvdyBwYXRoICovCisJaWYgKGNhbGwtPmNvbm4tPnNlY3VyaXR5KQorCQlnb3RvIGVucXVldWVfcGFja2V0OworCisJc3AtPmNhbGwgPSBjYWxsOworCXJ4cnBjX2dldF9jYWxsKGNhbGwpOworCXRlcm1pbmFsID0gKChzcC0+aGRyLmZsYWdzICYgUlhSUENfTEFTVF9QQUNLRVQpICYmCisJCSAgICAhKHNwLT5oZHIuZmxhZ3MgJiBSWFJQQ19DTElFTlRfSU5JVElBVEVEKSk7CisJcmV0ID0gcnhycGNfcXVldWVfcmN2X3NrYihjYWxsLCBza2IsIGZhbHNlLCB0ZXJtaW5hbCk7CisJaWYgKHJldCA8IDApIHsKKwkJaWYgKHJldCA9PSAtRU5PTUVNIHx8IHJldCA9PSAtRU5PQlVGUykgeworCQkJX19jbGVhcl9iaXQoYWNrYml0LCBjYWxsLT5hY2tyX3dpbmRvdyk7CisJCQlhY2sgPSBSWFJQQ19BQ0tfTk9TUEFDRTsKKwkJCWdvdG8gZGlzY2FyZF9hbmRfYWNrOworCQl9CisJCWdvdG8gb3V0OworCX0KKworCXNrYiA9IE5VTEw7CisKKwlfZGVidWcoInBvc3QgIyV1Iiwgc2VxKTsKKwlBU1NFUlRDTVAoY2FsbC0+cnhfZGF0YV9wb3N0LCA9PSwgc2VxKTsKKwljYWxsLT5yeF9kYXRhX3Bvc3QrKzsKKworCWlmIChzcC0+aGRyLmZsYWdzICYgUlhSUENfTEFTVF9QQUNLRVQpCisJCXNldF9iaXQoUlhSUENfQ0FMTF9SQ1ZEX0xBU1QsICZjYWxsLT5mbGFncyk7CisKKwkvKiBpZiB3ZSd2ZSByZWFjaGVkIGFuIG91dCBvZiBzZXF1ZW5jZSBwYWNrZXQgdGhlbiB3ZSBuZWVkIHRvIGRyYWluCisJICogdGhhdCBxdWV1ZSBpbnRvIHRoZSBzb2NrZXQgUnggcXVldWUgbm93ICovCisJaWYgKGNhbGwtPnJ4X2RhdGFfcG9zdCA9PSBjYWxsLT5yeF9maXJzdF9vb3MpIHsKKwkJX2RlYnVnKCJkcmFpbiByeCBvb3Mgbm93Iik7CisJCXJlYWRfbG9jaygmY2FsbC0+c3RhdGVfbG9jayk7CisJCWlmIChjYWxsLT5zdGF0ZSA8IFJYUlBDX0NBTExfQ09NUExFVEUgJiYKKwkJICAgICF0ZXN0X2FuZF9zZXRfYml0KFJYUlBDX0NBTExfRFJBSU5fUlhfT09TLCAmY2FsbC0+ZXZlbnRzKSkKKwkJCXJ4cnBjX3F1ZXVlX2NhbGwoY2FsbCk7CisJCXJlYWRfdW5sb2NrKCZjYWxsLT5zdGF0ZV9sb2NrKTsKKwl9CisKKwlzcGluX3VubG9jaygmY2FsbC0+bG9jayk7CisJYXRvbWljX2luYygmY2FsbC0+YWNrcl9ub3RfaWRsZSk7CisJcnhycGNfcHJvcG9zZV9BQ0soY2FsbCwgUlhSUENfQUNLX0RFTEFZLCBzcC0+aGRyLnNlcmlhbCwgZmFsc2UpOworCV9sZWF2ZSgiID0gMCBbcG9zdGVkXSIpOworCXJldHVybiAwOworCitwcm90b2NvbF9lcnJvcjoKKwlyZXQgPSAtRUJBRE1TRzsKK291dDoKKwlzcGluX3VubG9jaygmY2FsbC0+bG9jayk7CisJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJcmV0dXJuIHJldDsKKworZGlzY2FyZF9hbmRfYWNrOgorCV9kZWJ1ZygiZGlzY2FyZCBhbmQgQUNLIHBhY2tldCAlcCIsIHNrYik7CisJX19yeHJwY19wcm9wb3NlX0FDSyhjYWxsLCBhY2ssIHNwLT5oZHIuc2VyaWFsLCB0cnVlKTsKK2Rpc2NhcmQ6CisJc3Bpbl91bmxvY2soJmNhbGwtPmxvY2spOworCXJ4cnBjX2ZyZWVfc2tiKHNrYik7CisJX2xlYXZlKCIgPSAwIFtkaXNjYXJkZWRdIik7CisJcmV0dXJuIDA7CisKK2VucXVldWVfYW5kX2FjazoKKwlfX3J4cnBjX3Byb3Bvc2VfQUNLKGNhbGwsIGFjaywgc3AtPmhkci5zZXJpYWwsIHRydWUpOworZW5xdWV1ZV9wYWNrZXQ6CisJX25ldCgiZGVmZXIgc2tiICVwIiwgc2tiKTsKKwlzcGluX3VubG9jaygmY2FsbC0+bG9jayk7CisJc2tiX3F1ZXVlX3RhaWwoJmNhbGwtPnJ4X3F1ZXVlLCBza2IpOworCWF0b21pY19pbmMoJmNhbGwtPmFja3Jfbm90X2lkbGUpOworCXJlYWRfbG9jaygmY2FsbC0+c3RhdGVfbG9jayk7CisJaWYgKGNhbGwtPnN0YXRlIDwgUlhSUENfQ0FMTF9ERUFEKQorCQlyeHJwY19xdWV1ZV9jYWxsKGNhbGwpOworCXJlYWRfdW5sb2NrKCZjYWxsLT5zdGF0ZV9sb2NrKTsKKwlfbGVhdmUoIiA9IDAgW3F1ZXVlZF0iKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGFzc3VtZSBhbiBpbXBsaWNpdCBBQ0tBTEwgb2YgdGhlIHRyYW5zbWlzc2lvbiBwaGFzZSBvZiBhIGNsaWVudCBzb2NrZXQgdXBvbgorICogcmVjZXB0aW9uIG9mIHRoZSBmaXJzdCByZXBseSBwYWNrZXQKKyAqLworc3RhdGljIHZvaWQgcnhycGNfYXNzdW1lX2ltcGxpY2l0X2Fja2FsbChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwgdTMyIHNlcmlhbCkKK3sKKwl3cml0ZV9sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKKworCXN3aXRjaCAoY2FsbC0+c3RhdGUpIHsKKwljYXNlIFJYUlBDX0NBTExfQ0xJRU5UX0FXQUlUX1JFUExZOgorCQljYWxsLT5zdGF0ZSA9IFJYUlBDX0NBTExfQ0xJRU5UX1JFQ1ZfUkVQTFk7CisJCWNhbGwtPmFja3NfbGF0ZXN0ID0gc2VyaWFsOworCisJCV9kZWJ1ZygiaW1wbGljaXQgQUNLQUxMICUlJXUiLCBjYWxsLT5hY2tzX2xhdGVzdCk7CisJCXNldF9iaXQoUlhSUENfQ0FMTF9SQ1ZEX0FDS0FMTCwgJmNhbGwtPmV2ZW50cyk7CisJCXdyaXRlX3VubG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7CisKKwkJaWYgKHRyeV90b19kZWxfdGltZXJfc3luYygmY2FsbC0+cmVzZW5kX3RpbWVyKSA+PSAwKSB7CisJCQljbGVhcl9iaXQoUlhSUENfQ0FMTF9SRVNFTkRfVElNRVIsICZjYWxsLT5ldmVudHMpOworCQkJY2xlYXJfYml0KFJYUlBDX0NBTExfUkVTRU5ELCAmY2FsbC0+ZXZlbnRzKTsKKwkJCWNsZWFyX2JpdChSWFJQQ19DQUxMX1JVTl9SVElNRVIsICZjYWxsLT5mbGFncyk7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQl3cml0ZV91bmxvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOworCQlicmVhazsKKwl9Cit9CisKKy8qCisgKiBwb3N0IGFuIGluY29taW5nIHBhY2tldCB0byB0aGUgbm9taW5hdGVkIGNhbGwgdG8gZGVhbCB3aXRoCisgKiAtIG11c3QgZ2V0IHJpZCBvZiB0aGUgc2tfYnVmZiwgZWl0aGVyIGJ5IGZyZWVpbmcgaXQgb3IgYnkgcXVldWluZyBpdAorICovCit2b2lkIHJ4cnBjX2Zhc3RfcHJvY2Vzc19wYWNrZXQoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHJ4cnBjX3NrYl9wcml2ICpzcCA9IHJ4cnBjX3NrYihza2IpOworCV9fYmUzMiBfYWJvcnRfY29kZTsKKwl1MzIgc2VyaWFsLCBoaV9zZXJpYWwsIHNlcSwgYWJvcnRfY29kZTsKKworCV9lbnRlcigiJXAsJXAiLCBjYWxsLCBza2IpOworCisJQVNTRVJUKCFpcnFzX2Rpc2FibGVkKCkpOworCisjaWYgMCAvLyBJTkpFQ1QgUlggRVJST1IKKwlpZiAoc3AtPmhkci50eXBlID09IFJYUlBDX1BBQ0tFVF9UWVBFX0RBVEEpIHsKKwkJc3RhdGljIGludCBza2lwID0gMDsKKwkJaWYgKCsrc2tpcCA9PSAzKSB7CisJCQlwcmludGsoIkRST1BQRUQgM1JEIFBBQ0tFVCEhISEhISEhISEhISFcbiIpOworCQkJc2tpcCA9IDA7CisJCQlnb3RvIGZyZWVfcGFja2V0OworCQl9CisJfQorI2VuZGlmCisKKwkvKiB0cmFjayB0aGUgbGF0ZXN0IHNlcmlhbCBudW1iZXIgb24gdGhpcyBjb25uZWN0aW9uIGZvciBBQ0sgcGFja2V0CisJICogaW5mb3JtYXRpb24gKi8KKwlzZXJpYWwgPSBudG9obChzcC0+aGRyLnNlcmlhbCk7CisJaGlfc2VyaWFsID0gYXRvbWljX3JlYWQoJmNhbGwtPmNvbm4tPmhpX3NlcmlhbCk7CisJd2hpbGUgKHNlcmlhbCA+IGhpX3NlcmlhbCkKKwkJaGlfc2VyaWFsID0gYXRvbWljX2NtcHhjaGcoJmNhbGwtPmNvbm4tPmhpX3NlcmlhbCwgaGlfc2VyaWFsLAorCQkJCQkgICBzZXJpYWwpOworCisJLyogcmVxdWVzdCBBQ0sgZ2VuZXJhdGlvbiBmb3IgYW55IEFDSyBvciBEQVRBIHBhY2tldCB0aGF0IHJlcXVlc3RzCisJICogaXQgKi8KKwlpZiAoc3AtPmhkci5mbGFncyAmIFJYUlBDX1JFUVVFU1RfQUNLKSB7CisJCV9wcm90bygiQUNLIFJlcXVlc3RlZCBvbiAlJSV1Iiwgc2VyaWFsKTsKKwkJcnhycGNfcHJvcG9zZV9BQ0soY2FsbCwgUlhSUENfQUNLX1JFUVVFU1RFRCwgc3AtPmhkci5zZXJpYWwsCisJCQkJICAhKHNwLT5oZHIuZmxhZ3MgJiBSWFJQQ19NT1JFX1BBQ0tFVFMpKTsKKwl9CisKKwlzd2l0Y2ggKHNwLT5oZHIudHlwZSkgeworCWNhc2UgUlhSUENfUEFDS0VUX1RZUEVfQUJPUlQ6CisJCV9kZWJ1ZygiYWJvcnQiKTsKKworCQlpZiAoc2tiX2NvcHlfYml0cyhza2IsIDAsICZfYWJvcnRfY29kZSwKKwkJCQkgIHNpemVvZihfYWJvcnRfY29kZSkpIDwgMCkKKwkJCWdvdG8gcHJvdG9jb2xfZXJyb3I7CisKKwkJYWJvcnRfY29kZSA9IG50b2hsKF9hYm9ydF9jb2RlKTsKKwkJX3Byb3RvKCJSeCBBQk9SVCAlJSV1IHsgJXggfSIsIHNlcmlhbCwgYWJvcnRfY29kZSk7CisKKwkJd3JpdGVfbG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7CisJCWlmIChjYWxsLT5zdGF0ZSA8IFJYUlBDX0NBTExfQ09NUExFVEUpIHsKKwkJCWNhbGwtPnN0YXRlID0gUlhSUENfQ0FMTF9SRU1PVEVMWV9BQk9SVEVEOworCQkJY2FsbC0+YWJvcnRfY29kZSA9IGFib3J0X2NvZGU7CisJCQlzZXRfYml0KFJYUlBDX0NBTExfUkNWRF9BQk9SVCwgJmNhbGwtPmV2ZW50cyk7CisJCQlyeHJwY19xdWV1ZV9jYWxsKGNhbGwpOworCQl9CisJCWdvdG8gZnJlZV9wYWNrZXRfdW5sb2NrOworCisJY2FzZSBSWFJQQ19QQUNLRVRfVFlQRV9CVVNZOgorCQlfcHJvdG8oIlJ4IEJVU1kgJSUldSIsIHNlcmlhbCk7CisKKwkJaWYgKGNhbGwtPmNvbm4tPm91dF9jbGllbnRmbGFnKQorCQkJZ290byBwcm90b2NvbF9lcnJvcjsKKworCQl3cml0ZV9sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKKwkJc3dpdGNoIChjYWxsLT5zdGF0ZSkgeworCQljYXNlIFJYUlBDX0NBTExfQ0xJRU5UX1NFTkRfUkVRVUVTVDoKKwkJCWNhbGwtPnN0YXRlID0gUlhSUENfQ0FMTF9TRVJWRVJfQlVTWTsKKwkJCXNldF9iaXQoUlhSUENfQ0FMTF9SQ1ZEX0JVU1ksICZjYWxsLT5ldmVudHMpOworCQkJcnhycGNfcXVldWVfY2FsbChjYWxsKTsKKwkJY2FzZSBSWFJQQ19DQUxMX1NFUlZFUl9CVVNZOgorCQkJZ290byBmcmVlX3BhY2tldF91bmxvY2s7CisJCWRlZmF1bHQ6CisJCQlnb3RvIHByb3RvY29sX2Vycm9yX2xvY2tlZDsKKwkJfQorCisJZGVmYXVsdDoKKwkJX3Byb3RvKCJSeCAlcyAlJSV1IiwgcnhycGNfcGt0c1tzcC0+aGRyLnR5cGVdLCBzZXJpYWwpOworCQlnb3RvIHByb3RvY29sX2Vycm9yOworCisJY2FzZSBSWFJQQ19QQUNLRVRfVFlQRV9EQVRBOgorCQlzZXEgPSBudG9obChzcC0+aGRyLnNlcSk7CisKKwkJX3Byb3RvKCJSeCBEQVRBICUlJXUgeyAjJXUgfSIsIHNlcmlhbCwgc2VxKTsKKworCQlpZiAoc2VxID09IDApCisJCQlnb3RvIHByb3RvY29sX2Vycm9yOworCisJCWNhbGwtPmFja3JfcHJldl9zZXEgPSBzcC0+aGRyLnNlcTsKKworCQkvKiByZWNlaXZlZCBkYXRhIGltcGxpY2l0bHkgQUNLcyBhbGwgb2YgdGhlIHJlcXVlc3QgcGFja2V0cyB3ZQorCQkgKiBzZW50IHdoZW4gd2UncmUgYWN0aW5nIGFzIGEgY2xpZW50ICovCisJCWlmIChjYWxsLT5zdGF0ZSA9PSBSWFJQQ19DQUxMX0NMSUVOVF9BV0FJVF9SRVBMWSkKKwkJCXJ4cnBjX2Fzc3VtZV9pbXBsaWNpdF9hY2thbGwoY2FsbCwgc2VyaWFsKTsKKworCQlzd2l0Y2ggKHJ4cnBjX2Zhc3RfcHJvY2Vzc19kYXRhKGNhbGwsIHNrYiwgc2VxKSkgeworCQljYXNlIDA6CisJCQlza2IgPSBOVUxMOworCQkJZ290byBkb25lOworCisJCWRlZmF1bHQ6CisJCQlCVUcoKTsKKworCQkJLyogZGF0YSBwYWNrZXQgcmVjZWl2ZWQgYmV5b25kIHRoZSBsYXN0IHBhY2tldCAqLworCQljYXNlIC1FQkFETVNHOgorCQkJZ290byBwcm90b2NvbF9lcnJvcjsKKwkJfQorCisJY2FzZSBSWFJQQ19QQUNLRVRfVFlQRV9BQ0s6CisJCS8qIEFDSyBwcm9jZXNzaW5nIGlzIGRvbmUgaW4gcHJvY2VzcyBjb250ZXh0ICovCisJCXJlYWRfbG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7CisJCWlmIChjYWxsLT5zdGF0ZSA8IFJYUlBDX0NBTExfREVBRCkgeworCQkJc2tiX3F1ZXVlX3RhaWwoJmNhbGwtPnJ4X3F1ZXVlLCBza2IpOworCQkJcnhycGNfcXVldWVfY2FsbChjYWxsKTsKKwkJCXNrYiA9IE5VTEw7CisJCX0KKwkJcmVhZF91bmxvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOworCQlnb3RvIGZyZWVfcGFja2V0OworCX0KKworcHJvdG9jb2xfZXJyb3I6CisJX2RlYnVnKCJwcm90b2NvbCBlcnJvciIpOworCXdyaXRlX2xvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOworcHJvdG9jb2xfZXJyb3JfbG9ja2VkOgorCWlmIChjYWxsLT5zdGF0ZSA8PSBSWFJQQ19DQUxMX0NPTVBMRVRFKSB7CisJCWNhbGwtPnN0YXRlID0gUlhSUENfQ0FMTF9MT0NBTExZX0FCT1JURUQ7CisJCWNhbGwtPmFib3J0X2NvZGUgPSBSWF9QUk9UT0NPTF9FUlJPUjsKKwkJc2V0X2JpdChSWFJQQ19DQUxMX0FCT1JULCAmY2FsbC0+ZXZlbnRzKTsKKwkJcnhycGNfcXVldWVfY2FsbChjYWxsKTsKKwl9CitmcmVlX3BhY2tldF91bmxvY2s6CisJd3JpdGVfdW5sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKK2ZyZWVfcGFja2V0OgorCXJ4cnBjX2ZyZWVfc2tiKHNrYik7Citkb25lOgorCV9sZWF2ZSgiIik7Cit9CisKKy8qCisgKiBzcGxpdCB1cCBhIGp1bWJvIGRhdGEgcGFja2V0CisgKi8KK3N0YXRpYyB2b2lkIHJ4cnBjX3Byb2Nlc3NfanVtYm9fcGFja2V0KHN0cnVjdCByeHJwY19jYWxsICpjYWxsLAorCQkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqanVtYm8pCit7CisJc3RydWN0IHJ4cnBjX2p1bWJvX2hlYWRlciBqaGRyOworCXN0cnVjdCByeHJwY19za2JfcHJpdiAqc3A7CisJc3RydWN0IHNrX2J1ZmYgKnBhcnQ7CisKKwlfZW50ZXIoIix7JXUsJXV9IiwganVtYm8tPmRhdGFfbGVuLCBqdW1iby0+bGVuKTsKKworCXNwID0gcnhycGNfc2tiKGp1bWJvKTsKKworCWRvIHsKKwkJc3AtPmhkci5mbGFncyAmPSB+UlhSUENfSlVNQk9fUEFDS0VUOworCisJCS8qIG1ha2UgYSBjbG9uZSB0byByZXByZXNlbnQgdGhlIGZpcnN0IHN1YnBhY2tldCBpbiB3aGF0J3MgbGVmdAorCQkgKiBvZiB0aGUganVtYm8gcGFja2V0ICovCisJCXBhcnQgPSBza2JfY2xvbmUoanVtYm8sIEdGUF9BVE9NSUMpOworCQlpZiAoIXBhcnQpIHsKKwkJCS8qIHNpbXBseSBkaXRjaCB0aGUgdGFpbCBpbiB0aGUgZXZlbnQgb2YgRU5PTUVNICovCisJCQlwc2tiX3RyaW0oanVtYm8sIFJYUlBDX0pVTUJPX0RBVEFMRU4pOworCQkJYnJlYWs7CisJCX0KKwkJcnhycGNfbmV3X3NrYihwYXJ0KTsKKworCQlwc2tiX3RyaW0ocGFydCwgUlhSUENfSlVNQk9fREFUQUxFTik7CisKKwkJaWYgKCFwc2tiX3B1bGwoanVtYm8sIFJYUlBDX0pVTUJPX0RBVEFMRU4pKQorCQkJZ290byBwcm90b2NvbF9lcnJvcjsKKworCQlpZiAoc2tiX2NvcHlfYml0cyhqdW1ibywgMCwgJmpoZHIsIHNpemVvZihqaGRyKSkgPCAwKQorCQkJZ290byBwcm90b2NvbF9lcnJvcjsKKwkJaWYgKCFwc2tiX3B1bGwoanVtYm8sIHNpemVvZihqaGRyKSkpCisJCQlCVUcoKTsKKworCQlzcC0+aGRyLnNlcQk9IGh0b25sKG50b2hsKHNwLT5oZHIuc2VxKSArIDEpOworCQlzcC0+aGRyLnNlcmlhbAk9IGh0b25sKG50b2hsKHNwLT5oZHIuc2VyaWFsKSArIDEpOworCQlzcC0+aGRyLmZsYWdzCT0gamhkci5mbGFnczsKKwkJc3AtPmhkci5fcnN2ZAk9IGpoZHIuX3JzdmQ7CisKKwkJX3Byb3RvKCJSeCBEQVRBIEp1bWJvICUlJXUiLCBudG9obChzcC0+aGRyLnNlcmlhbCkgLSAxKTsKKworCQlyeHJwY19mYXN0X3Byb2Nlc3NfcGFja2V0KGNhbGwsIHBhcnQpOworCQlwYXJ0ID0gTlVMTDsKKworCX0gd2hpbGUgKHNwLT5oZHIuZmxhZ3MgJiBSWFJQQ19KVU1CT19QQUNLRVQpOworCisJcnhycGNfZmFzdF9wcm9jZXNzX3BhY2tldChjYWxsLCBqdW1ibyk7CisJX2xlYXZlKCIiKTsKKwlyZXR1cm47CisKK3Byb3RvY29sX2Vycm9yOgorCV9kZWJ1ZygicHJvdG9jb2wgZXJyb3IiKTsKKwlyeHJwY19mcmVlX3NrYihwYXJ0KTsKKwlyeHJwY19mcmVlX3NrYihqdW1ibyk7CisJd3JpdGVfbG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7CisJaWYgKGNhbGwtPnN0YXRlIDw9IFJYUlBDX0NBTExfQ09NUExFVEUpIHsKKwkJY2FsbC0+c3RhdGUgPSBSWFJQQ19DQUxMX0xPQ0FMTFlfQUJPUlRFRDsKKwkJY2FsbC0+YWJvcnRfY29kZSA9IFJYX1BST1RPQ09MX0VSUk9SOworCQlzZXRfYml0KFJYUlBDX0NBTExfQUJPUlQsICZjYWxsLT5ldmVudHMpOworCQlyeHJwY19xdWV1ZV9jYWxsKGNhbGwpOworCX0KKwl3cml0ZV91bmxvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOworCV9sZWF2ZSgiIik7Cit9CisKKy8qCisgKiBwb3N0IGFuIGluY29taW5nIHBhY2tldCB0byB0aGUgYXBwcm9wcmlhdGUgY2FsbC9zb2NrZXQgdG8gZGVhbCB3aXRoCisgKiAtIG11c3QgZ2V0IHJpZCBvZiB0aGUgc2tfYnVmZiwgZWl0aGVyIGJ5IGZyZWVpbmcgaXQgb3IgYnkgcXVldWluZyBpdAorICovCitzdGF0aWMgdm9pZCByeHJwY19wb3N0X3BhY2tldF90b19jYWxsKHN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uLAorCQkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHJ4cnBjX3NrYl9wcml2ICpzcDsKKwlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbDsKKwlzdHJ1Y3QgcmJfbm9kZSAqcDsKKwlfX2JlMzIgY2FsbF9pZDsKKworCV9lbnRlcigiJXAsJXAiLCBjb25uLCBza2IpOworCisJcmVhZF9sb2NrX2JoKCZjb25uLT5sb2NrKTsKKworCXNwID0gcnhycGNfc2tiKHNrYik7CisKKwkvKiBsb29rIGF0IGV4dGFudCBjYWxscyBieSBjaGFubmVsIG51bWJlciBmaXJzdCAqLworCWNhbGwgPSBjb25uLT5jaGFubmVsc1tudG9obChzcC0+aGRyLmNpZCkgJiBSWFJQQ19DSEFOTkVMTUFTS107CisJaWYgKCFjYWxsIHx8IGNhbGwtPmNhbGxfaWQgIT0gc3AtPmhkci5jYWxsTnVtYmVyKQorCQlnb3RvIGNhbGxfbm90X2V4dGFudDsKKworCV9kZWJ1ZygiZXh0YW50IGNhbGwgWyVkXSIsIGNhbGwtPnN0YXRlKTsKKwlBU1NFUlRDTVAoY2FsbC0+Y29ubiwgPT0sIGNvbm4pOworCisJcmVhZF9sb2NrKCZjYWxsLT5zdGF0ZV9sb2NrKTsKKwlzd2l0Y2ggKGNhbGwtPnN0YXRlKSB7CisJY2FzZSBSWFJQQ19DQUxMX0xPQ0FMTFlfQUJPUlRFRDoKKwkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KFJYUlBDX0NBTExfQUJPUlQsICZjYWxsLT5ldmVudHMpKQorCQkJcnhycGNfcXVldWVfY2FsbChjYWxsKTsKKwljYXNlIFJYUlBDX0NBTExfUkVNT1RFTFlfQUJPUlRFRDoKKwljYXNlIFJYUlBDX0NBTExfTkVUV09SS19FUlJPUjoKKwljYXNlIFJYUlBDX0NBTExfREVBRDoKKwkJZ290byBmcmVlX3VubG9jazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZWFkX3VubG9jaygmY2FsbC0+c3RhdGVfbG9jayk7CisJcnhycGNfZ2V0X2NhbGwoY2FsbCk7CisJcmVhZF91bmxvY2tfYmgoJmNvbm4tPmxvY2spOworCisJaWYgKHNwLT5oZHIudHlwZSA9PSBSWFJQQ19QQUNLRVRfVFlQRV9EQVRBICYmCisJICAgIHNwLT5oZHIuZmxhZ3MgJiBSWFJQQ19KVU1CT19QQUNLRVQpCisJCXJ4cnBjX3Byb2Nlc3NfanVtYm9fcGFja2V0KGNhbGwsIHNrYik7CisJZWxzZQorCQlyeHJwY19mYXN0X3Byb2Nlc3NfcGFja2V0KGNhbGwsIHNrYik7CisKKwlyeHJwY19wdXRfY2FsbChjYWxsKTsKKwlnb3RvIGRvbmU7CisKK2NhbGxfbm90X2V4dGFudDoKKwkvKiBzZWFyY2ggdGhlIGNvbXBsZXRlZCBjYWxscyBpbiBjYXNlIHdoYXQgd2UncmUgZGVhbGluZyB3aXRoIGlzCisJICogdGhlcmUgKi8KKwlfZGVidWcoImNhbGwgbm90IGV4dGFudCIpOworCisJY2FsbF9pZCA9IHNwLT5oZHIuY2FsbE51bWJlcjsKKwlwID0gY29ubi0+Y2FsbHMucmJfbm9kZTsKKwl3aGlsZSAocCkgeworCQljYWxsID0gcmJfZW50cnkocCwgc3RydWN0IHJ4cnBjX2NhbGwsIGNvbm5fbm9kZSk7CisKKwkJaWYgKGNhbGxfaWQgPCBjYWxsLT5jYWxsX2lkKQorCQkJcCA9IHAtPnJiX2xlZnQ7CisJCWVsc2UgaWYgKGNhbGxfaWQgPiBjYWxsLT5jYWxsX2lkKQorCQkJcCA9IHAtPnJiX3JpZ2h0OworCQllbHNlCisJCQlnb3RvIGZvdW5kX2NvbXBsZXRlZF9jYWxsOworCX0KKworZGVhZF9jYWxsOgorCS8qIGl0J3MgYSBlaXRoZXIgYSByZWFsbHkgb2xkIGNhbGwgdGhhdCB3ZSBubyBsb25nZXIgcmVtZW1iZXIgb3IgaXRzIGEKKwkgKiBuZXcgaW5jb21pbmcgY2FsbCAqLworCXJlYWRfdW5sb2NrX2JoKCZjb25uLT5sb2NrKTsKKworCWlmIChzcC0+aGRyLmZsYWdzICYgUlhSUENfQ0xJRU5UX0lOSVRJQVRFRCAmJgorCSAgICBzcC0+aGRyLnNlcSA9PSBfX2NvbnN0YW50X2NwdV90b19iZTMyKDEpKSB7CisJCV9kZWJ1ZygiaW5jb21pbmcgY2FsbCIpOworCQlza2JfcXVldWVfdGFpbCgmY29ubi0+dHJhbnMtPmxvY2FsLT5hY2NlcHRfcXVldWUsIHNrYik7CisJCXJ4cnBjX3F1ZXVlX3dvcmsoJmNvbm4tPnRyYW5zLT5sb2NhbC0+YWNjZXB0b3IpOworCQlnb3RvIGRvbmU7CisJfQorCisJX2RlYnVnKCJkZWFkIGNhbGwiKTsKKwlza2ItPnByaW9yaXR5ID0gUlhfQ0FMTF9ERUFEOworCXJ4cnBjX3JlamVjdF9wYWNrZXQoY29ubi0+dHJhbnMtPmxvY2FsLCBza2IpOworCWdvdG8gZG9uZTsKKworCS8qIHJlc2VuZCBsYXN0IHBhY2tldCBvZiBhIGNvbXBsZXRlZCBjYWxsCisJICogLSBjbGllbnQgY2FsbHMgbWF5IGhhdmUgYmVlbiBhYm9ydGVkIG9yIEFDSydkCisJICogLSBzZXJ2ZXIgY2FsbHMgbWF5IGhhdmUgYmVlbiBhYm9ydGVkCisJICovCitmb3VuZF9jb21wbGV0ZWRfY2FsbDoKKwlfZGVidWcoImNvbXBsZXRlZCBjYWxsIik7CisKKwlpZiAoYXRvbWljX3JlYWQoJmNhbGwtPnVzYWdlKSA9PSAwKQorCQlnb3RvIGRlYWRfY2FsbDsKKworCS8qIHN5bmNocm9uaXNlIGFueSBzdGF0ZSBjaGFuZ2VzICovCisJcmVhZF9sb2NrKCZjYWxsLT5zdGF0ZV9sb2NrKTsKKwlBU1NFUlRJRkNNUChjYWxsLT5zdGF0ZSAhPSBSWFJQQ19DQUxMX0NMSUVOVF9GSU5BTF9BQ0ssCisJCSAgICBjYWxsLT5zdGF0ZSwgPj0sIFJYUlBDX0NBTExfQ09NUExFVEUpOworCisJaWYgKGNhbGwtPnN0YXRlID09IFJYUlBDX0NBTExfTE9DQUxMWV9BQk9SVEVEIHx8CisJICAgIGNhbGwtPnN0YXRlID09IFJYUlBDX0NBTExfUkVNT1RFTFlfQUJPUlRFRCB8fAorCSAgICBjYWxsLT5zdGF0ZSA9PSBSWFJQQ19DQUxMX0RFQUQpIHsKKwkJcmVhZF91bmxvY2soJmNhbGwtPnN0YXRlX2xvY2spOworCQlnb3RvIGRlYWRfY2FsbDsKKwl9CisKKwlpZiAoY2FsbC0+Y29ubi0+aW5fY2xpZW50ZmxhZykgeworCQlyZWFkX3VubG9jaygmY2FsbC0+c3RhdGVfbG9jayk7CisJCWdvdG8gZGVhZF9jYWxsOyAvKiBjb21wbGV0ZSBzZXJ2ZXIgY2FsbCAqLworCX0KKworCV9kZWJ1ZygiZmluYWwgYWNrIGFnYWluIik7CisJcnhycGNfZ2V0X2NhbGwoY2FsbCk7CisJc2V0X2JpdChSWFJQQ19DQUxMX0FDS19GSU5BTCwgJmNhbGwtPmV2ZW50cyk7CisJcnhycGNfcXVldWVfY2FsbChjYWxsKTsKKworZnJlZV91bmxvY2s6CisJcmVhZF91bmxvY2soJmNhbGwtPnN0YXRlX2xvY2spOworCXJlYWRfdW5sb2NrX2JoKCZjb25uLT5sb2NrKTsKKwlyeHJwY19mcmVlX3NrYihza2IpOworZG9uZToKKwlfbGVhdmUoIiIpOworfQorCisvKgorICogcG9zdCBjb25uZWN0aW9uLWxldmVsIGV2ZW50cyB0byB0aGUgY29ubmVjdGlvbgorICogLSB0aGlzIGluY2x1ZGVzIGNoYWxsZW5nZXMsIHJlc3BvbnNlcyBhbmQgc29tZSBhYm9ydHMKKyAqLworc3RhdGljIHZvaWQgcnhycGNfcG9zdF9wYWNrZXRfdG9fY29ubihzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubiwKKwkJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCV9lbnRlcigiJXAsJXAiLCBjb25uLCBza2IpOworCisJYXRvbWljX2luYygmY29ubi0+dXNhZ2UpOworCXNrYl9xdWV1ZV90YWlsKCZjb25uLT5yeF9xdWV1ZSwgc2tiKTsKKwlyeHJwY19xdWV1ZV9jb25uKGNvbm4pOworfQorCisvKgorICogaGFuZGxlIGRhdGEgcmVjZWl2ZWQgb24gdGhlIGxvY2FsIGVuZHBvaW50CisgKiAtIG1heSBiZSBjYWxsZWQgaW4gaW50ZXJydXB0IGNvbnRleHQKKyAqLwordm9pZCByeHJwY19kYXRhX3JlYWR5KHN0cnVjdCBzb2NrICpzaywgaW50IGNvdW50KQoreworCXN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uOworCXN0cnVjdCByeHJwY190cmFuc3BvcnQgKnRyYW5zOworCXN0cnVjdCByeHJwY19za2JfcHJpdiAqc3A7CisJc3RydWN0IHJ4cnBjX2xvY2FsICpsb2NhbDsKKwlzdHJ1Y3QgcnhycGNfcGVlciAqcGVlcjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCByZXQ7CisKKwlfZW50ZXIoIiVwLCAlZCIsIHNrLCBjb3VudCk7CisKKwlBU1NFUlQoIWlycXNfZGlzYWJsZWQoKSk7CisKKwlyZWFkX2xvY2tfYmgoJnJ4cnBjX2xvY2FsX2xvY2spOworCWxvY2FsID0gc2stPnNrX3VzZXJfZGF0YTsKKwlpZiAobG9jYWwgJiYgYXRvbWljX3JlYWQoJmxvY2FsLT51c2FnZSkgPiAwKQorCQlyeHJwY19nZXRfbG9jYWwobG9jYWwpOworCWVsc2UKKwkJbG9jYWwgPSBOVUxMOworCXJlYWRfdW5sb2NrX2JoKCZyeHJwY19sb2NhbF9sb2NrKTsKKwlpZiAoIWxvY2FsKSB7CisJCV9sZWF2ZSgiIFtsb2NhbCBkZWFkXSIpOworCQlyZXR1cm47CisJfQorCisJc2tiID0gc2tiX3JlY3ZfZGF0YWdyYW0oc2ssIDAsIDEsICZyZXQpOworCWlmICghc2tiKSB7CisJCXJ4cnBjX3B1dF9sb2NhbChsb2NhbCk7CisJCWlmIChyZXQgPT0gLUVBR0FJTikKKwkJCXJldHVybjsKKwkJX2RlYnVnKCJVRFAgc29ja2V0IGVycm9yICVkIiwgcmV0KTsKKwkJcmV0dXJuOworCX0KKworCXJ4cnBjX25ld19za2Ioc2tiKTsKKworCV9uZXQoInJlY3Ygc2tiICVwIiwgc2tiKTsKKworCS8qIHdlJ2xsIHByb2JhYmx5IG5lZWQgdG8gY2hlY2tzdW0gaXQgKGRpZG4ndCBjYWxsIHNvY2tfcmVjdm1zZykgKi8KKwlpZiAoc2tiX2NoZWNrc3VtX2NvbXBsZXRlKHNrYikpIHsKKwkJcnhycGNfZnJlZV9za2Ioc2tiKTsKKwkJcnhycGNfcHV0X2xvY2FsKGxvY2FsKTsKKwkJX2xlYXZlKCIgW0NTVU0gZmFpbGVkXSIpOworCQlyZXR1cm47CisJfQorCisJLyogdGhlIHNvY2tldCBidWZmZXIgd2UgaGF2ZSBpcyBvd25lZCBieSBVRFAsIHdpdGggVURQJ3MgZGF0YSBhbGwgb3ZlcgorCSAqIGl0LCBidXQgd2UgcmVhbGx5IHdhbnQgb3VyIG93biAqLworCXNrYl9vcnBoYW4oc2tiKTsKKwlzcCA9IHJ4cnBjX3NrYihza2IpOworCW1lbXNldChzcCwgMCwgc2l6ZW9mKCpzcCkpOworCisJX25ldCgiUnggVURQIHBhY2tldCBmcm9tICUwOHg6JTA0aHUiLAorCSAgICAgbnRvaGwoaXBfaGRyKHNrYiktPnNhZGRyKSwgbnRvaHModWRwX2hkcihza2IpLT5zb3VyY2UpKTsKKworCS8qIGRpZyBvdXQgdGhlIFJ4UlBDIGNvbm5lY3Rpb24gZGV0YWlscyAqLworCWlmIChza2JfY29weV9iaXRzKHNrYiwgc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpLCAmc3AtPmhkciwKKwkJCSAgc2l6ZW9mKHNwLT5oZHIpKSA8IDApCisJCWdvdG8gYmFkX21lc3NhZ2U7CisJaWYgKCFwc2tiX3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IHVkcGhkcikgKyBzaXplb2Yoc3AtPmhkcikpKQorCQlCVUcoKTsKKworCV9uZXQoIlJ4IFJ4UlBDICVzIGVwPSV4IGNhbGw9JXg6JXgiLAorCSAgICAgc3AtPmhkci5mbGFncyAmIFJYUlBDX0NMSUVOVF9JTklUSUFURUQgPyAiVG9TZXJ2ZXIiIDogIlRvQ2xpZW50IiwKKwkgICAgIG50b2hsKHNwLT5oZHIuZXBvY2gpLAorCSAgICAgbnRvaGwoc3AtPmhkci5jaWQpLAorCSAgICAgbnRvaGwoc3AtPmhkci5jYWxsTnVtYmVyKSk7CisKKwlpZiAoc3AtPmhkci50eXBlID09IDAgfHwgc3AtPmhkci50eXBlID49IFJYUlBDX05fUEFDS0VUX1RZUEVTKSB7CisJCV9wcm90bygiUnggQmFkIFBhY2tldCBUeXBlICV1Iiwgc3AtPmhkci50eXBlKTsKKwkJZ290byBiYWRfbWVzc2FnZTsKKwl9CisKKwlpZiAoc3AtPmhkci50eXBlID09IFJYUlBDX1BBQ0tFVF9UWVBFX0RBVEEgJiYKKwkgICAgKHNwLT5oZHIuY2FsbE51bWJlciA9PSAwIHx8IHNwLT5oZHIuc2VxID09IDApKQorCQlnb3RvIGJhZF9tZXNzYWdlOworCisJcGVlciA9IHJ4cnBjX2ZpbmRfcGVlcihsb2NhbCwgaXBfaGRyKHNrYiktPnNhZGRyLCB1ZHBfaGRyKHNrYiktPnNvdXJjZSk7CisJaWYgKElTX0VSUihwZWVyKSkKKwkJZ290byBjYW50X3JvdXRlX2NhbGw7CisKKwl0cmFucyA9IHJ4cnBjX2ZpbmRfdHJhbnNwb3J0KGxvY2FsLCBwZWVyKTsKKwlyeHJwY19wdXRfcGVlcihwZWVyKTsKKwlpZiAoIXRyYW5zKQorCQlnb3RvIGNhbnRfcm91dGVfY2FsbDsKKworCWNvbm4gPSByeHJwY19maW5kX2Nvbm5lY3Rpb24odHJhbnMsICZzcC0+aGRyKTsKKwlyeHJwY19wdXRfdHJhbnNwb3J0KHRyYW5zKTsKKwlpZiAoIWNvbm4pCisJCWdvdG8gY2FudF9yb3V0ZV9jYWxsOworCisJX2RlYnVnKCJDT05OICVwIHslZH0iLCBjb25uLCBjb25uLT5kZWJ1Z19pZCk7CisKKwlpZiAoc3AtPmhkci5jYWxsTnVtYmVyID09IDApCisJCXJ4cnBjX3Bvc3RfcGFja2V0X3RvX2Nvbm4oY29ubiwgc2tiKTsKKwllbHNlCisJCXJ4cnBjX3Bvc3RfcGFja2V0X3RvX2NhbGwoY29ubiwgc2tiKTsKKwlyeHJwY19wdXRfY29ubmVjdGlvbihjb25uKTsKKwlyeHJwY19wdXRfbG9jYWwobG9jYWwpOworCXJldHVybjsKKworY2FudF9yb3V0ZV9jYWxsOgorCV9kZWJ1ZygiY2FuJ3Qgcm91dGUgY2FsbCIpOworCWlmIChzcC0+aGRyLmZsYWdzICYgUlhSUENfQ0xJRU5UX0lOSVRJQVRFRCAmJgorCSAgICBzcC0+aGRyLnR5cGUgPT0gUlhSUENfUEFDS0VUX1RZUEVfREFUQSkgeworCQlpZiAoc3AtPmhkci5zZXEgPT0gX19jb25zdGFudF9jcHVfdG9fYmUzMigxKSkgeworCQkJX2RlYnVnKCJmaXJzdCBwYWNrZXQiKTsKKwkJCXNrYl9xdWV1ZV90YWlsKCZsb2NhbC0+YWNjZXB0X3F1ZXVlLCBza2IpOworCQkJcnhycGNfcXVldWVfd29yaygmbG9jYWwtPmFjY2VwdG9yKTsKKwkJCXJ4cnBjX3B1dF9sb2NhbChsb2NhbCk7CisJCQlfbGVhdmUoIiBbaW5jb21pbmddIik7CisJCQlyZXR1cm47CisJCX0KKwkJc2tiLT5wcmlvcml0eSA9IFJYX0lOVkFMSURfT1BFUkFUSU9OOworCX0gZWxzZSB7CisJCXNrYi0+cHJpb3JpdHkgPSBSWF9DQUxMX0RFQUQ7CisJfQorCisJX2RlYnVnKCJyZWplY3QiKTsKKwlyeHJwY19yZWplY3RfcGFja2V0KGxvY2FsLCBza2IpOworCXJ4cnBjX3B1dF9sb2NhbChsb2NhbCk7CisJX2xlYXZlKCIgW25vIGNhbGxdIik7CisJcmV0dXJuOworCitiYWRfbWVzc2FnZToKKwlza2ItPnByaW9yaXR5ID0gUlhfUFJPVE9DT0xfRVJST1I7CisJcnhycGNfcmVqZWN0X3BhY2tldChsb2NhbCwgc2tiKTsKKwlyeHJwY19wdXRfbG9jYWwobG9jYWwpOworCV9sZWF2ZSgiIFtiYWRtc2ddIik7Cit9CmRpZmYgLS1naXQgYS9uZXQvcnhycGMvYXItaW50ZXJuYWwuaCBiL25ldC9yeHJwYy9hci1pbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4YWFmODkKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvcnhycGMvYXItaW50ZXJuYWwuaApAQCAtMCwwICsxLDgwOCBAQAorLyogQUZfUlhSUEMgaW50ZXJuYWwgZGVmaW5pdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPHJ4cnBjL3BhY2tldC5oPgorCisjaWYgMAorI2RlZmluZSBDSEVDS19TTEFCX09LQVkoWCkJCQkJICAgICBcCisJQlVHX09OKGF0b21pY19yZWFkKChYKSkgPj4gKHNpemVvZihhdG9taWNfdCkgLSAyKSA9PSBcCisJICAgICAgIChQT0lTT05fRlJFRSA8PCA4IHwgUE9JU09OX0ZSRUUpKQorI2Vsc2UKKyNkZWZpbmUgQ0hFQ0tfU0xBQl9PS0FZKFgpIGRvIHt9IHdoaWxlKDApCisjZW5kaWYKKworI2RlZmluZSBGQ1JZUFRfQlNJWkUgOAorc3RydWN0IHJ4cnBjX2NyeXB0IHsKKwl1bmlvbiB7CisJCXU4CXhbRkNSWVBUX0JTSVpFXTsKKwkJdTMyCW5bMl07CisJfTsKK30gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpOworCisjZGVmaW5lIHJ4cnBjX3F1ZXVlX3dvcmsoV1MpCXF1ZXVlX3dvcmsocnhycGNfd29ya3F1ZXVlLCAoV1MpKQorI2RlZmluZSByeHJwY19xdWV1ZV9kZWxheWVkX3dvcmsoV1MsRCkJXAorCXF1ZXVlX2RlbGF5ZWRfd29yayhyeHJwY193b3JrcXVldWUsIChXUyksIChEKSkKKworI2RlZmluZSByeHJwY19xdWV1ZV9jYWxsKENBTEwpCXJ4cnBjX3F1ZXVlX3dvcmsoJihDQUxMKS0+cHJvY2Vzc29yKQorI2RlZmluZSByeHJwY19xdWV1ZV9jb25uKENPTk4pCXJ4cnBjX3F1ZXVlX3dvcmsoJihDT05OKS0+cHJvY2Vzc29yKQorCisvKgorICogc2tfc3RhdGUgZm9yIFJ4UlBDIHNvY2tldHMKKyAqLworZW51bSB7CisJUlhSUENfVU5DT05ORUNURUQgPSAwLAorCVJYUlBDX0NMSUVOVF9CT1VORCwJCS8qIGNsaWVudCBsb2NhbCBhZGRyZXNzIGJvdW5kICovCisJUlhSUENfQ0xJRU5UX0NPTk5FQ1RFRCwJCS8qIGNsaWVudCBpcyBjb25uZWN0ZWQgKi8KKwlSWFJQQ19TRVJWRVJfQk9VTkQsCQkvKiBzZXJ2ZXIgbG9jYWwgYWRkcmVzcyBib3VuZCAqLworCVJYUlBDX1NFUlZFUl9MSVNURU5JTkcsCQkvKiBzZXJ2ZXIgbGlzdGVuaW5nIGZvciBjb25uZWN0aW9ucyAqLworCVJYUlBDX0NMT1NFLAkJCS8qIHNvY2tldCBpcyBiZWluZyBjbG9zZWQgKi8KK307CisKKy8qCisgKiBSeFJQQyBzb2NrZXQgZGVmaW5pdGlvbgorICovCitzdHJ1Y3QgcnhycGNfc29jayB7CisJLyogV0FSTklORzogc2sgaGFzIHRvIGJlIHRoZSBmaXJzdCBtZW1iZXIgKi8KKwlzdHJ1Y3Qgc29jawkJc2s7CisJcnhycGNfaW50ZXJjZXB0b3JfdAlpbnRlcmNlcHRvcjsJLyoga2VybmVsIHNlcnZpY2UgUnggaW50ZXJjZXB0b3IgZnVuY3Rpb24gKi8KKwlzdHJ1Y3QgcnhycGNfbG9jYWwJKmxvY2FsOwkJLyogbG9jYWwgZW5kcG9pbnQgKi8KKwlzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0CSp0cmFuczsJCS8qIHRyYW5zcG9ydCBoYW5kbGVyICovCisJc3RydWN0IHJ4cnBjX2Nvbm5fYnVuZGxlICpidW5kbGU7CS8qIHZpcnR1YWwgY29ubmVjdGlvbiBidW5kbGUgKi8KKwlzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbgkqY29ubjsJCS8qIGV4Y2x1c2l2ZSB2aXJ0dWFsIGNvbm5lY3Rpb24gKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Rlbl9saW5rOwkvKiBsaW5rIGluIHRoZSBsb2NhbCBlbmRwb2ludCdzIGxpc3RlbiBsaXN0ICovCisJc3RydWN0IGxpc3RfaGVhZAlzZWN1cmVxOwkvKiBjYWxscyBhd2FpdGluZyBjb25uZWN0aW9uIHNlY3VyaXR5IGNsZWFyYW5jZSAqLworCXN0cnVjdCBsaXN0X2hlYWQJYWNjZXB0cTsJLyogY2FsbHMgYXdhaXRpbmcgYWNjZXB0YW5jZSAqLworCXN0cnVjdCBrZXkJCSprZXk7CQkvKiBzZWN1cml0eSBmb3IgdGhpcyBzb2NrZXQgKi8KKwlzdHJ1Y3Qga2V5CQkqc2VjdXJpdGllczsJLyogbGlzdCBvZiBzZXJ2ZXIgc2VjdXJpdHkgZGVzY3JpcHRvcnMgKi8KKwlzdHJ1Y3QgcmJfcm9vdAkJY2FsbHM7CQkvKiBvdXRzdGFuZGluZyBjYWxscyBvbiB0aGlzIHNvY2tldCAqLworCXVuc2lnbmVkIGxvbmcJCWZsYWdzOworI2RlZmluZSBSWFJQQ19TT0NLX0VYQ0xVU0lWRV9DT05OCTEJLyogZXhjbHVzaXZlIGNvbm5lY3Rpb24gZm9yIGEgY2xpZW50IHNvY2tldCAqLworCXJ3bG9ja190CQljYWxsX2xvY2s7CS8qIGxvY2sgZm9yIGNhbGxzICovCisJdTMyCQkJbWluX3NlY19sZXZlbDsJLyogbWluaW11bSBzZWN1cml0eSBsZXZlbCAqLworI2RlZmluZSBSWFJQQ19TRUNVUklUWV9NQVgJUlhSUENfU0VDVVJJVFlfRU5DUllQVAorCXN0cnVjdCBzb2NrYWRkcl9yeHJwYwlzcng7CQkvKiBsb2NhbCBhZGRyZXNzICovCisJc2FfZmFtaWx5X3QJCXByb3RvOwkJLyogcHJvdG9jb2wgY3JlYXRlZCB3aXRoICovCisJX19iZTE2CQkJc2VydmljZV9pZDsJLyogc2VydmljZSBJRCBvZiBsb2NhbC9yZW1vdGUgc2VydmljZSAqLworfTsKKworI2RlZmluZSByeHJwY19zayhfX3NrKSBjb250YWluZXJfb2YoKF9fc2spLCBzdHJ1Y3QgcnhycGNfc29jaywgc2spCisKKy8qCisgKiBSeFJQQyBzb2NrZXQgYnVmZmVyIHByaXZhdGUgdmFyaWFibGVzCisgKiAtIG1heCA0OCBieXRlcyAoc3RydWN0IHNrX2J1ZmY6OmNiKQorICovCitzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgeworCXN0cnVjdCByeHJwY19jYWxsCSpjYWxsOwkJLyogY2FsbCB3aXRoIHdoaWNoIGFzc29jaWF0ZWQgKi8KKwl1bnNpZ25lZCBsb25nCQlyZXNlbmRfYXQ7CS8qIHRpbWUgaW4gamlmZmllcyBhdCB3aGljaCB0byByZXNlbmQgKi8KKwl1bmlvbiB7CisJCXVuc2lnbmVkCW9mZnNldDsJCS8qIG9mZnNldCBpbnRvIGJ1ZmZlciBvZiBuZXh0IHJlYWQgKi8KKwkJaW50CQlyZW1haW47CQkvKiBhbW91bnQgb2Ygc3BhY2UgcmVtYWluaW5nIGZvciBuZXh0IHdyaXRlICovCisJCXUzMgkJZXJyb3I7CQkvKiBuZXR3b3JrIGVycm9yIGNvZGUgKi8KKwkJYm9vbAkJbmVlZF9yZXNlbmQ7CS8qIFQgaWYgbmVlZHMgcmVzZW5kaW5nICovCisJfTsKKworCXN0cnVjdCByeHJwY19oZWFkZXIJaGRyOwkJLyogUnhSUEMgcGFja2V0IGhlYWRlciBmcm9tIHRoaXMgcGFja2V0ICovCit9OworCisjZGVmaW5lIHJ4cnBjX3NrYihfX3NrYikgKChzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKikgJihfX3NrYiktPmNiKQorCitlbnVtIHJ4cnBjX2NvbW1hbmQgeworCVJYUlBDX0NNRF9TRU5EX0RBVEEsCQkvKiBzZW5kIGRhdGEgbWVzc2FnZSAqLworCVJYUlBDX0NNRF9TRU5EX0FCT1JULAkJLyogcmVxdWVzdCBhYm9ydCBnZW5lcmF0aW9uICovCisJUlhSUENfQ01EX0FDQ0VQVCwJCS8qIFtzZXJ2ZXJdIGFjY2VwdCBpbmNvbWluZyBjYWxsICovCisJUlhSUENfQ01EX1JFSkVDVF9CVVNZLAkJLyogW3NlcnZlcl0gcmVqZWN0IGEgY2FsbCBhcyBidXN5ICovCit9OworCisvKgorICogUnhSUEMgc2VjdXJpdHkgbW9kdWxlIGludGVyZmFjZQorICovCitzdHJ1Y3QgcnhycGNfc2VjdXJpdHkgeworCXN0cnVjdCBtb2R1bGUJCSpvd25lcjsJCS8qIHByb3ZpZGluZyBtb2R1bGUgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpbms7CQkvKiBsaW5rIGluIG1hc3RlciBsaXN0ICovCisJY29uc3QgY2hhcgkJKm5hbWU7CQkvKiBuYW1lIG9mIHRoaXMgc2VydmljZSAqLworCXU4CQkJc2VjdXJpdHlfaW5kZXg7CS8qIHNlY3VyaXR5IHR5cGUgcHJvdmlkZWQgKi8KKworCS8qIGluaXRpYWxpc2UgYSBjb25uZWN0aW9uJ3Mgc2VjdXJpdHkgKi8KKwlpbnQgKCppbml0X2Nvbm5lY3Rpb25fc2VjdXJpdHkpKHN0cnVjdCByeHJwY19jb25uZWN0aW9uICopOworCisJLyogcHJpbWUgYSBjb25uZWN0aW9uJ3MgcGFja2V0IHNlY3VyaXR5ICovCisJdm9pZCAoKnByaW1lX3BhY2tldF9zZWN1cml0eSkoc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKik7CisKKwkvKiBpbXBvc2Ugc2VjdXJpdHkgb24gYSBwYWNrZXQgKi8KKwlpbnQgKCpzZWN1cmVfcGFja2V0KShjb25zdCBzdHJ1Y3QgcnhycGNfY2FsbCAqLAorCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqLAorCQkJICAgICBzaXplX3QsCisJCQkgICAgIHZvaWQgKik7CisKKwkvKiB2ZXJpZnkgdGhlIHNlY3VyaXR5IG9uIGEgcmVjZWl2ZWQgcGFja2V0ICovCisJaW50ICgqdmVyaWZ5X3BhY2tldCkoY29uc3Qgc3RydWN0IHJ4cnBjX2NhbGwgKiwgc3RydWN0IHNrX2J1ZmYgKiwKKwkJCSAgICAgdTMyICopOworCisJLyogaXNzdWUgYSBjaGFsbGVuZ2UgKi8KKwlpbnQgKCppc3N1ZV9jaGFsbGVuZ2UpKHN0cnVjdCByeHJwY19jb25uZWN0aW9uICopOworCisJLyogcmVzcG9uZCB0byBhIGNoYWxsZW5nZSAqLworCWludCAoKnJlc3BvbmRfdG9fY2hhbGxlbmdlKShzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqLAorCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqLAorCQkJCSAgICB1MzIgKik7CisKKwkvKiB2ZXJpZnkgYSByZXNwb25zZSAqLworCWludCAoKnZlcmlmeV9yZXNwb25zZSkoc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKiwKKwkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqLAorCQkJICAgICAgIHUzMiAqKTsKKworCS8qIGNsZWFyIGNvbm5lY3Rpb24gc2VjdXJpdHkgKi8KKwl2b2lkICgqY2xlYXIpKHN0cnVjdCByeHJwY19jb25uZWN0aW9uICopOworfTsKKworLyoKKyAqIFJ4UlBDIGxvY2FsIHRyYW5zcG9ydCBlbmRwb2ludCBkZWZpbml0aW9uCisgKiAtIG1hdGNoZWQgYnkgbG9jYWwgcG9ydCwgYWRkcmVzcyBhbmQgcHJvdG9jb2wgdHlwZQorICovCitzdHJ1Y3QgcnhycGNfbG9jYWwgeworCXN0cnVjdCBzb2NrZXQJCSpzb2NrZXQ7CS8qIG15IFVEUCBzb2NrZXQgKi8KKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJZGVzdHJveWVyOwkvKiBlbmRwb2ludCBkZXN0cm95ZXIgKi8KKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJYWNjZXB0b3I7CS8qIGluY29taW5nIGNhbGwgcHJvY2Vzc29yICovCisJc3RydWN0IHdvcmtfc3RydWN0CXJlamVjdGVyOwkvKiBwYWNrZXQgcmVqZWN0IHdyaXRlciAqLworCXN0cnVjdCBsaXN0X2hlYWQJc2VydmljZXM7CS8qIHNlcnZpY2VzIGxpc3RlbmluZyBvbiB0aGlzIGVuZHBvaW50ICovCisJc3RydWN0IGxpc3RfaGVhZAlsaW5rOwkJLyogbGluayBpbiBlbmRwb2ludCBsaXN0ICovCisJc3RydWN0IHJ3X3NlbWFwaG9yZQlkZWZyYWdfc2VtOwkvKiBjb250cm9sIHJlLWVuYWJsZW1lbnQgb2YgSVAgREYgYml0ICovCisJc3RydWN0IHNrX2J1ZmZfaGVhZAlhY2NlcHRfcXVldWU7CS8qIGluY29taW5nIGNhbGxzIGF3YWl0aW5nIGFjY2VwdGFuY2UgKi8KKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkCXJlamVjdF9xdWV1ZTsJLyogcGFja2V0cyBhd2FpdGluZyByZWplY3Rpb24gKi8KKwlzcGlubG9ja190CQlsb2NrOwkJLyogYWNjZXNzIGxvY2sgKi8KKwlyd2xvY2tfdAkJc2VydmljZXNfbG9jazsJLyogbG9jayBmb3Igc2VydmljZXMgbGlzdCAqLworCWF0b21pY190CQl1c2FnZTsKKwlpbnQJCQlkZWJ1Z19pZDsJLyogZGVidWcgSUQgZm9yIHByaW50a3MgKi8KKwl2b2xhdGlsZSBjaGFyCQllcnJvcl9yY3ZkOwkvKiBUIGlmIHJlY2VpdmVkIElDTVAgZXJyb3Igb3V0c3RhbmRpbmcgKi8KKwlzdHJ1Y3Qgc29ja2FkZHJfcnhycGMJc3J4OwkJLyogbG9jYWwgYWRkcmVzcyAqLworfTsKKworLyoKKyAqIFJ4UlBDIHJlbW90ZSB0cmFuc3BvcnQgZW5kcG9pbnQgZGVmaW5pdGlvbgorICogLSBtYXRjaGVkIGJ5IHJlbW90ZSBwb3J0LCBhZGRyZXNzIGFuZCBwcm90b2NvbCB0eXBlCisgKiAtIGhvbGRzIHRoZSBjb25uZWN0aW9uIElEIGNvdW50ZXIgZm9yIGNvbm5lY3Rpb25zIGJldHdlZW4gdGhlIHR3byBlbmRwb2ludHMKKyAqLworc3RydWN0IHJ4cnBjX3BlZXIgeworCXN0cnVjdCB3b3JrX3N0cnVjdAlkZXN0cm95ZXI7CS8qIHBlZXIgZGVzdHJveWVyICovCisJc3RydWN0IGxpc3RfaGVhZAlsaW5rOwkJLyogbGluayBpbiBtYXN0ZXIgcGVlciBsaXN0ICovCisJc3RydWN0IGxpc3RfaGVhZAllcnJvcl90YXJnZXRzOwkvKiB0YXJnZXRzIGZvciBuZXQgZXJyb3IgZGlzdHJpYnV0aW9uICovCisJc3BpbmxvY2tfdAkJbG9jazsJCS8qIGFjY2VzcyBsb2NrICovCisJYXRvbWljX3QJCXVzYWdlOworCXVuc2lnbmVkCQlpZl9tdHU7CQkvKiBpbnRlcmZhY2UgTVRVIGZvciB0aGlzIHBlZXIgKi8KKwl1bnNpZ25lZAkJbXR1OwkJLyogbmV0d29yayBNVFUgZm9yIHRoaXMgcGVlciAqLworCXVuc2lnbmVkCQltYXhkYXRhOwkvKiBkYXRhIHNpemUgKE1UVSAtIGhkcnNpemUpICovCisJdW5zaWduZWQgc2hvcnQJCWhkcnNpemU7CS8qIGhlYWRlciBzaXplIChJUCArIFVEUCArIFJ4UlBDKSAqLworCWludAkJCWRlYnVnX2lkOwkvKiBkZWJ1ZyBJRCBmb3IgcHJpbnRrcyAqLworCWludAkJCW5ldF9lcnJvcjsJLyogbmV0d29yayBlcnJvciBkaXN0cmlidXRlZCAqLworCXN0cnVjdCBzb2NrYWRkcl9yeHJwYwlzcng7CQkvKiByZW1vdGUgYWRkcmVzcyAqLworCisJLyogY2FsY3VsYXRlZCBSVFQgY2FjaGUgKi8KKyNkZWZpbmUgUlhSUENfUlRUX0NBQ0hFX1NJWkUgMzIKKwlzdXNlY29uZHNfdAkJcnR0OwkJLyogY3VycmVudCBSVFQgZXN0aW1hdGUgKGluIHVTKSAqLworCXVuc2lnbmVkCQlydHRfcG9pbnQ7CS8qIG5leHQgZW50cnkgYXQgd2hpY2ggdG8gaW5zZXJ0ICovCisJdW5zaWduZWQJCXJ0dF91c2FnZTsJLyogYW1vdW50IG9mIGNhY2hlIGFjdHVhbGx5IHVzZWQgKi8KKwlzdXNlY29uZHNfdAkJcnR0X2NhY2hlW1JYUlBDX1JUVF9DQUNIRV9TSVpFXTsgLyogY2FsY3VsYXRlZCBSVFQgY2FjaGUgKi8KK307CisKKy8qCisgKiBSeFJQQyBwb2ludC10by1wb2ludCB0cmFuc3BvcnQgLyBjb25uZWN0aW9uIG1hbmFnZXIgZGVmaW5pdGlvbgorICogLSBoYW5kbGVzIGEgYnVuZGxlIG9mIGNvbm5lY3Rpb25zIGJldHdlZW4gdHdvIGVuZHBvaW50cworICogLSBtYXRjaGVkIGJ5IHsgbG9jYWwsIHBlZXIgfQorICovCitzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0IHsKKwlzdHJ1Y3QgcnhycGNfbG9jYWwJKmxvY2FsOwkJLyogbG9jYWwgdHJhbnNwb3J0IGVuZHBvaW50ICovCisJc3RydWN0IHJ4cnBjX3BlZXIJKnBlZXI7CQkvKiByZW1vdGUgdHJhbnNwb3J0IGVuZHBvaW50ICovCisJc3RydWN0IHdvcmtfc3RydWN0CWVycm9yX2hhbmRsZXI7CS8qIG5ldHdvcmsgZXJyb3IgZGlzdHJpYnV0b3IgKi8KKwlzdHJ1Y3QgcmJfcm9vdAkJYnVuZGxlczsJLyogY2xpZW50IGNvbm5lY3Rpb24gYnVuZGxlcyBvbiB0aGlzIHRyYW5zcG9ydCAqLworCXN0cnVjdCByYl9yb290CQljbGllbnRfY29ubnM7CS8qIGNsaWVudCBjb25uZWN0aW9ucyBvbiB0aGlzIHRyYW5zcG9ydCAqLworCXN0cnVjdCByYl9yb290CQlzZXJ2ZXJfY29ubnM7CS8qIHNlcnZlciBjb25uZWN0aW9ucyBvbiB0aGlzIHRyYW5zcG9ydCAqLworCXN0cnVjdCBsaXN0X2hlYWQJbGluazsJCS8qIGxpbmsgaW4gbWFzdGVyIHNlc3Npb24gbGlzdCAqLworCXN0cnVjdCBza19idWZmX2hlYWQJZXJyb3JfcXVldWU7CS8qIGVycm9yIHBhY2tldHMgYXdhaXRpbmcgcHJvY2Vzc2luZyAqLworCXRpbWVfdAkJCXB1dF90aW1lOwkvKiB0aW1lIGF0IHdoaWNoIHRvIHJlYXAgKi8KKwlzcGlubG9ja190CQljbGllbnRfbG9jazsJLyogY2xpZW50IGNvbm5lY3Rpb24gYWxsb2NhdGlvbiBsb2NrICovCisJcndsb2NrX3QJCWNvbm5fbG9jazsJLyogbG9jayBmb3IgYWN0aXZlL2RlYWQgY29ubmVjdGlvbnMgKi8KKwlhdG9taWNfdAkJdXNhZ2U7CisJaW50CQkJZGVidWdfaWQ7CS8qIGRlYnVnIElEIGZvciBwcmludGtzICovCisJdW5zaWduZWQgaW50CQljb25uX2lkY291bnRlcjsJLyogY29ubmVjdGlvbiBJRCBjb3VudGVyIChjbGllbnQpICovCit9OworCisvKgorICogUnhSUEMgY2xpZW50IGNvbm5lY3Rpb24gYnVuZGxlCisgKiAtIG1hdGNoZWQgYnkgeyB0cmFuc3BvcnQsIHNlcnZpY2VfaWQsIGtleSB9CisgKi8KK3N0cnVjdCByeHJwY19jb25uX2J1bmRsZSB7CisJc3RydWN0IHJiX25vZGUJCW5vZGU7CQkvKiBub2RlIGluIHRyYW5zcG9ydCdzIGxvb2t1cCB0cmVlICovCisJc3RydWN0IGxpc3RfaGVhZAl1bnVzZWRfY29ubnM7CS8qIHVudXNlZCBjb25uZWN0aW9ucyBpbiB0aGlzIGJ1bmRsZSAqLworCXN0cnVjdCBsaXN0X2hlYWQJYXZhaWxfY29ubnM7CS8qIGF2YWlsYWJsZSBjb25uZWN0aW9ucyBpbiB0aGlzIGJ1bmRsZSAqLworCXN0cnVjdCBsaXN0X2hlYWQJYnVzeV9jb25uczsJLyogYnVzeSBjb25uZWN0aW9ucyBpbiB0aGlzIGJ1bmRsZSAqLworCXN0cnVjdCBrZXkJCSprZXk7CQkvKiBzZWN1cml0eSBmb3IgdGhpcyBidW5kbGUgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdAljaGFud2FpdDsJLyogd2FpdCBmb3IgY2hhbm5lbCB0byBiZWNvbWUgYXZhaWxhYmxlICovCisJYXRvbWljX3QJCXVzYWdlOworCWludAkJCWRlYnVnX2lkOwkvKiBkZWJ1ZyBJRCBmb3IgcHJpbnRrcyAqLworCXVuc2lnbmVkIHNob3J0CQludW1fY29ubnM7CS8qIG51bWJlciBvZiBjb25uZWN0aW9ucyBpbiB0aGlzIGJ1bmRsZSAqLworCV9fYmUxNgkJCXNlcnZpY2VfaWQ7CS8qIHNlcnZpY2UgSUQgKi8KKwl1aW50OF90CQkJc2VjdXJpdHlfaXg7CS8qIHNlY3VyaXR5IHR5cGUgKi8KK307CisKKy8qCisgKiBSeFJQQyBjb25uZWN0aW9uIGRlZmluaXRpb24KKyAqIC0gbWF0Y2hlZCBieSB7IHRyYW5zcG9ydCwgc2VydmljZV9pZCwgY29ubl9pZCwgZGlyZWN0aW9uLCBrZXkgfQorICogLSBlYWNoIGNvbm5lY3Rpb24gY2FuIG9ubHkgaGFuZGxlIGZvdXIgc2ltdWx0YW5lb3VzIGNhbGxzCisgKi8KK3N0cnVjdCByeHJwY19jb25uZWN0aW9uIHsKKwlzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0CSp0cmFuczsJCS8qIHRyYW5zcG9ydCBzZXNzaW9uICovCisJc3RydWN0IHJ4cnBjX2Nvbm5fYnVuZGxlICpidW5kbGU7CS8qIGNvbm5lY3Rpb24gYnVuZGxlIChjbGllbnQpICovCisJc3RydWN0IHdvcmtfc3RydWN0CXByb2Nlc3NvcjsJLyogY29ubmVjdGlvbiBldmVudCBwcm9jZXNzb3IgKi8KKwlzdHJ1Y3QgcmJfbm9kZQkJbm9kZTsJCS8qIG5vZGUgaW4gdHJhbnNwb3J0J3MgbG9va3VwIHRyZWUgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpbms7CQkvKiBsaW5rIGluIG1hc3RlciBjb25uZWN0aW9uIGxpc3QgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCWJ1bmRsZV9saW5rOwkvKiBsaW5rIGluIGJ1bmRsZSAqLworCXN0cnVjdCByYl9yb290CQljYWxsczsJCS8qIGNhbGxzIG9uIHRoaXMgY29ubmVjdGlvbiAqLworCXN0cnVjdCBza19idWZmX2hlYWQJcnhfcXVldWU7CS8qIHJlY2VpdmVkIGNvbm4tbGV2ZWwgcGFja2V0cyAqLworCXN0cnVjdCByeHJwY19jYWxsCSpjaGFubmVsc1tSWFJQQ19NQVhDQUxMU107IC8qIGNoYW5uZWxzIChhY3RpdmUgY2FsbHMpICovCisJc3RydWN0IHJ4cnBjX3NlY3VyaXR5CSpzZWN1cml0eTsJLyogYXBwbGllZCBzZWN1cml0eSBtb2R1bGUgKi8KKwlzdHJ1Y3Qga2V5CQkqa2V5OwkJLyogc2VjdXJpdHkgZm9yIHRoaXMgY29ubmVjdGlvbiAoY2xpZW50KSAqLworCXN0cnVjdCBrZXkJCSpzZXJ2ZXJfa2V5OwkvKiBzZWN1cml0eSBmb3IgdGhpcyBzZXJ2aWNlICovCisJc3RydWN0IGNyeXB0b19ibGtjaXBoZXIJKmNpcGhlcjsJLyogZW5jcnlwdGlvbiBoYW5kbGUgKi8KKwlzdHJ1Y3QgcnhycGNfY3J5cHQJY3N1bV9pdjsJLyogcGFja2V0IGNoZWNrc3VtIGJhc2UgKi8KKwl1bnNpZ25lZCBsb25nCQlldmVudHM7CisjZGVmaW5lIFJYUlBDX0NPTk5fQ0hBTExFTkdFCTAJCS8qIHNlbmQgY2hhbGxlbmdlIHBhY2tldCAqLworCXRpbWVfdAkJCXB1dF90aW1lOwkvKiB0aW1lIGF0IHdoaWNoIHRvIHJlYXAgKi8KKwlyd2xvY2tfdAkJbG9jazsJCS8qIGFjY2VzcyBsb2NrICovCisJc3BpbmxvY2tfdAkJc3RhdGVfbG9jazsJLyogc3RhdGUtY2hhbmdlIGxvY2sgKi8KKwlhdG9taWNfdAkJdXNhZ2U7CisJdTMyCQkJcmVhbF9jb25uX2lkOwkvKiBjb25uZWN0aW9uIElEIChob3N0LWVuZGlhbikgKi8KKwllbnVtIHsJCQkJCS8qIGN1cnJlbnQgc3RhdGUgb2YgY29ubmVjdGlvbiAqLworCQlSWFJQQ19DT05OX1VOVVNFRCwJCS8qIC0gY29ubmVjdGlvbiBub3QgeWV0IGF0dGVtcHRlZCAqLworCQlSWFJQQ19DT05OX0NMSUVOVCwJCS8qIC0gY2xpZW50IGNvbm5lY3Rpb24gKi8KKwkJUlhSUENfQ09OTl9TRVJWRVJfVU5TRUNVUkVELAkvKiAtIHNlcnZlciB1bnNlY3VyZWQgY29ubmVjdGlvbiAqLworCQlSWFJQQ19DT05OX1NFUlZFUl9DSEFMTEVOR0lORywJLyogLSBzZXJ2ZXIgY2hhbGxlbmdpbmcgZm9yIHNlY3VyaXR5ICovCisJCVJYUlBDX0NPTk5fU0VSVkVSLAkJLyogLSBzZXJ2ZXIgc2VjdXJlZCBjb25uZWN0aW9uICovCisJCVJYUlBDX0NPTk5fUkVNT1RFTFlfQUJPUlRFRCwJLyogLSBjb25uIGFib3J0ZWQgYnkgcGVlciAqLworCQlSWFJQQ19DT05OX0xPQ0FMTFlfQUJPUlRFRCwJLyogLSBjb25uIGFib3J0ZWQgbG9jYWxseSAqLworCQlSWFJQQ19DT05OX05FVFdPUktfRVJST1IsCS8qIC0gY29ubiB0ZXJtaW5hdGVkIGJ5IG5ldHdvcmsgZXJyb3IgKi8KKwl9IHN0YXRlOworCWludAkJCWVycm9yOwkJLyogZXJyb3IgY29kZSBmb3IgbG9jYWwgYWJvcnQgKi8KKwlpbnQJCQlkZWJ1Z19pZDsJLyogZGVidWcgSUQgZm9yIHByaW50a3MgKi8KKwl1bnNpZ25lZAkJY2FsbF9jb3VudGVyOwkvKiBjYWxsIElEIGNvdW50ZXIgKi8KKwlhdG9taWNfdAkJc2VyaWFsOwkJLyogcGFja2V0IHNlcmlhbCBudW1iZXIgY291bnRlciAqLworCWF0b21pY190CQloaV9zZXJpYWw7CS8qIGhpZ2hlc3Qgc2VyaWFsIG51bWJlciByZWNlaXZlZCAqLworCXU4CQkJYXZhaWxfY2FsbHM7CS8qIG51bWJlciBvZiBjYWxscyBhdmFpbGFibGUgKi8KKwl1OAkJCXNpemVfYWxpZ247CS8qIGRhdGEgc2l6ZSBhbGlnbm1lbnQgKGZvciBzZWN1cml0eSkgKi8KKwl1OAkJCWhlYWRlcl9zaXplOwkvKiByeHJwYyArIHNlY3VyaXR5IGhlYWRlciBzaXplICovCisJdTgJCQlzZWN1cml0eV9zaXplOwkvKiBzZWN1cml0eSBoZWFkZXIgc2l6ZSAqLworCXUzMgkJCXNlY3VyaXR5X2xldmVsOwkvKiBzZWN1cml0eSBsZXZlbCBuZWdvdGlhdGVkICovCisJdTMyCQkJc2VjdXJpdHlfbm9uY2U7CS8qIHJlc3BvbnNlIHJlLXVzZSBwcmV2ZW50ZXIgKi8KKworCS8qIHRoZSBmb2xsb3dpbmcgYXJlIGFsbCBpbiBuZXQgb3JkZXIgKi8KKwlfX2JlMzIJCQllcG9jaDsJCS8qIGVwb2NoIG9mIHRoaXMgY29ubmVjdGlvbiAqLworCV9fYmUzMgkJCWNpZDsJCS8qIGNvbm5lY3Rpb24gSUQgKi8KKwlfX2JlMTYJCQlzZXJ2aWNlX2lkOwkvKiBzZXJ2aWNlIElEICovCisJdTgJCQlzZWN1cml0eV9peDsJLyogc2VjdXJpdHkgdHlwZSAqLworCXU4CQkJaW5fY2xpZW50ZmxhZzsJLyogUlhSUENfQ0xJRU5UX0lOSVRJQVRFRCBpZiB3ZSBhcmUgc2VydmVyICovCisJdTgJCQlvdXRfY2xpZW50ZmxhZzsJLyogUlhSUENfQ0xJRU5UX0lOSVRJQVRFRCBpZiB3ZSBhcmUgY2xpZW50ICovCit9OworCisvKgorICogUnhSUEMgY2FsbCBkZWZpbml0aW9uCisgKiAtIG1hdGNoZWQgYnkgeyBjb25uZWN0aW9uLCBjYWxsX2lkIH0KKyAqLworc3RydWN0IHJ4cnBjX2NhbGwgeworCXN0cnVjdCByeHJwY19jb25uZWN0aW9uCSpjb25uOwkJLyogY29ubmVjdGlvbiBjYXJyeWluZyBjYWxsICovCisJc3RydWN0IHJ4cnBjX3NvY2sJKnNvY2tldDsJLyogc29ja2V0IHJlc3BvbnNpYmxlICovCisJc3RydWN0IHRpbWVyX2xpc3QJbGlmZXRpbWVyOwkvKiBsaWZldGltZSByZW1haW5pbmcgb24gY2FsbCAqLworCXN0cnVjdCB0aW1lcl9saXN0CWRlYWRzcGFuOwkvKiByZWFwIHRpbWVyIGZvciByZS1BQ0snaW5nLCBldGMgICovCisJc3RydWN0IHRpbWVyX2xpc3QJYWNrX3RpbWVyOwkvKiBBQ0sgZ2VuZXJhdGlvbiB0aW1lciAqLworCXN0cnVjdCB0aW1lcl9saXN0CXJlc2VuZF90aW1lcjsJLyogVHggcmVzZW5kIHRpbWVyICovCisJc3RydWN0IHdvcmtfc3RydWN0CWRlc3Ryb3llcjsJLyogY2FsbCBkZXN0cm95ZXIgKi8KKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJcHJvY2Vzc29yOwkvKiBwYWNrZXQgcHJvY2Vzc29yIGFuZCBBQ0sgZ2VuZXJhdG9yICovCisJc3RydWN0IGxpc3RfaGVhZAlsaW5rOwkJLyogbGluayBpbiBtYXN0ZXIgY2FsbCBsaXN0ICovCisJc3RydWN0IGxpc3RfaGVhZAllcnJvcl9saW5rOwkvKiBsaW5rIGluIGVycm9yIGRpc3RyaWJ1dGlvbiBsaXN0ICovCisJc3RydWN0IGxpc3RfaGVhZAlhY2NlcHRfbGluazsJLyogY2FsbHMgYXdhaXRpbmcgYWNjZXB0YW5jZSAqLworCXN0cnVjdCByYl9ub2RlCQlzb2NrX25vZGU7CS8qIG5vZGUgaW4gc29ja2V0IGNhbGwgdHJlZSAqLworCXN0cnVjdCByYl9ub2RlCQljb25uX25vZGU7CS8qIG5vZGUgaW4gY29ubmVjdGlvbiBjYWxsIHRyZWUgKi8KKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkCXJ4X3F1ZXVlOwkvKiByZWNlaXZlZCBwYWNrZXRzICovCisJc3RydWN0IHNrX2J1ZmZfaGVhZAlyeF9vb3NfcXVldWU7CS8qIHBhY2tldHMgcmVjZWl2ZWQgb3V0IG9mIHNlcXVlbmNlICovCisJc3RydWN0IHNrX2J1ZmYJCSp0eF9wZW5kaW5nOwkvKiBUeCBzb2NrZXQgYnVmZmVyIGJlaW5nIGZpbGxlZCAqLworCXdhaXRfcXVldWVfaGVhZF90CXR4X3dhaXRxOwkvKiB3YWl0IGZvciBUeCB3aW5kb3cgc3BhY2UgdG8gYmVjb21lIGF2YWlsYWJsZSAqLworCXVuc2lnbmVkIGxvbmcJCXVzZXJfY2FsbF9JRDsJLyogdXNlci1kZWZpbmVkIGNhbGwgSUQgKi8KKwl1bnNpZ25lZCBsb25nCQljcmVhdGlvbl9qaWY7CS8qIHRpbWUgb2YgY2FsbCBjcmVhdGlvbiAqLworCXVuc2lnbmVkIGxvbmcJCWZsYWdzOworI2RlZmluZSBSWFJQQ19DQUxMX1JFTEVBU0VECTAJLyogY2FsbCBoYXMgYmVlbiByZWxlYXNlZCAtIG5vIG1vcmUgbWVzc2FnZSB0byB1c2Vyc3BhY2UgKi8KKyNkZWZpbmUgUlhSUENfQ0FMTF9URVJNSU5BTF9NU0cJMQkvKiBjYWxsIGhhcyBnaXZlbiB0aGUgc29ja2V0IGl0cyBmaW5hbCBtZXNzYWdlICovCisjZGVmaW5lIFJYUlBDX0NBTExfUkNWRF9MQVNUCTIJLyogYWxsIHBhY2tldHMgcmVjZWl2ZWQgKi8KKyNkZWZpbmUgUlhSUENfQ0FMTF9SVU5fUlRJTUVSCTMJLyogVHggcmVzZW5kIHRpbWVyIHN0YXJ0ZWQgKi8KKyNkZWZpbmUgUlhSUENfQ0FMTF9UWF9TT0ZUX0FDSwk0CS8qIHNlbnQgc29tZSBzb2Z0IEFDS3MgKi8KKyNkZWZpbmUgUlhSUENfQ0FMTF9QUk9DX0JVU1kJNQkvKiB0aGUgcHJvY2Vzc29yIGlzIGJ1c3kgKi8KKyNkZWZpbmUgUlhSUENfQ0FMTF9JTklUX0FDQ0VQVAk2CS8qIGFjY2VwdGFuY2Ugd2FzIGluaXRpYXRlZCAqLworI2RlZmluZSBSWFJQQ19DQUxMX0hBU19VU0VSSUQJNwkvKiBoYXMgYSB1c2VyIElEIGF0dGFjaGVkICovCisjZGVmaW5lIFJYUlBDX0NBTExfRVhQRUNUX09PUwk4CS8qIGV4cGVjdCBvdXQgb2Ygc2VxdWVuY2UgcGFja2V0cyAqLworCXVuc2lnbmVkIGxvbmcJCWV2ZW50czsKKyNkZWZpbmUgUlhSUENfQ0FMTF9SQ1ZEX0FDS0FMTAkwCS8qIEFDS0FMTCBvciByZXBseSByZWNlaXZlZCAqLworI2RlZmluZSBSWFJQQ19DQUxMX1JDVkRfQlVTWQkxCS8qIGJ1c3kgcGFja2V0IHJlY2VpdmVkICovCisjZGVmaW5lIFJYUlBDX0NBTExfUkNWRF9BQk9SVAkyCS8qIGFib3J0IHBhY2tldCByZWNlaXZlZCAqLworI2RlZmluZSBSWFJQQ19DQUxMX1JDVkRfRVJST1IJMwkvKiBuZXR3b3JrIGVycm9yIHJlY2VpdmVkICovCisjZGVmaW5lIFJYUlBDX0NBTExfQUNLX0ZJTkFMCTQJLyogbmVlZCB0byBnZW5lcmF0ZSBmaW5hbCBBQ0sgKGFuZCByZWxlYXNlIGNhbGwpICovCisjZGVmaW5lIFJYUlBDX0NBTExfQUNLCQk1CS8qIG5lZWQgdG8gZ2VuZXJhdGUgQUNLICovCisjZGVmaW5lIFJYUlBDX0NBTExfUkVKRUNUX0JVU1kJNgkvKiBuZWVkIHRvIGdlbmVyYXRlIGJ1c3kgbWVzc2FnZSAqLworI2RlZmluZSBSWFJQQ19DQUxMX0FCT1JUCTcJLyogbmVlZCB0byBnZW5lcmF0ZSBhYm9ydCAqLworI2RlZmluZSBSWFJQQ19DQUxMX0NPTk5fQUJPUlQJOAkvKiBsb2NhbCBjb25uZWN0aW9uIGFib3J0IGdlbmVyYXRlZCAqLworI2RlZmluZSBSWFJQQ19DQUxMX1JFU0VORF9USU1FUgk5CS8qIFR4IHJlc2VuZCB0aW1lciBleHBpcmVkICovCisjZGVmaW5lIFJYUlBDX0NBTExfUkVTRU5ECTEwCS8qIFR4IHJlc2VuZCByZXF1aXJlZCAqLworI2RlZmluZSBSWFJQQ19DQUxMX0RSQUlOX1JYX09PUwkxMQkvKiBkcmFpbiB0aGUgUnggb3V0IG9mIHNlcXVlbmNlIHF1ZXVlICovCisjZGVmaW5lIFJYUlBDX0NBTExfTElGRV9USU1FUgkxMgkvKiBjYWxsJ3MgbGlmZXRpbWVyIHJhbiBvdXQgKi8KKyNkZWZpbmUgUlhSUENfQ0FMTF9BQ0NFUFRFRAkxMwkvKiBpbmNvbWluZyBjYWxsIGFjY2VwdGVkIGJ5IHVzZXJzcGFjZSBhcHAgKi8KKyNkZWZpbmUgUlhSUENfQ0FMTF9TRUNVUkVECTE0CS8qIGluY29taW5nIGNhbGwncyBjb25uZWN0aW9uIGlzIG5vdyBzZWN1cmUgKi8KKyNkZWZpbmUgUlhSUENfQ0FMTF9QT1NUX0FDQ0VQVAkxNQkvKiBuZWVkIHRvIHBvc3QgYW4gImFjY2VwdD8iIG1lc3NhZ2UgdG8gdGhlIGFwcCAqLworI2RlZmluZSBSWFJQQ19DQUxMX1JFTEVBU0UJMTYJLyogbmVlZCB0byByZWxlYXNlIHRoZSBjYWxsJ3MgcmVzb3VyY2VzICovCisKKwlzcGlubG9ja190CQlsb2NrOworCXJ3bG9ja190CQlzdGF0ZV9sb2NrOwkvKiBsb2NrIGZvciBzdGF0ZSB0cmFuc2l0aW9uICovCisJYXRvbWljX3QJCXVzYWdlOworCWF0b21pY190CQlzZXF1ZW5jZTsJLyogVHggZGF0YSBwYWNrZXQgc2VxdWVuY2UgY291bnRlciAqLworCXUzMgkJCWFib3J0X2NvZGU7CS8qIGxvY2FsL3JlbW90ZSBhYm9ydCBjb2RlICovCisJZW51bSB7CQkJCQkvKiBjdXJyZW50IHN0YXRlIG9mIGNhbGwgKi8KKwkJUlhSUENfQ0FMTF9DTElFTlRfU0VORF9SRVFVRVNULAkvKiAtIGNsaWVudCBzZW5kaW5nIHJlcXVlc3QgcGhhc2UgKi8KKwkJUlhSUENfQ0FMTF9DTElFTlRfQVdBSVRfUkVQTFksCS8qIC0gY2xpZW50IGF3YWl0aW5nIHJlcGx5ICovCisJCVJYUlBDX0NBTExfQ0xJRU5UX1JFQ1ZfUkVQTFksCS8qIC0gY2xpZW50IHJlY2VpdmluZyByZXBseSBwaGFzZSAqLworCQlSWFJQQ19DQUxMX0NMSUVOVF9GSU5BTF9BQ0ssCS8qIC0gY2xpZW50IHNlbmRpbmcgZmluYWwgQUNLIHBoYXNlICovCisJCVJYUlBDX0NBTExfU0VSVkVSX1NFQ1VSSU5HLAkvKiAtIHNlcnZlciBzZWN1cmluZyByZXF1ZXN0IGNvbm5lY3Rpb24gKi8KKwkJUlhSUENfQ0FMTF9TRVJWRVJfQUNDRVBUSU5HLAkvKiAtIHNlcnZlciBhY2NlcHRpbmcgcmVxdWVzdCAqLworCQlSWFJQQ19DQUxMX1NFUlZFUl9SRUNWX1JFUVVFU1QsCS8qIC0gc2VydmVyIHJlY2VpdmluZyByZXF1ZXN0ICovCisJCVJYUlBDX0NBTExfU0VSVkVSX0FDS19SRVFVRVNULAkvKiAtIHNlcnZlciBwZW5kaW5nIEFDSyBvZiByZXF1ZXN0ICovCisJCVJYUlBDX0NBTExfU0VSVkVSX1NFTkRfUkVQTFksCS8qIC0gc2VydmVyIHNlbmRpbmcgcmVwbHkgKi8KKwkJUlhSUENfQ0FMTF9TRVJWRVJfQVdBSVRfQUNLLAkvKiAtIHNlcnZlciBhd2FpdGluZyBmaW5hbCBBQ0sgKi8KKwkJUlhSUENfQ0FMTF9DT01QTEVURSwJCS8qIC0gY2FsbCBjb21wbGV0ZWQgKi8KKwkJUlhSUENfQ0FMTF9TRVJWRVJfQlVTWSwJCS8qIC0gY2FsbCByZWplY3RlZCBieSBidXN5IHNlcnZlciAqLworCQlSWFJQQ19DQUxMX1JFTU9URUxZX0FCT1JURUQsCS8qIC0gY2FsbCBhYm9ydGVkIGJ5IHBlZXIgKi8KKwkJUlhSUENfQ0FMTF9MT0NBTExZX0FCT1JURUQsCS8qIC0gY2FsbCBhYm9ydGVkIGxvY2FsbHkgb24gZXJyb3Igb3IgY2xvc2UgKi8KKwkJUlhSUENfQ0FMTF9ORVRXT1JLX0VSUk9SLAkvKiAtIGNhbGwgdGVybWluYXRlZCBieSBuZXR3b3JrIGVycm9yICovCisJCVJYUlBDX0NBTExfREVBRCwJCS8qIC0gY2FsbCBpcyBkZWFkICovCisJfSBzdGF0ZTsKKwlpbnQJCQlkZWJ1Z19pZDsJLyogZGVidWcgSUQgZm9yIHByaW50a3MgKi8KKwl1OAkJCWNoYW5uZWw7CS8qIGNvbm5lY3Rpb24gY2hhbm5lbCBvY2N1cGllZCBieSB0aGlzIGNhbGwgKi8KKworCS8qIHRyYW5zbWlzc2lvbi1waGFzZSBBQ0sgbWFuYWdlbWVudCAqLworCXVpbnQ4X3QJCQlhY2tzX2hlYWQ7CS8qIG9mZnNldCBpbnRvIHdpbmRvdyBvZiBmaXJzdCBlbnRyeSAqLworCXVpbnQ4X3QJCQlhY2tzX3RhaWw7CS8qIG9mZnNldCBpbnRvIHdpbmRvdyBvZiBsYXN0IGVudHJ5ICovCisJdWludDhfdAkJCWFja3Nfd2luc3o7CS8qIHNpemUgb2YgdW4tQUNLJ2Qgd2luZG93ICovCisJdWludDhfdAkJCWFja3NfdW5hY2tlZDsJLyogbG93ZXN0IHVuYWNrZWQgcGFja2V0IGluIGxhc3QgQUNLIHJlY2VpdmVkICovCisJaW50CQkJYWNrc19sYXRlc3Q7CS8qIHNlcmlhbCBudW1iZXIgb2YgbGF0ZXN0IEFDSyByZWNlaXZlZCAqLworCXJ4cnBjX3NlcV90CQlhY2tzX2hhcmQ7CS8qIGhpZ2hlc3QgZGVmaW5pdGl2ZWx5IEFDSydkIG1zZyBzZXEgKi8KKwl1bnNpZ25lZCBsb25nCQkqYWNrc193aW5kb3c7CS8qIHNlbnQgcGFja2V0IHdpbmRvdworCQkJCQkJICogLSBlbGVtZW50cyBhcmUgcG9pbnRlcnMgd2l0aCBMU0Igc2V0IGlmIEFDSydkCisJCQkJCQkgKi8KKworCS8qIHJlY2VpdmUtcGhhc2UgQUNLIG1hbmFnZW1lbnQgKi8KKwlyeHJwY19zZXFfdAkJcnhfZGF0YV9leHBlY3Q7CS8qIG5leHQgZGF0YSBzZXEgSUQgZXhwZWN0ZWQgdG8gYmUgcmVjZWl2ZWQgKi8KKwlyeHJwY19zZXFfdAkJcnhfZGF0YV9wb3N0OwkvKiBuZXh0IGRhdGEgc2VxIElEIGV4cGVjdGVkIHRvIGJlIHBvc3RlZCAqLworCXJ4cnBjX3NlcV90CQlyeF9kYXRhX3JlY3Y7CS8qIGxhc3QgZGF0YSBzZXEgSUQgZW5jb3VudGVyZWQgYnkgcmVjdm1zZyAqLworCXJ4cnBjX3NlcV90CQlyeF9kYXRhX2VhdGVuOwkvKiBsYXN0IGRhdGEgc2VxIElEIGNvbnN1bWVkIGJ5IHJlY3Ztc2cgKi8KKwlyeHJwY19zZXFfdAkJcnhfZmlyc3Rfb29zOwkvKiBmaXJzdCBwYWNrZXQgaW4gcnhfb29zX3F1ZXVlIChvciAwKSAqLworCXJ4cnBjX3NlcV90CQlhY2tyX3dpbl90b3A7CS8qIHRvcCBvZiBBQ0sgd2luZG93IChyeF9kYXRhX2VhdGVuIGlzIGJvdHRvbSkgKi8KKwlyeHJwY19zZXFfbmV0X3QJCWFja3JfcHJldl9zZXE7CS8qIHByZXZpb3VzIHNlcXVlbmNlIG51bWJlciByZWNlaXZlZCAqLworCXVpbnQ4X3QJCQlhY2tyX3JlYXNvbjsJLyogcmVhc29uIHRvIEFDSyAqLworCV9fYmUzMgkJCWFja3Jfc2VyaWFsOwkvKiBzZXJpYWwgb2YgcGFja2V0IGJlaW5nIEFDSydkICovCisJYXRvbWljX3QJCWFja3Jfbm90X2lkbGU7CS8qIG51bWJlciBvZiBwYWNrZXRzIGluIFJ4IHF1ZXVlICovCisKKwkvKiByZWNlaXZlZCBwYWNrZXQgcmVjb3JkcywgMSBiaXQgcGVyIHJlY29yZCAqLworI2RlZmluZSBSWFJQQ19BQ0tSX1dJTkRPV19BU1ogRElWX1JPVU5EX1VQKFJYUlBDX01BWEFDS1MsIEJJVFNfUEVSX0xPTkcpCisJdW5zaWduZWQgbG9uZwkJYWNrcl93aW5kb3dbUlhSUENfQUNLUl9XSU5ET1dfQVNaICsgMV07CisKKwkvKiB0aGUgZm9sbG93aW5nIHNob3VsZCBhbGwgYmUgaW4gbmV0IG9yZGVyICovCisJX19iZTMyCQkJY2lkOwkJLyogY29ubmVjdGlvbiBJRCArIGNoYW5uZWwgaW5kZXggICovCisJX19iZTMyCQkJY2FsbF9pZDsJLyogY2FsbCBJRCBvbiBjb25uZWN0aW9uICAqLworfTsKKworLyoKKyAqIFJ4UlBDIGtleSBmb3IgS2VyYmVyb3MgKHR5cGUtMiBzZWN1cml0eSkKKyAqLworc3RydWN0IHJ4a2FkX2tleSB7CisJdTE2CXNlY3VyaXR5X2luZGV4OwkJLyogUnhSUEMgaGVhZGVyIHNlY3VyaXR5IGluZGV4ICovCisJdTE2CXRpY2tldF9sZW47CQkvKiBsZW5ndGggb2YgdGlja2V0W10gKi8KKwl1MzIJZXhwaXJ5OwkJCS8qIHRpbWUgYXQgd2hpY2ggZXhwaXJlcyAqLworCXUzMglrdm5vOwkJCS8qIGtleSB2ZXJzaW9uIG51bWJlciAqLworCXU4CXNlc3Npb25fa2V5WzhdOwkJLyogREVTIHNlc3Npb24ga2V5ICovCisJdTgJdGlja2V0WzBdOwkJLyogdGhlIGVuY3J5cHRlZCB0aWNrZXQgKi8KK307CisKK3N0cnVjdCByeHJwY19rZXlfcGF5bG9hZCB7CisJc3RydWN0IHJ4a2FkX2tleSBrOworfTsKKworLyoKKyAqIGxvY2FsbHkgYWJvcnQgYW4gUnhSUEMgY2FsbAorICovCitzdGF0aWMgaW5saW5lIHZvaWQgcnhycGNfYWJvcnRfY2FsbChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwgdTMyIGFib3J0X2NvZGUpCit7CisJd3JpdGVfbG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7CisJaWYgKGNhbGwtPnN0YXRlIDwgUlhSUENfQ0FMTF9DT01QTEVURSkgeworCQljYWxsLT5hYm9ydF9jb2RlID0gYWJvcnRfY29kZTsKKwkJY2FsbC0+c3RhdGUgPSBSWFJQQ19DQUxMX0xPQ0FMTFlfQUJPUlRFRDsKKwkJc2V0X2JpdChSWFJQQ19DQUxMX0FCT1JULCAmY2FsbC0+ZXZlbnRzKTsKKwl9CisJd3JpdGVfdW5sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKK30KKworLyoKKyAqIGFmX3J4cnBjLmMKKyAqLworZXh0ZXJuIGF0b21pY190IHJ4cnBjX25fc2ticzsKK2V4dGVybiBfX2JlMzIgcnhycGNfZXBvY2g7CitleHRlcm4gYXRvbWljX3QgcnhycGNfZGVidWdfaWQ7CitleHRlcm4gc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKnJ4cnBjX3dvcmtxdWV1ZTsKKworLyoKKyAqIGFyLWFjY2VwdC5jCisgKi8KK2V4dGVybiB2b2lkIHJ4cnBjX2FjY2VwdF9pbmNvbWluZ19jYWxscyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKik7CitleHRlcm4gc3RydWN0IHJ4cnBjX2NhbGwgKnJ4cnBjX2FjY2VwdF9jYWxsKHN0cnVjdCByeHJwY19zb2NrICosCisJCQkJCSAgICB1bnNpZ25lZCBsb25nKTsKK2V4dGVybiBpbnQgcnhycGNfcmVqZWN0X2NhbGwoc3RydWN0IHJ4cnBjX3NvY2sgKik7CisKKy8qCisgKiBhci1hY2suYworICovCitleHRlcm4gdm9pZCBfX3J4cnBjX3Byb3Bvc2VfQUNLKHN0cnVjdCByeHJwY19jYWxsICosIHVpbnQ4X3QsIF9fYmUzMiwgYm9vbCk7CitleHRlcm4gdm9pZCByeHJwY19wcm9wb3NlX0FDSyhzdHJ1Y3QgcnhycGNfY2FsbCAqLCB1aW50OF90LCBfX2JlMzIsIGJvb2wpOworZXh0ZXJuIHZvaWQgcnhycGNfcHJvY2Vzc19jYWxsKHN0cnVjdCB3b3JrX3N0cnVjdCAqKTsKKworLyoKKyAqIGFyLWNhbGwuYworICovCitleHRlcm4gc3RydWN0IGttZW1fY2FjaGUgKnJ4cnBjX2NhbGxfamFyOworZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgcnhycGNfY2FsbHM7CitleHRlcm4gcndsb2NrX3QgcnhycGNfY2FsbF9sb2NrOworCitleHRlcm4gc3RydWN0IHJ4cnBjX2NhbGwgKnJ4cnBjX2dldF9jbGllbnRfY2FsbChzdHJ1Y3QgcnhycGNfc29jayAqLAorCQkJCQkJc3RydWN0IHJ4cnBjX3RyYW5zcG9ydCAqLAorCQkJCQkJc3RydWN0IHJ4cnBjX2Nvbm5fYnVuZGxlICosCisJCQkJCQl1bnNpZ25lZCBsb25nLCBpbnQsIGdmcF90KTsKK2V4dGVybiBzdHJ1Y3QgcnhycGNfY2FsbCAqcnhycGNfaW5jb21pbmdfY2FsbChzdHJ1Y3QgcnhycGNfc29jayAqLAorCQkJCQkgICAgICBzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqLAorCQkJCQkgICAgICBzdHJ1Y3QgcnhycGNfaGVhZGVyICosIGdmcF90KTsKK2V4dGVybiBzdHJ1Y3QgcnhycGNfY2FsbCAqcnhycGNfZmluZF9zZXJ2ZXJfY2FsbChzdHJ1Y3QgcnhycGNfc29jayAqLAorCQkJCQkJIHVuc2lnbmVkIGxvbmcpOworZXh0ZXJuIHZvaWQgcnhycGNfcmVsZWFzZV9jYWxsKHN0cnVjdCByeHJwY19jYWxsICopOworZXh0ZXJuIHZvaWQgcnhycGNfcmVsZWFzZV9jYWxsc19vbl9zb2NrZXQoc3RydWN0IHJ4cnBjX3NvY2sgKik7CitleHRlcm4gdm9pZCBfX3J4cnBjX3B1dF9jYWxsKHN0cnVjdCByeHJwY19jYWxsICopOworZXh0ZXJuIHZvaWQgX19leGl0IHJ4cnBjX2Rlc3Ryb3lfYWxsX2NhbGxzKHZvaWQpOworCisvKgorICogYXItY29ubmVjdGlvbi5jCisgKi8KK2V4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIHJ4cnBjX2Nvbm5lY3Rpb25zOworZXh0ZXJuIHJ3bG9ja190IHJ4cnBjX2Nvbm5lY3Rpb25fbG9jazsKKworZXh0ZXJuIHN0cnVjdCByeHJwY19jb25uX2J1bmRsZSAqcnhycGNfZ2V0X2J1bmRsZShzdHJ1Y3QgcnhycGNfc29jayAqLAorCQkJCQkJICBzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICosCisJCQkJCQkgIHN0cnVjdCBrZXkgKiwKKwkJCQkJCSAgX19iZTE2LCBnZnBfdCk7CitleHRlcm4gdm9pZCByeHJwY19wdXRfYnVuZGxlKHN0cnVjdCByeHJwY190cmFuc3BvcnQgKiwKKwkJCSAgICAgc3RydWN0IHJ4cnBjX2Nvbm5fYnVuZGxlICopOworZXh0ZXJuIGludCByeHJwY19jb25uZWN0X2NhbGwoc3RydWN0IHJ4cnBjX3NvY2sgKiwgc3RydWN0IHJ4cnBjX3RyYW5zcG9ydCAqLAorCQkJICAgICAgc3RydWN0IHJ4cnBjX2Nvbm5fYnVuZGxlICosIHN0cnVjdCByeHJwY19jYWxsICosCisJCQkgICAgICBnZnBfdCk7CitleHRlcm4gdm9pZCByeHJwY19wdXRfY29ubmVjdGlvbihzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqKTsKK2V4dGVybiB2b2lkIF9fZXhpdCByeHJwY19kZXN0cm95X2FsbF9jb25uZWN0aW9ucyh2b2lkKTsKK2V4dGVybiBzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqcnhycGNfZmluZF9jb25uZWN0aW9uKHN0cnVjdCByeHJwY190cmFuc3BvcnQgKiwKKwkJCQkJCSAgICAgIHN0cnVjdCByeHJwY19oZWFkZXIgKik7CitleHRlcm4gc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKgorcnhycGNfaW5jb21pbmdfY29ubmVjdGlvbihzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICosIHN0cnVjdCByeHJwY19oZWFkZXIgKiwKKwkJCSAgZ2ZwX3QpOworCisvKgorICogYXItY29ubmV2ZW50LmMKKyAqLworZXh0ZXJuIHZvaWQgcnhycGNfcHJvY2Vzc19jb25uZWN0aW9uKHN0cnVjdCB3b3JrX3N0cnVjdCAqKTsKK2V4dGVybiB2b2lkIHJ4cnBjX3JlamVjdF9wYWNrZXQoc3RydWN0IHJ4cnBjX2xvY2FsICosIHN0cnVjdCBza19idWZmICopOworZXh0ZXJuIHZvaWQgcnhycGNfcmVqZWN0X3BhY2tldHMoc3RydWN0IHdvcmtfc3RydWN0ICopOworCisvKgorICogYXItZXJyb3IuYworICovCitleHRlcm4gdm9pZCByeHJwY19VRFBfZXJyb3JfcmVwb3J0KHN0cnVjdCBzb2NrICopOworZXh0ZXJuIHZvaWQgcnhycGNfVURQX2Vycm9yX2hhbmRsZXIoc3RydWN0IHdvcmtfc3RydWN0ICopOworCisvKgorICogYXItaW5wdXQuYworICovCitleHRlcm4gdW5zaWduZWQgbG9uZyByeHJwY19hY2tfdGltZW91dDsKK2V4dGVybiBjb25zdCBjaGFyICpyeHJwY19wa3RzW107CisKK2V4dGVybiB2b2lkIHJ4cnBjX2RhdGFfcmVhZHkoc3RydWN0IHNvY2sgKiwgaW50KTsKK2V4dGVybiBpbnQgcnhycGNfcXVldWVfcmN2X3NrYihzdHJ1Y3QgcnhycGNfY2FsbCAqLCBzdHJ1Y3Qgc2tfYnVmZiAqLCBib29sLAorCQkJICAgICAgIGJvb2wpOworZXh0ZXJuIHZvaWQgcnhycGNfZmFzdF9wcm9jZXNzX3BhY2tldChzdHJ1Y3QgcnhycGNfY2FsbCAqLCBzdHJ1Y3Qgc2tfYnVmZiAqKTsKKworLyoKKyAqIGFyLWxvY2FsLmMKKyAqLworZXh0ZXJuIHJ3bG9ja190IHJ4cnBjX2xvY2FsX2xvY2s7CitleHRlcm4gc3RydWN0IHJ4cnBjX2xvY2FsICpyeHJwY19sb29rdXBfbG9jYWwoc3RydWN0IHNvY2thZGRyX3J4cnBjICopOworZXh0ZXJuIHZvaWQgcnhycGNfcHV0X2xvY2FsKHN0cnVjdCByeHJwY19sb2NhbCAqKTsKK2V4dGVybiB2b2lkIF9fZXhpdCByeHJwY19kZXN0cm95X2FsbF9sb2NhbHModm9pZCk7CisKKy8qCisgKiBhci1rZXkuYworICovCitleHRlcm4gc3RydWN0IGtleV90eXBlIGtleV90eXBlX3J4cnBjOworZXh0ZXJuIHN0cnVjdCBrZXlfdHlwZSBrZXlfdHlwZV9yeHJwY19zOworCitleHRlcm4gaW50IHJ4cnBjX3JlcXVlc3Rfa2V5KHN0cnVjdCByeHJwY19zb2NrICosIGNoYXIgX191c2VyICosIGludCk7CitleHRlcm4gaW50IHJ4cnBjX3NlcnZlcl9rZXlyaW5nKHN0cnVjdCByeHJwY19zb2NrICosIGNoYXIgX191c2VyICosIGludCk7CitleHRlcm4gaW50IHJ4cnBjX2dldF9zZXJ2ZXJfZGF0YV9rZXkoc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKiwgY29uc3Qgdm9pZCAqLAorCQkJCSAgICAgdGltZV90LCB1MzIpOworCisvKgorICogYXItb3V0cHV0LmMKKyAqLworZXh0ZXJuIGludCByeHJwY19yZXNlbmRfdGltZW91dDsKKworZXh0ZXJuIGludCByeHJwY19zZW5kX3BhY2tldChzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICosIHN0cnVjdCBza19idWZmICopOworZXh0ZXJuIGludCByeHJwY19jbGllbnRfc2VuZG1zZyhzdHJ1Y3Qga2lvY2IgKiwgc3RydWN0IHJ4cnBjX3NvY2sgKiwKKwkJCQlzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICosIHN0cnVjdCBtc2doZHIgKiwKKwkJCQlzaXplX3QpOworZXh0ZXJuIGludCByeHJwY19zZXJ2ZXJfc2VuZG1zZyhzdHJ1Y3Qga2lvY2IgKiwgc3RydWN0IHJ4cnBjX3NvY2sgKiwKKwkJCQlzdHJ1Y3QgbXNnaGRyICosIHNpemVfdCk7CisKKy8qCisgKiBhci1wZWVyLmMKKyAqLworZXh0ZXJuIHN0cnVjdCByeHJwY19wZWVyICpyeHJwY19nZXRfcGVlcihzdHJ1Y3Qgc29ja2FkZHJfcnhycGMgKiwgZ2ZwX3QpOworZXh0ZXJuIHZvaWQgcnhycGNfcHV0X3BlZXIoc3RydWN0IHJ4cnBjX3BlZXIgKik7CitleHRlcm4gc3RydWN0IHJ4cnBjX3BlZXIgKnJ4cnBjX2ZpbmRfcGVlcihzdHJ1Y3QgcnhycGNfbG9jYWwgKiwKKwkJCQkJICBfX2JlMzIsIF9fYmUxNik7CitleHRlcm4gdm9pZCBfX2V4aXQgcnhycGNfZGVzdHJveV9hbGxfcGVlcnModm9pZCk7CisKKy8qCisgKiBhci1wcm9jLmMKKyAqLworZXh0ZXJuIGNvbnN0IGNoYXIgKnJ4cnBjX2NhbGxfc3RhdGVzW107CitleHRlcm4gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByeHJwY19jYWxsX3NlcV9mb3BzOworZXh0ZXJuIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcnhycGNfY29ubmVjdGlvbl9zZXFfZm9wczsKKworLyoKKyAqIGFyLXJlY3Ztc2cuYworICovCitleHRlcm4gdm9pZCByeHJwY19yZW1vdmVfdXNlcl9JRChzdHJ1Y3QgcnhycGNfc29jayAqLCBzdHJ1Y3QgcnhycGNfY2FsbCAqKTsKK2V4dGVybiBpbnQgcnhycGNfcmVjdm1zZyhzdHJ1Y3Qga2lvY2IgKiwgc3RydWN0IHNvY2tldCAqLCBzdHJ1Y3QgbXNnaGRyICosCisJCQkgc2l6ZV90LCBpbnQpOworCisvKgorICogYXItc2VjdXJpdHkuYworICovCitleHRlcm4gaW50IHJ4cnBjX3JlZ2lzdGVyX3NlY3VyaXR5KHN0cnVjdCByeHJwY19zZWN1cml0eSAqKTsKK2V4dGVybiB2b2lkIHJ4cnBjX3VucmVnaXN0ZXJfc2VjdXJpdHkoc3RydWN0IHJ4cnBjX3NlY3VyaXR5ICopOworZXh0ZXJuIGludCByeHJwY19pbml0X2NsaWVudF9jb25uX3NlY3VyaXR5KHN0cnVjdCByeHJwY19jb25uZWN0aW9uICopOworZXh0ZXJuIGludCByeHJwY19pbml0X3NlcnZlcl9jb25uX3NlY3VyaXR5KHN0cnVjdCByeHJwY19jb25uZWN0aW9uICopOworZXh0ZXJuIGludCByeHJwY19zZWN1cmVfcGFja2V0KGNvbnN0IHN0cnVjdCByeHJwY19jYWxsICosIHN0cnVjdCBza19idWZmICosCisJCQkgICAgICAgc2l6ZV90LCB2b2lkICopOworZXh0ZXJuIGludCByeHJwY192ZXJpZnlfcGFja2V0KGNvbnN0IHN0cnVjdCByeHJwY19jYWxsICosIHN0cnVjdCBza19idWZmICosCisJCQkgICAgICAgdTMyICopOworZXh0ZXJuIHZvaWQgcnhycGNfY2xlYXJfY29ubl9zZWN1cml0eShzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqKTsKKworLyoKKyAqIGFyLXNrYnVmZi5jCisgKi8KK2V4dGVybiB2b2lkIHJ4cnBjX3BhY2tldF9kZXN0cnVjdG9yKHN0cnVjdCBza19idWZmICopOworCisvKgorICogYXItdHJhbnNwb3J0LmMKKyAqLworZXh0ZXJuIHN0cnVjdCByeHJwY190cmFuc3BvcnQgKnJ4cnBjX2dldF90cmFuc3BvcnQoc3RydWN0IHJ4cnBjX2xvY2FsICosCisJCQkJCQkgICBzdHJ1Y3QgcnhycGNfcGVlciAqLAorCQkJCQkJICAgZ2ZwX3QpOworZXh0ZXJuIHZvaWQgcnhycGNfcHV0X3RyYW5zcG9ydChzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICopOworZXh0ZXJuIHZvaWQgX19leGl0IHJ4cnBjX2Rlc3Ryb3lfYWxsX3RyYW5zcG9ydHModm9pZCk7CitleHRlcm4gc3RydWN0IHJ4cnBjX3RyYW5zcG9ydCAqcnhycGNfZmluZF90cmFuc3BvcnQoc3RydWN0IHJ4cnBjX2xvY2FsICosCisJCQkJCQkgICAgc3RydWN0IHJ4cnBjX3BlZXIgKik7CisKKy8qCisgKiBkZWJ1ZyB0cmFjaW5nCisgKi8KK2V4dGVybiB1bnNpZ25lZCByeHJwY19kZWJ1ZzsKKworI2RlZmluZSBkYmdwcmludGsoRk1ULC4uLikgXAorCXByaW50aygiWyV4JS02LjZzXSAiRk1UIlxuIiwgc21wX3Byb2Nlc3Nvcl9pZCgpLCBjdXJyZW50LT5jb21tICwjI19fVkFfQVJHU19fKQorCisvKiBtYWtlIHN1cmUgd2UgbWFpbnRhaW4gdGhlIGZvcm1hdCBzdHJpbmdzLCBldmVuIHdoZW4gZGVidWdnaW5nIGlzIGRpc2FibGVkICovCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsMSwyKSkpCit2b2lkIF9kYnByaW50ayhjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKK30KKworI2RlZmluZSBrZW50ZXIoRk1ULC4uLikJZGJncHJpbnRrKCI9PT4gJXMoIkZNVCIpIixfX0ZVTkNUSU9OX18gLCMjX19WQV9BUkdTX18pCisjZGVmaW5lIGtsZWF2ZShGTVQsLi4uKQlkYmdwcmludGsoIjw9PSAlcygpIkZNVCIiLF9fRlVOQ1RJT05fXyAsIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUga2RlYnVnKEZNVCwuLi4pCWRiZ3ByaW50aygiICAgICJGTVQgLCMjX19WQV9BUkdTX18pCisjZGVmaW5lIGtwcm90byhGTVQsLi4uKQlkYmdwcmludGsoIiMjIyAiRk1UICwjI19fVkFfQVJHU19fKQorI2RlZmluZSBrbmV0KEZNVCwuLi4pCWRiZ3ByaW50aygiQEBAICJGTVQgLCMjX19WQV9BUkdTX18pCisKKworI2lmIGRlZmluZWQoX19LREVCVUcpCisjZGVmaW5lIF9lbnRlcihGTVQsLi4uKQlrZW50ZXIoRk1ULCMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9sZWF2ZShGTVQsLi4uKQlrbGVhdmUoRk1ULCMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9kZWJ1ZyhGTVQsLi4uKQlrZGVidWcoRk1ULCMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9wcm90byhGTVQsLi4uKQlrcHJvdG8oRk1ULCMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9uZXQoRk1ULC4uLikJa25ldChGTVQsIyNfX1ZBX0FSR1NfXykKKworI2VsaWYgZGVmaW5lZChDT05GSUdfQUZfUlhSUENfREVCVUcpCisjZGVmaW5lIFJYUlBDX0RFQlVHX0tFTlRFUgkweDAxCisjZGVmaW5lIFJYUlBDX0RFQlVHX0tMRUFWRQkweDAyCisjZGVmaW5lIFJYUlBDX0RFQlVHX0tERUJVRwkweDA0CisjZGVmaW5lIFJYUlBDX0RFQlVHX0tQUk9UTwkweDA4CisjZGVmaW5lIFJYUlBDX0RFQlVHX0tORVQJMHgxMAorCisjZGVmaW5lIF9lbnRlcihGTVQsLi4uKQkJCQkJXAorZG8gewkJCQkJCQlcCisJaWYgKHVubGlrZWx5KHJ4cnBjX2RlYnVnICYgUlhSUENfREVCVUdfS0VOVEVSKSkJXAorCQlrZW50ZXIoRk1ULCMjX19WQV9BUkdTX18pOwkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBfbGVhdmUoRk1ULC4uLikJCQkJCVwKK2RvIHsJCQkJCQkJXAorCWlmICh1bmxpa2VseShyeHJwY19kZWJ1ZyAmIFJYUlBDX0RFQlVHX0tMRUFWRSkpCVwKKwkJa2xlYXZlKEZNVCwjI19fVkFfQVJHU19fKTsJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgX2RlYnVnKEZNVCwuLi4pCQkJCQlcCitkbyB7CQkJCQkJCVwKKwlpZiAodW5saWtlbHkocnhycGNfZGVidWcgJiBSWFJQQ19ERUJVR19LREVCVUcpKQlcCisJCWtkZWJ1ZyhGTVQsIyNfX1ZBX0FSR1NfXyk7CQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIF9wcm90byhGTVQsLi4uKQkJCQkJXAorZG8gewkJCQkJCQlcCisJaWYgKHVubGlrZWx5KHJ4cnBjX2RlYnVnICYgUlhSUENfREVCVUdfS1BST1RPKSkJXAorCQlrcHJvdG8oRk1ULCMjX19WQV9BUkdTX18pOwkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBfbmV0KEZNVCwuLi4pCQkJCQlcCitkbyB7CQkJCQkJCVwKKwlpZiAodW5saWtlbHkocnhycGNfZGVidWcgJiBSWFJQQ19ERUJVR19LTkVUKSkJXAorCQlrbmV0KEZNVCwjI19fVkFfQVJHU19fKTsJCVwKK30gd2hpbGUgKDApCisKKyNlbHNlCisjZGVmaW5lIF9lbnRlcihGTVQsLi4uKQlfZGJwcmludGsoIj09PiAlcygiRk1UIikiLF9fRlVOQ1RJT05fXyAsIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX2xlYXZlKEZNVCwuLi4pCV9kYnByaW50aygiPD09ICVzKCkiRk1UIiIsX19GVU5DVElPTl9fICwjI19fVkFfQVJHU19fKQorI2RlZmluZSBfZGVidWcoRk1ULC4uLikJX2RicHJpbnRrKCIgICAgIkZNVCAsIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX3Byb3RvKEZNVCwuLi4pCV9kYnByaW50aygiIyMjICJGTVQgLCMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9uZXQoRk1ULC4uLikJX2RicHJpbnRrKCJAQEAgIkZNVCAsIyNfX1ZBX0FSR1NfXykKKyNlbmRpZgorCisvKgorICogZGVidWcgYXNzZXJ0aW9uIGNoZWNraW5nCisgKi8KKyNpZiAxIC8vIGRlZmluZWQoX19LREVCVUdBTEwpCisKKyNkZWZpbmUgQVNTRVJUKFgpCQkJCQkJXAorZG8gewkJCQkJCQkJXAorCWlmICh1bmxpa2VseSghKFgpKSkgewkJCQkJXAorCQlwcmludGsoS0VSTl9FUlIgIlxuIik7CQkJCVwKKwkJcHJpbnRrKEtFUk5fRVJSICJSeFJQQzogQXNzZXJ0aW9uIGZhaWxlZFxuIik7CVwKKwkJQlVHKCk7CQkJCQkJXAorCX0JCQkJCQkJXAorfSB3aGlsZSgwKQorCisjZGVmaW5lIEFTU0VSVENNUChYLCBPUCwgWSkJCQkJCQlcCitkbyB7CQkJCQkJCQkJXAorCWlmICh1bmxpa2VseSghKChYKSBPUCAoWSkpKSkgewkJCQkJXAorCQlwcmludGsoS0VSTl9FUlIgIlxuIik7CQkJCQlcCisJCXByaW50ayhLRVJOX0VSUiAiUnhSUEM6IEFzc2VydGlvbiBmYWlsZWRcbiIpOwkJXAorCQlwcmludGsoS0VSTl9FUlIgIiVsdSAiICNPUCAiICVsdSBpcyBmYWxzZVxuIiwJCVwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nKShYKSwgKHVuc2lnbmVkIGxvbmcpKFkpKTsJCVwKKwkJcHJpbnRrKEtFUk5fRVJSICIweCVseCAiICNPUCAiIDB4JWx4IGlzIGZhbHNlXG4iLAlcCisJCSAgICAgICAodW5zaWduZWQgbG9uZykoWCksICh1bnNpZ25lZCBsb25nKShZKSk7CQlcCisJCUJVRygpOwkJCQkJCQlcCisJfQkJCQkJCQkJXAorfSB3aGlsZSgwKQorCisjZGVmaW5lIEFTU0VSVElGKEMsIFgpCQkJCQkJXAorZG8gewkJCQkJCQkJXAorCWlmICh1bmxpa2VseSgoQykgJiYgIShYKSkpIHsJCQkJXAorCQlwcmludGsoS0VSTl9FUlIgIlxuIik7CQkJCVwKKwkJcHJpbnRrKEtFUk5fRVJSICJSeFJQQzogQXNzZXJ0aW9uIGZhaWxlZFxuIik7CVwKKwkJQlVHKCk7CQkJCQkJXAorCX0JCQkJCQkJXAorfSB3aGlsZSgwKQorCisjZGVmaW5lIEFTU0VSVElGQ01QKEMsIFgsIE9QLCBZKQkJCQkJXAorZG8gewkJCQkJCQkJCVwKKwlpZiAodW5saWtlbHkoKEMpICYmICEoKFgpIE9QIChZKSkpKSB7CQkJCVwKKwkJcHJpbnRrKEtFUk5fRVJSICJcbiIpOwkJCQkJXAorCQlwcmludGsoS0VSTl9FUlIgIlJ4UlBDOiBBc3NlcnRpb24gZmFpbGVkXG4iKTsJCVwKKwkJcHJpbnRrKEtFUk5fRVJSICIlbHUgIiAjT1AgIiAlbHUgaXMgZmFsc2VcbiIsCQlcCisJCSAgICAgICAodW5zaWduZWQgbG9uZykoWCksICh1bnNpZ25lZCBsb25nKShZKSk7CQlcCisJCXByaW50ayhLRVJOX0VSUiAiMHglbHggIiAjT1AgIiAweCVseCBpcyBmYWxzZVxuIiwJXAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpKFgpLCAodW5zaWduZWQgbG9uZykoWSkpOwkJXAorCQlCVUcoKTsJCQkJCQkJXAorCX0JCQkJCQkJCVwKK30gd2hpbGUoMCkKKworI2Vsc2UKKworI2RlZmluZSBBU1NFUlQoWCkJCQkJXAorZG8gewkJCQkJCVwKK30gd2hpbGUoMCkKKworI2RlZmluZSBBU1NFUlRDTVAoWCwgT1AsIFkpCQkJXAorZG8gewkJCQkJCVwKK30gd2hpbGUoMCkKKworI2RlZmluZSBBU1NFUlRJRihDLCBYKQkJCQlcCitkbyB7CQkJCQkJXAorfSB3aGlsZSgwKQorCisjZGVmaW5lIEFTU0VSVElGQ01QKEMsIFgsIE9QLCBZKQkJXAorZG8gewkJCQkJCVwKK30gd2hpbGUoMCkKKworI2VuZGlmIC8qIF9fS0RFQlVHQUxMICovCisKKy8qCisgKiBzb2NrZXQgYnVmZmVyIGFjY291bnRpbmcgLyBsZWFrIGZpbmRpbmcKKyAqLworc3RhdGljIGlubGluZSB2b2lkIF9fcnhycGNfbmV3X3NrYihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBjaGFyICpmbikKK3sKKwkvL19uZXQoIm5ldyBza2IgJXAgJXMgWyVkXSIsIHNrYiwgZm4sIGF0b21pY19yZWFkKCZyeHJwY19uX3NrYnMpKTsKKwkvL2F0b21pY19pbmMoJnJ4cnBjX25fc2ticyk7Cit9CisKKyNkZWZpbmUgcnhycGNfbmV3X3NrYihza2IpIF9fcnhycGNfbmV3X3NrYigoc2tiKSwgX19mdW5jX18pCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3J4cnBjX2tpbGxfc2tiKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IGNoYXIgKmZuKQoreworCS8vX25ldCgia2lsbCBza2IgJXAgJXMgWyVkXSIsIHNrYiwgZm4sIGF0b21pY19yZWFkKCZyeHJwY19uX3NrYnMpKTsKKwkvL2F0b21pY19kZWMoJnJ4cnBjX25fc2ticyk7Cit9CisKKyNkZWZpbmUgcnhycGNfa2lsbF9za2Ioc2tiKSBfX3J4cnBjX2tpbGxfc2tiKChza2IpLCBfX2Z1bmNfXykKKworc3RhdGljIGlubGluZSB2b2lkIF9fcnhycGNfZnJlZV9za2Ioc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3QgY2hhciAqZm4pCit7CisJaWYgKHNrYikgeworCQlDSEVDS19TTEFCX09LQVkoJnNrYi0+dXNlcnMpOworCQkvL19uZXQoImZyZWUgc2tiICVwICVzIFslZF0iLAorCQkvLyAgICAgc2tiLCBmbiwgYXRvbWljX3JlYWQoJnJ4cnBjX25fc2ticykpOworCQkvL2F0b21pY19kZWMoJnJ4cnBjX25fc2ticyk7CisJCWtmcmVlX3NrYihza2IpOworCX0KK30KKworI2RlZmluZSByeHJwY19mcmVlX3NrYihza2IpIF9fcnhycGNfZnJlZV9za2IoKHNrYiksIF9fZnVuY19fKQorCitzdGF0aWMgaW5saW5lIHZvaWQgcnhycGNfcHVyZ2VfcXVldWUoc3RydWN0IHNrX2J1ZmZfaGVhZCAqbGlzdCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoKGxpc3QpKSkgIT0gTlVMTCkKKwkJcnhycGNfZnJlZV9za2Ioc2tiKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9fcnhycGNfZ2V0X2xvY2FsKHN0cnVjdCByeHJwY19sb2NhbCAqbG9jYWwsIGNvbnN0IGNoYXIgKmYpCit7CisJQ0hFQ0tfU0xBQl9PS0FZKCZsb2NhbC0+dXNhZ2UpOworCWlmIChhdG9taWNfaW5jX3JldHVybigmbG9jYWwtPnVzYWdlKSA9PSAxKQorCQlwcmludGsoInJlc3VycmVjdGVkICglcylcbiIsIGYpOworfQorCisjZGVmaW5lIHJ4cnBjX2dldF9sb2NhbChMT0NBTCkgX19yeHJwY19nZXRfbG9jYWwoKExPQ0FMKSwgX19mdW5jX18pCisKKyNkZWZpbmUgcnhycGNfZ2V0X2NhbGwoQ0FMTCkJCQkJXAorZG8gewkJCQkJCQlcCisJQ0hFQ0tfU0xBQl9PS0FZKCYoQ0FMTCktPnVzYWdlKTsJCVwKKwlpZiAoYXRvbWljX2luY19yZXR1cm4oJihDQUxMKS0+dXNhZ2UpID09IDEpCVwKKwkJQlVHKCk7CQkJCQlcCit9IHdoaWxlKDApCisKKyNkZWZpbmUgcnhycGNfcHV0X2NhbGwoQ0FMTCkJCQkJXAorZG8gewkJCQkJCQlcCisJX19yeHJwY19wdXRfY2FsbChDQUxMKTsJCQkJXAorfSB3aGlsZSgwKQpkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL2FyLWtleS5jIGIvbmV0L3J4cnBjL2FyLWtleS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlMDQ5ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvcnhycGMvYXIta2V5LmMKQEAgLTAsMCArMSwzMzQgQEAKKy8qIFJ4UlBDIGtleSBtYW5hZ2VtZW50CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFJ4UlBDIGtleXMgc2hvdWxkIGhhdmUgYSBkZXNjcmlwdGlvbiBvZiBkZXNjcmliaW5nIHRoZWlyIHB1cnBvc2U6CisgKgkiYWZzQENBTUJSSURHRS5SRURIQVQuQ09NPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXkuaD4KKyNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPG5ldC9hZl9yeHJwYy5oPgorI2luY2x1ZGUgPGtleXMvcnhycGMtdHlwZS5oPgorI2luY2x1ZGUgPGtleXMvdXNlci10eXBlLmg+CisjaW5jbHVkZSAiYXItaW50ZXJuYWwuaCIKKworc3RhdGljIGludCByeHJwY19pbnN0YW50aWF0ZShzdHJ1Y3Qga2V5ICosIGNvbnN0IHZvaWQgKiwgc2l6ZV90KTsKK3N0YXRpYyBpbnQgcnhycGNfaW5zdGFudGlhdGVfcyhzdHJ1Y3Qga2V5ICosIGNvbnN0IHZvaWQgKiwgc2l6ZV90KTsKK3N0YXRpYyB2b2lkIHJ4cnBjX2Rlc3Ryb3koc3RydWN0IGtleSAqKTsKK3N0YXRpYyB2b2lkIHJ4cnBjX2Rlc3Ryb3lfcyhzdHJ1Y3Qga2V5ICopOworc3RhdGljIHZvaWQgcnhycGNfZGVzY3JpYmUoY29uc3Qgc3RydWN0IGtleSAqLCBzdHJ1Y3Qgc2VxX2ZpbGUgKik7CisKKy8qCisgKiByeHJwYyBkZWZpbmVkIGtleXMgdGFrZSBhbiBhcmJpdHJhcnkgc3RyaW5nIGFzIHRoZSBkZXNjcmlwdGlvbiBhbmQgYW4KKyAqIGFyYml0cmFyeSBibG9iIG9mIGRhdGEgYXMgdGhlIHBheWxvYWQKKyAqLworc3RydWN0IGtleV90eXBlIGtleV90eXBlX3J4cnBjID0geworCS5uYW1lCQk9ICJyeHJwYyIsCisJLmluc3RhbnRpYXRlCT0gcnhycGNfaW5zdGFudGlhdGUsCisJLm1hdGNoCQk9IHVzZXJfbWF0Y2gsCisJLmRlc3Ryb3kJPSByeHJwY19kZXN0cm95LAorCS5kZXNjcmliZQk9IHJ4cnBjX2Rlc2NyaWJlLAorfTsKKworRVhQT1JUX1NZTUJPTChrZXlfdHlwZV9yeHJwYyk7CisKKy8qCisgKiByeHJwYyBzZXJ2ZXIgZGVmaW5lZCBrZXlzIHRha2UgIjxzZXJ2aWNlSWQ+OjxzZWN1cml0eUluZGV4PiIgYXMgdGhlCisgKiBkZXNjcmlwdGlvbiBhbmQgYW4gOC1ieXRlIGRlY3J5cHRpb24ga2V5IGFzIHRoZSBwYXlsb2FkCisgKi8KK3N0cnVjdCBrZXlfdHlwZSBrZXlfdHlwZV9yeHJwY19zID0geworCS5uYW1lCQk9ICJyeHJwY19zIiwKKwkuaW5zdGFudGlhdGUJPSByeHJwY19pbnN0YW50aWF0ZV9zLAorCS5tYXRjaAkJPSB1c2VyX21hdGNoLAorCS5kZXN0cm95CT0gcnhycGNfZGVzdHJveV9zLAorCS5kZXNjcmliZQk9IHJ4cnBjX2Rlc2NyaWJlLAorfTsKKworLyoKKyAqIGluc3RhbnRpYXRlIGFuIHJ4cnBjIGRlZmluZWQga2V5CisgKiBkYXRhIHNob3VsZCBiZSBvZiB0aGUgZm9ybToKKyAqCU9GRlNFVAlMRU4JQ09OVEVOVAorICoJMAk0CWtleSBpbnRlcmZhY2UgdmVyc2lvbiBudW1iZXIKKyAqCTQJMglzZWN1cml0eSBpbmRleCAodHlwZSkKKyAqCTYJMgl0aWNrZXQgbGVuZ3RoCisgKgk4CTQJa2V5IGV4cGlyeSB0aW1lICh0aW1lX3QpCisgKgkxMgk0CWt2bm8KKyAqCTE2CTgJc2Vzc2lvbiBrZXkKKyAqCTI0CVtsZW5dCXRpY2tldAorICoKKyAqIGlmIG5vIGRhdGEgaXMgcHJvdmlkZWQsIHRoZW4gYSBuby1zZWN1cml0eSBrZXkgaXMgbWFkZQorICovCitzdGF0aWMgaW50IHJ4cnBjX2luc3RhbnRpYXRlKHN0cnVjdCBrZXkgKmtleSwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGRhdGFsZW4pCit7CisJY29uc3Qgc3RydWN0IHJ4a2FkX2tleSAqdHNlYzsKKwlzdHJ1Y3QgcnhycGNfa2V5X3BheWxvYWQgKnVwYXlsb2FkOworCXNpemVfdCBwbGVuOworCXUzMiBrdmVyOworCWludCByZXQ7CisKKwlfZW50ZXIoInsleH0sLCV6dSIsIGtleV9zZXJpYWwoa2V5KSwgZGF0YWxlbik7CisKKwkvKiBoYW5kbGUgYSBuby1zZWN1cml0eSBrZXkgKi8KKwlpZiAoIWRhdGEgJiYgZGF0YWxlbiA9PSAwKQorCQlyZXR1cm4gMDsKKworCS8qIGdldCB0aGUga2V5IGludGVyZmFjZSB2ZXJzaW9uIG51bWJlciAqLworCXJldCA9IC1FSU5WQUw7CisJaWYgKGRhdGFsZW4gPD0gNCB8fCAhZGF0YSkKKwkJZ290byBlcnJvcjsKKwltZW1jcHkoJmt2ZXIsIGRhdGEsIHNpemVvZihrdmVyKSk7CisJZGF0YSArPSBzaXplb2Yoa3Zlcik7CisJZGF0YWxlbiAtPSBzaXplb2Yoa3Zlcik7CisKKwlfZGVidWcoIktFWSBJL0YgVkVSU0lPTjogJXUiLCBrdmVyKTsKKworCXJldCA9IC1FS0VZUkVKRUNURUQ7CisJaWYgKGt2ZXIgIT0gMSkKKwkJZ290byBlcnJvcjsKKworCS8qIGRlYWwgd2l0aCBhIHZlcnNpb24gMSBrZXkgKi8KKwlyZXQgPSAtRUlOVkFMOworCWlmIChkYXRhbGVuIDwgc2l6ZW9mKCp0c2VjKSkKKwkJZ290byBlcnJvcjsKKworCXRzZWMgPSBkYXRhOworCWlmIChkYXRhbGVuICE9IHNpemVvZigqdHNlYykgKyB0c2VjLT50aWNrZXRfbGVuKQorCQlnb3RvIGVycm9yOworCisJX2RlYnVnKCJTQ0lYOiAldSIsIHRzZWMtPnNlY3VyaXR5X2luZGV4KTsKKwlfZGVidWcoIlRMRU46ICV1IiwgdHNlYy0+dGlja2V0X2xlbik7CisJX2RlYnVnKCJFWFBZOiAleCIsIHRzZWMtPmV4cGlyeSk7CisJX2RlYnVnKCJLVk5POiAldSIsIHRzZWMtPmt2bm8pOworCV9kZWJ1ZygiU0tFWTogJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMngiLAorCSAgICAgICB0c2VjLT5zZXNzaW9uX2tleVswXSwgdHNlYy0+c2Vzc2lvbl9rZXlbMV0sCisJICAgICAgIHRzZWMtPnNlc3Npb25fa2V5WzJdLCB0c2VjLT5zZXNzaW9uX2tleVszXSwKKwkgICAgICAgdHNlYy0+c2Vzc2lvbl9rZXlbNF0sIHRzZWMtPnNlc3Npb25fa2V5WzVdLAorCSAgICAgICB0c2VjLT5zZXNzaW9uX2tleVs2XSwgdHNlYy0+c2Vzc2lvbl9rZXlbN10pOworCWlmICh0c2VjLT50aWNrZXRfbGVuID49IDgpCisJCV9kZWJ1ZygiVENLVDogJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMngiLAorCQkgICAgICAgdHNlYy0+dGlja2V0WzBdLCB0c2VjLT50aWNrZXRbMV0sCisJCSAgICAgICB0c2VjLT50aWNrZXRbMl0sIHRzZWMtPnRpY2tldFszXSwKKwkJICAgICAgIHRzZWMtPnRpY2tldFs0XSwgdHNlYy0+dGlja2V0WzVdLAorCQkgICAgICAgdHNlYy0+dGlja2V0WzZdLCB0c2VjLT50aWNrZXRbN10pOworCisJcmV0ID0gLUVQUk9UT05PU1VQUE9SVDsKKwlpZiAodHNlYy0+c2VjdXJpdHlfaW5kZXggIT0gMikKKwkJZ290byBlcnJvcjsKKworCWtleS0+dHlwZV9kYXRhLnhbMF0gPSB0c2VjLT5zZWN1cml0eV9pbmRleDsKKworCXBsZW4gPSBzaXplb2YoKnVwYXlsb2FkKSArIHRzZWMtPnRpY2tldF9sZW47CisJcmV0ID0ga2V5X3BheWxvYWRfcmVzZXJ2ZShrZXksIHBsZW4pOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yOworCisJcmV0ID0gLUVOT01FTTsKKwl1cGF5bG9hZCA9IGttYWxsb2MocGxlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKCF1cGF5bG9hZCkKKwkJZ290byBlcnJvcjsKKworCS8qIGF0dGFjaCB0aGUgZGF0YSAqLworCW1lbWNweSgmdXBheWxvYWQtPmssIHRzZWMsIHNpemVvZigqdHNlYykpOworCW1lbWNweSgmdXBheWxvYWQtPmsudGlja2V0LCAodm9pZCAqKXRzZWMgKyBzaXplb2YoKnRzZWMpLAorCSAgICAgICB0c2VjLT50aWNrZXRfbGVuKTsKKwlrZXktPnBheWxvYWQuZGF0YSA9IHVwYXlsb2FkOworCWtleS0+ZXhwaXJ5ID0gdHNlYy0+ZXhwaXJ5OworCXJldCA9IDA7CisKK2Vycm9yOgorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBpbnN0YW50aWF0ZSBhIHNlcnZlciBzZWNyZXQga2V5CisgKiBkYXRhIHNob3VsZCBiZSBhIHBvaW50ZXIgdG8gdGhlIDgtYnl0ZSBzZWNyZXQga2V5CisgKi8KK3N0YXRpYyBpbnQgcnhycGNfaW5zdGFudGlhdGVfcyhzdHJ1Y3Qga2V5ICprZXksIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkgICAgICAgc2l6ZV90IGRhdGFsZW4pCit7CisJc3RydWN0IGNyeXB0b19ibGtjaXBoZXIgKmNpOworCisJX2VudGVyKCJ7JXh9LCwlenUiLCBrZXlfc2VyaWFsKGtleSksIGRhdGFsZW4pOworCisJaWYgKGRhdGFsZW4gIT0gOCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltZW1jcHkoJmtleS0+dHlwZV9kYXRhLCBkYXRhLCA4KTsKKworCWNpID0gY3J5cHRvX2FsbG9jX2Jsa2NpcGhlcigicGNiYyhkZXMpIiwgMCwgQ1JZUFRPX0FMR19BU1lOQyk7CisJaWYgKElTX0VSUihjaSkpIHsKKwkJX2xlYXZlKCIgPSAlbGQiLCBQVFJfRVJSKGNpKSk7CisJCXJldHVybiBQVFJfRVJSKGNpKTsKKwl9CisKKwlpZiAoY3J5cHRvX2Jsa2NpcGhlcl9zZXRrZXkoY2ksIGRhdGEsIDgpIDwgMCkKKwkJQlVHKCk7CisKKwlrZXktPnBheWxvYWQuZGF0YSA9IGNpOworCV9sZWF2ZSgiID0gMCIpOworCXJldHVybiAwOworfQorCisvKgorICogZGlzcG9zZSBvZiB0aGUgZGF0YSBkYW5nbGluZyBmcm9tIHRoZSBjb3Jwc2Ugb2YgYSByeHJwYyBrZXkKKyAqLworc3RhdGljIHZvaWQgcnhycGNfZGVzdHJveShzdHJ1Y3Qga2V5ICprZXkpCit7CisJa2ZyZWUoa2V5LT5wYXlsb2FkLmRhdGEpOworfQorCisvKgorICogZGlzcG9zZSBvZiB0aGUgZGF0YSBkYW5nbGluZyBmcm9tIHRoZSBjb3Jwc2Ugb2YgYSByeHJwYyBrZXkKKyAqLworc3RhdGljIHZvaWQgcnhycGNfZGVzdHJveV9zKHN0cnVjdCBrZXkgKmtleSkKK3sKKwlpZiAoa2V5LT5wYXlsb2FkLmRhdGEpIHsKKwkJY3J5cHRvX2ZyZWVfYmxrY2lwaGVyKGtleS0+cGF5bG9hZC5kYXRhKTsKKwkJa2V5LT5wYXlsb2FkLmRhdGEgPSBOVUxMOworCX0KK30KKworLyoKKyAqIGRlc2NyaWJlIHRoZSByeHJwYyBrZXkKKyAqLworc3RhdGljIHZvaWQgcnhycGNfZGVzY3JpYmUoY29uc3Qgc3RydWN0IGtleSAqa2V5LCBzdHJ1Y3Qgc2VxX2ZpbGUgKm0pCit7CisJc2VxX3B1dHMobSwga2V5LT5kZXNjcmlwdGlvbik7Cit9CisKKy8qCisgKiBncmFiIHRoZSBzZWN1cml0eSBrZXkgZm9yIGEgc29ja2V0CisgKi8KK2ludCByeHJwY19yZXF1ZXN0X2tleShzdHJ1Y3QgcnhycGNfc29jayAqcngsIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBvcHRsZW4pCit7CisJc3RydWN0IGtleSAqa2V5OworCWNoYXIgKmRlc2NyaXB0aW9uOworCisJX2VudGVyKCIiKTsKKworCWlmIChvcHRsZW4gPD0gMCB8fCBvcHRsZW4gPiBQQUdFX1NJWkUgLSAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRlc2NyaXB0aW9uID0ga21hbGxvYyhvcHRsZW4gKyAxLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRlc2NyaXB0aW9uKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChjb3B5X2Zyb21fdXNlcihkZXNjcmlwdGlvbiwgb3B0dmFsLCBvcHRsZW4pKSB7CisJCWtmcmVlKGRlc2NyaXB0aW9uKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCWRlc2NyaXB0aW9uW29wdGxlbl0gPSAwOworCisJa2V5ID0gcmVxdWVzdF9rZXkoJmtleV90eXBlX3J4cnBjLCBkZXNjcmlwdGlvbiwgTlVMTCk7CisJaWYgKElTX0VSUihrZXkpKSB7CisJCWtmcmVlKGRlc2NyaXB0aW9uKTsKKwkJX2xlYXZlKCIgPSAlbGQiLCBQVFJfRVJSKGtleSkpOworCQlyZXR1cm4gUFRSX0VSUihrZXkpOworCX0KKworCXJ4LT5rZXkgPSBrZXk7CisJa2ZyZWUoZGVzY3JpcHRpb24pOworCV9sZWF2ZSgiID0gMCBba2V5ICV4XSIsIGtleS0+c2VyaWFsKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGdyYWIgdGhlIHNlY3VyaXR5IGtleXJpbmcgZm9yIGEgc2VydmVyIHNvY2tldAorICovCitpbnQgcnhycGNfc2VydmVyX2tleXJpbmcoc3RydWN0IHJ4cnBjX3NvY2sgKnJ4LCBjaGFyIF9fdXNlciAqb3B0dmFsLAorCQkJIGludCBvcHRsZW4pCit7CisJc3RydWN0IGtleSAqa2V5OworCWNoYXIgKmRlc2NyaXB0aW9uOworCisJX2VudGVyKCIiKTsKKworCWlmIChvcHRsZW4gPD0gMCB8fCBvcHRsZW4gPiBQQUdFX1NJWkUgLSAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRlc2NyaXB0aW9uID0ga21hbGxvYyhvcHRsZW4gKyAxLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRlc2NyaXB0aW9uKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChjb3B5X2Zyb21fdXNlcihkZXNjcmlwdGlvbiwgb3B0dmFsLCBvcHRsZW4pKSB7CisJCWtmcmVlKGRlc2NyaXB0aW9uKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCWRlc2NyaXB0aW9uW29wdGxlbl0gPSAwOworCisJa2V5ID0gcmVxdWVzdF9rZXkoJmtleV90eXBlX2tleXJpbmcsIGRlc2NyaXB0aW9uLCBOVUxMKTsKKwlpZiAoSVNfRVJSKGtleSkpIHsKKwkJa2ZyZWUoZGVzY3JpcHRpb24pOworCQlfbGVhdmUoIiA9ICVsZCIsIFBUUl9FUlIoa2V5KSk7CisJCXJldHVybiBQVFJfRVJSKGtleSk7CisJfQorCisJcngtPnNlY3VyaXRpZXMgPSBrZXk7CisJa2ZyZWUoZGVzY3JpcHRpb24pOworCV9sZWF2ZSgiID0gMCBba2V5ICV4XSIsIGtleS0+c2VyaWFsKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGdlbmVyYXRlIGEgc2VydmVyIGRhdGEga2V5CisgKi8KK2ludCByeHJwY19nZXRfc2VydmVyX2RhdGFfa2V5KHN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uLAorCQkJICAgICAgY29uc3Qgdm9pZCAqc2Vzc2lvbl9rZXksCisJCQkgICAgICB0aW1lX3QgZXhwaXJ5LAorCQkJICAgICAgdTMyIGt2bm8pCit7CisJc3RydWN0IGtleSAqa2V5OworCWludCByZXQ7CisKKwlzdHJ1Y3QgeworCQl1MzIga3ZlcjsKKwkJc3RydWN0IHJ4a2FkX2tleSB0c2VjOworCX0gZGF0YTsKKworCV9lbnRlcigiIik7CisKKwlrZXkgPSBrZXlfYWxsb2MoJmtleV90eXBlX3J4cnBjLCAieCIsIDAsIDAsIGN1cnJlbnQsIDAsCisJCQlLRVlfQUxMT0NfTk9UX0lOX1FVT1RBKTsKKwlpZiAoSVNfRVJSKGtleSkpIHsKKwkJX2xlYXZlKCIgPSAtRU5PTUVNIFthbGxvYyAlbGRdIiwgUFRSX0VSUihrZXkpKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJX2RlYnVnKCJrZXkgJWQiLCBrZXlfc2VyaWFsKGtleSkpOworCisJZGF0YS5rdmVyID0gMTsKKwlkYXRhLnRzZWMuc2VjdXJpdHlfaW5kZXggPSAyOworCWRhdGEudHNlYy50aWNrZXRfbGVuID0gMDsKKwlkYXRhLnRzZWMuZXhwaXJ5ID0gZXhwaXJ5OworCWRhdGEudHNlYy5rdm5vID0gMDsKKworCW1lbWNweSgmZGF0YS50c2VjLnNlc3Npb25fa2V5LCBzZXNzaW9uX2tleSwKKwkgICAgICAgc2l6ZW9mKGRhdGEudHNlYy5zZXNzaW9uX2tleSkpOworCisJcmV0ID0ga2V5X2luc3RhbnRpYXRlX2FuZF9saW5rKGtleSwgJmRhdGEsIHNpemVvZihkYXRhKSwgTlVMTCwgTlVMTCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyb3I7CisKKwljb25uLT5rZXkgPSBrZXk7CisJX2xlYXZlKCIgPSAwIFslZF0iLCBrZXlfc2VyaWFsKGtleSkpOworCXJldHVybiAwOworCitlcnJvcjoKKwlrZXlfcmV2b2tlKGtleSk7CisJa2V5X3B1dChrZXkpOworCV9sZWF2ZSgiID0gLUVOT01FTSBbaW5zICVkXSIsIHJldCk7CisJcmV0dXJuIC1FTk9NRU07Cit9CisKK0VYUE9SVF9TWU1CT0wocnhycGNfZ2V0X3NlcnZlcl9kYXRhX2tleSk7CmRpZmYgLS1naXQgYS9uZXQvcnhycGMvYXItbG9jYWwuYyBiL25ldC9yeHJwYy9hci1sb2NhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMDNmNzEKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvcnhycGMvYXItbG9jYWwuYwpAQCAtMCwwICsxLDMwOSBAQAorLyogQUZfUlhSUEMgbG9jYWwgZW5kcG9pbnQgbWFuYWdlbWVudAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxuZXQvYWZfcnhycGMuaD4KKyNpbmNsdWRlICJhci1pbnRlcm5hbC5oIgorCitzdGF0aWMgTElTVF9IRUFEKHJ4cnBjX2xvY2Fscyk7CitERUZJTkVfUldMT0NLKHJ4cnBjX2xvY2FsX2xvY2spOworc3RhdGljIERFQ0xBUkVfUldTRU0ocnhycGNfbG9jYWxfc2VtKTsKK3N0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChyeHJwY19sb2NhbF93cSk7CisKK3N0YXRpYyB2b2lkIHJ4cnBjX2Rlc3Ryb3lfbG9jYWwoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKKworLyoKKyAqIGFsbG9jYXRlIGEgbmV3IGxvY2FsCisgKi8KK3N0YXRpYworc3RydWN0IHJ4cnBjX2xvY2FsICpyeHJwY19hbGxvY19sb2NhbChzdHJ1Y3Qgc29ja2FkZHJfcnhycGMgKnNyeCkKK3sKKwlzdHJ1Y3QgcnhycGNfbG9jYWwgKmxvY2FsOworCisJbG9jYWwgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcnhycGNfbG9jYWwpLCBHRlBfS0VSTkVMKTsKKwlpZiAobG9jYWwpIHsKKwkJSU5JVF9XT1JLKCZsb2NhbC0+ZGVzdHJveWVyLCAmcnhycGNfZGVzdHJveV9sb2NhbCk7CisJCUlOSVRfV09SSygmbG9jYWwtPmFjY2VwdG9yLCAmcnhycGNfYWNjZXB0X2luY29taW5nX2NhbGxzKTsKKwkJSU5JVF9XT1JLKCZsb2NhbC0+cmVqZWN0ZXIsICZyeHJwY19yZWplY3RfcGFja2V0cyk7CisJCUlOSVRfTElTVF9IRUFEKCZsb2NhbC0+c2VydmljZXMpOworCQlJTklUX0xJU1RfSEVBRCgmbG9jYWwtPmxpbmspOworCQlpbml0X3J3c2VtKCZsb2NhbC0+ZGVmcmFnX3NlbSk7CisJCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmxvY2FsLT5hY2NlcHRfcXVldWUpOworCQlza2JfcXVldWVfaGVhZF9pbml0KCZsb2NhbC0+cmVqZWN0X3F1ZXVlKTsKKwkJc3Bpbl9sb2NrX2luaXQoJmxvY2FsLT5sb2NrKTsKKwkJcndsb2NrX2luaXQoJmxvY2FsLT5zZXJ2aWNlc19sb2NrKTsKKwkJYXRvbWljX3NldCgmbG9jYWwtPnVzYWdlLCAxKTsKKwkJbG9jYWwtPmRlYnVnX2lkID0gYXRvbWljX2luY19yZXR1cm4oJnJ4cnBjX2RlYnVnX2lkKTsKKwkJbWVtY3B5KCZsb2NhbC0+c3J4LCBzcngsIHNpemVvZigqc3J4KSk7CisJfQorCisJX2xlYXZlKCIgPSAlcCIsIGxvY2FsKTsKKwlyZXR1cm4gbG9jYWw7Cit9CisKKy8qCisgKiBjcmVhdGUgdGhlIGxvY2FsIHNvY2tldAorICogLSBtdXN0IGJlIGNhbGxlZCB3aXRoIHJ4cnBjX2xvY2FsX3NlbSB3cml0ZWxvY2tlZAorICovCitzdGF0aWMgaW50IHJ4cnBjX2NyZWF0ZV9sb2NhbChzdHJ1Y3QgcnhycGNfbG9jYWwgKmxvY2FsKQoreworCXN0cnVjdCBzb2NrICpzb2NrOworCWludCByZXQsIG9wdDsKKworCV9lbnRlcigiJXB7JWR9IiwgbG9jYWwsIGxvY2FsLT5zcngudHJhbnNwb3J0X3R5cGUpOworCisJLyogY3JlYXRlIGEgc29ja2V0IHRvIHJlcHJlc2VudCB0aGUgbG9jYWwgZW5kcG9pbnQgKi8KKwlyZXQgPSBzb2NrX2NyZWF0ZV9rZXJuKFBGX0lORVQsIGxvY2FsLT5zcngudHJhbnNwb3J0X3R5cGUsIElQUFJPVE9fVURQLAorCQkJICAgICAgICZsb2NhbC0+c29ja2V0KTsKKwlpZiAocmV0IDwgMCkgeworCQlfbGVhdmUoIiA9ICVkIFtzb2NrZXRdIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBpZiBhIGxvY2FsIGFkZHJlc3Mgd2FzIHN1cHBsaWVkIHRoZW4gYmluZCBpdCAqLworCWlmIChsb2NhbC0+c3J4LnRyYW5zcG9ydF9sZW4gPiBzaXplb2Yoc2FfZmFtaWx5X3QpKSB7CisJCV9kZWJ1ZygiYmluZCIpOworCQlyZXQgPSBrZXJuZWxfYmluZChsb2NhbC0+c29ja2V0LAorCQkJCSAgKHN0cnVjdCBzb2NrYWRkciAqKSAmbG9jYWwtPnNyeC50cmFuc3BvcnQsCisJCQkJICBsb2NhbC0+c3J4LnRyYW5zcG9ydF9sZW4pOworCQlpZiAocmV0IDwgMCkgeworCQkJX2RlYnVnKCJiaW5kIGZhaWxlZCIpOworCQkJZ290byBlcnJvcjsKKwkJfQorCX0KKworCS8qIHdlIHdhbnQgdG8gcmVjZWl2ZSBJQ01QIGVycm9ycyAqLworCW9wdCA9IDE7CisJcmV0ID0ga2VybmVsX3NldHNvY2tvcHQobG9jYWwtPnNvY2tldCwgU09MX0lQLCBJUF9SRUNWRVJSLAorCQkJCShjaGFyICopICZvcHQsIHNpemVvZihvcHQpKTsKKwlpZiAocmV0IDwgMCkgeworCQlfZGVidWcoInNldHNvY2tvcHQgZmFpbGVkIik7CisJCWdvdG8gZXJyb3I7CisJfQorCisJLyogd2Ugd2FudCB0byBzZXQgdGhlIGRvbid0IGZyYWdtZW50IGJpdCAqLworCW9wdCA9IElQX1BNVFVESVNDX0RPOworCXJldCA9IGtlcm5lbF9zZXRzb2Nrb3B0KGxvY2FsLT5zb2NrZXQsIFNPTF9JUCwgSVBfTVRVX0RJU0NPVkVSLAorCQkJCShjaGFyICopICZvcHQsIHNpemVvZihvcHQpKTsKKwlpZiAocmV0IDwgMCkgeworCQlfZGVidWcoInNldHNvY2tvcHQgZmFpbGVkIik7CisJCWdvdG8gZXJyb3I7CisJfQorCisJd3JpdGVfbG9ja19iaCgmcnhycGNfbG9jYWxfbG9jayk7CisJbGlzdF9hZGQoJmxvY2FsLT5saW5rLCAmcnhycGNfbG9jYWxzKTsKKwl3cml0ZV91bmxvY2tfYmgoJnJ4cnBjX2xvY2FsX2xvY2spOworCisJLyogc2V0IHRoZSBzb2NrZXQgdXAgKi8KKwlzb2NrID0gbG9jYWwtPnNvY2tldC0+c2s7CisJc29jay0+c2tfdXNlcl9kYXRhCT0gbG9jYWw7CisJc29jay0+c2tfZGF0YV9yZWFkeQk9IHJ4cnBjX2RhdGFfcmVhZHk7CisJc29jay0+c2tfZXJyb3JfcmVwb3J0CT0gcnhycGNfVURQX2Vycm9yX3JlcG9ydDsKKwlfbGVhdmUoIiA9IDAiKTsKKwlyZXR1cm4gMDsKKworZXJyb3I6CisJbG9jYWwtPnNvY2tldC0+b3BzLT5zaHV0ZG93bihsb2NhbC0+c29ja2V0LCAyKTsKKwlsb2NhbC0+c29ja2V0LT5zay0+c2tfdXNlcl9kYXRhID0gTlVMTDsKKwlzb2NrX3JlbGVhc2UobG9jYWwtPnNvY2tldCk7CisJbG9jYWwtPnNvY2tldCA9IE5VTEw7CisKKwlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogY3JlYXRlIGEgbmV3IGxvY2FsIGVuZHBvaW50IHVzaW5nIHRoZSBzcGVjaWZpZWQgVURQIGFkZHJlc3MKKyAqLworc3RydWN0IHJ4cnBjX2xvY2FsICpyeHJwY19sb29rdXBfbG9jYWwoc3RydWN0IHNvY2thZGRyX3J4cnBjICpzcngpCit7CisJc3RydWN0IHJ4cnBjX2xvY2FsICpsb2NhbDsKKwlpbnQgcmV0OworCisJX2VudGVyKCJ7JWQsJXUsJXUuJXUuJXUuJXUrJWh1fSIsCisJICAgICAgIHNyeC0+dHJhbnNwb3J0X3R5cGUsCisJICAgICAgIHNyeC0+dHJhbnNwb3J0LmZhbWlseSwKKwkgICAgICAgTklQUVVBRChzcngtPnRyYW5zcG9ydC5zaW4uc2luX2FkZHIpLAorCSAgICAgICBudG9ocyhzcngtPnRyYW5zcG9ydC5zaW4uc2luX3BvcnQpKTsKKworCWRvd25fd3JpdGUoJnJ4cnBjX2xvY2FsX3NlbSk7CisKKwkvKiBzZWUgaWYgd2UgaGF2ZSBhIHN1aXRhYmxlIGxvY2FsIGxvY2FsIGVuZHBvaW50IGFscmVhZHkgKi8KKwlyZWFkX2xvY2tfYmgoJnJ4cnBjX2xvY2FsX2xvY2spOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShsb2NhbCwgJnJ4cnBjX2xvY2FscywgbGluaykgeworCQlfZGVidWcoIkNNUCB7JWQsJXUsJXUuJXUuJXUuJXUrJWh1fSIsCisJCSAgICAgICBsb2NhbC0+c3J4LnRyYW5zcG9ydF90eXBlLAorCQkgICAgICAgbG9jYWwtPnNyeC50cmFuc3BvcnQuZmFtaWx5LAorCQkgICAgICAgTklQUVVBRChsb2NhbC0+c3J4LnRyYW5zcG9ydC5zaW4uc2luX2FkZHIpLAorCQkgICAgICAgbnRvaHMobG9jYWwtPnNyeC50cmFuc3BvcnQuc2luLnNpbl9wb3J0KSk7CisKKwkJaWYgKGxvY2FsLT5zcngudHJhbnNwb3J0X3R5cGUgIT0gc3J4LT50cmFuc3BvcnRfdHlwZSB8fAorCQkgICAgbG9jYWwtPnNyeC50cmFuc3BvcnQuZmFtaWx5ICE9IHNyeC0+dHJhbnNwb3J0LmZhbWlseSkKKwkJCWNvbnRpbnVlOworCisJCXN3aXRjaCAoc3J4LT50cmFuc3BvcnQuZmFtaWx5KSB7CisJCWNhc2UgQUZfSU5FVDoKKwkJCWlmIChsb2NhbC0+c3J4LnRyYW5zcG9ydC5zaW4uc2luX3BvcnQgIT0KKwkJCSAgICBzcngtPnRyYW5zcG9ydC5zaW4uc2luX3BvcnQpCisJCQkJY29udGludWU7CisJCQlpZiAobWVtY21wKCZsb2NhbC0+c3J4LnRyYW5zcG9ydC5zaW4uc2luX2FkZHIsCisJCQkJICAgJnNyeC0+dHJhbnNwb3J0LnNpbi5zaW5fYWRkciwKKwkJCQkgICBzaXplb2Yoc3RydWN0IGluX2FkZHIpKSAhPSAwKQorCQkJCWNvbnRpbnVlOworCQkJZ290byBmb3VuZF9sb2NhbDsKKworCQlkZWZhdWx0OgorCQkJQlVHKCk7CisJCX0KKwl9CisKKwlyZWFkX3VubG9ja19iaCgmcnhycGNfbG9jYWxfbG9jayk7CisKKwkvKiB3ZSBkaWRuJ3QgZmluZCBvbmUsIHNvIHdlIG5lZWQgdG8gY3JlYXRlIG9uZSAqLworCWxvY2FsID0gcnhycGNfYWxsb2NfbG9jYWwoc3J4KTsKKwlpZiAoIWxvY2FsKSB7CisJCXVwX3dyaXRlKCZyeHJwY19sb2NhbF9zZW0pOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwl9CisKKwlyZXQgPSByeHJwY19jcmVhdGVfbG9jYWwobG9jYWwpOworCWlmIChyZXQgPCAwKSB7CisJCXVwX3dyaXRlKCZyeHJwY19sb2NhbF9zZW0pOworCQlrZnJlZShsb2NhbCk7CisJCV9sZWF2ZSgiID0gJWQiLCByZXQpOworCQlyZXR1cm4gRVJSX1BUUihyZXQpOworCX0KKworCXVwX3dyaXRlKCZyeHJwY19sb2NhbF9zZW0pOworCisJX25ldCgiTE9DQUwgbmV3ICVkIHslZCwldSwldS4ldS4ldS4ldSslaHV9IiwKKwkgICAgIGxvY2FsLT5kZWJ1Z19pZCwKKwkgICAgIGxvY2FsLT5zcngudHJhbnNwb3J0X3R5cGUsCisJICAgICBsb2NhbC0+c3J4LnRyYW5zcG9ydC5mYW1pbHksCisJICAgICBOSVBRVUFEKGxvY2FsLT5zcngudHJhbnNwb3J0LnNpbi5zaW5fYWRkciksCisJICAgICBudG9ocyhsb2NhbC0+c3J4LnRyYW5zcG9ydC5zaW4uc2luX3BvcnQpKTsKKworCV9sZWF2ZSgiID0gJXAgW25ld10iLCBsb2NhbCk7CisJcmV0dXJuIGxvY2FsOworCitmb3VuZF9sb2NhbDoKKwlyeHJwY19nZXRfbG9jYWwobG9jYWwpOworCXJlYWRfdW5sb2NrX2JoKCZyeHJwY19sb2NhbF9sb2NrKTsKKwl1cF93cml0ZSgmcnhycGNfbG9jYWxfc2VtKTsKKworCV9uZXQoIkxPQ0FMIG9sZCAlZCB7JWQsJXUsJXUuJXUuJXUuJXUrJWh1fSIsCisJICAgICBsb2NhbC0+ZGVidWdfaWQsCisJICAgICBsb2NhbC0+c3J4LnRyYW5zcG9ydF90eXBlLAorCSAgICAgbG9jYWwtPnNyeC50cmFuc3BvcnQuZmFtaWx5LAorCSAgICAgTklQUVVBRChsb2NhbC0+c3J4LnRyYW5zcG9ydC5zaW4uc2luX2FkZHIpLAorCSAgICAgbnRvaHMobG9jYWwtPnNyeC50cmFuc3BvcnQuc2luLnNpbl9wb3J0KSk7CisKKwlfbGVhdmUoIiA9ICVwIFtyZXVzZV0iLCBsb2NhbCk7CisJcmV0dXJuIGxvY2FsOworfQorCisvKgorICogcmVsZWFzZSBhIGxvY2FsIGVuZHBvaW50CisgKi8KK3ZvaWQgcnhycGNfcHV0X2xvY2FsKHN0cnVjdCByeHJwY19sb2NhbCAqbG9jYWwpCit7CisJX2VudGVyKCIlcHt1PSVkfSIsIGxvY2FsLCBhdG9taWNfcmVhZCgmbG9jYWwtPnVzYWdlKSk7CisKKwlBU1NFUlRDTVAoYXRvbWljX3JlYWQoJmxvY2FsLT51c2FnZSksID4sIDApOworCisJLyogdG8gcHJldmVudCBhIHJhY2UsIHRoZSBkZWNyZW1lbnQgYW5kIHRoZSBkZXF1ZXVlIG11c3QgYmUgZWZmZWN0aXZlbHkKKwkgKiBhdG9taWMgKi8KKwl3cml0ZV9sb2NrX2JoKCZyeHJwY19sb2NhbF9sb2NrKTsKKwlpZiAodW5saWtlbHkoYXRvbWljX2RlY19hbmRfdGVzdCgmbG9jYWwtPnVzYWdlKSkpIHsKKwkJX2RlYnVnKCJkZXN0cm95IGxvY2FsIik7CisJCXJ4cnBjX3F1ZXVlX3dvcmsoJmxvY2FsLT5kZXN0cm95ZXIpOworCX0KKwl3cml0ZV91bmxvY2tfYmgoJnJ4cnBjX2xvY2FsX2xvY2spOworCV9sZWF2ZSgiIik7Cit9CisKKy8qCisgKiBkZXN0cm95IGEgbG9jYWwgZW5kcG9pbnQKKyAqLworc3RhdGljIHZvaWQgcnhycGNfZGVzdHJveV9sb2NhbChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHJ4cnBjX2xvY2FsICpsb2NhbCA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcnhycGNfbG9jYWwsIGRlc3Ryb3llcik7CisKKwlfZW50ZXIoIiVweyVkfSIsIGxvY2FsLCBhdG9taWNfcmVhZCgmbG9jYWwtPnVzYWdlKSk7CisKKwlkb3duX3dyaXRlKCZyeHJwY19sb2NhbF9zZW0pOworCisJd3JpdGVfbG9ja19iaCgmcnhycGNfbG9jYWxfbG9jayk7CisJaWYgKGF0b21pY19yZWFkKCZsb2NhbC0+dXNhZ2UpID4gMCkgeworCQl3cml0ZV91bmxvY2tfYmgoJnJ4cnBjX2xvY2FsX2xvY2spOworCQl1cF9yZWFkKCZyeHJwY19sb2NhbF9zZW0pOworCQlfbGVhdmUoIiBbcmVzdXJyZWN0ZWRdIik7CisJCXJldHVybjsKKwl9CisKKwlsaXN0X2RlbCgmbG9jYWwtPmxpbmspOworCWxvY2FsLT5zb2NrZXQtPnNrLT5za191c2VyX2RhdGEgPSBOVUxMOworCXdyaXRlX3VubG9ja19iaCgmcnhycGNfbG9jYWxfbG9jayk7CisKKwlkb3duZ3JhZGVfd3JpdGUoJnJ4cnBjX2xvY2FsX3NlbSk7CisKKwlBU1NFUlQobGlzdF9lbXB0eSgmbG9jYWwtPnNlcnZpY2VzKSk7CisJQVNTRVJUKCF3b3JrX3BlbmRpbmcoJmxvY2FsLT5hY2NlcHRvcikpOworCUFTU0VSVCghd29ya19wZW5kaW5nKCZsb2NhbC0+cmVqZWN0ZXIpKTsKKworCS8qIGZpbmlzaCBjbGVhbmluZyB1cCB0aGUgbG9jYWwgZGVzY3JpcHRvciAqLworCXJ4cnBjX3B1cmdlX3F1ZXVlKCZsb2NhbC0+YWNjZXB0X3F1ZXVlKTsKKwlyeHJwY19wdXJnZV9xdWV1ZSgmbG9jYWwtPnJlamVjdF9xdWV1ZSk7CisJbG9jYWwtPnNvY2tldC0+b3BzLT5zaHV0ZG93bihsb2NhbC0+c29ja2V0LCAyKTsKKwlzb2NrX3JlbGVhc2UobG9jYWwtPnNvY2tldCk7CisKKwl1cF9yZWFkKCZyeHJwY19sb2NhbF9zZW0pOworCisJX25ldCgiREVTVFJPWSBMT0NBTCAlZCIsIGxvY2FsLT5kZWJ1Z19pZCk7CisJa2ZyZWUobG9jYWwpOworCisJaWYgKGxpc3RfZW1wdHkoJnJ4cnBjX2xvY2FscykpCisJCXdha2VfdXBfYWxsKCZyeHJwY19sb2NhbF93cSk7CisKKwlfbGVhdmUoIiIpOworfQorCisvKgorICogcHJlZW1wdGl2ZWx5IGRlc3Ryb3kgYWxsIGxvY2FsIGxvY2FsIGVuZHBvaW50IHJhdGhlciB0aGFuIHdhaXRpbmcgZm9yCisgKiB0aGVtIHRvIGJlIGRlc3Ryb3llZAorICovCit2b2lkIF9fZXhpdCByeHJwY19kZXN0cm95X2FsbF9sb2NhbHModm9pZCkKK3sKKwlERUNMQVJFX1dBSVRRVUVVRShteXNlbGYsY3VycmVudCk7CisKKwlfZW50ZXIoIiIpOworCisJLyogd2Ugc2ltcGx5IGhhdmUgdG8gd2FpdCBmb3IgdGhlbSB0byBnbyBhd2F5ICovCisJaWYgKCFsaXN0X2VtcHR5KCZyeHJwY19sb2NhbHMpKSB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJYWRkX3dhaXRfcXVldWUoJnJ4cnBjX2xvY2FsX3dxLCAmbXlzZWxmKTsKKworCQl3aGlsZSAoIWxpc3RfZW1wdHkoJnJ4cnBjX2xvY2FscykpIHsKKwkJCXNjaGVkdWxlKCk7CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCX0KKworCQlyZW1vdmVfd2FpdF9xdWV1ZSgmcnhycGNfbG9jYWxfd3EsICZteXNlbGYpOworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCX0KKworCV9sZWF2ZSgiIik7Cit9CmRpZmYgLS1naXQgYS9uZXQvcnhycGMvYXItb3V0cHV0LmMgYi9uZXQvcnhycGMvYXItb3V0cHV0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNkZGU0YQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9yeHJwYy9hci1vdXRwdXQuYwpAQCAtMCwwICsxLDczNCBAQAorLyogUnhSUEMgcGFja2V0IHRyYW5zbWlzc2lvbgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvY2lyY19idWYuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPG5ldC9hZl9yeHJwYy5oPgorI2luY2x1ZGUgImFyLWludGVybmFsLmgiCisKK2ludCByeHJwY19yZXNlbmRfdGltZW91dCA9IDQ7CisKK3N0YXRpYyBpbnQgcnhycGNfc2VuZF9kYXRhKHN0cnVjdCBraW9jYiAqaW9jYiwKKwkJCSAgIHN0cnVjdCByeHJwY19zb2NrICpyeCwKKwkJCSAgIHN0cnVjdCByeHJwY19jYWxsICpjYWxsLAorCQkJICAgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuKTsKKworLyoKKyAqIGV4dHJhY3QgY29udHJvbCBtZXNzYWdlcyBmcm9tIHRoZSBzZW5kbXNnKCkgY29udHJvbCBidWZmZXIKKyAqLworc3RhdGljIGludCByeHJwY19zZW5kbXNnX2Ntc2coc3RydWN0IHJ4cnBjX3NvY2sgKnJ4LCBzdHJ1Y3QgbXNnaGRyICptc2csCisJCQkgICAgICB1bnNpZ25lZCBsb25nICp1c2VyX2NhbGxfSUQsCisJCQkgICAgICBlbnVtIHJ4cnBjX2NvbW1hbmQgKmNvbW1hbmQsCisJCQkgICAgICB1MzIgKmFib3J0X2NvZGUsCisJCQkgICAgICBib29sIHNlcnZlcikKK3sKKwlzdHJ1Y3QgY21zZ2hkciAqY21zZzsKKwlpbnQgbGVuOworCisJKmNvbW1hbmQgPSBSWFJQQ19DTURfU0VORF9EQVRBOworCisJaWYgKG1zZy0+bXNnX2NvbnRyb2xsZW4gPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmb3IgKGNtc2cgPSBDTVNHX0ZJUlNUSERSKG1zZyk7IGNtc2c7IGNtc2cgPSBDTVNHX05YVEhEUihtc2csIGNtc2cpKSB7CisJCWlmICghQ01TR19PSyhtc2csIGNtc2cpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJbGVuID0gY21zZy0+Y21zZ19sZW4gLSBDTVNHX0FMSUdOKHNpemVvZihzdHJ1Y3QgY21zZ2hkcikpOworCQlfZGVidWcoIkNNU0cgJWQsICVkLCAlZCIsCisJCSAgICAgICBjbXNnLT5jbXNnX2xldmVsLCBjbXNnLT5jbXNnX3R5cGUsIGxlbik7CisKKwkJaWYgKGNtc2ctPmNtc2dfbGV2ZWwgIT0gU09MX1JYUlBDKQorCQkJY29udGludWU7CisKKwkJc3dpdGNoIChjbXNnLT5jbXNnX3R5cGUpIHsKKwkJY2FzZSBSWFJQQ19VU0VSX0NBTExfSUQ6CisJCQlpZiAobXNnLT5tc2dfZmxhZ3MgJiBNU0dfQ01TR19DT01QQVQpIHsKKwkJCQlpZiAobGVuICE9IHNpemVvZih1MzIpKQorCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQkqdXNlcl9jYWxsX0lEID0gKih1MzIgKikgQ01TR19EQVRBKGNtc2cpOworCQkJfSBlbHNlIHsKKwkJCQlpZiAobGVuICE9IHNpemVvZih1bnNpZ25lZCBsb25nKSkKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJKnVzZXJfY2FsbF9JRCA9ICoodW5zaWduZWQgbG9uZyAqKQorCQkJCQlDTVNHX0RBVEEoY21zZyk7CisJCQl9CisJCQlfZGVidWcoIlVzZXIgQ2FsbCBJRCAlbHgiLCAqdXNlcl9jYWxsX0lEKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUlhSUENfQUJPUlQ6CisJCQlpZiAoKmNvbW1hbmQgIT0gUlhSUENfQ01EX1NFTkRfREFUQSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCSpjb21tYW5kID0gUlhSUENfQ01EX1NFTkRfQUJPUlQ7CisJCQlpZiAobGVuICE9IHNpemVvZigqYWJvcnRfY29kZSkpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkqYWJvcnRfY29kZSA9ICoodW5zaWduZWQgaW50ICopIENNU0dfREFUQShjbXNnKTsKKwkJCV9kZWJ1ZygiQWJvcnQgJXgiLCAqYWJvcnRfY29kZSk7CisJCQlpZiAoKmFib3J0X2NvZGUgPT0gMCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWJyZWFrOworCisJCWNhc2UgUlhSUENfQUNDRVBUOgorCQkJaWYgKCpjb21tYW5kICE9IFJYUlBDX0NNRF9TRU5EX0RBVEEpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkqY29tbWFuZCA9IFJYUlBDX0NNRF9BQ0NFUFQ7CisJCQlpZiAobGVuICE9IDApCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlpZiAoIXNlcnZlcikKKwkJCQlyZXR1cm4gLUVJU0NPTk47CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwlfbGVhdmUoIiA9IDAiKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGFib3J0IGEgY2FsbCwgc2VuZGluZyBhbiBBQk9SVCBwYWNrZXQgdG8gdGhlIHBlZXIKKyAqLworc3RhdGljIHZvaWQgcnhycGNfc2VuZF9hYm9ydChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwgdTMyIGFib3J0X2NvZGUpCit7CisJd3JpdGVfbG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7CisKKwlpZiAoY2FsbC0+c3RhdGUgPD0gUlhSUENfQ0FMTF9DT01QTEVURSkgeworCQljYWxsLT5zdGF0ZSA9IFJYUlBDX0NBTExfTE9DQUxMWV9BQk9SVEVEOworCQljYWxsLT5hYm9ydF9jb2RlID0gYWJvcnRfY29kZTsKKwkJc2V0X2JpdChSWFJQQ19DQUxMX0FCT1JULCAmY2FsbC0+ZXZlbnRzKTsKKwkJZGVsX3RpbWVyX3N5bmMoJmNhbGwtPnJlc2VuZF90aW1lcik7CisJCWRlbF90aW1lcl9zeW5jKCZjYWxsLT5hY2tfdGltZXIpOworCQljbGVhcl9iaXQoUlhSUENfQ0FMTF9SRVNFTkRfVElNRVIsICZjYWxsLT5ldmVudHMpOworCQljbGVhcl9iaXQoUlhSUENfQ0FMTF9BQ0ssICZjYWxsLT5ldmVudHMpOworCQljbGVhcl9iaXQoUlhSUENfQ0FMTF9SVU5fUlRJTUVSLCAmY2FsbC0+ZmxhZ3MpOworCQlyeHJwY19xdWV1ZV9jYWxsKGNhbGwpOworCX0KKworCXdyaXRlX3VubG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7Cit9CisKKy8qCisgKiBzZW5kIGEgbWVzc2FnZSBmb3JtaW5nIHBhcnQgb2YgYSBjbGllbnQgY2FsbCB0aHJvdWdoIGFuIFJ4UlBDIHNvY2tldAorICogLSBjYWxsZXIgaG9sZHMgdGhlIHNvY2tldCBsb2NrZWQKKyAqIC0gdGhlIHNvY2tldCBtYXkgYmUgZWl0aGVyIGEgY2xpZW50IHNvY2tldCBvciBhIHNlcnZlciBzb2NrZXQKKyAqLworaW50IHJ4cnBjX2NsaWVudF9zZW5kbXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHJ4cnBjX3NvY2sgKnJ4LAorCQkJIHN0cnVjdCByeHJwY190cmFuc3BvcnQgKnRyYW5zLCBzdHJ1Y3QgbXNnaGRyICptc2csCisJCQkgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgcnhycGNfY29ubl9idW5kbGUgKmJ1bmRsZTsKKwllbnVtIHJ4cnBjX2NvbW1hbmQgY21kOworCXN0cnVjdCByeHJwY19jYWxsICpjYWxsOworCXVuc2lnbmVkIGxvbmcgdXNlcl9jYWxsX0lEID0gMDsKKwlzdHJ1Y3Qga2V5ICprZXk7CisJX19iZTE2IHNlcnZpY2VfaWQ7CisJdTMyIGFib3J0X2NvZGUgPSAwOworCWludCByZXQ7CisKKwlfZW50ZXIoIiIpOworCisJQVNTRVJUKHRyYW5zICE9IE5VTEwpOworCisJcmV0ID0gcnhycGNfc2VuZG1zZ19jbXNnKHJ4LCBtc2csICZ1c2VyX2NhbGxfSUQsICZjbWQsICZhYm9ydF9jb2RlLAorCQkJCSBmYWxzZSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlidW5kbGUgPSBOVUxMOworCWlmICh0cmFucykgeworCQlzZXJ2aWNlX2lkID0gcngtPnNlcnZpY2VfaWQ7CisJCWlmIChtc2ctPm1zZ19uYW1lKSB7CisJCQlzdHJ1Y3Qgc29ja2FkZHJfcnhycGMgKnNyeCA9CisJCQkJKHN0cnVjdCBzb2NrYWRkcl9yeHJwYyAqKSBtc2ctPm1zZ19uYW1lOworCQkJc2VydmljZV9pZCA9IGh0b25zKHNyeC0+c3J4X3NlcnZpY2UpOworCQl9CisJCWtleSA9IHJ4LT5rZXk7CisJCWlmIChrZXkgJiYgIXJ4LT5rZXktPnBheWxvYWQuZGF0YSkKKwkJCWtleSA9IE5VTEw7CisJCWJ1bmRsZSA9IHJ4cnBjX2dldF9idW5kbGUocngsIHRyYW5zLCBrZXksIHNlcnZpY2VfaWQsCisJCQkJCSAgR0ZQX0tFUk5FTCk7CisJCWlmIChJU19FUlIoYnVuZGxlKSkKKwkJCXJldHVybiBQVFJfRVJSKGJ1bmRsZSk7CisJfQorCisJY2FsbCA9IHJ4cnBjX2dldF9jbGllbnRfY2FsbChyeCwgdHJhbnMsIGJ1bmRsZSwgdXNlcl9jYWxsX0lELAorCQkJCSAgICAgYWJvcnRfY29kZSA9PSAwLCBHRlBfS0VSTkVMKTsKKwlpZiAodHJhbnMpCisJCXJ4cnBjX3B1dF9idW5kbGUodHJhbnMsIGJ1bmRsZSk7CisJaWYgKElTX0VSUihjYWxsKSkgeworCQlfbGVhdmUoIiA9ICVsZCIsIFBUUl9FUlIoY2FsbCkpOworCQlyZXR1cm4gUFRSX0VSUihjYWxsKTsKKwl9CisKKwlfZGVidWcoIkNBTEwgJWQgVVNSICVseCBTVCAlZCBvbiBDT05OICVwIiwKKwkgICAgICAgY2FsbC0+ZGVidWdfaWQsIGNhbGwtPnVzZXJfY2FsbF9JRCwgY2FsbC0+c3RhdGUsIGNhbGwtPmNvbm4pOworCisJaWYgKGNhbGwtPnN0YXRlID49IFJYUlBDX0NBTExfQ09NUExFVEUpIHsKKwkJLyogaXQncyB0b28gbGF0ZSBmb3IgdGhpcyBjYWxsICovCisJCXJldCA9IC1FU0hVVERPV047CisJfSBlbHNlIGlmIChjbWQgPT0gUlhSUENfQ01EX1NFTkRfQUJPUlQpIHsKKwkJcnhycGNfc2VuZF9hYm9ydChjYWxsLCBhYm9ydF9jb2RlKTsKKwl9IGVsc2UgaWYgKGNtZCAhPSBSWFJQQ19DTURfU0VORF9EQVRBKSB7CisJCXJldCA9IC1FSU5WQUw7CisJfSBlbHNlIGlmIChjYWxsLT5zdGF0ZSAhPSBSWFJQQ19DQUxMX0NMSUVOVF9TRU5EX1JFUVVFU1QpIHsKKwkJLyogcmVxdWVzdCBwaGFzZSBjb21wbGV0ZSBmb3IgdGhpcyBjbGllbnQgY2FsbCAqLworCQlyZXQgPSAtRVBST1RPOworCX0gZWxzZSB7CisJCXJldCA9IHJ4cnBjX3NlbmRfZGF0YShpb2NiLCByeCwgY2FsbCwgbXNnLCBsZW4pOworCX0KKworCXJ4cnBjX3B1dF9jYWxsKGNhbGwpOworCV9sZWF2ZSgiID0gJWQiLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogcnhycGNfa2VybmVsX3NlbmRfZGF0YSAtIEFsbG93IGEga2VybmVsIHNlcnZpY2UgdG8gc2VuZCBkYXRhIG9uIGEgY2FsbAorICogQGNhbGw6IFRoZSBjYWxsIHRvIHNlbmQgZGF0YSB0aHJvdWdoCisgKiBAbXNnOiBUaGUgZGF0YSB0byBzZW5kCisgKiBAbGVuOiBUaGUgYW1vdW50IG9mIGRhdGEgdG8gc2VuZAorICoKKyAqIEFsbG93IGEga2VybmVsIHNlcnZpY2UgdG8gc2VuZCBkYXRhIG9uIGEgY2FsbC4gIFRoZSBjYWxsIG11c3QgYmUgaW4gYW4gc3RhdGUKKyAqIGFwcHJvcHJpYXRlIHRvIHNlbmRpbmcgZGF0YS4gIE5vIGNvbnRyb2wgZGF0YSBzaG91bGQgYmUgc3VwcGxpZWQgaW4gQG1zZywKKyAqIG5vciBzaG91bGQgYW4gYWRkcmVzcyBiZSBzdXBwbGllZC4gIE1TR19NT1JFIHNob3VsZCBiZSBmbGFnZ2VkIGlmIHRoZXJlJ3MKKyAqIG1vcmUgZGF0YSB0byBjb21lLCBvdGhlcndpc2UgdGhpcyBkYXRhIHdpbGwgZW5kIHRoZSB0cmFuc21pc3Npb24gcGhhc2UuCisgKi8KK2ludCByeHJwY19rZXJuZWxfc2VuZF9kYXRhKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLCBzdHJ1Y3QgbXNnaGRyICptc2csCisJCQkgICBzaXplX3QgbGVuKQoreworCWludCByZXQ7CisKKwlfZW50ZXIoInslZCwlc30sIiwgY2FsbC0+ZGVidWdfaWQsIHJ4cnBjX2NhbGxfc3RhdGVzW2NhbGwtPnN0YXRlXSk7CisKKwlBU1NFUlRDTVAobXNnLT5tc2dfbmFtZSwgPT0sIE5VTEwpOworCUFTU0VSVENNUChtc2ctPm1zZ19jb250cm9sLCA9PSwgTlVMTCk7CisKKwlsb2NrX3NvY2soJmNhbGwtPnNvY2tldC0+c2spOworCisJX2RlYnVnKCJDQUxMICVkIFVTUiAlbHggU1QgJWQgb24gQ09OTiAlcCIsCisJICAgICAgIGNhbGwtPmRlYnVnX2lkLCBjYWxsLT51c2VyX2NhbGxfSUQsIGNhbGwtPnN0YXRlLCBjYWxsLT5jb25uKTsKKworCWlmIChjYWxsLT5zdGF0ZSA+PSBSWFJQQ19DQUxMX0NPTVBMRVRFKSB7CisJCXJldCA9IC1FU0hVVERPV047IC8qIGl0J3MgdG9vIGxhdGUgZm9yIHRoaXMgY2FsbCAqLworCX0gZWxzZSBpZiAoY2FsbC0+c3RhdGUgIT0gUlhSUENfQ0FMTF9DTElFTlRfU0VORF9SRVFVRVNUICYmCisJCSAgIGNhbGwtPnN0YXRlICE9IFJYUlBDX0NBTExfU0VSVkVSX0FDS19SRVFVRVNUICYmCisJCSAgIGNhbGwtPnN0YXRlICE9IFJYUlBDX0NBTExfU0VSVkVSX1NFTkRfUkVQTFkpIHsKKwkJcmV0ID0gLUVQUk9UTzsgLyogcmVxdWVzdCBwaGFzZSBjb21wbGV0ZSBmb3IgdGhpcyBjbGllbnQgY2FsbCAqLworCX0gZWxzZSB7CisJCW1tX3NlZ21lbnRfdCBvbGRmcyA9IGdldF9mcygpOworCQlzZXRfZnMoS0VSTkVMX0RTKTsKKwkJcmV0ID0gcnhycGNfc2VuZF9kYXRhKE5VTEwsIGNhbGwtPnNvY2tldCwgY2FsbCwgbXNnLCBsZW4pOworCQlzZXRfZnMob2xkZnMpOworCX0KKworCXJlbGVhc2Vfc29jaygmY2FsbC0+c29ja2V0LT5zayk7CisJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworRVhQT1JUX1NZTUJPTChyeHJwY19rZXJuZWxfc2VuZF9kYXRhKTsKKworLyoKKyAqIHJ4cnBjX2tlcm5lbF9hYm9ydF9jYWxsIC0gQWxsb3cgYSBrZXJuZWwgc2VydmljZSB0byBhYm9ydCBhIGNhbGwKKyAqIEBjYWxsOiBUaGUgY2FsbCB0byBiZSBhYm9ydGVkCisgKiBAYWJvcnRfY29kZTogVGhlIGFib3J0IGNvZGUgdG8gc3RpY2sgaW50byB0aGUgQUJPUlQgcGFja2V0CisgKgorICogQWxsb3cgYSBrZXJuZWwgc2VydmljZSB0byBhYm9ydCBhIGNhbGwsIGlmIGl0J3Mgc3RpbGwgaW4gYW4gYWJvcnRhYmxlIHN0YXRlLgorICovCit2b2lkIHJ4cnBjX2tlcm5lbF9hYm9ydF9jYWxsKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLCB1MzIgYWJvcnRfY29kZSkKK3sKKwlfZW50ZXIoInslZH0sJWQiLCBjYWxsLT5kZWJ1Z19pZCwgYWJvcnRfY29kZSk7CisKKwlsb2NrX3NvY2soJmNhbGwtPnNvY2tldC0+c2spOworCisJX2RlYnVnKCJDQUxMICVkIFVTUiAlbHggU1QgJWQgb24gQ09OTiAlcCIsCisJICAgICAgIGNhbGwtPmRlYnVnX2lkLCBjYWxsLT51c2VyX2NhbGxfSUQsIGNhbGwtPnN0YXRlLCBjYWxsLT5jb25uKTsKKworCWlmIChjYWxsLT5zdGF0ZSA8IFJYUlBDX0NBTExfQ09NUExFVEUpCisJCXJ4cnBjX3NlbmRfYWJvcnQoY2FsbCwgYWJvcnRfY29kZSk7CisKKwlyZWxlYXNlX3NvY2soJmNhbGwtPnNvY2tldC0+c2spOworCV9sZWF2ZSgiIik7Cit9CisKK0VYUE9SVF9TWU1CT0wocnhycGNfa2VybmVsX2Fib3J0X2NhbGwpOworCisvKgorICogc2VuZCBhIG1lc3NhZ2UgdGhyb3VnaCBhIHNlcnZlciBzb2NrZXQKKyAqIC0gY2FsbGVyIGhvbGRzIHRoZSBzb2NrZXQgbG9ja2VkCisgKi8KK2ludCByeHJwY19zZXJ2ZXJfc2VuZG1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCByeHJwY19zb2NrICpyeCwKKwkJCSBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4pCit7CisJZW51bSByeHJwY19jb21tYW5kIGNtZDsKKwlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbDsKKwl1bnNpZ25lZCBsb25nIHVzZXJfY2FsbF9JRCA9IDA7CisJdTMyIGFib3J0X2NvZGUgPSAwOworCWludCByZXQ7CisKKwlfZW50ZXIoIiIpOworCisJcmV0ID0gcnhycGNfc2VuZG1zZ19jbXNnKHJ4LCBtc2csICZ1c2VyX2NhbGxfSUQsICZjbWQsICZhYm9ydF9jb2RlLAorCQkJCSB0cnVlKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChjbWQgPT0gUlhSUENfQ01EX0FDQ0VQVCkgeworCQljYWxsID0gcnhycGNfYWNjZXB0X2NhbGwocngsIHVzZXJfY2FsbF9JRCk7CisJCWlmIChJU19FUlIoY2FsbCkpCisJCQlyZXR1cm4gUFRSX0VSUihjYWxsKTsKKwkJcnhycGNfcHV0X2NhbGwoY2FsbCk7CisJCXJldHVybiAwOworCX0KKworCWNhbGwgPSByeHJwY19maW5kX3NlcnZlcl9jYWxsKHJ4LCB1c2VyX2NhbGxfSUQpOworCWlmICghY2FsbCkKKwkJcmV0dXJuIC1FQkFEU0xUOworCWlmIChjYWxsLT5zdGF0ZSA+PSBSWFJQQ19DQUxMX0NPTVBMRVRFKSB7CisJCXJldCA9IC1FU0hVVERPV047CisJCWdvdG8gb3V0OworCX0KKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBSWFJQQ19DTURfU0VORF9EQVRBOgorCQlpZiAoY2FsbC0+c3RhdGUgIT0gUlhSUENfQ0FMTF9DTElFTlRfU0VORF9SRVFVRVNUICYmCisJCSAgICBjYWxsLT5zdGF0ZSAhPSBSWFJQQ19DQUxMX1NFUlZFUl9BQ0tfUkVRVUVTVCAmJgorCQkgICAgY2FsbC0+c3RhdGUgIT0gUlhSUENfQ0FMTF9TRVJWRVJfU0VORF9SRVBMWSkgeworCQkJLyogVHggcGhhc2Ugbm90IHlldCBiZWd1biBmb3IgdGhpcyBjYWxsICovCisJCQlyZXQgPSAtRVBST1RPOworCQkJYnJlYWs7CisJCX0KKworCQlyZXQgPSByeHJwY19zZW5kX2RhdGEoaW9jYiwgcngsIGNhbGwsIG1zZywgbGVuKTsKKwkJYnJlYWs7CisKKwljYXNlIFJYUlBDX0NNRF9TRU5EX0FCT1JUOgorCQlyeHJwY19zZW5kX2Fib3J0KGNhbGwsIGFib3J0X2NvZGUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9CisKKwlvdXQ6CisJcnhycGNfcHV0X2NhbGwoY2FsbCk7CisJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIHNlbmQgYSBwYWNrZXQgdGhyb3VnaCB0aGUgdHJhbnNwb3J0IGVuZHBvaW50CisgKi8KK2ludCByeHJwY19zZW5kX3BhY2tldChzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICp0cmFucywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3Qga3ZlYyBpb3ZbMV07CisJc3RydWN0IG1zZ2hkciBtc2c7CisJaW50IHJldCwgb3B0OworCisJX2VudGVyKCIseyVkfSIsIHNrYi0+bGVuKTsKKworCWlvdlswXS5pb3ZfYmFzZSA9IHNrYi0+aGVhZDsKKwlpb3ZbMF0uaW92X2xlbiA9IHNrYi0+bGVuOworCisJbXNnLm1zZ19uYW1lID0gJnRyYW5zLT5wZWVyLT5zcngudHJhbnNwb3J0LnNpbjsKKwltc2cubXNnX25hbWVsZW4gPSBzaXplb2YodHJhbnMtPnBlZXItPnNyeC50cmFuc3BvcnQuc2luKTsKKwltc2cubXNnX2NvbnRyb2wgPSBOVUxMOworCW1zZy5tc2dfY29udHJvbGxlbiA9IDA7CisJbXNnLm1zZ19mbGFncyA9IDA7CisKKwkvKiBzZW5kIHRoZSBwYWNrZXQgd2l0aCB0aGUgZG9uJ3QgZnJhZ21lbnQgYml0IHNldCBpZiB3ZSBjdXJyZW50bHkKKwkgKiB0aGluayBpdCdzIHNtYWxsIGVub3VnaCAqLworCWlmIChza2ItPmxlbiAtIHNpemVvZihzdHJ1Y3QgcnhycGNfaGVhZGVyKSA8IHRyYW5zLT5wZWVyLT5tYXhkYXRhKSB7CisJCWRvd25fcmVhZCgmdHJhbnMtPmxvY2FsLT5kZWZyYWdfc2VtKTsKKwkJLyogc2VuZCB0aGUgcGFja2V0IGJ5IFVEUAorCQkgKiAtIHJldHVybnMgLUVNU0dTSVpFIGlmIFVEUCB3b3VsZCBoYXZlIHRvIGZyYWdtZW50IHRoZSBwYWNrZXQKKwkJICogICB0byBnbyBvdXQgb2YgdGhlIGludGVyZmFjZQorCQkgKiAgIC0gaW4gd2hpY2ggY2FzZSwgd2UnbGwgaGF2ZSBwcm9jZXNzZWQgdGhlIElDTVAgZXJyb3IKKwkJICogICAgIG1lc3NhZ2UgYW5kIHVwZGF0ZSB0aGUgcGVlciByZWNvcmQKKwkJICovCisJCXJldCA9IGtlcm5lbF9zZW5kbXNnKHRyYW5zLT5sb2NhbC0+c29ja2V0LCAmbXNnLCBpb3YsIDEsCisJCQkJICAgICBpb3ZbMF0uaW92X2xlbik7CisKKwkJdXBfcmVhZCgmdHJhbnMtPmxvY2FsLT5kZWZyYWdfc2VtKTsKKwkJaWYgKHJldCA9PSAtRU1TR1NJWkUpCisJCQlnb3RvIHNlbmRfZnJhZ21lbnRhYmxlOworCisJCV9sZWF2ZSgiID0gJWQgWyV1XSIsIHJldCwgdHJhbnMtPnBlZXItPm1heGRhdGEpOworCQlyZXR1cm4gcmV0OworCX0KKworc2VuZF9mcmFnbWVudGFibGU6CisJLyogYXR0ZW1wdCB0byBzZW5kIHRoaXMgbWVzc2FnZSB3aXRoIGZyYWdtZW50YXRpb24gZW5hYmxlZCAqLworCV9kZWJ1Zygic2VuZCBmcmFnbWVudCIpOworCisJZG93bl93cml0ZSgmdHJhbnMtPmxvY2FsLT5kZWZyYWdfc2VtKTsKKwlvcHQgPSBJUF9QTVRVRElTQ19ET05UOworCXJldCA9IGtlcm5lbF9zZXRzb2Nrb3B0KHRyYW5zLT5sb2NhbC0+c29ja2V0LCBTT0xfSVAsIElQX01UVV9ESVNDT1ZFUiwKKwkJCQkoY2hhciAqKSAmb3B0LCBzaXplb2Yob3B0KSk7CisJaWYgKHJldCA9PSAwKSB7CisJCXJldCA9IGtlcm5lbF9zZW5kbXNnKHRyYW5zLT5sb2NhbC0+c29ja2V0LCAmbXNnLCBpb3YsIDEsCisJCQkJICAgICBpb3ZbMF0uaW92X2xlbik7CisKKwkJb3B0ID0gSVBfUE1UVURJU0NfRE87CisJCWtlcm5lbF9zZXRzb2Nrb3B0KHRyYW5zLT5sb2NhbC0+c29ja2V0LCBTT0xfSVAsCisJCQkJICBJUF9NVFVfRElTQ09WRVIsIChjaGFyICopICZvcHQsIHNpemVvZihvcHQpKTsKKwl9CisKKwl1cF93cml0ZSgmdHJhbnMtPmxvY2FsLT5kZWZyYWdfc2VtKTsKKwlfbGVhdmUoIiA9ICVkIFtmcmFnICV1XSIsIHJldCwgdHJhbnMtPnBlZXItPm1heGRhdGEpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiB3YWl0IGZvciBzcGFjZSB0byBhcHBlYXIgaW4gdGhlIHRyYW5zbWl0L0FDSyB3aW5kb3cKKyAqIC0gY2FsbGVyIGhvbGRzIHRoZSBzb2NrZXQgbG9ja2VkCisgKi8KK3N0YXRpYyBpbnQgcnhycGNfd2FpdF9mb3JfdHhfd2luZG93KHN0cnVjdCByeHJwY19zb2NrICpyeCwKKwkJCQkgICAgc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsCisJCQkJICAgIGxvbmcgKnRpbWVvKQoreworCURFQ0xBUkVfV0FJVFFVRVVFKG15c2VsZiwgY3VycmVudCk7CisJaW50IHJldDsKKworCV9lbnRlcigiLHslZH0sJWxkIiwKKwkgICAgICAgQ0lSQ19TUEFDRShjYWxsLT5hY2tzX2hlYWQsIGNhbGwtPmFja3NfdGFpbCwgY2FsbC0+YWNrc193aW5zeiksCisJICAgICAgICp0aW1lbyk7CisKKwlhZGRfd2FpdF9xdWV1ZSgmY2FsbC0+dHhfd2FpdHEsICZteXNlbGYpOworCisJZm9yICg7OykgeworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlyZXQgPSAwOworCQlpZiAoQ0lSQ19TUEFDRShjYWxsLT5hY2tzX2hlYWQsIGNhbGwtPmFja3NfdGFpbCwKKwkJCSAgICAgICBjYWxsLT5hY2tzX3dpbnN6KSA+IDApCisJCQlicmVhazsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlyZXQgPSBzb2NrX2ludHJfZXJybm8oKnRpbWVvKTsKKwkJCWJyZWFrOworCQl9CisKKwkJcmVsZWFzZV9zb2NrKCZyeC0+c2spOworCQkqdGltZW8gPSBzY2hlZHVsZV90aW1lb3V0KCp0aW1lbyk7CisJCWxvY2tfc29jaygmcngtPnNrKTsKKwl9CisKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmY2FsbC0+dHhfd2FpdHEsICZteXNlbGYpOworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIGF0dGVtcHQgdG8gc2NoZWR1bGUgYW4gaW5zdGFudCBUeCByZXNlbmQKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHJ4cnBjX2luc3RhbnRfcmVzZW5kKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKQoreworCXJlYWRfbG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7CisJaWYgKHRyeV90b19kZWxfdGltZXJfc3luYygmY2FsbC0+cmVzZW5kX3RpbWVyKSA+PSAwKSB7CisJCWNsZWFyX2JpdChSWFJQQ19DQUxMX1JVTl9SVElNRVIsICZjYWxsLT5mbGFncyk7CisJCWlmIChjYWxsLT5zdGF0ZSA8IFJYUlBDX0NBTExfQ09NUExFVEUgJiYKKwkJICAgICF0ZXN0X2FuZF9zZXRfYml0KFJYUlBDX0NBTExfUkVTRU5EX1RJTUVSLCAmY2FsbC0+ZXZlbnRzKSkKKwkJCXJ4cnBjX3F1ZXVlX2NhbGwoY2FsbCk7CisJfQorCXJlYWRfdW5sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKK30KKworLyoKKyAqIHF1ZXVlIGEgcGFja2V0IGZvciB0cmFuc21pc3Npb24sIHNldCB0aGUgcmVzZW5kIHRpbWVyIGFuZCBhdHRlbXB0CisgKiB0byBzZW5kIHRoZSBwYWNrZXQgaW1tZWRpYXRlbHkKKyAqLworc3RhdGljIHZvaWQgcnhycGNfcXVldWVfcGFja2V0KHN0cnVjdCByeHJwY19jYWxsICpjYWxsLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICAgIGJvb2wgbGFzdCkKK3sKKwlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwID0gcnhycGNfc2tiKHNrYik7CisJaW50IHJldDsKKworCV9uZXQoInF1ZXVlIHNrYiAlcCBbJWRdIiwgc2tiLCBjYWxsLT5hY2tzX2hlYWQpOworCisJQVNTRVJUKGNhbGwtPmFja3Nfd2luZG93ICE9IE5VTEwpOworCWNhbGwtPmFja3Nfd2luZG93W2NhbGwtPmFja3NfaGVhZF0gPSAodW5zaWduZWQgbG9uZykgc2tiOworCXNtcF93bWIoKTsKKwljYWxsLT5hY2tzX2hlYWQgPSAoY2FsbC0+YWNrc19oZWFkICsgMSkgJiAoY2FsbC0+YWNrc193aW5zeiAtIDEpOworCisJaWYgKGxhc3QgfHwgY2FsbC0+c3RhdGUgPT0gUlhSUENfQ0FMTF9TRVJWRVJfQUNLX1JFUVVFU1QpIHsKKwkJX2RlYnVnKCJfX19fX19fX2F3YWl0aW5nIHJlcGx5L0FDS19fX19fX19fX18iKTsKKwkJd3JpdGVfbG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7CisJCXN3aXRjaCAoY2FsbC0+c3RhdGUpIHsKKwkJY2FzZSBSWFJQQ19DQUxMX0NMSUVOVF9TRU5EX1JFUVVFU1Q6CisJCQljYWxsLT5zdGF0ZSA9IFJYUlBDX0NBTExfQ0xJRU5UX0FXQUlUX1JFUExZOworCQkJYnJlYWs7CisJCWNhc2UgUlhSUENfQ0FMTF9TRVJWRVJfQUNLX1JFUVVFU1Q6CisJCQljYWxsLT5zdGF0ZSA9IFJYUlBDX0NBTExfU0VSVkVSX1NFTkRfUkVQTFk7CisJCQlpZiAoIWxhc3QpCisJCQkJYnJlYWs7CisJCWNhc2UgUlhSUENfQ0FMTF9TRVJWRVJfU0VORF9SRVBMWToKKwkJCWNhbGwtPnN0YXRlID0gUlhSUENfQ0FMTF9TRVJWRVJfQVdBSVRfQUNLOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCQl3cml0ZV91bmxvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOworCX0KKworCV9wcm90bygiVHggREFUQSAlJSV1IHsgIyV1IH0iLAorCSAgICAgICBudG9obChzcC0+aGRyLnNlcmlhbCksIG50b2hsKHNwLT5oZHIuc2VxKSk7CisKKwlzcC0+bmVlZF9yZXNlbmQgPSAwOworCXNwLT5yZXNlbmRfYXQgPSBqaWZmaWVzICsgcnhycGNfcmVzZW5kX3RpbWVvdXQgKiBIWjsKKwlpZiAoIXRlc3RfYW5kX3NldF9iaXQoUlhSUENfQ0FMTF9SVU5fUlRJTUVSLCAmY2FsbC0+ZmxhZ3MpKSB7CisJCV9kZWJ1ZygicnVuIHRpbWVyIik7CisJCWNhbGwtPnJlc2VuZF90aW1lci5leHBpcmVzID0gc3AtPnJlc2VuZF9hdDsKKwkJYWRkX3RpbWVyKCZjYWxsLT5yZXNlbmRfdGltZXIpOworCX0KKworCS8qIGF0dGVtcHQgdG8gY2FuY2VsIHRoZSByeC1BQ0sgdGltZXIsIGRlZmVycmluZyByZXBseSB0cmFuc21pc3Npb24gaWYKKwkgKiB3ZSdyZSBBQ0snaW5nIHRoZSByZXF1ZXN0IHBoYXNlIG9mIGFuIGluY29taW5nIGNhbGwgKi8KKwlyZXQgPSAtRUFHQUlOOworCWlmICh0cnlfdG9fZGVsX3RpbWVyX3N5bmMoJmNhbGwtPmFja190aW1lcikgPj0gMCkgeworCQkvKiB0aGUgcGFja2V0IG1heSBiZSBmcmVlZCBieSByeHJwY19wcm9jZXNzX2NhbGwoKSBiZWZvcmUgdGhpcworCQkgKiByZXR1cm5zICovCisJCXJldCA9IHJ4cnBjX3NlbmRfcGFja2V0KGNhbGwtPmNvbm4tPnRyYW5zLCBza2IpOworCQlfbmV0KCJzZW50IHNrYiAlcCIsIHNrYik7CisJfSBlbHNlIHsKKwkJX2RlYnVnKCJmYWlsZWQgdG8gZGVsZXRlIEFDSyB0aW1lciIpOworCX0KKworCWlmIChyZXQgPCAwKSB7CisJCV9kZWJ1ZygibmVlZCBpbnN0YW50IHJlc2VuZCAlZCIsIHJldCk7CisJCXNwLT5uZWVkX3Jlc2VuZCA9IDE7CisJCXJ4cnBjX2luc3RhbnRfcmVzZW5kKGNhbGwpOworCX0KKworCV9sZWF2ZSgiIik7Cit9CisKKy8qCisgKiBzZW5kIGRhdGEgdGhyb3VnaCBhIHNvY2tldAorICogLSBtdXN0IGJlIGNhbGxlZCBpbiBwcm9jZXNzIGNvbnRleHQKKyAqIC0gY2FsbGVyIGhvbGRzIHRoZSBzb2NrZXQgbG9ja2VkCisgKi8KK3N0YXRpYyBpbnQgcnhycGNfc2VuZF9kYXRhKHN0cnVjdCBraW9jYiAqaW9jYiwKKwkJCSAgIHN0cnVjdCByeHJwY19zb2NrICpyeCwKKwkJCSAgIHN0cnVjdCByeHJwY19jYWxsICpjYWxsLAorCQkJICAgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuKQoreworCXN0cnVjdCByeHJwY19za2JfcHJpdiAqc3A7CisJdW5zaWduZWQgY2hhciBfX3VzZXIgKmZyb207CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgaW92ZWMgKmlvdjsKKwlzdHJ1Y3Qgc29jayAqc2sgPSAmcngtPnNrOworCWxvbmcgdGltZW87CisJYm9vbCBtb3JlOworCWludCByZXQsIGlvYywgc2VnbWVudCwgY29waWVkOworCisJX2VudGVyKCIsLCx7JXp1fSwlenUiLCBtc2ctPm1zZ19pb3ZsZW4sIGxlbik7CisKKwl0aW1lbyA9IHNvY2tfc25kdGltZW8oc2ssIG1zZy0+bXNnX2ZsYWdzICYgTVNHX0RPTlRXQUlUKTsKKworCS8qIHRoaXMgc2hvdWxkIGJlIGluIHBvbGwgKi8KKwljbGVhcl9iaXQoU09DS19BU1lOQ19OT1NQQUNFLCAmc2stPnNrX3NvY2tldC0+ZmxhZ3MpOworCisJaWYgKHNrLT5za19lcnIgfHwgKHNrLT5za19zaHV0ZG93biAmIFNFTkRfU0hVVERPV04pKQorCQlyZXR1cm4gLUVQSVBFOworCisJaW92ID0gbXNnLT5tc2dfaW92OworCWlvYyA9IG1zZy0+bXNnX2lvdmxlbiAtIDE7CisJZnJvbSA9IGlvdi0+aW92X2Jhc2U7CisJc2VnbWVudCA9IGlvdi0+aW92X2xlbjsKKwlpb3YrKzsKKwltb3JlID0gbXNnLT5tc2dfZmxhZ3MgJiBNU0dfTU9SRTsKKworCXNrYiA9IGNhbGwtPnR4X3BlbmRpbmc7CisJY2FsbC0+dHhfcGVuZGluZyA9IE5VTEw7CisKKwljb3BpZWQgPSAwOworCWRvIHsKKwkJaW50IGNvcHk7CisKKwkJaWYgKHNlZ21lbnQgPiBsZW4pCisJCQlzZWdtZW50ID0gbGVuOworCisJCV9kZWJ1ZygiU0VHTUVOVCAlZCBAJXAiLCBzZWdtZW50LCBmcm9tKTsKKworCQlpZiAoIXNrYikgeworCQkJc2l6ZV90IHNpemUsIGNodW5rLCBtYXgsIHNwYWNlOworCisJCQlfZGVidWcoImFsbG9jIik7CisKKwkJCWlmIChDSVJDX1NQQUNFKGNhbGwtPmFja3NfaGVhZCwgY2FsbC0+YWNrc190YWlsLAorCQkJCSAgICAgICBjYWxsLT5hY2tzX3dpbnN6KSA8PSAwKSB7CisJCQkJcmV0ID0gLUVBR0FJTjsKKwkJCQlpZiAobXNnLT5tc2dfZmxhZ3MgJiBNU0dfRE9OVFdBSVQpCisJCQkJCWdvdG8gbWF5YmVfZXJyb3I7CisJCQkJcmV0ID0gcnhycGNfd2FpdF9mb3JfdHhfd2luZG93KHJ4LCBjYWxsLAorCQkJCQkJCSAgICAgICAmdGltZW8pOworCQkJCWlmIChyZXQgPCAwKQorCQkJCQlnb3RvIG1heWJlX2Vycm9yOworCQkJfQorCisJCQltYXggPSBjYWxsLT5jb25uLT50cmFucy0+cGVlci0+bWF4ZGF0YTsKKwkJCW1heCAtPSBjYWxsLT5jb25uLT5zZWN1cml0eV9zaXplOworCQkJbWF4ICY9IH4oY2FsbC0+Y29ubi0+c2l6ZV9hbGlnbiAtIDFVTCk7CisKKwkJCWNodW5rID0gbWF4OworCQkJaWYgKGNodW5rID4gbGVuKQorCQkJCWNodW5rID0gbGVuOworCisJCQlzcGFjZSA9IGNodW5rICsgY2FsbC0+Y29ubi0+c2l6ZV9hbGlnbjsKKwkJCXNwYWNlICY9IH4oY2FsbC0+Y29ubi0+c2l6ZV9hbGlnbiAtIDFVTCk7CisKKwkJCXNpemUgPSBzcGFjZSArIGNhbGwtPmNvbm4tPmhlYWRlcl9zaXplOworCisJCQlfZGVidWcoIlNJWkU6ICV6dS8lenUvJXp1IiwgY2h1bmssIHNwYWNlLCBzaXplKTsKKworCQkJLyogY3JlYXRlIGEgYnVmZmVyIHRoYXQgd2UgY2FuIHJldGFpbiB1bnRpbCBpdCdzIEFDSydkICovCisJCQlza2IgPSBzb2NrX2FsbG9jX3NlbmRfc2tiKAorCQkJCXNrLCBzaXplLCBtc2ctPm1zZ19mbGFncyAmIE1TR19ET05UV0FJVCwgJnJldCk7CisJCQlpZiAoIXNrYikKKwkJCQlnb3RvIG1heWJlX2Vycm9yOworCisJCQlyeHJwY19uZXdfc2tiKHNrYik7CisKKwkJCV9kZWJ1ZygiQUxMT0MgU0VORCAlcCIsIHNrYik7CisKKwkJCUFTU0VSVENNUChza2ItPm1hcmssID09LCAwKTsKKworCQkJX2RlYnVnKCJIUzogJXUiLCBjYWxsLT5jb25uLT5oZWFkZXJfc2l6ZSk7CisJCQlza2JfcmVzZXJ2ZShza2IsIGNhbGwtPmNvbm4tPmhlYWRlcl9zaXplKTsKKwkJCXNrYi0+bGVuICs9IGNhbGwtPmNvbm4tPmhlYWRlcl9zaXplOworCisJCQlzcCA9IHJ4cnBjX3NrYihza2IpOworCQkJc3AtPnJlbWFpbiA9IGNodW5rOworCQkJaWYgKHNwLT5yZW1haW4gPiBza2JfdGFpbHJvb20oc2tiKSkKKwkJCQlzcC0+cmVtYWluID0gc2tiX3RhaWxyb29tKHNrYik7CisKKwkJCV9uZXQoInNrYjogaHIgJWQsIHRyICVkLCBobCAlZCwgcm0gJWQiLAorCQkJICAgICAgIHNrYl9oZWFkcm9vbShza2IpLAorCQkJICAgICAgIHNrYl90YWlscm9vbShza2IpLAorCQkJICAgICAgIHNrYl9oZWFkbGVuKHNrYiksCisJCQkgICAgICAgc3AtPnJlbWFpbik7CisKKwkJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CisJCX0KKworCQlfZGVidWcoImFwcGVuZCIpOworCQlzcCA9IHJ4cnBjX3NrYihza2IpOworCisJCS8qIGFwcGVuZCBuZXh0IHNlZ21lbnQgb2YgZGF0YSB0byB0aGUgY3VycmVudCBidWZmZXIgKi8KKwkJY29weSA9IHNrYl90YWlscm9vbShza2IpOworCQlBU1NFUlRDTVAoY29weSwgPiwgMCk7CisJCWlmIChjb3B5ID4gc2VnbWVudCkKKwkJCWNvcHkgPSBzZWdtZW50OworCQlpZiAoY29weSA+IHNwLT5yZW1haW4pCisJCQljb3B5ID0gc3AtPnJlbWFpbjsKKworCQlfZGVidWcoImFkZCIpOworCQlyZXQgPSBza2JfYWRkX2RhdGEoc2tiLCBmcm9tLCBjb3B5KTsKKwkJX2RlYnVnKCJhZGRlZCIpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZWZhdWx0OworCQlzcC0+cmVtYWluIC09IGNvcHk7CisJCXNrYi0+bWFyayArPSBjb3B5OworCisJCWxlbiAtPSBjb3B5OworCQlzZWdtZW50IC09IGNvcHk7CisJCWZyb20gKz0gY29weTsKKwkJd2hpbGUgKHNlZ21lbnQgPT0gMCAmJiBpb2MgPiAwKSB7CisJCQlmcm9tID0gaW92LT5pb3ZfYmFzZTsKKwkJCXNlZ21lbnQgPSBpb3YtPmlvdl9sZW47CisJCQlpb3YrKzsKKwkJCWlvYy0tOworCQl9CisJCWlmIChsZW4gPT0gMCkgeworCQkJc2VnbWVudCA9IDA7CisJCQlpb2MgPSAwOworCQl9CisKKwkJLyogY2hlY2sgZm9yIHRoZSBmYXIgc2lkZSBhYm9ydGluZyB0aGUgY2FsbCBvciBhIG5ldHdvcmsgZXJyb3IKKwkJICogb2NjdXJyaW5nICovCisJCWlmIChjYWxsLT5zdGF0ZSA+IFJYUlBDX0NBTExfQ09NUExFVEUpCisJCQlnb3RvIGNhbGxfYWJvcnRlZDsKKworCQkvKiBhZGQgdGhlIHBhY2tldCB0byB0aGUgc2VuZCBxdWV1ZSBpZiBpdCdzIG5vdyBmdWxsICovCisJCWlmIChzcC0+cmVtYWluIDw9IDAgfHwgKHNlZ21lbnQgPT0gMCAmJiAhbW9yZSkpIHsKKwkJCXN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uID0gY2FsbC0+Y29ubjsKKwkJCXNpemVfdCBwYWQ7CisKKwkJCS8qIHBhZCBvdXQgaWYgd2UncmUgdXNpbmcgc2VjdXJpdHkgKi8KKwkJCWlmIChjb25uLT5zZWN1cml0eSkgeworCQkJCXBhZCA9IGNvbm4tPnNlY3VyaXR5X3NpemUgKyBza2ItPm1hcms7CisJCQkJcGFkID0gY29ubi0+c2l6ZV9hbGlnbiAtIHBhZDsKKwkJCQlwYWQgJj0gY29ubi0+c2l6ZV9hbGlnbiAtIDE7CisJCQkJX2RlYnVnKCJwYWQgJXp1IiwgcGFkKTsKKwkJCQlpZiAocGFkKQorCQkJCQltZW1zZXQoc2tiX3B1dChza2IsIHBhZCksIDAsIHBhZCk7CisJCQl9CisKKwkJCXNwLT5oZHIuZXBvY2ggPSBjb25uLT5lcG9jaDsKKwkJCXNwLT5oZHIuY2lkID0gY2FsbC0+Y2lkOworCQkJc3AtPmhkci5jYWxsTnVtYmVyID0gY2FsbC0+Y2FsbF9pZDsKKwkJCXNwLT5oZHIuc2VxID0KKwkJCQlodG9ubChhdG9taWNfaW5jX3JldHVybigmY2FsbC0+c2VxdWVuY2UpKTsKKwkJCXNwLT5oZHIuc2VyaWFsID0KKwkJCQlodG9ubChhdG9taWNfaW5jX3JldHVybigmY29ubi0+c2VyaWFsKSk7CisJCQlzcC0+aGRyLnR5cGUgPSBSWFJQQ19QQUNLRVRfVFlQRV9EQVRBOworCQkJc3AtPmhkci51c2VyU3RhdHVzID0gMDsKKwkJCXNwLT5oZHIuc2VjdXJpdHlJbmRleCA9IGNvbm4tPnNlY3VyaXR5X2l4OworCQkJc3AtPmhkci5fcnN2ZCA9IDA7CisJCQlzcC0+aGRyLnNlcnZpY2VJZCA9IGNvbm4tPnNlcnZpY2VfaWQ7CisKKwkJCXNwLT5oZHIuZmxhZ3MgPSBjb25uLT5vdXRfY2xpZW50ZmxhZzsKKwkJCWlmIChsZW4gPT0gMCAmJiAhbW9yZSkKKwkJCQlzcC0+aGRyLmZsYWdzIHw9IFJYUlBDX0xBU1RfUEFDS0VUOworCQkJZWxzZSBpZiAoQ0lSQ19TUEFDRShjYWxsLT5hY2tzX2hlYWQsIGNhbGwtPmFja3NfdGFpbCwKKwkJCQkJICAgIGNhbGwtPmFja3Nfd2luc3opID4gMSkKKwkJCQlzcC0+aGRyLmZsYWdzIHw9IFJYUlBDX01PUkVfUEFDS0VUUzsKKworCQkJcmV0ID0gcnhycGNfc2VjdXJlX3BhY2tldCgKKwkJCQljYWxsLCBza2IsIHNrYi0+bWFyaywKKwkJCQlza2ItPmhlYWQgKyBzaXplb2Yoc3RydWN0IHJ4cnBjX2hlYWRlcikpOworCQkJaWYgKHJldCA8IDApCisJCQkJZ290byBvdXQ7CisKKwkJCW1lbWNweShza2ItPmhlYWQsICZzcC0+aGRyLAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgcnhycGNfaGVhZGVyKSk7CisJCQlyeHJwY19xdWV1ZV9wYWNrZXQoY2FsbCwgc2tiLCBzZWdtZW50ID09IDAgJiYgIW1vcmUpOworCQkJc2tiID0gTlVMTDsKKwkJfQorCisJfSB3aGlsZSAoc2VnbWVudCA+IDApOworCitvdXQ6CisJY2FsbC0+dHhfcGVuZGluZyA9IHNrYjsKKwlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworCitjYWxsX2Fib3J0ZWQ6CisJcnhycGNfZnJlZV9za2Ioc2tiKTsKKwlpZiAoY2FsbC0+c3RhdGUgPT0gUlhSUENfQ0FMTF9ORVRXT1JLX0VSUk9SKQorCQlyZXQgPSBjYWxsLT5jb25uLT50cmFucy0+cGVlci0+bmV0X2Vycm9yOworCWVsc2UKKwkJcmV0ID0gLUVDT05OQUJPUlRFRDsKKwlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworCittYXliZV9lcnJvcjoKKwlpZiAoY29waWVkKQorCQlyZXQgPSBjb3BpZWQ7CisJZ290byBvdXQ7CisKK2VmYXVsdDoKKwlyZXQgPSAtRUZBVUxUOworCWdvdG8gb3V0OworfQpkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL2FyLXBlZXIuYyBiL25ldC9yeHJwYy9hci1wZWVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM5OWRlNAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9yeHJwYy9hci1wZWVyLmMKQEAgLTAsMCArMSwyNzMgQEAKKy8qIFJ4UlBDIHJlbW90ZSB0cmFuc3BvcnQgZW5kcG9pbnQgbWFuYWdlbWVudAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvdWRwLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pbjYuaD4KKyNpbmNsdWRlIDxsaW51eC9pY21wLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxuZXQvYWZfcnhycGMuaD4KKyNpbmNsdWRlIDxuZXQvaXAuaD4KKyNpbmNsdWRlICJhci1pbnRlcm5hbC5oIgorCitzdGF0aWMgTElTVF9IRUFEKHJ4cnBjX3BlZXJzKTsKK3N0YXRpYyBERUZJTkVfUldMT0NLKHJ4cnBjX3BlZXJfbG9jayk7CitzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQocnhycGNfcGVlcl93cSk7CisKK3N0YXRpYyB2b2lkIHJ4cnBjX2Rlc3Ryb3lfcGVlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworCisvKgorICogYWxsb2NhdGUgYSBuZXcgcGVlcgorICovCitzdGF0aWMgc3RydWN0IHJ4cnBjX3BlZXIgKnJ4cnBjX2FsbG9jX3BlZXIoc3RydWN0IHNvY2thZGRyX3J4cnBjICpzcngsCisJCQkJCSAgIGdmcF90IGdmcCkKK3sKKwlzdHJ1Y3QgcnhycGNfcGVlciAqcGVlcjsKKworCV9lbnRlcigiIik7CisKKwlwZWVyID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHJ4cnBjX3BlZXIpLCBnZnApOworCWlmIChwZWVyKSB7CisJCUlOSVRfV09SSygmcGVlci0+ZGVzdHJveWVyLCAmcnhycGNfZGVzdHJveV9wZWVyKTsKKwkJSU5JVF9MSVNUX0hFQUQoJnBlZXItPmxpbmspOworCQlJTklUX0xJU1RfSEVBRCgmcGVlci0+ZXJyb3JfdGFyZ2V0cyk7CisJCXNwaW5fbG9ja19pbml0KCZwZWVyLT5sb2NrKTsKKwkJYXRvbWljX3NldCgmcGVlci0+dXNhZ2UsIDEpOworCQlwZWVyLT5kZWJ1Z19pZCA9IGF0b21pY19pbmNfcmV0dXJuKCZyeHJwY19kZWJ1Z19pZCk7CisJCW1lbWNweSgmcGVlci0+c3J4LCBzcngsIHNpemVvZigqc3J4KSk7CisKKwkJcGVlci0+bXR1ID0gcGVlci0+aWZfbXR1ID0gNjU1MzU7CisKKwkJaWYgKHNyeC0+dHJhbnNwb3J0LmZhbWlseSA9PSBBRl9JTkVUKSB7CisJCQlwZWVyLT5oZHJzaXplID0gc2l6ZW9mKHN0cnVjdCBpcGhkcik7CisJCQlzd2l0Y2ggKHNyeC0+dHJhbnNwb3J0X3R5cGUpIHsKKwkJCWNhc2UgU09DS19ER1JBTToKKwkJCQlwZWVyLT5oZHJzaXplICs9IHNpemVvZihzdHJ1Y3QgdWRwaGRyKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJQlVHKCk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSB7CisJCQlCVUcoKTsKKwkJfQorCisJCXBlZXItPmhkcnNpemUgKz0gc2l6ZW9mKHN0cnVjdCByeHJwY19oZWFkZXIpOworCQlwZWVyLT5tYXhkYXRhID0gcGVlci0+bXR1IC0gcGVlci0+aGRyc2l6ZTsKKwl9CisKKwlfbGVhdmUoIiA9ICVwIiwgcGVlcik7CisJcmV0dXJuIHBlZXI7Cit9CisKKy8qCisgKiBvYnRhaW4gYSByZW1vdGUgdHJhbnNwb3J0IGVuZHBvaW50IGZvciB0aGUgc3BlY2lmaWVkIGFkZHJlc3MKKyAqLworc3RydWN0IHJ4cnBjX3BlZXIgKnJ4cnBjX2dldF9wZWVyKHN0cnVjdCBzb2NrYWRkcl9yeHJwYyAqc3J4LCBnZnBfdCBnZnApCit7CisJc3RydWN0IHJ4cnBjX3BlZXIgKnBlZXIsICpjYW5kaWRhdGU7CisJY29uc3QgY2hhciAqbmV3ID0gIm9sZCI7CisJaW50IHVzYWdlOworCisJX2VudGVyKCJ7JWQsJWQsJXUuJXUuJXUuJXUrJWh1fSIsCisJICAgICAgIHNyeC0+dHJhbnNwb3J0X3R5cGUsCisJICAgICAgIHNyeC0+dHJhbnNwb3J0X2xlbiwKKwkgICAgICAgTklQUVVBRChzcngtPnRyYW5zcG9ydC5zaW4uc2luX2FkZHIpLAorCSAgICAgICBudG9ocyhzcngtPnRyYW5zcG9ydC5zaW4uc2luX3BvcnQpKTsKKworCS8qIHNlYXJjaCB0aGUgcGVlciBsaXN0IGZpcnN0ICovCisJcmVhZF9sb2NrX2JoKCZyeHJwY19wZWVyX2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkocGVlciwgJnJ4cnBjX3BlZXJzLCBsaW5rKSB7CisJCV9kZWJ1ZygiY2hlY2sgUEVFUiAlZCB7IHU9JWQgdD0lZCBsPSVkIH0iLAorCQkgICAgICAgcGVlci0+ZGVidWdfaWQsCisJCSAgICAgICBhdG9taWNfcmVhZCgmcGVlci0+dXNhZ2UpLAorCQkgICAgICAgcGVlci0+c3J4LnRyYW5zcG9ydF90eXBlLAorCQkgICAgICAgcGVlci0+c3J4LnRyYW5zcG9ydF9sZW4pOworCisJCWlmIChhdG9taWNfcmVhZCgmcGVlci0+dXNhZ2UpID4gMCAmJgorCQkgICAgcGVlci0+c3J4LnRyYW5zcG9ydF90eXBlID09IHNyeC0+dHJhbnNwb3J0X3R5cGUgJiYKKwkJICAgIHBlZXItPnNyeC50cmFuc3BvcnRfbGVuID09IHNyeC0+dHJhbnNwb3J0X2xlbiAmJgorCQkgICAgbWVtY21wKCZwZWVyLT5zcngudHJhbnNwb3J0LAorCQkJICAgJnNyeC0+dHJhbnNwb3J0LAorCQkJICAgc3J4LT50cmFuc3BvcnRfbGVuKSA9PSAwKQorCQkJZ290byBmb3VuZF9leHRhbnRfcGVlcjsKKwl9CisJcmVhZF91bmxvY2tfYmgoJnJ4cnBjX3BlZXJfbG9jayk7CisKKwkvKiBub3QgeWV0IHByZXNlbnQgLSBjcmVhdGUgYSBjYW5kaWRhdGUgZm9yIGEgbmV3IHJlY29yZCBhbmQgdGhlbgorCSAqIHJlZG8gdGhlIHNlYXJjaCAqLworCWNhbmRpZGF0ZSA9IHJ4cnBjX2FsbG9jX3BlZXIoc3J4LCBnZnApOworCWlmICghY2FuZGlkYXRlKSB7CisJCV9sZWF2ZSgiID0gLUVOT01FTSIpOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwl9CisKKwl3cml0ZV9sb2NrX2JoKCZyeHJwY19wZWVyX2xvY2spOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShwZWVyLCAmcnhycGNfcGVlcnMsIGxpbmspIHsKKwkJaWYgKGF0b21pY19yZWFkKCZwZWVyLT51c2FnZSkgPiAwICYmCisJCSAgICBwZWVyLT5zcngudHJhbnNwb3J0X3R5cGUgPT0gc3J4LT50cmFuc3BvcnRfdHlwZSAmJgorCQkgICAgcGVlci0+c3J4LnRyYW5zcG9ydF9sZW4gPT0gc3J4LT50cmFuc3BvcnRfbGVuICYmCisJCSAgICBtZW1jbXAoJnBlZXItPnNyeC50cmFuc3BvcnQsCisJCQkgICAmc3J4LT50cmFuc3BvcnQsCisJCQkgICBzcngtPnRyYW5zcG9ydF9sZW4pID09IDApCisJCQlnb3RvIGZvdW5kX2V4dGFudF9zZWNvbmQ7CisJfQorCisJLyogd2UgY2FuIG5vdyBhZGQgdGhlIG5ldyBjYW5kaWRhdGUgdG8gdGhlIGxpc3QgKi8KKwlwZWVyID0gY2FuZGlkYXRlOworCWNhbmRpZGF0ZSA9IE5VTEw7CisKKwlsaXN0X2FkZF90YWlsKCZwZWVyLT5saW5rLCAmcnhycGNfcGVlcnMpOworCXdyaXRlX3VubG9ja19iaCgmcnhycGNfcGVlcl9sb2NrKTsKKwluZXcgPSAibmV3IjsKKworc3VjY2VzczoKKwlfbmV0KCJQRUVSICVzICVkIHslZCwldSwldS4ldS4ldS4ldSslaHV9IiwKKwkgICAgIG5ldywKKwkgICAgIHBlZXItPmRlYnVnX2lkLAorCSAgICAgcGVlci0+c3J4LnRyYW5zcG9ydF90eXBlLAorCSAgICAgcGVlci0+c3J4LnRyYW5zcG9ydC5mYW1pbHksCisJICAgICBOSVBRVUFEKHBlZXItPnNyeC50cmFuc3BvcnQuc2luLnNpbl9hZGRyKSwKKwkgICAgIG50b2hzKHBlZXItPnNyeC50cmFuc3BvcnQuc2luLnNpbl9wb3J0KSk7CisKKwlfbGVhdmUoIiA9ICVwIHt1PSVkfSIsIHBlZXIsIGF0b21pY19yZWFkKCZwZWVyLT51c2FnZSkpOworCXJldHVybiBwZWVyOworCisJLyogd2UgZm91bmQgdGhlIHBlZXIgaW4gdGhlIGxpc3QgaW1tZWRpYXRlbHkgKi8KK2ZvdW5kX2V4dGFudF9wZWVyOgorCXVzYWdlID0gYXRvbWljX2luY19yZXR1cm4oJnBlZXItPnVzYWdlKTsKKwlyZWFkX3VubG9ja19iaCgmcnhycGNfcGVlcl9sb2NrKTsKKwlnb3RvIHN1Y2Nlc3M7CisKKwkvKiB3ZSBmb3VuZCB0aGUgcGVlciBvbiB0aGUgc2Vjb25kIHRpbWUgdGhyb3VnaCB0aGUgbGlzdCAqLworZm91bmRfZXh0YW50X3NlY29uZDoKKwl1c2FnZSA9IGF0b21pY19pbmNfcmV0dXJuKCZwZWVyLT51c2FnZSk7CisJd3JpdGVfdW5sb2NrX2JoKCZyeHJwY19wZWVyX2xvY2spOworCWtmcmVlKGNhbmRpZGF0ZSk7CisJZ290byBzdWNjZXNzOworfQorCisvKgorICogZmluZCB0aGUgcGVlciBhc3NvY2lhdGVkIHdpdGggYSBwYWNrZXQKKyAqLworc3RydWN0IHJ4cnBjX3BlZXIgKnJ4cnBjX2ZpbmRfcGVlcihzdHJ1Y3QgcnhycGNfbG9jYWwgKmxvY2FsLAorCQkJCSAgIF9fYmUzMiBhZGRyLCBfX2JlMTYgcG9ydCkKK3sKKwlzdHJ1Y3QgcnhycGNfcGVlciAqcGVlcjsKKworCV9lbnRlcigiIik7CisKKwkvKiBzZWFyY2ggdGhlIHBlZXIgbGlzdCAqLworCXJlYWRfbG9ja19iaCgmcnhycGNfcGVlcl9sb2NrKTsKKworCWlmIChsb2NhbC0+c3J4LnRyYW5zcG9ydC5mYW1pbHkgPT0gQUZfSU5FVCAmJgorCSAgICBsb2NhbC0+c3J4LnRyYW5zcG9ydF90eXBlID09IFNPQ0tfREdSQU0KKwkgICAgKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkocGVlciwgJnJ4cnBjX3BlZXJzLCBsaW5rKSB7CisJCQlpZiAoYXRvbWljX3JlYWQoJnBlZXItPnVzYWdlKSA+IDAgJiYKKwkJCSAgICBwZWVyLT5zcngudHJhbnNwb3J0X3R5cGUgPT0gU09DS19ER1JBTSAmJgorCQkJICAgIHBlZXItPnNyeC50cmFuc3BvcnQuZmFtaWx5ID09IEFGX0lORVQgJiYKKwkJCSAgICBwZWVyLT5zcngudHJhbnNwb3J0LnNpbi5zaW5fcG9ydCA9PSBwb3J0ICYmCisJCQkgICAgcGVlci0+c3J4LnRyYW5zcG9ydC5zaW4uc2luX2FkZHIuc19hZGRyID09IGFkZHIpCisJCQkJZ290byBmb3VuZF9VRFBfcGVlcjsKKwkJfQorCisJCWdvdG8gbmV3X1VEUF9wZWVyOworCX0KKworCXJlYWRfdW5sb2NrX2JoKCZyeHJwY19wZWVyX2xvY2spOworCV9sZWF2ZSgiID0gLUVBRk5PU1VQUE9SVCIpOworCXJldHVybiBFUlJfUFRSKC1FQUZOT1NVUFBPUlQpOworCitmb3VuZF9VRFBfcGVlcjoKKwlfbmV0KCJSeCBVRFAgREdSQU0gZnJvbSBwZWVyICVkIiwgcGVlci0+ZGVidWdfaWQpOworCWF0b21pY19pbmMoJnBlZXItPnVzYWdlKTsKKwlyZWFkX3VubG9ja19iaCgmcnhycGNfcGVlcl9sb2NrKTsKKwlfbGVhdmUoIiA9ICVwIiwgcGVlcik7CisJcmV0dXJuIHBlZXI7CisKK25ld19VRFBfcGVlcjoKKwlfbmV0KCJSeCBVRFAgREdSQU0gZnJvbSBORVcgcGVlciAlZCIsIHBlZXItPmRlYnVnX2lkKTsKKwlyZWFkX3VubG9ja19iaCgmcnhycGNfcGVlcl9sb2NrKTsKKwlfbGVhdmUoIiA9IC1FQlVTWSBbbmV3XSIpOworCXJldHVybiBFUlJfUFRSKC1FQlVTWSk7Cit9CisKKy8qCisgKiByZWxlYXNlIGEgcmVtb3RlIHRyYW5zcG9ydCBlbmRwb2ludAorICovCit2b2lkIHJ4cnBjX3B1dF9wZWVyKHN0cnVjdCByeHJwY19wZWVyICpwZWVyKQoreworCV9lbnRlcigiJXB7dT0lZH0iLCBwZWVyLCBhdG9taWNfcmVhZCgmcGVlci0+dXNhZ2UpKTsKKworCUFTU0VSVENNUChhdG9taWNfcmVhZCgmcGVlci0+dXNhZ2UpLCA+LCAwKTsKKworCWlmIChsaWtlbHkoIWF0b21pY19kZWNfYW5kX3Rlc3QoJnBlZXItPnVzYWdlKSkpIHsKKwkJX2xlYXZlKCIgW2luIHVzZV0iKTsKKwkJcmV0dXJuOworCX0KKworCXJ4cnBjX3F1ZXVlX3dvcmsoJnBlZXItPmRlc3Ryb3llcik7CisJX2xlYXZlKCIiKTsKK30KKworLyoKKyAqIGRlc3Ryb3kgYSByZW1vdGUgdHJhbnNwb3J0IGVuZHBvaW50CisgKi8KK3N0YXRpYyB2b2lkIHJ4cnBjX2Rlc3Ryb3lfcGVlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHJ4cnBjX3BlZXIgKnBlZXIgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHJ4cnBjX3BlZXIsIGRlc3Ryb3llcik7CisKKwlfZW50ZXIoIiVweyVkfSIsIHBlZXIsIGF0b21pY19yZWFkKCZwZWVyLT51c2FnZSkpOworCisJd3JpdGVfbG9ja19iaCgmcnhycGNfcGVlcl9sb2NrKTsKKwlsaXN0X2RlbCgmcGVlci0+bGluayk7CisJd3JpdGVfdW5sb2NrX2JoKCZyeHJwY19wZWVyX2xvY2spOworCisJX25ldCgiREVTVFJPWSBQRUVSICVkIiwgcGVlci0+ZGVidWdfaWQpOworCWtmcmVlKHBlZXIpOworCisJaWYgKGxpc3RfZW1wdHkoJnJ4cnBjX3BlZXJzKSkKKwkJd2FrZV91cF9hbGwoJnJ4cnBjX3BlZXJfd3EpOworCV9sZWF2ZSgiIik7Cit9CisKKy8qCisgKiBwcmVlbXB0aXZlbHkgZGVzdHJveSBhbGwgdGhlIHBlZXIgcmVjb3JkcyBmcm9tIGEgdHJhbnNwb3J0IGVuZHBvaW50IHJhdGhlcgorICogdGhhbiB3YWl0aW5nIGZvciB0aGVtIHRvIHRpbWUgb3V0CisgKi8KK3ZvaWQgX19leGl0IHJ4cnBjX2Rlc3Ryb3lfYWxsX3BlZXJzKHZvaWQpCit7CisJREVDTEFSRV9XQUlUUVVFVUUobXlzZWxmLGN1cnJlbnQpOworCisJX2VudGVyKCIiKTsKKworCS8qIHdlIHNpbXBseSBoYXZlIHRvIHdhaXQgZm9yIHRoZW0gdG8gZ28gYXdheSAqLworCWlmICghbGlzdF9lbXB0eSgmcnhycGNfcGVlcnMpKSB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJYWRkX3dhaXRfcXVldWUoJnJ4cnBjX3BlZXJfd3EsICZteXNlbGYpOworCisJCXdoaWxlICghbGlzdF9lbXB0eSgmcnhycGNfcGVlcnMpKSB7CisJCQlzY2hlZHVsZSgpOworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQl9CisKKwkJcmVtb3ZlX3dhaXRfcXVldWUoJnJ4cnBjX3BlZXJfd3EsICZteXNlbGYpOworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCX0KKworCV9sZWF2ZSgiIik7Cit9CmRpZmYgLS1naXQgYS9uZXQvcnhycGMvYXItcHJvYy5jIGIvbmV0L3J4cnBjL2FyLXByb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGY0YjRlCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3J4cnBjL2FyLXByb2MuYwpAQCAtMCwwICsxLDI0NyBAQAorLyogL3Byb2MvbmV0LyBzdXBwb3J0IGZvciBBRl9SWFJQQworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxuZXQvYWZfcnhycGMuaD4KKyNpbmNsdWRlICJhci1pbnRlcm5hbC5oIgorCitzdGF0aWMgY29uc3QgY2hhciAqcnhycGNfY29ubl9zdGF0ZXNbXSA9IHsKKwlbUlhSUENfQ09OTl9VTlVTRURdCQk9ICJVbnVzZWQgICIsCisJW1JYUlBDX0NPTk5fQ0xJRU5UXQkJPSAiQ2xpZW50ICAiLAorCVtSWFJQQ19DT05OX1NFUlZFUl9VTlNFQ1VSRURdCT0gIlN2VW5zZWMgIiwKKwlbUlhSUENfQ09OTl9TRVJWRVJfQ0hBTExFTkdJTkddCT0gIlN2Q2hhbGwgIiwKKwlbUlhSUENfQ09OTl9TRVJWRVJdCQk9ICJTdlNlY3VyZSIsCisJW1JYUlBDX0NPTk5fUkVNT1RFTFlfQUJPUlRFRF0JPSAiUm10QWJvcnQiLAorCVtSWFJQQ19DT05OX0xPQ0FMTFlfQUJPUlRFRF0JPSAiTG9jQWJvcnQiLAorCVtSWFJQQ19DT05OX05FVFdPUktfRVJST1JdCT0gIk5ldEVycm9yIiwKK307CisKK2NvbnN0IGNoYXIgKnJ4cnBjX2NhbGxfc3RhdGVzW10gPSB7CisJW1JYUlBDX0NBTExfQ0xJRU5UX1NFTkRfUkVRVUVTVF0JPSAiQ2xTbmRSZXEiLAorCVtSWFJQQ19DQUxMX0NMSUVOVF9BV0FJVF9SRVBMWV0JCT0gIkNsQXd0UnBsIiwKKwlbUlhSUENfQ0FMTF9DTElFTlRfUkVDVl9SRVBMWV0JCT0gIkNsUmN2UnBsIiwKKwlbUlhSUENfQ0FMTF9DTElFTlRfRklOQUxfQUNLXQkJPSAiQ2xGbmxBQ0siLAorCVtSWFJQQ19DQUxMX1NFUlZFUl9TRUNVUklOR10JCT0gIlN2U2VjdXJlIiwKKwlbUlhSUENfQ0FMTF9TRVJWRVJfQUNDRVBUSU5HXQkJPSAiU3ZBY2NlcHQiLAorCVtSWFJQQ19DQUxMX1NFUlZFUl9SRUNWX1JFUVVFU1RdCT0gIlN2UmN2UmVxIiwKKwlbUlhSUENfQ0FMTF9TRVJWRVJfQUNLX1JFUVVFU1RdCQk9ICJTdkFja1JlcSIsCisJW1JYUlBDX0NBTExfU0VSVkVSX1NFTkRfUkVQTFldCQk9ICJTdlNuZFJwbCIsCisJW1JYUlBDX0NBTExfU0VSVkVSX0FXQUlUX0FDS10JCT0gIlN2QXd0QUNLIiwKKwlbUlhSUENfQ0FMTF9DT01QTEVURV0JCQk9ICJDb21wbGV0ZSIsCisJW1JYUlBDX0NBTExfU0VSVkVSX0JVU1ldCQk9ICJTdkJ1c3kgICIsCisJW1JYUlBDX0NBTExfUkVNT1RFTFlfQUJPUlRFRF0JCT0gIlJtdEFib3J0IiwKKwlbUlhSUENfQ0FMTF9MT0NBTExZX0FCT1JURURdCQk9ICJMb2NBYm9ydCIsCisJW1JYUlBDX0NBTExfTkVUV09SS19FUlJPUl0JCT0gIk5ldEVycm9yIiwKKwlbUlhSUENfQ0FMTF9ERUFEXQkJCT0gIkRlYWQgICAgIiwKK307CisKKy8qCisgKiBnZW5lcmF0ZSBhIGxpc3Qgb2YgZXh0YW50IGFuZCBkZWFkIGNhbGxzIGluIC9wcm9jL25ldC9yeHJwY19jYWxscworICovCitzdGF0aWMgdm9pZCAqcnhycGNfY2FsbF9zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqX3BvcykKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpfcDsKKwlsb2ZmX3QgcG9zID0gKl9wb3M7CisKKwlyZWFkX2xvY2soJnJ4cnBjX2NhbGxfbG9jayk7CisJaWYgKCFwb3MpCisJCXJldHVybiBTRVFfU1RBUlRfVE9LRU47CisJcG9zLS07CisKKwlsaXN0X2Zvcl9lYWNoKF9wLCAmcnhycGNfY2FsbHMpCisJCWlmICghcG9zLS0pCisJCQlicmVhazsKKworCXJldHVybiBfcCAhPSAmcnhycGNfY2FsbHMgPyBfcCA6IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkICpyeHJwY19jYWxsX3NlcV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpfcDsKKworCSgqcG9zKSsrOworCisJX3AgPSB2OworCV9wID0gKHYgPT0gU0VRX1NUQVJUX1RPS0VOKSA/IHJ4cnBjX2NhbGxzLm5leHQgOiBfcC0+bmV4dDsKKworCXJldHVybiBfcCAhPSAmcnhycGNfY2FsbHMgPyBfcCA6IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHJ4cnBjX2NhbGxfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJcmVhZF91bmxvY2soJnJ4cnBjX2NhbGxfbG9jayk7Cit9CisKK3N0YXRpYyBpbnQgcnhycGNfY2FsbF9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICp0cmFuczsKKwlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbDsKKwljaGFyIGxidWZmWzQgKyA0ICsgNCArIDQgKyA1ICsgMV0sIHJidWZmWzQgKyA0ICsgNCArIDQgKyA1ICsgMV07CisKKwlpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pIHsKKwkJc2VxX3B1dHMoc2VxLAorCQkJICJQcm90byBMb2NhbCAgICAgICAgICAgICAgICAgIFJlbW90ZSAgICAgICAgICAgICAgICAiCisJCQkgIiBTdklEIENvbm5JRCAgIENhbGxJRCAgIEVuZCBVc2UgU3RhdGUgICAgQWJvcnQgICAiCisJCQkgIiBVc2VySURcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwljYWxsID0gbGlzdF9lbnRyeSh2LCBzdHJ1Y3QgcnhycGNfY2FsbCwgbGluayk7CisJdHJhbnMgPSBjYWxsLT5jb25uLT50cmFuczsKKworCXNwcmludGYobGJ1ZmYsIE5JUFFVQURfRk1UIjoldSIsCisJCU5JUFFVQUQodHJhbnMtPmxvY2FsLT5zcngudHJhbnNwb3J0LnNpbi5zaW5fYWRkciksCisJCW50b2hzKHRyYW5zLT5sb2NhbC0+c3J4LnRyYW5zcG9ydC5zaW4uc2luX3BvcnQpKTsKKworCXNwcmludGYocmJ1ZmYsIE5JUFFVQURfRk1UIjoldSIsCisJCU5JUFFVQUQodHJhbnMtPnBlZXItPnNyeC50cmFuc3BvcnQuc2luLnNpbl9hZGRyKSwKKwkJbnRvaHModHJhbnMtPnBlZXItPnNyeC50cmFuc3BvcnQuc2luLnNpbl9wb3J0KSk7CisKKwlzZXFfcHJpbnRmKHNlcSwKKwkJICAgIlVEUCAgICUtMjIuMjJzICUtMjIuMjJzICU0eCAlMDh4ICUwOHggJXMgJTN1IgorCQkgICAiICUtOC44cyAlMDh4ICVseFxuIiwKKwkJICAgbGJ1ZmYsCisJCSAgIHJidWZmLAorCQkgICBudG9ocyhjYWxsLT5jb25uLT5zZXJ2aWNlX2lkKSwKKwkJICAgbnRvaGwoY2FsbC0+Y29ubi0+Y2lkKSwKKwkJICAgbnRvaGwoY2FsbC0+Y2FsbF9pZCksCisJCSAgIGNhbGwtPmNvbm4tPmluX2NsaWVudGZsYWcgPyAiU3ZjIiA6ICJDbHQiLAorCQkgICBhdG9taWNfcmVhZCgmY2FsbC0+dXNhZ2UpLAorCQkgICByeHJwY19jYWxsX3N0YXRlc1tjYWxsLT5zdGF0ZV0sCisJCSAgIGNhbGwtPmFib3J0X2NvZGUsCisJCSAgIGNhbGwtPnVzZXJfY2FsbF9JRCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyByeHJwY19jYWxsX3NlcV9vcHMgPSB7CisJLnN0YXJ0ICA9IHJ4cnBjX2NhbGxfc2VxX3N0YXJ0LAorCS5uZXh0ICAgPSByeHJwY19jYWxsX3NlcV9uZXh0LAorCS5zdG9wICAgPSByeHJwY19jYWxsX3NlcV9zdG9wLAorCS5zaG93ICAgPSByeHJwY19jYWxsX3NlcV9zaG93LAorfTsKKworc3RhdGljIGludCByeHJwY19jYWxsX3NlcV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzZXFfb3BlbihmaWxlLCAmcnhycGNfY2FsbF9zZXFfb3BzKTsKK30KKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByeHJwY19jYWxsX3NlcV9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkub3BlbgkJPSByeHJwY19jYWxsX3NlcV9vcGVuLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2VxX3JlbGVhc2VfcHJpdmF0ZSwKK307CisKKy8qCisgKiBnZW5lcmF0ZSBhIGxpc3Qgb2YgZXh0YW50IHZpcnR1YWwgY29ubmVjdGlvbnMgaW4gL3Byb2MvbmV0L3J4cnBjX2Nvbm5zCisgKi8KK3N0YXRpYyB2b2lkICpyeHJwY19jb25uZWN0aW9uX3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpfcG9zKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKl9wOworCWxvZmZfdCBwb3MgPSAqX3BvczsKKworCXJlYWRfbG9jaygmcnhycGNfY29ubmVjdGlvbl9sb2NrKTsKKwlpZiAoIXBvcykKKwkJcmV0dXJuIFNFUV9TVEFSVF9UT0tFTjsKKwlwb3MtLTsKKworCWxpc3RfZm9yX2VhY2goX3AsICZyeHJwY19jb25uZWN0aW9ucykKKwkJaWYgKCFwb3MtLSkKKwkJCWJyZWFrOworCisJcmV0dXJuIF9wICE9ICZyeHJwY19jb25uZWN0aW9ucyA/IF9wIDogTlVMTDsKK30KKworc3RhdGljIHZvaWQgKnJ4cnBjX2Nvbm5lY3Rpb25fc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYsCisJCQkJICAgICAgIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKl9wOworCisJKCpwb3MpKys7CisKKwlfcCA9IHY7CisJX3AgPSAodiA9PSBTRVFfU1RBUlRfVE9LRU4pID8gcnhycGNfY29ubmVjdGlvbnMubmV4dCA6IF9wLT5uZXh0OworCisJcmV0dXJuIF9wICE9ICZyeHJwY19jb25uZWN0aW9ucyA/IF9wIDogTlVMTDsKK30KKworc3RhdGljIHZvaWQgcnhycGNfY29ubmVjdGlvbl9zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlyZWFkX3VubG9jaygmcnhycGNfY29ubmVjdGlvbl9sb2NrKTsKK30KKworc3RhdGljIGludCByeHJwY19jb25uZWN0aW9uX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCXN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uOworCXN0cnVjdCByeHJwY190cmFuc3BvcnQgKnRyYW5zOworCWNoYXIgbGJ1ZmZbNCArIDQgKyA0ICsgNCArIDUgKyAxXSwgcmJ1ZmZbNCArIDQgKyA0ICsgNCArIDUgKyAxXTsKKworCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikgeworCQlzZXFfcHV0cyhzZXEsCisJCQkgIlByb3RvIExvY2FsICAgICAgICAgICAgICAgICAgUmVtb3RlICAgICAgICAgICAgICAgICIKKwkJCSAiIFN2SUQgQ29ubklEICAgQ2FsbHMgICAgRW5kIFVzZSBTdGF0ZSAgICBLZXkgICAgICIKKwkJCSAiIFNlcmlhbCAgIElTZXJpYWxcbiIKKwkJCSApOworCQlyZXR1cm4gMDsKKwl9CisKKwljb25uID0gbGlzdF9lbnRyeSh2LCBzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiwgbGluayk7CisJdHJhbnMgPSBjb25uLT50cmFuczsKKworCXNwcmludGYobGJ1ZmYsIE5JUFFVQURfRk1UIjoldSIsCisJCU5JUFFVQUQodHJhbnMtPmxvY2FsLT5zcngudHJhbnNwb3J0LnNpbi5zaW5fYWRkciksCisJCW50b2hzKHRyYW5zLT5sb2NhbC0+c3J4LnRyYW5zcG9ydC5zaW4uc2luX3BvcnQpKTsKKworCXNwcmludGYocmJ1ZmYsIE5JUFFVQURfRk1UIjoldSIsCisJCU5JUFFVQUQodHJhbnMtPnBlZXItPnNyeC50cmFuc3BvcnQuc2luLnNpbl9hZGRyKSwKKwkJbnRvaHModHJhbnMtPnBlZXItPnNyeC50cmFuc3BvcnQuc2luLnNpbl9wb3J0KSk7CisKKwlzZXFfcHJpbnRmKHNlcSwKKwkJICAgIlVEUCAgICUtMjIuMjJzICUtMjIuMjJzICU0eCAlMDh4ICUwOHggJXMgJTN1IgorCQkgICAiICVzICUwOHggJTA4eCAlMDh4XG4iLAorCQkgICBsYnVmZiwKKwkJICAgcmJ1ZmYsCisJCSAgIG50b2hzKGNvbm4tPnNlcnZpY2VfaWQpLAorCQkgICBudG9obChjb25uLT5jaWQpLAorCQkgICBjb25uLT5jYWxsX2NvdW50ZXIsCisJCSAgIGNvbm4tPmluX2NsaWVudGZsYWcgPyAiU3ZjIiA6ICJDbHQiLAorCQkgICBhdG9taWNfcmVhZCgmY29ubi0+dXNhZ2UpLAorCQkgICByeHJwY19jb25uX3N0YXRlc1tjb25uLT5zdGF0ZV0sCisJCSAgIGtleV9zZXJpYWwoY29ubi0+a2V5KSwKKwkJICAgYXRvbWljX3JlYWQoJmNvbm4tPnNlcmlhbCksCisJCSAgIGF0b21pY19yZWFkKCZjb25uLT5oaV9zZXJpYWwpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIHJ4cnBjX2Nvbm5lY3Rpb25fc2VxX29wcyA9IHsKKwkuc3RhcnQgID0gcnhycGNfY29ubmVjdGlvbl9zZXFfc3RhcnQsCisJLm5leHQgICA9IHJ4cnBjX2Nvbm5lY3Rpb25fc2VxX25leHQsCisJLnN0b3AgICA9IHJ4cnBjX2Nvbm5lY3Rpb25fc2VxX3N0b3AsCisJLnNob3cgICA9IHJ4cnBjX2Nvbm5lY3Rpb25fc2VxX3Nob3csCit9OworCisKK3N0YXRpYyBpbnQgcnhycGNfY29ubmVjdGlvbl9zZXFfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2VxX29wZW4oZmlsZSwgJnJ4cnBjX2Nvbm5lY3Rpb25fc2VxX29wcyk7Cit9CisKK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgcnhycGNfY29ubmVjdGlvbl9zZXFfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm9wZW4JCT0gcnhycGNfY29ubmVjdGlvbl9zZXFfb3BlbiwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkubGxzZWVrCQk9IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9IHNlcV9yZWxlYXNlX3ByaXZhdGUsCit9OwpkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL2FyLXJlY3Ztc2cuYyBiL25ldC9yeHJwYy9hci1yZWN2bXNnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE5MTIxZAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9yeHJwYy9hci1yZWN2bXNnLmMKQEAgLTAsMCArMSw0MzcgQEAKKy8qIFJ4UlBDIHJlY3Ztc2coKSBpbXBsZW1lbnRhdGlvbgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxuZXQvYWZfcnhycGMuaD4KKyNpbmNsdWRlICJhci1pbnRlcm5hbC5oIgorCisvKgorICogcmVtb3ZhbCBhIGNhbGwncyB1c2VyIElEIGZyb20gdGhlIHNvY2tldCB0cmVlIHRvIG1ha2UgdGhlIHVzZXIgSUQgYXZhaWxhYmxlCisgKiBhZ2FpbiBhbmQgc28gdGhhdCBpdCB3b24ndCBiZSBzZWVuIGFnYWluIGluIGFzc29jaWF0aW9uIHdpdGggdGhhdCBjYWxsCisgKi8KK3ZvaWQgcnhycGNfcmVtb3ZlX3VzZXJfSUQoc3RydWN0IHJ4cnBjX3NvY2sgKnJ4LCBzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCkKK3sKKwlfZGVidWcoIlJFTEVBU0UgQ0FMTCAlZCIsIGNhbGwtPmRlYnVnX2lkKTsKKworCWlmICh0ZXN0X2JpdChSWFJQQ19DQUxMX0hBU19VU0VSSUQsICZjYWxsLT5mbGFncykpIHsKKwkJd3JpdGVfbG9ja19iaCgmcngtPmNhbGxfbG9jayk7CisJCXJiX2VyYXNlKCZjYWxsLT5zb2NrX25vZGUsICZjYWxsLT5zb2NrZXQtPmNhbGxzKTsKKwkJY2xlYXJfYml0KFJYUlBDX0NBTExfSEFTX1VTRVJJRCwgJmNhbGwtPmZsYWdzKTsKKwkJd3JpdGVfdW5sb2NrX2JoKCZyeC0+Y2FsbF9sb2NrKTsKKwl9CisKKwlyZWFkX2xvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOworCWlmICghdGVzdF9iaXQoUlhSUENfQ0FMTF9SRUxFQVNFRCwgJmNhbGwtPmZsYWdzKSAmJgorCSAgICAhdGVzdF9hbmRfc2V0X2JpdChSWFJQQ19DQUxMX1JFTEVBU0UsICZjYWxsLT5ldmVudHMpKQorCQlyeHJwY19xdWV1ZV9jYWxsKGNhbGwpOworCXJlYWRfdW5sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKK30KKworLyoKKyAqIHJlY2VpdmUgYSBtZXNzYWdlIGZyb20gYW4gUnhSUEMgc29ja2V0CisgKiAtIHdlIG5lZWQgdG8gYmUgY2FyZWZ1bCBhYm91dCB0d28gb3IgbW9yZSB0aHJlYWRzIGNhbGxpbmcgcmVjdm1zZworICogICBzaW11bHRhbmVvdXNseQorICovCitpbnQgcnhycGNfcmVjdm1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCisJCSAgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuLCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IHJ4cnBjX3NrYl9wcml2ICpzcDsKKwlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCA9IE5VTEwsICpjb250aW51ZV9jYWxsID0gTlVMTDsKKwlzdHJ1Y3QgcnhycGNfc29jayAqcnggPSByeHJwY19zayhzb2NrLT5zayk7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlsb25nIHRpbWVvOworCWludCBjb3B5LCByZXQsIHVsbGVuLCBvZmZzZXQsIGNvcGllZCA9IDA7CisJdTMyIGFib3J0X2NvZGU7CisKKwlERUZJTkVfV0FJVCh3YWl0KTsKKworCV9lbnRlcigiLCwsJXp1LCVkIiwgbGVuLCBmbGFncyk7CisKKwlpZiAoZmxhZ3MgJiAoTVNHX09PQiB8IE1TR19UUlVOQykpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCXVsbGVuID0gbXNnLT5tc2dfZmxhZ3MgJiBNU0dfQ01TR19DT01QQVQgPyA0IDogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOworCisJdGltZW8gPSBzb2NrX3JjdnRpbWVvKCZyeC0+c2ssIGZsYWdzICYgTVNHX0RPTlRXQUlUKTsKKwltc2ctPm1zZ19mbGFncyB8PSBNU0dfTU9SRTsKKworCWxvY2tfc29jaygmcngtPnNrKTsKKworCWZvciAoOzspIHsKKwkJLyogcmV0dXJuIGltbWVkaWF0ZWx5IGlmIGEgY2xpZW50IHNvY2tldCBoYXMgbm8gb3V0c3RhbmRpbmcKKwkJICogY2FsbHMgKi8KKwkJaWYgKFJCX0VNUFRZX1JPT1QoJnJ4LT5jYWxscykpIHsKKwkJCWlmIChjb3BpZWQpCisJCQkJZ290byBvdXQ7CisJCQlpZiAocngtPnNrLnNrX3N0YXRlICE9IFJYUlBDX1NFUlZFUl9MSVNURU5JTkcpIHsKKwkJCQlyZWxlYXNlX3NvY2soJnJ4LT5zayk7CisJCQkJaWYgKGNvbnRpbnVlX2NhbGwpCisJCQkJCXJ4cnBjX3B1dF9jYWxsKGNvbnRpbnVlX2NhbGwpOworCQkJCXJldHVybiAtRU5PREFUQTsKKwkJCX0KKwkJfQorCisJCS8qIGdldCB0aGUgbmV4dCBtZXNzYWdlIG9uIHRoZSBSeCBxdWV1ZSAqLworCQlza2IgPSBza2JfcGVlaygmcngtPnNrLnNrX3JlY2VpdmVfcXVldWUpOworCQlpZiAoIXNrYikgeworCQkJLyogbm90aGluZyByZW1haW5zIG9uIHRoZSBxdWV1ZSAqLworCQkJaWYgKGNvcGllZCAmJgorCQkJICAgIChtc2ctPm1zZ19mbGFncyAmIE1TR19QRUVLIHx8IHRpbWVvID09IDApKQorCQkJCWdvdG8gb3V0OworCisJCQkvKiB3YWl0IGZvciBhIG1lc3NhZ2UgdG8gdHVybiB1cCAqLworCQkJcmVsZWFzZV9zb2NrKCZyeC0+c2spOworCQkJcHJlcGFyZV90b193YWl0X2V4Y2x1c2l2ZShyeC0+c2suc2tfc2xlZXAsICZ3YWl0LAorCQkJCQkJICBUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJcmV0ID0gc29ja19lcnJvcigmcngtPnNrKTsKKwkJCWlmIChyZXQpCisJCQkJZ290byB3YWl0X2Vycm9yOworCisJCQlpZiAoc2tiX3F1ZXVlX2VtcHR5KCZyeC0+c2suc2tfcmVjZWl2ZV9xdWV1ZSkpIHsKKwkJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQkJCWdvdG8gd2FpdF9pbnRlcnJ1cHRlZDsKKwkJCQl0aW1lbyA9IHNjaGVkdWxlX3RpbWVvdXQodGltZW8pOworCQkJfQorCQkJZmluaXNoX3dhaXQocngtPnNrLnNrX3NsZWVwLCAmd2FpdCk7CisJCQlsb2NrX3NvY2soJnJ4LT5zayk7CisJCQljb250aW51ZTsKKwkJfQorCisJcGVla19uZXh0X3BhY2tldDoKKwkJc3AgPSByeHJwY19za2Ioc2tiKTsKKwkJY2FsbCA9IHNwLT5jYWxsOworCQlBU1NFUlQoY2FsbCAhPSBOVUxMKTsKKworCQlfZGVidWcoIm5leHQgcGt0ICVzIiwgcnhycGNfcGt0c1tzcC0+aGRyLnR5cGVdKTsKKworCQkvKiBtYWtlIHN1cmUgd2Ugd2FpdCBmb3IgdGhlIHN0YXRlIHRvIGJlIHVwZGF0ZWQgaW4gdGhpcyBjYWxsICovCisJCXNwaW5fbG9ja19iaCgmY2FsbC0+bG9jayk7CisJCXNwaW5fdW5sb2NrX2JoKCZjYWxsLT5sb2NrKTsKKworCQlpZiAodGVzdF9iaXQoUlhSUENfQ0FMTF9SRUxFQVNFRCwgJmNhbGwtPmZsYWdzKSkgeworCQkJX2RlYnVnKCJwYWNrZXQgZnJvbSByZWxlYXNlZCBjYWxsIik7CisJCQlpZiAoc2tiX2RlcXVldWUoJnJ4LT5zay5za19yZWNlaXZlX3F1ZXVlKSAhPSBza2IpCisJCQkJQlVHKCk7CisJCQlyeHJwY19mcmVlX3NrYihza2IpOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBkZXRlcm1pbmUgd2hldGhlciB0byBjb250aW51ZSBsYXN0IGRhdGEgcmVjZWl2ZSAqLworCQlpZiAoY29udGludWVfY2FsbCkgeworCQkJX2RlYnVnKCJtYXliZSBjb250Iik7CisJCQlpZiAoY2FsbCAhPSBjb250aW51ZV9jYWxsIHx8CisJCQkgICAgc2tiLT5tYXJrICE9IFJYUlBDX1NLQl9NQVJLX0RBVEEpIHsKKwkJCQlyZWxlYXNlX3NvY2soJnJ4LT5zayk7CisJCQkJcnhycGNfcHV0X2NhbGwoY29udGludWVfY2FsbCk7CisJCQkJX2xlYXZlKCIgPSAlZCBbbm9uY29udF0iLCBjb3BpZWQpOworCQkJCXJldHVybiBjb3BpZWQ7CisJCQl9CisJCX0KKworCQlyeHJwY19nZXRfY2FsbChjYWxsKTsKKworCQkvKiBjb3B5IHRoZSBwZWVyIGFkZHJlc3MgYW5kIHRpbWVzdGFtcCAqLworCQlpZiAoIWNvbnRpbnVlX2NhbGwpIHsKKwkJCWlmIChtc2ctPm1zZ19uYW1lICYmIG1zZy0+bXNnX25hbWVsZW4gPiAwKQorCQkJCW1lbWNweSgmbXNnLT5tc2dfbmFtZSwgJmNhbGwtPmNvbm4tPnRyYW5zLT5wZWVyLT5zcngsCisJCQkJICAgICAgIHNpemVvZihjYWxsLT5jb25uLT50cmFucy0+cGVlci0+c3J4KSk7CisJCQlzb2NrX3JlY3ZfdGltZXN0YW1wKG1zZywgJnJ4LT5zaywgc2tiKTsKKwkJfQorCisJCS8qIHJlY2VpdmUgdGhlIG1lc3NhZ2UgKi8KKwkJaWYgKHNrYi0+bWFyayAhPSBSWFJQQ19TS0JfTUFSS19EQVRBKQorCQkJZ290byByZWNlaXZlX25vbl9kYXRhX21lc3NhZ2U7CisKKwkJX2RlYnVnKCJyZWN2bXNnIERBVEEgIyV1IHsgJWQsICVkIH0iLAorCQkgICAgICAgbnRvaGwoc3AtPmhkci5zZXEpLCBza2ItPmxlbiwgc3AtPm9mZnNldCk7CisKKwkJaWYgKCFjb250aW51ZV9jYWxsKSB7CisJCQkvKiBvbmx5IHNldCB0aGUgY29udHJvbCBkYXRhIG9uY2UgcGVyIHJlY3Ztc2coKSAqLworCQkJcmV0ID0gcHV0X2Ntc2cobXNnLCBTT0xfUlhSUEMsIFJYUlBDX1VTRVJfQ0FMTF9JRCwKKwkJCQkgICAgICAgdWxsZW4sICZjYWxsLT51c2VyX2NhbGxfSUQpOworCQkJaWYgKHJldCA8IDApCisJCQkJZ290byBjb3B5X2Vycm9yOworCQkJQVNTRVJUKHRlc3RfYml0KFJYUlBDX0NBTExfSEFTX1VTRVJJRCwgJmNhbGwtPmZsYWdzKSk7CisJCX0KKworCQlBU1NFUlRDTVAobnRvaGwoc3AtPmhkci5zZXEpLCA+PSwgY2FsbC0+cnhfZGF0YV9yZWN2KTsKKwkJQVNTRVJUQ01QKG50b2hsKHNwLT5oZHIuc2VxKSwgPD0sIGNhbGwtPnJ4X2RhdGFfcmVjdiArIDEpOworCQljYWxsLT5yeF9kYXRhX3JlY3YgPSBudG9obChzcC0+aGRyLnNlcSk7CisKKwkJQVNTRVJUQ01QKG50b2hsKHNwLT5oZHIuc2VxKSwgPiwgY2FsbC0+cnhfZGF0YV9lYXRlbik7CisKKwkJb2Zmc2V0ID0gc3AtPm9mZnNldDsKKwkJY29weSA9IHNrYi0+bGVuIC0gb2Zmc2V0OworCQlpZiAoY29weSA+IGxlbiAtIGNvcGllZCkKKwkJCWNvcHkgPSBsZW4gLSBjb3BpZWQ7CisKKwkJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1VOTkVDRVNTQVJZKSB7CisJCQlyZXQgPSBza2JfY29weV9kYXRhZ3JhbV9pb3ZlYyhza2IsIG9mZnNldCwKKwkJCQkJCSAgICAgIG1zZy0+bXNnX2lvdiwgY29weSk7CisJCX0gZWxzZSB7CisJCQlyZXQgPSBza2JfY29weV9hbmRfY3N1bV9kYXRhZ3JhbV9pb3ZlYyhza2IsIG9mZnNldCwKKwkJCQkJCQkgICAgICAgbXNnLT5tc2dfaW92KTsKKwkJCWlmIChyZXQgPT0gLUVJTlZBTCkKKwkJCQlnb3RvIGNzdW1fY29weV9lcnJvcjsKKwkJfQorCisJCWlmIChyZXQgPCAwKQorCQkJZ290byBjb3B5X2Vycm9yOworCisJCS8qIGhhbmRsZSBwaWVjZW1lYWwgY29uc3VtcHRpb24gb2YgZGF0YSBwYWNrZXRzICovCisJCV9kZWJ1ZygiY29waWVkICVkKyVkIiwgY29weSwgY29waWVkKTsKKworCQlvZmZzZXQgKz0gY29weTsKKwkJY29waWVkICs9IGNvcHk7CisKKwkJaWYgKCEoZmxhZ3MgJiBNU0dfUEVFSykpCisJCQlzcC0+b2Zmc2V0ID0gb2Zmc2V0OworCisJCWlmIChzcC0+b2Zmc2V0IDwgc2tiLT5sZW4pIHsKKwkJCV9kZWJ1ZygiYnVmZmVyIGZ1bGwiKTsKKwkJCUFTU0VSVENNUChjb3BpZWQsID09LCBsZW4pOworCQkJYnJlYWs7CisJCX0KKworCQkvKiB3ZSB0cmFuc2ZlcnJlZCB0aGUgd2hvbGUgZGF0YSBwYWNrZXQgKi8KKwkJaWYgKHNwLT5oZHIuZmxhZ3MgJiBSWFJQQ19MQVNUX1BBQ0tFVCkgeworCQkJX2RlYnVnKCJsYXN0Iik7CisJCQlpZiAoY2FsbC0+Y29ubi0+b3V0X2NsaWVudGZsYWcpIHsKKwkJCQkgLyogbGFzdCBieXRlIG9mIHJlcGx5IHJlY2VpdmVkICovCisJCQkJcmV0ID0gY29waWVkOworCQkJCWdvdG8gdGVybWluYWxfbWVzc2FnZTsKKwkJCX0KKworCQkJLyogbGFzdCBiaXQgb2YgcmVxdWVzdCByZWNlaXZlZCAqLworCQkJaWYgKCEoZmxhZ3MgJiBNU0dfUEVFSykpIHsKKwkJCQlfZGVidWcoImVhdCBwYWNrZXQiKTsKKwkJCQlpZiAoc2tiX2RlcXVldWUoJnJ4LT5zay5za19yZWNlaXZlX3F1ZXVlKSAhPQorCQkJCSAgICBza2IpCisJCQkJCUJVRygpOworCQkJCXJ4cnBjX2ZyZWVfc2tiKHNrYik7CisJCQl9CisJCQltc2ctPm1zZ19mbGFncyAmPSB+TVNHX01PUkU7CisJCQlicmVhazsKKwkJfQorCisJCS8qIG1vdmUgb24gdG8gdGhlIG5leHQgZGF0YSBtZXNzYWdlICovCisJCV9kZWJ1ZygibmV4dCIpOworCQlpZiAoIWNvbnRpbnVlX2NhbGwpCisJCQljb250aW51ZV9jYWxsID0gc3AtPmNhbGw7CisJCWVsc2UKKwkJCXJ4cnBjX3B1dF9jYWxsKGNhbGwpOworCQljYWxsID0gTlVMTDsKKworCQlpZiAoZmxhZ3MgJiBNU0dfUEVFSykgeworCQkJX2RlYnVnKCJwZWVrIG5leHQiKTsKKwkJCXNrYiA9IHNrYi0+bmV4dDsKKwkJCWlmIChza2IgPT0gKHN0cnVjdCBza19idWZmICopICZyeC0+c2suc2tfcmVjZWl2ZV9xdWV1ZSkKKwkJCQlicmVhazsKKwkJCWdvdG8gcGVla19uZXh0X3BhY2tldDsKKwkJfQorCisJCV9kZWJ1ZygiZWF0IHBhY2tldCIpOworCQlpZiAoc2tiX2RlcXVldWUoJnJ4LT5zay5za19yZWNlaXZlX3F1ZXVlKSAhPSBza2IpCisJCQlCVUcoKTsKKwkJcnhycGNfZnJlZV9za2Ioc2tiKTsKKwl9CisKKwkvKiBlbmQgb2Ygbm9uLXRlcm1pbmFsIGRhdGEgcGFja2V0IHJlY2VwdGlvbiBmb3IgdGhlIG1vbWVudCAqLworCV9kZWJ1ZygiZW5kIHJjdiBkYXRhIik7CitvdXQ6CisJcmVsZWFzZV9zb2NrKCZyeC0+c2spOworCWlmIChjYWxsKQorCQlyeHJwY19wdXRfY2FsbChjYWxsKTsKKwlpZiAoY29udGludWVfY2FsbCkKKwkJcnhycGNfcHV0X2NhbGwoY29udGludWVfY2FsbCk7CisJX2xlYXZlKCIgPSAlZCBbZGF0YV0iLCBjb3BpZWQpOworCXJldHVybiBjb3BpZWQ7CisKKwkvKiBoYW5kbGUgbm9uLURBVEEgbWVzc2FnZXMgc3VjaCBhcyBhYm9ydHMsIGluY29taW5nIGNvbm5lY3Rpb25zIGFuZAorCSAqIGZpbmFsIEFDS3MgKi8KK3JlY2VpdmVfbm9uX2RhdGFfbWVzc2FnZToKKwlfZGVidWcoIm5vbi1kYXRhIik7CisKKwlpZiAoc2tiLT5tYXJrID09IFJYUlBDX1NLQl9NQVJLX05FV19DQUxMKSB7CisJCV9kZWJ1ZygiUkVDViBORVcgQ0FMTCIpOworCQlyZXQgPSBwdXRfY21zZyhtc2csIFNPTF9SWFJQQywgUlhSUENfTkVXX0NBTEwsIDAsICZhYm9ydF9jb2RlKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIGNvcHlfZXJyb3I7CisJCWlmICghKGZsYWdzICYgTVNHX1BFRUspKSB7CisJCQlpZiAoc2tiX2RlcXVldWUoJnJ4LT5zay5za19yZWNlaXZlX3F1ZXVlKSAhPSBza2IpCisJCQkJQlVHKCk7CisJCQlyeHJwY19mcmVlX3NrYihza2IpOworCQl9CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IHB1dF9jbXNnKG1zZywgU09MX1JYUlBDLCBSWFJQQ19VU0VSX0NBTExfSUQsCisJCSAgICAgICB1bGxlbiwgJmNhbGwtPnVzZXJfY2FsbF9JRCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gY29weV9lcnJvcjsKKwlBU1NFUlQodGVzdF9iaXQoUlhSUENfQ0FMTF9IQVNfVVNFUklELCAmY2FsbC0+ZmxhZ3MpKTsKKworCXN3aXRjaCAoc2tiLT5tYXJrKSB7CisJY2FzZSBSWFJQQ19TS0JfTUFSS19EQVRBOgorCQlCVUcoKTsKKwljYXNlIFJYUlBDX1NLQl9NQVJLX0ZJTkFMX0FDSzoKKwkJcmV0ID0gcHV0X2Ntc2cobXNnLCBTT0xfUlhSUEMsIFJYUlBDX0FDSywgMCwgJmFib3J0X2NvZGUpOworCQlicmVhazsKKwljYXNlIFJYUlBDX1NLQl9NQVJLX0JVU1k6CisJCXJldCA9IHB1dF9jbXNnKG1zZywgU09MX1JYUlBDLCBSWFJQQ19CVVNZLCAwLCAmYWJvcnRfY29kZSk7CisJCWJyZWFrOworCWNhc2UgUlhSUENfU0tCX01BUktfUkVNT1RFX0FCT1JUOgorCQlhYm9ydF9jb2RlID0gY2FsbC0+YWJvcnRfY29kZTsKKwkJcmV0ID0gcHV0X2Ntc2cobXNnLCBTT0xfUlhSUEMsIFJYUlBDX0FCT1JULCA0LCAmYWJvcnRfY29kZSk7CisJCWJyZWFrOworCWNhc2UgUlhSUENfU0tCX01BUktfTkVUX0VSUk9SOgorCQlfZGVidWcoIlJFQ1YgTkVUIEVSUk9SICVkIiwgc3AtPmVycm9yKTsKKwkJYWJvcnRfY29kZSA9IHNwLT5lcnJvcjsKKwkJcmV0ID0gcHV0X2Ntc2cobXNnLCBTT0xfUlhSUEMsIFJYUlBDX05FVF9FUlJPUiwgNCwgJmFib3J0X2NvZGUpOworCQlicmVhazsKKwljYXNlIFJYUlBDX1NLQl9NQVJLX0xPQ0FMX0VSUk9SOgorCQlfZGVidWcoIlJFQ1YgTE9DQUwgRVJST1IgJWQiLCBzcC0+ZXJyb3IpOworCQlhYm9ydF9jb2RlID0gc3AtPmVycm9yOworCQlyZXQgPSBwdXRfY21zZyhtc2csIFNPTF9SWFJQQywgUlhSUENfTE9DQUxfRVJST1IsIDQsCisJCQkgICAgICAgJmFib3J0X2NvZGUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwkJYnJlYWs7CisJfQorCisJaWYgKHJldCA8IDApCisJCWdvdG8gY29weV9lcnJvcjsKKwordGVybWluYWxfbWVzc2FnZToKKwlfZGVidWcoInRlcm1pbmFsIik7CisJbXNnLT5tc2dfZmxhZ3MgJj0gfk1TR19NT1JFOworCW1zZy0+bXNnX2ZsYWdzIHw9IE1TR19FT1I7CisKKwlpZiAoIShmbGFncyAmIE1TR19QRUVLKSkgeworCQlfbmV0KCJmcmVlIHRlcm1pbmFsIHNrYiAlcCIsIHNrYik7CisJCWlmIChza2JfZGVxdWV1ZSgmcngtPnNrLnNrX3JlY2VpdmVfcXVldWUpICE9IHNrYikKKwkJCUJVRygpOworCQlyeHJwY19mcmVlX3NrYihza2IpOworCQlyeHJwY19yZW1vdmVfdXNlcl9JRChyeCwgY2FsbCk7CisJfQorCisJcmVsZWFzZV9zb2NrKCZyeC0+c2spOworCXJ4cnBjX3B1dF9jYWxsKGNhbGwpOworCWlmIChjb250aW51ZV9jYWxsKQorCQlyeHJwY19wdXRfY2FsbChjb250aW51ZV9jYWxsKTsKKwlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworCitjb3B5X2Vycm9yOgorCV9kZWJ1ZygiY29weSBlcnJvciIpOworCXJlbGVhc2Vfc29jaygmcngtPnNrKTsKKwlyeHJwY19wdXRfY2FsbChjYWxsKTsKKwlpZiAoY29udGludWVfY2FsbCkKKwkJcnhycGNfcHV0X2NhbGwoY29udGludWVfY2FsbCk7CisJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJcmV0dXJuIHJldDsKKworY3N1bV9jb3B5X2Vycm9yOgorCV9kZWJ1ZygiY3N1bSBlcnJvciIpOworCXJlbGVhc2Vfc29jaygmcngtPnNrKTsKKwlpZiAoY29udGludWVfY2FsbCkKKwkJcnhycGNfcHV0X2NhbGwoY29udGludWVfY2FsbCk7CisJcnhycGNfa2lsbF9za2Ioc2tiKTsKKwlza2Jfa2lsbF9kYXRhZ3JhbSgmcngtPnNrLCBza2IsIGZsYWdzKTsKKwlyeHJwY19wdXRfY2FsbChjYWxsKTsKKwlyZXR1cm4gLUVBR0FJTjsKKword2FpdF9pbnRlcnJ1cHRlZDoKKwlyZXQgPSBzb2NrX2ludHJfZXJybm8odGltZW8pOword2FpdF9lcnJvcjoKKwlmaW5pc2hfd2FpdChyeC0+c2suc2tfc2xlZXAsICZ3YWl0KTsKKwlpZiAoY29udGludWVfY2FsbCkKKwkJcnhycGNfcHV0X2NhbGwoY29udGludWVfY2FsbCk7CisJaWYgKGNvcGllZCkKKwkJY29waWVkID0gcmV0OworCV9sZWF2ZSgiID0gJWQgW3dhaXRmYWlsICVkXSIsIGNvcGllZCwgcmV0KTsKKwlyZXR1cm4gY29waWVkOworCit9CisKKy8qKgorICogcnhycGNfa2VybmVsX2RhdGFfZGVsaXZlcmVkIC0gUmVjb3JkIGRlbGl2ZXJ5IG9mIGRhdGEgbWVzc2FnZQorICogQHNrYjogTWVzc2FnZSBob2xkaW5nIGRhdGEKKyAqCisgKiBSZWNvcmQgdGhlIGRlbGl2ZXJ5IG9mIGEgZGF0YSBtZXNzYWdlLiAgVGhpcyBwZXJtaXRzIFJ4UlBDIHRvIGtlZXAgaXRzCisgKiB0cmFja2luZyBjb3JyZWN0LiAgVGhlIHNvY2tldCBidWZmZXIgd2lsbCBiZSBkZWxldGVkLgorICovCit2b2lkIHJ4cnBjX2tlcm5lbF9kYXRhX2RlbGl2ZXJlZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCByeHJwY19za2JfcHJpdiAqc3AgPSByeHJwY19za2Ioc2tiKTsKKwlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCA9IHNwLT5jYWxsOworCisJQVNTRVJUQ01QKG50b2hsKHNwLT5oZHIuc2VxKSwgPj0sIGNhbGwtPnJ4X2RhdGFfcmVjdik7CisJQVNTRVJUQ01QKG50b2hsKHNwLT5oZHIuc2VxKSwgPD0sIGNhbGwtPnJ4X2RhdGFfcmVjdiArIDEpOworCWNhbGwtPnJ4X2RhdGFfcmVjdiA9IG50b2hsKHNwLT5oZHIuc2VxKTsKKworCUFTU0VSVENNUChudG9obChzcC0+aGRyLnNlcSksID4sIGNhbGwtPnJ4X2RhdGFfZWF0ZW4pOworCXJ4cnBjX2ZyZWVfc2tiKHNrYik7Cit9CisKK0VYUE9SVF9TWU1CT0wocnhycGNfa2VybmVsX2RhdGFfZGVsaXZlcmVkKTsKKworLyoqCisgKiByeHJwY19rZXJuZWxfaXNfZGF0YV9sYXN0IC0gRGV0ZXJtaW5lIGlmIGRhdGEgbWVzc2FnZSBpcyBsYXN0IG9uZQorICogQHNrYjogTWVzc2FnZSBob2xkaW5nIGRhdGEKKyAqCisgKiBEZXRlcm1pbmUgaWYgZGF0YSBtZXNzYWdlIGlzIGxhc3Qgb25lIGZvciB0aGUgcGFyZW50IGNhbGwuCisgKi8KK2Jvb2wgcnhycGNfa2VybmVsX2lzX2RhdGFfbGFzdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCByeHJwY19za2JfcHJpdiAqc3AgPSByeHJwY19za2Ioc2tiKTsKKworCUFTU0VSVENNUChza2ItPm1hcmssID09LCBSWFJQQ19TS0JfTUFSS19EQVRBKTsKKworCXJldHVybiBzcC0+aGRyLmZsYWdzICYgUlhSUENfTEFTVF9QQUNLRVQ7Cit9CisKK0VYUE9SVF9TWU1CT0wocnhycGNfa2VybmVsX2lzX2RhdGFfbGFzdCk7CisKKy8qKgorICogcnhycGNfa2VybmVsX2dldF9hYm9ydF9jb2RlIC0gR2V0IHRoZSBhYm9ydCBjb2RlIGZyb20gYW4gUnhSUEMgYWJvcnQgbWVzc2FnZQorICogQHNrYjogTWVzc2FnZSBpbmRpY2F0aW5nIGFuIGFib3J0CisgKgorICogR2V0IHRoZSBhYm9ydCBjb2RlIGZyb20gYW4gUnhSUEMgYWJvcnQgbWVzc2FnZS4KKyAqLwordTMyIHJ4cnBjX2tlcm5lbF9nZXRfYWJvcnRfY29kZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCByeHJwY19za2JfcHJpdiAqc3AgPSByeHJwY19za2Ioc2tiKTsKKworCUFTU0VSVENNUChza2ItPm1hcmssID09LCBSWFJQQ19TS0JfTUFSS19SRU1PVEVfQUJPUlQpOworCisJcmV0dXJuIHNwLT5jYWxsLT5hYm9ydF9jb2RlOworfQorCitFWFBPUlRfU1lNQk9MKHJ4cnBjX2tlcm5lbF9nZXRfYWJvcnRfY29kZSk7CisKKy8qKgorICogcnhycGNfa2VybmVsX2dldF9lcnJvciAtIEdldCB0aGUgZXJyb3IgbnVtYmVyIGZyb20gYW4gUnhSUEMgZXJyb3IgbWVzc2FnZQorICogQHNrYjogTWVzc2FnZSBpbmRpY2F0aW5nIGFuIGVycm9yCisgKgorICogR2V0IHRoZSBlcnJvciBudW1iZXIgZnJvbSBhbiBSeFJQQyBlcnJvciBtZXNzYWdlLgorICovCitpbnQgcnhycGNfa2VybmVsX2dldF9lcnJvcl9udW1iZXIoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwID0gcnhycGNfc2tiKHNrYik7CisKKwlyZXR1cm4gc3AtPmVycm9yOworfQorCitFWFBPUlRfU1lNQk9MKHJ4cnBjX2tlcm5lbF9nZXRfZXJyb3JfbnVtYmVyKTsKZGlmZiAtLWdpdCBhL25ldC9yeHJwYy9hci1zZWN1cml0eS5jIGIvbmV0L3J4cnBjL2FyLXNlY3VyaXR5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBkMWQzNgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9yeHJwYy9hci1zZWN1cml0eS5jCkBAIC0wLDAgKzEsMjU4IEBACisvKiBSeFJQQyBzZWN1cml0eSBoYW5kbGluZworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvdWRwLmg+CisjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxuZXQvYWZfcnhycGMuaD4KKyNpbmNsdWRlICJhci1pbnRlcm5hbC5oIgorCitzdGF0aWMgTElTVF9IRUFEKHJ4cnBjX3NlY3VyaXR5X21ldGhvZHMpOworc3RhdGljIERFQ0xBUkVfUldTRU0ocnhycGNfc2VjdXJpdHlfc2VtKTsKKworLyoKKyAqIGdldCBhbiBSeFJQQyBzZWN1cml0eSBtb2R1bGUKKyAqLworc3RhdGljIHN0cnVjdCByeHJwY19zZWN1cml0eSAqcnhycGNfc2VjdXJpdHlfZ2V0KHN0cnVjdCByeHJwY19zZWN1cml0eSAqc2VjKQoreworCXJldHVybiB0cnlfbW9kdWxlX2dldChzZWMtPm93bmVyKSA/IHNlYyA6IE5VTEw7Cit9CisKKy8qCisgKiByZWxlYXNlIGFuIFJ4UlBDIHNlY3VyaXR5IG1vZHVsZQorICovCitzdGF0aWMgdm9pZCByeHJwY19zZWN1cml0eV9wdXQoc3RydWN0IHJ4cnBjX3NlY3VyaXR5ICpzZWMpCit7CisJbW9kdWxlX3B1dChzZWMtPm93bmVyKTsKK30KKworLyoKKyAqIGxvb2sgdXAgYW4gcnhycGMgc2VjdXJpdHkgbW9kdWxlCisgKi8KK3N0cnVjdCByeHJwY19zZWN1cml0eSAqcnhycGNfc2VjdXJpdHlfbG9va3VwKHU4IHNlY3VyaXR5X2luZGV4KQoreworCXN0cnVjdCByeHJwY19zZWN1cml0eSAqc2VjID0gTlVMTDsKKworCV9lbnRlcigiIik7CisKKwlkb3duX3JlYWQoJnJ4cnBjX3NlY3VyaXR5X3NlbSk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNlYywgJnJ4cnBjX3NlY3VyaXR5X21ldGhvZHMsIGxpbmspIHsKKwkJaWYgKHNlYy0+c2VjdXJpdHlfaW5kZXggPT0gc2VjdXJpdHlfaW5kZXgpIHsKKwkJCWlmICh1bmxpa2VseSghcnhycGNfc2VjdXJpdHlfZ2V0KHNlYykpKQorCQkJCWJyZWFrOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwlzZWMgPSBOVUxMOworb3V0OgorCXVwX3JlYWQoJnJ4cnBjX3NlY3VyaXR5X3NlbSk7CisJX2xlYXZlKCIgPSAlcCBbJXNdIiwgc2VjLCBzZWMgPyBzZWMtPm5hbWUgOiAiIik7CisJcmV0dXJuIHNlYzsKK30KKworLyoqCisgKiByeHJwY19yZWdpc3Rlcl9zZWN1cml0eSAtIHJlZ2lzdGVyIGFuIFJ4UlBDIHNlY3VyaXR5IGhhbmRsZXIKKyAqIEBzZWM6IHNlY3VyaXR5IG1vZHVsZQorICoKKyAqIHJlZ2lzdGVyIGFuIFJ4UlBDIHNlY3VyaXR5IGhhbmRsZXIgZm9yIHVzZSBieSBSeFJQQworICovCitpbnQgcnhycGNfcmVnaXN0ZXJfc2VjdXJpdHkoc3RydWN0IHJ4cnBjX3NlY3VyaXR5ICpzZWMpCit7CisJc3RydWN0IHJ4cnBjX3NlY3VyaXR5ICpwc2VjOworCWludCByZXQ7CisKKwlfZW50ZXIoIiIpOworCWRvd25fd3JpdGUoJnJ4cnBjX3NlY3VyaXR5X3NlbSk7CisKKwlyZXQgPSAtRUVYSVNUOworCWxpc3RfZm9yX2VhY2hfZW50cnkocHNlYywgJnJ4cnBjX3NlY3VyaXR5X21ldGhvZHMsIGxpbmspIHsKKwkJaWYgKHBzZWMtPnNlY3VyaXR5X2luZGV4ID09IHNlYy0+c2VjdXJpdHlfaW5kZXgpCisJCQlnb3RvIG91dDsKKwl9CisKKwlsaXN0X2FkZCgmc2VjLT5saW5rLCAmcnhycGNfc2VjdXJpdHlfbWV0aG9kcyk7CisKKwlwcmludGsoS0VSTl9OT1RJQ0UgIlJ4UlBDOiBSZWdpc3RlcmVkIHNlY3VyaXR5IHR5cGUgJWQgJyVzJ1xuIiwKKwkgICAgICAgc2VjLT5zZWN1cml0eV9pbmRleCwgc2VjLT5uYW1lKTsKKwlyZXQgPSAwOworCitvdXQ6CisJdXBfd3JpdGUoJnJ4cnBjX3NlY3VyaXR5X3NlbSk7CisJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworRVhQT1JUX1NZTUJPTF9HUEwocnhycGNfcmVnaXN0ZXJfc2VjdXJpdHkpOworCisvKioKKyAqIHJ4cnBjX3VucmVnaXN0ZXJfc2VjdXJpdHkgLSB1bnJlZ2lzdGVyIGFuIFJ4UlBDIHNlY3VyaXR5IGhhbmRsZXIKKyAqIEBzZWM6IHNlY3VyaXR5IG1vZHVsZQorICoKKyAqIHVucmVnaXN0ZXIgYW4gUnhSUEMgc2VjdXJpdHkgaGFuZGxlcgorICovCit2b2lkIHJ4cnBjX3VucmVnaXN0ZXJfc2VjdXJpdHkoc3RydWN0IHJ4cnBjX3NlY3VyaXR5ICpzZWMpCit7CisKKwlfZW50ZXIoIiIpOworCWRvd25fd3JpdGUoJnJ4cnBjX3NlY3VyaXR5X3NlbSk7CisJbGlzdF9kZWxfaW5pdCgmc2VjLT5saW5rKTsKKwl1cF93cml0ZSgmcnhycGNfc2VjdXJpdHlfc2VtKTsKKworCXByaW50ayhLRVJOX05PVElDRSAiUnhSUEM6IFVucmVnaXN0ZXJlZCBzZWN1cml0eSB0eXBlICVkICclcydcbiIsCisJICAgICAgIHNlYy0+c2VjdXJpdHlfaW5kZXgsIHNlYy0+bmFtZSk7Cit9CisKK0VYUE9SVF9TWU1CT0xfR1BMKHJ4cnBjX3VucmVnaXN0ZXJfc2VjdXJpdHkpOworCisvKgorICogaW5pdGlhbGlzZSB0aGUgc2VjdXJpdHkgb24gYSBjbGllbnQgY29ubmVjdGlvbgorICovCitpbnQgcnhycGNfaW5pdF9jbGllbnRfY29ubl9zZWN1cml0eShzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubikKK3sKKwlzdHJ1Y3QgcnhycGNfc2VjdXJpdHkgKnNlYzsKKwlzdHJ1Y3Qga2V5ICprZXkgPSBjb25uLT5rZXk7CisJaW50IHJldDsKKworCV9lbnRlcigieyVkfSx7JXh9IiwgY29ubi0+ZGVidWdfaWQsIGtleV9zZXJpYWwoa2V5KSk7CisKKwlpZiAoIWtleSkKKwkJcmV0dXJuIDA7CisKKwlyZXQgPSBrZXlfdmFsaWRhdGUoa2V5KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXNlYyA9IHJ4cnBjX3NlY3VyaXR5X2xvb2t1cChrZXktPnR5cGVfZGF0YS54WzBdKTsKKwlpZiAoIXNlYykKKwkJcmV0dXJuIC1FS0VZUkVKRUNURUQ7CisJY29ubi0+c2VjdXJpdHkgPSBzZWM7CisKKwlyZXQgPSBjb25uLT5zZWN1cml0eS0+aW5pdF9jb25uZWN0aW9uX3NlY3VyaXR5KGNvbm4pOworCWlmIChyZXQgPCAwKSB7CisJCXJ4cnBjX3NlY3VyaXR5X3B1dChjb25uLT5zZWN1cml0eSk7CisJCWNvbm4tPnNlY3VyaXR5ID0gTlVMTDsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlfbGVhdmUoIiA9IDAiKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGluaXRpYWxpc2UgdGhlIHNlY3VyaXR5IG9uIGEgc2VydmVyIGNvbm5lY3Rpb24KKyAqLworaW50IHJ4cnBjX2luaXRfc2VydmVyX2Nvbm5fc2VjdXJpdHkoc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4pCit7CisJc3RydWN0IHJ4cnBjX3NlY3VyaXR5ICpzZWM7CisJc3RydWN0IHJ4cnBjX2xvY2FsICpsb2NhbCA9IGNvbm4tPnRyYW5zLT5sb2NhbDsKKwlzdHJ1Y3QgcnhycGNfc29jayAqcng7CisJc3RydWN0IGtleSAqa2V5OworCWtleV9yZWZfdCBrcmVmOworCWNoYXIga2Rlc2NbNSsxKzMrMV07CisKKwlfZW50ZXIoIiIpOworCisJc3ByaW50ZihrZGVzYywgIiV1OiV1IiwgbnRvaHMoY29ubi0+c2VydmljZV9pZCksIGNvbm4tPnNlY3VyaXR5X2l4KTsKKworCXNlYyA9IHJ4cnBjX3NlY3VyaXR5X2xvb2t1cChjb25uLT5zZWN1cml0eV9peCk7CisJaWYgKCFzZWMpIHsKKwkJX2xlYXZlKCIgPSAtRU5PS0VZIFtsb29rdXBdIik7CisJCXJldHVybiAtRU5PS0VZOworCX0KKworCS8qIGZpbmQgdGhlIHNlcnZpY2UgKi8KKwlyZWFkX2xvY2tfYmgoJmxvY2FsLT5zZXJ2aWNlc19sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJ4LCAmbG9jYWwtPnNlcnZpY2VzLCBsaXN0ZW5fbGluaykgeworCQlpZiAocngtPnNlcnZpY2VfaWQgPT0gY29ubi0+c2VydmljZV9pZCkKKwkJCWdvdG8gZm91bmRfc2VydmljZTsKKwl9CisKKwkvKiB0aGUgc2VydmljZSBhcHBlYXJzIHRvIGhhdmUgZGllZCAqLworCXJlYWRfdW5sb2NrX2JoKCZsb2NhbC0+c2VydmljZXNfbG9jayk7CisJcnhycGNfc2VjdXJpdHlfcHV0KHNlYyk7CisJX2xlYXZlKCIgPSAtRU5PRU5UIik7CisJcmV0dXJuIC1FTk9FTlQ7CisKK2ZvdW5kX3NlcnZpY2U6CisJaWYgKCFyeC0+c2VjdXJpdGllcykgeworCQlyZWFkX3VubG9ja19iaCgmbG9jYWwtPnNlcnZpY2VzX2xvY2spOworCQlyeHJwY19zZWN1cml0eV9wdXQoc2VjKTsKKwkJX2xlYXZlKCIgPSAtRU5PS0VZIik7CisJCXJldHVybiAtRU5PS0VZOworCX0KKworCS8qIGxvb2sgdGhyb3VnaCB0aGUgc2VydmljZSdzIGtleXJpbmcgKi8KKwlrcmVmID0ga2V5cmluZ19zZWFyY2gobWFrZV9rZXlfcmVmKHJ4LT5zZWN1cml0aWVzLCAxVUwpLAorCQkJICAgICAgJmtleV90eXBlX3J4cnBjX3MsIGtkZXNjKTsKKwlpZiAoSVNfRVJSKGtyZWYpKSB7CisJCXJlYWRfdW5sb2NrX2JoKCZsb2NhbC0+c2VydmljZXNfbG9jayk7CisJCXJ4cnBjX3NlY3VyaXR5X3B1dChzZWMpOworCQlfbGVhdmUoIiA9ICVsZCBbc2VhcmNoXSIsIFBUUl9FUlIoa3JlZikpOworCQlyZXR1cm4gUFRSX0VSUihrcmVmKTsKKwl9CisKKwlrZXkgPSBrZXlfcmVmX3RvX3B0cihrcmVmKTsKKwlyZWFkX3VubG9ja19iaCgmbG9jYWwtPnNlcnZpY2VzX2xvY2spOworCisJY29ubi0+c2VydmVyX2tleSA9IGtleTsKKwljb25uLT5zZWN1cml0eSA9IHNlYzsKKworCV9sZWF2ZSgiID0gMCIpOworCXJldHVybiAwOworfQorCisvKgorICogc2VjdXJlIGEgcGFja2V0IHByaW9yIHRvIHRyYW5zbWlzc2lvbgorICovCitpbnQgcnhycGNfc2VjdXJlX3BhY2tldChjb25zdCBzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwKKwkJCXN0cnVjdCBza19idWZmICpza2IsCisJCQlzaXplX3QgZGF0YV9zaXplLAorCQkJdm9pZCAqc2VjaGRyKQoreworCWlmIChjYWxsLT5jb25uLT5zZWN1cml0eSkKKwkJcmV0dXJuIGNhbGwtPmNvbm4tPnNlY3VyaXR5LT5zZWN1cmVfcGFja2V0KAorCQkJY2FsbCwgc2tiLCBkYXRhX3NpemUsIHNlY2hkcik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBzZWN1cmUgYSBwYWNrZXQgcHJpb3IgdG8gdHJhbnNtaXNzaW9uCisgKi8KK2ludCByeHJwY192ZXJpZnlfcGFja2V0KGNvbnN0IHN0cnVjdCByeHJwY19jYWxsICpjYWxsLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJdTMyICpfYWJvcnRfY29kZSkKK3sKKwlpZiAoY2FsbC0+Y29ubi0+c2VjdXJpdHkpCisJCXJldHVybiBjYWxsLT5jb25uLT5zZWN1cml0eS0+dmVyaWZ5X3BhY2tldCgKKwkJCWNhbGwsIHNrYiwgX2Fib3J0X2NvZGUpOworCXJldHVybiAwOworfQorCisvKgorICogY2xlYXIgY29ubmVjdGlvbiBzZWN1cml0eQorICovCit2b2lkIHJ4cnBjX2NsZWFyX2Nvbm5fc2VjdXJpdHkoc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4pCit7CisJX2VudGVyKCJ7JWR9IiwgY29ubi0+ZGVidWdfaWQpOworCisJaWYgKGNvbm4tPnNlY3VyaXR5KSB7CisJCWNvbm4tPnNlY3VyaXR5LT5jbGVhcihjb25uKTsKKwkJcnhycGNfc2VjdXJpdHlfcHV0KGNvbm4tPnNlY3VyaXR5KTsKKwkJY29ubi0+c2VjdXJpdHkgPSBOVUxMOworCX0KKworCWtleV9wdXQoY29ubi0+a2V5KTsKKwlrZXlfcHV0KGNvbm4tPnNlcnZlcl9rZXkpOworfQpkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL2FyLXNrYnVmZi5jIGIvbmV0L3J4cnBjL2FyLXNrYnVmZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlNzU1ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvcnhycGMvYXItc2tidWZmLmMKQEAgLTAsMCArMSwxMzIgQEAKKy8qIGFyLXNrYnVmZi5jOiBzb2NrZXQgYnVmZmVyIGRlc3RydWN0aW9uIGhhbmRsaW5nCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPG5ldC9hZl9yeHJwYy5oPgorI2luY2x1ZGUgImFyLWludGVybmFsLmgiCisKKy8qCisgKiBzZXQgdXAgZm9yIHRoZSBBQ0sgYXQgdGhlIGVuZCBvZiB0aGUgcmVjZWl2ZSBwaGFzZSB3aGVuIHdlIGRpc2NhcmQgdGhlIGZpbmFsCisgKiByZWNlaXZlIHBoYXNlIGRhdGEgcGFja2V0CisgKiAtIGNhbGxlZCB3aXRoIHNvZnRpcnFzIGRpc2FibGVkCisgKi8KK3N0YXRpYyB2b2lkIHJ4cnBjX3JlcXVlc3RfZmluYWxfQUNLKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKQoreworCS8qIHRoZSBjYWxsIG1heSBiZSBhYm9ydGVkIGJlZm9yZSB3ZSBoYXZlIGEgY2hhbmNlIHRvIEFDSyBpdCAqLworCXdyaXRlX2xvY2soJmNhbGwtPnN0YXRlX2xvY2spOworCisJc3dpdGNoIChjYWxsLT5zdGF0ZSkgeworCWNhc2UgUlhSUENfQ0FMTF9DTElFTlRfUkVDVl9SRVBMWToKKwkJY2FsbC0+c3RhdGUgPSBSWFJQQ19DQUxMX0NMSUVOVF9GSU5BTF9BQ0s7CisJCV9kZWJ1ZygicmVxdWVzdCBmaW5hbCBBQ0siKTsKKworCQkvKiBnZXQgYW4gZXh0cmEgcmVmIG9uIHRoZSBjYWxsIGZvciB0aGUgZmluYWwtQUNLIGdlbmVyYXRvciB0bworCQkgKiByZWxlYXNlICovCisJCXJ4cnBjX2dldF9jYWxsKGNhbGwpOworCQlzZXRfYml0KFJYUlBDX0NBTExfQUNLX0ZJTkFMLCAmY2FsbC0+ZXZlbnRzKTsKKwkJaWYgKHRyeV90b19kZWxfdGltZXJfc3luYygmY2FsbC0+YWNrX3RpbWVyKSA+PSAwKQorCQkJcnhycGNfcXVldWVfY2FsbChjYWxsKTsKKwkJYnJlYWs7CisKKwljYXNlIFJYUlBDX0NBTExfU0VSVkVSX1JFQ1ZfUkVRVUVTVDoKKwkJY2FsbC0+c3RhdGUgPSBSWFJQQ19DQUxMX1NFUlZFUl9BQ0tfUkVRVUVTVDsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwl3cml0ZV91bmxvY2soJmNhbGwtPnN0YXRlX2xvY2spOworfQorCisvKgorICogZHJvcCB0aGUgYm90dG9tIEFDSyBvZmYgb2YgdGhlIGNhbGwgQUNLIHdpbmRvdyBhbmQgYWR2YW5jZSB0aGUgd2luZG93CisgKi8KK3N0YXRpYyB2b2lkIHJ4cnBjX2hhcmRfQUNLX2RhdGEoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsCisJCQkJc3RydWN0IHJ4cnBjX3NrYl9wcml2ICpzcCkKK3sKKwlpbnQgbG9vcDsKKwl1MzIgc2VxOworCisJc3Bpbl9sb2NrX2JoKCZjYWxsLT5sb2NrKTsKKworCV9kZWJ1ZygiaGFyZCBBQ0sgIyV1IiwgbnRvaGwoc3AtPmhkci5zZXEpKTsKKworCWZvciAobG9vcCA9IDA7IGxvb3AgPCBSWFJQQ19BQ0tSX1dJTkRPV19BU1o7IGxvb3ArKykgeworCQljYWxsLT5hY2tyX3dpbmRvd1tsb29wXSA+Pj0gMTsKKwkJY2FsbC0+YWNrcl93aW5kb3dbbG9vcF0gfD0KKwkJCWNhbGwtPmFja3Jfd2luZG93W2xvb3AgKyAxXSA8PCAoQklUU19QRVJfTE9ORyAtIDEpOworCX0KKworCXNlcSA9IG50b2hsKHNwLT5oZHIuc2VxKTsKKwlBU1NFUlRDTVAoc2VxLCA9PSwgY2FsbC0+cnhfZGF0YV9lYXRlbiArIDEpOworCWNhbGwtPnJ4X2RhdGFfZWF0ZW4gPSBzZXE7CisKKwlpZiAoY2FsbC0+YWNrcl93aW5fdG9wIDwgVUlOVF9NQVgpCisJCWNhbGwtPmFja3Jfd2luX3RvcCsrOworCisJQVNTRVJUSUZDTVAoY2FsbC0+c3RhdGUgPD0gUlhSUENfQ0FMTF9DT01QTEVURSwKKwkJICAgIGNhbGwtPnJ4X2RhdGFfcG9zdCwgPj0sIGNhbGwtPnJ4X2RhdGFfcmVjdik7CisJQVNTRVJUSUZDTVAoY2FsbC0+c3RhdGUgPD0gUlhSUENfQ0FMTF9DT01QTEVURSwKKwkJICAgIGNhbGwtPnJ4X2RhdGFfcmVjdiwgPj0sIGNhbGwtPnJ4X2RhdGFfZWF0ZW4pOworCisJaWYgKHNwLT5oZHIuZmxhZ3MgJiBSWFJQQ19MQVNUX1BBQ0tFVCkgeworCQlyeHJwY19yZXF1ZXN0X2ZpbmFsX0FDSyhjYWxsKTsKKwl9IGVsc2UgaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmNhbGwtPmFja3Jfbm90X2lkbGUpICYmCisJCSAgIHRlc3RfYW5kX2NsZWFyX2JpdChSWFJQQ19DQUxMX1RYX1NPRlRfQUNLLCAmY2FsbC0+ZmxhZ3MpKSB7CisJCV9kZWJ1Zygic2VuZCBSeCBpZGxlIEFDSyIpOworCQlfX3J4cnBjX3Byb3Bvc2VfQUNLKGNhbGwsIFJYUlBDX0FDS19JRExFLCBzcC0+aGRyLnNlcmlhbCwKKwkJCQkgICAgdHJ1ZSk7CisJfQorCisJc3Bpbl91bmxvY2tfYmgoJmNhbGwtPmxvY2spOworfQorCisvKgorICogZGVzdHJveSBhIHBhY2tldCB0aGF0IGhhcyBhbiBSeFJQQyBjb250cm9sIGJ1ZmZlcgorICogLSBhZHZhbmNlIHRoZSBoYXJkLUFDSyBzdGF0ZSBvZiB0aGUgcGFyZW50IGNhbGwgKGRvbmUgaGVyZSBpbiBjYXNlIHNvbWV0aGluZworICogICBpbiB0aGUga2VybmVsIGJ5cGFzc2VzIHJlY3Ztc2coKSBhbmQgc3RlYWxzIHRoZSBwYWNrZXQgZGlyZWN0bHkgb2ZmIG9mIHRoZQorICogICBzb2NrZXQgcmVjZWl2ZSBxdWV1ZSkKKyAqLwordm9pZCByeHJwY19wYWNrZXRfZGVzdHJ1Y3RvcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCByeHJwY19za2JfcHJpdiAqc3AgPSByeHJwY19za2Ioc2tiKTsKKwlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCA9IHNwLT5jYWxsOworCisJX2VudGVyKCIlcHslcH0iLCBza2IsIGNhbGwpOworCisJaWYgKGNhbGwpIHsKKwkJLyogc2VuZCB0aGUgZmluYWwgQUNLIG9uIGEgY2xpZW50IGNhbGwgKi8KKwkJaWYgKHNwLT5oZHIudHlwZSA9PSBSWFJQQ19QQUNLRVRfVFlQRV9EQVRBKQorCQkJcnhycGNfaGFyZF9BQ0tfZGF0YShjYWxsLCBzcCk7CisJCXJ4cnBjX3B1dF9jYWxsKGNhbGwpOworCQlzcC0+Y2FsbCA9IE5VTEw7CisJfQorCisJaWYgKHNrYi0+c2spCisJCXNvY2tfcmZyZWUoc2tiKTsKKwlfbGVhdmUoIiIpOworfQorCisvKioKKyAqIHJ4cnBjX2tlcm5lbF9mcmVlX3NrYiAtIEZyZWUgYW4gUnhSUEMgc29ja2V0IGJ1ZmZlcgorICogQHNrYjogVGhlIHNvY2tldCBidWZmZXIgdG8gYmUgZnJlZWQKKyAqCisgKiBMZXQgUnhSUEMgZnJlZSBpdHMgb3duIHNvY2tldCBidWZmZXIsIHBlcm1pdHRpbmcgaXQgdG8gbWFpbnRhaW4gZGVidWcKKyAqIGFjY291bnRpbmcuCisgKi8KK3ZvaWQgcnhycGNfa2VybmVsX2ZyZWVfc2tiKHN0cnVjdCBza19idWZmICpza2IpCit7CisJcnhycGNfZnJlZV9za2Ioc2tiKTsKK30KKworRVhQT1JUX1NZTUJPTChyeHJwY19rZXJuZWxfZnJlZV9za2IpOwpkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL2FyLXRyYW5zcG9ydC5jIGIvbmV0L3J4cnBjL2FyLXRyYW5zcG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0M2Q3OGYKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvcnhycGMvYXItdHJhbnNwb3J0LmMKQEAgLTAsMCArMSwyNzYgQEAKKy8qIFJ4UlBDIHBvaW50LXRvLXBvaW50IHRyYW5zcG9ydCBzZXNzaW9uIG1hbmFnZW1lbnQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bmV0L2FmX3J4cnBjLmg+CisjaW5jbHVkZSAiYXItaW50ZXJuYWwuaCIKKworc3RhdGljIHZvaWQgcnhycGNfdHJhbnNwb3J0X3JlYXBlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworCitzdGF0aWMgTElTVF9IRUFEKHJ4cnBjX3RyYW5zcG9ydHMpOworc3RhdGljIERFRklORV9SV0xPQ0socnhycGNfdHJhbnNwb3J0X2xvY2spOworc3RhdGljIHVuc2lnbmVkIGxvbmcgcnhycGNfdHJhbnNwb3J0X3RpbWVvdXQgPSAzNjAwICogMjQ7CitzdGF0aWMgREVDTEFSRV9ERUxBWUVEX1dPUksocnhycGNfdHJhbnNwb3J0X3JlYXAsIHJ4cnBjX3RyYW5zcG9ydF9yZWFwZXIpOworCisvKgorICogYWxsb2NhdGUgYSBuZXcgdHJhbnNwb3J0IHNlc3Npb24gbWFuYWdlcgorICovCitzdGF0aWMgc3RydWN0IHJ4cnBjX3RyYW5zcG9ydCAqcnhycGNfYWxsb2NfdHJhbnNwb3J0KHN0cnVjdCByeHJwY19sb2NhbCAqbG9jYWwsCisJCQkJCQkgICAgIHN0cnVjdCByeHJwY19wZWVyICpwZWVyLAorCQkJCQkJICAgICBnZnBfdCBnZnApCit7CisJc3RydWN0IHJ4cnBjX3RyYW5zcG9ydCAqdHJhbnM7CisKKwlfZW50ZXIoIiIpOworCisJdHJhbnMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0KSwgZ2ZwKTsKKwlpZiAodHJhbnMpIHsKKwkJdHJhbnMtPmxvY2FsID0gbG9jYWw7CisJCXRyYW5zLT5wZWVyID0gcGVlcjsKKwkJSU5JVF9MSVNUX0hFQUQoJnRyYW5zLT5saW5rKTsKKwkJdHJhbnMtPmJ1bmRsZXMgPSBSQl9ST09UOworCQl0cmFucy0+Y2xpZW50X2Nvbm5zID0gUkJfUk9PVDsKKwkJdHJhbnMtPnNlcnZlcl9jb25ucyA9IFJCX1JPT1Q7CisJCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnRyYW5zLT5lcnJvcl9xdWV1ZSk7CisJCXNwaW5fbG9ja19pbml0KCZ0cmFucy0+Y2xpZW50X2xvY2spOworCQlyd2xvY2tfaW5pdCgmdHJhbnMtPmNvbm5fbG9jayk7CisJCWF0b21pY19zZXQoJnRyYW5zLT51c2FnZSwgMSk7CisJCXRyYW5zLT5kZWJ1Z19pZCA9IGF0b21pY19pbmNfcmV0dXJuKCZyeHJwY19kZWJ1Z19pZCk7CisKKwkJaWYgKHBlZXItPnNyeC50cmFuc3BvcnQuZmFtaWx5ID09IEFGX0lORVQpIHsKKwkJCXN3aXRjaCAocGVlci0+c3J4LnRyYW5zcG9ydF90eXBlKSB7CisJCQljYXNlIFNPQ0tfREdSQU06CisJCQkJSU5JVF9XT1JLKCZ0cmFucy0+ZXJyb3JfaGFuZGxlciwKKwkJCQkJICByeHJwY19VRFBfZXJyb3JfaGFuZGxlcik7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCUJVRygpOworCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgeworCQkJQlVHKCk7CisJCX0KKwl9CisKKwlfbGVhdmUoIiA9ICVwIiwgdHJhbnMpOworCXJldHVybiB0cmFuczsKK30KKworLyoKKyAqIG9idGFpbiBhIHRyYW5zcG9ydCBzZXNzaW9uIGZvciB0aGUgbm9taW5hdGVkIGVuZHBvaW50cworICovCitzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICpyeHJwY19nZXRfdHJhbnNwb3J0KHN0cnVjdCByeHJwY19sb2NhbCAqbG9jYWwsCisJCQkJCSAgICBzdHJ1Y3QgcnhycGNfcGVlciAqcGVlciwKKwkJCQkJICAgIGdmcF90IGdmcCkKK3sKKwlzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICp0cmFucywgKmNhbmRpZGF0ZTsKKwljb25zdCBjaGFyICpuZXcgPSAib2xkIjsKKwlpbnQgdXNhZ2U7CisKKwlfZW50ZXIoInsldS4ldS4ldS4ldSslaHV9LHsldS4ldS4ldS4ldSslaHV9LCIsCisJICAgICAgIE5JUFFVQUQobG9jYWwtPnNyeC50cmFuc3BvcnQuc2luLnNpbl9hZGRyKSwKKwkgICAgICAgbnRvaHMobG9jYWwtPnNyeC50cmFuc3BvcnQuc2luLnNpbl9wb3J0KSwKKwkgICAgICAgTklQUVVBRChwZWVyLT5zcngudHJhbnNwb3J0LnNpbi5zaW5fYWRkciksCisJICAgICAgIG50b2hzKHBlZXItPnNyeC50cmFuc3BvcnQuc2luLnNpbl9wb3J0KSk7CisKKwkvKiBzZWFyY2ggdGhlIHRyYW5zcG9ydCBsaXN0IGZpcnN0ICovCisJcmVhZF9sb2NrX2JoKCZyeHJwY190cmFuc3BvcnRfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0cmFucywgJnJ4cnBjX3RyYW5zcG9ydHMsIGxpbmspIHsKKwkJaWYgKHRyYW5zLT5sb2NhbCA9PSBsb2NhbCAmJiB0cmFucy0+cGVlciA9PSBwZWVyKQorCQkJZ290byBmb3VuZF9leHRhbnRfdHJhbnNwb3J0OworCX0KKwlyZWFkX3VubG9ja19iaCgmcnhycGNfdHJhbnNwb3J0X2xvY2spOworCisJLyogbm90IHlldCBwcmVzZW50IC0gY3JlYXRlIGEgY2FuZGlkYXRlIGZvciBhIG5ldyByZWNvcmQgYW5kIHRoZW4KKwkgKiByZWRvIHRoZSBzZWFyY2ggKi8KKwljYW5kaWRhdGUgPSByeHJwY19hbGxvY190cmFuc3BvcnQobG9jYWwsIHBlZXIsIGdmcCk7CisJaWYgKCFjYW5kaWRhdGUpIHsKKwkJX2xlYXZlKCIgPSAtRU5PTUVNIik7CisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCX0KKworCXdyaXRlX2xvY2tfYmgoJnJ4cnBjX3RyYW5zcG9ydF9sb2NrKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkodHJhbnMsICZyeHJwY190cmFuc3BvcnRzLCBsaW5rKSB7CisJCWlmICh0cmFucy0+bG9jYWwgPT0gbG9jYWwgJiYgdHJhbnMtPnBlZXIgPT0gcGVlcikKKwkJCWdvdG8gZm91bmRfZXh0YW50X3NlY29uZDsKKwl9CisKKwkvKiB3ZSBjYW4gbm93IGFkZCB0aGUgbmV3IGNhbmRpZGF0ZSB0byB0aGUgbGlzdCAqLworCXRyYW5zID0gY2FuZGlkYXRlOworCWNhbmRpZGF0ZSA9IE5VTEw7CisKKwlyeHJwY19nZXRfbG9jYWwodHJhbnMtPmxvY2FsKTsKKwlhdG9taWNfaW5jKCZ0cmFucy0+cGVlci0+dXNhZ2UpOworCWxpc3RfYWRkX3RhaWwoJnRyYW5zLT5saW5rLCAmcnhycGNfdHJhbnNwb3J0cyk7CisJd3JpdGVfdW5sb2NrX2JoKCZyeHJwY190cmFuc3BvcnRfbG9jayk7CisJbmV3ID0gIm5ldyI7CisKK3N1Y2Nlc3M6CisJX25ldCgiVFJBTlNQT1JUICVzICVkIGxvY2FsICVkIC0+IHBlZXIgJWQiLAorCSAgICAgbmV3LAorCSAgICAgdHJhbnMtPmRlYnVnX2lkLAorCSAgICAgdHJhbnMtPmxvY2FsLT5kZWJ1Z19pZCwKKwkgICAgIHRyYW5zLT5wZWVyLT5kZWJ1Z19pZCk7CisKKwlfbGVhdmUoIiA9ICVwIHt1PSVkfSIsIHRyYW5zLCBhdG9taWNfcmVhZCgmdHJhbnMtPnVzYWdlKSk7CisJcmV0dXJuIHRyYW5zOworCisJLyogd2UgZm91bmQgdGhlIHRyYW5zcG9ydCBpbiB0aGUgbGlzdCBpbW1lZGlhdGVseSAqLworZm91bmRfZXh0YW50X3RyYW5zcG9ydDoKKwl1c2FnZSA9IGF0b21pY19pbmNfcmV0dXJuKCZ0cmFucy0+dXNhZ2UpOworCXJlYWRfdW5sb2NrX2JoKCZyeHJwY190cmFuc3BvcnRfbG9jayk7CisJZ290byBzdWNjZXNzOworCisJLyogd2UgZm91bmQgdGhlIHRyYW5zcG9ydCBvbiB0aGUgc2Vjb25kIHRpbWUgdGhyb3VnaCB0aGUgbGlzdCAqLworZm91bmRfZXh0YW50X3NlY29uZDoKKwl1c2FnZSA9IGF0b21pY19pbmNfcmV0dXJuKCZ0cmFucy0+dXNhZ2UpOworCXdyaXRlX3VubG9ja19iaCgmcnhycGNfdHJhbnNwb3J0X2xvY2spOworCWtmcmVlKGNhbmRpZGF0ZSk7CisJZ290byBzdWNjZXNzOworfQorCisvKgorICogZmluZCB0aGUgdHJhbnNwb3J0IGNvbm5lY3RpbmcgdHdvIGVuZHBvaW50cworICovCitzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICpyeHJwY19maW5kX3RyYW5zcG9ydChzdHJ1Y3QgcnhycGNfbG9jYWwgKmxvY2FsLAorCQkJCQkgICAgIHN0cnVjdCByeHJwY19wZWVyICpwZWVyKQoreworCXN0cnVjdCByeHJwY190cmFuc3BvcnQgKnRyYW5zOworCisJX2VudGVyKCJ7JXUuJXUuJXUuJXUrJWh1fSx7JXUuJXUuJXUuJXUrJWh1fSwiLAorCSAgICAgICBOSVBRVUFEKGxvY2FsLT5zcngudHJhbnNwb3J0LnNpbi5zaW5fYWRkciksCisJICAgICAgIG50b2hzKGxvY2FsLT5zcngudHJhbnNwb3J0LnNpbi5zaW5fcG9ydCksCisJICAgICAgIE5JUFFVQUQocGVlci0+c3J4LnRyYW5zcG9ydC5zaW4uc2luX2FkZHIpLAorCSAgICAgICBudG9ocyhwZWVyLT5zcngudHJhbnNwb3J0LnNpbi5zaW5fcG9ydCkpOworCisJLyogc2VhcmNoIHRoZSB0cmFuc3BvcnQgbGlzdCAqLworCXJlYWRfbG9ja19iaCgmcnhycGNfdHJhbnNwb3J0X2xvY2spOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0cmFucywgJnJ4cnBjX3RyYW5zcG9ydHMsIGxpbmspIHsKKwkJaWYgKHRyYW5zLT5sb2NhbCA9PSBsb2NhbCAmJiB0cmFucy0+cGVlciA9PSBwZWVyKQorCQkJZ290byBmb3VuZF9leHRhbnRfdHJhbnNwb3J0OworCX0KKworCXJlYWRfdW5sb2NrX2JoKCZyeHJwY190cmFuc3BvcnRfbG9jayk7CisJX2xlYXZlKCIgPSBOVUxMIik7CisJcmV0dXJuIE5VTEw7CisKK2ZvdW5kX2V4dGFudF90cmFuc3BvcnQ6CisJYXRvbWljX2luYygmdHJhbnMtPnVzYWdlKTsKKwlyZWFkX3VubG9ja19iaCgmcnhycGNfdHJhbnNwb3J0X2xvY2spOworCV9sZWF2ZSgiID0gJXAiLCB0cmFucyk7CisJcmV0dXJuIHRyYW5zOworfQorCisvKgorICogcmVsZWFzZSBhIHRyYW5zcG9ydCBzZXNzaW9uCisgKi8KK3ZvaWQgcnhycGNfcHV0X3RyYW5zcG9ydChzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICp0cmFucykKK3sKKwlfZW50ZXIoIiVwe3U9JWR9IiwgdHJhbnMsIGF0b21pY19yZWFkKCZ0cmFucy0+dXNhZ2UpKTsKKworCUFTU0VSVENNUChhdG9taWNfcmVhZCgmdHJhbnMtPnVzYWdlKSwgPiwgMCk7CisKKwl0cmFucy0+cHV0X3RpbWUgPSB4dGltZS50dl9zZWM7CisJaWYgKHVubGlrZWx5KGF0b21pY19kZWNfYW5kX3Rlc3QoJnRyYW5zLT51c2FnZSkpKQorCQlfZGVidWcoInpvbWJpZSIpOworCQkvKiBsZXQgdGhlIHJlYXBlciBkZXRlcm1pbmUgdGhlIHRpbWVvdXQgdG8gYXZvaWQgYSByYWNlIHdpdGgKKwkJICogb3ZlcmV4dGVuZGluZyB0aGUgdGltZW91dCBpZiB0aGUgcmVhcGVyIGlzIHJ1bm5pbmcgYXQgdGhlCisJCSAqIHNhbWUgdGltZSAqLworCQlyeHJwY19xdWV1ZV9kZWxheWVkX3dvcmsoJnJ4cnBjX3RyYW5zcG9ydF9yZWFwLCAwKTsKKwlfbGVhdmUoIiIpOworfQorCisvKgorICogY2xlYW4gdXAgYSB0cmFuc3BvcnQgc2Vzc2lvbgorICovCitzdGF0aWMgdm9pZCByeHJwY19jbGVhbnVwX3RyYW5zcG9ydChzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICp0cmFucykKK3sKKwlfbmV0KCJERVNUUk9ZIFRSQU5TICVkIiwgdHJhbnMtPmRlYnVnX2lkKTsKKworCXJ4cnBjX3B1cmdlX3F1ZXVlKCZ0cmFucy0+ZXJyb3JfcXVldWUpOworCisJcnhycGNfcHV0X2xvY2FsKHRyYW5zLT5sb2NhbCk7CisJcnhycGNfcHV0X3BlZXIodHJhbnMtPnBlZXIpOworCWtmcmVlKHRyYW5zKTsKK30KKworLyoKKyAqIHJlYXAgZGVhZCB0cmFuc3BvcnRzIHRoYXQgaGF2ZSBwYXNzZWQgdGhlaXIgZXhwaXJ5IGRhdGUKKyAqLworc3RhdGljIHZvaWQgcnhycGNfdHJhbnNwb3J0X3JlYXBlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHJ4cnBjX3RyYW5zcG9ydCAqdHJhbnMsICpfcDsKKwl1bnNpZ25lZCBsb25nIG5vdywgZWFybGllc3QsIHJlYXBfdGltZTsKKworCUxJU1RfSEVBRChncmF2ZXlhcmQpOworCisJX2VudGVyKCIiKTsKKworCW5vdyA9IHh0aW1lLnR2X3NlYzsKKwllYXJsaWVzdCA9IFVMT05HX01BWDsKKworCS8qIGV4dHJhY3QgYWxsIHRoZSB0cmFuc3BvcnRzIHRoYXQgaGF2ZSBiZWVuIGRlYWQgdG9vIGxvbmcgKi8KKwl3cml0ZV9sb2NrX2JoKCZyeHJwY190cmFuc3BvcnRfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHRyYW5zLCBfcCwgJnJ4cnBjX3RyYW5zcG9ydHMsIGxpbmspIHsKKwkJX2RlYnVnKCJyZWFwIFRSQU5TICVkIHsgdT0lZCB0PSVsZCB9IiwKKwkJICAgICAgIHRyYW5zLT5kZWJ1Z19pZCwgYXRvbWljX3JlYWQoJnRyYW5zLT51c2FnZSksCisJCSAgICAgICAobG9uZykgbm93IC0gKGxvbmcpIHRyYW5zLT5wdXRfdGltZSk7CisKKwkJaWYgKGxpa2VseShhdG9taWNfcmVhZCgmdHJhbnMtPnVzYWdlKSA+IDApKQorCQkJY29udGludWU7CisKKwkJcmVhcF90aW1lID0gdHJhbnMtPnB1dF90aW1lICsgcnhycGNfdHJhbnNwb3J0X3RpbWVvdXQ7CisJCWlmIChyZWFwX3RpbWUgPD0gbm93KQorCQkJbGlzdF9tb3ZlX3RhaWwoJnRyYW5zLT5saW5rLCAmZ3JhdmV5YXJkKTsKKwkJZWxzZSBpZiAocmVhcF90aW1lIDwgZWFybGllc3QpCisJCQllYXJsaWVzdCA9IHJlYXBfdGltZTsKKwl9CisJd3JpdGVfdW5sb2NrX2JoKCZyeHJwY190cmFuc3BvcnRfbG9jayk7CisKKwlpZiAoZWFybGllc3QgIT0gVUxPTkdfTUFYKSB7CisJCV9kZWJ1ZygicmVzY2hlZHVsZSByZWFwZXIgJWxkIiwgKGxvbmcpIGVhcmxpZXN0IC0gbm93KTsKKwkJQVNTRVJUQ01QKGVhcmxpZXN0LCA+LCBub3cpOworCQlyeHJwY19xdWV1ZV9kZWxheWVkX3dvcmsoJnJ4cnBjX3RyYW5zcG9ydF9yZWFwLAorCQkJCQkgKGVhcmxpZXN0IC0gbm93KSAqIEhaKTsKKwl9CisKKwkvKiB0aGVuIGRlc3Ryb3kgYWxsIHRob3NlIHB1bGxlZCBvdXQgKi8KKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmdyYXZleWFyZCkpIHsKKwkJdHJhbnMgPSBsaXN0X2VudHJ5KGdyYXZleWFyZC5uZXh0LCBzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0LAorCQkJCSAgIGxpbmspOworCQlsaXN0X2RlbF9pbml0KCZ0cmFucy0+bGluayk7CisKKwkJQVNTRVJUQ01QKGF0b21pY19yZWFkKCZ0cmFucy0+dXNhZ2UpLCA9PSwgMCk7CisJCXJ4cnBjX2NsZWFudXBfdHJhbnNwb3J0KHRyYW5zKTsKKwl9CisKKwlfbGVhdmUoIiIpOworfQorCisvKgorICogcHJlZW1wdGl2ZWx5IGRlc3Ryb3kgYWxsIHRoZSB0cmFuc3BvcnQgc2Vzc2lvbiByZWNvcmRzIHJhdGhlciB0aGFuIHdhaXRpbmcKKyAqIGZvciB0aGVtIHRvIHRpbWUgb3V0CisgKi8KK3ZvaWQgX19leGl0IHJ4cnBjX2Rlc3Ryb3lfYWxsX3RyYW5zcG9ydHModm9pZCkKK3sKKwlfZW50ZXIoIiIpOworCisJcnhycGNfdHJhbnNwb3J0X3RpbWVvdXQgPSAwOworCWNhbmNlbF9kZWxheWVkX3dvcmsoJnJ4cnBjX3RyYW5zcG9ydF9yZWFwKTsKKwlyeHJwY19xdWV1ZV9kZWxheWVkX3dvcmsoJnJ4cnBjX3RyYW5zcG9ydF9yZWFwLCAwKTsKKworCV9sZWF2ZSgiIik7Cit9CmRpZmYgLS1naXQgYS9uZXQvcnhycGMvY2FsbC5jIGIvbmV0L3J4cnBjL2NhbGwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA3MTIyYi4uMDAwMDAwMAotLS0gYS9uZXQvcnhycGMvY2FsbC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjI3NyArMCwwIEBACi0vKiBjYWxsLmM6IFJ4IGNhbGwgcm91dGluZXMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPHJ4cnBjL3J4cnBjLmg+Ci0jaW5jbHVkZSA8cnhycGMvdHJhbnNwb3J0Lmg+Ci0jaW5jbHVkZSA8cnhycGMvcGVlci5oPgotI2luY2x1ZGUgPHJ4cnBjL2Nvbm5lY3Rpb24uaD4KLSNpbmNsdWRlIDxyeHJwYy9jYWxsLmg+Ci0jaW5jbHVkZSA8cnhycGMvbWVzc2FnZS5oPgotI2luY2x1ZGUgImludGVybmFsLmgiCi0KLV9fUlhBQ0NUX0RFQ0woYXRvbWljX3QgcnhycGNfY2FsbF9jb3VudCk7Ci1fX1JYQUNDVF9ERUNMKGF0b21pY190IHJ4cnBjX21lc3NhZ2VfY291bnQpOwotCi1MSVNUX0hFQUQocnhycGNfY2FsbHMpOwotREVDTEFSRV9SV1NFTShyeHJwY19jYWxsc19zZW0pOwotCi11bnNpZ25lZCByeHJwY19jYWxsX3Jjdl90aW1lb3V0CQkJPSBIWi8zOwotc3RhdGljIHVuc2lnbmVkIHJ4cnBjX2NhbGxfYWNrc190aW1lb3V0CQk9IEhaLzM7Ci1zdGF0aWMgdW5zaWduZWQgcnhycGNfY2FsbF9kZnJfYWNrX3RpbWVvdXQJPSBIWi8yMDsKLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCByeHJwY19jYWxsX21heF9yZXNlbmQJPSBIWi8xMDsKLQotY29uc3QgY2hhciAqcnhycGNfY2FsbF9zdGF0ZXNbXSA9IHsKLQkiQ09NUExFVEUiLAotCSJFUlJPUiIsCi0JIlNSVlJfUkNWX09QSUQiLAotCSJTUlZSX1JDVl9BUkdTIiwKLQkiU1JWUl9HT1RfQVJHUyIsCi0JIlNSVlJfU05EX1JFUExZIiwKLQkiU1JWUl9SQ1ZfRklOQUxfQUNLIiwKLQkiQ0xOVF9TTkRfQVJHUyIsCi0JIkNMTlRfUkNWX1JFUExZIiwKLQkiQ0xOVF9HT1RfUkVQTFkiCi19OwotCi1jb25zdCBjaGFyICpyeHJwY19jYWxsX2Vycm9yX3N0YXRlc1tdID0gewotCSJOT19FUlJPUiIsCi0JIkxPQ0FMX0FCT1JUIiwKLQkiUEVFUl9BQk9SVCIsCi0JIkxPQ0FMX0VSUk9SIiwKLQkiUkVNT1RFX0VSUk9SIgotfTsKLQotY29uc3QgY2hhciAqcnhycGNfcGt0c1tdID0gewotCSI/MDAiLAotCSJkYXRhIiwgImFjayIsICJidXN5IiwgImFib3J0IiwgImFja2FsbCIsICJjaGFsbCIsICJyZXNwIiwgImRlYnVnIiwKLQkiPzA5IiwgIj8xMCIsICI/MTEiLCAiPzEyIiwgIj8xMyIsICI/MTQiLCAiPzE1IgotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKnJ4cnBjX2Fja3NbXSA9IHsKLQkiLS0tIiwgIlJFUSIsICJEVVAiLCAiU0VRIiwgIldJTiIsICJNRU0iLCAiUE5HIiwgIlBOUiIsICJETFkiLCAiSURMIiwKLQkiLT8tIgotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgX2Fja3R5cGVbXSA9ICJOQS0iOwotCi1zdGF0aWMgdm9pZCByeHJwY19jYWxsX3JlY2VpdmVfcGFja2V0KHN0cnVjdCByeHJwY19jYWxsICpjYWxsKTsKLXN0YXRpYyB2b2lkIHJ4cnBjX2NhbGxfcmVjZWl2ZV9kYXRhX3BhY2tldChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwKLQkJCQkJICAgc3RydWN0IHJ4cnBjX21lc3NhZ2UgKm1zZyk7Ci1zdGF0aWMgdm9pZCByeHJwY19jYWxsX3JlY2VpdmVfYWNrX3BhY2tldChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwKLQkJCQkJICBzdHJ1Y3QgcnhycGNfbWVzc2FnZSAqbXNnKTsKLXN0YXRpYyB2b2lkIHJ4cnBjX2NhbGxfZGVmaW5pdGl2ZWx5X0FDSyhzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwKLQkJCQkJcnhycGNfc2VxX3QgaGlnZXN0KTsKLXN0YXRpYyB2b2lkIHJ4cnBjX2NhbGxfcmVzZW5kKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLCByeHJwY19zZXFfdCBoaWdoZXN0KTsKLXN0YXRpYyBpbnQgX19yeHJwY19jYWxsX3JlYWRfZGF0YShzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCk7Ci0KLXN0YXRpYyBpbnQgcnhycGNfY2FsbF9yZWNvcmRfQUNLKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLAotCQkJCSBzdHJ1Y3QgcnhycGNfbWVzc2FnZSAqbXNnLAotCQkJCSByeHJwY19zZXFfdCBzZXEsCi0JCQkJIHNpemVfdCBjb3VudCk7Ci0KLXN0YXRpYyBpbnQgcnhycGNfY2FsbF9mbHVzaChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCk7Ci0KLSNkZWZpbmUgX3N0YXRlKGNhbGwpIFwKLQlfZGVidWcoIltbWyBzdGF0ZSAlcyBdXV0iLCByeHJwY19jYWxsX3N0YXRlc1tjYWxsLT5hcHBfY2FsbF9zdGF0ZV0pOwotCi1zdGF0aWMgdm9pZCByeHJwY19jYWxsX2RlZmF1bHRfYXR0bl9mdW5jKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKQotewotCXdha2VfdXAoJmNhbGwtPndhaXRxKTsKLX0KLQotc3RhdGljIHZvaWQgcnhycGNfY2FsbF9kZWZhdWx0X2Vycm9yX2Z1bmMoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpCi17Ci0Jd2FrZV91cCgmY2FsbC0+d2FpdHEpOwotfQotCi1zdGF0aWMgdm9pZCByeHJwY19jYWxsX2RlZmF1bHRfYWVtYXBfZnVuYyhzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCkKLXsKLQlzd2l0Y2ggKGNhbGwtPmFwcF9lcnJfc3RhdGUpIHsKLQljYXNlIFJYUlBDX0VTVEFURV9MT0NBTF9BQk9SVDoKLQkJY2FsbC0+YXBwX2Fib3J0X2NvZGUgPSAtY2FsbC0+YXBwX2Vycm5vOwotCWNhc2UgUlhSUENfRVNUQVRFX1BFRVJfQUJPUlQ6Ci0JCWNhbGwtPmFwcF9lcnJubyA9IC1FQ09OTkFCT1JURUQ7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBfX3J4cnBjX2NhbGxfYWNrc190aW1lb3V0KHVuc2lnbmVkIGxvbmcgX2NhbGwpCi17Ci0Jc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwgPSAoc3RydWN0IHJ4cnBjX2NhbGwgKikgX2NhbGw7Ci0KLQlfZGVidWcoIkFDS1MgVElNRU9VVCAlMDVsdSIsIGppZmZpZXMgLSBjYWxsLT5jamlmKTsKLQotCWNhbGwtPmZsYWdzIHw9IFJYUlBDX0NBTExfQUNLU19USU1POwotCXJ4cnBjX2tyeGlvZF9xdWV1ZV9jYWxsKGNhbGwpOwotfQotCi1zdGF0aWMgdm9pZCBfX3J4cnBjX2NhbGxfcmN2X3RpbWVvdXQodW5zaWduZWQgbG9uZyBfY2FsbCkKLXsKLQlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCA9IChzdHJ1Y3QgcnhycGNfY2FsbCAqKSBfY2FsbDsKLQotCV9kZWJ1ZygiUkNWIFRJTUVPVVQgJTA1bHUiLCBqaWZmaWVzIC0gY2FsbC0+Y2ppZik7Ci0KLQljYWxsLT5mbGFncyB8PSBSWFJQQ19DQUxMX1JDVl9USU1POwotCXJ4cnBjX2tyeGlvZF9xdWV1ZV9jYWxsKGNhbGwpOwotfQotCi1zdGF0aWMgdm9pZCBfX3J4cnBjX2NhbGxfYWNrcl90aW1lb3V0KHVuc2lnbmVkIGxvbmcgX2NhbGwpCi17Ci0Jc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwgPSAoc3RydWN0IHJ4cnBjX2NhbGwgKikgX2NhbGw7Ci0KLQlfZGVidWcoIkFDS1IgVElNRU9VVCAlMDVsdSIsamlmZmllcyAtIGNhbGwtPmNqaWYpOwotCi0JY2FsbC0+ZmxhZ3MgfD0gUlhSUENfQ0FMTF9BQ0tSX1RJTU87Ci0JcnhycGNfa3J4aW9kX3F1ZXVlX2NhbGwoY2FsbCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBjYWxjdWxhdGUgYSB0aW1lb3V0IGJhc2VkIG9uIGFuIFJUVCB2YWx1ZQotICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX19yeHJwY19ydHRfYmFzZWRfdGltZW91dChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwKLQkJCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgdmFsKQotewotCXVuc2lnbmVkIGxvbmcgZXhwaXJ5ID0gY2FsbC0+Y29ubi0+cGVlci0+cnR0IC8gKDEwMDAwMDAgLyBIWik7Ci0KLQlleHBpcnkgKz0gMTA7Ci0JaWYgKGV4cGlyeSA8IEhaIC8gMjUpCi0JCWV4cGlyeSA9IEhaIC8gMjU7Ci0JaWYgKGV4cGlyeSA+IEhaKQotCQlleHBpcnkgPSBIWjsKLQotCV9sZWF2ZSgiID0gJWx1IGppZmZpZXMiLCBleHBpcnkpOwotCXJldHVybiBqaWZmaWVzICsgZXhwaXJ5OwotfSAvKiBlbmQgX19yeHJwY19ydHRfYmFzZWRfdGltZW91dCgpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBjcmVhdGUgYSBuZXcgY2FsbCByZWNvcmQKLSAqLwotc3RhdGljIGlubGluZSBpbnQgX19yeHJwY19jcmVhdGVfY2FsbChzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubiwKLQkJCQkgICAgICBzdHJ1Y3QgcnhycGNfY2FsbCAqKl9jYWxsKQotewotCXN0cnVjdCByeHJwY19jYWxsICpjYWxsOwotCi0JX2VudGVyKCIlcCIsIGNvbm4pOwotCi0JLyogYWxsb2NhdGUgYW5kIGluaXRpYWxpc2UgYSBjYWxsIHJlY29yZCAqLwotCWNhbGwgPSAoc3RydWN0IHJ4cnBjX2NhbGwgKikgZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOwotCWlmICghY2FsbCkgewotCQlfbGVhdmUoIiBFTk9NRU0iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JYXRvbWljX3NldCgmY2FsbC0+dXNhZ2UsIDEpOwotCi0JaW5pdF93YWl0cXVldWVfaGVhZCgmY2FsbC0+d2FpdHEpOwotCXNwaW5fbG9ja19pbml0KCZjYWxsLT5sb2NrKTsKLQlJTklUX0xJU1RfSEVBRCgmY2FsbC0+bGluayk7Ci0JSU5JVF9MSVNUX0hFQUQoJmNhbGwtPmFja3NfcGVuZHEpOwotCUlOSVRfTElTVF9IRUFEKCZjYWxsLT5yY3ZfcmVjZWl2ZXEpOwotCUlOSVRfTElTVF9IRUFEKCZjYWxsLT5yY3Zfa3J4aW9kcV9sayk7Ci0JSU5JVF9MSVNUX0hFQUQoJmNhbGwtPmFwcF9yZWFkeXEpOwotCUlOSVRfTElTVF9IRUFEKCZjYWxsLT5hcHBfdW5yZWFkeXEpOwotCUlOSVRfTElTVF9IRUFEKCZjYWxsLT5hcHBfbGluayk7Ci0JSU5JVF9MSVNUX0hFQUQoJmNhbGwtPmFwcF9hdHRuX2xpbmspOwotCi0JaW5pdF90aW1lcigmY2FsbC0+YWNrc190aW1lb3V0KTsKLQljYWxsLT5hY2tzX3RpbWVvdXQuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBjYWxsOwotCWNhbGwtPmFja3NfdGltZW91dC5mdW5jdGlvbiA9IF9fcnhycGNfY2FsbF9hY2tzX3RpbWVvdXQ7Ci0KLQlpbml0X3RpbWVyKCZjYWxsLT5yY3ZfdGltZW91dCk7Ci0JY2FsbC0+cmN2X3RpbWVvdXQuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBjYWxsOwotCWNhbGwtPnJjdl90aW1lb3V0LmZ1bmN0aW9uID0gX19yeHJwY19jYWxsX3Jjdl90aW1lb3V0OwotCi0JaW5pdF90aW1lcigmY2FsbC0+YWNrcl9kZnJfdGltbyk7Ci0JY2FsbC0+YWNrcl9kZnJfdGltby5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGNhbGw7Ci0JY2FsbC0+YWNrcl9kZnJfdGltby5mdW5jdGlvbiA9IF9fcnhycGNfY2FsbF9hY2tyX3RpbWVvdXQ7Ci0KLQljYWxsLT5jb25uID0gY29ubjsKLQljYWxsLT5hY2tyX3dpbl9ib3QgPSAxOwotCWNhbGwtPmFja3Jfd2luX3RvcCA9IGNhbGwtPmFja3Jfd2luX2JvdCArIFJYUlBDX0NBTExfQUNLX1dJTkRPV19TSVpFIC0gMTsKLQljYWxsLT5hY2tyX3ByZXZfc2VxID0gMDsKLQljYWxsLT5hcHBfbWFyayA9IFJYUlBDX0FQUF9NQVJLX0VPRjsKLQljYWxsLT5hcHBfYXR0bl9mdW5jID0gcnhycGNfY2FsbF9kZWZhdWx0X2F0dG5fZnVuYzsKLQljYWxsLT5hcHBfZXJyb3JfZnVuYyA9IHJ4cnBjX2NhbGxfZGVmYXVsdF9lcnJvcl9mdW5jOwotCWNhbGwtPmFwcF9hZW1hcF9mdW5jID0gcnhycGNfY2FsbF9kZWZhdWx0X2FlbWFwX2Z1bmM7Ci0JY2FsbC0+YXBwX3Njcl9hbGxvYyA9IGNhbGwtPmFwcF9zY3JhdGNoOwotCi0JY2FsbC0+Y2ppZiA9IGppZmZpZXM7Ci0KLQlfbGVhdmUoIiA9IDAgKCVwKSIsIGNhbGwpOwotCi0JKl9jYWxsID0gY2FsbDsKLQotCXJldHVybiAwOwotfSAvKiBlbmQgX19yeHJwY19jcmVhdGVfY2FsbCgpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBjcmVhdGUgYSBuZXcgY2FsbCByZWNvcmQgZm9yIG91dGdvaW5nIGNhbGxzCi0gKi8KLWludCByeHJwY19jcmVhdGVfY2FsbChzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubiwKLQkJICAgICAgcnhycGNfY2FsbF9hdHRuX2Z1bmNfdCBhdHRuLAotCQkgICAgICByeHJwY19jYWxsX2Vycm9yX2Z1bmNfdCBlcnJvciwKLQkJICAgICAgcnhycGNfY2FsbF9hZW1hcF9mdW5jX3QgYWVtYXAsCi0JCSAgICAgIHN0cnVjdCByeHJwY19jYWxsICoqX2NhbGwpCi17Ci0JREVDTEFSRV9XQUlUUVVFVUUobXlzZWxmLCBjdXJyZW50KTsKLQotCXN0cnVjdCByeHJwY19jYWxsICpjYWxsOwotCWludCByZXQsIGNpeCwgbG9vcDsKLQotCV9lbnRlcigiJXAiLCBjb25uKTsKLQotCS8qIGFsbG9jYXRlIGFuZCBpbml0aWFsaXNlIGEgY2FsbCByZWNvcmQgKi8KLQlyZXQgPSBfX3J4cnBjX2NyZWF0ZV9jYWxsKGNvbm4sICZjYWxsKTsKLQlpZiAocmV0IDwgMCkgewotCQlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQljYWxsLT5hcHBfY2FsbF9zdGF0ZSA9IFJYUlBDX0NTVEFURV9DTE5UX1NORF9BUkdTOwotCWlmIChhdHRuKQotCQljYWxsLT5hcHBfYXR0bl9mdW5jID0gYXR0bjsKLQlpZiAoZXJyb3IpCi0JCWNhbGwtPmFwcF9lcnJvcl9mdW5jID0gZXJyb3I7Ci0JaWYgKGFlbWFwKQotCQljYWxsLT5hcHBfYWVtYXBfZnVuYyA9IGFlbWFwOwotCi0JX3N0YXRlKGNhbGwpOwotCi0Jc3Bpbl9sb2NrKCZjb25uLT5sb2NrKTsKLQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCWFkZF93YWl0X3F1ZXVlKCZjb25uLT5jaGFud2FpdCwgJm15c2VsZik7Ci0KLSB0cnlfYWdhaW46Ci0JLyogdHJ5IHRvIGZpbmQgYW4gdW51c2VkIGNoYW5uZWwgKi8KLQlmb3IgKGNpeCA9IDA7IGNpeCA8IDQ7IGNpeCsrKQotCQlpZiAoIWNvbm4tPmNoYW5uZWxzW2NpeF0pCi0JCQlnb3RvIG9idGFpbmVkX2NoYW47Ci0KLQkvKiBubyBmcmVlIGNoYW5uZWxzIC0gd2FpdCBmb3Igb25lIHRvIGJlY29tZSBhdmFpbGFibGUgKi8KLQlyZXQgPSAtRUlOVFI7Ci0JaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQotCQlnb3RvIGVycm9yX3Vud2FpdDsKLQotCXNwaW5fdW5sb2NrKCZjb25uLT5sb2NrKTsKLQotCXNjaGVkdWxlKCk7Ci0Jc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQotCXNwaW5fbG9jaygmY29ubi0+bG9jayk7Ci0JZ290byB0cnlfYWdhaW47Ci0KLQkvKiBnb3QgYSBjaGFubmVsIC0gbm93IGF0dGFjaCB0byB0aGUgY29ubmVjdGlvbiAqLwotIG9idGFpbmVkX2NoYW46Ci0JcmVtb3ZlX3dhaXRfcXVldWUoJmNvbm4tPmNoYW53YWl0LCAmbXlzZWxmKTsKLQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwotCi0JLyogY29uY29jdCBhIHVuaXF1ZSBjYWxsIG51bWJlciAqLwotIG5leHRfY2FsbGlkOgotCWNhbGwtPmNhbGxfaWQgPSBodG9ubCgrK2Nvbm4tPmNhbGxfY291bnRlcik7Ci0JZm9yIChsb29wID0gMDsgbG9vcCA8IDQ7IGxvb3ArKykKLQkJaWYgKGNvbm4tPmNoYW5uZWxzW2xvb3BdICYmCi0JCSAgICBjb25uLT5jaGFubmVsc1tsb29wXS0+Y2FsbF9pZCA9PSBjYWxsLT5jYWxsX2lkKQotCQkJZ290byBuZXh0X2NhbGxpZDsKLQotCXJ4cnBjX2dldF9jb25uZWN0aW9uKGNvbm4pOwotCWNvbm4tPmNoYW5uZWxzW2NpeF0gPSBjYWxsOyAvKiBhc3NpZ24gX2FmdGVyXyBkb25lIGNhbGxpZCBjaGVjayBsb29wICovCi0JZG9fZ2V0dGltZW9mZGF5KCZjb25uLT5hdGltZSk7Ci0JY2FsbC0+Y2hhbl9peCA9IGh0b25sKGNpeCk7Ci0KLQlzcGluX3VubG9jaygmY29ubi0+bG9jayk7Ci0KLQlkb3duX3dyaXRlKCZyeHJwY19jYWxsc19zZW0pOwotCWxpc3RfYWRkX3RhaWwoJmNhbGwtPmNhbGxfbGluaywgJnJ4cnBjX2NhbGxzKTsKLQl1cF93cml0ZSgmcnhycGNfY2FsbHNfc2VtKTsKLQotCV9fUlhBQ0NUKGF0b21pY19pbmMoJnJ4cnBjX2NhbGxfY291bnQpKTsKLQkqX2NhbGwgPSBjYWxsOwotCi0JX2xlYXZlKCIgPSAwIChjYWxsPSVwIGNpeD0ldSkiLCBjYWxsLCBjaXgpOwotCXJldHVybiAwOwotCi0gZXJyb3JfdW53YWl0OgotCXJlbW92ZV93YWl0X3F1ZXVlKCZjb25uLT5jaGFud2FpdCwgJm15c2VsZik7Ci0Jc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKLQlzcGluX3VubG9jaygmY29ubi0+bG9jayk7Ci0KLQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIGNhbGwpOwotCV9sZWF2ZSgiID0gJWQiLCByZXQpOwotCXJldHVybiByZXQ7Ci19IC8qIGVuZCByeHJwY19jcmVhdGVfY2FsbCgpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBjcmVhdGUgYSBuZXcgY2FsbCByZWNvcmQgZm9yIGluY29taW5nIGNhbGxzCi0gKi8KLWludCByeHJwY19pbmNvbWluZ19jYWxsKHN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uLAotCQkJc3RydWN0IHJ4cnBjX21lc3NhZ2UgKm1zZywKLQkJCXN0cnVjdCByeHJwY19jYWxsICoqX2NhbGwpCi17Ci0Jc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGw7Ci0JdW5zaWduZWQgY2l4OwotCWludCByZXQ7Ci0KLQljaXggPSBudG9obChtc2ctPmhkci5jaWQpICYgUlhSUENfQ0hBTk5FTE1BU0s7Ci0KLQlfZW50ZXIoIiVwLCV1LCV1IiwgY29ubiwgbnRvaGwobXNnLT5oZHIuY2FsbE51bWJlciksIGNpeCk7Ci0KLQkvKiBhbGxvY2F0ZSBhbmQgaW5pdGlhbGlzZSBhIGNhbGwgcmVjb3JkICovCi0JcmV0ID0gX19yeHJwY19jcmVhdGVfY2FsbChjb25uLCAmY2FsbCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJX2xlYXZlKCIgPSAlZCIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JY2FsbC0+cGt0X3Jjdl9jb3VudCA9IDE7Ci0JY2FsbC0+YXBwX2NhbGxfc3RhdGUgPSBSWFJQQ19DU1RBVEVfU1JWUl9SQ1ZfT1BJRDsKLQljYWxsLT5hcHBfbWFyayA9IHNpemVvZih1aW50MzJfdCk7Ci0KLQlfc3RhdGUoY2FsbCk7Ci0KLQkvKiBhdHRhY2ggdG8gdGhlIGNvbm5lY3Rpb24gKi8KLQlyZXQgPSAtRUJVU1k7Ci0JY2FsbC0+Y2hhbl9peCA9IGh0b25sKGNpeCk7Ci0JY2FsbC0+Y2FsbF9pZCA9IG1zZy0+aGRyLmNhbGxOdW1iZXI7Ci0KLQlzcGluX2xvY2soJmNvbm4tPmxvY2spOwotCi0JaWYgKCFjb25uLT5jaGFubmVsc1tjaXhdIHx8Ci0JICAgIGNvbm4tPmNoYW5uZWxzW2NpeF0tPmFwcF9jYWxsX3N0YXRlID09IFJYUlBDX0NTVEFURV9DT01QTEVURSB8fAotCSAgICBjb25uLT5jaGFubmVsc1tjaXhdLT5hcHBfY2FsbF9zdGF0ZSA9PSBSWFJQQ19DU1RBVEVfRVJST1IKLQkgICAgKSB7Ci0JCWNvbm4tPmNoYW5uZWxzW2NpeF0gPSBjYWxsOwotCQlyeHJwY19nZXRfY29ubmVjdGlvbihjb25uKTsKLQkJcmV0ID0gMDsKLQl9Ci0KLQlzcGluX3VubG9jaygmY29ubi0+bG9jayk7Ci0KLQlpZiAocmV0IDwgMCkgewotCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIGNhbGwpOwotCQljYWxsID0gTlVMTDsKLQl9Ci0KLQlpZiAocmV0ID09IDApIHsKLQkJZG93bl93cml0ZSgmcnhycGNfY2FsbHNfc2VtKTsKLQkJbGlzdF9hZGRfdGFpbCgmY2FsbC0+Y2FsbF9saW5rLCAmcnhycGNfY2FsbHMpOwotCQl1cF93cml0ZSgmcnhycGNfY2FsbHNfc2VtKTsKLQkJX19SWEFDQ1QoYXRvbWljX2luYygmcnhycGNfY2FsbF9jb3VudCkpOwotCQkqX2NhbGwgPSBjYWxsOwotCX0KLQotCV9sZWF2ZSgiID0gJWQgWyVwXSIsIHJldCwgY2FsbCk7Ci0JcmV0dXJuIHJldDsKLX0gLyogZW5kIHJ4cnBjX2luY29taW5nX2NhbGwoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogZnJlZSBhIGNhbGwgcmVjb3JkCi0gKi8KLXZvaWQgcnhycGNfcHV0X2NhbGwoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpCi17Ci0Jc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4gPSBjYWxsLT5jb25uOwotCXN0cnVjdCByeHJwY19tZXNzYWdlICptc2c7Ci0KLQlfZW50ZXIoIiVwe3U9JWR9IixjYWxsLGF0b21pY19yZWFkKCZjYWxsLT51c2FnZSkpOwotCi0JLyogc2FuaXR5IGNoZWNrICovCi0JaWYgKGF0b21pY19yZWFkKCZjYWxsLT51c2FnZSkgPD0gMCkKLQkJQlVHKCk7Ci0KLQkvKiB0byBwcmV2ZW50IGEgcmFjZSwgdGhlIGRlY3JlbWVudCBhbmQgdGhlIGRlLWxpc3QgbXVzdCBiZSBlZmZlY3RpdmVseQotCSAqIGF0b21pYyAqLwotCXNwaW5fbG9jaygmY29ubi0+bG9jayk7Ci0JaWYgKGxpa2VseSghYXRvbWljX2RlY19hbmRfdGVzdCgmY2FsbC0+dXNhZ2UpKSkgewotCQlzcGluX3VubG9jaygmY29ubi0+bG9jayk7Ci0JCV9sZWF2ZSgiIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoY29ubi0+Y2hhbm5lbHNbbnRvaGwoY2FsbC0+Y2hhbl9peCldID09IGNhbGwpCi0JCWNvbm4tPmNoYW5uZWxzW250b2hsKGNhbGwtPmNoYW5faXgpXSA9IE5VTEw7Ci0KLQlzcGluX3VubG9jaygmY29ubi0+bG9jayk7Ci0KLQl3YWtlX3VwKCZjb25uLT5jaGFud2FpdCk7Ci0KLQlyeHJwY19wdXRfY29ubmVjdGlvbihjb25uKTsKLQotCS8qIGNsZWFyIHRoZSB0aW1lcnMgYW5kIGRlcXVldWUgZnJvbSBrcnhpb2QgKi8KLQlkZWxfdGltZXJfc3luYygmY2FsbC0+YWNrc190aW1lb3V0KTsKLQlkZWxfdGltZXJfc3luYygmY2FsbC0+cmN2X3RpbWVvdXQpOwotCWRlbF90aW1lcl9zeW5jKCZjYWxsLT5hY2tyX2Rmcl90aW1vKTsKLQotCXJ4cnBjX2tyeGlvZF9kZXF1ZXVlX2NhbGwoY2FsbCk7Ci0KLQkvKiBjbGVhbiB1cCB0aGUgY29udGVudHMgb2YgdGhlIHN0cnVjdCAqLwotCWlmIChjYWxsLT5zbmRfbmV4dG1zZykKLQkJcnhycGNfcHV0X21lc3NhZ2UoY2FsbC0+c25kX25leHRtc2cpOwotCi0JaWYgKGNhbGwtPnNuZF9waW5nKQotCQlyeHJwY19wdXRfbWVzc2FnZShjYWxsLT5zbmRfcGluZyk7Ci0KLQl3aGlsZSAoIWxpc3RfZW1wdHkoJmNhbGwtPmFja3NfcGVuZHEpKSB7Ci0JCW1zZyA9IGxpc3RfZW50cnkoY2FsbC0+YWNrc19wZW5kcS5uZXh0LAotCQkJCSBzdHJ1Y3QgcnhycGNfbWVzc2FnZSwgbGluayk7Ci0JCWxpc3RfZGVsKCZtc2ctPmxpbmspOwotCQlyeHJwY19wdXRfbWVzc2FnZShtc2cpOwotCX0KLQotCXdoaWxlICghbGlzdF9lbXB0eSgmY2FsbC0+cmN2X3JlY2VpdmVxKSkgewotCQltc2cgPSBsaXN0X2VudHJ5KGNhbGwtPnJjdl9yZWNlaXZlcS5uZXh0LAotCQkJCSBzdHJ1Y3QgcnhycGNfbWVzc2FnZSwgbGluayk7Ci0JCWxpc3RfZGVsKCZtc2ctPmxpbmspOwotCQlyeHJwY19wdXRfbWVzc2FnZShtc2cpOwotCX0KLQotCXdoaWxlICghbGlzdF9lbXB0eSgmY2FsbC0+YXBwX3JlYWR5cSkpIHsKLQkJbXNnID0gbGlzdF9lbnRyeShjYWxsLT5hcHBfcmVhZHlxLm5leHQsCi0JCQkJIHN0cnVjdCByeHJwY19tZXNzYWdlLCBsaW5rKTsKLQkJbGlzdF9kZWwoJm1zZy0+bGluayk7Ci0JCXJ4cnBjX3B1dF9tZXNzYWdlKG1zZyk7Ci0JfQotCi0Jd2hpbGUgKCFsaXN0X2VtcHR5KCZjYWxsLT5hcHBfdW5yZWFkeXEpKSB7Ci0JCW1zZyA9IGxpc3RfZW50cnkoY2FsbC0+YXBwX3VucmVhZHlxLm5leHQsCi0JCQkJIHN0cnVjdCByeHJwY19tZXNzYWdlLCBsaW5rKTsKLQkJbGlzdF9kZWwoJm1zZy0+bGluayk7Ci0JCXJ4cnBjX3B1dF9tZXNzYWdlKG1zZyk7Ci0JfQotCi0JbW9kdWxlX3B1dChjYWxsLT5vd25lcik7Ci0KLQlkb3duX3dyaXRlKCZyeHJwY19jYWxsc19zZW0pOwotCWxpc3RfZGVsKCZjYWxsLT5jYWxsX2xpbmspOwotCXVwX3dyaXRlKCZyeHJwY19jYWxsc19zZW0pOwotCi0JX19SWEFDQ1QoYXRvbWljX2RlYygmcnhycGNfY2FsbF9jb3VudCkpOwotCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgY2FsbCk7Ci0KLQlfbGVhdmUoIiBbZGVzdHJveWVkXSIpOwotfSAvKiBlbmQgcnhycGNfcHV0X2NhbGwoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogYWN0dWFsbHkgZ2VuZXJhdGUgYSBub3JtYWwgQUNLCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IF9fcnhycGNfY2FsbF9nZW5fbm9ybWFsX0FDSyhzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwKLQkJCQkJICAgICAgcnhycGNfc2VxX3Qgc2VxKQotewotCXN0cnVjdCByeHJwY19tZXNzYWdlICptc2c7Ci0Jc3RydWN0IGt2ZWMgZGlvdlszXTsKLQlfX2JlMzIgYXV4WzRdOwotCWludCBkZWx0YSwgcmV0OwotCi0JLyogQUNLcyBkZWZhdWx0IHRvIERFTEFZICovCi0JaWYgKCFjYWxsLT5hY2tyLnJlYXNvbikKLQkJY2FsbC0+YWNrci5yZWFzb24gPSBSWFJQQ19BQ0tfREVMQVk7Ci0KLQlfcHJvdG8oIlJ4ICUwNWx1IFNlbmRpbmcgQUNLIHsgbT0laHUgZj0jJXUgcD0jJXUgcz0lJSV1IHI9JXMgbj0ldSB9IiwKLQkgICAgICAgamlmZmllcyAtIGNhbGwtPmNqaWYsCi0JICAgICAgIG50b2hzKGNhbGwtPmFja3IubWF4U2tldyksCi0JICAgICAgIG50b2hsKGNhbGwtPmFja3IuZmlyc3RQYWNrZXQpLAotCSAgICAgICBudG9obChjYWxsLT5hY2tyLnByZXZpb3VzUGFja2V0KSwKLQkgICAgICAgbnRvaGwoY2FsbC0+YWNrci5zZXJpYWwpLAotCSAgICAgICByeHJwY19hY2tzW2NhbGwtPmFja3IucmVhc29uXSwKLQkgICAgICAgY2FsbC0+YWNrci5uQWNrcyk7Ci0KLQlhdXhbMF0gPSBodG9ubChjYWxsLT5jb25uLT5wZWVyLT5pZl9tdHUpOwkvKiBpbnRlcmZhY2UgTVRVICovCi0JYXV4WzFdID0gaHRvbmwoMTQ0NCk7CQkJCS8qIG1heCBNVFUgKi8KLQlhdXhbMl0gPSBodG9ubCgxNik7CQkJCS8qIHJ3aW5kICovCi0JYXV4WzNdID0gaHRvbmwoNCk7CQkJCS8qIG1heCBwYWNrZXRzICovCi0KLQlkaW92WzBdLmlvdl9sZW4gID0gc2l6ZW9mKHN0cnVjdCByeHJwY19hY2twYWNrZXQpOwotCWRpb3ZbMF0uaW92X2Jhc2UgPSAmY2FsbC0+YWNrcjsKLQlkaW92WzFdLmlvdl9sZW4gID0gY2FsbC0+YWNrcl9wZW5kX2NudCArIDM7Ci0JZGlvdlsxXS5pb3ZfYmFzZSA9IGNhbGwtPmFja3JfYXJyYXk7Ci0JZGlvdlsyXS5pb3ZfbGVuICA9IHNpemVvZihhdXgpOwotCWRpb3ZbMl0uaW92X2Jhc2UgPSAmYXV4OwotCi0JLyogYnVpbGQgYW5kIHNlbmQgdGhlIG1lc3NhZ2UgKi8KLQlyZXQgPSByeHJwY19jb25uX25ld21zZyhjYWxsLT5jb25uLGNhbGwsIFJYUlBDX1BBQ0tFVF9UWVBFX0FDSywKLQkJCQkzLCBkaW92LCBHRlBfS0VSTkVMLCAmbXNnKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBvdXQ7Ci0KLQltc2ctPnNlcSA9IHNlcTsKLQltc2ctPmhkci5zZXEgPSBodG9ubChzZXEpOwotCW1zZy0+aGRyLmZsYWdzIHw9IFJYUlBDX1NMT1dfU1RBUlRfT0s7Ci0KLQlyZXQgPSByeHJwY19jb25uX3NlbmRtc2coY2FsbC0+Y29ubiwgbXNnKTsKLQlyeHJwY19wdXRfbWVzc2FnZShtc2cpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIG91dDsKLQljYWxsLT5wa3Rfc25kX2NvdW50Kys7Ci0KLQkvKiBjb3VudCBob3cgbWFueSBhY3R1YWwgQUNLcyB0aGVyZSB3ZXJlIGF0IHRoZSBmcm9udCAqLwotCWZvciAoZGVsdGEgPSAwOyBkZWx0YSA8IGNhbGwtPmFja3JfcGVuZF9jbnQ7IGRlbHRhKyspCi0JCWlmIChjYWxsLT5hY2tyX2FycmF5W2RlbHRhXSAhPSBSWFJQQ19BQ0tfVFlQRV9BQ0spCi0JCQlicmVhazsKLQotCWNhbGwtPmFja3JfcGVuZF9jbnQgLT0gZGVsdGE7IC8qIGFsbCBBQ0snZCB0byB0aGlzIHBvaW50ICovCi0KLQkvKiBjcmFuayB0aGUgQUNLIHdpbmRvdyBhcm91bmQgKi8KLQlpZiAoZGVsdGEgPT0gMCkgewotCQkvKiB1bi1BQ0snZCB3aW5kb3cgKi8KLQl9Ci0JZWxzZSBpZiAoZGVsdGEgPCBSWFJQQ19DQUxMX0FDS19XSU5ET1dfU0laRSkgewotCQkvKiBwYXJ0aWFsbHkgQUNLJ2Qgd2luZG93Ci0JCSAqIC0gc2h1ZmZsZSBkb3duIHRvIGF2b2lkIGxvc2luZyBvdXQtb2Ytc2VxdWVuY2UgcGFja2V0cwotCQkgKi8KLQkJY2FsbC0+YWNrcl93aW5fYm90ICs9IGRlbHRhOwotCQljYWxsLT5hY2tyX3dpbl90b3AgKz0gZGVsdGE7Ci0KLQkJbWVtbW92ZSgmY2FsbC0+YWNrcl9hcnJheVswXSwKLQkJCSZjYWxsLT5hY2tyX2FycmF5W2RlbHRhXSwKLQkJCWNhbGwtPmFja3JfcGVuZF9jbnQpOwotCi0JCW1lbXNldCgmY2FsbC0+YWNrcl9hcnJheVtjYWxsLT5hY2tyX3BlbmRfY250XSwKLQkJICAgICAgIFJYUlBDX0FDS19UWVBFX05BQ0ssCi0JCSAgICAgICBzaXplb2YoY2FsbC0+YWNrcl9hcnJheSkgLSBjYWxsLT5hY2tyX3BlbmRfY250KTsKLQl9Ci0JZWxzZSB7Ci0JCS8qIGZ1bGx5IEFDSydkIHdpbmRvdwotCQkgKiAtIGp1c3QgY2xlYXIgdGhlIHdob2xlIHRoaW5nCi0JCSAqLwotCQltZW1zZXQoJmNhbGwtPmFja3JfYXJyYXksCi0JCSAgICAgICBSWFJQQ19BQ0tfVFlQRV9OQUNLLAotCQkgICAgICAgc2l6ZW9mKGNhbGwtPmFja3JfYXJyYXkpKTsKLQl9Ci0KLQkvKiBjbGVhciB0aGlzIEFDSyAqLwotCW1lbXNldCgmY2FsbC0+YWNrciwgMCwgc2l6ZW9mKGNhbGwtPmFja3IpKTsKLQotIG91dDoKLQlpZiAoIWNhbGwtPmFwcF9jYWxsX3N0YXRlKQotCQlwcmludGsoIl9fXyBTVEFURSAwIF9fX1xuIik7Ci0JcmV0dXJuIHJldDsKLX0gLyogZW5kIF9fcnhycGNfY2FsbF9nZW5fbm9ybWFsX0FDSygpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBub3RlIHRoZSByZWNlcHRpb24gb2YgYSBwYWNrZXQgaW4gdGhlIGNhbGwncyBBQ0sgcmVjb3JkcyBhbmQgZ2VuZXJhdGUgYW4KLSAqIGFwcHJvcHJpYXRlIEFDSyBwYWNrZXQgaWYgbmVjZXNzYXJ5Ci0gKiAtIHJldHVybnMgMCBpZiBwYWNrZXQgc2hvdWxkIGJlIHByb2Nlc3NlZCwgMSBpZiBwYWNrZXQgc2hvdWxkIGJlIGlnbm9yZWQKLSAqICAgYW5kIC12ZSBvbiBhbiBlcnJvcgotICovCi1zdGF0aWMgaW50IHJ4cnBjX2NhbGxfZ2VuZXJhdGVfQUNLKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLAotCQkJCSAgIHN0cnVjdCByeHJwY19oZWFkZXIgKmhkciwKLQkJCQkgICBzdHJ1Y3QgcnhycGNfYWNrcGFja2V0ICphY2spCi17Ci0Jc3RydWN0IHJ4cnBjX21lc3NhZ2UgKm1zZzsKLQlyeHJwY19zZXFfdCBzZXE7Ci0JdW5zaWduZWQgb2Zmc2V0OwotCWludCByZXQgPSAwLCBlcnI7Ci0JdTggc3BlY2lhbF9BQ0ssIGRvX0FDSywgZm9yY2U7Ci0KLQlfZW50ZXIoIiVwLCVwIHsgc2VxPSVkIHRwPSVkIGZsPSUwMnggfSIsCi0JICAgICAgIGNhbGwsIGhkciwgbnRvaGwoaGRyLT5zZXEpLCBoZHItPnR5cGUsIGhkci0+ZmxhZ3MpOwotCi0Jc2VxID0gbnRvaGwoaGRyLT5zZXEpOwotCW9mZnNldCA9IHNlcSAtIGNhbGwtPmFja3Jfd2luX2JvdDsKLQlkb19BQ0sgPSBSWFJQQ19BQ0tfREVMQVk7Ci0Jc3BlY2lhbF9BQ0sgPSAwOwotCWZvcmNlID0gKHNlcSA9PSAxKTsKLQotCWlmIChjYWxsLT5hY2tyX2hpZ2hfc2VxIDwgc2VxKQotCQljYWxsLT5hY2tyX2hpZ2hfc2VxID0gc2VxOwotCi0JLyogZGVhbCB3aXRoIGdlbmVyYXRpb24gb2Ygb2J2aW91cyBzcGVjaWFsIEFDS3MgZmlyc3QgKi8KLQlpZiAoYWNrICYmIGFjay0+cmVhc29uID09IFJYUlBDX0FDS19QSU5HKSB7Ci0JCXNwZWNpYWxfQUNLID0gUlhSUENfQUNLX1BJTkdfUkVTUE9OU0U7Ci0JCXJldCA9IDE7Ci0JCWdvdG8gZ2VuX0FDSzsKLQl9Ci0KLQlpZiAoc2VxIDwgY2FsbC0+YWNrcl93aW5fYm90KSB7Ci0JCXNwZWNpYWxfQUNLID0gUlhSUENfQUNLX0RVUExJQ0FURTsKLQkJcmV0ID0gMTsKLQkJZ290byBnZW5fQUNLOwotCX0KLQotCWlmIChzZXEgPj0gY2FsbC0+YWNrcl93aW5fdG9wKSB7Ci0JCXNwZWNpYWxfQUNLID0gUlhSUENfQUNLX0VYQ0VFRFNfV0lORE9XOwotCQlyZXQgPSAxOwotCQlnb3RvIGdlbl9BQ0s7Ci0JfQotCi0JaWYgKGNhbGwtPmFja3JfYXJyYXlbb2Zmc2V0XSAhPSBSWFJQQ19BQ0tfVFlQRV9OQUNLKSB7Ci0JCXNwZWNpYWxfQUNLID0gUlhSUENfQUNLX0RVUExJQ0FURTsKLQkJcmV0ID0gMTsKLQkJZ290byBnZW5fQUNLOwotCX0KLQotCS8qIG9rYXkuLi4gaXQncyBhIG5vcm1hbCBkYXRhIHBhY2tldCBpbnNpZGUgdGhlIEFDSyB3aW5kb3cgKi8KLQljYWxsLT5hY2tyX2FycmF5W29mZnNldF0gPSBSWFJQQ19BQ0tfVFlQRV9BQ0s7Ci0KLQlpZiAob2Zmc2V0IDwgY2FsbC0+YWNrcl9wZW5kX2NudCkgewotCX0KLQllbHNlIGlmIChvZmZzZXQgPiBjYWxsLT5hY2tyX3BlbmRfY250KSB7Ci0JCWRvX0FDSyA9IFJYUlBDX0FDS19PVVRfT0ZfU0VRVUVOQ0U7Ci0JCWNhbGwtPmFja3JfcGVuZF9jbnQgPSBvZmZzZXQ7Ci0JCWdvdG8gZ2VuX0FDSzsKLQl9Ci0KLQlpZiAoaGRyLT5mbGFncyAmIFJYUlBDX1JFUVVFU1RfQUNLKSB7Ci0JCWRvX0FDSyA9IFJYUlBDX0FDS19SRVFVRVNURUQ7Ci0JfQotCi0JLyogZ2VuZXJhdGUgYW4gQUNLIG9uIHRoZSBmaW5hbCBwYWNrZXQgb2YgYSByZXBseSBqdXN0IHJlY2VpdmVkICovCi0JaWYgKGhkci0+ZmxhZ3MgJiBSWFJQQ19MQVNUX1BBQ0tFVCkgewotCQlpZiAoY2FsbC0+Y29ubi0+b3V0X2NsaWVudGZsYWcpCi0JCQlmb3JjZSA9IDE7Ci0JfQotCWVsc2UgaWYgKCEoaGRyLT5mbGFncyAmIFJYUlBDX01PUkVfUEFDS0VUUykpIHsKLQkJZG9fQUNLID0gUlhSUENfQUNLX1JFUVVFU1RFRDsKLQl9Ci0KLQkvKiByZS1BQ0sgcGFja2V0cyBwcmV2aW91c2x5IHJlY2VpdmVkIG91dC1vZi1vcmRlciAqLwotCWZvciAob2Zmc2V0Kys7IG9mZnNldCA8IFJYUlBDX0NBTExfQUNLX1dJTkRPV19TSVpFOyBvZmZzZXQrKykKLQkJaWYgKGNhbGwtPmFja3JfYXJyYXlbb2Zmc2V0XSAhPSBSWFJQQ19BQ0tfVFlQRV9BQ0spCi0JCQlicmVhazsKLQotCWNhbGwtPmFja3JfcGVuZF9jbnQgPSBvZmZzZXQ7Ci0KLQkvKiBnZW5lcmF0ZSBhbiBBQ0sgaWYgd2UgZmlsbCB1cCB0aGUgd2luZG93ICovCi0JaWYgKGNhbGwtPmFja3JfcGVuZF9jbnQgPj0gUlhSUENfQ0FMTF9BQ0tfV0lORE9XX1NJWkUpCi0JCWZvcmNlID0gMTsKLQotIGdlbl9BQ0s6Ci0JX2RlYnVnKCIlMDVsdSBBQ0tzIHBlbmQ9JXUgbm9ybT0lcyBzcGVjaWFsPSVzJXMiLAotCSAgICAgICBqaWZmaWVzIC0gY2FsbC0+Y2ppZiwKLQkgICAgICAgY2FsbC0+YWNrcl9wZW5kX2NudCwKLQkgICAgICAgcnhycGNfYWNrc1tkb19BQ0tdLAotCSAgICAgICByeHJwY19hY2tzW3NwZWNpYWxfQUNLXSwKLQkgICAgICAgZm9yY2UgPyAiIGltbWVkaWF0ZSIgOgotCSAgICAgICBkb19BQ0sgPT0gUlhSUENfQUNLX1JFUVVFU1RFRCA/ICIgbWVyZ2UtcmVxIiA6Ci0JICAgICAgIGhkci0+ZmxhZ3MgJiBSWFJQQ19MQVNUX1BBQ0tFVCA/ICIgZmluYWxpc2UiIDoKLQkgICAgICAgIiBkZWZlciIKLQkgICAgICAgKTsKLQotCS8qIHNlbmQgYW55IHBlbmRpbmcgbm9ybWFsIEFDS3MgaWYgbmVlZCBiZSAqLwotCWlmIChjYWxsLT5hY2tyX3BlbmRfY250ID4gMCkgewotCQkvKiBmaWxsIG91dCB0aGUgYXBwcm9wcmlhdGUgZm9ybSAqLwotCQljYWxsLT5hY2tyLmJ1ZmZlclNwYWNlCT0gaHRvbnMoUlhSUENfQ0FMTF9BQ0tfV0lORE9XX1NJWkUpOwotCQljYWxsLT5hY2tyLm1heFNrZXcJPSBodG9ucyhtaW4oY2FsbC0+YWNrcl9oaWdoX3NlcSAtIHNlcSwKLQkJCQkJCSAgICA2NTUzNVUpKTsKLQkJY2FsbC0+YWNrci5maXJzdFBhY2tldAk9IGh0b25sKGNhbGwtPmFja3Jfd2luX2JvdCk7Ci0JCWNhbGwtPmFja3IucHJldmlvdXNQYWNrZXQgPSBjYWxsLT5hY2tyX3ByZXZfc2VxOwotCQljYWxsLT5hY2tyLnNlcmlhbAk9IGhkci0+c2VyaWFsOwotCQljYWxsLT5hY2tyLm5BY2tzCT0gY2FsbC0+YWNrcl9wZW5kX2NudDsKLQotCQlpZiAoZG9fQUNLID09IFJYUlBDX0FDS19SRVFVRVNURUQpCi0JCQljYWxsLT5hY2tyLnJlYXNvbiA9IGRvX0FDSzsKLQotCQkvKiBnZW5lcmF0ZSB0aGUgQUNLIGltbWVkaWF0ZWx5IGlmIG5lY2Vzc2FyeSAqLwotCQlpZiAoc3BlY2lhbF9BQ0sgfHwgZm9yY2UpIHsKLQkJCWVyciA9IF9fcnhycGNfY2FsbF9nZW5fbm9ybWFsX0FDSygKLQkJCQljYWxsLCBkb19BQ0sgPT0gUlhSUENfQUNLX0RFTEFZID8gMCA6IHNlcSk7Ci0JCQlpZiAoZXJyIDwgMCkgewotCQkJCXJldCA9IGVycjsKLQkJCQlnb3RvIG91dDsKLQkJCX0KLQkJfQotCX0KLQotCWlmIChjYWxsLT5hY2tyLnJlYXNvbiA9PSBSWFJQQ19BQ0tfUkVRVUVTVEVEKQotCQljYWxsLT5hY2tyX2Rmcl9zZXEgPSBzZXE7Ci0KLQkvKiBzdGFydCB0aGUgQUNLIHRpbWVyIGlmIG5vdCBydW5uaW5nIGlmIHRoZXJlIGFyZSBhbnkgcGVuZGluZyBkZWZlcnJlZAotCSAqIEFDS3MgKi8KLQlpZiAoY2FsbC0+YWNrcl9wZW5kX2NudCA+IDAgJiYKLQkgICAgY2FsbC0+YWNrci5yZWFzb24gIT0gUlhSUENfQUNLX1JFUVVFU1RFRCAmJgotCSAgICAhdGltZXJfcGVuZGluZygmY2FsbC0+YWNrcl9kZnJfdGltbykKLQkgICAgKSB7Ci0JCXVuc2lnbmVkIGxvbmcgdGltbzsKLQotCQl0aW1vID0gcnhycGNfY2FsbF9kZnJfYWNrX3RpbWVvdXQgKyBqaWZmaWVzOwotCi0JCV9kZWJ1ZygiU1RBUlQgQUNLUiBUSU1FUiBmb3IgY2o9JWx1IiwgdGltbyAtIGNhbGwtPmNqaWYpOwotCi0JCXNwaW5fbG9jaygmY2FsbC0+bG9jayk7Ci0JCW1vZF90aW1lcigmY2FsbC0+YWNrcl9kZnJfdGltbywgdGltbyk7Ci0JCXNwaW5fdW5sb2NrKCZjYWxsLT5sb2NrKTsKLQl9Ci0JZWxzZSBpZiAoKGNhbGwtPmFja3JfcGVuZF9jbnQgPT0gMCB8fAotCQkgIGNhbGwtPmFja3IucmVhc29uID09IFJYUlBDX0FDS19SRVFVRVNURUQpICYmCi0JCSB0aW1lcl9wZW5kaW5nKCZjYWxsLT5hY2tyX2Rmcl90aW1vKQotCQkgKSB7Ci0JCS8qIHN0b3AgdGltZXIgaWYgbm8gcGVuZGluZyBBQ0tzICovCi0JCV9kZWJ1ZygiQ0xFQVIgQUNLUiBUSU1FUiIpOwotCQlkZWxfdGltZXJfc3luYygmY2FsbC0+YWNrcl9kZnJfdGltbyk7Ci0JfQotCi0JLyogc2VuZCBhIHNwZWNpYWwgQUNLIGlmIG9uZSBpcyByZXF1aXJlZCAqLwotCWlmIChzcGVjaWFsX0FDSykgewotCQlzdHJ1Y3QgcnhycGNfYWNrcGFja2V0IGFjazsKLQkJc3RydWN0IGt2ZWMgZGlvdlsyXTsKLQkJdWludDhfdCBhY2tzWzFdID0geyBSWFJQQ19BQ0tfVFlQRV9BQ0sgfTsKLQotCQkvKiBmaWxsIG91dCB0aGUgYXBwcm9wcmlhdGUgZm9ybSAqLwotCQlhY2suYnVmZmVyU3BhY2UJPSBodG9ucyhSWFJQQ19DQUxMX0FDS19XSU5ET1dfU0laRSk7Ci0JCWFjay5tYXhTa2V3CT0gaHRvbnMobWluKGNhbGwtPmFja3JfaGlnaF9zZXEgLSBzZXEsCi0JCQkJCSAgICA2NTUzNVUpKTsKLQkJYWNrLmZpcnN0UGFja2V0CT0gaHRvbmwoY2FsbC0+YWNrcl93aW5fYm90KTsKLQkJYWNrLnByZXZpb3VzUGFja2V0ID0gY2FsbC0+YWNrcl9wcmV2X3NlcTsKLQkJYWNrLnNlcmlhbAk9IGhkci0+c2VyaWFsOwotCQlhY2sucmVhc29uCT0gc3BlY2lhbF9BQ0s7Ci0JCWFjay5uQWNrcwk9IDA7Ci0KLQkJX3Byb3RvKCJSeCBTZW5kaW5nIHMtQUNLIgotCQkgICAgICAgIiB7IG09JWh1IGY9IyV1IHA9IyV1IHM9JSUldSByPSVzIG49JXUgfSIsCi0JCSAgICAgICBudG9ocyhhY2subWF4U2tldyksCi0JCSAgICAgICBudG9obChhY2suZmlyc3RQYWNrZXQpLAotCQkgICAgICAgbnRvaGwoYWNrLnByZXZpb3VzUGFja2V0KSwKLQkJICAgICAgIG50b2hsKGFjay5zZXJpYWwpLAotCQkgICAgICAgcnhycGNfYWNrc1thY2sucmVhc29uXSwKLQkJICAgICAgIGFjay5uQWNrcyk7Ci0KLQkJZGlvdlswXS5pb3ZfbGVuICA9IHNpemVvZihzdHJ1Y3QgcnhycGNfYWNrcGFja2V0KTsKLQkJZGlvdlswXS5pb3ZfYmFzZSA9ICZhY2s7Ci0JCWRpb3ZbMV0uaW92X2xlbiAgPSBzaXplb2YoYWNrcyk7Ci0JCWRpb3ZbMV0uaW92X2Jhc2UgPSBhY2tzOwotCi0JCS8qIGJ1aWxkIGFuZCBzZW5kIHRoZSBtZXNzYWdlICovCi0JCWVyciA9IHJ4cnBjX2Nvbm5fbmV3bXNnKGNhbGwtPmNvbm4sY2FsbCwgUlhSUENfUEFDS0VUX1RZUEVfQUNLLAotCQkJCQloZHItPnNlcSA/IDIgOiAxLCBkaW92LAotCQkJCQlHRlBfS0VSTkVMLAotCQkJCQkmbXNnKTsKLQkJaWYgKGVyciA8IDApIHsKLQkJCXJldCA9IGVycjsKLQkJCWdvdG8gb3V0OwotCQl9Ci0KLQkJbXNnLT5zZXEgPSBzZXE7Ci0JCW1zZy0+aGRyLnNlcSA9IGh0b25sKHNlcSk7Ci0JCW1zZy0+aGRyLmZsYWdzIHw9IFJYUlBDX1NMT1dfU1RBUlRfT0s7Ci0KLQkJZXJyID0gcnhycGNfY29ubl9zZW5kbXNnKGNhbGwtPmNvbm4sIG1zZyk7Ci0JCXJ4cnBjX3B1dF9tZXNzYWdlKG1zZyk7Ci0JCWlmIChlcnIgPCAwKSB7Ci0JCQlyZXQgPSBlcnI7Ci0JCQlnb3RvIG91dDsKLQkJfQotCQljYWxsLT5wa3Rfc25kX2NvdW50Kys7Ci0JfQotCi0gb3V0OgotCWlmIChoZHItPnNlcSkKLQkJY2FsbC0+YWNrcl9wcmV2X3NlcSA9IGhkci0+c2VxOwotCi0JX2xlYXZlKCIgPSAlZCIsIHJldCk7Ci0JcmV0dXJuIHJldDsKLX0gLyogZW5kIHJ4cnBjX2NhbGxfZ2VuZXJhdGVfQUNLKCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIGhhbmRsZSB3b3JrIHRvIGJlIGRvbmUgb24gYSBjYWxsCi0gKiAtIGluY2x1ZGVzIHBhY2tldCByZWNlcHRpb24gYW5kIHRpbWVvdXQgcHJvY2Vzc2luZwotICovCi12b2lkIHJ4cnBjX2NhbGxfZG9fc3R1ZmYoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpCi17Ci0JX2VudGVyKCIlcHtmbGFncz0lbHh9IiwgY2FsbCwgY2FsbC0+ZmxhZ3MpOwotCi0JLyogaGFuZGxlIHBhY2tldCByZWNlcHRpb24gKi8KLQlpZiAoY2FsbC0+ZmxhZ3MgJiBSWFJQQ19DQUxMX1JDVl9QS1QpIHsKLQkJX2RlYnVnKCItIHJlY2VpdmUgcGFja2V0Iik7Ci0JCWNhbGwtPmZsYWdzICY9IH5SWFJQQ19DQUxMX1JDVl9QS1Q7Ci0JCXJ4cnBjX2NhbGxfcmVjZWl2ZV9wYWNrZXQoY2FsbCk7Ci0JfQotCi0JLyogaGFuZGxlIG92ZXJkdWUgQUNLcyAqLwotCWlmIChjYWxsLT5mbGFncyAmIFJYUlBDX0NBTExfQUNLU19USU1PKSB7Ci0JCV9kZWJ1ZygiLSBvdmVyZHVlIEFDSyB0aW1lb3V0Iik7Ci0JCWNhbGwtPmZsYWdzICY9IH5SWFJQQ19DQUxMX0FDS1NfVElNTzsKLQkJcnhycGNfY2FsbF9yZXNlbmQoY2FsbCwgY2FsbC0+c25kX3NlcV9jb3VudCk7Ci0JfQotCi0JLyogaGFuZGxlIGxhY2sgb2YgcmVjZXB0aW9uICovCi0JaWYgKGNhbGwtPmZsYWdzICYgUlhSUENfQ0FMTF9SQ1ZfVElNTykgewotCQlfZGVidWcoIi0gcmVjZXB0aW9uIHRpbWVvdXQiKTsKLQkJY2FsbC0+ZmxhZ3MgJj0gflJYUlBDX0NBTExfUkNWX1RJTU87Ci0JCXJ4cnBjX2NhbGxfYWJvcnQoY2FsbCwgLUVJTyk7Ci0JfQotCi0JLyogaGFuZGxlIGRlZmVycmVkIEFDS3MgKi8KLQlpZiAoY2FsbC0+ZmxhZ3MgJiBSWFJQQ19DQUxMX0FDS1JfVElNTyB8fAotCSAgICAoY2FsbC0+YWNrci5uQWNrcyA+IDAgJiYgY2FsbC0+YWNrci5yZWFzb24gPT0gUlhSUENfQUNLX1JFUVVFU1RFRCkKLQkgICAgKSB7Ci0JCV9kZWJ1ZygiLSBkZWZlcnJlZCBBQ0sgdGltZW91dDogY2o9JTA1bHUgcj0lcyBuPSV1IiwKLQkJICAgICAgIGppZmZpZXMgLSBjYWxsLT5jamlmLAotCQkgICAgICAgcnhycGNfYWNrc1tjYWxsLT5hY2tyLnJlYXNvbl0sCi0JCSAgICAgICBjYWxsLT5hY2tyLm5BY2tzKTsKLQotCQljYWxsLT5mbGFncyAmPSB+UlhSUENfQ0FMTF9BQ0tSX1RJTU87Ci0KLQkJaWYgKGNhbGwtPmFja3IubkFja3MgPiAwICYmCi0JCSAgICBjYWxsLT5hcHBfY2FsbF9zdGF0ZSAhPSBSWFJQQ19DU1RBVEVfRVJST1IpIHsKLQkJCS8qIGdlbmVyYXRlIEFDSyAqLwotCQkJX19yeHJwY19jYWxsX2dlbl9ub3JtYWxfQUNLKGNhbGwsIGNhbGwtPmFja3JfZGZyX3NlcSk7Ci0JCQljYWxsLT5hY2tyX2Rmcl9zZXEgPSAwOwotCQl9Ci0JfQotCi0JX2xlYXZlKCIiKTsKLQotfSAvKiBlbmQgcnhycGNfY2FsbF9kb19zdHVmZigpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBzZW5kIGFuIGFib3J0IG1lc3NhZ2UgYXQgY2FsbCBvciBjb25uZWN0aW9uIGxldmVsCi0gKiAtIG11c3QgYmUgY2FsbGVkIHdpdGggY2FsbC0+bG9jayBoZWxkCi0gKiAtIHRoZSBzdXBwbGllZCBlcnJvciBjb2RlIGlzIHNlbnQgYXMgdGhlIHBhY2tldCBkYXRhCi0gKi8KLXN0YXRpYyBpbnQgX19yeHJwY19jYWxsX2Fib3J0KHN0cnVjdCByeHJwY19jYWxsICpjYWxsLCBpbnQgZXJybm8pCi17Ci0Jc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4gPSBjYWxsLT5jb25uOwotCXN0cnVjdCByeHJwY19tZXNzYWdlICptc2c7Ci0Jc3RydWN0IGt2ZWMgZGlvdlsxXTsKLQlpbnQgcmV0OwotCV9fYmUzMiBfZXJyb3I7Ci0KLQlfZW50ZXIoIiVweyUwOHh9LCVweyVkfSwlZCIsCi0JICAgICAgIGNvbm4sIG50b2hsKGNvbm4tPmNvbm5faWQpLCBjYWxsLCBudG9obChjYWxsLT5jYWxsX2lkKSwgZXJybm8pOwotCi0JLyogaWYgdGhpcyBjYWxsIGlzIGFscmVhZHkgYWJvcnRlZCwgdGhlbiBqdXN0IHdha2UgdXAgYW55IHdhaXRlcnMgKi8KLQlpZiAoY2FsbC0+YXBwX2NhbGxfc3RhdGUgPT0gUlhSUENfQ1NUQVRFX0VSUk9SKSB7Ci0JCXNwaW5fdW5sb2NrKCZjYWxsLT5sb2NrKTsKLQkJY2FsbC0+YXBwX2Vycm9yX2Z1bmMoY2FsbCk7Ci0JCV9sZWF2ZSgiID0gMCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlyeHJwY19nZXRfY2FsbChjYWxsKTsKLQotCS8qIGNoYW5nZSB0aGUgc3RhdGUgX3dpdGhfIHRoZSBsb2NrIHN0aWxsIGhlbGQgKi8KLQljYWxsLT5hcHBfY2FsbF9zdGF0ZQk9IFJYUlBDX0NTVEFURV9FUlJPUjsKLQljYWxsLT5hcHBfZXJyX3N0YXRlCT0gUlhSUENfRVNUQVRFX0xPQ0FMX0FCT1JUOwotCWNhbGwtPmFwcF9lcnJubwkJPSBlcnJubzsKLQljYWxsLT5hcHBfbWFyawkJPSBSWFJQQ19BUFBfTUFSS19FT0Y7Ci0JY2FsbC0+YXBwX3JlYWRfYnVmCT0gTlVMTDsKLQljYWxsLT5hcHBfYXN5bmNfcmVhZAk9IDA7Ci0KLQlfc3RhdGUoY2FsbCk7Ci0KLQkvKiBhc2sgdGhlIGFwcCB0byB0cmFuc2xhdGUgdGhlIGVycm9yIGNvZGUgKi8KLQljYWxsLT5hcHBfYWVtYXBfZnVuYyhjYWxsKTsKLQotCXNwaW5fdW5sb2NrKCZjYWxsLT5sb2NrKTsKLQotCS8qIGZsdXNoIGFueSBvdXRzdGFuZGluZyBBQ0tzICovCi0JZGVsX3RpbWVyX3N5bmMoJmNhbGwtPmFja3NfdGltZW91dCk7Ci0JZGVsX3RpbWVyX3N5bmMoJmNhbGwtPnJjdl90aW1lb3V0KTsKLQlkZWxfdGltZXJfc3luYygmY2FsbC0+YWNrcl9kZnJfdGltbyk7Ci0KLQlpZiAocnhycGNfY2FsbF9pc19hY2tfcGVuZGluZyhjYWxsKSkKLQkJX19yeHJwY19jYWxsX2dlbl9ub3JtYWxfQUNLKGNhbGwsIDApOwotCi0JLyogc2VuZCB0aGUgYWJvcnQgcGFja2V0IG9ubHkgaWYgd2UgYWN0dWFsbHkgdHJhZGVkIHNvbWUgb3RoZXIKLQkgKiBwYWNrZXRzICovCi0JcmV0ID0gMDsKLQlpZiAoY2FsbC0+cGt0X3NuZF9jb3VudCB8fCBjYWxsLT5wa3RfcmN2X2NvdW50KSB7Ci0JCS8qIGFjdHVhbGx5IHNlbmQgdGhlIGFib3J0ICovCi0JCV9wcm90bygiUnggU2VuZGluZyBDYWxsIEFCT1JUIHsgZGF0YT0lZCB9IiwKLQkJICAgICAgIGNhbGwtPmFwcF9hYm9ydF9jb2RlKTsKLQotCQlfZXJyb3IgPSBodG9ubChjYWxsLT5hcHBfYWJvcnRfY29kZSk7Ci0KLQkJZGlvdlswXS5pb3ZfbGVuICA9IHNpemVvZihfZXJyb3IpOwotCQlkaW92WzBdLmlvdl9iYXNlID0gJl9lcnJvcjsKLQotCQlyZXQgPSByeHJwY19jb25uX25ld21zZyhjb25uLCBjYWxsLCBSWFJQQ19QQUNLRVRfVFlQRV9BQk9SVCwKLQkJCQkJMSwgZGlvdiwgR0ZQX0tFUk5FTCwgJm1zZyk7Ci0JCWlmIChyZXQgPT0gMCkgewotCQkJcmV0ID0gcnhycGNfY29ubl9zZW5kbXNnKGNvbm4sIG1zZyk7Ci0JCQlyeHJwY19wdXRfbWVzc2FnZShtc2cpOwotCQl9Ci0JfQotCi0JLyogdGVsbCB0aGUgYXBwIGxheWVyIHRvIGxldCBnbyAqLwotCWNhbGwtPmFwcF9lcnJvcl9mdW5jKGNhbGwpOwotCi0JcnhycGNfcHV0X2NhbGwoY2FsbCk7Ci0KLQlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKLQlyZXR1cm4gcmV0OwotfSAvKiBlbmQgX19yeHJwY19jYWxsX2Fib3J0KCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIHNlbmQgYW4gYWJvcnQgbWVzc2FnZSBhdCBjYWxsIG9yIGNvbm5lY3Rpb24gbGV2ZWwKLSAqIC0gdGhlIHN1cHBsaWVkIGVycm9yIGNvZGUgaXMgc2VudCBhcyB0aGUgcGFja2V0IGRhdGEKLSAqLwotaW50IHJ4cnBjX2NhbGxfYWJvcnQoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIGludCBlcnJvcikKLXsKLQlzcGluX2xvY2soJmNhbGwtPmxvY2spOwotCi0JcmV0dXJuIF9fcnhycGNfY2FsbF9hYm9ydChjYWxsLCBlcnJvcik7Ci0KLX0gLyogZW5kIHJ4cnBjX2NhbGxfYWJvcnQoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogcHJvY2VzcyBwYWNrZXRzIHdhaXRpbmcgZm9yIHRoaXMgY2FsbAotICovCi1zdGF0aWMgdm9pZCByeHJwY19jYWxsX3JlY2VpdmVfcGFja2V0KHN0cnVjdCByeHJwY19jYWxsICpjYWxsKQotewotCXN0cnVjdCByeHJwY19tZXNzYWdlICptc2c7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqX3A7Ci0KLQlfZW50ZXIoIiVwIiwgY2FsbCk7Ci0KLQlyeHJwY19nZXRfY2FsbChjYWxsKTsgLyogbXVzdCBub3QgZ28gYXdheSB0b28gc29vbiBpZiBhYm9ydGVkIGJ5Ci0JCQkgICAgICAgKiBhcHAtbGF5ZXIgKi8KLQotCXdoaWxlICghbGlzdF9lbXB0eSgmY2FsbC0+cmN2X3JlY2VpdmVxKSkgewotCQkvKiB0cnkgdG8gZ2V0IG5leHQgcGFja2V0ICovCi0JCV9wID0gTlVMTDsKLQkJc3Bpbl9sb2NrKCZjYWxsLT5sb2NrKTsKLQkJaWYgKCFsaXN0X2VtcHR5KCZjYWxsLT5yY3ZfcmVjZWl2ZXEpKSB7Ci0JCQlfcCA9IGNhbGwtPnJjdl9yZWNlaXZlcS5uZXh0OwotCQkJbGlzdF9kZWxfaW5pdChfcCk7Ci0JCX0KLQkJc3Bpbl91bmxvY2soJmNhbGwtPmxvY2spOwotCi0JCWlmICghX3ApCi0JCQlicmVhazsKLQotCQltc2cgPSBsaXN0X2VudHJ5KF9wLCBzdHJ1Y3QgcnhycGNfbWVzc2FnZSwgbGluayk7Ci0KLQkJX3Byb3RvKCJSeCAlMDVsdSBSZWNlaXZlZCAlcyBwYWNrZXQgKCUlJXUsIyV1LCVjJWMlYyVjJWMpIiwKLQkJICAgICAgIGppZmZpZXMgLSBjYWxsLT5jamlmLAotCQkgICAgICAgcnhycGNfcGt0c1ttc2ctPmhkci50eXBlXSwKLQkJICAgICAgIG50b2hsKG1zZy0+aGRyLnNlcmlhbCksCi0JCSAgICAgICBtc2ctPnNlcSwKLQkJICAgICAgIG1zZy0+aGRyLmZsYWdzICYgUlhSUENfSlVNQk9fUEFDS0VUCT8gJ2onIDogJy0nLAotCQkgICAgICAgbXNnLT5oZHIuZmxhZ3MgJiBSWFJQQ19NT1JFX1BBQ0tFVFMJPyAnbScgOiAnLScsCi0JCSAgICAgICBtc2ctPmhkci5mbGFncyAmIFJYUlBDX0xBU1RfUEFDS0VUCT8gJ2wnIDogJy0nLAotCQkgICAgICAgbXNnLT5oZHIuZmxhZ3MgJiBSWFJQQ19SRVFVRVNUX0FDSwk/ICdyJyA6ICctJywKLQkJICAgICAgIG1zZy0+aGRyLmZsYWdzICYgUlhSUENfQ0xJRU5UX0lOSVRJQVRFRAk/ICdDJyA6ICdTJwotCQkgICAgICAgKTsKLQotCQlzd2l0Y2ggKG1zZy0+aGRyLnR5cGUpIHsKLQkJCS8qIGRlYWwgd2l0aCBkYXRhIHBhY2tldHMgKi8KLQkJY2FzZSBSWFJQQ19QQUNLRVRfVFlQRV9EQVRBOgotCQkJLyogQUNLIHRoZSBwYWNrZXQgaWYgbmVjZXNzYXJ5ICovCi0JCQlzd2l0Y2ggKHJ4cnBjX2NhbGxfZ2VuZXJhdGVfQUNLKGNhbGwsICZtc2ctPmhkciwKLQkJCQkJCQlOVUxMKSkgewotCQkJY2FzZSAwOiAvKiB1c2VmdWwgcGFja2V0ICovCi0JCQkJcnhycGNfY2FsbF9yZWNlaXZlX2RhdGFfcGFja2V0KGNhbGwsIG1zZyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDE6IC8qIGR1cGxpY2F0ZSBvciBvdXQtb2Ytd2luZG93IHBhY2tldCAqLwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlyeHJwY19wdXRfbWVzc2FnZShtc2cpOwotCQkJCWdvdG8gb3V0OwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJCS8qIGRlYWwgd2l0aCBBQ0sgcGFja2V0cyAqLwotCQljYXNlIFJYUlBDX1BBQ0tFVF9UWVBFX0FDSzoKLQkJCXJ4cnBjX2NhbGxfcmVjZWl2ZV9hY2tfcGFja2V0KGNhbGwsIG1zZyk7Ci0JCQlicmVhazsKLQotCQkJLyogZGVhbCB3aXRoIGFib3J0IHBhY2tldHMgKi8KLQkJY2FzZSBSWFJQQ19QQUNLRVRfVFlQRV9BQk9SVDogewotCQkJX19iZTMyIF9kYnVmLCAqZHA7Ci0KLQkJCWRwID0gc2tiX2hlYWRlcl9wb2ludGVyKG1zZy0+cGt0LCBtc2ctPm9mZnNldCwKLQkJCQkJCXNpemVvZihfZGJ1ZiksICZfZGJ1Zik7Ci0JCQlpZiAoZHAgPT0gTlVMTCkKLQkJCQlwcmludGsoIlJ4IFJlY2VpdmVkIHNob3J0IEFCT1JUIHBhY2tldFxuIik7Ci0KLQkJCV9wcm90bygiUnggUmVjZWl2ZWQgQ2FsbCBBQk9SVCB7IGRhdGE9JWQgfSIsCi0JCQkgICAgICAgKGRwID8gbnRvaGwoKmRwKSA6IDApKTsKLQotCQkJc3Bpbl9sb2NrKCZjYWxsLT5sb2NrKTsKLQkJCWNhbGwtPmFwcF9jYWxsX3N0YXRlCT0gUlhSUENfQ1NUQVRFX0VSUk9SOwotCQkJY2FsbC0+YXBwX2Vycl9zdGF0ZQk9IFJYUlBDX0VTVEFURV9QRUVSX0FCT1JUOwotCQkJY2FsbC0+YXBwX2Fib3J0X2NvZGUJPSAoZHAgPyBudG9obCgqZHApIDogMCk7Ci0JCQljYWxsLT5hcHBfZXJybm8JCT0gLUVDT05OQUJPUlRFRDsKLQkJCWNhbGwtPmFwcF9tYXJrCQk9IFJYUlBDX0FQUF9NQVJLX0VPRjsKLQkJCWNhbGwtPmFwcF9yZWFkX2J1Zgk9IE5VTEw7Ci0JCQljYWxsLT5hcHBfYXN5bmNfcmVhZAk9IDA7Ci0KLQkJCS8qIGFzayB0aGUgYXBwIHRvIHRyYW5zbGF0ZSB0aGUgZXJyb3IgY29kZSAqLwotCQkJY2FsbC0+YXBwX2FlbWFwX2Z1bmMoY2FsbCk7Ci0JCQlfc3RhdGUoY2FsbCk7Ci0JCQlzcGluX3VubG9jaygmY2FsbC0+bG9jayk7Ci0JCQljYWxsLT5hcHBfZXJyb3JfZnVuYyhjYWxsKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWRlZmF1bHQ6Ci0JCQkvKiBkZWFsIHdpdGggb3RoZXIgcGFja2V0IHR5cGVzICovCi0JCQlfcHJvdG8oIlJ4IFVuc3VwcG9ydGVkIHBhY2tldCB0eXBlICV1ICgjJXUpIiwKLQkJCSAgICAgICBtc2ctPmhkci50eXBlLCBtc2ctPnNlcSk7Ci0JCQlicmVhazsKLQkJfQotCi0JCXJ4cnBjX3B1dF9tZXNzYWdlKG1zZyk7Ci0JfQotCi0gb3V0OgotCXJ4cnBjX3B1dF9jYWxsKGNhbGwpOwotCV9sZWF2ZSgiIik7Ci19IC8qIGVuZCByeHJwY19jYWxsX3JlY2VpdmVfcGFja2V0KCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIHByb2Nlc3MgbmV4dCBkYXRhIHBhY2tldAotICogLSBhcyB0aGUgbmV4dCBkYXRhIHBhY2tldCBhcnJpdmVzOgotICogICAtIGl0IGlzIHF1ZXVlZCBvbiBhcHBfcmVhZHlxIF9pZl8gaXQgaXMgdGhlIG5leHQgb25lIGV4cGVjdGVkCi0gKiAgICAgKGFwcF9yZWFkeV9zZXErMSkKLSAqICAgLSBpdCBpcyBxdWV1ZWQgb24gYXBwX3VucmVhZHlxIF9pZl8gaXQgaXMgbm90IHRoZSBuZXh0IG9uZSBleHBlY3RlZAotICogICAtIGlmIGEgcGFja2V0IHBsYWNlZCBvbiBhcHBfcmVhZHlxIGNvbXBsZXRlbHkgZmlsbHMgYSBob2xlIGxlYWRpbmcgdXAgdG8KLSAqICAgICB0aGUgZmlyc3QgcGFja2V0IG9uIGFwcF91bnJlYWR5cSwgdGhlbiBwYWNrZXRzIG5vdyBpbiBzZXF1ZW5jZSBhcmUKLSAqICAgICB0cmFuZmVycmVkIHRvIGFwcF9yZWFkeXEKLSAqIC0gdGhlIGFwcGxpY2F0aW9uIGxheWVyIGNhbiBvbmx5IHNlZSBwYWNrZXRzIG9uIGFwcF9yZWFkeXEKLSAqICAgKGFwcF9yZWFkeV9xdHkgYnl0ZXMpCi0gKiAtIHRoZSBhcHBsaWNhdGlvbiBsYXllciBpcyBwcm9kZGVkIGV2ZXJ5IHRpbWUgYSBuZXcgcGFja2V0IGFycml2ZXMKLSAqLwotc3RhdGljIHZvaWQgcnhycGNfY2FsbF9yZWNlaXZlX2RhdGFfcGFja2V0KHN0cnVjdCByeHJwY19jYWxsICpjYWxsLAotCQkJCQkgICBzdHJ1Y3QgcnhycGNfbWVzc2FnZSAqbXNnKQotewotCWNvbnN0IHN0cnVjdCByeHJwY19vcGVyYXRpb24gKm9wdGJsLCAqb3A7Ci0Jc3RydWN0IHJ4cnBjX21lc3NhZ2UgKnBtc2c7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqX3A7Ci0JaW50IHJldCwgbG8sIGhpLCBybXRpbW87Ci0JX19iZTMyIG9waWQ7Ci0KLQlfZW50ZXIoIiVweyV1fSwlcHsldX0iLCBjYWxsLCBudG9obChjYWxsLT5jYWxsX2lkKSwgbXNnLCBtc2ctPnNlcSk7Ci0KLQlyeHJwY19nZXRfbWVzc2FnZShtc2cpOwotCi0JLyogYWRkIHRvIHRoZSB1bnJlYWR5IHF1ZXVlIGlmIHdlJ2QgaGF2ZSB0byBjcmVhdGUgYSBob2xlIGluIHRoZSByZWFkeQotCSAqIHF1ZXVlIG90aGVyd2lzZSAqLwotCWlmIChtc2ctPnNlcSAhPSBjYWxsLT5hcHBfcmVhZHlfc2VxICsgMSkgewotCQlfZGVidWcoIkNhbGwgYWRkIHBhY2tldCAlZCB0byB1bnJlYWR5cSIsIG1zZy0+c2VxKTsKLQotCQkvKiBpbnNlcnQgaW4gc2VxIG9yZGVyICovCi0JCWxpc3RfZm9yX2VhY2goX3AsICZjYWxsLT5hcHBfdW5yZWFkeXEpIHsKLQkJCXBtc2cgPSBsaXN0X2VudHJ5KF9wLCBzdHJ1Y3QgcnhycGNfbWVzc2FnZSwgbGluayk7Ci0JCQlpZiAocG1zZy0+c2VxID4gbXNnLT5zZXEpCi0JCQkJYnJlYWs7Ci0JCX0KLQotCQlsaXN0X2FkZF90YWlsKCZtc2ctPmxpbmssIF9wKTsKLQotCQlfbGVhdmUoIiBbdW5yZWFkeXFdIik7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBuZXh0IGluIHNlcXVlbmNlIC0gc2ltcGx5IGFwcGVuZCBpbnRvIHRoZSBjYWxsJ3MgcmVhZHkgcXVldWUgKi8KLQlfZGVidWcoIkNhbGwgYWRkIHBhY2tldCAlZCB0byByZWFkeXEgKCslWmQgPT4gJVpkIGJ5dGVzKSIsCi0JICAgICAgIG1zZy0+c2VxLCBtc2ctPmRzaXplLCBjYWxsLT5hcHBfcmVhZHlfcXR5KTsKLQotCXNwaW5fbG9jaygmY2FsbC0+bG9jayk7Ci0JY2FsbC0+YXBwX3JlYWR5X3NlcSA9IG1zZy0+c2VxOwotCWNhbGwtPmFwcF9yZWFkeV9xdHkgKz0gbXNnLT5kc2l6ZTsKLQlsaXN0X2FkZF90YWlsKCZtc2ctPmxpbmssICZjYWxsLT5hcHBfcmVhZHlxKTsKLQotCS8qIG1vdmUgdW5yZWFkeSBwYWNrZXRzIHRvIHRoZSByZWFkeXEgaWYgd2UgZ290IHJpZCBvZiBhIGhvbGUgKi8KLQl3aGlsZSAoIWxpc3RfZW1wdHkoJmNhbGwtPmFwcF91bnJlYWR5cSkpIHsKLQkJcG1zZyA9IGxpc3RfZW50cnkoY2FsbC0+YXBwX3VucmVhZHlxLm5leHQsCi0JCQkJICBzdHJ1Y3QgcnhycGNfbWVzc2FnZSwgbGluayk7Ci0KLQkJaWYgKHBtc2ctPnNlcSAhPSBjYWxsLT5hcHBfcmVhZHlfc2VxICsgMSkKLQkJCWJyZWFrOwotCi0JCS8qIG5leHQgaW4gc2VxdWVuY2UgLSBqdXN0IG1vdmUgbGlzdC10by1saXN0ICovCi0JCV9kZWJ1ZygiQ2FsbCB0cmFuc2ZlciBwYWNrZXQgJWQgdG8gcmVhZHlxICgrJVpkID0+ICVaZCBieXRlcykiLAotCQkgICAgICAgcG1zZy0+c2VxLCBwbXNnLT5kc2l6ZSwgY2FsbC0+YXBwX3JlYWR5X3F0eSk7Ci0KLQkJY2FsbC0+YXBwX3JlYWR5X3NlcSA9IHBtc2ctPnNlcTsKLQkJY2FsbC0+YXBwX3JlYWR5X3F0eSArPSBwbXNnLT5kc2l6ZTsKLQkJbGlzdF9tb3ZlX3RhaWwoJnBtc2ctPmxpbmssICZjYWxsLT5hcHBfcmVhZHlxKTsKLQl9Ci0KLQkvKiBzZWUgaWYgd2UndmUgZ290IHRoZSBsYXN0IHBhY2tldCB5ZXQgKi8KLQlpZiAoIWxpc3RfZW1wdHkoJmNhbGwtPmFwcF9yZWFkeXEpKSB7Ci0JCXBtc2cgPSBsaXN0X2VudHJ5KGNhbGwtPmFwcF9yZWFkeXEucHJldiwKLQkJCQkgIHN0cnVjdCByeHJwY19tZXNzYWdlLCBsaW5rKTsKLQkJaWYgKHBtc2ctPmhkci5mbGFncyAmIFJYUlBDX0xBU1RfUEFDS0VUKSB7Ci0JCQljYWxsLT5hcHBfbGFzdF9yY3YgPSAxOwotCQkJX2RlYnVnKCJMYXN0IHBhY2tldCBvbiByZWFkeXEiKTsKLQkJfQotCX0KLQotCXN3aXRjaCAoY2FsbC0+YXBwX2NhbGxfc3RhdGUpIHsKLQkJLyogZG8gbm90aGluZyBpZiBjYWxsIGFscmVhZHkgYWJvcnRlZCAqLwotCWNhc2UgUlhSUENfQ1NUQVRFX0VSUk9SOgotCQlzcGluX3VubG9jaygmY2FsbC0+bG9jayk7Ci0JCV9sZWF2ZSgiIFtlcnJvcl0iKTsKLQkJcmV0dXJuOwotCi0JCS8qIGV4dHJhY3QgdGhlIG9wZXJhdGlvbiBJRCBmcm9tIGFuIGluY29taW5nIGNhbGwgaWYgdGhhdCdzIG5vdAotCQkgKiB5ZXQgYmVlbiBkb25lICovCi0JY2FzZSBSWFJQQ19DU1RBVEVfU1JWUl9SQ1ZfT1BJRDoKLQkJc3Bpbl91bmxvY2soJmNhbGwtPmxvY2spOwotCi0JCS8qIGhhbmRsZSBhcyB5ZXQgaW5zdWZmaWNpZW50IGRhdGEgZm9yIHRoZSBvcGVyYXRpb24gSUQgKi8KLQkJaWYgKGNhbGwtPmFwcF9yZWFkeV9xdHkgPCA0KSB7Ci0JCQlpZiAoY2FsbC0+YXBwX2xhc3RfcmN2KQotCQkJCS8qIHRyb3VibGUgLSBsYXN0IHBhY2tldCBzZWVuICovCi0JCQkJcnhycGNfY2FsbF9hYm9ydChjYWxsLCAtRUlOVkFMKTsKLQotCQkJX2xlYXZlKCIiKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8qIHB1bGwgdGhlIG9wZXJhdGlvbiBJRCBvdXQgb2YgdGhlIGJ1ZmZlciAqLwotCQlyZXQgPSByeHJwY19jYWxsX3JlYWRfZGF0YShjYWxsLCAmb3BpZCwgc2l6ZW9mKG9waWQpLCAwKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCXByaW50aygiVW5leHBlY3RlZCBlcnJvciBmcm9tIHJlYWQtZGF0YTogJWRcbiIsIHJldCk7Ci0JCQlpZiAoY2FsbC0+YXBwX2NhbGxfc3RhdGUgIT0gUlhSUENfQ1NUQVRFX0VSUk9SKQotCQkJCXJ4cnBjX2NhbGxfYWJvcnQoY2FsbCwgcmV0KTsKLQkJCV9sZWF2ZSgiIik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJY2FsbC0+YXBwX29wY29kZSA9IG50b2hsKG9waWQpOwotCi0JCS8qIGxvY2F0ZSB0aGUgb3BlcmF0aW9uIGluIHRoZSBhdmFpbGFibGUgb3BzIHRhYmxlICovCi0JCW9wdGJsID0gY2FsbC0+Y29ubi0+c2VydmljZS0+b3BzX2JlZ2luOwotCQlsbyA9IDA7Ci0JCWhpID0gY2FsbC0+Y29ubi0+c2VydmljZS0+b3BzX2VuZCAtIG9wdGJsOwotCi0JCXdoaWxlIChsbyA8IGhpKSB7Ci0JCQlpbnQgbWlkID0gKGhpICsgbG8pIC8gMjsKLQkJCW9wID0gJm9wdGJsW21pZF07Ci0JCQlpZiAoY2FsbC0+YXBwX29wY29kZSA9PSBvcC0+aWQpCi0JCQkJZ290byBmb3VuZF9vcDsKLQkJCWlmIChjYWxsLT5hcHBfb3Bjb2RlID4gb3AtPmlkKQotCQkJCWxvID0gbWlkICsgMTsKLQkJCWVsc2UKLQkJCQloaSA9IG1pZDsKLQkJfQotCi0JCS8qIHNlYXJjaCBmYWlsZWQgKi8KLQkJa3Byb3RvKCJSeCBDbGllbnQgcmVxdWVzdGVkIG9wZXJhdGlvbiAlZCBmcm9tICVzIHNlcnZpY2UiLAotCQkgICAgICAgY2FsbC0+YXBwX29wY29kZSwgY2FsbC0+Y29ubi0+c2VydmljZS0+bmFtZSk7Ci0JCXJ4cnBjX2NhbGxfYWJvcnQoY2FsbCwgLUVJTlZBTCk7Ci0JCV9sZWF2ZSgiIFtpbnZhbF0iKTsKLQkJcmV0dXJuOwotCi0JZm91bmRfb3A6Ci0JCV9wcm90bygiUnggQ2xpZW50IHJlcXVlc3RlZCBvcGVyYXRpb24gJXMgZnJvbSAlcyBzZXJ2aWNlIiwKLQkJICAgICAgIG9wLT5uYW1lLCBjYWxsLT5jb25uLT5zZXJ2aWNlLT5uYW1lKTsKLQotCQkvKiB3ZSdyZSBub3cgd2FpdGluZyBmb3IgdGhlIGFyZ3VtZW50IGJsb2NrICh1bmxlc3MgdGhlIGNhbGwKLQkJICogd2FzIGFib3J0ZWQpICovCi0JCXNwaW5fbG9jaygmY2FsbC0+bG9jayk7Ci0JCWlmIChjYWxsLT5hcHBfY2FsbF9zdGF0ZSA9PSBSWFJQQ19DU1RBVEVfU1JWUl9SQ1ZfT1BJRCB8fAotCQkgICAgY2FsbC0+YXBwX2NhbGxfc3RhdGUgPT0gUlhSUENfQ1NUQVRFX1NSVlJfU05EX1JFUExZKSB7Ci0JCQlpZiAoIWNhbGwtPmFwcF9sYXN0X3JjdikKLQkJCQljYWxsLT5hcHBfY2FsbF9zdGF0ZSA9Ci0JCQkJCVJYUlBDX0NTVEFURV9TUlZSX1JDVl9BUkdTOwotCQkJZWxzZSBpZiAoY2FsbC0+YXBwX3JlYWR5X3F0eSA+IDApCi0JCQkJY2FsbC0+YXBwX2NhbGxfc3RhdGUgPQotCQkJCQlSWFJQQ19DU1RBVEVfU1JWUl9HT1RfQVJHUzsKLQkJCWVsc2UKLQkJCQljYWxsLT5hcHBfY2FsbF9zdGF0ZSA9Ci0JCQkJCVJYUlBDX0NTVEFURV9TUlZSX1NORF9SRVBMWTsKLQkJCWNhbGwtPmFwcF9tYXJrID0gb3AtPmFzaXplOwotCQkJY2FsbC0+YXBwX3VzZXIgPSBvcC0+dXNlcjsKLQkJfQotCQlzcGluX3VubG9jaygmY2FsbC0+bG9jayk7Ci0KLQkJX3N0YXRlKGNhbGwpOwotCQlicmVhazsKLQotCWNhc2UgUlhSUENfQ1NUQVRFX1NSVlJfUkNWX0FSR1M6Ci0JCS8qIGNoYW5nZSBzdGF0ZSBpZiBqdXN0IHJlY2VpdmVkIGxhc3QgcGFja2V0IG9mIGFyZyBibG9jayAqLwotCQlpZiAoY2FsbC0+YXBwX2xhc3RfcmN2KQotCQkJY2FsbC0+YXBwX2NhbGxfc3RhdGUgPSBSWFJQQ19DU1RBVEVfU1JWUl9HT1RfQVJHUzsKLQkJc3Bpbl91bmxvY2soJmNhbGwtPmxvY2spOwotCi0JCV9zdGF0ZShjYWxsKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFJYUlBDX0NTVEFURV9DTE5UX1JDVl9SRVBMWToKLQkJLyogY2hhbmdlIHN0YXRlIGlmIGp1c3QgcmVjZWl2ZWQgbGFzdCBwYWNrZXQgb2YgcmVwbHkgYmxvY2sgKi8KLQkJcm10aW1vID0gMDsKLQkJaWYgKGNhbGwtPmFwcF9sYXN0X3JjdikgewotCQkJY2FsbC0+YXBwX2NhbGxfc3RhdGUgPSBSWFJQQ19DU1RBVEVfQ0xOVF9HT1RfUkVQTFk7Ci0JCQlybXRpbW8gPSAxOwotCQl9Ci0JCXNwaW5fdW5sb2NrKCZjYWxsLT5sb2NrKTsKLQotCQlpZiAocm10aW1vKSB7Ci0JCQlkZWxfdGltZXJfc3luYygmY2FsbC0+YWNrc190aW1lb3V0KTsKLQkJCWRlbF90aW1lcl9zeW5jKCZjYWxsLT5yY3ZfdGltZW91dCk7Ci0JCQlkZWxfdGltZXJfc3luYygmY2FsbC0+YWNrcl9kZnJfdGltbyk7Ci0JCX0KLQotCQlfc3RhdGUoY2FsbCk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJLyogZGVhbCB3aXRoIGRhdGEgcmVjZXB0aW9uIGluIGFuIHVuZXhwZWN0ZWQgc3RhdGUgKi8KLQkJcHJpbnRrKCJVbmV4cGVjdGVkIHN0YXRlIFtbWyAldSBdXV1cbiIsIGNhbGwtPmFwcF9jYWxsX3N0YXRlKTsKLQkJX19yeHJwY19jYWxsX2Fib3J0KGNhbGwsIC1FQkFETVNHKTsKLQkJX2xlYXZlKCIiKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChjYWxsLT5hcHBfY2FsbF9zdGF0ZSA9PSBSWFJQQ19DU1RBVEVfQ0xOVF9SQ1ZfUkVQTFkgJiYKLQkgICAgY2FsbC0+YXBwX2xhc3RfcmN2KQotCQlCVUcoKTsKLQotCS8qIG90aGVyd2lzZSBqdXN0IGludm9rZSB0aGUgZGF0YSBmdW5jdGlvbiB3aGVuZXZlciB3ZSBjYW4gc2F0aXNmeSBpdHMgZGVzaXJlIGZvciBtb3JlCi0JICogZGF0YQotCSAqLwotCV9wcm90bygiUnggUmVjZWl2ZWQgT3AgRGF0YTogc3Q9JXUgcXR5PSVadSBtaz0lWnUlcyIsCi0JICAgICAgIGNhbGwtPmFwcF9jYWxsX3N0YXRlLCBjYWxsLT5hcHBfcmVhZHlfcXR5LCBjYWxsLT5hcHBfbWFyaywKLQkgICAgICAgY2FsbC0+YXBwX2xhc3RfcmN2ID8gIiBsYXN0LXJjdmQiIDogIiIpOwotCi0Jc3Bpbl9sb2NrKCZjYWxsLT5sb2NrKTsKLQotCXJldCA9IF9fcnhycGNfY2FsbF9yZWFkX2RhdGEoY2FsbCk7Ci0Jc3dpdGNoIChyZXQpIHsKLQljYXNlIDA6Ci0JCXNwaW5fdW5sb2NrKCZjYWxsLT5sb2NrKTsKLQkJY2FsbC0+YXBwX2F0dG5fZnVuYyhjYWxsKTsKLQkJYnJlYWs7Ci0JY2FzZSAtRUFHQUlOOgotCQlzcGluX3VubG9jaygmY2FsbC0+bG9jayk7Ci0JCWJyZWFrOwotCWNhc2UgLUVDT05OQUJPUlRFRDoKLQkJc3Bpbl91bmxvY2soJmNhbGwtPmxvY2spOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlfX3J4cnBjX2NhbGxfYWJvcnQoY2FsbCwgcmV0KTsKLQkJYnJlYWs7Ci0JfQotCi0JX3N0YXRlKGNhbGwpOwotCi0JX2xlYXZlKCIiKTsKLQotfSAvKiBlbmQgcnhycGNfY2FsbF9yZWNlaXZlX2RhdGFfcGFja2V0KCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIHJlY2VpdmVkIGFuIEFDSyBwYWNrZXQKLSAqLwotc3RhdGljIHZvaWQgcnhycGNfY2FsbF9yZWNlaXZlX2Fja19wYWNrZXQoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsCi0JCQkJCSAgc3RydWN0IHJ4cnBjX21lc3NhZ2UgKm1zZykKLXsKLQlzdHJ1Y3QgcnhycGNfYWNrcGFja2V0IF9hY2ssICphcDsKLQlyeHJwY19zZXJpYWxfbmV0X3Qgc2VyaWFsOwotCXJ4cnBjX3NlcV90IHNlcTsKLQlpbnQgcmV0OwotCi0JX2VudGVyKCIlcHsldX0sJXB7JXV9IiwgY2FsbCwgbnRvaGwoY2FsbC0+Y2FsbF9pZCksIG1zZywgbXNnLT5zZXEpOwotCi0JLyogZXh0cmFjdCB0aGUgYmFzaWMgQUNLIHJlY29yZCAqLwotCWFwID0gc2tiX2hlYWRlcl9wb2ludGVyKG1zZy0+cGt0LCBtc2ctPm9mZnNldCwgc2l6ZW9mKF9hY2spLCAmX2Fjayk7Ci0JaWYgKGFwID09IE5VTEwpIHsKLQkJcHJpbnRrKCJSeCBSZWNlaXZlZCBzaG9ydCBBQ0sgcGFja2V0XG4iKTsKLQkJcmV0dXJuOwotCX0KLQltc2ctPm9mZnNldCArPSBzaXplb2YoX2Fjayk7Ci0KLQlzZXJpYWwgPSBhcC0+c2VyaWFsOwotCXNlcSA9IG50b2hsKGFwLT5maXJzdFBhY2tldCk7Ci0KLQlfcHJvdG8oIlJ4IFJlY2VpdmVkIEFDSyAlJSVkIHsgYj0laHUgbT0laHUgZj0ldSBwPSV1IHM9JXUgcj0lcyBuPSV1IH0iLAotCSAgICAgICBudG9obChtc2ctPmhkci5zZXJpYWwpLAotCSAgICAgICBudG9ocyhhcC0+YnVmZmVyU3BhY2UpLAotCSAgICAgICBudG9ocyhhcC0+bWF4U2tldyksCi0JICAgICAgIHNlcSwKLQkgICAgICAgbnRvaGwoYXAtPnByZXZpb3VzUGFja2V0KSwKLQkgICAgICAgbnRvaGwoc2VyaWFsKSwKLQkgICAgICAgcnhycGNfYWNrc1thcC0+cmVhc29uXSwKLQkgICAgICAgY2FsbC0+YWNrci5uQWNrcwotCSAgICAgICApOwotCi0JLyogY2hlY2sgdGhlIG90aGVyIHNpZGUgaXNuJ3QgQUNLJ2luZyBhIHNlcXVlbmNlIG51bWJlciBJIGhhdmVuJ3Qgc2VudAotCSAqIHlldCAqLwotCWlmIChhcC0+bkFja3MgPiAwICYmCi0JICAgIChzZXEgPiBjYWxsLT5zbmRfc2VxX2NvdW50IHx8Ci0JICAgICBzZXEgKyBhcC0+bkFja3MgLSAxID4gY2FsbC0+c25kX3NlcV9jb3VudCkpIHsKLQkJcHJpbnRrKCJSZWNlaXZlZCBBQ0sgKCMldS0jJXUpIGZvciB1bnNlbnQgcGFja2V0XG4iLAotCQkgICAgICAgc2VxLCBzZXEgKyBhcC0+bkFja3MgLSAxKTsKLQkJcnhycGNfY2FsbF9hYm9ydChjYWxsLCAtRUlOVkFMKTsKLQkJX2xlYXZlKCIiKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIGRlYWwgd2l0aCBSVFQgY2FsY3VsYXRpb24gKi8KLQlpZiAoc2VyaWFsKSB7Ci0JCXN0cnVjdCByeHJwY19tZXNzYWdlICpydHRtc2c7Ci0KLQkJLyogZmluZCB0aGUgcHJvbXB0aW5nIHBhY2tldCAqLwotCQlzcGluX2xvY2soJmNhbGwtPmxvY2spOwotCQlpZiAoY2FsbC0+c25kX3BpbmcgJiYgY2FsbC0+c25kX3BpbmctPmhkci5zZXJpYWwgPT0gc2VyaWFsKSB7Ci0JCQkvKiBpdCB3YXMgYSBwaW5nIHBhY2tldCAqLwotCQkJcnR0bXNnID0gY2FsbC0+c25kX3Bpbmc7Ci0JCQljYWxsLT5zbmRfcGluZyA9IE5VTEw7Ci0JCQlzcGluX3VubG9jaygmY2FsbC0+bG9jayk7Ci0KLQkJCWlmIChydHRtc2cpIHsKLQkJCQlydHRtc2ctPnJ0dGRvbmUgPSAxOwotCQkJCXJ4cnBjX3BlZXJfY2FsY3VsYXRlX3J0dChjYWxsLT5jb25uLT5wZWVyLAotCQkJCQkJCSBydHRtc2csIG1zZyk7Ci0JCQkJcnhycGNfcHV0X21lc3NhZ2UocnR0bXNnKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXN0cnVjdCBsaXN0X2hlYWQgKl9wOwotCi0JCQkvKiBpdCBvdWdodCB0byBiZSBhIGRhdGEgcGFja2V0IC0gbG9vayBpbiB0aGUgcGVuZGluZwotCQkJICogQUNLIGxpc3QgKi8KLQkJCWxpc3RfZm9yX2VhY2goX3AsICZjYWxsLT5hY2tzX3BlbmRxKSB7Ci0JCQkJcnR0bXNnID0gbGlzdF9lbnRyeShfcCwgc3RydWN0IHJ4cnBjX21lc3NhZ2UsCi0JCQkJCQkgICAgbGluayk7Ci0JCQkJaWYgKHJ0dG1zZy0+aGRyLnNlcmlhbCA9PSBzZXJpYWwpIHsKLQkJCQkJaWYgKHJ0dG1zZy0+cnR0ZG9uZSkKLQkJCQkJCS8qIG5ldmVyIGRvIFJUVCB0d2ljZSB3aXRob3V0Ci0JCQkJCQkgKiByZXNlbmRpbmcgKi8KLQkJCQkJCWJyZWFrOwotCi0JCQkJCXJ0dG1zZy0+cnR0ZG9uZSA9IDE7Ci0JCQkJCXJ4cnBjX3BlZXJfY2FsY3VsYXRlX3J0dCgKLQkJCQkJCWNhbGwtPmNvbm4tPnBlZXIsIHJ0dG1zZywgbXNnKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJc3Bpbl91bmxvY2soJmNhbGwtPmxvY2spOwotCQl9Ci0JfQotCi0Jc3dpdGNoIChhcC0+cmVhc29uKSB7Ci0JCS8qIGRlYWwgd2l0aCBuZWdhdGl2ZS9wb3NpdGl2ZSBhY2tub3dsZWRnZW1lbnQgb2YgZGF0YQotCQkgKiBwYWNrZXRzICovCi0JY2FzZSBSWFJQQ19BQ0tfUkVRVUVTVEVEOgotCWNhc2UgUlhSUENfQUNLX0RFTEFZOgotCWNhc2UgUlhSUENfQUNLX0lETEU6Ci0JCXJ4cnBjX2NhbGxfZGVmaW5pdGl2ZWx5X0FDSyhjYWxsLCBzZXEgLSAxKTsKLQotCWNhc2UgUlhSUENfQUNLX0RVUExJQ0FURToKLQljYXNlIFJYUlBDX0FDS19PVVRfT0ZfU0VRVUVOQ0U6Ci0JY2FzZSBSWFJQQ19BQ0tfRVhDRUVEU19XSU5ET1c6Ci0JCWNhbGwtPnNuZF9yZXNlbmRfY250ID0gMDsKLQkJcmV0ID0gcnhycGNfY2FsbF9yZWNvcmRfQUNLKGNhbGwsIG1zZywgc2VxLCBhcC0+bkFja3MpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJ4cnBjX2NhbGxfYWJvcnQoY2FsbCwgcmV0KTsKLQkJYnJlYWs7Ci0KLQkJLyogcmVzcG9uZCB0byBwaW5nIHBhY2tldHMgaW1tZWRpYXRlbHkgKi8KLQljYXNlIFJYUlBDX0FDS19QSU5HOgotCQlyeHJwY19jYWxsX2dlbmVyYXRlX0FDSyhjYWxsLCAmbXNnLT5oZHIsIGFwKTsKLQkJYnJlYWs7Ci0KLQkJLyogb25seSByZWNvcmQgUlRUIG9uIHBpbmcgcmVzcG9uc2UgcGFja2V0cyAqLwotCWNhc2UgUlhSUENfQUNLX1BJTkdfUkVTUE9OU0U6Ci0JCWlmIChjYWxsLT5zbmRfcGluZykgewotCQkJc3RydWN0IHJ4cnBjX21lc3NhZ2UgKnJ0dG1zZzsKLQotCQkJLyogb25seSBkbyBSVFQgc3R1ZmYgaWYgdGhlIHJlc3BvbnNlIG1hdGNoZXMgdGhlCi0JCQkgKiByZXRhaW5lZCBwaW5nICovCi0JCQlydHRtc2cgPSBOVUxMOwotCQkJc3Bpbl9sb2NrKCZjYWxsLT5sb2NrKTsKLQkJCWlmIChjYWxsLT5zbmRfcGluZyAmJgotCQkJICAgIGNhbGwtPnNuZF9waW5nLT5oZHIuc2VyaWFsID09IGFwLT5zZXJpYWwpIHsKLQkJCQlydHRtc2cgPSBjYWxsLT5zbmRfcGluZzsKLQkJCQljYWxsLT5zbmRfcGluZyA9IE5VTEw7Ci0JCQl9Ci0JCQlzcGluX3VubG9jaygmY2FsbC0+bG9jayk7Ci0KLQkJCWlmIChydHRtc2cpIHsKLQkJCQlydHRtc2ctPnJ0dGRvbmUgPSAxOwotCQkJCXJ4cnBjX3BlZXJfY2FsY3VsYXRlX3J0dChjYWxsLT5jb25uLT5wZWVyLAotCQkJCQkJCSBydHRtc2csIG1zZyk7Ci0JCQkJcnhycGNfcHV0X21lc3NhZ2UocnR0bXNnKTsKLQkJCX0KLQkJfQotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXByaW50aygiVW5zdXBwb3J0ZWQgQUNLIHJlYXNvbiAldVxuIiwgYXAtPnJlYXNvbik7Ci0JCWJyZWFrOwotCX0KLQotCV9sZWF2ZSgiIik7Ci19IC8qIGVuZCByeHJwY19jYWxsX3JlY2VpdmVfYWNrX3BhY2tldCgpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiByZWNvcmQgZGVmaW5pdGl2ZSBBQ0tzIGZvciBhbGwgbWVzc2FnZXMgdXAgdG8gYW5kIGluY2x1ZGluZyB0aGUgb25lIHdpdGggdGhlCi0gKiAnaGlnaGVzdCcgc2VxCi0gKi8KLXN0YXRpYyB2b2lkIHJ4cnBjX2NhbGxfZGVmaW5pdGl2ZWx5X0FDSyhzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwKLQkJCQkJcnhycGNfc2VxX3QgaGlnaGVzdCkKLXsKLQlzdHJ1Y3QgcnhycGNfbWVzc2FnZSAqbXNnOwotCWludCBub3dfY29tcGxldGU7Ci0KLQlfZW50ZXIoIiVwe2Fkcz0ldX0sJXUiLCBjYWxsLCBjYWxsLT5hY2tzX2RmdHZfc2VxLCBoaWdoZXN0KTsKLQotCXdoaWxlIChjYWxsLT5hY2tzX2RmdHZfc2VxIDwgaGlnaGVzdCkgewotCQljYWxsLT5hY2tzX2RmdHZfc2VxKys7Ci0KLQkJX3Byb3RvKCJEZWZpbml0aXZlIEFDSyBvbiBwYWNrZXQgIyV1IiwgY2FsbC0+YWNrc19kZnR2X3NlcSk7Ci0KLQkJLyogZGlzY2FyZCB0aG9zZSBhdCBmcm9udCBvZiBxdWV1ZSB1bnRpbCBtZXNzYWdlIHdpdGggaGlnaGVzdAotCQkgKiBBQ0sgaXMgZm91bmQgKi8KLQkJc3Bpbl9sb2NrKCZjYWxsLT5sb2NrKTsKLQkJbXNnID0gTlVMTDsKLQkJaWYgKCFsaXN0X2VtcHR5KCZjYWxsLT5hY2tzX3BlbmRxKSkgewotCQkJbXNnID0gbGlzdF9lbnRyeShjYWxsLT5hY2tzX3BlbmRxLm5leHQsCi0JCQkJCSBzdHJ1Y3QgcnhycGNfbWVzc2FnZSwgbGluayk7Ci0JCQlsaXN0X2RlbF9pbml0KCZtc2ctPmxpbmspOyAvKiBkZXF1ZXVlICovCi0JCQlpZiAobXNnLT5zdGF0ZSA9PSBSWFJQQ19NU0dfU0VOVCkKLQkJCQljYWxsLT5hY2tzX3BlbmRfY250LS07Ci0JCX0KLQkJc3Bpbl91bmxvY2soJmNhbGwtPmxvY2spOwotCi0JCS8qIGluc2FuaXR5IGNoZWNrICovCi0JCWlmICghbXNnKQotCQkJcGFuaWMoIiVzKCk6IGFja3NfcGVuZHEgdW5leHBlY3RlZGx5IGVtcHR5XG4iLAotCQkJICAgICAgX19GVU5DVElPTl9fKTsKLQotCQlpZiAobXNnLT5zZXEgIT0gY2FsbC0+YWNrc19kZnR2X3NlcSkKLQkJCXBhbmljKCIlcygpOiBQYWNrZXQgIyV1IGV4cGVjdGVkIGF0IGZyb250IG9mIGFja3NfcGVuZHEiCi0JCQkgICAgICAiICgjJXUgZm91bmQpXG4iLAotCQkJICAgICAgX19GVU5DVElPTl9fLCBjYWxsLT5hY2tzX2RmdHZfc2VxLCBtc2ctPnNlcSk7Ci0KLQkJLyogZGlzY2FyZCB0aGUgbWVzc2FnZSAqLwotCQltc2ctPnN0YXRlID0gUlhSUENfTVNHX0RPTkU7Ci0JCXJ4cnBjX3B1dF9tZXNzYWdlKG1zZyk7Ci0JfQotCi0JLyogaWYgYWxsIHNlbnQgcGFja2V0cyBhcmUgZGVmaW5pdGl2ZWx5IEFDSydkIHRoZW4gcHJvZCBhbnkgc2xlZXBlcnMganVzdCBpbiBjYXNlICovCi0Jbm93X2NvbXBsZXRlID0gMDsKLQlzcGluX2xvY2soJmNhbGwtPmxvY2spOwotCWlmIChjYWxsLT5hY2tzX2RmdHZfc2VxID09IGNhbGwtPnNuZF9zZXFfY291bnQpIHsKLQkJaWYgKGNhbGwtPmFwcF9jYWxsX3N0YXRlICE9IFJYUlBDX0NTVEFURV9DT01QTEVURSkgewotCQkJY2FsbC0+YXBwX2NhbGxfc3RhdGUgPSBSWFJQQ19DU1RBVEVfQ09NUExFVEU7Ci0JCQlfc3RhdGUoY2FsbCk7Ci0JCQlub3dfY29tcGxldGUgPSAxOwotCQl9Ci0JfQotCXNwaW5fdW5sb2NrKCZjYWxsLT5sb2NrKTsKLQotCWlmIChub3dfY29tcGxldGUpIHsKLQkJZGVsX3RpbWVyX3N5bmMoJmNhbGwtPmFja3NfdGltZW91dCk7Ci0JCWRlbF90aW1lcl9zeW5jKCZjYWxsLT5yY3ZfdGltZW91dCk7Ci0JCWRlbF90aW1lcl9zeW5jKCZjYWxsLT5hY2tyX2Rmcl90aW1vKTsKLQkJY2FsbC0+YXBwX2F0dG5fZnVuYyhjYWxsKTsKLQl9Ci0KLQlfbGVhdmUoIiIpOwotfSAvKiBlbmQgcnhycGNfY2FsbF9kZWZpbml0aXZlbHlfQUNLKCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIHJlY29yZCB0aGUgc3BlY2lmaWVkIGFtb3VudCBvZiBBQ0tzL05BS3MKLSAqLwotc3RhdGljIGludCByeHJwY19jYWxsX3JlY29yZF9BQ0soc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsCi0JCQkJIHN0cnVjdCByeHJwY19tZXNzYWdlICptc2csCi0JCQkJIHJ4cnBjX3NlcV90IHNlcSwKLQkJCQkgc2l6ZV90IGNvdW50KQotewotCXN0cnVjdCByeHJwY19tZXNzYWdlICpkbXNnOwotCXN0cnVjdCBsaXN0X2hlYWQgKl9wOwotCXJ4cnBjX3NlcV90IGhpZ2hlc3Q7Ci0JdW5zaWduZWQgaXg7Ci0Jc2l6ZV90IGNodW5rOwotCWNoYXIgcmVzZW5kLCBub3dfY29tcGxldGU7Ci0JdTggYWNrc1sxNl07Ci0KLQlfZW50ZXIoIiVwe2FwYz0ldSBhZHM9JXV9LCVwLCV1LCVadSIsCi0JICAgICAgIGNhbGwsIGNhbGwtPmFja3NfcGVuZF9jbnQsIGNhbGwtPmFja3NfZGZ0dl9zZXEsCi0JICAgICAgIG1zZywgc2VxLCBjb3VudCk7Ci0KLQkvKiBoYW5kbGUgcmUtQUNLJ2luZyBvZiBkZWZpbml0aXZlbHkgQUNLJ2QgcGFja2V0cyAobWF5IGJlIG91dC1vZi1vcmRlcgotCSAqIEFDS3MpICovCi0JaWYgKHNlcSA8PSBjYWxsLT5hY2tzX2RmdHZfc2VxKSB7Ci0JCXVuc2lnbmVkIGRlbHRhID0gY2FsbC0+YWNrc19kZnR2X3NlcSAtIHNlcTsKLQotCQlpZiAoY291bnQgPD0gZGVsdGEpIHsKLQkJCV9sZWF2ZSgiID0gMCBbYWxsIGRlZmluaXRpdmVseSBBQ0snZF0iKTsKLQkJCXJldHVybiAwOwotCQl9Ci0KLQkJc2VxICs9IGRlbHRhOwotCQljb3VudCAtPSBkZWx0YTsKLQkJbXNnLT5vZmZzZXQgKz0gZGVsdGE7Ci0JfQotCi0JaGlnaGVzdCA9IHNlcSArIGNvdW50IC0gMTsKLQlyZXNlbmQgPSAwOwotCXdoaWxlIChjb3VudCA+IDApIHsKLQkJLyogZXh0cmFjdCB1cCB0byAxNiBBQ0sgc2xvdHMgYXQgYSB0aW1lICovCi0JCWNodW5rID0gbWluKGNvdW50LCBzaXplb2YoYWNrcykpOwotCQljb3VudCAtPSBjaHVuazsKLQotCQltZW1zZXQoYWNrcywgMiwgc2l6ZW9mKGFja3MpKTsKLQotCQlpZiAoc2tiX2NvcHlfYml0cyhtc2ctPnBrdCwgbXNnLT5vZmZzZXQsICZhY2tzLCBjaHVuaykgPCAwKSB7Ci0JCQlwcmludGsoIlJ4IFJlY2VpdmVkIHNob3J0IEFDSyBwYWNrZXRcbiIpOwotCQkJX2xlYXZlKCIgPSAtRUlOVkFMIik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQltc2ctPm9mZnNldCArPSBjaHVuazsKLQotCQkvKiBjaGVjayB0aGF0IHRoZSBBQ0sgc2V0IGlzIHZhbGlkICovCi0JCWZvciAoaXggPSAwOyBpeCA8IGNodW5rOyBpeCsrKSB7Ci0JCQlzd2l0Y2ggKGFja3NbaXhdKSB7Ci0JCQljYXNlIFJYUlBDX0FDS19UWVBFX0FDSzoKLQkJCQlicmVhazsKLQkJCWNhc2UgUlhSUENfQUNLX1RZUEVfTkFDSzoKLQkJCQlyZXNlbmQgPSAxOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlwcmludGsoIlJ4IFJlY2VpdmVkIHVuc3VwcG9ydGVkIEFDSyBzdGF0ZSIKLQkJCQkgICAgICAgIiAldVxuIiwgYWNrc1tpeF0pOwotCQkJCV9sZWF2ZSgiID0gLUVJTlZBTCIpOwotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJfQotCQl9Ci0KLQkJX3Byb3RvKCJSeCBBQ0sgb2YgcGFja2V0cyAjJXUtIyV1ICIKLQkJICAgICAgICJbJWMlYyVjJWMlYyVjJWMlYyVjJWMlYyVjJWMlYyVjJWNdIChwZW5kPSV1KSIsCi0JCSAgICAgICBzZXEsICh1bnNpZ25lZCkgKHNlcSArIGNodW5rIC0gMSksCi0JCSAgICAgICBfYWNrdHlwZVthY2tzWzB4MF1dLAotCQkgICAgICAgX2Fja3R5cGVbYWNrc1sweDFdXSwKLQkJICAgICAgIF9hY2t0eXBlW2Fja3NbMHgyXV0sCi0JCSAgICAgICBfYWNrdHlwZVthY2tzWzB4M11dLAotCQkgICAgICAgX2Fja3R5cGVbYWNrc1sweDRdXSwKLQkJICAgICAgIF9hY2t0eXBlW2Fja3NbMHg1XV0sCi0JCSAgICAgICBfYWNrdHlwZVthY2tzWzB4Nl1dLAotCQkgICAgICAgX2Fja3R5cGVbYWNrc1sweDddXSwKLQkJICAgICAgIF9hY2t0eXBlW2Fja3NbMHg4XV0sCi0JCSAgICAgICBfYWNrdHlwZVthY2tzWzB4OV1dLAotCQkgICAgICAgX2Fja3R5cGVbYWNrc1sweEFdXSwKLQkJICAgICAgIF9hY2t0eXBlW2Fja3NbMHhCXV0sCi0JCSAgICAgICBfYWNrdHlwZVthY2tzWzB4Q11dLAotCQkgICAgICAgX2Fja3R5cGVbYWNrc1sweERdXSwKLQkJICAgICAgIF9hY2t0eXBlW2Fja3NbMHhFXV0sCi0JCSAgICAgICBfYWNrdHlwZVthY2tzWzB4Rl1dLAotCQkgICAgICAgY2FsbC0+YWNrc19wZW5kX2NudAotCQkgICAgICAgKTsKLQotCQkvKiBtYXJrIHRoZSBwYWNrZXRzIGluIHRoZSBBQ0sgcXVldWUgYXMgYmVpbmcgcHJvdmlzaW9uYWxseQotCQkgKiBBQ0snZCAqLwotCQlpeCA9IDA7Ci0JCXNwaW5fbG9jaygmY2FsbC0+bG9jayk7Ci0KLQkJLyogZmluZCB0aGUgZmlyc3QgcGFja2V0IEFDSydkL05BSydkIGhlcmUgKi8KLQkJbGlzdF9mb3JfZWFjaChfcCwgJmNhbGwtPmFja3NfcGVuZHEpIHsKLQkJCWRtc2cgPSBsaXN0X2VudHJ5KF9wLCBzdHJ1Y3QgcnhycGNfbWVzc2FnZSwgbGluayk7Ci0JCQlpZiAoZG1zZy0+c2VxID09IHNlcSkKLQkJCQlnb3RvIGZvdW5kX2ZpcnN0OwotCQkJX2RlYnVnKCItICV1OiBza2lwcGluZyAjJXUiLCBpeCwgZG1zZy0+c2VxKTsKLQkJfQotCQlnb3RvIGJhZF9xdWV1ZTsKLQotCWZvdW5kX2ZpcnN0OgotCQlkbyB7Ci0JCQlfZGVidWcoIi0gJXU6IHByb2Nlc3NpbmcgIyV1ICglYykgYXBjPSV1IiwKLQkJCSAgICAgICBpeCwgZG1zZy0+c2VxLCBfYWNrdHlwZVthY2tzW2l4XV0sCi0JCQkgICAgICAgY2FsbC0+YWNrc19wZW5kX2NudCk7Ci0KLQkJCWlmIChhY2tzW2l4XSA9PSBSWFJQQ19BQ0tfVFlQRV9BQ0spIHsKLQkJCQlpZiAoZG1zZy0+c3RhdGUgPT0gUlhSUENfTVNHX1NFTlQpCi0JCQkJCWNhbGwtPmFja3NfcGVuZF9jbnQtLTsKLQkJCQlkbXNnLT5zdGF0ZSA9IFJYUlBDX01TR19BQ0tFRDsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChkbXNnLT5zdGF0ZSA9PSBSWFJQQ19NU0dfQUNLRUQpCi0JCQkJCWNhbGwtPmFja3NfcGVuZF9jbnQrKzsKLQkJCQlkbXNnLT5zdGF0ZSA9IFJYUlBDX01TR19TRU5UOwotCQkJfQotCQkJaXgrKzsKLQkJCXNlcSsrOwotCi0JCQlfcCA9IGRtc2ctPmxpbmsubmV4dDsKLQkJCWRtc2cgPSBsaXN0X2VudHJ5KF9wLCBzdHJ1Y3QgcnhycGNfbWVzc2FnZSwgbGluayk7Ci0JCX0gd2hpbGUoaXggPCBjaHVuayAmJgotCQkJX3AgIT0gJmNhbGwtPmFja3NfcGVuZHEgJiYKLQkJCWRtc2ctPnNlcSA9PSBzZXEpOwotCi0JCWlmIChpeCA8IGNodW5rKQotCQkJZ290byBiYWRfcXVldWU7Ci0KLQkJc3Bpbl91bmxvY2soJmNhbGwtPmxvY2spOwotCX0KLQotCWlmIChyZXNlbmQpCi0JCXJ4cnBjX2NhbGxfcmVzZW5kKGNhbGwsIGhpZ2hlc3QpOwotCi0JLyogaWYgYWxsIHBhY2tldHMgYXJlIHByb3Zpc2lvbmFsbHkgQUNLJ2QsIHRoZW4gd2FrZSB1cCBhbnlvbmUgd2hvJ3MKLQkgKiB3YWl0aW5nIGZvciB0aGF0ICovCi0Jbm93X2NvbXBsZXRlID0gMDsKLQlzcGluX2xvY2soJmNhbGwtPmxvY2spOwotCWlmIChjYWxsLT5hY2tzX3BlbmRfY250ID09IDApIHsKLQkJaWYgKGNhbGwtPmFwcF9jYWxsX3N0YXRlID09IFJYUlBDX0NTVEFURV9TUlZSX1JDVl9GSU5BTF9BQ0spIHsKLQkJCWNhbGwtPmFwcF9jYWxsX3N0YXRlID0gUlhSUENfQ1NUQVRFX0NPTVBMRVRFOwotCQkJX3N0YXRlKGNhbGwpOwotCQl9Ci0JCW5vd19jb21wbGV0ZSA9IDE7Ci0JfQotCXNwaW5fdW5sb2NrKCZjYWxsLT5sb2NrKTsKLQotCWlmIChub3dfY29tcGxldGUpIHsKLQkJX2RlYnVnKCItIHdha2UgdXAgd2FpdGVycyIpOwotCQlkZWxfdGltZXJfc3luYygmY2FsbC0+YWNrc190aW1lb3V0KTsKLQkJZGVsX3RpbWVyX3N5bmMoJmNhbGwtPnJjdl90aW1lb3V0KTsKLQkJZGVsX3RpbWVyX3N5bmMoJmNhbGwtPmFja3JfZGZyX3RpbW8pOwotCQljYWxsLT5hcHBfYXR0bl9mdW5jKGNhbGwpOwotCX0KLQotCV9sZWF2ZSgiID0gMCAoYXBjPSV1KSIsIGNhbGwtPmFja3NfcGVuZF9jbnQpOwotCXJldHVybiAwOwotCi0gYmFkX3F1ZXVlOgotCXBhbmljKCIlcygpOiBhY2tzX3BlbmRxIGluIGJhZCBzdGF0ZSAocGFja2V0ICMldSBhYnNlbnQpXG4iLAotCSAgICAgIF9fRlVOQ1RJT05fXywgc2VxKTsKLQotfSAvKiBlbmQgcnhycGNfY2FsbF9yZWNvcmRfQUNLKCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIHRyYW5zZmVyIGRhdGEgZnJvbSB0aGUgcmVhZHkgcGFja2V0IHF1ZXVlIHRvIHRoZSBhc3luY2hyb25vdXMgcmVhZCBidWZmZXIKLSAqIC0gc2luY2UgdGhpcyBmdW5jIGlzIHRoZSBvbmx5IG9uZSBnb2luZyB0byBsb29rIGF0IHBhY2tldHMgcXVldWVkIG9uCi0gKiAgIGFwcF9yZWFkeXEsIHdlIGRvbid0IG5lZWQgYSBsb2NrIHRvIG1vZGlmeSBvciBhY2Nlc3MgdGhlbSwgb25seSB0byBtb2RpZnkKLSAqICAgdGhlIHF1ZXVlIHBvaW50ZXJzCi0gKiAtIGNhbGxlZCB3aXRoIGNhbGwtPmxvY2sgaGVsZAotICogLSB0aGUgYnVmZmVyIG11c3QgYmUgaW4ga2VybmVsIHNwYWNlCi0gKiAtIHJldHVybnM6Ci0gKgkwIGlmIGJ1ZmZlciBmaWxsZWQKLSAqCS1FQUdBSU4gaWYgYnVmZmVyIG5vdCBmaWxsZWQgYW5kIG1vcmUgZGF0YSB0byBjb21lCi0gKgktRUJBRE1TRyBpZiBsYXN0IHBhY2tldCByZWNlaXZlZCBhbmQgaW5zdWZmaWNpZW50IGRhdGEgbGVmdAotICoJLUVDT05OQUJPUlRFRCBpZiB0aGUgY2FsbCBoYXMgaW4gYW4gZXJyb3Igc3RhdGUKLSAqLwotc3RhdGljIGludCBfX3J4cnBjX2NhbGxfcmVhZF9kYXRhKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKQotewotCXN0cnVjdCByeHJwY19tZXNzYWdlICptc2c7Ci0Jc2l6ZV90IHF0eTsKLQlpbnQgcmV0OwotCi0JX2VudGVyKCIlcHthcz0lZCBidWY9JXAgcXR5PSVadS8lWnV9IiwKLQkgICAgICAgY2FsbCwKLQkgICAgICAgY2FsbC0+YXBwX2FzeW5jX3JlYWQsIGNhbGwtPmFwcF9yZWFkX2J1ZiwKLQkgICAgICAgY2FsbC0+YXBwX3JlYWR5X3F0eSwgY2FsbC0+YXBwX21hcmspOwotCi0JLyogY2hlY2sgdGhlIHN0YXRlICovCi0Jc3dpdGNoIChjYWxsLT5hcHBfY2FsbF9zdGF0ZSkgewotCWNhc2UgUlhSUENfQ1NUQVRFX1NSVlJfUkNWX0FSR1M6Ci0JY2FzZSBSWFJQQ19DU1RBVEVfQ0xOVF9SQ1ZfUkVQTFk6Ci0JCWlmIChjYWxsLT5hcHBfbGFzdF9yY3YpIHsKLQkJCXByaW50aygiJXMoJXAsJXAsJVpkKToiCi0JCQkgICAgICAgIiBJbmNvbnNpc3RlbnQgY2FsbCBzdGF0ZSAoJXMsIGxhc3QgcGt0KSIsCi0JCQkgICAgICAgX19GVU5DVElPTl9fLAotCQkJICAgICAgIGNhbGwsIGNhbGwtPmFwcF9yZWFkX2J1ZiwgY2FsbC0+YXBwX21hcmssCi0JCQkgICAgICAgcnhycGNfY2FsbF9zdGF0ZXNbY2FsbC0+YXBwX2NhbGxfc3RhdGVdKTsKLQkJCUJVRygpOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBSWFJQQ19DU1RBVEVfU1JWUl9SQ1ZfT1BJRDoKLQljYXNlIFJYUlBDX0NTVEFURV9TUlZSX0dPVF9BUkdTOgotCWNhc2UgUlhSUENfQ1NUQVRFX0NMTlRfR09UX1JFUExZOgotCQlicmVhazsKLQotCWNhc2UgUlhSUENfQ1NUQVRFX1NSVlJfU05EX1JFUExZOgotCQlpZiAoIWNhbGwtPmFwcF9sYXN0X3JjdikgewotCQkJcHJpbnRrKCIlcyglcCwlcCwlWmQpOiIKLQkJCSAgICAgICAiIEluY29uc2lzdGVudCBjYWxsIHN0YXRlICglcywgbm90IGxhc3QgcGt0KSIsCi0JCQkgICAgICAgX19GVU5DVElPTl9fLAotCQkJICAgICAgIGNhbGwsIGNhbGwtPmFwcF9yZWFkX2J1ZiwgY2FsbC0+YXBwX21hcmssCi0JCQkgICAgICAgcnhycGNfY2FsbF9zdGF0ZXNbY2FsbC0+YXBwX2NhbGxfc3RhdGVdKTsKLQkJCUJVRygpOwotCQl9Ci0JCV9kZWJ1ZygiVHJ5aW5nIHRvIHJlYWQgZGF0YSBmcm9tIGNhbGwgaW4gU05EX1JFUExZIHN0YXRlIik7Ci0JCWJyZWFrOwotCi0JY2FzZSBSWFJQQ19DU1RBVEVfRVJST1I6Ci0JCV9sZWF2ZSgiID0gLUVDT05OQUJPUlRFRCIpOwotCQlyZXR1cm4gLUVDT05OQUJPUlRFRDsKLQotCWRlZmF1bHQ6Ci0JCXByaW50aygicmVhZGluZyBpbiB1bmV4cGVjdGVkIHN0YXRlIFtbWyAldSBdXV1cbiIsCi0JCSAgICAgICBjYWxsLT5hcHBfY2FsbF9zdGF0ZSk7Ci0JCUJVRygpOwotCX0KLQotCS8qIGhhbmRsZSB0aGUgY2FzZSBvZiBub3QgaGF2aW5nIGFuIGFzeW5jIGJ1ZmZlciAqLwotCWlmICghY2FsbC0+YXBwX2FzeW5jX3JlYWQpIHsKLQkJaWYgKGNhbGwtPmFwcF9tYXJrID09IFJYUlBDX0FQUF9NQVJLX0VPRikgewotCQkJcmV0ID0gY2FsbC0+YXBwX2xhc3RfcmN2ID8gMCA6IC1FQUdBSU47Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoY2FsbC0+YXBwX21hcmsgPj0gY2FsbC0+YXBwX3JlYWR5X3F0eSkgewotCQkJCWNhbGwtPmFwcF9tYXJrID0gUlhSUENfQVBQX01BUktfRU9GOwotCQkJCXJldCA9IDA7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXQgPSBjYWxsLT5hcHBfbGFzdF9yY3YgPyAtRUJBRE1TRyA6IC1FQUdBSU47Ci0JCQl9Ci0JCX0KLQotCQlfbGVhdmUoIiA9ICVkIFtubyBidWZdIiwgcmV0KTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0Jd2hpbGUgKCFsaXN0X2VtcHR5KCZjYWxsLT5hcHBfcmVhZHlxKSAmJiBjYWxsLT5hcHBfbWFyayA+IDApIHsKLQkJbXNnID0gbGlzdF9lbnRyeShjYWxsLT5hcHBfcmVhZHlxLm5leHQsCi0JCQkJIHN0cnVjdCByeHJwY19tZXNzYWdlLCBsaW5rKTsKLQotCQkvKiBkcmFnIGFzIG11Y2ggZGF0YSBhcyB3ZSBuZWVkIG91dCBvZiB0aGlzIHBhY2tldCAqLwotCQlxdHkgPSBtaW4oY2FsbC0+YXBwX21hcmssIG1zZy0+ZHNpemUpOwotCi0JCV9kZWJ1ZygicmVhZGluZyAlWnUgZnJvbSBza2I9JXAgb2ZmPSVsdSIsCi0JCSAgICAgICBxdHksIG1zZy0+cGt0LCBtc2ctPm9mZnNldCk7Ci0KLQkJaWYgKGNhbGwtPmFwcF9yZWFkX2J1ZikKLQkJCWlmIChza2JfY29weV9iaXRzKG1zZy0+cGt0LCBtc2ctPm9mZnNldCwKLQkJCQkJICBjYWxsLT5hcHBfcmVhZF9idWYsIHF0eSkgPCAwKQotCQkJCXBhbmljKCIlczogRmFpbGVkIHRvIGNvcHkgZGF0YSBmcm9tIHBhY2tldDoiCi0JCQkJICAgICAgIiAoJXAsJXAsJVpkKSIsCi0JCQkJICAgICAgX19GVU5DVElPTl9fLAotCQkJCSAgICAgIGNhbGwsIGNhbGwtPmFwcF9yZWFkX2J1ZiwgcXR5KTsKLQotCQkvKiBpZiB0aGF0IHBhY2tldCBpcyBub3cgZW1wdHksIGRpc2NhcmQgaXQgKi8KLQkJY2FsbC0+YXBwX3JlYWR5X3F0eSAtPSBxdHk7Ci0JCW1zZy0+ZHNpemUgLT0gcXR5OwotCi0JCWlmIChtc2ctPmRzaXplID09IDApIHsKLQkJCWxpc3RfZGVsX2luaXQoJm1zZy0+bGluayk7Ci0JCQlyeHJwY19wdXRfbWVzc2FnZShtc2cpOwotCQl9Ci0JCWVsc2UgewotCQkJbXNnLT5vZmZzZXQgKz0gcXR5OwotCQl9Ci0KLQkJY2FsbC0+YXBwX21hcmsgLT0gcXR5OwotCQlpZiAoY2FsbC0+YXBwX3JlYWRfYnVmKQotCQkJY2FsbC0+YXBwX3JlYWRfYnVmICs9IHF0eTsKLQl9Ci0KLQlpZiAoY2FsbC0+YXBwX21hcmsgPT0gMCkgewotCQljYWxsLT5hcHBfYXN5bmNfcmVhZCA9IDA7Ci0JCWNhbGwtPmFwcF9tYXJrID0gUlhSUENfQVBQX01BUktfRU9GOwotCQljYWxsLT5hcHBfcmVhZF9idWYgPSBOVUxMOwotCi0JCS8qIGFkanVzdCB0aGUgc3RhdGUgaWYgdXNlZCB1cCBhbGwgcGFja2V0cyAqLwotCQlpZiAobGlzdF9lbXB0eSgmY2FsbC0+YXBwX3JlYWR5cSkgJiYgY2FsbC0+YXBwX2xhc3RfcmN2KSB7Ci0JCQlzd2l0Y2ggKGNhbGwtPmFwcF9jYWxsX3N0YXRlKSB7Ci0JCQljYXNlIFJYUlBDX0NTVEFURV9TUlZSX1JDVl9PUElEOgotCQkJCWNhbGwtPmFwcF9jYWxsX3N0YXRlID0gUlhSUENfQ1NUQVRFX1NSVlJfU05EX1JFUExZOwotCQkJCWNhbGwtPmFwcF9tYXJrID0gUlhSUENfQVBQX01BUktfRU9GOwotCQkJCV9zdGF0ZShjYWxsKTsKLQkJCQlkZWxfdGltZXJfc3luYygmY2FsbC0+cmN2X3RpbWVvdXQpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBSWFJQQ19DU1RBVEVfU1JWUl9HT1RfQVJHUzoKLQkJCQljYWxsLT5hcHBfY2FsbF9zdGF0ZSA9IFJYUlBDX0NTVEFURV9TUlZSX1NORF9SRVBMWTsKLQkJCQlfc3RhdGUoY2FsbCk7Ci0JCQkJZGVsX3RpbWVyX3N5bmMoJmNhbGwtPnJjdl90aW1lb3V0KTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJY2FsbC0+YXBwX2NhbGxfc3RhdGUgPSBSWFJQQ19DU1RBVEVfQ09NUExFVEU7Ci0JCQkJX3N0YXRlKGNhbGwpOwotCQkJCWRlbF90aW1lcl9zeW5jKCZjYWxsLT5hY2tzX3RpbWVvdXQpOwotCQkJCWRlbF90aW1lcl9zeW5jKCZjYWxsLT5hY2tyX2Rmcl90aW1vKTsKLQkJCQlkZWxfdGltZXJfc3luYygmY2FsbC0+cmN2X3RpbWVvdXQpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJX2xlYXZlKCIgPSAwIik7Ci0JCXJldHVybiAwOwotCX0KLQotCWlmIChjYWxsLT5hcHBfbGFzdF9yY3YpIHsKLQkJX2RlYnVnKCJJbnN1ZmZpY2llbnQgZGF0YSAoJVp1LyVadSkiLAotCQkgICAgICAgY2FsbC0+YXBwX3JlYWR5X3F0eSwgY2FsbC0+YXBwX21hcmspOwotCQljYWxsLT5hcHBfYXN5bmNfcmVhZCA9IDA7Ci0JCWNhbGwtPmFwcF9tYXJrID0gUlhSUENfQVBQX01BUktfRU9GOwotCQljYWxsLT5hcHBfcmVhZF9idWYgPSBOVUxMOwotCi0JCV9sZWF2ZSgiID0gLUVCQURNU0ciKTsKLQkJcmV0dXJuIC1FQkFETVNHOwotCX0KLQotCV9sZWF2ZSgiID0gLUVBR0FJTiIpOwotCXJldHVybiAtRUFHQUlOOwotfSAvKiBlbmQgX19yeHJwY19jYWxsX3JlYWRfZGF0YSgpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBhdHRlbXB0IHRvIHJlYWQgdGhlIHNwZWNpZmllZCBhbW91bnQgb2YgZGF0YSBmcm9tIHRoZSBjYWxsJ3MgcmVhZHkgcXVldWUKLSAqIGludG8gdGhlIGJ1ZmZlciBwcm92aWRlZAotICogLSBzaW5jZSB0aGlzIGZ1bmMgaXMgdGhlIG9ubHkgb25lIGdvaW5nIHRvIGxvb2sgYXQgcGFja2V0cyBxdWV1ZWQgb24KLSAqICAgYXBwX3JlYWR5cSwgd2UgZG9uJ3QgbmVlZCBhIGxvY2sgdG8gbW9kaWZ5IG9yIGFjY2VzcyB0aGVtLCBvbmx5IHRvIG1vZGlmeQotICogICB0aGUgcXVldWUgcG9pbnRlcnMKLSAqIC0gaWYgdGhlIGJ1ZmZlciBwb2ludGVyIGlzIE5VTEwsIHRoZW4gZGF0YSBpcyBtZXJlbHkgZHJhaW5lZCwgbm90IGNvcGllZAotICogLSBpZiBmbGFncyZSWFJQQ19DQUxMX1JFQURfQkxPQ0ssIHRoZW4gdGhlIGZ1bmN0aW9uIHdpbGwgd2FpdCB1bnRpbCB0aGVyZSBpcwotICogICBlbm91Z2ggZGF0YSBvciBhbiBlcnJvciB3aWxsIGJlIGdlbmVyYXRlZAotICogICAtIG5vdGUgdGhhdCB0aGUgY2FsbGVyIG11c3QgaGF2ZSBhZGRlZCB0aGUgY2FsbGluZyB0YXNrIHRvIHRoZSBjYWxsJ3Mgd2FpdAotICogICAgIHF1ZXVlIGJlZm9yZWhhbmQKLSAqIC0gaWYgZmxhZ3MmUlhSUENfQ0FMTF9SRUFEX0FMTCwgdGhlbiBhbiBlcnJvciB3aWxsIGJlIGdlbmVyYXRlZCBpZiB0aGlzCi0gKiAgIGZ1bmN0aW9uIGRvZXNuJ3QgcmVhZCBhbGwgYXZhaWxhYmxlIGRhdGEKLSAqLwotaW50IHJ4cnBjX2NhbGxfcmVhZF9kYXRhKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLAotCQkJIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUsIGludCBmbGFncykKLXsKLQlpbnQgcmV0OwotCi0JX2VudGVyKCIlcHthcnE9JVp1fSwlcCwlWmQsJXgiLAotCSAgICAgICBjYWxsLCBjYWxsLT5hcHBfcmVhZHlfcXR5LCBidWZmZXIsIHNpemUsIGZsYWdzKTsKLQotCXNwaW5fbG9jaygmY2FsbC0+bG9jayk7Ci0KLQlpZiAodW5saWtlbHkoISFjYWxsLT5hcHBfcmVhZF9idWYpKSB7Ci0JCXNwaW5fdW5sb2NrKCZjYWxsLT5sb2NrKTsKLQkJX2xlYXZlKCIgPSAtRUJVU1kiKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0KLQljYWxsLT5hcHBfbWFyayA9IHNpemU7Ci0JY2FsbC0+YXBwX3JlYWRfYnVmID0gYnVmZmVyOwotCWNhbGwtPmFwcF9hc3luY19yZWFkID0gMTsKLQljYWxsLT5hcHBfcmVhZF9jb3VudCsrOwotCi0JLyogcmVhZCBhcyBtdWNoIGRhdGEgYXMgcG9zc2libGUgKi8KLQlyZXQgPSBfX3J4cnBjX2NhbGxfcmVhZF9kYXRhKGNhbGwpOwotCXN3aXRjaCAocmV0KSB7Ci0JY2FzZSAwOgotCQlpZiAoZmxhZ3MgJiBSWFJQQ19DQUxMX1JFQURfQUxMICYmCi0JCSAgICAoIWNhbGwtPmFwcF9sYXN0X3JjdiB8fCBjYWxsLT5hcHBfcmVhZHlfcXR5ID4gMCkpIHsKLQkJCV9sZWF2ZSgiID0gLUVCQURNU0ciKTsKLQkJCV9fcnhycGNfY2FsbF9hYm9ydChjYWxsLCAtRUJBRE1TRyk7Ci0JCQlyZXR1cm4gLUVCQURNU0c7Ci0JCX0KLQotCQlzcGluX3VubG9jaygmY2FsbC0+bG9jayk7Ci0JCWNhbGwtPmFwcF9hdHRuX2Z1bmMoY2FsbCk7Ci0JCV9sZWF2ZSgiID0gMCIpOwotCQlyZXR1cm4gcmV0OwotCi0JY2FzZSAtRUNPTk5BQk9SVEVEOgotCQlzcGluX3VubG9jaygmY2FsbC0+bG9jayk7Ci0JCV9sZWF2ZSgiID0gJWQgW2Fib3J0ZWRdIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQotCWRlZmF1bHQ6Ci0JCV9fcnhycGNfY2FsbF9hYm9ydChjYWxsLCByZXQpOwotCQlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQotCWNhc2UgLUVBR0FJTjoKLQkJc3Bpbl91bmxvY2soJmNhbGwtPmxvY2spOwotCi0JCWlmICghKGZsYWdzICYgUlhSUENfQ0FMTF9SRUFEX0JMT0NLKSkgewotCQkJX2xlYXZlKCIgPSAtRUFHQUlOIik7Ci0JCQlyZXR1cm4gLUVBR0FJTjsKLQkJfQotCi0JCS8qIHdhaXQgZm9yIHRoZSBkYXRhIHRvIGFycml2ZSAqLwotCQlfZGVidWcoImJsb2NraW5nIGZvciBkYXRhIGFycml2YWwiKTsKLQotCQlmb3IgKDs7KSB7Ci0JCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCQkJaWYgKCFjYWxsLT5hcHBfYXN5bmNfcmVhZCB8fCBzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKLQkJCQlicmVhazsKLQkJCXNjaGVkdWxlKCk7Ci0JCX0KLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKLQotCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKLQkJCV9sZWF2ZSgiID0gLUVJTlRSIik7Ci0JCQlyZXR1cm4gLUVJTlRSOwotCQl9Ci0KLQkJaWYgKGNhbGwtPmFwcF9jYWxsX3N0YXRlID09IFJYUlBDX0NTVEFURV9FUlJPUikgewotCQkJX2xlYXZlKCIgPSAtRUNPTk5BQk9SVEVEIik7Ci0JCQlyZXR1cm4gLUVDT05OQUJPUlRFRDsKLQkJfQotCi0JCV9sZWF2ZSgiID0gMCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLX0gLyogZW5kIHJ4cnBjX2NhbGxfcmVhZF9kYXRhKCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIHdyaXRlIGRhdGEgdG8gYSBjYWxsCi0gKiAtIHRoZSBkYXRhIG1heSBub3QgYmUgc2VudCBpbW1lZGlhdGVseSBpZiBpdCBkb2Vzbid0IGZpbGwgYSBidWZmZXIKLSAqIC0gaWYgd2UgY2FuJ3QgcXVldWUgYWxsIHRoZSBkYXRhIGZvciBidWZmZXJpbmcgbm93LCBzaW92W10gd2lsbCBoYXZlIGJlZW4KLSAqICAgYWRqdXN0ZWQgdG8gdGFrZSBhY2NvdW50IG9mIHdoYXQgaGFzIGJlZW4gc2VudAotICovCi1pbnQgcnhycGNfY2FsbF93cml0ZV9kYXRhKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLAotCQkJICBzaXplX3Qgc2lvYywKLQkJCSAgc3RydWN0IGt2ZWMgKnNpb3YsCi0JCQkgIHU4IHJ4aGRyX2ZsYWdzLAotCQkJICBnZnBfdCBhbGxvY19mbGFncywKLQkJCSAgaW50IGR1cF9kYXRhLAotCQkJICBzaXplX3QgKnNpemVfc2VudCkKLXsKLQlzdHJ1Y3QgcnhycGNfbWVzc2FnZSAqbXNnOwotCXN0cnVjdCBrdmVjICpzcHRyOwotCXNpemVfdCBzcGFjZSwgc2l6ZSwgY2h1bmssIHRtcDsKLQljaGFyICpidWY7Ci0JaW50IHJldDsKLQotCV9lbnRlcigiJXAsJVp1LCVwLCUwMngsJXgsJWQsJXAiLAotCSAgICAgICBjYWxsLCBzaW9jLCBzaW92LCByeGhkcl9mbGFncywgYWxsb2NfZmxhZ3MsIGR1cF9kYXRhLAotCSAgICAgICBzaXplX3NlbnQpOwotCi0JKnNpemVfc2VudCA9IDA7Ci0Jc2l6ZSA9IDA7Ci0JcmV0ID0gLUVJTlZBTDsKLQotCS8qIGNhbid0IHNlbmQgbW9yZSBpZiB3ZSd2ZSBzZW50IGxhc3QgcGFja2V0IGZyb20gdGhpcyBlbmQgKi8KLQlzd2l0Y2ggKGNhbGwtPmFwcF9jYWxsX3N0YXRlKSB7Ci0JY2FzZSBSWFJQQ19DU1RBVEVfU1JWUl9TTkRfUkVQTFk6Ci0JY2FzZSBSWFJQQ19DU1RBVEVfQ0xOVF9TTkRfQVJHUzoKLQkJYnJlYWs7Ci0JY2FzZSBSWFJQQ19DU1RBVEVfRVJST1I6Ci0JCXJldCA9IGNhbGwtPmFwcF9lcnJubzsKLQlkZWZhdWx0OgotCQlnb3RvIG91dDsKLQl9Ci0KLQkvKiBjYWxjdWxhdGUgaG93IG11Y2ggZGF0YSB3ZSd2ZSBiZWVuIGdpdmVuICovCi0Jc3B0ciA9IHNpb3Y7Ci0JZm9yICg7IHNpb2MgPiAwOyBzcHRyKyssIHNpb2MtLSkgewotCQlpZiAoIXNwdHItPmlvdl9sZW4pCi0JCQljb250aW51ZTsKLQotCQlpZiAoIXNwdHItPmlvdl9iYXNlKQotCQkJZ290byBvdXQ7Ci0KLQkJc2l6ZSArPSBzcHRyLT5pb3ZfbGVuOwotCX0KLQotCV9kZWJ1ZygiLSBzaXplPSVadSBtdHU9JVp1Iiwgc2l6ZSwgY2FsbC0+Y29ubi0+bXR1X3NpemUpOwotCi0JZG8gewotCQkvKiBtYWtlIHN1cmUgdGhlcmUncyBhIG1lc3NhZ2UgdW5kZXIgY29uc3RydWN0aW9uICovCi0JCWlmICghY2FsbC0+c25kX25leHRtc2cpIHsKLQkJCS8qIG5vIC0gYWxsb2NhdGUgYSBtZXNzYWdlIHdpdGggbm8gZGF0YSB5ZXQgYXR0YWNoZWQgKi8KLQkJCXJldCA9IHJ4cnBjX2Nvbm5fbmV3bXNnKGNhbGwtPmNvbm4sIGNhbGwsCi0JCQkJCQlSWFJQQ19QQUNLRVRfVFlQRV9EQVRBLAotCQkJCQkJMCwgTlVMTCwgYWxsb2NfZmxhZ3MsCi0JCQkJCQkmY2FsbC0+c25kX25leHRtc2cpOwotCQkJaWYgKHJldCA8IDApCi0JCQkJZ290byBvdXQ7Ci0JCQlfZGVidWcoIi0gYWxsb2NhdGVkIG5ldyBtZXNzYWdlIFtkcz0lWnVdIiwKLQkJCSAgICAgICBjYWxsLT5zbmRfbmV4dG1zZy0+ZHNpemUpOwotCQl9Ci0KLQkJbXNnID0gY2FsbC0+c25kX25leHRtc2c7Ci0JCW1zZy0+aGRyLmZsYWdzIHw9IHJ4aGRyX2ZsYWdzOwotCi0JCS8qIGRlYWwgd2l0aCB6ZXJvLWxlbmd0aCB0ZXJtaW5hbCBwYWNrZXQgKi8KLQkJaWYgKHNpemUgPT0gMCkgewotCQkJaWYgKHJ4aGRyX2ZsYWdzICYgUlhSUENfTEFTVF9QQUNLRVQpIHsKLQkJCQlyZXQgPSByeHJwY19jYWxsX2ZsdXNoKGNhbGwpOwotCQkJCWlmIChyZXQgPCAwKQotCQkJCQlnb3RvIG91dDsKLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0KLQkJLyogd29yayBvdXQgaG93IG11Y2ggc3BhY2UgY3VycmVudCBwYWNrZXQgaGFzIGF2YWlsYWJsZSAqLwotCQlzcGFjZSA9IGNhbGwtPmNvbm4tPm10dV9zaXplIC0gbXNnLT5kc2l6ZTsKLQkJY2h1bmsgPSBtaW4oc3BhY2UsIHNpemUpOwotCi0JCV9kZWJ1ZygiLSBbYmVmb3JlXSBzcGFjZT0lWnUgY2h1bms9JVp1Iiwgc3BhY2UsIGNodW5rKTsKLQotCQl3aGlsZSAoIXNpb3YtPmlvdl9sZW4pCi0JCQlzaW92Kys7Ci0KLQkJLyogaWYgd2UgYXJlIGdvaW5nIHRvIGhhdmUgdG8gZHVwbGljYXRlIHRoZSBkYXRhIHRoZW4gY29hbGVzY2UKLQkJICogaXQgdG9vICovCi0JCWlmIChkdXBfZGF0YSkgewotCQkJLyogZG9uJ3QgYWxsb2NhdGUgbW9yZSB0aGF0IDEgcGFnZSBhdCBhIHRpbWUgKi8KLQkJCWlmIChjaHVuayA+IFBBR0VfU0laRSkKLQkJCQljaHVuayA9IFBBR0VfU0laRTsKLQotCQkJLyogYWxsb2NhdGUgYSBkYXRhIGJ1ZmZlciBhbmQgYXR0YWNoIHRvIHRoZSBtZXNzYWdlICovCi0JCQlidWYgPSBrbWFsbG9jKGNodW5rLCBhbGxvY19mbGFncyk7Ci0JCQlpZiAodW5saWtlbHkoIWJ1ZikpIHsKLQkJCQlpZiAobXNnLT5kc2l6ZSA9PQotCQkJCSAgICBzaXplb2Yoc3RydWN0IHJ4cnBjX2hlYWRlcikpIHsKLQkJCQkJLyogZGlzY2FyZCBhbiBlbXB0eSBtc2cgYW5kIHdpbmQgYmFjawotCQkJCQkgKiB0aGUgc2VxIGNvdW50ZXIgKi8KLQkJCQkJcnhycGNfcHV0X21lc3NhZ2UobXNnKTsKLQkJCQkJY2FsbC0+c25kX25leHRtc2cgPSBOVUxMOwotCQkJCQljYWxsLT5zbmRfc2VxX2NvdW50LS07Ci0JCQkJfQotCi0JCQkJcmV0ID0gLUVOT01FTTsKLQkJCQlnb3RvIG91dDsKLQkJCX0KLQotCQkJdG1wID0gbXNnLT5kY291bnQrKzsKLQkJCXNldF9iaXQodG1wLCAmbXNnLT5kZnJlZSk7Ci0JCQltc2ctPmRhdGFbdG1wXS5pb3ZfYmFzZSA9IGJ1ZjsKLQkJCW1zZy0+ZGF0YVt0bXBdLmlvdl9sZW4gPSBjaHVuazsKLQkJCW1zZy0+ZHNpemUgKz0gY2h1bms7Ci0JCQkqc2l6ZV9zZW50ICs9IGNodW5rOwotCQkJc2l6ZSAtPSBjaHVuazsKLQotCQkJLyogbG9hZCB0aGUgYnVmZmVyIHdpdGggZGF0YSAqLwotCQkJd2hpbGUgKGNodW5rID4gMCkgewotCQkJCXRtcCA9IG1pbihjaHVuaywgc2lvdi0+aW92X2xlbik7Ci0JCQkJbWVtY3B5KGJ1Ziwgc2lvdi0+aW92X2Jhc2UsIHRtcCk7Ci0JCQkJYnVmICs9IHRtcDsKLQkJCQlzaW92LT5pb3ZfYmFzZSArPSB0bXA7Ci0JCQkJc2lvdi0+aW92X2xlbiAtPSB0bXA7Ci0JCQkJaWYgKCFzaW92LT5pb3ZfbGVuKQotCQkJCQlzaW92Kys7Ci0JCQkJY2h1bmsgLT0gdG1wOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJLyogd2Ugd2FudCB0byBhdHRhY2ggdGhlIHN1cHBsaWVkIGJ1ZmZlcnMgZGlyZWN0bHkgKi8KLQkJCXdoaWxlIChjaHVuayA+IDAgJiYKLQkJCSAgICAgICBtc2ctPmRjb3VudCA8IFJYUlBDX01TR19NQVhfSU9DUykgewotCQkJCXRtcCA9IG1zZy0+ZGNvdW50Kys7Ci0JCQkJbXNnLT5kYXRhW3RtcF0uaW92X2Jhc2UgPSBzaW92LT5pb3ZfYmFzZTsKLQkJCQltc2ctPmRhdGFbdG1wXS5pb3ZfbGVuID0gc2lvdi0+aW92X2xlbjsKLQkJCQltc2ctPmRzaXplICs9IHNpb3YtPmlvdl9sZW47Ci0JCQkJKnNpemVfc2VudCArPSBzaW92LT5pb3ZfbGVuOwotCQkJCXNpemUgLT0gc2lvdi0+aW92X2xlbjsKLQkJCQljaHVuayAtPSBzaW92LT5pb3ZfbGVuOwotCQkJCXNpb3YrKzsKLQkJCX0KLQkJfQotCi0JCV9kZWJ1ZygiLSBbbG9hZGVkXSBjaHVuaz0lWnUgc2l6ZT0lWnUiLCBjaHVuaywgc2l6ZSk7Ci0KLQkJLyogZGlzcGF0Y2ggdGhlIG1lc3NhZ2Ugd2hlbiBmdWxsLCBmaW5hbCBvciByZXF1ZXN0aW5nIEFDSyAqLwotCQlpZiAobXNnLT5kc2l6ZSA+PSBjYWxsLT5jb25uLT5tdHVfc2l6ZSB8fCByeGhkcl9mbGFncykgewotCQkJcmV0ID0gcnhycGNfY2FsbF9mbHVzaChjYWxsKTsKLQkJCWlmIChyZXQgPCAwKQotCQkJCWdvdG8gb3V0OwotCQl9Ci0KLQl9IHdoaWxlKHNpemUgPiAwKTsKLQotCXJldCA9IDA7Ci0gb3V0OgotCV9sZWF2ZSgiID0gJWQgKCVaZCBxdWV1ZWQsICVaZCByZW0pIiwgcmV0LCAqc2l6ZV9zZW50LCBzaXplKTsKLQlyZXR1cm4gcmV0OwotCi19IC8qIGVuZCByeHJwY19jYWxsX3dyaXRlX2RhdGEoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogZmx1c2ggb3V0c3RhbmRpbmcgcGFja2V0cyB0byB0aGUgbmV0d29yawotICovCi1zdGF0aWMgaW50IHJ4cnBjX2NhbGxfZmx1c2goc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpCi17Ci0Jc3RydWN0IHJ4cnBjX21lc3NhZ2UgKm1zZzsKLQlpbnQgcmV0ID0gMDsKLQotCV9lbnRlcigiJXAiLCBjYWxsKTsKLQotCXJ4cnBjX2dldF9jYWxsKGNhbGwpOwotCi0JLyogaWYgdGhlcmUncyBhIHBhY2tldCB1bmRlciBjb25zdHJ1Y3Rpb24sIHRoZW4gZGlzcGF0Y2ggaXQgbm93ICovCi0JaWYgKGNhbGwtPnNuZF9uZXh0bXNnKSB7Ci0JCW1zZyA9IGNhbGwtPnNuZF9uZXh0bXNnOwotCQljYWxsLT5zbmRfbmV4dG1zZyA9IE5VTEw7Ci0KLQkJaWYgKG1zZy0+aGRyLmZsYWdzICYgUlhSUENfTEFTVF9QQUNLRVQpIHsKLQkJCW1zZy0+aGRyLmZsYWdzICY9IH5SWFJQQ19NT1JFX1BBQ0tFVFM7Ci0JCQlpZiAoY2FsbC0+YXBwX2NhbGxfc3RhdGUgIT0gUlhSUENfQ1NUQVRFX0NMTlRfU05EX0FSR1MpCi0JCQkJbXNnLT5oZHIuZmxhZ3MgfD0gUlhSUENfUkVRVUVTVF9BQ0s7Ci0JCX0KLQkJZWxzZSB7Ci0JCQltc2ctPmhkci5mbGFncyB8PSBSWFJQQ19NT1JFX1BBQ0tFVFM7Ci0JCX0KLQotCQlfcHJvdG8oIlNlbmRpbmcgREFUQSBtZXNzYWdlIHsgZHM9JVp1IGRjPSV1IGRmPSUwMmx1IH0iLAotCQkgICAgICAgbXNnLT5kc2l6ZSwgbXNnLT5kY291bnQsIG1zZy0+ZGZyZWUpOwotCi0JCS8qIHF1ZXVlIGFuZCBhZGp1c3QgY2FsbCBzdGF0ZSAqLwotCQlzcGluX2xvY2soJmNhbGwtPmxvY2spOwotCQlsaXN0X2FkZF90YWlsKCZtc2ctPmxpbmssICZjYWxsLT5hY2tzX3BlbmRxKTsKLQotCQkvKiBkZWNpZGUgd2hhdCB0byBkbyBkZXBlbmRpbmcgb24gY3VycmVudCBzdGF0ZSBhbmQgaWYgdGhpcyBpcwotCQkgKiB0aGUgbGFzdCBwYWNrZXQgKi8KLQkJcmV0ID0gLUVJTlZBTDsKLQkJc3dpdGNoIChjYWxsLT5hcHBfY2FsbF9zdGF0ZSkgewotCQljYXNlIFJYUlBDX0NTVEFURV9TUlZSX1NORF9SRVBMWToKLQkJCWlmIChtc2ctPmhkci5mbGFncyAmIFJYUlBDX0xBU1RfUEFDS0VUKSB7Ci0JCQkJY2FsbC0+YXBwX2NhbGxfc3RhdGUgPQotCQkJCQlSWFJQQ19DU1RBVEVfU1JWUl9SQ1ZfRklOQUxfQUNLOwotCQkJCV9zdGF0ZShjYWxsKTsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgUlhSUENfQ1NUQVRFX0NMTlRfU05EX0FSR1M6Ci0JCQlpZiAobXNnLT5oZHIuZmxhZ3MgJiBSWFJQQ19MQVNUX1BBQ0tFVCkgewotCQkJCWNhbGwtPmFwcF9jYWxsX3N0YXRlID0KLQkJCQkJUlhSUENfQ1NUQVRFX0NMTlRfUkNWX1JFUExZOwotCQkJCV9zdGF0ZShjYWxsKTsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgUlhSUENfQ1NUQVRFX0VSUk9SOgotCQkJcmV0ID0gY2FsbC0+YXBwX2Vycm5vOwotCQlkZWZhdWx0OgotCQkJc3Bpbl91bmxvY2soJmNhbGwtPmxvY2spOwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQljYWxsLT5hY2tzX3BlbmRfY250Kys7Ci0KLQkJbW9kX3RpbWVyKCZjYWxsLT5hY2tzX3RpbWVvdXQsCi0JCQkgIF9fcnhycGNfcnR0X2Jhc2VkX3RpbWVvdXQoY2FsbCwKLQkJCQkJCSAgICByeHJwY19jYWxsX2Fja3NfdGltZW91dCkpOwotCi0JCXNwaW5fdW5sb2NrKCZjYWxsLT5sb2NrKTsKLQotCQlyZXQgPSByeHJwY19jb25uX3NlbmRtc2coY2FsbC0+Y29ubiwgbXNnKTsKLQkJaWYgKHJldCA9PSAwKQotCQkJY2FsbC0+cGt0X3NuZF9jb3VudCsrOwotCX0KLQotIG91dDoKLQlyeHJwY19wdXRfY2FsbChjYWxsKTsKLQotCV9sZWF2ZSgiID0gJWQiLCByZXQpOwotCXJldHVybiByZXQ7Ci0KLX0gLyogZW5kIHJ4cnBjX2NhbGxfZmx1c2goKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogcmVzZW5kIE5BSydkIG9yIHVuYWNrbm93bGVkZ2VkIHBhY2tldHMgdXAgdG8gdGhlIGhpZ2hlc3Qgb25lIHNwZWNpZmllZAotICovCi1zdGF0aWMgdm9pZCByeHJwY19jYWxsX3Jlc2VuZChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwgcnhycGNfc2VxX3QgaGlnaGVzdCkKLXsKLQlzdHJ1Y3QgcnhycGNfbWVzc2FnZSAqbXNnOwotCXN0cnVjdCBsaXN0X2hlYWQgKl9wOwotCXJ4cnBjX3NlcV90IHNlcSA9IDA7Ci0KLQlfZW50ZXIoIiVwLCV1IiwgY2FsbCwgaGlnaGVzdCk7Ci0KLQlfcHJvdG8oIlJ4IFJlc2VuZCByZXF1aXJlZCIpOwotCi0JLyogaGFuZGxlIHRvbyBtYW55IHJlc2VuZHMgKi8KLQlpZiAoY2FsbC0+c25kX3Jlc2VuZF9jbnQgPj0gcnhycGNfY2FsbF9tYXhfcmVzZW5kKSB7Ci0JCV9kZWJ1ZygiQWJvcnRpbmcgZHVlIHRvIHRvbyBtYW55IHJlc2VuZHMgKHJjdj0lZCkiLAotCQkgICAgICAgY2FsbC0+cGt0X3Jjdl9jb3VudCk7Ci0JCXJ4cnBjX2NhbGxfYWJvcnQoY2FsbCwKLQkJCQkgY2FsbC0+cGt0X3Jjdl9jb3VudCA+IDAgPyAtRUlPIDogLUVUSU1FRE9VVCk7Ci0JCV9sZWF2ZSgiIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlzcGluX2xvY2soJmNhbGwtPmxvY2spOwotCWNhbGwtPnNuZF9yZXNlbmRfY250Kys7Ci0JZm9yICg7OykgewotCQkvKiBkZXRlcm1pbmUgd2hpY2ggdGhlIG5leHQgcGFja2V0IHdlIG1pZ2h0IG5lZWQgdG8gQUNLIGlzICovCi0JCWlmIChzZXEgPD0gY2FsbC0+YWNrc19kZnR2X3NlcSkKLQkJCXNlcSA9IGNhbGwtPmFja3NfZGZ0dl9zZXE7Ci0JCXNlcSsrOwotCi0JCWlmIChzZXEgPiBoaWdoZXN0KQotCQkJYnJlYWs7Ci0KLQkJLyogbG9vayBmb3IgdGhlIHBhY2tldCBpbiB0aGUgcGVuZGluZy1BQ0sgcXVldWUgKi8KLQkJbGlzdF9mb3JfZWFjaChfcCwgJmNhbGwtPmFja3NfcGVuZHEpIHsKLQkJCW1zZyA9IGxpc3RfZW50cnkoX3AsIHN0cnVjdCByeHJwY19tZXNzYWdlLCBsaW5rKTsKLQkJCWlmIChtc2ctPnNlcSA9PSBzZXEpCi0JCQkJZ290byBmb3VuZF9tc2c7Ci0JCX0KLQotCQlwYW5pYygiJXMoJXAsJWQpOiIKLQkJICAgICAgIiBJbmNvbnNpc3RlbnQgcGVuZGluZy1BQ0sgcXVldWUgKGRzPSV1IHNjPSV1IHNxPSV1KVxuIiwKLQkJICAgICAgX19GVU5DVElPTl9fLCBjYWxsLCBoaWdoZXN0LAotCQkgICAgICBjYWxsLT5hY2tzX2RmdHZfc2VxLCBjYWxsLT5zbmRfc2VxX2NvdW50LCBzZXEpOwotCi0JZm91bmRfbXNnOgotCQlpZiAobXNnLT5zdGF0ZSAhPSBSWFJQQ19NU0dfU0VOVCkKLQkJCWNvbnRpbnVlOyAvKiBvbmx5IHVuLUFDSydkIHBhY2tldHMgKi8KLQotCQlyeHJwY19nZXRfbWVzc2FnZShtc2cpOwotCQlzcGluX3VubG9jaygmY2FsbC0+bG9jayk7Ci0KLQkJLyogc2VuZCBlYWNoIG1lc3NhZ2UgYWdhaW4gKGFuZCBpZ25vcmUgYW55IGVycm9ycyB3ZSBtaWdodAotCQkgKiBpbmN1cikgKi8KLQkJX3Byb3RvKCJSZXNlbmRpbmcgREFUQSBtZXNzYWdlIHsgZHM9JVp1IGRjPSV1IGRmPSUwMmx1IH0iLAotCQkgICAgICAgbXNnLT5kc2l6ZSwgbXNnLT5kY291bnQsIG1zZy0+ZGZyZWUpOwotCi0JCWlmIChyeHJwY19jb25uX3NlbmRtc2coY2FsbC0+Y29ubiwgbXNnKSA9PSAwKQotCQkJY2FsbC0+cGt0X3NuZF9jb3VudCsrOwotCi0JCXJ4cnBjX3B1dF9tZXNzYWdlKG1zZyk7Ci0KLQkJc3Bpbl9sb2NrKCZjYWxsLT5sb2NrKTsKLQl9Ci0KLQkvKiByZXNldCB0aGUgdGltZW91dCAqLwotCW1vZF90aW1lcigmY2FsbC0+YWNrc190aW1lb3V0LAotCQkgIF9fcnhycGNfcnR0X2Jhc2VkX3RpbWVvdXQoY2FsbCwgcnhycGNfY2FsbF9hY2tzX3RpbWVvdXQpKTsKLQotCXNwaW5fdW5sb2NrKCZjYWxsLT5sb2NrKTsKLQotCV9sZWF2ZSgiIik7Ci19IC8qIGVuZCByeHJwY19jYWxsX3Jlc2VuZCgpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBoYW5kbGUgYW4gSUNNUCBlcnJvciBiZWluZyBhcHBsaWVkIHRvIGEgY2FsbAotICovCi12b2lkIHJ4cnBjX2NhbGxfaGFuZGxlX2Vycm9yKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLCBpbnQgbG9jYWwsIGludCBlcnJubykKLXsKLQlfZW50ZXIoIiVweyV1fSwlZCIsIGNhbGwsIG50b2hsKGNhbGwtPmNhbGxfaWQpLCBlcnJubyk7Ci0KLQkvKiBpZiB0aGlzIGNhbGwgaXMgYWxyZWFkeSBhYm9ydGVkLCB0aGVuIGp1c3Qgd2FrZSB1cCBhbnkgd2FpdGVycyAqLwotCWlmIChjYWxsLT5hcHBfY2FsbF9zdGF0ZSA9PSBSWFJQQ19DU1RBVEVfRVJST1IpIHsKLQkJY2FsbC0+YXBwX2Vycm9yX2Z1bmMoY2FsbCk7Ci0JfQotCWVsc2UgewotCQkvKiB0ZWxsIHRoZSBhcHAgbGF5ZXIgd2hhdCBoYXBwZW5lZCAqLwotCQlzcGluX2xvY2soJmNhbGwtPmxvY2spOwotCQljYWxsLT5hcHBfY2FsbF9zdGF0ZSA9IFJYUlBDX0NTVEFURV9FUlJPUjsKLQkJX3N0YXRlKGNhbGwpOwotCQlpZiAobG9jYWwpCi0JCQljYWxsLT5hcHBfZXJyX3N0YXRlID0gUlhSUENfRVNUQVRFX0xPQ0FMX0VSUk9SOwotCQllbHNlCi0JCQljYWxsLT5hcHBfZXJyX3N0YXRlID0gUlhSUENfRVNUQVRFX1JFTU9URV9FUlJPUjsKLQkJY2FsbC0+YXBwX2Vycm5vCQk9IGVycm5vOwotCQljYWxsLT5hcHBfbWFyawkJPSBSWFJQQ19BUFBfTUFSS19FT0Y7Ci0JCWNhbGwtPmFwcF9yZWFkX2J1Zgk9IE5VTEw7Ci0JCWNhbGwtPmFwcF9hc3luY19yZWFkCT0gMDsKLQotCQkvKiBtYXAgdGhlIGVycm9yICovCi0JCWNhbGwtPmFwcF9hZW1hcF9mdW5jKGNhbGwpOwotCi0JCWRlbF90aW1lcl9zeW5jKCZjYWxsLT5hY2tzX3RpbWVvdXQpOwotCQlkZWxfdGltZXJfc3luYygmY2FsbC0+cmN2X3RpbWVvdXQpOwotCQlkZWxfdGltZXJfc3luYygmY2FsbC0+YWNrcl9kZnJfdGltbyk7Ci0KLQkJc3Bpbl91bmxvY2soJmNhbGwtPmxvY2spOwotCi0JCWNhbGwtPmFwcF9lcnJvcl9mdW5jKGNhbGwpOwotCX0KLQotCV9sZWF2ZSgiIik7Ci19IC8qIGVuZCByeHJwY19jYWxsX2hhbmRsZV9lcnJvcigpICovCmRpZmYgLS1naXQgYS9uZXQvcnhycGMvY29ubmVjdGlvbi5jIGIvbmV0L3J4cnBjL2Nvbm5lY3Rpb24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdjOTI5YS4uMDAwMDAwMAotLS0gYS9uZXQvcnhycGMvY29ubmVjdGlvbi5jCisrKyAvZGV2L251bGwKQEAgLTEsNzc3ICswLDAgQEAKLS8qIGNvbm5lY3Rpb24uYzogUnggY29ubmVjdGlvbiByb3V0aW5lcwotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMiBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8cnhycGMvcnhycGMuaD4KLSNpbmNsdWRlIDxyeHJwYy90cmFuc3BvcnQuaD4KLSNpbmNsdWRlIDxyeHJwYy9wZWVyLmg+Ci0jaW5jbHVkZSA8cnhycGMvY29ubmVjdGlvbi5oPgotI2luY2x1ZGUgPHJ4cnBjL2NhbGwuaD4KLSNpbmNsdWRlIDxyeHJwYy9tZXNzYWdlLmg+Ci0jaW5jbHVkZSA8bGludXgvdWRwLmg+Ci0jaW5jbHVkZSA8bGludXgvaXAuaD4KLSNpbmNsdWRlIDxuZXQvc29jay5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0jaW5jbHVkZSAiaW50ZXJuYWwuaCIKLQotX19SWEFDQ1RfREVDTChhdG9taWNfdCByeHJwY19jb25uZWN0aW9uX2NvdW50KTsKLQotTElTVF9IRUFEKHJ4cnBjX2Nvbm5zKTsKLURFQ0xBUkVfUldTRU0ocnhycGNfY29ubnNfc2VtKTsKLXVuc2lnbmVkIGxvbmcgcnhycGNfY29ubl90aW1lb3V0ID0gNjAgKiA2MDsKLQotc3RhdGljIHZvaWQgcnhycGNfY29ubl9kb190aW1lb3V0KHN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uKTsKLQotc3RhdGljIHZvaWQgX19yeHJwY19jb25uX3RpbWVvdXQocnhycGNfdGltZXJfdCAqdGltZXIpCi17Ci0Jc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4gPQotCQlsaXN0X2VudHJ5KHRpbWVyLCBzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiwgdGltZW91dCk7Ci0KLQlfZGVidWcoIlJ4IENPTk4gVElNRU9VVCBbJXB7dT0lZH1dIiwgY29ubiwgYXRvbWljX3JlYWQoJmNvbm4tPnVzYWdlKSk7Ci0KLQlyeHJwY19jb25uX2RvX3RpbWVvdXQoY29ubik7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcnhycGNfdGltZXJfb3BzIHJ4cnBjX2Nvbm5fdGltZXJfb3BzID0gewotCS50aW1lZF9vdXQJPSBfX3J4cnBjX2Nvbm5fdGltZW91dCwKLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBjcmVhdGUgYSBuZXcgY29ubmVjdGlvbiByZWNvcmQKLSAqLwotc3RhdGljIGlubGluZSBpbnQgX19yeHJwY19jcmVhdGVfY29ubmVjdGlvbihzdHJ1Y3QgcnhycGNfcGVlciAqcGVlciwKLQkJCQkJICAgIHN0cnVjdCByeHJwY19jb25uZWN0aW9uICoqX2Nvbm4pCi17Ci0Jc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm47Ci0KLQlfZW50ZXIoIiVwIixwZWVyKTsKLQotCS8qIGFsbG9jYXRlIGFuZCBpbml0aWFsaXNlIGEgY29ubmVjdGlvbiByZWNvcmQgKi8KLQljb25uID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWNvbm4pIHsKLQkJX2xlYXZlKCIgPSAtRU5PTUVNIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCWF0b21pY19zZXQoJmNvbm4tPnVzYWdlLCAxKTsKLQotCUlOSVRfTElTVF9IRUFEKCZjb25uLT5saW5rKTsKLQlJTklUX0xJU1RfSEVBRCgmY29ubi0+aWRfbGluayk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmY29ubi0+Y2hhbndhaXQpOwotCXNwaW5fbG9ja19pbml0KCZjb25uLT5sb2NrKTsKLQlyeHJwY190aW1lcl9pbml0KCZjb25uLT50aW1lb3V0LCAmcnhycGNfY29ubl90aW1lcl9vcHMpOwotCi0JZG9fZ2V0dGltZW9mZGF5KCZjb25uLT5hdGltZSk7Ci0JY29ubi0+bXR1X3NpemUgPSAxMDI0OwotCWNvbm4tPnBlZXIgPSBwZWVyOwotCWNvbm4tPnRyYW5zID0gcGVlci0+dHJhbnM7Ci0KLQlfX1JYQUNDVChhdG9taWNfaW5jKCZyeHJwY19jb25uZWN0aW9uX2NvdW50KSk7Ci0JKl9jb25uID0gY29ubjsKLQlfbGVhdmUoIiA9IDAgKCVwKSIsIGNvbm4pOwotCi0JcmV0dXJuIDA7Ci19IC8qIGVuZCBfX3J4cnBjX2NyZWF0ZV9jb25uZWN0aW9uKCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIGNyZWF0ZSBhIG5ldyBjb25uZWN0aW9uIHJlY29yZCBmb3Igb3V0Z29pbmcgY29ubmVjdGlvbnMKLSAqLwotaW50IHJ4cnBjX2NyZWF0ZV9jb25uZWN0aW9uKHN0cnVjdCByeHJwY190cmFuc3BvcnQgKnRyYW5zLAotCQkJICAgIF9fYmUxNiBwb3J0LAotCQkJICAgIF9fYmUzMiBhZGRyLAotCQkJICAgIHVpbnQxNl90IHNlcnZpY2VfaWQsCi0JCQkgICAgdm9pZCAqc2VjdXJpdHksCi0JCQkgICAgc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKipfY29ubikKLXsKLQlzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY2FuZGlkYXRlLCAqY29ubjsKLQlzdHJ1Y3QgcnhycGNfcGVlciAqcGVlcjsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpfcDsKLQlfX2JlMzIgY29ubmlkOwotCWludCByZXQ7Ci0KLQlfZW50ZXIoIiVweyVodX0sJXUsJWh1IiwgdHJhbnMsIHRyYW5zLT5wb3J0LCBudG9ocyhwb3J0KSwgc2VydmljZV9pZCk7Ci0KLQkvKiBnZXQgYSBwZWVyIHJlY29yZCAqLwotCXJldCA9IHJ4cnBjX3BlZXJfbG9va3VwKHRyYW5zLCBhZGRyLCAmcGVlcik7Ci0JaWYgKHJldCA8IDApIHsKLQkJX2xlYXZlKCIgPSAlZCIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyogYWxsb2NhdGUgYW5kIGluaXRpYWxpc2UgYSBjb25uZWN0aW9uIHJlY29yZCAqLwotCXJldCA9IF9fcnhycGNfY3JlYXRlX2Nvbm5lY3Rpb24ocGVlciwgJmNhbmRpZGF0ZSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcnhycGNfcHV0X3BlZXIocGVlcik7Ci0JCV9sZWF2ZSgiID0gJWQiLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qIGZpbGwgaW4gdGhlIHNwZWNpZmljIGJpdHMgKi8KLQljYW5kaWRhdGUtPmFkZHIuc2luX2ZhbWlseQk9IEFGX0lORVQ7Ci0JY2FuZGlkYXRlLT5hZGRyLnNpbl9wb3J0CT0gcG9ydDsKLQljYW5kaWRhdGUtPmFkZHIuc2luX2FkZHIuc19hZGRyCT0gYWRkcjsKLQotCWNhbmRpZGF0ZS0+aW5fZXBvY2gJCT0gcnhycGNfZXBvY2g7Ci0JY2FuZGlkYXRlLT5vdXRfZXBvY2gJCT0gcnhycGNfZXBvY2g7Ci0JY2FuZGlkYXRlLT5pbl9jbGllbnRmbGFnCT0gMDsKLQljYW5kaWRhdGUtPm91dF9jbGllbnRmbGFnCT0gUlhSUENfQ0xJRU5UX0lOSVRJQVRFRDsKLQljYW5kaWRhdGUtPnNlcnZpY2VfaWQJCT0gaHRvbnMoc2VydmljZV9pZCk7Ci0KLQkvKiBpbnZlbnQgYSB1bmlxdWUgY29ubmVjdGlvbiBJRCAqLwotCXdyaXRlX2xvY2soJnBlZXItPmNvbm5faWRsb2NrKTsKLQotIHRyeV9uZXh0X2lkOgotCWNvbm5pZCA9IGh0b25sKHBlZXItPmNvbm5faWRjb3VudGVyICYgUlhSUENfQ0lETUFTSyk7Ci0JcGVlci0+Y29ubl9pZGNvdW50ZXIgKz0gUlhSUENfTUFYQ0FMTFM7Ci0KLQlsaXN0X2Zvcl9lYWNoKF9wLCAmcGVlci0+Y29ubl9pZGxpc3QpIHsKLQkJY29ubiA9IGxpc3RfZW50cnkoX3AsIHN0cnVjdCByeHJwY19jb25uZWN0aW9uLCBpZF9saW5rKTsKLQkJaWYgKGNvbm5pZCA9PSBjb25uLT5jb25uX2lkKQotCQkJZ290byB0cnlfbmV4dF9pZDsKLQkJaWYgKGNvbm5pZCA+IGNvbm4tPmNvbm5faWQpCi0JCQlicmVhazsKLQl9Ci0KLQlfZGVidWcoInNlbGVjdGVkIGNhbmRpZGF0ZSBjb25uIElEICV4LiV1IiwKLQkgICAgICAgbnRvaGwocGVlci0+YWRkci5zX2FkZHIpLCBudG9obChjb25uaWQpKTsKLQotCWNhbmRpZGF0ZS0+Y29ubl9pZCA9IGNvbm5pZDsKLQlsaXN0X2FkZF90YWlsKCZjYW5kaWRhdGUtPmlkX2xpbmssIF9wKTsKLQotCXdyaXRlX3VubG9jaygmcGVlci0+Y29ubl9pZGxvY2spOwotCi0JLyogYXR0YWNoIHRvIHBlZXIgKi8KLQljYW5kaWRhdGUtPnBlZXIgPSBwZWVyOwotCi0Jd3JpdGVfbG9jaygmcGVlci0+Y29ubl9sb2NrKTsKLQotCS8qIHNlYXJjaCB0aGUgcGVlcidzIHRyYW5zcG9ydCBncmF2ZXlhcmQgbGlzdCAqLwotCXNwaW5fbG9jaygmcGVlci0+Y29ubl9neWxvY2spOwotCWxpc3RfZm9yX2VhY2goX3AsICZwZWVyLT5jb25uX2dyYXZleWFyZCkgewotCQljb25uID0gbGlzdF9lbnRyeShfcCwgc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24sIGxpbmspOwotCQlpZiAoY29ubi0+YWRkci5zaW5fcG9ydAk9PSBjYW5kaWRhdGUtPmFkZHIuc2luX3BvcnQJJiYKLQkJICAgIGNvbm4tPnNlY3VyaXR5X2l4CT09IGNhbmRpZGF0ZS0+c2VjdXJpdHlfaXgJJiYKLQkJICAgIGNvbm4tPnNlcnZpY2VfaWQJPT0gY2FuZGlkYXRlLT5zZXJ2aWNlX2lkCSYmCi0JCSAgICBjb25uLT5pbl9jbGllbnRmbGFnCT09IDApCi0JCQlnb3RvIGZvdW5kX2luX2dyYXZleWFyZDsKLQl9Ci0Jc3Bpbl91bmxvY2soJnBlZXItPmNvbm5fZ3lsb2NrKTsKLQotCS8qIHBpY2sgdGhlIG5ldyBjYW5kaWRhdGUgKi8KLQlfZGVidWcoImNyZWF0ZWQgY29ubmVjdGlvbjogeyUwOHh9IFtvdXRdIiwgbnRvaGwoY2FuZGlkYXRlLT5jb25uX2lkKSk7Ci0JYXRvbWljX2luYygmcGVlci0+Y29ubl9jb3VudCk7Ci0JY29ubiA9IGNhbmRpZGF0ZTsKLQljYW5kaWRhdGUgPSBOVUxMOwotCi0gbWFrZV9hY3RpdmU6Ci0JbGlzdF9hZGRfdGFpbCgmY29ubi0+bGluaywgJnBlZXItPmNvbm5fYWN0aXZlKTsKLQl3cml0ZV91bmxvY2soJnBlZXItPmNvbm5fbG9jayk7Ci0KLQlpZiAoY2FuZGlkYXRlKSB7Ci0JCXdyaXRlX2xvY2soJnBlZXItPmNvbm5faWRsb2NrKTsKLQkJbGlzdF9kZWwoJmNhbmRpZGF0ZS0+aWRfbGluayk7Ci0JCXdyaXRlX3VubG9jaygmcGVlci0+Y29ubl9pZGxvY2spOwotCi0JCV9fUlhBQ0NUKGF0b21pY19kZWMoJnJ4cnBjX2Nvbm5lY3Rpb25fY291bnQpKTsKLQkJa2ZyZWUoY2FuZGlkYXRlKTsKLQl9Ci0JZWxzZSB7Ci0JCWRvd25fd3JpdGUoJnJ4cnBjX2Nvbm5zX3NlbSk7Ci0JCWxpc3RfYWRkX3RhaWwoJmNvbm4tPnByb2NfbGluaywgJnJ4cnBjX2Nvbm5zKTsKLQkJdXBfd3JpdGUoJnJ4cnBjX2Nvbm5zX3NlbSk7Ci0JfQotCi0JKl9jb25uID0gY29ubjsKLQlfbGVhdmUoIiA9IDAgKCVwKSIsIGNvbm4pOwotCi0JcmV0dXJuIDA7Ci0KLQkvKiBoYW5kbGUgcmVzdXJyZWN0aW5nIGEgY29ubmVjdGlvbiBmcm9tIHRoZSBncmF2ZXlhcmQgKi8KLSBmb3VuZF9pbl9ncmF2ZXlhcmQ6Ci0JX2RlYnVnKCJyZXN1cnJlY3RpbmcgY29ubmVjdGlvbjogeyUwOHh9IFtvdXRdIiwgbnRvaGwoY29ubi0+Y29ubl9pZCkpOwotCXJ4cnBjX2dldF9jb25uZWN0aW9uKGNvbm4pOwotCXJ4cnBjX2tyeHRpbW9kX2RlbF90aW1lcigmY29ubi0+dGltZW91dCk7Ci0JbGlzdF9kZWxfaW5pdCgmY29ubi0+bGluayk7Ci0Jc3Bpbl91bmxvY2soJnBlZXItPmNvbm5fZ3lsb2NrKTsKLQlnb3RvIG1ha2VfYWN0aXZlOwotfSAvKiBlbmQgcnhycGNfY3JlYXRlX2Nvbm5lY3Rpb24oKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogbG9va3VwIHRoZSBjb25uZWN0aW9uIGZvciBhbiBpbmNvbWluZyBwYWNrZXQKLSAqIC0gY3JlYXRlIGEgbmV3IGNvbm5lY3Rpb24gcmVjb3JkIGZvciB1bnJlY29yZGVkIGluY29taW5nIGNvbm5lY3Rpb25zCi0gKi8KLWludCByeHJwY19jb25uZWN0aW9uX2xvb2t1cChzdHJ1Y3QgcnhycGNfcGVlciAqcGVlciwKLQkJCSAgICBzdHJ1Y3QgcnhycGNfbWVzc2FnZSAqbXNnLAotCQkJICAgIHN0cnVjdCByeHJwY19jb25uZWN0aW9uICoqX2Nvbm4pCi17Ci0Jc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4sICpjYW5kaWRhdGUgPSBOVUxMOwotCXN0cnVjdCBsaXN0X2hlYWQgKl9wOwotCXN0cnVjdCBza19idWZmICpwa3QgPSBtc2ctPnBrdDsKLQlpbnQgcmV0LCBmcmVzaCA9IDA7Ci0JX19iZTMyIHhfZXBvY2gsIHhfY29ubmlkOwotCV9fYmUxNiB4X3BvcnQsIHhfc2VydmlkOwotCV9fdTMyIHhfc2VjaXg7Ci0JdTggeF9jbGZsYWc7Ci0KLQlfZW50ZXIoIiVwe3slaHV9fSwldSwlaHUiLAotCSAgICAgICBwZWVyLAotCSAgICAgICBwZWVyLT50cmFucy0+cG9ydCwKLQkgICAgICAgbnRvaHMocGt0LT5oLnVoLT5zb3VyY2UpLAotCSAgICAgICBudG9ocyhtc2ctPmhkci5zZXJ2aWNlSWQpKTsKLQotCXhfcG9ydAkJPSBwa3QtPmgudWgtPnNvdXJjZTsKLQl4X2Vwb2NoCQk9IG1zZy0+aGRyLmVwb2NoOwotCXhfY2xmbGFnCT0gbXNnLT5oZHIuZmxhZ3MgJiBSWFJQQ19DTElFTlRfSU5JVElBVEVEOwotCXhfY29ubmlkCT0gaHRvbmwobnRvaGwobXNnLT5oZHIuY2lkKSAmIFJYUlBDX0NJRE1BU0spOwotCXhfc2VydmlkCT0gbXNnLT5oZHIuc2VydmljZUlkOwotCXhfc2VjaXgJCT0gbXNnLT5oZHIuc2VjdXJpdHlJbmRleDsKLQotCS8qIFtjb21tb24gY2FzZV0gc2VhcmNoIHRoZSB0cmFuc3BvcnQncyBhY3RpdmUgbGlzdCBmaXJzdCAqLwotCXJlYWRfbG9jaygmcGVlci0+Y29ubl9sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoKF9wLCAmcGVlci0+Y29ubl9hY3RpdmUpIHsKLQkJY29ubiA9IGxpc3RfZW50cnkoX3AsIHN0cnVjdCByeHJwY19jb25uZWN0aW9uLCBsaW5rKTsKLQkJaWYgKGNvbm4tPmFkZHIuc2luX3BvcnQJCT09IHhfcG9ydAkmJgotCQkgICAgY29ubi0+aW5fZXBvY2gJCT09IHhfZXBvY2gJJiYKLQkJICAgIGNvbm4tPmNvbm5faWQJCT09IHhfY29ubmlkCSYmCi0JCSAgICBjb25uLT5zZWN1cml0eV9peAkJPT0geF9zZWNpeAkmJgotCQkgICAgY29ubi0+c2VydmljZV9pZAkJPT0geF9zZXJ2aWQJJiYKLQkJICAgIGNvbm4tPmluX2NsaWVudGZsYWcJCT09IHhfY2xmbGFnKQotCQkJZ290byBmb3VuZF9hY3RpdmU7Ci0JfQotCXJlYWRfdW5sb2NrKCZwZWVyLT5jb25uX2xvY2spOwotCi0JLyogW3VuY29tbW9uIGNhc2VdIG5vdCBhY3RpdmUKLQkgKiAtIGNyZWF0ZSBhIGNhbmRpZGF0ZSBmb3IgYSBuZXcgcmVjb3JkIGlmIGFuIGluYm91bmQgY29ubmVjdGlvbgotCSAqIC0gb25seSBleGFtaW5lIHRoZSBncmF2ZXlhcmQgZm9yIGFuIG91dGJvdW5kIGNvbm5lY3Rpb24KLQkgKi8KLQlpZiAoeF9jbGZsYWcpIHsKLQkJcmV0ID0gX19yeHJwY19jcmVhdGVfY29ubmVjdGlvbihwZWVyLCAmY2FuZGlkYXRlKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCV9sZWF2ZSgiID0gJWQiLCByZXQpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCi0JCS8qIGZpbGwgaW4gdGhlIHNwZWNpZmljcyAqLwotCQljYW5kaWRhdGUtPmFkZHIuc2luX2ZhbWlseQk9IEFGX0lORVQ7Ci0JCWNhbmRpZGF0ZS0+YWRkci5zaW5fcG9ydAk9IHhfcG9ydDsKLQkJY2FuZGlkYXRlLT5hZGRyLnNpbl9hZGRyLnNfYWRkciA9IHBrdC0+bmguaXBoLT5zYWRkcjsKLQkJY2FuZGlkYXRlLT5pbl9lcG9jaAkJPSB4X2Vwb2NoOwotCQljYW5kaWRhdGUtPm91dF9lcG9jaAkJPSB4X2Vwb2NoOwotCQljYW5kaWRhdGUtPmluX2NsaWVudGZsYWcJPSBSWFJQQ19DTElFTlRfSU5JVElBVEVEOwotCQljYW5kaWRhdGUtPm91dF9jbGllbnRmbGFnCT0gMDsKLQkJY2FuZGlkYXRlLT5jb25uX2lkCQk9IHhfY29ubmlkOwotCQljYW5kaWRhdGUtPnNlcnZpY2VfaWQJCT0geF9zZXJ2aWQ7Ci0JCWNhbmRpZGF0ZS0+c2VjdXJpdHlfaXgJCT0geF9zZWNpeDsKLQl9Ci0KLQkvKiBzZWFyY2ggdGhlIGFjdGl2ZSBsaXN0IGFnYWluLCBqdXN0IGluIGNhc2UgaXQgYXBwZWFyZWQgd2hpbHN0IHdlCi0JICogd2VyZSBidXN5ICovCi0Jd3JpdGVfbG9jaygmcGVlci0+Y29ubl9sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoKF9wLCAmcGVlci0+Y29ubl9hY3RpdmUpIHsKLQkJY29ubiA9IGxpc3RfZW50cnkoX3AsIHN0cnVjdCByeHJwY19jb25uZWN0aW9uLCBsaW5rKTsKLQkJaWYgKGNvbm4tPmFkZHIuc2luX3BvcnQJCT09IHhfcG9ydAkmJgotCQkgICAgY29ubi0+aW5fZXBvY2gJCT09IHhfZXBvY2gJJiYKLQkJICAgIGNvbm4tPmNvbm5faWQJCT09IHhfY29ubmlkCSYmCi0JCSAgICBjb25uLT5zZWN1cml0eV9peAkJPT0geF9zZWNpeAkmJgotCQkgICAgY29ubi0+c2VydmljZV9pZAkJPT0geF9zZXJ2aWQJJiYKLQkJICAgIGNvbm4tPmluX2NsaWVudGZsYWcJCT09IHhfY2xmbGFnKQotCQkJZ290byBmb3VuZF9hY3RpdmVfc2Vjb25kX2NoYW5jZTsKLQl9Ci0KLQkvKiBzZWFyY2ggdGhlIHRyYW5zcG9ydCdzIGdyYXZleWFyZCBsaXN0ICovCi0Jc3Bpbl9sb2NrKCZwZWVyLT5jb25uX2d5bG9jayk7Ci0JbGlzdF9mb3JfZWFjaChfcCwgJnBlZXItPmNvbm5fZ3JhdmV5YXJkKSB7Ci0JCWNvbm4gPSBsaXN0X2VudHJ5KF9wLCBzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiwgbGluayk7Ci0JCWlmIChjb25uLT5hZGRyLnNpbl9wb3J0CQk9PSB4X3BvcnQJJiYKLQkJICAgIGNvbm4tPmluX2Vwb2NoCQk9PSB4X2Vwb2NoCSYmCi0JCSAgICBjb25uLT5jb25uX2lkCQk9PSB4X2Nvbm5pZAkmJgotCQkgICAgY29ubi0+c2VjdXJpdHlfaXgJCT09IHhfc2VjaXgJJiYKLQkJICAgIGNvbm4tPnNlcnZpY2VfaWQJCT09IHhfc2VydmlkCSYmCi0JCSAgICBjb25uLT5pbl9jbGllbnRmbGFnCQk9PSB4X2NsZmxhZykKLQkJCWdvdG8gZm91bmRfaW5fZ3JhdmV5YXJkOwotCX0KLQlzcGluX3VubG9jaygmcGVlci0+Y29ubl9neWxvY2spOwotCi0JLyogb3V0Ym91bmQgY29ubmVjdGlvbnMgYXJlbid0IGNyZWF0ZWQgaGVyZSAqLwotCWlmICgheF9jbGZsYWcpIHsKLQkJd3JpdGVfdW5sb2NrKCZwZWVyLT5jb25uX2xvY2spOwotCQlfbGVhdmUoIiA9IC1FTk9FTlQiKTsKLQkJcmV0dXJuIC1FTk9FTlQ7Ci0JfQotCi0JLyogd2UgY2FuIG5vdyBhZGQgdGhlIG5ldyBjYW5kaWRhdGUgdG8gdGhlIGxpc3QgKi8KLQlfZGVidWcoImNyZWF0ZWQgY29ubmVjdGlvbjogeyUwOHh9IFtpbl0iLCBudG9obChjYW5kaWRhdGUtPmNvbm5faWQpKTsKLQlyeHJwY19nZXRfcGVlcihwZWVyKTsKLQljb25uID0gY2FuZGlkYXRlOwotCWNhbmRpZGF0ZSA9IE5VTEw7Ci0JYXRvbWljX2luYygmcGVlci0+Y29ubl9jb3VudCk7Ci0JZnJlc2ggPSAxOwotCi0gbWFrZV9hY3RpdmU6Ci0JbGlzdF9hZGRfdGFpbCgmY29ubi0+bGluaywgJnBlZXItPmNvbm5fYWN0aXZlKTsKLQotIHN1Y2Nlc3NfdXdmcmVlOgotCXdyaXRlX3VubG9jaygmcGVlci0+Y29ubl9sb2NrKTsKLQotCWlmIChjYW5kaWRhdGUpIHsKLQkJd3JpdGVfbG9jaygmcGVlci0+Y29ubl9pZGxvY2spOwotCQlsaXN0X2RlbCgmY2FuZGlkYXRlLT5pZF9saW5rKTsKLQkJd3JpdGVfdW5sb2NrKCZwZWVyLT5jb25uX2lkbG9jayk7Ci0KLQkJX19SWEFDQ1QoYXRvbWljX2RlYygmcnhycGNfY29ubmVjdGlvbl9jb3VudCkpOwotCQlrZnJlZShjYW5kaWRhdGUpOwotCX0KLQotCWlmIChmcmVzaCkgewotCQlkb3duX3dyaXRlKCZyeHJwY19jb25uc19zZW0pOwotCQlsaXN0X2FkZF90YWlsKCZjb25uLT5wcm9jX2xpbmssICZyeHJwY19jb25ucyk7Ci0JCXVwX3dyaXRlKCZyeHJwY19jb25uc19zZW0pOwotCX0KLQotIHN1Y2Nlc3M6Ci0JKl9jb25uID0gY29ubjsKLQlfbGVhdmUoIiA9IDAgKCVwKSIsIGNvbm4pOwotCXJldHVybiAwOwotCi0JLyogaGFuZGxlIHRoZSBjb25uZWN0aW9uIGJlaW5nIGZvdW5kIGluIHRoZSBhY3RpdmUgbGlzdCBzdHJhaWdodCBvZmYgKi8KLSBmb3VuZF9hY3RpdmU6Ci0JcnhycGNfZ2V0X2Nvbm5lY3Rpb24oY29ubik7Ci0JcmVhZF91bmxvY2soJnBlZXItPmNvbm5fbG9jayk7Ci0JZ290byBzdWNjZXNzOwotCi0JLyogaGFuZGxlIHJlc3VycmVjdGluZyBhIGNvbm5lY3Rpb24gZnJvbSB0aGUgZ3JhdmV5YXJkICovCi0gZm91bmRfaW5fZ3JhdmV5YXJkOgotCV9kZWJ1ZygicmVzdXJyZWN0aW5nIGNvbm5lY3Rpb246IHslMDh4fSBbaW5dIiwgbnRvaGwoY29ubi0+Y29ubl9pZCkpOwotCXJ4cnBjX2dldF9wZWVyKHBlZXIpOwotCXJ4cnBjX2dldF9jb25uZWN0aW9uKGNvbm4pOwotCXJ4cnBjX2tyeHRpbW9kX2RlbF90aW1lcigmY29ubi0+dGltZW91dCk7Ci0JbGlzdF9kZWxfaW5pdCgmY29ubi0+bGluayk7Ci0Jc3Bpbl91bmxvY2soJnBlZXItPmNvbm5fZ3lsb2NrKTsKLQlnb3RvIG1ha2VfYWN0aXZlOwotCi0JLyogaGFuZGxlIGZpbmRpbmcgdGhlIGNvbm5lY3Rpb24gb24gdGhlIHNlY29uZCB0aW1lIHRocm91Z2ggdGhlIGFjdGl2ZQotCSAqIGxpc3QgKi8KLSBmb3VuZF9hY3RpdmVfc2Vjb25kX2NoYW5jZToKLQlyeHJwY19nZXRfY29ubmVjdGlvbihjb25uKTsKLQlnb3RvIHN1Y2Nlc3NfdXdmcmVlOwotCi19IC8qIGVuZCByeHJwY19jb25uZWN0aW9uX2xvb2t1cCgpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBmaW5pc2ggdXNpbmcgYSBjb25uZWN0aW9uIHJlY29yZAotICogLSBpdCB3aWxsIGJlIHRyYW5zZmVycmVkIHRvIHRoZSBwZWVyJ3MgY29ubmVjdGlvbiBncmF2ZXlhcmQgd2hlbiByZWZjb3VudAotICogICByZWFjaGVzIDAKLSAqLwotdm9pZCByeHJwY19wdXRfY29ubmVjdGlvbihzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubikKLXsKLQlzdHJ1Y3QgcnhycGNfcGVlciAqcGVlcjsKLQotCWlmICghY29ubikKLQkJcmV0dXJuOwotCi0JX2VudGVyKCIlcHt1PSVkIHA9JWh1fSIsCi0JICAgICAgIGNvbm4sIGF0b21pY19yZWFkKCZjb25uLT51c2FnZSksIG50b2hzKGNvbm4tPmFkZHIuc2luX3BvcnQpKTsKLQotCXBlZXIgPSBjb25uLT5wZWVyOwotCXNwaW5fbG9jaygmcGVlci0+Y29ubl9neWxvY2spOwotCi0JLyogc2FuaXR5IGNoZWNrICovCi0JaWYgKGF0b21pY19yZWFkKCZjb25uLT51c2FnZSkgPD0gMCkKLQkJQlVHKCk7Ci0KLQlpZiAobGlrZWx5KCFhdG9taWNfZGVjX2FuZF90ZXN0KCZjb25uLT51c2FnZSkpKSB7Ci0JCXNwaW5fdW5sb2NrKCZwZWVyLT5jb25uX2d5bG9jayk7Ci0JCV9sZWF2ZSgiIik7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBtb3ZlIHRvIGdyYXZleWFyZCBxdWV1ZSAqLwotCV9kZWJ1ZygiYnVyeWluZyBjb25uZWN0aW9uOiB7JTA4eH0iLCBudG9obChjb25uLT5jb25uX2lkKSk7Ci0JbGlzdF9tb3ZlX3RhaWwoJmNvbm4tPmxpbmssICZwZWVyLT5jb25uX2dyYXZleWFyZCk7Ci0KLQlyeHJwY19rcnh0aW1vZF9hZGRfdGltZXIoJmNvbm4tPnRpbWVvdXQsIHJ4cnBjX2Nvbm5fdGltZW91dCAqIEhaKTsKLQotCXNwaW5fdW5sb2NrKCZwZWVyLT5jb25uX2d5bG9jayk7Ci0KLQlyeHJwY19wdXRfcGVlcihjb25uLT5wZWVyKTsKLQotCV9sZWF2ZSgiIFtraWxsZWRdIik7Ci19IC8qIGVuZCByeHJwY19wdXRfY29ubmVjdGlvbigpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBmcmVlIGEgY29ubmVjdGlvbiByZWNvcmQKLSAqLwotc3RhdGljIHZvaWQgcnhycGNfY29ubl9kb190aW1lb3V0KHN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uKQotewotCXN0cnVjdCByeHJwY19wZWVyICpwZWVyOwotCi0JX2VudGVyKCIlcHt1PSVkIHA9JWh1fSIsCi0JICAgICAgIGNvbm4sIGF0b21pY19yZWFkKCZjb25uLT51c2FnZSksIG50b2hzKGNvbm4tPmFkZHIuc2luX3BvcnQpKTsKLQotCXBlZXIgPSBjb25uLT5wZWVyOwotCi0JaWYgKGF0b21pY19yZWFkKCZjb25uLT51c2FnZSkgPCAwKQotCQlCVUcoKTsKLQotCS8qIHJlbW92ZSBmcm9tIGdyYXZleWFyZCBpZiBzdGlsbCBkZWFkICovCi0Jc3Bpbl9sb2NrKCZwZWVyLT5jb25uX2d5bG9jayk7Ci0JaWYgKGF0b21pY19yZWFkKCZjb25uLT51c2FnZSkgPT0gMCkgewotCQlsaXN0X2RlbF9pbml0KCZjb25uLT5saW5rKTsKLQl9Ci0JZWxzZSB7Ci0JCWNvbm4gPSBOVUxMOwotCX0KLQlzcGluX3VubG9jaygmcGVlci0+Y29ubl9neWxvY2spOwotCi0JaWYgKCFjb25uKSB7Ci0JCV9sZWF2ZSgiIik7Ci0JCXJldHVybjsgLyogcmVzdXJyZWN0ZWQgKi8KLQl9Ci0KLQlfZGVidWcoIi0tLSBEZXN0cm95aW5nIENvbm5lY3Rpb24gJXB7JTA4eH0gLS0tIiwKLQkgICAgICAgY29ubiwgbnRvaGwoY29ubi0+Y29ubl9pZCkpOwotCi0JZG93bl93cml0ZSgmcnhycGNfY29ubnNfc2VtKTsKLQlsaXN0X2RlbCgmY29ubi0+cHJvY19saW5rKTsKLQl1cF93cml0ZSgmcnhycGNfY29ubnNfc2VtKTsKLQotCXdyaXRlX2xvY2soJnBlZXItPmNvbm5faWRsb2NrKTsKLQlsaXN0X2RlbCgmY29ubi0+aWRfbGluayk7Ci0Jd3JpdGVfdW5sb2NrKCZwZWVyLT5jb25uX2lkbG9jayk7Ci0KLQlfX1JYQUNDVChhdG9taWNfZGVjKCZyeHJwY19jb25uZWN0aW9uX2NvdW50KSk7Ci0Ja2ZyZWUoY29ubik7Ci0KLQkvKiBpZiB0aGUgZ3JhdmV5YXJkIGlzIG5vdyBlbXB0eSwgd2FrZSB1cCBhbnlvbmUgd2FpdGluZyBmb3IgdGhhdCAqLwotCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZwZWVyLT5jb25uX2NvdW50KSkKLQkJd2FrZV91cCgmcGVlci0+Y29ubl9neV93YWl0cSk7Ci0KLQlfbGVhdmUoIiBbZGVzdHJveWVkXSIpOwotfSAvKiBlbmQgcnhycGNfY29ubl9kb190aW1lb3V0KCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIGNsZWFyIGFsbCBjb25uZWN0aW9uIHJlY29yZHMgZnJvbSBhIHBlZXIgZW5kcG9pbnQKLSAqLwotdm9pZCByeHJwY19jb25uX2NsZWFyYWxsKHN0cnVjdCByeHJwY19wZWVyICpwZWVyKQotewotCURFQ0xBUkVfV0FJVFFVRVVFKG15c2VsZiwgY3VycmVudCk7Ci0KLQlzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubjsKLQlpbnQgZXJyOwotCi0JX2VudGVyKCIlcCIsIHBlZXIpOwotCi0JLyogdGhlcmUgc2hvdWxkbid0IGJlIGFueSBhY3RpdmUgY29ubnMgcmVtYWluaW5nICovCi0JaWYgKCFsaXN0X2VtcHR5KCZwZWVyLT5jb25uX2FjdGl2ZSkpCi0JCUJVRygpOwotCi0JLyogbWFudWFsbHkgdGltZW91dCBhbGwgY29ubnMgaW4gdGhlIGdyYXZleWFyZCAqLwotCXNwaW5fbG9jaygmcGVlci0+Y29ubl9neWxvY2spOwotCXdoaWxlICghbGlzdF9lbXB0eSgmcGVlci0+Y29ubl9ncmF2ZXlhcmQpKSB7Ci0JCWNvbm4gPSBsaXN0X2VudHJ5KHBlZXItPmNvbm5fZ3JhdmV5YXJkLm5leHQsCi0JCQkJICBzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiwgbGluayk7Ci0JCWVyciA9IHJ4cnBjX2tyeHRpbW9kX2RlbF90aW1lcigmY29ubi0+dGltZW91dCk7Ci0JCXNwaW5fdW5sb2NrKCZwZWVyLT5jb25uX2d5bG9jayk7Ci0KLQkJaWYgKGVyciA9PSAwKQotCQkJcnhycGNfY29ubl9kb190aW1lb3V0KGNvbm4pOwotCi0JCXNwaW5fbG9jaygmcGVlci0+Y29ubl9neWxvY2spOwotCX0KLQlzcGluX3VubG9jaygmcGVlci0+Y29ubl9neWxvY2spOwotCi0JLyogd2FpdCBmb3IgdGhlIHRoZSBjb25uIGdyYXZleWFyZCB0byBiZSBjb21wbGV0ZWx5IGNsZWFyZWQgKi8KLQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7Ci0JYWRkX3dhaXRfcXVldWUoJnBlZXItPmNvbm5fZ3lfd2FpdHEsICZteXNlbGYpOwotCi0Jd2hpbGUgKGF0b21pY19yZWFkKCZwZWVyLT5jb25uX2NvdW50KSAhPSAwKSB7Ci0JCXNjaGVkdWxlKCk7Ci0JCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKLQl9Ci0KLQlyZW1vdmVfd2FpdF9xdWV1ZSgmcGVlci0+Y29ubl9neV93YWl0cSwgJm15c2VsZik7Ci0Jc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKLQotCV9sZWF2ZSgiIik7Ci19IC8qIGVuZCByeHJwY19jb25uX2NsZWFyYWxsKCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIGFsbG9jYXRlIGFuZCBwcmVwYXJlIGEgbWVzc2FnZSBmb3Igc2VuZGluZyBvdXQgdGhyb3VnaCB0aGUgdHJhbnNwb3J0Ci0gKiBlbmRwb2ludAotICovCi1pbnQgcnhycGNfY29ubl9uZXdtc2coc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4sCi0JCSAgICAgIHN0cnVjdCByeHJwY19jYWxsICpjYWxsLAotCQkgICAgICB1aW50OF90IHR5cGUsCi0JCSAgICAgIGludCBkY291bnQsCi0JCSAgICAgIHN0cnVjdCBrdmVjIGRpb3ZbXSwKLQkJICAgICAgZ2ZwX3QgYWxsb2NfZmxhZ3MsCi0JCSAgICAgIHN0cnVjdCByeHJwY19tZXNzYWdlICoqX21zZykKLXsKLQlzdHJ1Y3QgcnhycGNfbWVzc2FnZSAqbXNnOwotCWludCBsb29wOwotCi0JX2VudGVyKCIlcHslZH0sJXAsJXUiLCBjb25uLCBudG9ocyhjb25uLT5hZGRyLnNpbl9wb3J0KSwgY2FsbCwgdHlwZSk7Ci0KLQlpZiAoZGNvdW50ID4gMykgewotCQlfbGVhdmUoIiA9IC1FSU5WQUwiKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JbXNnID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHJ4cnBjX21lc3NhZ2UpLCBhbGxvY19mbGFncyk7Ci0JaWYgKCFtc2cpIHsKLQkJX2xlYXZlKCIgPSAtRU5PTUVNIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCWF0b21pY19zZXQoJm1zZy0+dXNhZ2UsIDEpOwotCi0JSU5JVF9MSVNUX0hFQUQoJm1zZy0+bGluayk7Ci0KLQltc2ctPnN0YXRlID0gUlhSUENfTVNHX1BSRVBBUkVEOwotCi0JbXNnLT5oZHIuZXBvY2gJCT0gY29ubi0+b3V0X2Vwb2NoOwotCW1zZy0+aGRyLmNpZAkJPSBjb25uLT5jb25uX2lkIHwgKGNhbGwgPyBjYWxsLT5jaGFuX2l4IDogMCk7Ci0JbXNnLT5oZHIuY2FsbE51bWJlcgk9IGNhbGwgPyBjYWxsLT5jYWxsX2lkIDogMDsKLQltc2ctPmhkci50eXBlCQk9IHR5cGU7Ci0JbXNnLT5oZHIuZmxhZ3MJCT0gY29ubi0+b3V0X2NsaWVudGZsYWc7Ci0JbXNnLT5oZHIuc2VjdXJpdHlJbmRleAk9IGNvbm4tPnNlY3VyaXR5X2l4OwotCW1zZy0+aGRyLnNlcnZpY2VJZAk9IGNvbm4tPnNlcnZpY2VfaWQ7Ci0KLQkvKiBnZW5lcmF0ZSBzZXF1ZW5jZSBudW1iZXJzIGZvciBkYXRhIHBhY2tldHMgKi8KLQlpZiAoY2FsbCkgewotCQlzd2l0Y2ggKHR5cGUpIHsKLQkJY2FzZSBSWFJQQ19QQUNLRVRfVFlQRV9EQVRBOgotCQkJbXNnLT5zZXEgPSArK2NhbGwtPnNuZF9zZXFfY291bnQ7Ci0JCQltc2ctPmhkci5zZXEgPSBodG9ubChtc2ctPnNlcSk7Ci0JCQlicmVhazsKLQkJY2FzZSBSWFJQQ19QQUNLRVRfVFlQRV9BQ0s6Ci0JCQkvKiBBQ0sgc2VxdWVuY2UgbnVtYmVycyBhcmUgY29tcGxpY2F0ZWQuIFRoZSBmb2xsb3dpbmcKLQkJCSAqIG1heSBiZSB3cm9uZzoKLQkJCSAqIC0ganVtYm8gcGFja2V0IEFDS3Mgc2hvdWxkIGhhdmUgYSBzZXEgbnVtYmVyCi0JCQkgKiAtIG5vcm1hbCBBQ0tzIHNob3VsZCBub3QKLQkJCSAqLwotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQltc2ctPmRjb3VudCA9IGRjb3VudCArIDE7Ci0JbXNnLT5kc2l6ZSA9IHNpemVvZihtc2ctPmhkcik7Ci0JbXNnLT5kYXRhWzBdLmlvdl9sZW4gPSBzaXplb2YobXNnLT5oZHIpOwotCW1zZy0+ZGF0YVswXS5pb3ZfYmFzZSA9ICZtc2ctPmhkcjsKLQotCWZvciAobG9vcD0wOyBsb29wIDwgZGNvdW50OyBsb29wKyspIHsKLQkJbXNnLT5kc2l6ZSArPSBkaW92W2xvb3BdLmlvdl9sZW47Ci0JCW1zZy0+ZGF0YVtsb29wKzFdLmlvdl9sZW4gID0gZGlvdltsb29wXS5pb3ZfbGVuOwotCQltc2ctPmRhdGFbbG9vcCsxXS5pb3ZfYmFzZSA9IGRpb3ZbbG9vcF0uaW92X2Jhc2U7Ci0JfQotCi0JX19SWEFDQ1QoYXRvbWljX2luYygmcnhycGNfbWVzc2FnZV9jb3VudCkpOwotCSpfbXNnID0gbXNnOwotCV9sZWF2ZSgiID0gMCAoJXApICMlZCIsIG1zZywgYXRvbWljX3JlYWQoJnJ4cnBjX21lc3NhZ2VfY291bnQpKTsKLQlyZXR1cm4gMDsKLX0gLyogZW5kIHJ4cnBjX2Nvbm5fbmV3bXNnKCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIGZyZWUgYSBtZXNzYWdlCi0gKi8KLXZvaWQgX19yeHJwY19wdXRfbWVzc2FnZShzdHJ1Y3QgcnhycGNfbWVzc2FnZSAqbXNnKQotewotCWludCBsb29wOwotCi0JX2VudGVyKCIlcCAjJWQiLCBtc2csIGF0b21pY19yZWFkKCZyeHJwY19tZXNzYWdlX2NvdW50KSk7Ci0KLQlpZiAobXNnLT5wa3QpCi0JCWtmcmVlX3NrYihtc2ctPnBrdCk7Ci0JcnhycGNfcHV0X2Nvbm5lY3Rpb24obXNnLT5jb25uKTsKLQotCWZvciAobG9vcCA9IDA7IGxvb3AgPCA4OyBsb29wKyspCi0JCWlmICh0ZXN0X2JpdChsb29wLCAmbXNnLT5kZnJlZSkpCi0JCQlrZnJlZShtc2ctPmRhdGFbbG9vcF0uaW92X2Jhc2UpOwotCi0JX19SWEFDQ1QoYXRvbWljX2RlYygmcnhycGNfbWVzc2FnZV9jb3VudCkpOwotCWtmcmVlKG1zZyk7Ci0KLQlfbGVhdmUoIiIpOwotfSAvKiBlbmQgX19yeHJwY19wdXRfbWVzc2FnZSgpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBzZW5kIGEgbWVzc2FnZSBvdXQgdGhyb3VnaCB0aGUgdHJhbnNwb3J0IGVuZHBvaW50Ci0gKi8KLWludCByeHJwY19jb25uX3NlbmRtc2coc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4sCi0JCSAgICAgICBzdHJ1Y3QgcnhycGNfbWVzc2FnZSAqbXNnKQotewotCXN0cnVjdCBtc2doZHIgbXNnaGRyOwotCWludCByZXQ7Ci0KLQlfZW50ZXIoIiVweyVkfSIsIGNvbm4sIG50b2hzKGNvbm4tPmFkZHIuc2luX3BvcnQpKTsKLQotCS8qIGZpbGwgaW4gc29tZSBmaWVsZHMgaW4gdGhlIGhlYWRlciAqLwotCXNwaW5fbG9jaygmY29ubi0+bG9jayk7Ci0JbXNnLT5oZHIuc2VyaWFsID0gaHRvbmwoKytjb25uLT5zZXJpYWxfY291bnRlcik7Ci0JbXNnLT5ydHRkb25lID0gMDsKLQlzcGluX3VubG9jaygmY29ubi0+bG9jayk7Ci0KLQkvKiBzZXQgdXAgdGhlIG1lc3NhZ2UgdG8gYmUgdHJhbnNtaXR0ZWQgKi8KLQltc2doZHIubXNnX25hbWUJCT0gJmNvbm4tPmFkZHI7Ci0JbXNnaGRyLm1zZ19uYW1lbGVuCT0gc2l6ZW9mKGNvbm4tPmFkZHIpOwotCW1zZ2hkci5tc2dfY29udHJvbAk9IE5VTEw7Ci0JbXNnaGRyLm1zZ19jb250cm9sbGVuCT0gMDsKLQltc2doZHIubXNnX2ZsYWdzCT0gTVNHX0NPTkZJUk0gfCBNU0dfRE9OVFdBSVQ7Ci0KLQlfbmV0KCJTZW5kaW5nIG1lc3NhZ2UgdHlwZSAlZCBvZiAlWmQgYnl0ZXMgdG8gJTA4eDolZCIsCi0JICAgICBtc2ctPmhkci50eXBlLAotCSAgICAgbXNnLT5kc2l6ZSwKLQkgICAgIG50b2hsKGNvbm4tPmFkZHIuc2luX2FkZHIuc19hZGRyKSwKLQkgICAgIG50b2hzKGNvbm4tPmFkZHIuc2luX3BvcnQpKTsKLQotCS8qIHNlbmQgdGhlIG1lc3NhZ2UgKi8KLQlyZXQgPSBrZXJuZWxfc2VuZG1zZyhjb25uLT50cmFucy0+c29ja2V0LCAmbXNnaGRyLAotCQkJICAgICBtc2ctPmRhdGEsIG1zZy0+ZGNvdW50LCBtc2ctPmRzaXplKTsKLQlpZiAocmV0IDwgMCkgewotCQltc2ctPnN0YXRlID0gUlhSUENfTVNHX0VSUk9SOwotCX0gZWxzZSB7Ci0JCW1zZy0+c3RhdGUgPSBSWFJQQ19NU0dfU0VOVDsKLQkJcmV0ID0gMDsKLQotCQlzcGluX2xvY2soJmNvbm4tPmxvY2spOwotCQlkb19nZXR0aW1lb2ZkYXkoJmNvbm4tPmF0aW1lKTsKLQkJbXNnLT5zdGFtcCA9IGNvbm4tPmF0aW1lOwotCQlzcGluX3VubG9jaygmY29ubi0+bG9jayk7Ci0JfQotCi0JX2xlYXZlKCIgPSAlZCIsIHJldCk7Ci0KLQlyZXR1cm4gcmV0OwotfSAvKiBlbmQgcnhycGNfY29ubl9zZW5kbXNnKCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIGRlYWwgd2l0aCBhIHN1YnNlcXVlbnQgY2FsbCBwYWNrZXQKLSAqLwotaW50IHJ4cnBjX2Nvbm5fcmVjZWl2ZV9jYWxsX3BhY2tldChzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubiwKLQkJCQkgICBzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwKLQkJCQkgICBzdHJ1Y3QgcnhycGNfbWVzc2FnZSAqbXNnKQotewotCXN0cnVjdCByeHJwY19tZXNzYWdlICpwbXNnOwotCXN0cnVjdCBkc3RfZW50cnkgKmRzdDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpfcDsKLQl1bnNpZ25lZCBjaXgsIHNlcTsKLQlpbnQgcmV0ID0gMDsKLQotCV9lbnRlcigiJXAsJXAsJXAiLCBjb25uLCBjYWxsLCBtc2cpOwotCi0JaWYgKCFjYWxsKSB7Ci0JCWNpeCA9IG50b2hsKG1zZy0+aGRyLmNpZCkgJiBSWFJQQ19DSEFOTkVMTUFTSzsKLQotCQlzcGluX2xvY2soJmNvbm4tPmxvY2spOwotCQljYWxsID0gY29ubi0+Y2hhbm5lbHNbY2l4XTsKLQotCQlpZiAoIWNhbGwgfHwgY2FsbC0+Y2FsbF9pZCAhPSBtc2ctPmhkci5jYWxsTnVtYmVyKSB7Ci0JCQlzcGluX3VubG9jaygmY29ubi0+bG9jayk7Ci0JCQlyeHJwY190cmFuc19pbW1lZGlhdGVfYWJvcnQoY29ubi0+dHJhbnMsIG1zZywgLUVOT0VOVCk7Ci0JCQlnb3RvIG91dDsKLQkJfQotCQllbHNlIHsKLQkJCXJ4cnBjX2dldF9jYWxsKGNhbGwpOwotCQkJc3Bpbl91bmxvY2soJmNvbm4tPmxvY2spOwotCQl9Ci0JfQotCWVsc2UgewotCQlyeHJwY19nZXRfY2FsbChjYWxsKTsKLQl9Ci0KLQlfcHJvdG8oIlJlY2VpdmVkIHBhY2tldCAlJSV1IFsldV0gb24gY2FsbCAlaHU6JXU6JXUiLAotCSAgICAgICBudG9obChtc2ctPmhkci5zZXJpYWwpLAotCSAgICAgICBudG9obChtc2ctPmhkci5zZXEpLAotCSAgICAgICBudG9ocyhtc2ctPmhkci5zZXJ2aWNlSWQpLAotCSAgICAgICBudG9obChjb25uLT5jb25uX2lkKSwKLQkgICAgICAgbnRvaGwoY2FsbC0+Y2FsbF9pZCkpOwotCi0JY2FsbC0+cGt0X3Jjdl9jb3VudCsrOwotCi0JZHN0ID0gbXNnLT5wa3QtPmRzdDsKLQlpZiAoZHN0ICYmIGRzdC0+ZGV2KQotCQljb25uLT5wZWVyLT5pZl9tdHUgPQotCQkJZHN0LT5kZXYtPm10dSAtIGRzdC0+ZGV2LT5oYXJkX2hlYWRlcl9sZW47Ci0KLQkvKiBxdWV1ZSBvbiB0aGUgY2FsbCBpbiBzZXEgb3JkZXIgKi8KLQlyeHJwY19nZXRfbWVzc2FnZShtc2cpOwotCXNlcSA9IG1zZy0+c2VxOwotCi0Jc3Bpbl9sb2NrKCZjYWxsLT5sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoKF9wLCAmY2FsbC0+cmN2X3JlY2VpdmVxKSB7Ci0JCXBtc2cgPSBsaXN0X2VudHJ5KF9wLCBzdHJ1Y3QgcnhycGNfbWVzc2FnZSwgbGluayk7Ci0JCWlmIChwbXNnLT5zZXEgPiBzZXEpCi0JCQlicmVhazsKLQl9Ci0JbGlzdF9hZGRfdGFpbCgmbXNnLT5saW5rLCBfcCk7Ci0KLQkvKiByZXNldCB0aGUgYWN0aXZpdHkgdGltZW91dCAqLwotCWNhbGwtPmZsYWdzIHw9IFJYUlBDX0NBTExfUkNWX1BLVDsKLQltb2RfdGltZXIoJmNhbGwtPnJjdl90aW1lb3V0LGppZmZpZXMgKyByeHJwY19jYWxsX3Jjdl90aW1lb3V0ICogSFopOwotCi0Jc3Bpbl91bmxvY2soJmNhbGwtPmxvY2spOwotCi0JcnhycGNfa3J4aW9kX3F1ZXVlX2NhbGwoY2FsbCk7Ci0KLQlyeHJwY19wdXRfY2FsbChjYWxsKTsKLSBvdXQ6Ci0JX2xlYXZlKCIgPSAlZCIsIHJldCk7Ci0JcmV0dXJuIHJldDsKLX0gLyogZW5kIHJ4cnBjX2Nvbm5fcmVjZWl2ZV9jYWxsX3BhY2tldCgpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBoYW5kbGUgYW4gSUNNUCBlcnJvciBiZWluZyBhcHBsaWVkIHRvIGEgY29ubmVjdGlvbgotICovCi12b2lkIHJ4cnBjX2Nvbm5faGFuZGxlX2Vycm9yKHN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uLAotCQkJICAgICBpbnQgbG9jYWwsIGludCBlcnJubykKLXsKLQlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbHNbNF07Ci0JaW50IGxvb3A7Ci0KLQlfZW50ZXIoIiVweyVkfSwlZCIsIGNvbm4sIG50b2hzKGNvbm4tPmFkZHIuc2luX3BvcnQpLCBlcnJubyk7Ci0KLQkvKiBnZXQgYSByZWYgdG8gYWxsIG15IGNhbGxzIGluIG9uZSBnbyAqLwotCW1lbXNldChjYWxscywgMCwgc2l6ZW9mKGNhbGxzKSk7Ci0Jc3Bpbl9sb2NrKCZjb25uLT5sb2NrKTsKLQotCWZvciAobG9vcCA9IDM7IGxvb3AgPj0gMDsgbG9vcC0tKSB7Ci0JCWlmIChjb25uLT5jaGFubmVsc1tsb29wXSkgewotCQkJY2FsbHNbbG9vcF0gPSBjb25uLT5jaGFubmVsc1tsb29wXTsKLQkJCXJ4cnBjX2dldF9jYWxsKGNhbGxzW2xvb3BdKTsKLQkJfQotCX0KLQotCXNwaW5fdW5sb2NrKCZjb25uLT5sb2NrKTsKLQotCS8qIG5vdyBraWNrIHRoZW0gYWxsICovCi0JZm9yIChsb29wID0gMzsgbG9vcCA+PSAwOyBsb29wLS0pIHsKLQkJaWYgKGNhbGxzW2xvb3BdKSB7Ci0JCQlyeHJwY19jYWxsX2hhbmRsZV9lcnJvcihjYWxsc1tsb29wXSwgbG9jYWwsIGVycm5vKTsKLQkJCXJ4cnBjX3B1dF9jYWxsKGNhbGxzW2xvb3BdKTsKLQkJfQotCX0KLQotCV9sZWF2ZSgiIik7Ci19IC8qIGVuZCByeHJwY19jb25uX2hhbmRsZV9lcnJvcigpICovCmRpZmYgLS1naXQgYS9uZXQvcnhycGMvaW50ZXJuYWwuaCBiL25ldC9yeHJwYy9pbnRlcm5hbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzBjNTc5Li4wMDAwMDAwCi0tLSBhL25ldC9yeHJwYy9pbnRlcm5hbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qIGludGVybmFsLmg6IGludGVybmFsIFJ4IFJQQyBzdHVmZgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMiAgIERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pLgotICovCi0KLSNpZm5kZWYgUlhSUENfSU5URVJOQUxfSAotI2RlZmluZSBSWFJQQ19JTlRFUk5BTF9ICi0KLSNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotCi0vKgotICogZGVidWcgYWNjb3VudGluZwotICovCi0jaWYgMQotI2RlZmluZSBfX1JYQUNDVF9ERUNMKFgpIFgKLSNkZWZpbmUgX19SWEFDQ1QoWCkgZG8geyBYOyB9IHdoaWxlKDApCi0jZWxzZQotI2RlZmluZSBfX1JYQUNDVF9ERUNMKFgpCi0jZGVmaW5lIF9fUlhBQ0NUKFgpIGRvIHsgfSB3aGlsZSgwKQotI2VuZGlmCi0KLV9fUlhBQ0NUX0RFQ0woZXh0ZXJuIGF0b21pY190IHJ4cnBjX3RyYW5zcG9ydF9jb3VudCk7Ci1fX1JYQUNDVF9ERUNMKGV4dGVybiBhdG9taWNfdCByeHJwY19wZWVyX2NvdW50KTsKLV9fUlhBQ0NUX0RFQ0woZXh0ZXJuIGF0b21pY190IHJ4cnBjX2Nvbm5lY3Rpb25fY291bnQpOwotX19SWEFDQ1RfREVDTChleHRlcm4gYXRvbWljX3QgcnhycGNfY2FsbF9jb3VudCk7Ci1fX1JYQUNDVF9ERUNMKGV4dGVybiBhdG9taWNfdCByeHJwY19tZXNzYWdlX2NvdW50KTsKLQotLyoKLSAqIGRlYnVnIHRyYWNpbmcKLSAqLwotI2RlZmluZSBrZW50ZXIoRk1ULCBhLi4uKQlwcmludGsoIj09PiAlcygiRk1UIilcbiIsX19GVU5DVElPTl9fICwgIyNhKQotI2RlZmluZSBrbGVhdmUoRk1ULCBhLi4uKQlwcmludGsoIjw9PSAlcygpIkZNVCJcbiIsX19GVU5DVElPTl9fICwgIyNhKQotI2RlZmluZSBrZGVidWcoRk1ULCBhLi4uKQlwcmludGsoIiAgICAiRk1UIlxuIiAsICMjYSkKLSNkZWZpbmUga3Byb3RvKEZNVCwgYS4uLikJcHJpbnRrKCIjIyMgIkZNVCJcbiIgLCAjI2EpCi0jZGVmaW5lIGtuZXQoRk1ULCBhLi4uKQkJcHJpbnRrKCIgICAgIkZNVCJcbiIgLCAjI2EpCi0KLSNpZiAwCi0jZGVmaW5lIF9lbnRlcihGTVQsIGEuLi4pCWtlbnRlcihGTVQgLCAjI2EpCi0jZGVmaW5lIF9sZWF2ZShGTVQsIGEuLi4pCWtsZWF2ZShGTVQgLCAjI2EpCi0jZGVmaW5lIF9kZWJ1ZyhGTVQsIGEuLi4pCWtkZWJ1ZyhGTVQgLCAjI2EpCi0jZGVmaW5lIF9wcm90byhGTVQsIGEuLi4pCWtwcm90byhGTVQgLCAjI2EpCi0jZGVmaW5lIF9uZXQoRk1ULCBhLi4uKQkJa25ldChGTVQgLCAjI2EpCi0jZWxzZQotI2RlZmluZSBfZW50ZXIoRk1ULCBhLi4uKQlkbyB7IGlmIChyeHJwY19rdHJhY2UpIGtlbnRlcihGTVQgLCAjI2EpOyB9IHdoaWxlKDApCi0jZGVmaW5lIF9sZWF2ZShGTVQsIGEuLi4pCWRvIHsgaWYgKHJ4cnBjX2t0cmFjZSkga2xlYXZlKEZNVCAsICMjYSk7IH0gd2hpbGUoMCkKLSNkZWZpbmUgX2RlYnVnKEZNVCwgYS4uLikJZG8geyBpZiAocnhycGNfa2RlYnVnKSBrZGVidWcoRk1UICwgIyNhKTsgfSB3aGlsZSgwKQotI2RlZmluZSBfcHJvdG8oRk1ULCBhLi4uKQlkbyB7IGlmIChyeHJwY19rcHJvdG8pIGtwcm90byhGTVQgLCAjI2EpOyB9IHdoaWxlKDApCi0jZGVmaW5lIF9uZXQoRk1ULCBhLi4uKQkJZG8geyBpZiAocnhycGNfa25ldCkgICBrbmV0ICAoRk1UICwgIyNhKTsgfSB3aGlsZSgwKQotI2VuZGlmCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCByeHJwY19kaXNjYXJkX215X3NpZ25hbHModm9pZCkKLXsKLQl3aGlsZSAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKLQkJc2lnaW5mb190IHNpbmZvOwotCi0JCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwotCQlkZXF1ZXVlX3NpZ25hbChjdXJyZW50LCAmY3VycmVudC0+YmxvY2tlZCwgJnNpbmZvKTsKLQkJc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKLQl9Ci19Ci0KLS8qCi0gKiBjYWxsLmMKLSAqLwotZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgcnhycGNfY2FsbHM7Ci1leHRlcm4gc3RydWN0IHJ3X3NlbWFwaG9yZSByeHJwY19jYWxsc19zZW07Ci0KLS8qCi0gKiBjb25uZWN0aW9uLmMKLSAqLwotZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgcnhycGNfY29ubnM7Ci1leHRlcm4gc3RydWN0IHJ3X3NlbWFwaG9yZSByeHJwY19jb25uc19zZW07Ci1leHRlcm4gdW5zaWduZWQgbG9uZyByeHJwY19jb25uX3RpbWVvdXQ7Ci0KLWV4dGVybiB2b2lkIHJ4cnBjX2Nvbm5fY2xlYXJhbGwoc3RydWN0IHJ4cnBjX3BlZXIgKnBlZXIpOwotCi0vKgotICogcGVlci5jCi0gKi8KLWV4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIHJ4cnBjX3BlZXJzOwotZXh0ZXJuIHN0cnVjdCByd19zZW1hcGhvcmUgcnhycGNfcGVlcnNfc2VtOwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcnhycGNfcGVlcl90aW1lb3V0OwotCi1leHRlcm4gdm9pZCByeHJwY19wZWVyX2NhbGN1bGF0ZV9ydHQoc3RydWN0IHJ4cnBjX3BlZXIgKnBlZXIsCi0JCQkJICAgICBzdHJ1Y3QgcnhycGNfbWVzc2FnZSAqbXNnLAotCQkJCSAgICAgc3RydWN0IHJ4cnBjX21lc3NhZ2UgKnJlc3ApOwotCi1leHRlcm4gdm9pZCByeHJwY19wZWVyX2NsZWFyYWxsKHN0cnVjdCByeHJwY190cmFuc3BvcnQgKnRyYW5zKTsKLQotCi0vKgotICogcHJvYy5jCi0gKi8KLSNpZmRlZiBDT05GSUdfUFJPQ19GUwotZXh0ZXJuIGludCByeHJwY19wcm9jX2luaXQodm9pZCk7Ci1leHRlcm4gdm9pZCByeHJwY19wcm9jX2NsZWFudXAodm9pZCk7Ci0jZW5kaWYKLQotLyoKLSAqIHRyYW5zcG9ydC5jCi0gKi8KLWV4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIHJ4cnBjX3Byb2NfdHJhbnNwb3J0czsKLWV4dGVybiBzdHJ1Y3Qgcndfc2VtYXBob3JlIHJ4cnBjX3Byb2NfdHJhbnNwb3J0c19zZW07Ci0KLSNlbmRpZiAvKiBSWFJQQ19JTlRFUk5BTF9IICovCmRpZmYgLS1naXQgYS9uZXQvcnhycGMva3J4aW9kLmMgYi9uZXQvcnhycGMva3J4aW9kLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiYmNkNmMuLjAwMDAwMDAKLS0tIGEvbmV0L3J4cnBjL2tyeGlvZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjYyICswLDAgQEAKLS8qIGtyeGlvZC5jOiBSeCBJL08gZGFlbW9uCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+Ci0jaW5jbHVkZSA8cnhycGMva3J4aW9kLmg+Ci0jaW5jbHVkZSA8cnhycGMvdHJhbnNwb3J0Lmg+Ci0jaW5jbHVkZSA8cnhycGMvcGVlci5oPgotI2luY2x1ZGUgPHJ4cnBjL2NhbGwuaD4KLSNpbmNsdWRlICJpbnRlcm5hbC5oIgotCi1zdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQocnhycGNfa3J4aW9kX3NsZWVwcSk7Ci1zdGF0aWMgREVDTEFSRV9DT01QTEVUSU9OKHJ4cnBjX2tyeGlvZF9kZWFkKTsKLQotc3RhdGljIGF0b21pY190IHJ4cnBjX2tyeGlvZF9xY291bnQgPSBBVE9NSUNfSU5JVCgwKTsKLQotc3RhdGljIExJU1RfSEVBRChyeHJwY19rcnhpb2RfdHJhbnNwb3J0cSk7Ci1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKHJ4cnBjX2tyeGlvZF90cmFuc3BvcnRxX2xvY2spOwotCi1zdGF0aWMgTElTVF9IRUFEKHJ4cnBjX2tyeGlvZF9jYWxscSk7Ci1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKHJ4cnBjX2tyeGlvZF9jYWxscV9sb2NrKTsKLQotc3RhdGljIHZvbGF0aWxlIGludCByeHJwY19rcnhpb2RfZGllOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogUnggSS9PIGRhZW1vbgotICovCi1zdGF0aWMgaW50IHJ4cnBjX2tyeGlvZCh2b2lkICphcmcpCi17Ci0JREVDTEFSRV9XQUlUUVVFVUUoa3J4aW9kLGN1cnJlbnQpOwotCi0JcHJpbnRrKCJTdGFydGVkIGtyeGlvZCAlZFxuIixjdXJyZW50LT5waWQpOwotCi0JZGFlbW9uaXplKCJrcnhpb2QiKTsKLQotCS8qIGxvb3AgYXJvdW5kIHdhaXRpbmcgZm9yIHdvcmsgdG8gZG8gKi8KLQlkbyB7Ci0JCS8qIHdhaXQgZm9yIHdvcmsgb3IgdG8gYmUgdG9sZCB0byBleGl0ICovCi0JCV9kZWJ1ZygiIyMjIEJlZ2luIFdhaXQiKTsKLQkJaWYgKCFhdG9taWNfcmVhZCgmcnhycGNfa3J4aW9kX3Fjb3VudCkpIHsKLQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0KLQkJCWFkZF93YWl0X3F1ZXVlKCZyeHJwY19rcnhpb2Rfc2xlZXBxLCAma3J4aW9kKTsKLQotCQkJZm9yICg7OykgewotCQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JCQkJaWYgKGF0b21pY19yZWFkKCZyeHJwY19rcnhpb2RfcWNvdW50KSB8fAotCQkJCSAgICByeHJwY19rcnhpb2RfZGllIHx8Ci0JCQkJICAgIHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQotCQkJCQlicmVhazsKLQotCQkJCXNjaGVkdWxlKCk7Ci0JCQl9Ci0KLQkJCXJlbW92ZV93YWl0X3F1ZXVlKCZyeHJwY19rcnhpb2Rfc2xlZXBxLCAma3J4aW9kKTsKLQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7Ci0JCX0KLQkJX2RlYnVnKCIjIyMgRW5kIFdhaXQiKTsKLQotCQkvKiBkbyB3b3JrIGlmIGJlZW4gZ2l2ZW4gc29tZSB0byBkbyAqLwotCQlfZGVidWcoIiMjIyBCZWdpbiBXb3JrIik7Ci0KLQkJLyogc2VlIGlmIHRoZXJlJ3MgYSB0cmFuc3BvcnQgaW4gbmVlZCBvZiBhdHRlbnRpb24gKi8KLQkJaWYgKCFsaXN0X2VtcHR5KCZyeHJwY19rcnhpb2RfdHJhbnNwb3J0cSkpIHsKLQkJCXN0cnVjdCByeHJwY190cmFuc3BvcnQgKnRyYW5zID0gTlVMTDsKLQotCQkJc3Bpbl9sb2NrX2lycSgmcnhycGNfa3J4aW9kX3RyYW5zcG9ydHFfbG9jayk7Ci0KLQkJCWlmICghbGlzdF9lbXB0eSgmcnhycGNfa3J4aW9kX3RyYW5zcG9ydHEpKSB7Ci0JCQkJdHJhbnMgPSBsaXN0X2VudHJ5KAotCQkJCQlyeHJwY19rcnhpb2RfdHJhbnNwb3J0cS5uZXh0LAotCQkJCQlzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0LAotCQkJCQlrcnhpb2RxX2xpbmspOwotCi0JCQkJbGlzdF9kZWxfaW5pdCgmdHJhbnMtPmtyeGlvZHFfbGluayk7Ci0JCQkJYXRvbWljX2RlYygmcnhycGNfa3J4aW9kX3Fjb3VudCk7Ci0KLQkJCQkvKiBtYWtlIHN1cmUgaXQgaGFzbid0IGdvbmUgYXdheSBhbmQgZG9lc24ndCBnbwotCQkJCSAqIGF3YXkgKi8KLQkJCQlpZiAoYXRvbWljX3JlYWQoJnRyYW5zLT51c2FnZSk+MCkKLQkJCQkJcnhycGNfZ2V0X3RyYW5zcG9ydCh0cmFucyk7Ci0JCQkJZWxzZQotCQkJCQl0cmFucyA9IE5VTEw7Ci0JCQl9Ci0KLQkJCXNwaW5fdW5sb2NrX2lycSgmcnhycGNfa3J4aW9kX3RyYW5zcG9ydHFfbG9jayk7Ci0KLQkJCWlmICh0cmFucykgewotCQkJCXJ4cnBjX3RyYW5zX3JlY2VpdmVfcGFja2V0KHRyYW5zKTsKLQkJCQlyeHJwY19wdXRfdHJhbnNwb3J0KHRyYW5zKTsKLQkJCX0KLQkJfQotCi0JCS8qIHNlZSBpZiB0aGVyZSdzIGEgY2FsbCBpbiBuZWVkIG9mIGF0dGVudGlvbiAqLwotCQlpZiAoIWxpc3RfZW1wdHkoJnJ4cnBjX2tyeGlvZF9jYWxscSkpIHsKLQkJCXN0cnVjdCByeHJwY19jYWxsICpjYWxsID0gTlVMTDsKLQotCQkJc3Bpbl9sb2NrX2lycSgmcnhycGNfa3J4aW9kX2NhbGxxX2xvY2spOwotCi0JCQlpZiAoIWxpc3RfZW1wdHkoJnJ4cnBjX2tyeGlvZF9jYWxscSkpIHsKLQkJCQljYWxsID0gbGlzdF9lbnRyeShyeHJwY19rcnhpb2RfY2FsbHEubmV4dCwKLQkJCQkJCSAgc3RydWN0IHJ4cnBjX2NhbGwsCi0JCQkJCQkgIHJjdl9rcnhpb2RxX2xrKTsKLQkJCQlsaXN0X2RlbF9pbml0KCZjYWxsLT5yY3Zfa3J4aW9kcV9sayk7Ci0JCQkJYXRvbWljX2RlYygmcnhycGNfa3J4aW9kX3Fjb3VudCk7Ci0KLQkJCQkvKiBtYWtlIHN1cmUgaXQgaGFzbid0IGdvbmUgYXdheSBhbmQgZG9lc24ndCBnbwotCQkJCSAqIGF3YXkgKi8KLQkJCQlpZiAoYXRvbWljX3JlYWQoJmNhbGwtPnVzYWdlKSA+IDApIHsKLQkJCQkJX2RlYnVnKCJAQEAgS1JYSU9EIgotCQkJCQkgICAgICAgIiBCZWdpbiBBdHRlbmQgQ2FsbCAlcCIsIGNhbGwpOwotCQkJCQlyeHJwY19nZXRfY2FsbChjYWxsKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWNhbGwgPSBOVUxMOwotCQkJCX0KLQkJCX0KLQotCQkJc3Bpbl91bmxvY2tfaXJxKCZyeHJwY19rcnhpb2RfY2FsbHFfbG9jayk7Ci0KLQkJCWlmIChjYWxsKSB7Ci0JCQkJcnhycGNfY2FsbF9kb19zdHVmZihjYWxsKTsKLQkJCQlyeHJwY19wdXRfY2FsbChjYWxsKTsKLQkJCQlfZGVidWcoIkBAQCBLUlhJT0QgRW5kIEF0dGVuZCBDYWxsICVwIiwgY2FsbCk7Ci0JCQl9Ci0JCX0KLQotCQlfZGVidWcoIiMjIyBFbmQgV29yayIpOwotCi0JCXRyeV90b19mcmVlemUoKTsKLQotCQkvKiBkaXNjYXJkIHBlbmRpbmcgc2lnbmFscyAqLwotCQlyeHJwY19kaXNjYXJkX215X3NpZ25hbHMoKTsKLQotCX0gd2hpbGUgKCFyeHJwY19rcnhpb2RfZGllKTsKLQotCS8qIGFuZCB0aGF0J3MgYWxsICovCi0JY29tcGxldGVfYW5kX2V4aXQoJnJ4cnBjX2tyeGlvZF9kZWFkLCAwKTsKLQotfSAvKiBlbmQgcnhycGNfa3J4aW9kKCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIHN0YXJ0IHVwIGEga3J4aW9kIGRhZW1vbgotICovCi1pbnQgX19pbml0IHJ4cnBjX2tyeGlvZF9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIGtlcm5lbF90aHJlYWQocnhycGNfa3J4aW9kLCBOVUxMLCAwKTsKLQotfSAvKiBlbmQgcnhycGNfa3J4aW9kX2luaXQoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICoga2lsbCB0aGUga3J4aW9kIGRhZW1vbiBhbmQgd2FpdCBmb3IgaXQgdG8gY29tcGxldGUKLSAqLwotdm9pZCByeHJwY19rcnhpb2Rfa2lsbCh2b2lkKQotewotCXJ4cnBjX2tyeGlvZF9kaWUgPSAxOwotCXdha2VfdXBfYWxsKCZyeHJwY19rcnhpb2Rfc2xlZXBxKTsKLQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZyeHJwY19rcnhpb2RfZGVhZCk7Ci0KLX0gLyogZW5kIHJ4cnBjX2tyeGlvZF9raWxsKCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIHF1ZXVlIGEgdHJhbnNwb3J0IGZvciBhdHRlbnRpb24gYnkga3J4aW9kCi0gKi8KLXZvaWQgcnhycGNfa3J4aW9kX3F1ZXVlX3RyYW5zcG9ydChzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICp0cmFucykKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JX2VudGVyKCIiKTsKLQotCWlmIChsaXN0X2VtcHR5KCZ0cmFucy0+a3J4aW9kcV9saW5rKSkgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmcnhycGNfa3J4aW9kX3RyYW5zcG9ydHFfbG9jaywgZmxhZ3MpOwotCi0JCWlmIChsaXN0X2VtcHR5KCZ0cmFucy0+a3J4aW9kcV9saW5rKSkgewotCQkJaWYgKGF0b21pY19yZWFkKCZ0cmFucy0+dXNhZ2UpID4gMCkgewotCQkJCWxpc3RfYWRkX3RhaWwoJnRyYW5zLT5rcnhpb2RxX2xpbmssCi0JCQkJCSAgICAgICZyeHJwY19rcnhpb2RfdHJhbnNwb3J0cSk7Ci0JCQkJYXRvbWljX2luYygmcnhycGNfa3J4aW9kX3Fjb3VudCk7Ci0JCQl9Ci0JCX0KLQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyeHJwY19rcnhpb2RfdHJhbnNwb3J0cV9sb2NrLCBmbGFncyk7Ci0JCXdha2VfdXBfYWxsKCZyeHJwY19rcnhpb2Rfc2xlZXBxKTsKLQl9Ci0KLQlfbGVhdmUoIiIpOwotCi19IC8qIGVuZCByeHJwY19rcnhpb2RfcXVldWVfdHJhbnNwb3J0KCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIGRlcXVldWUgYSB0cmFuc3BvcnQgZnJvbSBrcnhpb2QncyBhdHRlbnRpb24gcXVldWUKLSAqLwotdm9pZCByeHJwY19rcnhpb2RfZGVxdWV1ZV90cmFuc3BvcnQoc3RydWN0IHJ4cnBjX3RyYW5zcG9ydCAqdHJhbnMpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCV9lbnRlcigiIik7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcnhycGNfa3J4aW9kX3RyYW5zcG9ydHFfbG9jaywgZmxhZ3MpOwotCWlmICghbGlzdF9lbXB0eSgmdHJhbnMtPmtyeGlvZHFfbGluaykpIHsKLQkJbGlzdF9kZWxfaW5pdCgmdHJhbnMtPmtyeGlvZHFfbGluayk7Ci0JCWF0b21pY19kZWMoJnJ4cnBjX2tyeGlvZF9xY291bnQpOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyeHJwY19rcnhpb2RfdHJhbnNwb3J0cV9sb2NrLCBmbGFncyk7Ci0KLQlfbGVhdmUoIiIpOwotCi19IC8qIGVuZCByeHJwY19rcnhpb2RfZGVxdWV1ZV90cmFuc3BvcnQoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogcXVldWUgYSBjYWxsIGZvciBhdHRlbnRpb24gYnkga3J4aW9kCi0gKi8KLXZvaWQgcnhycGNfa3J4aW9kX3F1ZXVlX2NhbGwoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmIChsaXN0X2VtcHR5KCZjYWxsLT5yY3Zfa3J4aW9kcV9saykpIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnJ4cnBjX2tyeGlvZF9jYWxscV9sb2NrLCBmbGFncyk7Ci0JCWlmIChhdG9taWNfcmVhZCgmY2FsbC0+dXNhZ2UpID4gMCkgewotCQkJbGlzdF9hZGRfdGFpbCgmY2FsbC0+cmN2X2tyeGlvZHFfbGssCi0JCQkJICAgICAgJnJ4cnBjX2tyeGlvZF9jYWxscSk7Ci0JCQlhdG9taWNfaW5jKCZyeHJwY19rcnhpb2RfcWNvdW50KTsKLQkJfQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyeHJwY19rcnhpb2RfY2FsbHFfbG9jaywgZmxhZ3MpOwotCX0KLQl3YWtlX3VwX2FsbCgmcnhycGNfa3J4aW9kX3NsZWVwcSk7Ci0KLX0gLyogZW5kIHJ4cnBjX2tyeGlvZF9xdWV1ZV9jYWxsKCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIGRlcXVldWUgYSBjYWxsIGZyb20ga3J4aW9kJ3MgYXR0ZW50aW9uIHF1ZXVlCi0gKi8KLXZvaWQgcnhycGNfa3J4aW9kX2RlcXVldWVfY2FsbChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnJ4cnBjX2tyeGlvZF9jYWxscV9sb2NrLCBmbGFncyk7Ci0JaWYgKCFsaXN0X2VtcHR5KCZjYWxsLT5yY3Zfa3J4aW9kcV9saykpIHsKLQkJbGlzdF9kZWxfaW5pdCgmY2FsbC0+cmN2X2tyeGlvZHFfbGspOwotCQlhdG9taWNfZGVjKCZyeHJwY19rcnhpb2RfcWNvdW50KTsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnhycGNfa3J4aW9kX2NhbGxxX2xvY2ssIGZsYWdzKTsKLQotfSAvKiBlbmQgcnhycGNfa3J4aW9kX2RlcXVldWVfY2FsbCgpICovCmRpZmYgLS1naXQgYS9uZXQvcnhycGMva3J4c2VjZC5jIGIvbmV0L3J4cnBjL2tyeHNlY2QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWExZTdmNS4uMDAwMDAwMAotLS0gYS9uZXQvcnhycGMva3J4c2VjZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjcwICswLDAgQEAKLS8qIGtyeHNlY2QuYzogUnggc2VjdXJpdHkgZGFlbW9uCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgZGFlbW9uIGRlYWxzIHdpdGg6Ci0gKiAtIGNvbnN1bHRpbmcgdGhlIGFwcGxpY2F0aW9uIGFzIHRvIHdoZXRoZXIgaW5ib3VuZCBwZWVycyBhbmQgY2FsbHMgc2hvdWxkIGJlIGF1dGhvcmlzZWQKLSAqIC0gZ2VuZXJhdGluZyBzZWN1cml0eSBjaGFsbGVuZ2VzIGZvciBpbmJvdW5kIGNvbm5lY3Rpb25zCi0gKiAtIHJlc3BvbmRpbmcgdG8gc2VjdXJpdHkgY2hhbGxlbmdlcyBvbiBvdXRib3VuZCBjb25uZWN0aW9ucwotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxyeHJwYy9rcnhzZWNkLmg+Ci0jaW5jbHVkZSA8cnhycGMvdHJhbnNwb3J0Lmg+Ci0jaW5jbHVkZSA8cnhycGMvY29ubmVjdGlvbi5oPgotI2luY2x1ZGUgPHJ4cnBjL21lc3NhZ2UuaD4KLSNpbmNsdWRlIDxyeHJwYy9wZWVyLmg+Ci0jaW5jbHVkZSA8cnhycGMvY2FsbC5oPgotI2luY2x1ZGUgPGxpbnV4L3VkcC5oPgotI2luY2x1ZGUgPGxpbnV4L2lwLmg+Ci0jaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgotI2luY2x1ZGUgPG5ldC9zb2NrLmg+Ci0jaW5jbHVkZSAiaW50ZXJuYWwuaCIKLQotc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKHJ4cnBjX2tyeHNlY2Rfc2xlZXBxKTsKLXN0YXRpYyBERUNMQVJFX0NPTVBMRVRJT04ocnhycGNfa3J4c2VjZF9kZWFkKTsKLXN0YXRpYyB2b2xhdGlsZSBpbnQgcnhycGNfa3J4c2VjZF9kaWU7Ci0KLXN0YXRpYyBhdG9taWNfdCByeHJwY19rcnhzZWNkX3Fjb3VudDsKLQotLyogcXVldWUgb2YgdW5wcm9jZXNzZWQgaW5ib3VuZCBtZXNzYWdlcyB3aXRoIHNlcW5vICMxIGFuZAotICogUlhSUENfQ0xJRU5UX0lOSVRJQVRFRCBmbGFnIHNldCAqLwotc3RhdGljIExJU1RfSEVBRChyeHJwY19rcnhzZWNkX2luaXRtc2dxKTsKLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0socnhycGNfa3J4c2VjZF9pbml0bXNncV9sb2NrKTsKLQotc3RhdGljIHZvaWQgcnhycGNfa3J4c2VjZF9wcm9jZXNzX2luY29taW5nX2NhbGwoc3RydWN0IHJ4cnBjX21lc3NhZ2UgKm1zZyk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBSeCBzZWN1cml0eSBkYWVtb24KLSAqLwotc3RhdGljIGludCByeHJwY19rcnhzZWNkKHZvaWQgKmFyZykKLXsKLQlERUNMQVJFX1dBSVRRVUVVRShrcnhzZWNkLCBjdXJyZW50KTsKLQotCWludCBkaWU7Ci0KLQlwcmludGsoIlN0YXJ0ZWQga3J4c2VjZCAlZFxuIiwgY3VycmVudC0+cGlkKTsKLQotCWRhZW1vbml6ZSgia3J4c2VjZCIpOwotCi0JLyogbG9vcCBhcm91bmQgd2FpdGluZyBmb3Igd29yayB0byBkbyAqLwotCWRvIHsKLQkJLyogd2FpdCBmb3Igd29yayBvciB0byBiZSB0b2xkIHRvIGV4aXQgKi8KLQkJX2RlYnVnKCIjIyMgQmVnaW4gV2FpdCIpOwotCQlpZiAoIWF0b21pY19yZWFkKCZyeHJwY19rcnhzZWNkX3Fjb3VudCkpIHsKLQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0KLQkJCWFkZF93YWl0X3F1ZXVlKCZyeHJwY19rcnhzZWNkX3NsZWVwcSwgJmtyeHNlY2QpOwotCi0JCQlmb3IgKDs7KSB7Ci0JCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJCQlpZiAoYXRvbWljX3JlYWQoJnJ4cnBjX2tyeHNlY2RfcWNvdW50KSB8fAotCQkJCSAgICByeHJwY19rcnhzZWNkX2RpZSB8fAotCQkJCSAgICBzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKLQkJCQkJYnJlYWs7Ci0KLQkJCQlzY2hlZHVsZSgpOwotCQkJfQotCi0JCQlyZW1vdmVfd2FpdF9xdWV1ZSgmcnhycGNfa3J4c2VjZF9zbGVlcHEsICZrcnhzZWNkKTsKLQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7Ci0JCX0KLQkJZGllID0gcnhycGNfa3J4c2VjZF9kaWU7Ci0JCV9kZWJ1ZygiIyMjIEVuZCBXYWl0Iik7Ci0KLQkJLyogc2VlIGlmIHRoZXJlJ3JlIGluY29taW5nIGNhbGxzIGluIG5lZWQgb2YgYXV0aGVudGljYXRpbmcgKi8KLQkJX2RlYnVnKCIjIyMgQmVnaW4gSW5ib3VuZCBDYWxscyIpOwotCi0JCWlmICghbGlzdF9lbXB0eSgmcnhycGNfa3J4c2VjZF9pbml0bXNncSkpIHsKLQkJCXN0cnVjdCByeHJwY19tZXNzYWdlICptc2cgPSBOVUxMOwotCi0JCQlzcGluX2xvY2soJnJ4cnBjX2tyeHNlY2RfaW5pdG1zZ3FfbG9jayk7Ci0KLQkJCWlmICghbGlzdF9lbXB0eSgmcnhycGNfa3J4c2VjZF9pbml0bXNncSkpIHsKLQkJCQltc2cgPSBsaXN0X2VudHJ5KHJ4cnBjX2tyeHNlY2RfaW5pdG1zZ3EubmV4dCwKLQkJCQkJCSBzdHJ1Y3QgcnhycGNfbWVzc2FnZSwgbGluayk7Ci0JCQkJbGlzdF9kZWxfaW5pdCgmbXNnLT5saW5rKTsKLQkJCQlhdG9taWNfZGVjKCZyeHJwY19rcnhzZWNkX3Fjb3VudCk7Ci0JCQl9Ci0KLQkJCXNwaW5fdW5sb2NrKCZyeHJwY19rcnhzZWNkX2luaXRtc2dxX2xvY2spOwotCi0JCQlpZiAobXNnKSB7Ci0JCQkJcnhycGNfa3J4c2VjZF9wcm9jZXNzX2luY29taW5nX2NhbGwobXNnKTsKLQkJCQlyeHJwY19wdXRfbWVzc2FnZShtc2cpOwotCQkJfQotCQl9Ci0KLQkJX2RlYnVnKCIjIyMgRW5kIEluYm91bmQgQ2FsbHMiKTsKLQotCQl0cnlfdG9fZnJlZXplKCk7Ci0KLQkJLyogZGlzY2FyZCBwZW5kaW5nIHNpZ25hbHMgKi8KLQkJcnhycGNfZGlzY2FyZF9teV9zaWduYWxzKCk7Ci0KLQl9IHdoaWxlICghZGllKTsKLQotCS8qIGFuZCB0aGF0J3MgYWxsICovCi0JY29tcGxldGVfYW5kX2V4aXQoJnJ4cnBjX2tyeHNlY2RfZGVhZCwgMCk7Ci0KLX0gLyogZW5kIHJ4cnBjX2tyeHNlY2QoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogc3RhcnQgdXAgYSBrcnhzZWNkIGRhZW1vbgotICovCi1pbnQgX19pbml0IHJ4cnBjX2tyeHNlY2RfaW5pdCh2b2lkKQotewotCXJldHVybiBrZXJuZWxfdGhyZWFkKHJ4cnBjX2tyeHNlY2QsIE5VTEwsIDApOwotCi19IC8qIGVuZCByeHJwY19rcnhzZWNkX2luaXQoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICoga2lsbCB0aGUga3J4c2VjZCBkYWVtb24gYW5kIHdhaXQgZm9yIGl0IHRvIGNvbXBsZXRlCi0gKi8KLXZvaWQgcnhycGNfa3J4c2VjZF9raWxsKHZvaWQpCi17Ci0JcnhycGNfa3J4c2VjZF9kaWUgPSAxOwotCXdha2VfdXBfYWxsKCZyeHJwY19rcnhzZWNkX3NsZWVwcSk7Ci0Jd2FpdF9mb3JfY29tcGxldGlvbigmcnhycGNfa3J4c2VjZF9kZWFkKTsKLQotfSAvKiBlbmQgcnhycGNfa3J4c2VjZF9raWxsKCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIGNsZWFyIGFsbCBwZW5kaW5nIGluY29taW5nIGNhbGxzIGZvciB0aGUgc3BlY2lmaWVkIHRyYW5zcG9ydAotICovCi12b2lkIHJ4cnBjX2tyeHNlY2RfY2xlYXJfdHJhbnNwb3J0KHN0cnVjdCByeHJwY190cmFuc3BvcnQgKnRyYW5zKQotewotCUxJU1RfSEVBRCh0bXApOwotCi0Jc3RydWN0IHJ4cnBjX21lc3NhZ2UgKm1zZzsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpfcCwgKl9uOwotCi0JX2VudGVyKCIlcCIsdHJhbnMpOwotCi0JLyogbW92ZSBhbGwgdGhlIG1lc3NhZ2VzIGZvciB0aGlzIHRyYW5zcG9ydCBvbnRvIGEgdGVtcCBsaXN0ICovCi0Jc3Bpbl9sb2NrKCZyeHJwY19rcnhzZWNkX2luaXRtc2dxX2xvY2spOwotCi0JbGlzdF9mb3JfZWFjaF9zYWZlKF9wLCBfbiwgJnJ4cnBjX2tyeHNlY2RfaW5pdG1zZ3EpIHsKLQkJbXNnID0gbGlzdF9lbnRyeShfcCwgc3RydWN0IHJ4cnBjX21lc3NhZ2UsIGxpbmspOwotCQlpZiAobXNnLT50cmFucyA9PSB0cmFucykgewotCQkJbGlzdF9tb3ZlX3RhaWwoJm1zZy0+bGluaywgJnRtcCk7Ci0JCQlhdG9taWNfZGVjKCZyeHJwY19rcnhzZWNkX3Fjb3VudCk7Ci0JCX0KLQl9Ci0KLQlzcGluX3VubG9jaygmcnhycGNfa3J4c2VjZF9pbml0bXNncV9sb2NrKTsKLQotCS8qIHphcCBhbGwgbWVzc2FnZXMgb24gdGhlIHRlbXAgbGlzdCAqLwotCXdoaWxlICghbGlzdF9lbXB0eSgmdG1wKSkgewotCQltc2cgPSBsaXN0X2VudHJ5KHRtcC5uZXh0LCBzdHJ1Y3QgcnhycGNfbWVzc2FnZSwgbGluayk7Ci0JCWxpc3RfZGVsX2luaXQoJm1zZy0+bGluayk7Ci0JCXJ4cnBjX3B1dF9tZXNzYWdlKG1zZyk7Ci0JfQotCi0JX2xlYXZlKCIiKTsKLX0gLyogZW5kIHJ4cnBjX2tyeHNlY2RfY2xlYXJfdHJhbnNwb3J0KCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIHF1ZXVlIGEgbWVzc2FnZSBvbiB0aGUgaW5jb21pbmcgY2FsbHMgbGlzdAotICovCi12b2lkIHJ4cnBjX2tyeHNlY2RfcXVldWVfaW5jb21pbmdfY2FsbChzdHJ1Y3QgcnhycGNfbWVzc2FnZSAqbXNnKQotewotCV9lbnRlcigiJXAiLCBtc2cpOwotCi0JLyogcXVldWUgZm9yIHByb2Nlc3NpbmcgYnkga3J4c2VjZCAqLwotCXNwaW5fbG9jaygmcnhycGNfa3J4c2VjZF9pbml0bXNncV9sb2NrKTsKLQotCWlmICghcnhycGNfa3J4c2VjZF9kaWUpIHsKLQkJcnhycGNfZ2V0X21lc3NhZ2UobXNnKTsKLQkJbGlzdF9hZGRfdGFpbCgmbXNnLT5saW5rLCAmcnhycGNfa3J4c2VjZF9pbml0bXNncSk7Ci0JCWF0b21pY19pbmMoJnJ4cnBjX2tyeHNlY2RfcWNvdW50KTsKLQl9Ci0KLQlzcGluX3VubG9jaygmcnhycGNfa3J4c2VjZF9pbml0bXNncV9sb2NrKTsKLQotCXdha2VfdXAoJnJ4cnBjX2tyeHNlY2Rfc2xlZXBxKTsKLQotCV9sZWF2ZSgiIik7Ci19IC8qIGVuZCByeHJwY19rcnhzZWNkX3F1ZXVlX2luY29taW5nX2NhbGwoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogcHJvY2VzcyB0aGUgaW5pdGlhbCBtZXNzYWdlIG9mIGFuIGluY29taW5nIGNhbGwKLSAqLwotdm9pZCByeHJwY19rcnhzZWNkX3Byb2Nlc3NfaW5jb21pbmdfY2FsbChzdHJ1Y3QgcnhycGNfbWVzc2FnZSAqbXNnKQotewotCXN0cnVjdCByeHJwY190cmFuc3BvcnQgKnRyYW5zID0gbXNnLT50cmFuczsKLQlzdHJ1Y3QgcnhycGNfc2VydmljZSAqc3J2OwotCXN0cnVjdCByeHJwY19jYWxsICpjYWxsOwotCXN0cnVjdCBsaXN0X2hlYWQgKl9wOwotCXVuc2lnbmVkIHNob3J0IHNpZDsKLQlpbnQgcmV0OwotCi0JX2VudGVyKCIlcHt0cj0lcH0iLCBtc2csIHRyYW5zKTsKLQotCXJldCA9IHJ4cnBjX2luY29taW5nX2NhbGwobXNnLT5jb25uLCBtc2csICZjYWxsKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBvdXQ7Ci0KLQkvKiBmaW5kIHRoZSBtYXRjaGluZyBzZXJ2aWNlIG9uIHRoZSB0cmFuc3BvcnQgKi8KLQlzaWQgPSBudG9ocyhtc2ctPmhkci5zZXJ2aWNlSWQpOwotCXNydiA9IE5VTEw7Ci0KLQlzcGluX2xvY2soJnRyYW5zLT5sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoKF9wLCAmdHJhbnMtPnNlcnZpY2VzKSB7Ci0JCXNydiA9IGxpc3RfZW50cnkoX3AsIHN0cnVjdCByeHJwY19zZXJ2aWNlLCBsaW5rKTsKLQkJaWYgKHNydi0+c2VydmljZV9pZCA9PSBzaWQgJiYgdHJ5X21vZHVsZV9nZXQoc3J2LT5vd25lcikpIHsKLQkJCS8qIGZvdW5kIGEgbWF0Y2ggKG1hZGUgc3VyZSBpdCB3b24ndCB2YW5pc2gpICovCi0JCQlfZGVidWcoImZvdW5kIHNlcnZpY2UgJyVzJyIsIHNydi0+bmFtZSk7Ci0JCQljYWxsLT5vd25lciA9IHNydi0+b3duZXI7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlzcGluX3VubG9jaygmdHJhbnMtPmxvY2spOwotCi0JLyogcmVwb3J0IHRoZSBuZXcgY29ubmVjdGlvbgotCSAqIC0gdGhlIGZ1bmMgbXVzdCBpbmMgdGhlIGNhbGwncyB1c2FnZSBjb3VudCB0byBrZWVwIGl0Ci0JICovCi0JcmV0ID0gLUVOT0VOVDsKLQlpZiAoX3AgIT0gJnRyYW5zLT5zZXJ2aWNlcykgewotCQkvKiBhdHRlbXB0IHRvIGFjY2VwdCB0aGUgY2FsbCAqLwotCQljYWxsLT5jb25uLT5zZXJ2aWNlID0gc3J2OwotCQljYWxsLT5hcHBfYXR0bl9mdW5jID0gc3J2LT5hdHRuX2Z1bmM7Ci0JCWNhbGwtPmFwcF9lcnJvcl9mdW5jID0gc3J2LT5lcnJvcl9mdW5jOwotCQljYWxsLT5hcHBfYWVtYXBfZnVuYyA9IHNydi0+YWVtYXBfZnVuYzsKLQotCQlyZXQgPSBzcnYtPm5ld19jYWxsKGNhbGwpOwotCi0JCS8qIHNlbmQgYW4gYWJvcnQgaWYgYW4gZXJyb3Igb2NjdXJyZWQgKi8KLQkJaWYgKHJldCA8IDApIHsKLQkJCXJ4cnBjX2NhbGxfYWJvcnQoY2FsbCwgcmV0KTsKLQkJfQotCQllbHNlIHsKLQkJCS8qIGZvcm1hbGx5IHJlY2VpdmUgYW5kIEFDSyB0aGUgbmV3IHBhY2tldCAqLwotCQkJcmV0ID0gcnhycGNfY29ubl9yZWNlaXZlX2NhbGxfcGFja2V0KGNhbGwtPmNvbm4sCi0JCQkJCQkJICAgICBjYWxsLCBtc2cpOwotCQl9Ci0JfQotCi0JcnhycGNfcHV0X2NhbGwoY2FsbCk7Ci0gb3V0OgotCWlmIChyZXQgPCAwKQotCQlyeHJwY190cmFuc19pbW1lZGlhdGVfYWJvcnQodHJhbnMsIG1zZywgcmV0KTsKLQotCV9sZWF2ZSgiICglZCkiLCByZXQpOwotfSAvKiBlbmQgcnhycGNfa3J4c2VjZF9wcm9jZXNzX2luY29taW5nX2NhbGwoKSAqLwpkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL2tyeHRpbW9kLmMgYi9uZXQvcnhycGMva3J4dGltb2QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE5YjYxMy4uMDAwMDAwMAotLS0gYS9uZXQvcnhycGMva3J4dGltb2QuYworKysgL2Rldi9udWxsCkBAIC0xLDIwNCArMCwwIEBACi0vKiBrcnh0aW1vZC5jOiBSWFJQQyB0aW1lb3V0IGRhZW1vbgotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMiBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgotI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KLSNpbmNsdWRlIDxyeHJwYy9yeHJwYy5oPgotI2luY2x1ZGUgPHJ4cnBjL2tyeHRpbW9kLmg+Ci0jaW5jbHVkZSA8YXNtL2Vycm5vLmg+Ci0jaW5jbHVkZSAiaW50ZXJuYWwuaCIKLQotc3RhdGljIERFQ0xBUkVfQ09NUExFVElPTihrcnh0aW1vZF9hbGl2ZSk7Ci1zdGF0aWMgREVDTEFSRV9DT01QTEVUSU9OKGtyeHRpbW9kX2RlYWQpOwotc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKGtyeHRpbW9kX3NsZWVwcSk7Ci1zdGF0aWMgaW50IGtyeHRpbW9kX2RpZTsKLQotc3RhdGljIExJU1RfSEVBRChrcnh0aW1vZF9saXN0KTsKLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soa3J4dGltb2RfbG9jayk7Ci0KLXN0YXRpYyBpbnQga3J4dGltb2Qodm9pZCAqYXJnKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIHN0YXJ0IHRoZSB0aW1lb3V0IGRhZW1vbgotICovCi1pbnQgcnhycGNfa3J4dGltb2Rfc3RhcnQodm9pZCkKLXsKLQlpbnQgcmV0OwotCi0JcmV0ID0ga2VybmVsX3RocmVhZChrcnh0aW1vZCwgTlVMTCwgMCk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZrcnh0aW1vZF9hbGl2ZSk7Ci0KLQlyZXR1cm4gcmV0OwotfSAvKiBlbmQgcnhycGNfa3J4dGltb2Rfc3RhcnQoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogc3RvcCB0aGUgdGltZW91dCBkYWVtb24KLSAqLwotdm9pZCByeHJwY19rcnh0aW1vZF9raWxsKHZvaWQpCi17Ci0JLyogZ2V0IHJpZCBvZiBteSBkYWVtb24gKi8KLQlrcnh0aW1vZF9kaWUgPSAxOwotCXdha2VfdXAoJmtyeHRpbW9kX3NsZWVwcSk7Ci0Jd2FpdF9mb3JfY29tcGxldGlvbigma3J4dGltb2RfZGVhZCk7Ci0KLX0gLyogZW5kIHJ4cnBjX2tyeHRpbW9kX2tpbGwoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogdGltZW91dCBwcm9jZXNzaW5nIGRhZW1vbgotICovCi1zdGF0aWMgaW50IGtyeHRpbW9kKHZvaWQgKmFyZykKLXsKLQlERUNMQVJFX1dBSVRRVUVVRShteXNlbGYsIGN1cnJlbnQpOwotCi0JcnhycGNfdGltZXJfdCAqdGltZXI7Ci0KLQlwcmludGsoIlN0YXJ0ZWQga3J4dGltb2QgJWRcbiIsIGN1cnJlbnQtPnBpZCk7Ci0KLQlkYWVtb25pemUoImtyeHRpbW9kIik7Ci0KLQljb21wbGV0ZSgma3J4dGltb2RfYWxpdmUpOwotCi0JLyogbG9vcCBhcm91bmQgbG9va2luZyBmb3IgdGhpbmdzIHRvIGF0dGVuZCB0byAqLwotIGxvb3A6Ci0Jc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQlhZGRfd2FpdF9xdWV1ZSgma3J4dGltb2Rfc2xlZXBxLCAmbXlzZWxmKTsKLQotCWZvciAoOzspIHsKLQkJdW5zaWduZWQgbG9uZyBqaWY7Ci0JCWxvbmcgdGltZW91dDsKLQotCQkvKiBkZWFsIHdpdGggdGhlIHNlcnZlciBiZWluZyBhc2tlZCB0byBkaWUgKi8KLQkJaWYgKGtyeHRpbW9kX2RpZSkgewotCQkJcmVtb3ZlX3dhaXRfcXVldWUoJmtyeHRpbW9kX3NsZWVwcSwgJm15c2VsZik7Ci0JCQlfbGVhdmUoIiIpOwotCQkJY29tcGxldGVfYW5kX2V4aXQoJmtyeHRpbW9kX2RlYWQsIDApOwotCQl9Ci0KLQkJdHJ5X3RvX2ZyZWV6ZSgpOwotCi0JCS8qIGRpc2NhcmQgcGVuZGluZyBzaWduYWxzICovCi0JCXJ4cnBjX2Rpc2NhcmRfbXlfc2lnbmFscygpOwotCi0JCS8qIHdvcmsgb3V0IHRoZSB0aW1lIHRvIGVsYXBzZSBiZWZvcmUgdGhlIG5leHQgZXZlbnQgKi8KLQkJc3Bpbl9sb2NrKCZrcnh0aW1vZF9sb2NrKTsKLQkJaWYgKGxpc3RfZW1wdHkoJmtyeHRpbW9kX2xpc3QpKSB7Ci0JCQl0aW1lb3V0ID0gTUFYX1NDSEVEVUxFX1RJTUVPVVQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aW1lciA9IGxpc3RfZW50cnkoa3J4dGltb2RfbGlzdC5uZXh0LAotCQkJCQkgICByeHJwY190aW1lcl90LCBsaW5rKTsKLQkJCXRpbWVvdXQgPSB0aW1lci0+dGltb19qaWY7Ci0JCQlqaWYgPSBqaWZmaWVzOwotCi0JCQlpZiAodGltZV9iZWZvcmVfZXEoKHVuc2lnbmVkIGxvbmcpIHRpbWVvdXQsIGppZikpCi0JCQkJZ290byBpbW1lZGlhdGU7Ci0KLQkJCWVsc2UgewotCQkJCXRpbWVvdXQgPSAobG9uZykgdGltZW91dCAtIChsb25nKSBqaWZmaWVzOwotCQkJfQotCQl9Ci0JCXNwaW5fdW5sb2NrKCZrcnh0aW1vZF9sb2NrKTsKLQotCQlzY2hlZHVsZV90aW1lb3V0KHRpbWVvdXQpOwotCi0JCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JfQotCi0JLyogdGhlIHRoaW5nIG9uIHRoZSBmcm9udCBvZiB0aGUgcXVldWUgbmVlZHMgcHJvY2Vzc2luZwotCSAqIC0gd2UgY29tZSBoZXJlIHdpdGggdGhlIGxvY2sgaGVsZCBhbmQgdGltZXIgcG9pbnRpbmcgdG8gdGhlIGV4cGlyZWQKLQkgKiAgIGVudHJ5Ci0JICovCi0gaW1tZWRpYXRlOgotCXJlbW92ZV93YWl0X3F1ZXVlKCZrcnh0aW1vZF9zbGVlcHEsICZteXNlbGYpOwotCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7Ci0KLQlfZGVidWcoIkBAQCBCZWdpbiBUaW1lb3V0IG9mICVwIiwgdGltZXIpOwotCi0JLyogZGVxdWV1ZSB0aGUgdGltZXIgKi8KLQlsaXN0X2RlbF9pbml0KCZ0aW1lci0+bGluayk7Ci0Jc3Bpbl91bmxvY2soJmtyeHRpbW9kX2xvY2spOwotCi0JLyogY2FsbCB0aGUgdGltZW91dCBmdW5jdGlvbiAqLwotCXRpbWVyLT5vcHMtPnRpbWVkX291dCh0aW1lcik7Ci0KLQlfZGVidWcoIkBAQCBFbmQgVGltZW91dCIpOwotCWdvdG8gbG9vcDsKLQotfSAvKiBlbmQga3J4dGltb2QoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogKHJlLSlxdWV1ZSBhIHRpbWVyCi0gKi8KLXZvaWQgcnhycGNfa3J4dGltb2RfYWRkX3RpbWVyKHJ4cnBjX3RpbWVyX3QgKnRpbWVyLCB1bnNpZ25lZCBsb25nIHRpbWVvdXQpCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCAqX3A7Ci0JcnhycGNfdGltZXJfdCAqcHRpbWVyOwotCi0JX2VudGVyKCIlcCwlbHUiLCB0aW1lciwgdGltZW91dCk7Ci0KLQlzcGluX2xvY2soJmtyeHRpbW9kX2xvY2spOwotCi0JbGlzdF9kZWwoJnRpbWVyLT5saW5rKTsKLQotCS8qIHRoZSB0aW1lciB3YXMgZGVmZXJyZWQgb3IgcmVzZXQgLSBwdXQgaXQgYmFjayBpbiB0aGUgcXVldWUgYXQgdGhlCi0JICogcmlnaHQgcGxhY2UgKi8KLQl0aW1lci0+dGltb19qaWYgPSBqaWZmaWVzICsgdGltZW91dDsKLQotCWxpc3RfZm9yX2VhY2goX3AsICZrcnh0aW1vZF9saXN0KSB7Ci0JCXB0aW1lciA9IGxpc3RfZW50cnkoX3AsIHJ4cnBjX3RpbWVyX3QsIGxpbmspOwotCQlpZiAodGltZV9iZWZvcmUodGltZXItPnRpbW9famlmLCBwdGltZXItPnRpbW9famlmKSkKLQkJCWJyZWFrOwotCX0KLQotCWxpc3RfYWRkX3RhaWwoJnRpbWVyLT5saW5rLCBfcCk7IC8qIGluc2VydCBiZWZvcmUgc3RvcHBpbmcgcG9pbnQgKi8KLQotCXNwaW5fdW5sb2NrKCZrcnh0aW1vZF9sb2NrKTsKLQotCXdha2VfdXAoJmtyeHRpbW9kX3NsZWVwcSk7Ci0KLQlfbGVhdmUoIiIpOwotfSAvKiBlbmQgcnhycGNfa3J4dGltb2RfYWRkX3RpbWVyKCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIGRlcXVldWUgYSB0aW1lcgotICogLSByZXR1cm5zIDAgaWYgdGhlIHRpbWVyIHdhcyBkZWxldGVkIG9yIC1FTk9FTlQgaWYgaXQgd2Fzbid0IHF1ZXVlZAotICovCi1pbnQgcnhycGNfa3J4dGltb2RfZGVsX3RpbWVyKHJ4cnBjX3RpbWVyX3QgKnRpbWVyKQotewotCWludCByZXQgPSAwOwotCi0JX2VudGVyKCIlcCIsIHRpbWVyKTsKLQotCXNwaW5fbG9jaygma3J4dGltb2RfbG9jayk7Ci0KLQlpZiAobGlzdF9lbXB0eSgmdGltZXItPmxpbmspKQotCQlyZXQgPSAtRU5PRU5UOwotCWVsc2UKLQkJbGlzdF9kZWxfaW5pdCgmdGltZXItPmxpbmspOwotCi0Jc3Bpbl91bmxvY2soJmtyeHRpbW9kX2xvY2spOwotCi0Jd2FrZV91cCgma3J4dGltb2Rfc2xlZXBxKTsKLQotCV9sZWF2ZSgiID0gJWQiLCByZXQpOwotCXJldHVybiByZXQ7Ci19IC8qIGVuZCByeHJwY19rcnh0aW1vZF9kZWxfdGltZXIoKSAqLwpkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL21haW4uYyBiL25ldC9yeHJwYy9tYWluLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhZWMxZjcuLjAwMDAwMDAKLS0tIGEvbmV0L3J4cnBjL21haW4uYworKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi0vKiBtYWluLmM6IFJ4IFJQQyBpbnRlcmZhY2UKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPHJ4cnBjL3J4cnBjLmg+Ci0jaW5jbHVkZSA8cnhycGMva3J4aW9kLmg+Ci0jaW5jbHVkZSA8cnhycGMva3J4c2VjZC5oPgotI2luY2x1ZGUgPHJ4cnBjL2tyeHRpbW9kLmg+Ci0jaW5jbHVkZSA8cnhycGMvdHJhbnNwb3J0Lmg+Ci0jaW5jbHVkZSA8cnhycGMvY29ubmVjdGlvbi5oPgotI2luY2x1ZGUgPHJ4cnBjL2NhbGwuaD4KLSNpbmNsdWRlIDxyeHJwYy9tZXNzYWdlLmg+Ci0jaW5jbHVkZSAiaW50ZXJuYWwuaCIKLQotTU9EVUxFX0RFU0NSSVBUSU9OKCJSeCBSUEMgaW1wbGVtZW50YXRpb24iKTsKLU1PRFVMRV9BVVRIT1IoIlJlZCBIYXQsIEluYy4iKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLQotX19iZTMyIHJ4cnBjX2Vwb2NoOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogaW5pdGlhbGlzZSB0aGUgUnggbW9kdWxlCi0gKi8KLXN0YXRpYyBpbnQgX19pbml0IHJ4cnBjX2luaXRpYWxpc2Uodm9pZCkKLXsKLQlpbnQgcmV0OwotCi0JLyogbXkgZXBvY2ggdmFsdWUgKi8KLQlyeHJwY19lcG9jaCA9IGh0b25sKHh0aW1lLnR2X3NlYyk7Ci0KLQkvKiByZWdpc3RlciB0aGUgL3Byb2MgaW50ZXJmYWNlICovCi0jaWZkZWYgQ09ORklHX1BST0NfRlMKLQlyZXQgPSByeHJwY19wcm9jX2luaXQoKTsKLQlpZiAocmV0PDApCi0JCXJldHVybiByZXQ7Ci0jZW5kaWYKLQotCS8qIHJlZ2lzdGVyIHRoZSBzeXNjdGwgZmlsZXMgKi8KLSNpZmRlZiBDT05GSUdfU1lTQ1RMCi0JcmV0ID0gcnhycGNfc3lzY3RsX2luaXQoKTsKLQlpZiAocmV0PDApCi0JCWdvdG8gZXJyb3JfcHJvYzsKLSNlbmRpZgotCi0JLyogc3RhcnQgdGhlIGtyeHRpbW9kIGRhZW1vbiAqLwotCXJldCA9IHJ4cnBjX2tyeHRpbW9kX3N0YXJ0KCk7Ci0JaWYgKHJldDwwKQotCQlnb3RvIGVycm9yX3N5c2N0bDsKLQotCS8qIHN0YXJ0IHRoZSBrcnhpb2QgZGFlbW9uICovCi0JcmV0ID0gcnhycGNfa3J4aW9kX2luaXQoKTsKLQlpZiAocmV0PDApCi0JCWdvdG8gZXJyb3Jfa3J4dGltb2Q7Ci0KLQkvKiBzdGFydCB0aGUga3J4c2VjZCBkYWVtb24gKi8KLQlyZXQgPSByeHJwY19rcnhzZWNkX2luaXQoKTsKLQlpZiAocmV0PDApCi0JCWdvdG8gZXJyb3Jfa3J4aW9kOwotCi0Ja2RlYnVnKCJcblxuIik7Ci0KLQlyZXR1cm4gMDsKLQotIGVycm9yX2tyeGlvZDoKLQlyeHJwY19rcnhpb2Rfa2lsbCgpOwotIGVycm9yX2tyeHRpbW9kOgotCXJ4cnBjX2tyeHRpbW9kX2tpbGwoKTsKLSBlcnJvcl9zeXNjdGw6Ci0jaWZkZWYgQ09ORklHX1NZU0NUTAotCXJ4cnBjX3N5c2N0bF9jbGVhbnVwKCk7Ci0gZXJyb3JfcHJvYzoKLSNlbmRpZgotI2lmZGVmIENPTkZJR19QUk9DX0ZTCi0JcnhycGNfcHJvY19jbGVhbnVwKCk7Ci0jZW5kaWYKLQlyZXR1cm4gcmV0OwotfSAvKiBlbmQgcnhycGNfaW5pdGlhbGlzZSgpICovCi0KLW1vZHVsZV9pbml0KHJ4cnBjX2luaXRpYWxpc2UpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogY2xlYW4gdXAgdGhlIFJ4IG1vZHVsZQotICovCi1zdGF0aWMgdm9pZCBfX2V4aXQgcnhycGNfY2xlYW51cCh2b2lkKQotewotCWtlbnRlcigiIik7Ci0KLQlfX1JYQUNDVChwcmludGsoIk91dHN0YW5kaW5nIE1lc3NhZ2VzICAgOiAlZFxuIiwKLQkJCWF0b21pY19yZWFkKCZyeHJwY19tZXNzYWdlX2NvdW50KSkpOwotCV9fUlhBQ0NUKHByaW50aygiT3V0c3RhbmRpbmcgQ2FsbHMgICAgICA6ICVkXG4iLAotCQkJYXRvbWljX3JlYWQoJnJ4cnBjX2NhbGxfY291bnQpKSk7Ci0JX19SWEFDQ1QocHJpbnRrKCJPdXRzdGFuZGluZyBDb25uZWN0aW9uczogJWRcbiIsCi0JCQlhdG9taWNfcmVhZCgmcnhycGNfY29ubmVjdGlvbl9jb3VudCkpKTsKLQlfX1JYQUNDVChwcmludGsoIk91dHN0YW5kaW5nIFBlZXJzICAgICAgOiAlZFxuIiwKLQkJCWF0b21pY19yZWFkKCZyeHJwY19wZWVyX2NvdW50KSkpOwotCV9fUlhBQ0NUKHByaW50aygiT3V0c3RhbmRpbmcgVHJhbnNwb3J0cyA6ICVkXG4iLAotCQkJYXRvbWljX3JlYWQoJnJ4cnBjX3RyYW5zcG9ydF9jb3VudCkpKTsKLQotCXJ4cnBjX2tyeHNlY2Rfa2lsbCgpOwotCXJ4cnBjX2tyeGlvZF9raWxsKCk7Ci0JcnhycGNfa3J4dGltb2Rfa2lsbCgpOwotI2lmZGVmIENPTkZJR19TWVNDVEwKLQlyeHJwY19zeXNjdGxfY2xlYW51cCgpOwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX1BST0NfRlMKLQlyeHJwY19wcm9jX2NsZWFudXAoKTsKLSNlbmRpZgotCi0JX19SWEFDQ1QocHJpbnRrKCJPdXRzdGFuZGluZyBNZXNzYWdlcyAgIDogJWRcbiIsCi0JCQlhdG9taWNfcmVhZCgmcnhycGNfbWVzc2FnZV9jb3VudCkpKTsKLQlfX1JYQUNDVChwcmludGsoIk91dHN0YW5kaW5nIENhbGxzICAgICAgOiAlZFxuIiwKLQkJCWF0b21pY19yZWFkKCZyeHJwY19jYWxsX2NvdW50KSkpOwotCV9fUlhBQ0NUKHByaW50aygiT3V0c3RhbmRpbmcgQ29ubmVjdGlvbnM6ICVkXG4iLAotCQkJYXRvbWljX3JlYWQoJnJ4cnBjX2Nvbm5lY3Rpb25fY291bnQpKSk7Ci0JX19SWEFDQ1QocHJpbnRrKCJPdXRzdGFuZGluZyBQZWVycyAgICAgIDogJWRcbiIsCi0JCQlhdG9taWNfcmVhZCgmcnhycGNfcGVlcl9jb3VudCkpKTsKLQlfX1JYQUNDVChwcmludGsoIk91dHN0YW5kaW5nIFRyYW5zcG9ydHMgOiAlZFxuIiwKLQkJCWF0b21pY19yZWFkKCZyeHJwY190cmFuc3BvcnRfY291bnQpKSk7Ci0KLQlrbGVhdmUoIiIpOwotfSAvKiBlbmQgcnhycGNfY2xlYW51cCgpICovCi0KLW1vZHVsZV9leGl0KHJ4cnBjX2NsZWFudXApOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogY2xlYXIgdGhlIGRlYWQgc3BhY2UgYmV0d2VlbiB0YXNrX3N0cnVjdCBhbmQga2VybmVsIHN0YWNrCi0gKiAtIGNhbGxlZCBieSBzdXBwbHlpbmcgLWZpbnN0cnVtZW50LWZ1bmN0aW9ucyB0byBnY2MKLSAqLwotI2lmIDAKLXZvaWQgX19jeWdfcHJvZmlsZV9mdW5jX2VudGVyICh2b2lkICp0aGlzX2ZuLCB2b2lkICpjYWxsX3NpdGUpCi1fX2F0dHJpYnV0ZV9fKChub19pbnN0cnVtZW50X2Z1bmN0aW9uKSk7Ci0KLXZvaWQgX19jeWdfcHJvZmlsZV9mdW5jX2VudGVyICh2b2lkICp0aGlzX2ZuLCB2b2lkICpjYWxsX3NpdGUpCi17Ci0gICAgICAgYXNtIHZvbGF0aWxlKCIgIG1vdmwgICAgJSVlc3AsJSVlZGkgICAgIFxuIgotCQkgICAgIiAgYW5kbCAgICAlMCwlJWVkaSAgICAgICAgXG4iCi0JCSAgICAiICBhZGRsICAgICUxLCUlZWRpICAgICAgICBcbiIKLQkJICAgICIgIG1vdmwgICAgJSVlc3AsJSVlY3ggICAgIFxuIgotCQkgICAgIiAgc3VibCAgICAlJWVkaSwlJWVjeCAgICAgXG4iCi0JCSAgICAiICBzaHJsICAgICQyLCUlZWN4ICAgICAgICBcbiIKLQkJICAgICIgIG1vdmwgICAgJDB4ZWRlZGVkZWQsJSVlYXggICAgIFxuIgotCQkgICAgIiAgcmVwIHN0b3NsICAgICAgICAgICAgICAgXG4iCi0JCSAgICA6Ci0JCSAgICA6ICJpIih+KFRIUkVBRF9TSVpFLTEpKSwgImkiKHNpemVvZihzdHJ1Y3QgdGhyZWFkX2luZm8pKQotCQkgICAgOiAiZWF4IiwgImVjeCIsICJlZGkiLCAibWVtb3J5IiwgImNjIgotCQkgICAgKTsKLX0KLQotdm9pZCBfX2N5Z19wcm9maWxlX2Z1bmNfZXhpdCh2b2lkICp0aGlzX2ZuLCB2b2lkICpjYWxsX3NpdGUpCi1fX2F0dHJpYnV0ZV9fKChub19pbnN0cnVtZW50X2Z1bmN0aW9uKSk7Ci0KLXZvaWQgX19jeWdfcHJvZmlsZV9mdW5jX2V4aXQodm9pZCAqdGhpc19mbiwgdm9pZCAqY2FsbF9zaXRlKQotewotICAgICAgIGFzbSB2b2xhdGlsZSgiICBtb3ZsICAgICUlZXNwLCUlZWRpICAgICBcbiIKLQkJICAgICIgIGFuZGwgICAgJTAsJSVlZGkgICAgICAgIFxuIgotCQkgICAgIiAgYWRkbCAgICAlMSwlJWVkaSAgICAgICAgXG4iCi0JCSAgICAiICBtb3ZsICAgICUlZXNwLCUlZWN4ICAgICBcbiIKLQkJICAgICIgIHN1YmwgICAgJSVlZGksJSVlY3ggICAgIFxuIgotCQkgICAgIiAgc2hybCAgICAkMiwlJWVjeCAgICAgICAgXG4iCi0JCSAgICAiICBtb3ZsICAgICQweGRhZGFkYWRhLCUlZWF4ICAgICBcbiIKLQkJICAgICIgIHJlcCBzdG9zbCAgICAgICAgICAgICAgIFxuIgotCQkgICAgOgotCQkgICAgOiAiaSIofihUSFJFQURfU0laRS0xKSksICJpIihzaXplb2Yoc3RydWN0IHRocmVhZF9pbmZvKSkKLQkJICAgIDogImVheCIsICJlY3giLCAiZWRpIiwgIm1lbW9yeSIsICJjYyIKLQkJICAgICk7Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL25ldC9yeHJwYy9wZWVyLmMgYi9uZXQvcnhycGMvcGVlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTI3NTE1Li4wMDAwMDAwCi0tLSBhL25ldC9yeHJwYy9wZWVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzOTggKzAsMCBAQAotLyogcGVlci5jOiBSeCBSUEMgcGVlciBtYW5hZ2VtZW50Ci0gKgotICogQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxyeHJwYy9yeHJwYy5oPgotI2luY2x1ZGUgPHJ4cnBjL3RyYW5zcG9ydC5oPgotI2luY2x1ZGUgPHJ4cnBjL3BlZXIuaD4KLSNpbmNsdWRlIDxyeHJwYy9jb25uZWN0aW9uLmg+Ci0jaW5jbHVkZSA8cnhycGMvY2FsbC5oPgotI2luY2x1ZGUgPHJ4cnBjL21lc3NhZ2UuaD4KLSNpbmNsdWRlIDxsaW51eC91ZHAuaD4KLSNpbmNsdWRlIDxsaW51eC9pcC5oPgotI2luY2x1ZGUgPG5ldC9zb2NrLmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxhc20vZGl2NjQuaD4KLSNpbmNsdWRlICJpbnRlcm5hbC5oIgotCi1fX1JYQUNDVF9ERUNMKGF0b21pY190IHJ4cnBjX3BlZXJfY291bnQpOwotTElTVF9IRUFEKHJ4cnBjX3BlZXJzKTsKLURFQ0xBUkVfUldTRU0ocnhycGNfcGVlcnNfc2VtKTsKLXVuc2lnbmVkIGxvbmcgcnhycGNfcGVlcl90aW1lb3V0ID0gMTIgKiA2MCAqIDYwOwotCi1zdGF0aWMgdm9pZCByeHJwY19wZWVyX2RvX3RpbWVvdXQoc3RydWN0IHJ4cnBjX3BlZXIgKnBlZXIpOwotCi1zdGF0aWMgdm9pZCBfX3J4cnBjX3BlZXJfdGltZW91dChyeHJwY190aW1lcl90ICp0aW1lcikKLXsKLQlzdHJ1Y3QgcnhycGNfcGVlciAqcGVlciA9Ci0JCWxpc3RfZW50cnkodGltZXIsIHN0cnVjdCByeHJwY19wZWVyLCB0aW1lb3V0KTsKLQotCV9kZWJ1ZygiUnggUEVFUiBUSU1FT1VUIFslcHt1PSVkfV0iLCBwZWVyLCBhdG9taWNfcmVhZCgmcGVlci0+dXNhZ2UpKTsKLQotCXJ4cnBjX3BlZXJfZG9fdGltZW91dChwZWVyKTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCByeHJwY190aW1lcl9vcHMgcnhycGNfcGVlcl90aW1lcl9vcHMgPSB7Ci0JLnRpbWVkX291dAk9IF9fcnhycGNfcGVlcl90aW1lb3V0LAotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIGNyZWF0ZSBhIHBlZXIgcmVjb3JkCi0gKi8KLXN0YXRpYyBpbnQgX19yeHJwY19jcmVhdGVfcGVlcihzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICp0cmFucywgX19iZTMyIGFkZHIsCi0JCQkgICAgICAgc3RydWN0IHJ4cnBjX3BlZXIgKipfcGVlcikKLXsKLQlzdHJ1Y3QgcnhycGNfcGVlciAqcGVlcjsKLQotCV9lbnRlcigiJXAsJTA4eCIsIHRyYW5zLCBudG9obChhZGRyKSk7Ci0KLQkvKiBhbGxvY2F0ZSBhbmQgaW5pdGlhbGlzZSBhIHBlZXIgcmVjb3JkICovCi0JcGVlciA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCByeHJwY19wZWVyKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwZWVyKSB7Ci0JCV9sZWF2ZSgiID0gLUVOT01FTSIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlhdG9taWNfc2V0KCZwZWVyLT51c2FnZSwgMSk7Ci0KLQlJTklUX0xJU1RfSEVBRCgmcGVlci0+bGluayk7Ci0JSU5JVF9MSVNUX0hFQUQoJnBlZXItPnByb2NfbGluayk7Ci0JSU5JVF9MSVNUX0hFQUQoJnBlZXItPmNvbm5faWRsaXN0KTsKLQlJTklUX0xJU1RfSEVBRCgmcGVlci0+Y29ubl9hY3RpdmUpOwotCUlOSVRfTElTVF9IRUFEKCZwZWVyLT5jb25uX2dyYXZleWFyZCk7Ci0Jc3Bpbl9sb2NrX2luaXQoJnBlZXItPmNvbm5fZ3lsb2NrKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwZWVyLT5jb25uX2d5X3dhaXRxKTsKLQlyd2xvY2tfaW5pdCgmcGVlci0+Y29ubl9pZGxvY2spOwotCXJ3bG9ja19pbml0KCZwZWVyLT5jb25uX2xvY2spOwotCWF0b21pY19zZXQoJnBlZXItPmNvbm5fY291bnQsIDApOwotCXNwaW5fbG9ja19pbml0KCZwZWVyLT5sb2NrKTsKLQlyeHJwY190aW1lcl9pbml0KCZwZWVyLT50aW1lb3V0LCAmcnhycGNfcGVlcl90aW1lcl9vcHMpOwotCi0JcGVlci0+YWRkci5zX2FkZHIgPSBhZGRyOwotCi0JcGVlci0+dHJhbnMgPSB0cmFuczsKLQlwZWVyLT5vcHMgPSB0cmFucy0+cGVlcl9vcHM7Ci0KLQlfX1JYQUNDVChhdG9taWNfaW5jKCZyeHJwY19wZWVyX2NvdW50KSk7Ci0JKl9wZWVyID0gcGVlcjsKLQlfbGVhdmUoIiA9IDAgKCVwKSIsIHBlZXIpOwotCi0JcmV0dXJuIDA7Ci19IC8qIGVuZCBfX3J4cnBjX2NyZWF0ZV9wZWVyKCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIGZpbmQgYSBwZWVyIHJlY29yZCBvbiB0aGUgc3BlY2lmaWVkIHRyYW5zcG9ydAotICogLSByZXR1cm5zIChpZiBzdWNjZXNzZnVsKSB3aXRoIHBlZXIgcmVjb3JkIHVzYWdlIGluY3JlbWVudGVkCi0gKiAtIHJlc3VycmVjdHMgaXQgZnJvbSB0aGUgZ3JhdmV5YXJkIGlmIGZvdW5kIHRoZXJlCi0gKi8KLWludCByeHJwY19wZWVyX2xvb2t1cChzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICp0cmFucywgX19iZTMyIGFkZHIsCi0JCSAgICAgIHN0cnVjdCByeHJwY19wZWVyICoqX3BlZXIpCi17Ci0Jc3RydWN0IHJ4cnBjX3BlZXIgKnBlZXIsICpjYW5kaWRhdGUgPSBOVUxMOwotCXN0cnVjdCBsaXN0X2hlYWQgKl9wOwotCWludCByZXQ7Ci0KLQlfZW50ZXIoIiVweyVodX0sJTA4eCIsIHRyYW5zLCB0cmFucy0+cG9ydCwgbnRvaGwoYWRkcikpOwotCi0JLyogW2NvbW1vbiBjYXNlXSBzZWFyY2ggdGhlIHRyYW5zcG9ydCdzIGFjdGl2ZSBsaXN0IGZpcnN0ICovCi0JcmVhZF9sb2NrKCZ0cmFucy0+cGVlcl9sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoKF9wLCAmdHJhbnMtPnBlZXJfYWN0aXZlKSB7Ci0JCXBlZXIgPSBsaXN0X2VudHJ5KF9wLCBzdHJ1Y3QgcnhycGNfcGVlciwgbGluayk7Ci0JCWlmIChwZWVyLT5hZGRyLnNfYWRkciA9PSBhZGRyKQotCQkJZ290byBmb3VuZF9hY3RpdmU7Ci0JfQotCXJlYWRfdW5sb2NrKCZ0cmFucy0+cGVlcl9sb2NrKTsKLQotCS8qIFt1bmNvbW1vbiBjYXNlXSBub3QgYWN0aXZlIC0gY3JlYXRlIGEgY2FuZGlkYXRlIGZvciBhIG5ldyByZWNvcmQgKi8KLQlyZXQgPSBfX3J4cnBjX2NyZWF0ZV9wZWVyKHRyYW5zLCBhZGRyLCAmY2FuZGlkYXRlKTsKLQlpZiAocmV0IDwgMCkgewotCQlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKiBzZWFyY2ggdGhlIGFjdGl2ZSBsaXN0IGFnYWluLCBqdXN0IGluIGNhc2UgaXQgYXBwZWFyZWQgd2hpbHN0IHdlCi0JICogd2VyZSBidXN5ICovCi0Jd3JpdGVfbG9jaygmdHJhbnMtPnBlZXJfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaChfcCwgJnRyYW5zLT5wZWVyX2FjdGl2ZSkgewotCQlwZWVyID0gbGlzdF9lbnRyeShfcCwgc3RydWN0IHJ4cnBjX3BlZXIsIGxpbmspOwotCQlpZiAocGVlci0+YWRkci5zX2FkZHIgPT0gYWRkcikKLQkJCWdvdG8gZm91bmRfYWN0aXZlX3NlY29uZF9jaGFuY2U7Ci0JfQotCi0JLyogc2VhcmNoIHRoZSB0cmFuc3BvcnQncyBncmF2ZXlhcmQgbGlzdCAqLwotCXNwaW5fbG9jaygmdHJhbnMtPnBlZXJfZ3lsb2NrKTsKLQlsaXN0X2Zvcl9lYWNoKF9wLCAmdHJhbnMtPnBlZXJfZ3JhdmV5YXJkKSB7Ci0JCXBlZXIgPSBsaXN0X2VudHJ5KF9wLCBzdHJ1Y3QgcnhycGNfcGVlciwgbGluayk7Ci0JCWlmIChwZWVyLT5hZGRyLnNfYWRkciA9PSBhZGRyKQotCQkJZ290byBmb3VuZF9pbl9ncmF2ZXlhcmQ7Ci0JfQotCXNwaW5fdW5sb2NrKCZ0cmFucy0+cGVlcl9neWxvY2spOwotCi0JLyogd2UgY2FuIG5vdyBhZGQgdGhlIG5ldyBjYW5kaWRhdGUgdG8gdGhlIGxpc3QKLQkgKiAtIHRlbGwgdGhlIGFwcGxpY2F0aW9uIGxheWVyIHRoYXQgdGhpcyBwZWVyIGhhcyBiZWVuIGFkZGVkCi0JICovCi0JcnhycGNfZ2V0X3RyYW5zcG9ydCh0cmFucyk7Ci0JcGVlciA9IGNhbmRpZGF0ZTsKLQljYW5kaWRhdGUgPSBOVUxMOwotCi0JaWYgKHBlZXItPm9wcyAmJiBwZWVyLT5vcHMtPmFkZGluZykgewotCQlyZXQgPSBwZWVyLT5vcHMtPmFkZGluZyhwZWVyKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCXdyaXRlX3VubG9jaygmdHJhbnMtPnBlZXJfbG9jayk7Ci0JCQlfX1JYQUNDVChhdG9taWNfZGVjKCZyeHJwY19wZWVyX2NvdW50KSk7Ci0JCQlrZnJlZShwZWVyKTsKLQkJCXJ4cnBjX3B1dF90cmFuc3BvcnQodHJhbnMpOwotCQkJX2xlYXZlKCIgPSAlZCIsIHJldCk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JfQotCi0JYXRvbWljX2luYygmdHJhbnMtPnBlZXJfY291bnQpOwotCi0gbWFrZV9hY3RpdmU6Ci0JbGlzdF9hZGRfdGFpbCgmcGVlci0+bGluaywgJnRyYW5zLT5wZWVyX2FjdGl2ZSk7Ci0KLSBzdWNjZXNzX3V3ZnJlZToKLQl3cml0ZV91bmxvY2soJnRyYW5zLT5wZWVyX2xvY2spOwotCi0JaWYgKGNhbmRpZGF0ZSkgewotCQlfX1JYQUNDVChhdG9taWNfZGVjKCZyeHJwY19wZWVyX2NvdW50KSk7Ci0JCWtmcmVlKGNhbmRpZGF0ZSk7Ci0JfQotCi0JaWYgKGxpc3RfZW1wdHkoJnBlZXItPnByb2NfbGluaykpIHsKLQkJZG93bl93cml0ZSgmcnhycGNfcGVlcnNfc2VtKTsKLQkJbGlzdF9hZGRfdGFpbCgmcGVlci0+cHJvY19saW5rLCAmcnhycGNfcGVlcnMpOwotCQl1cF93cml0ZSgmcnhycGNfcGVlcnNfc2VtKTsKLQl9Ci0KLSBzdWNjZXNzOgotCSpfcGVlciA9IHBlZXI7Ci0KLQlfbGVhdmUoIiA9IDAgKCVwe3U9JWQgY2M9JWR9KSIsCi0JICAgICAgIHBlZXIsCi0JICAgICAgIGF0b21pY19yZWFkKCZwZWVyLT51c2FnZSksCi0JICAgICAgIGF0b21pY19yZWFkKCZwZWVyLT5jb25uX2NvdW50KSk7Ci0JcmV0dXJuIDA7Ci0KLQkvKiBoYW5kbGUgdGhlIHBlZXIgYmVpbmcgZm91bmQgaW4gdGhlIGFjdGl2ZSBsaXN0IHN0cmFpZ2h0IG9mZiAqLwotIGZvdW5kX2FjdGl2ZToKLQlyeHJwY19nZXRfcGVlcihwZWVyKTsKLQlyZWFkX3VubG9jaygmdHJhbnMtPnBlZXJfbG9jayk7Ci0JZ290byBzdWNjZXNzOwotCi0JLyogaGFuZGxlIHJlc3VycmVjdGluZyBhIHBlZXIgZnJvbSB0aGUgZ3JhdmV5YXJkICovCi0gZm91bmRfaW5fZ3JhdmV5YXJkOgotCXJ4cnBjX2dldF9wZWVyKHBlZXIpOwotCXJ4cnBjX2dldF90cmFuc3BvcnQocGVlci0+dHJhbnMpOwotCXJ4cnBjX2tyeHRpbW9kX2RlbF90aW1lcigmcGVlci0+dGltZW91dCk7Ci0JbGlzdF9kZWxfaW5pdCgmcGVlci0+bGluayk7Ci0Jc3Bpbl91bmxvY2soJnRyYW5zLT5wZWVyX2d5bG9jayk7Ci0JZ290byBtYWtlX2FjdGl2ZTsKLQotCS8qIGhhbmRsZSBmaW5kaW5nIHRoZSBwZWVyIG9uIHRoZSBzZWNvbmQgdGltZSB0aHJvdWdoIHRoZSBhY3RpdmUKLQkgKiBsaXN0ICovCi0gZm91bmRfYWN0aXZlX3NlY29uZF9jaGFuY2U6Ci0JcnhycGNfZ2V0X3BlZXIocGVlcik7Ci0JZ290byBzdWNjZXNzX3V3ZnJlZTsKLQotfSAvKiBlbmQgcnhycGNfcGVlcl9sb29rdXAoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogZmluaXNoIHdpdGggYSBwZWVyIHJlY29yZAotICogLSBpdCBnZXRzIHNlbnQgdG8gdGhlIGdyYXZleWFyZCBmcm9tIHdoZXJlIGl0IGNhbiBiZSByZXN1cnJlY3RlZCBvciB0aW1lZAotICogICBvdXQKLSAqLwotdm9pZCByeHJwY19wdXRfcGVlcihzdHJ1Y3QgcnhycGNfcGVlciAqcGVlcikKLXsKLQlzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICp0cmFucyA9IHBlZXItPnRyYW5zOwotCi0JX2VudGVyKCIlcHtjYz0lZCBhPSUwOHh9IiwKLQkgICAgICAgcGVlciwKLQkgICAgICAgYXRvbWljX3JlYWQoJnBlZXItPmNvbm5fY291bnQpLAotCSAgICAgICBudG9obChwZWVyLT5hZGRyLnNfYWRkcikpOwotCi0JLyogc2FuaXR5IGNoZWNrICovCi0JaWYgKGF0b21pY19yZWFkKCZwZWVyLT51c2FnZSkgPD0gMCkKLQkJQlVHKCk7Ci0KLQl3cml0ZV9sb2NrKCZ0cmFucy0+cGVlcl9sb2NrKTsKLQlzcGluX2xvY2soJnRyYW5zLT5wZWVyX2d5bG9jayk7Ci0JaWYgKGxpa2VseSghYXRvbWljX2RlY19hbmRfdGVzdCgmcGVlci0+dXNhZ2UpKSkgewotCQlzcGluX3VubG9jaygmdHJhbnMtPnBlZXJfZ3lsb2NrKTsKLQkJd3JpdGVfdW5sb2NrKCZ0cmFucy0+cGVlcl9sb2NrKTsKLQkJX2xlYXZlKCIiKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIG1vdmUgdG8gZ3JhdmV5YXJkIHF1ZXVlICovCi0JbGlzdF9kZWwoJnBlZXItPmxpbmspOwotCXdyaXRlX3VubG9jaygmdHJhbnMtPnBlZXJfbG9jayk7Ci0KLQlsaXN0X2FkZF90YWlsKCZwZWVyLT5saW5rLCAmdHJhbnMtPnBlZXJfZ3JhdmV5YXJkKTsKLQotCUJVR19PTighbGlzdF9lbXB0eSgmcGVlci0+Y29ubl9hY3RpdmUpKTsKLQotCXJ4cnBjX2tyeHRpbW9kX2FkZF90aW1lcigmcGVlci0+dGltZW91dCwgcnhycGNfcGVlcl90aW1lb3V0ICogSFopOwotCi0Jc3Bpbl91bmxvY2soJnRyYW5zLT5wZWVyX2d5bG9jayk7Ci0KLQlyeHJwY19wdXRfdHJhbnNwb3J0KHRyYW5zKTsKLQotCV9sZWF2ZSgiIFtraWxsZWRdIik7Ci19IC8qIGVuZCByeHJwY19wdXRfcGVlcigpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBoYW5kbGUgYSBwZWVyIHRpbWluZyBvdXQgaW4gdGhlIGdyYXZleWFyZAotICogLSBjYWxsZWQgZnJvbSBrcnh0aW1vZAotICovCi1zdGF0aWMgdm9pZCByeHJwY19wZWVyX2RvX3RpbWVvdXQoc3RydWN0IHJ4cnBjX3BlZXIgKnBlZXIpCi17Ci0Jc3RydWN0IHJ4cnBjX3RyYW5zcG9ydCAqdHJhbnMgPSBwZWVyLT50cmFuczsKLQotCV9lbnRlcigiJXB7dT0lZCBjYz0lZCBhPSUwOHh9IiwKLQkgICAgICAgcGVlciwKLQkgICAgICAgYXRvbWljX3JlYWQoJnBlZXItPnVzYWdlKSwKLQkgICAgICAgYXRvbWljX3JlYWQoJnBlZXItPmNvbm5fY291bnQpLAotCSAgICAgICBudG9obChwZWVyLT5hZGRyLnNfYWRkcikpOwotCi0JQlVHX09OKGF0b21pY19yZWFkKCZwZWVyLT51c2FnZSkgPCAwKTsKLQotCS8qIHJlbW92ZSBmcm9tIGdyYXZleWFyZCBpZiBzdGlsbCBkZWFkICovCi0Jc3Bpbl9sb2NrKCZ0cmFucy0+cGVlcl9neWxvY2spOwotCWlmIChhdG9taWNfcmVhZCgmcGVlci0+dXNhZ2UpID09IDApCi0JCWxpc3RfZGVsX2luaXQoJnBlZXItPmxpbmspOwotCWVsc2UKLQkJcGVlciA9IE5VTEw7Ci0Jc3Bpbl91bmxvY2soJnRyYW5zLT5wZWVyX2d5bG9jayk7Ci0KLQlpZiAoIXBlZXIpIHsKLQkJX2xlYXZlKCIiKTsKLQkJcmV0dXJuOyAvKiByZXN1cnJlY3RlZCAqLwotCX0KLQotCS8qIGNsZWFyIGFsbCBjb25uZWN0aW9ucyBvbiB0aGlzIHBlZXIgKi8KLQlyeHJwY19jb25uX2NsZWFyYWxsKHBlZXIpOwotCi0JQlVHX09OKCFsaXN0X2VtcHR5KCZwZWVyLT5jb25uX2FjdGl2ZSkpOwotCUJVR19PTighbGlzdF9lbXB0eSgmcGVlci0+Y29ubl9ncmF2ZXlhcmQpKTsKLQotCS8qIGluZm9ybSB0aGUgYXBwbGljYXRpb24gbGF5ZXIgKi8KLQlpZiAocGVlci0+b3BzICYmIHBlZXItPm9wcy0+ZGlzY2FyZGluZykKLQkJcGVlci0+b3BzLT5kaXNjYXJkaW5nKHBlZXIpOwotCi0JaWYgKCFsaXN0X2VtcHR5KCZwZWVyLT5wcm9jX2xpbmspKSB7Ci0JCWRvd25fd3JpdGUoJnJ4cnBjX3BlZXJzX3NlbSk7Ci0JCWxpc3RfZGVsKCZwZWVyLT5wcm9jX2xpbmspOwotCQl1cF93cml0ZSgmcnhycGNfcGVlcnNfc2VtKTsKLQl9Ci0KLQlfX1JYQUNDVChhdG9taWNfZGVjKCZyeHJwY19wZWVyX2NvdW50KSk7Ci0Ja2ZyZWUocGVlcik7Ci0KLQkvKiBpZiB0aGUgZ3JhdmV5YXJkIGlzIG5vdyBlbXB0eSwgd2FrZSB1cCBhbnlvbmUgd2FpdGluZyBmb3IgdGhhdCAqLwotCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZ0cmFucy0+cGVlcl9jb3VudCkpCi0JCXdha2VfdXAoJnRyYW5zLT5wZWVyX2d5X3dhaXRxKTsKLQotCV9sZWF2ZSgiIFtkZXN0cm95ZWRdIik7Ci19IC8qIGVuZCByeHJwY19wZWVyX2RvX3RpbWVvdXQoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogY2xlYXIgYWxsIHBlZXIgcmVjb3JkcyBmcm9tIGEgdHJhbnNwb3J0IGVuZHBvaW50Ci0gKi8KLXZvaWQgcnhycGNfcGVlcl9jbGVhcmFsbChzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICp0cmFucykKLXsKLQlERUNMQVJFX1dBSVRRVUVVRShteXNlbGYsY3VycmVudCk7Ci0KLQlzdHJ1Y3QgcnhycGNfcGVlciAqcGVlcjsKLQlpbnQgZXJyOwotCi0JX2VudGVyKCIlcCIsdHJhbnMpOwotCi0JLyogdGhlcmUgc2hvdWxkbid0IGJlIGFueSBhY3RpdmUgcGVlcnMgcmVtYWluaW5nICovCi0JQlVHX09OKCFsaXN0X2VtcHR5KCZ0cmFucy0+cGVlcl9hY3RpdmUpKTsKLQotCS8qIG1hbnVhbGx5IHRpbWVvdXQgYWxsIHBlZXJzIGluIHRoZSBncmF2ZXlhcmQgKi8KLQlzcGluX2xvY2soJnRyYW5zLT5wZWVyX2d5bG9jayk7Ci0Jd2hpbGUgKCFsaXN0X2VtcHR5KCZ0cmFucy0+cGVlcl9ncmF2ZXlhcmQpKSB7Ci0JCXBlZXIgPSBsaXN0X2VudHJ5KHRyYW5zLT5wZWVyX2dyYXZleWFyZC5uZXh0LAotCQkJCSAgc3RydWN0IHJ4cnBjX3BlZXIsIGxpbmspOwotCQlfZGVidWcoIkNsZWFyaW5nIHBlZXIgJXBcbiIsIHBlZXIpOwotCQllcnIgPSByeHJwY19rcnh0aW1vZF9kZWxfdGltZXIoJnBlZXItPnRpbWVvdXQpOwotCQlzcGluX3VubG9jaygmdHJhbnMtPnBlZXJfZ3lsb2NrKTsKLQotCQlpZiAoZXJyID09IDApCi0JCQlyeHJwY19wZWVyX2RvX3RpbWVvdXQocGVlcik7Ci0KLQkJc3Bpbl9sb2NrKCZ0cmFucy0+cGVlcl9neWxvY2spOwotCX0KLQlzcGluX3VubG9jaygmdHJhbnMtPnBlZXJfZ3lsb2NrKTsKLQotCS8qIHdhaXQgZm9yIHRoZSB0aGUgcGVlciBncmF2ZXlhcmQgdG8gYmUgY29tcGxldGVseSBjbGVhcmVkICovCi0Jc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOwotCWFkZF93YWl0X3F1ZXVlKCZ0cmFucy0+cGVlcl9neV93YWl0cSwgJm15c2VsZik7Ci0KLQl3aGlsZSAoYXRvbWljX3JlYWQoJnRyYW5zLT5wZWVyX2NvdW50KSAhPSAwKSB7Ci0JCXNjaGVkdWxlKCk7Ci0JCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKLQl9Ci0KLQlyZW1vdmVfd2FpdF9xdWV1ZSgmdHJhbnMtPnBlZXJfZ3lfd2FpdHEsICZteXNlbGYpOwotCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7Ci0KLQlfbGVhdmUoIiIpOwotfSAvKiBlbmQgcnhycGNfcGVlcl9jbGVhcmFsbCgpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBjYWxjdWxhdGUgYW5kIGNhY2hlIHRoZSBSb3VuZC1UcmlwLVRpbWUgZm9yIGEgbWVzc2FnZSBhbmQgaXRzIHJlc3BvbnNlCi0gKi8KLXZvaWQgcnhycGNfcGVlcl9jYWxjdWxhdGVfcnR0KHN0cnVjdCByeHJwY19wZWVyICpwZWVyLAotCQkJICAgICAgc3RydWN0IHJ4cnBjX21lc3NhZ2UgKm1zZywKLQkJCSAgICAgIHN0cnVjdCByeHJwY19tZXNzYWdlICpyZXNwKQotewotCXVuc2lnbmVkIGxvbmcgbG9uZyBydHQ7Ci0JaW50IGxvb3A7Ci0KLQlfZW50ZXIoIiVwLCVwLCVwIiwgcGVlciwgbXNnLCByZXNwKTsKLQotCS8qIGNhbGN1bGF0ZSB0aGUgbGF0ZXN0IFJUVCAqLwotCXJ0dCA9IHJlc3AtPnN0YW1wLnR2X3NlYyAtIG1zZy0+c3RhbXAudHZfc2VjOwotCXJ0dCAqPSAxMDAwMDAwVUw7Ci0JcnR0ICs9IHJlc3AtPnN0YW1wLnR2X3VzZWMgLSBtc2ctPnN0YW1wLnR2X3VzZWM7Ci0KLQkvKiBhZGQgdG8gY2FjaGUgKi8KLQlwZWVyLT5ydHRfY2FjaGVbcGVlci0+cnR0X3BvaW50XSA9IHJ0dDsKLQlwZWVyLT5ydHRfcG9pbnQrKzsKLQlwZWVyLT5ydHRfcG9pbnQgJT0gUlhSUENfUlRUX0NBQ0hFX1NJWkU7Ci0KLQlpZiAocGVlci0+cnR0X3VzYWdlIDwgUlhSUENfUlRUX0NBQ0hFX1NJWkUpCi0JCXBlZXItPnJ0dF91c2FnZSsrOwotCi0JLyogcmVjYWxjdWxhdGUgUlRUICovCi0JcnR0ID0gMDsKLQlmb3IgKGxvb3AgPSBwZWVyLT5ydHRfdXNhZ2UgLSAxOyBsb29wID49IDA7IGxvb3AtLSkKLQkJcnR0ICs9IHBlZXItPnJ0dF9jYWNoZVtsb29wXTsKLQotCWRvX2RpdihydHQsIHBlZXItPnJ0dF91c2FnZSk7Ci0JcGVlci0+cnR0ID0gcnR0OwotCi0JX2xlYXZlKCIgUlRUPSVsdS4lbHVtcyIsCi0JICAgICAgIChsb25nKSAocGVlci0+cnR0IC8gMTAwMCksIChsb25nKSAocGVlci0+cnR0ICUgMTAwMCkpOwotCi19IC8qIGVuZCByeHJwY19wZWVyX2NhbGN1bGF0ZV9ydHQoKSAqLwpkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL3Byb2MuYyBiL25ldC9yeHJwYy9wcm9jLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1NTFjODcuLjAwMDAwMDAKLS0tIGEvbmV0L3J4cnBjL3Byb2MuYworKysgL2Rldi9udWxsCkBAIC0xLDYxNyArMCwwIEBACi0vKiBwcm9jLmM6IC9wcm9jIGludGVyZmFjZSBmb3IgUnhSUEMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgotI2luY2x1ZGUgPHJ4cnBjL3J4cnBjLmg+Ci0jaW5jbHVkZSA8cnhycGMvdHJhbnNwb3J0Lmg+Ci0jaW5jbHVkZSA8cnhycGMvcGVlci5oPgotI2luY2x1ZGUgPHJ4cnBjL2Nvbm5lY3Rpb24uaD4KLSNpbmNsdWRlIDxyeHJwYy9jYWxsLmg+Ci0jaW5jbHVkZSA8cnhycGMvbWVzc2FnZS5oPgotI2luY2x1ZGUgImludGVybmFsLmgiCi0KLXN0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NfcnhycGM7Ci0KLXN0YXRpYyBpbnQgcnhycGNfcHJvY190cmFuc3BvcnRzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOwotc3RhdGljIHZvaWQgKnJ4cnBjX3Byb2NfdHJhbnNwb3J0c19zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnAsIGxvZmZfdCAqcG9zKTsKLXN0YXRpYyB2b2lkICpyeHJwY19wcm9jX3RyYW5zcG9ydHNfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnAsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKTsKLXN0YXRpYyB2b2lkIHJ4cnBjX3Byb2NfdHJhbnNwb3J0c19zdG9wKHN0cnVjdCBzZXFfZmlsZSAqcCwgdm9pZCAqdik7Ci1zdGF0aWMgaW50IHJ4cnBjX3Byb2NfdHJhbnNwb3J0c19zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdik7Ci0KLXN0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgcnhycGNfcHJvY190cmFuc3BvcnRzX29wcyA9IHsKLQkuc3RhcnQJPSByeHJwY19wcm9jX3RyYW5zcG9ydHNfc3RhcnQsCi0JLm5leHQJPSByeHJwY19wcm9jX3RyYW5zcG9ydHNfbmV4dCwKLQkuc3RvcAk9IHJ4cnBjX3Byb2NfdHJhbnNwb3J0c19zdG9wLAotCS5zaG93CT0gcnhycGNfcHJvY190cmFuc3BvcnRzX3Nob3csCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByeHJwY19wcm9jX3RyYW5zcG9ydHNfZm9wcyA9IHsKLQkub3BlbgkJPSByeHJwY19wcm9jX3RyYW5zcG9ydHNfb3BlbiwKLQkucmVhZAkJPSBzZXFfcmVhZCwKLQkubGxzZWVrCQk9IHNlcV9sc2VlaywKLQkucmVsZWFzZQk9IHNlcV9yZWxlYXNlLAotfTsKLQotc3RhdGljIGludCByeHJwY19wcm9jX3BlZXJzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOwotc3RhdGljIHZvaWQgKnJ4cnBjX3Byb2NfcGVlcnNfc3RhcnQoc3RydWN0IHNlcV9maWxlICpwLCBsb2ZmX3QgKnBvcyk7Ci1zdGF0aWMgdm9pZCAqcnhycGNfcHJvY19wZWVyc19uZXh0KHN0cnVjdCBzZXFfZmlsZSAqcCwgdm9pZCAqdiwgbG9mZl90ICpwb3MpOwotc3RhdGljIHZvaWQgcnhycGNfcHJvY19wZWVyc19zdG9wKHN0cnVjdCBzZXFfZmlsZSAqcCwgdm9pZCAqdik7Ci1zdGF0aWMgaW50IHJ4cnBjX3Byb2NfcGVlcnNfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpOwotCi1zdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIHJ4cnBjX3Byb2NfcGVlcnNfb3BzID0gewotCS5zdGFydAk9IHJ4cnBjX3Byb2NfcGVlcnNfc3RhcnQsCi0JLm5leHQJPSByeHJwY19wcm9jX3BlZXJzX25leHQsCi0JLnN0b3AJPSByeHJwY19wcm9jX3BlZXJzX3N0b3AsCi0JLnNob3cJPSByeHJwY19wcm9jX3BlZXJzX3Nob3csCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByeHJwY19wcm9jX3BlZXJzX2ZvcHMgPSB7Ci0JLm9wZW4JCT0gcnhycGNfcHJvY19wZWVyc19vcGVuLAotCS5yZWFkCQk9IHNlcV9yZWFkLAotCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAotCS5yZWxlYXNlCT0gc2VxX3JlbGVhc2UsCi19OwotCi1zdGF0aWMgaW50IHJ4cnBjX3Byb2NfY29ubnNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7Ci1zdGF0aWMgdm9pZCAqcnhycGNfcHJvY19jb25uc19zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnAsIGxvZmZfdCAqcG9zKTsKLXN0YXRpYyB2b2lkICpyeHJwY19wcm9jX2Nvbm5zX25leHQoc3RydWN0IHNlcV9maWxlICpwLCB2b2lkICp2LCBsb2ZmX3QgKnBvcyk7Ci1zdGF0aWMgdm9pZCByeHJwY19wcm9jX2Nvbm5zX3N0b3Aoc3RydWN0IHNlcV9maWxlICpwLCB2b2lkICp2KTsKLXN0YXRpYyBpbnQgcnhycGNfcHJvY19jb25uc19zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdik7Ci0KLXN0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgcnhycGNfcHJvY19jb25uc19vcHMgPSB7Ci0JLnN0YXJ0CT0gcnhycGNfcHJvY19jb25uc19zdGFydCwKLQkubmV4dAk9IHJ4cnBjX3Byb2NfY29ubnNfbmV4dCwKLQkuc3RvcAk9IHJ4cnBjX3Byb2NfY29ubnNfc3RvcCwKLQkuc2hvdwk9IHJ4cnBjX3Byb2NfY29ubnNfc2hvdywKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJ4cnBjX3Byb2NfY29ubnNfZm9wcyA9IHsKLQkub3BlbgkJPSByeHJwY19wcm9jX2Nvbm5zX29wZW4sCi0JLnJlYWQJCT0gc2VxX3JlYWQsCi0JLmxsc2VlawkJPSBzZXFfbHNlZWssCi0JLnJlbGVhc2UJPSBzZXFfcmVsZWFzZSwKLX07Ci0KLXN0YXRpYyBpbnQgcnhycGNfcHJvY19jYWxsc19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKLXN0YXRpYyB2b2lkICpyeHJwY19wcm9jX2NhbGxzX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqcCwgbG9mZl90ICpwb3MpOwotc3RhdGljIHZvaWQgKnJ4cnBjX3Byb2NfY2FsbHNfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnAsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKTsKLXN0YXRpYyB2b2lkIHJ4cnBjX3Byb2NfY2FsbHNfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnAsIHZvaWQgKnYpOwotc3RhdGljIGludCByeHJwY19wcm9jX2NhbGxzX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KTsKLQotc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyByeHJwY19wcm9jX2NhbGxzX29wcyA9IHsKLQkuc3RhcnQJPSByeHJwY19wcm9jX2NhbGxzX3N0YXJ0LAotCS5uZXh0CT0gcnhycGNfcHJvY19jYWxsc19uZXh0LAotCS5zdG9wCT0gcnhycGNfcHJvY19jYWxsc19zdG9wLAotCS5zaG93CT0gcnhycGNfcHJvY19jYWxsc19zaG93LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcnhycGNfcHJvY19jYWxsc19mb3BzID0gewotCS5vcGVuCQk9IHJ4cnBjX3Byb2NfY2FsbHNfb3BlbiwKLQkucmVhZAkJPSBzZXFfcmVhZCwKLQkubGxzZWVrCQk9IHNlcV9sc2VlaywKLQkucmVsZWFzZQk9IHNlcV9yZWxlYXNlLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKnJ4cnBjX2NhbGxfc3RhdGVzN1tdID0gewotCSJjb21wbGV0IiwKLQkiZXJyb3IgICIsCi0JInJjdl9vcCAiLAotCSJyY3ZfYXJnIiwKLQkiZ290X2FyZyIsCi0JInNuZF9ycGwiLAotCSJmaW5fYWNrIiwKLQkic25kX2FyZyIsCi0JInJjdl9ycGwiLAotCSJnb3RfcnBsIgotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKnJ4cnBjX2NhbGxfZXJyb3Jfc3RhdGVzN1tdID0gewotCSJub19lcnIgIiwKLQkibG9jX2FidCIsCi0JInJtdF9hYnQiLAotCSJsb2NfZXJyIiwKLQkicm10X2VyciIKLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBpbml0aWFsaXNlIHRoZSAvcHJvYy9uZXQvcnhycGMvIGRpcmVjdG9yeQotICovCi1pbnQgcnhycGNfcHJvY19pbml0KHZvaWQpCi17Ci0Jc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwOwotCi0JcHJvY19yeHJwYyA9IHByb2NfbWtkaXIoInJ4cnBjIiwgcHJvY19uZXQpOwotCWlmICghcHJvY19yeHJwYykKLQkJZ290byBlcnJvcjsKLQlwcm9jX3J4cnBjLT5vd25lciA9IFRISVNfTU9EVUxFOwotCi0JcCA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJjYWxscyIsIDAsIHByb2NfcnhycGMpOwotCWlmICghcCkKLQkJZ290byBlcnJvcl9wcm9jOwotCXAtPnByb2NfZm9wcyA9ICZyeHJwY19wcm9jX2NhbGxzX2ZvcHM7Ci0JcC0+b3duZXIgPSBUSElTX01PRFVMRTsKLQotCXAgPSBjcmVhdGVfcHJvY19lbnRyeSgiY29ubmVjdGlvbnMiLCAwLCBwcm9jX3J4cnBjKTsKLQlpZiAoIXApCi0JCWdvdG8gZXJyb3JfY2FsbHM7Ci0JcC0+cHJvY19mb3BzID0gJnJ4cnBjX3Byb2NfY29ubnNfZm9wczsKLQlwLT5vd25lciA9IFRISVNfTU9EVUxFOwotCi0JcCA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJwZWVycyIsIDAsIHByb2NfcnhycGMpOwotCWlmICghcCkKLQkJZ290byBlcnJvcl9jYWxsczsKLQlwLT5wcm9jX2ZvcHMgPSAmcnhycGNfcHJvY19wZWVyc19mb3BzOwotCXAtPm93bmVyID0gVEhJU19NT0RVTEU7Ci0KLQlwID0gY3JlYXRlX3Byb2NfZW50cnkoInRyYW5zcG9ydHMiLCAwLCBwcm9jX3J4cnBjKTsKLQlpZiAoIXApCi0JCWdvdG8gZXJyb3JfY29ubnM7Ci0JcC0+cHJvY19mb3BzID0gJnJ4cnBjX3Byb2NfdHJhbnNwb3J0c19mb3BzOwotCXAtPm93bmVyID0gVEhJU19NT0RVTEU7Ci0KLQlyZXR1cm4gMDsKLQotIGVycm9yX2Nvbm5zOgotCXJlbW92ZV9wcm9jX2VudHJ5KCJjb25uZWN0aW9ucyIsIHByb2NfcnhycGMpOwotIGVycm9yX2NhbGxzOgotCXJlbW92ZV9wcm9jX2VudHJ5KCJjYWxscyIsIHByb2NfcnhycGMpOwotIGVycm9yX3Byb2M6Ci0JcmVtb3ZlX3Byb2NfZW50cnkoInJ4cnBjIiwgcHJvY19uZXQpOwotIGVycm9yOgotCXJldHVybiAtRU5PTUVNOwotfSAvKiBlbmQgcnhycGNfcHJvY19pbml0KCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIGNsZWFuIHVwIHRoZSAvcHJvYy9uZXQvcnhycGMvIGRpcmVjdG9yeQotICovCi12b2lkIHJ4cnBjX3Byb2NfY2xlYW51cCh2b2lkKQotewotCXJlbW92ZV9wcm9jX2VudHJ5KCJ0cmFuc3BvcnRzIiwgcHJvY19yeHJwYyk7Ci0JcmVtb3ZlX3Byb2NfZW50cnkoInBlZXJzIiwgcHJvY19yeHJwYyk7Ci0JcmVtb3ZlX3Byb2NfZW50cnkoImNvbm5lY3Rpb25zIiwgcHJvY19yeHJwYyk7Ci0JcmVtb3ZlX3Byb2NfZW50cnkoImNhbGxzIiwgcHJvY19yeHJwYyk7Ci0KLQlyZW1vdmVfcHJvY19lbnRyeSgicnhycGMiLCBwcm9jX25ldCk7Ci0KLX0gLyogZW5kIHJ4cnBjX3Byb2NfY2xlYW51cCgpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBvcGVuICIvcHJvYy9uZXQvcnhycGMvdHJhbnNwb3J0cyIgd2hpY2ggcHJvdmlkZXMgYSBzdW1tYXJ5IG9mIGV4dGFudCB0cmFuc3BvcnRzCi0gKi8KLXN0YXRpYyBpbnQgcnhycGNfcHJvY190cmFuc3BvcnRzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IHNlcV9maWxlICptOwotCWludCByZXQ7Ci0KLQlyZXQgPSBzZXFfb3BlbihmaWxlLCAmcnhycGNfcHJvY190cmFuc3BvcnRzX29wcyk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQltID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCW0tPnByaXZhdGUgPSBQREUoaW5vZGUpLT5kYXRhOwotCi0JcmV0dXJuIDA7Ci19IC8qIGVuZCByeHJwY19wcm9jX3RyYW5zcG9ydHNfb3BlbigpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBzZXQgdXAgdGhlIGl0ZXJhdG9yIHRvIHN0YXJ0IHJlYWRpbmcgZnJvbSB0aGUgdHJhbnNwb3J0cyBsaXN0IGFuZCByZXR1cm4gdGhlIGZpcnN0IGl0ZW0KLSAqLwotc3RhdGljIHZvaWQgKnJ4cnBjX3Byb2NfdHJhbnNwb3J0c19zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGxvZmZfdCAqX3BvcykKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpfcDsKLQlsb2ZmX3QgcG9zID0gKl9wb3M7Ci0KLQkvKiBsb2NrIHRoZSBsaXN0IGFnYWluc3QgbW9kaWZpY2F0aW9uICovCi0JZG93bl9yZWFkKCZyeHJwY19wcm9jX3RyYW5zcG9ydHNfc2VtKTsKLQotCS8qIGFsbG93IGZvciB0aGUgaGVhZGVyIGxpbmUgKi8KLQlpZiAoIXBvcykKLQkJcmV0dXJuIFNFUV9TVEFSVF9UT0tFTjsKLQlwb3MtLTsKLQotCS8qIGZpbmQgdGhlIG4ndGggZWxlbWVudCBpbiB0aGUgbGlzdCAqLwotCWxpc3RfZm9yX2VhY2goX3AsICZyeHJwY19wcm9jX3RyYW5zcG9ydHMpCi0JCWlmICghcG9zLS0pCi0JCQlicmVhazsKLQotCXJldHVybiBfcCAhPSAmcnhycGNfcHJvY190cmFuc3BvcnRzID8gX3AgOiBOVUxMOwotfSAvKiBlbmQgcnhycGNfcHJvY190cmFuc3BvcnRzX3N0YXJ0KCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIG1vdmUgdG8gbmV4dCBjYWxsIGluIHRyYW5zcG9ydHMgbGlzdAotICovCi1zdGF0aWMgdm9pZCAqcnhycGNfcHJvY190cmFuc3BvcnRzX25leHQoc3RydWN0IHNlcV9maWxlICpwLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpfcDsKLQotCSgqcG9zKSsrOwotCi0JX3AgPSB2OwotCV9wID0gKHYgPT0gU0VRX1NUQVJUX1RPS0VOKSA/IHJ4cnBjX3Byb2NfdHJhbnNwb3J0cy5uZXh0IDogX3AtPm5leHQ7Ci0KLQlyZXR1cm4gX3AgIT0gJnJ4cnBjX3Byb2NfdHJhbnNwb3J0cyA/IF9wIDogTlVMTDsKLX0gLyogZW5kIHJ4cnBjX3Byb2NfdHJhbnNwb3J0c19uZXh0KCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIGNsZWFuIHVwIGFmdGVyIHJlYWRpbmcgZnJvbSB0aGUgdHJhbnNwb3J0cyBsaXN0Ci0gKi8KLXN0YXRpYyB2b2lkIHJ4cnBjX3Byb2NfdHJhbnNwb3J0c19zdG9wKHN0cnVjdCBzZXFfZmlsZSAqcCwgdm9pZCAqdikKLXsKLQl1cF9yZWFkKCZyeHJwY19wcm9jX3RyYW5zcG9ydHNfc2VtKTsKLQotfSAvKiBlbmQgcnhycGNfcHJvY190cmFuc3BvcnRzX3N0b3AoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogZGlzcGxheSBhIGhlYWRlciBsaW5lIGZvbGxvd2VkIGJ5IGEgbG9hZCBvZiBjYWxsIGxpbmVzCi0gKi8KLXN0YXRpYyBpbnQgcnhycGNfcHJvY190cmFuc3BvcnRzX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQotewotCXN0cnVjdCByeHJwY190cmFuc3BvcnQgKnRyYW5zID0KLQkJbGlzdF9lbnRyeSh2LCBzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0LCBwcm9jX2xpbmspOwotCi0JLyogZGlzcGxheSBoZWFkZXIgb24gbGluZSAxICovCi0JaWYgKHYgPT0gU0VRX1NUQVJUX1RPS0VOKSB7Ci0JCXNlcV9wdXRzKG0sICJMT0NBTCBVU0VcbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKiBkaXNwbGF5IG9uZSB0cmFuc3BvcnQgcGVyIGxpbmUgb24gc3Vic2VxdWVudCBsaW5lcyAqLwotCXNlcV9wcmludGYobSwgIiU1aHUgJTNkXG4iLAotCQkgICB0cmFucy0+cG9ydCwKLQkJICAgYXRvbWljX3JlYWQoJnRyYW5zLT51c2FnZSkKLQkJICAgKTsKLQotCXJldHVybiAwOwotfSAvKiBlbmQgcnhycGNfcHJvY190cmFuc3BvcnRzX3Nob3coKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogb3BlbiAiL3Byb2MvbmV0L3J4cnBjL3BlZXJzIiB3aGljaCBwcm92aWRlcyBhIHN1bW1hcnkgb2YgZXh0YW50IHBlZXJzCi0gKi8KLXN0YXRpYyBpbnQgcnhycGNfcHJvY19wZWVyc19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCBzZXFfZmlsZSAqbTsKLQlpbnQgcmV0OwotCi0JcmV0ID0gc2VxX29wZW4oZmlsZSwgJnJ4cnBjX3Byb2NfcGVlcnNfb3BzKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCW0gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JbS0+cHJpdmF0ZSA9IFBERShpbm9kZSktPmRhdGE7Ci0KLQlyZXR1cm4gMDsKLX0gLyogZW5kIHJ4cnBjX3Byb2NfcGVlcnNfb3BlbigpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBzZXQgdXAgdGhlIGl0ZXJhdG9yIHRvIHN0YXJ0IHJlYWRpbmcgZnJvbSB0aGUgcGVlcnMgbGlzdCBhbmQgcmV0dXJuIHRoZQotICogZmlyc3QgaXRlbQotICovCi1zdGF0aWMgdm9pZCAqcnhycGNfcHJvY19wZWVyc19zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGxvZmZfdCAqX3BvcykKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpfcDsKLQlsb2ZmX3QgcG9zID0gKl9wb3M7Ci0KLQkvKiBsb2NrIHRoZSBsaXN0IGFnYWluc3QgbW9kaWZpY2F0aW9uICovCi0JZG93bl9yZWFkKCZyeHJwY19wZWVyc19zZW0pOwotCi0JLyogYWxsb3cgZm9yIHRoZSBoZWFkZXIgbGluZSAqLwotCWlmICghcG9zKQotCQlyZXR1cm4gU0VRX1NUQVJUX1RPS0VOOwotCXBvcy0tOwotCi0JLyogZmluZCB0aGUgbid0aCBlbGVtZW50IGluIHRoZSBsaXN0ICovCi0JbGlzdF9mb3JfZWFjaChfcCwgJnJ4cnBjX3BlZXJzKQotCQlpZiAoIXBvcy0tKQotCQkJYnJlYWs7Ci0KLQlyZXR1cm4gX3AgIT0gJnJ4cnBjX3BlZXJzID8gX3AgOiBOVUxMOwotfSAvKiBlbmQgcnhycGNfcHJvY19wZWVyc19zdGFydCgpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBtb3ZlIHRvIG5leHQgY29ubiBpbiBwZWVycyBsaXN0Ci0gKi8KLXN0YXRpYyB2b2lkICpyeHJwY19wcm9jX3BlZXJzX25leHQoc3RydWN0IHNlcV9maWxlICpwLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpfcDsKLQotCSgqcG9zKSsrOwotCi0JX3AgPSB2OwotCV9wID0gKHYgPT0gU0VRX1NUQVJUX1RPS0VOKSA/IHJ4cnBjX3BlZXJzLm5leHQgOiBfcC0+bmV4dDsKLQotCXJldHVybiBfcCAhPSAmcnhycGNfcGVlcnMgPyBfcCA6IE5VTEw7Ci19IC8qIGVuZCByeHJwY19wcm9jX3BlZXJzX25leHQoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogY2xlYW4gdXAgYWZ0ZXIgcmVhZGluZyBmcm9tIHRoZSBwZWVycyBsaXN0Ci0gKi8KLXN0YXRpYyB2b2lkIHJ4cnBjX3Byb2NfcGVlcnNfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnAsIHZvaWQgKnYpCi17Ci0JdXBfcmVhZCgmcnhycGNfcGVlcnNfc2VtKTsKLQotfSAvKiBlbmQgcnhycGNfcHJvY19wZWVyc19zdG9wKCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIGRpc3BsYXkgYSBoZWFkZXIgbGluZSBmb2xsb3dlZCBieSBhIGxvYWQgb2YgY29ubiBsaW5lcwotICovCi1zdGF0aWMgaW50IHJ4cnBjX3Byb2NfcGVlcnNfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCi17Ci0Jc3RydWN0IHJ4cnBjX3BlZXIgKnBlZXIgPSBsaXN0X2VudHJ5KHYsIHN0cnVjdCByeHJwY19wZWVyLCBwcm9jX2xpbmspOwotCWxvbmcgdGltZW91dDsKLQotCS8qIGRpc3BsYXkgaGVhZGVyIG9uIGxpbmUgMSAqLwotCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikgewotCQlzZXFfcHV0cyhtLCAiTE9DQUwgUkVNT1RFICAgVVNBR0UgQ09OTlMgIFRJTUVPVVQiCi0JCQkgIiAgIE1UVSBSVFQodVMpXG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyogZGlzcGxheSBvbmUgcGVlciBwZXIgbGluZSBvbiBzdWJzZXF1ZW50IGxpbmVzICovCi0JdGltZW91dCA9IDA7Ci0JaWYgKCFsaXN0X2VtcHR5KCZwZWVyLT50aW1lb3V0LmxpbmspKQotCQl0aW1lb3V0ID0gKGxvbmcpIHBlZXItPnRpbWVvdXQudGltb19qaWYgLQotCQkJKGxvbmcpIGppZmZpZXM7Ci0KLQlzZXFfcHJpbnRmKG0sICIlNWh1ICUwOHggJTVkICU1ZCAlOGxkICU1WnUgJTdsdVxuIiwKLQkJICAgcGVlci0+dHJhbnMtPnBvcnQsCi0JCSAgIG50b2hsKHBlZXItPmFkZHIuc19hZGRyKSwKLQkJICAgYXRvbWljX3JlYWQoJnBlZXItPnVzYWdlKSwKLQkJICAgYXRvbWljX3JlYWQoJnBlZXItPmNvbm5fY291bnQpLAotCQkgICB0aW1lb3V0LAotCQkgICBwZWVyLT5pZl9tdHUsCi0JCSAgIChsb25nKSBwZWVyLT5ydHQKLQkJICAgKTsKLQotCXJldHVybiAwOwotfSAvKiBlbmQgcnhycGNfcHJvY19wZWVyc19zaG93KCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIG9wZW4gIi9wcm9jL25ldC9yeHJwYy9jb25uZWN0aW9ucyIgd2hpY2ggcHJvdmlkZXMgYSBzdW1tYXJ5IG9mIGV4dGFudAotICogY29ubmVjdGlvbnMKLSAqLwotc3RhdGljIGludCByeHJwY19wcm9jX2Nvbm5zX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IHNlcV9maWxlICptOwotCWludCByZXQ7Ci0KLQlyZXQgPSBzZXFfb3BlbihmaWxlLCAmcnhycGNfcHJvY19jb25uc19vcHMpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JbSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQltLT5wcml2YXRlID0gUERFKGlub2RlKS0+ZGF0YTsKLQotCXJldHVybiAwOwotfSAvKiBlbmQgcnhycGNfcHJvY19jb25uc19vcGVuKCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIHNldCB1cCB0aGUgaXRlcmF0b3IgdG8gc3RhcnQgcmVhZGluZyBmcm9tIHRoZSBjb25ucyBsaXN0IGFuZCByZXR1cm4gdGhlCi0gKiBmaXJzdCBpdGVtCi0gKi8KLXN0YXRpYyB2b2lkICpyeHJwY19wcm9jX2Nvbm5zX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqbSwgbG9mZl90ICpfcG9zKQotewotCXN0cnVjdCBsaXN0X2hlYWQgKl9wOwotCWxvZmZfdCBwb3MgPSAqX3BvczsKLQotCS8qIGxvY2sgdGhlIGxpc3QgYWdhaW5zdCBtb2RpZmljYXRpb24gKi8KLQlkb3duX3JlYWQoJnJ4cnBjX2Nvbm5zX3NlbSk7Ci0KLQkvKiBhbGxvdyBmb3IgdGhlIGhlYWRlciBsaW5lICovCi0JaWYgKCFwb3MpCi0JCXJldHVybiBTRVFfU1RBUlRfVE9LRU47Ci0JcG9zLS07Ci0KLQkvKiBmaW5kIHRoZSBuJ3RoIGVsZW1lbnQgaW4gdGhlIGxpc3QgKi8KLQlsaXN0X2Zvcl9lYWNoKF9wLCAmcnhycGNfY29ubnMpCi0JCWlmICghcG9zLS0pCi0JCQlicmVhazsKLQotCXJldHVybiBfcCAhPSAmcnhycGNfY29ubnMgPyBfcCA6IE5VTEw7Ci19IC8qIGVuZCByeHJwY19wcm9jX2Nvbm5zX3N0YXJ0KCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIG1vdmUgdG8gbmV4dCBjb25uIGluIGNvbm5zIGxpc3QKLSAqLwotc3RhdGljIHZvaWQgKnJ4cnBjX3Byb2NfY29ubnNfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnAsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQotewotCXN0cnVjdCBsaXN0X2hlYWQgKl9wOwotCi0JKCpwb3MpKys7Ci0KLQlfcCA9IHY7Ci0JX3AgPSAodiA9PSBTRVFfU1RBUlRfVE9LRU4pID8gcnhycGNfY29ubnMubmV4dCA6IF9wLT5uZXh0OwotCi0JcmV0dXJuIF9wICE9ICZyeHJwY19jb25ucyA/IF9wIDogTlVMTDsKLX0gLyogZW5kIHJ4cnBjX3Byb2NfY29ubnNfbmV4dCgpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBjbGVhbiB1cCBhZnRlciByZWFkaW5nIGZyb20gdGhlIGNvbm5zIGxpc3QKLSAqLwotc3RhdGljIHZvaWQgcnhycGNfcHJvY19jb25uc19zdG9wKHN0cnVjdCBzZXFfZmlsZSAqcCwgdm9pZCAqdikKLXsKLQl1cF9yZWFkKCZyeHJwY19jb25uc19zZW0pOwotCi19IC8qIGVuZCByeHJwY19wcm9jX2Nvbm5zX3N0b3AoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogZGlzcGxheSBhIGhlYWRlciBsaW5lIGZvbGxvd2VkIGJ5IGEgbG9hZCBvZiBjb25uIGxpbmVzCi0gKi8KLXN0YXRpYyBpbnQgcnhycGNfcHJvY19jb25uc19zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKLXsKLQlzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubjsKLQlsb25nIHRpbWVvdXQ7Ci0KLQljb25uID0gbGlzdF9lbnRyeSh2LCBzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiwgcHJvY19saW5rKTsKLQotCS8qIGRpc3BsYXkgaGVhZGVyIG9uIGxpbmUgMSAqLwotCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikgewotCQlzZXFfcHV0cyhtLAotCQkJICJMT0NBTCBSRU1PVEUgICBSUE9SVCBTUlZDIENPTk4gICAgIEVORCBTRVJJQUxOTyAiCi0JCQkgIkNBTExOTyAgICAgTVRVICBUSU1FT1VUIgotCQkJICJcbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKiBkaXNwbGF5IG9uZSBjb25uIHBlciBsaW5lIG9uIHN1YnNlcXVlbnQgbGluZXMgKi8KLQl0aW1lb3V0ID0gMDsKLQlpZiAoIWxpc3RfZW1wdHkoJmNvbm4tPnRpbWVvdXQubGluaykpCi0JCXRpbWVvdXQgPSAobG9uZykgY29ubi0+dGltZW91dC50aW1vX2ppZiAtCi0JCQkobG9uZykgamlmZmllczsKLQotCXNlcV9wcmludGYobSwKLQkJICAgIiU1aHUgJTA4eCAlNWh1ICUwNGh4ICUwOHggJS0zLjNzICUwOHggJTA4eCAlNVp1ICU4bGRcbiIsCi0JCSAgIGNvbm4tPnRyYW5zLT5wb3J0LAotCQkgICBudG9obChjb25uLT5hZGRyLnNpbl9hZGRyLnNfYWRkciksCi0JCSAgIG50b2hzKGNvbm4tPmFkZHIuc2luX3BvcnQpLAotCQkgICBudG9ocyhjb25uLT5zZXJ2aWNlX2lkKSwKLQkJICAgbnRvaGwoY29ubi0+Y29ubl9pZCksCi0JCSAgIGNvbm4tPm91dF9jbGllbnRmbGFnID8gIkNMVCIgOiAiU1JWIiwKLQkJICAgY29ubi0+c2VyaWFsX2NvdW50ZXIsCi0JCSAgIGNvbm4tPmNhbGxfY291bnRlciwKLQkJICAgY29ubi0+bXR1X3NpemUsCi0JCSAgIHRpbWVvdXQKLQkJICAgKTsKLQotCXJldHVybiAwOwotfSAvKiBlbmQgcnhycGNfcHJvY19jb25uc19zaG93KCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIG9wZW4gIi9wcm9jL25ldC9yeHJwYy9jYWxscyIgd2hpY2ggcHJvdmlkZXMgYSBzdW1tYXJ5IG9mIGV4dGFudCBjYWxscwotICovCi1zdGF0aWMgaW50IHJ4cnBjX3Byb2NfY2FsbHNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3Qgc2VxX2ZpbGUgKm07Ci0JaW50IHJldDsKLQotCXJldCA9IHNlcV9vcGVuKGZpbGUsICZyeHJwY19wcm9jX2NhbGxzX29wcyk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQltID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCW0tPnByaXZhdGUgPSBQREUoaW5vZGUpLT5kYXRhOwotCi0JcmV0dXJuIDA7Ci19IC8qIGVuZCByeHJwY19wcm9jX2NhbGxzX29wZW4oKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogc2V0IHVwIHRoZSBpdGVyYXRvciB0byBzdGFydCByZWFkaW5nIGZyb20gdGhlIGNhbGxzIGxpc3QgYW5kIHJldHVybiB0aGUKLSAqIGZpcnN0IGl0ZW0KLSAqLwotc3RhdGljIHZvaWQgKnJ4cnBjX3Byb2NfY2FsbHNfc3RhcnQoc3RydWN0IHNlcV9maWxlICptLCBsb2ZmX3QgKl9wb3MpCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCAqX3A7Ci0JbG9mZl90IHBvcyA9ICpfcG9zOwotCi0JLyogbG9jayB0aGUgbGlzdCBhZ2FpbnN0IG1vZGlmaWNhdGlvbiAqLwotCWRvd25fcmVhZCgmcnhycGNfY2FsbHNfc2VtKTsKLQotCS8qIGFsbG93IGZvciB0aGUgaGVhZGVyIGxpbmUgKi8KLQlpZiAoIXBvcykKLQkJcmV0dXJuIFNFUV9TVEFSVF9UT0tFTjsKLQlwb3MtLTsKLQotCS8qIGZpbmQgdGhlIG4ndGggZWxlbWVudCBpbiB0aGUgbGlzdCAqLwotCWxpc3RfZm9yX2VhY2goX3AsICZyeHJwY19jYWxscykKLQkJaWYgKCFwb3MtLSkKLQkJCWJyZWFrOwotCi0JcmV0dXJuIF9wICE9ICZyeHJwY19jYWxscyA/IF9wIDogTlVMTDsKLX0gLyogZW5kIHJ4cnBjX3Byb2NfY2FsbHNfc3RhcnQoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogbW92ZSB0byBuZXh0IGNhbGwgaW4gY2FsbHMgbGlzdAotICovCi1zdGF0aWMgdm9pZCAqcnhycGNfcHJvY19jYWxsc19uZXh0KHN0cnVjdCBzZXFfZmlsZSAqcCwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCAqX3A7Ci0KLQkoKnBvcykrKzsKLQotCV9wID0gdjsKLQlfcCA9ICh2ID09IFNFUV9TVEFSVF9UT0tFTikgPyByeHJwY19jYWxscy5uZXh0IDogX3AtPm5leHQ7Ci0KLQlyZXR1cm4gX3AgIT0gJnJ4cnBjX2NhbGxzID8gX3AgOiBOVUxMOwotfSAvKiBlbmQgcnhycGNfcHJvY19jYWxsc19uZXh0KCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIGNsZWFuIHVwIGFmdGVyIHJlYWRpbmcgZnJvbSB0aGUgY2FsbHMgbGlzdAotICovCi1zdGF0aWMgdm9pZCByeHJwY19wcm9jX2NhbGxzX3N0b3Aoc3RydWN0IHNlcV9maWxlICpwLCB2b2lkICp2KQotewotCXVwX3JlYWQoJnJ4cnBjX2NhbGxzX3NlbSk7Ci0KLX0gLyogZW5kIHJ4cnBjX3Byb2NfY2FsbHNfc3RvcCgpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBkaXNwbGF5IGEgaGVhZGVyIGxpbmUgZm9sbG93ZWQgYnkgYSBsb2FkIG9mIGNhbGwgbGluZXMKLSAqLwotc3RhdGljIGludCByeHJwY19wcm9jX2NhbGxzX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQotewotCXN0cnVjdCByeHJwY19jYWxsICpjYWxsID0gbGlzdF9lbnRyeSh2LCBzdHJ1Y3QgcnhycGNfY2FsbCwgY2FsbF9saW5rKTsKLQotCS8qIGRpc3BsYXkgaGVhZGVyIG9uIGxpbmUgMSAqLwotCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikgewotCQlzZXFfcHV0cyhtLAotCQkJICJMT0NBTCBSRU1PVCBTUlZDIENPTk4gICAgIENBTEwgICAgIERJUiBVU0UgIgotCQkJICIgTCBTVEFURSAgIE9QQ09ERSBBQk9SVCAgICBFUlJOT1xuIgotCQkJICk7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qIGRpc3BsYXkgb25lIGNhbGwgcGVyIGxpbmUgb24gc3Vic2VxdWVudCBsaW5lcyAqLwotCXNlcV9wcmludGYobSwKLQkJICAgIiU1aHUgJTVodSAlMDRoeCAlMDh4ICUwOHggJXMgJTN1JWMiCi0JCSAgICIgJWMgJS03LjdzICU2ZCAlMDh4ICU1ZFxuIiwKLQkJICAgY2FsbC0+Y29ubi0+dHJhbnMtPnBvcnQsCi0JCSAgIG50b2hzKGNhbGwtPmNvbm4tPmFkZHIuc2luX3BvcnQpLAotCQkgICBudG9ocyhjYWxsLT5jb25uLT5zZXJ2aWNlX2lkKSwKLQkJICAgbnRvaGwoY2FsbC0+Y29ubi0+Y29ubl9pZCksCi0JCSAgIG50b2hsKGNhbGwtPmNhbGxfaWQpLAotCQkgICBjYWxsLT5jb25uLT5zZXJ2aWNlID8gIlNWQyIgOiAiQ0xUIiwKLQkJICAgYXRvbWljX3JlYWQoJmNhbGwtPnVzYWdlKSwKLQkJICAgd2FpdHF1ZXVlX2FjdGl2ZSgmY2FsbC0+d2FpdHEpID8gJ3cnIDogJyAnLAotCQkgICBjYWxsLT5hcHBfbGFzdF9yY3YgPyAnWScgOiAnLScsCi0JCSAgIChjYWxsLT5hcHBfY2FsbF9zdGF0ZSE9UlhSUENfQ1NUQVRFX0VSUk9SID8KLQkJICAgIHJ4cnBjX2NhbGxfc3RhdGVzN1tjYWxsLT5hcHBfY2FsbF9zdGF0ZV0gOgotCQkgICAgcnhycGNfY2FsbF9lcnJvcl9zdGF0ZXM3W2NhbGwtPmFwcF9lcnJfc3RhdGVdKSwKLQkJICAgY2FsbC0+YXBwX29wY29kZSwKLQkJICAgY2FsbC0+YXBwX2Fib3J0X2NvZGUsCi0JCSAgIGNhbGwtPmFwcF9lcnJubwotCQkgICApOwotCi0JcmV0dXJuIDA7Ci19IC8qIGVuZCByeHJwY19wcm9jX2NhbGxzX3Nob3coKSAqLwpkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL3J4a2FkLmMgYi9uZXQvcnhycGMvcnhrYWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWM3MDUxCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3J4cnBjL3J4a2FkLmMKQEAgLTAsMCArMSwxMTU0IEBACisvKiBLZXJiZXJvcy1iYXNlZCBSeFJQQyBzZWN1cml0eQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvdWRwLmg+CisjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CisjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bmV0L2FmX3J4cnBjLmg+CisjZGVmaW5lIHJ4cnBjX2RlYnVnIHJ4a2FkX2RlYnVnCisjaW5jbHVkZSAiYXItaW50ZXJuYWwuaCIKKworI2RlZmluZSBSWEtBRF9WRVJTSU9OCQkJMgorI2RlZmluZSBNQVhLUkI1VElDS0VUTEVOCQkxMDI0CisjZGVmaW5lIFJYS0FEX1RLVF9UWVBFX0tFUkJFUk9TX1Y1CTI1NgorI2RlZmluZSBBTkFNRV9TWgkJCTQwCS8qIHNpemUgb2YgYXV0aGVudGljYXRpb24gbmFtZSAqLworI2RlZmluZSBJTlNUX1NaCQkJCTQwCS8qIHNpemUgb2YgcHJpbmNpcGFsJ3MgaW5zdGFuY2UgKi8KKyNkZWZpbmUgUkVBTE1fU1oJCQk0MAkvKiBzaXplIG9mIHByaW5jaXBhbCdzIGF1dGggZG9tYWluICovCisjZGVmaW5lIFNOQU1FX1NaCQkJNDAJLyogc2l6ZSBvZiBzZXJ2aWNlIG5hbWUgKi8KKwordW5zaWduZWQgcnhycGNfZGVidWc7Cittb2R1bGVfcGFyYW1fbmFtZWQoZGVidWcsIHJ4cnBjX2RlYnVnLCB1aW50LCBTX0lXVVNSIHwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKHJ4cnBjX2RlYnVnLCAicnhrYWQgZGVidWdnaW5nIG1hc2siKTsKKworc3RydWN0IHJ4a2FkX2xldmVsMV9oZHIgeworCV9fYmUzMglkYXRhX3NpemU7CS8qIHRydWUgZGF0YSBzaXplIChleGNsdWRpbmcgcGFkZGluZykgKi8KK307CisKK3N0cnVjdCByeGthZF9sZXZlbDJfaGRyIHsKKwlfX2JlMzIJZGF0YV9zaXplOwkvKiB0cnVlIGRhdGEgc2l6ZSAoZXhjbHVkaW5nIHBhZGRpbmcpICovCisJX19iZTMyCWNoZWNrc3VtOwkvKiBkZWNyeXB0ZWQgZGF0YSBjaGVja3N1bSAqLworfTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJSeFJQQyBuZXR3b3JrIHByb3RvY29sIHR5cGUtMiBzZWN1cml0eSAoS2VyYmVyb3MpIik7CitNT0RVTEVfQVVUSE9SKCJSZWQgSGF0LCBJbmMuIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8qCisgKiB0aGlzIGhvbGRzIGEgcGlubmVkIGNpcGhlciBzbyB0aGF0IGtldmVudGQgZG9lc24ndCBnZXQgY2FsbGVkIGJ5IHRoZSBjaXBoZXIKKyAqIGFsbG9jIHJvdXRpbmUsIGJ1dCBzaW5jZSB3ZSBoYXZlIGl0IHRvIGhhbmQsIHdlIHVzZSBpdCB0byBkZWNyeXB0IFJFU1BPTlNFCisgKiBwYWNrZXRzCisgKi8KK3N0YXRpYyBzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlciAqcnhrYWRfY2k7CitzdGF0aWMgREVGSU5FX01VVEVYKHJ4a2FkX2NpX211dGV4KTsKKworLyoKKyAqIGluaXRpYWxpc2UgY29ubmVjdGlvbiBzZWN1cml0eQorICovCitzdGF0aWMgaW50IHJ4a2FkX2luaXRfY29ubmVjdGlvbl9zZWN1cml0eShzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubikKK3sKKwlzdHJ1Y3QgcnhycGNfa2V5X3BheWxvYWQgKnBheWxvYWQ7CisJc3RydWN0IGNyeXB0b19ibGtjaXBoZXIgKmNpOworCWludCByZXQ7CisKKwlfZW50ZXIoInslZH0seyV4fSIsIGNvbm4tPmRlYnVnX2lkLCBrZXlfc2VyaWFsKGNvbm4tPmtleSkpOworCisJcGF5bG9hZCA9IGNvbm4tPmtleS0+cGF5bG9hZC5kYXRhOworCWNvbm4tPnNlY3VyaXR5X2l4ID0gcGF5bG9hZC0+ay5zZWN1cml0eV9pbmRleDsKKworCWNpID0gY3J5cHRvX2FsbG9jX2Jsa2NpcGhlcigicGNiYyhmY3J5cHQpIiwgMCwgQ1JZUFRPX0FMR19BU1lOQyk7CisJaWYgKElTX0VSUihjaSkpIHsKKwkJX2RlYnVnKCJubyBjaXBoZXIiKTsKKwkJcmV0ID0gUFRSX0VSUihjaSk7CisJCWdvdG8gZXJyb3I7CisJfQorCisJaWYgKGNyeXB0b19ibGtjaXBoZXJfc2V0a2V5KGNpLCBwYXlsb2FkLT5rLnNlc3Npb25fa2V5LAorCQkJCSAgICBzaXplb2YocGF5bG9hZC0+ay5zZXNzaW9uX2tleSkpIDwgMCkKKwkJQlVHKCk7CisKKwlzd2l0Y2ggKGNvbm4tPnNlY3VyaXR5X2xldmVsKSB7CisJY2FzZSBSWFJQQ19TRUNVUklUWV9QTEFJTjoKKwkJYnJlYWs7CisJY2FzZSBSWFJQQ19TRUNVUklUWV9BVVRIOgorCQljb25uLT5zaXplX2FsaWduID0gODsKKwkJY29ubi0+c2VjdXJpdHlfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgcnhrYWRfbGV2ZWwxX2hkcik7CisJCWNvbm4tPmhlYWRlcl9zaXplICs9IHNpemVvZihzdHJ1Y3QgcnhrYWRfbGV2ZWwxX2hkcik7CisJCWJyZWFrOworCWNhc2UgUlhSUENfU0VDVVJJVFlfRU5DUllQVDoKKwkJY29ubi0+c2l6ZV9hbGlnbiA9IDg7CisJCWNvbm4tPnNlY3VyaXR5X3NpemUgPSBzaXplb2Yoc3RydWN0IHJ4a2FkX2xldmVsMl9oZHIpOworCQljb25uLT5oZWFkZXJfc2l6ZSArPSBzaXplb2Yoc3RydWN0IHJ4a2FkX2xldmVsMl9oZHIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUtFWVJFSkVDVEVEOworCQlnb3RvIGVycm9yOworCX0KKworCWNvbm4tPmNpcGhlciA9IGNpOworCXJldCA9IDA7CitlcnJvcjoKKwlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogcHJpbWUgdGhlIGVuY3J5cHRpb24gc3RhdGUgd2l0aCB0aGUgaW52YXJpYW50IHBhcnRzIG9mIGEgY29ubmVjdGlvbidzCisgKiBkZXNjcmlwdGlvbgorICovCitzdGF0aWMgdm9pZCByeGthZF9wcmltZV9wYWNrZXRfc2VjdXJpdHkoc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4pCit7CisJc3RydWN0IHJ4cnBjX2tleV9wYXlsb2FkICpwYXlsb2FkOworCXN0cnVjdCBibGtjaXBoZXJfZGVzYyBkZXNjOworCXN0cnVjdCBzY2F0dGVybGlzdCBzZ1syXTsKKwlzdHJ1Y3QgcnhycGNfY3J5cHQgaXY7CisJc3RydWN0IHsKKwkJX19iZTMyIHhbNF07CisJfSB0bXBidWYgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgxNikpKTsgLyogbXVzdCBhbGwgYmUgaW4gc2FtZSBwYWdlICovCisKKwlfZW50ZXIoIiIpOworCisJaWYgKCFjb25uLT5rZXkpCisJCXJldHVybjsKKworCXBheWxvYWQgPSBjb25uLT5rZXktPnBheWxvYWQuZGF0YTsKKwltZW1jcHkoJml2LCBwYXlsb2FkLT5rLnNlc3Npb25fa2V5LCBzaXplb2YoaXYpKTsKKworCWRlc2MudGZtID0gY29ubi0+Y2lwaGVyOworCWRlc2MuaW5mbyA9IGl2Lng7CisJZGVzYy5mbGFncyA9IDA7CisKKwl0bXBidWYueFswXSA9IGNvbm4tPmVwb2NoOworCXRtcGJ1Zi54WzFdID0gY29ubi0+Y2lkOworCXRtcGJ1Zi54WzJdID0gMDsKKwl0bXBidWYueFszXSA9IGh0b25sKGNvbm4tPnNlY3VyaXR5X2l4KTsKKworCW1lbXNldChzZywgMCwgc2l6ZW9mKHNnKSk7CisJc2dfc2V0X2J1Zigmc2dbMF0sICZ0bXBidWYsIHNpemVvZih0bXBidWYpKTsKKwlzZ19zZXRfYnVmKCZzZ1sxXSwgJnRtcGJ1Ziwgc2l6ZW9mKHRtcGJ1ZikpOworCWNyeXB0b19ibGtjaXBoZXJfZW5jcnlwdF9pdigmZGVzYywgJnNnWzBdLCAmc2dbMV0sIHNpemVvZih0bXBidWYpKTsKKworCW1lbWNweSgmY29ubi0+Y3N1bV9pdiwgJnRtcGJ1Zi54WzJdLCBzaXplb2YoY29ubi0+Y3N1bV9pdikpOworCUFTU0VSVENNUChjb25uLT5jc3VtX2l2Lm5bMF0sID09LCB0bXBidWYueFsyXSk7CisKKwlfbGVhdmUoIiIpOworfQorCisvKgorICogcGFydGlhbGx5IGVuY3J5cHQgYSBwYWNrZXQgKGxldmVsIDEgc2VjdXJpdHkpCisgKi8KK3N0YXRpYyBpbnQgcnhrYWRfc2VjdXJlX3BhY2tldF9hdXRoKGNvbnN0IHN0cnVjdCByeHJwY19jYWxsICpjYWxsLAorCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSAgICB1MzIgZGF0YV9zaXplLAorCQkJCSAgICB2b2lkICpzZWNoZHIpCit7CisJc3RydWN0IHJ4cnBjX3NrYl9wcml2ICpzcDsKKwlzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgZGVzYzsKKwlzdHJ1Y3QgcnhycGNfY3J5cHQgaXY7CisJc3RydWN0IHNjYXR0ZXJsaXN0IHNnWzJdOworCXN0cnVjdCB7CisJCXN0cnVjdCByeGthZF9sZXZlbDFfaGRyIGhkcjsKKwkJX19iZTMyCWZpcnN0OwkvKiBmaXJzdCBmb3VyIGJ5dGVzIG9mIGRhdGEgYW5kIHBhZGRpbmcgKi8KKwl9IHRtcGJ1ZiBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7IC8qIG11c3QgYWxsIGJlIGluIHNhbWUgcGFnZSAqLworCXUxNiBjaGVjazsKKworCXNwID0gcnhycGNfc2tiKHNrYik7CisKKwlfZW50ZXIoIiIpOworCisJY2hlY2sgPSBudG9obChzcC0+aGRyLnNlcSBeIHNwLT5oZHIuY2FsbE51bWJlcik7CisJZGF0YV9zaXplIHw9ICh1MzIpIGNoZWNrIDw8IDE2OworCisJdG1wYnVmLmhkci5kYXRhX3NpemUgPSBodG9ubChkYXRhX3NpemUpOworCW1lbWNweSgmdG1wYnVmLmZpcnN0LCBzZWNoZHIgKyA0LCBzaXplb2YodG1wYnVmLmZpcnN0KSk7CisKKwkvKiBzdGFydCB0aGUgZW5jcnlwdGlvbiBhZnJlc2ggKi8KKwltZW1zZXQoJml2LCAwLCBzaXplb2YoaXYpKTsKKwlkZXNjLnRmbSA9IGNhbGwtPmNvbm4tPmNpcGhlcjsKKwlkZXNjLmluZm8gPSBpdi54OworCWRlc2MuZmxhZ3MgPSAwOworCisJbWVtc2V0KHNnLCAwLCBzaXplb2Yoc2cpKTsKKwlzZ19zZXRfYnVmKCZzZ1swXSwgJnRtcGJ1Ziwgc2l6ZW9mKHRtcGJ1ZikpOworCXNnX3NldF9idWYoJnNnWzFdLCAmdG1wYnVmLCBzaXplb2YodG1wYnVmKSk7CisJY3J5cHRvX2Jsa2NpcGhlcl9lbmNyeXB0X2l2KCZkZXNjLCAmc2dbMF0sICZzZ1sxXSwgc2l6ZW9mKHRtcGJ1ZikpOworCisJbWVtY3B5KHNlY2hkciwgJnRtcGJ1Ziwgc2l6ZW9mKHRtcGJ1ZikpOworCisJX2xlYXZlKCIgPSAwIik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiB3aG9sbHkgZW5jcnlwdCBhIHBhY2tldCAobGV2ZWwgMiBzZWN1cml0eSkKKyAqLworc3RhdGljIGludCByeGthZF9zZWN1cmVfcGFja2V0X2VuY3J5cHQoY29uc3Qgc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsCisJCQkJCXN0cnVjdCBza19idWZmICpza2IsCisJCQkJCXUzMiBkYXRhX3NpemUsCisJCQkJCXZvaWQgKnNlY2hkcikKK3sKKwljb25zdCBzdHJ1Y3QgcnhycGNfa2V5X3BheWxvYWQgKnBheWxvYWQ7CisJc3RydWN0IHJ4a2FkX2xldmVsMl9oZHIgcnhraGRyCisJCV9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKTsgLyogbXVzdCBiZSBhbGwgb24gb25lIHBhZ2UgKi8KKwlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwOworCXN0cnVjdCBibGtjaXBoZXJfZGVzYyBkZXNjOworCXN0cnVjdCByeHJwY19jcnlwdCBpdjsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2dbMTZdOworCXN0cnVjdCBza19idWZmICp0cmFpbGVyOworCXVuc2lnbmVkIGxlbjsKKwl1MTYgY2hlY2s7CisJaW50IG5zZzsKKworCXNwID0gcnhycGNfc2tiKHNrYik7CisKKwlfZW50ZXIoIiIpOworCisJY2hlY2sgPSBudG9obChzcC0+aGRyLnNlcSBeIHNwLT5oZHIuY2FsbE51bWJlcik7CisKKwlyeGtoZHIuZGF0YV9zaXplID0gaHRvbmwoZGF0YV9zaXplIHwgKHUzMikgY2hlY2sgPDwgMTYpOworCXJ4a2hkci5jaGVja3N1bSA9IDA7CisKKwkvKiBlbmNyeXB0IGZyb20gdGhlIHNlc3Npb24ga2V5ICovCisJcGF5bG9hZCA9IGNhbGwtPmNvbm4tPmtleS0+cGF5bG9hZC5kYXRhOworCW1lbWNweSgmaXYsIHBheWxvYWQtPmsuc2Vzc2lvbl9rZXksIHNpemVvZihpdikpOworCWRlc2MudGZtID0gY2FsbC0+Y29ubi0+Y2lwaGVyOworCWRlc2MuaW5mbyA9IGl2Lng7CisJZGVzYy5mbGFncyA9IDA7CisKKwltZW1zZXQoc2csIDAsIHNpemVvZihzZ1swXSkgKiAyKTsKKwlzZ19zZXRfYnVmKCZzZ1swXSwgc2VjaGRyLCBzaXplb2YocnhraGRyKSk7CisJc2dfc2V0X2J1Zigmc2dbMV0sICZyeGtoZHIsIHNpemVvZihyeGtoZHIpKTsKKwljcnlwdG9fYmxrY2lwaGVyX2VuY3J5cHRfaXYoJmRlc2MsICZzZ1swXSwgJnNnWzFdLCBzaXplb2YocnhraGRyKSk7CisKKwkvKiB3ZSB3YW50IHRvIGVuY3J5cHQgdGhlIHNrYnVmZiBpbi1wbGFjZSAqLworCW5zZyA9IHNrYl9jb3dfZGF0YShza2IsIDAsICZ0cmFpbGVyKTsKKwlpZiAobnNnIDwgMCB8fCBuc2cgPiAxNikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlsZW4gPSBkYXRhX3NpemUgKyBjYWxsLT5jb25uLT5zaXplX2FsaWduIC0gMTsKKwlsZW4gJj0gfihjYWxsLT5jb25uLT5zaXplX2FsaWduIC0gMSk7CisKKwlza2JfdG9fc2d2ZWMoc2tiLCBzZywgMCwgbGVuKTsKKwljcnlwdG9fYmxrY2lwaGVyX2VuY3J5cHRfaXYoJmRlc2MsIHNnLCBzZywgbGVuKTsKKworCV9sZWF2ZSgiID0gMCIpOworCXJldHVybiAwOworfQorCisvKgorICogY2hlY2tzdW0gYW4gUnhSUEMgcGFja2V0IGhlYWRlcgorICovCitzdGF0aWMgaW50IHJ4a2FkX3NlY3VyZV9wYWNrZXQoY29uc3Qgc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsCisJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQlzaXplX3QgZGF0YV9zaXplLAorCQkJCXZvaWQgKnNlY2hkcikKK3sKKwlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwOworCXN0cnVjdCBibGtjaXBoZXJfZGVzYyBkZXNjOworCXN0cnVjdCByeHJwY19jcnlwdCBpdjsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2dbMl07CisJc3RydWN0IHsKKwkJX19iZTMyIHhbMl07CisJfSB0bXBidWYgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpOyAvKiBtdXN0IGFsbCBiZSBpbiBzYW1lIHBhZ2UgKi8KKwlfX2JlMzIgeDsKKwlpbnQgcmV0OworCisJc3AgPSByeHJwY19za2Ioc2tiKTsKKworCV9lbnRlcigieyVkeyV4fX0seyMldX0sJXp1LCIsCisJICAgICAgIGNhbGwtPmRlYnVnX2lkLCBrZXlfc2VyaWFsKGNhbGwtPmNvbm4tPmtleSksIG50b2hsKHNwLT5oZHIuc2VxKSwKKwkgICAgICAgZGF0YV9zaXplKTsKKworCWlmICghY2FsbC0+Y29ubi0+Y2lwaGVyKQorCQlyZXR1cm4gMDsKKworCXJldCA9IGtleV92YWxpZGF0ZShjYWxsLT5jb25uLT5rZXkpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogY29udGludWUgZW5jcnlwdGluZyBmcm9tIHdoZXJlIHdlIGxlZnQgb2ZmICovCisJbWVtY3B5KCZpdiwgY2FsbC0+Y29ubi0+Y3N1bV9pdi54LCBzaXplb2YoaXYpKTsKKwlkZXNjLnRmbSA9IGNhbGwtPmNvbm4tPmNpcGhlcjsKKwlkZXNjLmluZm8gPSBpdi54OworCWRlc2MuZmxhZ3MgPSAwOworCisJLyogY2FsY3VsYXRlIHRoZSBzZWN1cml0eSBjaGVja3N1bSAqLworCXggPSBodG9ubChjYWxsLT5jaGFubmVsIDw8ICgzMiAtIFJYUlBDX0NJRFNISUZUKSk7CisJeCB8PSBzcC0+aGRyLnNlcSAmIF9fY29uc3RhbnRfY3B1X3RvX2JlMzIoMHgzZmZmZmZmZik7CisJdG1wYnVmLnhbMF0gPSBzcC0+aGRyLmNhbGxOdW1iZXI7CisJdG1wYnVmLnhbMV0gPSB4OworCisJbWVtc2V0KCZzZywgMCwgc2l6ZW9mKHNnKSk7CisJc2dfc2V0X2J1Zigmc2dbMF0sICZ0bXBidWYsIHNpemVvZih0bXBidWYpKTsKKwlzZ19zZXRfYnVmKCZzZ1sxXSwgJnRtcGJ1Ziwgc2l6ZW9mKHRtcGJ1ZikpOworCWNyeXB0b19ibGtjaXBoZXJfZW5jcnlwdF9pdigmZGVzYywgJnNnWzBdLCAmc2dbMV0sIHNpemVvZih0bXBidWYpKTsKKworCXggPSBudG9obCh0bXBidWYueFsxXSk7CisJeCA9ICh4ID4+IDE2KSAmIDB4ZmZmZjsKKwlpZiAoeCA9PSAwKQorCQl4ID0gMTsgLyogemVybyBjaGVja3N1bXMgYXJlIG5vdCBwZXJtaXR0ZWQgKi8KKwlzcC0+aGRyLmNrc3VtID0gaHRvbnMoeCk7CisKKwlzd2l0Y2ggKGNhbGwtPmNvbm4tPnNlY3VyaXR5X2xldmVsKSB7CisJY2FzZSBSWFJQQ19TRUNVUklUWV9QTEFJTjoKKwkJcmV0ID0gMDsKKwkJYnJlYWs7CisJY2FzZSBSWFJQQ19TRUNVUklUWV9BVVRIOgorCQlyZXQgPSByeGthZF9zZWN1cmVfcGFja2V0X2F1dGgoY2FsbCwgc2tiLCBkYXRhX3NpemUsIHNlY2hkcik7CisJCWJyZWFrOworCWNhc2UgUlhSUENfU0VDVVJJVFlfRU5DUllQVDoKKwkJcmV0ID0gcnhrYWRfc2VjdXJlX3BhY2tldF9lbmNyeXB0KGNhbGwsIHNrYiwgZGF0YV9zaXplLAorCQkJCQkJICBzZWNoZHIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRVBFUk07CisJCWJyZWFrOworCX0KKworCV9sZWF2ZSgiID0gJWQgW3NldCAlaHhdIiwgcmV0LCB4KTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogZGVjcnlwdCBwYXJ0aWFsIGVuY3J5cHRpb24gb24gYSBwYWNrZXQgKGxldmVsIDEgc2VjdXJpdHkpCisgKi8KK3N0YXRpYyBpbnQgcnhrYWRfdmVyaWZ5X3BhY2tldF9hdXRoKGNvbnN0IHN0cnVjdCByeHJwY19jYWxsICpjYWxsLAorCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSAgICB1MzIgKl9hYm9ydF9jb2RlKQoreworCXN0cnVjdCByeGthZF9sZXZlbDFfaGRyIHNlY2hkcjsKKwlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwOworCXN0cnVjdCBibGtjaXBoZXJfZGVzYyBkZXNjOworCXN0cnVjdCByeHJwY19jcnlwdCBpdjsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2dbMl07CisJc3RydWN0IHNrX2J1ZmYgKnRyYWlsZXI7CisJdTMyIGRhdGFfc2l6ZSwgYnVmOworCXUxNiBjaGVjazsKKworCV9lbnRlcigiIik7CisKKwlzcCA9IHJ4cnBjX3NrYihza2IpOworCisJLyogd2Ugd2FudCB0byBkZWNyeXB0IHRoZSBza2J1ZmYgaW4tcGxhY2UgKi8KKwlpZiAoc2tiX2Nvd19kYXRhKHNrYiwgMCwgJnRyYWlsZXIpIDwgMCkKKwkJZ290byBub21lbTsKKworCXNrYl90b19zZ3ZlYyhza2IsIHNnLCAwLCA4KTsKKworCS8qIHN0YXJ0IHRoZSBkZWNyeXB0aW9uIGFmcmVzaCAqLworCW1lbXNldCgmaXYsIDAsIHNpemVvZihpdikpOworCWRlc2MudGZtID0gY2FsbC0+Y29ubi0+Y2lwaGVyOworCWRlc2MuaW5mbyA9IGl2Lng7CisJZGVzYy5mbGFncyA9IDA7CisKKwljcnlwdG9fYmxrY2lwaGVyX2RlY3J5cHRfaXYoJmRlc2MsIHNnLCBzZywgOCk7CisKKwkvKiByZW1vdmUgdGhlIGRlY3J5cHRlZCBwYWNrZXQgbGVuZ3RoICovCisJaWYgKHNrYl9jb3B5X2JpdHMoc2tiLCAwLCAmc2VjaGRyLCBzaXplb2Yoc2VjaGRyKSkgPCAwKQorCQlnb3RvIGRhdGFsZW5fZXJyb3I7CisJaWYgKCFza2JfcHVsbChza2IsIHNpemVvZihzZWNoZHIpKSkKKwkJQlVHKCk7CisKKwlidWYgPSBudG9obChzZWNoZHIuZGF0YV9zaXplKTsKKwlkYXRhX3NpemUgPSBidWYgJiAweGZmZmY7CisKKwljaGVjayA9IGJ1ZiA+PiAxNjsKKwljaGVjayBePSBudG9obChzcC0+aGRyLnNlcSBeIHNwLT5oZHIuY2FsbE51bWJlcik7CisJY2hlY2sgJj0gMHhmZmZmOworCWlmIChjaGVjayAhPSAwKSB7CisJCSpfYWJvcnRfY29kZSA9IFJYS0FEU0VBTEVESU5DT047CisJCWdvdG8gcHJvdG9jb2xfZXJyb3I7CisJfQorCisJLyogc2hvcnRlbiB0aGUgcGFja2V0IHRvIHJlbW92ZSB0aGUgcGFkZGluZyAqLworCWlmIChkYXRhX3NpemUgPiBza2ItPmxlbikKKwkJZ290byBkYXRhbGVuX2Vycm9yOworCWVsc2UgaWYgKGRhdGFfc2l6ZSA8IHNrYi0+bGVuKQorCQlza2ItPmxlbiA9IGRhdGFfc2l6ZTsKKworCV9sZWF2ZSgiID0gMCBbZGxlbj0leF0iLCBkYXRhX3NpemUpOworCXJldHVybiAwOworCitkYXRhbGVuX2Vycm9yOgorCSpfYWJvcnRfY29kZSA9IFJYS0FEREFUQUxFTjsKK3Byb3RvY29sX2Vycm9yOgorCV9sZWF2ZSgiID0gLUVQUk9UTyIpOworCXJldHVybiAtRVBST1RPOworCitub21lbToKKwlfbGVhdmUoIiA9IC1FTk9NRU0iKTsKKwlyZXR1cm4gLUVOT01FTTsKK30KKworLyoKKyAqIHdob2xseSBkZWNyeXB0IGEgcGFja2V0IChsZXZlbCAyIHNlY3VyaXR5KQorICovCitzdGF0aWMgaW50IHJ4a2FkX3ZlcmlmeV9wYWNrZXRfZW5jcnlwdChjb25zdCBzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwKKwkJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgICAgICAgdTMyICpfYWJvcnRfY29kZSkKK3sKKwljb25zdCBzdHJ1Y3QgcnhycGNfa2V5X3BheWxvYWQgKnBheWxvYWQ7CisJc3RydWN0IHJ4a2FkX2xldmVsMl9oZHIgc2VjaGRyOworCXN0cnVjdCByeHJwY19za2JfcHJpdiAqc3A7CisJc3RydWN0IGJsa2NpcGhlcl9kZXNjIGRlc2M7CisJc3RydWN0IHJ4cnBjX2NyeXB0IGl2OworCXN0cnVjdCBzY2F0dGVybGlzdCBfc2dbNF0sICpzZzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqdHJhaWxlcjsKKwl1MzIgZGF0YV9zaXplLCBidWY7CisJdTE2IGNoZWNrOworCWludCBuc2c7CisKKwlfZW50ZXIoIix7JWR9Iiwgc2tiLT5sZW4pOworCisJc3AgPSByeHJwY19za2Ioc2tiKTsKKworCS8qIHdlIHdhbnQgdG8gZGVjcnlwdCB0aGUgc2tidWZmIGluLXBsYWNlICovCisJbnNnID0gc2tiX2Nvd19kYXRhKHNrYiwgMCwgJnRyYWlsZXIpOworCWlmIChuc2cgPCAwKQorCQlnb3RvIG5vbWVtOworCisJc2cgPSBfc2c7CisJaWYgKHVubGlrZWx5KG5zZyA+IDQpKSB7CisJCXNnID0ga21hbGxvYyhzaXplb2YoKnNnKSAqIG5zZywgR0ZQX05PSU8pOworCQlpZiAoIXNnKQorCQkJZ290byBub21lbTsKKwl9CisKKwlza2JfdG9fc2d2ZWMoc2tiLCBzZywgMCwgc2tiLT5sZW4pOworCisJLyogZGVjcnlwdCBmcm9tIHRoZSBzZXNzaW9uIGtleSAqLworCXBheWxvYWQgPSBjYWxsLT5jb25uLT5rZXktPnBheWxvYWQuZGF0YTsKKwltZW1jcHkoJml2LCBwYXlsb2FkLT5rLnNlc3Npb25fa2V5LCBzaXplb2YoaXYpKTsKKwlkZXNjLnRmbSA9IGNhbGwtPmNvbm4tPmNpcGhlcjsKKwlkZXNjLmluZm8gPSBpdi54OworCWRlc2MuZmxhZ3MgPSAwOworCisJY3J5cHRvX2Jsa2NpcGhlcl9kZWNyeXB0X2l2KCZkZXNjLCBzZywgc2csIHNrYi0+bGVuKTsKKwlpZiAoc2cgIT0gX3NnKQorCQlrZnJlZShzZyk7CisKKwkvKiByZW1vdmUgdGhlIGRlY3J5cHRlZCBwYWNrZXQgbGVuZ3RoICovCisJaWYgKHNrYl9jb3B5X2JpdHMoc2tiLCAwLCAmc2VjaGRyLCBzaXplb2Yoc2VjaGRyKSkgPCAwKQorCQlnb3RvIGRhdGFsZW5fZXJyb3I7CisJaWYgKCFza2JfcHVsbChza2IsIHNpemVvZihzZWNoZHIpKSkKKwkJQlVHKCk7CisKKwlidWYgPSBudG9obChzZWNoZHIuZGF0YV9zaXplKTsKKwlkYXRhX3NpemUgPSBidWYgJiAweGZmZmY7CisKKwljaGVjayA9IGJ1ZiA+PiAxNjsKKwljaGVjayBePSBudG9obChzcC0+aGRyLnNlcSBeIHNwLT5oZHIuY2FsbE51bWJlcik7CisJY2hlY2sgJj0gMHhmZmZmOworCWlmIChjaGVjayAhPSAwKSB7CisJCSpfYWJvcnRfY29kZSA9IFJYS0FEU0VBTEVESU5DT047CisJCWdvdG8gcHJvdG9jb2xfZXJyb3I7CisJfQorCisJLyogc2hvcnRlbiB0aGUgcGFja2V0IHRvIHJlbW92ZSB0aGUgcGFkZGluZyAqLworCWlmIChkYXRhX3NpemUgPiBza2ItPmxlbikKKwkJZ290byBkYXRhbGVuX2Vycm9yOworCWVsc2UgaWYgKGRhdGFfc2l6ZSA8IHNrYi0+bGVuKQorCQlza2ItPmxlbiA9IGRhdGFfc2l6ZTsKKworCV9sZWF2ZSgiID0gMCBbZGxlbj0leF0iLCBkYXRhX3NpemUpOworCXJldHVybiAwOworCitkYXRhbGVuX2Vycm9yOgorCSpfYWJvcnRfY29kZSA9IFJYS0FEREFUQUxFTjsKK3Byb3RvY29sX2Vycm9yOgorCV9sZWF2ZSgiID0gLUVQUk9UTyIpOworCXJldHVybiAtRVBST1RPOworCitub21lbToKKwlfbGVhdmUoIiA9IC1FTk9NRU0iKTsKKwlyZXR1cm4gLUVOT01FTTsKK30KKworLyoKKyAqIHZlcmlmeSB0aGUgc2VjdXJpdHkgb24gYSByZWNlaXZlZCBwYWNrZXQKKyAqLworc3RhdGljIGludCByeGthZF92ZXJpZnlfcGFja2V0KGNvbnN0IHN0cnVjdCByeHJwY19jYWxsICpjYWxsLAorCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgICAgdTMyICpfYWJvcnRfY29kZSkKK3sKKwlzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgZGVzYzsKKwlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwOworCXN0cnVjdCByeHJwY19jcnlwdCBpdjsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2dbMl07CisJc3RydWN0IHsKKwkJX19iZTMyIHhbMl07CisJfSB0bXBidWYgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpOyAvKiBtdXN0IGFsbCBiZSBpbiBzYW1lIHBhZ2UgKi8KKwlfX2JlMzIgeDsKKwlfX2JlMTYgY2tzdW07CisJaW50IHJldDsKKworCXNwID0gcnhycGNfc2tiKHNrYik7CisKKwlfZW50ZXIoInslZHsleH19LHsjJXV9IiwKKwkgICAgICAgY2FsbC0+ZGVidWdfaWQsIGtleV9zZXJpYWwoY2FsbC0+Y29ubi0+a2V5KSwKKwkgICAgICAgbnRvaGwoc3AtPmhkci5zZXEpKTsKKworCWlmICghY2FsbC0+Y29ubi0+Y2lwaGVyKQorCQlyZXR1cm4gMDsKKworCWlmIChzcC0+aGRyLnNlY3VyaXR5SW5kZXggIT0gMikgeworCQkqX2Fib3J0X2NvZGUgPSBSWEtBRElOQ09OU0lTVEVOQ1k7CisJCV9sZWF2ZSgiID0gLUVQUk9UTyBbbm90IHJ4a2FkXSIpOworCQlyZXR1cm4gLUVQUk9UTzsKKwl9CisKKwkvKiBjb250aW51ZSBlbmNyeXB0aW5nIGZyb20gd2hlcmUgd2UgbGVmdCBvZmYgKi8KKwltZW1jcHkoJml2LCBjYWxsLT5jb25uLT5jc3VtX2l2LngsIHNpemVvZihpdikpOworCWRlc2MudGZtID0gY2FsbC0+Y29ubi0+Y2lwaGVyOworCWRlc2MuaW5mbyA9IGl2Lng7CisJZGVzYy5mbGFncyA9IDA7CisKKwkvKiB2YWxpZGF0ZSB0aGUgc2VjdXJpdHkgY2hlY2tzdW0gKi8KKwl4ID0gaHRvbmwoY2FsbC0+Y2hhbm5lbCA8PCAoMzIgLSBSWFJQQ19DSURTSElGVCkpOworCXggfD0gc3AtPmhkci5zZXEgJiBfX2NvbnN0YW50X2NwdV90b19iZTMyKDB4M2ZmZmZmZmYpOworCXRtcGJ1Zi54WzBdID0gY2FsbC0+Y2FsbF9pZDsKKwl0bXBidWYueFsxXSA9IHg7CisKKwltZW1zZXQoJnNnLCAwLCBzaXplb2Yoc2cpKTsKKwlzZ19zZXRfYnVmKCZzZ1swXSwgJnRtcGJ1Ziwgc2l6ZW9mKHRtcGJ1ZikpOworCXNnX3NldF9idWYoJnNnWzFdLCAmdG1wYnVmLCBzaXplb2YodG1wYnVmKSk7CisJY3J5cHRvX2Jsa2NpcGhlcl9lbmNyeXB0X2l2KCZkZXNjLCAmc2dbMF0sICZzZ1sxXSwgc2l6ZW9mKHRtcGJ1ZikpOworCisJeCA9IG50b2hsKHRtcGJ1Zi54WzFdKTsKKwl4ID0gKHggPj4gMTYpICYgMHhmZmZmOworCWlmICh4ID09IDApCisJCXggPSAxOyAvKiB6ZXJvIGNoZWNrc3VtcyBhcmUgbm90IHBlcm1pdHRlZCAqLworCisJY2tzdW0gPSBodG9ucyh4KTsKKwlpZiAoc3AtPmhkci5ja3N1bSAhPSBja3N1bSkgeworCQkqX2Fib3J0X2NvZGUgPSBSWEtBRFNFQUxFRElOQ09OOworCQlfbGVhdmUoIiA9IC1FUFJPVE8gW2NzdW0gZmFpbGVkXSIpOworCQlyZXR1cm4gLUVQUk9UTzsKKwl9CisKKwlzd2l0Y2ggKGNhbGwtPmNvbm4tPnNlY3VyaXR5X2xldmVsKSB7CisJY2FzZSBSWFJQQ19TRUNVUklUWV9QTEFJTjoKKwkJcmV0ID0gMDsKKwkJYnJlYWs7CisJY2FzZSBSWFJQQ19TRUNVUklUWV9BVVRIOgorCQlyZXQgPSByeGthZF92ZXJpZnlfcGFja2V0X2F1dGgoY2FsbCwgc2tiLCBfYWJvcnRfY29kZSk7CisJCWJyZWFrOworCWNhc2UgUlhSUENfU0VDVVJJVFlfRU5DUllQVDoKKwkJcmV0ID0gcnhrYWRfdmVyaWZ5X3BhY2tldF9lbmNyeXB0KGNhbGwsIHNrYiwgX2Fib3J0X2NvZGUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRU5PQU5POworCQlicmVhazsKKwl9CisKKwlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogaXNzdWUgYSBjaGFsbGVuZ2UKKyAqLworc3RhdGljIGludCByeGthZF9pc3N1ZV9jaGFsbGVuZ2Uoc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4pCit7CisJc3RydWN0IHJ4a2FkX2NoYWxsZW5nZSBjaGFsbGVuZ2U7CisJc3RydWN0IHJ4cnBjX2hlYWRlciBoZHI7CisJc3RydWN0IG1zZ2hkciBtc2c7CisJc3RydWN0IGt2ZWMgaW92WzJdOworCXNpemVfdCBsZW47CisJaW50IHJldDsKKworCV9lbnRlcigieyVkLCV4fSIsIGNvbm4tPmRlYnVnX2lkLCBrZXlfc2VyaWFsKGNvbm4tPmtleSkpOworCisJcmV0ID0ga2V5X3ZhbGlkYXRlKGNvbm4tPmtleSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlnZXRfcmFuZG9tX2J5dGVzKCZjb25uLT5zZWN1cml0eV9ub25jZSwgc2l6ZW9mKGNvbm4tPnNlY3VyaXR5X25vbmNlKSk7CisKKwljaGFsbGVuZ2UudmVyc2lvbgk9IGh0b25sKDIpOworCWNoYWxsZW5nZS5ub25jZQkJPSBodG9ubChjb25uLT5zZWN1cml0eV9ub25jZSk7CisJY2hhbGxlbmdlLm1pbl9sZXZlbAk9IGh0b25sKDApOworCWNoYWxsZW5nZS5fX3BhZGRpbmcJPSAwOworCisJbXNnLm1zZ19uYW1lCT0gJmNvbm4tPnRyYW5zLT5wZWVyLT5zcngudHJhbnNwb3J0LnNpbjsKKwltc2cubXNnX25hbWVsZW4JPSBzaXplb2YoY29ubi0+dHJhbnMtPnBlZXItPnNyeC50cmFuc3BvcnQuc2luKTsKKwltc2cubXNnX2NvbnRyb2wJPSBOVUxMOworCW1zZy5tc2dfY29udHJvbGxlbiA9IDA7CisJbXNnLm1zZ19mbGFncwk9IDA7CisKKwloZHIuZXBvY2gJPSBjb25uLT5lcG9jaDsKKwloZHIuY2lkCQk9IGNvbm4tPmNpZDsKKwloZHIuY2FsbE51bWJlcgk9IDA7CisJaGRyLnNlcQkJPSAwOworCWhkci50eXBlCT0gUlhSUENfUEFDS0VUX1RZUEVfQ0hBTExFTkdFOworCWhkci5mbGFncwk9IGNvbm4tPm91dF9jbGllbnRmbGFnOworCWhkci51c2VyU3RhdHVzCT0gMDsKKwloZHIuc2VjdXJpdHlJbmRleCA9IGNvbm4tPnNlY3VyaXR5X2l4OworCWhkci5fcnN2ZAk9IDA7CisJaGRyLnNlcnZpY2VJZAk9IGNvbm4tPnNlcnZpY2VfaWQ7CisKKwlpb3ZbMF0uaW92X2Jhc2UJPSAmaGRyOworCWlvdlswXS5pb3ZfbGVuCT0gc2l6ZW9mKGhkcik7CisJaW92WzFdLmlvdl9iYXNlCT0gJmNoYWxsZW5nZTsKKwlpb3ZbMV0uaW92X2xlbgk9IHNpemVvZihjaGFsbGVuZ2UpOworCisJbGVuID0gaW92WzBdLmlvdl9sZW4gKyBpb3ZbMV0uaW92X2xlbjsKKworCWhkci5zZXJpYWwgPSBodG9ubChhdG9taWNfaW5jX3JldHVybigmY29ubi0+c2VyaWFsKSk7CisJX3Byb3RvKCJUeCBDSEFMTEVOR0UgJSUldSIsIG50b2hsKGhkci5zZXJpYWwpKTsKKworCXJldCA9IGtlcm5lbF9zZW5kbXNnKGNvbm4tPnRyYW5zLT5sb2NhbC0+c29ja2V0LCAmbXNnLCBpb3YsIDIsIGxlbik7CisJaWYgKHJldCA8IDApIHsKKwkJX2RlYnVnKCJzZW5kbXNnIGZhaWxlZDogJWQiLCByZXQpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKwlfbGVhdmUoIiA9IDAiKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHNlbmQgYSBLZXJiZXJvcyBzZWN1cml0eSByZXNwb25zZQorICovCitzdGF0aWMgaW50IHJ4a2FkX3NlbmRfcmVzcG9uc2Uoc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4sCisJCQkgICAgICAgc3RydWN0IHJ4cnBjX2hlYWRlciAqaGRyLAorCQkJICAgICAgIHN0cnVjdCByeGthZF9yZXNwb25zZSAqcmVzcCwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgcnhrYWRfa2V5ICpzMikKK3sKKwlzdHJ1Y3QgbXNnaGRyIG1zZzsKKwlzdHJ1Y3Qga3ZlYyBpb3ZbM107CisJc2l6ZV90IGxlbjsKKwlpbnQgcmV0OworCisJX2VudGVyKCIiKTsKKworCW1zZy5tc2dfbmFtZQk9ICZjb25uLT50cmFucy0+cGVlci0+c3J4LnRyYW5zcG9ydC5zaW47CisJbXNnLm1zZ19uYW1lbGVuCT0gc2l6ZW9mKGNvbm4tPnRyYW5zLT5wZWVyLT5zcngudHJhbnNwb3J0LnNpbik7CisJbXNnLm1zZ19jb250cm9sCT0gTlVMTDsKKwltc2cubXNnX2NvbnRyb2xsZW4gPSAwOworCW1zZy5tc2dfZmxhZ3MJPSAwOworCisJaGRyLT5lcG9jaAk9IGNvbm4tPmVwb2NoOworCWhkci0+c2VxCT0gMDsKKwloZHItPnR5cGUJPSBSWFJQQ19QQUNLRVRfVFlQRV9SRVNQT05TRTsKKwloZHItPmZsYWdzCT0gY29ubi0+b3V0X2NsaWVudGZsYWc7CisJaGRyLT51c2VyU3RhdHVzCT0gMDsKKwloZHItPl9yc3ZkCT0gMDsKKworCWlvdlswXS5pb3ZfYmFzZQk9IGhkcjsKKwlpb3ZbMF0uaW92X2xlbgk9IHNpemVvZigqaGRyKTsKKwlpb3ZbMV0uaW92X2Jhc2UJPSByZXNwOworCWlvdlsxXS5pb3ZfbGVuCT0gc2l6ZW9mKCpyZXNwKTsKKwlpb3ZbMl0uaW92X2Jhc2UJPSAodm9pZCAqKSBzMi0+dGlja2V0OworCWlvdlsyXS5pb3ZfbGVuCT0gczItPnRpY2tldF9sZW47CisKKwlsZW4gPSBpb3ZbMF0uaW92X2xlbiArIGlvdlsxXS5pb3ZfbGVuICsgaW92WzJdLmlvdl9sZW47CisKKwloZHItPnNlcmlhbCA9IGh0b25sKGF0b21pY19pbmNfcmV0dXJuKCZjb25uLT5zZXJpYWwpKTsKKwlfcHJvdG8oIlR4IFJFU1BPTlNFICUlJXUiLCBudG9obChoZHItPnNlcmlhbCkpOworCisJcmV0ID0ga2VybmVsX3NlbmRtc2coY29ubi0+dHJhbnMtPmxvY2FsLT5zb2NrZXQsICZtc2csIGlvdiwgMywgbGVuKTsKKwlpZiAocmV0IDwgMCkgeworCQlfZGVidWcoInNlbmRtc2cgZmFpbGVkOiAlZCIsIHJldCk7CisJCXJldHVybiAtRUFHQUlOOworCX0KKworCV9sZWF2ZSgiID0gMCIpOworCXJldHVybiAwOworfQorCisvKgorICogY2FsY3VsYXRlIHRoZSByZXNwb25zZSBjaGVja3N1bQorICovCitzdGF0aWMgdm9pZCByeGthZF9jYWxjX3Jlc3BvbnNlX2NoZWNrc3VtKHN0cnVjdCByeGthZF9yZXNwb25zZSAqcmVzcG9uc2UpCit7CisJdTMyIGNzdW0gPSAxMDAwMDAzOworCWludCBsb29wOworCXU4ICpwID0gKHU4ICopIHJlc3BvbnNlOworCisJZm9yIChsb29wID0gc2l6ZW9mKCpyZXNwb25zZSk7IGxvb3AgPiAwOyBsb29wLS0pCisJCWNzdW0gPSBjc3VtICogMHgxMDIwNDA4MSArICpwKys7CisKKwlyZXNwb25zZS0+ZW5jcnlwdGVkLmNoZWNrc3VtID0gaHRvbmwoY3N1bSk7Cit9CisKKy8qCisgKiBsb2FkIGEgc2NhdHRlcmxpc3Qgd2l0aCBhIHBvdGVudGlhbGx5IHNwbGl0LXBhZ2UgYnVmZmVyCisgKi8KK3N0YXRpYyB2b2lkIHJ4a2FkX3NnX3NldF9idWYyKHN0cnVjdCBzY2F0dGVybGlzdCBzZ1syXSwKKwkJCSAgICAgIHZvaWQgKmJ1Ziwgc2l6ZV90IGJ1ZmxlbikKK3sKKworCW1lbXNldChzZywgMCwgc2l6ZW9mKHNnKSk7CisKKwlzZ19zZXRfYnVmKCZzZ1swXSwgYnVmLCBidWZsZW4pOworCWlmIChzZ1swXS5vZmZzZXQgKyBidWZsZW4gPiBQQUdFX1NJWkUpIHsKKwkJLyogdGhlIGJ1ZmZlciB3YXMgc3BsaXQgb3ZlciB0d28gcGFnZXMgKi8KKwkJc2dbMF0ubGVuZ3RoID0gUEFHRV9TSVpFIC0gc2dbMF0ub2Zmc2V0OworCQlzZ19zZXRfYnVmKCZzZ1sxXSwgYnVmICsgc2dbMF0ubGVuZ3RoLCBidWZsZW4gLSBzZ1swXS5sZW5ndGgpOworCX0KKworCUFTU0VSVENNUChzZ1swXS5sZW5ndGggKyBzZ1sxXS5sZW5ndGgsID09LCBidWZsZW4pOworfQorCisvKgorICogZW5jcnlwdCB0aGUgcmVzcG9uc2UgcGFja2V0CisgKi8KK3N0YXRpYyB2b2lkIHJ4a2FkX2VuY3J5cHRfcmVzcG9uc2Uoc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4sCisJCQkJICAgc3RydWN0IHJ4a2FkX3Jlc3BvbnNlICpyZXNwLAorCQkJCSAgIGNvbnN0IHN0cnVjdCByeGthZF9rZXkgKnMyKQoreworCXN0cnVjdCBibGtjaXBoZXJfZGVzYyBkZXNjOworCXN0cnVjdCByeHJwY19jcnlwdCBpdjsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc3NnWzJdLCBkc2dbMl07CisKKwkvKiBjb250aW51ZSBlbmNyeXB0aW5nIGZyb20gd2hlcmUgd2UgbGVmdCBvZmYgKi8KKwltZW1jcHkoJml2LCBzMi0+c2Vzc2lvbl9rZXksIHNpemVvZihpdikpOworCWRlc2MudGZtID0gY29ubi0+Y2lwaGVyOworCWRlc2MuaW5mbyA9IGl2Lng7CisJZGVzYy5mbGFncyA9IDA7CisKKwlyeGthZF9zZ19zZXRfYnVmMihzc2csICZyZXNwLT5lbmNyeXB0ZWQsIHNpemVvZihyZXNwLT5lbmNyeXB0ZWQpKTsKKwltZW1jcHkoZHNnLCBzc2csIHNpemVvZihkc2cpKTsKKwljcnlwdG9fYmxrY2lwaGVyX2VuY3J5cHRfaXYoJmRlc2MsIGRzZywgc3NnLCBzaXplb2YocmVzcC0+ZW5jcnlwdGVkKSk7Cit9CisKKy8qCisgKiByZXNwb25kIHRvIGEgY2hhbGxlbmdlIHBhY2tldAorICovCitzdGF0aWMgaW50IHJ4a2FkX3Jlc3BvbmRfdG9fY2hhbGxlbmdlKHN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uLAorCQkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IsCisJCQkJICAgICAgdTMyICpfYWJvcnRfY29kZSkKK3sKKwljb25zdCBzdHJ1Y3QgcnhycGNfa2V5X3BheWxvYWQgKnBheWxvYWQ7CisJc3RydWN0IHJ4a2FkX2NoYWxsZW5nZSBjaGFsbGVuZ2U7CisJc3RydWN0IHJ4a2FkX3Jlc3BvbnNlIHJlc3AKKwkJX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpOyAvKiBtdXN0IGJlIGFsaWduZWQgZm9yIGNyeXB0byAqLworCXN0cnVjdCByeHJwY19za2JfcHJpdiAqc3A7CisJdTMyIHZlcnNpb24sIG5vbmNlLCBtaW5fbGV2ZWwsIGFib3J0X2NvZGU7CisJaW50IHJldDsKKworCV9lbnRlcigieyVkLCV4fSIsIGNvbm4tPmRlYnVnX2lkLCBrZXlfc2VyaWFsKGNvbm4tPmtleSkpOworCisJaWYgKCFjb25uLT5rZXkpIHsKKwkJX2xlYXZlKCIgPSAtRVBST1RPIFtubyBrZXldIik7CisJCXJldHVybiAtRVBST1RPOworCX0KKworCXJldCA9IGtleV92YWxpZGF0ZShjb25uLT5rZXkpOworCWlmIChyZXQgPCAwKSB7CisJCSpfYWJvcnRfY29kZSA9IFJYS0FERVhQSVJFRDsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlhYm9ydF9jb2RlID0gUlhLQURQQUNLRVRTSE9SVDsKKwlzcCA9IHJ4cnBjX3NrYihza2IpOworCWlmIChza2JfY29weV9iaXRzKHNrYiwgMCwgJmNoYWxsZW5nZSwgc2l6ZW9mKGNoYWxsZW5nZSkpIDwgMCkKKwkJZ290byBwcm90b2NvbF9lcnJvcjsKKworCXZlcnNpb24gPSBudG9obChjaGFsbGVuZ2UudmVyc2lvbik7CisJbm9uY2UgPSBudG9obChjaGFsbGVuZ2Uubm9uY2UpOworCW1pbl9sZXZlbCA9IG50b2hsKGNoYWxsZW5nZS5taW5fbGV2ZWwpOworCisJX3Byb3RvKCJSeCBDSEFMTEVOR0UgJSUldSB7IHY9JXUgbj0ldSBtbD0ldSB9IiwKKwkgICAgICAgbnRvaGwoc3AtPmhkci5zZXJpYWwpLCB2ZXJzaW9uLCBub25jZSwgbWluX2xldmVsKTsKKworCWFib3J0X2NvZGUgPSBSWEtBRElOQ09OU0lTVEVOQ1k7CisJaWYgKHZlcnNpb24gIT0gUlhLQURfVkVSU0lPTikKKwkJZ290byBwcm90b2NvbF9lcnJvcjsKKworCWFib3J0X2NvZGUgPSBSWEtBRExFVkVMRkFJTDsKKwlpZiAoY29ubi0+c2VjdXJpdHlfbGV2ZWwgPCBtaW5fbGV2ZWwpCisJCWdvdG8gcHJvdG9jb2xfZXJyb3I7CisKKwlwYXlsb2FkID0gY29ubi0+a2V5LT5wYXlsb2FkLmRhdGE7CisKKwkvKiBidWlsZCB0aGUgcmVzcG9uc2UgcGFja2V0ICovCisJbWVtc2V0KCZyZXNwLCAwLCBzaXplb2YocmVzcCkpOworCisJcmVzcC52ZXJzaW9uID0gUlhLQURfVkVSU0lPTjsKKwlyZXNwLmVuY3J5cHRlZC5lcG9jaCA9IGNvbm4tPmVwb2NoOworCXJlc3AuZW5jcnlwdGVkLmNpZCA9IGNvbm4tPmNpZDsKKwlyZXNwLmVuY3J5cHRlZC5zZWN1cml0eUluZGV4ID0gaHRvbmwoY29ubi0+c2VjdXJpdHlfaXgpOworCXJlc3AuZW5jcnlwdGVkLmNhbGxfaWRbMF0gPQorCQkoY29ubi0+Y2hhbm5lbHNbMF0gPyBjb25uLT5jaGFubmVsc1swXS0+Y2FsbF9pZCA6IDApOworCXJlc3AuZW5jcnlwdGVkLmNhbGxfaWRbMV0gPQorCQkoY29ubi0+Y2hhbm5lbHNbMV0gPyBjb25uLT5jaGFubmVsc1sxXS0+Y2FsbF9pZCA6IDApOworCXJlc3AuZW5jcnlwdGVkLmNhbGxfaWRbMl0gPQorCQkoY29ubi0+Y2hhbm5lbHNbMl0gPyBjb25uLT5jaGFubmVsc1syXS0+Y2FsbF9pZCA6IDApOworCXJlc3AuZW5jcnlwdGVkLmNhbGxfaWRbM10gPQorCQkoY29ubi0+Y2hhbm5lbHNbM10gPyBjb25uLT5jaGFubmVsc1szXS0+Y2FsbF9pZCA6IDApOworCXJlc3AuZW5jcnlwdGVkLmluY19ub25jZSA9IGh0b25sKG5vbmNlICsgMSk7CisJcmVzcC5lbmNyeXB0ZWQubGV2ZWwgPSBodG9ubChjb25uLT5zZWN1cml0eV9sZXZlbCk7CisJcmVzcC5rdm5vID0gaHRvbmwocGF5bG9hZC0+ay5rdm5vKTsKKwlyZXNwLnRpY2tldF9sZW4gPSBodG9ubChwYXlsb2FkLT5rLnRpY2tldF9sZW4pOworCisJLyogY2FsY3VsYXRlIHRoZSByZXNwb25zZSBjaGVja3N1bSBhbmQgdGhlbiBkbyB0aGUgZW5jcnlwdGlvbiAqLworCXJ4a2FkX2NhbGNfcmVzcG9uc2VfY2hlY2tzdW0oJnJlc3ApOworCXJ4a2FkX2VuY3J5cHRfcmVzcG9uc2UoY29ubiwgJnJlc3AsICZwYXlsb2FkLT5rKTsKKwlyZXR1cm4gcnhrYWRfc2VuZF9yZXNwb25zZShjb25uLCAmc3AtPmhkciwgJnJlc3AsICZwYXlsb2FkLT5rKTsKKworcHJvdG9jb2xfZXJyb3I6CisJKl9hYm9ydF9jb2RlID0gYWJvcnRfY29kZTsKKwlfbGVhdmUoIiA9IC1FUFJPVE8gWyVkXSIsIGFib3J0X2NvZGUpOworCXJldHVybiAtRVBST1RPOworfQorCisvKgorICogZGVjcnlwdCB0aGUga2VyYmVyb3MgSVYgdGlja2V0IGluIHRoZSByZXNwb25zZQorICovCitzdGF0aWMgaW50IHJ4a2FkX2RlY3J5cHRfdGlja2V0KHN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uLAorCQkJCXZvaWQgKnRpY2tldCwgc2l6ZV90IHRpY2tldF9sZW4sCisJCQkJc3RydWN0IHJ4cnBjX2NyeXB0ICpfc2Vzc2lvbl9rZXksCisJCQkJdGltZV90ICpfZXhwaXJ5LAorCQkJCXUzMiAqX2Fib3J0X2NvZGUpCit7CisJc3RydWN0IGJsa2NpcGhlcl9kZXNjIGRlc2M7CisJc3RydWN0IHJ4cnBjX2NyeXB0IGl2LCBrZXk7CisJc3RydWN0IHNjYXR0ZXJsaXN0IHNzZ1sxXSwgZHNnWzFdOworCXN0cnVjdCBpbl9hZGRyIGFkZHI7CisJdW5zaWduZWQgbGlmZTsKKwl0aW1lX3QgaXNzdWUsIG5vdzsKKwlib29sIGxpdHRsZV9lbmRpYW47CisJaW50IHJldDsKKwl1OCAqcCwgKnEsICpuYW1lLCAqZW5kOworCisJX2VudGVyKCJ7JWR9LHsleH0iLCBjb25uLT5kZWJ1Z19pZCwga2V5X3NlcmlhbChjb25uLT5zZXJ2ZXJfa2V5KSk7CisKKwkqX2V4cGlyeSA9IDA7CisKKwlyZXQgPSBrZXlfdmFsaWRhdGUoY29ubi0+c2VydmVyX2tleSk7CisJaWYgKHJldCA8IDApIHsKKwkJc3dpdGNoIChyZXQpIHsKKwkJY2FzZSAtRUtFWUVYUElSRUQ6CisJCQkqX2Fib3J0X2NvZGUgPSBSWEtBREVYUElSRUQ7CisJCQlnb3RvIGVycm9yOworCQlkZWZhdWx0OgorCQkJKl9hYm9ydF9jb2RlID0gUlhLQUROT0FVVEg7CisJCQlnb3RvIGVycm9yOworCQl9CisJfQorCisJQVNTRVJUKGNvbm4tPnNlcnZlcl9rZXktPnBheWxvYWQuZGF0YSAhPSBOVUxMKTsKKwlBU1NFUlRDTVAoKHVuc2lnbmVkIGxvbmcpIHRpY2tldCAmIDdVTCwgPT0sIDApOworCisJbWVtY3B5KCZpdiwgJmNvbm4tPnNlcnZlcl9rZXktPnR5cGVfZGF0YSwgc2l6ZW9mKGl2KSk7CisKKwlkZXNjLnRmbSA9IGNvbm4tPnNlcnZlcl9rZXktPnBheWxvYWQuZGF0YTsKKwlkZXNjLmluZm8gPSBpdi54OworCWRlc2MuZmxhZ3MgPSAwOworCisJc2dfaW5pdF9vbmUoJnNzZ1swXSwgdGlja2V0LCB0aWNrZXRfbGVuKTsKKwltZW1jcHkoZHNnLCBzc2csIHNpemVvZihkc2cpKTsKKwljcnlwdG9fYmxrY2lwaGVyX2RlY3J5cHRfaXYoJmRlc2MsIGRzZywgc3NnLCB0aWNrZXRfbGVuKTsKKworCXAgPSB0aWNrZXQ7CisJZW5kID0gcCArIHRpY2tldF9sZW47CisKKyNkZWZpbmUgWihzaXplKQkJCQkJCVwKKwkoewkJCQkJCVwKKwkJdTggKl9fc3RyID0gcDsJCQkJXAorCQlxID0gbWVtY2hyKHAsIDAsIGVuZCAtIHApOwkJXAorCQlpZiAoIXEgfHwgcSAtIHAgPiAoc2l6ZSkpCQlcCisJCQlnb3RvIGJhZF90aWNrZXQ7CQlcCisJCWZvciAoOyBwIDwgcTsgcCsrKQkJCVwKKwkJCWlmICghaXNwcmludCgqcCkpCQlcCisJCQkJZ290byBiYWRfdGlja2V0OwlcCisJCXArKzsJCQkJCVwKKwkJX19zdHI7CQkJCQlcCisJfSkKKworCS8qIGV4dHJhY3QgdGhlIHRpY2tldCBmbGFncyAqLworCV9kZWJ1ZygiS0lWIEZMQUdTOiAleCIsICpwKTsKKwlsaXR0bGVfZW5kaWFuID0gKnAgJiAxOworCXArKzsKKworCS8qIGV4dHJhY3QgdGhlIGF1dGhlbnRpY2F0aW9uIG5hbWUgKi8KKwluYW1lID0gWihBTkFNRV9TWik7CisJX2RlYnVnKCJLSVYgQU5BTUU6ICVzIiwgbmFtZSk7CisKKwkvKiBleHRyYWN0IHRoZSBwcmluY2lwYWwncyBpbnN0YW5jZSAqLworCW5hbWUgPSBaKElOU1RfU1opOworCV9kZWJ1ZygiS0lWIElOU1QgOiAlcyIsIG5hbWUpOworCisJLyogZXh0cmFjdCB0aGUgcHJpbmNpcGFsJ3MgYXV0aGVudGljYXRpb24gZG9tYWluICovCisJbmFtZSA9IFooUkVBTE1fU1opOworCV9kZWJ1ZygiS0lWIFJFQUxNOiAlcyIsIG5hbWUpOworCisJaWYgKGVuZCAtIHAgPCA0ICsgOCArIDQgKyAyKQorCQlnb3RvIGJhZF90aWNrZXQ7CisKKwkvKiBnZXQgdGhlIElQdjQgYWRkcmVzcyBvZiB0aGUgZW50aXR5IHRoYXQgcmVxdWVzdGVkIHRoZSB0aWNrZXQgKi8KKwltZW1jcHkoJmFkZHIsIHAsIHNpemVvZihhZGRyKSk7CisJcCArPSA0OworCV9kZWJ1ZygiS0lWIEFERFIgOiAiTklQUVVBRF9GTVQsIE5JUFFVQUQoYWRkcikpOworCisJLyogZ2V0IHRoZSBzZXNzaW9uIGtleSBmcm9tIHRoZSB0aWNrZXQgKi8KKwltZW1jcHkoJmtleSwgcCwgc2l6ZW9mKGtleSkpOworCXAgKz0gODsKKwlfZGVidWcoIktJViBLRVkgIDogJTA4eCAlMDh4IiwgbnRvaGwoa2V5Lm5bMF0pLCBudG9obChrZXkublsxXSkpOworCW1lbWNweShfc2Vzc2lvbl9rZXksICZrZXksIHNpemVvZihrZXkpKTsKKworCS8qIGdldCB0aGUgdGlja2V0J3MgbGlmZXRpbWUgKi8KKwlsaWZlID0gKnArKyAqIDUgKiA2MDsKKwlfZGVidWcoIktJViBMSUZFIDogJXUiLCBsaWZlKTsKKworCS8qIGdldCB0aGUgaXNzdWUgdGltZSBvZiB0aGUgdGlja2V0ICovCisJaWYgKGxpdHRsZV9lbmRpYW4pIHsKKwkJX19sZTMyIHN0YW1wOworCQltZW1jcHkoJnN0YW1wLCBwLCA0KTsKKwkJaXNzdWUgPSBsZTMyX3RvX2NwdShzdGFtcCk7CisJfSBlbHNlIHsKKwkJX19iZTMyIHN0YW1wOworCQltZW1jcHkoJnN0YW1wLCBwLCA0KTsKKwkJaXNzdWUgPSBiZTMyX3RvX2NwdShzdGFtcCk7CisJfQorCXAgKz0gNDsKKwlub3cgPSB4dGltZS50dl9zZWM7CisJX2RlYnVnKCJLSVYgSVNTVUU6ICVseCBbJWx4XSIsIGlzc3VlLCBub3cpOworCisJLyogY2hlY2sgdGhlIHRpY2tldCBpcyBpbiBkYXRlICovCisJaWYgKGlzc3VlID4gbm93KSB7CisJCSpfYWJvcnRfY29kZSA9IFJYS0FETk9BVVRIOworCQlyZXQgPSAtRUtFWVJFSkVDVEVEOworCQlnb3RvIGVycm9yOworCX0KKworCWlmIChpc3N1ZSA8IG5vdyAtIGxpZmUpIHsKKwkJKl9hYm9ydF9jb2RlID0gUlhLQURFWFBJUkVEOworCQlyZXQgPSAtRUtFWUVYUElSRUQ7CisJCWdvdG8gZXJyb3I7CisJfQorCisJKl9leHBpcnkgPSBpc3N1ZSArIGxpZmU7CisKKwkvKiBnZXQgdGhlIHNlcnZpY2UgbmFtZSAqLworCW5hbWUgPSBaKFNOQU1FX1NaKTsKKwlfZGVidWcoIktJViBTTkFNRTogJXMiLCBuYW1lKTsKKworCS8qIGdldCB0aGUgc2VydmljZSBpbnN0YW5jZSBuYW1lICovCisJbmFtZSA9IFooSU5TVF9TWik7CisJX2RlYnVnKCJLSVYgU0lOU1Q6ICVzIiwgbmFtZSk7CisKKwlyZXQgPSAwOworZXJyb3I6CisJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJcmV0dXJuIHJldDsKKworYmFkX3RpY2tldDoKKwkqX2Fib3J0X2NvZGUgPSBSWEtBREJBRFRJQ0tFVDsKKwlyZXQgPSAtRUJBRE1TRzsKKwlnb3RvIGVycm9yOworfQorCisvKgorICogZGVjcnlwdCB0aGUgcmVzcG9uc2UgcGFja2V0CisgKi8KK3N0YXRpYyB2b2lkIHJ4a2FkX2RlY3J5cHRfcmVzcG9uc2Uoc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4sCisJCQkJICAgc3RydWN0IHJ4a2FkX3Jlc3BvbnNlICpyZXNwLAorCQkJCSAgIGNvbnN0IHN0cnVjdCByeHJwY19jcnlwdCAqc2Vzc2lvbl9rZXkpCit7CisJc3RydWN0IGJsa2NpcGhlcl9kZXNjIGRlc2M7CisJc3RydWN0IHNjYXR0ZXJsaXN0IHNzZ1syXSwgZHNnWzJdOworCXN0cnVjdCByeHJwY19jcnlwdCBpdjsKKworCV9lbnRlcigiLCwlMDh4JTA4eCIsCisJICAgICAgIG50b2hsKHNlc3Npb25fa2V5LT5uWzBdKSwgbnRvaGwoc2Vzc2lvbl9rZXktPm5bMV0pKTsKKworCUFTU0VSVChyeGthZF9jaSAhPSBOVUxMKTsKKworCW11dGV4X2xvY2soJnJ4a2FkX2NpX211dGV4KTsKKwlpZiAoY3J5cHRvX2Jsa2NpcGhlcl9zZXRrZXkocnhrYWRfY2ksIHNlc3Npb25fa2V5LT54LAorCQkJCSAgICBzaXplb2YoKnNlc3Npb25fa2V5KSkgPCAwKQorCQlCVUcoKTsKKworCW1lbWNweSgmaXYsIHNlc3Npb25fa2V5LCBzaXplb2YoaXYpKTsKKwlkZXNjLnRmbSA9IHJ4a2FkX2NpOworCWRlc2MuaW5mbyA9IGl2Lng7CisJZGVzYy5mbGFncyA9IDA7CisKKwlyeGthZF9zZ19zZXRfYnVmMihzc2csICZyZXNwLT5lbmNyeXB0ZWQsIHNpemVvZihyZXNwLT5lbmNyeXB0ZWQpKTsKKwltZW1jcHkoZHNnLCBzc2csIHNpemVvZihkc2cpKTsKKwljcnlwdG9fYmxrY2lwaGVyX2RlY3J5cHRfaXYoJmRlc2MsIGRzZywgc3NnLCBzaXplb2YocmVzcC0+ZW5jcnlwdGVkKSk7CisJbXV0ZXhfdW5sb2NrKCZyeGthZF9jaV9tdXRleCk7CisKKwlfbGVhdmUoIiIpOworfQorCisvKgorICogdmVyaWZ5IGEgcmVzcG9uc2UKKyAqLworc3RhdGljIGludCByeGthZF92ZXJpZnlfcmVzcG9uc2Uoc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4sCisJCQkJIHN0cnVjdCBza19idWZmICpza2IsCisJCQkJIHUzMiAqX2Fib3J0X2NvZGUpCit7CisJc3RydWN0IHJ4a2FkX3Jlc3BvbnNlIHJlc3BvbnNlCisJCV9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKTsgLyogbXVzdCBiZSBhbGlnbmVkIGZvciBjcnlwdG8gKi8KKwlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwOworCXN0cnVjdCByeHJwY19jcnlwdCBzZXNzaW9uX2tleTsKKwl0aW1lX3QgZXhwaXJ5OworCXZvaWQgKnRpY2tldDsKKwl1MzIgYWJvcnRfY29kZSwgdmVyc2lvbiwga3ZubywgdGlja2V0X2xlbiwgY3N1bSwgbGV2ZWw7CisJaW50IHJldDsKKworCV9lbnRlcigieyVkLCV4fSIsIGNvbm4tPmRlYnVnX2lkLCBrZXlfc2VyaWFsKGNvbm4tPnNlcnZlcl9rZXkpKTsKKworCWFib3J0X2NvZGUgPSBSWEtBRFBBQ0tFVFNIT1JUOworCWlmIChza2JfY29weV9iaXRzKHNrYiwgMCwgJnJlc3BvbnNlLCBzaXplb2YocmVzcG9uc2UpKSA8IDApCisJCWdvdG8gcHJvdG9jb2xfZXJyb3I7CisJaWYgKCFwc2tiX3B1bGwoc2tiLCBzaXplb2YocmVzcG9uc2UpKSkKKwkJQlVHKCk7CisKKwl2ZXJzaW9uID0gbnRvaGwocmVzcG9uc2UudmVyc2lvbik7CisJdGlja2V0X2xlbiA9IG50b2hsKHJlc3BvbnNlLnRpY2tldF9sZW4pOworCWt2bm8gPSBudG9obChyZXNwb25zZS5rdm5vKTsKKwlzcCA9IHJ4cnBjX3NrYihza2IpOworCV9wcm90bygiUnggUkVTUE9OU0UgJSUldSB7IHY9JXUga3Y9JXUgdGw9JXUgfSIsCisJICAgICAgIG50b2hsKHNwLT5oZHIuc2VyaWFsKSwgdmVyc2lvbiwga3ZubywgdGlja2V0X2xlbik7CisKKwlhYm9ydF9jb2RlID0gUlhLQURJTkNPTlNJU1RFTkNZOworCWlmICh2ZXJzaW9uICE9IFJYS0FEX1ZFUlNJT04pCisKKwlhYm9ydF9jb2RlID0gUlhLQURUSUNLRVRMRU47CisJaWYgKHRpY2tldF9sZW4gPCA0IHx8IHRpY2tldF9sZW4gPiBNQVhLUkI1VElDS0VUTEVOKQorCQlnb3RvIHByb3RvY29sX2Vycm9yOworCisJYWJvcnRfY29kZSA9IFJYS0FEVU5LTk9XTktFWTsKKwlpZiAoa3ZubyA+PSBSWEtBRF9US1RfVFlQRV9LRVJCRVJPU19WNSkKKwkJZ290byBwcm90b2NvbF9lcnJvcjsKKworCS8qIGV4dHJhY3QgdGhlIGtlcmJlcm9zIHRpY2tldCBhbmQgZGVjcnlwdCBhbmQgZGVjb2RlIGl0ICovCisJdGlja2V0ID0ga21hbGxvYyh0aWNrZXRfbGVuLCBHRlBfTk9GUyk7CisJaWYgKCF0aWNrZXQpCisJCXJldHVybiAtRU5PTUVNOworCisJYWJvcnRfY29kZSA9IFJYS0FEUEFDS0VUU0hPUlQ7CisJaWYgKHNrYl9jb3B5X2JpdHMoc2tiLCAwLCB0aWNrZXQsIHRpY2tldF9sZW4pIDwgMCkKKwkJZ290byBwcm90b2NvbF9lcnJvcl9mcmVlOworCisJcmV0ID0gcnhrYWRfZGVjcnlwdF90aWNrZXQoY29ubiwgdGlja2V0LCB0aWNrZXRfbGVuLCAmc2Vzc2lvbl9rZXksCisJCQkJICAgJmV4cGlyeSwgJmFib3J0X2NvZGUpOworCWlmIChyZXQgPCAwKSB7CisJCSpfYWJvcnRfY29kZSA9IGFib3J0X2NvZGU7CisJCWtmcmVlKHRpY2tldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogdXNlIHRoZSBzZXNzaW9uIGtleSBmcm9tIGluc2lkZSB0aGUgdGlja2V0IHRvIGRlY3J5cHQgdGhlCisJICogcmVzcG9uc2UgKi8KKwlyeGthZF9kZWNyeXB0X3Jlc3BvbnNlKGNvbm4sICZyZXNwb25zZSwgJnNlc3Npb25fa2V5KTsKKworCWFib3J0X2NvZGUgPSBSWEtBRFNFQUxFRElOQ09OOworCWlmIChyZXNwb25zZS5lbmNyeXB0ZWQuZXBvY2ggIT0gY29ubi0+ZXBvY2gpCisJCWdvdG8gcHJvdG9jb2xfZXJyb3JfZnJlZTsKKwlpZiAocmVzcG9uc2UuZW5jcnlwdGVkLmNpZCAhPSBjb25uLT5jaWQpCisJCWdvdG8gcHJvdG9jb2xfZXJyb3JfZnJlZTsKKwlpZiAobnRvaGwocmVzcG9uc2UuZW5jcnlwdGVkLnNlY3VyaXR5SW5kZXgpICE9IGNvbm4tPnNlY3VyaXR5X2l4KQorCQlnb3RvIHByb3RvY29sX2Vycm9yX2ZyZWU7CisJY3N1bSA9IHJlc3BvbnNlLmVuY3J5cHRlZC5jaGVja3N1bTsKKwlyZXNwb25zZS5lbmNyeXB0ZWQuY2hlY2tzdW0gPSAwOworCXJ4a2FkX2NhbGNfcmVzcG9uc2VfY2hlY2tzdW0oJnJlc3BvbnNlKTsKKwlpZiAocmVzcG9uc2UuZW5jcnlwdGVkLmNoZWNrc3VtICE9IGNzdW0pCisJCWdvdG8gcHJvdG9jb2xfZXJyb3JfZnJlZTsKKworCWlmIChudG9obChyZXNwb25zZS5lbmNyeXB0ZWQuY2FsbF9pZFswXSkgPiBJTlRfTUFYIHx8CisJICAgIG50b2hsKHJlc3BvbnNlLmVuY3J5cHRlZC5jYWxsX2lkWzFdKSA+IElOVF9NQVggfHwKKwkgICAgbnRvaGwocmVzcG9uc2UuZW5jcnlwdGVkLmNhbGxfaWRbMl0pID4gSU5UX01BWCB8fAorCSAgICBudG9obChyZXNwb25zZS5lbmNyeXB0ZWQuY2FsbF9pZFszXSkgPiBJTlRfTUFYKQorCQlnb3RvIHByb3RvY29sX2Vycm9yX2ZyZWU7CisKKwlhYm9ydF9jb2RlID0gUlhLQURPVVRPRlNFUVVFTkNFOworCWlmIChyZXNwb25zZS5lbmNyeXB0ZWQuaW5jX25vbmNlICE9IGh0b25sKGNvbm4tPnNlY3VyaXR5X25vbmNlICsgMSkpCisJCWdvdG8gcHJvdG9jb2xfZXJyb3JfZnJlZTsKKworCWFib3J0X2NvZGUgPSBSWEtBRExFVkVMRkFJTDsKKwlsZXZlbCA9IG50b2hsKHJlc3BvbnNlLmVuY3J5cHRlZC5sZXZlbCk7CisJaWYgKGxldmVsID4gUlhSUENfU0VDVVJJVFlfRU5DUllQVCkKKwkJZ290byBwcm90b2NvbF9lcnJvcl9mcmVlOworCWNvbm4tPnNlY3VyaXR5X2xldmVsID0gbGV2ZWw7CisKKwkvKiBjcmVhdGUgYSBrZXkgdG8gaG9sZCB0aGUgc2VjdXJpdHkgZGF0YSBhbmQgZXhwaXJhdGlvbiB0aW1lIC0gYWZ0ZXIKKwkgKiB0aGlzIHRoZSBjb25uZWN0aW9uIHNlY3VyaXR5IGNhbiBiZSBoYW5kbGVkIGluIGV4YWN0bHkgdGhlIHNhbWUgd2F5CisJICogYXMgZm9yIGEgY2xpZW50IGNvbm5lY3Rpb24gKi8KKwlyZXQgPSByeHJwY19nZXRfc2VydmVyX2RhdGFfa2V5KGNvbm4sICZzZXNzaW9uX2tleSwgZXhwaXJ5LCBrdm5vKTsKKwlpZiAocmV0IDwgMCkgeworCQlrZnJlZSh0aWNrZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWtmcmVlKHRpY2tldCk7CisJX2xlYXZlKCIgPSAwIik7CisJcmV0dXJuIDA7CisKK3Byb3RvY29sX2Vycm9yX2ZyZWU6CisJa2ZyZWUodGlja2V0KTsKK3Byb3RvY29sX2Vycm9yOgorCSpfYWJvcnRfY29kZSA9IGFib3J0X2NvZGU7CisJX2xlYXZlKCIgPSAtRVBST1RPIFslZF0iLCBhYm9ydF9jb2RlKTsKKwlyZXR1cm4gLUVQUk9UTzsKK30KKworLyoKKyAqIGNsZWFyIHRoZSBjb25uZWN0aW9uIHNlY3VyaXR5CisgKi8KK3N0YXRpYyB2b2lkIHJ4a2FkX2NsZWFyKHN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uKQoreworCV9lbnRlcigiIik7CisKKwlpZiAoY29ubi0+Y2lwaGVyKQorCQljcnlwdG9fZnJlZV9ibGtjaXBoZXIoY29ubi0+Y2lwaGVyKTsKK30KKworLyoKKyAqIFJ4UlBDIEtlcmJlcm9zLWJhc2VkIHNlY3VyaXR5CisgKi8KK3N0YXRpYyBzdHJ1Y3QgcnhycGNfc2VjdXJpdHkgcnhrYWQgPSB7CisJLm93bmVyCQkJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCQkJPSAicnhrYWQiLAorCS5zZWN1cml0eV9pbmRleAkJCT0gUlhLQURfVkVSU0lPTiwKKwkuaW5pdF9jb25uZWN0aW9uX3NlY3VyaXR5CT0gcnhrYWRfaW5pdF9jb25uZWN0aW9uX3NlY3VyaXR5LAorCS5wcmltZV9wYWNrZXRfc2VjdXJpdHkJCT0gcnhrYWRfcHJpbWVfcGFja2V0X3NlY3VyaXR5LAorCS5zZWN1cmVfcGFja2V0CQkJPSByeGthZF9zZWN1cmVfcGFja2V0LAorCS52ZXJpZnlfcGFja2V0CQkJPSByeGthZF92ZXJpZnlfcGFja2V0LAorCS5pc3N1ZV9jaGFsbGVuZ2UJCT0gcnhrYWRfaXNzdWVfY2hhbGxlbmdlLAorCS5yZXNwb25kX3RvX2NoYWxsZW5nZQkJPSByeGthZF9yZXNwb25kX3RvX2NoYWxsZW5nZSwKKwkudmVyaWZ5X3Jlc3BvbnNlCQk9IHJ4a2FkX3ZlcmlmeV9yZXNwb25zZSwKKwkuY2xlYXIJCQkJPSByeGthZF9jbGVhciwKK307CisKK3N0YXRpYyBfX2luaXQgaW50IHJ4a2FkX2luaXQodm9pZCkKK3sKKwlfZW50ZXIoIiIpOworCisJLyogcGluIHRoZSBjaXBoZXIgd2UgbmVlZCBzbyB0aGF0IHRoZSBjcnlwdG8gbGF5ZXIgZG9lc24ndCBpbnZva2UKKwkgKiBrZXZlbnRkIHRvIGdvIGdldCBpdCAqLworCXJ4a2FkX2NpID0gY3J5cHRvX2FsbG9jX2Jsa2NpcGhlcigicGNiYyhmY3J5cHQpIiwgMCwgQ1JZUFRPX0FMR19BU1lOQyk7CisJaWYgKElTX0VSUihyeGthZF9jaSkpCisJCXJldHVybiBQVFJfRVJSKHJ4a2FkX2NpKTsKKworCXJldHVybiByeHJwY19yZWdpc3Rlcl9zZWN1cml0eSgmcnhrYWQpOworfQorCittb2R1bGVfaW5pdChyeGthZF9pbml0KTsKKworc3RhdGljIF9fZXhpdCB2b2lkIHJ4a2FkX2V4aXQodm9pZCkKK3sKKwlfZW50ZXIoIiIpOworCisJcnhycGNfdW5yZWdpc3Rlcl9zZWN1cml0eSgmcnhrYWQpOworCWNyeXB0b19mcmVlX2Jsa2NpcGhlcihyeGthZF9jaSk7Cit9CisKK21vZHVsZV9leGl0KHJ4a2FkX2V4aXQpOwpkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL3J4cnBjX3N5bXMuYyBiL25ldC9yeHJwYy9yeHJwY19zeW1zLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4OTZmZDguLjAwMDAwMDAKLS0tIGEvbmV0L3J4cnBjL3J4cnBjX3N5bXMuYworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qIHJ4cnBjX3N5bXMuYzogZXhwb3J0ZWQgUnggUlBDIGxheWVyIGludGVyZmFjZSBzeW1ib2xzCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLQotI2luY2x1ZGUgPHJ4cnBjL3RyYW5zcG9ydC5oPgotI2luY2x1ZGUgPHJ4cnBjL2Nvbm5lY3Rpb24uaD4KLSNpbmNsdWRlIDxyeHJwYy9jYWxsLmg+Ci0jaW5jbHVkZSA8cnhycGMva3J4aW9kLmg+Ci0KLS8qIGNhbGwuYyAqLwotRVhQT1JUX1NZTUJPTChyeHJwY19jcmVhdGVfY2FsbCk7Ci1FWFBPUlRfU1lNQk9MKHJ4cnBjX3B1dF9jYWxsKTsKLUVYUE9SVF9TWU1CT0wocnhycGNfY2FsbF9hYm9ydCk7Ci1FWFBPUlRfU1lNQk9MKHJ4cnBjX2NhbGxfcmVhZF9kYXRhKTsKLUVYUE9SVF9TWU1CT0wocnhycGNfY2FsbF93cml0ZV9kYXRhKTsKLQotLyogY29ubmVjdGlvbi5jICovCi1FWFBPUlRfU1lNQk9MKHJ4cnBjX2NyZWF0ZV9jb25uZWN0aW9uKTsKLUVYUE9SVF9TWU1CT0wocnhycGNfcHV0X2Nvbm5lY3Rpb24pOwotCi0vKiB0cmFuc3BvcnQuYyAqLwotRVhQT1JUX1NZTUJPTChyeHJwY19jcmVhdGVfdHJhbnNwb3J0KTsKLUVYUE9SVF9TWU1CT0wocnhycGNfcHV0X3RyYW5zcG9ydCk7Ci1FWFBPUlRfU1lNQk9MKHJ4cnBjX2FkZF9zZXJ2aWNlKTsKLUVYUE9SVF9TWU1CT0wocnhycGNfZGVsX3NlcnZpY2UpOwpkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL3N5c2N0bC5jIGIvbmV0L3J4cnBjL3N5c2N0bC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODQyOTA3Li4wMDAwMDAwCi0tLSBhL25ldC9yeHJwYy9zeXNjdGwuYworKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKiBzeXNjdGwuYzogUnggUlBDIGNvbnRyb2wKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgotI2luY2x1ZGUgPHJ4cnBjL3R5cGVzLmg+Ci0jaW5jbHVkZSA8cnhycGMvcnhycGMuaD4KLSNpbmNsdWRlIDxhc20vZXJybm8uaD4KLSNpbmNsdWRlICJpbnRlcm5hbC5oIgotCi1pbnQgcnhycGNfa3RyYWNlOwotaW50IHJ4cnBjX2tkZWJ1ZzsKLWludCByeHJwY19rcHJvdG87Ci1pbnQgcnhycGNfa25ldDsKLQotI2lmZGVmIENPTkZJR19TWVNDVEwKLXN0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlciAqcnhycGNfc3lzY3RsID0gTlVMTDsKLQotc3RhdGljIGN0bF90YWJsZSByeHJwY19zeXNjdGxfdGFibGVbXSA9IHsKLQl7Ci0JCS5jdGxfbmFtZQk9IDEsCi0JCS5wcm9jbmFtZQk9ICJrZGVidWciLAotCQkuZGF0YQkJPSAmcnhycGNfa2RlYnVnLAotCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAotCQkubW9kZQkJPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMKLQl9LAotCXsKLQkJLmN0bF9uYW1lCT0gMiwKLQkJLnByb2NuYW1lCT0gImt0cmFjZSIsCi0JCS5kYXRhCQk9ICZyeHJwY19rdHJhY2UsCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCi0JCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYwotCX0sCi0JewotCQkuY3RsX25hbWUJPSAzLAotCQkucHJvY25hbWUJPSAia3Byb3RvIiwKLQkJLmRhdGEJCT0gJnJ4cnBjX2twcm90bywKLQkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjCi0JfSwKLQl7Ci0JCS5jdGxfbmFtZQk9IDQsCi0JCS5wcm9jbmFtZQk9ICJrbmV0IiwKLQkJLmRhdGEJCT0gJnJ4cnBjX2tuZXQsCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCi0JCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYwotCX0sCi0JewotCQkuY3RsX25hbWUJPSA1LAotCQkucHJvY25hbWUJPSAicGVlcnRpbW8iLAotCQkuZGF0YQkJPSAmcnhycGNfcGVlcl90aW1lb3V0LAotCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBsb25nKSwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvdWxvbmd2ZWNfbWlubWF4Ci0JfSwKLQl7Ci0JCS5jdGxfbmFtZQk9IDYsCi0JCS5wcm9jbmFtZQk9ICJjb25udGltbyIsCi0JCS5kYXRhCQk9ICZyeHJwY19jb25uX3RpbWVvdXQsCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpLAotCQkubW9kZQkJPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG91bG9uZ3ZlY19taW5tYXgKLQl9LAotCXsgLmN0bF9uYW1lID0gMCB9Ci19OwotCi1zdGF0aWMgY3RsX3RhYmxlIHJ4cnBjX2Rpcl9zeXNjdGxfdGFibGVbXSA9IHsKLQl7Ci0JCS5jdGxfbmFtZQk9IDEsCi0JCS5wcm9jbmFtZQk9ICJyeHJwYyIsCi0JCS5tYXhsZW4JCT0gMCwKLQkJLm1vZGUJCT0gMDU1NSwKLQkJLmNoaWxkCQk9IHJ4cnBjX3N5c2N0bF90YWJsZQotCX0sCi0JeyAuY3RsX25hbWUgPSAwIH0KLX07Ci0jZW5kaWYgLyogQ09ORklHX1NZU0NUTCAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogaW5pdGlhbGlzZSB0aGUgc3lzY3RsIHN0dWZmIGZvciBSeCBSUEMKLSAqLwotaW50IHJ4cnBjX3N5c2N0bF9pbml0KHZvaWQpCi17Ci0jaWZkZWYgQ09ORklHX1NZU0NUTAotCXJ4cnBjX3N5c2N0bCA9IHJlZ2lzdGVyX3N5c2N0bF90YWJsZShyeHJwY19kaXJfc3lzY3RsX3RhYmxlKTsKLQlpZiAoIXJ4cnBjX3N5c2N0bCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0jZW5kaWYgLyogQ09ORklHX1NZU0NUTCAqLwotCi0JcmV0dXJuIDA7Ci19IC8qIGVuZCByeHJwY19zeXNjdGxfaW5pdCgpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBjbGVhbiB1cCB0aGUgc3lzY3RsIHN0dWZmIGZvciBSeCBSUEMKLSAqLwotdm9pZCByeHJwY19zeXNjdGxfY2xlYW51cCh2b2lkKQotewotI2lmZGVmIENPTkZJR19TWVNDVEwKLQlpZiAocnhycGNfc3lzY3RsKSB7Ci0JCXVucmVnaXN0ZXJfc3lzY3RsX3RhYmxlKHJ4cnBjX3N5c2N0bCk7Ci0JCXJ4cnBjX3N5c2N0bCA9IE5VTEw7Ci0JfQotI2VuZGlmIC8qIENPTkZJR19TWVNDVEwgKi8KLQotfSAvKiBlbmQgcnhycGNfc3lzY3RsX2NsZWFudXAoKSAqLwpkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL3RyYW5zcG9ydC5jIGIvbmV0L3J4cnBjL3RyYW5zcG9ydC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTU3YmUyLi4wMDAwMDAwCi0tLSBhL25ldC9yeHJwYy90cmFuc3BvcnQuYworKysgL2Rldi9udWxsCkBAIC0xLDg0NiArMCwwIEBACi0vKiB0cmFuc3BvcnQuYzogUnggVHJhbnNwb3J0IHJvdXRpbmVzCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8cnhycGMvdHJhbnNwb3J0Lmg+Ci0jaW5jbHVkZSA8cnhycGMvcGVlci5oPgotI2luY2x1ZGUgPHJ4cnBjL2Nvbm5lY3Rpb24uaD4KLSNpbmNsdWRlIDxyeHJwYy9jYWxsLmg+Ci0jaW5jbHVkZSA8cnhycGMvbWVzc2FnZS5oPgotI2luY2x1ZGUgPHJ4cnBjL2tyeGlvZC5oPgotI2luY2x1ZGUgPHJ4cnBjL2tyeHNlY2QuaD4KLSNpbmNsdWRlIDxsaW51eC91ZHAuaD4KLSNpbmNsdWRlIDxsaW51eC9pbi5oPgotI2luY2x1ZGUgPGxpbnV4L2luNi5oPgotI2luY2x1ZGUgPGxpbnV4L2ljbXAuaD4KLSNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLSNpbmNsdWRlIDxuZXQvc29jay5oPgotI2luY2x1ZGUgPG5ldC9pcC5oPgotI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQgKENPTkZJR19JUFY2X01PRFVMRSkKLSNpbmNsdWRlIDxsaW51eC9pcHY2Lmg+CS8qIHRoaXMgc2hvdWxkIF9yZWFsbHlfIGJlIGluIGVycnF1ZXVlLmguLiAqLwotI2VuZGlmCi0jaW5jbHVkZSA8bGludXgvZXJycXVldWUuaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotI2luY2x1ZGUgImludGVybmFsLmgiCi0KLXN0cnVjdCBlcnJvcm1zZyB7Ci0Jc3RydWN0IGNtc2doZHIJCQljbXNnOwkJLyogY29udHJvbCBtZXNzYWdlIGhlYWRlciAqLwotCXN0cnVjdCBzb2NrX2V4dGVuZGVkX2VycgllZTsJCS8qIGV4dGVuZGVkIGVycm9yIGluZm9ybWF0aW9uICovCi0Jc3RydWN0IHNvY2thZGRyX2luCQlpY21wX3NyYzsJLyogSUNNUCBwYWNrZXQgc291cmNlIGFkZHJlc3MgKi8KLX07Ci0KLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0socnhycGNfdHJhbnNwb3J0c19sb2NrKTsKLXN0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIHJ4cnBjX3RyYW5zcG9ydHMgPSBMSVNUX0hFQURfSU5JVChyeHJwY190cmFuc3BvcnRzKTsKLQotX19SWEFDQ1RfREVDTChhdG9taWNfdCByeHJwY190cmFuc3BvcnRfY291bnQpOwotTElTVF9IRUFEKHJ4cnBjX3Byb2NfdHJhbnNwb3J0cyk7Ci1ERUNMQVJFX1JXU0VNKHJ4cnBjX3Byb2NfdHJhbnNwb3J0c19zZW0pOwotCi1zdGF0aWMgdm9pZCByeHJwY19kYXRhX3JlYWR5KHN0cnVjdCBzb2NrICpzaywgaW50IGNvdW50KTsKLXN0YXRpYyB2b2lkIHJ4cnBjX2Vycm9yX3JlcG9ydChzdHJ1Y3Qgc29jayAqc2spOwotc3RhdGljIGludCByeHJwY190cmFuc19yZWNlaXZlX25ld19jYWxsKHN0cnVjdCByeHJwY190cmFuc3BvcnQgKnRyYW5zLAotCQkJCQlzdHJ1Y3QgbGlzdF9oZWFkICptc2dxKTsKLXN0YXRpYyB2b2lkIHJ4cnBjX3RyYW5zX3JlY2VpdmVfZXJyb3JfcmVwb3J0KHN0cnVjdCByeHJwY190cmFuc3BvcnQgKnRyYW5zKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIGNyZWF0ZSBhIG5ldyB0cmFuc3BvcnQgZW5kcG9pbnQgdXNpbmcgdGhlIHNwZWNpZmllZCBVRFAgcG9ydAotICovCi1pbnQgcnhycGNfY3JlYXRlX3RyYW5zcG9ydCh1bnNpZ25lZCBzaG9ydCBwb3J0LAotCQkJICAgc3RydWN0IHJ4cnBjX3RyYW5zcG9ydCAqKl90cmFucykKLXsKLQlzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICp0cmFuczsKLQlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2luOwotCW1tX3NlZ21lbnRfdCBvbGRmczsKLQlzdHJ1Y3Qgc29jayAqc29jazsKLQlpbnQgcmV0LCBvcHQ7Ci0KLQlfZW50ZXIoIiVodSIsIHBvcnQpOwotCi0JdHJhbnMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCF0cmFucykKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlhdG9taWNfc2V0KCZ0cmFucy0+dXNhZ2UsIDEpOwotCUlOSVRfTElTVF9IRUFEKCZ0cmFucy0+c2VydmljZXMpOwotCUlOSVRfTElTVF9IRUFEKCZ0cmFucy0+bGluayk7Ci0JSU5JVF9MSVNUX0hFQUQoJnRyYW5zLT5rcnhpb2RxX2xpbmspOwotCXNwaW5fbG9ja19pbml0KCZ0cmFucy0+bG9jayk7Ci0JSU5JVF9MSVNUX0hFQUQoJnRyYW5zLT5wZWVyX2FjdGl2ZSk7Ci0JSU5JVF9MSVNUX0hFQUQoJnRyYW5zLT5wZWVyX2dyYXZleWFyZCk7Ci0Jc3Bpbl9sb2NrX2luaXQoJnRyYW5zLT5wZWVyX2d5bG9jayk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmdHJhbnMtPnBlZXJfZ3lfd2FpdHEpOwotCXJ3bG9ja19pbml0KCZ0cmFucy0+cGVlcl9sb2NrKTsKLQlhdG9taWNfc2V0KCZ0cmFucy0+cGVlcl9jb3VudCwgMCk7Ci0JdHJhbnMtPnBvcnQgPSBwb3J0OwotCi0JLyogY3JlYXRlIGEgVURQIHNvY2tldCB0byBiZSBteSBhY3R1YWwgdHJhbnNwb3J0IGVuZHBvaW50ICovCi0JcmV0ID0gc29ja19jcmVhdGVfa2VybihQRl9JTkVULCBTT0NLX0RHUkFNLCBJUFBST1RPX1VEUCwgJnRyYW5zLT5zb2NrZXQpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIGVycm9yOwotCi0JLyogdXNlIHRoZSBzcGVjaWZpZWQgcG9ydCAqLwotCWlmIChwb3J0KSB7Ci0JCW1lbXNldCgmc2luLCAwLCBzaXplb2Yoc2luKSk7Ci0JCXNpbi5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKLQkJc2luLnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7Ci0JCXJldCA9IHRyYW5zLT5zb2NrZXQtPm9wcy0+YmluZCh0cmFucy0+c29ja2V0LAotCQkJCQkgICAgICAgKHN0cnVjdCBzb2NrYWRkciAqKSAmc2luLAotCQkJCQkgICAgICAgc2l6ZW9mKHNpbikpOwotCQlpZiAocmV0IDwgMCkKLQkJCWdvdG8gZXJyb3I7Ci0JfQotCi0Jb3B0ID0gMTsKLQlvbGRmcyA9IGdldF9mcygpOwotCXNldF9mcyhLRVJORUxfRFMpOwotCXJldCA9IHRyYW5zLT5zb2NrZXQtPm9wcy0+c2V0c29ja29wdCh0cmFucy0+c29ja2V0LCBTT0xfSVAsIElQX1JFQ1ZFUlIsCi0JCQkJCSAgICAgKGNoYXIgKikgJm9wdCwgc2l6ZW9mKG9wdCkpOwotCXNldF9mcyhvbGRmcyk7Ci0KLQlzcGluX2xvY2soJnJ4cnBjX3RyYW5zcG9ydHNfbG9jayk7Ci0JbGlzdF9hZGQoJnRyYW5zLT5saW5rLCAmcnhycGNfdHJhbnNwb3J0cyk7Ci0Jc3Bpbl91bmxvY2soJnJ4cnBjX3RyYW5zcG9ydHNfbG9jayk7Ci0KLQkvKiBzZXQgdGhlIHNvY2tldCB1cCAqLwotCXNvY2sgPSB0cmFucy0+c29ja2V0LT5zazsKLQlzb2NrLT5za191c2VyX2RhdGEJPSB0cmFuczsKLQlzb2NrLT5za19kYXRhX3JlYWR5CT0gcnhycGNfZGF0YV9yZWFkeTsKLQlzb2NrLT5za19lcnJvcl9yZXBvcnQJPSByeHJwY19lcnJvcl9yZXBvcnQ7Ci0KLQlkb3duX3dyaXRlKCZyeHJwY19wcm9jX3RyYW5zcG9ydHNfc2VtKTsKLQlsaXN0X2FkZF90YWlsKCZ0cmFucy0+cHJvY19saW5rLCAmcnhycGNfcHJvY190cmFuc3BvcnRzKTsKLQl1cF93cml0ZSgmcnhycGNfcHJvY190cmFuc3BvcnRzX3NlbSk7Ci0KLQlfX1JYQUNDVChhdG9taWNfaW5jKCZyeHJwY190cmFuc3BvcnRfY291bnQpKTsKLQotCSpfdHJhbnMgPSB0cmFuczsKLQlfbGVhdmUoIiA9IDAgKCVwKSIsIHRyYW5zKTsKLQlyZXR1cm4gMDsKLQotIGVycm9yOgotCS8qIGZpbmlzaCBjbGVhbmluZyB1cCB0aGUgdHJhbnNwb3J0IChub3QgcmVhbGx5IG5lZWRlZCBoZXJlLCBidXQuLi4pICovCi0JaWYgKHRyYW5zLT5zb2NrZXQpCi0JCXRyYW5zLT5zb2NrZXQtPm9wcy0+c2h1dGRvd24odHJhbnMtPnNvY2tldCwgMik7Ci0KLQkvKiBjbG9zZSB0aGUgc29ja2V0ICovCi0JaWYgKHRyYW5zLT5zb2NrZXQpIHsKLQkJdHJhbnMtPnNvY2tldC0+c2stPnNrX3VzZXJfZGF0YSA9IE5VTEw7Ci0JCXNvY2tfcmVsZWFzZSh0cmFucy0+c29ja2V0KTsKLQkJdHJhbnMtPnNvY2tldCA9IE5VTEw7Ci0JfQotCi0Ja2ZyZWUodHJhbnMpOwotCi0KLQlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKLQlyZXR1cm4gcmV0OwotfSAvKiBlbmQgcnhycGNfY3JlYXRlX3RyYW5zcG9ydCgpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBkZXN0cm95IGEgdHJhbnNwb3J0IGVuZHBvaW50Ci0gKi8KLXZvaWQgcnhycGNfcHV0X3RyYW5zcG9ydChzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICp0cmFucykKLXsKLQlfZW50ZXIoIiVwe3U9JWQgcD0laHV9IiwKLQkgICAgICAgdHJhbnMsIGF0b21pY19yZWFkKCZ0cmFucy0+dXNhZ2UpLCB0cmFucy0+cG9ydCk7Ci0KLQlCVUdfT04oYXRvbWljX3JlYWQoJnRyYW5zLT51c2FnZSkgPD0gMCk7Ci0KLQkvKiB0byBwcmV2ZW50IGEgcmFjZSwgdGhlIGRlY3JlbWVudCBhbmQgdGhlIGRlcXVldWUgbXVzdCBiZQotCSAqIGVmZmVjdGl2ZWx5IGF0b21pYyAqLwotCXNwaW5fbG9jaygmcnhycGNfdHJhbnNwb3J0c19sb2NrKTsKLQlpZiAobGlrZWx5KCFhdG9taWNfZGVjX2FuZF90ZXN0KCZ0cmFucy0+dXNhZ2UpKSkgewotCQlzcGluX3VubG9jaygmcnhycGNfdHJhbnNwb3J0c19sb2NrKTsKLQkJX2xlYXZlKCIiKTsKLQkJcmV0dXJuOwotCX0KLQotCWxpc3RfZGVsKCZ0cmFucy0+bGluayk7Ci0Jc3Bpbl91bmxvY2soJnJ4cnBjX3RyYW5zcG9ydHNfbG9jayk7Ci0KLQkvKiBmaW5pc2ggY2xlYW5pbmcgdXAgdGhlIHRyYW5zcG9ydCAqLwotCWlmICh0cmFucy0+c29ja2V0KQotCQl0cmFucy0+c29ja2V0LT5vcHMtPnNodXRkb3duKHRyYW5zLT5zb2NrZXQsIDIpOwotCi0JcnhycGNfa3J4c2VjZF9jbGVhcl90cmFuc3BvcnQodHJhbnMpOwotCXJ4cnBjX2tyeGlvZF9kZXF1ZXVlX3RyYW5zcG9ydCh0cmFucyk7Ci0KLQkvKiBkaXNjYXJkIGFsbCBwZWVyIGluZm9ybWF0aW9uICovCi0JcnhycGNfcGVlcl9jbGVhcmFsbCh0cmFucyk7Ci0KLQlkb3duX3dyaXRlKCZyeHJwY19wcm9jX3RyYW5zcG9ydHNfc2VtKTsKLQlsaXN0X2RlbCgmdHJhbnMtPnByb2NfbGluayk7Ci0JdXBfd3JpdGUoJnJ4cnBjX3Byb2NfdHJhbnNwb3J0c19zZW0pOwotCV9fUlhBQ0NUKGF0b21pY19kZWMoJnJ4cnBjX3RyYW5zcG9ydF9jb3VudCkpOwotCi0JLyogY2xvc2UgdGhlIHNvY2tldCAqLwotCWlmICh0cmFucy0+c29ja2V0KSB7Ci0JCXRyYW5zLT5zb2NrZXQtPnNrLT5za191c2VyX2RhdGEgPSBOVUxMOwotCQlzb2NrX3JlbGVhc2UodHJhbnMtPnNvY2tldCk7Ci0JCXRyYW5zLT5zb2NrZXQgPSBOVUxMOwotCX0KLQotCWtmcmVlKHRyYW5zKTsKLQotCV9sZWF2ZSgiIik7Ci19IC8qIGVuZCByeHJwY19wdXRfdHJhbnNwb3J0KCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIGFkZCBhIHNlcnZpY2UgdG8gYSB0cmFuc3BvcnQgdG8gYmUgbGlzdGVuZWQgdXBvbgotICovCi1pbnQgcnhycGNfYWRkX3NlcnZpY2Uoc3RydWN0IHJ4cnBjX3RyYW5zcG9ydCAqdHJhbnMsCi0JCSAgICAgIHN0cnVjdCByeHJwY19zZXJ2aWNlICpuZXdzcnYpCi17Ci0Jc3RydWN0IHJ4cnBjX3NlcnZpY2UgKnNydjsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpfcDsKLQlpbnQgcmV0ID0gLUVFWElTVDsKLQotCV9lbnRlcigiJXB7JWh1fSwlcHslaHV9IiwKLQkgICAgICAgdHJhbnMsIHRyYW5zLT5wb3J0LCBuZXdzcnYsIG5ld3Nydi0+c2VydmljZV9pZCk7Ci0KLQkvKiB2ZXJpZnkgdGhhdCB0aGUgc2VydmljZSBJRCBpcyBub3QgYWxyZWFkeSBwcmVzZW50ICovCi0Jc3Bpbl9sb2NrKCZ0cmFucy0+bG9jayk7Ci0KLQlsaXN0X2Zvcl9lYWNoKF9wLCAmdHJhbnMtPnNlcnZpY2VzKSB7Ci0JCXNydiA9IGxpc3RfZW50cnkoX3AsIHN0cnVjdCByeHJwY19zZXJ2aWNlLCBsaW5rKTsKLQkJaWYgKHNydi0+c2VydmljZV9pZCA9PSBuZXdzcnYtPnNlcnZpY2VfaWQpCi0JCQlnb3RvIG91dDsKLQl9Ci0KLQkvKiBva2F5IC0gYWRkIHRoZSB0cmFuc3BvcnQgdG8gdGhlIGxpc3QgKi8KLQlsaXN0X2FkZF90YWlsKCZuZXdzcnYtPmxpbmssICZ0cmFucy0+c2VydmljZXMpOwotCXJ4cnBjX2dldF90cmFuc3BvcnQodHJhbnMpOwotCXJldCA9IDA7Ci0KLSBvdXQ6Ci0Jc3Bpbl91bmxvY2soJnRyYW5zLT5sb2NrKTsKLQotCV9sZWF2ZSgiPSAlZCIsIHJldCk7Ci0JcmV0dXJuIHJldDsKLX0gLyogZW5kIHJ4cnBjX2FkZF9zZXJ2aWNlKCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIHJlbW92ZSBhIHNlcnZpY2UgZnJvbSBhIHRyYW5zcG9ydAotICovCi12b2lkIHJ4cnBjX2RlbF9zZXJ2aWNlKHN0cnVjdCByeHJwY190cmFuc3BvcnQgKnRyYW5zLCBzdHJ1Y3QgcnhycGNfc2VydmljZSAqc3J2KQotewotCV9lbnRlcigiJXB7JWh1fSwlcHslaHV9IiwgdHJhbnMsIHRyYW5zLT5wb3J0LCBzcnYsIHNydi0+c2VydmljZV9pZCk7Ci0KLQlzcGluX2xvY2soJnRyYW5zLT5sb2NrKTsKLQlsaXN0X2RlbCgmc3J2LT5saW5rKTsKLQlzcGluX3VubG9jaygmdHJhbnMtPmxvY2spOwotCi0JcnhycGNfcHV0X3RyYW5zcG9ydCh0cmFucyk7Ci0KLQlfbGVhdmUoIiIpOwotfSAvKiBlbmQgcnhycGNfZGVsX3NlcnZpY2UoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogSU5FVCBjYWxsYmFjayB3aGVuIGRhdGEgaGFzIGJlZW4gcmVjZWl2ZWQgb24gdGhlIHNvY2tldC4KLSAqLwotc3RhdGljIHZvaWQgcnhycGNfZGF0YV9yZWFkeShzdHJ1Y3Qgc29jayAqc2ssIGludCBjb3VudCkKLXsKLQlzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICp0cmFuczsKLQotCV9lbnRlcigiJXB7dD0lcH0sJWQiLCBzaywgc2stPnNrX3VzZXJfZGF0YSwgY291bnQpOwotCi0JLyogcXVldWUgdGhlIHRyYW5zcG9ydCBmb3IgYXR0ZW50aW9uIGJ5IGtyeGlvZCAqLwotCXRyYW5zID0gKHN0cnVjdCByeHJwY190cmFuc3BvcnQgKikgc2stPnNrX3VzZXJfZGF0YTsKLQlpZiAodHJhbnMpCi0JCXJ4cnBjX2tyeGlvZF9xdWV1ZV90cmFuc3BvcnQodHJhbnMpOwotCi0JLyogd2FrZSB1cCBhbnlvbmUgd2FpdGluZyBvbiB0aGUgc29ja2V0ICovCi0JaWYgKHNrLT5za19zbGVlcCAmJiB3YWl0cXVldWVfYWN0aXZlKHNrLT5za19zbGVlcCkpCi0JCXdha2VfdXBfaW50ZXJydXB0aWJsZShzay0+c2tfc2xlZXApOwotCi0JX2xlYXZlKCIiKTsKLX0gLyogZW5kIHJ4cnBjX2RhdGFfcmVhZHkoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogSU5FVCBjYWxsYmFjayB3aGVuIGFuIElDTVAgZXJyb3IgcGFja2V0IGlzIHJlY2VpdmVkCi0gKiAtIHNrLT5lcnIgaXMgZXJyb3IgKEVIT1NUVU5SRUFDSCwgRVBST1RPIG9yIEVNU0dTSVpFKQotICovCi1zdGF0aWMgdm9pZCByeHJwY19lcnJvcl9yZXBvcnQoc3RydWN0IHNvY2sgKnNrKQotewotCXN0cnVjdCByeHJwY190cmFuc3BvcnQgKnRyYW5zOwotCi0JX2VudGVyKCIlcHt0PSVwfSIsIHNrLCBzay0+c2tfdXNlcl9kYXRhKTsKLQotCS8qIHF1ZXVlIHRoZSB0cmFuc3BvcnQgZm9yIGF0dGVudGlvbiBieSBrcnhpb2QgKi8KLQl0cmFucyA9IChzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICopIHNrLT5za191c2VyX2RhdGE7Ci0JaWYgKHRyYW5zKSB7Ci0JCXRyYW5zLT5lcnJvcl9yY3ZkID0gMTsKLQkJcnhycGNfa3J4aW9kX3F1ZXVlX3RyYW5zcG9ydCh0cmFucyk7Ci0JfQotCi0JLyogd2FrZSB1cCBhbnlvbmUgd2FpdGluZyBvbiB0aGUgc29ja2V0ICovCi0JaWYgKHNrLT5za19zbGVlcCAmJiB3YWl0cXVldWVfYWN0aXZlKHNrLT5za19zbGVlcCkpCi0JCXdha2VfdXBfaW50ZXJydXB0aWJsZShzay0+c2tfc2xlZXApOwotCi0JX2xlYXZlKCIiKTsKLX0gLyogZW5kIHJ4cnBjX2Vycm9yX3JlcG9ydCgpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBzcGxpdCBhIG1lc3NhZ2UgdXAsIGFsbG9jYXRpbmcgbWVzc2FnZSByZWNvcmRzIGFuZCBmaWxsaW5nIHRoZW0gaW4KLSAqIGZyb20gdGhlIGNvbnRlbnRzIG9mIGEgc29ja2V0IGJ1ZmZlcgotICovCi1zdGF0aWMgaW50IHJ4cnBjX2luY29taW5nX21zZyhzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICp0cmFucywKLQkJCSAgICAgIHN0cnVjdCBza19idWZmICpwa3QsCi0JCQkgICAgICBzdHJ1Y3QgbGlzdF9oZWFkICptc2dxKQotewotCXN0cnVjdCByeHJwY19tZXNzYWdlICptc2c7Ci0JaW50IHJldDsKLQotCV9lbnRlcigiIik7Ci0KLQltc2cgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcnhycGNfbWVzc2FnZSksIEdGUF9LRVJORUwpOwotCWlmICghbXNnKSB7Ci0JCV9sZWF2ZSgiID0gLUVOT01FTSIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlhdG9taWNfc2V0KCZtc2ctPnVzYWdlLCAxKTsKLQlsaXN0X2FkZF90YWlsKCZtc2ctPmxpbmssbXNncSk7Ci0KLQkvKiBkaWcgb3V0IHRoZSBSeCByb3V0aW5nIHBhcmFtZXRlcnMgKi8KLQlpZiAoc2tiX2NvcHlfYml0cyhwa3QsIHNpemVvZihzdHJ1Y3QgdWRwaGRyKSwKLQkJCSAgJm1zZy0+aGRyLCBzaXplb2YobXNnLT5oZHIpKSA8IDApIHsKLQkJcmV0ID0gLUVCQURNU0c7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCi0JbXNnLT50cmFucyA9IHRyYW5zOwotCW1zZy0+c3RhdGUgPSBSWFJQQ19NU0dfUkVDRUlWRUQ7Ci0Jc2tiX2dldF90aW1lc3RhbXAocGt0LCAmbXNnLT5zdGFtcCk7Ci0JaWYgKG1zZy0+c3RhbXAudHZfc2VjID09IDApIHsKLQkJZG9fZ2V0dGltZW9mZGF5KCZtc2ctPnN0YW1wKTsKLQkJaWYgKHBrdC0+c2spCi0JCQlzb2NrX2VuYWJsZV90aW1lc3RhbXAocGt0LT5zayk7Ci0JfQotCW1zZy0+c2VxID0gbnRvaGwobXNnLT5oZHIuc2VxKTsKLQotCS8qIGF0dGFjaCB0aGUgcGFja2V0ICovCi0Jc2tiX2dldChwa3QpOwotCW1zZy0+cGt0ID0gcGt0OwotCi0JbXNnLT5vZmZzZXQgPSBzaXplb2Yoc3RydWN0IHVkcGhkcikgKyBzaXplb2Yoc3RydWN0IHJ4cnBjX2hlYWRlcik7Ci0JbXNnLT5kc2l6ZSA9IG1zZy0+cGt0LT5sZW4gLSBtc2ctPm9mZnNldDsKLQotCV9uZXQoIlJ4IFJlY2VpdmVkIHBhY2tldCBmcm9tICVzICglMDh4OyUwOHgsJTF4LCVkLCVzLCUwMngsJWQsJWQpIiwKLQkgICAgIG1zZy0+aGRyLmZsYWdzICYgUlhSUENfQ0xJRU5UX0lOSVRJQVRFRCA/ICJjbGllbnQiIDogInNlcnZlciIsCi0JICAgICBudG9obChtc2ctPmhkci5lcG9jaCksCi0JICAgICAobnRvaGwobXNnLT5oZHIuY2lkKSAmIFJYUlBDX0NJRE1BU0spID4+IFJYUlBDX0NJRFNISUZULAotCSAgICAgbnRvaGwobXNnLT5oZHIuY2lkKSAmIFJYUlBDX0NIQU5ORUxNQVNLLAotCSAgICAgbnRvaGwobXNnLT5oZHIuY2FsbE51bWJlciksCi0JICAgICByeHJwY19wa3RzW21zZy0+aGRyLnR5cGVdLAotCSAgICAgbXNnLT5oZHIuZmxhZ3MsCi0JICAgICBudG9ocyhtc2ctPmhkci5zZXJ2aWNlSWQpLAotCSAgICAgbXNnLT5oZHIuc2VjdXJpdHlJbmRleCk7Ci0KLQlfX1JYQUNDVChhdG9taWNfaW5jKCZyeHJwY19tZXNzYWdlX2NvdW50KSk7Ci0KLQkvKiBzcGxpdCBvZmYganVtYm8gcGFja2V0cyAqLwotCXdoaWxlIChtc2ctPmhkci50eXBlID09IFJYUlBDX1BBQ0tFVF9UWVBFX0RBVEEgJiYKLQkgICAgICAgbXNnLT5oZHIuZmxhZ3MgJiBSWFJQQ19KVU1CT19QQUNLRVQKLQkgICAgICAgKSB7Ci0JCXN0cnVjdCByeHJwY19qdW1ib19oZWFkZXIganVtYm87Ci0JCXN0cnVjdCByeHJwY19tZXNzYWdlICpqdW1ib21zZyA9IG1zZzsKLQotCQlfZGVidWcoInNwbGl0IGp1bWJvIHBhY2tldCIpOwotCi0JCS8qIHF1aWNrIHNhbml0eSBjaGVjayAqLwotCQlyZXQgPSAtRUJBRE1TRzsKLQkJaWYgKG1zZy0+ZHNpemUgPAotCQkgICAgUlhSUENfSlVNQk9fREFUQUxFTiArIHNpemVvZihzdHJ1Y3QgcnhycGNfanVtYm9faGVhZGVyKSkKLQkJCWdvdG8gZXJyb3I7Ci0JCWlmIChtc2ctPmhkci5mbGFncyAmIFJYUlBDX0xBU1RfUEFDS0VUKQotCQkJZ290byBlcnJvcjsKLQotCQkvKiBkaWcgb3V0IHRoZSBzZWNvbmRhcnkgaGVhZGVyICovCi0JCWlmIChza2JfY29weV9iaXRzKHBrdCwgbXNnLT5vZmZzZXQgKyBSWFJQQ19KVU1CT19EQVRBTEVOLAotCQkJCSAgJmp1bWJvLCBzaXplb2YoanVtYm8pKSA8IDApCi0JCQlnb3RvIGVycm9yOwotCi0JCS8qIGFsbG9jYXRlIGEgbmV3IG1lc3NhZ2UgcmVjb3JkICovCi0JCXJldCA9IC1FTk9NRU07Ci0JCW1zZyA9IGttZW1kdXAoanVtYm9tc2csIHNpemVvZihzdHJ1Y3QgcnhycGNfbWVzc2FnZSksIEdGUF9LRVJORUwpOwotCQlpZiAoIW1zZykKLQkJCWdvdG8gZXJyb3I7Ci0KLQkJbGlzdF9hZGRfdGFpbCgmbXNnLT5saW5rLCBtc2dxKTsKLQotCQkvKiBhZGp1c3QgdGhlIGp1bWJvIHBhY2tldCAqLwotCQlqdW1ib21zZy0+ZHNpemUgPSBSWFJQQ19KVU1CT19EQVRBTEVOOwotCi0JCS8qIGF0dGFjaCB0aGUgcGFja2V0IGhlcmUgdG9vICovCi0JCXNrYl9nZXQocGt0KTsKLQotCQkvKiBhZGp1c3QgdGhlIHBhcmFtZXRlcnMgKi8KLQkJbXNnLT5zZXErKzsKLQkJbXNnLT5oZHIuc2VxID0gaHRvbmwobXNnLT5zZXEpOwotCQltc2ctPmhkci5zZXJpYWwgPSBodG9ubChudG9obChtc2ctPmhkci5zZXJpYWwpICsgMSk7Ci0JCW1zZy0+b2Zmc2V0ICs9IFJYUlBDX0pVTUJPX0RBVEFMRU4gKwotCQkJc2l6ZW9mKHN0cnVjdCByeHJwY19qdW1ib19oZWFkZXIpOwotCQltc2ctPmRzaXplIC09IFJYUlBDX0pVTUJPX0RBVEFMRU4gKwotCQkJc2l6ZW9mKHN0cnVjdCByeHJwY19qdW1ib19oZWFkZXIpOwotCQltc2ctPmhkci5mbGFncyA9IGp1bWJvLmZsYWdzOwotCQltc2ctPmhkci5fcnN2ZCA9IGp1bWJvLl9yc3ZkOwotCi0JCV9uZXQoIlJ4IFNwbGl0IGp1bWJvIHBhY2tldCBmcm9tICVzIgotCQkgICAgICIgKCUwOHg7JTA4eCwlMXgsJWQsJXMsJTAyeCwlZCwlZCkiLAotCQkgICAgIG1zZy0+aGRyLmZsYWdzICYgUlhSUENfQ0xJRU5UX0lOSVRJQVRFRCA/ICJjbGllbnQiIDogInNlcnZlciIsCi0JCSAgICAgbnRvaGwobXNnLT5oZHIuZXBvY2gpLAotCQkgICAgIChudG9obChtc2ctPmhkci5jaWQpICYgUlhSUENfQ0lETUFTSykgPj4gUlhSUENfQ0lEU0hJRlQsCi0JCSAgICAgbnRvaGwobXNnLT5oZHIuY2lkKSAmIFJYUlBDX0NIQU5ORUxNQVNLLAotCQkgICAgIG50b2hsKG1zZy0+aGRyLmNhbGxOdW1iZXIpLAotCQkgICAgIHJ4cnBjX3BrdHNbbXNnLT5oZHIudHlwZV0sCi0JCSAgICAgbXNnLT5oZHIuZmxhZ3MsCi0JCSAgICAgbnRvaHMobXNnLT5oZHIuc2VydmljZUlkKSwKLQkJICAgICBtc2ctPmhkci5zZWN1cml0eUluZGV4KTsKLQotCQlfX1JYQUNDVChhdG9taWNfaW5jKCZyeHJwY19tZXNzYWdlX2NvdW50KSk7Ci0JfQotCi0JX2xlYXZlKCIgPSAwICMlZCIsIGF0b21pY19yZWFkKCZyeHJwY19tZXNzYWdlX2NvdW50KSk7Ci0JcmV0dXJuIDA7Ci0KLSBlcnJvcjoKLQl3aGlsZSAoIWxpc3RfZW1wdHkobXNncSkpIHsKLQkJbXNnID0gbGlzdF9lbnRyeShtc2dxLT5uZXh0LCBzdHJ1Y3QgcnhycGNfbWVzc2FnZSwgbGluayk7Ci0JCWxpc3RfZGVsX2luaXQoJm1zZy0+bGluayk7Ci0KLQkJcnhycGNfcHV0X21lc3NhZ2UobXNnKTsKLQl9Ci0KLQlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKLQlyZXR1cm4gcmV0OwotfSAvKiBlbmQgcnhycGNfaW5jb21pbmdfbXNnKCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIGFjY2VwdCBhIG5ldyBjYWxsCi0gKiAtIGNhbGxlZCBmcm9tIGtyeGlvZCBpbiBwcm9jZXNzIGNvbnRleHQKLSAqLwotdm9pZCByeHJwY190cmFuc19yZWNlaXZlX3BhY2tldChzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICp0cmFucykKLXsKLQlzdHJ1Y3QgcnhycGNfbWVzc2FnZSAqbXNnOwotCXN0cnVjdCByeHJwY19wZWVyICpwZWVyOwotCXN0cnVjdCBza19idWZmICpwa3Q7Ci0JaW50IHJldDsKLQlfX2JlMzIgYWRkcjsKLQlfX2JlMTYgcG9ydDsKLQotCUxJU1RfSEVBRChtc2dxKTsKLQotCV9lbnRlcigiJXB7JWR9IiwgdHJhbnMsIHRyYW5zLT5wb3J0KTsKLQotCWZvciAoOzspIHsKLQkJLyogZGVhbCB3aXRoIG91dHN0YW50aW5nIGVycm9ycyBmaXJzdCAqLwotCQlpZiAodHJhbnMtPmVycm9yX3JjdmQpCi0JCQlyeHJwY190cmFuc19yZWNlaXZlX2Vycm9yX3JlcG9ydCh0cmFucyk7Ci0KLQkJLyogYXR0ZW1wdCB0byByZWNlaXZlIGEgcGFja2V0ICovCi0JCXBrdCA9IHNrYl9yZWN2X2RhdGFncmFtKHRyYW5zLT5zb2NrZXQtPnNrLCAwLCAxLCAmcmV0KTsKLQkJaWYgKCFwa3QpIHsKLQkJCWlmIChyZXQgPT0gLUVBR0FJTikgewotCQkJCV9sZWF2ZSgiIEVBR0FJTiIpOwotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJLyogYW4gaWNtcCBlcnJvciBtYXkgaGF2ZSBvY2N1cnJlZCAqLwotCQkJcnhycGNfa3J4aW9kX3F1ZXVlX3RyYW5zcG9ydCh0cmFucyk7Ci0JCQlfbGVhdmUoIiBlcnJvciAlZFxuIiwgcmV0KTsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8qIHdlJ2xsIHByb2JhYmx5IG5lZWQgdG8gY2hlY2tzdW0gaXQgKGRpZG4ndCBjYWxsCi0JCSAqIHNvY2tfcmVjdm1zZykgKi8KLQkJaWYgKHNrYl9jaGVja3N1bV9jb21wbGV0ZShwa3QpKSB7Ci0JCQlrZnJlZV9za2IocGt0KTsKLQkJCXJ4cnBjX2tyeGlvZF9xdWV1ZV90cmFuc3BvcnQodHJhbnMpOwotCQkJX2xlYXZlKCIgQ1NVTSBmYWlsZWQiKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWFkZHIgPSBwa3QtPm5oLmlwaC0+c2FkZHI7Ci0JCXBvcnQgPSBwa3QtPmgudWgtPnNvdXJjZTsKLQotCQlfbmV0KCJSeCBSZWNlaXZlZCBVRFAgcGFja2V0IGZyb20gJTA4eDolMDRodSIsCi0JCSAgICAgbnRvaGwoYWRkciksIG50b2hzKHBvcnQpKTsKLQotCQkvKiB1bm1hcnNoYWxsIHRoZSBSeCBwYXJhbWV0ZXJzIGFuZCBzcGxpdCBqdW1ibyBwYWNrZXRzICovCi0JCXJldCA9IHJ4cnBjX2luY29taW5nX21zZyh0cmFucywgcGt0LCAmbXNncSk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlrZnJlZV9za2IocGt0KTsKLQkJCXJ4cnBjX2tyeGlvZF9xdWV1ZV90cmFuc3BvcnQodHJhbnMpOwotCQkJX2xlYXZlKCIgYmFkIHBhY2tldCIpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJQlVHX09OKGxpc3RfZW1wdHkoJm1zZ3EpKTsKLQotCQltc2cgPSBsaXN0X2VudHJ5KG1zZ3EubmV4dCwgc3RydWN0IHJ4cnBjX21lc3NhZ2UsIGxpbmspOwotCi0JCS8qIGxvY2F0ZSB0aGUgcmVjb3JkIGZvciB0aGUgcGVlciBmcm9tIHdoaWNoIGl0Ci0JCSAqIG9yaWdpbmF0ZWQgKi8KLQkJcmV0ID0gcnhycGNfcGVlcl9sb29rdXAodHJhbnMsIGFkZHIsICZwZWVyKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCWtkZWJ1ZygiUnggTm8gY29ubmVjdGlvbnMgZnJvbSB0aGF0IHBlZXIiKTsKLQkJCXJ4cnBjX3RyYW5zX2ltbWVkaWF0ZV9hYm9ydCh0cmFucywgbXNnLCAtRUlOVkFMKTsKLQkJCWdvdG8gZmluaXNoZWRfbXNnOwotCQl9Ci0KLQkJLyogdHJ5IGFuZCBmaW5kIGEgbWF0Y2hpbmcgY29ubmVjdGlvbiAqLwotCQlyZXQgPSByeHJwY19jb25uZWN0aW9uX2xvb2t1cChwZWVyLCBtc2csICZtc2ctPmNvbm4pOwotCQlpZiAocmV0IDwgMCkgewotCQkJa2RlYnVnKCJSeCBVbmtub3duIENvbm5lY3Rpb24iKTsKLQkJCXJ4cnBjX3RyYW5zX2ltbWVkaWF0ZV9hYm9ydCh0cmFucywgbXNnLCAtRUlOVkFMKTsKLQkJCXJ4cnBjX3B1dF9wZWVyKHBlZXIpOwotCQkJZ290byBmaW5pc2hlZF9tc2c7Ci0JCX0KLQkJcnhycGNfcHV0X3BlZXIocGVlcik7Ci0KLQkJLyogZGVhbCB3aXRoIHRoZSBmaXJzdCBwYWNrZXQgb2YgYSBuZXcgY2FsbCAqLwotCQlpZiAobXNnLT5oZHIuZmxhZ3MgJiBSWFJQQ19DTElFTlRfSU5JVElBVEVEICYmCi0JCSAgICBtc2ctPmhkci50eXBlID09IFJYUlBDX1BBQ0tFVF9UWVBFX0RBVEEgJiYKLQkJICAgIG50b2hsKG1zZy0+aGRyLnNlcSkgPT0gMQotCQkgICAgKSB7Ci0JCQlfZGVidWcoIlJ4IE5ldyBzZXJ2ZXIgY2FsbCIpOwotCQkJcnhycGNfdHJhbnNfcmVjZWl2ZV9uZXdfY2FsbCh0cmFucywgJm1zZ3EpOwotCQkJZ290byBmaW5pc2hlZF9tc2c7Ci0JCX0KLQotCQkvKiBkZWFsIHdpdGggc3Vic2VxdWVudCBwYWNrZXQocykgb2YgY2FsbCAqLwotCQlfZGVidWcoIlJ4IENhbGwgcGFja2V0Iik7Ci0JCXdoaWxlICghbGlzdF9lbXB0eSgmbXNncSkpIHsKLQkJCW1zZyA9IGxpc3RfZW50cnkobXNncS5uZXh0LCBzdHJ1Y3QgcnhycGNfbWVzc2FnZSwgbGluayk7Ci0JCQlsaXN0X2RlbF9pbml0KCZtc2ctPmxpbmspOwotCi0JCQlyZXQgPSByeHJwY19jb25uX3JlY2VpdmVfY2FsbF9wYWNrZXQobXNnLT5jb25uLCBOVUxMLCBtc2cpOwotCQkJaWYgKHJldCA8IDApIHsKLQkJCQlyeHJwY190cmFuc19pbW1lZGlhdGVfYWJvcnQodHJhbnMsIG1zZywgcmV0KTsKLQkJCQlyeHJwY19wdXRfbWVzc2FnZShtc2cpOwotCQkJCWdvdG8gZmluaXNoZWRfbXNnOwotCQkJfQotCi0JCQlyeHJwY19wdXRfbWVzc2FnZShtc2cpOwotCQl9Ci0KLQkJZ290byBmaW5pc2hlZF9tc2c7Ci0KLQkJLyogZGlzcG9zZSBvZiB0aGUgcGFja2V0cyAqLwotCWZpbmlzaGVkX21zZzoKLQkJd2hpbGUgKCFsaXN0X2VtcHR5KCZtc2dxKSkgewotCQkJbXNnID0gbGlzdF9lbnRyeShtc2dxLm5leHQsIHN0cnVjdCByeHJwY19tZXNzYWdlLCBsaW5rKTsKLQkJCWxpc3RfZGVsX2luaXQoJm1zZy0+bGluayk7Ci0KLQkJCXJ4cnBjX3B1dF9tZXNzYWdlKG1zZyk7Ci0JCX0KLQkJa2ZyZWVfc2tiKHBrdCk7Ci0JfQotCi0JX2xlYXZlKCIiKTsKLQotfSAvKiBlbmQgcnhycGNfdHJhbnNfcmVjZWl2ZV9wYWNrZXQoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogYWNjZXB0IGEgbmV3IGNhbGwgZnJvbSBhIGNsaWVudCB0cnlpbmcgdG8gY29ubmVjdCB0byBvbmUgb2YgbXkgc2VydmljZXMKLSAqIC0gY2FsbGVkIGluIHByb2Nlc3MgY29udGV4dAotICovCi1zdGF0aWMgaW50IHJ4cnBjX3RyYW5zX3JlY2VpdmVfbmV3X2NhbGwoc3RydWN0IHJ4cnBjX3RyYW5zcG9ydCAqdHJhbnMsCi0JCQkJCXN0cnVjdCBsaXN0X2hlYWQgKm1zZ3EpCi17Ci0Jc3RydWN0IHJ4cnBjX21lc3NhZ2UgKm1zZzsKLQotCV9lbnRlcigiIik7Ci0KLQkvKiBvbmx5IGJvdGhlciB3aXRoIHRoZSBmaXJzdCBwYWNrZXQgKi8KLQltc2cgPSBsaXN0X2VudHJ5KG1zZ3EtPm5leHQsIHN0cnVjdCByeHJwY19tZXNzYWdlLCBsaW5rKTsKLQlsaXN0X2RlbF9pbml0KCZtc2ctPmxpbmspOwotCXJ4cnBjX2tyeHNlY2RfcXVldWVfaW5jb21pbmdfY2FsbChtc2cpOwotCXJ4cnBjX3B1dF9tZXNzYWdlKG1zZyk7Ci0KLQlfbGVhdmUoIiA9IDAiKTsKLQotCXJldHVybiAwOwotfSAvKiBlbmQgcnhycGNfdHJhbnNfcmVjZWl2ZV9uZXdfY2FsbCgpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBwZXJmb3JtIGFuIGltbWVkaWF0ZSBhYm9ydCB3aXRob3V0IGNvbm5lY3Rpb24gb3IgY2FsbCBzdHJ1Y3R1cmVzCi0gKi8KLWludCByeHJwY190cmFuc19pbW1lZGlhdGVfYWJvcnQoc3RydWN0IHJ4cnBjX3RyYW5zcG9ydCAqdHJhbnMsCi0JCQkJc3RydWN0IHJ4cnBjX21lc3NhZ2UgKm1zZywKLQkJCQlpbnQgZXJyb3IpCi17Ci0Jc3RydWN0IHJ4cnBjX2hlYWRlciBhaGRyOwotCXN0cnVjdCBzb2NrYWRkcl9pbiBzaW47Ci0Jc3RydWN0IG1zZ2hkciBtc2doZHI7Ci0Jc3RydWN0IGt2ZWMgaW92WzJdOwotCV9fYmUzMiBfZXJyb3I7Ci0JaW50IGxlbiwgcmV0OwotCi0JX2VudGVyKCIlcCwlcCwlZCIsIHRyYW5zLCBtc2csIGVycm9yKTsKLQotCS8qIGRvbid0IGFib3J0IGFuIGFib3J0IHBhY2tldCAqLwotCWlmIChtc2ctPmhkci50eXBlID09IFJYUlBDX1BBQ0tFVF9UWVBFX0FCT1JUKSB7Ci0JCV9sZWF2ZSgiID0gMCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlfZXJyb3IgPSBodG9ubCgtZXJyb3IpOwotCi0JLyogc2V0IHVwIHRoZSBtZXNzYWdlIHRvIGJlIHRyYW5zbWl0dGVkICovCi0JbWVtY3B5KCZhaGRyLCAmbXNnLT5oZHIsIHNpemVvZihhaGRyKSk7Ci0JYWhkci5lcG9jaAk9IG1zZy0+aGRyLmVwb2NoOwotCWFoZHIuc2VyaWFsCT0gaHRvbmwoMSk7Ci0JYWhkci5zZXEJPSAwOwotCWFoZHIudHlwZQk9IFJYUlBDX1BBQ0tFVF9UWVBFX0FCT1JUOwotCWFoZHIuZmxhZ3MJPSBSWFJQQ19MQVNUX1BBQ0tFVDsKLQlhaGRyLmZsYWdzCXw9IH5tc2ctPmhkci5mbGFncyAmIFJYUlBDX0NMSUVOVF9JTklUSUFURUQ7Ci0KLQlpb3ZbMF0uaW92X2xlbgk9IHNpemVvZihhaGRyKTsKLQlpb3ZbMF0uaW92X2Jhc2UJPSAmYWhkcjsKLQlpb3ZbMV0uaW92X2xlbgk9IHNpemVvZihfZXJyb3IpOwotCWlvdlsxXS5pb3ZfYmFzZQk9ICZfZXJyb3I7Ci0KLQlsZW4gPSBzaXplb2YoYWhkcikgKyBzaXplb2YoX2Vycm9yKTsKLQotCW1lbXNldCgmc2luLDAsc2l6ZW9mKHNpbikpOwotCXNpbi5zaW5fZmFtaWx5CQk9IEFGX0lORVQ7Ci0Jc2luLnNpbl9wb3J0CQk9IG1zZy0+cGt0LT5oLnVoLT5zb3VyY2U7Ci0Jc2luLnNpbl9hZGRyLnNfYWRkcgk9IG1zZy0+cGt0LT5uaC5pcGgtPnNhZGRyOwotCi0JbXNnaGRyLm1zZ19uYW1lCQk9ICZzaW47Ci0JbXNnaGRyLm1zZ19uYW1lbGVuCT0gc2l6ZW9mKHNpbik7Ci0JbXNnaGRyLm1zZ19jb250cm9sCT0gTlVMTDsKLQltc2doZHIubXNnX2NvbnRyb2xsZW4JPSAwOwotCW1zZ2hkci5tc2dfZmxhZ3MJPSBNU0dfRE9OVFdBSVQ7Ci0KLQlfbmV0KCJTZW5kaW5nIG1lc3NhZ2UgdHlwZSAlZCBvZiAlZCBieXRlcyB0byAlMDh4OiVkIiwKLQkgICAgIGFoZHIudHlwZSwKLQkgICAgIGxlbiwKLQkgICAgIG50b2hsKHNpbi5zaW5fYWRkci5zX2FkZHIpLAotCSAgICAgbnRvaHMoc2luLnNpbl9wb3J0KSk7Ci0KLQkvKiBzZW5kIHRoZSBtZXNzYWdlICovCi0JcmV0ID0ga2VybmVsX3NlbmRtc2codHJhbnMtPnNvY2tldCwgJm1zZ2hkciwgaW92LCAyLCBsZW4pOwotCi0JX2xlYXZlKCIgPSAlZCIsIHJldCk7Ci0JcmV0dXJuIHJldDsKLX0gLyogZW5kIHJ4cnBjX3RyYW5zX2ltbWVkaWF0ZV9hYm9ydCgpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiByZWNlaXZlIGFuIElDTVAgZXJyb3IgcmVwb3J0IGFuZCBwZXJjb2xhdGUgaXQgdG8gYWxsIGNvbm5lY3Rpb25zCi0gKiBoZWFkaW5nIHRvIHRoZSBhZmZlY3RlZCBob3N0IG9yIHBvcnQKLSAqLwotc3RhdGljIHZvaWQgcnhycGNfdHJhbnNfcmVjZWl2ZV9lcnJvcl9yZXBvcnQoc3RydWN0IHJ4cnBjX3RyYW5zcG9ydCAqdHJhbnMpCi17Ci0Jc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm47Ci0Jc3RydWN0IHNvY2thZGRyX2luIHNpbjsKLQlzdHJ1Y3QgcnhycGNfcGVlciAqcGVlcjsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGNvbm5xLCAqX3A7Ci0Jc3RydWN0IGVycm9ybXNnIGVtc2c7Ci0Jc3RydWN0IG1zZ2hkciBtc2c7Ci0JX19iZTE2IHBvcnQ7Ci0JaW50IGxvY2FsLCBlcnI7Ci0KLQlfZW50ZXIoIiVwIiwgdHJhbnMpOwotCi0JZm9yICg7OykgewotCQl0cmFucy0+ZXJyb3JfcmN2ZCA9IDA7Ci0KLQkJLyogdHJ5IGFuZCByZWNlaXZlIGFuIGVycm9yIG1lc3NhZ2UgKi8KLQkJbXNnLm1zZ19uYW1lCT0gJnNpbjsKLQkJbXNnLm1zZ19uYW1lbGVuCT0gc2l6ZW9mKHNpbik7Ci0JCW1zZy5tc2dfY29udHJvbAk9ICZlbXNnOwotCQltc2cubXNnX2NvbnRyb2xsZW4gPSBzaXplb2YoZW1zZyk7Ci0JCW1zZy5tc2dfZmxhZ3MJPSAwOwotCi0JCWVyciA9IGtlcm5lbF9yZWN2bXNnKHRyYW5zLT5zb2NrZXQsICZtc2csIE5VTEwsIDAsIDAsCi0JCQkJICAgTVNHX0VSUlFVRVVFIHwgTVNHX0RPTlRXQUlUIHwgTVNHX1RSVU5DKTsKLQotCQlpZiAoZXJyID09IC1FQUdBSU4pIHsKLQkJCV9sZWF2ZSgiIik7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoZXJyIDwgMCkgewotCQkJcHJpbnRrKCIlczogdW5hYmxlIHRvIHJlY3YgYW4gZXJyb3IgcmVwb3J0OiAlZFxuIiwKLQkJCSAgICAgICBfX0ZVTkNUSU9OX18sIGVycik7Ci0JCQlfbGVhdmUoIiIpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJbXNnLm1zZ19jb250cm9sbGVuID0gKGNoYXIgKikgbXNnLm1zZ19jb250cm9sIC0gKGNoYXIgKikgJmVtc2c7Ci0KLQkJaWYgKG1zZy5tc2dfY29udHJvbGxlbiA8IHNpemVvZihlbXNnLmNtc2cpIHx8Ci0JCSAgICBtc2cubXNnX25hbWVsZW4gPCBzaXplb2Yoc2luKSkgewotCQkJcHJpbnRrKCIlczogc2hvcnQgY29udHJvbCBtZXNzYWdlIgotCQkJICAgICAgICIgKG5sZW49JXUgY2xlbj0lWnUgZmw9JXgpXG4iLAotCQkJICAgICAgIF9fRlVOQ1RJT05fXywKLQkJCSAgICAgICBtc2cubXNnX25hbWVsZW4sCi0JCQkgICAgICAgbXNnLm1zZ19jb250cm9sbGVuLAotCQkJICAgICAgIG1zZy5tc2dfZmxhZ3MpOwotCQkJY29udGludWU7Ci0JCX0KLQotCQlfbmV0KCJSeCBSZWNlaXZlZCBjb250cm9sIG1lc3NhZ2UiCi0JCSAgICAgIiB7IGxlbj0lWnUgbGV2ZWw9JXUgdHlwZT0ldSB9IiwKLQkJICAgICBlbXNnLmNtc2cuY21zZ19sZW4sCi0JCSAgICAgZW1zZy5jbXNnLmNtc2dfbGV2ZWwsCi0JCSAgICAgZW1zZy5jbXNnLmNtc2dfdHlwZSk7Ci0KLQkJaWYgKHNpbi5zaW5fZmFtaWx5ICE9IEFGX0lORVQpIHsKLQkJCXByaW50aygiUnggSWdub3JpbmcgZXJyb3IgcmVwb3J0IHdpdGggbm9uLUlORVQgYWRkcmVzcyIKLQkJCSAgICAgICAiIChmYW09JXUpIiwKLQkJCSAgICAgICBzaW4uc2luX2ZhbWlseSk7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCV9uZXQoIlJ4IFJlY2VpdmVkIG1lc3NhZ2UgcGVydGFpbmluZyB0byBob3N0IGFkZHI9JXggcG9ydD0laHUiLAotCQkgICAgIG50b2hsKHNpbi5zaW5fYWRkci5zX2FkZHIpLCBudG9ocyhzaW4uc2luX3BvcnQpKTsKLQotCQlpZiAoZW1zZy5jbXNnLmNtc2dfbGV2ZWwgIT0gU09MX0lQIHx8Ci0JCSAgICBlbXNnLmNtc2cuY21zZ190eXBlICE9IElQX1JFQ1ZFUlIpIHsKLQkJCXByaW50aygiUnggSWdub3JpbmcgdW5rbm93biBlcnJvciByZXBvcnQiCi0JCQkgICAgICAgIiB7IGxldmVsPSV1IHR5cGU9JXUgfSIsCi0JCQkgICAgICAgZW1zZy5jbXNnLmNtc2dfbGV2ZWwsCi0JCQkgICAgICAgZW1zZy5jbXNnLmNtc2dfdHlwZSk7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCWlmIChtc2cubXNnX2NvbnRyb2xsZW4gPCBzaXplb2YoZW1zZy5jbXNnKSArIHNpemVvZihlbXNnLmVlKSkgewotCQkJcHJpbnRrKCIlczogc2hvcnQgZXJyb3IgbWVzc2FnZSAoJVp1KVxuIiwKLQkJCSAgICAgICBfX0ZVTkNUSU9OX18sIG1zZy5tc2dfY29udHJvbGxlbik7Ci0JCQlfbGVhdmUoIiIpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJcG9ydCA9IHNpbi5zaW5fcG9ydDsKLQotCQlzd2l0Y2ggKGVtc2cuZWUuZWVfb3JpZ2luKSB7Ci0JCWNhc2UgU09fRUVfT1JJR0lOX0lDTVA6Ci0JCQlsb2NhbCA9IDA7Ci0JCQlzd2l0Y2ggKGVtc2cuZWUuZWVfdHlwZSkgewotCQkJY2FzZSBJQ01QX0RFU1RfVU5SRUFDSDoKLQkJCQlzd2l0Y2ggKGVtc2cuZWUuZWVfY29kZSkgewotCQkJCWNhc2UgSUNNUF9ORVRfVU5SRUFDSDoKLQkJCQkJX25ldCgiUnggUmVjZWl2ZWQgSUNNUCBOZXR3b3JrIFVucmVhY2hhYmxlIik7Ci0JCQkJCXBvcnQgPSAwOwotCQkJCQllcnIgPSAtRU5FVFVOUkVBQ0g7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSUNNUF9IT1NUX1VOUkVBQ0g6Ci0JCQkJCV9uZXQoIlJ4IFJlY2VpdmVkIElDTVAgSG9zdCBVbnJlYWNoYWJsZSIpOwotCQkJCQlwb3J0ID0gMDsKLQkJCQkJZXJyID0gLUVIT1NUVU5SRUFDSDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJQ01QX1BPUlRfVU5SRUFDSDoKLQkJCQkJX25ldCgiUnggUmVjZWl2ZWQgSUNNUCBQb3J0IFVucmVhY2hhYmxlIik7Ci0JCQkJCWVyciA9IC1FQ09OTlJFRlVTRUQ7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSUNNUF9ORVRfVU5LTk9XTjoKLQkJCQkJX25ldCgiUnggUmVjZWl2ZWQgSUNNUCBVbmtub3duIE5ldHdvcmsiKTsKLQkJCQkJcG9ydCA9IDA7Ci0JCQkJCWVyciA9IC1FTkVUVU5SRUFDSDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJQ01QX0hPU1RfVU5LTk9XTjoKLQkJCQkJX25ldCgiUnggUmVjZWl2ZWQgSUNNUCBVbmtub3duIEhvc3QiKTsKLQkJCQkJcG9ydCA9IDA7Ci0JCQkJCWVyciA9IC1FSE9TVFVOUkVBQ0g7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCV9uZXQoIlJ4IFJlY2VpdmVkIElDTVAgRGVzdFVucmVhY2ggeyBjb2RlPSV1IH0iLAotCQkJCQkgICAgIGVtc2cuZWUuZWVfY29kZSk7Ci0JCQkJCWVyciA9IGVtc2cuZWUuZWVfZXJybm87Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlicmVhazsKLQotCQkJY2FzZSBJQ01QX1RJTUVfRVhDRUVERUQ6Ci0JCQkJX25ldCgiUnggUmVjZWl2ZWQgSUNNUCBUVEwgRXhjZWVkZWQiKTsKLQkJCQllcnIgPSBlbXNnLmVlLmVlX2Vycm5vOwotCQkJCWJyZWFrOwotCi0JCQlkZWZhdWx0OgotCQkJCV9wcm90bygiUnggUmVjZWl2ZWQgSUNNUCBlcnJvciB7IHR5cGU9JXUgY29kZT0ldSB9IiwKLQkJCQkgICAgICAgZW1zZy5lZS5lZV90eXBlLCBlbXNnLmVlLmVlX2NvZGUpOwotCQkJCWVyciA9IGVtc2cuZWUuZWVfZXJybm87Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIFNPX0VFX09SSUdJTl9MT0NBTDoKLQkJCV9wcm90bygiUnggUmVjZWl2ZWQgbG9jYWwgZXJyb3IgeyBlcnJvcj0lZCB9IiwKLQkJCSAgICAgICBlbXNnLmVlLmVlX2Vycm5vKTsKLQkJCWxvY2FsID0gMTsKLQkJCWVyciA9IGVtc2cuZWUuZWVfZXJybm87Ci0JCQlicmVhazsKLQotCQljYXNlIFNPX0VFX09SSUdJTl9OT05FOgotCQljYXNlIFNPX0VFX09SSUdJTl9JQ01QNjoKLQkJZGVmYXVsdDoKLQkJCV9wcm90bygiUnggUmVjZWl2ZWQgZXJyb3IgcmVwb3J0IHsgb3JpZz0ldSB9IiwKLQkJCSAgICAgICBlbXNnLmVlLmVlX29yaWdpbik7Ci0JCQlsb2NhbCA9IDA7Ci0JCQllcnIgPSBlbXNnLmVlLmVlX2Vycm5vOwotCQkJYnJlYWs7Ci0JCX0KLQotCQkvKiBmaW5kIGFsbCB0aGUgY29ubmVjdGlvbnMgYmV0d2VlbiB0aGlzIHRyYW5zcG9ydCBhbmQgdGhlCi0JCSAqIGFmZmVjdGVkIGRlc3RpbmF0aW9uICovCi0JCUlOSVRfTElTVF9IRUFEKCZjb25ucSk7Ci0KLQkJaWYgKHJ4cnBjX3BlZXJfbG9va3VwKHRyYW5zLCBzaW4uc2luX2FkZHIuc19hZGRyLAotCQkJCSAgICAgICZwZWVyKSA9PSAwKSB7Ci0JCQlyZWFkX2xvY2soJnBlZXItPmNvbm5fbG9jayk7Ci0JCQlsaXN0X2Zvcl9lYWNoKF9wLCAmcGVlci0+Y29ubl9hY3RpdmUpIHsKLQkJCQljb25uID0gbGlzdF9lbnRyeShfcCwgc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24sCi0JCQkJCQkgIGxpbmspOwotCQkJCWlmIChwb3J0ICYmIGNvbm4tPmFkZHIuc2luX3BvcnQgIT0gcG9ydCkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKCFsaXN0X2VtcHR5KCZjb25uLT5lcnJfbGluaykpCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJcnhycGNfZ2V0X2Nvbm5lY3Rpb24oY29ubik7Ci0JCQkJbGlzdF9hZGRfdGFpbCgmY29ubi0+ZXJyX2xpbmssICZjb25ucSk7Ci0JCQl9Ci0JCQlyZWFkX3VubG9jaygmcGVlci0+Y29ubl9sb2NrKTsKLQotCQkJLyogc2VydmljZSBhbGwgdGhvc2UgY29ubmVjdGlvbnMgKi8KLQkJCXdoaWxlICghbGlzdF9lbXB0eSgmY29ubnEpKSB7Ci0JCQkJY29ubiA9IGxpc3RfZW50cnkoY29ubnEubmV4dCwKLQkJCQkJCSAgc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24sCi0JCQkJCQkgIGVycl9saW5rKTsKLQkJCQlsaXN0X2RlbCgmY29ubi0+ZXJyX2xpbmspOwotCi0JCQkJcnhycGNfY29ubl9oYW5kbGVfZXJyb3IoY29ubiwgbG9jYWwsIGVycik7Ci0KLQkJCQlyeHJwY19wdXRfY29ubmVjdGlvbihjb25uKTsKLQkJCX0KLQotCQkJcnhycGNfcHV0X3BlZXIocGVlcik7Ci0JCX0KLQl9Ci0KLQlfbGVhdmUoIiIpOwotCXJldHVybjsKLX0gLyogZW5kIHJ4cnBjX3RyYW5zX3JlY2VpdmVfZXJyb3JfcmVwb3J0KCkgKi8KZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9LY29uZmlnIGIvbmV0L3NjaGVkL0tjb25maWcKaW5kZXggZjQ1NDRkZC4uNDc1ZGY4NCAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL0tjb25maWcKKysrIGIvbmV0L3NjaGVkL0tjb25maWcKQEAgLTQ2LDYyICs0Niw2IEBACiAKIGlmIE5FVF9TQ0hFRAogCi1jaG9pY2UKLQlwcm9tcHQgIlBhY2tldCBzY2hlZHVsZXIgY2xvY2sgc291cmNlIgotCWRlZmF1bHQgTkVUX1NDSF9DTEtfR0VUVElNRU9GREFZCi0JLS0taGVscC0tLQotCSAgUGFja2V0IHNjaGVkdWxlcnMgbmVlZCBhIG1vbm90b25pYyBjbG9jayB0aGF0IGluY3JlbWVudHMgYXQgYSBzdGF0aWMKLQkgIHJhdGUuIFRoZSBrZXJuZWwgcHJvdmlkZXMgc2V2ZXJhbCBzdWl0YWJsZSBpbnRlcmZhY2VzLCBlYWNoIHdpdGgKLQkgIGRpZmZlcmVudCBwcm9wZXJ0aWVzOgotCSAgCi0JICAtIGhpZ2ggcmVzb2x1dGlvbiAodXMgb3IgYmV0dGVyKQotCSAgLSBmYXN0IHRvIHJlYWQgKG1pbmltYWwgbG9ja2luZywgbm8gaS9vIGFjY2VzcykKLQkgIC0gc3luY2hyb25pemVkIG9uIGFsbCBwcm9jZXNzb3JzCi0JICAtIGhhbmRsZXMgY3B1IGNsb2NrIGZyZXF1ZW5jeSBjaGFuZ2VzCi0KLQkgIGJ1dCBub3RoaW5nIHByb3ZpZGVzIGFsbCBvZiB0aGUgYWJvdmUuCi0KLWNvbmZpZyBORVRfU0NIX0NMS19KSUZGSUVTCi0JYm9vbCAiVGltZXIgaW50ZXJydXB0IgotCS0tLWhlbHAtLS0KLQkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gdXNlIHRoZSB0aW1lciBpbnRlcnJ1cHQgKGppZmZpZXMpIGFzIGNsb2NrCi0JICBzb3VyY2UuIFRoaXMgY2xvY2sgc291cmNlIGlzIGZhc3QsIHN5bmNocm9uaXplZCBvbiBhbGwgcHJvY2Vzc29ycyBhbmQKLQkgIGhhbmRsZXMgY3B1IGNsb2NrIGZyZXF1ZW5jeSBjaGFuZ2VzLCBidXQgaXRzIHJlc29sdXRpb24gaXMgdG9vIGxvdwotCSAgZm9yIGFjY3VyYXRlIHNoYXBpbmcgZXhjZXB0IGF0IHZlcnkgbG93IHNwZWVkLgotCi1jb25maWcgTkVUX1NDSF9DTEtfR0VUVElNRU9GREFZCi0JYm9vbCAiZ2V0dGltZW9mZGF5IgotCS0tLWhlbHAtLS0KLQkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gdXNlIGdldHRpbWVvZmRheSBhcyBjbG9jayBzb3VyY2UuIFRoaXMgY2xvY2sKLQkgIHNvdXJjZSBoYXMgaGlnaCByZXNvbHV0aW9uLCBpcyBzeW5jaHJvbml6ZWQgb24gYWxsIHByb2Nlc3NvcnMgYW5kCi0JICBoYW5kbGVzIGNwdSBjbG9jayBmcmVxdWVuY3kgY2hhbmdlcywgYnV0IGl0IGlzIHNsb3cuCi0KLQkgIENob29zZSB0aGlzIGlmIHlvdSBuZWVkIGEgaGlnaCByZXNvbHV0aW9uIGNsb2NrIHNvdXJjZSBidXQgY2FuJ3QgdXNlCi0JICB0aGUgQ1BVJ3MgY3ljbGUgY291bnRlci4KLQotIyBkb24ndCBhbGxvdyBvbiBTTVAgeDg2IGJlY2F1c2UgdGhleSBjYW4gaGF2ZSB1bnN5bmNocm9uaXplZCBUU0NzLgotIyBnZXR0aW1lb2ZkYXkgaXMgYSBnb29kIGFsdGVybmF0aXZlCi1jb25maWcgTkVUX1NDSF9DTEtfQ1BVCi0JYm9vbCAiQ1BVIGN5Y2xlIGNvdW50ZXIiCi0JZGVwZW5kcyBvbiAoKFg4Nl9UU0MgfHwgWDg2XzY0KSAmJiAhU01QKSB8fCBBTFBIQSB8fCBTUEFSQzY0IHx8IFBQQzY0IHx8IElBNjQKLQktLS1oZWxwLS0tCi0JICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIHVzZSB0aGUgQ1BVJ3MgY3ljbGUgY291bnRlciBhcyBjbG9jayBzb3VyY2UuCi0JICBUaGlzIGlzIGEgY2hlYXAgYW5kIGhpZ2ggcmVzb2x1dGlvbiBjbG9jayBzb3VyY2UsIGJ1dCBvbiBzb21lCi0JICBhcmNoaXRlY3R1cmVzIGl0IGlzIG5vdCBzeW5jaHJvbml6ZWQgb24gYWxsIHByb2Nlc3NvcnMgYW5kIGRvZXNuJ3QKLQkgIGhhbmRsZSBjcHUgY2xvY2sgZnJlcXVlbmN5IGNoYW5nZXMuCi0KLQkgIFRoZSB1c2VhYmxlIGN5Y2xlIGNvdW50ZXJzIGFyZToKLQotCSAgCXg4Ni94ODZfNjQJLSBUaW1lc3RhbXAgQ291bnRlcgotCQlhbHBoYQkJLSBDeWNsZSBDb3VudGVyCi0JCXNwYXJjNjQJCS0gJXRpY2tzIHJlZ2lzdGVyCi0JCXBwYzY0CQktIFRpbWUgYmFzZQotCQlpYTY0CQktIEludGVydmFsIFRpbWUgQ291bnRlcgotCi0JICBDaG9vc2UgdGhpcyBpZiB5b3VyIENQVSdzIGN5Y2xlIGNvdW50ZXIgaXMgd29ya2luZyBwcm9wZXJseS4KLQotZW5kY2hvaWNlCi0KIGNvbW1lbnQgIlF1ZXVlaW5nL1NjaGVkdWxpbmciCiAKIGNvbmZpZyBORVRfU0NIX0NCUQpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL2FjdF9hcGkuYyBiL25ldC9zY2hlZC9hY3RfYXBpLmMKaW5kZXggY2IyMTYxNy4uNzExZGQyNiAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL2FjdF9hcGkuYworKysgYi9uZXQvc2NoZWQvYWN0X2FwaS5jCkBAIC0yNSwxMiArMjUsMTIgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLSNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgva21vZC5oPgogI2luY2x1ZGUgPG5ldC9zb2NrLmg+CiAjaW5jbHVkZSA8bmV0L3NjaF9nZW5lcmljLmg+CiAjaW5jbHVkZSA8bmV0L2FjdF9hcGkuaD4KKyNpbmNsdWRlIDxuZXQvbmV0bGluay5oPgogCiB2b2lkIHRjZl9oYXNoX2Rlc3Ryb3koc3RydWN0IHRjZl9jb21tb24gKnAsIHN0cnVjdCB0Y2ZfaGFzaGluZm8gKmhpbmZvKQogewpAQCAtOTMsMTUgKzkzLDE1IEBACiAJCQkJY29udGludWU7CiAJCQlhLT5wcml2ID0gcDsKIAkJCWEtPm9yZGVyID0gbl9pOwotCQkJciA9IChzdHJ1Y3QgcnRhdHRyKikgc2tiLT50YWlsOworCQkJciA9IChzdHJ1Y3QgcnRhdHRyICopc2tiX3RhaWxfcG9pbnRlcihza2IpOwogCQkJUlRBX1BVVChza2IsIGEtPm9yZGVyLCAwLCBOVUxMKTsKIAkJCWVyciA9IHRjZl9hY3Rpb25fZHVtcF8xKHNrYiwgYSwgMCwgMCk7CiAJCQlpZiAoZXJyIDwgMCkgewogCQkJCWluZGV4LS07Ci0JCQkJc2tiX3RyaW0oc2tiLCAodTgqKXIgLSBza2ItPmRhdGEpOworCQkJCW5sbXNnX3RyaW0oc2tiLCByKTsKIAkJCQlnb3RvIGRvbmU7CiAJCQl9Ci0JCQlyLT5ydGFfbGVuID0gc2tiLT50YWlsIC0gKHU4KilyOworCQkJci0+cnRhX2xlbiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKSAtICh1OCAqKXI7CiAJCQluX2krKzsKIAkJCWlmIChuX2kgPj0gVENBX0FDVF9NQVhfUFJJTykKIAkJCQlnb3RvIGRvbmU7CkBAIC0xMTQsNyArMTE0LDcgQEAKIAlyZXR1cm4gbl9pOwogCiBydGF0dHJfZmFpbHVyZToKLQlza2JfdHJpbShza2IsICh1OCopciAtIHNrYi0+ZGF0YSk7CisJbmxtc2dfdHJpbShza2IsIHIpOwogCWdvdG8gZG9uZTsKIH0KIApAQCAtMTI1LDcgKzEyNSw3IEBACiAJc3RydWN0IHJ0YXR0ciAqciA7CiAJaW50IGk9IDAsIG5faSA9IDA7CiAKLQlyID0gKHN0cnVjdCBydGF0dHIqKSBza2ItPnRhaWw7CisJciA9IChzdHJ1Y3QgcnRhdHRyICopc2tiX3RhaWxfcG9pbnRlcihza2IpOwogCVJUQV9QVVQoc2tiLCBhLT5vcmRlciwgMCwgTlVMTCk7CiAJUlRBX1BVVChza2IsIFRDQV9LSU5ELCBJRk5BTVNJWiwgYS0+b3BzLT5raW5kKTsKIAlmb3IgKGkgPSAwOyBpIDwgKGhpbmZvLT5obWFzayArIDEpOyBpKyspIHsKQEAgLTE0MCwxMSArMTQwLDExIEBACiAJCX0KIAl9CiAJUlRBX1BVVChza2IsIFRDQV9GQ05ULCA0LCAmbl9pKTsKLQlyLT5ydGFfbGVuID0gc2tiLT50YWlsIC0gKHU4KilyOworCXItPnJ0YV9sZW4gPSBza2JfdGFpbF9wb2ludGVyKHNrYikgLSAodTggKilyOwogCiAJcmV0dXJuIG5faTsKIHJ0YXR0cl9mYWlsdXJlOgotCXNrYl90cmltKHNrYiwgKHU4KilyIC0gc2tiLT5kYXRhKTsKKwlubG1zZ190cmltKHNrYiwgcik7CiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKQEAgLTQyMyw3ICs0MjMsNyBAQAogdGNmX2FjdGlvbl9kdW1wXzEoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHRjX2FjdGlvbiAqYSwgaW50IGJpbmQsIGludCByZWYpCiB7CiAJaW50IGVyciA9IC1FSU5WQUw7Ci0JdW5zaWduZWQgY2hhciAqYiA9IHNrYi0+dGFpbDsKKwl1bnNpZ25lZCBjaGFyICpiID0gc2tiX3RhaWxfcG9pbnRlcihza2IpOwogCXN0cnVjdCBydGF0dHIgKnI7CiAKIAlpZiAoYS0+b3BzID09IE5VTEwgfHwgYS0+b3BzLT5kdW1wID09IE5VTEwpCkBAIC00MzIsMTUgKzQzMiwxNSBAQAogCVJUQV9QVVQoc2tiLCBUQ0FfS0lORCwgSUZOQU1TSVosIGEtPm9wcy0+a2luZCk7CiAJaWYgKHRjZl9hY3Rpb25fY29weV9zdGF0cyhza2IsIGEsIDApKQogCQlnb3RvIHJ0YXR0cl9mYWlsdXJlOwotCXIgPSAoc3RydWN0IHJ0YXR0ciopIHNrYi0+dGFpbDsKKwlyID0gKHN0cnVjdCBydGF0dHIgKilza2JfdGFpbF9wb2ludGVyKHNrYik7CiAJUlRBX1BVVChza2IsIFRDQV9PUFRJT05TLCAwLCBOVUxMKTsKIAlpZiAoKGVyciA9IHRjZl9hY3Rpb25fZHVtcF9vbGQoc2tiLCBhLCBiaW5kLCByZWYpKSA+IDApIHsKLQkJci0+cnRhX2xlbiA9IHNrYi0+dGFpbCAtICh1OCopcjsKKwkJci0+cnRhX2xlbiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKSAtICh1OCAqKXI7CiAJCXJldHVybiBlcnI7CiAJfQogCiBydGF0dHJfZmFpbHVyZToKLQlza2JfdHJpbShza2IsIGIgLSBza2ItPmRhdGEpOworCW5sbXNnX3RyaW0oc2tiLCBiKTsKIAlyZXR1cm4gLTE7CiB9CiAKQEAgLTQ0OSwxNyArNDQ5LDE3IEBACiB7CiAJc3RydWN0IHRjX2FjdGlvbiAqYTsKIAlpbnQgZXJyID0gLUVJTlZBTDsKLQl1bnNpZ25lZCBjaGFyICpiID0gc2tiLT50YWlsOworCXVuc2lnbmVkIGNoYXIgKmIgPSBza2JfdGFpbF9wb2ludGVyKHNrYik7CiAJc3RydWN0IHJ0YXR0ciAqciA7CiAKIAl3aGlsZSAoKGEgPSBhY3QpICE9IE5VTEwpIHsKLQkJciA9IChzdHJ1Y3QgcnRhdHRyKikgc2tiLT50YWlsOworCQlyID0gKHN0cnVjdCBydGF0dHIgKilza2JfdGFpbF9wb2ludGVyKHNrYik7CiAJCWFjdCA9IGEtPm5leHQ7CiAJCVJUQV9QVVQoc2tiLCBhLT5vcmRlciwgMCwgTlVMTCk7CiAJCWVyciA9IHRjZl9hY3Rpb25fZHVtcF8xKHNrYiwgYSwgYmluZCwgcmVmKTsKIAkJaWYgKGVyciA8IDApCiAJCQlnb3RvIGVycm91dDsKLQkJci0+cnRhX2xlbiA9IHNrYi0+dGFpbCAtICh1OCopcjsKKwkJci0+cnRhX2xlbiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKSAtICh1OCAqKXI7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC00NjcsNyArNDY3LDcgQEAKIHJ0YXR0cl9mYWlsdXJlOgogCWVyciA9IC1FSU5WQUw7CiBlcnJvdXQ6Ci0Jc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKKwlubG1zZ190cmltKHNrYiwgYik7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtNjM1LDcgKzYzNSw3IEBACiB7CiAJc3RydWN0IHRjYW1zZyAqdDsKIAlzdHJ1Y3Qgbmxtc2doZHIgKm5saDsKLQl1bnNpZ25lZCBjaGFyICpiID0gc2tiLT50YWlsOworCXVuc2lnbmVkIGNoYXIgKmIgPSBza2JfdGFpbF9wb2ludGVyKHNrYik7CiAJc3RydWN0IHJ0YXR0ciAqeDsKIAogCW5saCA9IE5MTVNHX05FVyhza2IsIHBpZCwgc2VxLCBldmVudCwgc2l6ZW9mKCp0KSwgZmxhZ3MpOwpAQCAtNjQ1LDIwICs2NDUsMjAgQEAKIAl0LT50Y2FfX3BhZDEgPSAwOwogCXQtPnRjYV9fcGFkMiA9IDA7CiAKLQl4ID0gKHN0cnVjdCBydGF0dHIqKSBza2ItPnRhaWw7CisJeCA9IChzdHJ1Y3QgcnRhdHRyICopc2tiX3RhaWxfcG9pbnRlcihza2IpOwogCVJUQV9QVVQoc2tiLCBUQ0FfQUNUX1RBQiwgMCwgTlVMTCk7CiAKIAlpZiAodGNmX2FjdGlvbl9kdW1wKHNrYiwgYSwgYmluZCwgcmVmKSA8IDApCiAJCWdvdG8gcnRhdHRyX2ZhaWx1cmU7CiAKLQl4LT5ydGFfbGVuID0gc2tiLT50YWlsIC0gKHU4Kil4OworCXgtPnJ0YV9sZW4gPSBza2JfdGFpbF9wb2ludGVyKHNrYikgLSAodTggKil4OwogCi0JbmxoLT5ubG1zZ19sZW4gPSBza2ItPnRhaWwgLSBiOworCW5saC0+bmxtc2dfbGVuID0gc2tiX3RhaWxfcG9pbnRlcihza2IpIC0gYjsKIAlyZXR1cm4gc2tiLT5sZW47CiAKIHJ0YXR0cl9mYWlsdXJlOgogbmxtc2dfZmFpbHVyZToKLQlza2JfdHJpbShza2IsIGIgLSBza2ItPmRhdGEpOworCW5sbXNnX3RyaW0oc2tiLCBiKTsKIAlyZXR1cm4gLTE7CiB9CiAKQEAgLTc2Nyw3ICs3NjcsNyBAQAogCQlyZXR1cm4gLUVOT0JVRlM7CiAJfQogCi0JYiA9ICh1bnNpZ25lZCBjaGFyICopc2tiLT50YWlsOworCWIgPSBza2JfdGFpbF9wb2ludGVyKHNrYik7CiAKIAlpZiAocnRhdHRyX3BhcnNlX25lc3RlZCh0YiwgVENBX0FDVF9NQVgsIHJ0YSkgPCAwKQogCQlnb3RvIGVycl9vdXQ7CkBAIC03ODMsMTYgKzc4MywxNiBAQAogCXQtPnRjYV9fcGFkMSA9IDA7CiAJdC0+dGNhX19wYWQyID0gMDsKIAotCXggPSAoc3RydWN0IHJ0YXR0ciAqKSBza2ItPnRhaWw7CisJeCA9IChzdHJ1Y3QgcnRhdHRyICopc2tiX3RhaWxfcG9pbnRlcihza2IpOwogCVJUQV9QVVQoc2tiLCBUQ0FfQUNUX1RBQiwgMCwgTlVMTCk7CiAKIAllcnIgPSBhLT5vcHMtPndhbGsoc2tiLCAmZGNiLCBSVE1fREVMQUNUSU9OLCBhKTsKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBydGF0dHJfZmFpbHVyZTsKIAotCXgtPnJ0YV9sZW4gPSBza2ItPnRhaWwgLSAodTggKikgeDsKKwl4LT5ydGFfbGVuID0gc2tiX3RhaWxfcG9pbnRlcihza2IpIC0gKHU4ICopeDsKIAotCW5saC0+bmxtc2dfbGVuID0gc2tiLT50YWlsIC0gYjsKKwlubGgtPm5sbXNnX2xlbiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKSAtIGI7CiAJbmxoLT5ubG1zZ19mbGFncyB8PSBOTE1fRl9ST09UOwogCW1vZHVsZV9wdXQoYS0+b3BzLT5vd25lcik7CiAJa2ZyZWUoYSk7CkBAIC04ODQsNyArODg0LDcgQEAKIAlpZiAoIXNrYikKIAkJcmV0dXJuIC1FTk9CVUZTOwogCi0JYiA9ICh1bnNpZ25lZCBjaGFyICopc2tiLT50YWlsOworCWIgPSBza2JfdGFpbF9wb2ludGVyKHNrYik7CiAKIAlubGggPSBOTE1TR19ORVcoc2tiLCBwaWQsIHNlcSwgZXZlbnQsIHNpemVvZigqdCksIGZsYWdzKTsKIAl0ID0gTkxNU0dfREFUQShubGgpOwpAQCAtODkyLDE1ICs4OTIsMTUgQEAKIAl0LT50Y2FfX3BhZDEgPSAwOwogCXQtPnRjYV9fcGFkMiA9IDA7CiAKLQl4ID0gKHN0cnVjdCBydGF0dHIqKSBza2ItPnRhaWw7CisJeCA9IChzdHJ1Y3QgcnRhdHRyICopc2tiX3RhaWxfcG9pbnRlcihza2IpOwogCVJUQV9QVVQoc2tiLCBUQ0FfQUNUX1RBQiwgMCwgTlVMTCk7CiAKIAlpZiAodGNmX2FjdGlvbl9kdW1wKHNrYiwgYSwgMCwgMCkgPCAwKQogCQlnb3RvIHJ0YXR0cl9mYWlsdXJlOwogCi0JeC0+cnRhX2xlbiA9IHNrYi0+dGFpbCAtICh1OCopeDsKKwl4LT5ydGFfbGVuID0gc2tiX3RhaWxfcG9pbnRlcihza2IpIC0gKHU4ICopeDsKIAotCW5saC0+bmxtc2dfbGVuID0gc2tiLT50YWlsIC0gYjsKKwlubGgtPm5sbXNnX2xlbiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKSAtIGI7CiAJTkVUTElOS19DQihza2IpLmRzdF9ncm91cCA9IFJUTkxHUlBfVEM7CiAKIAllcnIgPSBydG5ldGxpbmtfc2VuZChza2IsIHBpZCwgUlROTEdSUF9UQywgZmxhZ3MmTkxNX0ZfRUNITyk7CkBAIC0xMDE1LDcgKzEwMTUsNyBAQAogdGNfZHVtcF9hY3Rpb24oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKQogewogCXN0cnVjdCBubG1zZ2hkciAqbmxoOwotCXVuc2lnbmVkIGNoYXIgKmIgPSBza2ItPnRhaWw7CisJdW5zaWduZWQgY2hhciAqYiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKTsKIAlzdHJ1Y3QgcnRhdHRyICp4OwogCXN0cnVjdCB0Y19hY3Rpb25fb3BzICphX287CiAJc3RydWN0IHRjX2FjdGlvbiBhOwpAQCAtMTA0OCw3ICsxMDQ4LDcgQEAKIAl0LT50Y2FfX3BhZDEgPSAwOwogCXQtPnRjYV9fcGFkMiA9IDA7CiAKLQl4ID0gKHN0cnVjdCBydGF0dHIgKikgc2tiLT50YWlsOworCXggPSAoc3RydWN0IHJ0YXR0ciAqKXNrYl90YWlsX3BvaW50ZXIoc2tiKTsKIAlSVEFfUFVUKHNrYiwgVENBX0FDVF9UQUIsIDAsIE5VTEwpOwogCiAJcmV0ID0gYV9vLT53YWxrKHNrYiwgY2IsIFJUTV9HRVRBQ1RJT04sICZhKTsKQEAgLTEwNTYsMTIgKzEwNTYsMTIgQEAKIAkJZ290byBydGF0dHJfZmFpbHVyZTsKIAogCWlmIChyZXQgPiAwKSB7Ci0JCXgtPnJ0YV9sZW4gPSBza2ItPnRhaWwgLSAodTggKikgeDsKKwkJeC0+cnRhX2xlbiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKSAtICh1OCAqKXg7CiAJCXJldCA9IHNrYi0+bGVuOwogCX0gZWxzZQotCQlza2JfdHJpbShza2IsICh1OCopeCAtIHNrYi0+ZGF0YSk7CisJCW5sbXNnX3RyaW0oc2tiLCB4KTsKIAotCW5saC0+bmxtc2dfbGVuID0gc2tiLT50YWlsIC0gYjsKKwlubGgtPm5sbXNnX2xlbiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKSAtIGI7CiAJaWYgKE5FVExJTktfQ0IoY2ItPnNrYikucGlkICYmIHJldCkKIAkJbmxoLT5ubG1zZ19mbGFncyB8PSBOTE1fRl9NVUxUSTsKIAltb2R1bGVfcHV0KGFfby0+b3duZXIpOwpAQCAtMTA3MCwyMCArMTA3MCwxNSBAQAogcnRhdHRyX2ZhaWx1cmU6CiBubG1zZ19mYWlsdXJlOgogCW1vZHVsZV9wdXQoYV9vLT5vd25lcik7Ci0Jc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKKwlubG1zZ190cmltKHNrYiwgYik7CiAJcmV0dXJuIHNrYi0+bGVuOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCB0Y19hY3Rpb25faW5pdCh2b2lkKQogewotCXN0cnVjdCBydG5ldGxpbmtfbGluayAqbGlua19wID0gcnRuZXRsaW5rX2xpbmtzW1BGX1VOU1BFQ107Ci0KLQlpZiAobGlua19wKSB7Ci0JCWxpbmtfcFtSVE1fTkVXQUNUSU9OLVJUTV9CQVNFXS5kb2l0ID0gdGNfY3RsX2FjdGlvbjsKLQkJbGlua19wW1JUTV9ERUxBQ1RJT04tUlRNX0JBU0VdLmRvaXQgPSB0Y19jdGxfYWN0aW9uOwotCQlsaW5rX3BbUlRNX0dFVEFDVElPTi1SVE1fQkFTRV0uZG9pdCA9IHRjX2N0bF9hY3Rpb247Ci0JCWxpbmtfcFtSVE1fR0VUQUNUSU9OLVJUTV9CQVNFXS5kdW1waXQgPSB0Y19kdW1wX2FjdGlvbjsKLQl9CisJcnRubF9yZWdpc3RlcihQRl9VTlNQRUMsIFJUTV9ORVdBQ1RJT04sIHRjX2N0bF9hY3Rpb24sIE5VTEwpOworCXJ0bmxfcmVnaXN0ZXIoUEZfVU5TUEVDLCBSVE1fREVMQUNUSU9OLCB0Y19jdGxfYWN0aW9uLCBOVUxMKTsKKwlydG5sX3JlZ2lzdGVyKFBGX1VOU1BFQywgUlRNX0dFVEFDVElPTiwgdGNfY3RsX2FjdGlvbiwgdGNfZHVtcF9hY3Rpb24pOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvYWN0X2dhY3QuYyBiL25ldC9zY2hlZC9hY3RfZ2FjdC5jCmluZGV4IDg3ZDBmYWYuLjc1MTdmMzcgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9hY3RfZ2FjdC5jCisrKyBiL25ldC9zY2hlZC9hY3RfZ2FjdC5jCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxuZXQvbmV0bGluay5oPgogI2luY2x1ZGUgPG5ldC9zb2NrLmg+CiAjaW5jbHVkZSA8bmV0L3BrdF9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3RjX2FjdC90Y19nYWN0Lmg+CkBAIC0xNTUsNyArMTU2LDcgQEAKIAogc3RhdGljIGludCB0Y2ZfZ2FjdF9kdW1wKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0Y19hY3Rpb24gKmEsIGludCBiaW5kLCBpbnQgcmVmKQogewotCXVuc2lnbmVkIGNoYXIgKmIgPSBza2ItPnRhaWw7CisJdW5zaWduZWQgY2hhciAqYiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKTsKIAlzdHJ1Y3QgdGNfZ2FjdCBvcHQ7CiAJc3RydWN0IHRjZl9nYWN0ICpnYWN0ID0gYS0+cHJpdjsKIAlzdHJ1Y3QgdGNmX3QgdDsKQEAgLTE4MSw3ICsxODIsNyBAQAogCXJldHVybiBza2ItPmxlbjsKIAogcnRhdHRyX2ZhaWx1cmU6Ci0Jc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKKwlubG1zZ190cmltKHNrYiwgYik7CiAJcmV0dXJuIC0xOwogfQogCmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvYWN0X2lwdC5jIGIvbmV0L3NjaGVkL2FjdF9pcHQuYwppbmRleCA0N2YwYjEzLi4wMGIwNWY0IDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvYWN0X2lwdC5jCisrKyBiL25ldC9zY2hlZC9hY3RfaXB0LmMKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KKyNpbmNsdWRlIDxuZXQvbmV0bGluay5oPgogI2luY2x1ZGUgPG5ldC9zb2NrLmg+CiAjaW5jbHVkZSA8bmV0L3BrdF9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3RjX2FjdC90Y19pcHQuaD4KQEAgLTI0NSw3ICsyNDYsNyBAQAogCiBzdGF0aWMgaW50IHRjZl9pcHRfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdGNfYWN0aW9uICphLCBpbnQgYmluZCwgaW50IHJlZikKIHsKLQl1bnNpZ25lZCBjaGFyICpiID0gc2tiLT50YWlsOworCXVuc2lnbmVkIGNoYXIgKmIgPSBza2JfdGFpbF9wb2ludGVyKHNrYik7CiAJc3RydWN0IHRjZl9pcHQgKmlwdCA9IGEtPnByaXY7CiAJc3RydWN0IGlwdF9lbnRyeV90YXJnZXQgKnQ7CiAJc3RydWN0IHRjZl90IHRtOwpAQCAtMjc3LDcgKzI3OCw3IEBACiAJcmV0dXJuIHNrYi0+bGVuOwogCiBydGF0dHJfZmFpbHVyZToKLQlza2JfdHJpbShza2IsIGIgLSBza2ItPmRhdGEpOworCW5sbXNnX3RyaW0oc2tiLCBiKTsKIAlrZnJlZSh0KTsKIAlyZXR1cm4gLTE7CiB9CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvYWN0X21pcnJlZC5jIGIvbmV0L3NjaGVkL2FjdF9taXJyZWQuYwppbmRleCAzZTkzNjgzLi5kZTIxYzkyIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvYWN0X21pcnJlZC5jCisrKyBiL25ldC9zY2hlZC9hY3RfbWlycmVkLmMKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPG5ldC9uZXRsaW5rLmg+CiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KICNpbmNsdWRlIDxuZXQvcGt0X3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvdGNfYWN0L3RjX21pcnJlZC5oPgpAQCAtMjA2LDcgKzIwNyw3IEBACiAKIHN0YXRpYyBpbnQgdGNmX21pcnJlZF9kdW1wKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0Y19hY3Rpb24gKmEsIGludCBiaW5kLCBpbnQgcmVmKQogewotCXVuc2lnbmVkIGNoYXIgKmIgPSBza2ItPnRhaWw7CisJdW5zaWduZWQgY2hhciAqYiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKTsKIAlzdHJ1Y3QgdGNmX21pcnJlZCAqbSA9IGEtPnByaXY7CiAJc3RydWN0IHRjX21pcnJlZCBvcHQ7CiAJc3RydWN0IHRjZl90IHQ7CkBAIC0yMjUsNyArMjI2LDcgQEAKIAlyZXR1cm4gc2tiLT5sZW47CiAKIHJ0YXR0cl9mYWlsdXJlOgotCXNrYl90cmltKHNrYiwgYiAtIHNrYi0+ZGF0YSk7CisJbmxtc2dfdHJpbShza2IsIGIpOwogCXJldHVybiAtMTsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL2FjdF9wZWRpdC5jIGIvbmV0L3NjaGVkL2FjdF9wZWRpdC5jCmluZGV4IDNkNmEyZmMuLjQ1YjNjZGEgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9hY3RfcGVkaXQuYworKysgYi9uZXQvc2NoZWQvYWN0X3BlZGl0LmMKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPG5ldC9uZXRsaW5rLmg+CiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KICNpbmNsdWRlIDxuZXQvcGt0X3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvdGNfYWN0L3RjX3BlZGl0Lmg+CkBAIC0xMzYsNyArMTM3LDcgQEAKIAkJfQogCX0KIAotCXBwdHIgPSBza2ItPm5oLnJhdzsKKwlwcHRyID0gc2tiX25ldHdvcmtfaGVhZGVyKHNrYik7CiAKIAlzcGluX2xvY2soJnAtPnRjZl9sb2NrKTsKIApAQCAtMTk1LDcgKzE5Niw3IEBACiBzdGF0aWMgaW50IHRjZl9wZWRpdF9kdW1wKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0Y19hY3Rpb24gKmEsCiAJCQkgIGludCBiaW5kLCBpbnQgcmVmKQogewotCXVuc2lnbmVkIGNoYXIgKmIgPSBza2ItPnRhaWw7CisJdW5zaWduZWQgY2hhciAqYiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKTsKIAlzdHJ1Y3QgdGNmX3BlZGl0ICpwID0gYS0+cHJpdjsKIAlzdHJ1Y3QgdGNfcGVkaXQgKm9wdDsKIAlzdHJ1Y3QgdGNmX3QgdDsKQEAgLTIyNiw3ICsyMjcsNyBAQAogCXJldHVybiBza2ItPmxlbjsKIAogcnRhdHRyX2ZhaWx1cmU6Ci0Jc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKKwlubG1zZ190cmltKHNrYiwgYik7CiAJa2ZyZWUob3B0KTsKIAlyZXR1cm4gLTE7CiB9CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvYWN0X3BvbGljZS5jIGIvbmV0L3NjaGVkL2FjdF9wb2xpY2UuYwppbmRleCAxMGE1YTVjLi42MTZmNDY1IDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvYWN0X3BvbGljZS5jCisrKyBiL25ldC9zY2hlZC9hY3RfcG9saWNlLmMKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KICNpbmNsdWRlIDxuZXQvYWN0X2FwaS5oPgorI2luY2x1ZGUgPG5ldC9uZXRsaW5rLmg+CiAKICNkZWZpbmUgTDJUKHAsTCkgICAoKHApLT50Y2ZwX1JfdGFiLT5kYXRhWyhMKT4+KHApLT50Y2ZwX1JfdGFiLT5yYXRlLmNlbGxfbG9nXSkKICNkZWZpbmUgTDJUX1AocCxMKSAoKHApLT50Y2ZwX1BfdGFiLT5kYXRhWyhMKT4+KHApLT50Y2ZwX1BfdGFiLT5yYXRlLmNlbGxfbG9nXSkKQEAgLTgwLDcgKzgxLDcgQEAKIAkJCQljb250aW51ZTsKIAkJCWEtPnByaXYgPSBwOwogCQkJYS0+b3JkZXIgPSBpbmRleDsKLQkJCXIgPSAoc3RydWN0IHJ0YXR0ciopIHNrYi0+dGFpbDsKKwkJCXIgPSAoc3RydWN0IHJ0YXR0ciAqKXNrYl90YWlsX3BvaW50ZXIoc2tiKTsKIAkJCVJUQV9QVVQoc2tiLCBhLT5vcmRlciwgMCwgTlVMTCk7CiAJCQlpZiAodHlwZSA9PSBSVE1fREVMQUNUSU9OKQogCQkJCWVyciA9IHRjZl9hY3Rpb25fZHVtcF8xKHNrYiwgYSwgMCwgMSk7CkBAIC04OCwxMCArODksMTAgQEAKIAkJCQllcnIgPSB0Y2ZfYWN0aW9uX2R1bXBfMShza2IsIGEsIDAsIDApOwogCQkJaWYgKGVyciA8IDApIHsKIAkJCQlpbmRleC0tOwotCQkJCXNrYl90cmltKHNrYiwgKHU4KilyIC0gc2tiLT5kYXRhKTsKKwkJCQlubG1zZ190cmltKHNrYiwgcik7CiAJCQkJZ290byBkb25lOwogCQkJfQotCQkJci0+cnRhX2xlbiA9IHNrYi0+dGFpbCAtICh1OCopcjsKKwkJCXItPnJ0YV9sZW4gPSBza2JfdGFpbF9wb2ludGVyKHNrYikgLSAodTggKilyOwogCQkJbl9pKys7CiAJCX0KIAl9CkBAIC0xMDIsNyArMTAzLDcgQEAKIAlyZXR1cm4gbl9pOwogCiBydGF0dHJfZmFpbHVyZToKLQlza2JfdHJpbShza2IsICh1OCopciAtIHNrYi0+ZGF0YSk7CisJbmxtc2dfdHJpbShza2IsIHIpOwogCWdvdG8gZG9uZTsKIH0KICNlbmRpZgpAQCAtMjQwLDcgKzI0MSw3IEBACiAJaWYgKHJldCAhPSBBQ1RfUF9DUkVBVEVEKQogCQlyZXR1cm4gcmV0OwogCi0JUFNDSEVEX0dFVF9USU1FKHBvbGljZS0+dGNmcF90X2MpOworCXBvbGljZS0+dGNmcF90X2MgPSBwc2NoZWRfZ2V0X3RpbWUoKTsKIAlwb2xpY2UtPnRjZl9pbmRleCA9IHBhcm0tPmluZGV4ID8gcGFybS0+aW5kZXggOgogCQl0Y2ZfaGFzaF9uZXdfaW5kZXgoJnBvbGljZV9pZHhfZ2VuLCAmcG9saWNlX2hhc2hfaW5mbyk7CiAJaCA9IHRjZl9oYXNoKHBvbGljZS0+dGNmX2luZGV4LCBQT0xfVEFCX01BU0spOwpAQCAtMjk1LDEwICsyOTYsOSBAQAogCQkJcmV0dXJuIHBvbGljZS0+dGNmcF9yZXN1bHQ7CiAJCX0KIAotCQlQU0NIRURfR0VUX1RJTUUobm93KTsKLQotCQl0b2tzID0gUFNDSEVEX1RESUZGX1NBRkUobm93LCBwb2xpY2UtPnRjZnBfdF9jLAotCQkJCQkgcG9saWNlLT50Y2ZwX2J1cnN0KTsKKwkJbm93ID0gcHNjaGVkX2dldF90aW1lKCk7CisJCXRva3MgPSBwc2NoZWRfdGRpZmZfYm91bmRlZChub3csIHBvbGljZS0+dGNmcF90X2MsCisJCQkJCSAgICBwb2xpY2UtPnRjZnBfYnVyc3QpOwogCQlpZiAocG9saWNlLT50Y2ZwX1BfdGFiKSB7CiAJCQlwdG9rcyA9IHRva3MgKyBwb2xpY2UtPnRjZnBfcHRva3M7CiAJCQlpZiAocHRva3MgPiAobG9uZylMMlRfUChwb2xpY2UsIHBvbGljZS0+dGNmcF9tdHUpKQpAQCAtMzI2LDcgKzMyNiw3IEBACiBzdGF0aWMgaW50CiB0Y2ZfYWN0X3BvbGljZV9kdW1wKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0Y19hY3Rpb24gKmEsIGludCBiaW5kLCBpbnQgcmVmKQogewotCXVuc2lnbmVkIGNoYXIJICpiID0gc2tiLT50YWlsOworCXVuc2lnbmVkIGNoYXIgKmIgPSBza2JfdGFpbF9wb2ludGVyKHNrYik7CiAJc3RydWN0IHRjZl9wb2xpY2UgKnBvbGljZSA9IGEtPnByaXY7CiAJc3RydWN0IHRjX3BvbGljZSBvcHQ7CiAKQEAgLTM1NSw3ICszNTUsNyBAQAogCXJldHVybiBza2ItPmxlbjsKIAogcnRhdHRyX2ZhaWx1cmU6Ci0Jc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKKwlubG1zZ190cmltKHNrYiwgYik7CiAJcmV0dXJuIC0xOwogfQogCkBAIC00OTQsNyArNDk0LDcgQEAKIAl9CiAJaWYgKHBvbGljZS0+dGNmcF9QX3RhYikKIAkJcG9saWNlLT50Y2ZwX3B0b2tzID0gTDJUX1AocG9saWNlLCBwb2xpY2UtPnRjZnBfbXR1KTsKLQlQU0NIRURfR0VUX1RJTUUocG9saWNlLT50Y2ZwX3RfYyk7CisJcG9saWNlLT50Y2ZwX3RfYyA9IHBzY2hlZF9nZXRfdGltZSgpOwogCXBvbGljZS0+dGNmX2luZGV4ID0gcGFybS0+aW5kZXggPyBwYXJtLT5pbmRleCA6CiAJCXRjZl9wb2xpY2VfbmV3X2luZGV4KCk7CiAJcG9saWNlLT50Y2ZfYWN0aW9uID0gcGFybS0+YWN0aW9uOwpAQCAtNTQyLDkgKzU0Miw5IEBACiAJCQlyZXR1cm4gcG9saWNlLT50Y2ZwX3Jlc3VsdDsKIAkJfQogCi0JCVBTQ0hFRF9HRVRfVElNRShub3cpOwotCQl0b2tzID0gUFNDSEVEX1RESUZGX1NBRkUobm93LCBwb2xpY2UtPnRjZnBfdF9jLAotCQkJCQkgcG9saWNlLT50Y2ZwX2J1cnN0KTsKKwkJbm93ID0gcHNjaGVkX2dldF90aW1lKCk7CisJCXRva3MgPSBwc2NoZWRfdGRpZmZfYm91bmRlZChub3csIHBvbGljZS0+dGNmcF90X2MsCisJCQkJCSAgICBwb2xpY2UtPnRjZnBfYnVyc3QpOwogCQlpZiAocG9saWNlLT50Y2ZwX1BfdGFiKSB7CiAJCQlwdG9rcyA9IHRva3MgKyBwb2xpY2UtPnRjZnBfcHRva3M7CiAJCQlpZiAocHRva3MgPiAobG9uZylMMlRfUChwb2xpY2UsIHBvbGljZS0+dGNmcF9tdHUpKQpAQCAtNTcyLDcgKzU3Miw3IEBACiAKIGludCB0Y2ZfcG9saWNlX2R1bXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHRjZl9wb2xpY2UgKnBvbGljZSkKIHsKLQl1bnNpZ25lZCBjaGFyICpiID0gc2tiLT50YWlsOworCXVuc2lnbmVkIGNoYXIgKmIgPSBza2JfdGFpbF9wb2ludGVyKHNrYik7CiAJc3RydWN0IHRjX3BvbGljZSBvcHQ7CiAKIAlvcHQuaW5kZXggPSBwb2xpY2UtPnRjZl9pbmRleDsKQEAgLTU5OCw3ICs1OTgsNyBAQAogCXJldHVybiBza2ItPmxlbjsKIAogcnRhdHRyX2ZhaWx1cmU6Ci0Jc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKKwlubG1zZ190cmltKHNrYiwgYik7CiAJcmV0dXJuIC0xOwogfQogCmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvYWN0X3NpbXBsZS5jIGIvbmV0L3NjaGVkL2FjdF9zaW1wbGUuYwppbmRleCBjNzk3MTE4Li4zNmUxZWRhIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvYWN0X3NpbXBsZS5jCisrKyBiL25ldC9zY2hlZC9hY3Rfc2ltcGxlLmMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxuZXQvbmV0bGluay5oPgogI2luY2x1ZGUgPG5ldC9wa3Rfc2NoZWQuaD4KIAogI2RlZmluZSBUQ0FfQUNUX1NJTVAgMjIKQEAgLTE1NSw3ICsxNTYsNyBAQAogc3RhdGljIGlubGluZSBpbnQgdGNmX3NpbXBfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdGNfYWN0aW9uICphLAogCQkJCWludCBiaW5kLCBpbnQgcmVmKQogewotCXVuc2lnbmVkIGNoYXIgKmIgPSBza2ItPnRhaWw7CisJdW5zaWduZWQgY2hhciAqYiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKTsKIAlzdHJ1Y3QgdGNmX2RlZmFjdCAqZCA9IGEtPnByaXY7CiAJc3RydWN0IHRjX2RlZmFjdCBvcHQ7CiAJc3RydWN0IHRjZl90IHQ7CkBAIC0xNzMsNyArMTc0LDcgQEAKIAlyZXR1cm4gc2tiLT5sZW47CiAKIHJ0YXR0cl9mYWlsdXJlOgotCXNrYl90cmltKHNrYiwgYiAtIHNrYi0+ZGF0YSk7CisJbmxtc2dfdHJpbShza2IsIGIpOwogCXJldHVybiAtMTsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL2Nsc19hcGkuYyBiL25ldC9zY2hlZC9jbHNfYXBpLmMKaW5kZXggNWM2ZmZkYi4uZWJmOTRlZCAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL2Nsc19hcGkuYworKysgYi9uZXQvc2NoZWQvY2xzX2FwaS5jCkBAIC0yOSw5ICsyOSwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CisjaW5jbHVkZSA8bGludXgvbmV0bGluay5oPgorI2luY2x1ZGUgPG5ldC9uZXRsaW5rLmg+CiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KICNpbmNsdWRlIDxuZXQvcGt0X3NjaGVkLmg+CiAjaW5jbHVkZSA8bmV0L3BrdF9jbHMuaD4KQEAgLTMyMyw3ICszMjQsNyBAQAogewogCXN0cnVjdCB0Y21zZyAqdGNtOwogCXN0cnVjdCBubG1zZ2hkciAgKm5saDsKLQl1bnNpZ25lZCBjaGFyCSAqYiA9IHNrYi0+dGFpbDsKKwl1bnNpZ25lZCBjaGFyICpiID0gc2tiX3RhaWxfcG9pbnRlcihza2IpOwogCiAJbmxoID0gTkxNU0dfTkVXKHNrYiwgcGlkLCBzZXEsIGV2ZW50LCBzaXplb2YoKnRjbSksIGZsYWdzKTsKIAl0Y20gPSBOTE1TR19EQVRBKG5saCk7CkBAIC0zNDAsMTIgKzM0MSwxMiBAQAogCQlpZiAodHAtPm9wcy0+ZHVtcCAmJiB0cC0+b3BzLT5kdW1wKHRwLCBmaCwgc2tiLCB0Y20pIDwgMCkKIAkJCWdvdG8gcnRhdHRyX2ZhaWx1cmU7CiAJfQotCW5saC0+bmxtc2dfbGVuID0gc2tiLT50YWlsIC0gYjsKKwlubGgtPm5sbXNnX2xlbiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKSAtIGI7CiAJcmV0dXJuIHNrYi0+bGVuOwogCiBubG1zZ19mYWlsdXJlOgogcnRhdHRyX2ZhaWx1cmU6Ci0Jc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKKwlubG1zZ190cmltKHNrYiwgYik7CiAJcmV0dXJuIC0xOwogfQogCkBAIC0zOTksNyArNDAwLDYgQEAKIAlpZiAoKGRldiA9IGRldl9nZXRfYnlfaW5kZXgodGNtLT50Y21faWZpbmRleCkpID09IE5VTEwpCiAJCXJldHVybiBza2ItPmxlbjsKIAotCXJlYWRfbG9jaygmcWRpc2NfdHJlZV9sb2NrKTsKIAlpZiAoIXRjbS0+dGNtX3BhcmVudCkKIAkJcSA9IGRldi0+cWRpc2Nfc2xlZXBpbmc7CiAJZWxzZQpAQCAtNDU2LDcgKzQ1Niw2IEBACiAJaWYgKGNsKQogCQljb3BzLT5wdXQocSwgY2wpOwogb3V0OgotCXJlYWRfdW5sb2NrKCZxZGlzY190cmVlX2xvY2spOwogCWRldl9wdXQoZGV2KTsKIAlyZXR1cm4gc2tiLT5sZW47CiB9CkBAIC01NjMsMzAgKzU2MiwzMCBAQAogCQkgKiB0byB3b3JrIHdpdGggYm90aCBvbGQgYW5kIG5ldyBtb2RlcyBvZiBlbnRlcmluZwogCQkgKiB0YyBkYXRhIGV2ZW4gaWYgaXByb3V0ZTIgIHdhcyBuZXdlciAtIGpocwogCQkgKi8KLQkJc3RydWN0IHJ0YXR0ciAqIHBfcnRhID0gKHN0cnVjdCBydGF0dHIqKSBza2ItPnRhaWw7CisJCXN0cnVjdCBydGF0dHIgKnBfcnRhID0gKHN0cnVjdCBydGF0dHIgKilza2JfdGFpbF9wb2ludGVyKHNrYik7CiAKIAkJaWYgKGV4dHMtPmFjdGlvbi0+dHlwZSAhPSBUQ0FfT0xEX0NPTVBBVCkgewogCQkJUlRBX1BVVChza2IsIG1hcC0+YWN0aW9uLCAwLCBOVUxMKTsKIAkJCWlmICh0Y2ZfYWN0aW9uX2R1bXAoc2tiLCBleHRzLT5hY3Rpb24sIDAsIDApIDwgMCkKIAkJCQlnb3RvIHJ0YXR0cl9mYWlsdXJlOwotCQkJcF9ydGEtPnJ0YV9sZW4gPSBza2ItPnRhaWwgLSAodTgqKXBfcnRhOworCQkJcF9ydGEtPnJ0YV9sZW4gPSBza2JfdGFpbF9wb2ludGVyKHNrYikgLSAodTggKilwX3J0YTsKIAkJfSBlbHNlIGlmIChtYXAtPnBvbGljZSkgewogCQkJUlRBX1BVVChza2IsIG1hcC0+cG9saWNlLCAwLCBOVUxMKTsKIAkJCWlmICh0Y2ZfYWN0aW9uX2R1bXBfb2xkKHNrYiwgZXh0cy0+YWN0aW9uLCAwLCAwKSA8IDApCiAJCQkJZ290byBydGF0dHJfZmFpbHVyZTsKLQkJCXBfcnRhLT5ydGFfbGVuID0gc2tiLT50YWlsIC0gKHU4KilwX3J0YTsKKwkJCXBfcnRhLT5ydGFfbGVuID0gc2tiX3RhaWxfcG9pbnRlcihza2IpIC0gKHU4ICopcF9ydGE7CiAJCX0KIAl9CiAjZWxpZiBkZWZpbmVkIENPTkZJR19ORVRfQ0xTX1BPTElDRQogCWlmIChtYXAtPnBvbGljZSAmJiBleHRzLT5wb2xpY2UpIHsKLQkJc3RydWN0IHJ0YXR0ciAqIHBfcnRhID0gKHN0cnVjdCBydGF0dHIqKSBza2ItPnRhaWw7CisJCXN0cnVjdCBydGF0dHIgKnBfcnRhID0gKHN0cnVjdCBydGF0dHIgKilza2JfdGFpbF9wb2ludGVyKHNrYik7CiAKIAkJUlRBX1BVVChza2IsIG1hcC0+cG9saWNlLCAwLCBOVUxMKTsKIAogCQlpZiAodGNmX3BvbGljZV9kdW1wKHNrYiwgZXh0cy0+cG9saWNlKSA8IDApCiAJCQlnb3RvIHJ0YXR0cl9mYWlsdXJlOwogCi0JCXBfcnRhLT5ydGFfbGVuID0gc2tiLT50YWlsIC0gKHU4KilwX3J0YTsKKwkJcF9ydGEtPnJ0YV9sZW4gPSBza2JfdGFpbF9wb2ludGVyKHNrYikgLSAodTggKilwX3J0YTsKIAl9CiAjZW5kaWYKIAlyZXR1cm4gMDsKQEAgLTYxNCwxOCArNjEzLDExIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IHRjX2ZpbHRlcl9pbml0KHZvaWQpCiB7Ci0Jc3RydWN0IHJ0bmV0bGlua19saW5rICpsaW5rX3AgPSBydG5ldGxpbmtfbGlua3NbUEZfVU5TUEVDXTsKKwlydG5sX3JlZ2lzdGVyKFBGX1VOU1BFQywgUlRNX05FV1RGSUxURVIsIHRjX2N0bF90ZmlsdGVyLCBOVUxMKTsKKwlydG5sX3JlZ2lzdGVyKFBGX1VOU1BFQywgUlRNX0RFTFRGSUxURVIsIHRjX2N0bF90ZmlsdGVyLCBOVUxMKTsKKwlydG5sX3JlZ2lzdGVyKFBGX1VOU1BFQywgUlRNX0dFVFRGSUxURVIsIHRjX2N0bF90ZmlsdGVyLAorCQkJCQkJIHRjX2R1bXBfdGZpbHRlcik7CiAKLQkvKiBTZXR1cCBydG5ldGxpbmsgbGlua3MuIEl0IGlzIG1hZGUgaGVyZSB0byBhdm9pZAotCSAgIGV4cG9ydGluZyBsYXJnZSBudW1iZXIgb2YgcHVibGljIHN5bWJvbHMuCi0JICovCi0KLQlpZiAobGlua19wKSB7Ci0JCWxpbmtfcFtSVE1fTkVXVEZJTFRFUi1SVE1fQkFTRV0uZG9pdCA9IHRjX2N0bF90ZmlsdGVyOwotCQlsaW5rX3BbUlRNX0RFTFRGSUxURVItUlRNX0JBU0VdLmRvaXQgPSB0Y19jdGxfdGZpbHRlcjsKLQkJbGlua19wW1JUTV9HRVRURklMVEVSLVJUTV9CQVNFXS5kb2l0ID0gdGNfY3RsX3RmaWx0ZXI7Ci0JCWxpbmtfcFtSVE1fR0VUVEZJTFRFUi1SVE1fQkFTRV0uZHVtcGl0ID0gdGNfZHVtcF90ZmlsdGVyOwotCX0KIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL2Nsc19iYXNpYy5jIGIvbmV0L3NjaGVkL2Nsc19iYXNpYy5jCmluZGV4IDRhOTFmMDguLmM4ODU0MTIgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9jbHNfYmFzaWMuYworKysgYi9uZXQvc2NoZWQvY2xzX2Jhc2ljLmMKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPG5ldC9uZXRsaW5rLmg+CiAjaW5jbHVkZSA8bmV0L2FjdF9hcGkuaD4KICNpbmNsdWRlIDxuZXQvcGt0X2Nscy5oPgogCkBAIC0yNDUsNyArMjQ2LDcgQEAKIAkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHRjbXNnICp0KQogewogCXN0cnVjdCBiYXNpY19maWx0ZXIgKmYgPSAoc3RydWN0IGJhc2ljX2ZpbHRlciAqKSBmaDsKLQl1bnNpZ25lZCBjaGFyICpiID0gc2tiLT50YWlsOworCXVuc2lnbmVkIGNoYXIgKmIgPSBza2JfdGFpbF9wb2ludGVyKHNrYik7CiAJc3RydWN0IHJ0YXR0ciAqcnRhOwogCiAJaWYgKGYgPT0gTlVMTCkKQEAgLTI2MywxMSArMjY0LDExIEBACiAJICAgIHRjZl9lbV90cmVlX2R1bXAoc2tiLCAmZi0+ZW1hdGNoZXMsIFRDQV9CQVNJQ19FTUFUQ0hFUykgPCAwKQogCQlnb3RvIHJ0YXR0cl9mYWlsdXJlOwogCi0JcnRhLT5ydGFfbGVuID0gKHNrYi0+dGFpbCAtIGIpOworCXJ0YS0+cnRhX2xlbiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKSAtIGI7CiAJcmV0dXJuIHNrYi0+bGVuOwogCiBydGF0dHJfZmFpbHVyZToKLQlza2JfdHJpbShza2IsIGIgLSBza2ItPmRhdGEpOworCW5sbXNnX3RyaW0oc2tiLCBiKTsKIAlyZXR1cm4gLTE7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9jbHNfZncuYyBiL25ldC9zY2hlZC9jbHNfZncuYwppbmRleCA1ZGJiOWQ0Li5iYmVjNGEwIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvY2xzX2Z3LmMKKysrIGIvbmV0L3NjaGVkL2Nsc19mdy5jCkBAIC0zOCw2ICszOCw3IEBACiAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KICNpbmNsdWRlIDxuZXQvaXAuaD4KKyNpbmNsdWRlIDxuZXQvbmV0bGluay5oPgogI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPG5ldC9zb2NrLmg+CkBAIC0zNDgsNyArMzQ5LDcgQEAKIHsKIAlzdHJ1Y3QgZndfaGVhZCAqaGVhZCA9IChzdHJ1Y3QgZndfaGVhZCAqKXRwLT5yb290OwogCXN0cnVjdCBmd19maWx0ZXIgKmYgPSAoc3RydWN0IGZ3X2ZpbHRlciopZmg7Ci0JdW5zaWduZWQgY2hhcgkgKmIgPSBza2ItPnRhaWw7CisJdW5zaWduZWQgY2hhciAqYiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKTsKIAlzdHJ1Y3QgcnRhdHRyICpydGE7CiAKIAlpZiAoZiA9PSBOVUxMKQpAQCAtMzc0LDcgKzM3NSw3IEBACiAJaWYgKHRjZl9leHRzX2R1bXAoc2tiLCAmZi0+ZXh0cywgJmZ3X2V4dF9tYXApIDwgMCkKIAkJZ290byBydGF0dHJfZmFpbHVyZTsKIAotCXJ0YS0+cnRhX2xlbiA9IHNrYi0+dGFpbCAtIGI7CisJcnRhLT5ydGFfbGVuID0gc2tiX3RhaWxfcG9pbnRlcihza2IpIC0gYjsKIAogCWlmICh0Y2ZfZXh0c19kdW1wX3N0YXRzKHNrYiwgJmYtPmV4dHMsICZmd19leHRfbWFwKSA8IDApCiAJCWdvdG8gcnRhdHRyX2ZhaWx1cmU7CkBAIC0zODIsNyArMzgzLDcgQEAKIAlyZXR1cm4gc2tiLT5sZW47CiAKIHJ0YXR0cl9mYWlsdXJlOgotCXNrYl90cmltKHNrYiwgYiAtIHNrYi0+ZGF0YSk7CisJbmxtc2dfdHJpbShza2IsIGIpOwogCXJldHVybiAtMTsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL2Nsc19yb3V0ZS5jIGIvbmV0L3NjaGVkL2Nsc19yb3V0ZS5jCmluZGV4IGFiYzQ3Y2MuLmNjOTQxZDAgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9jbHNfcm91dGUuYworKysgYi9uZXQvc2NoZWQvY2xzX3JvdXRlLmMKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CiAjaW5jbHVkZSA8bmV0L2lwLmg+CisjaW5jbHVkZSA8bmV0L25ldGxpbmsuaD4KICNpbmNsdWRlIDxuZXQvcm91dGUuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxuZXQvc29jay5oPgpAQCAtODgsOSArODksOSBAQAogc3RhdGljIGlubGluZQogdm9pZCByb3V0ZTRfcmVzZXRfZmFzdG1hcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgcm91dGU0X2hlYWQgKmhlYWQsIHUzMiBpZCkKIHsKLQlzcGluX2xvY2tfYmgoJmRldi0+cXVldWVfbG9jayk7CisJcWRpc2NfbG9ja190cmVlKGRldik7CiAJbWVtc2V0KGhlYWQtPmZhc3RtYXAsIDAsIHNpemVvZihoZWFkLT5mYXN0bWFwKSk7Ci0Jc3Bpbl91bmxvY2tfYmgoJmRldi0+cXVldWVfbG9jayk7CisJcWRpc2NfdW5sb2NrX3RyZWUoZGV2KTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkCkBAIC01NjIsNyArNTYzLDcgQEAKIAkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0Y21zZyAqdCkKIHsKIAlzdHJ1Y3Qgcm91dGU0X2ZpbHRlciAqZiA9IChzdHJ1Y3Qgcm91dGU0X2ZpbHRlciopZmg7Ci0JdW5zaWduZWQgY2hhcgkgKmIgPSBza2ItPnRhaWw7CisJdW5zaWduZWQgY2hhciAqYiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKTsKIAlzdHJ1Y3QgcnRhdHRyICpydGE7CiAJdTMyIGlkOwogCkBAIC01OTEsNyArNTkyLDcgQEAKIAlpZiAodGNmX2V4dHNfZHVtcChza2IsICZmLT5leHRzLCAmcm91dGVfZXh0X21hcCkgPCAwKQogCQlnb3RvIHJ0YXR0cl9mYWlsdXJlOwogCi0JcnRhLT5ydGFfbGVuID0gc2tiLT50YWlsIC0gYjsKKwlydGEtPnJ0YV9sZW4gPSBza2JfdGFpbF9wb2ludGVyKHNrYikgLSBiOwogCiAJaWYgKHRjZl9leHRzX2R1bXBfc3RhdHMoc2tiLCAmZi0+ZXh0cywgJnJvdXRlX2V4dF9tYXApIDwgMCkKIAkJZ290byBydGF0dHJfZmFpbHVyZTsKQEAgLTU5OSw3ICs2MDAsNyBAQAogCXJldHVybiBza2ItPmxlbjsKIAogcnRhdHRyX2ZhaWx1cmU6Ci0Jc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKKwlubG1zZ190cmltKHNrYiwgYik7CiAJcmV0dXJuIC0xOwogfQogCmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvY2xzX3JzdnAuYyBiL25ldC9zY2hlZC9jbHNfcnN2cC5jCmluZGV4IDFkNGExZmIuLjBhNjgzYzAgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9jbHNfcnN2cC5jCisrKyBiL25ldC9zY2hlZC9jbHNfcnN2cC5jCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSA8bmV0L3JvdXRlLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxuZXQvbmV0bGluay5oPgogI2luY2x1ZGUgPG5ldC9hY3RfYXBpLmg+CiAjaW5jbHVkZSA8bmV0L3BrdF9jbHMuaD4KIApkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL2Nsc19yc3ZwLmggYi9uZXQvc2NoZWQvY2xzX3JzdnAuaAppbmRleCA3ODUzNjIxLi4yMmY5ZWRlIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvY2xzX3JzdnAuaAorKysgYi9uZXQvc2NoZWQvY2xzX3JzdnAuaApAQCAtMTQzLDkgKzE0Myw5IEBACiAJdTggdHVubmVsaWQgPSAwOwogCXU4ICp4cHJ0OwogI2lmIFJTVlBfRFNUX0xFTiA9PSA0Ci0Jc3RydWN0IGlwdjZoZHIgKm5ocHRyID0gc2tiLT5uaC5pcHY2aDsKKwlzdHJ1Y3QgaXB2NmhkciAqbmhwdHIgPSBpcHY2X2hkcihza2IpOwogI2Vsc2UKLQlzdHJ1Y3QgaXBoZHIgKm5ocHRyID0gc2tiLT5uaC5pcGg7CisJc3RydWN0IGlwaGRyICpuaHB0ciA9IGlwX2hkcihza2IpOwogI2VuZGlmCiAKIHJlc3RhcnQ6CkBAIC0xNjAsNyArMTYwLDcgQEAKIAlkc3QgPSAmbmhwdHItPmRhZGRyOwogCXByb3RvY29sID0gbmhwdHItPnByb3RvY29sOwogCXhwcnQgPSAoKHU4KiluaHB0cikgKyAobmhwdHItPmlobDw8Mik7Ci0JaWYgKG5ocHRyLT5mcmFnX29mZiZfX2NvbnN0YW50X2h0b25zKElQX01GfElQX09GRlNFVCkpCisJaWYgKG5ocHRyLT5mcmFnX29mZiAmIGh0b25zKElQX01GfElQX09GRlNFVCkpCiAJCXJldHVybiAtMTsKICNlbmRpZgogCkBAIC01OTMsNyArNTkzLDcgQEAKIHsKIAlzdHJ1Y3QgcnN2cF9maWx0ZXIgKmYgPSAoc3RydWN0IHJzdnBfZmlsdGVyKilmaDsKIAlzdHJ1Y3QgcnN2cF9zZXNzaW9uICpzOwotCXVuc2lnbmVkIGNoYXIJICpiID0gc2tiLT50YWlsOworCXVuc2lnbmVkIGNoYXIgKmIgPSBza2JfdGFpbF9wb2ludGVyKHNrYik7CiAJc3RydWN0IHJ0YXR0ciAqcnRhOwogCXN0cnVjdCB0Y19yc3ZwX3BpbmZvIHBpbmZvOwogCkBAIC02MjMsMTQgKzYyMywxNCBAQAogCWlmICh0Y2ZfZXh0c19kdW1wKHNrYiwgJmYtPmV4dHMsICZyc3ZwX2V4dF9tYXApIDwgMCkKIAkJZ290byBydGF0dHJfZmFpbHVyZTsKIAotCXJ0YS0+cnRhX2xlbiA9IHNrYi0+dGFpbCAtIGI7CisJcnRhLT5ydGFfbGVuID0gc2tiX3RhaWxfcG9pbnRlcihza2IpIC0gYjsKIAogCWlmICh0Y2ZfZXh0c19kdW1wX3N0YXRzKHNrYiwgJmYtPmV4dHMsICZyc3ZwX2V4dF9tYXApIDwgMCkKIAkJZ290byBydGF0dHJfZmFpbHVyZTsKIAlyZXR1cm4gc2tiLT5sZW47CiAKIHJ0YXR0cl9mYWlsdXJlOgotCXNrYl90cmltKHNrYiwgYiAtIHNrYi0+ZGF0YSk7CisJbmxtc2dfdHJpbShza2IsIGIpOwogCXJldHVybiAtMTsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL2Nsc19yc3ZwNi5jIGIvbmV0L3NjaGVkL2Nsc19yc3ZwNi5jCmluZGV4IGEyOTc5ZDguLjkzYjZhYmUgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9jbHNfcnN2cDYuYworKysgYi9uZXQvc2NoZWQvY2xzX3JzdnA2LmMKQEAgLTM0LDYgKzM0LDcgQEAKICNpbmNsdWRlIDxuZXQvc29jay5oPgogI2luY2x1ZGUgPG5ldC9hY3RfYXBpLmg+CiAjaW5jbHVkZSA8bmV0L3BrdF9jbHMuaD4KKyNpbmNsdWRlIDxuZXQvbmV0bGluay5oPgogCiAjZGVmaW5lIFJTVlBfRFNUX0xFTgk0CiAjZGVmaW5lIFJTVlBfSUQJCSJyc3ZwNiIKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9jbHNfdGNpbmRleC5jIGIvbmV0L3NjaGVkL2Nsc190Y2luZGV4LmMKaW5kZXggNzU2M2ZkYy4uNDdhYzBjNSAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL2Nsc190Y2luZGV4LmMKKysrIGIvbmV0L3NjaGVkL2Nsc190Y2luZGV4LmMKQEAgLTEyLDYgKzEyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxuZXQvaXAuaD4KICNpbmNsdWRlIDxuZXQvYWN0X2FwaS5oPgorI2luY2x1ZGUgPG5ldC9uZXRsaW5rLmg+CiAjaW5jbHVkZSA8bmV0L3BrdF9jbHMuaD4KICNpbmNsdWRlIDxuZXQvcm91dGUuaD4KIApAQCAtNDQ4LDcgKzQ0OSw3IEBACiB7CiAJc3RydWN0IHRjaW5kZXhfZGF0YSAqcCA9IFBSSVYodHApOwogCXN0cnVjdCB0Y2luZGV4X2ZpbHRlcl9yZXN1bHQgKnIgPSAoc3RydWN0IHRjaW5kZXhfZmlsdGVyX3Jlc3VsdCAqKSBmaDsKLQl1bnNpZ25lZCBjaGFyICpiID0gc2tiLT50YWlsOworCXVuc2lnbmVkIGNoYXIgKmIgPSBza2JfdGFpbF9wb2ludGVyKHNrYik7CiAJc3RydWN0IHJ0YXR0ciAqcnRhOwogCiAJRFBSSU5USygidGNpbmRleF9kdW1wKHRwICVwLGZoIDB4JWx4LHNrYiAlcCx0ICVwKSxwICVwLHIgJXAsYiAlcFxuIiwKQEAgLTQ2Myw3ICs0NjQsNyBAQAogCQlSVEFfUFVUKHNrYixUQ0FfVENJTkRFWF9TSElGVCxzaXplb2YocC0+c2hpZnQpLCZwLT5zaGlmdCk7CiAJCVJUQV9QVVQoc2tiLFRDQV9UQ0lOREVYX0ZBTExfVEhST1VHSCxzaXplb2YocC0+ZmFsbF90aHJvdWdoKSwKIAkJICAgICZwLT5mYWxsX3Rocm91Z2gpOwotCQlydGEtPnJ0YV9sZW4gPSBza2ItPnRhaWwtYjsKKwkJcnRhLT5ydGFfbGVuID0gc2tiX3RhaWxfcG9pbnRlcihza2IpIC0gYjsKIAl9IGVsc2UgewogCQlpZiAocC0+cGVyZmVjdCkgewogCQkJdC0+dGNtX2hhbmRsZSA9IHItcC0+cGVyZmVjdDsKQEAgLTQ4Niw3ICs0ODcsNyBAQAogCiAJCWlmICh0Y2ZfZXh0c19kdW1wKHNrYiwgJnItPmV4dHMsICZ0Y2luZGV4X2V4dF9tYXApIDwgMCkKIAkJCWdvdG8gcnRhdHRyX2ZhaWx1cmU7Ci0JCXJ0YS0+cnRhX2xlbiA9IHNrYi0+dGFpbC1iOworCQlydGEtPnJ0YV9sZW4gPSBza2JfdGFpbF9wb2ludGVyKHNrYikgLSBiOwogCiAJCWlmICh0Y2ZfZXh0c19kdW1wX3N0YXRzKHNrYiwgJnItPmV4dHMsICZ0Y2luZGV4X2V4dF9tYXApIDwgMCkKIAkJCWdvdG8gcnRhdHRyX2ZhaWx1cmU7CkBAIC00OTUsNyArNDk2LDcgQEAKIAlyZXR1cm4gc2tiLT5sZW47CiAKIHJ0YXR0cl9mYWlsdXJlOgotCXNrYl90cmltKHNrYiwgYiAtIHNrYi0+ZGF0YSk7CisJbmxtc2dfdHJpbShza2IsIGIpOwogCXJldHVybiAtMTsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL2Nsc191MzIuYyBiL25ldC9zY2hlZC9jbHNfdTMyLmMKaW5kZXggMGJjYjE2OS4uYzdhMzQ3YiAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL2Nsc191MzIuYworKysgYi9uZXQvc2NoZWQvY2xzX3UzMi5jCkBAIC01MCw2ICs1MCw3IEBACiAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KICNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KICNpbmNsdWRlIDxuZXQvaXAuaD4KKyNpbmNsdWRlIDxuZXQvbmV0bGluay5oPgogI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPG5ldC9zb2NrLmg+CkBAIC0xMTksNyArMTIwLDcgQEAKIAl9IHN0YWNrW1RDX1UzMl9NQVhERVBUSF07CiAKIAlzdHJ1Y3QgdGNfdV9obm9kZSAqaHQgPSAoc3RydWN0IHRjX3VfaG5vZGUqKXRwLT5yb290OwotCXU4ICpwdHIgPSBza2ItPm5oLnJhdzsKKwl1OCAqcHRyID0gc2tiX25ldHdvcmtfaGVhZGVyKHNrYik7CiAJc3RydWN0IHRjX3Vfa25vZGUgKm47CiAJaW50IHNkZXB0aCA9IDA7CiAJaW50IG9mZjIgPSAwOwpAQCAtMjEzLDcgKzIxNCw3IEBACiAJCQlvZmYyID0gMDsKIAkJfQogCi0JCWlmIChwdHIgPCBza2ItPnRhaWwpCisJCWlmIChwdHIgPCBza2JfdGFpbF9wb2ludGVyKHNrYikpCiAJCQlnb3RvIG5leHRfaHQ7CiAJfQogCkBAIC00MzUsNyArNDM2LDcgQEAKIAkJCUJVR19UUkFQKGh0LT5yZWZjbnQgPT0gMCk7CiAKIAkJCWtmcmVlKGh0KTsKLQkJfTsKKwkJfQogCiAJCWtmcmVlKHRwX2MpOwogCX0KQEAgLTcxOCw3ICs3MTksNyBAQAogCQkgICAgIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0Y21zZyAqdCkKIHsKIAlzdHJ1Y3QgdGNfdV9rbm9kZSAqbiA9IChzdHJ1Y3QgdGNfdV9rbm9kZSopZmg7Ci0JdW5zaWduZWQgY2hhcgkgKmIgPSBza2ItPnRhaWw7CisJdW5zaWduZWQgY2hhciAqYiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKTsKIAlzdHJ1Y3QgcnRhdHRyICpydGE7CiAKIAlpZiAobiA9PSBOVUxMKQpAQCAtNzY1LDE0ICs3NjYsMTQgQEAKICNlbmRpZgogCX0KIAotCXJ0YS0+cnRhX2xlbiA9IHNrYi0+dGFpbCAtIGI7CisJcnRhLT5ydGFfbGVuID0gc2tiX3RhaWxfcG9pbnRlcihza2IpIC0gYjsKIAlpZiAoVENfVTMyX0tFWShuLT5oYW5kbGUpKQogCQlpZiAodGNmX2V4dHNfZHVtcF9zdGF0cyhza2IsICZuLT5leHRzLCAmdTMyX2V4dF9tYXApIDwgMCkKIAkJCWdvdG8gcnRhdHRyX2ZhaWx1cmU7CiAJcmV0dXJuIHNrYi0+bGVuOwogCiBydGF0dHJfZmFpbHVyZToKLQlza2JfdHJpbShza2IsIGIgLSBza2ItPmRhdGEpOworCW5sbXNnX3RyaW0oc2tiLCBiKTsKIAlyZXR1cm4gLTE7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9lbV91MzIuYyBiL25ldC9zY2hlZC9lbV91MzIuYwppbmRleCBjZDA2MDBjLi4wYTJhN2ZlIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvZW1fdTMyLmMKKysrIGIvbmV0L3NjaGVkL2VtX3UzMi5jCkBAIC0yMiw3ICsyMiw3IEBACiAJCQlzdHJ1Y3QgdGNmX3BrdF9pbmZvICppbmZvKQogewogCXN0cnVjdCB0Y191MzJfa2V5ICprZXkgPSAoc3RydWN0IHRjX3UzMl9rZXkgKikgZW0tPmRhdGE7Ci0JdW5zaWduZWQgY2hhciAqcHRyID0gc2tiLT5uaC5yYXc7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcHRyID0gc2tiX25ldHdvcmtfaGVhZGVyKHNrYik7CiAKIAlpZiAoaW5mbykgewogCQlpZiAoaW5mby0+cHRyKQpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL2VtYXRjaC5jIGIvbmV0L3NjaGVkL2VtYXRjaC5jCmluZGV4IDk1OWMzMDYuLjYzMTQ2ZDMgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9lbWF0Y2guYworKysgYi9uZXQvc2NoZWQvZW1hdGNoLmMKQEAgLTQxOCwxNyArNDE4LDE5IEBACiBpbnQgdGNmX2VtX3RyZWVfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdGNmX2VtYXRjaF90cmVlICp0cmVlLCBpbnQgdGx2KQogewogCWludCBpOwotCXN0cnVjdCBydGF0dHIgKiB0b3Bfc3RhcnQgPSAoc3RydWN0IHJ0YXR0ciopIHNrYi0+dGFpbDsKLQlzdHJ1Y3QgcnRhdHRyICogbGlzdF9zdGFydDsKKwl1OCAqdGFpbDsKKwlzdHJ1Y3QgcnRhdHRyICp0b3Bfc3RhcnQgPSAoc3RydWN0IHJ0YXR0ciAqKXNrYl90YWlsX3BvaW50ZXIoc2tiKTsKKwlzdHJ1Y3QgcnRhdHRyICpsaXN0X3N0YXJ0OwogCiAJUlRBX1BVVChza2IsIHRsdiwgMCwgTlVMTCk7CiAJUlRBX1BVVChza2IsIFRDQV9FTUFUQ0hfVFJFRV9IRFIsIHNpemVvZih0cmVlLT5oZHIpLCAmdHJlZS0+aGRyKTsKIAotCWxpc3Rfc3RhcnQgPSAoc3RydWN0IHJ0YXR0ciAqKSBza2ItPnRhaWw7CisJbGlzdF9zdGFydCA9IChzdHJ1Y3QgcnRhdHRyICopc2tiX3RhaWxfcG9pbnRlcihza2IpOwogCVJUQV9QVVQoc2tiLCBUQ0FfRU1BVENIX1RSRUVfTElTVCwgMCwgTlVMTCk7CiAKKwl0YWlsID0gc2tiX3RhaWxfcG9pbnRlcihza2IpOwogCWZvciAoaSA9IDA7IGkgPCB0cmVlLT5oZHIubm1hdGNoZXM7IGkrKykgewotCQlzdHJ1Y3QgcnRhdHRyICptYXRjaF9zdGFydCA9IChzdHJ1Y3QgcnRhdHRyKikgc2tiLT50YWlsOworCQlzdHJ1Y3QgcnRhdHRyICptYXRjaF9zdGFydCA9IChzdHJ1Y3QgcnRhdHRyICopdGFpbDsKIAkJc3RydWN0IHRjZl9lbWF0Y2ggKmVtID0gdGNmX2VtX2dldF9tYXRjaCh0cmVlLCBpKTsKIAkJc3RydWN0IHRjZl9lbWF0Y2hfaGRyIGVtX2hkciA9IHsKIAkJCS5raW5kID0gZW0tPm9wcyA/IGVtLT5vcHMtPmtpbmQgOiBUQ0ZfRU1fQ09OVEFJTkVSLApAQCAtNDQ3LDExICs0NDksMTIgQEAKIAkJfSBlbHNlIGlmIChlbS0+ZGF0YWxlbiA+IDApCiAJCQlSVEFfUFVUX05PSERSKHNrYiwgZW0tPmRhdGFsZW4sICh2b2lkICopIGVtLT5kYXRhKTsKIAotCQltYXRjaF9zdGFydC0+cnRhX2xlbiA9IHNrYi0+dGFpbCAtICh1OCopIG1hdGNoX3N0YXJ0OworCQl0YWlsID0gc2tiX3RhaWxfcG9pbnRlcihza2IpOworCQltYXRjaF9zdGFydC0+cnRhX2xlbiA9IHRhaWwgLSAodTggKiltYXRjaF9zdGFydDsKIAl9CiAKLQlsaXN0X3N0YXJ0LT5ydGFfbGVuID0gc2tiLT50YWlsIC0gKHU4ICopIGxpc3Rfc3RhcnQ7Ci0JdG9wX3N0YXJ0LT5ydGFfbGVuID0gc2tiLT50YWlsIC0gKHU4ICopIHRvcF9zdGFydDsKKwlsaXN0X3N0YXJ0LT5ydGFfbGVuID0gdGFpbCAtICh1OCAqKWxpc3Rfc3RhcnQ7CisJdG9wX3N0YXJ0LT5ydGFfbGVuID0gdGFpbCAtICh1OCAqKXRvcF9zdGFydDsKIAogCXJldHVybiAwOwogCmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvc2NoX2FwaS5jIGIvbmV0L3NjaGVkL3NjaF9hcGkuYwppbmRleCBlY2M5ODhhLi44Njk5ZTcwIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvc2NoX2FwaS5jCisrKyBiL25ldC9zY2hlZC9zY2hfYXBpLmMKQEAgLTI3LDE0ICsyNywxNSBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2hydGltZXIuaD4KIAorI2luY2x1ZGUgPG5ldC9uZXRsaW5rLmg+CiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KICNpbmNsdWRlIDxuZXQvcGt0X3NjaGVkLmg+CiAKQEAgLTE5MCw3ICsxOTEsNyBAQAogICAgKHJvb3QgcWRpc2MsIGFsbCBpdHMgY2hpbGRyZW4sIGNoaWxkcmVuIG9mIGNoaWxkcmVuIGV0Yy4pCiAgKi8KIAotc3RhdGljIHN0cnVjdCBRZGlzYyAqX19xZGlzY19sb29rdXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGhhbmRsZSkKK3N0cnVjdCBRZGlzYyAqcWRpc2NfbG9va3VwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBoYW5kbGUpCiB7CiAJc3RydWN0IFFkaXNjICpxOwogCkBAIC0yMDEsMTYgKzIwMiw2IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0cnVjdCBRZGlzYyAqcWRpc2NfbG9va3VwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBoYW5kbGUpCi17Ci0Jc3RydWN0IFFkaXNjICpxOwotCi0JcmVhZF9sb2NrKCZxZGlzY190cmVlX2xvY2spOwotCXEgPSBfX3FkaXNjX2xvb2t1cChkZXYsIGhhbmRsZSk7Ci0JcmVhZF91bmxvY2soJnFkaXNjX3RyZWVfbG9jayk7Ci0JcmV0dXJuIHE7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgUWRpc2MgKnFkaXNjX2xlYWYoc3RydWN0IFFkaXNjICpwLCB1MzIgY2xhc3NpZCkKIHsKIAl1bnNpZ25lZCBsb25nIGNsOwpAQCAtMjkxLDYgKzI4Miw0OCBAQAogCX0KIH0KIAorc3RhdGljIGVudW0gaHJ0aW1lcl9yZXN0YXJ0IHFkaXNjX3dhdGNoZG9nKHN0cnVjdCBocnRpbWVyICp0aW1lcikKK3sKKwlzdHJ1Y3QgcWRpc2Nfd2F0Y2hkb2cgKndkID0gY29udGFpbmVyX29mKHRpbWVyLCBzdHJ1Y3QgcWRpc2Nfd2F0Y2hkb2csCisJCQkJCQkgdGltZXIpOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSB3ZC0+cWRpc2MtPmRldjsKKworCXdkLT5xZGlzYy0+ZmxhZ3MgJj0gflRDUV9GX1RIUk9UVExFRDsKKwlzbXBfd21iKCk7CisJaWYgKHNwaW5fdHJ5bG9jaygmZGV2LT5xdWV1ZV9sb2NrKSkgeworCQlxZGlzY19ydW4oZGV2KTsKKwkJc3Bpbl91bmxvY2soJmRldi0+cXVldWVfbG9jayk7CisJfSBlbHNlCisJCW5ldGlmX3NjaGVkdWxlKGRldik7CisKKwlyZXR1cm4gSFJUSU1FUl9OT1JFU1RBUlQ7Cit9CisKK3ZvaWQgcWRpc2Nfd2F0Y2hkb2dfaW5pdChzdHJ1Y3QgcWRpc2Nfd2F0Y2hkb2cgKndkLCBzdHJ1Y3QgUWRpc2MgKnFkaXNjKQoreworCWhydGltZXJfaW5pdCgmd2QtPnRpbWVyLCBDTE9DS19NT05PVE9OSUMsIEhSVElNRVJfTU9ERV9BQlMpOworCXdkLT50aW1lci5mdW5jdGlvbiA9IHFkaXNjX3dhdGNoZG9nOworCXdkLT5xZGlzYyA9IHFkaXNjOworfQorRVhQT1JUX1NZTUJPTChxZGlzY193YXRjaGRvZ19pbml0KTsKKwordm9pZCBxZGlzY193YXRjaGRvZ19zY2hlZHVsZShzdHJ1Y3QgcWRpc2Nfd2F0Y2hkb2cgKndkLCBwc2NoZWRfdGltZV90IGV4cGlyZXMpCit7CisJa3RpbWVfdCB0aW1lOworCisJd2QtPnFkaXNjLT5mbGFncyB8PSBUQ1FfRl9USFJPVFRMRUQ7CisJdGltZSA9IGt0aW1lX3NldCgwLCAwKTsKKwl0aW1lID0ga3RpbWVfYWRkX25zKHRpbWUsIFBTQ0hFRF9VUzJOUyhleHBpcmVzKSk7CisJaHJ0aW1lcl9zdGFydCgmd2QtPnRpbWVyLCB0aW1lLCBIUlRJTUVSX01PREVfQUJTKTsKK30KK0VYUE9SVF9TWU1CT0wocWRpc2Nfd2F0Y2hkb2dfc2NoZWR1bGUpOworCit2b2lkIHFkaXNjX3dhdGNoZG9nX2NhbmNlbChzdHJ1Y3QgcWRpc2Nfd2F0Y2hkb2cgKndkKQoreworCWhydGltZXJfY2FuY2VsKCZ3ZC0+dGltZXIpOworCXdkLT5xZGlzYy0+ZmxhZ3MgJj0gflRDUV9GX1RIUk9UVExFRDsKK30KK0VYUE9SVF9TWU1CT0wocWRpc2Nfd2F0Y2hkb2dfY2FuY2VsKTsKIAogLyogQWxsb2NhdGUgYW4gdW5pcXVlIGhhbmRsZSBmcm9tIHNwYWNlIG1hbmFnZWQgYnkga2VybmVsICovCiAKQEAgLTM2Miw3ICszOTUsNyBAQAogCWlmIChuID09IDApCiAJCXJldHVybjsKIAl3aGlsZSAoKHBhcmVudGlkID0gc2NoLT5wYXJlbnQpKSB7Ci0JCXNjaCA9IF9fcWRpc2NfbG9va3VwKHNjaC0+ZGV2LCBUQ19IX01BSihwYXJlbnRpZCkpOworCQlzY2ggPSBxZGlzY19sb29rdXAoc2NoLT5kZXYsIFRDX0hfTUFKKHBhcmVudGlkKSk7CiAJCWNvcHMgPSBzY2gtPm9wcy0+Y2xfb3BzOwogCQlpZiAoY29wcy0+cWxlbl9ub3RpZnkpIHsKIAkJCWNsID0gY29wcy0+Z2V0KHNjaCwgcGFyZW50aWQpOwpAQCAtNDY3LDEyICs1MDAsMTYgQEAKIAogCWlmIChoYW5kbGUgPT0gVENfSF9JTkdSRVNTKSB7CiAJCXNjaC0+ZmxhZ3MgfD0gVENRX0ZfSU5HUkVTUzsKKwkJc2NoLT5zdGF0c19sb2NrID0gJmRldi0+aW5ncmVzc19sb2NrOwogCQloYW5kbGUgPSBUQ19IX01BS0UoVENfSF9JTkdSRVNTLCAwKTsKLQl9IGVsc2UgaWYgKGhhbmRsZSA9PSAwKSB7Ci0JCWhhbmRsZSA9IHFkaXNjX2FsbG9jX2hhbmRsZShkZXYpOwotCQllcnIgPSAtRU5PTUVNOwotCQlpZiAoaGFuZGxlID09IDApCi0JCQlnb3RvIGVycl9vdXQzOworCX0gZWxzZSB7CisJCXNjaC0+c3RhdHNfbG9jayA9ICZkZXYtPnF1ZXVlX2xvY2s7CisJCWlmIChoYW5kbGUgPT0gMCkgeworCQkJaGFuZGxlID0gcWRpc2NfYWxsb2NfaGFuZGxlKGRldik7CisJCQllcnIgPSAtRU5PTUVNOworCQkJaWYgKGhhbmRsZSA9PSAwKQorCQkJCWdvdG8gZXJyX291dDM7CisJCX0KIAl9CiAKIAlzY2gtPmhhbmRsZSA9IGhhbmRsZTsKQEAgLTYyMSw5ICs2NTgsOSBAQAogCQkJcmV0dXJuIGVycjsKIAkJaWYgKHEpIHsKIAkJCXFkaXNjX25vdGlmeShza2IsIG4sIGNsaWQsIHEsIE5VTEwpOwotCQkJc3Bpbl9sb2NrX2JoKCZkZXYtPnF1ZXVlX2xvY2spOworCQkJcWRpc2NfbG9ja190cmVlKGRldik7CiAJCQlxZGlzY19kZXN0cm95KHEpOwotCQkJc3Bpbl91bmxvY2tfYmgoJmRldi0+cXVldWVfbG9jayk7CisJCQlxZGlzY191bmxvY2tfdHJlZShkZXYpOwogCQl9CiAJfSBlbHNlIHsKIAkJcWRpc2Nfbm90aWZ5KHNrYiwgbiwgY2xpZCwgTlVMTCwgcSk7CkBAIC03NTYsMTcgKzc5MywxNyBAQAogCQllcnIgPSBxZGlzY19ncmFmdChkZXYsIHAsIGNsaWQsIHEsICZvbGRfcSk7CiAJCWlmIChlcnIpIHsKIAkJCWlmIChxKSB7Ci0JCQkJc3Bpbl9sb2NrX2JoKCZkZXYtPnF1ZXVlX2xvY2spOworCQkJCXFkaXNjX2xvY2tfdHJlZShkZXYpOwogCQkJCXFkaXNjX2Rlc3Ryb3kocSk7Ci0JCQkJc3Bpbl91bmxvY2tfYmgoJmRldi0+cXVldWVfbG9jayk7CisJCQkJcWRpc2NfdW5sb2NrX3RyZWUoZGV2KTsKIAkJCX0KIAkJCXJldHVybiBlcnI7CiAJCX0KIAkJcWRpc2Nfbm90aWZ5KHNrYiwgbiwgY2xpZCwgb2xkX3EsIHEpOwogCQlpZiAob2xkX3EpIHsKLQkJCXNwaW5fbG9ja19iaCgmZGV2LT5xdWV1ZV9sb2NrKTsKKwkJCXFkaXNjX2xvY2tfdHJlZShkZXYpOwogCQkJcWRpc2NfZGVzdHJveShvbGRfcSk7Ci0JCQlzcGluX3VubG9ja19iaCgmZGV2LT5xdWV1ZV9sb2NrKTsKKwkJCXFkaXNjX3VubG9ja190cmVlKGRldik7CiAJCX0KIAl9CiAJcmV0dXJuIDA7CkBAIC03NzcsNyArODE0LDcgQEAKIHsKIAlzdHJ1Y3QgdGNtc2cgKnRjbTsKIAlzdHJ1Y3Qgbmxtc2doZHIgICpubGg7Ci0JdW5zaWduZWQgY2hhcgkgKmIgPSBza2ItPnRhaWw7CisJdW5zaWduZWQgY2hhciAqYiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKTsKIAlzdHJ1Y3QgZ25ldF9kdW1wIGQ7CiAKIAlubGggPSBOTE1TR19ORVcoc2tiLCBwaWQsIHNlcSwgZXZlbnQsIHNpemVvZigqdGNtKSwgZmxhZ3MpOwpAQCAtODExLDEyICs4NDgsMTIgQEAKIAlpZiAoZ25ldF9zdGF0c19maW5pc2hfY29weSgmZCkgPCAwKQogCQlnb3RvIHJ0YXR0cl9mYWlsdXJlOwogCi0JbmxoLT5ubG1zZ19sZW4gPSBza2ItPnRhaWwgLSBiOworCW5saC0+bmxtc2dfbGVuID0gc2tiX3RhaWxfcG9pbnRlcihza2IpIC0gYjsKIAlyZXR1cm4gc2tiLT5sZW47CiAKIG5sbXNnX2ZhaWx1cmU6CiBydGF0dHJfZmFpbHVyZToKLQlza2JfdHJpbShza2IsIGIgLSBza2ItPmRhdGEpOworCW5sbXNnX3RyaW0oc2tiLCBiKTsKIAlyZXR1cm4gLTE7CiB9CiAKQEAgLTg2Miw3ICs4OTksNiBAQAogCQkJY29udGludWU7CiAJCWlmIChpZHggPiBzX2lkeCkKIAkJCXNfcV9pZHggPSAwOwotCQlyZWFkX2xvY2soJnFkaXNjX3RyZWVfbG9jayk7CiAJCXFfaWR4ID0gMDsKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeShxLCAmZGV2LT5xZGlzY19saXN0LCBsaXN0KSB7CiAJCQlpZiAocV9pZHggPCBzX3FfaWR4KSB7CkBAIC04NzAsMTMgKzkwNiwxMCBAQAogCQkJCWNvbnRpbnVlOwogCQkJfQogCQkJaWYgKHRjX2ZpbGxfcWRpc2Moc2tiLCBxLCBxLT5wYXJlbnQsIE5FVExJTktfQ0IoY2ItPnNrYikucGlkLAotCQkJCQkgIGNiLT5ubGgtPm5sbXNnX3NlcSwgTkxNX0ZfTVVMVEksIFJUTV9ORVdRRElTQykgPD0gMCkgewotCQkJCXJlYWRfdW5sb2NrKCZxZGlzY190cmVlX2xvY2spOworCQkJCQkgIGNiLT5ubGgtPm5sbXNnX3NlcSwgTkxNX0ZfTVVMVEksIFJUTV9ORVdRRElTQykgPD0gMCkKIAkJCQlnb3RvIGRvbmU7Ci0JCQl9CiAJCQlxX2lkeCsrOwogCQl9Ci0JCXJlYWRfdW5sb2NrKCZxZGlzY190cmVlX2xvY2spOwogCX0KIAogZG9uZToKQEAgLTEwMTUsNyArMTA0OCw3IEBACiB7CiAJc3RydWN0IHRjbXNnICp0Y207CiAJc3RydWN0IG5sbXNnaGRyICAqbmxoOwotCXVuc2lnbmVkIGNoYXIJICpiID0gc2tiLT50YWlsOworCXVuc2lnbmVkIGNoYXIgKmIgPSBza2JfdGFpbF9wb2ludGVyKHNrYik7CiAJc3RydWN0IGduZXRfZHVtcCBkOwogCXN0cnVjdCBRZGlzY19jbGFzc19vcHMgKmNsX29wcyA9IHEtPm9wcy0+Y2xfb3BzOwogCkBAIC0xMDQwLDEyICsxMDczLDEyIEBACiAJaWYgKGduZXRfc3RhdHNfZmluaXNoX2NvcHkoJmQpIDwgMCkKIAkJZ290byBydGF0dHJfZmFpbHVyZTsKIAotCW5saC0+bmxtc2dfbGVuID0gc2tiLT50YWlsIC0gYjsKKwlubGgtPm5sbXNnX2xlbiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKSAtIGI7CiAJcmV0dXJuIHNrYi0+bGVuOwogCiBubG1zZ19mYWlsdXJlOgogcnRhdHRyX2ZhaWx1cmU6Ci0Jc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKKwlubG1zZ190cmltKHNrYiwgYik7CiAJcmV0dXJuIC0xOwogfQogCkBAIC0xMDk5LDcgKzExMzIsNiBAQAogCXNfdCA9IGNiLT5hcmdzWzBdOwogCXQgPSAwOwogCi0JcmVhZF9sb2NrKCZxZGlzY190cmVlX2xvY2spOwogCWxpc3RfZm9yX2VhY2hfZW50cnkocSwgJmRldi0+cWRpc2NfbGlzdCwgbGlzdCkgewogCQlpZiAodCA8IHNfdCB8fCAhcS0+b3BzLT5jbF9vcHMgfHwKIAkJICAgICh0Y20tPnRjbV9wYXJlbnQgJiYKQEAgLTExMjEsNyArMTE1Myw2IEBACiAJCQlicmVhazsKIAkJdCsrOwogCX0KLQlyZWFkX3VubG9jaygmcWRpc2NfdHJlZV9sb2NrKTsKIAogCWNiLT5hcmdzWzBdID0gdDsKIApAQCAtMTE0Niw3ICsxMTc3LDcgQEAKIAogCWZvciAoIDsgdHA7IHRwID0gdHAtPm5leHQpIHsKIAkJaWYgKCh0cC0+cHJvdG9jb2wgPT0gcHJvdG9jb2wgfHwKLQkJCXRwLT5wcm90b2NvbCA9PSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0FMTCkpICYmCisJCQl0cC0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfQUxMKSkgJiYKIAkJCShlcnIgPSB0cC0+Y2xhc3NpZnkoc2tiLCB0cCwgcmVzKSkgPj0gMCkgewogI2lmZGVmIENPTkZJR19ORVRfQ0xTX0FDVAogCQkJaWYgKCBUQ19BQ1RfUkVDTEFTU0lGWSA9PSBlcnIpIHsKQEAgLTExNzUsMTUgKzEyMDYsMzEgQEAKIAlyZXR1cm4gLTE7CiB9CiAKLXN0YXRpYyBpbnQgcHNjaGVkX3VzX3Blcl90aWNrID0gMTsKLXN0YXRpYyBpbnQgcHNjaGVkX3RpY2tfcGVyX3VzID0gMTsKK3ZvaWQgdGNmX2Rlc3Ryb3koc3RydWN0IHRjZl9wcm90byAqdHApCit7CisJdHAtPm9wcy0+ZGVzdHJveSh0cCk7CisJbW9kdWxlX3B1dCh0cC0+b3BzLT5vd25lcik7CisJa2ZyZWUodHApOworfQorCit2b2lkIHRjZl9kZXN0cm95X2NoYWluKHN0cnVjdCB0Y2ZfcHJvdG8gKmZsKQoreworCXN0cnVjdCB0Y2ZfcHJvdG8gKnRwOworCisJd2hpbGUgKCh0cCA9IGZsKSAhPSBOVUxMKSB7CisJCWZsID0gdHAtPm5leHQ7CisJCXRjZl9kZXN0cm95KHRwKTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKHRjZl9kZXN0cm95X2NoYWluKTsKIAogI2lmZGVmIENPTkZJR19QUk9DX0ZTCiBzdGF0aWMgaW50IHBzY2hlZF9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQogewogCXNlcV9wcmludGYoc2VxLCAiJTA4eCAlMDh4ICUwOHggJTA4eFxuIiwKLQkJICAgICAgcHNjaGVkX3RpY2tfcGVyX3VzLCBwc2NoZWRfdXNfcGVyX3RpY2ssCi0JCSAgICAgIDEwMDAwMDAsIEhaKTsKKwkJICAgKHUzMilOU0VDX1BFUl9VU0VDLCAodTMyKVBTQ0hFRF9VUzJOUygxKSwKKwkJICAgMTAwMDAwMCwKKwkJICAgKHUzMilOU0VDX1BFUl9TRUMvKHUzMilrdGltZV90b19ucyhLVElNRV9NT05PVE9OSUNfUkVTKSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTEyMDIsMTAxICsxMjQ5LDE5IEBACiB9OwogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfTkVUX1NDSF9DTEtfQ1BVCi1wc2NoZWRfdGRpZmZfdCBwc2NoZWRfY2xvY2tfcGVyX2h6OwotaW50IHBzY2hlZF9jbG9ja19zY2FsZTsKLUVYUE9SVF9TWU1CT0wocHNjaGVkX2Nsb2NrX3Blcl9oeik7Ci1FWFBPUlRfU1lNQk9MKHBzY2hlZF9jbG9ja19zY2FsZSk7Ci0KLXBzY2hlZF90aW1lX3QgcHNjaGVkX3RpbWVfYmFzZTsKLWN5Y2xlc190IHBzY2hlZF90aW1lX21hcms7Ci1FWFBPUlRfU1lNQk9MKHBzY2hlZF90aW1lX21hcmspOwotRVhQT1JUX1NZTUJPTChwc2NoZWRfdGltZV9iYXNlKTsKLQotLyoKLSAqIFBlcmlvZGljYWxseSBhZGp1c3QgcHNjaGVkX3RpbWVfYmFzZSB0byBhdm9pZCBvdmVyZmxvdwotICogd2l0aCAzMi1iaXQgZ2V0X2N5Y2xlcygpLiBTYWZlIHVwIHRvIDRHSHogQ1BVLgotICovCi1zdGF0aWMgdm9pZCBwc2NoZWRfdGljayh1bnNpZ25lZCBsb25nKTsKLXN0YXRpYyBERUZJTkVfVElNRVIocHNjaGVkX3RpbWVyLCBwc2NoZWRfdGljaywgMCwgMCk7Ci0KLXN0YXRpYyB2b2lkIHBzY2hlZF90aWNrKHVuc2lnbmVkIGxvbmcgZHVtbXkpCi17Ci0JaWYgKHNpemVvZihjeWNsZXNfdCkgPT0gc2l6ZW9mKHUzMikpIHsKLQkJcHNjaGVkX3RpbWVfdCBkdW1teV9zdGFtcDsKLQkJUFNDSEVEX0dFVF9USU1FKGR1bW15X3N0YW1wKTsKLQkJcHNjaGVkX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgMSpIWjsKLQkJYWRkX3RpbWVyKCZwc2NoZWRfdGltZXIpOwotCX0KLX0KLQotaW50IF9faW5pdCBwc2NoZWRfY2FsaWJyYXRlX2Nsb2NrKHZvaWQpCi17Ci0JcHNjaGVkX3RpbWVfdCBzdGFtcCwgc3RhbXAxOwotCXN0cnVjdCB0aW1ldmFsIHR2LCB0djE7Ci0JcHNjaGVkX3RkaWZmX3QgZGVsYXk7Ci0JbG9uZyByZGVsYXk7Ci0JdW5zaWduZWQgbG9uZyBzdG9wOwotCi0JcHNjaGVkX3RpY2soMCk7Ci0Jc3RvcCA9IGppZmZpZXMgKyBIWi8xMDsKLQlQU0NIRURfR0VUX1RJTUUoc3RhbXApOwotCWRvX2dldHRpbWVvZmRheSgmdHYpOwotCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCBzdG9wKSkgewotCQliYXJyaWVyKCk7Ci0JCWNwdV9yZWxheCgpOwotCX0KLQlQU0NIRURfR0VUX1RJTUUoc3RhbXAxKTsKLQlkb19nZXR0aW1lb2ZkYXkoJnR2MSk7Ci0KLQlkZWxheSA9IFBTQ0hFRF9URElGRihzdGFtcDEsIHN0YW1wKTsKLQlyZGVsYXkgPSB0djEudHZfdXNlYyAtIHR2LnR2X3VzZWM7Ci0JcmRlbGF5ICs9ICh0djEudHZfc2VjIC0gdHYudHZfc2VjKSoxMDAwMDAwOwotCWlmIChyZGVsYXkgPiBkZWxheSkKLQkJcmV0dXJuIC0xOwotCWRlbGF5IC89IHJkZWxheTsKLQlwc2NoZWRfdGlja19wZXJfdXMgPSBkZWxheTsKLQl3aGlsZSAoKGRlbGF5Pj49MSkgIT0gMCkKLQkJcHNjaGVkX2Nsb2NrX3NjYWxlKys7Ci0JcHNjaGVkX3VzX3Blcl90aWNrID0gMTw8cHNjaGVkX2Nsb2NrX3NjYWxlOwotCXBzY2hlZF9jbG9ja19wZXJfaHogPSAocHNjaGVkX3RpY2tfcGVyX3VzKigxMDAwMDAwL0haKSk+PnBzY2hlZF9jbG9ja19zY2FsZTsKLQlyZXR1cm4gMDsKLX0KLSNlbmRpZgotCiBzdGF0aWMgaW50IF9faW5pdCBwa3RzY2hlZF9pbml0KHZvaWQpCiB7Ci0Jc3RydWN0IHJ0bmV0bGlua19saW5rICpsaW5rX3A7Ci0KLSNpZmRlZiBDT05GSUdfTkVUX1NDSF9DTEtfQ1BVCi0JaWYgKHBzY2hlZF9jYWxpYnJhdGVfY2xvY2soKSA8IDApCi0JCXJldHVybiAtMTsKLSNlbGlmIGRlZmluZWQoQ09ORklHX05FVF9TQ0hfQ0xLX0pJRkZJRVMpCi0JcHNjaGVkX3RpY2tfcGVyX3VzID0gSFo8PFBTQ0hFRF9KU0NBTEU7Ci0JcHNjaGVkX3VzX3Blcl90aWNrID0gMTAwMDAwMDsKLSNlbmRpZgotCi0JbGlua19wID0gcnRuZXRsaW5rX2xpbmtzW1BGX1VOU1BFQ107Ci0KLQkvKiBTZXR1cCBydG5ldGxpbmsgbGlua3MuIEl0IGlzIG1hZGUgaGVyZSB0byBhdm9pZAotCSAgIGV4cG9ydGluZyBsYXJnZSBudW1iZXIgb2YgcHVibGljIHN5bWJvbHMuCi0JICovCi0KLQlpZiAobGlua19wKSB7Ci0JCWxpbmtfcFtSVE1fTkVXUURJU0MtUlRNX0JBU0VdLmRvaXQgPSB0Y19tb2RpZnlfcWRpc2M7Ci0JCWxpbmtfcFtSVE1fREVMUURJU0MtUlRNX0JBU0VdLmRvaXQgPSB0Y19nZXRfcWRpc2M7Ci0JCWxpbmtfcFtSVE1fR0VUUURJU0MtUlRNX0JBU0VdLmRvaXQgPSB0Y19nZXRfcWRpc2M7Ci0JCWxpbmtfcFtSVE1fR0VUUURJU0MtUlRNX0JBU0VdLmR1bXBpdCA9IHRjX2R1bXBfcWRpc2M7Ci0JCWxpbmtfcFtSVE1fTkVXVENMQVNTLVJUTV9CQVNFXS5kb2l0ID0gdGNfY3RsX3RjbGFzczsKLQkJbGlua19wW1JUTV9ERUxUQ0xBU1MtUlRNX0JBU0VdLmRvaXQgPSB0Y19jdGxfdGNsYXNzOwotCQlsaW5rX3BbUlRNX0dFVFRDTEFTUy1SVE1fQkFTRV0uZG9pdCA9IHRjX2N0bF90Y2xhc3M7Ci0JCWxpbmtfcFtSVE1fR0VUVENMQVNTLVJUTV9CQVNFXS5kdW1waXQgPSB0Y19kdW1wX3RjbGFzczsKLQl9Ci0KIAlyZWdpc3Rlcl9xZGlzYygmcGZpZm9fcWRpc2Nfb3BzKTsKIAlyZWdpc3Rlcl9xZGlzYygmYmZpZm9fcWRpc2Nfb3BzKTsKIAlwcm9jX25ldF9mb3BzX2NyZWF0ZSgicHNjaGVkIiwgMCwgJnBzY2hlZF9mb3BzKTsKIAorCXJ0bmxfcmVnaXN0ZXIoUEZfVU5TUEVDLCBSVE1fTkVXUURJU0MsIHRjX21vZGlmeV9xZGlzYywgTlVMTCk7CisJcnRubF9yZWdpc3RlcihQRl9VTlNQRUMsIFJUTV9ERUxRRElTQywgdGNfZ2V0X3FkaXNjLCBOVUxMKTsKKwlydG5sX3JlZ2lzdGVyKFBGX1VOU1BFQywgUlRNX0dFVFFESVNDLCB0Y19nZXRfcWRpc2MsIHRjX2R1bXBfcWRpc2MpOworCXJ0bmxfcmVnaXN0ZXIoUEZfVU5TUEVDLCBSVE1fTkVXVENMQVNTLCB0Y19jdGxfdGNsYXNzLCBOVUxMKTsKKwlydG5sX3JlZ2lzdGVyKFBGX1VOU1BFQywgUlRNX0RFTFRDTEFTUywgdGNfY3RsX3RjbGFzcywgTlVMTCk7CisJcnRubF9yZWdpc3RlcihQRl9VTlNQRUMsIFJUTV9HRVRUQ0xBU1MsIHRjX2N0bF90Y2xhc3MsIHRjX2R1bXBfdGNsYXNzKTsKKwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvc2NoX2F0bS5jIGIvbmV0L3NjaGVkL3NjaF9hdG0uYwppbmRleCBhZmIzYmJkLi5iZTdkMjk5IDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvc2NoX2F0bS5jCisrKyBiL25ldC9zY2hlZC9zY2hfYXRtLmMKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KICNpbmNsdWRlIDxsaW51eC9maWxlLmg+IC8qIGZvciBmcHV0ICovCisjaW5jbHVkZSA8bmV0L25ldGxpbmsuaD4KICNpbmNsdWRlIDxuZXQvcGt0X3NjaGVkLmg+CiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KIApAQCAtMTU3LDE5ICsxNTgsNiBAQAogCXJldHVybiBhdG1fdGNfZ2V0KHNjaCxjbGFzc2lkKTsKIH0KIAotCi1zdGF0aWMgdm9pZCBkZXN0cm95X2ZpbHRlcnMoc3RydWN0IGF0bV9mbG93X2RhdGEgKmZsb3cpCi17Ci0Jc3RydWN0IHRjZl9wcm90byAqZmlsdGVyOwotCi0Jd2hpbGUgKChmaWx0ZXIgPSBmbG93LT5maWx0ZXJfbGlzdCkpIHsKLQkJRFBSSU5USygiZGVzdHJveV9maWx0ZXJzOiBkZXN0cm95aW5nIGZpbHRlciAlcFxuIixmaWx0ZXIpOwotCQlmbG93LT5maWx0ZXJfbGlzdCA9IGZpbHRlci0+bmV4dDsKLQkJdGNmX2Rlc3Ryb3koZmlsdGVyKTsKLQl9Ci19Ci0KLQogLyoKICAqIGF0bV90Y19wdXQgaGFuZGxlcyBhbGwgZGVzdHJ1Y3Rpb25zLCBpbmNsdWRpbmcgdGhlIG9uZXMgdGhhdCBhcmUgZXhwbGljaXRseQogICogcmVxdWVzdGVkIChhdG1fdGNfZGVzdHJveSwgZXRjLikuIFRoZSBhc3N1bXB0aW9uIGhlcmUgaXMgdGhhdCB3ZSBuZXZlciBkcm9wCkBAIC0xOTQsNyArMTgyLDcgQEAKIAkqcHJldiA9IGZsb3ctPm5leHQ7CiAJRFBSSU5USygiYXRtX3RjX3B1dDogcWRpc2MgJXBcbiIsZmxvdy0+cSk7CiAJcWRpc2NfZGVzdHJveShmbG93LT5xKTsKLQlkZXN0cm95X2ZpbHRlcnMoZmxvdyk7CisJdGNmX2Rlc3Ryb3lfY2hhaW4oZmxvdy0+ZmlsdGVyX2xpc3QpOwogCWlmIChmbG93LT5zb2NrKSB7CiAJCURQUklOVEsoImF0bV90Y19wdXQ6IGZfY291bnQgJWRcbiIsCiAJCSAgICBmaWxlX2NvdW50KGZsb3ctPnNvY2stPmZpbGUpKTsKQEAgLTUwMyw3ICs0OTEsNyBAQAogCQkJfQogCQkJRDJQUklOVEsoImF0bV90Y19kZXF1ZXVlOiBzZW5kaW5nIG9uIGNsYXNzICVwXG4iLGZsb3cpOwogCQkJLyogcmVtb3ZlIGFueSBMTCBoZWFkZXIgc29tZWJvZHkgZWxzZSBoYXMgYXR0YWNoZWQgKi8KLQkJCXNrYl9wdWxsKHNrYiwoY2hhciAqKSBza2ItPm5oLmlwaC0oY2hhciAqKSBza2ItPmRhdGEpOworCQkJc2tiX3B1bGwoc2tiLCBza2JfbmV0d29ya19vZmZzZXQoc2tiKSk7CiAJCQlpZiAoc2tiX2hlYWRyb29tKHNrYikgPCBmbG93LT5oZHJfbGVuKSB7CiAJCQkJc3RydWN0IHNrX2J1ZmYgKm5ldzsKIApAQCAtNTEzLDcgKzUwMSw3IEBACiAJCQkJc2tiID0gbmV3OwogCQkJfQogCQkJRDJQUklOVEsoInNjaF9hdG1fZGVxdWV1ZTogaXAgJXAsIGRhdGEgJXBcbiIsCi0JCQkgICAgc2tiLT5uaC5pcGgsc2tiLT5kYXRhKTsKKwkJCQkgc2tiX25ldHdvcmtfaGVhZGVyKHNrYiksIHNrYi0+ZGF0YSk7CiAJCQlBVE1fU0tCKHNrYiktPnZjYyA9IGZsb3ctPnZjYzsKIAkJCW1lbWNweShza2JfcHVzaChza2IsZmxvdy0+aGRyX2xlbiksZmxvdy0+aGRyLAogCQkJICAgIGZsb3ctPmhkcl9sZW4pOwpAQCAtNjEwLDcgKzU5OCw3IEBACiAJRFBSSU5USygiYXRtX3RjX2Rlc3Ryb3koc2NoICVwLFtxZGlzYyAlcF0pXG4iLHNjaCxwKTsKIAkvKiByYWNlcyA/ICovCiAJd2hpbGUgKChmbG93ID0gcC0+Zmxvd3MpKSB7Ci0JCWRlc3Ryb3lfZmlsdGVycyhmbG93KTsKKwkJdGNmX2Rlc3Ryb3lfY2hhaW4oZmxvdy0+ZmlsdGVyX2xpc3QpOwogCQlpZiAoZmxvdy0+cmVmID4gMSkKIAkJCXByaW50ayhLRVJOX0VSUiAiYXRtX2Rlc3Ryb3k6ICVwLT5yZWYgPSAlZFxuIixmbG93LAogCQkJICAgIGZsb3ctPnJlZik7CkBAIC02MzEsNyArNjE5LDcgQEAKIHsKIAlzdHJ1Y3QgYXRtX3FkaXNjX2RhdGEgKnAgPSBQUklWKHNjaCk7CiAJc3RydWN0IGF0bV9mbG93X2RhdGEgKmZsb3cgPSAoc3RydWN0IGF0bV9mbG93X2RhdGEgKikgY2w7Ci0JdW5zaWduZWQgY2hhciAqYiA9IHNrYi0+dGFpbDsKKwl1bnNpZ25lZCBjaGFyICpiID0gc2tiX3RhaWxfcG9pbnRlcihza2IpOwogCXN0cnVjdCBydGF0dHIgKnJ0YTsKIAogCURQUklOVEsoImF0bV90Y19kdW1wX2NsYXNzKHNjaCAlcCxbcWRpc2MgJXBdLGZsb3cgJXAsc2tiICVwLHRjbSAlcClcbiIsCkBAIC02NjEsMTEgKzY0OSwxMSBAQAogCiAJCVJUQV9QVVQoc2tiLFRDQV9BVE1fRVhDRVNTLHNpemVvZih6ZXJvKSwmemVybyk7CiAJfQotCXJ0YS0+cnRhX2xlbiA9IHNrYi0+dGFpbC1iOworCXJ0YS0+cnRhX2xlbiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKSAtIGI7CiAJcmV0dXJuIHNrYi0+bGVuOwogCiBydGF0dHJfZmFpbHVyZToKLQlza2JfdHJpbShza2IsYi1za2ItPmRhdGEpOworCW5sbXNnX3RyaW0oc2tiLCBiKTsKIAlyZXR1cm4gLTE7CiB9CiBzdGF0aWMgaW50CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvc2NoX2NicS5jIGIvbmV0L3NjaGVkL3NjaF9jYnEuYwppbmRleCA3NmM5MmU3Li5hMjk0NTQyIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvc2NoX2NicS5jCisrKyBiL25ldC9zY2hlZC9zY2hfY2JxLmMKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CiAjaW5jbHVkZSA8bmV0L2lwLmg+CisjaW5jbHVkZSA8bmV0L25ldGxpbmsuaD4KICNpbmNsdWRlIDxuZXQvcm91dGUuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxuZXQvc29jay5oPgpAQCAtMTEyLDcgKzExMyw3IEBACiAKIAkvKiBPdmVybGltaXQgc3RyYXRlZ3kgcGFyYW1ldGVycyAqLwogCXZvaWQJCQkoKm92ZXJsaW1pdCkoc3RydWN0IGNicV9jbGFzcyAqY2wpOwotCWxvbmcJCQlwZW5hbHR5OworCXBzY2hlZF90ZGlmZl90CQlwZW5hbHR5OwogCiAJLyogR2VuZXJhbCBzY2hlZHVsZXIgKFdSUikgcGFyYW1ldGVycyAqLwogCWxvbmcJCQlhbGxvdDsKQEAgLTE0Myw3ICsxNDQsNyBAQAogCXBzY2hlZF90aW1lX3QJCXVuZGVydGltZTsKIAlsb25nCQkJYXZnaWRsZTsKIAlsb25nCQkJZGVmaWNpdDsJLyogU2F2ZWQgZGVmaWNpdCBmb3IgV1JSICovCi0JdW5zaWduZWQgbG9uZwkJcGVuYWxpemVkOworCXBzY2hlZF90aW1lX3QJCXBlbmFsaXplZDsKIAlzdHJ1Y3QgZ25ldF9zdGF0c19iYXNpYyBic3RhdHM7CiAJc3RydWN0IGduZXRfc3RhdHNfcXVldWUgcXN0YXRzOwogCXN0cnVjdCBnbmV0X3N0YXRzX3JhdGVfZXN0IHJhdGVfZXN0OwpAQCAtMTgwLDEyICsxODEsMTIgQEAKIAlwc2NoZWRfdGltZV90CQlub3dfcnQ7CQkvKiBDYWNoZWQgcmVhbCB0aW1lICovCiAJdW5zaWduZWQJCXBtYXNrOwogCi0Jc3RydWN0IHRpbWVyX2xpc3QJZGVsYXlfdGltZXI7Ci0Jc3RydWN0IHRpbWVyX2xpc3QJd2RfdGltZXI7CS8qIFdhdGNoZG9nIHRpbWVyLAorCXN0cnVjdCBocnRpbWVyCQlkZWxheV90aW1lcjsKKwlzdHJ1Y3QgcWRpc2Nfd2F0Y2hkb2cJd2F0Y2hkb2c7CS8qIFdhdGNoZG9nIHRpbWVyLAogCQkJCQkJICAgc3RhcnRlZCB3aGVuIENCUSBoYXMKIAkJCQkJCSAgIGJhY2tsb2csIGJ1dCBjYW5ub3QKIAkJCQkJCSAgIHRyYW5zbWl0IGp1c3Qgbm93ICovCi0JbG9uZwkJCXdkX2V4cGlyZXM7CisJcHNjaGVkX3RkaWZmX3QJCXdkX2V4cGlyZXM7CiAJaW50CQkJdG9wbGV2ZWw7CiAJdTMyCQkJaGdlbmVyYXRvcjsKIH07CkBAIC0zODQsMTIgKzM4NSwxMiBAQAogCQlwc2NoZWRfdGltZV90IG5vdzsKIAkJcHNjaGVkX3RkaWZmX3QgaW5jcjsKIAotCQlQU0NIRURfR0VUX1RJTUUobm93KTsKLQkJaW5jciA9IFBTQ0hFRF9URElGRihub3csIHEtPm5vd19ydCk7Ci0JCVBTQ0hFRF9UQUREMihxLT5ub3csIGluY3IsIG5vdyk7CisJCW5vdyA9IHBzY2hlZF9nZXRfdGltZSgpOworCQlpbmNyID0gbm93IC0gcS0+bm93X3J0OworCQlub3cgPSBxLT5ub3cgKyBpbmNyOwogCiAJCWRvIHsKLQkJCWlmIChQU0NIRURfVExFU1MoY2wtPnVuZGVydGltZSwgbm93KSkgeworCQkJaWYgKGNsLT51bmRlcnRpbWUgPCBub3cpIHsKIAkJCQlxLT50b3BsZXZlbCA9IGNsLT5sZXZlbDsKIAkJCQlyZXR1cm47CiAJCQl9CkBAIC00NzMsNyArNDc0LDcgQEAKIHN0YXRpYyB2b2lkIGNicV9vdmxfY2xhc3NpYyhzdHJ1Y3QgY2JxX2NsYXNzICpjbCkKIHsKIAlzdHJ1Y3QgY2JxX3NjaGVkX2RhdGEgKnEgPSBxZGlzY19wcml2KGNsLT5xZGlzYyk7Ci0JcHNjaGVkX3RkaWZmX3QgZGVsYXkgPSBQU0NIRURfVERJRkYoY2wtPnVuZGVydGltZSwgcS0+bm93KTsKKwlwc2NoZWRfdGRpZmZfdCBkZWxheSA9IGNsLT51bmRlcnRpbWUgLSBxLT5ub3c7CiAKIAlpZiAoIWNsLT5kZWxheWVkKSB7CiAJCWRlbGF5ICs9IGNsLT5vZmZ0aW1lOwpAQCAtNDkxLDcgKzQ5Miw3IEBACiAJCQljbC0+YXZnaWRsZSA9IGNsLT5taW5pZGxlOwogCQlpZiAoZGVsYXkgPD0gMCkKIAkJCWRlbGF5ID0gMTsKLQkJUFNDSEVEX1RBREQyKHEtPm5vdywgZGVsYXksIGNsLT51bmRlcnRpbWUpOworCQljbC0+dW5kZXJ0aW1lID0gcS0+bm93ICsgZGVsYXk7CiAKIAkJY2wtPnhzdGF0cy5vdmVyYWN0aW9ucysrOwogCQljbC0+ZGVsYXllZCA9IDE7CkBAIC01MDgsNyArNTA5LDcgQEAKIAkJcHNjaGVkX3RkaWZmX3QgYmFzZV9kZWxheSA9IHEtPndkX2V4cGlyZXM7CiAKIAkJZm9yIChiID0gY2wtPmJvcnJvdzsgYjsgYiA9IGItPmJvcnJvdykgewotCQkJZGVsYXkgPSBQU0NIRURfVERJRkYoYi0+dW5kZXJ0aW1lLCBxLT5ub3cpOworCQkJZGVsYXkgPSBiLT51bmRlcnRpbWUgLSBxLT5ub3c7CiAJCQlpZiAoZGVsYXkgPCBiYXNlX2RlbGF5KSB7CiAJCQkJaWYgKGRlbGF5IDw9IDApCiAJCQkJCWRlbGF5ID0gMTsKQEAgLTU0NiwyNyArNTQ3LDMyIEBACiBzdGF0aWMgdm9pZCBjYnFfb3ZsX2RlbGF5KHN0cnVjdCBjYnFfY2xhc3MgKmNsKQogewogCXN0cnVjdCBjYnFfc2NoZWRfZGF0YSAqcSA9IHFkaXNjX3ByaXYoY2wtPnFkaXNjKTsKLQlwc2NoZWRfdGRpZmZfdCBkZWxheSA9IFBTQ0hFRF9URElGRihjbC0+dW5kZXJ0aW1lLCBxLT5ub3cpOworCXBzY2hlZF90ZGlmZl90IGRlbGF5ID0gY2wtPnVuZGVydGltZSAtIHEtPm5vdzsKIAogCWlmICghY2wtPmRlbGF5ZWQpIHsKLQkJdW5zaWduZWQgbG9uZyBzY2hlZCA9IGppZmZpZXM7CisJCXBzY2hlZF90aW1lX3Qgc2NoZWQgPSBxLT5ub3c7CisJCWt0aW1lX3QgZXhwaXJlczsKIAogCQlkZWxheSArPSBjbC0+b2ZmdGltZTsKIAkJaWYgKGNsLT5hdmdpZGxlIDwgMCkKIAkJCWRlbGF5IC09ICgtY2wtPmF2Z2lkbGUpIC0gKCgtY2wtPmF2Z2lkbGUpID4+IGNsLT5ld21hX2xvZyk7CiAJCWlmIChjbC0+YXZnaWRsZSA8IGNsLT5taW5pZGxlKQogCQkJY2wtPmF2Z2lkbGUgPSBjbC0+bWluaWRsZTsKLQkJUFNDSEVEX1RBREQyKHEtPm5vdywgZGVsYXksIGNsLT51bmRlcnRpbWUpOworCQljbC0+dW5kZXJ0aW1lID0gcS0+bm93ICsgZGVsYXk7CiAKIAkJaWYgKGRlbGF5ID4gMCkgewotCQkJc2NoZWQgKz0gUFNDSEVEX1VTMkpJRkZJRShkZWxheSkgKyBjbC0+cGVuYWx0eTsKKwkJCXNjaGVkICs9IGRlbGF5ICsgY2wtPnBlbmFsdHk7CiAJCQljbC0+cGVuYWxpemVkID0gc2NoZWQ7CiAJCQljbC0+Y3ByaW9yaXR5ID0gVENfQ0JRX01BWFBSSU87CiAJCQlxLT5wbWFzayB8PSAoMTw8VENfQ0JRX01BWFBSSU8pOwotCQkJaWYgKGRlbF90aW1lcigmcS0+ZGVsYXlfdGltZXIpICYmCi0JCQkgICAgKGxvbmcpKHEtPmRlbGF5X3RpbWVyLmV4cGlyZXMgLSBzY2hlZCkgPiAwKQotCQkJCXEtPmRlbGF5X3RpbWVyLmV4cGlyZXMgPSBzY2hlZDsKLQkJCWFkZF90aW1lcigmcS0+ZGVsYXlfdGltZXIpOworCisJCQlleHBpcmVzID0ga3RpbWVfc2V0KDAsIDApOworCQkJZXhwaXJlcyA9IGt0aW1lX2FkZF9ucyhleHBpcmVzLCBQU0NIRURfVVMyTlMoc2NoZWQpKTsKKwkJCWlmIChocnRpbWVyX3RyeV90b19jYW5jZWwoJnEtPmRlbGF5X3RpbWVyKSAmJgorCQkJICAgIGt0aW1lX3RvX25zKGt0aW1lX3N1YihxLT5kZWxheV90aW1lci5leHBpcmVzLAorCQkJCQkJICBleHBpcmVzKSkgPiAwKQorCQkJCXEtPmRlbGF5X3RpbWVyLmV4cGlyZXMgPSBleHBpcmVzOworCQkJaHJ0aW1lcl9yZXN0YXJ0KCZxLT5kZWxheV90aW1lcik7CiAJCQljbC0+ZGVsYXllZCA9IDE7CiAJCQljbC0+eHN0YXRzLm92ZXJhY3Rpb25zKys7CiAJCQlyZXR1cm47CkBAIC01ODMsNyArNTg5LDcgQEAKIHsKIAlzdHJ1Y3QgY2JxX3NjaGVkX2RhdGEgKnEgPSBxZGlzY19wcml2KGNsLT5xZGlzYyk7CiAKLQljbC0+cGVuYWxpemVkID0gamlmZmllcyArIGNsLT5wZW5hbHR5OworCWNsLT5wZW5hbGl6ZWQgPSBxLT5ub3cgKyBjbC0+cGVuYWx0eTsKIAogCWlmIChjbC0+Y3ByaW9yaXR5ICE9IGNsLT5wcmlvcml0eTIpIHsKIAkJY2wtPmNwcmlvcml0eSA9IGNsLT5wcmlvcml0eTI7CkBAIC02MDQsMjcgKzYxMCwxOSBAQAogCWNicV9vdmxfY2xhc3NpYyhjbCk7CiB9CiAKLXN0YXRpYyB2b2lkIGNicV93YXRjaGRvZyh1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlzdHJ1Y3QgUWRpc2MgKnNjaCA9IChzdHJ1Y3QgUWRpc2MqKWFyZzsKLQotCXNjaC0+ZmxhZ3MgJj0gflRDUV9GX1RIUk9UVExFRDsKLQluZXRpZl9zY2hlZHVsZShzY2gtPmRldik7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGNicV91bmRlbGF5X3ByaW8oc3RydWN0IGNicV9zY2hlZF9kYXRhICpxLCBpbnQgcHJpbykKK3N0YXRpYyBwc2NoZWRfdGRpZmZfdCBjYnFfdW5kZWxheV9wcmlvKHN0cnVjdCBjYnFfc2NoZWRfZGF0YSAqcSwgaW50IHByaW8sCisJCQkJICAgICAgIHBzY2hlZF90aW1lX3Qgbm93KQogewogCXN0cnVjdCBjYnFfY2xhc3MgKmNsOwogCXN0cnVjdCBjYnFfY2xhc3MgKmNsX3ByZXYgPSBxLT5hY3RpdmVbcHJpb107Ci0JdW5zaWduZWQgbG9uZyBub3cgPSBqaWZmaWVzOwotCXVuc2lnbmVkIGxvbmcgc2NoZWQgPSBub3c7CisJcHNjaGVkX3RpbWVfdCBzY2hlZCA9IG5vdzsKIAogCWlmIChjbF9wcmV2ID09IE5VTEwpCi0JCXJldHVybiBub3c7CisJCXJldHVybiAwOwogCiAJZG8gewogCQljbCA9IGNsX3ByZXYtPm5leHRfYWxpdmU7Ci0JCWlmICgobG9uZykobm93IC0gY2wtPnBlbmFsaXplZCkgPiAwKSB7CisJCWlmIChub3cgLSBjbC0+cGVuYWxpemVkID4gMCkgewogCQkJY2xfcHJldi0+bmV4dF9hbGl2ZSA9IGNsLT5uZXh0X2FsaXZlOwogCQkJY2wtPm5leHRfYWxpdmUgPSBOVUxMOwogCQkJY2wtPmNwcmlvcml0eSA9IGNsLT5wcmlvcml0eTsKQEAgLTY0MCwzMCArNjM4LDM0IEBACiAJCQl9CiAKIAkJCWNsID0gY2xfcHJldi0+bmV4dF9hbGl2ZTsKLQkJfSBlbHNlIGlmICgobG9uZykoc2NoZWQgLSBjbC0+cGVuYWxpemVkKSA+IDApCisJCX0gZWxzZSBpZiAoc2NoZWQgLSBjbC0+cGVuYWxpemVkID4gMCkKIAkJCXNjaGVkID0gY2wtPnBlbmFsaXplZDsKIAl9IHdoaWxlICgoY2xfcHJldiA9IGNsKSAhPSBxLT5hY3RpdmVbcHJpb10pOwogCi0JcmV0dXJuIChsb25nKShzY2hlZCAtIG5vdyk7CisJcmV0dXJuIHNjaGVkIC0gbm93OwogfQogCi1zdGF0aWMgdm9pZCBjYnFfdW5kZWxheSh1bnNpZ25lZCBsb25nIGFyZykKK3N0YXRpYyBlbnVtIGhydGltZXJfcmVzdGFydCBjYnFfdW5kZWxheShzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpCiB7Ci0Jc3RydWN0IFFkaXNjICpzY2ggPSAoc3RydWN0IFFkaXNjKilhcmc7Ci0Jc3RydWN0IGNicV9zY2hlZF9kYXRhICpxID0gcWRpc2NfcHJpdihzY2gpOwotCWxvbmcgZGVsYXkgPSAwOworCXN0cnVjdCBjYnFfc2NoZWRfZGF0YSAqcSA9IGNvbnRhaW5lcl9vZih0aW1lciwgc3RydWN0IGNicV9zY2hlZF9kYXRhLAorCQkJCQkJZGVsYXlfdGltZXIpOworCXN0cnVjdCBRZGlzYyAqc2NoID0gcS0+d2F0Y2hkb2cucWRpc2M7CisJcHNjaGVkX3RpbWVfdCBub3c7CisJcHNjaGVkX3RkaWZmX3QgZGVsYXkgPSAwOwogCXVuc2lnbmVkIHBtYXNrOwogCisJbm93ID0gcHNjaGVkX2dldF90aW1lKCk7CisKIAlwbWFzayA9IHEtPnBtYXNrOwogCXEtPnBtYXNrID0gMDsKIAogCXdoaWxlIChwbWFzaykgewogCQlpbnQgcHJpbyA9IGZmeih+cG1hc2spOwotCQlsb25nIHRtcDsKKwkJcHNjaGVkX3RkaWZmX3QgdG1wOwogCiAJCXBtYXNrICY9IH4oMTw8cHJpbyk7CiAKLQkJdG1wID0gY2JxX3VuZGVsYXlfcHJpbyhxLCBwcmlvKTsKKwkJdG1wID0gY2JxX3VuZGVsYXlfcHJpbyhxLCBwcmlvLCBub3cpOwogCQlpZiAodG1wID4gMCkgewogCQkJcS0+cG1hc2sgfD0gMTw8cHJpbzsKIAkJCWlmICh0bXAgPCBkZWxheSB8fCBkZWxheSA9PSAwKQpAQCAtNjcyLDEyICs2NzQsMTYgQEAKIAl9CiAKIAlpZiAoZGVsYXkpIHsKLQkJcS0+ZGVsYXlfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBkZWxheTsKLQkJYWRkX3RpbWVyKCZxLT5kZWxheV90aW1lcik7CisJCWt0aW1lX3QgdGltZTsKKworCQl0aW1lID0ga3RpbWVfc2V0KDAsIDApOworCQl0aW1lID0ga3RpbWVfYWRkX25zKHRpbWUsIFBTQ0hFRF9VUzJOUyhub3cgKyBkZWxheSkpOworCQlocnRpbWVyX3N0YXJ0KCZxLT5kZWxheV90aW1lciwgdGltZSwgSFJUSU1FUl9NT0RFX0FCUyk7CiAJfQogCiAJc2NoLT5mbGFncyAmPSB+VENRX0ZfVEhST1RUTEVEOwogCW5ldGlmX3NjaGVkdWxlKHNjaC0+ZGV2KTsKKwlyZXR1cm4gSFJUSU1FUl9OT1JFU1RBUlQ7CiB9CiAKIApAQCAtNzMyLDcgKzczOCw3IEBACiAJaWYgKGNsICYmIHEtPnRvcGxldmVsID49IGJvcnJvd2VkLT5sZXZlbCkgewogCQlpZiAoY2wtPnEtPnEucWxlbiA+IDEpIHsKIAkJCWRvIHsKLQkJCQlpZiAoUFNDSEVEX0lTX1BBU1RQRVJGRUNUKGJvcnJvd2VkLT51bmRlcnRpbWUpKSB7CisJCQkJaWYgKGJvcnJvd2VkLT51bmRlcnRpbWUgPT0gUFNDSEVEX1BBU1RQRVJGRUNUKSB7CiAJCQkJCXEtPnRvcGxldmVsID0gYm9ycm93ZWQtPmxldmVsOwogCQkJCQlyZXR1cm47CiAJCQkJfQpAQCAtNzcwLDcgKzc3Niw3IEBACiAJCQkgaWRsZSA9IChub3cgLSBsYXN0KSAtIGxhc3RfcGt0bGVuL3JhdGUKIAkJICovCiAKLQkJaWRsZSA9IFBTQ0hFRF9URElGRihxLT5ub3csIGNsLT5sYXN0KTsKKwkJaWRsZSA9IHEtPm5vdyAtIGNsLT5sYXN0OwogCQlpZiAoKHVuc2lnbmVkIGxvbmcpaWRsZSA+IDEyOCoxMDI0KjEwMjQpIHsKIAkJCWF2Z2lkbGUgPSBjbC0+bWF4aWRsZTsKIAkJfSBlbHNlIHsKQEAgLTgxNCwxMyArODIwLDExIEBACiAJCQlpZGxlIC09IEwyVCgmcS0+bGluaywgbGVuKTsKIAkJCWlkbGUgKz0gTDJUKGNsLCBsZW4pOwogCi0JCQlQU0NIRURfQVVESVRfVERJRkYoaWRsZSk7Ci0KLQkJCVBTQ0hFRF9UQUREMihxLT5ub3csIGlkbGUsIGNsLT51bmRlcnRpbWUpOworCQkJY2wtPnVuZGVydGltZSA9IHEtPm5vdyArIGlkbGU7CiAJCX0gZWxzZSB7CiAJCQkvKiBVbmRlcmxpbWl0ICovCiAKLQkJCVBTQ0hFRF9TRVRfUEFTVFBFUkZFQ1QoY2wtPnVuZGVydGltZSk7CisJCQljbC0+dW5kZXJ0aW1lID0gUFNDSEVEX1BBU1RQRVJGRUNUOwogCQkJaWYgKGF2Z2lkbGUgPiBjbC0+bWF4aWRsZSkKIAkJCQljbC0+YXZnaWRsZSA9IGNsLT5tYXhpZGxlOwogCQkJZWxzZQpAQCAtODQxLDggKzg0NSw3IEBACiAJaWYgKGNsLT50cGFyZW50ID09IE5VTEwpCiAJCXJldHVybiBjbDsKIAotCWlmIChQU0NIRURfSVNfUEFTVFBFUkZFQ1QoY2wtPnVuZGVydGltZSkgfHwKLQkgICAgIVBTQ0hFRF9UTEVTUyhxLT5ub3csIGNsLT51bmRlcnRpbWUpKSB7CisJaWYgKGNsLT51bmRlcnRpbWUgPT0gUFNDSEVEX1BBU1RQRVJGRUNUIHx8IHEtPm5vdyA+PSBjbC0+dW5kZXJ0aW1lKSB7CiAJCWNsLT5kZWxheWVkID0gMDsKIAkJcmV0dXJuIGNsOwogCX0KQEAgLTg2NSw4ICs4NjgsNyBAQAogCQl9CiAJCWlmIChjbC0+bGV2ZWwgPiBxLT50b3BsZXZlbCkKIAkJCXJldHVybiBOVUxMOwotCX0gd2hpbGUgKCFQU0NIRURfSVNfUEFTVFBFUkZFQ1QoY2wtPnVuZGVydGltZSkgJiYKLQkJIFBTQ0hFRF9UTEVTUyhxLT5ub3csIGNsLT51bmRlcnRpbWUpKTsKKwl9IHdoaWxlIChjbC0+dW5kZXJ0aW1lICE9IFBTQ0hFRF9QQVNUUEVSRkVDVCAmJiBxLT5ub3cgPCBjbC0+dW5kZXJ0aW1lKTsKIAogCWNsLT5kZWxheWVkID0gMDsKIAlyZXR1cm4gY2w7CkBAIC0xMDAxLDggKzEwMDMsOCBAQAogCXBzY2hlZF90aW1lX3Qgbm93OwogCXBzY2hlZF90ZGlmZl90IGluY3I7CiAKLQlQU0NIRURfR0VUX1RJTUUobm93KTsKLQlpbmNyID0gUFNDSEVEX1RESUZGKG5vdywgcS0+bm93X3J0KTsKKwlub3cgPSBwc2NoZWRfZ2V0X3RpbWUoKTsKKwlpbmNyID0gbm93IC0gcS0+bm93X3J0OwogCiAJaWYgKHEtPnR4X2NsYXNzKSB7CiAJCXBzY2hlZF90ZGlmZl90IGluY3IyOwpAQCAtMTAxNCwxMiArMTAxNiwxMiBAQAogCQkgICBjYnFfdGltZSA9IG1heChyZWFsX3RpbWUsIHdvcmspOwogCQkgKi8KIAkJaW5jcjIgPSBMMlQoJnEtPmxpbmssIHEtPnR4X2xlbik7Ci0JCVBTQ0hFRF9UQUREKHEtPm5vdywgaW5jcjIpOworCQlxLT5ub3cgKz0gaW5jcjI7CiAJCWNicV91cGRhdGUocSk7CiAJCWlmICgoaW5jciAtPSBpbmNyMikgPCAwKQogCQkJaW5jciA9IDA7CiAJfQotCVBTQ0hFRF9UQUREKHEtPm5vdywgaW5jcik7CisJcS0+bm93ICs9IGluY3I7CiAJcS0+bm93X3J0ID0gbm93OwogCiAJZm9yICg7OykgewpAQCAtMTA1MSwxMSArMTA1MywxMSBAQAogCQkqLwogCiAJCWlmIChxLT50b3BsZXZlbCA9PSBUQ19DQlFfTUFYTEVWRUwgJiYKLQkJICAgIFBTQ0hFRF9JU19QQVNUUEVSRkVDVChxLT5saW5rLnVuZGVydGltZSkpCisJCSAgICBxLT5saW5rLnVuZGVydGltZSA9PSBQU0NIRURfUEFTVFBFUkZFQ1QpCiAJCQlicmVhazsKIAogCQlxLT50b3BsZXZlbCA9IFRDX0NCUV9NQVhMRVZFTDsKLQkJUFNDSEVEX1NFVF9QQVNUUEVSRkVDVChxLT5saW5rLnVuZGVydGltZSk7CisJCXEtPmxpbmsudW5kZXJ0aW1lID0gUFNDSEVEX1BBU1RQRVJGRUNUOwogCX0KIAogCS8qIE5vIHBhY2tldHMgaW4gc2NoZWR1bGVyIG9yIG5vYm9keSB3YW50cyB0byBnaXZlIHRoZW0gdG8gdXMgOi0oCkBAIC0xMDYzLDEzICsxMDY1LDkgQEAKIAogCWlmIChzY2gtPnEucWxlbikgewogCQlzY2gtPnFzdGF0cy5vdmVybGltaXRzKys7Ci0JCWlmIChxLT53ZF9leHBpcmVzKSB7Ci0JCQlsb25nIGRlbGF5ID0gUFNDSEVEX1VTMkpJRkZJRShxLT53ZF9leHBpcmVzKTsKLQkJCWlmIChkZWxheSA8PSAwKQotCQkJCWRlbGF5ID0gMTsKLQkJCW1vZF90aW1lcigmcS0+d2RfdGltZXIsIGppZmZpZXMgKyBkZWxheSk7Ci0JCQlzY2gtPmZsYWdzIHw9IFRDUV9GX1RIUk9UVExFRDsKLQkJfQorCQlpZiAocS0+d2RfZXhwaXJlcykKKwkJCXFkaXNjX3dhdGNoZG9nX3NjaGVkdWxlKCZxLT53YXRjaGRvZywKKwkJCQkJCW5vdyArIHEtPndkX2V4cGlyZXMpOwogCX0KIAlyZXR1cm4gTlVMTDsKIH0KQEAgLTEyNzYsMTAgKzEyNzQsMTAgQEAKIAlxLT5wbWFzayA9IDA7CiAJcS0+dHhfY2xhc3MgPSBOVUxMOwogCXEtPnR4X2JvcnJvd2VkID0gTlVMTDsKLQlkZWxfdGltZXIoJnEtPndkX3RpbWVyKTsKLQlkZWxfdGltZXIoJnEtPmRlbGF5X3RpbWVyKTsKKwlxZGlzY193YXRjaGRvZ19jYW5jZWwoJnEtPndhdGNoZG9nKTsKKwlocnRpbWVyX2NhbmNlbCgmcS0+ZGVsYXlfdGltZXIpOwogCXEtPnRvcGxldmVsID0gVENfQ0JRX01BWExFVkVMOwotCVBTQ0hFRF9HRVRfVElNRShxLT5ub3cpOworCXEtPm5vdyA9IHBzY2hlZF9nZXRfdGltZSgpOwogCXEtPm5vd19ydCA9IHEtPm5vdzsKIAogCWZvciAocHJpbyA9IDA7IHByaW8gPD0gVENfQ0JRX01BWFBSSU87IHByaW8rKykKQEAgLTEyOTAsNyArMTI4OCw3IEBACiAJCQlxZGlzY19yZXNldChjbC0+cSk7CiAKIAkJCWNsLT5uZXh0X2FsaXZlID0gTlVMTDsKLQkJCVBTQ0hFRF9TRVRfUEFTVFBFUkZFQ1QoY2wtPnVuZGVydGltZSk7CisJCQljbC0+dW5kZXJ0aW1lID0gUFNDSEVEX1BBU1RQRVJGRUNUOwogCQkJY2wtPmF2Z2lkbGUgPSBjbC0+bWF4aWRsZTsKIAkJCWNsLT5kZWZpY2l0ID0gY2wtPnF1YW50dW07CiAJCQljbC0+Y3ByaW9yaXR5ID0gY2wtPnByaW9yaXR5OwpAQCAtMTM3OSw3ICsxMzc3LDcgQEAKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JY2wtPnBlbmFsdHkgPSAob3ZsLT5wZW5hbHR5KkhaKS8xMDAwOworCWNsLT5wZW5hbHR5ID0gb3ZsLT5wZW5hbHR5OwogCXJldHVybiAwOwogfQogCkBAIC0xNDQ2LDE0ICsxNDQ0LDExIEBACiAJcS0+bGluay5taW5pZGxlID0gLTB4N0ZGRkZGRkY7CiAJcS0+bGluay5zdGF0c19sb2NrID0gJnNjaC0+ZGV2LT5xdWV1ZV9sb2NrOwogCi0JaW5pdF90aW1lcigmcS0+d2RfdGltZXIpOwotCXEtPndkX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylzY2g7Ci0JcS0+d2RfdGltZXIuZnVuY3Rpb24gPSBjYnFfd2F0Y2hkb2c7Ci0JaW5pdF90aW1lcigmcS0+ZGVsYXlfdGltZXIpOwotCXEtPmRlbGF5X3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylzY2g7CisJcWRpc2Nfd2F0Y2hkb2dfaW5pdCgmcS0+d2F0Y2hkb2csIHNjaCk7CisJaHJ0aW1lcl9pbml0KCZxLT5kZWxheV90aW1lciwgQ0xPQ0tfTU9OT1RPTklDLCBIUlRJTUVSX01PREVfQUJTKTsKIAlxLT5kZWxheV90aW1lci5mdW5jdGlvbiA9IGNicV91bmRlbGF5OwogCXEtPnRvcGxldmVsID0gVENfQ0JRX01BWExFVkVMOwotCVBTQ0hFRF9HRVRfVElNRShxLT5ub3cpOworCXEtPm5vdyA9IHBzY2hlZF9nZXRfdGltZSgpOwogCXEtPm5vd19ydCA9IHEtPm5vdzsKIAogCWNicV9saW5rX2NsYXNzKCZxLT5saW5rKTsKQEAgLTE0NjcsMTkgKzE0NjIsMTkgQEAKIAogc3RhdGljIF9faW5saW5lX18gaW50IGNicV9kdW1wX3JhdGUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGNicV9jbGFzcyAqY2wpCiB7Ci0JdW5zaWduZWQgY2hhcgkgKmIgPSBza2ItPnRhaWw7CisJdW5zaWduZWQgY2hhciAqYiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKTsKIAogCVJUQV9QVVQoc2tiLCBUQ0FfQ0JRX1JBVEUsIHNpemVvZihjbC0+Ul90YWItPnJhdGUpLCAmY2wtPlJfdGFiLT5yYXRlKTsKIAlyZXR1cm4gc2tiLT5sZW47CiAKIHJ0YXR0cl9mYWlsdXJlOgotCXNrYl90cmltKHNrYiwgYiAtIHNrYi0+ZGF0YSk7CisJbmxtc2dfdHJpbShza2IsIGIpOwogCXJldHVybiAtMTsKIH0KIAogc3RhdGljIF9faW5saW5lX18gaW50IGNicV9kdW1wX2xzcyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgY2JxX2NsYXNzICpjbCkKIHsKLQl1bnNpZ25lZCBjaGFyCSAqYiA9IHNrYi0+dGFpbDsKKwl1bnNpZ25lZCBjaGFyICpiID0gc2tiX3RhaWxfcG9pbnRlcihza2IpOwogCXN0cnVjdCB0Y19jYnFfbHNzb3B0IG9wdDsKIAogCW9wdC5mbGFncyA9IDA7CkBAIC0xNDk4LDEzICsxNDkzLDEzIEBACiAJcmV0dXJuIHNrYi0+bGVuOwogCiBydGF0dHJfZmFpbHVyZToKLQlza2JfdHJpbShza2IsIGIgLSBza2ItPmRhdGEpOworCW5sbXNnX3RyaW0oc2tiLCBiKTsKIAlyZXR1cm4gLTE7CiB9CiAKIHN0YXRpYyBfX2lubGluZV9fIGludCBjYnFfZHVtcF93cnIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGNicV9jbGFzcyAqY2wpCiB7Ci0JdW5zaWduZWQgY2hhcgkgKmIgPSBza2ItPnRhaWw7CisJdW5zaWduZWQgY2hhciAqYiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKTsKIAlzdHJ1Y3QgdGNfY2JxX3dycm9wdCBvcHQ7CiAKIAlvcHQuZmxhZ3MgPSAwOwpAQCAtMTUxNiwzMCArMTUxMSwzMCBAQAogCXJldHVybiBza2ItPmxlbjsKIAogcnRhdHRyX2ZhaWx1cmU6Ci0Jc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKKwlubG1zZ190cmltKHNrYiwgYik7CiAJcmV0dXJuIC0xOwogfQogCiBzdGF0aWMgX19pbmxpbmVfXyBpbnQgY2JxX2R1bXBfb3ZsKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBjYnFfY2xhc3MgKmNsKQogewotCXVuc2lnbmVkIGNoYXIJICpiID0gc2tiLT50YWlsOworCXVuc2lnbmVkIGNoYXIgKmIgPSBza2JfdGFpbF9wb2ludGVyKHNrYik7CiAJc3RydWN0IHRjX2NicV9vdmwgb3B0OwogCiAJb3B0LnN0cmF0ZWd5ID0gY2wtPm92bF9zdHJhdGVneTsKIAlvcHQucHJpb3JpdHkyID0gY2wtPnByaW9yaXR5MisxOwogCW9wdC5wYWQgPSAwOwotCW9wdC5wZW5hbHR5ID0gKGNsLT5wZW5hbHR5KjEwMDApL0haOworCW9wdC5wZW5hbHR5ID0gY2wtPnBlbmFsdHk7CiAJUlRBX1BVVChza2IsIFRDQV9DQlFfT1ZMX1NUUkFURUdZLCBzaXplb2Yob3B0KSwgJm9wdCk7CiAJcmV0dXJuIHNrYi0+bGVuOwogCiBydGF0dHJfZmFpbHVyZToKLQlza2JfdHJpbShza2IsIGIgLSBza2ItPmRhdGEpOworCW5sbXNnX3RyaW0oc2tiLCBiKTsKIAlyZXR1cm4gLTE7CiB9CiAKIHN0YXRpYyBfX2lubGluZV9fIGludCBjYnFfZHVtcF9mb3B0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBjYnFfY2xhc3MgKmNsKQogewotCXVuc2lnbmVkIGNoYXIJICpiID0gc2tiLT50YWlsOworCXVuc2lnbmVkIGNoYXIgKmIgPSBza2JfdGFpbF9wb2ludGVyKHNrYik7CiAJc3RydWN0IHRjX2NicV9mb3B0IG9wdDsKIAogCWlmIChjbC0+c3BsaXQgfHwgY2wtPmRlZm1hcCkgewpAQCAtMTU1MSwxNCArMTU0NiwxNCBAQAogCXJldHVybiBza2ItPmxlbjsKIAogcnRhdHRyX2ZhaWx1cmU6Ci0Jc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKKwlubG1zZ190cmltKHNrYiwgYik7CiAJcmV0dXJuIC0xOwogfQogCiAjaWZkZWYgQ09ORklHX05FVF9DTFNfUE9MSUNFCiBzdGF0aWMgX19pbmxpbmVfXyBpbnQgY2JxX2R1bXBfcG9saWNlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBjYnFfY2xhc3MgKmNsKQogewotCXVuc2lnbmVkIGNoYXIJICpiID0gc2tiLT50YWlsOworCXVuc2lnbmVkIGNoYXIgKmIgPSBza2JfdGFpbF9wb2ludGVyKHNrYik7CiAJc3RydWN0IHRjX2NicV9wb2xpY2Ugb3B0OwogCiAJaWYgKGNsLT5wb2xpY2UpIHsKQEAgLTE1NzAsNyArMTU2NSw3IEBACiAJcmV0dXJuIHNrYi0+bGVuOwogCiBydGF0dHJfZmFpbHVyZToKLQlza2JfdHJpbShza2IsIGIgLSBza2ItPmRhdGEpOworCW5sbXNnX3RyaW0oc2tiLCBiKTsKIAlyZXR1cm4gLTE7CiB9CiAjZW5kaWYKQEAgLTE1OTIsMTggKzE1ODcsMTggQEAKIHN0YXRpYyBpbnQgY2JxX2R1bXAoc3RydWN0IFFkaXNjICpzY2gsIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IGNicV9zY2hlZF9kYXRhICpxID0gcWRpc2NfcHJpdihzY2gpOwotCXVuc2lnbmVkIGNoYXIJICpiID0gc2tiLT50YWlsOworCXVuc2lnbmVkIGNoYXIgKmIgPSBza2JfdGFpbF9wb2ludGVyKHNrYik7CiAJc3RydWN0IHJ0YXR0ciAqcnRhOwogCiAJcnRhID0gKHN0cnVjdCBydGF0dHIqKWI7CiAJUlRBX1BVVChza2IsIFRDQV9PUFRJT05TLCAwLCBOVUxMKTsKIAlpZiAoY2JxX2R1bXBfYXR0cihza2IsICZxLT5saW5rKSA8IDApCiAJCWdvdG8gcnRhdHRyX2ZhaWx1cmU7Ci0JcnRhLT5ydGFfbGVuID0gc2tiLT50YWlsIC0gYjsKKwlydGEtPnJ0YV9sZW4gPSBza2JfdGFpbF9wb2ludGVyKHNrYikgLSBiOwogCXJldHVybiBza2ItPmxlbjsKIAogcnRhdHRyX2ZhaWx1cmU6Ci0Jc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKKwlubG1zZ190cmltKHNrYiwgYik7CiAJcmV0dXJuIC0xOwogfQogCkBAIC0xNjIxLDcgKzE2MTYsNyBAQAogCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdGNtc2cgKnRjbSkKIHsKIAlzdHJ1Y3QgY2JxX2NsYXNzICpjbCA9IChzdHJ1Y3QgY2JxX2NsYXNzKilhcmc7Ci0JdW5zaWduZWQgY2hhcgkgKmIgPSBza2ItPnRhaWw7CisJdW5zaWduZWQgY2hhciAqYiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKTsKIAlzdHJ1Y3QgcnRhdHRyICpydGE7CiAKIAlpZiAoY2wtPnRwYXJlbnQpCkBAIC0xNjM1LDExICsxNjMwLDExIEBACiAJUlRBX1BVVChza2IsIFRDQV9PUFRJT05TLCAwLCBOVUxMKTsKIAlpZiAoY2JxX2R1bXBfYXR0cihza2IsIGNsKSA8IDApCiAJCWdvdG8gcnRhdHRyX2ZhaWx1cmU7Ci0JcnRhLT5ydGFfbGVuID0gc2tiLT50YWlsIC0gYjsKKwlydGEtPnJ0YV9sZW4gPSBza2JfdGFpbF9wb2ludGVyKHNrYikgLSBiOwogCXJldHVybiBza2ItPmxlbjsKIAogcnRhdHRyX2ZhaWx1cmU6Ci0Jc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKKwlubG1zZ190cmltKHNrYiwgYik7CiAJcmV0dXJuIC0xOwogfQogCkBAIC0xNjU0LDggKzE2NDksOCBAQAogCWNsLT54c3RhdHMuYXZnaWRsZSA9IGNsLT5hdmdpZGxlOwogCWNsLT54c3RhdHMudW5kZXJ0aW1lID0gMDsKIAotCWlmICghUFNDSEVEX0lTX1BBU1RQRVJGRUNUKGNsLT51bmRlcnRpbWUpKQotCQljbC0+eHN0YXRzLnVuZGVydGltZSA9IFBTQ0hFRF9URElGRihjbC0+dW5kZXJ0aW1lLCBxLT5ub3cpOworCWlmIChjbC0+dW5kZXJ0aW1lICE9IFBTQ0hFRF9QQVNUUEVSRkVDVCkKKwkJY2wtPnhzdGF0cy51bmRlcnRpbWUgPSBjbC0+dW5kZXJ0aW1lIC0gcS0+bm93OwogCiAJaWYgKGduZXRfc3RhdHNfY29weV9iYXNpYyhkLCAmY2wtPmJzdGF0cykgPCAwIHx8CiAjaWZkZWYgQ09ORklHX05FVF9FU1RJTUFUT1IKQEAgLTE3MjIsMjMgKzE3MTcsMTMgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgY2JxX2Rlc3Ryb3lfZmlsdGVycyhzdHJ1Y3QgY2JxX2NsYXNzICpjbCkKLXsKLQlzdHJ1Y3QgdGNmX3Byb3RvICp0cDsKLQotCXdoaWxlICgodHAgPSBjbC0+ZmlsdGVyX2xpc3QpICE9IE5VTEwpIHsKLQkJY2wtPmZpbHRlcl9saXN0ID0gdHAtPm5leHQ7Ci0JCXRjZl9kZXN0cm95KHRwKTsKLQl9Ci19Ci0KIHN0YXRpYyB2b2lkIGNicV9kZXN0cm95X2NsYXNzKHN0cnVjdCBRZGlzYyAqc2NoLCBzdHJ1Y3QgY2JxX2NsYXNzICpjbCkKIHsKIAlzdHJ1Y3QgY2JxX3NjaGVkX2RhdGEgKnEgPSBxZGlzY19wcml2KHNjaCk7CiAKIAlCVUdfVFJBUCghY2wtPmZpbHRlcnMpOwogCi0JY2JxX2Rlc3Ryb3lfZmlsdGVycyhjbCk7CisJdGNmX2Rlc3Ryb3lfY2hhaW4oY2wtPmZpbHRlcl9saXN0KTsKIAlxZGlzY19kZXN0cm95KGNsLT5xKTsKIAlxZGlzY19wdXRfcnRhYihjbC0+Ul90YWIpOwogI2lmZGVmIENPTkZJR19ORVRfRVNUSU1BVE9SCkBAIC0xNzY1LDcgKzE3NTAsNyBAQAogCSAqLwogCWZvciAoaCA9IDA7IGggPCAxNjsgaCsrKQogCQlmb3IgKGNsID0gcS0+Y2xhc3Nlc1toXTsgY2w7IGNsID0gY2wtPm5leHQpCi0JCQljYnFfZGVzdHJveV9maWx0ZXJzKGNsKTsKKwkJCXRjZl9kZXN0cm95X2NoYWluKGNsLT5maWx0ZXJfbGlzdCk7CiAKIAlmb3IgKGggPSAwOyBoIDwgMTY7IGgrKykgewogCQlzdHJ1Y3QgY2JxX2NsYXNzICpuZXh0OwpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL3NjaF9kc21hcmsuYyBiL25ldC9zY2hlZC9zY2hfZHNtYXJrLmMKaW5kZXggOTYzMjRjZi4uM2M2ZmQxOCAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL3NjaF9kc21hcmsuYworKysgYi9uZXQvc2NoZWQvc2NoX2RzbWFyay5jCkBAIC0yMTYsMTcgKzIxNiwxNyBAQAogCQkvKiBGSVhNRTogU2FmZSB3aXRoIG5vbi1saW5lYXIgc2ticz8gLS1SUiAqLwogCQlzd2l0Y2ggKHNrYi0+cHJvdG9jb2wpIHsKIAkJCWNhc2UgX19jb25zdGFudF9odG9ucyhFVEhfUF9JUCk6Ci0JCQkJc2tiLT50Y19pbmRleCA9IGlwdjRfZ2V0X2RzZmllbGQoc2tiLT5uaC5pcGgpCisJCQkJc2tiLT50Y19pbmRleCA9IGlwdjRfZ2V0X2RzZmllbGQoaXBfaGRyKHNrYikpCiAJCQkJCSYgfklORVRfRUNOX01BU0s7CiAJCQkJYnJlYWs7CiAJCQljYXNlIF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfSVBWNik6Ci0JCQkJc2tiLT50Y19pbmRleCA9IGlwdjZfZ2V0X2RzZmllbGQoc2tiLT5uaC5pcHY2aCkKKwkJCQlza2ItPnRjX2luZGV4ID0gaXB2Nl9nZXRfZHNmaWVsZChpcHY2X2hkcihza2IpKQogCQkJCQkmIH5JTkVUX0VDTl9NQVNLOwogCQkJCWJyZWFrOwogCQkJZGVmYXVsdDoKIAkJCQlza2ItPnRjX2luZGV4ID0gMDsKIAkJCQlicmVhazsKLQkJfTsKKwkJfQogCX0KIAogCWlmIChUQ19IX01BSihza2ItPnByaW9yaXR5KSA9PSBzY2gtPmhhbmRsZSkKQEAgLTI1Nyw3ICsyNTcsNyBAQAogCQkJCWlmIChwLT5kZWZhdWx0X2luZGV4ICE9IE5PX0RFRkFVTFRfSU5ERVgpCiAJCQkJCXNrYi0+dGNfaW5kZXggPSBwLT5kZWZhdWx0X2luZGV4OwogCQkJCWJyZWFrOwotCQl9OworCQl9CiAJfQogCiAJZXJyID0gcC0+cS0+ZW5xdWV1ZShza2IscC0+cSk7CkBAIC0yOTIsMTEgKzI5MiwxMSBAQAogCiAJc3dpdGNoIChza2ItPnByb3RvY29sKSB7CiAJCWNhc2UgX19jb25zdGFudF9odG9ucyhFVEhfUF9JUCk6Ci0JCQlpcHY0X2NoYW5nZV9kc2ZpZWxkKHNrYi0+bmguaXBoLCBwLT5tYXNrW2luZGV4XSwKKwkJCWlwdjRfY2hhbmdlX2RzZmllbGQoaXBfaGRyKHNrYiksIHAtPm1hc2tbaW5kZXhdLAogCQkJCQkgICAgcC0+dmFsdWVbaW5kZXhdKTsKIAkJCWJyZWFrOwogCQljYXNlIF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfSVBWNik6Ci0JCQlpcHY2X2NoYW5nZV9kc2ZpZWxkKHNrYi0+bmguaXB2NmgsIHAtPm1hc2tbaW5kZXhdLAorCQkJaXB2Nl9jaGFuZ2VfZHNmaWVsZChpcHY2X2hkcihza2IpLCBwLT5tYXNrW2luZGV4XSwKIAkJCQkJICAgIHAtPnZhbHVlW2luZGV4XSk7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKQEAgLTMxMCw3ICszMTAsNyBAQAogCQkJCSAgICAgICAidW5zdXBwb3J0ZWQgcHJvdG9jb2wgJWRcbiIsCiAJCQkJICAgICAgIG50b2hzKHNrYi0+cHJvdG9jb2wpKTsKIAkJCWJyZWFrOwotCX07CisJfQogCiAJcmV0dXJuIHNrYjsKIH0KQEAgLTQxMiwxNiArNDEyLDEwIEBACiBzdGF0aWMgdm9pZCBkc21hcmtfZGVzdHJveShzdHJ1Y3QgUWRpc2MgKnNjaCkKIHsKIAlzdHJ1Y3QgZHNtYXJrX3FkaXNjX2RhdGEgKnAgPSBQUklWKHNjaCk7Ci0Jc3RydWN0IHRjZl9wcm90byAqdHA7CiAKIAlEUFJJTlRLKCJkc21hcmtfZGVzdHJveShzY2ggJXAsW3FkaXNjICVwXSlcbiIsIHNjaCwgcCk7CiAKLQl3aGlsZSAocC0+ZmlsdGVyX2xpc3QpIHsKLQkJdHAgPSBwLT5maWx0ZXJfbGlzdDsKLQkJcC0+ZmlsdGVyX2xpc3QgPSB0cC0+bmV4dDsKLQkJdGNmX2Rlc3Ryb3kodHApOwotCX0KLQorCXRjZl9kZXN0cm95X2NoYWluKHAtPmZpbHRlcl9saXN0KTsKIAlxZGlzY19kZXN0cm95KHAtPnEpOwogCWtmcmVlKHAtPm1hc2spOwogfQpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL3NjaF9nZW5lcmljLmMgYi9uZXQvc2NoZWQvc2NoX2dlbmVyaWMuYwppbmRleCA1MmViMzQzLi4zMzg1ZWU1IDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvc2NoX2dlbmVyaWMuYworKysgYi9uZXQvc2NoZWQvc2NoX2dlbmVyaWMuYwpAQCAtMzYsMzQgKzM2LDI3IEBACiAKIC8qIE1haW4gdHJhbnNtaXNzaW9uIHF1ZXVlLiAqLwogCi0vKiBNYWluIHFkaXNjIHN0cnVjdHVyZSBsb2NrLgotCi0gICBIb3dldmVyLCBtb2RpZmljYXRpb25zCi0gICB0byBkYXRhLCBwYXJ0aWNpcGF0aW5nIGluIHNjaGVkdWxpbmcgbXVzdCBiZSBhZGRpdGlvbmFsbHkKLSAgIHByb3RlY3RlZCB3aXRoIGRldi0+cXVldWVfbG9jayBzcGlubG9jay4KLQotICAgVGhlIGlkZWEgaXMgdGhlIGZvbGxvd2luZzoKLSAgIC0gZW5xdWV1ZSwgZGVxdWV1ZSBhcmUgc2VyaWFsaXplZCB2aWEgdG9wIGxldmVsIGRldmljZQotICAgICBzcGlubG9jayBkZXYtPnF1ZXVlX2xvY2suCi0gICAtIHRyZWUgd2Fsa2luZyBpcyBwcm90ZWN0ZWQgYnkgcmVhZF9sb2NrKHFkaXNjX3RyZWVfbG9jaykKLSAgICAgYW5kIHRoaXMgbG9jayBpcyB1c2VkIG9ubHkgaW4gcHJvY2VzcyBjb250ZXh0LgotICAgLSB1cGRhdGVzIHRvIHRyZWUgYXJlIG1hZGUgb25seSB1bmRlciBydG5sIHNlbWFwaG9yZSwKLSAgICAgaGVuY2UgdGhpcyBsb2NrIG1heSBiZSBtYWRlIHdpdGhvdXQgbG9jYWwgYmggZGlzYWJsaW5nLgotCi0gICBxZGlzY190cmVlX2xvY2sgbXVzdCBiZSBncmFiYmVkIEJFRk9SRSBkZXYtPnF1ZXVlX2xvY2shCisvKiBNb2RpZmljYXRpb25zIHRvIGRhdGEgcGFydGljaXBhdGluZyBpbiBzY2hlZHVsaW5nIG11c3QgYmUgcHJvdGVjdGVkIHdpdGgKKyAqIGRldi0+cXVldWVfbG9jayBzcGlubG9jay4KKyAqCisgKiBUaGUgaWRlYSBpcyB0aGUgZm9sbG93aW5nOgorICogLSBlbnF1ZXVlLCBkZXF1ZXVlIGFyZSBzZXJpYWxpemVkIHZpYSB0b3AgbGV2ZWwgZGV2aWNlCisgKiAgIHNwaW5sb2NrIGRldi0+cXVldWVfbG9jay4KKyAqIC0gaW5ncmVzcyBmaWx0ZXJpbmcgaXMgc2VyaWFsaXplZCB2aWEgdG9wIGxldmVsIGRldmljZQorICogICBzcGlubG9jayBkZXYtPmluZ3Jlc3NfbG9jay4KKyAqIC0gdXBkYXRlcyB0byB0cmVlIGFuZCB0cmVlIHdhbGtpbmcgYXJlIG9ubHkgZG9uZSB1bmRlciB0aGUgcnRubCBtdXRleC4KICAqLwotREVGSU5FX1JXTE9DSyhxZGlzY190cmVlX2xvY2spOwogCiB2b2lkIHFkaXNjX2xvY2tfdHJlZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXdyaXRlX2xvY2soJnFkaXNjX3RyZWVfbG9jayk7CiAJc3Bpbl9sb2NrX2JoKCZkZXYtPnF1ZXVlX2xvY2spOworCXNwaW5fbG9jaygmZGV2LT5pbmdyZXNzX2xvY2spOwogfQogCiB2b2lkIHFkaXNjX3VubG9ja190cmVlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CisJc3Bpbl91bmxvY2soJmRldi0+aW5ncmVzc19sb2NrKTsKIAlzcGluX3VubG9ja19iaCgmZGV2LT5xdWV1ZV9sb2NrKTsKLQl3cml0ZV91bmxvY2soJnFkaXNjX3RyZWVfbG9jayk7CiB9CiAKIC8qCkBAIC00NDIsNyArNDM1LDYgQEAKIAlzY2gtPmRlcXVldWUgPSBvcHMtPmRlcXVldWU7CiAJc2NoLT5kZXYgPSBkZXY7CiAJZGV2X2hvbGQoZGV2KTsKLQlzY2gtPnN0YXRzX2xvY2sgPSAmZGV2LT5xdWV1ZV9sb2NrOwogCWF0b21pY19zZXQoJnNjaC0+cmVmY250LCAxKTsKIAogCXJldHVybiBzY2g7CkBAIC00NTgsNiArNDUwLDcgQEAKIAlzY2ggPSBxZGlzY19hbGxvYyhkZXYsIG9wcyk7CiAJaWYgKElTX0VSUihzY2gpKQogCQlnb3RvIGVycm91dDsKKwlzY2gtPnN0YXRzX2xvY2sgPSAmZGV2LT5xdWV1ZV9sb2NrOwogCXNjaC0+cGFyZW50ID0gcGFyZW50aWQ7CiAKIAlpZiAoIW9wcy0+aW5pdCB8fCBvcHMtPmluaXQoc2NoLCBOVUxMKSA9PSAwKQpAQCAtNTI4LDE1ICs1MjEsMTEgQEAKIAkJCQlwcmludGsoS0VSTl9JTkZPICIlczogYWN0aXZhdGlvbiBmYWlsZWRcbiIsIGRldi0+bmFtZSk7CiAJCQkJcmV0dXJuOwogCQkJfQotCQkJd3JpdGVfbG9jaygmcWRpc2NfdHJlZV9sb2NrKTsKIAkJCWxpc3RfYWRkX3RhaWwoJnFkaXNjLT5saXN0LCAmZGV2LT5xZGlzY19saXN0KTsKLQkJCXdyaXRlX3VubG9jaygmcWRpc2NfdHJlZV9sb2NrKTsKIAkJfSBlbHNlIHsKIAkJCXFkaXNjID0gICZub3F1ZXVlX3FkaXNjOwogCQl9Ci0JCXdyaXRlX2xvY2soJnFkaXNjX3RyZWVfbG9jayk7CiAJCWRldi0+cWRpc2Nfc2xlZXBpbmcgPSBxZGlzYzsKLQkJd3JpdGVfdW5sb2NrKCZxZGlzY190cmVlX2xvY2spOwogCX0KIAogCWlmICghbmV0aWZfY2Fycmllcl9vayhkZXYpKQpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL3NjaF9oZnNjLmMgYi9uZXQvc2NoZWQvc2NoX2hmc2MuYwppbmRleCA0MDdjNmZiLi45ZDEyNGM0IDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvc2NoX2hmc2MuYworKysgYi9uZXQvc2NoZWQvc2NoX2hmc2MuYwpAQCAtNTksMTMgKzU5LDEzIEBACiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3JidHJlZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KICNpbmNsdWRlIDxsaW51eC9wa3Rfc2NoZWQuaD4KKyNpbmNsdWRlIDxuZXQvbmV0bGluay5oPgogI2luY2x1ZGUgPG5ldC9wa3Rfc2NoZWQuaD4KICNpbmNsdWRlIDxuZXQvcGt0X2Nscy5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KQEAgLTE5MiwyMyArMTkyLDkgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkIGRyb3BsaXN0OwkJLyogYWN0aXZlIGxlYWYgY2xhc3MgbGlzdCAoZm9yCiAJCQkJCQkgICBkcm9wcGluZykgKi8KIAlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHJlcXVldWU7CQkvKiByZXF1ZXVlZCBwYWNrZXQgKi8KLQlzdHJ1Y3QgdGltZXJfbGlzdCB3ZF90aW1lcjsJCS8qIHdhdGNoZG9nIHRpbWVyICovCisJc3RydWN0IHFkaXNjX3dhdGNoZG9nIHdhdGNoZG9nOwkJLyogd2F0Y2hkb2cgdGltZXIgKi8KIH07CiAKLS8qCi0gKiBtYWNyb3MKLSAqLwotI2lmZGVmIENPTkZJR19ORVRfU0NIX0NMS19HRVRUSU1FT0ZEQVkKLSNpbmNsdWRlIDxsaW51eC90aW1lLmg+Ci0jdW5kZWYgUFNDSEVEX0dFVF9USU1FCi0jZGVmaW5lIFBTQ0hFRF9HRVRfVElNRShzdGFtcCkJCQkJCQlcCi1kbyB7CQkJCQkJCQkJXAotCXN0cnVjdCB0aW1ldmFsIHR2OwkJCQkJCVwKLQlkb19nZXR0aW1lb2ZkYXkoJnR2KTsJCQkJCQlcCi0JKHN0YW1wKSA9IDFVTEwgKiBVU0VDX1BFUl9TRUMgKiB0di50dl9zZWMgKyB0di50dl91c2VjOwkJXAotfSB3aGlsZSAoMCkKLSNlbmRpZgotCiAjZGVmaW5lCUhUX0lORklOSVRZCTB4ZmZmZmZmZmZmZmZmZmZmZlVMTAkvKiBpbmZpbml0ZSB0aW1lIHZhbHVlICovCiAKIApAQCAtMzk0LDI4ICszODAsMTcgQEAKICAqCWlzbTogKHBzY2hlZF91cy9ieXRlKSA8PCBJU01fU0hJRlQKICAqCWR4OiBwc2NoZWRfdXMKICAqCi0gKiBDbG9jayBzb3VyY2UgcmVzb2x1dGlvbiAoQ09ORklHX05FVF9TQ0hfQ0xLXyopCi0gKiAgSklGRklFUzogZm9yIDQ4PD1IWjw9MTUzNCByZXNvbHV0aW9uIGlzIGJldHdlZW4gMC42M3VzIGFuZCAxLjI3dXMuCi0gKiAgQ1BVOiByZXNvbHV0aW9uIGlzIGJldHdlZW4gMC41dXMgYW5kIDF1cy4KLSAqICBHRVRUSU1FT0ZEQVk6IHJlc29sdXRpb24gaXMgZXhhY3RseSAxdXMuCisgKiBUaGUgY2xvY2sgc291cmNlIHJlc29sdXRpb24gd2l0aCBrdGltZSBpcyAxLjAyNHVzLgogICoKICAqIHNtIGFuZCBpc20gYXJlIHNjYWxlZCBpbiBvcmRlciB0byBrZWVwIGVmZmVjdGl2ZSBkaWdpdHMuCiAgKiBTTV9TSElGVCBhbmQgSVNNX1NISUZUIGFyZSBzZWxlY3RlZCB0byBrZWVwIGF0IGxlYXN0IDQgZWZmZWN0aXZlCiAgKiBkaWdpdHMgaW4gZGVjaW1hbCB1c2luZyB0aGUgZm9sbG93aW5nIHRhYmxlLgogICoKLSAqIE5vdGU6IFdlIGNhbiBhZmZvcmQgdGhlIGFkZGl0aW9uYWwgYWNjdXJhY3kgKGFsdHEgaGZzYyBrZWVwcyBhdCBtb3N0Ci0gKiAzIGVmZmVjdGl2ZSBkaWdpdHMpIHRoYW5rcyB0byB0aGUgZmFjdCB0aGF0IGxpbnV4IGNsb2NrIGlzIGJvdW5kZWQKLSAqIG11Y2ggbW9yZSB0aWdodGx5LgotICoKICAqICBiaXRzL3NlYyAgICAgIDEwMEticHMgICAgIDFNYnBzICAgICAxME1icHMgICAgIDEwME1icHMgICAgMUdicHMKICAqICAtLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogIGJ5dGVzLzAuNXVzICAgNi4yNWUtMyAgICA2Mi41ZS0zICAgIDYyNWUtMyAgICAgNjI1MGUtZSAgICA2MjUwMGUtMwotICogIGJ5dGVzL3VzICAgICAgMTIuNWUtMyAgICAxMjVlLTMgICAgIDEyNTBlLTMgICAgMTI1MDBlLTMgICAxMjUwMDBlLTMKLSAqICBieXRlcy8xLjI3dXMgIDE1Ljg3NWUtMyAgMTU4Ljc1ZS0zICAxNTg3LjVlLTMgIDE1ODc1ZS0zICAgMTU4NzUwZS0zCisgKiAgYnl0ZXMvMS4wMjR1cyAxMi44ZS0zICAgIDEyOGUtMyAgICAgMTI4MGUtMyAgICAxMjgwMGUtMyAgIDEyODAwMGUtMwogICoKLSAqICAwLjV1cy9ieXRlICAgIDE2MCAgICAgICAgMTYgICAgICAgICAxLjYgICAgICAgIDAuMTYgICAgICAgMC4wMTYKLSAqICB1cy9ieXRlICAgICAgIDgwICAgICAgICAgOCAgICAgICAgICAwLjggICAgICAgIDAuMDggICAgICAgMC4wMDgKLSAqICAxLjI3dXMvYnl0ZSAgIDYzICAgICAgICAgNi4zICAgICAgICAwLjYzICAgICAgIDAuMDYzICAgICAgMC4wMDYzCisgKiAgMS4wMjR1cy9ieXRlICA3OC4xMjUgICAgIDcuODEyNSAgICAgMC43ODEyNSAgICAwLjA3ODEyNSAgIDAuMDA3ODEyNQogICovCiAjZGVmaW5lCVNNX1NISUZUCTIwCiAjZGVmaW5lCUlTTV9TSElGVAkxOApAQCAtNDYwLDggKzQzNSw4IEBACiAJdTY0IHNtOwogCiAJc20gPSAoKHU2NCltIDw8IFNNX1NISUZUKTsKLQlzbSArPSBQU0NIRURfSklGRklFMlVTKEhaKSAtIDE7Ci0JZG9fZGl2KHNtLCBQU0NIRURfSklGRklFMlVTKEhaKSk7CisJc20gKz0gUFNDSEVEX1RJQ0tTX1BFUl9TRUMgLSAxOworCWRvX2RpdihzbSwgUFNDSEVEX1RJQ0tTX1BFUl9TRUMpOwogCXJldHVybiBzbTsKIH0KIApAQCAtNDc0LDcgKzQ0OSw3IEBACiAJaWYgKG0gPT0gMCkKIAkJaXNtID0gSFRfSU5GSU5JVFk7CiAJZWxzZSB7Ci0JCWlzbSA9ICgodTY0KVBTQ0hFRF9KSUZGSUUyVVMoSFopIDw8IElTTV9TSElGVCk7CisJCWlzbSA9ICgodTY0KVBTQ0hFRF9USUNLU19QRVJfU0VDIDw8IElTTV9TSElGVCk7CiAJCWlzbSArPSBtIC0gMTsKIAkJZG9fZGl2KGlzbSwgbSk7CiAJfQpAQCAtNDg3LDcgKzQ2Miw3IEBACiB7CiAJdTY0IGR4OwogCi0JZHggPSAoKHU2NClkICogUFNDSEVEX0pJRkZJRTJVUyhIWikpOworCWR4ID0gKCh1NjQpZCAqIFBTQ0hFRF9USUNLU19QRVJfU0VDKTsKIAlkeCArPSBVU0VDX1BFUl9TRUMgLSAxOwogCWRvX2RpdihkeCwgVVNFQ19QRVJfU0VDKTsKIAlyZXR1cm4gZHg7CkBAIC00OTksNyArNDc0LDcgQEAKIHsKIAl1NjQgbTsKIAotCW0gPSAoc20gKiBQU0NIRURfSklGRklFMlVTKEhaKSkgPj4gU01fU0hJRlQ7CisJbSA9IChzbSAqIFBTQ0hFRF9USUNLU19QRVJfU0VDKSA+PiBTTV9TSElGVDsKIAlyZXR1cm4gKHUzMiltOwogfQogCkBAIC01MTAsNyArNDg1LDcgQEAKIAl1NjQgZDsKIAogCWQgPSBkeCAqIFVTRUNfUEVSX1NFQzsKLQlkb19kaXYoZCwgUFNDSEVEX0pJRkZJRTJVUyhIWikpOworCWRvX2RpdihkLCBQU0NIRURfVElDS1NfUEVSX1NFQyk7CiAJcmV0dXJuICh1MzIpZDsKIH0KIApAQCAtNjU0LDkgKzYyOSw3IEBACiBzdGF0aWMgdm9pZAogaW5pdF9lZChzdHJ1Y3QgaGZzY19jbGFzcyAqY2wsIHVuc2lnbmVkIGludCBuZXh0X2xlbikKIHsKLQl1NjQgY3VyX3RpbWU7Ci0KLQlQU0NIRURfR0VUX1RJTUUoY3VyX3RpbWUpOworCXU2NCBjdXJfdGltZSA9IHBzY2hlZF9nZXRfdGltZSgpOwogCiAJLyogdXBkYXRlIHRoZSBkZWFkbGluZSBjdXJ2ZSAqLwogCXJ0c2NfbWluKCZjbC0+Y2xfZGVhZGxpbmUsICZjbC0+Y2xfcnNjLCBjdXJfdGltZSwgY2wtPmNsX2N1bXVsKTsKQEAgLTc3OSw3ICs3NTIsNyBAQAogCQkJaWYgKGNsLT5jbF9mbGFncyAmIEhGU0NfVVNDKSB7CiAJCQkJLyogY2xhc3MgaGFzIHVwcGVyIGxpbWl0IGN1cnZlICovCiAJCQkJaWYgKGN1cl90aW1lID09IDApCi0JCQkJCVBTQ0hFRF9HRVRfVElNRShjdXJfdGltZSk7CisJCQkJCWN1cl90aW1lID0gcHNjaGVkX2dldF90aW1lKCk7CiAKIAkJCQkvKiB1cGRhdGUgdGhlIHVsaW1pdCBjdXJ2ZSAqLwogCQkJCXJ0c2NfbWluKCZjbC0+Y2xfdWxpbWl0LCAmY2wtPmNsX3VzYywgY3VyX3RpbWUsCkBAIC0xMDYzLDcgKzEwMzYsNyBAQAogCQkJaWYgKGNsLT5jbF9wYXJlbnQgPT0gTlVMTCAmJiBwYXJlbnRpZCAhPSBUQ19IX1JPT1QpCiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KLQkJUFNDSEVEX0dFVF9USU1FKGN1cl90aW1lKTsKKwkJY3VyX3RpbWUgPSBwc2NoZWRfZ2V0X3RpbWUoKTsKIAogCQlzY2hfdHJlZV9sb2NrKHNjaCk7CiAJCWlmIChyc2MgIT0gTlVMTCkKQEAgLTExNDksMjIgKzExMjIsMTEgQEAKIH0KIAogc3RhdGljIHZvaWQKLWhmc2NfZGVzdHJveV9maWx0ZXJzKHN0cnVjdCB0Y2ZfcHJvdG8gKipmbCkKLXsKLQlzdHJ1Y3QgdGNmX3Byb3RvICp0cDsKLQotCXdoaWxlICgodHAgPSAqZmwpICE9IE5VTEwpIHsKLQkJKmZsID0gdHAtPm5leHQ7Ci0JCXRjZl9kZXN0cm95KHRwKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkCiBoZnNjX2Rlc3Ryb3lfY2xhc3Moc3RydWN0IFFkaXNjICpzY2gsIHN0cnVjdCBoZnNjX2NsYXNzICpjbCkKIHsKIAlzdHJ1Y3QgaGZzY19zY2hlZCAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKIAotCWhmc2NfZGVzdHJveV9maWx0ZXJzKCZjbC0+ZmlsdGVyX2xpc3QpOworCXRjZl9kZXN0cm95X2NoYWluKGNsLT5maWx0ZXJfbGlzdCk7CiAJcWRpc2NfZGVzdHJveShjbC0+cWRpc2MpOwogI2lmZGVmIENPTkZJR19ORVRfRVNUSU1BVE9SCiAJZ2VuX2tpbGxfZXN0aW1hdG9yKCZjbC0+YnN0YXRzLCAmY2wtPnJhdGVfZXN0KTsKQEAgLTEzODksNyArMTM1MSw3IEBACiAJCXN0cnVjdCB0Y21zZyAqdGNtKQogewogCXN0cnVjdCBoZnNjX2NsYXNzICpjbCA9IChzdHJ1Y3QgaGZzY19jbGFzcyAqKWFyZzsKLQl1bnNpZ25lZCBjaGFyICpiID0gc2tiLT50YWlsOworCXVuc2lnbmVkIGNoYXIgKmIgPSBza2JfdGFpbF9wb2ludGVyKHNrYik7CiAJc3RydWN0IHJ0YXR0ciAqcnRhID0gKHN0cnVjdCBydGF0dHIgKiliOwogCiAJdGNtLT50Y21fcGFyZW50ID0gY2wtPmNsX3BhcmVudCA/IGNsLT5jbF9wYXJlbnQtPmNsYXNzaWQgOiBUQ19IX1JPT1Q7CkBAIC0xNDAwLDExICsxMzYyLDExIEBACiAJUlRBX1BVVChza2IsIFRDQV9PUFRJT05TLCAwLCBOVUxMKTsKIAlpZiAoaGZzY19kdW1wX2N1cnZlcyhza2IsIGNsKSA8IDApCiAJCWdvdG8gcnRhdHRyX2ZhaWx1cmU7Ci0JcnRhLT5ydGFfbGVuID0gc2tiLT50YWlsIC0gYjsKKwlydGEtPnJ0YV9sZW4gPSBza2JfdGFpbF9wb2ludGVyKHNrYikgLSBiOwogCXJldHVybiBza2ItPmxlbjsKIAogIHJ0YXR0cl9mYWlsdXJlOgotCXNrYl90cmltKHNrYiwgYiAtIHNrYi0+ZGF0YSk7CisJbmxtc2dfdHJpbShza2IsIGIpOwogCXJldHVybiAtMTsKIH0KIApAQCAtMTQ1OSwyMSArMTQyMSwxMSBAQAogfQogCiBzdGF0aWMgdm9pZAotaGZzY193YXRjaGRvZyh1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlzdHJ1Y3QgUWRpc2MgKnNjaCA9IChzdHJ1Y3QgUWRpc2MgKilhcmc7Ci0KLQlzY2gtPmZsYWdzICY9IH5UQ1FfRl9USFJPVFRMRUQ7Ci0JbmV0aWZfc2NoZWR1bGUoc2NoLT5kZXYpOwotfQotCi1zdGF0aWMgdm9pZAotaGZzY19zY2hlZHVsZV93YXRjaGRvZyhzdHJ1Y3QgUWRpc2MgKnNjaCwgdTY0IGN1cl90aW1lKQoraGZzY19zY2hlZHVsZV93YXRjaGRvZyhzdHJ1Y3QgUWRpc2MgKnNjaCkKIHsKIAlzdHJ1Y3QgaGZzY19zY2hlZCAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKIAlzdHJ1Y3QgaGZzY19jbGFzcyAqY2w7CiAJdTY0IG5leHRfdGltZSA9IDA7Ci0JbG9uZyBkZWxheTsKIAogCWlmICgoY2wgPSBlbHRyZWVfZ2V0X21pbmVsKHEpKSAhPSBOVUxMKQogCQluZXh0X3RpbWUgPSBjbC0+Y2xfZTsKQEAgLTE0ODIsMTEgKzE0MzQsNyBAQAogCQkJbmV4dF90aW1lID0gcS0+cm9vdC5jbF9jZm1pbjsKIAl9CiAJV0FSTl9PTihuZXh0X3RpbWUgPT0gMCk7Ci0JZGVsYXkgPSBuZXh0X3RpbWUgLSBjdXJfdGltZTsKLQlkZWxheSA9IFBTQ0hFRF9VUzJKSUZGSUUoZGVsYXkpOwotCi0Jc2NoLT5mbGFncyB8PSBUQ1FfRl9USFJPVFRMRUQ7Ci0JbW9kX3RpbWVyKCZxLT53ZF90aW1lciwgamlmZmllcyArIGRlbGF5KTsKKwlxZGlzY193YXRjaGRvZ19zY2hlZHVsZSgmcS0+d2F0Y2hkb2csIG5leHRfdGltZSk7CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTE1MjMsOSArMTQ3MSw3IEBACiAKIAlsaXN0X2FkZCgmcS0+cm9vdC5obGlzdCwgJnEtPmNsaGFzaFtoZnNjX2hhc2gocS0+cm9vdC5jbGFzc2lkKV0pOwogCi0JaW5pdF90aW1lcigmcS0+d2RfdGltZXIpOwotCXEtPndkX3RpbWVyLmZ1bmN0aW9uID0gaGZzY193YXRjaGRvZzsKLQlxLT53ZF90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpc2NoOworCXFkaXNjX3dhdGNoZG9nX2luaXQoJnEtPndhdGNoZG9nLCBzY2gpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xNTk1LDggKzE1NDEsNyBAQAogCV9fc2tiX3F1ZXVlX3B1cmdlKCZxLT5yZXF1ZXVlKTsKIAlxLT5lbGlnaWJsZSA9IFJCX1JPT1Q7CiAJSU5JVF9MSVNUX0hFQUQoJnEtPmRyb3BsaXN0KTsKLQlkZWxfdGltZXIoJnEtPndkX3RpbWVyKTsKLQlzY2gtPmZsYWdzICY9IH5UQ1FfRl9USFJPVFRMRUQ7CisJcWRpc2Nfd2F0Y2hkb2dfY2FuY2VsKCZxLT53YXRjaGRvZyk7CiAJc2NoLT5xLnFsZW4gPSAwOwogfQogCkBAIC0xNjEyLDE0ICsxNTU3LDE0IEBACiAJCQloZnNjX2Rlc3Ryb3lfY2xhc3Moc2NoLCBjbCk7CiAJfQogCV9fc2tiX3F1ZXVlX3B1cmdlKCZxLT5yZXF1ZXVlKTsKLQlkZWxfdGltZXIoJnEtPndkX3RpbWVyKTsKKwlxZGlzY193YXRjaGRvZ19jYW5jZWwoJnEtPndhdGNoZG9nKTsKIH0KIAogc3RhdGljIGludAogaGZzY19kdW1wX3FkaXNjKHN0cnVjdCBRZGlzYyAqc2NoLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCBoZnNjX3NjaGVkICpxID0gcWRpc2NfcHJpdihzY2gpOwotCXVuc2lnbmVkIGNoYXIgKmIgPSBza2ItPnRhaWw7CisJdW5zaWduZWQgY2hhciAqYiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKTsKIAlzdHJ1Y3QgdGNfaGZzY19xb3B0IHFvcHQ7CiAKIAlxb3B0LmRlZmNscyA9IHEtPmRlZmNsczsKQEAgLTE2MjcsNyArMTU3Miw3IEBACiAJcmV0dXJuIHNrYi0+bGVuOwogCiAgcnRhdHRyX2ZhaWx1cmU6Ci0Jc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKKwlubG1zZ190cmltKHNrYiwgYik7CiAJcmV0dXJuIC0xOwogfQogCkBAIC0xNjgxLDcgKzE2MjYsNyBAQAogCWlmICgoc2tiID0gX19za2JfZGVxdWV1ZSgmcS0+cmVxdWV1ZSkpKQogCQlnb3RvIG91dDsKIAotCVBTQ0hFRF9HRVRfVElNRShjdXJfdGltZSk7CisJY3VyX3RpbWUgPSBwc2NoZWRfZ2V0X3RpbWUoKTsKIAogCS8qCiAJICogaWYgdGhlcmUgYXJlIGVsaWdpYmxlIGNsYXNzZXMsIHVzZSByZWFsLXRpbWUgY3JpdGVyaWEuCkBAIC0xNjk4LDcgKzE2NDMsNyBAQAogCQljbCA9IHZ0dHJlZV9nZXRfbWludnQoJnEtPnJvb3QsIGN1cl90aW1lKTsKIAkJaWYgKGNsID09IE5VTEwpIHsKIAkJCXNjaC0+cXN0YXRzLm92ZXJsaW1pdHMrKzsKLQkJCWhmc2Nfc2NoZWR1bGVfd2F0Y2hkb2coc2NoLCBjdXJfdGltZSk7CisJCQloZnNjX3NjaGVkdWxlX3dhdGNoZG9nKHNjaCk7CiAJCQlyZXR1cm4gTlVMTDsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9zY2hfaHRiLmMgYi9uZXQvc2NoZWQvc2NoX2h0Yi5jCmluZGV4IDNjMzI5NGQuLjk5YmNlYzggMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9zY2hfaHRiLmMKKysrIGIvbmV0L3NjaGVkL3NjaF9odGIuYwpAQCAtNTAsNiArNTAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorI2luY2x1ZGUgPG5ldC9uZXRsaW5rLmg+CiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KICNpbmNsdWRlIDxuZXQvcGt0X3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvcmJ0cmVlLmg+CkBAIC0xMjgsNyArMTI5LDcgQEAKIAl9IHVuOwogCXN0cnVjdCByYl9ub2RlIG5vZGVbVENfSFRCX05VTVBSSU9dOwkvKiBub2RlIGZvciBzZWxmIG9yIGZlZWQgdHJlZSAqLwogCXN0cnVjdCByYl9ub2RlIHBxX25vZGU7CS8qIG5vZGUgZm9yIGV2ZW50IHF1ZXVlICovCi0JdW5zaWduZWQgbG9uZyBwcV9rZXk7CS8qIHRoZSBzYW1lIHR5cGUgYXMgamlmZmllcyBnbG9iYWwgKi8KKwlwc2NoZWRfdGltZV90IHBxX2tleTsKIAogCWludCBwcmlvX2FjdGl2aXR5OwkvKiBmb3Igd2hpY2ggcHJpb3MgYXJlIHdlIGFjdGl2ZSAqLwogCWVudW0gaHRiX2Ntb2RlIGNtb2RlOwkvKiBjdXJyZW50IG1vZGUgb2YgdGhlIGNsYXNzICovCkBAIC0xNzksMTAgKzE4MCw3IEBACiAJc3RydWN0IHJiX3Jvb3Qgd2FpdF9wcVtUQ19IVEJfTUFYREVQVEhdOwogCiAJLyogdGltZSBvZiBuZWFyZXN0IGV2ZW50IHBlciBsZXZlbCAocm93KSAqLwotCXVuc2lnbmVkIGxvbmcgbmVhcl9ldl9jYWNoZVtUQ19IVEJfTUFYREVQVEhdOwotCi0JLyogY2FjaGVkIHZhbHVlIG9mIGppZmZpZXMgaW4gZGVxdWV1ZSAqLwotCXVuc2lnbmVkIGxvbmcgamlmZmllczsKKwlwc2NoZWRfdGltZV90IG5lYXJfZXZfY2FjaGVbVENfSFRCX01BWERFUFRIXTsKIAogCS8qIHdoZXRoZXIgd2UgaGl0IG5vbi13b3JrIGNvbnNlcnZpbmcgY2xhc3MgZHVyaW5nIHRoaXMgZGVxdWV1ZTsgd2UgdXNlICovCiAJaW50IG53Y19oaXQ7CQkvKiB0aGlzIHRvIGRpc2FibGUgbWluZGVsYXkgY29tcGxhaW50IGluIGRlcXVldWUgKi8KQEAgLTE5NSw3ICsxOTMsNyBAQAogCiAJaW50IHJhdGUycXVhbnR1bTsJLyogcXVhbnQgPSByYXRlIC8gcmF0ZTJxdWFudHVtICovCiAJcHNjaGVkX3RpbWVfdCBub3c7CS8qIGNhY2hlZCBkZXF1ZXVlIHRpbWUgKi8KLQlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsJLyogc2VuZCBkZWxheSB0aW1lciAqLworCXN0cnVjdCBxZGlzY193YXRjaGRvZyB3YXRjaGRvZzsKICNpZmRlZiBIVEJfUkFURUNNCiAJc3RydWN0IHRpbWVyX2xpc3QgcnR0aW07CS8qIHJhdGUgY29tcHV0ZXIgdGltZXIgKi8KIAlpbnQgcmVjbXBfYnVja2V0OwkvKiB3aGljaCBoYXNoIGJ1Y2tldCB0byByZWNvbXB1dGUgbmV4dCAqLwpAQCAtMzQyLDE5ICszNDAsMTkgQEAKIHsKIAlzdHJ1Y3QgcmJfbm9kZSAqKnAgPSAmcS0+d2FpdF9wcVtjbC0+bGV2ZWxdLnJiX25vZGUsICpwYXJlbnQgPSBOVUxMOwogCi0JY2wtPnBxX2tleSA9IHEtPmppZmZpZXMgKyBQU0NIRURfVVMySklGRklFKGRlbGF5KTsKLQlpZiAoY2wtPnBxX2tleSA9PSBxLT5qaWZmaWVzKQorCWNsLT5wcV9rZXkgPSBxLT5ub3cgKyBkZWxheTsKKwlpZiAoY2wtPnBxX2tleSA9PSBxLT5ub3cpCiAJCWNsLT5wcV9rZXkrKzsKIAogCS8qIHVwZGF0ZSB0aGUgbmVhcmVzdCBldmVudCBjYWNoZSAqLwotCWlmICh0aW1lX2FmdGVyKHEtPm5lYXJfZXZfY2FjaGVbY2wtPmxldmVsXSwgY2wtPnBxX2tleSkpCisJaWYgKHEtPm5lYXJfZXZfY2FjaGVbY2wtPmxldmVsXSA+IGNsLT5wcV9rZXkpCiAJCXEtPm5lYXJfZXZfY2FjaGVbY2wtPmxldmVsXSA9IGNsLT5wcV9rZXk7CiAKIAl3aGlsZSAoKnApIHsKIAkJc3RydWN0IGh0Yl9jbGFzcyAqYzsKIAkJcGFyZW50ID0gKnA7CiAJCWMgPSByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCBodGJfY2xhc3MsIHBxX25vZGUpOwotCQlpZiAodGltZV9hZnRlcl9lcShjbC0+cHFfa2V5LCBjLT5wcV9rZXkpKQorCQlpZiAoY2wtPnBxX2tleSA+PSBjLT5wcV9rZXkpCiAJCQlwID0gJnBhcmVudC0+cmJfcmlnaHQ7CiAJCWVsc2UKIAkJCXAgPSAmcGFyZW50LT5yYl9sZWZ0OwpAQCAtNjc5LDE0ICs2NzcsNiBAQAogCXJldHVybiBORVRfWE1JVF9TVUNDRVNTOwogfQogCi1zdGF0aWMgdm9pZCBodGJfdGltZXIodW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IFFkaXNjICpzY2ggPSAoc3RydWN0IFFkaXNjICopYXJnOwotCXNjaC0+ZmxhZ3MgJj0gflRDUV9GX1RIUk9UVExFRDsKLQl3bWIoKTsKLQluZXRpZl9zY2hlZHVsZShzY2gtPmRldik7Ci19Ci0KICNpZmRlZiBIVEJfUkFURUNNCiAjZGVmaW5lIFJUX0dFTihELFIpIFIrPUQtKFIvSFRCX0VXTUFDKTtEPTAKIHN0YXRpYyB2b2lkIGh0Yl9yYXRlX3RpbWVyKHVuc2lnbmVkIGxvbmcgYXJnKQpAQCAtNzM5LDcgKzcyOSw3IEBACiAJY2wtPlQgPSB0b2tzCiAKIAl3aGlsZSAoY2wpIHsKLQkJZGlmZiA9IFBTQ0hFRF9URElGRl9TQUZFKHEtPm5vdywgY2wtPnRfYywgKHUzMikgY2wtPm1idWZmZXIpOworCQlkaWZmID0gcHNjaGVkX3RkaWZmX2JvdW5kZWQocS0+bm93LCBjbC0+dF9jLCBjbC0+bWJ1ZmZlcik7CiAJCWlmIChjbC0+bGV2ZWwgPj0gbGV2ZWwpIHsKIAkJCWlmIChjbC0+bGV2ZWwgPT0gbGV2ZWwpCiAJCQkJY2wtPnhzdGF0cy5sZW5kcysrOwpAQCAtNzc4LDExICs3NjgsMTEgQEAKIC8qKgogICogaHRiX2RvX2V2ZW50cyAtIG1ha2UgbW9kZSBjaGFuZ2VzIHRvIGNsYXNzZXMgYXQgdGhlIGxldmVsCiAgKgotICogU2NhbnMgZXZlbnQgcXVldWUgZm9yIHBlbmRpbmcgZXZlbnRzIGFuZCBhcHBsaWVzIHRoZW0uIFJldHVybnMgamlmZmllcyB0bworICogU2NhbnMgZXZlbnQgcXVldWUgZm9yIHBlbmRpbmcgZXZlbnRzIGFuZCBhcHBsaWVzIHRoZW0uIFJldHVybnMgdGltZSBvZgogICogbmV4dCBwZW5kaW5nIGV2ZW50ICgwIGZvciBubyBldmVudCBpbiBwcSkuCi0gKiBOb3RlOiBBcGxpZWQgYXJlIGV2ZW50cyB3aG9zZSBoYXZlIGNsLT5wcV9rZXkgPD0gamlmZmllcy4KKyAqIE5vdGU6IEFwcGxpZWQgYXJlIGV2ZW50cyB3aG9zZSBoYXZlIGNsLT5wcV9rZXkgPD0gcS0+bm93LgogICovCi1zdGF0aWMgbG9uZyBodGJfZG9fZXZlbnRzKHN0cnVjdCBodGJfc2NoZWQgKnEsIGludCBsZXZlbCkKK3N0YXRpYyBwc2NoZWRfdGltZV90IGh0Yl9kb19ldmVudHMoc3RydWN0IGh0Yl9zY2hlZCAqcSwgaW50IGxldmVsKQogewogCWludCBpOwogCkBAIC03OTUsMTggKzc4NSwxOCBAQAogCQkJcmV0dXJuIDA7CiAKIAkJY2wgPSByYl9lbnRyeShwLCBzdHJ1Y3QgaHRiX2NsYXNzLCBwcV9ub2RlKTsKLQkJaWYgKHRpbWVfYWZ0ZXIoY2wtPnBxX2tleSwgcS0+amlmZmllcykpIHsKLQkJCXJldHVybiBjbC0+cHFfa2V5IC0gcS0+amlmZmllczsKLQkJfQorCQlpZiAoY2wtPnBxX2tleSA+IHEtPm5vdykKKwkJCXJldHVybiBjbC0+cHFfa2V5OworCiAJCWh0Yl9zYWZlX3JiX2VyYXNlKHAsIHEtPndhaXRfcHEgKyBsZXZlbCk7Ci0JCWRpZmYgPSBQU0NIRURfVERJRkZfU0FGRShxLT5ub3csIGNsLT50X2MsICh1MzIpIGNsLT5tYnVmZmVyKTsKKwkJZGlmZiA9IHBzY2hlZF90ZGlmZl9ib3VuZGVkKHEtPm5vdywgY2wtPnRfYywgY2wtPm1idWZmZXIpOwogCQlodGJfY2hhbmdlX2NsYXNzX21vZGUocSwgY2wsICZkaWZmKTsKIAkJaWYgKGNsLT5jbW9kZSAhPSBIVEJfQ0FOX1NFTkQpCiAJCQlodGJfYWRkX3RvX3dhaXRfdHJlZShxLCBjbCwgZGlmZik7CiAJfQogCWlmIChuZXRfcmF0ZWxpbWl0KCkpCiAJCXByaW50ayhLRVJOX1dBUk5JTkcgImh0YjogdG9vIG1hbnkgZXZlbnRzICFcbiIpOwotCXJldHVybiBIWiAvIDEwOworCXJldHVybiBxLT5ub3cgKyBQU0NIRURfVElDS1NfUEVSX1NFQyAvIDEwOwogfQogCiAvKiBSZXR1cm5zIGNsYXNzLT5ub2RlK3ByaW8gZnJvbSBpZC10cmVlIHdoZXJlIGNsYXNzZSdzIGlkIGlzID49IGlkLiBOVUxMCkBAIC05NTgsMzAgKzk0OCwxMiBAQAogCXJldHVybiBza2I7CiB9CiAKLXN0YXRpYyB2b2lkIGh0Yl9kZWxheV9ieShzdHJ1Y3QgUWRpc2MgKnNjaCwgbG9uZyBkZWxheSkKLXsKLQlzdHJ1Y3QgaHRiX3NjaGVkICpxID0gcWRpc2NfcHJpdihzY2gpOwotCWlmIChkZWxheSA8PSAwKQotCQlkZWxheSA9IDE7Ci0JaWYgKHVubGlrZWx5KGRlbGF5ID4gNSAqIEhaKSkgewotCQlpZiAobmV0X3JhdGVsaW1pdCgpKQotCQkJcHJpbnRrKEtFUk5fSU5GTyAiSFRCIGRlbGF5ICVsZCA+IDVzZWNcbiIsIGRlbGF5KTsKLQkJZGVsYXkgPSA1ICogSFo7Ci0JfQotCS8qIHdoeSBkb24ndCB1c2UgamlmZmllcyBoZXJlID8gYmVjYXVzZSBleHBpcmVzIGNhbiBiZSBpbiBwYXN0ICovCi0JbW9kX3RpbWVyKCZxLT50aW1lciwgcS0+amlmZmllcyArIGRlbGF5KTsKLQlzY2gtPmZsYWdzIHw9IFRDUV9GX1RIUk9UVExFRDsKLQlzY2gtPnFzdGF0cy5vdmVybGltaXRzKys7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqaHRiX2RlcXVldWUoc3RydWN0IFFkaXNjICpzY2gpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CiAJc3RydWN0IGh0Yl9zY2hlZCAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKIAlpbnQgbGV2ZWw7Ci0JbG9uZyBtaW5fZGVsYXk7Ci0KLQlxLT5qaWZmaWVzID0gamlmZmllczsKKwlwc2NoZWRfdGltZV90IG5leHRfZXZlbnQ7CiAKIAkvKiB0cnkgdG8gZGVxdWV1ZSBkaXJlY3QgcGFja2V0cyBhcyBoaWdoIHByaW8gKCEpIHRvIG1pbmltaXplIGNwdSB3b3JrICovCiAJc2tiID0gX19za2JfZGVxdWV1ZSgmcS0+ZGlyZWN0X3F1ZXVlKTsKQEAgLTk5MywyMyArOTY1LDI1IEBACiAKIAlpZiAoIXNjaC0+cS5xbGVuKQogCQlnb3RvIGZpbjsKLQlQU0NIRURfR0VUX1RJTUUocS0+bm93KTsKKwlxLT5ub3cgPSBwc2NoZWRfZ2V0X3RpbWUoKTsKIAotCW1pbl9kZWxheSA9IExPTkdfTUFYOworCW5leHRfZXZlbnQgPSBxLT5ub3cgKyA1ICogUFNDSEVEX1RJQ0tTX1BFUl9TRUM7CiAJcS0+bndjX2hpdCA9IDA7CiAJZm9yIChsZXZlbCA9IDA7IGxldmVsIDwgVENfSFRCX01BWERFUFRIOyBsZXZlbCsrKSB7CiAJCS8qIGNvbW1vbiBjYXNlIG9wdGltaXphdGlvbiAtIHNraXAgZXZlbnQgaGFuZGxlciBxdWlja2x5ICovCiAJCWludCBtOwotCQlsb25nIGRlbGF5OwotCQlpZiAodGltZV9hZnRlcl9lcShxLT5qaWZmaWVzLCBxLT5uZWFyX2V2X2NhY2hlW2xldmVsXSkpIHsKLQkJCWRlbGF5ID0gaHRiX2RvX2V2ZW50cyhxLCBsZXZlbCk7Ci0JCQlxLT5uZWFyX2V2X2NhY2hlW2xldmVsXSA9Ci0JCQkgICAgcS0+amlmZmllcyArIChkZWxheSA/IGRlbGF5IDogSFopOwotCQl9IGVsc2UKLQkJCWRlbGF5ID0gcS0+bmVhcl9ldl9jYWNoZVtsZXZlbF0gLSBxLT5qaWZmaWVzOworCQlwc2NoZWRfdGltZV90IGV2ZW50OwogCi0JCWlmIChkZWxheSAmJiBtaW5fZGVsYXkgPiBkZWxheSkKLQkJCW1pbl9kZWxheSA9IGRlbGF5OworCQlpZiAocS0+bm93ID49IHEtPm5lYXJfZXZfY2FjaGVbbGV2ZWxdKSB7CisJCQlldmVudCA9IGh0Yl9kb19ldmVudHMocSwgbGV2ZWwpOworCQkJcS0+bmVhcl9ldl9jYWNoZVtsZXZlbF0gPSBldmVudCA/IGV2ZW50IDoKKwkJCQkJCQkgIFBTQ0hFRF9USUNLU19QRVJfU0VDOworCQl9IGVsc2UKKwkJCWV2ZW50ID0gcS0+bmVhcl9ldl9jYWNoZVtsZXZlbF07CisKKwkJaWYgKGV2ZW50ICYmIG5leHRfZXZlbnQgPiBldmVudCkKKwkJCW5leHRfZXZlbnQgPSBldmVudDsKKwogCQltID0gfnEtPnJvd19tYXNrW2xldmVsXTsKIAkJd2hpbGUgKG0gIT0gKGludCkoLTEpKSB7CiAJCQlpbnQgcHJpbyA9IGZmeihtKTsKQEAgLTEwMjIsNyArOTk2LDggQEAKIAkJCX0KIAkJfQogCX0KLQlodGJfZGVsYXlfYnkoc2NoLCBtaW5fZGVsYXkgPiA1ICogSFogPyA1ICogSFogOiBtaW5fZGVsYXkpOworCXNjaC0+cXN0YXRzLm92ZXJsaW1pdHMrKzsKKwlxZGlzY193YXRjaGRvZ19zY2hlZHVsZSgmcS0+d2F0Y2hkb2csIG5leHRfZXZlbnQpOwogZmluOgogCXJldHVybiBza2I7CiB9CkBAIC0xMDc1LDggKzEwNTAsNyBAQAogCiAJCX0KIAl9Ci0Jc2NoLT5mbGFncyAmPSB+VENRX0ZfVEhST1RUTEVEOwotCWRlbF90aW1lcigmcS0+dGltZXIpOworCXFkaXNjX3dhdGNoZG9nX2NhbmNlbCgmcS0+d2F0Y2hkb2cpOwogCV9fc2tiX3F1ZXVlX3B1cmdlKCZxLT5kaXJlY3RfcXVldWUpOwogCXNjaC0+cS5xbGVuID0gMDsKIAltZW1zZXQocS0+cm93LCAwLCBzaXplb2YocS0+cm93KSk7CkBAIC0xMTEzLDE0ICsxMDg3LDEyIEBACiAJZm9yIChpID0gMDsgaSA8IFRDX0hUQl9OVU1QUklPOyBpKyspCiAJCUlOSVRfTElTVF9IRUFEKHEtPmRyb3BzICsgaSk7CiAKLQlpbml0X3RpbWVyKCZxLT50aW1lcik7CisJcWRpc2Nfd2F0Y2hkb2dfaW5pdCgmcS0+d2F0Y2hkb2csIHNjaCk7CiAJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmcS0+ZGlyZWN0X3F1ZXVlKTsKIAogCXEtPmRpcmVjdF9xbGVuID0gc2NoLT5kZXYtPnR4X3F1ZXVlX2xlbjsKIAlpZiAocS0+ZGlyZWN0X3FsZW4gPCAyKQkvKiBzb21lIGRldmljZXMgaGF2ZSB6ZXJvIHR4X3F1ZXVlX2xlbiAqLwogCQlxLT5kaXJlY3RfcWxlbiA9IDI7Ci0JcS0+dGltZXIuZnVuY3Rpb24gPSBodGJfdGltZXI7Ci0JcS0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKXNjaDsKIAogI2lmZGVmIEhUQl9SQVRFQ00KIAlpbml0X3RpbWVyKCZxLT5ydHRpbSk7CkBAIC0xMTM5LDcgKzExMTEsNyBAQAogc3RhdGljIGludCBodGJfZHVtcChzdHJ1Y3QgUWRpc2MgKnNjaCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgaHRiX3NjaGVkICpxID0gcWRpc2NfcHJpdihzY2gpOwotCXVuc2lnbmVkIGNoYXIgKmIgPSBza2ItPnRhaWw7CisJdW5zaWduZWQgY2hhciAqYiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKTsKIAlzdHJ1Y3QgcnRhdHRyICpydGE7CiAJc3RydWN0IHRjX2h0Yl9nbG9iIGdvcHQ7CiAJc3Bpbl9sb2NrX2JoKCZzY2gtPmRldi0+cXVldWVfbG9jayk7CkBAIC0xMTUyLDEyICsxMTI0LDEyIEBACiAJcnRhID0gKHN0cnVjdCBydGF0dHIgKiliOwogCVJUQV9QVVQoc2tiLCBUQ0FfT1BUSU9OUywgMCwgTlVMTCk7CiAJUlRBX1BVVChza2IsIFRDQV9IVEJfSU5JVCwgc2l6ZW9mKGdvcHQpLCAmZ29wdCk7Ci0JcnRhLT5ydGFfbGVuID0gc2tiLT50YWlsIC0gYjsKKwlydGEtPnJ0YV9sZW4gPSBza2JfdGFpbF9wb2ludGVyKHNrYikgLSBiOwogCXNwaW5fdW5sb2NrX2JoKCZzY2gtPmRldi0+cXVldWVfbG9jayk7CiAJcmV0dXJuIHNrYi0+bGVuOwogcnRhdHRyX2ZhaWx1cmU6CiAJc3Bpbl91bmxvY2tfYmgoJnNjaC0+ZGV2LT5xdWV1ZV9sb2NrKTsKLQlza2JfdHJpbShza2IsIHNrYi0+dGFpbCAtIHNrYi0+ZGF0YSk7CisJbmxtc2dfdHJpbShza2IsIHNrYl90YWlsX3BvaW50ZXIoc2tiKSk7CiAJcmV0dXJuIC0xOwogfQogCkBAIC0xMTY1LDcgKzExMzcsNyBAQAogCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdGNtc2cgKnRjbSkKIHsKIAlzdHJ1Y3QgaHRiX2NsYXNzICpjbCA9IChzdHJ1Y3QgaHRiX2NsYXNzICopYXJnOwotCXVuc2lnbmVkIGNoYXIgKmIgPSBza2ItPnRhaWw7CisJdW5zaWduZWQgY2hhciAqYiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKTsKIAlzdHJ1Y3QgcnRhdHRyICpydGE7CiAJc3RydWN0IHRjX2h0Yl9vcHQgb3B0OwogCkBAIC0xMTg4LDEyICsxMTYwLDEyIEBACiAJb3B0LnByaW8gPSBjbC0+dW4ubGVhZi5wcmlvOwogCW9wdC5sZXZlbCA9IGNsLT5sZXZlbDsKIAlSVEFfUFVUKHNrYiwgVENBX0hUQl9QQVJNUywgc2l6ZW9mKG9wdCksICZvcHQpOwotCXJ0YS0+cnRhX2xlbiA9IHNrYi0+dGFpbCAtIGI7CisJcnRhLT5ydGFfbGVuID0gc2tiX3RhaWxfcG9pbnRlcihza2IpIC0gYjsKIAlzcGluX3VubG9ja19iaCgmc2NoLT5kZXYtPnF1ZXVlX2xvY2spOwogCXJldHVybiBza2ItPmxlbjsKIHJ0YXR0cl9mYWlsdXJlOgogCXNwaW5fdW5sb2NrX2JoKCZzY2gtPmRldi0+cXVldWVfbG9jayk7Ci0Jc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKKwlubG1zZ190cmltKHNrYiwgYik7CiAJcmV0dXJuIC0xOwogfQogCkBAIC0xMjY0LDE2ICsxMjM2LDYgQEAKIAlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpY2w7CiB9CiAKLXN0YXRpYyB2b2lkIGh0Yl9kZXN0cm95X2ZpbHRlcnMoc3RydWN0IHRjZl9wcm90byAqKmZsKQotewotCXN0cnVjdCB0Y2ZfcHJvdG8gKnRwOwotCi0Jd2hpbGUgKCh0cCA9ICpmbCkgIT0gTlVMTCkgewotCQkqZmwgPSB0cC0+bmV4dDsKLQkJdGNmX2Rlc3Ryb3kodHApOwotCX0KLX0KLQogc3RhdGljIGlubGluZSBpbnQgaHRiX3BhcmVudF9sYXN0X2NoaWxkKHN0cnVjdCBodGJfY2xhc3MgKmNsKQogewogCWlmICghY2wtPnBhcmVudCkKQEAgLTEzMDIsNyArMTI2NCw3IEBACiAJcGFyZW50LT51bi5sZWFmLnByaW8gPSBwYXJlbnQtPnByaW87CiAJcGFyZW50LT50b2tlbnMgPSBwYXJlbnQtPmJ1ZmZlcjsKIAlwYXJlbnQtPmN0b2tlbnMgPSBwYXJlbnQtPmNidWZmZXI7Ci0JUFNDSEVEX0dFVF9USU1FKHBhcmVudC0+dF9jKTsKKwlwYXJlbnQtPnRfYyA9IHBzY2hlZF9nZXRfdGltZSgpOwogCXBhcmVudC0+Y21vZGUgPSBIVEJfQ0FOX1NFTkQ7CiB9CiAKQEAgLTEzMTcsNyArMTI3OSw3IEBACiAJcWRpc2NfcHV0X3J0YWIoY2wtPnJhdGUpOwogCXFkaXNjX3B1dF9ydGFiKGNsLT5jZWlsKTsKIAotCWh0Yl9kZXN0cm95X2ZpbHRlcnMoJmNsLT5maWx0ZXJfbGlzdCk7CisJdGNmX2Rlc3Ryb3lfY2hhaW4oY2wtPmZpbHRlcl9saXN0KTsKIAogCXdoaWxlICghbGlzdF9lbXB0eSgmY2wtPmNoaWxkcmVuKSkKIAkJaHRiX2Rlc3Ryb3lfY2xhc3Moc2NoLCBsaXN0X2VudHJ5KGNsLT5jaGlsZHJlbi5uZXh0LApAQCAtMTM0MSw3ICsxMzAzLDcgQEAKIHsKIAlzdHJ1Y3QgaHRiX3NjaGVkICpxID0gcWRpc2NfcHJpdihzY2gpOwogCi0JZGVsX3RpbWVyX3N5bmMoJnEtPnRpbWVyKTsKKwlxZGlzY193YXRjaGRvZ19jYW5jZWwoJnEtPndhdGNoZG9nKTsKICNpZmRlZiBIVEJfUkFURUNNCiAJZGVsX3RpbWVyX3N5bmMoJnEtPnJ0dGltKTsKICNlbmRpZgpAQCAtMTM0OSw3ICsxMzExLDcgQEAKIAkgICBhbmQgc3VycHJpc2luZ2x5IGl0IHdvcmtlZCBpbiAyLjQuIEJ1dCBpdCBtdXN0IHByZWNlZGUgaXQKIAkgICBiZWNhdXNlIGZpbHRlciBuZWVkIGl0cyB0YXJnZXQgY2xhc3MgYWxpdmUgdG8gYmUgYWJsZSB0byBjYWxsCiAJICAgdW5iaW5kX2ZpbHRlciBvbiBpdCAod2l0aG91dCBPb3BzKS4gKi8KLQlodGJfZGVzdHJveV9maWx0ZXJzKCZxLT5maWx0ZXJfbGlzdCk7CisJdGNmX2Rlc3Ryb3lfY2hhaW4ocS0+ZmlsdGVyX2xpc3QpOwogCiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZxLT5yb290KSkKIAkJaHRiX2Rlc3Ryb3lfY2xhc3Moc2NoLCBsaXN0X2VudHJ5KHEtPnJvb3QubmV4dCwKQEAgLTE0OTgsOCArMTQ2MCw4IEBACiAJCS8qIHNldCBjbGFzcyB0byBiZSBpbiBIVEJfQ0FOX1NFTkQgc3RhdGUgKi8KIAkJY2wtPnRva2VucyA9IGhvcHQtPmJ1ZmZlcjsKIAkJY2wtPmN0b2tlbnMgPSBob3B0LT5jYnVmZmVyOwotCQljbC0+bWJ1ZmZlciA9IFBTQ0hFRF9KSUZGSUUyVVMoSFogKiA2MCk7CS8qIDFtaW4gKi8KLQkJUFNDSEVEX0dFVF9USU1FKGNsLT50X2MpOworCQljbC0+bWJ1ZmZlciA9IDYwICogUFNDSEVEX1RJQ0tTX1BFUl9TRUM7CS8qIDFtaW4gKi8KKwkJY2wtPnRfYyA9IHBzY2hlZF9nZXRfdGltZSgpOwogCQljbC0+Y21vZGUgPSBIVEJfQ0FOX1NFTkQ7CiAKIAkJLyogYXR0YWNoIHRvIHRoZSBoYXNoIGxpc3QgYW5kIHBhcmVudCdzIGZhbWlseSAqLwpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL3NjaF9pbmdyZXNzLmMgYi9uZXQvc2NoZWQvc2NoX2luZ3Jlc3MuYwppbmRleCBjZmUwNzBlLi5mOGI5ZjFjIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvc2NoX2luZ3Jlc3MuYworKysgYi9uZXQvc2NoZWQvc2NoX2luZ3Jlc3MuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY2Lmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bmV0L25ldGxpbmsuaD4KICNpbmNsdWRlIDxuZXQvcGt0X3NjaGVkLmg+CiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CkBAIC0xNjksNyArMTcwLDcgQEAKIAkJCXNrYi0+dGNfaW5kZXggPSBUQ19IX01JTihyZXMuY2xhc3NpZCk7CiAJCQlyZXN1bHQgPSBUQ19BQ1RfT0s7CiAJCQlicmVhazsKLQl9OworCX0KIC8qIGJhY2t3YXJkIGNvbXBhdCAqLwogI2Vsc2UKICNpZmRlZglDT05GSUdfTkVUX0NMU19QT0xJQ0UKQEAgLTE4Niw3ICsxODcsNyBAQAogCQlzY2gtPmJzdGF0cy5ieXRlcyArPSBza2ItPmxlbjsKIAkJcmVzdWx0ID0gTkZfQUNDRVBUOwogCQlicmVhazsKLQl9OworCX0KIAogI2Vsc2UKIAlEMlBSSU5USygiT3ZlcnJpZGluZyByZXN1bHQgdG8gQUNDRVBUXG4iKTsKQEAgLTI0NywxNiArMjQ4LDExIEBACiAJCXNrYi0+ZGV2ID8gKCpwc2tiKS0+ZGV2LT5uYW1lIDogIihubyBkZXYpIiwKIAkJc2tiLT5sZW4pOwogCi0vKgotcmV2aXNpdCBsYXRlcjogVXNlIGEgcHJpdmF0ZSBzaW5jZSBsb2NrIGRldi0+cXVldWVfbG9jayBpcyBhbHNvCi11c2VkIG9uIHRoZSBlZ3Jlc3MgKG1pZ2h0IHNsb3cgdGhpbmdzIGZvciBhbiBpb3RhKQotKi8KLQogCWlmIChkZXYtPnFkaXNjX2luZ3Jlc3MpIHsKLQkJc3Bpbl9sb2NrKCZkZXYtPnF1ZXVlX2xvY2spOworCQlzcGluX2xvY2soJmRldi0+aW5ncmVzc19sb2NrKTsKIAkJaWYgKChxID0gZGV2LT5xZGlzY19pbmdyZXNzKSAhPSBOVUxMKQogCQkJZndyZXMgPSBxLT5lbnF1ZXVlKHNrYiwgcSk7Ci0JCXNwaW5fdW5sb2NrKCZkZXYtPnF1ZXVlX2xvY2spOworCQlzcGluX3VubG9jaygmZGV2LT5pbmdyZXNzX2xvY2spOwogCX0KIAogCXJldHVybiBmd3JlczsKQEAgLTM0NSwxNCArMzQxLDkgQEAKIHN0YXRpYyB2b2lkIGluZ3Jlc3NfZGVzdHJveShzdHJ1Y3QgUWRpc2MgKnNjaCkKIHsKIAlzdHJ1Y3QgaW5ncmVzc19xZGlzY19kYXRhICpwID0gUFJJVihzY2gpOwotCXN0cnVjdCB0Y2ZfcHJvdG8gKnRwOwogCiAJRFBSSU5USygiaW5ncmVzc19kZXN0cm95KHNjaCAlcCxbcWRpc2MgJXBdKVxuIiwgc2NoLCBwKTsKLQl3aGlsZSAocC0+ZmlsdGVyX2xpc3QpIHsKLQkJdHAgPSBwLT5maWx0ZXJfbGlzdDsKLQkJcC0+ZmlsdGVyX2xpc3QgPSB0cC0+bmV4dDsKLQkJdGNmX2Rlc3Ryb3kodHApOwotCX0KKwl0Y2ZfZGVzdHJveV9jaGFpbihwLT5maWx0ZXJfbGlzdCk7CiAjaWYgMAogLyogZm9yIGZ1dHVyZSB1c2UgKi8KIAlxZGlzY19kZXN0cm95KHAtPnEpOwpAQCAtMzYyLDE2ICszNTMsMTYgQEAKIAogc3RhdGljIGludCBpbmdyZXNzX2R1bXAoc3RydWN0IFFkaXNjICpzY2gsIHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JdW5zaWduZWQgY2hhciAqYiA9IHNrYi0+dGFpbDsKKwl1bnNpZ25lZCBjaGFyICpiID0gc2tiX3RhaWxfcG9pbnRlcihza2IpOwogCXN0cnVjdCBydGF0dHIgKnJ0YTsKIAogCXJ0YSA9IChzdHJ1Y3QgcnRhdHRyICopIGI7CiAJUlRBX1BVVChza2IsIFRDQV9PUFRJT05TLCAwLCBOVUxMKTsKLQlydGEtPnJ0YV9sZW4gPSBza2ItPnRhaWwgLSBiOworCXJ0YS0+cnRhX2xlbiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKSAtIGI7CiAJcmV0dXJuIHNrYi0+bGVuOwogCiBydGF0dHJfZmFpbHVyZToKLQlza2JfdHJpbShza2IsIGIgLSBza2ItPmRhdGEpOworCW5sbXNnX3RyaW0oc2tiLCBiKTsKIAlyZXR1cm4gLTE7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9zY2hfbmV0ZW0uYyBiL25ldC9zY2hlZC9zY2hfbmV0ZW0uYwppbmRleCAxY2NiZmI1Li41ZDlkOGJjIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvc2NoX25ldGVtLmMKKysrIGIvbmV0L3NjaGVkL3NjaF9uZXRlbS5jCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CiAKKyNpbmNsdWRlIDxuZXQvbmV0bGluay5oPgogI2luY2x1ZGUgPG5ldC9wa3Rfc2NoZWQuaD4KIAogI2RlZmluZSBWRVJTSU9OICIxLjIiCkBAIC01NCwyMSArNTUsMjIgQEAKIAogc3RydWN0IG5ldGVtX3NjaGVkX2RhdGEgewogCXN0cnVjdCBRZGlzYwkqcWRpc2M7Ci0Jc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CisJc3RydWN0IHFkaXNjX3dhdGNoZG9nIHdhdGNoZG9nOwogCi0JdTMyIGxhdGVuY3k7CisJcHNjaGVkX3RkaWZmX3QgbGF0ZW5jeTsKKwlwc2NoZWRfdGRpZmZfdCBqaXR0ZXI7CisKIAl1MzIgbG9zczsKIAl1MzIgbGltaXQ7CiAJdTMyIGNvdW50ZXI7CiAJdTMyIGdhcDsKLQl1MzIgaml0dGVyOwogCXUzMiBkdXBsaWNhdGU7CiAJdTMyIHJlb3JkZXI7CiAJdTMyIGNvcnJ1cHQ7CiAKIAlzdHJ1Y3QgY3JuZHN0YXRlIHsKLQkJdW5zaWduZWQgbG9uZyBsYXN0OwotCQl1bnNpZ25lZCBsb25nIHJobzsKKwkJdTMyIGxhc3Q7CisJCXUzMiByaG87CiAJfSBkZWxheV9jb3IsIGxvc3NfY29yLCBkdXBfY29yLCByZW9yZGVyX2NvciwgY29ycnVwdF9jb3I7CiAKIAlzdHJ1Y3QgZGlzdHRhYmxlIHsKQEAgLTk1LDEyICs5NywxMiBAQAogICogTmV4dCBudW1iZXIgZGVwZW5kcyBvbiBsYXN0IHZhbHVlLgogICogcmhvIGlzIHNjYWxlZCB0byBhdm9pZCBmbG9hdGluZyBwb2ludC4KICAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2V0X2NyYW5kb20oc3RydWN0IGNybmRzdGF0ZSAqc3RhdGUpCitzdGF0aWMgdTMyIGdldF9jcmFuZG9tKHN0cnVjdCBjcm5kc3RhdGUgKnN0YXRlKQogewogCXU2NCB2YWx1ZSwgcmhvOwogCXVuc2lnbmVkIGxvbmcgYW5zd2VyOwogCi0JaWYgKHN0YXRlLT5yaG8gPT0gMCkJLyogbm8gY29ycmVsbGF0aW9uICovCisJaWYgKHN0YXRlLT5yaG8gPT0gMCkJLyogbm8gY29ycmVsYXRpb24gKi8KIAkJcmV0dXJuIG5ldF9yYW5kb20oKTsKIAogCXZhbHVlID0gbmV0X3JhbmRvbSgpOwpAQCAtMTE0LDExICsxMTYsMTMgQEAKICAqIHN0ZCBkZXZpYXRpb24gc2lnbWEuICBVc2VzIHRhYmxlIGxvb2t1cCB0byBhcHByb3hpbWF0ZSB0aGUgZGVzaXJlZAogICogZGlzdHJpYnV0aW9uLCBhbmQgYSB1bmlmb3JtbHktZGlzdHJpYnV0ZWQgcHNldWRvLXJhbmRvbSBzb3VyY2UuCiAgKi8KLXN0YXRpYyBsb25nIHRhYmxlZGlzdCh1bnNpZ25lZCBsb25nIG11LCBsb25nIHNpZ21hLAotCQkgICAgICBzdHJ1Y3QgY3JuZHN0YXRlICpzdGF0ZSwgY29uc3Qgc3RydWN0IGRpc3R0YWJsZSAqZGlzdCkKK3N0YXRpYyBwc2NoZWRfdGRpZmZfdCB0YWJsZWRpc3QocHNjaGVkX3RkaWZmX3QgbXUsIHBzY2hlZF90ZGlmZl90IHNpZ21hLAorCQkJCXN0cnVjdCBjcm5kc3RhdGUgKnN0YXRlLAorCQkJCWNvbnN0IHN0cnVjdCBkaXN0dGFibGUgKmRpc3QpCiB7Ci0JbG9uZyB0LCB4OwotCXVuc2lnbmVkIGxvbmcgcm5kOworCXBzY2hlZF90ZGlmZl90IHg7CisJbG9uZyB0OworCXUzMiBybmQ7CiAKIAlpZiAoc2lnbWEgPT0gMCkKIAkJcmV0dXJuIG11OwpAQCAtMjEzLDggKzIxNyw4IEBACiAJCWRlbGF5ID0gdGFibGVkaXN0KHEtPmxhdGVuY3ksIHEtPmppdHRlciwKIAkJCQkgICZxLT5kZWxheV9jb3IsIHEtPmRlbGF5X2Rpc3QpOwogCi0JCVBTQ0hFRF9HRVRfVElNRShub3cpOwotCQlQU0NIRURfVEFERDIobm93LCBkZWxheSwgY2ItPnRpbWVfdG9fc2VuZCk7CisJCW5vdyA9IHBzY2hlZF9nZXRfdGltZSgpOworCQljYi0+dGltZV90b19zZW5kID0gbm93ICsgZGVsYXk7CiAJCSsrcS0+Y291bnRlcjsKIAkJcmV0ID0gcS0+cWRpc2MtPmVucXVldWUoc2tiLCBxLT5xZGlzYyk7CiAJfSBlbHNlIHsKQEAgLTIyMiw3ICsyMjYsNyBAQAogCQkgKiBEbyByZS1vcmRlcmluZyBieSBwdXR0aW5nIG9uZSBvdXQgb2YgTiBwYWNrZXRzIGF0IHRoZSBmcm9udAogCQkgKiBvZiB0aGUgcXVldWUuCiAJCSAqLwotCQlQU0NIRURfR0VUX1RJTUUoY2ItPnRpbWVfdG9fc2VuZCk7CisJCWNiLT50aW1lX3RvX3NlbmQgPSBwc2NoZWRfZ2V0X3RpbWUoKTsKIAkJcS0+Y291bnRlciA9IDA7CiAJCXJldCA9IHEtPnFkaXNjLT5vcHMtPnJlcXVldWUoc2tiLCBxLT5xZGlzYyk7CiAJfQpAQCAtMjY5LDU1ICsyNzMsNDMgQEAKIAlzdHJ1Y3QgbmV0ZW1fc2NoZWRfZGF0YSAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCisJc21wX21iKCk7CisJaWYgKHNjaC0+ZmxhZ3MgJiBUQ1FfRl9USFJPVFRMRUQpCisJCXJldHVybiBOVUxMOworCiAJc2tiID0gcS0+cWRpc2MtPmRlcXVldWUocS0+cWRpc2MpOwogCWlmIChza2IpIHsKIAkJY29uc3Qgc3RydWN0IG5ldGVtX3NrYl9jYiAqY2IKIAkJCT0gKGNvbnN0IHN0cnVjdCBuZXRlbV9za2JfY2IgKilza2ItPmNiOwotCQlwc2NoZWRfdGltZV90IG5vdzsKKwkJcHNjaGVkX3RpbWVfdCBub3cgPSBwc2NoZWRfZ2V0X3RpbWUoKTsKIAogCQkvKiBpZiBtb3JlIHRpbWUgcmVtYWluaW5nPyAqLwotCQlQU0NIRURfR0VUX1RJTUUobm93KTsKLQotCQlpZiAoUFNDSEVEX1RMRVNTKGNiLT50aW1lX3RvX3NlbmQsIG5vdykpIHsKKwkJaWYgKGNiLT50aW1lX3RvX3NlbmQgPD0gbm93KSB7CiAJCQlwcl9kZWJ1ZygibmV0ZW1fZGVxdWV1ZTogcmV0dXJuIHNrYj0lcFxuIiwgc2tiKTsKIAkJCXNjaC0+cS5xbGVuLS07Ci0JCQlzY2gtPmZsYWdzICY9IH5UQ1FfRl9USFJPVFRMRUQ7CiAJCQlyZXR1cm4gc2tiOwotCQl9IGVsc2UgewotCQkJcHNjaGVkX3RkaWZmX3QgZGVsYXkgPSBQU0NIRURfVERJRkYoY2ItPnRpbWVfdG9fc2VuZCwgbm93KTsKLQotCQkJaWYgKHEtPnFkaXNjLT5vcHMtPnJlcXVldWUoc2tiLCBxLT5xZGlzYykgIT0gTkVUX1hNSVRfU1VDQ0VTUykgewotCQkJCXFkaXNjX3RyZWVfZGVjcmVhc2VfcWxlbihxLT5xZGlzYywgMSk7Ci0JCQkJc2NoLT5xc3RhdHMuZHJvcHMrKzsKLQkJCQlwcmludGsoS0VSTl9FUlIgIm5ldGVtOiBxdWV1ZSBkaXNjcGxpbmUgJXMgY291bGQgbm90IHJlcXVldWVcbiIsCi0JCQkJICAgICAgIHEtPnFkaXNjLT5vcHMtPmlkKTsKLQkJCX0KLQotCQkJbW9kX3RpbWVyKCZxLT50aW1lciwgamlmZmllcyArIFBTQ0hFRF9VUzJKSUZGSUUoZGVsYXkpKTsKLQkJCXNjaC0+ZmxhZ3MgfD0gVENRX0ZfVEhST1RUTEVEOwogCQl9CisKKwkJaWYgKHVubGlrZWx5KHEtPnFkaXNjLT5vcHMtPnJlcXVldWUoc2tiLCBxLT5xZGlzYykgIT0gTkVUX1hNSVRfU1VDQ0VTUykpIHsKKwkJCXFkaXNjX3RyZWVfZGVjcmVhc2VfcWxlbihxLT5xZGlzYywgMSk7CisJCQlzY2gtPnFzdGF0cy5kcm9wcysrOworCQkJcHJpbnRrKEtFUk5fRVJSICJuZXRlbTogJXMgY291bGQgbm90IHJlcXVldWVcbiIsCisJCQkgICAgICAgcS0+cWRpc2MtPm9wcy0+aWQpOworCQl9CisKKwkJcWRpc2Nfd2F0Y2hkb2dfc2NoZWR1bGUoJnEtPndhdGNoZG9nLCBjYi0+dGltZV90b19zZW5kKTsKIAl9CiAKIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIHZvaWQgbmV0ZW1fd2F0Y2hkb2codW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IFFkaXNjICpzY2ggPSAoc3RydWN0IFFkaXNjICopYXJnOwotCi0JcHJfZGVidWcoIm5ldGVtX3dhdGNoZG9nIHFsZW49JWRcbiIsIHNjaC0+cS5xbGVuKTsKLQlzY2gtPmZsYWdzICY9IH5UQ1FfRl9USFJPVFRMRUQ7Ci0JbmV0aWZfc2NoZWR1bGUoc2NoLT5kZXYpOwotfQotCiBzdGF0aWMgdm9pZCBuZXRlbV9yZXNldChzdHJ1Y3QgUWRpc2MgKnNjaCkKIHsKIAlzdHJ1Y3QgbmV0ZW1fc2NoZWRfZGF0YSAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKIAogCXFkaXNjX3Jlc2V0KHEtPnFkaXNjKTsKIAlzY2gtPnEucWxlbiA9IDA7Ci0Jc2NoLT5mbGFncyAmPSB+VENRX0ZfVEhST1RUTEVEOwotCWRlbF90aW1lcl9zeW5jKCZxLT50aW1lcik7CisJcWRpc2Nfd2F0Y2hkb2dfY2FuY2VsKCZxLT53YXRjaGRvZyk7CiB9CiAKIC8qIFBhc3Mgc2l6ZSBjaGFuZ2UgbWVzc2FnZSBkb3duIHRvIGVtYmVkZGVkIEZJRk8gKi8KQEAgLTQzOCwxMCArNDMwLDExIEBACiAJcS0+bG9zcyA9IHFvcHQtPmxvc3M7CiAJcS0+ZHVwbGljYXRlID0gcW9wdC0+ZHVwbGljYXRlOwogCi0JLyogZm9yIGNvbXBhdGlhYmxpdHkgd2l0aCBlYXJsaWVyIHZlcnNpb25zLgotCSAqIGlmIGdhcCBpcyBzZXQsIG5lZWQgdG8gYXNzdW1lIDEwMCUgcHJvYmFibGl0eQorCS8qIGZvciBjb21wYXRpYmlsaXR5IHdpdGggZWFybGllciB2ZXJzaW9ucy4KKwkgKiBpZiBnYXAgaXMgc2V0LCBuZWVkIHRvIGFzc3VtZSAxMDAlIHByb2JhYmlsaXR5CiAJICovCi0JcS0+cmVvcmRlciA9IH4wOworCWlmIChxLT5nYXApCisJCXEtPnJlb3JkZXIgPSB+MDsKIAogCS8qIEhhbmRsZSBuZXN0ZWQgb3B0aW9ucyBhZnRlciBpbml0aWFsIHF1ZXVlIG9wdGlvbnMuCiAJICogU2hvdWxkIGhhdmUgcHV0IGFsbCBvcHRpb25zIGluIG5lc3RlZCBmb3JtYXQgYnV0IHRvbyBsYXRlIG5vdy4KQEAgLTQ4NywyMiArNDgwLDI4IEBACiAgKi8KIHN0cnVjdCBmaWZvX3NjaGVkX2RhdGEgewogCXUzMiBsaW1pdDsKKwlwc2NoZWRfdGltZV90IG9sZGVzdDsKIH07CiAKIHN0YXRpYyBpbnQgdGZpZm9fZW5xdWV1ZShzdHJ1Y3Qgc2tfYnVmZiAqbnNrYiwgc3RydWN0IFFkaXNjICpzY2gpCiB7CiAJc3RydWN0IGZpZm9fc2NoZWRfZGF0YSAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKIAlzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpsaXN0ID0gJnNjaC0+cTsKLQljb25zdCBzdHJ1Y3QgbmV0ZW1fc2tiX2NiICpuY2IKLQkJPSAoY29uc3Qgc3RydWN0IG5ldGVtX3NrYl9jYiAqKW5za2ItPmNiOworCXBzY2hlZF90aW1lX3QgdG5leHQgPSAoKHN0cnVjdCBuZXRlbV9za2JfY2IgKiluc2tiLT5jYiktPnRpbWVfdG9fc2VuZDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCiAJaWYgKGxpa2VseShza2JfcXVldWVfbGVuKGxpc3QpIDwgcS0+bGltaXQpKSB7CisJCS8qIE9wdGltaXplIGZvciBhZGQgYXQgdGFpbCAqLworCQlpZiAobGlrZWx5KHNrYl9xdWV1ZV9lbXB0eShsaXN0KSB8fCB0bmV4dCA+PSBxLT5vbGRlc3QpKSB7CisJCQlxLT5vbGRlc3QgPSB0bmV4dDsKKwkJCXJldHVybiBxZGlzY19lbnF1ZXVlX3RhaWwobnNrYiwgc2NoKTsKKwkJfQorCiAJCXNrYl9xdWV1ZV9yZXZlcnNlX3dhbGsobGlzdCwgc2tiKSB7CiAJCQljb25zdCBzdHJ1Y3QgbmV0ZW1fc2tiX2NiICpjYgogCQkJCT0gKGNvbnN0IHN0cnVjdCBuZXRlbV9za2JfY2IgKilza2ItPmNiOwogCi0JCQlpZiAoIVBTQ0hFRF9UTEVTUyhuY2ItPnRpbWVfdG9fc2VuZCwgY2ItPnRpbWVfdG9fc2VuZCkpCisJCQlpZiAodG5leHQgPj0gY2ItPnRpbWVfdG9fc2VuZCkKIAkJCQlicmVhazsKIAkJfQogCkBAIC01MTUsNyArNTE0LDcgQEAKIAkJcmV0dXJuIE5FVF9YTUlUX1NVQ0NFU1M7CiAJfQogCi0JcmV0dXJuIHFkaXNjX2Ryb3AobnNrYiwgc2NoKTsKKwlyZXR1cm4gcWRpc2NfcmVzaGFwZV9mYWlsKG5za2IsIHNjaCk7CiB9CiAKIHN0YXRpYyBpbnQgdGZpZm9faW5pdChzdHJ1Y3QgUWRpc2MgKnNjaCwgc3RydWN0IHJ0YXR0ciAqb3B0KQpAQCAtNTMxLDYgKzUzMCw3IEBACiAJfSBlbHNlCiAJCXEtPmxpbWl0ID0gbWF4X3QodTMyLCBzY2gtPmRldi0+dHhfcXVldWVfbGVuLCAxKTsKIAorCXEtPm9sZGVzdCA9IFBTQ0hFRF9QQVNUUEVSRkVDVDsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNTY3LDkgKzU2Nyw3IEBACiAJaWYgKCFvcHQpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaW5pdF90aW1lcigmcS0+dGltZXIpOwotCXEtPnRpbWVyLmZ1bmN0aW9uID0gbmV0ZW1fd2F0Y2hkb2c7Ci0JcS0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBzY2g7CisJcWRpc2Nfd2F0Y2hkb2dfaW5pdCgmcS0+d2F0Y2hkb2csIHNjaCk7CiAKIAlxLT5xZGlzYyA9IHFkaXNjX2NyZWF0ZV9kZmx0KHNjaC0+ZGV2LCAmdGZpZm9fcWRpc2Nfb3BzLAogCQkJCSAgICAgVENfSF9NQUtFKHNjaC0+aGFuZGxlLCAxKSk7CkBAIC01OTAsNyArNTg4LDcgQEAKIHsKIAlzdHJ1Y3QgbmV0ZW1fc2NoZWRfZGF0YSAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKIAotCWRlbF90aW1lcl9zeW5jKCZxLT50aW1lcik7CisJcWRpc2Nfd2F0Y2hkb2dfY2FuY2VsKCZxLT53YXRjaGRvZyk7CiAJcWRpc2NfZGVzdHJveShxLT5xZGlzYyk7CiAJa2ZyZWUocS0+ZGVsYXlfZGlzdCk7CiB9CkBAIC01OTgsNyArNTk2LDcgQEAKIHN0YXRpYyBpbnQgbmV0ZW1fZHVtcChzdHJ1Y3QgUWRpc2MgKnNjaCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAljb25zdCBzdHJ1Y3QgbmV0ZW1fc2NoZWRfZGF0YSAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKLQl1bnNpZ25lZCBjaGFyCSAqYiA9IHNrYi0+dGFpbDsKKwl1bnNpZ25lZCBjaGFyICpiID0gc2tiX3RhaWxfcG9pbnRlcihza2IpOwogCXN0cnVjdCBydGF0dHIgKnJ0YSA9IChzdHJ1Y3QgcnRhdHRyICopIGI7CiAJc3RydWN0IHRjX25ldGVtX3FvcHQgcW9wdDsKIAlzdHJ1Y3QgdGNfbmV0ZW1fY29yciBjb3I7CkBAIC02MjYsMTIgKzYyNCwxMiBAQAogCWNvcnJ1cHQuY29ycmVsYXRpb24gPSBxLT5jb3JydXB0X2Nvci5yaG87CiAJUlRBX1BVVChza2IsIFRDQV9ORVRFTV9DT1JSVVBULCBzaXplb2YoY29ycnVwdCksICZjb3JydXB0KTsKIAotCXJ0YS0+cnRhX2xlbiA9IHNrYi0+dGFpbCAtIGI7CisJcnRhLT5ydGFfbGVuID0gc2tiX3RhaWxfcG9pbnRlcihza2IpIC0gYjsKIAogCXJldHVybiBza2ItPmxlbjsKIAogcnRhdHRyX2ZhaWx1cmU6Ci0Jc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKKwlubG1zZ190cmltKHNrYiwgYik7CiAJcmV0dXJuIC0xOwogfQogCmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvc2NoX3ByaW8uYyBiL25ldC9zY2hlZC9zY2hfcHJpby5jCmluZGV4IGRlODg5ZjIuLjI2OWE2ZTEgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9zY2hfcHJpby5jCisrKyBiL25ldC9zY2hlZC9zY2hfcHJpby5jCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSA8bmV0L2lwLmg+CiAjaW5jbHVkZSA8bmV0L3JvdXRlLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bmV0L25ldGxpbmsuaD4KICNpbmNsdWRlIDxuZXQvc29jay5oPgogI2luY2x1ZGUgPG5ldC9wa3Rfc2NoZWQuaD4KIApAQCAtNjEsNyArNjIsNyBAQAogCQkJKnFlcnIgPSBORVRfWE1JVF9TVUNDRVNTOwogCQljYXNlIFRDX0FDVF9TSE9UOgogCQkJcmV0dXJuIE5VTEw7Ci0JCX07CisJCX0KIAogCQlpZiAoIXEtPmZpbHRlcl9saXN0ICkgewogI2Vsc2UKQEAgLTE4OCwxMyArMTg5LDggQEAKIHsKIAlpbnQgcHJpbzsKIAlzdHJ1Y3QgcHJpb19zY2hlZF9kYXRhICpxID0gcWRpc2NfcHJpdihzY2gpOwotCXN0cnVjdCB0Y2ZfcHJvdG8gKnRwOwogCi0Jd2hpbGUgKCh0cCA9IHEtPmZpbHRlcl9saXN0KSAhPSBOVUxMKSB7Ci0JCXEtPmZpbHRlcl9saXN0ID0gdHAtPm5leHQ7Ci0JCXRjZl9kZXN0cm95KHRwKTsKLQl9Ci0KKwl0Y2ZfZGVzdHJveV9jaGFpbihxLT5maWx0ZXJfbGlzdCk7CiAJZm9yIChwcmlvPTA7IHByaW88cS0+YmFuZHM7IHByaW8rKykKIAkJcWRpc2NfZGVzdHJveShxLT5xdWV1ZXNbcHJpb10pOwogfQpAQCAtMjcxLDcgKzI2Nyw3IEBACiBzdGF0aWMgaW50IHByaW9fZHVtcChzdHJ1Y3QgUWRpc2MgKnNjaCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgcHJpb19zY2hlZF9kYXRhICpxID0gcWRpc2NfcHJpdihzY2gpOwotCXVuc2lnbmVkIGNoYXIJICpiID0gc2tiLT50YWlsOworCXVuc2lnbmVkIGNoYXIgKmIgPSBza2JfdGFpbF9wb2ludGVyKHNrYik7CiAJc3RydWN0IHRjX3ByaW9fcW9wdCBvcHQ7CiAKIAlvcHQuYmFuZHMgPSBxLT5iYW5kczsKQEAgLTI4MCw3ICsyNzYsNyBAQAogCXJldHVybiBza2ItPmxlbjsKIAogcnRhdHRyX2ZhaWx1cmU6Ci0Jc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKKwlubG1zZ190cmltKHNrYiwgYik7CiAJcmV0dXJuIC0xOwogfQogCmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvc2NoX3NmcS5jIGIvbmV0L3NjaGVkL3NjaF9zZnEuYwppbmRleCA2NmYzMjA1Li45NmRmZGY3IDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvc2NoX3NmcS5jCisrKyBiL25ldC9zY2hlZC9zY2hfc2ZxLmMKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxuZXQvaXAuaD4KKyNpbmNsdWRlIDxuZXQvbmV0bGluay5oPgogI2luY2x1ZGUgPGxpbnV4L2lwdjYuaD4KICNpbmNsdWRlIDxuZXQvcm91dGUuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KQEAgLTEzNyw3ICsxMzgsNyBAQAogCXN3aXRjaCAoc2tiLT5wcm90b2NvbCkgewogCWNhc2UgX19jb25zdGFudF9odG9ucyhFVEhfUF9JUCk6CiAJewotCQlzdHJ1Y3QgaXBoZHIgKmlwaCA9IHNrYi0+bmguaXBoOworCQljb25zdCBzdHJ1Y3QgaXBoZHIgKmlwaCA9IGlwX2hkcihza2IpOwogCQloID0gaXBoLT5kYWRkcjsKIAkJaDIgPSBpcGgtPnNhZGRyXmlwaC0+cHJvdG9jb2w7CiAJCWlmICghKGlwaC0+ZnJhZ19vZmYmaHRvbnMoSVBfTUZ8SVBfT0ZGU0VUKSkgJiYKQEAgLTE1Miw3ICsxNTMsNyBAQAogCX0KIAljYXNlIF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfSVBWNik6CiAJewotCQlzdHJ1Y3QgaXB2NmhkciAqaXBoID0gc2tiLT5uaC5pcHY2aDsKKwkJc3RydWN0IGlwdjZoZHIgKmlwaCA9IGlwdjZfaGRyKHNrYik7CiAJCWggPSBpcGgtPmRhZGRyLnM2X2FkZHIzMlszXTsKIAkJaDIgPSBpcGgtPnNhZGRyLnM2X2FkZHIzMlszXV5pcGgtPm5leHRoZHI7CiAJCWlmIChpcGgtPm5leHRoZHIgPT0gSVBQUk9UT19UQ1AgfHwKQEAgLTQ2MSw3ICs0NjIsNyBAQAogc3RhdGljIGludCBzZnFfZHVtcChzdHJ1Y3QgUWRpc2MgKnNjaCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3Qgc2ZxX3NjaGVkX2RhdGEgKnEgPSBxZGlzY19wcml2KHNjaCk7Ci0JdW5zaWduZWQgY2hhcgkgKmIgPSBza2ItPnRhaWw7CisJdW5zaWduZWQgY2hhciAqYiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKTsKIAlzdHJ1Y3QgdGNfc2ZxX3FvcHQgb3B0OwogCiAJb3B0LnF1YW50dW0gPSBxLT5xdWFudHVtOwpAQCAtNDc2LDcgKzQ3Nyw3IEBACiAJcmV0dXJuIHNrYi0+bGVuOwogCiBydGF0dHJfZmFpbHVyZToKLQlza2JfdHJpbShza2IsIGIgLSBza2ItPmRhdGEpOworCW5sbXNnX3RyaW0oc2tiLCBiKTsKIAlyZXR1cm4gLTE7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9zY2hfdGJmLmMgYi9uZXQvc2NoZWQvc2NoX3RiZi5jCmluZGV4IDg1ZGE4ZGEuLjUzODYyOTUgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9zY2hfdGJmLmMKKysrIGIvbmV0L3NjaGVkL3NjaF90YmYuYwpAQCAtMzIsNiArMzIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KICNpbmNsdWRlIDxuZXQvaXAuaD4KKyNpbmNsdWRlIDxuZXQvbmV0bGluay5oPgogI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPG5ldC9zb2NrLmg+CkBAIC0xMjcsOCArMTI4LDggQEAKIAlsb25nCXRva2VuczsJCQkvKiBDdXJyZW50IG51bWJlciBvZiBCIHRva2VucyAqLwogCWxvbmcJcHRva2VuczsJCS8qIEN1cnJlbnQgbnVtYmVyIG9mIFAgdG9rZW5zICovCiAJcHNjaGVkX3RpbWVfdAl0X2M7CQkvKiBUaW1lIGNoZWNrLXBvaW50ICovCi0Jc3RydWN0IHRpbWVyX2xpc3Qgd2RfdGltZXI7CS8qIFdhdGNoZG9nIHRpbWVyICovCiAJc3RydWN0IFFkaXNjCSpxZGlzYzsJCS8qIElubmVyIHFkaXNjLCBkZWZhdWx0IC0gYmZpZm8gcXVldWUgKi8KKwlzdHJ1Y3QgcWRpc2Nfd2F0Y2hkb2cgd2F0Y2hkb2c7CS8qIFdhdGNoZG9nIHRpbWVyICovCiB9OwogCiAjZGVmaW5lIEwyVChxLEwpICAgKChxKS0+Ul90YWItPmRhdGFbKEwpPj4ocSktPlJfdGFiLT5yYXRlLmNlbGxfbG9nXSkKQEAgLTE4NSwxNCArMTg2LDYgQEAKIAlyZXR1cm4gbGVuOwogfQogCi1zdGF0aWMgdm9pZCB0YmZfd2F0Y2hkb2codW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IFFkaXNjICpzY2ggPSAoc3RydWN0IFFkaXNjKilhcmc7Ci0KLQlzY2gtPmZsYWdzICY9IH5UQ1FfRl9USFJPVFRMRUQ7Ci0JbmV0aWZfc2NoZWR1bGUoc2NoLT5kZXYpOwotfQotCiBzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKnRiZl9kZXF1ZXVlKHN0cnVjdCBRZGlzYyogc2NoKQogewogCXN0cnVjdCB0YmZfc2NoZWRfZGF0YSAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKQEAgLTIwMiwxMyArMTk1LDEyIEBACiAKIAlpZiAoc2tiKSB7CiAJCXBzY2hlZF90aW1lX3Qgbm93OwotCQlsb25nIHRva3MsIGRlbGF5OworCQlsb25nIHRva3M7CiAJCWxvbmcgcHRva3MgPSAwOwogCQl1bnNpZ25lZCBpbnQgbGVuID0gc2tiLT5sZW47CiAKLQkJUFNDSEVEX0dFVF9USU1FKG5vdyk7Ci0KLQkJdG9rcyA9IFBTQ0hFRF9URElGRl9TQUZFKG5vdywgcS0+dF9jLCBxLT5idWZmZXIpOworCQlub3cgPSBwc2NoZWRfZ2V0X3RpbWUoKTsKKwkJdG9rcyA9IHBzY2hlZF90ZGlmZl9ib3VuZGVkKG5vdywgcS0+dF9jLCBxLT5idWZmZXIpOwogCiAJCWlmIChxLT5QX3RhYikgewogCQkJcHRva3MgPSB0b2tzICsgcS0+cHRva2VuczsKQEAgLTIzMCwxMiArMjIyLDggQEAKIAkJCXJldHVybiBza2I7CiAJCX0KIAotCQlkZWxheSA9IFBTQ0hFRF9VUzJKSUZGSUUobWF4X3QobG9uZywgLXRva3MsIC1wdG9rcykpOwotCi0JCWlmIChkZWxheSA9PSAwKQotCQkJZGVsYXkgPSAxOwotCi0JCW1vZF90aW1lcigmcS0+d2RfdGltZXIsIGppZmZpZXMrZGVsYXkpOworCQlxZGlzY193YXRjaGRvZ19zY2hlZHVsZSgmcS0+d2F0Y2hkb2csCisJCQkJCW5vdyArIG1heF90KGxvbmcsIC10b2tzLCAtcHRva3MpKTsKIAogCQkvKiBNYXliZSB3ZSBoYXZlIGEgc2hvcnRlciBwYWNrZXQgaW4gdGhlIHF1ZXVlLAogCQkgICB3aGljaCBjYW4gYmUgc2VudCBub3cuIEl0IHNvdW5kcyBjb29sLApAQCAtMjU0LDcgKzI0Miw2IEBACiAJCQlzY2gtPnFzdGF0cy5kcm9wcysrOwogCQl9CiAKLQkJc2NoLT5mbGFncyB8PSBUQ1FfRl9USFJPVFRMRUQ7CiAJCXNjaC0+cXN0YXRzLm92ZXJsaW1pdHMrKzsKIAl9CiAJcmV0dXJuIE5VTEw7CkBAIC0yNjYsMTEgKzI1MywxMCBAQAogCiAJcWRpc2NfcmVzZXQocS0+cWRpc2MpOwogCXNjaC0+cS5xbGVuID0gMDsKLQlQU0NIRURfR0VUX1RJTUUocS0+dF9jKTsKKwlxLT50X2MgPSBwc2NoZWRfZ2V0X3RpbWUoKTsKIAlxLT50b2tlbnMgPSBxLT5idWZmZXI7CiAJcS0+cHRva2VucyA9IHEtPm10dTsKLQlzY2gtPmZsYWdzICY9IH5UQ1FfRl9USFJPVFRMRUQ7Ci0JZGVsX3RpbWVyKCZxLT53ZF90aW1lcik7CisJcWRpc2Nfd2F0Y2hkb2dfY2FuY2VsKCZxLT53YXRjaGRvZyk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgUWRpc2MgKnRiZl9jcmVhdGVfZGZsdF9xZGlzYyhzdHJ1Y3QgUWRpc2MgKnNjaCwgdTMyIGxpbWl0KQpAQCAtMzc3LDExICszNjMsOCBAQAogCWlmIChvcHQgPT0gTlVMTCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlQU0NIRURfR0VUX1RJTUUocS0+dF9jKTsKLQlpbml0X3RpbWVyKCZxLT53ZF90aW1lcik7Ci0JcS0+d2RfdGltZXIuZnVuY3Rpb24gPSB0YmZfd2F0Y2hkb2c7Ci0JcS0+d2RfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKXNjaDsKLQorCXEtPnRfYyA9IHBzY2hlZF9nZXRfdGltZSgpOworCXFkaXNjX3dhdGNoZG9nX2luaXQoJnEtPndhdGNoZG9nLCBzY2gpOwogCXEtPnFkaXNjID0gJm5vb3BfcWRpc2M7CiAKIAlyZXR1cm4gdGJmX2NoYW5nZShzY2gsIG9wdCk7CkBAIC0zOTEsNyArMzc0LDcgQEAKIHsKIAlzdHJ1Y3QgdGJmX3NjaGVkX2RhdGEgKnEgPSBxZGlzY19wcml2KHNjaCk7CiAKLQlkZWxfdGltZXIoJnEtPndkX3RpbWVyKTsKKwlxZGlzY193YXRjaGRvZ19jYW5jZWwoJnEtPndhdGNoZG9nKTsKIAogCWlmIChxLT5QX3RhYikKIAkJcWRpc2NfcHV0X3J0YWIocS0+UF90YWIpOwpAQCAtNDA0LDcgKzM4Nyw3IEBACiBzdGF0aWMgaW50IHRiZl9kdW1wKHN0cnVjdCBRZGlzYyAqc2NoLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCB0YmZfc2NoZWRfZGF0YSAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKLQl1bnNpZ25lZCBjaGFyCSAqYiA9IHNrYi0+dGFpbDsKKwl1bnNpZ25lZCBjaGFyICpiID0gc2tiX3RhaWxfcG9pbnRlcihza2IpOwogCXN0cnVjdCBydGF0dHIgKnJ0YTsKIAlzdHJ1Y3QgdGNfdGJmX3FvcHQgb3B0OwogCkBAIC00MjAsMTIgKzQwMywxMiBAQAogCW9wdC5tdHUgPSBxLT5tdHU7CiAJb3B0LmJ1ZmZlciA9IHEtPmJ1ZmZlcjsKIAlSVEFfUFVUKHNrYiwgVENBX1RCRl9QQVJNUywgc2l6ZW9mKG9wdCksICZvcHQpOwotCXJ0YS0+cnRhX2xlbiA9IHNrYi0+dGFpbCAtIGI7CisJcnRhLT5ydGFfbGVuID0gc2tiX3RhaWxfcG9pbnRlcihza2IpIC0gYjsKIAogCXJldHVybiBza2ItPmxlbjsKIAogcnRhdHRyX2ZhaWx1cmU6Ci0Jc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKKwlubG1zZ190cmltKHNrYiwgYik7CiAJcmV0dXJuIC0xOwogfQogCmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvc2NoX3RlcWwuYyBiL25ldC9zY2hlZC9zY2hfdGVxbC5jCmluZGV4IDU4NzEyM2MuLmQyNDkxNGQgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9zY2hfdGVxbC5jCisrKyBiL25ldC9zY2hlZC9zY2hfdGVxbC5jCkBAIC0zMjMsNyArMzIzLDcgQEAKIAkJCW5vcmVzID0gMTsKIAkJCWJyZWFrOwogCQl9Ci0JCV9fc2tiX3B1bGwoc2tiLCBza2ItPm5oLnJhdyAtIHNrYi0+ZGF0YSk7CisJCV9fc2tiX3B1bGwoc2tiLCBza2JfbmV0d29ya19vZmZzZXQoc2tiKSk7CiAJfSB3aGlsZSAoKHEgPSBORVhUX1NMQVZFKHEpKSAhPSBzdGFydCk7CiAKIAlpZiAobm9yZXMgJiYgc2tiX3JlcyA9PSBOVUxMKSB7CmRpZmYgLS1naXQgYS9uZXQvc2N0cC9hc3NvY2lvbGEuYyBiL25ldC9zY3RwL2Fzc29jaW9sYS5jCmluZGV4IDc4ZDJkZGIuLmRiNzNlZjkgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL2Fzc29jaW9sYS5jCisrKyBiL25ldC9zY3RwL2Fzc29jaW9sYS5jCkBAIC0xNDMsNyArMTQzLDcgQEAKIAkvKiBJbml0aWFsaXplIHRoZSBtYXhpbXVtIG11bWJlciBvZiBuZXcgZGF0YSBwYWNrZXRzIHRoYXQgY2FuIGJlIHNlbnQKIAkgKiBpbiBhIGJ1cnN0LgogCSAqLwotCWFzb2MtPm1heF9idXJzdCA9IHNjdHBfbWF4X2J1cnN0OworCWFzb2MtPm1heF9idXJzdCA9IHNwLT5tYXhfYnVyc3Q7CiAKIAkvKiBpbml0aWFsaXplIGFzc29jaWF0aW9uIHRpbWVycyAqLwogCWFzb2MtPnRpbWVvdXRzW1NDVFBfRVZFTlRfVElNRU9VVF9OT05FXSA9IDA7CkBAIC03MTQsOCArNzE0LDE2IEBACiAJLyogUmVjb3JkIHRoZSB0cmFuc2l0aW9uIG9uIHRoZSB0cmFuc3BvcnQuICAqLwogCXN3aXRjaCAoY29tbWFuZCkgewogCWNhc2UgU0NUUF9UUkFOU1BPUlRfVVA6CisJCS8qIElmIHdlIGFyZSBtb3ZpbmcgZnJvbSBVTkNPTkZJUk1FRCBzdGF0ZSBkdWUKKwkJICogdG8gaGVhcnRiZWF0IHN1Y2Nlc3MsIHJlcG9ydCB0aGUgU0NUUF9BRERSX0NPTkZJUk1FRAorCQkgKiBzdGF0ZSB0byB0aGUgdXNlciwgb3RoZXJ3aXNlIHJlcG9ydCBTQ1RQX0FERFJfQVZBSUxBQkxFLgorCQkgKi8KKwkJaWYgKFNDVFBfVU5DT05GSVJNRUQgPT0gdHJhbnNwb3J0LT5zdGF0ZSAmJgorCQkgICAgU0NUUF9IRUFSVEJFQVRfU1VDQ0VTUyA9PSBlcnJvcikKKwkJCXNwY19zdGF0ZSA9IFNDVFBfQUREUl9DT05GSVJNRUQ7CisJCWVsc2UKKwkJCXNwY19zdGF0ZSA9IFNDVFBfQUREUl9BVkFJTEFCTEU7CiAJCXRyYW5zcG9ydC0+c3RhdGUgPSBTQ1RQX0FDVElWRTsKLQkJc3BjX3N0YXRlID0gU0NUUF9BRERSX0FWQUlMQUJMRTsKIAkJYnJlYWs7CiAKIAljYXNlIFNDVFBfVFJBTlNQT1JUX0RPV046CkBAIC03MjUsNyArNzMzLDcgQEAKIAogCWRlZmF1bHQ6CiAJCXJldHVybjsKLQl9OworCX0KIAogCS8qIEdlbmVyYXRlIGFuZCBzZW5kIGEgU0NUUF9QRUVSX0FERFJfQ0hBTkdFIG5vdGlmaWNhdGlvbiB0byB0aGUKIAkgKiB1c2VyLgpkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvZGVidWcuYyBiL25ldC9zY3RwL2RlYnVnLmMKaW5kZXggNWY1YWIyOC4uZThjMGY3NCAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvZGVidWcuYworKysgYi9uZXQvc2N0cC9kZWJ1Zy5jCkBAIC05Myw4ICs5Myw5IEBACiAJCXJldHVybiAiRldEX1RTTiI7CiAKIAlkZWZhdWx0OgotCQlyZXR1cm4gInVua25vd24gY2h1bmsiOwotCX07CisJCWJyZWFrOworCX0KKwogCXJldHVybiAidW5rbm93biBjaHVuayI7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9zY3RwL2lucHV0LmMgYi9uZXQvc2N0cC9pbnB1dC5jCmluZGV4IDcxZGI2NjguLjg4NTEwOWYgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL2lucHV0LmMKKysrIGIvbmV0L3NjdHAvaW5wdXQuYwpAQCAtNzksMTQgKzc5LDEwIEBACiAvKiBDYWxjdWxhdGUgdGhlIFNDVFAgY2hlY2tzdW0gb2YgYW4gU0NUUCBwYWNrZXQuICAqLwogc3RhdGljIGlubGluZSBpbnQgc2N0cF9yY3ZfY2hlY2tzdW0oc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlzdHJ1Y3Qgc2N0cGhkciAqc2g7Ci0JX191MzIgY21wLCB2YWw7CiAJc3RydWN0IHNrX2J1ZmYgKmxpc3QgPSBza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdDsKLQotCXNoID0gKHN0cnVjdCBzY3RwaGRyICopIHNrYi0+aC5yYXc7Ci0JY21wID0gbnRvaGwoc2gtPmNoZWNrc3VtKTsKLQotCXZhbCA9IHNjdHBfc3RhcnRfY2tzdW0oKF9fdTggKilzaCwgc2tiX2hlYWRsZW4oc2tiKSk7CisJc3RydWN0IHNjdHBoZHIgKnNoID0gc2N0cF9oZHIoc2tiKTsKKwlfX3UzMiBjbXAgPSBudG9obChzaC0+Y2hlY2tzdW0pOworCV9fdTMyIHZhbCA9IHNjdHBfc3RhcnRfY2tzdW0oKF9fdTggKilzaCwgc2tiX2hlYWRsZW4oc2tiKSk7CiAKIAlmb3IgKDsgbGlzdDsgbGlzdCA9IGxpc3QtPm5leHQpCiAJCXZhbCA9IHNjdHBfdXBkYXRlX2Nrc3VtKChfX3U4ICopbGlzdC0+ZGF0YSwgc2tiX2hlYWRsZW4obGlzdCksCkBAIC0xMzgsMTQgKzEzNCwxMyBAQAogCWlmIChza2JfbGluZWFyaXplKHNrYikpCiAJCWdvdG8gZGlzY2FyZF9pdDsKIAotCXNoID0gKHN0cnVjdCBzY3RwaGRyICopIHNrYi0+aC5yYXc7CisJc2ggPSBzY3RwX2hkcihza2IpOwogCiAJLyogUHVsbCB1cCB0aGUgSVAgYW5kIFNDVFAgaGVhZGVycy4gKi8KLQlfX3NrYl9wdWxsKHNrYiwgc2tiLT5oLnJhdyAtIHNrYi0+ZGF0YSk7CisJX19za2JfcHVsbChza2IsIHNrYl90cmFuc3BvcnRfb2Zmc2V0KHNrYikpOwogCWlmIChza2ItPmxlbiA8IHNpemVvZihzdHJ1Y3Qgc2N0cGhkcikpCiAJCWdvdG8gZGlzY2FyZF9pdDsKLQlpZiAoKHNrYi0+aXBfc3VtbWVkICE9IENIRUNLU1VNX1VOTkVDRVNTQVJZKSAmJgotCSAgICAoc2N0cF9yY3ZfY2hlY2tzdW0oc2tiKSA8IDApKQorCWlmICghc2tiX2NzdW1fdW5uZWNlc3Nhcnkoc2tiKSAmJiBzY3RwX3Jjdl9jaGVja3N1bShza2IpIDwgMCkKIAkJZ290byBkaXNjYXJkX2l0OwogCiAJc2tiX3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IHNjdHBoZHIpKTsKQEAgLTE1NCw3ICsxNDksNyBAQAogCWlmIChza2ItPmxlbiA8IHNpemVvZihzdHJ1Y3Qgc2N0cF9jaHVua2hkcikpCiAJCWdvdG8gZGlzY2FyZF9pdDsKIAotCWZhbWlseSA9IGlwdmVyMmFmKHNrYi0+bmguaXBoLT52ZXJzaW9uKTsKKwlmYW1pbHkgPSBpcHZlcjJhZihpcF9oZHIoc2tiKS0+dmVyc2lvbik7CiAJYWYgPSBzY3RwX2dldF9hZl9zcGVjaWZpYyhmYW1pbHkpOwogCWlmICh1bmxpa2VseSghYWYpKQogCQlnb3RvIGRpc2NhcmRfaXQ7CkBAIC01MTAsMzAgKzUwNSwzMCBAQAogdm9pZCBzY3RwX3Y0X2VycihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBfX3UzMiBpbmZvKQogewogCXN0cnVjdCBpcGhkciAqaXBoID0gKHN0cnVjdCBpcGhkciAqKXNrYi0+ZGF0YTsKLQlzdHJ1Y3Qgc2N0cGhkciAqc2ggPSAoc3RydWN0IHNjdHBoZHIgKikoc2tiLT5kYXRhICsgKGlwaC0+aWhsIDw8MikpOwotCWludCB0eXBlID0gc2tiLT5oLmljbXBoLT50eXBlOwotCWludCBjb2RlID0gc2tiLT5oLmljbXBoLT5jb2RlOworCWNvbnN0IGludCBpaGxlbiA9IGlwaC0+aWhsICogNDsKKwljb25zdCBpbnQgdHlwZSA9IGljbXBfaGRyKHNrYiktPnR5cGU7CisJY29uc3QgaW50IGNvZGUgPSBpY21wX2hkcihza2IpLT5jb2RlOwogCXN0cnVjdCBzb2NrICpzazsKIAlzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYyA9IE5VTEw7CiAJc3RydWN0IHNjdHBfdHJhbnNwb3J0ICp0cmFuc3BvcnQ7CiAJc3RydWN0IGluZXRfc29jayAqaW5ldDsKLQljaGFyICpzYXZlaXAsICpzYXZlc2N0cDsKKwlza19idWZmX2RhdGFfdCBzYXZlaXAsIHNhdmVzY3RwOwogCWludCBlcnI7CiAKLQlpZiAoc2tiLT5sZW4gPCAoKGlwaC0+aWhsIDw8IDIpICsgOCkpIHsKKwlpZiAoc2tiLT5sZW4gPCBpaGxlbiArIDgpIHsKIAkJSUNNUF9JTkNfU1RBVFNfQkgoSUNNUF9NSUJfSU5FUlJPUlMpOwogCQlyZXR1cm47CiAJfQogCiAJLyogRml4IHVwIHNrYiB0byBsb29rIGF0IHRoZSBlbWJlZGRlZCBuZXQgaGVhZGVyLiAqLwotCXNhdmVpcCA9IHNrYi0+bmgucmF3OwotCXNhdmVzY3RwICA9IHNrYi0+aC5yYXc7Ci0Jc2tiLT5uaC5pcGggPSBpcGg7Ci0Jc2tiLT5oLnJhdyA9IChjaGFyICopc2g7Ci0Jc2sgPSBzY3RwX2Vycl9sb29rdXAoQUZfSU5FVCwgc2tiLCBzaCwgJmFzb2MsICZ0cmFuc3BvcnQpOwotCS8qIFB1dCBiYWNrLCB0aGUgb3JpZ2luYWwgcG9pbnRlcnMuICovCi0Jc2tiLT5uaC5yYXcgPSBzYXZlaXA7Ci0Jc2tiLT5oLnJhdyA9IHNhdmVzY3RwOworCXNhdmVpcCA9IHNrYi0+bmV0d29ya19oZWFkZXI7CisJc2F2ZXNjdHAgPSBza2ItPnRyYW5zcG9ydF9oZWFkZXI7CisJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CisJc2tiX3NldF90cmFuc3BvcnRfaGVhZGVyKHNrYiwgaWhsZW4pOworCXNrID0gc2N0cF9lcnJfbG9va3VwKEFGX0lORVQsIHNrYiwgc2N0cF9oZHIoc2tiKSwgJmFzb2MsICZ0cmFuc3BvcnQpOworCS8qIFB1dCBiYWNrLCB0aGUgb3JpZ2luYWwgdmFsdWVzLiAqLworCXNrYi0+bmV0d29ya19oZWFkZXIgPSBzYXZlaXA7CisJc2tiLT50cmFuc3BvcnRfaGVhZGVyID0gc2F2ZXNjdHA7CiAJaWYgKCFzaykgewogCQlJQ01QX0lOQ19TVEFUU19CSChJQ01QX01JQl9JTkVSUk9SUyk7CiAJCXJldHVybjsKQEAgLTYxNiw3ICs2MTEsNyBAQAogCQkJYnJlYWs7CiAKIAkJY2hfZW5kID0gKChfX3U4ICopY2gpICsgV09SRF9ST1VORChudG9ocyhjaC0+bGVuZ3RoKSk7Ci0JCWlmIChjaF9lbmQgPiBza2ItPnRhaWwpCisJCWlmIChjaF9lbmQgPiBza2JfdGFpbF9wb2ludGVyKHNrYikpCiAJCQlicmVhazsKIAogCQkvKiBSRkMgOC40LCAyKSBJZiB0aGUgT09UQiBwYWNrZXQgY29udGFpbnMgYW4gQUJPUlQgY2h1bmssIHRoZQpAQCAtNjQ4LDcgKzY0Myw3IEBACiAJCX0KIAogCQljaCA9IChzY3RwX2NodW5raGRyX3QgKikgY2hfZW5kOwotCX0gd2hpbGUgKGNoX2VuZCA8IHNrYi0+dGFpbCk7CisJfSB3aGlsZSAoY2hfZW5kIDwgc2tiX3RhaWxfcG9pbnRlcihza2IpKTsKIAogCXJldHVybiAwOwogCkBAIC05MDUsNyArOTAwLDcgQEAKIAlzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYzsKIAl1bmlvbiBzY3RwX2FkZHIgYWRkcjsKIAl1bmlvbiBzY3RwX2FkZHIgKnBhZGRyID0gJmFkZHI7Ci0Jc3RydWN0IHNjdHBoZHIgKnNoID0gKHN0cnVjdCBzY3RwaGRyICopIHNrYi0+aC5yYXc7CisJc3RydWN0IHNjdHBoZHIgKnNoID0gc2N0cF9oZHIoc2tiKTsKIAlzY3RwX2NodW5raGRyX3QgKmNoOwogCXVuaW9uIHNjdHBfcGFyYW1zIHBhcmFtczsKIAlzY3RwX2luaXRfY2h1bmtfdCAqaW5pdDsKZGlmZiAtLWdpdCBhL25ldC9zY3RwL2lucXVldWUuYyBiL25ldC9zY3RwL2lucXVldWUuYwppbmRleCBjMzA2MjllLi44OGFhMjI0IDEwMDY0NAotLS0gYS9uZXQvc2N0cC9pbnF1ZXVlLmMKKysrIGIvbmV0L3NjdHAvaW5xdWV1ZS5jCkBAIC0xNTksMTYgKzE1OSwxNiBAQAogCSAqIHRoZSBza2ItPnRhaWwuCiAJICovCiAJaWYgKHVubGlrZWx5KHNrYl9pc19ub25saW5lYXIoY2h1bmstPnNrYikpKSB7Ci0JCWlmIChjaHVuay0+Y2h1bmtfZW5kID4gY2h1bmstPnNrYi0+dGFpbCkKLQkJCWNodW5rLT5jaHVua19lbmQgPSBjaHVuay0+c2tiLT50YWlsOworCQlpZiAoY2h1bmstPmNodW5rX2VuZCA+IHNrYl90YWlsX3BvaW50ZXIoY2h1bmstPnNrYikpCisJCQljaHVuay0+Y2h1bmtfZW5kID0gc2tiX3RhaWxfcG9pbnRlcihjaHVuay0+c2tiKTsKIAl9CiAJc2tiX3B1bGwoY2h1bmstPnNrYiwgc2l6ZW9mKHNjdHBfY2h1bmtoZHJfdCkpOwogCWNodW5rLT5zdWJoLnYgPSBOVUxMOyAvKiBTdWJoZWFkZXIgaXMgbm8gbG9uZ2VyIHZhbGlkLiAgKi8KIAotCWlmIChjaHVuay0+Y2h1bmtfZW5kIDwgY2h1bmstPnNrYi0+dGFpbCkgeworCWlmIChjaHVuay0+Y2h1bmtfZW5kIDwgc2tiX3RhaWxfcG9pbnRlcihjaHVuay0+c2tiKSkgewogCQkvKiBUaGlzIGlzIG5vdCBhIHNpbmdsZXRvbiAqLwogCQljaHVuay0+c2luZ2xldG9uID0gMDsKLQl9IGVsc2UgaWYgKGNodW5rLT5jaHVua19lbmQgPiBjaHVuay0+c2tiLT50YWlsKSB7CisJfSBlbHNlIGlmIChjaHVuay0+Y2h1bmtfZW5kID4gc2tiX3RhaWxfcG9pbnRlcihjaHVuay0+c2tiKSkgewogCQkvKiBSRkMgMjk2MCwgU2VjdGlvbiA2LjEwICBCdW5kbGluZwogCQkgKgogCQkgKiBQYXJ0aWFsIGNodW5rcyBNVVNUIE5PVCBiZSBwbGFjZWQgaW4gYW4gU0NUUCBwYWNrZXQuCmRpZmYgLS1naXQgYS9uZXQvc2N0cC9pcHY2LmMgYi9uZXQvc2N0cC9pcHY2LmMKaW5kZXggMGI5YzQ5Yi4uY2E1MjdhMiAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvaXB2Ni5jCisrKyBiL25ldC9zY3RwL2lwdjYuYwpAQCAtMTIyLDI2ICsxMjIsMjQgQEAKIAkJCSAgICAgaW50IHR5cGUsIGludCBjb2RlLCBpbnQgb2Zmc2V0LCBfX2JlMzIgaW5mbykKIHsKIAlzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2OwotCXN0cnVjdCBpcHY2aGRyICppcGggPSAoc3RydWN0IGlwdjZoZHIgKilza2ItPmRhdGE7Ci0Jc3RydWN0IHNjdHBoZHIgKnNoID0gKHN0cnVjdCBzY3RwaGRyICopKHNrYi0+ZGF0YSArIG9mZnNldCk7CiAJc3RydWN0IHNvY2sgKnNrOwogCXN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jOwogCXN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqdHJhbnNwb3J0OwogCXN0cnVjdCBpcHY2X3BpbmZvICpucDsKLQljaGFyICpzYXZlaXAsICpzYXZlc2N0cDsKKwlza19idWZmX2RhdGFfdCBzYXZlaXAsIHNhdmVzY3RwOwogCWludCBlcnI7CiAKIAlpZGV2ID0gaW42X2Rldl9nZXQoc2tiLT5kZXYpOwogCiAJLyogRml4IHVwIHNrYiB0byBsb29rIGF0IHRoZSBlbWJlZGRlZCBuZXQgaGVhZGVyLiAqLwotCXNhdmVpcCA9IHNrYi0+bmgucmF3OwotCXNhdmVzY3RwICA9IHNrYi0+aC5yYXc7Ci0Jc2tiLT5uaC5pcHY2aCA9IGlwaDsKLQlza2ItPmgucmF3ID0gKGNoYXIgKilzaDsKLQlzayA9IHNjdHBfZXJyX2xvb2t1cChBRl9JTkVUNiwgc2tiLCBzaCwgJmFzb2MsICZ0cmFuc3BvcnQpOworCXNhdmVpcAkgPSBza2ItPm5ldHdvcmtfaGVhZGVyOworCXNhdmVzY3RwID0gc2tiLT50cmFuc3BvcnRfaGVhZGVyOworCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOworCXNrYl9zZXRfdHJhbnNwb3J0X2hlYWRlcihza2IsIG9mZnNldCk7CisJc2sgPSBzY3RwX2Vycl9sb29rdXAoQUZfSU5FVDYsIHNrYiwgc2N0cF9oZHIoc2tiKSwgJmFzb2MsICZ0cmFuc3BvcnQpOwogCS8qIFB1dCBiYWNrLCB0aGUgb3JpZ2luYWwgcG9pbnRlcnMuICovCi0Jc2tiLT5uaC5yYXcgPSBzYXZlaXA7Ci0Jc2tiLT5oLnJhdyA9IHNhdmVzY3RwOworCXNrYi0+bmV0d29ya19oZWFkZXIgICA9IHNhdmVpcDsKKwlza2ItPnRyYW5zcG9ydF9oZWFkZXIgPSBzYXZlc2N0cDsKIAlpZiAoIXNrKSB7CiAJCUlDTVA2X0lOQ19TVEFUU19CSChpZGV2LCBJQ01QNl9NSUJfSU5FUlJPUlMpOwogCQlnb3RvIG91dDsKQEAgLTM5MSwxMyArMzg5LDEzIEBACiAJYWRkci0+djYuc2luNl9mbG93aW5mbyA9IDA7IC8qIEZJWE1FICovCiAJYWRkci0+djYuc2luNl9zY29wZV9pZCA9ICgoc3RydWN0IGluZXQ2X3NrYl9wYXJtICopc2tiLT5jYiktPmlpZjsKIAotCXNoID0gKHN0cnVjdCBzY3RwaGRyICopIHNrYi0+aC5yYXc7CisJc2ggPSBzY3RwX2hkcihza2IpOwogCWlmIChpc19zYWRkcikgewogCQkqcG9ydCAgPSBzaC0+c291cmNlOwotCQlmcm9tID0gJnNrYi0+bmguaXB2NmgtPnNhZGRyOworCQlmcm9tID0gJmlwdjZfaGRyKHNrYiktPnNhZGRyOwogCX0gZWxzZSB7CiAJCSpwb3J0ID0gc2gtPmRlc3Q7Ci0JCWZyb20gPSAmc2tiLT5uaC5pcHY2aC0+ZGFkZHI7CisJCWZyb20gPSAmaXB2Nl9oZHIoc2tiKS0+ZGFkZHI7CiAJfQogCWlwdjZfYWRkcl9jb3B5KCZhZGRyLT52Ni5zaW42X2FkZHIsIGZyb20pOwogfQpAQCAtNjA2LDcgKzYwNCw3IEBACiAJZGVmYXVsdDoKIAkJcmV0dmFsID0gU0NUUF9TQ09QRV9HTE9CQUw7CiAJCWJyZWFrOwotCX07CisJfQogCiAJcmV0dXJuIHJldHZhbDsKIH0KQEAgLTY5OSw3ICs2OTcsNyBAQAogLyogV2FzIHRoaXMgcGFja2V0IG1hcmtlZCBieSBFeHBsaWNpdCBDb25nZXN0aW9uIE5vdGlmaWNhdGlvbj8gKi8KIHN0YXRpYyBpbnQgc2N0cF92Nl9pc19jZShjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXJldHVybiAqKChfX3UzMiAqKShza2ItPm5oLmlwdjZoKSkgJiBodG9ubCgxPDwyMCk7CisJcmV0dXJuICooKF9fdTMyICopKGlwdjZfaGRyKHNrYikpKSAmIGh0b25sKDEgPDwgMjApOwogfQogCiAvKiBEdW1wIHRoZSB2NiBhZGRyIHRvIHRoZSBzZXEgZmlsZS4gKi8KQEAgLTc2NiwxOSArNzY0LDE5IEBACiAJaWYgKG1zZ25hbWUpIHsKIAkJc2N0cF9pbmV0Nl9tc2duYW1lKG1zZ25hbWUsIGFkZHJfbGVuKTsKIAkJc2luNiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopbXNnbmFtZTsKLQkJc2ggPSAoc3RydWN0IHNjdHBoZHIgKilza2ItPmgucmF3OworCQlzaCA9IHNjdHBfaGRyKHNrYik7CiAJCXNpbjYtPnNpbjZfcG9ydCA9IHNoLT5zb3VyY2U7CiAKIAkJLyogTWFwIGlwdjQgYWRkcmVzcyBpbnRvIHY0LW1hcHBlZC1vbi12NiBhZGRyZXNzLiAqLwogCQlpZiAoc2N0cF9zayhza2ItPnNrKS0+djRtYXBwZWQgJiYKLQkJICAgIHNrYi0+bmguaXBoLT52ZXJzaW9uID09IDQpIHsKKwkJICAgIGlwX2hkcihza2IpLT52ZXJzaW9uID09IDQpIHsKIAkJCXNjdHBfdjRfbWFwX3Y2KCh1bmlvbiBzY3RwX2FkZHIgKilzaW42KTsKLQkJCXNpbjYtPnNpbjZfYWRkci5zNl9hZGRyMzJbM10gPSBza2ItPm5oLmlwaC0+c2FkZHI7CisJCQlzaW42LT5zaW42X2FkZHIuczZfYWRkcjMyWzNdID0gaXBfaGRyKHNrYiktPnNhZGRyOwogCQkJcmV0dXJuOwogCQl9CiAKIAkJLyogT3RoZXJ3aXNlLCBqdXN0IGNvcHkgdGhlIHY2IGFkZHJlc3MuICovCi0JCWlwdjZfYWRkcl9jb3B5KCZzaW42LT5zaW42X2FkZHIsICZza2ItPm5oLmlwdjZoLT5zYWRkcik7CisJCWlwdjZfYWRkcl9jb3B5KCZzaW42LT5zaW42X2FkZHIsICZpcHY2X2hkcihza2IpLT5zYWRkcik7CiAJCWlmIChpcHY2X2FkZHJfdHlwZSgmc2luNi0+c2luNl9hZGRyKSAmIElQVjZfQUREUl9MSU5LTE9DQUwpIHsKIAkJCXN0cnVjdCBzY3RwX3VscGV2ZW50ICpldiA9IHNjdHBfc2tiMmV2ZW50KHNrYik7CiAJCQlzaW42LT5zaW42X3Njb3BlX2lkID0gZXYtPmlpZjsKZGlmZiAtLWdpdCBhL25ldC9zY3RwL291dHB1dC5jIGIvbmV0L3NjdHAvb3V0cHV0LmMKaW5kZXggZjg3NWZjMy4uZDg1NTQzZCAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvb3V0cHV0LmMKKysrIGIvbmV0L3NjdHAvb3V0cHV0LmMKQEAgLTE3Niw3ICsxNzYsNyBAQAogCWNhc2UgU0NUUF9YTUlUX09LOgogCWNhc2UgU0NUUF9YTUlUX05BR0xFX0RFTEFZOgogCQlicmVhazsKLQl9OworCX0KIAogCXJldHVybiByZXR2YWw7CiB9CmRpZmYgLS1naXQgYS9uZXQvc2N0cC9vdXRxdWV1ZS5jIGIvbmV0L3NjdHAvb3V0cXVldWUuYwppbmRleCA0MWFiZmQxLi45OTJmMzYxIDEwMDY0NAotLS0gYS9uZXQvc2N0cC9vdXRxdWV1ZS5jCisrKyBiL25ldC9zY3RwL291dHF1ZXVlLmMKQEAgLTMzOCw3ICszMzgsNyBAQAogCQkJCVNDVFBfSU5DX1NUQVRTKFNDVFBfTUlCX09VVE9SREVSQ0hVTktTKTsKIAkJCXEtPmVtcHR5ID0gMDsKIAkJCWJyZWFrOwotCQl9OworCQl9CiAJfSBlbHNlIHsKIAkJbGlzdF9hZGRfdGFpbCgmY2h1bmstPmxpc3QsICZxLT5jb250cm9sX2NodW5rX2xpc3QpOwogCQlTQ1RQX0lOQ19TVEFUUyhTQ1RQX01JQl9PVVRDVFJMQ0hVTktTKTsKQEAgLTYzMCw3ICs2MzAsNyBAQAogCQkJLyogUmV0cmlldmUgYSBuZXcgY2h1bmsgdG8gYnVuZGxlLiAqLwogCQkJbGNodW5rID0gc2N0cF9saXN0X2RlcXVldWUobHF1ZXVlKTsKIAkJCWJyZWFrOwotCQl9OworCQl9CiAKIAkJLyogSWYgd2UgYXJlIGhlcmUgZHVlIHRvIGEgcmV0cmFuc21pdCB0aW1lb3V0IG9yIGEgZmFzdAogCQkgKiByZXRyYW5zbWl0IGFuZCBpZiB0aGVyZSBhcmUgYW55IGNodW5rcyBsZWZ0IGluIHRoZSByZXRyYW5zbWl0CkBAIC03NzksNyArNzc5LDcgQEAKIAkJZGVmYXVsdDoKIAkJCS8qIFdlIGJ1aWx0IGEgY2h1bmsgd2l0aCBhbiBpbGxlZ2FsIHR5cGUhICovCiAJCQlCVUcoKTsKLQkJfTsKKwkJfQogCX0KIAogCS8qIElzIGl0IE9LIHRvIHNlbmQgZGF0YSBjaHVua3M/ICAqLwpAQCAtMTM5Nyw3ICsxMzk3LDcgQEAKIAkJCQlTQ1RQX0RFQlVHX1BSSU5USygiQUNLZWQ6ICUwOHgiLCB0c24pOwogCQkJCWRiZ19wcnRfc3RhdGUgPSAwOwogCQkJCWRiZ19hY2tfdHNuID0gdHNuOwotCQkJfTsKKwkJCX0KIAogCQkJZGJnX2xhc3RfYWNrX3RzbiA9IHRzbjsKICNlbmRpZiAvKiBTQ1RQX0RFQlVHICovCkBAIC0xNDUyLDcgKzE0NTIsNyBAQAogCQkJCVNDVFBfREVCVUdfUFJJTlRLKCJLRVBUOiAlMDh4Iix0c24pOwogCQkJCWRiZ19wcnRfc3RhdGUgPSAxOwogCQkJCWRiZ19rZXB0X3RzbiA9IHRzbjsKLQkJCX07CisJCQl9CiAKIAkJCWRiZ19sYXN0X2tlcHRfdHNuID0gdHNuOwogI2VuZGlmIC8qIFNDVFBfREVCVUcgKi8KQEAgLTE0NzYsNyArMTQ3Niw3IEBACiAJCX0gZWxzZSB7CiAJCQlTQ1RQX0RFQlVHX1BSSU5USygiXG4iKTsKIAkJfQotCX07CisJfQogI2VuZGlmIC8qIFNDVFBfREVCVUcgKi8KIAlpZiAodHJhbnNwb3J0KSB7CiAJCWlmIChieXRlc19hY2tlZCkgewpkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvcHJvdG9jb2wuYyBiL25ldC9zY3RwL3Byb3RvY29sLmMKaW5kZXggZTE3YTgyMy4uYzM2MWRlYiAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvcHJvdG9jb2wuYworKysgYi9uZXQvc2N0cC9wcm90b2NvbC5jCkBAIC0yMzUsMTMgKzIzNSwxMyBAQAogCXBvcnQgPSAmYWRkci0+djQuc2luX3BvcnQ7CiAJYWRkci0+djQuc2luX2ZhbWlseSA9IEFGX0lORVQ7CiAKLQlzaCA9IChzdHJ1Y3Qgc2N0cGhkciAqKSBza2ItPmgucmF3OworCXNoID0gc2N0cF9oZHIoc2tiKTsKIAlpZiAoaXNfc2FkZHIpIHsKIAkJKnBvcnQgID0gc2gtPnNvdXJjZTsKLQkJZnJvbSA9ICZza2ItPm5oLmlwaC0+c2FkZHI7CisJCWZyb20gPSAmaXBfaGRyKHNrYiktPnNhZGRyOwogCX0gZWxzZSB7CiAJCSpwb3J0ID0gc2gtPmRlc3Q7Ci0JCWZyb20gPSAmc2tiLT5uaC5pcGgtPmRhZGRyOworCQlmcm9tID0gJmlwX2hkcihza2IpLT5kYWRkcjsKIAl9CiAJbWVtY3B5KCZhZGRyLT52NC5zaW5fYWRkci5zX2FkZHIsIGZyb20sIHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpOwogfQpAQCAtNTMwLDcgKzUzMCw3IEBACiAvKiBXYXMgdGhpcyBwYWNrZXQgbWFya2VkIGJ5IEV4cGxpY2l0IENvbmdlc3Rpb24gTm90aWZpY2F0aW9uPyAqLwogc3RhdGljIGludCBzY3RwX3Y0X2lzX2NlKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JcmV0dXJuIElORVRfRUNOX2lzX2NlKHNrYi0+bmguaXBoLT50b3MpOworCXJldHVybiBJTkVUX0VDTl9pc19jZShpcF9oZHIoc2tiKS0+dG9zKTsKIH0KIAogLyogQ3JlYXRlIGFuZCBpbml0aWFsaXplIGEgbmV3IHNrIGZvciB0aGUgc29ja2V0IHJldHVybmVkIGJ5IGFjY2VwdCgpLiAqLwpAQCAtNzMxLDE1ICs3MzEsMTMgQEAKIC8qIEluaXRpYWxpemUgYW5kIGNvcHkgb3V0IGEgbXNnbmFtZSBmcm9tIGFuIGluYm91bmQgc2tiLiAqLwogc3RhdGljIHZvaWQgc2N0cF9pbmV0X3NrYl9tc2duYW1lKHN0cnVjdCBza19idWZmICpza2IsIGNoYXIgKm1zZ25hbWUsIGludCAqbGVuKQogewotCXN0cnVjdCBzY3RwaGRyICpzaDsKLQlzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbjsKLQogCWlmIChtc2duYW1lKSB7CisJCXN0cnVjdCBzY3RwaGRyICpzaCA9IHNjdHBfaGRyKHNrYik7CisJCXN0cnVjdCBzb2NrYWRkcl9pbiAqc2luID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKW1zZ25hbWU7CisKIAkJc2N0cF9pbmV0X21zZ25hbWUobXNnbmFtZSwgbGVuKTsKLQkJc2luID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKW1zZ25hbWU7Ci0JCXNoID0gKHN0cnVjdCBzY3RwaGRyICopc2tiLT5oLnJhdzsKIAkJc2luLT5zaW5fcG9ydCA9IHNoLT5zb3VyY2U7Ci0JCXNpbi0+c2luX2FkZHIuc19hZGRyID0gc2tiLT5uaC5pcGgtPnNhZGRyOworCQlzaW4tPnNpbl9hZGRyLnNfYWRkciA9IGlwX2hkcihza2IpLT5zYWRkcjsKIAl9CiB9CiAKQEAgLTEwNDQsNyArMTA0Miw3IEBACiAJc2N0cF9jb29raWVfcHJlc2VydmVfZW5hYmxlIAk9IDE7CiAKIAkvKiBNYXguQnVyc3QJCSAgICAtIDQgKi8KLQlzY3RwX21heF9idXJzdCAJCQk9IFNDVFBfTUFYX0JVUlNUOworCXNjdHBfbWF4X2J1cnN0IAkJCT0gU0NUUF9ERUZBVUxUX01BWF9CVVJTVDsKIAogCS8qIEFzc29jaWF0aW9uLk1heC5SZXRyYW5zICAtIDEwIGF0dGVtcHRzCiAJICogUGF0aC5NYXguUmV0cmFucyAgICAgICAgIC0gNSAgYXR0ZW1wdHMgKHBlciBkZXN0aW5hdGlvbiBhZGRyZXNzKQpkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvc21fbWFrZV9jaHVuay5jIGIvbmV0L3NjdHAvc21fbWFrZV9jaHVuay5jCmluZGV4IGY3ZmIyOWQuLmJlNzgzYTMgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL3NtX21ha2VfY2h1bmsuYworKysgYi9uZXQvc2N0cC9zbV9tYWtlX2NodW5rLmMKQEAgLTg2LDcgKzg2LDcgQEAKIAlzdHJ1Y3Qgc2N0cF9hZiAqYWY7CiAJaW50IGlpZiA9IDA7CiAKLQlhZiA9IHNjdHBfZ2V0X2FmX3NwZWNpZmljKGlwdmVyMmFmKGNodW5rLT5za2ItPm5oLmlwaC0+dmVyc2lvbikpOworCWFmID0gc2N0cF9nZXRfYWZfc3BlY2lmaWMoaXB2ZXIyYWYoaXBfaGRyKGNodW5rLT5za2IpLT52ZXJzaW9uKSk7CiAJaWYgKGFmKQogCQlpaWYgPSBhZi0+c2tiX2lpZihjaHVuay0+c2tiKTsKIApAQCAtMTE0Myw3ICsxMTQzLDcgQEAKIAogCS8qIEFkanVzdCB0aGUgY2h1bmsgbGVuZ3RoIGZpZWxkLiAgKi8KIAljaHVuay0+Y2h1bmtfaGRyLT5sZW5ndGggPSBodG9ucyhjaHVua2xlbiArIHBhZGxlbiArIGxlbik7Ci0JY2h1bmstPmNodW5rX2VuZCA9IGNodW5rLT5za2ItPnRhaWw7CisJY2h1bmstPmNodW5rX2VuZCA9IHNrYl90YWlsX3BvaW50ZXIoY2h1bmstPnNrYik7CiAKIAlyZXR1cm4gdGFyZ2V0OwogfQpAQCAtMTE2OCw3ICsxMTY4LDcgQEAKIAkvKiBBZGp1c3QgdGhlIGNodW5rIGxlbmd0aCBmaWVsZC4gICovCiAJY2h1bmstPmNodW5rX2hkci0+bGVuZ3RoID0KIAkJaHRvbnMobnRvaHMoY2h1bmstPmNodW5rX2hkci0+bGVuZ3RoKSArIGxlbik7Ci0JY2h1bmstPmNodW5rX2VuZCA9IGNodW5rLT5za2ItPnRhaWw7CisJY2h1bmstPmNodW5rX2VuZCA9IHNrYl90YWlsX3BvaW50ZXIoY2h1bmstPnNrYik7CiAKIG91dDoKIAlyZXR1cm4gZXJyOwpAQCAtMTIzMyw3ICsxMjMzLDcgQEAKIAlhc29jLT50ZW1wID0gMTsKIAlza2IgPSBjaHVuay0+c2tiOwogCS8qIENyZWF0ZSBhbiBlbnRyeSBmb3IgdGhlIHNvdXJjZSBhZGRyZXNzIG9mIHRoZSBwYWNrZXQuICAqLwotCWFmID0gc2N0cF9nZXRfYWZfc3BlY2lmaWMoaXB2ZXIyYWYoc2tiLT5uaC5pcGgtPnZlcnNpb24pKTsKKwlhZiA9IHNjdHBfZ2V0X2FmX3NwZWNpZmljKGlwdmVyMmFmKGlwX2hkcihza2IpLT52ZXJzaW9uKSk7CiAJaWYgKHVubGlrZWx5KCFhZikpCiAJCWdvdG8gZmFpbDsKIAlhZi0+ZnJvbV9za2IoJmFzb2MtPmMucGVlcl9hZGRyLCBza2IsIDEpOwpAQCAtMjA3Nyw3ICsyMDc3LDcgQEAKIAogCQkJZGVmYXVsdDogLyogSnVzdCBpZ25vcmUgYW55dGhpbmcgZWxzZS4gICovCiAJCQkJYnJlYWs7Ci0JCQl9OworCQkJfQogCQl9CiAJCWJyZWFrOwogCkBAIC0yMTE4LDcgKzIxMTgsNyBAQAogCQlTQ1RQX0RFQlVHX1BSSU5USygiSWdub3JpbmcgcGFyYW06ICVkIGZvciBhc3NvY2lhdGlvbiAlcC5cbiIsCiAJCQkJICBudG9ocyhwYXJhbS5wLT50eXBlKSwgYXNvYyk7CiAJCWJyZWFrOwotCX07CisJfQogCiAJcmV0dXJuIHJldHZhbDsKIH0KZGlmZiAtLWdpdCBhL25ldC9zY3RwL3NtX3NpZGVlZmZlY3QuYyBiL25ldC9zY3RwL3NtX3NpZGVlZmZlY3QuYwppbmRleCAxMzU1Njc0Li5iMzdhN2FkIDEwMDY0NAotLS0gYS9uZXQvc2N0cC9zbV9zaWRlZWZmZWN0LmMKKysrIGIvbmV0L3NjdHAvc21fc2lkZWVmZmVjdC5jCkBAIC00NjQsNyArNDY0LDcgQEAKIAlzdHJ1Y3Qgc2N0cF91bHBldmVudCAqZXZlbnQ7CiAKIAlldmVudCA9IHNjdHBfdWxwZXZlbnRfbWFrZV9hc3NvY19jaGFuZ2UoYXNvYywwLCBTQ1RQX0NBTlRfU1RSX0FTU09DLAotCQkJCQkJKF9fdTE2KWVycm9yLCAwLCAwLAorCQkJCQkJKF9fdTE2KWVycm9yLCAwLCAwLCBOVUxMLAogCQkJCQkJR0ZQX0FUT01JQyk7CiAKIAlpZiAoZXZlbnQpCkBAIC00OTIsOCArNDkyLDEzIEBACiAJLyogQ2FuY2VsIGFueSBwYXJ0aWFsIGRlbGl2ZXJ5IGluIHByb2dyZXNzLiAqLwogCXNjdHBfdWxwcV9hYm9ydF9wZCgmYXNvYy0+dWxwcSwgR0ZQX0FUT01JQyk7CiAKLQlldmVudCA9IHNjdHBfdWxwZXZlbnRfbWFrZV9hc3NvY19jaGFuZ2UoYXNvYywgMCwgU0NUUF9DT01NX0xPU1QsCi0JCQkJCQkoX191MTYpZXJyb3IsIDAsIDAsCisJaWYgKGV2ZW50X3R5cGUgPT0gU0NUUF9FVkVOVF9UX0NIVU5LICYmIHN1YnR5cGUuY2h1bmsgPT0gU0NUUF9DSURfQUJPUlQpCisJCWV2ZW50ID0gc2N0cF91bHBldmVudF9tYWtlX2Fzc29jX2NoYW5nZShhc29jLCAwLCBTQ1RQX0NPTU1fTE9TVCwKKwkJCQkJCShfX3UxNillcnJvciwgMCwgMCwgY2h1bmssCisJCQkJCQlHRlBfQVRPTUlDKTsKKwllbHNlCisJCWV2ZW50ID0gc2N0cF91bHBldmVudF9tYWtlX2Fzc29jX2NoYW5nZShhc29jLCAwLCBTQ1RQX0NPTU1fTE9TVCwKKwkJCQkJCShfX3UxNillcnJvciwgMCwgMCwgTlVMTCwKIAkJCQkJCUdGUF9BVE9NSUMpOwogCWlmIChldmVudCkKIAkJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9FVkVOVF9VTFAsCkBAIC0xMDA0LDcgKzEwMDksNyBAQAogCQkgICAgICAgc3RhdHVzLCBzdGF0ZSwgZXZlbnRfdHlwZSwgc3VidHlwZS5jaHVuayk7CiAJCUJVRygpOwogCQlicmVhazsKLQl9OworCX0KIAogYmFpbDoKIAlyZXR1cm4gZXJyb3I7CkBAIC0xNDg0LDcgKzE0ODksOCBAQAogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiSW1wb3NzaWJsZSBjb21tYW5kOiAldSwgJXBcbiIsCiAJCQkgICAgICAgY21kLT52ZXJiLCBjbWQtPm9iai5wdHIpOwogCQkJYnJlYWs7Ci0JCX07CisJCX0KKwogCQlpZiAoZXJyb3IpCiAJCQlicmVhazsKIAl9CmRpZmYgLS1naXQgYS9uZXQvc2N0cC9zbV9zdGF0ZWZ1bnMuYyBiL25ldC9zY3RwL3NtX3N0YXRlZnVucy5jCmluZGV4IGU5MDk3Y2YuLjllMjhhNWQgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL3NtX3N0YXRlZnVucy5jCisrKyBiL25ldC9zY3RwL3NtX3N0YXRlZnVucy5jCkBAIC0xODYsNyArMTg2LDcgQEAKIAkgKiBub3RpZmljYXRpb24gaXMgcGFzc2VkIHRvIHRoZSB1cHBlciBsYXllci4KIAkgKi8KIAlldiA9IHNjdHBfdWxwZXZlbnRfbWFrZV9hc3NvY19jaGFuZ2UoYXNvYywgMCwgU0NUUF9TSFVURE9XTl9DT01QLAotCQkJCQkgICAgIDAsIDAsIDAsIEdGUF9BVE9NSUMpOworCQkJCQkgICAgIDAsIDAsIDAsIE5VTEwsIEdGUF9BVE9NSUMpOwogCWlmIChldikKIAkJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9FVkVOVF9VTFAsCiAJCQkJU0NUUF9VTFBFVkVOVChldikpOwpAQCAtNjI5LDcgKzYyOSw3IEBACiAJCWNhc2UgLVNDVFBfSUVSUk9SX0JBRF9TSUc6CiAJCWRlZmF1bHQ6CiAJCQlyZXR1cm4gc2N0cF9zZl9wZGlzY2FyZChlcCwgYXNvYywgdHlwZSwgYXJnLCBjb21tYW5kcyk7Ci0JCX07CisJCX0KIAl9CiAKIApAQCAtNjYxLDcgKzY2MSw3IEBACiAJZXYgPSBzY3RwX3VscGV2ZW50X21ha2VfYXNzb2NfY2hhbmdlKG5ld19hc29jLCAwLCBTQ1RQX0NPTU1fVVAsIDAsCiAJCQkJCSAgICAgbmV3X2Fzb2MtPmMuc2luaXRfbnVtX29zdHJlYW1zLAogCQkJCQkgICAgIG5ld19hc29jLT5jLnNpbml0X21heF9pbnN0cmVhbXMsCi0JCQkJCSAgICAgR0ZQX0FUT01JQyk7CisJCQkJCSAgICAgTlVMTCwgR0ZQX0FUT01JQyk7CiAJaWYgKCFldikKIAkJZ290byBub21lbV9ldjsKIApAQCAtNzkwLDcgKzc5MCw3IEBACiAJZXYgPSBzY3RwX3VscGV2ZW50X21ha2VfYXNzb2NfY2hhbmdlKGFzb2MsIDAsIFNDVFBfQ09NTV9VUCwKIAkJCQkJICAgICAwLCBhc29jLT5jLnNpbml0X251bV9vc3RyZWFtcywKIAkJCQkJICAgICBhc29jLT5jLnNpbml0X21heF9pbnN0cmVhbXMsCi0JCQkJCSAgICAgR0ZQX0FUT01JQyk7CisJCQkJCSAgICAgTlVMTCwgR0ZQX0FUT01JQyk7CiAKIAlpZiAoIWV2KQogCQlnb3RvIG5vbWVtOwpAQCAtMTE5NSw3ICsxMTk1LDcgQEAKIAkJbmV3X2Fzb2MtPmMubXlfdHRhZyAgID0gYXNvYy0+Yy5teV92dGFnOwogCQluZXdfYXNvYy0+Yy5wZWVyX3R0YWcgPSBhc29jLT5jLnBlZXJfdnRhZzsKIAkJYnJlYWs7Ci0JfTsKKwl9CiAKIAkvKiBPdGhlciBwYXJhbWV0ZXJzIGZvciB0aGUgZW5kcG9pbnQgU0hPVUxEIGJlIGNvcGllZCBmcm9tIHRoZQogCSAqIGV4aXN0aW5nIHBhcmFtZXRlcnMgb2YgdGhlIGFzc29jaWF0aW9uIChlLmcuIG51bWJlciBvZgpAQCAtMTYyNSw3ICsxNjI1LDcgQEAKIAlldiA9IHNjdHBfdWxwZXZlbnRfbWFrZV9hc3NvY19jaGFuZ2UoYXNvYywgMCwgU0NUUF9SRVNUQVJULCAwLAogCQkJCQkgICAgIG5ld19hc29jLT5jLnNpbml0X251bV9vc3RyZWFtcywKIAkJCQkJICAgICBuZXdfYXNvYy0+Yy5zaW5pdF9tYXhfaW5zdHJlYW1zLAotCQkJCQkgICAgIEdGUF9BVE9NSUMpOworCQkJCQkgICAgIE5VTEwsIEdGUF9BVE9NSUMpOwogCWlmICghZXYpCiAJCWdvdG8gbm9tZW1fZXY7CiAKQEAgLTE2OTEsNyArMTY5MSw3IEBACiAJZXYgPSBzY3RwX3VscGV2ZW50X21ha2VfYXNzb2NfY2hhbmdlKGFzb2MsIDAsIFNDVFBfQ09NTV9VUCwgMCwKIAkJCQkJICAgICBuZXdfYXNvYy0+Yy5zaW5pdF9udW1fb3N0cmVhbXMsCiAJCQkJCSAgICAgbmV3X2Fzb2MtPmMuc2luaXRfbWF4X2luc3RyZWFtcywKLQkJCQkJICAgICBHRlBfQVRPTUlDKTsKKwkJCQkJICAgICBOVUxMLCBHRlBfQVRPTUlDKTsKIAlpZiAoIWV2KQogCQlnb3RvIG5vbWVtX2V2OwogCkBAIC0xNzg2LDcgKzE3ODYsNyBAQAogCQkJCQkgICAgIFNDVFBfQ09NTV9VUCwgMCwKIAkJCQkJICAgICBhc29jLT5jLnNpbml0X251bV9vc3RyZWFtcywKIAkJCQkJICAgICBhc29jLT5jLnNpbml0X21heF9pbnN0cmVhbXMsCi0JCQkJCSAgICAgR0ZQX0FUT01JQyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBHRlBfQVRPTUlDKTsKIAkJaWYgKCFldikKIAkJCWdvdG8gbm9tZW07CiAKQEAgLTE5MDQsNyArMTkwNCw3IEBACiAJCWNhc2UgLVNDVFBfSUVSUk9SX0JBRF9TSUc6CiAJCWRlZmF1bHQ6CiAJCQlyZXR1cm4gc2N0cF9zZl9wZGlzY2FyZChlcCwgYXNvYywgdHlwZSwgYXJnLCBjb21tYW5kcyk7Ci0JCX07CisJCX0KIAl9CiAKIAkvKiBDb21wYXJlIHRoZSB0aWVfdGFnIGluIGNvb2tpZSB3aXRoIHRoZSB2ZXJpZmljYXRpb24gdGFnIG9mCkBAIC0xOTM2LDcgKzE5MzYsNyBAQAogCWRlZmF1bHQ6IC8qIERpc2NhcmQgcGFja2V0IGZvciBhbGwgb3RoZXJzLiAqLwogCQlyZXR2YWwgPSBzY3RwX3NmX3BkaXNjYXJkKGVwLCBhc29jLCB0eXBlLCBhcmcsIGNvbW1hbmRzKTsKIAkJYnJlYWs7Ci0JfTsKKwl9CiAKIAkvKiBEZWxldGUgdGhlIHRlbXBvcnkgbmV3IGFzc29jaWF0aW9uLiAqLwogCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfTkVXX0FTT0MsIFNDVFBfQVNPQyhuZXdfYXNvYykpOwpAQCAtMzAzNSw3ICszMDM1LDcgQEAKIAkgKiBub3RpZmljYXRpb24gaXMgcGFzc2VkIHRvIHRoZSB1cHBlciBsYXllci4KIAkgKi8KIAlldiA9IHNjdHBfdWxwZXZlbnRfbWFrZV9hc3NvY19jaGFuZ2UoYXNvYywgMCwgU0NUUF9TSFVURE9XTl9DT01QLAotCQkJCQkgICAgIDAsIDAsIDAsIEdGUF9BVE9NSUMpOworCQkJCQkgICAgIDAsIDAsIDAsIE5VTEwsIEdGUF9BVE9NSUMpOwogCWlmICghZXYpCiAJCWdvdG8gbm9tZW07CiAKQEAgLTMxMTUsNyArMzExNSw3IEBACiAJCQlicmVhazsKIAogCQljaF9lbmQgPSAoKF9fdTggKiljaCkgKyBXT1JEX1JPVU5EKG50b2hzKGNoLT5sZW5ndGgpKTsKLQkJaWYgKGNoX2VuZCA+IHNrYi0+dGFpbCkKKwkJaWYgKGNoX2VuZCA+IHNrYl90YWlsX3BvaW50ZXIoc2tiKSkKIAkJCWJyZWFrOwogCiAJCWlmIChTQ1RQX0NJRF9TSFVURE9XTl9BQ0sgPT0gY2gtPnR5cGUpCkBAIC0zMTMwLDcgKzMxMzAsNyBAQAogCQkJcmV0dXJuIHNjdHBfc2ZfcGRpc2NhcmQoZXAsIGFzb2MsIHR5cGUsIGFyZywgY29tbWFuZHMpOwogCiAJCWNoID0gKHNjdHBfY2h1bmtoZHJfdCAqKSBjaF9lbmQ7Ci0JfSB3aGlsZSAoY2hfZW5kIDwgc2tiLT50YWlsKTsKKwl9IHdoaWxlIChjaF9lbmQgPCBza2JfdGFpbF9wb2ludGVyKHNrYikpOwogCiAJaWYgKG9vdGJfc2h1dF9hY2spCiAJCXNjdHBfc2Zfc2h1dF84XzRfNShlcCwgYXNvYywgdHlwZSwgYXJnLCBjb21tYW5kcyk7CkBAIC00ODE2LDcgKzQ4MTYsNyBAQAogCWRlZmF1bHQ6CiAJCUJVRygpOwogCQlicmVhazsKLQl9OworCX0KIAogCWlmICghcmVwbHkpCiAJCWdvdG8gbm9tZW07CkBAIC01Mjg2LDcgKzUyODYsNyBAQAogCQljaHVuay0+ZWNuX2NlX2RvbmUgPSAxOwogCiAJCWFmID0gc2N0cF9nZXRfYWZfc3BlY2lmaWMoCi0JCQlpcHZlcjJhZihjaHVuay0+c2tiLT5uaC5pcGgtPnZlcnNpb24pKTsKKwkJCWlwdmVyMmFmKGlwX2hkcihjaHVuay0+c2tiKS0+dmVyc2lvbikpOwogCiAJCWlmIChhZiAmJiBhZi0+aXNfY2UoY2h1bmstPnNrYikgJiYgYXNvYy0+cGVlci5lY25fY2FwYWJsZSkgewogCQkJLyogRG8gcmVhbCB3b3JrIGFzIHNpZGVmZmVjdC4gKi8KZGlmZiAtLWdpdCBhL25ldC9zY3RwL3NtX3N0YXRldGFibGUuYyBiL25ldC9zY3RwL3NtX3N0YXRldGFibGUuYwppbmRleCA1ZTU0YjE3Li41MjMwNzFjIDEwMDY0NAotLS0gYS9uZXQvc2N0cC9zbV9zdGF0ZXRhYmxlLmMKKysrIGIvbmV0L3NjdHAvc21fc3RhdGV0YWJsZS5jCkBAIC0xMDEsNyArMTAxLDcgQEAKIAlkZWZhdWx0OgogCQkvKiBZaWtlcyEgIFdlIGdvdCBhbiBpbGxlZ2FsIGV2ZW50IHR5cGUuICAqLwogCQlyZXR1cm4gJmJ1ZzsKLQl9OworCX0KIH0KIAogI2RlZmluZSBUWVBFX1NDVFBfRlVOQyhmdW5jKSB7LmZuID0gZnVuYywgLm5hbWUgPSAjZnVuY30KZGlmZiAtLWdpdCBhL25ldC9zY3RwL3NvY2tldC5jIGIvbmV0L3NjdHAvc29ja2V0LmMKaW5kZXggYTFkMDI2Zi4uMmZjMGE5MiAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvc29ja2V0LmMKKysrIGIvbmV0L3NjdHAvc29ja2V0LmMKQEAgLTk0MSw3ICs5NDEsNyBAQAogCWRlZmF1bHQ6CiAJCWVyciA9IC1FSU5WQUw7CiAJCWJyZWFrOwotCX07CisJfQogCiBvdXQ6CiAJa2ZyZWUoa2FkZHJzKTsKQEAgLTIwMzksNiArMjAzOSwxMCBAQAogICogICAgICAgICAgICAgICAgICAgICBTUFBfSEJfREVNQU5EIC0gUmVxdWVzdCBhIHVzZXIgaW5pdGlhdGVkIGhlYXJ0YmVhdAogICogICAgICAgICAgICAgICAgICAgICB0byBiZSBtYWRlIGltbWVkaWF0ZWx5LgogICoKKyAqICAgICAgICAgICAgICAgICAgICAgU1BQX0hCX1RJTUVfSVNfWkVSTyAtIFNwZWNpZnkncyB0aGF0IHRoZSB0aW1lIGZvcgorICogICAgICAgICAgICAgICAgICAgICBoZWFydGJlYXQgZGVsYXlpcyB0byBiZSBzZXQgdG8gdGhlIHZhbHVlIG9mIDAKKyAqICAgICAgICAgICAgICAgICAgICAgbWlsbGlzZWNvbmRzLgorICoKICAqICAgICAgICAgICAgICAgICAgICAgU1BQX1BNVFVEX0VOQUJMRSAtIFRoaXMgZmllbGQgd2lsbCBlbmFibGUgUE1UVQogICogICAgICAgICAgICAgICAgICAgICBkaXNjb3ZlcnkgdXBvbiB0aGUgc3BlY2lmaWVkIGFkZHJlc3MuIE5vdGUgdGhhdAogICogICAgICAgICAgICAgICAgICAgICBpZiB0aGUgYWRkcmVzcyBmZWlsZCBpcyBlbXB0eSB0aGVuIGFsbCBhZGRyZXNzZXMKQEAgLTIwODEsMTMgKzIwODUsMzAgQEAKIAkJCXJldHVybiBlcnJvcjsKIAl9CiAKLQlpZiAocGFyYW1zLT5zcHBfaGJpbnRlcnZhbCkgewotCQlpZiAodHJhbnMpIHsKLQkJCXRyYW5zLT5oYmludGVydmFsID0gbXNlY3NfdG9famlmZmllcyhwYXJhbXMtPnNwcF9oYmludGVydmFsKTsKLQkJfSBlbHNlIGlmIChhc29jKSB7Ci0JCQlhc29jLT5oYmludGVydmFsID0gbXNlY3NfdG9famlmZmllcyhwYXJhbXMtPnNwcF9oYmludGVydmFsKTsKLQkJfSBlbHNlIHsKLQkJCXNwLT5oYmludGVydmFsID0gcGFyYW1zLT5zcHBfaGJpbnRlcnZhbDsKKwkvKiBOb3RlIHRoYXQgdW5sZXNzIHRoZSBzcHBfZmxhZyBpcyBzZXQgdG8gU1BQX0hCX0VOQUJMRSB0aGUgdmFsdWUgb2YKKwkgKiB0aGlzIGZpZWxkIGlzIGlnbm9yZWQuICBOb3RlIGFsc28gdGhhdCBhIHZhbHVlIG9mIHplcm8gaW5kaWNhdGVzCisJICogdGhlIGN1cnJlbnQgc2V0dGluZyBzaG91bGQgYmUgbGVmdCB1bmNoYW5nZWQuCisJICovCisJaWYgKHBhcmFtcy0+c3BwX2ZsYWdzICYgU1BQX0hCX0VOQUJMRSkgeworCisJCS8qIFJlLXplcm8gdGhlIGludGVydmFsIGlmIHRoZSBTUFBfSEJfVElNRV9JU19aRVJPIGlzCisJCSAqIHNldC4gIFRoaXMgbGV0cyB1cyB1c2UgMCB2YWx1ZSB3aGVuIHRoaXMgZmxhZworCQkgKiBpcyBzZXQuCisJCSAqLworCQlpZiAocGFyYW1zLT5zcHBfZmxhZ3MgJiBTUFBfSEJfVElNRV9JU19aRVJPKQorCQkJcGFyYW1zLT5zcHBfaGJpbnRlcnZhbCA9IDA7CisKKwkJaWYgKHBhcmFtcy0+c3BwX2hiaW50ZXJ2YWwgfHwKKwkJICAgIChwYXJhbXMtPnNwcF9mbGFncyAmIFNQUF9IQl9USU1FX0lTX1pFUk8pKSB7CisJCQlpZiAodHJhbnMpIHsKKwkJCQl0cmFucy0+aGJpbnRlcnZhbCA9CisJCQkJICAgIG1zZWNzX3RvX2ppZmZpZXMocGFyYW1zLT5zcHBfaGJpbnRlcnZhbCk7CisJCQl9IGVsc2UgaWYgKGFzb2MpIHsKKwkJCQlhc29jLT5oYmludGVydmFsID0KKwkJCQkgICAgbXNlY3NfdG9famlmZmllcyhwYXJhbXMtPnNwcF9oYmludGVydmFsKTsKKwkJCX0gZWxzZSB7CisJCQkJc3AtPmhiaW50ZXJ2YWwgPSBwYXJhbXMtPnNwcF9oYmludGVydmFsOworCQkJfQogCQl9CiAJfQogCkBAIC0yMTA0LDcgKzIxMjUsMTIgQEAKIAkJfQogCX0KIAotCWlmIChwYXJhbXMtPnNwcF9wYXRobXR1KSB7CisJLyogV2hlbiBQYXRoIE1UVSBkaXNjb3ZlcnkgaXMgZGlzYWJsZWQgdGhlIHZhbHVlIHNwZWNpZmllZCBoZXJlIHdpbGwKKwkgKiBiZSB0aGUgImZpeGVkIiBwYXRoIG10dSAoaS5lLiB0aGUgdmFsdWUgb2YgdGhlIHNwcF9mbGFncyBmaWVsZCBtdXN0CisJICogaW5jbHVkZSB0aGUgZmxhZyBTUFBfUE1UVURfRElTQUJMRSBmb3IgdGhpcyBmaWVsZCB0byBoYXZlIGFueQorCSAqIGVmZmVjdCkuCisJICovCisJaWYgKChwYXJhbXMtPnNwcF9mbGFncyAmIFNQUF9QTVRVRF9ESVNBQkxFKSAmJiBwYXJhbXMtPnNwcF9wYXRobXR1KSB7CiAJCWlmICh0cmFucykgewogCQkJdHJhbnMtPnBhdGhtdHUgPSBwYXJhbXMtPnNwcF9wYXRobXR1OwogCQkJc2N0cF9hc3NvY19zeW5jX3BtdHUoYXNvYyk7CkBAIC0yMTM1LDcgKzIxNjEsMTEgQEAKIAkJfQogCX0KIAotCWlmIChwYXJhbXMtPnNwcF9zYWNrZGVsYXkpIHsKKwkvKiBOb3RlIHRoYXQgdW5sZXNzIHRoZSBzcHBfZmxhZyBpcyBzZXQgdG8gU1BQX1NBQ0tERUxBWV9FTkFCTEUgdGhlCisJICogdmFsdWUgb2YgdGhpcyBmaWVsZCBpcyBpZ25vcmVkLiAgTm90ZSBhbHNvIHRoYXQgYSB2YWx1ZSBvZiB6ZXJvCisJICogaW5kaWNhdGVzIHRoZSBjdXJyZW50IHNldHRpbmcgc2hvdWxkIGJlIGxlZnQgdW5jaGFuZ2VkLgorCSAqLworCWlmICgocGFyYW1zLT5zcHBfZmxhZ3MgJiBTUFBfU0FDS0RFTEFZX0VOQUJMRSkgJiYgcGFyYW1zLT5zcHBfc2Fja2RlbGF5KSB7CiAJCWlmICh0cmFucykgewogCQkJdHJhbnMtPnNhY2tkZWxheSA9CiAJCQkJbXNlY3NfdG9famlmZmllcyhwYXJhbXMtPnNwcF9zYWNrZGVsYXkpOwpAQCAtMjE2Myw3ICsyMTkzLDExIEBACiAJCX0KIAl9CiAKLQlpZiAocGFyYW1zLT5zcHBfcGF0aG1heHJ4dCkgeworCS8qIE5vdGUgdGhhdCB1bmxlc3MgdGhlIHNwcF9mbGFnIGlzIHNldCB0byBTUFBfUE1UVURfRU5BQkxFIHRoZSB2YWx1ZQorCSAqIG9mIHRoaXMgZmllbGQgaXMgaWdub3JlZC4gIE5vdGUgYWxzbyB0aGF0IGEgdmFsdWUgb2YgemVybworCSAqIGluZGljYXRlcyB0aGUgY3VycmVudCBzZXR0aW5nIHNob3VsZCBiZSBsZWZ0IHVuY2hhbmdlZC4KKwkgKi8KKwlpZiAoKHBhcmFtcy0+c3BwX2ZsYWdzICYgU1BQX1BNVFVEX0VOQUJMRSkgJiYgcGFyYW1zLT5zcHBfcGF0aG1heHJ4dCkgewogCQlpZiAodHJhbnMpIHsKIAkJCXRyYW5zLT5wYXRobWF4cnh0ID0gcGFyYW1zLT5zcHBfcGF0aG1heHJ4dDsKIAkJfSBlbHNlIGlmIChhc29jKSB7CkBAIC0yMjU1LDcgKzIyODksNyBAQAogCXJldHVybiAwOwogfQogCi0vKiA3LjEuMjQuIERlbGF5ZWQgQWNrIFRpbWVyIChTQ1RQX0RFTEFZRURfQUNLX1RJTUUpCisvKiA3LjEuMjMuIERlbGF5ZWQgQWNrIFRpbWVyIChTQ1RQX0RFTEFZRURfQUNLX1RJTUUpCiAgKgogICogICBUaGlzIG9wdGlvbnMgd2lsbCBnZXQgb3Igc2V0IHRoZSBkZWxheWVkIGFjayB0aW1lci4gIFRoZSB0aW1lIGlzIHNldAogICogICBpbiBtaWxsaXNlY29uZHMuICBJZiB0aGUgYXNzb2NfaWQgaXMgMCwgdGhlbiB0aGlzIHNldHMgb3IgZ2V0cyB0aGUKQEAgLTI3OTIsNiArMjgyNiwxMDIgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyoKKyAqIDcuMS4yNC4gIEdldCBvciBzZXQgZnJhZ21lbnRlZCBpbnRlcmxlYXZlIChTQ1RQX0ZSQUdNRU5UX0lOVEVSTEVBVkUpCisgKgorICogVGhpcyBvcHRpb25zIHdpbGwgYXQgYSBtaW5pbXVtIHNwZWNpZnkgaWYgdGhlIGltcGxlbWVudGF0aW9uIGlzIGRvaW5nCisgKiBmcmFnbWVudGVkIGludGVybGVhdmUuICBGcmFnbWVudGVkIGludGVybGVhdmUsIGZvciBhIG9uZSB0byBtYW55CisgKiBzb2NrZXQsIGlzIHdoZW4gc3Vic2VxdWVudCBjYWxscyB0byByZWNlaXZlIGEgbWVzc2FnZSBtYXkgcmV0dXJuCisgKiBwYXJ0cyBvZiBtZXNzYWdlcyBmcm9tIGRpZmZlcmVudCBhc3NvY2lhdGlvbnMuICBTb21lIGltcGxlbWVudGF0aW9ucworICogbWF5IGFsbG93IHlvdSB0byB0dXJuIHRoaXMgdmFsdWUgb24gb3Igb2ZmLiAgSWYgc28sIHdoZW4gdHVybmVkIG9mZiwKKyAqIG5vIGZyYWdtZW50IGludGVybGVhdmUgd2lsbCBvY2N1ciAod2hpY2ggd2lsbCBjYXVzZSBhIGhlYWQgb2YgbGluZQorICogYmxvY2tpbmcgYW1vbmdzdCBtdWx0aXBsZSBhc3NvY2lhdGlvbnMgc2hhcmluZyB0aGUgc2FtZSBvbmUgdG8gbWFueQorICogc29ja2V0KS4gIFdoZW4gdGhpcyBvcHRpb24gaXMgdHVybmVkIG9uLCB0aGVuIGVhY2ggcmVjZWl2ZSBjYWxsIG1heQorICogY29tZSBmcm9tIGEgZGlmZmVyZW50IGFzc29jaWF0aW9uICh0aHVzIHRoZSB1c2VyIG11c3QgcmVjZWl2ZSBkYXRhCisgKiB3aXRoIHRoZSBleHRlbmRlZCBjYWxscyAoZS5nLiBzY3RwX3JlY3Ztc2cpIHRvIGtlZXAgdHJhY2sgb2Ygd2hpY2gKKyAqIGFzc29jaWF0aW9uIGVhY2ggcmVjZWl2ZSBiZWxvbmdzIHRvLgorICoKKyAqIFRoaXMgb3B0aW9uIHRha2VzIGEgYm9vbGVhbiB2YWx1ZS4gIEEgbm9uLXplcm8gdmFsdWUgaW5kaWNhdGVzIHRoYXQKKyAqIGZyYWdtZW50ZWQgaW50ZXJsZWF2ZSBpcyBvbi4gIEEgdmFsdWUgb2YgemVybyBpbmRpY2F0ZXMgdGhhdAorICogZnJhZ21lbnRlZCBpbnRlcmxlYXZlIGlzIG9mZi4KKyAqCisgKiBOb3RlIHRoYXQgaXQgaXMgaW1wb3J0YW50IHRoYXQgYW4gaW1wbGVtZW50YXRpb24gdGhhdCBhbGxvd3MgdGhpcworICogb3B0aW9uIHRvIGJlIHR1cm5lZCBvbiwgaGF2ZSBpdCBvZmYgYnkgZGVmYXVsdC4gIE90aGVyd2lzZSBhbiB1bmF3YXJlCisgKiBhcHBsaWNhdGlvbiB1c2luZyB0aGUgb25lIHRvIG1hbnkgbW9kZWwgbWF5IGJlY29tZSBjb25mdXNlZCBhbmQgYWN0CisgKiBpbmNvcnJlY3RseS4KKyAqLworc3RhdGljIGludCBzY3RwX3NldHNvY2tvcHRfZnJhZ21lbnRfaW50ZXJsZWF2ZShzdHJ1Y3Qgc29jayAqc2ssCisJCQkJCSAgICAgICBjaGFyIF9fdXNlciAqb3B0dmFsLAorCQkJCQkgICAgICAgaW50IG9wdGxlbikKK3sKKwlpbnQgdmFsOworCisJaWYgKG9wdGxlbiAhPSBzaXplb2YoaW50KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGdldF91c2VyKHZhbCwgKGludCBfX3VzZXIgKilvcHR2YWwpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXNjdHBfc2soc2spLT5mcmFnX2ludGVybGVhdmUgPSAodmFsID09IDApID8gMCA6IDE7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIDcuMS4yNS4gIFNldCBvciBHZXQgdGhlIHNjdHAgcGFydGlhbCBkZWxpdmVyeSBwb2ludAorICogICAgICAgKFNDVFBfUEFSVElBTF9ERUxJVkVSWV9QT0lOVCkKKyAqIFRoaXMgb3B0aW9uIHdpbGwgc2V0IG9yIGdldCB0aGUgU0NUUCBwYXJ0aWFsIGRlbGl2ZXJ5IHBvaW50LiAgVGhpcworICogcG9pbnQgaXMgdGhlIHNpemUgb2YgYSBtZXNzYWdlIHdoZXJlIHRoZSBwYXJ0aWFsIGRlbGl2ZXJ5IEFQSSB3aWxsIGJlCisgKiBpbnZva2VkIHRvIGhlbHAgZnJlZSB1cCByd25kIHNwYWNlIGZvciB0aGUgcGVlci4gIFNldHRpbmcgdGhpcyB0byBhCisgKiBsb3dlciB2YWx1ZSB3aWxsIGNhdXNlIHBhcnRpYWwgZGVsaXZlcnkncyB0byBoYXBwZW4gbW9yZSBvZnRlbi4gIFRoZQorICogY2FsbHMgYXJndW1lbnQgaXMgYW4gaW50ZWdlciB0aGF0IHNldHMgb3IgZ2V0cyB0aGUgcGFydGlhbCBkZWxpdmVyeQorICogcG9pbnQuCisgKi8KK3N0YXRpYyBpbnQgc2N0cF9zZXRzb2Nrb3B0X3BhcnRpYWxfZGVsaXZlcnlfcG9pbnQoc3RydWN0IHNvY2sgKnNrLAorCQkJCQkJICBjaGFyIF9fdXNlciAqb3B0dmFsLAorCQkJCQkJICBpbnQgb3B0bGVuKQoreworCXUzMiB2YWw7CisKKwlpZiAob3B0bGVuICE9IHNpemVvZih1MzIpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoZ2V0X3VzZXIodmFsLCAoaW50IF9fdXNlciAqKW9wdHZhbCkpCisJCXJldHVybiAtRUZBVUxUOworCisJc2N0cF9zayhzayktPnBkX3BvaW50ID0gdmFsOworCisJcmV0dXJuIDA7IC8qIGlzIHRoaXMgdGhlIHJpZ2h0IGVycm9yIGNvZGU/ICovCit9CisKKy8qCisgKiA3LjEuMjguICBTZXQgb3IgR2V0IHRoZSBtYXhpbXVtIGJ1cnN0IChTQ1RQX01BWF9CVVJTVCkKKyAqCisgKiBUaGlzIG9wdGlvbiB3aWxsIGFsbG93IGEgdXNlciB0byBjaGFuZ2UgdGhlIG1heGltdW0gYnVyc3Qgb2YgcGFja2V0cworICogdGhhdCBjYW4gYmUgZW1pdHRlZCBieSB0aGlzIGFzc29jaWF0aW9uLiAgTm90ZSB0aGF0IHRoZSBkZWZhdWx0IHZhbHVlCisgKiBpcyA0LCBhbmQgc29tZSBpbXBsZW1lbnRhdGlvbnMgbWF5IHJlc3RyaWN0IHRoaXMgc2V0dGluZyBzbyB0aGF0IGl0CisgKiBjYW4gb25seSBiZSBsb3dlcmVkLgorICoKKyAqIE5PVEU6IFRoaXMgdGV4dCBkb2Vzbid0IHNlZW0gcmlnaHQuICBEbyB0aGlzIG9uIGEgc29ja2V0IGJhc2lzIHdpdGgKKyAqIGZ1dHVyZSBhc3NvY2lhdGlvbnMgaW5oZXJpdGluZyB0aGUgc29ja2V0IHZhbHVlLgorICovCitzdGF0aWMgaW50IHNjdHBfc2V0c29ja29wdF9tYXhidXJzdChzdHJ1Y3Qgc29jayAqc2ssCisJCQkJICAgIGNoYXIgX191c2VyICpvcHR2YWwsCisJCQkJICAgIGludCBvcHRsZW4pCit7CisJaW50IHZhbDsKKworCWlmIChvcHRsZW4gIT0gc2l6ZW9mKGludCkpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChnZXRfdXNlcih2YWwsIChpbnQgX191c2VyICopb3B0dmFsKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAodmFsIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzY3RwX3NrKHNrKS0+bWF4X2J1cnN0ID0gdmFsOworCisJcmV0dXJuIDA7Cit9CisKIC8qIEFQSSA2LjIgc2V0c29ja29wdCgpLCBnZXRzb2Nrb3B0KCkKICAqCiAgKiBBcHBsaWNhdGlvbnMgdXNlIHNldHNvY2tvcHQoKSBhbmQgZ2V0c29ja29wdCgpIHRvIHNldCBvciByZXRyaWV2ZQpAQCAtMjg3MSw2ICszMDAxLDkgQEAKIAljYXNlIFNDVFBfREVMQVlFRF9BQ0tfVElNRToKIAkJcmV0dmFsID0gc2N0cF9zZXRzb2Nrb3B0X2RlbGF5ZWRfYWNrX3RpbWUoc2ssIG9wdHZhbCwgb3B0bGVuKTsKIAkJYnJlYWs7CisJY2FzZSBTQ1RQX1BBUlRJQUxfREVMSVZFUllfUE9JTlQ6CisJCXJldHZhbCA9IHNjdHBfc2V0c29ja29wdF9wYXJ0aWFsX2RlbGl2ZXJ5X3BvaW50KHNrLCBvcHR2YWwsIG9wdGxlbik7CisJCWJyZWFrOwogCiAJY2FzZSBTQ1RQX0lOSVRNU0c6CiAJCXJldHZhbCA9IHNjdHBfc2V0c29ja29wdF9pbml0bXNnKHNrLCBvcHR2YWwsIG9wdGxlbik7CkBAIC0yOTA2LDExICszMDM5LDE2IEBACiAJY2FzZSBTQ1RQX0NPTlRFWFQ6CiAJCXJldHZhbCA9IHNjdHBfc2V0c29ja29wdF9jb250ZXh0KHNrLCBvcHR2YWwsIG9wdGxlbik7CiAJCWJyZWFrOwotCisJY2FzZSBTQ1RQX0ZSQUdNRU5UX0lOVEVSTEVBVkU6CisJCXJldHZhbCA9IHNjdHBfc2V0c29ja29wdF9mcmFnbWVudF9pbnRlcmxlYXZlKHNrLCBvcHR2YWwsIG9wdGxlbik7CisJCWJyZWFrOworCWNhc2UgU0NUUF9NQVhfQlVSU1Q6CisJCXJldHZhbCA9IHNjdHBfc2V0c29ja29wdF9tYXhidXJzdChzaywgb3B0dmFsLCBvcHRsZW4pOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR2YWwgPSAtRU5PUFJPVE9PUFQ7CiAJCWJyZWFrOwotCX07CisJfQogCiAJc2N0cF9yZWxlYXNlX3NvY2soc2spOwogCkBAIC0zMDY2LDYgKzMyMDQsNyBAQAogCXNwLT5kZWZhdWx0X3RpbWV0b2xpdmUgPSAwOwogCiAJc3AtPmRlZmF1bHRfcmN2X2NvbnRleHQgPSAwOworCXNwLT5tYXhfYnVyc3QgPSBzY3RwX21heF9idXJzdDsKIAogCS8qIEluaXRpYWxpemUgZGVmYXVsdCBzZXR1cCBwYXJhbWV0ZXJzLiBUaGVzZSBwYXJhbWV0ZXJzCiAJICogY2FuIGJlIG1vZGlmaWVkIHdpdGggdGhlIFNDVFBfSU5JVE1TRyBzb2NrZXQgb3B0aW9uIG9yCkBAIC0zMTM0LDggKzMyNzMsOSBAQAogCXNwLT5wZiA9IHNjdHBfZ2V0X3BmX3NwZWNpZmljKHNrLT5za19mYW1pbHkpOwogCiAJLyogQ29udHJvbCB2YXJpYWJsZXMgZm9yIHBhcnRpYWwgZGF0YSBkZWxpdmVyeS4gKi8KLQlzcC0+cGRfbW9kZSAgICAgICAgICAgPSAwOworCWF0b21pY19zZXQoJnNwLT5wZF9tb2RlLCAwKTsKIAlza2JfcXVldWVfaGVhZF9pbml0KCZzcC0+cGRfbG9iYnkpOworCXNwLT5mcmFnX2ludGVybGVhdmUgPSAwOwogCiAJLyogQ3JlYXRlIGEgcGVyIHNvY2tldCBlbmRwb2ludCBzdHJ1Y3R1cmUuICBFdmVuIGlmIHdlCiAJICogY2hhbmdlIHRoZSBkYXRhIHN0cnVjdHVyZSByZWxhdGlvbnNoaXBzLCB0aGlzIG1heSBzdGlsbApAQCAtMzY0Miw3ICszNzgyLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyogNy4xLjI0LiBEZWxheWVkIEFjayBUaW1lciAoU0NUUF9ERUxBWUVEX0FDS19USU1FKQorLyogNy4xLjIzLiBEZWxheWVkIEFjayBUaW1lciAoU0NUUF9ERUxBWUVEX0FDS19USU1FKQogICoKICAqICAgVGhpcyBvcHRpb25zIHdpbGwgZ2V0IG9yIHNldCB0aGUgZGVsYXllZCBhY2sgdGltZXIuICBUaGUgdGltZSBpcyBzZXQKICAqICAgaW4gbWlsbGlzZWNvbmRzLiAgSWYgdGhlIGFzc29jX2lkIGlzIDAsIHRoZW4gdGhpcyBzZXRzIG9yIGdldHMgdGhlCkBAIC0zODQ3LDcgKzM5ODcsNyBAQAogCQltZW1jcHkoJnRlbXAsICZmcm9tLT5pcGFkZHIsIHNpemVvZih0ZW1wKSk7CiAJCXNjdHBfZ2V0X3BmX3NwZWNpZmljKHNrLT5za19mYW1pbHkpLT5hZGRyX3Y0bWFwKHNwLCAmdGVtcCk7CiAJCWFkZHJsZW4gPSBzY3RwX2dldF9hZl9zcGVjaWZpYyhzay0+c2tfZmFtaWx5KS0+c29ja2FkZHJfbGVuOwotCQlpZihzcGFjZV9sZWZ0IDwgYWRkcmxlbikKKwkJaWYgKHNwYWNlX2xlZnQgPCBhZGRybGVuKQogCQkJcmV0dXJuIC1FTk9NRU07CiAJCWlmIChjb3B5X3RvX3VzZXIodG8sICZ0ZW1wLCBhZGRybGVuKSkKIAkJCXJldHVybiAtRUZBVUxUOwpAQCAtMzkzNiw4ICs0MDc2LDkgQEAKIC8qIEhlbHBlciBmdW5jdGlvbiB0aGF0IGNvcGllcyBsb2NhbCBhZGRyZXNzZXMgdG8gdXNlciBhbmQgcmV0dXJucyB0aGUgbnVtYmVyCiAgKiBvZiBhZGRyZXNzZXMgY29waWVkLgogICovCi1zdGF0aWMgaW50IHNjdHBfY29weV9sYWRkcnNfdG9fdXNlcl9vbGQoc3RydWN0IHNvY2sgKnNrLCBfX3UxNiBwb3J0LCBpbnQgbWF4X2FkZHJzLAotCQkJCQl2b2lkIF9fdXNlciAqdG8pCitzdGF0aWMgaW50IHNjdHBfY29weV9sYWRkcnNfb2xkKHN0cnVjdCBzb2NrICpzaywgX191MTYgcG9ydCwKKwkJCQkJaW50IG1heF9hZGRycywgdm9pZCAqdG8sCisJCQkJCWludCAqYnl0ZXNfY29waWVkKQogewogCXN0cnVjdCBsaXN0X2hlYWQgKnBvcywgKm5leHQ7CiAJc3RydWN0IHNjdHBfc29ja2FkZHJfZW50cnkgKmFkZHI7CkBAIC0zOTU0LDEwICs0MDk1LDEwIEBACiAJCXNjdHBfZ2V0X3BmX3NwZWNpZmljKHNrLT5za19mYW1pbHkpLT5hZGRyX3Y0bWFwKHNjdHBfc2soc2spLAogCQkJCQkJCQkmdGVtcCk7CiAJCWFkZHJsZW4gPSBzY3RwX2dldF9hZl9zcGVjaWZpYyh0ZW1wLnNhLnNhX2ZhbWlseSktPnNvY2thZGRyX2xlbjsKLQkJaWYgKGNvcHlfdG9fdXNlcih0bywgJnRlbXAsIGFkZHJsZW4pKQotCQkJcmV0dXJuIC1FRkFVTFQ7CisJCW1lbWNweSh0bywgJnRlbXAsIGFkZHJsZW4pOwogCiAJCXRvICs9IGFkZHJsZW47CisJCSpieXRlc19jb3BpZWQgKz0gYWRkcmxlbjsKIAkJY250ICsrOwogCQlpZiAoY250ID49IG1heF9hZGRycykgYnJlYWs7CiAJfQpAQCAtMzk2NSw4ICs0MTA2LDggQEAKIAlyZXR1cm4gY250OwogfQogCi1zdGF0aWMgaW50IHNjdHBfY29weV9sYWRkcnNfdG9fdXNlcihzdHJ1Y3Qgc29jayAqc2ssIF9fdTE2IHBvcnQsCi0JCQkJICAgIHZvaWQgX191c2VyICoqdG8sIHNpemVfdCBzcGFjZV9sZWZ0KQorc3RhdGljIGludCBzY3RwX2NvcHlfbGFkZHJzKHN0cnVjdCBzb2NrICpzaywgX191MTYgcG9ydCwgdm9pZCAqdG8sCisJCQkgICAgc2l6ZV90IHNwYWNlX2xlZnQsIGludCAqYnl0ZXNfY29waWVkKQogewogCXN0cnVjdCBsaXN0X2hlYWQgKnBvcywgKm5leHQ7CiAJc3RydWN0IHNjdHBfc29ja2FkZHJfZW50cnkgKmFkZHI7CkBAIC0zOTgzLDE0ICs0MTI0LDE0IEBACiAJCXNjdHBfZ2V0X3BmX3NwZWNpZmljKHNrLT5za19mYW1pbHkpLT5hZGRyX3Y0bWFwKHNjdHBfc2soc2spLAogCQkJCQkJCQkmdGVtcCk7CiAJCWFkZHJsZW4gPSBzY3RwX2dldF9hZl9zcGVjaWZpYyh0ZW1wLnNhLnNhX2ZhbWlseSktPnNvY2thZGRyX2xlbjsKLQkJaWYoc3BhY2VfbGVmdDxhZGRybGVuKQorCQlpZiAoc3BhY2VfbGVmdCA8IGFkZHJsZW4pCiAJCQlyZXR1cm4gLUVOT01FTTsKLQkJaWYgKGNvcHlfdG9fdXNlcigqdG8sICZ0ZW1wLCBhZGRybGVuKSkKLQkJCXJldHVybiAtRUZBVUxUOworCQltZW1jcHkodG8sICZ0ZW1wLCBhZGRybGVuKTsKIAotCQkqdG8gKz0gYWRkcmxlbjsKKwkJdG8gKz0gYWRkcmxlbjsKIAkJY250ICsrOwogCQlzcGFjZV9sZWZ0IC09IGFkZHJsZW47CisJCWJ5dGVzX2NvcGllZCArPSBhZGRybGVuOwogCX0KIAogCXJldHVybiBjbnQ7CkBAIC00MDE0LDYgKzQxNTUsOCBAQAogCWludCBhZGRybGVuOwogCXJ3bG9ja190ICphZGRyX2xvY2s7CiAJaW50IGVyciA9IDA7CisJdm9pZCAqYWRkcnM7CisJaW50IGJ5dGVzX2NvcGllZCA9IDA7CiAKIAlpZiAobGVuICE9IHNpemVvZihzdHJ1Y3Qgc2N0cF9nZXRhZGRyc19vbGQpKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTQwNDEsNiArNDE4NCwxNSBAQAogCiAJdG8gPSBnZXRhZGRycy5hZGRyczsKIAorCS8qIEFsbG9jYXRlIHNwYWNlIGZvciBhIGxvY2FsIGluc3RhbmNlIG9mIHBhY2tlZCBhcnJheSB0byBob2xkIGFsbAorCSAqIHRoZSBkYXRhLiAgV2Ugc3RvcmUgYWRkcmVzc2VzIGhlcmUgZmlyc3QgYW5kIHRoZW4gcHV0IHdyaXRlIHRoZW0KKwkgKiB0byB0aGUgdXNlciBpbiBvbmUgc2hvdC4KKwkgKi8KKwlhZGRycyA9IGttYWxsb2Moc2l6ZW9mKHVuaW9uIHNjdHBfYWRkcikgKiBnZXRhZGRycy5hZGRyX251bSwKKwkJCUdGUF9LRVJORUwpOworCWlmICghYWRkcnMpCisJCXJldHVybiAtRU5PTUVNOworCiAJc2N0cF9yZWFkX2xvY2soYWRkcl9sb2NrKTsKIAogCS8qIElmIHRoZSBlbmRwb2ludCBpcyBib3VuZCB0byAwLjAuMC4wIG9yIDo6MCwgZ2V0IHRoZSB2YWxpZApAQCAtNDA1MCwxMyArNDIwMiw5IEBACiAJCWFkZHIgPSBsaXN0X2VudHJ5KGJwLT5hZGRyZXNzX2xpc3QubmV4dCwKIAkJCQkgIHN0cnVjdCBzY3RwX3NvY2thZGRyX2VudHJ5LCBsaXN0KTsKIAkJaWYgKHNjdHBfaXNfYW55KCZhZGRyLT5hKSkgewotCQkJY250ID0gc2N0cF9jb3B5X2xhZGRyc190b191c2VyX29sZChzaywgYnAtPnBvcnQsCi0JCQkJCQkJICAgZ2V0YWRkcnMuYWRkcl9udW0sCi0JCQkJCQkJICAgdG8pOwotCQkJaWYgKGNudCA8IDApIHsKLQkJCQllcnIgPSBjbnQ7Ci0JCQkJZ290byB1bmxvY2s7Ci0JCQl9CisJCQljbnQgPSBzY3RwX2NvcHlfbGFkZHJzX29sZChzaywgYnAtPnBvcnQsCisJCQkJCQkgICBnZXRhZGRycy5hZGRyX251bSwKKwkJCQkJCSAgIGFkZHJzLCAmYnl0ZXNfY29waWVkKTsKIAkJCWdvdG8gY29weV9nZXRhZGRyczsKIAkJfQogCX0KQEAgLTQwNjYsMjIgKzQyMTQsMjkgQEAKIAkJbWVtY3B5KCZ0ZW1wLCAmYWRkci0+YSwgc2l6ZW9mKHRlbXApKTsKIAkJc2N0cF9nZXRfcGZfc3BlY2lmaWMoc2stPnNrX2ZhbWlseSktPmFkZHJfdjRtYXAoc3AsICZ0ZW1wKTsKIAkJYWRkcmxlbiA9IHNjdHBfZ2V0X2FmX3NwZWNpZmljKHRlbXAuc2Euc2FfZmFtaWx5KS0+c29ja2FkZHJfbGVuOwotCQlpZiAoY29weV90b191c2VyKHRvLCAmdGVtcCwgYWRkcmxlbikpIHsKLQkJCWVyciA9IC1FRkFVTFQ7Ci0JCQlnb3RvIHVubG9jazsKLQkJfQorCQltZW1jcHkoYWRkcnMsICZ0ZW1wLCBhZGRybGVuKTsKIAkJdG8gKz0gYWRkcmxlbjsKKwkJYnl0ZXNfY29waWVkICs9IGFkZHJsZW47CiAJCWNudCArKzsKIAkJaWYgKGNudCA+PSBnZXRhZGRycy5hZGRyX251bSkgYnJlYWs7CiAJfQogCiBjb3B5X2dldGFkZHJzOgorCXNjdHBfcmVhZF91bmxvY2soYWRkcl9sb2NrKTsKKworCS8qIGNvcHkgdGhlIGVudGlyZSBhZGRyZXNzIGxpc3QgaW50byB0aGUgdXNlciBwcm92aWRlZCBzcGFjZSAqLworCWlmIChjb3B5X3RvX3VzZXIodG8sIGFkZHJzLCBieXRlc19jb3BpZWQpKSB7CisJCWVyciA9IC1FRkFVTFQ7CisJCWdvdG8gZXJyb3I7CisJfQorCisJLyogY29weSB0aGUgbGVhZGluZyBzdHJ1Y3R1cmUgYmFjayB0byB1c2VyICovCiAJZ2V0YWRkcnMuYWRkcl9udW0gPSBjbnQ7CiAJaWYgKGNvcHlfdG9fdXNlcihvcHR2YWwsICZnZXRhZGRycywgc2l6ZW9mKHN0cnVjdCBzY3RwX2dldGFkZHJzX29sZCkpKQogCQllcnIgPSAtRUZBVUxUOwogCi11bmxvY2s6Ci0Jc2N0cF9yZWFkX3VubG9jayhhZGRyX2xvY2spOworZXJyb3I6CisJa2ZyZWUoYWRkcnMpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTQxMDEsNyArNDI1Niw4IEBACiAJcndsb2NrX3QgKmFkZHJfbG9jazsKIAlpbnQgZXJyID0gMDsKIAlzaXplX3Qgc3BhY2VfbGVmdDsKLQlpbnQgYnl0ZXNfY29waWVkOworCWludCBieXRlc19jb3BpZWQgPSAwOworCXZvaWQgKmFkZHJzOwogCiAJaWYgKGxlbiA8PSBzaXplb2Yoc3RydWN0IHNjdHBfZ2V0YWRkcnMpKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTQxMjksNiArNDI4NSw5IEBACiAJdG8gPSBvcHR2YWwgKyBvZmZzZXRvZihzdHJ1Y3Qgc2N0cF9nZXRhZGRycyxhZGRycyk7CiAJc3BhY2VfbGVmdCA9IGxlbiAtIHNpemVvZihzdHJ1Y3Qgc2N0cF9nZXRhZGRycykgLQogCQkJIG9mZnNldG9mKHN0cnVjdCBzY3RwX2dldGFkZHJzLGFkZHJzKTsKKwlhZGRycyA9IGttYWxsb2Moc3BhY2VfbGVmdCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFhZGRycykKKwkJcmV0dXJuIC1FTk9NRU07CiAKIAlzY3RwX3JlYWRfbG9jayhhZGRyX2xvY2spOwogCkBAIC00MTM5LDExICs0Mjk4LDExIEBACiAJCWFkZHIgPSBsaXN0X2VudHJ5KGJwLT5hZGRyZXNzX2xpc3QubmV4dCwKIAkJCQkgIHN0cnVjdCBzY3RwX3NvY2thZGRyX2VudHJ5LCBsaXN0KTsKIAkJaWYgKHNjdHBfaXNfYW55KCZhZGRyLT5hKSkgewotCQkJY250ID0gc2N0cF9jb3B5X2xhZGRyc190b191c2VyKHNrLCBicC0+cG9ydCwKLQkJCQkJCSAgICAgICAmdG8sIHNwYWNlX2xlZnQpOworCQkJY250ID0gc2N0cF9jb3B5X2xhZGRycyhzaywgYnAtPnBvcnQsIGFkZHJzLAorCQkJCQkJc3BhY2VfbGVmdCwgJmJ5dGVzX2NvcGllZCk7CiAJCQlpZiAoY250IDwgMCkgewogCQkJCWVyciA9IGNudDsKLQkJCQlnb3RvIHVubG9jazsKKwkJCQlnb3RvIGVycm9yOwogCQkJfQogCQkJZ290byBjb3B5X2dldGFkZHJzOwogCQl9CkBAIC00MTU0LDI2ICs0MzEzLDMxIEBACiAJCW1lbWNweSgmdGVtcCwgJmFkZHItPmEsIHNpemVvZih0ZW1wKSk7CiAJCXNjdHBfZ2V0X3BmX3NwZWNpZmljKHNrLT5za19mYW1pbHkpLT5hZGRyX3Y0bWFwKHNwLCAmdGVtcCk7CiAJCWFkZHJsZW4gPSBzY3RwX2dldF9hZl9zcGVjaWZpYyh0ZW1wLnNhLnNhX2ZhbWlseSktPnNvY2thZGRyX2xlbjsKLQkJaWYoc3BhY2VfbGVmdCA8IGFkZHJsZW4pCi0JCQlyZXR1cm4gLUVOT01FTTsgLypmaXhtZTogcmlnaHQgZXJyb3I/Ki8KLQkJaWYgKGNvcHlfdG9fdXNlcih0bywgJnRlbXAsIGFkZHJsZW4pKSB7Ci0JCQllcnIgPSAtRUZBVUxUOwotCQkJZ290byB1bmxvY2s7CisJCWlmIChzcGFjZV9sZWZ0IDwgYWRkcmxlbikgeworCQkJZXJyID0gIC1FTk9NRU07IC8qZml4bWU6IHJpZ2h0IGVycm9yPyovCisJCQlnb3RvIGVycm9yOwogCQl9CisJCW1lbWNweShhZGRycywgJnRlbXAsIGFkZHJsZW4pOwogCQl0byArPSBhZGRybGVuOworCQlieXRlc19jb3BpZWQgKz0gYWRkcmxlbjsKIAkJY250ICsrOwogCQlzcGFjZV9sZWZ0IC09IGFkZHJsZW47CiAJfQogCiBjb3B5X2dldGFkZHJzOgorCXNjdHBfcmVhZF91bmxvY2soYWRkcl9sb2NrKTsKKworCWlmIChjb3B5X3RvX3VzZXIodG8sIGFkZHJzLCBieXRlc19jb3BpZWQpKSB7CisJCWVyciA9IC1FRkFVTFQ7CisJCWdvdG8gZXJyb3I7CisJfQogCWlmIChwdXRfdXNlcihjbnQsICYoKHN0cnVjdCBzY3RwX2dldGFkZHJzIF9fdXNlciAqKW9wdHZhbCktPmFkZHJfbnVtKSkKIAkJcmV0dXJuIC1FRkFVTFQ7Ci0JYnl0ZXNfY29waWVkID0gKChjaGFyIF9fdXNlciAqKXRvKSAtIG9wdHZhbDsKIAlpZiAocHV0X3VzZXIoYnl0ZXNfY29waWVkLCBvcHRsZW4pKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotdW5sb2NrOgotCXNjdHBfcmVhZF91bmxvY2soYWRkcl9sb2NrKTsKK2Vycm9yOgorCWtmcmVlKGFkZHJzKTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC00NTM2LDYgKzQ3MDAsNzcgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyoKKyAqIDcuMS4yNC4gIEdldCBvciBzZXQgZnJhZ21lbnRlZCBpbnRlcmxlYXZlIChTQ1RQX0ZSQUdNRU5UX0lOVEVSTEVBVkUpCisgKiAoY2hhcHRlciBhbmQgdmVyc2UgaXMgcXVvdGVkIGF0IHNjdHBfc2V0c29ja29wdF9mcmFnbWVudF9pbnRlcmxlYXZlKCkpCisgKi8KK3N0YXRpYyBpbnQgc2N0cF9nZXRzb2Nrb3B0X2ZyYWdtZW50X2ludGVybGVhdmUoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGVuLAorCQkJCQkgICAgICAgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IF9fdXNlciAqb3B0bGVuKQoreworCWludCB2YWw7CisKKwlpZiAobGVuIDwgc2l6ZW9mKGludCkpCisJCXJldHVybiAtRUlOVkFMOworCisJbGVuID0gc2l6ZW9mKGludCk7CisKKwl2YWwgPSBzY3RwX3NrKHNrKS0+ZnJhZ19pbnRlcmxlYXZlOworCWlmIChwdXRfdXNlcihsZW4sIG9wdGxlbikpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChjb3B5X3RvX3VzZXIob3B0dmFsLCAmdmFsLCBsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiAwOworfQorCisvKgorICogNy4xLjI1LiAgU2V0IG9yIEdldCB0aGUgc2N0cCBwYXJ0aWFsIGRlbGl2ZXJ5IHBvaW50CisgKiAoY2hhcHRlciBhbmQgdmVyc2UgaXMgcXVvdGVkIGF0IHNjdHBfc2V0c29ja29wdF9wYXJ0aWFsX2RlbGl2ZXJ5X3BvaW50KCkpCisgKi8KK3N0YXRpYyBpbnQgc2N0cF9nZXRzb2Nrb3B0X3BhcnRpYWxfZGVsaXZlcnlfcG9pbnQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGVuLAorCQkJCQkJICBjaGFyIF9fdXNlciAqb3B0dmFsLAorCQkJCQkJICBpbnQgX191c2VyICpvcHRsZW4pCit7CisgICAgICAgIHUzMiB2YWw7CisKKwlpZiAobGVuIDwgc2l6ZW9mKHUzMikpCisJCXJldHVybiAtRUlOVkFMOworCisJbGVuID0gc2l6ZW9mKHUzMik7CisKKwl2YWwgPSBzY3RwX3NrKHNrKS0+cGRfcG9pbnQ7CisJaWYgKHB1dF91c2VyKGxlbiwgb3B0bGVuKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKGNvcHlfdG9fdXNlcihvcHR2YWwsICZ2YWwsIGxlbikpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIC1FTk9UU1VQUDsKK30KKworLyoKKyAqIDcuMS4yOC4gIFNldCBvciBHZXQgdGhlIG1heGltdW0gYnVyc3QgKFNDVFBfTUFYX0JVUlNUKQorICogKGNoYXB0ZXIgYW5kIHZlcnNlIGlzIHF1b3RlZCBhdCBzY3RwX3NldHNvY2tvcHRfbWF4YnVyc3QoKSkKKyAqLworc3RhdGljIGludCBzY3RwX2dldHNvY2tvcHRfbWF4YnVyc3Qoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGVuLAorCQkJCSAgICBjaGFyIF9fdXNlciAqb3B0dmFsLAorCQkJCSAgICBpbnQgX191c2VyICpvcHRsZW4pCit7CisgICAgICAgIGludCB2YWw7CisKKwlpZiAobGVuIDwgc2l6ZW9mKGludCkpCisJCXJldHVybiAtRUlOVkFMOworCisJbGVuID0gc2l6ZW9mKGludCk7CisKKwl2YWwgPSBzY3RwX3NrKHNrKS0+bWF4X2J1cnN0OworCWlmIChwdXRfdXNlcihsZW4sIG9wdGxlbikpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChjb3B5X3RvX3VzZXIob3B0dmFsLCAmdmFsLCBsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiAtRU5PVFNVUFA7Cit9CisKIFNDVFBfU1RBVElDIGludCBzY3RwX2dldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAogCQkJCWNoYXIgX191c2VyICpvcHR2YWwsIGludCBfX3VzZXIgKm9wdGxlbikKIHsKQEAgLTQ2NDgsMTAgKzQ4ODMsMjEgQEAKIAljYXNlIFNDVFBfQ09OVEVYVDoKIAkJcmV0dmFsID0gc2N0cF9nZXRzb2Nrb3B0X2NvbnRleHQoc2ssIGxlbiwgb3B0dmFsLCBvcHRsZW4pOwogCQlicmVhazsKKwljYXNlIFNDVFBfRlJBR01FTlRfSU5URVJMRUFWRToKKwkJcmV0dmFsID0gc2N0cF9nZXRzb2Nrb3B0X2ZyYWdtZW50X2ludGVybGVhdmUoc2ssIGxlbiwgb3B0dmFsLAorCQkJCQkJCSAgICAgb3B0bGVuKTsKKwkJYnJlYWs7CisJY2FzZSBTQ1RQX1BBUlRJQUxfREVMSVZFUllfUE9JTlQ6CisJCXJldHZhbCA9IHNjdHBfZ2V0c29ja29wdF9wYXJ0aWFsX2RlbGl2ZXJ5X3BvaW50KHNrLCBsZW4sIG9wdHZhbCwKKwkJCQkJCQkJb3B0bGVuKTsKKwkJYnJlYWs7CisJY2FzZSBTQ1RQX01BWF9CVVJTVDoKKwkJcmV0dmFsID0gc2N0cF9nZXRzb2Nrb3B0X21heGJ1cnN0KHNrLCBsZW4sIG9wdHZhbCwgb3B0bGVuKTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dmFsID0gLUVOT1BST1RPT1BUOwogCQlicmVhazsKLQl9OworCX0KIAogCXNjdHBfcmVsZWFzZV9zb2NrKHNrKTsKIAlyZXR1cm4gcmV0dmFsOwpAQCAtNDk3Niw3ICs1MjIyLDggQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJYnJlYWs7Ci0JfTsKKwl9CisKIAlpZiAoZXJyKQogCQlnb3RvIGNsZWFudXA7CiAKQEAgLTUyMzksNyArNTQ4Niw3IEBACiAKIAkJZGVmYXVsdDoKIAkJCXJldHVybiAtRUlOVkFMOwotCQl9OworCQl9CiAJfQogCXJldHVybiAwOwogfQpAQCAtNTc0Miw5ICs1OTg5LDkgQEAKIAkgKiAzKSBQZWVsaW5nIG9mZiBub24tcGFydGlhbCBkZWxpdmVyeTsgbW92ZSBwZF9sb2JieSB0byByZWNlaXZlX3F1ZXVlLgogCSAqLwogCXNrYl9xdWV1ZV9oZWFkX2luaXQoJm5ld3NwLT5wZF9sb2JieSk7Ci0Jc2N0cF9zayhuZXdzayktPnBkX21vZGUgPSBhc3NvYy0+dWxwcS5wZF9tb2RlOworCWF0b21pY19zZXQoJnNjdHBfc2sobmV3c2spLT5wZF9tb2RlLCBhc3NvYy0+dWxwcS5wZF9tb2RlKTsKIAotCWlmIChzY3RwX3NrKG9sZHNrKS0+cGRfbW9kZSkgeworCWlmIChhdG9taWNfcmVhZCgmc2N0cF9zayhvbGRzayktPnBkX21vZGUpKSB7CiAJCXN0cnVjdCBza19idWZmX2hlYWQgKnF1ZXVlOwogCiAJCS8qIERlY2lkZSB3aGljaCBxdWV1ZSB0byBtb3ZlIHBkX2xvYmJ5IHNrYnMgdG8uICovCkBAIC01NzcwLDcgKzYwMTcsNyBAQAogCQkgKiBkZWxpdmVyeSB0byBmaW5pc2guCiAJCSAqLwogCQlpZiAoYXNzb2MtPnVscHEucGRfbW9kZSkKLQkJCXNjdHBfY2xlYXJfcGQob2xkc2spOworCQkJc2N0cF9jbGVhcl9wZChvbGRzaywgTlVMTCk7CiAKIAl9CiAKZGlmZiAtLWdpdCBhL25ldC9zY3RwL3RyYW5zcG9ydC5jIGIvbmV0L3NjdHAvdHJhbnNwb3J0LmMKaW5kZXggNGQ4YzJhYi4uOTYxZGYyNyAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvdHJhbnNwb3J0LmMKKysrIGIvbmV0L3NjdHAvdHJhbnNwb3J0LmMKQEAgLTUwNyw3ICs1MDcsNyBAQAogCQkJdHJhbnNwb3J0LT5jd25kID0gbWF4KHRyYW5zcG9ydC0+Y3duZC8yLAogCQkJCQkJIDQqdHJhbnNwb3J0LT5hc29jLT5wYXRobXR1KTsKIAkJYnJlYWs7Ci0JfTsKKwl9CiAKIAl0cmFuc3BvcnQtPnBhcnRpYWxfYnl0ZXNfYWNrZWQgPSAwOwogCVNDVFBfREVCVUdfUFJJTlRLKCIlczogdHJhbnNwb3J0OiAlcCByZWFzb246ICVkIGN3bmQ6ICIKZGlmZiAtLWdpdCBhL25ldC9zY3RwL3VscGV2ZW50LmMgYi9uZXQvc2N0cC91bHBldmVudC5jCmluZGV4IDJlMTFiYzguLjY2MWVhMmQgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL3VscGV2ZW50LmMKKysrIGIvbmV0L3NjdHAvdWxwZXZlbnQuYwpAQCAtMTMxLDE5ICsxMzEsNTQgQEAKIHN0cnVjdCBzY3RwX3VscGV2ZW50ICAqc2N0cF91bHBldmVudF9tYWtlX2Fzc29jX2NoYW5nZSgKIAljb25zdCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKIAlfX3UxNiBmbGFncywgX191MTYgc3RhdGUsIF9fdTE2IGVycm9yLCBfX3UxNiBvdXRib3VuZCwKLQlfX3UxNiBpbmJvdW5kLCBnZnBfdCBnZnApCisJX191MTYgaW5ib3VuZCwgc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rLCBnZnBfdCBnZnApCiB7CiAJc3RydWN0IHNjdHBfdWxwZXZlbnQgKmV2ZW50OwogCXN0cnVjdCBzY3RwX2Fzc29jX2NoYW5nZSAqc2FjOwogCXN0cnVjdCBza19idWZmICpza2I7CiAKLQlldmVudCA9IHNjdHBfdWxwZXZlbnRfbmV3KHNpemVvZihzdHJ1Y3Qgc2N0cF9hc3NvY19jaGFuZ2UpLAorCS8qIElmIHRoZSBsb3dlciBsYXllciBwYXNzZWQgaW4gdGhlIGNodW5rLCBpdCB3aWxsIGJlCisJICogYW4gQUJPUlQsIHNvIHdlIG5lZWQgdG8gaW5jbHVkZSBpdCBpbiB0aGUgc2FjX2luZm8uCisJICovCisJaWYgKGNodW5rKSB7CisJCS8qIHNjdHBfaW5xdV9wb3AoKSBoYXMgYWxscmVhZHkgcHVsbGVkIG9mZiB0aGUgY2h1bmsKKwkJICogaGVhZGVyLiAgV2UgbmVlZCB0byBwdXQgaXQgYmFjayB0ZW1wb3JhcmlseQorCQkgKi8KKwkJc2tiX3B1c2goY2h1bmstPnNrYiwgc2l6ZW9mKHNjdHBfY2h1bmtoZHJfdCkpOworCisJCS8qIENvcHkgdGhlIGNodW5rIGRhdGEgdG8gYSBuZXcgc2tiIGFuZCByZXNlcnZlIGVub3VnaAorCQkgKiBoZWFkIHJvb20gdG8gdXNlIGFzIG5vdGlmaWNhdGlvbi4KKwkJICovCisJCXNrYiA9IHNrYl9jb3B5X2V4cGFuZChjaHVuay0+c2tiLAorCQkJCSAgICAgIHNpemVvZihzdHJ1Y3Qgc2N0cF9hc3NvY19jaGFuZ2UpLCAwLCBnZnApOworCisJCWlmICghc2tiKQorCQkJZ290byBmYWlsOworCisJCS8qIHB1dCBiYWNrIHRoZSBjaHVuayBoZWFkZXIgbm93IHRoYXQgd2UgaGF2ZSBhIGNvcHkgKi8KKwkJc2tiX3B1bGwoY2h1bmstPnNrYiwgc2l6ZW9mKHNjdHBfY2h1bmtoZHJfdCkpOworCisJCS8qIEVtYmVkIHRoZSBldmVudCBmaWVsZHMgaW5zaWRlIHRoZSBjbG9uZWQgc2tiLiAgKi8KKwkJZXZlbnQgPSBzY3RwX3NrYjJldmVudChza2IpOworCQlzY3RwX3VscGV2ZW50X2luaXQoZXZlbnQsIE1TR19OT1RJRklDQVRJT04sIHNrYi0+dHJ1ZXNpemUpOworCisJCS8qIEluY2x1ZGUgdGhlIG5vdGlmaWNhdGlvbiBzdHJ1Y3R1cmUgKi8KKwkJc2FjID0gKHN0cnVjdCBzY3RwX2Fzc29jX2NoYW5nZSAqKQorCQkJc2tiX3B1c2goc2tiLCBzaXplb2Yoc3RydWN0IHNjdHBfYXNzb2NfY2hhbmdlKSk7CisKKwkJLyogVHJpbSB0aGUgYnVmZmVyIHRvIHRoZSByaWdodCBsZW5ndGguICAqLworCQlza2JfdHJpbShza2IsIHNpemVvZihzdHJ1Y3Qgc2N0cF9hc3NvY19jaGFuZ2UpICsKKwkJCSBudG9ocyhjaHVuay0+Y2h1bmtfaGRyLT5sZW5ndGgpKTsKKwl9IGVsc2UgeworCQlldmVudCA9IHNjdHBfdWxwZXZlbnRfbmV3KHNpemVvZihzdHJ1Y3Qgc2N0cF9hc3NvY19jaGFuZ2UpLAogCQkJCSAgTVNHX05PVElGSUNBVElPTiwgZ2ZwKTsKLQlpZiAoIWV2ZW50KQotCQlnb3RvIGZhaWw7Ci0Jc2tiID0gc2N0cF9ldmVudDJza2IoZXZlbnQpOwotCXNhYyA9IChzdHJ1Y3Qgc2N0cF9hc3NvY19jaGFuZ2UgKikKLQkJc2tiX3B1dChza2IsIHNpemVvZihzdHJ1Y3Qgc2N0cF9hc3NvY19jaGFuZ2UpKTsKKwkJaWYgKCFldmVudCkKKwkJCWdvdG8gZmFpbDsKKworCQlza2IgPSBzY3RwX2V2ZW50MnNrYihldmVudCk7CisJCXNhYyA9IChzdHJ1Y3Qgc2N0cF9hc3NvY19jaGFuZ2UgKikgc2tiX3B1dChza2IsCisJCQkJCXNpemVvZihzdHJ1Y3Qgc2N0cF9hc3NvY19jaGFuZ2UpKTsKKwl9CiAKIAkvKiBTb2NrZXQgRXh0ZW5zaW9ucyBmb3IgU0NUUAogCSAqIDUuMy4xLjEgU0NUUF9BU1NPQ19DSEFOR0UKZGlmZiAtLWdpdCBhL25ldC9zY3RwL3VscHF1ZXVlLmMgYi9uZXQvc2N0cC91bHBxdWV1ZS5jCmluZGV4IGIyOWUzZTQuLjM0ZWI5NzcgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL3VscHF1ZXVlLmMKKysrIGIvbmV0L3NjdHAvdWxwcXVldWUuYwpAQCAtMTM4LDI2ICsxMzgsNTkgQEAKIC8qIENsZWFyIHRoZSBwYXJ0aWFsIGRlbGl2ZXJ5IG1vZGUgZm9yIHRoaXMgc29ja2V0LiAgIE5vdGU6IFRoaXMKICAqIGFzc3VtZXMgdGhhdCBubyBhc3NvY2lhdGlvbiBpcyBjdXJyZW50bHkgaW4gcGFydGlhbCBkZWxpdmVyeSBtb2RlLgogICovCi1pbnQgc2N0cF9jbGVhcl9wZChzdHJ1Y3Qgc29jayAqc2spCitpbnQgc2N0cF9jbGVhcl9wZChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jKQogewogCXN0cnVjdCBzY3RwX3NvY2sgKnNwID0gc2N0cF9zayhzayk7CiAKLQlzcC0+cGRfbW9kZSA9IDA7Ci0JaWYgKCFza2JfcXVldWVfZW1wdHkoJnNwLT5wZF9sb2JieSkpIHsKLQkJc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKLQkJc2N0cF9za2JfbGlzdF90YWlsKCZzcC0+cGRfbG9iYnksICZzay0+c2tfcmVjZWl2ZV9xdWV1ZSk7Ci0JCWxpc3QgPSAoc3RydWN0IGxpc3RfaGVhZCAqKSZzY3RwX3NrKHNrKS0+cGRfbG9iYnk7Ci0JCUlOSVRfTElTVF9IRUFEKGxpc3QpOwotCQlyZXR1cm4gMTsKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmc3AtPnBkX21vZGUpKSB7CisJCS8qIFRoaXMgbWVhbnMgdGhlcmUgYXJlIG5vIG90aGVyIGFzc29jaWF0aW9ucyBpbiBQRCwgc28KKwkJICogd2UgY2FuIGdvIGFoZWFkIGFuZCBjbGVhciBvdXQgdGhlIGxvYmJ5IGluIG9uZSBzaG90CisJCSAqLworCQlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmc3AtPnBkX2xvYmJ5KSkgeworCQkJc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKKwkJCXNjdHBfc2tiX2xpc3RfdGFpbCgmc3AtPnBkX2xvYmJ5LCAmc2stPnNrX3JlY2VpdmVfcXVldWUpOworCQkJbGlzdCA9IChzdHJ1Y3QgbGlzdF9oZWFkICopJnNjdHBfc2soc2spLT5wZF9sb2JieTsKKwkJCUlOSVRfTElTVF9IRUFEKGxpc3QpOworCQkJcmV0dXJuIDE7CisJCX0KKwl9IGVsc2UgeworCQkvKiBUaGVyZSBhcmUgb3RoZXIgYXNzb2NpYXRpb25zIGluIFBELCBzbyB3ZSBvbmx5IG5lZWQgdG8KKwkJICogcHVsbCBzdHVmZiBvdXQgb2YgdGhlIGxvYmJ5IHRoYXQgYmVsb25ncyB0byB0aGUKKwkJICogYXNzb2NpYXRpb25zIHRoYXQgaXMgZXhpdGluZyBQRCAoYWxsIG9mIGl0cyBub3RpZmljYXRpb25zCisJCSAqIGFyZSBwb3N0ZWQgaGVyZSkuCisJCSAqLworCQlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmc3AtPnBkX2xvYmJ5KSAmJiBhc29jKSB7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAqdG1wOworCQkJc3RydWN0IHNjdHBfdWxwZXZlbnQgKmV2ZW50OworCisJCQlzY3RwX3NrYl9mb3JfZWFjaChza2IsICZzcC0+cGRfbG9iYnksIHRtcCkgeworCQkJCWV2ZW50ID0gc2N0cF9za2IyZXZlbnQoc2tiKTsKKwkJCQlpZiAoZXZlbnQtPmFzb2MgPT0gYXNvYykgeworCQkJCQlfX3NrYl91bmxpbmsoc2tiLCAmc3AtPnBkX2xvYmJ5KTsKKwkJCQkJX19za2JfcXVldWVfdGFpbCgmc2stPnNrX3JlY2VpdmVfcXVldWUsCisJCQkJCQkJIHNrYik7CisJCQkJfQorCQkJfQorCQl9CiAJfQorCiAJcmV0dXJuIDA7CiB9CiAKKy8qIFNldCB0aGUgcGRfbW9kZSBvbiB0aGUgc29ja2V0IGFuZCB1bHBxICovCitzdGF0aWMgdm9pZCBzY3RwX3VscHFfc2V0X3BkKHN0cnVjdCBzY3RwX3VscHEgKnVscHEpCit7CisJc3RydWN0IHNjdHBfc29jayAqc3AgPSBzY3RwX3NrKHVscHEtPmFzb2MtPmJhc2Uuc2spOworCisJYXRvbWljX2luYygmc3AtPnBkX21vZGUpOworCXVscHEtPnBkX21vZGUgPSAxOworfQorCiAvKiBDbGVhciB0aGUgcGRfbW9kZSBhbmQgcmVzdGFydCBhbnkgcGVuZGluZyBtZXNzYWdlcyB3YWl0aW5nIGZvciBkZWxpdmVyeS4gKi8KIHN0YXRpYyBpbnQgc2N0cF91bHBxX2NsZWFyX3BkKHN0cnVjdCBzY3RwX3VscHEgKnVscHEpCiB7CiAJdWxwcS0+cGRfbW9kZSA9IDA7Ci0JcmV0dXJuIHNjdHBfY2xlYXJfcGQodWxwcS0+YXNvYy0+YmFzZS5zayk7CisJcmV0dXJuIHNjdHBfY2xlYXJfcGQodWxwcS0+YXNvYy0+YmFzZS5zaywgdWxwcS0+YXNvYyk7CiB9CiAKIC8qIElmIHRoZSBTS0Igb2YgJ2V2ZW50JyBpcyBvbiBhIGxpc3QsIGl0IGlzIHRoZSBmaXJzdCBzdWNoIG1lbWJlcgpAQCAtMTg3LDI1ICsyMjAsMzUgQEAKIAkgKiB0aGUgYXNzb2NpYXRpb24gdGhlIGNhdXNlIG9mIHRoZSBwYXJ0aWFsIGRlbGl2ZXJ5LgogCSAqLwogCi0JaWYgKCFzY3RwX3NrKHNrKS0+cGRfbW9kZSkgeworCWlmIChhdG9taWNfcmVhZCgmc2N0cF9zayhzayktPnBkX21vZGUpID09IDApIHsKIAkJcXVldWUgPSAmc2stPnNrX3JlY2VpdmVfcXVldWU7Ci0JfSBlbHNlIGlmICh1bHBxLT5wZF9tb2RlKSB7Ci0JCS8qIElmIHRoZSBhc3NvY2lhdGlvbiBpcyBpbiBwYXJ0aWFsIGRlbGl2ZXJ5LCB3ZQotCQkgKiBuZWVkIHRvIGZpbmlzaCBkZWxpdmVyaW5nIHRoZSBwYXJ0aWFsbHkgcHJvY2Vzc2VkCi0JCSAqIHBhY2tldCBiZWZvcmUgcGFzc2luZyBhbnkgb3RoZXIgZGF0YS4gIFRoaXMgaXMKLQkJICogYmVjYXVzZSB3ZSBkb24ndCB0cnVseSBzdXBwb3J0IHN0cmVhbSBpbnRlcmxlYXZpbmcuCi0JCSAqLwotCQlpZiAoKGV2ZW50LT5tc2dfZmxhZ3MgJiBNU0dfTk9USUZJQ0FUSU9OKSB8fAotCQkgICAgKFNDVFBfREFUQV9OT1RfRlJBRyA9PQotCQkJICAgIChldmVudC0+bXNnX2ZsYWdzICYgU0NUUF9EQVRBX0ZSQUdfTUFTSykpKQotCQkJcXVldWUgPSAmc2N0cF9zayhzayktPnBkX2xvYmJ5OwotCQllbHNlIHsKLQkJCWNsZWFyX3BkID0gZXZlbnQtPm1zZ19mbGFncyAmIE1TR19FT1I7Ci0JCQlxdWV1ZSA9ICZzay0+c2tfcmVjZWl2ZV9xdWV1ZTsKKwl9IGVsc2UgeworCQlpZiAodWxwcS0+cGRfbW9kZSkgeworCQkJLyogSWYgdGhlIGFzc29jaWF0aW9uIGlzIGluIHBhcnRpYWwgZGVsaXZlcnksIHdlCisJCQkgKiBuZWVkIHRvIGZpbmlzaCBkZWxpdmVyaW5nIHRoZSBwYXJ0aWFsbHkgcHJvY2Vzc2VkCisJCQkgKiBwYWNrZXQgYmVmb3JlIHBhc3NpbmcgYW55IG90aGVyIGRhdGEuICBUaGlzIGlzCisJCQkgKiBiZWNhdXNlIHdlIGRvbid0IHRydWx5IHN1cHBvcnQgc3RyZWFtIGludGVybGVhdmluZy4KKwkJCSAqLworCQkJaWYgKChldmVudC0+bXNnX2ZsYWdzICYgTVNHX05PVElGSUNBVElPTikgfHwKKwkJCSAgICAoU0NUUF9EQVRBX05PVF9GUkFHID09CisJCQkJICAgIChldmVudC0+bXNnX2ZsYWdzICYgU0NUUF9EQVRBX0ZSQUdfTUFTSykpKQorCQkJCXF1ZXVlID0gJnNjdHBfc2soc2spLT5wZF9sb2JieTsKKwkJCWVsc2UgeworCQkJCWNsZWFyX3BkID0gZXZlbnQtPm1zZ19mbGFncyAmIE1TR19FT1I7CisJCQkJcXVldWUgPSAmc2stPnNrX3JlY2VpdmVfcXVldWU7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogSWYgZnJhZ21lbnQgaW50ZXJsZWF2ZSBpcyBlbmFibGVkLCB3ZQorCQkJICogY2FuIHF1ZXVlIHRoaXMgdG8gdGhlIHJlY2lldmUgcXVldWUgaW5zdGVhZAorCQkJICogb2YgdGhlIGxvYmJ5LgorCQkJICovCisJCQlpZiAoc2N0cF9zayhzayktPmZyYWdfaW50ZXJsZWF2ZSkKKwkJCQlxdWV1ZSA9ICZzay0+c2tfcmVjZWl2ZV9xdWV1ZTsKKwkJCWVsc2UKKwkJCQlxdWV1ZSA9ICZzY3RwX3NrKHNrKS0+cGRfbG9iYnk7CiAJCX0KLQl9IGVsc2UKLQkJcXVldWUgPSAmc2N0cF9zayhzayktPnBkX2xvYmJ5OwotCisJfQogCiAJLyogSWYgd2UgYXJlIGhhcnZlc3RpbmcgbXVsdGlwbGUgc2ticyB0aGV5IHdpbGwgYmUKIAkgKiBjb2xsZWN0ZWQgb24gYSBsaXN0LgpAQCAtMzQ4LDcgKzM5MSw3IEBACiAJCQlicmVhazsKIAkJcG9zLT5uZXh0ID0gcG5leHQ7CiAJCXBvcyA9IHBuZXh0OwotCX07CisJfQogCiAJZXZlbnQgPSBzY3RwX3NrYjJldmVudChmX2ZyYWcpOwogCVNDVFBfSU5DX1NUQVRTKFNDVFBfTUlCX1JFQVNNVVNSTVNHUyk7CkBAIC0zNjcsNiArNDEwLDExIEBACiAJc3RydWN0IHNrX2J1ZmYgKmZpcnN0X2ZyYWcgPSBOVUxMOwogCV9fdTMyIGN0c24sIG5leHRfdHNuOwogCXN0cnVjdCBzY3RwX3VscGV2ZW50ICpyZXR2YWwgPSBOVUxMOworCXN0cnVjdCBza19idWZmICpwZF9maXJzdCA9IE5VTEw7CisJc3RydWN0IHNrX2J1ZmYgKnBkX2xhc3QgPSBOVUxMOworCXNpemVfdCBwZF9sZW4gPSAwOworCXN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jOworCXUzMiBwZF9wb2ludDsKIAogCS8qIEluaXRpYWxpemVkIHRvIDAganVzdCB0byBhdm9pZCBjb21waWxlciB3YXJuaW5nIG1lc3NhZ2UuICBXaWxsCiAJICogbmV2ZXIgYmUgdXNlZCB3aXRoIHRoaXMgdmFsdWUuIEl0IGlzIHJlZmVyZW5jZWQgb25seSBhZnRlciBpdApAQCAtMzgyLDYgKzQzMCwxMCBAQAogCSAqIHdlIGV4cGVjdCB0byBmaW5kIHRoZSByZW1haW5pbmcgbWlkZGxlIGZyYWdtZW50cyBhbmQgdGhlIGxhc3QKIAkgKiBmcmFnbWVudCBpbiBvcmRlci4gSWYgbm90LCBmaXJzdF9mcmFnIGlzIHJlc2V0IHRvIE5VTEwgYW5kIHdlCiAJICogc3RhcnQgdGhlIG5leHQgcGFzcyB3aGVuIHdlIGZpbmQgYW5vdGhlciBmaXJzdCBmcmFnbWVudC4KKwkgKgorCSAqIFRoZXJlIGlzIGEgcG90ZW50aWFsIHRvIGRvIHBhcnRpYWwgZGVsaXZlcnkgaWYgdXNlciBzZXRzCisJICogU0NUUF9QQVJUSUFMX0RFTElWRVJZX1BPSU5UIG9wdGlvbi4gTGV0cyBjb3VudCBzb21lIHRoaW5ncyBoZXJlCisJICogdG8gc2VlIGlmIGNhbiBkbyBQRC4KIAkgKi8KIAlza2JfcXVldWVfd2FsaygmdWxwcS0+cmVhc20sIHBvcykgewogCQljZXZlbnQgPSBzY3RwX3NrYjJldmVudChwb3MpOwpAQCAtMzg5LDE0ICs0NDEsMzIgQEAKIAogCQlzd2l0Y2ggKGNldmVudC0+bXNnX2ZsYWdzICYgU0NUUF9EQVRBX0ZSQUdfTUFTSykgewogCQljYXNlIFNDVFBfREFUQV9GSVJTVF9GUkFHOgorCQkJLyogSWYgdGhpcyAiRklSU1RfRlJBRyIgaXMgdGhlIGZpcnN0CisJCQkgKiBlbGVtZW50IGluIHRoZSBxdWV1ZSwgdGhlbiBjb3VudCBpdCB0b3dhcmRzCisJCQkgKiBwb3NzaWJsZSBQRC4KKwkJCSAqLworCQkJaWYgKHBvcyA9PSB1bHBxLT5yZWFzbS5uZXh0KSB7CisJCQkgICAgcGRfZmlyc3QgPSBwb3M7CisJCQkgICAgcGRfbGFzdCA9IHBvczsKKwkJCSAgICBwZF9sZW4gPSBwb3MtPmxlbjsKKwkJCX0gZWxzZSB7CisJCQkgICAgcGRfZmlyc3QgPSBOVUxMOworCQkJICAgIHBkX2xhc3QgPSBOVUxMOworCQkJICAgIHBkX2xlbiA9IDA7CisJCQl9CisKIAkJCWZpcnN0X2ZyYWcgPSBwb3M7CiAJCQluZXh0X3RzbiA9IGN0c24gKyAxOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBTQ1RQX0RBVEFfTUlERExFX0ZSQUc6Ci0JCQlpZiAoKGZpcnN0X2ZyYWcpICYmIChjdHNuID09IG5leHRfdHNuKSkKKwkJCWlmICgoZmlyc3RfZnJhZykgJiYgKGN0c24gPT0gbmV4dF90c24pKSB7CiAJCQkJbmV4dF90c24rKzsKLQkJCWVsc2UKKwkJCQlpZiAocGRfZmlyc3QpIHsKKwkJCQkgICAgcGRfbGFzdCA9IHBvczsKKwkJCQkgICAgcGRfbGVuICs9IHBvcy0+bGVuOworCQkJCX0KKwkJCX0gZWxzZQogCQkJCWZpcnN0X2ZyYWcgPSBOVUxMOwogCQkJYnJlYWs7CiAKQEAgLTQwNiw4ICs0NzYsMjkgQEAKIAkJCWVsc2UKIAkJCQlmaXJzdF9mcmFnID0gTlVMTDsKIAkJCWJyZWFrOwotCQl9OworCQl9CisJfQogCisJYXNvYyA9IHVscHEtPmFzb2M7CisJaWYgKHBkX2ZpcnN0KSB7CisJCS8qIE1ha2Ugc3VyZSB3ZSBjYW4gZW50ZXIgcGFydGlhbCBkZWxpdmVyLgorCQkgKiBXZSBjYW4gdHJpZ2dlciBwYXJ0aWFsIGRlbGl2ZXJ5IG9ubHkgaWYgZnJhbWdlbnQKKwkJICogaW50ZXJsZWF2ZSBpcyBzZXQsIG9yIHRoZSBzb2NrZXQgaXMgbm90IGFscmVhZHkKKwkJICogaW4gIHBhcnRpYWwgZGVsaXZlcnkuCisJCSAqLworCQlpZiAoIXNjdHBfc2soYXNvYy0+YmFzZS5zayktPmZyYWdfaW50ZXJsZWF2ZSAmJgorCQkgICAgYXRvbWljX3JlYWQoJnNjdHBfc2soYXNvYy0+YmFzZS5zayktPnBkX21vZGUpKQorCQkJZ290byBkb25lOworCisJCWNldmVudCA9IHNjdHBfc2tiMmV2ZW50KHBkX2ZpcnN0KTsKKwkJcGRfcG9pbnQgPSBzY3RwX3NrKGFzb2MtPmJhc2Uuc2spLT5wZF9wb2ludDsKKwkJaWYgKHBkX3BvaW50ICYmIHBkX3BvaW50IDw9IHBkX2xlbikgeworCQkJcmV0dmFsID0gc2N0cF9tYWtlX3JlYXNzZW1ibGVkX2V2ZW50KCZ1bHBxLT5yZWFzbSwKKwkJCQkJCQkgICAgIHBkX2ZpcnN0LAorCQkJCQkJCSAgICAgcGRfbGFzdCk7CisJCQlpZiAocmV0dmFsKQorCQkJCXNjdHBfdWxwcV9zZXRfcGQodWxwcSk7CisJCX0KIAl9CiBkb25lOgogCXJldHVybiByZXR2YWw7CkBAIC00NjUsNyArNTU2LDcgQEAKIAkJCWdvdG8gZG9uZTsKIAkJZGVmYXVsdDoKIAkJCXJldHVybiBOVUxMOwotCQl9OworCQl9CiAJfQogCiAJLyogV2UgaGF2ZSB0aGUgcmVhc3NlbWJsZWQgZXZlbnQuIFRoZXJlIGlzIG5vIG5lZWQgdG8gbG9vawpAQCAtNTU3LDcgKzY0OCw3IEBACiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCXJldHVybiBOVUxMOwotCQl9OworCQl9CiAJfQogCiAJLyogV2UgaGF2ZSB0aGUgcmVhc3NlbWJsZWQgZXZlbnQuIFRoZXJlIGlzIG5vIG5lZWQgdG8gbG9vawpAQCAtODI2LDE5ICs5MTcsMjkgQEAKIHsKIAlzdHJ1Y3Qgc2N0cF91bHBldmVudCAqZXZlbnQ7CiAJc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2M7CisJc3RydWN0IHNjdHBfc29jayAqc3A7CiAKIAlhc29jID0gdWxwcS0+YXNvYzsKKwlzcCA9IHNjdHBfc2soYXNvYy0+YmFzZS5zayk7CiAKLQkvKiBBcmUgd2UgYWxyZWFkeSBpbiBwYXJ0aWFsIGRlbGl2ZXJ5IG1vZGU/ICAqLwotCWlmICghc2N0cF9zayhhc29jLT5iYXNlLnNrKS0+cGRfbW9kZSkgeworCS8qIElmIHRoZSBhc3NvY2lhdGlvbiBpcyBhbHJlYWR5IGluIFBhcnRpYWwgRGVsaXZlcnkgbW9kZQorCSAqIHdlIGhhdmUgbm90aW5nIHRvIGRvLgorCSAqLworCWlmICh1bHBxLT5wZF9tb2RlKQorCQlyZXR1cm47CiAKKwkvKiBJZiB0aGUgdXNlciBlbmFibGVkIGZyYWdtZW50IGludGVybGVhdmUgc29ja2V0IG9wdGlvbiwKKwkgKiBtdWx0aXBsZSBhc3NvY2lhdGlvbnMgY2FuIGVudGVyIHBhcnRpYWwgZGVsaXZlcnkuCisJICogT3RoZXJ3aXNlLCB3ZSBjYW4gb25seSBlbnRlciBwYXJ0aWFsIGRlbGl2ZXJ5IGlmIHRoZQorCSAqIHNvY2tldCBpcyBub3QgaW4gcGFydGlhbCBkZWxpdmVyIG1vZGUuCisJICovCisJaWYgKHNwLT5mcmFnX2ludGVybGVhdmUgfHwgYXRvbWljX3JlYWQoJnNwLT5wZF9tb2RlKSA9PSAwKSB7CiAJCS8qIElzIHBhcnRpYWwgZGVsaXZlcnkgcG9zc2libGU/ICAqLwogCQlldmVudCA9IHNjdHBfdWxwcV9yZXRyaWV2ZV9maXJzdCh1bHBxKTsKIAkJLyogU2VuZCBldmVudCB0byB0aGUgVUxQLiAgICovCiAJCWlmIChldmVudCkgewogCQkJc2N0cF91bHBxX3RhaWxfZXZlbnQodWxwcSwgZXZlbnQpOwotCQkJc2N0cF9zayhhc29jLT5iYXNlLnNrKS0+cGRfbW9kZSA9IDE7Ci0JCQl1bHBxLT5wZF9tb2RlID0gMTsKKwkJCXNjdHBfdWxwcV9zZXRfcGQodWxwcSk7CiAJCQlyZXR1cm47CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9uZXQvc29ja2V0LmMgYi9uZXQvc29ja2V0LmMKaW5kZXggZWE4ZjgxYS4uMWFkNjJjMCAxMDA2NDQKLS0tIGEvbmV0L3NvY2tldC5jCisrKyBiL25ldC9zb2NrZXQuYwpAQCAtNTg1LDYgKzU4NSwzNyBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKKy8qCisgKiBjYWxsZWQgZnJvbSBzb2NrX3JlY3ZfdGltZXN0YW1wKCkgaWYgc29ja19mbGFnKHNrLCBTT0NLX1JDVlRTVEFNUCkKKyAqLwordm9pZCBfX3NvY2tfcmVjdl90aW1lc3RhbXAoc3RydWN0IG1zZ2hkciAqbXNnLCBzdHJ1Y3Qgc29jayAqc2ssCisJc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlrdGltZV90IGt0ID0gc2tiLT50c3RhbXA7CisKKwlpZiAoIXNvY2tfZmxhZyhzaywgU09DS19SQ1ZUU1RBTVBOUykpIHsKKwkJc3RydWN0IHRpbWV2YWwgdHY7CisJCS8qIFJhY2Ugb2NjdXJyZWQgYmV0d2VlbiB0aW1lc3RhbXAgZW5hYmxpbmcgYW5kIHBhY2tldAorCQkgICByZWNlaXZpbmcuICBGaWxsIGluIHRoZSBjdXJyZW50IHRpbWUgZm9yIG5vdy4gKi8KKwkJaWYgKGt0LnR2NjQgPT0gMCkKKwkJCWt0ID0ga3RpbWVfZ2V0X3JlYWwoKTsKKwkJc2tiLT50c3RhbXAgPSBrdDsKKwkJdHYgPSBrdGltZV90b190aW1ldmFsKGt0KTsKKwkJcHV0X2Ntc2cobXNnLCBTT0xfU09DS0VULCBTQ01fVElNRVNUQU1QLCBzaXplb2YodHYpLCAmdHYpOworCX0gZWxzZSB7CisJCXN0cnVjdCB0aW1lc3BlYyB0czsKKwkJLyogUmFjZSBvY2N1cnJlZCBiZXR3ZWVuIHRpbWVzdGFtcCBlbmFibGluZyBhbmQgcGFja2V0CisJCSAgIHJlY2VpdmluZy4gIEZpbGwgaW4gdGhlIGN1cnJlbnQgdGltZSBmb3Igbm93LiAqLworCQlpZiAoa3QudHY2NCA9PSAwKQorCQkJa3QgPSBrdGltZV9nZXRfcmVhbCgpOworCQlza2ItPnRzdGFtcCA9IGt0OworCQl0cyA9IGt0aW1lX3RvX3RpbWVzcGVjKGt0KTsKKwkJcHV0X2Ntc2cobXNnLCBTT0xfU09DS0VULCBTQ01fVElNRVNUQU1QTlMsIHNpemVvZih0cyksICZ0cyk7CisJfQorfQorCitFWFBPUlRfU1lNQk9MX0dQTChfX3NvY2tfcmVjdl90aW1lc3RhbXApOworCiBzdGF0aWMgaW5saW5lIGludCBfX3NvY2tfcmVjdm1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCiAJCQkJIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IHNpemUsIGludCBmbGFncykKIHsKQEAgLTEyOTIsNyArMTMyMyw3IEBACiAJaW50IGVyciwgZnB1dF9uZWVkZWQ7CiAKIAlzb2NrID0gc29ja2ZkX2xvb2t1cF9saWdodChmZCwgJmVyciwgJmZwdXRfbmVlZGVkKTsKLQlpZihzb2NrKSB7CisJaWYgKHNvY2spIHsKIAkJZXJyID0gbW92ZV9hZGRyX3RvX2tlcm5lbCh1bXlhZGRyLCBhZGRybGVuLCBhZGRyZXNzKTsKIAkJaWYgKGVyciA+PSAwKSB7CiAJCQllcnIgPSBzZWN1cml0eV9zb2NrZXRfYmluZChzb2NrLApkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9jYWNoZS5jIGIvbmV0L3N1bnJwYy9jYWNoZS5jCmluZGV4IGYwMmYyNGEuLjU0M2IwODUgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMvY2FjaGUuYworKysgYi9uZXQvc3VucnBjL2NhY2hlLmMKQEAgLTEyMzcsMjAgKzEyMzcsMTIgQEAKIAogCXJldHVybiByZXM7CiB9Ci1zdGF0aWMgaW50IGNvbnRlbnRfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3Qgc2VxX2ZpbGUgKm0gPSAoc3RydWN0IHNlcV9maWxlICopZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBoYW5kbGUgKmhhbiA9IG0tPnByaXZhdGU7Ci0Ja2ZyZWUoaGFuKTsKLQltLT5wcml2YXRlID0gTlVMTDsKLQlyZXR1cm4gc2VxX3JlbGVhc2UoaW5vZGUsIGZpbGUpOwotfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBjb250ZW50X2ZpbGVfb3BlcmF0aW9ucyA9IHsKIAkub3BlbgkJPSBjb250ZW50X29wZW4sCiAJLnJlYWQJCT0gc2VxX3JlYWQsCiAJLmxsc2VlawkJPSBzZXFfbHNlZWssCi0JLnJlbGVhc2UJPSBjb250ZW50X3JlbGVhc2UsCisJLnJlbGVhc2UJPSBzZXFfcmVsZWFzZV9wcml2YXRlLAogfTsKIAogc3RhdGljIHNzaXplX3QgcmVhZF9mbHVzaChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvc29ja2xpYi5jIGIvbmV0L3N1bnJwYy9zb2NrbGliLmMKaW5kZXggNjM0ODg1Yi4uMWQzNzdkMSAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9zb2NrbGliLmMKKysrIGIvbmV0L3N1bnJwYy9zb2NrbGliLmMKQEAgLTE1NCw3ICsxNTQsNyBAQAogCWRlc2Mub2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpOwogCWRlc2MuY291bnQgPSBza2ItPmxlbiAtIGRlc2Mub2Zmc2V0OwogCi0JaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1VOTkVDRVNTQVJZKQorCWlmIChza2JfY3N1bV91bm5lY2Vzc2FyeShza2IpKQogCQlnb3RvIG5vX2NoZWNrc3VtOwogCiAJZGVzYy5jc3VtID0gY3N1bV9wYXJ0aWFsKHNrYi0+ZGF0YSwgZGVzYy5vZmZzZXQsIHNrYi0+Y3N1bSk7CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL3N2Y3NvY2suYyBiL25ldC9zdW5ycGMvc3Zjc29jay5jCmluZGV4IDI3NzJmZWUuLjIyZjYxYWUgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMvc3Zjc29jay5jCisrKyBiL25ldC9zdW5ycGMvc3Zjc29jay5jCkBAIC03OTgsMTYgKzc5OCwxMiBAQAogCQlkcHJpbnRrKCJzdmM6IHJlY3Zmcm9tIHJldHVybmVkIGVycm9yICVkXG4iLCAtZXJyKTsKIAl9CiAJcnFzdHAtPnJxX2FkZHJsZW4gPSBzaXplb2YocnFzdHAtPnJxX2FkZHIpOwotCWlmIChza2ItPnRzdGFtcC5vZmZfc2VjID09IDApIHsKLQkJc3RydWN0IHRpbWV2YWwgdHY7Ci0KLQkJdHYudHZfc2VjID0geHRpbWUudHZfc2VjOwotCQl0di50dl91c2VjID0geHRpbWUudHZfbnNlYyAvIE5TRUNfUEVSX1VTRUM7Ci0JCXNrYl9zZXRfdGltZXN0YW1wKHNrYiwgJnR2KTsKKwlpZiAoc2tiLT50c3RhbXAudHY2NCA9PSAwKSB7CisJCXNrYi0+dHN0YW1wID0ga3RpbWVfZ2V0X3JlYWwoKTsKIAkJLyogRG9uJ3QgZW5hYmxlIG5ldHN0YW1wLCBzdW5ycGMgZG9lc24ndAogCQkgICBuZWVkIHRoYXQgbXVjaCBhY2N1cmFjeSAqLwogCX0KLQlza2JfZ2V0X3RpbWVzdGFtcChza2IsICZzdnNrLT5za19zay0+c2tfc3RhbXApOworCXN2c2stPnNrX3NrLT5za19zdGFtcCA9IHNrYi0+dHN0YW1wOwogCXNldF9iaXQoU0tfREFUQSwgJnN2c2stPnNrX2ZsYWdzKTsgLyogdGhlcmUgbWF5IGJlIG1vcmUgZGF0YS4uLiAqLwogCiAJLyoKZGlmZiAtLWdpdCBhL25ldC90aXBjL2NvbmZpZy5jIGIvbmV0L3RpcGMvY29uZmlnLmMKaW5kZXggMTQ3ODlhOC4uYzcxMzM3YTIgMTAwNjQ0Ci0tLSBhL25ldC90aXBjL2NvbmZpZy5jCisrKyBiL25ldC90aXBjL2NvbmZpZy5jCkBAIC04OSw3ICs4OSw3IEBACiBpbnQgdGlwY19jZmdfYXBwZW5kX3RsdihzdHJ1Y3Qgc2tfYnVmZiAqYnVmLCBpbnQgdGx2X3R5cGUsCiAJCQl2b2lkICp0bHZfZGF0YSwgaW50IHRsdl9kYXRhX3NpemUpCiB7Ci0Jc3RydWN0IHRsdl9kZXNjICp0bHYgPSAoc3RydWN0IHRsdl9kZXNjICopYnVmLT50YWlsOworCXN0cnVjdCB0bHZfZGVzYyAqdGx2ID0gKHN0cnVjdCB0bHZfZGVzYyAqKXNrYl90YWlsX3BvaW50ZXIoYnVmKTsKIAlpbnQgbmV3X3Rsdl9zcGFjZSA9IFRMVl9TUEFDRSh0bHZfZGF0YV9zaXplKTsKIAogCWlmIChza2JfdGFpbHJvb20oYnVmKSA8IG5ld190bHZfc3BhY2UpIHsKZGlmZiAtLWdpdCBhL25ldC90aXBjL2V0aF9tZWRpYS5jIGIvbmV0L3RpcGMvZXRoX21lZGlhLmMKaW5kZXggOWJlNDgzOS4uNjdiYjI5YiAxMDA2NDQKLS0tIGEvbmV0L3RpcGMvZXRoX21lZGlhLmMKKysrIGIvbmV0L3RpcGMvZXRoX21lZGlhLmMKQEAgLTczLDcgKzczLDcgQEAKIAogCWNsb25lID0gc2tiX2Nsb25lKGJ1ZiwgR0ZQX0FUT01JQyk7CiAJaWYgKGNsb25lKSB7Ci0JCWNsb25lLT5uaC5yYXcgPSBjbG9uZS0+ZGF0YTsKKwkJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKGNsb25lKTsKIAkJZGV2ID0gKChzdHJ1Y3QgZXRoX2JlYXJlciAqKSh0Yl9wdHItPnVzcl9oYW5kbGUpKS0+ZGV2OwogCQljbG9uZS0+ZGV2ID0gZGV2OwogCQlkZXYtPmhhcmRfaGVhZGVyKGNsb25lLCBkZXYsIEVUSF9QX1RJUEMsCkBAIC05OSw4ICs5OSw4IEBACiAKIAlpZiAobGlrZWx5KGViX3B0ci0+YmVhcmVyKSkgewogCSAgICAgICBpZiAobGlrZWx5KCFkZXYtPnByb21pc2N1aXR5KSB8fAotCQkgICAhbWVtY21wKGJ1Zi0+bWFjLnJhdyxkZXYtPmRldl9hZGRyLEVUSF9BTEVOKSB8fAotCQkgICAhbWVtY21wKGJ1Zi0+bWFjLnJhdyxkZXYtPmJyb2FkY2FzdCxFVEhfQUxFTikpIHsKKwkJICAgIW1lbWNtcChza2JfbWFjX2hlYWRlcihidWYpLCBkZXYtPmRldl9hZGRyLCBFVEhfQUxFTikgfHwKKwkJICAgIW1lbWNtcChza2JfbWFjX2hlYWRlcihidWYpLCBkZXYtPmJyb2FkY2FzdCwgRVRIX0FMRU4pKSB7CiAJCQlzaXplID0gbXNnX3NpemUoKHN0cnVjdCB0aXBjX21zZyAqKWJ1Zi0+ZGF0YSk7CiAJCQlza2JfdHJpbShidWYsIHNpemUpOwogCQkJaWYgKGxpa2VseShidWYtPmxlbiA9PSBzaXplKSkgewpAQCAtMTQwLDcgKzE0MCw3IEBACiAJCXJldHVybiAtRURRVU9UOwogCWlmICghZWJfcHRyLT5kZXYpIHsKIAkJZWJfcHRyLT5kZXYgPSBkZXY7Ci0JCWViX3B0ci0+dGlwY19wYWNrZXRfdHlwZS50eXBlID0gX19jb25zdGFudF9odG9ucyhFVEhfUF9USVBDKTsKKwkJZWJfcHRyLT50aXBjX3BhY2tldF90eXBlLnR5cGUgPSBodG9ucyhFVEhfUF9USVBDKTsKIAkJZWJfcHRyLT50aXBjX3BhY2tldF90eXBlLmRldiA9IGRldjsKIAkJZWJfcHRyLT50aXBjX3BhY2tldF90eXBlLmZ1bmMgPSByZWN2X21zZzsKIAkJZWJfcHRyLT50aXBjX3BhY2tldF90eXBlLmFmX3BhY2tldF9wcml2ID0gZWJfcHRyOwpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvbGluay5jIGIvbmV0L3RpcGMvbGluay5jCmluZGV4IDcxYzJmMmYuLjIxMjRmMzIgMTAwNjQ0Ci0tLSBhL25ldC90aXBjL2xpbmsuYworKysgYi9uZXQvdGlwYy9saW5rLmMKQEAgLTEwMDEsNyArMTAwMSw3IEBACiAJCXJldHVybiAwOwogCiAJc2tiX3B1dChidW5kbGVyLCBwYWQgKyBzaXplKTsKLQltZW1jcHkoYnVuZGxlci0+ZGF0YSArIHRvX3BvcywgYnVmLT5kYXRhLCBzaXplKTsKKwlza2JfY29weV90b19saW5lYXJfZGF0YV9vZmZzZXQoYnVuZGxlciwgdG9fcG9zLCBidWYtPmRhdGEsIHNpemUpOwogCW1zZ19zZXRfc2l6ZShidW5kbGVyX21zZywgdG9fcG9zICsgc2l6ZSk7CiAJbXNnX3NldF9tc2djbnQoYnVuZGxlcl9tc2csIG1zZ19tc2djbnQoYnVuZGxlcl9tc2cpICsgMSk7CiAJZGJnKCJQYWNrZWQgbXNnICMgJXUoJXUgb2N0ZXRzKSBpbnRvIHBvcyAldSBpbiBidWYoIyV1KVxuIiwKQEAgLTExMDksOCArMTEwOSw4IEBACiAJCQlpZiAoYnVuZGxlcikgewogCQkJCW1zZ19pbml0KCZidW5kbGVyX2hkciwgTVNHX0JVTkRMRVIsIE9QRU5fTVNHLAogCQkJCQkgVElQQ19PSywgSU5UX0hfU0laRSwgbF9wdHItPmFkZHIpOwotCQkJCW1lbWNweShidW5kbGVyLT5kYXRhLCAodW5jaGFyICopJmJ1bmRsZXJfaGRyLAotCQkJCSAgICAgICBJTlRfSF9TSVpFKTsKKwkJCQlza2JfY29weV90b19saW5lYXJfZGF0YShidW5kbGVyLCAmYnVuZGxlcl9oZHIsCisJCQkJCQkJSU5UX0hfU0laRSk7CiAJCQkJc2tiX3RyaW0oYnVuZGxlciwgSU5UX0hfU0laRSk7CiAJCQkJbGlua19idW5kbGVfYnVmKGxfcHRyLCBidW5kbGVyLCBidWYpOwogCQkJCWJ1ZiA9IGJ1bmRsZXI7CkBAIC0xMzgzLDkgKzEzODMsOSBAQAogCWlmICghYnVmKQogCQlyZXR1cm4gLUVOT01FTTsKIAlidWYtPm5leHQgPSBOVUxMOwotCW1lbWNweShidWYtPmRhdGEsICh1bmNoYXIgKikmZnJhZ21faGRyLCBJTlRfSF9TSVpFKTsKKwlza2JfY29weV90b19saW5lYXJfZGF0YShidWYsICZmcmFnbV9oZHIsIElOVF9IX1NJWkUpOwogCWhzeiA9IG1zZ19oZHJfc3ooaGRyKTsKLQltZW1jcHkoYnVmLT5kYXRhICsgSU5UX0hfU0laRSwgKHVuY2hhciAqKWhkciwgaHN6KTsKKwlza2JfY29weV90b19saW5lYXJfZGF0YV9vZmZzZXQoYnVmLCBJTlRfSF9TSVpFLCBoZHIsIGhzeik7CiAJbXNnX2RiZyhidWZfbXNnKGJ1ZiksICI+QlVJTEQ+Iik7CiAKIAkvKiBDaG9wIHVwIG1lc3NhZ2U6ICovCkBAIC0xNDE2LDggKzE0MTYsOCBAQAogCQkJCXJldHVybiAtRUZBVUxUOwogCQkJfQogCQl9IGVsc2UKLQkJCW1lbWNweShidWYtPmRhdGEgKyBmcmFnbV9jcnMsIHNlY3RfY3JzLCBzeik7Ci0KKwkJCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhX29mZnNldChidWYsIGZyYWdtX2NycywKKwkJCQkJCSAgICAgICBzZWN0X2Nycywgc3opOwogCQlzZWN0X2NycyArPSBzejsKIAkJc2VjdF9yZXN0IC09IHN6OwogCQlmcmFnbV9jcnMgKz0gc3o7CkBAIC0xNDQyLDcgKzE0NDIsNyBAQAogCiAJCQlidWYtPm5leHQgPSBOVUxMOwogCQkJcHJldi0+bmV4dCA9IGJ1ZjsKLQkJCW1lbWNweShidWYtPmRhdGEsICh1bmNoYXIgKikmZnJhZ21faGRyLCBJTlRfSF9TSVpFKTsKKwkJCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhKGJ1ZiwgJmZyYWdtX2hkciwgSU5UX0hfU0laRSk7CiAJCQlmcmFnbV9jcnMgPSBJTlRfSF9TSVpFOwogCQkJZnJhZ21fcmVzdCA9IGZyYWdtX3N6OwogCQkJbXNnX2RiZyhidWZfbXNnKGJ1ZiksIiAgPkJVSUxEPiIpOwpAQCAtMjEzMCw3ICsyMTMwLDcgQEAKIAkJYnVmID0gbF9wdHItPnByb3RvX21zZ19xdWV1ZTsKIAkJaWYgKCFidWYpCiAJCQlyZXR1cm47Ci0JCW1lbWNweShidWYtPmRhdGEsICh1bmNoYXIgKiltc2csIHNpemVvZihsX3B0ci0+cHJvdG9fbXNnKSk7CisJCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhKGJ1ZiwgbXNnLCBzaXplb2YobF9wdHItPnByb3RvX21zZykpOwogCQlyZXR1cm47CiAJfQogCW1zZ19zZXRfdGltZXN0YW1wKG1zZywgamlmZmllc190b19tc2VjcyhqaWZmaWVzKSk7CkBAIC0yMTQzLDcgKzIxNDMsNyBAQAogCWlmICghYnVmKQogCQlyZXR1cm47CiAKLQltZW1jcHkoYnVmLT5kYXRhLCAodW5jaGFyICopbXNnLCBzaXplb2YobF9wdHItPnByb3RvX21zZykpOworCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhKGJ1ZiwgbXNnLCBzaXplb2YobF9wdHItPnByb3RvX21zZykpOwogCW1zZ19zZXRfc2l6ZShidWZfbXNnKGJ1ZiksIG1zZ19zaXplKTsKIAogCWlmICh0aXBjX2JlYXJlcl9zZW5kKGxfcHRyLT5iX3B0ciwgYnVmLCAmbF9wdHItPm1lZGlhX2FkZHIpKSB7CkBAIC0yMzE5LDggKzIzMTksOCBAQAogCQkgICAgICJ1bmFibGUgdG8gc2VuZCB0dW5uZWwgbXNnXG4iKTsKIAkJcmV0dXJuOwogCX0KLQltZW1jcHkoYnVmLT5kYXRhLCAodW5jaGFyICopdHVubmVsX2hkciwgSU5UX0hfU0laRSk7Ci0JbWVtY3B5KGJ1Zi0+ZGF0YSArIElOVF9IX1NJWkUsICh1bmNoYXIgKiltc2csIGxlbmd0aCk7CisJc2tiX2NvcHlfdG9fbGluZWFyX2RhdGEoYnVmLCB0dW5uZWxfaGRyLCBJTlRfSF9TSVpFKTsKKwlza2JfY29weV90b19saW5lYXJfZGF0YV9vZmZzZXQoYnVmLCBJTlRfSF9TSVpFLCBtc2csIGxlbmd0aCk7CiAJZGJnKCIlYy0+JWM6IiwgbF9wdHItPmJfcHRyLT5uZXRfcGxhbmUsIHR1bm5lbC0+Yl9wdHItPm5ldF9wbGFuZSk7CiAJbXNnX2RiZyhidWZfbXNnKGJ1ZiksICI+U0VORD4iKTsKIAl0aXBjX2xpbmtfc2VuZF9idWYodHVubmVsLCBidWYpOwpAQCAtMjM2MSw3ICsyMzYxLDcgQEAKIAogCQlidWYgPSBidWZfYWNxdWlyZShJTlRfSF9TSVpFKTsKIAkJaWYgKGJ1ZikgewotCQkJbWVtY3B5KGJ1Zi0+ZGF0YSwgKHVuY2hhciAqKSZ0dW5uZWxfaGRyLCBJTlRfSF9TSVpFKTsKKwkJCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhKGJ1ZiwgJnR1bm5lbF9oZHIsIElOVF9IX1NJWkUpOwogCQkJbXNnX3NldF9zaXplKCZ0dW5uZWxfaGRyLCBJTlRfSF9TSVpFKTsKIAkJCWRiZygiJWMtPiVjOiIsIGxfcHRyLT5iX3B0ci0+bmV0X3BsYW5lLAogCQkJICAgIHR1bm5lbC0+Yl9wdHItPm5ldF9wbGFuZSk7CkBAIC0yNDI2LDggKzI0MjYsOSBAQAogCQkJICAgICAidW5hYmxlIHRvIHNlbmQgZHVwbGljYXRlIG1zZ1xuIik7CiAJCQlyZXR1cm47CiAJCX0KLQkJbWVtY3B5KG91dGJ1Zi0+ZGF0YSwgKHVuY2hhciAqKSZ0dW5uZWxfaGRyLCBJTlRfSF9TSVpFKTsKLQkJbWVtY3B5KG91dGJ1Zi0+ZGF0YSArIElOVF9IX1NJWkUsIGl0ZXItPmRhdGEsIGxlbmd0aCk7CisJCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhKG91dGJ1ZiwgJnR1bm5lbF9oZHIsIElOVF9IX1NJWkUpOworCQlza2JfY29weV90b19saW5lYXJfZGF0YV9vZmZzZXQob3V0YnVmLCBJTlRfSF9TSVpFLCBpdGVyLT5kYXRhLAorCQkJCQkgICAgICAgbGVuZ3RoKTsKIAkJZGJnKCIlYy0+JWM6IiwgbF9wdHItPmJfcHRyLT5uZXRfcGxhbmUsCiAJCSAgICB0dW5uZWwtPmJfcHRyLT5uZXRfcGxhbmUpOwogCQltc2dfZGJnKGJ1Zl9tc2cob3V0YnVmKSwgIj5TRU5EPiIpOwpAQCAtMjQ1Nyw3ICsyNDU4LDcgQEAKIAogCWViID0gYnVmX2FjcXVpcmUoc2l6ZSk7CiAJaWYgKGViKQotCQltZW1jcHkoZWItPmRhdGEsICh1bmNoYXIgKiltc2csIHNpemUpOworCQlza2JfY29weV90b19saW5lYXJfZGF0YShlYiwgbXNnLCBzaXplKTsKIAlyZXR1cm4gZWI7CiB9CiAKQEAgLTI1NjksNyArMjU3MCw3IEBACiAJCWlmIChvYnVmID09IE5VTEwpIHsKIAkJCXdhcm4oIkxpbmsgdW5hYmxlIHRvIHVuYnVuZGxlIG1lc3NhZ2UocylcbiIpOwogCQkJYnJlYWs7Ci0JCX07CisJCX0KIAkJcG9zICs9IGFsaWduKG1zZ19zaXplKGJ1Zl9tc2cob2J1ZikpKTsKIAkJbXNnX2RiZyhidWZfbXNnKG9idWYpLCAiICAgICAvIik7CiAJCXRpcGNfbmV0X3JvdXRlX21zZyhvYnVmKTsKQEAgLTI2MzEsOSArMjYzMiw5IEBACiAJCQlnb3RvIGV4aXQ7CiAJCX0KIAkJbXNnX3NldF9zaXplKCZmcmFnbV9oZHIsIGZyYWdtX3N6ICsgSU5UX0hfU0laRSk7Ci0JCW1lbWNweShmcmFnbS0+ZGF0YSwgKHVuY2hhciAqKSZmcmFnbV9oZHIsIElOVF9IX1NJWkUpOwotCQltZW1jcHkoZnJhZ20tPmRhdGEgKyBJTlRfSF9TSVpFLCBjcnMsIGZyYWdtX3N6KTsKLQorCQlza2JfY29weV90b19saW5lYXJfZGF0YShmcmFnbSwgJmZyYWdtX2hkciwgSU5UX0hfU0laRSk7CisJCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhX29mZnNldChmcmFnbSwgSU5UX0hfU0laRSwgY3JzLAorCQkJCQkgICAgICAgZnJhZ21fc3opOwogCQkvKiAgU2VuZCBxdWV1ZWQgbWVzc2FnZXMgZmlyc3QsIGlmIGFueTogKi8KIAogCQlsX3B0ci0+c3RhdHMuc2VudF9mcmFnbWVudHMrKzsKQEAgLTI3MzMsOCArMjczNCw4IEBACiAJCWlmIChwYnVmICE9IE5VTEwpIHsKIAkJCXBidWYtPm5leHQgPSAqcGVuZGluZzsKIAkJCSpwZW5kaW5nID0gcGJ1ZjsKLQkJCW1lbWNweShwYnVmLT5kYXRhLCAodW5jaGFyICopaW1zZywgbXNnX2RhdGFfc3ooZnJhZ20pKTsKLQorCQkJc2tiX2NvcHlfdG9fbGluZWFyX2RhdGEocGJ1ZiwgaW1zZywKKwkJCQkJCW1zZ19kYXRhX3N6KGZyYWdtKSk7CiAJCQkvKiAgUHJlcGFyZSBidWZmZXIgZm9yIHN1YnNlcXVlbnQgZnJhZ21lbnRzLiAqLwogCiAJCQlzZXRfbG9uZ19tc2dfc2Vxbm8ocGJ1ZiwgbG9uZ19tc2dfc2VxX25vKTsKQEAgLTI3NTAsNyArMjc1MSw4IEBACiAJCXUzMiBmc3ogPSBnZXRfZnJhZ21fc2l6ZShwYnVmKTsKIAkJdTMyIGNycyA9ICgobXNnX2ZyYWdtX25vKGZyYWdtKSAtIDEpICogZnN6KTsKIAkJdTMyIGV4cF9mcmFncyA9IGdldF9leHBlY3RlZF9mcmFncyhwYnVmKSAtIDE7Ci0JCW1lbWNweShwYnVmLT5kYXRhICsgY3JzLCBtc2dfZGF0YShmcmFnbSksIGRzeik7CisJCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhX29mZnNldChwYnVmLCBjcnMsCisJCQkJCSAgICAgICBtc2dfZGF0YShmcmFnbSksIGRzeik7CiAJCWJ1Zl9kaXNjYXJkKGZidWYpOwogCiAJCS8qIElzIG1lc3NhZ2UgY29tcGxldGU/ICovCmRpZmYgLS1naXQgYS9uZXQvdGlwYy9tc2cuaCBiL25ldC90aXBjL21zZy5oCmluZGV4IDYyZDU0OTAuLjM1ZDViYTEgMTAwNjQ0Ci0tLSBhL25ldC90aXBjL21zZy5oCisrKyBiL25ldC90aXBjL21zZy5oCkBAIC0xLDggKzEsOCBAQAogLyoKICAqIG5ldC90aXBjL21zZy5oOiBJbmNsdWRlIGZpbGUgZm9yIFRJUEMgbWVzc2FnZSBoZWFkZXIgcm91dGluZXMKICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNiwgRXJpY3Nzb24gQUIKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgV2luZCBSaXZlciBTeXN0ZW1zCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNywgRXJpY3Nzb24gQUIKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA3LCBXaW5kIFJpdmVyIFN5c3RlbXMKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC03MSw4ICs3MSwxMSBAQAogc3RhdGljIGlubGluZSB2b2lkIG1zZ19zZXRfYml0cyhzdHJ1Y3QgdGlwY19tc2cgKm0sIHUzMiB3LAogCQkJCXUzMiBwb3MsIHUzMiBtYXNrLCB1MzIgdmFsKQogewotCXUzMiB3b3JkID0gbXNnX3dvcmQobSx3KSAmIH4obWFzayA8PCBwb3MpOwotCW1zZ19zZXRfd29yZChtLCB3LCAod29yZCB8PSAodmFsIDw8IHBvcykpKTsKKwl2YWwgPSAodmFsICYgbWFzaykgPDwgcG9zOworCXZhbCA9IGh0b25sKHZhbCk7CisJbWFzayA9IGh0b25sKG1hc2sgPDwgcG9zKTsKKwltLT5oZHJbd10gJj0gfm1hc2s7CisJbS0+aGRyW3ddIHw9IHZhbDsKIH0KIAogLyoKQEAgLTc4NiwxNSArNzg5LDE2IEBACiAJKmJ1ZiA9IGJ1Zl9hY3F1aXJlKHN6KTsKIAlpZiAoISgqYnVmKSkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JbWVtY3B5KCgqYnVmKS0+ZGF0YSwgKHVuY2hhciAqKWhkciwgaHN6KTsKKwlza2JfY29weV90b19saW5lYXJfZGF0YSgqYnVmLCBoZHIsIGhzeik7CiAJZm9yIChyZXMgPSAxLCBjbnQgPSAwOyByZXMgJiYgKGNudCA8IG51bV9zZWN0KTsgY250KyspIHsKIAkJaWYgKGxpa2VseSh1c3JtZW0pKQogCQkJcmVzID0gIWNvcHlfZnJvbV91c2VyKCgqYnVmKS0+ZGF0YSArIHBvcywKIAkJCQkJICAgICAgbXNnX3NlY3RbY250XS5pb3ZfYmFzZSwKIAkJCQkJICAgICAgbXNnX3NlY3RbY250XS5pb3ZfbGVuKTsKIAkJZWxzZQotCQkJbWVtY3B5KCgqYnVmKS0+ZGF0YSArIHBvcywgbXNnX3NlY3RbY250XS5pb3ZfYmFzZSwKLQkJCSAgICAgICBtc2dfc2VjdFtjbnRdLmlvdl9sZW4pOworCQkJc2tiX2NvcHlfdG9fbGluZWFyX2RhdGFfb2Zmc2V0KCpidWYsIHBvcywKKwkJCQkJCSAgICAgICBtc2dfc2VjdFtjbnRdLmlvdl9iYXNlLAorCQkJCQkJICAgICAgIG1zZ19zZWN0W2NudF0uaW92X2xlbik7CiAJCXBvcyArPSBtc2dfc2VjdFtjbnRdLmlvdl9sZW47CiAJfQogCWlmIChsaWtlbHkocmVzKSkKZGlmZiAtLWdpdCBhL25ldC90aXBjL25ldGxpbmsuYyBiL25ldC90aXBjL25ldGxpbmsuYwppbmRleCBiOGUxZWRjLi40Y2RhZmEyIDEwMDY0NAotLS0gYS9uZXQvdGlwYy9uZXRsaW5rLmMKKysrIGIvbmV0L3RpcGMvbmV0bGluay5jCkBAIC01Nyw3ICs1Nyw3IEBACiAKIAlpZiAocmVwX2J1ZikgewogCQlza2JfcHVzaChyZXBfYnVmLCBoZHJfc3BhY2UpOwotCQlyZXBfbmxoID0gKHN0cnVjdCBubG1zZ2hkciAqKXJlcF9idWYtPmRhdGE7CisJCXJlcF9ubGggPSBubG1zZ19oZHIocmVwX2J1Zik7CiAJCW1lbWNweShyZXBfbmxoLCByZXFfbmxoLCBoZHJfc3BhY2UpOwogCQlyZXBfbmxoLT5ubG1zZ19sZW4gPSByZXBfYnVmLT5sZW47CiAJCWdlbmxtc2dfdW5pY2FzdChyZXBfYnVmLCByZXFfbmxoLT5ubG1zZ19waWQpOwpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvcG9ydC5jIGIvbmV0L3RpcGMvcG9ydC5jCmluZGV4IDVmODIxN2QuLmJjZDVkYTAgMTAwNjQ0Ci0tLSBhL25ldC90aXBjL3BvcnQuYworKysgYi9uZXQvdGlwYy9wb3J0LmMKQEAgLTQ2NCw3ICs0NjQsNyBAQAogCW1zZ19zZXRfc2l6ZShybXNnLCBkYXRhX3N6ICsgaGRyX3N6KTsKIAltc2dfc2V0X25hbWV0eXBlKHJtc2csIG1zZ19uYW1ldHlwZShtc2cpKTsKIAltc2dfc2V0X25hbWVpbnN0KHJtc2csIG1zZ19uYW1laW5zdChtc2cpKTsKLQltZW1jcHkocmJ1Zi0+ZGF0YSArIGhkcl9zeiwgbXNnX2RhdGEobXNnKSwgZGF0YV9zeik7CisJc2tiX2NvcHlfdG9fbGluZWFyX2RhdGFfb2Zmc2V0KHJidWYsIGhkcl9zeiwgbXNnX2RhdGEobXNnKSwgZGF0YV9zeik7CiAKIAkvKiBzZW5kIHNlbGYtYWJvcnQgbWVzc2FnZSB3aGVuIHJlamVjdGluZyBvbiBhIGNvbm5lY3RlZCBwb3J0ICovCiAJaWYgKG1zZ19jb25uZWN0ZWQobXNnKSkgewpAQCAtMTQxOSw3ICsxNDE5LDcgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlza2JfcHVzaChidWYsIGhzeik7Ci0JbWVtY3B5KGJ1Zi0+ZGF0YSwgKHVuY2hhciAqKW1zZywgaHN6KTsKKwlza2JfY29weV90b19saW5lYXJfZGF0YShidWYsIG1zZywgaHN6KTsKIAlkZXN0bm9kZSA9IG1zZ19kZXN0bm9kZShtc2cpOwogCXBfcHRyLT5wdWJsLmNvbmdlc3RlZCA9IDE7CiAJaWYgKCF0aXBjX3BvcnRfY29uZ2VzdGVkKHBfcHRyKSkgewpAQCAtMTU1NSw3ICsxNTU1LDcgQEAKIAlpZiAoc2tiX2NvdyhidWYsIExPTkdfSF9TSVpFKSkKIAkJcmV0dXJuIC1FTk9NRU07CiAJc2tiX3B1c2goYnVmLCBMT05HX0hfU0laRSk7Ci0JbWVtY3B5KGJ1Zi0+ZGF0YSwgKHVuY2hhciAqKW1zZywgTE9OR19IX1NJWkUpOworCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhKGJ1ZiwgbXNnLCBMT05HX0hfU0laRSk7CiAJbXNnX2RiZyhidWZfbXNnKGJ1ZiksIlBSRVA6Iik7CiAJaWYgKGxpa2VseShkZXN0cG9ydCB8fCBkZXN0bm9kZSkpIHsKIAkJcF9wdHItPnNlbnQrKzsKQEAgLTE2NzksNyArMTY3OSw3IEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJc2tiX3B1c2goYnVmLCBESVJfTVNHX0hfU0laRSk7Ci0JbWVtY3B5KGJ1Zi0+ZGF0YSwgKHVuY2hhciAqKW1zZywgRElSX01TR19IX1NJWkUpOworCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhKGJ1ZiwgbXNnLCBESVJfTVNHX0hfU0laRSk7CiAJbXNnX2RiZyhtc2csICJidWYycG9ydDogIik7CiAJcF9wdHItPnNlbnQrKzsKIAlpZiAoZGVzdC0+bm9kZSA9PSB0aXBjX293bl9hZGRyKQpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvc29ja2V0LmMgYi9uZXQvdGlwYy9zb2NrZXQuYwppbmRleCBiNzE3MzlmLi40NTgzMmZiIDEwMDY0NAotLS0gYS9uZXQvdGlwYy9zb2NrZXQuYworKysgYi9uZXQvdGlwYy9zb2NrZXQuYwpAQCAtMTAyMCw3ICsxMDIwLDcgQEAKIAogCWlmICghZXJyKSB7CiAJCWJ1Zl9jcnMgPSAodW5zaWduZWQgY2hhciAqKShUSVBDX1NLQl9DQihidWYpLT5oYW5kbGUpOwotCQlzeiA9IGJ1Zi0+dGFpbCAtIGJ1Zl9jcnM7CisJCXN6ID0gc2tiX3RhaWxfcG9pbnRlcihidWYpIC0gYnVmX2NyczsKIAogCQluZWVkZWQgPSAoYnVmX2xlbiAtIHN6X2NvcGllZCk7CiAJCXN6X3RvX2NvcHkgPSAoc3ogPD0gbmVlZGVkKSA/IHN6IDogbmVlZGVkOwpkaWZmIC0tZ2l0IGEvbmV0L3VuaXgvYWZfdW5peC5jIGIvbmV0L3VuaXgvYWZfdW5peC5jCmluZGV4IDYwNjk3MTYuLmFlYzhjZjEgMTAwNjQ0Ci0tLSBhL25ldC91bml4L2FmX3VuaXguYworKysgYi9uZXQvdW5peC9hZl91bml4LmMKQEAgLTEzMTksNyArMTMxOSw3IEBACiAJCXVuaXhfYXR0YWNoX2ZkcyhzaW9jYi0+c2NtLCBza2IpOwogCXVuaXhfZ2V0X3NlY2RhdGEoc2lvY2ItPnNjbSwgc2tiKTsKIAotCXNrYi0+aC5yYXcgPSBza2ItPmRhdGE7CisJc2tiX3Jlc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKIAllcnIgPSBtZW1jcHlfZnJvbWlvdmVjKHNrYl9wdXQoc2tiLGxlbiksIG1zZy0+bXNnX2lvdiwgbGVuKTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dF9mcmVlOwpkaWZmIC0tZ2l0IGEvbmV0L3dhbnJvdXRlci93YW5tYWluLmMgYi9uZXQvd2Fucm91dGVyL3dhbm1haW4uYwppbmRleCA1ZDJkOTNkLi43YTE5ZTBlIDEwMDY0NAotLS0gYS9uZXQvd2Fucm91dGVyL3dhbm1haW4uYworKysgYi9uZXQvd2Fucm91dGVyL3dhbm1haW4uYwpAQCAtMjc3LDggKzI3Nyw4IEBACiAJCXNrYl9wdXNoKHNrYiwgNyk7CiAJCXNrYi0+ZGF0YVswXSA9IDA7CiAJCXNrYi0+ZGF0YVsxXSA9IE5MUElEX1NOQVA7Ci0JCW1lbWNweSgmc2tiLT5kYXRhWzJdLCB3YW5yb3V0ZXJfb3VpX2V0aGVyLAotCQkgICAgICAgc2l6ZW9mKHdhbnJvdXRlcl9vdWlfZXRoZXIpKTsKKwkJc2tiX2NvcHlfdG9fbGluZWFyX2RhdGFfb2Zmc2V0KHNrYiwgMiwgd2Fucm91dGVyX291aV9ldGhlciwKKwkJCQkJICAgICAgIHNpemVvZih3YW5yb3V0ZXJfb3VpX2V0aGVyKSk7CiAJCSooKHVuc2lnbmVkIHNob3J0Kikmc2tiLT5kYXRhWzVdKSA9IGh0b25zKHR5cGUpOwogCQlicmVhazsKIApAQCAtMzM5LDcgKzMzOSw3IEBACiAJc2tiLT5wcm90b2NvbCA9IGV0aGVydHlwZTsKIAlza2ItPnBrdF90eXBlID0gUEFDS0VUX0hPU1Q7CS8qCVBoeXNpY2FsbHkgcG9pbnQgdG8gcG9pbnQgKi8KIAlza2JfcHVsbChza2IsIGNudCk7Ci0Jc2tiLT5tYWMucmF3ICA9IHNrYi0+ZGF0YTsKKwlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwogCXJldHVybiBldGhlcnR5cGU7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy9LY29uZmlnIGIvbmV0L3dpcmVsZXNzL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIyOGQ1NgotLS0gL2Rldi9udWxsCisrKyBiL25ldC93aXJlbGVzcy9LY29uZmlnCkBAIC0wLDAgKzEsMTYgQEAKK2NvbmZpZyBDRkc4MDIxMQorICAgICAgICB0cmlzdGF0ZSAiSW1wcm92ZWQgd2lyZWxlc3MgY29uZmlndXJhdGlvbiBBUEkiCisKK2NvbmZpZyBXSVJFTEVTU19FWFQKKwlib29sICJXaXJlbGVzcyBleHRlbnNpb25zIgorCWRlZmF1bHQgbgorCS0tLWhlbHAtLS0KKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgdGhlIGxlZ2FjeSB3aXJlbGVzcyBleHRlbnNpb25zCisJICAod2lyZWxlc3MgbmV0d29yayBpbnRlcmZhY2UgY29uZmlndXJhdGlvbiB2aWEgaW9jdGxzLikKKworCSAgV2lyZWxlc3MgZXh0ZW5zaW9ucyB3aWxsIGJlIHJlcGxhY2VkIGJ5IGNmZzgwMjExIGFuZAorCSAgd2lsbCBiZSByZXF1aXJlZCBvbmx5IGJ5IGxlZ2FjeSBkcml2ZXJzIHRoYXQgaW1wbGVtZW50CisJICB3aXJlbGVzcyBleHRlbnNpb24gaGFuZGxlcnMuCisKKwkgIFNheSBOIChpZiB5b3UgY2FuKSB1bmxlc3MgeW91IGtub3cgeW91IG5lZWQgd2lyZWxlc3MKKwkgIGV4dGVuc2lvbnMgZm9yIGV4dGVybmFsIG1vZHVsZXMuCmRpZmYgLS1naXQgYS9uZXQvd2lyZWxlc3MvTWFrZWZpbGUgYi9uZXQvd2lyZWxlc3MvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E5NmFlNgotLS0gL2Rldi9udWxsCisrKyBiL25ldC93aXJlbGVzcy9NYWtlZmlsZQpAQCAtMCwwICsxLDQgQEAKK29iai0kKENPTkZJR19XSVJFTEVTU19FWFQpICs9IHdleHQubworb2JqLSQoQ09ORklHX0NGRzgwMjExKSArPSBjZmc4MDIxMS5vCisKK2NmZzgwMjExLXkgKz0gY29yZS5vIHN5c2ZzLm8KZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy9jb3JlLmMgYi9uZXQvd2lyZWxlc3MvY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlYWJkNTUKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvd2lyZWxlc3MvY29yZS5jCkBAIC0wLDAgKzEsMjI0IEBACisvKgorICogVGhpcyBpcyB0aGUgbGludXggd2lyZWxlc3MgY29uZmlndXJhdGlvbiBpbnRlcmZhY2UuCisgKgorICogQ29weXJpZ2h0IDIwMDYsIDIwMDcJCUpvaGFubmVzIEJlcmcgPGpvaGFubmVzQHNpcHNvbHV0aW9ucy5uZXQ+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2lmLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvbmw4MDIxMS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPG5ldC9nZW5ldGxpbmsuaD4KKyNpbmNsdWRlIDxuZXQvY2ZnODAyMTEuaD4KKyNpbmNsdWRlIDxuZXQvd2lyZWxlc3MuaD4KKyNpbmNsdWRlICJjb3JlLmgiCisjaW5jbHVkZSAic3lzZnMuaCIKKworLyogbmFtZSBmb3Igc3lzZnMsICVkIGlzIGFwcGVuZGVkICovCisjZGVmaW5lIFBIWV9OQU1FICJwaHkiCisKK01PRFVMRV9BVVRIT1IoIkpvaGFubmVzIEJlcmciKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVNDUklQVElPTigid2lyZWxlc3MgY29uZmlndXJhdGlvbiBzdXBwb3J0Iik7CisKKy8qIFJDVSBtaWdodCBiZSBhcHByb3ByaWF0ZSBoZXJlIHNpbmNlIHdlIHVzdWFsbHkKKyAqIG9ubHkgcmVhZCB0aGUgbGlzdCwgYW5kIHRoYXQgY2FuIGhhcHBlbiBxdWl0ZQorICogb2Z0ZW4gYmVjYXVzZSB3ZSBuZWVkIHRvIGRvIGl0IGZvciBlYWNoIGNvbW1hbmQgKi8KK0xJU1RfSEVBRChjZmc4MDIxMV9kcnZfbGlzdCk7CitERUZJTkVfTVVURVgoY2ZnODAyMTFfZHJ2X211dGV4KTsKK3N0YXRpYyBpbnQgd2lwaHlfY291bnRlcjsKKworLyogZm9yIGRlYnVnZnMgKi8KK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICppZWVlODAyMTFfZGVidWdmc19kaXI7CisKKy8qIGV4cG9ydGVkIGZ1bmN0aW9ucyAqLworCitzdHJ1Y3Qgd2lwaHkgKndpcGh5X25ldyhzdHJ1Y3QgY2ZnODAyMTFfb3BzICpvcHMsIGludCBzaXplb2ZfcHJpdikKK3sKKwlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKmRydjsKKwlpbnQgYWxsb2Nfc2l6ZTsKKworCWFsbG9jX3NpemUgPSBzaXplb2YoKmRydikgKyBzaXplb2ZfcHJpdjsKKworCWRydiA9IGt6YWxsb2MoYWxsb2Nfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkcnYpCisJCXJldHVybiBOVUxMOworCisJZHJ2LT5vcHMgPSBvcHM7CisKKwltdXRleF9sb2NrKCZjZmc4MDIxMV9kcnZfbXV0ZXgpOworCisJZHJ2LT5pZHggPSB3aXBoeV9jb3VudGVyOworCisJLyogbm93IGluY3JlYXNlIGNvdW50ZXIgZm9yIHRoZSBuZXh0IGRldmljZSB1bmxlc3MKKwkgKiBpdCBoYXMgd3JhcHBlZCBwcmV2aW91c2x5ICovCisJaWYgKHdpcGh5X2NvdW50ZXIgPj0gMCkKKwkJd2lwaHlfY291bnRlcisrOworCisJbXV0ZXhfdW5sb2NrKCZjZmc4MDIxMV9kcnZfbXV0ZXgpOworCisJaWYgKHVubGlrZWx5KGRydi0+aWR4IDwgMCkpIHsKKwkJLyogdWdoLCB3cmFwcGVkISAqLworCQlrZnJlZShkcnYpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBnaXZlIGl0IGEgcHJvcGVyIG5hbWUgKi8KKwlzbnByaW50ZihkcnYtPndpcGh5LmRldi5idXNfaWQsIEJVU19JRF9TSVpFLAorCQkgUEhZX05BTUUgIiVkIiwgZHJ2LT5pZHgpOworCisJbXV0ZXhfaW5pdCgmZHJ2LT5tdHgpOworCW11dGV4X2luaXQoJmRydi0+ZGV2bGlzdF9tdHgpOworCUlOSVRfTElTVF9IRUFEKCZkcnYtPm5ldGRldl9saXN0KTsKKworCWRldmljZV9pbml0aWFsaXplKCZkcnYtPndpcGh5LmRldik7CisJZHJ2LT53aXBoeS5kZXYuY2xhc3MgPSAmaWVlZTgwMjExX2NsYXNzOworCWRydi0+d2lwaHkuZGV2LnBsYXRmb3JtX2RhdGEgPSBkcnY7CisKKwlyZXR1cm4gJmRydi0+d2lwaHk7Cit9CitFWFBPUlRfU1lNQk9MKHdpcGh5X25ldyk7CisKK2ludCB3aXBoeV9yZWdpc3RlcihzdHJ1Y3Qgd2lwaHkgKndpcGh5KQoreworCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqZHJ2ID0gd2lwaHlfdG9fZGV2KHdpcGh5KTsKKwlpbnQgcmVzOworCisJbXV0ZXhfbG9jaygmY2ZnODAyMTFfZHJ2X211dGV4KTsKKworCXJlcyA9IGRldmljZV9hZGQoJmRydi0+d2lwaHkuZGV2KTsKKwlpZiAocmVzKQorCQlnb3RvIG91dF91bmxvY2s7CisKKwlsaXN0X2FkZCgmZHJ2LT5saXN0LCAmY2ZnODAyMTFfZHJ2X2xpc3QpOworCisJLyogYWRkIHRvIGRlYnVnZnMgKi8KKwlkcnYtPndpcGh5LmRlYnVnZnNkaXIgPQorCQlkZWJ1Z2ZzX2NyZWF0ZV9kaXIod2lwaHlfbmFtZSgmZHJ2LT53aXBoeSksCisJCQkJICAgaWVlZTgwMjExX2RlYnVnZnNfZGlyKTsKKworCXJlcyA9IDA7CitvdXRfdW5sb2NrOgorCW11dGV4X3VubG9jaygmY2ZnODAyMTFfZHJ2X211dGV4KTsKKwlyZXR1cm4gcmVzOworfQorRVhQT1JUX1NZTUJPTCh3aXBoeV9yZWdpc3Rlcik7CisKK3ZvaWQgd2lwaHlfdW5yZWdpc3RlcihzdHJ1Y3Qgd2lwaHkgKndpcGh5KQoreworCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqZHJ2ID0gd2lwaHlfdG9fZGV2KHdpcGh5KTsKKworCS8qIHByb3RlY3QgdGhlIGRldmljZSBsaXN0ICovCisJbXV0ZXhfbG9jaygmY2ZnODAyMTFfZHJ2X211dGV4KTsKKworCUJVR19PTighbGlzdF9lbXB0eSgmZHJ2LT5uZXRkZXZfbGlzdCkpOworCisJLyoKKwkgKiBUcnkgdG8gZ3JhYiBkcnYtPm10eC4gSWYgYSBjb21tYW5kIGlzIHN0aWxsIGluIHByb2dyZXNzLAorCSAqIGhvcGVmdWxseSB0aGUgZHJpdmVyIHdpbGwgcmVmdXNlIGl0IHNpbmNlIGl0J3MgdGVhcmluZworCSAqIGRvd24gdGhlIGRldmljZSBhbHJlYWR5LiBXZSB3YWl0IGZvciB0aGlzIGNvbW1hbmQgdG8gY29tcGxldGUKKwkgKiBiZWZvcmUgdW5saW5raW5nIHRoZSBpdGVtIGZyb20gdGhlIGxpc3QuCisJICogTm90ZTogYXMgY29kaWZpZWQgYnkgdGhlIEJVR19PTiBhYm92ZSB3ZSBjYW5ub3QgZ2V0IGhlcmUgaWYKKwkgKiBhIHZpcnR1YWwgaW50ZXJmYWNlIGlzIHN0aWxsIGFzc29jaWF0ZWQuIEhlbmNlLCB3ZSBjYW4gb25seQorCSAqIGdldCB0byBsb2NrIGNvbnRlbnRpb24gaGVyZSBpZiB1c2Vyc3BhY2UgaXNzdWVzIGEgY29tbWFuZAorCSAqIHRoYXQgaWRlbnRpZmllZCB0aGUgaGFyZHdhcmUgYnkgd2lwaHkgaW5kZXguCisJICovCisJbXV0ZXhfbG9jaygmZHJ2LT5tdHgpOworCS8qIHVubG9jayBhZ2FpbiBiZWZvcmUgZnJlZWluZyAqLworCW11dGV4X3VubG9jaygmZHJ2LT5tdHgpOworCisJbGlzdF9kZWwoJmRydi0+bGlzdCk7CisJZGV2aWNlX2RlbCgmZHJ2LT53aXBoeS5kZXYpOworCWRlYnVnZnNfcmVtb3ZlKGRydi0+d2lwaHkuZGVidWdmc2Rpcik7CisKKwltdXRleF91bmxvY2soJmNmZzgwMjExX2Rydl9tdXRleCk7Cit9CitFWFBPUlRfU1lNQk9MKHdpcGh5X3VucmVnaXN0ZXIpOworCit2b2lkIGNmZzgwMjExX2Rldl9mcmVlKHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqZHJ2KQoreworCW11dGV4X2Rlc3Ryb3koJmRydi0+bXR4KTsKKwltdXRleF9kZXN0cm95KCZkcnYtPmRldmxpc3RfbXR4KTsKKwlrZnJlZShkcnYpOworfQorCit2b2lkIHdpcGh5X2ZyZWUoc3RydWN0IHdpcGh5ICp3aXBoeSkKK3sKKwlwdXRfZGV2aWNlKCZ3aXBoeS0+ZGV2KTsKK30KK0VYUE9SVF9TWU1CT0wod2lwaHlfZnJlZSk7CisKK3N0YXRpYyBpbnQgY2ZnODAyMTFfbmV0ZGV2X25vdGlmaWVyX2NhbGwoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICogbmIsCisJCQkJCSB1bnNpZ25lZCBsb25nIHN0YXRlLAorCQkJCQkgdm9pZCAqbmRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbmRldjsKKwlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXY7CisKKwlpZiAoIWRldi0+aWVlZTgwMjExX3B0cikKKwkJcmV0dXJuIDA7CisKKwlyZGV2ID0gd2lwaHlfdG9fZGV2KGRldi0+aWVlZTgwMjExX3B0ci0+d2lwaHkpOworCisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2UgTkVUREVWX1JFR0lTVEVSOgorCQltdXRleF9sb2NrKCZyZGV2LT5kZXZsaXN0X210eCk7CisJCWxpc3RfYWRkKCZkZXYtPmllZWU4MDIxMV9wdHItPmxpc3QsICZyZGV2LT5uZXRkZXZfbGlzdCk7CisJCWlmIChzeXNmc19jcmVhdGVfbGluaygmZGV2LT5kZXYua29iaiwgJnJkZXYtPndpcGh5LmRldi5rb2JqLAorCQkJCSAgICAgICJwaHk4MDIxMSIpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIndpcmVsZXNzOiBmYWlsZWQgdG8gYWRkIHBoeTgwMjExICIKKwkJCQkic3ltbGluayB0byBuZXRkZXYhXG4iKTsKKwkJfQorCQlkZXYtPmllZWU4MDIxMV9wdHItPm5ldGRldiA9IGRldjsKKwkJbXV0ZXhfdW5sb2NrKCZyZGV2LT5kZXZsaXN0X210eCk7CisJCWJyZWFrOworCWNhc2UgTkVUREVWX1VOUkVHSVNURVI6CisJCW11dGV4X2xvY2soJnJkZXYtPmRldmxpc3RfbXR4KTsKKwkJaWYgKCFsaXN0X2VtcHR5KCZkZXYtPmllZWU4MDIxMV9wdHItPmxpc3QpKSB7CisJCQlzeXNmc19yZW1vdmVfbGluaygmZGV2LT5kZXYua29iaiwgInBoeTgwMjExIik7CisJCQlsaXN0X2RlbF9pbml0KCZkZXYtPmllZWU4MDIxMV9wdHItPmxpc3QpOworCQl9CisJCW11dGV4X3VubG9jaygmcmRldi0+ZGV2bGlzdF9tdHgpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBjZmc4MDIxMV9uZXRkZXZfbm90aWZpZXIgPSB7CisJLm5vdGlmaWVyX2NhbGwgPSBjZmc4MDIxMV9uZXRkZXZfbm90aWZpZXJfY2FsbCwKK307CisKK3N0YXRpYyBpbnQgY2ZnODAyMTFfaW5pdCh2b2lkKQoreworCWludCBlcnIgPSB3aXBoeV9zeXNmc19pbml0KCk7CisJaWYgKGVycikKKwkJZ290byBvdXRfZmFpbF9zeXNmczsKKworCWVyciA9IHJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmY2ZnODAyMTFfbmV0ZGV2X25vdGlmaWVyKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9mYWlsX25vdGlmaWVyOworCisJaWVlZTgwMjExX2RlYnVnZnNfZGlyID0gZGVidWdmc19jcmVhdGVfZGlyKCJpZWVlODAyMTEiLCBOVUxMKTsKKworCXJldHVybiAwOworCitvdXRfZmFpbF9ub3RpZmllcjoKKwl3aXBoeV9zeXNmc19leGl0KCk7CitvdXRfZmFpbF9zeXNmczoKKwlyZXR1cm4gZXJyOworfQorbW9kdWxlX2luaXQoY2ZnODAyMTFfaW5pdCk7CisKK3N0YXRpYyB2b2lkIGNmZzgwMjExX2V4aXQodm9pZCkKK3sKKwlkZWJ1Z2ZzX3JlbW92ZShpZWVlODAyMTFfZGVidWdmc19kaXIpOworCXVucmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZjZmc4MDIxMV9uZXRkZXZfbm90aWZpZXIpOworCXdpcGh5X3N5c2ZzX2V4aXQoKTsKK30KK21vZHVsZV9leGl0KGNmZzgwMjExX2V4aXQpOwpkaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL2NvcmUuaCBiL25ldC93aXJlbGVzcy9jb3JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU4ZGIxZQotLS0gL2Rldi9udWxsCisrKyBiL25ldC93aXJlbGVzcy9jb3JlLmgKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIFdpcmVsZXNzIGNvbmZpZ3VyYXRpb24gaW50ZXJmYWNlIGludGVybmFscy4KKyAqCisgKiBDb3B5cmlnaHQgMjAwNiwgMjAwNyBKb2hhbm5lcyBCZXJnIDxqb2hhbm5lc0BzaXBzb2x1dGlvbnMubmV0PgorICovCisjaWZuZGVmIF9fTkVUX1dJUkVMRVNTX0NPUkVfSAorI2RlZmluZSBfX05FVF9XSVJFTEVTU19DT1JFX0gKKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxuZXQvZ2VuZXRsaW5rLmg+CisjaW5jbHVkZSA8bmV0L3dpcmVsZXNzLmg+CisjaW5jbHVkZSA8bmV0L2NmZzgwMjExLmg+CisKK3N0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSB7CisJc3RydWN0IGNmZzgwMjExX29wcyAqb3BzOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwkvKiB3ZSBob2xkIHRoaXMgbXV0ZXggZHVyaW5nIGFueSBjYWxsIHNvIHRoYXQKKwkgKiB3ZSBjYW5ub3QgZG8gbXVsdGlwbGUgY2FsbHMgYXQgb25jZSwgYW5kIGFsc28KKwkgKiB0byBhdm9pZCB0aGUgZGVyZWdpc3RlciBjYWxsIHRvIHByb2NlZWQgd2hpbGUKKwkgKiBhbnkgY2FsbCBpcyBpbiBwcm9ncmVzcyAqLworCXN0cnVjdCBtdXRleCBtdHg7CisKKwkvKiB3aXBoeSBpbmRleCwgaW50ZXJuYWwgb25seSAqLworCWludCBpZHg7CisKKwkvKiBhc3NvY2lhdGUgbmV0ZGV2IGxpc3QgKi8KKwlzdHJ1Y3QgbXV0ZXggZGV2bGlzdF9tdHg7CisJc3RydWN0IGxpc3RfaGVhZCBuZXRkZXZfbGlzdDsKKworCS8qIG11c3QgYmUgbGFzdCBiZWNhdXNlIG9mIHRoZSB3YXkgd2UgZG8gd2lwaHlfcHJpdigpLAorCSAqIGFuZCBpdCBzaG91bGQgYXQgbGVhc3QgYmUgYWxpZ25lZCB0byBORVRERVZfQUxJR04gKi8KKwlzdHJ1Y3Qgd2lwaHkgd2lwaHkgX19hdHRyaWJ1dGVfXygoX19hbGlnbmVkX18oTkVUREVWX0FMSUdOKSkpOworfTsKKworc3RhdGljIGlubGluZQorc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICp3aXBoeV90b19kZXYoc3RydWN0IHdpcGh5ICp3aXBoeSkKK3sKKwlCVUdfT04oIXdpcGh5KTsKKwlyZXR1cm4gY29udGFpbmVyX29mKHdpcGh5LCBzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UsIHdpcGh5KTsKK30KKworZXh0ZXJuIHN0cnVjdCBtdXRleCBjZmc4MDIxMV9kcnZfbXV0ZXg7CitleHRlcm4gc3RydWN0IGxpc3RfaGVhZCBjZmc4MDIxMV9kcnZfbGlzdDsKKworLyogZnJlZSBvYmplY3QgKi8KK2V4dGVybiB2b2lkIGNmZzgwMjExX2Rldl9mcmVlKHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqZHJ2KTsKKworI2VuZGlmIC8qIF9fTkVUX1dJUkVMRVNTX0NPUkVfSCAqLwpkaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL3N5c2ZzLmMgYi9uZXQvd2lyZWxlc3Mvc3lzZnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWJhZTE0Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L3dpcmVsZXNzL3N5c2ZzLmMKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqIFRoaXMgZmlsZSBwcm92aWRlcyAvc3lzL2NsYXNzL2llZWU4MDIxMS88d2lwaHkgbmFtZT4vCisgKiBhbmQgc29tZSBkZWZhdWx0IGF0dHJpYnV0ZXMuCisgKgorICogQ29weXJpZ2h0IDIwMDUtMjAwNglKaXJpIEJlbmMgPGpiZW5jQHN1c2UuY3o+CisgKiBDb3B5cmlnaHQgMjAwNglKb2hhbm5lcyBCZXJnIDxqb2hhbm5lc0BzaXBzb2x1dGlvbnMubmV0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBHUEx2MiBhcyBmb3VuZCBpbiBDT1BZSU5HLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ubDgwMjExLmg+CisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisjaW5jbHVkZSA8bmV0L2NmZzgwMjExLmg+CisjaW5jbHVkZSAic3lzZnMuaCIKKyNpbmNsdWRlICJjb3JlLmgiCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpkZXZfdG9fcmRldigKKwlzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSwgd2lwaHkuZGV2KTsKK30KKworc3RhdGljIHNzaXplX3QgX3Nob3dfaW5kZXgoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgZGV2X3RvX3JkZXYoZGV2KS0+aWR4KTsKK30KKworc3RhdGljIHNzaXplX3QgX3Nob3dfcGVybWFkZHIoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgICBjaGFyICpidWYpCit7CisJY2hhciAqYWRkciA9IGRldl90b19yZGV2KGRldiktPndpcGh5LnBlcm1fYWRkcjsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiUuMng6JS4yeDolLjJ4OiUuMng6JS4yeDolLjJ4XG4iLAorCQkgICAgICAgYWRkclswXSwgYWRkclsxXSwgYWRkclsyXSwgYWRkclszXSwgYWRkcls0XSwgYWRkcls1XSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBpZWVlODAyMTFfZGV2X2F0dHJzW10gPSB7CisJX19BVFRSKGluZGV4LCBTX0lSVUdPLCBfc2hvd19pbmRleCwgTlVMTCksCisJX19BVFRSKG1hY2FkZHJlc3MsIFNfSVJVR08sIF9zaG93X3Blcm1hZGRyLCBOVUxMKSwKKwl7fQorfTsKKworc3RhdGljIHZvaWQgd2lwaHlfZGV2X3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IGRldl90b19yZGV2KGRldik7CisKKwljZmc4MDIxMV9kZXZfZnJlZShyZGV2KTsKK30KKworc3RhdGljIGludCB3aXBoeV91ZXZlbnQoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICoqZW52cCwKKwkJCWludCBudW1fZW52cCwgY2hhciAqYnVmLCBpbnQgc2l6ZSkKK3sKKwkvKiBUT0RPLCB3ZSBwcm9iYWJseSBuZWVkIHN0dWZmIGhlcmUgKi8KKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGNsYXNzIGllZWU4MDIxMV9jbGFzcyA9IHsKKwkubmFtZSA9ICJpZWVlODAyMTEiLAorCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5kZXZfcmVsZWFzZSA9IHdpcGh5X2Rldl9yZWxlYXNlLAorCS5kZXZfYXR0cnMgPSBpZWVlODAyMTFfZGV2X2F0dHJzLAorI2lmZGVmIENPTkZJR19IT1RQTFVHCisJLmRldl91ZXZlbnQgPSB3aXBoeV91ZXZlbnQsCisjZW5kaWYKK307CisKK2ludCB3aXBoeV9zeXNmc19pbml0KHZvaWQpCit7CisJcmV0dXJuIGNsYXNzX3JlZ2lzdGVyKCZpZWVlODAyMTFfY2xhc3MpOworfQorCit2b2lkIHdpcGh5X3N5c2ZzX2V4aXQodm9pZCkKK3sKKwljbGFzc191bnJlZ2lzdGVyKCZpZWVlODAyMTFfY2xhc3MpOworfQpkaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL3N5c2ZzLmggYi9uZXQvd2lyZWxlc3Mvc3lzZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWFjYmViCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3dpcmVsZXNzL3N5c2ZzLmgKQEAgLTAsMCArMSw5IEBACisjaWZuZGVmIF9fV0lSRUxFU1NfU1lTRlNfSAorI2RlZmluZSBfX1dJUkVMRVNTX1NZU0ZTX0gKKworZXh0ZXJuIGludCB3aXBoeV9zeXNmc19pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgd2lwaHlfc3lzZnNfZXhpdCh2b2lkKTsKKworZXh0ZXJuIHN0cnVjdCBjbGFzcyBpZWVlODAyMTFfY2xhc3M7CisKKyNlbmRpZiAvKiBfX1dJUkVMRVNTX1NZU0ZTX0ggKi8KZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy93ZXh0LmMgYi9uZXQvd2lyZWxlc3Mvd2V4dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2YWFmNjUKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvd2lyZWxlc3Mvd2V4dC5jCkBAIC0wLDAgKzEsMTUwOSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpbXBsZW1lbnQgdGhlIFdpcmVsZXNzIEV4dGVuc2lvbnMgQVBJcy4KKyAqCisgKiBBdXRob3JzIDoJSmVhbiBUb3VycmlsaGVzIC0gSFBMIC0gPGp0QGhwbC5ocC5jb20+CisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAwNyBKZWFuIFRvdXJyaWxoZXMsIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogKEFzIGFsbCBwYXJ0IG9mIHRoZSBMaW51eCBrZXJuZWwsIHRoaXMgZmlsZSBpcyBHUEwpCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqIERPQ1VNRU5UQVRJT04gKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogQVBJIGRlZmluaXRpb24gOgorICogLS0tLS0tLS0tLS0tLS0KKyAqIFNlZSA8bGludXgvd2lyZWxlc3MuaD4gZm9yIGRldGFpbHMgb2YgdGhlIEFQSXMgYW5kIHRoZSByZXN0LgorICoKKyAqIEhpc3RvcnkgOgorICogLS0tLS0tLQorICoKKyAqIHYxIC0gNS4xMi4wMSAtIEplYW4gSUkKKyAqCW8gQ3JlYXRlZCB0aGlzIGZpbGUuCisgKgorICogdjIgLSAxMy4xMi4wMSAtIEplYW4gSUkKKyAqCW8gTW92ZSAvcHJvYy9uZXQvd2lyZWxlc3Mgc3R1ZmYgZnJvbSBuZXQvY29yZS9kZXYuYyB0byBoZXJlCisgKglvIE1ha2UgV2lyZWxlc3MgRXh0ZW5zaW9uIElPQ1RMcyBnbyB0aHJvdWdoIGhlcmUKKyAqCW8gQWRkZWQgaXdfaGFuZGxlciBoYW5kbGluZyA7LSkKKyAqCW8gQWRkZWQgc3RhbmRhcmQgaW9jdGwgZGVzY3JpcHRpb24KKyAqCW8gSW5pdGlhbCBkdW1iIGNvbW1pdCBzdHJhdGVneSBiYXNlZCBvbiBvcmlub2NvLmMKKyAqCisgKiB2MyAtIDE5LjEyLjAxIC0gSmVhbiBJSQorICoJbyBNYWtlIHN1cmUgd2UgZG9uJ3QgZ28gb3V0IG9mIHN0YW5kYXJkX2lvY3RsW10gaW4gaW9jdGxfc3RhbmRhcmRfY2FsbAorICoJbyBBZGQgZXZlbnQgZGlzcGF0Y2hlciBmdW5jdGlvbgorICoJbyBBZGQgZXZlbnQgZGVzY3JpcHRpb24KKyAqCW8gUHJvcGFnYXRlIGV2ZW50cyBhcyBydG5ldGxpbmsgSUZMQV9XSVJFTEVTUyBvcHRpb24KKyAqCW8gR2VuZXJhdGUgZXZlbnQgb24gc2VsZWN0ZWQgU0VUIHJlcXVlc3RzCisgKgorICogdjQgLSAxOC4wNC4wMiAtIEplYW4gSUkKKyAqCW8gRml4IHN0dXBpZCBvZmYgYnkgb25lIGluIGl3X2lvY3RsX2Rlc2NyaXB0aW9uIDogSVdfRVNTSURfTUFYX1NJWkUgKyAxCisgKgorICogdjUgLSAyMS4wNi4wMiAtIEplYW4gSUkKKyAqCW8gQWRkIElXX1BSSVZfVFlQRV9BRERSIGluIHByaXZfdHlwZV9zaXplICgrY2xlYW51cCkKKyAqCW8gUmVzaHVmZmxlIElXX0hFQURFUl9UWVBFX1hYWCB0byBtYXAgSVdfUFJJVl9UWVBFX1hYWCBjaGFuZ2VzCisgKglvIEFkZCBJV0VWQ1VTVE9NIGZvciBkcml2ZXIgc3BlY2lmaWMgZXZlbnQvc2Nhbm5pbmcgdG9rZW4KKyAqCW8gVHVybiBvbiBXRV9TVFJJQ1RfV1JJVEUgYnkgZGVmYXVsdCArIGtlcm5lbCB3YXJuaW5nCisgKglvIEZpeCBXRV9TVFJJQ1RfV1JJVEUgaW4gaW9jdGxfZXhwb3J0X3ByaXZhdGUoKSAoMzIgPT4gaXdfbnVtKQorICoJbyBGaXggb2ZmLWJ5LW9uZSBpbiB0ZXN0IChleHRyYV9zaXplIDw9IElGTkFNU0laKQorICoKKyAqIHY2IC0gOS4wMS4wMyAtIEplYW4gSUkKKyAqCW8gQWRkIGNvbW1vbiBzcHkgc3VwcG9ydCA6IGl3X2hhbmRsZXJfc2V0X3NweSgpLCB3aXJlbGVzc19zcHlfdXBkYXRlKCkKKyAqCW8gQWRkIGVuaGFuY2VkIHNweSBzdXBwb3J0IDogaXdfaGFuZGxlcl9zZXRfdGhyc3B5KCkgYW5kIGV2ZW50LgorICoJbyBBZGQgV0lSRUxFU1NfRVhUIHZlcnNpb24gZGlzcGxheSBpbiAvcHJvYy9uZXQvd2lyZWxlc3MKKyAqCisgKiB2NiAtIDE4LjA2LjA0IC0gSmVhbiBJSQorICoJbyBDaGFuZ2UgZ2V0X3NweWRhdGEoKSBtZXRob2QgZm9yIGFkZGVkIHNhZmV0eQorICoJbyBSZW1vdmUgc3B5ICNpZmRlZiwgdGhleSBhcmUgYWx3YXlzIG9uIC0+IGNsZWFuZXIgY29kZQorICoJbyBBbGxvdyBhbnkgc2l6ZSBHRVQgcmVxdWVzdCBpZiB1c2VyIHNwZWNpZmllcyBsZW5ndGggPiBtYXgKKyAqCQlhbmQgaWYgcmVxdWVzdCBoYXMgSVdfREVTQ1JfRkxBR19OT01BWCBmbGFnIG9yIGlzIFNJT0NHSVdQUklWCisgKglvIFN0YXJ0IG1pZ3JhdGluZyBnZXRfd2lyZWxlc3Nfc3RhdHMgdG8gc3RydWN0IGl3X2hhbmRsZXJfZGVmCisgKglvIEFkZCB3bWIoKSBpbiBpd19oYW5kbGVyX3NldF9zcHkoKSBmb3Igbm9uLWNvaGVyZW50IGFyY2hzL2NwdXMKKyAqIEJhc2VkIG9uIHBhdGNoIGZyb20gUGF2ZWwgUm9za2luIDxwcm9za2lAZ251Lm9yZz4gOgorICoJbyBGaXgga2VybmVsIGRhdGEgbGVhayB0byB1c2VyIHNwYWNlIGluIHByaXZhdGUgaGFuZGxlciBoYW5kbGluZworICoKKyAqIHY3IC0gMTguMy4wNSAtIEplYW4gSUkKKyAqCW8gUmVtb3ZlIChzdHJ1Y3QgaXdfcG9pbnQgKiktPnBvaW50ZXIgZnJvbSBldmVudHMgYW5kIHN0cmVhbXMKKyAqCW8gUmVtb3ZlIHNweV9vZmZzZXQgZnJvbSBzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYKKyAqCW8gU3RhcnQgZGVwcmVjYXRpbmcgZGV2LT5nZXRfd2lyZWxlc3Nfc3RhdHMsIG91dHB1dCBhIHdhcm5pbmcKKyAqCW8gSWYgSVdfUVVBTF9EQk0gaXMgc2V0LCBzaG93IGRCbSB2YWx1ZXMgaW4gL3Byb2MvbmV0L3dpcmVsZXNzCisgKglvIERvbid0IGxvb3NlIElOVkFMSUQvREJNIGZsYWdzIHdoZW4gY2xlYXJpbmcgVVBEQVRFRCBmbGFncyAoaXdzdGF0cykKKyAqCisgKiB2OCAtIDE3LjAyLjA2IC0gSmVhbiBJSQorICoJbyBSdE5ldGxpbmsgcmVxdWVzdHMgc3VwcG9ydCAoU0VUL0dFVCkKKyAqCisgKiB2OGIgLSAwMy4wOC4wNiAtIEhlcmJlcnQgWHUKKyAqCW8gRml4IFdpcmVsZXNzIEV2ZW50IGxvY2tpbmcgaXNzdWVzLgorICoKKyAqIHY5IC0gMTQuMy4wNiAtIEplYW4gSUkKKyAqCW8gQ2hhbmdlIGxlbmd0aCBpbiBFU1NJRCBhbmQgTklDSyB0byBzdHJsZW4oKSBpbnN0ZWFkIG9mIHN0cmxlbigpKzEKKyAqCW8gTWFrZSBzdGFuZGFyZF9pb2N0bF9udW0gYW5kIHN0YW5kYXJkX2V2ZW50X251bSB1bnNpZ25lZAorICoJbyBSZW1vdmUgKHN0cnVjdCBuZXRfZGV2aWNlICopLT5nZXRfd2lyZWxlc3Nfc3RhdHMoKQorICoKKyAqIHYxMCAtIDE2LjMuMDcgLSBKZWFuIElJCisgKglvIFByZXZlbnQgbGVha2luZyBvZiBrZXJuZWwgc3BhY2UgaW4gc3RyZWFtIG9uIDY0IGJpdHMuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIElOQ0xVREVTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4JCS8qIG9mZl90ICovCisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CQkvKiBzdHJ1Y3QgaWZyZXEsIGRldl9nZXRfYnlfbmFtZSgpICovCisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgkJLyogcnRuZXRsaW5rIHN0dWZmICovCisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CQkJLyogZm9yIF9faW5pdCAqLworI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgkJLyogQVJQSFJEX0VUSEVSICovCisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4JCS8qIGNvbXBhcmVfZXRoZXJfYWRkciAqLworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4JCS8qIFByZXR0eSBvYnZpb3VzICovCisjaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4JCS8qIE5ldyBkcml2ZXIgQVBJICovCisjaW5jbHVkZSA8bmV0L25ldGxpbmsuaD4KKyNpbmNsdWRlIDxuZXQvd2V4dC5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4JCS8qIGNvcHlfdG9fdXNlcigpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqIEdMT0JBTCBWQVJJQUJMRVMgKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBZb3Ugc2hvdWxkIG5vdCB1c2UgZ2xvYmFsIHZhcmlhYmxlcywgYmVjYXVzZSBvZiByZS1lbnRyYW5jeS4KKyAqIE9uIG91ciBjYXNlLCBpdCdzIG9ubHkgY29uc3QsIHNvIGl0J3MgT0suLi4KKyAqLworLyoKKyAqIE1ldGEtZGF0YSBhYm91dCBhbGwgdGhlIHN0YW5kYXJkIFdpcmVsZXNzIEV4dGVuc2lvbiByZXF1ZXN0IHdlCisgKiBrbm93IGFib3V0LgorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGl3X2lvY3RsX2Rlc2NyaXB0aW9uIHN0YW5kYXJkX2lvY3RsW10gPSB7CisJW1NJT0NTSVdDT01NSVQJLSBTSU9DSVdGSVJTVF0gPSB7CisJCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX05VTEwsCisJfSwKKwlbU0lPQ0dJV05BTUUJLSBTSU9DSVdGSVJTVF0gPSB7CisJCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX0NIQVIsCisJCS5mbGFncwkJPSBJV19ERVNDUl9GTEFHX0RVTVAsCisJfSwKKwlbU0lPQ1NJV05XSUQJLSBTSU9DSVdGSVJTVF0gPSB7CisJCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1BBUkFNLAorCQkuZmxhZ3MJCT0gSVdfREVTQ1JfRkxBR19FVkVOVCwKKwl9LAorCVtTSU9DR0lXTldJRAktIFNJT0NJV0ZJUlNUXSA9IHsKKwkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfUEFSQU0sCisJCS5mbGFncwkJPSBJV19ERVNDUl9GTEFHX0RVTVAsCisJfSwKKwlbU0lPQ1NJV0ZSRVEJLSBTSU9DSVdGSVJTVF0gPSB7CisJCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX0ZSRVEsCisJCS5mbGFncwkJPSBJV19ERVNDUl9GTEFHX0VWRU5ULAorCX0sCisJW1NJT0NHSVdGUkVRCS0gU0lPQ0lXRklSU1RdID0geworCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9GUkVRLAorCQkuZmxhZ3MJCT0gSVdfREVTQ1JfRkxBR19EVU1QLAorCX0sCisJW1NJT0NTSVdNT0RFCS0gU0lPQ0lXRklSU1RdID0geworCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9VSU5ULAorCQkuZmxhZ3MJCT0gSVdfREVTQ1JfRkxBR19FVkVOVCwKKwl9LAorCVtTSU9DR0lXTU9ERQktIFNJT0NJV0ZJUlNUXSA9IHsKKwkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfVUlOVCwKKwkJLmZsYWdzCQk9IElXX0RFU0NSX0ZMQUdfRFVNUCwKKwl9LAorCVtTSU9DU0lXU0VOUwktIFNJT0NJV0ZJUlNUXSA9IHsKKwkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfUEFSQU0sCisJfSwKKwlbU0lPQ0dJV1NFTlMJLSBTSU9DSVdGSVJTVF0gPSB7CisJCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1BBUkFNLAorCX0sCisJW1NJT0NTSVdSQU5HRQktIFNJT0NJV0ZJUlNUXSA9IHsKKwkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfTlVMTCwKKwl9LAorCVtTSU9DR0lXUkFOR0UJLSBTSU9DSVdGSVJTVF0gPSB7CisJCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1BPSU5ULAorCQkudG9rZW5fc2l6ZQk9IDEsCisJCS5tYXhfdG9rZW5zCT0gc2l6ZW9mKHN0cnVjdCBpd19yYW5nZSksCisJCS5mbGFncwkJPSBJV19ERVNDUl9GTEFHX0RVTVAsCisJfSwKKwlbU0lPQ1NJV1BSSVYJLSBTSU9DSVdGSVJTVF0gPSB7CisJCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX05VTEwsCisJfSwKKwlbU0lPQ0dJV1BSSVYJLSBTSU9DSVdGSVJTVF0gPSB7IC8qIChoYW5kbGVkIGRpcmVjdGx5IGJ5IHVzKSAqLworCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9QT0lOVCwKKwkJLnRva2VuX3NpemUJPSBzaXplb2Yoc3RydWN0IGl3X3ByaXZfYXJncyksCisJCS5tYXhfdG9rZW5zCT0gMTYsCisJCS5mbGFncwkJPSBJV19ERVNDUl9GTEFHX05PTUFYLAorCX0sCisJW1NJT0NTSVdTVEFUUwktIFNJT0NJV0ZJUlNUXSA9IHsKKwkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfTlVMTCwKKwl9LAorCVtTSU9DR0lXU1RBVFMJLSBTSU9DSVdGSVJTVF0gPSB7IC8qIChoYW5kbGVkIGRpcmVjdGx5IGJ5IHVzKSAqLworCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9QT0lOVCwKKwkJLnRva2VuX3NpemUJPSAxLAorCQkubWF4X3Rva2Vucwk9IHNpemVvZihzdHJ1Y3QgaXdfc3RhdGlzdGljcyksCisJCS5mbGFncwkJPSBJV19ERVNDUl9GTEFHX0RVTVAsCisJfSwKKwlbU0lPQ1NJV1NQWQktIFNJT0NJV0ZJUlNUXSA9IHsKKwkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfUE9JTlQsCisJCS50b2tlbl9zaXplCT0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkciksCisJCS5tYXhfdG9rZW5zCT0gSVdfTUFYX1NQWSwKKwl9LAorCVtTSU9DR0lXU1BZCS0gU0lPQ0lXRklSU1RdID0geworCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9QT0lOVCwKKwkJLnRva2VuX3NpemUJPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyKSArCisJCQkJICBzaXplb2Yoc3RydWN0IGl3X3F1YWxpdHkpLAorCQkubWF4X3Rva2Vucwk9IElXX01BWF9TUFksCisJfSwKKwlbU0lPQ1NJV1RIUlNQWQktIFNJT0NJV0ZJUlNUXSA9IHsKKwkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfUE9JTlQsCisJCS50b2tlbl9zaXplCT0gc2l6ZW9mKHN0cnVjdCBpd190aHJzcHkpLAorCQkubWluX3Rva2Vucwk9IDEsCisJCS5tYXhfdG9rZW5zCT0gMSwKKwl9LAorCVtTSU9DR0lXVEhSU1BZCS0gU0lPQ0lXRklSU1RdID0geworCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9QT0lOVCwKKwkJLnRva2VuX3NpemUJPSBzaXplb2Yoc3RydWN0IGl3X3RocnNweSksCisJCS5taW5fdG9rZW5zCT0gMSwKKwkJLm1heF90b2tlbnMJPSAxLAorCX0sCisJW1NJT0NTSVdBUAktIFNJT0NJV0ZJUlNUXSA9IHsKKwkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfQUREUiwKKwl9LAorCVtTSU9DR0lXQVAJLSBTSU9DSVdGSVJTVF0gPSB7CisJCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX0FERFIsCisJCS5mbGFncwkJPSBJV19ERVNDUl9GTEFHX0RVTVAsCisJfSwKKwlbU0lPQ1NJV01MTUUJLSBTSU9DSVdGSVJTVF0gPSB7CisJCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1BPSU5ULAorCQkudG9rZW5fc2l6ZQk9IDEsCisJCS5taW5fdG9rZW5zCT0gc2l6ZW9mKHN0cnVjdCBpd19tbG1lKSwKKwkJLm1heF90b2tlbnMJPSBzaXplb2Yoc3RydWN0IGl3X21sbWUpLAorCX0sCisJW1NJT0NHSVdBUExJU1QJLSBTSU9DSVdGSVJTVF0gPSB7CisJCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1BPSU5ULAorCQkudG9rZW5fc2l6ZQk9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpICsKKwkJCQkgIHNpemVvZihzdHJ1Y3QgaXdfcXVhbGl0eSksCisJCS5tYXhfdG9rZW5zCT0gSVdfTUFYX0FQLAorCQkuZmxhZ3MJCT0gSVdfREVTQ1JfRkxBR19OT01BWCwKKwl9LAorCVtTSU9DU0lXU0NBTgktIFNJT0NJV0ZJUlNUXSA9IHsKKwkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfUE9JTlQsCisJCS50b2tlbl9zaXplCT0gMSwKKwkJLm1pbl90b2tlbnMJPSAwLAorCQkubWF4X3Rva2Vucwk9IHNpemVvZihzdHJ1Y3QgaXdfc2Nhbl9yZXEpLAorCX0sCisJW1NJT0NHSVdTQ0FOCS0gU0lPQ0lXRklSU1RdID0geworCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9QT0lOVCwKKwkJLnRva2VuX3NpemUJPSAxLAorCQkubWF4X3Rva2Vucwk9IElXX1NDQU5fTUFYX0RBVEEsCisJCS5mbGFncwkJPSBJV19ERVNDUl9GTEFHX05PTUFYLAorCX0sCisJW1NJT0NTSVdFU1NJRAktIFNJT0NJV0ZJUlNUXSA9IHsKKwkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfUE9JTlQsCisJCS50b2tlbl9zaXplCT0gMSwKKwkJLm1heF90b2tlbnMJPSBJV19FU1NJRF9NQVhfU0laRSwKKwkJLmZsYWdzCQk9IElXX0RFU0NSX0ZMQUdfRVZFTlQsCisJfSwKKwlbU0lPQ0dJV0VTU0lECS0gU0lPQ0lXRklSU1RdID0geworCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9QT0lOVCwKKwkJLnRva2VuX3NpemUJPSAxLAorCQkubWF4X3Rva2Vucwk9IElXX0VTU0lEX01BWF9TSVpFLAorCQkuZmxhZ3MJCT0gSVdfREVTQ1JfRkxBR19EVU1QLAorCX0sCisJW1NJT0NTSVdOSUNLTgktIFNJT0NJV0ZJUlNUXSA9IHsKKwkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfUE9JTlQsCisJCS50b2tlbl9zaXplCT0gMSwKKwkJLm1heF90b2tlbnMJPSBJV19FU1NJRF9NQVhfU0laRSwKKwl9LAorCVtTSU9DR0lXTklDS04JLSBTSU9DSVdGSVJTVF0gPSB7CisJCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1BPSU5ULAorCQkudG9rZW5fc2l6ZQk9IDEsCisJCS5tYXhfdG9rZW5zCT0gSVdfRVNTSURfTUFYX1NJWkUsCisJfSwKKwlbU0lPQ1NJV1JBVEUJLSBTSU9DSVdGSVJTVF0gPSB7CisJCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1BBUkFNLAorCX0sCisJW1NJT0NHSVdSQVRFCS0gU0lPQ0lXRklSU1RdID0geworCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9QQVJBTSwKKwl9LAorCVtTSU9DU0lXUlRTCS0gU0lPQ0lXRklSU1RdID0geworCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9QQVJBTSwKKwl9LAorCVtTSU9DR0lXUlRTCS0gU0lPQ0lXRklSU1RdID0geworCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9QQVJBTSwKKwl9LAorCVtTSU9DU0lXRlJBRwktIFNJT0NJV0ZJUlNUXSA9IHsKKwkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfUEFSQU0sCisJfSwKKwlbU0lPQ0dJV0ZSQUcJLSBTSU9DSVdGSVJTVF0gPSB7CisJCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1BBUkFNLAorCX0sCisJW1NJT0NTSVdUWFBPVwktIFNJT0NJV0ZJUlNUXSA9IHsKKwkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfUEFSQU0sCisJfSwKKwlbU0lPQ0dJV1RYUE9XCS0gU0lPQ0lXRklSU1RdID0geworCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9QQVJBTSwKKwl9LAorCVtTSU9DU0lXUkVUUlkJLSBTSU9DSVdGSVJTVF0gPSB7CisJCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1BBUkFNLAorCX0sCisJW1NJT0NHSVdSRVRSWQktIFNJT0NJV0ZJUlNUXSA9IHsKKwkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfUEFSQU0sCisJfSwKKwlbU0lPQ1NJV0VOQ09ERQktIFNJT0NJV0ZJUlNUXSA9IHsKKwkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfUE9JTlQsCisJCS50b2tlbl9zaXplCT0gMSwKKwkJLm1heF90b2tlbnMJPSBJV19FTkNPRElOR19UT0tFTl9NQVgsCisJCS5mbGFncwkJPSBJV19ERVNDUl9GTEFHX0VWRU5UIHwgSVdfREVTQ1JfRkxBR19SRVNUUklDVCwKKwl9LAorCVtTSU9DR0lXRU5DT0RFCS0gU0lPQ0lXRklSU1RdID0geworCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9QT0lOVCwKKwkJLnRva2VuX3NpemUJPSAxLAorCQkubWF4X3Rva2Vucwk9IElXX0VOQ09ESU5HX1RPS0VOX01BWCwKKwkJLmZsYWdzCQk9IElXX0RFU0NSX0ZMQUdfRFVNUCB8IElXX0RFU0NSX0ZMQUdfUkVTVFJJQ1QsCisJfSwKKwlbU0lPQ1NJV1BPV0VSCS0gU0lPQ0lXRklSU1RdID0geworCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9QQVJBTSwKKwl9LAorCVtTSU9DR0lXUE9XRVIJLSBTSU9DSVdGSVJTVF0gPSB7CisJCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1BBUkFNLAorCX0sCisJW1NJT0NTSVdHRU5JRQktIFNJT0NJV0ZJUlNUXSA9IHsKKwkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfUE9JTlQsCisJCS50b2tlbl9zaXplCT0gMSwKKwkJLm1heF90b2tlbnMJPSBJV19HRU5FUklDX0lFX01BWCwKKwl9LAorCVtTSU9DR0lXR0VOSUUJLSBTSU9DSVdGSVJTVF0gPSB7CisJCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1BPSU5ULAorCQkudG9rZW5fc2l6ZQk9IDEsCisJCS5tYXhfdG9rZW5zCT0gSVdfR0VORVJJQ19JRV9NQVgsCisJfSwKKwlbU0lPQ1NJV0FVVEgJLSBTSU9DSVdGSVJTVF0gPSB7CisJCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1BBUkFNLAorCX0sCisJW1NJT0NHSVdBVVRICS0gU0lPQ0lXRklSU1RdID0geworCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9QQVJBTSwKKwl9LAorCVtTSU9DU0lXRU5DT0RFRVhUIC0gU0lPQ0lXRklSU1RdID0geworCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9QT0lOVCwKKwkJLnRva2VuX3NpemUJPSAxLAorCQkubWluX3Rva2Vucwk9IHNpemVvZihzdHJ1Y3QgaXdfZW5jb2RlX2V4dCksCisJCS5tYXhfdG9rZW5zCT0gc2l6ZW9mKHN0cnVjdCBpd19lbmNvZGVfZXh0KSArCisJCQkJICBJV19FTkNPRElOR19UT0tFTl9NQVgsCisJfSwKKwlbU0lPQ0dJV0VOQ09ERUVYVCAtIFNJT0NJV0ZJUlNUXSA9IHsKKwkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfUE9JTlQsCisJCS50b2tlbl9zaXplCT0gMSwKKwkJLm1pbl90b2tlbnMJPSBzaXplb2Yoc3RydWN0IGl3X2VuY29kZV9leHQpLAorCQkubWF4X3Rva2Vucwk9IHNpemVvZihzdHJ1Y3QgaXdfZW5jb2RlX2V4dCkgKworCQkJCSAgSVdfRU5DT0RJTkdfVE9LRU5fTUFYLAorCX0sCisJW1NJT0NTSVdQTUtTQSAtIFNJT0NJV0ZJUlNUXSA9IHsKKwkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfUE9JTlQsCisJCS50b2tlbl9zaXplCT0gMSwKKwkJLm1pbl90b2tlbnMJPSBzaXplb2Yoc3RydWN0IGl3X3Bta3NhKSwKKwkJLm1heF90b2tlbnMJPSBzaXplb2Yoc3RydWN0IGl3X3Bta3NhKSwKKwl9LAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzdGFuZGFyZF9pb2N0bF9udW0gPSBBUlJBWV9TSVpFKHN0YW5kYXJkX2lvY3RsKTsKKworLyoKKyAqIE1ldGEtZGF0YSBhYm91dCBhbGwgdGhlIGFkZGl0aW9uYWwgc3RhbmRhcmQgV2lyZWxlc3MgRXh0ZW5zaW9uIGV2ZW50cworICogd2Uga25vdyBhYm91dC4KKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBpd19pb2N0bF9kZXNjcmlwdGlvbiBzdGFuZGFyZF9ldmVudFtdID0geworCVtJV0VWVFhEUk9QCS0gSVdFVkZJUlNUXSA9IHsKKwkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfQUREUiwKKwl9LAorCVtJV0VWUVVBTAktIElXRVZGSVJTVF0gPSB7CisJCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1FVQUwsCisJfSwKKwlbSVdFVkNVU1RPTQktIElXRVZGSVJTVF0gPSB7CisJCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1BPSU5ULAorCQkudG9rZW5fc2l6ZQk9IDEsCisJCS5tYXhfdG9rZW5zCT0gSVdfQ1VTVE9NX01BWCwKKwl9LAorCVtJV0VWUkVHSVNURVJFRAktIElXRVZGSVJTVF0gPSB7CisJCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX0FERFIsCisJfSwKKwlbSVdFVkVYUElSRUQJLSBJV0VWRklSU1RdID0geworCQkuaGVhZGVyX3R5cGUJPSBJV19IRUFERVJfVFlQRV9BRERSLAorCX0sCisJW0lXRVZHRU5JRQktIElXRVZGSVJTVF0gPSB7CisJCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1BPSU5ULAorCQkudG9rZW5fc2l6ZQk9IDEsCisJCS5tYXhfdG9rZW5zCT0gSVdfR0VORVJJQ19JRV9NQVgsCisJfSwKKwlbSVdFVk1JQ0hBRUxNSUNGQUlMVVJFCS0gSVdFVkZJUlNUXSA9IHsKKwkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfUE9JTlQsCisJCS50b2tlbl9zaXplCT0gMSwKKwkJLm1heF90b2tlbnMJPSBzaXplb2Yoc3RydWN0IGl3X21pY2hhZWxtaWNmYWlsdXJlKSwKKwl9LAorCVtJV0VWQVNTT0NSRVFJRQktIElXRVZGSVJTVF0gPSB7CisJCS5oZWFkZXJfdHlwZQk9IElXX0hFQURFUl9UWVBFX1BPSU5ULAorCQkudG9rZW5fc2l6ZQk9IDEsCisJCS5tYXhfdG9rZW5zCT0gSVdfR0VORVJJQ19JRV9NQVgsCisJfSwKKwlbSVdFVkFTU09DUkVTUElFCS0gSVdFVkZJUlNUXSA9IHsKKwkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfUE9JTlQsCisJCS50b2tlbl9zaXplCT0gMSwKKwkJLm1heF90b2tlbnMJPSBJV19HRU5FUklDX0lFX01BWCwKKwl9LAorCVtJV0VWUE1LSURDQU5ECS0gSVdFVkZJUlNUXSA9IHsKKwkJLmhlYWRlcl90eXBlCT0gSVdfSEVBREVSX1RZUEVfUE9JTlQsCisJCS50b2tlbl9zaXplCT0gMSwKKwkJLm1heF90b2tlbnMJPSBzaXplb2Yoc3RydWN0IGl3X3Bta2lkX2NhbmQpLAorCX0sCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHN0YW5kYXJkX2V2ZW50X251bSA9IEFSUkFZX1NJWkUoc3RhbmRhcmRfZXZlbnQpOworCisvKiBTaXplIChpbiBieXRlcykgb2YgdGhlIHZhcmlvdXMgcHJpdmF0ZSBkYXRhIHR5cGVzICovCitzdGF0aWMgY29uc3QgY2hhciBpd19wcml2X3R5cGVfc2l6ZVtdID0geworCTAsCQkJCS8qIElXX1BSSVZfVFlQRV9OT05FICovCisJMSwJCQkJLyogSVdfUFJJVl9UWVBFX0JZVEUgKi8KKwkxLAkJCQkvKiBJV19QUklWX1RZUEVfQ0hBUiAqLworCTAsCQkJCS8qIE5vdCBkZWZpbmVkICovCisJc2l6ZW9mKF9fdTMyKSwJCQkvKiBJV19QUklWX1RZUEVfSU5UICovCisJc2l6ZW9mKHN0cnVjdCBpd19mcmVxKSwJCS8qIElXX1BSSVZfVFlQRV9GTE9BVCAqLworCXNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpLAkvKiBJV19QUklWX1RZUEVfQUREUiAqLworCTAsCQkJCS8qIE5vdCBkZWZpbmVkICovCit9OworCisvKiBTaXplIChpbiBieXRlcykgb2YgdmFyaW91cyBldmVudHMgKi8KK3N0YXRpYyBjb25zdCBpbnQgZXZlbnRfdHlwZV9zaXplW10gPSB7CisJSVdfRVZfTENQX0xFTiwJCQkvKiBJV19IRUFERVJfVFlQRV9OVUxMICovCisJMCwKKwlJV19FVl9DSEFSX0xFTiwJCQkvKiBJV19IRUFERVJfVFlQRV9DSEFSICovCisJMCwKKwlJV19FVl9VSU5UX0xFTiwJCQkvKiBJV19IRUFERVJfVFlQRV9VSU5UICovCisJSVdfRVZfRlJFUV9MRU4sCQkJLyogSVdfSEVBREVSX1RZUEVfRlJFUSAqLworCUlXX0VWX0FERFJfTEVOLAkJCS8qIElXX0hFQURFUl9UWVBFX0FERFIgKi8KKwkwLAorCUlXX0VWX1BPSU5UX0xFTiwJCS8qIFdpdGhvdXQgdmFyaWFibGUgcGF5bG9hZCAqLworCUlXX0VWX1BBUkFNX0xFTiwJCS8qIElXX0hFQURFUl9UWVBFX1BBUkFNICovCisJSVdfRVZfUVVBTF9MRU4sCQkJLyogSVdfSEVBREVSX1RZUEVfUVVBTCAqLworfTsKKworLyogU2l6ZSAoaW4gYnl0ZXMpIG9mIHZhcmlvdXMgZXZlbnRzLCBhcyBwYWNrZWQgKi8KK3N0YXRpYyBjb25zdCBpbnQgZXZlbnRfdHlwZV9wa19zaXplW10gPSB7CisJSVdfRVZfTENQX1BLX0xFTiwJCS8qIElXX0hFQURFUl9UWVBFX05VTEwgKi8KKwkwLAorCUlXX0VWX0NIQVJfUEtfTEVOLAkJLyogSVdfSEVBREVSX1RZUEVfQ0hBUiAqLworCTAsCisJSVdfRVZfVUlOVF9QS19MRU4sCQkvKiBJV19IRUFERVJfVFlQRV9VSU5UICovCisJSVdfRVZfRlJFUV9QS19MRU4sCQkvKiBJV19IRUFERVJfVFlQRV9GUkVRICovCisJSVdfRVZfQUREUl9QS19MRU4sCQkvKiBJV19IRUFERVJfVFlQRV9BRERSICovCisJMCwKKwlJV19FVl9QT0lOVF9QS19MRU4sCQkvKiBXaXRob3V0IHZhcmlhYmxlIHBheWxvYWQgKi8KKwlJV19FVl9QQVJBTV9QS19MRU4sCQkvKiBJV19IRUFERVJfVFlQRV9QQVJBTSAqLworCUlXX0VWX1FVQUxfUEtfTEVOLAkJLyogSVdfSEVBREVSX1RZUEVfUVVBTCAqLworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKiBDT01NT04gU1VCUk9VVElORVMgKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIFN0dWZmIHRoYXQgbWF5IGJlIHVzZWQgaW4gdmFyaW91cyBwbGFjZSBvciBkb2Vzbid0IGZpdCBpbiBvbmUKKyAqIG9mIHRoZSBzZWN0aW9uIGJlbG93LgorICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiBSZXR1cm4gdGhlIGRyaXZlciBoYW5kbGVyIGFzc29jaWF0ZWQgd2l0aCBhIHNwZWNpZmljIFdpcmVsZXNzIEV4dGVuc2lvbi4KKyAqLworc3RhdGljIGl3X2hhbmRsZXIgZ2V0X2hhbmRsZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGNtZCkKK3sKKwkvKiBEb24ndCAib3B0aW1pc2UiIHRoZSBmb2xsb3dpbmcgdmFyaWFibGUsIGl0IHdpbGwgY3Jhc2ggKi8KKwl1bnNpZ25lZCBpbnQJaW5kZXg7CQkvKiAqTVVTVCogYmUgdW5zaWduZWQgKi8KKworCS8qIENoZWNrIGlmIHdlIGhhdmUgc29tZSB3aXJlbGVzcyBoYW5kbGVycyBkZWZpbmVkICovCisJaWYgKGRldi0+d2lyZWxlc3NfaGFuZGxlcnMgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBUcnkgYXMgYSBzdGFuZGFyZCBjb21tYW5kICovCisJaW5kZXggPSBjbWQgLSBTSU9DSVdGSVJTVDsKKwlpZiAoaW5kZXggPCBkZXYtPndpcmVsZXNzX2hhbmRsZXJzLT5udW1fc3RhbmRhcmQpCisJCXJldHVybiBkZXYtPndpcmVsZXNzX2hhbmRsZXJzLT5zdGFuZGFyZFtpbmRleF07CisKKwkvKiBUcnkgYXMgYSBwcml2YXRlIGNvbW1hbmQgKi8KKwlpbmRleCA9IGNtZCAtIFNJT0NJV0ZJUlNUUFJJVjsKKwlpZiAoaW5kZXggPCBkZXYtPndpcmVsZXNzX2hhbmRsZXJzLT5udW1fcHJpdmF0ZSkKKwkJcmV0dXJuIGRldi0+d2lyZWxlc3NfaGFuZGxlcnMtPnByaXZhdGVbaW5kZXhdOworCisJLyogTm90IGZvdW5kICovCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiBHZXQgc3RhdGlzdGljcyBvdXQgb2YgdGhlIGRyaXZlcgorICovCitzdGF0aWMgc3RydWN0IGl3X3N0YXRpc3RpY3MgKmdldF93aXJlbGVzc19zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCS8qIE5ldyBsb2NhdGlvbiAqLworCWlmICgoZGV2LT53aXJlbGVzc19oYW5kbGVycyAhPSBOVUxMKSAmJgorCSAgIChkZXYtPndpcmVsZXNzX2hhbmRsZXJzLT5nZXRfd2lyZWxlc3Nfc3RhdHMgIT0gTlVMTCkpCisJCXJldHVybiBkZXYtPndpcmVsZXNzX2hhbmRsZXJzLT5nZXRfd2lyZWxlc3Nfc3RhdHMoZGV2KTsKKworCS8qIE5vdCBmb3VuZCAqLworCXJldHVybiBOVUxMOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogQ2FsbCB0aGUgY29tbWl0IGhhbmRsZXIgaW4gdGhlIGRyaXZlcgorICogKGlmIGV4aXN0IGFuZCBpZiBjb25kaXRpb25zIGFyZSByaWdodCkKKyAqCisgKiBOb3RlIDogb3VyIGN1cnJlbnQgY29tbWl0IHN0cmF0ZWd5IGlzIGN1cnJlbnRseSBwcmV0dHkgZHVtYiwKKyAqIGJ1dCB3ZSB3aWxsIGJlIGFibGUgdG8gaW1wcm92ZSBvbiB0aGF0Li4uCisgKiBUaGUgZ29hbCBpcyB0byB0cnkgdG8gYWdyZWFnYXRlIGFzIG1hbnkgY2hhbmdlcyBhcyBwb3NzaWJsZQorICogYmVmb3JlIGRvaW5nIHRoZSBjb21taXQuIERyaXZlcnMgdGhhdCB3aWxsIGRlZmluZSBhIGNvbW1pdCBoYW5kbGVyCisgKiBhcmUgdXN1YWxseSB0aG9zZSB0aGF0IG5lZWQgYSByZXNldCBhZnRlciBjaGFuZ2luZyBwYXJhbWV0ZXJzLCBzbworICogd2Ugd2FudCB0byBtaW5pbWlzZSB0aGUgbnVtYmVyIG9mIHJlc2V0LgorICogQSBjb29sIGlkZWEgaXMgdG8gdXNlIGEgdGltZXIgOiBhdCBlYWNoICJzZXQiIGNvbW1hbmQsIHdlIHJlLXNldCB0aGUKKyAqIHRpbWVyLCB3aGVuIHRoZSB0aW1lciBldmVudHVhbGx5IGZpcmVzLCB3ZSBjYWxsIHRoZSBkcml2ZXIuCisgKiBIb3BlZnVsbHksIG1vcmUgb24gdGhhdCBsYXRlci4KKyAqCisgKiBBbHNvLCBJJ20gd2FpdGluZyB0byBzZWUgaG93IG1hbnkgcGVvcGxlIHdpbGwgY29tcGxhaW4gYWJvdXQgdGhlCisgKiBuZXRpZl9ydW5uaW5nKGRldikgdGVzdC4gSSdtIG9wZW4gb24gdGhhdCBvbmUuLi4KKyAqIEhvcGVmdWxseSwgdGhlIGRyaXZlciB3aWxsIHJlbWVtYmVyIHRvIGRvIGEgY29tbWl0IGluICJvcGVuKCkiIDstKQorICovCitzdGF0aWMgaW50IGNhbGxfY29tbWl0X2hhbmRsZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpZiAoKG5ldGlmX3J1bm5pbmcoZGV2KSkgJiYKKwkgICAoZGV2LT53aXJlbGVzc19oYW5kbGVycy0+c3RhbmRhcmRbMF0gIT0gTlVMTCkpCisJCS8qIENhbGwgdGhlIGNvbW1pdCBoYW5kbGVyIG9uIHRoZSBkcml2ZXIgKi8KKwkJcmV0dXJuIGRldi0+d2lyZWxlc3NfaGFuZGxlcnMtPnN0YW5kYXJkWzBdKGRldiwgTlVMTCwKKwkJCQkJCQkgICBOVUxMLCBOVUxMKTsKKwllbHNlCisJCXJldHVybiAwOwkJLyogQ29tbWFuZCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5ICovCit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiBDYWxjdWxhdGUgc2l6ZSBvZiBwcml2YXRlIGFyZ3VtZW50cworICovCitzdGF0aWMgaW5saW5lIGludCBnZXRfcHJpdl9zaXplKF9fdTE2CWFyZ3MpCit7CisJaW50CW51bSA9IGFyZ3MgJiBJV19QUklWX1NJWkVfTUFTSzsKKwlpbnQJdHlwZSA9IChhcmdzICYgSVdfUFJJVl9UWVBFX01BU0spID4+IDEyOworCisJcmV0dXJuIG51bSAqIGl3X3ByaXZfdHlwZV9zaXplW3R5cGVdOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogUmUtY2FsY3VsYXRlIHRoZSBzaXplIG9mIHByaXZhdGUgYXJndW1lbnRzCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGFkanVzdF9wcml2X3NpemUoX191MTYJCWFyZ3MsCisJCQkJICAgdW5pb24gaXdyZXFfZGF0YSAqCXdycXUpCit7CisJaW50CW51bSA9IHdycXUtPmRhdGEubGVuZ3RoOworCWludAltYXggPSBhcmdzICYgSVdfUFJJVl9TSVpFX01BU0s7CisJaW50CXR5cGUgPSAoYXJncyAmIElXX1BSSVZfVFlQRV9NQVNLKSA+PiAxMjsKKworCS8qIE1ha2Ugc3VyZSB0aGUgZHJpdmVyIGRvZXNuJ3QgZ29vZiB1cCAqLworCWlmIChtYXggPCBudW0pCisJCW51bSA9IG1heDsKKworCXJldHVybiBudW0gKiBpd19wcml2X3R5cGVfc2l6ZVt0eXBlXTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqIFN0YW5kYXJkIFdpcmVsZXNzIEhhbmRsZXIgOiBnZXQgd2lyZWxlc3Mgc3RhdHMKKyAqCUFsbG93IHByb2dyYW1hdGljIGFjY2VzcyB0byAvcHJvYy9uZXQvd2lyZWxlc3MgZXZlbiBpZiAvcHJvYworICoJZG9lc24ndCBleGlzdC4uLiBBbHNvIG1vcmUgZWZmaWNpZW50Li4uCisgKi8KK3N0YXRpYyBpbnQgaXdfaGFuZGxlcl9nZXRfaXdzdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqCQlkZXYsCisJCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICoJaW5mbywKKwkJCQkgIHVuaW9uIGl3cmVxX2RhdGEgKgkJd3JxdSwKKwkJCQkgIGNoYXIgKgkJCWV4dHJhKQoreworCS8qIEdldCBzdGF0cyBmcm9tIHRoZSBkcml2ZXIgKi8KKwlzdHJ1Y3QgaXdfc3RhdGlzdGljcyAqc3RhdHM7CisKKwlzdGF0cyA9IGdldF93aXJlbGVzc19zdGF0cyhkZXYpOworCWlmIChzdGF0cykgeworCQkvKiBDb3B5IHN0YXRpc3RpY3MgdG8gZXh0cmEgKi8KKwkJbWVtY3B5KGV4dHJhLCBzdGF0cywgc2l6ZW9mKHN0cnVjdCBpd19zdGF0aXN0aWNzKSk7CisJCXdycXUtPmRhdGEubGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBpd19zdGF0aXN0aWNzKTsKKworCQkvKiBDaGVjayBpZiB3ZSBuZWVkIHRvIGNsZWFyIHRoZSB1cGRhdGVkIGZsYWcgKi8KKwkJaWYgKHdycXUtPmRhdGEuZmxhZ3MgIT0gMCkKKwkJCXN0YXRzLT5xdWFsLnVwZGF0ZWQgJj0gfklXX1FVQUxfQUxMX1VQREFURUQ7CisJCXJldHVybiAwOworCX0gZWxzZQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiBTdGFuZGFyZCBXaXJlbGVzcyBIYW5kbGVyIDogZ2V0IGl3cHJpdiBkZWZpbml0aW9ucworICogRXhwb3J0IHRoZSBkcml2ZXIgcHJpdmF0ZSBoYW5kbGVyIGRlZmluaXRpb24KKyAqIFRoZXkgd2lsbCBiZSBwaWNrZWQgdXAgYnkgdG9vbHMgbGlrZSBpd3ByaXYuLi4KKyAqLworc3RhdGljIGludCBpd19oYW5kbGVyX2dldF9wcml2YXRlKHN0cnVjdCBuZXRfZGV2aWNlICoJCWRldiwKKwkJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKglpbmZvLAorCQkJCSAgdW5pb24gaXdyZXFfZGF0YSAqCQl3cnF1LAorCQkJCSAgY2hhciAqCQkJZXh0cmEpCit7CisJLyogQ2hlY2sgaWYgdGhlIGRyaXZlciBoYXMgc29tZXRoaW5nIHRvIGV4cG9ydCAqLworCWlmICgoZGV2LT53aXJlbGVzc19oYW5kbGVycy0+bnVtX3ByaXZhdGVfYXJncyA9PSAwKSB8fAorCSAgIChkZXYtPndpcmVsZXNzX2hhbmRsZXJzLT5wcml2YXRlX2FyZ3MgPT0gTlVMTCkpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCS8qIENoZWNrIGlmIHRoZXJlIGlzIGVub3VnaCBidWZmZXIgdXAgdGhlcmUgKi8KKwlpZiAod3JxdS0+ZGF0YS5sZW5ndGggPCBkZXYtPndpcmVsZXNzX2hhbmRsZXJzLT5udW1fcHJpdmF0ZV9hcmdzKSB7CisJCS8qIFVzZXIgc3BhY2UgY2FuJ3Qga25vdyBpbiBhZHZhbmNlIGhvdyBsYXJnZSB0aGUgYnVmZmVyCisJCSAqIG5lZWRzIHRvIGJlLiBHaXZlIGl0IGEgaGludCwgc28gdGhhdCB3ZSBjYW4gc3VwcG9ydAorCQkgKiBhbnkgc2l6ZSBidWZmZXIgd2Ugd2FudCBzb21ld2hhdCBlZmZpY2llbnRseS4uLiAqLworCQl3cnF1LT5kYXRhLmxlbmd0aCA9IGRldi0+d2lyZWxlc3NfaGFuZGxlcnMtPm51bV9wcml2YXRlX2FyZ3M7CisJCXJldHVybiAtRTJCSUc7CisJfQorCisJLyogU2V0IHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIGlvY3Rscy4gKi8KKwl3cnF1LT5kYXRhLmxlbmd0aCA9IGRldi0+d2lyZWxlc3NfaGFuZGxlcnMtPm51bV9wcml2YXRlX2FyZ3M7CisKKwkvKiBDb3B5IHN0cnVjdHVyZSB0byB0aGUgdXNlciBidWZmZXIuICovCisJbWVtY3B5KGV4dHJhLCBkZXYtPndpcmVsZXNzX2hhbmRsZXJzLT5wcml2YXRlX2FyZ3MsCisJICAgICAgIHNpemVvZihzdHJ1Y3QgaXdfcHJpdl9hcmdzKSAqIHdycXUtPmRhdGEubGVuZ3RoKTsKKworCXJldHVybiAwOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKiAvcHJvYy9uZXQvd2lyZWxlc3MgU1VQUE9SVCAqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBUaGUgL3Byb2MvbmV0L3dpcmVsZXNzIGZpbGUgaXMgYSBodW1hbiByZWFkYWJsZSB1c2VyLXNwYWNlIGludGVyZmFjZQorICogZXhwb3J0aW5nIHZhcmlvdXMgd2lyZWxlc3Mgc3BlY2lmaWMgc3RhdGlzdGljcyBmcm9tIHRoZSB3aXJlbGVzcyBkZXZpY2VzLgorICogVGhpcyBpcyB0aGUgbW9zdCBwb3B1bGFyIHBhcnQgb2YgdGhlIFdpcmVsZXNzIEV4dGVuc2lvbnMgOy0pCisgKgorICogVGhpcyBpbnRlcmZhY2UgaXMgYSBwdXJlIGNsb25lIG9mIC9wcm9jL25ldC9kZXYgKGluIG5ldC9jb3JlL2Rldi5jKS4KKyAqIFRoZSBjb250ZW50IG9mIHRoZSBmaWxlIGlzIGJhc2ljYWxseSB0aGUgY29udGVudCBvZiAic3RydWN0IGl3X3N0YXRpc3RpY3MiLgorICovCisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogUHJpbnQgb25lIGVudHJ5IChsaW5lKSBvZiAvcHJvYy9uZXQvd2lyZWxlc3MKKyAqLworc3RhdGljIHZvaWQgd2lyZWxlc3Nfc2VxX3ByaW50Zl9zdGF0cyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwKKwkJCQkgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCS8qIEdldCBzdGF0cyBmcm9tIHRoZSBkcml2ZXIgKi8KKwlzdHJ1Y3QgaXdfc3RhdGlzdGljcyAqc3RhdHMgPSBnZXRfd2lyZWxlc3Nfc3RhdHMoZGV2KTsKKworCWlmIChzdGF0cykgeworCQlzZXFfcHJpbnRmKHNlcSwgIiU2czogJTA0eCAgJTNkJWMgICUzZCVjICAlM2QlYyAgJTZkICU2ZCAlNmQgIgorCQkJCSIlNmQgJTZkICAgJTZkXG4iLAorCQkJICAgZGV2LT5uYW1lLCBzdGF0cy0+c3RhdHVzLCBzdGF0cy0+cXVhbC5xdWFsLAorCQkJICAgc3RhdHMtPnF1YWwudXBkYXRlZCAmIElXX1FVQUxfUVVBTF9VUERBVEVECisJCQkgICA/ICcuJyA6ICcgJywKKwkJCSAgICgoX19zMzIpIHN0YXRzLT5xdWFsLmxldmVsKSAtCisJCQkgICAoKHN0YXRzLT5xdWFsLnVwZGF0ZWQgJiBJV19RVUFMX0RCTSkgPyAweDEwMCA6IDApLAorCQkJICAgc3RhdHMtPnF1YWwudXBkYXRlZCAmIElXX1FVQUxfTEVWRUxfVVBEQVRFRAorCQkJICAgPyAnLicgOiAnICcsCisJCQkgICAoKF9fczMyKSBzdGF0cy0+cXVhbC5ub2lzZSkgLQorCQkJICAgKChzdGF0cy0+cXVhbC51cGRhdGVkICYgSVdfUVVBTF9EQk0pID8gMHgxMDAgOiAwKSwKKwkJCSAgIHN0YXRzLT5xdWFsLnVwZGF0ZWQgJiBJV19RVUFMX05PSVNFX1VQREFURUQKKwkJCSAgID8gJy4nIDogJyAnLAorCQkJICAgc3RhdHMtPmRpc2NhcmQubndpZCwgc3RhdHMtPmRpc2NhcmQuY29kZSwKKwkJCSAgIHN0YXRzLT5kaXNjYXJkLmZyYWdtZW50LCBzdGF0cy0+ZGlzY2FyZC5yZXRyaWVzLAorCQkJICAgc3RhdHMtPmRpc2NhcmQubWlzYywgc3RhdHMtPm1pc3MuYmVhY29uKTsKKwkJc3RhdHMtPnF1YWwudXBkYXRlZCAmPSB+SVdfUVVBTF9BTExfVVBEQVRFRDsKKwl9Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiBQcmludCBpbmZvIGZvciAvcHJvYy9uZXQvd2lyZWxlc3MgKHByaW50IGFsbCBlbnRyaWVzKQorICovCitzdGF0aWMgaW50IHdpcmVsZXNzX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikKKwkJc2VxX3ByaW50ZihzZXEsICJJbnRlci18IHN0YS18ICAgUXVhbGl0eSAgICAgICAgfCAgIERpc2NhcmRlZCAiCisJCQkJInBhY2tldHMgICAgICAgICAgICAgICB8IE1pc3NlZCB8IFdFXG4iCisJCQkJIiBmYWNlIHwgdHVzIHwgbGluayBsZXZlbCBub2lzZSB8ICBud2lkICAiCisJCQkJImNyeXB0ICAgZnJhZyAgcmV0cnkgICBtaXNjIHwgYmVhY29uIHwgJWRcbiIsCisJCQkgICBXSVJFTEVTU19FWFQpOworCWVsc2UKKwkJd2lyZWxlc3Nfc2VxX3ByaW50Zl9zdGF0cyhzZXEsIHYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNlcV9vcGVyYXRpb25zIHdpcmVsZXNzX3NlcV9vcHMgPSB7CisJLnN0YXJ0ID0gZGV2X3NlcV9zdGFydCwKKwkubmV4dCAgPSBkZXZfc2VxX25leHQsCisJLnN0b3AgID0gZGV2X3NlcV9zdG9wLAorCS5zaG93ICA9IHdpcmVsZXNzX3NlcV9zaG93LAorfTsKKworc3RhdGljIGludCB3aXJlbGVzc19zZXFfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2VxX29wZW4oZmlsZSwgJndpcmVsZXNzX3NlcV9vcHMpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB3aXJlbGVzc19zZXFfZm9wcyA9IHsKKwkub3duZXIJID0gVEhJU19NT0RVTEUsCisJLm9wZW4gICAgPSB3aXJlbGVzc19zZXFfb3BlbiwKKwkucmVhZCAgICA9IHNlcV9yZWFkLAorCS5sbHNlZWsgID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2VxX3JlbGVhc2UsCit9OworCitpbnQgX19pbml0IHdleHRfcHJvY19pbml0KHZvaWQpCit7CisJLyogQ3JlYXRlIC9wcm9jL25ldC93aXJlbGVzcyBlbnRyeSAqLworCWlmICghcHJvY19uZXRfZm9wc19jcmVhdGUoIndpcmVsZXNzIiwgU19JUlVHTywgJndpcmVsZXNzX3NlcV9mb3BzKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgkvKiBDT05GSUdfUFJPQ19GUyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKiogSU9DVEwgU1VQUE9SVCAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBUaGUgb3JpZ2luYWwgdXNlciBzcGFjZSBBUEkgdG8gY29uZmlndXJlIGFsbCB0aG9zZSBXaXJlbGVzcyBFeHRlbnNpb25zCisgKiBpcyB0aHJvdWdoIElPQ1RMcy4KKyAqIEluIHRoZXJlLCB3ZSBjaGVjayBpZiB3ZSBuZWVkIHRvIGNhbGwgdGhlIG5ldyBkcml2ZXIgQVBJIChpd19oYW5kbGVyKQorICogb3IganVzdCBjYWxsIHRoZSBkcml2ZXIgaW9jdGwgaGFuZGxlci4KKyAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogV3JhcHBlciB0byBjYWxsIGEgc3RhbmRhcmQgV2lyZWxlc3MgRXh0ZW5zaW9uIGhhbmRsZXIuCisgKiBXZSBkbyB2YXJpb3VzIGNoZWNrcyBhbmQgYWxzbyB0YWtlIGNhcmUgb2YgbW92aW5nIGRhdGEgYmV0d2VlbgorICogdXNlciBzcGFjZSBhbmQga2VybmVsIHNwYWNlLgorICovCitzdGF0aWMgaW50IGlvY3RsX3N0YW5kYXJkX2NhbGwoc3RydWN0IG5ldF9kZXZpY2UgKglkZXYsCisJCQkgICAgICAgc3RydWN0IGlmcmVxICoJCWlmciwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQJCWNtZCwKKwkJCSAgICAgICBpd19oYW5kbGVyCQloYW5kbGVyKQoreworCXN0cnVjdCBpd3JlcSAqCQkJCWl3ciA9IChzdHJ1Y3QgaXdyZXEgKikgaWZyOworCWNvbnN0IHN0cnVjdCBpd19pb2N0bF9kZXNjcmlwdGlvbiAqCWRlc2NyOworCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8JCQlpbmZvOworCWludAkJCQkJcmV0ID0gLUVJTlZBTDsKKworCS8qIEdldCB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIElPQ1RMICovCisJaWYgKChjbWQgLSBTSU9DSVdGSVJTVCkgPj0gc3RhbmRhcmRfaW9jdGxfbnVtKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJZGVzY3IgPSAmKHN0YW5kYXJkX2lvY3RsW2NtZCAtIFNJT0NJV0ZJUlNUXSk7CisKKwkvKiBQcmVwYXJlIHRoZSBjYWxsICovCisJaW5mby5jbWQgPSBjbWQ7CisJaW5mby5mbGFncyA9IDA7CisKKwkvKiBDaGVjayBpZiB3ZSBoYXZlIGEgcG9pbnRlciB0byB1c2VyIHNwYWNlIGRhdGEgb3Igbm90ICovCisJaWYgKGRlc2NyLT5oZWFkZXJfdHlwZSAhPSBJV19IRUFERVJfVFlQRV9QT0lOVCkgeworCisJCS8qIE5vIGV4dHJhIGFyZ3VtZW50cy4gVHJpdmlhbCB0byBoYW5kbGUgKi8KKwkJcmV0ID0gaGFuZGxlcihkZXYsICZpbmZvLCAmKGl3ci0+dSksIE5VTEwpOworCisJCS8qIEdlbmVyYXRlIGFuIGV2ZW50IHRvIG5vdGlmeSBsaXN0ZW5lcnMgb2YgdGhlIGNoYW5nZSAqLworCQlpZiAoKGRlc2NyLT5mbGFncyAmIElXX0RFU0NSX0ZMQUdfRVZFTlQpICYmCisJCSAgICgocmV0ID09IDApIHx8IChyZXQgPT0gLUVJV0NPTU1JVCkpKQorCQkJd2lyZWxlc3Nfc2VuZF9ldmVudChkZXYsIGNtZCwgJihpd3ItPnUpLCBOVUxMKTsKKwl9IGVsc2UgeworCQljaGFyICoJZXh0cmE7CisJCWludAlleHRyYV9zaXplOworCQlpbnQJdXNlcl9sZW5ndGggPSAwOworCQlpbnQJZXJyOworCQlpbnQJZXNzaWRfY29tcGF0ID0gMDsKKworCQkvKiBDYWxjdWxhdGUgc3BhY2UgbmVlZGVkIGJ5IGFyZ3VtZW50cy4gQWx3YXlzIGFsbG9jYXRlCisJCSAqIGZvciBtYXggc3BhY2UuIEVhc2llciwgYW5kIHdvbid0IGxhc3QgbG9uZy4uLiAqLworCQlleHRyYV9zaXplID0gZGVzY3ItPm1heF90b2tlbnMgKiBkZXNjci0+dG9rZW5fc2l6ZTsKKworCQkvKiBDaGVjayBuZWVkIGZvciBFU1NJRCBjb21wYXRpYmlsaXR5IGZvciBXRSA8IDIxICovCisJCXN3aXRjaCAoY21kKSB7CisJCWNhc2UgU0lPQ1NJV0VTU0lEOgorCQljYXNlIFNJT0NHSVdFU1NJRDoKKwkJY2FzZSBTSU9DU0lXTklDS046CisJCWNhc2UgU0lPQ0dJV05JQ0tOOgorCQkJaWYgKGl3ci0+dS5kYXRhLmxlbmd0aCA9PSBkZXNjci0+bWF4X3Rva2VucyArIDEpCisJCQkJZXNzaWRfY29tcGF0ID0gMTsKKwkJCWVsc2UgaWYgKElXX0lTX1NFVChjbWQpICYmIChpd3ItPnUuZGF0YS5sZW5ndGggIT0gMCkpIHsKKwkJCQljaGFyIGVzc2lkW0lXX0VTU0lEX01BWF9TSVpFICsgMV07CisKKwkJCQllcnIgPSBjb3B5X2Zyb21fdXNlcihlc3NpZCwgaXdyLT51LmRhdGEucG9pbnRlciwKKwkJCQkJCSAgICAgaXdyLT51LmRhdGEubGVuZ3RoICoKKwkJCQkJCSAgICAgZGVzY3ItPnRva2VuX3NpemUpOworCQkJCWlmIChlcnIpCisJCQkJCXJldHVybiAtRUZBVUxUOworCisJCQkJaWYgKGVzc2lkW2l3ci0+dS5kYXRhLmxlbmd0aCAtIDFdID09ICdcMCcpCisJCQkJCWVzc2lkX2NvbXBhdCA9IDE7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisKKwkJaXdyLT51LmRhdGEubGVuZ3RoIC09IGVzc2lkX2NvbXBhdDsKKworCQkvKiBDaGVjayB3aGF0IHVzZXIgc3BhY2UgaXMgZ2l2aW5nIHVzICovCisJCWlmIChJV19JU19TRVQoY21kKSkgeworCQkJLyogQ2hlY2sgTlVMTCBwb2ludGVyICovCisJCQlpZiAoKGl3ci0+dS5kYXRhLnBvaW50ZXIgPT0gTlVMTCkgJiYKKwkJCSAgIChpd3ItPnUuZGF0YS5sZW5ndGggIT0gMCkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkvKiBDaGVjayBpZiBudW1iZXIgb2YgdG9rZW4gZml0cyB3aXRoaW4gYm91bmRzICovCisJCQlpZiAoaXdyLT51LmRhdGEubGVuZ3RoID4gZGVzY3ItPm1heF90b2tlbnMpCisJCQkJcmV0dXJuIC1FMkJJRzsKKwkJCWlmIChpd3ItPnUuZGF0YS5sZW5ndGggPCBkZXNjci0+bWluX3Rva2VucykKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfSBlbHNlIHsKKwkJCS8qIENoZWNrIE5VTEwgcG9pbnRlciAqLworCQkJaWYgKGl3ci0+dS5kYXRhLnBvaW50ZXIgPT0gTlVMTCkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCS8qIFNhdmUgdXNlciBzcGFjZSBidWZmZXIgc2l6ZSBmb3IgY2hlY2tpbmcgKi8KKwkJCXVzZXJfbGVuZ3RoID0gaXdyLT51LmRhdGEubGVuZ3RoOworCisJCQkvKiBEb24ndCBjaGVjayBpZiB1c2VyX2xlbmd0aCA+IG1heCB0byBhbGxvdyBmb3J3YXJkCisJCQkgKiBjb21wYXRpYmlsaXR5LiBUaGUgdGVzdCB1c2VyX2xlbmd0aCA8IG1pbiBpcworCQkJICogaW1wbGllZCBieSB0aGUgdGVzdCBhdCB0aGUgZW5kLiAqLworCisJCQkvKiBTdXBwb3J0IGZvciB2ZXJ5IGxhcmdlIHJlcXVlc3RzICovCisJCQlpZiAoKGRlc2NyLT5mbGFncyAmIElXX0RFU0NSX0ZMQUdfTk9NQVgpICYmCisJCQkgICAodXNlcl9sZW5ndGggPiBkZXNjci0+bWF4X3Rva2VucykpIHsKKwkJCQkvKiBBbGxvdyB1c2Vyc3BhY2UgdG8gR0VUIG1vcmUgdGhhbiBtYXggc28KKwkJCQkgKiB3ZSBjYW4gc3VwcG9ydCBhbnkgc2l6ZSBHRVQgcmVxdWVzdHMuCisJCQkJICogVGhlcmUgaXMgc3RpbGwgYSBsaW1pdCA6IC1FTk9NRU0uICovCisJCQkJZXh0cmFfc2l6ZSA9IHVzZXJfbGVuZ3RoICogZGVzY3ItPnRva2VuX3NpemU7CisJCQkJLyogTm90ZSA6IHVzZXJfbGVuZ3RoIGlzIG9yaWdpbmFsbHkgYSBfX3UxNiwKKwkJCQkgKiBhbmQgdG9rZW5fc2l6ZSBpcyBjb250cm9sbGVkIGJ5IHVzLAorCQkJCSAqIHNvIGV4dHJhX3NpemUgd29uJ3QgZ2V0IG5lZ2F0aXZlIGFuZAorCQkJCSAqIHdvbid0IG92ZXJmbG93Li4uICovCisJCQl9CisJCX0KKworCQkvKiBDcmVhdGUgdGhlIGtlcm5lbCBidWZmZXIgKi8KKwkJLyogICAga3phbGxvYyBlbnN1cmVzIE5VTEwtdGVybWluYXRpb24gZm9yIGVzc2lkX2NvbXBhdCAqLworCQlleHRyYSA9IGt6YWxsb2MoZXh0cmFfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCWlmIChleHRyYSA9PSBOVUxMKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJLyogSWYgaXQgaXMgYSBTRVQsIGdldCBhbGwgdGhlIGV4dHJhIGRhdGEgaW4gaGVyZSAqLworCQlpZiAoSVdfSVNfU0VUKGNtZCkgJiYgKGl3ci0+dS5kYXRhLmxlbmd0aCAhPSAwKSkgeworCQkJZXJyID0gY29weV9mcm9tX3VzZXIoZXh0cmEsIGl3ci0+dS5kYXRhLnBvaW50ZXIsCisJCQkJCSAgICAgaXdyLT51LmRhdGEubGVuZ3RoICoKKwkJCQkJICAgICBkZXNjci0+dG9rZW5fc2l6ZSk7CisJCQlpZiAoZXJyKSB7CisJCQkJa2ZyZWUoZXh0cmEpOworCQkJCXJldHVybiAtRUZBVUxUOworCQkJfQorCQl9CisKKwkJLyogQ2FsbCB0aGUgaGFuZGxlciAqLworCQlyZXQgPSBoYW5kbGVyKGRldiwgJmluZm8sICYoaXdyLT51KSwgZXh0cmEpOworCisJCWl3ci0+dS5kYXRhLmxlbmd0aCArPSBlc3NpZF9jb21wYXQ7CisKKwkJLyogSWYgd2UgaGF2ZSBzb21ldGhpbmcgdG8gcmV0dXJuIHRvIHRoZSB1c2VyICovCisJCWlmICghcmV0ICYmIElXX0lTX0dFVChjbWQpKSB7CisJCQkvKiBDaGVjayBpZiB0aGVyZSBpcyBlbm91Z2ggYnVmZmVyIHVwIHRoZXJlICovCisJCQlpZiAodXNlcl9sZW5ndGggPCBpd3ItPnUuZGF0YS5sZW5ndGgpIHsKKwkJCQlrZnJlZShleHRyYSk7CisJCQkJcmV0dXJuIC1FMkJJRzsKKwkJCX0KKworCQkJZXJyID0gY29weV90b191c2VyKGl3ci0+dS5kYXRhLnBvaW50ZXIsIGV4dHJhLAorCQkJCQkgICBpd3ItPnUuZGF0YS5sZW5ndGggKgorCQkJCQkgICBkZXNjci0+dG9rZW5fc2l6ZSk7CisJCQlpZiAoZXJyKQorCQkJCXJldCA9ICAtRUZBVUxUOworCQl9CisKKwkJLyogR2VuZXJhdGUgYW4gZXZlbnQgdG8gbm90aWZ5IGxpc3RlbmVycyBvZiB0aGUgY2hhbmdlICovCisJCWlmICgoZGVzY3ItPmZsYWdzICYgSVdfREVTQ1JfRkxBR19FVkVOVCkgJiYKKwkJICAgKChyZXQgPT0gMCkgfHwgKHJldCA9PSAtRUlXQ09NTUlUKSkpIHsKKwkJCWlmIChkZXNjci0+ZmxhZ3MgJiBJV19ERVNDUl9GTEFHX1JFU1RSSUNUKQorCQkJCS8qIElmIHRoZSBldmVudCBpcyByZXN0cmljdGVkLCBkb24ndAorCQkJCSAqIGV4cG9ydCB0aGUgcGF5bG9hZCAqLworCQkJCXdpcmVsZXNzX3NlbmRfZXZlbnQoZGV2LCBjbWQsICYoaXdyLT51KSwgTlVMTCk7CisJCQllbHNlCisJCQkJd2lyZWxlc3Nfc2VuZF9ldmVudChkZXYsIGNtZCwgJihpd3ItPnUpLAorCQkJCQkJICAgIGV4dHJhKTsKKwkJfQorCisJCS8qIENsZWFudXAgLSBJIHRvbGQgeW91IGl0IHdhc24ndCB0aGF0IGxvbmcgOy0pICovCisJCWtmcmVlKGV4dHJhKTsKKwl9CisKKwkvKiBDYWxsIGNvbW1pdCBoYW5kbGVyIGlmIG5lZWRlZCBhbmQgZGVmaW5lZCAqLworCWlmIChyZXQgPT0gLUVJV0NPTU1JVCkKKwkJcmV0ID0gY2FsbF9jb21taXRfaGFuZGxlcihkZXYpOworCisJLyogSGVyZSwgd2Ugd2lsbCBnZW5lcmF0ZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVlZGVkICovCisKKwlyZXR1cm4gcmV0OworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogV3JhcHBlciB0byBjYWxsIGEgcHJpdmF0ZSBXaXJlbGVzcyBFeHRlbnNpb24gaGFuZGxlci4KKyAqIFdlIGRvIHZhcmlvdXMgY2hlY2tzIGFuZCBhbHNvIHRha2UgY2FyZSBvZiBtb3ZpbmcgZGF0YSBiZXR3ZWVuCisgKiB1c2VyIHNwYWNlIGFuZCBrZXJuZWwgc3BhY2UuCisgKiBJdCdzIG5vdCBhcyBuaWNlIGFuZCBzbGltbGluZSBhcyB0aGUgc3RhbmRhcmQgd3JhcHBlci4gVGhlIGNhdXNlCisgKiBpcyBzdHJ1Y3QgaXdfcHJpdl9hcmdzLCB3aGljaCB3YXMgbm90IHJlYWxseSBkZXNpZ25lZCBmb3IgdGhlCisgKiBqb2Igd2UgYXJlIGdvaW5nIGhlcmUuCisgKgorICogSU1QT1JUQU5UIDogVGhpcyBmdW5jdGlvbiBwcmV2ZW50IHRvIHNldCBhbmQgZ2V0IGRhdGEgb24gdGhlIHNhbWUKKyAqIElPQ1RMIGFuZCBlbmZvcmNlIHRoZSBTRVQvR0VUIGNvbnZlbnRpb24uIE5vdCBkb2luZyBpdCB3b3VsZCBiZQorICogZmFyIHRvbyBoYWlyeS4uLgorICogSWYgeW91IG5lZWQgdG8gc2V0IGFuZCBnZXQgZGF0YSBhdCB0aGUgc2FtZSB0aW1lLCBwbGVhc2UgZG9uJ3QgdXNlCisgKiBhIGl3X2hhbmRsZXIgYnV0IHByb2Nlc3MgaXQgaW4geW91ciBpb2N0bCBoYW5kbGVyIChpLmUuIHVzZSB0aGUKKyAqIG9sZCBkcml2ZXIgQVBJKS4KKyAqLworc3RhdGljIGludCBpb2N0bF9wcml2YXRlX2NhbGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgY21kLCBpd19oYW5kbGVyIGhhbmRsZXIpCit7CisJc3RydWN0IGl3cmVxICoJCQlpd3IgPSAoc3RydWN0IGl3cmVxICopIGlmcjsKKwljb25zdCBzdHJ1Y3QgaXdfcHJpdl9hcmdzICoJZGVzY3IgPSBOVUxMOworCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8JCWluZm87CisJaW50CQkJCWV4dHJhX3NpemUgPSAwOworCWludAkJCQlpOworCWludAkJCQlyZXQgPSAtRUlOVkFMOworCisJLyogR2V0IHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgSU9DVEwgKi8KKwlmb3IgKGkgPSAwOyBpIDwgZGV2LT53aXJlbGVzc19oYW5kbGVycy0+bnVtX3ByaXZhdGVfYXJnczsgaSsrKQorCQlpZiAoY21kID09IGRldi0+d2lyZWxlc3NfaGFuZGxlcnMtPnByaXZhdGVfYXJnc1tpXS5jbWQpIHsKKwkJCWRlc2NyID0gJihkZXYtPndpcmVsZXNzX2hhbmRsZXJzLT5wcml2YXRlX2FyZ3NbaV0pOworCQkJYnJlYWs7CisJCX0KKworCS8qIENvbXB1dGUgdGhlIHNpemUgb2YgdGhlIHNldC9nZXQgYXJndW1lbnRzICovCisJaWYgKGRlc2NyICE9IE5VTEwpIHsKKwkJaWYgKElXX0lTX1NFVChjbWQpKSB7CisJCQlpbnQJb2Zmc2V0ID0gMDsJLyogRm9yIHN1Yi1pb2N0bHMgKi8KKwkJCS8qIENoZWNrIGZvciBzdWItaW9jdGwgaGFuZGxlciAqLworCQkJaWYgKGRlc2NyLT5uYW1lWzBdID09ICdcMCcpCisJCQkJLyogUmVzZXJ2ZSBvbmUgaW50IGZvciBzdWItaW9jdGwgaW5kZXggKi8KKwkJCQlvZmZzZXQgPSBzaXplb2YoX191MzIpOworCisJCQkvKiBTaXplIG9mIHNldCBhcmd1bWVudHMgKi8KKwkJCWV4dHJhX3NpemUgPSBnZXRfcHJpdl9zaXplKGRlc2NyLT5zZXRfYXJncyk7CisKKwkJCS8qIERvZXMgaXQgZml0cyBpbiBpd3IgPyAqLworCQkJaWYgKChkZXNjci0+c2V0X2FyZ3MgJiBJV19QUklWX1NJWkVfRklYRUQpICYmCisJCQkgICAoKGV4dHJhX3NpemUgKyBvZmZzZXQpIDw9IElGTkFNU0laKSkKKwkJCQlleHRyYV9zaXplID0gMDsKKwkJfSBlbHNlIHsKKwkJCS8qIFNpemUgb2YgZ2V0IGFyZ3VtZW50cyAqLworCQkJZXh0cmFfc2l6ZSA9IGdldF9wcml2X3NpemUoZGVzY3ItPmdldF9hcmdzKTsKKworCQkJLyogRG9lcyBpdCBmaXRzIGluIGl3ciA/ICovCisJCQlpZiAoKGRlc2NyLT5nZXRfYXJncyAmIElXX1BSSVZfU0laRV9GSVhFRCkgJiYKKwkJCSAgIChleHRyYV9zaXplIDw9IElGTkFNU0laKSkKKwkJCQlleHRyYV9zaXplID0gMDsKKwkJfQorCX0KKworCS8qIFByZXBhcmUgdGhlIGNhbGwgKi8KKwlpbmZvLmNtZCA9IGNtZDsKKwlpbmZvLmZsYWdzID0gMDsKKworCS8qIENoZWNrIGlmIHdlIGhhdmUgYSBwb2ludGVyIHRvIHVzZXIgc3BhY2UgZGF0YSBvciBub3QuICovCisJaWYgKGV4dHJhX3NpemUgPT0gMCkgeworCQkvKiBObyBleHRyYSBhcmd1bWVudHMuIFRyaXZpYWwgdG8gaGFuZGxlICovCisJCXJldCA9IGhhbmRsZXIoZGV2LCAmaW5mbywgJihpd3ItPnUpLCAoY2hhciAqKSAmKGl3ci0+dSkpOworCX0gZWxzZSB7CisJCWNoYXIgKglleHRyYTsKKwkJaW50CWVycjsKKworCQkvKiBDaGVjayB3aGF0IHVzZXIgc3BhY2UgaXMgZ2l2aW5nIHVzICovCisJCWlmIChJV19JU19TRVQoY21kKSkgeworCQkJLyogQ2hlY2sgTlVMTCBwb2ludGVyICovCisJCQlpZiAoKGl3ci0+dS5kYXRhLnBvaW50ZXIgPT0gTlVMTCkgJiYKKwkJCSAgIChpd3ItPnUuZGF0YS5sZW5ndGggIT0gMCkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCS8qIERvZXMgaXQgZml0cyB3aXRoaW4gYm91bmRzID8gKi8KKwkJCWlmIChpd3ItPnUuZGF0YS5sZW5ndGggPiAoZGVzY3ItPnNldF9hcmdzICYKKwkJCQkJCSBJV19QUklWX1NJWkVfTUFTSykpCisJCQkJcmV0dXJuIC1FMkJJRzsKKwkJfSBlbHNlIGlmIChpd3ItPnUuZGF0YS5wb2ludGVyID09IE5VTEwpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkvKiBBbHdheXMgYWxsb2NhdGUgZm9yIG1heCBzcGFjZS4gRWFzaWVyLCBhbmQgd29uJ3QgbGFzdAorCQkgKiBsb25nLi4uICovCisJCWV4dHJhID0ga21hbGxvYyhleHRyYV9zaXplLCBHRlBfS0VSTkVMKTsKKwkJaWYgKGV4dHJhID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQkvKiBJZiBpdCBpcyBhIFNFVCwgZ2V0IGFsbCB0aGUgZXh0cmEgZGF0YSBpbiBoZXJlICovCisJCWlmIChJV19JU19TRVQoY21kKSAmJiAoaXdyLT51LmRhdGEubGVuZ3RoICE9IDApKSB7CisJCQllcnIgPSBjb3B5X2Zyb21fdXNlcihleHRyYSwgaXdyLT51LmRhdGEucG9pbnRlciwKKwkJCQkJICAgICBleHRyYV9zaXplKTsKKwkJCWlmIChlcnIpIHsKKwkJCQlrZnJlZShleHRyYSk7CisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQl9CisJCX0KKworCQkvKiBDYWxsIHRoZSBoYW5kbGVyICovCisJCXJldCA9IGhhbmRsZXIoZGV2LCAmaW5mbywgJihpd3ItPnUpLCBleHRyYSk7CisKKwkJLyogSWYgd2UgaGF2ZSBzb21ldGhpbmcgdG8gcmV0dXJuIHRvIHRoZSB1c2VyICovCisJCWlmICghcmV0ICYmIElXX0lTX0dFVChjbWQpKSB7CisKKwkJCS8qIEFkanVzdCBmb3IgdGhlIGFjdHVhbCBsZW5ndGggaWYgaXQncyB2YXJpYWJsZSwKKwkJCSAqIGF2b2lkIGxlYWtpbmcga2VybmVsIGJpdHMgb3V0c2lkZS4gKi8KKwkJCWlmICghKGRlc2NyLT5nZXRfYXJncyAmIElXX1BSSVZfU0laRV9GSVhFRCkpIHsKKwkJCQlleHRyYV9zaXplID0gYWRqdXN0X3ByaXZfc2l6ZShkZXNjci0+Z2V0X2FyZ3MsCisJCQkJCQkJICAgICAgJihpd3ItPnUpKTsKKwkJCX0KKworCQkJZXJyID0gY29weV90b191c2VyKGl3ci0+dS5kYXRhLnBvaW50ZXIsIGV4dHJhLAorCQkJCQkgICBleHRyYV9zaXplKTsKKwkJCWlmIChlcnIpCisJCQkJcmV0ID0gIC1FRkFVTFQ7CisJCX0KKworCQkvKiBDbGVhbnVwIC0gSSB0b2xkIHlvdSBpdCB3YXNuJ3QgdGhhdCBsb25nIDstKSAqLworCQlrZnJlZShleHRyYSk7CisJfQorCisKKwkvKiBDYWxsIGNvbW1pdCBoYW5kbGVyIGlmIG5lZWRlZCBhbmQgZGVmaW5lZCAqLworCWlmIChyZXQgPT0gLUVJV0NPTU1JVCkKKwkJcmV0ID0gY2FsbF9jb21taXRfaGFuZGxlcihkZXYpOworCisJcmV0dXJuIHJldDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqIE1haW4gSU9DVGwgZGlzcGF0Y2hlci4KKyAqIENoZWNrIHRoZSB0eXBlIG9mIElPQ1RMIGFuZCBjYWxsIHRoZSBhcHByb3ByaWF0ZSB3cmFwcGVyLi4uCisgKi8KK3N0YXRpYyBpbnQgd2lyZWxlc3NfcHJvY2Vzc19pb2N0bChzdHJ1Y3QgaWZyZXEgKmlmciwgdW5zaWduZWQgaW50IGNtZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWl3X2hhbmRsZXIJaGFuZGxlcjsKKworCS8qIFBlcm1pc3Npb25zIGFyZSBhbHJlYWR5IGNoZWNrZWQgaW4gZGV2X2lvY3RsKCkgYmVmb3JlIGNhbGxpbmcgdXMuCisJICogVGhlIGNvcHlfdG8vZnJvbV91c2VyKCkgb2YgaWZyIGlzIGFsc28gZGVhbHQgd2l0aCBpbiB0aGVyZSAqLworCisJLyogTWFrZSBzdXJlIHRoZSBkZXZpY2UgZXhpc3QgKi8KKwlpZiAoKGRldiA9IF9fZGV2X2dldF9ieV9uYW1lKGlmci0+aWZyX25hbWUpKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIEEgYnVuY2ggb2Ygc3BlY2lhbCBjYXNlcywgdGhlbiB0aGUgZ2VuZXJpYyBjYXNlLi4uCisJICogTm90ZSB0aGF0ICdjbWQnIGlzIGFscmVhZHkgZmlsdGVyZWQgaW4gZGV2X2lvY3RsKCkgd2l0aAorCSAqIChjbWQgPj0gU0lPQ0lXRklSU1QgJiYgY21kIDw9IFNJT0NJV0xBU1QpICovCisJaWYgKGNtZCA9PSBTSU9DR0lXU1RBVFMpCisJCXJldHVybiBpb2N0bF9zdGFuZGFyZF9jYWxsKGRldiwgaWZyLCBjbWQsCisJCQkJCSAgICZpd19oYW5kbGVyX2dldF9pd3N0YXRzKTsKKworCWlmIChjbWQgPT0gU0lPQ0dJV1BSSVYgJiYgZGV2LT53aXJlbGVzc19oYW5kbGVycykKKwkJcmV0dXJuIGlvY3RsX3N0YW5kYXJkX2NhbGwoZGV2LCBpZnIsIGNtZCwKKwkJCQkJICAgJml3X2hhbmRsZXJfZ2V0X3ByaXZhdGUpOworCisJLyogQmFzaWMgY2hlY2sgKi8KKwlpZiAoIW5ldGlmX2RldmljZV9wcmVzZW50KGRldikpCisJCXJldHVybiAtRU5PREVWOworCisJLyogTmV3IGRyaXZlciBBUEkgOiB0cnkgdG8gZmluZCB0aGUgaGFuZGxlciAqLworCWhhbmRsZXIgPSBnZXRfaGFuZGxlcihkZXYsIGNtZCk7CisJaWYgKGhhbmRsZXIpIHsKKwkJLyogU3RhbmRhcmQgYW5kIHByaXZhdGUgYXJlIG5vdCB0aGUgc2FtZSAqLworCQlpZiAoY21kIDwgU0lPQ0lXRklSU1RQUklWKQorCQkJcmV0dXJuIGlvY3RsX3N0YW5kYXJkX2NhbGwoZGV2LCBpZnIsIGNtZCwgaGFuZGxlcik7CisJCWVsc2UKKwkJCXJldHVybiBpb2N0bF9wcml2YXRlX2NhbGwoZGV2LCBpZnIsIGNtZCwgaGFuZGxlcik7CisJfQorCS8qIE9sZCBkcml2ZXIgQVBJIDogY2FsbCBkcml2ZXIgaW9jdGwgaGFuZGxlciAqLworCWlmIChkZXYtPmRvX2lvY3RsKQorCQlyZXR1cm4gZGV2LT5kb19pb2N0bChkZXYsIGlmciwgY21kKTsKKwlyZXR1cm4gLUVPUE5PVFNVUFA7Cit9CisKKy8qIGVudHJ5IHBvaW50IGZyb20gZGV2IGlvY3RsICovCitpbnQgd2V4dF9oYW5kbGVfaW9jdGwoc3RydWN0IGlmcmVxICppZnIsIHVuc2lnbmVkIGludCBjbWQsCisJCSAgICAgIHZvaWQgX191c2VyICphcmcpCit7CisJaW50IHJldDsKKworCS8qIElmIGNvbW1hbmQgaXMgYHNldCBhIHBhcmFtZXRlcicsIG9yCisJICogYGdldCB0aGUgZW5jb2RpbmcgcGFyYW1ldGVycycsIGNoZWNrIGlmCisJICogdGhlIHVzZXIgaGFzIHRoZSByaWdodCB0byBkbyBpdCAqLworCWlmICgoSVdfSVNfU0VUKGNtZCkgfHwgY21kID09IFNJT0NHSVdFTkNPREUgfHwgY21kID09IFNJT0NHSVdFTkNPREVFWFQpCisJICAgICYmICFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJNOworCisJZGV2X2xvYWQoaWZyLT5pZnJfbmFtZSk7CisJcnRubF9sb2NrKCk7CisJcmV0ID0gd2lyZWxlc3NfcHJvY2Vzc19pb2N0bChpZnIsIGNtZCk7CisJcnRubF91bmxvY2soKTsKKwlpZiAoSVdfSVNfR0VUKGNtZCkgJiYgY29weV90b191c2VyKGFyZywgaWZyLCBzaXplb2Yoc3RydWN0IGlmcmVxKSkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiByZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqIEVWRU5UIFBST0NFU1NJTkcgKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBQcm9jZXNzIGV2ZW50cyBnZW5lcmF0ZWQgYnkgdGhlIHdpcmVsZXNzIGxheWVyIG9yIHRoZSBkcml2ZXIuCisgKiBNb3N0IG9mdGVuLCB0aGUgZXZlbnQgd2lsbCBiZSBwcm9wYWdhdGVkIHRocm91Z2ggcnRuZXRsaW5rCisgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqIExvY2tpbmcuLi4KKyAqIC0tLS0tLS0tLS0KKyAqCisgKiBUaGFua3MgdG8gSGVyYmVydCBYdSA8aGVyYmVydEBnb25kb3IuYXBhbmEub3JnLmF1PiBmb3IgZml4aW5nCisgKiB0aGUgbG9ja2luZyBpc3N1ZSBpbiBoZXJlIGFuZCBpbXBsZW1lbnRpbmcgdGhpcyBjb2RlICEKKyAqCisgKiBUaGUgaXNzdWUgOiB3aXJlbGVzc19zZW5kX2V2ZW50KCkgaXMgb2Z0ZW4gY2FsbGVkIGluIGludGVycnVwdCBjb250ZXh0LAorICogd2hpbGUgdGhlIE5ldGxpbmsgbGF5ZXIgY2FuIG5ldmVyIGJlIGNhbGxlZCBpbiBpbnRlcnJ1cHQgY29udGV4dC4KKyAqIFRoZSBmdWxseSBmb3JtZWQgUnROZXRsaW5rIGV2ZW50cyBhcmUgcXVldWVkLCBhbmQgdGhlbiBhIHRhc2tsZXQgaXMgcnVuCisgKiB0byBmZWVkIHRob3NlIHRvIE5ldGxpbmsuCisgKiBUaGUgc2tiX3F1ZXVlIGlzIGludGVycnVwdCBzYWZlLCBhbmQgaXRzIGxvY2sgaXMgbm90IGhlbGQgd2hpbGUgY2FsbGluZworICogTmV0bGluaywgc28gdGhlcmUgaXMgbm8gcG9zc2liaWxpdHkgb2YgZGVhbG9jay4KKyAqIEplYW4gSUkKKyAqLworCitzdGF0aWMgc3RydWN0IHNrX2J1ZmZfaGVhZCB3aXJlbGVzc19ubGV2ZW50X3F1ZXVlOworCitzdGF0aWMgaW50IF9faW5pdCB3aXJlbGVzc19ubGV2ZW50X2luaXQodm9pZCkKK3sKKwlza2JfcXVldWVfaGVhZF9pbml0KCZ3aXJlbGVzc19ubGV2ZW50X3F1ZXVlKTsKKwlyZXR1cm4gMDsKK30KKworc3Vic3lzX2luaXRjYWxsKHdpcmVsZXNzX25sZXZlbnRfaW5pdCk7CisKK3N0YXRpYyB2b2lkIHdpcmVsZXNzX25sZXZlbnRfcHJvY2Vzcyh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJndpcmVsZXNzX25sZXZlbnRfcXVldWUpKSkKKwkJcnRubF9ub3RpZnkoc2tiLCAwLCBSVE5MR1JQX0xJTkssIE5VTEwsIEdGUF9BVE9NSUMpOworfQorCitzdGF0aWMgREVDTEFSRV9UQVNLTEVUKHdpcmVsZXNzX25sZXZlbnRfdGFza2xldCwgd2lyZWxlc3NfbmxldmVudF9wcm9jZXNzLCAwKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqIEZpbGwgYSBydG5ldGxpbmsgbWVzc2FnZSB3aXRoIG91ciBldmVudCBkYXRhLgorICogTm90ZSB0aGF0IHdlIHByb3BhZ2Ugb25seSB0aGUgc3BlY2lmaWVkIGV2ZW50IGFuZCBkb24ndCBkdW1wIHRoZQorICogY3VycmVudCB3aXJlbGVzcyBjb25maWcuIER1bXBpbmcgdGhlIHdpcmVsZXNzIGNvbmZpZyBpcyBmYXIgdG9vCisgKiBleHBlbnNpdmUgKGZvciBlYWNoIHBhcmFtZXRlciwgdGhlIGRyaXZlciBuZWVkIHRvIHF1ZXJ5IHRoZSBoYXJkd2FyZSkuCisgKi8KK3N0YXRpYyBpbnQgcnRuZXRsaW5rX2ZpbGxfaXdpbmZvKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJIGludCB0eXBlLCBjaGFyICpldmVudCwgaW50IGV2ZW50X2xlbikKK3sKKwlzdHJ1Y3QgaWZpbmZvbXNnICpyOworCXN0cnVjdCBubG1zZ2hkciAgKm5saDsKKwl1bnNpZ25lZCBjaGFyCSAqYiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKTsKKworCW5saCA9IE5MTVNHX1BVVChza2IsIDAsIDAsIHR5cGUsIHNpemVvZigqcikpOworCXIgPSBOTE1TR19EQVRBKG5saCk7CisJci0+aWZpX2ZhbWlseSA9IEFGX1VOU1BFQzsKKwlyLT5fX2lmaV9wYWQgPSAwOworCXItPmlmaV90eXBlID0gZGV2LT50eXBlOworCXItPmlmaV9pbmRleCA9IGRldi0+aWZpbmRleDsKKwlyLT5pZmlfZmxhZ3MgPSBkZXZfZ2V0X2ZsYWdzKGRldik7CisJci0+aWZpX2NoYW5nZSA9IDA7CS8qIFdpcmVsZXNzIGNoYW5nZXMgZG9uJ3QgYWZmZWN0IHRob3NlIGZsYWdzICovCisKKwkvKiBBZGQgdGhlIHdpcmVsZXNzIGV2ZW50cyBpbiB0aGUgbmV0bGluayBwYWNrZXQgKi8KKwlSVEFfUFVUKHNrYiwgSUZMQV9XSVJFTEVTUywgZXZlbnRfbGVuLCBldmVudCk7CisKKwlubGgtPm5sbXNnX2xlbiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKSAtIGI7CisJcmV0dXJuIHNrYi0+bGVuOworCitubG1zZ19mYWlsdXJlOgorcnRhdHRyX2ZhaWx1cmU6CisJbmxtc2dfdHJpbShza2IsIGIpOworCXJldHVybiAtMTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqIENyZWF0ZSBhbmQgYnJvYWRjYXN0IGFuZCBzZW5kIGl0IG9uIHRoZSBzdGFuZGFyZCBydG5ldGxpbmsgc29ja2V0CisgKiBUaGlzIGlzIGEgcHVyZSBjbG9uZSBydG1zZ19pZmluZm8oKSBpbiBuZXQvY29yZS9ydG5ldGxpbmsuYworICogQW5kcnplaiBLcnp5c3p0b2Zvd2ljeiBtYW5kYXRlZCB0aGF0IEkgdXNlZCBhIElGTEFfWFhYIGZpZWxkCisgKiB3aXRoaW4gYSBSVE1fTkVXTElOSyBldmVudC4KKyAqLworc3RhdGljIHZvaWQgcnRtc2dfaXdpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNoYXIgKmV2ZW50LCBpbnQgZXZlbnRfbGVuKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IHNpemUgPSBOTE1TR19HT09EU0laRTsKKworCXNrYiA9IGFsbG9jX3NrYihzaXplLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuOworCisJaWYgKHJ0bmV0bGlua19maWxsX2l3aW5mbyhza2IsIGRldiwgUlRNX05FV0xJTkssCisJCQkJICBldmVudCwgZXZlbnRfbGVuKSA8IDApIHsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybjsKKwl9CisJTkVUTElOS19DQihza2IpLmRzdF9ncm91cCA9IFJUTkxHUlBfTElOSzsKKwlza2JfcXVldWVfdGFpbCgmd2lyZWxlc3NfbmxldmVudF9xdWV1ZSwgc2tiKTsKKwl0YXNrbGV0X3NjaGVkdWxlKCZ3aXJlbGVzc19ubGV2ZW50X3Rhc2tsZXQpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogTWFpbiBldmVudCBkaXNwYXRjaGVyLiBDYWxsZWQgZnJvbSBvdGhlciBwYXJ0cyBhbmQgZHJpdmVycy4KKyAqIFNlbmQgdGhlIGV2ZW50IG9uIHRoZSBhcHByb3ByaWF0ZSBjaGFubmVscy4KKyAqIE1heSBiZSBjYWxsZWQgZnJvbSBpbnRlcnJ1cHQgY29udGV4dC4KKyAqLwordm9pZCB3aXJlbGVzc19zZW5kX2V2ZW50KHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2LAorCQkJIHVuc2lnbmVkIGludAkJY21kLAorCQkJIHVuaW9uIGl3cmVxX2RhdGEgKgl3cnF1LAorCQkJIGNoYXIgKgkJCWV4dHJhKQoreworCWNvbnN0IHN0cnVjdCBpd19pb2N0bF9kZXNjcmlwdGlvbiAqCWRlc2NyID0gTlVMTDsKKwlpbnQgZXh0cmFfbGVuID0gMDsKKwlzdHJ1Y3QgaXdfZXZlbnQgICpldmVudDsJCS8qIE1hbGxvY2F0ZWQgd2hvbGUgZXZlbnQgKi8KKwlpbnQgZXZlbnRfbGVuOwkJCQkvKiBJdHMgc2l6ZSAqLworCWludCBoZHJfbGVuOwkJCQkvKiBTaXplIG9mIHRoZSBldmVudCBoZWFkZXIgKi8KKwlpbnQgd3JxdV9vZmYgPSAwOwkJCS8qIE9mZnNldCBpbiB3cnF1ICovCisJLyogRG9uJ3QgIm9wdGltaXNlIiB0aGUgZm9sbG93aW5nIHZhcmlhYmxlLCBpdCB3aWxsIGNyYXNoICovCisJdW5zaWduZWQJY21kX2luZGV4OwkJLyogKk1VU1QqIGJlIHVuc2lnbmVkICovCisKKwkvKiBHZXQgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBFdmVudCAqLworCWlmIChjbWQgPD0gU0lPQ0lXTEFTVCkgeworCQljbWRfaW5kZXggPSBjbWQgLSBTSU9DSVdGSVJTVDsKKwkJaWYgKGNtZF9pbmRleCA8IHN0YW5kYXJkX2lvY3RsX251bSkKKwkJCWRlc2NyID0gJihzdGFuZGFyZF9pb2N0bFtjbWRfaW5kZXhdKTsKKwl9IGVsc2UgeworCQljbWRfaW5kZXggPSBjbWQgLSBJV0VWRklSU1Q7CisJCWlmIChjbWRfaW5kZXggPCBzdGFuZGFyZF9ldmVudF9udW0pCisJCQlkZXNjciA9ICYoc3RhbmRhcmRfZXZlbnRbY21kX2luZGV4XSk7CisJfQorCS8qIERvbid0IGFjY2VwdCB1bmtub3duIGV2ZW50cyAqLworCWlmIChkZXNjciA9PSBOVUxMKSB7CisJCS8qIE5vdGUgOiB3ZSBkb24ndCByZXR1cm4gYW4gZXJyb3IgdG8gdGhlIGRyaXZlciwgYmVjYXVzZQorCQkgKiB0aGUgZHJpdmVyIHdvdWxkIG5vdCBrbm93IHdoYXQgdG8gZG8gYWJvdXQgaXQuIEl0IGNhbid0CisJCSAqIHJldHVybiBhbiBlcnJvciB0byB0aGUgdXNlciwgYmVjYXVzZSB0aGUgZXZlbnQgaXMgbm90CisJCSAqIGluaXRpYXRlZCBieSBhIHVzZXIgcmVxdWVzdC4KKwkJICogVGhlIGJlc3QgdGhlIGRyaXZlciBjb3VsZCBkbyBpcyB0byBsb2cgYW4gZXJyb3IgbWVzc2FnZS4KKwkJICogV2Ugd2lsbCBkbyBpdCBvdXJzZWx2ZXMgaW5zdGVhZC4uLgorCQkgKi8KKwkJcHJpbnRrKEtFUk5fRVJSICIlcyAoV0UpIDogSW52YWxpZC9Vbmtub3duIFdpcmVsZXNzIEV2ZW50ICgweCUwNFgpXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBjbWQpOworCQlyZXR1cm47CisJfQorCisJLyogQ2hlY2sgZXh0cmEgcGFyYW1ldGVycyBhbmQgc2V0IGV4dHJhX2xlbiAqLworCWlmIChkZXNjci0+aGVhZGVyX3R5cGUgPT0gSVdfSEVBREVSX1RZUEVfUE9JTlQpIHsKKwkJLyogQ2hlY2sgaWYgbnVtYmVyIG9mIHRva2VuIGZpdHMgd2l0aGluIGJvdW5kcyAqLworCQlpZiAod3JxdS0+ZGF0YS5sZW5ndGggPiBkZXNjci0+bWF4X3Rva2VucykgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlcyAoV0UpIDogV2lyZWxlc3MgRXZlbnQgdG9vIGJpZyAoJWQpXG4iLCBkZXYtPm5hbWUsIHdycXUtPmRhdGEubGVuZ3RoKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAod3JxdS0+ZGF0YS5sZW5ndGggPCBkZXNjci0+bWluX3Rva2VucykgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlcyAoV0UpIDogV2lyZWxlc3MgRXZlbnQgdG9vIHNtYWxsICglZClcbiIsIGRldi0+bmFtZSwgd3JxdS0+ZGF0YS5sZW5ndGgpOworCQkJcmV0dXJuOworCQl9CisJCS8qIENhbGN1bGF0ZSBleHRyYV9sZW4gLSBleHRyYSBpcyBOVUxMIGZvciByZXN0cmljdGVkIGV2ZW50cyAqLworCQlpZiAoZXh0cmEgIT0gTlVMTCkKKwkJCWV4dHJhX2xlbiA9IHdycXUtPmRhdGEubGVuZ3RoICogZGVzY3ItPnRva2VuX3NpemU7CisJCS8qIEFsd2F5cyBhdCBhbiBvZmZzZXQgaW4gd3JxdSAqLworCQl3cnF1X29mZiA9IElXX0VWX1BPSU5UX09GRjsKKwl9CisKKwkvKiBUb3RhbCBsZW5ndGggb2YgdGhlIGV2ZW50ICovCisJaGRyX2xlbiA9IGV2ZW50X3R5cGVfc2l6ZVtkZXNjci0+aGVhZGVyX3R5cGVdOworCWV2ZW50X2xlbiA9IGhkcl9sZW4gKyBleHRyYV9sZW47CisKKwkvKiBDcmVhdGUgdGVtcG9yYXJ5IGJ1ZmZlciB0byBob2xkIHRoZSBldmVudCAqLworCWV2ZW50ID0ga21hbGxvYyhldmVudF9sZW4sIEdGUF9BVE9NSUMpOworCWlmIChldmVudCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwkvKiBGaWxsIGV2ZW50ICovCisJZXZlbnQtPmxlbiA9IGV2ZW50X2xlbjsKKwlldmVudC0+Y21kID0gY21kOworCW1lbWNweSgmZXZlbnQtPnUsICgoY2hhciAqKSB3cnF1KSArIHdycXVfb2ZmLCBoZHJfbGVuIC0gSVdfRVZfTENQX0xFTik7CisJaWYgKGV4dHJhKQorCQltZW1jcHkoKChjaGFyICopIGV2ZW50KSArIGhkcl9sZW4sIGV4dHJhLCBleHRyYV9sZW4pOworCisJLyogU2VuZCB2aWEgdGhlIFJ0TmV0bGluayBldmVudCBjaGFubmVsICovCisJcnRtc2dfaXdpbmZvKGRldiwgKGNoYXIgKikgZXZlbnQsIGV2ZW50X2xlbik7CisKKwkvKiBDbGVhbnVwICovCisJa2ZyZWUoZXZlbnQpOworCisJcmV0dXJuOwkJLyogQWx3YXlzIHN1Y2Nlc3MsIEkgZ3Vlc3MgOy0pICovCit9CitFWFBPUlRfU1lNQk9MKHdpcmVsZXNzX3NlbmRfZXZlbnQpOworCisvKioqKioqKioqKioqKioqKioqKioqKiBFTkhBTkNFRCBJV1NQWSBTVVBQT1JUICoqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogSW4gdGhlIG9sZCBkYXlzLCB0aGUgZHJpdmVyIHdhcyBoYW5kbGluZyBzcHkgc3VwcG9ydCBhbGwgYnkgaXRzZWxmLgorICogTm93LCB0aGUgZHJpdmVyIGNhbiBkZWxlZ2F0ZSB0aGlzIHRhc2sgdG8gV2lyZWxlc3MgRXh0ZW5zaW9ucy4KKyAqIEl0IG5lZWRzIHRvIHVzZSB0aG9zZSBzdGFuZGFyZCBzcHkgaXdfaGFuZGxlciBpbiBzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYsCisgKiBwdXNoIGRhdGEgdG8gdXMgdmlhIHdpcmVsZXNzX3NweV91cGRhdGUoKSBhbmQgaW5jbHVkZSBzdHJ1Y3QgaXdfc3B5X2RhdGEKKyAqIGluIGl0cyBwcml2YXRlIHBhcnQgKGFuZCBleHBvcnQgaXQgaW4gbmV0X2RldmljZS0+d2lyZWxlc3NfZGF0YS0+c3B5X2RhdGEpLgorICogT25lIG9mIHRoZSBtYWluIGFkdmFudGFnZSBvZiBjZW50cmFsaXNpbmcgc3B5IHN1cHBvcnQgaGVyZSBpcyB0aGF0CisgKiBpdCBiZWNvbWVzIG11Y2ggZWFzaWVyIHRvIGltcHJvdmUgYW5kIGV4dGVuZCBpdCB3aXRob3V0IGhhdmluZyB0byB0b3VjaAorICogdGhlIGRyaXZlcnMuIE9uZSBleGFtcGxlIGlzIHRoZSBhZGRpdGlvbiBvZiB0aGUgU3B5LVRocmVzaG9sZCBldmVudHMuCisgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqIFJldHVybiB0aGUgcG9pbnRlciB0byB0aGUgc3B5IGRhdGEgaW4gdGhlIGRyaXZlci4KKyAqIEJlY2F1c2UgdGhpcyBpcyBjYWxsZWQgb24gdGhlIFJ4IHBhdGggdmlhIHdpcmVsZXNzX3NweV91cGRhdGUoKSwKKyAqIHdlIHdhbnQgaXQgdG8gYmUgZWZmaWNpZW50Li4uCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGl3X3NweV9kYXRhICpnZXRfc3B5ZGF0YShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCS8qIFRoaXMgaXMgdGhlIG5ldyB3YXkgKi8KKwlpZiAoZGV2LT53aXJlbGVzc19kYXRhKQorCQlyZXR1cm4gZGV2LT53aXJlbGVzc19kYXRhLT5zcHlfZGF0YTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFN0YW5kYXJkIFdpcmVsZXNzIEhhbmRsZXIgOiBzZXQgU3B5IExpc3QKKyAqLworaW50IGl3X2hhbmRsZXJfc2V0X3NweShzdHJ1Y3QgbmV0X2RldmljZSAqCWRldiwKKwkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKglpbmZvLAorCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqCXdycXUsCisJCSAgICAgICBjaGFyICoJCQlleHRyYSkKK3sKKwlzdHJ1Y3QgaXdfc3B5X2RhdGEgKglzcHlkYXRhID0gZ2V0X3NweWRhdGEoZGV2KTsKKwlzdHJ1Y3Qgc29ja2FkZHIgKglhZGRyZXNzID0gKHN0cnVjdCBzb2NrYWRkciAqKSBleHRyYTsKKworCS8qIE1ha2Ugc3VyZSBkcml2ZXIgaXMgbm90IGJ1Z2d5IG9yIHVzaW5nIHRoZSBvbGQgQVBJICovCisJaWYgKCFzcHlkYXRhKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwkvKiBEaXNhYmxlIHNweSBjb2xsZWN0aW9uIHdoaWxlIHdlIGNvcHkgdGhlIGFkZHJlc3Nlcy4KKwkgKiBXaGlsZSB3ZSBjb3B5IGFkZHJlc3NlcywgYW55IGNhbGwgdG8gd2lyZWxlc3Nfc3B5X3VwZGF0ZSgpCisJICogd2lsbCBOT1AuIFRoaXMgaXMgT0ssIGFzIGFueXdheSB0aGUgYWRkcmVzc2VzIGFyZSBjaGFuZ2luZy4gKi8KKwlzcHlkYXRhLT5zcHlfbnVtYmVyID0gMDsKKworCS8qIFdlIHdhbnQgdG8gb3BlcmF0ZSB3aXRob3V0IGxvY2tpbmcsIGJlY2F1c2Ugd2lyZWxlc3Nfc3B5X3VwZGF0ZSgpCisJICogbW9zdCBsaWtlbHkgd2lsbCBoYXBwZW4gaW4gdGhlIGludGVycnVwdCBoYW5kbGVyLCBhbmQgdGhlcmVmb3JlCisJICogaGF2ZSBpdHMgb3duIGxvY2tpbmcgY29uc3RyYWludHMgYW5kIG5lZWRzIHBlcmZvcm1hbmNlLgorCSAqIFRoZSBydG5sX2xvY2soKSBtYWtlIHN1cmUgd2UgZG9uJ3QgcmFjZSB3aXRoIHRoZSBvdGhlciBpd19oYW5kbGVycy4KKwkgKiBUaGlzIG1ha2Ugc3VyZSB3aXJlbGVzc19zcHlfdXBkYXRlKCkgInNlZSIgdGhhdCB0aGUgc3B5IGxpc3QKKwkgKiBpcyB0ZW1wb3JhcmlseSBkaXNhYmxlZC4gKi8KKwlzbXBfd21iKCk7CisKKwkvKiBBcmUgdGhlcmUgYXJlIGFkZHJlc3NlcyB0byBjb3B5PyAqLworCWlmICh3cnF1LT5kYXRhLmxlbmd0aCA+IDApIHsKKwkJaW50IGk7CisKKwkJLyogQ29weSBhZGRyZXNzZXMgKi8KKwkJZm9yIChpID0gMDsgaSA8IHdycXUtPmRhdGEubGVuZ3RoOyBpKyspCisJCQltZW1jcHkoc3B5ZGF0YS0+c3B5X2FkZHJlc3NbaV0sIGFkZHJlc3NbaV0uc2FfZGF0YSwKKwkJCSAgICAgICBFVEhfQUxFTik7CisJCS8qIFJlc2V0IHN0YXRzICovCisJCW1lbXNldChzcHlkYXRhLT5zcHlfc3RhdCwgMCwKKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgaXdfcXVhbGl0eSkgKiBJV19NQVhfU1BZKTsKKwl9CisKKwkvKiBNYWtlIHN1cmUgYWJvdmUgaXMgdXBkYXRlZCBiZWZvcmUgcmUtZW5hYmxpbmcgKi8KKwlzbXBfd21iKCk7CisKKwkvKiBFbmFibGUgYWRkcmVzc2VzICovCisJc3B5ZGF0YS0+c3B5X251bWJlciA9IHdycXUtPmRhdGEubGVuZ3RoOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGl3X2hhbmRsZXJfc2V0X3NweSk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBTdGFuZGFyZCBXaXJlbGVzcyBIYW5kbGVyIDogZ2V0IFNweSBMaXN0CisgKi8KK2ludCBpd19oYW5kbGVyX2dldF9zcHkoc3RydWN0IG5ldF9kZXZpY2UgKglkZXYsCisJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICoJaW5mbywKKwkJICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKgl3cnF1LAorCQkgICAgICAgY2hhciAqCQkJZXh0cmEpCit7CisJc3RydWN0IGl3X3NweV9kYXRhICoJc3B5ZGF0YSA9IGdldF9zcHlkYXRhKGRldik7CisJc3RydWN0IHNvY2thZGRyICoJYWRkcmVzcyA9IChzdHJ1Y3Qgc29ja2FkZHIgKikgZXh0cmE7CisJaW50CQkJaTsKKworCS8qIE1ha2Ugc3VyZSBkcml2ZXIgaXMgbm90IGJ1Z2d5IG9yIHVzaW5nIHRoZSBvbGQgQVBJICovCisJaWYgKCFzcHlkYXRhKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwl3cnF1LT5kYXRhLmxlbmd0aCA9IHNweWRhdGEtPnNweV9udW1iZXI7CisKKwkvKiBDb3B5IGFkZHJlc3Nlcy4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgc3B5ZGF0YS0+c3B5X251bWJlcjsgaSsrKSAJeworCQltZW1jcHkoYWRkcmVzc1tpXS5zYV9kYXRhLCBzcHlkYXRhLT5zcHlfYWRkcmVzc1tpXSwgRVRIX0FMRU4pOworCQlhZGRyZXNzW2ldLnNhX2ZhbWlseSA9IEFGX1VOSVg7CisJfQorCS8qIENvcHkgc3RhdHMgdG8gdGhlIHVzZXIgYnVmZmVyIChqdXN0IGFmdGVyKS4gKi8KKwlpZiAoc3B5ZGF0YS0+c3B5X251bWJlciA+IDApCisJCW1lbWNweShleHRyYSAgKyAoc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcikgKnNweWRhdGEtPnNweV9udW1iZXIpLAorCQkgICAgICAgc3B5ZGF0YS0+c3B5X3N0YXQsCisJCSAgICAgICBzaXplb2Yoc3RydWN0IGl3X3F1YWxpdHkpICogc3B5ZGF0YS0+c3B5X251bWJlcik7CisJLyogUmVzZXQgdXBkYXRlZCBmbGFncy4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgc3B5ZGF0YS0+c3B5X251bWJlcjsgaSsrKQorCQlzcHlkYXRhLT5zcHlfc3RhdFtpXS51cGRhdGVkICY9IH5JV19RVUFMX0FMTF9VUERBVEVEOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChpd19oYW5kbGVyX2dldF9zcHkpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogU3RhbmRhcmQgV2lyZWxlc3MgSGFuZGxlciA6IHNldCBzcHkgdGhyZXNob2xkCisgKi8KK2ludCBpd19oYW5kbGVyX3NldF90aHJzcHkoc3RydWN0IG5ldF9kZXZpY2UgKglkZXYsCisJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIHVuaW9uIGl3cmVxX2RhdGEgKgl3cnF1LAorCQkJICBjaGFyICoJCWV4dHJhKQoreworCXN0cnVjdCBpd19zcHlfZGF0YSAqCXNweWRhdGEgPSBnZXRfc3B5ZGF0YShkZXYpOworCXN0cnVjdCBpd190aHJzcHkgKgl0aHJlc2hvbGQgPSAoc3RydWN0IGl3X3RocnNweSAqKSBleHRyYTsKKworCS8qIE1ha2Ugc3VyZSBkcml2ZXIgaXMgbm90IGJ1Z2d5IG9yIHVzaW5nIHRoZSBvbGQgQVBJICovCisJaWYgKCFzcHlkYXRhKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwkvKiBKdXN0IGRvIGl0ICovCisJbWVtY3B5KCYoc3B5ZGF0YS0+c3B5X3Rocl9sb3cpLCAmKHRocmVzaG9sZC0+bG93KSwKKwkgICAgICAgMiAqIHNpemVvZihzdHJ1Y3QgaXdfcXVhbGl0eSkpOworCisJLyogQ2xlYXIgZmxhZyAqLworCW1lbXNldChzcHlkYXRhLT5zcHlfdGhyX3VuZGVyLCAnXDAnLCBzaXplb2Yoc3B5ZGF0YS0+c3B5X3Rocl91bmRlcikpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGl3X2hhbmRsZXJfc2V0X3RocnNweSk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBTdGFuZGFyZCBXaXJlbGVzcyBIYW5kbGVyIDogZ2V0IHNweSB0aHJlc2hvbGQKKyAqLworaW50IGl3X2hhbmRsZXJfZ2V0X3RocnNweShzdHJ1Y3QgbmV0X2RldmljZSAqCWRldiwKKwkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgdW5pb24gaXdyZXFfZGF0YSAqCXdycXUsCisJCQkgIGNoYXIgKgkJZXh0cmEpCit7CisJc3RydWN0IGl3X3NweV9kYXRhICoJc3B5ZGF0YSA9IGdldF9zcHlkYXRhKGRldik7CisJc3RydWN0IGl3X3RocnNweSAqCXRocmVzaG9sZCA9IChzdHJ1Y3QgaXdfdGhyc3B5ICopIGV4dHJhOworCisJLyogTWFrZSBzdXJlIGRyaXZlciBpcyBub3QgYnVnZ3kgb3IgdXNpbmcgdGhlIG9sZCBBUEkgKi8KKwlpZiAoIXNweWRhdGEpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCS8qIEp1c3QgZG8gaXQgKi8KKwltZW1jcHkoJih0aHJlc2hvbGQtPmxvdyksICYoc3B5ZGF0YS0+c3B5X3Rocl9sb3cpLAorCSAgICAgICAyICogc2l6ZW9mKHN0cnVjdCBpd19xdWFsaXR5KSk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woaXdfaGFuZGxlcl9nZXRfdGhyc3B5KTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFByZXBhcmUgYW5kIHNlbmQgYSBTcHkgVGhyZXNob2xkIGV2ZW50CisgKi8KK3N0YXRpYyB2b2lkIGl3X3NlbmRfdGhyc3B5X2V2ZW50KHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2LAorCQkJCSBzdHJ1Y3QgaXdfc3B5X2RhdGEgKglzcHlkYXRhLAorCQkJCSB1bnNpZ25lZCBjaGFyICoJYWRkcmVzcywKKwkJCQkgc3RydWN0IGl3X3F1YWxpdHkgKgl3c3RhdHMpCit7CisJdW5pb24gaXdyZXFfZGF0YQl3cnF1OworCXN0cnVjdCBpd190aHJzcHkJdGhyZXNob2xkOworCisJLyogSW5pdCAqLworCXdycXUuZGF0YS5sZW5ndGggPSAxOworCXdycXUuZGF0YS5mbGFncyA9IDA7CisJLyogQ29weSBhZGRyZXNzICovCisJbWVtY3B5KHRocmVzaG9sZC5hZGRyLnNhX2RhdGEsIGFkZHJlc3MsIEVUSF9BTEVOKTsKKwl0aHJlc2hvbGQuYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisJLyogQ29weSBzdGF0cyAqLworCW1lbWNweSgmKHRocmVzaG9sZC5xdWFsKSwgd3N0YXRzLCBzaXplb2Yoc3RydWN0IGl3X3F1YWxpdHkpKTsKKwkvKiBDb3B5IGFsc28gdGhyZXNob2xkcyAqLworCW1lbWNweSgmKHRocmVzaG9sZC5sb3cpLCAmKHNweWRhdGEtPnNweV90aHJfbG93KSwKKwkgICAgICAgMiAqIHNpemVvZihzdHJ1Y3QgaXdfcXVhbGl0eSkpOworCisJLyogU2VuZCBldmVudCB0byB1c2VyIHNwYWNlICovCisJd2lyZWxlc3Nfc2VuZF9ldmVudChkZXYsIFNJT0NHSVdUSFJTUFksICZ3cnF1LCAoY2hhciAqKSAmdGhyZXNob2xkKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqIENhbGwgZm9yIHRoZSBkcml2ZXIgdG8gdXBkYXRlIHRoZSBzcHkgZGF0YS4KKyAqIEZvciBub3csIHRoZSBzcHkgZGF0YSBpcyBhIHNpbXBsZSBhcnJheS4gQXMgdGhlIHNpemUgb2YgdGhlIGFycmF5IGlzCisgKiBzbWFsbCwgdGhpcyBpcyBnb29kIGVub3VnaC4gSWYgd2Ugd2FudGVkIHRvIHN1cHBvcnQgbGFyZ2VyIG51bWJlciBvZgorICogc3B5IGFkZHJlc3Nlcywgd2Ugc2hvdWxkIHVzZSBzb21ldGhpbmcgbW9yZSBlZmZpY2llbnQuLi4KKyAqLwordm9pZCB3aXJlbGVzc19zcHlfdXBkYXRlKHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2LAorCQkJIHVuc2lnbmVkIGNoYXIgKglhZGRyZXNzLAorCQkJIHN0cnVjdCBpd19xdWFsaXR5ICoJd3N0YXRzKQoreworCXN0cnVjdCBpd19zcHlfZGF0YSAqCXNweWRhdGEgPSBnZXRfc3B5ZGF0YShkZXYpOworCWludAkJCWk7CisJaW50CQkJbWF0Y2ggPSAtMTsKKworCS8qIE1ha2Ugc3VyZSBkcml2ZXIgaXMgbm90IGJ1Z2d5IG9yIHVzaW5nIHRoZSBvbGQgQVBJICovCisJaWYgKCFzcHlkYXRhKQorCQlyZXR1cm47CisKKwkvKiBVcGRhdGUgYWxsIHJlY29yZHMgdGhhdCBtYXRjaCAqLworCWZvciAoaSA9IDA7IGkgPCBzcHlkYXRhLT5zcHlfbnVtYmVyOyBpKyspCisJCWlmICghY29tcGFyZV9ldGhlcl9hZGRyKGFkZHJlc3MsIHNweWRhdGEtPnNweV9hZGRyZXNzW2ldKSkgeworCQkJbWVtY3B5KCYoc3B5ZGF0YS0+c3B5X3N0YXRbaV0pLCB3c3RhdHMsCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpd19xdWFsaXR5KSk7CisJCQltYXRjaCA9IGk7CisJCX0KKworCS8qIEdlbmVyYXRlIGFuIGV2ZW50IGlmIHdlIGNyb3NzIHRoZSBzcHkgdGhyZXNob2xkLgorCSAqIFRvIGF2b2lkIGV2ZW50IHN0b3Jtcywgd2UgaGF2ZSBhIHNpbXBsZSBoeXN0ZXJlc2lzIDogd2UgZ2VuZXJhdGUKKwkgKiBldmVudCBvbmx5IHdoZW4gd2UgZ28gdW5kZXIgdGhlIGxvdyB0aHJlc2hvbGQgb3IgYWJvdmUgdGhlCisJICogaGlnaCB0aHJlc2hvbGQuICovCisJaWYgKG1hdGNoID49IDApIHsKKwkJaWYgKHNweWRhdGEtPnNweV90aHJfdW5kZXJbbWF0Y2hdKSB7CisJCQlpZiAod3N0YXRzLT5sZXZlbCA+IHNweWRhdGEtPnNweV90aHJfaGlnaC5sZXZlbCkgeworCQkJCXNweWRhdGEtPnNweV90aHJfdW5kZXJbbWF0Y2hdID0gMDsKKwkJCQlpd19zZW5kX3RocnNweV9ldmVudChkZXYsIHNweWRhdGEsCisJCQkJCQkgICAgIGFkZHJlc3MsIHdzdGF0cyk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAod3N0YXRzLT5sZXZlbCA8IHNweWRhdGEtPnNweV90aHJfbG93LmxldmVsKSB7CisJCQkJc3B5ZGF0YS0+c3B5X3Rocl91bmRlclttYXRjaF0gPSAxOworCQkJCWl3X3NlbmRfdGhyc3B5X2V2ZW50KGRldiwgc3B5ZGF0YSwKKwkJCQkJCSAgICAgYWRkcmVzcywgd3N0YXRzKTsKKwkJCX0KKwkJfQorCX0KK30KK0VYUE9SVF9TWU1CT0wod2lyZWxlc3Nfc3B5X3VwZGF0ZSk7CmRpZmYgLS1naXQgYS9uZXQveDI1L2FmX3gyNS5jIGIvbmV0L3gyNS9hZl94MjUuYwppbmRleCBlNjJiYTQxLi4wZDYwMDJmYyAxMDA2NDQKLS0tIGEvbmV0L3gyNS9hZl94MjUuYworKysgYi9uZXQveDI1L2FmX3gyNS5jCkBAIC05NTEsNyArOTUxLDcgQEAKIAkgKglJbmNvbWluZyBDYWxsIFVzZXIgRGF0YS4KIAkgKi8KIAlpZiAoc2tiLT5sZW4gPj0gMCkgewotCQltZW1jcHkobWFrZXgyNS0+Y2FsbHVzZXJkYXRhLmN1ZGRhdGEsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgbWFrZXgyNS0+Y2FsbHVzZXJkYXRhLmN1ZGRhdGEsIHNrYi0+bGVuKTsKIAkJbWFrZXgyNS0+Y2FsbHVzZXJkYXRhLmN1ZGxlbmd0aCA9IHNrYi0+bGVuOwogCX0KIApAQCAtMTA1OCw5ICsxMDU4LDEwIEBACiAJICovCiAJU09DS19ERUJVRyhzaywgIngyNV9zZW5kbXNnOiBDb3B5aW5nIHVzZXIgZGF0YVxuIik7CiAKLQlhc21wdHIgPSBza2ItPmgucmF3ID0gc2tiX3B1dChza2IsIGxlbik7CisJc2tiX3Jlc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKKwlza2JfcHV0KHNrYiwgbGVuKTsKIAotCXJjID0gbWVtY3B5X2Zyb21pb3ZlYyhhc21wdHIsIG1zZy0+bXNnX2lvdiwgbGVuKTsKKwlyYyA9IG1lbWNweV9mcm9taW92ZWMoc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKSwgbXNnLT5tc2dfaW92LCBsZW4pOwogCWlmIChyYykKIAkJZ290byBvdXRfa2ZyZWVfc2tiOwogCkBAIC0xMjEwLDggKzEyMTEsNyBAQAogCQl9CiAJfQogCi0Jc2tiLT5oLnJhdyA9IHNrYi0+ZGF0YTsKLQorCXNrYl9yZXNldF90cmFuc3BvcnRfaGVhZGVyKHNrYik7CiAJY29waWVkID0gc2tiLT5sZW47CiAKIAlpZiAoY29waWVkID4gc2l6ZSkgewpAQCAtMTI4MCw2ICsxMjgwLDEyIEBACiAJCQkJcmMgPSBzb2NrX2dldF90aW1lc3RhbXAoc2ssCiAJCQkJCQkoc3RydWN0IHRpbWV2YWwgX191c2VyICopYXJncCk7CiAJCQlicmVhazsKKwkJY2FzZSBTSU9DR1NUQU1QTlM6CisJCQlyYyA9IC1FSU5WQUw7CisJCQlpZiAoc2spCisJCQkJcmMgPSBzb2NrX2dldF90aW1lc3RhbXBucyhzaywKKwkJCQkJCShzdHJ1Y3QgdGltZXNwZWMgX191c2VyICopYXJncCk7CisJCQlicmVhazsKIAkJY2FzZSBTSU9DR0lGQUREUjoKIAkJY2FzZSBTSU9DU0lGQUREUjoKIAkJY2FzZSBTSU9DR0lGRFNUQUREUjoKQEAgLTE1MjEsNiArMTUyNywxMiBAQAogCQkJcmMgPSBjb21wYXRfc29ja19nZXRfdGltZXN0YW1wKHNrLAogCQkJCQkoc3RydWN0IHRpbWV2YWwgX191c2VyKilhcmdwKTsKIAkJYnJlYWs7CisJY2FzZSBTSU9DR1NUQU1QTlM6CisJCXJjID0gLUVJTlZBTDsKKwkJaWYgKHNrKQorCQkJcmMgPSBjb21wYXRfc29ja19nZXRfdGltZXN0YW1wbnMoc2ssCisJCQkJCShzdHJ1Y3QgdGltZXNwZWMgX191c2VyKilhcmdwKTsKKwkJYnJlYWs7CiAJY2FzZSBTSU9DR0lGQUREUjoKIAljYXNlIFNJT0NTSUZBRERSOgogCWNhc2UgU0lPQ0dJRkRTVEFERFI6CmRpZmYgLS1naXQgYS9uZXQveDI1L3gyNV9kZXYuYyBiL25ldC94MjUveDI1X2Rldi5jCmluZGV4IGM3MjIxZGUuLjg0OGE2YjYgMTAwNjQ0Ci0tLSBhL25ldC94MjUveDI1X2Rldi5jCisrKyBiL25ldC94MjUveDI1X2Rldi5jCkBAIC00OCw3ICs0OCw3IEBACiAJaWYgKChzayA9IHgyNV9maW5kX3NvY2tldChsY2ksIG5iKSkgIT0gTlVMTCkgewogCQlpbnQgcXVldWVkID0gMTsKIAotCQlza2ItPmgucmF3ID0gc2tiLT5kYXRhOworCQlza2JfcmVzZXRfdHJhbnNwb3J0X2hlYWRlcihza2IpOwogCQliaF9sb2NrX3NvY2soc2spOwogCQlpZiAoIXNvY2tfb3duZWRfYnlfdXNlcihzaykpIHsKIAkJCXF1ZXVlZCA9IHgyNV9wcm9jZXNzX3J4X2ZyYW1lKHNrLCBza2IpOwpAQCAtMTkxLDcgKzE5MSw3IEBACiB7CiAJdW5zaWduZWQgY2hhciAqZHB0cjsKIAotCXNrYi0+bmgucmF3ID0gc2tiLT5kYXRhOworCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOwogCiAJc3dpdGNoIChuYi0+ZGV2LT50eXBlKSB7CiAJCWNhc2UgQVJQSFJEX1gyNToKZGlmZiAtLWdpdCBhL25ldC94MjUveDI1X2luLmMgYi9uZXQveDI1L3gyNV9pbi5jCmluZGV4IGM1MjM5ZmMuLjFjODg3NjIgMTAwNjQ0Ci0tLSBhL25ldC94MjUveDI1X2luLmMKKysrIGIvbmV0L3gyNS94MjVfaW4uYwpAQCAtNTMsMTcgKzUzLDIwIEBACiAKIAkJc2tiX3F1ZXVlX3RhaWwoJngyNS0+ZnJhZ21lbnRfcXVldWUsIHNrYik7CiAKLQkJc2tibi0+aC5yYXcgPSBza2JuLT5kYXRhOworCQlza2JfcmVzZXRfdHJhbnNwb3J0X2hlYWRlcihza2JuKTsKIAogCQlza2JvID0gc2tiX2RlcXVldWUoJngyNS0+ZnJhZ21lbnRfcXVldWUpOwotCQltZW1jcHkoc2tiX3B1dChza2JuLCBza2JvLT5sZW4pLCBza2JvLT5kYXRhLCBza2JvLT5sZW4pOworCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYm8sIHNrYl9wdXQoc2tibiwgc2tiby0+bGVuKSwKKwkJCQkJICBza2JvLT5sZW4pOwogCQlrZnJlZV9za2Ioc2tibyk7CiAKIAkJd2hpbGUgKChza2JvID0KIAkJCXNrYl9kZXF1ZXVlKCZ4MjUtPmZyYWdtZW50X3F1ZXVlKSkgIT0gTlVMTCkgewogCQkJc2tiX3B1bGwoc2tibywgKHgyNS0+bmVpZ2hib3VyLT5leHRlbmRlZCkgPwogCQkJCQlYMjVfRVhUX01JTl9MRU4gOiBYMjVfU1REX01JTl9MRU4pOwotCQkJbWVtY3B5KHNrYl9wdXQoc2tibiwgc2tiby0+bGVuKSwgc2tiby0+ZGF0YSwgc2tiby0+bGVuKTsKKwkJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tibywKKwkJCQkJCSAgc2tiX3B1dChza2JuLCBza2JvLT5sZW4pLAorCQkJCQkJICBza2JvLT5sZW4pOwogCQkJa2ZyZWVfc2tiKHNrYm8pOwogCQl9CiAKQEAgLTExMiw4ICsxMTUsOSBAQAogCQkJICoJQ29weSBhbnkgQ2FsbCBVc2VyIERhdGEuCiAJCQkgKi8KIAkJCWlmIChza2ItPmxlbiA+PSAwKSB7Ci0JCQkJbWVtY3B5KHgyNS0+Y2FsbHVzZXJkYXRhLmN1ZGRhdGEsIHNrYi0+ZGF0YSwKLQkJCQkgICAgICAgc2tiLT5sZW4pOworCQkJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLAorCQkJCQkgICAgICB4MjUtPmNhbGx1c2VyZGF0YS5jdWRkYXRhLAorCQkJCQkgICAgICBza2ItPmxlbik7CiAJCQkJeDI1LT5jYWxsdXNlcmRhdGEuY3VkbGVuZ3RoID0gc2tiLT5sZW47CiAJCQl9CiAJCQlpZiAoIXNvY2tfZmxhZyhzaywgU09DS19ERUFEKSkKZGlmZiAtLWdpdCBhL25ldC94MjUveDI1X291dC5jIGIvbmV0L3gyNS94MjVfb3V0LmMKaW5kZXggNmY1NzM3OC4uMmI5NmI1MiAxMDA2NDQKLS0tIGEvbmV0L3gyNS94MjVfb3V0LmMKKysrIGIvbmV0L3gyNS94MjVfb3V0LmMKQEAgLTYxLDcgKzYxLDcgQEAKIAogCWlmIChza2ItPmxlbiAtIGhlYWRlcl9sZW4gPiBtYXhfbGVuKSB7CiAJCS8qIFNhdmUgYSBjb3B5IG9mIHRoZSBIZWFkZXIgKi8KLQkJbWVtY3B5KGhlYWRlciwgc2tiLT5kYXRhLCBoZWFkZXJfbGVuKTsKKwkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIGhlYWRlciwgaGVhZGVyX2xlbik7CiAJCXNrYl9wdWxsKHNrYiwgaGVhZGVyX2xlbik7CiAKIAkJZnJvbnRsZW4gPSBza2JfaGVhZHJvb20oc2tiKTsKQEAgLTg0LDEyICs4NCwxMiBAQAogCQkJbGVuID0gbWF4X2xlbiA+IHNrYi0+bGVuID8gc2tiLT5sZW4gOiBtYXhfbGVuOwogCiAJCQkvKiBDb3B5IHRoZSB1c2VyIGRhdGEgKi8KLQkJCW1lbWNweShza2JfcHV0KHNrYm4sIGxlbiksIHNrYi0+ZGF0YSwgbGVuKTsKKwkJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCBza2JfcHV0KHNrYm4sIGxlbiksIGxlbik7CiAJCQlza2JfcHVsbChza2IsIGxlbik7CiAKIAkJCS8qIER1cGxpY2F0ZSB0aGUgSGVhZGVyICovCiAJCQlza2JfcHVzaChza2JuLCBoZWFkZXJfbGVuKTsKLQkJCW1lbWNweShza2JuLT5kYXRhLCBoZWFkZXIsIGhlYWRlcl9sZW4pOworCQkJc2tiX2NvcHlfdG9fbGluZWFyX2RhdGEoc2tibiwgaGVhZGVyLCBoZWFkZXJfbGVuKTsKIAogCQkJaWYgKHNrYi0+bGVuID4gMCkgewogCQkJCWlmICh4MjUtPm5laWdoYm91ci0+ZXh0ZW5kZWQpCmRpZmYgLS1naXQgYS9uZXQveGZybS94ZnJtX2FsZ28uYyBiL25ldC94ZnJtL3hmcm1fYWxnby5jCmluZGV4IGYzNzNhOGEuLjYyNDlhOTQgMTAwNjQ0Ci0tLSBhL25ldC94ZnJtL3hmcm1fYWxnby5jCisrKyBiL25ldC94ZnJtL3hmcm1fYWxnby5jCkBAIC02MTIsMTc1ICs2MTIsNiBAQAogCiAjaWYgZGVmaW5lZChDT05GSUdfSU5FVF9FU1ApIHx8IGRlZmluZWQoQ09ORklHX0lORVRfRVNQX01PRFVMRSkgfHwgZGVmaW5lZChDT05GSUdfSU5FVDZfRVNQKSB8fCBkZWZpbmVkKENPTkZJR19JTkVUNl9FU1BfTU9EVUxFKQogCi0vKiBMb29raW5nIGdlbmVyaWMgaXQgaXMgbm90IHVzZWQgaW4gYW5vdGhlciBwbGFjZXMuICovCi0KLWludAotc2tiX3RvX3NndmVjKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBvZmZzZXQsIGludCBsZW4pCi17Ci0JaW50IHN0YXJ0ID0gc2tiX2hlYWRsZW4oc2tiKTsKLQlpbnQgaSwgY29weSA9IHN0YXJ0IC0gb2Zmc2V0OwotCWludCBlbHQgPSAwOwotCi0JaWYgKGNvcHkgPiAwKSB7Ci0JCWlmIChjb3B5ID4gbGVuKQotCQkJY29weSA9IGxlbjsKLQkJc2dbZWx0XS5wYWdlID0gdmlydF90b19wYWdlKHNrYi0+ZGF0YSArIG9mZnNldCk7Ci0JCXNnW2VsdF0ub2Zmc2V0ID0gKHVuc2lnbmVkIGxvbmcpKHNrYi0+ZGF0YSArIG9mZnNldCkgJSBQQUdFX1NJWkU7Ci0JCXNnW2VsdF0ubGVuZ3RoID0gY29weTsKLQkJZWx0Kys7Ci0JCWlmICgobGVuIC09IGNvcHkpID09IDApCi0JCQlyZXR1cm4gZWx0OwotCQlvZmZzZXQgKz0gY29weTsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsgaSsrKSB7Ci0JCWludCBlbmQ7Ci0KLQkJQlVHX1RSQVAoc3RhcnQgPD0gb2Zmc2V0ICsgbGVuKTsKLQotCQllbmQgPSBzdGFydCArIHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0uc2l6ZTsKLQkJaWYgKChjb3B5ID0gZW5kIC0gb2Zmc2V0KSA+IDApIHsKLQkJCXNrYl9mcmFnX3QgKmZyYWcgPSAmc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXTsKLQotCQkJaWYgKGNvcHkgPiBsZW4pCi0JCQkJY29weSA9IGxlbjsKLQkJCXNnW2VsdF0ucGFnZSA9IGZyYWctPnBhZ2U7Ci0JCQlzZ1tlbHRdLm9mZnNldCA9IGZyYWctPnBhZ2Vfb2Zmc2V0K29mZnNldC1zdGFydDsKLQkJCXNnW2VsdF0ubGVuZ3RoID0gY29weTsKLQkJCWVsdCsrOwotCQkJaWYgKCEobGVuIC09IGNvcHkpKQotCQkJCXJldHVybiBlbHQ7Ci0JCQlvZmZzZXQgKz0gY29weTsKLQkJfQotCQlzdGFydCA9IGVuZDsKLQl9Ci0KLQlpZiAoc2tiX3NoaW5mbyhza2IpLT5mcmFnX2xpc3QpIHsKLQkJc3RydWN0IHNrX2J1ZmYgKmxpc3QgPSBza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdDsKLQotCQlmb3IgKDsgbGlzdDsgbGlzdCA9IGxpc3QtPm5leHQpIHsKLQkJCWludCBlbmQ7Ci0KLQkJCUJVR19UUkFQKHN0YXJ0IDw9IG9mZnNldCArIGxlbik7Ci0KLQkJCWVuZCA9IHN0YXJ0ICsgbGlzdC0+bGVuOwotCQkJaWYgKChjb3B5ID0gZW5kIC0gb2Zmc2V0KSA+IDApIHsKLQkJCQlpZiAoY29weSA+IGxlbikKLQkJCQkJY29weSA9IGxlbjsKLQkJCQllbHQgKz0gc2tiX3RvX3NndmVjKGxpc3QsIHNnK2VsdCwgb2Zmc2V0IC0gc3RhcnQsIGNvcHkpOwotCQkJCWlmICgobGVuIC09IGNvcHkpID09IDApCi0JCQkJCXJldHVybiBlbHQ7Ci0JCQkJb2Zmc2V0ICs9IGNvcHk7Ci0JCQl9Ci0JCQlzdGFydCA9IGVuZDsKLQkJfQotCX0KLQlCVUdfT04obGVuKTsKLQlyZXR1cm4gZWx0OwotfQotRVhQT1JUX1NZTUJPTF9HUEwoc2tiX3RvX3NndmVjKTsKLQotLyogQ2hlY2sgdGhhdCBza2IgZGF0YSBiaXRzIGFyZSB3cml0YWJsZS4gSWYgdGhleSBhcmUgbm90LCBjb3B5IGRhdGEKLSAqIHRvIG5ld2x5IGNyZWF0ZWQgcHJpdmF0ZSBhcmVhLiBJZiAidGFpbGJpdHMiIGlzIGdpdmVuLCBtYWtlIHN1cmUgdGhhdAotICogdGFpbGJpdHMgYnl0ZXMgYmV5b25kIGN1cnJlbnQgZW5kIG9mIHNrYiBhcmUgd3JpdGFibGUuCi0gKgotICogUmV0dXJucyBhbW91bnQgb2YgZWxlbWVudHMgb2Ygc2NhdHRlcmxpc3QgdG8gbG9hZCBmb3Igc3Vic2VxdWVudAotICogdHJhbnNmb3JtYXRpb25zIGFuZCBwb2ludGVyIHRvIHdyaXRhYmxlIHRyYWlsZXIgc2tiLgotICovCi0KLWludCBza2JfY293X2RhdGEoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHRhaWxiaXRzLCBzdHJ1Y3Qgc2tfYnVmZiAqKnRyYWlsZXIpCi17Ci0JaW50IGNvcHlmbGFnOwotCWludCBlbHQ7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjEsICoqc2tiX3A7Ci0KLQkvKiBJZiBza2IgaXMgY2xvbmVkIG9yIGl0cyBoZWFkIGlzIHBhZ2VkLCByZWFsbG9jYXRlCi0JICogaGVhZCBwdWxsaW5nIG91dCBhbGwgdGhlIHBhZ2VzIChwYWdlcyBhcmUgY29uc2lkZXJlZCBub3Qgd3JpdGFibGUKLQkgKiBhdCB0aGUgbW9tZW50IGV2ZW4gaWYgdGhleSBhcmUgYW5vbnltb3VzKS4KLQkgKi8KLQlpZiAoKHNrYl9jbG9uZWQoc2tiKSB8fCBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzKSAmJgotCSAgICBfX3Bza2JfcHVsbF90YWlsKHNrYiwgc2tiX3BhZ2VsZW4oc2tiKS1za2JfaGVhZGxlbihza2IpKSA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCS8qIEVhc3kgY2FzZS4gTW9zdCBvZiBwYWNrZXRzIHdpbGwgZ28gdGhpcyB3YXkuICovCi0JaWYgKCFza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdCkgewotCQkvKiBBIGxpdHRsZSBvZiB0cm91YmxlLCBub3QgZW5vdWdoIG9mIHNwYWNlIGZvciB0cmFpbGVyLgotCQkgKiBUaGlzIHNob3VsZCBub3QgaGFwcGVuLCB3aGVuIHN0YWNrIGlzIHR1bmVkIHRvIGdlbmVyYXRlCi0JCSAqIGdvb2QgZnJhbWVzLiBPSywgb24gbWlzcyB3ZSByZWFsbG9jYXRlIGFuZCByZXNlcnZlIGV2ZW4gbW9yZQotCQkgKiBzcGFjZSwgMTI4IGJ5dGVzIGlzIGZhaXIuICovCi0KLQkJaWYgKHNrYl90YWlscm9vbShza2IpIDwgdGFpbGJpdHMgJiYKLQkJICAgIHBza2JfZXhwYW5kX2hlYWQoc2tiLCAwLCB0YWlsYml0cy1za2JfdGFpbHJvb20oc2tiKSsxMjgsIEdGUF9BVE9NSUMpKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0KLQkJLyogVm9pbGEhICovCi0JCSp0cmFpbGVyID0gc2tiOwotCQlyZXR1cm4gMTsKLQl9Ci0KLQkvKiBNaXNlcnkuIFdlIGFyZSBpbiB0cm91YmxlcywgZ29pbmcgdG8gbWluY2VyIGZyYWdtZW50cy4uLiAqLwotCi0JZWx0ID0gMTsKLQlza2JfcCA9ICZza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdDsKLQljb3B5ZmxhZyA9IDA7Ci0KLQl3aGlsZSAoKHNrYjEgPSAqc2tiX3ApICE9IE5VTEwpIHsKLQkJaW50IG50YWlsID0gMDsKLQotCQkvKiBUaGUgZnJhZ21lbnQgaXMgcGFydGlhbGx5IHB1bGxlZCBieSBzb21lb25lLAotCQkgKiB0aGlzIGNhbiBoYXBwZW4gb24gaW5wdXQuIENvcHkgaXQgYW5kIGV2ZXJ5dGhpbmcKLQkJICogYWZ0ZXIgaXQuICovCi0KLQkJaWYgKHNrYl9zaGFyZWQoc2tiMSkpCi0JCQljb3B5ZmxhZyA9IDE7Ci0KLQkJLyogSWYgdGhlIHNrYiBpcyB0aGUgbGFzdCwgd29ycnkgYWJvdXQgdHJhaWxlci4gKi8KLQotCQlpZiAoc2tiMS0+bmV4dCA9PSBOVUxMICYmIHRhaWxiaXRzKSB7Ci0JCQlpZiAoc2tiX3NoaW5mbyhza2IxKS0+bnJfZnJhZ3MgfHwKLQkJCSAgICBza2Jfc2hpbmZvKHNrYjEpLT5mcmFnX2xpc3QgfHwKLQkJCSAgICBza2JfdGFpbHJvb20oc2tiMSkgPCB0YWlsYml0cykKLQkJCQludGFpbCA9IHRhaWxiaXRzICsgMTI4OwotCQl9Ci0KLQkJaWYgKGNvcHlmbGFnIHx8Ci0JCSAgICBza2JfY2xvbmVkKHNrYjEpIHx8Ci0JCSAgICBudGFpbCB8fAotCQkgICAgc2tiX3NoaW5mbyhza2IxKS0+bnJfZnJhZ3MgfHwKLQkJICAgIHNrYl9zaGluZm8oc2tiMSktPmZyYWdfbGlzdCkgewotCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjI7Ci0KLQkJCS8qIEZ1Y2ssIHdlIGFyZSBtaXNlcmFibGUgcG9vciBndXlzLi4uICovCi0JCQlpZiAobnRhaWwgPT0gMCkKLQkJCQlza2IyID0gc2tiX2NvcHkoc2tiMSwgR0ZQX0FUT01JQyk7Ci0JCQllbHNlCi0JCQkJc2tiMiA9IHNrYl9jb3B5X2V4cGFuZChza2IxLAotCQkJCQkJICAgICAgIHNrYl9oZWFkcm9vbShza2IxKSwKLQkJCQkJCSAgICAgICBudGFpbCwKLQkJCQkJCSAgICAgICBHRlBfQVRPTUlDKTsKLQkJCWlmICh1bmxpa2VseShza2IyID09IE5VTEwpKQotCQkJCXJldHVybiAtRU5PTUVNOwotCi0JCQlpZiAoc2tiMS0+c2spCi0JCQkJc2tiX3NldF9vd25lcl93KHNrYjIsIHNrYjEtPnNrKTsKLQotCQkJLyogTG9va2luZyBhcm91bmQuIEFyZSB3ZSBzdGlsbCBhbGl2ZT8KLQkJCSAqIE9LLCBsaW5rIG5ldyBza2IsIGRyb3Agb2xkIG9uZSAqLwotCi0JCQlza2IyLT5uZXh0ID0gc2tiMS0+bmV4dDsKLQkJCSpza2JfcCA9IHNrYjI7Ci0JCQlrZnJlZV9za2Ioc2tiMSk7Ci0JCQlza2IxID0gc2tiMjsKLQkJfQotCQllbHQrKzsKLQkJKnRyYWlsZXIgPSBza2IxOwotCQlza2JfcCA9ICZza2IxLT5uZXh0OwotCX0KLQotCXJldHVybiBlbHQ7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChza2JfY293X2RhdGEpOwotCiB2b2lkICpwc2tiX3B1dChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgc2tfYnVmZiAqdGFpbCwgaW50IGxlbikKIHsKIAlpZiAodGFpbCAhPSBza2IpIHsKZGlmZiAtLWdpdCBhL25ldC94ZnJtL3hmcm1faW5wdXQuYyBiL25ldC94ZnJtL3hmcm1faW5wdXQuYwppbmRleCBlZTE1YmRhLi41YzQ2OTU4IDEwMDY0NAotLS0gYS9uZXQveGZybS94ZnJtX2lucHV0LmMKKysrIGIvbmV0L3hmcm0veGZybV9pbnB1dC5jCkBAIC02Miw3ICs2Miw3IEBACiAJY2FzZSBJUFBST1RPX0NPTVA6CiAJCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgaXBfY29tcF9oZHIpKSkKIAkJCXJldHVybiAtRUlOVkFMOwotCQkqc3BpID0gaHRvbmwobnRvaHMoKihfX2JlMTYqKShza2ItPmgucmF3ICsgMikpKTsKKwkJKnNwaSA9IGh0b25sKG50b2hzKCooX19iZTE2Kikoc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKSArIDIpKSk7CiAJCSpzZXEgPSAwOwogCQlyZXR1cm4gMDsKIAlkZWZhdWx0OgpAQCAtNzIsOCArNzIsOCBAQAogCWlmICghcHNrYl9tYXlfcHVsbChza2IsIDE2KSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQkqc3BpID0gKihfX2JlMzIqKShza2ItPmgucmF3ICsgb2Zmc2V0KTsKLQkqc2VxID0gKihfX2JlMzIqKShza2ItPmgucmF3ICsgb2Zmc2V0X3NlcSk7CisJKnNwaSA9ICooX19iZTMyKikoc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKSArIG9mZnNldCk7CisJKnNlcSA9ICooX19iZTMyKikoc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKSArIG9mZnNldF9zZXEpOwogCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTCh4ZnJtX3BhcnNlX3NwaSk7CmRpZmYgLS1naXQgYS9uZXQveGZybS94ZnJtX3BvbGljeS5jIGIvbmV0L3hmcm0veGZybV9wb2xpY3kuYwppbmRleCA3ODVjM2UzLi4yNjNlMzRlIDEwMDY0NAotLS0gYS9uZXQveGZybS94ZnJtX3BvbGljeS5jCisrKyBiL25ldC94ZnJtL3hmcm1fcG9saWN5LmMKQEAgLTI2OCw3ICsyNjgsNyBAQAogc3RhdGljIHZvaWQgeGZybV9wb2xpY3lfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQogewogCXN0cnVjdCB4ZnJtX3BvbGljeSAqeHAgPSAoc3RydWN0IHhmcm1fcG9saWN5KilkYXRhOwotCXVuc2lnbmVkIGxvbmcgbm93ID0gKHVuc2lnbmVkIGxvbmcpeHRpbWUudHZfc2VjOworCXVuc2lnbmVkIGxvbmcgbm93ID0gZ2V0X3NlY29uZHMoKTsKIAlsb25nIG5leHQgPSBMT05HX01BWDsKIAlpbnQgd2FybiA9IDA7CiAJaW50IGRpcjsKQEAgLTU3OSw4ICs1NzksMjIgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIERFRklORV9NVVRFWChoYXNoX3Jlc2l6ZV9tdXRleCk7Cit2b2lkIHhmcm1fc3BkX2dldGluZm8oc3RydWN0IHhmcm1fc3BkaW5mbyAqc2kpCit7CisJcmVhZF9sb2NrX2JoKCZ4ZnJtX3BvbGljeV9sb2NrKTsKKwlzaS0+aW5jbnQgPSB4ZnJtX3BvbGljeV9jb3VudFtYRlJNX1BPTElDWV9JTl07CisJc2ktPm91dGNudCA9IHhmcm1fcG9saWN5X2NvdW50W1hGUk1fUE9MSUNZX09VVF07CisJc2ktPmZ3ZGNudCA9IHhmcm1fcG9saWN5X2NvdW50W1hGUk1fUE9MSUNZX0ZXRF07CisJc2ktPmluc2NudCA9IHhmcm1fcG9saWN5X2NvdW50W1hGUk1fUE9MSUNZX0lOK1hGUk1fUE9MSUNZX01BWF07CisJc2ktPm91dHNjbnQgPSB4ZnJtX3BvbGljeV9jb3VudFtYRlJNX1BPTElDWV9PVVQrWEZSTV9QT0xJQ1lfTUFYXTsKKwlzaS0+Zndkc2NudCA9IHhmcm1fcG9saWN5X2NvdW50W1hGUk1fUE9MSUNZX0ZXRCtYRlJNX1BPTElDWV9NQVhdOworCXNpLT5zcGRoY250ID0geGZybV9pZHhfaG1hc2s7CisJc2ktPnNwZGhtY250ID0geGZybV9wb2xpY3lfaGFzaG1heDsKKwlyZWFkX3VubG9ja19iaCgmeGZybV9wb2xpY3lfbG9jayk7Cit9CitFWFBPUlRfU1lNQk9MKHhmcm1fc3BkX2dldGluZm8pOwogCitzdGF0aWMgREVGSU5FX01VVEVYKGhhc2hfcmVzaXplX211dGV4KTsKIHN0YXRpYyB2b2lkIHhmcm1faGFzaF9yZXNpemUoc3RydWN0IHdvcmtfc3RydWN0ICpfX3VudXNlZCkKIHsKIAlpbnQgZGlyLCB0b3RhbDsKQEAgLTY5MCw3ICs3MDQsNyBAQAogCX0KIAlwb2xpY3ktPmluZGV4ID0gZGVscG9sID8gZGVscG9sLT5pbmRleCA6IHhmcm1fZ2VuX2luZGV4KHBvbGljeS0+dHlwZSwgZGlyKTsKIAlobGlzdF9hZGRfaGVhZCgmcG9saWN5LT5ieWlkeCwgeGZybV9wb2xpY3lfYnlpZHgraWR4X2hhc2gocG9saWN5LT5pbmRleCkpOwotCXBvbGljeS0+Y3VybGZ0LmFkZF90aW1lID0gKHVuc2lnbmVkIGxvbmcpeHRpbWUudHZfc2VjOworCXBvbGljeS0+Y3VybGZ0LmFkZF90aW1lID0gZ2V0X3NlY29uZHMoKTsKIAlwb2xpY3ktPmN1cmxmdC51c2VfdGltZSA9IDA7CiAJaWYgKCFtb2RfdGltZXIoJnBvbGljeS0+dGltZXIsIGppZmZpZXMgKyBIWikpCiAJCXhmcm1fcG9sX2hvbGQocG9saWN5KTsKQEAgLTEwNDksNyArMTA2Myw3IEBACiAJCXJldHVybiBGTE9XX0RJUl9PVVQ7CiAJY2FzZSBYRlJNX1BPTElDWV9GV0Q6CiAJCXJldHVybiBGTE9XX0RJUl9GV0Q7Ci0JfTsKKwl9CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgeGZybV9wb2xpY3kgKnhmcm1fc2tfcG9saWN5X2xvb2t1cChzdHJ1Y3Qgc29jayAqc2ssIGludCBkaXIsIHN0cnVjdCBmbG93aSAqZmwpCkBAIC0xMTMzLDcgKzExNDcsNyBAQAogCW9sZF9wb2wgPSBzay0+c2tfcG9saWN5W2Rpcl07CiAJc2stPnNrX3BvbGljeVtkaXJdID0gcG9sOwogCWlmIChwb2wpIHsKLQkJcG9sLT5jdXJsZnQuYWRkX3RpbWUgPSAodW5zaWduZWQgbG9uZyl4dGltZS50dl9zZWM7CisJCXBvbC0+Y3VybGZ0LmFkZF90aW1lID0gZ2V0X3NlY29uZHMoKTsKIAkJcG9sLT5pbmRleCA9IHhmcm1fZ2VuX2luZGV4KHBvbC0+dHlwZSwgWEZSTV9QT0xJQ1lfTUFYK2Rpcik7CiAJCV9feGZybV9wb2xpY3lfbGluayhwb2wsIFhGUk1fUE9MSUNZX01BWCtkaXIpOwogCX0KQEAgLTEzMzAsNiArMTM0NCw0MCBAQAogCXJldHVybiBlcnI7CiB9CiAKK3N0YXRpYyBpbnQgaW5saW5lCit4ZnJtX2RzdF9hbGxvY19jb3B5KHZvaWQgKip0YXJnZXQsIHZvaWQgKnNyYywgaW50IHNpemUpCit7CisJaWYgKCEqdGFyZ2V0KSB7CisJCSp0YXJnZXQgPSBrbWFsbG9jKHNpemUsIEdGUF9BVE9NSUMpOworCQlpZiAoISp0YXJnZXQpCisJCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtY3B5KCp0YXJnZXQsIHNyYywgc2l6ZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW5saW5lCit4ZnJtX2RzdF91cGRhdGVfcGFyZW50KHN0cnVjdCBkc3RfZW50cnkgKmRzdCwgc3RydWN0IHhmcm1fc2VsZWN0b3IgKnNlbCkKK3sKKyNpZmRlZiBDT05GSUdfWEZSTV9TVUJfUE9MSUNZCisJc3RydWN0IHhmcm1fZHN0ICp4ZHN0ID0gKHN0cnVjdCB4ZnJtX2RzdCAqKWRzdDsKKwlyZXR1cm4geGZybV9kc3RfYWxsb2NfY29weSgodm9pZCAqKikmKHhkc3QtPnBhcnRuZXIpLAorCQkJCSAgIHNlbCwgc2l6ZW9mKCpzZWwpKTsKKyNlbHNlCisJcmV0dXJuIDA7CisjZW5kaWYKK30KKworc3RhdGljIGludCBpbmxpbmUKK3hmcm1fZHN0X3VwZGF0ZV9vcmlnaW4oc3RydWN0IGRzdF9lbnRyeSAqZHN0LCBzdHJ1Y3QgZmxvd2kgKmZsKQoreworI2lmZGVmIENPTkZJR19YRlJNX1NVQl9QT0xJQ1kKKwlzdHJ1Y3QgeGZybV9kc3QgKnhkc3QgPSAoc3RydWN0IHhmcm1fZHN0ICopZHN0OworCXJldHVybiB4ZnJtX2RzdF9hbGxvY19jb3B5KCh2b2lkICoqKSYoeGRzdC0+b3JpZ2luKSwgZmwsIHNpemVvZigqZmwpKTsKKyNlbHNlCisJcmV0dXJuIDA7CisjZW5kaWYKK30KIAogc3RhdGljIGludCBzdGFsZV9idW5kbGUoc3RydWN0IGRzdF9lbnRyeSAqZHN0KTsKIApAQCAtMTM4Niw3ICsxNDM0LDcgQEAKIAkJcmV0dXJuIDA7CiAKIAlmYW1pbHkgPSBkc3Rfb3JpZy0+b3BzLT5mYW1pbHk7Ci0JcG9saWN5LT5jdXJsZnQudXNlX3RpbWUgPSAodW5zaWduZWQgbG9uZyl4dGltZS50dl9zZWM7CisJcG9saWN5LT5jdXJsZnQudXNlX3RpbWUgPSBnZXRfc2Vjb25kcygpOwogCXBvbHNbMF0gPSBwb2xpY3k7CiAJbnBvbHMgKys7CiAJeGZybV9uciArPSBwb2xzWzBdLT54ZnJtX25yOwpAQCAtMTUxOCw2ICsxNTY2LDE4IEBACiAJCQllcnIgPSAtRUhPU1RVTlJFQUNIOwogCQkJZ290byBlcnJvcjsKIAkJfQorCisJCWlmIChucG9scyA+IDEpCisJCQllcnIgPSB4ZnJtX2RzdF91cGRhdGVfcGFyZW50KGRzdCwgJnBvbHNbMV0tPnNlbGVjdG9yKTsKKwkJZWxzZQorCQkJZXJyID0geGZybV9kc3RfdXBkYXRlX29yaWdpbihkc3QsIGZsKTsKKwkJaWYgKHVubGlrZWx5KGVycikpIHsKKwkJCXdyaXRlX3VubG9ja19iaCgmcG9saWN5LT5sb2NrKTsKKwkJCWlmIChkc3QpCisJCQkJZHN0X2ZyZWUoZHN0KTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwogCQlkc3QtPm5leHQgPSBwb2xpY3ktPmJ1bmRsZXM7CiAJCXBvbGljeS0+YnVuZGxlcyA9IGRzdDsKIAkJZHN0X2hvbGQoZHN0KTsKQEAgLTE2ODIsNyArMTc0Miw3IEBACiAJCXJldHVybiAxOwogCX0KIAotCXBvbC0+Y3VybGZ0LnVzZV90aW1lID0gKHVuc2lnbmVkIGxvbmcpeHRpbWUudHZfc2VjOworCXBvbC0+Y3VybGZ0LnVzZV90aW1lID0gZ2V0X3NlY29uZHMoKTsKIAogCXBvbHNbMF0gPSBwb2w7CiAJbnBvbHMgKys7CkBAIC0xNjk0LDcgKzE3NTQsNyBAQAogCQlpZiAocG9sc1sxXSkgewogCQkJaWYgKElTX0VSUihwb2xzWzFdKSkKIAkJCQlyZXR1cm4gMDsKLQkJCXBvbHNbMV0tPmN1cmxmdC51c2VfdGltZSA9ICh1bnNpZ25lZCBsb25nKXh0aW1lLnR2X3NlYzsKKwkJCXBvbHNbMV0tPmN1cmxmdC51c2VfdGltZSA9IGdldF9zZWNvbmRzKCk7CiAJCQlucG9scyArKzsKIAkJfQogCX0KQEAgLTE5MzMsNiArMTk5MywxNSBAQAogCWlmICghZHN0X2NoZWNrKGRzdC0+cGF0aCwgKChzdHJ1Y3QgeGZybV9kc3QgKilkc3QpLT5wYXRoX2Nvb2tpZSkgfHwKIAkgICAgKGRzdC0+ZGV2ICYmICFuZXRpZl9ydW5uaW5nKGRzdC0+ZGV2KSkpCiAJCXJldHVybiAwOworI2lmZGVmIENPTkZJR19YRlJNX1NVQl9QT0xJQ1kKKwlpZiAoZmwpIHsKKwkJaWYgKGZpcnN0LT5vcmlnaW4gJiYgIWZsb3dfY2FjaGVfdWxpX21hdGNoKGZpcnN0LT5vcmlnaW4sIGZsKSkKKwkJCXJldHVybiAwOworCQlpZiAoZmlyc3QtPnBhcnRuZXIgJiYKKwkJICAgICF4ZnJtX3NlbGVjdG9yX21hdGNoKGZpcnN0LT5wYXJ0bmVyLCBmbCwgZmFtaWx5KSkKKwkJCXJldHVybiAwOworCX0KKyNlbmRpZgogCiAJbGFzdCA9IE5VTEw7CiAKZGlmZiAtLWdpdCBhL25ldC94ZnJtL3hmcm1fc3RhdGUuYyBiL25ldC94ZnJtL3hmcm1fc3RhdGUuYwppbmRleCBlM2EwYmNmYS4uZjNhNjFlYiAxMDA2NDQKLS0tIGEvbmV0L3hmcm0veGZybV9zdGF0ZS5jCisrKyBiL25ldC94ZnJtL3hmcm1fc3RhdGUuYwpAQCAtMjMzLDcgKzIzMyw3IEBACiBzdGF0aWMgdm9pZCB4ZnJtX3RpbWVyX2hhbmRsZXIodW5zaWduZWQgbG9uZyBkYXRhKQogewogCXN0cnVjdCB4ZnJtX3N0YXRlICp4ID0gKHN0cnVjdCB4ZnJtX3N0YXRlKilkYXRhOwotCXVuc2lnbmVkIGxvbmcgbm93ID0gKHVuc2lnbmVkIGxvbmcpeHRpbWUudHZfc2VjOworCXVuc2lnbmVkIGxvbmcgbm93ID0gZ2V0X3NlY29uZHMoKTsKIAlsb25nIG5leHQgPSBMT05HX01BWDsKIAlpbnQgd2FybiA9IDA7CiAJaW50IGVyciA9IDA7CkBAIC0zMjYsNyArMzI2LDcgQEAKIAkJaW5pdF90aW1lcigmeC0+cnRpbWVyKTsKIAkJeC0+cnRpbWVyLmZ1bmN0aW9uID0geGZybV9yZXBsYXlfdGltZXJfaGFuZGxlcjsKIAkJeC0+cnRpbWVyLmRhdGEgICAgID0gKHVuc2lnbmVkIGxvbmcpeDsKLQkJeC0+Y3VybGZ0LmFkZF90aW1lID0gKHVuc2lnbmVkIGxvbmcpeHRpbWUudHZfc2VjOworCQl4LT5jdXJsZnQuYWRkX3RpbWUgPSBnZXRfc2Vjb25kcygpOwogCQl4LT5sZnQuc29mdF9ieXRlX2xpbWl0ID0gWEZSTV9JTkY7CiAJCXgtPmxmdC5zb2Z0X3BhY2tldF9saW1pdCA9IFhGUk1fSU5GOwogCQl4LT5sZnQuaGFyZF9ieXRlX2xpbWl0ID0gWEZSTV9JTkY7CkBAIC00MjEsNiArNDIxLDE2IEBACiB9CiBFWFBPUlRfU1lNQk9MKHhmcm1fc3RhdGVfZmx1c2gpOwogCit2b2lkIHhmcm1fc2FkX2dldGluZm8oc3RydWN0IHhmcm1fc2FkaW5mbyAqc2kpCit7CisJc3Bpbl9sb2NrX2JoKCZ4ZnJtX3N0YXRlX2xvY2spOworCXNpLT5zYWRjbnQgPSB4ZnJtX3N0YXRlX251bTsKKwlzaS0+c2FkaGNudCA9IHhmcm1fc3RhdGVfaG1hc2s7CisJc2ktPnNhZGhtY250ID0geGZybV9zdGF0ZV9oYXNobWF4OworCXNwaW5fdW5sb2NrX2JoKCZ4ZnJtX3N0YXRlX2xvY2spOworfQorRVhQT1JUX1NZTUJPTCh4ZnJtX3NhZF9nZXRpbmZvKTsKKwogc3RhdGljIGludAogeGZybV9pbml0X3RlbXBzZWwoc3RydWN0IHhmcm1fc3RhdGUgKngsIHN0cnVjdCBmbG93aSAqZmwsCiAJCSAgc3RydWN0IHhmcm1fdG1wbCAqdG1wbCwKQEAgLTQ1OCw3ICs0NjgsNyBAQAogCQkJCQkgICAgIHgtPmlkLmRhZGRyLmE2KSkKIAkJCQljb250aW51ZTsKIAkJCWJyZWFrOwotCQl9OworCQl9CiAKIAkJeGZybV9zdGF0ZV9ob2xkKHgpOwogCQlyZXR1cm4geDsKQEAgLTQ5Myw3ICs1MDMsNyBAQAogCQkJCQkgICAgIHgtPnByb3BzLnNhZGRyLmE2KSkKIAkJCQljb250aW51ZTsKIAkJCWJyZWFrOwotCQl9OworCQl9CiAKIAkJeGZybV9zdGF0ZV9ob2xkKHgpOwogCQlyZXR1cm4geDsKQEAgLTcyMiw3ICs3MzIsNyBAQAogCQkJCQkgICAgIChzdHJ1Y3QgaW42X2FkZHIgKilzYWRkcikpCiAJCQkJY29udGludWU7CiAJCQlicmVhazsKLQkJfTsKKwkJfQogCiAJCXhmcm1fc3RhdGVfaG9sZCh4KTsKIAkJcmV0dXJuIHg7CkBAIC03NTUsNyArNzY1LDcgQEAKIAkJCWlwdjZfYWRkcl9jb3B5KChzdHJ1Y3QgaW42X2FkZHIgKil4LT5pZC5kYWRkci5hNiwKIAkJCQkgICAgICAgKHN0cnVjdCBpbjZfYWRkciAqKWRhZGRyKTsKIAkJCWJyZWFrOwotCQl9OworCQl9CiAKIAkJeC0+a20uc3RhdGUgPSBYRlJNX1NUQVRFX0FDUTsKIAkJeC0+aWQucHJvdG8gPSBwcm90bzsKQEAgLTEwNTEsNyArMTA2MSw3IEBACiBpbnQgeGZybV9zdGF0ZV9jaGVja19leHBpcmUoc3RydWN0IHhmcm1fc3RhdGUgKngpCiB7CiAJaWYgKCF4LT5jdXJsZnQudXNlX3RpbWUpCi0JCXgtPmN1cmxmdC51c2VfdGltZSA9ICh1bnNpZ25lZCBsb25nKXh0aW1lLnR2X3NlYzsKKwkJeC0+Y3VybGZ0LnVzZV90aW1lID0gZ2V0X3NlY29uZHMoKTsKIAogCWlmICh4LT5rbS5zdGF0ZSAhPSBYRlJNX1NUQVRFX1ZBTElEKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTE2NjcsMzcgKzE2NzcsMTcgQEAKIH0KIEVYUE9SVF9TWU1CT0woeGZybV9zdGF0ZV9kZWxldGVfdHVubmVsKTsKIAotLyoKLSAqIFRoaXMgZnVuY3Rpb24gaXMgTk9UIG9wdGltYWwuICBGb3IgZXhhbXBsZSwgd2l0aCBFU1AgaXQgd2lsbCBnaXZlIGFuCi0gKiBNVFUgdGhhdCdzIHVzdWFsbHkgdHdvIGJ5dGVzIHNob3J0IG9mIGJlaW5nIG9wdGltYWwuICBIb3dldmVyLCBpdCB3aWxsCi0gKiB1c3VhbGx5IGdpdmUgYW4gYW5zd2VyIHRoYXQncyBhIG11bHRpcGxlIG9mIDQgcHJvdmlkZWQgdGhlIGlucHV0IGlzCi0gKiBhbHNvIGEgbXVsdGlwbGUgb2YgNC4KLSAqLwogaW50IHhmcm1fc3RhdGVfbXR1KHN0cnVjdCB4ZnJtX3N0YXRlICp4LCBpbnQgbXR1KQogewotCWludCByZXMgPSBtdHU7CisJaW50IHJlczsKIAotCXJlcyAtPSB4LT5wcm9wcy5oZWFkZXJfbGVuOwotCi0JZm9yICg7OykgewotCQlpbnQgbSA9IHJlczsKLQotCQlpZiAobSA8IDY4KQotCQkJcmV0dXJuIDY4OwotCi0JCXNwaW5fbG9ja19iaCgmeC0+bG9jayk7Ci0JCWlmICh4LT5rbS5zdGF0ZSA9PSBYRlJNX1NUQVRFX1ZBTElEICYmCi0JCSAgICB4LT50eXBlICYmIHgtPnR5cGUtPmdldF9tYXhfc2l6ZSkKLQkJCW0gPSB4LT50eXBlLT5nZXRfbWF4X3NpemUoeCwgbSk7Ci0JCWVsc2UKLQkJCW0gKz0geC0+cHJvcHMuaGVhZGVyX2xlbjsKLQkJc3Bpbl91bmxvY2tfYmgoJngtPmxvY2spOwotCi0JCWlmIChtIDw9IG10dSkKLQkJCWJyZWFrOwotCQlyZXMgLT0gKG0gLSBtdHUpOwotCX0KLQorCXNwaW5fbG9ja19iaCgmeC0+bG9jayk7CisJaWYgKHgtPmttLnN0YXRlID09IFhGUk1fU1RBVEVfVkFMSUQgJiYKKwkgICAgeC0+dHlwZSAmJiB4LT50eXBlLT5nZXRfbXR1KQorCQlyZXMgPSB4LT50eXBlLT5nZXRfbXR1KHgsIG10dSk7CisJZWxzZQorCQlyZXMgPSBtdHU7CisJc3Bpbl91bmxvY2tfYmgoJngtPmxvY2spOwogCXJldHVybiByZXM7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC94ZnJtL3hmcm1fdXNlci5jIGIvbmV0L3hmcm0veGZybV91c2VyLmMKaW5kZXggODE2ZTM2OS4uNDIxMGQ5MSAxMDA2NDQKLS0tIGEvbmV0L3hmcm0veGZybV91c2VyLmMKKysrIGIvbmV0L3hmcm0veGZybV91c2VyLmMKQEAgLTcxLDcgKzcxLDcgQEAKIAogCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwotCX07CisJfQogCiAJYWxncC0+YWxnX25hbWVbQ1JZUFRPX01BWF9BTEdfTkFNRSAtIDFdID0gJ1wwJzsKIAlyZXR1cm4gMDsKQEAgLTE1Miw3ICsxNTIsNyBAQAogCiAJZGVmYXVsdDoKIAkJZ290byBvdXQ7Ci0JfTsKKwl9CiAKIAllcnIgPSAtRUlOVkFMOwogCXN3aXRjaCAocC0+aWQucHJvdG8pIHsKQEAgLTE5Miw3ICsxOTIsNyBAQAogCiAJZGVmYXVsdDoKIAkJZ290byBvdXQ7Ci0JfTsKKwl9CiAKIAlpZiAoKGVyciA9IHZlcmlmeV9vbmVfYWxnKHhmcm1hLCBYRlJNQV9BTEdfQVVUSCkpKQogCQlnb3RvIG91dDsKQEAgLTIxNyw3ICsyMTcsNyBAQAogCiAJZGVmYXVsdDoKIAkJZ290byBvdXQ7Ci0JfTsKKwl9CiAKIAllcnIgPSAwOwogCkBAIC01NzYsNyArNTc2LDcgQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gc3AtPm91dF9za2I7CiAJc3RydWN0IHhmcm1fdXNlcnNhX2luZm8gKnA7CiAJc3RydWN0IG5sbXNnaGRyICpubGg7Ci0JdW5zaWduZWQgY2hhciAqYiA9IHNrYi0+dGFpbDsKKwl1bnNpZ25lZCBjaGFyICpiID0gc2tiX3RhaWxfcG9pbnRlcihza2IpOwogCiAJaWYgKHNwLT50aGlzX2lkeCA8IHNwLT5zdGFydF9pZHgpCiAJCWdvdG8gb3V0OwpAQCAtNjIxLDE0ICs2MjEsMTQgQEAKIAlpZiAoeC0+bGFzdHVzZWQpCiAJCVJUQV9QVVQoc2tiLCBYRlJNQV9MQVNUVVNFRCwgc2l6ZW9mKHgtPmxhc3R1c2VkKSwgJngtPmxhc3R1c2VkKTsKIAotCW5saC0+bmxtc2dfbGVuID0gc2tiLT50YWlsIC0gYjsKKwlubGgtPm5sbXNnX2xlbiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKSAtIGI7CiBvdXQ6CiAJc3AtPnRoaXNfaWR4Kys7CiAJcmV0dXJuIDA7CiAKIG5sbXNnX2ZhaWx1cmU6CiBydGF0dHJfZmFpbHVyZToKLQlza2JfdHJpbShza2IsIGIgLSBza2ItPmRhdGEpOworCW5sbXNnX3RyaW0oc2tiLCBiKTsKIAlyZXR1cm4gLTE7CiB9CiAKQEAgLTY3Miw2ICs2NzIsMTM2IEBACiAJcmV0dXJuIHNrYjsKIH0KIAorc3RhdGljIGludCBidWlsZF9zcGRpbmZvKHN0cnVjdCBza19idWZmICpza2IsIHUzMiBwaWQsIHUzMiBzZXEsIHUzMiBmbGFncykKK3sKKwlzdHJ1Y3QgeGZybV9zcGRpbmZvIHNpOworCXN0cnVjdCBubG1zZ2hkciAqbmxoOworCXUzMiAqZjsKKworCW5saCA9IG5sbXNnX3B1dChza2IsIHBpZCwgc2VxLCBYRlJNX01TR19ORVdTUERJTkZPLCBzaXplb2YodTMyKSwgMCk7CisJaWYgKG5saCA9PSBOVUxMKSAvKiBzaG91bGRudCByZWFsbHkgaGFwcGVuIC4uLiAqLworCQlyZXR1cm4gLUVNU0dTSVpFOworCisJZiA9IG5sbXNnX2RhdGEobmxoKTsKKwkqZiA9IGZsYWdzOworCXhmcm1fc3BkX2dldGluZm8oJnNpKTsKKworCWlmIChmbGFncyAmIFhGUk1fU1BEX0hNQVNLKQorCQlOTEFfUFVUX1UzMihza2IsIFhGUk1BX1NQREhNQVNLLCBzaS5zcGRoY250KTsKKwlpZiAoZmxhZ3MgJiBYRlJNX1NQRF9ITUFYKQorCQlOTEFfUFVUX1UzMihza2IsIFhGUk1BX1NQREhNQVgsIHNpLnNwZGhtY250KTsKKwlpZiAoZmxhZ3MgJiBYRlJNX1NQRF9JQ05UKQorCQlOTEFfUFVUX1UzMihza2IsIFhGUk1BX1NQRElDTlQsIHNpLmluY250KTsKKwlpZiAoZmxhZ3MgJiBYRlJNX1NQRF9PQ05UKQorCQlOTEFfUFVUX1UzMihza2IsIFhGUk1BX1NQRE9DTlQsIHNpLm91dGNudCk7CisJaWYgKGZsYWdzICYgWEZSTV9TUERfRkNOVCkKKwkJTkxBX1BVVF9VMzIoc2tiLCBYRlJNQV9TUERGQ05ULCBzaS5md2RjbnQpOworCWlmIChmbGFncyAmIFhGUk1fU1BEX0lTQ05UKQorCQlOTEFfUFVUX1UzMihza2IsIFhGUk1BX1NQRElTQ05ULCBzaS5pbnNjbnQpOworCWlmIChmbGFncyAmIFhGUk1fU1BEX09TQ05UKQorCQlOTEFfUFVUX1UzMihza2IsIFhGUk1BX1NQRE9TQ05ULCBzaS5pbnNjbnQpOworCWlmIChmbGFncyAmIFhGUk1fU1BEX0ZTQ05UKQorCQlOTEFfUFVUX1UzMihza2IsIFhGUk1BX1NQREZTQ05ULCBzaS5pbnNjbnQpOworCisJcmV0dXJuIG5sbXNnX2VuZChza2IsIG5saCk7CisKK25sYV9wdXRfZmFpbHVyZToKKwlubG1zZ19jYW5jZWwoc2tiLCBubGgpOworCXJldHVybiAtRU1TR1NJWkU7Cit9CisKK3N0YXRpYyBpbnQgeGZybV9nZXRfc3BkaW5mbyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwKKwkJc3RydWN0IHJ0YXR0ciAqKnhmcm1hKQoreworCXN0cnVjdCBza19idWZmICpyX3NrYjsKKwl1MzIgKmZsYWdzID0gTkxNU0dfREFUQShubGgpOworCXUzMiBzcGlkID0gTkVUTElOS19DQihza2IpLnBpZDsKKwl1MzIgc2VxID0gbmxoLT5ubG1zZ19zZXE7CisJaW50IGxlbiA9IE5MTVNHX0xFTkdUSChzaXplb2YodTMyKSk7CisKKworCWlmICgqZmxhZ3MgJiBYRlJNX1NQRF9ITUFTSykKKwkJbGVuICs9IFJUQV9TUEFDRShzaXplb2YodTMyKSk7CisJaWYgKCpmbGFncyAmIFhGUk1fU1BEX0hNQVgpCisJCWxlbiArPSBSVEFfU1BBQ0Uoc2l6ZW9mKHUzMikpOworCWlmICgqZmxhZ3MgJiBYRlJNX1NQRF9JQ05UKQorCQlsZW4gKz0gUlRBX1NQQUNFKHNpemVvZih1MzIpKTsKKwlpZiAoKmZsYWdzICYgWEZSTV9TUERfT0NOVCkKKwkJbGVuICs9IFJUQV9TUEFDRShzaXplb2YodTMyKSk7CisJaWYgKCpmbGFncyAmIFhGUk1fU1BEX0ZDTlQpCisJCWxlbiArPSBSVEFfU1BBQ0Uoc2l6ZW9mKHUzMikpOworCWlmICgqZmxhZ3MgJiBYRlJNX1NQRF9JU0NOVCkKKwkJbGVuICs9IFJUQV9TUEFDRShzaXplb2YodTMyKSk7CisJaWYgKCpmbGFncyAmIFhGUk1fU1BEX09TQ05UKQorCQlsZW4gKz0gUlRBX1NQQUNFKHNpemVvZih1MzIpKTsKKwlpZiAoKmZsYWdzICYgWEZSTV9TUERfRlNDTlQpCisJCWxlbiArPSBSVEFfU1BBQ0Uoc2l6ZW9mKHUzMikpOworCisJcl9za2IgPSBhbGxvY19za2IobGVuLCBHRlBfQVRPTUlDKTsKKwlpZiAocl9za2IgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoYnVpbGRfc3BkaW5mbyhyX3NrYiwgc3BpZCwgc2VxLCAqZmxhZ3MpIDwgMCkKKwkJQlVHKCk7CisKKwlyZXR1cm4gbmxtc2dfdW5pY2FzdCh4ZnJtX25sLCByX3NrYiwgc3BpZCk7Cit9CisKK3N0YXRpYyBpbnQgYnVpbGRfc2FkaW5mbyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgcGlkLCB1MzIgc2VxLCB1MzIgZmxhZ3MpCit7CisJc3RydWN0IHhmcm1fc2FkaW5mbyBzaTsKKwlzdHJ1Y3Qgbmxtc2doZHIgKm5saDsKKwl1MzIgKmY7CisKKwlubGggPSBubG1zZ19wdXQoc2tiLCBwaWQsIHNlcSwgWEZSTV9NU0dfTkVXU0FESU5GTywgc2l6ZW9mKHUzMiksIDApOworCWlmIChubGggPT0gTlVMTCkgLyogc2hvdWxkbnQgcmVhbGx5IGhhcHBlbiAuLi4gKi8KKwkJcmV0dXJuIC1FTVNHU0laRTsKKworCWYgPSBubG1zZ19kYXRhKG5saCk7CisJKmYgPSBmbGFnczsKKwl4ZnJtX3NhZF9nZXRpbmZvKCZzaSk7CisKKwlpZiAoZmxhZ3MgJiBYRlJNX1NBRF9ITUFTSykKKwkJTkxBX1BVVF9VMzIoc2tiLCBYRlJNQV9TQURITUFTSywgc2kuc2FkaGNudCk7CisJaWYgKGZsYWdzICYgWEZSTV9TQURfSE1BWCkKKwkJTkxBX1BVVF9VMzIoc2tiLCBYRlJNQV9TQURITUFYLCBzaS5zYWRobWNudCk7CisJaWYgKGZsYWdzICYgWEZSTV9TQURfQ05UKQorCQlOTEFfUFVUX1UzMihza2IsIFhGUk1BX1NBRENOVCwgc2kuc2FkY250KTsKKworCXJldHVybiBubG1zZ19lbmQoc2tiLCBubGgpOworCitubGFfcHV0X2ZhaWx1cmU6CisJbmxtc2dfY2FuY2VsKHNrYiwgbmxoKTsKKwlyZXR1cm4gLUVNU0dTSVpFOworfQorCitzdGF0aWMgaW50IHhmcm1fZ2V0X3NhZGluZm8oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5sbXNnaGRyICpubGgsCisJCXN0cnVjdCBydGF0dHIgKip4ZnJtYSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqcl9za2I7CisJdTMyICpmbGFncyA9IE5MTVNHX0RBVEEobmxoKTsKKwl1MzIgc3BpZCA9IE5FVExJTktfQ0Ioc2tiKS5waWQ7CisJdTMyIHNlcSA9IG5saC0+bmxtc2dfc2VxOworCWludCBsZW4gPSBOTE1TR19MRU5HVEgoc2l6ZW9mKHUzMikpOworCisJaWYgKCpmbGFncyAmIFhGUk1fU0FEX0hNQVNLKQorCQlsZW4gKz0gUlRBX1NQQUNFKHNpemVvZih1MzIpKTsKKwlpZiAoKmZsYWdzICYgWEZSTV9TQURfSE1BWCkKKwkJbGVuICs9IFJUQV9TUEFDRShzaXplb2YodTMyKSk7CisJaWYgKCpmbGFncyAmIFhGUk1fU0FEX0NOVCkKKwkJbGVuICs9IFJUQV9TUEFDRShzaXplb2YodTMyKSk7CisKKwlyX3NrYiA9IGFsbG9jX3NrYihsZW4sIEdGUF9BVE9NSUMpOworCisJaWYgKHJfc2tiID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKGJ1aWxkX3NhZGluZm8ocl9za2IsIHNwaWQsIHNlcSwgKmZsYWdzKSA8IDApCisJCUJVRygpOworCisJcmV0dXJuIG5sbXNnX3VuaWNhc3QoeGZybV9ubCwgcl9za2IsIHNwaWQpOworfQorCiBzdGF0aWMgaW50IHhmcm1fZ2V0X3NhKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBubG1zZ2hkciAqbmxoLAogCQlzdHJ1Y3QgcnRhdHRyICoqeGZybWEpCiB7CkBAIC03MTEsNyArODQxLDcgQEAKIAogCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwotCX07CisJfQogCiAJaWYgKHAtPm1pbiA+IHAtPm1heCkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC03ODksNyArOTE5LDcgQEAKIAogCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwotCX07CisJfQogCiAJcmV0dXJuIDA7CiB9CkBAIC04MDUsNyArOTM1LDcgQEAKIAogCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwotCX07CisJfQogCiAJcmV0dXJuIDA7CiB9CkBAIC04MjEsNyArOTUxLDcgQEAKIAogCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwotCX07CisJfQogCiAJc3dpdGNoIChwLT5hY3Rpb24pIHsKIAljYXNlIFhGUk1fUE9MSUNZX0FMTE9XOgpAQCAtODMwLDcgKzk2MCw3IEBACiAKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKLQl9OworCX0KIAogCXN3aXRjaCAocC0+c2VsLmZhbWlseSkgewogCWNhc2UgQUZfSU5FVDoKQEAgLTg0NSw3ICs5NzUsNyBAQAogCiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JfTsKKwl9CiAKIAlyZXR1cm4gdmVyaWZ5X3BvbGljeV9kaXIocC0+ZGlyKTsKIH0KQEAgLTkxMiw3ICsxMDQyLDcgQEAKICNlbmRpZgogCQlkZWZhdWx0OgogCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX07CisJCX0KIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTExNTcsNyArMTI4Nyw3IEBACiAJc3RydWN0IHNrX2J1ZmYgKmluX3NrYiA9IHNwLT5pbl9za2I7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHNwLT5vdXRfc2tiOwogCXN0cnVjdCBubG1zZ2hkciAqbmxoOwotCXVuc2lnbmVkIGNoYXIgKmIgPSBza2ItPnRhaWw7CisJdW5zaWduZWQgY2hhciAqYiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKTsKIAogCWlmIChzcC0+dGhpc19pZHggPCBzcC0+c3RhcnRfaWR4KQogCQlnb3RvIG91dDsKQEAgLTExNzYsMTMgKzEzMDYsMTMgQEAKIAlpZiAoY29weV90b191c2VyX3BvbGljeV90eXBlKHhwLT50eXBlLCBza2IpIDwgMCkKIAkJZ290byBubG1zZ19mYWlsdXJlOwogCi0JbmxoLT5ubG1zZ19sZW4gPSBza2ItPnRhaWwgLSBiOworCW5saC0+bmxtc2dfbGVuID0gc2tiX3RhaWxfcG9pbnRlcihza2IpIC0gYjsKIG91dDoKIAlzcC0+dGhpc19pZHgrKzsKIAlyZXR1cm4gMDsKIAogbmxtc2dfZmFpbHVyZToKLQlza2JfdHJpbShza2IsIGIgLSBza2ItPmRhdGEpOworCW5sbXNnX3RyaW0oc2tiLCBiKTsKIAlyZXR1cm4gLTE7CiB9CiAKQEAgLTEzMzAsNyArMTQ2MCw3IEBACiAJc3RydWN0IHhmcm1fYWV2ZW50X2lkICppZDsKIAlzdHJ1Y3Qgbmxtc2doZHIgKm5saDsKIAlzdHJ1Y3QgeGZybV9saWZldGltZV9jdXIgbHRpbWU7Ci0JdW5zaWduZWQgY2hhciAqYiA9IHNrYi0+dGFpbDsKKwl1bnNpZ25lZCBjaGFyICpiID0gc2tiX3RhaWxfcG9pbnRlcihza2IpOwogCiAJbmxoID0gTkxNU0dfUFVUKHNrYiwgYy0+cGlkLCBjLT5zZXEsIFhGUk1fTVNHX05FV0FFLCBzaXplb2YoKmlkKSk7CiAJaWQgPSBOTE1TR19EQVRBKG5saCk7CkBAIC0xMzYyLDEyICsxNDkyLDEyIEBACiAJCVJUQV9QVVQoc2tiLFhGUk1BX0VUSU1FUl9USFJFU0gsc2l6ZW9mKHUzMiksJmV0aW1lcik7CiAJfQogCi0JbmxoLT5ubG1zZ19sZW4gPSBza2ItPnRhaWwgLSBiOworCW5saC0+bmxtc2dfbGVuID0gc2tiX3RhaWxfcG9pbnRlcihza2IpIC0gYjsKIAlyZXR1cm4gc2tiLT5sZW47CiAKIHJ0YXR0cl9mYWlsdXJlOgogbmxtc2dfZmFpbHVyZToKLQlza2JfdHJpbShza2IsIGIgLSBza2ItPmRhdGEpOworCW5sbXNnX3RyaW0oc2tiLCBiKTsKIAlyZXR1cm4gLTE7CiB9CiAKQEAgLTE3NDQsNyArMTg3NCw3IEBACiAJc3RydWN0IHhmcm1fbWlncmF0ZSAqbXA7CiAJc3RydWN0IHhmcm1fdXNlcnBvbGljeV9pZCAqcG9sX2lkOwogCXN0cnVjdCBubG1zZ2hkciAqbmxoOwotCXVuc2lnbmVkIGNoYXIgKmIgPSBza2ItPnRhaWw7CisJdW5zaWduZWQgY2hhciAqYiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKTsKIAlpbnQgaTsKIAogCW5saCA9IE5MTVNHX1BVVChza2IsIDAsIDAsIFhGUk1fTVNHX01JR1JBVEUsIHNpemVvZigqcG9sX2lkKSk7CkBAIC0xNzY0LDEwICsxODk0LDEwIEBACiAJCQlnb3RvIG5sbXNnX2ZhaWx1cmU7CiAJfQogCi0JbmxoLT5ubG1zZ19sZW4gPSBza2ItPnRhaWwgLSBiOworCW5saC0+bmxtc2dfbGVuID0gc2tiX3RhaWxfcG9pbnRlcihza2IpIC0gYjsKIAlyZXR1cm4gc2tiLT5sZW47CiBubG1zZ19mYWlsdXJlOgotCXNrYl90cmltKHNrYiwgYiAtIHNrYi0+ZGF0YSk7CisJbmxtc2dfdHJpbShza2IsIGIpOwogCXJldHVybiAtMTsKIH0KIApAQCAtMTgyMyw2ICsxOTUzLDggQEAKIAlbWEZSTV9NU0dfR0VUQUUgICAgICAgLSBYRlJNX01TR19CQVNFXSA9IFhNU0dTSVpFKHhmcm1fYWV2ZW50X2lkKSwKIAlbWEZSTV9NU0dfUkVQT1JUICAgICAgLSBYRlJNX01TR19CQVNFXSA9IFhNU0dTSVpFKHhmcm1fdXNlcl9yZXBvcnQpLAogCVtYRlJNX01TR19NSUdSQVRFICAgICAtIFhGUk1fTVNHX0JBU0VdID0gWE1TR1NJWkUoeGZybV91c2VycG9saWN5X2lkKSwKKwlbWEZSTV9NU0dfR0VUU0FESU5GTyAgLSBYRlJNX01TR19CQVNFXSA9IE5MTVNHX0xFTkdUSChzaXplb2YodTMyKSksCisJW1hGUk1fTVNHX0dFVFNQRElORk8gIC0gWEZSTV9NU0dfQkFTRV0gPSBOTE1TR19MRU5HVEgoc2l6ZW9mKHUzMikpLAogfTsKIAogI3VuZGVmIFhNU0dTSVpFCkBAIC0xODUwLDU1ICsxOTgyLDQwIEBACiAJW1hGUk1fTVNHX05FV0FFICAgICAgIC0gWEZSTV9NU0dfQkFTRV0gPSB7IC5kb2l0ID0geGZybV9uZXdfYWUgIH0sCiAJW1hGUk1fTVNHX0dFVEFFICAgICAgIC0gWEZSTV9NU0dfQkFTRV0gPSB7IC5kb2l0ID0geGZybV9nZXRfYWUgIH0sCiAJW1hGUk1fTVNHX01JR1JBVEUgICAgIC0gWEZSTV9NU0dfQkFTRV0gPSB7IC5kb2l0ID0geGZybV9kb19taWdyYXRlICAgIH0sCisJW1hGUk1fTVNHX0dFVFNBRElORk8gIC0gWEZSTV9NU0dfQkFTRV0gPSB7IC5kb2l0ID0geGZybV9nZXRfc2FkaW5mbyAgIH0sCisJW1hGUk1fTVNHX0dFVFNQRElORk8gIC0gWEZSTV9NU0dfQkFTRV0gPSB7IC5kb2l0ID0geGZybV9nZXRfc3BkaW5mbyAgIH0sCiB9OwogCi1zdGF0aWMgaW50IHhmcm1fdXNlcl9yY3ZfbXNnKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBubG1zZ2hkciAqbmxoLCBpbnQgKmVycnApCitzdGF0aWMgaW50IHhmcm1fdXNlcl9yY3ZfbXNnKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBubG1zZ2hkciAqbmxoKQogewogCXN0cnVjdCBydGF0dHIgKnhmcm1hW1hGUk1BX01BWF07CiAJc3RydWN0IHhmcm1fbGluayAqbGluazsKIAlpbnQgdHlwZSwgbWluX2xlbjsKIAotCWlmICghKG5saC0+bmxtc2dfZmxhZ3MgJiBOTE1fRl9SRVFVRVNUKSkKLQkJcmV0dXJuIDA7Ci0KIAl0eXBlID0gbmxoLT5ubG1zZ190eXBlOwotCi0JLyogQSBjb250cm9sIG1lc3NhZ2U6IGlnbm9yZSB0aGVtICovCi0JaWYgKHR5cGUgPCBYRlJNX01TR19CQVNFKQotCQlyZXR1cm4gMDsKLQotCS8qIFVua25vd24gbWVzc2FnZTogcmVwbHkgd2l0aCBFSU5WQUwgKi8KIAlpZiAodHlwZSA+IFhGUk1fTVNHX01BWCkKLQkJZ290byBlcnJfZWludmFsOworCQlyZXR1cm4gLUVJTlZBTDsKIAogCXR5cGUgLT0gWEZSTV9NU0dfQkFTRTsKIAlsaW5rID0gJnhmcm1fZGlzcGF0Y2hbdHlwZV07CiAKIAkvKiBBbGwgb3BlcmF0aW9ucyByZXF1aXJlIHByaXZpbGVnZXMsIGV2ZW4gR0VUICovCi0JaWYgKHNlY3VyaXR5X25ldGxpbmtfcmVjdihza2IsIENBUF9ORVRfQURNSU4pKSB7Ci0JCSplcnJwID0gLUVQRVJNOwotCQlyZXR1cm4gLTE7Ci0JfQorCWlmIChzZWN1cml0eV9uZXRsaW5rX3JlY3Yoc2tiLCBDQVBfTkVUX0FETUlOKSkKKwkJcmV0dXJuIC1FUEVSTTsKIAogCWlmICgodHlwZSA9PSAoWEZSTV9NU0dfR0VUU0EgLSBYRlJNX01TR19CQVNFKSB8fAogCSAgICAgdHlwZSA9PSAoWEZSTV9NU0dfR0VUUE9MSUNZIC0gWEZSTV9NU0dfQkFTRSkpICYmCiAJICAgIChubGgtPm5sbXNnX2ZsYWdzICYgTkxNX0ZfRFVNUCkpIHsKIAkJaWYgKGxpbmstPmR1bXAgPT0gTlVMTCkKLQkJCWdvdG8gZXJyX2VpbnZhbDsKKwkJCXJldHVybiAtRUlOVkFMOwogCi0JCWlmICgoKmVycnAgPSBuZXRsaW5rX2R1bXBfc3RhcnQoeGZybV9ubCwgc2tiLCBubGgsCi0JCQkJCQlsaW5rLT5kdW1wLCBOVUxMKSkgIT0gMCkgewotCQkJcmV0dXJuIC0xOwotCQl9Ci0KLQkJbmV0bGlua19xdWV1ZV9za2lwKG5saCwgc2tiKTsKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gbmV0bGlua19kdW1wX3N0YXJ0KHhmcm1fbmwsIHNrYiwgbmxoLCBsaW5rLT5kdW1wLCBOVUxMKTsKIAl9CiAKIAltZW1zZXQoeGZybWEsIDAsIHNpemVvZih4ZnJtYSkpOwogCiAJaWYgKG5saC0+bmxtc2dfbGVuIDwgKG1pbl9sZW4gPSB4ZnJtX21zZ19taW5bdHlwZV0pKQotCQlnb3RvIGVycl9laW52YWw7CisJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKG5saC0+bmxtc2dfbGVuID4gbWluX2xlbikgewogCQlpbnQgYXR0cmxlbiA9IG5saC0+bmxtc2dfbGVuIC0gTkxNU0dfQUxJR04obWluX2xlbik7CkBAIC0xOTA4LDcgKzIwMjUsNyBAQAogCQkJdW5zaWduZWQgc2hvcnQgZmxhdm9yID0gYXR0ci0+cnRhX3R5cGU7CiAJCQlpZiAoZmxhdm9yKSB7CiAJCQkJaWYgKGZsYXZvciA+IFhGUk1BX01BWCkKLQkJCQkJZ290byBlcnJfZWludmFsOworCQkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCQl4ZnJtYVtmbGF2b3IgLSAxXSA9IGF0dHI7CiAJCQl9CiAJCQlhdHRyID0gUlRBX05FWFQoYXR0ciwgYXR0cmxlbik7CkBAIC0xOTE2LDE0ICsyMDMzLDkgQEAKIAl9CiAKIAlpZiAobGluay0+ZG9pdCA9PSBOVUxMKQotCQlnb3RvIGVycl9laW52YWw7Ci0JKmVycnAgPSBsaW5rLT5kb2l0KHNrYiwgbmxoLCB4ZnJtYSk7CisJCXJldHVybiAtRUlOVkFMOwogCi0JcmV0dXJuICplcnJwOwotCi1lcnJfZWludmFsOgotCSplcnJwID0gLUVJTlZBTDsKLQlyZXR1cm4gLTE7CisJcmV0dXJuIGxpbmstPmRvaXQoc2tiLCBubGgsIHhmcm1hKTsKIH0KIAogc3RhdGljIHZvaWQgeGZybV9uZXRsaW5rX3JjdihzdHJ1Y3Qgc29jayAqc2ssIGludCBsZW4pCkBAIC0xOTQyLDcgKzIwNTQsNyBAQAogewogCXN0cnVjdCB4ZnJtX3VzZXJfZXhwaXJlICp1ZTsKIAlzdHJ1Y3Qgbmxtc2doZHIgKm5saDsKLQl1bnNpZ25lZCBjaGFyICpiID0gc2tiLT50YWlsOworCXVuc2lnbmVkIGNoYXIgKmIgPSBza2JfdGFpbF9wb2ludGVyKHNrYik7CiAKIAlubGggPSBOTE1TR19QVVQoc2tiLCBjLT5waWQsIDAsIFhGUk1fTVNHX0VYUElSRSwKIAkJCXNpemVvZigqdWUpKTsKQEAgLTE5NTIsMTEgKzIwNjQsMTEgQEAKIAljb3B5X3RvX3VzZXJfc3RhdGUoeCwgJnVlLT5zdGF0ZSk7CiAJdWUtPmhhcmQgPSAoYy0+ZGF0YS5oYXJkICE9IDApID8gMSA6IDA7CiAKLQlubGgtPm5sbXNnX2xlbiA9IHNrYi0+dGFpbCAtIGI7CisJbmxoLT5ubG1zZ19sZW4gPSBza2JfdGFpbF9wb2ludGVyKHNrYikgLSBiOwogCXJldHVybiBza2ItPmxlbjsKIAogbmxtc2dfZmFpbHVyZToKLQlza2JfdHJpbShza2IsIGIgLSBza2ItPmRhdGEpOworCW5sbXNnX3RyaW0oc2tiLCBiKTsKIAlyZXR1cm4gLTE7CiB9CiAKQEAgLTE5OTksNyArMjExMSw3IEBACiAJc3RydWN0IHhmcm1fdXNlcnNhX2ZsdXNoICpwOwogCXN0cnVjdCBubG1zZ2hkciAqbmxoOwogCXN0cnVjdCBza19idWZmICpza2I7Ci0JdW5zaWduZWQgY2hhciAqYjsKKwlza19idWZmX2RhdGFfdCBiOwogCWludCBsZW4gPSBOTE1TR19MRU5HVEgoc2l6ZW9mKHN0cnVjdCB4ZnJtX3VzZXJzYV9mbHVzaCkpOwogCiAJc2tiID0gYWxsb2Nfc2tiKGxlbiwgR0ZQX0FUT01JQyk7CkBAIC0yMDQ1LDcgKzIxNTcsNyBAQAogCXN0cnVjdCB4ZnJtX3VzZXJzYV9pZCAqaWQ7CiAJc3RydWN0IG5sbXNnaGRyICpubGg7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQl1bnNpZ25lZCBjaGFyICpiOworCXNrX2J1ZmZfZGF0YV90IGI7CiAJaW50IGxlbiA9IHhmcm1fc2FfbGVuKHgpOwogCWludCBoZWFkbGVuOwogCkBAIC0yMTI5LDcgKzIyNDEsNyBAQAogewogCXN0cnVjdCB4ZnJtX3VzZXJfYWNxdWlyZSAqdWE7CiAJc3RydWN0IG5sbXNnaGRyICpubGg7Ci0JdW5zaWduZWQgY2hhciAqYiA9IHNrYi0+dGFpbDsKKwl1bnNpZ25lZCBjaGFyICpiID0gc2tiX3RhaWxfcG9pbnRlcihza2IpOwogCV9fdTMyIHNlcSA9IHhmcm1fZ2V0X2FjcXNlcSgpOwogCiAJbmxoID0gTkxNU0dfUFVUKHNrYiwgMCwgMCwgWEZSTV9NU0dfQUNRVUlSRSwKQEAgLTIxNTMsMTEgKzIyNjUsMTEgQEAKIAlpZiAoY29weV90b191c2VyX3BvbGljeV90eXBlKHhwLT50eXBlLCBza2IpIDwgMCkKIAkJZ290byBubG1zZ19mYWlsdXJlOwogCi0JbmxoLT5ubG1zZ19sZW4gPSBza2ItPnRhaWwgLSBiOworCW5saC0+bmxtc2dfbGVuID0gc2tiX3RhaWxfcG9pbnRlcihza2IpIC0gYjsKIAlyZXR1cm4gc2tiLT5sZW47CiAKIG5sbXNnX2ZhaWx1cmU6Ci0Jc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKKwlubG1zZ190cmltKHNrYiwgYik7CiAJcmV0dXJuIC0xOwogfQogCkBAIC0yMjQ5LDcgKzIzNjEsNyBAQAogCXN0cnVjdCB4ZnJtX3VzZXJfcG9sZXhwaXJlICp1cGU7CiAJc3RydWN0IG5sbXNnaGRyICpubGg7CiAJaW50IGhhcmQgPSBjLT5kYXRhLmhhcmQ7Ci0JdW5zaWduZWQgY2hhciAqYiA9IHNrYi0+dGFpbDsKKwl1bnNpZ25lZCBjaGFyICpiID0gc2tiX3RhaWxfcG9pbnRlcihza2IpOwogCiAJbmxoID0gTkxNU0dfUFVUKHNrYiwgYy0+cGlkLCAwLCBYRlJNX01TR19QT0xFWFBJUkUsIHNpemVvZigqdXBlKSk7CiAJdXBlID0gTkxNU0dfREFUQShubGgpOwpAQCAtMjI2NCwxMSArMjM3NiwxMSBAQAogCQlnb3RvIG5sbXNnX2ZhaWx1cmU7CiAJdXBlLT5oYXJkID0gISFoYXJkOwogCi0JbmxoLT5ubG1zZ19sZW4gPSBza2ItPnRhaWwgLSBiOworCW5saC0+bmxtc2dfbGVuID0gc2tiX3RhaWxfcG9pbnRlcihza2IpIC0gYjsKIAlyZXR1cm4gc2tiLT5sZW47CiAKIG5sbXNnX2ZhaWx1cmU6Ci0Jc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKKwlubG1zZ190cmltKHNrYiwgYik7CiAJcmV0dXJuIC0xOwogfQogCkBAIC0yMzAwLDcgKzI0MTIsNyBAQAogCXN0cnVjdCB4ZnJtX3VzZXJwb2xpY3lfaWQgKmlkOwogCXN0cnVjdCBubG1zZ2hkciAqbmxoOwogCXN0cnVjdCBza19idWZmICpza2I7Ci0JdW5zaWduZWQgY2hhciAqYjsKKwlza19idWZmX2RhdGFfdCBiOwogCWludCBsZW4gPSBSVEFfU1BBQ0Uoc2l6ZW9mKHN0cnVjdCB4ZnJtX3VzZXJfdG1wbCkgKiB4cC0+eGZybV9ucik7CiAJaW50IGhlYWRsZW47CiAKQEAgLTIzNTcsNyArMjQ2OSw3IEBACiB7CiAJc3RydWN0IG5sbXNnaGRyICpubGg7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQl1bnNpZ25lZCBjaGFyICpiOworCXNrX2J1ZmZfZGF0YV90IGI7CiAJaW50IGxlbiA9IDA7CiAjaWZkZWYgQ09ORklHX1hGUk1fU1VCX1BPTElDWQogCWxlbiArPSBSVEFfU1BBQ0Uoc2l6ZW9mKHN0cnVjdCB4ZnJtX3VzZXJwb2xpY3lfdHlwZSkpOwpAQCAtMjQxMCw3ICsyNTIyLDcgQEAKIHsKIAlzdHJ1Y3QgeGZybV91c2VyX3JlcG9ydCAqdXI7CiAJc3RydWN0IG5sbXNnaGRyICpubGg7Ci0JdW5zaWduZWQgY2hhciAqYiA9IHNrYi0+dGFpbDsKKwl1bnNpZ25lZCBjaGFyICpiID0gc2tiX3RhaWxfcG9pbnRlcihza2IpOwogCiAJbmxoID0gTkxNU0dfUFVUKHNrYiwgMCwgMCwgWEZSTV9NU0dfUkVQT1JULCBzaXplb2YoKnVyKSk7CiAJdXIgPSBOTE1TR19EQVRBKG5saCk7CkBAIC0yNDIyLDEyICsyNTM0LDEyIEBACiAJaWYgKGFkZHIpCiAJCVJUQV9QVVQoc2tiLCBYRlJNQV9DT0FERFIsIHNpemVvZigqYWRkciksIGFkZHIpOwogCi0JbmxoLT5ubG1zZ19sZW4gPSBza2ItPnRhaWwgLSBiOworCW5saC0+bmxtc2dfbGVuID0gc2tiX3RhaWxfcG9pbnRlcihza2IpIC0gYjsKIAlyZXR1cm4gc2tiLT5sZW47CiAKIG5sbXNnX2ZhaWx1cmU6CiBydGF0dHJfZmFpbHVyZToKLQlza2JfdHJpbShza2IsIGIgLSBza2ItPmRhdGEpOworCW5sbXNnX3RyaW0oc2tiLCBiKTsKIAlyZXR1cm4gLTE7CiB9CiAKQEAgLTI0NjYsNyArMjU3OCw3IEBACiAJcHJpbnRrKEtFUk5fSU5GTyAiSW5pdGlhbGl6aW5nIFhGUk0gbmV0bGluayBzb2NrZXRcbiIpOwogCiAJbmxzayA9IG5ldGxpbmtfa2VybmVsX2NyZWF0ZShORVRMSU5LX1hGUk0sIFhGUk1OTEdSUF9NQVgsCi0JCQkJICAgICB4ZnJtX25ldGxpbmtfcmN2LCBUSElTX01PRFVMRSk7CisJCQkJICAgICB4ZnJtX25ldGxpbmtfcmN2LCBOVUxMLCBUSElTX01PRFVMRSk7CiAJaWYgKG5sc2sgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CiAJcmN1X2Fzc2lnbl9wb2ludGVyKHhmcm1fbmwsIG5sc2spOwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkva2V5cy9rZXlyaW5nLmMgYi9zZWN1cml0eS9rZXlzL2tleXJpbmcuYwppbmRleCBhZDQ1Y2U3Li44ODI5MmUzIDEwMDY0NAotLS0gYS9zZWN1cml0eS9rZXlzL2tleXJpbmcuYworKysgYi9zZWN1cml0eS9rZXlzL2tleXJpbmcuYwpAQCAtNjYsNiArNjYsOCBAQAogCS5yZWFkCQk9IGtleXJpbmdfcmVhZCwKIH07CiAKK0VYUE9SVF9TWU1CT0woa2V5X3R5cGVfa2V5cmluZyk7CisKIC8qCiAgKiBzZW1hcGhvcmUgdG8gc2VyaWFsaXNlIGxpbmsvbGluayBjYWxscyB0byBwcmV2ZW50IHR3byBsaW5rIGNhbGxzIGluIHBhcmFsbGVsCiAgKiBpbnRyb2R1Y2luZyBhIGN5Y2xlCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L01ha2VmaWxlIGIvc2VjdXJpdHkvc2VsaW51eC9NYWtlZmlsZQppbmRleCBmYWYyZTAyLi5kYzM1MDJlIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L01ha2VmaWxlCisrKyBiL3NlY3VyaXR5L3NlbGludXgvTWFrZWZpbGUKQEAgLTgsNSArOCw3IEBACiAKIHNlbGludXgtJChDT05GSUdfU0VDVVJJVFlfTkVUV09SS19YRlJNKSArPSB4ZnJtLm8KIAorc2VsaW51eC0kKENPTkZJR19ORVRMQUJFTCkgKz0gbmV0bGFiZWwubworCiBFWFRSQV9DRkxBR1MgKz0gLUlzZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUKIApkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9hdmMuYyBiL3NlY3VyaXR5L3NlbGludXgvYXZjLmMKaW5kZXggZGE4Y2FmMS4uZTQzOTZhOCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9hdmMuYworKysgYi9zZWN1cml0eS9zZWxpbnV4L2F2Yy5jCkBAIC0yMTcsNiArMjE3LDggQEAKIAkJYXVkaXRfbG9nX2Zvcm1hdChhYiwgIiB0Y29udGV4dD0lcyIsIHNjb250ZXh0KTsKIAkJa2ZyZWUoc2NvbnRleHQpOwogCX0KKworCUJVR19PTih0Y2xhc3MgPj0gQVJSQVlfU0laRShjbGFzc190b19zdHJpbmcpIHx8ICFjbGFzc190b19zdHJpbmdbdGNsYXNzXSk7CiAJYXVkaXRfbG9nX2Zvcm1hdChhYiwgIiB0Y2xhc3M9JXMiLCBjbGFzc190b19zdHJpbmdbdGNsYXNzXSk7CiB9CiAKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvaG9va3MuYyBiL3NlY3VyaXR5L3NlbGludXgvaG9va3MuYwppbmRleCBkNDFlMjRkLi44ODVhOWE5IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L2hvb2tzLmMKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9ob29rcy5jCkBAIC03Nyw3ICs3Nyw3IEBACiAjaW5jbHVkZSAib2Jqc2VjLmgiCiAjaW5jbHVkZSAibmV0aWYuaCIKICNpbmNsdWRlICJ4ZnJtLmgiCi0jaW5jbHVkZSAic2VsaW51eF9uZXRsYWJlbC5oIgorI2luY2x1ZGUgIm5ldGxhYmVsLmgiCiAKICNkZWZpbmUgWEFUVFJfU0VMSU5VWF9TVUZGSVggInNlbGludXgiCiAjZGVmaW5lIFhBVFRSX05BTUVfU0VMSU5VWCBYQVRUUl9TRUNVUklUWV9QUkVGSVggWEFUVFJfU0VMSU5VWF9TVUZGSVgKQEAgLTI5NDQsNyArMjk0NCw3IEBACiAJaW50IG9mZnNldCwgaWhsZW4sIHJldCA9IC1FSU5WQUw7CiAJc3RydWN0IGlwaGRyIF9pcGgsICppaDsKIAotCW9mZnNldCA9IHNrYi0+bmgucmF3IC0gc2tiLT5kYXRhOworCW9mZnNldCA9IHNrYl9uZXR3b3JrX29mZnNldChza2IpOwogCWloID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgb2Zmc2V0LCBzaXplb2YoX2lwaCksICZfaXBoKTsKIAlpZiAoaWggPT0gTlVMTCkKIAkJZ290byBvdXQ7CkBAIC0zMDI2LDcgKzMwMjYsNyBAQAogCWludCByZXQgPSAtRUlOVkFMLCBvZmZzZXQ7CiAJc3RydWN0IGlwdjZoZHIgX2lwdjZoLCAqaXA2OwogCi0Jb2Zmc2V0ID0gc2tiLT5uaC5yYXcgLSBza2ItPmRhdGE7CisJb2Zmc2V0ID0gc2tiX25ldHdvcmtfb2Zmc2V0KHNrYik7CiAJaXA2ID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgb2Zmc2V0LCBzaXplb2YoX2lwdjZoKSwgJl9pcHY2aCk7CiAJaWYgKGlwNiA9PSBOVUxMKQogCQlnb3RvIG91dDsKQEAgLTMxMjMsNiArMzEyMywzNCBAQAogCXJldHVybiByZXQ7CiB9CiAKKy8qKgorICogc2VsaW51eF9za2JfZXh0bGJsX3NpZCAtIERldGVybWluZSB0aGUgZXh0ZXJuYWwgbGFiZWwgb2YgYSBwYWNrZXQKKyAqIEBza2I6IHRoZSBwYWNrZXQKKyAqIEBiYXNlX3NpZDogdGhlIFNFTGludXggU0lEIHRvIHVzZSBhcyBhIGNvbnRleHQgZm9yIE1MUyBvbmx5IGV4dGVybmFsIGxhYmVscworICogQHNpZDogdGhlIHBhY2tldCdzIFNJRAorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ2hlY2sgdGhlIHZhcmlvdXMgZGlmZmVyZW50IGZvcm1zIG9mIGV4dGVybmFsIHBhY2tldCBsYWJlbGluZyBhbmQgZGV0ZXJtaW5lCisgKiB0aGUgZXh0ZXJuYWwgU0lEIGZvciB0aGUgcGFja2V0LgorICoKKyAqLworc3RhdGljIHZvaWQgc2VsaW51eF9za2JfZXh0bGJsX3NpZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSAgIHUzMiBiYXNlX3NpZCwKKwkJCQkgICB1MzIgKnNpZCkKK3sKKwl1MzIgeGZybV9zaWQ7CisJdTMyIG5sYmxfc2lkOworCisJc2VsaW51eF9za2JfeGZybV9zaWQoc2tiLCAmeGZybV9zaWQpOworCWlmIChzZWxpbnV4X25ldGxibF9za2J1ZmZfZ2V0c2lkKHNrYiwKKwkJCQkJICh4ZnJtX3NpZCA9PSBTRUNTSURfTlVMTCA/CisJCQkJCSAgYmFzZV9zaWQgOiB4ZnJtX3NpZCksCisJCQkJCSAmbmxibF9zaWQpICE9IDApCisJCW5sYmxfc2lkID0gU0VDU0lEX05VTEw7CisKKwkqc2lkID0gKG5sYmxfc2lkID09IFNFQ1NJRF9OVUxMID8geGZybV9zaWQgOiBubGJsX3NpZCk7Cit9CisKIC8qIHNvY2tldCBzZWN1cml0eSBvcGVyYXRpb25zICovCiBzdGF0aWMgaW50IHNvY2tldF9oYXNfcGVybShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHN0cnVjdCBzb2NrZXQgKnNvY2ssCiAJCQkgICB1MzIgcGVybXMpCkBAIC0zNjY0LDkgKzM2OTIsNyBAQAogCWlmIChzb2NrICYmIHNvY2stPnNrLT5za19mYW1pbHkgPT0gUEZfVU5JWCkKIAkJc2VsaW51eF9nZXRfaW5vZGVfc2lkKFNPQ0tfSU5PREUoc29jayksICZwZWVyX3NlY2lkKTsKIAllbHNlIGlmIChza2IpCi0JCXNlY3VyaXR5X3NrYl9leHRsYmxfc2lkKHNrYiwKLQkJCQkJU0VDSU5JVFNJRF9VTkxBQkVMRUQsCi0JCQkJCSZwZWVyX3NlY2lkKTsKKwkJc2VsaW51eF9za2JfZXh0bGJsX3NpZChza2IsIFNFQ0lOSVRTSURfVU5MQUJFTEVELCAmcGVlcl9zZWNpZCk7CiAKIAlpZiAocGVlcl9zZWNpZCA9PSBTRUNTSURfTlVMTCkKIAkJZXJyID0gLUVJTlZBTDsKQEAgLTM3MjcsNyArMzc1Myw3IEBACiAJdTMyIG5ld3NpZDsKIAl1MzIgcGVlcnNpZDsKIAotCXNlY3VyaXR5X3NrYl9leHRsYmxfc2lkKHNrYiwgU0VDSU5JVFNJRF9VTkxBQkVMRUQsICZwZWVyc2lkKTsKKwlzZWxpbnV4X3NrYl9leHRsYmxfc2lkKHNrYiwgU0VDSU5JVFNJRF9VTkxBQkVMRUQsICZwZWVyc2lkKTsKIAlpZiAocGVlcnNpZCA9PSBTRUNTSURfTlVMTCkgewogCQlyZXEtPnNlY2lkID0gc2tzZWMtPnNpZDsKIAkJcmVxLT5wZWVyX3NlY2lkID0gU0VDU0lEX05VTEw7CkBAIC0zNzY1LDcgKzM3OTEsNyBAQAogewogCXN0cnVjdCBza19zZWN1cml0eV9zdHJ1Y3QgKnNrc2VjID0gc2stPnNrX3NlY3VyaXR5OwogCi0Jc2VjdXJpdHlfc2tiX2V4dGxibF9zaWQoc2tiLCBTRUNJTklUU0lEX1VOTEFCRUxFRCwgJnNrc2VjLT5wZWVyX3NpZCk7CisJc2VsaW51eF9za2JfZXh0bGJsX3NpZChza2IsIFNFQ0lOSVRTSURfVU5MQUJFTEVELCAmc2tzZWMtPnBlZXJfc2lkKTsKIH0KIAogc3RhdGljIHZvaWQgc2VsaW51eF9yZXFfY2xhc3NpZnlfZmxvdyhjb25zdCBzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEsCkBAIC0zNzg2LDcgKzM4MTIsNyBAQAogCQllcnIgPSAtRUlOVkFMOwogCQlnb3RvIG91dDsKIAl9Ci0JbmxoID0gKHN0cnVjdCBubG1zZ2hkciAqKXNrYi0+ZGF0YTsKKwlubGggPSBubG1zZ19oZHIoc2tiKTsKIAkKIAllcnIgPSBzZWxpbnV4X25sbXNnX2xvb2t1cChpc2VjLT5zY2xhc3MsIG5saC0+bmxtc2dfdHlwZSwgJnBlcm0pOwogCWlmIChlcnIpIHsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9hdl9wZXJtX3RvX3N0cmluZy5oIGIvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL2F2X3Blcm1fdG9fc3RyaW5nLmgKaW5kZXggYWQ5ZmIyZC4uYjgzZTc0MCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL2F2X3Blcm1fdG9fc3RyaW5nLmgKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL2F2X3Blcm1fdG9fc3RyaW5nLmgKQEAgLTEyOCw5NiArMTI4LDYgQEAKICAgIFNfKFNFQ0NMQVNTX0NBUEFCSUxJVFksIENBUEFCSUxJVFlfX0xFQVNFLCAibGVhc2UiKQogICAgU18oU0VDQ0xBU1NfQ0FQQUJJTElUWSwgQ0FQQUJJTElUWV9fQVVESVRfV1JJVEUsICJhdWRpdF93cml0ZSIpCiAgICBTXyhTRUNDTEFTU19DQVBBQklMSVRZLCBDQVBBQklMSVRZX19BVURJVF9DT05UUk9MLCAiYXVkaXRfY29udHJvbCIpCi0gICBTXyhTRUNDTEFTU19QQVNTV0QsIFBBU1NXRF9fUEFTU1dELCAicGFzc3dkIikKLSAgIFNfKFNFQ0NMQVNTX1BBU1NXRCwgUEFTU1dEX19DSEZOLCAiY2hmbiIpCi0gICBTXyhTRUNDTEFTU19QQVNTV0QsIFBBU1NXRF9fQ0hTSCwgImNoc2giKQotICAgU18oU0VDQ0xBU1NfUEFTU1dELCBQQVNTV0RfX1JPT1RPSywgInJvb3RvayIpCi0gICBTXyhTRUNDTEFTU19QQVNTV0QsIFBBU1NXRF9fQ1JPTlRBQiwgImNyb250YWIiKQotICAgU18oU0VDQ0xBU1NfRFJBV0FCTEUsIERSQVdBQkxFX19DUkVBVEUsICJjcmVhdGUiKQotICAgU18oU0VDQ0xBU1NfRFJBV0FCTEUsIERSQVdBQkxFX19ERVNUUk9ZLCAiZGVzdHJveSIpCi0gICBTXyhTRUNDTEFTU19EUkFXQUJMRSwgRFJBV0FCTEVfX0RSQVcsICJkcmF3IikKLSAgIFNfKFNFQ0NMQVNTX0RSQVdBQkxFLCBEUkFXQUJMRV9fQ09QWSwgImNvcHkiKQotICAgU18oU0VDQ0xBU1NfRFJBV0FCTEUsIERSQVdBQkxFX19HRVRBVFRSLCAiZ2V0YXR0ciIpCi0gICBTXyhTRUNDTEFTU19HQywgR0NfX0NSRUFURSwgImNyZWF0ZSIpCi0gICBTXyhTRUNDTEFTU19HQywgR0NfX0ZSRUUsICJmcmVlIikKLSAgIFNfKFNFQ0NMQVNTX0dDLCBHQ19fR0VUQVRUUiwgImdldGF0dHIiKQotICAgU18oU0VDQ0xBU1NfR0MsIEdDX19TRVRBVFRSLCAic2V0YXR0ciIpCi0gICBTXyhTRUNDTEFTU19XSU5ET1csIFdJTkRPV19fQUREQ0hJTEQsICJhZGRjaGlsZCIpCi0gICBTXyhTRUNDTEFTU19XSU5ET1csIFdJTkRPV19fQ1JFQVRFLCAiY3JlYXRlIikKLSAgIFNfKFNFQ0NMQVNTX1dJTkRPVywgV0lORE9XX19ERVNUUk9ZLCAiZGVzdHJveSIpCi0gICBTXyhTRUNDTEFTU19XSU5ET1csIFdJTkRPV19fTUFQLCAibWFwIikKLSAgIFNfKFNFQ0NMQVNTX1dJTkRPVywgV0lORE9XX19VTk1BUCwgInVubWFwIikKLSAgIFNfKFNFQ0NMQVNTX1dJTkRPVywgV0lORE9XX19DSFNUQUNLLCAiY2hzdGFjayIpCi0gICBTXyhTRUNDTEFTU19XSU5ET1csIFdJTkRPV19fQ0hQUk9QTElTVCwgImNocHJvcGxpc3QiKQotICAgU18oU0VDQ0xBU1NfV0lORE9XLCBXSU5ET1dfX0NIUFJPUCwgImNocHJvcCIpCi0gICBTXyhTRUNDTEFTU19XSU5ET1csIFdJTkRPV19fTElTVFBST1AsICJsaXN0cHJvcCIpCi0gICBTXyhTRUNDTEFTU19XSU5ET1csIFdJTkRPV19fR0VUQVRUUiwgImdldGF0dHIiKQotICAgU18oU0VDQ0xBU1NfV0lORE9XLCBXSU5ET1dfX1NFVEFUVFIsICJzZXRhdHRyIikKLSAgIFNfKFNFQ0NMQVNTX1dJTkRPVywgV0lORE9XX19TRVRGT0NVUywgInNldGZvY3VzIikKLSAgIFNfKFNFQ0NMQVNTX1dJTkRPVywgV0lORE9XX19NT1ZFLCAibW92ZSIpCi0gICBTXyhTRUNDTEFTU19XSU5ET1csIFdJTkRPV19fQ0hTRUxFQ1RJT04sICJjaHNlbGVjdGlvbiIpCi0gICBTXyhTRUNDTEFTU19XSU5ET1csIFdJTkRPV19fQ0hQQVJFTlQsICJjaHBhcmVudCIpCi0gICBTXyhTRUNDTEFTU19XSU5ET1csIFdJTkRPV19fQ1RSTExJRkUsICJjdHJsbGlmZSIpCi0gICBTXyhTRUNDTEFTU19XSU5ET1csIFdJTkRPV19fRU5VTUVSQVRFLCAiZW51bWVyYXRlIikKLSAgIFNfKFNFQ0NMQVNTX1dJTkRPVywgV0lORE9XX19UUkFOU1BBUkVOVCwgInRyYW5zcGFyZW50IikKLSAgIFNfKFNFQ0NMQVNTX1dJTkRPVywgV0lORE9XX19NT1VTRU1PVElPTiwgIm1vdXNlbW90aW9uIikKLSAgIFNfKFNFQ0NMQVNTX1dJTkRPVywgV0lORE9XX19DTElFTlRDT01FVkVOVCwgImNsaWVudGNvbWV2ZW50IikKLSAgIFNfKFNFQ0NMQVNTX1dJTkRPVywgV0lORE9XX19JTlBVVEVWRU5ULCAiaW5wdXRldmVudCIpCi0gICBTXyhTRUNDTEFTU19XSU5ET1csIFdJTkRPV19fRFJBV0VWRU5ULCAiZHJhd2V2ZW50IikKLSAgIFNfKFNFQ0NMQVNTX1dJTkRPVywgV0lORE9XX19XSU5ET1dDSEFOR0VFVkVOVCwgIndpbmRvd2NoYW5nZWV2ZW50IikKLSAgIFNfKFNFQ0NMQVNTX1dJTkRPVywgV0lORE9XX19XSU5ET1dDSEFOR0VSRVFVRVNULCAid2luZG93Y2hhbmdlcmVxdWVzdCIpCi0gICBTXyhTRUNDTEFTU19XSU5ET1csIFdJTkRPV19fU0VSVkVSQ0hBTkdFRVZFTlQsICJzZXJ2ZXJjaGFuZ2VldmVudCIpCi0gICBTXyhTRUNDTEFTU19XSU5ET1csIFdJTkRPV19fRVhURU5TSU9ORVZFTlQsICJleHRlbnNpb25ldmVudCIpCi0gICBTXyhTRUNDTEFTU19GT05ULCBGT05UX19MT0FELCAibG9hZCIpCi0gICBTXyhTRUNDTEFTU19GT05ULCBGT05UX19GUkVFLCAiZnJlZSIpCi0gICBTXyhTRUNDTEFTU19GT05ULCBGT05UX19HRVRBVFRSLCAiZ2V0YXR0ciIpCi0gICBTXyhTRUNDTEFTU19GT05ULCBGT05UX19VU0UsICJ1c2UiKQotICAgU18oU0VDQ0xBU1NfQ09MT1JNQVAsIENPTE9STUFQX19DUkVBVEUsICJjcmVhdGUiKQotICAgU18oU0VDQ0xBU1NfQ09MT1JNQVAsIENPTE9STUFQX19GUkVFLCAiZnJlZSIpCi0gICBTXyhTRUNDTEFTU19DT0xPUk1BUCwgQ09MT1JNQVBfX0lOU1RBTEwsICJpbnN0YWxsIikKLSAgIFNfKFNFQ0NMQVNTX0NPTE9STUFQLCBDT0xPUk1BUF9fVU5JTlNUQUxMLCAidW5pbnN0YWxsIikKLSAgIFNfKFNFQ0NMQVNTX0NPTE9STUFQLCBDT0xPUk1BUF9fTElTVCwgImxpc3QiKQotICAgU18oU0VDQ0xBU1NfQ09MT1JNQVAsIENPTE9STUFQX19SRUFELCAicmVhZCIpCi0gICBTXyhTRUNDTEFTU19DT0xPUk1BUCwgQ09MT1JNQVBfX1NUT1JFLCAic3RvcmUiKQotICAgU18oU0VDQ0xBU1NfQ09MT1JNQVAsIENPTE9STUFQX19HRVRBVFRSLCAiZ2V0YXR0ciIpCi0gICBTXyhTRUNDTEFTU19DT0xPUk1BUCwgQ09MT1JNQVBfX1NFVEFUVFIsICJzZXRhdHRyIikKLSAgIFNfKFNFQ0NMQVNTX1BST1BFUlRZLCBQUk9QRVJUWV9fQ1JFQVRFLCAiY3JlYXRlIikKLSAgIFNfKFNFQ0NMQVNTX1BST1BFUlRZLCBQUk9QRVJUWV9fRlJFRSwgImZyZWUiKQotICAgU18oU0VDQ0xBU1NfUFJPUEVSVFksIFBST1BFUlRZX19SRUFELCAicmVhZCIpCi0gICBTXyhTRUNDTEFTU19QUk9QRVJUWSwgUFJPUEVSVFlfX1dSSVRFLCAid3JpdGUiKQotICAgU18oU0VDQ0xBU1NfQ1VSU09SLCBDVVJTT1JfX0NSRUFURSwgImNyZWF0ZSIpCi0gICBTXyhTRUNDTEFTU19DVVJTT1IsIENVUlNPUl9fQ1JFQVRFR0xZUEgsICJjcmVhdGVnbHlwaCIpCi0gICBTXyhTRUNDTEFTU19DVVJTT1IsIENVUlNPUl9fRlJFRSwgImZyZWUiKQotICAgU18oU0VDQ0xBU1NfQ1VSU09SLCBDVVJTT1JfX0FTU0lHTiwgImFzc2lnbiIpCi0gICBTXyhTRUNDTEFTU19DVVJTT1IsIENVUlNPUl9fU0VUQVRUUiwgInNldGF0dHIiKQotICAgU18oU0VDQ0xBU1NfWENMSUVOVCwgWENMSUVOVF9fS0lMTCwgImtpbGwiKQotICAgU18oU0VDQ0xBU1NfWElOUFVULCBYSU5QVVRfX0xPT0tVUCwgImxvb2t1cCIpCi0gICBTXyhTRUNDTEFTU19YSU5QVVQsIFhJTlBVVF9fR0VUQVRUUiwgImdldGF0dHIiKQotICAgU18oU0VDQ0xBU1NfWElOUFVULCBYSU5QVVRfX1NFVEFUVFIsICJzZXRhdHRyIikKLSAgIFNfKFNFQ0NMQVNTX1hJTlBVVCwgWElOUFVUX19TRVRGT0NVUywgInNldGZvY3VzIikKLSAgIFNfKFNFQ0NMQVNTX1hJTlBVVCwgWElOUFVUX19XQVJQUE9JTlRFUiwgIndhcnBwb2ludGVyIikKLSAgIFNfKFNFQ0NMQVNTX1hJTlBVVCwgWElOUFVUX19BQ1RJVkVHUkFCLCAiYWN0aXZlZ3JhYiIpCi0gICBTXyhTRUNDTEFTU19YSU5QVVQsIFhJTlBVVF9fUEFTU0lWRUdSQUIsICJwYXNzaXZlZ3JhYiIpCi0gICBTXyhTRUNDTEFTU19YSU5QVVQsIFhJTlBVVF9fVU5HUkFCLCAidW5ncmFiIikKLSAgIFNfKFNFQ0NMQVNTX1hJTlBVVCwgWElOUFVUX19CRUxMLCAiYmVsbCIpCi0gICBTXyhTRUNDTEFTU19YSU5QVVQsIFhJTlBVVF9fTU9VU0VNT1RJT04sICJtb3VzZW1vdGlvbiIpCi0gICBTXyhTRUNDTEFTU19YSU5QVVQsIFhJTlBVVF9fUkVMQUJFTElOUFVULCAicmVsYWJlbGlucHV0IikKLSAgIFNfKFNFQ0NMQVNTX1hTRVJWRVIsIFhTRVJWRVJfX1NDUkVFTlNBVkVSLCAic2NyZWVuc2F2ZXIiKQotICAgU18oU0VDQ0xBU1NfWFNFUlZFUiwgWFNFUlZFUl9fR0VUSE9TVExJU1QsICJnZXRob3N0bGlzdCIpCi0gICBTXyhTRUNDTEFTU19YU0VSVkVSLCBYU0VSVkVSX19TRVRIT1NUTElTVCwgInNldGhvc3RsaXN0IikKLSAgIFNfKFNFQ0NMQVNTX1hTRVJWRVIsIFhTRVJWRVJfX0dFVEZPTlRQQVRILCAiZ2V0Zm9udHBhdGgiKQotICAgU18oU0VDQ0xBU1NfWFNFUlZFUiwgWFNFUlZFUl9fU0VURk9OVFBBVEgsICJzZXRmb250cGF0aCIpCi0gICBTXyhTRUNDTEFTU19YU0VSVkVSLCBYU0VSVkVSX19HRVRBVFRSLCAiZ2V0YXR0ciIpCi0gICBTXyhTRUNDTEFTU19YU0VSVkVSLCBYU0VSVkVSX19HUkFCLCAiZ3JhYiIpCi0gICBTXyhTRUNDTEFTU19YU0VSVkVSLCBYU0VSVkVSX19VTkdSQUIsICJ1bmdyYWIiKQotICAgU18oU0VDQ0xBU1NfWEVYVEVOU0lPTiwgWEVYVEVOU0lPTl9fUVVFUlksICJxdWVyeSIpCi0gICBTXyhTRUNDTEFTU19YRVhURU5TSU9OLCBYRVhURU5TSU9OX19VU0UsICJ1c2UiKQotICAgU18oU0VDQ0xBU1NfUEFYLCBQQVhfX1BBR0VFWEVDLCAicGFnZWV4ZWMiKQotICAgU18oU0VDQ0xBU1NfUEFYLCBQQVhfX0VNVVRSQU1QLCAiZW11dHJhbXAiKQotICAgU18oU0VDQ0xBU1NfUEFYLCBQQVhfX01QUk9URUNULCAibXByb3RlY3QiKQotICAgU18oU0VDQ0xBU1NfUEFYLCBQQVhfX1JBTkRNTUFQLCAicmFuZG1tYXAiKQotICAgU18oU0VDQ0xBU1NfUEFYLCBQQVhfX1JBTkRFWEVDLCAicmFuZGV4ZWMiKQotICAgU18oU0VDQ0xBU1NfUEFYLCBQQVhfX1NFR01FWEVDLCAic2VnbWV4ZWMiKQogICAgU18oU0VDQ0xBU1NfTkVUTElOS19ST1VURV9TT0NLRVQsIE5FVExJTktfUk9VVEVfU09DS0VUX19OTE1TR19SRUFELCAibmxtc2dfcmVhZCIpCiAgICBTXyhTRUNDTEFTU19ORVRMSU5LX1JPVVRFX1NPQ0tFVCwgTkVUTElOS19ST1VURV9TT0NLRVRfX05MTVNHX1dSSVRFLCAibmxtc2dfd3JpdGUiKQogICAgU18oU0VDQ0xBU1NfTkVUTElOS19GSVJFV0FMTF9TT0NLRVQsIE5FVExJTktfRklSRVdBTExfU09DS0VUX19OTE1TR19SRUFELCAibmxtc2dfcmVhZCIpCkBAIC0yMzIsMTYgKzE0Miw2IEBACiAgICBTXyhTRUNDTEFTU19ORVRMSU5LX0FVRElUX1NPQ0tFVCwgTkVUTElOS19BVURJVF9TT0NLRVRfX05MTVNHX1JFQURQUklWLCAibmxtc2dfcmVhZHByaXYiKQogICAgU18oU0VDQ0xBU1NfTkVUTElOS19JUDZGV19TT0NLRVQsIE5FVExJTktfSVA2RldfU09DS0VUX19OTE1TR19SRUFELCAibmxtc2dfcmVhZCIpCiAgICBTXyhTRUNDTEFTU19ORVRMSU5LX0lQNkZXX1NPQ0tFVCwgTkVUTElOS19JUDZGV19TT0NLRVRfX05MTVNHX1dSSVRFLCAibmxtc2dfd3JpdGUiKQotICAgU18oU0VDQ0xBU1NfREJVUywgREJVU19fQUNRVUlSRV9TVkMsICJhY3F1aXJlX3N2YyIpCi0gICBTXyhTRUNDTEFTU19EQlVTLCBEQlVTX19TRU5EX01TRywgInNlbmRfbXNnIikKLSAgIFNfKFNFQ0NMQVNTX05TQ0QsIE5TQ0RfX0dFVFBXRCwgImdldHB3ZCIpCi0gICBTXyhTRUNDTEFTU19OU0NELCBOU0NEX19HRVRHUlAsICJnZXRncnAiKQotICAgU18oU0VDQ0xBU1NfTlNDRCwgTlNDRF9fR0VUSE9TVCwgImdldGhvc3QiKQotICAgU18oU0VDQ0xBU1NfTlNDRCwgTlNDRF9fR0VUU1RBVCwgImdldHN0YXQiKQotICAgU18oU0VDQ0xBU1NfTlNDRCwgTlNDRF9fQURNSU4sICJhZG1pbiIpCi0gICBTXyhTRUNDTEFTU19OU0NELCBOU0NEX19TSE1FTVBXRCwgInNobWVtcHdkIikKLSAgIFNfKFNFQ0NMQVNTX05TQ0QsIE5TQ0RfX1NITUVNR1JQLCAic2htZW1ncnAiKQotICAgU18oU0VDQ0xBU1NfTlNDRCwgTlNDRF9fU0hNRU1IT1NULCAic2htZW1ob3N0IikKICAgIFNfKFNFQ0NMQVNTX0FTU09DSUFUSU9OLCBBU1NPQ0lBVElPTl9fU0VORFRPLCAic2VuZHRvIikKICAgIFNfKFNFQ0NMQVNTX0FTU09DSUFUSU9OLCBBU1NPQ0lBVElPTl9fUkVDVkZST00sICJyZWN2ZnJvbSIpCiAgICBTXyhTRUNDTEFTU19BU1NPQ0lBVElPTiwgQVNTT0NJQVRJT05fX1NFVENPTlRFWFQsICJzZXRjb250ZXh0IikKQEAgLTI1Niw3ICsxNTYsNSBAQAogICAgU18oU0VDQ0xBU1NfS0VZLCBLRVlfX0xJTkssICJsaW5rIikKICAgIFNfKFNFQ0NMQVNTX0tFWSwgS0VZX19TRVRBVFRSLCAic2V0YXR0ciIpCiAgICBTXyhTRUNDTEFTU19LRVksIEtFWV9fQ1JFQVRFLCAiY3JlYXRlIikKLSAgIFNfKFNFQ0NMQVNTX0NPTlRFWFQsIENPTlRFWFRfX1RSQU5TTEFURSwgInRyYW5zbGF0ZSIpCi0gICBTXyhTRUNDTEFTU19DT05URVhULCBDT05URVhUX19DT05UQUlOUywgImNvbnRhaW5zIikKICAgIFNfKFNFQ0NMQVNTX0RDQ1BfU09DS0VULCBEQ0NQX1NPQ0tFVF9fTk9ERV9CSU5ELCAibm9kZV9iaW5kIikKICAgIFNfKFNFQ0NMQVNTX0RDQ1BfU09DS0VULCBEQ0NQX1NPQ0tFVF9fTkFNRV9DT05ORUNULCAibmFtZV9jb25uZWN0IikKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9hdl9wZXJtaXNzaW9ucy5oIGIvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL2F2X3Blcm1pc3Npb25zLmgKaW5kZXggMmRlNGI1Zi4uNWZlZTE3MyAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL2F2X3Blcm1pc3Npb25zLmgKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL2F2X3Blcm1pc3Npb25zLmgKQEAgLTE2LDcgKzE2LDYgQEAKICNkZWZpbmUgQ09NTU9OX0ZJTEVfX1NXQVBPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDQwMDBVTAogI2RlZmluZSBDT01NT05fRklMRV9fUVVPVEFPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwODAwMFVMCiAjZGVmaW5lIENPTU1PTl9GSUxFX19NT1VOVE9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwMDAwVUwKLQogI2RlZmluZSBDT01NT05fU09DS0VUX19JT0NUTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMVVMCiAjZGVmaW5lIENPTU1PTl9TT0NLRVRfX1JFQUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyVUwKICNkZWZpbmUgQ09NTU9OX1NPQ0tFVF9fV1JJVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDRVTApAQCAtMzksNyArMzgsNiBAQAogI2RlZmluZSBDT01NT05fU09DS0VUX19SRUNWX01TRyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA4MDAwMFVMCiAjZGVmaW5lIENPTU1PTl9TT0NLRVRfX1NFTkRfTVNHICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAwMDAwVUwKICNkZWZpbmUgQ09NTU9OX1NPQ0tFVF9fTkFNRV9CSU5EICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMDAwMDBVTAotCiAjZGVmaW5lIENPTU1PTl9JUENfX0NSRUFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxVUwKICNkZWZpbmUgQ09NTU9OX0lQQ19fREVTVFJPWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDJVTAogI2RlZmluZSBDT01NT05fSVBDX19HRVRBVFRSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNFVMCkBAIC00OSw3ICs0Nyw2IEBACiAjZGVmaW5lIENPTU1PTl9JUENfX0FTU09DSUFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwVUwKICNkZWZpbmUgQ09NTU9OX0lQQ19fVU5JWF9SRUFEICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODBVTAogI2RlZmluZSBDT01NT05fSVBDX19VTklYX1dSSVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMFVMCi0KICNkZWZpbmUgRklMRVNZU1RFTV9fTU9VTlQgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMVVMCiAjZGVmaW5lIEZJTEVTWVNURU1fX1JFTU9VTlQgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDJVTAogI2RlZmluZSBGSUxFU1lTVEVNX19VTk1PVU5UICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0VUwKQEAgLTYwLDcgKzU3LDYgQEAKICNkZWZpbmUgRklMRVNZU1RFTV9fQVNTT0NJQVRFICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MFVMCiAjZGVmaW5lIEZJTEVTWVNURU1fX1FVT1RBTU9EICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDBVTAogI2RlZmluZSBGSUxFU1lTVEVNX19RVU9UQUdFVCAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjAwVUwKLQogI2RlZmluZSBESVJfX0lPQ1RMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxVUwKICNkZWZpbmUgRElSX19SRUFEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMlVMCiAjZGVmaW5lIERJUl9fV1JJVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDRVTApAQCAtNzgsMTMgKzc0LDExIEBACiAjZGVmaW5lIERJUl9fU1dBUE9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDQwMDBVTAogI2RlZmluZSBESVJfX1FVT1RBT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA4MDAwVUwKICNkZWZpbmUgRElSX19NT1VOVE9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMFVMCi0KICNkZWZpbmUgRElSX19BRERfTkFNRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyMDAwMFVMCiAjZGVmaW5lIERJUl9fUkVNT1ZFX05BTUUgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNDAwMDBVTAogI2RlZmluZSBESVJfX1JFUEFSRU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDgwMDAwVUwKICNkZWZpbmUgRElSX19TRUFSQ0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwMDAwMFVMCiAjZGVmaW5lIERJUl9fUk1ESVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMDAwMDBVTAotCiAjZGVmaW5lIEZJTEVfX0lPQ1RMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDFVTAogI2RlZmluZSBGSUxFX19SRUFEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyVUwKICNkZWZpbmUgRklMRV9fV1JJVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNFVMCkBAIC0xMDIsMTEgKzk2LDkgQEAKICNkZWZpbmUgRklMRV9fU1dBUE9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwNDAwMFVMCiAjZGVmaW5lIEZJTEVfX1FVT1RBT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDgwMDBVTAogI2RlZmluZSBGSUxFX19NT1VOVE9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwMDAwVUwKLQogI2RlZmluZSBGSUxFX19FWEVDVVRFX05PX1RSQU5TICAgICAgICAgICAgICAgICAgICAweDAwMDIwMDAwVUwKICNkZWZpbmUgRklMRV9fRU5UUllQT0lOVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0MDAwMFVMCiAjZGVmaW5lIEZJTEVfX0VYRUNNT0QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwODAwMDBVTAotCiAjZGVmaW5lIExOS19GSUxFX19JT0NUTCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDFVTAogI2RlZmluZSBMTktfRklMRV9fUkVBRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyVUwKICNkZWZpbmUgTE5LX0ZJTEVfX1dSSVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNFVMCkBAIC0xMjQsNyArMTE2LDYgQEAKICNkZWZpbmUgTE5LX0ZJTEVfX1NXQVBPTiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwNDAwMFVMCiAjZGVmaW5lIExOS19GSUxFX19RVU9UQU9OICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDgwMDBVTAogI2RlZmluZSBMTktfRklMRV9fTU9VTlRPTiAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwMDAwVUwKLQogI2RlZmluZSBDSFJfRklMRV9fSU9DVEwgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxVUwKICNkZWZpbmUgQ0hSX0ZJTEVfX1JFQUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMlVMCiAjZGVmaW5lIENIUl9GSUxFX19XUklURSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDRVTApAQCAtMTQyLDExICsxMzMsOSBAQAogI2RlZmluZSBDSFJfRklMRV9fU1dBUE9OICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA0MDAwVUwKICNkZWZpbmUgQ0hSX0ZJTEVfX1FVT1RBT04gICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwODAwMFVMCiAjZGVmaW5lIENIUl9GSUxFX19NT1VOVE9OICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAwMDBVTAotCiAjZGVmaW5lIENIUl9GSUxFX19FWEVDVVRFX05PX1RSQU5TICAgICAgICAgICAgICAgIDB4MDAwMjAwMDBVTAogI2RlZmluZSBDSFJfRklMRV9fRU5UUllQT0lOVCAgICAgICAgICAgICAgICAgICAgICAweDAwMDQwMDAwVUwKICNkZWZpbmUgQ0hSX0ZJTEVfX0VYRUNNT0QgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA4MDAwMFVMCi0KICNkZWZpbmUgQkxLX0ZJTEVfX0lPQ1RMICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMVVMCiAjZGVmaW5lIEJMS19GSUxFX19SRUFEICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDJVTAogI2RlZmluZSBCTEtfRklMRV9fV1JJVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0VUwKQEAgLTE2NCw3ICsxNTMsNiBAQAogI2RlZmluZSBCTEtfRklMRV9fU1dBUE9OICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA0MDAwVUwKICNkZWZpbmUgQkxLX0ZJTEVfX1FVT1RBT04gICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwODAwMFVMCiAjZGVmaW5lIEJMS19GSUxFX19NT1VOVE9OICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAwMDBVTAotCiAjZGVmaW5lIFNPQ0tfRklMRV9fSU9DVEwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDFVTAogI2RlZmluZSBTT0NLX0ZJTEVfX1JFQUQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyVUwKICNkZWZpbmUgU09DS19GSUxFX19XUklURSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNFVMCkBAIC0xODIsNyArMTcwLDYgQEAKICNkZWZpbmUgU09DS19GSUxFX19TV0FQT04gICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwNDAwMFVMCiAjZGVmaW5lIFNPQ0tfRklMRV9fUVVPVEFPTiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDgwMDBVTAogI2RlZmluZSBTT0NLX0ZJTEVfX01PVU5UT04gICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwMDAwVUwKLQogI2RlZmluZSBGSUZPX0ZJTEVfX0lPQ1RMICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxVUwKICNkZWZpbmUgRklGT19GSUxFX19SRUFEICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMlVMCiAjZGVmaW5lIEZJRk9fRklMRV9fV1JJVEUgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDRVTApAQCAtMjAwLDkgKzE4Nyw3IEBACiAjZGVmaW5lIEZJRk9fRklMRV9fU1dBUE9OICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDQwMDBVTAogI2RlZmluZSBGSUZPX0ZJTEVfX1FVT1RBT04gICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA4MDAwVUwKICNkZWZpbmUgRklGT19GSUxFX19NT1VOVE9OICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMFVMCi0KICNkZWZpbmUgRkRfX1VTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMVVMCi0KICNkZWZpbmUgU09DS0VUX19JT0NUTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMVVMCiAjZGVmaW5lIFNPQ0tFVF9fUkVBRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDJVTAogI2RlZmluZSBTT0NLRVRfX1dSSVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0VUwKQEAgLTIyNSw3ICsyMTAsNiBAQAogI2RlZmluZSBTT0NLRVRfX1JFQ1ZfTVNHICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDgwMDAwVUwKICNkZWZpbmUgU09DS0VUX19TRU5EX01TRyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwMDAwMFVMCiAjZGVmaW5lIFNPQ0tFVF9fTkFNRV9CSU5EICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMDAwMDBVTAotCiAjZGVmaW5lIFRDUF9TT0NLRVRfX0lPQ1RMICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDFVTAogI2RlZmluZSBUQ1BfU09DS0VUX19SRUFEICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyVUwKICNkZWZpbmUgVENQX1NPQ0tFVF9fV1JJVEUgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNFVMCkBAIC0yNDgsMTMgKzIzMiwxMSBAQAogI2RlZmluZSBUQ1BfU09DS0VUX19SRUNWX01TRyAgICAgICAgICAgICAgICAgICAgICAweDAwMDgwMDAwVUwKICNkZWZpbmUgVENQX1NPQ0tFVF9fU0VORF9NU0cgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwMDAwMFVMCiAjZGVmaW5lIFRDUF9TT0NLRVRfX05BTUVfQklORCAgICAgICAgICAgICAgICAgICAgIDB4MDAyMDAwMDBVTAotCiAjZGVmaW5lIFRDUF9TT0NLRVRfX0NPTk5FQ1RUTyAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDAwMDBVTAogI2RlZmluZSBUQ1BfU09DS0VUX19ORVdDT05OICAgICAgICAgICAgICAgICAgICAgICAweDAwODAwMDAwVUwKICNkZWZpbmUgVENQX1NPQ0tFVF9fQUNDRVBURlJPTSAgICAgICAgICAgICAgICAgICAgMHgwMTAwMDAwMFVMCiAjZGVmaW5lIFRDUF9TT0NLRVRfX05PREVfQklORCAgICAgICAgICAgICAgICAgICAgIDB4MDIwMDAwMDBVTAogI2RlZmluZSBUQ1BfU09DS0VUX19OQU1FX0NPTk5FQ1QgICAgICAgICAgICAgICAgICAweDA0MDAwMDAwVUwKLQogI2RlZmluZSBVRFBfU09DS0VUX19JT0NUTCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxVUwKICNkZWZpbmUgVURQX1NPQ0tFVF9fUkVBRCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMlVMCiAjZGVmaW5lIFVEUF9TT0NLRVRfX1dSSVRFICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDRVTApAQCAtMjc3LDkgKzI1OSw3IEBACiAjZGVmaW5lIFVEUF9TT0NLRVRfX1JFQ1ZfTVNHICAgICAgICAgICAgICAgICAgICAgIDB4MDAwODAwMDBVTAogI2RlZmluZSBVRFBfU09DS0VUX19TRU5EX01TRyAgICAgICAgICAgICAgICAgICAgICAweDAwMTAwMDAwVUwKICNkZWZpbmUgVURQX1NPQ0tFVF9fTkFNRV9CSU5EICAgICAgICAgICAgICAgICAgICAgMHgwMDIwMDAwMFVMCi0KICNkZWZpbmUgVURQX1NPQ0tFVF9fTk9ERV9CSU5EICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDAwMFVMCi0KICNkZWZpbmUgUkFXSVBfU09DS0VUX19JT0NUTCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMVVMCiAjZGVmaW5lIFJBV0lQX1NPQ0tFVF9fUkVBRCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDJVTAogI2RlZmluZSBSQVdJUF9TT0NLRVRfX1dSSVRFICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0VUwKQEAgLTMwMiw5ICsyODIsNyBAQAogI2RlZmluZSBSQVdJUF9TT0NLRVRfX1JFQ1ZfTVNHICAgICAgICAgICAgICAgICAgICAweDAwMDgwMDAwVUwKICNkZWZpbmUgUkFXSVBfU09DS0VUX19TRU5EX01TRyAgICAgICAgICAgICAgICAgICAgMHgwMDEwMDAwMFVMCiAjZGVmaW5lIFJBV0lQX1NPQ0tFVF9fTkFNRV9CSU5EICAgICAgICAgICAgICAgICAgIDB4MDAyMDAwMDBVTAotCiAjZGVmaW5lIFJBV0lQX1NPQ0tFVF9fTk9ERV9CSU5EICAgICAgICAgICAgICAgICAgIDB4MDA0MDAwMDBVTAotCiAjZGVmaW5lIE5PREVfX1RDUF9SRUNWICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDFVTAogI2RlZmluZSBOT0RFX19UQ1BfU0VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyVUwKICNkZWZpbmUgTk9ERV9fVURQX1JFQ1YgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNFVMCkBAIC0zMTQsNyArMjkyLDYgQEAKICNkZWZpbmUgTk9ERV9fRU5GT1JDRV9ERVNUICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MFVMCiAjZGVmaW5lIE5PREVfX0RDQ1BfUkVDViAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODBVTAogI2RlZmluZSBOT0RFX19EQ0NQX1NFTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAwVUwKLQogI2RlZmluZSBORVRJRl9fVENQX1JFQ1YgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxVUwKICNkZWZpbmUgTkVUSUZfX1RDUF9TRU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMlVMCiAjZGVmaW5lIE5FVElGX19VRFBfUkVDViAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDRVTApAQCAtMzIzLDcgKzMwMCw2IEBACiAjZGVmaW5lIE5FVElGX19SQVdJUF9TRU5EICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjBVTAogI2RlZmluZSBORVRJRl9fRENDUF9SRUNWICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwVUwKICNkZWZpbmUgTkVUSUZfX0RDQ1BfU0VORCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MFVMCi0KICNkZWZpbmUgTkVUTElOS19TT0NLRVRfX0lPQ1RMICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMVVMCiAjZGVmaW5lIE5FVExJTktfU09DS0VUX19SRUFEICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDJVTAogI2RlZmluZSBORVRMSU5LX1NPQ0tFVF9fV1JJVEUgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0VUwKQEAgLTM0Niw3ICszMjIsNiBAQAogI2RlZmluZSBORVRMSU5LX1NPQ0tFVF9fUkVDVl9NU0cgICAgICAgICAgICAgICAgICAweDAwMDgwMDAwVUwKICNkZWZpbmUgTkVUTElOS19TT0NLRVRfX1NFTkRfTVNHICAgICAgICAgICAgICAgICAgMHgwMDEwMDAwMFVMCiAjZGVmaW5lIE5FVExJTktfU09DS0VUX19OQU1FX0JJTkQgICAgICAgICAgICAgICAgIDB4MDAyMDAwMDBVTAotCiAjZGVmaW5lIFBBQ0tFVF9TT0NLRVRfX0lPQ1RMICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDFVTAogI2RlZmluZSBQQUNLRVRfU09DS0VUX19SRUFEICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyVUwKICNkZWZpbmUgUEFDS0VUX1NPQ0tFVF9fV1JJVEUgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNFVMCkBAIC0zNjksNyArMzQ0LDYgQEAKICNkZWZpbmUgUEFDS0VUX1NPQ0tFVF9fUkVDVl9NU0cgICAgICAgICAgICAgICAgICAgMHgwMDA4MDAwMFVMCiAjZGVmaW5lIFBBQ0tFVF9TT0NLRVRfX1NFTkRfTVNHICAgICAgICAgICAgICAgICAgIDB4MDAxMDAwMDBVTAogI2RlZmluZSBQQUNLRVRfU09DS0VUX19OQU1FX0JJTkQgICAgICAgICAgICAgICAgICAweDAwMjAwMDAwVUwKLQogI2RlZmluZSBLRVlfU09DS0VUX19JT0NUTCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxVUwKICNkZWZpbmUgS0VZX1NPQ0tFVF9fUkVBRCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMlVMCiAjZGVmaW5lIEtFWV9TT0NLRVRfX1dSSVRFICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDRVTApAQCAtMzkyLDcgKzM2Niw2IEBACiAjZGVmaW5lIEtFWV9TT0NLRVRfX1JFQ1ZfTVNHICAgICAgICAgICAgICAgICAgICAgIDB4MDAwODAwMDBVTAogI2RlZmluZSBLRVlfU09DS0VUX19TRU5EX01TRyAgICAgICAgICAgICAgICAgICAgICAweDAwMTAwMDAwVUwKICNkZWZpbmUgS0VZX1NPQ0tFVF9fTkFNRV9CSU5EICAgICAgICAgICAgICAgICAgICAgMHgwMDIwMDAwMFVMCi0KICNkZWZpbmUgVU5JWF9TVFJFQU1fU09DS0VUX19JT0NUTCAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMVVMCiAjZGVmaW5lIFVOSVhfU1RSRUFNX1NPQ0tFVF9fUkVBRCAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDJVTAogI2RlZmluZSBVTklYX1NUUkVBTV9TT0NLRVRfX1dSSVRFICAgICAgICAgICAgICAgICAweDAwMDAwMDA0VUwKQEAgLTQxNSwxMSArMzg4LDkgQEAKICNkZWZpbmUgVU5JWF9TVFJFQU1fU09DS0VUX19SRUNWX01TRyAgICAgICAgICAgICAgMHgwMDA4MDAwMFVMCiAjZGVmaW5lIFVOSVhfU1RSRUFNX1NPQ0tFVF9fU0VORF9NU0cgICAgICAgICAgICAgIDB4MDAxMDAwMDBVTAogI2RlZmluZSBVTklYX1NUUkVBTV9TT0NLRVRfX05BTUVfQklORCAgICAgICAgICAgICAweDAwMjAwMDAwVUwKLQogI2RlZmluZSBVTklYX1NUUkVBTV9TT0NLRVRfX0NPTk5FQ1RUTyAgICAgICAgICAgICAweDAwNDAwMDAwVUwKICNkZWZpbmUgVU5JWF9TVFJFQU1fU09DS0VUX19ORVdDT05OICAgICAgICAgICAgICAgMHgwMDgwMDAwMFVMCiAjZGVmaW5lIFVOSVhfU1RSRUFNX1NPQ0tFVF9fQUNDRVBURlJPTSAgICAgICAgICAgIDB4MDEwMDAwMDBVTAotCiAjZGVmaW5lIFVOSVhfREdSQU1fU09DS0VUX19JT0NUTCAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDFVTAogI2RlZmluZSBVTklYX0RHUkFNX1NPQ0tFVF9fUkVBRCAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyVUwKICNkZWZpbmUgVU5JWF9ER1JBTV9TT0NLRVRfX1dSSVRFICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNFVMCkBAIC00NDIsNyArNDEzLDYgQEAKICNkZWZpbmUgVU5JWF9ER1JBTV9TT0NLRVRfX1JFQ1ZfTVNHICAgICAgICAgICAgICAgMHgwMDA4MDAwMFVMCiAjZGVmaW5lIFVOSVhfREdSQU1fU09DS0VUX19TRU5EX01TRyAgICAgICAgICAgICAgIDB4MDAxMDAwMDBVTAogI2RlZmluZSBVTklYX0RHUkFNX1NPQ0tFVF9fTkFNRV9CSU5EICAgICAgICAgICAgICAweDAwMjAwMDAwVUwKLQogI2RlZmluZSBQUk9DRVNTX19GT1JLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxVUwKICNkZWZpbmUgUFJPQ0VTU19fVFJBTlNJVElPTiAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMlVMCiAjZGVmaW5lIFBST0NFU1NfX1NJR0NITEQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDRVTApAQCAtNDczLDcgKzQ0Myw2IEBACiAjZGVmaW5lIFBST0NFU1NfX0VYRUNIRUFQICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMDAwMDBVTAogI2RlZmluZSBQUk9DRVNTX19TRVRLRVlDUkVBVEUgICAgICAgICAgICAgICAgICAgICAweDEwMDAwMDAwVUwKICNkZWZpbmUgUFJPQ0VTU19fU0VUU09DS0NSRUFURSAgICAgICAgICAgICAgICAgICAgMHgyMDAwMDAwMFVMCi0KICNkZWZpbmUgSVBDX19DUkVBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMVVMCiAjZGVmaW5lIElQQ19fREVTVFJPWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDJVTAogI2RlZmluZSBJUENfX0dFVEFUVFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0VUwKQEAgLTQ4Myw3ICs0NTIsNiBAQAogI2RlZmluZSBJUENfX0FTU09DSUFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwVUwKICNkZWZpbmUgSVBDX19VTklYX1JFQUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MFVMCiAjZGVmaW5lIElQQ19fVU5JWF9XUklURSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDBVTAotCiAjZGVmaW5lIFNFTV9fQ1JFQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDFVTAogI2RlZmluZSBTRU1fX0RFU1RST1kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyVUwKICNkZWZpbmUgU0VNX19HRVRBVFRSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNFVMCkBAIC00OTMsNyArNDYxLDYgQEAKICNkZWZpbmUgU0VNX19BU1NPQ0lBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MFVMCiAjZGVmaW5lIFNFTV9fVU5JWF9SRUFEICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODBVTAogI2RlZmluZSBTRU1fX1VOSVhfV1JJVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAwVUwKLQogI2RlZmluZSBNU0dRX19DUkVBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxVUwKICNkZWZpbmUgTVNHUV9fREVTVFJPWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMlVMCiAjZGVmaW5lIE1TR1FfX0dFVEFUVFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDRVTApAQCAtNTAzLDEyICs0NzAsOSBAQAogI2RlZmluZSBNU0dRX19BU1NPQ0lBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwVUwKICNkZWZpbmUgTVNHUV9fVU5JWF9SRUFEICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MFVMCiAjZGVmaW5lIE1TR1FfX1VOSVhfV1JJVEUgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDBVTAotCiAjZGVmaW5lIE1TR1FfX0VOUVVFVUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDBVTAotCiAjZGVmaW5lIE1TR19fU0VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDFVTAogI2RlZmluZSBNU0dfX1JFQ0VJVkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyVUwKLQogI2RlZmluZSBTSE1fX0NSRUFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxVUwKICNkZWZpbmUgU0hNX19ERVNUUk9ZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMlVMCiAjZGVmaW5lIFNITV9fR0VUQVRUUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDRVTApAQCAtNTE4LDkgKzQ4Miw3IEBACiAjZGVmaW5lIFNITV9fQVNTT0NJQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDBVTAogI2RlZmluZSBTSE1fX1VOSVhfUkVBRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDgwVUwKICNkZWZpbmUgU0hNX19VTklYX1dSSVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMFVMCi0KICNkZWZpbmUgU0hNX19MT0NLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMFVMCi0KICNkZWZpbmUgU0VDVVJJVFlfX0NPTVBVVEVfQVYgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMVVMCiAjZGVmaW5lIFNFQ1VSSVRZX19DT01QVVRFX0NSRUFURSAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDJVTAogI2RlZmluZSBTRUNVUklUWV9fQ09NUFVURV9NRU1CRVIgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0VUwKQEAgLTUzMiwxMiArNDk0LDEwIEBACiAjZGVmaW5lIFNFQ1VSSVRZX19TRVRCT09MICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDBVTAogI2RlZmluZSBTRUNVUklUWV9fU0VUU0VDUEFSQU0gICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjAwVUwKICNkZWZpbmUgU0VDVVJJVFlfX1NFVENIRUNLUkVRUFJPVCAgICAgICAgICAgICAgICAgMHgwMDAwMDQwMFVMCi0KICNkZWZpbmUgU1lTVEVNX19JUENfSU5GTyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMVVMCiAjZGVmaW5lIFNZU1RFTV9fU1lTTE9HX1JFQUQgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDJVTAogI2RlZmluZSBTWVNURU1fX1NZU0xPR19NT0QgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0VUwKICNkZWZpbmUgU1lTVEVNX19TWVNMT0dfQ09OU09MRSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOFVMCi0KICNkZWZpbmUgQ0FQQUJJTElUWV9fQ0hPV04gICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMVVMCiAjZGVmaW5lIENBUEFCSUxJVFlfX0RBQ19PVkVSUklERSAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDJVTAogI2RlZmluZSBDQVBBQklMSVRZX19EQUNfUkVBRF9TRUFSQ0ggICAgICAgICAgICAgICAweDAwMDAwMDA0VUwKQEAgLTU2OSwxMTAgKzUyOSw2IEBACiAjZGVmaW5lIENBUEFCSUxJVFlfX0xFQVNFICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMDAwMDBVTAogI2RlZmluZSBDQVBBQklMSVRZX19BVURJVF9XUklURSAgICAgICAgICAgICAgICAgICAweDIwMDAwMDAwVUwKICNkZWZpbmUgQ0FQQUJJTElUWV9fQVVESVRfQ09OVFJPTCAgICAgICAgICAgICAgICAgMHg0MDAwMDAwMFVMCi0KLSNkZWZpbmUgUEFTU1dEX19QQVNTV0QgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMVVMCi0jZGVmaW5lIFBBU1NXRF9fQ0hGTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDJVTAotI2RlZmluZSBQQVNTV0RfX0NIU0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0VUwKLSNkZWZpbmUgUEFTU1dEX19ST09UT0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOFVMCi0jZGVmaW5lIFBBU1NXRF9fQ1JPTlRBQiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTBVTAotCi0jZGVmaW5lIERSQVdBQkxFX19DUkVBVEUgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDFVTAotI2RlZmluZSBEUkFXQUJMRV9fREVTVFJPWSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyVUwKLSNkZWZpbmUgRFJBV0FCTEVfX0RSQVcgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNFVMCi0jZGVmaW5lIERSQVdBQkxFX19DT1BZICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDhVTAotI2RlZmluZSBEUkFXQUJMRV9fR0VUQVRUUiAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwVUwKLQotI2RlZmluZSBHQ19fQ1JFQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxVUwKLSNkZWZpbmUgR0NfX0ZSRUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMlVMCi0jZGVmaW5lIEdDX19HRVRBVFRSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDRVTAotI2RlZmluZSBHQ19fU0VUQVRUUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4VUwKLQotI2RlZmluZSBXSU5ET1dfX0FERENISUxEICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxVUwKLSNkZWZpbmUgV0lORE9XX19DUkVBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMlVMCi0jZGVmaW5lIFdJTkRPV19fREVTVFJPWSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDRVTAotI2RlZmluZSBXSU5ET1dfX01BUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4VUwKLSNkZWZpbmUgV0lORE9XX19VTk1BUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMFVMCi0jZGVmaW5lIFdJTkRPV19fQ0hTVEFDSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjBVTAotI2RlZmluZSBXSU5ET1dfX0NIUFJPUExJU1QgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwVUwKLSNkZWZpbmUgV0lORE9XX19DSFBST1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MFVMCi0jZGVmaW5lIFdJTkRPV19fTElTVFBST1AgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDBVTAotI2RlZmluZSBXSU5ET1dfX0dFVEFUVFIgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjAwVUwKLSNkZWZpbmUgV0lORE9XX19TRVRBVFRSICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQwMFVMCi0jZGVmaW5lIFdJTkRPV19fU0VURk9DVVMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA4MDBVTAotI2RlZmluZSBXSU5ET1dfX01PVkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAxMDAwVUwKLSNkZWZpbmUgV0lORE9XX19DSFNFTEVDVElPTiAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMjAwMFVMCi0jZGVmaW5lIFdJTkRPV19fQ0hQQVJFTlQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDQwMDBVTAotI2RlZmluZSBXSU5ET1dfX0NUUkxMSUZFICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA4MDAwVUwKLSNkZWZpbmUgV0lORE9XX19FTlVNRVJBVEUgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMFVMCi0jZGVmaW5lIFdJTkRPV19fVFJBTlNQQVJFTlQgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMjAwMDBVTAotI2RlZmluZSBXSU5ET1dfX01PVVNFTU9USU9OICAgICAgICAgICAgICAgICAgICAgICAweDAwMDQwMDAwVUwKLSNkZWZpbmUgV0lORE9XX19DTElFTlRDT01FVkVOVCAgICAgICAgICAgICAgICAgICAgMHgwMDA4MDAwMFVMCi0jZGVmaW5lIFdJTkRPV19fSU5QVVRFVkVOVCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMDAwMDBVTAotI2RlZmluZSBXSU5ET1dfX0RSQVdFVkVOVCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMjAwMDAwVUwKLSNkZWZpbmUgV0lORE9XX19XSU5ET1dDSEFOR0VFVkVOVCAgICAgICAgICAgICAgICAgMHgwMDQwMDAwMFVMCi0jZGVmaW5lIFdJTkRPV19fV0lORE9XQ0hBTkdFUkVRVUVTVCAgICAgICAgICAgICAgIDB4MDA4MDAwMDBVTAotI2RlZmluZSBXSU5ET1dfX1NFUlZFUkNIQU5HRUVWRU5UICAgICAgICAgICAgICAgICAweDAxMDAwMDAwVUwKLSNkZWZpbmUgV0lORE9XX19FWFRFTlNJT05FVkVOVCAgICAgICAgICAgICAgICAgICAgMHgwMjAwMDAwMFVMCi0KLSNkZWZpbmUgRk9OVF9fTE9BRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMVVMCi0jZGVmaW5lIEZPTlRfX0ZSRUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDJVTAotI2RlZmluZSBGT05UX19HRVRBVFRSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0VUwKLSNkZWZpbmUgRk9OVF9fVVNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOFVMCi0KLSNkZWZpbmUgQ09MT1JNQVBfX0NSRUFURSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMVVMCi0jZGVmaW5lIENPTE9STUFQX19GUkVFICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDJVTAotI2RlZmluZSBDT0xPUk1BUF9fSU5TVEFMTCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0VUwKLSNkZWZpbmUgQ09MT1JNQVBfX1VOSU5TVEFMTCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOFVMCi0jZGVmaW5lIENPTE9STUFQX19MSVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTBVTAotI2RlZmluZSBDT0xPUk1BUF9fUkVBRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwVUwKLSNkZWZpbmUgQ09MT1JNQVBfX1NUT1JFICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MFVMCi0jZGVmaW5lIENPTE9STUFQX19HRVRBVFRSICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODBVTAotI2RlZmluZSBDT0xPUk1BUF9fU0VUQVRUUiAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAwVUwKLQotI2RlZmluZSBQUk9QRVJUWV9fQ1JFQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxVUwKLSNkZWZpbmUgUFJPUEVSVFlfX0ZSRUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMlVMCi0jZGVmaW5lIFBST1BFUlRZX19SRUFEICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDRVTAotI2RlZmluZSBQUk9QRVJUWV9fV1JJVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4VUwKLQotI2RlZmluZSBDVVJTT1JfX0NSRUFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxVUwKLSNkZWZpbmUgQ1VSU09SX19DUkVBVEVHTFlQSCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMlVMCi0jZGVmaW5lIENVUlNPUl9fRlJFRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDRVTAotI2RlZmluZSBDVVJTT1JfX0FTU0lHTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4VUwKLSNkZWZpbmUgQ1VSU09SX19TRVRBVFRSICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMFVMCi0KLSNkZWZpbmUgWENMSUVOVF9fS0lMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMVVMCi0KLSNkZWZpbmUgWElOUFVUX19MT09LVVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMVVMCi0jZGVmaW5lIFhJTlBVVF9fR0VUQVRUUiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDJVTAotI2RlZmluZSBYSU5QVVRfX1NFVEFUVFIgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0VUwKLSNkZWZpbmUgWElOUFVUX19TRVRGT0NVUyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOFVMCi0jZGVmaW5lIFhJTlBVVF9fV0FSUFBPSU5URVIgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTBVTAotI2RlZmluZSBYSU5QVVRfX0FDVElWRUdSQUIgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwVUwKLSNkZWZpbmUgWElOUFVUX19QQVNTSVZFR1JBQiAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MFVMCi0jZGVmaW5lIFhJTlBVVF9fVU5HUkFCICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODBVTAotI2RlZmluZSBYSU5QVVRfX0JFTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAwVUwKLSNkZWZpbmUgWElOUFVUX19NT1VTRU1PVElPTiAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMFVMCi0jZGVmaW5lIFhJTlBVVF9fUkVMQUJFTElOUFVUICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MDBVTAotCi0jZGVmaW5lIFhTRVJWRVJfX1NDUkVFTlNBVkVSICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDFVTAotI2RlZmluZSBYU0VSVkVSX19HRVRIT1NUTElTVCAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyVUwKLSNkZWZpbmUgWFNFUlZFUl9fU0VUSE9TVExJU1QgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNFVMCi0jZGVmaW5lIFhTRVJWRVJfX0dFVEZPTlRQQVRIICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDhVTAotI2RlZmluZSBYU0VSVkVSX19TRVRGT05UUEFUSCAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwVUwKLSNkZWZpbmUgWFNFUlZFUl9fR0VUQVRUUiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMFVMCi0jZGVmaW5lIFhTRVJWRVJfX0dSQUIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDBVTAotI2RlZmluZSBYU0VSVkVSX19VTkdSQUIgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDgwVUwKLQotI2RlZmluZSBYRVhURU5TSU9OX19RVUVSWSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxVUwKLSNkZWZpbmUgWEVYVEVOU0lPTl9fVVNFICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMlVMCi0KLSNkZWZpbmUgUEFYX19QQUdFRVhFQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMVVMCi0jZGVmaW5lIFBBWF9fRU1VVFJBTVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDJVTAotI2RlZmluZSBQQVhfX01QUk9URUNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0VUwKLSNkZWZpbmUgUEFYX19SQU5ETU1BUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOFVMCi0jZGVmaW5lIFBBWF9fUkFOREVYRUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTBVTAotI2RlZmluZSBQQVhfX1NFR01FWEVDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwVUwKLQogI2RlZmluZSBORVRMSU5LX1JPVVRFX1NPQ0tFVF9fSU9DVEwgICAgICAgICAgICAgICAweDAwMDAwMDAxVUwKICNkZWZpbmUgTkVUTElOS19ST1VURV9TT0NLRVRfX1JFQUQgICAgICAgICAgICAgICAgMHgwMDAwMDAwMlVMCiAjZGVmaW5lIE5FVExJTktfUk9VVEVfU09DS0VUX19XUklURSAgICAgICAgICAgICAgIDB4MDAwMDAwMDRVTApAQCAtNjk1LDEwICs1NTEsOCBAQAogI2RlZmluZSBORVRMSU5LX1JPVVRFX1NPQ0tFVF9fUkVDVl9NU0cgICAgICAgICAgICAweDAwMDgwMDAwVUwKICNkZWZpbmUgTkVUTElOS19ST1VURV9TT0NLRVRfX1NFTkRfTVNHICAgICAgICAgICAgMHgwMDEwMDAwMFVMCiAjZGVmaW5lIE5FVExJTktfUk9VVEVfU09DS0VUX19OQU1FX0JJTkQgICAgICAgICAgIDB4MDAyMDAwMDBVTAotCiAjZGVmaW5lIE5FVExJTktfUk9VVEVfU09DS0VUX19OTE1TR19SRUFEICAgICAgICAgIDB4MDA0MDAwMDBVTAogI2RlZmluZSBORVRMSU5LX1JPVVRFX1NPQ0tFVF9fTkxNU0dfV1JJVEUgICAgICAgICAweDAwODAwMDAwVUwKLQogI2RlZmluZSBORVRMSU5LX0ZJUkVXQUxMX1NPQ0tFVF9fSU9DVEwgICAgICAgICAgICAweDAwMDAwMDAxVUwKICNkZWZpbmUgTkVUTElOS19GSVJFV0FMTF9TT0NLRVRfX1JFQUQgICAgICAgICAgICAgMHgwMDAwMDAwMlVMCiAjZGVmaW5lIE5FVExJTktfRklSRVdBTExfU09DS0VUX19XUklURSAgICAgICAgICAgIDB4MDAwMDAwMDRVTApAQCAtNzIxLDEwICs1NzUsOCBAQAogI2RlZmluZSBORVRMSU5LX0ZJUkVXQUxMX1NPQ0tFVF9fUkVDVl9NU0cgICAgICAgICAweDAwMDgwMDAwVUwKICNkZWZpbmUgTkVUTElOS19GSVJFV0FMTF9TT0NLRVRfX1NFTkRfTVNHICAgICAgICAgMHgwMDEwMDAwMFVMCiAjZGVmaW5lIE5FVExJTktfRklSRVdBTExfU09DS0VUX19OQU1FX0JJTkQgICAgICAgIDB4MDAyMDAwMDBVTAotCiAjZGVmaW5lIE5FVExJTktfRklSRVdBTExfU09DS0VUX19OTE1TR19SRUFEICAgICAgIDB4MDA0MDAwMDBVTAogI2RlZmluZSBORVRMSU5LX0ZJUkVXQUxMX1NPQ0tFVF9fTkxNU0dfV1JJVEUgICAgICAweDAwODAwMDAwVUwKLQogI2RlZmluZSBORVRMSU5LX1RDUERJQUdfU09DS0VUX19JT0NUTCAgICAgICAgICAgICAweDAwMDAwMDAxVUwKICNkZWZpbmUgTkVUTElOS19UQ1BESUFHX1NPQ0tFVF9fUkVBRCAgICAgICAgICAgICAgMHgwMDAwMDAwMlVMCiAjZGVmaW5lIE5FVExJTktfVENQRElBR19TT0NLRVRfX1dSSVRFICAgICAgICAgICAgIDB4MDAwMDAwMDRVTApAQCAtNzQ3LDEwICs1OTksOCBAQAogI2RlZmluZSBORVRMSU5LX1RDUERJQUdfU09DS0VUX19SRUNWX01TRyAgICAgICAgICAweDAwMDgwMDAwVUwKICNkZWZpbmUgTkVUTElOS19UQ1BESUFHX1NPQ0tFVF9fU0VORF9NU0cgICAgICAgICAgMHgwMDEwMDAwMFVMCiAjZGVmaW5lIE5FVExJTktfVENQRElBR19TT0NLRVRfX05BTUVfQklORCAgICAgICAgIDB4MDAyMDAwMDBVTAotCiAjZGVmaW5lIE5FVExJTktfVENQRElBR19TT0NLRVRfX05MTVNHX1JFQUQgICAgICAgIDB4MDA0MDAwMDBVTAogI2RlZmluZSBORVRMSU5LX1RDUERJQUdfU09DS0VUX19OTE1TR19XUklURSAgICAgICAweDAwODAwMDAwVUwKLQogI2RlZmluZSBORVRMSU5LX05GTE9HX1NPQ0tFVF9fSU9DVEwgICAgICAgICAgICAgICAweDAwMDAwMDAxVUwKICNkZWZpbmUgTkVUTElOS19ORkxPR19TT0NLRVRfX1JFQUQgICAgICAgICAgICAgICAgMHgwMDAwMDAwMlVMCiAjZGVmaW5lIE5FVExJTktfTkZMT0dfU09DS0VUX19XUklURSAgICAgICAgICAgICAgIDB4MDAwMDAwMDRVTApAQCAtNzczLDcgKzYyMyw2IEBACiAjZGVmaW5lIE5FVExJTktfTkZMT0dfU09DS0VUX19SRUNWX01TRyAgICAgICAgICAgIDB4MDAwODAwMDBVTAogI2RlZmluZSBORVRMSU5LX05GTE9HX1NPQ0tFVF9fU0VORF9NU0cgICAgICAgICAgICAweDAwMTAwMDAwVUwKICNkZWZpbmUgTkVUTElOS19ORkxPR19TT0NLRVRfX05BTUVfQklORCAgICAgICAgICAgMHgwMDIwMDAwMFVMCi0KICNkZWZpbmUgTkVUTElOS19YRlJNX1NPQ0tFVF9fSU9DVEwgICAgICAgICAgICAgICAgMHgwMDAwMDAwMVVMCiAjZGVmaW5lIE5FVExJTktfWEZSTV9TT0NLRVRfX1JFQUQgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDJVTAogI2RlZmluZSBORVRMSU5LX1hGUk1fU09DS0VUX19XUklURSAgICAgICAgICAgICAgICAweDAwMDAwMDA0VUwKQEAgLTc5NiwxMCArNjQ1LDggQEAKICNkZWZpbmUgTkVUTElOS19YRlJNX1NPQ0tFVF9fUkVDVl9NU0cgICAgICAgICAgICAgMHgwMDA4MDAwMFVMCiAjZGVmaW5lIE5FVExJTktfWEZSTV9TT0NLRVRfX1NFTkRfTVNHICAgICAgICAgICAgIDB4MDAxMDAwMDBVTAogI2RlZmluZSBORVRMSU5LX1hGUk1fU09DS0VUX19OQU1FX0JJTkQgICAgICAgICAgICAweDAwMjAwMDAwVUwKLQogI2RlZmluZSBORVRMSU5LX1hGUk1fU09DS0VUX19OTE1TR19SRUFEICAgICAgICAgICAweDAwNDAwMDAwVUwKICNkZWZpbmUgTkVUTElOS19YRlJNX1NPQ0tFVF9fTkxNU0dfV1JJVEUgICAgICAgICAgMHgwMDgwMDAwMFVMCi0KICNkZWZpbmUgTkVUTElOS19TRUxJTlVYX1NPQ0tFVF9fSU9DVEwgICAgICAgICAgICAgMHgwMDAwMDAwMVVMCiAjZGVmaW5lIE5FVExJTktfU0VMSU5VWF9TT0NLRVRfX1JFQUQgICAgICAgICAgICAgIDB4MDAwMDAwMDJVTAogI2RlZmluZSBORVRMSU5LX1NFTElOVVhfU09DS0VUX19XUklURSAgICAgICAgICAgICAweDAwMDAwMDA0VUwKQEAgLTgyMiw3ICs2NjksNiBAQAogI2RlZmluZSBORVRMSU5LX1NFTElOVVhfU09DS0VUX19SRUNWX01TRyAgICAgICAgICAweDAwMDgwMDAwVUwKICNkZWZpbmUgTkVUTElOS19TRUxJTlVYX1NPQ0tFVF9fU0VORF9NU0cgICAgICAgICAgMHgwMDEwMDAwMFVMCiAjZGVmaW5lIE5FVExJTktfU0VMSU5VWF9TT0NLRVRfX05BTUVfQklORCAgICAgICAgIDB4MDAyMDAwMDBVTAotCiAjZGVmaW5lIE5FVExJTktfQVVESVRfU09DS0VUX19JT0NUTCAgICAgICAgICAgICAgIDB4MDAwMDAwMDFVTAogI2RlZmluZSBORVRMSU5LX0FVRElUX1NPQ0tFVF9fUkVBRCAgICAgICAgICAgICAgICAweDAwMDAwMDAyVUwKICNkZWZpbmUgTkVUTElOS19BVURJVF9TT0NLRVRfX1dSSVRFICAgICAgICAgICAgICAgMHgwMDAwMDAwNFVMCkBAIC04NDUsMTIgKzY5MSwxMCBAQAogI2RlZmluZSBORVRMSU5LX0FVRElUX1NPQ0tFVF9fUkVDVl9NU0cgICAgICAgICAgICAweDAwMDgwMDAwVUwKICNkZWZpbmUgTkVUTElOS19BVURJVF9TT0NLRVRfX1NFTkRfTVNHICAgICAgICAgICAgMHgwMDEwMDAwMFVMCiAjZGVmaW5lIE5FVExJTktfQVVESVRfU09DS0VUX19OQU1FX0JJTkQgICAgICAgICAgIDB4MDAyMDAwMDBVTAotCiAjZGVmaW5lIE5FVExJTktfQVVESVRfU09DS0VUX19OTE1TR19SRUFEICAgICAgICAgIDB4MDA0MDAwMDBVTAogI2RlZmluZSBORVRMSU5LX0FVRElUX1NPQ0tFVF9fTkxNU0dfV1JJVEUgICAgICAgICAweDAwODAwMDAwVUwKICNkZWZpbmUgTkVUTElOS19BVURJVF9TT0NLRVRfX05MTVNHX1JFTEFZICAgICAgICAgMHgwMTAwMDAwMFVMCiAjZGVmaW5lIE5FVExJTktfQVVESVRfU09DS0VUX19OTE1TR19SRUFEUFJJViAgICAgIDB4MDIwMDAwMDBVTAotCiAjZGVmaW5lIE5FVExJTktfSVA2RldfU09DS0VUX19JT0NUTCAgICAgICAgICAgICAgIDB4MDAwMDAwMDFVTAogI2RlZmluZSBORVRMSU5LX0lQNkZXX1NPQ0tFVF9fUkVBRCAgICAgICAgICAgICAgICAweDAwMDAwMDAyVUwKICNkZWZpbmUgTkVUTElOS19JUDZGV19TT0NLRVRfX1dSSVRFICAgICAgICAgICAgICAgMHgwMDAwMDAwNFVMCkBAIC04NzMsMTAgKzcxNyw4IEBACiAjZGVmaW5lIE5FVExJTktfSVA2RldfU09DS0VUX19SRUNWX01TRyAgICAgICAgICAgIDB4MDAwODAwMDBVTAogI2RlZmluZSBORVRMSU5LX0lQNkZXX1NPQ0tFVF9fU0VORF9NU0cgICAgICAgICAgICAweDAwMTAwMDAwVUwKICNkZWZpbmUgTkVUTElOS19JUDZGV19TT0NLRVRfX05BTUVfQklORCAgICAgICAgICAgMHgwMDIwMDAwMFVMCi0KICNkZWZpbmUgTkVUTElOS19JUDZGV19TT0NLRVRfX05MTVNHX1JFQUQgICAgICAgICAgMHgwMDQwMDAwMFVMCiAjZGVmaW5lIE5FVExJTktfSVA2RldfU09DS0VUX19OTE1TR19XUklURSAgICAgICAgIDB4MDA4MDAwMDBVTAotCiAjZGVmaW5lIE5FVExJTktfRE5SVF9TT0NLRVRfX0lPQ1RMICAgICAgICAgICAgICAgIDB4MDAwMDAwMDFVTAogI2RlZmluZSBORVRMSU5LX0ROUlRfU09DS0VUX19SRUFEICAgICAgICAgICAgICAgICAweDAwMDAwMDAyVUwKICNkZWZpbmUgTkVUTElOS19ETlJUX1NPQ0tFVF9fV1JJVEUgICAgICAgICAgICAgICAgMHgwMDAwMDAwNFVMCkBAIC04OTksMjQgKzc0MSwxMCBAQAogI2RlZmluZSBORVRMSU5LX0ROUlRfU09DS0VUX19SRUNWX01TRyAgICAgICAgICAgICAweDAwMDgwMDAwVUwKICNkZWZpbmUgTkVUTElOS19ETlJUX1NPQ0tFVF9fU0VORF9NU0cgICAgICAgICAgICAgMHgwMDEwMDAwMFVMCiAjZGVmaW5lIE5FVExJTktfRE5SVF9TT0NLRVRfX05BTUVfQklORCAgICAgICAgICAgIDB4MDAyMDAwMDBVTAotCi0jZGVmaW5lIERCVVNfX0FDUVVJUkVfU1ZDICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDFVTAotI2RlZmluZSBEQlVTX19TRU5EX01TRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyVUwKLQotI2RlZmluZSBOU0NEX19HRVRQV0QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxVUwKLSNkZWZpbmUgTlNDRF9fR0VUR1JQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMlVMCi0jZGVmaW5lIE5TQ0RfX0dFVEhPU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDRVTAotI2RlZmluZSBOU0NEX19HRVRTVEFUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4VUwKLSNkZWZpbmUgTlNDRF9fQURNSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMFVMCi0jZGVmaW5lIE5TQ0RfX1NITUVNUFdEICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjBVTAotI2RlZmluZSBOU0NEX19TSE1FTUdSUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwVUwKLSNkZWZpbmUgTlNDRF9fU0hNRU1IT1NUICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MFVMCi0KICNkZWZpbmUgQVNTT0NJQVRJT05fX1NFTkRUTyAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMVVMCiAjZGVmaW5lIEFTU09DSUFUSU9OX19SRUNWRlJPTSAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDJVTAogI2RlZmluZSBBU1NPQ0lBVElPTl9fU0VUQ09OVEVYVCAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0VUwKICNkZWZpbmUgQVNTT0NJQVRJT05fX1BPTE1BVENIICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOFVMCi0KICNkZWZpbmUgTkVUTElOS19LT0JKRUNUX1VFVkVOVF9TT0NLRVRfX0lPQ1RMICAgICAgMHgwMDAwMDAwMVVMCiAjZGVmaW5lIE5FVExJTktfS09CSkVDVF9VRVZFTlRfU09DS0VUX19SRUFEICAgICAgIDB4MDAwMDAwMDJVTAogI2RlZmluZSBORVRMSU5LX0tPQkpFQ1RfVUVWRU5UX1NPQ0tFVF9fV1JJVEUgICAgICAweDAwMDAwMDA0VUwKQEAgLTkzOSw3ICs3NjcsNiBAQAogI2RlZmluZSBORVRMSU5LX0tPQkpFQ1RfVUVWRU5UX1NPQ0tFVF9fUkVDVl9NU0cgICAweDAwMDgwMDAwVUwKICNkZWZpbmUgTkVUTElOS19LT0JKRUNUX1VFVkVOVF9TT0NLRVRfX1NFTkRfTVNHICAgMHgwMDEwMDAwMFVMCiAjZGVmaW5lIE5FVExJTktfS09CSkVDVF9VRVZFTlRfU09DS0VUX19OQU1FX0JJTkQgIDB4MDAyMDAwMDBVTAotCiAjZGVmaW5lIEFQUExFVEFMS19TT0NLRVRfX0lPQ1RMICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDFVTAogI2RlZmluZSBBUFBMRVRBTEtfU09DS0VUX19SRUFEICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyVUwKICNkZWZpbmUgQVBQTEVUQUxLX1NPQ0tFVF9fV1JJVEUgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNFVMCkBAIC05NjIsMTEgKzc4OSw5IEBACiAjZGVmaW5lIEFQUExFVEFMS19TT0NLRVRfX1JFQ1ZfTVNHICAgICAgICAgICAgICAgIDB4MDAwODAwMDBVTAogI2RlZmluZSBBUFBMRVRBTEtfU09DS0VUX19TRU5EX01TRyAgICAgICAgICAgICAgICAweDAwMTAwMDAwVUwKICNkZWZpbmUgQVBQTEVUQUxLX1NPQ0tFVF9fTkFNRV9CSU5EICAgICAgICAgICAgICAgMHgwMDIwMDAwMFVMCi0KICNkZWZpbmUgUEFDS0VUX19TRU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMVVMCiAjZGVmaW5lIFBBQ0tFVF9fUkVDViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDJVTAogI2RlZmluZSBQQUNLRVRfX1JFTEFCRUxUTyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0VUwKLQogI2RlZmluZSBLRVlfX1ZJRVcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxVUwKICNkZWZpbmUgS0VZX19SRUFEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMlVMCiAjZGVmaW5lIEtFWV9fV1JJVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDRVTApAQCAtOTc0LDEwICs3OTksNiBAQAogI2RlZmluZSBLRVlfX0xJTksgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwVUwKICNkZWZpbmUgS0VZX19TRVRBVFRSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMFVMCiAjZGVmaW5lIEtFWV9fQ1JFQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDBVTAotCi0jZGVmaW5lIENPTlRFWFRfX1RSQU5TTEFURSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDFVTAotI2RlZmluZSBDT05URVhUX19DT05UQUlOUyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyVUwKLQogI2RlZmluZSBEQ0NQX1NPQ0tFVF9fSU9DVEwgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxVUwKICNkZWZpbmUgRENDUF9TT0NLRVRfX1JFQUQgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMlVMCiAjZGVmaW5lIERDQ1BfU09DS0VUX19XUklURSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDRVTApkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL2NsYXNzX3RvX3N0cmluZy5oIGIvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL2NsYXNzX3RvX3N0cmluZy5oCmluZGV4IDlmM2ViYjEuLjM3ODc5OTAgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9jbGFzc190b19zdHJpbmcuaAorKysgYi9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvY2xhc3NfdG9fc3RyaW5nLmgKQEAgLTIsNyArMiw3IEBACiAvKgogICogU2VjdXJpdHkgb2JqZWN0IGNsYXNzIGRlZmluaXRpb25zCiAgKi8KLSAgICBTXygibnVsbCIpCisgICAgU18oTlVMTCkKICAgICBTXygic2VjdXJpdHkiKQogICAgIFNfKCJwcm9jZXNzIikKICAgICBTXygic3lzdGVtIikKQEAgLTMyLDE5ICszMiwxOSBAQAogICAgIFNfKCJtc2dxIikKICAgICBTXygic2htIikKICAgICBTXygiaXBjIikKLSAgICBTXygicGFzc3dkIikKLSAgICBTXygiZHJhd2FibGUiKQotICAgIFNfKCJ3aW5kb3ciKQotICAgIFNfKCJnYyIpCi0gICAgU18oImZvbnQiKQotICAgIFNfKCJjb2xvcm1hcCIpCi0gICAgU18oInByb3BlcnR5IikKLSAgICBTXygiY3Vyc29yIikKLSAgICBTXygieGNsaWVudCIpCi0gICAgU18oInhpbnB1dCIpCi0gICAgU18oInhzZXJ2ZXIiKQotICAgIFNfKCJ4ZXh0ZW5zaW9uIikKLSAgICBTXygicGF4IikKKyAgICBTXyhOVUxMKQorICAgIFNfKE5VTEwpCisgICAgU18oTlVMTCkKKyAgICBTXyhOVUxMKQorICAgIFNfKE5VTEwpCisgICAgU18oTlVMTCkKKyAgICBTXyhOVUxMKQorICAgIFNfKE5VTEwpCisgICAgU18oTlVMTCkKKyAgICBTXyhOVUxMKQorICAgIFNfKE5VTEwpCisgICAgU18oTlVMTCkKKyAgICBTXyhOVUxMKQogICAgIFNfKCJuZXRsaW5rX3JvdXRlX3NvY2tldCIpCiAgICAgU18oIm5ldGxpbmtfZmlyZXdhbGxfc29ja2V0IikKICAgICBTXygibmV0bGlua190Y3BkaWFnX3NvY2tldCIpCkBAIC01NCwxMiArNTQsMTIgQEAKICAgICBTXygibmV0bGlua19hdWRpdF9zb2NrZXQiKQogICAgIFNfKCJuZXRsaW5rX2lwNmZ3X3NvY2tldCIpCiAgICAgU18oIm5ldGxpbmtfZG5ydF9zb2NrZXQiKQotICAgIFNfKCJkYnVzIikKLSAgICBTXygibnNjZCIpCisgICAgU18oTlVMTCkKKyAgICBTXyhOVUxMKQogICAgIFNfKCJhc3NvY2lhdGlvbiIpCiAgICAgU18oIm5ldGxpbmtfa29iamVjdF91ZXZlbnRfc29ja2V0IikKICAgICBTXygiYXBwbGV0YWxrX3NvY2tldCIpCiAgICAgU18oInBhY2tldCIpCiAgICAgU18oImtleSIpCi0gICAgU18oImNvbnRleHQiKQorICAgIFNfKE5VTEwpCiAgICAgU18oImRjY3Bfc29ja2V0IikKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9mbGFzay5oIGIvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL2ZsYXNrLmgKaW5kZXggNjdjZWYzNy4uMzVmMzA5ZiAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL2ZsYXNrLmgKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL2ZsYXNrLmgKQEAgLTM0LDE5ICszNCw2IEBACiAjZGVmaW5lIFNFQ0NMQVNTX01TR1EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNwogI2RlZmluZSBTRUNDTEFTU19TSE0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjgKICNkZWZpbmUgU0VDQ0xBU1NfSVBDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI5Ci0jZGVmaW5lIFNFQ0NMQVNTX1BBU1NXRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMAotI2RlZmluZSBTRUNDTEFTU19EUkFXQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzEKLSNkZWZpbmUgU0VDQ0xBU1NfV0lORE9XICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyCi0jZGVmaW5lIFNFQ0NMQVNTX0dDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMwotI2RlZmluZSBTRUNDTEFTU19GT05UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzQKLSNkZWZpbmUgU0VDQ0xBU1NfQ09MT1JNQVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM1Ci0jZGVmaW5lIFNFQ0NMQVNTX1BST1BFUlRZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNgotI2RlZmluZSBTRUNDTEFTU19DVVJTT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzcKLSNkZWZpbmUgU0VDQ0xBU1NfWENMSUVOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM4Ci0jZGVmaW5lIFNFQ0NMQVNTX1hJTlBVVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOQotI2RlZmluZSBTRUNDTEFTU19YU0VSVkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDAKLSNkZWZpbmUgU0VDQ0xBU1NfWEVYVEVOU0lPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQxCi0jZGVmaW5lIFNFQ0NMQVNTX1BBWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MgogI2RlZmluZSBTRUNDTEFTU19ORVRMSU5LX1JPVVRFX1NPQ0tFVCAgICAgICAgICAgICAgICAgICAgNDMKICNkZWZpbmUgU0VDQ0xBU1NfTkVUTElOS19GSVJFV0FMTF9TT0NLRVQgICAgICAgICAgICAgICAgIDQ0CiAjZGVmaW5lIFNFQ0NMQVNTX05FVExJTktfVENQRElBR19TT0NLRVQgICAgICAgICAgICAgICAgICA0NQpAQCAtNTYsMTQgKzQzLDExIEBACiAjZGVmaW5lIFNFQ0NMQVNTX05FVExJTktfQVVESVRfU09DS0VUICAgICAgICAgICAgICAgICAgICA0OQogI2RlZmluZSBTRUNDTEFTU19ORVRMSU5LX0lQNkZXX1NPQ0tFVCAgICAgICAgICAgICAgICAgICAgNTAKICNkZWZpbmUgU0VDQ0xBU1NfTkVUTElOS19ETlJUX1NPQ0tFVCAgICAgICAgICAgICAgICAgICAgIDUxCi0jZGVmaW5lIFNFQ0NMQVNTX0RCVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MgotI2RlZmluZSBTRUNDTEFTU19OU0NEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTMKICNkZWZpbmUgU0VDQ0xBU1NfQVNTT0NJQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU0CiAjZGVmaW5lIFNFQ0NMQVNTX05FVExJTktfS09CSkVDVF9VRVZFTlRfU09DS0VUICAgICAgICAgICA1NQogI2RlZmluZSBTRUNDTEFTU19BUFBMRVRBTEtfU09DS0VUICAgICAgICAgICAgICAgICAgICAgICAgNTYKICNkZWZpbmUgU0VDQ0xBU1NfUEFDS0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU3CiAjZGVmaW5lIFNFQ0NMQVNTX0tFWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1OAotI2RlZmluZSBTRUNDTEFTU19DT05URVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTkKICNkZWZpbmUgU0VDQ0xBU1NfRENDUF9TT0NLRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYwCiAKIC8qCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvc2VsaW51eF9uZXRsYWJlbC5oIGIvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL25ldGxhYmVsLmgKc2ltaWxhcml0eSBpbmRleCA5NCUKcmVuYW1lIGZyb20gc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL3NlbGludXhfbmV0bGFiZWwuaApyZW5hbWUgdG8gc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL25ldGxhYmVsLmgKaW5kZXggMmE3MzJjOS4uMjE4ZTNmNyAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL3NlbGludXhfbmV0bGFiZWwuaAorKysgYi9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvbmV0bGFiZWwuaApAQCAtMzgsMTkgKzM4LDIyIEBACiAKICNpZmRlZiBDT05GSUdfTkVUTEFCRUwKIHZvaWQgc2VsaW51eF9uZXRsYmxfY2FjaGVfaW52YWxpZGF0ZSh2b2lkKTsKLWludCBzZWxpbnV4X25ldGxibF9za2J1ZmZfZ2V0c2lkKHN0cnVjdCBza19idWZmICpza2IsIHUzMiBiYXNlX3NpZCwgdTMyICpzaWQpOwotaW50IHNlbGludXhfbmV0bGJsX3NvY2tldF9wb3N0X2NyZWF0ZShzdHJ1Y3Qgc29ja2V0ICpzb2NrKTsKLXZvaWQgc2VsaW51eF9uZXRsYmxfc29ja19ncmFmdChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBzb2NrZXQgKnNvY2spOwotaW50IHNlbGludXhfbmV0bGJsX3NvY2tfcmN2X3NrYihzdHJ1Y3Qgc2tfc2VjdXJpdHlfc3RydWN0ICpza3NlYywKLQkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCXN0cnVjdCBhdmNfYXVkaXRfZGF0YSAqYWQpOworCiB2b2lkIHNlbGludXhfbmV0bGJsX3NrX3NlY3VyaXR5X3Jlc2V0KHN0cnVjdCBza19zZWN1cml0eV9zdHJ1Y3QgKnNzZWMsCiAJCQkJICAgICAgaW50IGZhbWlseSk7CiB2b2lkIHNlbGludXhfbmV0bGJsX3NrX3NlY3VyaXR5X2luaXQoc3RydWN0IHNrX3NlY3VyaXR5X3N0cnVjdCAqc3NlYywKIAkJCQkgICAgIGludCBmYW1pbHkpOwogdm9pZCBzZWxpbnV4X25ldGxibF9za19zZWN1cml0eV9jbG9uZShzdHJ1Y3Qgc2tfc2VjdXJpdHlfc3RydWN0ICpzc2VjLAogCQkJCSAgICAgIHN0cnVjdCBza19zZWN1cml0eV9zdHJ1Y3QgKm5ld3NzZWMpOworCitpbnQgc2VsaW51eF9uZXRsYmxfc2tidWZmX2dldHNpZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgYmFzZV9zaWQsIHUzMiAqc2lkKTsKKwordm9pZCBzZWxpbnV4X25ldGxibF9zb2NrX2dyYWZ0KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNvY2tldCAqc29jayk7CitpbnQgc2VsaW51eF9uZXRsYmxfc29ja2V0X3Bvc3RfY3JlYXRlKHN0cnVjdCBzb2NrZXQgKnNvY2spOwogaW50IHNlbGludXhfbmV0bGJsX2lub2RlX3Blcm1pc3Npb24oc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1hc2spOworaW50IHNlbGludXhfbmV0bGJsX3NvY2tfcmN2X3NrYihzdHJ1Y3Qgc2tfc2VjdXJpdHlfc3RydWN0ICpza3NlYywKKwkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCXN0cnVjdCBhdmNfYXVkaXRfZGF0YSAqYWQpOwogaW50IHNlbGludXhfbmV0bGJsX3NvY2tldF9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrZXQgKnNvY2ssCiAJCQkJICAgICBpbnQgbGV2ZWwsCiAJCQkJICAgICBpbnQgb3B0bmFtZSk7CkBAIC02MCw2ICs2MywyNSBAQAogCXJldHVybjsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIHNlbGludXhfbmV0bGJsX3NrX3NlY3VyaXR5X3Jlc2V0KAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBza19zZWN1cml0eV9zdHJ1Y3QgKnNzZWMsCisJCQkJCSAgICAgICBpbnQgZmFtaWx5KQoreworCXJldHVybjsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBzZWxpbnV4X25ldGxibF9za19zZWN1cml0eV9pbml0KAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBza19zZWN1cml0eV9zdHJ1Y3QgKnNzZWMsCisJCQkJCSAgICAgICBpbnQgZmFtaWx5KQoreworCXJldHVybjsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBzZWxpbnV4X25ldGxibF9za19zZWN1cml0eV9jbG9uZSgKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2tfc2VjdXJpdHlfc3RydWN0ICpzc2VjLAorCQkJCQkgICAgc3RydWN0IHNrX3NlY3VyaXR5X3N0cnVjdCAqbmV3c3NlYykKK3sKKwlyZXR1cm47Cit9CisKIHN0YXRpYyBpbmxpbmUgaW50IHNlbGludXhfbmV0bGJsX3NrYnVmZl9nZXRzaWQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCQkJICAgICAgIHUzMiBiYXNlX3NpZCwKIAkJCQkJICAgICAgIHUzMiAqc2lkKQpAQCAtNjgsNTEgKzkwLDI2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHNlbGludXhfbmV0bGJsX3NvY2tldF9wb3N0X2NyZWF0ZShzdHJ1Y3Qgc29ja2V0ICpzb2NrKQotewotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW5saW5lIHZvaWQgc2VsaW51eF9uZXRsYmxfc29ja19ncmFmdChzdHJ1Y3Qgc29jayAqc2ssCiAJCQkJCSAgICAgc3RydWN0IHNvY2tldCAqc29jaykKIHsKIAlyZXR1cm47CiB9Ci0KK3N0YXRpYyBpbmxpbmUgaW50IHNlbGludXhfbmV0bGJsX3NvY2tldF9wb3N0X2NyZWF0ZShzdHJ1Y3Qgc29ja2V0ICpzb2NrKQoreworCXJldHVybiAwOworfQorc3RhdGljIGlubGluZSBpbnQgc2VsaW51eF9uZXRsYmxfaW5vZGVfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQkJICBpbnQgbWFzaykKK3sKKwlyZXR1cm4gMDsKK30KIHN0YXRpYyBpbmxpbmUgaW50IHNlbGludXhfbmV0bGJsX3NvY2tfcmN2X3NrYihzdHJ1Y3Qgc2tfc2VjdXJpdHlfc3RydWN0ICpza3NlYywKIAkJCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCQkJICAgICAgc3RydWN0IGF2Y19hdWRpdF9kYXRhICphZCkKIHsKIAlyZXR1cm4gMDsKIH0KLQotc3RhdGljIGlubGluZSB2b2lkIHNlbGludXhfbmV0bGJsX3NrX3NlY3VyaXR5X3Jlc2V0KAotCQkJCQkgICAgICAgc3RydWN0IHNrX3NlY3VyaXR5X3N0cnVjdCAqc3NlYywKLQkJCQkJICAgICAgIGludCBmYW1pbHkpCi17Ci0JcmV0dXJuOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgc2VsaW51eF9uZXRsYmxfc2tfc2VjdXJpdHlfaW5pdCgKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2tfc2VjdXJpdHlfc3RydWN0ICpzc2VjLAotCQkJCQkgICAgICAgaW50IGZhbWlseSkKLXsKLQlyZXR1cm47Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzZWxpbnV4X25ldGxibF9za19zZWN1cml0eV9jbG9uZSgKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBza19zZWN1cml0eV9zdHJ1Y3QgKnNzZWMsCi0JCQkJCSAgIHN0cnVjdCBza19zZWN1cml0eV9zdHJ1Y3QgKm5ld3NzZWMpCi17Ci0JcmV0dXJuOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBzZWxpbnV4X25ldGxibF9pbm9kZV9wZXJtaXNzaW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkJCQkgIGludCBtYXNrKQotewotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW5saW5lIGludCBzZWxpbnV4X25ldGxibF9zb2NrZXRfc2V0c29ja29wdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLAogCQkJCQkJICAgaW50IGxldmVsLAogCQkJCQkJICAgaW50IG9wdG5hbWUpCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvc2VjdXJpdHkuaCBiL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9zZWN1cml0eS5oCmluZGV4IDIxMGVlYzcuLmI5NDM3OGEgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9zZWN1cml0eS5oCisrKyBiL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9zZWN1cml0eS5oCkBAIC0zNCw3ICszNCw3IEBACiAjZGVmaW5lIFBPTElDWURCX1ZFUlNJT05fTUFYCVBPTElDWURCX1ZFUlNJT05fUkFOR0VUUkFOUwogI2VuZGlmCiAKLXN0cnVjdCBza19idWZmOworc3RydWN0IG5ldGxibF9sc21fc2VjYXR0cjsKIAogZXh0ZXJuIGludCBzZWxpbnV4X2VuYWJsZWQ7CiBleHRlcm4gaW50IHNlbGludXhfbWxzX2VuYWJsZWQ7CkBAIC04Miw4ICs4Miw2IEBACiBpbnQgc2VjdXJpdHlfbm9kZV9zaWQodTE2IGRvbWFpbiwgdm9pZCAqYWRkciwgdTMyIGFkZHJsZW4sCiAJdTMyICpvdXRfc2lkKTsKIAotdm9pZCBzZWN1cml0eV9za2JfZXh0bGJsX3NpZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgYmFzZV9zaWQsIHUzMiAqc2lkKTsKLQogaW50IHNlY3VyaXR5X3ZhbGlkYXRlX3RyYW5zaXRpb24odTMyIG9sZHNpZCwgdTMyIG5ld3NpZCwgdTMyIHRhc2tzaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTYgdGNsYXNzKTsKIApAQCAtMTAyLDUgKzEwMCwzMCBAQAogaW50IHNlY3VyaXR5X2dlbmZzX3NpZChjb25zdCBjaGFyICpmc3R5cGUsIGNoYXIgKm5hbWUsIHUxNiBzY2xhc3MsCiAJdTMyICpzaWQpOwogCisjaWZkZWYgQ09ORklHX05FVExBQkVMCitpbnQgc2VjdXJpdHlfbmV0bGJsX3NlY2F0dHJfdG9fc2lkKHN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHIgKnNlY2F0dHIsCisJCQkJICAgdTMyIGJhc2Vfc2lkLAorCQkJCSAgIHUzMiAqc2lkKTsKKworaW50IHNlY3VyaXR5X25ldGxibF9zaWRfdG9fc2VjYXR0cih1MzIgc2lkLAorCQkJCSAgIHN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHIgKnNlY2F0dHIpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IHNlY3VyaXR5X25ldGxibF9zZWNhdHRyX3RvX3NpZCgKKwkJCQkJICAgIHN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHIgKnNlY2F0dHIsCisJCQkJCSAgICB1MzIgYmFzZV9zaWQsCisJCQkJCSAgICB1MzIgKnNpZCkKK3sKKwlyZXR1cm4gLUVJRFJNOworfQorCitzdGF0aWMgaW5saW5lIGludCBzZWN1cml0eV9uZXRsYmxfc2lkX3RvX3NlY2F0dHIodTMyIHNpZCwKKwkJCQkJICAgc3RydWN0IG5ldGxibF9sc21fc2VjYXR0ciAqc2VjYXR0cikKK3sKKwlyZXR1cm4gLUVOT0VOVDsKK30KKyNlbmRpZiAvKiBDT05GSUdfTkVUTEFCRUwgKi8KKworY29uc3QgY2hhciAqc2VjdXJpdHlfZ2V0X2luaXRpYWxfc2lkX2NvbnRleHQodTMyIHNpZCk7CisKICNlbmRpZiAvKiBfU0VMSU5VWF9TRUNVUklUWV9IXyAqLwogCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L25ldGxhYmVsLmMgYi9zZWN1cml0eS9zZWxpbnV4L25ldGxhYmVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY4NzUwNwotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyaXR5L3NlbGludXgvbmV0bGFiZWwuYwpAQCAtMCwwICsxLDM2MyBAQAorLyoKKyAqIFNFTGludXggTmV0TGFiZWwgU3VwcG9ydAorICoKKyAqIFRoaXMgZmlsZSBwcm92aWRlcyB0aGUgbmVjZXNzYXJ5IGdsdWUgdG8gdGllIE5ldExhYmVsIGludG8gdGhlIFNFTGludXgKKyAqIHN1YnN5c3RlbS4KKyAqCisgKiBBdXRob3I6IFBhdWwgTW9vcmUgPHBhdWwubW9vcmVAaHAuY29tPgorICoKKyAqLworCisvKgorICogKGMpIENvcHlyaWdodCBIZXdsZXR0LVBhY2thcmQgRGV2ZWxvcG1lbnQgQ29tcGFueSwgTC5QLiwgMjAwNworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyAgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyAgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgIGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxuZXQvbmV0bGFiZWwuaD4KKworI2luY2x1ZGUgIm9ianNlYy5oIgorI2luY2x1ZGUgInNlY3VyaXR5LmgiCisKKy8qKgorICogc2VsaW51eF9uZXRsYmxfc29ja2V0X3NldHNpZCAtIExhYmVsIGEgc29ja2V0IHVzaW5nIHRoZSBOZXRMYWJlbCBtZWNoYW5pc20KKyAqIEBzb2NrOiB0aGUgc29ja2V0IHRvIGxhYmVsCisgKiBAc2lkOiB0aGUgU0lEIHRvIHVzZQorICoKKyAqIERlc2NyaXB0aW9uOgorICogQXR0ZW1wdCB0byBsYWJlbCBhIHNvY2tldCB1c2luZyB0aGUgTmV0TGFiZWwgbWVjaGFuaXNtIHVzaW5nIHRoZSBnaXZlbgorICogU0lELiAgUmV0dXJucyB6ZXJvIHZhbHVlcyBvbiBzdWNjZXNzLCBuZWdhdGl2ZSB2YWx1ZXMgb24gZmFpbHVyZS4gIFRoZQorICogY2FsbGVyIGlzIHJlc3BvbnNpYmlsZSBmb3IgY2FsbGluZyByY3VfcmVhZF9sb2NrKCkgYmVmb3JlIGNhbGxpbmcgdGhpcworICogdGhpcyBmdW5jdGlvbiBhbmQgcmN1X3JlYWRfdW5sb2NrKCkgYWZ0ZXIgdGhpcyBmdW5jdGlvbiByZXR1cm5zLgorICoKKyAqLworc3RhdGljIGludCBzZWxpbnV4X25ldGxibF9zb2NrZXRfc2V0c2lkKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHUzMiBzaWQpCit7CisJaW50IHJjOworCXN0cnVjdCBza19zZWN1cml0eV9zdHJ1Y3QgKnNrc2VjID0gc29jay0+c2stPnNrX3NlY3VyaXR5OworCXN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHIgc2VjYXR0cjsKKworCXJjID0gc2VjdXJpdHlfbmV0bGJsX3NpZF90b19zZWNhdHRyKHNpZCwgJnNlY2F0dHIpOworCWlmIChyYyAhPSAwKQorCQlyZXR1cm4gcmM7CisKKwlyYyA9IG5ldGxibF9zb2NrZXRfc2V0YXR0cihzb2NrLCAmc2VjYXR0cik7CisJaWYgKHJjID09IDApIHsKKwkJc3Bpbl9sb2NrX2JoKCZza3NlYy0+bmxibF9sb2NrKTsKKwkJc2tzZWMtPm5sYmxfc3RhdGUgPSBOTEJMX0xBQkVMRUQ7CisJCXNwaW5fdW5sb2NrX2JoKCZza3NlYy0+bmxibF9sb2NrKTsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogc2VsaW51eF9uZXRsYmxfY2FjaGVfaW52YWxpZGF0ZSAtIEludmFsaWRhdGUgdGhlIE5ldExhYmVsIGNhY2hlCisgKgorICogRGVzY3JpcHRpb246CisgKiBJbnZhbGlkYXRlIHRoZSBOZXRMYWJlbCBzZWN1cml0eSBhdHRyaWJ1dGUgbWFwcGluZyBjYWNoZS4KKyAqCisgKi8KK3ZvaWQgc2VsaW51eF9uZXRsYmxfY2FjaGVfaW52YWxpZGF0ZSh2b2lkKQoreworCW5ldGxibF9jYWNoZV9pbnZhbGlkYXRlKCk7Cit9CisKKy8qKgorICogc2VsaW51eF9uZXRsYmxfc2tfc2VjdXJpdHlfcmVzZXQgLSBSZXNldCB0aGUgTmV0TGFiZWwgZmllbGRzCisgKiBAc3NlYzogdGhlIHNrX3NlY3VyaXR5X3N0cnVjdAorICogQGZhbWlseTogdGhlIHNvY2tldCBmYW1pbHkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENhbGxlZCB3aGVuIHRoZSBOZXRMYWJlbCBzdGF0ZSBvZiBhIHNrX3NlY3VyaXR5X3N0cnVjdCBuZWVkcyB0byBiZSByZXNldC4KKyAqIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2liaWxlIGZvciBhbGwgdGhlIE5ldExhYmVsIHNrX3NlY3VyaXR5X3N0cnVjdCBsb2NraW5nLgorICoKKyAqLwordm9pZCBzZWxpbnV4X25ldGxibF9za19zZWN1cml0eV9yZXNldChzdHJ1Y3Qgc2tfc2VjdXJpdHlfc3RydWN0ICpzc2VjLAorCQkJCSAgICAgIGludCBmYW1pbHkpCit7CisgICAgICAgIGlmIChmYW1pbHkgPT0gUEZfSU5FVCkKKwkJc3NlYy0+bmxibF9zdGF0ZSA9IE5MQkxfUkVRVUlSRTsKKwllbHNlCisJCXNzZWMtPm5sYmxfc3RhdGUgPSBOTEJMX1VOU0VUOworfQorCisvKioKKyAqIHNlbGludXhfbmV0bGJsX3NrX3NlY3VyaXR5X2luaXQgLSBTZXR1cCB0aGUgTmV0TGFiZWwgZmllbGRzCisgKiBAc3NlYzogdGhlIHNrX3NlY3VyaXR5X3N0cnVjdAorICogQGZhbWlseTogdGhlIHNvY2tldCBmYW1pbHkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENhbGxlZCB3aGVuIGEgbmV3IHNrX3NlY3VyaXR5X3N0cnVjdCBpcyBhbGxvY2F0ZWQgdG8gaW5pdGlhbGl6ZSB0aGUgTmV0TGFiZWwKKyAqIGZpZWxkcy4KKyAqCisgKi8KK3ZvaWQgc2VsaW51eF9uZXRsYmxfc2tfc2VjdXJpdHlfaW5pdChzdHJ1Y3Qgc2tfc2VjdXJpdHlfc3RydWN0ICpzc2VjLAorCQkJCSAgICAgaW50IGZhbWlseSkKK3sKKwkvKiBObyBsb2NraW5nIG5lZWRlZCwgd2UgYXJlIHRoZSBvbmx5IG9uZSB3aG8gaGFzIGFjY2VzcyB0byBzc2VjICovCisJc2VsaW51eF9uZXRsYmxfc2tfc2VjdXJpdHlfcmVzZXQoc3NlYywgZmFtaWx5KTsKKwlzcGluX2xvY2tfaW5pdCgmc3NlYy0+bmxibF9sb2NrKTsKK30KKworLyoqCisgKiBzZWxpbnV4X25ldGxibF9za19zZWN1cml0eV9jbG9uZSAtIENvcHkgdGhlIE5ldExhYmVsIGZpZWxkcworICogQHNzZWM6IHRoZSBvcmlnaW5hbCBza19zZWN1cml0eV9zdHJ1Y3QKKyAqIEBuZXdzc2VjOiB0aGUgY2xvbmVkIHNrX3NlY3VyaXR5X3N0cnVjdAorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ2xvbmUgdGhlIE5ldExhYmVsIHNwZWNpZmljIHNrX3NlY3VyaXR5X3N0cnVjdCBmaWVsZHMgZnJvbSBAc3NlYyB0bworICogQG5ld3NzZWMuCisgKgorICovCit2b2lkIHNlbGludXhfbmV0bGJsX3NrX3NlY3VyaXR5X2Nsb25lKHN0cnVjdCBza19zZWN1cml0eV9zdHJ1Y3QgKnNzZWMsCisJCQkJICAgICAgc3RydWN0IHNrX3NlY3VyaXR5X3N0cnVjdCAqbmV3c3NlYykKK3sKKwkvKiBXZSBkb24ndCBuZWVkIHRvIHRha2UgbmV3c3NlYy0+bmxibF9sb2NrIGJlY2F1c2Ugd2UgYXJlIHRoZSBvbmx5CisJICogdGhyZWFkIHdpdGggYWNjZXNzIHRvIG5ld3NzZWMsIGJ1dCB3ZSBkbyBuZWVkIHRvIHRha2UgdGhlIFJDVSByZWFkCisJICogbG9jayBhcyBvdGhlciB0aHJlYWRzIGNvdWxkIGhhdmUgYWNjZXNzIHRvIHNzZWMgKi8KKwlyY3VfcmVhZF9sb2NrKCk7CisJc2VsaW51eF9uZXRsYmxfc2tfc2VjdXJpdHlfcmVzZXQobmV3c3NlYywgc3NlYy0+c2stPnNrX2ZhbWlseSk7CisJbmV3c3NlYy0+c2NsYXNzID0gc3NlYy0+c2NsYXNzOworCXJjdV9yZWFkX3VubG9jaygpOworfQorCisvKioKKyAqIHNlbGludXhfbmV0bGJsX3NrYnVmZl9nZXRzaWQgLSBHZXQgdGhlIHNpZCBvZiBhIHBhY2tldCB1c2luZyBOZXRMYWJlbAorICogQHNrYjogdGhlIHBhY2tldAorICogQGJhc2Vfc2lkOiB0aGUgU0VMaW51eCBTSUQgdG8gdXNlIGFzIGEgY29udGV4dCBmb3IgTUxTIG9ubHkgYXR0cmlidXRlcworICogQHNpZDogdGhlIFNJRAorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ2FsbCB0aGUgTmV0TGFiZWwgbWVjaGFuaXNtIHRvIGdldCB0aGUgc2VjdXJpdHkgYXR0cmlidXRlcyBvZiB0aGUgZ2l2ZW4KKyAqIHBhY2tldCBhbmQgdXNlIHRob3NlIGF0dHJpYnV0ZXMgdG8gZGV0ZXJtaW5lIHRoZSBjb3JyZWN0IGNvbnRleHQvU0lEIHRvCisgKiBhc3NpZ24gdG8gdGhlIHBhY2tldC4gIFJldHVybnMgemVybyBvbiBzdWNjZXNzLCBuZWdhdGl2ZSB2YWx1ZXMgb24gZmFpbHVyZS4KKyAqCisgKi8KK2ludCBzZWxpbnV4X25ldGxibF9za2J1ZmZfZ2V0c2lkKHN0cnVjdCBza19idWZmICpza2IsIHUzMiBiYXNlX3NpZCwgdTMyICpzaWQpCit7CisJaW50IHJjOworCXN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHIgc2VjYXR0cjsKKworCW5ldGxibF9zZWNhdHRyX2luaXQoJnNlY2F0dHIpOworCXJjID0gbmV0bGJsX3NrYnVmZl9nZXRhdHRyKHNrYiwgJnNlY2F0dHIpOworCWlmIChyYyA9PSAwICYmIHNlY2F0dHIuZmxhZ3MgIT0gTkVUTEJMX1NFQ0FUVFJfTk9ORSkKKwkJcmMgPSBzZWN1cml0eV9uZXRsYmxfc2VjYXR0cl90b19zaWQoJnNlY2F0dHIsCisJCQkJCQkgICAgYmFzZV9zaWQsCisJCQkJCQkgICAgc2lkKTsKKwllbHNlCisJCSpzaWQgPSBTRUNTSURfTlVMTDsKKwluZXRsYmxfc2VjYXR0cl9kZXN0cm95KCZzZWNhdHRyKTsKKworCXJldHVybiByYzsKK30KKworLyoqCisgKiBzZWxpbnV4X25ldGxibF9zb2NrX2dyYWZ0IC0gTmV0bGFiZWwgdGhlIG5ldyBzb2NrZXQKKyAqIEBzazogdGhlIG5ldyBjb25uZWN0aW9uCisgKiBAc29jazogdGhlIG5ldyBzb2NrZXQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoZSBjb25uZWN0aW9uIHJlcHJlc2VudGVkIGJ5IEBzayBpcyBiZWluZyBncmFmdGVkIG9udG8gQHNvY2sgc28gc2V0IHRoZQorICogc29ja2V0J3MgTmV0TGFiZWwgdG8gbWF0Y2ggdGhlIFNJRCBvZiBAc2suCisgKgorICovCit2b2lkIHNlbGludXhfbmV0bGJsX3NvY2tfZ3JhZnQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrKQoreworCXN0cnVjdCBpbm9kZV9zZWN1cml0eV9zdHJ1Y3QgKmlzZWMgPSBTT0NLX0lOT0RFKHNvY2spLT5pX3NlY3VyaXR5OworCXN0cnVjdCBza19zZWN1cml0eV9zdHJ1Y3QgKnNrc2VjID0gc2stPnNrX3NlY3VyaXR5OworCXN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHIgc2VjYXR0cjsKKwl1MzIgbmxibF9wZWVyX3NpZDsKKworCXNrc2VjLT5zY2xhc3MgPSBpc2VjLT5zY2xhc3M7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisKKwlpZiAoc2tzZWMtPm5sYmxfc3RhdGUgIT0gTkxCTF9SRVFVSVJFKSB7CisJCXJjdV9yZWFkX3VubG9jaygpOworCQlyZXR1cm47CisJfQorCisJbmV0bGJsX3NlY2F0dHJfaW5pdCgmc2VjYXR0cik7CisJaWYgKG5ldGxibF9zb2NrX2dldGF0dHIoc2ssICZzZWNhdHRyKSA9PSAwICYmCisJICAgIHNlY2F0dHIuZmxhZ3MgIT0gTkVUTEJMX1NFQ0FUVFJfTk9ORSAmJgorCSAgICBzZWN1cml0eV9uZXRsYmxfc2VjYXR0cl90b19zaWQoJnNlY2F0dHIsCisJCQkJCSAgIFNFQ0lOSVRTSURfVU5MQUJFTEVELAorCQkJCQkgICAmbmxibF9wZWVyX3NpZCkgPT0gMCkKKwkJc2tzZWMtPnBlZXJfc2lkID0gbmxibF9wZWVyX3NpZDsKKwluZXRsYmxfc2VjYXR0cl9kZXN0cm95KCZzZWNhdHRyKTsKKworCS8qIFRyeSB0byBzZXQgdGhlIE5ldExhYmVsIG9uIHRoZSBzb2NrZXQgdG8gc2F2ZSB0aW1lIGxhdGVyLCBpZiB3ZSBmYWlsCisJICogaGVyZSB3ZSB3aWxsIHBpY2sgdXAgdGhlIHBpZWNlcyBpbiBsYXRlciBjYWxscyB0bworCSAqIHNlbGludXhfbmV0bGJsX2lub2RlX3Blcm1pc3Npb24oKS4gKi8KKwlzZWxpbnV4X25ldGxibF9zb2NrZXRfc2V0c2lkKHNvY2ssIHNrc2VjLT5zaWQpOworCisJcmN1X3JlYWRfdW5sb2NrKCk7Cit9CisKKy8qKgorICogc2VsaW51eF9uZXRsYmxfc29ja2V0X3Bvc3RfY3JlYXRlIC0gTGFiZWwgYSBzb2NrZXQgdXNpbmcgTmV0TGFiZWwKKyAqIEBzb2NrOiB0aGUgc29ja2V0IHRvIGxhYmVsCisgKgorICogRGVzY3JpcHRpb246CisgKiBBdHRlbXB0IHRvIGxhYmVsIGEgc29ja2V0IHVzaW5nIHRoZSBOZXRMYWJlbCBtZWNoYW5pc20gdXNpbmcgdGhlIGdpdmVuCisgKiBTSUQuICBSZXR1cm5zIHplcm8gdmFsdWVzIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIHZhbHVlcyBvbiBmYWlsdXJlLgorICoKKyAqLworaW50IHNlbGludXhfbmV0bGJsX3NvY2tldF9wb3N0X2NyZWF0ZShzdHJ1Y3Qgc29ja2V0ICpzb2NrKQoreworCWludCByYyA9IDA7CisJc3RydWN0IGlub2RlX3NlY3VyaXR5X3N0cnVjdCAqaXNlYyA9IFNPQ0tfSU5PREUoc29jayktPmlfc2VjdXJpdHk7CisJc3RydWN0IHNrX3NlY3VyaXR5X3N0cnVjdCAqc2tzZWMgPSBzb2NrLT5zay0+c2tfc2VjdXJpdHk7CisKKwlza3NlYy0+c2NsYXNzID0gaXNlYy0+c2NsYXNzOworCisJcmN1X3JlYWRfbG9jaygpOworCWlmIChza3NlYy0+bmxibF9zdGF0ZSA9PSBOTEJMX1JFUVVJUkUpCisJCXJjID0gc2VsaW51eF9uZXRsYmxfc29ja2V0X3NldHNpZChzb2NrLCBza3NlYy0+c2lkKTsKKwlyY3VfcmVhZF91bmxvY2soKTsKKworCXJldHVybiByYzsKK30KKworLyoqCisgKiBzZWxpbnV4X25ldGxibF9pbm9kZV9wZXJtaXNzaW9uIC0gVmVyaWZ5IHRoZSBzb2NrZXQgaXMgTmV0TGFiZWwgbGFiZWxlZAorICogQGlub2RlOiB0aGUgZmlsZSBkZXNjcmlwdG9yJ3MgaW5vZGUKKyAqIEBtYXNrOiB0aGUgcGVybWlzc2lvbiBtYXNrCisgKgorICogRGVzY3JpcHRpb246CisgKiBMb29rcyBhdCBhIGZpbGUncyBpbm9kZSBhbmQgaWYgaXQgaXMgbWFya2VkIGFzIGEgc29ja2V0IHByb3RlY3RlZCBieQorICogTmV0TGFiZWwgdGhlbiB2ZXJpZnkgdGhhdCB0aGUgc29ja2V0IGhhcyBiZWVuIGxhYmVsZWQsIGlmIG5vdCB0cnkgdG8gbGFiZWwKKyAqIHRoZSBzb2NrZXQgbm93IHdpdGggdGhlIGlub2RlJ3MgU0lELiAgUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlCisgKiB2YWx1ZXMgb24gZmFpbHVyZS4KKyAqCisgKi8KK2ludCBzZWxpbnV4X25ldGxibF9pbm9kZV9wZXJtaXNzaW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrKQoreworCWludCByYzsKKwlzdHJ1Y3Qgc2tfc2VjdXJpdHlfc3RydWN0ICpza3NlYzsKKwlzdHJ1Y3Qgc29ja2V0ICpzb2NrOworCisJaWYgKCFTX0lTU09DSyhpbm9kZS0+aV9tb2RlKSB8fAorCSAgICAoKG1hc2sgJiAoTUFZX1dSSVRFIHwgTUFZX0FQUEVORCkpID09IDApKQorCQlyZXR1cm4gMDsKKwlzb2NrID0gU09DS0VUX0koaW5vZGUpOworCXNrc2VjID0gc29jay0+c2stPnNrX3NlY3VyaXR5OworCisJcmN1X3JlYWRfbG9jaygpOworCWlmIChza3NlYy0+bmxibF9zdGF0ZSAhPSBOTEJMX1JFUVVJUkUpIHsKKwkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCXJldHVybiAwOworCX0KKwlsb2NhbF9iaF9kaXNhYmxlKCk7CisJYmhfbG9ja19zb2NrX25lc3RlZChzb2NrLT5zayk7CisJcmMgPSBzZWxpbnV4X25ldGxibF9zb2NrZXRfc2V0c2lkKHNvY2ssIHNrc2VjLT5zaWQpOworCWJoX3VubG9ja19zb2NrKHNvY2stPnNrKTsKKwlsb2NhbF9iaF9lbmFibGUoKTsKKwlyY3VfcmVhZF91bmxvY2soKTsKKworCXJldHVybiByYzsKK30KKworLyoqCisgKiBzZWxpbnV4X25ldGxibF9zb2NrX3Jjdl9za2IgLSBEbyBhbiBpbmJvdW5kIGFjY2VzcyBjaGVjayB1c2luZyBOZXRMYWJlbAorICogQHNrc2VjOiB0aGUgc29jaydzIHNrX3NlY3VyaXR5X3N0cnVjdAorICogQHNrYjogdGhlIHBhY2tldAorICogQGFkOiB0aGUgYXVkaXQgZGF0YQorICoKKyAqIERlc2NyaXB0aW9uOgorICogRmV0Y2ggdGhlIE5ldExhYmVsIHNlY3VyaXR5IGF0dHJpYnV0ZXMgZnJvbSBAc2tiIGFuZCBwZXJmb3JtIGFuIGFjY2VzcyBjaGVjaworICogYWdhaW5zdCB0aGUgcmVjZWl2aW5nIHNvY2tldC4gIFJldHVybnMgemVybyBvbiBzdWNjZXNzLCBuZWdhdGl2ZSB2YWx1ZXMgb24KKyAqIGVycm9yLgorICoKKyAqLworaW50IHNlbGludXhfbmV0bGJsX3NvY2tfcmN2X3NrYihzdHJ1Y3Qgc2tfc2VjdXJpdHlfc3RydWN0ICpza3NlYywKKwkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCXN0cnVjdCBhdmNfYXVkaXRfZGF0YSAqYWQpCit7CisJaW50IHJjOworCXUzMiBuZXRsYmxfc2lkOworCXUzMiByZWN2X3Blcm07CisKKwlyYyA9IHNlbGludXhfbmV0bGJsX3NrYnVmZl9nZXRzaWQoc2tiLAorCQkJCQkgIFNFQ0lOSVRTSURfVU5MQUJFTEVELAorCQkJCQkgICZuZXRsYmxfc2lkKTsKKwlpZiAocmMgIT0gMCkKKwkJcmV0dXJuIHJjOworCisJaWYgKG5ldGxibF9zaWQgPT0gU0VDU0lEX05VTEwpCisJCXJldHVybiAwOworCisJc3dpdGNoIChza3NlYy0+c2NsYXNzKSB7CisJY2FzZSBTRUNDTEFTU19VRFBfU09DS0VUOgorCQlyZWN2X3Blcm0gPSBVRFBfU09DS0VUX19SRUNWRlJPTTsKKwkJYnJlYWs7CisJY2FzZSBTRUNDTEFTU19UQ1BfU09DS0VUOgorCQlyZWN2X3Blcm0gPSBUQ1BfU09DS0VUX19SRUNWRlJPTTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmVjdl9wZXJtID0gUkFXSVBfU09DS0VUX19SRUNWRlJPTTsKKwl9CisKKwlyYyA9IGF2Y19oYXNfcGVybShza3NlYy0+c2lkLAorCQkJICBuZXRsYmxfc2lkLAorCQkJICBza3NlYy0+c2NsYXNzLAorCQkJICByZWN2X3Blcm0sCisJCQkgIGFkKTsKKwlpZiAocmMgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwluZXRsYmxfc2tidWZmX2Vycihza2IsIHJjKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogc2VsaW51eF9uZXRsYmxfc29ja2V0X3NldHNvY2tvcHQgLSBEbyBub3QgYWxsb3cgdXNlcnMgdG8gcmVtb3ZlIGEgTmV0TGFiZWwKKyAqIEBzb2NrOiB0aGUgc29ja2V0CisgKiBAbGV2ZWw6IHRoZSBzb2NrZXQgbGV2ZWwgb3IgcHJvdG9jb2wKKyAqIEBvcHRuYW1lOiB0aGUgc29ja2V0IG9wdGlvbiBuYW1lCisgKgorICogRGVzY3JpcHRpb246CisgKiBDaGVjayB0aGUgc2V0c29ja29wdCgpIGNhbGwgYW5kIGlmIHRoZSB1c2VyIGlzIHRyeWluZyB0byByZXBsYWNlIHRoZSBJUAorICogb3B0aW9ucyBvbiBhIHNvY2tldCBhbmQgYSBOZXRMYWJlbCBpcyBpbiBwbGFjZSBmb3IgdGhlIHNvY2tldCBkZW55IHRoZQorICogYWNjZXNzOyBvdGhlcndpc2UgYWxsb3cgdGhlIGFjY2Vzcy4gIFJldHVybnMgemVybyB3aGVuIHRoZSBhY2Nlc3MgaXMKKyAqIGFsbG93ZWQsIC1FQUNDRVMgd2hlbiBkZW5pZWQsIGFuZCBvdGhlciBuZWdhdGl2ZSB2YWx1ZXMgb24gZXJyb3IuCisgKgorICovCitpbnQgc2VsaW51eF9uZXRsYmxfc29ja2V0X3NldHNvY2tvcHQoc3RydWN0IHNvY2tldCAqc29jaywKKwkJCQkgICAgIGludCBsZXZlbCwKKwkJCQkgICAgIGludCBvcHRuYW1lKQoreworCWludCByYyA9IDA7CisJc3RydWN0IHNrX3NlY3VyaXR5X3N0cnVjdCAqc2tzZWMgPSBzb2NrLT5zay0+c2tfc2VjdXJpdHk7CisJc3RydWN0IG5ldGxibF9sc21fc2VjYXR0ciBzZWNhdHRyOworCisJcmN1X3JlYWRfbG9jaygpOworCWlmIChsZXZlbCA9PSBJUFBST1RPX0lQICYmIG9wdG5hbWUgPT0gSVBfT1BUSU9OUyAmJgorCSAgICBza3NlYy0+bmxibF9zdGF0ZSA9PSBOTEJMX0xBQkVMRUQpIHsKKwkJbmV0bGJsX3NlY2F0dHJfaW5pdCgmc2VjYXR0cik7CisJCXJjID0gbmV0bGJsX3NvY2tldF9nZXRhdHRyKHNvY2ssICZzZWNhdHRyKTsKKwkJaWYgKHJjID09IDAgJiYgc2VjYXR0ci5mbGFncyAhPSBORVRMQkxfU0VDQVRUUl9OT05FKQorCQkJcmMgPSAtRUFDQ0VTOworCQluZXRsYmxfc2VjYXR0cl9kZXN0cm95KCZzZWNhdHRyKTsKKwl9CisJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwlyZXR1cm4gcmM7Cit9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L25ldGxpbmsuYyBiL3NlY3VyaXR5L3NlbGludXgvbmV0bGluay5jCmluZGV4IGUyMDM4ODMuLmY0OTA0NmQgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvbmV0bGluay5jCisrKyBiL3NlY3VyaXR5L3NlbGludXgvbmV0bGluay5jCkBAIC02Niw3ICs2Niw3IEBACiBzdGF0aWMgdm9pZCBzZWxubF9ub3RpZnkoaW50IG1zZ3R5cGUsIHZvaWQgKmRhdGEpCiB7CiAJaW50IGxlbjsKLQl1bnNpZ25lZCBjaGFyICp0bXA7CisJc2tfYnVmZl9kYXRhX3QgdG1wOwogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IG5sbXNnaGRyICpubGg7CiAJCkBAIC0xMDQsNyArMTA0LDcgQEAKIAogc3RhdGljIGludCBfX2luaXQgc2VsbmxfaW5pdCh2b2lkKQogewotCXNlbG5sID0gbmV0bGlua19rZXJuZWxfY3JlYXRlKE5FVExJTktfU0VMSU5VWCwgU0VMTkxHUlBfTUFYLCBOVUxMLAorCXNlbG5sID0gbmV0bGlua19rZXJuZWxfY3JlYXRlKE5FVExJTktfU0VMSU5VWCwgU0VMTkxHUlBfTUFYLCBOVUxMLCBOVUxMLAogCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRISVNfTU9EVUxFKTsKIAlpZiAoc2VsbmwgPT0gTlVMTCkKIAkJcGFuaWMoIlNFTGludXg6ICBDYW5ub3QgY3JlYXRlIG5ldGxpbmsgc29ja2V0LiIpOwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9zZWxpbnV4ZnMuYyBiL3NlY3VyaXR5L3NlbGludXgvc2VsaW51eGZzLmMKaW5kZXggOTNiMzE3Ny4uYWNhMDk5YSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9zZWxpbnV4ZnMuYworKysgYi9zZWN1cml0eS9zZWxpbnV4L3NlbGludXhmcy5jCkBAIC05NiwxMiArOTYsMTggQEAKIAlTRUxfQ09NTUlUX0JPT0xTLCAvKiBjb21taXQgbmV3IGJvb2xlYW4gdmFsdWVzICovCiAJU0VMX01MUywJLyogcmV0dXJuIGlmIE1MUyBwb2xpY3kgaXMgZW5hYmxlZCAqLwogCVNFTF9ESVNBQkxFLAkvKiBkaXNhYmxlIFNFTGludXggdW50aWwgbmV4dCByZWJvb3QgKi8KLQlTRUxfQVZDLAkvKiBBVkMgbWFuYWdlbWVudCBkaXJlY3RvcnkgKi8KIAlTRUxfTUVNQkVSLAkvKiBjb21wdXRlIHBvbHlpbnN0YW50aWF0aW9uIG1lbWJlcnNoaXAgZGVjaXNpb24gKi8KIAlTRUxfQ0hFQ0tSRVFQUk9ULCAvKiBjaGVjayByZXF1ZXN0ZWQgcHJvdGVjdGlvbiwgbm90IGtlcm5lbC1hcHBsaWVkIG9uZSAqLwogCVNFTF9DT01QQVRfTkVULAkvKiB3aGV0aGVyIHRvIHVzZSBvbGQgY29tcGF0IG5ldHdvcmsgcGFja2V0IGNvbnRyb2xzICovCisJU0VMX0lOT19ORVhULAkvKiBUaGUgbmV4dCBpbm9kZSBudW1iZXIgdG8gdXNlICovCiB9OwogCitzdGF0aWMgdW5zaWduZWQgbG9uZyBzZWxfbGFzdF9pbm8gPSBTRUxfSU5PX05FWFQgLSAxOworCisjZGVmaW5lIFNFTF9JTklUQ09OX0lOT19PRkZTRVQgCTB4MDEwMDAwMDAKKyNkZWZpbmUgU0VMX0JPT0xfSU5PX09GRlNFVAkweDAyMDAwMDAwCisjZGVmaW5lIFNFTF9JTk9fTUFTSwkJMHgwMGZmZmZmZgorCiAjZGVmaW5lIFRNUEJVRkxFTgkxMgogc3RhdGljIHNzaXplX3Qgc2VsX3JlYWRfZW5mb3JjZShzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKmJ1ZiwKIAkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKQEAgLTc3Nyw4ICs3ODMsNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLSNkZWZpbmUgQk9PTF9JTk9fT0ZGU0VUIDMwCi0KIHN0YXRpYyBzc2l6ZV90IHNlbF9yZWFkX2Jvb2woc3RydWN0IGZpbGUgKmZpbGVwLCBjaGFyIF9fdXNlciAqYnVmLAogCQkJICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIHsKQEAgLTgwNiwxNCArODEwLDE0IEBACiAJfQogCiAJaW5vZGUgPSBmaWxlcC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKLQljdXJfZW5mb3JjaW5nID0gc2VjdXJpdHlfZ2V0X2Jvb2xfdmFsdWUoaW5vZGUtPmlfaW5vIC0gQk9PTF9JTk9fT0ZGU0VUKTsKKwljdXJfZW5mb3JjaW5nID0gc2VjdXJpdHlfZ2V0X2Jvb2xfdmFsdWUoaW5vZGUtPmlfaW5vJlNFTF9JTk9fTUFTSyk7CiAJaWYgKGN1cl9lbmZvcmNpbmcgPCAwKSB7CiAJCXJldCA9IGN1cl9lbmZvcmNpbmc7CiAJCWdvdG8gb3V0OwogCX0KIAogCWxlbmd0aCA9IHNjbnByaW50ZihwYWdlLCBQQUdFX1NJWkUsICIlZCAlZCIsIGN1cl9lbmZvcmNpbmcsCi0JCQkgIGJvb2xfcGVuZGluZ192YWx1ZXNbaW5vZGUtPmlfaW5vIC0gQk9PTF9JTk9fT0ZGU0VUXSk7CisJCQkgIGJvb2xfcGVuZGluZ192YWx1ZXNbaW5vZGUtPmlfaW5vJlNFTF9JTk9fTUFTS10pOwogCXJldCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgY291bnQsIHBwb3MsIHBhZ2UsIGxlbmd0aCk7CiBvdXQ6CiAJbXV0ZXhfdW5sb2NrKCZzZWxfbXV0ZXgpOwpAQCAtODY1LDcgKzg2OSw3IEBACiAJCW5ld192YWx1ZSA9IDE7CiAKIAlpbm9kZSA9IGZpbGVwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwotCWJvb2xfcGVuZGluZ192YWx1ZXNbaW5vZGUtPmlfaW5vIC0gQk9PTF9JTk9fT0ZGU0VUXSA9IG5ld192YWx1ZTsKKwlib29sX3BlbmRpbmdfdmFsdWVzW2lub2RlLT5pX2lubyZTRUxfSU5PX01BU0tdID0gbmV3X3ZhbHVlOwogCWxlbmd0aCA9IGNvdW50OwogCiBvdXQ6CkBAIC0xMDI5LDcgKzEwMzMsNyBAQAogCQlpc2VjLT5zaWQgPSBzaWQ7CiAJCWlzZWMtPmluaXRpYWxpemVkID0gMTsKIAkJaW5vZGUtPmlfZm9wID0gJnNlbF9ib29sX29wczsKLQkJaW5vZGUtPmlfaW5vID0gaSArIEJPT0xfSU5PX09GRlNFVDsKKwkJaW5vZGUtPmlfaW5vID0gaXxTRUxfQk9PTF9JTk9fT0ZGU0VUOwogCQlkX2FkZChkZW50cnksIGlub2RlKTsKIAl9CiAJYm9vbF9udW0gPSBudW07CkBAIC0xMjM0LDYgKzEyMzgsNTYgQEAKIAkJCWdvdG8gb3V0OwogCQl9CiAJCWlub2RlLT5pX2ZvcCA9IGZpbGVzW2ldLm9wczsKKwkJaW5vZGUtPmlfaW5vID0gKytzZWxfbGFzdF9pbm87CisJCWRfYWRkKGRlbnRyeSwgaW5vZGUpOworCX0KK291dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBzZWxfcmVhZF9pbml0Y29uKHN0cnVjdCBmaWxlICogZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCWNoYXIgKmNvbjsKKwl1MzIgc2lkLCBsZW47CisJc3NpemVfdCByZXQ7CisKKwlpbm9kZSA9IGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CisJc2lkID0gaW5vZGUtPmlfaW5vJlNFTF9JTk9fTUFTSzsKKwlyZXQgPSBzZWN1cml0eV9zaWRfdG9fY29udGV4dChzaWQsICZjb24sICZsZW4pOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBjb3VudCwgcHBvcywgY29uLCBsZW4pOworCWtmcmVlKGNvbik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc2VsX2luaXRjb25fb3BzID0geworCS5yZWFkCQk9IHNlbF9yZWFkX2luaXRjb24sCit9OworCitzdGF0aWMgaW50IHNlbF9tYWtlX2luaXRjb25fZmlsZXMoc3RydWN0IGRlbnRyeSAqZGlyKQoreworCWludCBpLCByZXQgPSAwOworCisJZm9yIChpID0gMTsgaSA8PSBTRUNJTklUU0lEX05VTTsgaSsrKSB7CisJCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKKwkJZGVudHJ5ID0gZF9hbGxvY19uYW1lKGRpciwgc2VjdXJpdHlfZ2V0X2luaXRpYWxfc2lkX2NvbnRleHQoaSkpOworCQlpZiAoIWRlbnRyeSkgeworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaW5vZGUgPSBzZWxfbWFrZV9pbm9kZShkaXItPmRfc2IsIFNfSUZSRUd8U19JUlVHTyk7CisJCWlmICghaW5vZGUpIHsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlnb3RvIG91dDsKKwkJfQorCQlpbm9kZS0+aV9mb3AgPSAmc2VsX2luaXRjb25fb3BzOworCQlpbm9kZS0+aV9pbm8gPSBpfFNFTF9JTklUQ09OX0lOT19PRkZTRVQ7CiAJCWRfYWRkKGRlbnRyeSwgaW5vZGUpOwogCX0KIG91dDoKQEAgLTEyNTIsNiArMTMwNiw3IEBACiAJfQogCWlub2RlLT5pX29wID0gJnNpbXBsZV9kaXJfaW5vZGVfb3BlcmF0aW9uczsKIAlpbm9kZS0+aV9mb3AgPSAmc2ltcGxlX2Rpcl9vcGVyYXRpb25zOworCWlub2RlLT5pX2lubyA9ICsrc2VsX2xhc3RfaW5vOwogCS8qIGRpcmVjdG9yeSBpbm9kZXMgc3RhcnQgb2ZmIHdpdGggaV9ubGluayA9PSAyIChmb3IgIi4iIGVudHJ5KSAqLwogCWluY19ubGluayhpbm9kZSk7CiAJZF9hZGQoZGVudHJ5LCBpbm9kZSk7CkBAIC0xMzE0LDYgKzEzNjksNyBAQAogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIGVycjsKIAl9CisJaW5vZGUtPmlfaW5vID0gKytzZWxfbGFzdF9pbm87CiAJaXNlYyA9IChzdHJ1Y3QgaW5vZGVfc2VjdXJpdHlfc3RydWN0Kilpbm9kZS0+aV9zZWN1cml0eTsKIAlpc2VjLT5zaWQgPSBTRUNJTklUU0lEX0RFVk5VTEw7CiAJaXNlYy0+c2NsYXNzID0gU0VDQ0xBU1NfQ0hSX0ZJTEU7CkBAIC0xMzM2LDYgKzEzOTIsMjEgQEAKIAlyZXQgPSBzZWxfbWFrZV9hdmNfZmlsZXMoZGVudHJ5KTsKIAlpZiAocmV0KQogCQlnb3RvIGVycjsKKworCWRlbnRyeSA9IGRfYWxsb2NfbmFtZShzYi0+c19yb290LCAiaW5pdGlhbF9jb250ZXh0cyIpOworCWlmICghZGVudHJ5KSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyOworCX0KKworCXJldCA9IHNlbF9tYWtlX2Rpcihyb290X2lub2RlLCBkZW50cnkpOworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCisJcmV0ID0gc2VsX21ha2VfaW5pdGNvbl9maWxlcyhkZW50cnkpOworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCiBvdXQ6CiAJcmV0dXJuIHJldDsKIGVycjoKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvc3Mvc2VydmljZXMuYyBiL3NlY3VyaXR5L3NlbGludXgvc3Mvc2VydmljZXMuYwppbmRleCAxZTUyMzU2Li40MDY2MGZmIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L3NzL3NlcnZpY2VzLmMKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9zcy9zZXJ2aWNlcy5jCkBAIC0zOSw3ICszOSw2IEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9hdWRpdC5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0jaW5jbHVkZSA8bmV0L3NvY2suaD4KICNpbmNsdWRlIDxuZXQvbmV0bGFiZWwuaD4KIAogI2luY2x1ZGUgImZsYXNrLmgiCkBAIC01Myw3ICs1Miw3IEBACiAjaW5jbHVkZSAiY29uZGl0aW9uYWwuaCIKICNpbmNsdWRlICJtbHMuaCIKICNpbmNsdWRlICJvYmpzZWMuaCIKLSNpbmNsdWRlICJzZWxpbnV4X25ldGxhYmVsLmgiCisjaW5jbHVkZSAibmV0bGFiZWwuaCIKICNpbmNsdWRlICJ4ZnJtLmgiCiAjaW5jbHVkZSAiZWJpdG1hcC5oIgogCkBAIC01OTQsNiArNTkzLDEzIEBACiAKICNpbmNsdWRlICJpbml0aWFsX3NpZF90b19zdHJpbmcuaCIKIAorY29uc3QgY2hhciAqc2VjdXJpdHlfZ2V0X2luaXRpYWxfc2lkX2NvbnRleHQodTMyIHNpZCkKK3sKKwlpZiAodW5saWtlbHkoc2lkID4gU0VDSU5JVFNJRF9OVU0pKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gaW5pdGlhbF9zaWRfdG9fc3RyaW5nW3NpZF07Cit9CisKIC8qKgogICogc2VjdXJpdHlfc2lkX3RvX2NvbnRleHQgLSBPYnRhaW4gYSBjb250ZXh0IGZvciBhIGdpdmVuIFNJRC4KICAqIEBzaWQ6IHNlY3VyaXR5IGlkZW50aWZpZXIsIFNJRApAQCAtMTA1MCw2ICsxMDU2LDggQEAKIAogCWZvciAoaSA9IDE7IGkgPCBrZGVmcy0+Y3RzX2xlbjsgaSsrKSB7CiAJCWRlZl9jbGFzcyA9IGtkZWZzLT5jbGFzc190b19zdHJpbmdbaV07CisJCWlmICghZGVmX2NsYXNzKQorCQkJY29udGludWU7CiAJCWlmIChpID4gcC0+cF9jbGFzc2VzLm5wcmltKSB7CiAJCQlwcmludGsoS0VSTl9JTkZPCiAJCQkgICAgICAgInNlY3VyaXR5OiAgY2xhc3MgJXMgbm90IGRlZmluZWQgaW4gcG9saWN5XG4iLApAQCAtMTI0OSw2ICsxMjU3LDcgQEAKIH0KIAogZXh0ZXJuIHZvaWQgc2VsaW51eF9jb21wbGV0ZV9pbml0KHZvaWQpOworc3RhdGljIGludCBzZWN1cml0eV9wcmVzZXJ2ZV9ib29scyhzdHJ1Y3QgcG9saWN5ZGIgKnApOwogCiAvKioKICAqIHNlY3VyaXR5X2xvYWRfcG9saWN5IC0gTG9hZCBhIHNlY3VyaXR5IHBvbGljeSBjb25maWd1cmF0aW9uLgpAQCAtMTMyNSw2ICsxMzM0LDEyIEBACiAJCWdvdG8gZXJyOwogCX0KIAorCXJjID0gc2VjdXJpdHlfcHJlc2VydmVfYm9vbHMoJm5ld3BvbGljeWRiKTsKKwlpZiAocmMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzZWN1cml0eTogIHVuYWJsZSB0byBwcmVzZXJ2ZSBib29sZWFuc1xuIik7CisJCWdvdG8gZXJyOworCX0KKwogCS8qIENsb25lIHRoZSBTSUQgdGFibGUuICovCiAJc2lkdGFiX3NodXRkb3duKCZzaWR0YWIpOwogCWlmIChzaWR0YWJfbWFwKCZzaWR0YWIsIGNsb25lX3NpZCwgJm5ld3NpZHRhYikpIHsKQEAgLTE4ODIsNiArMTg5NywzNyBAQAogCXJldHVybiByYzsKIH0KIAorc3RhdGljIGludCBzZWN1cml0eV9wcmVzZXJ2ZV9ib29scyhzdHJ1Y3QgcG9saWN5ZGIgKnApCit7CisJaW50IHJjLCBuYm9vbHMgPSAwLCAqYnZhbHVlcyA9IE5VTEwsIGk7CisJY2hhciAqKmJuYW1lcyA9IE5VTEw7CisJc3RydWN0IGNvbmRfYm9vbF9kYXR1bSAqYm9vbGRhdHVtOworCXN0cnVjdCBjb25kX25vZGUgKmN1cjsKKworCXJjID0gc2VjdXJpdHlfZ2V0X2Jvb2xzKCZuYm9vbHMsICZibmFtZXMsICZidmFsdWVzKTsKKwlpZiAocmMpCisJCWdvdG8gb3V0OworCWZvciAoaSA9IDA7IGkgPCBuYm9vbHM7IGkrKykgeworCQlib29sZGF0dW0gPSBoYXNodGFiX3NlYXJjaChwLT5wX2Jvb2xzLnRhYmxlLCBibmFtZXNbaV0pOworCQlpZiAoYm9vbGRhdHVtKQorCQkJYm9vbGRhdHVtLT5zdGF0ZSA9IGJ2YWx1ZXNbaV07CisJfQorCWZvciAoY3VyID0gcC0+Y29uZF9saXN0OyBjdXIgIT0gTlVMTDsgY3VyID0gY3VyLT5uZXh0KSB7CisJCXJjID0gZXZhbHVhdGVfY29uZF9ub2RlKHAsIGN1cik7CisJCWlmIChyYykKKwkJCWdvdG8gb3V0OworCX0KKworb3V0OgorCWlmIChibmFtZXMpIHsKKwkJZm9yIChpID0gMDsgaSA8IG5ib29sczsgaSsrKQorCQkJa2ZyZWUoYm5hbWVzW2ldKTsKKwl9CisJa2ZyZWUoYm5hbWVzKTsKKwlrZnJlZShidmFsdWVzKTsKKwlyZXR1cm4gcmM7Cit9CisKIC8qCiAgKiBzZWN1cml0eV9zaWRfbWxzX2NvcHkoKSAtIGNvbXB1dGVzIGEgbmV3IHNpZCBiYXNlZCBvbiB0aGUgZ2l2ZW4KICAqIHNpZCBhbmQgdGhlIG1scyBwb3J0aW9uIG9mIG1sc19zaWQuCkBAIC0yMTk4LDQxICsyMjQ0LDE1IEBACiAJYXVydWxlX2NhbGxiYWNrID0gY2FsbGJhY2s7CiB9CiAKLS8qKgotICogc2VjdXJpdHlfc2tiX2V4dGxibF9zaWQgLSBEZXRlcm1pbmUgdGhlIGV4dGVybmFsIGxhYmVsIG9mIGEgcGFja2V0Ci0gKiBAc2tiOiB0aGUgcGFja2V0Ci0gKiBAYmFzZV9zaWQ6IHRoZSBTRUxpbnV4IFNJRCB0byB1c2UgYXMgYSBjb250ZXh0IGZvciBNTFMgb25seSBleHRlcm5hbCBsYWJlbHMKLSAqIEBzaWQ6IHRoZSBwYWNrZXQncyBTSUQKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENoZWNrIHRoZSB2YXJpb3VzIGRpZmZlcmVudCBmb3JtcyBvZiBleHRlcm5hbCBwYWNrZXQgbGFiZWxpbmcgYW5kIGRldGVybWluZQotICogdGhlIGV4dGVybmFsIFNJRCBmb3IgdGhlIHBhY2tldC4KLSAqCi0gKi8KLXZvaWQgc2VjdXJpdHlfc2tiX2V4dGxibF9zaWQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIGJhc2Vfc2lkLCB1MzIgKnNpZCkKLXsKLQl1MzIgeGZybV9zaWQ7Ci0JdTMyIG5sYmxfc2lkOwotCi0Jc2VsaW51eF9za2JfeGZybV9zaWQoc2tiLCAmeGZybV9zaWQpOwotCWlmIChzZWxpbnV4X25ldGxibF9za2J1ZmZfZ2V0c2lkKHNrYiwKLQkJCQkJICh4ZnJtX3NpZCA9PSBTRUNTSURfTlVMTCA/Ci0JCQkJCSAgYmFzZV9zaWQgOiB4ZnJtX3NpZCksCi0JCQkJCSAmbmxibF9zaWQpICE9IDApCi0JCW5sYmxfc2lkID0gU0VDU0lEX05VTEw7Ci0KLQkqc2lkID0gKG5sYmxfc2lkID09IFNFQ1NJRF9OVUxMID8geGZybV9zaWQgOiBubGJsX3NpZCk7Ci19Ci0KICNpZmRlZiBDT05GSUdfTkVUTEFCRUwKIC8qCi0gKiBUaGlzIGlzIHRoZSBzdHJ1Y3R1cmUgd2Ugc3RvcmUgaW5zaWRlIHRoZSBOZXRMYWJlbCBjYWNoZSBibG9jay4KKyAqIE5ldExhYmVsIGNhY2hlIHN0cnVjdHVyZQogICovCi0jZGVmaW5lIE5FVExCTF9DQUNIRSh4KSAgICAgICAgICAgKChzdHJ1Y3QgbmV0bGJsX2NhY2hlICopKHgpKQorI2RlZmluZSBORVRMQkxfQ0FDSEUoeCkgICAgICAgICAgICgoc3RydWN0IHNlbGludXhfbmV0bGJsX2NhY2hlICopKHgpKQogI2RlZmluZSBORVRMQkxfQ0FDSEVfVF9OT05FICAgICAgIDAKICNkZWZpbmUgTkVUTEJMX0NBQ0hFX1RfU0lEICAgICAgICAxCiAjZGVmaW5lIE5FVExCTF9DQUNIRV9UX01MUyAgICAgICAgMgotc3RydWN0IG5ldGxibF9jYWNoZSB7CitzdHJ1Y3Qgc2VsaW51eF9uZXRsYmxfY2FjaGUgewogCXUzMiB0eXBlOwogCXVuaW9uIHsKIAkJdTMyIHNpZDsKQEAgLTIyNDEsNyArMjI2MSw3IEBACiB9OwogCiAvKioKLSAqIHNlbGludXhfbmV0bGJsX2NhY2hlX2ZyZWUgLSBGcmVlIHRoZSBOZXRMYWJlbCBjYWNoZWQgZGF0YQorICogc2VjdXJpdHlfbmV0bGJsX2NhY2hlX2ZyZWUgLSBGcmVlIHRoZSBOZXRMYWJlbCBjYWNoZWQgZGF0YQogICogQGRhdGE6IHRoZSBkYXRhIHRvIGZyZWUKICAqCiAgKiBEZXNjcmlwdGlvbjoKQEAgLTIyNDksOSArMjI2OSw5IEBACiAgKiBuZXRsYmxfbHNtX2NhY2hlIHN0cnVjdHVyZS4KICAqCiAgKi8KLXN0YXRpYyB2b2lkIHNlbGludXhfbmV0bGJsX2NhY2hlX2ZyZWUoY29uc3Qgdm9pZCAqZGF0YSkKK3N0YXRpYyB2b2lkIHNlY3VyaXR5X25ldGxibF9jYWNoZV9mcmVlKGNvbnN0IHZvaWQgKmRhdGEpCiB7Ci0Jc3RydWN0IG5ldGxibF9jYWNoZSAqY2FjaGU7CisJc3RydWN0IHNlbGludXhfbmV0bGJsX2NhY2hlICpjYWNoZTsKIAogCWlmIChkYXRhID09IE5VTEwpCiAJCXJldHVybjsKQEAgLTIyNjYsMzMgKzIyODYsMzMgQEAKIH0KIAogLyoqCi0gKiBzZWxpbnV4X25ldGxibF9jYWNoZV9hZGQgLSBBZGQgYW4gZW50cnkgdG8gdGhlIE5ldExhYmVsIGNhY2hlCi0gKiBAc2tiOiB0aGUgcGFja2V0CisgKiBzZWN1cml0eV9uZXRsYmxfY2FjaGVfYWRkIC0gQWRkIGFuIGVudHJ5IHRvIHRoZSBOZXRMYWJlbCBjYWNoZQorICogQHNlY2F0dHI6IHRoZSBOZXRMYWJlbCBwYWNrZXQgc2VjdXJpdHkgYXR0cmlidXRlcwogICogQGN0eDogdGhlIFNFTGludXggY29udGV4dAogICoKICAqIERlc2NyaXB0aW9uOgogICogQXR0ZW1wdCB0byBjYWNoZSB0aGUgY29udGV4dCBpbiBAY3R4LCB3aGljaCB3YXMgZGVyaXZlZCBmcm9tIHRoZSBwYWNrZXQgaW4KLSAqIEBza2IsIGluIHRoZSBOZXRMYWJlbCBzdWJzeXN0ZW0gY2FjaGUuCisgKiBAc2tiLCBpbiB0aGUgTmV0TGFiZWwgc3Vic3lzdGVtIGNhY2hlLiAgVGhpcyBmdW5jdGlvbiBhc3N1bWVzIEBzZWNhdHRyIGhhcworICogYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLgogICoKICAqLwotc3RhdGljIHZvaWQgc2VsaW51eF9uZXRsYmxfY2FjaGVfYWRkKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBjb250ZXh0ICpjdHgpCitzdGF0aWMgdm9pZCBzZWN1cml0eV9uZXRsYmxfY2FjaGVfYWRkKHN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHIgKnNlY2F0dHIsCisJCQkJICAgICAgc3RydWN0IGNvbnRleHQgKmN0eCkKIHsKLQlzdHJ1Y3QgbmV0bGJsX2NhY2hlICpjYWNoZSA9IE5VTEw7Ci0Jc3RydWN0IG5ldGxibF9sc21fc2VjYXR0ciBzZWNhdHRyOworCXN0cnVjdCBzZWxpbnV4X25ldGxibF9jYWNoZSAqY2FjaGUgPSBOVUxMOwogCi0JbmV0bGJsX3NlY2F0dHJfaW5pdCgmc2VjYXR0cik7Ci0Jc2VjYXR0ci5jYWNoZSA9IG5ldGxibF9zZWNhdHRyX2NhY2hlX2FsbG9jKEdGUF9BVE9NSUMpOwotCWlmIChzZWNhdHRyLmNhY2hlID09IE5VTEwpCi0JCWdvdG8gbmV0bGJsX2NhY2hlX2FkZF9yZXR1cm47CisJc2VjYXR0ci0+Y2FjaGUgPSBuZXRsYmxfc2VjYXR0cl9jYWNoZV9hbGxvYyhHRlBfQVRPTUlDKTsKKwlpZiAoc2VjYXR0ci0+Y2FjaGUgPT0gTlVMTCkKKwkJcmV0dXJuOwogCiAJY2FjaGUgPSBremFsbG9jKHNpemVvZigqY2FjaGUpLAlHRlBfQVRPTUlDKTsKIAlpZiAoY2FjaGUgPT0gTlVMTCkKLQkJZ290byBuZXRsYmxfY2FjaGVfYWRkX3JldHVybjsKKwkJcmV0dXJuOwogCiAJY2FjaGUtPnR5cGUgPSBORVRMQkxfQ0FDSEVfVF9NTFM7CiAJaWYgKGViaXRtYXBfY3B5KCZjYWNoZS0+ZGF0YS5tbHNfbGFiZWwubGV2ZWxbMF0uY2F0LAogCQkJJmN0eC0+cmFuZ2UubGV2ZWxbMF0uY2F0KSAhPSAwKQotCQlnb3RvIG5ldGxibF9jYWNoZV9hZGRfcmV0dXJuOworCQlyZXR1cm47CiAJY2FjaGUtPmRhdGEubWxzX2xhYmVsLmxldmVsWzFdLmNhdC5oaWdoYml0ID0KIAkJY2FjaGUtPmRhdGEubWxzX2xhYmVsLmxldmVsWzBdLmNhdC5oaWdoYml0OwogCWNhY2hlLT5kYXRhLm1sc19sYWJlbC5sZXZlbFsxXS5jYXQubm9kZSA9CkBAIC0yMzAwLDUyICsyMzIwLDQwIEBACiAJY2FjaGUtPmRhdGEubWxzX2xhYmVsLmxldmVsWzBdLnNlbnMgPSBjdHgtPnJhbmdlLmxldmVsWzBdLnNlbnM7CiAJY2FjaGUtPmRhdGEubWxzX2xhYmVsLmxldmVsWzFdLnNlbnMgPSBjdHgtPnJhbmdlLmxldmVsWzBdLnNlbnM7CiAKLQlzZWNhdHRyLmNhY2hlLT5mcmVlID0gc2VsaW51eF9uZXRsYmxfY2FjaGVfZnJlZTsKLQlzZWNhdHRyLmNhY2hlLT5kYXRhID0gKHZvaWQgKiljYWNoZTsKLQlzZWNhdHRyLmZsYWdzID0gTkVUTEJMX1NFQ0FUVFJfQ0FDSEU7Ci0KLQluZXRsYmxfY2FjaGVfYWRkKHNrYiwgJnNlY2F0dHIpOwotCi1uZXRsYmxfY2FjaGVfYWRkX3JldHVybjoKLQluZXRsYmxfc2VjYXR0cl9kZXN0cm95KCZzZWNhdHRyKTsKKwlzZWNhdHRyLT5jYWNoZS0+ZnJlZSA9IHNlY3VyaXR5X25ldGxibF9jYWNoZV9mcmVlOworCXNlY2F0dHItPmNhY2hlLT5kYXRhID0gKHZvaWQgKiljYWNoZTsKKwlzZWNhdHRyLT5mbGFncyB8PSBORVRMQkxfU0VDQVRUUl9DQUNIRTsKIH0KIAogLyoqCi0gKiBzZWxpbnV4X25ldGxibF9jYWNoZV9pbnZhbGlkYXRlIC0gSW52YWxpZGF0ZSB0aGUgTmV0TGFiZWwgY2FjaGUKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIEludmFsaWRhdGUgdGhlIE5ldExhYmVsIHNlY3VyaXR5IGF0dHJpYnV0ZSBtYXBwaW5nIGNhY2hlLgotICoKLSAqLwotdm9pZCBzZWxpbnV4X25ldGxibF9jYWNoZV9pbnZhbGlkYXRlKHZvaWQpCi17Ci0JbmV0bGJsX2NhY2hlX2ludmFsaWRhdGUoKTsKLX0KLQotLyoqCi0gKiBzZWxpbnV4X25ldGxibF9zZWNhdHRyX3RvX3NpZCAtIENvbnZlcnQgYSBOZXRMYWJlbCBzZWNhdHRyIHRvIGEgU0VMaW51eCBTSUQKLSAqIEBza2I6IHRoZSBuZXR3b3JrIHBhY2tldAorICogc2VjdXJpdHlfbmV0bGJsX3NlY2F0dHJfdG9fc2lkIC0gQ29udmVydCBhIE5ldExhYmVsIHNlY2F0dHIgdG8gYSBTRUxpbnV4IFNJRAogICogQHNlY2F0dHI6IHRoZSBOZXRMYWJlbCBwYWNrZXQgc2VjdXJpdHkgYXR0cmlidXRlcwogICogQGJhc2Vfc2lkOiB0aGUgU0VMaW51eCBTSUQgdG8gdXNlIGFzIGEgY29udGV4dCBmb3IgTUxTIG9ubHkgYXR0cmlidXRlcwogICogQHNpZDogdGhlIFNFTGludXggU0lECiAgKgogICogRGVzY3JpcHRpb246Ci0gKiBDb252ZXJ0IHRoZSBnaXZlbiBOZXRMYWJlbCBwYWNrZXQgc2VjdXJpdHkgYXR0cmlidXRlcyBpbiBAc2VjYXR0ciBpbnRvIGEKKyAqIENvbnZlcnQgdGhlIGdpdmVuIE5ldExhYmVsIHNlY3VyaXR5IGF0dHJpYnV0ZXMgaW4gQHNlY2F0dHIgaW50byBhCiAgKiBTRUxpbnV4IFNJRC4gIElmIHRoZSBAc2VjYXR0ciBmaWVsZCBkb2VzIG5vdCBjb250YWluIGEgZnVsbCBTRUxpbnV4Ci0gKiBTSUQvY29udGV4dCB0aGVuIHVzZSB0aGUgY29udGV4dCBpbiBAYmFzZV9zaWQgYXMgdGhlIGZvdW5kYXRpb24uICBJZiBAc2tiCi0gKiBpcyBub3QgTlVMTCBhdHRlbXB0IHRvIGNhY2hlIGFzIG11Y2ggZGF0YSBhcyBwb3NzaWJpbGUuICBSZXR1cm5zIHplcm8gb24KLSAqIHN1Y2Nlc3MsIG5lZ2F0aXZlIHZhbHVlcyBvbiBmYWlsdXJlLgorICogU0lEL2NvbnRleHQgdGhlbiB1c2UgdGhlIGNvbnRleHQgaW4gQGJhc2Vfc2lkIGFzIHRoZSBmb3VuZGF0aW9uLiAgSWYKKyAqIHBvc3NpYmlsZSB0aGUgJ2NhY2hlJyBmaWVsZCBvZiBAc2VjYXR0ciBpcyBzZXQgYW5kIHRoZSBDQUNIRSBmbGFnIGlzIHNldDsKKyAqIHRoaXMgaXMgdG8gYWxsb3cgdGhlIEBzZWNhdHRyIHRvIGJlIHVzZWQgYnkgTmV0TGFiZWwgdG8gY2FjaGUgdGhlIHNlY2F0dHIgdG8KKyAqIFNJRCBjb252ZXJzaW9uIGZvciBmdXR1cmUgbG9va3Vwcy4gIFJldHVybnMgemVybyBvbiBzdWNjZXNzLCBuZWdhdGl2ZQorICogdmFsdWVzIG9uIGZhaWx1cmUuCiAgKgogICovCi1zdGF0aWMgaW50IHNlbGludXhfbmV0bGJsX3NlY2F0dHJfdG9fc2lkKHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJCSBzdHJ1Y3QgbmV0bGJsX2xzbV9zZWNhdHRyICpzZWNhdHRyLAotCQkJCQkgdTMyIGJhc2Vfc2lkLAotCQkJCQkgdTMyICpzaWQpCitpbnQgc2VjdXJpdHlfbmV0bGJsX3NlY2F0dHJfdG9fc2lkKHN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHIgKnNlY2F0dHIsCisJCQkJICAgdTMyIGJhc2Vfc2lkLAorCQkJCSAgIHUzMiAqc2lkKQogewogCWludCByYyA9IC1FSURSTTsKIAlzdHJ1Y3QgY29udGV4dCAqY3R4OwogCXN0cnVjdCBjb250ZXh0IGN0eF9uZXc7Ci0Jc3RydWN0IG5ldGxibF9jYWNoZSAqY2FjaGU7CisJc3RydWN0IHNlbGludXhfbmV0bGJsX2NhY2hlICpjYWNoZTsKKworCWlmICghc3NfaW5pdGlhbGl6ZWQpIHsKKwkJKnNpZCA9IFNFQ1NJRF9OVUxMOworCQlyZXR1cm4gMDsKKwl9CiAKIAlQT0xJQ1lfUkRMT0NLOwogCkBAIC0yNDEwLDggKzI0MTgsOCBAQAogCQlpZiAocmMgIT0gMCkKIAkJCWdvdG8gbmV0bGJsX3NlY2F0dHJfdG9fc2lkX3JldHVybl9jbGVhbnVwOwogCi0JCWlmIChza2IgIT0gTlVMTCkKLQkJCXNlbGludXhfbmV0bGJsX2NhY2hlX2FkZChza2IsICZjdHhfbmV3KTsKKwkJc2VjdXJpdHlfbmV0bGJsX2NhY2hlX2FkZChzZWNhdHRyLCAmY3R4X25ldyk7CisKIAkJZWJpdG1hcF9kZXN0cm95KCZjdHhfbmV3LnJhbmdlLmxldmVsWzBdLmNhdCk7CiAJfSBlbHNlIHsKIAkJKnNpZCA9IFNFQ1NJRF9OVUxMOwpAQCAtMjQyNywzMzggKzI0MzUsNDMgQEAKIH0KIAogLyoqCi0gKiBzZWxpbnV4X25ldGxibF9za2J1ZmZfZ2V0c2lkIC0gR2V0IHRoZSBzaWQgb2YgYSBwYWNrZXQgdXNpbmcgTmV0TGFiZWwKLSAqIEBza2I6IHRoZSBwYWNrZXQKLSAqIEBiYXNlX3NpZDogdGhlIFNFTGludXggU0lEIHRvIHVzZSBhcyBhIGNvbnRleHQgZm9yIE1MUyBvbmx5IGF0dHJpYnV0ZXMKLSAqIEBzaWQ6IHRoZSBTSUQKKyAqIHNlY3VyaXR5X25ldGxibF9zaWRfdG9fc2VjYXR0ciAtIENvbnZlcnQgYSBTRUxpbnV4IFNJRCB0byBhIE5ldExhYmVsIHNlY2F0dHIKKyAqIEBzaWQ6IHRoZSBTRUxpbnV4IFNJRAorICogQHNlY2F0dHI6IHRoZSBOZXRMYWJlbCBwYWNrZXQgc2VjdXJpdHkgYXR0cmlidXRlcwogICoKICAqIERlc2NyaXB0aW9uOgotICogQ2FsbCB0aGUgTmV0TGFiZWwgbWVjaGFuaXNtIHRvIGdldCB0aGUgc2VjdXJpdHkgYXR0cmlidXRlcyBvZiB0aGUgZ2l2ZW4KLSAqIHBhY2tldCBhbmQgdXNlIHRob3NlIGF0dHJpYnV0ZXMgdG8gZGV0ZXJtaW5lIHRoZSBjb3JyZWN0IGNvbnRleHQvU0lEIHRvCi0gKiBhc3NpZ24gdG8gdGhlIHBhY2tldC4gIFJldHVybnMgemVybyBvbiBzdWNjZXNzLCBuZWdhdGl2ZSB2YWx1ZXMgb24gZmFpbHVyZS4KKyAqIENvbnZlcnQgdGhlIGdpdmVuIFNFTGludXggU0lEIGluIEBzaWQgaW50byBhIE5ldExhYmVsIHNlY3VyaXR5IGF0dHJpYnV0ZS4KKyAqIFJldHVybnMgemVybyBvbiBzdWNjZXNzLCBuZWdhdGl2ZSB2YWx1ZXMgb24gZmFpbHVyZS4KICAqCiAgKi8KLWludCBzZWxpbnV4X25ldGxibF9za2J1ZmZfZ2V0c2lkKHN0cnVjdCBza19idWZmICpza2IsIHUzMiBiYXNlX3NpZCwgdTMyICpzaWQpCi17Ci0JaW50IHJjOwotCXN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHIgc2VjYXR0cjsKLQotCW5ldGxibF9zZWNhdHRyX2luaXQoJnNlY2F0dHIpOwotCXJjID0gbmV0bGJsX3NrYnVmZl9nZXRhdHRyKHNrYiwgJnNlY2F0dHIpOwotCWlmIChyYyA9PSAwICYmIHNlY2F0dHIuZmxhZ3MgIT0gTkVUTEJMX1NFQ0FUVFJfTk9ORSkKLQkJcmMgPSBzZWxpbnV4X25ldGxibF9zZWNhdHRyX3RvX3NpZChza2IsCi0JCQkJCQkgICAmc2VjYXR0ciwKLQkJCQkJCSAgIGJhc2Vfc2lkLAotCQkJCQkJICAgc2lkKTsKLQllbHNlCi0JCSpzaWQgPSBTRUNTSURfTlVMTDsKLQluZXRsYmxfc2VjYXR0cl9kZXN0cm95KCZzZWNhdHRyKTsKLQotCXJldHVybiByYzsKLX0KLQotLyoqCi0gKiBzZWxpbnV4X25ldGxibF9zb2NrZXRfc2V0c2lkIC0gTGFiZWwgYSBzb2NrZXQgdXNpbmcgdGhlIE5ldExhYmVsIG1lY2hhbmlzbQotICogQHNvY2s6IHRoZSBzb2NrZXQgdG8gbGFiZWwKLSAqIEBzaWQ6IHRoZSBTSUQgdG8gdXNlCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBBdHRlbXB0IHRvIGxhYmVsIGEgc29ja2V0IHVzaW5nIHRoZSBOZXRMYWJlbCBtZWNoYW5pc20gdXNpbmcgdGhlIGdpdmVuCi0gKiBTSUQuICBSZXR1cm5zIHplcm8gdmFsdWVzIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIHZhbHVlcyBvbiBmYWlsdXJlLiAgVGhlCi0gKiBjYWxsZXIgaXMgcmVzcG9uc2liaWxlIGZvciBjYWxsaW5nIHJjdV9yZWFkX2xvY2soKSBiZWZvcmUgY2FsbGluZyB0aGlzCi0gKiB0aGlzIGZ1bmN0aW9uIGFuZCByY3VfcmVhZF91bmxvY2soKSBhZnRlciB0aGlzIGZ1bmN0aW9uIHJldHVybnMuCi0gKgotICovCi1zdGF0aWMgaW50IHNlbGludXhfbmV0bGJsX3NvY2tldF9zZXRzaWQoc3RydWN0IHNvY2tldCAqc29jaywgdTMyIHNpZCkKK2ludCBzZWN1cml0eV9uZXRsYmxfc2lkX3RvX3NlY2F0dHIodTMyIHNpZCwgc3RydWN0IG5ldGxibF9sc21fc2VjYXR0ciAqc2VjYXR0cikKIHsKIAlpbnQgcmMgPSAtRU5PRU5UOwotCXN0cnVjdCBza19zZWN1cml0eV9zdHJ1Y3QgKnNrc2VjID0gc29jay0+c2stPnNrX3NlY3VyaXR5OwotCXN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHIgc2VjYXR0cjsKIAlzdHJ1Y3QgY29udGV4dCAqY3R4OwogCisJbmV0bGJsX3NlY2F0dHJfaW5pdChzZWNhdHRyKTsKKwogCWlmICghc3NfaW5pdGlhbGl6ZWQpCiAJCXJldHVybiAwOwogCi0JbmV0bGJsX3NlY2F0dHJfaW5pdCgmc2VjYXR0cik7Ci0KIAlQT0xJQ1lfUkRMT0NLOwotCiAJY3R4ID0gc2lkdGFiX3NlYXJjaCgmc2lkdGFiLCBzaWQpOwogCWlmIChjdHggPT0gTlVMTCkKLQkJZ290byBuZXRsYmxfc29ja2V0X3NldHNpZF9yZXR1cm47Ci0KLQlzZWNhdHRyLmRvbWFpbiA9IGtzdHJkdXAocG9saWN5ZGIucF90eXBlX3ZhbF90b19uYW1lW2N0eC0+dHlwZSAtIDFdLAotCQkJCSBHRlBfQVRPTUlDKTsKLQlzZWNhdHRyLmZsYWdzIHw9IE5FVExCTF9TRUNBVFRSX0RPTUFJTjsKLQltbHNfZXhwb3J0X25ldGxibF9sdmwoY3R4LCAmc2VjYXR0cik7Ci0JcmMgPSBtbHNfZXhwb3J0X25ldGxibF9jYXQoY3R4LCAmc2VjYXR0cik7CisJCWdvdG8gbmV0bGJsX3NpZF90b19zZWNhdHRyX2ZhaWx1cmU7CisJc2VjYXR0ci0+ZG9tYWluID0ga3N0cmR1cChwb2xpY3lkYi5wX3R5cGVfdmFsX3RvX25hbWVbY3R4LT50eXBlIC0gMV0sCisJCQkJICBHRlBfQVRPTUlDKTsKKwlzZWNhdHRyLT5mbGFncyB8PSBORVRMQkxfU0VDQVRUUl9ET01BSU47CisJbWxzX2V4cG9ydF9uZXRsYmxfbHZsKGN0eCwgc2VjYXR0cik7CisJcmMgPSBtbHNfZXhwb3J0X25ldGxibF9jYXQoY3R4LCBzZWNhdHRyKTsKIAlpZiAocmMgIT0gMCkKLQkJZ290byBuZXRsYmxfc29ja2V0X3NldHNpZF9yZXR1cm47Ci0KLQlyYyA9IG5ldGxibF9zb2NrZXRfc2V0YXR0cihzb2NrLCAmc2VjYXR0cik7Ci0JaWYgKHJjID09IDApIHsKLQkJc3Bpbl9sb2NrX2JoKCZza3NlYy0+bmxibF9sb2NrKTsKLQkJc2tzZWMtPm5sYmxfc3RhdGUgPSBOTEJMX0xBQkVMRUQ7Ci0JCXNwaW5fdW5sb2NrX2JoKCZza3NlYy0+bmxibF9sb2NrKTsKLQl9Ci0KLW5ldGxibF9zb2NrZXRfc2V0c2lkX3JldHVybjoKKwkJZ290byBuZXRsYmxfc2lkX3RvX3NlY2F0dHJfZmFpbHVyZTsKIAlQT0xJQ1lfUkRVTkxPQ0s7Ci0JbmV0bGJsX3NlY2F0dHJfZGVzdHJveSgmc2VjYXR0cik7Ci0JcmV0dXJuIHJjOwotfQogCi0vKioKLSAqIHNlbGludXhfbmV0bGJsX3NrX3NlY3VyaXR5X3Jlc2V0IC0gUmVzZXQgdGhlIE5ldExhYmVsIGZpZWxkcwotICogQHNzZWM6IHRoZSBza19zZWN1cml0eV9zdHJ1Y3QKLSAqIEBmYW1pbHk6IHRoZSBzb2NrZXQgZmFtaWx5Ci0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDYWxsZWQgd2hlbiB0aGUgTmV0TGFiZWwgc3RhdGUgb2YgYSBza19zZWN1cml0eV9zdHJ1Y3QgbmVlZHMgdG8gYmUgcmVzZXQuCi0gKiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmlsZSBmb3IgYWxsIHRoZSBOZXRMYWJlbCBza19zZWN1cml0eV9zdHJ1Y3QgbG9ja2luZy4KLSAqCi0gKi8KLXZvaWQgc2VsaW51eF9uZXRsYmxfc2tfc2VjdXJpdHlfcmVzZXQoc3RydWN0IHNrX3NlY3VyaXR5X3N0cnVjdCAqc3NlYywKLQkJCQkgICAgICBpbnQgZmFtaWx5KQotewotICAgICAgICBpZiAoZmFtaWx5ID09IFBGX0lORVQpCi0JCXNzZWMtPm5sYmxfc3RhdGUgPSBOTEJMX1JFUVVJUkU7Ci0JZWxzZQotCQlzc2VjLT5ubGJsX3N0YXRlID0gTkxCTF9VTlNFVDsKLX0KKwlyZXR1cm4gMDsKIAotLyoqCi0gKiBzZWxpbnV4X25ldGxibF9za19zZWN1cml0eV9pbml0IC0gU2V0dXAgdGhlIE5ldExhYmVsIGZpZWxkcwotICogQHNzZWM6IHRoZSBza19zZWN1cml0eV9zdHJ1Y3QKLSAqIEBmYW1pbHk6IHRoZSBzb2NrZXQgZmFtaWx5Ci0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDYWxsZWQgd2hlbiBhIG5ldyBza19zZWN1cml0eV9zdHJ1Y3QgaXMgYWxsb2NhdGVkIHRvIGluaXRpYWxpemUgdGhlIE5ldExhYmVsCi0gKiBmaWVsZHMuCi0gKgotICovCi12b2lkIHNlbGludXhfbmV0bGJsX3NrX3NlY3VyaXR5X2luaXQoc3RydWN0IHNrX3NlY3VyaXR5X3N0cnVjdCAqc3NlYywKLQkJCQkgICAgIGludCBmYW1pbHkpCi17Ci0JLyogTm8gbG9ja2luZyBuZWVkZWQsIHdlIGFyZSB0aGUgb25seSBvbmUgd2hvIGhhcyBhY2Nlc3MgdG8gc3NlYyAqLwotCXNlbGludXhfbmV0bGJsX3NrX3NlY3VyaXR5X3Jlc2V0KHNzZWMsIGZhbWlseSk7Ci0Jc3Bpbl9sb2NrX2luaXQoJnNzZWMtPm5sYmxfbG9jayk7Ci19Ci0KLS8qKgotICogc2VsaW51eF9uZXRsYmxfc2tfc2VjdXJpdHlfY2xvbmUgLSBDb3B5IHRoZSBOZXRMYWJlbCBmaWVsZHMKLSAqIEBzc2VjOiB0aGUgb3JpZ2luYWwgc2tfc2VjdXJpdHlfc3RydWN0Ci0gKiBAbmV3c3NlYzogdGhlIGNsb25lZCBza19zZWN1cml0eV9zdHJ1Y3QKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENsb25lIHRoZSBOZXRMYWJlbCBzcGVjaWZpYyBza19zZWN1cml0eV9zdHJ1Y3QgZmllbGRzIGZyb20gQHNzZWMgdG8KLSAqIEBuZXdzc2VjLgotICoKLSAqLwotdm9pZCBzZWxpbnV4X25ldGxibF9za19zZWN1cml0eV9jbG9uZShzdHJ1Y3Qgc2tfc2VjdXJpdHlfc3RydWN0ICpzc2VjLAotCQkJCSAgICAgIHN0cnVjdCBza19zZWN1cml0eV9zdHJ1Y3QgKm5ld3NzZWMpCi17Ci0JLyogV2UgZG9uJ3QgbmVlZCB0byB0YWtlIG5ld3NzZWMtPm5sYmxfbG9jayBiZWNhdXNlIHdlIGFyZSB0aGUgb25seQotCSAqIHRocmVhZCB3aXRoIGFjY2VzcyB0byBuZXdzc2VjLCBidXQgd2UgZG8gbmVlZCB0byB0YWtlIHRoZSBSQ1UgcmVhZAotCSAqIGxvY2sgYXMgb3RoZXIgdGhyZWFkcyBjb3VsZCBoYXZlIGFjY2VzcyB0byBzc2VjICovCi0JcmN1X3JlYWRfbG9jaygpOwotCXNlbGludXhfbmV0bGJsX3NrX3NlY3VyaXR5X3Jlc2V0KG5ld3NzZWMsIHNzZWMtPnNrLT5za19mYW1pbHkpOwotCW5ld3NzZWMtPnNjbGFzcyA9IHNzZWMtPnNjbGFzczsKLQlyY3VfcmVhZF91bmxvY2soKTsKLX0KLQotLyoqCi0gKiBzZWxpbnV4X25ldGxibF9zb2NrZXRfcG9zdF9jcmVhdGUgLSBMYWJlbCBhIHNvY2tldCB1c2luZyBOZXRMYWJlbAotICogQHNvY2s6IHRoZSBzb2NrZXQgdG8gbGFiZWwKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIEF0dGVtcHQgdG8gbGFiZWwgYSBzb2NrZXQgdXNpbmcgdGhlIE5ldExhYmVsIG1lY2hhbmlzbSB1c2luZyB0aGUgZ2l2ZW4KLSAqIFNJRC4gIFJldHVybnMgemVybyB2YWx1ZXMgb24gc3VjY2VzcywgbmVnYXRpdmUgdmFsdWVzIG9uIGZhaWx1cmUuCi0gKgotICovCi1pbnQgc2VsaW51eF9uZXRsYmxfc29ja2V0X3Bvc3RfY3JlYXRlKHN0cnVjdCBzb2NrZXQgKnNvY2spCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgaW5vZGVfc2VjdXJpdHlfc3RydWN0ICppc2VjID0gU09DS19JTk9ERShzb2NrKS0+aV9zZWN1cml0eTsKLQlzdHJ1Y3Qgc2tfc2VjdXJpdHlfc3RydWN0ICpza3NlYyA9IHNvY2stPnNrLT5za19zZWN1cml0eTsKLQotCXNrc2VjLT5zY2xhc3MgPSBpc2VjLT5zY2xhc3M7Ci0KLQlyY3VfcmVhZF9sb2NrKCk7Ci0JaWYgKHNrc2VjLT5ubGJsX3N0YXRlID09IE5MQkxfUkVRVUlSRSkKLQkJcmMgPSBzZWxpbnV4X25ldGxibF9zb2NrZXRfc2V0c2lkKHNvY2ssIHNrc2VjLT5zaWQpOwotCXJjdV9yZWFkX3VubG9jaygpOwotCi0JcmV0dXJuIHJjOwotfQotCi0vKioKLSAqIHNlbGludXhfbmV0bGJsX3NvY2tfZ3JhZnQgLSBOZXRsYWJlbCB0aGUgbmV3IHNvY2tldAotICogQHNrOiB0aGUgbmV3IGNvbm5lY3Rpb24KLSAqIEBzb2NrOiB0aGUgbmV3IHNvY2tldAotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhlIGNvbm5lY3Rpb24gcmVwcmVzZW50ZWQgYnkgQHNrIGlzIGJlaW5nIGdyYWZ0ZWQgb250byBAc29jayBzbyBzZXQgdGhlCi0gKiBzb2NrZXQncyBOZXRMYWJlbCB0byBtYXRjaCB0aGUgU0lEIG9mIEBzay4KLSAqCi0gKi8KLXZvaWQgc2VsaW51eF9uZXRsYmxfc29ja19ncmFmdChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBzb2NrZXQgKnNvY2spCi17Ci0Jc3RydWN0IGlub2RlX3NlY3VyaXR5X3N0cnVjdCAqaXNlYyA9IFNPQ0tfSU5PREUoc29jayktPmlfc2VjdXJpdHk7Ci0Jc3RydWN0IHNrX3NlY3VyaXR5X3N0cnVjdCAqc2tzZWMgPSBzay0+c2tfc2VjdXJpdHk7Ci0Jc3RydWN0IG5ldGxibF9sc21fc2VjYXR0ciBzZWNhdHRyOwotCXUzMiBubGJsX3BlZXJfc2lkOwotCi0Jc2tzZWMtPnNjbGFzcyA9IGlzZWMtPnNjbGFzczsKLQotCXJjdV9yZWFkX2xvY2soKTsKLQotCWlmIChza3NlYy0+bmxibF9zdGF0ZSAhPSBOTEJMX1JFUVVJUkUpIHsKLQkJcmN1X3JlYWRfdW5sb2NrKCk7Ci0JCXJldHVybjsKLQl9Ci0KLQluZXRsYmxfc2VjYXR0cl9pbml0KCZzZWNhdHRyKTsKLQlpZiAobmV0bGJsX3NvY2tfZ2V0YXR0cihzaywgJnNlY2F0dHIpID09IDAgJiYKLQkgICAgc2VjYXR0ci5mbGFncyAhPSBORVRMQkxfU0VDQVRUUl9OT05FICYmCi0JICAgIHNlbGludXhfbmV0bGJsX3NlY2F0dHJfdG9fc2lkKE5VTEwsCi0JCQkJCSAgJnNlY2F0dHIsCi0JCQkJCSAgU0VDSU5JVFNJRF9VTkxBQkVMRUQsCi0JCQkJCSAgJm5sYmxfcGVlcl9zaWQpID09IDApCi0JCXNrc2VjLT5wZWVyX3NpZCA9IG5sYmxfcGVlcl9zaWQ7Ci0JbmV0bGJsX3NlY2F0dHJfZGVzdHJveSgmc2VjYXR0cik7Ci0KLQkvKiBUcnkgdG8gc2V0IHRoZSBOZXRMYWJlbCBvbiB0aGUgc29ja2V0IHRvIHNhdmUgdGltZSBsYXRlciwgaWYgd2UgZmFpbAotCSAqIGhlcmUgd2Ugd2lsbCBwaWNrIHVwIHRoZSBwaWVjZXMgaW4gbGF0ZXIgY2FsbHMgdG8KLQkgKiBzZWxpbnV4X25ldGxibF9pbm9kZV9wZXJtaXNzaW9uKCkuICovCi0Jc2VsaW51eF9uZXRsYmxfc29ja2V0X3NldHNpZChzb2NrLCBza3NlYy0+c2lkKTsKLQotCXJjdV9yZWFkX3VubG9jaygpOwotfQotCi0vKioKLSAqIHNlbGludXhfbmV0bGJsX2lub2RlX3Blcm1pc3Npb24gLSBWZXJpZnkgdGhlIHNvY2tldCBpcyBOZXRMYWJlbCBsYWJlbGVkCi0gKiBAaW5vZGU6IHRoZSBmaWxlIGRlc2NyaXB0b3IncyBpbm9kZQotICogQG1hc2s6IHRoZSBwZXJtaXNzaW9uIG1hc2sKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIExvb2tzIGF0IGEgZmlsZSdzIGlub2RlIGFuZCBpZiBpdCBpcyBtYXJrZWQgYXMgYSBzb2NrZXQgcHJvdGVjdGVkIGJ5Ci0gKiBOZXRMYWJlbCB0aGVuIHZlcmlmeSB0aGF0IHRoZSBzb2NrZXQgaGFzIGJlZW4gbGFiZWxlZCwgaWYgbm90IHRyeSB0byBsYWJlbAotICogdGhlIHNvY2tldCBub3cgd2l0aCB0aGUgaW5vZGUncyBTSUQuICBSZXR1cm5zIHplcm8gb24gc3VjY2VzcywgbmVnYXRpdmUKLSAqIHZhbHVlcyBvbiBmYWlsdXJlLgotICoKLSAqLwotaW50IHNlbGludXhfbmV0bGJsX2lub2RlX3Blcm1pc3Npb24oc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1hc2spCi17Ci0JaW50IHJjOwotCXN0cnVjdCBza19zZWN1cml0eV9zdHJ1Y3QgKnNrc2VjOwotCXN0cnVjdCBzb2NrZXQgKnNvY2s7Ci0KLQlpZiAoIVNfSVNTT0NLKGlub2RlLT5pX21vZGUpIHx8Ci0JICAgICgobWFzayAmIChNQVlfV1JJVEUgfCBNQVlfQVBQRU5EKSkgPT0gMCkpCi0JCXJldHVybiAwOwotCXNvY2sgPSBTT0NLRVRfSShpbm9kZSk7Ci0Jc2tzZWMgPSBzb2NrLT5zay0+c2tfc2VjdXJpdHk7Ci0KLQlyY3VfcmVhZF9sb2NrKCk7Ci0JaWYgKHNrc2VjLT5ubGJsX3N0YXRlICE9IE5MQkxfUkVRVUlSRSkgewotCQlyY3VfcmVhZF91bmxvY2soKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWxvY2FsX2JoX2Rpc2FibGUoKTsKLQliaF9sb2NrX3NvY2tfbmVzdGVkKHNvY2stPnNrKTsKLQlyYyA9IHNlbGludXhfbmV0bGJsX3NvY2tldF9zZXRzaWQoc29jaywgc2tzZWMtPnNpZCk7Ci0JYmhfdW5sb2NrX3NvY2soc29jay0+c2spOwotCWxvY2FsX2JoX2VuYWJsZSgpOwotCXJjdV9yZWFkX3VubG9jaygpOwotCi0JcmV0dXJuIHJjOwotfQotCi0vKioKLSAqIHNlbGludXhfbmV0bGJsX3NvY2tfcmN2X3NrYiAtIERvIGFuIGluYm91bmQgYWNjZXNzIGNoZWNrIHVzaW5nIE5ldExhYmVsCi0gKiBAc2tzZWM6IHRoZSBzb2NrJ3Mgc2tfc2VjdXJpdHlfc3RydWN0Ci0gKiBAc2tiOiB0aGUgcGFja2V0Ci0gKiBAYWQ6IHRoZSBhdWRpdCBkYXRhCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBGZXRjaCB0aGUgTmV0TGFiZWwgc2VjdXJpdHkgYXR0cmlidXRlcyBmcm9tIEBza2IgYW5kIHBlcmZvcm0gYW4gYWNjZXNzIGNoZWNrCi0gKiBhZ2FpbnN0IHRoZSByZWNlaXZpbmcgc29ja2V0LiAgUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIHZhbHVlcyBvbgotICogZXJyb3IuCi0gKgotICovCi1pbnQgc2VsaW51eF9uZXRsYmxfc29ja19yY3Zfc2tiKHN0cnVjdCBza19zZWN1cml0eV9zdHJ1Y3QgKnNrc2VjLAotCQkJCXN0cnVjdCBza19idWZmICpza2IsCi0JCQkJc3RydWN0IGF2Y19hdWRpdF9kYXRhICphZCkKLXsKLQlpbnQgcmM7Ci0JdTMyIG5ldGxibF9zaWQ7Ci0JdTMyIHJlY3ZfcGVybTsKLQotCXJjID0gc2VsaW51eF9uZXRsYmxfc2tidWZmX2dldHNpZChza2IsCi0JCQkJCSAgU0VDSU5JVFNJRF9VTkxBQkVMRUQsCi0JCQkJCSAgJm5ldGxibF9zaWQpOwotCWlmIChyYyAhPSAwKQotCQlyZXR1cm4gcmM7Ci0KLQlpZiAobmV0bGJsX3NpZCA9PSBTRUNTSURfTlVMTCkKLQkJcmV0dXJuIDA7Ci0KLQlzd2l0Y2ggKHNrc2VjLT5zY2xhc3MpIHsKLQljYXNlIFNFQ0NMQVNTX1VEUF9TT0NLRVQ6Ci0JCXJlY3ZfcGVybSA9IFVEUF9TT0NLRVRfX1JFQ1ZGUk9NOwotCQlicmVhazsKLQljYXNlIFNFQ0NMQVNTX1RDUF9TT0NLRVQ6Ci0JCXJlY3ZfcGVybSA9IFRDUF9TT0NLRVRfX1JFQ1ZGUk9NOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZWN2X3Blcm0gPSBSQVdJUF9TT0NLRVRfX1JFQ1ZGUk9NOwotCX0KLQotCXJjID0gYXZjX2hhc19wZXJtKHNrc2VjLT5zaWQsCi0JCQkgIG5ldGxibF9zaWQsCi0JCQkgIHNrc2VjLT5zY2xhc3MsCi0JCQkgIHJlY3ZfcGVybSwKLQkJCSAgYWQpOwotCWlmIChyYyA9PSAwKQotCQlyZXR1cm4gMDsKLQotCW5ldGxibF9za2J1ZmZfZXJyKHNrYiwgcmMpOwotCXJldHVybiByYzsKLX0KLQotLyoqCi0gKiBzZWxpbnV4X25ldGxibF9zb2NrZXRfc2V0c29ja29wdCAtIERvIG5vdCBhbGxvdyB1c2VycyB0byByZW1vdmUgYSBOZXRMYWJlbAotICogQHNvY2s6IHRoZSBzb2NrZXQKLSAqIEBsZXZlbDogdGhlIHNvY2tldCBsZXZlbCBvciBwcm90b2NvbAotICogQG9wdG5hbWU6IHRoZSBzb2NrZXQgb3B0aW9uIG5hbWUKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENoZWNrIHRoZSBzZXRzb2Nrb3B0KCkgY2FsbCBhbmQgaWYgdGhlIHVzZXIgaXMgdHJ5aW5nIHRvIHJlcGxhY2UgdGhlIElQCi0gKiBvcHRpb25zIG9uIGEgc29ja2V0IGFuZCBhIE5ldExhYmVsIGlzIGluIHBsYWNlIGZvciB0aGUgc29ja2V0IGRlbnkgdGhlCi0gKiBhY2Nlc3M7IG90aGVyd2lzZSBhbGxvdyB0aGUgYWNjZXNzLiAgUmV0dXJucyB6ZXJvIHdoZW4gdGhlIGFjY2VzcyBpcwotICogYWxsb3dlZCwgLUVBQ0NFUyB3aGVuIGRlbmllZCwgYW5kIG90aGVyIG5lZ2F0aXZlIHZhbHVlcyBvbiBlcnJvci4KLSAqCi0gKi8KLWludCBzZWxpbnV4X25ldGxibF9zb2NrZXRfc2V0c29ja29wdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLAotCQkJCSAgICAgaW50IGxldmVsLAotCQkJCSAgICAgaW50IG9wdG5hbWUpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3Qgc2tfc2VjdXJpdHlfc3RydWN0ICpza3NlYyA9IHNvY2stPnNrLT5za19zZWN1cml0eTsKLQlzdHJ1Y3QgbmV0bGJsX2xzbV9zZWNhdHRyIHNlY2F0dHI7Ci0KLQlyY3VfcmVhZF9sb2NrKCk7Ci0JaWYgKGxldmVsID09IElQUFJPVE9fSVAgJiYgb3B0bmFtZSA9PSBJUF9PUFRJT05TICYmCi0JICAgIHNrc2VjLT5ubGJsX3N0YXRlID09IE5MQkxfTEFCRUxFRCkgewotCQluZXRsYmxfc2VjYXR0cl9pbml0KCZzZWNhdHRyKTsKLQkJcmMgPSBuZXRsYmxfc29ja2V0X2dldGF0dHIoc29jaywgJnNlY2F0dHIpOwotCQlpZiAocmMgPT0gMCAmJiBzZWNhdHRyLmZsYWdzICE9IE5FVExCTF9TRUNBVFRSX05PTkUpCi0JCQlyYyA9IC1FQUNDRVM7Ci0JCW5ldGxibF9zZWNhdHRyX2Rlc3Ryb3koJnNlY2F0dHIpOwotCX0KLQlyY3VfcmVhZF91bmxvY2soKTsKLQorbmV0bGJsX3NpZF90b19zZWNhdHRyX2ZhaWx1cmU6CisJUE9MSUNZX1JEVU5MT0NLOworCW5ldGxibF9zZWNhdHRyX2Rlc3Ryb3koc2VjYXR0cik7CiAJcmV0dXJuIHJjOwogfQogI2VuZGlmIC8qIENPTkZJR19ORVRMQUJFTCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvYW9hL2NvZGVjcy9zbmQtYW9hLWNvZGVjLW9ueXguYyBiL3NvdW5kL2FvYS9jb2RlY3Mvc25kLWFvYS1jb2RlYy1vbnl4LmMKaW5kZXggYjAwZmM0OC4uN2Y5ODBiZSAxMDA2NDQKLS0tIGEvc291bmQvYW9hL2NvZGVjcy9zbmQtYW9hLWNvZGVjLW9ueXguYworKysgYi9zb3VuZC9hb2EvY29kZWNzL3NuZC1hb2EtY29kZWMtb255eC5jCkBAIC0xMDYyLDkgKzEwNjIsOSBAQAogCiAJd2hpbGUgKChkZXYgPSBvZl9nZXRfbmV4dF9jaGlsZChidXNub2RlLCBkZXYpKSAhPSBOVUxMKSB7CiAJCWlmIChkZXZpY2VfaXNfY29tcGF0aWJsZShkZXYsICJwY20zMDUyIikpIHsKLQkJCXUzMiAqYWRkcjsKKwkJCWNvbnN0IHUzMiAqYWRkcjsKIAkJCXByaW50ayhLRVJOX0RFQlVHIFBGWCAiZm91bmQgcGNtMzA1MlxuIik7Ci0JCQlhZGRyID0gKHUzMiAqKSBnZXRfcHJvcGVydHkoZGV2LCAicmVnIiwgTlVMTCk7CisJCQlhZGRyID0gb2ZfZ2V0X3Byb3BlcnR5KGRldiwgInJlZyIsIE5VTEwpOwogCQkJaWYgKCFhZGRyKQogCQkJCXJldHVybiAtRU5PREVWOwogCQkJcmV0dXJuIG9ueXhfY3JlYXRlKGFkYXB0ZXIsIGRldiwgKCphZGRyKT4+MSk7CmRpZmYgLS1naXQgYS9zb3VuZC9hb2EvY29kZWNzL3NuZC1hb2EtY29kZWMtdGFzLmMgYi9zb3VuZC9hb2EvY29kZWNzL3NuZC1hb2EtY29kZWMtdGFzLmMKaW5kZXggMmNkODFmYS4uY2VjYTM4NCAxMDA2NDQKLS0tIGEvc291bmQvYW9hL2NvZGVjcy9zbmQtYW9hLWNvZGVjLXRhcy5jCisrKyBiL3NvdW5kL2FvYS9jb2RlY3Mvc25kLWFvYS1jb2RlYy10YXMuYwpAQCAtOTM5LDkgKzkzOSw5IEBACiAKIAl3aGlsZSAoKGRldiA9IG9mX2dldF9uZXh0X2NoaWxkKGJ1c25vZGUsIGRldikpICE9IE5VTEwpIHsKIAkJaWYgKGRldmljZV9pc19jb21wYXRpYmxlKGRldiwgInRhczMwMDQiKSkgewotCQkJdTMyICphZGRyOworCQkJY29uc3QgdTMyICphZGRyOwogCQkJcHJpbnRrKEtFUk5fREVCVUcgUEZYICJmb3VuZCB0YXMzMDA0XG4iKTsKLQkJCWFkZHIgPSAodTMyICopIGdldF9wcm9wZXJ0eShkZXYsICJyZWciLCBOVUxMKTsKKwkJCWFkZHIgPSBvZl9nZXRfcHJvcGVydHkoZGV2LCAicmVnIiwgTlVMTCk7CiAJCQlpZiAoIWFkZHIpCiAJCQkJY29udGludWU7CiAJCQlyZXR1cm4gdGFzX2NyZWF0ZShhZGFwdGVyLCBkZXYsICgoKmFkZHIpID4+IDEpICYgMHg3Zik7CkBAIC05NTAsOSArOTUwLDEwIEBACiAJCSAqIHByb3BlcnR5IHRoYXQgc2F5cyAndGFzMzAwNCcsIHRoZXkganVzdCBoYXZlIGEgJ2RlcScKIAkJICogbm9kZSB3aXRob3V0IGFueSBzdWNoIHByb3BlcnR5Li4uICovCiAJCWlmIChzdHJjbXAoZGV2LT5uYW1lLCAiZGVxIikgPT0gMCkgewotCQkJdTMyICpfYWRkciwgYWRkcjsKKwkJCWNvbnN0IHUzMiAqX2FkZHI7CisJCQl1MzIgYWRkcjsKIAkJCXByaW50ayhLRVJOX0RFQlVHIFBGWCAiZm91bmQgJ2RlcScgbm9kZVxuIik7Ci0JCQlfYWRkciA9ICh1MzIgKikgZ2V0X3Byb3BlcnR5KGRldiwgImkyYy1hZGRyZXNzIiwgTlVMTCk7CisJCQlfYWRkciA9IG9mX2dldF9wcm9wZXJ0eShkZXYsICJpMmMtYWRkcmVzcyIsIE5VTEwpOwogCQkJaWYgKCFfYWRkcikKIAkJCQljb250aW51ZTsKIAkJCWFkZHIgPSAoKCpfYWRkcikgPj4gMSkgJiAweDdmOwpkaWZmIC0tZ2l0IGEvc291bmQvYW9hL2NvcmUvc25kLWFvYS1ncGlvLWZlYXR1cmUuYyBiL3NvdW5kL2FvYS9jb3JlL3NuZC1hb2EtZ3Bpby1mZWF0dXJlLmMKaW5kZXggMmIwM2JjNy4uODA1ZGNiZiAxMDA2NDQKLS0tIGEvc291bmQvYW9hL2NvcmUvc25kLWFvYS1ncGlvLWZlYXR1cmUuYworKysgYi9zb3VuZC9hb2EvY29yZS9zbmQtYW9hLWdwaW8tZmVhdHVyZS5jCkBAIC01NSw3ICs1NSw3IEBACiAJCQkJICAgIGludCAqZ3Bpb2FjdGl2ZXB0cikKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCAqZ3BpbzsKLQl1MzIgKnJlZzsKKwljb25zdCB1MzIgKnJlZzsKIAljb25zdCBjaGFyICphdWRpb19ncGlvOwogCiAJKmdwaW9wdHIgPSAtMTsKQEAgLTcxLDcgKzcxLDcgQEAKIAkJaWYgKCFncGlvKQogCQkJcmV0dXJuIE5VTEw7CiAJCXdoaWxlICgobnAgPSBvZl9nZXRfbmV4dF9jaGlsZChncGlvLCBucCkpKSB7Ci0JCQlhdWRpb19ncGlvID0gZ2V0X3Byb3BlcnR5KG5wLCAiYXVkaW8tZ3BpbyIsIE5VTEwpOworCQkJYXVkaW9fZ3BpbyA9IG9mX2dldF9wcm9wZXJ0eShucCwgImF1ZGlvLWdwaW8iLCBOVUxMKTsKIAkJCWlmICghYXVkaW9fZ3BpbykKIAkJCQljb250aW51ZTsKIAkJCWlmIChzdHJjbXAoYXVkaW9fZ3BpbywgbmFtZSkgPT0gMCkKQEAgLTg0LDcgKzg0LDcgQEAKIAkJCXJldHVybiBOVUxMOwogCX0KIAotCXJlZyA9ICh1MzIgKilnZXRfcHJvcGVydHkobnAsICJyZWciLCBOVUxMKTsKKwlyZWcgPSBvZl9nZXRfcHJvcGVydHkobnAsICJyZWciLCBOVUxMKTsKIAlpZiAoIXJlZykKIAkJcmV0dXJuIE5VTEw7CiAKQEAgLTk2LDcgKzk2LDcgQEAKIAlpZiAoKmdwaW9wdHIgPCAweDUwKQogCQkqZ3Bpb3B0ciArPSAweDUwOwogCi0JcmVnID0gKHUzMiAqKWdldF9wcm9wZXJ0eShucCwgImF1ZGlvLWdwaW8tYWN0aXZlLXN0YXRlIiwgTlVMTCk7CisJcmVnID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAiYXVkaW8tZ3Bpby1hY3RpdmUtc3RhdGUiLCBOVUxMKTsKIAlpZiAoIXJlZykKIAkJLyogQXBwbGUgc2VlbXMgdG8gZGVmYXVsdCB0byAxLCBidXQKIAkJICogdGhhdCBkb2Vzbid0IHNlZW0gcmlnaHQgYXQgbGVhc3Qgb24gbW9zdApkaWZmIC0tZ2l0IGEvc291bmQvYW9hL2ZhYnJpY3Mvc25kLWFvYS1mYWJyaWMtbGF5b3V0LmMgYi9zb3VuZC9hb2EvZmFicmljcy9zbmQtYW9hLWZhYnJpYy1sYXlvdXQuYwppbmRleCAxYjk0YmE2Li45ODgwNjI4IDEwMDY0NAotLS0gYS9zb3VuZC9hb2EvZmFicmljcy9zbmQtYW9hLWZhYnJpYy1sYXlvdXQuYworKysgYi9zb3VuZC9hb2EvZmFicmljcy9zbmQtYW9hLWZhYnJpYy1sYXlvdXQuYwpAQCAtNzI0LDcgKzcyNCw3IEBACiAJCSAgICAgICBzdHJ1Y3QgbGF5b3V0X2RldiAqbGRldiwKIAkJICAgICAgIHN0cnVjdCBjb2RlY19jb25uZWN0X2luZm8gKmNjaSkKIHsKLQl1MzIgKnJlZjsKKwljb25zdCB1MzIgKnJlZjsKIAljaGFyIHByb3BuYW1lWzMyXTsKIAlzdHJ1Y3QgY29kZWNfY29ubmVjdGlvbiAqY2M7CiAKQEAgLTczMiw3ICs3MzIsNyBAQAogCWlmIChjb2RlYy0+bm9kZSAmJiAoc3RyY21wKGNvZGVjLT5ub2RlLT5uYW1lLCAiY29kZWMiKSA9PSAwKSkgewogCQlzbnByaW50Zihwcm9wbmFtZSwgc2l6ZW9mKHByb3BuYW1lKSwKIAkJCSAicGxhdGZvcm0tJXMtY29kZWMtcmVmIiwgY29kZWMtPm5hbWUpOwotCQlyZWYgPSAodTMyKilnZXRfcHJvcGVydHkobGRldi0+c291bmQsIHByb3BuYW1lLCBOVUxMKTsKKwkJcmVmID0gb2ZfZ2V0X3Byb3BlcnR5KGxkZXYtPnNvdW5kLCBwcm9wbmFtZSwgTlVMTCk7CiAJCWlmICghcmVmKSB7CiAJCQlwcmludGsoS0VSTl9JTkZPICJzbmQtYW9hLWZhYnJpYy1sYXlvdXQ6ICIKIAkJCQkicmVxdWlyZWQgcHJvcGVydHkgJXMgbm90IHByZXNlbnRcbiIsIHByb3BuYW1lKTsKQEAgLTk0Niw3ICs5NDYsNyBAQAogc3RhdGljIGludCBhb2FfZmFicmljX2xheW91dF9wcm9iZShzdHJ1Y3Qgc291bmRidXNfZGV2ICpzZGV2KQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqc291bmQgPSBOVUxMOwotCXVuc2lnbmVkIGludCAqbGF5b3V0X2lkOworCWNvbnN0IHVuc2lnbmVkIGludCAqbGF5b3V0X2lkOwogCXN0cnVjdCBsYXlvdXQgKmxheW91dDsKIAlzdHJ1Y3QgbGF5b3V0X2RldiAqbGRldiA9IE5VTEw7CiAJaW50IGVycjsKQEAgLTk2Miw3ICs5NjIsNyBAQAogCX0KIAlpZiAoIXNvdW5kKSByZXR1cm4gLUVOT0RFVjsKIAotCWxheW91dF9pZCA9ICh1bnNpZ25lZCBpbnQgKikgZ2V0X3Byb3BlcnR5KHNvdW5kLCAibGF5b3V0LWlkIiwgTlVMTCk7CisJbGF5b3V0X2lkID0gb2ZfZ2V0X3Byb3BlcnR5KHNvdW5kLCAibGF5b3V0LWlkIiwgTlVMTCk7CiAJaWYgKCFsYXlvdXRfaWQpCiAJCWdvdG8gb3V0bm9kZXY7CiAJcHJpbnRrKEtFUk5fSU5GTyAic25kLWFvYS1mYWJyaWMtbGF5b3V0OiBmb3VuZCBidXMgd2l0aCBsYXlvdXQgJWRcbiIsCmRpZmYgLS1naXQgYS9zb3VuZC9hb2Evc291bmRidXMvY29yZS5jIGIvc291bmQvYW9hL3NvdW5kYnVzL2NvcmUuYwppbmRleCA0N2IzZTM3Li44YjJlOWI5IDEwMDY0NAotLS0gYS9zb3VuZC9hb2Evc291bmRidXMvY29yZS5jCisrKyBiL3NvdW5kL2FvYS9zb3VuZGJ1cy9jb3JlLmMKQEAgLTYxLDkgKzYxLDkgQEAKIHsKIAlzdHJ1Y3Qgc291bmRidXNfZGV2ICogc291bmRidXNfZGV2OwogCXN0cnVjdCBvZl9kZXZpY2UgKiBvZjsKLQljaGFyICpzY3JhdGNoLCAqY29tcGF0LCAqY29tcGF0MjsKLQlpbnQgaSA9IDA7Ci0JaW50IGxlbmd0aCwgY3BsZW4sIGNwbGVuMiwgc2VlbiA9IDA7CisJY29uc3QgY2hhciAqY29tcGF0OworCWludCByZXR2YWwgPSAwLCBpID0gMCwgbGVuZ3RoID0gMDsKKwlpbnQgY3BsZW4sIHNlZW4gPSAwOwogCiAJaWYgKCFkZXYpCiAJCXJldHVybiAtRU5PREVWOwpAQCAtNzUsNjMgKzc1LDQ3IEBACiAJb2YgPSAmc291bmRidXNfZGV2LT5vZmRldjsKIAogCS8qIHN0dWZmIHdlIHdhbnQgdG8gcGFzcyB0byAvc2Jpbi9ob3RwbHVnICovCi0JZW52cFtpKytdID0gc2NyYXRjaCA9IGJ1ZmZlcjsKLQlsZW5ndGggPSBzY25wcmludGYgKHNjcmF0Y2gsIGJ1ZmZlcl9zaXplLCAiT0ZfTkFNRT0lcyIsIG9mLT5ub2RlLT5uYW1lKTsKLQkrK2xlbmd0aDsKLQlidWZmZXJfc2l6ZSAtPSBsZW5ndGg7Ci0JaWYgKChidWZmZXJfc2l6ZSA8PSAwKSB8fCAoaSA+PSBudW1fZW52cCkpCi0JCXJldHVybiAtRU5PTUVNOwotCXNjcmF0Y2ggKz0gbGVuZ3RoOworCXJldHZhbCA9IGFkZF91ZXZlbnRfdmFyKGVudnAsIG51bV9lbnZwLCAmaSwKKwkJCQlidWZmZXIsIGJ1ZmZlcl9zaXplLCAmbGVuZ3RoLAorCQkJCSJPRl9OQU1FPSVzIiwgb2YtPm5vZGUtPm5hbWUpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CiAKLQllbnZwW2krK10gPSBzY3JhdGNoOwotCWxlbmd0aCA9IHNjbnByaW50ZiAoc2NyYXRjaCwgYnVmZmVyX3NpemUsICJPRl9UWVBFPSVzIiwgb2YtPm5vZGUtPnR5cGUpOwotCSsrbGVuZ3RoOwotCWJ1ZmZlcl9zaXplIC09IGxlbmd0aDsKLQlpZiAoKGJ1ZmZlcl9zaXplIDw9IDApIHx8IChpID49IG51bV9lbnZwKSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0Jc2NyYXRjaCArPSBsZW5ndGg7CisJcmV0dmFsID0gYWRkX3VldmVudF92YXIoZW52cCwgbnVtX2VudnAsICZpLAorCQkJCWJ1ZmZlciwgYnVmZmVyX3NpemUsICZsZW5ndGgsCisJCQkJIk9GX1RZUEU9JXMiLCBvZi0+bm9kZS0+dHlwZSk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKIAogCS8qIFNpbmNlIHRoZSBjb21wYXRpYmxlIGZpZWxkIGNhbiBjb250YWluIHByZXR0eSBtdWNoIGFueXRoaW5nCiAJICogaXQncyBub3QgcmVhbGx5IGxlZ2FsIHRvIHNwbGl0IGl0IG91dCB3aXRoIGNvbW1hcy4gV2Ugc3BsaXQgaXQKIAkgKiB1cCB1c2luZyBhIG51bWJlciBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgaW5zdGVhZC4gKi8KIAotCWNvbXBhdCA9IChjaGFyICopIGdldF9wcm9wZXJ0eShvZi0+bm9kZSwgImNvbXBhdGlibGUiLCAmY3BsZW4pOwotCWNvbXBhdDIgPSBjb21wYXQ7Ci0JY3BsZW4yPSBjcGxlbjsKKwljb21wYXQgPSBvZl9nZXRfcHJvcGVydHkob2YtPm5vZGUsICJjb21wYXRpYmxlIiwgJmNwbGVuKTsKIAl3aGlsZSAoY29tcGF0ICYmIGNwbGVuID4gMCkgewotCQllbnZwW2krK10gPSBzY3JhdGNoOwotCQlsZW5ndGggPSBzY25wcmludGYgKHNjcmF0Y2gsIGJ1ZmZlcl9zaXplLAotCQkJCSAgICAgIk9GX0NPTVBBVElCTEVfJWQ9JXMiLCBzZWVuLCBjb21wYXQpOwotCQkrK2xlbmd0aDsKLQkJYnVmZmVyX3NpemUgLT0gbGVuZ3RoOwotCQlpZiAoKGJ1ZmZlcl9zaXplIDw9IDApIHx8IChpID49IG51bV9lbnZwKSkKLQkJCXJldHVybiAtRU5PTUVNOwotCQlzY3JhdGNoICs9IGxlbmd0aDsKLQkJbGVuZ3RoID0gc3RybGVuIChjb21wYXQpICsgMTsKLQkJY29tcGF0ICs9IGxlbmd0aDsKLQkJY3BsZW4gLT0gbGVuZ3RoOwotCQlzZWVuKys7CisJCWludCB0bXAgPSBsZW5ndGg7CisJCXJldHZhbCA9IGFkZF91ZXZlbnRfdmFyKGVudnAsIG51bV9lbnZwLCAmaSwKKwkJCQkJYnVmZmVyLCBidWZmZXJfc2l6ZSwgJmxlbmd0aCwKKwkJCQkJIk9GX0NPTVBBVElCTEVfJWQ9JXMiLCBzZWVuLCBjb21wYXQpOworCQlpZiAocmV0dmFsKQorCQkJcmV0dXJuIHJldHZhbDsKKwkJY29tcGF0ICs9IGxlbmd0aCAtIHRtcDsKKwkJY3BsZW4gLT0gbGVuZ3RoIC0gdG1wOworCQlzZWVuICs9IDE7CiAJfQogCi0JZW52cFtpKytdID0gc2NyYXRjaDsKLQlsZW5ndGggPSBzY25wcmludGYgKHNjcmF0Y2gsIGJ1ZmZlcl9zaXplLCAiT0ZfQ09NUEFUSUJMRV9OPSVkIiwgc2Vlbik7Ci0JKytsZW5ndGg7Ci0JYnVmZmVyX3NpemUgLT0gbGVuZ3RoOwotCWlmICgoYnVmZmVyX3NpemUgPD0gMCkgfHwgKGkgPj0gbnVtX2VudnApKQotCQlyZXR1cm4gLUVOT01FTTsKLQlzY3JhdGNoICs9IGxlbmd0aDsKLQotCWVudnBbaSsrXSA9IHNjcmF0Y2g7Ci0JbGVuZ3RoID0gc2NucHJpbnRmIChzY3JhdGNoLCBidWZmZXJfc2l6ZSwgIk1PREFMSUFTPSVzIiwKLQkJCXNvdW5kYnVzX2Rldi0+bW9kYWxpYXMpOwotCi0JYnVmZmVyX3NpemUgLT0gbGVuZ3RoOwotCWlmICgoYnVmZmVyX3NpemUgPD0gMCkgfHwgKGkgPj0gbnVtX2VudnApKQotCQlyZXR1cm4gLUVOT01FTTsKKwlyZXR2YWwgPSBhZGRfdWV2ZW50X3ZhcihlbnZwLCBudW1fZW52cCwgJmksCisJCQkJYnVmZmVyLCBidWZmZXJfc2l6ZSwgJmxlbmd0aCwKKwkJCQkiT0ZfQ09NUEFUSUJMRV9OPSVkIiwgc2Vlbik7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKwlyZXR2YWwgPSBhZGRfdWV2ZW50X3ZhcihlbnZwLCBudW1fZW52cCwgJmksCisJCQkJYnVmZmVyLCBidWZmZXJfc2l6ZSwgJmxlbmd0aCwKKwkJCQkiTU9EQUxJQVM9JXMiLCBzb3VuZGJ1c19kZXYtPm1vZGFsaWFzKTsKIAogCWVudnBbaV0gPSBOVUxMOwogCi0JcmV0dXJuIDA7CisJcmV0dXJuIHJldHZhbDsKIH0KIAogc3RhdGljIGludCBzb3VuZGJ1c19kZXZpY2VfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKZGlmZiAtLWdpdCBhL3NvdW5kL2FvYS9zb3VuZGJ1cy9pMnNidXMvaTJzYnVzLWNvcmUuYyBiL3NvdW5kL2FvYS9zb3VuZGJ1cy9pMnNidXMvaTJzYnVzLWNvcmUuYwppbmRleCBlMzZmNmFhLi43OWZjNGJjIDEwMDY0NAotLS0gYS9zb3VuZC9hb2Evc291bmRidXMvaTJzYnVzL2kyc2J1cy1jb3JlLmMKKysrIGIvc291bmQvYW9hL3NvdW5kYnVzL2kyc2J1cy9pMnNidXMtY29yZS5jCkBAIC0xMjIsNyArMTIyLDcgQEAKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKnBhcmVudDsKIAlpbnQgcGluZGV4LCByYyA9IC1FTlhJTzsKLQl1MzIgKnJlZzsKKwljb25zdCB1MzIgKnJlZzsKIAogCS8qIE1hY2hpbmVzIHdpdGggbGF5b3V0IDc2IGFuZCAzNiAoSzIgYmFzZWQpIGhhdmUgYSB3ZWlyZCBkZXZpY2UKIAkgKiB0cmVlIHdoYXQgd2UgbmVlZCB0byBzcGVjaWFsIGNhc2UuCkBAIC0xNDEsNyArMTQxLDcgQEAKIAlyYyA9IG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UocGFyZW50LCBwaW5kZXgsIHJlcyk7CiAJaWYgKHJjKQogCQlnb3RvIGJhaWw7Ci0JcmVnID0gKHUzMiAqKWdldF9wcm9wZXJ0eShucCwgInJlZyIsIE5VTEwpOworCXJlZyA9IG9mX2dldF9wcm9wZXJ0eShucCwgInJlZyIsIE5VTEwpOwogCWlmIChyZWcgPT0gTlVMTCkgewogCQlyYyA9IC1FTlhJTzsKIAkJZ290byBiYWlsOwpAQCAtMTg4LDggKzE4OCw4IEBACiAJCX0KIAl9CiAJaWYgKGkgPT0gMSkgewotCQl1MzIgKmxheW91dF9pZDsKLQkJbGF5b3V0X2lkID0gKHUzMiopIGdldF9wcm9wZXJ0eShzb3VuZCwgImxheW91dC1pZCIsIE5VTEwpOworCQljb25zdCB1MzIgKmxheW91dF9pZCA9CisJCQlvZl9nZXRfcHJvcGVydHkoc291bmQsICJsYXlvdXQtaWQiLCBOVUxMKTsKIAkJaWYgKGxheW91dF9pZCkgewogCQkJbGF5b3V0ID0gKmxheW91dF9pZDsKIAkJCXNucHJpbnRmKGRldi0+c291bmQubW9kYWxpYXMsIDMyLApkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2RtYXNvdW5kL2RtYXNvdW5kX2F3YWNzLmMgYi9zb3VuZC9vc3MvZG1hc291bmQvZG1hc291bmRfYXdhY3MuYwppbmRleCAzNzc3M2IxLi43MzBmYTFkIDEwMDY0NAotLS0gYS9zb3VuZC9vc3MvZG1hc291bmQvZG1hc291bmRfYXdhY3MuYworKysgYi9zb3VuZC9vc3MvZG1hc291bmQvZG1hc291bmRfYXdhY3MuYwpAQCAtMjU3LDcgKzI1Nyw3IEBACiAvKgogICogU3R1ZmYgZm9yIHJlc3RvcmluZyBhZnRlciBhIHNsZWVwLgogICovCi1zdGF0aWMgaW50IGF3YWNzX3NsZWVwX25vdGlmeShzdHJ1Y3QgcG11X3NsZWVwX25vdGlmaWVyICpzZWxmLCBpbnQgd2hlbik7CitzdGF0aWMgdm9pZCBhd2Fjc19zbGVlcF9ub3RpZnkoc3RydWN0IHBtdV9zbGVlcF9ub3RpZmllciAqc2VsZiwgaW50IHdoZW4pOwogc3RydWN0IHBtdV9zbGVlcF9ub3RpZmllciBhd2Fjc19zbGVlcF9ub3RpZmllciA9IHsKIAlhd2Fjc19zbGVlcF9ub3RpZnksIFNMRUVQX0xFVkVMX1NPVU5ELAogfTsKQEAgLTM0NiwzNiArMzQ2LDQyIEBACiBpbnQKIHNldHVwX2F1ZGlvX2dwaW8oY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciogY29tcGF0aWJsZSwgaW50ICpncGlvX2FkZHIsIGludCogZ3Bpb19wb2wpCiB7CisJc3RydWN0IGRldmljZV9ub2RlICpncGlvcDsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwogCWNvbnN0IHUzMiogcHA7CisJaW50IHJldCA9IC1FTk9ERVY7CiAKLQlucCA9IGZpbmRfZGV2aWNlcygiZ3BpbyIpOwotCWlmICghbnApCi0JCXJldHVybiAtRU5PREVWOworCWdwaW9wID0gb2ZfZmluZF9ub2RlX2J5X25hbWUoTlVMTCwgImdwaW8iKTsKKwlpZiAoIWdwaW9wKQorCQlnb3RvIGRvbmU7CiAKLQlucCA9IG5wLT5jaGlsZDsKKwlucCA9IG9mX2dldF9uZXh0X2NoaWxkKGdwaW9wLCBOVUxMKTsKIAl3aGlsZShucCAhPSAwKSB7CiAJCWlmIChuYW1lKSB7CiAJCQljb25zdCBjaGFyICpwcm9wZXJ0eSA9Ci0JCQkJZ2V0X3Byb3BlcnR5KG5wLCJhdWRpby1ncGlvIixOVUxMKTsKKwkJCQlvZl9nZXRfcHJvcGVydHkobnAsImF1ZGlvLWdwaW8iLE5VTEwpOwogCQkJaWYgKHByb3BlcnR5ICE9IDAgJiYgc3RyY21wKHByb3BlcnR5LG5hbWUpID09IDApCiAJCQkJYnJlYWs7CiAJCX0gZWxzZSBpZiAoY29tcGF0aWJsZSAmJiBkZXZpY2VfaXNfY29tcGF0aWJsZShucCwgY29tcGF0aWJsZSkpCiAJCQlicmVhazsKLQkJbnAgPSBucC0+c2libGluZzsKKwkJbnAgPSBvZl9nZXRfbmV4dF9jaGlsZChncGlvcCwgbnApOwogCX0KIAlpZiAoIW5wKQotCQlyZXR1cm4gLUVOT0RFVjsKLQlwcCA9IGdldF9wcm9wZXJ0eShucCwgIkFBUEwsYWRkcmVzcyIsIE5VTEwpOworCQlnb3RvIGRvbmU7CisJcHAgPSBvZl9nZXRfcHJvcGVydHkobnAsICJBQVBMLGFkZHJlc3MiLCBOVUxMKTsKIAlpZiAoIXBwKQotCQlyZXR1cm4gLUVOT0RFVjsKKwkJZ290byBkb25lOwogCSpncGlvX2FkZHIgPSAoKnBwKSAmIDB4MDAwMGZmZmY7Ci0JcHAgPSBnZXRfcHJvcGVydHkobnAsICJhdWRpby1ncGlvLWFjdGl2ZS1zdGF0ZSIsIE5VTEwpOworCXBwID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAiYXVkaW8tZ3Bpby1hY3RpdmUtc3RhdGUiLCBOVUxMKTsKIAlpZiAocHApCiAJCSpncGlvX3BvbCA9ICpwcDsKIAllbHNlCiAJCSpncGlvX3BvbCA9IDE7Ci0JcmV0dXJuIGlycV9vZl9wYXJzZV9hbmRfbWFwKG5wLCAwKTsKKwlyZXQgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChucCwgMCk7Citkb25lOgorCW9mX25vZGVfcHV0KG5wKTsKKwlvZl9ub2RlX3B1dChncGlvcCk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkCkBAIC01NzgsNyArNTg0LDcgQEAKIH0KIAogc3RhdGljIHZvaWQgX19pbml0Ci10YXNfaW5pdF9mcmFtZV9yYXRlcyh1bnNpZ25lZCBpbnQgKnByb3AsIHVuc2lnbmVkIGludCBsKQordGFzX2luaXRfZnJhbWVfcmF0ZXMoY29uc3QgdW5zaWduZWQgaW50ICpwcm9wLCB1bnNpZ25lZCBpbnQgbCkKIHsKIAlpbnQgaSA7CiAJaWYgKHByb3ApIHsKQEAgLTE0MTksNyArMTQyNSw3IEBACiAgKiBTYXZlIHN0YXRlIHdoZW4gZ29pbmcgdG8gc2xlZXAsIHJlc3RvcmUgaXQgYWZ0ZXJ3YXJkcy4KICAqLwogLyogRklYTUU6IHNvcnQgb3V0IGRpc2FibGluZy9yZS1lbmFibGluZyBvZiByZWFkIHN0dWZmIGFzIHdlbGwgKi8KLXN0YXRpYyBpbnQgYXdhY3Nfc2xlZXBfbm90aWZ5KHN0cnVjdCBwbXVfc2xlZXBfbm90aWZpZXIgKnNlbGYsIGludCB3aGVuKQorc3RhdGljIHZvaWQgYXdhY3Nfc2xlZXBfbm90aWZ5KHN0cnVjdCBwbXVfc2xlZXBfbm90aWZpZXIgKnNlbGYsIGludCB3aGVuKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKQEAgLTE1NDgsNyArMTU1NCw2IEBACiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRtYXNvdW5kLmxvY2ssIGZsYWdzKTsKIAkJVU5MT0NLKCk7CiAJfQotCXJldHVybiBQQk9PS19TTEVFUF9PSzsKIH0KICNlbmRpZiAvKiBDT05GSUdfUE0gKi8KIApAQCAtMjU1MywzMiArMjU1OCwzMyBAQAogc3RhdGljIHN0cnVjdCBkZXZpY2Vfbm9kZSogX19pbml0CiBnZXRfc25kX2lvX25vZGUodm9pZCkKIHsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gTlVMTDsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwogCiAJLyogc2V0IHVwIGF3YWNzX25vZGUgZm9yIGVhcmx5IE9GIHdoaWNoIGRvZXNuJ3QgaGF2ZSBhIGZ1bGwgc2V0IG9mCiAJICogcHJvcGVydGllcyBvbiBkYXZidXMKLQkqLwotCi0JYXdhY3Nfbm9kZSA9IGZpbmRfZGV2aWNlcygiYXdhY3MiKTsKKwkgKi8KKwlhd2Fjc19ub2RlID0gb2ZfZmluZF9ub2RlX2J5X25hbWUoTlVMTCwgImF3YWNzIik7CiAJaWYgKGF3YWNzX25vZGUpCiAJCWF3YWNzX3JldmlzaW9uID0gQVdBQ1NfQVdBQ1M7CiAKIAkvKiBwb3dlcm1hYyBtb2RlbHMgYWZ0ZXIgOTUwMCAob3RoZXIgdGhhbiB0aG9zZSB3aGljaCB1c2UgREFDQSBvcgogCSAqIFR1bWJsZXIpIGhhdmUgYSBub2RlIGNhbGxlZCAiZGF2YnVzIi4KIAkgKi8KLQlucCA9IGZpbmRfZGV2aWNlcygiZGF2YnVzIik7CisJbnAgPSBvZl9maW5kX25vZGVfYnlfbmFtZShOVUxMLCAiZGF2YnVzIik7CiAJLyoKIAkgKiBpZiB3ZSBkaWRuJ3QgZmluZCBhIGRhdmJ1cyBkZXZpY2UsIHRyeSAnaTJzLWEnIHNpbmNlCiAJICogdGhpcyBzZWVtcyB0byBiZSB3aGF0IGlCb29rcyAoJiBUdW1ibGVyKSBoYXZlLgogCSAqLwotCWlmIChucCA9PSBOVUxMKQotCQlucCA9IGkyc19ub2RlID0gZmluZF9kZXZpY2VzKCJpMnMtYSIpOworCWlmIChucCA9PSBOVUxMKSB7CisJCWkyc19ub2RlID0gb2ZfZmluZF9ub2RlX2J5X25hbWUoTlVMTCwgImkycy1hIik7CisJCW5wID0gb2Zfbm9kZV9nZXQoaTJzX25vZGUpOworCX0KIAogCS8qIGlmIHdlIGRpZG4ndCBmaW5kIHRoaXMgLSBwZXJoYXBzIHdlIGFyZSBvbiBhbiBlYXJseSBtb2RlbAogCSAqIHdoaWNoIF9vbmx5XyBoYXMgYW4gJ2F3YWNzJyBub2RlCiAJKi8KIAlpZiAobnAgPT0gTlVMTCAmJiBhd2Fjc19ub2RlKQotCQlucCA9IGF3YWNzX25vZGUgOworCQlucCA9IG9mX25vZGVfZ2V0KGF3YWNzX25vZGUpOwogCiAJLyogaWYgd2UgZmFpbGVkIGFsbCB0aGVzZSByZXR1cm4gbnVsbCAtIHRoaXMgd2lsbCBjYXVzZSB0aGUKIAkgKiBkcml2ZXIgdG8gZ2l2ZSB1cC4uLgpAQCAtMjU5Nyw5ICsyNjAzLDkgQEAKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmluZm87CiAKLQlpbmZvID0gZmluZF9kZXZpY2VzKCJzb3VuZCIpOwotCXdoaWxlIChpbmZvICYmIGluZm8tPnBhcmVudCAhPSBpbykKLQkJaW5mbyA9IGluZm8tPm5leHQ7CisJZm9yX2VhY2hfbm9kZV9ieV9uYW1lKGluZm8sICJzb3VuZCIpCisJCWlmIChpbmZvLT5wYXJlbnQgPT0gaW8pCisJCQlicmVhazsKIAlyZXR1cm4gaW5mbzsKIH0KIApAQCAtMjYzNSwxMSArMjY0MSwxNyBAQAogc3RhdGljIHZvaWQgX19pbml0CiBnZXRfZXhwYW5zaW9uX3R5cGUodm9pZCkKIHsKLQlpZiAoZmluZF9kZXZpY2VzKCJwZXJjaCIpICE9IE5VTEwpCi0JCWhhc19wZXJjaCA9IDE7CisJc3RydWN0IGRldmljZV9ub2RlICpkbjsKIAotCWlmIChmaW5kX2RldmljZXMoInBiLXppdmEtcGMiKSAhPSBOVUxMKQorCWRuID0gb2ZfZmluZF9ub2RlX2J5X25hbWUoTlVMTCwgInBlcmNoIik7CisJaWYgKGRuICE9IE5VTEwpCisJCWhhc19wZXJjaCA9IDE7CisJb2Zfbm9kZV9wdXQoZG4pOworCisJZG4gPSBvZl9maW5kX25vZGVfYnlfbmFtZShOVUxMLCAicGIteml2YS1wYyIpOworCWlmIChkbiAhPSBOVUxMKQogCQloYXNfeml2YSA9IDE7CisJb2Zfbm9kZV9wdXQoZG4pOwogCS8qIG5lZWQgdG8gd29yayBvdXQgaG93IHdlIGRlYWwgd2l0aCBpTWFjIFNSUyBtb2R1bGUgKi8KIH0KIApAQCAtMjY1Miw3ICsyNjY0LDcgQEAKICovCiAKIHN0YXRpYyB2b2lkIF9faW5pdAotYXdhY3NfaW5pdF9mcmFtZV9yYXRlcyh1bnNpZ25lZCBpbnQgKnByb3AsIHVuc2lnbmVkIGludCBsKQorYXdhY3NfaW5pdF9mcmFtZV9yYXRlcyhjb25zdCB1bnNpZ25lZCBpbnQgKnByb3AsIHVuc2lnbmVkIGludCBsKQogewogCWludCBpIDsKIAlpZiAocHJvcCkgewpAQCAtMjY3NSw3ICsyNjg3LDcgQEAKIH0KIAogc3RhdGljIHZvaWQgX19pbml0Ci1idXJndW5keV9pbml0X2ZyYW1lX3JhdGVzKHVuc2lnbmVkIGludCAqcHJvcCwgdW5zaWduZWQgaW50IGwpCitidXJndW5keV9pbml0X2ZyYW1lX3JhdGVzKGNvbnN0IHVuc2lnbmVkIGludCAqcHJvcCwgdW5zaWduZWQgaW50IGwpCiB7CiAJaW50IHRlbXBbOV0gOwogCWludCBpID0gMCA7CkBAIC0yNzAxLDcgKzI3MTMsNyBAQAogfQogCiBzdGF0aWMgdm9pZCBfX2luaXQKLWRhY2FfaW5pdF9mcmFtZV9yYXRlcyh1bnNpZ25lZCBpbnQgKnByb3AsIHVuc2lnbmVkIGludCBsKQorZGFjYV9pbml0X2ZyYW1lX3JhdGVzKGNvbnN0IHVuc2lnbmVkIGludCAqcHJvcCwgdW5zaWduZWQgaW50IGwpCiB7CiAJaW50IHRlbXBbOV0gOwogCWludCBpID0gMCA7CkBAIC0yNzI4LDcgKzI3NDAsNyBAQAogfQogCiBzdGF0aWMgdm9pZCBfX2luaXQKLWluaXRfZnJhbWVfcmF0ZXModW5zaWduZWQgaW50ICpwcm9wLCB1bnNpZ25lZCBpbnQgbCkKK2luaXRfZnJhbWVfcmF0ZXMoY29uc3QgdW5zaWduZWQgaW50ICpwcm9wLCB1bnNpZ25lZCBpbnQgbCkKIHsKIAlzd2l0Y2ggKGF3YWNzX3JldmlzaW9uKSB7CiAJCWNhc2UgQVdBQ1NfVFVNQkxFUjoKQEAgLTI4MjgsNyArMjg0MCw3IEBACiAjaWZkZWYgREVCVUdfRE1BU09VTkQKIHByaW50aygiZG1hc291bmRfcG1hYzogY291bGRuJ3QgZmluZCBzb3VuZCBpbyBPRiBub2RlXG4iKTsKICNlbmRpZgotCQlyZXR1cm4gLUVOT0RFViA7CisJCWdvdG8gbm9fZGV2aWNlOwogCX0KIAogCS8qIGZpbmQgdGhlIE9GIG5vZGUgdGhhdCB0ZWxscyB1cyBhYm91dCB0aGUgc291bmQgc3ViLXN5c3RlbQpAQCAtMjg0MCw3ICsyODUyLDcgQEAKICNpZmRlZiBERUJVR19ETUFTT1VORAogcHJpbnRrKCJkbWFzb3VuZF9wbWFjOiBjb3VsZG4ndCBmaW5kICdzb3VuZCcgT0Ygbm9kZVxuIik7CiAjZW5kaWYKLQkJCXJldHVybiAtRU5PREVWIDsKKwkJCWdvdG8gbm9fZGV2aWNlOwogCQl9CiAJfQogCkBAIC0yODQ5LDcgKzI4NjEsNyBAQAogI2lmZGVmIERFQlVHX0RNQVNPVU5ECiBwcmludGsoImRtYXNvdW5kX3BtYWM6IGNvdWxkbid0IGZpbmQgYSBDb2RlYyB3ZSBjYW4gaGFuZGxlXG4iKTsKICNlbmRpZgotCQlyZXR1cm4gLUVOT0RFViA7IC8qIHdlIGRvbid0IGtub3cgdGhpcyB0eXBlIG9mIGgvdyAqLworCQlnb3RvIG5vX2RldmljZTsgLyogd2UgZG9uJ3Qga25vdyB0aGlzIHR5cGUgb2YgaC93ICovCiAJfQogCiAJLyogc2V0IHVwIHBlcmNoLCB6aXZhLCBTUlMgb3Igd2hhdGV2ZXIgZWxzZSB3ZSBoYXZlIGFzIHNvdW5kCkBAIC0yODY3LDExICsyODc5LDEyIEBACiAJCSAqIG1hY2hpbmVzKS4KIAkJICovCiAJCWlmIChhd2Fjc19ub2RlKSB7Ci0JCQlpbyA9IGF3YWNzX25vZGUgOworCQkJb2Zfbm9kZV9wdXQoaW8pOworCQkJaW8gPSBvZl9ub2RlX2dldChhd2Fjc19ub2RlKTsKIAkJCWlmIChvZl9nZXRfYWRkcmVzcyhpbywgMiwgTlVMTCwgTlVMTCkgPT0gTlVMTCkgewogCQkJCXByaW50aygiZG1hc291bmRfcG1hYzogY2FuJ3QgdXNlICVzXG4iLAogCQkJCSAgICAgICBpby0+ZnVsbF9uYW1lKTsKLQkJCQlyZXR1cm4gLUVOT0RFVjsKKwkJCQlnb3RvIG5vX2RldmljZTsKIAkJCX0KIAkJfSBlbHNlCiAJCQlwcmludGsoImRtYXNvdW5kX3BtYWM6IGNhbid0IHVzZSAlc1xuIiwgaW8tPmZ1bGxfbmFtZSk7CkBAIC0yODgyLDcgKzI4OTUsNyBAQAogCQkJICAgICAgIGF3YWNzX3JzcmNbMF0uZW5kIC0gYXdhY3NfcnNyY1swXS5zdGFydCArIDEsCiAJCQkgICAgICAgIiAoSU8pIikgPT0gTlVMTCkgewogCQlwcmludGsoS0VSTl9FUlIgImRtYXNvdW5kOiBjYW4ndCByZXF1ZXN0IElPIHJlc291cmNlICFcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKKwkJZ290byBub19kZXZpY2U7CiAJfQogCWlmIChvZl9hZGRyZXNzX3RvX3Jlc291cmNlKGlvLCAxLCAmYXdhY3NfcnNyY1sxXSkgfHwKIAkgICAgcmVxdWVzdF9tZW1fcmVnaW9uKGF3YWNzX3JzcmNbMV0uc3RhcnQsCkBAIC0yODkxLDcgKzI5MDQsNyBAQAogCQlyZWxlYXNlX21lbV9yZWdpb24oYXdhY3NfcnNyY1swXS5zdGFydCwKIAkJCQkgICBhd2Fjc19yc3JjWzBdLmVuZCAtIGF3YWNzX3JzcmNbMF0uc3RhcnQgKyAxKTsKIAkJcHJpbnRrKEtFUk5fRVJSICJkbWFzb3VuZDogY2FuJ3QgcmVxdWVzdCBUeCBETUEgcmVzb3VyY2UgIVxuIik7Ci0JCXJldHVybiAtRU5PREVWOworCQlnb3RvIG5vX2RldmljZTsKIAl9CiAJaWYgKG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UoaW8sIDIsICZhd2Fjc19yc3JjWzJdKSB8fAogCSAgICByZXF1ZXN0X21lbV9yZWdpb24oYXdhY3NfcnNyY1syXS5zdGFydCwKQEAgLTI5MDIsNyArMjkxNSw3IEBACiAJCXJlbGVhc2VfbWVtX3JlZ2lvbihhd2Fjc19yc3JjWzFdLnN0YXJ0LAogCQkJCSAgIGF3YWNzX3JzcmNbMV0uZW5kIC0gYXdhY3NfcnNyY1sxXS5zdGFydCArIDEpOwogCQlwcmludGsoS0VSTl9FUlIgImRtYXNvdW5kOiBjYW4ndCByZXF1ZXN0IFJ4IERNQSByZXNvdXJjZSAhXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7CisJCWdvdG8gbm9fZGV2aWNlOwogCX0KIAogCWF3YWNzX2JlZXBfZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7CkBAIC0yOTE0LDcgKzI5MjcsNyBAQAogCQlyZWxlYXNlX21lbV9yZWdpb24oYXdhY3NfcnNyY1syXS5zdGFydCwKIAkJCQkgICBhd2Fjc19yc3JjWzJdLmVuZCAtIGF3YWNzX3JzcmNbMl0uc3RhcnQgKyAxKTsKIAkJcHJpbnRrKEtFUk5fRVJSICJkbWFzb3VuZDogY2FuJ3QgYWxsb2NhdGUgaW5wdXQgZGV2aWNlICFcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKKwkJZ290byBub19kZXZpY2U7CiAJfQogCiAJYXdhY3NfYmVlcF9kZXYtPm5hbWUgPSAiZG1hc291bmQgYmVlcGVyIjsKQEAgLTI5NDIsNyArMjk1NSw4IEBACiAJYXdhY3NfcnhfaXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAoaW8sIDIpOwogCiAJLyogSGFjayBmb3IgbGVnYWN5IGNyYXAgdGhhdCB3aWxsIGJlIGtpbGxlZCBzb21lZGF5ICovCi0JYXdhY3Nfbm9kZSA9IGlvOworCW9mX25vZGVfcHV0KGF3YWNzX25vZGUpOworCWF3YWNzX25vZGUgPSBvZl9ub2RlX2dldChpbyk7CiAKIAkvKiBpZiB3ZSBoYXZlIGFuIGF3YWNzIG9yIHNjcmVhbWVyIC0gcHJvYmUgdGhlIGNoaXAgdG8gbWFrZQogCSAqIHN1cmUgd2UgaGF2ZSB0aGUgcmlnaHQgcmV2aXNpb24uCkBAIC0yOTczLDI0ICsyOTg3LDI2IEBACiAJKi8KIAogCWlmIChpbmZvKSB7Ci0JCXVuc2lnbmVkIGludCAqcHJvcCwgbDsKKwkJY29uc3QgdW5zaWduZWQgaW50ICpwcm9wOworCQl1bnNpZ25lZCBpbnQgbDsKIAogCQlzb3VuZF9kZXZpY2VfaWQgPSAwOwogCQkvKiBkZXZpY2UgSUQgYXBwZWFycyBwb3N0IGczIGImdyAqLwotCQlwcm9wID0gKHVuc2lnbmVkIGludCAqKWdldF9wcm9wZXJ0eShpbmZvLCAiZGV2aWNlLWlkIiwgTlVMTCk7CisJCXByb3AgPSBvZl9nZXRfcHJvcGVydHkoaW5mbywgImRldmljZS1pZCIsIE5VTEwpOwogCQlpZiAocHJvcCAhPSAwKQogCQkJc291bmRfZGV2aWNlX2lkID0gKnByb3A7CiAKIAkJLyogbG9vayBmb3IgYSBwcm9wZXJ0eSBzYXlpbmcgd2hhdCBzYW1wbGUgcmF0ZXMKIAkJICAgYXJlIGF2YWlsYWJsZSAqLwogCi0JCXByb3AgPSAodW5zaWduZWQgaW50ICopZ2V0X3Byb3BlcnR5KGluZm8sICJzYW1wbGUtcmF0ZXMiLCAmbCk7CisJCXByb3AgPSBvZl9nZXRfcHJvcGVydHkoaW5mbywgInNhbXBsZS1yYXRlcyIsICZsKTsKIAkJaWYgKHByb3AgPT0gMCkKLQkJCXByb3AgPSAodW5zaWduZWQgaW50ICopIGdldF9wcm9wZXJ0eQotCQkJCShpbmZvLCAib3V0cHV0LWZyYW1lLXJhdGVzIiwgJmwpOworCQkJcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShpbmZvLCAib3V0cHV0LWZyYW1lLXJhdGVzIiwgJmwpOwogCiAJCS8qIGlmIGl0J3MgdGhlcmUgdXNlIGl0IHRvIHNldCB1cCBmcmFtZSByYXRlcyAqLwogCQlpbml0X2ZyYW1lX3JhdGVzKHByb3AsIGwpIDsKKwkJb2Zfbm9kZV9wdXQoaW5mbyk7CisJCWluZm8gPSBOVUxMOwogCX0KIAogCWlmIChhd2FjcykKQEAgLTMxNjAsNyArMzE3NiwxNiBAQAogCSAqLwogCWlucHV0X3JlZ2lzdGVyX2RldmljZShhd2Fjc19iZWVwX2Rldik7CiAKKwlvZl9ub2RlX3B1dChpbyk7CisKIAlyZXR1cm4gZG1hc291bmRfaW5pdCgpOworCitub19kZXZpY2U6CisJb2Zfbm9kZV9wdXQoaW5mbyk7CisJb2Zfbm9kZV9wdXQoYXdhY3Nfbm9kZSk7CisJb2Zfbm9kZV9wdXQoaTJzX25vZGUpOworCW9mX25vZGVfcHV0KGlvKTsKKwlyZXR1cm4gLUVOT0RFViA7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBkbWFzb3VuZF9hd2Fjc19jbGVhbnVwKHZvaWQpCkBAIC0zMTc5LDYgKzMyMDQsOCBAQAogCX0KIAlkbWFzb3VuZF9kZWluaXQoKTsKIAorCW9mX25vZGVfcHV0KGF3YWNzX25vZGUpOworCW9mX25vZGVfcHV0KGkyc19ub2RlKTsKIH0KIAogTU9EVUxFX0RFU0NSSVBUSU9OKCJQb3dlck1hYyBidWlsdC1pbiBhdWRpbyBkcml2ZXIuIik7CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZG1hc291bmQvdGFzX2NvbW1vbi5jIGIvc291bmQvb3NzL2RtYXNvdW5kL3Rhc19jb21tb24uYwppbmRleCA2NjVlODViLi5iMjk1ZWY2IDEwMDY0NAotLS0gYS9zb3VuZC9vc3MvZG1hc291bmQvdGFzX2NvbW1vbi5jCisrKyBiL3NvdW5kL29zcy9kbWFzb3VuZC90YXNfY29tbW9uLmMKQEAgLTQxLDcgKzQxLDYgQEAKIAogc3RhdGljIHU4IHRhc19pMmNfYWRkcmVzcyA9IDB4MzQ7CiBzdGF0aWMgc3RydWN0IGkyY19jbGllbnQgKnRhc19jbGllbnQ7Ci1zdGF0aWMgc3RydWN0IGRldmljZV9ub2RlKiB0YXNfbm9kZTsKIAogc3RhdGljIGludCB0YXNfYXR0YWNoX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICopOwogc3RhdGljIGludCB0YXNfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqKTsKQEAgLTE5MCwxNyArMTg5LDE4IEBACiBpbnQgX19pbml0CiB0YXNfaW5pdChpbnQgZHJpdmVyX2lkLCBjb25zdCBjaGFyICpkcml2ZXJfbmFtZSkKIHsKLQl1MzIqIHBhZGRyOworCWNvbnN0IHUzMiogcGFkZHI7CisJc3RydWN0IGRldmljZV9ub2RlICp0YXNfbm9kZTsKIAogCXByaW50ayhLRVJOX0lORk8gInRhcyBkcml2ZXIgWyVzXSlcbiIsIGRyaXZlcl9uYW1lKTsKIAogI2lmbmRlZiBDT05GSUdfSTJDX1BPV0VSTUFDCiAJcmVxdWVzdF9tb2R1bGUoImkyYy1wb3dlcm1hYyIpOwogI2VuZGlmCi0JdGFzX25vZGUgPSBmaW5kX2RldmljZXMoImRlcSIpOworCXRhc19ub2RlID0gb2ZfZmluZF9ub2RlX2J5X25hbWUoImRlcSIpOwogCWlmICh0YXNfbm9kZSA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT0RFVjsKLQlwYWRkciA9ICh1MzIgKilnZXRfcHJvcGVydHkodGFzX25vZGUsICJpMmMtYWRkcmVzcyIsIE5VTEwpOworCXBhZGRyID0gb2ZfZ2V0X3Byb3BlcnR5KHRhc19ub2RlLCAiaTJjLWFkZHJlc3MiLCBOVUxMKTsKIAlpZiAocGFkZHIpIHsKIAkJdGFzX2kyY19hZGRyZXNzID0gKCpwYWRkcikgPj4gMTsKIAkJcHJpbnRrKEtFUk5fSU5GTyAidXNpbmcgaTJjIGFkZHJlc3M6IDB4JXggZnJvbSBkZXZpY2UtdHJlZVxuIiwKQEAgLTIwOCw2ICsyMDgsNyBAQAogCX0gZWxzZSAgICAKIAkJcHJpbnRrKEtFUk5fSU5GTyAidXNpbmcgaTJjIGFkZHJlc3M6IDB4JXggKGRlZmF1bHQpXG4iLAogCQkJCXRhc19pMmNfYWRkcmVzcyk7CisJb2Zfbm9kZV9wdXQodGFzX25vZGUpOwogCiAJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZ0YXNfZHJpdmVyKTsKIH0KZGlmZiAtLWdpdCBhL3NvdW5kL3BwYy9wbWFjLmMgYi9zb3VuZC9wcGMvcG1hYy5jCmluZGV4IGM2NGFmNTUuLjJiYWU5YzEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BwYy9wbWFjLmMKKysrIGIvc291bmQvcHBjL3BtYWMuYwpAQCAtODE2LDYgKzgxNiw3IEBACiAKIAlpZiAoY2hpcC0+cGRldikKIAkJcGNpX2Rldl9wdXQoY2hpcC0+cGRldik7CisJb2Zfbm9kZV9wdXQoY2hpcC0+bm9kZSk7CiAJa2ZyZWUoY2hpcCk7CiAJcmV0dXJuIDA7CiB9CkBAIC04NjMsOCArODY0LDEwIEBACiAgKi8KIHN0YXRpYyBpbnQgX19pbml0IHNuZF9wbWFjX2RldGVjdChzdHJ1Y3Qgc25kX3BtYWMgKmNoaXApCiB7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpzb3VuZCA9IE5VTEw7Ci0JdW5zaWduZWQgaW50ICpwcm9wLCBsOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqc291bmQ7CisJc3RydWN0IGRldmljZV9ub2RlICpkbjsKKwljb25zdCB1bnNpZ25lZCBpbnQgKnByb3A7CisJdW5zaWduZWQgaW50IGw7CiAJc3RydWN0IG1hY2lvX2NoaXAqIG1hY2lvOwogCiAJaWYgKCFtYWNoaW5lX2lzKHBvd2VybWFjKSkKQEAgLTg5MCwyMiArODkzLDIxIEBACiAJZWxzZSBpZiAobWFjaGluZV9pc19jb21wYXRpYmxlKCJQb3dlckJvb2sxLDEiKQogCQkgfHwgbWFjaGluZV9pc19jb21wYXRpYmxlKCJBQVBMLFBvd2VyQm9vazE5OTgiKSkKIAkJY2hpcC0+aXNfcGJvb2tfRzMgPSAxOwotCWNoaXAtPm5vZGUgPSBmaW5kX2RldmljZXMoImF3YWNzIik7Ci0JaWYgKGNoaXAtPm5vZGUpCi0JCXNvdW5kID0gY2hpcC0+bm9kZTsKKwljaGlwLT5ub2RlID0gb2ZfZmluZF9ub2RlX2J5X25hbWUoTlVMTCwgImF3YWNzIik7CisJc291bmQgPSBvZl9ub2RlX2dldChjaGlwLT5ub2RlKTsKIAogCS8qCiAJICogcG93ZXJtYWMgRzMgbW9kZWxzIGhhdmUgYSBub2RlIGNhbGxlZCAiZGF2YnVzIgogCSAqIHdpdGggYSBjaGlsZCBjYWxsZWQgInNvdW5kIi4KIAkgKi8KIAlpZiAoIWNoaXAtPm5vZGUpCi0JCWNoaXAtPm5vZGUgPSBmaW5kX2RldmljZXMoImRhdmJ1cyIpOworCQljaGlwLT5ub2RlID0gb2ZfZmluZF9ub2RlX2J5X25hbWUoTlVMTCwgImRhdmJ1cyIpOwogCS8qCiAJICogaWYgd2UgZGlkbid0IGZpbmQgYSBkYXZidXMgZGV2aWNlLCB0cnkgJ2kycy1hJyBzaW5jZQogCSAqIHRoaXMgc2VlbXMgdG8gYmUgd2hhdCBpQm9va3MgaGF2ZQogCSAqLwogCWlmICghIGNoaXAtPm5vZGUpIHsKLQkJY2hpcC0+bm9kZSA9IGZpbmRfZGV2aWNlcygiaTJzLWEiKTsKKwkJY2hpcC0+bm9kZSA9IG9mX2ZpbmRfbm9kZV9ieV9uYW1lKE5VTEwsICJpMnMtYSIpOwogCQlpZiAoY2hpcC0+bm9kZSAmJiBjaGlwLT5ub2RlLT5wYXJlbnQgJiYKIAkJICAgIGNoaXAtPm5vZGUtPnBhcmVudC0+cGFyZW50KSB7CiAJCQlpZiAoZGV2aWNlX2lzX2NvbXBhdGlibGUoY2hpcC0+bm9kZS0+cGFyZW50LT5wYXJlbnQsCkBAIC05MTcsMjIgKzkxOSwyNSBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAogCWlmICghc291bmQpIHsKLQkJc291bmQgPSBmaW5kX2RldmljZXMoInNvdW5kIik7CisJCXNvdW5kID0gb2ZfZmluZF9ub2RlX2J5X25hbWUoTlVMTCwgInNvdW5kIik7CiAJCXdoaWxlIChzb3VuZCAmJiBzb3VuZC0+cGFyZW50ICE9IGNoaXAtPm5vZGUpCi0JCQlzb3VuZCA9IHNvdW5kLT5uZXh0OworCQkJc291bmQgPSBvZl9maW5kX25vZGVfYnlfbmFtZShzb3VuZCwgInNvdW5kIik7CiAJfQotCWlmICghIHNvdW5kKQorCWlmICghIHNvdW5kKSB7CisJCW9mX25vZGVfcHV0KGNoaXAtPm5vZGUpOwogCQlyZXR1cm4gLUVOT0RFVjsKLQlwcm9wID0gKHVuc2lnbmVkIGludCAqKSBnZXRfcHJvcGVydHkoc291bmQsICJzdWItZnJhbWUiLCBOVUxMKTsKKwl9CisJcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShzb3VuZCwgInN1Yi1mcmFtZSIsIE5VTEwpOwogCWlmIChwcm9wICYmICpwcm9wIDwgMTYpCiAJCWNoaXAtPnN1YmZyYW1lID0gKnByb3A7Ci0JcHJvcCA9ICh1bnNpZ25lZCBpbnQgKikgZ2V0X3Byb3BlcnR5KHNvdW5kLCAibGF5b3V0LWlkIiwgTlVMTCk7CisJcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShzb3VuZCwgImxheW91dC1pZCIsIE5VTEwpOwogCWlmIChwcm9wKSB7CiAJCS8qIHBhcnRseSBkZXByZWNhdGUgc25kLXBvd2VybWFjLCBmb3IgdGhvc2UgbWFjaGluZXMKIAkJICogdGhhdCBoYXZlIGEgbGF5b3V0LWlkIHByb3BlcnR5IGZvciBub3cgKi8KIAkJcHJpbnRrKEtFUk5fSU5GTyAic25kLXBvd2VybWFjIG5vIGxvbmdlciBoYW5kbGVzIGFueSAiCiAJCQkJICJtYWNoaW5lcyB3aXRoIGEgbGF5b3V0LWlkIHByb3BlcnR5ICIKIAkJCQkgImluIHRoZSBkZXZpY2UtdHJlZSwgdXNlIHNuZC1hb2EuXG4iKTsKKwkJb2Zfbm9kZV9wdXQoY2hpcC0+bm9kZSk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAkvKiBUaGlzIHNob3VsZCBiZSB2ZXJpZmllZCBvbiBvbGRlciBzY3JlYW1lcnMgKi8KQEAgLTk2NywxMCArOTcyLDEyIEBACiAJCWNoaXAtPmZyZXFfdGFibGUgPSB0dW1ibGVyX2ZyZXFzOwogCQljaGlwLT5jb250cm9sX21hc2sgPSBNQVNLX0lFUEMgfCAweDExOyAvKiBkaXNhYmxlIElFRSAqLwogCX0KLQlwcm9wID0gKHVuc2lnbmVkIGludCAqKWdldF9wcm9wZXJ0eShzb3VuZCwgImRldmljZS1pZCIsIE5VTEwpOworCXByb3AgPSBvZl9nZXRfcHJvcGVydHkoc291bmQsICJkZXZpY2UtaWQiLCBOVUxMKTsKIAlpZiAocHJvcCkKIAkJY2hpcC0+ZGV2aWNlX2lkID0gKnByb3A7Ci0JY2hpcC0+aGFzX2lpYyA9IChmaW5kX2RldmljZXMoInBlcmNoIikgIT0gTlVMTCk7CisJZG4gPSBvZl9maW5kX25vZGVfYnlfbmFtZShOVUxMLCAicGVyY2giKTsKKwljaGlwLT5oYXNfaWljID0gKGRuICE9IE5VTEwpOworCW9mX25vZGVfcHV0KGRuKTsKIAogCS8qIFdlIG5lZWQgdGhlIFBDSSBkZXZpY2UgZm9yIERNQSBhbGxvY2F0aW9ucywgbGV0J3MgdXNlIGEgY3J1ZGUgbWV0aG9kCiAJICogZm9yIG5vdyAuLi4KQEAgLTk5NywxMCArMTAwNCw5IEBACiAKIAkvKiBsb29rIGZvciBhIHByb3BlcnR5IHNheWluZyB3aGF0IHNhbXBsZSByYXRlcwogCSAgIGFyZSBhdmFpbGFibGUgKi8KLQlwcm9wID0gKHVuc2lnbmVkIGludCAqKSBnZXRfcHJvcGVydHkoc291bmQsICJzYW1wbGUtcmF0ZXMiLCAmbCk7CisJcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShzb3VuZCwgInNhbXBsZS1yYXRlcyIsICZsKTsKIAlpZiAoISBwcm9wKQotCQlwcm9wID0gKHVuc2lnbmVkIGludCAqKSBnZXRfcHJvcGVydHkoc291bmQsCi0JCQkJCQkgICAgICJvdXRwdXQtZnJhbWUtcmF0ZXMiLCAmbCk7CisJCXByb3AgPSBvZl9nZXRfcHJvcGVydHkoc291bmQsICJvdXRwdXQtZnJhbWUtcmF0ZXMiLCAmbCk7CiAJaWYgKHByb3ApIHsKIAkJaW50IGk7CiAJCWNoaXAtPmZyZXFzX29rID0gMDsKQEAgLTEwMjEsNiArMTAyNyw3IEBACiAJCWNoaXAtPmZyZXFzX29rID0gMTsKIAl9CiAKKwlvZl9ub2RlX3B1dChzb3VuZCk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3BwYy90dW1ibGVyLmMgYi9zb3VuZC9wcGMvdHVtYmxlci5jCmluZGV4IDhmMDc0Yzc5Li41NGUzMzNmIDEwMDY0NAotLS0gYS9zb3VuZC9wcGMvdHVtYmxlci5jCisrKyBiL3NvdW5kL3BwYy90dW1ibGVyLmMKQEAgLTEwMzEsMzIgKzEwMzEsNDAgQEAKIC8qIGxvb2sgZm9yIGF1ZGlvLWdwaW8gZGV2aWNlICovCiBzdGF0aWMgc3RydWN0IGRldmljZV9ub2RlICpmaW5kX2F1ZGlvX2RldmljZShjb25zdCBjaGFyICpuYW1lKQogeworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZ3Bpb3A7CiAJc3RydWN0IGRldmljZV9ub2RlICpucDsKICAgCi0JaWYgKCEgKG5wID0gZmluZF9kZXZpY2VzKCJncGlvIikpKQorCWdwaW9wID0gb2ZfZmluZF9ub2RlX2J5X25hbWUoTlVMTCwgImdwaW8iKTsKKwlpZiAoISBncGlvcCkKIAkJcmV0dXJuIE5VTEw7CiAgIAotCWZvciAobnAgPSBucC0+Y2hpbGQ7IG5wOyBucCA9IG5wLT5zaWJsaW5nKSB7Ci0JCWNvbnN0IGNoYXIgKnByb3BlcnR5ID0gZ2V0X3Byb3BlcnR5KG5wLCAiYXVkaW8tZ3BpbyIsIE5VTEwpOworCWZvciAobnAgPSBvZl9nZXRfbmV4dF9jaGlsZChncGlvcCwgTlVMTCk7IG5wOworCQkJbnAgPSBvZl9nZXRfbmV4dF9jaGlsZChncGlvcCwgbnApKSB7CisJCWNvbnN0IGNoYXIgKnByb3BlcnR5ID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAiYXVkaW8tZ3BpbyIsIE5VTEwpOwogCQlpZiAocHJvcGVydHkgJiYgc3RyY21wKHByb3BlcnR5LCBuYW1lKSA9PSAwKQotCQkJcmV0dXJuIG5wOworCQkJYnJlYWs7CiAJfSAgCi0JcmV0dXJuIE5VTEw7CisJb2Zfbm9kZV9wdXQoZ3Bpb3ApOworCXJldHVybiBucDsKIH0KIAogLyogbG9vayBmb3IgYXVkaW8tZ3BpbyBkZXZpY2UgKi8KIHN0YXRpYyBzdHJ1Y3QgZGV2aWNlX25vZGUgKmZpbmRfY29tcGF0aWJsZV9hdWRpb19kZXZpY2UoY29uc3QgY2hhciAqbmFtZSkKIHsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmdwaW9wOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CiAgIAotCWlmICghIChucCA9IGZpbmRfZGV2aWNlcygiZ3BpbyIpKSkKKwlncGlvcCA9IG9mX2ZpbmRfbm9kZV9ieV9uYW1lKE5VTEwsICJncGlvIik7CisJaWYgKCFncGlvcCkKIAkJcmV0dXJuIE5VTEw7CiAgIAotCWZvciAobnAgPSBucC0+Y2hpbGQ7IG5wOyBucCA9IG5wLT5zaWJsaW5nKSB7CisJZm9yIChucCA9IG9mX2dldF9uZXh0X2NoaWxkKGdwaW9wLCBOVUxMKTsgbnA7CisJCQlucCA9IG9mX2dldF9uZXh0X2NoaWxkKGdwaW9wLCBucCkpIHsKIAkJaWYgKGRldmljZV9pc19jb21wYXRpYmxlKG5wLCBuYW1lKSkKLQkJCXJldHVybiBucDsKKwkJCWJyZWFrOwogCX0gIAotCXJldHVybiBOVUxMOworCW9mX25vZGVfcHV0KGdwaW9wKTsKKwlyZXR1cm4gbnA7CiB9CiAKIC8qIGZpbmQgYW4gYXVkaW8gZGV2aWNlIGFuZCBnZXQgaXRzIGFkZHJlc3MgKi8KQEAgLTEwNjYsNiArMTA3NCw3IEBACiAJc3RydWN0IGRldmljZV9ub2RlICpub2RlOwogCWNvbnN0IHUzMiAqYmFzZTsKIAl1MzIgYWRkcjsKKwlsb25nIHJldDsKIAogCWlmIChpc19jb21wYXRpYmxlKQogCQlub2RlID0gZmluZF9jb21wYXRpYmxlX2F1ZGlvX2RldmljZShkZXZpY2UpOwpAQCAtMTA3NywxMiArMTA4NiwxMyBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQliYXNlID0gZ2V0X3Byb3BlcnR5KG5vZGUsICJBQVBMLGFkZHJlc3MiLCBOVUxMKTsKKwliYXNlID0gb2ZfZ2V0X3Byb3BlcnR5KG5vZGUsICJBQVBMLGFkZHJlc3MiLCBOVUxMKTsKIAlpZiAoISBiYXNlKSB7Ci0JCWJhc2UgPSBnZXRfcHJvcGVydHkobm9kZSwgInJlZyIsIE5VTEwpOworCQliYXNlID0gb2ZfZ2V0X3Byb3BlcnR5KG5vZGUsICJyZWciLCBOVUxMKTsKIAkJaWYgKCFiYXNlKSB7CiAJCQlEQkcoIihFKSBjYW5ub3QgZmluZCBhZGRyZXNzIGZvciBkZXZpY2UgJXMgIVxuIiwgZGV2aWNlKTsKIAkJCXNuZF9wcmludGQoImNhbm5vdCBmaW5kIGFkZHJlc3MgZm9yIGRldmljZSAlc1xuIiwgZGV2aWNlKTsKKwkJCW9mX25vZGVfcHV0KG5vZGUpOwogCQkJcmV0dXJuIC1FTk9ERVY7CiAJCX0KIAkJYWRkciA9ICpiYXNlOwpAQCAtMTA5Myw3ICsxMTAzLDcgQEAKIAogCWdwLT5hZGRyID0gYWRkciAmIDB4MDAwMGZmZmY7CiAJLyogVHJ5IHRvIGZpbmQgdGhlIGFjdGl2ZSBzdGF0ZSwgZGVmYXVsdCB0byAwICEgKi8KLQliYXNlID0gZ2V0X3Byb3BlcnR5KG5vZGUsICJhdWRpby1ncGlvLWFjdGl2ZS1zdGF0ZSIsIE5VTEwpOworCWJhc2UgPSBvZl9nZXRfcHJvcGVydHkobm9kZSwgImF1ZGlvLWdwaW8tYWN0aXZlLXN0YXRlIiwgTlVMTCk7CiAJaWYgKGJhc2UpIHsKIAkJZ3AtPmFjdGl2ZV9zdGF0ZSA9ICpiYXNlOwogCQlncC0+YWN0aXZlX3ZhbCA9ICgqYmFzZSkgPyAweDUgOiAweDQ7CkBAIC0xMTA4LDcgKzExMTgsNyBAQAogCQkgKiBhcyB3ZSBkb24ndCB5ZXQgaGF2ZSBhbiBpbnRlcnByZXRlciBmb3IgdGhlc2UgdGhpbmdzCiAJCSAqLwogCQlpZiAocGxhdGZvcm0pCi0JCQlwcm9wID0gZ2V0X3Byb3BlcnR5KG5vZGUsIHBsYXRmb3JtLCBOVUxMKTsKKwkJCXByb3AgPSBvZl9nZXRfcHJvcGVydHkobm9kZSwgcGxhdGZvcm0sIE5VTEwpOwogCQlpZiAocHJvcCkgewogCQkJaWYgKHByb3BbM10gPT0gMHg5ICYmIHByb3BbNF0gPT0gMHg5KSB7CiAJCQkJZ3AtPmFjdGl2ZV92YWwgPSAweGQ7CkBAIC0xMTI0LDcgKzExMzQsOSBAQAogCURCRygiKEkpIEdQSU8gZGV2aWNlICVzIGZvdW5kLCBvZmZzZXQ6ICV4LCBhY3RpdmUgc3RhdGU6ICVkICFcbiIsCiAJICAgIGRldmljZSwgZ3AtPmFkZHIsIGdwLT5hY3RpdmVfc3RhdGUpOwogCi0JcmV0dXJuIGlycV9vZl9wYXJzZV9hbmRfbWFwKG5vZGUsIDApOworCXJldCA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG5vZGUsIDApOworCW9mX25vZGVfcHV0KG5vZGUpOworCXJldHVybiByZXQ7CiB9CiAKIC8qIHJlc2V0IGF1ZGlvICovCkBAIC0xMzEwLDcgKzEzMjIsNyBAQAogewogCWludCBpLCBlcnI7CiAJc3RydWN0IHBtYWNfdHVtYmxlciAqbWl4OwotCXUzMiAqcGFkZHI7CisJY29uc3QgdTMyICpwYWRkcjsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKnRhc19ub2RlLCAqbnA7CiAJY2hhciAqY2hpcG5hbWU7CiAKQEAgLTEzMzEsOSArMTM0Myw5IEBACiAKIAlmb3IgKG5wID0gY2hpcC0+bm9kZS0+Y2hpbGQ7IG5wOyBucCA9IG5wLT5zaWJsaW5nKSB7CiAJCWlmICghc3RyY21wKG5wLT5uYW1lLCAic291bmQiKSkgewotCQkJaWYgKGdldF9wcm9wZXJ0eShucCwgImhhcy1hbmRlZC1yZXNldCIsIE5VTEwpKQorCQkJaWYgKG9mX2dldF9wcm9wZXJ0eShucCwgImhhcy1hbmRlZC1yZXNldCIsIE5VTEwpKQogCQkJCW1peC0+YW5kZWRfcmVzZXQgPSAxOwotCQkJaWYgKGdldF9wcm9wZXJ0eShucCwgImxheW91dC1pZCIsIE5VTEwpKQorCQkJaWYgKG9mX2dldF9wcm9wZXJ0eShucCwgImxheW91dC1pZCIsIE5VTEwpKQogCQkJCW1peC0+cmVzZXRfb25fc2xlZXAgPSAwOwogCQkJYnJlYWs7CiAJCX0KQEAgLTEzNDIsMTkgKzEzNTQsMjAgQEAKIAkJcmV0dXJuIGVycjsKIAogCS8qIHNldCB1cCBUQVMgKi8KLQl0YXNfbm9kZSA9IGZpbmRfZGV2aWNlcygiZGVxIik7CisJdGFzX25vZGUgPSBvZl9maW5kX25vZGVfYnlfbmFtZShOVUxMLCAiZGVxIik7CiAJaWYgKHRhc19ub2RlID09IE5VTEwpCi0JCXRhc19ub2RlID0gZmluZF9kZXZpY2VzKCJjb2RlYyIpOworCQl0YXNfbm9kZSA9IG9mX2ZpbmRfbm9kZV9ieV9uYW1lKE5VTEwsICJjb2RlYyIpOwogCWlmICh0YXNfbm9kZSA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCXBhZGRyID0gKHUzMiAqKWdldF9wcm9wZXJ0eSh0YXNfbm9kZSwgImkyYy1hZGRyZXNzIiwgTlVMTCk7CisJcGFkZHIgPSBvZl9nZXRfcHJvcGVydHkodGFzX25vZGUsICJpMmMtYWRkcmVzcyIsIE5VTEwpOwogCWlmIChwYWRkciA9PSBOVUxMKQotCQlwYWRkciA9ICh1MzIgKilnZXRfcHJvcGVydHkodGFzX25vZGUsICJyZWciLCBOVUxMKTsKKwkJcGFkZHIgPSBvZl9nZXRfcHJvcGVydHkodGFzX25vZGUsICJyZWciLCBOVUxMKTsKIAlpZiAocGFkZHIpCiAJCW1peC0+aTJjLmFkZHIgPSAoKnBhZGRyKSA+PiAxOwogCWVsc2UKIAkJbWl4LT5pMmMuYWRkciA9IFRBU19JMkNfQUREUjsKKwlvZl9ub2RlX3B1dCh0YXNfbm9kZSk7CiAKIAlEQkcoIihJKSBUQVMgaTJjIGFkZHJlc3MgaXM6ICV4XG4iLCBtaXgtPmkyYy5hZGRyKTsKIApkaWZmIC0tZ2l0IGEvc291bmQvc3BhcmMvYW1kNzkzMC5jIGIvc291bmQvc3BhcmMvYW1kNzkzMC5jCmluZGV4IGM4OTk3ODYuLjA3OTYyYTMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NwYXJjL2FtZDc5MzAuYworKysgYi9zb3VuZC9zcGFyYy9hbWQ3OTMwLmMKQEAgLTEwNjcsOCArMTA2Nyw4IEBACiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IGFtZDc5MzBfb2Jpb19hdHRhY2goc3RydWN0IGRldmljZV9ub2RlICpkcCkKIHsKLQlzdHJ1Y3QgbGludXhfcHJvbV9yZWdpc3RlcnMgKnJlZ3M7Ci0Jc3RydWN0IGxpbnV4X3Byb21faXJxcyAqaXJxcDsKKwljb25zdCBzdHJ1Y3QgbGludXhfcHJvbV9yZWdpc3RlcnMgKnJlZ3M7CisJY29uc3Qgc3RydWN0IGxpbnV4X3Byb21faXJxcyAqaXJxcDsKIAlzdHJ1Y3QgcmVzb3VyY2UgcmVzLCAqcnA7CiAJaW50IGxlbjsKIApkaWZmIC0tZ2l0IGEvc291bmQvc3BhcmMvY3M0MjMxLmMgYi9zb3VuZC9zcGFyYy9jczQyMzEuYwppbmRleCBmNTk1NmQ1Li45MDBhMDBkIDEwMDY0NAotLS0gYS9zb3VuZC9zcGFyYy9jczQyMzEuYworKysgYi9zb3VuZC9zcGFyYy9jczQyMzEuYwpAQCAtMjI4NCw3ICsyMjg0LDcgQEAKIAkJCWlmICghc3RyY21wKGVkZXYtPnByb21fbm9kZS0+bmFtZSwgIlNVTlcsQ1M0MjMxIikpIHsKIAkJCQltYXRjaCA9IDE7CiAJCQl9IGVsc2UgaWYgKCFzdHJjbXAoZWRldi0+cHJvbV9ub2RlLT5uYW1lLCAiYXVkaW8iKSkgewotCQkJCWNoYXIgKmNvbXBhdDsKKwkJCQljb25zdCBjaGFyICpjb21wYXQ7CiAKIAkJCQljb21wYXQgPSBvZl9nZXRfcHJvcGVydHkoZWRldi0+cHJvbV9ub2RlLAogCQkJCQkJCSAiY29tcGF0aWJsZSIsIE5VTEwpOwo=